hsqldb2.2-2.2.9.orig/0000755000175000017500000000000012007570424012627 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/0000755000175000017500000000000012007570424014104 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/stylesheets/0000755000175000017500000000000012007570424016460 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/stylesheets/html-common.xsl0000644000175000017500000001063212007547426021452 0ustar renerene

hsqldb2.2-2.2.9.orig/hsqldb/stylesheets/fo.xsl0000644000175000017500000001320012007547426017616 0ustar renerene 0.5pt solid black 1pt #FFE4E1 3pt 0.5pt solid gray 1pt #F0F8FF auto wrap 8pt #000080 pt pt pt pt pt pt pt #000080 hsqldb2.2-2.2.9.orig/hsqldb/stylesheets/chunk.xsl0000644000175000017500000001541312007547426020332 0ustar renerene
hsqldb2.2-2.2.9.orig/hsqldb/stylesheets/html.xsl0000644000175000017500000000112512007547426020161 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/stylesheets/pagesetup.xsl0000644000175000017500000001107312007547426021215 0ustar renerene , , - - ../images/hypersql_logo2.png hsqldb2.2-2.2.9.orig/hsqldb/integration/0000755000175000017500000000000012007557304016431 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/0000755000175000017500000000000012007557304022072 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/ivy-projsetup.xml0000644000175000017500000000256112007547332025460 0ustar renerene Add Ivy jar file to Ant CLASSPATH. Copy-and-paste this for any Bourne shell (inc. Bash): export ANT_ARGS; ANT_ARGS='-lib ${basedir}/../../build/ivy-2.2.0.jar -noclasspath' OR copy-and-paste this for any CMD-like Windows shell: SET ANT_ARGS=-lib "${basedir}/../../build/ivy-2.2.0.jar" -noclasspath hsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/ivy.xml0000644000175000017500000000453612007547332023433 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/readme.txt0000644000175000017500000000331512007547332024072 0ustar renerene$Id: readme.txt 3931 2010-12-06 05:10:50Z unsaved $ This is the home directory of the extAuthWithSpring sample. It uses Spring to declaratively configure external authentication with a master HyperSQL catalog, or with an LDAP server. You will need Ant and a Java JDK installed. To get started, invoke ant -Dauthentication.mode=HsqldbSlave from this directory to run a JDBC app backed by an application database, with authentication to the application database through another embedded master database. Play with the Spring bean files in the resources subdirectory to switch the application database or the masterdatabase, or anything else. To play with a JAAS module, run ant -Dauthentication.mode=JAAS The file resources/jaas.cfg will be generated the first time that you run anything with Ant. With mode set to "JAAS", the "demo" application configuration in jaas.cfg will be used. If you have an LDAP server, edit "resources/ldapbeans.xml" to set settings according to your LDAP server then run ant with the authentication.mode set to "LDAP". To help determine and test the settings that will work with your LDAP server, I recommend that you use the program org.hsqldb.auth.LdapAuthBean. See the HyperSQL API Spec for org.hsqldb.auth.LdapAuthBean and the sample properties file for it at "sample/ldap-exerciser.properties" in your HyperSQL distribution. As an alternative to LDAP mode, you can use JAAS_LDAP mode. That works very similarly, but uses Sun's JAAS LDAP module and suffers from its limitations. It should be easy to figure out how to use by looking over the "sunLdap" application settings in jaas.cfg, and the Spring bean definitions in resources/jaasldapbeans.xml. hsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/ivysettings.xml0000644000175000017500000000107512007547332025207 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/src/0000755000175000017500000000000012007557304022661 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/src/org/0000755000175000017500000000000012007557304023450 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/src/org/hsqldb/0000755000175000017500000000000012007557304024725 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/src/org/hsqldb/sample/0000755000175000017500000000000012007557304026206 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/src/org/hsqldb/sample/SpringExtAuth.java0000644000175000017500000001712612007547332031625 0ustar renerene/* Copyright (c) 2001-2010, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.sample; import java.sql.Connection; import java.sql.Statement; import java.sql.DriverManager; import java.sql.SQLException; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.ApplicationContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * As you can tell by the class name, this class is purposefully Spring-aware, * as it initiates the Spring Spring context load. * In a web application, a lifecycle lister or other * mechanism would eliminate the need for any custom Java code to load the * context (like what we have here). */ public class SpringExtAuth { private static Log log = LogFactory.getLog(SpringExtAuth.class); private static final String SYNTAX_MSG = "SYNTAX: " + SpringExtAuth.class.getName() + " {LDAP|HsqldbSlave|JAAS|JAAS_LDAP}"; /** * @throws SQLException If Setup of emulation database failed, or if the * application JDBC work fails. */ static public void main(String[] sa) throws SQLException { if (sa.length != 1) throw new IllegalArgumentException(SYNTAX_MSG); String authSpringFile = null; if (sa[0].equals("LDAP")) { authSpringFile = "ldapbeans.xml"; } else if (sa[0].equals("JAAS")) { authSpringFile = "jaasbeans.xml"; } else if (sa[0].equals("HsqldbSlave")) { authSpringFile = "slavebeans.xml"; } else if (sa[0].equals("JAAS_LDAP")) { authSpringFile = "jaasldapbeans.xml"; } if (authSpringFile == null) throw new IllegalArgumentException(SYNTAX_MSG); SpringExtAuth.prepMemoryDatabases(!sa[0].equals("HsqldbSlave")); ApplicationContext ctx = new ClassPathXmlApplicationContext("beandefs.xml", authSpringFile); ListableBeanFactory bf = (ListableBeanFactory) ctx; JdbcAppClass appBean = bf.getBean("appBean", JdbcAppClass.class); appBean.doJdbcWork(); } /** * This method prepares a memory-only catalog. * After this method runs, a new Connection using the same JDBC URL will * behave just like connecting to a populated, persistent catalog. * * Purposefully not using declarative settings here because this is purely * emulation setup. * A real application won't have any method corresponding to this method. * * @throws SQLException if setup failed */ private static void prepMemoryDatabases(boolean doLdap) throws SQLException { Connection c = null; Statement st = null; try { c = DriverManager.getConnection( "jdbc:hsqldb:mem:localDb", "SA", ""); // JDBC URL here must match that configured within the bean // 'appBean' in "beandefs.xml" file c.setAutoCommit(false); st = c.createStatement(); st.executeUpdate("SET DATABASE UNIQUE NAME \"AUTHSAMPLEDBNAME\""); st.executeUpdate( "SET DATABASE AUTHENTICATION FUNCTION EXTERNAL NAME " + "'CLASSPATH:" + "org.hsqldb.auth.AuthBeanMultiplexer.authenticate'"); // DB Name here must match that configured in either // "ldapbeans.xml" or "slavebean.xml", depending on whether you are // running in LDAP or HsqldbSlave mode, correspondingly. st.executeUpdate("SET PASSWORD 'SECRET5222173'"); st.executeUpdate("CREATE TABLE t1(i INTEGER)"); st.executeUpdate("GRANT SELECT ON t1 TO public"); st.executeUpdate("INSERT INTO t1 VALUES(456)"); // Table name and value must match what is expected by method // JdbcAppClass.doJdbcWork. c.commit(); } finally { if (st != null) try { st.close(); } catch (SQLException se) { log.error("Failed to close emulation database setup Connection", se); } finally { st = null; // Encourage GC } if (c != null) try { c.close(); } catch (SQLException se) { log.error("Failed to close emulation database setup Connection", se); } finally { c = null; // Encourage GC } } if (doLdap) return; // Create an authentication master database try { c = DriverManager.getConnection( "jdbc:hsqldb:mem:masterDb", "SA", ""); // JDBC URL here must match that configured for bean // 'slaveSetup' in "slavebeans.xml" file c.setAutoCommit(false); st = c.createStatement(); st.executeUpdate("SET PASSWORD 'SECRET9123113'"); // This password will never be used again. // Changing it from the default just for good security practice. st.executeUpdate("CREATE USER \"straight\" PASSWORD 'pwd'"); // User name and password here must match those configured in file // "beandefs.xml". c.commit(); } finally { if (st != null) try { st.close(); } catch (SQLException se) { log.error("Failed to close emulation database setup Connection", se); } finally { st = null; // Encourage GC } if (c != null) try { c.close(); } catch (SQLException se) { log.error("Failed to close emulation database setup Connection", se); } finally { c = null; // Encourage GC } } } } hsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/src/org/hsqldb/sample/JdbcAppClass.java0000644000175000017500000001023212007547332031340 0ustar renerene/* Copyright (c) 2001-2010, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.sample; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Connection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.sql.DataSource; /** * An application class that performs some simple JDBC work. * * This class is purposefully not Spring-aware. */ public class JdbcAppClass { private static Log log = LogFactory.getLog(JdbcAppClass.class); private boolean initialized; private DataSource ds; public void init() { if (ds == null) throw new IllegalStateException( "Required property 'dataSource' not set"); initialized = true; } public void setDataSource(DataSource ds) { this.ds = ds; } public void doJdbcWork() throws SQLException { if (!initialized) throw new IllegalStateException(JdbcAppClass.class.getName() + " instance not initialized"); Connection c = null; ResultSet rs = null; try { c = ds.getConnection(); rs = c.createStatement().executeQuery("SELECT * FROM t1"); if (!rs.next()) { log.error("App class failed to retrieve data from catalog"); return; } if (rs.getInt(1) != 456) { log.error("App class retrieved wrong value: " + rs.getInt(1)); return; } if (rs.next()) { log.error("App class failed too much data from catalog"); return; } } finally { if (c != null) try { c.rollback(); } catch (SQLException se) { // Intentionally empty. // We have done nothing that we want to commit, but want to // aggressively free transactional resources. } if (rs != null) try { rs.close(); } catch (SQLException se) { log.error("Failed to close emulation database setup Connection", se); } finally { rs = null; // Encourage GC } if (c != null) try { c.close(); } catch (SQLException se) { log.error("Failed to close emulation database setup Connection", se); } finally { c = null; // Encourage GC } } log.info("Application Success"); } } hsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/jul.properties0000644000175000017500000000155112007547332025004 0ustar renerene# $Id: jul.properties 3914 2010-11-26 22:11:10Z unsaved $ # As this is a Java .properties file, use ISO-8859-1 encoding for any # extended characters. # See http://java.sun.com/javase/6/docs/technotes/guides/logging/overview.html # for an overview of the JDK logging system, aka the Java Logging API or # java.util.logging. # If you want more, and easier, control, particularly over the format of # output records, use Log4J instead. # This is different from the default logging file provided by HyperSQL. # Here, we purposefully turn up verbosity of the org.hsqldb.sample classes so # the user can see what is going in the examples. handlers=java.util.logging.ConsoleHandler .level=WARNING java.util.logging.ConsoleHandler.level=INFO java.util.logging.ConsoleHandler.formatter=org.hsqldb.lib.BasicTextJdkLogFormatter org.hsqldb.sample.level=INFO hsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/build.xml0000644000175000017500000001050112007547332023710 0ustar renerene You must set Ant property 'authentication.mode' to either "LDAP" or "JAAS" or "HsqldbSlave" or "JAAS_LDAP". Ant property 'hsqldb.jarfile' is required. To get it using Ivy, SEE COMMENTS THE BUILD FILE. hsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/resources/0000755000175000017500000000000012007557304024104 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/resources/jaasbeans.xml0000644000175000017500000000212712007547332026557 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/resources/ldapbeans.xml0000644000175000017500000000261612007547332026564 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/resources/slavebeans.xml0000644000175000017500000000176012007547332026755 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/resources/beandefs.xml0000644000175000017500000000267312007547332026405 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/integration/extAuthWithSpring/resources/jaasldapbeans.xml0000644000175000017500000000212012007547332027411 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/0000755000175000017500000000000012007557304020525 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/readme.txt0000644000175000017500000000263312007547332022527 0ustar renereneThis directory contains access files for Apache Jackrabbit (http://jackrabbit.apache.org/) The ddl file for jackrabbit version 2.x is located at: resources/org/apache/jackrabbit/core/persistence/bundle/hsqldb.ddl This ddl file can be used with the default BundleDbPersistenceManager Copy the ddl file to the same directory in your Jackrabbit setup, alongside the existing ddl files. For example jackrabbit-standalone-2.2.4/org/apache/jackrabbit/core/persistence/bundle A sample configuration is given below. The DDL table definitions use BLOBs, which are stored on disk. If you are storing no more than several thousand objects, the non-blob fields can be stored in memory for quicker access with hsqldb.default_table_type=memory. See the hsqldb documentation at http://hsqldb.org/doc/2.0/ for different connection URL and other properties that can be used. A ddl file for older versions of Jackrabbit is also included in the ...core/persistence/db directory. All files are modified copies of existing Jackrabbit sources. hsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/0000755000175000017500000000000012007557304022537 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/0000755000175000017500000000000012007557304023326 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/0000755000175000017500000000000012007557304024547 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/0000755000175000017500000000000012007557304026643 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/0000755000175000017500000000000012007557304027573 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/journal/0000755000175000017500000000000012007557304031245 5ustar renerene././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootroothsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/journal/hsqldb.ddlhsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/journal/hsql0000644000175000017500000000270212007547332032140 0ustar renerene# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. create table ${schemaObjectPrefix}JOURNAL (REVISION_ID BIGINT NOT NULL, JOURNAL_ID varchar(255), PRODUCER_ID varchar(255), REVISION_DATA blob) create unique index ${schemaObjectPrefix}JOURNAL_IDX on ${schemaObjectPrefix}JOURNAL (REVISION_ID) create table ${schemaObjectPrefix}GLOBAL_REVISION (REVISION_ID BIGINT NOT NULL) create unique index ${schemaObjectPrefix}GLOBAL_REVISION_IDX on ${schemaObjectPrefix}GLOBAL_REVISION (REVISION_ID) create table ${schemaObjectPrefix}LOCAL_REVISIONS (JOURNAL_ID varchar(255) NOT NULL, REVISION_ID BIGINT NOT NULL) # Inserting the one and only revision counter record now helps avoiding race conditions insert into ${schemaObjectPrefix}GLOBAL_REVISION VALUES(0) hsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/persistence/0000755000175000017500000000000012007557304032117 5ustar renerene././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootroothsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/persistence/bundle/hsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/persistence/0000755000175000017500000000000012007557304032117 5ustar renerene././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootroothsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/persistence/bundle/hsqldb.ddlhsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/persistence/0000644000175000017500000000246512007547332032130 0ustar renerene# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Bundle persistence DDL script for the HSQLDB database engine (http://www.hsqldb.org) # create table ${schemaObjectPrefix}BUNDLE (NODE_ID binary(16) primary key, BUNDLE_DATA blob(2G) not null)) create table ${schemaObjectPrefix}REFS (NODE_ID binary(16) PRIMARY KEY primary key, REFS_DATA blob(2G) not null)) create table ${schemaObjectPrefix}BINVAL (BINVAL_ID char(64) PRIMARY KEY, BINVAL_DATA blob(2G) not null) create table ${schemaObjectPrefix}NAMES (ID INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, NAME varchar(255) not null) ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootroothsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/persistence/db/hsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/persistence/0000755000175000017500000000000012007557304032117 5ustar renerene././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootroothsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/persistence/db/hsqldb.ddlhsqldb2.2-2.2.9.orig/hsqldb/integration/jackrabbit/resources/org/apache/jackrabbit/core/persistence/0000644000175000017500000000235712007547332032130 0ustar renerene# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # DDL script for the HSQLDB database engine (http://www.hsqldb.org) # create table ${schemaObjectPrefix}NODE (NODE_ID char(36) primary key, NODE_DATA blob not null) create table ${schemaObjectPrefix}PROP (PROP_ID varchar(1024) primary key, PROP_DATA blob not null) create table ${schemaObjectPrefix}REFS (NODE_ID char(36) primary key, REFS_DATA blob not null) create table ${schemaObjectPrefix}BINVAL (BINVAL_ID varchar(1024) primary key, BINVAL_DATA blob not null) hsqldb2.2-2.2.9.orig/hsqldb/integration/hibernate_3_3_1/0000755000175000017500000000000012007557304021256 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/hibernate_3_3_1/src/0000755000175000017500000000000012007557304022045 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/hibernate_3_3_1/src/org/0000755000175000017500000000000012007557304022634 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/hibernate_3_3_1/src/org/hibernate/0000755000175000017500000000000012007557304024575 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/hibernate_3_3_1/src/org/hibernate/dialect/0000755000175000017500000000000012007557304026202 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/hibernate_3_3_1/src/org/hibernate/dialect/HSQLDialect.java0000644000175000017500000006215112007547332031107 0ustar renerene/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Middleware LLC. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * 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 Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA * */ package org.hibernate.dialect; import java.sql.SQLException; import java.sql.Types; import java.io.Serializable; import org.hibernate.Hibernate; import org.hibernate.LockMode; import org.hibernate.StaleObjectStateException; import org.hibernate.JDBCException; import org.hibernate.engine.SessionImplementor; import org.hibernate.persister.entity.Lockable; import org.hibernate.cfg.Environment; import org.hibernate.dialect.function.NoArgSQLFunction; import org.hibernate.dialect.function.StandardSQLFunction; import org.hibernate.dialect.function.VarArgsSQLFunction; import org.hibernate.dialect.lock.LockingStrategy; import org.hibernate.dialect.lock.SelectLockingStrategy; import org.hibernate.exception.JDBCExceptionHelper; import org.hibernate.exception.TemplatedViolatedConstraintNameExtracter; import org.hibernate.exception.ViolatedConstraintNameExtracter; import org.hibernate.util.ReflectHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * An SQL dialect compatible with HSQLDB (HyperSQL). *

* Note this version supports HSQLDB version 1.8 and higher, only. *

* Enhancements to version 3.3.1 GA dialect to provide basic support for both HSQLDB 1.8.x and 2.0. * For version 3.6.0 GA and later use the dialect supplied with Hibernate. * * @author Christoph Sturm * @author Phillip Baird * @author Fred Toussi */ public class HSQLDialect extends Dialect { private static final Logger log = LoggerFactory.getLogger( HSQLDialect.class ); /** * version is 18 for 1.8 or 20 for 2.0 */ private int hsqldbVersion = 18; public HSQLDialect() { super(); try { Class props = ReflectHelper.classForName( "org.hsqldb.persist.HsqlDatabaseProperties" ); String versionString = (String) props.getDeclaredField( "THIS_VERSION" ).get( null ); hsqldbVersion = Integer.parseInt( versionString.substring( 0, 1 ) ) * 10; hsqldbVersion += Integer.parseInt( versionString.substring( 2, 3 ) ); } catch ( Throwable e ) { // must be a very old version } registerColumnType( Types.BIGINT, "bigint" ); registerColumnType( Types.BINARY, "binary($l)" ); registerColumnType( Types.BIT, "bit" ); registerColumnType( Types.BOOLEAN, "boolean" ); registerColumnType( Types.CHAR, "char($l)" ); registerColumnType( Types.DATE, "date" ); registerColumnType( Types.DECIMAL, "decimal($p,$s)" ); registerColumnType( Types.DOUBLE, "double" ); registerColumnType( Types.FLOAT, "float" ); registerColumnType( Types.INTEGER, "integer" ); registerColumnType( Types.LONGVARBINARY, "longvarbinary" ); registerColumnType( Types.LONGVARCHAR, "longvarchar" ); registerColumnType( Types.SMALLINT, "smallint" ); registerColumnType( Types.TINYINT, "tinyint" ); registerColumnType( Types.TIME, "time" ); registerColumnType( Types.TIMESTAMP, "timestamp" ); registerColumnType( Types.VARCHAR, "varchar($l)" ); registerColumnType( Types.VARBINARY, "varbinary($l)" ); if ( hsqldbVersion < 20 ) { registerColumnType( Types.NUMERIC, "numeric" ); } else { registerColumnType( Types.NUMERIC, "numeric($p,$s)" ); } //HSQL has no Blob/Clob support .... but just put these here for now! if ( hsqldbVersion < 20 ) { registerColumnType( Types.BLOB, "longvarbinary" ); registerColumnType( Types.CLOB, "longvarchar" ); } else { registerColumnType( Types.BLOB, "blob" ); registerColumnType( Types.CLOB, "clob" ); } registerFunction( "ascii", new StandardSQLFunction( "ascii", Hibernate.INTEGER ) ); registerFunction( "char", new StandardSQLFunction( "char", Hibernate.CHARACTER ) ); registerFunction( "length", new StandardSQLFunction( "length", Hibernate.LONG ) ); registerFunction( "lower", new StandardSQLFunction( "lower" ) ); registerFunction( "upper", new StandardSQLFunction( "upper" ) ); registerFunction( "lcase", new StandardSQLFunction( "lcase" ) ); registerFunction( "ucase", new StandardSQLFunction( "ucase" ) ); registerFunction( "soundex", new StandardSQLFunction( "soundex", Hibernate.STRING ) ); registerFunction( "ltrim", new StandardSQLFunction( "ltrim" ) ); registerFunction( "rtrim", new StandardSQLFunction( "rtrim" ) ); registerFunction( "reverse", new StandardSQLFunction( "reverse" ) ); registerFunction( "space", new StandardSQLFunction( "space", Hibernate.STRING ) ); registerFunction( "rawtohex", new StandardSQLFunction( "rawtohex" ) ); registerFunction( "hextoraw", new StandardSQLFunction( "hextoraw" ) ); registerFunction( "user", new NoArgSQLFunction( "user", Hibernate.STRING ) ); registerFunction( "database", new NoArgSQLFunction( "database", Hibernate.STRING ) ); registerFunction( "current_date", new NoArgSQLFunction( "current_date", Hibernate.DATE, false ) ); registerFunction( "curdate", new NoArgSQLFunction( "curdate", Hibernate.DATE ) ); registerFunction( "current_timestamp", new NoArgSQLFunction( "current_timestamp", Hibernate.TIMESTAMP, false ) ); registerFunction( "now", new NoArgSQLFunction( "now", Hibernate.TIMESTAMP ) ); registerFunction( "current_time", new NoArgSQLFunction( "current_time", Hibernate.TIME, false ) ); registerFunction( "curtime", new NoArgSQLFunction( "curtime", Hibernate.TIME ) ); registerFunction( "day", new StandardSQLFunction( "day", Hibernate.INTEGER ) ); registerFunction( "dayofweek", new StandardSQLFunction( "dayofweek", Hibernate.INTEGER ) ); registerFunction( "dayofyear", new StandardSQLFunction( "dayofyear", Hibernate.INTEGER ) ); registerFunction( "dayofmonth", new StandardSQLFunction( "dayofmonth", Hibernate.INTEGER ) ); registerFunction( "month", new StandardSQLFunction( "month", Hibernate.INTEGER ) ); registerFunction( "year", new StandardSQLFunction( "year", Hibernate.INTEGER ) ); registerFunction( "week", new StandardSQLFunction( "week", Hibernate.INTEGER ) ); registerFunction( "quater", new StandardSQLFunction( "quater", Hibernate.INTEGER ) ); registerFunction( "hour", new StandardSQLFunction( "hour", Hibernate.INTEGER ) ); registerFunction( "minute", new StandardSQLFunction( "minute", Hibernate.INTEGER ) ); registerFunction( "second", new StandardSQLFunction( "second", Hibernate.INTEGER ) ); registerFunction( "dayname", new StandardSQLFunction( "dayname", Hibernate.STRING ) ); registerFunction( "monthname", new StandardSQLFunction( "monthname", Hibernate.STRING ) ); registerFunction( "abs", new StandardSQLFunction( "abs" ) ); registerFunction( "sign", new StandardSQLFunction( "sign", Hibernate.INTEGER ) ); registerFunction( "acos", new StandardSQLFunction( "acos", Hibernate.DOUBLE ) ); registerFunction( "asin", new StandardSQLFunction( "asin", Hibernate.DOUBLE ) ); registerFunction( "atan", new StandardSQLFunction( "atan", Hibernate.DOUBLE ) ); registerFunction( "cos", new StandardSQLFunction( "cos", Hibernate.DOUBLE ) ); registerFunction( "cot", new StandardSQLFunction( "cot", Hibernate.DOUBLE ) ); registerFunction( "exp", new StandardSQLFunction( "exp", Hibernate.DOUBLE ) ); registerFunction( "log", new StandardSQLFunction( "log", Hibernate.DOUBLE ) ); registerFunction( "log10", new StandardSQLFunction( "log10", Hibernate.DOUBLE ) ); registerFunction( "sin", new StandardSQLFunction( "sin", Hibernate.DOUBLE ) ); registerFunction( "sqrt", new StandardSQLFunction( "sqrt", Hibernate.DOUBLE ) ); registerFunction( "tan", new StandardSQLFunction( "tan", Hibernate.DOUBLE ) ); registerFunction( "pi", new NoArgSQLFunction( "pi", Hibernate.DOUBLE ) ); registerFunction( "rand", new StandardSQLFunction( "rand", Hibernate.FLOAT ) ); registerFunction( "radians", new StandardSQLFunction( "radians", Hibernate.DOUBLE ) ); registerFunction( "degrees", new StandardSQLFunction( "degrees", Hibernate.DOUBLE ) ); registerFunction( "roundmagic", new StandardSQLFunction( "roundmagic" ) ); registerFunction( "ceiling", new StandardSQLFunction( "ceiling" ) ); registerFunction( "floor", new StandardSQLFunction( "floor" ) ); // Multi-param dialect functions... registerFunction( "mod", new StandardSQLFunction( "mod", Hibernate.INTEGER ) ); // function templates registerFunction( "concat", new VarArgsSQLFunction( Hibernate.STRING, "(", "||", ")" ) ); getDefaultProperties().setProperty( Environment.STATEMENT_BATCH_SIZE, DEFAULT_BATCH_SIZE ); } public String getAddColumnString() { return "add column"; } public boolean supportsIdentityColumns() { return true; } public String getIdentityColumnString() { return "generated by default as identity (start with 1)"; //not null is implicit } public String getIdentitySelectString() { return "call identity()"; } public String getIdentityInsertString() { return hsqldbVersion < 20 ? "null" : "default"; } public boolean supportsLockTimeouts() { return false; } public String getForUpdateString() { return ""; } public boolean supportsUnique() { return false; } public boolean supportsLimit() { return true; } public String getLimitString(String sql, boolean hasOffset) { if ( hsqldbVersion < 20 ) { return new StringBuffer( sql.length() + 10 ) .append( sql ) .insert( sql.toLowerCase().indexOf( "select" ) + 6, hasOffset ? " limit ? ?" : " top ?" ) .toString(); } else { return new StringBuffer( sql.length() + 20 ) .append( sql ) .append( hasOffset ? " offset ? limit ?" : " limit ?" ) .toString(); } } public boolean bindLimitParametersFirst() { return hsqldbVersion < 20; } public boolean supportsIfExistsAfterTableName() { return true; } public boolean supportsColumnCheck() { return hsqldbVersion >= 20; } public boolean supportsSequences() { return true; } public boolean supportsPooledSequences() { return true; } protected String getCreateSequenceString(String sequenceName) { return "create sequence " + sequenceName; } protected String getDropSequenceString(String sequenceName) { return "drop sequence " + sequenceName; } public String getSelectSequenceNextValString(String sequenceName) { return "next value for " + sequenceName; } public String getSequenceNextValString(String sequenceName) { return "call next value for " + sequenceName; } public String getQuerySequencesString() { // this assumes schema support, which is present in 1.8.0 and later... return "select sequence_name from information_schema.system_sequences"; } public ViolatedConstraintNameExtracter getViolatedConstraintNameExtracter() { return hsqldbVersion < 20 ? EXTRACTER_18 : EXTRACTER_20; } private static ViolatedConstraintNameExtracter EXTRACTER_18 = new TemplatedViolatedConstraintNameExtracter() { /** * Extract the name of the violated constraint from the given SQLException. * * @param sqle The exception that was the result of the constraint violation. * @return The extracted constraint name. */ public String extractConstraintName(SQLException sqle) { String constraintName = null; int errorCode = JDBCExceptionHelper.extractErrorCode( sqle ); if ( errorCode == -8 ) { constraintName = extractUsingTemplate( "Integrity constraint violation ", " table:", sqle.getMessage() ); } else if ( errorCode == -9 ) { constraintName = extractUsingTemplate( "Violation of unique index: ", " in statement [", sqle.getMessage() ); } else if ( errorCode == -104 ) { constraintName = extractUsingTemplate( "Unique constraint violation: ", " in statement [", sqle.getMessage() ); } else if ( errorCode == -177 ) { constraintName = extractUsingTemplate( "Integrity constraint violation - no parent ", " table:", sqle.getMessage() ); } return constraintName; } }; /** * HSQLDB 2.0 messages have changed * messages may be localized - therefore use the common, non-locale element " table: " */ private static ViolatedConstraintNameExtracter EXTRACTER_20 = new TemplatedViolatedConstraintNameExtracter() { public String extractConstraintName(SQLException sqle) { String constraintName = null; int errorCode = JDBCExceptionHelper.extractErrorCode( sqle ); if ( errorCode == -8 ) { constraintName = extractUsingTemplate( "; ", " table: ", sqle.getMessage() ); } else if ( errorCode == -9 ) { constraintName = extractUsingTemplate( "; ", " table: ", sqle.getMessage() ); } else if ( errorCode == -104 ) { constraintName = extractUsingTemplate( "; ", " table: ", sqle.getMessage() ); } else if ( errorCode == -177 ) { constraintName = extractUsingTemplate( "; ", " table: ", sqle.getMessage() ); } return constraintName; } }; public String getSelectClauseNullString(int sqlType) { String literal; switch ( sqlType ) { case Types.VARCHAR: case Types.CHAR: literal = "cast(null as varchar(100))"; break; case Types.DATE: literal = "cast(null as date)"; break; case Types.TIMESTAMP: literal = "cast(null as timestamp)"; break; case Types.TIME: literal = "cast(null as time)"; break; default: literal = "cast(null as int)"; } return literal; } public boolean supportsUnionAll() { return true; } // temporary table support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Hibernate uses this information for temporary tables that it uses for its own operations // therefore the appropriate strategy is taken with different versions of HSQLDB // All versions of HSQLDB support GLOBAL TEMPORARY tables where the table // definition is shared by all users but data is private to the session // HSQLDB 2.0 also supports session-based LOCAL TEMPORARY tables where // the definition and data is private to the session and table declaration // can happen in the middle of a transaction /** * Does this dialect support temporary tables? * * @return True if temp tables are supported; false otherwise. */ public boolean supportsTemporaryTables() { return true; } /** * With HSQLDB 2.0, the table name is qualified with MODULE to assist the drop * statement (in-case there is a global name beginning with HT_) * * @param baseTableName The table name from which to base the temp table name. * * @return The generated temp table name. */ public String generateTemporaryTableName(String baseTableName) { if ( hsqldbVersion < 20 ) { return "HT_" + baseTableName; } else { return "MODULE.HT_" + baseTableName; } } /** * Command used to create a temporary table. * * @return The command used to create a temporary table. */ public String getCreateTemporaryTableString() { if ( hsqldbVersion < 20 ) { return "create global temporary table"; } else { return "declare local temporary table"; } } /** * No fragment is needed if data is not needed beyond commit, otherwise * should add "on commit preserve rows" * * @return Any required postfix. */ public String getCreateTemporaryTablePostfix() { return ""; } /** * Command used to drop a temporary table. * * @return The command used to drop a temporary table. */ public String getDropTemporaryTableString() { return "drop table"; } /** * Different behavior for GLOBAL TEMPORARY (1.8) and LOCAL TEMPORARY (2.0) *

* Possible return values and their meanings:

* * @return see the result matrix above. */ public Boolean performTemporaryTableDDLInIsolation() { if ( hsqldbVersion < 20 ) { return Boolean.TRUE; } else { return Boolean.FALSE; } } /** * Do we need to drop the temporary table after use? * * todo - clarify usage by Hibernate * * Version 1.8 GLOBAL TEMPORARY table definitions persist beyond the end * of the session (by default, data is cleared at commit). If there are * not too many such tables, perhaps we can avoid dropping them and reuse * the table next time?

* * Version 2.x LOCAL TEMPORARY table definitions do not persist beyond * the end of the session (by default, data is cleared at commit). * * @return True if the table should be dropped. */ public boolean dropTemporaryTableAfterUse() { if ( hsqldbVersion < 20 ) { return Boolean.TRUE; } else { return Boolean.FALSE; } } // current timestamp support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * HSQLDB 1.8.x requires CALL CURRENT_TIMESTAMP but this should not * be treated as a callable statement. It is equivalent to * "select current_timestamp from dual" in some databases. * HSQLDB 2.0 also supports VALUES CURRENT_TIMESTAMP * * @return True if the current timestamp can be retrieved; false otherwise. */ public boolean supportsCurrentTimestampSelection() { return true; } /** * Should the value returned by {@link #getCurrentTimestampSelectString} * be treated as callable. Typically this indicates that JDBC escape * syntax is being used...

* * CALL CURRENT_TIMESTAMP is used but this should not * be treated as a callable statement. * * @return True if the {@link #getCurrentTimestampSelectString} return * is callable; false otherwise. */ public boolean isCurrentTimestampSelectStringCallable() { return false; } /** * Retrieve the command used to retrieve the current timestamp from the * database. * * @return The command. */ public String getCurrentTimestampSelectString() { return "call current_timestamp"; } /** * The name of the database-specific SQL function for retrieving the * current timestamp. * * @return The function name. */ public String getCurrentTimestampSQLFunctionName() { // the standard SQL function name is current_timestamp... return "current_timestamp"; } /** * For HSQLDB 2.0, this is a copy of the base class implementation. * For HSQLDB 1.8, only READ_UNCOMMITTED is supported. * * @param lockable The persister for the entity to be locked. * @param lockMode The type of lock to be acquired. * * @return The appropriate locking strategy. * * @since 3.2 */ public LockingStrategy getLockingStrategy(Lockable lockable, LockMode lockMode) { if ( hsqldbVersion < 20 ) { return new ReadUncommittedLockingStrategy( lockable, lockMode ); } else { return new SelectLockingStrategy( lockable, lockMode ); } } public static class ReadUncommittedLockingStrategy extends SelectLockingStrategy { public ReadUncommittedLockingStrategy(Lockable lockable, LockMode lockMode) { super( lockable, lockMode ); } public void lock(Serializable id, Object version, Object object, SessionImplementor session) throws StaleObjectStateException, JDBCException { if ( getLockMode().greaterThan( LockMode.READ ) ) { log.warn( "HSQLDB supports only READ_UNCOMMITTED isolation" ); } super.lock( id, version, object, session ); } } // Overridden informational metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public boolean supportsEmptyInList() { return false; } /** * todo - needs usage clarification * * If the SELECT statement is always part of a UNION, then the type of * parameter is resolved by v. 2.0, but not v. 1.8 (assuming the other * SELECT in the UNION has a column reference in the same position and * can be type-resolved). * * On the other hand if the SELECT statement is isolated, all versions of * HSQLDB require casting for "select ? from .." to work. * * @return True if select clause parameter must be cast()ed * * @since 3.2 */ public boolean requiresCastingOfParametersInSelectClause() { return true; } /** * For the underlying database, is READ_COMMITTED isolation implemented by * forcing readers to wait for write locks to be released? * * @return True if writers block readers to achieve READ_COMMITTED; false otherwise. */ public boolean doesReadCommittedCauseWritersToBlockReaders() { return hsqldbVersion >= 20; } /** * For the underlying database, is REPEATABLE_READ isolation implemented by * forcing writers to wait for read locks to be released? * * @return True if readers block writers to achieve REPEATABLE_READ; false otherwise. */ public boolean doesRepeatableReadCauseReadersToBlockWriters() { return hsqldbVersion >= 20; } public boolean supportsLobValueChangePropogation() { return false; } public String toBooleanValueString(boolean bool) { return String.valueOf( bool ); } public boolean supportsTupleDistinctCounts() { return false; } } hsqldb2.2-2.2.9.orig/hsqldb/integration/readme.txt0000644000175000017500000000036712007547332020435 0ustar renerene$Id: readme.txt 3900 2010-11-17 03:59:50Z unsaved $ Each subdirectory of this directory is a home directory to a sample integration application. See the "readme.txt" file in each subdirectory to see the purpose of that particular sample. hsqldb2.2-2.2.9.orig/hsqldb/integration/hibernate/0000755000175000017500000000000012007557304020372 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/hibernate/src/0000755000175000017500000000000012007557304021161 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/hibernate/src/org/0000755000175000017500000000000012007557304021750 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/hibernate/src/org/hibernate/0000755000175000017500000000000012007557304023711 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/hibernate/src/org/hibernate/dialect/0000755000175000017500000000000012007557304025316 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/integration/hibernate/src/org/hibernate/dialect/HSQLDialect.java0000644000175000017500000007612012007547332030224 0ustar renerene/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2010, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * 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 Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.hibernate.dialect; import java.sql.SQLException; import java.sql.Types; import java.io.Serializable; import org.hibernate.LockMode; import org.hibernate.StaleObjectStateException; import org.hibernate.JDBCException; import org.hibernate.engine.SessionImplementor; import org.hibernate.persister.entity.Lockable; import org.hibernate.cfg.Environment; import org.hibernate.dialect.function.AvgWithArgumentCastFunction; import org.hibernate.dialect.function.SQLFunctionTemplate; import org.hibernate.dialect.function.NoArgSQLFunction; import org.hibernate.dialect.function.StandardSQLFunction; import org.hibernate.dialect.function.VarArgsSQLFunction; import org.hibernate.dialect.lock.*; import org.hibernate.exception.JDBCExceptionHelper; import org.hibernate.exception.TemplatedViolatedConstraintNameExtracter; import org.hibernate.exception.ViolatedConstraintNameExtracter; import org.hibernate.type.StandardBasicTypes; import org.hibernate.util.ReflectHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * An SQL dialect compatible with HSQLDB (HyperSQL). *

* Note this version supports HSQLDB version 1.8 and higher, only. *

* Enhancements to version 3.5.0 GA to provide basic support for both HSQLDB 1.8.x and 2.x * Does not works with Hibernate 3.2 - 3.4 without alteration. * * @author Christoph Sturm * @author Phillip Baird * @author Fred Toussi */ public class HSQLDialect extends Dialect { private static final Logger log = LoggerFactory.getLogger( HSQLDialect.class ); /** * version is 18 for 1.8 or 20 for 2.0 */ private int hsqldbVersion = 18; public HSQLDialect() { super(); try { Class props = ReflectHelper.classForName( "org.hsqldb.persist.HsqlDatabaseProperties" ); String versionString = (String) props.getDeclaredField( "THIS_VERSION" ).get( null ); hsqldbVersion = Integer.parseInt( versionString.substring( 0, 1 ) ) * 10; hsqldbVersion += Integer.parseInt( versionString.substring( 2, 3 ) ); } catch ( Throwable e ) { // must be a very old version } registerColumnType( Types.BIGINT, "bigint" ); registerColumnType( Types.BINARY, "binary($l)" ); registerColumnType( Types.BIT, "bit" ); registerColumnType( Types.BOOLEAN, "boolean" ); registerColumnType( Types.CHAR, "char($l)" ); registerColumnType( Types.DATE, "date" ); registerColumnType( Types.DECIMAL, "decimal($p,$s)" ); registerColumnType( Types.DOUBLE, "double" ); registerColumnType( Types.FLOAT, "float" ); registerColumnType( Types.INTEGER, "integer" ); registerColumnType( Types.LONGVARBINARY, "longvarbinary" ); registerColumnType( Types.LONGVARCHAR, "longvarchar" ); registerColumnType( Types.SMALLINT, "smallint" ); registerColumnType( Types.TINYINT, "tinyint" ); registerColumnType( Types.TIME, "time" ); registerColumnType( Types.TIMESTAMP, "timestamp" ); registerColumnType( Types.VARCHAR, "varchar($l)" ); registerColumnType( Types.VARBINARY, "varbinary($l)" ); if ( hsqldbVersion < 20 ) { registerColumnType( Types.NUMERIC, "numeric" ); } else { registerColumnType( Types.NUMERIC, "numeric($p,$s)" ); } //HSQL has no Blob/Clob support .... but just put these here for now! if ( hsqldbVersion < 20 ) { registerColumnType( Types.BLOB, "longvarbinary" ); registerColumnType( Types.CLOB, "longvarchar" ); } else { registerColumnType( Types.BLOB, "blob" ); registerColumnType( Types.CLOB, "clob" ); } // aggregate functions registerFunction( "avg", new AvgWithArgumentCastFunction( "double" ) ); // string functions registerFunction( "ascii", new StandardSQLFunction( "ascii", StandardBasicTypes.INTEGER ) ); registerFunction( "char", new StandardSQLFunction( "char", StandardBasicTypes.CHARACTER ) ); registerFunction( "lower", new StandardSQLFunction( "lower" ) ); registerFunction( "upper", new StandardSQLFunction( "upper" ) ); registerFunction( "lcase", new StandardSQLFunction( "lcase" ) ); registerFunction( "ucase", new StandardSQLFunction( "ucase" ) ); registerFunction( "soundex", new StandardSQLFunction( "soundex", StandardBasicTypes.STRING ) ); registerFunction( "ltrim", new StandardSQLFunction( "ltrim" ) ); registerFunction( "rtrim", new StandardSQLFunction( "rtrim" ) ); registerFunction( "reverse", new StandardSQLFunction( "reverse" ) ); registerFunction( "space", new StandardSQLFunction( "space", StandardBasicTypes.STRING ) ); registerFunction( "str", new SQLFunctionTemplate( StandardBasicTypes.STRING, "cast(?1 as varchar(256))" ) ); registerFunction( "rawtohex", new StandardSQLFunction( "rawtohex" ) ); registerFunction( "hextoraw", new StandardSQLFunction( "hextoraw" ) ); // system functions registerFunction( "user", new NoArgSQLFunction( "user", StandardBasicTypes.STRING ) ); registerFunction( "database", new NoArgSQLFunction( "database", StandardBasicTypes.STRING ) ); // datetime functions if ( hsqldbVersion < 20 ) { registerFunction( "sysdate", new NoArgSQLFunction( "sysdate", StandardBasicTypes.DATE, false ) ); } else { registerFunction( "sysdate", new NoArgSQLFunction( "sysdate", StandardBasicTypes.TIMESTAMP, false ) ); } registerFunction( "current_date", new NoArgSQLFunction( "current_date", StandardBasicTypes.DATE, false ) ); registerFunction( "curdate", new NoArgSQLFunction( "curdate", StandardBasicTypes.DATE ) ); registerFunction( "current_timestamp", new NoArgSQLFunction( "current_timestamp", StandardBasicTypes.TIMESTAMP, false ) ); registerFunction( "now", new NoArgSQLFunction( "now", StandardBasicTypes.TIMESTAMP ) ); registerFunction( "current_time", new NoArgSQLFunction( "current_time", StandardBasicTypes.TIME, false ) ); registerFunction( "curtime", new NoArgSQLFunction( "curtime", StandardBasicTypes.TIME ) ); registerFunction( "day", new StandardSQLFunction( "day", StandardBasicTypes.INTEGER ) ); registerFunction( "dayofweek", new StandardSQLFunction( "dayofweek", StandardBasicTypes.INTEGER ) ); registerFunction( "dayofyear", new StandardSQLFunction( "dayofyear", StandardBasicTypes.INTEGER ) ); registerFunction( "dayofmonth", new StandardSQLFunction( "dayofmonth", StandardBasicTypes.INTEGER ) ); registerFunction( "month", new StandardSQLFunction( "month", StandardBasicTypes.INTEGER ) ); registerFunction( "year", new StandardSQLFunction( "year", StandardBasicTypes.INTEGER ) ); registerFunction( "week", new StandardSQLFunction( "week", StandardBasicTypes.INTEGER ) ); registerFunction( "quarter", new StandardSQLFunction( "quarter", StandardBasicTypes.INTEGER ) ); registerFunction( "hour", new StandardSQLFunction( "hour", StandardBasicTypes.INTEGER ) ); registerFunction( "minute", new StandardSQLFunction( "minute", StandardBasicTypes.INTEGER ) ); registerFunction( "second", new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "cast(second(?1) as int)" ) ); registerFunction( "dayname", new StandardSQLFunction( "dayname", StandardBasicTypes.STRING ) ); registerFunction( "monthname", new StandardSQLFunction( "monthname", StandardBasicTypes.STRING ) ); // numeric functions registerFunction( "abs", new StandardSQLFunction( "abs" ) ); registerFunction( "sign", new StandardSQLFunction( "sign", StandardBasicTypes.INTEGER ) ); registerFunction( "acos", new StandardSQLFunction( "acos", StandardBasicTypes.DOUBLE ) ); registerFunction( "asin", new StandardSQLFunction( "asin", StandardBasicTypes.DOUBLE ) ); registerFunction( "atan", new StandardSQLFunction( "atan", StandardBasicTypes.DOUBLE ) ); registerFunction( "cos", new StandardSQLFunction( "cos", StandardBasicTypes.DOUBLE ) ); registerFunction( "cot", new StandardSQLFunction( "cot", StandardBasicTypes.DOUBLE ) ); registerFunction( "exp", new StandardSQLFunction( "exp", StandardBasicTypes.DOUBLE ) ); registerFunction( "log", new StandardSQLFunction( "log", StandardBasicTypes.DOUBLE ) ); registerFunction( "log10", new StandardSQLFunction( "log10", StandardBasicTypes.DOUBLE ) ); registerFunction( "sin", new StandardSQLFunction( "sin", StandardBasicTypes.DOUBLE ) ); registerFunction( "sqrt", new StandardSQLFunction( "sqrt", StandardBasicTypes.DOUBLE ) ); registerFunction( "tan", new StandardSQLFunction( "tan", StandardBasicTypes.DOUBLE ) ); registerFunction( "pi", new NoArgSQLFunction( "pi", StandardBasicTypes.DOUBLE ) ); registerFunction( "rand", new StandardSQLFunction( "rand", StandardBasicTypes.FLOAT ) ); registerFunction( "radians", new StandardSQLFunction( "radians", StandardBasicTypes.DOUBLE ) ); registerFunction( "degrees", new StandardSQLFunction( "degrees", StandardBasicTypes.DOUBLE ) ); registerFunction( "round", new StandardSQLFunction( "round" ) ); registerFunction( "roundmagic", new StandardSQLFunction( "roundmagic" ) ); registerFunction( "truncate", new StandardSQLFunction( "truncate" ) ); registerFunction( "ceiling", new StandardSQLFunction( "ceiling" ) ); registerFunction( "floor", new StandardSQLFunction( "floor" ) ); // special functions // from v. 2.2.0 ROWNUM() is supported in all modes as the equivalent of Oracle ROWNUM if ( hsqldbVersion > 21 ) { registerFunction("rownum", new NoArgSQLFunction("rownum", StandardBasicTypes.INTEGER)); } // function templates registerFunction( "concat", new VarArgsSQLFunction( StandardBasicTypes.STRING, "(", "||", ")" ) ); getDefaultProperties().setProperty( Environment.STATEMENT_BATCH_SIZE, DEFAULT_BATCH_SIZE ); } public String getAddColumnString() { return "add column"; } public boolean supportsIdentityColumns() { return true; } public String getIdentityColumnString() { return "generated by default as identity (start with 1)"; //not null is implicit } public String getIdentitySelectString() { return "call identity()"; } public String getIdentityInsertString() { return hsqldbVersion < 20 ? "null" : "default"; } public boolean supportsLockTimeouts() { return false; } public String getForUpdateString() { return ""; } public boolean supportsUnique() { return false; } public boolean supportsLimit() { return true; } public String getLimitString(String sql, boolean hasOffset) { if ( hsqldbVersion < 20 ) { return new StringBuffer( sql.length() + 10 ) .append( sql ) .insert( sql.toLowerCase().indexOf( "select" ) + 6, hasOffset ? " limit ? ?" : " top ?" ) .toString(); } else { return new StringBuffer( sql.length() + 20 ) .append( sql ) .append( hasOffset ? " offset ? limit ?" : " limit ?" ) .toString(); } } public boolean bindLimitParametersFirst() { return hsqldbVersion < 20; } public boolean supportsIfExistsAfterTableName() { return true; } public boolean supportsColumnCheck() { return hsqldbVersion >= 20; } public boolean supportsSequences() { return true; } public boolean supportsPooledSequences() { return true; } protected String getCreateSequenceString(String sequenceName) { return "create sequence " + sequenceName; } protected String getDropSequenceString(String sequenceName) { return "drop sequence " + sequenceName; } public String getSelectSequenceNextValString(String sequenceName) { return "next value for " + sequenceName; } public String getSequenceNextValString(String sequenceName) { return "call next value for " + sequenceName; } public String getQuerySequencesString() { // this assumes schema support, which is present in 1.8.0 and later... return "select sequence_name from information_schema.system_sequences"; } public ViolatedConstraintNameExtracter getViolatedConstraintNameExtracter() { return hsqldbVersion < 20 ? EXTRACTER_18 : EXTRACTER_20; } private static ViolatedConstraintNameExtracter EXTRACTER_18 = new TemplatedViolatedConstraintNameExtracter() { /** * Extract the name of the violated constraint from the given SQLException. * * @param sqle The exception that was the result of the constraint violation. * @return The extracted constraint name. */ public String extractConstraintName(SQLException sqle) { String constraintName = null; int errorCode = JDBCExceptionHelper.extractErrorCode( sqle ); if ( errorCode == -8 ) { constraintName = extractUsingTemplate( "Integrity constraint violation ", " table:", sqle.getMessage() ); } else if ( errorCode == -9 ) { constraintName = extractUsingTemplate( "Violation of unique index: ", " in statement [", sqle.getMessage() ); } else if ( errorCode == -104 ) { constraintName = extractUsingTemplate( "Unique constraint violation: ", " in statement [", sqle.getMessage() ); } else if ( errorCode == -177 ) { constraintName = extractUsingTemplate( "Integrity constraint violation - no parent ", " table:", sqle.getMessage() ); } return constraintName; } }; /** * HSQLDB 2.0 messages have changed * messages may be localized - therefore use the common, non-locale element " table: " */ private static ViolatedConstraintNameExtracter EXTRACTER_20 = new TemplatedViolatedConstraintNameExtracter() { public String extractConstraintName(SQLException sqle) { String constraintName = null; int errorCode = JDBCExceptionHelper.extractErrorCode( sqle ); if ( errorCode == -8 ) { constraintName = extractUsingTemplate( "; ", " table: ", sqle.getMessage() ); } else if ( errorCode == -9 ) { constraintName = extractUsingTemplate( "; ", " table: ", sqle.getMessage() ); } else if ( errorCode == -104 ) { constraintName = extractUsingTemplate( "; ", " table: ", sqle.getMessage() ); } else if ( errorCode == -177 ) { constraintName = extractUsingTemplate( "; ", " table: ", sqle.getMessage() ); } return constraintName; } }; public String getSelectClauseNullString(int sqlType) { String literal; switch ( sqlType ) { case Types.LONGVARCHAR: case Types.VARCHAR: case Types.CHAR: literal = "cast(null as varchar(100))"; break; case Types.LONGVARBINARY: case Types.VARBINARY: case Types.BINARY: literal = "cast(null as varbinary(100))"; break; case Types.CLOB: literal = "cast(null as clob)"; break; case Types.BLOB: literal = "cast(null as blob)"; break; case Types.DATE: literal = "cast(null as date)"; break; case Types.TIMESTAMP: literal = "cast(null as timestamp)"; break; case Types.BOOLEAN: literal = "cast(null as boolean)"; break; case Types.BIT: literal = "cast(null as bit)"; break; case Types.TIME: literal = "cast(null as time)"; break; default: literal = "cast(null as int)"; } return literal; } public boolean supportsUnionAll() { return true; } // temporary table support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Hibernate uses this information for temporary tables that it uses for its own operations // therefore the appropriate strategy is taken with different versions of HSQLDB // All versions of HSQLDB support GLOBAL TEMPORARY tables where the table // definition is shared by all users but data is private to the session // HSQLDB 2.0 also supports session-based LOCAL TEMPORARY tables where // the definition and data is private to the session and table declaration // can happen in the middle of a transaction /** * Does this dialect support temporary tables? * * @return True if temp tables are supported; false otherwise. */ public boolean supportsTemporaryTables() { return true; } /** * With HSQLDB 2.0, the table name is qualified with MODULE to assist the drop * statement (in-case there is a global name beginning with HT_) * * @param baseTableName The table name from which to base the temp table name. * * @return The generated temp table name. */ public String generateTemporaryTableName(String baseTableName) { if ( hsqldbVersion < 20 ) { return "HT_" + baseTableName; } else { return "MODULE.HT_" + baseTableName; } } /** * Command used to create a temporary table. * * @return The command used to create a temporary table. */ public String getCreateTemporaryTableString() { if ( hsqldbVersion < 20 ) { return "create global temporary table"; } else { return "declare local temporary table"; } } /** * No fragment is needed if data is not needed beyond commit, otherwise * should add "on commit preserve rows" * * @return Any required postfix. */ public String getCreateTemporaryTablePostfix() { return ""; } /** * Command used to drop a temporary table. * * @return The command used to drop a temporary table. */ public String getDropTemporaryTableString() { return "drop table"; } /** * Different behavior for GLOBAL TEMPORARY (1.8) and LOCAL TEMPORARY (2.0) *

* Possible return values and their meanings:

* * @return see the result matrix above. */ public Boolean performTemporaryTableDDLInIsolation() { if ( hsqldbVersion < 20 ) { return Boolean.TRUE; } else { return Boolean.FALSE; } } /** * Do we need to drop the temporary table after use? * * todo - clarify usage by Hibernate * * Version 1.8 GLOBAL TEMPORARY table definitions persist beyond the end * of the session (by default, data is cleared at commit).

* * Version 2.x LOCAL TEMPORARY table definitions do not persist beyond * the end of the session (by default, data is cleared at commit). * * @return True if the table should be dropped. */ public boolean dropTemporaryTableAfterUse() { if ( hsqldbVersion < 20 ) { return Boolean.TRUE; } else { return Boolean.FALSE; } } // current timestamp support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * HSQLDB 1.8.x requires CALL CURRENT_TIMESTAMP but this should not * be treated as a callable statement. It is equivalent to * "select current_timestamp from dual" in some databases. * HSQLDB 2.0 also supports VALUES CURRENT_TIMESTAMP * * @return True if the current timestamp can be retrieved; false otherwise. */ public boolean supportsCurrentTimestampSelection() { return true; } /** * Should the value returned by {@link #getCurrentTimestampSelectString} * be treated as callable. Typically this indicates that JDBC escape * syntax is being used...

* * CALL CURRENT_TIMESTAMP is used but this should not * be treated as a callable statement. * * @return True if the {@link #getCurrentTimestampSelectString} return * is callable; false otherwise. */ public boolean isCurrentTimestampSelectStringCallable() { return false; } /** * Retrieve the command used to retrieve the current timestamp from the * database. * * @return The command. */ public String getCurrentTimestampSelectString() { return "call current_timestamp"; } /** * The name of the database-specific SQL function for retrieving the * current timestamp. * * @return The function name. */ public String getCurrentTimestampSQLFunctionName() { // the standard SQL function name is current_timestamp... return "current_timestamp"; } /** * For HSQLDB 2.0, this is a copy of the base class implementation. * For HSQLDB 1.8, only READ_UNCOMMITTED is supported. * * @param lockable The persister for the entity to be locked. * @param lockMode The type of lock to be acquired. * * @return The appropriate locking strategy. * * @since 3.2 */ public LockingStrategy getLockingStrategy(Lockable lockable, LockMode lockMode) { if ( lockMode == LockMode.PESSIMISTIC_FORCE_INCREMENT ) { return new PessimisticForceIncrementLockingStrategy( lockable, lockMode ); } else if ( lockMode == LockMode.PESSIMISTIC_WRITE ) { return new PessimisticWriteSelectLockingStrategy( lockable, lockMode ); } else if ( lockMode == LockMode.PESSIMISTIC_READ ) { return new PessimisticReadSelectLockingStrategy( lockable, lockMode ); } else if ( lockMode == LockMode.OPTIMISTIC ) { return new OptimisticLockingStrategy( lockable, lockMode ); } else if ( lockMode == LockMode.OPTIMISTIC_FORCE_INCREMENT ) { return new OptimisticForceIncrementLockingStrategy( lockable, lockMode ); } if ( hsqldbVersion < 20 ) { return new ReadUncommittedLockingStrategy( lockable, lockMode ); } else { return new SelectLockingStrategy( lockable, lockMode ); } } public static class ReadUncommittedLockingStrategy extends SelectLockingStrategy { public ReadUncommittedLockingStrategy(Lockable lockable, LockMode lockMode) { super( lockable, lockMode ); } public void lock(Serializable id, Object version, Object object, int timeout, SessionImplementor session) throws StaleObjectStateException, JDBCException { if ( getLockMode().greaterThan( LockMode.READ ) ) { log.warn( "HSQLDB supports only READ_UNCOMMITTED isolation" ); } super.lock( id, version, object, timeout, session ); } } public boolean supportsCommentOn() { return hsqldbVersion >= 20; } // Overridden informational metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @Override public boolean supportsEmptyInList() { return false; } /** * todo - needs usage clarification * * If the SELECT statement is always part of a UNION, then the type of * parameter is resolved by v. 2.0, but not v. 1.8 (assuming the other * SELECT in the UNION has a column reference in the same position and * can be type-resolved). * * On the other hand if the SELECT statement is isolated, all versions of * HSQLDB require casting for "select ? from .." to work. * * @return True if select clause parameter must be cast()ed * * @since 3.2 */ public boolean requiresCastingOfParametersInSelectClause() { return true; } /** * For the underlying database, is READ_COMMITTED isolation implemented by * forcing readers to wait for write locks to be released? * * @return True if writers block readers to achieve READ_COMMITTED; false otherwise. */ public boolean doesReadCommittedCauseWritersToBlockReaders() { return hsqldbVersion >= 20; } /** * For the underlying database, is REPEATABLE_READ isolation implemented by * forcing writers to wait for read locks to be released? * * @return True if readers block writers to achieve REPEATABLE_READ; false otherwise. */ public boolean doesRepeatableReadCauseReadersToBlockWriters() { return hsqldbVersion >= 20; } public boolean supportsLobValueChangePropogation() { return false; } public String toBooleanValueString(boolean bool) { return String.valueOf( bool ); } public boolean supportsTupleDistinctCounts() { return false; } } hsqldb2.2-2.2.9.orig/hsqldb/readme.txt0000644000175000017500000000047112007553066016107 0ustar renereneReadme File 2012/08/05-22:23:15 This package contains HyperSQL v. 2.2.9 HyperSQL is a relational database engine and a set of tools written in Java. HyperSQL is also known as HSQLDB. The file "index.html" explains the contents of this distribution and has links to documentation and support resources. hsqldb2.2-2.2.9.orig/hsqldb/lib/0000755000175000017500000000000012121705166014652 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/lib/sqltool.jar0000644000175000017500000044001012007570420017040 0ustar renerenePK 9A¦ùëMETA-INF/MANIFEST.MF…ÁKÃ0ÅïüßQ ]:{Û:Хū¤É7›‘&]’ ûïM§·<æýÞûÞ#•°zƒ!²7ôA;[ÀŒg”,ìe1Ù!$-Á9Ï))=ŠˆŠ-£ÿŽgï³9k³{¸©÷*-½ ‡±°¶’ßRR(õFKÓIÖèh°€§úõyµ¼„§ÞœçüaJ­r¾€&-ó°ÂO4nè1Í{ôn?P²îƒ£pÖVïLãœÒè„&®ËÚ þ¿·Ú²Òˆ pþƒwagTËe¯Œ¶È¤ï-ìEÄ®€o;–ò­ðGa«Zy!©¶O×Çç/ Nì,y%C %_PK 0Aî~=÷;^META-INF/hsqldb_lic.txt•SAnÛ0¼È=5…š¤9¶'Z¢e²¨’T‰nX¢AÒ òû.)N[¤@a fÈÝÙ™ÙñõgÈíáÅ™Ÿ>õ—p{sóõËíÍ×Û Ô£†•üQA¡ŸôÞF=(=.>Àg û=¤>N{ížôpңЃñÁ™‡c0v‚nàè5˜ ¼=º^§›3uîvÖ>ƒgÁºôm!ÁŒv0;Ów$ƒÎi8h7šôgŸÌ€‡ðØü£h¿·Ïfú ½›|juøö5v÷Ê©·Ö}@A¡C®´{°OñéÕ¤ÉÓë ߌOx{D‹ ogNÄpd¿į̈Ý{ùhÎG^‰ ÌáˆäþÁ%¡E>ÿËNÛãv“Ï »®q_Œ]ÐÎt{ö<-+µ¾‘p–Vk“:cÅÔ:r ïÆ uœKÓBL˜½E3ºui¼ÀƒŽ9BEô4à­Ž‘AZ£ f¯0òÅ<ÂΛòvžcNÐ}Ì6š˜<“5Íóþ7EjÅ$H¾T"(à¹üŽ´€Å)ä¼Ù V®¬xUP!ÔÞÖJ°E«8^|$;?ο|$õè}#¨”À°uS1Ä ‚ÔŠQ™«óª-X]f€ Ps[3…eŠgqpBû»øÖTä+ü—,XÅÔ6Í\2UÇyKH !B±¼­ˆ€¦ —3\”X0™W„­iq…,p2Ð;Z++RU§EâMÅ›u¼.o›,Ý‹+.Ê9•8å7 ù“EEgh@ÁÍUTz>åh,Ò®2 ͽ§¨“ˆmv•ôG‹…XY“eú·c W—·‚&Þh“lR1Õ* %çEÚ…¤âŽåT~O —ÉÐVÒ ')’ º)¿Çó¢•,ùÊjE…hÅx}‰QØ GÈ•`k\x1»R'é¸=.¶8z’v”ÁfEñ^DÏ“s$Z"ÑÁ\½-Ùh¨JpgÍPÓ²b%­s+xDÚ0I/q¥LÆ6ÞœÛ&ù1¼Èn>2™_ƒž¥¥[)îX”pjÀ¨HvŠU²0_V~2×âçPK 0A>Z¶íä± META-INF/hypersonic_lic.txtíUMoÛ8½èôÔÚ|=´=Ém%•¤’ú([tCT INà¿”c§»I€ÝÛbL‘œ7óÞ g.>½GŸhj;z°Ý/ªô½®íVW´ÚÓp§i.¿'»nšuv·ýꬼed·ûÎü¼èãúŒ®//¯þ¸¾¼ºH½hìíº&o×S§{ÝÝëêü*teú¡3«Ý`lKe[Ñ®×dZêí®[k¿³2mÙíic»¦èÁ wäXàßîÓØÊl̺t •¦­î3  ·í콩°îÊÁ3ÝØº¶¦ýIkÛVÆõÞ¨ÑÃ×BëÉncZÛ wwýBC‰Xh¹²÷îèQ¤Öf­œ™ÞãÕ@s O}¶Õ_‚Ëu]šFw/iÔ;qž(òhV;÷J,ÍÅóOc¡ÇÊ®w.»^g« äÂâ´£¦tgʺ?iî“åMŸP8QKµñ–îF[6ÚÅôr-‚ÇéªOˆFmÁcD·]0ö´Ò®ŽÀÈ’n+ìjW2«±ƒ¦Q+d…xQ´ÁÁ)S½Ý ®%FýV¯]}ÁиÊë\eµcõýoŒÔœK’ÙT݆‚Ö¹ÈnxÌbš,qÈ(Êò¥à³¹¢y–ÄLH Ó»©|R¨ B ËãëÁa˜.‰ýÈ“’2A|‘'€ð ÂTq&âi”1Og„ÒLQÂ\ášÊçØ£ýÝ”²)-˜ˆæø '<ájé}N¹J¿)†”‡Bñ¨HBAy!òLŽpŽbÌe”„|ÁâsDÏÄnXªHÎÃ$9$;I–/ÜöLdEøýxrž‰ÙX•ðò›†øÃIÂÆ @Ì‹”czZEa'ÉœE Æ~0ð Å28àJö½ÀE\ 8\„3Ðþøºb©‹ Á|ÜI©¸*£Y–Å>’‰1ùÍ$™ô‚’ð¤B` ¦üæÖ“Br¯+O¢ÈÏÒ3”Â-4B¬!L]ÂãQ•ÔSGö2±tÀNŸ£€nç ûÂiî• $ Fêé5ø„ ÊÃ8SÊf Ÿ±4bîFæn¹dgH)—î]߆ð[xú®xݸäÒ#>zà“N|Ja|Ã…ƒJEòCYy £ù!Ç's|:ÇÑdѵÐàêzÿÌ”ÚãÕõ¶Åct¥õꌺúòå3fÔååaF=czþ6¢ÞFÔ¿QÏTÓÛ€úÏ (Çx¾ÌA3Ky4¦Ò¨·±ôÿKèBÇ—†Ü£?øG}oë: ºÛñYûþÔ”hº˜SMÙîÑ*ƒ³C¯ñp+}W֛׈÷~ñþûý PK 8AAfþV`+org/hsqldb/cmdline/SqlFile$BadSpecial.class}’ÛnÓ@†ÿµ“:1)M(iÊÁ”rh1â¶åPÒ"µ¢â"!½@ÚØKââکס9௹íó g·âÈ zëµCªº‚Э˜;¯öø ­‚“wÔêgMyÚý(½ZëäP@1‡<æJ“°Í?oÝŽ¢0b¸³7”±å¨Ú¢¡[¸Û‡ ­c/î[A¬Cß·…”¼'·¡¦C9Œzv_ùn×v]J/ìÖ‘ÿØSU¬æ°†Û +ÿ¾T™dc0§ÜNˆ¨é«ÖJ†å)†ïuíÍÁ@®ª~û#ªît»H›3úuJާÝáĉso’™aÁÒ‹„û·k¤T<”I‡÷aÑw2é{i(ár %ë|¾¤úN{É@'h·N¶Fk¹Þ½‡v‚ùÆ7Ì~†þ¼!ýõÒûhžû‰Eh \Pi z@ …^ª7VG˜ù?© Heè¿IA 9–ư­ ¾ã#2'0Ro‘Ò?@›0ÒÐfÒ§Æ-2LZ³0pæ/PK 8AÙõð©)org/hsqldb/cmdline/SqlFile$BadSubst.class}P±NA}‡pè)"ÄX˜Hhrj‹±5ÁÐ]¼~á6°fÙ“ÛÅøVþ„…1±ðlü+À¸ÒЈÅÌ{“y™73ï߯oŽP_B+E8ð]¬¹¨|ÍSÁdÄS-uÕ=#Ð%¡ÜI”6L™ˆÉ)ÏñǯÏðãþ7#¡„­^’ƒ‘žÈ¸ ƱŠáD^ÉÛVw,”0'„ÃæÂÞ5»edj„&jØÞN'‰¹‡"JŽCâÁð¼ø&Æõb€¾™¯ùÍd&óþõú`¥,$â•%9‚¬fŠSÑaJó@^4OÈAºHRv¨¸c1çóióqK~ÄÃ×å]‚R+P} ‡¢wéwoz‚K淇┠v`¸C.yxD°^™V;N=è1‚½™`ëŠÞS_PÙ÷Û¡â²oJ=¤àyHcÕJÑÅAuzò±bôºñÐe·¡Ù• óÿÃkJÉT]P­™6£Oîu¢¡T ¢»@®2i:‚âôY°aÎ3—‰ €8\Ì]"›µ[ssdŒÎ·b|ÄÄdmû¤6BäöY&ûËä 51õÃìŒýƒò¶ÔD˶Õ7PK 8A¢Ô >2org/hsqldb/cmdline/SqlFile$ContinueException.class}‘»NBA†ÿáv䦕‹H¢"ÉQ[ B‚¡Cé°5ëÙ=ŸÆÂÂÞÂXø>„bÜEí€-þ™Ù|3™?óùýþà•$bÈ¥Ǧ•-y%‚«™â¾è3¥y ¯;º$d›Ô¡/þ/¦,Þî^žÜç/B"s]="Tºyc=Ãop7\2¯7m.Ø©áθäá9a¯¶ <èbÍ`ÈÇ+Áî­ÿà{—#¯*.G¦5ƒ42d±c¥ì`—ÐX>£j<…\NYëqÀîCc—[ð—éHÉTSøZ3m ,žx¢¥T Ñ𵑝-Ú‘P^¾öÍQâæ>”€ÂÚ¼Jº®õ6ÏÍ1°ntÃTSGLLÕß@õ"¯°Ï2îS4DÔÄô/Ó˜!úm«‰1lÛQ?PK 8A7íÞ8 (org/hsqldb/cmdline/SqlFile$QuitNow.class}‘ËN1†ÿrq¸ :^‹$ÂÐdÔ-Æ j‚!&ý( ÔÔ6´ƒ>à¸ð\û,.-^V@ÿ9§ùþœÓž÷¯×7‡¨¤‘ÀjI¬YYwwP$ð4U,äUšIqÝ9! ç¹¶: E„|L“¥j÷éó#Ÿ"XІL×ö *]©þPxÿÆ¿½ïs&¨ßñ3ÆiËpGL°è˜à ¾ìÞ…¡ÏC1ð{‘bbÐj‰¶ìS‚í…ÖFà" ×E%+e[ÕùŽÚå˜Eò‘ÀùÏÜŽTµy¨5Õ¦ãl÷•”üT)©òõÙ#ÇëVËó»cÇ, ivCKp@šViÏ³ï˜ææã±ltÅTSÇMÌ6w_@š{Äža…¼_hÓ@13?Ðñ?¦`oML`ÃRßPK 8AÏ?k+>M*org/hsqldb/cmdline/SqlFile$Recursion.classRmoÒP~.Z ÛØ`8ÞÜTÜ€©Ó鸰ÈHHHhÜBüÄ b—®d¼ì‹?À¿ãºÄfŸýQÆs/aÉLh“ç¹O{ιÏ=÷üþóý€mì a3ˆ'x*cU†D[ž+XÒÏmñBAœóK Î; ’œ_)Hq~­ ÍyWÆ©Z«WM£3 ;͠ÖlÛ”­öph ÖëýAOû8<·º'Zç¬k™¶¡éçVÕ´ŒÌ¿´ƒ§VeðŠ‚rµÑ¬”¼´šèfãX§Uæè þ®B«÷³–ö_´­17“ËæfN’Êý®Aû‰ÜƆ½lý´}ÑÖ¬¶ÝÓôÑÀ´{…ÜÌЦmŽöbwT©åލ‡ºÙ³Û£ñ€6õfù¥Ø±Ü¬Ý©¤Š=>+ζï~AÅ}~Ù«*öPQdÈÌ’©âÞªxŒu–±¢"Î!Á!É!Å!†ùÛîè;VߦƒD³¹)ç“S£3¢n$þïagºCbŽ w5þö–…Ò e”&].Ź[€8îrÂå¤Ë)—Ӝà Þ#Ê”À€á!©1‚ØWxnàý"t€Z“qcîÁ#¢BHùoðÝ@šyx×yP^zÉX~3u ÿ¥ØAY(ÈNª}&üùôRkIö^C¹B@ˆ $DHÕ'Äœó~!„ËB, ±¤ û’ô:4a-ÉAHoùÌé-¿ƒ½%;XÔ[Šƒˆ~v麟ØËÓ©dOÂ3ÄJ‰¿PK 8A¿º4U^)org/hsqldb/cmdline/SqlFile$RowError.class•‘ÍNÂ@Çÿ Å ­("£5U¯£AH0œD{4)tkÖ-l«øZ ‰À'ñ<·@"0q󵿙Ùùø~{p‚\Vˆa5k:Ò:2¦O%s¸M¥Ïõ v§ò9kY½nø`õ¹M{úK‚taöx¥ñ9½dçwŠµÓ˜Zo,@‡êxäÅM3œydCͼ¤n–•µ©ü¨ÒÉÒþ+Hé`ˆÈ Æ'se¢)mL Ã!¢cЍ@Bi ëØ@äPK 8A&]`¦È-org/hsqldb/cmdline/SqlFile$SharedFields.class…RmK[1~Òjo{w§Ö—©Ý¦ÝtS«pa°OŠ_вÁÆwô[zohSs“z“ ûYû ‚‚?À5vRaݦc<çœääÉsrrûãêÀ¼QE#ÀÓ%4jðÌÃs+šÖæÆZÙQß¾êÔä¹tNd–0TûY'm­>ôù9홊ý‚H4z—R†VG¼ Ów)C'Uü‘h³–È®ænX†·îîÝ…Šënœ¸Bêîîý•}â¨ä<- ÑüŸÀݸG³Nœæ™’ZxÁÎ1§B'6qÙ¯Š¤‰?ÓiG‚ç¾"AïÃìý;HОÔÒí3,m>ȰuÄ0Ñ6™ˆ°ˆu†úXö;n{$=ÂcLE¨{˜Ã|€W hOÎÔ¡Tb=éñBd‡R(ߘè¯ð=u£h+n­ pf¬øS§Omb(ozI_€&ý‡*ý˜ ÍBøñÑÈ’TPoÉ+a†°þ['9çÌœ% A ²$7 à†6C š’†ÅëMr nî ÷ÞPÜ—ª]ìf-ÖªµÖ´j«R!**nÅî­mÕnZµµZ[[»ØVEù?ß9çÜ%¹,¿ßÿý¼/$³<3óÌÌ3Ï<ó<3s&ßÿè‘Çc§Ø!¡™z±>ÆÔKô±†r¿>Î`[õR¡·ô úD¡—ú$ý“œÉ&%OøD®OºOèÓ„>]è' }†Ðg }–Ðg ½\èB÷ ½’ëU&›¤WÙg.œy@q²É ôS€ñTTp*8]èó9í8Sèg ½ÁB_‘ÐÃ_"ô³á× })ü:¡× ½ÁeB_.ô6Â9GèçÂoz³Ð[lúJø«„Þ¿]èðW } üµB?~§Ð×Á_gƒÐ7šÊõó¹@{/zð.¡w ½A"å&ø½BßÌõ°ÉÖê[¸¾¹#&ëÔûе(œ×û¹¾Íd=Ž “¯'Mv£>Ï ±@h;2"º©;…~! q}—It±Ð/áú¥&‹‚ºQ‡¦— ýrà»BèW ý*ä¿ñkà|Œëךl§^Èup®çúÇ‘ç\ÿ$ýSˆÜ`¨7êŸFògÌüçõj¡‘Ï ýóðo„ó87Áù¢¡ïÖoú—¸~‹É>¥Yè·¢¯[„~Òo‡ó®ß!ô¯¢W[¿Sè_C}w!2Äõ¯ ý&»…îüôå^8ß´ôoé÷YúýúpöýÛ\ÐdCz5’÷Zú>ý>0Ò0P=d²çõ‡Mý}¿¥?ª?çqÿz2Yžú“¦þ”þ4ן1Ù>Tùôú ן5Ù#úw‘é{hÄ÷ýJÿ¡!ôcdý ²ü°çàü ÎÏáüYžG–à¼ç—Hø~ ÿ©ÿVÉPë/ÃùÐ_Aë_Ê׸þ{øàúë(ðG“½¨oAòÍÍ7áü Þ‚ógKÿ‹þ¶ÐÿŠ õ7þÔ÷wôþýο་ªþиþ_ ~ÏdoÑPPè}àÿ¡CÈð!B!t˜Î,®ð<ÎóÉ×_D…£Q¸Ž‡#àT’›H°8·/0•żÐd‡yRŠÑ™>jC³ˆ— u,Áø8¤–R{øxÁ' üD“½«÷q^f*…zŸà“ãÎIú” ŠLáüDΧ¢4§ÆƒHoñqaŒ¹y¦YjŒO§ä'!:Ñ™ÍBæÙ¦Rêà*‡SATà~„*¯ŽjDæ>}›‡ÈÉC^qÈ+~¢§#4:ƒèÎÏDè,d©AÂÁÂ_g1ªXçlDk9_ Ôðz8 ‚/ƒ¿É+€¤Î9œŸËyçͦÒÈ[Leo5•å|%J¯B¨ N;9úKœw ôjv6çkYk*òŒw ¾Ž¸…¯|†¼Å7 ~¾àš9üô!§‹ón”í2ù&Þ‹Ðf` #´Eð­h]„èÈσӇ´(Òb´’ð~“oãm‚ÇOž|éÛá ÂÙÒ;‚Tã ¾Kð‹¿DðK½ Îå‚_ŒW ~•àW¤¸ä×`0?Þ¼–óëLå:’Rüzôæãp>©ð˜Å?É?eñø§á|†`ü³ŸÏãç‘¢ßHB‚ó›(?ÍL‚|‘äßmò›ù—8¿/ ~«àgüv´ö+pî@ÊWáÜ)ø×‡0ãCˆ]ðo Ç݈Ül÷"úMD¿Åù}ˆÜç@öþmëA ãƒï…³Oða$?´#ôˆàûѽGŒ¤.\ððŸüIøO þ4ügÿÉ~Tz%¿+ø÷(âtïûp~Àù þ#Ní'X’~ÂbòŸòçö3TÿsÎa*/ðçQý Àô"rý~…è¯ÿà¿Eð%¤¼ŒÐïü H4þœßÝ༎è‘úÉBþ&Bhü-„þ ç/pÞü¯ðÿfòwøß‘áA ñ!ô®ÉÿÍÿcòÿ’L¢Ð{&ŸÒ¢ûÑ@†ÃŒð ¡<„ò ©€(¢:eãý3¨¤0áXÛp àÂ)¢þ8%ùL¹æv!Æ"2ŽÖ{Q Äã ÄD!ʇ'1‘)fÞ4q"BS¹ð!2 Îtä9IˆBÌDݳ„˜-D9šXA ²ðÓÊ-*‘©J¬àb²ÍÅ‚þ¸ó|²§qª§ qºó‰£Å˜ormÖBZ)'‰3±`P¾³€¶Fˆ@¶PH)±À%Bœ-D-àK¬‚$ÔNþ!NbêE±¡Hnâ´å\Dš„h†ß§ÎJ!VÁo‚„T ‰"Št Ô'ÄjDÖ çç ±>)Ø)Ä:ÒJÅz`2m„s¾!."(´ç„ö`]ÈÒ ÒJ„„€&z…ØŒ8Ä•€Ö!¶ ±/¢BÄà÷£à6!âB$L 1 Äv!iN ’RËÅ!v"ë…p."6»,q±¸DˆKá_çr.®âJä¸Jˆ«…€Æ%>&ĵð¯âz ÿ¸Ÿâ“B|JˆH|‰O ñ!>+Äç„ø¼7 A4¾Iˆ/ ±¸n†ó%!nâËBÜ*ÄmB¿}Eˆ;„øªw ñ5!îB®!!¾.Ä7„¸[ˆ{Pé½B|Mû"÷!t?œ݃ßFèAÀö"º‹a!âa!Ak÷“"ÓcHœ´Lq¡'@ƒ'zÊO‹gà|ÎAÀžEY¨Qâ{ˆ~ý„%~j”ø1Idñ8?EæçÀ¨?ƒósSü‚4Y Ar|_Dô—ˆB¿†óD+ÄK4ÁÅËBüŽ-ñН ñ’~/$Žx]ˆ? ñ†ošâOâ-!þ è_„x[ˆ¿ ñ7!ÞâïBüH!_Ä¿„xWˆƒŸÿ Ô%ñœ÷…ø@ˆCB|(ÄG&Ç`ÂPàC¬ùpT8+†. *‹ ’)‰LÕÇ„©b@ª*¤ŠÉ€\1Æ@ùÙ"Œ¢Ž1Î88¥pÆÃ™ Œ‰Â(Æ$aœ€“…1E' cª0|˜&ŒéÂ8I3„IbÌ‚^TM}3fs£ÜÌŸoTÀñs£ÒÊ?˨†3‡Ô c.t š¢+ é5ó o´cÍ}‰¤µq2‰VãTxªÉ.&Ý¢§!z:R磦3àœ ØYܨ1ó›¨Úü&cœ…dë@Fô—„±H‹…±Dg £VK…Q'Œza4c™0– c…0…qŽ0ÎF“0š…Ñ"ŒVa¬Æ*a´ £]ÂX-Œ5ÂX+Œó„Ñ)ŒuÂX/Œ €¬0·S͸@Aa@NÝÂèFH›„Ñ+ŒÍ ƒÈ eƈ ý0ÒŒ¨0b f“± Nœ#\Ia c;‚ƒDFiL;Ýiê—qã"3ÿ3Æ.@.Fè„.ÒË„q¹0 ÐW ã*øWù‰CèZ ˜Hª‰q¢×#J&ΣÆÇá|è>‰ÑD‡…ñ76GŒýÜx”™ìR>ž›ù¿æã¸Yc<çIª4}jÍ8 | °§ ›ThŒgà|G…mÇø.Èãûè!dÙcü]ÿ19N¹Ÿð0~*Œç„ñ3aüÜ4~a<ø ÂxQ¿Ư„ñkÒ`c¼ ÏÆo„ñ[˜so C"xTãôêU„^ƒó{ Òýóÿu2U ¿0þˆ\oÀyTªñgaü‘·IŒ…ó7D߯ßMÖ qðaüSÿÆ»fÞ3¤íÿF9H(ã¿$Á÷à¼è Ð!„`˧ “‘‘&̦ñ‡£˜^áM)Hõ%J7ol¢0œ€°Ë€’´Üìλ4úÍ#ƒá(Íàtu‰Ps°;KAl‚,Kã õ»w6ô„“ÙùŠC£@D¸l@ ‰Y ÞHˆ¦%Q®k@ìphöd ÇØn9±Z»!ªÓYH\§Û„¼Ë 0µŸ„öJpʘ(qM™•M˜ ÁhψÙ×ì'>X˜ É1ãŽÈD˜ŠãœQk¡ª2ëÑrÅQXE. J’ì=#sY"\¼¾qMc}C{h»'xŠRaO¨’ÝèsEWëÊŽÆÖ–ö@GÃyDæú—+Ú’Sš{mI-ˆhHÿ઀Ҕà]I-H®‡“RZkýƒõ‰íÔ¸nwUnº+8Ot±†+¬òh‹‡[m»“™0êŽÄUØôc®9™$·»âS8$×°bš ÉÌe Á@2V‰% LºIx%wFBX$m­h b¹n³ÍyëëhžPU ;úiÅplC,¥&„‚¨ßÚJvo&r9°Ô•hr`^ÚÒp4 {‹BËꦦ@[ÃJbÌ,ÐŠŽæ¦ X[ëÚ@}CScs†²XûʦƎ0G*k]kÓ¨¬€¥³ŽõÀíç6® ¬lkXÖxÑÁƒ64547´t@WaÄ:+ÚW5Õ/Í„*mm«­Ãr–†æÒ$^šëÛ»7‡ú‚Îb·ž” "Þí ípÀ.D.$=rÇH×!Ø™pPÂØõ¹”œ1¡Ý‘ž¬œÝ\ÑP[O£`k}½ lXÓÐBÌD] t´yJ4c‘š£“Ä]áèR—ÝòÖ/¥A?§~iÝ©¥­­M µ-èc1õÜÖ×vÔ65¶œ è2jä è¦qˆàD}8nõÈIÚÛ’z³Îç—W¾§ÖI&* ŽìÞJâE’ëSIü ô÷—®&\´ÐƒBk8¿ë®o¥Ö/ GÃÉÅDƒòl¨b õ(¥÷RÁ“FdMH™qÌ\ë¨~ý®o#ù_~„ä~…­/©ÀIlz’ÃQìrÕ8²gÜ<Ÿ›Ôÿsý“ «.?ŠÐZ0ª,¿Oa­ÇWäØ O‘úÔÿIwS¥ hí&U*JÚŽ´3&ºX¨]sÓp'kovÖ å9óÛ8H³e®Z¾XÆRZó(\-oD¢ìé‘+2qKIùˆeV”{%<¦d^,QYT3›p3¨°3}eW¢#êxè0*F-âgŒ„'v"Ko(é‘eùñ`9`A%¢Ý±¹Ê”æ˜Iè—M¹jÓËwlÅç¿ BÒ x›k2I+ÍAZ_[”“Ó³›“Ù%G}q‹/àúï¹ÙErÎÕ“\íEaóm¶¨.¦µg/Ÿê@?‰LÒ޶=6ïv„@7çK¹ÙÃM¢G>~ô×åO77q^&&ËŸ¹þ_üð©&QÜu‡ xGÜÏ<žþì¸I7sÞÁ9UŠ’ÎÞ:¹›4„ÔvB.ÉX‡-t«vsr³—››9¿…ëÏp3̵jnnáæVnADI¶ œ_cE#×,\!2½è7ÚM9gç”É£ar…±=BDbÝTg77rýZ¢ TŸdÒÊ&ŒP²§"š–/.ŠÇS‘b¨85#é,¤r”çäë½\æèY].Öçf”‹+0ºbXZÖÕV5¡D†äKéq ¸ãú.š=áD$ˆ½“¶Pb ‚“³Ës•HÜŒ°µ×7æ^ÒÌ~®Íàæ6l}éÙ† ¤R›¹úÇ{ÂÛÃrFZ‰Í±ÁÞVII·3}–ÅÉ~õ€3ä8ÔÙ×ZkãP!ssfk[ j3M9âôãdrÒH §ªð…˜œ¤uÇÃ]Gà¬ÜRK mw&Am Œ—bKÚ­ÉÔžñ#Ù =‘•)þJG)m“4à[ÂÝ¡Èδ¢’ñ9™Ü¨¤9¯°ò‘+‹ß¿8gj{Ï@_Z[:ÚúÍyìZÙöŽ˜gŒ-Hkéýª\”ÊY}$$ùzú1«ÏMù¯5Kw&1»Êr7¦býRnÔHC9Øã™!%#5H¨½…$›ë Õ±³?äè ëë€t¿9ö}‚›°ECöôßìýhŬcðjª÷¥nÉ–¾P<ÜB0.<7Gæž’çïg+MoÝ[—ÅâóN¡¦aÓÏ‘Nu‰í)³Ñ÷a÷Š,`nÆñc\„¥ƒd”ñ7—?wÒa ö÷‡¢=M4¥.;²BÇ 9Âx›½¡èÚp´6Ó §HÈi0•R±ÌM6g£RaíiÈ4æsÅ£B:6Çcƒð²‘E‰PhkÆâ­°šœ qœÉÞ¢%u2€ÍdGÒÚÛÚ %)ÎϵbJŽ.ê '¥5ŸÊ:&Ú6އ2Õk(}KÝ]ŠŠ#hå9äyvzBVEAÆ]‹e4$YØÝŽ™W¸Zœ?÷ä^$5¯ô²XLnΖ¸Äi”ª \×Öx‚ÿød;ן¥5aawĵ:Ë\$sÚš[×4šWvtÖÔ¶µs3a›Ií5nØævsÐVÿ©þË6w¨ï Á®©¶¹Ó¼Pašß‰o²Í‹Ì]¶y±v·­}]ë±ÍKÌKI±Ù"'vµä†ôínñè'à¶y‹ùe…MœíäÎöõwú¢±¤¯+ä'³ÌyŽ;*“­~Sý–­Þ‡Û™l@žc«÷«(씵!_O,:;éÛJúýPd|Ñ„³UêKnù°=ëK/Ù¶y«y›­~C2uËJÃ0ã¦@M]Ø Ÿo䩵/¸‰V[Ÿ»S^áÛLPÛCQ_w0"w{«ŽR8»X|€Úu»úŽm~E;Ï6ï0¿ÊÍ;mókæ]ܼÀ6‡ Ô¿n~ƒZÜB”!lýýèÞv\!HH¢Q•±AT:6Í£ò_r•y·y7{mó^óB[}Ný™m~Óü7»ló>í4nmó~J1 %ÄÜCsT³µp¶w:ÍÍoÛæƒ&¼3¼¡Xuéêñö°2Wëô¤Èèk_,¢A F}1â#Ys¾ /A%‰»Fr™­ V¯8îÓ!LÙ½¶¦hy¶¹â`Øü‚m>‰ó0‰GЯ!Lʯã›û{Îcp×HÖ@–»(ªmÓß÷°Ô>çIgE}Š›çÛæÓ€§í·uK·mívíc¶Õb¶ù3’6ÚûÚÄY¹[ÕAt–ÛǶùs´çpž‡Îñhõ”ö´m¾ˆÐ3Ä£ÚÚn1iþнôv˪¦ ¶WÛgk‡ÐMSmíkDMíÓhå53 d§`vNLÏÎZï,ÅÝÉ>;ñh0âK²ø6‰ =s|«£¡DBbK‡¾$™¨5DŽßÈeÇü­m¾„N¼Œ¼’hbþÝyÅ|Õ6_Cå‹ÌßÓ R›}¶Æ1À¹X05`#®©›j›Àj\u”r£®)Ùæë(3ý(eR·–Æç¶m­ŒýGôî ˆŒ7‰[Ì?!úXöÏNïþb›oöW8ÞAÍ I܇Pþï2¶ÙÖC¡P.õw$1´'´'m󟈾ò/°CjüÚçãÚÛü¯,¿À6ßCŽ÷á|`¢ªÌmó#$ú޵¢™‡m‹WXŠFæcÍQÜW+g)ïc$üÓÃï ¼•4ùèü—µ[m]Ó^ËX\3ì+o]%hæ–”—81sÊÌ€Õ¶žK…£CÑ,³8jacÓÕnË%N:†,ÀMÛ2åÀY–­¾¬þLaËF g۾Ǘy Ä×ï *_×dr?nõ@BX6iH¾Þxl ?a[&© J/—P´Ð*²­b2̃ Ù¬#ˆµöÑdpGFÏÆPs­s·ÆÒ ³ÆÙV)¸æÄ5Öxôú¨£éb¥ENv¤J.íé6kŸÒn1&Øê±·5üu¥¥s3@D©^ù}ÛÈUúÝf«ïAǾÎ09:ƒ¸1 Fÿ¤¤,;Pb‡,±Q*±™J¶74‘šïóû–µµ6+•¡ùêœn\jPçô$¶Ûêaõ#Ûš¤í±­¬É¤<§©´‚têöP†Í*Ûšbh[Sµ»¹²-Ÿ5››mk:Íë$ÌÁK°þ¾kͰ­™ ß,të*k¶‡0s?×¶Ê‘zµUÁ-?:_©°)™ÌÙK.‹ D{2Ƥ ÏëA7i|šß=Ú½¶öí mU£Æ92G¬›rÄlõCôj.@ãË¡EÁ\ð9·ô|q¶nê¶æ¡èÉ$ltŽè)(1éÈL©r®­m¢A°N•öÇ1UÎÂÊܧž`‘%¶uXæ/`™Ó‘O[ÖØBöž5:_[ÛÖBZ‰Íƒ®ª·7¬ihk°ùÄÔÆ–e­6R¦ T{‡ÍŸFlþÑØ.sÝh mE| )Z!@ΰδ­³¨}V Ú’¿!Qi[ Ðó…ˆ—ŽÐ†ÛêÈ:rk‘m-¡WimÜZB¾u¶mÕR1]!R{e¶µ”h¡¾‰~×ikl«Þj°­e¨j¹vu®mn«Ozk©]+À=Ä=Ö9 è¹ÈÖYQLü­î“?Gf’öí·¶V¥UÛV³³·B%Z@ß{1ƒZQl%œURrâ6š¼æVÛj·È¶}Ym­±µkÿAh-7·ØÖyV'·ÖÙÖzk7#¶µÑ:ó2`[Xl+hÚVd`7ZÙü!´rhj–­Ý¬}ɶz‘°NØÚBc?ã"È¡ëɱ¨$ôÁ‰Â‰I–ñS–~D·!j¦­UÛŠœ°ÈŽz­òÓ‘ªi«¿l;`KŽÆ ”w³'2Ób([tª/× µÃV_„¤È¥ÔyKZ]0Ò= ’öí´­ -êÁ.i°O+_¬¾°¶zݼê³ü+hh§ùfœLb×|–R³§Qꌓ}ÓlíYí»¶u1YwÖ%Ö¥¶uPq÷¡­þ M›¢ýGa%ò¦‰ÏMñEb±~’4*‹üÐ=’VĦ˜cFøÂ}}¡ž0ÙB‘¾®>RØ¡%Ò¦N\&©…×½ñ*s@£G-d@Žª@ÞšÜ&ƒ…Ô²]âayüçPv‚|ý°œÈ8 j&¨hd /š ã‡$Œu94ÕßÖºÖ¶®€UËÝ»”¶úKŒÁÒc *²k\­+ÁAW{^xÉyûÒVš^ :×­–𦹲À1ªÁñX$A³ýŒáÇ0K®Eè:T Þp/Éìë1…ä¾Çý¹xŒf6P¬OÂù”E¤øØÖ  ïŽm}Z¢‰‡¨2Bó)?» ¨âlIžuËãWÇ|$ë‘ÄÎD<-à³Öçlí‡Úlëó¨çF¹ä‘€¤VçÕ£”ÛÖ0‰ŸÓH+|A{Ѷn’tÁV–» $n¾»!i^ÂÍpnªŽ$Έ!Њ •n–Õž/Eí—³Œ–uáÒ¶Å ›¶°¾q¯÷ÿMw§Yu¶ÁôÅ ÉbmXlë:t–‚…setá\*@ó®\ ,sW.¶­[°mUº¦¶iuC»¯nu[[CKG ½nECs­m}M¿ŽÏº›DÇÛµ»©(n¿ÙÖW Óî0¯QØì´ϰˆ[ûCñ 4XÒ¦Þ*¯²ÙÖW倸Çùíí¶v’6ßt¶w44ûÜÍÉ·@²IæÚ´¶ù!š!dò\Ý·È7ÛÖ¾)4›»zʈ\UinÑ:JL8ê¢R›ÜlsÈÒ÷2&p=cg‚¦y ¢õ«®hoXµº¡¥Ž}Š[_p ¹‡Ä¶cÔQ˜•›**u+ ?Éís6vhóèv[kSÃl“Lk[}C›oigŽVÝj{ˆ¡ÂÛI,…âÛCq_fm<Œ+4~·ùéSKñí4ÃH:¥ð:˜ìÚ~’!_}(ÞE²ûN°Ä×亂k¬.&¢à ·rab¾*_°§/uª ³'Y\ @‚:U’ª<ÝYn%Rås>âèq#§¼/«°SÖ\K${ã!yk¢6ÈÁCbY¢ŽDÔßè&Å%ëCAàÈÂè \A;ê_w7®'Vù6‘äÎ"'a GGÓ¶î’„PØoŒ#á`"ƒ©v¶Ç[é”*'rDÞòø™ÀÁZmSc-ͪ™ØFP×46Ђ1dþÊÖNÔ¦ÚÖ×)d}úÛÖ|ˆÞá2M›n[÷Zß´­o¡…'fn·G"+cò£›Œ¹|TU²%æsn)S[}é[+å4 f­`Gj¿‚¸ęҶÖê>Z ÕÛ #ï/>`UØöì¬o[ÚÖ^¨n1ÛÚg ÛÖCÖöõdÕ~ôòûd¦ªÆJö(ò?†„Ǿ—õœ'¡>Eæºö’ö²m=m=c[ßÁá6Û:h=kk¿Ðž·-lMYßCô—óûˆþ5üNÛO|žÖ ä%©Äåõl†B£þ!DïÔ\ùR:²ý:oÞ—ш,”Rq„Ì'ißû½¤ã>‚š…Ïýgk?p–‹Ž$ïµ…s¥ŸçóqëǶõë§° >Š‚EÈD ;–¶ÖwÊ•÷Ç\dâáÞÍÉéÄÃ.ÚúÅ(ì¢(ÚH+Ës Å+è£Byó¦O‡vKdÇš…-4ëy¹d£© ;°¢Mvƒ#ë‹õôL§ä)GH&C%Šô+ªÿŸÿ³-ìZ/:êé¶õK~»zÖoàüVê&åKÂ}‰ Û¼W{úX›;¤*ë°I°§'¥NºÓÄÜû(àôöX_hslPn†|¶wsi¶”òÑ:1лÙ7òmÒÒɃÛ† õ2œßÁyΫp^CkmŸ#«N&uŠmýžf‡õ8¯c²ü¡7°s27'ú¼±òÚ’bZZj‰e²X‡†´|ežm½)Mi‹ÈYÖ]¼œEˆ.†³YZ(c mëOd4iÿÒÞÍڂ與BÍÁ~˜ÝçÙÖ[æ=Y”2ƒÖE\üѤo[6¿a[ó6´Ò·­¿’½hýͶްø;h²Ñú‡mýÓÙÿÍ_áü˶ÞE“S¸Xá|f˜¹UFÉBü·õHé¶¶ÚNb†¥Ë[:d ¥¶ ùKq®.mj]JK¬{Ý·äWÔ¶Á“páݸ'ðaLC]cs-.+Ö7¶w4¶Ôi}ëj©hiËšZq’É©®†å8طΩ]Sh]Š“\Z­›Z[–¯©móa¹q§RÞ²º¹¡­±Žð´Òè¡m ¨*¿­at#ª·ÉéE{GÛj TCC#ežjT§ÌedÔÄSµL (Ïk;V8¡u­-„e²—âËŽL.XÝ ¦ºÚÑ3Ét/g¹çS¾ÁÍ4#êÛ×øÜÓ²„V\8J¬?JÒjý_ 7vq­÷%7âx]1q…àˆÑ„S  ƒB1Ø@ 夨¶ö{í52äÉÌ×þ ½8¶Ø6'~`ѤùÐúÈ6¯Ã&Àa)6 Ì›‡ëTJžm3 ¢¥ÊV° á;¡£XØØZrî/9ÇÄ6!Áž¯­jwSK ߀@¶“òËÃ$lÏE¸R) $ÃdŠ\dÛºTP.¶m޲ÅÞÔ^·mQӼж-„l»À¶ í"Û.†žW…ÍT{ ¾LniohëðÑ c£&ÏWN"ªÂçÑÝ­D»xÆb]f³íR)iœû4²`YáÀ¢üºv2~óëáúœ{[>çâ–mª è'vCí28“àœgò±6š½ïªm{ òŸgª- ðy5óðC³†f^µü¡„I›eÐÿæâÇ‘8gyמfÛÓå–µ}’mϰgÚö,{¶mc×R;¬}dk’£Þ©~Ͷ+P™ß®´Õ·1Ør›’oHø«è7ëÚOkºÌíjÛžcÏõÎâqº$… i£ïtCwÊÐÚ*ÓY¼¯œ£ÛcÝR™t¾HÍÈ=%ãü©+‘Ä7×Î7Ñ.±°õiŸŒ>ýW{϶OAôT8§ÉÉ2»š¸Ë¹XÛ%BÛ>ÉóáœçLÒä쳪³Ñ…É œÆiNhéÜyswÂéæöbÛ^bŸmÛµR}ðVyÛ߸哺½dEÛ\ZôP´‡ìgÊè°Ÿ1ûi%kvÂ7÷úa„㞘Ü’§ïöR4¤N=æâëžD±i/wÆwÕI«¢­þ’Õ?ÂyÎï‘»ÑÙ,Ÿ3§ÂVÿ À9´†ˆU䨯Á¶­YÚáÕy¢,)Ër‡]Œ ,Ór•×]|±Méœ ìBÌl‰E«7g! }YÞ*ð“”vÈ4N+ÝÝ1\–ˆöB­¦éßGB±!}Vˆ}툧¹S}‰ð…Rwönã±dÈÛ™Ò}]εÁÙí±x|'áYNúhJÐ8?¨˜Ú À†mcsÖÆæ¬ÝŒ‰Ú;¯º¢“¤Âö«½ N›ÝNøgmˆáž£>+ØÃGŸÚ¬`>aQgE’Òë…7Î[lc@ç¤Ê¶;ìÕ´bxÂ1ë¯îŠÑD÷GhØçàîºm¯±×’¹ÙNàøÚ¹¼– ÊN8BAZùmÝoÛ´diâK°Lõò:_dª‡DÅ‘s(lžsE±,˜Rìp!B2¥¼¹ˆíÅêþX?6Pq¿aD—]yo¯ÃÜYoÓâSŒs؊–+MBœWÌ ¥¾³þ5 mòº1ðF[}T}ŒJmð/q7[7nôãÎÔ†Á9+qþ±¡½²¢|IM9M¡9þ íK¤p2Ëẻœ¹¡œþ'üåH*d¼ºÒ?wæFòm”€9•Kd™ *dÑÊ#]”3··‘I‘ CZyùúó+6VzY¦º;¯åÔhÊ–‰Öïä8•rHôN%pËJ(&QÔ‰¥Re©qT_º:¿WÝÄòð& –PÊ,é2ÇO³þ·˜æ¥^;Ë×/ \R³éKvÁ+d7œL Çs»Kd'w.¡œKýš+[Óî+E¤zɆžJ·Í.|\ù†A'\ÆXþ‚KÊ,© ið†r§þóP —HšÉVÈѬÊA¤Ô8 “‰tÙi’šHDm'Ž,WY¾Þ¿aÃF§óø6oT7%ŸšNK›lû $Ì"§J»\Žüéá*÷’pµ’ £âøBÙùÒ2ï*w‚T˜rÎ¥œåò„l—{4¶Ë9ۅð]Î)Xfʤî :¬—\æ1ò†dÎnðo¸¨¼†o¸xÔ™&™ ´:Åsœ!¾6í!vÃ×ëÏŸN㵤|:þéKlû|¹.&'ùvœ œ.$ŒÍq«š¦lÖ+%Ô¤ôR,}ñ°£,°ín›$Ęm¡ía|£^ã;}Þ©gøfØêp¡.Ï7ƒ™ŒTŠ-\ÝÒÑV[wnÌ1ÝÙ€…Ž¿º£ ×/moâ®5×SöpÛœ€I•M«Ép´®ã< ÕêÛ¥/V6´-à YPçÜ•m­çAf®=×É´¶YúùçÕ“cÔ¶´¶t6·®¤µž*çäšñY2omª]é D#Ú״ᜆ•µõÍ-¹¯ŽúPßS•R_¥Ž¼üà}xS’åF<1#…gÆ•Ç&yr0êrSê3ÃYÇ÷ÙžWQÖwX™ÀÔ‡X4 sw(Ûð=vº-2û¤Ñ8Hc â46«áxɇ–‚¹òœ7ë„}¥³ß–soXf^ÈŒf|¯TeO{×YÑÔ‹·iÒmH7Ð}j¦'ƒyë×e’¡Ã{Ò$Ëdo—*…¬(óN¼Üu>¥.ô“é·3«î“øpG0©hÎoN©b õ!­åidç†vŽ(àÎ;ù-”Æ€sråžáójgðÜoj½ËüºóaüˆÏ„<ü£A8%“·~ àëF…áÞ–_ókš_m¤ó‹dêk¦ü^0•q¿Î/¯h¤‚È+¦Á`<*sÎÎù•[®¯n„¤#”“öTƒ—Ö] Þß/U‚=°_`“û²‰O‘‰Gƒ½¡¬EŽñ¡¬ÇØ@rÔ[n çãò•A|ºé\²-ö>±L?§”Žf–Ϭ1ýÝúÈÏÌÖd%eÖ)ÛÔ6™cÔ“DZ±Sï,2ŸóÉšéòÉ’xx;¶ºüˆÙŽó³¦Ì¢äª$;$¶ôtuc-KQjÔÇùzŸû%¹N—OSéÞQìĬoËëb‘HªÔ¸\pª/œ’Õã³ {2½&•º%´ƒ­F¥—ýQnzNm 픂4ûãyçý)=´m ˆ‡9xŸ'ñOÍ6|OÕîåsòTy¼c„¹ª&äW¦EÛƒòÌ*=«œ wQâØx4ád 4Ð 'Ú=ûŠä㨇0Z¢= }Ÿ›'{²Ö:3 ìG㱄¶à`“Œzº i Ëý|Ëvryé¶ó»u¿i‡pKa PcæcmFb ·—dz` açÎnç{þ1ýa2A`«N¾ïUQž“ãrJÍÅ£&å·™ùò³[›–—H°;´,OŒœ_ÿ³íþH /ñ¤Ž¡À×kø´›œm«åæjmS;ü;#¡ø2÷¸>h®>†´)œõMa†T¼²ˆ—yäæ…û[‘4ÿ3›[â@0 }á¨cBª„µÏy/€³,•cêIƼÛb†.’õÉyúcqâ>·ÖìÒ§ø8Ö[Lr.œkðœv“ÐV5"?ÿ¤¡ëÆËj¸»‰¯ñI}p#™3ZPÀ}^Ñ…lEˆ½ÆeÞ¢ DcRrÑÌFÑL6ãR~ÃR1%cÖa£ ²Ù}æ븃7ÂW h í½Ø ö*v#/AZx§J¾‘̘p`ÃÆÜŸ7ÛŽBäqô„òìÊ'^ åû/½ánïµ>È6HnL%©:òÌ}éÃ{©/#a/%Ðr^©LËÝÌCž#¨RÚýžÐÒòÜßàóÔ£Ú¦È@‚¨^$ëvzépÌø¬áÉ“ãmŸ‘Í›œë%‡´èáao 8&ƒT‘Ž¢[æ|LÐt¥²\ó³žé $ä%jîËpåG&ÑH9ª%ð¼dî"¹¿a·’±¦Ø`(^„|´z3í½sÊk/ Ê×”pÁЮ)€÷àJG¤_ÓÀ–$ ºc‘D$´ B€ÄÖp?@>gSuÔã )=Ëád¹£ì #²-ÎñŒm™·)æ 8'ç0ºh93alõ«‡ú¯Ê¨÷Pe ' oEbršÊÒÑX4”Œ¹ÊøŒ„xˆ HGÓC;°)¾ÚqJACóFœuÇÜ­O/¦º8 „œ¯wŠM²Q>Çê Is+˜TÍçüOTsï ­Ì5ÉÜ3M’ý=áD·£}ÝŽuŸ L)]G¸¶Ž8|ßí=²WçXãÓf>™¡xs0”Ï7ÿÿ{fb”µP4ª¡EýŽ*Këi hÔ] Òò-K5&b‘ chHiL/®#Ðç¦gQ¸Â‰XÀS)ÌpšukÏ®Lè=Rmf2œ~ Dïö†#¥d¨®La4¾K¾?ÀS$¡y¶B=ŒÉ‡d¸Ìa®ðš4ˆ¶9/mt§Üöjp–p2 £½Y èÔžNi–Nå‚qÀ‚jŽýÂŽ»_´Rë[é¬EÔ€ì7o&fØÚY+iÆyGv ¯¬m¨ (² s_á'”¯_ ‚“ßè(8ïÄ”ôpàœ0±6,MÐ|³ñÁ`8¹ ÓvŒ¤¤{JãNu Û‰>R+»r¡µNÞáËè"G© µª×#¹Ödù zÔ(U¢÷î²§úŒóâÙj¿šÃÑMø°vW:Wª1nó ä\\%^ƒ31Æ©‡S3ºÈz–Šç¶¬HŸê'](IãÎ|i¦­ppâ¹³æ*“+Ž(bR/!—Ä9'ÝÖ£ «è¤²`ˆæëäR…GIî÷Ç]NÈ_ÖÚFn¬²òã°þ܇\ ¨ËòäÙEcÐ<öž$䄲­um»Ì%ÇK®|ÀRjëVà½;ç}äL&Ëk\FEE1µS¦­]!å¶ÙŸÁ¢&`<é²¼Ñïm`:¹Ü;÷PES§çÁ0î‘‘YDÊ •›4y×M™RÞòg;—-HoІGï÷¤S°ÆS­8`Ÿ×¢‹<€³!)—±j$33{_ºªì0Ì8²_pv(ß ²ä¶™·bOr蛄²ÛLlÎÊ:ÙÙ›ufWWøîF†ÜŠÑÜWá0)¶5bq÷Zn› eNXª ññžsk’©¡Ü,' Œ'by`" 1 ûÞ„Œ„æà–X|MÈ=êÈJ G3RŠÝ¶9ïÉzðD‹ êÁÍî@N;\H4–èôŒÊ2à(™uÎ-鄳–¤ž›µ¥L&+¡1º‰Ö®–ÿ¥"°nÝä1iu.ÅÁ†÷Š:Õø_Vxä…kd ÆçP37É?ÈÐåœ(¸ª„ ¦î˜xb™£©rÑ-v¿qÉm}iP†%1ïè¦Ã¨”ŽºàÙÑN¥ß9w5ôòFZ×82ÆSRÆç2“¥Néê´«åû»˜úÙz5Jÿ6╞®®k„œÕ)àšEÒÌœž²X ߤ^+†: Zgš&îß8H›&Î l¶KK÷€hBÊÐÈ:9Z —ïD‹|r8kÝápZéh<’Ê€«‚.(MG]qÞ‡K:/ÌA¯Hk¥¶C{Ç*‘»Û¸*-®4•ÊF|%éÐzuR*ÉØÊ`OÓ–Š\6`]îw†Äâ\ÄMéclVgc-ÎÄèÁ¿c pÞcÀÀˆÈ?òí£Ñ ÷ck`¬ûT#ÍTÂŽ8èÀö 0¾œ+ð*ž¼ˆt»Ÿ¿”¤2É«OÄoÛÒõ°‹Í8…j ?+êì²õ.äEG÷C’ # ˜Éήñ¸)ƒá,‰ãG¢‰á˜ëÖˆ(2aGÐŽD•èF\Ž]™Î%¤à”)c²xÛ‘ðãR0÷áÁvyF@f˜Ù!æ8|bÒ-5Nl™öF)Kcm@0tĤB›Œ;G¨Ð•N:åa¦æòªT×@Û?.g—ƒjÉy@šMW¸7¥^7Ê\‚SS’ò9Ø ”[ÔËŒîó†ÎÒh%c©ûÓØú“¯ÖÉ]†n¼P ÷ä )'%˜˜px¬Ü¤ j‘¼JC ñjRŒÜµ¼›ø<œ¨÷†“`¶„sÖ4`)êF(Ä¥Nˈåj•¢ã¬ÿ­-¼Æ½¶iÜ]]yâ/„œ«»î\šqîóbà ¼::ÅÝÈŸÆI yø¥º¹Ù½3!¼cpü y« H}W'Ù%÷ôÊ25ÿŒÓ;Д'cîpf›ŠÞY@˜³f:3¢ê8ϱ]ÛHŽHjµî 'Ü—ÈmS)iOÈ}„ôsΤåÐê9Ðï,vÀΊHS ßiñÊ |QܘIéân¾ ããýÝôͦôjRJ”v.°\ÍÀ)P–1bî9$U³YZ¸.Fä5ÏŒ>ËQvðaÈÒ 8ÃËXE'zÓ?{3c3sÅRIèBƒ–ý·¡xÚÁ©¡Î*.m^<ú ½Æ»Å!2¼€îjaNíEòž¯¶lï“‹”!—ÇeöUÂdE%²Ìöì­âŒ‡x²ÿ8q~8º=†Å³roåâòœÛ¡ÔY/ÚMm•¯˜“:BRÛÏî&v¡ÃGÝá¨k>”€wFòM‰kg~&úúä«¶RÌD²)–ÌØŽ—É{Xë]›)‹_›«ÔY‡riäŒèˆ÷ºü9šÛ3õp¢µ÷´#CYVnÀ:Éš·?š–!rdò›ð&÷‘ò#S5uKkÁÈ™—OU§LílámÈëdüÑ0°kí:‘ N(”žÐ&O½.H¡¾0LºÑ+¨+H$Ûº(3¶\4i‚Sƒ£Øm”o°Êµ&®R0±ºÈî•r¹l´I˜²ð¼÷ÿyYœÞâ%„}‰^çea7¾)èœGJ¸v¾ÊaÆÊ[纳6 {uΊå·Ú„§'çÒb¤r“RçnÏÕ9Sʨ‘ú”Çû«eÐ_š°Qž}ÿ¹‚rì?NwÄE [‚ñà N|Hè:—ð—¼1ïï‡=é0þX`Gz£C.8©(”ºúPwš',ÎÎAŽõ9zp$q³€MSîÏž1v3ñ\!…&©»Õ›™¢~ pF½…~¿¬Þ*÷¹þí®ÿõòM<þ&ý;Õ¯Iø]2ž‡×„¤ÿuõäx2HÆï!üðïuÓ¿©~Kú÷¹é÷«H›þm×Ðõ÷JßÄ«BÒvý‡Üò»þ#²7-¥ÿ¨úõëq™v€~Ÿpó=éúO¹þÓ®ÿŒëÇõºþ³®ÿ]×ÿžëßõàú?tý¹þ]ÿ'êOe{ŸS&ýŸ»þ/\ÿy×Áõ_tý_ºþ¯\ÿ×®ÿ×ÿ­ë¿äú/»þï\ÿ×Õõ_sýß»þ\ÿu×ÿ£ë¿áúoºþŸ\ÿ-×ÿ³ëÿÅõßvý¿ºþßÔwRtÿ;Åÿ‘ÏÃÆ’ïÞ%ú¸|—oPüß鸚¤øäxN“ ï{®ÿ¾K×ÔCÒÿPýHú‡…J_Ñò¤Ÿ¯©Ò×\_wÓ¹ƒxJßþ$<­#ã¶V ýB7_‘›¯ØÍ7&Ý^¶Šâ%ñŠ•å&iã2à (^š?…âã3â§S|BF|6Å'¦ç§VFñIñ(>9#>…â'jSe½>ן¦M—þIÚ ™g¦ÛþY#ðη|ÞŠt»ò¶PÜŸ‡1¼Š?p…w’$þ9åçR|^Füäâ‰x£ÂçQìTí4¦h§SìT¦0ŒÚ„å!–×TyV>Äòw3®15ÿ^JR´ù`–wˆ•r팳©ºt¨+g:cù?ô?ÈÔ™V¢?Ìx»™óBv³Jÿfìcæ0³2òÚylmFND‹íÇXAg~Ia{§ZRÔÞ©•·wê%cÚ;yII{§(ÛÞY¬—Œ#——”’+JÆ“k”L ×,™H®URÖÞ\õøâüùj©:å¶«ªT=¥Fs+ÚÏ&u³ŠýûØä2m›²ø0›šÇž` ÁŠÊ}Ìw+Ó‡Øbÿ0›v3OMŸ®ÊV•iíûØIé>䯅n\¥*C‡¯ò{›áÕ𛹗Í"ð¬g™í/™M‘!6qª•†Xø¤{åʽr{YE èO#ËßK”õàUYðê|N|n >/«Q'øäg™á/9/Ó©éœF°ÓdŽÓñrÌÏBsÏx–™D´3ór•ÆSC°‰g"^Ž…é‹RÀÅià’ðì4°6\šÖ¥€õi`C ¸, \ž®HýD¦s¼„seÂA¶ÒŸ ‘n¢ŒCìôfêm‹Ã"£2es à’ë½xkõVx¥$ͪ½5¶¥×N°v™£â–Õ^®5^®æªƒl?[ÛY5ÌΣC¬ª…š¸N“M¬¢©U½­Ѳ5NË ó‡¼Cy‡YsþçòoË¿ƒuºR`;}6™ÆµšÖ …±ÃlÓ)NÂABÈg¬ì}æ;Ì4¦ #›]ô»|ÚÌiÿaOsmÁÉ3¦f,_â Ì”ga9Õ°H[L²bi,Ë—b‰û+•a¶á)ç–£’¼ºXf=ÛÍ:Ž`øvÂ_Y•?Ì6æÊ[ëæ a…5©Š(s~ç~è¬fT-÷° É;¢UÍýî=¬§j BÃlÓ)x#ŠL`*õu)5›tm]0E ùu‡Q_*AK'P|DcêÝÆ´RcÐð 峬 ÚÃz‡Ùæ!VèF¨q]%ajLåd%«%ãX^›~˜dr¾.ëË#¯aD5ËÜj^$˜ ÿÓDŸ2}˜m¡¾oí¬f‘½Lõ¾o?‹’‹ícý³mùi‘ßÃÙdÉ€ (S‡Ùv©¶— ‚M÷²¥ÚnüûÙNBvá^v‘¿¸|/Û5ÄJk8 ÈKÊøT€˜ŒÚu!µöbé_Ã.u{7“©‡ À%K-Wi+ÐM¢.cDàFŠ#2º›‡7Ýî^îRõ4¥7Æ4ªTÊÖ_æ´éƉÀU4ÞUr¨/Ox†úDIÞT«Q I°<ú‘ƒ­§“ô¬¤ìáFÚݕ¶—`´P’\­ªå¶Ðl¼b/»Ò¦`(òAGŠì :1›V+J#B‘9Çfjâh2Z7[ÎÁ -¿#d¥-n¥{©J0|?­cWùK®ÞË®ñ—|l/»ÖOUîr„…®ƒsýöñ=ì%ŸT´±ìSûØ Ä–ûYggɧ‡ÙgTy±Ï"æ¯ÜË>ç¯ÚË>ï¯~–íg7v–|a˜ÝD“¨z/ûbš’§b0—25«¡¬`MΙ,8Q°IvDkÕVº]¨rEÁ„TsvËÕ¨ 7§kÊgJ!WimnÉqD8EJ9Ø7ßÉ@iíZ‡›£„0·î?ˆþ€›¾Z[ã¦/vë.' _Úêoé,ùò0»ÕîYp›†]鯍,oL1…×j繌9É­«ÐiÍ핳¯ä1Y§£«k²ëRùEC§‘ÿMÊx‡Âf_UX3­ïw*¤KH¯)ô-ÕYîY†ÿΨþýlˆ¦â×›)ö ¹[a-Õ.’Sª=$5j™Z’ÜÇî¹™MÚÃî-S÷±oîcߺ™ÙUeêÃì>Z†ÿ€ê¼_a·²‰Ä¹8KMœ=ÞBëзÓ˜Äø!fsm½ï}–÷!óqmEN£È·»)çùZ %ƳK»?ƒ0PÎà‘rÞž™³‹~»µ7g;|ͤÓY•ŽvuJQS/óäÙƒîšGjï^êð~¶‹ÂðTzeZþÃ]–î¢Æòí E©é¾À¡Ü¬uÃZÓðŒ¬Ó6¥Ù™Î䤇$' ³‡I„>Ò‰”a¶/{”B:íyl{±=ì©Òûؼ»Ùz’'!!íŒÈSN¾§÷±gÜò×îcßqƒ×ìc¤‘~ÖÔÂò]©¡?~Í0ûüG÷±ïS£~@ÁëÈ0€XÂ`nˆYM2Py`ˆÍl>B–¨>PE‚Lgw‘HzŒºý{\ú¥ù.ùßc¿d¯ÿ {Uúß%ÈwS”ö1kÌì*>žE/§% ÷CVDªÃfrat"ø[ì]Š…=ó„]M,€å Ö!³úús•9Ýúá+j¢Nÿˆ˜ãÇŽô¹}ì'$Äš¼æ7˯R•ãY‰õ™$”æÊek;“ŸÉÎ’¾ÓØÆÅJZ¥¬Fr˜l!ùm«Ë•qj&ö9$ëªÝÆ4å~ =Wò³’}ìçÍ{Ø/ª\ŠRœ˜Ôéžo©F>šš˜®4=w3Q+M¹?U÷x¦š‡X‰ÓÙI\‹p­ïlúMñè‹Ô†¨s[ÒO-¶©%/dµä…Ñ-‘­ÐªîßÏ^$…å—’w~u Õœ"–ï6ç›LÍÉjGjÂ4p¤sÝ9—–UM•®¬ª¬ôdUsUþ>öëbÿml\•+³,Âß@ú þ›%ˆl–ˆ•ì©&ÙÃfàï$8Ý·ûIU($¶ù¼ºH¡Õò‹ðÒn6†¼— BËãKÄÙTõïV£ÑúèZ{%¯¡kïU²öö±×Ê´gÉZToó—iÃì÷žƒìDŠ”©4N(S)ç†Ùë2ùC‡o‘7Zª)W™ö {“¦^™æ'ìO{Ù›^®íHúéÝ΢ôsþ¾†~è×O¿A‚]àþ‚—l ýNÛÏÞ¢ù³‘¿pbo{&, ž##þr@FÈX+ÓJö²çdtû«#,Ç8åþæb‘ š¯—iD˜ŸÊf¾³›•—êüv6Ý‘C'øK =ö°¿gË‘R]ÜÎ:HDüc-9ÿ¬áJ(ãYm˜ý‹¨+†˜¿ÆÈèß$ãk8ÙÅ5¦ô­‹ü2ë@™qÀ_ÆË„¢õŸ¡VÊvüwè#iǽ¼—½ç4l­W×ûCUåL"•úƒ¡Š%ìÐÐG<»[…:}úðÏ#¨4¢ŠÿMwltÇÙ/ßÃ>º™´Ÿîtym,V0›¢8» ÃJÞ¡Ï«ÑÁuÕþ=J>÷ÌÎÏcÇ$‰rô2}Ÿ¢º«óYƒ”Sdæ¤N)ÚCŠNùž§ŠtòÌ¢ j,õ¥ˆpP§RÂrÇÍX¸Þê$»B1 zºF÷§šmQsG6M%I"@FåþÛ­[šÊn7½(Po®‘ŠÈ~x]y‰üEC¬*,ãc•b»i*'PǸ|ÎÓæí•ØÈ@Wæ ›…n<•w̲¼„²jôýÊøNê ú4ï(C0]"aHû«ãGÉenîŒ!-S&ÖÈQ*«þ2ñ,”ïS&a1B"s„œF—ç/":ŸpM¥NNö6*”ÒÚ›r‚ºÈU*W¸¡‡•)¿r‡ ¯râäÝJ¯LRNÜ­l$TS3wô(»Oa^Þ!e! D™F¹À$Ó‰lÁÑ*´ÿ¤ƒîVã¢É»Ù,B8ä¹sXŒâBÿƒ^°eGì«ôzÁ¦½Ôüß®²¬€ÔUÊ.åjåZö®r½òå׿“dû-Ê­Ò¿S¹ ~Þ¹yykÙ»yy¡¼­®Ÿ øÖ¼>é'òà3“-ËÛKKo#‹Jû¼ôoR¯<¦<-ýƒÊËÒUy_úæåÃÏÓó¦JzÞuÒÿDÞYžðæŸCzá•>á•>á…¼Ò'¼Ò'¼Ò'¼ðWú„Wú„W–Þ¯‘M¼ð>ð’/ñÂ^øÀ xÉ—xá/|àEyàý—R"ñÂ^øÀK¾Ä xá/|à%_â…¼ðå ¯:O)^é^é^øÀ+}Â+}Â+} x¥Ox¥Oxeyà=4[à…¼ð—|‰>ðÂ^øÀK¾Ä xá/Ê›êÚ:RcáGPú†~"™5ë´oÂ×OÔ}ð=*);;NζG‚ 0®%ɛƱ‘‚’²)á‡ÙäP÷X,,(+œ|ˆÕ(‡Ù fŒÌ@¡®mÇFÆà!VÀµ ’*4)oï1“\1é11¯ð0iá£Ê³£–7ÿËòf&%0»”yç!’àÚ…¤¥N £â=VL&Æ ¶(yfNB‡¢M\»ˆk»xÞìv&%rT.>2µð}6“°^ü!ǵK(^”WRðË#Ø¥vÁ<Èåõ\»â0;y$æ+™.Ô3è'³~ut.>2á>L*ö¨Œù©Œÿ£µýŸEÇFgT33‚áŒ9¸v '¸ Ãt„dgÓéŒÿ2;o†/J6Û*€CÌâÚÕÖÙÊìé¾JÔ>ŠgzA±ÂìÙ ÿ'C¡‘ŒÆ²¬Ô<üõ0Ç1¶)9†’îrÌ*Wõ&“J™éšTH€Ý³uŸ2«¥ÚÑÒa›µL¾Ç©ú.i^1†zpî×%÷Ï£±íôAœ¬Ž©òÙÎaÀX¥Ç΂ö+l|¼,÷” (¿ •?u²ñ2´gá˜*³0 +UPéjG~@©Q÷(s<#J'ÌÇ©¤MÃLVæÂrz–­¦"óÜ"{”“³óßìQæ—2Náƒ¬Ø 8ÔãʳÀCÊ©„–”©ÓÈÂUVóÊjé²ùC0ÇŸ|³Dç‚ÚS‘ꔕD€fË:ýd™+§+óktgPÔ'äN‘óïT†­eÆÚé–ÛúÅ ý òIÐ~èÇ={”3Ž—âgfR¼L'ƒÃC"ÇÑíñYn sM.ÌØ~é2ÇJ0~uG”ÍŸÏ©þ³Ñq¯ó=0ÅÜÎ*«ó«‹ìSègaKu¦ý‹\ê|¾_YLª™‘pž#Gц•%5‚Oq-‡2±NŽø”jÇö–@J¹£:¥ŽZ„íÒ‚Ò‰Ï.)3z±;ؘ;~gÑï)ÈKìQ;$7‰-¶eøt.”áŠFÙRe"Ë(s*EÛ•ºc²:©÷Ʋå+ ÃʲC©1÷+Ë;÷++è·±³ÌP‡÷<2}ˆáƇ•s‡•¦³ŒTlâ¾æ}Äæ>¥µÌ<ÈV!´’°¹&´I&4Ù‚5–S{›«l b™5¬´¨±Qn|f¹”+8@æêùó­üùö1:wYÔŸ~+Ù¯ttÒˆ­F’²æÀem5ærAYœË£ÒAè”H³õNšÁˆ¯°Š,ÒŸÒ#eŸÒ9VY— Ôïd“Ë ¸œ×c÷SïœÈ°²[e5…e…Ùe…àÖ yw²u¾UVHÓHîy!¹¸7•b#e£›’ªÿ|Ô_èšdZY!E‹+pü_à4ç!% 9-J1}©½›)+*+БQ¹`ˆŒ×T,˜š ÅeÅÎä@y2k 3¢¿¬XNîRk7›”k* ± G×ClfM3TÝ°Ç äpg@0xÀ+œ¹ä$ô8¨&?¤„<)Ã,µM]«n$é¶Q HßV›ÕÍÊ*é_IñëÕÔÉ¿Q½Iú›Õ«%ü;ú4ý¥KŸ®o„/ãq¥CÆÉwtͼuleÙ‡l Vþª©ÅØTÕüµkIÍ›Vš¿‚BÊøÒüFE4R–1‚ÉCìtr§NµÆM1K±³•<RQ2Õ´¬™ï1Û,s˜D°%夣5^ëi¦2vÓ„jËŸbúáÚõ8ê;j}D÷º›Ô_'µ„1PDŒÀÕP°—VsFf>ÌŠ€†– Ò/J¬ÂCl*Á&Ìœv¶Üoõ‘[¶†´ÐÃLaEG,*Ãg@ ºHêY Yñ1ò’Kz£öý(°Ž'¿êæ—-›Aº¥N6–9va@\  ŽB‚}‚”·OG&¤ÔÁéÂ/’öé_ŸÒnp·Ã—H8c~yTt›‘µÒÊ Ð©VBð&BÖácEÖîö§½S¨‰ÃÌ`S+>˜˜‘4­IU6We-’›Ü ¸GéõWa Ñ¥4­ñlör@HžQM²îVZy_aåY2,WÏѲ QŠ$õN* y%¥¢V¦BׯR´žáþcÓ+ø!ù‹³7:JeÁ“䯠߃ŽcV;J¦}-ùÝ”~éÓ7¹JçA¹»ÏÄ8ò·PþK%ÔÀE¹>¢.üÅh¨¦ËÓ&n#ýâ" VÁFGqµ~Cþ ³H¿*Þ6¬l)ÓY”ÒN?´Â¿+[ÈØ°9€<›);s%þ•¾›åSQ¾Üw¤ì¸¥ô¹'j{”hjW§ï!%&· •þÊÔ±Ê6y¾0Á¸ V¢âå‰<|ØÍj˜‰…:ÐÞ>èe@îƒn—î ··ùÔ©ûîm ae‡WüfZùT0ÇíØ|÷A0þƒŽÊJUË›l³°Œ¨«†ùogUeZ¾QÊŒNôŽ,Jî÷êÚ«ìôc;[Y†¶ ýD˜¤ìÖp*ã©sÐÔ½I˜‹Ò„Ùu4Â\œ&Ì%G#Ì¥Ç$Ì%G&Ì¥N§¸‹¹FÈfÈc¢šÛÙ|Bø^*o…$"ÎŽßs´Lа¸†–|õšÙX;ÄÎØ£\&qxG\'8dçeb¬r9 q'ca™póM¾½èYRœxJ!ºÂ°ŠÔç”Ëïu„H‹+N‘rOñRb»™1V¹rˆéc•«ºãâ c Ó0»‰e)‡¤·]}TÝp¯rMjŸñc “ª¢ÀEEåÚQSTVôøüâüùcJÇ”ßÁ|eE¥cN©))+,+]”O>¬| —!Ç(C‡Wf<¬Ü@õ©ó‹K‹ËŠV>­°¯Û’TZü°ò™<&K|gŽÅeviñCÊçœûW‚—Ùòñód‡ÄŸO):)¨ðaåFÜS˜âdù‚«ã¦î*PÏ£fMA¾lJÁãw@©,••>¬Ü”ÇžP¾H–\«¬÷Uÿÿ×Þ›À×UTãgîòî[ó^ÞÍMz³´Iºç%]Ò’ÀëK)t¡¨„UDQv°¢XQÄMÅîøPÛ”¾¤¶6‚˜ª‚¢ Ê¢"*®ýJÛ´ùŸsfî}÷e))Kñóùý¡/gîÌ™™3gö™sÎ Ã"n‚/idLjô`Y±8ít³¡›8ÃXÖFèÚÝ´Šþ°Uw?Q…Áëé2ZO—á:|IÖ*µr•Z¥VÁ©Õ§V®RA©èv:¿×ý¸Z\-ç,7–_ïwÐ5C,ø‚âÆ¸V¢ŸJ'Ø7R—wÙåºHØ9Ô™ˆyk‚R¯®Å+ÆCUʤ«û']%“®êv+»yüX˽¹–œëx\¨¡ñcDpüˆa9Öó€À#v{s¦ÌwªOQï§ wX ÿ¶xÃ;)¡…j˜Ä®]‹]»År¬;pòuMÑ)6Ò‘”ngº¦c©Ž©lÜân-¹LòûNïÄ þ&’G)âBÙ¹¬Aó͇xN¢û¸ûÄ]þð-oQmÑ"ž‚lñíNñ•Øâä⮨ð'£»I®C\ÊÒ<.gÃ4TÐø«yqOK¤¸ï‡_sc¸MÜ•ƒ‘¸Ÿ,ªµ0×Z”JHó^;¤Èjd‘ƒy‰{Éi •î"U:U¬ïúÇ'²ts¾Clnkà1‰Fb;Å–¼èÈÁ<nºé]ßÅÜÎÜnL^ÙÑíTÛÛh…#ÓßZÔ²$°Î}Ü6ÞEÔLV<ëáe Ljm’­’ú¼*DŽå­ ƒ‚.•86¿‹z©*j¬Û™ãFƒ¥Ä.Î;ç¦FVCßø{}Wº¦jº)lºßS—ÇðJöƒ*Yj³%b‡7»P¹q»Œ¼ ,ôvzüòz ·íqbov‹ø\6žƒäÕ­¼ÄÈëòºßóz€¼Æ‘×=¯ÉË&¯±W¸Côd㼞ëÆwCmÑ*r7Mt±Âê±nvãn”7¹âÇÜ-©hç©åØèÂÒ„f×ÄUÖvñÍ¿ÖB¦ü4(!-ïÈÔŠKîmÔû159Y žô–â[TLj¸„ãtRh†<¿…NexFè] íÃé|)ôÕnÏCkCë êÙÐM¡»Å7î†<Ã?`ø_Bÿ íC¸/ÔËðîÐÉßú µÑÚ{ÂóÂ׆WŠ%á§Ã{¯Š4â„`¤Z8 ëĒض؟c…=ñpü]ñ³ð».þáøåâ׉ï&~›xž`ø<¬,y.ùƒäÃðÃ_ˆ% ÿ|8ùw‚ò|Æj†ï—Ès±rþ[g™—‘_Òÿ[ø·2ü.Ë\p‚º/ôtZÔ)T«:'[ êfÕŽ#9K’ö×ÎµÌ #û ”ýâ¬Ã˜×ÕNˆº}p4‰@HDbXæ•|]=‡naKðŸÕiÊaø1øT,<¬HšŒDE;,ª0ƒqÊÁš†üw*þSç§Ã‰j ŒÊ_D¢›¯›dËk,óËJ!éU}€Nmo“ö9zt/$Ä«Pׇ˂áÐ"<™%žc䎠Öòš±½ÿÔ¹n¿”†[ÁEJUAD:*Ž =·ži™·Éæ ¨qÿ¼£æHánºœñVArc–Oöƒêˆý4‚¨(\˜ þªÒİAÔ%:êÑÁÑZ…lMá“ø:¨Ö4tk`ô?Å2o®t†êÏPù^˼þ–¹²JÉ]Ü\iŒ®¨‡².6ã©“µJÔÀÓÙ6`jØë+ét:9¾C0wJ-5ÁäPIµúÿ° Ÿ‚m¹Fã_-œ.ý/œH¬‹Œ)ÃêæRâÃPÂcb¤»4X¸ÉÇèé‹Á[A¨ }܆*³ÆtŒ‰Ä É l´ÈÃk‡ó+‡j0ÿ‹öA•:ǤÍZæíTë ‡ýC ©; ïŽc8¸ ×.O­H$è«–ùµùè&5DTËlÇÈìAè½0JÄz¡½ì}Ý M}ªö9g™’Þá_Ũq½V”þ½¨n‡Ê*H)aQS|Ef=!¾+ ›«Í¯+‘ýÛ0ýÂy U¸’\Ø€««ÙšA'.»ZB:8¡ 0žÎW¦·„0ÃŽ¡m‚8«d‡cö*Ü÷=YU³¼ g>tiÃ+üQ¯6ïJ¦c žÂ÷4IƒLa’Ð7Ì5òÚÅX‰=>†^›”â™ÙL»’œ5«ÛáöŒwFFƒ|ŒÁÇ¢4ç¥É|Œz|Œz|Œ¾&‰…Q…QÅBÉ܃ϱR¬dôé4ƒÐU—ºÑ"ݼ&ÂëVdº$ˆêF¤Ø“IÚÜo&Q¿1ŸíÐ&«ßLòÏ… Åhðšw×¼k× ¼¦Žµ×¦(i uÁÕ¦FRt=ÐÄ«&ôÙõ.NWqÕì[áÓïTˠΒצšêvßÖš™ Ù:íb65ôûàÑv/t:3TŠRzW¾V_£ãv:ŸVˆGIiÏ8Ý7’2¶6yo›p|e‹A&…™»œø&h¦Xþѧ‡»hxÐZÑíÄÙy´wÁÿ›n'Ž}þ$jÁQJ˜ïe}eKrp†›À–:ËMÑî®–´Þb;¶“Þ-n©c7gË\\Ï^Øê”ÐÁ27á–ŠXF~«l¬ÎŸÐÉôHŸ¶v¬W~j©'±|w-ÌÎ)m¦ÉÔï^¥Í3*ƒžŒ(Ó`é…û™-4B—â}ÐÔýäø\ªÆç´›¦ñÙvmšl9¨ÐДîöJ²ÒéVtçþ´@±¤‚†‚“¸ñº!¦7ä$‹éMFo²™½IŸ^ E„*ˆÆL¬",U ,Ù}$(€O«óÀ©9Æò°|Ä4¸ŽëÓàÓàFƒÛ̈Š·ˆw„ç§q^›Ö¡ÍÖ8|Ñ8+££y¡Ôì}¯Nz}dȵ‘”6Â}°\íiïðÅúîönâ¤Å±-ý,ŽI=roÕòKíïY,7Dcþ®–¨ÙWºa'ÚœùÈ8Jú85æ86æ¹ý—qÕœé›3 M—º%’wÔjÝRI¶R:ÝÊîUQäøM$娓µTV Áê7ÌäàN^”aûŒ(L)í½œÂݯ#½Ó)½nõ'ÐÚÂÜÚª;E·Jµ™ª$»çq;ZÜ¡4h;RÕ;?(µ)ѿќ|èF3ôÒÑô‰j‡eNU êrúô¼VäµShEÀ –E7q‡Í"æ¶¶@²šÅMZ‰‚•¡á5$WãS¸„±,”ƒ^ ¡„U¨–N·º›µ~•ª¶§ž­ØÆšÈ¢F©O«?žv"‹^j‹ Áª QÕø]­Ë˜¼’·¸3©fLë$lÆØ¨q…eDÕí!•dk¤Ó­éÎõ}3W•¢”J1¯P X6Xæ½f¸TQåwh§ªó½YjtkÞ-a¿º\,F‰GÅ/ázm´6Iki†gãÖ¸U[Êðlí†ê¶^Žx }Š>S”0\!†)ÿKĆÐgêïb¸B¿ ©™%fìaXßef9Ãjs$Ã1æ³Ã ÎÆïóh†³Íã~Êü²ùU '¸¿¿j¶3\k®g˜3·bÛÃð~üÞnî`x¿ùC‚ƘóÏð{¦@ðó)ó9Ä'ø~?gþáKæË ÿaö†4 'º5FCq‚æÏ0&¦cýÈzÄzB¤öâ÷Ö¿öZ †~ކ/% ÿ%†ÿ…ëöŠ%#%áKßcø¯HŠ`ô–è7¢ßi†á÷7£0|(ú0Ã3¢¿‹¥D ÃåÂaø¸žáûņˆ¥b —Ç>F0þ½xOüçŒáiñ§âO‹†½"M0!„Ã0O0¬…ëŽKm‰‰‹Ešá-‰‹71¼%qÃëE ÄÃp7<Áð÷p=ÃÅu:ºza¬e^œ,;óéjÀ¼xÖ˜!OEô¹]ÖÍU*–—Ó)2£.5.¦Û‡õÞ×zKJó2B¨_üWB÷b‡ŒdHܰ¸ÿѽÀph’Øè¨ ‹¢ðP1ØÂZi/Œg…Ó‰êèg°¤és¡__u’e^íƒÙžÉPØC±hцbÔ0¢zìÒžÂÄ®áS)ãX¤ÚL?'—îëºI;EÞ¤L—K°ô‰‚¥7•.ÝŽÌDç¤ãøš+ŠçâïV–6Cìƒql/hc/Ý}\~&°õ0Rí>mÈÔ[J}½î˜ïº†ãØÕ{A‹ ‚!¯q¤m]\D¾éÂüØSå$·)ƒ¤E,‰a¦Ó < œ×Àµü»VdðÚ€æÎðâé2:Ǧ÷BBK$›ë°gõBÆ#‰ƒ<颜†ZZæ&ÊÈfFœšºŠØMÜT#ž6Ï°Ó Ö„†‹Ky–j>®S¾LºQMvEs/]Îi 0ɽ`r.ú,jÍ}àBå° ¼–æ hŽ)Íña¥0dï™%µ¼jû iÐn«ÍåUÙ Ûk3§˜-¯‚Yžbv0èdžÔGOpáHQÑ^U¬AŠZÑ ãÐ=½ˆAïdM?´øñø·& àéïåü‹sá«•¦FHÓ ÊìÂ;d‰®iS¥*L>ôK-À–}¥Ø¾¼@!zÍÞ"õ2©ä§gñ/ÖŒþ üµÒ[С-ÃÂmd£§ëÕî›òeU­¦Àñ,+k5gÃMýÏf¥Ƭá¡ê µC« dðî`tX«´Áì&yTëi…½Ö‰÷ U4Üù×rﳞtxu¡¡ö<ÞÇ5õf¾¦=v\F$º˜ ‘ù¬­-Ékï\ ®¹ ‹PåšF³ôk‡’ SŒ’µ­£ó4^¼cž&Õk;´Óf¬C;ƒ¸ËaZLÚp,`´jÚgàèNog·L•Ka½‹±TX›/ZJAgrÐE2ï6¸ùz‡$Ansä‡<“©‘òP;%?äž'µC¤Û·S;Kj&hg«œ8¨S{·Êò©m%³TD룖´5Ø"Õ©-WØç1ö•û½’À%A[ƒ6h”Ze+ÅùHj—wBB§v¾Êÿ/)úXá%Eïá¤>ØþœvBž­zº_¦ÓÆú†òŒtiïõU!L'Ü©]Hb¥°Å ³€¾ö>OX;Éפˆ]-Q½%æÄœè¸Á8±æl|`’¤Cä¼XdûÖÏ´÷Ó–>Žlít Ž™ÖúôTÈXo\êwÑwm—ùŠp«b"×·R5®‹ƒ<¹„yr;7ä™´Ð>T0‡ÑL{Ï!™”Œ³Ù¬¤œ­Bò¤¢ââ–¸S»4ivzz$Ú‡s0Î;HùˆÒ- ‘V‘¥´ŠäÉŠ"ö2NíljFk§]°3"O[ y½±[éty÷æàãÒÇ6ír%ØÍ¹\Á¹|B梊y¥'·Þå|¨1¥ÎŸfÓgú>u§ï!¶Ìxåo§~•' KƒR*uÕ¹Ð9†gCÚÕtÕWûª‹¶òDñ ׬Æ&VhÓ­~6´k^ã‘l¿Á+AÅÁÔ¹²)ɱjÈÜ]ëÇÖ`ÇVÑñ£§& ¢¤±™,H]‹Yè7á¹ õ~?†¿‡ê^úJšRóQNl H£´è«Ü•n˜_Uj–©³¥Sên.“g°›`„¬°HºaéT™\o–Tv,>ÒÛ‚mI»ÖKà/)^ôWøþ®N2éº`³À°þ-Ãê×.púÀ¶¶E6Ã2n†V°ª\k¼\ˤÃÖ>ÊÆ&ø–B“nDÞ‘‡ÈÃR-w\y¿Â 7ZÜp#~EGvC–ž¯ ;ÚJe³˜à›¶–>ÞÝNà Ô¢§b® Ù°p§:Þ çÀõøöæëÏ÷°Ò¼É¼Õ¼ òá  ÙN2y¨‡3û`žZî }F`ôÃd¯»„6Ÿ}ÐÒÓÛÚÂÍø¶8ƒf%ƒÑñn¹·‰a¥eažZ›­Ñ‘Qk/„Æ@å~XO„ëbûá,„¸I­:‰Ÿ8j êKÐѪ‘$s¤Ý‚´ËC—HK´4r—ñrg†+ÕÖÑ“l$$‰É)þc }Ø _KÒrp¼&®î0ý}¸pN3€zxÀ-c¦µöÒ6}N è¯Ç•p&“¨#û·UWö’íŽÖб½p,µӑÍ1ùh´aÔ³GVÔ“ þ2l¶.Å8#ÆÛ©½ñ f=Ár4ß4W(ñÃÀûz§ö1i^[3sƒ#ˆ®‚gŸû#Ê>w›¯D8FêAÚÊÃ֮ϋKsAݪvh”ºƒc%nŠU: q¯ ‚:‡Û˜u‘‘!,‡y—Oà×¹\«d‚GÉ'Ñ—? |±L—ö ^EÜ ç€‚º¢Oøt·Iy¼FtšÜÉÒ¿x #,[lÎËLš“-aV¿Cú ² ý1?¿£”Kf;ÚÏï“Áü|Åu#“×>UÝÇÉ‚C`ø1oÀÍéºÚ2O¢¢îI^iò… ÷Ì7õ¸ ®z¯DÛU‰.?ÜrˆK_o9 :¦~9¦yÉå¸zÈbó[æ·å~R#mÇ8b=CŠubXTñ_±µO³zÿÂF‘ðï£>ã —, ±È7E¥ÝäÙoÊ=PÝ(Åæ 4kˆâ®k¡êÎ``FJ2, (Ð \ ×'›g” ÷O-"S‹bjÑ©Edj1L-Ö톻±+/Ãyå|ÜM¼ÈâÈ †Á^×✳‡áø}=|‚áð†aX _Âp‚daäNølÆo‚ø½:â$Çðø1<ŒáÉ4ÛÃðs†Ã¯~ Ös:²"¯†Ô’ò¦iìœlþÈÇ9®`ïèø*Ñ/ -òt„¨ûhŒ°ˆVRj¸eoïìd`ü~£ãwÌ»eË(‰%­ÆbÏà–±HdIæHðžYdÃé+²‘ÆlÔk-Úg•„v3:âz «ÜÆmísy-ŠËÄZ ú¼€–9¾@Z°,£c2"­²f/âLúKO¹5[ƒa3wT?çaS­”~ú¥Ÿñ4ÂK¾ŸÇbg›Âƒ;¸>Aè¹ÐRÀ`ô¿aræUDØ—a¸ªù²4¢‹ë[»e©­Ýº¨C»-Ê™‹Øë+K±×Êr‰áœ×¡ÝNòe÷°L‰,v“¦'°—n^EýŽýUZŽ'’ÁHVC^û÷öv¥")2´C?Õ´ ,I…7BÄIàÊ?bk_'YíJ<¢žÓ¾AË2ã Lÿš¥9cU€þ%C&¾v`âë8ñõLÝþ»±8Jy“LyTÿ”míNO#¼oJ<5Täüí$}Ýåíí¾U°¯áÓ¼lHš¿=æï0Íw3µ÷ðß{ùïw‹(×/ 4ƒA(ßìáDx[†Äëððj͉­ O{u 'îœÛáÄz,ld¬væ¸íõ6Åü›Ð;¶8­š[\×Òœ–n°Wž­lÓ¶«>–ÿf×÷Ðõgvµ{²@^Z°œ!%7Ýp‡¶ÓêÒf ¦&&a%%&¸$C–ç »©nºi¯-¶—ŸTöòKéÀ¯TJü}ÿÍÈ2MY¦•¥MYÚÝ[Ö™Rô++妸²ŽvSÊJù••tSúIêg‰¿E)‡¨MnRÇYxWèPÅé‡*MJ•¦ŒJS6XiRª4•Æ‘"ž &í²½V)Uä€A¦õyM:Üúd ':´ûfÒv¨ 4ò5Ù7Š.]¸²X@Œ›7 •5T+²a/""ÒÄ3ášÛµLÈÉ—þ3T[ ]¿kȶ@R/qCýë+Š 7í¥+SS:à?TûÜ´ßÃj5"¹3QÓË¥× Uc1UcåTcå\c_)®±˜ª± ª±Šî\á™`«4ÒJç@ŸCåèª+)ÇÊÁÚˆ«r¬¢«ºIRwÓsqÁu¦öEãVcµ±ö0¼ §ìuƆwßf¸ÍØi<€áŠß2ü©ñ3‚fÈL˜6ìaX…ß¶é0$¥B‚ÌɸlÙÃp~e¶2œeËðqó·æï1œàŸñû÷æó ÿlþ…áÿ™B:†ÄåGH™ c¡AëFëóÖ­°‡á×ñûVë+ ¿n}ƒá]Öw­mNðûø½Íêdø}«› T7Y?ÆòýÒè%hžhþ”`¨Ìú(AJ{Ãr8BGÈáE~P8BGÈá­W­¾°‰ù¤ "3l1L„“ +Ãuáñ°‡ádüžÈprx*AëÇÖ+”Ž\Žuð>8“ï=ãïv±°µÌ{hkÁú*÷Zûá"sB¤hwO[ñ ø @geÇá¤Bç)šw`Àj¢ÃΣ}Wi{~møqt?ìéõüX9Þ­ø'±vüx$²Þñ¦4˜¦È©ê=ÀÃ!ˆGª. bƒù€Iò슈-'1]ßZÝùP÷L­tB½09ˆ¾6nº®,;(…LD/Þñ}PîÉèŠl€33*p~lö.ÓÝ×L£ßmúàÖ^›”~ûÆ-f‡R™M)•Ùo b‚‘o-Hfö>Îïk³µI£P蔼Ò~´2E·=Ò^à3ÒL¶­í.2–½u7ÎíÚɲáÖ¼ö“vH7¨»q£SÌ•7môµMÄîÓ~ºÚ7ŸÊgêìê÷T•öÒÌ "Ç“5V~Q š?#ŸÚn‡â©cÉäã(g¥ ùaO­Sß&^P‹gÂÝ®=¢Ýì,@2.ß͇€/í.ŠúsO%Õ0(p»ö¨Ž+ïaŠæ_²öO] ®å™òÑ.÷ÕQÅ6írL‹V鸲خýBÐÑ|Uñ!¤îü†6ö …ÂÖ¾§ÕÀò/ËÏäÅËz§öx>”5†8¼ ‰ô Ñ=$†w¼ÓM77”ר¢¼"œWÄËË óÝHÐzÖj¨èÐ~E{·Ljo!Fæ 5k0G‚¶r`Jkb"húÊ·²%6g6C <)¶ŠßÀñ¬xA¼¬à?q2|Yü•á?Å¿ 2Þ~xYš¥ÅaC{\+ahkAÂÓj0Þo´Qµ¹Ú¥Úeˆ­v£v“' /@]¦5Ú¦Îö±¿e=Åv*q€„©®0Æõâ®ËÜZÂÓ*Ž %û Zñ~Y$¥î"®0è¹1ȉA¾7c~rhÌ •~¼ôðÄmŠ°à½–y_áX}âûÄ\&ÈéOÐÍbTù#…4•¼ êµ@ŠyJ:¤Ò ÎcUVE+VES¶Ú­ÞÕR£·ŒtF:5 Ò­vFNj…h£T½ŒÄzyAÖ‹þÖ ó­K{7€µÕ¤ÑRN*ÿà6F¸dC›îÁëûÿªíÚ38›„Úg±é•Ó Ò’i(¯=‡[TJ(õîµðEé:w-|ÊMöÀÇÝdjR^Ì`«Ë[ªjÚL×n€*ÜÅV“€Ô”µÑ[p#YUMFkoÌw“ÒÒi6™ƒ™œ}³OúÙ'wÃØöÿ½4Õx|<¯ý¡€AÃp5•1¸b¢S¾ZŒ‘MSõêç½i“Sù£]Ú ÛÄK…øN¶Zb¾H»ÕjzûãŸBžÍ»—vñûw×'½ƒ'™ü’’“Š÷WA”wëcê‹~H‘ú"O+Xã…ˆÆluá-O[û3†U«Ç<µ—ååD­XèÖÒåDka.ìï/ýâñ4Y‡Ód]÷9.K—uªÌu0¦ûµ·ZjoÍÙQnÒÅ÷ú.¨ú¨Õ=KÅ®-¨v&zÉbÕÎä0T;“ƒñƉ´Ã5¯“AõÈ ú×Á ÑÈ ÑtŽGæ~“ôöNŒò=y רç*©8d¿õÆÝ0Ev8YyLó€x1ÙšÔþF§BÈ‹¥9(£€ôKé8]nr©¬d Ñ!Uz¡#í 8òîÙ©\½ÿ‡nÊM«Ç®÷ç‰ûcë`~w¨VX?€ûýÚ •Fëh°µW \9%Æ&1Ö“Ó»´¿ûo¶ö¹FF¼ò\á–âdñé‚`Ù¿ˆ©¥NU³wÏøïBË©ZClúgÍ‘S1V¬‡޳UÓÚ¡žS@FTMJÕ²Ÿ·ëÒöÐXDÁ2]\Íý“§§« –Û%¥ïç¿ÿçgÿxCú ZûÉ ˜[ ~ÚPt1]Úûåô—­½JéÊ”R¬ü¼AL,¤f^Šd›H¶1$ÝJJ]:›ÖyÜL#MÛ ÝK”T8ÕÓ¸mí󈳵ývª›±Åqÿ¤¸”dõÈÓãï ü¯îÇÊÓã5óŸRÀâWKþW÷ç?¸BãùüáòŸxxð1dÞö¤‘´±Š}ÆZ­²8í  Ã¥»—®’Ä¿œ’50?X‹²Uh}Ôœ•ûFÕ´6лöle~*zªZ”­ò×0·S0­å¨2YmDõÀóµäRjãr„tk0Óån ‘=ðNZþ¬†:þô–˜6É<麉¾‹Hnë`ë"¯kUÒRb×äúnð(©r«%בKQR­·Ô88†!%gÈ!)Þ€ƒvÏrãè‹«–¬V¶˜š”£tXáÝÈñp¨ó¿+À¡\ß':t½P,šz Cþ¨ã„q¢ <ãO0o"Ù `dƒ6ÖA¼C7p*&ygÝ$Ó\”Û ó@hÀ<ê7ŒÁy` Íß Î¡ó@¨ß<0ç±Ý9¸:;®¦ãd:¾_¦0Ó &Ÿñ2ß/Ó‰˜éÄnw\÷+àp‰8_ïÑŸ×_ä·‹Fã`¥ñc rgÃ'q]›7~ÉðIã)†Ï6^Áp„f ¿_1cÍ”™fø3óæ°‡!©ƒ R”‹Ÿ€ù0L0tLìQ‚ñùñÅñÓ0Á+Y£ðà ¯Œ_ÍðñOÇ?‡áïÅïÏÅ¿ÅðÞøf†'ÄçR:rœ¸æ :ì„È'ÙBb+Iä'yJSéÒt¼u‹8ÑkH¸mptB!‹og“æ†HëV¶RÙV2†U5\t¶ÚÔÉHB>³T=ì¸"—ìA±jõ2ŸýzãâN¾KØ×_§øˆ¾¾6#c¸ UJËé5£ÅÉ'€!ØúبÃH£ˆŸÒ*^•LV­ ¤…’HÑKª‡ŽÏG£ÁDQ }P90ËÜ~I¼ƒå‚&*cŽÅɈá&ƒéTqݤßXy®¤ó’²6Ëœ_ºŽ¿Ô2¯:Ï“-b„‘|Î]ÃüwßP~uÆ7’LA»Ñ•N¼k ÍåY*~ƒ”R?Òß(Ü™ôH(EÖtß@ÓåÊ.^Gìß«Æ=ÇÀãcP ¦ BïUuC'Q%7NHÅëNÂô lðõ¦ ¤#èöç —Éx˜»’pœƒŽUoGmï…ÊЈE#ß8E¯¿ºEbÐÑw˜3šœF¿‘øÞ¾T‚©æM!Çz³È©ÿßâNÙ›BNÅI¥ÿ€ó’0æ¼…3Þ^ïƒ$i ¿ÎI ×°Š©{ÁŒÄ#Ç8‹”µqý1}"z¿JÚùa(øVàäÓ‰,%oîÉëÈWÚðEë+öQ6 Új ½™ g©·!†FR×€%€%¬Zæ(‘ïñS<ôž@qr£îEIÝäEÍï™;”2ÄiA*åKJãUêÞÙôšÒh[m¶u áÍÂ7VŒéÕº®cz;ýôšé)T„n¥­“ê‰õêô’þÕ+óbf!ºZjI$hæ÷=-y6A7JÏ6Ü×yR}zÔ×ë„뤉++*Çn0¶è³ªÚ8›\ÕÒøÕ‚bý˜ôø<Ôæg—“Ž¥WŸqú¤²JŸ’Þ ãˆ~OüÒUšÈõ­%ùƒ~1F>Û6ðÅåBD~–Lâé ù¼[A¤BΈèª†½pÁ˜¢Gdw™ÝŠ-;I5ẪYƒ2¦ÚÓïÐK<Ÿ50‹·bVõàÈ@:›ú,÷ ‚*ìz˜#SʃyB6k‹Ð–S2#$f©òS(&j7 f/TˆÒÚqõEeúy¿*ÓVÒíCxí % ½£=Mj5yï]í…9°•ŠÉ“Mž™XÕ.VÌ®ù:dé³F$ßàæË…D —¬Kܺy•Þ—ë{›²À~24‹óÕ£°6hÍ®{únò#Ù 1Lj¢¢<`þPµú5Ô˜Þ(›E…ÄÐg2yÝnS¿;£ž¡¯ô0×ûå`Kҽ㫗qÁ¥ðŒî„gèEqJ^B"Ûs⬌|<|ÅbÐ/¹–áE¬'¡Ëô>Gk@7»®ò|Æh`¨WÈBdóõ,ºZ–O9Q‰vb¾WŒ¼0Ís›|w"¡&UK‡ü–p›wH]¡ˆ!;Ò%Ÿ´ ka…Œs-§TUC©ª†RÏo1‹s?IïÀÜí_écýë¦CÝßÑÓ²¡AîïBNê÷w©~÷G”м?Š8)¾?¢ÌÝ‘_¿û# Ü¥ëþN]»ù÷x^)¦ ER|— ÜãÉLuWVHe8÷w¦÷¯6#kêl]¿û»ˆS:øýUã¡®êJû±š’÷X]ʬ¦¸e0«Kû³Z¶¿àÔZÎöUµªûaëã xnœd_âJœ?®l`Ç•KœX=ðAêñ,ΟP ¥À’pm6Q]6HBŽJ¨œ*ç„j‹rTB”PE·[Ö½Wµß„ŸÀÏÄù¦kÖšã`ÃI8€3'0œdNa8Ücž„áOÅï“Ì“žj¾“ o–™gá÷ùæEæ‡àUøý!óà ¯2¯a¸Ê¼Ùü2†lÇï/›·2l7¿Îð,óÝ”Ž²T¸ N¨êƒ¯½õAQبj~ îDº/e”VóAç©ÊÙñ¼ºn‘ƒcËý’<Ä.Æo=|u©Nï葬Ü~VÆÿxVûá”^ˆ y=a½Ätˆš"kiSøtØU8vœâ³‡ÃϪbøqúŸ+ ;â€S„Ã'sðŠ{ Žì\@ÃG“G¨öAe¨4>{<ü,ƒ¥ÁÓÅô¡štQ4uœx8ü8œhÁf9íHgXöú2¬8¬hý{ÃáÄÐ!^½Æëd:8ö8ÖÊnä!‘‡|ÀÒVF>»èpi ~Ép(<D&w›?–[=ýwÈa w¾Ïgv­;£7Ûúx¬’ ªYÕíÍàê czw}¦c’´ôY‡m“xË›¥™-z¹¸A¾¥›jX£šÓ³\Äû¯¦à† Ê“XºÊĕڦ&27®Ioîê&ÚTÔ"edf\ŸÀ&×$zõ w7í ­ÓF5ÍþIÅDÏ^†Ø Œ]ÅîŒ2OîF.Ÿ]í¥4«É°õ¦¥6)€7y0¼)oj¯yÏp úLñë¢Âá̈˜äƒ>o´»ÐÚK5aþÔ7t6)Ð <¡ZR|q;Kñ!c“¡²(›H%…3âK¥ 4A-ÿX`Æ¢Pæ`N½‘œ´Oå4ˆ­¤@N?3–ƒ°È`uNÆ}ôf§>=k`–¥®!-bvéG‘½=CšÄįzK[¦SoÍëGo‡o Èò‹,)ù!r‘¤¤~ ™œÜ®g ·‹\£Ø &†Ìà¼g³šÕÇÖ0›òAc˜Ñ¦ -L"©ïód3¯ðP"¼B  knU´—VkgõÁùÊvïz)Ÿ±Š®xÌG¨gýœ§éÐàẠçKLÙíYO÷F«°9ZóQü=fþB1ð‡È¾(ú+A3ãÍ3dKÉ-²a™ñìì'µíóÛ;ŧ”’ÅnˆtÀy¾=ÑwŠShZkÊë3›xÛÔ$£±ªèZH#H¬%[ŒtV ÏD¦è³èÏlA–l2ócÐŽ=„ß©µ‚áa¡ðH7=€Ñ!VK‹žyñõ.qÇÒ6£QYõ$¸XÔOÃçàXÉ´…nÛ®†;.Å;æànè@<‚ßÃï¸á÷`'Ã;1äN¿? ñ^È0Û« ¦ùæÐ…†L˜ÂøÅçâ0Ã³ÈæÜ4ËüåbËœXæÄ•"œŠþzF¢yƒ݇­äáê1s¶ªÜZìô°íJ©ã©¬¼ü\ êú,ªÄ Vâ¢&BÈëDzþÊ,›^ª;Ç“5¸Ò¬ÁFá°F¹&VĨl¨fɰ0†…»±ž¨ªqÙpA^Ÿ£˜Þ 3p[Éphs΃ù k1d 3+^ÀÉ9 /À.Bp †,ñ™~hP<ƒ,ù,óåÄÂUdTuèsŽ1úsN˜›¿Rœû=½×ŒaOfÈâ®Ü°¸'ì Ëvg퀕89²±Q}n·ƒ+4\ÕÕ5¹;sE^?±­%´Žé„–·˜¹¾§9h-”˸óø3¯ŸD 4î†$]~¸F§>? énìÔOÎZMyÑ+Ù–lŽ ›©­oVdhW‘5ÎG(°SaÙh!vLÆŽcìx·íÆÒ…!…«èëáã° nBü–ù&¸™á—°o\!«!ÏðnÄ#܉þ»àØñ’…«Ýð†À£ WcÈN¿²¾Hûï¹›2þ½o‘ONŽ­LÎçÞUí=ˆaI‹cóO,¾î—Èmd9s±ªõØ èWûþ ¿«ü׿êï|l¤ôwRÃ8G8XÞD d†7<º†”J3žê¯S00«ÆÈXÁƨπ0Y™rŽ˜Oš¿ Ü ’šáÌÒ °3¼@,Ü¡/À)m!æ3ï¾¶Ùkh*Ëè5y}Q®ï/T# ”Ø17Ó n¬šùòz:C™ûé`(Kníü^öíȧhÝUðÊ/ÖO0[­¨EEù­ù;Õ{nB?²vƒ_ä%²dyÖT…Âa$“×Omk1°TMÝ1¸Tm¢B¹f^_BVÞ°ÉVÐèÏ®|£ÈÂhb6\Œñ±¢+Jöö!QhÁAç¤àBZ•À\† a1Ã4†œÉƒÍypâ$ëmd‘àepÃ31äLŸ¡wB”Ž€B<.ßÎÿžB^ .òìÍs>¶ñ #ª«pàH’Á%d+¯Èßo³ó!@ðóóµ£É´¨‚ž6ŸQ ´• Ä”J©6ÛÄX`,6l=ªà/$õÖŒ~wàòÓ­Q`šÏzÂ{¥)ÖÉ4Ågi\—ª¸¢BªâŠ+¥*®HJU\qŠTÅ×"<ˆÐ–*¹b±Ü¸ 2ºGiŽ–WÌâ `]1MÒ+H‚{«x/ã Žåu"ˆs¸¿˜¬¢+È|s á(.;-Y­ULæjq Âw#üBŒ+nVy7Jžˆ3%OÎUÖc[%oÄûâ„,b’G¢Jª‹ñð|[çf[_Š¿Óðw:þÎÀß2ü½ mø;gáïlü½çàï\ü-Çßyø;lN“ÌÊ ü½ïÅß…ø{þ.Âßûñ÷ü}ãïü}—nöoø>Œ«ÏʼhÃhaÙ9êö‹¸>à?­è ‘Ÿ3Wø¢R6`ßo+½DºæžÚ$HÑ*ïàOõo¼?B7ÞÚ*e”nÓ ´úe¾”ÉTÏTDF*p.÷qZ}œ<¼BYx¶Á í íT-8ð†ê£ÆèÑãïXGÌß›Pa¡’!8ºa7˜bsƒ­_iëWuéWÛú5¶~-;®³õ²c¥­Œ×ÛúÇÑÑ¥¢ÀPL'Qóy?éGÑ‹ö‹÷4,Ðg¥¦Ì®I³ÖgüjùVKÜ(TçõÚfi› œÖNµ¤co¨îÒ?¹ ×÷X!ƪÎñ©aƨ1–ß2;×wn¦PÜפT«æÔ©S÷Ñ^Áü£ù‚*ÍX4WÞ¦ÍÒfk-FC•AØwé7¦ÞµFU™Ëg§R-F¹|Vu‹OÍ!0+YÄœÝP£§¬ƒp*œÜ ¶¡°7@YC5c|º",¨ô²*Tƒ^•3ÉKM5:£KÿÌ-XDÄê¾±Pˆ˜¡Yá/ÌX€ß›/ª\¬¦ÜE $’A,Á…^†æ¢pfB>µ8F“b”ÇÐ&š«8óFÚê9¸æ[îçŠSØMÁ¬5²‚MüÛk^Íü“ß‘ÎA^Òy¦Ô&“1¥q‰*Ù oR¶õÏzíž e-ïIï| 7Û 8B_ï7u}½^•,z²ý%¬191Ÿ$Ï,áU˜EV?¼’Ôó¦ÛúÍymüf­%䄼Ò…(N+V‹‘xÈ¥¬,,9z¯ Ýœ± W¿úä1df!=dÍ2ŠÊÁ£%THP2y¥´ÓH«4—12fææòõ}Šáö•ª_‹iõ»*$šXrY®ï^ÉšÏU³×_»›ŠšÀˆñ;;×ÉëQï•ÛÒX¹Ž§BRæj(ò¥{ KŸ02Nór €g¤…ùgOü§y,ÎÐÇØëÈÊPÁŽÈô ‘ìvD/2ïÑ)E§þyùMѽÇcvµ„ø]m'´ÞÅoigÃúèEù"Îj•¨þEß„?“Ÿ§—qÌõêEœÝJ"…?¶ë_¢fé1îœ`#5{àÄ⦶NñYùírC»Z,½%ì„kËü„›³×dþ˜Ívñ  “ҿȆvè_n#d‡:'ÐoÉb»˜C[——Û\«SD»¥»C¿µhIýWÏ_{Òì³^PáðûàØ,=x"<ë¿dÁ2”×o#“ÉlгIQ6¤š¯¸õÏ胛ìÔo_¤Äÿ ‰Q'Xßw#=^oä·x°émqã¶þUþªr£»ûÖËo¨åà•l4×÷òúÏQ#é5r[æÔîÄT 5Z¹¾÷Öjy .¾î#8 ò9Ïó#$vb¬‡¤“’T­XçE¹ÃâÆu'Åçz†ÚÖ\>lO¸¥ôˆý®v(5Ü$§¶œ ‡rÿ$iKîÄ:õoUI§„%J¹)Á^,MÈ&öZ†í¦³enÙ.²Sî”;ÎØâ–9åÍÙ ·Bž²«éy÷Ø÷r$÷¼Dj…l/’Î+˜Î±ô¼uÛRévq ›( “9i×@}­íôpD©ÁOzrKù¡š×vK©ééë§Ræ¹^Y»,õÚˆ‡%h96ÐE”ßx×Ü.¾Bo”×pDq»÷D:¼¸zK™÷8¸ã:ê݆\wòY`¶Ü-ï!‹eÄÕ¾g²Õªìâ6¿µNô)‘Ühqdñ"¸§Ô7Ø®o¤BEtŒ°]ß$¥„Ê©ñÔS ¾3u£ÒjJ…SA/‰Gu§‚Œ¡D½ÃÏ ¯ŒÐ[\·<[éVîj©b;NÕ˜íV:ÕÍÙ·»!=( ã°ôo’}Ò [Ïåõ»–¹n Ãnä2ëëßï–ïrÜ; NA•ÕLLrDÕ#‰"ò-:7²4зÙp¤é[gDU°ª+ûJ]¶N²ä^Õʉ{üæQ­(ô–:§Ž4Ê©£f1Êk£RÇæõï.[UG;¢‰l½ÈŽÙ1"Kêø'ôÀü¹ÕsLõ;ļ6ï¬Ø­?äaq§XãŽñ$"SÒÖ^«yÔnÌÁ¬ì8Iùf¿CÀ„#ˆ_s{Ä;=úæ*úFÑ7ú5éó,¨ØúeBEIÍŽsƵÓBÎ õ~C ¢[IJT¿ó6%á* ¸c%U÷R:S‚¹HÛ75Ùñb÷qÇw»c;ô|H½a•×;ÉðPýn²‰ÐÅ6Ân}^ßNfˆê=ËLìÁ"ý‹\ýžÏ¸¹¹:h –[o/²ô–‰z 1öä5ž™i$Ï̬Áià÷E8Hß.~¢‰gdê;ÈRFUax­`¶ÍÀUŠ´\8±Š¹S5âQ^#æT°ý’4pFd'fþ©<óOõfþPμ_N÷²‚Rø¿? æÿ 4¤w5ÒP­–‘Uã±Üé$ÚaNaè4¥Ñ›¯§:Sy¾žÚ¾þ¾?_çúÎ[5Nè-zK“›bºÅYvª;uWK³Þ2Í™æ4o€Sݩδæìt§ÑqÖÁˆú®¶†½ÛÁutãr>SþA·[î4®j$ àfœ¦UMSÌ´CÌŽE#»KÓ—®š†¥ø.¥²Ê ©8^8=M§Éé~œœ`#®HˆšüªÉ¥&¿f•ƒÛ¼4×÷œÓäfpè­P >€_N“JQ'® Ç}Š;Ò™ÚŒ5TéL†ìÇ$¦Ò¯™¤Â1 =…¥<¨ bŒ¸ë€üüýÚ€l^.¶ë?Ô!§=Æ¡Ìÿ5P)?šø#Ád;ú†¦ë½c§²Â¾ù ²8¨Ë )PmýG4-© µQàRœÎDF)=ôcò£gL±îÒw+ª«²ÍŠY?V :Ì­¹¹SÿI7ŽðÄ ¼6/l™r*µ]ÿ)&+T9RèÛõ‡È÷^?³Ÿ©Ì(<_3u:Î|âTyÖF^àF™NÆꀞ˜HZÉS2%ÄYéK‹¡â„Cb=¢°j:ôŸû+ñG½}K!N¡Š#3¤¯tè¿P¡÷d'¹“x×3Ré—ýŠÄ­x’| 3J+ ä·­?ž×¦d§ÈÄ‘5ö˜ß×EûîKh$²4¯ÿúú*ëËup}ñé7ÝØê›óúo©¼_ÿ]»Wˆ§U! È1DÊš¼ØT*Ž`«¦Š\ï#î¶™ÊæòÖB™*í3d ïe*£|q–pêVûÒÕPéÄ¿l OÚ&‘Ó`ç()!£"V|ñWn_Ov*ÎöîÜ+ºc{àxwLneü):ÙŠ&¤à\æÔ91w²;5¯?KžëÔŸƒw-‰9žp¸þBÊës¨ªÚ‘Vù«Àÿx!žÚý• âŸÛ7Þ@"Þ¶ëÏ“ˆ÷º˜Ë0ŒeB襸2¦ÀßüP1W‚³“Ñvú£?;‰lÆ·ÞÓ¡¿–wÌŠèŸèvu,dë/J‚±9ãÙ  éÔ1 19ì´œ‰<Þÿ‰Þ  æšÍ4`Vð¡lbs€'Ó&*8§’Ýàý%ï¹O7ÛˆŸVïáùTWawL^,¦Z™Jk¹FZ*¼¬ž»Ì¢\¦–þä;îXŒ’çe[án«âîÑÄÝ£ß w[Üm•Üm}«¹ÛÚ€Yw~=Üm=wÝ–nŠ_NñOÅõ3qô„î1Ý”Z9!¡ÿXòÏ"t³ÝNÝjø[ßqñ&îi‡:ZÄýe5¸HÓ_ÕWï‹9ÄÜÑ=p·;šQ6!ÊßÊèJnÎÎ@ÇL¢cæ@:f³˜Ž%‡IG¢ÃœwF7­Ñ^!ù„ÏÁ…ÙTÁòU‡þR1õ$mh_À&°ôæ`vv¶Š:UE˜=vè¨ÇúQÝÙÝ[à8Mb ä΄• Oç‹Ï‹ÛÄWa¥yNèöP;ì ýÇ:ÕZ O0¼V†Ã-áEáEáS Z·…¿þ<Á°Ãÿ©‹Œ=‘–ÈY‘s~:ò…È—ae¼*ž‰O‚¶ø§â_‹ÚßJü2ñkýI†ПB¼ %wÂÂÈ‘Ÿ3üEä _ˆ¼ÊptÁèĉGø[1}Â'Hø Ÿ á#dü­Ldž’õ]ŒOð >AÂGˆø÷L¾/ù¡ä°‡áJÜ_‘¼ŠáÊäõ ?•ìN>{R³SïM]DåM^êÆmoOêáÔ/ÑŸàoñû—©_1ümêi†Ï—Ö”ÖžÒ;J,ÝxÝ©û)^º>=>Ý„°)=™a6}lz.¹éyCKפq?þvú»ém·¥;>Þ~áÃéŸ3ܘ¾“ðìiöÑö ±D|ÞÎØ+ðûû2ûJ±Ä^a¿—¾åÑpõeðDZ zxݳiË|ÙòšÏô-RYò¥JwèPÍ2ÿbÉ7?ߎ.qŠ$º<*‰„ ¨L¹ùeEü«0𤑬Áæ_Á‹0þ“ˆ Òdý°Ì þ›g™·b™ó—Yæç*ÉfGj°Xl¥€ÏÊ[£æcœXzBý(³Òê…J‘ì…:‹Œª$´T±²È!’QR kɢѰ#h^ +¡b¸qXÄÔc"?€ñÇ*Co¯ŸþRàò§´Ò±û N2ùe‡GÀ„C¿³j÷VÓ Õ‚ÄÄ´}P« ^ ;-!…gW!‚ðKGo³¦öA)+Œ=õo I³Óûw‡ç‹ÿn¡\4±îM&Ãɰ¹HHáªòtø}•y0îMÎU° ͆q¶bKþ‹à?%†÷Öæê—#&ô˼Ÿ_ÝG¿õ当ÿ} ÿ©òåˆ ÕÇjãßÊ|VÔøé—·83ÃÏ Ó(%%½Pn™ïÃŽI½ñ-ÎGþ¿YæG¥.+¾Å†Š2TóÏÿ…Œ¼ÅEF‚ $úû¿¶Ò0œ°iÌ-½^œr²%`ÙM9ÿ[n:íÀ‰X$÷R©8RT_‚”×G6WR ÓhÆþ ?‘³¯…£Ž|öФÁ#Þ®ü=}ë}´X6píƒ+ß?k/ÔW ÉÑU%%£¨ï7F {¼Eà–9“öƒfýÖõ<€ª’äé˜÷ȱô:ϑΛà+‚Ä—tÆ:eLâ¸ÿo–ÚÆ=âä#—=oœ¹µ%OáÒ¤#79ižù;n’ÿÑK›©Òzâˆ÷6:˜x›š[ÉÛ•±þvel¼]¬ÕØ á>5èœ&Þº9­Uçì¿g,äÇÝGº¸oKaÿu€„NÍÂåúø#ÕÀTö˜-èádþS,Ž|þ†Ÿ¿Eç„%T Gf¯äÛ‡_Ê{&KDù1ºÜû¹lÍ~;à oOám*plÆ–Ãy­áÈowÁöRSÔ^8Ø+EÿŠíª©´¨¦2©ÐTF$N*ú%‹¨eÀw°E–T‚&·ZÔ¨9Ð|Ð:k”燣¾ò-i5’¶ýÐaNgíƒùÖµŠ#òB½9Öxœ0jå#i ×/…>¸(þõžDû³â8^‹”+ñ¼ o|ø˜oí)‡DÐAŒ(90L€62ѱ"!ÒF`dÝ^ˆì‡¹¾ñÄ SFõAó`Äï‡S|kŽ…’Œ!FÌæAeðåEi{O¬%k 3«ªÌšï[K¦ðúú/F9Vh•´;ÒiTt#ÎÎðB}¶Nª6ˆF½ÅlpBdÎpŒÔyë¡Á{7‚M&âcyê¼d> V ÷ñ2ôÄ@èñ2ôDôž²*³RŽIß2(SDÎ2Š¢'rX(Ø1äxH¤9¦u5³*$þ7èi¬Á½“c~ù4¤(wðq^µ4îªYK#vAÃÈp©ëì¢$ŒJ¶ôA®ª‚ºQca³u©kÊ*íHÉ.ßM*ø°áƒšÊñ“ð÷*”uÞçÕ94*[) 8íîÐlë4ª»©H¶QCTCÀJ´øo!MòÞRòßD‘Ú2ÆH¥-³%wDÐVKH„4ß Jˆ÷ÈïmØ®}VÀ‚ŒÔj<£Ãeɵãvíf¸ûËl7jÉa¢£Ž!oÈÙ.~G둈-ž¦=žx†4Y¶‹gt‰ç ÓÝæü¤)>]{i§ÒC@I˼§°`VHGgññ oU¼PÿÂéÜ©c…t>òC¾yÑ‹)*©>âF=+r&”W—1zAC†Æp€‘a{ïÀ°¥%µ?²ÁÆûÖä«^˜µiþAUÏRuø0+“:./ÎÆ Bf3fù5Ïj 1VÍ …ûky};m>ŒAŒ® ÅÊ‚ãF(äÅù íå®WI-hÈã6.jÚÕb°dgÌšs:R ûýÀ†ž Óø¬`>Ⱦfão&þNSnÜ^lt$-èœ tN”ÎZt6H§ƒÎŒtF3Ôñ«—±)å•™¢âŒƒˆ²êÕÊõxþ“Ò5Ç‹(ý·B¯"ZÈ …%Gµz,$AûK©;ÍE;ŒFì,Mdª-„Ì›·RXîI¶19oLÉÑ&ë\ZqÏë4¦fÃnx7L&c~~7o–êV´’çQÃ5¦©^®ÏÅZ9§Í wÂûh1Þ”7¦KÓ*I×d{5ÆQ¹¾—ÉvcÞhÁ%9‚VÚÑÁ…q4²‰W˜-×´X£¦vÖ wŠ¥ÝÙHÛÌâz©;ÓàZ¶q OiãN17od· n‡u°·XitÝ%–0|Ùð <¡ÿ]èzÀgì² 8ÎÛ_3{ï+„Sâ\€“-³&»È`¡F¦5Ó™,wº!Ñ  Ã"QzɹWpŽƒ„ò‚`ŽeΜgEÇ€m–yáAªvË|!ó›C&盟|‚v¤¡è0ÛÎ|¿íÌ(j;óÝvæË¶3ŸÛÎÌ7¿í¼Ë0.«¦«à†²új@Ñç(•–ËÕÉZ(ÁýÑ~Ç5áP‰7KêÑ ›¿a‹Íyã8Ï ÃV8ˆ]Æñ[áfÛ˜ÓÚVq¥mœ@8ŒÖH; éËqu¾W¶ñŽ¥]úžNcîVãDÛ˜×%ÎÝ wÛÆIä·ùì¸Ð6N&‡Va§°c¤m,`G­m,dÇÛXĎɶ±˜ØïNeÇI¶±„Æ;mc)û\m§qÊËlãtv`W>ƒSmc#;¶ñ.v$m£qÛ8“†mœÅŽ„mœÍŽÛx7GÒ6Î!‡þÛ8—óºÝ6–³ãW¶qãì°óç¶qGOï0Vàøòž­ðkß… Î_ÛÚ‰ÚIž½SüœWüy|‡6'ð9©C›ø¬ìЪ¼ÏÇ))ãòÓ6Þ‹ub²-,Öû˜®{Š{ÆEJqÏx¿¤¶Â; \G·Š+:Œ²c}‡q1;®ï0.aÇUâvL´ÙÆ¥æ÷·é6$°ºmã#KóÆe[õŸcK9Å6.ÇËV»Â6®D÷ Û¸Š ÔUc˜tÂòb&™Wo…ËRÖN³MOÕžÞf¤"§·™©Y§·…R+Oo³RÑÓÛ©Äém©P*~úVŒZo…£ z ÏX¼UÛ‰QÑi.Ƙ¡Åm&þB©Èâ6ËZŒñ¢‹)^ ñºCß7®A<9´é/ú2ƒ_[µûSŽ´§ÝÊ%½–[öu¸àµ.m³Ø¶•K1 Ûøô»z~AÄ6> j7 ˆÙÆ'`µ¬B€MìS°ÝˆÛ⧤lã3Jmã&iÛø,Û6nFPfŸC¢nÛB¡M×Zq—ý½ ¬Äqb¿øÁáBí`ú^›_À°“!¢ï›Ïƒ&NCøE„i„_BX‚ðˤ,„ðš+ÞŠ[˜ ¼ ¢ÆWÞ~\¥~L¨"ÒŠüPK 8A&MTûè'+org/hsqldb/cmdline/SqlTool$BadCmdline.classuO½NAþæà¸x Ò+ MÄfkcÁa‰r­Y¹ ®Ywåö4¼‡OBEBáð t>ˆaN›ù~2óå›õïêÀ5:1jH"EhZ^ZšL^;;tOh¦ÎúRÚ2“æC…?OëÕÈ}mmuyK¨]ö2B=u¹Jp€8 áÂSñâg&“·Üh«ÄÃÌ<:gÎû2Ow!ÞÉÐZU¤Fz¯<¡ó*?¥0ÒNÅÝ|¢ÞKîE8ý?gø%€ÐE!cƒU€ˆªnŒ‡ÌÚŒ•^-A àï¤Å³ZÐÄ1â-PK 8AºƒTóF1org/hsqldb/cmdline/SqlTool$PrivateException.classuO±JAœw^îð¼hLÄÊÂBMq`k°9-"Bôú5·œ+ë®Ù]C>Ä b ?Àÿ±_lÄæÍ¼a3ïýsñའ+ÈS¬§Ø$t¼tJèJ:¯¬¹žèœÐ.­ñA˜P ý([Oƒ×ùs¼ $eT8!lí_܉©(´0M1 N™æø "Ä¥­eŽUd)º„¾uMqë'º¾)Æ÷µVF£‰¾²Vï]:5AžÍÆò!p:·ù+åCc¤+µð^zBï'ô—içÿì"â‡Â6b´Þ"¤Ì°ìɸƬËZĘö_@sàû¦ÃséˆÐƲ/PK 8ARéq M1org/hsqldb/cmdline/SqlTool$SqlToolException.classuMKÃ@†ßíWlH?4¶VSA°¦BÀ«â¥zˆz«öÛ¥FÖÍFéÏñ/x‚Á‹’q¶-V¨.ì;»3Ã;óñõò `›&r°óÈbÙ$©èoÕ@Í€ÃPV<Ñá± #yé3°S†B+’* dÒ Ä=ÏÚïgŸêm‡!χá$I Ï; e˜1Tç7ÁCà‰@ö½v‡²àïv2­¨ÇuÝŸÆõaЍ[°PЯ’–u Í(î{×j zW^÷¶'Bɽö@\D‘؞Ɠa—ß%䞦™OY¾”Ä2¾NÆ×+øF|£‚or ;áÍ ÞÁæ{‹‚oUp·‚oSðí ÞÉ´{¸ÙË«ïàÑ]<º›Caˆµz'ÃÞ%ã»yÿ÷°ëß+ãûd|?Ã?ÀÀ2ðC<ý°ö²>»ïSp?;䣼ü1~8á^üs¾Ç‰÷âAöÐ'´zŸ‚ŸbúOó$¥àgü, þ9n>/ãý €©?¤à¸ÿ"7rsˆ9ïâÑ07‡¹9ÂÍCܤ¹áæ(7Çd|˜|\Æ/Éø pBÁ“ ~™ùŠ‚_Uðk ~]Áo(xÊ IöÅi„bÿ­áMÑhxõΠ1˜E#jg$bÄÚÃx܈ÆÆXh(0r0œ«}í}áPÄ@°‡£ýýF Áë‹Æú[¶Ço ÷õ¶„C½-kbã¶hl‡O`,C(ìX½¦m³oSOWûšNßj·ï–ÀP %ˆô·ø±P¤Ÿ°1cÈœ ´G#ñD ’Ø'i·¢±5ŸéOlGÀN’ ‘äñó_ëÛ´aƒouWWÏêë;7mióY( B‰¿{ý¦¶ë'-¸h‡®öI@‰%>“ BíÜ0 h%‰X“I`™­sýÆÍ›&Áí$aû†õëW·O^‘ɪíë:|ëW÷tv H>?‚¥7F˜—k× iö–ŒÛf{‚ g_Š„+ˆ°aþk{´LV2‹ &ÖDcÉ¥ä>„¹ ~~>_øàŽuÁMÞ°!2h…È„ß$ÇB‚ÂÄ1 þ±8Gœ<ÜMH2 ··e[ço‘ñ[2~›(ý¡þH ‘Œ‘¬×¼"åò©r!+˜?` ¢p-k¸!¶´ÿRñûŽŒ’2ÑÞ[Œ`bQP²’ñ»2~OÆïËøÊúBÔ[IiÊ7”0Ì4!~¯8÷ “Å}éØfrò‚—‰¬ÉÇ^ŧñ ó„Yãûw†ÃF ÜëO‘DóŠr˜7÷F’á°7ñfx7ÅŠ7Sˆ7…"[1S•Wƒ/ݸPÅßâïèôK*þÿ€ ßo\HÿT|ÿȋϪø'üÛ䌊Æ¿póW" Ê¿áßUüž!·ªøO|N…๗·Æä4©â¿ðqÿÏ«ø “¿€/ªðuøŸüÈPtk’!’ñ¬Š/±ÝJÆCùê@|;Y‡tijRñž§pÝn„U¼€£ª$:< ”¡+IªfSªæ[úzƒÍk;VµwsŒïO\Þh,¥¤S%dÂ3’Dá«J‰TA0I„"I#ƒac`áà$uSÓD*Ù‰ XáxB•;{,¸-6Tø $#}>)9ù!§øâ؃ƒF„.ç¦WõÌË” Ëø2f®í6.[Øú¤=Ü Gã¢Þ óo ryÖ³-¢BNí5å͸—âŒì\/Çw¢û@”m:7ŸŸòEZE,ØGµBY¶Q¥Ò3¢êŒe-Ï,esX_;"¡[ã¡Ûq“¶ÇØIEËÈVöÆ.?×7%Ù¬".qzcÈÙÇTöSS¾Pÿÿ@8´ŒÊýFd¥s{ñŒÃêÇCG\Yù9”ÓQˆ1ƒ ±ÈÐW7´¿œo]”‚ù>0b‰]tMÓ,÷\öª ˜á?ñåï”Û¨´jÏ< ¬ â¥Ï—Ϊ@Dä‰ù yió&G……ã/]|©æb !MÑ1&’õ.òl×T/¯ÑXÉb^d\%F}QpLºŒaí¡¸YÕËÁ@„4 ÝõSm6éÊ¿mëD¯³4eyDýŠ!"ÐØ¹Î­˜Âö„ê ôõm&ÝÍ*ÁÝ0éƒð"¡¬ cQF09‹\¼!²Ú´´lì4‚INKcãÜ&^fg†D–YyÃTñd',ºh.i¸Èûó_éƒ&Ì„#pŠÁÉoiü¡¾¾I=·ø{"ŒÐœ cT¬kð]šg׿GóïçÌ@óæÌ£ùræ?¦ùOræ?¥ùã9óŸÑüç9ó_Ðü—9ó_‘¼O9üä¤ÞÉozþBI8gà)jŸ¦Y õÈß3GDzÍ ^~ˆÐmÔoÅuÇAê>–îa°Ž€mì¾a‡A±>ŽnKãQpúÓàJƒº 랇»p] ”…i(Z‡¾”¯?%ÝMip@éIÝŠ>Ízráƒ`¡½®„21÷×Ònà=Âï©] ¶ó Ë𞱎‚,4þ‡2üÑ'ó£$%M"ù¸%òRæÏðÚ‚”Á$õ*­<¾à4‡ÝnÏ”lÌÎÊÅÌ]‘Mºdk ¬–V»Ç¾ ê®LCuY“ÝÕi¨ÑM9Ñê°´:=Nã Ü¡)çÝ¥¹Š¯HCíŠëA(a‡¡. ^ÖZsYjÒ0“L¢[5Wõæ4Ìâ‰Mì¢ÙÜ•îzÚF·iÖ4̾˜¾z8yiŽn] Y5Û1˜këv;15úÆCc»Ô‚‚•8J…]þŠbVÒlÜàÊŠá߯£ÐjfsV„Q',Šþ™‰eÎQò¡2‘ógü]„æ?($ÿ Ïe0J‰úùAóR२šODN‘¤è Ó°`ÁXxš,ôïˆW+@CFÝ…`½J†B!H$Ž ÿæ­ŸåÈÊÌ©^†ÿœ¥­ü)Ð ïÒapÁŠø‡†¡ÙÝ’†Eèãÿ=C NÝF¾G]–Z‹ð±¥ÕeiU-­¨¢^„z1ê%¨»Q/E}êÔËP/G]C½ò8,î%z•G±ÞÜxâ uc#–¸/IÃ¥û,îVKÈǶ{Àž².æ™MýB«p¿& ­û`¦8b—ÙĆ¥þn«ûró˜é¸îá-x^­ð”‡†îb×0,ÁrÅÉaX¡¦FßDhW¾,ÚJF»žÐÚX:X˜%t¯"‰IÊ£ÐÎ$sˆ¤Cp®õ8ö“¬ÎX[©Q ¤5©‰´ö('îa¥®:¹àÔż‰/uáQ¢¹ZÈ2o*,w§) a ìµb‡æ‰;0žVEAsMêÂ.½šÙØ4:¹>fBDëÄ ‚Ýz“]}mô bEÖV×Ämš¦q}ê‚…È6Š]‰l*D÷µææëSç#‚®ŒIíyMjO€ü$5/’š:¿‡6e ò"¤Î i³@ª§øÖŠòÈáQ”:9an11­Sb®`Ì"¼N`¶L´“fBÝš:÷s¢º^Xjþ”xînÓNŒÿYÂßšw—â©v)N‹Õ ™]¦ÂsߘمðÛ3aÄG÷&¢Û%™Ùk—]ãÙ~0{eT{(M—\ŠâVh­ñÔðºÀ%šBfîcUŒ&V-´jóð]!@æMafûÔKxûaŽV|¼™]>eBE]!7 «ØE«¦»ã8(õÒ ì^8}zVs ‚m£Û¸¶S›†PnÑhÇÜ„Q¯IK¯¥^«=™¢;©.îe¸÷¤VGK^½†• =Ìb€#œ¦„R*n­( ÑýY¹<®ýPÜx‚-ùÉ,ÐÉsÛÍ÷@uÆÂ¦…ZÑix/Ѥà.“â>x ú¬}ÌÚ•eͳÞü ê2ŸœzºG2Jºo%ý4ùDbîxVU=“™¡Z“=Õ»«ñ8 v7 s.„?5z†Ù— öû (ƒ…~+‹2ÛL:y²3«z5E®ÉÞåZ±VnåÜ3L{»ØNfr)wƒÛ$ø28ôší›¹i¶kl6ƒf·Í<4{ÝØ¬”f¯›•i%§@ÕJÌ2Â-¢lÞ‰s­ôTj¥´x`líÙµòcð&„0[Hi†7gÜJ w ¤á-c¾uŸ‚EZéiX ¹Â[õÒÌÌ(Gd»Ç£Á—¥8o£ræíZ‰æÖJ©‚™¡yP+;õêÜ‘yÒd@½##G»¢ÙNÁZ¦f?Q熻Èã ÈWU£w3}ãDúwšžÑläâ]Y!ø²²ÓýéqR +6'ï§a)µÅÍixOÎÁPµêSð.­Z³ºß{Þ—†÷ë•Z¥§à|@fS¦U…vë5‘Ä‘·ÓSpcF ‘Ê©Æ`ð‡Òðaî?¢U}§Aqï§*YLôZa::Hµ›¢ôc,}­Ÿ®¢\,è5dàÁn úù˜Ö±Ë<ê~heeuú¸·ß}ÀT…ÌE™ÊÉO죣Cý=û9UÔiòi(ñ¸ö‘$t¾mZ-W¹'Z½ O}·µ:³÷x{uMj©US…†Éê³,­õŒT¦ižúÝõtšîíÖê´Y#ðI?ñ¨Ê/tßGB ŽÀ§üš¬ÏÖfŸhcië™ë™sÖh³=s—èó<3?*ë${êi;“^›wšKbâ=ËãO§ XÌæ™ó”÷\*…ñ­×*OQ±\y >ƒ@*é"œ­^<@è€ÒãÄ©7à:­AV}u¢µÖÒZç©óÔ„^­ÆS·D÷š|¨KÃgµªÌÙ`@U>ÇqÁc*>ÏeS )c¤á~Í›†¸ù‚^ÅÝiêÔ+wבŸ(ߥœW[ÌØ¥Öp&Œíb8².Úü“‡ ŠOâÓP‚ç¥"É %¶›ÛVA¯¹ [%÷Ö¿¤žæsl¶EÔ/²-}=An}¶̶‚ªön8l_ IHÛ›¹·í;ì(‘Ûä«åk¨É»å;aèrJþ:ÌÑ? {•¹ÊfåzØ#ú›`¯c•ãûŽÇ ØñcÇ“Ž§a/ów¼@¥zZ~Ž{ùy‡è/8ÎrïL8ßì|+ìuJ4Ú‡Dÿ~8,ú´~ó~çi}dß9òsðžQb]-Š|zu¼h>KÌ—ÉYdxIüžÉ÷û+½"ÎÉpžG0o.ý¿ðí·Z™þ–ÖÚÊK嚢rz¥^(z-7•¥²·¨ÖÆgÊ3åòJm±hø¹2MšT•¬Äs0ƒÞ’cXÒk‰L7 ±€ßkÓÆO†Qñ´>-&K|*æŽBÛ4ñ•Íwõ³ò*ñÝBï´±•ÙKÌúˆû«‹W"R$Ô߈íÂy5Ó²û®qæY¨X%£ä…ªéáKK¡ø%V5úiXs“ŒÖmÅþ’1mÛX9%~Ÿ§ß´†9Ûr9‚/£ÀL¹ñ’U™ñ9(“Ñ®vÐòYh¼”Îòe©°w=.”Ïå<ç„g°ê²!‰ÎAaÒ£¦Iè±íÅg“ÍèH¡‚¡ÿë,¼‘ŒþŠWÿ?Ù €ÏÃ9(ÑIn°‘ZÓ•kÉIÏÚ9•MËA¿süñíhd“bWá(ÔMS€²¸.ÖŸÂеVFu­ÈAÐ8mìÇÿp6‚Œ±¥iT`ìsb(X0öûã?ÑR8r: Í“ à´Y†»Ü#ôî9 G‡á¨û ûÜS{hî1ƒÓ뛊-÷ñðÔý¥Ãðv÷#Äë0l?Ib}â0\5þÍÕÒKÐÕÆÑ†ðñÿ’ñ?Æ(y¯‚“ ¬#ð5pþPK 8A%E‘$º%org/hsqldb/cmdline/SqlToolError.classuP=OAœå€óä1t+~PK 8AEå%é> 'org/hsqldb/cmdline/SqlToolSprayer.classVÛsUÿf“Ýl·$M0õÂV+½`.Z4¤Üj±\S‘R+,Éi»¸É¦»¤Þ/àý.^àgpÆ>3¡c…ñIg|öÁü|tÆFÁïl m`ÌtÏÙóïòû¾ïwÎö—kß_°gT¤ÐÆfl #‰­*¶a»JË~Oˆy@Å<©`PÁN»dìV¡aŒ½*– O ûÄQ0$ã)ûU4£OÁÓb> †aeŒ¨hú-xFxUð¬Ø<$Œ«0pDAVANW1SÆQÏ)°®¼‚‚[EŠb˜”áÈpê3 ±Á£Æ1#e…ñTÆsÌÂx/ƒšÞ5ÔwàÐÎL?Ch½Y0½ ŽÎý Ò;ÇiÊfaiÇÈbB­!ãÙçvÅ!ãˆÅýìvSâ2<%ÂI”õYËw®a-–qLÃó8®QmW˘Òð^Ôð^fˆ»“–gÛ–[tŒ)î$‹Ü1휆WðªŒ×4¼Ž7Ì¥¼qÜ3ó|±µ“3-^ÃÀ.T64?'ÓNm§¥÷"C“/+y¦•êsHÐt= o℆“x‹¡}—­—Ë̹º[äYsÌ乤®ï²½ *ŠîÙº&É]X1†e E›K¦•ã•¿»›PnÐð6ÞÑð.ÞcwwW2ØÀ°ä&ª­†GXßÇ>ÄG wíã“%Óá9]èꦫÛžÖuáëc ŸàSŸiøë¨™R6Ë]W³Ý,¸žQÈr½Ñ³ÒvÆS#w$•Íç¨g<•™´†¨tmsó¶ãY^ôL›8],Ò îl± ×完S¾À— ÷ÝÌz àqÇ)=ž»Å®y»AÐs7¹„^§¤‚¤Ë‹†cx¶£aV3¶ªÂZRnõ‘î­ÉdrTŸC“©ôXoÏììm×GüV­®tlPT3S®Çózѱ‰]žÉ]}Ê.éycJ/¹\Éñ1£dyú1Ã*qw4­½&-õ³ çÝd§>òȪU£µç¨y‹æmô*ŒÔ;ÄX4¼ Ò,Pk*WH±H—H8W½š%”KŽRsU _ Ó ­·oó\õæqw÷‘£<ëÑ=2rNG{`>ÓýêÒ-Bm¦9X=a{HÕ#nä{«‡l¾˜A.Š•E„ˆwÔ¾n$~Ü$(RÇ€XÕsoO¥S +jÙÔBÛ8ŸŽã"_…8ærZÞ&öedär v+¥éí¤ÂH®ù÷/OR Å"/v÷ÿÂ4w 4ų«WEsGMð2å<äßvj…¢Š¸žë/.X…w‡€r'’è\lÇÐr{¦Ð×ÃöÕvúˆ[04Aݤ܃®ÅyQ4k‡hVˆn)Ã" ªÃ‹–‘å}9y´FþWÑJß¼} ë÷½©âƒBsL|gh|„V43šƒ]—ÀÎCüÂèÁºÊvÝe„Hu½]W¤sˆ^@ÝÊäc¡È?#ÜÈþšF½¿šrrS,ìË倆礛c*½¥ƒ±úÊ&›FdÚ°¿¾„†thK†/!’–¥%®t]9‡¦„ÜWÖ”}ú„¦¯ÿ™Ëh$‹ …`øÂ¤´ºŒ¦áÀ,šÉM<¶´Œe]2^VÆ]™a©*O$¬Šƒ,“ïhHj"ø3”„:MÑÂéú@6‹R¾»Œ{Ö5$B?¡3*ãÞ3h%dUG÷‰H$^N~k°’e '$JïpB‰GÖžFh»õ‰ú+R.!Ç#eè?¢)“ Â´ ièŸ÷ Ÿ7”h{ ”LCIG¥íD„ju6®ž»ZçN£í&Þ¥ ­Æ©³b+²|N_ß’ŽL_ßX­~$ÐG}|Ë)zt­ô ¢‰ÅŒRL¿QrÿG‚ 4ž—o»À¹‘¯$ò¥ç<êØ$û–}‡6ö+ûýŽD®G‰h‡qwSC?û R?ûÍ’ŒÇž”‘¾†eô²«XÚ| yëel ¿>z®!J#“ºþAÅþÆv¥«Ê-ôö¸ô/ê…å½$y 6Ý`úzb¾øµÇ:ˆrÑ뺈ÀšW–ñÐ4³c+i]F7mˆ³PIF ÷ÏCý§9†ðPK 8A®§bçêC"org/hsqldb/cmdline/SqltoolRB.class™|UEÚ‡gæ2„ç$tA,¡+*ÒD¤ ˆ¹Þ$7É…Û¸%lˆŠˆˆˆØ±!64vEì½—umkï½×ïý¿3iwù}»ûû?­.ï×j=ø€V—ƒÛµº|P«+ÁZmÒê*ða­6‚hu5ø¨V×€iu-ø¸V×Ohu=ø¤V›À§´º|Z«Íà3ZÝ>«ÕMàsZÝ >¯Õ-à ZÝ ¾¨Õð%­¶‚/keÀW´Ú¾ªÕmàk¹×é­øW^àÀ¿uàMz³ÞB¼x'7ðnnà?R´.^žHDƒéêx&´HŠ='%R*Ó ¢e%JceÑH<<€*e¨Ò´Qä(H†Òé…‰TÙ¸D*˜L%bÉŒk›© ¥ÒáL°$TVžHÅBt¨¨öP¨$‘ÊKñL$ž cÙL6V‡•F³éHUX Κ Ç’å‘h8XŠD©áTiY( FâèH6 Æ"ét$^!E‡F‡‚áE™T§—¢kã¥Ã©x(Þõ—µW¬Š¤#%Qê_W” Ó%pÚP—ãáÒL$wêä~_Ž—ÓT…¢ÙpÚë€Ú|4Τ"a:èŽxóÊJJƒát&T¤+Ãe †-J…biúIY–~ÏØ3ãP¢³§¤hY’-/§‚•áhRŠüt2\¡¶­æ&kÿ•Gÿ§tÊ$tA‘Š8ý¾,]L$q4D-Êêÿ— - Féz#T-7œJ%R¸q^*<.;Nâ¾eÉ‹R‰…R6**Id2‰5 •¦®K­©ýX¢,\7[|œ0–¨ —eöª¨H<™Íì\Z@3‚Œ&E8ž ÒÔÈTÓ•”†pOùŒÔX ݪùÁl<ÊDÒåŒkÛºYÖ¨¸C2‰…RÕöT¡ÒÒp:mïM-ÊÆ3áT,§¢•d”æSó9/¥®GÚ#š'2O¤–4Ê4Å*JB¥óéjï ÿ²'-¤k©Œ¤3K=w7Ë¥YÛX~Ü]v°:œákˆÅBñ²x6Œ…¢µSW'E)‘BSíÓÙ’t&’Éò mPµm£ñ–V¢› ‹kŸûÖ®Ýl|~<±0Ž¡wWÃVi%?Y~]·”ÕVlpê•™ÐM—¢&^&”ªgøÁ. ã²èJئ™°k©µ+‰dÂö¶´®mº,̧¶Ú'²ºQ\/žˆ‡3‰Òh"MÚ68 '’á8©ß ¸’f8æT›2ºF=ɯ½*;¿lÇBIjÄ-…4 í9±ŽÔþ¬mm©½‰µKV‹¦Œ½§-p#žNuÓ£¤áHµ/¡é–ªFÔ»²’êL˜Ö¨L7ÚÀ\Ã¥õ ·¡e¡¢Ñ´ô¹ÄMו6õ3ÒÝÕ|ÜŒXÝ]g]T§-ð`ºQhCñDi"š¦`:¡ =?’DQýbê'£¡h$”n4Ií“CkY¸œV`ºøVéê4=þÉÚÖÛÖzãGί/®ûi>šŠÄÉ"¸N×6î„k« öl [ÊO6štÓ“©p)ŽÑEa-kIw—þYMàÙmS·bÔ ]Wêžj/ŠÇ˜–ê0VÍ6µÑp¼"SI%eYºtž¸•ë.2A7 ³õL$J·;”®ÄsIÏ1=ÔB«ºìýk×ð"‚nù(åFƒÜqWÏ”/¬ÄLlpb¼ên{»º4%¯ŠFÞã´â—â(¦ërEô¬”TËèiíJâ‰t6,Û¥J¶ÁPVÎÂX8â7ay˜×ÕöM”R—©+t0¶îñZ³@ãG³C£®ÐdI—VRu:§QLg£¸rLÔ<QÜFnî*¤ôÒJÛSóõ7Ô ý/´ÄÂ`6I]¤¹@3< ¥—Æè,‘$¶ …XØôfã´õˆDC¼‰È¯-Å E•Âe‘Œ» Ì2z“¥ík%‘x:“Ê–ºWqAÝO³±^åÐø×â5ƒ¥¡îÙd#u¯!ZßJS‘’p; »fÑÈíTŠ[©NbéÜéÈÂHY†^íwn&ÏF£ÔÇŽ;ÀsEû'Lî›J—†0 m£‰ŠH)/CT7Q,Æà·Ä‹6‰’^l424x«AJãUNeìÔáˆnjY8‰á´ép¼v]¢Û³Sq!¯_ÔešVõ¥íl4輊á8O“VîÍQ»é³Û.ä7Œ[Oñkûq7·C£’ôÂÍ$¼ë0L»qoàö›±Ç0"mêÖÜÚ—÷·î‘¡E×5Q° ¦;^{Äm–y$x?Æ=§·E6iu®?ä¶j æØkiGs‘»÷,ºínƒîòéi?ˆ£ n+±ry!ýÚ½4Ü»_ ì¿y;·ówZ—T_!vÜøƒ–:XQA›Æ4öå¸Dlæé³`a(e÷™…ü²EQÃ×¹‡É´€ŠÊJ¢ ² Þ½ìry´þ‡C1^îê ó"Ñh¸‚ºÄ›iwúà<ì¶"ô¦ÅŠT_¹M(• UÓSœWã7F—T5Þ“·¡í*—ãy£šøÄhrAmbîïN»šS™JÚí&SµûKúhƒÕ}sƸ5Ú©Ò"¹]ÛÜЇõ¹®{áh/ŸL%íÙƒ‘r:{б€”ei¢ªR%RôjøŠh¤dÀ ÚÒ"HçŸN'²©Òð(šÃÑð0úší>ãðIÇŒ¥mM·ÙÿëÍíw¼{õúŸ•sFó·M.ÿæ(êìÀ¢Ióh0 J»ðÅ4£âÃzýÏSǦv y¿žÐkÝûbÈP†ïs ˆKè;ÊÖ XÔk×ßaMÔÖð©öØEIÚP…ËjËzÍnª¯M4Ô«a·¦WÒK¯õ¦ë¶*ÎÐ379”œŽ:¹êÜÀ{¹×ùïçªé-šÐä/ÛMhú@:Ðô‘žEvóz69²MÕ,¢³íf£EMþŸZm¢fÓU‡4ÕênöhH§ÙÝ.6õÛÝ =¼4êæðŒÇÇÒþuøŸý#†íüO —%1{¦š€…§¡PØø‡Ûé2h¢æ>S嫇ÕC4ëv>>*‹µÚ}07ðy~à‹À—¹¯ò_Óoß¾•B Ý 'ûñâ{Ĉ?!~Fü‚øñâwĶËòMùV¾|ñâ]Äï!ÞG|€øñâcÄ'ˆOŸ!>G|øñâkÄ7ˆoß!¾Gü€øñâgÄ/ˆ_¿!~Güøñâo %¡D¢¢9"¡-yˆ–ˆ|D+DkD„‡ðˆBD[D;D{DDGD'DgĈ.ˆ®ˆ=Ý{!öFìƒØÑ±¢¢'¢Ñ ÑÑÑÑÑ1±?âÄ@Ĉƒ#!A F A E C GŠ8 1q8bb4b b,bâÄxÄÄDÄ‘ˆIˆÉˆ)ˆ£SG#¦!ŠÓÇ f ŽEÌDÌB‡˜˜ƒ81Dœ€!J¥ˆ2DQލ@T""ˆyˆùˆ("†ˆ#ˆ$b"…H#2ˆ,¢ ±±QXŒ8qâdÄ)ˆSK§!–"NGœ8± qb9âlÄ Ä9ˆ•ˆs«ç!V#ÎG¬A\€X‹¸qâbÄ%ˆKë—!Ö#.G\¸±qb#âjÄ5ˆk×!®GlB܀،¸qâfÄ-ˆ[[[± q›|‹Þq»¹!Êüø+7ðw~ŽÀB§û§íÂIËOŽÌÏQ9üœœœí¼¯äRtߥšvvM쨴‰í†Íh‹¯ÎÆ{˜£JðAA‡nøR¥åÿx¢£ô»îE;—5ùÞjr#sd¸z>eÙåw»»IÊ£-Ödú| U„½\ì¥Ð0Óq¾‰F×j¯Šv¾;Ñ^ {¼þ²;…ÿxÓÜ~UJѯÉ]æ?¼°¨éýv¹ª¦·=v­÷O¯]+6]s×ÝÝ=Å®¿ÜÝÌà&z·›'mâ§ÿÿ³îö–oÂîœu7¯`×¶þÿ[ÂÝikwGÏÇTú4àç£]£'ÀS%—Bú¸¢Úùßã¿ïn탄£Îô >Ùþ?Séø8® UEðˆçMعN*‘ §2ÕµuF räBÊ‹7FvÂ~LâÛŽï8¾ëøÇ÷ßwüÀñCÇ?vüÄñSÇÏ?wüÂñKǯ¿vüÆñ[Çï¿wüÁñGÇŸvüÅñWÇßwüÃñOÇ¿ÿ¶ÄÆ)•cÀ1DZ™csÇ\GíØÂ1ϱ¥c¾c+ÇÖŽm=Gß±À±Ð±­c;ÇöŽ;:vrì츇cÇ®Ž{:vsÜËqoÇ}÷uìcÇžŽE޽{;öqìëØÏ±¿ãÇýpèx ãAŽ;r<Äq°ãÇ¡ŽÃ‡;ê8Âñ0Ç‘Ž‡;Žrí8Æq¬ã8Ç#Ç;Npœèx¤ã$ÇÉŽSrœêx´ã4ÇbÇéŽÇ8Îp<Öq¦ã,Çãg;Îq<Þq®cÐñÇc‰c©c™cرܱ±Ò1â8Ïq¾cÔ1æwL8&8¦ÓŽǬc•ãBÇEŽÕŽ‹Ot<ÉñdÇSOu\âxšãRÇÓÏp<Óq™ãYŽËÏv\áxŽãJÇsW9žç¸Úñ|Ç5Ž8®u¼Ðñ"Ç‹/q¼ÔqãeŽë/w¼ÂñJÇ ŽW9nt¼ÚñÇk¯s¼Þq“ã Ž›ot¼ÉñfÇ[ouÜâ¸ÕÑ8ns¼ yøˆ^gü…¼h¡îRw ©î!k/¤ÀòŒ5Bm-ì-Ô½ê>W§ƒP\«e¡Èé}§h¶]äØJ ¯ D¥B ÿ ‘Û»O—;Dó­||;WzÚÙ¡r­µu­iCuk„¶MIüÑÅÕðé8j4£“µ¨=üÈ?5gkœF5u5ÚQO.5úÔˆ–µìP¹*ËE.W9Urîù³T±Õc"Ðúz±ï=¢Í¬;„Gæ×ˆ‚QXЖu5¢]qh¿…}œrˆP‹ŽBåª'rÕ“¢Y®z*W=«ž¡ÿÉ¿E·º#ÍÉUÏRÇwücÇÛ×wü¹¦ªìQ#:ÔWy¾îžæð­Èã*]jDÇú:/ÔÝÓfT‹î©­ÓµFtª¯ôb“ õ­ëë¼ÔT>t²=êë¼ÜôÉúÕˆ.õ•^i²R_êQ×úJ¯6U©º½g}¥×šl©®[}¥×›l §Û«¾Ò¿š>µ´·­¤Õ<­©RaW…Íï9³ ö Ü!öÝ&º³ì—ÃÒƒ¥g3–"–^ÍYz³ôÉeéËÒO³ôgàÙzû³àÙŠÙôl̓ØöZ° b;ÄËcÌ6ÄkÉ6”m˜—Ï6œíP¯Û¶Ã¼Öl#Ù÷Ú°bíylcØÆz>Û8¶#¼¶ñl¼B¶‰lGzmÙ&±MöÚ±Ma;ÊkÏ6•íh¯Û4¶b¯#Ût¶c¼Nl3ØŽõ:³Íd›åíÁvÛl¯ Û¶ã½®lsÙ‚Þžl'°…¼nl%l¥Þ^lelaoo¶r¶ o¶J¶ˆ·/Û<¶ù^w¶([ÌÛ-Ζðz°%Ùx=ÙRli¯ˆ-Öõz±U±-ôz³-b«öú°-f;ÑëËvÛÉ^?¶SØNõú³-a;ÍÀ¶”íto¶3ØÎô`[Æv–7m9ÛÙÞl+ØÎñb[Év®w0Û*¶ó¼Al«ÙÎ÷a[Ãv7˜m-Û…Þ¶‹Ø.ö†²]Âv©7ŒmÛeÞp¶õl—{‡²]Áv¥7‚mÛUÞalÙ®öF²]Ãv­w8Ûul×{£Ø6±ÝàfÛÌv£7†í&¶›½±l·°ÝêcÛ¶Õ;‚ͰmóÆ³ÝÆv»7­†ío"ÛlwyG²ÝÍv7‰í^¶û¼Él÷³=àMaÛÎö wÛ¶‡¼©l³=âÍö(ÛcÞ4¶ÇÙžðŠÙžd{Ê›Îö4Û3Þ1lϲ=çÍ`{žíïX¶Ù^òf²½ÌöŠ7‹íU¶×¼ãØ^gû—7›í ¶{sØÞd{Ë;žím¶w¼¹lï²ýÇ ²½Çö¾wÛlz!¶Ø>öJØ>aûÔ+eûŒís¯Œí ¶/½0ÛWl_{ålß°}ëU°}Çö½WÉöÛ^„í'¶Ÿ½yl¿°ýêÍgûíw/ÊöÛŸ^Œí/¶¿½8L X¡”^‚UY xI֫ͼ¬Í­æz)Vmµ…—fͳÚÒ˰æ[måeY[[mãU±zV}o!kÕBok[«í¼jÖöV;x‹Y;ZíäÈÚÙêÞI¬]¬võNfÝÓj7ïÖ½¬îíʺÕ}}±„½»õý|q{ë=}±”½Èz/_œÎÞÛz_œÁÞ×z?_œÉÞßú_,cßßú¾8‹} õ}±œý ëûâlöAÖñÅ öÁÖ‡øâö¡Ö‡ùb%ûpë‡úâ\öÖóÅ*ö‘Ö÷Åy죬öÅjö1ÖÇúâ|öqÖðÅöñÖ'øâö‰ÖôÅZöIÖ'ûâBö)ÖòÅEìS­í‹‹Ù§Y/öÅ%ìÓ­ã‹KÙgX?ÖëØgZŸå‹Ëس>ÛëÙçX?Þ—³ÏµôÅì'XùâJö륾ØÀ^f=ì‹«ØË­Wøb#{¥õˆ/®fŸg}¾/®aZùâZö¸õ„/®cOZ_à‹ëÙSÖÓ¾ØÄž±žõÅ ìUÖúb3û"ëÕ¾¸‘}±õ}qûIÖOöÅÍì§X?Õ·°/±~š/ne_jýt_la?Ãú™¾ØÊ¾ÌúY¾0ìË­Ÿí‹mì+¬Ÿã‹ÛØWZ?×·³¯²~ž/jØW[?ßw°¯±~/îd_kýB_ÜÅ~‘õ‹}q7û%Ö/õÅ=ìë¬_æ‹{Ù×[¿Ü÷±_aýJ_ÜϾÁúU¾x€}£õ«}±ýë×úâAöë¬_ï‹웬ßà‹‡Ø7[¿Ñ³ßdýf_<Â~‹õ[}ñ(ûë[}ñ»±¾Í³ßfýv_<Á^cý_<É~§õ»|ñûÝÖïñÅÓì÷Z¿Ïϰßoý_<˾Ýúƒ¾xŽ}‡õ‡|ñ<ûÃÖñÅ ìZÌ/²?ný _¼Äþ¤õ§|ñ2ûÓÖŸñÅ+ìÏZί²?oý_¼Æþ¢/^¿ŠFt/ž•cDâYÍŒ(*žÕ܈Þųrè[<‹> ûÏò¨h• $PáAú¼D ¯ºÁúþJÈ7b8¡•#­IhcÄ(‚gÄ‚oÄ8Bã …FL$´5b¡Sí˜Jè`Ä4BG#¦:1ƒÐÙˆ™„=Œ8ŽÐň9„®FÌ%ìiÄ „nF”ö2¢Œ°·å„}Œ¨$ìkÄ#¯ï7rø€‘ÁíF^>häuà#7¹|ØÈ›ÀGŒ¼|ÔÈ-àcFðq#oŸ0²|ÒÈ;Á§Œ¼|ÚÈ{ÁgŒ¼|ÖÈíàsFîŸ7òað#_4òqð%#Ÿ_6òið#Ÿ_5òyð5#_,Þ&ä=ò¥Yî …"§F¾\#_©……òUûP*¼C¾¶MÐ{#·Y|Ýâ_[ÝÑìŸ~ÿýPK 8A/[!mÑ-org/hsqldb/cmdline/sqltool/Calculator$1.class•’ÁnÓ@†ÿMœ¬\š¶PBQ¨Û$P°Š@ˆ¤RÕ¦AI€COÛŠ]o±ò¼g@ª*„ú<b6·Vòþ3Ÿwwf´3?~~;ð÷Џ„˰\ ïŠÆ2ÇU -×´\ç¸Á±ÂðØîS7èˆC[Å#;HÞKoh»ï<F¾M”*%í¦îXŠTÅvG¤A÷!³¿Í`>ué\˜>cÈÖꯌ¦ò|†¹~*Ü·t †Ò§ô óíÈ•* £QÇOåqÜâ¸mÁÆš… °,¬£j¡†:Cå@ GŠhäì©þØ ¶B_zí8V±…;úØ]-¨2T©lçwÙδlgZ¶óOÙ› `°¶£È›R$‰Ÿ0”fyºÃßMÖÎŽaãliÿ¼Vþ¯s$äXçÞ¬Õ÷wÏä ]î½lôÚ{ ÷Ï{“«Ø #!'}¢Æåw§‘²V‹úØõbÐk4¥šœ"M+•uW´s¸Hvžè#²ä['`§ß‹_‘ù¢¿ì1 £û ÆÎó„¹rÂü MB>ÁÏ00SäPÆ*@Ušâ‡d¡Yjå[†ù†cÿ,Ò®%Ò›´éOASɤ¸KX}^ùPK 8Aµ¾‚‚‘0org/hsqldb/cmdline/sqltool/Calculator$Atom.classµV[sÓFþ66–£*Ä 7I[ b+”„Þ(ÁåbÚ„k¯ke± ²d¤5¼óxëô¥¯e†\fÚ·2ÓÕö¬l'eâÎÈtx9«ÝýÎw¾s´{¤?ÿzñ€yÔtœ2óÊœ$ó¡Ž4>ÒðqŸèHàSŸáó$t,â´Ž3øBÇY,é8‡‚røRÎëÇ5½¨p—ÔnQ­•4\ÖPfðš®0$Ê\ÖVš FÑu…_pxˆ€áä²çW­ZpßY¯XvcÝ©»Â¢™ô<Ç*pÇn9\zþTÛ}!ö€; ¬D”²V¦f¦£qsb±îÖå†ÅlDŸå»ü·îV­Ué×ÝêBî:C¼à­ †¡UÉí{eÞ\ãG„)¯h¸Êp32}_Ù«Ð3Q©K ”^[6ÃÁlno2¾bƒxózDLa.T¿Y}_´ßN½ûÐ`à²Êä”9jà02êék†£»%+:ލrgɯ¶•çÚ¢)ëžËphÍ»'Ü Óà2®'3‘q[Ž£(VéHXÃ5†ô^”h4å#:w®ã††›nᶆo |‹ï4|oàühà}|`€£bÀƺwñž;LT•™a0£e»$½Ý€öÚÍm¥rWØ’!ßO‰ŽG‚¿©{¢§#¾jYuJƲ½osÂnUÖBX‘Aç¶-ê,³Ô[&»·¦%ëŽå‹ªxh]åR ߥ~’þ-­Á¥]$üÔ¿£jÜ_÷[µÅÂ^ærÛ©s¹Ë×aB¹·öï²/{ª,ƒMî¢ýÜ3eÕ;m²Do+ž-æ DJ]µ%Vî0Ìe ¹~{r·bsªbÿ§µ–”âR>… }cÒôõŠQ³¢Ã Õ´èL©”ºj4×0 n­£ÙBÆhæÌâæöå_aè%·Fµ-$Ïob0þsgEW+Ûx‡M =…aæ·±ÃÏBÜOH›ùØ&RÛÙÀ¨ù£ þÌœ!Ô… åL‘CüoÒÓp\à ÓÀÈØd¨,ÛQ¦fJÙðŽ23O¤Š!0·Œ!þ:0Ó ¦ÂÑíçɺ8Æ•0Ê’†ámüºZØÄد;ú¨H#HV èdÇÿ@'F m!Ö Ž}m@f »€Ùž ¬+q’ìmÓ¿ÁÄÙ äiD*I¯rËøPK 8Ah%áíEe2org/hsqldb/cmdline/sqltool/Calculator$MathOp.class•TÝrÓf=_$[²©ÈLRòcÿ‚”Ÿ‡ÔŽí‚ÁÆÁrf:£8nb*dpž€éô¦·`JÉ´S†ÞöEú ½¢Ýý¢BÉEíïùÎz÷ìj÷“ÿ|ÿë[ËxŠ•(n`UCZC.ŠÓȳYã_ QQŠÒé3Œ7Ù}KÇcYÇ<ãm Œwt,2VtÄ«:Œwu,1Ö4¬ „+ëùzé.ªŽ¿[{"`”=¯Ý+¸ÎÞ^{OàB¥ÛÛ±v÷žºÛ[Vëñ¶ÛñÚ1¿Ûu­‚ã¶ö]Çïöâ‡éYªŠJ¾XÐíµF=_hбºQi”×+M *–7ËÅÕKUÐzí~©. Zô-hñÍ|e£d X®ÿÌq÷¹óKÉÔÀÉj¡»Ý¦úR£öÀZ²òÈyæX®ãíX¶ßëx;ÙÔÀ-­t¼Ž¿*0yŒZ¹ÚˆØÏñ÷{T]MJ—îwCÆ’©Où ÷rÒöÖ÷UçIÃÙrÛtϨÐJË T’\9w¤XÉÛ¼2X‘Õ¬_à´{¨k =žDÁÀ4 \óHjØ4p÷ dpŽÝ— ÌàŒ96ólØ,²‰³I°YÂោ®ZËízíÿŽ´¶õ¨Ýòi<‰ÿÕ§À•£›”/Kö¸‹òquÒŸ8îðÌGÈí:=§å·©Ì8oø“„ÜEzOÓF47Í“çœp!ÀÅã&\bÄ0c¼1âaDxÊ8Ol‚?Ñ>Ä/zå…äZÄL’G…š>@èÔà!ÞYš‚B-F:3óáôìkh/eÔ²Œü‚$.ãJ 9FÈ’zúghÐ?½DܤœáÙD*™·7”ÕÙ™ËÌ._W§UÊŠý€ð´úâ¹"~úç/Á×ÈCyˆ†/…ÿ›$t|…ëèRxýÔæHT1“opâ IOªfJÒaI? ™IMIO…Íó’ŽH:ª™iIÇ$×MKÒ I'Ͱ™|JòiS3¿•ë‚/H¼Èói¦\°ã%ÆxYÁ¦qVÁ9‰ó|ós.ä#\pa ^pb)>¯à <¿ÂÃE¾È×xø2¿éÂoá·™Â%¦|YÁïHü® ÍxIÁW\à÷êðû¸ÌÃðð‡N‚ýßúcÞþ o¿j/˜?¾ð§<ü™ÄŸKü… õøKþJâ¯yþVøo%¾Æ}]âNLà›.’ä[,Îßññß3áøG‰oK|G⻌ü=‰ïKü@â‡ÿ$ñÏ ~äÂN6Ñ¿Hü+ ÿo?–øw‰ÿøO‰ŸHü—ÄK¼*ñS‰×$®H¼.qU¢ ¤а?au ›°»„C(yHÓïMëI5W%FóˆI}M–QXøSéœ_Mù©P‘ubŠŸÃÏSÁ¨¸[×Õc\þÜ¢UÂ7S!Ü"$‚næ!ÂÃ<´ñ°V±Î-Ö‹ nÇãnq§¸K`å,[vëcù¤–ªÖ£awÚ¯ÍèähÚû³ùL&×bÁùWh6j»":Üb£XÉÆÝä,Xo7óv‹ØÊXwóp@]˾HKk°-ôÐVÊ?`Y¾[ls‹íx‚Bd6ä;D;õÝTƒ‡S‡TRd”¼º†y¯€ ÅÄ}nÑ+îr‹ÄOá‹p?¹¶'™É«RL`}ÏÑŒ6š# ‡q5aºM+åsþ1òa:£é*ÇOÅ’¬Sܧõ6c‘Šù3jœ£Å¯k\7Œ¢ëï7‘f“+ra¡ûoäz<éºX7ëÖ’X$ÍaºUuÝ3œz4•~,U†u00Ý=Ôý@§Ÿ#Â_ñžMÅB”‹*¡zŸš§âC®H§¨âqtí»i›{,MÛõTBsãºÆGȇÓy–wò2>ÁPŠ?k6~”Ví„›Õ&øñ´Öâcã9Zo$d²#o"KÏ+Ü8>¤ˆ~·oTÄ·C< lØNÙÇIHŠ“Q’~ÕŸÕ‡#ÃÑŸJ©H%GÅGÏ^ñ€€%D1å"´&ª˜4§>ªeé–_g¹ýãlsÓöt'h);_׎äãdOb3›¹=Èv±„¶ðM‚<´ñ°Š††áç_Zg¿WûOî Eܽ?RÄ>·Ø/Ô¯þCP¨ØóËØuT“æxè虫ywJ•ËÀ×ÓqµXPö¥9öëFÓ©%Bö~íØŒÞ¥(YWëƒôôª™ŒÆ&‹ÌÕÜÌ™E½ëÍ=ÊÖ1t^=»Ù êF3ÔjE‰­Ý;vÜqs yapxÛОîíC¤Mß@÷žÊ¹k¸o¨w /J°½#½;zˆüžž]çý{{öÔ$•Ù’·ÓÔåµW‹ÎG]ûfª_çJ³iËÆß¤ïh¯€ö¿—ç©ÿ:ÃÜ jxb¯ÆbìÞ9ÍmISÉRdW2Í…ÁJõ2žZ‚¡ùJ¾ó¦}˼ rSî¿)\º–I¨£Zw‚tÝxÍïú)Àž¦E’Ë'½Éœàs¥Âœ©¹AZÌL²ŽÀàcñÜ(—ü)(*0 ˜Šf™…½‚PIë±xŠëØc&FCKï"m–·ì¼ž$ÖL>7Ãfæåy&zuWw,›Ó’ü†1Mo;žn –9b¬©É®R™«“JÞ%Rרh¤ˆáoŠ„–ËÓ ã¥ï§Ì^\«"þ£ÇAMP.H"l~I,½F÷MÔFÓÉLœ îu æm;šñ0òl°pJŸð¿@; ~.î·5µÜeø¯Ð?õŒåý[ ÏÂí9A~ DÉJópðeXCça³àn»{ôѳP=….c9Íw|ÆgÂFÖ5šëþå'°j6-só‘©ÚK#’‚M¶il-†ØÝVLÖLM±v‡×QL<{ÔskÜ:§ÈXY-G717åßd Ñèul²ü$~d¬KT·•E´,SU|Š‘25T·3U‚‡§±Ã¤j uU¨É>óú ¡zÌëUBù¸ÊœDýq«Å§tÚ' û;®–e)›¨´a•¤™‹’ÖÚ^ç­{ÜçÉgàõÙ9¡œœÏÇëÄdáÛ“…ÿWc‰Å?cÆZvM<7ž$i^^m¼¾ë¯?_2”!šQû ¡ÆÚ“$Ÿ\}­ rÄ€|ŸI6 {wæ2é½³MjúÎëx?¦[3èÈÒ'ç²¢½ÆŠ^ÇG°¢ç Œ#+œ®AýÆ"rÒËRÆo0sœë”Ïè€Õ EaÔçda£¹Ñxª&}ß œ§Êõüš_‡Bóé×°í ¶P‘\U¿ú§°¼ÎozP¨€ ®¶Osiš® ƒVW°UÁ3‹^GØ&^EÓ«°tÔœ4·û^Å¢Wá Y è6JxB!ü›Ýô 4Î<5Ôsâ#xÖl0^4KôÓÁWl5þ^~ø/`')y_ÈÓçÙu»­Øòô{JË7zö”–ƒž¡ÒrØ3RZîõ‡ÃްglãOa™ÏqÉ, qÃÕ6—º¿Ãv*ìyäZçŸû—k[ÆGI‚påÉð9¦‘x¼C {’ú[ƒ¢²ô„=© HcÐÞ°']Å´#ìÉT@I­ {ŽT@GT#^+AƒíY× ¼åVthk§NÀxßi|ÒÆ¯ÿ;–/°Rúôø8¢–*+®`™ÍC¿eæCþñ…’:žO˜ÑµÐxF)ê¦`1ZW:ý$Nš§ÂçÔsÉèâ”)ñ<&Ís¯yÛéÉžCî%XN›ÝïQ—‘ÌÔñ3ÉÍLjÔRšßtϲÿPK 8AóàCbü 1org/hsqldb/cmdline/sqltool/FileRecordReader.classVùwUþ^“tÒ8•nˆHaÓijWjÕZ–› qš¼¦ÁÉLH&XÜÜ÷ Å}¯»¨4Q«ð›žã9þG*Þ;Y¤íqΙ÷æÝý}÷¾ûæ~> `3Np-îT`P‡;°<Ä$¨‡äŤ‚¤‚©HЀCL¼Ë“uÒ~X<Ûdp˜9Y9?&æhƒd#lín¦y8ªà?îUp_÷ãn? Òdá!nÀ#xÔclè1?çù‰žÄSìêéžÁ³<<ÇÃóÌ}‡yx‰-¼ìÇ+ìûU¦¼Æ”# Ž ¬ˆ EF#}ƒÃ;ûF¶ ôŒFö÷ ˆˆ@cضrŽa9{ 3/=€ïdÊ”2Ž¡” u@}V ™XUåD¬LÞ‰:ÄH¸LkÌʸMì1Gf-•%鼓2CY™”Ó¡2‹dý;ç°&…³K@Í9Ù”•Ü–Ÿœd?eMÓ°’¡h™“2K^ñ)#[¬Sx7¤¬”s£Àõúyz=ÿ‡Ò±—ö¶´÷@ÿt\fœ¡£àuoøâ¦#–Gg¹Æ¨cÄïÚmdF S*8! $¥3d¤I¤Mï8ßzI€¶>%°Œ¾ú&r¶™wd‰RŸÊ g¤åšßOa¤-.ÒÇ “*IÁ›¥%§ =F[Á[n‚L›±ôêû;öªØ‰a*€E0T±ý*°ƒp¯Í4ë½­âôRMtÅpY©†Ïúïðð®Šq…¥woêÐU¼‡÷iƒÝA ªàCác7£O`í|œÓ”IÃ$ˆYM„Àrv¤&—áQÍMGb«Æf?Q1„a#ˆªåa Qõç™ìË&óii95V£±¡Ñ¾Û¶j,¬ tÚÙdh*wØLL„âé„™²dˆVŽm›îNKx—@Pð)%IãóÒíL;ÚHxxdûÁíýƒ‘ÝT1c£]×1·ó†gT|†Ï‰CF´ ù”¬­š6Îß_*øJÅ× þ7ø–2ªâ$ö©øß«ø§TÌ¢ ¢ˆUü„ŸU܃[úè0¥3ŽæØZ)ÿš1IÇKËÙùl\ºÁiSFN›Ò*£¦b¿°Ë_šæAž8$ãŽÀêÚÌÙ΀·5m¬ðǬ\>“±³ŽLô[q;AÕU#ÖZ-žájÓë±RI5 b·áħ¸Æ–/p”ùø5ëç6'¦õ…ÚÒ"ç¼ÞÈÐq££Òµ‡%úŽß± »Úò”¸Î¸M´{ó‘Ž%:â9ñ”²d<ËæYaÓÈåÎøhŽjƒÎœ§´.¯â³‡lTðh×#Kyh×ÃK±[0Jdxe2éJ2·Ôn-Lí;*祗=çR®€žª>mÌ—ÌÚù Åñ’¤ÇM¨—¸t³Õ'¤)ÊÀj=²äöêMi%¹Sç%½†œtË6ÅwBÖ½ |úx˜%ÖÒ¼”I¬£Ë÷ZúáP°×ázºQ·Òª=ôRWu¿©1º3µ>wÞ†°;SOvgjË47.uZï¢UŠþ%¼4!‚s¨‹á™…7جãß,|D«u¡ÌÂOß ±9bÁSðqAWê,+j-°ìrz[šh( ¹Iû-³hýüÜBo=¹Än zk9„€à)²Úø;ÖÍ¡-V±¸œ ±³."{E¬8ÃB\ä˜í ì¡Ñ±ÉuÀ¦n¥—º6l¾f6ï/ÙYyÒ FpK_Xâ’ŠÄØb«*{±¯,±±,ÑÈñýÅ;¯ç«j|>Ô]p3nC¬¼íãDdäàiß{ÐçÐ^ÝõjÚu+Ö°–ÁÔJ`±îÌÖÄ‚žÍAïæ–õElôôv°16ô®ø›*ꗒ±:Ñ^Àe-:}wÑÛt €²R@pæìŸóÀ5ÁÓù7šìájãç HL9ÚcDãhÇ=½´ÃVz½t’ûËO`e'-º†˜èéôÐ]@h_×ÉR>×—d¯ð~Ÿ8YZ4—d ¸’¤Ú‹Øìí9ûE5¨ðþM~ÅYúuôPh ¶­Í5±ÕñEUŽ-N4úÍÄÎ’ÃF. –-\,«N )HTßißT©šO¹¢¯êmm¯=ÖÕûf  ¸fx››þ‚&<5®ñ/PK 8A°·W //org/hsqldb/cmdline/sqltool/SqlFileScanner.class½Z}`TÕ•?÷Í›L^Âd’ L>`ä3L€ Ò€$I2!bˆ†d‘ÉL˜™¤Õ¦–¶¶µÕ¶¶ŠŠˆÆ¶Ú"˜„ Õl?ðÛª« Õnw×ÝínÛmw»mE³¿sß›É&v÷Ÿï¹÷Üsî9çž{Þ¹ç<ÿá“OÑqÌ&²í´[L±Sµp0ȱ 'ÏäÚD÷.›Èç~jÀ4n ­¢È&Ší4ELg|†]xÄ<ši§2–W&rÌb0› sÌe0A ƒùVáµÓtQÊ`M,ä~ƒ2»X,®dõKض«x´”•|ŒGå¼x™n¥ÀàS ncði›ØoŸ±‰Ï2ö9>‹Û­âóVñAæÖÖÿ:AÂ'(«:ŽÅáøuP_Ð4†ÿ0¹eK{U˺u5M¾-5&¢5pºµ©¡¦ÚWY ”4A9M›jÛ×ú[ªjkÚ7µø›kÖ2Áfš|õë',‚,ëýUàfÌ.ÈÔX¹™‡*†XÁCEPFk«¯Þ×l¨Vµf­¯™ÇAJƒœÍ”ÛÐè¯khn¯ÞPY¿¾¦½©¹²YÊÍÃæê*«ýŒ8eb#µ5×K:Ö·aÃÙ˜ª®«lho¨¬ÞX³V³ö¦ÀͲP ÜUÖv‡»Vb³/ª†Y@+«›}þzð'džˆöÅ:C£³\áLŽSl˜ln¬¬o‚ƒÃ²s-õëý›ëÛkýºíõþöºÊæê ¼¡s5´4m¨Âºö%U¾õ‚4LÉíuM@sÛÒ톙*››}U-ìW*šjcc0ÐŒB“.¦;R¦Ï°Kúû›âx.ìï¯ îí ,¬êÛ±ƒfö÷×¢»‚ ‘©¿¿¡/¶s{ c—ĵþþê¾h4ŽK4SŠŒÆY|Øß_îÔÇ–}ûBÝá tì @° ƒH¨¯',-©ŒWùkÁ[ LÆ3 ð¯[‘ëB‘®.6ÈS‰v•íŒíun/ uo/[ ô÷D¢»j%v–Õéé „;{˜v™u X3»Ãñ`4Ðï¾J̽±¦8¬u%½Õî8Ö=ÌÝèêîhˆwtï…Û¢ÁÝ}ÁX<Øi¸mJ4°§Ûí7D#=½q„N¬7ØÑUööà ¶ Øž`ÈÂ8‰$ñ ˆHŒsgb±`4Þ/zmw,°=씇ÕîÅTv0_TÉ|þÔêH'„O+¹<`|m¾ùœ ¿cW] ·™E¥HjŒìÁ¬<]}¢9ã8s’ªâ´½Ï‰q¼÷­–øæ_Ç›éR¸ÒØÃ̦†vLôè‡ô‡›‘ )ÕÏ/S¾ÔsRK¶ðjž¯K=6˜rhã¹ä0y½Æìãg¡uM@óJæ§ûöú¢ÔCst]6¥é¾H‚š;ƒÛûºÍKãœôîÊŽaŒ êlÝîã΃Ð^ãSl†á>|$½†KEw¸;¾1Tré‡ÏÒR|â ÷öMðIâÌ«eHä§;¾¶j+6ÒËŽîPHž&¾\{ÍÞŽ`¯ŒW«ø"¾d|â¡H,(GÑ \"G1=j°Æ'ñíÁ®î°Ì ¼5=3 EâzdUË™P0Üß©§˜Ž@¸& dVíûö%ü sÇÚˆÌf^‚˜SLI=œ‡ÊŒÏ®¬9²+^i¥CPRÑ2¼¶KBQ„I¨Â,,Â*l&!2„]d*šÈR2E¶˜¢8D¦Pr„Sä¢å).áTò§2U™¦¸•+è…6€"¥˜y§‹&p£2C§ÌÌÐègôš&î€ëÅ— N¼<:ÀŠF–4ôŽüè´GF~¼í0Úéџ܃öÄèÀOïB{ÔèÑÎÜnôGGžÐÇÏB;9:ðìÝã|Üž=6>~:ž{d~¿ÑCßóÐ÷Â=:þt¾ˆþEè|ÉÐõÒÑñu/:_†Î—¡óg†ÎŸº^¹Ãè ]¯BÏ«Ðñ*t¼¯AþÏ ½?7öõ:ô¼g!û,äž…Ü7 ÷ ÈüäýÂõ¦aó›Xûæéq›Þ‚Ü· ÷\ÊÞÏAöyÈ=¹o6¿ ÙoCöȾٿ„ì_Bö;ûd¾™ï¾‡¤½ûÀ] çÝ#·3€¤w`pˆ½{ôn^§×„Y3Â!rd¬ä —ÈW³ÄTk–˜š[:D¡(Åa¢r”8 ÅLÌͳy£9ÉÙ¹bž(1Íjî\1_Ì-ôŠRÓ±pÚDë"Qæ¶r¹.–^¥,K]‹ÅÇDy ¶L,/X,®+sy‹9WŠŠeè¦LX… ¹.€{ùŒž%Œž£û4ú ýP£—釸vƯ’ÊDe#¹ ëäý„<ɚdz#Њg‘Çà ?ŒÎ‹yz‚±X +èi Æ"}ÑŽ §ª/Ü z‘¸‡s7J­îþ`§÷`o0Ú§ÑÅ—5ú)±Š;5qÓèGôcM|…ÞÔÄWÅ×4z†m|Á‹ ^b0J'hêåEcw7(dÒy^|7î§O¿®‰oÐ{VñMMÜ%B¡÷4q@Ô„5}‹ÿÁóìãìœtX£Óì—üôå©UÒĽtF£ïÓ1Aî4W¶~§³EÿÅà?5aÑ'Ä}â~†}‚Á XÅaM< Žhô¬btŠiO2ø  ”¹ÔöàQ¾K *I9¿h4°Ïî îõ÷Åý;ª"8‡XòúG)<Î*O˜­ƒ[Ì|ËYàzšýð[p?ûá!:¤Ñƒ cðú«FßâÑãlÚ|?›ñªôÌÓèßèß5¼ ã÷tššzC‹< z¸hÄCEÀúÈv®•Ùã`Ðʼ޲qªçoU¼ã‡4ñ0½‡÷È"M ŠG8’Ïóü·Q‰±ãêøð¿£ÑoqÞô6«Ë‘ö¤êä…ß5쟩Ñ;tUËæÝñ` …*!{ªõf›°\d°Üùa7ŠÏuøVŒïÄ*ÕÄcôWA‡2ðYZ„"d'œ²0!½‰BN@fVÜ=*'·°™Ñ9ðmg‹|T;NYṦò(K^\|?0ȹtÓÔÿã¢ß=õN¢ÿæêç¾"_á„õŠ â–ð®Èž°§;‘bú¦ A³ r¢$ôÜÌ?ƒxöbxÊ D»‚œ¡^ÑÄ÷Ä÷'Ä»ûMÁˆ˜û·¤I¦ÔÖÉÒŸù–D¥já"¶òÒ'®E–Ú¹iÞ%ˆÞ^ÆBa~'ãµ aù‚´ ]A>ùûváÿ’]f6ð•TÙèS‚¦ô3&ï€çbü¦õm«òK|¾´Ï*³ÜöÄ„—B1Eød3œr:"½ûyÓxÔ—fJ>K³'>€´£ò' kI[µO>ŒÍ‰WŠ>ƒ5æ½Wù}Š­àÁÅ&9J¼|ŠK|“”S˜Þ­Æ!MM³Z_—’F«C¸áÀÎ`¬;ìL^ üïÁ‚'&\/èªT媕óÿÖo&tí¦[HЭ´ŒÜôIÀøSüÝFôé|?èŸIÁ? üs)øíÀ?Ÿ‚øSð;€)ÿ2ð;Sð»€%ÿ*ð¯¥àwÿz þ àßLÁï~ ?ûq“`\@÷Ò}Éùp\=rþƒ~$….€?hÌM™7Ș8eÞ |p‚ÝôH þmàß™°Ï¾U¥œÇ yßK‘—†{_Žq Êþ¸ÑŸv+|±Ë~Èè‡~ÄèOýŒþI£?eô¨>dÿ”Ñ?-{;×?G©$ûŸtÔQ²GÍ$ûg 9Ïøóß þ¢Ñ¿Ä½cWÀK¡Y;}X1™ÀA”㈞¶o4U8E¡÷$)^Þ:IÖ× ÖÁjC_aZ]X®z‡ÉTn.v™P©·x¿I “ZnIެ \ê~U¸¬þý–1—åÞ±? Žu©Ê_¡Î?@“éCÊDÕú¹…ø åB×ë“›ef³,ãf½ž4kbоüR³æ$Œq8ö–[ {’øÇΧ„× šñg“–L7,qæd,ÖM±²)¶qSÎ&M ºæRS¥óÐ~ëX'½6‰“ŠNzcr'e°eöqËÞø;;A¿ 7 ]NÅfY¼…C”ù8éóð»Œ^:DšNç >oÐ+Iþ¥L{‚²’úøqÊ>HyÀ´g(ëMiu:F(çiL8yr˜rOš¦’bˇ¸·“ânD|(†¸¼arUp_X¨¥|92wS¾#ë0Y̓¤ªÀ¦Ž‹»‚”1šCŠ•.†¿cl­DMŒ¢Hå’2,úÖØ®<$q_:LÓ6'Üð.ý*›²ô¿Oï&w‚þkú‡ttg‚þé×$èÿDïôÒÍfØXpÌ ÿsúå…‰åÿ’vyabù¿¦_^”Xþ›´Ë‹Ž1€·…A.C ðßÒÌ:NŧhzëÍ€=Î+ 9¶ÓÌaš5L³²›”½QÀ‹½ˆó9µXgZUT„óÎ--âÃVS{U©©h˜æ›xà>Û Vúl”žDyà¿O× †ª9㪼éU Ó¼ñ°šs©+ýÇD=˜äG«¡i®áМÄWÁá…%ãRñÙØ0üCÒºy‘Õð¡L/÷#4Ÿû¬”Î}†¬*ì3 ‘1[ Ï柗*¼Âˆ@]O>©S ‹aùÝZ¨xªýFnªöŽà˃ôÞœ5tÚjA·‡Ü›–3Òy’®ö¶&!ô@VÈ FVÈJF* ¤‚=Ã’˜uáS‡ÇæØ“_j’ó,¼tHª]b¨_. <@,®ª(¬@[ÉŽÑÑ5h•CT%ƒI?ì”&¡,xT'óïé²mb9ÿNdÐçày¹ûU·¦œž~"#´ö˜±Ä$TcÉ4#ĵ{á¶¥ Åæ¤]ù†ßìIa:Â?Ä<×@’ÊÊSMá’ºA²×cdZRwŠÖ·.¡ OKÔ(ë k¤ø¬Âz‘,ÈÈR¶¤°…†YÓ ‘“|GÉæ5е2º 9´&RìÈHžñ\ÃVÎ1bc8œR;a#å`ÿŒ¾Úþcl6ê(Žåå| WXŽSÝ ëqª_a;NþÇ©a…ôD¹j*Ïdw¬.v©Gè!·¥xéw¥cð\!YÐÙÑÂh™hkå–õ> ­í3:î)1úùÜó>«ÔmFœ¬’A 'Nª<¹Ð•y€2$}æ%ôAr°q˜\ÓkÇÚ˜?ìR¹hšê¶¸Ô¥ûa#w–kƒÐü­–,CÖÛTž•t¶«»Ã••`É»L†K;€Œ&MÁ9U¹xɲ£4ÊŒj§îÇS|Seø¦ÊðM•á›k ßT¾©2|S%¿µAŠè›p{ îOÞ 6êÛÈôêhµÜˆ–ÜBò\ÙØS~ZI6IUVy½.•?l´«±xÑ™òYÑuÛ¢!j¤)‰ Fe]š€€ß—V ’O7ɦ`üYo1g—Ê92aš›t±n%Û'W4'¹mî К¹­…K·-b+‡É2ˆäÒ Öm—Ôò,W–z«z˜¦1ºª¸\ue9l·:l’×28Ö¡k/:DÖ"ìò85-úÃò#‘±hºÃ#è;ñ¡o gbzý,Ì­íFÐ0óx€š®F¿s'Ñf íÏtÌ}íÛ?F2Q(w£m^$ÿ™W$êÐpîꭘߌ¾ 8d è<¡Ý†v'Úýh£}ˆµ,£m+¾7å´¯  ¡]„,7Z9Z3ZíhѰiÓKhçÐ>€>ÚB´õh×£}íÚ .‚¹>â:Øëláá]ç5ÓæAõb²Tvhrâ7 _ïu¶lƒê¹q‡äxÎ ’¶$$ SÛ Ô8oH®yømmå{±j„n<6¨~Cç¹S´Ó6g`˜¶ ¹IáV–9B\žÁÄ=j¥Aš¥W&Žô«Ñ÷£¿>މáC£“Rž”rǤ”褔É-X=)eö¤»8æUQ’ þé/‰²J|Žöóƒ0“_S$_Uæÿ…¦ÿO4†«]“T!.¥âxŸêòòì9šÙ½F¨Ú4î_ƒ§« ¬ÉaÕ_)û}Údm1Þr“Ë—~жŸÚí“>O?õÕž;B(©öÃ=wÞsϽ÷,ï¹óçß?ÿ =bœ‰ &’^ìÄ$ûšâ¡ ˜`H H 8% # +À0ìeb–ÇiyQ3 ?îÅxRÀS^æ Dw *ýa\„Ce(edMÕ0‡T=§9(Jp£ýáP¤Ã¶c:Žß¿+8x‡"ƒE…ƒÎè8RÄN:ƒpx8*ê\VG•ÞÁŽá‘ðÀ@Qíæ°*Ö;è)ªxRuƺºÂKVoOGh ¯¨ñp¨Ö55‘4ÆL$M­_5M-cpX×=©Î¨Áœ™Ôƒm\› –Ú88õ¤¡Ñ醖5µD§žŠOqØÚÊŒ'²§ôÄh0>`6ABf*¥SSšÑÌš´ÛkžNkQ3CWÒåÇì{tÕÚJ2˜IhBÍp¨8âà˜Qur9S'3¥Œkæ`ɹküMe­C©ó¼`m_áð7Ñîö¤‘4÷s¨óGVn4 Ñ%QSOõ¨éAuT×,*[eì;sccZÆÞåòG¬Y0S‹Þ¹µS9UÏrØâ¿mÖÚšŽ 2Zœ1,iæLò¿Æ´LxDzº¥=®¡¸†Dt£GÄZEô¢OÄ0ÆD<„‡9Hÿ>€v«‰£ÞRòûI8Gi˜Hk>R 6 éÃæ}Øl£ˆ-މèÇa´rØ´tWD×µqUïÈŒç¦5Ã ÏÆµ´™Lå6÷ætÝgûâ›aäKe|Ù¸jZÆg²l°ÎŠxò8'â|ÊÓñ™ˆÏqžj·²I=¡Q‘wF Æ^U÷i™L*³Ãç‹ÚlZ‹ƒ—_ácŒÚëñ¾dâ+#äñ5»[¡~?H¡úXí¥ÆÓâê莅÷ù™ý7"Nâ[£ˆ‹Âß±æh'1°â€Rzâx¶YÄ|ÏÁw;,«Tßè$¹Ì°²þŒduÿѵT¹iÕŒO°TÜSº—µ@”è¨q­­iEÓ÷Ø›Úʜܳx‘3­«q­+™É’k[˹V®Ýj:­ Ûÿ׎B)iãzäV˵廑í Ýjß²œÚ‰¶š¯zy¶T¢L†Y—9ŒNáã©étR×nV™gé—³“žä*¬ÃÝô—¤B±Ÿv¾·ï&|_ ÞCøþ¼—p[ n'¼¯ï'| $ÜQ‚; ‡Jð!ÂáÜE˜úÏúÅQs[3=(ÖL5ÓScÍôXó€eç¥/j’1BµtÇ´ŸÀѨh½ ûÇIMSÆÆÁlv]*ØP+Ú6\\pÒ¼-°g€›‡+ y…[qÈ|TqÊBTqÉž¨â–½Q…—WEA£Šä–+Iòò$™~ª’G–¢óä‹äýÅ¥8¤hLqJÇcŠK Ä·Ž)¼4Si8F»¥$y©¤ í'é‘‚±yò²eU†yT'ç!7\´\FÖžà¡‘¦±§dŒ”{(Þª¨¼†jE^³€šß? –)ó¨“׿±Ž.šC«mÖ¼d6‡ \C½²€y} ylÈãN¶zÅJßQ+¹î›ø NÇ8Ç)ÏRTQo%÷‘Bê(µ”\¬ 4´äák\ÀÆ+Å œ(1rØFÜp¯/1)–û`¡”»ýÚD~‘ï2¹&ofßyÜE“¼ÅÖS”RS[ÉïEbœ„Z8íVAs#E3óp9.Ù© W]_Ä×m|c W³©ÙºaÛ9¦v^*æÄ gåêÕµ„F‹žËÏÝGþE_èy/¬_(ørƾÞ-¯½Ì¼²Ê>T(:[ßM£žB(ফ,…Ë"]\³5 g!ÈÍsp±z—®Ë-Ë·h€ÛÛØ0Ä#q“4¬¶L&¨ÀnÐ0VðºÆŠ‰è(o¿Š?¢Ö.þPK 8AÒËAĺ-*org/hsqldb/cmdline/sqltool/TokenList.classRMoÓ@}ÛqRÑ&Z>[(Å K=⪠—@‡”H7É*¸Ýz‹½®×þ“þ‚ôÒJ !ÎHü ~bÖ‰RbÉof÷ÍÛ™Ùï¿>°‹ ‚%ܶp§‚2îZ¸çã¾ÖÝô±åã!a5“i,T_¦Y¬“·zIXië$3"1}¡ré½:û!èç3&Ê{q›}‚4û·­G’Ð º:‡ï³j4‡Ç#'2ä•ÑZ…úH&Ý83‘•x“‰’ ÛAs®(âJzF ^‹“1PœÊå'„`q‘‘°Ü‹Ç‰0yÊbÑ=§"ÌM¬Âçi*&6fo~ûÑܘžÎÓ¡Œª¸ŽU ªØÆã*vð„°9OÍíXä:öà¡þŸ[v+‘°üÓ†¶VJ ¿˜Ž›ÅŸd1Ý;•Çú”— Óü£Q"‡o‡,‰°Å/i Übþ×QÁ5¶U~~%¬ÀeŸ[Á¸Æ;kl‰­×º]À~–®ÍèKJlË­§W(ýåë¸1ãf­¼Þº„ãžÃ£i˹„û Þ´m0:  »7qk¦jØ-¶Ë_P~ljýéìàõ¢ÆßPK 8A²[Gû“Á,org/hsqldb/cmdline/sqltool/TokenSource.class;õo×>#.vvvFÖÊÊœÔ F MŸü¢týŒâœ”$ýäÜ”œÌ¼T} ¯$??G?$?;5Ïš‘˵"9µ $3?¯˜“‘AžàüÒ¢äTF¬Ä²DýœÄ¼t}ÿ¤¬ÔäFa°Pf¾¾§?ÜT6FF&`dad`f`òY<ÍÆÀPK 8AÜ+'·(org/hsqldb/lib/AppendableException.classSÙRA=…É2Dˆlj‚ˆD¢‚+E@\‚ êƒ iÂà8‰3Â7ø¾øê+®ˆVY>i•àè›U”z{°ʚªÛ=÷ž{îÚß~øà8î†PcAÔḆ®¼èVâD'q*ŒÓ8£ÄY =JRÀsêÖ«á|•èVÀ Ф[‰>%.*ÑÀ@ƒ¸¤á²†+ Uް nŽ Û1 Ö­¡6ÌPÙ_°É-9ÆÍ9áÿYûãíôý|†Á“Î2DÓ³ü1OšÜÊ'³Ò6¬|Cˆ‹ÂÊñ¼pˆ¶„˜“†™LŽ${0kä-.çlÁÐZfNm'ìU”y!3Âqˆ“¡¦½c§°¾þBެ•Yɧdxq”Oš‚C}Ó0D†RZë4µíÛY:Æ*R†eÈ^o»úmØ ± O¯‹ŒíÀðOp 5eºÄ:¢UÇ~`¨+÷¿87=-l Ñ1Œ«Ò:2¡ t\Ãu7p“ºZî§#‹QhÒq ­ »7úÚgÛ|A5WÇÆw\‰N%’ JKt:¢Èm. ¶†Û:&p‡¡¥`ç“3Î#37™4Éd_i¬TÐàü”(JZ“µ8n&›´ÑèCR¸¼ÔØÒ;u~›ªÔ ldëŠP+uκµ]Ø‹œ´y鎑ŠñYîÏÖݹ69+¦ÔJV˜ÂÊËL«…R¤à¹\Ù®¬z)ÖÍsXp¤xȦU½nŠÂ– mÿUjšéáÖÓ‹÷¢¾=`ØKìCP •îLm ÉfWßî´H$‘æ)éütÞ‹-¥coàù |ñ#¼Kðeâ_LÄßÁ?®L˨`9² áÓ%ÀðÁ³¾Ä;„ž#œx…°'öøÔñâÏw2è‹nm$á_ADÃáTkh_APCÇ ZH󋦗øjb]T’‡Î¦RN‘ØGTRJ‘·ð(M|»<¹Ní‹Ò•ö• ŽÜ!ª¬*ÆÈOábÖ‚ÔF ÇâK¨.u’« JÀK§‹'–°{*€£ë9ÕºÁhÍ{Ô¾F¸Á_PK 7Aàa¨¿F#-org/hsqldb/lib/BasicTextJdkLogFormatter.classTÙrA= ÈÀdâB£&j\!2îKˆ[Üb‚Fâ:@KFgÚ%Ÿâ/øä –Tù¨Uþ’–åí0Ñ å`è-6ú÷ÆOPK 7Ah Ûê«ä(org/hsqldb/lib/FileAccess$FileSync.class;õo×>#>vvnF–âʼdFf Í0F.׊äÔ‚’Ìü¼bvv^F¥ü¢týŒâœ”$ýœÌ$}·ÌœTÇääÔâb3¬›ÁäñÌËK-rÎI,.N-fdÈJ,KÔÏIÌK×÷OÊJM.ad eæë{úícdÄi##0²]ÊÀä³y š ˆ¹€l.*vN6NPK 7A¸»ýæŸmorg/hsqldb/lib/FileAccess.class…’ÛNÂ@†gA(rPOx>F𦉷zƒ°&Dˆ‰7f©,)[ì.F_Í À‡2NUJƒE/6Óofþ¿Î¾¼¾À1h°£Á®{bç¦Å/ , Á¢Å¤ä‘Vè%­6ïê´P"@ÊRE[HÅ„j1kÀÃhF, û”^Î*Ôíwka k7õr“ºÉ)i¿±WÐÌ ÍúuµXøÎÇ,Ù}.Ê¢?P åpÖ£ïq¡äs•.{bºÅDGÇš):'ùï”ië>Å 8}6x_™8û–]ÓÚ@ýv=úÓÕ/AÛYSŽÉƒä·8mŠ_1ÛJ¦#'´¶ð·9¼g?qÏY°ÞˆtÁN‰W£ Ÿæ‚ÇÈWl§£?ÈGë¾­[f[w%ÃàRîÕ8kvbN7z}­Ýå~åîÿ¦2Þ¶jÞ‚¢xÛ „»@¢ !ÅB0÷q9éãòŒg‘ç|œ ïßüƒöÿèÃ?iÿ=¾¯ý?ûðíÿŇõáß|ø°ÿnà‡>ü¨?Æøð?þÿåÃû9чÿQa_òã§xÙOAþWG¯˜ócf ;E8‘"m<†x}RL!¥„”bøÄç—RñkS¦©Ëå>YæÇzYîÇfǰ²B› C>©ô〬T«x£¬Öf 5”*mªuºV›u~4c†¬÷Ë٨ͫôŠ 6×ød“O6r­O®óÉ?Æäzmj ©õc\ê ùS1©×¦¡L¥I›W«–/*ÕVC¶rƒ'•°Sn4ä5‚周è¨ïŠ&’VtÈNp¥û¨uÂjšL†#M=ÖÄvÁŠ£ÃÇbݱÑvÛ'쉖Et¶ËNv;ÇkÓ§"Vt´)nDì¡dS‹ oÏP“4½"(Ë,8g9g÷9Ê£Ôü™ÝXÈ^W>扨 Új ùS‘U@˜œ•±xlJýà¸Æ˜ˆ‡O8üöÿÜüºòrÀ[˜ìèðdÂŽ;÷4þîQ‹GÂQů1eÅ£\$$WÄxÃÑ‘çJ‘ Z‹íx¤Í¯šr¯Æà›å-ºû°‰à Sî“û y«)o#©< ÍÛåÚ¼“~ëvõI_85fGƒê©ñ [€´Ew3ÎLGèp¬©#ì U§c±qŽW«÷2Úæ¸‚—)âS™<æžîŠNL&™Dlk\iÞͬ5³}9®|H&MyXÞà iÊ# ÊGe·)ïU‡Uf8víͱޢœÆ¢ÀÄû”|]Nú²‡&5sŽ•Ïc$ræç]„®•Ô´¿¾`ÓcE-­/xX’ Ä­!»=bÛQ­–VÍŸoNŽ+ÛÅ—S^fDøtº^éâãcMLð}ãí5]ùµ’ûyCÁÇ~iú’cö)GÕŠL –Ñ~13·Ú»3_2–^â0œµ×êœ3vÜ®ª´]Ž›1f%z™?h‰¨Ó-¬³Õg‰}|ÒŠ,. 3â²Ìô3|âÉÄAÆæÕ#‰<Ö0­[·Çc'ìÖ‘^[B´Å"Z'ÓQu±S’RÆ‘X¼×Rð_wçK•tzÏ”Öw8s8¿¼¹\¹¾f‰*‡â/Y ª–âHk†£'bǨÐ-¬yøòxȺÄÃÀæ«U€ÃU2(îèêmï£}õíêÝE¹úÛ´÷ña-Ñ­þ…•ˆ“Šy/+3º¸;“øÖFÝ ³='Uä,§kÓh2Â,£kÜ´Ã×yËUE’~r¥ñ×5Åí6+AÛ•§ßðlN.ü¬¡óaÓ8ôÖÒrÑä$ûd*ƒç³ûNéã ×õë—.~•²’Òõ¹Ïhk"c‡Ú¥õÕì:Ÿ«)lûá6·èpÓWUMAb½°j©OÂù:½À­…?!ýŒÓlͱ±¢î®sóJeÂÞgÅ™{Ý ýnžH# “œ‰Ú$Èe¬’ßÜ=6QàU§l¹B"ÌâVŸË–Ž¿Òs°î2ÛÄ:i -\y6{¤ç^*ͧ¢ïgüªZú³’¶ýE3]òÛèú«ûÔ= Ù)‘®;*æÑ¦ Î&a1ƒ•»¥Ç)5QBóx. rž\9ߘ†­koR—é[“5?ó|,aãtb3~ýÖâȯ&NÏï§¿ßé‹´´szÖyÎ:¿„دE)Þ…!x·þ}ûú³e2xEçá™WBq $Ùût^š‚ÿ)‡¶áa÷ü³<_Ìþè,ÊxÞìΘA¹ ÇåZGN+SXF-Þú,œA-+ŸGEo)Ãl¨ö¦PyfîÛ¡†¬,ÂÁé¹od8†f°Š+çx›à=lï„g!xÄÀ£ÞK«<ÌÑ@ókÎÀYõçQ§¥XZ“¢#œQù±çi¬–=έkü¦|UüWX{ëöLÃÛ]÷‚ôœÇÇPÞ'ð½ÀFî^åý‚ƒžJTô§p ±á<6…„«›=k¹xÝ ¶xpÐÙ¹>»S³h§6»S·h'”Ý©_´ÓÝi\´Ó”Ýyõ¢­ÙmKJpÃüN]àF#«à 7ðêÜ?X\‰Íýƒ%•hV¥i¥ºÀM ì@ã£-nv‘¸…P¥Ñ”B ­ÙãX¸Z­Ø~·v‡^@y(p[ ·Ÿ÷ÜEÜÑswžÁÎúZg±ƒ\Úzf±sÐsí)t4PývÕW¢3ЕÂîöº/¢§Å[íåFoµ×“ÂÞid°o+{¼t0% ÜE¸Öw^Ta#ck=¶È]Ò‡õÒ/‰¡Y‘oÊw¸žFÜí(›#™ø%m~?ÅON³Ÿ#E üŠ®à%àel Æ^Æn| ž¤ZÁXy,9SÄ ‡}WÝôŸÇêÇÑ|U—°¬.DáŸÁÀ4®«ãŠëŠzâìŸÆrFÕÁÀÁú xíó„i¨.í sd¼Øšw¥È:•쌃÷ý¢Œáϯ3Wˆ•ìEñ7x‡Ò®¿æRì Ðš"jC—௻ˆÃÓº¾ e¢ZsL—º,Ò×(*»›w;ü~Ýåw‡Ëo‹ËïÐ46àWÙ`†Ù‡\f7Ñ‚*þ&šV¸»ˆû+Òã×1±t>5‹ÎAøõóŒx¢šÃã7\&U(!³.Tß@ê*øÔL>¹@Á Ž={£-^Gnfè´{H&+ ¶¸b{—º!#t p0+t)¼F0J)×;Îúh޳<®³d‘³>–­µ¤R-«sí"ºé‚tµyt/HÊ£ûDAº†<º' ÒmÍ£ûäUÊ÷1œÍ¡ódõ­ÏÓ·]mÝÇ Ò…òè>Q®!îÉ‚t[óè>yUò•êÝ·ºkrík³ „ùjŽ^À±=L‘ÇQì9+ÝúnÌb\ƒ?Ú=‹a7ÑÛÀsœAoñzš‹«½3Hh!Òÿ@±è$é#-%õÕ,}&ÆÆ%¬ö4ûø"™uOËK(ÒGæòD/*Qy>‘ŠáÌçžì®³6‡eZ±e|fIÒÌ eóKéϤ°°KeÊ<ÜÆÓúd¬ŸÅIbâÔÓðdG.â4+’=šVb áøÆù×ç ýPK 7Açz)ª/ org/hsqldb/lib/RCData.classÍWyxTÕÿÝÉ̼;“I& ú˜„DÁ¢N@ IÐ@˜„`ì‚/™—08™gÞ—ÚÒµjk+µ-uéT[Û`e@ÓJíÔî‹Ýìbk[»Wkk1é9ï½I&aRýúGÛ|™sî=÷œsÏ=÷,÷=1öð#Vˆ•>ôã~Äp‡Ä|HâÃ~¸qÀàNw)¸Û¯ÞÃø£ ²c|¯ܧàã~ð ?*p?ƒOú±Ÿb0Ìà ‚ü²Ö >ÍàA‰CŒsÌ}XÁ‰‡XåÃ#ŸñCÉϲð#>ÅçüxŸgc¿ ñE‰/IŒJ¤˜pL"Íø1‰Œ—ØÅø ‰ÝŒ¿,a2þŠÄWMbˆñ×%¾!ñM‰oI|ÛO„ï0xR⻌¿ç§]¿Ï£HüЧð#?VðöϽ?õcù´ÄÏüø9žñãø%ƒ_±Ø³ ~ÍæÇoÿ–Áïü^â¬ýâùsÏKüY≿HüUÁß$þ®àEÖú‰—üˆà@)þ‰ã/+¨lnY׸¥­kÛúæµMÛš;Z»[:m;ôz}LÔwš©h| A ¬)O›zÜìÖcC *bô뙘¹>ÒÛלŠî4Ríú Ñ]ш@I&™´‘Š[T™ÔÓé]‰­¹Ì¨€7b‰(}ÛõTÚ0üf*“6Óf"EüJ,Ú›ÔÍí³i±yúV´ýÒ\Ö-ànJDH~Þ@)ÛÀÙK—;Ÿwu45ÏXèhŽ&ê×EcFCñ}Ê:M½ïŠz²KïädãtS VߥÐèT-»ûŒ¤%ç \_Äèÿ&… ¿õlCq«îù¿³j†k§¸¢Dˆ}|¥sóÁ”¾2V?¹Ð !Ððª5“UQE”T»“z<Ò9”ÞœJ$»)]Î(þÅÂÚCéÓÕ*ZZt›â§ô›Ñ®„=çLk-¢YEq× ·ÀüDj n;iŽôÖí l«ãj’OÔÓ'E[c1c@5¦2ƒFÜœÈ ÒÐѤõS²i\-´xÂÔÒI£/Ú5"´öPr©Â#¼T±ò¹Ùº©@~îtûÖf¢±o¿psÌÐÓ†FnÐ2IMϘÛiëhŸÎ‚öžKT¡ÉÀGK3?®˜“ßhm¦¿ßH‘C·4 «ƒMd?”2PUQ†kUqƒY¢\" ´D2f4æ˜×•¸ÂˆG¯"IQÉ\³yG0¾MUìÓÊÉœ“Šp*•IšZ,746y]±kK¨ô- kM©öF#ª˜+æ)"¨ŠùâdET«bö¨¸¤Å³Áb2Žeô“ªˆ¦Sö:j‘â«M3ØÉ`ƒÝ L—fJ§£é„Š ‡˜è[«Glq X²À¾Drz"Å{•.a+mSPtÒ9†jµ%N™_b³g’ÉDÊ$k† “ï}ƒ(£Ô°Ú]z:¯ZŸY§ˆSU¼·QÑgŸí®‹f]:«³úI'÷J&Uhâ4Uœ. œbù–Øê7ê1²oЈléh+p³ß²šhlk¹5áVfG§å8&å[š"©b±8C¡ØÁb)ƒe*Þ‡÷“ðôÀ¤þ·h*B¢†A­*–‹:êIì½z*ÊÍ„Ïf«*êùT ÛÚzÒ¢¥‡Ò¦1¨%©)sHÛ5·;&‘ì¨îêhlïllêjÝÔ¾­£¥±yÛ–ö¦M7¶vuµ4S–°\°xòÔÅÍ-]kÛZ,>rmájgKGkc[ëe¼NG,\jßÔN¤ª‰RÓyI¡_uqäÔi;±::/=$¦]|ïÅOÕ“z»žÔS€Ôw45릮Š39K\aª¢*Î+êšèŠƒš¥W·JšÖJÊíìŽS™IQªÇì­ÂÚ”ûØÔ»ƒŠ €Z˜ÏS¯k{*±‹oD@›¤6ÅèÞÛæºD&)8ÜìÉ$ßl_QÔHçõM-»ô@ZÊuVéÓã\A¬ùe”€z2iÄiºüU•w§È5Lã·öoù¥9QÞ+¦=wØ®ÊIš]à,ªLѸRœJ ’½1#>À42ŸzŒ—ßräR7µŒ&Êù>r‘iÕ:r„/nì¶'Túb‰4é©.Ö[&ÍôWfôXzÚk/¾Ë¦¦—•dJ"CTM`3©¤*@¶6´2ÝC’g±¸Ýß oo^¾¿O»W6.e &vÓzqç;$2-ɦ[„ýU*˜5- Ér*Dö³vñ+„Œ%Ðïkv‡Þ¨ÇõîkËfV0íÑ °ñ?|®Í¤O‰Æ#ÆîMý3¼ë)¶€rÂÕao`AXÉâR‹x7æÚÄå9œÂ im5otjž°Ú„­§‘‰U2‡Ó óV/¢`›¾øhí1Ì zgä°äöñΰ4¨ä°,;~qž=¨ÔZƒrbèN ÕBȽÊ_X|[ÚH%5`å'álM>ËŽ=]å¾}ì)Ú¬ÎÚC •C¨ÏŽ=F¤3 HgeÇiEievìN"]@zMvì&"­* “»šHçÎËŽE‰. 5dǺ‰´º€´&;ÖTü|翲['EØ—EU¸t‚¢%XÊŽw$ÖCm¡ò òλð„@[|”ø×Œ:ÚÈz Å(‡çŠ5âBH×<×—FøW·«—ÒH§(ïsmw]AtFº• ×(âqÌC‰‚7)x³‚½ÀLðO¼…sH(x+0ŽS§-Y"öbÙ)'_¤àmbu'2Ùÿ6ã¼Eß ÏÜ€ý7³X^·Ãá™Á0o‡jÑUïàA1[¸ëËñNq“k4«P¼Ë.X@š%דPMíò ;è zƒŠ8ŒµvÉ™*´Ï"G‘PY(”$ÖTLìGl?UM?ám“E‰«[ˆÓ®>´œR!tS‡‚>ŠÛPÐC™ z)øíx%oPN‰“šQ(µViÓzÍJó€e(G›ã–½3ýŠoŠÅ7â&ÇâJ²˜]­„„È¡exâp’Þ6Xì7Ûìâ%RAÍ¢]„ÝG°.졪;—b{å1È@I–Ѹ= Ysµ“ÝsˆpÎ(ª)ìÎÂWk ‚nªHAOàâZ·fQÆÃ ;‡õ[EØËéÅ\Þ,Î +#ØÏ2.rmœd 0'ò¬ý¨³ gb5#V¡° Y¨B:*6Ù*Î:A…$êy£8“«Y, û Uø›'Å–Á%[ƒÊ1”½GБ¥²bEÍt†}¤©a”(Öຂ¾aò°ŽÔtݸ÷c˜ð³x/X×Ä·»c˜Ÿ¿Æ[š•¸çxfùÆq”îü¾jJ‡[kÇQYt} ‹o&–<—Vq±‚÷GÁ‚¨Ø@qáãÏO§U?E{9üG°¥‡B¿»­&°5‡K×TßAÍ{kʯ©ö\žCÏù ,Bº†¦Ô/sªûN'Þ_ËñôÁëìèXÄÔ|u}}¾NO^•÷¨³XSRMê˜ÁÍ¥w›v{ƒÍÕ–7k†'2¦Þã|ð½ÇQ&Ž£\¼Œjª1{ÇQ ¯SçD>m^Äb:(}Ô:Ù²ZB8áZSØf5›†—ÛC u{¨Ð°×zË%ûlr »„zFdâTYY‰þødÛíÆaŸ.z4Týv¸0™ï¥l}™ðûKýµÍ—q;Õû2®$[9£·Î¿ÏJæµ°ÿ¸^@¿•ô[åÐÏspþ·:°m8pùp@ôú†óF^A&ͧ¦IfMzRÂ{¶‹ÿ€PK 8AŠMîœåè7org/hsqldb/lib/RefCapablePropertyResourceBundle$1.classSÛnÓ@=›¤ukLã^BBÅ%-Ž[É-¯ ¤T”Šª•xE{“le¼aw©-ˆ>€BŒ]"U4<„•¼cÍœ™=sûùëûO±»ëÅuÛÅî¸h஋ ÜsIwßÁ¦ƒ‡1xcž6û2GÜVº§|Ì£”gƒèÄj™ ž1ÌÛ¡4Í=†ý®Òƒhh>¦I/Je/:ýñ¹k5Úž £r‹—y–¤¢p~.3i_0¼fö¾N¦õŽ¡ÖQ‰`¨ê ¬u–­ãe‰âKdx‘á=ð^àm”+dì‡gex€GnçÖƒÜ:Ê­‡¸5€Çdø:œ•ñ8Þ°t¶Íw円4ƒr†Œw¢*ã ÆeLà15‡à,rV^6wU*mçüRÒSÆ$SŽh”á m)Þð.¼aEai/ƒ©­íT\ËrÒ¥£¶KWúÆL%ïÅÔ,eH7û $)u»:%•Q²y’Q>-”z:¹šÈà˜FX}+åÉ¡TFK¸³ÌbPVGSºSX¾3d Ô1K:²ˆIgpíÖ†Ô\š-Ÿï¢päÿ÷"˜÷Oj2Ö™˜"²~Îå”Êg 9ÏbçóÄMoóvn¿Rg|z øæ/8tV’_hY/µ¼Ùæ9eýYÐtç®’àBœ‘ÕÚZY«ê‹ŒPºçÚßÅ ³Ú5µxÎHYcÍ-ö{£•Œcèé4#SNè=Fj”raR#ðnvµž^Q˜l‰Ûß(Šj\FC©´“u¯`çÙºúø%£ÕÝÕnßoŸ¾N X5ýÔ"Q2ù§–çrà&.Yî¥)Å/#~Åm²Ü+àôqAS°zá~X%üVâ7ü„±ëÜúA·~È®%¾]ÒÃãöØ¡ŒoÄv›žJvý¨[ÓŒê|>Jô³Ç>NýOxúŸ¤þ§<ýOCµéÁFíÏÐÈêÑ;ÄðóP2¥gø[”»÷géG·Tšgʧ©ç§údx|á ÿ<Ίv£,9R8zJ¢° æ 7ž ‡| Ÿƒ…vcÑ9(·ç ’ö[8AßS´52ÅóPîé—S¿ÒÓ¯|ÖþFö9*W@鿟à <%ÀÓ<P^NôöpÆŸ’¸Õ‘ XÜE …Æ Xó•nñ_€ªþIX °8ËN£/䣯ò˜ÀýïC>? Œƒce!á<¬ˆ‰¡²W`SH|ÄàÊqX*»«ˆKupõÔ„*‚ °&DF¹nÖÒ"Yõ6j8%¶»éwàÔöçÙ¬›f³žŠFnÔ9ü&¡þ¥àʘ8kÆaµwM¬š€°K ¸U~V…42W’b÷ÇÁ¦Ðt„Çš·øÇßúE•ŸL-4Úìm¡Àl`9ªÈ%g¦ðTLÁ*' íˆqª¾ð¬¡î-ô{–Ù_dšš†@ÉŠ)X ÒœEýC‰_à+S´ÍåÈJ2jþ —ÝÎCÈ/NÇõ% ]×'§—Eæszµãôó°É—Ø"õ|•½øHÑ*q“= 06‡õ \Oª}w’/¦Q ¸(xA®ÚF!·ƒ•ôë _ŸÇ¥Ñ‹ça3ûþ.¶°÷ØqsÑ GCu4Df¢Að¢A(‚†:hˆÌEC¤(ž€à[°ÔõÒ›°Ýÿ”»@˜¢¬#åãõ«Xp'; Á-eÃLx!œ Ž"DE¡ñEøš›ÆV€ÏNc‹Âá™êÆh)½ÕI{_ÏC–j9l§hµ‡ê <ëRí"7rúÜ⚉ð&±§n¢ÂÉp5Á˜Ó.÷´+ tv=ëò3iOþº§cÚw[gÔI‚máÈ$lïŒVË›Kž!‚;‚; \Á[ìʦ{VGmúÄ´THŸ‡òhi¾팞‡]—•Aɰ‘¬³†šÏM °‰¶g…Bg¡•ï>M9~œ¬l£Ú¨ÀA€’ò}lÞ2xÎyÌ[â˜÷<쉜‡½ôÛç(Êtó–ºæ%ÁöF§©$þÈãR‘«Ø ñÈËÐþ8D.Àþi¬`4N@Çt:Ö\ íÔÆIèzé,tG^€ž:è*œöÁ¸½g.@o8r Ú£“Ð×ÅS/À¡R8ÒXЋh^NJ¼/º'ÉwI f^öx¹¢©¢yn¥­¹>L’ÔDݬ°4/â̇WMc±éÆééÏ_æçt ‚·9Í%²þþpÈ? ·Ÿ‡£—`€2ZàUX}…À¡m¤de†v«‘lrŒC=PPò— 'íP ROæð9p…ù{~ñ¼óS°1>Ìü¿Àßà›SŒ¢â¥…ÍF¼¢y9ù¦‰è?ÐboÏ_"Ý£â4ù¶Œ¬òcì,ÝŽpÐr°r’ÕbþÿUhöâ»šà\Ü™Ç^/a/ÂØ Q‚T¿!vŽC*ð.Ì/Œs‘àBcSfšÉbæºáüºTqêj>¢V…üQjTÛ»ú·øž„ÕU¾;wŒO½>gò»û üXô8ˆÎÂH~QÆC;ú8DéTskbâlBqš0$°|Ÿƒ›½dÝc*x‚ä"·Œ¼Pæƒ^«?ÌMÂèV¤¶?˜„S³Œ4–_ÿ.qÉÛû ú Ö®†$Eú÷àûÄ2\„•ÔßG­ „‰Mx#Æh|µ¸ŸÆgà¤]Ÿ¡õN(ò)bÈÃï%z3È`¿—N ðrãê]\î¥â¸ßš"ÄY´ü&ÐáõòÊŸCÉNZ÷[{—*DømxÅÍ„•î=ÝOÀD'QŠð*¼æNרI`ñ¸—ìqßsÐ|']ZŸƒÖgC×Û¹¡ß¹~ü PK 8Añ‚Í‹ò*org/hsqldb/lib/RefCapableRBInterface.class;õo×>#v!vaFÎôÔ’à’¢Ì¼tF MŸ¬Ä²DýœÄ¼t}ˆ¨5#ƒºF4¦0V•‚@Ã\+ óRRS`†ŠjxbU+¦á‰]B(]F]ÓH‡¨k`Šb7Sh‘†j`³—©XTbWj‰ÍT"]d‰ÅbˆM/±!¡’_”®ŸQ\˜“’¤Ÿ“™¤”šæœX˜”“ää™W’Z”–˜œÊÈ €Ð꟔•š\ÂÆÈÀÈÀÄü,Œ Ì , ,@šH32°AùlP>3;”æ€ÒœPš JsCi(Í ¥ù 4?”€Ò‚ «PK 7Aä¯ ã org/hsqldb/lib/StringUtil.class­WÝsSUÿÞ¯6Ü–ô#­1 PPHÓ†B•*¥! ´Š´€´¢M›ÛôBhBr˧ø5ø8ÎÀ8•™¾ð€/‘‘ñÅqÆÇÿÀ'Ÿ|Ðá ¦Rwo.I?n„;=çîž³¿ßîÙÝNyüý}øÜƒÕèհà ôzðvzÀ.QÖíf±‡ÅÛ,Þa±—­},ú=؇‹ý,x0€ƒ,Þås‡X ²Òp؃FFàxOÃ1^‡5Œhx_ÃqµÇœ2­^)ÔzD@ަ†@•6²éƒñDÂH ZYs*)ÐêïëkˆŸ‰w¤âSÉŽ‚a›@õ ?¹?žŠ¥ €j¬%ZCË/÷E‡]]v»]®r¿\m¥cé³Fvpz,gX\œEÝoÆ³Ùøù¡ôÊëÞ;aŒ[Û\.Ú©Ô’†3s„·/4²ü̳hʤbÄ%òg¿ÜÿÜ—c¡‘ÿ3ÍÌí9•±Î ø\¤u˜ÒŸ5““ÖPÖ<5h^0ÊœëðäNš™ÁL|ÜÈ 4º• ŸRr™”IϱÕ個_—P©t¬A ,µíšž˜0²>Ðñ!FuÄ1¦c &X$uLÂdë öa²õ¤ŽNi˜Ò‘FFÇiYä4X:¦qFÇYœãËçY\`qQ 9MvLæN§c)s¬c/mwrrµéøÝ:.ácŸ`LÀ»”©ŽOñ™@½K|þ%¾ †Ã–™Zä©PúÔÓ%U,Í Ri{Åêw}v5eL%­I{ÄЫTå¨+‹WÜŠÏdŒ©„@ äÒ§…ÔÓ±v·ò(¼Š†AÌá"2Í»†+~c¨Ì¤SÇ'ãÙVá~”’Z:%K|Ü2²+Í\̰h;Ým&Mûx”ë›:ÀQ¬pFT4ž3 fòÖTò–5&R”ñû‰z²DÝç6“(±RrÙ¬s¬‹bqtK²Wv¶³p{«V—Ç/Z5s*aœ˜ ’ô¡L”9g·½f¥¸Ÿ6Z°Šþ²òO w,ɵôUK« U ßøÎ>P…uxÅ1­Çï¡âØHÝòªª/¿†ºjzǪ»»¿’‡Ò|+üJsª£èR}jó jý²wSÚÑ˪˜ÿË/³±òhLU~9˜g™‡ç6¼J²Êê4¬ŸC£† sPÅ#Ô×¥ZJ§!Ù”ö…HöÉÄþ6 ÜÁŠn%x¿f$ŸÌL3ðÚô"¯O0£˜@˜CƒMB"ø: vࢌTÒz£ái½ ?C‡¥@úí0i>™·%jö5àSí´Ëtitau‘I;+}šm£{v*Œ¾E#ÙhºÔÙù?(Ž&RK>Í9îTTÊëyŒn Kˆ`…Ô†v'¤¯(£*­#Lo;³m&¶¤.ŧÐSí ûÈ_5Çz5W¡GœÊY¬ó)WÑÀÚ•WJÚêk¼v¶ÊöýÈ"2­Pæ©êTz^!ˆ Wß<gQ!Há«z…8F°Ñáx޾Z†ï¢¶' 'lžJ@d®ïE”ì™AK$Ì$êò¨§h¾OÄÛn3’‰Ñïï%þˆ,©=ižCÑÐQàÙ,6a³Ã"EÏ™Š…ï÷2~ÐëeønÙÎUp›ü²ýJ~™’ÖYØžM‘GÉîñËmüigæ·%Õ_é1êmìö'Èe‘+ÿyc /ŠüÚs!wäá{Qä×ä)ù@¹lw.ʶô´|ÿZ{c{ ºì^ú/¡‚ֵ១I³Ð¸7zß .|YÌS©W{×Üœ Ý’oýy WFiv@ðÄzo:¾¶8¾šŸøh á‚kó¨†oI%/*æ ˆr±ÝŽ‹r ÓÚb·h —Ghc8XpuU—%ŠðÏ`ÉO¤  QËm#OÓNRÝC#Mô¦ýR¯Ì]s›Ãmäð%ÎmÅuèö¬R¨£ÚÃA_aù)­m<}zé!yZ½ü(Œæ¤ßRbk9±Õ¶ ÊF@<¤Þ¿PK 8A­iùûæ)-org/hsqldb/lib/ValidatingResourceBundle.class½Xi{W~ÇZFV¦ŽFiœ4®’6Ž,K Û„ÆŽS‹z«­:¨ cëFždÀ¿äâC\<áLJñ>ô£">æÃǹûOðö“><åÃ'ýØ‚OñèOpןæâ3\|–‹Ï‰8ãÇ.ÌñgE|~¾€/rÍÓð%|™‹¯ˆ8Ç»¿ÊÅ×|øº÷ø œç¿)â["¾- qVV•”l°”á~>¦ågóY& eð¤<+ÇTYKÇúTY×»É|\Ik²‘Ï‘~Oµ¾§³¢§Ÿüô„t QM‰±‘#Ç{ûNÄGÆ(R\À }M7d͘՘ɥcÓúƒjj2¦*“±1v¢OÎÊ“*Íe²,gÌ1=“ÏM±Þ¼–R¡»iFÑuEK— zÙ´<«dršŒn‚\Ñ4å,/÷°ùüã¶PUîÝãFŽÜP,w_&Å©«¶æLÙðö(šbЪU×LPÇÑ4nÈS§†äl‚gmÎó9ß¡5) Ç“kÌ"wݘfFq”€;j>ZëÛ6¥.»än!ýsYYK±T Ê6CךCw(ΡWÚÔÌæ¶t®PG|µIÍx_i™Ö"žñ]»k(ŠÛæ²#ÄÞ´½Ö¥½a‡­O{ÛšÕH†ö–a{¯öƵ+$þ¿¬§ƒkÃÖZÙ¶ ëtð6$:DÜmϪÃÑ6b¶|ýÛŒ| Ž;ÉØ!{ƒ)p讚WöiÚB»~wN 9]s¡9s'â{¾ ‹xVBÇ$¼oЇ. ‡¸x#öÓ&áxNÄ \”p½ŽâÎ+>Çòš¡Ì°þ¹)–5”Œ&â’„%[“&ªLƒÙ\:­«\U¨È8öKÑb}Uú}ÌA©f…긎¢·r Ìë#v\,GŠA”Ll”bòrÉ3¼åe¶F¯„¨ °Z²¬ÍÕ]e_œÔºö>#S*ìn´Bó”å-•&8`…Š=¿¢ÇÍ·ŸÌ€]|þÒ)Í%Å©E¾È`Ø\0vµ÷«WV¯Meë  s~o× c?º™—дJï/sÔq´–%Zr*U$‚.½b¹Wo6²Ý8-ëC™ëW?õt³&ž7hlΰ:«÷^97Çf2³Dµ[§³·tÒOSÍ`i¾×!»|°“ž³ûè1胛_ôËÍï zLÞÁŸˆ¸­xº¨Ým¶{¨ýæŠöj¿¥¢}§«ÅüM7ù=d~· ý8Lí»©µ.Há„æãÍ{ hXà¯X+îiãx«e=GÖnú„/Âv]€› ÞpäÄpg¤ß%4^€Ÿœúßw%+­C(¢â@è4;;3{w§K9‡'¹Õ¶,•)'’ Œ:$³ ¹ ÈÃù4›Á»,»šd³Éô¦óŒWö¢ñ¸# §£Ñ ,<„Jyà…°ÂÂ1I¡4!z‚åÃçÉlvy5™a%w…Â:@³gúÈHæ:œOZö"¨BhæiúÄ܉&¶î><¥ïSi…O‰ÊØ@>-£’üêm¥vGn§è9©B­™îÐ^¶Á,ž`uó úð{¨nñ𯵴î.¾,Á:&êÄÄ tÒ×%¼¹,`o#<£ P[ÇÆÑH ôŠÜ„5ÁY=†95:½ï¤t}XZ1‘¡‰ ë¤?äÇ.V  «CÙeóX‘»‡¯ë›ë3·kz¶nÛjeNmQö£áÎ…*£Ã ¬ƒ €Ú[fàA•\Æ}•@ÍjPÊvŒ¬ñVÓË×Lõ}è¢kPl±ä±FžUƒueRùŸZnQK­ {ÞÀVðq¨Ò’7g|lëHlŸÛq ø†„*”€—Ư„ƒV[ê uY‡65ó/ Rª¶5 È2þ’ߪ?Î虫‡´AÕÖ´>8áªåo‡ý: Q¢iG:_¬×£Ñ¸Ç>.¾Ý/ï?Ãç‚/D~¶V›äšÏ•øÎg%ۙ߾àøh¼%=24Ìä=6 £†Š´ªUÈ/3~† ÂFòéŒûò•σ‹4ýÿ †Ü¼šÁoPK Œ®AíÆEâøW>%org/hsqldb/cmdline/sqltool.propertiesµ[msÛF’þÎ_1«¬‹’#B¶’ìeéÃfe‰Ž•%…¤íxW[.’°ðf ™—Òýö{º{IÑñÖÖ¹Rˆééééé÷i|£þ|ö•ù—Y{y‘åº(#mÔ÷?>û«:~öüyÿ?SÇÏûÏûßýðU¥&¸Ó¡ús§ó:Óó ŠKu‘Í‚X«qYDéBÚdU1šyV¨ñ§xBØ þ|x}5šœ\NúJ ƒ[­LUhUfª2Z¯z?þøÃ_{Ï•NgYH¨A®”þ\ê4IJ³eP³Ræø¦Y¹TQªÊe„Å"°Á*ˆãOko‰†ð6Ts]` ,¸hÜ0•?.£“‹µÙã÷—““ßúUêÝ2*AzÌ´:™¨Á噺z¥.Î/clBϾ<u~Šmn¥šêE”¦´¹l®â(rŸf%ßÈ.°ePj!T^ìRƒ!qœÝÓlÔ,KË(­‚2ÊRy·•KF¦€VEIGØfªïy˜Ù¥Õ]WÚ³`û§Y2Å`¨h.ç…¾‹²Ê¨cUTàÌ¡09ÑAJ”€ÊûÖ¾¦'¥-6¼¡]™h‘Fóh¤å!³žç<Î »‘²Ù‰±ø„=BìMªÂLóuŸ·*0À¬´™¹ö”zIªÒò£ÕMõìÙ³€…ˆ·>-tp v§¦ÔAÈg=©%ã, ›®ÔHÏOƒ<˜ÆúZd`5²Bý²JÃX*ÎÎIÈ€ÄÊÉJ-!SjuÂ`etyØð[ ߌ'Ø6½¦ƒxi`ˆ¡@%–S¬6]®®£ÉûË“áÀ³2êˆQ·zeÔð佺¼š¨Ó+Èæù¥zsy6O¯FâÔ¥03œ mX Ò*!›gAŒ½ AUf >c]eãeJ ”aVË$ ®ê$/W=ìç¯1ùxD(â,»eþÓDÅúgÌ*-ƒÏ>ý~…o¤©.üδšC9½¥Žs¿cr=‹‚ØþÊ[$0Eós`HÔüNhî¼,' 2øÑ<Á½ãÌ#Àè¢ÈŠ ÄKýQÏÊBçYQze–o¼)²û707à—ßI‚Y‘YBˆ=ÓBA V³¤µMŸ<¶ H% “>~Öœ¸ H‚W8ÿmPDÄYhÅBäZ"ãj/ í3æzž÷¯=¯FL‰V«NÚK*1ˆúó,®Lt§ý1”|†#UÝ^¯ÒAQtYAo:jÇ?;œÂî°«}CHS¯Ð!äbçÜ$1I°\™e˜ž}mŸöæ ,Ú+‘Vƒby׳X‰)zïuHs ¤$eÞ<ˆbÿþ'¢|_­Z€¼”Œ^(K¤' pB}õä÷çbeàÉaVEì%,]ø]üè*ëDc0…þTEØ!Sct Ö,¼u, è ý7©©r(L³S,Æ}bÆÈ` )X@bAGß"oþ]Šr¨ lgèÝE&‚”ù]÷¦Á”T¦„)»³zoý…ÚWX#ÍÒžÀ8,‡Ìi ´Ðýs@õJ$v«¬‹4%ÏCúa7ÐrU5Õ°âáÆùÒ+2s5ÌÎ3]ètŽD)7Ѧv`EVjì„m¼PŠ”1áÜ&V; Éþ¦°&äߢtžñ!PQ¨öÕÞ&öã‡ÎÇp:ó4¬ö4ŽÌR‡þ/g/OÕiƒ¨5FkL”ºóxº"¦Ñkÿ„õ¾{Øoÿä÷ïÔ¹Ébö¼^§¡r›=¥Dnq¼ëÒz]ÂI’Hˆ·7òÝÌä[ö€´ç †&t#ŠéM+BÀyUä™i>ÎÐAŠ0°'BL´ ´dsŸdSËLœ‰? îÕø× ÄUz«x gú5L·²G©Q•ª½þ‹=Ú™þ¬gdD§y(Í«róiU¬z4¶ 3Ù&TÉï±¶øÖ"j\tfÄ2q7~[Ê8tñ(ø.#C’¬ˆ{V]†etˆÔ~¹Ê5O=à_°s¾ƒh¡ÀÜþ·O÷ÉóîÁƒÛEŒO¢”â i~p"μˆ’ Xɬ`†ŒÀ°D È+yAgnádº×aŸDÆíÄ>¸˜™y ;ê‘ÇŒ( ¾Õ¥öÏ Fä$çQ mpŽzk=©T‰TYŒ!NxÝâ¤!sˆM NƒÙ­?’gE?ø$4½ #±¢öXþeæÜÚš‘ú‰E zZªä¢÷’åâè5^dØù©LD¸åâ¯Å|sÓB=–É-tVþD–‰§÷T£d#×Ö¾(¯œ¡Åôµao}fJQóléZl¨Rä¦éŠc_ä9a,RÅÐ8lô;n¯&ïúØŽ9âc)ôB>2éõQ´H^ìmyáúßUnÃP 4÷êäP½¨Ù 3–f÷)Ô–ÿ>*ŒŽÍ{}{4Uv>“qªI% ü¬ÈéYñá.Ò÷(BQ{ gd‡Çƒ‹Á餱-ÎAÈ6FÆûtü¶gÊT5Ì* ë}ª2Ô>ãø¤Êiü8úO þdõþYÆF’ivvÝ]än0b׉8·Ý¨4:žÛl“Tþ@vž¸Ÿ'ë;¿¹I8€<Â1/=€ª>ýׯÆÖþa§֌™Ì•_ÚþÃøÔ&ß©XV9„†Öî=ÖÆ]±]y/ŒB@"3:Ñœ¥úK\‡ðYÙ_[sÓ 6Ʀeó,e_4g®8CxÁ0+¼ ±6¼cÿéÓ§êÝÉèòüòçþVI™l—"ÎeÒd‚{®˜® ,TIýÅqÅË©ýÉð€oÓ.™Œ²*蚎«®‚S±Ñ¯%±ætå…,*¬-ùê•mùDx£Œ¯˜í¤4uB7¹þj®5WZ‚KJ6msàEâ*«Šº¢«,– *ÿ¼ìZÙ9Òºn[èXÄ µ\)aI`šÛ‰Â橆.gë´~íw]\úžkªo“ÏKÔBT̪œ€;ºªAxeoh>C‡¤m±$5üi'Ë*ˆ,èj"lIIÿm”ï&“:œZ%Ò/ÒÛ0Þ‘\F õ6†þK*Š"èmu'<Íi go@ñ’X‘î̤5  bÝ+’cîÀmÓç$qÙ¦žkê8TÜ!Æ,Ǿ1ØNÿÛCwÝ'Ç]õ %q{ ‰Ht•PóF};*?Õ>á ¦udE›žd9sÐß{28=à?ß?<ùý‡þ·u߆m áfËix“¬l®BÎë÷uKYL…³hÎmfaF^CÀ½uÀÚgN6Ô)›rÒØjyj&¸¾´ ‘W0í›ZIïTEH´1Äž¯2ÿ*k72Šý[%J)¶.ø“V§nnª§Œ¥·Ò^Á¤uw_PÚ¤™û2û/ºéå:([ˆó2‡ÖášÈdžípš4=5MšºÐw:v÷ÀN:”’°.ÉäV3 Ô“Uªظ1ÚœêO¨-™1'”PR“Å£<âº8l'›`/õÚœî› &=ÂÈ4}jÓ9ú‰Í^r·ªŒ‡z¾«ìÆãŠ?›)­{KN[­Âp ´ÑIäËʶëj¡í®Kð©Y#¤uóJjr›¯¤MÖ‘<Ô/ò)µCÄêbðvp¡†$Ê‹µºÜ;¾@–aœ¦é1é}f19ä¿£Cu~ùêêÐÕ_Õð£Ak5Å׿È ¾èjÉ´í ê‚ŒŸºÌ8>Q'¯Ègþ)L0ÑÂQ*²¨«ÑÙøÃõ`„Xu8<Ÿ¸NòNb§Q…k;Íg^ÛÈ@lªBo{ÿ–]!Rv¬hKpŒu'FœA#e³FŽKa•ù´ad¬©ƒYçö<¤Sî•«ªp-”ÛcÇœðµgmÓ î˜’5–eÊRÿ®ï5𕹵µ5M\0IÅfË3û>±)-Ê€<1 ÿ¿ß\"Ù¸œNgë4csdŠ”Ê3L ÄÙºŸ­Î奿 ‘uÁÖkÇ¿^ôè‹0@D0>}=ž4Ù²é Îd¾¢WØö>X4¬LkE­ŽÜɉ1à/pf‹…6%$Š,ÓFd+ñ¦z ±8ï"#ëÒw$$‰œ‘ÚBwýYK×}!6 ¯Þ> †×“÷ÞžŒÆÝÃ+·'RÉ{UwØ8OÐ}ªz ðÜD"÷yÍ¢’`‰Ò#ÙLs%%žÙãAï>(¸/d{SÎÝÉž ÜM,] Ü¹Î¢`ý}#Ä×­ Ûë ¾~éó'{ïU—ÑøÓ+¹2´?å2pßP|0ì¹?Q8©kKûÜ•ÆßSÜ|fF.£)4±Î±Ëžù{¯ÛÙ­@v¤ºup•bˆ“`‰9‡QÝAü£2Øó þüe¡þN¾œãjB3¹ºÆ,[c“oµÈKH¥kÊw!EP$’†¹¦3‘9ï#œª£U´•Ó+cµ•/ÿnn>J¿»ÜàÑÏ`Æ)BÓÆM ï}úäÂóº<aÜ(ô_8 &cMmPÁ è}¼K¨,i»†›‹ß¿ù"ßϽ¿PÞŠÚÍaÕªÂeý¥ ¾ÛÝ×v2¼à¾¾ÔÄÓ(¢=51¶Øm» yêîÁYðm {N¾èuLÜ/ü9—Ð#ÄÉTwÁãufŒšvBÛG(^§iªH¹õï²Ä¢òÒ,®¼Ó(xÝþÖ4íÜ“Àáv¯!d[ÉLóuN@2ð:uüÆFNåÒƒ(Ä6ñ“ìEa;œ¬$Ø3‡ ²Au&âm}§Íõ†Ì×@ź侙¢­­þFÑðvÂÊ.ÓÀ¢0ZD¥ýøpÈF´ÕT±Öy:ø<Óyi¿‡ÕÅÝzßpÜ/£ÙRHòžxk7H¼A*‚ÙÏÛ¨0&µvŠßà$ %ØÁ-V¶,#U…EÑžòãfOi™[Ä÷ÁÊ8³é²Sd…´¾£T_5±3Zg”Þ°°S*SÔý˜Î4‰°ý¤ÍÎZgÀñƒí9i¿>Iɜ̫bÐ+Ø ÿzÃa/ »“îë×ý$éãÇã´'܇¿öK¦‡¥À]Ø@0Û–e™÷ŽÂì>åë}{- =úˆ9Fýƒ3sä¿9":óå/býJîò©×•â Ú3‚˜)Ë:Ñ—2!å$XO'çCĸ'Ãkø¢˜Zžš7^]†'¶ÚSjÔ€¯êèØÐUg[^4÷»ô¢ÝúÂRd–sˆ2%W}ºJö\nÜm*O%•°Êý¡½"³ÖÞõœñw`U¬]Ke}'+ V'ÿPK Œ®Aí=¼Ur†.org/hsqldb/cmdline/sqltool/SqlFile.banner.text…TÛjÛ@}×W âØ$rú”>ÙV.à$Ž” yYK£hÉjWÙ‹múï][¹Zƒ;3::sæÌæÏ⌠„V«QV1|{9þG3n¬æKg¹’À ´¨n-–àd‰l`)f@Uáp‘ßÎg¼@i0Žö‹!œ}?<9:>†‰`\"ä¼i 2Y¾¾3\¡PmƒÒ¹V®£è÷ðìŸVÁ­ã6Þ†~ú§ nò ÎLUÓžÙVœ¾«HKn'®ªP/(¢tŇêÑ»êÅüSr’%7­`E ĽVkOÊ  m8ƒÐ°B+û\"†ÊÉÂËf†ÔH¾H§—Éü•%,ñ‘KXs[Ãàa pƒ…³ë%tÊAÍ-¤×wiGéìòîprv–f0†‹Ëüî&ûý5ÚéÿÑÙÍ4ÝgDhž\Ÿß'çékÓ°F;,ú…s•L³›Ý—|§¡¸ÄŠK¾=¿Çÿ+™AÓ$ϧ՜TõÞÈ-³èAê’==Wú }Ê3½u$—ÌÛtÙòëä³S>4ø1€ýuÍ‹ºÉx”éa†@Ÿa°L>BýZmËߊK2‚!9 –Ái„æÛVÎöúÈG¢›TÖoÓ’ÎÞF+¦9[Òòá¦eÒø5 ríÆ{£½Ð2“ÝNžÅ<Ú%‰%¹µG0俎÷V,‰Q5öm¬‚?guJnYÌ%Ùur•Ò†OØÚ‹†âŒç¥ñÑ ¦='MB%뱨YfCÇT‰›ØDŠ.’ƒªDçK}®oÁâ†vdÛ8…G^ÚºlÈ'›à•ïVä/PK Œ®AØ'©y¸1org/hsqldb/cmdline/sqltool/SqlFile.banner_de.text…TÁNÛ@½û+æR%AÄÔ=TNã@… ®M‚TqYÇcg›Í:ìÚ â[{á8qèì.FQK[g<óÞÌ›·NïĘ „µªæ¨u¥`ãLJãGßq„ä5ª’e\×°kēּ„FRr”0Ĝ˲‘%=ç;O¿E£!D|‡rç{ÝyNŽŽ>öOŽŽa(—)_­u% %‡œXL Œpƒ¢Z¯PÖp¦ªfí{Ðu{gî¢$:ß…>›{ZQDeXà‚`M!¨Å6åÔ¦„9¯ûqS¨3T‚’ô_ lAÑ@ï¾Ø÷ß‘—µë™‹í[úwÉ–ªÒÐuÅš Î4öl¡»r,¸ä¨j[R¢xÖóE [Tv*/½šŒÂdŽÃó(„‚Y=W¼†[`™£±©6N®Ã„Ô%/ Uû^8úzݧã1Å0 “(˜ŽÓÎö±‡‰´„tN;Àäÿ±ãäêK8š&AQ09›g!tãÈMתõ'úEÞm“°/ƒ‹ä ‚F.g"S0²jÕ¼’ȰäÒ<ì£:–þßè0{4.¡÷´:A?d¯´V Óõ¹E®q·2þ½¨VÆ‚LaÏ,þ÷¤W2ÊØ¢IÏ5_˜¦ ó©Ó2C×:›I¹'¤ÑË2´S(ˆÕδÝœ9¤-WîL¼‘—ö íy™6¨È@Uö*˜äÆM{d¾7a®1â™1ÅYFÓãýšIM²Ú&rÒíÏnËÍÿM¸-Žú.£wè-Ÿí(ô†×ö¶B{RZ7H{&ŠJÐY¡F·N'Ý)5ðG³ ™—á£wƒ$SJù –ôyQhì«—ù ¼ÙuC‡«E’‡¤3 gwHu¯k<$¹z$œ¦ªv,êé¾Ù(FŒüÕ–vÎÎmbõTð{èL¯ÔÂÌ-{f Kâñ¼_PK Œ®A¶Ö¢l¢.org/hsqldb/cmdline/sqltool/SqlTool.syntax.textUËnÛ0¼û+A‹Ø€¥ é­…®¶.œ8ƒ\Ühie±H…'FÛï.EçéCC$½ÃÙÙÕb«œ¸ ßÄF€6ë´²·u±J󦨥Âtq[_i]Ã2Itë–ýlD}“¦é xSË–¥¬ñ8¥0Þì=ÝÁžg:]B®•ÂÜI­À¢sR­-H&g¤´·/ðá9L¡A¡,8 J»/…ÚB!œ«½É1=%÷ hñeÐ ï1÷)ë ©nþ–†Ò*‘Ê¡”Ñ!D§½ùåÕ4ÜÚ¿0˜K‹õðÖK:Ctgc)kaqwÒU±ØTVæ$TAŒ“ôæ-Ú¾ ÈIRaÝîÉg"m[‹-£’–2³V¬1†ïôX7tÏBF´äÝþçÉû1LÎfÀkâ`c(‰Còzœ«Sc2g<þ(Em`O /KàƒU F+môÃà[r£Í¯À•_ÿÎþÂ0 ‡R•škE:Pè.Î4&)‰N‚íî òZX Ë×ßO~ÞÄ(©X®Ë<£g¤ÂñÐ[B¡·“åPDëòò K·¶„p§M‘ýÁ<Ó€ —cØ#ÅŠMØ'è¢PR-º×AäRKëö@Íx;8 ´ÄäAú§4ëô6žëÝ5O4=°ÄÜ$PÝ@¥„Bšˆ©jýo·Gƒ¢èLýKák$iã[×”…z¹”l’p€%Cçäh‹Å ·›œÉgG vÔ W¥”`ðOhû)ËÒ[¾ú4?;="GÍEÿÚÉHB] “ÎNƒŒË!¿Ÿ!à #͵x™ì™Ø2Ah(QÙÒ½RY'TNR†öéÒˆ ´À—ñ]þ™#kåZ +2Á”ÖNel”mQœä¦ñæ^Ûi7ÿn?‹‡];i)U³ÔÖ‰}?Ϲ§£ßäįcø!洙ĥ½UygÓ\IÂxt«®µVD‘ž¹¤Í_ 4nÇñ*£dI.ÊØ ýÛ­Ë™“šŽ·€W•¨fðr}©ƒ\¢EèKU ˆÊƉ’Ö½brƒrâê¨Ö_‡ \u£žO-ÍIhV½ððIf¥ƒ¹&°.—Šc유\˜%Y‡JU4m½’ÁÓ}®âNp‚)»Ò>ÿe¥PŽ7QÄ]Ùìˆ +wç`!M¾¿¬€|­„!·k½‚›¯£¿×7ÃA·wÕSJH­ÿ|&i"R\†”ä¿ÊÚÜßö\¨ÃƒÊ¢ñ»£äà—ÿ}ïáMfÂÚ…6y{ 0FƒoÂH‘*¤Æ]Ži5y4 Þ g*´‡±ðÅ 1ë Ý©œ>— ŸYŸ?–&šÖó%Ï;Sèë)FßÐÜ!ÃLÒÚÍÕS ÃZHï««§Sù¼é>(«ßìv¡w1„S,°T¸ëVµ·¹ù'СJËB:Ù^ËvE ­®['\usÂ5â sCÛçÚ¬c¾Ù< œ^#käƒO°IòLçHû›],tÊ=ßå»!q»é;•*ÇšÇ1Œ$–¸Ù]ŸÇ.­²r €É<Þí™pe«à]l2Àræ9¾4#—¼í_^œµ¸ñŽÅ‰/Ž™&'©ÂK:3¦íL… ¡Xb¾£ôó¸ç_í׃ÚISƒYé{î쉬„s_Y ":fvûSçâì0LErà÷Ga.‚| ö9çá1+iÜ þ èÚ Lù¹«x Ù¹?z¨Ó¯åô•5è…™ÿjTë4¨Sl}®'Ñc] ƒ·gª¼îaƒ†2Æ»ÊS€÷Š7£¶×d@bØv¡x4µ´F⋟ŽËµ5_ß°¢ _ýí\0iš?”%úÁ¼ò†Ö=²",Q}£ß,ÈS}$ËŠZ8d‰_:˜Ç°søoýPK Œ®A‡²]?©½2org/hsqldb/cmdline/sqltool/bottom-boilerplate.htmlŽK ‚@F÷ó+..Zæƒv™P$&ô GÚÆ¨7ƹ:N‚„ÿ=]}‹s8,¬uĪ¡”bÖÐKC$‘AmE A…Z¬@°6ÏYþÎÓ[,¹ªA*9âÒ`Í2Ã?QèÿWÏlË ¤Mžc 1\UáEåÒ뀬©k”ô«(‹4Th‘’-®C“Bíá¹MAUŸ\5š`Ê’É­†~%èµ¥Ó<Ü;@ßµ£¿Þ–‰bÛ.~y‡¼V%<¶ï]%¡ÀxY¨Çm.G›$¬D`Ò²™Ô°9sKYöá#ãšbñEa.R[Ì!à!ÃÊeó‚´-k‰qÙqë]÷Ç?%3YÁåαÞÑø$P¾F°š ©eZs%{kú³Æ’qiZÊ10k ž3!@U¤ú¨ä¹ ~Ha‹9k„öÒÆÀžÓy&´º bòx¢î|jlGÕ€“Y¥4Õßëñ-çœrÔ|W:s:äògJ(9Á?‚qœŠãI4£G]ö `ÚôºÄ6QM“Ù<+œ.¨n †@ŠÆ{ý±)«X5¦jLdƳªB"eAMÁë³dB;ÑМ‹nE&7+ÒÒ‹Uiµ }]aÆ™Âjáˆ$ß]‚V·ì‡Áƒùyg[ÖÒ‚Rm‘:o ׿Êí…¥zµ-Ôtµš½>M¿ÎZ’SB%\·¤dÏ\Ss5Ù*¥›‘ÃÓ±©—³Q1$Mª 7¶Z'CË&8Ÿ <ÓÀ¨àÀ†þà»rò–mJ›­"7:’fµv#qlIfîóÍXÌ1m•!¢ŒærWät "„¤MQcH%TlgóÝÙ$øƒl¦«¹Ëéœñoú9ÐhÅ CF7FíÏœ|­¬ÌqèH…Ú/IŠ´9 ÕÐÇh‘üt|ˆã`p Ô5¦j[ êš ³8ZË ;XQApËmx¯ªÖ`ÂIØ: ¿[¿iú¢ëwaÂ]ÿU¨” èwSü@ßE°Käg¡[ÇÙ³#ÝÿÓÐØõijT|CÞt´}tþR0{Sq¿à*£ûŶæ^b‰$$:n…ÚÔVØÒº€R÷å–Bòö¬çë·õ|ù /˧$Î×ϳd|/'Ö#w›KRs{Þ;»£³]+õy‘¦‹…¯ˆnÌ õi¥:žƒ{xvþrMþµÝFÁi½ÒÙ]•ÎCvÊv w‘&c8)„—%¹»ÕßZüZïÆ3E¤ÿ'Ÿé®ý³ñWìy³mx¯÷/PK Œ®AZ•¸Z:U .org/hsqldb/cmdline/sqltool/buffer.help_de.text}UMoâH½ó+j­• ìÃÞà°"'aC&™dG»Ú6.Û=´ÛÞþ‘ëJsÉo˜S[mBHXKÈÈêz¯êÕ«êðtºœ†·ÃùÝÙYx w×§ð9¼MîÎ'áYx1 }€k«`óœ)”1Ĩ€KƒŠ­ D '(­©¬Lá±P“1J¿ôŒ~…ƒ'Œ¹á¨†s›$¨‚Ϩ³ á‚‹› ì0èä©!–3¡Ûž.6¹Ì˜0}`²Š>†¢’·(ý›ÖAôQ í`îzçLVËÜ÷fÏñ6!¸V>ܳšrØVÄeÍò°A>ì¡ úð…êÝ@’È)f†>J£K…«Ì)þÐr!TV½¬ÖSŠP¨àîÀ–e+§ŽÚÓLEÈ ІºÂTœ?ç)0*xÞy›Ü4¡®HéÔ‰\ùv•+æÆu›ëzù®H­Kt ¨“)n(S4°AE‡ô–„(¡8iN‹²DQZ¹6€¤Ï•Õ¦9Ũ‰¦;ŽÑñ¥¨)óÊ\Y£x’˜1¸ÎWþ‰?oQ*cl^ 4Õ^yµã¹žS4ãH–Å*Ë™p-«lòâLíwnœ«½ ÀäeÐHè›'³ƒŽ7æŸÑgÊå”äðC‚T6{¦Ê¶“0>t"œ³ùÀ$‡kCõ%Vœ‰ÌgPÄ­>xŸfÃ&£~C·Ø¥” ‹}ý˜ìüþ1l‹`òMÞì«Á'óç×´qö¤9—1%º!£jr^÷–´¼,J††êXÎûô¨[:<’¬âSPÙÀm ¥äiÿ%[¼6<ϭ˼Ýy¯&¯²Þ>˜ƒùÊÓ|ìjÉvNG¸ÂL%Ìyס»Õå‚súJnJà ¹aÿ!Ľn1µâ™ÃÄêXÙÕúýÑmo8fØÌR·¤ÁQØ^1Y²›\~g &ó)ÔÝNøš9òcpÉ‹‚oá[Ã…_WîÏ™¡I’?½‹©¬K¾¸YH\Còýo†´ÑÔ)èý­iÜÄMóvŒ¸Wù‘O󦃧 ðúïëmU¦Ý¤q§àë¢n1[O.5aNBü¯£Jtã@EžRwÜаÅh -œv¿E w-&Œí¸9ëöj“9tÓî+GÌt#Vï\}X*Ümôl]Û=†®îצùQ êËó}"AÝ0¸t]ŠPpŒ8íAwoÕ›^“ûÇHÛJïúŠÎ›ÖÖû® ZZ©[ îš^“”æ=ýâîd±œ.ï–Ó›ëÅpñÛÅd¶ oGÇ9eËSY(Ú'ÎUñ=¸n@W$3Hôc‘)E6ZB¯V¶´UeÿXdN‘¥kñgR¨BînLÍÛ«ÊٚĢ=ÇdBWK}0¤›éœ{zºžÑڔݼÛZàhcÊ`ÒxÉÙjkÀW§u:ÿPK Œ®A«„Õ )org/hsqldb/cmdline/sqltool/d.options.textUSÁnÛ0 ½û+xK;¤þ€ÝÖ†EÕéP`Û‘éX«,f¢ÜÔ?J²ÒÌÃä#ùý«Ÿ' 8Q¤Ð¶ío8^À °'àâH0°s|¶þØ6 ~pV"|q…$ƒ¦‚_1¢ãcAmEw¾§w¸8€ðDÐkÞ!•oaš5CNdì°hºƒ"†#E}Ýf2_ÉÄŒ4!<êà¥M¨‘'v+$êèïLÞ¬pw‰4úŠ5´ÿÀæŠ= …½U臥s>U(³Ý9ûªÒþ‰Òìî랆½Jê¥4ÈŠøXó4ƒÅF¥ºjkF­21ÆTÊhª¬×Œ—{N+§É'¢7ª¦x=ˆ¶é’¨*[² üwR¨Ê€«^3‡×¤ÞÂs¸üFšJâ71kÆ!6Õ 4†CŸ_é¾?Tá ¦…ôšPK Œ®A‡ÖÀ¾˜,org/hsqldb/cmdline/sqltool/d.options_de.textm;Â@ DûœÂ5E@B‘€bC†Ä°qÄ~@伜š%„´¸³ßŒ5šm‘Ñf®Œªá`Ò4ÝѵÉÁ”X@ ]B M¥æ}u»°±uĸ!ÑÈt8x)éÒ­T­!¿Ä|͸ÚÚ.qööíæX0‘‚[ôþåÿÍ:Ôî7‚ŠU#ÍÊZtXþ<ÙW¨•„bú>–Œ!Þµ0½ÀÄ‚Eó 0ˆé'དྷW«¡ÑY~Ä)T›$OPK Œ®AlKå%:o+org/hsqldb/cmdline/sqltool/dsv.options.textWmsÚFþ®_±C?(VÚ¯Ét:®! )‰;Æã9¤“¹DÒ‰»“ S÷¿wwOl'v§7#w»Ïî>ûÂ0ú Ö‰2µiC™«B9iŽ#Y #œL?‹¼–vw+•¬@YøZ[§x±›è¢Çݽå³=XÖD~'¶j«ÊP]Ii«œÆ=y+Kn%ƒRÊ”1¬kíøJ™‚´‰¨èÅ+'¥™Ê¥…•¸•að—®!%ê¨.‘(|ɤpµÁswÊ­À‘*§t)ò½ˆÖ ¼§ïØúï²(/×Ey¼G¬J«R ©pbËmcÚb³f¬‹bM'œ)J¿»ƒwÒ >üT[ÉD!öùý J„‡„!¢£[„R•6Îz?lø9 ×¢` ^U­ÂÔÞ‚_jJgX„“ÇgÀÈDT¢JT#À‰%nvu…rÅï½FÞ óâ’8*çô€Cù]/¦ºFaÇM¸¼¤ üŸü1Ý¿¾U%ËTÜÈ«ûh4ÆaþÀ—¼`ü"ó@š-yç¡EA þM‹ð¼Z<ôœæCK FÚ¾`kŒ8û”Ùl ½…li½]ŠBðí×ã\•¢“Æ´.»µÔr«P¥`Ö½9êÁ€ì?z}}C!EÉ(ÁÎ ˜E4Ý3z`ÐߣV¼$®óXëì3¾8ôB/ bÊsÌ<Ôì‹Èî&V¤•l+tŒK*²6Çßñö`GŸ !”JZ3ÞP`¦\$±ð÷š÷.üÞ†÷6~oê7ÑÆ0ÊLÔ¹ó~}µ”X=Åžê\ÚuMq[" ¾Ig¯|•éŸL&×?ÍâѰÍJ4Ì–}.HÀú¤J$zÒCXïj\v2‘[Ù¹òòÚFç“q怦Ð:m=Taþí‹­‘7( Àr÷…xк8¢k÷@Š¿þèöY“Œˆ¶@`÷€°VÝ”fç…†Ë7Õè»ð¹Z‚úÎt)ÎG§³ù0º>ÍQít:ŽI+S]súÝ µ^u÷¢‡ˆg¨È`£Á¤«AÏëµÓÇÄLØ–R‚™G[È­ŒÜéÑ_5ûò„ßs}÷<¹Í¢¼_˜ûEÙy$é1ÉIÒc†¿dì,†Z"ÍYÝ÷âVµ¡°™Ù´é(>ŒÏw©AWôMUMÃ)Éè¢1fn"´Ãíî?yÿ±ÊóùèíøöéXPú1Pš3µ¡BÕj¤Ú|Ùù©ñÖW“a¤š,*·…ÈQ7ìÑfª,—úÄkâž¾ƒŸÌÿíè]ÿ–,õM¶©oH>,zΨʰg©%âG·»ÆJå§'•·3á€ý°è¦uã–g‡ç’»Hƒêìv%ÌÔëxöatƨ>Ñö³[K•©´4Яº‰|p| ”àû:‰˜Ê<—!´WR9i$\,*µÔðb\üúâ dãâã.ž»O_9Wvm(”gDªø8ÚÔp_AZ.—2w°V »6÷$½ãh8Œãh$aþ ÑÃ6º—†2EÛ½é̈ ¯”fØ? kŸ‚oÂz‰q=|‰ëáã†ñßâ Ð1Le*+'1;2WyîÆr) bI»W"¯¤…vêBn%^&Fj½–ên.u7“Ž.„k´'`dAYª€×¦Ò©d ,Š@û Øšoþ C À½4+‰gœBä6Øõº2ð¡þ½’9~ƒ-5zÓx}‡p_š» ¡WÍ UÒ>ee°R&¥³b@å O—ŽÜªL™° d¦ÒZѰç}c¾*2¡1ª0è!± ürˆ<%¦D´U:…’3'ò0xWà»9¤øh çé÷²ß9‚¼VÖäÂZ©;HÜoÄJ­CÈ‘Ô{æªEÇ¡]α(’Vë€x£[‹t©9+ds]­(~Ú:DÈ““‹á¤ gð tZÁ1ŠGR2IÞÉ­gµ©ÀB5# ¦`?AÂlôß5«ÿŒG0+¢€c™)í‹ÀÂï’˜ØÒ¥&ʆVW ö$zVæ) ñ¼ÌxÉñF 3Ž’¦ M‰› Cš ƒ>žÐ©0é #?º’†§¤0DI6o>V"Eý)ˉ=ͪÅè[_^‡½ápòöÝEõ7åIÇeêë£èéÙÓœtb7ò ¸P$‰Ù“ùQ±o,úÎm nZ3»lÝz”Ÿøtp9¹E¯ï}gõß«ÒÔ>ëÜP2NYðNÐ#DÀ6‚ès·Áó>­!âøii$¾’$ícˆ—L«Û­ŒÚRvrIÂx`$3ù6¡¸i¿öê•é‰jôʲèU6î²Á={£‹ëïDñ¸úß‚0cý86cýµóçƒyÞù^,N±ý*9µöê»èŠéü³ÎTÖt®ýFÜ‹ṅàÒ”K¬•OØb´ ­ïÌ¥9¨ƒ8‡Õ0Š.'ÉÅitÎA>Œº/$vŽvE/DžðS¡]]åy¬ÔuÅåLÝY¼¡S·» &½Ñë(™¼ £]±ÔϱuÌგ¹ŸñŒñ™·:t~XÃÏТUå—8bÉçF1[wõ˜§"«§%ÇÞµÙš `ƒJ}Ð4ü¹©7v¾ÄÖ† f¯2Îã„ê#öyð†êªP<[:5$Cè¸%¤šÓÆ^GZ‘?\¯ÎÈpGÁÑ\u¶üoÊgƒ¹Ã½ãD‰˜f2—sMT|Ùõš<î€ÛÒrsŽ‹Ëáí78PŠ£d‹ã·älØ=–†Úz¨¿¿6O<;¨žvý›vè?ãžûñ†úm ÔÜó2KÒÀÎA•Ëb<ÚèÄg¤É;š@¤<û7$ì(r48›à\‚Ú»ÿ¾ÆÞçfÐr¦’-âQº5k€Îû”МâQÚç7²…™È•üËß¡”›YÃ! Þ$ë ›ìiÁ[OQ×`³›á”¥1ÃÓn/·'£~<¹ŒFÈñÙÙ€<À¤e¸ŒòÓ~Â5­oHó6P[6¡xÂM’Ô%ÕÔÑQ–êÂUœ™^åÊ;œœª±Zw¶ŽàüçERWÚGù-ÓÊbÞ¼™yþ¤ôàuj"ïìD&v‘nHŠ[¦Ö !âɸ'2ŽißuÊ55lµÃYbj` Ñ‹ëÕl®jr>.¯#ï#•Öü`úü‘~©Á¨åP­‹‡ŸöÑ{Kíèt4Þ’h90r«HJkî#õ>1P–z5¨ŽÆ®ÉXg÷Âá¯íNM5´3qKe5g_uÓûÙ´¬VÈÿÕG¬ŒÂøS®8(ÓÐ|Úø1.” žTß[ƒ4Ñq¯‹âæ û¼5¡· q"Ú¾¸yý_CeíB-,¥"ÚøfZ¯×Kn²l–kòm¢#ô¬MkÀüƒ<)[ƒ÷º8›•ÈôðåãÒ^*Ÿz§žS4^ƒíÎ8…šÕ½0ws—¡} Z=ñ÷sÐdüsDëÀ˜DÔã0`Úh3¶-—pit1 ì-M~¤‚º:d½’ ~ˆ&Ô¥p¡WškÉïR°n K‘;ŸOÑß•&ŒRÜ¥P2@õ(ÕÊÉò`AÒœiÍ\ÈEþ[1m4×¾MêFˆ*r¯ZúƒÁtb§·£û‘-.–¹8b$oÎuˆèݾOvÞ]/\Í€…ÌÜ•œïggÖcäóÞ™¾Ã‚‹nH÷/a•]oÀ%Ò±ÓÜäœeZðÛ_=?C_ò>‡{ÉõþøÁ7ƒ=æÇlŧ£.JÛ*8‘,:`»ÛÓÿ©ÙNѤÑEcÓ,er8yþòjÝQ˜d_Iž^ü¾“*þHYý MÉ,{ ævðµÊؤÊm–È:²êr,Ê$7;-Éb-qF‡££yô3Øe/¹ëã„ +^ÌË|gÞ+q[àŠš‡=‹äsŸ¤:Í|â,ºr[Ïå:KÃ)×'2žö²xñûöO º^¦ï»Wøá¨OˆÕÞ"ü,úÉbUQ‹Mòý?·HQæÄ·ñcHOƒê·r=„sÕ§¨ÏŠ6 vˆYD¯K\)§wUiZ0UrÆc¡( Ðå-”6«÷á°Î¯Zw[V÷+<¿,óíœÂƒ&;Â00XlNßU«uñPK Œ®A´Œß½‹-org/hsqldb/cmdline/sqltool/macro.help_de.text…ޱŠÂ@EûùŠ«•[˜ô+ˢȲb;Åbdî$ƒ“YH& ~»…-4è«ï9çÅßèº Mê¡ K:ü«éyôNÄ_/i-±‡â¿¬‡K™jf6Š¢f8¥6ΰÞµ!h\àTA1‰”{::ÑÙÖɰuƒy-èúµè ö>"6éíØeÁ·ÃÛtè|Åð¾ÃªÒšÅpXëEÜe©Z’e« >uçÀÑ ü9gÅ)«Rˆ PK Œ®AÙôξâ )org/hsqldb/cmdline/sqltool/pl.assign.text…V]oâ8}çW\­4‚vRúÞU5B3¨[-¥ ´³£]d¼uìÔe˜‡ýí{l'ºÝ)‚ûžsî=÷šÙüþóøËã|4¡Éhzó8ºÓh±¸½™Þ§ôùþîn4ý²èõÎé½wÝ1¡h6¡ß¸¬±øÛh>Ýéš¾+¾¥&=ÿs¿xÁ^ÁV’§ß†½w£ãšpVµ&[³œ“°äŒ¨*^PitE{!À/öðo]Êvà;\ÿysù¹’Óä6íƒ.Ó7»“ÿáhñuÒn5”k¯•ÜåHXÎ©àŽ iOc.¯´sH@¤¬HaÒt6ì[¾-ŒUœ˜¥ÎºŒøœ×)ð³‡$$ú$‘B+NVH®œÜÑ@ yFJ“Ñ[Resù:"tõÕ5W[wLñN¦kÃ_„ö–x!ÜI>+_–<¤V9P²XjVìÑkæ6C‡J´×$üú 9ºÊ…z•"ºd0h÷ßϨBäª6gg)ÄŒ›R›Š0× ˜*`+Öê`sÚé·ˆa“¤k{µçe3ú˜ÑEFç]fô!£¿2œŒ6Š*dÄ®‘>âó÷9îKÜ®O†š¢˜è:4aÌÙu¼B}tÍá•6'ã,žåƒÖ²Ý½WHLJ½åÅéaÐx‹4¶np(w0ôŠN GY 2|p–oš¯Ñ›ázØp‹2Lå› ,×U…²Ù¶nIèiBs¯¨fdpÑò—€B@Û~&¶Ò>v–Åêµ90x4/Б"àÈŸV|-” ÄâËÈçö¨½©µì’Œ ;G1Iþ/ÅC¢o{ WÑY$GM4n©S1hµ£ŸÜhjõ¤5¨t!ÖÂÅŠ‡ÉÀû¡(ý€R‹=KÞØ5©Dgì0À s™y§‡‡öûf{˜ÐmË„)$™ã6΂9_&&À}w<Ò³Tª¯av]ÅòiÉlèh.‹£7ð*á¼Q¯Ý7§‰¸R6œ[fçÓÇÉd9Ï–÷¿§ PÍRx} ”¤<∲s€×þ1΢ư¨Q¢±Ð@É<²CÿA¾m¹7n=&\îSbÓ‘ÐR;”¯V(0öÇHëŠ+À^úp<ð¶“žÀ©Á¢fæE†:µqã°'Ö¿UV1ç‡n[I?¹’;4áüþ£”þí#ÅS¨s‰²G•—NÔ2(•¾R08íÒN–v£árhPAG¿:‡¯ú“½LÚy±ìTÆv‚%G@ß6¥é°Êz+ìÉx˜·¦I~Ó‚´úÒ(Áš¦ö½¢5pc»¯û°‡ÿ!!̲ÙF·íÅŸ½Àú0Ê÷ç4þ,ÉúG¤Å,@SÚZ¢Å0kjÚë_PK Œ®A|5Ê~¦ *org/hsqldb/cmdline/sqltool/pl.control.text­VïoÛ6ýî¿âÐ/v2×k¾f+ ×1ÒŽÚI·"+Z¦b6©’”`íÿ¾w”äÚ©RcÀ8DÞã»{™NË»iD£þøò®9¤Ád|;Œ~};íï®Æ—xs}Ý_ÌZ­SzC?{®…2t3¢wRçØ_™¬Ê*¥\(é¥mòA™qÑRC ØôÌ3™¯”-¼Þöz1T’:ýé¸=¤É e",ˌғŸÛxTÜ['Š¥ÇIü‰¸|¼¶6§µ Ë£0ʤbÓëR>°)Jèn¼W.…nD–kyNu ½¦Wȹsªèw:{ußýòšÎNNê:ýOÕ˜‰L’ð”;ÅèÒÆâ Àö‡IVzâôJ,¶=ÕçvîÑ0gPòÛo*s)Ð<ËFßEx¬e·N‰9úÖËØ‰ñDœƒ¾Ã4á®ßcÅ‹3!t_Q‹¤jľ¡Ùû})¤Ûî6+ ß\FÂ+^2rZ³/ºÚ–È&ÉÅnÒTMÚå(³ßíq÷ZiͲl™E++tPЙ¸‘ýoOseUc~¶94@”:›EN‘ÅQ'Ír™¨T¡Q8H‰ÖfÛÝQÞ«ƒå`Añ¡ )}Φ†z‰ÕEfjv;¶ Ù=Æ“Lš³êÑétòÇŽëú™k¯Õ£¤7Ç€ä&‘9Ï=Ú³¤å£ÛWDìïÆˆnøáA³&ßà‡!eà.fQåÏÍÔÊÚM¶ŽaÃâÛVk&á+€Ù4ÖA|…8«kyx‹åÛb,Kó,ÍûvM`Ы¾ÛÚ§%¡¨åìyÿþ0Û[ì}´EiñµÃ`ª´j`Ï ÌÇGa±ŽKÀ«PÄ;ËŸG]Þö§Ã¿c¯ÇçÖ–ÊÕ¬Å!Ñn)éz)‘E»jÅ6)ߤ1Ó ÜCs»BäçCªsˆðÆNøPïp2Å¡&AbÊxµ\ôNg7«º`À20®ªÆnØqò%XýòàÓÙm:^TÕ¸2Ô¨ÉUÇ]]è×TmžHÙx*ÆÓ.;…¾c‡–ã„ÁÖ¢ü ‰—MUqÚ´ iwÖ‹?_t1ÌË{ïªTþ©sÜMGñe7¨òúÖ:•Þê՞̟:‘Œ6[Úµ¡¨yü¸àË¢–G¨¢®ÐÒ0!>ŽÐ«Ž1Hr‰wèôÝQKÑX1Îl.!fIoï2¥¿rdWï[•ìùÊöéåøÕøˆKDáá®ÂðüúÞFÍcÕU5cá €Ìò°­u€?ƒ 6h*.†‡Fk?Iê|—Õ¿PK Œ®AO¨–º'org/hsqldb/cmdline/sqltool/pl.help.textUÛnÛF}çW „º@`ôÍ@ ¨‰7UE¶†a¬È¡´Ír—Ý‹lÕÈ¿÷,o–;-_$,gÎÌœ9g¹Þ|z»xwµ™/i9_½¿š¿_Ðùb¹N’˽t´gUQÎ.³rËŽÂJ±ULÁ‰ÓÈrÁ–u&õnLBçä÷Lëe“–™²Ä™K“µbáb×…QÊÜ!§Á‘m’ÄÖOa–„«8óŽLÌ4I&4£—Ÿº_Ô>L*œ“;ý\èùc¥~¢&ºdíÝÑc~ •í­Q?‡ê‚œ·!óÁ‚/%¿1 '²Fv’ŸtGSÕµûz¨‡²¢/óÍjþqA•ðûÔßû6á]|×p*€_CžQHÅHWÒùëú»¡ëçuš¦7DK¼‹„u#7¦QÎ… ¤H(5n1ÜÑUí=‹ñA]ç’b[| ¬²\ ËýH§Ïô1#©IÇ .>/A¥(vB¥ŒÈãœé09úÐÖ`6˜’“:cLfßDý‰4LŽ!ª ;£|JDC¥›ÒÝ^f{Ú ¼Þ2krì§õNÏhòÐNð=ýç¾söˆsñ·º4”Ãöpb7GwÒïI‹·¼“ZG÷Ô‡“Ú;Ñ)R(ª‚­Œcx~ E®3pÏ9uð®ÙTž}é ý€.Rì}4#ÜÝPÛ#ýÃÖ*—šŒ›ËôøÅ‹Ûi]|×Ûa¬æ™jŲnÅÒ²E£†­£ TŠ#iã#Wã–«W¸ÒÈÄóÄ»¨evCßCnp±Ñ®!œF“NxoÞÐë1F¿^Ê‚UI¾î±ž–Ã"(u„™”Šlt䉾ÒÐÑ ö1h¡¡©RàWèää2¬ôLEEFñÅ”v Þh%vò[ä«^òM½ÐŒUOTÂùÏ3Z-¾Ö„~D›Cñé£8gÑ `¶¾-ÐÓ푬æÛ凒 öÙËa™¡Â”d‚öãÆ~Ÿ²Îâ½ÛÝ=¸§#š.Þ?¬ò''ÖÜAÙ¸5çO ¢7O ,cí›#Ù”nP×J>` .êcP;IýµÁ$›º»úÒ ®ë½ýD=m¸è)‰7Št}ëõ†C¹…a‘]—·µbÙ_‚ƈ(øû =±§¶·w>Åž:Ü:ƒFâ›èOþPK Œ®AžNƒ°s *org/hsqldb/cmdline/sqltool/pl.help_de.textVMoÛ8½ûW Šq‚D@¯ Ãnœ¦»ÞÖko APÐÖHbMQIY‰“ö¯î%¿aO9t†’Ûµ»`Ãä›7ÃÇ73}¹éŸ]v}GÝ}hG_>Ðo£îÝÏ/»û‡ÐëŸ÷/ýÐsøÍ3À…TVk¯º£ÏÝ¿úðn5æ®Ñ¸»zí5Jë DWÂH1Q(5j¿ –yPœ¬`v<ƒÿì4!‰+”`+ø]ûvÊ–¡CâðI'Bù­ßå[=¡48se*FÍÛÇNºº@™ë2éÙ&X7ωBc©ÐîIç&((GF¥,E>M8Ý&P’)XÚ”BŸxù|»y¤(w"v¸]©¯»@΄µ¨&E_[{ šN4¶)›î$2"F˜q)ˆ†¡¢Yb;h‡Ar ÍJT á"—@7(}:Æ%ÊØ­²â,oBåhïà¶âý.Và€þDGz=©Ï¿­©¸´­:&LŸÿ•q:B)܈jìÜds»/*«uü@Ó“!­#ÍI´°È4ü!‚Y4 »It‹E&ÂÕQ…¡ ܽ«6žC·&ûÜzqøï_Z„y:ß 2ž&ådóêÔËC…ëXsƒsap÷U¾BST÷†À:ŒÂJÕÏÓĺõÛdIµMJ“§›´„æï–0Ç©NM0(enÑ-™A{‚Þ=v¾¿¡{`¦šWG´¨™,ªT_ee†ï÷ª2í[6!¯˜C¸–H•H2UºÒ«Áp{*›Î¨°™w­&lR¹iyÇPdœ˜¯ Èt…ÚìÒe†¹aGª}›¬‹kæ«T§(éV©,–S¡ïçæpçü%1{³c‹aRÍt##ögC“Óf’ÑŸJ¤) …H Ðí«) ¹Æ>Vÿ_u›)6œFf%ñZŒµ—…ªEñ$£§’iýôÐ3qU«¬ Õ{'´m·ÛÛŸ"z»»ÔÍÄHn˜›ÛËuƶIJ‹ŒL[:×a ºœ2Ùýl‡-ãü 2Í´“:ÇWúž{9/ôÖi“÷(”UÂk¯2´ õUÆb9ú™ÕW^Œtå8MÎ8¶âŽAtéðZ›.¶ÖYÈ>¼ãÓ+Æòv$Ôú¨ß°6X]îŽ+øl!•‚ZjšuDäýÈ|+üK¯…rh_¥Í(-›ÂÛÇyÙi-R¤ Ÿ4°ú ’ð¼8_¦3ú¸ØŸµW3Ý{xG&væg—¥Ây¬WÓíÐಔH|¬äSbµûËÅøö¢cJkËÚÛ^‡—snK?U6YͧTv4õ”fÙl¸ç¨ø…µÊ_G(‰NŠY-sNoë\cŒ‘*ENóDÈfÚ’&)ÒˆÖó„RxWãé._„ Yžï%K ~ŽäþÍi݈DmaFbærA“$¬š™¦ÔZkcêdÖ~øzå1òY”n˨³_›ï)@Т?Eî5€æƒà¢•7Ó€W[C3ù PK Œ®AÑcö»Ö*org/hsqldb/cmdline/sqltool/raw.leadin.text1Â0 E÷œâ«# 9L Ý0°°¸$H­-%ÄíqA\/~_ÿÉîYSÅasÂq¿ ÀNpöXy,p‘i"Ž-¸ž#žEo Œ…“5¬T¸ðÂã ]XwPAK&ÚŽ¤4PKÞIý_A¥¦R,Šáž³=Ï&Íùs®¢ÑÃ(¸åÿãÞPK Œ®ABÈ<-org/hsqldb/cmdline/sqltool/raw.leadin_de.textŽ=NA Fû9Å—m– v@º(ˆ‚HülAC3›ý–µ˜4™R.KÃ1RÄQ–eû=ûž=‘¢Ü¡{^ãêåñµ±bëÍ€‡2BýVß ¾-éºÆ’#§ÀÖu›)N–­¤1bMÆ=%¾Ç7Ãf"4GTí¢5M¿!¹¼…ÁÎzÅ`øÊ'jïõûŒu .Üç`º´Â™#ìèÝ ISó”ÇÑöÆCü3-écOIYßQ®û¢Ø±4L¼Ñ­k.wPK Œ®AöÄý´MU3org/hsqldb/cmdline/sqltool/rejectreport.bottom.textSP€› ;›…äœÄâb[¥âœ’üüÝâÒ\%…äüœâ‚Ä<[%%;ÕjÃZý; dÇÖªâäïiÇd8:ù¸ÚqPK Œ®A€£4{’6org/hsqldb/cmdline/sqltool/rejectreport.bottom_de.textSP€› ;›…äœÄâb[õâÒ\u…äüœâ‚Ä<[uu;ÕjÃZý; dÇÖ¢âäïiÇd8:ù¸ÚqqÙ¸x†ÁŒHËÏ/ÉË/IU· .ÌqËÌIUJ-Ë,ÎÌÏSP­6ªÕ³Ñ*éч™ââëcÇPK Œ®A˜!$>z-0org/hsqldb/cmdline/sqltool/rejectreport.row.textSP€› …äœÄâb[%ÕjÃZ%;.$`â“-.Ì)ÉÏÏÑ-JÍÊ+ÍOÎÏQ€ e¦g”(Ù©VÕÚ臸4"3/'3/»ÆÄÔbBrj^IjÈìFØÙ¹bú&±8?¤Ë¨ ¨ÀU/dÇPK Œ®AŸy1=l0org/hsqldb/cmdline/sqltool/rejectreport.top.text•“MoÛ0 †ïþœ‹®-;èzË\ɬŠ$pŒ;Ê6½h•%O’¤Eÿû(9k±a›/²ñ!ù’LÞEd³å"Ëáól>ËÆù"[reg¬jø`£¹EتNƒÚHø´ZAÍ‚d Vô_¨Qk^¡‰KcB`²‚V°[à =†Šk,­Ò[`ìš›D§Fv@ÕZ5ñþrW»ÈPªv{ô6Œ ‡¶ Œj°PÕ–¬¶ŒÄj°)Pïî R:}¿¦Ù‡·J @iGÛp!€µ-²ƒ÷†ÛµêìAf¹’®"»& pB•ÞDPÆ%Q”A²L=äN¶ä?]}ñáF¬–ã9”‚sš‚⋨AËjŽ¢zd"LOŸ¯^’¡{—É8{V†ßIÁÿ…}x ;}¾]9ÕQ*­Ñ´JV\~#é^WäÙ¿ð¯wô3ÏcY¤ÈÎ5€ªá\÷©ŸÀ%\] ÀpIÃA"z§5õõ.2¨²ìZŽÆk\smz\ܧÿBÒæãÉýìMZa_O’ßÎÆÓ4ɳtßCgË­À›pîSrùq¢iP:L)¹ø½,Lûñ$æ·¿õ¼?Vä¤á¾­qe}+ÂÔ’I6L]²£-ê{¹K%ºÆÏD0ù¼†N>HZµ8tví˜rm-Eb—™gžy{¶s>þý²·µÕù) àtpu;þ2Æðe®áD–̘¹œ‚Is.ïh]Ï`ûððÃñ‡ãW:²ážñE4QÊJe]Bss–wíÍÆîÔmìlŒUçòâê7Ð(º/•Ém´6“nðO½ ÀMp7ðƒëν­ÎAµ%Óëþg·47òEáö²¹Nó)N¾çt`ÍôÍɤ‚6²¬;ôvžˆý·çw¾^µˆb5¤ý«ä!þ7À·+À&F½¸ÿ㸉±óø.~óŒÔ'ùqÚ‚^ê˜4ÙÒ ÁλÀNŸ’}A'…r^´ Z¡ÝŠ lÛ=RHÒ1ê&jïå æ`kTf¼Ø9Ç ‰¤R’–©Â½-9³u¥ž¨ã“ÓËA=NÝ਼ %m,Yæ2ëïéf¥k¾{ñp-3t–[ÝÖUEÖK½3Ìhõh0¢ŸebÊö6 ßù«®l©N®_v¯Õ–`çtxÐóÿ[qÈÙ„Ê0*\Gp‰¨÷a馹LpƤ´Qkíîë¹ö«BTÎ>ð®s­nkï½ƿՆžY¤þhÿÊV|ö©Ÿ…{Â'ãºzÝÏ·/arÖjЩg­ÒÒ W£®£Ò_Þ;n¼@Õ‚ý PK Œ®Ai“vçü,org/hsqldb/cmdline/sqltool/special.help.text•UËnÛ:Ýç+¦ÙÔ-y_ Ù½I '­åW1 ZÛÌ¥H™?Ðöß;$åGoªõ˜3gΜå_é]/ƒôq8ì=ôó‹Ï\XÔ`ÜÌXÍåÂÓ%3xePnùß|3—yz; ¨Þp\‚U ™ÖjãO¦\bÍ’  ëé^_yƒ%gJU×LVp‹¢‰_'g¾HÏI³ ä_³ÄßW°áv ‚K"§¤e\YPRìà2¹ŒPŸÎ@¥”[¸ïߤ`ЮdüøÍ^(z£òiÈ»ÅÒYÜR~It­šÕБT£k¥-ÌÉe+.ßE …ÕΙ08Y{Ϊ«ò$u˜ík7Ðñ¥Ó¥õÕì‘fgø¶FD4'¬Wû†“ò;˜¹ùœdòÜ*nÁv{œ æ\`·av™Ì¸ôû®nþ$$ÿY#^ÇdŠE$àòÏ´mTóš±#«\SDdM $µ˜ÅÚK(®ö XyFÈ”zÍ¥C Sü¦I?–¨Ä&Àf¾Ç7mù<ÞÜÒ±7*Û)ôÑ”šÏ,›Q=¤ÿšã†Ä®–¦ûa׆çL:ýþúq&ˆHÆ5{ÆÒPs0ÞÌsŽØ]ƒ)º3ž Ӥ鿏2Ý;Yáéfg«žà4R¦åÕt¦™Ò¦;R‚ÎÖ•àÿc[ÄòŒ(÷ä©ßáx;&_)gg¡VUÛK~ÒJ³!öN–ÂUØÅÖâ3媆?â §¯¦'­mm÷Õ¬ Æ%Eh  BHa>xjícßê·àí•ô¸h6ùLémœvã«çfy Iá!KÅ,£œ.˜…o£, È“AF£Ck¶@ï×Ôñ†–FGø¶±51 Z \£0q<‰ëVçúD«Ê¬¡x?> ƒÞÏ'`½‡Ãh,•&½Â(°ÖGÕ%žêÚ `ÁÊ úÜZõœncn«YÅ}$wJ)*å|ïWN‘ÓGAq¤µ´µ ‹>Ÿß=ªñ7ôñ;X9¤)zŒð‹ø`Íc'Uyf­A^bøå¼Ñœ’ eükï±Ô4 ÅAðàŒ/ôÓ°ÿ€¥z,t4|‚-ðàÐÍ¥ßäjïÒV¬q‚ë#ÞWGÓW¹SŽþB4ØÄ‡Ëf/^jµ¸úÏû,œú-”=3-C£á½¥Æœ…õÍ„‹i?„ú5õ¾ßåß³I`ü–è$m—øÂžšIÃâ™%X8 œ ˆ`[ø1îÝdƒŸù £]”$É/À£Ã ŠÂ“h/æMEhä«íÞWÛÕ \Àú[_%¿PK Œ®A%Gc ª /org/hsqldb/cmdline/sqltool/special.help_de.textUMsâ8½ó+zs ™ 枪­çcÆ$;˜ÍV “š’í6V"Ë Éef~ë\ø9lK„d(ë“1ê§§î÷žâJf¨̱´úÈá’ ƒj…<-P>¡1(aÁUG¸RÕ¯î'\ê´PÈ“ZN!A–MкGµ@B”Óâ£øâ:ön{Ã08:…ºVç@µvÉ`USíT¡\¡ Z@Ï×sØ÷Ä»4áš‹›åÁÞåW˜x DQ¢†øsäömØ¢C?NKApüÕ¬kí…iž’[‹ "t}!,9uíµrÿI8 Ž¥)ÖÂ4ÌþÜ vQ•„‡>ú0VLjödx%· øúáexLz£«ð¡©»|)ÑXÒd$Â_ªš*V–D¤ÖÐÖ&ã~F’¦f¦–¡Í‹Y™¿#ƒ‰Q5þÈ™ÐøðSV›ªd†ÓÀÖƒaýbB²h3§!âíZµN mB5ÅDr]¢œ"ðú\®Õ¬ÎsTˆ·ŸlŸ¡Wë)KpC=É`–³¬›1ƒmZMQyìŠéõpž„×=Yš˜-2xÌ’ôŒ0èóµÍ¤ÝÇ òuÛÅ´£b#çµ·ÍíC{þ=ŠšÝDá}HÙUÓÎEæòyóƒàhÁüeš0…¨Ï(´KØã¯âüXÓ yh3Á´&øá–»ÓÉô3L>P{oÊY¥Œ•–›‰ÔkÒH3+—äƒø¾3¦±eÞå‡ös¹ãuOôÎ`w³&¶‰yy~¼ ¤r¾Ë'%>öpcªSº5hk{X£XÆ]¹óÒE|Y5›¡0°â޶‡«`âº4(L)¬v"tÁÜvÂІ*]Äê´^Ãи>WÌÆìÁÚ*Fi<µ×&z×¥ç0ƒIh[pKÉ¡ìõâä{e“aûÉ]ìt Uµ}õ‘0§¬I²¾+ì£H"ÌôöóGIð5=ÑÉâëx<ºê|iÜáÞ›!˜½†wŒ}ƒ¬?‰^ÙNJÈ_0«s›Ð;Îöx$ªñ¨wûí&¾ûæôí0)ᦆbŠnRw'fÛõC¤_¦;;·çFW‚Ù·àPu;­¤ÄÔ®³¢êæoª½)–ð}Üë‡QþˆÃ(¼AðÂåÖocÜ«DÚ(´j?Dá­s~sÃÙaùj‡åü GãÿÙ¡õPK Œ®A§_äó,Í/org/hsqldb/cmdline/sqltool/top-boilerplate.htmlµWÛnã6}÷Wpɲ㬛ÈÎmœ´Ònõ¢èSA‹´E,-*' òï!uµ÷‚ݱx93s8CMßÍ>^Îÿ¸»"¿Ì½%wŸº½¹$^†¿.Ãp6Ÿ¹‰Óþ`H暦¹0B¥T†áÕoñc²( ·Ûm;ê+½ ç÷abÖò4”Jå¼Ï ó>ô¦8„/N¼Œ0’8~‰î¯î>ÞÏÿœßÌo¯^§¡ïM×ÜP’Ò5¿ð~æ)×Ô(í‘X¥†§æÂûô çJI¯\‰ þ°^±(0Ïol1üÉX\'TçÜ\|ž_g(#7Ϩu¡Ø³oèBròB–°1ÈÅ_<޳§‰ë/éZÈç(çZ,AŽ’JGGÃ>“מѰï‘k#b**Å*ŒÊ&äµ'Òlc|’sÉcx#ª9õÉbcŒJ}²ñ ãfpÕ&ß…O2Í}PÃ8!/=5ª³“ïv@Ah‚²…¤ñ—IïµÇÄ#)`³Dí öJ4ØÞ¸—EeW–»k,\âÄF7Òá`ðï¡:àÇŒ2&ÒUDè? M!xMõJ¤äKÑQ“樫¤9¼±+­6) œ¢m" ws¥†áâÛ ˆX¯üÌ«ü¥ÒkG -µF¾ì¬oÊ+º ¥×eOŠÜ<³ÄŒR•ò=ˆšgœ˜+Zˆc#ÁM›‡§HÇB™+€nÞB3בõ ãu¢ è ·ž–¦Ç’Sƒ2‰ë‡Ç¥uˆÔFÌDžIú<§+I„QF©Üp¢–ÄÃužOÀÁqBDN„”|E%9­À­`&q\«²Ú(„LÎЦ6j;Tâ6˜7àˆë³ÂŽÚíä${"à›êýN¬3¥ M šô ÿ%Ù+åÖ~;•ŒëÁA14¬t´¼[Œ¡°âÇa¸.'ö8wt}†O5+)9šÙ?R¢2¨ŒeÙ­ƒÙŠýI“ Žþ'NÖk~ÒÇi,%§9r•U\ùð´CífÊt¸u¤yäµÏôZ¥*ÏhÌqji:ø”ñX,EœGŽ 6†ýüA˜m¤ q¶7’ø°ûkåÒÿ—M &íàrìÜOÿÎå“·òP‡¬—6K0>EÀŽÆãñÛs<š´ [F¼Nq{ ÆóX‹Ö¼}©Wççã~ìÂilJnœÃÆy ÈÌÊŽGVÄðb‡ÄöÛ•Y¸¹$=Po¦Òï pĨÊΗDé’è.må}Bn æ*È]͈9ú8Ýå%r´Œ‹œñí4'dÿ€T3Ñ£ÀŒ\£Öàì¹Q¢0´ÜÎx¬àÖ7½ˆ€¥\KQ¬.éND‡».¯ñé`UMÆÃfçgã±¥å[¼Ô•HÅX·ÎðùfaÛÅÁyú{ "}¯a•Æ¥R¦×:Û‘áI]nšY4ÒÞ¡2çJK­Ê¶í,l\%ºn©NÑšÝ >ªA1wÕˆ¬iḀ쬞â7Ú1ÅÝ9GxÏØ7pß¾faúöv†½œ½]w™p­•Þ©’VXqTç!²²J-à ¨áu;t(W›]|Ú»‹˜a°÷7PK Œ®A¼„Ìmª9(org/hsqldb/cmdline/sqltool_de.properties­[Ýr·’¾×SÀÌIQrÈ‘íäìf•b¥ôC;Š%JKÑvâ£S.’ç‡̈OyŸnß#7~†\ùb¿îÆ g(ÉIvו © Ñè߯àêo§ár¿FyšFïB,³ti²Ü§¾ùöéSõìÉÓ§]ü÷ì‰zöôàë'Oÿí­*§oL¨þ¶³ó…:=¿¼Ž£¥ÎõÂ(WdFå©*œQ§WÝo¿ýûtŸ*“LÒÐ&35M3¥“[eÞç& Af2×™žä&sЧù\ÙDåsëÔÔFFíâe¡£è–§ÕY¤×{x*¼V™™š Ë€dâ Eï]@\¾èúÃóÆì«Ÿ£ÃŸðV©7s›ƒõ¥žu8RýÁ‰ºx®ÎNý+lB]¾œ>?=Æ6ï ×¹›™MÚ\:U‘M@Ì'i΃¯iÈɰepêG¨²rØ¥@¢(]Ñl~¡Õ$Mr›:·i"ÏvW6Ÿ31²ÊÆËÈb›‰Yñk—Q7:*Là‡í§ñ/CEsùý2376-œz¦²’éˆc£â\®jûhÊxj<ðšvåì,±S;ÑIÞaÑóœûEá7’ovâ<=Ïž0{¨05üD­Òl¡´eeÜD/M Ô+XR‘XØQ×Å“'O4o}œ½€¸—Š®McúY:Ѱž«<#n2ãÒ"›Ñ`êÕ¯ÑOË*;Ãg”j²Èñ­šé±^êqd.Åbn‡žÂQ‘„‘é(=LÉ$AÄ[Õ­šÃÕ\Ó^DÊ™¼³ÑŽ:u5‚è1©MóÒ ÛKC„Þ÷/‡—ýáèçÁáy?`‹fv2ñKQ€g´ÿrZÝÂuF¶ž,‘†Oð/“ÑŠ:™zFf€­8cømë.™–ˆGÓ"g3!±•RQ sëÔùáÏjp1RÇp©Óz58鯎/†}R¼¬n OïCÊ´"ëÛ„=*â¬R¾¿máCŒÏdkS̰2Ø}ÂKeñÜ`%Y楘ïÂP$xm2d¼^ ‹w#R`Ò),цªEÔÏHÒ­»+=û°óK8žÁiY77aïÇ“£ãi ñpÜD+ŽWfª7S`÷IÆ:YÔu§#G‹ý¡¥b›cà7Ô©K#f1àý™ ÿܾhq^›ÂÚ¼,Q>2ȲkhP–x¤îììë;U$ÈLœV<"cW@I!,ˆ†¥ÙG¤‰mZ¥MËE¿#Þ`åœŒŠ Ø›.¦”^s‚£ôº…h(bŽèI .,‹l™:€–Ò&c˨}dsˆ r2œ±W&±ô€“œß’·dŽ®ˆk ÞAnfļ}L£\@&ÌÓq1„ì õªK4Ž”‘¶wº—<€œ’HÁM´1öÞÚ:ø®Ebé($8š"óaøëbúihúhÇ&Ë"ßZîp‘¤Ò jœB¢jU€³?X—v#ÍÙýF½3Cèœw“•±ËÒä Tš÷š>ÅÐ) 0Ÿ[7žì½JÖïóáªÍÚª"¦vÙàF·Ë=¶XÉpŸ!PŽ©Ñ…ƒ¯Ôn~»Äû/Ÿ¶÷¨E(ãc›PΡØË?&¡Õ‡åè1ní 7Ç:»•™z\çî²·Å,³Ó)™'ö%æÀ¬…T°Ãy—2ÏÜ80°,%汋h! „,Ê n“›^ŸÁf‘Dꨡ´6ë(aÕø‡É!˜V[†ÇXt¬'‹ÒV»#†: Éœƒ²O“Åìc2ã©1T†cR%1!-O,‹û%9¡7<]ãéÚ"¦"á ‹ie–ß·Hb–xð2ÃÔ±+±¡2 ·^Yvð2ï3¡÷IQC½k…À’™ ‘¿ÎÏõõCW)!Ä1Ï3ôf] öæ´Š¸ð€™¬,O]²IÜðP¶£€‚âŽú®ÒD‘,’t• žŒÍBSÈBÄò^u¡» Þ—ÌößS¼”?(è\_¿W#D Déw¨+²w”ŒHô ÷Ž`¥j¥¡yÕ?ë61¯UiwWà,!€öwm„)†|•Hiré>&‚ =h„tŠ/Ân\²{7ؽ¾Ž%ÿí_NQc¨úÇãROà1– M‘›’òa›lÁª¨ÐÿÕk™ _:9ãqêÓ8ˆ_×ããJì™eèYçØ U¹îç¦Ü7³\õ]°9‚ycôÓûat~Ö=OÃÂq4þæF‰ßñ'E2©Hˆ¹†æ "Pàü= Rñ'áìsgÝ*·C:ïF‡ÃýÑ»ç§gý–bš5%ŒÑ%/î ó&ÕÖa~°ÃK®²47"ª$ÞzápžÝÀ[ÃbÏa°“É<óÅÓªª#ÇMAg·€M5v3U/—ਚ[Mvà7kNÛ„  œTI,+Q¸… 5bá­5QÈ´<ŽÛWDvaz××!̱t+oM„LÕÆŸÚŠ¿«‹£áhÔi—…=ÿ¾]EN^Ž“2:,¦”WØÚƒ´Èx ª„m±—~hu[Õp¶:ßÊ¡º–[t ¯ævIëmšQÖxцf7ÙSTÉ9¦D‘ÜÄ?nR°MéÃ(¨›#Yíz¯%ÝH¥â(•òh_Ø€k3¥35Â\ç[ ÏË™FÛc!•Þùï>Ã4ÅÌM43sîLPÓ!£‘¥s4¾2dwë¨g[¯Z¡à[ÀÉø¦ìÀRø©~¦4¼3q{¦ßáøê_¶Ÿfjµ\¹W‘ Ñi0X‹_¤âg˜»oÒýºâ±G>Ü„f™>€e¦Ëfô{â¿r*:¶Ó~cÉ! ö“|*>LAÅÍ£Ê^ 2SgBVO$a0twŽƒPÛBYë{¼yyvom§š’©û\©³YÁÝIÎØŒ‚î‚ù62ÁŸÚÕ^Í!a Ò™¨-v§ñ]ÉN7ëáËTÖ…n K Ïw앋߸喨—‘Ž–Ž?ŽŒXdÜÉÜ€XgùÜõÞ–‘ºn‰TÖ †*ßÔ(lñ½ë؇èJƒµ]aMžC°Ò‘ßQ(+Í‘£61Õ¦1%ˆ¢±mUZ7| …iBrßb:ü”M«vmû M§$E˹¹µ›SIÒÎfŽý×þ» ÐéÅÚ,)ÉJbÃ¥ˆF•Z4jW|±¾£:–Øî¸Th—+ÉT.{ɾÏÅuÿ |ëbrWJBx#™€]¦‰h%–I"Ù‡¹ëwÏØ)[Ûç4£Ü÷6Y_ùÞ¶Œµ¨åYlÄ# RgnmïÜàEš)J4‚òW½Ç«7‡ÃÁ«Á‹ƒzO‚žŸQS¦¬ƒ 9–1tÆÝ| ZàÅ\S9»=õ‚P»£ó=¯tn« ®'™p×ǧ™°yþ(õßaÖ;¡/”‹Q…”IñÓØãÉaJDªIIêŠeRï9`Ö‘TB ™Ž‚AüOIW›~~»Üf¡èõïðÅ’;r°.ÀUôù|fª~¼lˆ’§ó‚¬t™MýsWÃÄ•z£©&.³flrÍG S“Oæw,ñ\^›ÍoÁotÌhÕ{ÈÀÿ %7žm¢ÈV3}ÁðkÜk_Ê“PUMj×®Õ‡ªý}#|!7J”:Œ&iÓYÚ–b‘â[œ{Ðh+Ã%V®8ªXžÚ¶]:H›juÝÅû“£î‰¥.Õ…IÆeY‰Î1k±4´ð:±„ξ‹H°¥òwí›8cÂàQ¯ôª¹­P©•ÐŒàÉ`Ó•ñ@©ç}ú”MÄ«ªúÁn¤*ÍÀ窤`!n…z+wG·K>*Ú»§š¡ÖõÊ‰Õ °0¡¡±„÷€úRêžÖPש1ˆ–kÚSmZP,‰é †`,ê‘ÆLª‰r×eIc<ç"ÒYï© nŽ v¨cž¢ò*}C§œá;ÈîÆ÷´·€õf56âM ³·VBAdÛ½Z-Íäfiã‡ÚÌ >çs=9ÞZU7šÂÄ"]rŠì¨Yí€éÙ¿·$s·º_søÁé+9ƒò¥oP/Øø¸ª¶Û"sçú×{Ë}µLÍíQ/t²^kjÁó¹#Ë“cZ„ξ˜=žÂ|%f¦yÞ[ÌéˆL€^~ªà€œ>²*$ðÓØ0G§%¨¶·4‡AäEVÎ[§¾”[é}ù¿šÆ§3Mâ—tí@¨p?l‚`:9–þI:SÛ/(öÒéWïäpÔŒ~¾Ü°²a>ï û§£;“a“Ê‹ÞËþé ß¼:;ÛAuÌŸðÛð¿ßž^^ ¶‡8ºÕ»zyxv¸¥3ºrÁ¼t–ص/}¢÷ÈÔÅÒdþ¬šÎZƒÍ÷ý<jìéÀía9ç`áõÍwÊNhÙÔ]ÚP¯‹Eš®ÛÈ1ÿï‚ø±”C] ”ro°¾ÉX°d^&ŸD²~•–颧©rP’#j$eû¾D%Dù/у@¢Ï#zøsÔ9A÷í=døŠwYˆ åXnÞ_ ®FøÿÙUuy†r.éúv¹uíÛã›õŽ%yÈW øXšgsO¹Õ䍯·>evu‰Kø–~®¤éE½L—ӵ᫰?ð˽ò¬¦Nmk¶[Y$b:Ýèùù,!ê*^½öë³"ÄêMÆçö¨ ç‰ùÔ²Ï=,©Ÿæ’¡Ïõø¿²¢œö©f5|ö¯¬Þ‘åCP·ªÚ»tÂwr>Ç@"ÐAt%1¬Xg€É—56ëböOµ¾ ï°‹2¼PÑÁ‡0Ô60öHŠI“$þ(©>óT+ ['ò:ià1l6Üô!ƒ_ ƒU’¨ÛÖtëèB ᆬ\{êT‡P¹i‚öe󋙈í:“Ë:ý!¿«·íÛÕÝ-+)¨‘K'’òëéüâƒ(ø“£ žH>¾Ð¸ÓE",fÔ³Ǹ¢E»õÈ+GA}›ðùÕÝ{+bu-¥ =ºâu]Q#Õ½´\lóZUA\ŸÞÕ|iO°¦IŠò ©ù¹R(bòêî(MÕíÆ×Y“Nçk?ôY5t%—Vya­Í2ýl…Ü•ÓUé™q:ö •=¤˜n•ÓA¨°õo¹‘å7–KN¶°Ë?d¿j å³1‡æ¯liÃT©°`'·±¡k»½çš.H)QÄûqN{G¹“¦‘ÑIsБ<ìrš.óh :-–«+ÍzF®:¨°ÈäRy£?9¨¸-M}bý½Ã­äB#cà’såÿ ÉëMÈÃ>¾êl*°gmõឯÐX\ 8[g·þ¼]8êH&S¸ºuX;wØWo¥•bV²…}æÃPïdïà¡Â°Ïu |óáËýýà+øÙ ýrcs¤Â7·¼c"ɦùæüíüÁT§ÅaÙTqóuyJ@À:e[C0‚” o4BÅÐ%º.JYyÇíû™?Ptê°˪¦ß}lųe‘Í8rÔIœùK¤¥²­!—~Mr_Ä»'ÂU„{÷v–ˆ%m*-lÖî­”—æ6Cå~ÍT° «ƒ ùŒß÷V6=僊þ¢ìf;èµG¶Q™"É•%ììŠt¼j]ø{…rÜ*em·ºÕêºgæÆDµ¥áØ¡bvh¡ 7»2Ÿï2:§*VêBn˜Êd|l@!RÐ ;‚é3ó¾.I‰’Ç‹®\^ò!ù§I¦rbY÷%ƒÉüu›íSK™ëI–¹]ö6—Ûö¿g^ËL|®YÚýÁFSóHÆÄ<¤_|Â(GäW6«™¢Àòf'ãkݱj”3±í 5 ¤t¡ÂTI´è¦ª´;dwU²Ó`¡v`ØwŠ:´rüR!³Š+Z„NHåHÙ£Ìsp›®‰BeûNñ¥HéØvý=‚. Ìœ~üSR½Ô¨Œ¸ŸÝâCn%T[,ŒÆ­kD«Å':‹Ë¹IÓŒªË1\NUX¨ïJ®/7՘Űª«Sw©Ò|yË)ã®’×¥³ ºëI‚Jª…Ê3žsºŠë].À?ªÅ«ËròÓ4ºÊ©³þëþ™¢óyv:oRÊ2@Ð61àO’Y ñœ~Å6êðç°£NÏ/:,ïÓÁ $ Lök‹,Ò^¹ ‰+þ²Aã"gÌ}ßf{÷çQlèÕyÔ£‰’A¶œô$*.Á†ýã‹áÉÕ»Ëþ…ØùùéˆoÀ‘%±9•-&ÉÙÕäP¿úuÇrÔóœ·ÈL3;Ø„%æ£ûkû«„Bñ3ÔäŒT~mC1ÝßH¹ÊB\åñ¸ݽ7âÈü[$$õÝE\ë½±YuÉžˆÉ9—ûýPK Œ®AçqéÒ4(org/hsqldb/cmdline/sqltool_nl.propertiesÅZms7’þÎ_c’¢äH#ËÉÞe™b¥d‰v”èÅ+Ñqr«-ȇ0gô F´”òþö{ºÁÌP”í½—º­ÔZÄ t÷Ó¯ÀWâëÓx(Ê÷©5&}›§Ñª0+UX­Jñý¿ÿõñìéáá>þ{ú½8üaøÝ³áÓþSTy)oU,¾îõ¾§ç¯.¯&G“¡çr©DYJX#ªR‰ÓëËý~øË_÷…Êg&Öy"æ¦2¿êƒUy 2³…,ä̪¢Ü½©± ¡saºs*±ƒ•LÓ;^Ö>"}ÞÅh,ðYj® l’ÄA‹¾—òåøb|utÖY}ýÇÅäè÷!¾ ñf¡-޾’3%Ž&b|q"._ˆ³Ó‹ñ5˜×§//N_œƒÍÓ¥S•è<'æÌ\¤:q>7–'ßД[U€eœÔÏdU‚K¤©YÓjþ ÅÌäVç•´Úänlg­í‚‰ :[¥læjÍŸY\JÜÊ´R‘Ÿ¶sl²)>Æ‚Öò÷U¡nµ©JñL$³ç„œ)™ÓIpÊu‹¯©‚¦”§Æoˆ«R'¹žë™Ì틞×l…gÄ6œ”žžÏ®;ìM.b£xD¬M±²e¡Ê™\©Hˆ×@R•kàG‰›êéÓ§’AĬO %—w^Z%cÖõ‰šË*µâÌÌ$àsm :N¡JS3B Ö^¿O'€<í? @ÿ©‘Éé¸Róc¹’ÓT½r¹»òžWyœª=QBsÂ$ˆxX݉ (’˜qú¥²{zÄùëë ¤Dä7É[ƒBŠÓZl z{O½ÌÇE1€w7=ñÈÿ0·&è§/«S•©ÜxEx²Ù~C¿c9ûSó¡¼~¯Žã¤¢5Q—~›($)ttAb0 4«` ª^íwÛQù.mWÚB-­;ì5¬"—™Ú82Fÿ‡g^ɲ$¥DðU1+àÄúµÁ˜HÕ=¤üI™þ?è/Qù¦ãÌ©ÙÃðo…ßôêøsE¥mwgå§7šsÞªPpÐ ;5Û˜Õž;p‰#’ÅÞÏ9«Õ†ü%4¨ZŽI4Ü'òýOlþìcï]½¸˜ ¦ñI¦%íüÝGøbMÍÈIµYº‡sñ<ÖfL{@tLÇãIDñÙ'yùîc/@£P™ b|A¾šT¼“7¨±ŠmׄˆZ‡4 ¢FßÈËÿÆ1‹"æF–B!¶§Si¥ˆó«ªX™R5¸aŠÚ¿Tj|ô³‰sd„sψ7“_qÀë¿…S±¯sãÄ‘£À¶Š­™Vs$€£«jÍ‹æ…LØfµJá³KŽ·n‚ÒU•‹þðǾ0 !L'8[BÉ(êé|UÙ-~®4-¹|ÛJŸxÁ™-{ˆãõèL©„Ov>ôf’ü‹Z! ŒÚÖÁiMD‰¶Õå¹Þè2çÔÚmÀ“¥Yé±cïVŠ×ï2]øù ‘z^Cçë?‡ßzb„ƒÝµªYz¦sŠÊ %çHRC¨æïС3¾ÞªÐ™,îÜ*9CÖU6¨¬¡8U¹l€S~ŠUºðrzÉÿfènS¥Èj¿Ê‡Ü¡3ËÞ*E0ˆ(¼k”È’•Ul~-ã#‡Â?UµÑQ6ÊÁÞPê£cÏ/ẜ¥@sãwS¤!å @˜,ÚfÚ+`.8úTΖ£‰*ª„êC.»“€”+5Ó0\hŠþbM]󒜠]Ziò©ZRAÊù©çÁ¦>¨YÅ‚z­­Ã-ÏK ÒnîÐù§&÷woÛòzé¶ù¹7ƒèNÙÑ…I€&Õ߯DŽe2õ)Vƒ;7`•‚ñ‡óaræ¼Ý!ùOO é¢EÎ.$“P±Ø,A/’D- ¢Ø9P| ÆÍn¦?ü©ï þ­´µÖàPf ½œR~ìʃÒûXz«iiµ­Ø™ŽøVÐO8NÕäºrJqg‹Ñs·§ÏÝàïuÓá֡в…iCÏb%maàRá} 0PTÚ.Åò.·òÃè:Œ!‹å¡!ø/ˆßB%UJÑë @d6&?`•\è$û±™=’{R®jrÊŽ)¡FÞÉžÈöÄAQU¾ÌÍ:‡T<:ŸwEŠ“xÍÆåmô¡>óø¹½p\Ñ¿¹ù ,eâoÍüí­Vë·”e‹¾ ZÜ}¾Ÿ'"¸Ö¾WÖMogÌ~ÁÉ4£ÌíÇÁœ;"4{ZĈ%3Ôå®;UVŸê4ëžêæ&ãòçºXD˜*þþäT_?Š,ñk9"Ž$YÄ“ëßê°µÛX8ç«Ôï(Á=þlõ>bbÑ%/Áü„ËW‚¡zùpëâzó‡ð-‘íæðáVÁˆü´°<ê-l†UÐúèçÉù™8§ú›\eåëz¥È\>M’´H|•å@+¢4z è(Î_yßKx<ÞNŽ®^Ž'o_œžµ›FH®sjë:%Áß¾¯¨‘ÂDrgÎPlÔãíÖb‘'iKgÉÂIÈÞ NNúMš Âr8ö‡aªI´7—†¥rµî®µFÁ¡ÖÁª•»’È6)Áº6ÄkB{Wu–±k Ù‡Y‘ˆ8ïn`G)ÒÇÑ ¸.ôTµ|kô¸Àí¨ŸO1¸¹‰Pë†~Ò/qùüXµ ‘›ðÓ€ÔøÔZEQ¬#29|†5:Gcl$N}•‹3£¶“‹¬2…BiŸs1æs®í(Í$;ôéˆr96|AµVá#‘Š;äáGëÐ$Uy<×vÇùÛKÕ Œ¤Áµ‚ÛÞHúóTEnÑb+—-ú¸ÛÆ1æÒÍš„ Ê­z¯ê„vÎ<¦ŠCBÑES'‘‘olŒŽ*kö‰mJî¹4ñܺ”Û]SœP"FðLÁ¨]¸¦Ÿs$(kŵü w‘ë­MïP*èÜg£ü“ü‰Œ9ô«C,¯“PjYð܃¸ÊV^õªÆ¶YiG³ bz܇¹îÏÉnÊdŠ€ÞN&½/û7‘JÎ91aA±ÁwŠnqy+kñôüo§\ŸtQåæ7Óý™;IX+[܈ºSÆ:ž¸2É¡˜Ê£>¥ðÓƒÝa­Kš€JèÞ‡ÈÜÌLZB Ö™ågÄ&°¸4)G?!d0^4ÞŒ†ßö¿9ì“I~ìï÷ÃTG³\êQ =—%B²GYs ä.yáNF}œ¦=W[á°¶XÔ5©–ågs5D"žXšÈ×Ô:šSÛëÅkZ°»êT•–À­c°qn\\Dç‹”Ö da…³*6–p@JãLÅ€ò®¤Vf(±þú2Vð¶Tñ ÉU‹$yfÕãÅYM$´l'ñóHÔpR#‡×:uGTn‹Zº3:Å´Nºuá—è²q6_‰ÉåÉ%ðÀAÑ]^íÅÝAI0wÚg³ÞêßB$P㤥y^'M5FS—‹&sý.¶~D©„¦bݲU}û¬ÒÓiUÛ 9ÊíS Uw ƒ×*u"2¤-Ùù€îg"ͬð€ëllêûÿ»;êy³/þ˜»ý¡­”£*«¼$kžrP§Þ9jµå;å›ë¼5÷kc…]}Lsü¡ƒ’9±‹rôŠNä­â‰mˆd.Úc-OU”¶q±Sç–Úµ89¥i-¡{„mò|3¹>‹B5Íæüi@k-\zC!jòÑЉ‹Ì$ÊËe0 ‚Ýå¼^iuŠè)Ë‘¤†")‰Ì?Þò]R+ǃ7ÏkR’D¬‚’ÉÏ;Óm³’ S\0îŠÚGRŠ®\UvSèN„…E‘þ¿Än~n[Rd_´¼dGÐQ·[þ©l~áL„ŒvK”‰±#ØB©›ÑdQÍø^‡’€ᨧçl'_ÄìêÀ›U‹)=ÿÒÅ­E_¾éƒýV[ò‹–›m¹/ŸÇ£ÑwØ!a°wÝðOÚæjO·R‚Ž?é ØIô¯çnÇwF¡üØ‘AåLÅÖõèÉ“'âÍÑÑÕõñϯߜ^¼Ö=…@—fÀ—qs"uy*ƒÉGE€ É~}ñÖÜÈ•Ö7 ¶¼äˆÉù®3U¾ƒ¨IòV¡À*ªSæ6F=½‹âà0øÈeÀ•k3ú3ÐCªâÞ/ÎMY­"dùïÓt±Û\›Y‘ßBA¡çn: ¤Œá¢#EÈCdiJλ§©X£ð&ÏB*”ùúÕ¦ZsÃ-\o”­¦œãÃòeÏštëÙM0ú™2×ĆnT‡!“BV%ùri®,< ïe÷R©žR__Ûžl  ,êÒ¨ pËqKáQ»EW¾ÏF¯Ü@+µõ9GŸÚQ5N§}îkžZ‰¾Io”J6t T9Œ–_ö ï¶ ÷Ljí8;€œOž;å’ „‘{å³)÷J`¡4%çL{Íéá@•6Uþ–ô ˆ)ÕféhÂæâÌ€ñæ¥ÃEC$Úí8F£“*ð¶,ížo`û%M—¦ºë mÔ«| Å!’jÞ: ÖW0ß}Ü%¡N7êÙ¬K'8J& S.´òÝìîê8†i|‰&n"—FÕ ¿éÑAj5Œ¿½Eè4wfRÙEýáÑ!MkOBÚl jï*—·@>ݘŒŽëà>j¯¼ÐPG¦ÖQ¨¹  :sU¬­ åÆd£7|€}ßEv}Žn ìW„ kk¾â-ÑiÒx8B÷†/i‡Ïþ£/`¡ýáþw÷½éÊ)Ø”ë´,Zj(9Ág:F¶Pòb‹å*›òÕÅûNãgeJ @Í\ylôö(^m?÷³T"™LÇ“:‰À.Y¼¿Ú8GŒ~hP7ç£û(kF?׺Hè1 júÙ¢ãUtõ-¾r•PÀêñ5gó×öÙîò¼>èN¹ëöäÞ'·*#º’w ´ÑÅÑÑùæÂ:™Øèähr4ùãÕxsÂÞc1z~5ŸL| «4-G§ãÉþÅë³³ñE/5 ½9ÈQš$×÷tãD˜†¾]¨¡)ä˜Õ¾Î1ÐÕ`d™êdT¿ #ßK½ØÂ[ǽ¥rJöuèö©FÛåI!¥fG‹j<)$¤„-sÜ'ȈØÕÑ9¼Lq'~QŠýß³'¢\kòån4tCT±ˆ›Ž ™Rt`·Å•ÌÝy¯È«£ëÒêäµ}EÆO¤DÒ–zÖa«àÅúÇ,T3uX·Ôó✠‡Çî-Þ#F)ûðª¢bi§4ÚȬ;Ôô÷]+DÊ곈.¿` ˆ"\µ»4Ý¥Y!˜üÞÇ Á‹àö‹¦?jð›ÿ"5ò©Ûi‘|9)Z°_(?ß=ª´Ü»k“å—uÜS£ùùžåøòâz‚ÿ?»™\¸¤Yžg×qyøc£›Ú<Ãðå¼¢¹&ï\­ûr·›öïbx7 ÈQèϬrا;'$Ÿ4æ6®à¨ûq~ãÑX¸7¨>8ÅŸÌ»½Ï­Û¹KÜ£y›·æèþS*c–vûIØðî9å!IMÕ¸NªßiC4ÞÂcÏ£'‚Ô‚œŠßÏSsLð U¸‰ä÷›Íέ~®¿aÉ3¼ø9‰u¨`÷þÏ<±)#ÝuâùÕ7zÅy%ן¢_â„5[ß}…ÜšOân}¸ÑÖ~m×É Zɶ³UõNÍ6Ke«ÕCl>x”%çKU‘‹R[®çI÷^§EôÁ/ï@y=¹®6Ýæ”tÏÓ±.)^Å£çg—¿Š—ã“ñÑñäô·ñøêWÒ[W“G¾ž' A1èêæ 9ew)ø¬þÆÿ“Bó˜óøÁÁhÀ½[P[•ûÂôþ¼;î§< üà˜g%gƒ¿sKî×cÈ­÷Þ5ÔóžùyM÷С;§Ë…OQwÍWïš}üVû‘½ùCR?zŒzVgŠ^×íNЫì€ÚK~VPüÔ˜Tɼ;ÝnÎõO’ft#ïÞmKípUN ¹×ðéÖ›DM= ÈidžŽ•®³vjs¿Ão÷¼´ß<ˆ —öЙ3ä·²¸ Ï)¨ÅI±Œ®¹¸COIn@tÌã Æ,ÿÜõIЏÔâ¾ÿøµÿö­ùTý¿ùó/Ão»’s÷€‡_Îy{E<6¶¹b´v÷•{¦Š”â%Í9_Á¿nÞ–P±Ú¤ºÓ­¬q£®Rl¼@èŸÔ> ~ŽªD³¨צöZ>sU‰j“}ðnt ßrms›[ÜÜúßÜ¢+Vê–-þ PK 9A¦ùë¤META-INF/MANIFEST.MFPK 0Aî~=÷;^¤+META-INF/hsqldb_lic.txtPK 0A>Z¶íä± ¤›META-INF/hypersonic_lic.txtPK 8AAfþV`+¤¸org/hsqldb/cmdline/SqlFile$BadSpecial.classPK 8AÙõð©)¤ org/hsqldb/cmdline/SqlFile$BadSubst.classPK 8AÍ“Y-?/¤ org/hsqldb/cmdline/SqlFile$BreakException.classPK 8A¢Ô >2¤ org/hsqldb/cmdline/SqlFile$ContinueException.classPK 8A7íÞ8 (¤›org/hsqldb/cmdline/SqlFile$QuitNow.classPK 8AÏ?k+>M*¤org/hsqldb/cmdline/SqlFile$Recursion.classPK 8A¿º4U^)¤Ÿorg/hsqldb/cmdline/SqlFile$RowError.classPK 8A&]`¦È-¤;org/hsqldb/cmdline/SqlFile$SharedFields.classPK 8AðÖ"&Žªú— ¤,org/hsqldb/cmdline/SqlFile.classPK 8A&MTûè'+¤øÁorg/hsqldb/cmdline/SqlTool$BadCmdline.classPK 8AºƒTóF1¤)Ãorg/hsqldb/cmdline/SqlTool$PrivateException.classPK 8ARéq M1¤kÄorg/hsqldb/cmdline/SqlTool$SqlToolException.classPK 8AŒ[…â–¶0 ¤Æorg/hsqldb/cmdline/SqlTool.classPK 8A%E‘$º%¤ÛÜorg/hsqldb/cmdline/SqlToolError.classPK 8AEå%é> '¤BÞorg/hsqldb/cmdline/SqlToolSprayer.classPK 8A®§bçêC"¤Åäorg/hsqldb/cmdline/SqltoolRB.classPK 8A/[!mÑ-¤ìorg/hsqldb/cmdline/sqltool/Calculator$1.classPK 8Aµ¾‚‚‘0¤org/hsqldb/cmdline/sqltool/Calculator$Atom.classPK 8Ah%áíEe2¤Øorg/hsqldb/cmdline/sqltool/Calculator$MathOp.classPK 8AP™0b  +¤m org/hsqldb/cmdline/sqltool/Calculator.classPK 8AóàCbü 1¤org/hsqldb/cmdline/sqltool/FileRecordReader.classPK 8A°·W //¤É org/hsqldb/cmdline/sqltool/SqlFileScanner.classPK 8A71ú¦ &¤m8org/hsqldb/cmdline/sqltool/Token.classPK 8AÒËAĺ-*¤Ç>org/hsqldb/cmdline/sqltool/TokenList.classPK 8A²[Gû“Á,¤É@org/hsqldb/cmdline/sqltool/TokenSource.classPK 8AÜ+'·(¤¦Aorg/hsqldb/lib/AppendableException.classPK 7Aàa¨¿F#-¤Eorg/hsqldb/lib/BasicTextJdkLogFormatter.classPK 7Ah Ûê«ä(¤¤Horg/hsqldb/lib/FileAccess$FileSync.classPK 7A¸»ýæŸm¤•Iorg/hsqldb/lib/FileAccess.classPK 7AgRWˆR$¤qKorg/hsqldb/lib/FrameworkLogger.classPK 7Açz)ª/ ¤Zorg/hsqldb/lib/RCData.classPK 8AŠMîœåè7¤mforg/hsqldb/lib/RefCapablePropertyResourceBundle$1.classPK 8A!Üæî€"5¤§horg/hsqldb/lib/RefCapablePropertyResourceBundle.classPK 8Añ‚Í‹ò*¤zxorg/hsqldb/lib/RefCapableRBInterface.classPK 7Aä¯ ã ¤´yorg/hsqldb/lib/StringUtil.classPK 8A­iùûæ)-¤õorg/hsqldb/lib/ValidatingResourceBundle.classPK —®AõoRlW2¤&ˆorg/hsqldb/resources/jdklogging-default.propertiesPK Œ®AíÆEâøW>%¤ÍŠorg/hsqldb/cmdline/sqltool.propertiesPK Œ®Aí=¼Ur†.¤£org/hsqldb/cmdline/sqltool/SqlFile.banner.textPK Œ®AØ'©y¸1¤Æ¥org/hsqldb/cmdline/sqltool/SqlFile.banner_de.textPK Œ®A¶Ö¢l¢.¤Í¨org/hsqldb/cmdline/sqltool/SqlTool.syntax.textPK Œ®A¡±ónÃ1¤…¬org/hsqldb/cmdline/sqltool/SqlTool.syntax_de.textPK Œ®A‡²]?©½2¤ó¯org/hsqldb/cmdline/sqltool/bottom-boilerplate.htmlPK Œ®ARã¼+¤ì°org/hsqldb/cmdline/sqltool/buffer.help.textPK Œ®AZ•¸Z:U .¤µorg/hsqldb/cmdline/sqltool/buffer.help_de.textPK Œ®A«„Õ )¤ž¹org/hsqldb/cmdline/sqltool/d.options.textPK Œ®A‡ÖÀ¾˜,¤ê»org/hsqldb/cmdline/sqltool/d.options_de.textPK Œ®AlKå%:o+¤ò¼org/hsqldb/cmdline/sqltool/dsv.options.textPK Œ®AÙóšGK.¤uÃorg/hsqldb/cmdline/sqltool/dsv.options_de.textPK Œ®A / c-+'¤Êorg/hsqldb/cmdline/sqltool/errorat.textPK Œ®A Ç¿o/-*¤zÊorg/hsqldb/cmdline/sqltool/errorat_de.textPK Œ®A5Yo·\é*¤ñÊorg/hsqldb/cmdline/sqltool/macro.help.textPK Œ®A´Œß½‹-¤•Îorg/hsqldb/cmdline/sqltool/macro.help_de.textPK Œ®AÙôξâ )¤Ïorg/hsqldb/cmdline/sqltool/pl.assign.textPK Œ®A|5Ê~¦ *¤ýÓorg/hsqldb/cmdline/sqltool/pl.control.textPK Œ®AO¨–º'¤ÃØorg/hsqldb/cmdline/sqltool/pl.help.textPK Œ®AžNƒ°s *¤žÜorg/hsqldb/cmdline/sqltool/pl.help_de.textPK Œ®AÑcö»Ö*¤Yáorg/hsqldb/cmdline/sqltool/raw.leadin.textPK Œ®ABÈ<-¤"âorg/hsqldb/cmdline/sqltool/raw.leadin_de.textPK Œ®AöÄý´MU3¤5ãorg/hsqldb/cmdline/sqltool/rejectreport.bottom.textPK Œ®A€£4{’6¤Óãorg/hsqldb/cmdline/sqltool/rejectreport.bottom_de.textPK Œ®A˜!$>z-0¤¢äorg/hsqldb/cmdline/sqltool/rejectreport.row.textPK Œ®AŸy1=l0¤jåorg/hsqldb/cmdline/sqltool/rejectreport.top.textPK Œ®AGb®/¬3¤õçorg/hsqldb/cmdline/sqltool/rejectreport.top_de.textPK Œ®Ai“vçü,¤uìorg/hsqldb/cmdline/sqltool/special.help.textPK Œ®A%Gc ª /¤¦ðorg/hsqldb/cmdline/sqltool/special.help_de.textPK Œ®A§_äó,Í/¤“õorg/hsqldb/cmdline/sqltool/top-boilerplate.htmlPK Œ®A¼„Ìmª9(¤ ûorg/hsqldb/cmdline/sqltool_de.propertiesPK Œ®AçqéÒ4(¤¿org/hsqldb/cmdline/sqltool_nl.propertiesPKHHè 'hsqldb2.2-2.2.9.orig/hsqldb/lib/hsqldb.jar0000644000175000017500000533443612007570424016647 0ustar renerenePK9AMETA-INF/MANIFEST.MFþÊ•X[oÛ6~àÿ °5á$]›¥èCÓk‡d8Øë@KŒÍŽ’Ží¿s(ÉæM¢÷Ä䧇ç~øHkþÌ´™ý͔沾-.É|rñeßHefÒò_ºb·…T+²Ö/¢Z~Øj¦o?NO+D3õÊÔgå{µ,á÷ä¢8.™Cô‹QrÇ¥» TÌC0½&àiPNm\SJzÇ×ô•¯¨ñ_ÇÏWkãÉÄëŠíÝ…jÉëgÐàùN_©'|©xc¸œº‹tkÖ }uÚY!Ïvà˜7xÆ´[n7ËFJ*ĬâmO¿/äŠ×©/»µšnx½"W¬¼eÔmúfˆÖbk'¾!ð$” æ”[Uz÷µ<±µQ3ÎÏØ¯z¯9YxаÓÈiÆ“xÒ'€LÓÈäó~^!ëʽng$ EÙxó¤D?´B/çÿ—Ȫ$¸†J'P­Ð»¾ˆn x¼Xw}ÒwPÝððF¤‘R´(ôÃýF†*ÈQí…v×%©äÆþ{šî;JûË(F7΂Q´Fyž¥ÚÀ®¶{v£'ìÈÉRJTÇàéÐè‡ögB¨"[ÃE’8#ÝGµ×ï]/T¬Ÿ~ÖÀfOÉö0ZBZ«Éžø˜x¤šfN¸Ê!ܨïì2¥œˆšŠÞ6½¸èÀD¥½8&9Á€'WQáŠóA?–'ðü¨ÔtÎ>M¬õ2Z=„Òx%µ"·F-Õx#!xX9Œ€HªÂ9k_Cµ62ÚH¢Fž!µtæ‹ËÎ4à‚¬ <¸Ý"6fa¿W2eܶ ó¼±Ñ=” 0´{õ©£)=©h?oô«Wá\Åþ"kcšiÄ}N>l/5VRý8ðkâùÑßöXO“b¤§„ÙÛOpl‚’¾Ã*âwöÑŸ—RU,j ]tÌ_ KÁBöÊj ÿ†¹ÿ)v³'nŒ‡ C늪ªPÛÚð ‹pÇéòŠ\‘_&w[.*X­+©n‹gèPŒø3/{|»ó´fÅ×Å_Å= dƒŒÅ¯Jna6x‚F綸««ÙœÌÉõÍ[¤­+Áf¿Ó …ßÝßM.>C eX5»;àpûŽÌÿ¹¼)~\lëâ‘—Jêƒ6l£‹ouI~š\|ªYøSCKÖàËr•¸W^ÎN¨H øÕæQVpoVp×oß^ÍoÞ½Ÿ_^ýj¤Ót©Žô±ßOäÇ­{Ö'KXþ ®¯P¾t°ÿÅå|þCñع°’S0<Õ¬øRÃÉb‹øâƒ"¼·mø€ÙBlíÑ¥ ¯±°½À0b†m+:ÆufÑCí<{‡Ú!fnoºåc&ÇÓÍc$Þ1à `Oç°cÆ=½œ%‘¬<6KÓ¹ƒ³g}WÔ.á ÀaH›ó²\Äæ´Å(´»l_’rtö%Ç¡½píAŽø!»'ÚŽæŸ~j?ãèn`¡ø‚â£Oƒ|Ž·¦‡þôøxνºa2w|7Í¥añ¤˜åk‡£†“kŒì‡¦,e; œa÷¶ ÏñÙºÓäµ8’ߺW5Ôó`jI¾¼¥¡ÝÄÐ=ü%1ÇjqØ,¥àeÛM:Òö¦¤¼ž}Tko/Cún 4hÔbgŸ×ÿ'àp†8ÌR]él9?Ü™N.þPKXÖœ,íPK9A META-INF/PKPK0AMETA-INF/hsqldb_lic.txt•SAnÛ0¼È=5…š¤9¶'Z¢e²¨’T‰nX¢AÒ òû.)N[¤@a fÈÝÙ™ÙñõgÈíáÅ™Ÿ>õ—p{sóõËíÍ×Û Ô£†•üQA¡ŸôÞF=(=.>Àg û=¤>N{ížôpңЃñÁ™‡c0v‚nàè5˜ ¼=º^§›3uîvÖ>ƒgÁºôm!ÁŒv0;Ów$ƒÎi8h7šôgŸÌ€‡ðØü£h¿·Ïfú ½›|juøö5v÷Ê©·Ö}@A¡C®´{°OñéÕ¤ÉÓë ߌOx{D‹ ogNÄpd¿į̈Ý{ùhÎG^‰ ÌáˆäþÁ%¡E>ÿËNÛãv“Ï »®q_Œ]ÐÎt{ö<-+µ¾‘p–Vk“:cÅÔ:r ïÆ uœKÓBL˜½E3ºui¼ÀƒŽ9BEô4à­Ž‘AZ£ f¯0òÅ<ÂΛòvžcNÐ}Ì6š˜<“5Íóþ7EjÅ$H¾T"(à¹üŽ´€Å)ä¼Ù V®¬xUP!ÔÞÖJ°E«8^|$;?ο|$õè}#¨”À°uS1Ä ‚ÔŠQ™«óª-X]f€ Ps[3…eŠgqpBû»øÖTä+ü—,XÅÔ6Í\2UÇyKH !B±¼­ˆ€¦ —3\”X0™W„­iq…,p2Ð;Z++RU§EâMÅ›u¼.o›,Ý‹+.Ê9•8å7 ù“EEgh@ÁÍUTz>åh,Ò®2 ͽ§¨“ˆmv•ôG‹…XY“eú·c W—·‚&Þh“lR1Õ* %çEÚ…¤âŽåT~O —ÉÐVÒ ')’ º)¿Çó¢•,ùÊjE…hÅx}‰QØ GÈ•`k\x1»R'é¸=.¶8z’v”ÁfEñ^DÏ“s$Z"ÑÁ\½-Ùh¨JpgÍPÓ²b%­s+xDÚ0I/q¥LÆ6ÞœÛ&ù1¼Èn>2™_ƒž¥¥[)îX”pjÀ¨HvŠU²0_V~2×âçPKî~=÷;^PK0AMETA-INF/hypersonic_lic.txtíUMoÛ8½èôÔÚ|=´=Ém%•¤’ú([tCT INà¿”c§»I€ÝÛbL‘œ7óÞ g.>½GŸhj;z°Ý/ªô½®íVW´ÚÓp§i.¿'»nšuv·ýꬼed·ûÎü¼èãúŒ®//¯þ¸¾¼ºH½hìíº&o×S§{ÝÝëêü*teú¡3«Ý`lKe[Ñ®×dZêí®[k¿³2mÙíic»¦èÁ wäXàßîÓØÊl̺t •¦­î3  ·í콩°îÊÁ3ÝØº¶¦ýIkÛVÆõÞ¨ÑÃ×BëÉncZÛ wwýBC‰Xh¹²÷îèQ¤Öf­œ™ÞãÕ@s O}¶Õ_‚Ëu]šFw/iÔ;qž(òhV;÷J,ÍÅóOc¡ÇÊ®w.»^g« äÂâ´£¦tgʺ?iî“åMŸP8QKµñ–îF[6ÚÅôr-‚ÇéªOˆFmÁcD·]0ö´Ò®ŽÀÈ’n+ìjW2«±ƒ¦Q+d…xQ´ÁÁ)S½Ý ®%FýV¯]}ÁиÊë\eµcõýoŒÔœK’ÙT݆‚Ö¹ÈnxÌbš,qÈ(Êò¥à³¹¢y–ÄLH Ó»©|R¨ B ËãëÁa˜.‰ýÈ“’2A|‘'€ð ÂTq&âi”1Og„ÒLQÂ\ášÊçØ£ýÝ”²)-˜ˆæø '<ájé}N¹J¿)†”‡Bñ¨HBAy!òLŽpŽbÌe”„|ÁâsDÏÄnXªHÎÃ$9$;I–/ÜöLdEøýxrž‰ÙX•ðò›†øÃIÂÆ @Ì‹”czZEa'ÉœE Æ~0ð Å28àJö½ÀE\ 8\„3Ðþøºb©‹ Á|ÜI©¸*£Y–Å>’‰1ùÍ$™ô‚’ð¤B` ¦üæÖ“Br¯+O¢ÈÏÒ3”Â-4B¬!L]ÂãQ•ÔSGö2±tÀNŸ£€nç ûÂiî• $ Fêé5ø„ ÊÃ8SÊf Ÿ±4bîFæn¹dgH)—î]߆ð[xú®xݸäÒ#>zà“N|Ja|Ã…ƒJEòCYy £ù!Ç's|:ÇÑdѵÐàêzÿÌ”ÚãÕõ¶Åct¥õꌺúòå3fÔååaF=czþ6¢ÞFÔ¿QÏTÓÛ€úÏ (Çx¾ÌA3Ky4¦Ò¨·±ôÿKèBÇ—†Ü£?øG}oë: ºÛñYûþÔ”hº˜SMÙîÑ*ƒ³C¯ñp+}W֛׈÷~ñþûý PK>Z¶íä± PK9AMETA-INF/services/PKPK8A!META-INF/services/java.sql.DriverË/J×Ë(.ÌIIÒËJIJÖórqrv)Ê,K-âPKA¶iPK9Aorg/PKPK9A org/hsqldb/PKPK7A!org/hsqldb/ClientConnection.class­9 xTåµçd–›\nBIÈ„°9LT,µœ$4À@of.ÉÀdf˜™€X[­¶´µ‹Ý[ÛW•n´VlPf —VÔ.Ö.j÷ö->ß³¾ö­}¯–žóßîÜI&ß÷Ðù×óŸý?ÿ97Ïýå±3°£ÂXRw êº ÿñl77¥Ü”q3—›rn*¸©äæ2ça7Õ<¯RS£b-Öñ¨ž›<]¨â"làÑb†käÑ-åÑ2-çÑ ]® G…\ɯ‚M*,Áfž´0Ì*µ2êÕ*®ÁµÜ¼‰×®Pq^©à›¹_¯B3^ÅËlSðj^¼F…5x­ «ñZÞy #Ù¨à&Û™ÁÖc'v1¡ÍÜla˜ë¸ñ)¸U…x=ƒúy¯››nz¹ÙÆÍ[ìcÜ>ÒÏ+Û¹Ù¡âN¼×Ü¥B/î.¡æmÜìáåÜ«B?ÞÄÐ:7ƒÜ¹ qcp³oá0ë#¬à~>w@…1¢àˆ :F˜rTÁ˜ !Ó¬q¶ÍA* cRÅŽªx»@üs¼ªàÍ*D1â€b>qDÅ[ðíÅxk1¾C…CøNoã^ »]Áw©pK0·}#îàæNn®w\ømœÕþnnÞ£àQß«àûötõïìí»~oGo÷¶Mý¾vŸß×?°wGW_À×ÛƒPé߯Ò[#zt¨5J„£Cm¥±h2¥GS;ôȨQŒïGhœÏ^_O?úæ´oß¼¹«ooÀ·«ËPêˆ޶îÛg$Šv·#‡“‘XÒÑ™]îd,xÀH!T˜ÌDTk@,/jHOé½£©ø(4úc‰¡ÖáäÁHh°5lí´6‰yC¡%|Àðµ&ÂpLŠE Έîe åv¤´HÐ}b‹ }Ñ”‘ا :à¢=_t ¼@ÞŽê‰#ÌDÂHŽFR]¼Xoí&d2‹ú:I[Iõ‘Ø ¯3`5¢AƒTNöz¨79ÒiìÓé‚NnMÅ:b##ašÎ¹%5F0 %”dPFYÕóìtæ*+T€ S“%‚zĈ†t.t5š GZ;ä*ƒÞ¨L‹í(÷‡ƒ­[;Û;:,‚wÇ’Ä”3KˆNO ¶É ž$\ád¿? íÊK,yu06¢©m‰XÜH¤ÂF2Ë_ùÔ „¥vh5N¦Z¯£iˆØ¨Ì¢ß “.{ô¢í¾: §®E¸É3Ýí}Ó—¦¯ìº ßÊ$yG,D$K)=x [÷ëƒC\Ì»üB³BFƒ©ÑËåðð1±ÜaSùüB¬î $n4JÁanï•ý¼bÜlGSÄÊ•ž™qåÌ[ »¥2d¤ÈɉÍ5ž­>_xT?ÒS±_ƒ€‘êÉÎ;„íÈe‚+k”ãÙʸÄ:94aß”"Ù£U"ºwp? C|| “yÕßt@ÆLʤÀRIÐÓnÓCÚ† ˆRÆg»K—ÑÜ—ŒEtVžíˆ0)³im ðTZ ˜w˜ùÉÓŒ\' TS8M¤¶ “C†úz4©Kó”ÆF\OYÜA9(NÄ"‘Aòb*;ìôCF<ަXKÓƒ¹,Iæ`ÊFÄ š¶cª íÔQq½æ¹_¢®›ƒF\\ea –8$D%'ÐÈ1lº'Âl„…³ù!Q-œI?DÚ¤L8xfq:„&ÍÑ7ªGrþ¼½ÏO‘ʳ²Ð«UL'ü=C´ˆFÊh§`JA‹œÍN)u$n$[yO< m|Ç,ðvø =‰é„É®Ÿ­›Y ´ßf½DöWH¨‡(³§:µçT‡««³˜­Ël4‘ {GÌ’q–x ÈÒ1È!Gâ,<µËþˆT2O‚ERSð@ | ¡ºŒqO ÇËó Ì+ètþc1¹ÂJErúÁ¥ž‹cÍVÉÎÏ@u*ÖC¢ÄFâ;˜ÛX4ûÚL <–g• 뤖aý€¡Á)8­Á‡àÃÜ÷jp?|DƒcÜ<G5ø:Ü¥Áƒ<:ÁÍC¼ñ ˆÿa ïÆhøQø½_æ½I8M†ÃkðM8£Á“𔆟€çü¤†ŸÂOkøxEƒÏ¼^Öà„?Ë! ø9ÁQrÙ™33%!¾ño4ø4|¡á"é Ã~^ƒ{à³Þ ¯kð9 £gጂ÷ix?Óð øE > SðK~^ÈGZ(1Óð+xœ1UƒÃ'è]›!3C¨Ïî˜9£²íjø5|€Ñ|]ƒO§4,†Óä™9›Y±†"ÈL¡MÃQa$'4x–̉Á3~^ÔàUø' ~¯çáì&5ñó­á©œLsRÇ ყx”æ&ƒãÞK5¸›ä æa‚<Š)8©áiü¦ÏÁwÈûsl´Çb̉û3ð¼†gñq Ÿ ¾ßσã¨9d$4|’|ŸÂoiøm|ZÃslËW‘8~ŸÓð;ø]¿§á÷É1ðyx‘?KÔàì‹§à™Bp6¸/—(€Lb|Žkø|!kb¼¶$Œ¡X"¬G³QŒ óC¤áá¢á‹ø¢٣˜'áaÊ­4|^¦TúúµiøSü%ìO|¾FaêÝ7=Pßã/¸ù¥†¿b3ýšÎ®ÓœöU>5-É? Q«¼  kíª5«V¯Zw4˜jfzYÈOwOÏ€²Þ˯M¯íFTæÔÎÊão¾?V¦“ÿ°dÚd&@™z}Ô8œ““R1c$N9ÅVÎú9ÉÿmÅ7kr „“]‰g’Õ6(ƒ—Zå†Ë0ûKÎzó³3ÛËš‰RŠRÛcÂó¹¶¹ù¬0D7•ºY£¹<»ÛùZÀ”#ÃÕ‘j%A+ÅMfͼԆ"i$ Á°Y&o¦l2–8bf >Qº³Ky(Óõ_Â9ÖL€²_Q¨èXY :Ÿ;eĘ́ûƒñžX§јz²?äÌY#=L©Ýk=…wD¹#d³á™oÓ_Ú×xf̶ÊDfâJ+5ÙEµ"ýLU–ÌwŠd¾S§bY¼­žå¬W*ª6w?Å72¦5gÔe4Ûq–åDžYÙl¤‚ÃfvÆîj«°<žK«ÑˆnyRªd„b˜IºœµD G g97ZY0ÒÔÙŒ­â£Ñ6z¬¨š1“xQ¨Ù3+ùD±ã š¯š8DµAßö. _þiÏÇ Í›ü.þ|$¿Lu®ß’¶Šª+²¢QuA«ÅMKYU‘ubU¡šj¶@ĘúlU‘…iŸ§@!˜ûštÑïX—ôMJ”{&"HlËù½•UÆdÿZ5«€U\¬m …¬\=b®SÚ¿ë"òÍôÝíâÜìÈv3 ÏßãXñ\)sOfü˽lž‚Ö,ø¼e¿²ä¯3/ö×øH’. åZA³Âb¸îp$&}ÌŸr±¹úâ}ªVóK²ìþB5µ›’ž!þDV2"aªüЦÄÐ6=œHöÇ8A!Бÿ·WõÒJ5·S*F}¡zÈ̉Úx·c–Ýbñu@\~×¾Èhrá¸Þ ¡ÞGiü^(‚÷Ñüýp—5¿ jà¶ù¡œK.1¦ŒYôT}PïäbBôT ˆžJÑSù"à¨x=UQ¢¿Oö÷K<ÇdOUšè)}=Õh¢§¤U|¯§QôˆuàJOôÊù Ù?$ð×j¢“딞Šþ1o%ÙNAšÚ Í^Ì¡þ˜wÐ[Q§‹ÓPäŽ4¸¼Ô¸½Î4(Þ¦4{¤¡ÄÛ’Õ[K‹s¼U®4hÞ*:Qꀲ ÌMC9!ª¨u×*µNï)(¯*ž€Ê %Þ¦U® \æ­-ÉÀ¼ j­šª{ ¤V€ê³^žÎOCÔ¦¡N êÓ°@ ¦aÑIbaœÚe€àV˜£À„"ýòºÇè¡>ªr¥kÈ(EÔ/Ÿ„†âªhûY¤Fï$,h‡¥iXF",OÊ“BWN®‹åñy4sR_LR,ÌÀåYˆ³ÄíàþãÊï ð4-ÈÀÊ4x‰’×™&"ÒÌd½h‡Uih¥•Õ“°F®®‡7ÃiXG“+CÍç$¬¨uV¸ª&ઊ?½6Ξ$b°Þ,5QE„- <Î>a‰»„eqkûÓd-A¤í88ý^ª½&¢2¨°ƒ£¬ðÝ”'á)‰g38è?€M„¡&Ws_—k¼M¸–P¾e¬»ÂUÛœMÐ~V`­…:Ø(±ºw)ð-ÂùmxZâ F7õ„jEyiÆ4d “{Òn÷U¤¶Í¬¿ì-®Zr-Ãuc\Dg9‚WÀ:;ÁQ“à9xFÜHÙx ‚ ÇNPâßIŠé1uRGñ!‹L¢=ŒŒ°=k©v·Tm3õÝΓ|;|õbFmCé'måþ$(…XBê^ —ƒ×R{)¸ŠX훥î©î–„î CÌö·"Ù®ÏÀõYÝÍâ 7ó ¢±¿§þóï{«Aþ~ú-—†˜nq­?'ýÜkÇp̺T•à>+è꜇å |×Aÿˆªï%?G {xPðã–ü0ÕGýt$ñ56Ú+Xíò×Òâj‡²'wJ‹»9`Ù×Yë”ÑÀɲänz¸ÎÃzbÇívœ‡ù|±)z>/yZ"Qí%è¡ ý8ôf`ǬSà~PðÑ?€$üâŠá×óþ}e\õDõaxëqp? }x)æ¸í¡Æq®…äö‡yŠäÔÁS~¤cxræó¤M%ËÓ ó¤0OÎB<)oœ§ŸÀ‹’Fµ¤¡z…©åIÉÇK𲄩“|—yÌ7±ÝŸíY~ï¶ä« žoŠ‹/€¹ðSø™Ü.“ÛEµøèÏ­»S*`é—¥þ [Ä’ZÞ¥avd½ÃßdºyS¾kž‡Ó#~iió*±ÄewØÑäÝ–)h™h~Uó ¢ù5ü¦WÓCó[ Í: jH;»½tt^O‹y¾%ÿüÀ?‹kb¢øÛœ(oˆ„¿ƒ¿·Y°ÈnÁ€W,¿(²ü¢æ„ÜþGËÀÝ’ÕpƒŸŸ,á 3€R¨°t"h6ó€)²5HÙœüµ”(šžk>îeM,S+ý30`røÏÀB¼ë êwðº<³Qž¹‚ ×ÑoÙìò‹ób–ÝŒ†3…GámEÀk<9“=McÓ07¿Àïg¼°tTCo ïiÞSàÚ£”bWè_á߬›hfe“pã)fï8ÜÔÓ2&áþþc:œ.áspÿ ÿe3š#g4„?ÂË­fÚ`†æ“pÁst÷'!40ćù`îu °JþüÉòI§ua÷Ê'`ÈO†9Ÿ §ao塨§áÿÂy+R:Å‹R=û76LÀyiŸ„è@ã8IJrüÙŠPöÈSš<±¶çÊmGe<»yAnn%J(í}ðp³(‰{)Ló°2Y™Â MÃÁãB ‡H ‡iÆà9Häe* ý+*ÀÓÍ’et SnWÊ êæ\óf©tYÎb?¾À<^‚nTävHFÅ&á1t‹¿®h¸­©®òí‘ Üº“úx[Sùª ¼cgS]Åååæ* lËå!sµfdli·Ye¿Ãï)÷*ì)©Ø9?à9?âyð'?ãE—xîeüEà¯xEàU¼&ð7¶çïìfS'6:©{¼:¾²ÒQ–¦ÌzV^ÇìÖ›oám+‹ÞÃ?þ‰ üï |À[xáé,äÉÞ™hu¥Ó}´Õ"”±ÉÞ¶ Î9¯í Ëç¦¡ä‘æ(MÇ›P.jvŽrHRò^”g²±ÊA^7HE† &.mÕæM•“ºNr±å@–pÒ,ŠfÀ6*&™/Ó¾€qtfWUØË§bVy\aI;!‡5:¨Û¨¶h™œ´Èóˆ[¼pY¶¤¸Ö%›¶JUÂÛGÛ”ÃJÚ–§†TÂÒ¦–á$ŒTeu«eΰlFÙ0©óç­tj€Î4ÁžòžWªÖ4F{Ù†SgUc”˜ûÝ%âORb›Ãd@ûìÏ*L †gU»iYÊŒlê'³ý¨,p$”ûåž’´ìniç Ê”¥ ¼1ÅLG—FüC3ü}&]¦=¦à´*ñ­qŸ•¿\º·C’jæ^¾O{‡9Aª$GmDÚ³kÒÊJȨ̂ì4 Ö"ºÑH{¢œÆIr<à^5„§™{m ⨀ŸuÍÞJw†Ë–28á}‘­î=çN¥ J–áBÉ¢óØ@’³ÊN“ÇpÏBû¬Dô.°Þºl¥zQê¥(i¤bíQ„›l£$“œÐÄ’Ôç`4-æjîÈëš9Ƥ.G+IÙ™oBõLóêXôþmä[zS6›çC¯¦æ)Íÿ AqdkU¿ûZÁzvÐÓ­+щl¦Ñ\@ã-èš'é£gÑš£Wµ=4Z‹:úš¢-Íma_£?\VP¢Ê8–ÿùЋ¾²@½;”ÊÒ…ÓKѨ–úCJܪ‰û£‡à ùÔÞ5äû'¡î˜@ Tç ØB_h)5Í3&Þ ÑõÔ9hˆûW߇“X¶£"¸üè'pLÜ· ,ö»£h˜øBOaùDŒKj»õq_Ø÷ŽsÐt|¦'S#QýDŸ ÿѤb@Eú?ôsâÿ8>Ûh¨PU±½Žü¥çˆe˜5ü\)/Eˆ‘ß×ÍQÚ{%}aúV98>Ú2æî¨ƒÕ­Êp^‚ÏQ¨Xê1Ò7OârÿÄîIœ´£ukzZ¢m¤àdkÙ—Ð)Ne‚\üDÙ¹ÓÜ…Hhƒ¨K¶,­ZwFO±*žwðIR8Ž bíéÎ(“g:8«•igOuçLyv)}µdc#>Oö};Ëöö¹³@‚´¯§˜[ÞaÃΛ@|ílôã8_<øÔalLµD+#ŸfÒÁgZTÙI#¨—TƒúR8:‡ÀÇPKQãŽi6PK7Aorg/hsqldb/ColumnBase.classTKWÓPþ’¦ ´ii y¾-)Z|¿•¢ˆ<µ(v¡ä”`i±‰žÃOÑ•;6,ôªç¸ðø£Ô™ä¦”6v13w¾™oæÎô÷ŸŸ¿\ÇÛ(z0Õ‰nXL³xÊâ‹™(žc–Å s,æY,0ºÈÖ[Ël½dë‹"‹¯U¼‘ TmSBz~Ëøhä+Fµœ/:u«Z~ !ìë#viÓÜ6$¨%Ã1*µ²„˜e¯Ö-Çô¤5 šeM£^Úô\ñ£NÌŽY_¨mpÈ”„¨eÏn˜UÇrv‰¡ú¡R1Ö­Š{êØ æ•݊웯ÕËùMû}ec=ïËÎ3@ýD&¬ªåLJeG¹õ‚Ë<—=Þûÿy˜ôj[KC…ZåÃvµèÄMˆ—Mg‘nêÅJèÉŽÍ2Ma+<šÖØnrzTGÈ[ðÝêŽÙ¦s8>%»ÆÕi4{• oxÙãÍN¶é¶zl-ƒô8‹î‹¸¯WtŒÒ»cgÅ;smu7組DÙ÷‰7¤^è‘v›[ÉN1¿Fþ–•‰Ó±u_bÄ6ÝÜ~âI[¤Èå£Ë•´Û\Îゆ3ÖÐ^ §Xô±È WŪ†F5è,²,î➆äY jbkˆ­¶Ø:‹sNcXB&pÆÔÇáÃ/­o™%‡¶ù„Ý!¶nú¸(dî‰,™tõ)¡û…¦ò®rµÂM¸zDœÏˆ3uHšsèúpÑ=ÉdQý$]i@þþIsIÄä(&Lz¤£çéc (ú•Âz?9#‡‰—Eb‘C¤gÚ¿Cå\ÒœNº“XG9ˆt¬u¼ë®’~zQ Eš»ëˆ|°‡}8+><‡|ø ® 8M—“IGôAêÕïv$ ]Ûwaã¸&àÓ"=¥ç »£9@ª”Ï4Nÿðí•r-øf¥1ñ†®ô]¤då TeJhß ¾É@î~Ln5ïpK0'ôÁO"^l€—’<«âö_^/w$–·ùZô=ŠËâšI.N$¡=¨ÜÀ‘º±Ýǃ Ù57n pvÉ}O¾¹Cé ?ýapzÂOŸÄ£€ô”ÿð›7n…Ó>û“໥=vüPK¶À?AQ´PK7Aorg/hsqldb/ColumnSchema.classX |Õÿ¿Ífg³;Yr„$Á l²Á¨Õ†Š®hH$ÚÖa3$+{9³Qèe­mmíao ¶ÛZZ‹-V²€Ô£T{߇½O{߇6J¿oæÍîÌî&Àï—÷æ}÷û¾ïýß[ž|þáG,‡°÷Õ`9>ÂÃA>ÊÃÇx¸?DÃÇk°‡xx€‡OððI³Èƒ<|*„‡pDA^Á±êq<„:<ÌÄ5ø4á¯GCx +øLslŸ âs¼ø<_âd§ØîC¤óŸd±/ñðeŽó+Ìø*[üZ_çåz|ƒCü&ß âÛìã;,ðݾ‡ï³ßððC–JÁXðÇ<ü„‡Ÿòð3¶ÿs¿áRü’¿ a%~ÍÎ~Æ~«ài¦ÜÇÃïØÜïùëaüâáÏ þÊzSðwÿé©lnφ¡íh»n0cŒõŽ›7%Gwôög’©ôp|\Oi}$·ÖCZJ®'ûSH§u£?©™¦n œç6áHmÐÒÚ˜n,tÖdNM˜›ŒDJ3ö\¥“k1"P?ªïÔ&’¹5»³†nš‰LZ Åm®È ³Çtò«åé1·BÐÔošÐÓqŠ¬Ý­;4‘Ú¡Ã’Éû1ôºÁ Šú·h2±£w£1JÌÑõš9>¬çH¼UºÓGí¼lviµ8ÍfƬH¤¹Ë®žU"ÜB¹=YÝìÝBcßÈÈ4ûîÚ*àïÏŒÒöj‡sZ|×-»EÛ‘Ô©c¨¶ þ©à_ô- Œé9¶%Pí°×vÅG»Î²HµRg8gPš)ç¤y£v³Ö›ÔÒc½6•ÄØQ”Uðo[ÝîÛq£gíµ_ËiÉ̘-6ÛKpä‚DÞx A Ã»#16ž3{×Z:§ë} þcûv×hW¥bY§?“ÊfÒz:G:Jœ‰$…t§šÃ²šµ¯;nÔã9«JÞìÕƒ#v‚úÇ)gú–DJ7sZ*k•åJòa:ej‹NÓ lÅììDÏ®±X)LJ£´—DŽŽØ¼è ç¡k«‚ÿ ÌN‹l è.œ³’j”Ÿ´„94‘LrƒX»±knÓI+8"¯¢€æ:瘑޸f®¶!Ábm39ݶ¢ÒÎ\Kt„Ã#LÖ5#>nSkIÈ1³È©´·UKN”åÒ)«»ÇeA`õÛUl§Rˆnª–ˆQÌØ æŽqU=b‰*νª¸@,¥¾PÅ2Þïrq¡".òzŸÎT\‰«šÊö¶J3uïžÝ@ìÕ(Bª—î>$u¥%¦³;íMãåyqÏcʉ¦¥$S9>U|ÈÂi7 ÂÂà(]v°-Ó\ |9K@ÐýîO[×CC¥ :ÕèxRÓÊõeƾIÛg¸G)K”¾KÏ|SųG[.¢ŸE6­ËÁóª´è[5#ÁÇ®o¥Ø uíC&y³Þ?®Çwm4‰Üõê=ãÅ\Œ¯Ïº$9e|Ë“3“–‘3ä­.$¼®=)ov1tÃȽkx¤”êöÜ({_­Ù׳9ïkÉ3•ŠJ¿ÁzÇ´lVOÓ}×-¯]ù{ËÆœ>Æðþ¸µôÊÈé)ªºýl¨—ÏA*#²ýVÎeœ&§;ºøR {tu&¥%Òv6ê&LÝàOŠ7±3ÁmÓYžžkJ„(†g"_ÆyMé2‰K£3'a³w%4hW”sÙ\±j&¿øÝÁoHys¯e6aÒÍwÞæÚ(U¾)ZnŸÃm ß\IZØ$.$m¥%Zúå×+{ & xÒ^þÜuÀ†"Wèe5¤ïÎ1jX“÷a_ØaÛôÐŒ¥ô3r=ýê¬A+Ã3ýJ÷ñ oÍtµ[3ÝîÖ¼EÎtñY3]éÖ¼]Î#¿‹ìÑ-Eã‹iuÑ4÷t…èŽMÂ×ݱŠÿ üU“¨ê¿»É?‰êîÖêIHLyä^BãrøN£/UpƒMÐÓahˆŸ&v)ÝGtRŒB—îgƒ×@°û|G<XÆéΓõR¢š%Kö8• Ô87$–I‰V["tŠ®õƒ¨•+©boG/2 `-“…J<„©é<„=ÂÓyH<œI?\¦-3ÿë¤þþ‚¢¾M¨+<1Q©´ƒÊRCœ]PjYP-Mä*Ô­ÖÉÙD‘lŸpx7ãɻը¢y-©FNÁÿ ÏyÌâ)vuÛ{G} GÑX•Çl"û Éj¦¯ýÕ7?†–ǼÝê‡/x }ï.dn?u¿æÛN`Îö£h$#m÷[Ñiƒ¡ŸþæÓße’ÖkhÏcnÝü<:¶ļXÃ<×rV¬áœÂ’“uÍ1;iDš»-fs˜äÏcEÊãÜb2UTO¡GÁžH$ÜJ´—áå…”ùì”Õ< Sö ¼RòšåFB|„ýζYæU¸UÊ4H™€uÌm>ø…*ù+$¿‘ùݱ“XXÌa |Còtû¬ÓýyªAÑÜ.-uHKõݱ#°`„f¿Ôkñº mÒé´½×%›ËÅ–æÓ–Î[ѾsìÄ-Ú‹ˆ]÷ÅyDµ*€˜Â<6Jo|ie±tÂ' šÐ­ê 2ØUÔª†/ÜÏBw\/”JÜò'^ËYâM4òèžAãÍ5bû¦×x Þ*5šdjkêñDCÏ1,yLæì®‚Ñi4l'èücèu`uSAÈ÷êC²ÞVpSì•v‚~§loÇ;$)Pæs964ðñ Ⱦ¾À᫼“–直)ªGfTwáØ^$»¢E ý‡ø3¥ƒ1÷aòM~iîZËðþÅ'M\*÷ßih«ÐVË‹ÃÌ-š#™ËJïÅÞJg*àäi_Á;Í‘Ã2Í÷TV8êïÃû%%ïŸæå'°|;£çç’q`Gqá gŒ@𢘠óÜ™Ç bÎYú@!–%¿I¿ä%ü.ÝNÇà…“¸„IÅ}VA4ÒçþŠ`Þg[öñÿ'Øl®²`ò)Æú“V%jóXÁÂöªÏ^q†÷Yо^´Qþ:ŽË¸Žµ§(ù'°’€øòIKª– ñŠmöù»Mr­>Écýõoè9ŽÕ‚Ò§5cíÐzFÔÕìG˜?ÐmØñx|ô1e û ¯Í=½¯ˆ€‹ Fj§ÐN×ð³>ÇTð¡)t¥-\OÄg(=A|ØIõ†àÁªG°ü!¬s*=${`-þ‚ ô«Ã$Ž¢æÿPKXØË PK7Aorg/hsqldb/Constraint.classµ: xSÇѳ«ãIò³± Û@ŒÛ²19šÃ†$Æ6AÁXna?l%²äH2Gz¦¥Wz¥M/Ò¦¡Gâ6!­Imá”z†æêݤé}'½Ó¦g ¡3ûö=½gI@ò÷×gí9;3;³3;³ò#/~þ(œÇc>¸ƒU{a[DÅb…-ñS9Ç‹­*–±Z¶ŒZË}l«ó±zÖàcAÖècMl%7S±Š@Î¥â<*Χâ*^AÅ…T\DÅÅT\BE ­T¬¦bÂ.õ!¢jbâ2By9mT¬¥¢Šb¢“Šu^hfWP±^a!4àJv%Û@­.*ºÖKÓ©³‰Š>……}p>‘XÄú©ØLÅBmõ°«hnÛiÝ€‡½Òî&ˆkˆàµv‡EbåM4öf{ -+o£‰[hâíT¼ƒfßIïò²w³[}ì=ì½^v{Ÿ—½Ÿ}€Øþ [RØ~"x;A}ØË>Âîð°’â·Â;Iû¼Øú!ü8Ÿ ‰O±»ØÝ>6Á>ED>íE„÷Pq/¡>¨°û|ðVö…}Ö·°I/‡|ì~ö9êNQwšZ‚>ìe3ìÊàóÔ=BÅ|8ö eÇ|ì‹ìK4öe*¾BÅWéx|Ma)ì8ç`"©1¨ìJ$‡›GR7Ɔv4·'â©t2§Ûq²â‘Qò¬ÇùÑTCñ¸–lER)-Å`™u¹Õ‰G†µd­ÑGDÞABÝ¿w Q°ö£©u‰äîHrûÛ¸G´Á,°âëÜ3–ÔR©h"Þ*Vô$Ò=ã±\oµ'bã£ñP|HÛà8‰k["ÉhdG É,´¢ê³Î!6ß(î—‡µ4ƒÅVÈXtGsorHKjCë#© âIm§íÓFÇÒ{Û’ÉÈ^ùå‡kÜ«£ñhúRŽºú-(ÊöÄr®;+‰YúÏÖ‘(í¸Yì»5DÈ‹ÃéÈà Ý‘1‹~-[a_WØÃ Ö¼\Š!û²—¾Þ"Â0õÒ1œPUý/p„B´q…Žéú—Îy>„$„ÇþŸ„ð2¡âP¡ƒUðÀ‰íø:÷ jci´Í”ÂA ‹E#i<ãºú‚VQ–ÒÒºÙ¦:r"åu¹œ eX“.M(¤÷u/´ÂNá4ާ×´GÒ‘XbX_ZŒaô6£½ïÁ~ïnôi ªíX“Ñá‘tªù ô+ipÑÒ>m'ª6>H|Ÿc‡Ïë9hM{bt,×âi\£ b'Jþi•m×aéèlc‚ÍÞ×kƒº!¹‰÷M] æ!åë#»"Í1ôkÍát2nÅ»]#Ñ!o×ÕRéÈè˜ß•º(Öm@O‘ÖF‘ôýu9HÖŽïÄýµÒñ”A)®èFÅ •èâ*’CzϧK$+ÙÍñèã´LlÝн®HE.×·£u¼_$€tê íPÖs¨‹©ëLaC®™ƒ½¶A:šúžè€…òÈK‡ìÐbZZÓárÖˆ 7 EìÖÒ?IõãѦs`£¶äP¾‘ÑX4½WWI·~‘Eà-QW?2Oš9\$´Š7¤Ð~1’Чzã±½´(Dè³Ãcã¸Èkö̦tÕl¦GL´®º±R¦:oîŠÄĹæ±G»Ÿ0ÆhqѸB¿~ë®9ã©.ä‹t¿R$P<¥%ÓgmÀ¢]i/Ûé ?†çL ÂËF«_>fBü ý/c§ºäu»nÍù› û–ˆÑ¾A¦n¦«eÐ\—¡Ù¾Ð\@¡ËN4šu7;Ù—å3aŒGvE‡#éD²¹/±;”Æã‹mÄIj9Êo8KÅúžÂ¾×ÄêÁ˜ˆçT˜‚i>ŸTá.¸¹)@«p'PÙìI•ý€=…јÊ~Ï©ìGìQŒÎTöcöÔ¶Ê~Ê~¦°Ÿ«ìð¬Â~©²_±_«ðY˜Táì7H‹ý–Чán•=CÅï¨ø=|Je â4û'*þLÅ_ˆä³ìQ•ý•=…¾*/‹*|ýM… \Ÿ†{T¸—Z1ÜŸQÙsÄêßÙ?TöOÂù/öo¼"O{ß)ì?*{žPÙIxDe/°vŠÁÒ³¸ªUH˜3ö¢Ê9w òò_M*üQÃß7xS¹žÅ{¨½·'Üß×êéW¹‹»©PTîá^¼r6ö…ºÛú¶¡ÞйM…_Á¯UîãExlî mÚ܉~°­«¿³ëþ¶µ]*‡—*¼Lå~>—’U3ŸÇËU>Ÿ/Py¨|!¯Äó˽*¯âÕ*_Ä«| ?Ge X™ÊÌ©ò¾Tåµ|™Ê—S±‚שLeÅèT^ÏTy#oB?¨ò•¼Yá«T~.?Oåçó Tþ Ò_élýá±æªü"~±Â/Qy GK•¯ækT~)¿Lå—ó6•¯åí*ïà*_ǯ@¡òõ<„nBåWò *&‹Lå]¼[å=Tôòè?l!S„òS4R¾ }¿efc$‰wJǦ.šëSy˜oVø•oåW©|š4ߎǟ0”Õ+ùÕh÷*¿†_«òëh.BÅ>¨ò!ŽùÕ÷U¾“+|DåQ:ŽcÁ¯§¥7P÷~øœMºWÅì¶@p‡À³}@þ¸sÎBÞÏ5–ù1-™Š¦ÒÍõ¯÷pZäýe"#6¼ùÚH Ç %̵y€ý¹Ô¾Aë]‡—Å@¾lÉ™® ‘¬L%vÛ]Цq-¹7<¦ FwRî!x°Šï…ñXº¹OTh6£F0‹üç‹>€!æÂ§oØLbÐ,åS]>æ8ƒ*Š9 ]ýzD×y‰ϺíÒ8˜j¦©V»óÎNˆ‘®Ä½m=+Z2‰2ì¤ý•¦×Õ³¸™%¨Im§%Ê/µGýê-JVÇm¡0J-=8¢s2ƒN{HM#öÐÙ7nÉ„øô¦’4R ÁŽ>¨K—¥nª e˜òÝŠâçÉèh$¹wƒ¶WOd,E”¼-­;Cî&qwJž_WBÏmïe9byÞÛ`"CC×Íöˆ,Èá@¥·¢Tô&Êz‡é½iVò"#4L ߪˆ!-´áNj£‰]„*24$íÜPCø’h MDKîÒ†tù»#ccZW4榈­¹©”Ì)£l?ÍlqÊÈ=u*þ|.!«ª.tX"ßYPGOQù€›Éü¦ñH €6¶Óð¤FfVQȽQ“Ò†L‹æÛíФñà·9¡ïLŒcB›×:c‚”žJm§7 5‰S˜yKû;·.tzöIp‹-:)bGˆ]‡D^·KÃü,Bïduôl£'nÝZf1Côª!m%¿ ú¶òt¢mèúq¼+¤@äK'QE¢dž”––ÖÈMéz§Xdå‰ÝòÂiÉsÛ)pY!S úýé·"_¤ïÙ‡@m±˜§j{E o}‘Òn.ÁꃒՋUÖÁ³fÕ—ÝïQ‰d) Çõ‚,£W ‚ì‚crÁï܇õ´…ª›Vàœ¤RšË@ÕDì§F¹2 sEÃ3 óDÃ; 庤æÞ#HB£^¿µ²oÖŠØæëKæÑ’z ü9²oÖ~AVÊ5à<¯Ÿ!eüû¢^2FÒVV(bÛ_’Ûâ¶ õâì¶«…œhÓÙýfåõe,-|3.T±¾I,l¢…Ž\%! )«€TÖBCfB{$ÝJÑ@aûD¥X%y(Åj!NŸ!à"°ÎÓW„l|ë¯ÁCr[ÛKŽu÷X„ì,î Ò² ,A¾¨É‘_ª‰eªÏ™†s¨®™†ª—NÃRªk§¡–êeÓ°,8)Uq¾®“a¥RzϪÛáv¬æ‡eDKW¡’år_h,Ç¡¾¬üq2s ÂK«3°Â„¯:®Ÿ+b TLT9ÖTÉ94º lWIìi²[ G üÎt⇠ÓÀ%‰˜¸|\¾ÓâÊž³ùà[µ¨â$0Ö€öËOÂÑÀهᩄ钸ç <>Âc9î •1)§7§Èé"šž‚:ü3€¾aÍ“@ d@|¾UM½ômøŽºO )ñfR⽺ŠÇ…?Ö?×â—\IÕhÀ³$qÖ3Јß&çКªC}°*+¿Í=MS°ªÔ{'QÃ}¼4sîÖ}üÔÄ©§‚“E·tŸ8ok£1:iJw!(K^€ùdµ'¡íE+þX9B|×dÝ”03¶õ=ø¾œ+–l›—Áð¤<¶÷â~qн霄/èjÈÀ+tÿÄÒó¤ìߊu­ðO¸ð¨óè DãkÃÆE¸øvv‘Ñ‚%Aÿ%h)]’Ö­Až‚ÕÙÿ£í¿[â2Â'pfàrœ€§M|5ðm Û¨GË»²ÆÆ,šdÜû¡-è_k’m·aëÈ@gÖeú¯0炇aý È:Œà¡ýàž€ÐYïöJj×é“xn2°A§T/†2ЕÕú<(: «øAåòººêСx—/¹§à‡¦¾¹®oï}BIœ~’sÿÒ• ?z ‚ë¶«Az„;²"”2éµ!º,+³|bÇÞF÷°B®ÝdRé³a KØþ¼°›m°[6ë~|à¨? ûøIG~š×% }ù ³øY!ˆ€ñóB ˆ_‚¨0 ~iº>«{sÞïWðëüãfù ü6?„Ç ñt!•Žg á¨Ö!|ôS„è’ç/Ô­¿ÙbüË¢(=0¡ñzÿÖIÿU“þm“þí“þì±UÀUËñƒÝ?˜˜E{®!ƒ?NÈæ› b^ilòO…ÐÌ3Ðü¹šy4g%Ð t~Oo·†dµ–=×ȾY;ZB1€eØ¥²oÖ΃BÓºPÜà\Åê‰ê_sïCóDü žË¿QŸ±‡¿‚¨2 þaŠÂ AŽÆ€¸×”ƒõX.=(7óOtúô?dÔô-“ŒW¿bÙòmøÄo‡OEFSpuåùûE˜Kí¸Æyç8øGæÉ¶cee¾éeÖéŠl@D'ûn;|•¾ê´ðeð°ÿڸ–¹P\W}9ƒ*ü6É/~þmŠà)‚',"xØ"‚âW; |2gwa½¯r"üÎYr°6Wdƶîš%†—°"Wå0Gb~ƒ£ÀÏLQ¼QŠB³ˆâ*‹(Úñ»R~I+MQ<ÍF«ìƒ¹œ©à©óú‘¿ÎÐópB2ÆûZc Ô.=P£o•dÌ kƒGè)v‚Á£3°Ãj¢NàKb}•®¸ ÑPæ¹ÇB ÙH°J¬ÅZËÊÝPÒdÊÚ•Uv#¾À8­'ö–Ë©ÆÜoœ„ª€St¥,,¼yÁ½¤œµêxNIŸA¦ÝX?Þh2°U¦URççÛ‚ç¢ÜMËÀN™S黳Ü5ÃfÊáÁ„„C£iIúJy‡ØÐƒ6ôÕÙù*½TIµŽžÄK±qC“Œè!Ë®'àÚpM10&w=ƒJ¡]¿ß¢–[-j ‚ Ðɫݎ[ 6"ÞëI`uC‹Kê©jbûý•—¶ç!‹[qÊÂî‡ÅrÎ ˜€¸ öÓ2$’8–å¾ f!{ s1AÜ-‰ŸÄGøJ¾÷Î&IHt/íp[ˆ®&¢ÇÁã¿i¯ ŽC®&c¥ð*ÒrÏfèfp‚Ëôg¦Ð³ó(ÌËÀ¡0þ±S¨ÛÜY§œUXÑ)(ú¿,/¦ÖaÅ2õIQ¸‚u{Ö©± -Nmì‘NíˆÓ&Šn!t4âÝ“2wêv\ZMÉ[”¼zåy-NÃŒ2ðêìpÀ™×P4ÛXÚHÑí>fÖÇfKÜ\)Å ]á¤~ÈÕ”—ºÏBÝg¥®LÁk³Ãù©³ÒW~;D:×e/B—]ñx1uaÏCûóÐlí`ÉJØy¯Bñ“ ×6>eÆ+¢0ÊRÓ›¼ŽÁ¤oœ6ðÀë]@Ñ“ûUzŽae’J·t ”¤ß܃nç ÈÚŽSö6Ÿ¤ðÆ:Š€Ë‘}§~nµcÇI1^B>ôÄâ€fÖ‡»½Š=^v?ÜÂû!ð_PK=-U%z9PK7Aorg/hsqldb/ConstraintCore.class’[oA†ß¡ÀÂv(µj[ªÕ@9¨«õ,µµÁ IªÞTõjaGX²Ý¥»K£ÿJ'M4ñø£Œó-ƒÒ‹&n²ï“ïï4,¿~ÿ ` {&æa¸m"+¯äÉÉ]’{$÷I<$yDò˜ä I“dÛÀS#_Ù‡ÂÀ.CîEtäQÄÀÛ¾/–gG‘ˆ*ûAسúêØéX“¬—¶o÷DXžÄMÕáÐvýqsä»G#¡Û©1vÇÓaÒ¦âüߘaazTâMú¶O­’úÐÖmߟ–§ \ò¬ä„Ê&cÇ7 S—rGx"{ÝØ |¦:óÑбÿYž½9å°÷c÷ù©RµPÜí|ªQÙm×w㆙jí-Cº8tGg4ôÜ®êİZ­M/Ý ü(ÕâVŠ&G †Ò™çp‘c‘d‰d—8.c•ã ®r¬Q¸Ná…›(sTHj(3ÌìcÛòl¿g½î D76ðŒaó?>0ÃÊÙYjjJý5‘¼j?г¨¹¤¹¬YÒT‹'T»'Të'\Óþºö7´¯®’°¢y ×V5k‰ŸR¯ú Áp#ÙE}4ÅLýì+ÆÏMÜÒÇÇ* ?zw‚™ýFýÒibF"CÌJd‰†„AÌIäˆy‰<Ñ”0‰³³D.Á‰‰qNbŽX”(6¾$0\Pj*.`çQúPK[²P‚ãPK7A*org/hsqldb/Database$CheckpointRunner.classuUmWE~†–¬¦A–j“ ¸µ¾U[k)Å–šX„H-õm²“-›Ý¸;‘òSôôs<%rúAÏ‘oþ$Çãå5°Í9Ù{÷Þ;ÏÜûÜ;³ÿ÷üWPË ‡Y#x+ƒ< &,MÌa>ƒ·a›¸ŒwôãŠ~¼«ƒß3ð¾ýÀć¸jâ#|lâ®kß'Z»aàS· ,2[ÂU®_g` å6eXÑ&C®ôXü,lOøuû~õ±tÔ5†Õp£™Ë £¥ ¬Ûè'¯Vµo %ª"’:àºë»êÃx>1¢°Î^ j’!¶}zæµihM g³,ZQõ$ÀÐ)ª8ÏÛ´&RA‹ã<&8&1m`‰ã3Ü1p—c÷ |ÎQBÙÀ÷±bàKŽU¬qTðÇ:¦9F1Æ0r\ÔÒG¶”øðµ‡xdàŽoñï9~€àxãU8 3 Í,6¤³Ù \_­¶}_† Ù³&¾¬å¢'¢HFqšZ¢ûؤiz²­4Â`ëÀšÃ0!GTMYø¢®÷œ<Ù€µ'5êü Ô _n­mGf†±|!‹@ÆOXWDQ‰A³)üÃD]ª…¶ ޹ +Ù”>;ÿ‚áèÙå0œö™8a§A¥½.¼¶\ Ȕ͖ÚÞçq! Å61ô(ixsgk äé´•¤Ä[®'k'²\Ê'ç“Þ“y(£¶§ìÕXè3á).¦ózØû/Ðð‚úÙNµd¹‘²K±óT§z ƒn«µø mô2uÈëQ_©'}¦z[ê¹Uû.©±÷Tc{|4‘Óµ¶'~Tú½¿W:;»ÄHÒõáߑԳÑ|‡ë¸HWÔ^A ·ô¥+°O@ ›Õ‡ŸÞÓôŸÄE½FÚùûHšVqÌú}èÃLĬZФm={†Té’VwÑ_.Îý†.ŒE2»ÈX©˜O)¤CËA·í<^"í"éúš^×èo¡‡èѯî£ó.†~Eºc=,ýEó ÷:Vš@‹{O1X.îÍýiíb8cuñò²Z£Šf c —b9‹B,÷·Í"=ü/† \Z60ó1ÀðæÑþ¨~hŽvËîâœÅ4.â‰ÍÉ}nÿPKeÄ\ q[PK7Aorg/hsqldb/Database.class xTåqæÏfßfór°@G€a³!‚¨È%!Y`u³ Ù„@<ðeó²YØìÆÝ {·ÖÞöT =Äàà >Âà£ü·gð ?é„yø)\âÀO;ñRü >+á眰XÇ|ž™}Á%ü’<úôe~Ù úà+~Õ ËõÁ×$üºNÓßðr'¬Ôµp…„W:aµŽù&ƒ}NÜßrâ·ñ;<ü®„W9aƒNp5‹p Ó_ëÀï9ñ:ü>³½žÁüE~èÀø#–ýFþØ?aA~ÊD™Á!¦ü÷~ÎÛ–pÔ ÛôÒÞÄè# ~ÁG¼Ù‰Gñ ouâmxÌ·3æfv'¯º‹Wý’Á¯Xwsï¿fp¯®ÁûxûûYêßðÜL÷ ³~ˆÁÃŒx„™>ʽÇX®Ç¹÷¸„O8a/ö:ðInŸbê§¹÷ŒŸÅçð®ÞvÀ ‚Ÿ—ð'\‚½¾è„K±—©ï.ÂYø’_f1~˃ß9ðF¿Êà^ð{îý•þGâ“ýÙ‰Á×üU¿9áJü»_gÂ7øÿÓIÌþåÀ7øoæòš„oqûþ׉oãq>Ð;,à '¼ËÆññÀ„6Ò’(d`':!ápŠ"á”D±$d„òæ5´k(‰¥:†c15 û¸mŽ*ɤšDpö))¥WIª¾ô!¸Ì‰®Xä¢a5  ª4éß©ìV£J,ÜL%"±ðjâdRvŽ MIH‰Åc‘mWR4NDÛñ!5‘ŠðN üñD¸q yQ´¯·‘f“‘dªq3 ³DÄÔ6¤-. Å£Q%‰Çfå.LÑ^ÉÆfK+ì}½¾Xaq.]_o„&[ÌÓÑ 1h.‘úzƒ)%EBÛ£ñp˜ÕRm%_CÒ‚ró¨ªÒ׋ޮzèˆý‘¨šÌÎ9µ±/v¶Bˈ——· i " ”fg:Ôþü‰`äb5o +>©Ït¨áᨒ0fru¶4·ŒèÒ×t&”X’t¤vvút’æx,¤¤ÃѨÁĸ`}¢„&´îÆH"™¢×W즋éL óJ¯˜&›v‡ƒtÇ4’iÔî’¬}W<Þ­$|I¼W'ŽÄRÊÞ–Þå¹ÃÖd2o8’7lK(¹Ãö0a+#¤æ~5¡ÆR%ê‹¥Ôp"’É1×\S«ŸÈÔZÆÓåV&†S}ñ=±¶X NgŽ©!Ýð*jr8šj% ÕÁxb¤#¾‡˜'ÕD«S4»™›»U"H%»²ľ4LW‘RÕÌ’ùK6åÑЪâÝvfIÞàƒ²XÞ‚žr’DÎÐçYs0IäE©½ÖòkF£h§ÏROëSûRƒ/×ßœ_Ý­FI󩽤¬þh$”ê çØ«„v±…ÔA%Ã~fž ¹8â\e\ ]j0O¨üªMÝŸnu…íÑ›÷JLÑx¯õ鲯º7+Cyhœ‡\”»Èä\;Ö“ÒÚ²–¦Î¦ MA€ßðÒñI#É]åV%:¬Pþ‚´E–¬Ýð6ñ¼Èoö·ù„)™ùàæ®Î–¶î#ltLçmmkñîðµ¶z[|M^ÿvöò™ù@[Gk“Ÿxd§šÛZÛ›š;óȂ;v𲝉Ä"©uçÕ÷ð“šù`Ÿ¾d+yõæx‡òº¡]­ÊP§B^ƒƒ¾%‰Â5]zAÛ*)­ ?Òr(ª* Úo8”Nðó. «©–œ°EË|úlnÌšZ·Ä*j•$óɦYœœ¥ˆظ§‡´Rê5ÓÆ4x±$J)0Ÿ# ÚqâwZkŽWë²æ:¬†ü•貦Ðúà˜7?;ŸÇ¸WïŒäD*RY64|3¤»>„ÖÿÓ|V°/#•g·.§ÑÆü¸YIŽ™‘#–²â»rÝî¼üÃZ:^VÒ¦1¾·ÖrÝ8ï;]“Ø*ÞØêzØ:*ÃL`*“ lu>^H®:Åê ¥2žäøŠ 9¸áÁ˜ždg ÁBz2`Î9FIvBKòÆ]úvù¹SäF~f9&Wȼ}¢L§Èä­éEfS¾ðlžÀäœlÍI H¨ÜÄÀ‰Af8’74s¨%ŽþHL‰’†¨Ü CÑ8ù„~¿Â')ÔF„Ðra‡¦ -q„3ÝR³«Û°1¡¦R4H·øÙA,9w¼­Sí@eƒ$Ê(œòŠP"2”âGØ“o`š)4ê±Zå’˜B•½6¥¯O7ŒSê&^`±±æ!ù9tÐÝ•k)/í.×pþ\ï²pbï’ãUd´c© ¿{ex€Áƒ bð0ƒG<Êà13x‚Á“ žbð4üB†g¸÷,ƒç<Ïà/2x‰ÁË ^gâ7¨‡m¸B†[ਠ·3¸•ÁmpŒÞ ic• ÷3ù}p/e &é$½pÉp7ÜÃ7m85Š-²¨Sex…WÏ~ßd@†Ã[2.ÄZË<û̉}¹ †¿ Ô|+‘áð§üÇ»*~@˜1Q¦$Ã?àŸ+þŸ„H†Á›ùzË 2¼•á¸SÓdQ)¦Kb†,ªÄLî‚_æŸq|~¸¼Ý/Ãßàﲨ&ã³Älz„ÁíÁNoëÛ† $æÈb.ÇÆÏc0ŸÁ¾§Ò"Ø$‹Z±nnˆÊÒ=ñDÈb‘X,‹:¦^ÂÀËd,á^=.#W>™,M†ÿÀÉyfŸQç@"¾‡ÓYxDƒ,–Cta©$eqŠpå_ß»woHâ3Kb™,–‹SIŸ¡øp´¯&OÕèÉJY†Èb…8M§³˜gð{:Âf~3™4Vã~ ¿“á×lп"„XIÆ)Ϋd±Z¬‘áUž[ËçlÇ©2úéaˆudâ,æ·žEõ³iNë6 G¢}¬K§.øRú“E“Ø ã4¬”E3VJ¢E^œA¾§+pN€ÒJª+rŽèÇmJ$”„håømú)öÈb#%/ÔÞµÁïk–Å&±Y>žšÛäïôvÔ4SëoÛT£ÔtxM­ÞšÎ¶élYœÃ ´Ãµòá,a›h'o*‹-tpÑ!‚äÉr-O¿±N¬¥Ü%èídFÍ )Qö{e±•T+º±’Lªs{;%âöæ¦æÍ^Šåc ‹m‚rf‰ÒâÖ¦@ ¹dYôˆseqž8_Æó@e\ŠdPOì`p!…A/ÓyL'ÄÃ>*ƒ~–ÄŸ.BgayÒ´õîÔ’­yè™L"«Ì÷2Úe*Éʵ‡Ô>ý6gLfHZ‹@C ê¬*!-•F’†€#”L”F÷ä;Ñ1ßnhÛ˜º'û…† §±š“®ÆñY8©ï®˜'c³FX¤]©¸™áÏã'7&HJ:vùoÁ²öÅAqåÓÜ«]×þW§»qÍÕ•$¹Ž¤‹Öý±g’"rH% ¨"Ð=_…9•wE’-ú··Ÿ9=çãGfZ+T¸1©–{¿o€àïI­Ô, F|Lß’ñ%MF’Í =Q¶º®ù}Ķ©kbnØti[H…‘þˆÚÌו”ŠkyÂ"+íZÉ1í•ö‹ªz™lƲ¥tôüK÷ÞÙh«©²’Ê8ËÈ•—FQ¬w ¡µ:,>ÈçIæLùb}êÞŽx<¥s-7/ˆwÓ§¦ÒTÓpj€¿3„²WY¡-Ö\£®7m–¿uh¯N—¡"ë=ÊîHXI±§ªË<1ÓHåfoįÎO¡'¤cmœkq'[a†QXI?JsÿQ¦«µ·h­‹‹9þ Êõœ6¾ÝSÁ¡µTcP»³amLœ¶žRdþJÊeŸÖÞ¯µÈå©Ö>`´íCFû°Ñ>b´ícFû¸Ñ>a´OíSFû´!Ç3ÆøY£}ÎhŸ7ÚŒöE£}ÉóecLy¾vÞW´1pf¯ÍS©§µTj-Õ‘ZKU˜ÖR-¥µ¯ôoü¨ÔZ*ç´–jU­¥ò†Ú*x›èŽk2¼Cã9ã“4~7güTQ}•#Õ3(ò×cAþz´Y_˜·þLÅŽ :hæM°A!µ÷¹otŒ‚`Pà¶‚{…ܳ381p2(f 3(aâRî•q¯œÁ. ¦2˜Æ$•îÂQ˜Î½né&¨r×ÂL·gªÝ £0Ë]E˜ÙîÃ0Ó5çzâL£¹ jÜGaÞvtþ(,p~¶«6 Ga!3¢n–Ò¾äœø\…:%,6ÿdÂÔpmjh`>é†TLû¤Á½l‡¨­Ï2)¦â¯ :=î"Ù¨]W°Æ]ÈÂïM’/¥~#÷O…eÔ_ÎýSGaõOãþé£põWn¿ Î…Uº.ŽÂjÆ­…µ|¨uÝGà¬QXçvõ£ÐDø Œo…B/Iƒ—šµiØèÚ”†ÍÔ?# >½9›ši8‡›Ãà_S½6a=µºihkÕúí®-ÔP…§! úҠλ“—¤¡Kn¥¦É–†n’bK±}zÀYÌi͟׭ïx¾~i¸€¤Þá¹.ÜÅSð>ÏP4ZW¯' !Ïípá1·H‘Î%z 'à\CÑ`;/âù–Ÿ„SŽC)©Ù•¹¨­dÎ|QëYà»É5¹û¨éÑG=iPÝȪGÖ9ò… kYµÈº$Г½[ˆÒêWàTc)†1»þ5o€\•[ Ã ôtœa ]$¡ ÖÎ>dà«,—Ï4—Ï´DW›èjœc §h¡—¦aÀ¤˜‹5 "&zη@¯5Ñ °Ö½S?;ð'6½ÐP)¡wIWƒd;¶‚3Ê,!¯GzZ‹p±±¤™®X¢vi=›_tØ]?Û]=Ãà*Mw•¶Ÿ­a™Sl•½Ê~0÷íÉԭ˘ÀtCÍïìÔ|‚©å%"—AdÏû-ÏYcÞq½%z®‰ö`ƒz…©Ä¥Øh^f¢OÁeã,¤šž¾!¼l¹y¥¹ùrKóŒ›èSq…÷¸yòÓ¬w/4ñ§gð3 |)ãílfÕi2éΰæc3ñ+­ñ&þLk¼0ñ«¬ñ’‰_mw˜ø5Öø"¿Ö/›øuÖx§‰?Ë_lâ×[ãKL|“5¾ÌÄo°¾ÇRßl½¾ÜÄ·X㧘x¯5Þeâ7Zã+Lü&küT¿Ù?MÇÛЗy¡§ø Ù®â˜K?AþÄÏq¡ˆÿ¸Ðp((Ú$áÙ¼Ç9[ z,LîƒÅì—Üݶ«µÔaÑ>JD 5¦¥þZx 0•böÕP rÙ‡ˆ{Æ~󰂘sZt [ÝÛwrÚî:ä¶Sôj¸‹X®²5ÜUe;¦ 0ÌÎdÚÖðNÕFd¤º[Çï©¶_M HJ/4&LX˜Cxª 9÷AqÅÉÖZmÐ"(Å­%V‘ö(ì¥\bÄuq>Ds¦& 9õÜ …žc‡(ÄÙ¡œŽÌ¾c†ÖVÃ\­õÁ.ˆe¢ï|(: S$l•0à£|ìe+7h±¸L‹ÅÒ”=¶Y›è.ýŠ¿„[xª]f0Ù’ um„äå§²f×TßÀh7“°¥Ðoýjé7‡~‹];èúøA×'º>yÐõ©lxpBá ¨EAÿh¦ƒÆå•k;á_9 —v>í? —Rû™VÚ쳇ás®Ï§á û¡V~1àq}) —Q*tY7¦/§á+ÝʾÊÙX¾¶Êêõî×Åy§^ßœn›f£u—_ a-~]q;\¹ª°Šnõ›û€øî#žå5iØïús÷hýn|; ßÉι¾kRv{\W—äxïŠú4\}+\³ÊV_E›]Û]eË*£ OÂz ;%ìšvd ·â;М̱·Š¿Ÿtà ¾Üõ½#p]«a¬ßxÈή'…Èô~†-Ѻ!wð#}@ùe¹>qc[½ßÈ Òðã ·Ÿ¤á§¹ƒƒ¹ûÒžìij¡à$l•p»„=çHxî{l”Ç£>‚æœü™\CKËaqý=äO ÖΪ¿íZ˜e#u êg-ÒV?£»úù%‚Tùê¡+* 3B<œh]1Q3ß©2ÞçlüÊÃ,ý•™Ñ}‡e7ËD_ˆŠz¶†›ŒÇ´ ô4MÌΆªÿPKtÜV¹íS-PK7A org/hsqldb/DatabaseManager.classX |Såÿä&7Io¡úH) 2¡m’UQ ¨<%ÚF¤@‡8GÚ^!HR7·ùØtccnê6œsÎmv:¶ñRdZ'›L§ÛÜS÷r›sï‡{;D»ÿ¹÷&MÚ”¡þè=ßó|çüÏ3>ùÚC˜¥¦ùц]:>äÇìò¡·ú±.ÃGp[nÇòù¨ŽùáÃÇåÔnÝ©ãrð.™|Ò‡»ñ)?/ßããôÓ~Ü‹ÏÈô³2ýœp½ÏeèÕñy?jq¿|_ë{dôEù|I¦_öc/öy±_îååòýò9X†>ܦã3ÑïÅa9óG„~Å‹‡åî#Âe@V¿*“µ£òùšpüºl<.Ÿc²û ?žÀ“2ú¦ˆ¶K>OéxZV¾%“oû±ß‘Ñ3Â÷»~|ß—ÏtüPÇä Q|V8’>çÇÅB¬ã' eÝ‘%‹S=ɬ™VP…±›ÍÍKbÙXg,c¶Å¶(Ô¶¦Òš7f¶&º;›ñÎæå±ÌFîÌSwUW$òªéÔv)˜ •#“?õX7JÚ™ö¤Â¤u£Ç5ëý¶X¢GŽM€‹S‰•°ëT`ÔMFX<¯Õ¤‘lr*“‰¾1–‰š×d­ö‚¡¨%­I¾™(€Ndcz`·1|߉m¦&Ý¥ s³™$ª†‘,$C¹­®ƒ’™œŠ”|JïJ%“–ÁÚÞ`›0Z}÷Å©qv{*½‰!U›±·òN3©Ä=gsìíÃnÖ4”nˆÌPŸ8,Wæ)‚–‰_kZ¦!æz6µ0Ž1×V7¬+ ­¤oö{YÞÑèoÃÎL§S鿥ò¥L›NiˆU”)Åæ›LV“¬¼:‘¸>¯8BœUFž¹µ'–ÈD6$Sis±U.«J•ÀH³?g0;’UªÕ,„g¥s¼@È+Þh+y ý qumé¡J3‹;™Ýæ–0ð)^Õ¥ïØbÚ#)°4Ýxp)žYºyKvGqÖË0”Íæ5’6V¤R z8ëïZã2ÆQ6Of¬*]2&i—giê̪œ—yìN‚®"."Þ•c52‰.cI[Íúm·ÄC³É'·)=DW,™JÆ»b ÑÓøó®?uø¥|qT+u΢+ÚîPö¤^)ͤuR€H« ¤£àwgãIY‰án:µòŸWà­Îö»ùƒÚMºìƬ=×%û¡­m}Œß>¸ÃÃÌ: –åݨåÀ«ð(|Ѧpü}(ë|1x´þ-x4  4í%·±háoUðo¡EÙU[Âj¯¡NÇÛt¬×;ŽÉKtt‡‡Òt¡Û‘æÞ÷^0ºuCR„ëú`ôÂÝ¢õ¾`Ëá¦î}pá 4!Œr²;sÈræYÔ'Ï«¨´e$rš²Ç:LpxÕq¨ã3$âltD¼‘pyI/T-n‘²Å#bR’±©ÅðP޲4 ÜÇàV{î`(\E]Ƶxí *ÊêÉ«žV¯ÏË6 ®ANÙ !nÿãˆ?Z׋d”G·ºÚh¶#P}S0 õc<ßÖíWõP8à®òðÙ½yæ^¨¨5}lð­Lp?[E-´¢ÍRÉMJlÃÇ(çáQ9µDjˆ¡xàT‹ÚOÕC³¡ÕŠÅ×/Ò±™w’H9ÏŸÆçÅ '6âM&´QµÇqÙ$¶8§kø¢xtÙŒ{C[‘vírÔ<ŠÚ-@C†¯- …úP¶',ʹΟzä^T„&ÏšDߺɥz_Úg±šŽd7ƒ^5#¯a£h8ÔÙ §á »dEGl‰=©ÒR Ç‘m·ƒv¬)êǤhXgDÕ?`©Á¸¥ fAÌuþ¦÷bZS°“Ág!5…—¦ö¯ŽVÔôã´a¦Ûȯˆ^î`Ðwä%¯†þ*δí2¦Üã]j›†Úmˉ©:-Ïž¶hM•ÓîÕûq:#¬Ó ¢[`¬±ÂðâwÞt7bBÏ8Œ âéNÈN—‘³3éœZ@ïCÃnø:žÞÁçzÑÐTÙxŸX´©ÅÝ‹º¦Ê 5 ÉÌ'*©í›Š]~¾µâô¡Chކ÷ã̃¨ IÎ ÏY¤Úú8Ó‰L¯D¦×bÅíYH𞢪Oá‹Ú ÅàdÎÐsq¸Ý‹ƒk˜)è ̃’>óû0”—Ÿ€—‡±¨ôÝ|$xéAü}ä¸E'y‰É/ ¶Yp#ÜQA»­3,|üÄ'Ú‹€'¡h!:áÍP°W@;‰|Ð0l‘h_þsÞ;H7ÔI»ƒQë½ 1¯&F‹ ¢D+|ÒBÛ-h‡ª!;à¶`öÌïÙ EH [‚Y8—ŒÎÅyµ%× Låã«í—ßôŽ[\@½$sÝœ›Ùéa,håˆoœ/Ox£¡£áׂú þú`ý¬¨k¶[Î[Ù£:œ¯Å]{SVŠ h”û‚Ùîâ¼RåÞ #ììÃ…7a¹gÅóäKýT‹ÎÁ2DH#lò„^aUtð/eQ[ËmâõRNÌ‚ú¢ ðŒŒ›ìò2È^G·¸Ÿ:©K$å6t¼‡UEÂK/^,ð—Q~Üê'Þ‹›C®vÒÒyŒvro :©ýŒ “Ù´q;”3$‘Y¸nmOïà³®=yuüb4ƒÉs¦ô ·à}ÎV¹ƒäìEv)÷Ëÿrvƒ`ŒÔû~,&ã%{[Ùg*«Eöb©ÃÚµ\ǸòÁ|ë±®Ñ`Ýí¢åG§çGtÆåE@˯UÁÅ]r‹ì–ÿPKŒ´FH ±PK7Aorg/hsqldb/DatabaseURL.classWùsç~VZiWòÊ’V¬ñ©cÇV"B¢„59Œ1AlÛÁ‰“Ô^[‹-%E»4IÏôHz¦—IÃU‚{І¤­ ¡¥étfúC§þý2´îû®d[€\ìÝ÷yïëûÖþÛ?¾ àü%ˆGñ‚Œe|NÆx0ƒ˜Ä”„l‹,Ƈø1-c†ß9‡ù}„ù fQP”P "†øñKÊLÙ2v4Çœ—e•qŒñq~¼"ãUæ^Æk2^—ñ†Œ/Èø¢Œ/1ûËA|_•ð¦Œ¯Éø:³¾!ã›lù–Œ·e|KÆ·Xô÷]ß“ñ}ïÈøŒÊø‘ŒKø‰„y¾áñ½F¨™ÃæËf2o¦“ÃN9W˜îê-lÇ,8Íüœå*÷÷õ ðïKgú\ÆPß°ix¼'“îvEû‡ŸÎ¸,&j¬‘‘Á*‹b)ÃãÏ eƇúö¥ŸÐ\…鑾¡žŒŒbsåüøT±P°¦œ\±0î/Q s³¦cNš6Aÿî\!ç<&ÀÛÙuP€Ø[Ìw}ÎÞ—Ë[{H%»·¦;âšk·—Ù5F…;æÔ‘~³4bNæ«Ò…Árqʲí›=È%³l[”­€] œueŠåéäŒýR>;™,Ye;g;ÉýÉA'gÙÝÞ¥er„ˆ7 à5ó%mPeËæ×¬5kHø©‚÷p’œÂiíwtO]:œœ2ªJ†‚3Rp?àÙúª‚sx_€ðç,àç~¡à—ø•€uYSsåœs¼ïØ”Uâ PWn-wÏ\.ŸµÊ .à×ìé7 >ÀEšMIÁ‡øˆcü–‚=Jÿ»ü¿WPÁ%BÛ9­Ë4A3Ÿ3¹\‰Ó5’Ij1S¶KJ3ŽSª1‰ª2÷l…‚?àc Wü‘+k[Ér`nvÒ*ï+–gM§®Pü¤‚?á*u¹T,;œëŸ‰ž)Ú³Lg†"ò8˜ä"®rŸÝës¶UÞ>Sœ¥uv”LÛ>Z,guw£JSY³ñD~“heg[긴[î>EV?0y˜ äŽó ³Ö!s.ï+uߤ\ÅkÎÉå“™â”É{,õ <™Iï_>ßuR:ßMN1S£…4Iœ8 -¡¶±õÝóªm†¼€ª¸Ì™ó^Bõ,s<Ìy+¡z—9^æO¨íËœvæL'ÔÍ5Žªn6äè–®T@L) èO¨[–%[Hâ‰×$;êÖš$ªn5äÈ`M°!¡n« Âê62®¸]¾¾”ÓF]VÛÎ/åLåé2õ`"%Q»:˜ÖG5e^ø‡àÎA0¢ñH²Ú7USOb½¦j¡³´~üv§µI ¥Ô8+Ýyþ4zâ‘5É7Á61-ö.‚ZLSÏÀ'\Lp7µÛEÈALœ8GûÈoMeftOÄ#kÕ¬iRëÙÜ [Öò{R1r¦ÅNBÖb´&UID^ýz”*òA³õrNÆ)Ž­GEZ“ËèL(e#&\Ü4f5n4éa#¸€Œ¾Nø^£‰x„wëáH²‚û8 ñ,ZY¢‡ÙGuÅX§U{«åˆË ©¤N&4:ÛG‰Jò–êLݯ71µéJºïŽè>uG1=v ]z’žG{mËjê&ÞòXuµ9ÞÃtjé(i!qâ”{ÔÀiÜUoçÑ´¬˜½C3§ÓᎹC#Þñèî¸?¾ÌÓƒ\ïÎyŒÕ|1|ÐuXóÓS¯¬>äõ„úVS|\Ã|\#K‰„9÷ X—ˆ[â wAõa¾$MòœB‡Ô$f4¹ý S¯asêZÐ=?Õx»nµØUoaÜf!ªÝ‘{‘®ýŽâ¨ž¿zþîù'ºÄ6±Cì‚Z½û„ãÁEIzHxÖý7ÊÀý…žˆ7  ‹ô Š®ªX㎂ÞÏ Ò"’ÿ×ëÐ+¢ô£ë­-M¡§»£÷*ôÞÀfAøwSnÛÏ"¬[“)ý!"aŒ*ÖlàeŠ%¶ ýž÷6‡o` yX·Z¶K–7e|cDè‹ô ßÁ X¤×*Znz@lç"}Á#«zªQŧÐ;vÿPKßȰa]iPK7Aorg/hsqldb/Expression.class½| |ÇÕø›YI+Ék,²-|`Ž€‘옘à$ŒmÀÄ6`sÈ%l"Fv$B“ž¡WšÞG m¡IÜÖ41 ”„’Ð+½ï&mz¦Mï#_1ð½73+­dÙ˜~ÿß??´3;Ç›÷fÞ=ë|ýâçO@­¶Æ ÷³¯¹ÀϾNoÐã›ôxžߢǷéñz|×ɾçfßg? —ºññ#züXg?qCû=~JŸÑãçôø }ÁÉ^¤ònØÄ~éd/9Ù¯œì×ôö'û­“ýÎÉ~ïb/³?¸ÙÙ+Nö'‹åŸiÈ_hê_©åoÔýwªýCgÿ¤ò_ôø7Ñðª~ÃþÇ@þ£³×tvÎ ×F×°ón˜Ã^§#ôzéõÕ,v‰Ö8£§‡†KpÕìT³SÍ3¸N5'¢Â]ôpSoÕ zd»˜Æ'9yòÐ#—äR-jyT˧Z>Õ ÜÜË u^¤ób7¬æ“é½Dç¥ôRFÃÊé1Eçn؈tàËÔ,>OÇmâ3ÄUô˜©óY´~%nŸM¿ÎnØÌ«hJ5j5xn|½ÖмkèQëÂñséq-ÍœGµ:ìäun~¿žÚnpãk½ÎçS¹€&-Ìâ7ò›t¾ˆÊ/¦ÆFZ¢‰ 7Óc =–ê|5·¸ør~³‹·ò¶,ÞÎWPßJ7_Å;èÑIÕôXC-:_K/ëÜü¾žÆFÖnuñÛøín~{•0½CçA7<Ä»èÑgÌC:ßì†Oð-´‰[ ¯0 ÜFµ»tÞã†GùvÚ­î¥G=î¦GÔ…Ì£¡q7ïç;hÜNzÍ¢Ó¿‡^wéü nxŠß«óûÜpˆÊ7ºái<þ&þfª] ÇEZç-4õ­ôxíãýTÛ­ó·SùN~'}—ÎpÁsüA¢ý^ªMró÷ñ÷ÓãnþAþ!Ú¼»øGøGÝücü!Ü ßà÷Òc›ïåŸ èŸ$¨ÓF=BP÷9ù~:îG©ùr »@‹´È§‹æ€ø…†?ææóÇtx•F>¡ó"óÓ„ÿg¨öY’X‘~à±Æ?Gµ'uþ[kó’Õ X ƒìÆÞH,ŒÄ×{úCAg`ïhYºl5½0|YÓÞбžcq U¨•3ÐW7w˜¯wh{_|WC4ÜÅ xckotKÍÖØÝ=Ý›jšï鋆b±pod>Wó-+;îXݱ¦™Aј£ÜbÔ’†ÖNVܲ%ÚŒ‡–ôGºâ8¢3g0Í:»'¼©fE´; u·DâË‚±­8åwõöôo$‹©ÞXÿ¦»ûCÑ]iíåf{ƒ¹búÄÍ ƒ´öƒ[+ǘ`ŽNY©ƒ$ii´·¿oþDÖA9Іúz‚]J:B›qL¤‹ôÇÍ•£¯ FÃÄcoŘVÀ«ÖIƒ«ÜP9ÿÌˤv Ìñ:æxäÔÛÕÙŠÆW÷J +Ç1h¸Ü†^¦›`ã t踺E[ç 6 õl¶´8iYþÊ ÚïÜ’˜Gnµ,³+gOؘè8WY-¬µ†6ÇÛ…Hø*Ç>'Gv„·lUCIŠ“ǖŵr7,3Ýøš°“‚j=?Òl³Ç>Ý$¿ˆmh‰ˆ3XŒÊ¸vlɇùH{£€§3߯ñ˜ïrlp™~49jU©\èLpÉ¢QÜgò”:+ÁÅd/Æa~d¾)ãáÞ¢D;ÖÛ³#ƒhL6¶è‘‰êbÅÖp,ÃÎ$z캒•[®xé c¯­ó§Ñ³@>\¹+´+Ô-w7cÑåôÁåOÚP;­<¯Ë»ÑÁЙ…TE,ÅOg–N‹°e4|ÄDÝ«Ðj)d5W‚‰ðVÊ‘*MÊ]¼·S¹Ñ âüËBì Ec¸á5+eŠÄ;ã½Ñ ôˆÎbȊѪ黿Kh6WâAIªrÍ][CÛƒ¸Ý“#•Iê-ék¤©·Ÿ”¦¶[;ÔäˆK5[ÜgRu-cCñ¤ nÊì±ým"­)„f!$u»ÚË‚TDW+Õ—µ rO8¦Æ+v¸éŠœ¨Ñ ¢óeÈSÒeL²Y{oãÖP×] *3s[¦˜ƒ6¼£w§Â+³[ˆû‘ƒa¹¡XÆUsÆXÓÒCkä \;;ŠÅ-þþB‚ ÐÝÕÛÇTX™r 1äl$Ï$;á5H>ØzPcþXí$l‚‘ióÑo@ n¿ì ¯e›Ær¿V‘Ôvö…ºÂ›Ã]28Ñù1u¾YçÇQÈLû@¬ˆ. Y"ቨ‹BÞ@Â}BçoÔù}:@çQÜšˆZ¢{%…|Hp8Ö´+ÜîR %hôÚ{#M nǸ)w™™ŠíwûÈýhˆt'\‹µ£²Œc¤±©™¡!fªT›™¢56Ð~çš²$"s©vLß ¡§'I>®±û¿t-þõ<ðËšáÿI&Ò§V^~NA’$ëT_4ÒîG.´@4Ž ãyR|‘ò¸w οoýÿà(|ôJW¿rgá¿Â«˜=¥{Ò3µ£Ux&û”·Å™u+ˆ†´|¦Ý ÛúKí•‘¥™ó™’‚MzÒGÄl ºzDâÇ`SY³ÁráƒÐÃKBz”±rƒÖàßðªÁ²àUJ&6DçŸ7øIþŒÁ&±3Í`U¬7)=¿²¸3zó–Ÿ¢Ç ~šUÌÅÜ líkZ[ –Çò þÿ"{CGGÃzÄpmCëšæŠ…xŒU«×¯¤ºÁ¿D+8Äì™$+k¯ZÓ,2Å¢¬Ðù!ƒ™ÝhƒÕ°9ØÑ±bæp[[:WWìcüŒÁ;—]oð³ü«T»¥##P絫c×QmžÁ¿Æ¿nðoðo¢2×–¥öVƒžÀ}‹Û`õl¾Á¿ƒKðïòï¡é3ø÷ù v [O}7lkÀÿ¡Á³Fƒ5áùññl [jÀëpÞ€Kø`Ùç ¦3§Á8sü'ü§xšÛÀ6ìVv›ÁngwìN4XC ù™ÁÎ_@+7®Į̈·f$«2¨G%Þ„<Â_4ø/ø/ÓÓ½ýGƒ^2ø¯ø¯ þ†`EÚÆ‰D?©·–ntÖÑ+6øoùïОü÷üeƒÿþc°-l«ÁÂl[êA&ýƒ,Ûàä¯üOüÏè&Ö‘c§ò¿´í륽þ+{›ÁÿÆÿn°w²÷ìq¶Ìàÿàÿ4ø¿‘ø¿éõUþ?:ÿÁ_ãç ~ž¿nð~Aùh©ÜŠžEºb%~'³Ù{1ð0ø% íÛÔ»ÓИÆqûÒ’*Í÷t…úâ‚CÛP´48ÔƒÀ4¡ý†Î‹']óšV:bhM×5§¡¹4·®ešÁ¿ghÙÚ$t€ -aiV.=ò´|ù\JC+ÐòuÍkh…Z‘¡k>C›¬•Z©V¦kå†6E«0´©ðŠ®Mc0ÝBzWÅ5­jAYÉ0%¿D’©OmÀ£Ð¦Ú R5Sµ«R÷!…Q©&=fì¶ÏÐ*µÙ»—ÝÇ 4£h·önAYí¡)~þ™H °5†V¥áv^MµÜIø7/%iéÖµ9†vVkÀ5m.î \„ó©rž¸4ZÕÚÙÑ{W¨ÛЮ%ž.Ì<(7Ó”'^׿Z†§q=±I'ë0Ø*|h7Ðëž’‘¶†h8¾u{Uƒ}9X«GFÕæ³f][zé :óÕ±Y5´…4ûFí&ôÏ m‘†Êèm±®5Z1H³¶D×–Ú2­E×–ÚÍ–—ÂÆýh9P»N×Ú m»ÏÐV’I"¹}’=E²ümÜóV¬"©þ`EW DÔVì0;BÇ‚סuêd¨ža f$ù³±§7‚6Ó¾¾Þ(ZX‹´Latä« x þ3ZÙŒò 8‡çÍŸG½#tÞùiëHçêª %=1ãŽ%EZ¥MÕQ«RïS7¸ÓlœvùDÒ–A‘àŽ0:!½QÒ5Hn»ù.oô<éè¦êפO¥Ìꔦ2(ŵšéIy)ŒÃÛCêõšÊ–Ñ75Vÿ©C 7O“n³‚}}¡H7¥dGßóH?‡UUŽ9m¸3ÞkžA^2M¿ªÕlœ™)½•é–‰Â#:xsbÎÝéÇX:*&Nqh3Æ÷È¡èfôk3ø›O·ˆ[¡æ»ûÃ;‚=! ²RÈt\ĽnFE1&o7HOvk–WŽŽôS¨Ò‚Ýxdef£ähcÚå9.qÇÿõ&䲑¨-~ÝÁmî•-w)7ýr F‘üøÑ¼ÿærJݬ¨¤aÆj âŠ$/»§,,Éšx¸G„BD¬új"Ó}cfêçMôÂâÒ%9ñÞ†îmý¨wºÕšõºãlÉŒFiÊ†ŽºÎUùë-Bæ ÑXn(AÉ FU†!Ö¡C¸§"'o&ŠR´dt²ÃŠ;É躾|7JÆ7Åj}®` 5>”‰¾¥"ÁEê”é4XaÑ6†I)¡‹ TÇåÒ<½;ç§žv#%ºQ¥Yn¬ï¸Ì¼'rĤ˜„˜ˆJ2,§:1ߘJ|·Ó‚K’Cƒ°¯J~‹ëc7?Õ‹c7Q×DeÆ‹ë”~g—ñÚ`\ÇK]Žw 딵)´ý¶%á(9S:e¤%yâÔï¡‹é¬y+3ÝiHPrŠÕ>¤Ü[ ‘ÐΕmæëÕ=œq®=\8ßœ¼¸rB”ŽîpÚBñ ¤mFåØƒÍQħÛ3¦Md|n’ÈŽ½=¡ ʵM~1˜ß:ª‘Ô'ÛûÐÆz#Ê÷-ÈÛNä¢U^ŒÉ »øb$ýªk¬hYLùôhÃ8?]“ŽñÆeÜ£ÿ˜qQ-7ÑŒ²HË/^±¢µ¹¡‡Ö…ê”&,Iýd-Í•ò¡ù•÷Vé®%êPìKËŽ_s…Ùkáu áÜZ³ºò½Œ¸™wA]òŽ#ÍÛ(å+$Óþ¸¢ŽÊŸ>ÿÖ,åV*5”MÁUAG½TØê’Ÿ5DºH£f¼íJ.â'v1‘âð{’QÔö ú>Qy×FÞ tÒ6:éƒWõÝjs45Nã@”Ó¸ëZ^§y™.¬Ý›Ã‘nsß½™"Áñ%ãxwúEct‰ûÙ¥¡Y:?ñåé¦ ÝŒ{­àšT3© Í)Ƽu“SÄÚ—æçw¦Î£Od“餣±>©‡g… ÂXBµõô’LºÅN~Ë•|#hyÓâFËfMæ0ïÙ¡7Jÿ4­rÃìµ0üp?0øÌü^ÁúŸèûqø3¾ÿÅòþW|ÿ[Úûß-ïÿÀ÷ZÞÿÅt!‚õbÊŠò5Užƒó¢|]•#ª¼ Ê‹ª¼$JÝ®ˆ’‰(Q/¾q×™S´»˜[”Yb= ¬µ('±QzÄ8 ë1.å‹÷Ï«ÊBU©ñŪô©r²*KTYªÊ2V.Ê)¬‹X›Ê¦cÓñ­÷‚cé÷æçGÓC£‡v¿ý(8ü%GA÷çQp’B€0f(‡}ÆÿÀ¸0JiÚZüÙñGÖâÏ‹¿6üª²MøëÆß|¿'×€Y~O·¨”û=E¢âõ{ EÅÈ…¯å¹CÖzþª£`yp•€ï¸+AÓÙL¬íôŸ;òäVÿЉ¨›i¬ø»€Á]²ô©²D•¥ªÜ¨ÊÛTy'•¡“³þxÚª<•Æ<Ïl¬ £×JäÍ1«tÀø†®ê$‚l¢‡²›ŒgÑ1(HàÑßX(§)Ä®Çßdüõã(ïYpäa­ˆÞ†¡x( X§-,Åש0­ôpq$§j7–¡ÔÍó—ÕÖÛø°ûlgÁã³Ë%&ánŸÍgÇM¨sxâ wkˆü7mÉEKÀ©;/‰¿¥hJ🶄çy!ìõl¾D„ŸÁƒGSÀ·ÑN}VZÊZÅ d"æ¨wëoŽù³ô‘œèÃpõ¢¢´Îîµ—€BÀkÇm ˆÖÝvDî•$|ö¬b-d#v‹|¿ iïÿ?·ŒSfúg¢¿ÿg¸ Ù3Ð&À­T†šç`Ž)âôzæÔÛOÂ5h¯kë¥uºWÇs*xõZ<û~Èö9èeæ®Û­ãyýÚgg>Ç0\{Ö"Þ®S¦­Î®ë)yªñÚ…Žt HyU-PZæ³ Ã¼=jö›êì»öy¯=ɤˡðZ–=‚Žg²åël#sMºE:[ ³…l2¶¡^8຀ ÛÂÙ%’'bgx‘¡wt#z°œ¡Ru ž¾I™´8ò¸Nn¤Pªû„Àëç>îÑ÷¡¡Šc?±gµ•ƒ…êGù­;ÅÈÄHÂuÃp½dcR÷¿óËíZ(V!õs«Ð8œ€ÔË]ñÙ±µÈgÇ]@EU/Ä[Ðþ²€ðͤ ,ÄßRü­Âßü‰þR¦‘È©ƒ¨–V Eï ä«Z  Ôüä1Ø„4~ÛkÑÍ?t E¸å#àfd “yÏ[ndòBêBŸ,Ôa]Ú ,b J½Ý…'@~Qê2…ÜL*Ëj“ˆºl ´ S(°³žŸ2¨ M3‚cú“VÖ 49+ð vè£ÒIjánTû´ð’ä–…'%×¼Q,ùâxKÞthÔŠnµbkV+6)k0K[Pb50%rECÖ‡aÑnF& 2 l¤RÉKØRñ_HÙ†3Ê'°¢Š“*䨆Ëø>¨ªB·è:´…õ63ŽpRÈ㳡I¦€†*ÅØY½™iÊ™¨å˜ž ’ºXðæÏän¬HìF³©2lªÉg; ‡¡iš× Ö#)Ga)õÙ¼v…U‰IœöR’àp¹œ#0—Ù…YHö¨!I?G>>Šó2µèûC|½ä ´I¬%±ãy¸ßÔíðÛŽÂ3º[ž˜>IMçš9÷fÖj™ËÅÜÀQXjÎm3ƒ˜¥æ’ºô FXXeCy-IîC Ã`ÖÎV¨IÓÕ¤Ir’“Š!–2ÁÀêÊ„{b%P7‘\Å:Tw•"PÈð©G$iµ(À :ðÜE(‰øÞ™˜Y­f ;e{LNµžš§¦®fkÔÔD“vÆ) tš{³6ó[rĺDlžÜ] ¿gšý·°õé'#¡¾ l£êkS*cÎTúúËM•‘$Ë(¨[Ùm t×h¥P.!IyWáæ6ò—R&'„ÀcQ ­mU£$± Ûngw¨oW±wCÒé,5ÎlYAÓ&\Î_ÉåŠËM2—†öQÚ¢×Âèœ>ŸTk…ÕZ­Éµ¦škå%ÖZ!M-ø‚\°,±`~rÁ•ÒL_¶—­ËnRË®ÂE)L¨ñn]{µ;„®©¡¨ZXÏ@iíã ëù{ dAÎFñÚ€ŽŒÑn |92©]Èa ªJX×SÕ>\%9‡Æ†”¹ÿŽucù¤Ò—hú~Ù Š>}.HenVp˃ Y-;§¡ÿÕë'aõzŸ^u Ö´ùlU>Û)ÛqX{Öá¿zucp Z8¼)µõ"’G?Jðl±z T•‘ÃîEwjU½]¸WßEÿ«y‰ÔÀ— ™|¨¥Õ€ŒÒj@Fi5ð$®^÷éDk©OŸ0Š1ê>ç¸Úç ¶_ïsƽPN‰q6¢¸ƒ;µßvnç°NN¼£ÞåsBŸ+•’Ðü' ?«ôê)‚ x¢VƒÕY艌ÀBm6ÎA¸U1É'ë߫ް$r*$ï';ƒ;[… ¼˜ØÆFÁñ«Mô«MôK†ñb—¥ b+Yâ¹ë,i®pº)Û"\„êw®÷™ãp׿L4™ `Ušë@âX›Ïv†âkÒjAsYö¤,dÍÃ%Õt÷–R<K8§¬)Oޱ¸ÎîBG¹œúÏÃäp°šóä`çŽÀM™ßB?%¶SjÈ6:ÉÝÃ" *q¹:Çö²>ÅŸ›;Q…rrºÎ £i=·;Ô ‘ŒSØäÛeTuÚ Ô>—¡üÍ–O‚½Çw ²;ÕD۳؂"߉k$NFœóÃþ2Åš´`Ùö`œl²«üVo§6-Ù6 ‘:‡U{ÎS 31ÅgG&­·Ë5ÑóÞRçzô,)/çaè•Dõ!0ÇXFY•»÷À"/…yÔÅ1G ö‘O†ÇH£î1êtÙ&ºCü:§W/tÒÔþã°£žœº./j»Î*dó$Ê{ G½øÐ//Òêœ^§Â?.ÐtÖZÆ–¥4I’íRz¤æ«NkóžþK&»Hþ»Ô» 6_½œ†ÃpÏ^Ðèd.Æ“LÝÅNâÚ¨FÆôŸ‡Š³[§GÀ…Ï&²Mça¾k*™«ì*šQ·G¾¥Ò#»›Eo>ƒZôZ4©‘ÂJ îúDTÛEQ-…EŒf©^kj+Šoež´SFµUد€7Øà4Ü‹lðÙOÀ} €½Þ!4ÛG¡.½ 6£ÛôFEÝpª H‡÷!s/¡•1nLgq†­:ë§ødÇ9`’’‰€!éÊÛLßä¶kL÷ £nF÷²û2t™³ßÈÞ”¡ÛaÎ~3{KZ’’Ì`×Yð–X½úQÛµª´þêW¨´–Kp‚™S†7´d/`»Þn¸ñm7{{†½1ÌCyGB“.T{3S‚ñ5ê÷·ì‘¾7²à[DèGÕ·%åÀš³€KïdïR êq‹È}˜"t2™šWTõúCU’KâÏäN¹mBžÎÞM—a°÷(8³•+ãp†Ú]HÞ„²%ȃøö {¯šövµü&Ë6¯QÛlú-ª­B9÷[’2…Ue ±Û.mÿËUCÉx`÷P‚gä‚}ÆpKaÁx„eaÇ;MJØûeö‚]—ôT™ßâÆ4¼_hQîÌ#Êq+wÆ­PJ7Î"ïPà¼ý¼ëBüù x'‡6*ƹû¥¥ 2†®„Ήoq…*ßÕ†‘à»oDËu½ «P*Ë÷ìb,¬wšò9´Z©—^öÙÒA¼·­ŠÐvW†÷iµCUöy ä¼ËlEù)›òr ¦'5ÕûHSác×kÄdeøzž½Ÿ}@ñË]ô<` #è“«Ã(•‡kR(E:Û™6IfﯷW“™#*¥¿w>a«ŽÃÛÍ[ºaøÐQøpõàrêú@R2 0ļÅHˆ$pò9°]…}dRØ+È8 †á£Ró9Ù‡ÙGÔ¨ë•(•hâÎ5Ï/â€Ý¨"Èùÿkú%Ú­I2ýh"¬&ÅMk™I$'û{Hõu¨à´Nf‹q…««„ÙýXµ,öAQã`²»XÖV K{•ܦï&õ‰´ÐX@^0}œíQðÑSC=ð¶“ðÐz?;o¯Ö†aÏI˜³¾úì¥ôëŒ1|ûd½õò'„Uïáœã<\¯Wù}:†k†}xZû'Çë49^'áÑõž9òÀÀÎv>5 ùl~r`Ç( £¸'ðum¸N%n[ NÁj{Ï}B$ê?‰ñ™Îaû$ Z3’”»÷1Ü"3‡hÇXþ0|ëÏPŽð8|Ö/½lŸý0 ФâÁu„Åçö®ïî;õ=©ú„ËGêôê*áˆá)ù¥%ûÁësž†§†a( Aö•î‡)ÔwhïE÷u¸lu¶Ä(á>^¶‡åzm{FµO#ÊGêõnâq8ºNxk>\pøügút/îÓ1ZcÜçàÑ=ð Ÿë4<: Çë²¼Y{)ì<ás Éz7Ÿ§qœܫÖÞKíϘ˜<ès?Ïî…$šžŠý6»q¶Q@ÕSêÚbê~¸#ه묢·Ïã:nEê"ŸI­7|(s_b^ òƒŠÈ*jUI¶wšFë#—ð 'ã$wwû´`63 ·BžÂ<§8…ç$}_TJe¯Z´þzaöf¸³L`õé Ë—hÚ—‡á+unÕàEjÎÔgù²†áì¸Ya¢ 4_=_£­ûúiø= ß´7¾>O'àØ‡þa–¾?yÄDœððO'Eða(½71ºÎ`ûG }Ük¹Ë¥+îNe¡–²¥(å`˜êöa¦fÑyÊÊ7{º3ÝÉëtvÀ~ ˆ+ãpRÒøe]/ݳŒÀ:û”£'NÑÙcè°×Äúˆåã㤵Ÿ§o Ñw¿òÖ³V !L­ò;Ôò¶k%UIšÚ«•,åT›¢4Ùv°Zq5J2Ó‰_´äôŠ),(9=†T]…ÄŸ‡IȧùûYäj’‚–6»U~‘§£%µüöY5Ék:HVCIC®ø¥²)Ô/:K_|k@Üþµ"ßNÉg7bÌ‚ïÙçÔìÇ+RêoµÜ†¬qðTΞRÈ›“jÚJ¡×NÆ11µxt®ÈF öŠ+㌠^¦_sMw‹€5[¿œÊ]ÜŽNá–9§cÇ“ì©Q÷ ¨E¿cFC‰ôØ;Ô–Ý™LŠ•ùUf8™ûŽÌˆ½$ÑšÇÚˆ$ŒöwÛh«¿×šJ”pšSr`2”*øNG>È¢‹AF®pš©5WºÞ‰ ê·$™c V%øe¡â—é’M>ùa,Œ\û yß??°$bpÙ˜†( e=ÌžóË9‡…, pªªš‡)ó~˜Qƒ6+ó»”¾» d2ÕÙT™tðÙNÀ€™èæé'àÇ”òû¥Õè%óµ?°&:³1~¸@äato®ÆÖ£cºÀ†ÑîË>êCSý󔳉^.H²ÀOŸR½Ÿg'Óá23 z&qYôfœGüщûz ~Ž4ˆCEÍúÂixÿE¹Ìp©@_ñ¨ëŒaøE§¼T€ì¶äwiCbÙ&X ¿T´ç‘6-#%Ié°Å:{·˜b_PȬQw47$}ñJå‰?^µò/= KE½ªóðÎ8Úqng³¤Kwš=7¾ aì‹—ò¥Ä®¥GôŒ}yL5ÌØW·g^tŽ}†u}8 /™Ÿt~Õväÿ­ú íYð? NrälÇàWO稪‰ê¯OÂoP@û4üî0üγt~¿Ž*ËÌJ‹YYnVn6+­f¥Í¬´›•fe¥YYeV:ÍJ‡YYcV6Q%Pãah´§´¼|^öÊÑ/{ŠRúPÎMôMôMôMôMôMôMôMôMôMôMôMôMôMô%úT)2+…)(¢-}ÒS*ûžô”¤ô5RçKFeÆ7³¡bYÍ.q–ñ;ù& uŸãïæïßÿPKeòº€!(å`PK7A#org/hsqldb/ExpressionAccessor.class…T]SW~Ù솰@DŒBÅÚÚ„$¦b‹–ˆÓÓ¨ h1µºIX IÜ,–ô®3þ‚^µ^§3ÞjG£­#öJfz×ПÐk‡~¼gw BË„sö<ï×sÞóÛß¿¬Á—^´á”„ÓíxïñÃ_b|9ÓN˸gñ¾ç0Á—ó\oœ âítü€ë%$|(aÒ .p¤„¼ø) S^(8å%›iþ5×O¸ÍEþ•ö Ãe³Ìqð?\öàS ó ⽤›gNRec1ºT½U,䢉Պ¡U«z¹Û^bâå‚ÆÐ¾¨™ñrqe¹Äp(l6°áL~I[Vc ýd].ÞÖl8­-h†VÊkU†Ú¶ð™±ÓjiQ›4Ê+•X2»‡ .ê¹èúLéU3v%¸§ˆ¡3cªù›SjeVÍé>²Ãr¶VáÔŽÿ/µiñP>.©ÅrhiLÝPo«Ñ"Îänhy3F¥eè&ùJA5µÂ„a¨5†™–öÙÝö»‘+ÁjTpŠ‘¹˜bè 4ÓȘ†^Z$¹§ Uó†ž#òÁ–Á“-̨eÅ¥eZddñ™ŒcxKFA!„e\Åç®É¸UBNFd,bI†Ž2"8ΰ¿åM|[ØôÊrN3dÜDQÆ2ŠÛ„¶bQF…¡o'ýó+ Üúh©ÂäËŠLs{RÆmœ¤†˜H§'æ‡&âñD&#ã ¬Rž†T^¢ñ¬Œw𮌻lðš^*h«ãY†Á–é˜ÈSÏWËMP É;Æ]¢A¢V;Ý£­x]TSåISÔ¬dò&r)õ5 4Ã(Ñ_)€fٚOAb5¯UL;ŠÒÒ3C‡^µ:Ò>¹A*uO¾\,RfÉò¼ZÕl‘ûüoc'–+¶K’GjÂkÉéÙÄd"M¼vÙ5uL=zéÕHQp2W¬D§ôeÝŒ«FA/©Eݬm«{¦V5µezž,Õ|¹BâáÀîNJ¶€¬ªtZïZÉÔVí‰ íõD¶$Q­T´R!Ø-Þma7aŒ¿ ñÿz̲P‰^J[0§­GxGâ·õŽLši}qÉRÅzÿÛÀÿ<ôo€áMëË íýþüc°a÷3´Í»B™y!œy×Ë„ñ!v úÈ £Ý;ü.×HÂ}G‡fÜÑ™ƒd…9핉+®ßEˆïŠ4²ñ8‡PxÐ/øÝŠX‡{Ì}Gb÷þùÝï¾où¦µÂ&\¬¯÷%ñdüqB|C¬Úk®³ƒNky.û#4\‡xÇE.ÿ°¹>„´ï>åùxž7 :Ú¿ãèS m‚½ÐÁeŸçtÛ§ŸÐùÒƒÇNˆ›hcD±Gá) çËaYrX¦l·¡:º~E7ý¦Âp³û¶CöMG,,RÇ>a 2ßÃë?µÎ»œZØF¶’ããÉé—н‰ý¢>‘ð·q‰ý3eŒáë0¿tçÜ«K7â¹ýî†{¿Ûr?**â÷ P›òѳ¶ÅeLRÄðúüŠ(\†ýcRØå—\áõ'è½G¨ð-zÃë;~2ŠdüÒÖ ˆ›8Hä7ÑËú7q˜n£žaçqJ!oÐSO¡ÌûÎ=FŸ“Ì'èŸ …ë8àËÖῲïVÇA]µ :ÙÍ)ðçÚq¸FyqÓþUÃátÄçåú®QAîÂñ ñózçÏHÏy¼LÍ4øG#=¯ñSÄ)è€p½ŽÃbÇ$µ!KíHCMh¡q¨Ùiè‚ðz%Œ²—è‰þPK4àfà?E PK7A$org/hsqldb/ExpressionAggregate.class•Wit[Gþž%ù=Ëϱ¼5Q¼Ô!I#YVÕÚØ qlÕUë-’—ØipdéYV¢HŽôœÚe)KhÃV–BÁB -†â‚bÙ­i‡–@á7àçpøÝcw4cY¶ŸÂA>wÞÜeî½sï;ãwÿóÖuMø³8%#XDÈ(BED ËЬ(Ä)+QÆ9ÂÐqQö=­àŒ‚˜‚³ â  &œSTR +˜´â<žf¢SLô‚g˜¡±áãV|Ÿ”ñ¬÷ãSÅø4>ÃÈŸeßcöŸ³bžg³‹Œüy¦î V|_b×e¼`zöîÝ»V4â+Ì»¯Zq_c³‹2¾Î–¼È†oÈø&ã¼Ä4EŠð-|›‘gíe†~‡Íf$TDSíÑ”‡ôÖH$©E‚º&A–PL&ƒÓ}Ó„×t&’Ïxê\,<êщ”ò´®q›%¶DãQý0É9|ù¢Þ©‰¤–JEñfç€s["LÚJ£©€˱gr8ÉbaDÓÇ:%T:œ§ƒçƒžX0ñôd4!3%=:Óœè ŽÆ4JeOÆw%(a-JFGI“Ó‘k? Œû õm'ß±óZ["6y6îׯ´¤i) Ó†Zri~Ò¤u$“;y¹äXtÔó8M;)ØÍÃμ,ß“  ÇXxÉ›ÿ§7›â\¨› ÆhåNG>©aª ÷MN„)k™ ° c“ÆCÆ&׃Ø3zZ éÍέ$—$”S*³ù g”Êø>íŒèm‰x8ª“> v‡3ƒ$:L刪© +óïl@E+^‘PeÈWñ\Vñ(«ø!^¥l.Œ£“cT*^ÃTÌâÇ*~‚×%XÚzú»ûòSª×@]¾n6¶§±u ƒ„¼^ÿz §Ë+Áèko÷ŒôöôJ(H µ‹0y ÕÏé ›qbźŸÙàɘSñ~¦âçèP1§(¿õÁdäÑ*:Ñ¥¢=2®¨¸Š_H¨ßTX™cÊ*ËÖâzTŸfѹFU¦biÇàW±ˆ% ;¶qâiV*ÞÄ[lÙ²Š_âm×áUq7eÜRñ+†ü´Ûù{[ýÁ¿ÅŠ„:Ãäd7­"ŠõmüŽ´¡õÇ&©UeÙŠwd¼«â÷¸£âø#ÛÑ{*þ„;l›³J§=Ï‘Û ÌkXBÙ:É×µˆ–¤¤:|ìpYâÔÄèlí8‘·t‹¼Ç{ý#}þ~ŠÊö¼R%ü,èÚïz®¼%mÔ¼ ¼7K>B‚Z<,¡ÚѶUšW4­itlÕtñÜÈkÉd"éñ²‘õ§Iª¥³š@÷;|÷ÖëâS!mBç›WôÄZbŠ)Ú˜Þ¹ª cÀ[4Ý ¡q-t†c)?ï’avïäm¨,et½°1&Ñ*‡Ac×yÑ®Qýñ눂ZÂÝÔƒ¢ oL8¯pqV;òñ˜a%,”lª† *Ê¢©þ¸èûáÞ`2x–JM㮥ÊË]È6—Ì*C¥´§hª31Êçté¶“Ú®%9¥Ú‘Ç™L™Ë.ç5¾Róm8ïKt-•Û·êe¹ý_ó‡ïõfa;ÌíW)=‘Ô<™{ª7‘ˆQè|Ý}Þ¯d?µåÎ-Ý€U0HÜ–ãl-´|Èñá!ì¢^½[ÐÝö£nJ£JЊ£ÐF3L0ÓwwCõ"¤ËÛ(X€©¡fæ†k0™Üö1_…%püׯX¼¾3bžËp$<†ΓþAŠMô]ZFáíÈ"äN¦éú%¨ÅM³0KKPº+z/ކ‚c-½ ‚Þ ¸CðO’³8 'ˆ¸lõiXË‹ÓPmš ÎJG­$Ks5²©“³w ö6c¶Y°K Ùø»`ÛŒÙ+‚]fÌžìrcöEÁ®0fG»Ò˜ý„`W³]‚}Ÿ1[-Ã;åÛ—°ã†+ û|&ŸaÔ¡tÕ2|Gd<±Š6OVÔe •½*DÖOÂBš²YïvÛ¬L¿é ¹Ê\s6wƉÁ fiöî¿Ö’ÿ—œÌ?BÀìŒL\ x‘à2«Ã›ï¹yÒë¹û/¹y¾ú¼›çW SnžOFÝ<vó| ôI7Ï@[Ü<u»yüZçæñh©›Ç7ƒ6¤±s»ÝåÕDtóÂwÕ˜O¥Q“¡ØN21÷†xÛQúoTR¼¥÷QÞ²-û+~€èí&ß1ÈPè{0s@›\µv³dJ£öl—W Øå%ÔÙ-·¡.ãþ¡EÔ²Ø- obWí–usôß*jdô–^wBýß(¬1Ü2®ÍÜËÈ|k›V°O\´½\0QÿÊw–Ænó«¨áÈ2ö ñÙ5ì]Ä Ø·&嘵¬êÆœ7ˆdžÁá5Á}i4d˜—sêš½aY•ûÊÝ‹xpž+¢,y -`¿ˆ‰D^ÉîtäUH5ïò·¼fQéÑ(¶ÛB’Úv¹n¡éeXLs®›hbÍÉÜHð Yp-âƒs¦¹ÜÀ­¢JF?¨\¹¦g d7"|HãC¤¯q¾ñ6ö.ãÀÐFwiœeÍÖ³ˆƒ]kŒÛŠÉæU<<‹Q6i<ÒÝx\T.‡sh.Ý[á“qœCY?;ª#Õ̦­#£±™5ÞùŒ¢4ZÖÕ(0UÐ fø <%´TÖâe¾›yÑçOfï§(çtQ¼ÙL6r"eAí»*>б¬’|cw“’YæZ»\þ PKj+Ïš7nPK7A%org/hsqldb/ExpressionArithmetic.class `[UõÜæµyIßÚ44ëÚµ]×}HšfÝ:ƒncišmÁ4-M¶Ñ (iû¶e´IIÒ±þ`ˆŠ¢àaÁ*¨”¹uäç§Ä¢(êT@ÛÏy÷æå¥M70ݽ÷ÜsÎ=çÜsÎ=÷¾=ùÖƒ@3óZ¡FÌp•zàjꮑá½Vx¼ß °‚FùA®¥ñ:+ìë­}ˆh7Èða?"ÃG‰r£ £ùÇe¸I†Oê“2Ü,Ã-¤æS2|Z†ÏÈðY>'í2ŒÊ°—„Ý&Ãçi¼]†;ˆsuû©û‚»ëÈž;IÚiz ±ÞEÓ» úucœ~™p_!–« º‡p÷R÷Uê¾FÝש»¨ãÝo†VXß°ÀA8d 8LÒŽíâzº‡È’Û¨û&±5Å`$¯#® %©ë“‰á¡–ÀÖFô@¬·i‚ÁX*ݲÅ5#‰"¬ŠŒ ‘)KNkÊ—UׯK$½ÉXzÇ šŽõ™áW SȾD¼/šf`COwF“QäT“Dd°4Guš4¥Å5#R6E†qµ3¯áÆ@tôîTûÒÅ_+pCÛòîJßÀox^``Í¢Íð;~`0{jl[‡·a,x^Âì m xþˆûWàOðІWø ü•rÓŽüƒoX×aB×\£Àß’7yƒýu«ëXë"Ý+ðw¢Y5Z0Ž UÎ/‡æ½7âGŠämk£åá­‘.¯˜-탑@g°as[`S ;ŽÏKôB² %ýÞ`P\MnïP·¥WoUàŸ„R4T2¶}‡†tR†øü[ÿÀ8NÐ 8©À›¥ˆzuoÁÛ Ä1F]3)L‚VÈŠf¦N& ³*¬˜œ^‘7,(ë2¦˜Ù,…•°R3³)¬ŒÙHðÂÎ`å s‚ÙÔU°9 «D*«bsVÍj̬VaóXÂæ³z…-` ¶ˆ-Vؙ̩0kP˜›5š™GaKX“–’‰Ëà3kVØrvVŽiIìåÉ«À.v¶ÂV°s‚+¶’«°ó¨ka«¶š­QØùÌŽŽPØZ†•m^ÞMfž©i–›°ÙsÃÊ“³À ÓYÇZˆÇzÎÖŽ0ּė˜Û.5™L$›üÔS™ާcƒª˜.Ã2:­Ä[—`ßݧ¥¹"Ë.:©mÑt”}ú¹¤ºŠ4nKÅŒGÞÞ—ˆïR“éH uÆ1‹Óåå­Á³°`` J«»yw;g*mùVE‡†Ôx?Ý"¾é ¼ [£óÔ¾™Â^†6ÑæÚÔmtí¡vtE:‘Ù™Â:™™ã<ˆ§3¤Ýr•N׌‘U³‹-g-‹¥6ÆE9î×j/“Óµ³DåQ­Á¤1J£kÂA%–Êæ<†"¥¦½)tg*gêpEþ:Œ¹XKùv Ú>½âc z¡ˆ½¿ µOyVj/‰¥¹$¦_ŽÌ&5‚yÆÕ$/h÷‡#ÞöΞÍÈmÚ³¥#äÇ37]q=ª8ƒ°¾ÄàP4K%âÚ½ŠWKÆÌ.¬À=Ý~oWO¤£§½#„âÛ½õtvù}p #”W…Ñæ–©ÂÚ¼Ý$+ìÇZÜ6U˜æž6œ¶{1UKµÔìÅÕ~¾]ÿiïjÃÉ œâ廦Y6Óy˜éjƸڧ!Îro4…2ƵmMÎ΃ÆCDx$žŽîîHb¡`˜žg6y»|Ðómþu^¼ÍÔM7)'½x¾¶ÆâÑäˆH·XÊ›LF3³¤:4íSCï|ãSž>¥t<âÛɾÌ멸?–B¡#áØUªv¸üâ“o ÊOv­3O t:]{êmñ§ÓÔZgà‚SIͧrН¨ ù¢©tv ¶¾›Çà;y¼å”'™Âê v´b=Ícß@¢W˜æño „¼]ÝÙ ÈS0²áÎ(hIAkVA•ƈ’î@h½vƒþÐúÈ$æÓ’ÎÔ¤ߎ¸S¦( 瑽rF"ŠJÒS>€‰¦IL¦E9wv<º+¶(üÉŸá£;M[Ø™H‰»£¸OûÀÄûÕÝ êO/Ÿ–üá$~ !g ϳ™Áùï¦Üä•PWQ½zúûZ_aŠöãuÛ‘‡=æ]X"§†{Ó”ÿ¤cC# V¾#=ù·ÖÛ£BÌï¥ÿWn ÊáßL¡áÌŠ¢>móñ+»ègÅvDA/BC` Ç æÖPø0SÃA0™Ã4H¤{§[¶…ØæOm÷—ÁöÂ#Pô(Îôa_oÃZÌÐÏÌ€ßÔªfjß&´w£vŽ+¸viªvé^¾Â¡É˜GRóh*#M`š@#l‡\ »‹o’í|Ìݶµ‡AêÂW ÑÔ숵…"»u¡â£ èªhNÔ PˆfzäP4;›Ç@bG`V»†•îâh)ƒe½ˆÍ,¶ð^áÈ…ónνÛl '?ƒm+6¯ÛV7%öÒ °Ùœmv7¨!Ë2Ðf79vDlvÛ\„ƒ´ÛæAˆøq¶/t#ÆÃ1Žñd1­ÓÅ,嘦,¦VÃØÏÀN`²®BáåãzhœPvê̳”ÛÖbpN‚à ;9´¡–Yeô“1Bøi*"ö â°ýzÄB›•vdZ!9¤ê;Q/ßô‰½ýºð2« δä¨Ä¶[•ÉûO ï?+¼ÿ¼ðþ+Âûoï¿Å½ÏdÝ{4díØcŸ-P¡!hÛûN¬Ì%jVkr',ðàšÝÕÕ—M@•¶À°™çÆ ÛcŸËÝÚá±WsÈï±×p¨Åc¯åÐ2}‡ÎôØë8Tã±Ï×D²AˆÇÖO¢~û‚ 毻ZÊZq‰`[¨±-ÒÙ¤Šœ´Š* ÇM+̳p’[ó‘¹OãÌwcM¥TYè(š€Åçî1£³žÆuº Ÿ„6»ü8f£ÿtù Þ´¦FhÐÆšæI(့}æÊ|>[y^§–òÉ'ògÈŸ[EþùsLäÏ1‘?/Á!îâ pî…R×Q°–9= 6è¸CZra¼Ü{‰úFÄFôÏå x¬ÓHÐC°ª[_ñaXÍ_j´”ƒ6ñÊ&ª8cºÂ1¸¡afÓôš„{ìÉ íRb±Õí›R«BÚÀåd^c°Àà.ÜC¹û ¬9çïÕÍ0:G†™&²Võ²%i%Ô/ñÔ®< Œ€V,L®š%%Uuµu5ågÍ+)«(:'a‘’sO@ûq(*ÀÒU=¯צ2%«À…—ƒD§’‡YºßPºª…_u“ÃZ-‰¦Õ4©9ë:Îd81ú±ó ¼dÀK¼pi«ÁE­×ŽN»í…³9W¤ÑÖ·5Íá”0IÚÂH]nj76àÌo`Ðá˯¯Š°ñæØ m†_;“`õЇÜ%!}ñ¥ãÓ¿gƒâ”*jÞ„UfØÿìv‹u±? þPK¿@.O  PK7A)org/hsqldb/ExpressionArrayAggregate.class­W \[õÿþÉK^4ÐÒ6Z,³†D±c ¶6¥ˆqjEÊyÐØ4¡I¨­ÓÍmÝ­»¯v³ÖnŽM»Iµ”iëŽvº¹ÃnºÛ:w¸{vT÷û½÷H$Ú}>+}ÿãwý÷ÿŸÇ^zða ¢Ä+n¶âM6¬Å›m´¹…Woáá­<¼MÆ>žßn‡ï°cÞÉûxûnï±£7Û‰à½Lu+oo³â}<¿ßŠXñA+>dLJñ}”)?fÅÇùØOð°ßŽø¤ŒOÙ± ·â îqˆeÝÉèÃ<|šù?ÃÊÝňÏÚ±c<|NÆçíðàn÷ØQ‡#ŒþD¸_´ã^Œ3áQ÷1ÿ­Œ»ŸW÷Ûq ,=ÅäŒ)žñ Ûw;wð0-ãKlìí<<ħ<ÌÃq;Nà_fñ_‘ñU;|øš'qŠW_gð£,ñ1ÅáĦp"Ž&½ÃÃqu8˜TÄ6)‹'œí±øpýöÄ®Hh >@ o4ˆ„Õf[B ƃÉX\ ´ýúàî`}$®$ãáè0ãñàÞMÁd°kïÉ­È–$P¢ÞËŒ%r«ºg$®S.[HiÙcÑP8ŽEçQµ³šH‚¨,—†£áäz6—o[ª¼–-4¥f+9¤%"ÍŠÉààŽÍÁ‘®à@D¥àQRd|C`Q8P#CYž4¹jÈ—–a5¸ª]`‰«f¡pJU²=¤&ãáâ©qÍÑÌÐÖ—ƒ“<@ÆÄ"»Õ–XdtgÔ¯©q5:¨&öæ”’ ó“$µ-iöõåAdƒ#áú+hÙN Ó¼­&/JÆ7C1Žisþ«j“˜š­Tgä5u×h0BÌ+\ùÉ·KGGBäêYŸ“[¶#£äƦÜGfœØ9p½:˜l®Y¢Š£b£¤¦¸¥ƒ2ä*lÉä ÓU“7 •íÁD©’˜Ã™ß,Ê6[ht„’‘ÎUЇǩ&kÐ¥à[ئ —‡NlQpüe9)ø6¾£à»xBÁ÷ð}?À<ÉÒ–ÎÏ¥£C”; ~„+x O+ø ~Jjxý~oo¿·­?#ÚüÝ[ú[:;Z¼]£Í­›|Þj$™cÓ“ñs¿À/ü C žÁb¨ Ƈ×õ)ØŽ°‚ë±CƯü¿¨š—PZkàŒò…Ôh2œÜËžøe—‚gñÜ\£3-BÁïñ¼‚ óÿ€‚?âO þŒ«ôððÃþ‚ÀòüþØ ºˆ>ü•â“¿Y1Åßtc«‚¿ã2þ©à_ø·‚YpuÎhhÌiß(8§©i(Ás<ìRðÌ8æg£‚3x‰zgŽrK{ˆCû2uƒ<MÀã”*B(¢@˜d!)Â,,µ¾…ɯYXÊXß1ºs@ëæ?+l²°+¢P(Š(ÅŠX$ nâ;æçÖ\Ų{uU—OK÷Ö«·øû»üÝ­æ(5Z*ûå}y «„j0Ð%U¹r¶¤´šùN ߨ7eŸ€œŒi85®³ê ÄB'ÒÇ·€Þ’ê½±{òÖr®®m‰èל =,Á‘5JiSîjYH­×%ñÔºr\KùÉ—f©£Æã±x}+ܘG©˜vªÆöB—ï•åú ò=ƒêHR÷¾5› l!ù¡]JvhwcyNèw]~ƒÛÕÁú.áׯ2»Â•÷&áÌ `ñ iY®@ÑPÄ3ûÌX9sž%áDwÔ¸›B[èõ²“NÕ}QI¹˜ÍÈẕ;”~ÉØÂ‰öØ€¾. 'Ò£˜ïp¶£Ü•©UÁbÊ¥þ­^Ë^ÿ¦Ö˽ÝíÔc«²´l'Í“z5΋v@M^>Jï9펑)>º^­¹_ùtÍë@%œÈ42žßlQÃEI5‘}Å-Ëy(‡ÌJŠª+7Q®,sÕäèXä8£0””u6á6žå ïCcRH™5{ÿ?Dúæ^<é‹®;ŽP )5©GißЦðö £îv^ŽÔ÷åôÑ"z ïVãÉ®t‘¾ZK÷¥Î„¯lÛœ”É¡LIæ£n9¬R™É»9îCd­kŽ 7ÈPxw˜;JûÙúûìxQÚ7z¾nË%žÕˆçþøŸmÇ9ô{ÎJ¿d-ôÑK ükÚL9m¦„6ÓËD›éYGc}}x®¡Õ˜!Ó|‹»|Â]Z0“û>H0»+&`q;i);Í'as;Í„,wt‚Ã-=k¯©.0ÛQ§t ¥Ù1\ä”R°7»%…Bé:ÂÜiqƒ-¥‡g UpJDZt”t¸–Æ^† ýBȸNFPÆPº¸ž°ƒšÓL/HG4ëT ¸'a¢?àÞi÷:6LbQ;ŸøðA(<›Æ ‰)86Ó®än7Óç×¼TÑw™»Öã¨J¡´tq K.ZõxjyYÃË1\i Ër£=zin´R‚GK—MaùqO Îñ´–BžA¹Œá äœGX¹r¥¿l #¡Ð™i>˜6²£Îag¹¦F©Lª8 GvxÏ>IŒ½ü¬­mY†VÒWkÀšët«tÕVÖé6ÛEuº ÚÖŠ“¨®+-'POîSO…t] Äq “Õͱ©ò,!›Äi”V®!½Ñ s:)9£×’4³§¶Ò) S •M²S> «SžÂJ§ù”i¬êDU“Ùiv?€s Ðã4g±¡`+dDŠ@Ït]¸ØAž’hÞèÖòà!¬ž@µi}¥¶; ?Ï• 'Ñ¢/¡ƒnh’Ø‘ûᆗÚ¨•ŠžŒ)-Ãë=¤+9sSÖºµÑBöY¦pù ´ÑMU^‰AÃ;ƒ}'.˜ç».F†kž3›-eÒ¦ð0ªYpƒ!–î’2‹“Šš]Øg!>E¬õ0Óo§Ff°“¬ÃX_f9ˆ"Í÷–9Â8Og…¥pE“ÕivZ™J|‚ sŽg¹Ašç:Á…×q³”›e¼°œ{Ü[ÁMï¿’{ͼ°Š9^mÃ5Œ^ëÄ\˼­c¶Z؆íN\ìx=vØ1ˆ¼°‘›M*nvÀ¼›-6ÜÊßmâõÍÜ{ #¿•·3Þ6 9àîàA—ƒÈu;0Œ;m¸‹7Ø­bÄ+ð&'îÁµÌX‹c7 <ìµSeÞû˜f¿ƒÄq3÷bÌZÜŽ àænneàzîíuâ ÞÆÀoヾçÞÁ‡'£½Ë·ãܼ›ÞãÀ!|¯ ßǬ¿Ÿg>`ÃÚðC6ü0 å#6ü(í&&ÿ1Í|œ‰~‚çfÙð“6ü” ?mÃÏØð³6üœ ?oÃ;yïaÞŇø‚¿ÈBÞƒ_↔x·Š÷¨¸ÏoÛ¸ù27û¹y‹Š_qÀí¼Ù ÞËÍWy³|æîd.¾Æ kyx7_çÕCÜû7ßd´yÜ»Ÿ›QnPñ0cáfLÅ£ÖåŸñ?f.ÉÍ1'Ç}”TÇf]>_Bo±O:ðA|HÅSl“7©ø° ±á£6|ŒW¿Í«ßaÃ}œwšÎ 8½ý‰ÁÆX,4ˆP¹­µ/¶kÞîøÍ=Ý;æ5ïí…ãñH_´©¯g 7º˜ c}·FzÛC½a¿Kã`¤·¿'Ìc­% ÇšzBñx8Ž0ÇHk }ª- í Çffðˆê¤îHhW´/žˆtÅ[#ñÂt#nO„ðCñÝm¡þþp7ŽÏ€³)‹„vô„;ûö„£´sɶ֛B·„æõ„¢»æ±HtóéÞ»˜ßŽ!k«©/O„¢‰M¡ž°‰e‰`c¨Þ¾˜#ñ˜N½½«o šàIÁÚ%B\ùÔ¥ìÚî Ñ~Ö¸è!xòqcO0Ǻà:9}àŠ\8u$„©Æ-:ŒkDÅß<ŽvÜ4#\»8fP.ŠÃÇ7Ç" $nEP#ñ ¡X¨—ø\‰FKUgôrfj6!˜›úº‰ryuA0Teuáô0@6~Æ·ˆeSµØ«Z \ÁD¨kE'ã“ë"Xªu¸ºê†\€û9—ur†œ^=˜ÅÞ¾x8Ñ8èkLÖŽD8Þo’æâåµ<óE»Â‰öžžÐŽHO$1(º¡¢°4· šÑkªk.Ûçl„ÛØ ‘»”Z õUö„»ëwÜD-£ì”ê\Ï †‹SÌ4ìØž“mf3–ã(âb cºiÜ‘íåÙrÝ` ©·¯ç–°N¸#¼3c…¿ƒYüSVKku¬o q˶ ã¢uEÚZSpIÅ'(¸SF˜œŸ½‰ýakÍV‘‘ Ë®’$â+ú{"]¡Äxb«!×$‰ÎÁ~–ÌÜKJÆà65T_<©–Õyц¤Û Éá{*>EB Ü•ãc6ÅVÿõ­TÀÐÝáx¹‡0æ|´ä5UHtfâi)S×]@ñýÔݹÁ%KYlÀÅDdctOx0Ü-Q–CYë&ws>–‰uòyéFY !ÒÛªÇ[[Z_ÿÿ]cáþžPWX¸xKT¬¯ ÀR_02¶ÔX‰~Ф7ÞÃÖM`v…ö*´irw(n°i+…ÖPí2µPb`ËN6WÄ‹&ñKl D3ž `Æã:#$Îîð^Ýv‹#ñQéWÝ2ŸRì&žŠ"ñ•ƒÑPo¤KN{ɼÖöE¢¹L^;“5¬‰º!žXêJôÅX³—é ùv¥Šß§8ÝŠ(”»ª kƶ¤«G *>­ÁÓð3 ¾kpš›3Ü<ßÖð‡ø# Œ?Ñð§ø ƒâÏh '5xhúpTÃ_òðð} €£Z4|¥AŽiøk|Žì­@ºÐðyüO•ÿÑàeü­†¿Ã4|^Ðà»ð„†/kø{Úÿ€Ôà7@pOÑVø2NÕàwð¨ø' ÿŒ¯høü«/ÂK*þMÃWñï*þCÃâ¿Tü·†ÿÁÿªøš†¯3§¯Áëü^¢P–‚V ì$ !©àY Ïáy¥1Ƚ ¾/ix‘›WÐàŸð/*H¼Ú´±£cSc«†%Ĉ¢(& þ¬˜UÅ¢)VE%€öæ:@±Á3”r|^Ôì½ZºÃÑ• ¬•gTÅ®)Å©)šâÒ”"’ƒ2‰Eð< _q+ŵohŠG)Q•RMñ*“5e 7eŠOS¦R´V¦iJ9>§)J¥”éšRÅ3˜ÖÊ•ª2SSf)³5e7ÕpRUj4ů(wç^4¥V©Ó”¹Êd:ÐÊæU[;©]F~M™““w¬ßܾ±MSæ“i( XT ‹¹x}¿ÈUsƒÍ-ÁuUdò›;ZW´67ÐÀ¾¡±£±­™Ià¡)Ë”åÙ^&òçÊp,B‘LS•šÒ¤pˆÐ”fe•†3ð B…QUYM^¤¬ì;ÙB®0HA¤ç¬.sÛúŽfR©~{Óú퇚Ң¬Õ”uJ+Ù²ÒF.ª2g]VMKª™0Xš`³šÇÆEÔ³°¢¡["»BPuü–D8Æ£ÅY§Ñ+„+ ˆýáXœN=oƒþ% Ñ·¥XF¸r‚ƒd œ\(…!½œœáœCrwlJA •ï‚𜉯©1ᘣ:'ú½Tä;º\…ôë‚~AÝÐ$„G8©xÛÞÒÞÙ¼š[1žý–$Ù1;¤Œê–<¥"í¥k$íQV¨r ¼q…×2ÑE£(}%‘7ü„7&WªÈ”ÈöPwwÊï­}ýºœQã5éWDMÖ¦žñ( c±Œ ÖþÕ6ë28ÙŽÅÈœ›¹%‡õoEž“7ïí ÷'t){s=I\„ô"9·‚©¨ž¸LñŒ¯K¤íîÅIf^#òJ9Mx%y¦IžÌitg_Œê½ðÎxŽÐ Wu+‡¢h7ß>›Æßô”M»ÔæC/ ΗÓ`‚ª¥^RˆîW¶D_*¾Í«nÉGmAk4F¡½ëc!22ýÑHª4çõ'h\#ÜÙ—ÅúâìdÌÞ€£MÆV\ÖCHö­wÜ[“KαX¸‡ÄÔeŒ·.ÒpÚ!)vAÞc]âarg$šöÆÿóCV yµˆnº3³®Eõ¦4Ð&¸xªq×®X˜’„„Z]] ö˜.Ï‹â©SEὉœ7½`ÖbN$ æ`ºÉ]‘¨ÑM³^EÓ7ØÛ5À&M€n’Æ.2ÃTé¶¼ÈE1c’ŒggÄ©”tÅZˆéÍÕÕ½%KtöéÒÜšïÓB§Ší¤Þâñ\”r~—]òŽt) înýRgMQÊDd¢tJ5rÌ"ß˳%¯äDé ÇmpJùÞ2o¢‡Ç¼¬z DÒâ¶êøX Ôâ\©ÌmèëëÑŸdZ|rvžf=è¡G‹ У7,ÓÊ‚üq/3Õ!Á ‘¯4Ï >—ñìèêHrîôôSáõTŽìŒ„»s‚±K–;©ˆlKemý3·àe•æÎ‰ÇñfþY„_’//;ˆ*1W ysMj¹¤+'Ú‰äEçwæEÇ#~¨ÉÁL=.5öôdVHNC—z·ºôŽ—†¸ô+Ôª}ÖeÔZ¢¢Šàw(‡fuq{ò©…SGß­²Šn(ðÜxé œEaÇd§^ÕK%‰²ï‹”´p°¨&þÉG<è¬Ív˜œÊ aI3Ùzù¥eI4|kpxîÍ<¶‹3#:q½j¨m\•7­i¤’¼j|€kÚM1«+‘®Êo¨¾,²"åÖ­Ÿs~[IÅì ³Ä [£JÆ8Š£i^U°håEÅ|Âá%¹¾¼ÿ}&[DºM‰j¶”"ü]ïÏò™A@æQÏìÌ0MšÉbý=üAnpBJãKáßIvIt$èú×J»Çú×&çòËG芥1Ñõ%aN[ öT+°ù¸j椀ôI9ƒšÓPÈŒ$JÆM`=7¸%ÀŒþ1-§RNË ÇXhÍLÉöLÉöL]MEé­ì£þ$ø3¢2ƒR]Lý—áOr‹b¹……qF¥¥ü9ÍqYI-¿ɳ\9*}à¯ð7}Yù'mH:S>á_¹CŠ”ù˳ôK5ôËóÄåyâR ýBFú×)¿¬ŽniýR-ý^ë]Ê´bïóÇ!ððˆRlZ¨ÒΦӠšGÀlZhÓmÜ곌’Þj)ÇÛM ^GÅ~øˆÏîuÔ78}Î3`[½ê0l¥Ð]7s‡a·ßçL¼aØNòœß év»à$,ØâÓŽA}ƒËçrW%á*Ï›’pµè1HÒp³Ï•„k´bïS>í8\û03ƒEÃPìµ nÌ Õ0 9päb‚wæ9}ó†aóZ‡á~ý =‹Ùþ“°dÖé×ñ [—’„¥¦$,kpø§)v¹)íTù}=€R‡Ã)rôEŽ‚Ô˜Å¾žåišk.ES»š©#øÌ§ÌÝ,à/@Ôg&ù¦…îô:}öSûáz»³¾AóiBìKü>Í,DSÏ&Cap)ª‘.Û‚’Ëëò:î…¢åªóC®‹#_¡­†œ$»o 9høiŸå h'aÅ–cÐÔ`ñYü'`%9œÏ’q„-P~v;•óàÂåxœx*¼JÝRþ~:TøÇY°Ÿ ý§žƒÊ9Ø ž+”ÐßdV‰gaòYPt0×kd® ÿÈ$ýã"9t2 K¸¹½î4TøI«XŽô]͉³N¯̇„ÈYö:øš…f¯YÙÓ!ÒKË}ƒvKçáˆ×FÓøO·†óÞ4>uÖª•+êÚÜ$a‹[¥GDd7Ë´¥@õ»íb‰$YgÎdœkÀyæ¨ðïóàÃJÛyð¨ðŸ6þ{‘¬T]0–éï?\mü—Äb±ÙØw_ƒ×¥0‰efºSߺ=%“¶ÚÓY',7pjêÏ4N6K+”{¤cSzL³ZV¡œW 3»_Kgáœdcˆˆs° ‚ê›å–ŒæË­Ë‰­eµ¤)·ïXXì=ÈAÛM¬Î{d½eüõšëI}uÇ¡µ}ÈLFø"W¢ìΙø^ –ª’ `Vá< ¦ò,7„ ð†Î~M F3aH†6æêˆÎª’³·Ëpù7.‡d¸ü¤.qè™în6ß©‡MA“Â&.¥¯‹¾kõ=p“>1„£þÀ1hãÐÓ>ë9ù×ËÁãàzŽ£cÐQoœ ¶Õ§O@§íÔSeùUªTi¨“ã$ll¯KáÒܤ Z[í(¶™–VH1³­–UÔ³¨IØ$ì¥vtÈDÂþM­¤ÀÉöÁÊ=7o5ô·I 7‡·ŒÃž·‡í§ÕSÅçàv´hZéX¤ÂEÙh§\õ°B87jN§þùV’OVæ.øº0tõñO¨R»Iw¤-Œ´–šaôA¦1K[d­öJ­öÊ$¸]âôÊ$¸CZÈ^©½ OhÔ³cÔÓ5*SÏhº èåLå S¦j ¸«);¹k¨ÊXi¨Â$¹§MÔYŒw v¶²ìMœË)}—Æ”ÚFu½ï:“®<’°; •We24ÌÉ”º ¬t„²éºriÕü-¯o/¿w-Ó¨KB¤Áð F†2‡gñžÉ¾QQÕáõ:g•.p\»Š& S)T¼ž³ìƒhF‹ÔÚç¥Ö¢Ì‰{ù1¸I÷üòýà® ~³ðöW Z] ™ ói©Õ{¤V;!»Â¼CúªEjó­Ò7«¤6—ÖyB|¬x¡Î³Gïý²ÎÓýºL}§/OÚæ<+Ú…EÒŽ4f—|6ÃÑl!ŒRÑ—œ•'áCA±ÅÏÓ@ºº"k“¨S–VPˆXFüŽ«Áì3ŸGÀæ3“§4ˆkÔ˜ª‡ØöE.Ô¨ðV COié$šiBX×B?õ’ða ££ÎÈ2Ó,Ù_ª‚ÏzÐpñ«"¡7+æ<ÙÄyðª8i¥¨r§ !N›©‹ÈÅRia³ÒVK;ð°ÀÀQ«'»Ëéô#)ÉeøÑÀ2…· Ѥ']%vH½: +Üb>”1ÖºžŒè–úÑaÖúkC賃7¨búÈÿZGÒ?(³öPÀ/ˆREp¥ñU÷¤¢í–Ú倽¸ ÖçfËñ–¡}l_ªe¶hbõÄ…¸üø)»$|â@žªÕC±Î¢Õ-Gà?ßrküO‰$×;¤÷,ËH¼4#àO ù¾,EÄ=²‚àò×VÔ…Ê”{¼U’²AœKɧkaJúYrŠŒ¬N¾ÒUú•£àO\X–VÕ|)Ê2iÅÒ:ÆÏ ¦R>í„S%v@¾ð9ÜÃ"ö¨gR¸†è¬xæ´4¢ñÑÁ}t¶Ê±B.×ñ+‡«Iæ‡àS[øÖP= ŸÎ¡ È*+qºD}–P¹Ô:Beÿg…Ï’7•Âçîç)îγèùÅ›ØðB‹×¢ßÈ Oÿˆm¹¿ˆþÊ+Ü5ûÀ>i9D§Ï|îB(…/ô~ˆ'šÄâéé/ñt™•6ûüÝ0›> T™‹å’öž;¿vúÐ¥®Ìz¿! Ø‹.ÀÕ*V¡Ó=Ó}즢F:*ÿ2yÎYR»n‘7ù–èõƒ/g‰ÆIAóÊ´A|‘œ€ p¯é!¸íì÷„MÇá+G ø$ÜK±ø«G ÔúØbòŒ·˜=ƒ[,ž¯À}¦ÅSÃ}d–Ëé3µÞ=ù8|½õ0”´‰¡çà~2<Ôv&o ÔšLx ¾Ñ~JÅ*eÃon²ÜSËõ€é<ÔÓ}}¦Š3éFõ°úÆÄЇñAº/ñÿCíAüøþPK¸4#-Ž8PK8A)org/hsqldb/ExpressionColumnAccessor.class¥U[SÛFþÖ—ƒ ¸$¤iš¤ñ…Ä-½¦NS® ÒBokkk”Ȳ#‰Lø5}K_x(3$ö¡íLT§g¥µcÙt¦öx¥Ýïœï\÷øï~ÿÀ4Ä Fp/‰a|>ˆÌÊ·9ù6/—…!,â‹$–°,—’\¾”"+IR[‘º« ¬%pŸáLµaî×-†‰Õ†]+ì9OM½R˜÷ËÕ=QçEºkX†{a2*•ÝfˆÍ7tÁ0Pî¬ip‡a<“]}ÌŸñ‚É­Z¡ìÚ†U#Â1²jŠª»^yLë}^$››F¥P®Ç›*»¼úd77yÅ$)2à—ª ÉöžáY ä,In+b›Û†O6T ¤‘¶…Ó0Ÿ ŸhCü(laU¥¿ËÂqŒ†UìáZ²ûÍbi7èŽy™^W Ç-îdC!MyµyД®Ü>Õ•ÅçM[ËŒÊmssŸâÏôÕí,›_%Ù¤U~¸Jêºpª¶Q!õl_õRß²’þ–õDÝO'¹>ÓSõu[§ëËÜÙóàœá¼ê¦@éˆz7Ó›ôveÿ¿U[4M^^§—,Ÿ;`˜ZíH|)x]æ‘õvÙJ&<†0Cáv´=î´Ù.Ÿ@žÝ¡‚‹§ûÜ$/.fÂLí¼ÎDwþÿ Ù Äé´.ug:¢‰”q]<÷oð¨álYêBè¸Íëžy6l8 ¯UuÌ\a!ïuã}x¿â*îÄvX%e1ʇxø°‚ðüQ&ÿ˜Š <Æ3ìã >ÁZ?¡`ŸTð)æóiÊá3¬çgyuŒŽ+øœŠZôóp‚‡']ø¼ ëíï¿À¸_taˆù‰7_æÕWœMí mM¢Y`Z£‰'‚‘Dg0< ÛÈÓj8´Gߨ½[ïIµ±¾ª]ñ½áÞîª:¨#«B‘Pbµ@syöiÓhLÇCF¤îæÀÛ*:ìF¯.pK–R4ã•ÀïÓð@d³¾Sé‘=.ppi{™›ƒ‘>}]̈Ö5oÏs ‡º«ÖÓ²%O–yÈ‘í‰`ÏžÖ`´#Ø&3\}ºéSòœjU´ìî V…Ip•éë:OQ(ø*E·iû5Í2¸ã`”­¼ãÿZ™åÙŠNÊ_§;#…Ú7µ””g‹nOÄB‘>ý …©Ý«Ç{b¡nR»"§œæÄîÞh8ÔL¯¼"2Zñ´€7穆aœ˜1)ژ攆ТáѰ ›5Œb½†lÑdØNkø&Îhx3Þ¢ag<£áÎk¸€oixÏiø6.’'4\ÂzÏd+4\ÆwæfÉO°Ã«Ö„"ÁØÁµÁDQ¾«áy|OÃ÷qVÃðC ?b]~ÌÛŸà§~†º; /àç ^Ôð Vð%üRïç×8+0'§d¸hø ^Öð[–ÑŠßix…Íÿ=SÍËF9>ÌØ ççÍFh£ìɉ°1ÊÇäáOþŒ§5Ñ­á/ø«À¬É®Z3°“’NÃßðwþA¹ÛÒü@“†2ŽÌçÍ¿4ôaÿžàõT})žd33x»bÆ~3§¼Sî†S‚¤—7sapD¨€P‚ÌÞž'þlåŒ8=blŒ&Bý¡x0!ʼnm”FÔ䦆âÁXÈ©ÆõD[0‘Ðc„¶*wæMÉã©Yà”£?Œ׺d”kk #¬Ùˆ¢P|KĪ ½mÁX°_F6ÌÊâªÇbF¬ª‰GrnÎeä©lÑ\ÀšôèÑ„éŸb2·!>¡'PÈä®_\-(+L¯•¶ä¼® û˜ çñŸj#qat³ø;Ãz¤/±KÚCÝi~.ÉͺÁê÷S¤PMÛÑÙ°¹q}Ãæk›îkØÒÒA„SµiÜEžê!RK--73ÛÔßkñYÓ¼¡asW†SÙTN2b3ÓTž/67"²…P Å'È£þ@žmî‹1½1—1+c•ÒÂrf·<ôf ]kYX0 ãKŒì4b=©QDµžÄ$2±/°ýfÚFžËÌWØ©k‡âM{BtÕz$Ñal‰ì‰û#m1½×ê eh dzΠIeÙ„[Œý“{T:R ³.[`iyŽÔË£x'»IOH±¡ÄÁVó©1Q§ FbÃ@8œ¥ÔÜòæ¼}U`EÞÓë5ß,Ñuxqqjè¶ŒïÜ Ü8`¶ù@¾§YÎî F£z¤w’S­ã©f¨c5^çÔ•0LÈ<‚Һ̜ø€?zó.§7,=O1ë°äI¹»Ÿ>zÐÚE_+6ÐÉFZ5ÀÍÕ~Oõ„ßù FaóÀf ´ód_*'Ge»ö®18Fáô{í£PN’9uL‹Ý"ÚÐ\j± %³£ÙId&àljE° ŠÔ¨ÚV£xtîÊyö*+.a¶µ ,-óÙ}¯3 W­ãˆ"†®½às Kfí4ª°]…M”_!c¿xLöBƒ“·§úÜþÀÔaiߊ@…­ÒF¹Ü í\qÄÓÌ Ãkí´vŽ@ÄJ^uÕ:žå9Pé³›X— Ø‡`·%%™3°4‰é>ÇsõN}Îóià0y§ ØG:íÃa9›tC™ñ* —hg3}×P§‚­ ÞhÍì ºlS°~׈2’#IlTð¦+äÁï>Ó3Ž‹ä °¿˜òŒý¤mu™ur.#³¦›‹€?‰GläõWì«S&¿d.’ð B-òž?¢ó–ÓÝ\Ž Ø~ÜòÎê²A<™vëÌBÉåIä#ð^¡ôñf=%ã†ì"…¥Ç€¥ôiÖ¼J2pÏiPšÄì£w‘ì[³€>’=‡$tœ…β«±ÓŒ” 6Ó¨¹fhÈõ ~ sGQb®¥æ³Lœ)VX,–˜ë4Róá>…²!8M^CX–%æ6s0?}tÉÔ)§léµ[¤×.Òg³|µÐòÑQrãVšÏeéuë ÚR7[œö½„ßÅt–§÷˜©„= HÝo̯=‰ùC¸`yw¢é‹s‰ 8Ç™“JÊ‚!A‰Îåq?_åe¸è&î¶:Ýi¬l1/ƒV­ã¨¥>^·¡’Âe•g~÷¯N­¶VRŸZµ5l•æù½™óTÙ¯g¼J ˜DC¦Ï@ö:t=ò×KZÑ¿]KË=Ö‹£ÅÔRõæaÍpZ'Ê e~Í;%àˆšÏ+‹¥P™I¬•› ¢§Á6ý5‘PqŤ?Õ–àëm2üÒtË¥ÔâfäßGÁÈ0r®mÝð?PKuÇyç \PK7A"org/hsqldb/ExpressionLogical.classÍ< tTÇ‘Õ=æF_B$Ä ,f›CF€0Â:°$°Ûx[ÒÈ£Œãø ‰s:¾[ø@±c”µÙX`b‚7X;—7›x7Žcg“õ®Ííæ2[ÕÝÿ˜ÑH@ÞÛ÷V¨û÷Q]]U]]UÝÿ‹×>zéTó'}Í.Ï‚c¬< ưŠ,ØÊ‚TªÌ‚GXˆ²0U§é¬ÊYlºÎfP½Ú‡ÙL*]áeWúØ,6; 1]A-s¨4‡JsiHÎæô|j^@Í )»Š²E”ÕR¶˜YBpK ®šªu”-ó±«ÙrÊê ne×è¬Á—³Ë  ‘5Qµ™²•^v­—µxY+ÕÚ¼l•—­ö²ë¼ìz/[ãek}l»ÁËnô²›¼l½—Ýìe/Û@Ðí^ÖáC D½l#=7yÙf/‹yÙ-^v«—uzY——uÓ|q/ë¡Éo£JÂËzu–¤úm%ú+]wŸ?Þײmq;eÛ)»ƒ²Qv'e§AwùPÌ7PõnªÞ“Åîe÷e±O°$ØOÒš|ŠÈ¹Ÿ@>MÙg(û,Žz?OÕ/È”}Ñ=ìA*=DÙÔ=¢³G©ùKTù2e‘$'}:ÛID?AÍORi•žÒÙÓ„}eý>öö”=Þ¥!_%¨ç|l7 j¿–ÅþŽ=O_ lO6û{öu½H {}ði¶Jû Ç?­(;HÙ u"D‡©zDg/‘4ŽR唽¬³côü&‘tœ _!€¤¶W¨ú-û'ömªž ÒÉlöÏìUÊ^ó±ï°ïRÛ÷²Ù÷Ù¨ô:Íô/üCªþkf?Êf?foÈ¿Qöï”ý„ÚÞ$¸ŸÒoQégÄóÛT}‡ª?§ì-ý‡±_èì—>8–RöŸÔó®ýûo½GÏ÷iÔ¯h›ý!þµgÑt?ùÊ~ëYô lbÛoîIƺb½‘d,ÞÍ€­e`Äz¯ÝéNÆ6Æ¢ |±Þ¶h¢+ÖéÄJ"Ò½)Z›HD¶3(^×OlªÚÜ{[gdžªêYIÄ":£óxæÇºcÉ… ´òúŠÕøXïˆRm-ÕrZ“‘ö[#=mŽWü¾Ä`nùðHëGè"¤3RÆÖÝÞ“ˆöö"_ó†i¦1Õåõ—:-ƒúK7 ÅÃâ¢Þ’®–Ä;·tu·¶oŽvED÷¨Þh²î¶-‘ÎXr{£±«œÚGwG·5Å“M[:;—Ä»;brg'¢ŠÌí ñM±öH'®gn¤»Ãnïepõ¥J{˜vT†x"sQ¤££!º1)yí]OÔvvÖv£Ê]5‚v8{:cªšÑD´£¾;¹<Ò»¹5šâò¡¸Z·lhÛÞƒ’òlÂʵ Ê+n‰lTu"ʪÖd"Ö½ õ±Ag¿càíˆö¶'bp@EÊü­Šƒú ƒq!CñέQš ™š–qèJö{c(P j5š{Òº–Ä»zP½´È…í›I2mñ–ø6)ªŠƒÍbZc~T¥ö[±É‰aL{¼{k4‘\IFÛb]цX2š Pw)\ ÇÜZ´÷¸Êi4ã„‘UaZ¹úE'§UÍOQ}ˆv¶=Þ›\iOÆäd/Dqº7_JV̰ª;’Ø.½Aº—¿02•oãRNÅ€Àë;ß7à{˜±ÓìŒÁβsûˆ78PÆ8GïœQ° bá.$5#ˆÁ5î6àmxÇà®#CüªÎ½Ïâ>ƒgÃk70Cº~†N$oL0o<‡ç|Ë£,Ÿ2?e£yÁ ù‚û‰Á‹øXƒø8¼„¨)åã >ë|^CeO÷^‹·lÜMð¼oð2>Ñà“ødÊ.cÀë[Q›šÛ0–kZÕÐ`ð)ð>ZÛ¥õ­mõMK¨yYKs#:×UMõ×®ªÃBÝõ؇£øÂ˜Í_€^•蛊£Êê[ËW¶OÄNWm®on¡yš¸kÛ–,§™/GàÕµ «êÊ”¼œW0È •µ­Y)‚Dƒ»îÚUµèÍs®n©«m«kY¯êºªc©µ±¶¡J9ªdÂd!fÙÛ¼º®¥¡ve«Á+yMGY$±i}'F$ ÖðkøÁÃÔnˆöDlÓfì`0.ãš «eÀoáw©IrUU"”&¯Eš4Í€P)áO¸FðÊþ¿3à´dUpÖ€•²ŠO7ø 6­°Á«ùL_að+iÝgñÙŸÃ缆5à4a8GãÎ`Æç‘̧Eÿ+|hðÂò« ¾ˆ×|1U—P¶”EW›‘—æ"³ÎàËðjšä»BeùòÔM ™|ñz¾Âà×ЀŽj1Ö¶u··G{’b»4ñfƒ¯äÍ:¿Vç-oåm_ÅWü:~=w¬(Öðµ:_gðø¿ âë¹®ó› áR÷«¤£iK׆hBJù#ÞnðŽtmä› ¾™Ç æbšÁ<”¹1ã·´nåó1 wíGcð.d‡eÓ` ½^ÏE]ÜàÝÎïBßeð»ù=¿—߇¾ÌàŸà; þI¤‡ )cË1øýü>ƒÙf0øgh;–ÎàŸ§ì ”=À¿h0?Š‹f+dc þ )ÉCTïà¶wjÙôý¸ üaÒ€ 5 6KnîŠ&c(ÅGP9ù£üKhï þe>6umSŒ°ÁãlC+ÒÇwyOì26Å`SÙô„é(¥IJ”Á$úžh¢ý{ÕJùŒv'[Ѹ£;+suG¶Æ6E°½ ãÛz a…;òõ©ïŒ4’ôžTÑÅ(L¨ÁF:N Ä·a ‘ùT¢Ž$è'£]=ÉíêDâ_¿¸¹¹¡®ßø†!š¬TyL"Ɉ<É …U@Z[ áÑ£?÷²Ú†VìÍÚJqFû”N¦°xüHÇrŠÀÝÝxöĨaìºaƒ O¼GËêS%M$p‰ê(§cÓ–î$9Tuž‡®œÁ_‹7ÍNä§h«{SgT:i:£yJk”Gc”y7>"bt~FÒㆧX‰`qXŽÙ&ŽÚ(ïTlÎ8µGÁûê®_Ù²^I»hxE Å8nØsúZNKìJë0œD‘æasZlWR^1üº¥î•ŒGf\×vT\žÉå]E‚¬StŽ §;½]¦+‡¿cÈpLöDzz¢‡ÊG^hgh2.M–ŒÐëMÆMCRXžá$µVܺŒ€ÀoÇæ×6˜¨¦fB•‰)IS¤+jÌÆ:Ýh4‰ š@ùð'ƒ‘" Z\>ÌÆ›Îß‹ç* ì{“‘nó°›‘ßÕB­Wu«srÇÊH"Ò¥,ȆH/ sN´T5#A£34Ó­zîîñD»y¿áŽÊ [JbÎÇ>²q«k[–,¯mY¿´nYíªŒˆ²¹d3ÒØž”Ž[ž¡æmJjitS"¥c'6Ùg¤«ñ-=#bI Û¡]JKº,ïJßaÉ’nä“JGè|kŸüÖý­WNÜï{¬×SÜX¯y÷"Ƥ6\‡nxm¼;:’¥X-½V„)äÑW›¶¤¼~8K-îgÉœ/UîeˆYOq0£Ð4:—ŠÎ~(º¶¸¬¬Í$6´0ÑÄÆH{4ÓMÊp¢Ëà–¼¤LK1¶Çxeè8§ÀH¸­¾±®µ­¶qeªk: 5šQýmõ²« Ö‹»-ÖAÈûÚ~4u?‚ª(wºpR‘EÕ¥h™ô¼I920ì] ªS¯yjfíJ†YT'‚†íDTâ€L¡jLIQ GÈå„#ñ‹+ã½ÊQf·;]ؤ ã@Å¢m¹%‘Àhì\}F¸ê‚¼Vyº£8}ôÂöÞAöÃ=e‡¹ËpH@ Ž[מw_üÕ`ff.4óe`v²ÑAgŒl|ÁæzŒØm[¢*XB{‡½…%UÞ 1)1èê*•Á¼¿ýµ^\%aŒGàìcÊ3]Œ"”.BØæ²63{t#¬¶YAª nS‘ZGu”¨æõÂÇy‘¬ˆì७î0KIv>á<ß̹0ÝOFHµŽkÞ$ö9í5*‰SŒ?-ŽŒo#XrÀâÈPXžY¹G!ÄÊD¬+’Ø®¶ù¸TD޳ùÀX_KôÊIãÜÈÃI?ãÝùÅpë­£ãräØ Kâhq:±Þ!óe¨‰ŠeÖ‚*á‰C…w£ÅÅ 3Eòh§Ì¬CÞQÓÑÎh¢T$³yWˆ$…Qä¥%бp´»=*œ¼ØÕæ=ÁÐPöÍ€¸ºíìD©§_)¯éJy˜÷wÖË» ôãá¤7v™d\§3ÛŠÕækle ü™ ž¨VÀDÙ az^/Í¿£žßUÏïÁ÷1¯Âôxü –Ê€ã?€‚`ñ!`ÁýÀ‚ ÚApï“ïÞú‡ úz=%¨ ÷AÖ~ð €g?èÁ»O¼·ÿWÌ'?ãëð#<¶êðãó„GÔ0ÿ±oˆYþMÍÒ†\èø\Ì«°§9 Yk*K¯ÆMÅp¡FeOÐý2d#x WÀÝJO-ài BÎ>þ]Í0\øe‘2C ªJ‰)”ÑO¢!ùžñ9ñ„$ž0=rŸ§ÑwbªÀ´Sw†”P0wª²³~§£žHƒ’”€‘¯úG†¼oÚë2´óð(h´:¼‰¿®,¯àð§ŠÃÙÈ¡Ÿ•)z†áÐp´V[Lo)$‡”¼JA¢¥#É}af*-®Rbš®ž³Õs.=3°Eãóªú¡Pà«>ùî~ðÌ/º¦÷£’«®Ñ}²§À–E¸ÏÃrp)YdyÇ?SL,E²ˆ‰9Á¼é¸ -=…GaÌš¼ªÐ!(jT šbyÞ‘qŽ%€÷œ$ß)+®ƒ0VÈ•šŸ—#Ûµ´B+•hÚi¥™ˆ·€àºBÉ`œÄEX` µ§ô— @‡5Rq o'¨¨uÐ0MÕiš™2ÌaK;ô3°Òoøùhô#²ŸÃ(1OB1Óc¤ƒ(ÁkDq:÷ AxáðK¿Õ“lÒìàIpWî­Ä<¸w?”¢öß 9XªÄRèXÚ¬ÜMÝߌ .Ô„½M:¸=îÑ.bÿO û,…}‚»Ku7¸Sòfî;oJÞju¦Ú¸4àE´ïÁûæ“vÎõ­£pùš¼E‡ ¼–V£±‡ b¯¤õ0…²Ó¾*·µV=Ãæ&Ëúk»mÿØnL/aBÇÄ~é/܇ÏõØßƒeÜìü:9ÆL| ö?,Ëì.L“±íLH?ÿ1¦±¯Ó5–â’Y˜[iÉS:•yeƒò‡­Ò4«T…¥ëPm¦ïµqÔôCó…q̰JÕfÉ£©1s¥=_Èn HWìá‘ÇÚœ¨†™f×uìÕv…£í‰fÁPÔþ+1KŸnaæg;+e¬¿ ˳û PvÎ1;À/[æf˜JZ3"ßóFì?bï‚‹ëÍgo ‘aò’Ég• sѳ:ÀÓ°|¤¨YÛüJ(= E:üê,ëð?‹Ðí…mX:KÎÀš‚yãGËŸq¹Z)þLž4yZØ‹và×ðiøa4lhÚø',»ÐÎó‘&¹ÈŠ•<ya©Y;4´W¿Wf­”ô"drdýÿmB;ÄîÀ´Ó˜Çô & ªÙL{0 f÷¦?bzÓ ˜ŽgJaÿU¸L(7&ï ,¢E ûkUã , CLѨ°0²',Lîž=á4cm‡ýKdé°©,íûëd鎰™,õ„ýWËÒÆ°¹,ÝK-a±¹°´<,TK Ãé†f‚aaa°TvKcÂþzYrDkƒ°âLû¯\HÞ*K´›¡A´äÝHZƒ`¬ÉÓ2€…Sôz2ƒÔkvügX^05:Ëü¡’wêTý-üNj±ëŸP‡É»mCüSû`åï‡FY{šû Öì)“ áíÇ8G’Ž”®tô…kט Öâo=m¡E¹}ôøâYZ}reA .ýç¶§äï:vIž¬ÿM¬F%ó¬%ÄJvíÞÚ¶S-Õ ¬k Ÿ ÐPGŹ¡|¼ëƒpãÛæÇnQê6üÕéÏÎ4ñDÇÄxB¶‘xîógǤCaá ‰jnꃲʰþÜŒýù…GC䛲s?l@esRÕ/ Ç£ý&0Æ~-ðq'üDKu¡½ÏäÖ¤Lƒ½'L,r§Mˆy>›Š+Õ1€á3bˆ@=7À¨ÌÒy0é ¬§0¶ä4¸Ï°Ñ¼À;å,ŒÕá÷§ÁÃÏÂUšRÌËyIvÁ¸Éžqž,®s/¸0OVpãUÚ9N†G9–R¶Û5G»bm”¹,-'‰¯o99ÏÏ ì‚|ÛNú äeA<’ÝàWUç9:N@6Ë>ðŽ-*ò{J=ÈÁ-›ôxȳºî­çÒØgr·i¡ÉϦYZ©ö,djƒJ µ]4ç7íjßìsÈDî, …*Lt§P–-Žœ":9âp0Òð!þfŠn€ÍV7–w±×ƒ•ÎéA¬<ìˆCoÙ™ª}°Ü¹G^J™ÀÂ>·ö±„¨V¦Ñ{:[Øj¨9…v)4s —5…TÀÊ4™‰)àh×Å“ G‡'v9@‡Å9”NØ4×8@»ûàJG5î˜.~š'Ñwz”<·!Çܹy»`‰(Lë§‹ÃÙl‰)V¨7U콂‰§S·dn¿©oÒŠ‰cmrX…"Z“†€ìž½W§ÂxÖ9˜À˜á-+-+-òÌ(Í›‰¿ðßXä)y&Lûøëè}3îp:z×âbÓt,µ£½&/@Hk\²…-­²ˆÍ[Ífp´´„m69n`g`9bÿ“e÷>@«A—gÿìš_l²µ ã—¬Jqu£É"–›B'í[±mÅáu­28QÛ2ß­km @hoÖÊ1œ"ËP‹:|ÄÃR æZçßb[¨&žÛÑAœî` -´™ €÷,pvjtø3þtOþ)X~ZܬüÅÀýêBö&S¿ S¿´}i2Y0¬L„ö凄ÖùÂ)Ú&È:j“U?ò;žÓâÒè¯ð¡"jŸ<%ÁçBæ¾Ae6+¹¡-ÜКÀíÚ#aâ}TK=l“ ·÷ÁŠ0uWb}»l»ã –B¦é­¨Ñ¨¼îÜ ¥áýðqä]‰M¨íqíAÒÃM)N Ðs Xv§¦ë¹V+}+TTVg JPÿÂ)aÏe×Sm—˶]2$×/=Ʋ²¿dî1»ï„û,J• J,±z9"'rKT8>`û*y§Š¶M¥ãš•6ümV)I¤F h'!Ïš¨´Z¶˜Æ- 9<Æ6"í\ꊕ´VÞ‘â w¿-ðq}æ²`IAÎDyG[…†"»äLÂÞs¦øÁ¯®i="“ï }I¯b‡¥uwM Ú·©Ô3"ÕÍÄ SëÿW‰…/Žß“9±k0}ÓŸ°^“†û!L'1mÀô,¦§0=–)¡L¼{1ÄùÄØåO’6|êÜÏ¡1Dw'îãði¹PÖ-.ZÅÏ ÂgÕÍ ¹N:^aÚÍŸSîŠM•Ö…î¶°¥‡áó{éEÀDþ€È¿h#xÐr/VêK™!vPpiD§¬³èQ¬ `O¶‡ÄñP7©Õ̾&ë¬*ú”Ûv³½™°x,,ž!XÁã{éÞÎß%.Úró®'Zm–; ‹~ ´&K´Ôø¬ýW“ÈÆ–Ê@VÀ'$KÂÑY;¼h€Qr&ëh½p§æô¿|| Ó¯€^à<,a†K4&¥Þ5\J_.wIa¸Ö¾Œ­Ogl}"cëS[/°Î pÙ9ÈeŒ}¹:<†¿¬’ûªè¾zäêz.úzàbšRÿ§Pù=øÜê0œ!©‡agŸ¹,¾ÜŠPŽ-¯ JŸéV[¡´·5îýäC7nzÛ‰× ¯gæ°Ó`¦ÁèAvœˆúk<Ïø <ŠRéƒðl*_hYÎÿT°Ö%g¿\'Õç Gò |µ2 …ŽÀsÔ¸n1#Iu§å‘•¬&(Y-ÀTl&š‰!q×¥¶zÙjèæ°#b$ø &Ÿ…Ѩ•ô5€++[ìÕ‰A>£ƒjµÐØ7‚.ï)¡¦b+Ÿ"÷W§3ýBé ·Î嬀 ¸ sʱ“wÎÂ$ æó´™tø‘βȚîÑŸ#ª­¶@µ—¥GCr­v§8èXËÕœþvQ¡ºRù× {K¡o±Îî÷6…±i@nÓ¯Q0/¿áôwˆêC†Mˆ€^¥|%Lý4?zmþUF:èuÍÊqÍÊ-Ì¥øÿùg ¨0'à-Ì=/p¸gVÎŽ\Ôâw)æ¡•øj§ÍDÂÛÈ Ðn³ô‡ö9íS´|ÃèsP} SðT¼J—ô€®´WªcNŸ#è—~~ö¸zF©êß»Ô`Ôt—YÂø²H‰²È×] »}ä3Ÿ­1H³²iOäRÉ Ò([séC²  Qb˜6bêÄÇ4‰ ä¢Fî„\*޲Í3Ò*zð¬MEÙSÂ#±ƒÄåŠßQô;À %9SrNV¼I¦²/(á”IMq—[ðV9øMqÓNiYÐUýÛäY©ä‰G&qø#Ë0…¬¼Ǹ˜µªÚy(ƒQÖÓY®ÎFá&ÍÃc}(I(œ†ÒR¯ï<Ô[‰›Ö„Åóåyt‡™ À†):ÙÆt}àð@:Ë7ÁÖ@ÞH`ô+cŠ´)°(tMeèSÑ J\_~2°™@Ï@½°*®±âqš.•®‹¤ 3¿u)y <ÂH<'ªzhûì•ý°"˜7ã äªïÉÒ/²Á„Ù˜W}P^ÈÊ~Ù-¯\*[ìØI $åÐTÐà ìU‡1X‘ݲl_[èàò¶ª×hV xy9¡È‰îÕÅ÷š@wÜÒÎÀT‚©ÓBËFïÛi^²P¥OT JöØ}Ö PÖ÷Ó»WÙ²ÇâùÊ®EŒ—b:GŸ›‹è޲Q§’Çå7§,jo>ñYY…"þg±wS“èŸô³(3ëf‡>‰,pÒ«éË6Ç7Uýàü:L 8ZÒljwyÍæ’ýƒ0ñȳóˆTeUJÂ"G‹DèîÝÁÑ%½*‘ö‰/ ¦ä]¹Ëyô¤¡3‹û€ŒËícûÔ@GŽq®M*ÏÁ ZnZ›A1?Ûk[+˜óKáæ€+E>†.¼fb”ÁòËYî–E«TÄÆ*uZ§>]TŸïºµ=rº0Ã"Bs´“°KúMŽÃ¡A8ÜGÝõpƒ+»h<ÖÖDuÀÄDÓ!w¹Ã—©Dçpzi}PÛ“Žò27Ñ>ÎÚÖßVïΫ˜obݪ4¬S/ÐA`¦ˆàUö_JêÊ Ï€Ëó‚˜O̫ļ8/„ya^Íü´×èômg®\ÆÆ!›>ä¸ÿÍ¡W)707ýp/¶³uhY†|Ò÷—²&V£N ®Yº­æeý“7q–N‘1,¶Û'R{™jÚ+…ð>‚p¼Y#`€ õô–ƒœ~×½ã|¹`]¡Q¬AS°ÛQ—Ðê4—´³<Žþ&{‹uÜI™Is̤Ù3ÍwÔ%tpèLšc&Íœ‰®@$oÖ§°Y’”/«É¢@?pެ)ÔÞ€v^¢ †¾ë;Jc®*ôôA¹¶ï—µ€·Õ´ÛGìHþÂê²ÐÌ·ÆšÍαšc¬ß9ŽÕl}Ÿ…çq3xM7÷¦ü¥ÿBŠ ò=Õ%‹Xi³qîœ:ì8‚•N˯ÈE$ã-1KḚ̂}>mng«êØkðQ„c+³ò&+Ù |£èc‚ÈÃË/ñƒà¢ÈÏ5t+ï²M‘—¾Ã¯³‰Ø0‰MV~áóèŒÑK³›~a%Ø7DÇéýGZ¢þƒ2‰r|š‰|Iú3sRV–èÅðø¸2¬fµýÅÐxEœBÄö|v®6V+€o=þ$¼ˆ¹¨utÀ„oSñI󢬅:‰@=È“ˆåMHq'[òíFé’ûÉ[ YóH“{Åä6ð$s¼ø¦Ç,ÚÆh¬ö¢µã û $'\æ›:]$ŸÏw¼äŸ/cSÔ"wâÂÓýQ““ê2'Õ£ÓägÉ«)œNp>Àí¤ÃWð”áü®Zšyª5ówÕÌ{sW8çžîœ{²\,dõÀNhO#dÅ€ýõŸ5RsŽt©‘ikŽ#ÇX‚—ÄÇŠŠÜÇvfîìéøXQa󿣻ìù®¹þ±Ùÿ PK3ZL #ÊXPK7Aorg/hsqldb/ExpressionOp.class•8 @Tוç̼™73<`ÅøfF"ZcD€¨c`0|D@%²DeVqüY#ŸhxLmˆ†G‡#­ê S#ýjáäm•j%JêîXtt¤Öß³À†õUï¡iS(ž¨í®\p AÑ¥bË(ë>ˆ}+÷˨¤ÓHìŠÆÈgj畼Uœ•ûÖF–Þ ’ +²#LØÒwTíOý(c®Œy2æÓÍ¢û$£“®QÛÚÖãÚ\Q¹_1,@pg•ZA*X„na1YÀxEd\¬` .Q°—“v –ã ïB7i³Àµ"vðaW2ÅU¸ZÁ5¸VO§¬ÀJ«ÐC‘žõ°f×ËDAX47pêG)Pôá:«ñnº„ަ&×c‚p#šü÷7òüC|CëÚÚLum n‚Ǽ'û´±sOc€B¼e×®¶FB±ìjloØÃo+‘Z[:ÛèÕhêbŒÒÔÒPG·Aj÷77Ò«»%@/Ûþº¦ŽÆòmåvoy{×>ž+¸™Iu­» nÑP˜€¿­½\ÓpFÁ{q BNy06ÔVÛz¬e¢b¡¡# ƒÁ“ |>¡àVxZÁm¸]Áûp‡‚uX¯`îTà)Þhd¿ìâa7îQÐÏÖßËËû‘¬ÓŒ[pBé¼$PŠc'wA÷á ¶b›Œí v E¦©§žÒ‰àœë F_«àìbŒn F{𠌇<Œ½ >ÈBÑ-cŸ‚ý8€°l÷†#ÁX°?¡Æøº(¨â ‚CxdaAÞ†<ŠÇd +8Œ£ ŽàqJ“i1ë£Ñ°¤a\ÁŽR☂Ƶeóèû#$ÆX0,8œÀ“ÙÈNj{hXHáÃ2>¢àGðQÃ*ø8Í £™÷-n©HÍ¿Þlæ† ‹;ް8#½5D#ñD,Špª’*üœ:,*Bñ¹˜™y<:"XSXPº&O‹eñîaCÅ¢±êF9?ŽF¤¾¾\Oes^n7æªVýD¿:’ÒX‚áP0.ã)ªïm¡á‘°“4Š?Qc á`<Îú¬5 Çš±šƒ‘à[•>džâF¯t†Gº£UK~ݤ0k&*µ%Þ Ó;ŸÒ­ñÂÊ ¿¿r¾9ŒHÄI¦sŸH“-sÝœ%Y(è'ýT¹Û£±;[Š×¢o0دÖÎOõ Vîy˜ÞŠ;?Oá“Ë]E”xŸ¥Þ³` ’­ˆÛÇ8c³ (®³IãêFÆÔ©NÔÅ1„5YDÌJÞQ#”7J+æ#ˆZ0Wå,A8½@÷âNu«¤vÿl‰hR:¶GVrÍNn¢ ÐBhŽ“3î™B˜­œ¸ª+®&êâÚ F’å=¯?i6Ù‹ÏíùŒÞ¡Øµ¨âž•UdF'ßãʉ©#aŠÁøŽZÏ9Ýe)ù§×hol¥bÕ»§¥£µ·½¥·Ùèh§Êµ|¾ŒÆlIä…â Š Y9ïˆè­ÐÀ>Jò¤k3©oiij¬£Ú»l>Q=cë4sT’±m´OÌÅ3ŠB!“Û_×Ú°§®µwg㮺Ž&*ÓåóÉfœ#ÂNrTÝÐPLâû­ÑÚ½î¤kθêJ(ž®TÃa52” ‚Vþþ·¾r¯hëO&8ýI•=õ”Õç´ªu±XðdG"¦´GÆ =¤jÿàÎРÖASÍX›åzù³æ kEO}7{?'ei´o*GrEOƒ_«1yq!­ž((Z²¨¢oÙ’7‰TŒ[t?iLDc¤èꌺ Ž…†xG´òI<"š«Üë76§_ûpðGÔwÝž%aÎu£1a%wEv›HlTþ ü€9šýgöÅõ´±ûƒØ»·»;«DnCiþ- Gû8'3É,qšÚ¦‹0—¢9: ©d¤•ótÌA¢ƒ+n‹D®¥EïXâœê*ngÜY7èÛ³ÿˆÚ¬A àöÛ~™i_ãµ™ü8bÚˆàp0›ù“¾½•;õ¦y]$_õøh0çØÉršÒõ}·êvÕ›mÆÍK›J…s .b6µÈÊw/wG8ÒE×sß7þìWÀøq§›£VkÅk‚bœ‹ÄîÆÖÞ»3ͤe-6r’¥„°¨tÍçîKåâ½õ2ž¦tpG]_¦Œsð`ä‚ (}r+N³zè«” 'hö ˜A¢÷±ªÒK€U–ï€é"˜«.€Ùìmã—äã—ô"á4Ðc¥g5=÷ÒÓNÏzêëCú»W?ÈïsUÞ `¹Ösð=—|l¯hâœ¤Ñ æ[p$B¦?Ú4ùÑå«&ùÌô^Yåìa%ƒ€ž¶*/®ò\ûEpœñ3‡± dV—1ŠerÆÁæì™‹ó ÑbØP¾&N½¥+Ò«à»ô”ÓÓ•Áò äv9zðäiÖ1×x4í,UÕèå_' 5 _¾Óƒ‡æ<šáÏ\ôÃsÐkß½wº’rƒÑnÂ+Á¶Ïz‹&+ûÂdÅ[P &ræšÍ›×­³…Çtïì Øáèñx¦¡@š€¥Þ*OÕ4¸hY8 E+àîòy/Á¢)ÖßC³â©73à š~ÔL»D,šW`q—sÇ%(ibe^þ(B©Ið2,iÖ ÒWXJ‚zœ"»NÖØÔéñ:DO=O 7c\×W…ËѦÇëÛD¤ôX]K§hf½f´­ywʦ<ÎòiXæZ> åÚ¬ÓãMN}i˜@ZÁ€ŠL$×]i,¦; + @'*5Ð4¬J²X=ç´7É€™±!`ÞX®SX“EÈNß <¯ï¯Mï»*4¾,º¸*S²W Q5ø$t´ò¤ð…g®Q(¸ÒL'Áçq¥hºÖèh<;á©©‘ –*(˜…RžØA¡8 nN‰ÙšÙósVm«,\~özËmC§áŒž΂…~c©˜ øœæhÞ$¹¥¥/€Ó'$8-áä­·’¹îmz,z ­§g =§ôX:¨ÇÒŒC?ñ¹ªIzC|°.>×Ý:pÖkVÈ—ŽW5¸ß—4SÂçÚBÛÈ[š´ZÜ¿+ùŒÙ-Õx–JNÇ G5%¾¯sZ‘öv6&ù>\Â_Ó°i†(»îI ÅIÄHÿ޶YC»7…&eAóeø®”›PD¾ÃëàÚXµf iV)­ÈY³†P>Oêéäaº¶|{Ø ”N¬%–©¤CŠtg°Á Ì›¬æM²[Ö âÑì!S¸Q‚[¬/<Þ²©Äâ&½·l±œ–É0¯½”Ty ç™fÁ„‹Š®“¯‘ÿµ¨g¢7©Î‘÷M/&¹ÓO±A€¢I¨0o/ÓÙkﲚÈNµ§ÍÄðõôyÓ!½¶1&=’ZD5uëõ¤]o >ø†ž~!²þ|Ò´¤JøFÕä|«4aápЉÅŸVÑEÚ6‰?¨Ü"•H3°ˆƒ¢Dš†íÏ‚£ÀýÒe¸ïŸvVk‡´¨¡"ÂïÒ‹°Ã;ƒÏy«È·u“ø™g§mÏ$Q'ñ¡”xטê+L5)Øñ¤`´—/æç¡žËTNõØ= { ÀƦ' Þ‘:0 “KAk’Ù^I²5׫|¯¡È/§çÝ-TV Ø©bù ªŸÙàŸËpÂ$œIr$³íœ„±Iˆ „ð.`³¾ñÙ qÙJ› VÊ´`òÄ"ý„1]¦«x ”-¦¸F\Ja}ZLÕòMX¥õW¿Rù.,v•߀€µª¸8ß*›JÝ¥n‡åSTEð›)ø© ãkìÓÎU5{Ùχ& F“]”(¥×Šé4ì‡|1?{ÈþA%þ¡ljÜò8”œ¶a‰Õí8í@ ÞN'&¡W¢âÃèÒÀ´ä>!8о³÷,äŠÙê XÆ$6g%±”·É£ÆíÓv*£ º ­W¡þ¶X¯@KW‰Õ| Ú§Œ¶è0Úb½Ñ[LÃ~é,3‹&-Ñ©[‰„eaKl\À;ÞßS–ظ%t Ybc‡°Äè`ÕÝŽKÐ5EŸ,Ý´þà ÿ¡—à° š½£L’+ÝùÃi£4{5{¤RéUè œÕ¼GJOî›§}¯}‘$™§!8•{ú¾—¯Þ@£o‹%#zu<ŠP¯}¹ _ûÎð¤q ò5‹;<0•úlÔ€Ö úÈCE>nIðA­ó{ÛCÍçám†Æ¡Øéô/Ž£)Sp 6Ât“=<µNZ6Ñ• í8vŸay r娙I(4˜6LùwX³¬õ*DÒq‘ôqÆž†èÔüüjnÀIÙïÁJ¤\õ«³PBcÁuoA ähŸ¥ŸÖvdh£?¤ú-,\’£XEJ¢ˆO©üùNÉðkô7‡‚¢û~šº?Ç,,—á™›°M†ÏHï@u±Äù&¬%.Ÿ}ïÁÚ—ásø._œ Ÿ¿…³PL~zf¾«ŸÉs¶HïB5ƒ¿¿¡w¾´Ö`­ö‚^þn>#çá8};‹EL,.AÞ7!.þÕ¸ŒFWz|ËÀþKPK|‰2èû%PK7A"org/hsqldb/ExpressionOrderBy.classV[W[Eþ&÷„¥\J©€„ˆ¢Ö -!µh…PªÕ!““ôœ‚—å‹¢.Ÿ|é‹íZvéRÞúà¯ñÙåmOÎII$°šµÎÞ3ûÛ—ofÏÌÊïÿüü€I|‚ Wýx3ˆ¼¤ÉÛrTïH1%®Iñ®Ó!¼‡÷¥ßu‰^aÉf‘ â>èM?æBˆàÃ>’:-Å|µÄ-,ÊLK! Ȱ,áÛ!J¶"Í«~|Ì ¨æ¬0sBÏ«z­3´¨ffWÓÌ47-ß5UW­i†žhºd[æ=-¿‘Hí— ašjIŸ]að$KyÁ6…UŸÎ• IJ«V—×]—X  ¬®íRp´¡@¶–=½Í÷xBãz!±°±-rÖå¢Ú%mO,”…É0Ñ4òºá¬Ås;ó¼¼Ì74*í#ÙÅ4CG´¾^Ö2hS´ÍD4Oë2Ô òmZn®I¤‚!¬1t6e¢`w|‚O\ÁK ¥ø‚ $ÜŨŸ)ø\Ár~äiÜTPÀ¶š‚"téQb¸ðÿê3»››Â¢ Þ…¥ÙÔ’‚2îIa0¸fÖ˜ØõcOÁ2Í«˜T°IjÎl*›Tp _â+¯ã †¾¦ËX0ò˜9“{ëÕé(PS.Þ9£ Á\IÓ¸EJZïeÉ~&’5”\ÛUó¶ît;‹¼H+­‹†Q2))©´°õ%bRŸö&©Ô~N”¤<·¸<; ]§ËK`ª±i'C«j&·ˆHΆmé9{ ~:Z^$·€¤a•9]FRã¦)·j$zŠ®ô›ç:/c¨6§ƒø5ÃàsxÊ›hqK…îœ>œ ‰èÜió¹;çãå2]n†±h³ÈæGâz£ÉsP/×TNûʪŲ&lÆ#çmɉ#…?—#P½ª.ËËžÛE¾¸K…7U‘Ï6nVÀ*Ù é1$ç´Ø´2Õ÷­»±Q ‡ºçlt½èÅ}.yÕ«£ÁªÒ7„a0¼L£ÜU¿ÁXÛÝÇ`1ϯpÁ;„ÛÏÆâ‡ðÁgGð<‚ýAÔ ŽP(#í‹‘“¯†_Á¨ƒ·“–¸—Òù~ràâuá®jxïüµðÁ¦á~;œÉ×Ê»œð–*ÙÉx‡Ž½fŽSžÖç&qœÆ*Úà B÷jï<~‚–ã˜m;„r„0½OÑO*\Á ߣ£="qo­‡h{‚öãGÕ*¯ôÀÕ?AczÉœŠ?8;úí/ˆ¬=Æ‹éx¤£‚ζ .Dºj£ÕZÁ‹OÑ69D7y¬>@{¼Æ²GlJ]ñj¬Ã¥‚^òÝG« Eú¤‰¶âÒÃg[àù Ó~¼î‰_zX¦9šyIÏ:L3ã± úã”âòIâa÷UO§§ïG´ÛÄ¿ó°ÿþ1^­Ô’–ñ†ra¸ÿÆ•c"ÒBFÕiõ ì` Ýô'a‚ÿPK}‡;ÓU¨PK7A org/hsqldb/ExpressionTable.classWy|Çþ­´’<`Y °‰Íá¤A’­ÜÔIí°N…Ë‚ÓÀÚZŒ@–ÄjepÚ$=h“i“ô4½RÚÆmÓæ¶€PŽ^I“6½’ÞI›ÞGz¤í? ?޾Ù]Û’-øáys¼kÞûÞÛÑS;  ÿuc V£W }bˆ9¡:±[F¿21ìC\ðî³}b–pÑ0àF ’N¤ÜHc¿ Í /2B‹.†¬ƒ8 ã  ‹0äÆx£ oÂ].Ú¾KˆÞ-ãAßì¢á-bx«{›;äÆÛñÁz¯÷á.Z¾Ë‰w Sï;÷;ñ^7q¿Opß/ã!ú ØyH ï^~@H}ÐáÃbøˆ†Ëp•ñ1A?.ã‚ñ“.<ŒOÉ8â&úiŸ‘ñY9žéVz*ÛÁàNi±xRIÄõ!ÇMñd\_ÍPíï §´þ†=™ý‰XoCÇÁ´¦f2ñT²eG`+ƒÔžŠ‘¼£_Õ£[ üð^ePiH(Éþ†¨®Å“ý- s£ºÒ·o£’¶ì9cj¦O‹÷Ò4àÏ×µ”wQC9càd>•T»‡Òj†áº¢Ò%<»ÈÓ.5“Mè +‹ ò75ƒµÁ” ‹” ñÔ­J"[Ò÷@Ožï›z÷ª}BÒI’–ØšË:­‹Û5ˆ;¶Š)ó—ð¼kM<™Q5Ót¦3©§¢ÙÞýYU²RÑrYgÒª–‰gô†Í&U“zTOiªÎ S»¡Ë4!ã#Ä>'ãóDÂàc«¦)C“Œ_àhÇ£mhåø"¾Ä±­ öîÖ¶pê¶H¤#ÚͰp&Ú²»w«Ç—ñ1ŒrtâVŽ1¬çc#ÇQ|•c„êM]ë:#­áÎîí2rÇpœ¡rV¨)§"Ú'ðÇI|ãNË8Ãq_§(æIÜ’Möé$|gr0µOq|ß”ñ-ŽoãqOp|Or<%ðM+Çwñ=ާ…ŸßÇ8~ˆqüÏPø8žÅO8~ŠŸÉø9Ç/ðKŽ_á9†òi,çx¿æø ¶Ð=§Ï8^Àoæ!Çïð{ŽmØÊ±S lâøþH)ãøþÌñLpü£Üq¼ˆ¿3ÌË»ʼnãøga 7é8ا¦uÃ|ºeü‹ã%<Àà™éÇ¿ñ†ÅEkÔ¥¯èa¡Ñ‚Òd¸&ï(© Æû©ð7ªê‘É5ƒw6Øj/vjm=EëZòwŠB°'©RCª,Õ. ÏJ:­&c WùÛg·7ÓÄVïŸÝú^ÝIm숮ªèŠ@âÝ„`3W^N¨FãiS2ª¹YUh»0¬ÔŸv¶†Ã;»·o:±îŒtw¬ï袆6[.’èU5KÚ‘J›&X'®¿ †Ö^þ»Y²Ež “êÉÊmó_‘ä+˜ËoZ~¯¨ÎgßRxÚRض̔Ÿùª®o©µøK›žä•80%Q{%ü\Ë&õø€jUÛªâU6½Õe±çÕ™kòQAeS6 è„tzÀeD(ž#ñ¦ŸÞbÍ•œNõµW–*#ñŒßi–AFÞ£d"êAÝ<1g>ñ§‘×à8ЮôíQcæ.íÅß%³ÄwнUòu‰ÔÄ“1õ yͰâ²ïb3•Œø4¡ÞœJ%¨¼Õ´>d°šœxÓ‹ª¿àùJ{j?õj,§wûúe2‡þè¥ñ¯Í eô׎u`è Y-q؈. z– Ú&0'X7[°šfc†Ã-X?ÅOeJtnpÒ0^û¨×1j0m Ñæ†$žHÿÝ´²½ã$äížµÇàŒ„<î\ÛlM’Oª>OȳL¬IläÒK¦ZoÈkÏÁmŒ <äuL-CÄb³5ÖUçPF›ÛB9ðiæAº€2^ÇÎÁë+£]z¤™¾0Õô…­²­®JNAkÇŒ0-ç ƒWøžözŽ£âLpêü,¼9ÌŸÀÚñå(¤DÌóX4ŽÊªÆ±xW¥ HcÓ^,7&ª Ý'½¡Ûðä9Óâ\Ó¡]#p³ÕÁšS¨!kF -M7]`®|’©pIÔÜ£Kz¬ÙQ,}DX9cY‘?cZ1X eG±,j]dl*¼µ(?9¬úì+n<Æ–Ñ̳Ž]@c×;i1Ÿ8é¥g¥ÿ6‚—Dt iZþ¨&ú± BKèÏU]µëãêˆÈ­o×äðª \­À“ÞÇá?3倄9•54ߌ-–‰v2!PÊ3±l¦ ÒIV†Âà,…¢$ºµÞnù¼:O᪅¤ªÎr¼> q‡Î"dk ±Àa«<Å2BçŒâ¡'«e©‚¨pÝNÊ®5-QȶZÇ!*'Q›‹Ì¢àÁºúch˘¬Ë¿ƒÇNš¶M‰>D{.¢¬bÉaU$4ŽÆf©JÊáÕMvA®FPÐ×4;ê몶h’è'È Í2-å¸Ñ†Ø›#—ž#½MÔPÚðZËæJHQ)ãõ2¶³KÀ)c‡Œ·[›taoÑ;^IÚ9åߋ䟓èQj§Š(„ë-ð’ÏÍTúßl¯²?çQ´4ÛC>©Ê5û ‰ØšD솛š¶&Ù' µ¤É'7ÒÌ[å -š“¨Ôd?$“àó>ûa8Fpƒ yâ1¼ðIÒ®ã¸9Z*†Ñ§£¾î à2v±ó¸š.û2ÊDm\D¹¸:[JÅ ûþ‡àÿPK› ÔÆ&PK7A org/hsqldb/ExpressionValue.classT[OQþN»½²…R[PA-Џ-­T@Ë«VK¹E}Ú–«e»nïþƒ‰ñAª‘b4ÑG£¿Æg/sº+¬‰MvæœÝù¾™ùæœ~ýùþ#€~ÌyB·‡ÌY‚èáæ777¢^ô"æFÜ‹óH¸pÁ‹&tsÓçF?÷ݸă.óÍ_ º0äÂçpA-£ 1)óPÞ”EY]KÌä*y#™)ék‰åÇÅ•\ÂØÖ”rbl2²Ä L•V†æ5ÅÈn‹r®P,Û v)2Éà›7äü£iY[sE sRØü\†!(EÒÌzA]K2¸W”r^/ä(4"5fWÊåBIM¦-`Ô)!‰yI.nrÌù¯wË Y2X„ŠhÃUI ‹áfc"Æ1!bS¤Nv1“qᚈ®3´¤¶4Ýd«Õê 7‘fh;ØÕäÆêª¢‹¸…ÛÔÜÒDf1 ó=©ç‰…îΚ/¦qBD–›Ì2o(ü@6†åG*SJóYz•uÍØžÐu™xô~Æ2šäq¨4ó2Ÿ–lÈ\E†öÈKµnòÜ×(’!`%¶³¤™,ýw…h™/©›Šn,”èø˜ 1ôXUËcÕÖÀªèzIO¤¸eõ Õ(¬+õmŸ”> od¼SßÊ+šaŠá”5MQW:¤©ÃÉÍ1&\+ æá>~Ÿäue¯U·QÚ[úö¥0¥¹guXÓª¡è«r^Iþÿm>‰.úg ÿœô´¡t0hu6ØÉ·G…]°èØv`Æv D{wàx]ƒ0Ãñ: ›<#…ã3\ öWµ ²ØšÆyD'NÔYJÁƒ„p¾¬"Z˜OÐdr\Z |W…»ÒŠ/Ï;x?5pÛzš à$NÕ¹ŸRñòÚ4ÝõïBÌÆýÞ*|Ëö!$t>ƒ?îóý½øõm¯„á†ü­ñ@s- ¹i·øë/«h­½¨"`QT3„ºfßò¾ºpº^ÝÕÊÅ=ÍibÏá5;usW‰õrg&8RÙç`khÝE£1YZÉÛxû5˜©ßoPKê^üR,LPK7Aorg/hsqldb/FunctionCustom.classͽ |TÅõ8>÷Îܽw77Én6›ÂSPBBx©Aƒ"yÂB^d  Æ…,a5ÉB²QÐâøQðÕ´¶jŒPñQ©¶ÕV«Õj­¶µU[[[[+/ù3sïÝ»›MÔößïçï—™9çÌÌ™33gΜ3wÓïË_=¹Ÿ2]Yî$NùF—t—|B[Tùfaò-ˆÜêè6„nWå;\Prò˜mÅVÛº ³í.ùnù„v`¶3Þó^ÌîÃì~M~@“Ôäï"Ö£ÉßÓäïkòCšü—üCùaU~D•uɽòcN¹O~ÜEÆÊ»4y7"ý8ÚUÞ‹]Ÿp‘<ùI¤ìÃì)—ü´¼ß%?#ÀìYDŸsÊÏË/`ö#D_tBÅA¬ý±Зö2B?Áì§Xû3Ì^I‘_•®É¿Ðä×4ùuUþ%¶|ÃEfËobË_9å·ä·]ýZ“ßÁºw]¤Vþ Ö½‡Ùo1{_•?H!UPÈïTù÷.Ò,ÿ'ö!VÿÑ)ÿIþ'ò±*â"ò6#ÿÙóü ¢Ÿ"ôW„þ†sÿÌE¶ÈwB“¨òçÈ럪ü/vÌÜö2Á&_ „ÿF–_r:!ô#JÒKgcå!¬<ŒÐ„Ž"t ¡¯:%F/¢‰J.*Sj’(’˜‰é(Ç— UîÀLu‘ëä¿»¨FÈÌ…Y ¬ Õ‘–ŠNrMÃÆé‚“´àr¤»UêQi¬(õ‚ÐL`E}˜e©4&ŽÈš+I‡!9G¥Ã±u.®Ñßá"·Ó‘.”ßDŽ£¢ºJGã`cT:qi'=³•ŽsÌvŽ=ÒP^  ã‘õ‰˜ä¢hf1ËWi‹N¢….ò0Œ¬§¸èT: ÑéŒNAñNuÑ":³Ó0;³bÌfbvfgb6 ³³°Çl„Ji©JËRÈs´ÜE6Ó Ì*]t‹—dœ;:Ñ*å¸ñέÚEkh­‹ÖјÕcÀ¬kQÌ…*]”BÞ ‹1kB™—¨t©‹¼-ß=³s݆ìÏŬ³óTt‘è2œÿr¤´`Óf+@Ëh«‹®¤aÌÎwÑ h›K~ž¶#ÔYÄEWÑÕ ê´ÓE»h³nœë…˜]¤Ò5.òOùŸ(æZæb½„~G¥ëTz©‹¦—9å^z¹J¯p‘c(Ú1z¥²«0["mÀVWá¡ÁÐÈif×`v-Žr½ Ö ÛmÆõ»^¥7¸¤Tz#ÖÝ„­¶`v3h3½ÝŠèm¸5·›ª>e»éwb¶³m˜Ý…Ùvät·Ù–!vÒw˜$ÙEwÒ{‘tŸFïG^àÙù[>ˆäïbÖƒè÷ú>Îú!þ@£?D‰Öè#}'ø0.|¯FÓhŸF×è.îvÑ~ºG£{ô ú$îÑ>>…åÓݯÑg4z±g5úœFŸ×è ý‘F_ÔèAþX£/iôeþD£?ÕèÏ4úŠF_ÕèÏ5ú ¾¦Ñ×5úK¾¡Ñ75ú+¾¥Ñ·5úk¾£Ñw5ú¾§Ñßjô}~ Ñßiô÷ýƒF?Ôè5ú'~¤Ñ5ú ªÊŸ5ú~ªÑ¿jôoýL£×è?4ú¹Fÿ©Ñiô þ[£_jôFkôˆFjô˜F¿ÂÞÇ5F4&iLÖÕÓ˜¢1‡ÆTisjÌ¥±éKÕXšÆÒ5æÖ˜º² y5–©1bY*ËÆKnÜSl@,G"9‘U¡Ž9‘îU5Ýí¡ÎðòÊîŽåÑp¤£K"Þ¥Uç/ Ni v´N D;í3%2Ìê!H¶íªò`4ÔnÙ*mýÖvECí¶*gecMYsIYm@"’_"©e@Ž;¢ ƒmÝ! š4G"iF£mM³¿©s%âÔ@™ß¿Å,à¯AÂ<‹ÐP ó­>@˜Ž”*‰¤pJ©Hœqµ9œ ÕÔ6 µÆÖР՚܀T[”:[£Å‚´À”¡ln 'Ô›mÊjkÊJ8#˜¹fˆ7Äp^ßhJTVßT×Ð<¿¢ © a­8µfSZ¨@â"‰ŒŒ#6ûµU%|ݪ*VTa£ÅɈoTSRÍ»7I$+¾¦Á_]±¤¶†×.‘ˆ/¾vaE}XcåR›8Í%å|-ÏŽ#K‘xŽDt‹h4<×Þ°Ü_Y‰ÄfsíÊKšøÂœgõ¬˜S_QÁiA‰¸Í_2§¦6Ðà/ãôeI7è••õ5e|ËÍæV,†]+Y„Ä“è/¯¨ið7ðõ IÄ#ˆ’ƆڲÚêj?ߎÉ4*,m«D²ºz˜[mMU“}{VJdÄ Õ•þ*1¡°¹±6Š€¹Ìç›kRUQÉ¥¹ÀTŽªÚ’òfä‚Ô6S˪jKÓ#ÞñV¦WÕΙ6)‹}] ïµÊjÒPï¯FÊj‰¨œRÇO]'Ø Öü|1JêëKø v™ÛU_›SÃg5¨7Ž[·¹ö° µ°+H¼ÐdZ_1§bq]suICÙ\±<™JhTR@´š9X¹F"¹I+cB­5—¡¾¢®Bœ¿‹-9+êªJ„ž\£¡’sÚw̵¨÷Ï™Ë{®³(µb:—šjÇ)Õ%süeH¾Ìš¶±®—[=Íu½ÂœX LCy ¹Ú_^ct¥¹ Š¨Ë± ]eŽhh‰±ÝëMU³ÈµuClHÑÆ~Ú¯6EøçpÕÛhš%ün2—(€Sw%Lm}CLÆkÍÙêŒõ½ÎܱEHÚlñk ”z½9¦aÁo0µ% 4”T×!õFó¨ZTìÜdZ:«Â´-[Lµ³OùfS‚†ZË^ßb£™RÝjIQÛ\ÓX]ZÁ[ÞfIQ/ÞípŠ Pú€q‹Á7Ô×òm¸ÃÜ\{½ØÅ;ͲWüK¸[ÍUm¨‡)Û¬Y!Åö.s#Óíæx5þÅñ¢Þ ¶mywW4Ò^jín vâM]+pRU¤³uÊÊ®Õm-˦´…—MñwDç‡Öú‹zn°k%´!CôçT«wJhM´3¸<X ¬® F£¡N0?9ÂË莆ۦt†ZCk¦Ô‰*`äé]TÆy™î‚D óº%þ‰vÑ̶UÀƒ•EZÀ§¢Áå€$ Áem!æ{¸Ë6EÁåù'Â%—Ž3Âáè,Ñb!ï¯w…¢%­à8uDÁÐåæ-µKQ±fUg¨« :Ïœµ¯55¹Åª`úyéz}¸™™go0šØ=´Úe燖GgNHRÙpˆÇ!rVY.ÄÛ*¡²‘@cäÉFA8 ±"„ *­2ˆ—Bìƒ-ÙX•€tz)D"*3Ù"m†Ö® ÁŒ''jÐEÀç 6–¦{z–71™‹©vEº;ZB`ɳ’ìõÄ¥e LÀ¢.›È!XC_²fà jg,o3væM\¨Ë r£ÎNd'éòB\ª¬äJ£ËËäå:›Àòt6³|–‡®òÀÆB7uy‘ô Î Ø$ìyƒÎ ̦¨lªÎ¦Éçél:;Yg§ ¯S1+ÂlrUÁ©‡C z…·jᲩ*iÒÙiX¯™þ,¾Ý´BÇ44GqB©ìt3XN_Òý@w=ë›ÊÎÐÙ™lè‰ÎÎb³a^¬œó1:+eeº’Á´Ig8º²= à –³ ìY©Ë­òJ]Ëçƒ^él›«2¿ÎæÉ›t6³*V Jª³V«³:̰jÕãªjÀmd uÆ—z1ƒõY‚ÐRv¶ÊÎÑÙ¹ \EV½° ”C­^Î|ð©£g5Šº‹¦+Ôya°-Zéhx%¨³óX3Š Ð2éA•ÁZXÉ0Yeúäé“aE[ÙJ…Ùù:»€µé¬³éAŒo‡¨Š,|# Ì_ZLC«"­:[œ:‘S‹ª¬[gÒu:»™H0´s,éì ®­ wEu¶†­ÕÙÅì}‡­ÃìR]Æ.×Ù°UìJv•ÎÖ3¸Ùݱ1!¼[êÔÙÕ¸N£ÈŠÁ„\í«„ÄÙ&\‰ktv-»Ng›e×3Ðìº ¡-ÝŒÐ-ÝŠÐml“Ên×ÙìNmEò6ܼ»ØvÝͶ«ìí@awâÜïË}ŸÎîgèìAö]õ`Óï18#Èh•h|âæ&N¼Î¾/oÖÙCì:û!{Xg°‡Á(`#V™èìQÖ«³ÇXŸ¹=üÂqtö8Û¥³Ý¬_g{Pؽ(“}qK*Ö,­Â#§³'Øöx[W±¤;qámB—GºáÂxRgûØS˜=­²ý:{†ÐÙ³8èsle²”†;‚k‘­Êž×Ù ìGÈæEÄcôc½Ä^ÖÙOØOuö3öŠÎ^e?×Ù/Øk*{]g¿doèìMÌ~…Ù[˜½Ù¯1{³w1û fï±ßêì}öÎ~‡ó8¿²6SÉÏþ ³aKÙÙŸTö‘Î>FÃfŸàžüY—¯‘¯E1ÿ¢³Oñtýëþ¦²Ïtöwö}Îþ©³!ôfÿ†ƒ­¿L6h©5è‡ìNô°ÎްWÀž'êDi÷ЍõGÙ1}…–æ¸BtEC¢HŠœì$”­ ¢—bh´¢ºÂ¤U ‘¢êЦ8uy±Ü7¤®¸”]Ñ•T¸+u% Õ=¬¤ëŠ Å#oR• ]ñ*™ºâS²T%[W†)9º2\ÉÕ•Øf¤2 <‘˜àh˜ZAfe4ZeŒ2VU€ñ8e|ƒŒq·Ç›q1n)„ø'‚¥PNR&@Lj¿©#Ñ’Ž–@[x9´ÉƒËN™ÈÆéJ>fÊ$])T&ëòUòz]™‚bLU¦éÊt8ÐÊÉ 3¬Â)º|¼9žkì¨]…mNÕ•"œá ìwX&åt°ØrX)Ö•™-SÎЕ3•Yº‚WŒ2ξR‚P©c–ãÀÈ R™£+s•2ptůÌÓ•ù ˜y‚«t¥Z©Ñ•Z¥NW(õº‚÷…‚÷…ÒˆóvˆX.¯<]Þ(CÄ"M‚4”B·Lö×À½QY_ êÍÊ+ÀW©i¬ª‚KƒU•Te‘®,fÐÒY_»\öÆ 5éÊe©®œ­œ#”Tøk›P·Î…^¥•uÐZ+›3oþ‚Àbð%åµ°ÍÊyP·6„`Yn‡@\itDáxË--à´!(•WÎVFºy›0pnwtGÁØÉ]àm9ºø]…u€¥´‡ÛÚÂ&‰–”¢Äâ áë1Á@ü¥ º‹Ç, ðÇ*AXŒ€ZVᯂØðþƒ?¢/,€C Ý*«j±5­ªÃoÖ9Ó¦V] ,å:𶔺ÚEÈΈõA‚z1 „!R‰ÄP‡1%ô¢ÔÔ ¬™‘‹.ívâðyyˆÇ@lñjìbÏ:ÐÉ|Ìþš@²SªÊJ¸‘• ¨ 5sæ"]¸ZšùÞuâ)…(5FÞXŽ™ã…‡°ÐI®@hÄté^W-k¬/ç‡:i0’ù¦…ËZÒ„om(ISme5 ““#‹**æ›pSΖͭmÄIWûk‘§b¶ç¥`DkjaÚê‚Æ’ú܇x>{h¾#À"—UX¯ ÐÖˆn¿’áhºtN@3ߣp)+ñ0@}#,©.Ýõã¿I^ ˜%¨,‹³n¥‘H[(ÎgÆÀÀ!îzæ-Þy5®T~ýçM£SN „ÛWµá-ªŒt¶¡“¼´3вìAbË$5ÕÁèò•!Û·äO\ÙÂ9Ç2æuú!m–WŽÚè·¡%ÒÎr¡£åqo¼øtZ4HFž}L¤ÍÛY z ÜÚ^^숖†ñc_6ú¡`’û#1†[ü*lžpõG#¥k£!ãrtäÍ›7#UGÞÒÒ%(6ÌËeŽJà$–­L¨ ºƒ:ðãíÅ ’-+ÇæÇ•St<6ØÀì¹´4éŽz¡gYwg'xV¶3;.oI2¯%ñØ‚6ðpkP÷Q¤š‡,¸\•r¾oAˆ2±ˆâ“åU”ÃNàjí á”(o¤´EZñA jêƒà‡a,›j8P ‘%¡ÎÈ b «ŠLG¹œë wUE wMÇÝ½Ì Nú<ÎKX8À/nÅù9–CLW_‘Ë`}c­h®þõ9Ü‚_®ë"aŒO}yeI9ÌóiÌÔ¼¥e~h¸Kâ[x&gÇlå”Òpkyhy¸=؆¾¨é™'TÍŒD ÚοëÓ K 4tu‹vD¢B©9*£¦k0wBع<,Þz°žßc†^Q¼4Æ}í¢ã@™Ë̳Õ™Zcî˜#¸jUEœ”ìx ‰OB}Mj# ^’1þä„›²Ëhž…ïBÉ6kη5æóæ-Y’Ü]nk3ìßâ2ç”<°M6uè vB”Ú‰qíð$Ÿâ­¥àHr²_ØÍfâ8ÔvóUíd{OÔõ@huw¨cy(Iã).Ö¿ ç·±7¶"Œ»«´âoKãã³U0·pWtJYçÚUQü]º-¡‹æ‡`Õò¾ÑÅ+ň…o8,É/+y þ ¦3—~-«ìŒ´Wòµ,ùf$y2¾Í´—Æ1ž’t“ýŒ6“?¤Ä=6ÅòçÌCpR2ã™LÙø‹ÙÂ’zãÈíè>KÕ÷¢ù9I/Eq¿¦E#uë†ZL™‹“פ%I瑱<ÒÖâ/ ¥Á.ÃßtOÍSãß°b†^0rxéˆGϲH[w{¾2D:£å¡®å`Џh©H¨énkë· hÐÒ½ª-ŒN¤q¬¿n½­aÈI"¥ßô`Ü xm{×\^QYÒXÕ`ìhimmU~Ÿ•D•Äi4‚ŽÜ±^Cm³ù\øø #7o€—_[ÓâjyÐLxV5†hí4‡p'F’ÆœÊ!æª.©‚K"²J´ÌKºŠI×]éZÄãæÈó‹g67:KñÇh<Ô%;Á /»^›0±eωÞjjmü¥¼¶±´ªÂˆ Ký5%õMÍÓŠ’¾RÇüJó„ò-ÆÖžpWÅÆîRãTJZÁÁjÅh‹“¦¶Mƒ?`ù m2D³&†ÅvGwlòUŠ“95Ž^Xɺ˜ë‰olâåÒúár‚¯”ðµÜŒ4K«jK^cÓÞ°l°†e±†)á.›^სS?‡°Ù”ix’ÜàÖE챿ãoߺÄó'ÆŒ¿iõܱû´*"tT­¨™Så̵½lµ3y`Ò^Rgã>)o`›¤Xð}Üp“Ûºü­à IŽ%à®ê6?œ-!c‰“0ü‘?ÉÁ/½åà'T^Þg”÷ór¸ô€ô ‘¤ïâ_I=€φð‡løÿ¡ ðGlø£€÷ÚðÇï³á¾Ë†ï¼ß†ï|¯ ð'mø>ÀŸ²áO¾ß†?øþ,àÏÙðçÁ†ÿðmøAÀlÃ_üeþÀjÃø+6üUÀnÃøk6üuÀiÃßüMþ+Àß²áoþkþàïÚðßþž ÿ-àïÛðÿ ÿ=à°áþGþ'À?²áþ‰ ÿ3à±áŸþWþ7À?³áü6üsÀÿiÃÿø6ü߀iÃ~؆ü¨ ?øW6ü8.“.ƒ1ƒ,†SÀ™ WwØpp͆;wÙðÀuž xš OÜmÃ=€gØp/à™6Üx– Ï|˜ Ï|¸ Ï|„  ø(>ð16|,à'Øðq€·á'~’ Ÿxž Ÿx¾ /|’ /|² ŸøT> ðé6üdÀO±á§^dÃg~š ?ðb>ð3lø™€Ï²ág>Û†—^jÃË/·á€WÚð9€Ïµá~ÀçÙðù€WÙðjÀklx-àu6|àõ6<@†á/¥†¿“æ´EPåb¹ J8å%òR"Égö¢—6ö)Wî'ò™#äDï#4†)Roî ç=R¡í£P®†×å-P^ å­F¹Ë ?a”Ïô ü=(7Cù[ƒþ¾Q~n”‡°Ý>šFì!J¯ ÔöÇn¢ÆQ4ƒâDŠ«f„{ôN2•KKÈ$œ5ü{ Ê\(_ƒòÄB¹c7Ié!®B4  ÚNr)ïÑ Éíî…òt(Êû¡\åP¡|Ê2(ByA¡G¾›ó+h?‡¦t‡Nh‡F´“CãV˜ eá.¢87Ñ {¥$Ÿù(’q”dKŽ#dµæñ%ùª|®Ó1ËÉÿc)°‰ÍòybÉDØD Ê ØÄá¸mò¢²Âè-~ ‘ݳÁ_‘ƒÉºÑ¯é&ãÏêE7G¡æ¹ü=$5¦–ßGÒsû‰{›Ñ}7ñä>„; Ü…Œ Ý Ëõo›‰–Åãÿ«D–ÿߌõŸ$ùzHW¥™î°¥ë“ÀövW%I¿7Ò§BÍöôªXÚ5H_¨WÎm,ùŒ½ÃzºÃ¨Û’DÖ;D[“nò±ï=—É>žmÞôýظæØÈƒÁ1doÄä‹[ /l‹‰žŽ Ô2c7ñöÐáerÈ CŽ|·ó)gõÐŒ…MÌC36)êXØäà°ê¡ó6iÊÂ&·ƒ“Ý*§»5e ‘ƒü‚ÉK~2Ÿ"€zÿk®À+‹C-ùÙ`LÙå†üŒav¼“¿‹¤‰Û˜ì†ÄŒû`¿ZøuJFCÚi ¤¹êÓdLõ$Z@§&±¹£@¼ª‡¬´šVà˜(P& …²Hö‘±M0^Ê^rB·‡ŒGTt>Ù1x¤eœØGNâ¨"ºäì!b ¤ejî°qSm•W³ôÃ,q6'Ûf™oÌn’¹ä5¹ÇCíD:s6}Éï…{³ vÑ3"óÁb‡åóÛœ_úY¾³-¿G‰oºí"]/p3%âÿ«„ãü_õŸ¤”ÀèŸ.j=À_£ >_j!iESê¢~$ð’½.˜Ûuþ%üY m&D«‚´:6†v;´_u{qÃ~¸¯÷/«!= éÀƒòì+.]>Ö«€ŸoȪ‚vÌÚ_Î>p©f´Ä’û%è*À³í9ùýXLüiºL\¨ô,¨w¿Û`~ÙÀû ô¥±¶àÐW-(Û:pà–@ûi„8Á1p~ éQâÓNH‹ñœp‰¦,„ôx~Á¤=dRoA?)ì'“r –S·g™ÖC}d:NN$€{{ÊZ?95ž¶‹í%3°<Í(OßEŠcàÌ'Ègœ tB9ŒdDÆ™½³z3΂X`vŒQ²ö¨T`»H™ÀúHù^R1 ‰#%£š³—ÌÅ‘üF9Ï(ço@`~€T³vc¡öþ¯Œð&ý¤éϒڭđடÔí% °sý.€Ü0½—1›´ÿ>’1ÉǦs&ë™ÔsüÓ}¤±iYXÌ`ˆbE؉~²¨Ø‘ã(˜Ä¦OBlñ]†W]¤5G:‹4Ÿº•¤ø´{HZ©óiÛ‰£‡ÌÍa9J?iZ”〆 ·9 rì'Kм{ŽÓÞû.ìáÓîÆÞ®g±Òs|;Nbi±–£õÂX/'0â2Ob}äl”K˜2Îöœ€z9÷iî'ç1hÀÁº(Â,V} ¶NºVè) ûºMV1å“Þ„ôh“i2¤yÎÏR2ɲö.^®ÞTZÜR¬áîe¹|z޶‡„Š0þŠ5Ç™£Á${±i«Ñ¥uõ¦ŒðÊoÒ«œ_¬e)9Ú^rÁÀº6³®}`]‡YX·Ê¬[=H]&é R5ûvR—I. R¿FÔ¯M^oÝþñ›;pÅÞ)|;ƒÅ¡K»È%ýä;[IfYÚÔG.í'—ñvB)âë±z‡Ð5 :€ÀM0âü1¤?ˆkNg@:ÒÙ¸5*H¯ä8¤~rù2÷²¶ 4çsEó+7÷«zoÛjk›n³5Çú[§~²^Ôµ Q×1Dݪo]jÐ.ê£CôM^j`ô]3hߨŽS¾ãÌÚñ@±Î3ߺ%½ß ÑlÄ«aJö‘«ûÈFcÅš+2ɦvWp¸Y½îÖ"f¶GvýäÚ­¤¡ä:¡7ûÙd´àE’eŽÍ5oó^r=šÏíÄíñí7I7pÇÒ}éNâCG§û`Ì{Hª…Ü„F×6*bRŒ38,™i¸@ùMî>!æƒëÍ`,ã)·$¬Ü·3ó0]3,àVü¶äöb%Gœ¦Í9l/¹£×¾(ØÊêÕOîLÊ–_D›c,¶"Ç~²m†ƒi(²‡Ü¾“¤g9,Ûêlâx» ß]½bÂÍ+ÅZ"ÛJªmlߊÞk°‰‰Æ|¹»Ït¼œ—õƒ Ø8€jʤŽ‹>²£ ^§€¾³ØCâ”îÍqô“û6±¸åÞG€cüàÒcXªƒ$i°0ßCâ$Êï&s(sGMég0Þ8 vìûv'í% ýÁ ‹΀SôpS–’¥î%€‹ðho¼îön%>l!öb/yÌls€<ÜOúö’Ç-æÞ`¸K°¿×p$„úaëà@â^²ût.è0ØÜ~1­ä•{†ªÜ;TåÉ*Ó±æÉÈéÞÊ1Tÿ}CU>5Tå“CU>=Tå~{¥ílmáGë4hh»ƒ‚a)&ņ9ö’Iõ“g·‚ÕÁMy®À ÞÝó )†ó‘"öXlà Û„ïGûÉâã¦dÅ;OÈöâVâõ±›9àâÀÁ^OêM{ÉŸ¡EJ¢™Š7€œ‹b³:p²Î^òU÷—Áø)>Åð8 ~½‚§Pâí[%Í9CqÎp~ݹQ¹%¬ÝAÆ'÷þbΞӊVŠws²ÀðÏ1Ø/†T©6KÍr^6Cé!…e’Ÿ\űÑY*ÂfbŹ ½‹ü #ì*|£?~üøaƒŸ,ÞêyðrºñÀPa<.`™é¬,X˜Wz1_9¿”<¾'põ­s[¬HÜÅásMã³âdG,'!Û¼ÆCš*¾pZÞ¹{É«Åj9 ¡Ÿƒ#M½ù9B'ê/Îðk» ‰Ð¶ä¨bƯï!¿|+M ô’á£qÐa‚BOÉqÐSvÇzUbE+rúœê}dºO+rù\>4ò9¡U:´ò¹ØyEZq®wï÷Ö;!ŧÚ5}°k*¦‡oà}Tà„ôyS&›ž ¿‚“äÀ9¾5Ä<’_ƆbÇΜã·ùåð‚ϱrù5„ŽõŽã¡ÇÓOÞYÔsü³µŸ¼ûukf.X±ƒ;¹›Ñsz±ßk´È‰›âƒ(é=\+y'ñæh°Z@ø-ƒL¸ÏÕOÞG  *–>ÞV/œWäì9¾=Í¡äH<ÙàÊ:}Êáz¬ÛiÜÐýäwߨÔÀXO)¸ÜÔ=f/ù=.û¬Î8C1û=äCá7üQCˆ ý „cÅëGÜ“áÌúÉÇqgd¤‹ ­Å˜œc"äL\—OŠTT§?÷"òD¶'Ÿö¢p"VyåVâÉáЧÊ‚¸¾K{íÞÏ^òW”õÊÜR”ÒÐRÃVL4ìÃ(ÎC{ùßL7¬Ÿ|Ö+ð~ò÷ޝ©åÿØJFÚ/‹m` ŒAÁZY5ü2ú}›q ¾Í9È?ûÉ¿Š'«"Žz‘Œ±ªI ï¨â4ášQ±UùÂ+÷WÏ¿ùùÜ0€—w¹©{ɗ܃^Áï0?¢•}g3G±ü°Xr‚¶xí9ŒÛÚOŽà° »ùn`ÊΕKÃG—'u>©õÚq0%`Tr”ýhLTÔJ<ø4±¤øœì<4ÜŒ¼ÛGŽÆ.¬c°å_áÈ0Åã9Ž]¡Ö±ðHÌ)6`•DùIUXUxÓK2¬œRÀ5F¢9j,Ü!’ë&×ý®È=â©•]!©GäMUÕKUù"òt[®ª® ²,§¦zdUUµc$¨rÛ!â:Fܵ"š~ tJJ?D”ã¤:Èçªr‡JAuD•W©òjBfKG‰)GR’S‘z.-â$4Öœ¤HÇÉ*;‰©r'!ÓOÍ…ÿFçŽ}œhzÌŽëxŸÑE“^¹{eÁ?uÜ1’B@¦IªÜw¤ú’cÄE$÷˜á5€ò¶j&sÑì3‹ªr7ƒ¸ü8Iã­Ï–ŽÁ´¤ñU¾Ð³œëÊœ\ æêÃT]Í4þo¸e‚ŠRÇ#*ð¼Èyˆ8Õc0”«ó’¸¾$éjÖWxl¥ô/q—Ø%!ŒÁ¢3Õåtœ¥(°¦Ž8yŽ“±öõQÖÀ?B&¤d8SRŽ`Ça+í}ìƒ7˜*¯…®’‚Ûé”F&Êal¨Ä±€‰µ³9=ÍE°Q’‘ØÏÞgqÅ÷1ÿ] %c¤ÃdÜPý'àä¬ ±KTù;°¯ŒIø5'¾ZµWK_ÛSÔÜ¿¯ÐqRåu\_.ÕŒKóŠøÅ€ýJã"†®Î)ï+XbÄ‘r˜ùEÇɉIä"äq—¡tÉê™Q/8‚Å-¸zœT‚öØ(ä*_§¯–C÷‰Æ÷:.[¼z@+ð ו|‰’ÔQ¬ƒÊœÿ´£/N0DWÉëÅwžì-pRÁOõ}LgñûL)/GÂí&€‚ü~‰­§`Eß·.Y_¿í[ÐU7S"þ¿Jæ÷ÿ‹±þ“¤ãïŒúI{WÀ<}@Hêº)=3ÖSÆßÄo›ð÷?òͰcšH´ìпjŒó$ð¨…tSÞfôÝKð…¼3E½9–÷A§Ì&$óBcüBàó È01–Üó!í >êÄøþ|?cß'äÕ¿/Ú¤oßYÐï±øµq4è íp`BZ+JΧO$Oý'È9ÒAü$)å÷IŽÝd…½TpM”äl^*»I ã8bºLù›õq(»É%lÔ²XÄaÔ}sÌ™½bpìk¼åÍ$u¶3ì!3mí¯ÝJ&ÙÚ›QYÌ!’œÛbÔ}äp“åŒ{%×)%a~Ðô ÉÀt'm l¯î›û%}–ÀG‚ï´›œ7=¹i·° ÆÚ¤›3>Û˜±b£+@_g_KX‰mg޲{éÛŒ‘pα²¡yG¼ÀŠX91Ot,ó8 Ä߃𓺇–Ǿ²÷²K°ï[/Á–ø%°©‡bSÅV« ¦Z¹æò­³z%,L]5pÈR‚¿u'pM ü³Œ[©³wˆxÀ"œ»36ÑØ<10⥠`OÊï!ãS)¶urÑÐlo»˜&¦›k¹1~!,=J89õ䈽”R›Ì¾ëöHi˜RIéF#f6F’ÛlDÅý%è´¼¡¥£q[€ëdíÁx·ÊžØ"Û,Ì~¶ƒèñïݳl#.¹•?æã¨’‡‚Š¡–Å)çëz &^ìôe öSqÒ<äÖÄÙ' ç? X7X©¥…Å–ñq—À5…œÕç…†ÿ„Í;QßÞ+45ï—†æA÷Å6QGÙ¯jƒ!gÚC¦ÙEÝj¾‰˜ƒöXRœ`c:¹Ð>W±  8\®¥;c§pÐMb¦ÝD£5'˜øâ¥°¡|sú¤\o,>‹åH÷‘w#¾ãi3æcÿÖez›ñý¿Üˆø鯄d§'k³‘†âiñèq|ÖãøÔæ”~‹½1TÆñÈ ë¨Ú枺Œut 5d¢ ,1èéßRXÛa}Ýyë6´Ü'€•sŸi¯È”Ƶï•NÄ”·’„“âèz ' 6æ®\ôMf0Ët_’ŒÓ/ûêŽÜj í€ò¸¿ŽABÐ)ñJ`,tJbŠ]lSì S±¿ˆ©‘•küóF¼Ùþû-·äk=½¸y%_ßQùùÀÞ¤_ÊãBy¾r¦Ç*>úö žC‚ÑXaÜDƺsðÃô-<±ñ©Ý¬>»5q ¥‰àΣð 7×äî%í&èÔ†N³}Ê…t"¤)Æ£ÿqº˜9þ¸^ß+å#,¿þÿzȇZ‘ÁÔC¸œA%@“ì–úÅMÿí×>QåÒcô…k•Ú[ì”!LMÌê»ó €7VÂÜ4pç¥.û¦5×€ïÃîø5ª:C‰¥*›àöøÃ¹0‰#m½ÍXíÃýäˆ}¶‚²Kš;8Òäq¼âÍFŸ4ňe’,‰µ’ÊÀưÚä*›|©Ä‰àö±->fHõ±Ç S¶K6´ÅVÓ'ù{ évòáQ"K#åˆ|µCåÿé#GŽ›2֗ᛚí;=µÐ7ѤÉcÓeÇX‡CÍÎ?~\öÙd"%£¥ì‘)yéžÃÄq”dªr»ï„á¾áGÉX)Ów˜œ w<ðñéÙ>è9ÒQÇÿ¬#ö.oàÛ¡Ê]ô(¯Ê«sŽüÑ©c3s†9Õ™1vØǸ©ç8Ÿ3[ü.P¦“ž_¸ð‘}Ør›,;x=;òE|œÌã\­ Qy‰’}”œ$ùæR2«d´X £åâ°ã`r dr>ÛjãÈΞä8a”Ó©ÉöŽc¡Â7Æ7zªœá7!ÚføFJÇ¿aÙ(oÏójþi!ŽÞ˜›÷gˆ›‰Î‹ÇÿW Çù¿ë?IÊoa~QšÉ!'O¼®'¾öMLJ¤ÓâÇàíOñIÖ¯¿=~,ùcc=­5ø-DÖsct“ÙŸ§sdµÍ›þ,6®96Ÿc ¤'bò™¼çÏÇ»Ýè» Âᕦî!z¥iýäafú¥é{¥“ 3(Ülïw< ~hà€«$» ÖÊa´Z´S ì'ï.*Àß‚à Ð@‡Qª ޳¨`àH‹Ì»Ê>€2Øù{¤Sí£¸óú¥¢ªû î1@òJ3xwŽ ŽM·~ªÎ+0®ÀètZ|§˜î‰@0Ç$£'åï6ùŸ›°­Å#;ÉH³E±9œúÌ!Æ«k-ñ“I\ÇÀv¯tF6Ïa5.HºÕWý0ù_05&!– W§ë.HبÁ[Þ2¶)¢Û‹Ä¿;ßz#_$YîI‰J4›8]Äf_×hàê Ú Õ™ßF€o²3Öhüp™^©"ÃŽÈ›Ž’U¾ø0I?JêÀŽ’ÕJ9Jf0 áGHü›8ñ(™`Ö `|Ñø#d.qâÿ(ã6b Ü”¹ùâW=}Ò¬~é¬ùùýä…3Ô§”&êžÚØÄ0S0s@Víž:‹1ü­˽üΧ¨÷‘wóñGô?*rx¥Ù>G¿T"ƒèžQ¤ö+|÷\À X´ˆ§!±Í+•ÆÚMC˜Ä²i:’*¡O¹èÚ€]OFâ4Àª;±q€U‹&5H<‰i€Õï$%î¢"Õ§lã?‡[¯H>G£OÕC&úTwÑýd˜O¹ƒŒ0êTQ— u3v üO»FMŠmC!ñ8ŽCî?lX+IüG 'I©ŽŒŒTGj*xo.É›{ˆ8áðÿ=“ñ¦Ÿ¢¿åA¯TÇ«bIõJ•aFçžÙCöJs¬ª¹VU%TÝì•üVÕ<«ªª.òJó­ª*«ª ªÎöJÕVUUU U%^©Öªª³ªJ ê$¯´Àªª·ªfCUŠÇ·¿ÿfcDìW"“¤g:¼¶ÿ;JT‰hòõò bêZ)ÿ-/ÑŠÜ#ž&››¨W š˜Wj4)^©1Ð:³0Фz¥E&Í+-4¹ÔЖ@Ä¥P8½ÒÙP¸¼Ò9P¤x¥s¡Ð½R3 ëyP¤y¥ é^in¯´ Wj"Ã+… ðz¥Pdz¥V(|^i%Y^) E¶W:Ša^é(r¼RýR;¹^©#ð¸qg³XÅg±šÏ¢“Ï¢‹Ï"ÊgÑ-fq¡˜ÅEbkÄ,¦ŠY¬³¸XÌâ1‹ïˆY¬³¸TÌâ21‹ËÅ,®³¸¤¹Ê’f=—f—æj.ÍF.Í&.Í5Bšk…4× i6 i®ÒÜ ¤¹QHs“f‹æf”&c “1RÈr‹åV!Ëm ËíC”;¸(wrQ¶BŶ}Ò]M{¤í©¤»çöKw/B`¡ ,2Å&°ÄB&°ÂÎ7•&6Vðõ´Á‚®¶ -èf ºÃ‚î´ ­´Ý‚îä‘/wÏé—îð8+¾ÒC®µ«Ü~ ^ïžgÁÜó-øjw•orW[ð5î ¾Öí°àëܵ¼Ù]gÁ×»°{¬»Þ"ß`ƒot,ø&wƒoq7Zð͸1| ú|«ûd ®Ä=3àÛÝM|n¡ß»hÀwº—ZðV÷Ù¼Í}Žßå>ׂ·»›Í©ø5‹zo ¼/ÞˆºÏ³àwЄ¥îeý{îåü»Åñ2‹ ¹Ѐ7¢Ëc´~õÑ€EM4à^TF~ UÕ€ûP7 x—{¸Ås«ûK²GݪզßÝfÁO»Û-x³À'Üiü¤;bÁûÜ«,ø)÷hk¨ïÇfõpl™ž‰/¸cðÜü¢»Ë‚Æšüصà—ÜÝü²ûB þ‰û" þ©{ÿ̽Öæ÷Åý÷%üªû;V›ÏÜë,úÏÝ—Zð/Ü—Yðë°[òšmâ‡c2ÿ2¾á!WYÈ›Übȯ¸Ñ0·¸Ý0·A ,äײÉBÞ±Ÿùw=ä ‘=ä: yÏmÁxÈ ÖÞçFɨù‡Üd!¿÷-òn± äC¹ÅBþè!·ZÈŸ<ä6 ùÈCn·qCg _p[g ÿææÎ@¾ôm–l<ä.«æ;ׂskh G¸‘4£Ö:Ke´nÚG¨Gþ­ûÑà÷ÝÓ-øsÓÜü¼hó˜øÙÈÿPKNUkbD9)ŒPK7Aorg/hsqldb/FunctionSQL.classÅ{ xTÅ𙹻{ïnn’›KB^$¼¢&» „š¸4LPqI–°š—»ÛZµ>j«}Ú*¨ˆö‘úh‹+-ŠÖ¶Òjkí»¶µ¶öý°µoÿœ¹÷îÎnn"´ÿ÷ÿ˜™;眙3çœ93çÌÝë³o}éÔ+«ýàa ÀËìcÔº]eàó~v»ƒ0wRµ#BV; ¼‹ºÜM­{¨Ú€_²{©µ[c÷Ñó~ª>©±OiìÓû Aãû¬ÆÐ؃{ˆkìsû¼Æ¾ ±={Dc{5ö¨Æöil?ÑS{Œž4öE}Ic5ö¸Æž Ü!=©±§4öe=­±¯hì«„þšÆžÑØa} ohìY=§±ojì[ö<û¶Ê^ î$m¾C:|—ZßSÙ÷ÐÂ~ ²`%ûõù1a^ô‚õØOØOUö3•½€vöó\À^VÙ/èùK•½€nö+~M=Cl~`¿c¿Ïƒö‡AÐ ÿ'ªþ¬²WI®¿Ø_Ùk„ù›Êþ€>öþI"ü+ÀþÍþ`¯³7ˆó›¡ê(UǨó[TÇŠãŒ*N•âg?᪼~}„S©Ò4î'LÀÏó¸N˜|ª ¨*$‚A,qþ•¼ˆ*“ªi*/À{y UÓ SJUÚƒ—£b¼‚Z•TÍðó*^à3ù,?ŸÍî 8'ÀçòšŸÍO!ðTªN ðZ^Cëü<ÈC„›GÕ|’ätj-Àâ I¦3WOÕ™„;‹ZgSµíÎS—s\BÕR2Gá–Qµœª„;—¨çØHUͤG‹Ê[°‡¯Ôø*¢œ¯òpöñÕ¼ƒ´jóóvÞáǾ*_€/±qÙù*ï Àìn¬x7U=$ßZ¯óóõüÂV½ß ñ$èE¿Xã—h|“Æ/ÕxDã›5ÞGÃú5¥ç>€Ì·j<¦ñË4~9¡5>¤ña’øP‡Qª® *®òíâ»Už¤íˆÒ¼ÌÇ4¾MãWjü*o×øÕ„{'Rù»TþnæÊµÍ›Ötv‡{›šÏoìbÀ ò›G†ÉÈpr]dp,ª ç2ÅÙ½›Â]½Dã J­³¹ymWkGsk÷¦®ÖU­Qa0-{`šäa  Rë…=]Í=„ó2(¸¦pϦ¶ÖŽU=çÚÇÀh’Q« Šì©{ZåZz@cW JÚî²ú=Ú/Ì¥œ¹{ºÂí›»º:&ÐMÝëÜÞÙBp>UÀm8äÖ ×\È ``}ka ~é¾ K(]ätYÙÖÙ)º;¦in ·…;V®ÄÑu}¸¥çüMMk›ßÑ*†OwLܽ¶©eïX%ÌD¤R¥9$4?‰&ÈeŽ5²ÈÖê”;ÖXÙÙÖ²©Í¾" ½vÍ ]éØW²£»¹³Åz†3ƒÀ£¥[»É ˆVÅ BÐÄœn=ªdVÄQjfzÑ×µvµ5ö¦ ³C/éèìjǵÝÐJ¤ÙŽf4Í8pmFxœ&ƒ¯sø9eHAGôxtùžM-=b¢P.¡'Ü.óLŸ@èîil^RïhÚÖÙÜØæŒ9Ó M8Ë1¬Ã®¹±§±­Sýl5Ùµ®l\ÛÖc™x%ÚeÓª®Îµ‚Ï¢\y×4Z;hq.¡«³MuNÚÊ6¡»ùüÖöF"-apJ¶ŽÙ¢Ótmêé]#ø,Í`m·åK ¡»µ»›N ‡°ÌY§îÞîžÖö4~¹³¡Ä gC­kl[+&;—AÞðÈšH<2ÔK$ðÝhòèÐhr»„62šŒ G;ä¾¥¶;6<0•(…‰\L™Ó7<œŒDãrçþ‘±ÍÙÓñØh&ÿбH¿ëÛè^96Ü×e0«m$>°`kâŠÁþÍ c›„í3úüHb+ö@ÓÄ£cƒ‘xzLéðÈpK4ņ‘g¬(ÝQd>'—[g¼?ö#Sâ‡}Ÿ¶»÷l¢¸±D# x†#CH4Û.‹l‹,Œ ,èF½†p°4ODmUÒíÆAÍX¢û‚¶uŽzd4~8z%b„Ê߃¸æ‘¡ÑØ`cR2z1 Gã̓‘D"š`pAíÄ™eÅÖдñ– Új²5Ôɽœ)qv”ÛÓ<Ò:åw'#}—£{"¸p˜3ð-Cå“è`JmÝ:ìX®['z"šlŒŒ E‡“(UeíF™}ëU£ñh"4а’hÒ™1CbP^[7É(\#ÌÅ ¶VîÕí0–ìйù²h-_ƒk×»ºŒVùµ˜1«ü:LŒ©æÅVŒÊ¢X#ƒÛ¢ä¨ì鮓L¡¿uAKãV[7qõ0¡Â.QÜ ƒÈ¼¢v2Fè|ÚVtTk±pA0uÑú£‰¾xl3"ê\¥ »L(ožãÚ²¾A±à:»„]¬óëù{uv»swçÑÙ,¡óø:¿ +¶•õéüfþ>ß‚Rã:‹À«:ÛÄ.Õùûùt¶™áVÒœIgý,ª³- (ÕNðô’2<Ý2é‘ÎÖSO]΀¨{&·A½r²dÉqtÖK Lo°Æ¤Ƕlb–ÀÀ+ÒttJV) f'&8±œŽèl#ñò§£¬Îám³¸xE€ÜhzäbV”0'Œé¬Kh%: ²BŽD§“A9b ¤8sÒCgk…<"0Hã)|K …Z]H]‹&ÄkÔ/Q¦ìØŒ³JÞ ò[u~ÿ ®ÜÝ¥³íüCX±wRuuVޱ¡ÍѸÎ?Ì? Zr´$í·Í[1@ôáALÛOçåÓùíüã:ÿ»UåwèüN¾O  ãšbÑøvë,/ŸHÙÜIFˆáNßÅï¦h–Û«¥'lÍzßÅ j"=’ŒöĆ¢V§{ùnßÇï×ù'ù§tþiþÎ>¤óÏòtþ Uñ‡uþ9v+Æ_—ƒIçŸç_Pù?Â÷êüQ¾ÏM7ËdÖ¬ûyJçñ:ÿ"ÿ’Êêüqþ„ÊéüIþ”ο̟ÖùWø:ÿ*ÿšÎŸ¡Öa¾Oç_§êüY?Ç¿©óo‘”Ïóoëüþ—ªïñïëüÄÿ‡<Åð2À¯ªüÇ:‘(?á?ÕùÏøK:ÿ9Yç¿ Ü/ù+:ÿÿµÎõÌÖéƒF`è%¿å¿ÓùïùtþGþ'õg¿ÊÿB¸¿î5ƒ±äöÉî. z%Úóm±¡X²YæáZÛµŠ´–¸ykÊÑ~{"B%˾‘ÑíîëvA…éÒ¤E6ã¥k,‰†8ur?ÉÞ;¾¡‘þ±Á.#NxŸº²ÎG·Ý'{F¬ÅÙpÒÇÄIL–g½;ÉQxK)ÈôkÐ2+ƒ#´µZˆ*Y¾EŒE”Ťg„„¦X2au¦3½ØéU’}xXhº"F¯ÂHªŒŽ\‰Ë_Û"&ñ$® ãÝ28BÞ öEcƒb/b‰Žè@$Û&8º¬ÖêŽq.žøÖuwRÜ%™ô#3*ƒtsl8ÚoaZO&@d;tVDô‡;z0ÖwmZˆg¬ëfO÷8ƒ®_´m²aÜ)¹f„&óFúûÑÇc›“t¹Á&u²®ö¯¯0pØá= £hCcƒÉØè n¯sNÈéÝ7Nl[Œænûï—Æoqz×´D·DPRKèæ“>ݘÈâMáUht\ 4e «N–ýêÕ6¸Ná¹2Š®¾ôDQW&c££ÄÄׇ7ÙÆ¤1ýô ¸xB®—7$ò¾ú%®y ªôʰiOüȰøu‚~3\›Ö{©§ÛüJ'ó,©u¿ZWºáÓhÉ',øFF-NÊèØ¤ï°ðâà¯L¢½Ú#OŒöÙþëäºqp<}Š~IJØíE\ö —œp ³Á€˜†WÁ_èk ø+TÀkü7„ÿ.Áÿ@øŸü/ÿo þ¯Kð¿)ÁG>*ÁÇß[|œ>RÉÀ µ`\‚„=ìEØ'Á*Ì`šû‘à<„u ÎG¸@‚ 6$¸aS‚§!\,Á%8ßt .Ez™—#\!Á•؆W!\-Á3±ÿ, žð ž‹pŸ‚ãO•àÓ ŒÕJpöJpáy<áÓ%x %ø ä_/Ág"|–Ÿð" ^Œð9¼á¥Ü€ü—Iðr„WHð¹Ÿ'Á7Ip3Â-ÜŠðJ ^…ðùFxµ¿á6 nGù:$¸ék$ø´gëß[õØÏµösý\o?/´Ÿ½ösƒýÜ(žýô,ž—ØÏMìRú°”~QÏͬO<ûYT<·ˆq@¿ÂŠçVA/?‹±!`l¡8(@_¨®Ù ,ÈSÀ—++fðÝP° öØËöOïŒÇÀ»Ô3Ã8w7”…öï0Ê=ÔÜê8øË=UûA+÷ì¡ Ù}ñÞcPɘï(”©l4Ï ú!Üž¿÷,£/ç‚òö÷B`?ä=BòŠ~ «Ÿ¯ ¥äÞß=X¹ò±kAe w‚게Êi˜÷)š›¾ûÁGž]¶Ø%†‹r –",È—_ƒåƒXvaù<–CXžÇòs,¸‚ü-‹¥K5–Ó±¬ð¯¡¨©x ,×gãr ñH÷Årí$}?Œe7´©ç5 Osv{–…XÎòË¥A³h?˜ACÜß«)æº^O‘R¼®×[ׯëõ‰¶Z¤¬^׫iëz _«ÇbÂøÐ¼Xù‹X>Eì|ä)žuûaÚ¸g˸§/h î¥2wé5Šˆ9k&æð9dn?ŸñÁ æEð¦`Ïïìù1ÁžƇ^Äwã#¿ˆïÂGE+,â÷àÃ(â‡ðQTÄ¿³ˆUâcZ›b#u‰Ðʘ š%BÎÀ+æ>Ä$Å5KoŸWˆ)ôÖ,½ýifÃAs:1Û ¥¾$h–ÉpGÐ,—áA³B†Oš•»ý–}XžÄò,–ÌSêŸÿ¤Í±¡4/õ–c¬lIAk Ú4ÛûÝàµxêq]ž‚•!äƒ ¥jv V"‹½„ð"¯YVcœ/Ø„ñ8Û yӽŰ:¶Ø;Ý{Úöd $qo'îOAvÀ:=‡?H“3EµÛþÙ4CÓlÁ_â¬dú­¨:kVT=„þÆBŸ=_†e6ú‚†Ï³ðé§§$ÐÈ*]²ŒÝ$cU zdä6rí"O‰ç¬#³D°L§ ³õ¶Œ¹Rpá˜fiú"ôrh‡ÊbØàÂ"vb<.rx¬> ùb2–‹)¸$›âØZLº ÿ:Ä’½ÉwA Ä3ÿЧ P”ÿ¸ôÉù‡J<ýx ,õÎWʽøwèDʽòLª`³‹›Ø*ô!Ñ’Pýä,jh¾„ŠfDT,¶¬®+¸ó’$I’Ô€ÕXm=±‰}Àe2Q$ÃÎÑtËo]Á;¡¦Ì[pçÝ4ÁM€"ý…K0é/* :¯® 7ÀåKÔ2uòy'EºYZ§`È;¼Õyx¢â!jQÅñùWkcÛFóaÇ‘$Þ6/í¾bK{‘8ºB²ß; ( .ÅëCUÆEÒ-·|©§êA:fã?û¼ÅTʱ|Xš+í]bOÞ ê^Hdû%Å]P,¼ÀW¿’{a,Ûðþ4aͯijʃ#r±> ÊçÛ5é|÷¸Ï—}Î9ó SåÎ'‚òU”)|m7´Ý(÷,ÅŸµ®^ª–«¡rŒN‰<°í³Ú¾rµÜ+–åÞ[îKÁ»–z…3—{Sðn«]îÍH–íŒ{ášm%Ð{:æ;øb±Ï95kQîÌKoΫ7ņÙNl(s;lË÷ÄQ2Ý3==‡uËTRpmŽ—Ú‡Îuîèëé!¥l •Ê"OÎáýè‹ìs»Ë\,w` ¡Ëá•zzyVŒC)U¦g‘GN–ÄV}/E·Ü๗6Á ä˜x¥àÆE¾´<Þú_U .ÏM–¥ ³E›Âx’½}ÂÞ>iˆ¯>½síMó2ËM[úÒ¶LÁÍÿõŠ×½½ÐáÚCVؘ¸œ)xß ¬Ï"o‰÷ÿÆuà®ðY±+pûŽÌ:ù¾·0Xª¦¥õRçrU9S¬Öûÿ®–c*K^·5ûÀžÐ>¸5·íƒîÁ´êC‡AeãOÍ|8!ìGmêÇRp»z›æ>øø>ø¡î;(BÕïLÁŽ ´3)Y4Ŧ¥ÍíäÔ¼n;ÂŒ}¸Æ°äɬlò‹Ú{Á”&ýeÖð4r?œ7…r/ܠij%=—ÌLÉf&eUf‰™ÝÿžP!É‚`^гòÇam6×s³%^(QwíÌÒgû%…Ú^Á* ÚéÉRçÄ=Ãj¤àÞ–„”Ä]cKhàWìÌŒDu¾ ~Q­²` *zШu ž›í€á¹fÜóÎI­à"ÈNO[–#¶CíAØÓk”€uhþÇà‘n7S¤yzs• ™YÊUL¢œµ‡•âA“š{÷£4㸲7­÷YA£Îâ'zïH÷>ûz=k½ŠÒ£<û÷BÊzåÄH±Er‚rù´AE6ìÏ>qþ›$$ÇÏþ·$äáý¹IÈÝ’,Þ4fÙ‘')ÎVa7Y®Vêô€D "Ív¶ç¬•:ñ;³õº!ÛfcA#˜+gu®œÕ»¡6hTO:íxLLµ h,ÛNÙÛñÞ¼Ö¾b§ºLŸË>˜rØI·ì4»qx ƒÄ!è÷Æá¾(€gûåä3!ö¥s°/¥ààŠ q &^‹~» Ÿèxh̘bÀ¦ô€!åDú_”î¿üÄ&¸8=Àí»;!q8›·à#¬ zfq^¨8ê«+ñ›5 Jkü¥%X™%Ö_iIaU•Yå;WÔ³KKJ‚¥%sjŽ@GMCIaiiɬ’Ò#ÐhúŠK«ªJWT-õÍ·xÖ… ±ª©ñ•–œSRáçþ£PÁðv~æZ9D?ûÝÄn¶îsêrPè« ßKá‰ÞÇàP[0ýËšï+9¿¬QÁ»{7–k±¼Šå[xwËÇ2K;–!û#ú€ä¯x+IJ˥?* ŽUvc¡D¦eðô±Œç… LÅ{¯õ±‡ŒË-Ä#Ýï4,ó&é»Í¦m³ûP ™E)xÒ¨MÁS–¤àË„˜…ói§eíB‹´Þ‰¡½ðg7Ÿ‚¯î€ò5îkiÏЀQ‡íõãÞµãÞ®qogŽ«-ŸWªw„ÌbGšùi_w“ÂaÉCf‰«ÝóJÈœ>ýéY6ýþY>ýúY1}sȬt¥ÏsWÈsFȬšŠaQȬ>†Ê/BæÌ)*O…ÌYSÑw‡ÌÙ'5áHÈœ3ÃÎ9w*ú‚Y3½0džrb9o.—͒?2O›|¸:`z̲þr/¯Ü‹®ûgÙQ&½k|'ºkøÌY7…=ØñœŠþrÈœ7¹rϺzgiä›LoŸÜK•ÔUOT]¶µKDæ‡8Sz+_c¿•:oåÍçÚ1N™ßÄÚg~«=d†•礂¶ðYDš{¦­Öoò;A}éGE9˜Ïc…›øÛëCæ B·|gÏÛ]‹•áÛ}BÌÒY@é ÜÁ£¬Leï;}~Î@ÛLú·ÿ£¿™G ë\¸ÄO­ÄBŒ£g©ì:¯—¿ Ížc0˜öTƒ¹ÀØ Pz {¿ýL½ýMUèËàÙ¥ICO»Á =ß}Xy8-Ь›`·Úã§Û߀pà÷hð¥Û_ÚÜÆ>h÷9„Áš¾´¹Ã×ó­†B?ÄϸŒùb¹ÖßàaãÇ_›o~Ÿ ô²Ê|Ù\Vaíû­÷k%ôÓ“oªç›?Ä6*4#?¢A?¦A‚ésóÍ­x-ù‰àlþT<² ]¾c`¢¡1å0Ò×Ýô1c›Ù‡l]Šì/ŠèçOÃQõîdÍ"kì#γJµøØSyÜÿ(œî•?4ó¬{~¦Z˜ÕˆñŠOêLñáÑÎÖr?„óHŸÛQ—|?É#|©–áꓸ¶¥G.Ѧþ˜úÌ0Ô©;ùäãhÄÏßîÁ¬¹_ > §„—Ñ_~ñ((é;¿ÄÖ+ÒWÎÌ,ò¤àWë©õkÕikNkºásš%Fšþ›L³ÌH÷-7üN³‚ÜÓjVyN³ÊÐfµ‘ï4gNs–Qè4g†Óœc9͹F±Ó¬1Jœæo3ÍSŒéNó4£ÔiþÎ(wšuF…Ó •N3dÌtšóh'9Ø:«©˜‹Ó<‡¢¥Õ\jÔ;ÍãL§¹Ì8ËiÎ7Îvš¿7;ÍÆ9Ns¡±Äiža48Ízc™Ó<ÓXî4Ï2V8ÍEƹV“>TOÁRðÇõη{ƒÖW}ì2~ »Êùlþþ/(ÿ?PKÞû>3i#÷ZPK7A#org/hsqldb/FunctionSQLInvoked.classW `[eÿ}Íñšôë‘¶Y—vec\i’.0µJ c[W ³-[36Øöš¼uÙÒ$K^Ææ}ÌDÄ›NEDa*SËì² „SPQ¼AÅ[Åû`¶Ìÿÿ½×6i“±nùÎÿ}~ïÑî{ÀrvãõxƒkñF or¡oæá-<¼•/ö¹ñ6¼ÝMÛw(x§nÜXƒ›ð.7óõ»ï&óF¹Õ÷â}<¼Ÿ··ðê.>è‡ða>»ÏÆìçù#n|cB·óöã<ÜáÆ'p§ŸÄ§Üã.7jq7_`àOóÙgxø¬‹†{\tvÐ…ÏáóLü <Œ×à^b‘¿¨`‚AóPàá:êÂ1ÜÇîç³/ñÙ5xµ:îÆÅ¸‘:ê&¨‡xû0_f)¿Â«¯òêkŒôˆ‚l€Ûøäë<|CÁ£.<†oòð-ߨͦóz"¥EcÛµQU µ? oÏíJƇÃCÅw=Š,Ð\Œ\±t*žÐé”@K1HßžLVËåè‚ œ—$R }…@»¿2·ŽöÞtœ˜ÕFu5¶s@ÍlP‡“š‚ÇdNÓWeGò£ZJÏ ´ù·TàÆdZh“NîÖzÓÉühjHÛ¦eµTL#¼½%D-œ¡ÔÔˆvéé‰l©pQ|œL ‡¯¤e"§÷lî¨x¥à;¤…%؆½–fÙ‹JS¢˜‚ï 4ŒhúF5™×")]˦Ԥ@OY2[úw¨»Õp’Ä_5¼C‹é=ó(d'2Óôˆ‰eÛîò®?—‘¹HÿãEI‡½³ÙèówTÌG¹]Írnm++Dø¸Ä÷°Kb=¾/ñ¬“¸Š‡W¢_â‡ø‘Ä5¸VÁ%~‚'%2Ø%°dŽWe³ê^ΉHœ’9¡ïejOQ~Hü?ðÁëœ(aN‰-x•ÄÏñ´Ä/ðK‰ *ø•įñ‰ßâw¿Ç3À<+ñ'<*ñg<'ñ^Jq57vWç·Q•“â$¥8WœÇÃù;y{ H!-‘e´ qy>c¯S6ER»Ó;µ¸D$Ž_t4•©!ŠH!):E¨ÔY³¡RªéPiÇi©P" ©¤àÎúžC~~¶Ô$rE™j÷G¸8¸ú®Y7tý†¡«û)ê'¹¹„Kr¡­ì…Ù9¨À̱æ.7dï¸À¢y¥i¦Î³T3xTãêõ—IêÍ\ T]eåæ4ÎR­¹Ðe´Xb["64ÝŠ—ù+™©£|“nœ*à!ÒëÔ,•Z*kV?jõwTö@­Qâõ|6eJ=§À”ÀšM*›àöݛΧtÃ&rÛb@Ó·§ã›úvª:)-f–AFi-"˜ÓÓY-l·ué4µ¹m4£ï5MhÔ*ÂéŒ)ŒˆÌÑÈâêHäÖEÈ t7Ý0‹™.-UbG|8^»fuï, isÙ‹¶é”)ØžDn0ŸLFR™¼~U^§Ñ¬×3ârHEJD1cnæ%ÖRáJÀmÒfSS](Ó²Ùt6ÜÇ#B3çö9l8nûöÄ´Œ¥k]J»Á@™îæÇï†íÙô Ìéôí¼^…»µ,÷è 鵄-Ð[Ά†G¶©1íLŸ3a)Mgúä)s´ù´²û²ZRSsZ¹hQ9˜켳±óNkT×nŽâ5”ð”ŒåôªËM—⺇¬ÞVF=ë’e¬xI¤²üNð*%%õy%)Rw'FøÆ|ÏNÃq~ˆëÒ9ëP3Â,’Šk{(Q^œ…"?AòYzlë\ø"e}XKO¬Äh&©Yï–ºé§ 1÷QWäûœiA…ø‰H5” m.e„Ü”íMª¹W² æ;„áÔ”:¢eÏÞS7[&pÎ@R{ISc¹gcØ™|Ú”gT™¦³lY¹.qº0­/ê ¦|s:=–3˜Q(ÖÓk•€µ8}[éF™hN5“ÑRÔ¨Bþr*”gpßô÷žæ¶ZO›'äo]Ë?/[ÊPõ÷Ì’[M_S Úqùªþ(uò¦þy—ÄÆn¶ùÖÊÄÙôá½€~ôJÿÑÓјééJc#ýÖcQZ­Fý‚ˆ1T7 €£¡íª‡`; { xŽ{ D`T 8OѦʩàj©a#6Yô-zNFsÞkðüJ¶î5(¨¦9˜€=j÷Ù…­¥[ñ) Ú§Eu ×Ú}Ž÷Ã}íÔt;|ŽÀ1È*lò9ÆžÏáu2>#™¶I´*ØÜ\C'ô|¶XŽ“1œ4ßD,>€ÚA[—Ýk7vwb)Ï^ûrf$Öu^"=úè>»8pêÉÝ;: h8 O1^ÀÂ#Èh±64y h¤ÕaÔøO̳¦Ãh6TÄbÖšÍpLA*xµ8 ÿ$êDà$d@z>›Ò‹{h_Ksm…IÉÛÅ"x&°` Šýì¶.ç!´t+ö®j¯Ónëí¸Ž †ï@§‰å{­ÝŠ­Ëåu…HúfŸâuÙ·†¼®åÑ}.’óÙh0p½Î­¨‰Ö¶Í‹º]^çípù›Ïµ´ìvÙºÜ^·eŒa÷òî_MÐç¢UíÝÒ'OÀo"œ5‡çµ×]Àâ–ìG­§ñ±£8û(–Ž[ ÇPK²¹}2z xEùjÈÊAŸ,àœè>7I{3}JÈ[]À¹Ýñ<Ÿ£€óÇHFš/8Þn¬&à§€™1÷u¨Ÿ‚Oˆ•âBp+ت@Up…  6'úþi©’­S¨a§LáBà b ›žG#¹æ–” )ˆˆ ¸ˆ‹†mVØÝJag§y”=Q}Ú‚è˜0â&È:†Î* „(œÅ,=ŒðV†Bx°ÓP¥º“5¡áÂ1ÔÐtÑÀ,¡y9_ѺÙã™2­ö’ ¼ô(^v<4^”§Ž%S8‹d'ëjN¢.F°Ý’n9IÇ5ba ÷jæ>:Š®YBÕ“h":´N`‡…ßfåy}ДàåÇð ÊÎé„§1 pŸeõ~\L©ÜÝÏ䢞.)àÒMÁ+6QtétÐ:ì—ÚV´/¢ì$?ºƒ !aDg;…ÕeŒ·ÏFqðt°¡Ã¸*`e±êö)„Œ’àBÔŸD]С%Q“¥º.:‚Uã0ÿèãÝh×4ÒÜ”T´”Ê–… åWOC礱•¬ÃLú‚£w?¶ƒÁ‡Ð;À R¬1óÒ¢ßÝF òÐÒs·QHì´´ÐGAßAÛÁÕ\¨rMâbŠ@:Èc·ÅíJËÈF‰)àrâ'g^Aÿ;O ÚII=Øi;„+£`'y|Sçx1ÕÚI4P ÓÁ 3T7Z…³«,¡ˆEˆ"¦Ûî³[Égçåñ¢Yòu¨š„‡¨Or<ÆétöZ<<–%,ù¸eÆ×Ìz™‘¯ »<OÔ–î²*߬a¨hzW2©×âuåZ‘ÝŠL±ÐèÇD«hïÿPK‘­á+G ŽPK7A'org/hsqldb/HsqlDateTime$Tokenizer.classTßSUþ6ÙÉf) 5¥m‚–ŠVÚЈX "mPIaՀθ$ l›]Ôúâ8Óñ/ðEqúƃ¼¨Äv:€Ž:c<çf7tÆt4çœ{Ï÷Ý{Îwîæ÷¿(à£$qƒMQÇi,pô:›7ؼ©c%ŽnêdÞâh‰Í2›·Ù¬°yGÇ*ÞeÈ›u ¶†÷$¤jŽ,;Ae×­JJ´³Ç«•ímß $¨0PüÀ \‚Ü”¨4êþþž`lHÐ=¿T_Ýo®/AÛ‹KÞá­â®Ó$XQ‚Qó·éÔx‡€±MÚ믺ÛÎ~-Xê¤h[ ·Ý:ñM¨³^Ý æh™§råb£JE(M·S]Í­ï»"K¥;n°õ#ê*v %—ú™ãw»MyþêI‰r®Èˆ¾µÀ©Ü^v>Yw¶j®É¦^¥ó˜ Ó ¤BŒ|–Òræ>Ò㾃&@¦nNɇñCÁ¹Bö âôçTh³è^”Ø$™²SÝÓá‰É ¤>DçÒ¿ÂbAÓ„0ôÌÝ/“ßD7žÜEyºnÈ;Uðú¬r‡ø Éý ®…°#‘Fþk†¥ä7hFs–§åø´"¦DëÄñ´zOm§Õï±f¥Õ0¿mÿÁûiµ0'Û‚tÐ~tO!{ÔÁ´L+?ü«£,Ô6=E•?à/,*"‘˜—Ìf0÷Ä‘Sú5Ì÷HKy¸Þ}¢W!‹½ SûM)ÇÍ vY6'ì²b^²ËªyÙ.kfÞ.'ÌkvÙTÍû(‘НŠïF¢oh³HüPK>øö·ßéPK7Aorg/hsqldb/HsqlDateTime.class½X x\ÕqžÑÞ½÷îêÊZ­´’V’_ÄàÕZ²Á€Ù<Œl£•õ°-Ùbmœx-­¤5«]±»²1@M›&¤ I“8S5ÁNÜÈ“¸ÅiÓ&i’¶¡ï÷“>ÒWúH üsî݇¤5ôû*ûÎ9wfΜæÌ™sî~í¾LD›ù)£ïxé8½,½ßóÒý¾—öÒ¸Iý¹^1è½ôGôÇ"ÿý©(ý™¼þ¹¿ðÒMô—BþÊKM#¼¿U£ÝWÝE^¼ý°þÞK¯Ð?xé韄ü³ð¾+½ò¯BþMȿˈÿò=!ÿ)ä¿„ü·HÿÇKß§ÿ•×Wåõ5é½nÒ¼t˜Þ0iÁdÌ8Äì%“+›]òª™ì†ëB !¦Á/]Ï^!•B* ¶àW¼ÂK[èeÑ‚èVã•}Bj„ø…Ô ©ƒ^½!b£BA7q³ôZ ^é¥^b^eòj8ÁkÀáµ_ò; ^gò•‚ÕkòU¢·ÞäÉ­ð’ÃÂß $,ñÙà6ƒÛMÞhò&“¯6ù“7›|­É×™|½É&ß`ò&ßdr§É[LÞjòÍ&ßbò­&ßfò6“o7¸ËàíLž¡ôÝñTâ¾x†ÉФRñLW2–ÍÆ³LU£ñ±Øt2×›‰%ãLþÞ£±c±MÓ¹Dr“ÍÛÂT32ÉÄS¹í±\¼/‘L&0{˜Väâ“S]±ävÛS]Éhðã©ÑX㽎Þ}CL¦¼ˆ%&_‰ºp Z™ÝËåâ™TM2–ß4˜Ë$RãP©êJ§²¹X*·?–œ†M†0µØº¹ø½¹Mƒ‰É©d\LîLg&c9Çp®`XƯ%M¶Àu«W¦jÕž(JÌ<‡ÉÈžÈÚð½£hThÁv<Ø…ˆ†í%ìÚƒå\ðeïIFR0},–ìJÊBTŒ ¨°Ê0£oM¤¹[`5ÔºhEÆÇãj ã#éÔ(ÆBË·b]ªs±‘»ûbSC±#É8òY`ðìrÈòF”ºØèi-±zC‰É8"=9U˜Ñ¿ˆë˜XµÆíÓccñÌ–žHDð×aT×òÒ0u="‹´Ëy£u¡²°*3ñ, ¤íh•K8™2¯'&¡øÇ♜=óP:¯ÊÔXÖp¼“)¸hÜÎLz²8²:k‡"’Êûs9[€S=¾Tù2Ð{Š`‡Òý’¼ÐŽÚn4†z~”AvŒj0õRC‹y¶žd×tª˜]—A±sHTßÊñˆí¸Ú˜ww,ƒ=çõDDâ“d¦S#Ž–ˆzl({ÓөѼÀBéJKøí×òó©TÓsNjì-³7.Ç)_3Z—V'pÔrø”KÛ*¹|ìö†–êþXS-Nõš\ºÇ©&…:tU¹¿œ…sGS}.R ÑÍ—;‚e+ʼng³ë6_}µ,G«*jæÖ‘¤ªGý}ТŸ¥Zô>zÜâ;¸Û∵Es;î‰Oåé”Á»,îå>‹~’Þkq?X¼›÷XôÆÒ{„·—… ¼ÏâýdñÃü‹ß+ÒG$L¦§ ~ÔâÇè~‹î£û™š‹YzG&>žÎ$b©üþ±èÝôB€CZâõ>ö¸s¢[¸LM—Of$Ñ üµ÷õµâX6»»;'';³Y‹ž$Ø«- ×äEaîÆÁA$Çü¤Åï§gå„D.ú–ÆLjŒÅ¹¼^­Îz,“ôÐV9J®¾¾>°ûúT[!DÛ?ô…@xúˆ.Uf¹3i`Šîn]»@&'A¬+‹Ai°/³n‹p9É-Ú"C™ôq9›q¢.¯d@4Ëd!\wùí^zi2œÓEݰëK`Å3™tfÓ¡°·Û•¡Hkïì…m+³yƒrFKYsÖvݲJW¶v鱩)øÂÔö¶ –s]@‚†ºÞD,œLqÄûqÌ¥àØÅ©‘O†Ü@ÊÞÀJxêîQ¼åŠãù“Í…@H!´ï1î‘d\–Ç5.\-¤Î1„ò§nÎBÈáˆe•®Už¿eÑšµ=;06–µM«ÃÓ“l48ïÃ1ˆ¨&Oƒ²E|¿Ü°Óùl EÊÅÿM–^\(&âbJ®ôÆ1¹| ¨@¨|„uèŽç&TNJ˜²ÓG²*#ŸJÆFâ _Y€—©¨[ì¨KBŽLÄ2ÛœU@]ð&²‘ÔžétNîÒ˜ñޝ|?¾¸q€ ç•mPN Õ>¬Ú&9ÏUû=JL¡_AûÈ”‹‚â?QÂÿI‡ÿþ~ü§þO”ð€ÿÅ÷Ê]BÉqQ-N>Õâ´SíGèg ãn†,÷ÐgÀ©AËò«Eø_ßü¨¶±xȹÝ:þÐý5úugæÏªë²uÃ<…:µ æo£p‡;àÆ¤¦êƒrÓsC9fÛ2f[€ÚÛäÞØ?C5:îŠAÄ}ãÔÎSG§´˜2`ù ÃAdò M1„Û‹hì)6ê3’ÚáOÑ–7èul©©•9oÞ\1ø]¶9·˜3aX¶™íÂØf;n•»ÈUŒ6cXè.q[1|%Cö½”¡°ƒë×Cè×ÚÞu‹F·hl°×‰¨n©èmQÀ]*£¾Ä§ˆ0lÆ 0…ÑXWåuÐfì.0š–º¯èf£¨»DÔb›Ù)¢ûÿ,v8êòÇLþ#Èééþä…ÉàK(j(js<þ1Y<ÿ¸,‘BÖÅŸuð•àûï–ˆû“fÿ¤ÄÖŸ’XúÓEÿ”ÌÄFÑzF¢àÏŠëþœø«h“¢Íжø§w»oå‹Þ¨«b ªáqûâQC:&:>yóBÔ«Ç7êU´RQKØUBVÔ°Ž¦Zú>ß8h¢~aÔú&@ë¤PÝz_´Áw´QØA!MBš…´T œ£ˆý9Ìt‚ä'¦-tŒî%ó‡PK#„noE%PK7A5org/hsqldb/HsqlException$HsqlRuntimeMemoryError.class;õo×>#>.fvvNvF6›Ì¼Ì;Ff Í0Fçü”TVv^Fýü¢týŒâœ”$} åZ‘œZP’™Ÿ§â•æ•dæ¦ú¦ææUºå12ˆá’àñÌËK-rÎI,.N-fdÊJ,KÔÏIÌK×÷/-ñOCQ+ËZE& ëA€ˆÎÒl@– ‰°jmg`ÜUÀ $¹€4æPK+ó ö¶PK7Aorg/hsqldb/HsqlException.classTßsUþ6»ÛM·úÛJJd·E5ÁR!’€4µøc¶éNLvÃîíŸÂ›Oú’Œ0Îèè‹Îø'9Žã9»wK  cgz¾½çœï;÷žsoþú÷ç_œÃ:ââ82¸Äæ6—ÙwEÇ»Xes•ÍšŽ÷p£×Ù”Ù¼¯á†NXÑQÅMöÜÒñnó׺†š† s׃û­õ®6ÛNÕi{þîšï{¾£ìºŽ¿Ú²ƒÀ $èN»î^ñ}{WÂÂÝŠç7Š;DÝÞ*²ÂÚ×u§6=·$aÒõ®Ú¡½ê¹ÛMvI8ü¢t­íÝp$ÌTîÙìbËvÅZè7Ý…Õ ´C *uo›@*“«åBÁÀÇlÎଆO lòâç,²9Ž£²£î¡7𶆻Œ Ì#«áSŸás‡p˜®ðÓ-Š×²Ç•P%»4êue‡ßîovÔ£vò±›n<ûxÔµîV²<8D’ÚzIÂÔó}¦÷?PÍá½ÅU'Æ]—ÑÏ—Úš¡_# Mm¢®Ñ×!naŠGaN ,Âc \ŒpMs‰ìIZ-’_%œ3­ÇÌå>Ræ™>dsVéCùüÇù§D~òS„9ó1TÓú cÌ Ô˜D˜~†vZЖˆ¤fã2”7μe&åy*3¦ %BÕü©ïEØ„%Â3bc¦EB }y(]Nète‡„•žñÊ>õ…>ôDýÕ¡t=¡ŸžH¯áuž'm™p‚Õ óHI‰ó/Þ!=Þ%ëwdâ¼õ2UN]¦ÿop‚MŸòxˆYî!­RÑJS¾ƒ"÷ä^$ù&Ù äpAÃ[—¥¿i©ó#uΊNַ̛P•žù4ëO¨r‡8ùTC…¬iô PÂŠàæ¢ÐQä_y„©i¥òÓ0“œv.*F?Ê´ƒYŒÿPK%50™ŽPK7A"org/hsqldb/HsqlNameManager$1.classuLÁ Â0Ë›JçÜY^ÄVfè|«0%,}°º‹7×ÖúâÄWS±°5a½!€0;Š˜°s£‰„²ç;kÇbõ¹îM3ÿ?ÊUzÈðC†Qòq" ’Š´Ñ·•ùPK±Âÿ‰®PK7A)org/hsqldb/HsqlNameManager$HsqlName.class•V{X×ÿ »Ë ÃË"ŒÄe—µ‰¢Q &[Ÿ°(›â°;À겋3ƒJš4¶M›>ÓGú"m­1¶¦ ¶!ÊBc5IÛh›¾ßï6}¿þèßõ³MÏ™™]VXQ÷ûöžsïyÜóžûêÿ^¸`%þ%£oáå!›ñpaoååGñ6ÆÞÎÔwðò(oßÉË»xyLÆ»ñÆÞ+á}2ªð~QŠÇùðƒ,ò!Þ~˜—ðòký(³~LÆÇñ Ÿäͨ„'~Š—OóòÇðYæ>ÎËS"N°ü¨ˆ§Y÷IÖý9^>/┌—ñ ¾ ã‹x–·cìÍiƾ$áËž“0ÎzOKxžOÏH8Ëð ;Í” )L²ò) _‘ð‚„s¾*Ἀ dmpÈÙ¤ëêˆé>ã`|‡:¨ PB‰„¦·ÄUÃÐ u{·%õþÆ¢G{ÓlÛÕ„Ú¯éµéý:â }& z b,2LÕÔµ„i_èÛ¶_=¤6ÆÕDcØÔc‰~ÖI2‹€|#2  ª–Þ !ùCªnIz’‡lOU¶ ë0Æ{u5ajÌî6G†È !DQP–d”¶…ƈ±K×úbG8e{sÙ˜ßKÄÌ ùçò8T¿‡n±ÕÞ1'çìKº-ᛕ u³TQØT#¶«Cjo\£:ñ•§o¿f†¯ÎÁ<}.oeN+ümÃj<ÖÓ¢W RwP(Ú–ÿ\fNgˆm«ðçðµ~5…¥f-'·€#m_¨oÇpWøWXq¿YÝ¡ë딚#q§({ìA/ݼ|MÁ½¸OAÚ©ü|ßPF;Ó:D )xoTâå".‰ø¦‚oáU;°î w´nï ïÞܶ»µǰŸêg¦¥›‡ûú4µ>¨`¶+èÁ>߯wxù®‚ƒ¼ý¾¯à8 ⇠~„S/ÌTÄ*~BýJ÷ö(ø)’ ~†Ÿ+ø~)âW ~A¿a/~‹ßQ‡LËïìÕô-I}P5[D´!3–L¸ízBAv+ˆ³î¨^æÏö/rmü^Ákøƒˆ?*ø“íáŸ9 û‹€Ò½æ@ÌXždþúõ4Kqƒæ³±«É% ‹b[Ñ6œ4µèzÖôWˆ(øþ.â þÉahÁJ6Ç%tÏý=¤–Ñ][{œÃöÖ-éÖŽ4¶…ÉKçˆ@868×ìÎ’³7 ®-D_˜¹ŠRÀâ9‘]µ²‰h†Q»ªéNÊâœmÁê¶Gœ’)ŠuüÂ,Éx¬×ÉWK2qHÓM6¶ØLÚüéÁkÀµtçÀùêЖ ›rMYGv\•¿ejÚ÷ÕMM×õ<Ì;3²"‹QÓõ¤ÞØÊ+}i56úC¹Ìœ¡?Óë®1M9=ôHÐM£3Æ÷ÒcÄ %¢Ú‘}” ˆ3R` ÷NDËé(WøJ§ÏBô¹·jG¢™lh!~ ¤ã°†ã0½Yyý/zèªÉatRMŸKëáDƒýªªuHö”Ì8¢.!»ào¿Á [s€tUçò9›œ£¢¦Éù‘UßdÚÑl¡He¹Û‘< %ȶ‚˜±U9œÔ£XA¯ÈÍô¾–!ñÿh®ƒ¿S4¹-¸Õ4}-¸Ã;±‹`)úxú¼…GÁyÈãOñÝO»e´s¬ “p‚pª'à ÎÂ=…ü ˆãÖå,Ôå- Áâ@°Ü= )ÐP“BÁ4_·Ã·n‹¯>¬±Ø& óR(wO@¡+”QRÒà]BWÑù¸eÿ^ËJáuøáñ&ˆx³ X4úÈ8ÊK ò™‡Ô>gÝ-@ÍÿM–ä¼DdϳÑŸ-`›è_AÿZúÏgh©¡¥ø"|¾FÎBNÁ;J†3éJ»&éíL›²‹¨2La^ åAïò*:ù¨xöQ¡µOa>k/»tSê¦e3‘©€äw—»¯`±ˆÞËXThcD ê8_In²óE 9A%“fÓ¶gœü¥|Ñ®¿=Ü5mä/£™Àä8Ö@ÏØp]Ñ­8–ç š¼>nÙÍN·YlyûN£^|INvÙ²\«)ºËkeù”EãI¤¤IÓÚGÈ|IÇ$¦t\GBÇ 2V®èZµÛ{Ž^­:n`–c]Ç#<þkV $CöªU/ˆJ ß8ÿoù¢c×C^¥ãŠ®/S~'8• Â`ŒS©ù<,Ò…êtÈú.’òÛH%ò1Ê‘¬OS”$OŠ s€è10¤àa9G·%Ÿ‘eó+”w…&N¡šÙSðϤò!>¶‹™'P?!Ö$oˆxAý#äW ?ïÁ(|GüœðüfƒH ØZ\9‚íGûÃ.sdUÚãùð çq3ìY¢åÔ9Ù¥‡„¤'rÊg\;vV?Žè‘t…#Ká­ÿL„+…J’†AyšÚ+’k²DŽG€Ü9~$‘ýå6Ù¥`ãÒNaPK7A org/hsqldb/HsqlNameManager.classÅWùW×þíbØ„Y$0vbbd-7:Å2¹,]pÄ€e k!u›ÄiëtoÒ5K÷¦‹»¤-Æ ÒиiÏi~èŸÔ“ÓöÞÑIÀTQÝœS£÷æÍ½ß½ß»ï¾ûÞüýŸoÝp u Ïpó,7Ï9ñ(nÙð¼Ÿu‚ÏñËÏ;pÏÚñ¿ù¿ù¢_—4ü ¿ÊïñðëœÄ‹Ü¼ä$Á7lø&÷ß²áÛN´àë¼ÈOßáæ»Ü¼ÌÍ+,x‰m½jÃkNÅ-;¾Çý÷¹ù7¯ØñCÖø‘Mø±?aàO¹yßüÌŽŸÛð 'ùþ¥ wØí-Óó4I~eï%@‚N$ÔT(®¤ÓjZ‚}$}#>®¬ªœ‘ØêZ\Íœž NŽN\˜’ས¬+Ýq%±Òɤb‰•~ 5¡d"Q™KJTH¡Ž§Ô•l\I çÒœ„†tvñFVMÝœVõZb‰X欓÷Ä% æPr‰Þ¶zK' ‹JZígÚ5*åÔå=Q!+WZÍDö3{çØlcB}:r3QW'¯©ÑLÞvŸ÷`È•ºk!“áÄr2½ª®*Å¥ð”ÙŠŒVêºyë’pŸ1ðü`ó) S¿Õ¹ŠãTMv‹nÞ[ìX—…õPù”^xphð’å/¿hÅ0§+dXF©X+æÓPàó,ø\¥^QɈ,=œwƒ\*µÑíÝ“)Uœ9¼s#kj4¶‹N%³™XB°­,L¯ÅdpÏ#Áë­˜fM$£D¯)kZ<)јˇN#6jpô Ò1!‹(ëêZ2–È”lö^4¶ø²Ñ þÿ×”®8tj¥T:|ò‡ª6‹ÎÉ’«Å€Q -ë dûÑ5E‰FÕtºótÏ㎔K•þá¢ú‡zzÞW}®¨þ«§$-‹ ³/û@4®ñ2Î#$ãFdœã§‹ø˜„cÄ® OΜ k˜ßȰ ¿¥kFd62=46™979345Ëâ7d„Yü;¿Ç°Œ?p3€ÈØà§»Ül¢OÆ=æ±EBýþÈˈ"I™¶ÿý¹ìò²š’±…mnrÜìÈx”qOÐ68ˆˆÅ—øUšgí·¸Ù¥ëM壔ñ'\§Q„™¿Í²û2þŒwèZBS›§ WE Àè¿Ð¶ùÏÊ{&™?ºé ZÆx¯„ɲkkpÏ•K×^íöÖhp­ûï=•?%óžZK4èÒN¬+tÏMdèÊ׬§Mhdhlp~$29š¿È[ÓÚ))¡-<><1568ž7P[SRj‚hNhÉ)ÇÒì2›Ì¨K$VÖÖÔ= /[ÆIE{¸Í*+5¨z©Š¥¨‡¼†Õ1X!-_I¿ÝØŸ.¶­ógÍÄ2xטðÅ2„­q5±’¹ªÝû©Hœ6*ï·Èè¥o¹GéKÎ7Π>äúiT+<¼åéÙÃûRëi·i2ª‹Û¢¶Ÿ?!lÔÙ‹°º­Âê¶P”ÜVøæÐC|8¼µ>` .ú7æpH×£“IèÅTò‹ Íu µÚty!Š“^4ÌYG±$Ä4Už¬Ëç—ÞAS ØdΡ™'«ëªXº¿ »h™ÝAëX€¼»sðÔÏçÐæ›Ý‚d^˜£Ï¡ýrži‡ë[I«#¿–L2((õXÁUá`˜0×^Ï&ŽÜê<§6DFìâ(y}ÈõpÇ<æ…:sxÄTH\ 1jMjÉæ5\6øõ]¦¬Ù$Þº½ã¥ööXj Kñ‚%¯(Ev]ÄÎó&¼ü¯"QØA&-h4׉øÆƒ9øµ˜µs¤‚¤âÂ$îUŠ…úgD°û¬þw1âÏ!ðFÜV¡<—)Áòfírà]¸ÜÖ@é+·uߺÜS¨h+ä¶’÷&K~ïØÜ¶ '“Ímæl* «¦÷pÖ†µFN–…²Ø"bRí3qm£Æ¤W›Ò%‹V ªwqrÖÇÛº[›o½d…R+E‰-ÉÌ×4g^ So­unÞÏÍ]ÜÜÍͨÀe|H‡ƒàN ÷Qâ|„›2ù^¦Ý'ác<ùxdîgÊÌð‰ 5ŸäÑQ Ç‚XŒOIøt –àAn>ÃËÇÆCÜŒHøl êð9 ›$|>ˆz|AB®Ëð O¾Èì_bmñeŒòè+L{„G_å­Çdœâ$eÏ`;“1.c‚‡“2NqZÆã2ÎÈxBÆ×‚xgeœc§$|]ÂÓ2¾Áú¿)á[ž Ðµ¶ômZjHNf̦½Ù›Rý½MÖáA=ÛÔb¤5óð5𥭠ö%ýÄçÙ• ÙƒFª?¡™ýÝÄÈ´6>#©§4TŒlÛ@:cê -KËÂNeÆFÃÌZÛ]9~#»e(•Ô³}Ú žØ«™$¹WË&2©”fR¶ gË5­]‰ŽÎÖ݉M:”&2鬥¥-Ûl/¸@R[[;­[ºm¦yH­‘ݦ™†Ö›" d#ë8CÃ~òÇ1{Ñ\—yœõ¯1Ò†µN€7Ò°\Kdú‰?Õ­­š©È)²“WJ‰Tèjé€nuYšie·Ö^ # É}ÚÍZSJK4uôîÓû,Ò_J<}ûÛµÁn¶Ï>‘{¤¾ÌAÍ$M«#…ÖuéÙ,Edõ\e…ú[2™”®¥WKx–T‘)NP«"sÅÚèÄB‡6À–®(¶_[ÚÒÍ=ZŸ^lc:è€kî‹TlúìJìjk íèY¤vÍëôn.…Ânã™¾Ï ¸ÈȶÞ4dܬ¥ô´ÕéIïOg¦·šz¿Ñ§Yº}€´wøB6k©l×,5[2c³€A¥H]à¶t¿~ÈVOa(¡ÕN²QOf§g›Œ l¤¨«Ea!÷Ó]0^ýõHuY¦‘ ©@ÿÐ`ʵ³’ðV ÇW–Ðð4©^Ó—²1­àzÜ à:lQ°ƒ›NnÚ¹y’ žÇF."jRFoÓ&rºØ`šÚáŽ!kpˆ€nêÚÂ×l£Z†öìÑMmجàZlRðm|GÁ ø®€šyÒŒ‚ïáE6ðû ~€*ØÊf@ZÁNì¢cš#Ë×úS|qü?P=—+•éuô¿„Ÿ(ø)~¦ ƒAº& ~Ž—ü/“kÉËý/ (Ÿí§‚_á×ÏLÎìw«‚ýH)x;’~£à·ø‚Žt/ú´b#;ü{‚Ò«gÏJøƒ‚?âO«?s^ ¸fòãZ¦¿BWÛÉöô/”M ÓíZJÕœ‰©_paÎ%ŠßNâk%üUÁßðw-Lä¤ïè#¹Y°tÆsŠeZ§ Ò548˜1-½¿õPŸ>è¤ë`ë¡AÓª‚âÕ Bæ œ :K—“¡+æd1¡¹7€4Þ¢›'iM§ôÀAÓ°t'çå6ÎË~mpPOS™©‰$æ^ŸtuJ¬LÓ,Û°«…d#»Zìä.[‡vÏ_=‘‚ S†]õ’uþÖûSn ®›?7l&“ܤN¨~~îÍm \©}Ý=­ô"U‚Ì߸!ÙÕêhå8d!¤Ó9’ä« öÐM3c6µrK²ºÓ‡‰¯ÐÎyHÐÛþO]ùŸ—n¾%>µhñf2iJ†’o¸Æ=¦xd.æV ÇežÕó¬VÏʽÎreÐs©Tc°vç‘yi‘²[«}|Û¨<™CiË8 »çxy¤m~¿:]öü™Ò[v==+\ƒ2zîRãçy»§¤o÷TMìžJ‹Ýw¸ó­öœí¾Óž/FÍtÛ<=4ßV0ßNíu®Ü·§Š@mˆþ¨ ç;hTC¼T½° : !ê‡'ê‡÷œÏnÜè2†ˆÑC½?Z3ßôºV|]tÖ=œ±Ýõ³ðÑ?àžècðC%uÞ£œ„”ƒ’Ç„¤ÐîÐÊÎ °cÁöJΠ„†JÒ».Ìr#¸œºÒpã1Dæò8õeá•XCYlzR¾ýˆWÈ!| ¢0氆ΠbG|!ï$*sbX8ÆÏaôS{1”…$èø7T {$ HSôR^E5Át`/ ×™»!ÛÎñg\ýêQ{#ýUëh.’iÔ-:‡ÅL«n?…%G±$~Kb»=î:ZíѸ×˲—eìâ$Âvt.ÊÁÏØY¿_žÂ!\Û"aQ¨Xºfm¥ˆ³Y͎Õ±s¨;7 ¨½â¾u9ÔÅžÂ%d‘/¡oíJ¢)4©¯ÀÒuáÑü2¼‹*§ 30è-áj¿ÊÕ^G®,£p’ËȉKÉ RTBÓú ¼¹POÕ$*ËüxpÕŒ‘z™ú{kUߎTKµ3Xºb-±–kê8‚ÊjíÊh,LG:ÈqlöŽòXÂzïè@š‚èµ¹£.7±cQ4VV}ªXí¯–ì˜› —lÉÜùÛHè8Dï¨oÆîRúqX¯ Áॢ JD¸ ¦c½§"‚Ä7¥£—|9øèº¨ªïJ¢žq4ä°jù3ðMRODcË Í¢*úŽc±s(ÁŠÒîSˆž­(Íp.÷’¥$é€ÈwÂO¥ ÁC‘mçkéç-bȚŨ*>!Ž\¨Ž£ÔÛì÷6KÞfY•9§¢qU&ÕÍ•îÛ~Ò× †ð5ûs¸_ ”ïFCqçë 6æƾ(Oi—vϲaÄTé(H¤××,M³‹Óì«gØ/£ÍsˆªÞé8*x‡ã:JÛ2ÒBîßaûÍ8ßA²;}7’cj çˆL§q­ê?šç±]±­ëÁ¼·*7ŠÃ¸Äúnlô Cu'ÓD±ÃÖôì‰üq^Åm²çiH§iI¢ûL_Â%‘…)ÔþתÎ#J]!€)Ô õe‹U2ñU¼±dŠ~2¯¤)½™°ë`;F=_š…dŒç˜}“éL˜ÌÀK„'t5³Ê ÆÝ4¬:‚ Ü𑬴%ç%{ܼ{¥#â-ŒŽµwM ‡æÉ'T5ܤW @¯@¬8å-t¼º·º[T¸^‰¬tÔ½¦·å3ûÌò$âcîò;ñ.w¹´ñÿ04òr{>ar~â„£¼QqË'ÑÈäE±x¨i—Í$¼â–ˆö8é¿|+BWP³=¢*°‚¡8·”¹"ÄCÍIÀ•Ó¤·:$±€t•Cò®rH±Òj{†ñ)¬±ÇÓ+k§WJó+7Ø+n½aÇÞƒ;\?V¸ç"ó×Ãú±dž m8…–³vT%J–W»¡ðCØ$á½D9’/àuDåÏB¦ï y‡·üön®pb¹[¥ÿ PK¢GEÎR èPK7Aorg/hsqldb/NumberSequence.classÕ[@T×qìã²\pY…E”(,DMŒ€‘eYu  À"bcÒër…Õ}Ý%J“TÛ¦mÚ4mÚš6c“¦-m¢­&Ÿ¯À«6.ØÀ‹è)cHc9Ë%ò‹3¡qf¦Á"0+î™ 4É£Á†JX> "ß“Àºé XY!zšdؘÑà°²…6ØÃŠi²ˆKhXleK¬¬”MŽŒ&Ç=ñ¸4Πüu±øpÃHâ†ðО†î±È9Þ'ß0&Gƒr3STŠÈVæd lE‘nœ1ýѨ÷†¥DBN0¸Ì¨A“ê’¢Ò°¯Òæ¨+/8ïÂc¨‚uà$ù\ ‡"¡d¯,Gä!dïB7I)®ñ…H(ª£ÒAŽæ…¢Á¸‘£I$II)0>ŠäÅF‡’HJ4]°†Þñ`˜´„žðiý_—S¦Úå½ÒXõYZBÑPòj¹Õ5;0ÞØ.+èKJÁý]Òh@ÚÆÀb0ØT}I!¸ˆ[¤>?!'¹iôÈsiú::æÑh–“j8p~u®ߪêšK<±B\ãۆcÃêÒ$ôáE$u.à|ÛLKÓµÆCÃ#ÉDÖ¸Mʤ‹–öÊ{å8eî±2]>ÚÓ°->„ì¡­Rb¤ONò5ÞXd4Å#Æ5Ö NBt|«Ó"Ô''¡X4-Àª›Ûö쓃I% ò½§“A1ZÞ'Ý(5„¥èpC_2Š7ãÍÁ DñÆÂc‘(eêeà GFP\„"”-‘Q%®Ú¾”R´¯LóLI“æ,öðÈqa»ž³¥éáHËZ%ý©LWÁP¤¨K/e¦Wúˆ¥d‘<»P¹¨$‘®ÄTÝ¡åaJ—#•• ££ˆNi—àÔ‹µE ;摃ûñ$Òœ¸Y¯H‡Á7]ÖaðF' dP­sSõ.ÚWR´z§ÃLíj[\‰ÉáiÚƒ¤Á¥È÷Òyã~’bç †CA))ÏIù9—§/_V=ygKÈñþÑ!E+DÅp<‘”#•JQñAÍèÌ,æyŽW¼Z”Ú©ŽÊ2ÆCTý º]…–`X¹ÜDx#²²r‘-eËDx+ÜÊ`IÆÕà;”G© DØ1Æá "s± ‘U² +[.²¬J„áÐp†7­"|>*ƒ8°Ëp%[ÉVaÌæ­yÌ•ÌJiÛ‹—jdÕXÃÞ^Ÿ'àY sÓP‹›éóõôûº½>ÞïYÜÅ ÇÓ'Â1¸Wdõ45÷<½ Ç€?°U„1ô_.Âq˜À#õw£Ú._7Jä´ Šð|õvù»wx:ûQï}$%tyvòùý0!ÂM$döz;}دjDÖ@–ò¶øº}½èb»7“„ÅÓ9àìû«Ý·ÙÓ߉6;ÚòqîÉìé øzQ ×§¸)ÂgaÂÊV‹¬‘¢¼†­µ²u"»‚])²õì*\ð´‘Q‹w[gW7¹’$k½ÂôäÙÖ$BœNd”†i:‘G`J„[H¼ô¢i)ÂSäD³ÈZØF‘]Í6aÆ)G‘’# m¡áv9ŠHa:j<àVæ!A~„`–QffbS¾ÈÝlem V\B?b°(ë‰åƒïõmþ-~:Á¥s¯Qukü2ˆ¦6s†mÑœJtO”VÉñx,Þà£d.­öÏi›zm ^KBÙ.ˆ© Ñ9o;4¡:jJÒè¨Åš¬«žÛ#æ¶ µp¹³Ú;×¥·éž1)Ú’‡ð>M*×qª‘¦.$}óè’1MОÙÜ0éBC¨7”Wû&Ò¶U¼<#l*]u®9=+Œ,jPé;²õP»fZËÛŒ°Ï¹’ÅøÊGd~¸ÕþùÃÞËÅ ]fПHÆârƒrÙnÅÂê#ïô<ÚwJÒäa%–ôëŒQ(¦ÇœˆüÍ“*/—óÄȨ;ÍËLrºµøµ0 F J©Tñ["‡îuâ¡À8‡XÏ ãó9<ÀáA±%(ð&.3‡·(pÚÃ6ƒ#}ß5C.rŠÜ³ÀÜìaÈ™ÜI0užFˆ°GoB;ä\À)³Â›ix (Šn劣¢\„ùŠ¢Ú:TsZù6bÔǸÐó(bEø»vÌîºi°¨ØX¦ÀúÉß‚¿ü¸za“â7(qÉåЄ¿½ôŠ¿›ñ·¯+a½¹lm“à)‘ðBį(;áÄkŠ¡˜ðÄ—ÖMÁ’£°À@²-:{JŸpWNC™»Ä< N·mÊO+[ ý/ë9Øž?ŽWÀb2)Ûß™‹ïl¡»¶Ô2 KÝ3°Ì]bš—†·Ãm\ƒˆÿpKvë ÎÄ^É™EœIA1ŸâìÛuöbÎÎ'öTàMè]ºP1¸&q¼û¢j*5¡÷ÀºšUÍYX>8 +4‰÷ê…\MÓxïƒ÷s^?4¦àÜ¥²˜ Oϕ圅ªÁ"8<‹­µŽ•3°ÊŽq«¨uÔ¤p÷ àÿZ³.Y?—˜ |µAp g`Í.Xk;25µ ñΠ~EšÞµ\üÊ£°ž ¯O¸Š8gC§‰/mž€\ (ØÏ€­Ö±‘f¸¥«Oé镦óp¿>Ðä(@Òõ`íçÁò§k“nPUúšk€‚Z‡‡tOB±a?Ž6ÅžŠëÑsxs´+¬ÿƒ°máa›„¯¹µ‹ePFÌí`= sû9Ø×ä°o@úÝ0¡'·šþ9y'yÕ†ø½¹3íP|ö¹_ä¿f_ut³×£>nQbÃ}¤¿¼…{¸Å ´HwßnT·uü3Ð1×t⬳+åEw}Ê G™©×”wsT‚ÁÙzǶÝ(²Ù€ënÖq7ëu7½í³\_}\i)±ËÕ°V‡²²5ö}YÙeûþ¬l§ÆÆƒ,®m?ÁÙ7ge÷hìtög0úÔsî64«QHõª  ö*™_{é¼¶Ú«ÚAíU»°Wµa«j„«°U!Zˆh=v*Dˆ.Ç®„h ¢‹S¨XÏ:zÏ@ß´wב£`§]V"b5aÃÎ=¡gµòÎA«~^ÁdZÔÊ ‚¾þøNÚÀ¢xXç"UGî‘ç‘ãÔ_Pš kÝ”h»§!0 ý©6ˆ—‘Âú>¦ëkBé«r»fa‡ªëˆû]ˆ•–¥éYLz&õ·H j¡°¹Ý¹³0À¥e>>­2ô›ÛJ߀s®­Od³eRl95[ê¶Ör[K]ŰÔpW†‘ò4#v2ò® œÚ®8ëv» Á$S'tÉ*.¹D•Ì~ZqR߀ƒçºÅmš†k5þ'u©÷˜¦Qæ§æÒÃp N,å(–œÓ°]ã?œß£òsè«–ó§pfAx§¡pƲNˆNˆN//œÝôÈ3aåx&¡…yˆ"¾šyˆ;¯¢â%ˆ/1à©êqN€PBSq2£`èe—¯ŒÐJwZÓcè=îŽþ/vÀŸ©-†gêjÃ3µÊð&]bÀS;pUb.Ú\%fC*¦²°(c/"¥äŒž6I< J›Ý¸•k'`QZ–¹s1•¨¤x ¯%¿#VqÜyä^|c¹qúŽ;³zc†ÜÒfò`Îpöòιë,ìÆGåuôÆÀç¶Yyk`âìGo¢W‚åXi-øÅ@° Ó™ fœ“àvÌL‚=˜µ§xŠ~å6ws›=îZÕA²El$[ÉA‹òu¢Ú"H¶’-‚=z¶WÀYlª©Û1S(’t7õãíìpª*—Ðë$ay¬zUà8\£(3Y£!BCˆVL‚[•<•óKºNã¾dÍJtì1ݱ v¾–c¥šc+Ãåª%š)j†Áe4ø8<Á  *¸Ÿ×·?ñè#T­Œ^¹š ¼u¼j6ºn;¯ïÆnè:ÂgaÏ ^XÁ30Ô]ŸzÍÒ ºÕ$à›.ß Ob÷~J<ŒyOJ òfjÁNå ç{Þ¨e1d$зO(ŸGeØ}tËÊ|²Å­Å 'MZ-¨+W:‘_f\YZIXݸý•©(Š`-¬E—xòLJku[Æë¶P/XLÛ€š~•ôÊ,O þ“<;?§?b֪ߘà˜ïÊNðçC‹[-»€3õ0cG÷C%ú¡]…›xz×\üíÀûœêbcæÃA€Ïë›*V\ÅïËÜÇ`÷#°WûPŒâhCfeÒÿPK•\y¢ óPK7Aorg/hsqldb/OpTypes.class]ÔW[ÜFà‘ÁtpÜ{âº6î݃4»Œ‘F‹FZÀM^Jpl°§7;½÷Þ{¿ÍE~@~Tž|3ZàlnöÙ÷Œ¦œ3åŸÿú›1ÖÅþ¬g¿×³?V«B%æH‡µºS“3³åÉÙRyâæh ¾c[\â~" ‡Õ¹¡ŸÊh‘ÃÜûB»¶µÆaõžÈóÄ k1œ–AÑéBŸÅèSâ‘äݾíSç°Æ"x b™@=zyƒŠÒMmƒ 68¬=ޏÒ2–¡Jéëð$/¨PÇÒÕUmM˜Œk ,u¯q3¬E_"T¶à‡-sê&Q$”]y+ÒŒÂ~•ØÉÛPE|РCHPja?ípØírŸG©Nº1Td?[á°ŒP[é°¶Ø,­*ºÊaË#ɵ,U·¬vX Æ0;Q%» ¾ÔvÚ5XF>Q®)‡ñZ̧ûü”ÆÖ!»(Lb©DU|=ò‰çJ´©*Qà±ÕFLÉ=ÏüÝdj•t£ê®qó\âEß®n :z²$=Ûq«=ÊåöÛmøÖ—½"åQÁx»Ã–¹\‹þ¡Rzbv`)¨?÷ vbç ‘ÀR¢t>¸ gª4Ü ê€û~Æ=æˆe\è²ÅRa¼؇NR§*ñ-sHíæï~“¯²ùpØ¢ÐÚ…}Â)º«X楰íMT þ/z·ÇdjþÆÒVøª!°UÚè(ª–Däó¢õ1´&JöeWê8vάÖÃçReµ>XÀc·'Íî‰DªY ·"–Yf§Ö”ó•äNã¦d‘l 2ÂÜ”ª&2ÐYìPUÛÜxçìW1—Ê.žcÇÜ0ÉîIåÓÙ%éÁß Ë^š¿|Àü=oê[²g ×lu©r´}”M‡]V€tìy¢”â‰(‡5W"š6b q³ç¾(f¯È|s¶Ü^Ñ”ìl*XÀá/¦ §R£îÅHä¥]Z /‡]s‚á„Úï.¢Òð"¦Aè™¶‡â’©Cå_6›y8wÝ6£+HÏ—´#¤H€û8²ŠÇ¸Õ&t!{}žÂ2NT¢1ÖÍ_Á!¬¼’Šë m‹>lΞÑ÷a/ÇԱܵ™ë#C¹p:¾==:ƒK?^¾UÎM”'ÇráÐøèð,ÞXM“%ëd5¬Ö<éæùfup=qÜHÜ7·À­Ämðâ¥ð2âåp;q¼‚x%¼Šx5ÜI¼ZK¼^O¼ÞH¼ ÞL¼ÞJ¼ ÞN¼¾‡ø^x'ñ.x7ñx/ñ>8G¼>@Ü$>&>%>'>Ÿ$>Ÿ&>Ÿ%>sânØ%ö`Aœ‡ Ä=°$>÷ûp@¬à¸÷G°&Žá„¸÷ÀƒÄà‹Ä—àËÄWà”ø*\&‚‡‰GàQâûà1âkðýÄãðÄðƒÄ“ðñ4|ø÷†’´r£œgMcLÂ8ÎHpdo‘ì™$¦rΠåà­´„³d<ÅÍinΰþ¾*áƒø{èa„;^KÁG8Þ„o¦œc`ÈÂÍ¡e4Ïò,’·¨üV*¡œ­3Ù*"y4˜'Õ"ç}W¼‹ËEzž:»Z ¤¸† .Š”ÒQM1UyPy8¡Dh™Pê[ýÑA% …Ó3ÑÈ8åMB ‡ó*…³5Õ0ÓñY“Š+©`+DZè$.|ûäÓ)¥Ší E'â‰i~¿Jè`{ÒѨfß r9‘ˆ'Zz¸¥zKVû–úÀ¯™%˳E…ñ¹ªÊ­*Œ[¹ïfÎ7Ê}øé°óVQï‡R!Õ-•Ë¥x'¼7ˆ™'j%ëÎO‘Iµº¥Ð>EeMbô>LP­~š? „H±"š©môZ„¢É܇­ÍVm»`ôÊ«à@Dß7{åwàIÃe@å2\ƒºš%ì[Ö”rÝa¿…âN ¹ß…÷ Î:§<•‚K 5l.ÐÜ’EAô>êÞOvQEtßmSC;WÀm‡Åä90yHWbía%þ5ç~P?ÇÏÅåyI5Á:ÕRëçàC¦vaµÏ2Ç#|IøošÔO¤aêǨ¡žRŠù0õ‡¨¿úýÔROc3'¦õG9•¸½ßm_€mnï÷¨ó»½ß¡îv·÷[ÔÕº½ß Îëö~›ºR·÷ûÔÙÝÞo¶ûT“nX„Û¯«&[+Œl~»¢´îpöJy x ÂhS̯@ñZý|X½RÜýb‘º.ÃÚõŸ[…h£FtV'êDÍYIga½>ÙtV½eÊdóØ)l-æó:P˜7›ïaÑý²AˆäH­?K—> ׳g£¨{j3-Á¿"„éôõ‚~®¨q®—‡ºs:ð‚kݯƒµFÅ:_kÓŠX?¾Š[7kný„.ÔO7ƒ‰¼zŠé?N·÷…EhÎ^NÝ' †0é†|ó+âS«põž[™K{žî÷w}–kÜêdËehñ-—a“óùïéBšH„™­"„S©o¶öú›2°-W}uŸÖí¸MرFåÜ4§éÞþµe~³‚©JqÛÂJì›_ûÓ:ûÁ^Éz ^¯Âû™‚sçŠóûz•±Mº–ïRí „Óª±æ>çÄ^IÝgõW¼]°o&º»³î±(uJÈ ² Æœä_MÝyÝY[…³|…µ ;ìøœ!ÊL†(óÍS½D,–ós—›ºÏÃÁUA=sñƒ¾³´½N{I.ê¥Ô(°×)s»‹.’nigù|lßœ’žÄÑ]Õóp›:m»»2Ð^ï?« ž×ŸÏRÚó¤ÒßÓAmµ©f¨Í¢—À²^ÜV¾åìáKð¬€8O‡àÈëj²Š­óà»BiA”åÐõL¼jã± £mïd´ëÒ,`Ý3ùh›o'´Œí2\QÑšŠ +UAøqôtcÀg”{ °O¹½\׃*Téc õÏ+‡Ê¦|8'îl xBÄ\Ÿ ´6g`O›åì­¶\‚}W!p!_ÈÝùB6²¿Í¢&ÖmVUZµµ€0øiž0øQaÁ„™wçˆ#GJJ$ï^0¬®™{®VEÏI¡Gõcy>ž€ÂkÎ@o›òñº3Ð×fˆn@›µn¤jkµ-Ûl B›ŠÐ /y-ÂÀu?„Õ˜½Ô[¡t vâú ëýëýKàCWÙl¶Cæ—°ÕWí°xŠÁl‡/Øá‹Ãâ¹_RƒœkUV~FåpQª3u˜v‹޶Z[-9'öÌCPÄ÷ÎŽÚrtþ0D`›‡;¼7¼r΢zwÝSYj·Ù’A ëæM Õèy:·{­$rœ^«×2kÉ—`Èk¡ ½ÕÆ#+ì^›×^û¶ºEÎÚ®Š‹îÁ›p'ØÈ>È?Õklu>ËÙå9x^OÙj™\} FjL8Üî3Qè^ñk \‚JÎ×á†`÷ ö2·÷ë¢Ò¼oFµÌ÷‚Nx®)g¾yã§ÈZ·÷Áe}ŽŒš=GG-ƒ‹ð† *á¿ ¥bÔ»ûÕáýúâý´¸CŽé‹c´(ŠôíúâvZ,ÝKhsõ6éjõã–€­¡œ~–ÀNA§áËâ0Ÿ§~Âx &X†?X°þ`!üÁ,þàrkë˜ks0ÿŽ9)0¨2Žé‚ý¦>_ed¯ÀWt5¢v+uÛÊ„ú\Ñ"å+z¤”‹××At:ò-ô—֬Ē“õ7Ò‹Rið5­tÁu Uåp|ÂNúÍ€ü,t^ƒ‰Qׯ«0ù,ŒPÌ»ñ=®† Læ±¹ØÕ¨K]MúXrùõq™«Y»][ÄØu—k¯¶ Ÿtí×ÇO»Ú=®}¹Ëu@†\AmhsõêÄ&øÄÕ§K]ýúx‡ë >nuÒĹ´eÓy× >¾ß5Ìcñ½ý+PK%5·¨ `%PK8Aorg/hsqldb/ParserCommand.class­\ |TÕÕ?÷Λy“ɃÌ$$a²°/! bÔ„ ¶hH\â 0šdâÌÁª­ÖÚª­ÖÖ¶‚ ±­¦Ö¥q@©Kµí¦Ý¬vsiëVÛê×Ö*ùþçÝ÷fÞdQûû5ðîyw?÷ܳ¿À>xða"Z$ßðÑoÅ$=/ò³Pd‰B1Ù'‚¢ˆ«Å>Q"J¹:…‡LÕÅ4ùÄt®Ìà3}b–˜­‹9>Ês³0°ŒGÏó‰rQá•¢ŠGÍÏ ÄqÙb¡XĽÇó‹yæ \­æ!'úÄIâd^·†‹Z.–dÑLQÇoKuqŠ.NÍ6õYb…Xé£YbOYÍÝk¸hàâ4.N碑‹&.š¹háb-ë¸h墋v.Ös±‹\œÁE›¸8“‹³¸8›‹s¸èäâ\.B\l梋OÓÍoa¦Ä~ÛÊÅ6."º8Oçû¨Qôp½—‹>¦LÔ'úźˆù¨UĹ9ÁÅßÅv>ó…\Ý¡‹º¸(K|B\ì£Mâ^éRžúIžg®ù)Ÿ¸L\îÚŸæê>ñq%Ÿåâs|!We‰«Å5\|ž‡|7¹–‹ëxå/2;Ôð­_Ͻ_ââË>ê7øÐû~ûª.¾æ£q#÷íâb77qq3·pq+{¸ô‰ÛÄ×ùí>ìúM]ÜÁ›€—¾å£+ĺø¶®Tê÷PÐßyÈCÜö0·Ý)? ¬°ïüpß–(ôVg[m±ðÖ]»Íï oÙ\±Zbg?Ï,Èhëîêì†ÑH„ÇèèïqÇäóº7wÍO°™êAC'Lˆ½˜¹'rW(ÑÙ7ÐÓƒ¦n2ß;·Dbñ„5h /rÁ@ذæm‡yíLÄÀ 0+ÜÚ¾µ3Þbõ1‘ëÝÑ(kœšU;7ôDû¶n"ñΞèfA®ËÁµ0ä#r±5'¾³/ÚÑÙ½yº›ÚÚ2›{ãqnîÙ¼“›[Z—e6Gc!4¯]=btÿV(´GùÖ¾Ï×ÿ˜!—?0äå†<ÌoOòÛS,èî­ í+ÙJüÈ?–?1äOYšÆoO3=#nÈ_È_2ûýÊ¿æŽg¹ø|ÎÏó&¿•¿3äïYªþ ÿhÈ䋺|É/Ë?òÏÌYaýòм¸6·´³b‡QöÕ¯YYúÚ–†ævTV4´Õ·47¯¬G%o /ůòJ¯ñ"N³×/-®4“ I£ºV¬hÌlv˜ù¢3V¶>Ú3ÐÛ×Öµ-ܪÍЧÊe4Ï1®W¶Ó”æ[Ä佑&=C¦—GáÕ0׎a˜Ù&öe 7žÒ¢îDôü03`†Ámµ#ÐPã²ÌñíA¢œ OHZ©ž¹™î‡ì¬ÇmÝ>i¬X(nÅõa¿úXŒm‘¹­CëÅãÚÊÊ>6Ää ô…wôƒ]ÂÝÖYKFŸ%åÄ?WOsÃ…ìS¸? >Bbe,e>l9'cfÄ4 ½rG¸k ‘Á%@7àEgcx{¸{Eâ–ÈËÙœÐFÆ áÈǛ‰3› Y™ËØÍŒ¦}Ô(¾“õ룦Sî˜æS/°Îî+X:""Io·%@L?">F3sæë^feps:±ÔfZÂÑŸ­†õ ‚÷ÇqC<êí7É~ˆóÉ•?žîÓÊNãKw…º»G°„¥ŠæáZü,3¶"Q¢Ä—h¹¥Ž82ÞÁ¡iýˆ†Ù£ÕºÆY™Ã§¾žé:Œ7‘óI4Qqš?nr 4RªIÃ¥qœ ‡p._¸·?±ÓŒ@¨ M“ö”kÓa)ä5µA¶"["0§æ’'–7±aÓØñ˺plg-+¥ Rè¡?l* ŽÛ‰ŠÛ~d,Âj6n¢GãfÁŠSÆ@=ÕÍt†‰kÌ삤{X>5†Fc‰1‰5RhR4YÑ´®±6 7ôᆱèâñ7þ8ë­7Ý$ÇzùVGS8¶ÕÙnOXa:\ŽŽãþKXÚa.ûN™ÛO²9*ÔÓãh>aÜMÆa%ë˜yÖr«ÃNšÿ¡×;n6ËF 2žå”q2=)Á°&,ëI°Â±³#+ àÓ] Õ”h‰µ†·Ã$9uC¯Â•%·F%±ò™MFY!A¶ŒëàÊh SÛL*sØ”ÌXcΪé}´ÄšáÛŽŸ½JÛì¬!̉6ÅÔb&ÛË”p*i|ß©°¬a ŽeR&‚JTUÿ·×ok?c»n “o{iâ&);a²Ûœ}#Lv[æ¼b6Œ°M=Ñ­Ëúº—ÃB™”lV!NÙ |ˆ›Ô5&5>Þì7Š)ëeJ´o‹püÒÅI­†¸Ju(7*ÛôúlåŽÅ<9Î)rõÆ(†¼æÚP<~a4ÖÙ›!Öeú²Á™–µÖ¯YÖ Ÿ£qÔ°T*’Çc§Ê1ÌêèYæ`>Z pÌìÙØ:Úk @ý¯ õÄÃcssúš&˜:ÄÖrÊÊŒJM+üÕ};cß²…Y|ÓØk/t@Ä<™©¦” ±´ë AßèàrÀ9Ì]ÜYßTY^š¤IZ9D~4¬B¯×”ÜÊý´ú.SÌWMè#òõaÒ Fó¥žÇ2óøPéŽ8°b¼š°GCcÅä®`¥sZSåT„;:½ÃUÙÖ|ˆ;ÚñU¨©ý¸N\SscÅa*`MqØD1kÒÅz£"Ú$rS6v¦©:½QTÇñ¯#X´“ÇD F4:D3àj4iØÒ¨ÔÌÚ$­kRøT0>­×›UZ¶-½›—Ä0MÖéMìð·ÔŸ‚Zpv‰&s‡€X˜¤v¼®W›m°7›mÜM9å¹U 8£Éýu0—nê¨ØGg ³Ú:4®UZ5“2þFæì-¨¥QÉ&q”Ž* ›¿CàMlÄ'qZXÑž©ˆÄ ‹AÞÄÓ©ž®ü–©êInœgáÿ6£§Èb!I瘧°)ÔdRHÓAŸÎ½j–ìäYú·:Û¹#Æúc 1H_’Fhñ½Ál(£'# Ñï›ÙÓû¤½¬×±¬Ø«·=^­)^´ïÇ{1Ôµs¹îOï2z‡"{‡¥ Ò„Å'T S•šv„ŠËs² Ø ¾•ºŒÓAò,@—uùIÚÜlrF’ºlî¨JѸ»ZKWÂÕîte lœ;™ïÞ +çÙMÙüû*ÒÖGòµ]äõûA)6ˆº>DšVí´B1gŠöѶ&^áì@þ!kUžmñŸg‰˜CjF I°›Õó-¢g?õæë{(0jà4·uçZe[WÑ/;èe¦hWMú1ÚTémf^þO8YÞS!]óÄŒcTF^Õ©Ó?U·0oò_¶Ìéy +ÌŒ§ê°ùÈ…Ídyüx–™:‚¨&ˆá~ qµâ~L”*-ÎBßÝ€[ð¼†ç ´ó;›Ïbb±'Å3Ï<Çáù”«°›A¬ïaÓØŠç9%MîWÕÚ¦WnEýf@˜t›ÎóñÂó ´O5ÑNRSåaš‚— šVµÕh¦ü/jÐŒ{á÷Ä’ß §Æ{#;5hHh{¨”¡¿d&T>JIÚž¡™úÅÒ°þå¬Gö~äv§ý¶;-½]@l¼AAúû“t!7Ë•DÃÄ$íh®¬bß.¥œ=¶Q:ö²ÇÄM€£ÀŸmnÛZÐçØZ8óðIcœ[Îøˆf{Ãù¶ïª6¬Ñ,wrŒ-_ôXf‰·Ü†-mÂ`OEsÓ´Ó~¹È~ù„ÏÅM•®Eìlk(•b1Irz¥éKšFÀ²ªñ{ý½ÒÐr½çŽì—î ˆSO+\ç—é \bià kàºÑ¸„õc³¥«R8I—6)€«ø$(Lw.-µ,”–F> {°\Ÿj¹¸¯)’]MÓN*9¡ëR{—ƒzŸ2wrUköÍÉ™)fÌÏã8–=ªåké²6…â·«ð¾ÜB‹mºMG0ìêG ³àÄ=hp̸sì6j5ƒPkÕp¾ŠSMhÒ¹É ~ùô#j½CtEG>Xë3Ö²÷Œ½l€ÃéÑ•àäÏ—€+—ï2¨UBû}U°t»]Uã–nk¹{Ç\ÎUç´ù–yJÒÕuŠšuã`¸¬Æ2€kêJn&wzº<7uY%×kÛê“ð©JøP£È*!xs×RË 8ÍM·¶Ôô…Ò’Ñs—òí±ÜñÌ9,w5îJ´~¾ÆtÁ® ºm–~;m÷ýÍpì<äüQLSÚB©],¼fÛ ü.®Ý‹‹¹n/G_Ì®O›°hÉ0ýVa®NÿöyŽP^æ{)ÂÊiGhÊ0 Õ3L¹h˜ñMóz½ÃÔéÙ#ä+-)-¦ã-â(mÒéôhp%ŠDÖš:gaA®r+æ¾GÍÃ4KLòå¹PéQ xN*¦€Nÿ9B%šÆÎÝ»¶çá‘eé~Ðâà/¥ÅÐ}‡'4[ñœWñC<ˆÜk”丒v=àBÔC€§£Ï¸°E5ÁF±ð&@ĦZ—¹Ÿ@9_v*"&u–Å–«<ÒGÐ~“%¸Ó§±»$C4YÕÐ>L#Íöml½f«TÆ »Ìü‚âÞ¯ì"Ÿš¦ó(§Cbá°pÀ5ÕöG0u¢pc—:Û„mv[–±C+qð£ë?AÍZc …Ë{øªýþÙ¼œM“¯k8Çd»vc]JÓ^f,pŒ h…u8`³ë íªÑ„™hIëYÉ çüV¾w(€o0SFD FRݽ`~àuwàãxN4íÑ!µžà|F¯Éý$9Gðàq~ŠäNÀ^‡v¦È´ÜÝ@ ¶yHîIÙ}PÖª(5 ÛÒ¡A.Ü0…5fÏ’ ÇÉÇ–›!.QÇjÉõ“3¸žÞ6oõDËÄ«ÑGoõa¬p¬Ø^Èœß\µCV`ˆËéË;1ƒå&ÀÅ€ªS~Ÿó ¦¨³b? /Y){h¥šnŽm„‚zXжwÚð<¤pÛ¿Ñ©Æ*’t¿ß¿‡S™÷±ŠÐ>yì¢ x;x`5ÿËavÆÈ%•)¢8‚ÍóhÑûÔ?û(U™!Ñ{“¦»Þ£"méÔŠyÇhy+‘@»NG8 ¢œ‚œœœ<Ÿ^Z€ŸÂ‚ÒÒ ~4];FÓxbšªÙ07 Ix½î÷¨|˜*0/–«ÀÌZ6D¾Wsy!EÁy_aÊÙ—œ¤–y(|@ö-À=¨ÏÄ{«ÊN'ž ÈyÊ'UnPüp; îID;l«|u¬%CýyKfÈä ¿§€ë߸¬IŽ$·ý«Î¶âj¥k¡Yz/¶µ3:V7$Î% ×»ho3ªë:Õ8$–gìnXͦ\Òp cÎT5çŸl.n³EwHx3ñ¸Þ·¥¿\Gê,QzÉÂä9Ì h"5æ)kzƒÙ.ë\Õ§“VvÒÐaz\õ/m‚Ëne}v çÅoFdœ^Ãá©eç{ØU«ö˜¾§nïß`íß’v¨òÂAÐí<Òe Ä%Èå¦3zE‡šÐ((°Ù„›æqU!ú b8TEÐc;¤¬)R¢ö`F†­ŠŽQbK¿GTä/ÄŸÍSP”]8L Eþ„<ýM(ó{ÀÖ3™à˜/ŠÓÐÜš«ÏÅ}:ý½Gé+Y!·™¦¯u-qÕñ 2C3cæ²2fgY1Ì,4!ž¡ª\‹žpDI6íèñA“}L-c€f3MMU¥ÌúбÁ*-sÞ¨QÌÚ—÷«|p³•ÍšYng¯šœÛŠ^k[ÎpŸºÈ  ZK{¾h¦ãìÛSñH1{îCðÉÈV¥Y“>xeˆ\%»)§Xc–Ê=”¤ïñGû"K(ïÊ ò³å¾ 7Ë·8+˜¯åhü™·âX*}z•úªBç¹–XÌ7²cæÞAš•AÐý)vkK€ú9@½2ºÚOC•ï£GðÒdÆÌÙ©lÞe{šš«­t`9ÓÇ …ð+Í<*ÿ;8 ­y*jÒ‰‘š¨düâFsáh–k2säÅŠÔ´gÁDÌ÷8¬ °5ZoêR'oœ™¦dý©Ò”Uˆ×’ôèFöQ¯L×­«½¸Gü>‚=3¥ò¯ðøÆ ÕT£Uplø˜Ê Ì j°f?0­YŠ …ä9Jźø‹xIN‚“<œÑ•:ãŸqc|ÆG]KD&Û•’ÛÑ;™9pÛß_Ól›o+§Â8–ʨڌ:#óCÚÁ?´™à ¼¨ÄÉÒL&àÿŒü˜[œNŸ¸ÞPßs39ÈK®a*`Ÿ,1QäXø,·¾W—«Õ,eÅŸ š¬Å*E…–;G%÷W¶ƒÁúÚŸ:ßLK_š¡õ¯•â-Ò³~D 5¡Jƒ“/ó-ÆÝf¦ú¹„ .™g£bÆ![ZÙx\ÄQJ¶Q–)S]u®¥^vËah]œFñHË 2jR1=6˜²sk8×j~Q{Ýt[™äŠT&Ù¾ª-£§E>Æ´uƒ*úÖRédWË åe$ÜU€ÞR£Áá,H9ŸÁLm©sKNFÝ3utë¦]²‹²ÚÝ`làQ­3Bùúh|Rüp"e£éfïžÇ T][rŒ];»Ùäpt˜¿0õærAB°^(Â5Ï¢™bñws»¢ 8IÖÈ“(øÿPKŒúrQ9"ÔJPK8Aorg/hsqldb/ParserDDL.classͽ |åù8þ¾3ïììn&ÉnÂ’ I¸‘°ÙpÖ¨Ë @ ®€VC²@4$1›ØCmQk={X D<¢V[TØ x`k¡wmíáÑjO­VíÝ*W~Ïó¾ïÌÎl6!ÚïçÿùûÎÌû¾óÏû¼Ïýß?ýÔ³„™Úq?ý¥²“]~ú år$Ÿò)ŸV>ƒŸÅä ̻ҧ\¥|ί|^ÙwW{•k°ìZL¾€Éu˜|“ë1¹“1¹ “›1¹“/aòeL¾‚ÉW1¹“¯ar&·c‡Ý~er‡ŸD”;1ï.ìún]ÙëWz”{2ÈDeŸÊîÕ•û°ø~LЕ^]yÈã{ØOŠ•}ºòu?™¦<‚…bò œÙ7ñn?&aò8&O`r“ƒ˜$0éÃä®<é'sEoOaÎaLžÆäLžÅîžó+G”çñî[~åÛÊ Xð|ã(ûöú]¯ò=¼~ßOG*?ð*?ô+?R~¬+?ñ“UÊ‹X÷§X÷g˜¼”¡ü\Ù‡w¿Ð•_úÉåW—±ÙW0ûU¼{ “_còL^Çä L~‹Éï0ù=&@Xü“?áã›x÷ÞýÙ¯¼­¼£+ñ“å]¿òžò¾®ü‹ÿ†Éß+ëÊ?p9þéSþ¥ü³ÿƒ¯þ×pý@W>ô“]ÊqLN`#'½Ê)]9í'Ÿ…jÙuU%*…GUÁGQÞi˜xTï¼~åAÕ‡w~¬’áƒÄÐÕL?¹ "7ÁëÊçÕ,|<ŽÙX5 «A?¹+ܪæà{¹º:ÂOºÕ$ÄÕ‘ø˜‡I>&&&£0)𓨅xW„ÉhLÆ`«c1çWÇ«0™ˆíNòªgaödÌ)Æ$“)~5¬–`…&¥º:à¥Nó“'Ôé~u†:Ó§üH僡A´Ï+y¥W=GV† 9Çɹ>õ<5Š-ÌÆdÌÅ»y8éùXe>–c²DZ«,¼P+ðn VYŠ¥Ë°©JØ'êr]]á'/ªU˜Tc­l­»^‰µVyÕÕx­Ãd &k1Y‡ÉzL6`«õøæFÄ;Ä@u&çr¨xÕObÙ…ØàE€þjƒ_ݬ6b…&Lb˜lÑÕ­~ò®º ÁÕìW>­^Œ—øB-ººÝ§¶ªm¸íXûRL:üÇ»N]íò“ÕË0ÙUwúÔ]êåø8'ÿ)œÑ§uèU^Q€0Ü]P¿ȇz•ŸzÕÏéêçñºk_ÃòuŽz-&@¾f¨×a‚äK½axŽðF¬|>ÞŒHwBWoÑÕ/éê—uh—©ÞŠ[øX´+O½ ¶·z;¶ÝíS÷(GïÀ‚;}ÜåUïöª{±‡¯zâÈ>|¸“ûüêýê~º\íÅ»1y'û0–~]W®ÔGqŒßÀœoê*°³ÕÇtõqœÂº Äë<õ $^j¢Þ!,{“‰^õ)ñaãÓ^õÜuÏbÏáݯú<^¿åƒŽ¿­«/ø`(ßÁŽzÕc¸Ô“‘\‹ù.6ÿ=¯ú}Ü-?À‡âݼêqÿ^ÄÝøSx6 4ò3¬õÞý“_`òKL~…ɢ¼‚É«˜¼† ’5õ7^õu¯ú†Wý­WýWý½WýƒWý#ÿÉ«¾‰4ò-¯Š”Lý3&oãoC||!ùLÞÕÕ÷üt§ú>âñ_q|­þݯþCІú•©ÿòªÿF\úd«ÿE¤ù@W?ôÑÝêqœñ ¯zÈŸz ¨´ ÄmšŠt Œê ¨ÚL…eHÕ˜˜˪1/&>|ôg° N™I¦—e/`HÆX“ &9˜äR1 bXÀFb^&œ€=„w&&£0)À©+‚mÃFã》­ŒÃÆcÞMôÓýÊ‹~º›MÂì³ >€’·ðq2Ö*Æd &aê>ú4+ÑYÄOŸæäœ•ÙTxdÓfl:Ð36gïè±™˜7 “Oª±³1)Cˆœãeçböy~e³ÙØ?›Ëæa“óaØl¨ÜÇ2?¶¶“Å:«ÐÙJ²âÛbÛµmßÞÐÚ§DÙTIɈxgCGg]gCgl{¬µsMÛ%±V^VGɨteu¼Ju'­nC®ãÎ[GY‚ƒ¯&¶Ÿ*› ƒæ-͘?¹x¸¤ÂÀV)ÜÑÖÑÛ^ %'º:Ö ¯‰Õ¥dÞð¨Ö Lš8@¦(ojZÛÚ çİڻEí¸8]ÇI.åì|Bºª)xè“¶GÒ¤`ä*tJNƒHkâõ¹é¦?`‘!³³“ØË[·]üQ6Øà+8~`Û‹:ö |ì„é-ú(} ÚÕ¨Á»î6°R؆ÍÍ-|iƃCs„³§$k,8XädùòÿxÛ,ÓpRoJÊŠ‡Í‚ô>ÔRxBþÀ:‚ ¤‰­¢€³©hà)˜(ĘLs|iGƒÔé(Q‹§lLB™—Ôv¬Ž]¥IYauóÖm®2Ði“B‚™òæèFܲbkÛ›PVèêÜÖÖÑo  x˜"Ø:D6l ‘osC<–¶5˜òJ‹dƒ¢C2‘ëF.ûê æ›ÓÞÑrj|MG¨KKZâß™é ¹èôÂ6˜pC+¬èœ3J×CÎÌ;§±…ëÒý5ýAß ¿5Ø&¥Í`ç³ töIƒ]È.2XÛl°FÖd°Û¢³­ÛÆšuv±Á.a-ÛÎJíjƒµ±vƒ~@?4”‰ô÷†’É rcùÚ5µVÖ,Z]Q ¥8Š{ å6â>¤WÊʆv¯vŸ¡ÝàÖÚªõÂŽÑÔ2´‡µ¯Ú#˜<Š{ôx÷M¼ÛÉc@PµÇ1ï L`{zMí¢òEË*Ä]ý¢*¸ó×ÔV—oXW^µV>TÖȨS»zqâuåoÚA\V n­€A.Zc(™JÀP¢HœZŸ¡‚í,¹Ò½6IøTµmmnlhAæõ3C{R{ ¸Œvà]:[»ëiC{†þVcåÚ…U•‹ íYí9C;‚ûêyl×)ûu – „¡} —æÛÚ ”dÔÕ×­©¨¾°ªv!Љïà^?ª3´ï¢YŽØú=\Á‰ƒ oI+. °ó×諆öí‡øø#Cû1ˆKÚOàQÙ"›ö"!¿ÞP–P–á(•: ›?Õ^0´ŸáÈ_Âäçz.3´_[ÙêYCû%ðY¥AYo(0©W6Êùʆr&ë Oû¾û2$Ê'• AbÇ5~d íUí5CéTº‘ФóÍÐ~$î7Úë†ö†Òçlª¥ðK Ñ~§ýÞͲ%P¹fhÀîþˆÝÝ«\z'.Æ›é·p7ýK߯äÌû‹à3ï*¯ªŠ¬®¨[[µ&²¦|!ˆ˜Ú{ÚCºö>Ì[ºý7íïºöCû§ö/C‰ã ÿÀúö_]ûÀ ¿þJ_¡¯º¥ •HÂ;/®rÓ ‘m›vsq+A9ÛT•*ð£ÙapÇŽ»{²n^Áň$†ónœ µÞÙnb(Ø‹0l„Òî—ì,µ?¨ë6QK+4ì^Aè…«aÒr­³^Ê0¹ÁPi+8€}`)g4³S€kÛ͈ÅõöZT6 mq.¤Ó†êæuÀÚL€:u 3CNºE¤æuçõÅZPع^îÇÛÖ Ò+®DÙ9•[’y Î{›¤qÅÙ‘e3@€¤É¦$SxÆå‚& ´­Ë²Ùn,¯s¿—»5†nÀ†®¡ˆ ¨ÅS` ¼Q·«µ³agmGÌ Æ›ÝÕÛÙk’óžšÎžªÙ*ÎlôO£Q¤2.à0Öe¬^‰vŒ¦®´btµ6 Iá@µ³½Ã74·M‰‚/ý¸H•l$M™fšF8ÇÕÊOúS5òm¾6õ£pëÜÖ†Ç~ÓÚñ† à–- /NoÌT_:Xàý%i¥•!p“¸¤‡-Ÿkš·sâŠ.ÜJaN¬mç u›ôÿæ¸Uiá1sG\Ÿé ³æÂfÚ…4èi–¤›k¹(P‰È{”j“ëÒvÕÖY±:‹Ñ9äCÆ„3 „»ñF»©§ÛƒЦφíp{ð#¾ì0ßœaðC²’AšR³ål‡pN\Ú(çèðºÑáE“:œ,y{¬‰Ÿò¢dÅÀ#`î*Ãìx£ÐÅ:p“î ’ ,ãÀCšã±:døœãØ[—$$uàæv§I(…û¸ØFŠئ¡yÒ dIÁ=óIdGÄÈ`‘$À·NÎ Z‚§I„ÆÆµÉÕb|Mü ¿•f¥©g_ŠÑ }´É#H\šXX[[UQ^ûl Y–P–Li”4N§5-›+BÉÃÃdÑ•Ï`Ê:ãIÖAf;p¡7¥Ñ,2þÿs°iÈ>vÖG=è˧8¥¸rØ$1«ÃÙB1ûºEË*ªËþk­mG+RŒ‚!‡ŒŒÑÐÂѾ2ÔrP9 yS—V¸™.û¦¡q(v¶ƒÎ+,Ç›Sóˆ ¡Ê­­ ,âš§›b:ñÔé„væ„/¯ ³å ŒhL~¦Àa÷ZvXn^’ÎBƒ`Ÿ¬ØÑÐ"H+ˆ²ÜTyÙ©2nËsMÃŽS6§ÌãĹÓúÁâæ­±¸à[¨žYjþ¼A´]րܔ ÎÿÑ€8üXTÿ`íxà××øu !xF›Pú:<åBM®z¸$ÒGèc„ÿÁóÛ²BQà/!žpIQ¬òßÑß‹rå2xÁu®>G«Î 'ˆ>@Ø¢}ל‰~;á·~ßß+?RÜ+pý,\£píë…p½…·KH \wÀõqÞjPÉHÀ0‚Ê… ¢¯éHxds=szÉ÷EGΡ9¸rzÉ×\Ï^¨±Û•Ð!ëRÌbsaFÞÄ— ~È»@~üºðÛºðû•¸Ò âªäÉë8¼ö8ÇHÌçØ¼Ânâ $HÖ~gsäð ÀßZ¶ûÙîod»{àZ×£p!`I·Àõy¸^WX9ú\ï‡ëßáz+\?”°Æñ$äx†ëT¸^×i¢}e-ösÍÞI“àþpQ‚äàm.&#ö‡UÈáýH^–‡·ù˜˜û%˜Ö&Ȩ0K¨ÌS¨Vˆ…EÏ!¦PœædRxšœO) fsrOjÅC}'È—ccL@—þ‘þIà  µŽ8Fvc˜À/ No8G»|èåð;~s|èðû ünð¡£|h;üNÂïzº[£÷ó]UŽI± 2NvTZ{ÈH‰PEˆ% 2~8àØ‚U’ މՑcÄ }æ™ôœ,‰Drí¼€nç=ÁkŸðÎUeV˜É9ó|ääf^§È~¾‚?Ì dÚÍ´ð¬ ó†U/0‘œ†•˜óYvóyåQóÙvV„gMœ—Ø(ž3vžÇΠyºI™µ{é=d d/(ó; ˆõLÎÊô^ Ô!ØÊåð¼Fýc~?&™Ûµ’O‘„w…$¼ÛùÎJEb÷,–›,A*¢^±4?t×Xb×XjÕ@B·,ê—´Âô • ²<êí%·ˆÊ+Ž‘I9Uâ¾:AjöœœÚäc7ÑÜ€ú!`cáp!ìÓÑQ¿ÆÉŠéÊÒ‘•uQã0YUk}dõ~«šéw‘;{˜ÔÉ+ì»5QoHßCÆ#`‹œ€ ÒC6[¦‡X7)±‹7„Y™&¦9ÂÎþSáûÓô#967^õÁzšÞ' ú’àHõQ§”zrJ‡É†úÂ>R3¤áìê=ÉYÌ(2 jú€nKá­3Hè4Ù¦Ó÷túþˆ“dÜ›“‘‘ãËô'¾Ò\ŸzŠL†4÷CâËOü"Žd·o—Dn÷¨:9j3,éÅ5i¦2Ò9Ÿ”˜q÷1±ûJùþ„è=D.ÝW(6ŸÊ÷ž–…¦â¾õ”!- ²=ª›úQ2ÆÔ±à~2Òô˜ºéy–"­GHü‹zø®eAVfjÔôà¾õšÞä¾L`ncq åô“F¾7|K!Dþno,?$çü€%É êÜaÎÆ×¾')¾Á¼k ëRkò&ûH³Ç9•:§`HNÉKÔ“d$ÍÉ„ŒÒIñwl+ó¯Ã}¤cN8PÍ%!r—Ж„ÒÄ•š^ªpt¢ŽQN÷Û¼bª$GÉ7×åæ6³ {TG']IÝaR\‰Àˆ/QÊvDA4=@v²™GÈ®(JX! ˜}ù>2Èǧ`qv òé=¨}U ÝÚÛÿ22 ‹ð€ñD=¦g?EŸŒI,.a1èýð¨p² «úo㬉ŽáuúþHñÄãHyðƒbr™Ÿ‚g¤E_r,3p¦RdùN6Hú,¢&øÕ\„@²}šÒ$+,ÂjO\c†w€Pp=L>ËATZÐG®ˆóͱ€†9—¥4Y!€-¹ÖyD;E>AéqÂN’©0¡àI’“‚òãô„äÏCë€ Ê‡É®ú>r¥µ=~ÄOÀª«ös)†…ƒ*ÈÊ€^-õ”zûÈç¢Z)®Çç×Ùa\þfMó”ða"4w¤×qIã’^Ç…ÆI*%]ŒKº W• íSÅù߀VƒÝQ¯Zæ ùLï³ûHN‰é ùf&ÈÕ»}°Öï ñ»—ì yöXÈUÄô«à*”’ÄœKlÛm!¬ÑñZ‚\+¶Óp;Ib ¹×%È…ä†Îè_õ™¾c¤ ¤u“ì0RÎr«`îp—˜ \\-pú¾ÕC–@½ö8™K ’Ôþµ=¸G’dâ×° %¼ƒäF)´þ›/ÂM°V7#µ’T‚ܲžƒ¨”ïU¥!ŸÜ ~”f¶G3ÌŒ£ ‚ bAÍ ”²2„´• _Цq”„Lƒ-Óô rrËzâG8-ö rT‚Z!P! $ˆS"èFðeP¡¯ Ôâ+œ®úÕ¦zBmÑÆÉÕ$ï${ªŸ;ê…Às‚¬9E|:= 8;ò8ñú²|ðçYÈwã)χ$CÉÏÏñŸ"ù:= 8¼·¥‚Ÿ“”ìQ`¼¨°oBh¡9I°Û¯FµÃäV€Ù×¢´==–‹˜Krí‚›÷â\ŸÊ×/•lýJø¡Òÿ¸®ƒëmpoZí&ÈmÖê†tØìsÓ—Ìë%Ò— “ÄŽÞþÕ¸Ën†tGuµÌòš:l‚O ¨oM=QŸgïîH;aQ¸{—éä¼Ûô­Ù[ÔM °BO71¡îîI} r/¨"¦ôË{Cl¼½¯Ðº»ßÔ¡S_Ýn/ ÂçÌdis§—¸Œ(l¾¯+(Ü. Èe"¹üõ°ãÄsЏ¬§ÈzXGXMÍïû€@wE•K÷M D¸t]´šÍ¡rÞÆWDÍAµIàä@é„D$R/Ò÷yÃhéCPÄÓšŸÜZAr ‡/ø¹ÐÚÃsb<•/wVþ?Úª&;û F÷(ÒìɞŇoìE~ÿŠ  s¾yˆì‡îÃ.»I.wc»±,Ðÿ'Úá“<ÐGF5DŒDur[J›ÓÔ`w>Núê¢:ß»^¹ñCQß^ØzD(+@"’‹ZL2úÉ8â‹ "E1Gš|’,Ö-{ lÀ¬à„BâU<Š.ï} ô¸x÷FTIwøèž<ŠI/Éà÷@jøî{ p5ç°éA‰×ÍZO#×àá™Ò´äÙä9XÂ#ÖýQ29o§ê=¯÷‘oE½%Hz¾ `¶h؇/0Ü'¤„47‚ûÄÑò‡9‹=.8-ßÏwÊç1ðëµF!ûM£Gq¾,-krìr:)3pŒR†¦«cmkئOÃAûKpcòA·[ƒ†ŒzIp­ôùn/Ygjáhà{Àç¹&ú}.;Í7}€0ÐÚ·1ù¨Å|¤?DAÞÇ7ùÝVÆ\PÚ/à>ýN Bt]IëlAhÉ‚íª+Þ¥ מ"[„¼ë9'ÈEþå ¥R‰_™@šëÅʵÖåÉ/FÑ€Ô† y€d¶ølÉAòã^²P#ŒY%&ß59FF•#Ù þòÒCä'Ï•FP®x 05h!‚kr˜¼XÂÀOñ%¨ð³õ#öJ!àvЯàjá®z)ªËZb¥šï·H¾W 2Ž|SÙK C>™i¿óó}haðÚ ï\ð_ð•UI©ÊÑŽE3¬Ê¿Š¤CƒO †öäAò2¿7’Wø~¼*aö^#¼Ò¯yYÆAòÀäƒäõÈþ¶ Ç-#ÒGÞ€Irw§ôƒh ¥ . ž¶SBrO’¹ÔÃüì4É D¡OE>™8AŠfz•©»] uŒeIß—4}Í*´©¨ÒhK´rè°w߬„BU5 ’y!QN‘¹0ò÷Ñ˜Çøßª$®~mZÍ—aJÙp]Æ×Ig)ª`¸hd‚l¢î2-N $1“KGc8c˜ ”€·äÏݶ<ðï+×Ûÿ7S{NÊL ò6Wç4!6ÁFäÂ;Q,ú —0í5žß:@Wa л‰¨!ú…Ü…˜$VþWJÞê¨ ”°¼ Ƀ2æû¶X2§~ˆü5Aþ6P˜ñ k+&_]Ô(€Þ‚lj/LeMY¦C€ÉÆÖP¦i ¡øïfW1@ñ³É¹ÀÕvÏ€nq·VhÎ%·‰âZ6®íŸ%BñåKë'ù\Þ±Š©,×AÜ9E"º¢£ŸÔ“Lg%(Ä]Ι' B„”ƒô‹—˜¶VµXAÁ:jüU‡É?êK'ÿì#ÿªG˜ªö‘s«˜|¤Ž¯¹5[MtÈÕ&£¦&•)Ä%Óê…Γf¶STö“Ém+|Éa‘TxúO‚ü·‘)PÃ×шôADÆë#LP—W• éóD)°Ÿ“R’ä8v ô 9z¬›Ì%ÉÉ$Iæì¢ï^dšÔºÁ€R}[¡¢Ûˆs–ÛˆƒØ@Qà)AƒÎinÆù%Ç “¾Ê¨î‹—#'gêÔôºtÌićf\p]AÞ§+ºRˆìdP5O’IÔ§'ºr’øAÑŒÀDŠ”ÑrÅÚ¥ù®I@ÒHBÒ“$`ü-Z=¡e€÷9>dͲÇ1déE ÔÙNT¹’cl|ùžìý¡pÒCdq´±–3°C°ã¤¥¾¿ÚÅŠgEY JŽPê4Ôé–Ðqù¬â¼ÙÜ´”Ö—ôQŶÒURæœÉÒOÁ뜂€z¡ÜTü&ne,ú m]!U;á! d«©.ï@{r¢Õgjvª© Q™óÀåXŽŸ@5Ðw2šâQGé7¨(X@5{KEÐN©<³@èŒ$¨‡Ëœ({RibÈÆ´R^Û+K¬]*k¦Þú ošÉú¨ÏÒ²$Ðô:K'ç@óK… Trjú9Ð(¹ƒÜGzm&ž~(+`íxBBèÑVÆ®àô(¨+€gàÿh ñå}‰/÷Ò*Z-x²],ñGâ„@gË· $%=ªÑšÒ£dºå£~˪üPGͨ2Ù!jpTš}ˆfV ,ÑlÝ3’Q‚lzS(Èç‘9µƒ¡³Êš´2 øæ{„Ä`®ý Þ%ó9q}ÓüïÄÜ}gÿ„M­Çií„§QƒF3i4KÌÖ‹l•KäÊU-„Gº®Q¸®—×P ÒÑ,éÊ¢VøP °KzÝ¢¡h¸C ¥µDÄÙ\+®c`Êì²Ë¤vqj–-½=×C&‡ô€g/‹ù–±/3lf…¤»w[Oÿjµ½É×÷¶IÀ03í›q?q›ÈØ~™ÈìMíy7As´R í³ì‚ˆç¢BNJ.¿pu Š®rAþÔƒd²D3#AsÍÌ£¤,bf&èˆh–Z–Ê6³žÝG&˜Y¡ì© Œ8zÐÌ e'hè‰ÍìÎúÿfÓh€Fƒ4šC£¹ú3¤8:B†æEC4:’=CóëÕÃÔ¬7C}tT]Ôöˆ‘7z”?»`úü^²žØë^?(î¡ëCÞÀ̧±ÇéÈòØú{H–8F@`Õ]U%i^wkËEf šoæ›Aî Ƀ»~— w¹\'M᪑j棘‰M¾5ÑÈ1Í>Zu˜æÕ›£(¥\h¢EÑs„fŽª3CšYP×Û? £ôš9G“XòOÁ7’c”Â,^èèCtL”;(ÌœtlÊ€éLµLägæ¨Z5M¸Çs„Ja@ªiÖõžÞ—¹pîpÀ¸AÌGÈ™A>æÀ€üqìáö €OýÌàÜ`ÎxÍ\ ÀÉÁíÁæ à\ÀŒ˜!€øT¹[·í ´ïå:—Nä6M+¯‡l`Üè4qþ³‡˜rFÎŽ{É «Š$aŒ½4ÎUAÈ;íÔ€ƒ3âŃ—\:É¥ú ŠDÏ*ÁPË¥“…Òumë94ÚC:ý»DaËλ ,? (†–¦D³Ã¡ü GG†UÌ_ ^cl’`æÑ-AÈ¢Q¥&š©Ói÷£­èÚŠ@ÕÓå.ä3{ÈݲC‹–&èt õ|NìEµL€á0j‰ÕÎŒ˜#Ì™mŽ4³L_ˆ…<}t–ÔrLG˜ŒiÔEG¥FÝExÔ]ç¡f`% ¤Y€,4jâ¤I9ºp‘'¡Çí|ø0Â3„#HÐODóÓ³P~-l0Ž^ÓŽKðrÏž·=ïX¼œ>H¢ý¤Šds_*H.ÜÃcV¤ª®La&µbg: Î”œÙ*ÑÔJýdЍÁé넳B£N’‰tÜq¢õ“ Ñc4D}Є”¡+Åüß] óÇBò'±“d.<±ãdYÜ׈ûb^P.; Šfx ™‡©OáÈäSz?ˆ=fÊP¤æ(N¹a@ Þ‚PhAå1ÐåQJ¥ø¸WÈ夥öµ’ÓË´Ãôœú’HH+ h{.7 ¼}˜žW0h¢®9Hg‡A®KÐ9è‚<–$A+4¨øè4ý :DdÀÅyÒ@ç£ÞÒÆÕ·€öƒðå“¶%ŒpQ¦êÊ4îq€ÁNWfÈË߃¤„ë§œ!—„î2úi4„?§@¶•ˆ¨$t×-’nº°ô.Ǥw¹QºŠG’1â].]À7’ˆ§=4õhêìÔç73úhyÔèuv¿Œ~  »Éݹt‘“¤­á̆.FÓL²Z!Ûñ'Ûi5—t“²f²;GµŠ\ºÔÙA©ýÚ™:È3 Œÿ‰f„ØúFHÛC_µ7× .2Kjô}hD•‚° £âðS&4º¢¿npFÃâ|oÚ ¿ùÒ(‹pï}.ë¶â`¬=Æ ê­ =4jÍN7ýGèòtJõ~˜d/-rÞ@¾ XÃåôL{%u;HZpº+¥A”C]ÒÿBwHOÐ*'Ï2T•¡MFðì—Üï¬6ÝÅHr«ûhÍs<ðôj›{}ØCv†ôîrNõQn§Ã;4‡r#pþì°Ì죵Vè¶e‡ÕX‚®ŒvHcArÁÝH‰| Ïf–tUÔ+'€N]`{È{ågÚ¨[œKW;1+_6ïnû0é!)#ä>ÑGë0¼m÷‡KÌLà-kœ€‹] >J`]~xÛ@o³§›¬C­`íRc©9YÀž2ä [ÖK±-—®s‘£ÙÜõj„Ž‘(RD*º~½™ ÞkoŽ•¦ÔôÅØÑ†cd¶~Ï1Žž‚|$àB9' Ñ}r¸Îεdò»L‡QšÇ0Æ·8ÍÎ1†ÒdÑYçég{Ólf¡ïY®™ÚÈÒ‰yù'È“¤R§§2Nõ'ȲL¢àÿ<%0¿mÒ×{,w’<Óò‰'h}÷-”¾DDÄŸˆÈš¥‡ûø\ÑE‡Ä~'\ïë[2¤ürQÏ:Ð?Bþ#…ÝdJ²rÛz)•“½¤$A7š°q6õÒã¼ûU¥Û=AÏ?G/ u/ܤ?tô „ÜKŸ/Úƒ–dO/íämnÖI6ðÉ^z#t|a/½fà |woõÒ‹¸H:8¬‚4ÑCüÐbC/™nç=%ò6÷’B q–öŒPº-’5 û^òÏCJ¦©—¼4Ty¬—<1 ¼„ñ÷„­sB7Â[ºÉ5r§æÒ­œxÔÙÏÛøó"û¹™?ϲŸ/æÏìçKøs®ýÜ’Å{Éx;{;ÏζƼ!Ų{ªÀÕšô6N!æI`æ þ8Aj§°Y¾)žIy¹¹¹,wÌ@øvO7½¦Ÿ­”Ù§o4Œq£÷S[ŸnÙ*Kxð#Æ×$ñ\‚à\gÜcl-çài$t–ÈX²{ÅËÈ|PŠÚ¸R”Œ¾µƒx¨áw0$ºS*£¤çIÚN‰=”_ÔHG%¡RSã43=HƒzɃ÷Ëßc®Ö/кh–i<È."‚ìzÉugšl<\r„—¢]²Ãñö ¬8œ~©»ÅhÂGÐ%€¯¥¨îöÑÎç’«=ÃFí›1m]ñŽ>NFÃíG“‘#ŠÇ-Âÿâ4éA‡ƒ¶{iÚv})ü¥È—`]èŽy¤o#M"Cò­Éœ<ž¹; ¾°é\À¤+êçG>°¡/ï#U¦?”ÁvË£†ìX%½Œ“qx»ã(˯Rš¹Ÿƒ¡«¸2Þywííß_ŠžBD´Pzðº#6¥ä9ü›¾Ãtg}¤î:H/—Ms1n*¶ž™‚ ¦×ëÏÃCQ@yJP¹ “8#Eýİ"y,›Œ]&vÃI26‡d,?š;"Ï{š€làÅàÅ“¤BWÎ;N< Ÿ~H|>6ù¬,æŽ)<̖ͪJÚ¹ •#¥‹$ !oÛfjaýÍ«FJ{% ].OÙâÿ_,ilÈ(¼B£,éÝKØ'í°|ò­½\z[hq¥Y=Îú_ç¾»gèH ˜ˆO­w¡#<2¤£[Æ•J30ú±M·´ðUÇüæƒÀ¹"ü8¢tœx¥ç³ž™z]½VZWï)àQî:z dÄZÍ0}CØ$¬5šITÛ£Ë5dt÷ÿ2±Ÿ”[ÁÝïÛùòh þçÐRðêgûwª8}hla9^Vegôõ¶‰H€‹Ç”#óÅ—DôÓÈ`Ž‘Œ`ö=´n[Þ€àg0J&A®!å³²ÕY‡è¹ôÊßDðÎ>þNäÉJôU½$kȶ±N‚~nÉ zUûù3 úyn¡gÏÓÝÝd¼ÉŽÐÝèÕ 5õT“º† ×t£÷ëÊiäÇk.½–0óqú…ª’ôº¤s9?˜ N8ü—5áÑ`¾Å–Çm _|ÑBWØÖ¨t2")º·õåÏi2ÔpH“Zf„ Óÿ,kÚGæu2f 7à•]„w÷Á´Å¨0ü†×©ÃÔ̬ce» GÏ…2öô8Lo¬Guç¦$jÕ“ÀiŒšzÓ ‘›«+ó“qÁÌåpƒáõÊü±gŒ,BsM†åÍã§g”ùŽC#xª@WrŠh”Îå‡ ð?€”x6¼ŽAùÀ%b)ë)7Ã,p(ìÊ)#Ôl² ò<Àdó04®À • ÜEõàGP/$ÝRøN—8®ÌU<¨ô+ÂðóÓ¨åò4ªu ê1yñ1q*Õ:öŒB?ø¦<ø˜8J^Gó±~*5$O¥îGõy>žNMˆ#ûüù2yÝWN‘aÏ—±páãôæ½¥†‡B YêKQÐÂP#€®Ùpa‚†Ò/÷RTàG¸³X o°ÈŸQdÊsÕ'?‡&òÝYÏó¡ªm§'°rвÝ5ƒ–m dÙe_I)«¢lºäVô«îZÊ;žJþæ9JrL°Œ[KLÏ“ôk Yß{êá$S«"yèpå!¿ NÜÞ8G„\)‹ðÌ" ,†çf…99¹9¬ÿ°ŸÆŽc¸ÂOш—‰²ØöOcd ž’™)5ˆÛ0@%\Í$¨ql†SŒæ–R]“±v[/É(—›ÑPÏ}ý’fI>Æ[*[Å¡¥åœy…ë?AoOzHkA¥ã¾#ª!MZÄé’ÇëðdËøéRÉ~Ò„ÙÌq'31’h†Œœ~×üß|¦iesƒ¬]\¢,•\…!cÜYì<9¼anI.íNÐ=ÝÄ7UªüšÄJ  }}–s¨Òä8|„žÂszïa,Ò2ˆEó `YѾ71Ù4½N%èN»½k}I²1??0yðË•²µ=’×ËÃ…Ì¦î¬ êS¤%­û£ä}Q/9 M]c€¢ßÝKF9£?x6ú¥éݚ㌉}¶ ÏéÚgõ´¶9COØ)R,€«dñRª”j9ÎG‰—Ë=·ÿ•^x¬æ‘ÖS,lÎáÈ€¨]Vb²RÓM÷ ½/Rbj<žÛ箋/*Yôíá— yêìÈ{ë|žetdU|Ÿœ…Jh ½Æú_%Â<–’«|5á’H) ø µµíQ •Ùg“¶Ä1^‰ º¦÷$?æAÚÏÔO7rÚ[#÷š§Ô¬ã”ðlzÇ)åÞÐîŒIDÕOn´íüÒeᵸ#2E¾jíÉï–øÕ6ĺñeà"M¸4ƒi¦ƒ¸”*7–p›D+} RÉåXiìüŒ1é¼yû\븜ã<+ÚrxÈcd‚Xa ?#“ëâÔ˜M¢ÖKS´vš [æJ)0Í+'xž Óê=ÉãézéGA¼"¤[õö1.šˆ¥9EÈX€Á*{U®“ñF°*x"ŒˆuOÑ‚%Zòå)åŠ0sà›6¾yR,åA}`¨™Ê?®¢¬Vêä°>+‡µƒã·”a_·3®ÆÿÊ:RÕä9~êTUè9àj‹œjF}bà@<„[º`,k@–²Û$&ôß)í°°ˆ»u±î‘2ÜøÍ%xàŸŸ— ¤ççK¤†/>K:í>×Ñîš2ÛF .A» Z`gž"|”3û“³XßnKÛHùðI çÀ™$â ~4Ä Ké&a !÷“3ÿ´º†óSò¬ùÝËçšÍ}°¨K~àÖƒl~š«ÖmMQÇH;f¦F˜ qµÞ/²J"Œß—DŠôýa<3_.KDŽK¿—l@ý±‡˜€b=ü¸ö^Ž[¼~ï~>ô“¨1šN‘e'-ð% OÉ(0¦ze£ÓJ9¦Åîžæ¥¢å çóS:ÃeÙd£èiÙú^¹©_ä¨JqJï`µcûñÏF™Nš€ÛÐù×6°5|²ožµgVz”i¶fñ‹\3J(o®â:.~“ì|å9“«%^·![Kt«Dížnû‰c—õe* ³æ¦ßä‰Q0¢ÑàüIÐ0Ån”G?Ú:·q›) 9ˆ¤÷a0¾:o0ϲay–çYgOÉ•è?(Jq ‹ïuETÓ/ r0¹ÖˆZê)2 @E½@•‹,h3ãâž2Êò÷¡i èrÇŸËUOï;Æ:é·+4­Íî<¼äô¨å ¿“©I—Z©%è#½tE ù&ÔúþúGî?$ ’aÍ~Cò‚ô-¾;h¿Çœèó¢^ò†WÑ ‡gCÑ 7Óé†ã™›{í¯þ Î05—#n^{ɧc(M½dÍpêÅzId°z¦&ütÜ1âtŒ^‰huª–ƒb´L5½p:¸@=™äŸ"9ºBð7×Ì1‚åzrñÁ,7[ƒMJo–„¥‹ë—×ÛJJ¹Nð¨r·ð•J Ÿc‹¡]?A¿á"B~:£XV[ó¢Ð4›]•Í6Õ«—'e–Íàߋ۔òI¶YÆ£Îk\AçÌA¤äQè4å¨L£ý¡¿ø%´~Y&ƒ1ôÅ ¤¢º”›6¯îÐ`è NŸ¤!Ó±CÞ!"Øû.ƒe”u\%& -“mÓIO‘pi‡éþú ›c£q9¿N`Ù*2§€33˸¹¢Êc¿‰øb‚™ˆÎâ D‘²<Õñ»6<ÒÊúŽÑßgÔA<ôQ<á>­9 Okòøÿ´#œdÐñ- 1Ä{šD©š`í¦M:Iòéqrn¡8¢wOO+1ûóRçÒ¯d¤cb%®ÏJ98ÙÕ)”ˆþÐ!!/´ü´].%äp ·;È´¿A˜Ãé´¦1þmŒbªÁL›-ïœ6¶K`úÍÒ‡[MkÄ0„\-Ãïߨeè|…NÏuŒj”DþcÜÓÒÎãÕü½ÉÃ84ê=eY´ât éëòã`ÓÃQÆÊ|½4ç0}º¾>ƒFÈè¦xÖvN=ÇOcâËeY4ʃCBYB0ù®\\•OËUÙ/We…\•rUV¹P®Î ¹:·;*y$<]\†=,“…21ˆûwÖÖ,¤VÙ¬¤'Y΀iôöGä{y¾ýÁ@ÕcŸ¼&ÒÇ œ¤én"â¬ÐI‚Ÿ‚ÁOeþŽˆOeÂüø§=¿,)w g ­‘ è áŸìl”Αi耄úC^ôOûR¤‘-Â>{ ŸG–À`þ9E­—NI÷žƒ]M!ÉÏyŽ—c/£&ÆÛ–_träÈ«išÃ{É‘t%A,y ]I–܀ᒩ%–t¤+ÉÄ’ éJt,™—¦Äú–gV(B÷¾³ÿt™¾Þ bÝyʤ¢ˆÍoYïÜ$lx­@|·ƒYg¤EÐh`Wò$4ì@»Âžr‘C–·Âþ Ü¢p`<Ï™ Ï£-Ð{»´bèÜöå§-3Ä‹~èìObØáh&àLdzҳ˲IáH¢…7#”Á-]ÞŸ‹ÙÙ)ÀIvf(Ë̦f½¯A3˜$\Ÿ#g÷ý4„÷ü4z3•‹‚[Ÿª ŽñŸ$ô4¹ÛOçffefúào?Éü¥“äbšôdgE<Ì“åwü fùGj“'Nééá-{¯Í—Øá ÷Ê¥Û¤¨ZN;ŒŒ€T&é`­MaK‡·ÎiqÄÒ†zùUx9äD æX1(¬?4VTÃÌRÑBKƒŽ3@# ’«Êtë{‚ò ^¨„ˆï˜ÚÆbþET¡u„lK±ûû@SH&ž®æÑÜ©}£Y@%ÉÔŠCSFê£ä‚-DŽÚ¢l·O ŽZέÆô[Ý„=ÆÃ èáôÛ.Ë#t?É—±"rmE âé;I·¥FÔŒ1¨Þ·*m²—)1d‹ÊGï ÌÐnŸH¾[|¾^ â÷¡Ð+EħÅ$ùÏ[!çĉæúÅ ä€hà±Lô–ñß2üóPëÑ…Éêc$hÍö ©ë%cK\¯_%=†1!Å7â{ÉC¶𹚷>&™¾]oWÂZqŒŒOvŽg‚ÌH¾ºB¼ú]sHöù·›„žWË}Ç=º4Ȧa,â÷’4ždœÄÏÎD‘~HcfÁí9cŽã-ªá¥¶Î¶V TCjZº„XXaíjëˆ$7áÇ .–ë‡h‡¦—à÷pÄ:–‰L–ÒÓi¾É-³Ùåü C,¿!–bR¢ã¢?„Ù ü[Í•%õ½ˆÐ•èù 8Èè Þñë!þ`ð«¿N™ËË£ð±M&â os¼âãÊvXô?Fô š šá5Ù·PÔlÐŒ“¤Šz23õãdâ)RÀt¥ã$)¡î¾Û¢õJè7Êy3ì8 ­Ï²>OúˆE.–9ê#ni¶avN㦔.Ùú¹ ‘êýŒ¥‡·(—ÉBÿ¸6KK$-ˆpZðbR醂Ÿ ?ë&yø±˜±@ aŸX_t!"èB‰‹(xƒíè'^e‡M–p’¨ö´¿^ œS[Ï»jŸ /éOûðy>¯«×ôuõžÀ†uOПk΂'èÍ‚€P%›£/#åA%‹˜Ô¤ùêW‰OÝ£<ÈVÁu—¶^SˆùÿPKQ¢îdM¹PK8Aorg/hsqldb/ParserDML.class­Z `åõoö˜ÝÙÙÍn’I2 °Iˆ]u%œFI„C U—dHVÃnØÝh/[z×Ö^¶±­¤V[µUŠ D{¡V­¶ö®ö²÷}W)ÿ{ßÌ^Éný7$ßÎ|ÇûÞý~ß·|ýÌ‘ãÐ*½NáÇ <?áæ§ÜüÌMÍÏݰ^V¨ù7¿TàWðkn~ÃS~ËO¿ãæ÷<ùnø#üI†?+à‡¿p÷_ÝÔü›¿óë?ø'üKÃ+2¼ÊKN*PÿaZ§¸9-ÃêaŒÆ܈(Q7Ú¨íDüêä'™Ÿ\nt£BÛ¡G¨ò“—|<¥LA?ÜÔWNcV3¨)X…Õ2Öð"Çjy¬Ž›i.¬g ә ¦pžŒ3ùå|~™¥à8›'ÌQp.6p3VH elä©M<¡™›ùÜ´Èx‘/6%ºDÁ^*ãe ^Ža*°ɸXuxO¿RÆ% lÀ¥nX„˘ÿåÌÙ ¦¼RÆU lÅ«xãv7^×0[«eì a'÷tq³†—¬åf¿vóÓz7àFž·IÆk¸7s³ÅMÍ52nU c2¾FA6Á |-oyót=± bx#Â}Ûh÷ b¿ö²j –b;/ëcÆûÝÄk”Goäæ&^;À¬ì`­7¹ájŒ‘?`œGy`'Óà×7I7™(EŽ…C ÞŒ»Øb»™ò½…e¹•àuüúz^û¦òFfãMÜw¯}3?½…Ÿö*d‡·² Þ&ãÛ¹û ìÃw²Yߥà»ñ=ÌØíܼ—Rú"|ŸŒw(p¾Ÿ›0ýÊø!?Œà\ESW 46¬Ž'úZú“;z·µtÉd4[XÐ׉ŌÄÂyìËâ½BUO|Ç`tÀh%Dª;I;ŒX á↭ùK×Eb}ƪD|hpá¼’™Ë;Ö®^ˆà¥Žž›:"ƒë#Û Áã2~DÆÊ8L¾I±)ã]2~LÆËø ïF$ÔšH"²ÃH‰õ{$ÂüaVìL‘Gì±pk;ËSc ²>1ë!žòD©i(ÎòB ÷å”°Ü0 V^xŽJ Š#2~2GqÃ`o>/”\ÈÉÉ¿‰)(>p³5#' É~]ÃD!K°±µ}k =•dœtH‘Þn#µl 2”4VG“$êPQ7FÑ »D·µt%z„Ñ{U$ÙOd& ¯ŽÇú–;‡&.¼ŠÛ‰ÈÞ”x¡\b±³ªÍR`‡‘èËÓ^K.ÆÓEÿ¦~#†ðLÃÔ÷? ãg.ä~òÑ)j³p„SiI¾,20犗”tÅ-“$eïA˜ny[×…Ø:c;Ië1’m±^+ÞZK’/á_ó6ªð9ø¼ŠŸÂ{UÜŸVqïSñ3øYïÇÀUü~ž_ŇðaàT<ÈÍ#˜VñÒòÃøE¨x‘Õ‹îEá£*ÇÇT|?¦â—ð˜Š_ƯPQñ«˜–ñk*žÀ'j‹iÂÌm*>‰_gRO«ø óð,~¡~Ràé$Ý7ð9ŸWñ›ø-_Ào«ø&ð]üžŠßǨøCü‘Š/âKþ*þ¢âOñg*þ_VñøK‡/©ø+|XÆ_«øü­Š¿cA~ÏjøÓú#þIÆ?«øL#ÔUòøÀС Òõ_yå߸ù;þAéÚ¸bݺöåí«Tü'þKÅ3ÕWðÕB¥¦ØÚ-lsO☗S2žVñ Ž©HH Y•$Z²IvÚKrPª*寪ä”dUrqã&®$EòÈ’Š0+o‡E'åöŽH,Òg$.ȼ#¸rj;&Jɤ‘”%¯*ù¤2Yò«R@*Gðß¹9Ò2@{·tm»ÑèIÉR…*UJZ¡®²_ß±#ëeþ«ª‹‡Çj®V¥IG˜SÔù/È=vGw §þñ]L¥V•ê¤iªT/MW¥Òyª4“íX=>/7Ñ›^U:_BUš%]@ÅB•fS´Hs¤¹$Ì$YC•¤yª$ß—ÉyèUW¥&©Y•æK-ªt¡t‘,µªÒébUºD !œWŠÖ:3$˜õKUé2éòB#äP„i“%:U KÄÛ"rEx¾©J‹¥+¸¹R…á%~š«Â7à9UZ‚á ÛTi)M––IËUi…´R•VIW©R»tµ*]#­¦À–HR…´´F•ÖJëxY·*­g7p³QÚ¤J×J]²´Y•¶H[yÂk8íZ^ËZºNºž_ïTá»ð=UºAЍÒ6©‡ç‘ö Þ;í õIýªå§¥›Ti@Ú1ÎÝãC©hÌèîé7v‰o—Ui§” ÄªJIüŠ*¥˜Þt³*í’v攬¿­IÄ{ŒÞ¡„ð—=ÜÜBYBº•~Þt‚A”«È7‹v¯¥îšRyAÚº…›vrÒñŽWè‹#𥶦„(\d¦SãåÒʼvÈHìÉ‘¤8+XW*7,,ÌZ9) •+¨w=ÑíQÂ|bƒò‰Ö#°ËÁÖÀÖÅ/ëû£Tõì ;Nçž‚YO,¤"Ëú¹“6¥y¥#ANfä«,†Á)?;S{DÐ8´Š± "Ì“-ÂÅVO’„8}Fʲqe!Ð]oq§Ò Óz„ËYèyì#¾lï²ø# Òu{¨{M<5µYM®ODûÈ6f5÷¡™[L²K#IÃÚÜ‘ŠßÄp¬¼€î[8Î!Íyn1Ÿ%G@ÚxZCI,Ëbj´[§±Ëâ¸ßè¹Éô^–†˜ñôÄ–Û#C)R¤/ÚK!Mí1§ÓfYaÅFjÊwlbÕM®2¨QÜ’ËTåM4‰x¢e·$®a~Žw vá»{ŒÁ”iy_ÎÅc)c71ì[6®cöêb‘~Aá4¢=ëù.s*u$Ø2¥XÛ~Žˆ®A#¶4AÇ9ƒuêL»¢1R‰‹,‘mdx2J>ÁåV7±ZQ¤›†:º÷ÄR‘Ý] J!HfÓÄIDÔQÓ ý´Ùâ ˜~h^[Äé6½…‹uÖìí±^c7Sžu6Ê"8ʆbÆnJ,ä–»Nk˜ÔÌå¹hÊù¦³Î¦ìuײœ–‚‡Øïa¿ïµ"§vœ ¤`3sXɯºdrŠÉCá#ì:«ÛäŸ'§pȯ…çà‚>ɰ*LŽ’æèeM–¦F¦S-IŠ^c¿H¢È¦¥¼´7àˆd¼! &âŒ*×ÅwQª £ñ?¦åˆÅ{™ %šl·2 %{N¸"mù3i¦›©›,ÏYçÐŽmF"3HÑKRXE“m»"{x»þHÒJft:Ž&7Ä,ôŠk’1i¤ÚR©Dtç’mÉLj«o(™ØDXTsëu´{4a-ç v7Žõ-œÔß«H íIVDEÞv‘$ØõÛç”Ë µ”°Kb‡F:†ŽÇúâ’cB'‹3k éŒ8 e™ç^ögâ ®ô­Ÿ¿E¬N.Ó ãÜ8gÚf‘JÄHyäíÂx²e8„US¬íEâ0OCÌ`|Êu 0ágyJÅ@„{¼yN›;1 –Ào>‘Ù…ï™K="´'Mä¥ðpûö ÛRÇQ.ÄuÝ£x“bƒì¤ÚÂÛμ±……  »p];)Õ©x_[¬7›=¬bÔ0Îc'‘:óÓ¥ñø€!&å›#CF×v š†-óVO˜AËzйøÔ6Ú,6ãMSuœ©]]•ô™-ÂiÌšgɸ‘UNzCé’7}²«H&íé^»úú¥]]«W´uÒô‰±bíj%XÌŒ]]2ó0î]ž7޽‚™åYL,î‹ÍÎõBÎðRgG$ë¦y=” fÉ!Ç7ùâ2–íàqÃ:>Ìi(’ 'vQ%Ë®œ_Æ`|QÎÞ«£;¢B ¤ª «t ˜68é1ÖãíòÉ,u#úv²øä3½ÖY£º¤CT[ÛO7×4Lqÿ|PrŸiEVÇûH‰|‘XoÁEýª©|I1¥ý‘ÞÞ«ãÑXž:jKgåm™êmý¹æ{ñõÀ ßU$“YfHÔꢹƒg+‰ì1vüáÏr®\Àˆ/;Ì™r*nù³£Á[UÅj¿@„t¶Ë;’}âì•tòï‹&q™Ò_§Lýì ôÖ>îüé°¤Ö'°c] ’šÊvŽÏÓ&Guâ"#’ ,SEÌÃǦ³tÎáûžÜ*â«¶kKlŒÐy.ß"åQ-6 Ê?ÅRŸ«&;ÉÛcx”O„¶- íçŠx…ÔÝCÛ„™„í–Æ{÷L¼OgÖú†ö’£\‰Ë'>yÌ;Œ+•›¢©þ,”-ëFúbñd*Ú“4­zN™jò¼4ÌŸ½ØL%!NšÇÔÌ¡w{”1²—£iM‚·GÙ=ž'oöZÐÙÄùZ±£$× k½XÌÈ(ÿp0§èù³HÜúùxi®4펰¤ÈÚ‰=…1šOaaæÌ7¤–ç%¸ì]rõø»`sÀ*âÙk~þúv|ÙÌLÚíËûOâÖqS"š2Ì€ñçvˆÿ¨ak˜·”¢«'[j´}1£we"¾cŸ„‡è©lô@66|ÌŸ‡á€9Á¡€*ìýÁ4HÁÜž›-$ÛB.[Èô·¦ÁvêÎàApgdWغ# îNn•V{B ¿¨ÃàңܤÁöÐJßA(»È-˜ú뤿6úûõÍÀ*ëóbú{Žþ®´ÞŸ¥¿=—ÓÜgLþðbâï(ø7ûuÛ£à?°*^kíôºÙ¦«Ý¢7/ï°…¼šWw„Šã÷@«xм­OÀL~¬Ô¼û ZwhÞ4hi¨º ”€vßa¨~l¯GÇž: 5›YlÝѬ«Mô¤‚Ú°W÷>D¬Ô…TMµÀ´ENBúi¡?›)Ì2eŸWògPSÒ0ÍòŽ‚MóƒsTª> õ›Áô°ÈÌ8ç…Ê‚ºOwjei˜ Øì$¯îKÃù!»îà‡YÖ~¤‹}P‘}yv‘Ã'GA5wÅc¹±X+ô—é¸h¼ÜaÉ£0#Û]™ív‘éé‚M¤òÄBþž´M„g‘bÒ0»#¨sHåªé$s1 ¬¨Ã0Ï줎 N6i> $…g?Ô±šÂ¾æãÇ”p™îkÖË5ºzæ‡}¶P™FÝd¶ãºO+kåN¿-кŸ:?¥ûµ@k¸\÷4kùd¿p…^‘†–aXb¹õò4\(ïƒ>Ýs.JCë0[¾ Ê4—0ò(Y“‡a%“9 6ˇàâîQ1‘KØ.Ä'=V CE†Xm@ÛÏëÌ÷‘¬³ð{h¸¤YSÃBé^à,Â×i*;âDþš? ‹Â>¦¼¸Y÷†+˜ÇÆ4\IÌ-aFÓЦ—±ì‘K5;w-ÛÇä?Ëäó$luÍ{–‡ýºŸ“¨½æŽÁZðÈpP†GdHËpe8,Ñ~–ÓË)h§ö4„d8‚ N‚ã$è§á2D|:¥“àš[e¯: ×Ò¸ GOƒ[†cx*ÍvÑýh¥R]ö*Ð/-wøœ¯€.Ùƒ§á"ãvž†6ŽËð(ü_¬Ä9vpÒçÕ¶+êI€ùätmüY/\Ñn 94‡n§ÞÙº]s´ ¨Mšƒ]R8ƒƒÜà{mÔ{8+y%8NDìU1—³L¶¨ÿËðswÜ .â0l[d[l»Â²#¥Ü°“ÿ lØE197?&«F …úª¨²àŠÍ¶`Àþ%înÎܶVÎײ.§aeØa_4 ~šûW^Ÿ†UaGAöº”þ$Úw7}ÖÑç/èsžUÞDKF!÷fÙëÈw‚®4\ÅMû0ÔýM<²˜¦=ž 6÷\QG "ö®¦$ͼt‡)Ç”³—„kÂê4t„]Ó†¡Ùù(tÒG÷f»f? ]Ý›õüv…5›I2ݺë¬}è(¬3ÝLJ×ì4zh¦îÎùÙlPÆ`;ÆAö+¾*à ÂϾ Îôz]3+}Í4ñ©;‡­ixM^ËDÂu‡áúÇáú »t—Mt1«‘n~ÜF3ì¶…M¯÷P¶¦ÏM¡)½aî¦O·îët²¯±W!G~ß·‡]9AÙQá¹ô¬ÛÅŒ¦àkb…èî4ôuè.RÒtú;h¤‘H¢èQ¸‘Tf껉™eéÓ0À¤wptÉš,¢«†BJnÍ¡½2qð«¬á)™H½¿‚ÍNtrfßêÜ®Lz9‚³?I‰àUð«œaÆ`I.å&ÑïSâùe¢“Ðr êhØ7Fa)™ ÐÈ!}¦ÑÖ_Ï +Û34½‚ê.ö‚L¥w…=ÄÃΣ0H;ÃrÆ£Ö r Wq±«¸Én”q¬â4$Ùð ^1±Uΰoê.v«ó¡cJ§î¤r3;Èùlg*¾ºš†]&"RI³ÁF]%4”†Ýïü^W¸è½ˆÌZÓ¡Ëd«[6aØ›ïЇæ /Œà6ýØÇ¥bžÙ' ¾×*Œ^Ó•ù½Ð—ƒä6îæ& ™[鉪ܺ’sa¢WàÂTwl¢ËraŸåÂ,ðY.ìc.çò®—wSiæu\¤ Qž_à÷íá€`ð\z&-ò Ý{üº—¯ûɉÃ^[¨\+o"Õ6ѧVÞšëÞ[Nä~©—Q€¸$÷³VN@“˜á͸º+ëê$TÆÕ}ìꄲ}šOw Wwi¾|W÷±«›Š¹’ ^ .ÙB~ÍßL«ë¹Ü¿®YóÏ_0Ì ~§²~"ñól´¨DÌEÙnrózæ&0xTŒAW&TZ†gdxVxù“ÂË͈ ÏšE5»È<ñkNõ\e™ˆ9FóE¥/¾Â,â¼,0íP~.ËŠDkÀ Éú1J澩Óh¶bù ̳aí+¢Bž³JÄ z÷ñ…ª²’ɇß@`±1¹Ü ˬc”æ" á~JeîÖ°Ò(ìäÊ·[÷B¿>÷è à 5¦·‹ {4™×Œ»zL<ªdð¨ÇžFžaQ¸Æœ83ià ¢ƒOˆž+ùy4fð«Â¾Ñ¤;D`  &™tO&Ž);ìu‘í…MF o¬/¶Ìì±Ob¼ñ ƒ„e!SM½¦e„Èðž!ýò(ܦ+ÿ…WrANȆI„̓Ѕ{Ý8zfK¢m‡ÊÓPOÎH(Íx Î#Ç8C¹œ]l æZþdV“CÂoáÙŒ/Žˆ_öÄš9ç½.é á*Ä*~<Óh´fNý« ½*\êyø¦úî ÈÉ oq&ÝÚÊG`.§Û&>ÿ9ƒM”¡oãÍÙrX§ÃQhòÀ› WpöË] óçÞ°ОælþÖƒð¶ÃðöÇì¼ßcB?äs¬œÙ þ3AVN ú K¾#ì"ˆë2­˜íé´]ÅÕéTì\çßµ)˱sÞÄŽ-Öä»ÁmÒÓö{a%ñ[nîýnưæÑÖey¾Ê;Í?> v:ÀiÍÛÑ„ïÚd‚Ï÷Pªµ:òwUÄ®gžÈ™° ¼pái˜C&;2F¨Ö),vC6ðÉ>g  ö­“Рœ‚&š¸„L]†¯‚â}… 7¼±£“ß~˜ óž»á"½ŠãªF«†r‚OU|¹"p½½¶4Üù8Á ߯ˆ‹ XµV×,L¥QE`*"¡+¦R´©j¦ò˜XŠð—‡ñ×-›ôjÏfUëvFhêñaXÊBpçdpçdpGÈ7Ì ®f?T¦% ê­;¨öi¨‚žUFOH³ÝBÕ&«Ñk8ù³ùØma1·…ÅÜÎ~»Àì&`ñg‹®ëÀ¢3`!´U«ÕŠK˜‚Wµù€¥Vß h5QŽ^I7ù±f52_ɰç˰—E(ŠîoÖíMº›”®š,|4\«×æPJ|c=ÿÖÀ!|q ~ˆtül¦="‚>ûû¤ø}ÚL-”Z j_=³ÜD73&P¿ÿ }™~ÔüoøŠñ ©ÎNC£ ßaŒ²€2Êwá{V ¹Ô:¹zøàÏaëâT©„ܽáü;ƒGFà2N\{ ¹_Àqó†µFÄ>¶˜)À<_8›yrj>š-‡FàmìÂ&…ò(f °ÚJÚì·æãÇÓð ?&î~öu6ŸÀkÌCŸ™\í™ê—ÉâöL‡Vú¡è¶³Š‹U5ðfK½stìÛBéœT¬%·ljÖÇÓðɰ¸á,q†{jt.¤@íך«•oED˜FáåÔÈ->e}¤á^¦ÂÙ÷ý|—Ok27º\…Â2p07×l§(Ð/ ÇîNq‘Ûô’,‘€2”?-º)û¤aTÜG~1Ká©£pŸ™œºÃ þϰÿ>4míõ–ÂEq%u6Ü7Ûu;íßœK)&­f“ÐgIYŽÜåÀFðž†>~HwŠAþ‘“à–Æ`ž¸&¢@EsLÄäØq䵈y¡“|}'‹ÛÈ1¨›µ @”_„—,À¤·Óçô&‹O[#RQ¹¿³9ÿºÇüFqðO\b+è°ÝØn¼ħ@ÿ?PKÛ\9-ÿ}@PK7A)org/hsqldb/ParserDQL$CompileContext.classWy`”ÕÿM²É—l>r‘ƒ° "ç’@P  !‰&á‚@-.»Ÿae³¾Ý‰½´ÅÞ§mm«µU<Òö@ÉF¤xô€Öö¶^½mmkïS Ò™ï{ßnöbÿ™÷Þ̼™ys½÷ù¡‡,¦n7¶âH1ƒ‡dvTÀ—ð°€G<êÆÕxL×Ýpã1áÿІ¯º1_“Åq'|]À7<.à›¾%¾-à;²ã Á}WY³ïãûøÌ~(àG~,|O ø‰†§Š1 OËâÙôl žÃOKð3ü\À/üÒ_á×¢áyaþ€ßÊŽü®‹ð{ (Ær¼¨án,‘Ãü©KñgY¼ àI ‘ñ¯bÁßdãcþ®án¬²ÿ”ÙþåÆ¿ñ™½¤á¤öd1®ÀevJf§5¼,‹3¡ÝDlå¹)Ÿg䢂b*$Í͸"VJÅ‚só ¨Äå¤kTªQA‹Ñh0&TuGÌþ–Ýѽ¡À®–>ÛF(ô™QÃ$ÔN¤o°«}QƒY¦Dã»öÆ sd1ÛM .Bù€o¸/]ö … QÂŒ‰"CÁ]-ëxÚnš¾‘î`4ƒݬœ7Å “¹çfr¯7†iºÂ±+‘u¾èîß ˜²ƒµ„ý¢E—õ¦H< ˲Ôô…û->3èÛD‰Ð×ïºÞðÇx5Å7M#[ðÃÇŽ Ñ–Í YÇ ÇŒáXÜ .Ð9‚ê¸ q‡uÜ*³;„e/â„ÙçpëØ?áÙ®yGU:ðé0\' _À ˜² ÛuìÀktÄÄ€†tª–ÙN¡†0 QNµˆè Ø Žë±G§i֩ަóu:YO×ÉÃR¨ž¦ëÔ@34:O§™t>ßR:Í¢Ù:Íõˆk4W§y¼À-‚™/»¼P£NMÔÌ&ÐBBݤ[¸òÎZ éôì~£Ó Tf71¢Eǵì7jÅP¶"~¦X^§E´X¬_¢Ñ…:-¥eâªfî\“d®NÉq/–]µ´œ/³³ä¤N—PKº¬‰A§6Z¡ÓJZ¥Ñ¥Ü’tj§Õuè´†VëÔ‰ûuZK—ë´NBü>¼_ç'å ®HϺÉ›;rª"‹ 6Ã]ÜI}±_,E’ŽÒAÓ¥;Ø_Ø×o˜sR\Õ9/Z~Hy»¶K-XýšùrÞõ\sÆÀ`lÄ*~oEƒ7²Ìü~ ~5?¾º3m—7Ÿõ߉cÖã’W‘!ÞV¸Ç±Ò¦&»õK¿OO…å#“§÷dot\ûµÝ¾h¯åR~ò‹V ó¢K^PÕYw¥ý*Ij?VSë‚1dðý˜ÏW¦7û°––XDyg^.Ž\ª?û[I3í(‰£vä¹Åú ÅúìXXÏáùÞ®sÔ=?‡‘¹V3ÁFÃ4#fK§@ö‹a ’IØ9ìç'µý+M~ˆÔÛ60ζÎx¥'Ä”!_(nD7;~ÕÔóLŒÏR˜+ëåâ²b¹Ù~ªWfÝpÖG&§Ñ•œ£Q«ô3>pgQ4±[÷í që“n–ßYMß¶¾Í=;û:Öuö´ï\DZ·½§Ó~™Û§Uo¡BΰvyŠÍðfæ7ó… «±ZAqɯŽ_Yò¦4üÁë‚~Û5U¹z ¿ù'?ñ×þje(—‹‹gårwñ˜'«5îT#·jkä+Òjm¨ñ:5ö[#äb³F¾Û¬‘¯>‹Î·ž5Zrç‚ø~6FyÕäó¸£qÅGáÞ6Ž’1è<²­¼È5ŽÒ1”¥­ÊÓVi«ÊÆü1LmlCUcóª¨9hCr;+¥•l ñXØèJ 6ERô«˜žÇcW£G¤FEÓDrž€:Fè Lç¡Lð‡Q.ÁÃóJ™Bý5Cvœç¨¸ÃJEbBoÉ{@‘Gr’ëòÉœÇ>òÔÆm¼Ýu­X&‚Ø8GÕë’ÌµŠ¹Äf0³Ãôúä‘oæ»x¼Æ>íLW`eý˜'«úγzÆlϽ7gë¾¼3£gžµ½1÷æzš`>ñãlO¼„U ž»QÌó„Ñ3Ï´”¾ÁŠ@á)¸iæIœ‚®áÓ%"oÂMÊœm*­M,¾ú´üQ¸eš@ãf7q\9ÆÍMö¡ŠIM \°5¥¡yÝn>ƒBäix³†·Èx³¸u_òÔ•JM¡hÇ+·$Ã0}"®ÓÅuS·‹£§:ÑxkÎ`%ÉoÃÛy–RR£\{ ³º•Á-[›(þwà9Ä58äwáÝY6³›ßƒ÷*úrEŸcççÌÛ¡Bëµ:†E¢¼,¥Üv§H)Où)£ÄìS `nÏ .3+Ími‹Å.Ô »óWÖ+Â~NužÙɲ´·‰³eYq’Ðè™çDÈqè/`YýÅǰ¼§©9KšSf”ÂU}Å>@'1·Œm¸5™Ç7²‘y*EÛN Ô*üq¬C›`ØɆ{¸?¶0\ ¬t–]«º›NÀs«xߥ݉¹lë(4ÛS TWåôShÔðAÑË? eÇ¥lGrðѽ å0«—¹ª]·Ã]Q}Óƒèx$%®t³Y±°Û’‡êT‡Z`ÊuP®ð¨í·ºO›‡ÄÂ}Äž|!%Ñü¢Sp±£¦³þ )‘Q^‰}=¶È’ØçI9¯PbëïAá(¼²ªwŒ?!¨ê…ìƒ5¢óWë8 ë\¬"?N©U¡°XÔVœB%ç$*¸ˆY%ÿÈ’ Ÿoõôš&»7¬Ãå2«gáë¶Ú›'5Å_£2V ¼2YÆÂsgNž² <À'ðÉ<åi ·]ÚóOœá4VswÖ0ú*9•N£Pç˜XS^„OãìÀ£Èò$Ó?‡ÏguÍqhù 8 ÈSUNjMÍã(tæÜ_àዹԻ(úaŒe˯G¾# ñI/|&?˜ûxä$Êge+MÁgPG.ºŒ*P÷?PK8FÏŠÅ ¾PK7Aorg/hsqldb/ParserDQL.class½½ `]Eõ蛹wö9sælsææ™S_Œ16Ûj kºÎCš¦ka]× <™Ý 3Sà%¦ „Ra¤å!Íéùz2 DðZ„§býzjO%(7*¤GõR£Ãü'ú”‹¡›±(R¢´r'DÎEý³T!cz˜úg£V5^è,˜¾ÑëBd,BÆâ€~N˜-Ñ— æR p™Ó‹†¤å(¹ÂI ¡Ï•V©¤ë™“w=†r.¦}^@¯AµóÃìBý‚€^Ðë0ºú€¾:Ì6ék¹6ÌnÐׅؽ!ÌZõõHÛf·ëâicXߤoÆÓ–€¾5Ìšô‹ðr1Š^Ð/EÜÐ/CNƳ-¥Ãú6ýò€¾Ù;Q¡Á˜è•xjAù]½Û¬[ßà*¬N;Ò:Bz§Þ…¢{‚úÕ@–kð²O×âé]Ø:}w@æpRÞ‹¼ëìY‚÷£Á í7†¨“¢§…Ùô‡(¸)̯Ö/A@óø’?ŠJ7£ü-nEð±€þqÔ» /Ÿ@p;^?‰§;| ½: &ÌîÕ»ú¾0û¬~'rîBp7‚{B”¶O=îEpÊ}OŸÃÓ‡Päóxý‚^,Ä‘ñ%÷ËȽc}†(ø ‚¯bÈPã!<=Œ§¯!8ˆº‡ðÔ‡ …‡ÙßõG|ÁùrEðX@?fOëÇü8‚'|yß è߄ĒôžÄÓS@×§ú3!ý;úwÃì'ú÷0¼ï#ø‚"øQ@6Ì^ÖŸ è?³WôŸ ¥ç¼€z?ÅÓϼˆà¥€þr˜ýFÿ9‚W0ùWñô‹ù—€õ¯¼†àu¿Fð›€þ[LéwÂïÃüýºCü#ý‚?#ø †ôW<ý ÁßüÁ?ú¿ÂlPÿ]ˆú7Rþƒà¿(ÿžÞÄÓ‰è-¼õ“Aýs0` ± 0´0/0tÊ7Œ€a†y‘aè@ˆ™F཈ö‚  F Úa#ß 4 ‘ÁSžŠñT‚`‚(‚R£ŒAC+cÃlƒQ† œ&lT‚ãh°Æx™@½ „Æ$“LA0Á¦!¨D0ˆ "h$¤œ‰DИI$Ö˜6f7fsBô4ЍŽ14ªÂÆŠ‚üÕ`8‚èa‹,Fps>¡…±E–"mÐ=cEÀXæ Æ*¼œ0Î ó x”"gœOi†…§ Ô"¨ÃªˆŽë¬F¢g¬E°A=c=c#‚MÄoŒÍ!jt ^·"í3.Fp ‚mAãRB}£]_†q7!y{ÀHcîD š¾`¼=¼EA @÷£ÒhÑF¯ÝÔ+[<"*y¯qžn Ñ/ÁÓGÑÔÍȸ¯·àéV…§O#øLØè6öŒ;iãw!¸;lÜcìIÿ!q+£‡žŒ{Æ}aþ¨ñÙ ñ94i|p_0z‰Ç_DÊ—PáËxºÁR~%`|ñ°ññpÀøZ˜ß8ˆà@âhôc8‡ñôHÀø:^Äš Ѿ}4ÅÓcئ‡EÚ1ZdãqÌተþã›hí[ÈøvXï4Žcÿ>4žʃƒOcÛ<mb<ß ³Æw‰gß ëùÆ÷‘ö°¿=#HPðC ±àÂÆ³Æsxúq˜Ÿ2~‚×ç¼€µþ)–íg^ /…ù€ñrÀø9 ¾ŒúAûÆ+ãUÎ –·íÚÝÜ’^ÞÖÚ™¾¦“3»¦µ5ݾ¼¥±£#ÝÁYp{cgãei΢µmí;fì츪eûe3V¨äœ¨`Gs[+g£¼%d*(hÊêcª·ÜšÆöŽtûеµSüC¡Š!EçÊöö¶vÎÆzëœGÑÊkšÒ»;eÖÂæÖæÎÅœ%*s Á—ÖÔˆ .˜~!gÆò¶í41³=Ý‘¦aE+k¯hÜÓ8£¥±uÇŒ†ÎöæÖ¢XiŽôdŒnÚ™nº²¦£â]«/»"ÝÔY߸‹šÔ+‘ŸßÐÙØte]ãîõ—µPjq{ºqûú½»Ó+Ò—cÀhe•[¶L÷ް“ tÌ@±b•¾NÒ p$¶ÑÑBCó®ÝSK×®VtGË´È7ï–æËf¬nßžnOo?¯±cgCºÓ‚u4ô…íÍÕ‚-Ó/$Á‰Æ!ר¾#ÝÙ°;ÝÔ|ysS#FXÛÜA°Ùøvl¾‡ìšµm­;V¤¯êJ/@×!A×r>²·Ñ¾ÞÖ«qn­áì¬w2Q§"-Ea¦ ² H®V]e6r!½®±µqGº}Šó¾`úÖÓ*FÒ0‰È$ôŒ_p6©Ò¿º9†ÌÙß::ÛÚÓ3–5wæ,8ÚÅþ¹I.|'€Êê‘à–H&áSóvm ™LS„п¤åÞ„oh%ä–‹ÝBK[‘I^ÞÖN{rw[ëvÚkD‹º@ÆûF±¶+ݾwå5»ÛÕÇ G‰²r8W9}¤šØd´dÆ/ˆ=Œ_Œ×H!1Ÿd\ÎÆäjrYÛö½Î4DÖútû.ΊDÁcõît{£ÜÝÕ#z¤L§A‘¾¦½yWc;õÙ”!ЬLÌ1?ß&”ÜG›*Óš/×›hÍ ·ICÇîo0ÏS“n!ÚGÛL¼­joÛå¬ZI¦íuéË iZ›Ò$ÓDˆÐ¬k»ÚÛáü·Å3o¾T£ÐËÆTøÜö¶®Ýç5î!Ì!Ò-z­,óáD™f míK[·7´47¥Éi¬oÛ½º½¶yW3M,,RÔKyå°uÛÛ)©/„HðÅUmí`¡Ëw"‘p¿²fúð”ôcZ>´M´½¡ë²«°«Ûë»ZZhîþ¹HªGw¿ºÝ©‚±Ð±,TZºcG{zGc' ,V9<Ì#b­›[:…¼ V{lå0¥»ôµí]±YÓ÷u#éÂ…-]iú9ÓŸªèFGóŽÖô°åÆëœMölžá”¥–¶´€:uˆr™¹qla÷¹,3æU'fcHÁìÅÖ“(´§±eUWk“w³:£sÛÌÉumÛi:i’—f»äŒ_Í5îÍ;]Ùml®.&æÊtZ¥Í¾ºd¼]m­CJLòMj˜BE¾B’æ–øÒV56u aQXˆjCš‘øD;¯J§Û³òÆoHÌòq,{«ïÚ•nonrS˼©Cº IZ"F+‰¥3ÊrñFd ÝÙ¼+œì‚{;!Àì˜[{=ÕvŠÉ~&øòDUœ¥’ƒ^ÖÖÖ’n êRo.Útªñfȉ8YYu::Œ˜7CAÍÉ‹úóÒÛi/¶nw˜«J!íOX×¼cg'©ã<¢¯²•tçÕétëÐ2œÍ{‡»¡¶m5ѲÀÁ̵]­ØYÛ¡¤¹ìhkõ4?¿²æm?¦V9ר#*O,們vV®¶ùÊt®:kê;›væÊ–[qõžt{KãîŽ\%F;›u˜#Y¹Ê&²ÐÑÙÞ%ñ¹ÔWÓ³˜c|‚æ6¶,J¥?Ë×Ü"‹@Œµ¹3G‡Jœ6V¶¤w¥[;¥,»¼‹$ÉÖN’Ž[Gç$1gf’áŒc†&ºXšEë+÷ÙùmÍÄxDÚÒŽìªe9˜ó "{ÒÛ8 ó5pasújg‘E’çKÑsÇé),§§¯ÔŒ4@II×¥›ºÚ;(É?ŒËÿ/‡1Ò("­é«©k)kK¡wÎp;zÄéÌQ±êŧ7Ùÿ¹}‰ €E¦„ryåˆõ–žÞ¸N£o`ž¯ÎR¾ÆQ`AŽihŒÛÐ-lÆÐ¦ÞFý‘{@I]--{Áä·«¡•eGñ(†ŠIÚ0Š^‰Š§³f;~„Jr-1ÄJÂY}åÿfy”+-8·‚²ë¸ pX»¿€j-÷öÆ–dºKÛÛ÷ú€6Úé*I‰~*æ5x¹DB´§H°«êqP0uìDö½ha;‰¤¼Aèñ¾0ǨìΡYã2VÕíH¼rÝoÆW3¶&T¼•ÒMmÛs´cÒ"ÍŒ §sŽFÌã\ :Ó¹²C®œÌÙ¬Ó£dCÕ]4Us¹O[ârd í³,“9{hn©œicKº£É·@ÂrÖ°¶6£øì¤S‘t‹ß)È{[>cˆºj%Ð;nÁÖ†ša|VÁ³;¦µ)Ç:d*i²šîGØLR¤WH=ëj‰Õ²þ´‘ë»dÕÑËÚ^#ðôÊš-§ÛÊÕÊŠôîtëvÚAC›;M+eÍév)aæ™ó¨L‚·ßlþ“µùÿ'þ“ÕF¾OØqF’eææ¬ªrx 뇴¬%{¡öÏÌiO¡Â(udAt¡…øI‘ U9h¼°7eµÖÐIûtP05BÿßÓÞtNAD[YÌcÞ° ×¼MË?'¶¥ZnØÙÖÞ™³ùló’ÛÊŠ:Úµj,oiëH/#÷ÊtggÕ©QFžÕ„”™œ¨8ö êÕL¤¸³±¥m‡\«=}u3ä}T½ÐÖ Œ?ØZP Œ?ÚÆŸŒ?Ûš¥8›|‡?¨ü[ ky¶V¤• (¦@g¶fkù㯶ñ7ãï¶ñ-jÿDð/¼þOÿAð_ã ¢ø¶ñ¦qÂ6ÞB0`œ´S(5h2ÛäTÊÔLÝÖFáÉ0MÛ´Ì@À ÚfÈ ÛfžiÛf¾Y`›…f$`Ùf±Yb›£L*]j޶Í1fÌ6Çše¶Y®UÙf ·ŒñÔ‰9ÁDsRÀœl›SÌ©¶y†èÉÓÌJÛœnÆm3Œ¤™²Í3Ñî s¦mÎÂÓläÎ0çØæ\ó,Z…ÌT}×®ËÒí¶YeγÍù¨_lžm›ÕxZ€`!ºX„`1‚sÌ%Ä7‡œ/Á¸Ñ‘î´Í¥˜þ2s¹¿ï„wh}G£²Í&ËUBrHl´˜æJ[û›F£Y¥ýÆ6Ï¥õ0Ï3klí˜ö¸mžo^`kÓ´3Ưl³Ö¬CÑa怂šLÓfØf½V0Wûqj8d›k̵>PJ‘m®ØÌõ¶¹Á¼Ð67š›hËŒh‰¦1Ø´™Ú,ÛÜ tÚPoÁÓVm€³©§Å{ló"óbÛ¼+°Í¼Ô6ÍËÐ}SÀÜn›i Ír:gœÐårÂííAÛÜAH¢MÑhÈ;Íf?˜¼T P¿Â6¯$´7[€M»€¥­u³Í$ ®ÐªmíBm£m^e:uh[l³è2÷ÐÏÉÈmójàu S[‰ú«´smí<­Ú¿þY¢ªAsÉ [¹vè—º¼ Üà ´­ÚFÿB{Ïlm3Ön?­¢¶ ó*6{üë‘éDˆœó^Û¼Ïü,úúœm~`ø‚Ùk›_4¿d›_6ï'†Ù$°,îÁy@«òÂ#†aSš„›_1¿j›€ÏQûæÃxúÚ?¨EI’È]Y”`KÑ|¡J–¢ßŽâO`Õ{µ/ÚÚ—€,OhͶùMB>í[1í›.ÅëLm©Ã5+ 5¶ù-´¶“ÚÐ.ǘ¿à¸6@<{ìI"oÚç´6Îô¥µµœWÔ4¬¯©_Nôå)ù‰U ‚\º§#˜ÀÓþ‘xŠzK=ckW«ÆÓjsçÎ]éÎæ&”ýŽm~øù=@õûÆß‰´TÛæÌÚÚçµtÀxÝ6d>kk/k?·Íç0SÄwÍãé6Àè*Oi´G~ü zÒN÷j‡lóyóÛü)vÁχÍ—lóe‚>õüs[{‹DO¯ØÚÑÊO<‹à9ßEð ‚Ÿ"x Áϼˆà{ÀëWÍ_ØÚõíHûÖð—æ¯æk¶ù:Ðæ×æoÐÃo ä5+VÖ¯¯Y¿9`þÎ6o’ Ò&þˆÑ|OÂS«Öfk]˜ÄnMó϶ù󯶶¯ïFî €mEnØ65ÑC[;*þÍÖÞƒÏâÊÜkkסÉN×£‡÷#8®=ik7âéƒ>€à&7#¸Á­>†à ˜~žîÔî°Í¿c!ÿlü$½jŸAp7‚OiŸ¶µ»´;HÕte,Ûü§ù/Ûü7è?X´ohÍþÑÁlí½˜¿µ²aùÒ5+IåÍ=½æ+ôþkkŸÅÐîEð.÷ƒ¿a¾i›'Ì·lsÀ$ftÊ´-Fv@{ض¸¥Ù–Nhf ¬_Ѿ lê³-å ËB¹¯¬€mßÛVˆfk…­<›2~ã'H^c”måcŠV­M¬Ê*¤}oE¬"Û*FÃ%Ö(ÛŠZ¥k´m! oŨ{k¬Uf[åV…­=ñw܈ê[ã¨Gí(¥Yã­ ¶5Ñšd[“­)¶5Õ:ܰ*mkº'ª´u5ضV’ä+°Î$ Èša[3 ­Yrnн^‘3k6gæú¥ËjI’ºCû޶Ç'ÌHeʶæ4©ÖÆØÖ\3­³Ð~‚yægKƒëÚº:‰¨)™Á:[ûMÀ"h-°úÑÞ£æ×´îi»’ LƒZd[‹­slk‰µÔÖ¾ è,¿z^{Á/Bd|šlk9•°V¿³µWµ_ØÖJz²V¡ê¹Öy¶UCØio]`[µVmÕ›[û­FEVEÖ€fYu«Wl 8XkI²ÖY ¶µÁëBÛÚHR“µ Ræ7­Íp´×´×ÖÛÚj]dkÿÑþk[×·.±¶£ u8u)Öß´ý+áªJR±Â¤/óï¿JFºc.ýÆ™¼Lœ€œqzæqÎ*O×ɆÐ"{Sp¦Á{ª4÷‚úWZ®•{ (¦Ìœ93Û7¬Cí°8áäêÉLÃåv†r¼5Ó2žQY“k†³À}W`š$ ¼>…„+Vo Fg(°¤eC, “³uþÃuŸùbAŽÇ0±àüšáW$Ô䣽=R#´a7 AaªÜÙLû7ó©©_¿òܕ뼻¤no‡÷uÍŽeFóÓÔlÏСtwY2è&»«ºšÛáD ±DØÝhd(XCóµi…ÐéË»ZH³ý­| ÁþÃÎsH05Çn‹wwzûÎâŠa Û|oÒñº°«5} éóî®(jv÷bTQKÛeu4‹æÝ-ÍSäpWuµ´8Ã=3'¹¡Ñ°@SuSÁDM~Kº½Í€l;kvW£U5ây´-ÅéíÖÆ]4y8# ¬'„{ˆtÔ¶]æÅ¦—‘ nÞÑJlFºPºôÒáÉKN‹^h‘w÷LŦޖg¶ÍÌ·ôЭjÆt井Uƒ"µ> ºUzÔ7nß> 9Ü"Ù˜4  9«Ì²ìGÜ’5­ÛÓ×`+M~{÷f¢^F‡ØKc³–×#ƒÑ wÈ{5Ós¡‘ÙÜÑ€ü¼Voò¤:\mL-ëÒÄbb^kúj畳OÓka(7«9­Š§{Ød7ûP)Úܱ"ÝoZ¿¤‹‹Bð”^˜ÓF>YóIåԨǭ¼Mù•èýŽ¿¹ÀŽŽlÿç\xáaijÀˆ+O£Þ‚\s:í³;ŸôrU id°PµâtfLÃæ†õ+ë¶5lX¶vÃÊu›·Glª~iñÜÒ,z»N²¢z]­]»w·µSÎ*¢J]H,"D’°È Ó¶ÿNwf›Þ¹›‡vlÙ2‚ÿqë+¦¼¶«fíp«%ݺ£s'=l[:2 < Üpš’ÖPò;œÏŒpïð˜sI|É3È`ƒ¯tpgc‡òKÒê¶K—q#­Ó’SC½Ò¦3×9˜ëŠw.U溔¤ŽÄ&#…çm¼¯¨´Õ¬à [qîõZ™‘S¿ÉiõÛj„ë‡xç ;Oq-&¯¹Ãõ7"ü!*FͤH; ÊšGÒƒDp–¶47ZÅGÄsýB·1¬ºèAâ¯Ï&#wvP»Àï]ª@g›X÷,EÊaž¹UyeÍp&,ŒÆl%麲ÚvKV^@h—çÉ$ÝÐæ)Øžö'Dh>Kz¶I®Åñð ðÓ^ÓÖ¡nÎ…WnZ³nÛª¥µ +³Nÿ5ê†ûå ï²f­’äðMÜÀƒ ´C°ƒ«º-/÷}Æ"ˆØ|ˆŒ¥4aŸY¶w(Š•P¦¼QãMµZÛ@‰p¿ªfd±×+3É“\é!ÜÖW(¥Am#’SR;ä܉ª'sàí0ô_L¯¹cC+ø| í>%^cÁW¸ÊÉÛ[вštLP²zÖ¿vC%•¦P9 ½Ê±á‚Í­N­Ùú’°#±¢‚xV´|·²Õ»ÏIwB{Q¬Ã]…YÐIü"tiêtø ±´Ò>±†ÅBñ¾.cJ¤Ê!#m¬cUs;¨ºïµx5*ÅN+nîXßÞ¼ƒ–wÃnqÁ¡ÄM¬i%Ò©R‰âzÊéÍÌ´CÒdZ%~1‡³ÏiÒÚ·Ù©§k€=m!Ðá·sÁo×ý¯²ÅH,Óhô'»©±Õ}—ت¸+T3é+*̓IE;¼6)¹Bo-[éŠ ƒÏ­¬N V°ÉM¨Ê‡o ÙeÃߺ Üàë×m æPÖ”íDìóplî8¯­£SŠt'°ÜY—³°.«Þ¹”}ª/e›x±{)׿"â§…;Ã9`ÂU^€å?aÎÏ$‰÷<µ^ÒØà̵ê(05R–©MïI·H4R…Weû}ûôÛ¡NÞP [w8Ž~†2¢°<í´8ŸÀ\¤j›’§Þ^œô 4,Ì,⬟È2žÈ3Œ¬ §t°ƒžêÅõ9pÇ•³eÿƒaYZI6dß‹ÎʈË-Ë»ˆïRZžxÎàe*ç†Ç9â¸^‰÷‚ô^A·=×H‡õqéJ*äš›Æç°elK¨pZdQ‰ »au»b$ºWÐÚ¶šD˜]Íjv{W+®ê)Ëø¬ÜñLÒ:UÜkloíR&°°Ë†Ü±ûÁ“¼ÅQtWwž q²öÞéÃÇ)YÉõÙïN×® Ñg»Wt¥&ÊF¸!î¶ŠNå%ÖÆöÎÕ­é!'ƒžuR~ýÕmr7A°7ײìn®¥ÚÌqÊi«kŠåT›ðÔ>Í;JúÏq30 •MïÚݹW©Zy‚íÊ;SÂÓZ=«žc#pìQ;†dî¥H&¸"”©”ÜÐÓsɃS5‚ˆ9’-ÔJ‚Y©®Êq»çBñ½’¬eÛ)°ÝØ#j ©Dplò(¯¾ÓBaÆ Q¬®q7qpeÇÈöÓô³Í-o£½HܱIÝå%TI¨:寗ÅýÇÖ®py9D)OAÂïØÖዚJ•8¡dô°;p´‚’dÞ}xõé)ɲ¡á¶g.S€Þ­ÖÍ<È¢²…®SÚT¶VáoíBq›'³Þ§£he‘ãÜtg8¼D1YÃpCgs‹8¸ƒÍ^mÉi9´ÈÜvúðåÍ­ÛqäV´k†ÞœÈ:ŠÈº{) zÒù8Öu¼¨%µs|ÎÐøp6š-òÛCkk·-­­Ý¶~óš• ÄÔyꪶöóW,[Nln©QêØÍkŽ÷ÞGC•Þž+'ÎÃî#€™ÿjLæÔQfdÌÈ^)I9 á3Qboª÷ܨ{;dxhÀ¤ÂÄëùäJKÛwtÁp6,„Å…Hçv…©F\BòŸ u˜rû·­ëÅhž¢/Wo¡Ý¸%%²Ýç¥-`nâ˜3ûV›ºº¡l%䣾ÛŒ!äZž—‹‹ÁJܱ÷<,j¿$²ÔÏE3µEa…1‚mÆ~À±˜÷=XYS£Vfé ¦TrÝ3f7ѨX1/ÝÙÕÞJ#‘@_'²ž/=Kbßô¶v$‰cK ›¨išÎ3˜KDxÂÍ"ŠGá’ø:®­åSô)z*Ð ×"ô–d&C½ ñd?ãñÄ!¦Å}L?ÄŒøfnNÄû™uˆR_Ø-ÒŠUͪ§Qˆ'Œ>Ì(QÆS6š.‰'úY(~ÊûX8α<§ð(-ª /`\|Xx •32»›Jö±ü^j¾ÈÄÂnñAm®•RHc/ÒiRpç” ?Á,VH£úeqÑb½ÊЫL½ÊÒ«P±˜š)9ÈF=)¤§èaVºX¶=º›•Ñ“ÖÇÆìcE‘­=,ªÄfcTõð§Ê»Ù”"J©†úXyuPÖ¯P-Æ‚zWЅ޳r*>>ê#àÒäc¡Ãl"šŒ…¨úÇYQQôFw,“ŽºcyK&N¾_Àéï3Íù[_G³CñrŠçªx+ÅP¼â?R|Å¿¦øZ¼ËYL9€XµZ¤]ÑCËB ‘EœbSõÃlÚˆÍeÿ•NŠ·Š^ÜÃ6 A¯ R4½*¤W…ÝL«‡EDiä„{Y~4 ßÇ,ƒ é„ñh°›…f‰^V`q Ý £ Œ,²hq/ EìÅ-“ArË—O©nVíƒÅLà ý[DñdН¦¸LCÕ^‚SÇŠl_Œe`c…hè{}ä׬gÓ/H¿øØ4ýž¤_ýÐo!ýÞåÌ“ŸÝCÜlò‡œdv{»VL¿ˆ›æ©¤Üf7÷Ç=ì"äö‡4„¹/ö64ËÛÐ8Êà­$W­‹¦y "rq b3z™š¤E©8Ìfu³Ù™…ÛϦJÀÌVH~ÍÙȼJEçö±³z¬êÖ{–›ßhTåyP@ÂÿËþzàNñzŠÉó²ùýì¦Ì[$¶_æì£‘qûY¨"RÙÃ6ÉüjÙ^\~ÅË(Fû„ßük‚(0þ}YF²š"ƒUåõ²iÅ M(^ˆ(&:ˆ£Õ>¶¨->*Œ*CvtÎ1¶¤-, †>y'+B„=~˜-ÛÇÂEÑŸfË–£y76Ï 1ö³ÂŠˆí x¦»M=‚,ÑJ–»iÇ{X!ÒJƒ£ØŠ]ó‚Ôîªn6Ý»5Ê3[#¾ËíÓ¨2£n6*™ØÇÎÝG§H›OOÕ–ée *"´ºáyÁ^6ÃÂ<Ú¡H+s×µƒ¦Ì…=Ì¢â„âõ¢v%vÞ'ïñLõÃUaBwçô°i ébÔ-b*E±"ÛÕ*#—P8É­°´‡EsTÀ‚ò•ØCƒƒƒ_Kñ Å[Ô>Û'q‡WR¬«Ø¦ß ôÃóãr¿ñ1À)Š ¿hÚ“ršç[Ë¢í5ö±ç¾ïÉ'ò‰ü>•ÿ™A7í¥Èn‚p7Mƒ>KŒ_‹¶ûÙ¨²zÙûP“@V;/(Þ¯r+Çʳ*ËÞÎuzÙª†÷ùê}f/Ká½R½OÀKYÔÜÇJÕòícö(V?/™ H*íÏ5ÝÌ& ì„LQåê<^mG­n¶_-Ddr["×Âp†r§ü,î”)èck±uÕ¶ggG¦÷°óŽ6¸Ôr}5m®¢ o“YMD E“V bQ³cy´›@ÝE]ÑA°‡­‰å÷±Ý,(·+Ån.p÷I~­Ž³O ¼û„¶C)MïÛ´9–-èg›«ócù̬œË6(iàÓìÂA£`@‹qùcßbkG¿ÅŠN±jJ ÐÆ¾Ahš%vIUiEIiE©™·Ä8ɪ >Àò‰yg,ËÈ3ΰÊKÆL×¢'X(//0JË+œmŽ{‹m)Ôlúw†2gR\^|’mhe­ü²€V‘ÐØÔÉKpë0w• ÓL˜¾SOVô±-ÕF"F{}ëAvQ»x+.Š~ÇI ‹ˆÀ9«wð‡.¬ BŒ^ÉŒ4T@ °©m‚]x‚$A¦MÔ&©n¯¥n-Š7Ç“©>v‰ê–:Œ!ÞVm¢_3w¿?Èêw´³ª9‡QH L¶ ä8¦hSÕ8Æ0°íã$ ^ZŸ Á4PÒà8팜@º,žþ¿Ò4mºêö&’ l=š6G&ô³íuñ$qÙt= óòGÙŽjÈ“Q3fLÂ]8Ž'n#õN^8vóÂÈ‹…ßÔ)\Äg;C|ûa¾Ý¸üÓÈÃ*¥¨|Ì8Ì>â•w%‚ZNÑGk)¸¹Ž¨á-O²<`Æ­½¬¯}ìcÝlQRDÄé§×W$²÷±ÛîcãñD`øÄ1v;1ª’ÿÉtÚ§/]mID¹#‘Ù¶°’6Ÿd‹‰˜a Ï1 Èw¦´ma@[4HB©7ÇpsH(h‹ÙU,”)@)휀¶DUë#+,%%fAW¦(z2EÑ“)°¯|º–ø´ aFBeYœ>E¡:™¯:© N>ãtRÄ>‚}£šù³§™Ód3Q¦á[ª•™ŠáL9º7c ¨ê>¬ô‹@vï ˆ·ó¹;ápóÜ1¼ ¸Îýž9îW„ó-úM§ÞKUè™ä5j1ÉÝj’Õ$שYí¯£^{ºYaò»WZ¤î«;Â> 0kIÀZïgŸ«íegŠ ýìóþ\CæÂó…ZGüñ¬h”Y•'Is'L~“ª ²OhãQ­;ô”ÂØzÉ/’B„uý’§ £MR$«ÖiõªêhU5Å¿Œà~ÇÖ·ÚiŸ?OØI œw«úÙµDLßÊPà"í_aAÛÔCòE?{°Ž ±,_ñ°³ÂI)_•<­8Ãú  ꜲaeÓÅ>öP7‹%=\…„>ö°`mÔÃ×üBî_Ü­r‹xÅ+·Ü•‘9=£Ö×ôPs‚âÜ'„ælËÖ' ¶‡e·×ã‘W߯#ìöÍ‘±©~ÖïJ›Ùa8ÏQsöAö +“Õ»¨3¨‘ͺS¤ªK™ó ¸}=3"cûÙ‘jÓA—˜éâ‹,ó …ëžUN°È#ZvAþè‚ЯÉå%…v¬â›à}ôÊ«O0óM–”¢ôf(DˆÅ#B2ëczAö÷Œ|`0Í*¢ÊkÊÚ³”¦¸M_Dz¬¢§FÀ9š±æJ;&I&ùhA±@äë _'ýþJ¿è—¦ßÇ© LáÝô{”Iû^ýþF¿çU%‰MrŽ.÷ªªÆ¢ÞÁ•„òqašùš/ßM¾Ë›|L˜J]é„}Ü•½ºâÑ`{\X-›UOIÓhȨ2{Ùšœ„|ór×yeB³f7T½¬Ð uS“ÕË+Dyu0j{ àa)˜U+˜5)˜5)X5)5)­r¤—=õ0{¢:˜ŠÑt¾™2ˆ~~Ë“y?éHQZóoÑ@¦RÒ·«C‰X(EâÓq§Ž§ô{\ypv[&¡ÈT‡ÉMV~Ò¡ùôjänk– ô'zH/’»þ©%|ôE½'?ŸAɵ,v’Eˆm¯dW ƒm¼J£B0˜Oÿ° "ýycÆ”å5¢£Ëi;ä•§ÞbTƒ`™j‚6hë]N ðl©¢Ü^®D;|b¢Bi”F²â{z3ç1ÚŸÏ4–ôªÜèIÚÚ™ j3í$ Ó^¤¡À¾ÁÝïW‚û.Tö-M@Béßqhܵ=,!r"c¤´x@äw¨P7øk§Î{²[û^~3Ê¢$óàûYj<P¡‘gÄŽãŽÞ ûíg߯ÍÐüý®‘5r¥‡¬²c=lT‚XýöBŽÖBnù%„fÏö2ÃC½"Ì`ãˆMOÍ3B$µ-'!f“3 þ&,Ïóy-¯‹{XÍÙØº‹ÕÜž«¥¦ÃqZ˜ÇùEÁ Ý>W—|’ÙEÑ#‘µ‡ÙbSº¬«GÀ0ÓŠ:Ma?Ùü0{þaF£~¡ÖXL(ðÓnV$0’ûØÏzY1ƒGŒ6•^_„Q½‡E¼½t êÑÏï$ªMÕ÷z”í$½íÌOÊv¦U$3 %‡6t¯%ÒÙÇ+ØV1ã{esd[‚ÐîÕ>ö‹˜qÀ-èÂùlªòd0„,F2ãTŠóX)Ÿ²„ëÁQi;°Ü¢Ó87‚ãiA6k[\¹@.Èçx¯÷.÷6ÎMEO‘%þ*ÚŠ¢_‚’$kRÂ%²=­ÏdýM$,w³ÎÎdÉv+ÝǹFEz)Råœâ>ýæï›“)Î¥2ð ¼+€`“„æ½-¶ ‰X¡üg[VÁüRRƒ%vmV¥Ðâ\óR¥ëµS M¾V)´qØËþ‹A]ECzvÜ@R/Û&DÀÍq¨Þ¬ÄH>?Q+$¼•Tö-_ÊJpRzÙz=‰Æ€ÓûkRŸLdà]›‘ ‡ÂM‚Pñé\\˜èà~Ú2'™G•{¨5ºi!!ý†ý]—mª+uä;#ÍûÝÕÑÀ>V g³Ü’æ~ç´‰^Fy5¬º6Žxw4L¬µ—• nA4ÔÍB2)jv³1GØàæD2f¤rqVìeQ \&‘0.ˆƒµP,h"™+˜Á¥,:È–°€à\ÀÀ€67 %!–™%EùÅ,Æ“úÒ†‹ù~‡L3Ão°Â˜P×…‰üm×Ò Aç(¡lššÂBI°¥p[ÖÏ5ÇœOös=)m'>¢¨hTç'çÀ‹œÅh‘B‹¸û 傇œÆIü“¢ÝS8táŽÅ3#³`ê©ä㨻Z³"b¿¤ä0d¥²ÃÜ\¤Ã£†W›¼ÚAuèß¶±XRéhFùãô]bÕ1Tªƒå_³á(8—~äNÀ{®»3ë×/"?Bb<·"„p‰Xð{ú W$§« Gñ‰#y‡Ø#½ì —ª÷Æ£´W§íǃÀ‡O;•nƒë…Jx¨—Y%\U½Òj‰_Z­6Ë# =™Ã~­Ý9ì7úy^Üq?h&xA›áöæòŠÌ¿V?Ï?ý.ç”×£†~„ˆì~^+p'kYÑ ›*púq¢€¶”±¢“l¡òàmÁ !KÈW ùLvÎ¥zy¢°°îB.z¶n=ëx­¾ÈCÍÎ`Òé#"ø=ÓÁbrÑCR=Ž÷ñˆ¢®¤ëáE›#ãý¼¸ÖCPó™y’Møg™aô|¥Ó3ÿª´(ò÷gzå{ÌUÒ%àŠ«ø/QñR¯PñJ×3éRw¨Gè÷uú½È`ˆù<ªbÌŽöŸ¥Þç¨ørúmÆA1Å£(¦_¤\_þ@1µÏIuÖW#æ%‚·J,ÏA>ª›=$Ù§7ñ‰4 qá_°!ñ®0EFó2y"— NÆýîX«÷‹Ã~ùR/lRyñ>‹Þ"„7Q«$6áa>FÈÔÈØþ‡ùX¡àŠDʨw¹ÊXÁ[ìp 0¦°,O”§  µ¼!ŸÒUhóšr"|Úƒ2Ǥ¨à±: <¶Go–û„ûĈ0ø?™µ„dyzµ|'[RÂe”mÕ¥AfÍ/£¹ÛÆÇPÕ„_TTø «8J “ `l"mœý“ÁÃ’ñÞ˺A¤ùøeBJyI¿A„¨Îuû!1žO€­3Oöñ‰ÐzˆöfÇÙ•ù$Ãë´E³äÇÓ^D<ÕÖäºdfn£ È&i;­±l<©lp¦Üí.ìZ%O…Õ&Ž ».ŸX«0Óa㎥µÖ¡Söa1ÃÉãa#¿ÊiÞ´ˆ!“n“Ôã83Åró¾™h£i? Â4øî…Ô{DÅßJñ8Šq ‹óÚÏH\ïsU¹ÿ ”âÇC•é7«÷nêbõgUúU|„âÛ™°ƒ‰üÑJß Ê|ž¯â«˜æoœEqL¶ÏǪø,•_¥bÚ/ÚÏè‡ñ}G6ô#ô!ʼné—R|‰,G2(Ó?H1¡˜†±í¦÷—(þý®¡ß°3éG°Ó.£ßªÞƒô»[ÂBćTÛºô'…<ʯrX61t>Åo\ý<Ëœ]LRòì$uv1‰daÞˆG¢}|*½8x0·ÚŠY’ÌœÑÇ!õäFú¼>^³(¸3f"Ì*ö‘˜yOïãñnV,ì]јÙÏ$ÕŠ×RùJlº'£Æ~÷€CUº»ûy Ûz|¢OúQÑ~~&a›3葊Ǚxü—xœ…Çß‹ÇÙx|˜Éçà}.‚³T!ç[¢Ð<<>"çãñ+ As´>~6^÷Ók¤¤W£Àz¶ûùBd|ùêe¯ØWâl€ïò’öš²¹E€hÌì㋾s„!ß:È—(ï,å@[¡Ò¢±jiup!YˆzZæìROgÌÛ™Ì-áË‹Øõ‡ù ·{‘ °rˆSðª®Z‹ØÓžsv äÚö²nA¢ ˆDie²/Áp åÓTÕKä(Fï\ þxûÜf—eší©ÊL…”': -‹¹ÊµÔ÷ósIKâç!dHçOñø‹®oÙV–`yDÂø»IÈŸÇù ‹)çÉB¼ZŒcÞŠœ ¶›'˜Ë+<Áø›ÌšÆ†aPX`¶ýk™Z0'ª ”…´©y `.ÉÝ©¼[.ÊZÿZµüuIéâ¤Zú¤»òõjáeJ4%–ÝËnÛ–¹`ˆ™Î‘l§ÃÐøÉÐøh?CƒÓ&«^"ŒÇ«x‚Š'©xŠŠw¨¸YÅm*¾KÅ÷ªøË*îSñ£*~LÅßQñTü¬ŠŸ“1©8¢â"«qq5>SÅði¨ôCxÀkŽ lׂX[ÖÇϯϼÀË3‹™1À^°Ñ$ `6D¡.mäý$ô9v“d[ ·/àî<]² ñü{ú½WÅ_Rñƒ*>!c¾1Ð!c¦fw»;äZ¿.ͤÖ/”°‹%ûý-Tý-Tý-Tý-Tý-Tý-ÞåõIh${X^2uˆ×õ²|˜“©~^_' ƒ »0QçvØ-άK8åIQ~+JQ^Oeê3{|Ô“l‰k–YO§;ø÷y›ª2Ž‹)ÎøjIÅi‹Nâ)ZYg‹Îdyo±5¤ŽÓê¼Å6 °Ò€võ :Á œg{«Ø¢SZÙ !I\ãî»ÉJÔÁ9mÀ8ÄIŽâkÄÁ¨N/®Ã^·B¥ªPak­Ò}²Èmè[ MCÕªQÖ YË¥xù=Â%ƒ¸/_Wç8¼ò»õµÙͦd³ïr›-¦¡`ZPi×:ƒ}·+°>Mh èZo¨мIHí·™ðÂ×q¨Z)|³•ÂLX¬/ìe"E<&2EÄ‘2ø]φߵW;!Ý W´$ÑÑ•(:Â/Ü\3i>{¥‚(ß6Õõ^íÙaãXÞ)Ai9ŸB8ZG¯çÓï`‡¿# ¦õ„šÖ'ÐÍæ¡ÓVÚ¦š†.I•Ó™¤¦1Ù3YþiT{¦±r¸äo7ŸërϧRM'JoE™ù\ç’áµ’øó|]Ý]òLf‰š Ì g©¥‰«¥÷Š0‰˜|0;îoPÎ &4ü-X…ë]rkëðò\Ö¯¬Â"­x,‹ø.¹q”ÈJð÷–ïõG$Õ aÇT¦SÁ-2ƒµ•¶ýÔ ‘c¥×Áˆgûš) y@9›Ei›ƒër&ObÃáAí-ét5Y¤-á¼dÌn”ÅE…Þ÷º»¤H]23i—]äl’ëÝì %í†7%¿˜dF~‰Koõ@›$èN}&SŒ{JŠ$†Mµ½ƒ/x6©:•ÅáÀûàöù~·VeÜäYÙZ…¡`гÓ›¥˜Ú,ÅÄf)&6Ëϼj¡ že Õ¾63ƒió¡l|ÀíûgªïG<}ƒö#`Á‰B™ŠÇ«x‚Š'©xŠŠw¨¸YÅm*¾KÅ_Vñc*þ‘ŠŸ“±`Ü7)†|SÖœ„废o;:üä ˜þû¸Ãƒóhš7¸ÓL«e\NU.ÍPØÜf™°ˆ0ÌMŠô°ñ‘‰‹Üu½´KZî¬è“¾£dC8ÂM.`…¤(¡.ot»ìT]/3]êèr’¯Ë`«ŒLÎtÙèØéaïóôý˜§ïRfzú`%ôø&¤ ü=¯$_YéÚíČզ-õN9c±»ìm-v£™q’úçŃPâ•´+.ÇiÊ ð¦wð¦wðÿÿßåMn—ŽÿB“g÷ldR²Âî9›‰KK"^¦âå*¾GÅðr<{DlÏ…çK<‡¨ùw@GÕ€z¸ßYôƒLzAa0 j0 j0 j0 j0kߤø*Š_Uñ/|…õÁ9ÒvÛKꞣˆÉÓµׇx2)‹µÒô㟒;›|øc\DS)ÊÅ!~}ÔÌcjA¯£ùo.EÑcâòß¾ÝC,{vf!}¥À/Äšn~°™ŒÄÚD¶ý¡LÙhp•÷Šcü¼Zq-9qT¬ä¶Ö*ÏÀ#„'ÙT.÷]~ÃÂ¥W*|qRøh.7»siTsÁK;GŽrbûÏÊL"íÝþž)<çAËbXÏòÄ&rwëßâv·YmýY™­fžÙæ—û¶9+õ²µÖGaô“,ÊøÐ]~«ÛÍ·•Ïï~}!Üòøa6N¹–@H—gKÎ †Ê 3)ñê¹À1Š…OÑ>È&—Œ^Âõ¨Q€)}Ì=tؠ̸ÿÈÚAØ)ÙfÜJÇŒ+L¸Ù¶ÛŒås¡4`B ‡“n}*ûŠö¥„ñ+O9¶/Z¤K½&‘Ç·(«‹êwÐ(ü\ƒŒÀ„ô“±ô!ùF¶…}?{€}ÕEø¥Ì–Facì !š‹ ×'®o2c”ØÜYf?îbÍŠHÍôÎ,ªfö”Ç¥ Ì!ÇÀì.cˆiãXÔxnó1<4¼Ñ³r¸{ª©u‹©õš!OìæõñµOæùåFÎvSÏV©¼YˆT“3ý›LŸRßp”|m!%ùâÏê‹x½8â4‡Gz‰RüLÞuŹ?í÷Sp 6ë&ïÆBé¿Ò!(=#øÍò€JÏS±­âª¸±ß'Õ;$c‘/éëjäFÂÜë{Ù¿=‡ºòtBúîPª Q²:3ˆ@Õ{÷êÑ8.¿=NKHÍ\ÔäWâ-½ì HØEíÞ‡VOÎÍ™qRN¹6“âð³Êò Y@ѹ5ž¤Xï$iƒ'鏸›-¹ñ’Ì*ÒôêãAÿÒÄ4ƒÕ¦xIÉuª¶ÄÛ,yÀ¼±:@Ó]  xJÇs—Š×Ù±Ž 7ˆ2À™–ƒTØ¥¼c1ãÉž8*ÑðGö© ·Œë©•­©Ïô,íôì¥Ì…j9*2Q~{º„·æGý&Òc@>e£oß­a™{% ul‘PLjÏA‡òãñH¬Åe&&´IxN2*T¡Š~®¹Éq“uÀ©,‰ÇpÂÁÑD§Z“l.ç–:ÉÎ%}¦ã€«²Jô!h}ÆA ?H˜`~B¤¨KÒßD q>cúfÚÆ¤ù– ºr¦ˆ±iæ¨_ f|æÊÞ¬w¦A;˜'7ÂÜk‘$, †D½ ˆRU¦¼Ÿïq ÝÍJÂTIÔÂ=añ>]½Ç¬È\ÆÊf<³i£eöÌdèï£'— %‡p_PÁ$H² 0èé#üêÍýüx¨OÁàÛžÌ-ˆ®?Ô')oïF—ïdœùžNª;ÉÜ.RÝÇšRQs¶j»,å¿d‘r.X¤ÄeŒÃ˜ÛceÎQ”Wû²ûXnÿÊ&޼wð×âZÆ]^· Â}l¼° ÅN±ru¿"4Þ7À4>úMfB Ðð§-Y_k¬°" ׺®³Ñþ.qÐv²êðwoN$îçïñ:ºqé—!¼CðW1Uë;fC}Qd߯21T¸T!Ð×Èb\®\@á9nþóÞüs¯.8£H§2@‰ì%È^´X<Æs!=vÖNI´*b¿yEXû$+ç<¶”ëøYÊY~þܧGM‘Ù˜P+KZÂ7„–€6fæ=Û—Êaª¼¹.™UTàø|˜i7zjD £ÂwRË=®Ô'¦’¡¶®sO¼ù{³ì»y²Þþÿ±^ON‹×õŽÅë^7;¡¤³¢áÅ/Ñn¡l÷>·b•O™<×gñŸòIprh¸ÓóY·§qA°¾è!cû €Ä}£ò’Œeä`¢z‹sJê z“Ñ›¬ˆÝd)GJAË ï`)ø:2öÉÖ Ÿ`¯ûrð9€xjï¸4 H©Š½ÚUÅ[ÕΫ„Ürl±Sß»6‹< iŽZ‡ÍQŒHy°ª^fK·ÓXTÞ¹p!OpÕóÍ<8“ǹfqàÕ—´/»c“.æ0o[˜™¸×ÇßW—TgL>þþ>þäA~Ãcæ}B‡Â-8ºNÊ×UüÁxcùÃòR€Õ‡ûøMÄe>¢j¦¼8+È\޼߽Zy&MBx¯>ŠãëF8.É‹‡¸+çÂüíAUw·ú(ÆZù+0sybŤƒÞ±qBöQá@OTôñ›ñxO?Î E,'sKÌ b·¢Ì4î¨ó™Q÷™Ëó±¯h_U½WÞÉcÇäz+p:Pe÷ ÙøÇ OV> LÌDwqu«÷…qmÜĵñ"NkÓúBÞ¿ò—¼S ¬ßWŒÁ¥A{˜ßFK£7ˆaw GÝOÀuò¿=T³¢Žƒ²ãP,$&"<«ä $äÀõ€öë“p&-[WöñO§¼c0R&O”KTùT?ÿ´ã˜.xX50Jí¢`œ Sï™_S%–¨.‰'Ù¡›Z§›„™äC»q¿Ÿ€cŒƒÚ!w[{¾Âovº;¨õ1çó)Ò‡à|ßZõñÏTÃ{xÐMT'fcŸíãû(Å|’åcÕÊÅ¢ÅÌl¨™^žvŠMãâúób˜SúµÃîiœœåžIß WC\}_}ŠXË)w1ïJÉU»[Å÷жÏSÏû]ÀôñžH0Åu?p‡ø½ä÷⟕}üs‡øç‰jò/ˆ„ÞCü‹âáK‡ø—yT¹øøD¡kïÈgúja¿ )tÎjѾ®æ³]/ëzY¨^RL'™™Ž¢w«øÕgrh—6Ód—¸XO=qeÜ{¥ŒË×R÷ Q_/)#ÞpCRI’’‘±‡Ø#® ºÜ#¨ŽNP%©]ɪSÑE¢4@o•$Ê×I‘Ø›’<Ì’™Ü”¹#€† -$Z~'yÍYýÐ3\§¥,1:Ó¤+¼‚´;vˆÒ¯‰~¾ÔË&¥¼sÞÅßÅlÔ idΉ!nN‹L“`ͧBÌsç-ù<¯)yǤä­ÙE$O~ÃeŸKEžë8- ,¡=ù@}<êAAË£ˆÍúŠ—U@é{Ôå[Óo¨È ÛWkã qk».ƒM²Úc.ùZCCÀ VÈ+„òÊ q6šØCõ©Ãüa‘No_“uu }ü`KŒ’¸X†¶uM¤%„‘hýe޳­)Áî¯ÇŒ’‰–¢uÕö²Êº"µqéa~èd’LÞžjÈÈBûÁö•8tòëŒÅIÝYð¼¤ìâ„B$#jà®lm2j8eJñŒBûÙ™ ð=<!(Û‡ãTZ^Ç7¾æv§²¼¸ÇO>É*S ßdÖI–†Æ§æ–§0Ç´Ç€ò­}…×kâ΃ü/?N”>îz‹  qŸ— lSž§x.Oä>ÞijŸc£PjÏázi’[«×‹¢ê´üSÔ¸±?’‘1ó{Øy$›|½Ùçµ öñu’âg5o*ÿ èUë……£T:‹!1¢ : Œ #2—àQ4Y|.e²<1{ÂÝÇ 4ÐØ?ë ‰<åñ”X®ÄdðvÌ ¾9Eå_B$Ò±,Eâ±ÿ³=âK†Ê3š?ƒ;ñ‹ŽðG7ÇÌò~þXµYe@öIYüÍc“(bú)6V™}ØlZy‘¹"õ-JßnWÂ%/2#!ð jI4©L<”ïh!¤Ë~T~™G Ù4@‡Ré4Ì:)f>XïÊ—Þï‘-—p©“}Ës·HZħŋØžQ ºÖ'Ô'ãx­Ï.S-¬â£Ÿ?ž¥Ç‘žï¸îŠÊÐø ar5”8¸—úT¾0†“úDê ,3Gíöó'êᕪƒK¶°Ãpc]Žûµê|P·$3ƒ„oÆWMÒÂ*i.rW˜(\"p°î{ÙqoæÿæÃü[ýì…¬|áŒxi *ëøÂ ½] ‹,½YÞÝ=W¢Žûæä`Þ \.•×x'O-'Ø|×…p—b¬[„-ʘÎÝG3”þæÎ)–åLS=«! ƒ·è/Nˆfl þ-]./Ækßs¹ïheLxÔÑ,ç†åBÇÌb¤77ºãÊ“ÖY®¼¶vã£lÄ?¾]ï’¯¡¥;OÄNšsærgºùªB¯tÊÆ·nÓ3ªÈ/©É"ò*y¡ySâ“Q5Ká:…"8&™ ¿’%ü&ÆC3]ÆXŽOfYžø~—?¿8D@ú¾$íN<€×(lò'•UrT½b° ùx9q¶>6^\ÈÃ5›§º™s‚í܉õ¸3ö<ÎÆDEÚ/zœÏKÞÇ,.sV‹UÅqs¯ Ÿc;άXø@/›ƒ—ìCZ÷ÞCع÷Æ1m4$¼Ø§Óhžîf“”»ÂXÙC‰j[|PܧóL“±8f…tôN%úÙ3`pbæq|èà«P²'ÅõZ¡`b•\WñD*éãÏãßA•'ÙÒÀjU^ÿ®ûisÒªI]÷—ÅwÚµX0q˜o„R£åÄÑPÞQ7RÐ?è7y½þg "ý>”[ $uÎ#¬ÞÁáßߌ› ŽÂT; !A|ÿP˜¨¹Å,\”žSg{Ù‡ÙÍ®f¶7+[ÅIyYr©óïôÒ‚/¾åË2nþ¤ho²©gä°Ž€öÃH@¤ï`…8Âå ¹òÐíj7·û×Pœðgñq‘|ÁÓäñFæÂ—^êN{bÅ=ô˜ÙÉÕFK»w£øBÌrl”¤|¶ÃBf–ž„CË>^>¿aíY—Ü̧áÁÆó¬nüôNZÅħ9$}νjÓ»Bù*§—ESŽsK Hú\/k—ÇÈßÄ¡¨Ä’¤lÊ $•´JA¼†ˆÙòCïNaùž‹ës÷V’r¯Vо1ÒCiÐzœµŒå§„Sü'¥×`p-€Óf,ë(3ó136ú Á §iϹ|ã>åþ³#î~&Å ‡kðr åJ QfSmÎÙ ¾äÙ&ƒßw±_÷0‘éÌ8…ÛDaóœo­H :Í÷éVJãý±;Þ&¥w®iÕI,¥Áý¸.÷à^ ç|%™€Â¥òŸ¼ãÿï:|^{AuX«Ž±Y©O·%án%&%s¾4‘òCÙ«¹ÎW4í§îT¶)ѲÁBë.®lÙ]è÷ÂN"Ò¯Ö)ŠÄþD­’’ÙÂ4ýŸ¹íUÓhn™¼âHÆÛÚ™f*9tšuÉÈÖ>þüP Z˜õX%/ºÃø’ÛÞÁ0¼ÄÂðŒÉT[ß°·Ô à€pZƒzÉÔÓ4$ ê&%Ë¥àò8y<ã—.Sì´Iªí ½ìÂŒ;™¤¬ËÕ>9³H%qï…˜YçâçG=ÛòLT:¤Ǭ§Ø9.õ0™í¸R bBkþ²ös5­¿Ðd1­{] 4qÿ´>õØ>³etg3Q¾ø&ñü”žzLïã?νlYµ…¯Î;¢+µôâ“$SXGO14þb}¦Õ¬\ýÛ"Xà0 Lü%Ò^/Í–±•./¯‡(mÆWÄ•œ}üF©³þ$ƒ)ß1RrÚC'pŠ¡½ªýBÉu_¤¹ÃÀ\ZQeE­Š¨qé}šŒZgÁ.¨¼ª^;“é†|_î{MÝf}MÝ:Ç×VjèýŠÏgâ+€úâ²Óáz) sÂ_¯:˜€°µwc/¿i}üçòó»?Ï|‹ˆ É)yÊ·Þ`ñAG|ð$B&¥œU‰yñ%DÃÄ©ID~Oµ³‡• mG6´]Ù0¥^^‰ZUùÑ|4sé},•ŒæŸ%>†2Z>Õìgùò©¶‡…\Èù$ü@t¼ýR|'æ©hÆãðd=HÃu¤®Bbàa < bàHˆ†Å•{⬯QÝ ª{U’ªa]‚œØµÂŨe\ æ¯jD·v“„ ¹éOòõ/…#ABÊzh÷Rù!CÕP`¿Ç|E:ë=ù÷‡áž`ßc?tîÃ'ÃØEœtºÑb?ýòM6z%p 8HXÇÿ¼×5áï= Þ,¯Ü3è/oFr^NÂ^ÞI"+øÊÆ›,!¥\:düÊ'äaǾ+£3:Zïœýµ‘ÞúÔ”Èñw<—áJ2—9…âbÆÕç$bFnuZD- çO ‡ù/½ê® ”¸tÿšöºàT÷Ëœ™?ö—èQŸ?Pæ_k¿QUÊÕS$nÒ>ù> {Ñaþš[ò·ÚïÜ !âò«Õœ²>Ü-¾Û­¦yœ¯._„ù3“ô¸gº‡É«#æ÷ŠŠ÷ŒP¿wyÊyËâ/(}+ãgÈÇ=©þ¼}+-á¿v×à&qý@œÒúøoŽÆ ^¡jg# ñÛœ9]2GMnÑnA>Ž –˯}¹+ÎCH’òßg f}ü°Í?™KøKw˜Ké'ÀÿH»Kç91÷®€7ÎÄb”©Åå¡îïµ?0çC”ºòT/§f~UŸJâJáOP£)ŠŽ³É •ã Ÿ‡Ýø}jPçRY2Ò|J›it±g¦B¸)'|ÐÒ\ƒ÷ïü¸÷'íÏÓ¢º”åÔ ôo˜:ÿ†I¢­­wA"[ü‹jñ“ªÅ½uê±ËEUgéÖª§„ø.úMû²gï.yeÆ’O üópÅý«$6Áí/üìÑb|_\‘ct42AEcÞãõ Óç °q×?µ1çã Â¨ÄÏÓ3E.ÞÏÿQˆGê¤òýÏjçËgêžu5“ÎHø¤n“qà}9 ?f.–æŽá~¦ï#•ì ÐnØB©í&¿Ñ“¹Ã©L€«öC.(÷˜UTA¯ ECæ}ìï9tX4´/ãT|÷Bæ*êìÏT÷†Ÿ«rë.Å÷¬TÝROÝŒáÅ©Hÿz?,yX!¾õ{˜ÿ«*ODCå}üß0‚ABúO,ìÕRóa öß’´møª®^ZR‚c¶Y…•!yÎöí¿ Q~§´ŽoráNð׿Ùuï„ÿÂÿ™ºÑR!ßÍ,×óÿ.ÂW"Šø ¼xwÁ}´‡(E}îßPR0Ç_)?ÌßÀ'âLãæŒâÚD©·*ºáí:àù®v??ÙËFá§|iƒ~st Ng‹?ü²¬d–=mM@{ƒfý¦vBÍú|eKŸ¾¯+C&1‚$ @¹Üâô’TÔgÓä"éhðíBÙîÙê*è}QyÙ}l¬W;HrƒFkûÛòÌ_Ÿ‡Óð'¹´“îŸA™«H{™ûgP„ ’çòàOeCZ Gí”ûW$ç8Ç â1‰,â™ç˜ }L_úÄŸ Œu¯á—õk (ëÓ¸üè<×LQBg¦¦i‹±ú6­’â.Šg³ÐÿPKÌß; òUŒËPK8Aorg/hsqldb/ParserRoutine.classµ| `Õùø÷ÞÛÝÙÝ a7a åÂ&E6A4„+˜,„#A¥K2$«ÉnÜM8<«âѪµµÖ Ä£®ÖÖ"âE…¶*m=Zkm­¶µU[¯jïã‡ü¿ïÍÌîìf7¢ý7dÞ›yÇ÷¾÷Ýß› ?zü)˜+þêf3Ù]ì8ö%»Ž]ïÆ»öe7ØÙnXÁ¾BÅWiÀMÔ÷5ÙÍ.lû:=ÞâÆÇoÐÝ­Tl§Á;hðm.v;»ƒÚ|€:îr³»Ù=Ôq/u|“àÝGE‚ïw±Ø·¨x¿Mã¾C½¹ÙwÙ.ZíaZ|7Ý=Bkì!ÈRq3=&©wæî¥â1*'(û¨÷ '{’€?åfûÙûû>ÿO;Ù3„ÛÃNö¬“¤‰?¤‰?rÁ«ìÇnö{ÞÅ^`/ºáQö…ýÔ µì%…ýÌ uì%7{™ýœF¿RëØ/èî—T¼êf¿b¯Ñשø5Mz]a¿¡ú· {ƒ¶ñ;7ÜÊ~Oߤâ-'{›6û…ýÑ kØ; {× ­´Ö{ {ß g³?è©ñu*>"(v²¿Pó_éáo„ýßiö?¨íŸTü‹–ù·‹…Ùö.DóMþ˜îÓ€#4~ˆî†nˆq†œS!zÜFmv7wpñçNêpQ››Š…«Ô2Fá…4f¬.ã¯[¨ÙëæE¼ØÍÂ|öQ1žŠê@w~…OtñI¼Ô ×ñÉÔ<…š¡»cén*Ó¨˜NøÌpòãÜ|&ŸE“Ê>ÙȸM^Nw4¯ÒÉWø7ÜÉOpÃA~"s~’îF¶ÁÝüd‚w UTœJÅiT|ŽŠj*j¨˜GàNGîóùôxg:y-î/ ‡:°Pá‹èa1=,¡b)õnv_æ†wøYÔÛ@mH~¤»å _A+顉Šf‚ÚB…9ÆW)|5!.‰²†ZÖÒ]«›·ñu ?[áçÐó¹´÷õ ÿ¼^B cKˆî6PÑNE¡¯)|£^åTtQ¦â<>Ýu»U=(ö<âæQÞKPGŒãôØGrô¢Âûi7›ˆ«›©y êßJm»/ráÝÅôx õ^JÅeT|ŠË©¸‚Š+©ØFƒ¯¢âj*®¡¶k©ø"Ê%ÿÝ]GÅõ ¿ÁÃüËôp#_¡â«T‰â_£âf*ÈDq)}d¢8™(¾Šĉ0r×·Qq;w(üN7+â;>àfãFØxíýnº»‡îoRq *îWøn6…‹Š©åÛ4ý;¸wöoz|HáßUø.ŽyáH¸o>ƒò²†h¬sNWü‚îŽ sšµx<Ôd´µ‡"-V3{5[]´Ccài¡Ž…ÚÆPw_]w¨?Žm'dêÛÚ«Åç´`Y3ÛÚ¾hKoÌXƒÁ˜æ¾Pûù¡Þ–Іn íê.Z#Û£=½ánmy¯©ëÅ£1Ù§õh‘>U™›u8%ÚéÈ\/Õ]ƒÁàp³Ö­µ÷5‡#ÝZSt³ú eë¬ó›B‘NmI,Úß›.Rôa´Ä ßvXá(|ÂUx’A±±Þ­Ï²ÆI9ÖXŠ…‰ y—aï¦Á5g€«úôà">;Mé–X¸³S‹e^œAiɤšOG…+p!”œIÆBµÝ}¸L¯ÖÞnoŠö÷…#(Å*·®á¼Ð¦Ðœn”‡9Ë7œ‡º…´Þ(õâ=³R«ÉÝ™²iYzy,ØßÝν“‘b0-tx¥e³3¶.ÚÝßIIÃ9 ß‹Âg–¶4éèÖbX V~’äì6 ãÒŸgPÔŠÅµæ• ²{u¨»5aÊ^š–Í}1´Q¸Û ¦ððS¥H;—â:ÁPÎWëÉX£QŽÇ5èg@ÝÚkn EBhf˜Ïù­áciMÅ­¥Ô45D—²³>›”å\ea´MYXöÿ‹¸b‘±b“Ö׋¼+4ëQ7q(r-YCª)tZh“–~\Ó…z…?Žþ1µH/š)Aö¢}0žGc ßÇÀe®¾1=².D®¹ˆT¥9ÜÓ«7¬AƒÅ é¿%GwXÚX,´•¸J»’2µ†¹æpg$„,›ÚPÜhg±N+Páz4¤]v0a"—iÜ3tµãŠh÷&my?BhÒ6j1-Ò®Åk#… *4ü—ª` ]È<Ÿ2š×Í;Oe³X™ÊŸàO*ü)•ïçTþ=þ}4ð9gHÁÂ9ü*š?£òg©8Ȩòñ«ü9þ¼Ê_ /òŸ¨ü§ü%•ÿŒ¿¬òŸóWTþ üKþªÂ¥ò×øë*ÿ5õý†šËßPùïø› Kåoó?¨üü•¿K}ïñ÷UþâÏ(üC•Äÿ¬ò¿PñWð7þw•ÿƒ'þO•ÿ‹ÿ[åÿáÿ§òC„ÈÇü°ÊÐbC|X ˜*¸ª° »*BQ…S¸TáªPùë @cøŸQ¨Š±Â£¯*ŠD±*Æ Ÿ*Æ‹«ºUMM‹‚-ë[êYÖ¶à£×ÚÛÜRÛ¸B„_ù÷U1I”*b²*¦ˆc1UÓpãbº˜Á`r–0/u Ðt, Å»0"ª#_&d jˆF:jôkŠ˜©ŠY¢L³E@å¢B•âxUÌ'`¨Šiõ¹â$Uœ,NaàËÉ`ê¬ÊìL‡Îª8Uœ¦ŠÏ‰jUÔˆyª8] C·Õ[–#ÙFï%y‚;D^œîo4uÍ\5Ê1˜™³}FúV·% <ÙM´î™ª¨ TQ'ªba,šµ¨ìj±XKÄRUÔ‹e4ð,U4à@v5»V"¨ŠåüLŠgh•*Vð‡‰`(=+E“*šE ÁY¥ŠÕb š¹‘ê­Šµ,¨²fÖ¢ŠVѦŠuâlUœ#‚Š8WëÅçUBf«iÀbXhÇ}eG3ªè`™Jš[ªB ›NUt‰°"ÎSÅù´§nÑCÍ(ì¼QÑ«²mì*U\ b™ 4¢ÅXx“Ö¡ˆ¸*úD?Mݤ²l¥*6‹-ªØ*.TÅEâbU\B0/¥â2ñŒVÔ67¯YÞ´P—«â q¥*¶‰þ̬&SW¡~!ø«Uq@|Q  «]Õ²u©¾®¶¥~y0s˺dJ’≓¿¤ŠëDLד®›[¡ê)îÑuJÜ@Lø2!}#Qã+H 4 ¨#_E6ˆ›¨øµÝLw_§Ž±âU|ƒfÜ*P6Åò«íb‡*n£îÛ kOvĤŠ;Ī؉e½ìU ˆ»Tq·¸G÷RÇ7Å}*;‡KÍPÙz†áXqŽ V q¿*ßRY;ëPŃ´æ·‰®žlΩâ;„å ŽöÚMñ]Uì£:­;ªˆ*Sò©9•¨,ÀÊU±[<‚‰Ô(q¥Ê62ÜûÚ⣄L÷)IKGósÄɽªxŒ(ÿ8©Â>ñ„ÊÖ²VU<)ªTñ”دŠâ{Š@ ùxZeUÅ3âYU$­ù!}y®%Tñ#bå/þ"qí9ÿΔ­”wÄRÉ÷¸] pF¾T?»ËrÖ“Iú•ýZl«™ë¹Ô¤Q¢&|]}6ôŒ£éG¡HHèü9ªyZÉ[ºbÑÍ´2Zɼ¹…?W»Ü{_ô|Šs‹2Tj«É2ú8—O”bÀp§6Š~Ѧ•Q@YQ6Òþä;RÃá…áøBĦ%Ü£éJ›lF{«Å6a²-›•¸N=äs®“>äˆ<Ì3@™s”Ã`€^™ó|0ÿ™ž³#ÔÒW.É+$NzÒÇöG´-("}Z‡A¤Ò̤)ÃÒÜN­ÏÈ·ÎøÄ³ËŒcÈÔEµÖºy Ö<Â1ÓFÙ(˜rzc´|dÚb üó‚PÃñ`Ï-¦ÓL’oƒÌÚ|Ö9æq pŽf„ƒ Í[#}¡-+:1ÙamÆTPÛÒ‡üLL ÇSHúšR*uÇI²œãø¡0uü€ò±CǺ¬†ãFZ‘• 32‡!¤ñ–a&R˜¶#Ĉ¶oÒˆ®,‰ÉQ-’AlË5ÆaXÆ*'–å= ÛÃñÑh·2TÙµh튦õ-M«e }Æ,·µ¸¶¡‡¹D¸OŸ>i„À.GB±­Ä\b¬<¥ÆÑËÉXO)ÞéÑ„[jx›‹"sÃñTÀ†D–ùy´›N¿åö'–Õçß§=‚*Ï䙋EcsQ‰4½žœ%[gU#772ñã?Qo³ríbÝ^ôô¢§ˆG#FšR€–`aÊÚdéi†½I+Gc×wK7ŒHQ.»àjG«t$Ø:³—†"¦íaݲeho+£¦²úS»HlsYö4Ðeõù·2¦=Ù¤ÅúZ¢ú"m¹h)­øÆP»Vsô.%­SdÍÌá›rÎpÊcï®0RÙ†B±ÚJû…æ¢W¼ŲA‹töuér‹ù{!ÞI–TÙDÜY¾‘ãë­+#j2¦Úˆi¨WqÈN²œ¨ÖëW×6Õ-­mZ¿pÑâÚU -èr3)e q¢Ï˜¸ >XÛÔšžšWyãRÌ2^–é<«û´<ËIjo;½µ¨ë¤ù(íòmRrî€F›V“'Õ{QÈP†õ{¬ÛºÆì‘þÙ†¥‡â*ÇÕ@”•ˆ¬Úý¡nÄÞ—KÞÚñ—Ì0Ÿ @C‡:¦ŸR„‰'寇BZ ¹þVÁÔÌŽ c‰úH¢Œè•hžõ¶!;º¤¿ŠáÔ púiÌš ©y •ãÕ[ÎóÆŒS*¹»qkS/£Ò†•Á´²OØ%Í-BBê‡ÜèWš´8 1²+¾P81ˆUú¢Òàö•­“*?¾,G*M.’+ŽCF;ÍõàÈÔyp£Œqµ¸šáJ²_T™^$—óe,2”N¡U‡Ù0îoZî±Ç¨.öÉÈX|Úº[úÖe8üAÎjzk:Ú‹ßÕÆ{ú%šñŽ^³þ£=·Î!ùÅlô„‹@"“b×ç4f$ µÎ˜†Œ›WUG Æ"€ ÊI: Èm2ܨ·=Y ÕÆé=„Ö±8í¡ ùdƒéžÏÌàÏÆ[¯n2XG¡…n/gnƒ-gJcâ¦q7L¹ÖÓÛ·ÕPXýÁ§Jò]¾-–:·ª³‹ A“wnŽOòi`}>jf™oûÌtÏ÷½BJØó#tÔ\’¯¯t£¥‹²NäÒ,Ñ³Ž aïèïí&#Kü õÓ!SñLŽ7¸‰‚9–ÑW£ ¾i¶õÕ'ä­N¿k‰fã‘WF¼ù˲ (œáø"’&éæÐiÈ=4óÝŽÁªsÄÇ Í¦x¾!'»Â^LF•¹;ÚI[–åbG‘üþùc}ÇttðŽnm£DO»7‹ÙeõmG«·E#‰„œÕã²Xê­CúÌk,’\o«ß˜ë[ŠQQVâ¦aQ‰sh‡õ¸ßVÖ&cøPG‡åíliä ÏM£3äï‚îúÈ&Ò¸H2lãò…«­_Šu°–Þåw”ô˜Ÿ±fê8ä¨fË ¤0È´èG~¥#M—ñòE|dÌ„æßúýΤ²¶¶Qr³ô†%è(ˆ“´G:ûW}*mªs\ A "éd¥ YÛÌŠå³z ’¶9-&59”¢mdòž‡ ã›[›[5®o®[º¨±ÖÂÅKfÅ`íÑI^â´µâæåB –/oXTÄ(Gþ•>˜©¡ï ôI7¯“òñC ˆ …Ü N=íÆGfáÌæÎÒÐòìF··Ä¥Í}[»MÕ˰Àâ&èAÉ¡´ä9Lê„~*“Ö2бIgë#½ý”µ`‰Ž!OŸRH/a&ÇYATê”nÂiÄ<{+ O¸]Öãz3Ù£Ð&­7Žô5h›4´Eý‘xoo4Ö‡îV"v|ù5ðÕ¶)ƪAoãl…¬I£Ö×íXÕÔ•Õ™À¥jö¡ÉoÒÚ£±y9Nº)zÔÒ_:ÑüLãož´;ÈÒ⬲ý9IåˆSE cü¹?.•h:PjɲæÎoÚd¾/Cýë1ÍL§s} ©G8y>W”9AÜѸa|zX€71ms8Ò!"‘ËZ m–”Ñì¤Ó\Õî–DI›áFgåȯsæžøˆDÌV¶@F¨R_";‰:޶¶éF|‡…‡Žnyö#áQû'y¥¾h)ùª¦h´OoEÔ$Ø©ŸôQðj]²¿yŒKÇ íKêì`RŽ%}€]oöj-FÊ̈Ä¢ÆPo¯Öa|åÏ IØÛï2"$â´ÇY i+ä.R›¤ÏC3%,Sn=½ÑÞ¬EÔpƱ‘+7>ÖÏ~¨Õ|`—ќޮ;y#ÊŒçEÜOVÜiõl&ÔñæÇj_ë7Ç'Êï¯åÆixzŠb7>¥’ÝZF‡ùEeK ­læŸÑÕ¨Å:­í}:‘tÁöOË{5óCQÕ GE# ‰©n"ƒQãÌA?JºPw·eÑ\ß™j< ЏzÓV-ãÍ_úsæ‰ò\HÚê´›5ß{µ|â!}Þ̨~>I®ix鬥ukœ² ¦çÖê,æ7ìÆ_ d¾o>5/ùê?Áøz¤¹ˆöZx1%7>ú yòµVÿžq³Ü٠̲Ô%²ÃhèÓšÂ]Fžsb¾w†£qnY>2ÉC¬ìö‘OÕµ°,×9Wn}¬‘Õ,ÔzµHGJé­éMãÑ…}Gmæø.aeLeDZ™@?XÒ×”ÀØl|*ÿ”@yÅ °‡å gô¶¥à'€ø€5Šù=À÷€ðÂãà $Á¶ì­¬|»Ê“ ì7VÎíp­1ðA\/;^Kñ:¯ëõšùz¢^‹F¬7p®+ îÆŠ=P°Ôr¼v‚W³¿‚úp‰Âj¹²ß&—N° °wlcÅAp$˜¨H‚§1ÁÎÆÞípЉ´ð €JHÛæ'ØØZ´Š·³T?o`eØ?ŽöâÛ±ŒMhx!`^gáu†QŸiÔµF½È¨è5óõ‰TëÇcU²&TÛ~[ü  ø®:q;TYV%q¼ÎÃk* úi»aÒ.½.Ý•€8Μ¼–fà[c™[nÌd²l7L‘”K?£Sf!¬c·Ã±Oq¦¦=u'¸½¾Ç÷ÂôýåBAÅ®ŠgaºdK äÏqHñ™XíLÜ%ªl:‰gm‡’ ŠÀ-Y {õ¶Æ¸Z(«¶ë7³«åÕ qÞS6=*Óa°©\ì…Šj%eÿ”DÏ錥{ü ¡æ·ûI¨Dˆ¸R§ ÜoOÂñÕvŸm;âàHù9Rˆì~EÒB®pÂvfÕvÚ”NÇßâå2h¹/¯f¼§°j…Õ(lžÂNg“w:N™ÏÎ0ˆ´J'“¦2àe×H=1éÕŠu[0E7Û“°®U샳[QzÎiFÒ•Wømˆõ¹x­·ÝKáM¹M‘„Ï@ò8H-CD,¹Ÿom ý|1ÓT‡0èÕ.Éõ~@×ôöô˜šÜ”6ÉìwøÐ¿t$AÛAè=F}Ô,Tu˜TݘIÕSÁ9 àT­‘T=SRµ à0LAU‚©uÁ„Ãàf“'érXË$®5äpH·¿yhk’²3)í$yI‰KtI‘R© Ê")>§_A2ÊýŠÏ‰$éÚæÄí&²+=b‰Ñ¿’h ³‰I÷á=pž\M1Óo÷9G• ¦ˆª£L¢:ýÎ4QO眒"æH:–F»uf+¬îä\ÈÆäŸh  °~ÜBN2j’žÕ”Ñó[E…¡Ì¶¹ÍÕŠIcg@bå$Bu’¤áløŒ4l bHÊ‘/qIÒ¹}n¿ ã ì†n¿Ëç–bèÆm¾G Öãè ßüêY(ß ä’?š"«ÜD{tRôV»ýî4)fF?S åk1‰•$‚N™)i¤¶‡c'¶„-5HðJ”ƒ<Ž˜‡*+È¢zÙTy&$á‚kDDâ òú°ëIèŸ7‰ü¼ôz›°ss¶õ­’—S‘Ñ©†ÛN þmìÉ ÉDàÜ ñº¨BÜ.Fz_‚ônb泌]†šÇ[iøðMIøÂ \NÒ›ÞvíF¦°úbt¬l;ËP•Ëpcè~Ù‚tðÉç À$Û|¹¶þr#ÄA¸bF‹Ç›»ÇsºZŠ<½™kÓÑÜ–„«öA¬µt®&\ˆå×øí““¼bœB¤3[j÷'£±± ÂQ¹¤ÑùRjŒ#5fŒ[$0þY©Ç»‚èP>²@dã \ÖëH0ŠvÃõž‚A¸= „/ëðoL@Q€ }Å\ñ«8€XHÂy¡Ni¿½ç­IkÅSèwd;CÝÊÁufóÖ²aX&mcHû$?Y±éRÍ\üc¨-Ä9,hHÙndyí[ˆpR®!EïGÀE[b»Œ&O×xÊ÷›¨ø¦ÜNX|MGîæ¢¯ ' ·4Vì†o ?ÊQŒ®±ô•Pß>¸µû· ÁaG\â—P·n#Z Ë¾°Ü»òôÝ ÃdÜÍå)üï6ð¿|tü=]I¸=y¹‰Ñ:¶ˆ£8½Ôq7L&ÔXjÛ8Zƒ·Ë÷ÁUŸâµÁ ìÕ±&ª‡aº)Àé¯V°$|c˜šQÞÔhH$ê@¹ ñ³‘´†2_AO£Š¢KÆJO#}ïz8µv1Øu»:îGŽ£aeMØa/"ͬE§œØ­c"6ÑrÞƒ¹àä¢ÍšqÊzP^³9~Ž%ËeZñùf¬oÂë"¼p4Ûˆõ#ØþÖ{ðù¬±^Œõ÷eMÏãõ ^¯a;…wáx L0]e ^›ñz·Â 7%áÞF‚h5 ìK ’•‰á•©»Ùa—§é¹¥žÏ†äåŠUm­¿™4¤vŠíô8ô× iy3!x&ivʉG÷%†ž¯ð4g!h‰ÄÐî‘=jÁ0TößT!WK @ºßãÈ@W¢ƒÕ…4M!­Z—5Í2P×Ë¡Ïåa‚rÈžQ@‘V'Ž|„D|Gl—lO£ú­íàõúÞ6b|ŠôÙ4—ïë•þÄî1°{0qä¶Ü Ù9¦ 9­§ý)5íÛYÓþ¤Ò3ïTÙ|¶ÛÀí³y<÷ÂXDÓgÛ ’å>Ä⻉#>Ú;a Âý×PÜeà½+qø­O1QÞ(zxvï·ÍO¾?­¢ÕP~„BøUìc¸ª°t‚­pza¡oLÁoáaQ!^Û¸YÛ±nVpœE6‘m2Ú9úû<Ãò=`X’k-ƹ1|Ķ3“™OZ¸ƒ=åFJ~MB2ÃÙ>? ¬êŠ!L%6Ê1ÁÜKg1)¸+÷ÂãÕ6i§ö‘‘âa‹´ù?†ºÃP¬°5‡À‡fg-k5¼ÿ™ˆvž°éÁ1Ʀ”rP<*p ¥<¶ŠfФ(B[dî®qneÕnŸsÌ$Ëû$YÁe«r&à¢J¿; O­AãX"ñ>ÏçD?1ÝoŒ³Ó¸fwào¾·&u>'޲€ß…Ûø¾1ÒA#ggCœàs¢.’gj?¨vÝ‰á •2H¼ÄhêYc ýš¡`J„­^amó‘aer…­Co yºu+ìl×a8ónÏø±~Ï!DZûv®!í(vy 5OŸð4f…$s$Sèaž VbHò(<»Ê¥’“RNâ·QtbÛ(MÂX{ #Yˆ¡)ýY Á¾ ÝÐRÃc´à¼Ýðã ±hž£C˜IDeåS¶Ïï…çÀ ø¤ÇŽ€g<¡Ñ<Ò© ¿¬D P«6¥Ó€B3,ýIµ­³ð[«í¢ÊásTbä> ùíJŸcn…MÐvv4Sã\4a?Ýæ@7ùªÁG P9n¡Ö ;œ -²Ö·{(C0™áö^˜ƒÌ ƒlHÑ!¼@a”“˜#àRØtì”ëvÖaæ~”k M:3˜ 8SéD–\$®$9‡É%Û‚õtÚ™s~JéÆã˜Oñ!Ý)xgè›çbö÷Ê´ý¥ÖɃð³j›¨²Ûöp@T)ëÝúáì ~pÅ(X¦»XX‚5zbP ¨ý$ŸÃjIdº•*ŧì‡Í¨íFíÀÚaZ=dÍð)ÈH KØÍROü>EÀD4 /cˆj£ ìç ˜èÇqIx%žôz¶*{b¸6%%© gz€,Ê^:÷KÙƒò,á(¬))%'8]¨%66“¦1”ÚZærqEQ\ã}.Œ8/> ^iÆP¨Â: ýY†Ò@Ç€' þ'aµFJÃ¥‘äø$üÒ)ÏAß‘ù÷ôòNR’€Âæ¢4t±n.b#¯ä]¡äÝ«­µr~EÙ .ôšßŽ–ìu¿wûkiY~c&¿¥¸r¼á·ïß%á÷”È›ՔÛ"Þ2º“ð6Ê &½©G¿åå\]#ÿ@gϨ˜;`N¥IÈÊ=ðÇÔ¾ÎÜA.|[– וd)¬•'ätÊZßît°ã£b1Y @ ³ÕSX:E %",jPâ”|)fònÓ™¬¤£}L>MÆVêöômò(ëM“OÂ;H0åGh^-)æT°!{ÄÎF¾Ú-8­‘–Ô£âÈ^vñÞ£™‚-â»,ˆÖ%åkˆÆ¡ ~öEÙ—‚Œywœ¦SñDŠ€Ç§Ç~)¡µc4 üßKÂû$¥v]ùqOY©Î„‡!ʇ=åÿÆb<^^#º¦üÍ š%à¯`½ŸK±îÅçíXStüÖ×àõ¼nÄöob}+Ö¤êX߀õ}”\cý4 àõ>¶_ŽõXãb=ëñúYQ\5ú"þ½J¢s]¼æè¦‚`ñ0Ö·cý\ùø}f¡×÷&néÏúñÔ³¦–"gÿLðÙ–&׿b›/«íoØÆ²ÚþL°³Úþm¿²´%áŸØr0kÔ¿°í‘tqo;œ…Èþ­Ñ\¬ÿã)Þ ³ÉkU¹èÃÿѬC8 =w€N ½û8˜@+¤ßU€5I8œ`mf[a]ÛŽ`Û¼ TP†hæð(Œiže¥D²u, ×y-]B•õö#ÇNPå ";ÍJY£ÍJí<§Ë¦3ƒ(¤VƒŒ!úß–§ŒƒŒãý€Nc”Þ.°ýZãÞ†÷÷v¼ï5îxßa?Èli²´ÐjNl›/ï\A:I¡;7Þ (x?ŸWñ¾ˆU»ôÃXÔ¿kWey’©¬H²ÂÊÌŽê‚ôSÁ~°¡‘.à…è©/‹»r׊¯Ëú.qÕ†=¸N9c¤ö7œ‰¡Ó,ÃR²U9ÃëØ\äB_aü(x CyFüµFž™sðž‘U ¯CN9 sq¤×]Œ>¥À6¦@þH@®‚‚µhÑøÅL‹ƒù°C:âN2,Áʬø¶R¾`c)÷?HþŸyŒý Ê×°lÆ©q’yõdÉ<3ÞÇŠä $AòT‰‹Ó–±šÞŒ•ዹ3KÀ™Ùlš‡¡ÃŠÖã¬ÏØÀL4™$®1½¹Q:2iö±q­žåƒÌ·KFœþ‡Ë›1çÖôœ œÓZi™³)å/÷믤áôà ¤óbãÓ·nÕk{XîµÚ𬦑ä6߬vNÏœþY}ŸôÑ!é£1ú ‹Î““¬Ä¯¤Éë1ç µ¶Ya[¤ËÛšÚÌc3w"ÞO£H¹ØñæÞä[{޽Ùio©Ýèóÿ»Ý¬OíÆ¦ïÆ‘k7çâ>ô ÉÝ\˜Ú͵ÈLrà݈̀u7&Šÿ=ŠmfP¤£hÏ:÷;ɤñE&VÌ…XwÉÜ(;w´‘rÉݳI6Á”¹âñrE‡ß!Ã0‡ ÆùÄ?Æ[oÛÔ!}öÊ!£6¿#½³%Iy3¢–† -Ñc*êô*ìbÙ®“åS÷Ø7tÑc-fv2wûQêS%X”ñ² ½úûôr©Òïð)siÌ6E¾\2ò³s`½ô@ÿ‹E÷™ëœ= ýS‰jÛèàyÓ^y*(ÓQIß³FŠÈZ–i¬/·”ah§5o—ºƒÞc‹|•Srè%? ó¨F&]š2¿7ìCÒd庞ÉÖÔ½šR*r§eÒíwVc~(‡xæRv9ÈŽµDãé#…‡>øÑëÑyœ:yœGDw7'@T¦·ß.Ràl)…C¾¨,.<ÅÃp<äúCÊËX$Ùå&Éà^CB¶ZIfë¨Ér—;2w)™\ ã<u Œ¯Hy‰Œsäñ“ßZ 뺥èFóe†0¿¦‡¼ì1½÷z};S«í248›R¼A6¬²õ5";B/’çê)ö•©Ï3VlDÚè‹~Z×™uÔë®Ë¿nMjÝmì*cÝ—qUZ÷´UÙJ·£cÌø2nƒÙ_× ¼®Â«¯ƒx•ëçÕò Ùk=§Uª°}šÙ>–Ž×­§Ëvêºã) `Ø<ÝS’d3‚Æ›D»<þòÛmò­Uµ±r#‹±ï§Ö=Mç8™¢ZÇ×8—÷½Ÿ£0Dþû&cƒ'gŠÓ²-`dƶf´íé£^¸“"m àZÀtœN`‰ùIИ^Ù\a̦ùô©Õ4°±0ŸÉÎC9;Ö±ÀÅ^Çñ߃Ÿ½ÀgŠcÀõÿPK—a¸žg)aPK7A org/hsqldb/QueryExpression.class; |”ÅõïMv÷ÛÝLBXH¸ƒ(B@j4 H8äðX’°ºÙ› ‡ÕzáA/{ØÚ`«ˆGªÒ, (ˆØZñnm«Vm½ZµÖÞµU)•ÿ{óÍ·ûmvèŸ_væÍÌ›7oÞ¼yÇìòÌg€iâ}?4ã6<‹_àâ‹>ü~™¡¯ø©¸…¡¯úðkøu†¾ÁÅ­\|“‹oqqã}›§uqs;·sñ<‡ßåÑ;¸y§wà]ÜÜ™‹wã=\Ükà}ŒÕí‡áø=»ŸQ`èA.vqóû ý€‹r±›ûöøñ!ü‘{¹ÑãÇ^ÜÇcû¹ù0CxÀU¸ÍÀƒ~¨ÆmŒó¨fá!n>Æc‡¹xœ›?fè.ˆ¥Ÿ0ê~ÚÑOy[OúñÞË>ÅÅÓ\<ãƒIø,CÏø¼jñ5~Æ=?ç™/ø ?œƒÛx›¿d®~ÅÅKLúe.^áæ¯™ÓW}ø¾î‡eøkà nãâM.ÞòÓðÛŒýcÿŽ©ÿž›ï2ô÷½ïÇ?à~ü#~è#èOžù8C~.r‰!IÜ"¡|C âºÀ…~Ø&Џ(¦·yáE¯ì…—¼"à…×½b åb˜W½b8Oá%^Qʽ#Yà´Òp1ŠÔVŒæEÆ0ÎX.Æq1ž‹ †˜è#V&1£e\L梜‹ F¨ä¢Ê/¦ˆjî;…79•¡iÜ7¡S}J2§ùÄ qº_̳xZOÌsx§gb.÷œéÇ"1¡ù†Xà‡ƒ|ÂY­šD­ž ©)1ÂYØ1© ÝŒwY¦ÕÔcÙå‘Dƒ™- %Bc¼XƒÕKÓpˆ©ÂPs3s¿.b&*ÖÄ]Ãæ&wYA]4gP¸cA¨Ãl0ã­fˆ&*ᤷ–··}ՒᎺh‡O$k7˜Í—Y-ÚÔ²X{½¹ÑŒ¨¡¥fs'ml£…ØDÇ1—ƈæ³=ÑÑd^Þ©¨+…ˆ„,ƒH%—Pw‹å®ä¢iêá´3R} Í8 ·ð)[rÒ˜C20y߬³m¡p´.Úbn&q"…¹¯Z0ÚzÒæ±æè†nÑP~s¬­=ÌÂ&ÌÍ CœO}µi}´ÓºhÔŒ×FB¼ñ ÎIOH¸ ϯŸ>‹–÷Ì Gɹee'5cò :öÚX í|áÉÍÈ60µÂV3±4m5W„âa–q_Z69í–¥×yfÂy®9eLIR¯C¨“tÔjiYUgtÙ@¼Ô1‰A„Ý”f–JÊúµKÐ× -;E²7ä0(yM‰Póedœ´êÚ¼ MgÒ!ݳ³Žd ÷ìx¬³}v¦M“^-eŸªÿ'ê“W(o·ÔM†XFi¤©š®%E=jõº¨ŸÚû‚-bÒ5Rg™Õ¨–dÈ3iU•$õ$mËMmY³ô’m5ÄrŠåȘgŒmˆ›4ÇGÚ« QœýÖÔ_ÚªŽ ª¯»ÔlNÌ6ñTD»Y´9Õ²n$¬} O£Ñ窵:Ü^ÕksÐ÷'È\ßâÛ2ôS³N«›Ü¯o˜M1¨ÅÕvXäSúa¡Rb%i6o¬s™íx˜÷4¦lò‰¶mû-Å!»LDRžm|Yÿ‹:|¯Ü@†ºÉŒ`2VVF¢©Ýl¯7‡V<ãm1;šãáufG^çyS"NlÒ> I[Ù(dUà™[vÄE¡¸í{S>¿•­ w6†ÚXl²4eÓ+;µþïc_Ó¢˜¶úÈR( @e4?Ic|ë‰,Y?ÃuÑÄÉcœXlöúº’5ex’Ùà®Z¤Wµî•>†¡± º?)ÚìJ΄ɾ·›-úÜ ò+T58¨Š²˜b1!(w¦™Þ¥ežšÛ7É}jgRhµ–¦bÊ](ɡ̇;’|/4ׇ£¬}E|ýñ()™mJ™´wò«­Io¨w?8i=Ò8÷²Ò3ÌÖ,]I푆P4ÔjÆÇÛmºZXZ»Ô˜ K¯34“„Ë Æœ“5ʉåH \ÄW·¨(5i¾)lL§”–É ¡TlÏ!NÿjÉqK¡su-Šf]ÞÞŠ˜|/G Ï0‘¡q³=jvúVí¹O`ù5¸ €¦Ø÷šÍèš 04y…Ä!X*á_ð‚ÄB b•«á÷~G •ð¼mˆ5R¬JtÃûs¸TÀ;ð¶„wyò$"#.â¾÷¸ø| á/Ñ´&‰•X%á¯ð7C\,Å%xºÄ™Xnˆëð")š©t ë¾¥0Åz)Zʼn³°\ŸàÏkÂ3¸ùwæeS,!ðB"o †Kq©¸,lÊÒJø#|hˆˆm"*ñTÂ'ð©ÄUœÌ–hy(–=‘É”"&Ú¥¸œ7\P_'Ž’b#^EÉR_?!Å&±YŠ-<á ñ9C\)ÅUxµŸçž«Å5R\Ëb^ˆ‹H;S³iI“®£×1Þõ„"¶Š¤¸Qܔɿüx<´…-P] ©p8±EŠ›Å6 ñ‰ýƒë â‹R|‰ ø'Ëu1.¡LŠ/‹¯Hq‹ø*é´ƒ¤¥×MÍ̶Pºœ­¾@R|M|]Šoˆ[¥ø¦ø–„ÃÇ/£“·‘4йR|[tI< Éà­b»¸Ýߑ⻼¡;àã4aY–^Š;ʼnsñL‰ux.+ÇÚÑÐÆpk(‹WS˜FGÑh·9æ øWŠ»XCÄN„ª“§ì€w‹{¤¸—5ý>Ñ-Å÷ÄýR<ÀŃ\ìââû\ü@ÜOV·Mâ‡b·{ÄCRüˆ5a¯è‘¢Wì“b?“|X<"Ñ‹>)°xŠG¥8ÄÐcâ°ÄzlàÓz\b#ŽJ×ÐÌ0Iâù¸”Ò£¾Z¶ s=!Þü¥ø‰xÂ~É=¿¾Þùfeµõs7û§\<‰@gyõæúÄhµðkü›p‚¸Fò—òsSjHau|J<-Å3¬ų/ÆK$†pÄfl‘¸·¤k–3ç—â9ñ¼„£ð Ÿ±Rº¸@.Âx©Ä"ü3ñs‰ó¤xQüBâ †~)~%1Ÿ¡—ĈxEŠ_‹W ñš¯‹ßHìÀõ†ø­oÀ‡,“7É¡§$¶h3?g(a¶óñ¼%Þ–ÇÒLëîÝ¥x‡h‹ß‰ßó­Wb7"Œ; W*á8ïê¼Vâu8Qâõ¸Uâ x£Ä›ðfŠû÷7é×/•õâ½ôµû{( ˆ"3”îûÜæÈ&ITYƒ]§ÉÉõÍþPÒg§ÝǺ„gaâÉE%éú”þ¨à‰Æ¸#“4ÇHºo¶µ'¶(ƒIÙÁ€Ï!>~IÕ#²ú0;GÜlE,}2‰¡}õIgìt„¯ frZÙéÊê²&“«êXˆV¿ç543Ó×ÑȦ¬iÔɳ]e l­h47¥¬åDÖÛ“yKñR†£Ÿ*½D\ŸLÕ ïv*5SOu­ŽÈGeõýÙdgŒDë?™­Sï.b¼­}:07²ïôEÍMv±àdϪÿgS²¤m!’p8 ³6äÆ!ÊÌ¿ÂfW2:”fÒ¯8u …Õ÷r”äÅôkIö×âþ9e!\üÿ|#<ù‡8ö‰Ê`SÌÞuDYm¦°’žVÖߨ“*3' „îMĬ˸ô‰îJÒÍZFDçËŠÉæF”ǰœ„åp3¾áÎxKœÍäZOsKHeCñ-ÚbOç-ýûÊ\Ë=hÔ…ÿ‹qïŸèpëñ‘®åüë[O]gs¢“=õ9ikôo“c]M …6ý¯ãUß8«mœX u7[÷,Ý´ëhjÉ>¿wèÃÐìô,©Ï¨õî©¿êØ’|Ûceö“U8©wÐ5«Uh´$#“š§"qº­:ÖK¬“Û<©¥êúûŠàšf9*vãŽ/âGöyÌmìl[gÆm„Ù–W¶Dኪª([ü6)KÌ›= vj{2å„1ð,4Âs0‚ð<¼@ðÏø4ðsj¿èhÿ‚Ú¿t´Eí—í—©ýŠ£ýkj¿êh¿Fí×íßPû·ŽöT¾Im†ß‚·UýŽª_>Uû]=þ¼¯ê?Àjüð¡ªÿVõ_Ô8ðó¦ªÿ®ÛÿÐõ?uý‘®ÿ¥è¿„©úøTÕGá?ª>¦ñþ«ëÏt}ܪtººÎѵK×n]{tmèÚ‹>5ݹª–˜§ê|]ÒuªŸ…©šCÐJýè5Žä!¨Z¾°¼ Т¼¢rÊW¸÷€Åá ê # ÓTT^±<­¼² w8ŽÐ¸´Gä_L=ÞÝz´KõhQâQO9‘ðÙ³Gf÷ÛãGéñBMÝ]¾rw5>ÇèᱚÑ!6´-Y^Òy彿GãÅq¨–D.#º+hÊ {ÍñÙy*°Ç'àDǸPãD¤ÐŸ”œ?SÏËó‹ˆqãIðsE,Q%­–Ô "–±ô@ç<Ë5•1´1^%P^ñ÷Â`šØO;­è…¡ö¢“±B£ï7To+¯¨ÔÈOœœ®€‹á‡aÂN¨`8àz‚ÃðwÐMÔGTb/”Ôx‚¢¿Õ…ÝÇŸçUJ«ž„i6…‘‡v„€«Šª‘Ü ¸¦QÛ!¨ŠMjÞ+’)wjPuú¶Óa«>_tìã¨U°ZÊ-‘ï –¸ÇÏ¥zBéà/ ¼¶&>Æ…I=jKcqÏAÿê(£?k²ý0™È–k&èÌ+ø`Çì±èW6ZÔ+kXL…Gà@ù¨Zµ¦r€j‚N©qÛ€'g†0XŠªÆ´oÐô3|Ao/L»Î øÄ°H¯0¦ogvŸQìª]V|޾ ;@û,™}ïÖ¬­nÚÙærÍ ¯ãõAM8èêQÚ^áÚ5Öy%²м³sŽAéäÜãp:x œb`µ§8UýM£?d«~ºÓ±øS’Ú| ÃÁXü/LQ½cŠ?!åþ>JßÂ7èÒò-ü­L¢™=gÄvVhÒŽ†œ¹¥#vÂ-<°æ”öÂ|]AW/Ìå{Ø gºvÀæí…ùÆXtÓ½\pj{aá ONÀ³‚Oå¡»¡HM x\-=°¨¦wÃdEÁ½FW2t‹ÕðÜU!’8ŸbqnÍ!Æ™Záì”dF‚q òhƒ’U« <þÄ„OÁÃ÷Vð—wz¯³´Wqĺ´6àRôº²[ÔSñ0œ+`ešs“Mç/5™*mM‡þyêú³éÉfGrÈ<+9õ&Ío¤Þ¶{­Ë¼WéïÈýÐ Ì “Ì2ØhéÕH­^©RÏÈld]ªÏ`ªÆf ?¢.2gx+á/>S£t=z >Féz´ep–4XgI£m›™.Y”ÃöÕrM™á¶/ ÁžÊ½p~À=­ÆÐ@/,á­bØ£`_Ðxšº`¦î{–uAÅXF'¹¼Æz dæ{I+˜•­ Ñð¹î„ü€tofÀ»¦kjãû#œI”Èh­Tžc–eµÙ3æv‘èõ^õ–zá‚XÅú°ÚºYkºà”r¾=Ê»ær]ÐÅÏö×sñLt©‰‹êêò ÚÎE äæ.î…Kæ–n‡|P¨Ö= Í»KÉ&xi¬ew¡¼–onr~ÿ…‘Σq>.Є9 äÕÑ^³6¹æ½æÄÌ5Ýx¢¥öR q‘¦7DG_~>³¡2gÚnq…gkïžkywÜi¬Q×ï¦Fé‹QÒ ®œ¹êE¼È2‡†Ö¥ÀV§‡}”êd=¢c¾»b/lè‚lè ï„â ‘„ Sá P@@¸uUŽ—Öx»!ÿ\¦Zr¼Þ ;©]mL*ô’!v1 ºÈh/éÐ ‰ú¦1Ã"Â]yX¢¸À &éòœNŸ¹ô©£ÏÅôYFÏkï†Z ^Þ 35ï†* vtÃX &ºa¨;»AÂÓE÷æǒW#F­Æf«ÚÒ%ên”—ôÂÄ·;èÍ™ôº¦ôÂçxÃW]»“ç½y¹óèV,±=#_‡yžc•dõæ‘s „â·/N: ýÑ®gù?…!~õÏ[<ø?lœ«íäHR ²œðlR¸Uûá*E}ž”äj]_Sã®R'¥$Ì£«èXrfx”‚äØz¬Ôƒ%rmxº!ÌGð Àû>Ðg¸†ÇWÙ2Re‹ïQo…ÈõØàHs„Js”UÜZ_a¹€­ûá†ú ;ëjLfMƒuÖäµðoÜ¥1ã1YcpŒ½êI…¸j·¶¹©ms“žK³L3ŽÐ´Ãp“žvsÆ´&\¦Ïz™NN>>ÛV•ìƒ/Ô¸s8:)ÙIѪ»`t/|q¥è_a|©1uƒÎw\ IúíÖqü£0«žAºNwT¤éÒ ×àÚ,;iïôB¼H×éVY«ŒÑIàž1¢$•ÿØ¥×NmC¹ºqˆŸò*üËMöT²Vì:­€­’NõNæ–ry•Òëžt¾K á:Mau1c¥å:½ÝÑ`È+×iʴùüÂÒŒ-Yâdï²fçêàð®´”_~L\¯§–h‘OÛ¹’‹Ãp÷^¸Ç–^+nH>:ûÑ¡îåÐå>.º¹øžP„ñR>U£³oYk©ÕZ"Msï٣ټ?¯b‚/KJ(pb‘4qPð‡|¶=Ø»’ެ¸ÜòZjäû=*¯¢ü¼¡’srîÅJÄœò?ìÖ¤µôÙÝ{ÒV-'8’\õZ•ÉBŠÚ ?ê…½|¢ @‰»›Ò<ß UFÊgî^ň•Ö+HÕCлöõÀZB¬qï!¹Ž'>öë寂ë 3°m>9lj©À±ÍÀ(‚1V¬ödÆ8^Ÿ Ë.õNôpÿù^žœ1U?/±Ði㺃ú •%ó1ÑùH›^Dp<9½BObÅRþò‚¡= ôcÆ>ë þÕ•žx5uÑV¸ŽÔÉœ­ÏœÔ©þ$ãý(§ºåVJ2‰®¬”¢ŒC‡¡©ÆUÉ6÷±½p˜ëÇWª4ôeeXÚ)í/Wþg0˜dÆb; •Ö}LàFÍÌ:}çñòIcòãÝnH§~ò(<ÁÜT+C+K9œd>ˆ…&µôŽ W9ƒì%7Ñ’üº·èõ¦ëc*µ4ýåÚÝÖ‘éµwîÆ1Js%ŸÚø9M _¨o|–õ‘ó>í«áxÖáŸÚ®üJ¼ª?Êøy¼ºß±kðÚ¤AJ]^¾©O*_ Í‰ÕÈÙåÜQž¤ÆuÉgÐR=¿PÏ?¢§±Ÿ]¯Ç­u¥Fµ"}%®§º`*;yjåí Œ„æQ-ª†u+¢²BÙl´"ú3¸Êó(¥æ x£^d”6°Å¶}Ú6¬OÛ–ë&¼¹?äglägläÁ žz±H,!»„'ÄLì„àÿPK€?¼{„H@PK8A#org/hsqldb/QuerySpecification.class­| `TÅýÿÌ{óöín^nXH `ØM8F‚Ü ­„dÕ°‰ÙÄÖ³ØV[mÕÖ6Ôi5¶Õ*1Ù`QDk¡ÕV{Zµ¶õ¨V{Jü¾Ÿ™Ù+ÙÚÿß6óæüÎw¾óï5³<{ì{cÖc^~иÃCÉWmãk^f(ìBîë^6ڸŻÐën{ѸÅÝHîE²É7¼üû Æ7‘܇ä~Ûèò²Bã¾ååßFî;¶ñ  Êê‡û.’‡=4Ý#¨Û‹‰»mãQT÷ º×kÄŒ>›ÿØ6ó²ÉÆ~±ÏxÉh>€OzÙ ã ×xÊxÚC¹ïÛÆ3^6ÍømÐÃH~ˆäGHžEò’#ù ÷<’üÉÏü­¿è_ÚÆ¯Px1Ëøµq'’‡Qýþ2^Aÿß yÉoQ÷;ñšñ:°Å7Ñð{$o¡ø6¼ãeçï¢ø4¼ç1Þ7þè1>0>ôPßÐåÏXÐ_Ðï¯Hþ†ÎGç ù'’!ù7’|Œäˆ—6ë?Èõ#9ŠäꎽLFE“(Ó@bzÙ}¦@ÎBâB]Ü^v‹éA΋†,ä‚bf/˜9¶™‹šÇü1’Ÿ ÃóH^À¢Š:Dóç^ã5óôKÐøWØ„Qü5’—ÐåetyÅß yÉoIš¿Cî5‰”»¼Žä uæ›Àø÷h}Ë6߯ù”«yÕï"ùŽä{Ô`¾ï¡ýù£—•˜Øæ‡¶ù'/¸Í?Ó×ü ’¿ºÍ¿ç¿»Í¸ÍºÍ¹Íc?Â?v›GÜæÜf¿Û<ŠÓ•1ǧD0·àønaº…p Ë-HÎ6HÐän·ð¸…×-²ÜÂAÏlba»EŽ[äºEž[仄 (t‹náè˜éL·Ik£Œ&Œ„ÉÇ"W„¤˜H(Æa½$ÉgŠñHJÐ0 ‰Ä»Ä)H&!™Œd œŠ¤]H –ˆ€‡ÔÒÒM"ôʰ‚rt™æÓÅ g¢¢OÌ®5Ó‰Ù8·Eàúæ,q$¡)*Ñùt`u†-ÎÄ UHÎBr6‘TÌñˆ¹â[ÌCÇùHØb!g…m¡hGsûÊ†ÈæÐŠ–h¸=ÜáŒWs–Ž. GÛÑÆöúPs¨±ª×qæ„£ó7on mnh5qæ G—¶µt´"O#êÚšBmõ¡m q–ÓÀ«Ú ›CQÎÆ®¯iiÛ<}Kôòæ¦ÓW¦¶žÅY~Z÷šž³q©šÃ§/£ìü¶¶†h§A¹Ñö†¶öêH$Ô&áq–Š4¥–s.ïµíXØiÒë• sñ­D„(5°ÂÆ-¡ÆËÎÐ?wKöpdsJMv[Ëöä@βBTXØÒܱ5B«½~È r’ÕúòѦÐ5á­áöÕáh˜ÖMó%ëV¶l¯&Úl•ìP#¶tD04ŽVJ]žZ’,“­ñd•ÜŸ;8‘¬Kl'!îKNœÄšês’õ‹Ú8soiˆµEDŠp´>¼µµ9¤1(D9²¹9´<´µ¥mǪ¹¤‚pô‚H˜6b¥b¸–íQì·,¨¬ÚÑD»vTNGÑÎiˆ£Z¢‰&äŒWT7…"íáö4f,MÑÒ¼-ÔTß±Q²Aúºbß93ÖÛí¡­­rŠñ§ 5-kˆn¡ßÓ(‘_ÞЊÁtn<¢¡ø¢S‡¯ÒLžÛg£UúPxåæVƒÄ´þÔ1’ìÓe Ìjéh×L=ˆP²VEêè:; ·ÏµÅbZâ–­­aìN¤=t­É‘GcasC4 0u¥©`ê5£F<µfEC[4Ô¶èüšIéÀÏZ7u5gbaK-¾´ô¤†`D^CSSš,àlæ ÑJ“SjmhkhoiãÌ,•-›Cí«š;¤LÑ›3¶tê U. µ‘Üj"fÓÙh¼Œ¶UÖ“Ï¥€¬ ÏŠK§+Ñ|šýŽ›žqyCíèÔÕ¶X™ŸÖ§d±:1©hLé"'N˜2m Õ-M*©Ð ©Q‰ÔÚ\ÌßB#ÒTßn$¥/#¥MÍ_}hšH#Vî@rÄË à0{Jg± ¡-¤åêJ}’å¦BièZpŒÊHR Q˜ÚqÄ`$”¡vÕöò“{–lØÒÂi¦å/¾¢½­!AE̪;+“ %—–³’Á‘5VG‚xÙÅÃP›œ<ÎfœðÔ¤pFõ:Pqâ XÒÒ6?Jâ&½ŒLŠ¡û ó››[I†µš¡æj•ëÀïKÉX±Å2›ÿ;#åÜÕÍÁœ-úofž:¤zIgœ–SÛ°5ÔtnK8’PécÒ¥…4D´ ?V \|yGƒÒTL}é tÈÐü¿n(N›Uy~s˜ ž¨-jÈQ† NgÁt®ÁúѰ¼!BTl›”ì*eôˆÆ¶Ñ]á°<ÔÞ;“œ_j‰Æ UÛÑÜܰ1ÜL–­S ÐÊÌd÷¢2,%uª">ó¿L ŠlJÔaÀš0X::çY´Gd0¿Î(´I ¥N0ïDÈžxþb ¹Fô@“‡¦¸ä¿¡Çÿ„/¹¶´™wþ3WGÚO¾Ç‰Ñ+ˆh㥔âd²ª0N[--Ÿ]’ÊY§ cÓ å¢OC¨ÎNÿ Ó˜R ´w´EèLÅ¥¢op¥t÷r⮫ZUlŽ‹9MìýÁ’A¬Hí«E͘¾Aš/›ì­Ýf²iIIùRɤk)VµrA¤§šbÈûK‡6gòSÁé%L<áQZ-Ã<°f¶54‡€Üø´1ç§ûѤÑþ?æˆóùaòK‡Úê$V:ü%þ¼#êÅ*G\`Üìð—ù~Ü`ŽX-Ö8âB$kùaG¬C²žþºüÉûü=:ÈâO³†Ã?ärÄE˜àþÒÇÑþàt±ø„#.Ñ€YŸã?vÄFc;qún¢#%!~Ø›±Yl‘nÚ”ŒVí¤dV©>R¢«@¡°#.åÿvÄe¢9Âa«ˆ8¢Å¸Ù­Ž¸\´9"Š%͸éŠgÑnоŒ]þ3þs‡ÿ‹ü ¨úK_¥œè@Ý¿hzÃcxc2QÒ¨B2ÅU”ÛÄvG\!v¤COò¶#®äï’ùî# ŸcŒ4F9â“Öcøc,’bJħÄU¶¸Ú×ðwq­¸Î×£×\t8;ø"ÿµ#>-v:âñG|­K ƒ|G|NÜh‹›ñyðÈÄÍŽ¸E|Ñ_·:â6Ìx;ã¿¥%K€þeH¶"¹É:Lr1’V,éËâ+Ž1ÅùH½;¨N|U|Í1.B—N±Ëá?Äl_w:ürw!¹Û¸Õ1N5JqØíåÆ4‡ÿóN0&:â^b@±‡?ŸÎ€É­Ð¦·cœed;âK|ûp@ß/ºñ€ø–#¾-¾ãˆÅC¶ø.m…xØåñb¯#º‰a30üQÑãÓ8]½à”˜#ú@Ä‹Å>G…ÜUÖÕŽu iëZë:ǺÞjt¬OƒÕÚ&zµ­¡&ihX;­ë3ÖgësÖÀõ&pÜçë ÄÐT¼™¨œ¤ñâ+C­ÊÊ9Ðè\б‰,nòYë×,^¸Ê±n±¾ˆäKd,.YY·Ü±n/ˆ%ÔC+j/YÅ™µ²zé2úŠsëªkë6à}»x†–®¬»€ŒXcÁZ¹lþêêÚ¥T[·rÑ╎õeCš&»ÿ+ò.'ýjpÎz´ÜAÃ/ö’‹œ¸œ³^ÚÔÉ CTè“( 2ÂÆ¥äL–DZÚK"Ò¹‡YäIÉs‚ÇiP®¼,Ù¦R æû*5]LkAoÔ˜savÊ혶”Q—Õ…[²qÇœõ^Çúÿ'ùÍÑP´$¬‚î–M›È7@W»·]„$<Ò ÎØflw¬]8»PW Ay ÉR£Íˆ:Ö×¥ýhÝéXw‰:ÖÝÖ=޵¢õCŒ¸ÉÈÍ¿rÙoÀ7P÷Më>Ǻßêr¬ p¯µ¾åð_ðŸÛÖ·ë;t°«k£Ýè Mk>h=d[d\k\çןvŒ #MÈ)q¬‡þ${‘t[ÚVcõZ¦3ª´çë[CáM¤mA+:ÍV ÉçÉÚò·­>ÎN9‰[žôS›4{Ó]j˜Œ¸lpœ$ÝI¹K÷:ÒÂ0œMNó†çä,M>©h1I¼1}í‡${å ôˆÒDÀ‡NNâ–Š³JHN2¢vïds'}‡›¡—•¼ÌªŒÐä½}õPÑtxÁ"¾’ˆäŠ´Àö!wÈ{òT£i7R¹á(Ô›ÔDÔ”’ŽÆPä×Òâ:Z3’IKŸ?XÕá¶ÄÜŒ8¯4-`§ÛI–ÐääÍ75´‘{䦮z*»½E®œ|ÃLp3ò„£5 àÍætÞNØê´‡©)‹xh¥¡ŸšzfLO;Ù~Ú-$­0´µµ}‡žNâyÈÛèÄ- *5E–œÜõ®1ôµ(‘T&·3]4„ÚÚè€/FJZ,¤¾Å¥éao0dBÃâÖ¼¥UArâ;§ŽïˆpòÂ2åÒ׉¿-H‹æù31¾~«’—v‘%cNŸ<É Àa^ƒïÓ/†C¨#’è°•7œ²È¬¶d œHùæ)E5ëíð@k^‘àãawy“—r\Q:T°¾zèH¼¨ZÒ‘,‘ù­Öà tñ[¢¡¦ºMœ3ôüƒ¬‡ ÷¤­s¤ Ÿ+Ï °jjÔMœmÿÿ¡¬þ'ñl­ m´‘;þ†|Y1äTë†ÃÂÕÚÚ²M›LÚ’–¶9­t°1;uèÃÈYÍ0D'q´ÒÌÅÕxLU}ªz+B§ƒÛÈ´‘q{lµ4#ɵݔPJ6¥ó"ƒžˆ¸Ô; ÎÆ ²}&¤äKo[Š)ämLy :èÁaz!íâHžWÎÌš!ìy8ËrÇ 2y¤­#í aùä¶1õTm©“jùáË´åÕ/•Ów¶z˜&ùL+1Iꣳ™'b®wúªY†Ò”,RdMˆÑFx”ŠQYŒ†¹ÕÌŠ“UòFá`Øòþ|xoI*æ- ê}5^—TwꆮV0Ýñ‡ßc&ÞÇeòÜáH|¬‰¤:9±51pñ°bÔÕÕ,ž_;à-·2(´´4‡"Ú®°©@ ô4u´6‡Õ›²üÖ¶ÒŒÑÔ'9yŸb‚&Êœ¬ÆTöA´œÙ!K)ê¸OHHÆ%ö§¨tÀ“™ô‡¹é¯}RÛ仼ôÓÁsÊ /aqÝëO{Ð$q©‹/ÁJë[ȇÙêieÊj‡ EÞ€iZ u!Ò©¬Œ‡¡5tdÑÖMr¸r´J’Ö¼ÓÊòD&ko*iOzÌÒ© äûñøšSä-$ÒŠ¶ðVr­Ï íPϧâ·ôE$`ê•ÓYƒúh…£Ý²QÙ¬¾è GâÒz±ÃÑÅpuñû€â@¶‹K < ÃE'Úî“UØ™íœéˆ˜3+%ð:ô®’-¥ïû¶´µ…š³øHfm ‘sÓÚ¯(=ÿÿõ {ëøoÊãͱ´™ê×µ-’%Ô|:²à*]¿N‡QÄß´ùñGŽ)ò%€Ë’mQ¥·i\0佱Ĥ“éG'HBƒå!ôôeÈÃfKciyÊÄZ{Qm¢kŸÝÚÔ@~x|šœèeáVHªxŒSÚ ¡ ¶ó;“4Ð mÃ\Pzrö™bN[Úc¸žÀæ¶&úëçnòN[tE[K+±¦|–µ1²°|äª\ GH…F ë3ùb'J¢fú õ EÚ娳Ò/‡èEÈ„šC[©¨_ð ñýÜôzc§Kíº‚tŸŠ`Õ´ÀÊ*,=7U£ïcK3\»IÝJãákÛÚG§ -¢½œlŽ›˜‘ Ã\R617°´ë<6ФÃì²¾DËöHÇV¹¯ÒDƒ$g Ý$Ÿæ©Ÿ‰ˆìž¥gV¼0:ôšcFfnÁ0üȉ€®PfDž¥ªp“"çÀŸ CZgaÉź°FFËvmmJI¤&,͸_êépvâ3¡¦­®Ì¼{’¡c—‚Š·¦f‚™ìÍñƒþIàò†+Ô¸Ô~lø_$ÊIɹñèOŠxz²âgµzŽœÆ¸2~·>2¦ÜäAüD-H %6ém*èˆ žØ&-U+™×Ö7 i/M´ÁK¾j勉Ü5ƒÚ°‡¡Ë;šñ^¢¨ü]`B³¹å¤óçjÖ T3ÀTêq~G{Kò)#Øtx·1^†4Ž&æ ”7fÀ›î‘¯#HÛ™­íC5¯K[“QCЊz*Y7/ÝÍK X®¯®æÅ{ŠÞÑ^‚3J¯—š[6+šZz²$ËÒ•ç/¿Ç3T„ZvkÌüÓäC$QhØ ¶¥þº·:’”¸iÖ·(] #IC[{~ú’îúx¶’ŠÐݰJÔ]–dýíºáÄ?ÎI^& 3—WÞÞk˜¤?`iiŒzÖ#55U«ß¶¶u4¶w´ úUÒ»¶¾zýºõëè¿aPÛÂ!Òù©=VSbuá&š³)ÜÜéjO ¶Õ¦ä¯¼Ò/®^Z]»Š³âÁ^Û±uc"¢ŸÎókj.YµvÅâzZz$õp ³¸³TÌ.þÛ×”˜]^kÜši Õ7¶´j+õž{êðÜžWEç1•§ã9‹žñOV¬œäùók‰WÛ‚ ™f ¸½MÄ¿.üï1M9ëÖ Ét1›ù‚9[ºräß黲ôØsâé¤0­Jž ȨØÕ…ŠHSæx×`ª÷HÒÝ^8L«—ÜíÐ&mõÙ:ÌHË&+­]ÓúE{K|»*O¯¡ ‹Äºa[3p@¢5¿U‰?yZâç5]ÕÒZÚj–Îr5)þ6í“$|20‘ñåé<ï&’$q?º ùú_þ¶LÆ~]øý9M…K2')ïO¶Ô&ÞFA†•ÔlR ø–ˆDOd¢¥]×àÌÃÈÿ2 H·éð+$ý• Ç÷¿üàcÈ+¤Ü²U+bªN¿† æ¦vfò `y"q…£jyçÝÐTiÞ!kWÑ)¤LTʲ7…ÃHÔ‡õ—“¬—ïÕ"ðØGÖ¯­_µxù%õ —-^>ÿ’e$Òkç/'ûoÖÁé!)·.ýÂ=quIæÙÉ»ul?ȿϛÂ8~#A9ŽwíòûCýý‘þ>+¿ ¿‰ ßKÈò rÃ3ä÷güçòû ù5ðËYþ•þ¾È-¿/Éñ?þý^Ñßßèï«úû[×ïô÷5]ÿº.¿¡ËoJü <„–ß·4Þok¼ßáïÊú?ð÷ä÷}ýý#ÿ@~?ä’ýþÌÿ"Ëå“ß¿Ëzއ ²ü/þoú.§ªx?Õ¥Ò:f3}kå}Œ|¢—û™¹¶ŒsN5¢Êò[f™<Æ\kÈÆ˜ÝËÜ Ÿrž@7óö²¬sd#ÉÙËäø]žg=3™Aߺ@°åŒ^–‡$?À{YA`?+\ÛÇFô2_ c#{Ù(ªMUþ^6&™µÍŸè¸ÁôD#i“¾^BuLYŒ]£ûÜ0tŸ)™1èƒ?Z’hб¢ƒÌ¬ Üb5†¦!ô˜M4c–Q£“-à5”w˜ÇÇïf‘55˜.Vˆ¨¨Œ3+j‚‡X-oüAVòD·(u˜Ù϶áÊ=²¨Î6ÜzÎ|ÆéŒaÆ=¢Vß¶èæýLȽ»͇ˆŒ˜O£³‡ÓÙ'˜ÙËÆé¥Ž‹± k̹Ųïv1¾Å=lb§D\ñ>vÊA6‰þ_eíg“×Òî÷±)U¢‹/ëf§ÞϲºY)ŠyhífSU³ô ¢x`§É»ŽïÞ›X`!³GúÁp³rú™cY³Z‰cdë…\Oû=»Œ¨ÌóÅò}ïceOX÷Ýla°‡•ç5ìf#‚Ù´›~žÕ,EñËËâ½Ê2õ ‚k  Ø@ì›ÄÎbf^ÉdÂ''OÞkW ØËfÆù'7Ñ>WóÏÔ øê‰ˆ‰*0Û,Ì6+9›ÉxÁÊKÀ*ÑsHŽ¥IgÀiñ™ó‚L˜eŹ´0ÁK€’ Ze'{e½ìô@°¬A;u&ýUÉÒY;;HûWF=çìcsåÙv?ÁÎéeó0yeÎÄ‘øE”ž¥^Ÿ±JŒ=L;ð 9§ùÇØ|Îö°ñÈ=ÆŒ6†µ°“YâÁñÅ+æƒ ÀYLxÀÐ.püÚjã÷±EêUŽ6üºyž¦æY,WIs,A² Žhu;—>óðw`;oÀj~Ð¥¡]Tê[‡¶œf®U«šGçd¾²PTAi]QEŒ­ØÇί—kz«INáe¦»Ÿyù’4 ¿Ó3ýƒæôýX)gêcõÉI6(øµå‡ÙxbùU=ì‚N°Ö“`­n¶ºV¶—×+‚å1¶Fe{Ø…1¶¶“ùSŠë'†JïÂöÊ©ÖïaE‰Žz½Ilqý]LŸ ì.¸Þ‚4Ч“ÙÔ°Ë]™\n1óÒr-Ò)“l£È{„M§ýìg‚¡ï$¢@q‚×ê“ޔعç1Öˆyš„lÒÕ›q ©FáK«V2l‹ÄöÂ0 2‰É¥HN‚‹îG íGÕŒKœ½ ÍG˜ã²]RNWH¤(33¸5ëÓ¯ Àãã§"ñ‹–ßPÿ­‰ñîÉÛHRÆ–*ác-UÂ/3W)@•ÅbC™ÙÇZ¥¸üU+›)‡ÈZʾÀ‡Üå œ{ rt¬+®P])Äa¼Ž²mñÙ+Þ¹µÕË>o¡Uö‰îacÓa%ù=‰ì@Œµ'—`Ù9§µŸµÒU´»ãPq„MÄnaãÔgSeëz¿«ÌoÇØgE%áë‘´=ä»XV¾ïªò}ìsO<Ÿ }ã0"fFÁ'è Ü´“ó‚F¼!¶ì$š ¶»˜‹ÚºŽŸ‘܈ Ëê'ãî(;›¸Ò6¦%IÄ+i/Ž0 GØ„#¬à3Ž@wâ×®š0wÑÞ8ô=…vGìÅ.øC^¯Öó® þð»´R{ÉïòÙqVå•?ñÞç;Ù\³ÒëóúÝj)å2ãóV¨]å&àeù<þ¬Ãzë®®ôìôÒžWrÀ]ì³úØ*=>O'«Ó0!3n>ÌrÈö½…lß/ö²›QƒÖ/Iãâ2Ú´[!Ò:Á,Pº¤Îš“Ö,ùÊï~ŒÝf°5;mÂ6_¶2ýèÀ`*v‘EÆþíŠR˜e'©½…åYG™Ï6¦’i*Qœóã$Ȫ# 6ˆ²m”q4Ë6Ê0ô`Ãö08ÿ˜¹¬qùNþÇR°L¦­*7¦éƒ´™¶ ³Ÿ‡ƒÄ¡½ŠŸvIßÚòCl&¸ØÚM6R0|·ì>æò‹G”HKHˆ²GRµƒ«ŸÍ"DrhÒéÆŒ‹Úú^£Ô²«!£Ç)+¿–¤ÄW±ÑA:'ûÙDå¯ÖQc_[#UÔ³ÁäD>&Ž2a3•ÐpaneøT³ÔœÆY$,GPÿ›5´*Áa‡Kï¨Ê%2ŽÇ"Çøl…I•|×ÙÃvUy?zbìë{ø$¿Çç±;²»ª²ünäïîa÷T9A¿c»+³1Œ–0B~e]§æÓÊ_Î.–悔wW¼6×—ÛÉ|Ťç|Ä9™Ø~çÙ—½ 2û!¿ ý÷¬‘øøI‡|#ƾY™W†’ƒlþ~vßZB%¯Ì—ßÇî¯*ð[þR¶äjºÑ£«ªÐ_x˜MÛϦ­µž`3Öšþ‚{ ~­À÷[õ~§}›úPgaŒ}§‹ÍôÓˆö Lˆ Ò‡yˆþß«ëtC“P¦â{ çàØwh=…~Ù9ß• á*(„2(އýVrïd¹ÇÙhæ–¼<›¶Øw¦;³É\=ƦP•mœFGcmT’0"aÜÏFÈ4—»íã,ÊFd¬ÇéAøO6œÎXùqâý¬aÆ0ödUHÌ{F´¹@3ïéÚy^ž´G •=Bçå©íß/“NâŒÚ²r8‡Áò^vcòÀ;Ì8ʼ¶q& Rh·ª„ýñ.¬§'¤çÐˤٴWª×^¶…õôw¢(D•EÑAåî*º×õ²G{YòÒü½òØB¿ÔrVBg麱c{Ù•RüQAëídÓU€Þ# DǘÎ" Cë¹z9êe’…3ÖæI;¹ÅzY_r¡yŒ¬›‹i•£úY}H,á6Ћm%j¢× b‘¤Æ÷@késú}önVÑùØAö½ÛOúvμc÷7X¾4¶|B4‘Š{|¯¶:ó“ðég9´·ý¬ŠÌhgsôìkÇažÚÅî=d HÃ-H<±\nã{°±li»ÊjÊÍV³UEŠÐËÂj¡ýyyT57n¡ó=ÕkJæÑT •³P[üûbì@yÒë}K òŠCl$>D…¼Âd‹û“Fü4eÄ“) ¢)rnE7{ò>Œ:˜õ‚ZN‰\º!3°§Za‰\¡î3;CŸ,iÓåêzLó^@‰~©ÍˆÒwἜ¾§œâ#&8'Áñe@›{’/Æž‚Öìd·Kf~œ”òÓ¨‡žŽ±ï¯‘<^w@u}fC ³ƒAM‘Q(wŸmÎ?º‡!¤`~@l[+Ùž(t¨^â³é|& ö² a-dOk´ö¦ì²y”­†v碕ÌKøa§h?lÔ~vx-Ùm?\^FŒý£Iég{Ù¸½:Ö4?1àeÍÿßV®N–²¤ÿv\&¾êQ.‡¢¢‡ý¸NZ‚½ÄÀ?! j„Èñ<4;¹Ge~AÀ kö¢^aðS)Ç~¶&u‡=¹ö1V æ>ª ç+ìgŶ±ðˆ\æ¢÷¯&ª¸è;EDr}äBdÁ)ýyÏ×Rg·Uî»ØQµá¿»Ùß°`ú¾¯7¹»BJйÅß9<^JçÒßJ]‡?êó«NèÎîýìEÖ¿Æâˆ^ò‹nörŒ½âAr>~ÓIŸŸê³ºØçc®è(cÈa¡–‡4k· –¾Jö;j~»‹L¨ƒìw=ìµNv¶_ô°r2™Î@Ós16ÁÞ{Њü*o’ðÚß¼ŸlA*þ5“$DzÜ9GÙ*˜tž©u˜þÖ’Ñ->–v÷â+eƒæo-I°zÞªÀeJįW‘%b|áø½ ŽÜ-%„ûk©|/rqˆ‹a_ø‡wÔb•iͧ’ÜJÛþ)M#Õ—:ƒ4z‘«ØÍÞŠ±·×¨1ïìb£ó}Ï `ªCcïÂ’H<‘ÐX§'@ÔiÀ©®§:>Õæ’}81ÅÖ€ÊþaÛ˜ï;4x6uð–$¦KÃø=9I:Æ`È9ŸN’‚dé%p”¬rs¤$HQPãuýéÝìýû£´¤~ e°žbk'«ÑÚš$^ÑØ=Ò)¢V&õ ˜ÔÚý/.Äönö$ZÂW‡¼{FíÞ…é𪇄7•䇻ØÄ$X½!`ï‹ m|×è/Ä\·TÂ$©§+%\%`ªújGõ±?UYAœ˜=kÊp„ˆ>PÏ/˜ñÈÌ<5Šp‘8¢u²1¡¥‚9 ;W Øâ=, —‹ÐÖ«ÎðºÙ[¥ü|F‘–ɤÓOI\Õ3;QVÝ_1“}ÏÖm 20ß?KkQ¦§É¤Y%›è@ú-˜‘@žŠxÜ#¯ nšÕh&{¾Ñ®òø€‚Ä€‚!$Ïúͬ¬Ÿòs´Þ>¾Sû™›WQ¦D¤JÆºŽ²<ÄjÆ)ÿ1³Ò*&SiˆÒÆžM#fÔÈS Ÿ—ó)¸%ÕÊX˜$ÇÔå#lJ?óèxï2£Z‹³*mÂî Äc¯ñ$Y6•rZGÓ÷¹*Aéß*-ˆå¿û,±J2â“ÖBDã0¨¼GFÏþcÿ8¤Ý²^öOÙýEK?¨cEÁâDÄBÈË™)cñõ²ÃƒIKH±ø MÈãl"œÕ€òÔ]Œ’sáȧÖT×ý(3Ý&ÚóÈ!1Î3j4 Š´9™õ±cÁÅØÇåñ۬剞ŸÔ·YkÁÐÁß#µ`yûÒfdýU–!?®JŽâ>€*+ïfÇïc£å‰àL2j¹9­\L‹qîIã7™ÇpãFNZ­mÔåŽ%DVçkq¡‘C:âÍý¬m0ÐÇÚò}Ü.z9!Á]àu‘çîå¶Yi•YÓ*]zZ:Leæ4ªªîÕN)’zžàn3+ jÉ_ƸG¦Þ*ß|Œgìt¯ß6ýè×=Ò»;ëëëËývŒgþäþKNx‚çT¹MŒ4cøÉ›–yŸ§‚ÀåÖïô Šìáy„n¾ìê³÷°sE¥×g‹ •Y¾,=tº–UÑà :Y‘/«Ò¦?DdVÅA^ã#¿Ë"€?ñy!±ø­˜®¢Êë÷>Æ}X°Oc"šö°‘rîÛÐ6’³žã]Çoð¹ ,øZBhTŒŽS#ˬt|Ž2åJŸåIyâÌ’’±ÐŸ%›ë|-‹=V¿Ó!Ð?Å1Ò÷Ò@™qïfèiýœÕw±Üxq Õ@Ðcmψ(>ën„%w{‡W9Ô€ñˆrVŒ­rü/¿SbuWfû²•ØG •ÀÌ®"_ãEõ;³aƒøÃ̑㳻d8Ž•UîwPS\ãㆿ;%èÆKv±ûùâ¶ò>>±ÖO’€Ÿ’†Sžó/Çfû²}®{A"*œJ}'¥rC¡ÜM~í’•­àÉX˜Dë°ª_¬v±s° Ø?Jꉧ}ÞY»ªGVÖ!´)71ÌWÊýZ*Pué;™þ¦t²ô9µÊ# § IÂ¥À@žWª½–aÒΡ&í:~—žm*fV–Ë,Ê:Y)}‚yY•§›r ™KSMÛÅljÞuü×–*ö²ÙGa³Ö‘D8ÊÆrþVsŒå’[‰ \æ¥"Ÿ.ãÊv? :£Þ±’SÁËxQ®Ö%]ŽêgyT›‡Š#ì”ìœ~Vγã̃8Š ‚.PSÉ8ÏJ’˜Gàü»¤;~”M̉r&+KOA€ h&’¢2lo©AÎþEK-;ïÖŠ¦U†bÈå3öó™kûx…]’¸:¡rø,)Qùì]¬ h?­Ê*'õÍ+»XÙ FŒŸŽ8¿±›ù¨XãgÈg‰U]°Èù Ÿe*Ýô@R AS’þ¼€ð ª@b6Lpf¬6Öj\«µëY„-ã–W:/ÃîJ`êS˜‹hÏ*åDï¥Ýåå©K'?Iíu ¯â ²ìÙˆüLú«Ò[¿w?«—‹ô­š\êÛ7«¤Pïág!Q ºÜý|Ñnn•ÕÅF#ËØ?§‡Ïó‹>>¦:Çø5v!yKõ*»¨ôU×·&±žˆp‹Ÿ=MÒ¦²´ZœìC±„T†%6ôzrƒ0n]¾_©ìm8”¿[¦7ØCÏ)O¸„¬¾˜úäÝK’Pçó÷@FXb®FslEqŒ/‘æúƒ©7Y2tŒÍWÁy×Fû†'¨û1/Ôøé—¥à²ê_ÖË«*¸X©¿sIR”—}Îë•eÔí(_ŽÛÑ`¯UBí œÌǽ:69k+(“·œÅꤕòœˆ¸Ÿ›¦ãu½|ER¨bŸ«©F)c²øù‡Y‰xÜ»VšöuË N¹²Áܳ³i¤7"'@;ð‰ÄŠO£ƒM§Êå]^¶×‚¸ 4óª^~A~I•{?»k­ßãw‘_/LÞÇ7q!ün¿7ÆÖÈ»ÃÝý¬DD°?Ó/ºùÆ>ÞØËª *k/ãì&öMÖÅ›ôRk ¦GÛFÃ|bm‡#T~œ“Á \EÜé8n$iEŒÁæµÒ:0v‘m4r‚Ùd„ô% ƒfà‡÷ó‘`SM°oŽñ-y%1–Þòâè¢=lbñÝÌÌ+Cu0îõ½K=•/÷»%©¸õ˜k2:_%hìÅ8ÈÄëcñ%û¬4'&êb3t;ê·¦ÔÖýó¨>’¨§BK²“z|Œ·öðË]¯ŽåùAÙ§·Å»ò¨ÆS)Søìn‰îäôuÁŒ¯Y}U©ç q íI2\û®­äŽTâª`N|PõQH$ˆý/æG¤ŽÌÔ 2¢®‰ñmº?I³íI+`Ë?ÆŠlcç¹2D˜KžÞ ’ˆ£F83ôx ž´ô³Y23–Æm6¶ ~­Ç…òo8þHÕl^K<ƒ‡Gýàš¢>~E•eVº|.ZD¾ßRËÚé"„ÿ¬ÙªVjå…üJÂ24Æ?YÈ?´ã-W©–ŠÁ-W«–Ë·\ƒ‚œYÙ >—ô+ê|.„h•¸‘¥öãJ[ “5vEò×ªí’ Cøuäh•òëQOe?-9 k¹‹J;SgÿTêì°VÏ‹·Ü »òÏÐ×çbü³ñ±ÒGq‘A`QíçRÁݘ˜ioÚ  õò›ÔŠ™A²c®•ï‰Á7Åû~^÷Ý«R·W{Ø' IœEšƒƒ1 ®Gy¶ž;Þüj†ùµ%ÙS±þ¥ñ7§ Áyñ|jb+d¼Ç¥â=é8üTiá[±¼8°/"â@´$ÏÃ!Vïó%Å:ºÏ|ù­jŽ”ñ²ñ¶”Q·§Žº-èò´£ÖÆFgÙÌVÂ–Ž NìàÂã,”¨¦JÝÐϦ 2aK…5ŠÖùþe$µ³±©¥W݃üc6Ò™ «ë«éœC¢ÿ’º>¬_  ‡õâ@ ÈÏNl„©ð/›Y?èÊVfG"_¡\³­)UäßÃrPrÔ«‰Ô+÷¶Ñ¼þC!\°üšyNV¶($̶Æ13ËÈÐr¨æJ6ò ‚0q©ó¦”ºu¡¯£n)øWômÅÀµÈJùú˜ä=Yü¼êÁÃÐÿj/ÿ¾rþ5qW“j÷¡JPó®*—2‚dübæ!uC¥â¹°Õgîã_G–º¶ÆØnÚ.W¥NI‚OÉ×öš•nŸ[ɨT¬™7cüN2´¥@êÿ®Nòä)'à†táªÂï5U¾, ¿'‡ôYwºéhÜ$+R¸Tš!nr3ë¡2'*wïbSʹ§2ËoûÜ~—/kZrÓŒ{ØÈy]dmç Â¨“Ëyoe;Ù:ÆÙ ¡Oø-}Ký–œžFU–ûÜ1ö†D€ßKá»g<æÿÆ.6ßoÊ®Y4b2€Þ§6Ì-+•)¼0à·{Éý)ïå÷Á*>„Ý^K O‘÷ÍûioºÈùK¯-‘÷÷½¬'ɶ»Y±ÛO¬Û—mDèÿ㎳óô]C~“Ní¦nS²9Ê ”ÏK婵ɩþ„—²ÇIUz ·€e|_I§ý8tæPeù'ÙtNZ/ÝV* +oéþ¬-{Š•t²®²ƒŒÔìúîFÒ·v1<°{!‘¿ Ï.Ã9–ðd‹YQ¯€ÇøwâúÑ=l’ÖUZiøí º×ÅøƒõR.¿\~ˆ”d¢²™™xôhõð‡zùC¿«\½7U;¯æüÿîw`E,‰_˜Ñߟ¡ö|ç{å möC]xœV‹ÅSCrC§3ç8›¦m\ESÚ¥Ëög,U’ÅŒ§93ÿ©Ùv¶ÍܸסµÌòt×'‘ÄkŸzÉ•zDP›zDPNGG?£c¢<¥3`C‡Cc㣦 ûi¬¶Ÿréœ?†÷¨¯Ä¯ôoHt,Ôí@Þ¨^¾.þ“•Ï$~ë1Yw«áñÄÀk)‹Î<8àŸ5>§‡,Ò¿ruí~‚/äôõOA¸÷‚©¿´RoÙn”ÑCnÜd|^C¬Ò¿˜ŒØ‚ŒKËÏ|$ ~SƒB0ˆŸ’¤4IÙPö ÆÍ~±åŽÿpåã‹dJU\n|ɸ5Ãè™hRÞfÜž+êЬLJºjÅú=¬qÝV„4ùþN}ÙÍÇewŒ?!+dPà@7ò~”¼úŠZÒ(EãR"…”CC^öÇÌ¥B¸_6¾’0žÕ¥ÞæàSüà.üþ'x„ª­+£¿}ü)Y‰U”IóðéxyÜ2$÷Èß %^$–hFdãËâ™ûÐCråoE’ ™í‘¡Ó@ndöxù~–ì ü–ÃÅ?‹°³ÆóIãBæa“}Æ÷˜‡2Ó¼‡yÌçÌ'Åræ·Ì´‚ÌóPKƒ„Ö; †PK7A+org/hsqldb/RangeGroup$RangeGroupEmpty.class}PËJÃ@=פ›¨UA\ ­›€[E "‚‹n\MÌSbR'£à_©Á…àG‰7,>/Ì}̹ç¾^ßž_ì`Å… ÏyžÀ‚À"¡»——¹Ù'Xƒáˆ`ÇUªa¦Ì™,35’:—I¡jÂú`x~Ré,º¬¯‹4‰¾à»¿V&®´V…4*õÐ…XòÐÇ2aë;ñHW7“Í©{x51w„Þï¸,•Ž Y×ÍÁXÞʨà¬è4« CèÿZ›°ú×°W5Å´–Üaퟵ°‹ÏFèð -~¼G³ì…l‰mgû ô€FÜZØ~ÄÌ}‹Î}’ýSbȺ¡ZÜ)€óPKƒ0ŶPK7A,org/hsqldb/RangeGroup$RangeGroupSimple.class}’[KãPÇÿ§·˜˜jã]ku»^6M…‚à“‹°tavYXÅ—}:µ‡n4¶Ý“(ø­T¬¢>úà‡’ qU´M`f2ó›ÉÌœóðx{`U &Š&æQ21„‹,> ÃBÙÂG” ,X5ðI §e»¥Bâïïݪý ÿÍFí{÷¤öe#P›fC†ê›îw¦ß€q€¨lĸÀìKb—}_•öOT“˜Üg¿íG[ón_ª²'©wšTjÃÐWŸF8}aPNKE¯¼´ƒ’[¸…|¨¢zGkÈH5Ò.WÊïDrÿð‡ìÆ3Øp0kÀµQmc˜Å( 6ò±1Ã1O`õÝΗŸÍÿ¨Ë«,¼uÙÛí¶Òõ@†!7]8'²VûÙ8Pû‘Àä»ÕfúÍ&`©£ntúEkyJ'Üç`P¦{d‚h¤é²Ñlà‡&‹5I2Kqc$Çé«„½€ã]CxHõöª=dÎãF'´H —Ñ*ƒk=dŸÁÉœJjZÿÁ'f Ó ãÜw‰ôY¦í'á$¼Háì=lV7È ‘¹§Ê¤®`œÇis$3Hòd¯ðI‘\†ùPKšÝÁwPK7Aorg/hsqldb/RangeGroup.class…QÑJA=×Ý\µµÔ2µòÍBŸzM‚ˆ éiÔÁVÆ]›Ý‚>«|Šú€>*º³ BÍÜËsî¹sïç×ë€#Ô”s ìda£â j°æ`—°y-‚±<×áýìl:‹ îEHÝQ"Šdä`PXrºþt¦$!' 9I*—¡{·Ñ ¼%÷xA;ÕZpáêÍŸ¼âXÆI¢'´/JF„z³õ[°xgM>’q'ÔZ*ËÁj¶z„L{¨üÀOv'q«+M?þíb%ëp å• ylð0&âAxŠÓÞÕ`"‡1áð?‡ÅÔÒí¤µ4÷†4o&…šqä¨fŠ3Z6¯€±ˆg2Øb$lsÜ`9Õ7Pÿ©9óßa÷­gXÝ9Öž’Wß%®n|daÖCöPKÐ= \8PK7A org/hsqldb/RangeVariable$1.class;õo×>#.vVvF~×¼äœüâ̼tßÔ’ŒüvNF©ü¢týŒâœ”$ý Ä¼ôÔ°Ä¢ÌĤœTCFFϼ¼Ô"çœÄââÔbF¬Ä²Dý B}ÿ¤¬ÔäF \&(õ31@3dBv æÊ1‚xPKb|¸RˆªPK7A0org/hsqldb/RangeVariable$RangeIteratorBase.class…VkSU~Nn›l–6 {QKë&´FPÔ ­J„¤”Š Þ–ä4, »twÁúüþ¾àL;S°í‡úÍŽþ(Ç÷ì– $#3œ÷¼÷ÛsvòÏ¿/^‡«¢·T àV†n_Š£–ž·y·± nwı˜Á],©¨cY(î ß_ãáñ­0YMcMÅwø^Á ~R`0(.w]Ó¶æm§UÙp¶›ë•z dès «Åm×ô|3Vcˆ™ÃpÔÞ2vÍ–áÙNeÉþ¹æqGÜÉ;éå #QãmëUÊ-¯.¬È<ÛØqâ¿0<ª­m~ÓØ5*mª rg}“7<²Q¥ %bÈEã’DlºÓü>Å›5—êd« i¿‰Ãa¸Ðá!Ŧ±ÞùSS¦ez7âzi…!Qµ›Üg(FÂâ(\_Ý3nÛˇø÷ª‘Š zétMê±CQ/um¬¨×J§å´(òw#þƒzwQnš²ˆñ7ý’çγюõ®Ö©s‡oÙ»ÔOÒᔌ&+|;WOAkA/ 4 ¿[eÃpü¹(RLqý¬U»½³e¹Q_[TÞæ†Ë4À Õ,‹;Õ¶á.é=732Fýi¸‚w4 ã- pQASà \Ó0„Ë ¸†û¨hx—4Œàm- 0ljx€) mLhø ¶4X°5L‹xçpžJîH§`[ÃCXÊ=+ò¹# OSW ù.²ÜÉiÓ»éþl¢¾´¹c¿yÛjl{φaèÿ^"ìÄd°¯à™ëšví¿‰ôBt?ËòÅäNÊhßY`0E”ÀÓY»ÿ=¨¬í–ÝêZì×ç¢èBJ0qæŽC}͈“àãìXž¹Å%;¦×"ÎuÏ1É=oIš?jðmçI\¦oⱈ4}oñħ„1Ÿ¾Ž7|JÈò)ÁͧDŸØè, &ðIÑtâòD ãH–ÿ@ì‰oF‹Gé”ú)âûR]ÕKK¨'…ú7dËñÄ÷ ›x…d|¿,nÏ‘d8@Šî©Pš:„r€tbß9*r ~6]$æ*®uIŸz,Ó¿‹JuúXýžTRu1ѱP¿‚Âö׋ãä bÙcÄŽã}éXŽ©ò(•x4z‘R ?ïpБ’ÙÃyºfžB=Dö×ÜÐ/Aƒšñ{¤»XöžpûÉ0WåôúeªO-¢ïÎt8«àcb¯‡[ëóÕôTÛ'¡jB“ÿ+XÅsœ¥­±$Ä‘*'hKO q°]'1Õe¬¹£¥ß—R”2yü]È?CáOir3ÄEO“OÃÝõ4ù ŸGLbÝL¦Ãn¯ÈRó'»íl/',g#íÅ$äÃÎȵWé· rizowñ#2ÿPKƒxZ#âPK7A2org/hsqldb/RangeVariable$RangeIteratorJoined.class•TÝNQþN[ºP¶µåGù(¨íl)þA‹E%&.íë®î®Àøï¸á† ê—^xå{ø„ˆs–m‘FÜdgvÎ|óÍ™™³çÇïo{Ò˜ ‚+5#&D\%€z$jHô ³7€>\_IáH G€bÄÚµZ\Ç Á’’pSÂm†©êKÏà3òœ!¨Y£ü¥aò Í´lo,þŒœ:_##øØVs¯§Õ·O‘S˜ßäoŒî‰E2y«ÙU&·8Å„—¸ídœ5,ÍÖ Ýfd4cDÆ4ɨÃym¸#ã"ÚeÜÅ= £2Æ0.ã>&dô *c$PÜÊÈbZÂ#݈2ôž­Ô)CÓyž¡þÔUål$£Nq‘SÖÎH .a† ±ÊSêw¦Â¨ùwÐsÆ*µóD„±J#\¡!PËÇU[ehŒÅ²Ëꊚ,yrfq™çl ©u)Põ§bªMw? -·I¸¦J>Ú¹šËqËêH¥’•‹:}—ÎOôx”®®hK¢‹¢ÐRG Ùù/ ÕP¹Óè¢9B÷‡^:ŒL’M©-$[Éê"„À4*lLñáQEx_¾-'ŒÑAnwáÒ4gT)Ûðmºî‹e÷|ÛGr{>ã9)¯øLg;¨ú„!aˆÅ=_~aå)™¾”sãð§RoÃ_„$liÕEÔø6)Ø'<]öá{‹G›ôLÒ;½Û@Sµ¶)mc[cÛ¦-¶Iï+½ïÃÞgz(•μ÷XÞân4…ß›ï›ùfæ›™of¾o¿øÐ ÂÄZôÑŒT€f:ƒöÃà™Á33ˆ4=Àà ƒCAZ8̳3x óÝγÛyvÏîàÙK%¼,ˆyx9S^Áà•AlÄ«x×;ÜÅàn^xu1^ƒ×òìu,ùzž½!@ÌodpO1Þ„7³%oaô­ ÞÆ´·3xky'ÓÞÅà^ C<ñnÜÇà= Ž08ÊàXïÅñ÷ñìý¼áý¬èlÄHćXÁ‡™ùž`ðÞæ£<û³|œ=;)áFæô)f«º'Ý>˜Vý €è(ÑÌ ƒÉd Ñ”´n{ôTBKkzÊ”0&PÞ¡¤zÕmŠ¡)ÝIµ9»( ·¤RªÑœTLS%tåŽVÝè÷™û“‰îxŽTUMdÕÁ>ÕÈQ[²W×RnB€-jI%ÔCdr‹€?©ëû–»7LjÝñv#AÊ­zªw£böuªiÞ¡gÐ0ÔTz©]§¤¹;Z÷*”x’¬Š·wïU{˜Ï¿JKié<Õ5Û¼ÍzBXQíÞ¤S5M2ª© §M,:»3­ôìkS¶2ÉŠÿ) Ò‚f®U÷膺A3Ì´µ7¥"Äo¨ýúÚÒg¨¦J„P¯š¶”oÑM+– ̆jJR3Õés+&nK-­„Ó”a³öh©ÄfÒ.á!âP‰ ú`*aq<,¶gè^á#^A®ËØŠÛ<"c3Úet “—ñ(#gð) Ÿ–ñ<&ã³øœŒÏc\ÆY|AÆñ¸Œ'Ð)c'ÖËhÅ-2Ú| ë–^öœyÓ[elÁóeÜÌr_Æ.=LëåÙnž}_•ð5_gäø¦Œoñfë|›Áwð¤„ïÊø¾/ãø¡ŒáÇ2~Âk?ÅÏdüœA‚ÅÁ´_¢Žif.ÉøÚ)â2~n¿Á9¿ÅïdüñGœ£ã‘ñ'üYÆ_8.ÅßdügÿÀS2þ‰Iø·Œÿ༌ ˜ñ_\”1I3:2B5Ú_F‹„G^áˆ=}éM¥I›¢Q•æ¡]¡‚µŠ©ÎT`ÓêŸiñS_šz é(s-¥¨f|+Á\úúCÆ”ª……“U`qõÓç2U«‘[|A ßjÛvK[4j!¡™4»,©Þ:)N„5æ-·7q@5LÍLÇ·Ø#5.K–´ûL[IÕ•±KæTæåÛ”ºƒá8M‘*\ñä·ÒÓCBU+ëëâ…ÃÖT“·¯;ý×î½ÅšÙ¡õöYݘ‰î$«³gÓB H£Þ·Ì½KJ9 õr¦Å)’SYGš—\އ‚`¨IÕÊÏ c†uó…rœÐ²—šu;ÚvIt+*IKÌ ’sû,p‹iL‹[+$>?ÿ e‘Ú?>`—´DecÏd. ΘÍÖ}É _Žk\kœe¶à Îé†Áç6%9HlÕJ2_&“çˆmI¸GïP u«ÎJ­J c«¾T¯ì¹¼}³% ™zêfCçÌlzÙÐa¤m]ùliIQ ÷(=tù^¢º€ƒy­·¾ŽOKõ¤€ËüBØ=Áÿ;ò”~KKK׎®+J E–ß)–á܃³Ë³$—bgˆÝRʪó7žRÒ߯¥”¤«¹”LžÙiÕL»9óç½×J­@®O%\Ü¥)>¨ÜFVªêI&r®†úFï%T;¼+}3W˜ßñG¼÷£–ßV®®Æâˆωx E8Âû#¾ˆw ×6ú¢Ã¸Ë­ˆKêšë¤ŠûÐX&=@a\l9£/ÂÉÈ£hô -TÁJ[ œÜ®§/lÉÎo4âë¼Sˆ‘‹CyÏžYÜñ¶“í:wÄÝ)&Nã¹Kw6!®G(ž€h[†Eà"è·-ýÄÞCp× _Y¹ï<Ê&!¡ˆz>ò¿wª3ˆ{í&'öyVÅ삼ž}¨¤yåYøGð“+Çð¼Œu¸S5ŽSɺPû›†Yä1תqÔ»Ñ,ßÂÜt¿ÇJ÷ÜM¤°C^mï‘E]{LÞJHhšï*7šå›c)¥ÚºadÒ]À7¶Õ£´Îáb}>æ²Ø©û¹S¥»1bÉnÊ6Q.’•¹†Dò2É;Â5géNwÑ(ä ‰ù MW×O RBßy/ Ã³Fð)iÙVçþGãB;Mèá Ì·OfÍnº-§SFB|ã%á¹DòÒ(ÅjëNM7æM—ÑÂFìG µ—½4"4‹®Ýýø$áÍ4ÒÍö?PKO€{X {PK7A1org/hsqldb/RangeVariable$RangeIteratorRight.classµVÛSUÿd“%áp-ôÅŠmÕp±U ÖVJ-MD«.É!YØîÒÝåRïo>ûØ>;Ó^œá¢>øàƒñoê¨ß· ° ÉPgt2ùÎåûý¾Ë9ßù’?ÿúõ7ø.‰³È$ѾÍúY $0ˆ×xv…ÅU¯³xƒÁoòìφ˜6\‹·p÷ÞNânòìFp‹g£IÜÆ»¼¼ÃŒ1'Éü{¬`Ædw‘ÕqOÇ”@³éeí)³Pô³«¾r§œuO@Ì Ä‡MÛô¯ 4MvA‘ÒðwÒ0m9fÛʱ ÏS„¿ŸšpÜB¦è=´ò ™iåy¦c…÷³†k –ª®é>âk¨gV@qòJ ÞS~ÖÅMZ[møÁ‚®›öÜò¤±2Ãöh½hÚù»r¤µå8Ë«+7íüŒò|Óxô?&PÛOÉIœÇ3àœÄ,>Ôñ‘Äǘ—ø„ÅK¼}ŸÅ§øLâs\”0° ‘FJâR:ry(‰Et%L,I,ÃÒñ@†#±‚‡:\ ¾Ä*ïô2{­cCâ¾ø_éøZâ|+ÐûbI–¶¹ÒfúÅÏI ­úA Lþg7Ô”T½éÝ^µ¬½jÜ2Š©nVàt5@ÃzQ¹jıó¦OÑQž:„kç©¡£$ržÌ…L4 oB-î?\«Çì¼Ú 7<Æ›ž°iX¦§˜t1]aï¶±fX™!+{@òvþ8 TP~ðºØ}sªçPRÎzòªë*»„h<ª¯?¼# “É[†o´¦zæ'–Œ5#cщd² K*祶l²„:QÓ÷oO—É'7jç÷7éÃn¬¸å£0½ÒT ¥ReRô™Ô|jŸqš¼·ä!¡?GDœ¸”Ðbï~>Kˆùd‰w¦yÛÚŸ@מB‹“+•3¢HÛ+F#Ö뢭7Äs\ [~µì·…Î6Fc Ýò+»{÷ÔE²‹tôo¥“È—iDc ÕÌ Þÿ¥ÄÿPKþ´â§/J PK7A6org/hsqldb/RangeVariable$RangeVariableConditions.classXit×þÆZF’' dl´–%;&@±1!¸&±ñB,ךŒ¥ÁˆÈ##ÉÄ$]HKº§M·´¤ipÝ´j)M“Ë$$4éMº¤Í鯞ӿýÑíÿঽ÷Í“%/¢‹ŽçÝ÷îö¾{ß}wæø­÷^¹  ïxÐŽ¤mçÁä!ÅÃ'U¤ÝP‘áEÖC³I76ᔇ†‡™7ÅÃéJ<‚G™÷>ÊÃǘ÷qža•ÇxøÛŠÙ'yv–góìSš}š—Ÿáá³<|ŽyŸç-¿ â ¦_táK<‰/³ø+*¾êA=’<|‡¯»ðÓoðÎßtãžvá[ìåfÛ…gÎy¦]øŽ 3Ìý.³žc‡ßS‘Sñ®´nŽÃzZA°7•k>ž9™Œ6JvBMí Ü 3nLu¦Ì¸‚õGJ5»¦&ÒF&“H™¤¦ µ.3niª©‰¡ÓFFAÅ‘n¹ìbYU©j"Kö Ö•uìÚ)''ÇÍÎÔ¤™U °O@7K Y©½°hràLdzR ÚC9L{S±ädÜXØšV™)³»¤ÄS•5Òã SO–ðœV”k"‚Q™ýz2cpBSF:cÓu\ÏH`ÎÝ 3‘Ý£`C¨|–7 +°w¦âäfÝ"Q)N­Û4tgRÏd8±ÛË;ÜRÆG;ïSUWš-Ô@ɹ%šÕcõéClFêñÒ3 †ÊRðŠ} Ö’úPj±ëÌÍÌhËuE›Ò‚àS!ÉR˜w„Ê`¹ãïæˆýòdVˆš¤®¸‘‰¥£pÃ"¨Qé»»¡÷„~JoNRR›£ÙtÂk§kIàÓÆDRViÇŒ´aÆþÃÙ´— ¡aXÃŽiØ =8 ¡]öãn QPP»¢aoj,Ó“~È&ýlr?Òp‘g?†®á^܃nÏkø ^Ðð"^ÒðS\Ò0ËË<æ4\æÙo¶wj¸ û4¼Ì˽¼|…‡ÙÛAæ}w²Ê(ó®àUJóŠð8¨×¨¶%AÅU ?Ãë9°ê¥ùÝ7yŒ’ɦohø9~Á·˜¯ƒW¿Ôð+\Wñ¦†·ðº× ‡q„E¿¥~‘ÉêéìÆØB)ud Ç©õ(Xm˜ñ¢°ãZ*{ÜH—ò4ü¿×pokèE—Š?(hù_ïšo1ªÑFŒú–'‘’EÁ*ÝŒóDw—»)å*¦lÓôtÝwpðýwõF»(uÆÉIjQ”æ•/ !3²‹ú+Ý ê°ÕÄYÑ¿‚m7)ïò *É]¯q,Û/ú\ T^³ˆGô,0( {¨ß)*ñ¬~\iqtrÔZ9LòOjkLãáþT¶2YÚÄw–íF+óåí"P5¡î²7wqnt:•nî⑚hš2š7äòvò²¬›”6˜A©>3&²V:ì!ÑÆœúÄ„ÁPçò–d]Òn Ý|ƒ%êœÆ~}œ_`÷|kZ¿øp ‚>ÝÔÇŒô–šÚàlþ/4)Sßrp Z—C–ønÜ•MYzó„VhÑ ü?]¸lQ®/ç‹^qå3€Û裫¾A«àåÎþQƒt¯¤Ôkí””º« Ôú¥ÞM£—_ bÝ+å}’öK: õJz¯Ô”4*h%=Cø Ó¬°]žƒŽÌ¢"\; Û‹°~C8$H±‚h¥x ¬KÔFêLí³°̨K³-D¢·„/Áñ,T{vÛEb(¸ŸF**÷*[Á¢JZ8ÈÂyQ:<Š[beŽlìDŸˆ\§ý"o@=_äu¨—à:‡à“©=r‚ô*y•‡ÆRÉHV]£€‰¼ŒÕ ž&?ŒŽi„&yx…ï<ªòðuXŠkôgíÚÛOˆÂô4q>ä“ã‡TýÞ–i<ÚÄíñ­µÓø«@COµÅkµp‘(§oÝ,ü´^/yÄ !àÝ>çoÏ Zò⬕´jì4šÃ#áÈjGr8)DÎ Ÿ~oø<´¶>šÔy{ÎÙCO Î=EŸ„ˆ&¬ nèêˆuk º¹¤Ý6Òn¢\¬]Ujå?Ѫ¨xàθ‚•.*ú~gü$ÕÓ”ÕP@×<1Þaáhf0²}l•g2; ù[ž=.ìí)ìíbèÎÒp±¤¨ðÝ@ŒÐŒ. {žÐñxjºÇ— ›,ƒî(Ï.ã¶¾ÊÆh!»Krëm)AîmXšl+˜›aŒV1ÄåõÈÑõP‰žiwØÃ³XöÛ_æYÂ"'Aš¼JÖKzk8bk-¦Ñf­8î |ÿ”Í¢-ôü‰ž.ùœ¶!g~3_Àêböm”úþ&¸Â©¨hÎIÐfíIÅ{˜2]j“')e±Íqê!osÀ1‡ÍrÑ"œ][À]ðf9bÔW<(fÙF)ÎሀcÛáð;êf°+âw´¶9Ù‰ßpZçpÊ 8KÒ"gJî_× ÛÐ=¨Â›¾-—ñ¾‘p7gñFøážÇ”âßä½ÃóP•wÑîq‘ÐÀ1Yp§©£qÁÝ¿¬à¨3)„¶»†‹a†ÒK!×´ŠºbV°¦UD_ÓhÁn´PŸUáÛÌ©cèèýE@•°û0'ÙFKú8–µ$Nâüý êÍ!ÔÏ´v mv‘«ÚTìÞy„GDþÑä£Bo´.A“‚KØJK_3 #á=k£8þÌgµ`”Á‚E°ÎZ-± ½VÓ`þ¬H×.ÉÛ%y»¬½Ö«Ïâñ;Æ-ynÉsë žy¸•Má<\‚®¡Iï#©Zb¾ð?™~küPKM½ëOPK7Aorg/hsqldb/RangeVariable.class­: |“åùÏûæø’ô+m)„¶\r”¤¥€‚Ú£”¶`[nBóQ‚!)IÊ᱓9Ý=ÝÜŠóB¥êÐÒd"º ¦»ÜéÜíÝæÜ½ý9þÏó~o’/iÒÖýƯ¼÷s¼Ïû\ïûåÅKOŸ€Ùüi;”±°N²µº¨ØEE”Šq*º¶Ûv¶‡:{©Øgc79ØÍìêÜJÅ{ÌÄÞç`ïgp`÷ƒÔúûiöôø6ê~ÄŽˆn'šw(ì£ û­þ8­ùŸ¤âSöiöjÝ©°»p‹PñY*>§°» Åç ØX-<@ /“÷R÷>…ÝC’PëA;¶:ØCìa{Äõìõ²Giö1âïqbåKT&JOÐâ'iöI‚8LÝ/+ìuѪ£T³ÃG;{Š&Ž;`RÀ—ö9`9K†~9AÅIzšZ§¨õ*ž¡%¸þ´ƒ=KK§±34üœÂž§…*£â«vDø5Úà×ì,;Gø¿¡°°…½HÅ7iä[„îÛö½õ]{‰˜{‘ŠoÒÄK4ö=j}Ÿdö}êþ€„ùC…ýÈÎ~Ì^¦‘Ÿ¥W¨ûSêþŒ8û9µ~A¿¤âWTüšŠW ùoö[;ÜÊ~GÅï©xvò:-øáÿ#ÓŸhì jý™Š7ì/ì¯vÜÐßùß Ñ?h7ÿ$ÿ¢±‚ÿÐîÿŠ·¨x[açp{‡Š TDlì¢]²±Ë68À™sªM6n¶q‹[q·\±qÒàvT!î ùW‘ /´ñ6^dãÅ6^bãNI…´f”Â]8ÂK>ÚÇø;wó±^ÆËq;¼BáãÐÏÇ+|‚Â'*|` úÂa-ÚòÇbZŒÁèV¸S[ãý[CZC$ƃ‘0ÎŒ3¾¸õÇ#Ñå‘`X 0pfŒ¶;·Ç”d 6ûƒa…_‘=¼ÈÓ8´]ñ}õѨƒ²M‘hgÍöØ®P`kM'u Úë55nn­oYÚÈ€ù"±¸?_ãuk&tŒAq;®hóµûV¶èkiœ3(ZUßZßÜØÞØš61±¦¾ÕWß´¨1=jF¶¢D¼(ã\µKnqjÔ‡‚þ˜Â§`¿-¸³+¤µøw"Ä4#Ä2¬h¸ÙöwjÑÉé…ˆ¦°#êÞxHþã¡àÖš•Ñ€ÕËü±ímZ!Š „*7›^-‹ÃXè,Ä0ÍjÜÛÕb1]ÆdsGl5û»±]äbܪ²±i‡·¿&„B¬Y¹u‡Öa`<æ /Fº»áóPå¶ûc+´}Z@'h˜f8[ÐKÎ #º»þ¸q`‡à4­¦Wæ×¡Éyty+Ú³¥lÄSëÞ*Ö7DºÃ¨Ó…„k#™´HÁX“Ÿ”<„Zmm[œÄ‰[ Æ„è=œZ„¨þ(îÔ2HP'¥bÏf i»5\ä †ÚÞÅÁX<îˆK&G µ]‰ &}a¤0cû]þhÌзï–"É¥ò„»´@Ò¢í馱¯K;Zª…ÉžÉXçÃÁø+*‡À2LuÝà›¾†¹!@Z…mqLjDX …f>-Oᕨ ‘]Aq¦qm/ âÑÊ6;L¢CàpM͸lÉ;ºøº¦É™|ÖM_£ðé˜ (ðŠØGi¶… JcZ¼5å’Ö¤ÏËTIÓö@wW(ØÇÀ ¼rz~/Šé ž"#ÍÐÏÐR¹aáéZ¸ƒIŽ2K‚<‚êxZ•‚áBª…RxÊbO ƒªJƒÇh‹Gƒáκ<&xíÔâ‘ÌÊdzn,:0Šãn6D&=ý¨LÙ%}ý(4Áúð>YœÁ ì¥ûjCR!-{ÞrN¨ÄʰXDRß蛾Aá4p¤ß‰ÆåÌØL„™×ˆ9äDe¬-¯Ì·t±¦FÑW ê‰#C+IIMºÿ‰™¤r†›RZîêÖÒ 8ƒ.kÒKžúµ¹Îo#Ó1Š»rŽÛSìÒF}¬êãmÛµþ:ãÎDXdàÉZ?hL'˜]ˆí©ðŽý¤†ÈþôÊá#Õ)-wI$*pèÂŒ¡t5;û‹š íÖbú¦ëöiÃ?©DI:çàZg&I}qr»?¥iOèí±)R:áìÑɱ>¼;0¨b¥/WØNƇ×M•ù%”Ç[äÅ(½È’`4O&¦*!BjyUeR¾ü죞G9£ñ¢4l×:n™k3c´¤âNÝ]GeÇEyž@Öò±ùx¢ma‡ÌÃÛÇéÞŠ6 j˜¾z‘7LÎB˜§¡ÏÎÈøöåÿóLûÂñá¯Ú Žj]!‡TºVmN‡;ȇÍä¸6"—Ę#O6È%d)™4®VÃåaIm9ÔR¬9oüú¸H §øÏÎIaPVñŒØÙmHyÛ#â&¨ð*¾®ðj=#0Γ W?¨&t[@‹uDƒ[5ò¡¹¸F¯=Àá-Z×1mA­M^,Ê Ÿß…Np'­Ã{2ƒÕïZzÆ©°w°“Öd GÔ30Bú;PEc“¯œ9“AÍ`n%ç}É6¯#$j~ ¿RáSUx ÞVá<œSá%øž ߇©ðkxU…ßÁ« f¾Û«bå5*¼¯«ðraÆB…ÏTù,>[…ÃË*ü^Qù•ü*LZU>‡ÏUYòįæ×¨üZ^«Â1^Çç©|>›¢òü=*_Èëñâ˜1“Ó[oEÂZK}SW&9Z qo‡ÖEŒª¬…vÿ&üV…¿Pñ3xYá‹TÞÀ«ðsøÚGî+‡Êù•/åË” ’ ªÜç¾\å+x“Ê›y‹ ÿ¢í¬Dr|Qÿ)¼ŒáaPW¥²éü:•·ò6•·ÃÛxEQùjT CI®áë¾^åøF•_Ï7‘¬nPÙµ¬VeUl†Ê7ÓØî'~·¢×Ë“ñ¨¬ŽÍSÙ|,xø:´çœ»S¹Æ·©¼“–mç[‰nPen6Vå;ø*[À©¬œU`\ɶ<…‡H?vÒ¢¥˜ƒ fö*óe*ðjþo(¿‹GUãñÌ×µ#Ïn- òn¾[å{Ø •­dÜ^ GÄä>•]ÇZUÖÆo‚µ«l5[£ò›ù-¨Mùü¤ÂoUù{ùûTþ~þ¾_Ç‚ýHåäRù~þa•߯?¢òÛù*ÿ(ÿ˜Ê?Î?¡òORñ)¦fžîu÷µuiÁmtµ²ü4)Ãg¨¸ v=Û ò»ú³üs*¿w϶0<¾Ïc‹äУòü•ÞPù½ü>•ßÏÆ«ü2œi}!nždÍ*ˆð>LÅ#€þ¹4û<uoøGŽÀ¥òC¼o¾––ÆVô4MKÚ'¬\ÝNó’ÕMMè.[}K—ÉAZþ(.£7Œ q óiä1Ì×vñ’5~Joqêq6/þh Ʊø>û?Lªü>‰¹¡@Õ‘t$æOب²­¬ƒß„8Ýõ!R;q3¡­¡¾éûZ7®›°ªµq1ªÛÊÖLx 8â& +ÿ2߯À;<¿.JHi1[ô ?ÄQŒ|*?ÆŸRøq•÷ñ„ʶ±N¼šþ Jˆú3LIw縷,7§;¿±y‘Ïöè!Uá'LÖd  Ë|œQøIW ãõ·™mÖô¢çËÜ•°"ã-Ý90Üf[tFº[=Ôƒ^FLg0n@+:ŒB‹F1v7RI×åîp<¸S“ÝY•¾\w´ôP«\ž Ru"«ìDjѬ 7è¥bñ+_òL•t×(ÂáFzWmìÑŸV]•¹“®lÑöHtÃг53®Ç«œEÓ÷T‘ã^l䟮Šwú£ûäuH —Œ÷ßÌ— Kiµþ„’ƒ¿1Y:'Çêx0„b[0’_¬•õ×(SW7rMå@\Gr4uÒ#ÅÔr.ןS“ËòJsï…’:®˜.b<«’jvk!m§ŽÇÄ+Ï:G›|ˆ  ÍE¸4;±N^T­úcZ¶nÓ’ýÚ&r_¼ OD!Õ†oKzz1ô #Ù¯Ëtù–!­°¨œ-ÙÏzeHÅJŒsšÙ JZ€"ŽÆN_ ôç;y,9Iˆ&_ÎC·j»ºý¡ä…ØðÈQ˜ñR–­Ô©Ù’Œ ª¨F×)zÂõå`‚4:F 9-çt.ærå³âám0'Þ^•xDš“% б<§smŠtbbƒj5ÂdÜú—æ{OÈw·Ëë½G¥ßÒ/ ù¬<ä“€Ïh@p—©ÖYóU‚PäI@›ÿË7ŽáóÚ:$…:1ÒÿÍËGÞƒ*B¥ ìèÆØÊS;,çëËmZ®lÖD‚žüÞ+;£ó¤ñâ½G0¾ùnz7ç<ï$z“äwüôCö´ nó=(3±£b"ãM<+yÇø‘ë’¡ Nƒ§a2Œ¡'4pÃY8‡cß ŸRÁ ØÑÐÿ&ö¿eèûß1ô¿‹åKð=,‹éÁZŒý^õOàQÿTôÞuEýsø…ÿ%üJô ¯Šú7ð[QÿNö/ë×àuQÿAÖDúôïOð†¨ÿ,áÞ”õ_dýWYÿMÖ—õ?dýO‰ç_²þ·¬ÿ#ëÿ“õ[ð¶¨ÏËþ;~Êà\ÄòöX°ÞçéîñöÉã2÷ÙÃúÀâ©ê+µ 6ù°¯7ÂÂcîG[ÇLú˜ê2?N4+„ÄÌølò/¨%ð‚³ðŒxö(ýB.cY ¦Ë‹‚·ÆÆCX±Ë,’ÝÛ‘]+Ö»‚QoŠÑê>(ò¸q°x¸Lº-ž”xŽƒ%ÎÜaF¦*v6€U0„%W˜¢0›ÂìbÉæ\…‘+ú‘ÞÖ,®q¥cEBÔ›.eªió”÷Aép>*’Ñ7I;ŽâE9ÁfÄX|Ür3Ô;}?8J\¯œ€ÑÏÍÅq(0ÍÖûcúÕØOKŬ9(d#$Ë‘Ú}kÂý=ƒ®¨ ›S'ìM@…÷.¦Ÿ—B¹Ä3øeìr!]D®°";â-f%ïÕï$OYŒ#1G~Æ÷ÀÈA™›ˆHœl¤DâD$¤V:‘ Iñb.9?Ah¾±Ù΂ƒª2s{FÜ(+M |Šx±Q@•ùLÌ)BÑlŒ™CBB¸vÒ9á9W¬ï‡É}¸7ñV%`ÊÚ x'»ÙX ?Snb´¯°^ÄA€ ˜z¦IA*À –+ —>ŸHh’'1l!‘ÇÆËé€D¾Ð4¯Œ´àôAAµá8TÞóáýŒõ^~MŸVå´:`úpŠ 'X/g¥çÁrD‡5VRgK êä̈MÒS̽`6 ³w/Ä °‰l’„¿^Šs¡?XL‡“Ü'a:F[ïi:–à“^AÄkšQešñž1Z¨×|Ø@Ħ‚ P®°+P/Ød6ERòHN]IN Stް#ÆC}cSÙ4 ·HªnunJj‡„maÛÛ—l¡fWe°ƒø¼ˆ¯2%±Ñ’ ÕæÃò §3\TGpXOÅE3Ρ²‚Ô²™}0ƒNžB3 ˜EU÷d3Þ¢=HbÂj‰  ×…^ª0{­÷ˆi~9á<W&ઃPEòÌIÀÜãpu‹·:×Ì5»Ì  Äõbõ ¸öÙýÕä[Þ4Ýb0_€±èSIIfêJRŪ%S‘/ %oU?Ôö€ÝSÝu‡y†˜ŠP컯 Ó.Uy>ÇYa¡d#ózÀÂICLgA¥ ÇæÖ7Eý"ì/ ¾ï1ªžiTYr ›))Ì’h÷¦sÚR†û>B}l,<õ’-FðYl¶¯‘àc‰ê9át8Š0—Í TW¦”`²´ãBó†R 媜ÖA æ°¹)uˆR‚8'ÑÇ.êÅXަ¤#"_Í®‘ÀåîT·Pèž,#qài]Ëjåòji$¥´|qJ£J€å`s²Éé³í””Z¼çÈéG;Fße©©õ84&`Éaáp#¥^¹ÔNï—ù°a]a1TÀbu37i×üÑ’è4#QÝõXECÒXªÓÈÐ#« ó¶€½Gâ:€º­`½ A&œ…Pñ–Í7-0‘Í”Ä}¹Ì ðåµ7¢\Qk¥…nkšzÀSáB§W"Ö4¯õVЊM®¬µèÝUk÷›Ø~3ZÜ1—x®3D™Ñ`¾%Œ±‹pµÂ*¬þmp¾%¬p[$ù|ùtP†ƒ™Qk­Ùs-¦¹V—Õe9ëÜf’S«è =­è WèvM¶öZ[5LµÛ–€Õ=`í÷)˜¶Þã²öÚZ»·}ƒÛŽ›ØoEŽ{ËÓ¢›ÖKPŒÙc`¢ÂV Ÿ Dpë:/¹]œ²N‹È˽žCè\,{ªL. z¥Ì0[fÖÈ–Hðqò€íŽç™éj\»€-•k¿‚‚)ÀúvAÅr Ö¡§\_k-Ÿ«¸”òŠ-$‹K!ÙØ’²±eÊF‘²±»Íè«Üf’€.Ѻt’ŽÃmu;°aí~ û—Ñ)/{õBÁqİq­×­ôÁõémM"‘9Eº …6)%´‘Bh#u¡ùRùL¹!ŸÁØÂ(,™0%MæJËÙŠ‰Ä¦d"ÑÄšå´[¦R…”Vnòž€ú`SKKŠž“夓ÖCiSÎì7$ɃW¦‚Öˆ”âÅvFáj“îÙ7¡êo¦¾å9ØÒÍÔ:[ào®:žTwk êç´ë‚dÈ£Öqkñ40=Ó0¤a¯I˜ø ØÖdˆcc(ÍA+áJ…­B[:6~È{_ÇZ%~äŽts‘ÎÝÁ]RélÒÝÆöZ³Þ¢Í£F¨n³˜ßÑä¶PÏ"W(‚ÉyÆëD ‘\k—ä“än‘È[’¸Í)Ü ¸±ÖŒû¶WS;¤óU¬Mâ陿Z\™ŠÈe™Ms;÷[P_ON«rZÍœ6Þ¤”Ÿö‘”ž‡2Y!Û«ÙCÔ7‰¨o8CÄÎ0[ ªkÙ: ó<*´|m1)Äíµ–äŽ­nË9°»1 ˜VWUŸÆd=rºð¯ÅŽ{†Ûê=»ªY¢µ 6cÇ îVN@7ÚV»qçöÐÝN¢Ob/¹Ù}¹(¸I”7ëLÜ’y±,Ó%¸B˜(IdÁ<œXÏ6¤4Å$Ò¯…É£Ã3š[ýÜŠž¿ú ÜJGxÞ{Ê©~ßEõû…ç°{HZ¨FÒLÓ+ÓE¸JÛˆæfB¿ÒÉñz$‡.ž}·Ês>4לte&‚Þ·üâˆÍ£üÜ–dî¿ÿ|8Õ>+lIo‹‹™hÞfšý”¤AnCo²ó7ÚÑíh^wé9òCâ°d d d Òd ²È$Édò9… Ù,ÑÁ.3È‘ß×è^\„b›ï{¥nÛ1¸ãrçU€?ÚƒM±¦7cÚ¯\î½ü‚@q@d$ØúXžH Wóñ£IEeÁÓ<Ÿh1͵¹læ 4 2›$hwÛu`*E‡OÒˆ§š ¨”›Ï’°¬n;:ÛZë~ZÝI·B1âSéÓß%—1TÄE{“Ân »ö2Ô;zZè,¡²îØ0XT çå@)CÐQ`OÁ(l³„B5 pjuGGáÄA?0“Ú»QZð|/ÙÞ¼èf{ËgŸ…©X‡O—h|樢qgº{l‰(G·„酪WÁ".‘S=nmeRoïÀ¾ëâSp×úò~øl­Yø#LŸJÜæbÌv>·Vø¡¿Ò‚~¸»ÅùyáÆaöçü‚hާfO­E¿OcOq¨µTSÎpó‹ ¸—å^ç}X¬•£÷cÛ˜KÊY= '= /Ò³ËôŠaQ*]ठ¶k­ä NÃ*"¢W^F: › è(hAÈy®¢Ãâ8¡:óRš}fV; ”©1/^Ðz ;y4Ý^[í| {.¥lÎÇ{ÁâüRŠo]9­xŠ]¶ûÀ)¡Ó\/LÎb¡°Úù„>ãH2යl¨Tþ'³É •}H‚‰,ebO$·¡½|9;¡äÆH…0ÎŒ$Пò6¡&Ä_=^ýßÕ`´Â´k¢,g+qæ2b°e¯Å%Œž«"›*`enëy˜ô,CµÜÆ:¥þ/Á°KúïÕÊy ެ÷z뇣ͨf§àuûá©fïq8ŽÎº¯*ͱxép(l;Øg0u¯5‹ÜfŽxÈ(ð¢ïK@âˆ÷ô3p¬Ù´ ‚LldU…·BŒ·aêß{ùÍSп/T'2Ò…Éì@y¸ŠmìFÊ‘Ú1=µ³±©œm”˜Ä1Ó3PöÄdúÏ=ÿÙá†q(¶a« NcÙõ³XÁú Öǰ~ëç±þ*Ö?à“ᇸEŸÆÌàf½|2_ îÿPKj×™dAPK7A$org/hsqldb/RangeVariableJoined.classW `Såþþæ&÷&½…’°%Å"EÒ´µRµÓb™PŠÄ…‚mA…é¸M.%’x“ ì¡scîýp7ÜæÔ¹U·nW[§›º›º÷ýŸî½éÜ{"Êι¹·Mš›ÒÒóßÿ¼þóŸÇN{á‡tг}¨Å]> àn/ùðqŒÉø„n|’1÷x‰aœ¿Žò×½üõ)þšà¯ûX|Ò‡)Ü/ãÓ2Pð ŸÁgÿƒ‡<Âàs >Ïà ¾ÈàK Ž1ø2ƒ¯0x”Ác gðU>çküõu>Ö´ð¼ý&ƒo1ø6ƒï0ø.ƒïñuž`ð}Þ>Áà ~ÈàG ~Ìà'¬ù§^ü ?÷áø¥Œ_ùp>žTðk¦Œ+ø ¯÷*ø­‚ß1é÷ þ à þÄVüÙ‹§ð´‚¿x±Oûð þªào þ®à þ©à_Œû·‚ÿ°ì³|äqÏ ø -5¢¯7 íÀ²]Ñ´1Ò±7{M2>Ü1À”š‘І“úZÏ…‰T"·NÆó$6˜ØŸIêýÚ~]@¤RºÑ›Ô²Y=+ã¤À‚ÞôþL"©÷¦S9ý`Nà®P±æ!Sc1f3-¬l‹–ÒFt£yF} [21ܱՈë†߬e÷ê¹µ»þ5Û4#«/6—Ú¹¶e‡€Ô›ŽÓ¥j²zŽøH4§YWˆ‰5ƒ9-võ-c^’S 0¢ç6hY½Ä]$Ðj™ÓKègª*ôÆó™d"¦åÈŠ`¨¥² `!ÓªIÙ%éDjèP†¤Ü¡;ÙÚ:-çËǙԛNæ÷§Hÿ¡S¸”E½$Z „"æÝ µ>™œÖ,×Þw0cèÙl"MRm¡è>í€Ö‘$›;sF"5R„^óÀ:rc¹’5JZœµ„ɱ i2}*°¸Ô}C–ë—îÕ²ƒ¤*©GRqý E?žÈ™çQ”w Ô“77&²¹D*fٔݚ2YÙ·»"Ì£Ò)ƒi#g¡JOJ0¶Ã¤Ñyj¶„7ªÄºÓÔlè(åt3*TKÓŽag“ßW”å@J.ÚžJ\“×gD‰B…»‡Î³{Sˆæi‰›µ>™ÐȬ0eÉz@̺-žÅ–—¾ý³èÜÔYϬ/‘ê{ÌB©E£M5µýLu";ÙkíT¢m½$«ñM’¤‡ÅìM‘·ïÓc;wŒ‹¾0îͦò0Tdµni££!OZùT.±_·¶kB§‰a5`±Û/ éö劆–Õ󟦧§Þtž{- žÔ‰Ï­Ô/#•§ê ö·]2¤¡ˆ9K© wìÐ’y}[:ä¿2Ôíüó—_™œŸÍg-†%¡ˆSÓá!“ÑSqçI¿\¢ðF‘œLw/LhŠí#rÝÜóž½_[ZΕØè½K™Ë"ÊœÙ3¾’KÛ—/M˜é›5T>‚dœž¬ ¿Îkú¥ÆFp}S{$øRÚá¡ 6ÜÚÖ^/Õ»§ ÂS¨: þWÅ=Ôâ4hç¢u <×$¤GàŽ†['๲«'HXù¡;ÐÅk°sÊ(aé>xm„ÏBTÛÕBÔ5í{ÁžG@ÆnQ_{œìÐ0l¿ˆV¾…›åÇMó7â2òµÈqèùËúF%†… 6:Šš-‹ð¨ß?ênÄâÖqb®‚5¦66¨U'iKCÌ#2öz‰D=ÙÒ[GZY¯^œBÀ>˜úµÅà'U´z­SXbÓ©•—Ñ—Ma©MO;Þë4›Lý¿ìüÖ¶)ÔÛ 48ß`ûÆýËl2 äà˜E¦QÃI{£M§)ÄA|¹­æ“rëÉ{§Ûò×9ßd“iªq ¯°ÕßàH>Ã&Ód‘ó Ó:Dµò%&•ÀšÇ\]’«Ëp§tÀÝIÔI4wyžª;á HÏî±€d'°jgîî’»ÅèÉcUcÓ9½ÒÂçáâšÅ³XJhš¾œ¢¿Ú6ñFÇû‡ìûÓÈæ@n±¥i˜³Èý¤[¢uMá‚^Rx|¦X ¥H¹îo?wûøá*²þI1>m}5¤š¢þ8Ü„¢Ñ)ò­vÞÑøhÑÓÉ|¶B¡%¯¶Ms¼ÍâXIÝ´. “í]R¸- µüHŽ>« RâaÔÐ(WX`«Çµ®ÑºC'¯|‡Ž.) U݆@°€²BÒ3 %vvÑÝ/ŠÌ"~m$L›8©pÛ+ïlû‚4 ;ר¾§)ÙÉ?¶øÍŽÚÛä÷â}¹†~¹2„M¢ÑÛ±äϱh,/w='ô¹6Í´q7]ÕGëjòÔyý÷¢ËœÄ‹ºÝâü+¦pA·äïîömíüšŸ=ü¹®Û3Š…ìq·‡;Æ$.ò¯'Pïᯠ.³Ñ½ íbãú¦É…t<ÝæÚTàZ9‹§YÚ]“Ø| diT²Í!©sø/…Ûÿ’iW—PÚ)!¶ñJg·7 ÜŠ:[0ÊL£¨µ÷[,;½­A÷îIô›½•7‡J—{ê¥Il›)‡ ªOâ<Èf?øµƒÛdÜ.ãúøžÃåêEâ$Õ¸âÀ ¸}Ü~’49S« ß'PÍO…Œ«ÏRûü·‡SN]jçÜåÃÐ8ËàÅx;QPý(íŸA­ Ñ Oá„XúÿPKìÍò¦ ØPK7A&org/hsqldb/RangeVariableResolver.class½: xTÕÕçÞy3o–— ò’<“°„-™™0BX% nC2„Ád&Î$Ô¶þZµÖº´ÖP+‘*¡.-@+ÕZÁ¥­¶µÖ­Z·º´V[m+ÈÎ}ïͼÉöï÷û9÷ÞwîrÎ=û¹áé“€J¾Õ O° ™Mrg.ø›ìb•l ¦Êlšd æLj¦Ël†\%³™nÈÒ?fQ3[fsÜ0\‡œ%³¹nÈÓ?æQs¶‹Íg h´€F itΥѹ4šêÆÑ"ú¬¦æý˜4r-xv?}î£ÏèRÒŽŸ¸pÝ~ší&>&œì€›d‡hî!j&1tÓè§´éNZúÁÓΟQó(}>&³ŸÎÇ ò jž æ5GiÁ“t¥§èóiÇW?êÿyØ3ì—ÿmý5‘ö Áž%JŸ£]ë ßoÜx£ßÒµ~G‹Ÿ§ÙßÓì 4ª§æ2{Qf/1ã¡x<0È­‰Æš*6Æ/kn\_Q§Cg2pÄCÍ¡†6#­óËÛC±­u­¡†ð†pC°M_š FšB«ƒ±pp}s(ΠpuÏ ë,.w7D#aÚ‹Kó­+ni% ð˜§Ö…úRÑ^_±4ÖŠ…ãqQÑmi 7‡æG#m¡-m2{aóÓ` ”êH$›ßŒÇ‰ÐqÖS—cñPlÁòš±é»ðl%µÍ‹4Ö5‡B ´4–Y¦péð¶PKëyÑp$uD4r]_úáp^,ÜZŽЬM}÷d_¾o˜ʺŒø?ß¿§:7£Ï©ëå¸3©Žé øºµ r¬[çGÛ#È@VÍ`XhKk0ÒXm™Å Ü0lC8o« mh£Sª#¡-È\nÚh…Côªúþ`[(lîwÄÒv„÷=¢/0»!Ú,†¨ /k63(Duª#m)í±î[Ú†Œg0¾ï>ܰ8´ÛÕÁæöí]lŽ2‰\h©!ÙÜO.ÉåŠXÔÞÜ+û‘'¦ú pÌ GÂmspué)̱l5i~´Õtmév8ˆœ–A76‡ãˆÉVJ Œº¶`Ã¥HðJ€úÓ‹6à¹V}Í/ÈÝ”­ÆèŒîœA^cˆì8¡MY7^8àÆÓ¸…iÂÊU~5‰xiÌŠ·ºô¿‡#[7œÔñ2¼(ò4™½*ÜrfKtsÈŠ~F逞C ª®|Šä‘ÙÐŒ×!㘿1HV½xˆÃNã–0/ÇBQ²$¼1†DŸU:´Wz–”á2{]f’áT‰¦p¡Fqþ²h\0‡A`0ÑT¡÷eèÀ2Ðý‡›"+£„éÍ1¿ ›6ØáCȃ¸’gž•†6ŽaulÀ94Š´o«økK½ÉØA6 ¡˜H^>ú9ŠëÂ×é›Û[U`pTC>ͧGýà:M¸†ÅC:éV&-ûo2©z-áÉB<é~`åÿIJƒj¢M講Q]ÖÊì ÔŠ¸ªÂmi¡}éõZdUoÊì-^Ãè„(k£‘°æ § óâ+ Žaí¦À§pŒAñɘ¿†geö¶ÂÞø=¼À h(“WàxU7àMÞ‚·Œ:UÄVà/ðWcO'B+ð!üMàY´Î£²Ãßû£í‰ø|¢À“ð”Ìþ¬ÀÓðŒÂÞ…_)ðKjžƒçø Ž)ðÝäÏÔ¼GÍûð&Šy@ePàðš¯ÃŸø¼¨ÀKÔ¼LÍ8ª@/æ ì=ö¾Â>@ì/ì¯ ûýMaÑçÇ€Lþ;5ÿ`Ÿ(ìSöO…ý 1²³ÏvŒ&ŽSó9λ4уŸðlH(Ë &š4q’š^jüã€(9ã\á6j$ÒŸ¢¡u„Ûîà2jœÂD(cœÀ.…¹˜[Á:öpEá—¢b[h*½  o5*l‰GáeÜ+sŸÂý¸‘—ó‰ ¯€7e>Iá“y¥Â§#¦òi ð3 ùt4¤Á,Tæ3^Åg*,—© ŸÅg+|?Kásù<…å3¼ÑÙDä|ö†Â Ù(jð2 èª ÆÏ!fŸKâ~/">U+ü<œe£Y‰Âó…/áµ _*t+ ÷ŠP<Ú¼9“ù2…/ç+6žMP˜š1l¬ÂëËJ¾J᫉†z”?Ÿ¯a0é‹:êZ…¯£.@Eæ¢Þð‹èób¾Fá—ð Â×óñËÞÀâÞÄ7*u]¸R/k)·h ÆÚÄC„@Ž Q5ú³&ºfM.ã‘:iž¸õþg –©R"£ÄÓè°G°Csš|:UMߣbº© xÄÄ/R‰ŠQÈúœy5u(ìÊÒê/N½¡9D›t!'t¥`P˜.N\×°1ÔDiÚZÛQû¦ ¿$:‚f˜êg¨c~º’Z”Ò½™ã™Äqih«xÈK'ìUpÖJ/0I¿SØ£é”èÉac0^+<Zš ¹¥^¢| ýâtG,Du(ƒñnƒj”éEƒu§û1À“^? û=ù‘u×µsÜ4Õ’~¥gßSÑn³ÈcM©mމ v·ÇQ¼4§5n ƶ ¿oÀ qøô°)ÌÖÃjúºéSΉƒ…×§4¤­°R9è3òKЬÂúÕÈ­®ˆ^^‡J€Ðª_j¬ÀÖP,ާb™Þ‡"mb/=Þ6æ!¬¡äÔ{{q´í†ó£É&Ÿ’'VÖWW—-@› ¨&|9ýØÌ bÀ«Ë§jµ }Æ%ÐÐÎC^•"²êôÄÄ#j™Umat®†hëVñÍ ô´†¿‹þð ¶ùøûþ þ…£[Áûë¼€y¾æØºAò>önp DFˆ³\^»½R7x¨ 0£2q˜…ÃìnÈIm†Ãá8Ìí‡y8Ì¯4¯o?œÑ …ÔuC1õ#ºa$õ£áý€ñ/ >…T^…TJØoþÿ¡²Ðë'Òʉ®$=œ zÞBjˆky½û¡ðp7”˜ƒ1æ`¬9§ñÝ0Aÿé+5Ár7”ÙfŠ¯Ý‡}Y¡qŸºíŒuõ¾kYéM_é|¥/}¥¯ÏJºƒãB=PÍŽCadX:œúzô ó+ðÂìÇ{ü><°®ƒP^o›]dà©Â^¢qQe&Öë£ýPq]ïK~Ó‹*iïvŽ´<®ŸàJÀ¤Ýp?Š0ùQ_[þ Tî¡Í7—ï‡);ÁÝÔØQž€i TI4ØgÚ;a’&B!iR¦ìªýv Pí•(íúPj¤*Ü7Ó<`ær€ ¼&uõíúåjm iœÑù(“àô¢¦—HbªªhÏëÔjféó³õ­c­ócqJ•:Ðxö£6Y&ÆQ3Gв՛€³¼ŒÔ6sñ7gãbí,¤©žO½¡• ’DìFûÐácô%%}À%¸:uÓáúMñBøüötˆÅîë9)ÝZZä²qÃU‰õÀ(NdôÀ\Nƒ¹øxñ›ñ|9Ÿ«Ç@BðçpNM‡‚pÒûazï‚¿ñùA8wŸu ›™U¶‹HpÙ“;aª·Ü*VëÕ$êQÔ¸•I“öi’ÚË÷ùPþÕ>øy¾}¸¯¬V!hQ¶Ö 5£³m‡ê@á,ÆûO~jÖÐXuTj’Þ€%U²&{Yjýš|–r¨ßî@î<#(Äæ.ðø}ú’*§ó$LF®àÿÌ¥ô@ÞùL[&8é™Þ¸ô•xiúgWyÅ¥—íC6O[‚ÍÌZ/ÝÕ#»²*ü¾ƒ°|I9µµ~\'.Y®üûˆòìJùX±Ø»}ç2¤Êç5©Z–¢*ìH•Ï Ê™‘‰6ÓûIÃÑ Äv9rE›Uò?e6CM]<u4¶ïé]ƒÆíFµ.BG€Ö^'Té ‚9¬‹my>4*$`%vð ;5«ÑÒl;JÆU¹œœ{°\•u×QåÔœ†ó`·hNôP‹f¤9“ƒl[ß ¨§=Âùõ]¬IŒÅ¶Î\3ÓX3M_3ŸŽ\³“NŸn€Ʋ€ÀYbB°|s‚Ü s cL’Ÿq©®Û`‚æÄ0E´kÆ Ïª´wÜä7O™ùEO¹ÆrÊ—¥€Ý$E·ê=Par¤ÊMl×ÜÆëêõÏ\ Ý )€ûg›˜›ý&BëæimÞ.³®“h:p§.Ý ÁE ÈŠÁÅ :à:]‚ §Ø‹«\† h.c‘JúÂ…r(Š%ëϹ44?Ð@zá¶<ªÇ€î†Q4R= h¤IÅëCš•„¶{P_îêÝßÕÛªÚ;àjò¿_„ÔK­¤ ¦o Ó\šëÔ¤¨wkncÙ4 ´ÊCV©¹49EÈÕc5çfT9Mx±'ºzo$+éy/å^¯…Ñ=0Ff’Sw•£Eß ~pÊÌŽp&3ºtž=0Myâ·ZÐ3˜g†g?3„&3ùŒ•î’ O@ ý1(=ü8ðÈGðI˜Dóè˜üÌîÅôÇfà¤ý-ÑpW÷`ºæÂ~‡pœšt62Ø [4Iu‚0—MaÒ PÿØTo¤8¾4àTE»IQg¤ Í-ê;Fuªö]P¤ŸÚ‚>̧:+Sî·Wxà«RìÊ¥ËÚ0Ú,  b ©îaŠAø]˜æáÛ¡ßa¦D! §’j¿œªÔið~ß.ÕÎ;Ño‘,É¿b8°¡> Æå‹5™¾T§`@"¸~»)|…à&Ù)j5@¡Œgl£„ N@Q=Z'9#™Š¾¼–±ß'|°´ ²’yb ø-uꃱV¨c?Dõ°£Ö#‚x‘ ÖýÛÊñJvÃròÓÅ•UäpU;…ELÔÈv»álž±¦2|šCh+%BÖv€Û¯C¶Ûñ¢G¶Û°½ÏëÇ8}Yê¢À£‚SÉ= 9¨®¤±'H%xï xåãy ìúµ3Y–~m[~gaBÚ‰gMÚ‰Ôó9¬JÊ…Ø »‚ræI›ŒIgE„Ç ½ƒ4çC¯÷€ÍY­™Ùe¶\^åb†—Ð\ïÏÑ\ªØ‚ö+V&`k•¢‘¥úÑYè“Û²ËÁ—ì0#£ £À~ëmà.ȘaWå9ÂÔÜG¡ 7ä$à Ýyx4á –ÒèË Š~¼ŠöþòG`rá!ø*¼pe˵3ìtŽª ¥W¡Ë)°çÂ×¢3ì]x¯ÞûÞ/C•w‚Ó6§ \ÂÑ~R|r¨x'Õ%vC¨PØ!̰P·ÁÃáëšL‚ÆV“m•uØhRd*ÂC¨Ô6Š5~¡ËýªËзyºWsãÖ|ƒˆv:Ár ²ªŽZ<wb²tu½p‘.äÒ½ªSg©Ààfâr—žÛ+†B`î>Cf¾\–³~®:)8ãiÜA>é}Ò׈»â-®fªßn©9z*—_Ã{][Oí5ÂD_§)aJ•~š"—€¾ËÜM‰qYýà‹ÄÆ·Sj~9Œpö‚²p›BÏ1éµ ßV%C-í^ìÅ[œ€ë¶KHïó"ѼÖZqŽ"g`–œ8¤p­§•¯¤äW® 1–—‘0ªƒ‰Fùr]п"1LÙú:,Q„¥Q˜ó åšé;â*ÅîŠQ2AM ÷= 5ûá[àò–’_•*}}Ä $$¢Œ9ó¢™|fÓ‘ËÄy9õ pÒ6»P×ôÅ–œý,ê ‘Û×ÛD¦í-$6û ›½údy¡>‘€o{ËÍá ]°'moÿµ–YÔµQœÒlËæüM8Ò4dI¤ú…IºhÞä®4‰»AÈó¹¢zÕabö¥¨4–1t€½)~K¬Å_¥ÌÎ@;b~”$æn][ Y±!É…˜æ¶–ÙæøEHŪ´ ýÅÉ<ÆîÓ0Þ,<Í;)<ƒ‚;mP/ªÓ=úö²N¸Es ÉuÂuF"³Ý’#ãÒvZŠs—`h“ñpŒI‰–J×=:ÓÛôÄÏ’ztÀ4„M(®<*üÖ„bÍEϥŸ¡k¥wÍ~pK—tc*œ¤ÏÈËzíýqí@ŒˆRÜh ¸U·NÃõè"—Óé0΀¨îJÍ•áGݰ· JtèM–7YWlw#%{IPÄ…›aí)«½&œDG`æ™=°Žqž—“—£äå*e9ãó3Šƒl¸ý$ä3seY®7ã84 ³~Pö€Ì¦@7‹•¥ü§iÄ,ŒàÁþ|£©’Љ„åõ¢äxî6“½Yj.“©4ß}„xœšLÏËÃÝk0c¼§ÊåÅ [.¶¡?¢ÌDw½q'Øm÷Š<æ>V¥?$‰D¨É•èj¨ÓÝp¯˜…Å×3” z€ûŽÀ8!úø1&€šFæ"g«\‚±oëÀûDï5ÇŽƒ°¯J<…ô^£9Ž€Mé$¡qön¸>uoÍnHΆg?`.¸© Ê“ãþ‹¯O[|½%S«ÏI(Yè8L7—'!Ù©¾ìqb³ÇÏ`¼4¥ Å4žM0þP¨»mv?\h𣓟o“˜îKGHŸ¤nxP“ŽÂuÓ±äíHèa*Ý4»MXX¾ýd¥¢Xج©µF­e7_È:!d;&Ú¸Íè“%˜»À]àÀ,§ÀM‡é‹ª$‘Žï£Õõ¡¦ðH–1ju¿Q¨ïð5ºÕ7 gBÂÎ.ÛÔUtÒ;T:_·0#(ÁTÍn,¹å $¨"â»`¤(„ŽB¾(…\X 9“nÁ&¨Ül–Yš|جô K™z' $àõN>UMÃüô Dy!­eu¢z\uÜN¹aR&½† 1c[‚%Ç È·¡Ô ÷B¸D}r†ÌJ1“Ǥ ;¯Q¥ç²,È'é*CvM`Ìóé?Åg* û¦:¤(ôÀ~òLsY•Õ&/©6Š©6(”£°&­Nvh£NžG#ª“õœE‘ Ŧ¢²”X4„^€¿¢¿½!w«Pþ©«÷a:š4MºÄŸHâ÷¡i ¡ß-þú×®ç"/XÖç×nü|†°‘rÌÅÚy¢ 脉RÀÝ¥85zŽ@Ž‚vÒû(*X‡Ôb@*ŠqƆºâÓ<šíü€Ui\Bi¦¤ä;2<' ˆ ëE$”½³Hž¦$+ÙØ±ÇÀ¯'½~³tàȃíú‹Rã¬Âï³mzн„â[a%FÅÚò#ìb3PJå~ò>{üfx”R®›69WÝ¢âNXmkQªsbB=@O(®òêðc  'à§NðÄ‘àÊüСÖ©º„Þ.\âíj!†‰Ÿ¡ïÆOG’iú+f0ÍDå™PД<ȯuª¢9ÕŒðXU¦†)–Y'Þlž6‹“;Å‹šc1"K] ÙDŠTZ8e'j¢)÷ ÏŒ¢ð ¯KïCš[s.°2Ô bÏÏwC9âÎHÀãL5#¥ãÏDüY„?7eSÎ@üÏng½]'¯N 5=àd½P-,”ÞdV.³‰Æ£x†ß ç2дø®[òq˜žo›Ë(d/Î> [WåóT^¥òù*¯VyÊ*¯Uù•ש|!qqŽÊ©ü\"X¬òóT^¯òóqm~‡_ÈPL| ±´TåËT~‘Ê/Vùr•7Á jš¨iöð¾R᫨*|ø%ÄJ«ÊÛ<¼w¨¼Sá—r5!7®Ñ§Æ×zø:¾žp6ÐëFZ|‘n¦æ2j.'Š÷xàŸ|‹‡_ÁÃ*ßêá=¼—†# ßæÝìU¢ëÃ'ÞO‡ÒG°(_IcWQ3@M 5(àAÚZÌÍã|Èͯæ Oò”‡U¾]å;hŠn¾‹_CO×’®£¯'ªhÚ‰÷*ü&z¹™š[hK»étn¥æ}þ~~5·+üÔ†?¤ð;~§ãwyø‡ùÝ*¿‡¦º—^ö(ü>šêÇGhä£äð~bsÄÍ÷òÜücüã4ö â±·èiQìWùCDt@áŸPøÃDû$á>âæ£üSôô(íäÓ4çcDðj>KÍçùóhuü ÂWù$Û'©9¤òÃÔ§ íˆÂÇ©—^¾@çðEjŽRó%ÚÁSþ4†öø,5_¦æ+Ô|UáÏÖ×èåy:§cÔ|¦~ÁÿÁ¿éáßâߦæ;„÷"5ßõÀã|mé{ôú}…ÿÀf¯ŠO:E˽DMØÃÈ_¦æ„òQS¢ðSÿbô§Ô =þŒVü9½ü‚š×¨ù%5¿¢æ×ÔH;þ )ÃoI÷G¯¿'µxNþ ÿ£ÂßPøŸ¸Ú;¶„.meÀ‚ ò›â±d*K­  Gú0Æ@kêhïn ¶‡Æ8wWKcsf@ R[Gspe°%3æÀÙZÛW­m\Õ²eMãºFÄɼË ;»Û¶„º7¶šÖ!‰ä‰ ¥v5&á] |›[㉾ºþäÕ½[ëºâéh,²J衞þÈ`˜A™ šCdG,<a ®Fp»|Ô‚±X$Ñ4N&#Is¬Ô&V[8î‹$f›ï8‘–ŠôD·E{ôY¦ …øŠ$ºw Ñ<3r¸MÑ`ÔCo«ë!Äó$"©áDŒ@ J'¥q§Â[":VžAB# ¼V9¶„Pô}ëê@8Ö7Œ;Àåzéppp(Ü“²2Jí¢¹ ¢ÉfzŒÆ¢ÉT´õbƒ¢h²}x` Nu §°ePŒc‘¡ðöÈP<KµF¶Gs0¼³yŠ8ÚÓI¤pƒyÑdW¤g8‘Œn'ië¼' æÝ¨o©È`$†SN·n$dŽ/‘34öõ%"}8„;@†û㽺ؽ­W†·‡ëhH’ˆÆúH¾4Ö&±H²‰È¶HOªN‡!æŒ,æúhªõ?†ðh<†úM¶F·&‰]† ¡¢eÄÕŠÒa0ÓÊð@Õ%œìo  Ez çw%pYÒ†ò\Ý¥ÑuáDÔ8­üíÆsS|˜$:±-’ˆÄzˆtÂ*‰^öÒb¡­¢áÆûP= ™æ™¯òì ·Ž¡H"¬o͵7uCUpþ:ìšâ½ˆynÕDMš‚í`P+}‘”¾’¨šÔßõ³™W5ÿ4m)it Õ)óñô{®BI;š†ð&ÔÛxŸŽ â@Ç4[•¹«àfûSɺU(øTÄœ»Ë"Î3sñmJ4MñÁ¡x i”|‰' sdŠ$“(Ñ%9cr[¯DEZBrÑæÈ™•àÊ6Úš§ÃR´"ý­9Ò36ϫǚ#ÛèÐð]Îå«Úd3&m¸Œ>Êxï®,š6·ìÄ5baÃñyi—ýt¦ÝÑÁâà<Ä5¨QáÞÞNSÙTäìº)>0<3<êüu˜€(üϸd$Õšñ3´«ì›3šì µÉÙÑŸä#f³Å ‘¸­ïÅ9ïúÞtª.‹¯,«šÄY’ÐõSÏ"ûsO=ǵj8qwÖ»–WMæ¹ib­/¹¬jþä~^5qõ³·qÓ´tg"ÞéNH.í] ¹°uFî„VwY€“†r‚SUÕi"-CÚÓ6щ+IÓªIrg/¤ãÌTOœÌKTã#G N 4l³pIh\”"©éN{m—´…‰–@«»ûL4ÒàùSÅw2‹ZY59&M;-«‡úÙVLô›Í‘F;Ÿ¸µ„/%IÆ(–Úú2¨a…¿‰'ܽœu` Ë4…¬OC³Bªm¸eÏUä?Ð|þÜY4Ù­G-ä‰&WÇŒh'µËjðÁù“š¼î¤:Çå;>ëX(Ú §ä29¸F|£¸ Æz#;'9L7'þ$¥ëŸ:¬&É'‘”|¯îG×åFÚÓDI•“+㉮H¸— &wæ)b—oü ëQ:çr<:Œ»'A¡gÙnÿ¯YܤojÔ¥=2§ÖØj¶Wc5LÓX€šsXÆ1 ½Õ”—]Ä.Ö˜Ÿ5jl95ÕHÍÿÉæjl›‹ñ~2?‡+òi¬…ÍרJZq5•l–Âÿ­±NÖ¡ñwØ,çÿÑXkÎ Ýo2’Ȉݛ“Ȇéb¬±óX½ÂOhxÜLÛû­xRãïâFù)l¦ .„"ˆ%œšpÖ5ìZÝÃîÕØÉä=l ªýxñ­Þ¶"޳±µ»¥KÃ9TjÜ(ÓPgKSpe° cfWÇÚî`{‹ÆÎÄ­ÛŒ1dEGóFMäѳ«©«¥±Áç³:4³ÆU«ºZVá>wvu4µ4¯íÂguåÚö¦î`G»&4Ö¦‰|1 ]î$QŽmé^ÛÕÒØbšÕÙݸ¢—¨BA‹…(¤¦ˆÖWÍÒ²¥—2ºQ- BÑÞѱ¨¹÷×l†ºƒM‹“0ÜѾ¶µ•öÐØÚÚ‚ÇÃ;Úqµ`{çÚn"nYmG+Ü¡Æu-Ávw¶¶¬kA*¥yc{cÉÈÕÕZÛŠ G¨¥;D2ô"c-pÕöÆVZ¦± Ù¿€]ˆ¸¡à*9¨"›¡n))çâó.\¨±vÖ¡ˆbM”©Ñ…š˜.J‘«öD7kAˆ.K@8msc7îW5 @›ÇÎÖX-)a[¢ˆšð3LýçLa]¡èà@Ñ d_4QÆvä꫞_wÅwPÖAÚ8¬±(Õ®2eªY¸%E”k¢BTš%%ý,YVÂxm›­kì,b{6²-Î@£3™¦Ôµ3ÅY4ÕÙš°9 ò£¤Ó£æƒìë[Š&.æ‰*t²$>Ô‡i¤å HË´…Sýx=ÒÄ|Q­±etàãAîõSckÙ:MÔˆ€ÆÎ%çq3š°¨Ej±@T38û4¼”&ê}þ¦&Šs±HçŠÅŠ8Oõâü\+Ϙ¾^Ó›%æœ7KªñçÙçq&.DãcŸeŸÓDƒX¢±tÆ~þ]Å4ö ±ƒôøˆãl‡Æb4±L\¤‰‹ÅrM4¢´Ä M4‰fM´ˆ•È“$DžŒpI’@ ]¥‰Õb¹¬ýMDX’+Ë+{·öÔ­i^Ñd™!(Ö`6¢‰K]À3€Y±8þáõz;žüW:ƒvú]œå¾»?ß!ý+ž~§&.èœBtÝb­"ð„Ö‹ Š@´IlÐÄfòƒ—±ÉYàeÆkfÖ(¿ Ì+z5q¹xƒš‰!ŒzäU¿;œ·ôžÈž–ÏÊbð1ÐØƒ2ƒ¢‰-´ò˜Í‰°&¶ò·5ÑCM¯ˆÓÛ4ö$;¤±gسc_ÐDá÷‹(ƒÙÙÉ›â±H{<Š'0Y¶ðàö!®dhâ*›s7µ6†BÝ«i½ÄwØ‹¦ìè|²U4íC̓ÔÄD•&âbHc :ü«5‘IM¤Ä°&¶Âjv’ôøfT]ôz 5ײݚ¸ŽœíõìEÜ ‰Å{q“&n·hb·¸Uïï§æ6:­Û‘#égÅø€‹²”,ã­ø kSć4q‡¸SwQ3ìkÆd9†&>,îÖØÙËäwÐåx2rhÀqÆ" å}»Sc·SdA ±«5ö}öMÜ+öhâ>ñÝ„Š">*î§x_–ƒ¬å£\g%£¾¬ç(ª<:ý"Z8>¸Ž èzžCòÝÄ`îé^pŠmòÜ\§œ“çÊZçWm¯*«îT²7D%ÀK[·`DÜÒ½±³ãÌ%9)›M±uªÝdCÊ’M²hY8þÂŽ11iÄ}g\/,–OYV,±+¾ yŸF}P¦U2mt$ämsZ2Nà…¾'žè•§v–QoDd.ì™E:TRa°Æö²h[’µÌáØ¸4ÙZ3*‘õ2b ÒkÙŽoÜ=¸=YlÉ8ùÑU{m0m ž®¤QuÑéÅP»ËÈ„!=U\Bº¦) 33ÅäK‡ÃÑmQËŽŒêq*nÚ‡#½†J×HC» ηÕuY¦Ü4>K”[(2ªßÖJ+•Æ­Xž;ó8ŽË&W]~œ­q8oÓ°‘¢Üûì¦Å E¸·—Ndâfl®Æ›rµ~eTÞåšFÁ$;`Ô}¦[h#‰D>”KW123T-?Íó¤ßJÆ­wõæEtÇ•_` 0#]ÛÚ²e5Z]dôâº]ÍÐuPÝí‚Mö3ž~ĘÈfj`8½Y^³-.Ñý'¶…{"v–dç;¨°J9©¡4¥#£ñu› +Aùù½yš[5q{ß$’乪l$´áp½W°ŸÚ” ‰Ã¨ ºFŒ/›ªÎUˆ*ÞÔšé5s‚滃 ˆ« m¸²­ãÙ‰%×j3—Z`§ S±Ûl%ÈäýKþW¯5 Ù®Ïd¤É~Þÿ2íxîdðN$0–èæ’ýå´¤®”˜p§";SãR–PªöÙ…WÄã‘°Lî»Ö¢1·N€!ÒÙä×*•wÄPwUú¤£kÈŒä¤ìj Œ ÑÁˆα Ù¡.Ý"cÇÐp²ÌøuCc¢oxPÿD[6!$ȱtâf_þŒD×ÃÜÌ),Ÿ”ÈÎHÏpjÒ¯¼SÓ9ö‡=%ŠcÈröP?þópF»•(9¹Žmô‘jxkÒˆüÓ«‚ö¡_‰&ÍZ?b¿@ î¥/F¼­LÄiÕ Ž†b5ªg«$IýÛlö3zK9qµÍ,“~- xEDg$Ò«³1ùÇÜMòVk|«¾’M®ˆÆÂ‰]úkA4‰ž&îI™¿w¹¢ƒÑ”þsúéÊàÖ Ðø ©§üùÆOÌt*×c ‰{¾…¡¡H"‰©Ÿ´y3˜bfŽÃ©(IÅ›Ô/ÎIë× ÛOY›r®i¨(òߣ›Œùž« ú¨ñ­É°@)äÖx¸WæˆSD ±-žÐío™ ?›&¡³Kmæü—,ÝÄ[9‰? þ·3ã=jeÕT_$ôØŠ!œRü¹TŠ.*š¤œ\ÿ8”é*ÊðÖQRqÃhæÚ³ÜpzéÎ$Z½i“вs(‘ùúK™€5ÿ¯˜b%zÚu±Wœ&Wõ`bެÚy85¢ÚqÕâ08«‚kãPƒZý¸ƒ§ºü0äá³vò«OÁ´â(6Õ‡@eÂu Bˆô8È%q¥KŒ•¶€ö¡ÿa¥BÕ²T%ah¸æ0Vû°¨Ú‡sxÍÅZY›±X`Z½¹ÊûŒng6à⃸3^€"!°Ÿ¨ ÕýÈÃ!(LCÉAÂ?¾ƒ’àRúí+0œŒuehK©ó T›ðC¬{R¤é&ÒZ¶Î†ÉR¼>žf€93aØF¶%­`ßzfl¬9 ~:²4”Š#PÙ^›†3ðofm5Kì>ŸÙàô;Çଗßáw¥áìj¿# ³ýŽš4ÌÁ#›k yÛl¬â5Ääªvy&—eà½'ÝÚpªð`ç·Öx«ÓPS8+ /.Y³Þx^`Ž®¯A>ëÒ°Ð<'ûllB¤a‘¹âå6‰ Gœ><êpþ[„;±Ìà¨-à=7³6ξx Þó¬Cy…Eû!?à­§UGÁðžOOX*6ø VѸ¨’L! €šÊ‘¢0`Ì¥V¦áÂg¡¡Á á.!ªÝ‚žún p¾œÎ²lá~h x—ZÃáe#àx/’ƒøzq–ë|Ðk~sñ랇ن¬-£„WX‡¼M¹TÜ!·ÜœÙrK.|å^( xWåL±:g4sIä~.Ň5#PªoK?ÞK2‹´f)¼m™#Ð1ôÑvËœ£ÂÙ#ÄhGfŽNË—Zæè²©s.0pBœîÌ:k³³zÖ刦.à]ŸÁÝÅ-œ§l$à<É‹ËGÀkUÜQ¼›,ËnÎ>K"ïeò€¡äº«©‚é'`žÂ®ðºN@9ó‡Šÿ@cžkÞLW9>¸j ]ÿ çz«?œ1‰~ÃÛL#47Q3~5“n¢ ÆÆòt¦ÜÀOÀRd*¶fVmb±šJ3d9~3{XoÆéÜýYì#l›kFtösqíËÛÇÐûë6ï%p¶´ÓH-¯Xÿxf˜›®°¾&…õãX4ö¼†T\̸éÚ®´\@_9 ðƒÙivîÅ1 ñ™ÌÂNàÚrœ¾Ù­(Ìc¶+ 3bÅ3=hßc9Fñi±›ÿHD³ðo1þ­Æ¿m5Þpæˆ[tåë¬ñn?¶´ÆÛ“3¦?õêÐ3j¼‘É ¹º óPŠ‹+Ëplˆ]=aóºóÍÍ'XÒfóù¦[O±a;òm&ùv¶Ã†|›I¾“í²_l‚¯a×ÚÍ^fÎ~»Þ†¼Ì$¿ÝhG^g’¿×ö`æÁÞdO^l’ßl›ªÔ™«ßÂvÛ©ÕJ“|AFS­ä+ÍÕoµ'_c’/´%_c’¿ÏžÜa’¿ß^é&ü6{xŸ ¿}ÀN8MøÙ‡lØë7…s»Ó޼ß$¿‹}Ø€/D“!£™Mð‹)]†} ®lÃþªvÌH6ÖA‹Ò.¶•Í2S6wÛËf±I~¾-ùb“üv¯f?Õyc—V“ICÌp5sÈðÑ£jE¾ßxãc0ô ô™W„YN€(¡Î¹Ï 7¼çS8 IʽSbY&Ÿ>°BÏSÈ©&+jÁp¨B9¥øš¢·C°ýîŠBµ v¬ßÍ1ùšž;s(ûÀSäûãì$N’ŽE‡`EÝI.£ù…1f&×8LÐ æ˜æ´Âœ¹0×$°Š½YvðT¯Í†‡à=³pæ (aççô¢åìøÁ¡°= »)ì#ˆw ñ¬#œàÿ×à;è'~BdèÁm-H ¯$÷ò¼ me2çÆæ: ›ÏC©÷1Xéø’£oc5Eèecp=ªµó•^/·ç†h0 7¦á½íµÞ›Òpó†`Ôï[ÌLÞôØ¢ä,TØýÇa&27Âö\Ý¥gÊ; »1ÞÜÚšÕyV Aa¿¯Ááw<žÊi߯+ÄËúfÌÄá6¢Ý^ƒ©áÒðÁ(2?´ž»L°4ËY8O‚Ga°¹x6ÞJÿXÆ6"st•|Ó˜½ snÌ•î8W0žóY¸‹x:.œ±CÞ!¸ûÜCìÝû,ì¡‹Úk¿4 ª² È÷º÷>2 QöC…„ì“4ÂÔã#„!óõ=ãÀçèŒ|´]Ô;|ŽZÒÌZ)¾ï ¸ÿ“VjR¿f,kPLEu_–*+œ… Â9 +1½A›ñ¨(¨9þqVñÉÏk>"݃Ç3×’›ÉÛ­Mö’/³—}“ÐMA³šÂ)hb š†ÓÔHÇÊuÓý:ÐïÈl\gÒ?lqS¦gýdì5À.©ÏYø#¼ÍPý…ô{µì] )Ó5åûÁ…ê.UâÇÙå8 ÆÎ>.E?Ê>eLí3¶ç¦¹Ð¾÷š«?Ê>mÃ¼Ç ieì’ªXff@ùŒí¶0'^fon1ÁŸeŸ3ÀU¸˜”ò(OÀÇú™“µSžÿùÓ ú誃™Ml04cz€ CaÝ©é'qÕ…úŒ0w¦,‚ŸÀeÔ”ÎF…(kà5>|~œ=a¬r«!ì]Õè8Õ›°TD¾–À~%fMÔ¯Áô‡z'¢°¿]º$ô¢Ä”åýâûÄ1öeÄö¥ÄöoØ{250 à,½Žú@5¸Çpw7Œq‘î¬|ú)Ø×à@‘ìopŠz—Ïåw¢Kˆ|®E JµãÛC ª_=P.3üŸ«ò ¿¡5~% Ÿ¹–×·|IÃà ¿Ç1ŸlÈóç ¿{ 1hóB»]¨¹#òÅk•èÇS0ªƒ^÷;²ÇXJ…Èé èMa‡1¨VXó$œ«°#ãÞ:gÒŒ±/»&äÁþˆu×õvÚPësùWLØ,ºY¿"ÆàS J€PÍ->ªóøkP$!9ÐuÆϧñŸXDs< ~õËðØÌ÷«ÏÂc‡à3(o‘4;äw7(£àñ+~w>;Š~·tÈû9ô»ëåüXýnJà]ð0ÚóI˜oîƒ(WØO^4âÃqpñ㘮 Ý—ØS­×o±‹è¼Zÿç)¿ÊgBm¯ƒƒm£PÚ^‹«£džÀ;í<ÉÆàP[à ^„ x<{³½LaOŸ€b\ Ù{†=kÄÆ¨Qfý.pÕI7£TÉôpä0ŒáøF¡ÚˆA…YÀ(øŒp–oÁF^¾˜†£’gŒ±ŸopâÈ—F`–ß)eZàwê2mÇ«b¼à}j ž¦Ä/¿ÆéÚ£zYñ B/¡Ç »CÀ¢É~{€L4ŽÖ”;½ îgdÿ<+ûç2Rº<'1¯ÁYRtjñ´ÔSèõEá!à¹üÌ(ñ—7(ì+ø÷ô)t܉p‘¯²ç ±OGWqì˜Ï1‚©Ê/ _ÖÝ[˜Þ‡á+ºT¿zž#ý f@8@høú %~_kpÖ>•Ò.H¥‹Q¥QQQ©u}ÿÓ(¬kpù]cð|ƒs½–L½=Õ5x:ÇÚd÷õ§>ZNï?~Ž¿ êŸB“–Ôú¿Ë§ÈYœõ ßßð;IãŠa+D2²<^´;¹„&ˆÍ=kÿº¨×ˆ;Ÿ‚6ߟ/Yž[ ¿ Ç—öB9õ¯è×FÀÍÔQ¸×DùÄÏ4ÿ´cÆà 4#noþiؘ‰]}¯}¬MÃ/G "ƒº‹PwYPµ(®ñ!÷éÍ%é÷B®!¹ô¹†bùTï2%¸˜¼ùyÖmÍÑç0w†¼ï5ÖHï$Í+~õ %Ðï¢==¥5zlQŠJo¥ òkRK]òI˜uæ0õ$ä)ìôõõ¨ÖßPØ71›f¬: }‘¾5­ì8 Wá.Bœos}Ø·œ€ùl9c%§ 4…õK3¹Ÿ1šÐ˜¡¾§r™ÂÂAèš89&†– Í©dsÊ8,Ìçf ‘|‡½¨  ͨwóZuá‚4üfi9ß6á»^· 9õ‹mÕåÒ2Úú‰1øí^‰ „& ¿KÃïÇàõ”bMƒ ‡ÿ@³¿‚h…eNt) @h Þx†<òŸÈÍ"×dEsYюŸñ2ùfƒK,-—†X…†è}«^õ;Ë‘¦á/õêÞ®¥K+ã>ÏüuŽSÿ72x‹pÉ^ÑDÐ^‹1©ÉØ«ËA®^ói;·ùó|ZVÛ»³Ú¾`‚¶»Ga#™c¾4Ýi>Õ§= ŠO«ÇŸúÌΑ‰*IPE ‡ êò\Cq“Îj¨Ûýn²d8_ºÝØG ÐïÒ÷ñ÷õ£P!ljZókÏ£½g`»ñöðî+$Ä<ÿÄp袠ú¯õä¡úäЂzÞY:±„ìÈxì'é{A &l³À…Zäæô£Æ½Ð!£šGª“ °ïJ7~ S j·¤ "¨âÝ0¿w .$ ÉÅÀq©¶¨•'à TÞ Ðêê+qjh/¨óJÙ)¼æ)6´t#tÓ•0âÅ ô÷t›]ƒQl]òkðPKk*58•Õ~ÔÕ‡äåëkšŸUa/¡Éøq¾²—ýšFb¼qöl,,<ïàœ5¤Jô‘“Š% N£¼NZì=N%n¿Ë€Qå{}‘#oK˜ÐëwdÐ鸈 sX¿Ó¬»¨îR‰z¤Ê$û|L²ÕEtØî£Ð°‘ùÝrÀâ¹;ÿiðüž4œØ­âþŽоb\÷d€ ï]z?Uc(¨ÌÔÉðzÀ  PfÌ"–cä?.'¹ß'Ë”þ7¥ô¯ Óòá#9³S0ÎwŽ~\߇ ·á? ý¯Óš Õ™EÅ\ÀK3»íÑ ~D3N‚~ðG OôÇì'††ìBý ïÜ«ÑK}¿½ºvŒq™òÞ}ˆ‰š€£°0Íæƒd]p¡ 1gµY¢KsÉÔêÕlª?8Ž.®>ɪèKø,=÷\ô¹?ÍÜgKdú  ÔÓ'™bÞÍg‚^¾‹_ÈÎ@e¼’_ÈWƒûÿPKÕ9¯ø÷# PPK7Aorg/hsqldb/RoutineSchema.classW[\çÿìì» wGD-IŒ{#›bBª[‚FIATTmRvXÖ,»ëì 1M›’4½$½_4i¥´ ½˜FSYml0½Ò¦i_úзô©ùýúÔ—¾Ä í93³Ëeðƒo¾9÷s¾ÿùÎðÎü›3ZñW-ºÈ{ñaŒð’àå¸Ûð8/I£>”C÷‘TŠwi^22NøPi“ Þey1eŒñó$“Oñò[?íÓø¿>åÃÓø4ïžñâ >ãóø,¿Ž³³çx÷ é‹2¾äÃfö¸ /òî¥r|¹_a‹_-Çטôuvô ¦|“­|KÆ·e|GÆYr#=f&RzV@=Ú“6âÑ‘ì‰dl0zÀ¦· T8"OgtÑ- ¥´Q]Æ9RßCÒ{éM@éN¥t£+©e³lmóbcy©^-¥ÅuãŽü;Y÷ÜŸH%ÌÁ@÷ªT‚‡)€®tŒ\ÊqÝ´£r‚W½wi¦–LÇ혶‚« £’Tû‡FôQÍÖdÓö®œv}§(5¦¥æŒD|ÄÌFwZÊÔóFèú¡§†¸ÍK哉ÁhŸ#vl–é×MÖé7µ¡Ç{µÌAm0IEµÍt¥G3锞2ÉŒ‚ûœçeß'ØÝC ö [Á$~ÀËüËÄåÖö$²$݇} ~„WL¡S fù‘*ø1~¢à§èTð3\Pð^–ñs¯ã¢‚!Äd\Rðøºd\V0œŒ+ ®â— ÞÄ5¿âàßâÝ ®Ëx[Á¯ñ¿ÅïhxL`ír·Œ Sã(ø=‡÷ÌÒM ¿ˆ‚?bm‚ þĬ×ñŽ‚?ã]å/ëŠkm·À’Ìì~ ÓY¡Sn_Å5AÞVB A«8ë” ¥>}4cžvÚÈ“uÂs§íKeÃ-¯µVg2)°1°ü*éJ'“;ßÁ#TÑÀâöÌßÄp‘ nßÒ\)›x’ï;3íxg)ÁbY¤fÚ§TS7úñ”fŽdªv1«C-¹~YK.)]Uf™ôÚE’ºa¤è.^©fºýlZÖe|B»žÒ3V5(´’®¨šú‰1-Iª]öÑÖ—¸¬¨iS 8 ÎºÅ0!¯ëWæRN)ýÔ²ÛÂvÜXÝØ[å «Î.Ï,°J<,è$hæ²ùñWi,íªõ%n7›×¾´¢¤™‰$EèŒ4d[J€¬»$ʪ ˜±ãcYS9ºÛKè–°VÚܦœßOH "é1À¦>JiÛ {´LFOŬV4îŠG¨}o9ß-Ødún0Óùm”>mJ˜º€k2†>¤Çø;b§NCCçZiJÑ—8‚fúl…ÀV¸è+–† ø‡æ ­ebÏV2Ò±«h~·Ñï´M²É±Hÿ¥B¥šà›G•ñ°5ÌÁ-Äæpß@­þu$ôŽ8§Ó·u:[N%dJøU ‡·Â_v·|r¦|P[ðçƒë&á"Hæ‰rŸ(Ñ®)㘨»ÚVZ>&ñ>ÅDP/•u¸v4Ùcä›·M ³x.<#Mà™°«u>›~‘^ìÃEbQ†_Í™Iìö—MÀ3%ÂŽ„AÂS¬$«UfyüW¥ý$þÓÔ1…«îsOLx¯ 6ž9Ïâï†gD,ìs©v† ®³Ì¿‡w- ê€êá‰ý¢ê9‡URÝðªnéX›d÷—|¢`˜s)ç-¸è/¸èÊ»ð/vQÊïB–Õv–UlÓky¼0îSó/ø_µ¼¶½…|ëæ q!úksˆ ñ*ÚRm£°æ&6 ëdÝ•^‹0‡­–ÌÜny¿…ÃA‡ÝÎ@iYè…ÍͽýM6úé? ÇìZçR´´]dëîüði·´¶áYlGãÿPK¯ê)JdÂPK7Aorg/hsqldb/Row.class•TÛrÛT]Ç’%ÇUÒ$MC-BùR -·Ö¥mêpê\ˆÃ-<)öÁVc,W’É”wfø^àÊK˜¡3xb†‚aoIvl#§%:9{íËÚ{¯ã¿þùõ7—±3 wÒHãmþïþ¼{e¬ê¸›FklYOc›:ÞÓ±%ê8žíÛN[@¬ 讳¿bù–À©O*÷¬Ï­BËj7 »÷dÍ/ L¾\ ýç+ŽÛ(4½û­úna«g'§¤oí¶äˆÃ6Ûn[žä, é÷²œ13ãò¨%§Ni´ëvÛöoäÍø„1L3P/T%ìå´™‰ïÆöVdKú².PJ^•žÇ$méz¶ç6ÃS¶ýªï¸²˜Ù˜¬úVmoÍê¬hÜ:ªiOú¥&•䪹ì¦ÈÆqVCVí/$Û˽1bWÌL™öc{kò3Ç}¨ÒL·S·|¹\«Å’ÓmûaìA#æã1´Õ$]ËDAó"³j®rͤí­Ë}âÙ´¼>Ï)Û»+e§ÜîÕ5ö†®ÜñHÛÞ‘í%>ºiõ`¨KæÍwåJ/c¾×éî:œš¸oI«ÅÊHb´–ÌF×ït‰/ÝO­¥äÉQàv(Ä J1¹ïÚþÿHLÜJOæ:èÔ²w §Ý¨8Î^·dÑäý®ÕòXœ1ò¥§h)M~¦1cà)\50‹S¦pRǶ÷Áº~<¤;â#&u|l Ó£%cVS²jMYïyÌŽKóß)­‘¦/p'VƒUŠ;™ÇºjV›DPçUÆ=Ó2l.nÅxž~òÒ A¥I øFHßež,*ϕγä7‡Óô§Û ‚ÎdöGˆ‚0A[8ÁÏ …Γٟ‘Èæ¡dó‡PEŽ x:&æáè³\¦,I:3ù¬ò ’ ~‡¶~‰J^SÔ?Ép° æ”Ÿ  ]ýªrä?t¡üÏêXœ¼ÅUž£~ôÜg‚={„Îã…qЋ¸AS×DP…±‹XÅÔfŽO™9&e¹þhýѤ¾à|>G›ax†`šÀÄ—Óæö´z®—ðRä:KSämhÙÅC¤z, ÿ%ßgñò1Ø+Ç4}W°Äöê1q¯_Íëxcô&®@bº6*âú(Ç~ooáFŒ0•žÀoâÖ8.7éÁAÊ t¥ªÐÎ8êJ.ûIõ ÷´op1Gª¦*\é!æÃ[Šwùu_ÖÂÖ¡êK$hº®ô…4‰Eã°¯Âvð/PK¹=QhÉýPK7Aorg/hsqldb/RowAVL.classSKOa=_™2} Oy¿écj•‡]ÛŠ`H‡ö –ÎL„îño¸pÓ-(¨ KMü!®Mte õ~ÃPŠ$M¾×=÷œ{Ï~=üx`“ÔâŠ5¸ e ˆk” À‹°xŽøé1U¼Åü¸Ž¸¸Þ1$c˜AÉϘúªfÒF–3´' s9þÜz™Ë.Åõ|–oÄE`j>9ÎP=¡çuûƒª„=Õ–rüfññÅäŠöJ‹ç´ürüñÒ ÏØãáyé¡ÃýäâY‰Jä7-ݲã3G;ÏÛs¶ar‡:hq;Í×EÃ`è¢y5s¶–y‘ÒÖœ2È2y™¨œB»B‰ðy>’o¸èÑÐÙØsizÞâ¦ËÒ”ÉqÍL•ã ŽªB¢Úê,Ïq›P²É-Ñ(l›FAA=ÜĈ‚f´È¸¥`·ZÏRwÔá’‚»biC»‚^ôÈS0Ž Ýèa¨¯ ˜5Ö)“¡öôƒoͰt[7ò lš¡ÿÿö3Ô‘}S™ ·,Ã|Ä ÔeG(¼ø¯S ±’O§ &Yg‚Þ¼CwE,§/Åoi𖹉®Ò¨WùªafyÆ0³$Æè£@-ýƒè"| S’0’îtkDý9U÷Á¶\&ÐCa¯"]¯wቴI{¨:Ó0\ðq ðXô$†ƒÉÈ'x"û¨Þ%…ÈiiTj–:ߢ=vñÅvàKoJ¬Xú¶í0^¦µžCt2­ì:鑆çÊ Ñ.Šn”©ŽMVzƒ J$©b駺U¦ðÃó^bt8$"=L»G´ý‚  Há‹Rz2z’+Á£Htî*«ª¤)ÑÞé²{ð§Ž;HÇ„6õ¡ÆD3[®-ôi¹™#®`›st>£.º‡€#Z,ýØ>]²J®£‡Þ²±§;V)]¥t·å¿Ó½nz_¹€€“ùö—C÷©2Á<ðAéÙ{2dŠc ÙM9%ªŒ+–¾ÿ%TOB ÀPKþ‡ÃÛü¥PK8Aorg/hsqldb/RowAVLDisk.class•ViWç~F3Ò1¬Ç€q€¤±‰(vjÚÛ±ƒI#6®Sc§É Å1£Ì Á¤{ëîû^Ó4iÝ….nk·€C{NšO>§ýýÐÐæcŽOȽ3£,bŠïÌ{—çîWú×»{À¬ÇG.†ÝÐëè¸ÄGžF=.c–/~›ã73 E/Å ÀfŠSóüö2óXô _ùx…O0þ'ëñ)|ZÆgØâg™ü¹(>Ãp5F_dö—õËõø ¾Ê*_«#À¯óõ||“o±ð·ùøŽŒï ˆŒ¿01>)@H h¶LÇÕL÷œV˜×Å úP︖­åõIã]@ݬ®‡­yÓ3œ´™Ñç,{‘ô§HTËfuÇ ØaÃÓ4ÎhÎ ÍÕ†g43¯ç4aÌÊéN™9l˜†{TÀD|Ô²ó©ç¥Bn:uV›.èOkŽ>taô²ö²–*|j|ú²žu‡ª‹ºíŽ›šðŸºéN’ÓúPÿ9Ò0™pdäjªm-Vꌵ6‹ónÚtuû’–õa&]-;›ÑŠž*ÕAÆ÷d|_Æ(#W²zÑ5({2~( c[Œ3LG·Ý1Ï©îxº¿ZÔ0sú•óŽŸ¢„Úº–óü¹d Øß©³MŽînΰgzË|1§¹úñê2Iä±󺻉NiŸžÀã¨1[ÔØ ~ŒŸ(¸†%?ÅIP©å¼Š“öl×´' g–ýLÁkx¦CÁÏñº‚_ຂ_âW ~ß(X†¡`?Tñ1… 2~«àwø½€ö*l º ú;Ÿb—¬{z¸’=YnZPpTp§ü fWnʸÅ1üEAš‚¿bEÁ*ÖÜÆ3 ÞÀ³ ^Ä4È=Ö´ÕêQ}÷ŸFjñí2E™÷òNjéñòÜù ä"GòÁøÑ4Ra¢EË1| ®2¯×° ynm²Œ÷S›ÌTº£…èm Åœ°9Í^ôwYçû-²°9¦_áï×ü]ÛŽ=¹9læç̳‹E»Îxÿ…ja—É)f’t”÷#·ˆo'Ö_#s”ŠÍ×ì»ÿò ì’_Fjnša-;£çä©þûŠPøU"ºm[vj„OÊ©MÅ1æôàº?ž®ò}Òµ 3?Ô_E:ˆ—Ú‡°›Ê‹Ü²O鋔®-)ô‹ã5Ãs·i¯Èï`Q'oÅð_4k‚*îÞ¾†uÞ–òK‘¸gÛ¢’oQOsÄÌ•@¸ÓÑK¿|âôã,ŠôC¡Ò-„$´ÃÀyÏc¼M¼ûþ€~ ¸?á=C¼%éÙE1Hç‡è¶aHLUÉÛÔ5„TU•¦V!Ò¿´Šð-„•>L ¬´„}SMo!ÂzÉuÈí¡(¿Õñ[,±†ú£êß¡œW“âm4¬¢Q]Aã!I ·‡»¯£§Cò¹íaÝÔ!­ ét5,,oü[M’tóZÖÑ"¼ny^«¦­žî ¡×È åK©cA3ÇŒ…¤žŸ·’º¥Î(iÕ6ê_L«yK3tSEʪIòàD \4UËAjT UÌz"-‘î 2 uc–’žVò¶}󼪕RR”%ªö®ûJS÷uŧé¦Z°Rv‚·D’Ý¥ºšžQœwxbˆLדт6§–<…êâ<š0Ïžªäœ‰D*&jdÞ*Ï5\`¡ YÿC…WŽœ+ö§™â´€fR^ü‘njØuqQ¢q>ŸQ,õpi« ?iÕ“×etRO:ä±Ò–çé(#Ôðü&à@µš9¬Î…%žg3©{—zÍTÕü‚4[våÞO9eõˆÁy Oâ) [±MÂt14Uè Aðª„×pTÂNtJxoˆ¸(áM¼%ám¼#ᨠޕð.KxHøŸ¶séð1æjÕåî|"áS|&á _>Ç^_ps_Jø ý¾Æ7¾Åw¾Çe†Í%PTAÂèÓÌY§Õ×ñ(4;0*wr¤8’Õw|†ÚC¬Ê\V™±Î{+Õ2ëÖ’Š?@¥Ì¦æøÀœ1uj°Z+»ÀÐ\‰îtS¯‘›ŸÓÇ—ò|lÛø¼—ÈZœœàL©-¨JÆIV9º ¿,¬B¸nëqùnølùWþ c¿"PT‰¯¡†a"?ÕòSPŽË+Ý@x ’u²Ÿ mpW¶ý¥˜éCܵÐNü´7ȱh‰òz•G‘pƒØ@ª>Úk8xçôn<æò¯¸§È¡º¡è旅 õ ü Ó±Á·yшa ÃÅKì—e jrÂéU4F¯‘°}dªýöÎèãbAàoþE<ö‰L϶ëÝ$E }_t nFÓ¤|Í«h!c-)aÐ"tü€¶øNk|­©K[þçÏëECuðÝF±‡ý…">Mþ8fbnå¶ÉíBæ6{X©xŒ 1ç°×àüžÁ¾JémñÒÛƒý.¿Ùå×Få5lòáGW⺻É6—èŠR<Á5lö!*óîXAÛÚý Ð;¨þbÏmdz8´Î~{IOÆ—_O;£Ýç÷,÷y./@ÖÍ‹SºÑƒ~G+¨7zêÏWd=v²2zÐCÀ`‘ïôe¼•&Çã­¬èùp‘×åòêxƒþQX†`Çï4B¾ð!.‘ºKšF0ZÂó•Yz¡˜þ­n¡ö«¨•™;aŽ?XøPKñ»bSœç PK8A org/hsqldb/RowAVLDiskLarge.classTÙRA=&™ ¢B(àBVGQP ‹,*" U¾ ¡Ã2gŸù?ÀŸ­b)´Šð+|ð+xoO(VR0]ÓéîsúÞsO÷äÇÉ·#=X ¢ë â&nÕâ*n‹Ñ1ê ‚¨ŒX~ÄÅJ¢IÜ#U`÷õ¾˜öñ¯WFŸŒG ¾ÝÐ!†\$cZõý~myI×–Öø¨fóÔbfEû ©kšQPg–VxÞI•‹Ü²uÛQs¥_n8sŽiñTtA3—9Ã`•Èå«–¹©›ê¬¹™6ŠNÚp¸õVË—ÂÔÍ9Z~uZ+º[]áe<‘ÑÏx¶•çEG7 [FŠ!hs'Ë7³”ØfèŽ\Lª‚F„D7@q bHÁ0ž*Á¨‚1ŒSFÏ0ÊÐYP7–ù–*r,dÆu{5£Y.â%Ð*¦“¡è¤ˆ§L|-Ô7Ѭ5À‹'’`_]Ž`\ƒÇe|‚°‹ÀK¢†a’yÅÈ߇<ûÿëX¢æµ{Ävè—¤>oÈÛþ-R y]8Ø"í"Ø/íxÙ—ÓŸ±±•}Ôâ’‡âÕu4S†ç½ðÉh‘–ÑÊd´1à]h'\"Þuzo ã¬ž7ðRㇸÌp4XÒE²®œÉÊJ}RHjûŒ¶¤ …$ &IRvG"E¿þ ¨ƒçínÖcÊ„ßPKÐsÊ‚ÓPK8Aorg/hsqldb/RowAction.class¥W{|ÛU?¿æ÷Júk›>Òö×µ¬Ýë~IÖm@ [»"…µÃ®0ÆDÉ’kXš„$ÝQT@T|Nt㱉²ÙdÍ (ÂÊ÷ (*¢(ˆÏâ\=çÞûKÓ×Àû,çÞß½çžÇ÷žsîéó'{VÀ?5ø¤$ø”n…OÓì3œ}–fŸóÀB¸Í³Û‰Üá†ÏÚ1òÜ _¤Ù—èÄ^ší#r}ÞM³{ˆÜK¢ö»QÔ"_&r‘ûˆÜ®ÃW<ðU¸Ÿ„ô@¾Fä"ÿ:Œjðó "“Ôûˆ rˆÈa"LôaôM"ÐçÒ~„È‘‘‡‰%ò¨rÃÿGç¿EKipÌçÂmD¾Mäq {‚fOêð¿Kä) ”\dk– ~}*³­c({m"¶µcÖº"Y{%2ds© 2,*eHÛ™l<›ë¸„v2·‘¸Ý=l§2»R;%ð–Á’–IíìI ]$Ïö1fü¼B‚Š‘t,’³ck£¹x*9Í"<Í×QFU$ëMfíLÎah/åÝhg³Ä9»GÓmZ2—¹;³¹¶uvÂÎÙŽ¶ÁÿCÛ–Þ9õUlÌE¢Ûû"ivcZuØW;Š—¼£b¡ÑTÏ‹'ã¹Õ¬ù¬íšEÖe˜í³ÛL{Ú6;7¸;@¹Ú—ôJ°tVusºI1]~Éô£&:dG·—^@–©Â-wl$ˆG1f$hŸnâÜ÷Zžµsk³¦³êî"×Zfw›!Eûn&¨?µ!Í,Â/[áÆ^OFEíÑNE:c§#»;5<ÏIÐ0«ZâT£§fAŒÝq¡© ñçBé6$¹FbŠF’޶Ð;Æ@"¾µcC&fgìØ…‘ìÐF;·rÉ|Oƒ§1QѤ4éC?P‡_ºŠß—¤ø•`J«YñIf ¤‰­ÒœSψϹ0ç8 Û™mö@‘µ}vÖ—Ý«Á3ˆ?;=˜ŒÛÙ\d/FCìHl.­,Èj‡"Ùî‘LëXIºÕ3i=»ÒqD¥¸ž%Is—³³ÑL|ëŒ,Þßúk";"‰Hr[ÇÆ\&žÜ†9pL‚ºÙ° .GÏ 8}¼ÞgÀ8ÈÄá_KÀUàoþV‹­oG>Ó½g|ȳ¦ûa¤ž«™÷(4?)bG úÐR€Óö‡ÏæÓ€×ÞºI:$˜;æ¥ãPÀ¯¶GaÁ^Î:×Ù¢ñåÂøà1X¸Ù¯…Euèk[î¬ÁšŒ¯F¨òIƒ+½Úb³M—æ{=ním¨Gôðà¾ÌуG¯EwГG­~fôAXNXé žÌ „JÇ Å5J[òès–Öñ%å„%:Þön½eǧz{=óVŸá­<þ^p×qoÔ, Gqýp•ð²R„P™kT„W¶Š½Å˜q.ç±Dà ƟAhø‘ÔaÆõ‰ Ã~EZ„GèP#Ï©æÒœ’ŠQL'lq¢S…’EµüGát¾/Qß!öÃ(L\JçuËM’œa¹Æ`1‘v&˜fKˆ¸éÓr’›!çlaÙ.bþTì4“£NÑ ×Àv!bƉX`õa]kò„ꀸI=€¸ûñ«¡/0>ñúá"þn(;e¿E%`XˆÊ (*gƒVŸkµ¶ÆÖà™JqTNãê<4xմࢮáŠÎvÝc-“—o€üQ¹¬–q-Y¼øu¨Po·Öû™V¬~¼ÊiT€"â¬a½|âUפL¸¸Cz„­¡ Ócõ»B2Eø|Jf‘!9±ÌÍ÷ùd\vk´ææ›,¨ƒãÇ}ò4rÁ¬UPᵯoe¨ÐƒO¡•NÙÝ©â$ˆ¢5)»Bº+ä¶ú}ú^9ÀMBw“¤xigQñ+¬(²{œË!wz¨TîcYÇâÙgâèß+RÉ3,SóPK+õêž{™ ³SuTÜçÃb‚ÈÖ«õòž»…©“Þ.…ª“àY^#M@9^/ jÕ ‡È²„ypšÇW©éÕU²§| ]ÀH1:׈è<½u8.%»ÊE@-u‚äµY´‘IèÂã(È;§‚*Ë!…?X¡}E8†vXŸ.çȰºÖÄk—OÞË3ÉÄ¥ŠWÜ)yXâà×:y€Ö«ù9Ê Ã›|Ê$b>(7ÖH'A¥‘*4OusC…Œ®ì(FæÕ"2/t­¶¨N"(,4iF—\_̤yl '5lBÊWˆ6°>fâ©éù¥PqmÖ+±xâŸqÅ·¹¬ø6×>$*Éîb1ªÅH¥:Të«ëŠå! e¬<ô¸Vcr9°-'š™Õ«òÐH+8zE®éìÛAëéæéõ€ìmÕ 4èƒp½Px¥À¨K D 4a÷²€Öºç.h4eQ›L+^½)S‰*ç™i‘åBeËQÕ‡àÃBÕ‹è¹Ç{­°"…U)¬Qåïé¦Âõš4AO«Mí8œajXŒ°p˜ê8T˜Êæ°Æ«45ê¾L%¬CX1•ñ‰'ˆëŸ.ú—–ÑܹÕz–å¡Þ*Àò Ú"Ð'ð¹ˆÕôt‰ÿ§|¬ô„4µ=üˆs»RêÓñäKV¿–¥°bÍ/À™!Öˆ©ûÁÃ[ ù°OÅjâö©Æ™59ì iAQŽ[x ½ÜrH˳΂: ¿|£‡…¦ÂÁi¢Ûn+aÌSÃT°n†'¤ýNŸÊañ— â¿…ÎÈ )AEæ¨`Ë»ÛÙ³6MÞo;TLÀi”yƒr)$P®œ€&ÉSS¡¿ +88…qpÊQ­†"^Àg€ Üæ`a´ÂªÏ*µcñ)옮 ìä#>e/®"³.¡äýZ -'¡¿ôPÑp¦ªMÐCÂsGb¥«_­{^•»É7ÏãÕÜ•¾yš*{¨½±ØŸ¬ýI+ëOèê*ýNk=Ù—¼Q¢ºøŽQCyÜ,…D!nÅëÄVÛ¢ãx :1ÂÏÁçÛ:DK“ â‹ùÇá!ãѬÝr ÎÝ|Â}X“-jþ¨¸`¥·µçmoת) X;¨ÓÀMçˤ/'ÙçñÚ^ðfèd<o”ɨ9¿k69y|+þm»vÒT/ÕsŸ ·ÿ }ø`ÿPK©!Ñ„G ƒPK7Aorg/hsqldb/RowActionBase.classuRkSÓP=·¯ô‘R”‡ "Š}(U| ¢m Z­íL)ý ˜´½Å4©Mðñ³œ1ãŒüþ(ÇÝ4a”d²'çÜݽw÷î¯ß?~XG9‰4î% â>› <Ä#þóÌc6OØl°Ùdó”Í–‚g ž ¤J•VµQ߯7Ꚁ( ¤+–i;ºé´uãX†iè»Uë»Z³Å¢8·µšÖÒX LŸ÷wªõR—Â3§’Â"I­©í°P}¥òR«¼f-v¢mk彬)S~vjÖè xh0zbÓúTê:}Ë,ë¶ÜPliÛDé A·Ý±JÝsoõ’j ©¯HíZƒAß ¨çËP Lô¤!Y±CFò~K%Œ,ýŽÞ}/ŽäPÉg9ÔÍr6Žæ²„ÞUb›}³ïl „³¹6e®X=J4—ýßË쑲¥S²Çu ,eÏ.8×V±†¢Š«XQq%×p]Å,«Xå¿,r*òl lnâí~VJÉ#ý£^4¨’b£s$»Ôò©OŠe®4]Ì9ÌcIž Oø4ñ™?OüB€ÏŸ ðyzü"ñÅ_"~)À/“¥Zyz¹ R<\õ‘ã!uÂü©%<¸ôQ3)óm¯.ºlÐüwˆ¯?k¸ã/¯;Ìòr¾à"”_tξ!â"ú7`wý€=rVÙ%æ"Æâ8Â(…0*.ưŸ*î"Θp‘`LºH2¦\¤ü-þPK+8I!PK8A"org/hsqldb/RowDiskDataChange.class­VùWWþ F”ºÐ%$`ZÛZ«†jÚŠÔÆ Œ “˜™ˆØÅ¶voí¾Q»ÛÖ.¶uX´õø“=§ÿQ{Ž¥÷Í$̤ÚszNòÞ»ËÜ{ß÷î½ïýñ÷¥+ÖáW;šñ˜ NDøjŸ ¢6 a˜ódûíÁ¨€˜6°á âƒÂÅ I;ªpˆ)¾Rí´Ò8™æÃanŽôÇq„ŽÚ°ÛQ‡'øð$g?Ňcv2ý4žá‚gùp\ÀsžçŸ¼`96;;kG^ä†_ð²€Wùº‚‘î®p¤§kW¤³/ÄÀ •¾„¢j’¢õKñ´l¡‚¡*_5ÐÁ¹ŒÁ‘ãözÛƒþ,¿„¡&ÇûvøCÞH§7äç" CõÂOr+Ãâœ$Žôuwx{uA)ƒMJ¥¤‰Þ‰¤ÌP7L¤F<£ê¡øpÔ£OõpIC…&¥Fd­WŠÆI±:_O瑊=–4¹CÒ$ r0x@:,yâ’2â銇4R _"’’ %ƒ„HÙæ˜Ó¶0DVÛ%Un3±”¯˜”SjLÕ<ÝÆ,+ZXK¤ä¶Â›û¬¾Ä0m`ç_aYUc ¥ðÝ>7•%<=‰ñ€’LkE“Sû¥!ÃteX“†ÒÆôOõ4xUÀkNP2<þ#CrR#?ª€×JÇS1Bq:Mt¥µ<ØHYJ~èúò ®u6›‚]=§Gx§Çr+)èU*?˼­-ߨ”ºÐÙR§‰/®X­šx+u¸°‚õÈR<;úvLq–oŠgÓÃâlî± oˆØ„6¾z“ÐñÞðŽˆwñžˆ÷ñ Î|€a-SF| âCLR̋ډ¸,)">ÂI‹ø„ã{BħøLÄfnheÑ“o)RjBÄç8)b ¶Šøa_"$â¾ñ5¾pZÄ·øŽß3¬*¾çœµpFÄøIÄÏq{EœÃy0%bN^äÃ/tb¦¥ÊÐPÀ÷æ*\Ä .qä.‹Ø€ +òt)šŽ˜z³o”’º ±·?È5è¬ k‡a‰Yñ0¬¹yõP·Ð…d®¹*aèþOÄ‹˜¼Õ/§—¢úÆjó¿éȲ©ìjLØ¼Ž†Få1)$)Òˆœ¢SZÐòedB Œr«+¦E¡Ìoм›ÝX&œf³F.FÒЯ(½ðöPQݨH %â<­TZ¦diعÕYì1oSú§éxœó%®',uL½CvRÃ&U£’:Ÿ›Ãt›RP¥šÉRóSehº…FCw îÈß½KÒn+º~ž¢bâ›di<õìÔQê“Iy8H‰ÚfôÊšðÎ`ÄÛÓãˆxƒÁHï@·?L•Zèe®¬Ûr;0PlpþKÀ¦Y€Ëu¯še“Ñk ชäFc÷%ÒŠ¦gÅv6øeTìá1»<ŠÈíëÍ”@g¯»¿‡¡±ð‹ÎôXTNeý,/†ŒÕôHk¦·õpÁMϯþ®B+ÑkóhÑwçÑ÷½.¾—èûòèû‰^ŸG?@ÏDj²ü…Ç/,}¦[EŸéÆÐ#`Ô‹½4¶Õ+Ji®r¹[Z/‚¹ê­Ó(9㉸ >²ÉõN¡L×Ó\\Íâj™‚u ¥n×Ê„uW!ðE_dPN8YN¤-û$Ö»Z‰Q2…Šˆ%t§T¶^EÕ&k½5ƒE“¨p±i8NCtqÆb}]Éyúà8§ÇÒAc#¬³Ø‹R~ Ø.`‡€ðÊKlx˜¿:IõúÊnñ8…n¥9êrgPMqÔLb·ÛE‹%S¨ÁR h]y ²1†Ü-WZ8‹±,+ƒû*ê:‰vüNqŸG} §QÁwäÈ`¹{+\–iÔ̺–ëèø¯ëOónìÌ´˜fÆßÁÜÇÙ,Ô=›ˆ9q/ú²âj:‘šË\êÇ.3yeN¾frGN¾ƒYù£tÎ./ßvÈíšAc ¶­mÔqá8ep›1­Ì`Õ>.w\C•.'TVïÛÒxf Øul%(¨øÉþÞ¬§&º÷eÖß°fÀrMçq{õqgøî2BÃ?PKq<«–C› PK7Aorg/hsqldb/Scanner.class½< xTÕÕçÞ73ofò’¼™d’I`Â"aD* $’ Á I¤2Àh2ÁL¢ ÖÚZmíâRk¨–ˆË¸Ð,-ÖÚÍV­ÕnÚÖj÷Zín[¶üçÜ·Îdé×ÿÿ…9ï.çž{ιçœ{î}Ÿ=ýÅ'à]RžþÂdv8ðÀŸÙµvÉl·\ì:ª\Oà™½Ç ^v#UÞëEp•ÞGàý>à…;Ø*í%ðA"p3‘¾ÅƒàÃTý½•ÀG©ícTú8•>A¥Û¨t;;ÜIà“Dù.Ÿ"î&¼Aûdöij¹Ç •ì^jù ýÔ6$³û¼° –û©ô õ!jKQõa¤ýǨtÀg%€ñq*}ÎË>ÏшÃޏÙãôW‘Oîà ¸_æ(/$ –"ŦQ[ JÌK©¤R•Ê L'”^âTš)óY^8Àg{kŽ—ŸÅçzá^‰ðyÂæ¨"ü^¾WËül/|–/¢Ê»d~õ,&p.q¡Ò?Ÿïñß×îåKù2³œÚk­Væxá ~¡'¬#°‚@=ö•hÖFbg%U/’ù*/<ÍÉ¼É ß⫉ÒÅÔÓL` U[¼Z½H}-1q ®_GmmÚ©­ñØkTº”¸XOë¨ún2ß@ÏD­@›_F꺜¸¹ÂÍ7¹ùf7ºù7ßêæ]Ô#°MæÛÉÐ¥Þä;ÐDxœš¯”ùU2ïfàNîŒmG»“ øÆzΞîþ8ƒ‚ÍWF¯‰VwGÛ«Ûúûâ‰íËx¯Ýï%wF·ÆäŠJUÚbý f6÷öm¯Þ‘¼º»kKuw|Kuk_W¬/ÖÕ”è_Mî@¤àÁn¶)ò·ôõÅýk{“ñþxo‚k¹ú{¯Š%¬6gw¼'Žs:E;‘²ÍÝNmH*èî®Kt­èííŽEuÉK£ÝÈ8ÛÀ pG4Ùқйßí‹ö÷ö1ȉõv[³x»ã‰XË@Ï–vÉØUßÛ…ã=Ñ]k‰f—Æus,±½¢oÝí[1°m¡‹Êú>ÔVB™ª©Çκ¾¾èn ƒT»ewÌÌ7®` RKë@ÿÎ~œ'íaΤ³ ‹+Mвã"żxI_5õ­ –„>³©Í ©µmë‹n¥n[›ÒíµÇ{bí»w¢Ší|ôcS²š:pR×òx"Þ_Ë@ªœw)‡®±Ê‰KMÝξX’LÇ+žmý8 ƒiXlɾrîäÖh¢%¶ ‡ä"öÖ«ÖDw¶G·tc—L]‰.DÚëo×Ì¢°r^6Ãðl§É4¥J3T "šÀ(M“FYç$}Xë–+c[ɼs£!ÚÕF•¤OŸ¦¨\Äl¶™—jLh-³jîfÑQÙDÚ“©?Ú‡Ê(ªljÊ*†‹¬°®_‚¨¤¥ñD´o·¡šeUl—.WI&ÂúxÿŽKzia 3û´Ésµf]£¸…#?iM6¾´m|Y¥]IIôÃX5¢àÒ )ÜÚ›¸&Ö×ß‘ˆoEcÒgáW¡U±6-~5uäo‹“*³ZÛÿF;c ±md§š½Ssu´Þf'v°$ÞßÖî±-¾+–ÄD ã% °0Ñ¿ã ]›‰®˜W m¤¼Â–Åê㾉û>nùº2m©Œêõ½==8°.Ù” ˆdëΣîõö œL7+ÁEtéXŸ!žf_Ge=éÚCíºï#%‹ßµ}½;qⱤá…衺=5é1D3úŠlFoGA³”±k„³/ζVYœCO²?Ú³“œ‹Ü ˜m¸×ëŠ#š$®IŽ6 !1¨>óYô rp¬Á4ƒÆ,ãßAȬáÁgW—îq3+߉ÒjÜþeÞ“¡í¶øö„nÓFÓJ=pã~˜†I¦‘¤­Uó¤ö^Ã:êÏH. {‚TZó2™'0]“y¯}-J0XtfŠ×еµQAÓ,1«´ºý¸DÖº\ž¦»¶X’v+ѽ E^v&Â5´7M¶^2GÓºZK“–oí›Â YW"sWQà4Œ+L†·LŸz³G›yæ%;­<ÓMF&¦°\…McÅ ü þ­Àq8¡ÀI¼ŸÍRà–gˆ%QÉA` (|€J@%Xe«Y¯¡ê%Ô{-•°… ß…Dùn×ñë~+Pø{°ƒUó‘q°˜T³³§XK…¿—ßD<¿Oa‹hÄ»ØÙ ?«Âà2IÄ'õV)ìÖB‹%w4¶Õ×­mTØrV£°Z$É–V¶Vá·‘¤·¸UÀï$ðIªÞE¹¨4XÁêP{a…5#Ÿâwã||PáûøÝ2ÿ´Âïá÷ÒÌŸÁ`Ú¾®£QáûùÌïSØ3üz‡Âïç`Ƴ²®¹ 9y@Ä–Žæf…?HS>ÄS ˜À#<%óGþ?¨ðÏ ™NáŸç‡d~XáGøã fd:áÊÞ¾žhã®­±äÿ ? '0ö[h¶®a"?¢ðQ>¦ð/ð/b xH`®ÂöÜO{¢Ý´Å2?¦ð'ø—þ$CÇÑ_æO)ü+ü«2ÿšÂ¿Î¿¡ð§ù7v1)‡‡«iI*ðOx[áßâÏ(l éÙIܰø»•ø›‡?4Vƒ?ty6G/]Šú]€•嵨{9j©@-7Ü€…jü-ù³ Ž­ž?/óï(üþ¢Â¿K•ï)üûTùÿ¡‚ÔÈ_3#Â_¢5~NŽ<®$]GKû#ZŽ“òB¥WP þS*½Jd™¿¦ðŸñŸS¥*¶¶ ÿYí/ù¯dþk…ÿ†ÿVá¯óß),Ÿ<ÐGÀNÅòhò ¬Jæo(üM>–9²l|äK¿WøÕ¶¸í;úz¯¥,Xa1ôÖEžýGþ'…mfQŒ` ÿ3ï‘ù_þWþÑø›ÂÿÎrþþ'Œ¯“nƒ„úO…¿M¡åIÿ"-ü›øW©ú:?®ð´¶3'ÝÁÖô&úw1³&Ej‹aŒï2¦<©ðS¼Gá§iŽ'ø¸"V%†¾.qIRX9®’䜊äBI%™¼³u(ìR¶^‘ÜÆÕËØå {7[Ï |ÊÍUaW°M!Úp»LàÊI^)G¿R—.¸ R@´U¾€ŒoáB*-@PVàoðwþA˜¡w:÷*’‚F$åRàq‘¾üö]K›:ÍŽ´ ˆÎMÙB¬µ!c¦šõ€‘>*scÄ3Ödû F¨Ê"Äç zººõã­§ß:åÄ“ zRÛ'jk¢ÝÛ0Åðüå݆©¡yºƒŒšWÔôÄÇŸ-Crw™§'Or`KRHÇ—zAÍÜ©q“]È葽^Kû+!hG5*aÚãHƯÃ/µÄû5[œ‰cV¿S""‰³©L'SAAŽc&¿«ué¦I§œbFÜβ¤9MâŒæîï5„·y¬™ ‘:vbj]MÆ´<åTÑžž/´¿xÊÀüÖjõBkºlÍÅš¯N@T|éh¢ÍO6ÇúSÄÆ:HÕg=U昭} ñ픤i¶;Ðï®nîÝòÆ–‹š›ÚV™ mëEgUNlÍ~„]= î§ÒŽuºÁ—>«U¿/@]7Oh¤¤¾í’æM+Z[›ëZ0ØfY~ U?¥¨;¢É¦¾¾Øöî(èút M-í5®ÃØ2e®¬c·t¬i\ׄ‹ê¥ZCkÇŠæFd:3¤ü-´¥7qql÷µ½}]M t®ÏbWdx¾îÞ-kè¦ngw܈6=§o§…tãI1I ó$§b$U:!þI\¨|dIŒ.ªL»`Ð' ‡%¹µ[!àŠ¦‹P?xÄ´›{Éü=‚­œ•—ÕÚ††QP¹Ú>5.›˜Y „ÕÚv'ûc=4‰ugU¢O’‘Ø¡IÍHéÆMgV6­nÊÒ—UHÒÐ; .ž²ÊÒÎ TµKÚ{IŒEœ*Hpº‘²¦‰®5“¦q“ìÆI-nÈ–.˜E‡.•2šf£„YLÃÂÉBSŸ¬ˆçÉRmž\n­zEöy-º—Ûï7.S'îP¨0”ɵЛŒ®~UݺŒ[ÖìbåÒ}ô­;b=¸äèõ–(]`ðœä²†®m~‰Áw],‰YD:Vné°hf÷d%ñ„qG9ÍVë.­kÞ´²©±¹aS}kCc%mé*&oÛjÆc4°mqºJÅ­µMÄ›|-Ø®yæà˜ÕU2®zŠ3xmÐ/’1Bhw¥1-ûV½š¶Ìº 5Ò^³3˜&̪֎u›Ú[7­ijéhÇp:ãù(Ø‹öµ÷jôV¢Môö%³e‡ iÝù:VË,qÕ:å0Ú´*Wkû‘}ZóânRyÚë[[h|“6>?–èJW¼ÚÛÅÐo¿±GUõe¬Ï\¢°ºiÃ;¯‚S¬ã1»¡Üfµ˜Ùoç¼™,5I‡4“ ›­ÙJ¢·ª©W_‚N¤Ýñd̺“r%bÛÅßYÙ6òlÉ`®yõ£É´áŒ¯{t“ܾg,=2m¥±!]¥"Ô4ÔMbo ô $è²JwßE•MÙn¬¦u:ºÍ•¥hú MpMt—ýUTÀŸá/0 ÿàaE”ð<"žÿÐëx¯9ÿÿÏãpB«Ò»‹õ…Î ‡ƒÐbÐ »ZÀêHE¨; Ÿ^2Î`ÙÌÒ¸ät¥«ãTê]¤e¸œü ÀÙíKàÅò"sý®§à® qrš˜ƒëw–iÝÎ „IÂ\uî¸Rã¯Æ1¨$OSF`ž4 áa¨°‘±Þ RN^¸é:YŸw³n7+KÕ³ïƒüRõüûÁ³^LÁ¹¥êu€GU—¥`^©½ÚIAy©ºÁh÷•ªu¢ý™ʹ¬ÔÐ .þGÁñSÊz}¶…Â4Qžõ–4û —~7+•Ð!ËIèùi–;Ë‹M‚¿Ç&ú(åëÒrGTîDjŽÍÄ€÷ö5ošqjˆôXB úË­A)XpŒA¡ñ¡¬ü” B^À!ﺭVªIAayÀqÛæÛjIÛå#°ÀQc#6~cÙ¾¬4‚Ù›-1à9 *cèç,0#ï8¨JŠK7ùºàQ#*ƒ…jhª›)ÀžýŽöòSÂ@ÌEø{×Þ18ÅšÙ ÒIðÊ,’_„-Kþ³…[Ÿ±p‹',Üyì|àsúÂ=$Õ#YWngö•k6Vήl¨ÇÖ³‡Ð%†öŠ•EC?åÜõ¢)+¶ÅúˆµXi8D"b RîSàÓWFñ¿B ³Ôˆ#lÅrã“6 eÎX"Õè‘“BÆyµå÷±¨7¸Z‘ªeåe]#p~¹ÕK³E(AZ›Îhgš0Z?²;;8„ËŽT1æ,¥¡5©ñ÷ÙÆË]d¥ GRÄ)E\6Rêü!Ș^uM2Þqªn\(gÀqV"íáŒÖOÈäYøàÙù¸rw9ºä»nЏö8Yj|WÒ=$,Âp©ê (’V¸üËn¼Q«:¨i–£-§Nße­Ö{´ÑOÛ¸ÃúÊaÌ«ÍÚEðʪ5 ÃJ«¶z.²j¡ah²jÅ>©uHgkVÛŒª$åmØ ³z:ª04vàX¡El0‘]<:ðy±eQVó°Ü3õ_‡Øwèi oêwÖTت«Ð¶šBƒ)Ø&¦rl¦ ä¬!Lþ­êÌ!¨è¦9 ×`hÎ$* 23píšíÝ-¶nò…›i/‚«pûZsÕ–SÒã-§¤Çq8Ý‹ÖÛF†‡ 2­wÍzšÄߢËä“p¾âf\¢kZ-ëÞ“PÅ‚3OÂ"tè“àÁ‡ï$T³°ÂX†±°7´¸ÃŽXI¼f-Æ.ˆ¼lBª³å&á碗¯Ý§±‚ÅKt®xº ök˵­u5"Qs;0 `éçQ´n”H"`=¯/£Ò0ë=m#ÐNó”k;ö´AxKgZí"š2²p`ä~E³%xYDL4ñ—Ä_ þ¨§è( °MoOèíýÔîï0·KáBé¦Ò×èõZÆ‹%̨fJýöqïã:³ŒÛ9n£}œ@÷oœ0Žá(é šRŽ®ÞËl7òsOB1“è”V‰?þÊiÉ1H,cË–,9óñ¼O¯Íµew`ÄÂÄ ¤K˜Âòˆ#“ËË‘7RnÄiæFüó´M›ú¨8„|Á|Muìi­NO¶\//9³ážéݨ?_Îhybûd8ÿÍï¿›mž]¢éø Ô1†v´Y¾ãnï§æ6hò¦\jߪµ)–¯QØ„ıAF—üO(ˆ¥Egþ¦Hò]ûá Gó…41ٸȼ]sÃ¥2µ–Ȉ1 ¢š G±>”ul:oÈÙlƒ­º/ø¤vB¶çã™7)(^êÎ&K³²AJuT[j}ªy„º*ð”bäíŒë{ =ß?‡¾ç`* ÏšNéSsˆ+c49?¼ÔeÃ*<³µUÙ®ùŽ…¿c â¾¶ðÇàJ#`ŒÂUZO‰Kׇ³Ä5Ý{K\#Ð3 DOÁ4 'CüÃæ$½ç»¦á¨K„–ŠÜcp5¥¦“;Œ‡çíüaþtIs¥eÒrØ&­‘®’ºñ¹KJIâó)égÒ/1JjQḟ pцŽ)-fã¬d‘ÌjuGA%þõª²ÃŽÌ.zêe¶ªà8ªø8Èã Ø_°UfM¬‡€çj„…è–ÚHe–è×tqƒU[,»‰ }ƒ‹‡h”¤ 5þFЊ„2ð“˜g”Pfaù]BàóÛöº`¶Ø¬Ò-HžJdùNtójÊôT1OõZ)ÌËË´1^L°ñ AhyDÊ/΄^êYvP­‚Ël“à–¾†èù“½~1Iµ}«3º,×ݾ§–95ò¶d°äS°’±¼|×qJ˜;0ôÓ.ßlª [Ïâ›QæY÷BÛ.ijˆväå)(;xf¼fSÒ0*ºl®ÅÙ~v=´'£Ò:OÃ4‹kÌ;®8/9XkPÍiª­Qç¡Ð±y*Dñ±+¸Ÿü¸”¦ Ð4äZý^µ0†]‡mKîTÊ‚õóŒ°]¿;X¶§Œs3RƬ—¯„'äa#ÿ­H¿×R颕­Õ'}I·³{ÓY^PS1Ô=p^ÆRû­…ç OêHË'mL žšÅá{œ.’ QF€ŽïºÕ¥Æ?1e7H–sÁ凈qe"açFU¤ì9UÇ1™úæT“Ñóº&£ç¦/Y7¾”kix¶ ¨Àß b_ÄErhmöŸìCÊ߯ß[jñwÓ0cÛ…ým¨ákµç™üøKøû0F …øìÂç“8ï"Û\wMœªŸü«ÉûÜU6¼&«ÌnÒŸéx·ýÿÎO?§X ÿn3xäNØWé0$v ÿu&VÑX×›Xþ)°n0±S`½ÇÄrM•~Ä™ ëF‹Ý:Ö{MZÅS`ÝdbL‚eEñ¥C0O`8 ÿûÌáNËmuÒïOï›’ôCxf×6ªVÒL“,§k" mÐ÷;ªwÁÿ¡ˆ—˜}êä1E»6JñvqEy4ížÊH(ðذw nÕ Öñ;S ¹C<7í.h~AU¿ì¯x ÿ#ðÑ1øXÑtbì©4b‹3‰å¥ûø|b*bÉ4bÿ‰¨vBg ±°-Š!Ý`º;ÛÒõ4 ·gŸ ù¾ÃšŽzòí÷ΣК1N\f¶˜¯”:2^)Ùß;iFO—¨OgG?j»I½ÓªaîøIC;¶uΪmõÑï¢Ô*%^ƒFàS‡…£p·•É­ƒsN²»Ùã¿ÅsN@ýâ9‹+#ÀÇI8‡yŽÃܓЌ úÜ9F}Ž’W9w6þ €Õ%te4cá Xurò0‡_gfÓô å[,méŠ@^uy¿ Ý6ye öérCJ36‹+ÌÅ:¥O[ÝÅcpÏ0Ü‹§Ws|ëy÷õ{ö/€õÁB¬¶™§ õ×ásÓVO}-⒠ㆣ¸‰w¦¤Äñ±”ÑÿN#hž`æ¡ìD­©í7Mǃ¡/§½m,Àr;ëÐ/V¿ ¿”»…/çº{wFµa_nË(ÜgÊå‚ϧµÍ||zé(ÄäýàÅ^šÌ4ï#pÿòL:®!h.÷ÁqþNµ&“ªcrÅ>VN šÖqd.p WCtÍ…#þoy;”ÁƒèBùÁˆL¯ø‚{ËÆà¡C¶ûñüqXNýêÕÓ]…®Y¥®é®Jb]ÊÖë«ßq1t>}”"ðp˜ Ã#ôéУa†ü¤è¥à¦•¸™?ëŽÁg;C£ð¹Cv™Åw´Ù 48<·Â«ž:)â"YŠx²Î„ÇÑÇæÓG;)qyöù%Ž(Kêg‹·¨©ˆ õHÄpï%@Û]ŠbÛx|ŽÖ9"ž€{\¡ºÐv.Ü{ç=P*„‘;ï%4@…Ï$—è È–dZ¾º)NõòHN8@ùðŒ!›Ôå)r„bK$z‘#à Ý< _8„î3Î…óஇ‹ÏçÕ/³‹è-}%ƒçÏÎqô·Þì­@WN«I,—?èÊ÷Ô±“PB/¾6˜ïÁ鎃>oûÖø"Ý´¤jµwËgð~8$Edzñ¨ö6ÛÐ&9—JÄNñ~UG/i ðqþý ìq1ñ:aÀ]pžCŸ ]9ƒû¡L{Ío£e*J„eç>P.Ô_™ÑìB%\ÎLÄ=N†ZŒ¹Rt ±–^r¤Ò^*C¾vÙ&‹›ÇèÛÀôb9ÄŠsŽƒ«Èë:{.c—ëÆûgp}ç÷¥¬&uŽ‘Eè¶ãð,q óAt òdÍxòuãYâtDÜiæ.ŒÄ°£OSËZj)r¦›‘0›"çÀ'Ùž[½‚ è24Taž†QW¨ÈC×y¢3tsÀQäDú’å@!p£õÂÂ|¾|°†i¤–+Ø&]ø4&ŸwÛ„r£lµá*’Ǫ¯: OªWAnK_6½ÈQÄ ø¹EŽ%hÔýØ_…ì"öSô¾Ÿ_ÁßW‰üÚ^’Hƒ¯k8ßpܹÇàitˆQøæ¡cð-á£ðŒ%—ÎÓ°ÅñåVú°m3‹êý. J6Njn9Ï.uÌ? ÏEœ¿qy–ˆ!ü>àŒäH%pÝÏ*¤H®P¯fWÅÔ*¬47 +¾>ð’ÉçòÈä+ñ&_Aµ®H~À£zw xù›#ž= ÛãE{?;WÈA?(@bDv?”‹Ž´9 ÕrávìpA=²üÔ>”½Xú¶f W $eŸ9`A ga$¯HxöòöÆ£KäpO^_KÁ9O‰{ï³#R4£iQرîÉAçòJ¼évú54=´Š"ù³æ*œê8T"¬k z™Ì¶â_&ÌL¸ÛLí;Ži ºÛìœRÕëÂR1æô8Í›Gí¾s¸iM™Ój/UÕøl:£èŸ¥(-M¥ ÜÞ=H»ùÔ:ƒöoÜ$ús:ÝpÇÌ/꾈“º„©O1åÂý¢Å¤JoþløÄw¶xG‹±h ¨Öq–¡=Ô”œ›k,:ô¥Žê1"×!Š\—çË"*fIß©)³øWÑñ}§ —>8iÅd””·ÍL4Wê‰fu_³ìR„ö›ïztÍÿ0íVB T°íl‡Nó4nߤ›c¦'ô=°þ9Yízú&V+EÁ8Äh­)(3;TìpàxÛˆ‚}Ðeö¯JÅWàÀ ñ%e.-zf³Ôp jÉ<ÖŒÀ ¢s^4©¬_[P‚YÅw©sÁ!_n‚ŒÚ”o8NÁ9À¦Ã*ñ2ã Ìâ2»·…«h·œ.Ò­Y貂u³]oé='>\4•aûüÓ|9 §g}¢8M;Ø¿#LA¤l“ ñ‘"žX2>Q´}Üc|ÉR“¿ +‰´Ì Û« Ÿñ¡éR‡ß‡Eà9…{Öù ý2Ïw!“*ÊŸ0åÕ¿¼Ãü‚qM•øpJU\š¡ 뛿jý›¿*뛿2M"û÷|ºö·'Òˆν¨Jÿ$Ò’ÃÎS0Kf”d6ó‹7*¬—íÔ„à…¸ˆ˜å°Ãl©“G\hIßà ˆé½8Èm‰È´·VžfàÚW7ë¯:Wé¯îoÕžôÒL™% Ù9Žé\Zè=àfýæÇU¿Óþa{^-}ÂÙ)©3;:꜎N§zVG§KÛÑ)«•nu^G§êRÃeu>B·Z…У.@èU"ÌQ«*êesÕ¥óÔeóÕåUµ¡O­EèW/@X nDX¨^Ž0 ^°HÝ„°X½á4õz„%ê{:‡_¨Ê—àŽNÉÿ˶N‡ÿWmNÿž¶N—ÿCm²o[§ÛKrçÿ5BÙÿ>„nÿozü¿Eèõ¿Ž0ÇŸl{~§…˜ÓKbæ˜ ‰™Kb†HLìrRÅíƒ!ÔWtIê›–G¢úB@²úBŒ„õ…8Ië I$®/ä y}!' ì ¹Hb_H&‘}!7Éì yHh_ÈKRûB¤¸b_ˆ¤Ÿæ;›H—øB¨vµÔš‡ xã¼)‚Ðï‡iYéxãÉ8X*]<X¿Xjü1øããð'k“ó?Éâæ‰û?PK„ÔšÐC%gTPK7Aorg/hsqldb/Schema.class•V x\Uþo2“7™¼$“4]Bº@¡íd#­µ)BÃÛhšIÓŠò:ó’L;[ß¼tapkEëUÐ"Lk:i‰@]Áp÷]Üý>AðœwïLfIÒ:ßwÏyçžsÏ~Ï'_|èãß^\ƒåànö¢·0ñNïbp+ƒÛ¼›Á{ÜÎའî`ð>ïgpg9)ø€†CL|Á‡Ê±Öð/H;wi¸Û‹zÜâÁaÆeð1îñó^ÿ¸Ÿ`âˆ÷á^/í|’eîgpЃOi8ê…Yæþzýþ438¦á8ãÏx1Hc²'qŠÁC¦¼XƒÏjxØ‹µxDãåX‡Óì߃ >ÇÊ>ïÁ¼ø"Óð%/6àq/jñe OhxRÃW\q#fjøš€gSjw´—(½+7­@ÔH¥Ì”ÀŠî„5Ò6JìðŽ¶ŒT7FLë‚ ½^ Ò¶"#´×HìK ,Î= š1£oÇN3dM›Ä}¡DbDbfÊ6b¤N¼F ì’Hy²Šè€aÑĈÜðÐFß^j%ùZ “ºúÍaÓâtPo—/Ïéë³ÂÄse£ð™@"–LÄ͸Mg´‘(¾(/UA3•¢­Ÿ­íœ¼Ô²²ÂüSn¸çæn:rj§±Çh‹’\[Ú:>B~T3?“ GpÝÙ•jFmÒZ‡eû‚þ3¤á ìÆí3Ù¨ ÚFhõâ·+Íš(¾Nî„"›²Ÿ³`ÉÈçûgR¤á² ò‚;¢>#Fbɨ)³K…Y~¦ ·Ò˜¢FR±¤½ßIü6ºÜ?™É@ÊßÕ8÷è¨KåluÙ¦eØ j¾ÅÙƒ —Ni–5”¼ [u\…:^ ªü9³[c±oêx-ºuô2èaÐÇàJ›ô32`°…ÁVƒ žÂ·èbÌ9$t¼C:¶1ø6¾S,žŸHÛñz…•º|lx˜oaY ¿³c SÇwñ4ƒgh+ØÔÙÓ¡cB:¾‡ïSE;¶ lêëïÚÖ1ÐÕ׫c#~ ã‡Hêøø^;(­…®Ó§Ó¶Òóݰtü?Ñ‘‘?ų:~ƒ:¤Ð=?Ç/4üRǯðk ¿Ññ[üŽšKÇïq“Ž?àõ9ÆzÇb;¨ÛTŸêøûäËpÚZÇu¸†.vξšß:þŒçØ£¿è¸7qœâjø«Ž¿áïK B´¸$V¦i¸øÿÐñO¨)ꑼeÃ,œ¥•4üKàü³˜óf¼Ë gilõÔö4ÙJc¥gÑ,¯ip'äŒn˜sB—qâa±Å“L¶kðæàVÒŒ±Í pcíL!ÖÏ꥚'V¾G)vF<½º ²žçKq;¢Qº0þí3K¸R‘køµ´j¯œIUñ©œ9Ýdtã'nIñ ?'¦ó×£ ê|&…ÉV¹¡XMîl5R½æ>›ÿÑ9(ÿ ˺+ßßéï ÓCÞKÜ»‚þ ,-šá9Îrªr6-+aµu2¤)nÅmzS¹Úß5wÿô+ñ}!3©R±¦Èx6ÄYÜúî v+ŽÜ/¬¦ÙW@ >”ðØÿh®;¸Gá^…û¾RáÍ ÷+Tx@á- oUxPaëÞ¦0Ím‚uäÇUxÁ7õ\ôWx¬i¢©ùJš¦P:äóLÂunIÔ9D™CH†æ|—9ß)¤9D¹$t‡ðJ¢Ê!*$Qíº$j¢R>‡¨’Ä"‡¨–„´ãkjš€g5§Q{ó˜*ÏPuÍ-'0ÿ˜¦ÀÕ0TxU„á÷QÅ£'HñjÏMŠJÆ;œegŠ ÏœƒGï—âÕ)ž‡ÕN`~Fb‘¬D‰”˜Â‚¡I,ÌHìÌJëß…¨âUÒ⊉L´1ij•d#Zô€b'Tì«é\ ÷Íê‡jpã$Îén®mHc±ïÜ4– 6×.þnJcÙÎÍaž—Ç\žÆùi\@{ƒÍi¬~zøAVÖÚÉ[»­Mb%™Z5‹)i'G@ ¶Òsœ¼Öß>?éiì弞DS»«µÞ•Fó ÷AsK-íîÖzw­¼ã)Ú©*Ú©,Úñåï´¦q¡ë0<¥£mœ Âíe­õei\4X_6îx:&ëõ"nаGÃ^ ûhw?®QþG( n¾íÊÿnÕ·i¬>…‹zZNáe‡°„>^.pkzÉÖ+Ú]Í2¾#/=Û,m÷6·²åÖiÃ:Jþ‹EŽák—ÓÞusšõÌiv-›}¥2Ûú™½oRfo%³.Â;É\õLæVfÌ­ëm@»ënT0v¦"’™õd÷î¯<œÆ%NƒTä“ú4y,ëU-\/ÀG.½€ånøÜÜôçKù¶]ݪ˹i¼êÖqRœ¯66é|­`kÎWr¾j8çKs«ôhÖ¦†’ç±a+~3Þ¢ =­ZÿxÃýN;ß§®ì"ZQµî¡u­Z‡”LfݦÖnZ{œ€ki½Mñï*¿™çXT0ÐT2¨Ê‚j^>ne ´ñO3|’(y’­”l£ä!J¦ä‹Ôù¢…/y´ííËô¼#Kû Q×$í«”ìôhÒNw{±úkíëTù˜W{\{‚zÃоé…iÉjߢd%»i=^íÛÚ^ZÔ>ê§d?%hʃÔðzEÉÓ´‡i) ôx„’ïfkß#ÄThß7´xá[Ú)9JÉ1J~DÃ\/&aƒÓëÃh’áÔ¿„J#pu|$%£èq4Á6†Ç"_ðq´¤ñ”L EŠ~))¥d’Áý^V¢yxs¤$äágzød?ËÃQâð)Ôe7vÍ.%çQ2•’ó)™Fà\àêUÿQU%Ó)¹ÐËæ †ãÑø{ø%~©‡—{ø /¯à3=¼’ÞŸå᳑Søe»žÞ«2øåHG|=T£ ä5”ÔZê¼|.ŸG ó=¼žò”,¤¶+(A¡8‘_IÉ"ƒ£<œÇ—ü*/«çWÓ×P勵–§¹1Ö¸¬1fPXÝY1yeôúÖæe“gªêéXß^ÞØÕ«oZnk¼ ÛkÛ°¿'Q4«ÚÛÑŠÖÆh4e0Þ9’Õ«¦±½qE82ÎzÆ‘³¢bÈšÆN#ï´¶à{Ñ•ØÒn®n‰Æ°· /GÂíMañ˜ÔjÆ–+[»ÂêU|'WÁ¾ qYkxÁºN„•Uá’äÄ+ÛW„´´…£±Æ6“]ޝ4áÒ[;VŒå‘Hã:– pAzkGÓ*þêëW7N´NnêhoêŠ Ø±ÉÔÖØ´ Ñ+FD"2x#š ¨ÜñíhX‘Ijy)1tÅé: …Ôa^õå©Ä6±tÒ÷ ¿  ÏíZÖÚÒ$‡1ø2$Y/kT”hc0¥4aTe ûÄáJÅXÙ´ÊÙTÛ³øÀc!˜Aõ¥c?»`©6S‰5zM¿Û7ò2 ŸClä?W°•VU• pAÇLü&ê"W´„×ô©=ÒÞ]LâÆC¯Ë÷ŠJûè“eOrx$ÜÖ±Ú²& p6äkÞ‚óEí},*­ÊÔMŠ,ñ$Ì !Óû¡ñå‹„›:Ú:[ZÃ3ÃaìÛ“tƒô2¦4•ãê"Íhô5ãÉÑDÆúl"ëðõ]d"2˜‘Ÿ3ébçXµ]mËP{©1¦KN!*@ÑÒn–äÅcä¾Lï㨃Hu´5¶´×EÎ\ å¬@Ê 2rOK{SLÎ78…]\: úfÞéA'Z˜Dó³:"j#!©ò…Ÿ€Ïp‹ÑPíÑX‹s^ôñÇD^$©:’òeCåÚÎŽH,Ü<'¼Ž ËۑݪbáHc¬Š33 ´*Mú[ý}ÃKOÛœ×ØÜ<ßrW¢³"môJŸÛA+Q'ÞZÐÁ`Hj¥j„ƒ—í¥':I’IiÖ5I?üÇ`ÕÿÒ.íw6³%j¯£yàÙbiòU4F››q3“q1û¿_B¢hD_“XXaÊFXõSbm¤{´†æsïJß ñÚ.*ÎÔ¿ôcÐPŠØ9CX ­]míUI[+[c&µ uX4AEc»ô‘ΑϜ3<Çæ¤dá6i`°“!˯C§!…JÂE³F΋„;[›ÂNþ;¯o^?­È–î¯2#s-:¥fëIû.Îì£Qß„_/úRUEG[ÊéáÜopd<Òæ)qwé’%—[jÜÙàË(¡'‰°AN4¹oA—rD\t”•WH²MoD·¿ÊvÚë×Ecá6i‘|•É" ã’Óá&»†-e0ª?Þ1Ùµ¬ÑdËXƒ³OŸÁ2yI“­d-o5Ùu¼ †5­Tj¥Ò• Ýùv“w°«M¶˜]mðNc@oo4ùõì&“-gèä¥Ñ†É#‹»7§ölS{‡ß†š ¼¾¢ªjéìùås/CQ ½Ç…Àú<²…>ÎÔÇëL}¢^Jácó‚ÐÔ'é~“}I‹½FÜù=`êAâÝoiyh_¥C„ä~IJ´M=¤Ÿiê“õ³ ýì$S„¬OAŠg‘èç˜ú¹´EùŽAçw hÇ•ŸG»åª>‰@?_ŸfêèeÈ=útS¿¹L¿H¿ØÐ/1õK ÐwÙûÉ‚S¤Ä6NWnê3ô “ýŽ>ÇcQ©RŸ…áv Ý=dê³õËL½J¿ÜÔçèÕ†^“BA‘–+„ûiêµzAˆsHÔr˜Ýcês‘õyD2óõzS_€Œ¯éúBú¦Þ@­WR²„¾X_bêW1”ØEél³|9Wy}ådýjJ®ÁýžY¾ |Fy=±ïÌÊYå «qçªÚªUåha¸gêKI+½ˆ’R¿–ˆ§Qs›ú2š¸‰›±¤åhƒLÍÐÕË‘}ô”¬Ä×ôÚh£¢®¦éŒVW‹WÔU/¬Á‚VUoè×™ú*½• a©®4Ù›ì÷øÆüº…H€øØÉ®7õ6}gm â±Cï4µÁ:ÖEPvéQJbz—¡ã\ktÜàuúzìJSß ß`êõMý&ýfS¿E¿ÕÔoC:Ð7é·'KGi°&övsr³rÄ"-«ÃÍÔ|‡É:P”é[ôíšDühe8kÁÚÄî,XéX#ã.g¤°BÂyšýKH«éɤ®L·d½—JŹ3—Å}“-¯öÆÕ-+*d‡5  “ Tœ2=ò¤Ié@ÐÐÐ*4€ƒ³¤m¸¾µª}uc¤Wfë°te³ô2”tµå5•É‹O±ãd(ÇÿEíÇÃN°FâÅ×d½]dù™ÐÎ;»¿Óœ®¢åD¤ÕLJ¯bà%”Vwt¬êB{tøéB¹ÉTA{àDÐàŠòù3«jË«—Ö.¬™AŠàŒ>7Ž£KÆ kQeýÒºùKkëG—•Ï/¯XP9)‰kAUMåÒúå5sQ!4­lŒ ß`Yœ>r…ìƒ%+¤¥42Š,R+Ø`σ7u´¶6’ k›>¬ÕEÆù”oR…ìÓ("ˆ#J3„ðì—è,6¶Ö&„¤óë¸ÑÑÆ&ê¦:LO6pÓ;È€ÅìÖŽe­ig£CèH42GöCõèO¶;‰uøi\`:j¯±j,ýØñ„†èÜK±„ â¸ÒÓœå%@Õ_y5sFùüž%§ÇswµË£ûÔXCmGL:¥}œé]‘rÈÖ7¢ßÍW¼œ¡Fî-r@ŽDP¨VRŠ2&,óÉ¥U8Wµ½9Š´D«;–E'‹FK´²­3¶N¸â‹ UéèbHÔ!:"ÞXÙ­ ¯‘DÙÒŒ‹¢ Ä¬9 %…Ò¥8å´,Iƒ‘¤¬ñ!¥OR²U¹š\·q†˜©ñ2+`ã–X@w¯±5õ¸Ö±aÓ3lùâÓ÷ ux`“äèŒTèè’"%Ò; ¨ÎÀ”rR‡ÈRÃÛ}S¨>¹9Eä§¾[”é8P=Yñ¡>ÐV%,µÁ—&‘éi9Ľš"6Ñ4ÐÉà!ÉnRTèë³!l±©rXú0Ž(½mYPfÇ:èxÀ>»]’¶ uâj‚ˆ0Y¯jÔ-…lÈ1¤¿(ŽŒê¥%*¥ˆ“ñܨ(Ë[[S·S–JXÉŠ­“¿O8¯ÊÈWî–(…ôab œ¢Œ+¡›<1zsGU0ÚÝÙHš)6ª –ÒÌ–3«§Á‘ަpsWÄ®´¼«½É©e³[ˆ4¬§Ü&›­ªœ˜ti¬çÂhg¸©eyK“² ­zÄådK˜ˆ˜úuˆÎµu„–-vVÍ\6м¬ª}yÊb'&›—µ`¥mXSH›¥»Ç¨£dbGX’¶­“\„t%C$Ä‘QÅéš=±Y•*:mswGð( ·˜±Ã2p·jÌÌÝö›™¯“d®HVò˜Ù”rg®¢”‘Â`R'O•k‘§ÚÑnqJõÑ鬗vºã•§#‰k0‰dtx¤}Ô1%5’I¸¹>Öˆ›³*.’CH=€%šŠ“gT9Y´¥(VG ¾E»½y`®CE©»9m«Âµá5Ö…‘û;«þdÍýcoJWžªvëh)¯«³Q”´åŸV’ƒÕí1“ÀQMÔùhNHç˜n8}¾i™Ï œ•½EEdK`-ÊÎäÄ:b…äi&ÿ¦]b³d¶âÙkhà¨%…:êï46_×EI¶la•dEGqB(ý6Ý♞q âëDÜ¡(G ®Ç冚kªs(Õoòܾú;îèžûqÞL-¶TtH=êI,EœÜGS „LÂ'aZäH±iÇŠ2š"dß©» Îê÷*@Úq™kú{䢯GZ–¯s| º‘2kM[© Jw-,K0³ïûôÒl‰ÊkR: ÂÇ´›³Ã1a¦ËÛ²tö…Q°¿‰’TN’(dèïõ$“™ØG1é^M„Åk¤iô;•£qvf#Q5_uwøE™lfAAI‹ŠÊ+\Ž8ÒÈÒÓß6Cs².~M•U‰ëÞE™[¡Ò®\`™Fç¥ÉC[üôÙ`Ž¦Þ³¨WŒÔGÅI=fuDl-µP ξ3XÐ~«$‘Zb5õª‰39=…†mw²o£×cY¦¨;W…× Ô¥ëj‰ñüôZ²mÉ4³®øMJ¾Ö÷­ºãBÇõÉöžà aÐéÉB_F Å•kº¥dá¦ÀÕ A:#Å¡Ls"Î(}J°))‚?=áj¥|Fi_°åvÑí)5Íd¬ M!-Lé„Sî·Á./ýXœ]\Ú$ny‘A"”·´u¶†í[ YÒñÍü˜¤ÓɾyiæF–\®ðê?©ù’1ªÙ?Z¬|éyÕ3ÃM­åX73Zcb/"V QÈËT5 ô®LÀ çS 0"÷2³É|–CW‹3;ª5'šbH“I¾A\)Š.z®ïèŠØñQKÑ÷ºöVòw[¢¸äfu¥X4W´¢DȾ<ãMëb‹Ò£¶´S6mÂÏÈ¢Èp¸}Eleúa U j±+ƒbóº:bä#HGª4Â*g)?éÚ‹R: qÍ%ùئ8]M%,W©¼GS@GÚKʼn•#d;DÔÊÓ-Gu6…¯¯(ŸOl£2‡À›bR&íŸj¨-Œµ £ i¯©Çµ†%>•ÏzWÿ"¶O ˜tïã8 ÏˆíÊèÌ|:éÅ>,ZŠÀ£Ãͯ§ËµýÚ}ÓG˜dpTú ‚×K…%ã¥ÝšQ5»ŠÎ+KÒ—./“¨[;£®®º²¼i8½÷ŒŽ4ÂÛ­%FêZ†ÌYg Ù¯¼+Ö!·Õú&ƒ}£ÑÃ``äú÷@Þ>È÷ëOAÁ"ˆÃú}PxŠaþÛ g쇡5øžŒƒo/c6¬!¸†ï’8Œ¥‘vi”]m—ÆÈÒØ=0Î.·Kdiâ(ÅR7èµ»ÁÍð+x&á»pÁE õâ#7Øjƒ­1ØZ`[GèZÏ6Hä@ p| V™»ü!@ îPvÛ¨ºæ&ºº°gðªùFv“jÎÅFjÖ÷@h—j½ÙžçÜÚ„«ðåÁáLr¾É,ÿ,Wή&ì¨.SâpŽÀ!ðœ‚G9Ĺ ºap­ý:¼Ì‚ ¨Ãyê`®È%&²@ûÔì–l¬¸•ݦ€Z… ¹0ŸaÀ9Ày˜ Â@ÃëTŠÃTçÄyeºýäÓÕÔáí8Oärj´(Nœƒ›ØíŠ$?À‰MÌïtbƒÖxþ(*Ó}ú1ÈÎ+Ü<ÓcrÁVz¼I<–lƒ|Ÿ‡²màÍË]y¦>"Ý^TæòSƒÏ‡ø¼ØOé%>݇KËÜ>÷A(g°®¡Ò G ¢Ìðq˜YæáS³ ³|ž§wÀTŸ§0kJ™×çCef‰ávâˆôLÉlÄD.óû¼û¡jSëîý‘?à3öÃåݽøô\ƒfÃqÕl£©$f›SæQ{ëóÄ¡:5ݽ¿¦ákÕÂë¹ùr‡çn;BÔ丌yeÚŸ'‰à=Äkóza0hbûï{¾ÀP­SMï 2ƒuƒ0,í†1ÂaB0Yä†áC ÂPa°{!;Œ­¶:ÊSꈴU¾¥¶±‡Ts>N¡nI¡ç[ÊîaöEÕ>Oíå¤ÔU\{‘ èð'Ò¶/*)Õ"··ïj Ý#öömVHšÙ’r™;ýìÇ™‡ÁToåSq§Ú ­& Ö2lÜ—l˜nS0]8µÑÖiw1w¯ Ç,C†-sRJÌQ™Úξ¬*T{”åǹQxYÛ¸ƒ}EuY ¶)˜ÔÓ1Z!J4’j£EnïÔµˆ¯²j†{q|Ù” I†«^V&NS™ËçR²l•¤0C™ð¹¥>Bs¯¹»÷µ$‘k$D®¡$ÛÅp9Nr9T‹\‚S@"÷ ƒ=ŠÂíC˜0GIÙnö5ÛWñU7æa{õ‡ Œ¦Àò§´­ )Ç…lõ¿4+¶‚7Hå• Ý½¯“6pW™+ñä’h› 8ašØ 6œ%ç ç49©-}ÐÚÒ¯³ÇÄ;Ä)"RBZTúƒ¤µg¾>5]¡þDwï‹üb»¢ä‰h‰)·z!Æ.y=,¹„ºØÒAÙLùqö„ùi™ +Éqh©åSõB=„ÆÓôP¡>¥Ì5l ò¹„Íæî&¢8׉b¡0ÉV•¹ƒD‹âÐÚ°IG ê©H7O†Dú /h´ˆ\‚?ܧ°!ý¬†!yO@š#Ö0k-ßdßRkY¢XüœÌœ½Úú‘ÉÅ0_³wrMXN´‹íÎ } -¶Ýc7Pd°ÎSaÃVûyÚkøÅ%Èd;`|ù§“¬UÁo×oƒA¹‘8D6qDß«ÊiB5¸’úd‚hºBýóRX%¼€6‘ÛÄ,ðŠfÞ£l¬@çDBäj ›{Ø·å*´»Q4x1wÛ«P’³pZ`«§Uÿ˜<"üiB«ƒÀ~Ùø{CèÙ/ ¶5Ç €ÞvÊ-…—š c•ªû*E{h`ì€áA$¿8¬=ëÂz?D^o%NÊtÁæ]>= »R'ƒãoƒÌVÇᆆ u¤°IjJL½6Öúƒ ŠËtÛ=ñ¹‹…iþY¤rÜ—|•£0‚Ü1Ôj÷vÈõ¹Ô3½t´ ö¹‚vŸê.tÓc;`¶O/D.»é.ýÙ;ègT,¦dƒ@áÍeŸç(S‚´•snÄÜ>âW:7@¸s'1箲¬ÄSÖa¤è|˜ËŽ >Û%ò'á»"NRÎ<ì}‘g'D½$¹™08?T,| ¤º½ìŒþF .è‰Ûw š…™M›‡ö€Æ>‚Ù‚,G)™%íolˆ³ýÊ¿ "óýѦLV;ü1Á†ðþ¸0 :Õïkª~%þv©²õ{PýÖâïfü݇¿-Žöí)ý …ÜRÛ s1¿óË0‹ù¥˜OÄ|æ·a~æ›0/Å|8æ£0¿ó¡˜oÆ<ó;0÷`¾¥¶f~^ÁÙ__‰\bvùn1ƒ0ìÿtÒwYkKȃ¶]ØŽ¸!­L–ÁH³"HL°>UBs§ ‰°E¦Tíþ ™Új¥Î¿Ã©]›®÷»V¦çß… >w˜ùw‡„k\ê Kß“%HekôËÊ{÷§IfŠÒ}[aDþg¤ƒ]ˆ?›" ãæ“ý\-V…ˆKDݸüû%äsþù£§Jôæú¨ÌxrÆ¥’z~I¨çëD¾žùKðK‘KLMo[† >£Ø(o’ɘp°†ã“ì);¨¥ ÏCø)¤`íÞ–&zÒÂ9,Æ®Ä)Ó“–BôÁn(>¢ìÚŠ-ÛrÏŒÃC¸Îmqx¸Ì…«$ÕNËÜeÚCÞ š[® mŒ•OÛóSVD4‰®BΈO>KF˜OG}~|¡KÛNíNÊöB—úÉM)6áz„… ºXä—£Gy-а ÿ‚ߌÑ#Y/YH™ð|˜qè„ç,¤¯/"¤Xøý.ûžê²\…Ø¦Ûæ3öûÒV0ýÁ’ý°½¼ˆx,}¹¿ØÚ(’gŠÜ ëé>·4‹5úäPÍyE:w¢2nf9B+ø‡¨nî;â+ÒùÓèsE¥Øgáëƒp’çUpj–#cíJÄŠ±`ù«enKÉäDH‹ì,Ù7ó©žBéÔIgûÜ…¡“-ËòeÅ¡»ÌKÙ×tTdy…_¤Û׉¤6yPû5»0[ÁF¸²\¦ÏŒCeYŽ/'¸Õ¡Ç—Cê*O«Ì¢êÙ‰b·(z©øÄAø†²A²’Êo–e‚o‰¨ê.š‡É¢ïFl’þÝ#ëâðm?­ö?öÜë÷eï‡}§ûÑNª*›ì÷7Pñö ÜE*ov”ïPe?Íx¹Ÿf8°Û¦œfÈîE½›eÑ÷Fê@*Y´[ÏFÛ^´«Ç¡~=ÙBá–€™©¿ý_œ žSP*DáyCßxÞ’Àó ìçŠ=¿©,“Iìé8‹: H þX† æRÉer%›%âŒj£ ¦2)Öqë sà‹¡Fä‹ÐaZ ­‹‘[³ÉT—&È]öY vz‘ýâ¿„}8Âþ¬¼Èç:ÏýŸÁþÒÿǰ¿lÃ~PÁéö³S`-`ÃO¶þ–q‘|Up¥‚ËEîXFÕi–ñËÿÅ2~ú¾ŒWØ«j7(¿ñâÄ27»AúfÉøY`. ˜qpŽtÊY6(ÃI}Ž2ؾ„ë•ɯ,Ht/Ž‘ô_úBhº—ƒ%$ µ¯C".±QþØIU¿ó«eÙú±mò÷c^€¿rüù銉jßÒÿ6ÚÉ[ÄNzx„ukzu ÿyáìÙãS[^°ZÆ¥¶üÜjy1µåVËKéÓÍ ÕÄÌÕ·e®ÞtÚÞ>Ï1äèæó$¯D×-™Gž¹úvblz™˜Ø×´.m>7º(–•'nà ¿Lï¸ùc•¡#ÿÊÿÖW“;æÁ3ù¿:¿>\æMT{C9ØÚï€ì/‰üqˆ‹ü{ð¼È_ƒwEþo¦SÎr™èÏüì<‘—³j‘_ÉšDÞÁÖ‹|3Û)òÝìI‘ÿˆ½(òß²S®iÚH‘´"¯ÕV‰|v“ÈïÒvˆü›Ú³"ÿ¥ö¦€Cröbj9ü-;PTäÃÿŠð¿Sèürüq\TÔc„MQ* =dllù ìú^”¢irدíèÇcêmi_ÑéǽLÛt,-Ðá·QÞ^¸ù´‘’ª“`NuTŠ|Ô‹\.x4h'áÎÏpÜ/@©P üÎv©×jÊíG€§½™ç+˜oV9[¾â?íåŽsà÷ÄÆ%6èPÞ$ît{Ãò D,- óÍÉ $9”t‚„L-ÎFfQ©DÅÉ„?ý[BÎÓz3ãQðÊÃßmr÷v÷¾!\»}Iô$0èQÀ¯‚5ÑX'r üH0NŠË ìŒW÷…†§ûB.Ë “½å¸£˜i9‡„ÿdº"T ­² àFQâ÷‘hÛIW„rTœÈøÁ¸”HÛ†*OQwY•çë»à¹{(x‡Q£Õ˜ÕƒæÈÈ¥ŒýýÃfžºœ_“̪T0éb‚8&uË0¬A ôÇí¬!ÈRê‚ÉÞîÞ·»{÷w98Úu öOáx!‚½âÞU±†]þÅþ­ü§°1A“ˆ­"£ûÇ`d¡ŽB|oº£Í’o”ò›L8ÛD½1 ’“%œšBz¾MVß&«»ÁDv+ÙŸ*sÓ°Y‚X>éË)w’yŒ€=@€/‚»Dþbã{Ýã‰jΔÊoЙšÇÛ à²Øí.æ7üGb€_/£&Úý©ØÏOºÁ°ã°Z$ý[åmÇߟA\@`õ²õceòãïÛø{ĵ6Xµ÷$÷‡ãA VZ°¬Kº ‚†`Ÿ-ce˳)Õ3Wß–¹zSæê-ýôFu:Ø9hŠYC_„¨¦´†;dÃËÕá9%5cÓÆ2òGÚ”R®-ùÂJã%ùRÂ\ÿ؃½’<Kôö?ö/SÆNº¥–ìÐY¶è,¨[ä{à»"^ù[ðÈO07å,•ˆ¼”+òKØ5"¿Ž­ùmì "ßÁ~ òçÙ["ÿ@Ë£\+ÑF‰<¨]"ò9Z›È×iD¾YÛ"æ“ w ‘gQÁ*ék‰Û{ûNÀ ¡#B#BƒF„÷m}Üþ|àuCe¼¸¯q¢6$މ}!nÙAt¬«ƒà„üõ€<ÍÜŒÏÚàZû9ŠÏk˜óe”-Ýépp£ÐÍj…÷º0qª©:ÝÜÚž¼Â/*sPÌlO\®S-ÍZVr ½e6ž°¡xSAñ%§DA©ÿ‘ôG˜í‰,¶œ’¸a7Sèmy´sX§ÌsUž§ò|•“Ô¹ $u®ÇÃЋø .&Ǧ"Z•µŠ W o@J¸?'r+¬€þÄPáOÜûÔyõœ^ð¦náG–M­ZriwÚ&‹2®ýòË„ ­õ‡‚ò®‘ày§U©õ’ý4r)ô)ÖPkXqˆg@Œ«T‚žE4Jp?œ´®ãI+ý”ÐïwúC¹C…’ñ¹•õŽ•¤8ãt%/ ¾4;×Ö:ŠN³›¼´;“Gïøû¡×¶¿vc[òe.yaÏ%ˆm.ùàIöÄRAÞ™R†üzU\á‹3˜ê¡'ºñ÷²,¿/+ÎX7pqsï‰n#ý´Ï¦IÛ*öXA±ý,ŸžY\Þ„ïE¢ë3ï±/ ÿb”³õìN‘=(ê%,€Á§à*¡8IöÀ•뀫ÉG?)XYñLaFûç9gC°m"T¿¹ŠnöÙŸÕœd§”ãþœ:mñ§œ‰Ö&ôë)‡z}DýN©Ÿ³ì¬ëvô]áø¥öýIT%¢$¥(k˜foæÓ; È¯â)ï‡È ¥ y»šüt¥lg7,¢FÄawXhcíûó2°:7k;’•ë Óq[z_%¡†’®Ø§[¢ÎM¢Î­X5$¶8Gg‰`Ûîá}ŠFº»mð‡èªÉiN]Ñ€b#ÙbDú$V+òÅì*ÊÕ¦_@W oÀÝ;E Ç`½hwkqî½Y܈ÿFúzÑÛVnŒýQýÅ}%#J&>E´ýû3þ}×&|û?%<ÀOÑ÷lv†Í±)K‰`>YšµÚ‘Ó„õpýeºÃ›ç ´ òǾ®êÑÓF}>!žé‡LüP!üËE@÷5íÛeñ¼eÕ-D(–UÔÍÞĪ[“«~F·“7 ’ÃQö”Ï6ȉÇ>“y—üÚƒdÚ%WÝN˜£J ÎZ”Hán>Õ(4|n¤ðBtÖ ¢pÚ÷ãn6›ì¹ýv‰Io¿§ÞÞËHF2C”p¨§·Ákä{3¾Þ Ï“m˜´xŠŒ­2½ö’E'¶l£º­ à™ì·Z«tY7¬Wïäæl‡ve}n´ {Nx{,KôfÞZÇCv7\B6©´åú˜éÕÚÐQês…Ž03Îrй±ÏU°n•Ó)$þH\ø: ¦ZDÒ:ÞO4VÛ©ÑéßníÛZª3NÁÝB4ïC‰œŸ?6?ÿk ž=¾AK}ž–ï¹ lЧ '!–í¯5f›d÷9|jû;â ¤ÈwB^^á-J¥“Ô!ñ48µ³–šÇ•ã,·¿ÓƒLâx€‰)è4+è:¾‘²­t™Î©ö2Dä `$P{”ÈíˆüRù•¥¦[_Yò{Qv‘ô8‘$©¶Â]ê›™Zg YÈ-Ç“F™i‡QDY~H¥¾£é}-Q!¾±é}–b+,>a¢0#Ëïî=têŠ @ÀºûèCtŸÿ+ /qØqRtrÓÍ™aº43L¤Ât mcaœ5t÷>ù à &«É‰¶š\GjR„ZsC>7\ì ù×K)ïLÍðNõÎPñ ÆçƒÌGáâhhXè@ƒÛúÆ-w hAÅdÐ=ýœÍØ0š"„Ö¢ÀMw3 wÎD¯²áò…ßá ùG¡é+Y´Ÿ 0 ØÈ8•;*ÎF°1XDª§±VCu—è6ÞÑFÜË&P˜i¢€0OÁUjòÒ†´¯?Ò¢™Úï´÷‘ Þ×þB¹b˜Œ Ï¥eLEÞ¥åä'™¹' ¿òÅ÷Ëã´»rP¢²‡^¾Ã¯¹z $ÅlG¿QZΘ`y/²¨ã+%Í¥¹ûÿK]réN8Wâ+‹#-¯c,_§Öq6 í)ŸkXœùЍ: ?ÒñŠý\)ª‚â:Lœ…’›„«øU ‘zˆl>Ddê5”ô/ÞîAü=$r‰È }ñV,°÷(ÇÖ[ŽîúŠÅýÜ‘IŸ½aÙúü¸0ású—êæ`5Iä3kü¸ðöZ…uW/ˆÊúòPâž^°Ð5å(L¡ ÉÙO9Ÿ<„M¾+”ØÝ¨6ÎÎFš×ÉB¸Ä·DºB‚K¸S„…” t‚ã÷‰˜×Ãh–?ìÀ‚ÞK¨°®/U°¾ D Ú6õ¹Zi2!T[Ÿ3*~’ ‚`ÓÉ1Eߎl͆Qùœ©Ò¦)tï€Ðâ7ÈóøÐ*9w/;õhy³©¡v~‚í¦ &SØÌ)âã4Íeó™X§†šà|¡Ìñ‚š)w¢~€M§NÁâ\aT­#Z ¬ì” û%}b5n¦‰‘ÞOýП›g9DÙ]¶(['¥2}À&ë}½?À.vά>vë4kì Àu÷^´ˆ0Ø &ÐF"mVŒ4S¬ §\Ñà\È¡?s!EQŸ¡e1hôW1N¢ÃÄè#}Í{V#Eæ|Íâ>½aÅÖQ„­JXÙš éŸæ³KÔ§ùô¸QN°KY9Ú^vÉQ(¡¬ÆÏްKñ½ 3F(¸Û)ñÈâz¡kœ›z¤ÑØÏvB…ò2#$y¸²BÌhÏ Æfô-ÐÒcð#… óglçâRÉ=´yZ0´@h*þˆ-Þ°ƒ…²Á6ÊÎt—4w/«Ðå×´b¹zI¡¾]€’$ŽÆÅJ¦ B1úΑÍÇ¿è类Ä)¯„Å"·>Yw¢€‚_zܾæ åjyi›;lx¬ÍÍ× ýÃaϪyˆõwEØ0ÅE˜wÄŸ+ÚÃ*sÍ=lÖ6û»l|+?›íôÄâ¬J þ¸ˆ°ËëãlUâ¦U纟‚çñ=¬¦~‘.R—HÝ{`tý"C¤ž=¬¶¾Z89ÎêjÔR"ÕÃ4ÕØP¨ë×`sË\‡Ø¼EhûêStÎö³ù¤9]ôÑ©›þ‚ ŸcþC¬žþž@n07'ÒŸô.â¼n?[°-D^ÈD^gW48д^¸E2V(¢L{S'`:v¸ ;xqÚD¶|ÿPKþ+7ÕŠPK7A-org/hsqldb/SchemaObject$ConstraintTypes.classuÐËJÃ@àÿ47{³õZÜ .¾A Q‡’´ÆVèJ¦uh-qj“(øj.|J<7âf˜ï0óŸ3óõýñ àƒ‡Ní«q‹ëôaÏ $Ýh«ËJêê^æ¯Êáã ¸ÉP¤fO–ŠÛYlÔ xÑM N›d"fs“fJ.ßœÆÉÄì½§„‹m± ×å.\„w˵z–ãÅF-«óºk!Ÿt5}Q%¡÷§ÒZ«"ÊeYö7òM†¹Ô«ð7ƒ0ø'Ýç§¡ÁCø8ƒ—å™ñk–÷ØMË-vÛr‡Ýµ¼ÏîYî׿uÌk ¦çŽüæPKìùQPôvPK7A'org/hsqldb/SchemaObject$Deferable.classuËŠÂ@EoùHŒãkVÃ,Üü5-4Gf+méi1ý8~€%V!UÔ¹Ô­Çõv¾èáÓGÃG›ÐšLç‹HŒÄlÖŒ$¡9Ü[—)›ý)sÔev€E9‘¯Vå"±ý!Ê8‘ìÏE®–|t?ûtnÝÁ¬’ðw¹Õÿjšìô2ëFz­S•M uCZ«Ó¡QÎiGèìÔI…FÙMøô¾ÞLôøf”xqߦj~Ðô‚;PK„(”Î"PK7A)org/hsqldb/SchemaObject$Nullability.classuËAEoyÌx?VbÍ~€XˆIÏB°”:i-ôø5 à£D5‘°°¨JNåÖ­[÷Çõ ƒº’*!'¢¹˜„á˜@=B¹¿76‘&™J}RiÖÂiXÐí…ÇD¨}x>#Í„›§|Ô­ýq¬íA/ã`¼X«Œâ­Z$mqÒZƽI.„╆ƨc_Kk•e÷­<Ë@K³ Þ»„ÆWC#ÅÇÓhre˜². ”ôÞ¦B(¸ø†9ÜïëùàO6z6o1YNÂ÷M4â·ˆ@SíÍr©J–å–³OÑÔ ´«`&‚Sq¼Yãйþ¬†!á%/Rÿ >²dç¯öqâxwûr¼à‚O¢E˜'Bzÿn ¥(f+e°ä/ö3–©_5žït[ú 4Ì*ŒÐÔJh™A°4Û5nkvjìjîÔ¸ûûy_« ÓéáÑr~PKåe.ÜÕDPK7A/org/hsqldb/SchemaObject$ReferentialAction.classuÐÉNÃ0àš6iº@Ë"Ä §H¼Aä)R”HIʵrƒé"ãˆÄðp=ð<Ân/9”ËHßh<‹~ßžpëaæášà±°`á""PL˜²Zµš+ýÂå§pL)Ã<*ÊhÅQ啱¦-\EF[ò-‘Cp[û/Ë@ÏèÖݱÁp{’ÕøxøÃñ™jO2üw0ÚŸdóÊtAM²}iäzR·¡·'[a˜ ò¸¯Ñ6­Ó貜O´ ¾¢ñUð–Æ×ÀÛk,ãÝÐøuð¿ ¾©ñ[à[ï‚ßÖø6øŽÆ{à}ß¿«ñ{à÷5þ\Ðø.øCï?Òøcð' þLãÏÁ_h|| ñð—?¥ñ×`SãC°¥qlk|.i\ã*È Ž7ã[ª¨·£J5%‡ÒÊ€B%ëÔPòd(Ñ©’ßÑc%¿§äB?ÒdúIŽfHù77õ±ßèÒ¯Špçñ{Ÿ šÆzfv+\fHù(/@.B.A.C®@®B®AºtFmÿPKf3²d²ÉPK7A org/hsqldb/SchemaObjectSet.classÅXyxÅÿuìJZ_²•DNLÌí³†RbCZãˆDÅ–'N¡(òÚ‘%G’C @ =€–žÐ„Ò¤´ÅmEPc!P JoÚBï–Þô¤‰c÷½Ù•-ù þ¾þQ}žÝ™yoÞüÞ9³~~âÑÃVˆENt`—ܬà}NXŒÁû|À ;vñムnqÁ[|HҸáù:àÂÇøq³“Ö|œ Ÿ`Â'yx‡‚;ðàS<³›{øq— ŸÆÝ.|{ù±—–{÷ðæŸãÇç4÷îÝ«bXÅU|IÅ~÷©8 â~_Vñ€Š”ŠU<¤â+*F<ìĹŒ~(sâ<ìRpЕxÔA8ñÌcü¸›á=Î܇<Áï#¬Þ“L;Ìð¾Ê½§™ð5Ï8áóü8Ê‹ŸãÞóN¼€¯3þyø ôMÞé[¬ö·yø÷¾Ã2¾«à{ ^° –4Åâ}µý‰­‘žÍµ‘ðæÚuÁDsp°^ÀšÜ1¨ ¿€ýÂp4œ\MsåþŠõôjŒõ)7 †¶wGpsD'ÁJŸžl Q]GB®æFõxc$˜Hè UåMW·k#Áh_m Gûê+2q¤W6£Á>=~Fz\Oþ'× 8h—ÖÍW顤@ÍɤBýú@Ð`'µÔP,𠆣Ä3×Ònfé×C[zzÊËŒ¢„¾Áä2m9KqI)¾íáDr¾½h•%ÈÛ,+ŸqÅzé.{\ˆmcc¶`\&|_’¢ÒÎÍ »`òÉÌd_<‹gÿû ÂZ=™Aða¶‚„8—5 ÊgFZk¼Gë=p=YrŦÙâ)Õ(Á(·(Ã)(È’ ‘ˆÜíÎÿq·YYA݆x<¸£‰¼9‹êOêñ`2?©dSO8ÑØŽôÞm×±È6" ~þ8™Ôn ñ ]Ø P:w>ê= ]C'Ä¢¹™4ü/ ,žˆ†+ðŠ‚ œ¾€¢(É\LHüXÃOðS ?ÃÏ5ü¿Ô° Wkø^Õp¶hØŽ«ÜÒÛcCÉpT×ðk¼¢á7ø­†­xYÃïð{ÐðG¼F9 áO¼úÏø‹†¿âoÌCöø;^gþ¡!‰°†â_Àëý¾. ËÆÖ¦Îæ[GÃÅM>Jù€ï²N_K#us×5´74vøÚ˾â]ÓÚÜà'^kÇÆ6¢;[[í4ED jjèð·ÝÑÖÞÚè[ÓÙÎò.éli4§_»Ñ·ù[ÖøÈKJG»íZ_;eþ›Eš‚køÞ˜íÖì :>Ûf†õ5Ãq ãØ !Êf¿7j8 ‚™ ¥a’lK%_("GaÕÐKk„M²gl! ¾&ìBÑ„*Þ‹›4á.EhšÈÅ„&òØ;q&òE& …[E¢Xz`§((™'ФFèÒ¥~ñ^xVf¥MÑÙSg—/ìÔÉ:ƒ-;™t®ˆµ².r¥Š&ú9<·Ü?×I5=Õn²oéƒÉp,ZÏgˆyX]ªï˜q†¤5£“Æj”÷\ئ»×νû Å2÷æ"ÔCáÞpÈHhËàÙ÷‚9P,ÐâömÁÈ_J³MÏÎlŒE"Äeìí—H©žrûÒÙb¦j1%Y0Ñ¢oO²ä«¸|nTƒò,8sá ’eüÑ}û<.ñÏ:§÷JèIéËEYþÈpff¬%H½v=­-‹PRè|Ã0¼'«„@Ñ#AŒE€o›šfbqö“AÿÀ`SËšïÔex%3…ç’¦íz/•šhˆe:Ûà3N£ìRØñG·ãá`”/AîpÂÈs6d`G"©,üŠÕmÜ.;ä­ÔÙŽöPT Dç¹[ùkbšg;$ccÞ@So(Ú‹&’qÊ6²GÕÉn•ÓÌ´Ú3'A 0KªÜž{RǸ¯p(lš;\áD»Š'Â|ñ݆@ºà¬ÑC‘ …¹Ì‡ì¨žŠ—ÁÚ¡„À©ô­ÐAßY9ÔèþÑuž…Ô6¢›¨w}ë0Ï-•@T.}9K÷3ïõÔ,Ô–Pë5[2£Ÿ_o¶ÞyZšžÉ+ù+Á²ñX†my4²ÓH¡ÑƒDx=óa™Ä r\.€\'M]  üi‚Í÷VŽ GB}Nƒî7ÛMýôøv³õÏÓÒôL^ÉO{ÙªF¡£¹úY(bŽêƒp ¤¦I®¬þ”6E°GdE 6û„޾ßz ›í&Ø7fh”œC£äˆ“óÌϤÏl™¥ ñœ[CîS˜íÈ!Ì ³}&L Óa.Í;`@¥}Â&Ëù¦oÊ$Ëò‰k7Š©W0†Â‹–ñÔÜOL»Ú±œ^t%4EÓ›œ•EŒ¢(½I&G­¹IIDzåÆPL;Ìï¥n1sñ-4eeÌUÒ{ͼ°`É>¸ªŽÀ3ŠEj5ªÓlû3úéñQ³uÎÓÒôý¼ïXŒH[¾º4g»¯´z¬ép3ÙJGQFƨ³z­ÒÕ£85M2DœÖ5lLÃ%]Uiž¨ÊvhlËcÃ8ÎÇPS •?qLWÝaºsg‰‘ÏÑŒtî{“5ÛBèÑÌq¡ç† ‡¡MeòÒS8°G?9Q¥Ëwýÿ0^·Œ*ö;LŒ)Bȉr«‰ñÆŒº|²qei\Ií=ÔºM>na§QˆZŒÚL¨iú5îÓSî3Rî3Sî³Rî³Sîò”»"å®L¹«Rîê”»&å~KÊ]›rŸ3G‘,B>ù?'ëÇöÄ5f~pipÐÌS‡p.r+dix–=°‰”YßvCyoMe¦tUfpA:• ÷¡ïÎ# ç×Ù8ve¾7sO¦ïÊ:»e¥âQ¼ö¼íð=8Gv<ÊŠ:Õ«Žàë^,–Û>؇áòÚ¼ê(Vuí¢clò…áɼ´u]µªºÆkc¨§Êuá㸨ÎVÔÕ]^ÛôiV ç8Š\›;ŽåTÈe ®;Á•í=b ®?å ØrŽÑ)¢òG¨aœÛ¨xiô.«14ÈñÖ¤ë©e;ˆ·“êvëJŲRõ¨^û(Þq¨õÚ=¶ŠTÃëÃÅ»Iáö:ÌšáÌŽ[9~Üx§eætÂl¯g3ù³ÖNTz£h܃»ÉÊø“¡®¡KÝ>yŽÀÇP¨X\²Ò)‡ç(ÖÖ¹¼®Ê1¬Ûƒ~¹hs%s•J1ëåL›œ`YT‰îEC¦(ÓKRÞI[ä{†»\U—>ËnÌOÃbÊ.U O¼èQö ·Š}¶ªkxâ.(R~ºO±TÀ[ñYW§R6šêÔJ#(¼Ög(B¬†iU=Õ`%ÕÀ¦Q4SÜ`åYx1Œ£°€Z Œ»f‰Üg-»QVmîÙ:ж®ôà2"Õ,©]@O¼:]a»éXœÄipP„É¿k)àdg3=å—#..fvvvNF6›Ì¼Ì;Ff Í0Fçü”TVFÁü¢týŒâœ”$ýàÔ¢²Ô"F $±b°TŠA‘ h.0!Ð Éä ‚ù ¬ZÛ7‚0PK!&³|oŒPK7Aorg/hsqldb/Session.class­< |TÅù3óæåm6/÷E.wØ‚(áÐ$’*n’%¬$»awÃá­õ>ë-hÏX H– ØV¨­mÕjÕjk«Vm«µ—¶*ÇÿûæÍ{ûÞflfæÍÌ7ß|óÍ7ß13ËO>ý!äDõn7½E“éml/&Ûç&ܨy“ýnö {¿žÓØónâ6Ú¨ÇäXz“bò#L~ŒÉ‹˜Ää&?ÑØKn’Ï~Š…Ÿiìe7)4Pý“_`òËdö {“×°(’_aòºÆÞp“qì×Xx3™žÀÞÂäíd¨û &ïhì]ýÖM*XÔMÊÙïð=7`ú½¾þ€ÉûûÀMNbbÛ5ö‘›LgcáLþäffÁ¯O1ù »üiùÜÅþæfgÿÐØ?±ÿ¿’!ùÂ;dÿF ÿA˜¯Üìkö Žw'yi:Š ²G!€K¡n…) ¢p7}IQ±! @ ¿\Øì¦'(n,¦`¢c·TüJÃ$R2R”L% “llÍq+¹J ©ä#Èl(À¤èSŠ’É;J1~•`ÝHm”êJÝ´R }Ç`ÃXì;ÎM>PÆcq&¸ &á@¬+ǯ ¤t20D™‚Uº•©Ê Øz¢[9IÌ\9Ù­LcGpÜéÀ0åLNž3’•*e&&³ÁlLæ ÜiØz:ŽV X”¹˜Ô¥'X‡ÅyXœL\€£ÕcÝBMY„y>& Јã7!a‹â"Q.Ñ”¥n²MiNVZ”VL–¹•åÊ l;ÖLY‰SZ…ÅÕ <Ê™˜œ¥^,ùr6rm BœãV¼J›¦´#ÅÈ`_2¬Å!;“•uŠAÏÉPÖãW‚tkJიô`²“&ahJ/BoDr6¹•ÍÊ,ž‡ÉùHÀÈà ±xvº±^‚_—b÷˰á;X¼“+°x%~]…ÉÕ˜\ƒu×â×uøu=⻋7º”›«ßÅÙ݌շà×­nºRÉ×”Ûúv¼¿îD€»0¹¹´Eo›¦Üm÷`ò=¤ö^­íØiïïû]ʸÞâ =„ÕÖVúðëÐ9Ê÷5åQ| Ñ<Ž$=„ü@SžÄÂN¬ÞåVv+Oa—=˜ôc]ëöb2€Å}˜<É~¬{¿žu+Ï)Ïã×á¤ÿ‡ÈÂ%+?V^ĆƒšzJW~âV^R~ŠÉÏЗÝÊÏ•_`§_"1¯$+¯*¨—”_©Dü§|‚¯»•7”_kÊ›Øô–[y[ùBÒçž®)ï¸éHå]¬þ-&¿sÓBå=üú=&Àä}·òò!&ԔܴLù)ú“?¡@ü9Æ_°ø©¦|†{÷¯šò9Žû7LþŽÉ?0ù'Já¿ÜÊÊ—8ÅkÊÜt†òÖ|­)߸é,(@ËaLޏÉcÊQL@ÆãÐR_p†‰‚ Ç:¿’0Ѱè¯dLܘ¤hU‹ºx*ä< (æéø•áVÖñL7¹…gáW6Ì•ç€ð\çxª¦+y>&#PÚð« ™TóBü*B#øU <`å^‚8Fº•W9è17/Åd4ÖÁd¬ÆÇ¹éz$eÄŽ]üÎX qB#%j—Aöèx,5ÁÞ@dYOmpS AO*ÒÐñBg_úæÙûXõè>/ðµDB0&°´á\ïFoe—7ÐYiÔDž4dý*öµ@Yz$¾&ÙnòE6C°i²[£wssp6ÊŠúŽ˜ð¶nÆRR¸=äï*ÝþÎ@0ä«‚ŸêD`>¹¥ö)œÛÑÖ^¹°vnM gíÛìè’ÚÞ Á<[Ú×ùº½_; ׬ÉÛ èõªéò†JÆÛñ›PÞ€·Óg–q‘»‚°ª'ßã ‰ Vhï¿DTÖ»»½è”…rlÇYÃâÊé¦Û+‚1¦Á$"0—¸íÚâh¬Ù!_ö"°¸Ñ× m1m2•Eœfh‰µ@÷Œ°)rš””$”ÙŒZ§Ý`/ +ù ø|-5 Æ²e…µME­¹ þ®.?hë·®‘-=¾p¥ÕÝ$4- îí²U¤Ø`âøC*ñ%[‘[ºVxCX‚pÜ"š[¼Ö·¡WÞ|/ð)ÇØ)½We¬Åí‹CuÀ²ƒPx#ÁÆ—Be«³’’‰ ¨ƒt\ X"±·¼¡--í^WÚ¾DF­€ôw÷tá }ó‚¡n/O±A$ KeK\+JO|ù­@-¨ÃŽ`÷| 5¨Í²ÍµY4¢U ûPÅe´wùé Æ=¾PÄûh¬>¨ ƒnlŒAÿ¤Yþ€?2‡’ye ÜPölÕª…ƒ•Tý¤å@QM°ÕHmûúFoO«·­Ë'Ll³Æ[ BÀoöxL°è°q|s +eØ_íôEPA ̑ڎæB=Q± ¹ͦI³Œ /cëöF(v:Š€le:À4xÃ00ÌÙ–µÌ6•¦Þî6˜bKÌ)›4¦€µ–§@Cø ‡Ü ½çDféyMÁ&p"rºn“¨‹„1q6 ¿C ›Ø‹Ê†BŽsG8£ÇÈDp&jEJ,ë’Šë¹´Á*»amÛ×Wwtû¨§°€ŽÉŠuNª¨¨­må,@Uïz¤{;:j}]¾ˆÏt&:HæTzæj!Ø·>“Š˜}§¯¹S–9Z-Ø}CáÇéV÷F‚haüBWauJ›¯Ó0‡,(Klõ2T– Wâä´°)•Í"Xˆý Úí·În¯"< âU†Q‰sªòDÕèïëpºf=!è:Ÿ9‹¤vùá Y]ê褖­‚¹j¼ÂMØjÆN6ì:Þ¾ž }Çö’bŽSÏ6‘·[bÐ!Xj ÐVF»>Ðèwï‚áš‚ jÆ"ÔÛ<àE±]SP”¥3 Èl%K}¸cî²èn_R”I Úçíž+œ9ÿy>CÑîƒpØRüa[)ÕlØç]v7hŒs—&ö äü!ÈÄÎP\7¶ìxã ÿsmZkYÀ¶ÕðÇÀ17÷+@ÔØ ä…m ^ä;+m;7ä¨Çßå³9Àå „¡~ÒP^±'‘è ¬ù6ûÚ{QLn# ݤ)½ð?ÌtÀZ°ÄK‚áH‰sÉ08ÿ§ÑL­ŒZò„²…õN.¼ýh÷QÙ@ØÑd–k„¡Ÿ‰Ê-£Uºg!.kždC­6@ÄbÆ^¢dÊñøO≬ÆXÈÛJÖ ¡|VÛ†XÜv.Ð0<ÏÕ”'A÷Å $BÃñ|™ÆanE޹9a@¡ÈVõ²žá× !¶;ºqÛ0±«këeˆþHÐìÃ:³ÙÎr Œ²›}´\¡=÷F*‘&Î µ:+Ù3GKR?ì² ³eõ2%«Œ»~ÒàU4´ž ,¯¬>ÁZ£GÐê2â}Ùqˆå``N¾¾v¦_3 |>+ælsȘPC° æéíÂpÂ\þÄ5mèM í3 êýÁÊú@O¯Tò†i’ añÜÅ=è µ:cxlÃo¤„6aYsƒÈ-ØbÓìÂ(Õ½Ñ –go1‹°;ÕBi ›]¯tDL>ãI*+ûVã#_Gt‰ebÙ·›†ao ¾ZѶ8y–ðP-nðetïg!æºÍí¾Ë0Š=è¨;Š…¤àc¯ºŸ±W1Z°†)<#;|j»?5V`›gñ¡mª°É±vRBm–8ŠM2bJÃTÔŠ€¨Öðß­¨6ω.× õ6(Èï2ÌÌÃ1…¹#Íyã1O þv_Xã+4~†Dçß‚+¨ñ*ˆšœîˆÿ WQt”ç_ކ,oO°ØYY¾€ÉVºM§ß£÷èônLöÓgtú,ü\<Ü™*ÉWët'Ýû`سS>E÷è´“(ÝA¿ÎÏÄA¥wét&Ò»ÀÍò< Ç:K§¯Ñ_éül¾Fçç@Âæc2¯2Ôñ,È`ÉEl^þ‚þRçmL×Ùí,Yg”1…ÄrØ£]§oÐ_ƒ¿1Ì)ÂuèôMú–NN_Öx‹Î}ìVþ„¾¬Ó;a¦l:›¤óµ¤Â][ßR³¸©©®¦Uãëtîçç:gâÐ:_RÁ»x·Æ¡ÄB&xHãaG€C¼k6b²‰oÖù~žN_¤uv:Ó4~¾Î/àêü" ‰_Ìrtz/Ý®óKp-@ÂJ±ç¥LÓé+¸*¯"Á£QFaùùeü;¿\gãø:›À¯ÔÙ46IãWéüj~ί~Ò‡—‡_§ó둨ëü&—µéüf¬»EIÜ Àü6~»Îïàwêü.\ã}ôioåÛt~7ÂÝÿ§ó{‘ÀÇ‘7¬ßuìvªÎw©ü>Lîçjü!? c±éü,÷éüþ}?ªóÇ€Ç1y›e BTÿ€?©ó˜ìBBvó§t¾6Á(ôÇ8Û~Õù^>€É>?´îçÏèüYþ2óyà/èü‡ìs»Ù¶8ôbèüG°!ùQl_D®þe}äðÁ ÒAÒùOøK:ÿ)ÿ™Æ_ÖùÏù/tzÖ“ÿV5ãJ=K’0[gËù+:Yüÿ•NŸ wiüu¿‚]4Œ—¢³+¬ß¯‘óo"¶·øÛÿÎßÁ»Hýoùïtþ+×ùïù@ñ'pèu¶–uêì,v¶ÎÎe«tÖŽI7$ü}þô‰õh] nÂSóàäiüc‚Ëðÿ“ÎÿÌÿ¢óO±øÿ«Î?˜gö7þwé?°øOܾ›Ù‡uÿÂâiÈ‹9˜œŒKþÖÍ‚"ÿñý›ÿGg*²D“\ç_ñ¯uú<®÷7ü°N?¤tnDÃpiŽèì.¶UçGù1]%ì]¥*ÓU¥ '‘~ÐUƒ«ªš¤«šêÒÕd¶œ¡«nXD6iÀ!k³—z#¥Æy‹®¦éªk£¦¤š¦¦ël¥š¡«™8‰‘1® W2ÔÛñuÄ´«`“u5‹Ý ÒªfëôI>ÛRØôËjŽ®æªyUéj>’;,@š Õ"]-Æb‰:RWGáW©:ZWǨy°#€&u,huœ®ŽW'èêDµ À§«“T®–«š tLQ+A–Ô©qºÞäÒÒ^_h‹®ž ž¨©'éêÉê4]®ž¢«§ª34µJWgª³t†:Žþ–þNS1sÔÓtú.È)ÛÈtM=]W«Õ¹Îí• ¼ÒéèûšZ£«µj“g ‹­ÎÓéô}¾G‡Åù:ý=~áæ Ñ5u®Ö« uuK†³¹ó!$ †üÞ€éªa÷]mDÆ5!ƒ"V—€ÑU—ª#Á¹w.&µ&ko˜ ‚ [†„ÕaâBóu-ŠI‹Úª©Ëtv± K¸‚µ9÷}|”…ŽlþKÕå‰àbÑ•®žB´’]¡«è\¨«Q8Îį³09[]£«çà:{Õ6]mW;tÕ§®ÕÕN,®Sýºz®º^W»Ôn] ¨pÊ»Pþ®ô5uT†U!°àAµGW7€ŽPC¨ð®c×ëjXèìFv“N_» ö²çnu\ éêFu“®nF=¾:ª[Ôótõ|Ø °áBõ"~Bÿ¢««—èê¥Àõ2ö€N?¥Ÿéô_ô JF×™…ñ‘ì)â>\?ßšHÄ¿F°QW¿zE½\½B§£Ÿƒ+:´g >x#ü§©WêêUêÕ(-×€C>±®^«^§«×«7€·««7âö»Iý®¦Þ¬«·¨·‚ÿ««·©›œ’l\E˜~²®Þ®ÞNb畵¥µº¹9~'& %RZ›«›ZªkZë7élÛ ´´Ôµ¢â¬kiJJÒkT7D]s}Kk}M %¬’äú–Å Õ­Dm¨[^× ³§Ø˜_s]5DÉ5‹ë[[ëà[oÎÕ õ«ªç6ÀVLJ[jÔ5V—êêVúLœg&gÄÛŸ8ÇLúó¨×zÛ}šº’±ß"–„ðå[EN DÜç8HÛýÉn£5¶ºž’qßæ¬Ï9„uð²½ø#®¡>b^Ú=“-aTŠíNÖ¼üUËêÅUEn‡q^÷‚$ßy¼g/ÂcÞÚ¼ V/»a¢‚0GWÝÐR'ÎytOZŠ3ËXHï¼C¯8þ­¤´‰Á±©@Àø#~o×â<ø·Þˆ§¡¸ëjsÿ7ˆÆ™Î çlnl¬őu° c'’“s!áuH–8Ï­îê²–oxzœ×P5Á®.ó”Ú·¸¶ŠÁ›ƒSrÒÿÐ ¼—€%‡•ö—%òÑB¢G±' ">«gjÖ|£Ï,Eð¢~-ž§ˆ;`ž‰¸­K¥DoxäÖ€k¾êrÜÝf%º¹µï/p¨` Öa cúŒ<þ$5þÏð ]’*¿ÌƒóQ†uª·»d¹·«à“#›­ù;&c;¼ˆq¯dX€øë‰DûmÈkÒ¸ªjó&jÍÿ€ò¿»=-´Õ†®Rðf ðÉ8–’z¥VMJ¨oxXÜAM>¾ºq\»fÚ.hQñˆûx!fœ˜,ïïè\Ô£a(*³9ͼÅ4oqs:üÞÎ@0ñ·‡—{Á%”px­/®$䑤¶çºx­8G·ONºƒø>¦¾©µn~]óš©NuƒHǶØÕ8Œ“ƒÇ_8&Êbœ ¼ØÄCÚÁ§—Cœ¯fÞ8.[sÄÖXC؈U°}:`‡¬CމΛ[Ø4L9Ÿ¯#\ƒÄ¾n64KF{¬¦×8—̨T5!‘®7Óik‡„šÅõøà.§bÁ(¦²âŒD/–‚NóÅR¼ËjµÁâ ™²ßŸJ)1í­ÍnRDGéãðy£›‚5ë¼þ€Í%~I³#LùÜ|[@Ým„Ø9éd⬠$Ú(©þ/¶_‚ã¡ ÒÄ|p¾’.a±ÅSUÇ󢩴…݈»Ç°n\aáC¡…ÐѸŽ/×ÛÑ!” ‚M€[xÃ*á:TT:.Á†º‘±›ŒL“ã¶'#2PðI]äÛ"ÞÄâd¥M o2Ìʱ÷ ¥‰pYÞñÌxÅkHÕ†üq¤uˆúˆ6ø~mhpÔ‘u!Üþ!¿Áq­ øÒÁ6À:ˆŸp—¶ÕþD¡ lè7ø@LÞ"ÛoR¾M´›W¤'”5$8¤þodÜ6Bbê3ÖÙŽ÷y±-d¾€°Q’^§e¹Š£ÅÞ§8Zœýr <°i¾¸;c‹õµÆå®mW'6• ‡ä§xêëž,Ì–ñ¦5+ÑÓä”ãŸ&Ò Ã<–°“*^˜ù­;,Û#òÉCßB™úÞq5é[c Á‘ê¯&±Üü—ï*²@—6êzÀš¿Nê9×ñ‘`¼*ˆË ªÅÉžSþ·§+Ë;I£ˆ/23z…ÿ²Ê š»¨p8ÒR׆|ö·?vA4hN=øåÜØ‹#¨Ã·F=Êð<>÷î^–|º$§ÛåG55jÐ#šx‚ôx^°S¤BbÕ«j–àvåíyð­–þOü]5,©ž ퟻ¸ãmé0WЈOŠð¢Ñ`Jfü,ÀÒàÒÿ[îÊD¿¶P:Quc/+û:¤‹,–®ppC£/â54ȸ²¡¹`B¿}ˆá€à´· ÚÚ Úýúã÷GÆdøº{"[ %%ˆ?¨‰½ó³‰)Þ8#véÛ˜Þí¿âpü”Åî1µ[Þn{u¨³Wò;¯,Ñ›( jjbÿyX¹ðâ/SŒ a-=%µ‰µÒëšœèØCXÅøNÙ~ãXÅïxVæ\Ù!ϸ¤ 3öuö:o8nÃâÁÇâ“jÔ‚mKJæ ½%cb1¬ZJšÄO?D„/¾r1†J`ñRýaGd‡zNøÒ&ÁƒÞ‚ RLŽS¿$Xþh$në É]ñcxìÅo¹Ë]e«ëA_àÁb°D<ŒÃ›!ó9œ40ÍöÿþŠ1Õ¡ñÄdá°ð®nkùÆ|›½_z<ñkÔ7x>ïБ±c]t§Ê†ô1Ò7à…TÝfˆtå!”Ãí]êléô¡—Æ÷Å ž„ˆeŒ§þƒÎM kgAâ.wy™XÊ,Ø~†`ÙT̘„°?yŒãYBé-˜§=voaá0Ö¬~ð,†b¶q“›°„‚—5µÕ­uqg_ ^“ G+W­dX#P”‡jù†`“æÇi0…aÒ›ðR5X‡Q‡Á†‰eõ†Nxñ”6vågþÏ8ª²Þ’;_n™@Ò‘nönZ¼v­ˆuòË‰è ¶°4ƒŸv ' y—VÏñVÕx4h„G\þÀ$öØÉþØÓ§d—»+Ø–ø2v¾Ý–ør0ÀPQ¬àdšùd³É·I<ÍÌ1+ 4/–嘯8Õ¸ÄPSo>Wëm3–> &C‘ â‰~ƒ/Љ‡OIF'á.^)!³Ž5w‹`v<ŽK)¥O;w®ñã‰b4 X=wx$.Ã`„äK\ü´á«1ðI€RÄW3<ºø¹íb—,;ÎijŒ§·µ½=`I ¶ãŒÇp"VüÏCå…îLƒãËšë‘„ ¬%ù6ôz»ÂC÷«ä‰%¸gÆ£î`hË/.CŠqÜ1ÏÂóç¥bÁ¦ˆðÕ-<ɶ¢a_jj‘ „Óä›M#Ò‰m財ç¿«Sa³Ú¯ gß§ö¦&~Fƒ¿ésÀë¨ ö ’][Í+çÖÖzãg-Roo‰;Á’¯JøÑöPPœ½à/>êšæ7Ô·,pþÆÐh™÷`8­„íoXÎzÂ*ŽßÃò¦Ú°FÂè9~ k;w«®ÃÕaZïÛ"~„÷Ná_ng ®E•g] îhÞâñ`@xzyâ6ϼN·Yß{¤á¼‰³­ø–»H¼,E k†iMµN— ]_'è¶C}2šÞFo'”ÞAN'sñI"!PÚJ·Až…¯@!gø$Tä÷Òí¢}‡€#ø(UäÈüAYÿ,?LûDþˆÌ¿/óG%Üc2\æOˆüt|Z(ò'eýNºK”wKúž¢{DÞ/r‚ÏHEy/å}ôiÈ2ð«ÈŸ•ô<'ó熯Å<_týP”¾ÉåK¸éA‘9Å÷›"ÿ¹È ¾ù+²ß«’Î×è¯Dùu—â‹Q‘¿Ißã¾-ÇýÌß‘ù»"gø¬IäïÉü÷2ÿ}_䈜à5‘D?ù'ô/"ÿ”~&ò¿ÒÏEþ7™ÿþCäÿ”ãý‹~Y/|}Iÿ ôý¾’$’ ùLÏ^B=j?a˜(žý„¯ÜKà3ÉÃú‰æ ®~’ Õn¨Né'º'‡¤ö“tOÀdxÊûI¦§¢Ÿda’í)ÐúIŽ'ºäŠ4:æ¯Ì(å{Ɉ~R¥B@SÔOŠcŸ%±Ï‘Ï’¹‡ŒBrà“!EFUi?íÉåýd V(|ÑxáJ? ýÇ­„iŒï' mBÉV’¼›Lì#I»IY?™„uð7ÆYínå+!©€±'ï%SúI¥+J¦FÉ ž(9OZ‰U€üä~2 ÊÓEy/9¥ŸœºK,öWn!IÇÈsĥѯ5úFSÊ5z„ªÑ£Ç`p ƒz¦F#,qó1‘–ã ˜0f¬))H y¦‡ö“8™¬(©ê'3w‰‡2…q š)AUÊxB4Ƈ’²ù¢DæY[ ßåQ¢d¶±sr¦JVÄp+ »€¤ l¢ì[ ÿ‰­B[§¾œ•D$6GçÜ26Ivž-9:ÑÒ'‚/“€/°5²Q»œUEd hlÇ]°°ÌÃÊ%ª“äf›è1tÊ9ýÄk‘´´)Ä,í#팘òQÁ&Kw"RÈÏ´ÔVGùâSw€1jyQ²6†§“‘>2Å yŠÐ°‹SË£Ä?@Îe}K ºËÕ˜À$§#bOkl 䤟¢J7+¬ÐXe*9• ‰œccXwùäw¼¶Ì/ä.P,üq?ðÜ6üºÀO%JAf'ZÂT(…"-FbÐdÌhv’—ŠHðÏl:Ùjª–(Êõsgªù(Â1„=Œl§­DfÖ‘AâVè¦Yâð¬\Ûœâ°á^ã3´L–‹» ÌûæUw”„wňˆDňð𢽤!’qeGÉÆm¦ω’M[IªQØ%[b$ÍåöJãk©c4¸)E“a*Óm’­$’ls*’²óñ(HŠS²Ý„áO[$ªäî¼Æ@±0JÎ7¾.ˆ’ MjÊìE†í½ØÈ.AóÙ ÚáÒâmà! ϱ"Q™¨ÿN“Å‹ËïÓ,-üdʣ䊱HÒ¿ÉRÉùa1Ä@ni0‘)qÈ$ON³ÈóIò†!ËÍ[‹$e²«äQr›É‘(¹ýŒ¾c¯8h?LFP0Žø µÖ>ô¸ÔÖÕÖÔò¥¥Xòp‡©ÒçZ›Ða°¯6ÛkŽqµ9F­Õ½]v?µh›°¸À«;QÉÑCB‡8œ:a¥â6Vl†„ç¦6&ÒÀæ:kÀ9àŒÄa”#ÔÂ!¶²sÄ3 ˆ.ê<‹¦CR˜À!1Üј I"JŽr:HÝ‘ƒcLg{¾Õl÷ ¥]7XŽWºR²î2}®úÄK¸Õô¨&$`«Ù}kÍU 9±y<47#°ŸlØðnˆ*v“{öïaC”Ü‹ÙNûÈ<6ÇË·\©Æ·‘T£;…¾ŽN k²Æ·“·ÝôY³%‰|Òí¦€.µ¼j»G ªn‡‰¡ÙšœÏyŸ)Å- }¿dÓ÷kMèö¢ö2,Kˆà~Ár¶B6‚f4OÙÐ\ ŠáÌA/>Ø4y§|†ž I¡Ôу9ä¡(髨)åc%[eôQ^ûn°’jh±ÔLµ¶Ãyd'.(øfÔòß ¢ö¨€w…¼¢›EèGxÄ ào¼Ñfýˆ+c¿íƒë¾Õßëxô3Ç#¿ gBýmF;ºOôYOùòX”<¾½D0+;„û%fÑgl“bø„‰<Ñ4ù ɼ‡üÀPOî!;o»‡L„~»Náh=y`Œw7•OŽ’§&¾ð%_ ûž¤þ¯âðÆ£$Z¥zÊ Ô½do•Z îÄ€úûžò½d üu¨m¬ØéÌûlEäi[Ž `ûûȘ&øx¶Š’ù\”<¾o­â0Þ9°³b€¼ÐT%?ÌXî©øÐv?uRü#Oùd@ 2‚%/î&wâx‡œãá|£ä'Ø Ÿ/Íöï%?€?Ê—Åz“ÆÎ':üÕÀßø»LÖe¾” q7¾í·Š0£œÑX!„Š‹ÒBYBç¤ÌÂZÈOÆI7z`:?ï#%ÖEÉ/úHž¬ˆ’_ö‘d£ å1Aß8"|é‰åbÃ_uÀ GP>àïµ(ù"|Û2ÉKYo _#,Ñè¥ô:z#y†ÁÎbç@¾–­gÈ/g7²›!¿“mg÷Cþ{œ= ù+ì-öyFêªñd~Cvƒ×CµÃ¤ü´±_‘Òì´ì­> º[c`AŽCÅo%èÊ‘Ã$>]_WJZš[ý†Ì›ðªH4 ûª 1™‡‰’'¾•l°ñø«`©Ö€Æ@± vlÒá`N+¯€ôÍ(y«ò·,¾%¿¹—Œ©0B«Œý䕘ïßKÞm®ü¶©déw1Í qNÞxŒsÖKŒÁF@%F¨BöF•äÂJ¾gj/k³I Í”, ¢ä÷¦6n7ùˆªœÜ-„h:ÏåÎ-ŒV¹£ ¨ÁcI¨Ê–ƺEj* ++ ûš`Ëã~Äõ¤Uª2=)7 æsÎýäÔɹIQòþòA•V ì‡ð÷Ç(ùÈS í&‹ ] áiÈÏåI´ïØ‹°³AºN#õ¤ÁZæJâ:JŠa ÍJÇÕ9þ–*דÑXÈã¨aSè)_£pÆ>9ãS`ƸNù(ªŸ€Ücî5VØ… °Õ–@—â‰ÅßH؆þféÆy@–-4•¸ŒF_w> ø'Töù=¦RXõ?c½8,1w(ì×LCA”’õ—(ùÔcu}½þŠ«´œ‹hÔûÄQǤÏÍЦ¼B…ЦÐÿ c<|ü ”“gèàõ³†r‡â5fXhF4‰c¦°¨ï#nÐÆ «Ž ;¯ˆ#טDfBâ%iø0ýÓd”c¨ÿ DÈr¤/·’bÎ/M"i’Ⱦ£G,§§.æÇYKtÂdC S¤ªtÉ)¨RmsB!ÿ¹ÜoA²–“ÕälR-ÄÝäô!ú8}ò7é§ôsòo)T3I^^Ir>h˜¤Ô#d:¡éSJê5¶.©dê1rªæ*ô£ ² š’KÒ9ÄŸþ\P;皘žCâÉØx´¯U¼€$y<ÞÄŽA“S-l])X„s,2lS€ø 7f”|ý ,&­r¡‘ýäóÃäH•‹V%#ÀÑ­äIÌ¡5v{ xwoJAJ”’­¤Zvœ„e¥¬J/ÐE¯|ÌU¥¸ ¶ 5J•¾c¨¹I°×˜ø÷‘fìÅ·’ YŸq*g¤ÀŠd”ïpVOÕ°P9ª’›4@UP!)UÉ}$Ý´+Ï÷[\ ¸ ’hRL§Öý( q«y \¸dyD…[O5Ö%Ї!Æ`SŽ’iÆR@õפ(='¯lø¹øÏ@È…˜zÅ ˜SæVrä°²´ ~Âô¯Ã\0 ø¬œáj•˃¼Ðª@áéÀÜdXŒª¤‚$ÁÇÌŠ’Ë Á—EX |Iµbú§$I®Ø*ÇŠJàIf…Ri,HªR WP]d%S@øfXšµ$#Ù$É´1F#ãM&Ùª‘+¨†…v Àÿ ’›•“÷ƒiËül-Šgq¡{P¾ÏtTyÓJ£Ô…Ö…4-s° ˜T¾‡&ï¡n`¤¥)¨âêÚCS‘‡QšVåÆ,½ÊÒ( i†²•é1+“PjA6cbá&ô(Ç)Îm4 ²Içih0fòì¥Yž=4û)ñì¦ÐÒÜš×­x¢tD” …ý4×xRÊ6°uã”$,Ðň ì™_tÏIhî-¾:Sù¤k¶Ä¼áêlZ²nŽg?¹²¸GÙKGõÓ"ìz‡–"Ó[ ßº+¼ÃcPD÷Rìép0fò@c˜E$WÂÒ¢ë”4Nƒ£á£ él@Z¸ÒäA±Aݘ~:‘º±‡Ðã²v¸Â[¬ˆNcÞAÓ4^ ÂÒk¬ eà‹´à çÊÛ¶’r\Ì•ýPÆÛ[àEþS¤"N삤ÔО Æ|c«¦<3VÜd]‘4°ȊSð°,wèÇ‹#¹~’×GFÐ EÈý(,[Y±—NBˆïóÇ #J`F›Ù‰ú*鋬 žÆŠ(-oš¬ ë[ŠŒ E†ŠˆI ©€? ÅæMÆ]¢ dñLV¥ ƒB‰Yð@!cr’ehÅ:¹ÅæQ¦õ™jlNþ¢Î³öd?¿è[^S¥S+@OÑÊ(:§Ä ‰œk# âOR 'Ãß™*€žvö0x¤ôÄ>2#¾î¤>2¾‚K”²îdðt*’„:ä`L¢túc.#~€ÕI'ç‘ -—,‹hH?µÎÎN£˜¤Áv=Ü2c ]ÐÏ š$Åñq¢p" 9]rQ:l“vÆŸ?íŒño'ñO'Z©¦ésñ°Ë #_È.’#GäÉÁj9òJÛȧÉÑqäÅ[æxJ£&ÛËÀ¤’ Éu,ƒR+€=MàüÐiöCFµ4==Cƒ‹Ù%’‚—¯\8tºgT”ž2wtòmàÝd¦Þ"ö¦ŽÒS÷Ó+Gï¥U±‰‰sÜBØfìRvÙ0g…p"œáw¬[)ûÝ-Ä…tŽ–\ή y2rqAT”žf“]É®’7 Òõ9 8l­F§Ø`ûÛĸßÁØyXBn€?|¼òZÜ_Tn4\žƒrŽ¥€n.üÕDiíN³.JëvÆ·_¥óâ+爉 ëã+Fé"G]”6؆lÜ™™”Ž<¶ì·ÅÛ â>B8ÍNÉ‘“ž‚!ÊÕÖ9ÛDyÄU´Ÿ6­ÜKgÓ%QºÔçføŠÒ#b$ô•„GËåÑ#}5aó SS^c©˳ù y+ñ$L§Õö&ãZ rŠ‚ØþØexžŸ™õ N—ØÔu¬ûuìzÙwªì›q ÊÇÌ>óºOŒ“=ˆÏS T¿F¾‘ÝdÝ©½ 1ÊÁÞ0´Ár‚´…¿aße7':ß´¦v »5fš§…·%26Ôbáí–±©´3ƒ"zÆA’VtQ•Y`Nè ‡9ÉÆu»Sv>GîšyxÊp&µŸ®„¥_ÕOÞ–çÉŠ¹·£t5Þ]¼ >svñÝâ áíâ(=ˬ=Û6’‹(YÙ‡I.PŽÿ<˜m–íÞFÓvÓ5;å0Ï’ê‰çc4o¹Ã!JLÛØÝÓÉ’'#C’T‰eQ©‘¶ Õ;í3ÏDZî±\ƒqCºÁ-uý4èñ=v¯ì±H^£31^¸)$çDŸh¾÷Òv°Þ}$+hGƒ¨-—Fà¤gâíl‡DÌúˆyEoôD÷ïÜC¤ø±¸ÔÕOÏÅšlÚm(¬@”W`,{„}ߺTÇJ×sß¦Ñ +³ih7 陋~Úƒ¼Î¦½Àw`xBmÄÜbü%Öó¡ Ç—¡ÁØC75”Ä`žnF•ù–}ôÀÃaS ?ÈâÙ‡|$ˆj>ÁGyøXÇ'Qp¯ïVpO ˜áEVÁlÍ.ù£ÙQ÷2¼/ˆV `3>ÉËã<œàáþNâS<ûtŸÁgyù¹À© >yã!_¢_äáKŒùr¤ü ϾÊT_ã¯óð ß ¢ßRðmßQV%Õ‚Dú ‚ïq!¾À÷ñƒjÔá‡,Ôà ~Ä‹ñü”yþLÁσèÇí<ü‚U!Þ¿Ä#<Š_ñò×LúÆý–éÇÃïƒØ‰Gx÷<üQÁŸþYÁ_K·,#•hN™“=SÖþxloOÄÅö ¨†µ5c§úS‰„a 4 _¯ÐzâZr²g[*×5& Ö¨®Å®LƧ*’©ÈÎašhÆ4õ¤=¢MÝh ˆ!Zy߸fÚÞ¸NèUÞ‹ãÆÞžË5kjDK§õذaÙľ©ðÐ(]¯ ´îñu9:UaÙZô³ŠøÓt«ijÓ’}cÌÐ&“)Ë6¢–G®†=]¯Ü{½eâZ3•±¤¾ÕœÌ$H;kå9[›Nj #ꥲMcrR7=¨Æ=%¯¨ˆéi{ŠL×,{(F´†Mv­÷ÐnÏ$öê&[ÞÒèé”áðk˜_Œ ÔO¤ ÛR¨ÿp*99 ïϰ‘jL¶Ú­›š2‰z}žM“Úc’w\ëæèèàR铱œÆéT:R€’±5[g•šó‚,‡'v•fêÆd&ÁQ“JZ¶©‘;4¶ÂŠRáÑùP=º*#.ž+Ö”¼bT·2qÛ%æë.2’†}±ÀòP©°ïð÷§bcþtÆ")|!Æ-pHQl:*–”&72É@‘ÛC%¼Ë\ê™~^2g"PÇö+À5Xº]Ì·aR·)¡Èš­õO¹¹Ðê,ã8‡t{n½p†Ì°,J lFl3µ3&û¬=TÒ|#;‡Ùkéòþ)=zC.Hò¼ÐئY$:”Lêf?°Å\/•OÔβ[ëŠ÷Q}wjˆ·%°1´˜¨uŒŸI¯c­ â®%ß ‘§Åb‘ü¢$Ж'D*žI$#Ñ)=¡97×±ÛGÝR‘K‘5¡3?Çæç–-Ü/C±)Ó˜kÚq×XyÉYšvŸ‘,`»!ä‰a #9™ï±1Ymkcf~pD*>;®â&ܬà¯*þ†¨Š½<ÄxÐyØÇÃ$¦TüÿPq=¨€¯>SB«8ˆic¸JÁ?Uü ÿ&y SŒ}æQ‘etûiÂ<¦"Žk¨:•«­*Hªxv!Q^„«x®evÿUñv©çáj&°KÁ“*½šB…=ŠX¢ Ÿð«¢BT*BQE•("¨âù¸YÅuÐ(O÷ÐÑ5¢ZªXªb7ö¨¢F,S‘¡Q+êTQ/(PL7”´uz³TÑ(êò6äÛŸgg÷QØüÔêЈžH™Ól…ç*¢IÍ,Üri…h/¾<¨¢MÔ)¢]g‰U*àF öÒ9¬ŠÕ…¢CkÄ:ElPÅFbëtª",ºTÑ-6©ØkT˜4ˆ³Él¢GœC ?[ð+‹ß*)¶~"¯Å³g‘°zϸÏè;ȈÄPO¤íi7Ho †¶ ^68zí9ù—t¥[«‡ãàÁ´™»kÉR¢£KÝ ' Û™•ôÌ…†:Çq.u#‘ŽëÛµ¥ðgªOÞm7>6¢%5’rÝ£¾ÝC\_*.Ý:¤êYl*zø­£µ–x™åf_¾_uÓ¤ä‘.Ñ]ØNJ7x0J­•ÛØVËû8 ºŒÈÂNÁMiÝ´È΃MN%ëÇɇŽ6ç{ùIºžåèÚíóþc¤shh7ØGÏBAÝÍõ»©é¡WnÈéÂØ4¥¢Êo7éN³3Ä-%æ§Žç‘Ï÷©UôV:qœ_áòšnÒ¼iڟʰŠ©SùàN¡š…’›Šè-l'FèAØVºK[dçÀ<úÜÖÅÁïHY†ë¥Âêí¤ßU¶AYYM)EÆ ¹±„IK¥Âi©¨±,Ó î“\9»ªrë7•rë>Eœ'°v”ä̤êK¥{)}JM šJOK+„uÊIõe¤ä€¾O£7Z†H¨ŒKذš~Øä4ë nõ«‚F$'_©ÃëU‘ý®¸ØRž):è7v-€ô¥„FÁï8øïj '$¤‡×Ô8ž—ðóí¬©r`LB]Â}Rgäð7$ê—ü¨çp u1Ü/ñ¦,ØÌÈóôD:ú'éK¯0í?f÷ Š$‡ç ÂwcI>ø]Pá‚ʰ8 %‹*Z²†¡zbjKÃ]YÔzÙ‰ã¨åãµUÇQ—E=Ñ4L(shÌ¢‰æÍD¿<‹z+³h û£5‹¶ð Ú|ÇÐ:A“á§3íâxV«\°Úw9Šn‡\Ä%¨ D'­™Áš¬¥&æNëÄCG±î~½~f±‘¡S¨# :'jWûçÎ"ÄHúúfѵKÎ+=s¿g^å™Wxæõžy“g¾Â3zæ«<óÕžy‡gÞ}›<˳s˧`hiA_Ýá 2Œÿº,ÖÞåð4ú±dyÍÍóf±1M¯ÕzÂR„Ð,ÎñÇfqîIôÎâ¼,Î.»Ó]bg3ù¯4zuiôªèó9öŠÑͬn1º RŒ~}ØlÅ;Їc¾xçéôáð/wÆ_v§²ìŽÏõJLz…ýòB¼Hff3å%gf0<‹gpŽUæh^œó.tƒëOعÈYp¼¢‰¦·ÌóÙèú­å]»ü%óÖK+=Â/ÅËäþ ¾‡ z rb×̡z9^!©®!*?Á-]3¸h W‚úw"àÀ-¾‹ÛÛîÀ:^´÷>@¾t&÷b UvžŠÈ->qøÉ‡T«ÿq4ŠÇéÕªÇ뼯™·–þAáFg}½#ݧÐÐÅ‚Íââ×é>‰KŽÌs«qjUðZZ¿¯—|H`æÓÝu/ž) …¾ËÙzõmÊuG±u!ÈÕY°’y®£Ÿ|xÃ<ÇV)Ù2ÉÑ9$"9›¿o’„H›vÅ6×áý”íYl;L‘BÈY 2Xв¼‰îÄ›ñÉD'›œun™Å¥|]K×,.›Áå†n£âÙtHO& r³+Þ&Nų›8IhÑ&íwE¡‚¬à[ñ6ye‹Œ•6Ñp–®¦˜Îé÷öù@l"*Ö/Àt#’[q›$ÙI&`V}ÌéqœN†C l'=fqå­^5rxÖoW^ ¬_Nówà’ýR穦ýÜÍï»åVX*ÑäÞ\!ŽHÆ;Nbç‚ÁÉCš¾ï-Êd—|tWŽ÷«i\CB\Bð*ð±# V¢U´ÐúQ±^¬ÅÊÿPK Œ–¡ EPK7Aorg/hsqldb/SessionData.class¥Z |TÕÕ?çefÞÌË#edŸl„EN%A$1 H€|·IòH&3afÂb•ZEJ­[]jƒÖÑX[+T˜°´‚ÅB¡‹mmµ¶j[ÛÚ½´vSòsß›™7“ɘ¯_~á¾ûÎ=÷œsÿ÷ÜsÎ}áô…Ã/ÀiºÂþ¦€gðü›÷¹ù‡ ÿT@†ñË¿¹÷Ÿlø>tÀYføÎ)p.0m@F°#*(a–ÊТ mÜÈÜØ¹qð¨¢ÀYÌæW•›Üä(4c$IÅQÜËe–<îå+X€Nn É-ã¦ÁsQÇòôqü:ž_‹dœÀ/e¼H™8‰‰“yþîMÍÆi8=g ››b¦•p¯”¥—qSÎVÌ䦂ˆ³dœ pŽ‚sñb^‚•ÜÌãf>7—*èÁ*/ÃÜ,äær…]Á½E¼’êl¬! áb¯T —ps‹\Ê\µÌ_'ãÕ 4a=OiÈÆFœcýGbÎe,`9³_ÃÍ ¦5qo%÷VɸšJâfñ?2¶(ÐŽk¸YË͵Ü\ÇÍõ2Þ Àz[ÏcëñFn¼Ü\ÏM+oa›Œíl™Æø­ã¦ƒ›µ2v²JŸŒëù¹µùɰ‹•d *° »¹ÙÈMHư·aDƶã&7ã·Êx“;ñŒûÍ Ü…%2ÞBOᆸMÁOâ­Lþ÷nãÞí2n—ñrµvoÄÛê kÎú`¨£¢3¼ÑßÞZ±Ø W!Èa-öfŽ&J ®n-ö…#Z Ò †´š ß¯µEÄ”KÌS ¾ŠåCñ'd:BZ¸Çiðv#L4ËðûZ+ꃎ«µ­K½áNb nµ­'"q«½þZI^ýzï&o…ßè¨XÖºždOvXÛØ£Ú4!sLªÌ„°ÜãªnGgwtzÃõÁÖeÝa\ƒ0b/Ž4j›‰X»˜huŠn2QˆÉ=„ÍüV&ôÙ.ó|‘…eî´;ôâÕ–š`;-6¿C‹4õ´’É¡­+‚›¢—%ÉZémõkÕ,¬xûA6PZÝ ±¢„ÔCH]3L±#š"Þ¶ ´l1UÆ ?M!¡0¬Et}MZdy(HR"> œ—¤T¹Bç¬z„Ê¥U0Œ:i©æmG¸æ¿’–¼Àä1ò·$=M~_a5Ñ]W[›aEXw&I“ŠÜu•å?ïˆS4{¢€w“¯ÃK˜W茱÷¿vƒ…´ùƒa-N'g"­„Xž /òûãC´YîâÕ2~†L‹® ya¯8²fÆœÖÁÒ¹6¿æ ůt ŸãÐ\:6ùÞöõ=‚¶*ìí `Ð  ݃Ïp-[X>„ ®MË/b\×ï¶ÑQ&K‚¡З í ÄX¥Ëó+jÝ=äÁ!ÍÛUÅï”ñ³”%Lr«ýÁÖ&­£‹° S¶ Ppå–6­›á ›ØjLl³†©~¹­šoñ.’C9y9E[l­iZ˜ç73ÌipcUwËx»­Z7|I(صÄç'[dÞÂÅè¨LIrÈÈÖn-\ÁbØÓÉõƒ2Þ+ã}zî`ªª“TU¤Q•FpuL0‰ G¼!>AÚ8X:Fqˆ4‚º‘"*’ÐjìéjÕB1R1ÔÏyŒ©FÏ8*< Ǧ/Ú«ð ô©ð|^…‡á sÿ‹ìH*ñ!za—ŠŸÇ‡)Šªø8.c¯ŒDz•ñ‹*>†«ø>I¹Î¤d)=âÎIÔÉèɸ[ŧpŠOã32ö©ø,~IÅç¸ù2~EÅç¹÷U|AޏOůñë‹ÜìçÑU±žVñ ¼¬â!<¬âü:Å8¿Ác/GÉU3æsÂ)!Iù&K>ޝ¨ø-<‘¼’$Wñ$~¡døAQ$-§ñ„Šßã*~¿'ã÷U|@ÁNÅò~„¯©øc>M ì¡åÁnxJÅŸpó:7oàO“ Ó}²^wIß„S2þLÅŸã[”êT|›'½ÃÍ/ð‰¿’ñ]‡)´¨ø†ê· À{ø;^ƒWUü=¿þÿHÇ’qù”EÔln˜‚¯ðÏ*þ…wã¯xFÅ¿áßUxÞ@¸(eºcR澯â?ðŸTüþ›wà?*~€ªx–íùÏ©x/¨8 QúÎO™•¡àfÌä-ª’„Q*ˆRë-êVoh‹B!ïÖe=³j)K•,„·d•lª$“JÉÎ2&¤®ºÓó›C> lÌï`þ *UúÔdÃcdXš§Â[ð6ïîaUR¥ㆌ)µ‹U)G™Ž¥ÆÄ2JÊU¥<¶9_*àu;©*…pf¼¬BUÍ*ÇÀ)„ÑæÑdè%ÕiÒ¾MÌ0–r*ãÐcÞt°óãÓ—Å©ª4^*Ráqx‚úòW…'á Yš J¥‹hË¥Iª4™ÏÀ1iJò$Sà ›Š0Âäl”ÊÒ¥r„©Ã9Æ„`ÊjÉô‘q2«›´ÒÚB}H?H7V•š¦¨JNà"ØÙë½]´Fµ6Ð(yÃa.r§¤Ähfjð¨ MMLíê2`çÔ¤ƒ:?Mé4Ìúœn]]ÁM\áQ²¬‰ KsA¡Œ?ØA†îéÔÔ‹Áªd“Éþ€»dlK»ÈÿÓ=²êÿuùqÐM¤€måºx Ãkö|-"o¼’[ÚÆ^_—f¼Îvצ«X¤{ìLòå56_w°6ùð$ù¯™Qñ…Ùµ–üÂÎÚâ5‚¶4èoçSr÷¶·'Þ¬îÚ5Å$;Û[ƒªé†¹“¯Iu©¬fo( \;¹ÔLfe´HE“û"¾MìéôÖ¢½Ñ5Ž Iæw•oZ¤­³Éw“&.däHýr±’ ¢‚®«[\ßëam»¹¨'¬ vuù"bÒ]’)<¸Ýûñ'>=B½ÝŽm}v‡Yc… „îºt‡+Íç-³6¼TóÓÜ\rn>-|•ë«Òyym€BØ:o›–á*šñRIv’ÕN¾D¦±*f AŽY2?ÃÅác”•º‡‡p­¸ºÙôèBp‡4ºŠÈ±‰«ã0»T’"½¦‰ç䨑<È{–üƒÅIJos§7ܨm¡5[âQàN‹’U\[É }áÄ5‚"E3…¼Ø×MRJF¬NùX•ˆr1–N;ÄU”‘‘rŠ~16ßŠç¤ u™7IÕ¿]b=]„–Í^©‰Õ&(†h;½­ä¬FÅìÚÁW,"Yδäí>V¡÷ýƒ”þÂ_+(…¶m¨×‘N”wGÇö 媭ç4ãS’¸Rõšò…$µ`cŒÝuuƸ‡¸Æ“t (ÆÚó¨Ëµ(_‹µÍº–¹±£ž27óׇœðI¬ieÆ-ž2¨{ðÍ>¾¾š ë«1¯-æê×°XŸwñPgþzÅŸ~êôè/È™Z¼¶Z_ϲuëÂTì1˜&¾k«?Æï:tMk ØÙr±Îºµ5eÌIʧñ‹EUÆ\%®ébéÂóôÀÎ ’€¶’^‹u3_(®¤wZNB¼öêžuëx/-a!¥`Ðî ÎlJE‰•:DPÓ C> ƧŽÊÅi.#zúÑnBF×6Xk2°Ö$X•¶N­mâö._@ÿöÖ¤µõ„´å^>†ÓÓ~YDâ%i+š ð;Ó‰æð¯m¡ærш¹ 4ù$¸JÒoHz‘VñA’œ*Œ•ÝÉ!=¾ sþHþÚ£cª××3܃V–®¯JÁ/SÀñN|Š]ŒÒ•çÃ’%KÓÆmL‚àAP ?1Q/¿2Ñùk‘øØ#ð¨x~Oº Šç“Æs7<%ž{àiñ|ú¨Kž…/Qûÿ­,EÏé%ý€%G@j釬`))=Ö’²`#¢ÜRÖöàØ'ä |¾bÌ/IÌÏ-ÙŽÒ(( e‡ ¡l¯Áú<|Õ`õ’* =g«m?¨ûa÷Œ‰9ãwRn9#%(ßÛ˜ §òrBÞQš 0¦Â(ê½@}Hç`² {ˆ%Ã>¾F¥¶ /Òà~8`¨{‚,ã?Þ^ºò–QSi)rZ‡HÑA(è…\§…:΃PXiéÓrF÷ÂX¦õB)[–›ç;c¢àêƒq&f}¨S"êØ^¥Ó:tšàwÆWZÊœ–¿O Á¶gƒõ-ôôè;cÙÇÏ(Ì9sêKÁÅYFSçV[Ö ïéì¾÷tÎÊ„²ìç@•á•ñDùV\Ç†ŽšŒ:f˜tsîŠyÐlš‡Ð7ðºùÌX eÅüqòD‘Ѥ‹µe—L<óKè¤] P'ã&1 &3e™˜¾ § ¦\“•ìÿ¼1|¾c /§½eE—ê§Ò³K\û¡ª—ÖXj,Ôº.c2íü‚C°a|.oŽ›¥/†Ð6²ôïÒwÑFÏô+v±Àý°¨W—9X[V¥Åi!ŽêÝPC§eN÷Â, 5sØáNíÉ&{\Ö˜AEqƒ¶[°oàp¬B°Ûå|8¹Î¾w&œ%»¾¯êvJ‹É±š°‡BÔ•Ïé ÝÅÿC¸`±þŽ×O+ãôDüKæÙ mŽ¥s^J¯WõÃÒ>¬+; ¹ôV;Ï´†>˜ÆöÒ©óØ]öCp5Â<Ž·<^[h‰B}óhàlÔØXÎ|ËŒuZÊYK–7÷Áûƒ^Ó+úàMR8#®ðšwšZôᕤ¾<ÕŒUº«3›Q;A¦dE¡…lY›…5B+FíZ=ÎN¯×ºì…¶Q¸Îã胹é§\?hJn`þ¬>Èoä9QðæâéòƒÐzt»3Þ‡ˆ#É;¼rf ÀEÂü ?$"œܪ5l ¢…hÀ”t¬01•s€bÞ`¶4Ýs*ªeøÑHò–×È£$áù7ÓlJzp¯§ZÏSm•Ö#ÐÞâ´öƒæ±q°\碬Dq´£™ß:=²C4É%3ÑÇÐÙ'‰îÞjñtZwÓqé8wò ] œE•Â?‚+à'Â\„dÍëð†aÓ=tÙ&_ªMë…Mt›ü†M]¦€GXd• ÷ºSä­Òí öcö½·/² û~z¦ÉðæY˜n²ágðóx0—D2ðüI äÖ% 6ƒýöC˜* ¨‘^W{KÊ™6p†^6ž’ÌÏÁXJ7ùY$õ-xÛÐñ¢—¶g-_úÒnØV:~Î˰¹*©s 67–´Ð¤…;íø¸«FaKSáÀs·öÂ\1w+Ï]=Œ¹75m—(RÝ–°¶l¥ÎC… ïX>„\‘-A½œ³¢Þû%üʨ©n ÷ÊášPßÅOèrGd7×SÐÎÎÅS¥á–£G`[Ki?|²‘2é­^©ÍÅW¨˜;J”Oͳ¢ØN[¡UD„#p[ áy»G>Û[\2…;<Ž$.Å‘øÖ‘Ã%Z- \vž°£¬žl—²×c'-|Œ?ÃVxÔøà—z”Ör'Ü ÷硆z“ð“+ù>ª¾_ úÃÔ{:ÌF°O<Ïûø.@3(âþZü¾‹:‰„’ ¿¡–kåß“d]3½×@'u€N:x˜~dø.ú¿‡?`Ï%_Q‰òÐ0ÁæòâÖ…E ¨Ëj zlj 癡.c¨m1Leás.Á°¼Ù%S€¶¨9\ö½ÙæQât‚šÑì†ØB¨-¢Þ-„&?wÁ;án¸èLÛG³] 9FGór°ÇˆAùý&p´% — *)cfþ/T¦Š„+á;©¬ãG>›ð|ªcr¨û'ø³1£Ó¨ë˜õ$¸¨Ö¾‹jí»À‰î=´÷60|_cùIO”Ï5 ¹÷ýÍÔ»§TôLõ° RÑy(‘á/T í¯q­å´^Nù<ï$ÈH7 !‚Ä'æË e_%¦Râƒø9i*Þ®ÿPKëòÇ:e+PK7A!org/hsqldb/SessionInterface.class…U[{ÛD5iì¦NšKRJ¡WP¸‰-—E–ÕD®"IN!/ùÖòÖU*K®vZ~ü~³c™È…§ã9{溳֟ýþ|OkЩÁ¡5Ç{ì;- 4Gƒ%+Ï„d™ê4Ø"Æò=϶”æ8°Í–ﹿLrXfdºþ®ëÑÏtxÜñÆÎ‘¬NØ ·FÜžMצcLdhŽé:GŠV%ÖQ›æÝPœ ši¿“ßpu5ŠÅã‘ä<ÔݼèÏÅË´×5 .F©4‚í7aˆ>—Aþ«Ðà¾Þvœ)mÆN“>“ya "äÒ›ØVšðLy/Çi.ø?¼óz{¯ñ"ñÌéʪ'ÂRvˆ#œH"Îz~–¾nñg +Á.2KÎëG*@#æHæV>$È.¡´j7°Gä)“IžQÜuQ!+p·ªÏ,,û. >dŸ„^ˆËõ"OÓ.‹_`äÉÏ(Ù)æI†‚ Ý=a§ÌHYÖ7𺒬¿£R]gš•‚§sVÜY¯÷”Ê5¸1u‹{ö«˜UiK5jJŒÝ¥KßÀf*Iýî Õ­4Ä”lSwΫè–ÔÜÆ—ÒF/\ .C.MbKf’Kñfœ&Ô \ ®êÛç{ÅVbÜQÉqI»ÜÄE¨6#_¹0ÔY‹Iæ´ÎôÖè­ª~•¥¸ÿè1^^W¹=xóÞãùθÌ$7œl8’ãGD­/bwa̰­B h*uÉcÆË¨²Xʳ+eo$“Ô˜ðê(Ù¨(ðM`±8ñÛú¿ô%Žk7ª†J¯£<ã!ó¬‡pMÕ4ýÎqÙTlznE>ä…L8JïM'@^$BÒÆœÉÔÈлÝjZgx®¸“^76¦5ÊQœw¼£ÿŸŸšì¦TvqÏ;Yòr„läzuÂã%£õzÆb<]™]ÐüÀü\†k0óh]Tÿë°€v­b×ѾT±Ѿ\±h/UlïÊL¼•™x«3ñÖfâ­Ïè¯Îè7fòmVì·ÐÞªØ×à.~†Þ†ëô9zn¾ ïÞ„[„·ááÝïÁû„”¶^ÚÛð!áGð1á'¥ÿ§%¥î³ïãÇWá%~YâxHø|Mø |K¸ß~_Æûþ&a,ÂØ„a—pÂ6À³*®ÂÕ*ØÉƒøPÅGøXÅz^Î@‡¸9ÌsŸàSÓ˜‘‘UqŸ“*Žòò1—ñ¹Š/ý¾”ñ•НñŠo±_Æw*¾g¼ð®@Kñv¼œ¦äÌEኑÝFÌ–ñ£À§p (Veò§é$Îûm#£Ûi²6·D9p‰s#pª£ðtç1O¤·0°Å^O99'ÐZ6üßš8Pª(R*JãT­–†ó×]R©4MQšÅ=[WfÒãFÆ6¹iùviÖ2-Û‰Áú"a‚Xvʵ¦µ…EÒ©å+L‹c´T©ւ«Gþ¬_«ãA¨KRÅ÷“sôö[‹Ok.tÍåÖh‰¢¶ÞØ¥O$mw%—mK cX¶:“3±‰ • A`É)êÉ–›‡ Âek<ÅYNør•ôÕwJ/ÝûUníââ6P2àT«×ÅÇLªª)Ò m™7Žv?iOêÉ ŽS{áFùõ¥“I‚pWKÙE •œµÅ0þAdWFukȸ‰H9ݼpI—ç—æÁ%Á L÷å…“‘¼RPi|É*cÏ„ž´Nº ü#3ì¦C_~0sé0»(‰(ûÀ©É¼KR²| ƒž‡]ôN ÑŸ® j+øfpz*ùNŽÓÏ ›à4 âo´’2¢Ä_+YÙ„Íž•ki•Ô¯-€W…´–%M‹³X’Å™ûP:èXûE:X«ƒôØÔÒ? ¹[°Õ³5ìÙê-ckIž-6µ”Ø ïG5/s ýz¸„Å®mA°7‘fîü|;”ašg§Yóí u‹t:Ùö§Nʺ—µv𻄿ê/Æ#X‡–PKâ2ÁÖ öPK8Aorg/hsqldb/SetFunction.class­Y \œÕ•ÿfà›ùø @ òì0@ˆ¦‰Õ$*’€„L›Ð?†‘Œfpf@£y¸jª¦­‰[‰£Öe·¶" TZ}¹í>º»ÝÝîn÷ýt×v·ûÞšÔì9ßw™‰v[~¹÷Ü{î¹÷œ{^÷|“ï¾ÿú®¥—tlÄ·Üxß–îmé~CºïH÷]é~SºßÒðÛ:Ü6éïèø~Wºß“î÷5|_Ç|KÃè(ÄÊätü,[þD¶ü©› (£Ê–?“ÑŸËê_Èè/¥û+ ­cþFÃßê¨ÄßéŒü{ýƒŽÄ;nüþYûn¬Ä4üX‡Gh<²ìÁ¿Èÿ*û"Ý¿Éôß5ü‡ŽÕøOÿ…ÿÌÿóÿÕðSkñž0¸äÂeYþ™Ž÷q…— ,‘FY|rê”M9Òi:¹ÈÍw!]ÇfÊzC£<™äóq4G§*”®ˆ;üD£¹:Z©˜Å‚ÕT¢ã6š§Ñ|íTÊ·£2+iß A¹k©BºEràbé*…ã7Þ§¥nZFË5Z!Ǭ”î#²æ‘®J:o6ì¿,‘­zræv5‚ª•n•ÖÉh5«…®‘îZ‹ö ÿe߯vY™d_QB¸F®÷QéÖÊtt×I÷1é®gcÑ ²“d·Fë5Ú@Èï ÆâÁ°?¾Ç õb„ÒÖH´»î`ì®PWg](ØY·ÕŒôâëÙÁX£¢&Ð>‚ Äwî ð¬™àŠó°!ÒÅSgÜÂÎO>KP±:!ç£Üf4j¶÷–§RÕO® ×h Þ Û´ÙþH_X¸·0÷ƒfl[_(ÄØ@ z˜ÙÆ"=L”ëï‹Fáxk$ÜMÈS³ÆH_gHDm$*ܦ`wcÀì1ùy­wšýf]?X7g EliˆPdÓ…ÌpwÝöÎ;~K5=}¡x°7 DSNjÇÝ(Se rŠp;Ä]?wfƒá`n5èã´W£}uÐ'K3Ò ÇÚgì1¥úB°'‹s¼ÙT·‘ÏÀgñ9ƒ0OºLOc€Í—.7È5;5òÔEgñŒAw;Táôu7E"¡€6è èækxƒƒ ³¹“(û­AAº“Ì C2¨G ÍÌŽƒ"ÔkÐ]¢þ› ŠRÌ 8õiÔoÐÝtA‡Å÷Êè>:‰}úqjq¥× Là«QBwTèŽÍ`dgH¦¤ã²x¿A¿B*2ê×v‹åf/ÓC OÊèaé1èQ:iЧ¸Ã×qÑÀ›Üѧé3=F§4:mÐãx”°0åxÛEìß`‹Ð“tÆ §dçg¥ûœøÕ=mÐ5èQÚ³Ò=Gç z^Ä9'$ÏK÷,ž3è<cq÷’x狲pžÍŒÄÖ/Ћ3#(É@“¦Fµr´i=#E©IˆsAÚdCX9õæèjˆôôšQ3áÄh‡ц‹É“¼"í©ËS¶§KXœ`‚1ÂVVÙ'ïM,‰^8pwò13äæ%çÇ<•ªm|yOUGÆ,\Ô ðÖ@›¼Ÿ ‘P_OXr³dÐ5žñÂ%g/+ïæqQ’|åžÙPI2˶ü`,Ù­gåõÉ·Œ•ç N•¬ÍfûݰÓUÌBµØ/Ý63‰ÍˆÃ6¶Œ¼ž1ûÍiI—mw5Ûü Â|€Ïo†›M?KÉ›²:˜]v?1ûEÜ 3¥;Ä®DÊí²‚xZ@®vVyÒ—6U™*žäXD£‘h]“ôRhÙ°‚ ”¬Õ­ šîñz%dämõ[Êe ÖÈ*!®ù®F§>ÕuŒ(œ±•4×xš“¶ùâÑ`¸{F ±S‘'I¦óã}« åá¯ðd¾„øÄœ`¬á ûˆ?n§#©0¹FãûÅ#ʹçy:Ò•<„¹Ê±}Ì)˜òì»+aÓ‡ÕÊÕ=·+ÐØÇ%§ßŒ~G6ÏÌS1ö¹@¥ùlÛáì‚i.;oëÌ÷…U›geº~Ù³ý.`»‚ýA©)[ÿÿ^®Ú.›âŸZÍvöÉ•ŒœžFÑf]† iÎ%VÆ»·{¬ˆ,ËÄš³Æ|þv2ÛibfžYáiiIÍsÉ4ë÷‰€œ¦g6„ÍžÚ™&k§G|•OK³•r3^A¾víÜÝÄÆoM©nÄø›ë[}¼ªûÚ[ljÞÒ¼mÇW*÷é·7¹º˜}§“l›LÚ¨ÐL27 š]ŸõýÝ>Ûáæ²c*³ìˆ2´ßby†¦¹q™èiniN£Íñ›šÛê'¯qÀ×¾SÝ«qûîM­|Iwï4›ž4Ÿ’5øJó)Ɖ dZ &­0JŒ9I¶¶¥_žAúÖ¶ÞúÖH§z׃1e{žk™fûöÖ¦úm\ §ž•D-Ÿ9ÁX²ú\ê ×ú̾K’˜N#–àláAÌG–|nÈoòebAþ`±àIùÛÅ‚üÑbÁSjΟ |Bí{RÁ3 >¥Ö¹6· åäš›a©TyÖ/#ç,:Hég­ŸWô/(ø¢Â¿¤Îý¼un/ãWùƒ §·vÙÞ2Fæ”dÀ/Ëš·,g.ïÜ{Ç "·6ã,ty¸©zù7h˜Ã«7¸dqùµQ˜@уp:×¹Ë\%îæ–iµe®н#È-Ó()/hîò‚íç™óšWûm”zkG0¥|RÙÜÞæY:lý²ókÜWC»‚-Ð4üº†/†Wøƒ/?C¥†/ixõfú)Êr¥Lþe ÙwìF6_YïԼͧ2·Ã,ˆ6€9"OM ÏÂ9ìÝ;‚rÝE9c_`ú>e ·NnG¹c\·Õjìãv„Û˳ÚÈ/Ø^ñJ_{ÓCÜå]¹rå=†1Ë´ ‘Ç¡ Sá³Ìa|»ü¦ KA1¼¸pÏ›vpû1·ý (*¨¨¹ˆE ,>Áš¨®y •h÷2²2% ,¤áé2‹†e­Çò XáXuâÌ3XçŒ=í™Ü`OïbòA”ð¡+ÙSäЕ#øÓ ËØ“@UžzÓ2Xruê¨ê‡GQcË·©µx0]=_å·GP÷¶-ÇêQÔ ¢HN®“i×0f¸°db׾ɨ5â:5£X#»²«ÃŽóÑsì¾“Ø $ÏN’ðµ×rôLžÉëY(dnkX7ÍÉ!Ù•†Ðqy)„ûvc¸nØfPˆï}l׿92Xª]â,u ý…—°«-FnAa>rŒbð¿¼Ý†¯ˆCÙa¥á²E޼v ™V]âp¯aÄ1g#;»¢ãvÁòª ï²ð Ü ÁT°åŽ]W?pž©3‘<6†ÝCSq!Ʊ㊲‹èô”̯Ò^Sí”jƒIMÖÇ?`ÿÕÚ3“f±ÕÎúäëaÏ” ”òë¬{ÿÔ—¬‹5Cvr_À­ƒÈ¹€ Â11†½Òí²6¤¦˜¬àÌÒ¡é—püî®,XP¸|îe”k]þòíÑ{(q]¹¹¹ÎË(RK.§±IW Vït:ÙãÇX›VFÉ:ÎqÀ‘µe¡dí:ä*\¸ ôAh5\*ܸÐ6fÖÂéH§eÜ~d7‰ô,‡jù³ÚÂéfÑ-ü9[YÅ+ª"Ky -èP0ÍmÕtš‚.uË]‡šïWPèçØŸÁþuÎ'+ á%d× ñp[ÖesåVâ¼ýD‰s·Õ ©ç£ÂÖÞJòøÓ*³djϪvZµ§“š¬_ø€ýWkgÄ’`rë+qï/FWP®4Ž;,l1ºíipò"lý<ö}wL=Ž5â‡äýɰgEÖÁÓžª(§v%æë¹ tGéb—1—Ø;)çN;Ž’üœ¼Òu³|¯«Òù~6—ðàbyfra.–§l‰”áÅ•÷q–Idq1zó,2ˆ<Ž2y‘EUŒx€‰±’Ñýêæ& ½„7&7/‘Í<‹L½9pº—Í[Ê£ |UIãe'·ZÄîá<ØÊ0̰­æîIàpu÷n«²cC~›Oº…Ü«»úm®w™jU3ï¼ï,WÞ\iñzFqÔ›?ŠcR#ßgÕKG¤ >â•AຆG=órNê¾Þ)«ÇJ¥ÎC²z2Âèˆ_öî"¾„†¬ì˨t°4o⢒æv–Eþ˶ɖÁ~»ç `¥Åõ¦Ñ ¼*³E°£A'cíjŠ—›6·d‡ÆÎ–%¿Ï+nw(n·ÌâV•Ìmõlnã8n1œ?“¡žÅ³Ô'<]ø¾©xγ’‡v1îgó¼†{†­9Q½ð„à{t3ÜÿPKN‘*J!PK7Aorg/hsqldb/SortAndSlice.class•W |TåÿOöx»//! YÂ’Drˆ4”›`H”pH¢Èfó‹ËnØÝ(¡Z/ì}YÛÚijT¥¶¶EMVTìÕÞ÷aO[{_öA:ó½·GB5üø¾ïÍ7÷Ì73ûÂëO= žvéèÀÃ>­#{±Ÿ‘åY>+°ÏÉéór:$§GeyL–Çe’eX–¤,Oè8Œ'ù) GtLÆQYž–»gäô¬spÌ‹Kñœ—?¿ _Ôð%Ù¿¬óÝq'ðYž×ñ¾*¨_“åë²|Cð¾©á[‚ú¬,ßÖð•ø®\O¸_À?ÐñCüH´ù±üDÇ‹ø©œ~¦ãçø…œ~)°_yyyIN¿–Óot¼ŒßÊçï„ßïeùƒ|þ1ŸEÐ_äó¯Âåo:þŽW„âŽÏœ9£3Óêø—¥Ø¿5üGÇZüW ÿÓðª\ŸÁ¯É锜Nëxg˜5Á‹Dl6åÈÉ!‹S>]¹_BCšF‚;mÆK4ÖS·3¾'ÜÝU' e‘îöp(h6òºÍ¾p¢%´;”ˆr:›YHœ‘ÚbÝfŒ/ç•fë}q¶¶9Òmîekáp¶ <ñkB½–oó帚9n0ãìF‚+dÑLÍÖKÁê7VËè…vbý]a“P”©`ŒS˜c«!NVG“œН1#f,0»9Ö‹C‘Pb)ÁQQ¹™à\ífÎ…=f"ãËÃ3**ßÈÇv’}f'ÑnO‚׬ôÚ ‚í§|¡p[ÌHOb§¢`?º»8#ž0­bìX5‰Ê…LÑ2*¶eãpp…$?n&Ú³h0 #Ã<þÜ”ÆÉL߈™í ›+Tn°¯*š…Y‘}¹ž£JÝi60k„*—÷™±þö^3Ú Zi]¹™+™¥‚d†©‘—k¿L~Ö¼fn7"=¦F:ÛÒI˜„†‚Úm½‘ð Û4Êåæx¤ÞòÂ7Ç*+Í•ÍåqU’<7¶ïjß—Ê帩b“Ëz´š×ÙÔ+ß õødz8Vynàm¸žóc¢D6ЃbØa Î åã6!ì2hˆÈET–^Y®Æ6Û0Ð%Ë5kThPM6¨˜|#…e¥¢$ùò~ƒ¦àfƒJxÁn6•üMCØ RYʨÜ@üR§_ ìÒsh:'ŽA3„ãLܬÑ,ƒÎ¥Ù'×sd™+*÷cÁ7¦ZUà6B阗VvTIUUSAµ¢ã<ªÓh¾A ¨Þ óé{°C£…5Ð"×â:Î0ƒ.¤‹ ìEŸAÔdÐb\gÐQu)-Óh¹A+Ä wÐJƒVÑjƒÖïµb†np ^gÐ¥j’õÔªQ›A—Ñåm v· âFƒ6‘Ô„]kua~,œ ³ÇŒ´Eˆ¯ ?·™ ß„›D«$¬á ú4ÚjpùʠmtµAÛE³u¤nƒLù¬ „’qú¥N\I(ȨÕÖµË &FFÁŠêF^ SÆÎeæ1:÷¹ýDF¦Ë¨×Ê¥+ÚÇ„.¬BEËh½š¤xOõHÔÙ”q­1v„ÂávsOŸ 2WE§*…~»Â¯¹òlŽLŠg÷BîCÙ Uʹ#Ѫúd¯É*4Ì~X£L·òÑvL¡r7{YÞÏE-=]ð3œx¶VËý£ÈD¦I)®\aazCñ–h×ÙA3c±h¬n•¬ì ÓÚËÅ5YHRwVí š½¶ì"®@¡H0Ñn†U‚0ÿ5±h_¯4köಞž˜ÙcõnU¶ðIµ†ÍXÈJв‘Œ¸•q(– àš_Ú9º=Ù®–^‘êt¥#åXàöàNsw iäƒÈ¾²ú¿Ä?Ð ‡ýªÿ/ç(eæÚë3W…ÍÝfDÚ§W‡ÌSÇS ¼¸Â:T(5Ma ·” «£1K›¸8ª³y‚ÖaôdõeE&ÀÕ•Sm=Œ˜y­‹›©qxW4I(,·d„ Ù7Fs„ç³á@<.‘9üÈ̇ë2ÿ­Ò°ïy:S¦Œ;Ie›Û!5"W&ð´+§vŽûj‹3¯3ÂâiMU£ëé‹Ë¨U)?/òÓ0;ÅL¾,Ò?šVÆ×‘q&Ô9ILù±ûvK´‡×ÀÉóºÖ¨Êá,Ñ‹ÆUdžÛ욬9v´!TŒçÑñÔVu¸dLš¶^ël„û8?+ÆtȘ•ÛФ¨ä9lõì´ uñX“¿’`Ìäsû[fÅãv_0Ñãá•g}¾ÖÀnF][1º |} à®=;õÝÔÙÜÙÑÙÁ,“Rã걎ñ‹Ò.ãù²~îLÂX ˜0cíÒÃÊÆªÿ‚ƒ­üeŸCV/¥u\¡âCf´¡¢y|²‰úϺæñúF!¹oÂE#[þ(,,àŸø¦`ªÌ"|š*#ï$¬ÚyˆU{—½óØ ù3±Cí<«Gaµó¨«öÝö}ÄÞ£öÞkï{ÔN2Q«=nﮈ÷«YT’WPÄTàAû啰ߥæVUU×$Ñ:Œt£|m¤{à›÷~Kíx IU—#uÛáp$qY«Uå69$VikÏYÕ>‰Ë |–´Â¿+‰vûZeÙt›])T¿«}¿“ËÚPí!ÊØZçiÌá¢×°–«ÍI†{ð©ô¨P­ê0ý¶ðvÅãØªÜç`ï­dïñò8ÖÛ6Ò%ötñ2^¤‹á¥Nê¡+áÿ?PK<ôªQ )PK7Aorg/hsqldb/SqlInvariants.classV[SÛVþø"|á"pÀ¤¤m­CÜæÖ´Ù±K˦@ÓºÂ(`06؆$}éïH~C^J;i¦í[ú£:Ý#ÉÎá6Ììî·g/gwÏÚþ÷¿?ÿp ?‡0Å>ÂR˜n†PDIÂŒ„–%|ׇûXé#“ÕI%.­qò}Ïð—~”à¼,á6ç?I¸Ã¹%á.çëîq^á6‚°ƒxÎ7WÍ¢ª—•R1›/hkJQËeCÑU9·mZÉšUßLšífµ¾9ËM7ê­¶Uo/[µ[Â&Ãp&¥”•Œ®åB>§:Þ¶FÍtVÕ•rº *EU<¬2ÄÒYÅx¬:™Å£m†ïRf)µTR « ƒ‹¥TNK‹v;t—Ž“†!œË§Ì.ʨ š¡9ut²f,ä ºrL6—rOº(ê¥êàþtN1ÍE…né&®1ô|¦”£ù2%%ÇàÏ”t®Ù«eV.ŸNRÎRîÄ.ƒ”mí× k×fˆhõºÝL׬VËn1LåÍÍäo¬';VºU·6íædÓ.«¼aDh¨JÔc'- ¸% ša^k¹¨¤ŽiGm:Ÿ+醠Žy‘5#£®úÀ\µ^mÏS«×—©éÆua¬²eWvL¢»¯Ðh´ÍW­¶M½Š%N¿Bî5ÛVeG·öŠÖzBÈÕ–ëò!Ê9Îkôœª­\c½%šrÿ.ì$O$.4Rš«ÔœÒ"È@à žQ ½ ö#h‚ÆëãcàÎmŸUmÌFð5'sœÌc6ˆƒñ"‚\ó“Gœ(œ¤8Isò¯¨w ÍýšV?´šUÚOJ7ø¡øüú¶]i3Ënnm-_gw7;¯}DØÊîçÍ] †¾î60\»@oè© Vv³Ùh&UNiil—'ÚS:ÙxõeÅÞkWõÙcu¹ætA{ÿÀªµNŒÜ­Ú™O åL—aüü[Ó¯Û/Üá»®n ßžñŒ´S7Ã'„zHÇU_#<)à)Ÿ øs ¾.àiÂ7$ü…€ûß°ðŒ€„“–y"þW¾Eø¶€‡ ßpŒð]¾'à8ýÓÆçKãðŸ÷øC?ò¸âñ”ÇÓPLÚW¢ „†ˆ3âþé?À~ÃÇÈzÇS”šN¿GÏk„‡b¿Ôû7·dЈö‚ -¿ç2ï¹$dßô;øßàŠp…˜t…ˆ,qá5ü¾·½o»¡|虤ïg亱®z±¢rßY”;Lö: Ï^õìg¦GèHœ==B˜œ#o0z„¨+EÐÏ¥“ýèLÐ'òÝmQHþ÷Løßcà7„å +Ð¥\aP–\¡_ 8‚,»š9æ —äQW“ãƒ#Ž4~™nô—ݾÓÖ ¿O¿p¾AüPK™'±\/ PK7Aorg/hsqldb/Statement.classVYsGî±dI6kcù›` Æ^ sä Ø!1²›CRLIÈZä…Õ®˜]Î}’û¾“—¼‡T‰+U©J~@Þ’çT~J*ݣݕdÖÆv¹[3ßô1_wõç¿ýûàûvØ Ï·Á¼@âE/µA^¦O¯x•Äk$^'ñ‰7I¼Eâ:‰·I¼Câ]ï‘xŸÄmð!|DâcZ~…OI…ÏtÍ¥óÓç³é\:~>“>“cÀ2 :R–i;šéÌkF•‡0MÆ ¯ál.?OÏ¥Oäs¶0hç劳4-„¶Ä`àܬ%J‹öe£¸0‘s4‡—¹éL2;KΠµ$¬j…AL·g­R‰1ìYQÝÆ€:®zlÏ(˪0óÒ¬Ý.,ò²vB+ó(|‰æÇ0­(Óä"eh¶Ím;ðNÍi¦VâbÔ[S>²½Ç³VÕÑMB#M` ¶Þ'e•+VÕ,NÊÌÓBX‚A¿nç…fÚZÁÑ-Ó?Ë  \«šn2¡'ݳµ+Ú„¡™%t*t³„žZèúì8–¦€îuƒçõ2G6ÊHW§àZ1¯-œÒÇkŽ[ç=7^ºÃMÛ¿ÀñvZ 7º1ô…‰“¢ˆ`ñ˜f/æ8n P¶%N «Â…£s;Ë/W1/¼:¿Æ Uk°Gm¢‰Û620™hÜÜ®ÎDV*tÛasç”&0%‡ LdDmº&jnR–Q-£³y¬YÊ*b´È”nêÎ!\«ÚnU3R‡Ô¶RŸnOW KTÖ†*ô`ÀÔĆÕãdÚS Ñ!–#‚†¹Ó³èY½³ld)¹zÕDPa;Ï6p>¢&îÊú :Ãí‚иLãÄŠþ†º á«DÏùÓÃ`¼9ú­·=Ëú´5^ÕX–Í334ò5E]›f¼>51\­½ƒkb^:õ)RÅâ[Æ<;|SôßKþü¾>b‰,Îe˜Xïlô­ôp†f)Óí”æh†Ušµ —pmT¸4§Uäaœ)O-"׸ÓVëfÙh#êÚoåÅóYù5ßÏ{dO.jöQŽo:(Ö¦™(y[µQšãŽ6ƒÉ0UW8ï^ºC¯p›1/Xø¤¨™»ÛSbqÙÏÍÁ‰Êú8×÷{ü³õs ž zçiW{oí5À²…°ë«tGAbSC> Ì@^QØ©À‰qR`Tàa“$¶ÓÞ{éÈ>à!‚GØO{*ìVàA&`÷Â}QøJ¯á¾%q†°7ƒ:€bŽàó^Ò“ yÁ‰Âw v¬£el»[qùÿxåîöõ´F·4•e¬[®žXx¿NlƯ}° al¡/p®·6¬‡qwÇÏ]D4ÐÏWcY¤sõ¸»DK KtK½×=·ÏÕû]u’k#õWc‰¥žt5–RêC2N"ÌàQxŒ¾çÀ4F™ÂÏ2kÜ»µŸH»Ð~Oþ ,^†!áämh]†HME“CË«;8â:8€æôÕi÷ú$·,C[ÍKï~ÔõGÍP·&öfHI¼Áƒùp§ ·„<,Ç]¬³£ü"ÉáePn¹øã0ë»nñ]+?¹‰ÍÁ ß¼ÆO$¹k:<ó“p* ³Ž›.|²pçM×{ò Þ™ôŽtm”Þ±€OÀ¼tsž pÓå¹y Î%Ùå±{.˜ƒ¸‡?ÈAÜãàx6 zì† Ÿ„Ûuü¾º3j`Ï…=øJ ÜïÁWýG¯N>Iý^Ö×Vë¬,ùýØ+ýâ^èwø6yÆ»P¶£NÀ„ÍÿPK0$&)PK7A!org/hsqldb/StatementCommand.classíixTE²ºçx3o^®#PÞÆæ‹¬†- žl¬–`i[Oµ*Rq"6ÖD°™ŠET,¦b 'Q±”ŠeT,ØÉ¤Æ ‘ÂZ¨8•š2M©Ud楦"²6æ#EV Ì/B#›gc§Q{•¶ÛX`ÈÆ:®¶±0ÁˆE vÚXÁ56¶–`·Nð ðç6ö ‚¿´±_üµIð76¶žàY6v6Á 6vÁsmì·gc¿'ø;àù6vÁ? ì"Rúb*.¡9üÉÁ.e¦ÚF*6ÙÙ_ØeDz9-Ö6v¥]%²«Ù5T\K‹÷W²ÐuD³™Š˜À®áBâ#y¡ïÁûÅíMÅî’øTŒå… ò3 *¡©%½'ñ">^‚ïàkô®$KóÊph¶F¢Ä'ð‰?I?ˆO’øÁ4È!üP4²ÄãÅŸ,ñ^*q7/ø‰—ó©?œÔ°7,œÛXÙ\ÓP/±–+ñi|ºÄÌ4ÜÈÔy'-TÔbN(Pä Ä ±ä3$~?š¥ÍP*$>“c1‹C+ñÙDõ3*Žã•ŸÃ«ŒÉp͹k=JGM,ñj>Wàó$~<ÉOE _ ñ¨VˤiRŒ*èͯãõoà ±W“:Å#{V*-h®ˆÀO”x#o’x3‘IñŸ®H|­Þb\=¾„j'Q±”ŠeÄ1Bçð*maÙ×ð£ïH|9õŸÌWHüÒ¯…š§RM¦Z+âv¦Lµ1Ôõq@/Ç%l“¸¯”¸ŸŠÓø*‰x»ÀÑ!Þ!ñÕ<,ðˆÄ£4óNšyŠóÔw¶·*aœ ž¢ÛBaÒÄ ]ª•¨#¬ø:rØèX£ IåЦ¿6Á`à£ÝÄÐÝ!¬´!þtÂJcðzZ¼J¢ÄÏÈÚÛÙá•©wõŽ9ÍÛê™ ËÁH±-Ѩßóç‰1=! -ÁÎ@ñ¿ |áUDK›?Áeøe‚¼3è_Ý©ä¿JÌ Åt)áhK”BŠÄM9Ô!wùZ"9€JI+•KHo¨÷Z —á7Dê$l ôu¡!ý‘–@¨Uâë©G¥t£òÚoë4‰Ÿ•‰m &g÷Ãv#vC&6–%~N&¶Ã‡´çòÿ-ƒIÃèÿÿ½Äÿ@þw?_àHüüB‰_Dááb^(ðK$þ'j\J4æõ رøÍ ,ñ|“ÄÿÂ/£|¹Ä¯àWJü*~µÄ¯á×b˜MÑ€B%íÙò&µ²$ìÇÓ°YY¥høW‰_G~»Y+к|yÄc¼Lâ×ó$~#¿Iâ7ó[~«Äoã=¿BÄTÜÉ{%¾…ÇñdøVÚS‹ ½Â×]d¡ÔE#ªç–Äïæ÷Hü^ñ>Òø~þ€Ä·ó£%þ ±?ÄF. ‡¶}bG8䡨ôMlšÛ<±¹rNí܉M ‹«æJüþ¨Äwð›¾Sâ#u£a S‡¥!—„«"4ÝÇ%¾‹?!ñ'ù týÔƒÈï[”/ŠP”zŠ"ÌÓ|·ÄŸá·HüYRí9þ¼Ä_à/Jü%Z·—ù+•¿&ñ×ùSâçoIümšÔ;üÿ§Äßåï ™ù!‘àù'ÿTâÿ"kçi¡;q¦Ðt>Ã’9‰οø—ÿŠ-ñoø·ÿNâßó$¾‡ÿ(ñ½|½ï£»ß ŠRdü­å a¯V¼óåÈÊ&E]ü’‰™8ÎÍd’Lf4ŸÉb²âÑ-™\“ÍdgàJ‘¢³&·oУH˜n¡‡IL9’)—y¦|ÁT ™œ&œ›­ª¡®®²¾ºIbv†ùÅØl'–>o‡/J?“Òò‡ô®çiÑXˢBש¡?UGD§ÃfÔO)]ªwøƒ^e-žbX¢EÒM隥f˜™+7«ÿJÐ`סxkqdL<3úkpƒÊÑæâJüFù#̓e½)§=Ãl(7¬È^u(2jž·†¶x*Æâ ‡:;¼UŒìJ´3lÆpŽkåÔ†|>Å›>q%…ËçR‰9/樿]Ñ›‡×ôO³R3¯FÜÈйAeÊn¬XUqm–´iV6Á毘üú#†Ž˜s&d0.=ÝLKaÏU'ŸQ’I¦fKqjy†r«ATaª¤jMkž·Š™5[›ÅÙT[‡‘Ù„xôÛþóMßyé|8¦ºÄ Ñ•¸“Þ09k2œÅ–81;šlmG@ö£•Æâª4aG@© :Ûƒ™±DÇ÷—ð×GjÕRÑÅr m#bFçYUém§Á1¥GuºK¨–Yœ%{G{bÔ‘èË…ÅYîh¸ ,ŠæE¸e[óó{Ü ú‹þH#n²†` ËiÂÍ©xça]é¡Ó ÕkÅ›m±1Y¬µlÙ2šc¾–Z-SÂ!ö :*¦0züc0!»Q¦?:{ äY…)•jüêêZ50£#ä'2«šZ;ƒ±wFMÐVlŽ>E’ê+‰‹‡!%/5t–¥ïºÔkl$9j>yØÄhÄ.9à'3êH\QYL^C.‘‡ÚWÑõ¡N^Ûˆ7 tDÓ„ µº” ù…–QF¬DÑn´ºM”uÖ‡ªÈBš¸Ô ܈!%ûÓægöP.‹(¥MöÕÒÅD#™Û…vÅM]«t)5ê¨öÏÅ®zÈ ñ"ç¡).ªªø´;µÞÐzˆR›‰¶¨­®tµÑXŽNLq²{UJ”Ý«ú`„¥Y¬âm}%NÅÜfó0ƒ×ð贤߫Ô4ʑȚPØ«-Éd÷„Yà©üêÕ£¼Êè¥ÈßEŽØÐF^°,5pè—_$9``ºC$›ÅƒÇ:C¨úA7j—†HÛÊM©}9KS:ßuÁUµÇPšñÈÄ#º½Cs¯F¥ ³6´¬PoѸ”Ýšƒzž¨q櫤ê-RÇŒHèA]u$#¹G™>’‡°9I²êªêŒö"m¸fãVØÜ\£ ®R/‚õt±Ó]–ªóè¨,R¯~:AžÆAw>õ }1•]>}¿ÐÒT«·¼z¹ÞØ}Aßb9\ƒ¹J«FФ^¿ª[§¥6ë"‘´fwZ³!,§6ú"é>’‘zj+D£²¶PÉgÀôç§AïF$¥¨©™¶=íѵÙ7cJ¾—}3ö'À³ÑX Ö†CõPÊ’¨ N¡WÓ©&Ò6ŠœÑµÈÞ ÇÀýAǃñ‰ªº3`ÑÔÁ$WÐç™ÖîÝZ$ÕŸöp”öP¸[ ÃÖ€ôEW¢b^E}¦Q¼•aßB=¥9DiÚ‡•vüäÔ${º?KÏ)…8AéVÓŒÉ˳å!åÙ³ÞAŽ¢”…7îÀ©'ÚÑÙ&:´ÆZ Jì)Õ ³ˆR“=Ÿq(P~´lÐ\§¬8kž;`VcSSÑÊ_ž@ˆr_sPÕÆªEH‡ ófg£$Ìàv˜©ìkaÜÀr|FÕ uXÿ{Á:¥F†DªÝ¤Ol¼š;i­EjrGç`(ìèçÉ1Ù§1ܘ·25[Á[™¯€è=¸1}”’áus^(¬EöÈ@oþËÓ3áô«ªdÈÑî cÉß&¦XèÄM&er":oc(ÕC9yJ2I<¡`P½kÎþB³½þH‚ÌŽ"æ#;…±]\S¨3ìÁÕ*¦3è Oöy©ù¦H8¦ìõ.‘ÃAµ»¨_ôNî[’”‡w8XMÔ” ”R®‹5 S®¤»tZ°Oó.9ì—ƒd¿‘µ sšZšªæÏ­«l™ßtbm}eÝ\ýÒ^ïHÝ®wýÜ];¢¤3˜$xB픥Îú8è5Oa}-õyàfÈøõ&™ÎÒÈ´Ý•£×Œe0a›;[pX\AbË&Û™C‰d#ç«>ë§DÊØ¾Ž””Áœ!Í›ª`ïS#m@MQŒË‘úJ¬IJÒc³ “<â]v¢ó’IŒg­ÑÅ &gS˜Þi”H ¡CW@»,ŒÉ£ÿè6*{ê¤AùèæK ³¢çêGf;ªDŸTrúÀ†Æô`þÆÃFõmôT§zä ¢^îòûèÑŒîˆrk(œšáфɎSÕ¥¦*ÔŒ.ꨭ Ö ª6a 1jêÚI¡î¿ˆðÙN*ZããQó¨¢P€Ê¶Aôî gIïÄe×îùêo=ôÖÿz’òwAÛª:ÙO c$Æ 1içA²kVú{²)õß6í'Ëä讽ƒ.0œ Ë´\ÅXÝéCí÷þ¯©ôªÑnÂѺ#•á0Ý|‹‹³ýºŸõOÆûè™ â‘½ê;˜q/j‘ãøáåý™ª¦?Á«–/¤çªl•Ð!‡Õ#g”ñ©u%߆§d}öÈÒ '믔#õjaª ý©-1´E”Ìãj†Ö¨{‘AÅÐV0À>F‘ M…+Æ+B—–Jæû½tév¿6dÄÍôŸ"p„‰CýUú\Æ3g²gÆGSÖ¿S€á](†ß{ð>–6ü>€óÖ Á&„ö’±nƶ»´ÿ>€O5óÝÀÁŠ0Z2v+ðó0•¸·€¹lØJʶ€ÅeÞü.ì°Ž½Qe6Ï0}ˆp ÂKñóá÷~]ˆ›¦õg~¦G2¾-ÌìëG¿Yû†”—ÁŸJ3\Þlã¤}“R¾ÁèþÿýϦz½ž‡uÜx¦7ð{Û„O ÂW]R ¼¹„3cí¬•X¶àV3ÑÆÃƒu½ùzI/˜MÓ¶ƒXaqYv"­ÊB“N³&«@xƒ†ËÓ›ç%jë±öºZ;Ý¢5W%jrŠdC»ºDo•.*µ·<ƒ‰Ø|-ƒD*€ÇœŽm =p»ºþ…å0j?Œ‹Ÿ1>à ü þhª¶ÉÝ #ør8rssív³Ý>Â>"w„ y¿‚¯õPw&:3º’Ò8äÔÅ@¬/cÛ ¯Î‡ü0ARÀÏ‡î¬Ø7‚³´FöBa)6GÅat rêË¨Ž¬=î Ž€áѹP ³¡¡¦ð°ÖðÍ^° ðíèÂ9X·#ú;CŸ‘% P0Î_ÂÆl„\§‹;`Œ¥‘Ióg§ÄÑøíplį oÖŸù™—ãw.~oX@ÝpΖ™ZŸc±õQüŽKÒ[PŽ0q_!¬ì/Ï~~¯b_­ÝßeXß”N#>Œ¸GûóÚø¹±ÿ-”ч°¿FÔjvÝ/w=~qœãÁƒÓýÿûßÿLó5(-Æï ü¾Ò¾œ}èGÛá›CÛi\‹êœ.7bÆëL ˜uT3cmB&Φ†EoÌ0SËj´,Èz …‚8䜇ƒ7ANÛ½ Ù‡öh‡á..`»Gq¥Gq(Vñ»3ðîBsQ¡%“ž «ËjC9÷XcS™ª@¦èìãâPŽœõ ‚©e=‰ÀTaN¢]æž !¥)<>@?±‡“BuîLu¦Åaú±š¹v‚`Ž!v¶Á\´Ðlp„óH1cˆ…½8ã’rúïä=Ü™ƒÈM™]ÅF(H2ÍŠAn²uÌ"âØ4³‡'BÊÏšÊqCšH÷ÔÌU+ŠCe:¯A¡É¨s?6ÂøÔ¥Ÿ­3#M,¥«*»JøNõ0­ QÏÍN-Ö¤?IÚ¼ŸD}|vêùué¤5¸g Ÿô„f4ÈêÕº‹¶A]ô­Ü‡…ô9NãD""œ5Æ¡i†Ù`t;›7kŽ‹«»(ƪÝÎÅIÄ’›îvž”D,±ƒÜÎeIÄò+p;ON"Vĸ§$-1øÌí<5‰cð¦ÛÙšDxbð¤ÛéM"”Üëv¶%¾Üäv®L"ü1Øävž–D¬ŠÁ¹ng`3ä¢Ð‡ö¬q;ƒI’P ÚÜÎŽ$bu ¹á$"œ4‰èŒο+‰XœÿÚ$¢;8ÿÓ7ƒCGœ‘ºë2œ¢âçé ›pÌ,¤Óãð‹4š„óª$¿,wüÊCy:ùÆøõPn¤‘9„´qwÂowëúáîWÍg×§û,SÙqòg]AÞy¶s“çÔ—ÅáÜû¯€üöUMÓ¶ÁoPéFÌï ½jBÿûtV— RÇ,Û Qšâð‡ž{༥Ô(3›Í[á|º\€ßÕãÙì25« ³ë³.±'/ÂÆ/u÷ÂÅø]‚ ÂóÚ…|é6ø3Á›ÀIpì1:#\æRœó_è‚·¦PçeVÓ ¡PpYï¿Fº¬…Â4Ó]p9‡õ‹íÿÈe1«­¡´V)WlQùÊädç®O D3T 4¹2Ú¦W çš£š¦°€U¢i2ׯ=§WÇ%Ó胗ºU—¼;û¼ñ༧Ò¥Ÿ¢*ß½ãpŸöØ"\L´Ð|“örz~ü¸újp~‹ðÃ{<ðû¿lÂc\x¸?s\–^x ¶ÇáÁ¡¶âðP &ã6Þâô¯G‰~G £C::9Iíi.ô‚²“^PÀmÚlzÈl†RÓæ—Tø²é3~n64fžm^ ÃVóó"¶š½*\m¾Ø| ö_iþÄü)Âï,Õ–¹Pji°l°œƒðBËã–]_°æYó¡Ôz€õk-ÂÅÖk¬×"¼ÅºÛú Â׬}ÖýP*Ø…ñ„“…Z¡áátá „g × ›ö»¤^³²†Rq¤8C< a¥¸B<áJq½xÂóŘx=Â;ħħ~ë˜å8Jó-ŽSv9ÎvàøŽ ŽkTx›c—ã „/J²Ô ¥R@ºAºa¯Ô'¡^9öœ9»!7焜³U¸!çi‚¹#rÏϽJsŸÈ+Ï› ¥yyòpÞyæWåσRí½‡/‡Kœ?šæZFî‡zóùL€ïø’10rt“?ìp­`?Ì“Ö`À°w‰ßì\Ví{ÁÅŽc{aÛ¹ 6d×d&îÓð°¥ý¬Öz¦ °gt?O¢X”Þ<5QœAÅÄ>8Vw~ò¿ ä|¦’I­Dur¢8)Q·ŽDN~tô})û`œ{‘d9¶~‡ÊÕõìà"úú`´û4賄~bú`¦JŒƒôõëüh£Tª4}{áPfÝ9}p”:!)ƒã›½àËÁ‘l}*S¹fŒ÷~ø>˜$0\ñ}.ç~p¦wæÍÇ®¨¦àt3¢¾?RÈG}¹siÂha6Þ ù 0£#{½ÿ!‘åƒü߬WÁ†ÄчÇ*¬æûàñ¥&—µ©‚Þ5v¹¬qx¢Ð¼ VèE/<‰IEƒZÁ¼"O¹¬×ÁÌ”vž®°B]6’jwÙQØîMPosÙ‘C8ålj>rs Þ5Ò\-´/Ik>C/ qxøj¥8÷Ü’R7žd¤W×=ðüÒ­ð‚ñÑàv qxÑ4ÃVh£ÚK×@“K(D5^F{&8mÛUp4U^ÑLàNhK8RXt‰I…Å…m¨ð EazŠŠù8Ì«‚K¸ ^c°FSíuÛá àÍØþwM”¸,h»é.K¡uÑã'Š»à-(t„Kè…·w€C…È·ÞŠÃíJ?è;ö {Ö/àƒœý°lF`ÙǘÀ,èoHø#,ü,{½® ìÌ* $¢&$Ú …³ýE{³Ã÷€%ÓQÑÿ ¥?™/ÄCŒ~9œIÒúñ6U;ÚLtŒ„§C á8§k¼CǦÍrØÿP[[áŸ=‰÷{ ˜&ZrPºƒIºô„$,ÓͪpFÿqJ7×»GõhÝêáIÚ­cÂÇàú7PK1j}j`CPK7A"org/hsqldb/StatementCompound.classY `TÕÕ>g¶—™¼„l™,ì`V¢¨hƒ lJ0‰B¸ É#ŒNfâÌ„Eí¢ÕºÕV«µ‚V‘ö7Zi ”‚;.­]­[ëÞªÕÖ¥­U1~ç¾7K’I~йë¹çžýœûòÜá‡÷ÑLÛTÝÁä&³›ng››ŠÙ.#‡›JÙ)#—›®fMFYn*a·Œ<ÒdK£K““ŹÃy2É׸ÀC\(MQ{¥+Í8‹5öi\¢q©w–ÉÅårh¼Íi&J3IšÉ²1ÅÍSyš‡§óQÒTx@`¥4UR-ä— \4µÒÌ:iŽ–æifJs¬‡ã㥙%p'xè6>Ñé×dZïáÙ|’›çð\ŸÌ§Èhž£ù^À =˜.’ÛNT§ –ÅÒ4H³ÄMùt7r“œm–µ3äÄ™rÇR-~[dÔ*ÍrY!쯔ËÏò€ËS…–U^Ík¤9[šsdí\ŸÇç˽~Y[ëá6ngC°¬ó`Ô$¤-Ö¸C Ö»é|Î…„© ²øBÙ A;=´^´SÌ!…]Hš.™^$ !iº¤‰È¡4]ÒD$*MLãn!}ƒL6Êh“4›³øbé/ÑøR}÷€‚¯ËÊ7d“æ›Ò|KšË„ŠËäÛ_á¡]éÆä;_å¡ë¸Pã«=t½ëãkdt­puL¿+× âïy`–—{`¯ßwó и_,š»Q°ÿ@ã›4¾Y¨ñ-ÿˆÉˆ6†Ã]L&9ƒþµF)kqô¢`³¿Ó`ÒB!#² èF(Ó´Æp¤£n=¶Û×Ö% šü!‡™š˜Ï†õþP{ЈàÈø5égZbþ˜Ñi„b‹MÀæ®÷G—‡ÚÃÖ “'ŠtG¢aLJ3ž^ÚmD6ã¬'šXÁMã2ß0w[8ÔˆÂ!¦‰mêŠÑ( „ú@t^,ÜhÃÉ þHÀ¿6(Ì— ¿ ìî µ´­7:ý8£µ)‚Vž™ “!á7Úî2V¤ðNH‡ Xt}“¿«Ëho D…þ܈?Ô‘~¤tÐËÒwîŠY`…ƒÀZ­ílE@kÆèìŠmN’9/ñoM#0îì w‡Úå’“¡@l.SeEÃYEå &Ç‚p;¬*Û.‹ŠØ$<;ŒXËÒF¦¢ŠÊÆ üüuA0†Ë#P‡¨¥Ýˆ¶Ek ¹sy–æ2C¨k ·ùƒ ¶ ?âKëc+Ö¤8cíF[ dj|+Sž:îJ²K®Å娷j|›F»À"η¤gIÅÖ)bѼ e¢S2_”f£rH36mÝ1HãèŒÒ¨L_ÄÁî`¬n™ê ”Ûq©u~~0Üv!ÓÓeÓÈX’íÈXG½ðÇHw0dëÎSÃ3ìd[ æÌmÍÖ=`7€½q™ÙƒÀï@$¤·,Ž …\îŽB¦áUŒ ¢ f–3\f¬3"F¨MdREåP=#ÒŽívñÓCŽŠÕ ¦y¬½B¾T£>„wñA#£ñˆîß©ñ6UÂ7=b‰¸â^µ7šzBf i tvÁÅ+Ë Å;þ` šŠˆÿLÕ%‘Á„‹|ÆàS^Q9jøÉQÖ‰AÕ¿=©-¨b…Nûø.·SNw£áŸÐ.v¢ÁèA@ƒQŸNq4=¤Ói¶ÓÿéüSºK§mtˆ4ÀÝ ”÷ð½pì¡jß½ ÅýôÆ÷Aš-­óZ5-jn•…:ÿœž„àqGIbˆCÃ,~ä$ ó/ø~w2¸¿G¸údÑ'Ò|&Í¥¹—~†ˆ¢óü Æ½:ïæ¸Î}¼G„øÎó^ž¡guºvèôsú…ο„_Ò[:½L/êôš4¯Kó½—×yï×ù~TçÇÊ‹6žà'u~Šhü´ÎÏð~x•ÎÏòsÿJç_‹¼žçßèü[Þ¥ñïtþ=ÿAç?ò :ýI0¿B¯êü'~Qç—¤y™€ì¾þ®ó«ügÿ"^“å×åÞ7dô¦¬½ÅoëüŽŒþ*Íßø]ßã÷uþ; ó‡üÿ©óGBñÇÒ|Ÿêü/þ·ÆÿÑù3\N¿Ò²Òøs¿ÐùK>¨óWÜ?‚ìMçÐésì!>¬óïGÖY¶¨uù²fÞ¤·`Û£zºNïÑûºl¬ÛlÐFvÝæ‘SÖ\ü"¢÷$C݆T¡Û² ?›[F[6ét¿Ø÷P"×:õÓ!zi·nÓm9º-Wš1¶<Ý–o+Ðm…¶"¦â‘üæc«ÛÆ1rÔØ ÷€KÔH™¥Ð o ÂVlóÉ¥%¥­T·•ÙÊ1…Âéa¡k¼m‚f›¨Û&ñ­ºm²mÊ`‚D ‹6µ]fž)­ÒÐi/ý< “w(›§EÂÝ]ªðϘ|#¦o¦ékް´-ÛÜeDëZÑÎÌã ü‡14"1 ÃL¶5 C¨Oæ%gEƒ É%ª`KÊÏŠAVÝæQ›Ödl ÚŠÊ1êoÀ4±¥+ÞˆD‘ºEÒ"iEºC±@§aMAi7Œ’ô¤¹ÌO2í@ æ2qà!#”V,žzÍ °šŠÑ/ž 'D*¹óLDñ8)sŠLV°"Êlë™"úâs‘˜CªÒ‚u¦£Y:xwöàP³tèÙ"UJˆ˜ÉDL(*ÅHå‘Z[n‡aUY9²žUqDhG8¿zuúÆj3Ï-ŽÇŒH“ªâóUMSÒÓQËjPê ÑAyº“®¢…1îÓqóÒËfS-yÝ]íXXmD o*¹Ò=U e*{µ »G ttH*Ïš\£Ž›bC_ ƒ6‡Æ”!']ÝÑõ°)ÓÿZá(x®vÊc{ 8nóëÐaBœ× ÷o0ºÂPLvÖ>¶bI¦¸A2“3Éë˜MùB] –ºDÖ Ó& ”¸ËRŸ\ÆEÝþ`tÚÄË Z·wI/ÈZº×&‹7ú£±•þHH-d›/=¥hÜÕ4ük¸óL¯Œ¦=E2r벡| ²j´ÂH8\‹—ekJ` &dl<³¥)a;ó2Å´ ÌŒfbîhZ,飃«ËŠDãÿ¿§´;äßèðÇÄy¦§'×aª‘v›sšz$pÐóz´Ù´Æê<êMa’æ•h’!SfÁÍý ý1uòˆ‚h²`f.2¤G²`;¦xÐ{0~ô×. þ‰óÃaœÂš£uÙòEÐyã°=+l®ð» “£¡Ÿ’|: 3dÕeNt£,O zjw¨Í4O—¿½}^08ô”N`9h(0e°’ÔA¥<ƒ—þö‘¾DÞ;~e$ >ãŽá †ºÔ \lÈG" JÁBÀ±°UŒÙ(§Ò÷<‘´î°PÃÞ·òiætc³LCFAÚ;¤n´CLGeˆ ™¹“ d~g Z֜ߑö ÇÊÕxWƒt Âl¹ˆn‹*HÇ Ü :ÌA}¤0“&s•£Ë/|¦iGˆ81ócÚÓ ®]h¬óó•{ɇKß4‰n§;ˆéNCyò'ù‡§½êï¦Õßc­ãù«z¼nU®êï·öwÒ.Õ?@ªÏ!ÕÇ©Oõ{è!Õ?¬Ö}òŠ@_†ß>Ú*Q¸ìøèÚªÒ|í¥>âªȶ›ìè»É‰Îµ›4tY»Éγ›²«jv“^eßM9¥÷ þ%ø¹HžnDóñ›_=~gYóÕÖü<«÷K_ô¹=T$xÐëùôlÁ˜=”÷ˆðÄô(ÚBr PÙ5zŒ5zœHÓ²°õ=iŸOFÙKù;¯zŠXÛgœèÙK«ú¨°¹6ϧ¢•öY¯£l;åÕæM”ùîø¤¶À§±+kã4ng’l‡¨@£§ù `ízÖDÎQ\•…~–}Ž}.0Úg9í³\^WõþítRµ×5ó1*ÞBî+lÜCÓ͹OævÌÇšó™;1w‚+\ ≲; Þ²}T ٗ˸|ù ¯óˆÜëÜG%P€×¡fŽ}T å˜8 7%  Ñ8Ë@…¬­*Ne€µ—ƒBŸÖâÓz©Ûë 8ÐCÅæz©Z×¼0…uÅW°ª&à7¿IøMN)¹šò(ª¥Ç4zŽåÑØ1clÉ™“ÓO:O™i›T„9ŽüŠ~mi÷2r+«k©ªÞMSª{ijœ¦5™ýôæšýb½hÅë¬D*}¯s/¯ªñ:gÖâg·sÕ"Ë3qªE ¼Xåø2E]Ùh¹uÏkô~«Ñï@âAªÁþïé9³`lâH¥ö9e¢‚¼ê²™i•ÀÀ'Bcu ­›lýd³lêô‚…£8lâL^c:7ËG&kGÒY{©V¹‘‘æ|'YηÄr¾³-çk±œ¯År>ˆ¬fHS×ÔCGÉàh ÆËà ¼2˜Ù”î•5q:v  ;—/ÄiVMÊSòHûŠNÉÉÊÊê§,^ò‚“—“”ºÅŸ}€NhÂáãôµ­¤9zÈaŸ[¾…Ž‚Þêã4[ã·³“d¥—æì¡¹õŽjQËÉÊo!â­—Þë˜Y§Sšªªkúh^“I£«‡Ê1šŸWu'ÉÀµMÖÜÊË7w¶ô8-È[µj1Xø4y„°i/é¨Xº^Z${q:u i² :=&§¥1^Bž~ /ÂýTÁ¢×é…0Ö ¥ˆàzÕ ã! z›MB³Ñ-nî¡qà¡áåJ§%XqÖì¬=@ñ¿vð{«ôà·Þ °Ó}NH¿q ]ЉˆSš4ÄEv½Ëç„ûšÙC"®ˆ^ã”?óã7Ùä¶Ç›óVù\¼‡ÎÀ<;o«¡?SD+‘A›çÓ,1¯Tô)i¶ã¾¥(G:µ·3M.3(·Ÿò5ús>dâÂo†F9ó~š„Ö5Fë§ Û?pæAV¯%Ì…‹\Ũßæ) c™¥[\ Ê›kz©%N­[hŸ9Z¾ÒìWÔ;ª`*˜¬ŒÓY}´J¹¿e1³”Å8•Å4×&Leb­eÕ¦Y‹„ƒI°ÖØœZ±›uÛ¨¢VÙ«g fÚÌ1–ðk63±g`U­eeE=”ŸÂŽC'›¯®M l 嘆Ô/)ï¥CT-qB¶âq—–d$„‡×“R:3úÉ–SÕæù·Q5àqMÒØþÉ9q:wkÂÐ?†ÛY‚g®.7=)éBkÒä’îEÈ_Ï$ÁîI€µ×$äR“K—)—+‡úR¬g`yÂû֛КÅÀW _d<7EıŠ×ó¶ äã•Æ¥xÝrø#ó¨=Í*Ë(¯Ÿoia?1—'¤[8ÞSZy¾‘lmʯ$*Å'ƒO·|ât^¾c×6šY®î>7=&%)Z,äÔ;A—Ï ªæÂsT0Ù*›Ó2ñ¦ ߌ[W¥±PHY‡É ˜'zó=Þl33¾Io™”ÛJiàíü$R‘EqPú2!8oÕ”ŸšAc•UæôQ:¿ü[©>ß{Er¥—ÖB{¨í‘Ô™úmª¬@ oߊá}»À•énLÝYhžkëÔÖæ–ÝÚ²«­sk/­G…h²úf«·¸Ô085Yzxpœ.@„s lŸÃçŠÓ…+•·¾*Öp€Ê|¢&H0(;µæ¸3N¡•éÑàU­°…€æ´K`k’Ó‹dª.x*ÀžD`W ‘sM 0§±I6Ý+« 6죻i“Ú§ÍU5‰¥‹åàŲäCáuIªfXHù’[¦N›}‹í¤b«@`7K”·5zÇü%ÊdÉBf1Çê€ë¯ô·L寉‰rã)z×Úƒ^öí—î´6ߣ÷3ÔÞ—$¶ÿN Ãõë&n›ü‘ÏŠ]gÁ·•xÜ^ú4ýÍF¥ã­0Fä’§a¡¦} ¯ŽÊ•ÙÒ^rË´^¶ËL>‘eYµÏ‰W@œnJ—ÀÛ*qÜ’âk:¹Ý‡¥>øT£Ÿ±ý›KÀÍ!ÊÑè?\ò9%°ÙäïÁ;{¹Q;IëIÙÃÍéöpó {¸9e7g²‡lðp´ôb?LÚCv&{PçžÝßœbËK.÷!*¾ªª3¹øo’‹ ¬géy& RŠIƒfÑ •ÍÄíqº¥—~š·çËíæZІÔõ¹äÀõHŸ&îýœ¾°î=ËrÉyf¢­®6c»•oU®‡IîVUŠÞ*©ÁißáØaz$†ªÌCŠØ‘¼ÎIöZÎÖ/ɇ6[¥Ûb³~ßÒd×ì=fhzh2ŠÑL¨)÷:ÎWÁ]e­xL:ëÊ9^Û¼ÕxÙœL·Y—Ž#W?¢6j€ÙØ™ÏÑè ›Ì~I_YdDÌç9ͳȨwd¤Ãz´—o§±s¯ëü˜¯º_Svû®Ü_IÇÓ‰ƒï/²îw0·&îgù«t†ðèN„ÇÃIÈQsüÌȘEÉ­"µ5û>ºýAúq".ÿÔŠªyý„||/°yÉý?PKÂpWÚ®½+PK8A org/hsqldb/StatementCursor.classUÛrG=ƒ.£##|!È`b’-E@®XÎÅ'8±¶!vnck"¯³Þ•gW y‰_!Q)U© •§PIå“R$½+¬XBvY%õÌöv÷ô9Ý=úëÙ¯O\Åfc¸`à".È Ë1Ǧ ä#Œ×â(à²A»+q²Ý×½aÉ›q¼…·ýÇw|qÍ3¾(úƳïúVïq¼ÏW[ ogNk¹Ã0±ºèèzaÃݶjk…ª'=µ¥l¯ÔÔ®£‹ ÑYÓ6=rœc*9[ ÓR%ÇöÔA,ضÒ%Kº®rîezb)×5»¸_·ÔTzgþACxw[jWéK‹éÞcŠÙ» á’SS F]yËÊmZtøå§e÷+u`Zèx˜á[ÿ®,w䚥8®Á ±Ùu+ÉÊdï œÆYŽ’À Ìs|(ð®3œ>(®ÀM|̱(PFEàns, ,£*pŸrPÄϸ‡ÏV°Êñ…À9|)ð¾øR` ë5(oQg?¸&§ðCjE@/ÇÃäˆeY]Ü”÷eÁ’v½pkmS­û, ¿H+ÕÞí캾g°¿W±¾ôú<“Úiz¦­æt½égM“ ºvàUäÕ9^5·–êÞG}÷Sß.•=@ÓwkìAö /_ÓPä8ÿ:mÂ7HøoÒå[ty„ò¨nfß&ý|Gc{Øcô¸Wc³~RÍ>zLhì ¶ŸZÜìIv.ߥËS4ä IvÁ­ìi²ŠïÑã÷UöZá‡tù­DcGÙ3DèÇtyÖ…—ŸÇÏQë§Ôzž^üŒ®±Ø/¨õ")õ%’õ—*û•Ê^Öàök•½¢Áö•½Jbý–Xûñò{ê~_WÙèá ê~“È¿Elü‘.okp/ñ~/{‡.¢¾wéò ~Ÿú^£Ö¤•?kì/ì¯d SÙÿШ¿cÿpa÷?éò/2ûoºüGcÛ/°c¤7èòmº§iÑåq2@»r’^ì¥e5œá#ç¨w®¨Ü†öÄí8ž;p]ª5^Ãk‰¡©(ú ÊU§ò³èÝ4”™×«ül•ŸÃ@¢ÁXƒòõK"ÑŽºM=[:Û7Ô-ØÖ öô„"á ´POk´7܈°u C=-¡®îÎ`S¸'1(膃Q|ßÞº½›51(Kö5…»{cÍÁX`~ `0!}!\¥·3V·RÞ¬1¸¦'mv{p[9äë‘êÈd掙¡p(6[å œ‹‘úÒ@²"šÂ8¡±3ÐÓCD|•MMéë[›á@G0:ÉzžQµš­1ÒTùt”¸1ÒÕê 6F±à6”xse:•SWé}­ ÁZ]wW¢!ù*ýÍò@59Å’I™ ÍX×DŒ´Äm››Ý’¨Ü¼óÑ:UîGîð‘Á½9ùÉ·§‹ÏõMùȬ_7,ªV«ð† ï«7öàÇbôÔl5e2GÀ|äò ?•|&¥’vÄÝŒõv7n ¶mF«r¡öÈଜVå5úÑè~m‘ÎÎ`[Lî`ÏÂHte0ÐŽþ’A°3´¡nY´= ¶/ôlj ŒÍ’v¯ç¢²&"Ç-CŽYÎÓéìí 7…7FœYÙtz¤5f3(íBů¬\¿äÊÀÖ@]'îPݲ W" 3ªrô!Mž¡P§+“*ók) F ­ÑPºkJNO§¦u$è„“¶ÞXpUw;2ž vÃ1•ÏQù\Œd]T>}×1Æ´s×ëcù)½?†ÚSG@:c˜jÅœƒ×«9ˆˆž’н¢òFŒÁøÁ0${eä*Tƒ¶Ó‚X8°5ÔˆE¢uÆœ¥Öó0G‘Êç3(2Öm …;:ƒ8†AÇi—îF{B=±ºåÆeiAйu’ß¹dlŠqÊØÅµ§ßÅŒȽc9·/À0Ô+M†ÁuÃŒÃR$±Þ¸‰ðo¸ŠoRùBÌTRæ>?ØL3wc3^X>Í©|1 Ô.ßçSÜ/P% ¸Û#Ñ®&„ÚÄ«í²®vœ²¹ºšÈ eèd/#h"bš ¯ nD¬ÇBιm1\×¾ãÿ`qTnF³Á,ö ŠÑ¤1*õÄ¢P8f xM³©·™–Ú‹¢¢WµuQ|ìm‹õF ?GæŽ[«üϼ‰_(øE|‰àÍ|©à˨µœû_o ¾’·Þʼ o©|•à«™"àð†àkà}Á/¦ÖZ>C0¾àëhúzº\ÂJ¿_ðËhÜåü Áü d)[ÕóƒÑÐÖ`»àx›ÊñäUÞ!ø&š¢Ë•ÄÐfÞ)x¼#X9s6ž.gÓ¥ž9“6>¿y‰ÊÂGx·à[xTå=‚ÇØË‚÷ò­*¿Jðm|»àW#ƒÌËÊ¿†Xý¿mGðOòëT~½à7ðÿ©diè&~³àŸæŸü³4úsü•ß*øçù-‚ß&øù—ÿ2s þþU•ß.øüNÁïâ}‚ï¤ywó­ÞFöáOð®Êïü^~€÷H;÷á;~?ß%øD}7©íAþàó¯ ç_üü›4ä[‚?Âð¼+ø·ùwßÃ|/íÊá-̱³ÍNðÇy?ÆHÁ÷Ñ* þ„àû‰µüIÁòï þ?$øaþ´àßãßüü‡‚ÿ9åGˆ›£ü•ÿXðgiƒŸÃ8*øOùó‚eãÿÿ9¦P‚¿À!ø‹ ¬9‚¿Ä)ø¯hÂˤ橬Nð_óWÿ Uðßòß þ{þ fHù0 ”¿&øëü‚¿ÁŸWù›‚¿Åÿ(øÛ$Ä;üO‚¿K¦÷±ù>ÿ@ð?Óã_ø_ÿGÓ^ øßù?ÿ'ÿ—àÿf#ÿŸË "'òÏmkÃF$Š©L¿üC~ «Œá BcgM¸ÇÈIË±ÈŒØ &¯ÏôÓvF¦[çIh3%H-‹IQî€ÁùD³VF]¥4Õº)¹ŠôŽ"RâÐ¥D§¥mS°+:'™’Y|å=ÁÒ×83j5H– ͇0Ââûyž 9fD&mk”kCÚƒh†`RR„FobM픛Ŷcîƒe,íÚ†ž ¹8jæiµSõH²’MØW†:6Éã°|Æ‹E ½}ngg²x-22~ã¹9О”Mã¨s-•œªE‰´©wO¤7Úf=•С›´fYƒZ²É$bWië{ŒžtŸ™÷tÏÕ ·‡brT nÁŠÞ`t{úÔ±™»—õ)ŒÊÿÖ(¿šÑ[‚t0Á`|j-ÝÁ¶ÐÆ–ÁŠS@ã–&ß4¦˜/íµ%U(•„®Í2©99kOG ¬l±!îŒFÑãЭK§X¨+h>N«lŠSUi]+ÍáV&€é1ô•ÄÔÑ9,Ú²Y¬Zò¾DOj:‘žX¨­'MìÔiFc¤—ÐT©¤Â«8Å–¬½‚(€º5ÐÙ\†ZVٔθ9p„zV‡‚WÉFk° m®`ãæV9ON«G “Àz+iÀ¶Ê*:Ú-Ï‚»¹Ñh`ûªX¨¹ÜØŠ|wuE :ÍòU­¤@:7RM3Zœ)褈¬•9 Ö‘ çd /¢#¶%YjNªZu 9i“§á4iY¸ÑÈÑ#aÂ0Á3#0oél o¥-’+kYÛÒº ùò–ÆÅ šç^¾¸eÅ’¥s›àŠ=½¶ ±‡hG­¥fUDUÝ–l÷sj×-Njó ÍôÆBajz3ƒ¸Ñ?#3⛽æ¹ÜÐãËJÜÝa*Ça +Ù]®SžuäùÖÆÉSMsçÊèˆÇŒÖÉf{p[f Ìyœˆ®4ôD3ùÅ¡PÖÙÔeúŒ=h¸xùE¾œ›ô3ô”ayOvRÔ!š­ÑÞ iÒ¸ ½rý:òÊò ‘Öçaé­‘&*òMž4Äü’͸¹ÞÊÜ5¿')N’ÚÈÊ#%ùºÜ(v ¡‹ÃÁ«²µ;9KQùÎt]IÖÐd³æýF¾‚CÕ6 7²!†ºÉ˜)GAïDƒî˜I—`Ú•=-•2šJ¦ËF¦F“öÛ¼Ùfož·ÓQ¹‘m¦'™õ™áo8ÇEévH<dùTF²ê&oH&‚«NÜ™ïòñ—•ÙŽÀÝN‹'Ö× *O¿Ý§0 ËJ7!œ[ŸøÈ"N9Ct¤)NÎðÎHÑ™03÷va ËØé6ða6å94gÚkYî7èù2]Å•–G#”O¢×ÏL»eõP’É!±Ë ‘å¿Éo'ZO’L>ˆ¤o…1L™ÓÒ¢<çz7£˜“¡¿À+9ÛxÚL:ße¾óó¦Ü²Ãí³IbYÓ¸77b5´0%5sêeá e£NeEáˆt˜”Ô£N…TŠ»& ËÍ©¨Ì?”ôé1XYŒF,^ì•Mò³,fm™9•­RöáV.èêŽmGe[š^ÆoÇÚMÎ po‹to§¯ÒCuÔ”£KR'C1°Ém@ÌjJ×TåÞèœê·‡#í2Â…2Â&r%s?Ó–sÍt#ü"XP”+ æò•y¾{æ á¤<Ýad^+Àºd+V1­cäº\ô)#n ´g ]'åœÙÍK?ErEÚNE6w[: ¥¾ʘÍ`YÜÊæžu9?.)ë1Äf °‘óÎ;ý÷æ €Ÿ4„);Ô3/Ýÿìèaä•dk-¡«éwi1Ö×ç¢bc(4{pèìœ 6 £å·v3’§%þÓË›ïÓ!ʃ‰ÙR õ²T­9¹ùþ%—ÿÿüš¹¾)Gt.³A‚µ7ýí|³›>­çèÆ8AåJòÛVòû0ÕÁÖ/xfý¿g['£ŽTçUIÀsDº ·8»e{8ØÖ¼½'ýqyá9&ýʆ~ã²bÉå­MÍ ZZç6/g0n¨ÿ"é`+VÎ&BTœr'Šóç¶.0’43tY•ùIŸN“š² Ð7\Ï%¹K‡þªÅ*Þ¸™+£ Îüh·<Û$ó¸|ßùÐå'ºŒC;“÷ä:ÎÔ9\yŽ363¶m•¥zqú{ªÞ)y †ÑëÛè›|³E!ïÂÆ×P:<õ‡O™HgXü_ø{úgaúVÄ¥ƒ°È›y‘úIIe6”Ü"/†ºÑíf1˜¥ìõÖÉwY ]ÚTñFBD™e –Ï£ó'ŸiÙ³Ã8A«7Ìb8+oiI—}x9ràU=æ/b4ŸÖó–á9jÕPLh(S–ç+%¹ LÍÄT©-•Z´·ôÃmÁ¬C­¥½]‚QëeÖ¡VæK$Öfy¦™¨­M†ƒ š©Þëy_¢ÊÚ3 \yžõèì’ÜI¿î¢¦iåùM¨´-ÒE5'J¿4^m¡´è‚á¢IîH€•¸k#®³p³4—‹†MñBg4¸Ñ”Ë.Pä©à… ¦ç£Én¥ìL›V0M«†>GflJª¸7œÖL.ͬ²³Àª¿Ç@#£JqDƒ]‘­&Mã¼/3‹Ïøä%‘dT~ÓÇZ6×—‚̯¸§I¡`<¼¯€Š€7€þ÷&¼%ï4ïoÃ;òþ'xWÞ߃÷åýù<ýÒ¯ǧ`Ãÿ8}£ÇÔ>ì10þ÷gø—9â|O«µø<¥ÅêKÕ à8ÎW³_MlGA­‰ã6÷ÝW»>¯}¨¾jÝ–@Â8ÃåuÛöí£ùúÁ¡Ô'ÀM‹1ø7^g‚2cAUá?*|¨Â1Ž«ðcÀT81J®W_áó™’Ý“ݧ]Þ/ñyVf²+ˆ7ÅWkð\‹<ך<ëÈnOwìƒBŸ®îƒ"Ÿn#1àA!œ–9ø^|&‚Ëbî¤Åß µÑpࣤ§dÊB¢ÐR”÷P7Þ¯õÃõCdQêû¡x”øjmFKñ!ƒJJû¤Š•¸q³dDéFH¹¼–¼Î}PæÓ]$µÜ5}¤)´f ’u=Éz>¸ÓÄ0d$§ÔiIìÎÐt¹Sî‘(7ûÛçYb³”YÒ/zÌA‹p§ÿ@…dÄ?ûÃPEͧ¡<zœ¯ºFïƒ1t¯ ¿C¶öú}06%Òš†m;s˜D?] Þìiû­Ù,”âß9ø·ÿ&àßõøWM*:£9S©1“qžÖ‡ûƒÏðÙK‰ØÅðã’IûaòadåÌ~˜bG©ÜU-5{’ €ãTªLu:‹œNìu2—Á;LØñþ(ÉšŸ\7·:΄ÑU³“qeÖzè‡ÚC»áI³9¦~iRxЧÿ›âL4Źb*-Øu}Ð[œŸ€³0-õkâpYîîE4ïLÎ 12×Xì*;’ûÕÎâƒsˆYÏÊûÑD±¦¿ ÇUTæÙ¤TQº ¤äŒ: ]⟃²_@÷1äK‘£i~^ÏÝ ðVÓŽ8”ë¶~hØ ç}ž4‰U&‡ 2ӑ̺™ó [Xm\Ð/G¾jŒœ#¥<3H˜™ ˜ez;ej³ ¬ô¸qgªL›TVyF{Ia±ý06U Ì]p ØO}ãÍûq„l`²¸ ÷,¿3Ýld °Þ²XQm4-g)t¶ õÁ¤4ÅÎÎ¥ØÙé” *ØK+ËŠíÈX+4ó%4MŒì69¿þ~°=f,Álºà‚¬¹£¥2^l’Š€$J5y;þýÿ¼øWó…–yû Qi°ymH«UL"5zmSïF 3ZÆ"ó­Ø{í~Xpx‡ ÕþB¾g¼YØ¡Š»¡Õ0µEûa±íŠ›Ïkû®&iÛ•‡×n¾Å*ͦ×~öN ZöŠ] h)ÇóÚ—í°ä7ø’›PVà*Å>$»V©X&{.x %¸Ðo“#ɸ.2V”Ë‘4c%aûÔ{ ™×mJý~XrX®ð{Ÿ³š÷ÁÒt L6·‹dOÀ2?µ—öÃr¯M··HÙ_¦ž¬ð)û`ej×ίvf18›DÆOBclœûCl{Š1~zUVÄÆ#£+D£Ã=¡ßi™F· w˜ví,Zý(ÚÆÉÒSÐҬ̮0ÙQS!÷¨bj}˹y7Û×h*܈Äu4ŸVjŸLšÙgãPmq°)$gÚ»çЈØsF±9C*`¼¬Ì|ý.Z‚%6xÃjEö7›õ~[ C¦=¾/0±ÚÆé&0®¤ \å©ß¡8Ì2Vî‚Kâp–ñ€.³,Ía÷ƒž3=ú sVIcú ´Z>$` ÁE<Ö³¤½E©ý+Ü>Žè±@e#…eÎÑÇA—¡Ü _ìt¼Ÿ­Ì"ÿ^J‘&KiÑÖúí´=Žý°Îï`~•ù†ÂG’•ý°Þ¯êj.IÀ¥~'MÆlá2Ýq.gÐ7`Ï PÇ~—îJ@›_#šÂ‘ZÝ®kû¡ÝïÆ§1G Jwèîä@Ï(„Wì„b¢ÒÁ ¸l>ù­n«Ö]º[—4À&¬¡õ×öÃe¶+‰øà5ºí„°Ò2æÑÓ• Öøª ÿ¢,mó,]= “ÇØvº:÷ŒÙ …Õ{¡+á½Ùsº×ÚÆ<[öèê˜Dñµf¾ÖÕ”6€sæ[Ù“)š®²Q*YeÆêIhWYš2þû&L+tyÀI¿=57âo¸Ex¿1 •êPtÿ¡GÇ”§Òàò:1@³Oê6¯k‡‹Õû5J¸z=ú.¸M×0Ûêw+¤(Ýv»½ÖëœÚP kýp•WÔû kúa›·`ŒÔ qŠ[¨öÃö£ÉeŸº &X£°sª®z ðùjoA=R¿¦%£©K·S‡îFªDá ¸¶e‡`;œh}7ÅáUƒ«²]°|(WþWŸÄ˜˜€ëúázÉÞÊéd‡r¦[GF+%£î]à¢'ßÁénÉ«ÛàUö¾ ¸Æ/ª½ÎzbªmL¢‘ôü4Üà£66nĺ@çûT ÅxìDN.ˆQC@¢wCú–Ï…â“PNÈÄNÂd™œÞˆ!ù†Í%Ç`ä1pòAÝÇ`6?Ì{ÎQÙ#>~ŒbýøÛØ}ŽÕ°L·kfK™ôAt5¯åj”–HG³aP8;ÖzœOÀM~‡å³*yªß©;coö»”Í«á&º‹Z^­½éÓ-;4Tê;òõÝð[zWïw“Ë}†Aƒ †tÞR9ÛÖ¾Ë/y5´›:¯èŸ‘MôU×P ŒJ‹«ðYŽ)†.\€Ï­[ìÐヷ›ùÃ&ê$0(0Á! hP Ím#D@»¨Ö ôš”ÇaŠ¿Hiðx=R´RdßSo¬âA&ß/7:Ä'ëªôþ”J¥¨&G4Öä¨ÄD•xsƒ]w$àó÷a¡ƒøJí/x®+ì†Ü£¨p›Rè>¬„ð¡Z¡_¬= •^»&^{4ñÚ Nj½¸ËQ`áIíŒoEh“àVÓÆö‚÷$œ)q„@d¦$Ë#«Íma ÖJl"F·ã0š@¦"ö°ibö¢SΡq0a Æ& €Me“1ÜŽL¯Æò/‡†í¢Ñe£ÆidÂg²)&¤ÍA T‘K %àK~“ù‚ w [H0ŸÌd„bj1° 0C‰ÊjW Óž€jtÚ*ôF^HnëH¹-™Ü(=•ò¾©¬Îпò#ïã{jÀ×öeYã {¨Åž8¦Ixû:¢´jnKM59Æ7ŒÛ7±¶‰þ¢ÖH¨0ò~ a™‡ñ;r/¢unŠÖ£HËiÒt¡¢üt:V cnùmò½ïìP‘æ³&Mcb\nNuXìà}‘¢)= {)§ü”÷!%×ÓPÞSù‡“¬s ªÚ#·!¾cÆw;éEèÞ‡ŒïÃÊÞk$kUŸµjr•äº8ƒJÄ_Ìš¶.›Ùät§9Ý¥;%j”v:âƒÏ೎”ßAØv£±w§_ „ EšË0¿9¾MÊe< ªµtÀR1±fèÅdB3—vSºì$=hºAAwÕ< StÇQትOÀ~—©_#(×qØÔøà=&^µ[KNÏÞUs!-É&ÕNcM¥n€?2)I·'è? ;Ž€S\¯Ü¥'t‡ç47×%Á×p§’àòg5n:ë8k0>…­éÇÁ13©d´N~)ìÔ{PbùèÈ‚ÎàrÔátê2{ú1yYIÆç¤pFªlÚF‡0ƒÐ b(¥iµc?DÊ Î\Ü{–ã£`Qêúä™ã£ž nQfYÕYªp³Š°Z3›\k¤[TñØÀwù:é×µÉú(dÜîK¦EžšÏÈd’õRª@Jî‹ì'$ÀÚG÷MÖ(8;Yoú̳ö7‘´B®@§¦JՀÖ"+O#Ù¬c…°e7¬2›ò¤FyfdôщÃÀóïW“%ý€*S\á‡X9" OMë‡%L2V¢,ã!ýTëvÃnu;“îý:.€?ÒX稑´P+Ïà¤3@­HóǦî<ìµ¥Ò99܇á÷xVÞ M¦zqB ¦1úŸÃp¿?‚‹§'ŒZ¬²s5ŠŽ ì<¯ÿcâõ›&^Û2±·ÑÂ^Çm»1‰ÊÀ^•0WeL·ÞÚ o ÕaÌávÓ©¦S«–raL¼ušxë$ñ"’yä¨6&sA=NÙƒ¸¢J÷¿Û‚\›¹¸ÑÖÚÓòç —´+ºz„0É|ÎÂ${¬¶H,üo8>øD m¦ƒ„jà:½6cî‡ÝÖ¢_6‚¸DS.Ž•${5V”®4À-ºv°Ô´–AÙœÄY“ш) Ðyù9Ì™– ÝÆ°ÁÍ–bœ}°ÊâqA6IÞÜÄÁDj©kóJ$tÜ©ë~Ëâªmi°íòºÒ`Ûe¶¦k&l»¶iÓ̱ª9VÍkKE˰ü„q˜t¨D!l¯1±Ý•Ž•YÀ^6Hð“1€`j”³¹{´³\ÀîÉvòKÇ”""›È.ÙgCA6¡iIhO²S^  ¢çºrFÖ¶“0=ÉćPÈÆQêÄ JÜwÒôj‚祘ÄxRi{ =½þÙCtíuì†qô„`è«®­9jÚ+¥ò„veTìLΫMΛŸÝ@ɞ̺TQ螪ÛöC%t}äѹˆLÕ3¡Ð>€ÚF•Ó÷×­@G:AUbq©©tŽ8Ce3éÛÀÐ1öô1X:85I±p&¿T«jƒPLÍšGoˆþ¬ úyÆÙÓÇáüªÖIÿ‰¯‰·ᮕà}\šât[JQˆÕ½t.çuíæÇèÉë¬÷k¤¨B:9úI?<·Ùüiƒ›t:;eÇó¨Öˆ@|¿Ùñ3úÎ܆QÚ|~n9â]“ïðB‰ «jQâ[;>¤E³æ·˜ø…Ož§Hâé¤é›?‡Ø-¥/‿Jë >îuwô>ã\uÇçn¹ÁÀ6ÐnÓ¼…5zÌ(Šâ0Öï¡cÜ—üÅ&_¬¸h¦]/Þ¿<ì-ê¼Ìg®þ+œ…qˆòþøàb«“N= %£Š^ˆÿŒƒÏ"o‘9àeú–¡[2½ì-ššÒ>Ô·ì(BS|1ï~Šå™Aäõ8<ôqˆœk N#EŸZ<™ìz| øµ±Ââ0Oêî.·áä\Ë`»Àé¡B±¸àц"C¡K¡Þ"»î!}ÆOzj|t0–bs­µ”<&óÒ†dÏ—" è…üžÅ¨yùohמJß ëfFã^]¸Ó$F ù€ã1ଂMÁ´îV~ßÏ&KÖ6˜ävÎa')EGЇ^·ï:/ÎÀà,qoÄ£„…p7êŒÅ[7îÌû¼À3é|¥Šc0ùCp;‡Í5“â©æO&ØŸ‚ß®¥ïûÈýï0åkYkóYZ¢°ÅøøÃØ<ÖhÎõbªFéhàLܦß?`ð7¼ŽþÂÏ…¿‚ÿàçÁ?AçÇÙ2þ¸þPK¸X|c$òRPK7Aorg/hsqldb/StatementDMQL.class½:{|TÕÑ3g7¹›ÍÍka‚€„dC ZT@KØš÷& D ›äV7»ñÖÖ­öÝÚ'´µ-­Æ¾Ñ’%• V-Tk­ÕÖÚ‡ÏÖWµ­¯¾0jgν»{w³IèßÇÏ=çÜ93sæÌÌ™™sâýoßq êÅõNÃeyX‡Ëóà®ÈÃz<‹Ggsó.nVæá9x.ÎË/®âÑjnÖps>7pón'®Å5rÓäÄuèeØz'nÀNôá{xâB'5ÍÜ´pÓÊM›‚íŒÐÁM'cù¹érB»¸‰q6óÜE<º8F[ìqà%NÜŠïuBnãf»‚½Nð`Ÿû™æÀÜp³“› /ÅËx„û‚ƒN8ÃÜDœ´»!n.w’>tæuÒÞcL7ÌÍ.nv;qê<Ú˳º‚W0ê•N|^åD'¾Ÿç>À‚^ÍÍ5 »–a×ñh>È£ñèzÝÀ£+øff¢òèc<ú8>ÁXŸd¬O±F?ͰH)øFþü 7Ÿuâçðó¬ô/8ñ‹øùž`©žd¼§ü4~ÚÏ8iÄõOü3›ž†Ï²žsâóø‚‚/*ø„üö¦¶æmíÞõ¾‹\Í—vêBð@?¦Ã« š"áh,Žm „†5Bêôvuw¶n#Âî–Öm­ -^¾D¬b}@‹uzCŒÕÑêvF/õ÷ÖI±Êë D5¡€ÇM‘Ðð`¸%0„ z|3 $€¶) 5ŠPÖcå–6K\ó£‘a½/Á7¯/îÆ‚‘0Âl+™wÏ®E£4A4E4¤µb¾~- Æö"à‚ÃQMY¤*êĬrÎ`¹»3¡%^j ’zNϤ˗ ‡bAƒ^ª•ÐK{&Ç/6KÁHÁ¦¬;µ¾Ë FQV"íÂeÊœ63CYEROr’Pû¸OS(ÂÜ©”]tù°¦ïµ RnEïHŸ%gß°è­AMÁ—éÛ iü úÂaMo ¢QVÁ+«Ô1VK ÐôE):æ:ÐiÓt"›7‰âŒÍ³º“Ø-Z,°Žô€p†•†È u²Kàð2Ñá^Þp¥›Û3Á§×ÑÔ.­Ÿ0]:+ÊGKb½)2Ž‘O‘KçE5âîcåiZ‡{5ÝoN‡ŽÃŒéN÷xN(…zÆÑÈ] cqB_ÕU>ßTšL|¯^º ÁÞé'wT‹5’gûÂýÚ‹cÛª©À ô]F€Äá%즤]yÅÓ´œd6N¼´jéiÛ]Ñöh}Ã1¢Zž¶¤ßô·¥“Zu5emÿJg‰–' ‚ac†R™‰ÃŽü¤ƒÛ …´>#”ñÂÑõ½S ô“פ­ öÖµéýš®õo Dwúµ˜Ü`i6úÍzÅ®¤u|òä¶éÖ("ds0JËÛ«–ò1vÒ$Ù9¼Bó÷v$Üpvöo¢ò€²»¡^¿Åm'QÔTÎ\BæåÐÕÚz/¥Dü;9_Sdp(HÁ#Ži{HÒ5YY[aíöº®£yQ:­ÔS‰Œ> }t6¢Á¼Ì+ ¾Jy€ö fNšvú6Ñ$í”:Ê‹ª&7»å0»‰´=6Rä3£x,äkt¬úµhŸì%ÓUMâqYr¦š ò‘ïR…@‘Ä»§Oâ´D›|¼004¤…û­†Ú]›™ì‡wìÐôÕ¾‰ ›3” ææa­¯š s %¦|ÖÔZ`À’9åìI÷L%Ë`Ó’JѤÈd‡Aú*J¬”Låëÿ'åL±ºBî íâí£MdéPd 9ÂÉB¬Цk ÒÒ:±î‹ µ /ãä¦*þîUá¸WÁªø/¸[…û¹ù97ÀÝ þ›qTáÔÐèÏ*ü‰üžRñM¸O…cp\…»à¸‚ã*¾…o«ð&þ=<¡à;ª¬Qb"„*lÂNL9"W S¿ ´€ í*¼Å£Z´S¢Oí¼k§Ùͦc‡*ò„Sùðœ*Tn ð Š{míÞΆ._[«Šs°T…¢HÅ¢D.1ƒü4ÅÎ䯠²S#Ê̦ˆ™ªp‹Yª˜-樢TÌUDÂÂÓÈAª(t<8¼V²¢ª˜'æDžR)æ«ð0<¢Â¯áE,PÅb¡*‰Å³2²‰ÉJð*Ku¦*–°«HO¨ðÆ–ŠjUÔ ¿‚“*œàæ1ø"jUø œ¤;IhTÅ21KuªX.V¨¢^œ¥Â“ð”ŠnZ $ŸM €gY½ï+Ux‰Ó¬ŠÆiå¹6±^í¢Cªð3¤‹Pt‹FElRÅfòKq©Y\,¶¨¢‡›KD‡*¶ :s2Ì™ŒhŠx¯*¶Á3FÓ©¦^×ÒA+ož†gTÑËMŸ jbixâù †HT®RÅ€ØÉMP—Š U\&BŠTEXDT1$.W„®Š¨ˆ©b_SÅ.nvÓ'ÎeÞ”Afeääb/³¾BÅ3q®Tq’ÃøZýÞήÊM ÍÝ^¿Š‹q‘Š•¸ 5ã÷6{›ºT\ˆ‹¨ðên_×ÐåUq VÑ×:šëòr9ÕÐÜŒÓâíÜ@ŸJwë…­m›[)Àù»;º½>¯¿‡Òг'¤íÒBdÕ÷±³ ˆ«è¬íâ«@¥f)®q+ñîjhlöö°vÛº;›¼•Æ· ?…ãt€{˜ÿüU¼_|@W³ÆÄ5*ü¢TÔÞÐIW´.o'¡ÐgS[ë:Ÿ÷ž­N:e©ORýVŠ׊뱂‰ø`ºÉÓLKY3ÛѵCËŸV=—Î?-m+âCéñc²B‚ª-+YEÔm *9¦eðϸ刞ƴ`™ôf2ÕÏ\Ÿ8µÁ¡ØÞ]Ðýp®…U”J|­N^ÜÚ#‘YFbúÂ1Ùõ>Â÷ *yÆæŸVN®Œvц¢>Ï¢ëâÌ0eÔ8‰K¶¥Œçš’.#®‰9”„ F9ú¶…C$y.-F›I«š®Gô:/·¤Íè+ª|êö¤ùªÖvK’DY½ÂZ.$sÓT%;yw0jÖêMÙé'Ö_SrTeùŸ´uùġu9t'cýÅö‘z‹©TL K‚Êh›~Z5¡nC†Äž×N,‘þW dÅ›Hµ Ò%Îr!µ…»‚|E8ÓŠ„Ór7á¶&¾‰hÑéàÑ ôÓEhVUOsfi`Ü'£t_‘Åù›d'§¬J+Mäô#•áÿóù#OKÇ0Ývµþ¤æó3³*kí]¨“3§®^¤€žÓ6L¦«ãÏ4ÉçˆvËkReÕÒéÞ“Š-o”æSßXI+™/—Ì2ŸÓ8ùSDó2Ð'<åóÊÉW¢Ù™Ü“ïD9òÎB@×#»4éÙìCvã¨@Óùº%êÌŸÖ‚Ê€fÌ%S?èXNœ+m×#|ŧ³ë§óP,ñ,À—ðTZró¶ÝaMæôp™–òù-õïR 0DêŽ2ÑܬD<·:=ÕYfÈ¥Âr?uU¾ibö„Üg¼«’øæ³Œ6ôrs’LÉú$ßò¹(íŽk±ˆtT×DKóËp´9Ø«ô½IS¾&îìIÛN¬¸ü—‡|á]ìŒá-?˱¿ËÛ²Íß´ÑÛÒ°m£¿£™÷IÊᨖºõ2ûµ¼ Λ\f#¤èÆ“WâkÇ’Û7žÁèàM÷†Cõš¬³2¡ªNG08¨™ÊŠìæJ:Mt‹Á\’± –‡!J톨nË(|&{oRû¤Êš½Zˆ_à{²e«\㥡6K¥íC^“V³³d}cIL;bÄZ–rp¹2á¯\ÖDëxŠhʦˆzüFÛ2jžÙ“²Èí3±K­(fe$cuúõÚ:eÖ”ÆåÃ4‰÷~†Ð äGëp(døx!Gù É¿å ÑÎcòÍš*ç>ùÆœíù(‹I<ÏiZÂ|P*«jšb6§Ÿ|l'cMõ$Æ¯Ï =—g¸W†ò Ì0›°®gš²#c¥Âhªæõ©,‹b´é—+eEºN­×C¯¬7Ääõ;ŽÀ”C)üî„£ô%à*˜?¶|ßIí18üï.³ÿ Ü-û{à^ÙÿÔ„Ÿ€“²ÿÜ'ûûM¼Ÿ›ýfÿ xPöt1–ý¯Lº‡áÙÿÚìcÂ…ßÊþ1øìOÈþIxJöOÃ3²ÿüYöÏÂs²^ý‹ðÙ¿$åO¿—áo´Ã¿ÓhØÀNýêê²ò#€Õ·ƒuöQÈ1º\£S¨sŒBuÎQȯ®µšà·ñïxÕdê!Å!õ³«C!ýŠn¦ŽÇq(…&@xZà,¾o˜”.¢ÔçV׌‚ËàŒðø§9_B=sÎ!n®Cæô¿àßæôæn‚¼Ø ¨¬‰ÃŒýPj,=ó•^1îÖÚ1˜uˆ ³÷Ó~jŽÀþÈ?v8ª‰¤”›¹-Ü–À¼V9¨Å1¨hñÄa¡Î§_exÑÂ+ÀÍäHÆ–Š g‘ª¶(ðŸq˜«À)ÚΛIùÞÈ¥þ!×Ìtá,j©ŽÃâVÏa8Ó~',¹ØæªòÇa©m¥Ým¯CõAXRë¶Ç¡æ.ð¬ÊI¡•æÄ¡–1÷ÙqäG-ôË’ô$dݱƒ°˜{·½~ròßZÈ—[ÉW˜ä+¦!?”´hä¾ iß Œã)ðŒƒ‹º³#Û¼EÊ`½MÊ ž_¥…©¤~ÓšYÉß1|k½t€zú-¢_'ý–Òïjú-#¼z6àYÜÔÁÙwÁ»è?¦?«f VÖ”€¹`¯²ÛgÓ§ íæŠ}´^õkŽÂ9s[lTH‡85ÜWÔ¯²{JÉ ç€Ü(ááªWj'#®Þg#<œrj7Øß§‚98å æž‚‚SÌž_fÍ_¦o^ð8šKÙh©%ÜWÔŸä%ÜÆ8käÊcp~‹\æQ=Ðgr_QOy1÷"Þ}‚%uJƒµÆ÷ÚÄwà (á.­žZfK_M°)ëL ç8‰¤ú(tÚñðNðÒdÖ×ÚjÕÚHÍjSZ-õ-°³Íg–ÐfÇÉž§ ´¨hæL'™ óP5w~yBGª‰éÆQð‘û¿§šÃ…TØ< -Ü·ŽB÷í£ÐÁ}ç(øBÙ§»µšÙÄÇã&˜Ëc’Î3 +jÙUYÄ8lfðE&àâÍî¬nOÕ.³Þ2 =FÄpQ×c„‹Kâ°usʪN°ÃvÚá’ $|G aÄ`Ð’Œ5M5‡á½Ài¶ÝvVíbZ2°æÑ¦{ãÐwf–¸¯2= ýc §©ôØöÛlç—Ód™|vò¸œ<#¸OÑŸ7fýæAõóÌ¥ûÙ…ŠMd ù1¹ë¸/¯o­= —Å!t; ÞÂD.&býÂqˆH²ñ“òü(ô;~3è×ažÊ5æ©ÜF¿núµš§óòØdJ©€du#ÐÆå, ÊYqÐG`AQBÊ0gƒ{þ8Ô*Xx lŠáyeÜÍVMO‡ù BÈY#JDA ›°8•©çàRi˜°$iB…Í0y-ÎxH¦7UQsmØÜ –äÐ*.œaòó›éï|K[2êI•yL•yL•yLUyn‡Ø¡¸Ï5<»Ž'7h±œ%ÎL.`Í‚»,üÇÓ%ךYæ ÛBð;@ëvØ3 »o«–€1ØK‰ ï#wuÛ˶³¼»ÃåGáJ:fïs]‡÷»íöíqø@®öÓ×° ù(!†ký©áIp–¸Sr=n_™“_wÎH}Äaß~yÄRß—¸~°ÜÓe ?”Zຓ ØÉ•­$×wɤ³!åí p~y òtAŽ‚³Pªh–d!äš¡àl©AËåÉY(³Ñ,5•½œ¬ÉÞQÌAê†C\|˜~1¼5]žL-¸žò>‘Ï%jÁÔâ)2EzqóQø(éôcï^!>›:NøºáxƒéÛ ßÀBó8­2|Dä{8|רâðñ8|bsµç|²Ø‡Om®®ñäOo&ÙnäDØpZ<®Ï0–§¸‡0L4f@ˆŸM|Ï¥†é¼Š·ò‡dèq}~2N_˜ÀɱÂñ´˜1+óÜl̉üìßœð^ΜóÙFÂkH®)ýäñiVþÒÄ•ÿ¯–ú²e)+ü+ÓÚèÿE®›Rù|)¾,ÃÅoBû›pÉ8¬¤¸º¸|–È~ö8xåËeˆB¬ÁÁ4OÍ­cßÞçq}•·—‘kªK=®¯Œ¿ä¡þzšB%@ß8 m+sÜ9¡ØS\)·C[xÅãú&óÙžvÂ×6{\7s'w{£ÇÜ\j[.È'%„z’Ý•7ãÅÁ]5¥^b–že5®[ ÍœÌz”ÌjŒp+ðŒlD#Ñ­“-ÄE&ÑWH?œöR=/+ºSs¨Æõ-©­ *<¤¨å5R-žŠe¬¡Uì¬ K¾‡ïÈírù÷Pª4œW#É(ãð]C ‰õdE¤¤RTR‰ƒTRo¤Ï…$ê⤨ß4B\ÍU!ñüÞÉtID‹öH³Øšb»íYä–@üû¦‚LA¿WQO¦LÉÊ<,%>˜Uâ|)ñ8䓸­\^ þCzòa—!ÛWãúR–=œçV¢¯¥¦œ…3—÷•×#ÅÔCI“ÉÂç‰Kç‡ ªÇu±¹×í†O¬å˜ýC»S“b¨€(ÞD¿4y!)`oaã\‚ÕXcNš¹_ؾkä}ôL1W›dé6½4ÊÒQ*ºã‰ËõãÔÎ%áÿ€ø#ðÿ€¿B):ño˜¥ÿPKȇÁ,÷0PK7A$org/hsqldb/StatementExpression.classV[|WÿŸì&¦š,äF“Ju³dÙmÕ„²%šdm¬v²{Ø ì-3³!Á»bë¥õ~£ÖVëµ^B K½¢­·G|÷ÉŸùQë÷M&›ÙtúóaÎå;ßùþßýÌ+ÿ}á*€ü]ÇNL5#©ã=xp¢˜æá½: Gx8ªá˜Žf¼Éñð~ÀÃL3x˜ámJGjB8®!ÛY&N0ÿIÈYfÍ5#Ï2 <5Ìé°`óàðPbîy§°À2‹L[ÔpšçêØ†ñêÃ|ùa†úˆŽâc|éã:>O2ì ŸÒðˆ€®Š–²m³è+X™Ø¬=—MÏÄF+ƒM»Í¼éìÕði Ã…\Ñ̪áBÞQ Ž€ŒçóÊζ­ldØ/fÊ“á§=`X¶²F&ƶW‹Œ×Q ïAàp!­ÖO9FêdÂ(&™¬rÍø ©¥á³¤eF9Sc›Â}c'Œy#–5ò™Ø”c™ùÌ Eˆ®3Kif®¤,“•½«¦²}ÇüTi„.Ì«4Iùœ†ÇšÓÊNYæ ©ÔWSF¼† šZP©’£ê"û‰d~)ëÄ&݉ç4<.°ŽLX&‘8b)dçI\Gmqä8¹¢i-òƼ™1œ‚›,œ"—¯ìG Ǹ‚_±¡/J\ÅK¿Æo4üVâw˜ø=þ ášÄñ'‰—ñŠÀþ;†£r*ïŒúj½³ÃHbbLß¶½j½>‘Új–°@ÏMóC`sýš«Ö¶ª*ªœ_IW ¥ =Hüœe‘p¼ªµ¬œ$Œ¼‘QÖö•½›¥í>FeYQ©¬RÞ1sÊÛî Ç__4þ:šôØW´";ÚM;iyÛH1¡âwqT ÕVÇzÆV‡gNPPÚýÿ7S¶¥55«R'‡R)º8iffYd ì¶Sg±Hžq" f­Ðd‹*Oõݾ¹­þz¤{ÍNa™B½Ø+ú¡lÖßx÷ݲaÜâœL°ÍÓʵ'ÎY®è,Y–±HmÑ)x«öð1Ÿ–Ënu=Ó¹FºË?U°–ëN;k]{1/9f6Æ7,.QW¤nûì“”ùt¨ÜD¸#<|wµå(,ÓÈ’A䤉!òê”›m+É>ìC¥× ÖŠMÝw„ÜcÚ^“ï(ñ$½(•,è÷­-7f¬B©XíÁ*ÊäJr'ÝDk¤d'5™6çø2h¥Åñ³TZ·’{nYõo»¢]…\ý|ßüêíßE[ëö_ž¨>%]7×?¥ê$ì7lµúRås3Ï˶ªŽ8¹L¬n»•ÊŒdÕx—É­ÇÞPçãZO§©HëÕ åɦZmGÃߪߋzÕÎXÃ…^ú?ÝIÿÚôÀÏ>:}»p7Qî¡Õ‚h¤ù¾HO«öq ¢çYÚ¢‡¾úî¥o3<Ïó9ÈV¼j¸ŒÀK‘ÀE#]Á‹hŒìè/£)²£ í¼ õ;x ÛѨáÞ¥á^¡ad6Ó9ýExðG „aö^Aó‘KX7¹ÝU¤øª Ýž ½t~ÛÒËe¬Ÿ&Ô KTkؼvïÆ>ç4Éf&E‚ï^ƒä‰Ô¾=Ñ :-Zž€öZ—xù"BãýÑ26FÑ«ÑÀÀel Ül Ò¶«Ï %Ú(£ýLPœ{íßÑUôMh¼†!=ð*º4ì×ÑNƈ§Ça²ˆõØåÙ;mÑËè˜vÅw³è–-¼wEÿ'êd£U&J4¼Ê {Ixˆh£8à îvõ| Í’.6'ÎAŠËèN=g¢éNâ{;¼Œ-ýKnŠl$}ïð€6 ¸þ †ûn IÃÁ6¢Ä+P' ˆ¡¾xí«¯nv3)Ð˰[Ï¢í ¶átÙ~ ov}ü–þ¥JNùl l¹^‚½NûqÈ^ïˆóË C‚|ÔJ,|Ô)ã­Kîá8}A"¦ùLx2rä§Í÷öt{!ÝÊs÷À„¯¡¥²&ÅûÎ4P$þ¹Ì!ÎN¾H7ÅŸNû§Ýã­¦}+§@ƒè½Î³ ‘'0Y^£¾ÀÛi iâmèÂð|]ÿPKÃvÛX"PK7A!org/hsqldb/StatementHandler.classWù×ÿ®uìZ¬mIX8Æ0"[.&4)M GÈXÄ–ˆ-0Gº–#’Ø]HÛ;mÓÜä€$$!mœ¦45‹BŽæjÓ#Gè?п"Òffwe¯òƒÞ›™7ó}3óæÍ>}ö¿óïX…ûpîqȇ®ÅjÜ)âg>x,æç<ü‚Ù»Xáˆwã¦îeÙ^½Ùû™}À‡&<(á!ž)áW¼òk^yXÄox~„w{”‡ÇØôq¦ž`êI¦žªÅQ<-áfžñœKpLB¯„> ›$gÁó<¼ áE '$¼Ä°/³èÞíaNJxUÂo%üŽå¯1ÚS¯‹ø=oö†ˆ?p'’‰˜!. .ZÈ높7¶*¹’ê¢Ä€„C·ôïŠm‹Æ6§âÉ sX8Ü3˜ˆ'6²¨ÆÖK$S»z“[XèPË¡TO*Æ·)šL¤â‰-&ï¡ÝcÛâ)¦½D“]’i‘6Ø£ä39UK.ªÒ…|&kd ùZ¡TÔ,é/h£]{ô¹ÌHW.;Ò•Ô2ª¦fây£OÑ÷ ©F·ÓlÈP •ÌÍb6eS«³ê~5o˜çÔªÈIi¾º¿hŽJ«EFï³|íÑ4å°€…;«šÙJdí]“Ígup8Þ¾•¦h!CA”L&:Ía¡pÿ^å Ò•Sò£¥eó£ÝlRGëé}J1¥ŒäHÏï´µr&“hh*–æpõ`­ÑJ¶>ÝÛAØ3Wgqk7E1ªÓptjßIåt.UN$Dkß jª^È$7š¦{®ê:™›~‹ê!5]â<­¬®ã^)gt šm eT=­eGÈ:<‹u·ê(†Au7ÕL>Íî·…Û¯XR^²¡{@yWÁ¤ûM°Y=ªJ®0Ú_Hïà sæ&¥Q:ƒQòTZ“ÎÙÅC*[elÁ)‹¯tXï Œ$´^Ö]Il–ÑnÄ›2þ]ĸŒÓ8Ã’]2nÁ Œ³Le…·0! fåµ2Êx“©U2Î!#ãmü™Šgf¼¼x^Æ(öȸ€÷d¼dü…©™Êb¯ˆd|ŒO@Æ~P½Í›‰rSi7‡Åe°!íïŒÉøåáo$ëëIlè Ržz“4Jtf’ñþÎJÿ`êŸtOhe²½ ðk76²¥~ƺÿ’Q@QÆç( h¹Ìí–1„t5žpܼð.ºš3.Qrd¯š¦ÛH§.fõ· Û£jZAëŠñH@ª5·Ò u–_M“]‰kœ ¡dó:÷µÒˆnæŽpÙjÕíU””i‹FÁîfn={§jV[œ wVñ™;•¸ÙŠÊ~Uï-hƒª’ñ%¹À>±”2ÏçU-šSt¯N˜oþ çYq@É+£ª¶´Â“_õÁMá Xþ}-C3Ö²Ü0îàÙ yÕl½‚ЏTÌÐ!îPµBE4ÿr­Å«‹jžŽ¸³ZŸüŽÈ*f²k G/³ê¢P¸j¦}3¶ªœÌì`ÜÛã¼c•B˜T’Œ‚%ñ•€«¿GÆ)1³k¡7Ð÷½Íø ºéq±†ßXKü:#ñë|ñ79ø(ñ|Œø^¿‘ø>'~“ƒ¿îpü¾ážhÎÔöÌ™ºÍ|iöÓz Y›ÏDYË;î3ñ?ç t\@ÍöspMÀM¤‡HïÄŽ– H§a= ¶a»m¿š¬ù}³¨ã-ˆ‘2j×. Ê]†ï®µ ŽÃý÷mÌyï´i¶ƒE.a!=ΰsÒ 'ˆ»¥ Ù˨»"È­¸Í GâíˆL ¾âéíØe¯‡ìõZ{“†S¶ÊO¡Ø*ûÈ ö#aã?ûTÄå)#0À²ÎЬ3,cî1È æa°Î`ã”ÄË&Üö>–Ûsà®»„¹"F¥‘±7nÇHVîBã¶k*vÛm¶÷!+1ó.¢©ßöòªHE¾@¶z·­¾œtê?AO¤ÚÜÁDó'Ðb“ &Ð:•X„eDÒËj·- ÙZ8~‹Æf~"÷!g›5ÐÌf®àâŠsôÕ³;i‰£mb°O1Ç.²qË¡¶i° Dß)ËRØL"7ÍͰd»ý9\ÍI¤—!—Ža.3~/sËÆà .ˆ¯)#ì_\F{g…Ž;*tb G,¹k]«Ý“XÝz¾ˆ¿ÓÒwØú °ÕZËøA+L~ø~—0öÿ,:À®“¸ÕÀBR_ùgb½ÌB›O¿¥ô[ ^ËŽŒaQ$¸Ê¢B‘à+Û„£e\gíò’u–ÓVή7£(ãGS¹[†úKhq ®‡êítÑ(„¾FøýÙ µÕÖ¾†§‰”5èö¹ÔÛUXãª\ cÖ5 %tT¯)s]Äê³øqåîñßPÍïà \Dó·PKߤëD&™PK7A org/hsqldb/StatementInsert.class•WyxGÿ­uŒ%O;±jˤé‘ʲ5 È¡¥µC£`¹‰í¤$†ÂZÚÈ›È+eWvœ-Gh¹¡h] å0åL‹­´ 5åJh¹ ”»œ-×?üO>ˆyoW–eG²Å÷IovÞ¼yó{çì>}ññ9ø§ôã%òÑt“ý~Ü‚×19ÀÓƒL†™¼žÉüDneòF&oòAÅ/$˜$™h¼÷?¥˜Œúqt&‡™áÕ4ïcb0É0Éúq&?Y>ɱܸÀo:Æd҇㸿ٷà­Ì»ÝGäÞ†· ¼Ã0ÞÉjNðæwñÓwùñn¼‡×Þ+ð>÷+hÈLh¦©'µ}–fîWÓãš%¦À»C7ôÜuT°¶'3–ÕÓZOÆÈi“92fšÙ“V-K³衾Œ™ŠŒZGÓɑȠfYzÆè.å ©#i­{8VÊÛ9™5 ¢ÃKö¨&aéÝÛ·eé¹Ý­û¸{2I‚¸f0§&ŽÄÕ¬­Ù6æC¸[à#÷nb*ÈT m)†½ãšy¼aUøb­û>ªÀ—Òrš5ž&W][@k)Ó´E#ÎŽnгÀÇ>® ™ôÄ :+7¨¥µD®_ÐSj.c*رºZcA:296¨-î¦#î¥)ÕoÞ*JÜGþ”˜Â'%ºð)‰—âe'ñùXâ>-ñ >#ñY< ñ9Ü-ñyÜ#1/H<„/J| _–ø ¾JÑøî“8Ík㉯cFby‰3¼óQ<&ñ8ÎJ|OHÌá›Oâ[߯w$¾‹ïIìA\¢qrŒÄ9œ—ø>ž’x?ø!~D–Tr'Ãÿ±ÄOðŒÀO%~†ŸK<‹_P˜$nÂ/%~ÅÇý üFâ·¸WA¸ö¤uͰµ?#ñ;öÇsø½ÄðG†û«j$­©ÈÍ#‡)räò?Iü‘x/(h) ^NÍic¤Í …‚¦r‹½ñ>¿*Ø\E"*Xir(¨_žõ j†©Ôe‹’.Eº¬(l©ÆU ®.Ëj¦¥[¹Èg$ËI† 4—&oîxV³"CD»—/•T¥“Â=ã¦Éz£Ú˜º‹„úÕ1j WP»0SpMhIq,,ÄUCMiæ–…9© ‡b±ªD¹ÕåT“ ܹþÒÆBé [C¦ž¢­N€QW¨•¼+i瘟ö7.¹ Á7²(²N·•ôdÒãcõ?:´ÀÕG6µäz‡Y¬¦ŠN¬³´ÜxÖV`ÙÈȰâõªÖÒœ¶*5ª[wC‚O¸!‘ zj”U6•ïc$í1¨Ñ“ĆñlRµf{ÀFIW’n êcÙ´¶P4 ysÝÑå ºq¥žN†s£¦lu20ºzO­½¤ª>¥Ñ•HÅšŒIm’‘7YN/Šk9•]JQ±ý/ÈÆFC;¶m''ŽÅ åúÐê›c+Ü/6TÊU7€‘ŸB+îà4-©çP¨Ê‹†âÄgÙIɵLNi µV.ô5Å ÉñÓ²©´¿R—h-Ó‹…4¨©´FÀ¤VMïJá/sÀŠþdç ~›Ó¨K‹ã>‰UTvyuR\`2çt¥>²„^â¿BËêÕqüé¦VàèueñŪ?ÚC-–ǵÔdJRœÞîB6¿yYûÝ9™Ð²9»¢×Î ê+IÝá´,oÖEiBîW“É[TÓ (+¸ . •« ŠHc¹»EàK߃*ÝÐKß^–IÑ×R'}í ýéõ–¨‡þ]ˆ§›ž^€‚Æ#áúÎñl[ÊÔ„kfá ·ÏÂnÏÃ3Ñ>Mÿ<¼³áŽYÔ†ƒžYøÂA÷,üá<êÂmAo2L Ö÷šƒî¬sŸÂÚð Ö‡pOÃíšEýÃ6œDSpÏc3„À«è+ìzW Ü p£@Þy¸*-×Ð2ñn·¥°’”b[¼³`ñCdq-ÿ·ÅnÛb²»!,¾ÌîEÃv¢† «]Љ½†0)EË*­L#E7aWö¿(p û %®ô“G¸>ꦧ çÐHC£ëQâ„ø²<šX¢~ m,˜GsÔË8i⧘¸:‰äŒ bºƒ´Þrš–γ5y¼hšl¥qcÔ˦]Þå xNòRO7±Æ\áêœ;iGV´¹˜eûy4œÅUÜÏ\Ÿ†¯=àÉcsÀs?üm`K/n?]ôÐð]ÄV˜Àn×n[Kïþ/äšÝM ž:¡O¡‚íÏË54N̉ÓXË&6´¹òØuÝy\õpÊ…fÐõžEøáh‹Š hŸÂ­—uDk™³íID¢>W—?àï˜{]ÿ¶®º@I¹NÁ;MAoÀß•ÁÚ@]{ ®³-è£yPæqíà ¿2=ÿTPkóØ>=*(íz¼óTpÅÈöÛ‘u¬¤ç›‹Ø$¡Ÿò4+ÐržÃG{÷ ž(ä讃9týlWÇævq`ü掀‡CÊAnçXPd¸n?á!¤ÏÝ‹ø6rfn‚·ß^‚E%r[Iæ•$³5x9>@¶q?þ†O ø?PK•K˜ðþBPK7A!org/hsqldb/StatementManager.classW xTWþoòÞ¼™áBY²M $¬™Ì$ ­p‚ˆ$&M(%‘UáeòH†Nf¼´îvqßpVq©Rµh¢ÉÃmA+hë¾÷}ßw[MÏyo’™I&|ßÜsï¹gùï¹çœwóèÓ>àZ!üØÓ‡í°4 úQì.Žh¸Õ»ÒpÔŸ»x1/aÁÛXà6Þ áf¼”y/Óðru"óçÇb¼‚…^©áU~”ãÕ>¼·ûqîô“•»xx- ¼Žw_ÏË7øñF¼‰—oæá->²üVæ½—oçá/ßÁ³wòð.?ÞãÌ;ÁË»ÙÇ=óð¼——'5¼Ï‡ux?`Î5ÜËž>ÄðLýažâ½ûø4áᣠëc¼q?/Oûñq|‚‡ayaŸdOñl”7Æx°5œÑðionéݺi”¶¥Ò½}æáDOwcK†Ý$à3c}F¿Þ®,Ï•IÄ»£IëãèÝì£}Öbf¼Ç­ž.Ú–JöæÉzMíE”ŒïуFVÅŸ4†¬ý1s¼G@´’MñdÜÚ,P,¿n€Òœê¡ó©iÃ4,â 3=l)Úâ,É΂^Ãê°tËè7’ÄÖð ÅfÛ©÷“®Œ&“Fº9¡›¦a DòœMеëI½×H¯ž\7µÒè =ÙÛØa¥ãÉÞ&v5ŸüÄn¡ótêÝ ƒ‘ÌçzhÈ3ßa˜f<•lj­ËãNŠ7QÒ l-¨RXa;‹ÓF,Õ?OS\'OÎR8(¥Þ¸ié°•ÁÖYÜðY¦ #GX ¶rðµŒ믈›nm0a5îvÈlØ5|FÃg)?¶ ÅŒ‹l˜è’ˆ‚`,»\ÖJÜ€6ªË¦«D;v ¬™S¢J܈]7a·ÄC âaœ“8ÏQU0¯zŸçá’BG•øöj¸ q_Ôð%‰G±WÂ@DýáË_ažŽnº;‰¯âk_çáŒã›ø–Ä·ñ‰ÇqIâ»øžÄ÷ñ‰âG?Æ% ?‘ø)~&ñsüBâ—,õ+üZÃo$~ˆ‡~òBèZÚÛ$~?Hü’ø3þ"°$[}éÔ­œõÏgCá¯<üMâï ý<þÁËJü ððoþC—+ñC’±þÿ“؇IŒã)‰C¸EâiÞÀ%¥…`e*S`aË݇Œ˜¥QÁª93UÇÌD¥¶3[¦æùr«ŸZP,aèÃÛG·ív%j?Q{¹3•£umÓR]–gr£\^¥TN…–¹f·Ä:ãý†iéýÔf—hT¢“í=¢Ê¼ ËÝkÊ?nG¾^÷0‡ÕÜG`r Òéj©QÌÀZ¾J¦¸5³ÉæÁtšnеœ½ŒÚ`ÝœZ0o —«Yé5Sé]éÔ€‘¶â†¹Û8šúÇ0/äƒÿÕ`º2–jÉ’ º44 ÕÆ|"^ ˆÌ³qUŽRy3JK 8+]Ú; é×IˆäéŒ }c3‚ɺBt9[ÛXhcÑ9,ÞÙpZ –œn¨/²QÊzûiôBŒ£\ìàWHÆÊA²¡mep56ÊΡ<¢”‹PÅp@±QAE£بÐRÏ¿ELàjxs·ÜQÐnà „&HRÉÓâmô‡8|zfnûŽÌm÷Uûè[¨ªž¹…D··p=‡F-UÜÌuïµâ,SY­¨î^€*gCW@%•µÕ66v5Ðø¬†i1å$ªnà¬Îf¼ätØDÐá‚ø¤L„OñãÓÌò„ ŸÏòès<)“¦Q¦=%ÃøÃŸe­Ïñè³<ÏÓ£¬ðõEõ%õe6ä+¼÷O_ä/Éð2¼ÂV|•w|w|Gßà›<ùcû¶ ßWyú]~|ßgL?á‡ð#Þþc–öïü #þ©¯óäg2ü~Áê~)ïà×.X¿‘à žüV†ßÁ›¼ù÷2-ÿGo¹ÏÔŸ$øs!üE?ü•cÊß™òBø§ ÿ‚s°^b,ÿaqo³ìã2üÆYÒ;LxW‚‚¬Å45E#]Q­ß7ßöù:2„WL‹Ô`RSʬ\½Ñd"Q™EÑú“ƒj$G¨Ü–WR “áD·šPÚ•„‚Pke5ˆ¾Þ,Úå\Š„+$, mÑÁX(¬¶E# u( :#Uk +ñ¸JÊý«D¿©9 ëòE‹«ZûÆ®ºl - 6#ØÛ¢A2þ B ìêVb›”¾°ª{Ñ&¡€Q! œRwÚaù¼JàÕH]‹”Ì¥ÔÈ*÷ëLKxÀëñ7"ùüfx Þ*ámo‡{Þdé]xSvÊM”íá ½½{c—„w#Ì;G§x¶¡–£«tj‹Íöªá`@T²ñO­J„ªü„Œ£>ЖÔ42É·†Ø¸n%¼¡0=C8;»¯¤ ÝJDéWµºôœDz=§ÅÊýBVc‰}­š¦ì£t‹§ÝÛ«&’ZdÓ¾i¦’g4fL$-í¡é© = ÈÕeda÷TuD¤hÉÜ4èLˆÒ±Qei!šºƒŸAãôËG3·Ì ÅÈI|™gµ#éפ´cß–Pb`… &)º]ž&µdWünhdª%6EùÖ\P;)%´J@m™ 9ÆœÆÅ y™æ4+‡²tîg§§ÒN{,УN Ul–fëÄÝ9½´YÑB\¦¼”Œ)·ªZ4}׫:Ù-Š/*ºå%l lm¶›wû¾µí«Ú,·3‹ÆÈM «t„ä#…âšÕ&å[[4!dÅÖµnýÒL¶®"†âfêëdZˆ¥Ù:#Auˆ¶ ºÅEÜkõÔ1yæœê¢F¾ñdß³Ò© Du‚k¦GÔ½mJ8L»cÑ–k<ù¶­Íq¦Ÿô[¬ƒm …1˜ŽX'ÿ=ôª3bnºÒ•éí3»r©¤ª,×:ɼ¨s6 …¼ßå‹{¾ÎžËÊk„5¤ß-×ZZVÛiK<©ß²°Ò%aùé Î¥‹ü:Í,]ó®žC˜y½Ÿ™›Bw ƒ–èîÕ/8DˆôSQúøiÄÁâôL‡yEþ0g>%Nê‚i¡¸~z]»j²'Ô¯$¸à<ÙISèγ×oá$9u§ÃGµI™J¶{òx¯Ìü6i ‡­Ÿ_+Où]s :õÁxè*¾œ$¢æaY9i‡¾ìjÜ3ãúka.”tqÒרiòwæ 7ö€~§ˆ[0 º-Q5/?ö„îàú©=¹…”Pt'¯ÍŸt¢åûL\ç±€ô'4J’–ÿo…Mè2b¤B•'߉Ål= §üïeâc€SËô€a5ßUîç>³« ºOhP5§‹=9 Y–zMö¡€3¾êäøöLêÌ'¹;)/)éò¥&]§¦sd÷Y?ª­²7fS[²oo'ï壌Ý4š.BæQLÃò,Üÿõ*Ÿl¨þݞݕ3—d ïËþøÉg6ÖI\0ú vú£xàú¬×ßÒßôeJOAaˆÂn=F;ôŽ{‹¥éÕúà!(ðÛA°{ÁÑ0ÎâYÀ↣ 5ÛÝö1(×~¨ôêムëƒi´a ½ A¤ßÞúÆœá%©EÞ1A §ó0ÅO‘Zž³ÁqÖ€C‚¸ ’ì‘`/Àq°Ø«uÀC&à øÂ\€ kÉC¤›Æ {ÙŒz·= ƒõ7d)¯<s&”ï“à*Ò¯{ìj¸ÆT» ÀFï3 ¼x¦±°R6“Þ3ºhÕ‘‚²†ÑŒX ¦·Kp- ¯KK)pdâxö”wn˜¹Ü4²YaÌ+‚ÚaŽ@5ÏÇ 2nƒ6UûÁ9l;QC&Ö<³ºmKìåv}ó£À,4kjv¸„©ºÙévƒZÞXNÖפ`v³ÔPnwKõn"¥àÌÌñÛqäÄ‘ú1˜›‚Z~‘Óæñ›„º0¿ÙžÁ©{ð¬fŠr) ÎnvcI§ÙÎ;Æ`^³Ã´ÀÜòHÄèeï×t·}Ô¶ÄYî4¨ B¿ŽÎIèš%·”‚Æ%…å…ö‡¡S·ÅÙ”‚…ûa®9ß—¡hQ¹Ëí %ÿÌΰ.NSëÒÔa'w¿ÛÞìô¦€8Î!ÞsM ‡á¼´eKÈ2·ÝM0ÎZ·ãˆîÑÇ¡ÂíÐGMGa)yÓà 2!nâq¨“ c*±p pÅqpŒÃb {Ñ8ÔEæÕw G‚ëñm¨ÒÉ ‰<›¶ßI®J..\¯è‚å ²š"L!0"ßL~léiÔýèhmœá’ïA#Ón„›L‘ tÒ»•BØ“n°^ Ëš™”*t;l ~ƒDá\Þcrñd…ESà»à!EdýÒÊÍ î£âઠU¦`%W g!'yë‹T&)Xµ…LJ¡å =ÿÚ÷C‰Ìä®BF(ý^€ŽýT¡G¡ƒ~9ÕŠ, dÿjF‘U9ØÇ¡Z‚áq¨%l¥ã àn[Mp4C†#ŽQ_¢u5ݶ5fý”ñ»¦I_åú;ñfÃ1iÚIY|ÖŽòð9X×Ó@(ºmGmM‡!Sƒ=$£¸‘ 0ëõªzËrHãP*Ámã€xܲípKp;gËp§ õz ·®ŒÖcä7zÒcÃz?‚]$wÐS+"pG퇡·ëð_Šˆ¥›ÁÅzK2¼¼™b²…¼Gñ¸Ä[ZëGKàåÒKÃÖç3`òBšÝ•S¨+sxÁ¶QÜ ÷˜äaBÊX·8Jëì½,—o.ÛòjÓ-Ü„zª©€¯8Å™1Á¹r¸€õšÁ¹8+XÆöê&SŠN~c¢U—‚s&{p®^GìI>îÍ Z@uT0á™é&"…eMH±ΠaTXƒˆ7ÊxN÷ÿPKBQv4! äPK8Aorg/hsqldb/StatementQuery.classUKWÛFþ¡ „W¡åá&²Mâ@Ÿ©IbHq‹ièK¶§F KÎHNɾ¢Ûn²hÉ9Äíé"ÝõœvÛe÷ý9=mïÈìÆP¤3£™¹ßýæÎ}Œ~ûû§çæQTq ºŠ!„»qÙEUêfewYJ¯¨ˆáªŠ9ÌKérúfÞRñ6Þ‘“wåòµn¼‡¨ÅU,ຊx¿›¤7,*¸Åй`Ú¦wCÁÃù„S(šO8¶Ç=-iÛ\$,Ãu¹ËpO_uD>¶ç>°r™Ø&w]Ó±ãk%.-E Ùº!\.–6VCÍÛÄÃwÚNŽ3tç¹—ænɢͯ¶Ü-ܸ(|h¬¢gÖÕSÜ3– Ï`é'«ÔP¤znÓ3²)£¸ed,²d$ëXÏzþôŽQàîmG¤¹‘c˜n2Ì23±5‘ã‚çV wo“W4ÚJG˜qÔÍ\N‘ Ï”Þ èᤂe ·‘Ô0Œ5|„U )ÜѰ†u HkØÄE[&°­à®†ÜÓð±ÞÇ$GçðxÛž‹+/yD+ØÕð >Õðf4|Ž/2È*ÈiàøRA^ÃL û8 ³4Æ¡‰žüÔJ¶”ÚXU`1Ìœ!þ ý/Ç™ˆÉòDI¢ÛÌîñ‚±BéH$íªÍ.5¸&H¶‘ç"T›SŒ#z2y&¨ à€[;Mš{%ao=*Òf,ÉÐû 9ËÆO«JK—{Òõ—¯eö))(Ú ÿ[K§ÖK\’=XÌfI1mæ÷$åpë‚!´J¾L‡iç+‚l+Ã\KŽä©U7r’Œ.:y=+(‘šÙk‚Ê àù֋w¨Î…pDlYöD,J¶gxu:§'W÷‡FÌ2ì< ÓÎÓUq¼”®Â³¼èU£B;Ý2\~\¡ä(·”‘Ñõ rl·ÑZ¶D¢‡l€éC –XÒ¼<èÃ8&1ëMÌú~½Ð‹áÅL;Ì„›+ñ¼”_/cEGxv Ïneêm<»ÝKF¼œe_Á³Wúð*¼Zà5<¾– |Àë}àZñ;+ñF¼‰åïb©7ûÈô»yö~½Õ‡·áíüz/ßɳ{Þ%p¯Ÿ±âIcàИ®@éRà²hšR°d¨'iÆ‚#©Ñá ½d®vnSO¥–‚†|g3¸Ã˜kS܈[›”û›T„“Q:ÂÕS3>LS¿?_¼_O¥ÈöæžýÚA-˜ÐŒX°ß2ãFŒt }B¤-ÚPBè†Tõ[Zä@¯66  'tбÀ} ¼1ÝrXÞm{ã=äHû2d„KìÆò´Ä18!ñ’˜Ä”@V✔x6K `§Ä)<(ðQ‰á!‰ÓxXâ >.ð ‰OâStP‘(H|g%>ƒÏJ<×|Nâ>/ñ<"ñE|‰,ñe|Eâ«è”ø¾ÎËoH|ß’ø6¾#ñ]|Oâû¸V¢ƒ_?À~$ñc<ª úâ‰=I#&ñ<*ñSüŒàœçNC;iVÒd$ôëVß̺S³4‰Ÿãü-‘¾BÐ%~‰_Iü¿‘ø-»âwø½Ä0%ñGdþ$ñg<.ñüUâoÈHü+XžlK³ôQÝÈá{çXTãÔY\Œ¥³·‡r½¬Ì#xSñ”ÜæŒ$ÝOŸDšëæ"MÁúùú#ÀÚüBó%·ž˜£DA½¿¹HÅ)ÌžD|8ØašÚ¡VSŠ=£º¥9±²¤doާ½°5åÉÇt8™6,ûÎJ>[DÛ[&Èö¨- ËXž£ù&;¿ÂÂE2A׆A-‘ÖíCºéêAE½^cô®öwï)Z€ÃÝú¢¸…m_ÓÖúçÔÆM±Â²ëƒD¯35j,:—ÖÂpØ×É`ŽL2•–fÿL›qa(ÇC©Â¶U(OâöUµË–R°¬FDÕfÒ~wf‡½3—¥Ù™¹ÎJ¡1Žç„ôûgý&,§‡î™à?º&Ú#]öè-è¡ 2l¡Ùrâ¤ë-€¨xeS(,DEîã¶”‚gáºw e¬½N˯GWŽx-‘*hl ´dáéå·7ƒš>{ÒªœDeïºcöa•¨†fÝà‹uYŸÀ³ÿ…JZ÷Îè+ó /a²eU“¨î L¢†ÖW„*hV{”è¹Ï­£çûç0”Z·Ó³"в.‹º¾Ö³¨jmQé«Ü _mõê“Xø0«Ì¢>äjÍbÑI,>ƒ%ôróY¨!Q¾ÑSï¡UÃé{ÑFãÒzOÛ 4Þw*ó5Ô{Ö¯£Ý~UäVG#8×Ëæ¬žASÎÔÙ|ƒ5°F*P±pPÌûضÔÇ–±å[Á΢³©¹Ò`ç°s©yž—}…ÈœO3/ÐÙ*ŒÆÉ8¯‰Šf›a­&œ"²†Š­¥±u„ßJ}mT‹p ‹QÑN}›ñ–`Ií æzjn Ñ:ÛD¨Qãb]¢³Ku¶Yg—p*»œŠ+töUjÙ•TlÑÙ× ˜Ã¾®³«tö æ±$M½ÚsÙ5»–m¥æu:»žß¤Æ Tû¡~›è}‡Š©ø.ßÓÙM¿oÀtÖIÅ6jþ€j7Sq ·“·él»°Û á*îÔÙ]4³»©ø!-–¢Ú=^ö#ÝkÀZâz-²ˆÅ}Tì œSí'$ÙýÔÜIÅ:{z~JÅ.êÙMKvQq%-µ‡úöúPEQía*ö‘J~FÅ#TOÅ :ûõ¼HÅKT¼¬³W ¸•6ýû³Î^5àvRÒ2ö ¿Nµ¿ì ö¦—½EÖùW/û›ÛØÛÄÖ;T¼kÀ«ìïÄË?ûŸûû7õ%©ï=ñ¨Hêì}‚÷‘i$IÍhØý!qެ ®@VÙGìcêÛaÀÃìª}êÃâ3ªÊa‡ÙçT1ØQö1uÌàÀ2Ã9šÎ]˜©9„F‡R1ŒŠáÈ#?Áà#øHªòñÑìIba JˆÕù8gàŽÅ›ÃqxæÀŠ·t´…£ÉƒçÌ_Zªj E[ª¬ZnJÖ0(Œ$–4­ ·…f‡WG¢‘d$Å©+øÉP2Ls—ÆÖ…£’@,ÞRµ&qakóª*Ñ‹<§Ð´™¸nI}}ér®ºXs˜AQ‰m¹%Éx$ÚR#ÆK³ dáp½óp±ÆPÒ3ë£Ñp¼®5”H„‘™Ž~RqðlQkEC-áøX«ÝO,â(wI2Ô´®!Ô¾4´ª5L2gÒá#zxc¸©#‰œN(±S[N$P¨5¥öÎx8ÑÑš¬Z,@ ºr£¶ZÂIÙ¥ó—¢[F¬ó2á#É÷¡çDψ= :yœu^ŽÇÎ+бáA@Ÿ%&V¢£Q¢›ã±ö¥›Ú‘»Y¹ë×þW’ "5;ÖŠDÝűְª.Kå iU r$JG2 «!©ܯàŠäÈàDoZ''-koFÓ›Õ‘\‹G!i“§|y¾‰í‰prA¼Ž‘ËK«Zõå©öWd¨E4\^nN®ú_^—¶ˆ$P†±ºX[[$¹Ä:Í ´’Ò•¤¯p¢)Y…Ì”ôb°=žB4ÑYŸ()ÍræL8‡u~¢É«à#>Ä‚O€OŒïß9Ãù¸âM>‰O6ùIìT“O¡b*|`ÂûT| Ÿ1ȓۊ*Ùêüd“OãÓMæctXΖ®‰Ç6È[lòj^còSØ“Ïà3M~*Òã§Ë¥&ŸÅku^gòÙ|žB“ŸÎçš||bòz~†ÎÏ4ù|Þ`òFÚoÁÂ9‹g-­_Ðh²© ×^Àê|ƒ1ýئÉé%T,åË î6iÎÆ¦p;¿É* s9_fòü,“ŸÍWšüjžËÏ3ùWøù&¿€â«LÞÄ›Mæ«MÞÂ× ÷0y„ð×j _gòVÞfò(?‹Á Û’u±Ö޶¨¤Éc¼ÝäN¾ÝéËÃÊÏÁØRdëD›Ã«ê©D£è>aE,¾.AúŒ›<Áу6ŒÆŽ¶Uáø’ð…áh ¥ƒx]Ï70(Ȩ¯>š £ìL¾‘·9H¢SKTI×pì&šHÆÑI%M¾‰$u¿Xç—˜üR¾Ùä—ñËès6¶Ç¥Ý›ü þU“_Is¶n¾FÒú:ÍºŠŠoPq5ßÌ`˜m~kDêlV<Ú4?’ÀU¯áך|+¿Îä×óošüþ-“›o0ùwÈðnäß5ù÷øDÇ6kcèJCÈÂM„ò}Þiòmü¤m+)Wjò›ù-&¿•¤ußnòÛù´ÓÇÜr¿~ÛÔå‘0.'íì.~·ÉÈS&¿‡ÿÈä÷òûL¾ƒÿØä?á÷3Þmg (£7Ï %Ö, 'I“(—ü“?Èjò]$¡Ý¼Ëä{ø^“?Ä6ù>þ3“?‚K±b6Îd%T”RQNÅX*ÆSQFEüQ²ñǨ9‰¡)ïç?wÚg<Ò²&™¨ZLÀiBjdn<„f6ác:­“¹ÿ‚?aò_ò&?Èeò_ó'Mþqû6æÉËŸ6ùïøïMþÚÉ34ö,ÿ#Z}wçgòçøó4ášð‚ó¸J+¬[Š£Ÿ7Y›À`HÏñXk«ˆf&ÿÑä/ñ—Mþ ÿ³Î_5ùküutͳkg™ü/ä[< —ÕίGGôÉùMþ–ÉÿÊÿfò·ù;ˆAöñ.ÿ»ÎÿaòRã_¤Õó[ЬNV™ ú»÷øœL§mevÃ"L@Þ7ùüC“¹™ÇäñMþ ÉñSþ&&?D«æŸëüˆÉ²é&ÿ‚Ó505¦qSÓP´š‹Ü˜ãø£jðÜbnijnÍcjºæ55Ÿf ƒÒrLÍÔrM-Ov2¦x¶\Ñ•šßÔòqÛZêH+Ô˜Ú@-`jEÚ <>öÉÚ`ô…ZP‚Ƨ E…jÃLm¸v‚®0µ‘h¢¬»Y©6ÊÔFkcLm¬6ÎÔÆÃ'ºVlj%ˆ •jeºVnjˆ¨UòŸ9ÕÙã” Ì6èÜ”#åë¦AEÅçiWÁØy$¾•Eìõ$¤)v˜DÆ5Ö8gGCë#-¡d,ŽØPŸ Ç©îÜy{ÂUËC­á…è¬ðœ„ÛÚ“›$/Âùa`ˆ$–"‰PÙºM®qÐî2[z‘‡šEÌ ‰ †C<’ Û{Ü-ñXG»3ü„ãqdz•˜8Ä;¢ÉH[X5'–Ô÷\ÉžÛ,VèV´%6¢á bº¥­:ûm#KÔd#Ük–W„HÂâÓ¨ô‚IJJ»'Fvv\IÞò)‡L_ÊD—åЪP‚‚ŸÂlÕ“dé¦|ÔisCæ÷fHbp:yEm /Eqáí°­]ä’tM‹$æÇð 7£Ûj¥ Rj§ØŽ'0(V ,"ìu9:_\ƒiAÆxJ³gÌ=5€üøPÐÛ[Åe(êr ´†U‚#Ð,Åž–åù_juH7ÍÙr=¼ïˆkͬæ6b%W4fÏž¿‚6ˆ²Š‡£â6àLÀûLêÛîIÔYŠJ¥á r–OjèÑþ¯Œ6[×§Ý^æn^ÜÓ~³’¡WË”êW7v´¢ð´‡âBÁãúI‚ÎÝ3U.Úðÿq/t¼gˆ‡Mª$v+ ÆÊj³XJi½¼´KD:Çõ¥NO›I©ió-Öæ-ß}Z?ßót¦pÜaéRª²û¹>ÜŠŽìHýyÊf†wÛ@¶)ÒóàÁÇÍÖ¨ä”X^i"fñÍic´$3«¤W¹ôÛ íömI°·ÐC±âé"ÔŠAMés¸c¢íSsŽˆR¹-λÏ}<Á1Ïy{‘oVXE€D×`;¬êÕ!†~²ü2bfC¬9²:BÞbŒ´Ì—uCB%Œ:.rjnÎÄy䤤— €8ö#²SªÃJzµ8š@‘sº:ÀºÖPç™ë”¥¹¶Øúnš ;»Ñ)ÇÉbOÚmfa<ÒŠo:3Œ Æl/‹FPæö-Öé˜DZ¢«D Í3ƒär‘6YÓ»MÖÛGzÜídŒiîho4…È‘-éëØë ëÐ8…”¹º ‚xb¨ÇânJÿNŒc€ÈäàjõÍèQ#I‚IdZ2C–ÉÒA(íâQ# ËÁ«ËñŠƒ¼®’7Ueç …zhU¤U,6¼wþÅ;â 9G©?c0$Íú>l©±Öõá´³AveÀZ®\n{¸ E“<Ç83ƒ&Çü)½›{Ÿç`îaVby•psúÓÉu#|²É…Þkk´öúZÜç²~ñNl±¿4Æàô/Gz^ìk¤×³KfTÉñçÄ‘mk‹Eç´Šd­.ÖAgÍ)šJø6há–3±µ§ÃFƒ%Y¿“Q„í´‡ãÉÅÑJ§ü­'âÒz”É ãüÒ~#cÆI,'”Xtâ4ùXÓË5]W©“Õ,ïž Ì´´÷7BûëæBzâŽÏž[Ž6+Ü[9󗿆~^Íúεû]™õïD‘Éd}4SéÃÄãò⌽Â}¯ %æÇVY±>'nvüüYŸSé¬#ÝÆðÆ¤ TTÃq4~§‰`dg¼“ˆD_,*[ƒ³°C#5ΗÒ%ö9xZÛ‘Hâ—%ðШ§²g4«¥§Ä,zëm—;LÓcñd¸ï^¨û"ër×=ér'¥B ³éÍ ‹’Ÿ œêä#ý%¡ÿ^$§ò™Ú’sêû5ÏiPögþ>Ö÷õZ3Hæ›f5 /G²Ý$ý~ßWÊËC¶GÑ>6…Ò‘Îà¡?¥w‚æôóªôz^ÓÒâ$‹UÇs=314uI.Ñý夻/^)C»¦Oì¾½½o;·–“ù+)H{òñ½A–!kVýý‹ r”%¨%Ó¡µ[’êîö\Þ}®IåYMɹö²~¾“‹-åRô³=¦Îïçäãl8í‡ÓÁgAœ>>÷Ê]¹‚;¿=˜kéöÕìÂÖúèúP<Œþ"Û¦êÜþhGˉß7d £+k(Ú\ã¤êËö×’Ä…Qˆ”7¡´éˆ³0 Þƒÿ€ ߇€þ| ø1|"à§ð–ñ÷ŸcmhøÀ€²¡Ãö+{ønÐÊ\»ÁõÈ?‡àˆB‚G ç–•cl?¸ÙðdÐŽÚÐ\ ­²‰¦½…´<o*ÕuûÊeå»Á[y¼e•Øt_Y|A·¨ºwƒ1ì>$¦­Àâdª ÑßÈí ˆtù“½_Bh |aÂ1 Þ l“PcûyÁº„CªàpOPp„‚#¥àhÇ(8VÁ _G8!©é$\÷2„5I*§(~f`›tBäÖ"lTt`û„ Æ.Ax=Â¥w Œ#¼aBá'ìÀþE/Së\¡ÖýÂÉ¿®ú¯’ø®JÙv¨`Šxàl^ѼÇ9Ú™&íí«Ã9›ëœÍsÓ“%íù–˜$›3ÒRËíJ«]©MÚ¹ø³òRPd Ìøu¡/ä?F–1&ŒtÔ1´xθÎ4¦3—nüÁce|Î÷ù|~¿Ï—çÏÃ?¢¥?Ï_äó" 7ó(ǰÏ)9†eå]PУ±’í… ]0°"”íBîvAQ ªØY¾ ï‚` Á®¡P(;†•cÓÛÃSÛXIu$²³b§°iø &Á<8¡ÜÁðÔëL?B{ðQ‹uîÎgq6èè Pø’Z±‰žÐ y…#ˆÕ‘{aÔNbŠ|N!Ú0L•>G»\ú×4ésÌw¥Ï1ÿ%}Nn‘ô9y1ést&}Ž˜ô9Þ6és¢àP‡+x‚‚#©à(G+8FÁ± âY5n“>'çiésòŸ—>Gô£ÏѧKŸ“{ªô9¹oIŸã¿XúA}N~‡ô9ù›¤ÏÉIúœ]úœMúŸTçä_(}ŽXç Åúœ¼¥ÏÑJŸCøäsø!ésôZés n•>'ïés j¤ÏÉ]+}ŽþŽô9bþTOV|ÎÃÒçî@íidò£©æ¢Zµ«rŒqm‡‘¨â±ø;®2èê‚ñ©üg«=AeV„äÞƒÊ+÷BIEe”V¼²Tþ}•8 *'ß·ÆU”cqN$ X­ê‚ Sõ ' wÁÄjw F…IÕî û ä.%œ½0ù± û!8‰A#ÍŸ‚ ‰¹)’ô” úË)wC  pÅ^˜jgN a¬¤ù'3 ¥xAvæ#›St©ÚSô¨fL«(zˆO=¨Ýûa:m©O¤Ü\MÊÿ´}K|§¤Å7ª]Ôr aºÕÉ ºqûafµgœzvyå8M¬á!²³Rþ ÔêN¶6M¶¶ÚUŽªCFf§üs2GÜŸÓ§Ï´¦Ì­v ¿÷úmi.´h—m¸FÁqø{–Åì<³õ]p øLjÌ· 4ûTSQc΂ŒË¾ï…)Èh]°(•wÝqø>EòÍïDžñ|¸HoOàïÙÇЙ±­2~rhÕÅ÷ÊÌê•a¹äYíjü]M>A(#è"mxÈ º`I æôì]š‚ªž½ËRìÙ»<Zнa±3½ÚMUÚçT2MÇÖŠjÝ6ÙôÝOOÄY)vW–Ùs«ù³¥ÝtÁÊî³iî9)¶&û\kÙZœ/ÈÐ"ƒ'žk£æ bJô jCŽ»Eð¼NÈ'ø¢6;‘ tp•óSðû,”.è‚ÐTmiqîhªÜvÜ¥»‹P °)M½Îu.ð0ÄOóXÑë´ ›Ù7£¥ržèiÈÍäúÂäÌV‹óÞ\íª@gÔ-¢\“ʹ¾ÚtYó(«ˆPVaXÛHÇ|r©­‚ÆZšq È-bŸòŒÂ B[e92­PÍ?¢µwÁ…·‚QØŒ®ñ11Ÿê©xp,±’gïÚ?6ׯ¨ ¡mHÁ€j/bnBu¯ÙÙí-„lÒîNh³›n3®ŸVS®_XÜFŒ1Èà Ä`9ulÂmKíèÊ ÞZÔE)㬞²þo˜°’”92?¡‚òÊ BÆFe…;L=UPÜ^¼ ®x:a˃p E½)¡D€Û SR0DD" Ñ$D] fú/ED+~É0‡’8ƒÒ¸¶x'"æàíàêhz E©¸'!™® QCz[Üho¦´?fã¡V)wOF¹Ú}Ù–ŸÛX)2ཨ/1ã!š‘YxœXO¹´‡È ëIªI^Täçgã#sY‘1ˆ‡mQíaè³ÄÊûˆp F¢z=0Ôà !ŠúF—e*ü CNz¤ŠÊQ…Aݵ•+õ%"yLpG/‘…A7Êuµ·²œrÈŸã¾ï„I¤«_E=O0èDg€µ_2 8ߪ ÔýÁÊ ëü qS-¢Ý¯©Ø×Of˜£AûY|Ê~}%þFÅÚߊ[Ì,2 IÁÁ–î"V´}ZXäï¤hÙûvÑÚ˜ÛhSšB~®f;r$î •£Éy[³™G·dÚ¿Ž–Ú´i¢½/è"FœWI·LN¿"ÅJ³Ý&>ƒ nÄ£¸oV÷cŠÿ…ô6A'•«”Ïà  D:¾(jæ™m”È]J‰&Ÿ*Çó<7Ûº‰µ‰ÄVO?á«ú[úÛ×êŸê‡¡Øëñnö^ðZŸnüŠ}^ß'úÎð‘ûaî'Pœ7(osÒÏ»)oGÞýŸõs¿ŠýCýåþ6ø¯ñ_‡ð ÿÿs?ÈïÈ_Åù;òÿšÿð‚Âä¿ ªàŒ‚„×ü¸`'ËGAWÜs†èÌøœ=r *Á-Þ7s°Cg&þÓYnÎÐIG Hgyú‰#'xŽÏŽvrŽÁê‰TŽùu˜a 9a¾£0›ù“u"¥¥Ñ7 ôÉ:+àŸÃÀgÔ| _À4âØ€Ï BÍÔ’l³A9¸l ݇!Ç{&ê,€?G BgEÇP^b@ü!v‘˜â'êvJ‹Ò18|öý£$‘a”æ1L±{2tèݰŒÁEG Ej < ºïs¸Ëç3¸aø ƒçû³íÌ<ƒ-“î&V…ôót6Hgƒ‰nÁ#´Ó ¯ä÷J§ŒntŠh&NC"hÕGÀÃŽÂ`zé>ホžé=ÙhkÇ`˜ChC2Bs µ.BZëPnJS;ªÅñcc_ ŽÂt3ؘZkÙݨìjÿÆ*ìf‡aDÙÉË€ òH4L CäÒ¹rƒ5¿Î†ëìÀŠ˜x u6ò0øüCN8¹:…¬lv°­iGa¦ÎF#C‹$ñòÊ·XÑÈ>{1¿åƒò‹ýÍ`b¼§¤j¤4Àq¨ŠP{aycƒyʰ+‡€s/jx,§>SœŒ!°¼¼B^¶Ô_…x¥˜‹Wµ1£!èb»áLùuÓ ^¬ˆìC"ô:~c™D.—“U“B,=b¸†mƒÑ"u¿†]šHÎñ–VØLýO*z‹|Êm=g¸4 :A7fSƒ0IÁ3I¼c®_±ÅƒùÓÛj "û¢m½aÈn¥Å­ü0TL­Ð|ÑQ(õ?7RœÞÈf¼˜y6—É̹\„½—‘ñiâ/wBY¦õ E~ÜËŸ÷ëé½<° ^£í(´²JäçuÑ¿dóžåyhçÈKIš—›/—ÈiwËio4Êæ›²ùV'ÅÄ;)&þOò¨ûk†G k(F§¡ù”¦™œŒL’ù[f"GÐl‚®Œ1‘mU¡ýMš§”®ŒRŸÉÝíìÍB/O£OÄÕÄÝ9³Þ"^¡.õ Ù¦WôÊn¹š+ßtÞN[;rÞ‘¼ô‡PÎGoHÞæ¢œÞí×å"ëü»PÃe¤øÇ.øg' */ë‚ò"NAà ‰6yvÝ eû/¬ŽËÈ×.o~!eú·íj±ÕÙ¼X>P £ ãõÁ wªP*x½x®š^Yž~—ú7öHtC~AyLæüô­ñúJñiŨ¬Ø Dòºmc=µ\Wž¶›32 Ž}¹Î&#ž,ÏC)¬c 2ÝÃð#ö$6Yñ­õ ô‡ÿ o£Ámñæ²ófc 1ObScyiwífô?QcIÃâÆ°S OcÓmÃL kjúÊ`4 ÁüPKˆŠš¥ “NPK7A*org/hsqldb/StatementSchemaDefinition.class•Wy`Wÿ½½fgx’È­ÐÒv“«MJ%l‚¤$$ͦ¥€ÖN’aYØì.3»ªXÖÛzÔ‹zÔb5ÖV¡–´(àJï*ÞÖZïû ü¾™ÙÍf³ÁðǾï½ïzß=o=ûÈÍ¢BC5tk1 Ñ2¨`Hƒ-¼ÄxÙÊ´8/Û4Ôb;ó'ø8D’ERÌ•fô¦†JX 2|Îj¸;UlÆ.ÞíVp+£_©ÒáU¼Û£áÕ¸—×ðñµ¼{J»×«´»]ÅxãÞȸ7ñòfoÑp9ÞÊ:Þ¦âí¸SÃ;ðN¾ö]¼¼›©{˜õ.–|OïÕð>¼Ÿiàe¯‚»U¬ÀU|fáh¸Õ·‡ýº‹q÷²ê}ìÞÇ4܇³ýŸP0¢a¬ >Éð~öìSA<ă|þ´‚ÏhVFÏÃF2c \´¹+eÆš¶Z;CMÑ<%:¸ÕÖ[WÇ“ñÌ5‹Âç嬻AÀI бËÌfh·,0(× ö ¨1#ã°(8@N(xˆ2II¤„ Ì%j»™J;¦,#VàZºg½>LÖÈÎdÒ0# ݲ òüª ÆåÙºõ¤3Ì%ù3Y»M¿EoJèÉ9mÆ“1²²&nµe3©Hjx8ž)\(à ×m’X‡ÏItâZ‰(zªÇôo5S;ÇöKŒâ D7K˜ÄÃxDâ0/Ÿg_À‰£8FÞ÷ôvôµõwö¬—ø"¾$ñe|Eb=ë^XäB"î¸Ñfšú•aKŽ ÌŸ:mÌñU ¦Ä×ø¶¯ã„Ä£xL ¶$4»t†²'ñ8žø¾)ñ-œTðm‰ïà1‰ïâ¸Ä÷ð}‰à‡Oâ˜Äðc§$~ÂNý”}ü£Ž_Ì.ºÁεÄ/Ù†_á× ž’ø žVð[‰gð;‰ßãäþÄ&þcPð‰¿âoçkÿRbŠ´FRI+cêñ$â_ø·‚ÿHü§%žÅÏIœÅ9) „á•Ø„›á“Â/R(xB`^iêWgã‰!äZjïëé]¬íèn[$EP¨Rh8AÚQDÚ¢‘¶ö)fà¤À’©ãßnláö¢¸N ù„®¸t…*P5¹×ò þpg'·ç̤±³Ã4Sf^m$ÜU¦4['üy;V‰[¶V õa¡P¨6Ãu¥V ’œ?f¦²iŠX'MŽÌî4y0Û2Æ»©ßFUN'VŽ“WLVZ¶m©kÈ®]éåŸîØD“`ȰÍø) O1—Êtú Z”¶ #’Jd‡“!ÁUáÉ2>”›¹eÙI«%ÿ#YÓ,”Ìx¾}I'íåÌV­|ب'ÊèfÕ•žqáiE¤uÓâ^˜_,Òk#y0êÉ!þ~pþ®ë˜.ßÚ©d©@(TÙg:ÒäÔ…Œj¦b05œŽS^ˆÌ›‹'VÆäOYUÜšÜuþLj»‘ä(Ï#Ƶ–Ì(‡Oµù;fe“Æ®´1˜1†\j0nu¥b1ƒÌUu3–u?²Õ›‹\ïØF"­ŽCNÔƒCzFÐ-ÚÖÛÑ¹º šb`Ù¹ù)IE´˜VêèD¹Y….s¬³+{z_ÇIJ þô¡¡¶D‚3ÓUò™¢^J“ÝuÔšþÁ„¡“^â Td“V6N™×5”Û¬IžÎ-Ò`ð¸iÊ3›Ìć ÷¸<ÜY®ÇQ}.{Ñ$òYñ[¹¬b\m5áκrÙò ¦ØŽ]e¿0"ShJ"jl±?tNÎ/›æã¡z=µ…-*Ð]vt]x®lu¤~Τþko§n­ Ü­!³ã±ä:c·ÀMÿ÷ZGaùè´–æÂ3Åž&ÚPá'P_þ¶IyÝdÏ¡wœY’š´aZ¤»ÉnG³$5‰Ô\;ÍxÆèÉl5Ì¢Ç\Ý4­°Ç´5å˜èé´Áó¬±Üž„rŸü.¼ÓÝ)‘I9,Ÿt%ùÆbúKPMÿœè…ÄPZýô[‡.ÂtÓn¼ðœU?{U¥ròD}ÃAxl!zVºŒ=Äè#®oÈÁÛ=m}£ƒ¿{i½¨" Ô"H?5méûÊT’è¥}¼ ®;ƒ€‚¾BDóʽOÓ Àó4I{¼Í9Ìè¦Ü‹™U|ßÌ1Ì:àÐè4»Åw•¡ªÅÕE¥oÿ!Ìi 0Çß=˜òÙFB¾Ä_Ó¢ø® Ömò>ñLÃÒQÌÍaÞü-*#k‚Íd~¨aóÝc rXȈ.*à.~€b²›,¯²]ƒØA0H°‘ æÂ™WœçÂeôÛK¿å.\áÊ­tù9¸÷Ûvð½®\Ô¥÷»gÓ¥g]x‡C÷-gºk¢œœr,ÞúFßA,jÌ;7ŠÅ£¸¤ÒÛK!r8.=Úè=ˆ%Ž`ã(.ó6Ãå9\Ñ¢Gxu!Jg=áZ´Ÿ|ÄP™CÆ¢ÃÒP ¤åÐxÏX׆ÜXbÓÚ °)/3ÇÁ4­Ä‰ªecX~4ŸÙ\2‚P‹RÇ3FÕÈBêíA1r¶Ú漺—Sòçмí!M0‡Ê‚ !u/Å•9¼¨Eki!•êúÅä9~Õ¸G¬õÜØ q)µØ×¹ö„óʸ´Õꜯn¨'?Wæp ×Z°!¤äð*J*wÃH£wzê‚?³j§yvÆÃ$í"Ð ‘(í!‹qT èF.Üy/"7á2Îdzjj\XëÂE.¬sá'Ô[l[MòN½†‹Jüá@´#ÜÜoB]Q#j˜¡(Be[Øê«ïìööÔ'ð]f$‡V!œg…ƒÁÿ+tŽÍ³)Ô;}§4N”a/Û´löb¿#YþÚÄIö –1`FM‹Îíh»Á6êƒF¨¯~cÏ ¦?JGœ«¡@´¡Â×:£ê­Js¸×DÈ!5ü»ÚÁn£'h²iáNºÓ¦1g2×zâÖA: è­¡i5HÄ$u6M“?Øn„Œ>Óš_¯:·SÕ[5\‚ ™#¦(JâûRÜ¿J2’î7ŒÖw °ŠÒòÁÝgFm%«†K)U)~4¼XÃO&ÂRƒòÁˆ4 EÃÍÂI.røª·Óí{Íˆß ô:¾Ô™²ZWÔ „úÈ%9H³5‚á¾¶°B^bMê#f®Õþ t ڪüD‡;àN—árWð°ò…Næ@"5\¥ãj¼T‡»àîø~R¼ê؈Kt¼Œx™Ò°»ß ïa¿ëx96鏯tlÆ×bƒŽëð 2—Žë±Uà :^‰m:¶c‡†uÜ„›uìÄådß›Öv6u·nìÐáIxJÇ.ìÖq R´LÉZMƒÔ¹Š…| ·Q O‹ƒµ#~s0*tÞÏÒ]¦ÛRǸSÇ«q›Ž×ðìZÜ©áu:Ø£¡_Ç^¤¾^Ç>ì×1€7è¸ ;t ‎! ë8ˆ»u´°GÇß0Š—¤ª‘A:±®Ã¸GÃ÷â:ÞĘO³v&‘E÷š‘úÖ%æ°ì2ýáPo ¹XÇ›qŸŽ·à­Þ¦ã~¼]Ç;˜Ãx—ŽwãŠB?ƒŸÕðs©gÊ ?_Ðð¿ˆ÷êø%ü²Ž_Áû4¼_ÇðA⨎‡ð«Ü:>„ëø |”‡ÇxxŸÐñkð¬Žcì„$±þ$KÇ'ÙJOQâ8›úiž=ÃÏ2EYJ7‡ƒC¡.¿9`P$>‡Ïkøu¿/èx˜ _äáæ'‘‰rCE*  Ø×n²,co[ MuM"°[Ú7S¾„»5œÐñ(Æt|éøM|EÇW)Sà+pŸŽßÂ×t|³çOèøîD(Ÿ¥°§Ä›]ñt|¿MÉ÷èp ܪÃm4à[ŒÛÏËÛáV*¸ÍÛÛ[»©Ú“¹Íë›Z;(§;7¶µ­ij¾!7>µ÷tüžD(Τ ‚s«…éõ‡ž™ä`ôõG#õWX9–Œ]’¾·%bZôøZ¹¶—"Ýt6bø9 “TB.}H[¸¯ÏìEPû¬ðÐ ¡[Syš–¶ê×òHÖ°†BÑÀ€)—K|­é¥1¹ZvÊãñ@̵L£W ߘž˜¼=V j&crCæ!ÁÎX„f_[†ú¶*“ìzu‘ø5èñHèÄjõtï$k¬p! @Š˜SoG·@©¾VacW/•…#B(o2§‰&&EÐfA¶>iTžL6HeJ½pEÄÂShdz†Jg¤#™Â²£ý¦•ä÷êŒo\[ÒÅÜd²‘Á 56¤"y¥‹6‚¦¬âXÜE—ûÒ9üý“?4Hv4·›V8εl¶ózýúl5‚ClK»KãÀßκ«þ`˜mœo™t*bvÃæ`8À&ðfPVø1ÞΑíâÓîp¡;’Ä$cFL(¸¤Jgo'ž7íá±C,»ksÛµ[›:©Æt"ÌmK;F݆E¹mZ|ž?û g+0€°.“nâ±»Þð§ä–Ô±uûöŒšçÒ}eçc· ÓÓi†b§„ÓÜ=d#ÓüïO©L©¦·•TÒfËTT±/I Õ±9¬µßQª•Â%ÜÛ›ìÞ’ˆ}ánªNÛÃ!Ó~ݹöP–§ œç«]4:Œá@Ÿe]|©· Åwê;Ã{º’N’ZóÏ圭}‡9"â³:ãg€ÛšŒhút ’„¦tç ìûeæF¸ mÆ×Cž!ÎsÏvÆV¯3Ìï{}¦ô™Y ¿jHk¨=ЛôÃHœáù¾Y¨91ùž‰¯Ò7»0­ßˆœ _ ¬²™ã”:üˆèë”bÔ•¼·jZS“JWÀN¨©Ï¬•g3á,YsÙ­yȲ¸Ë™Æ6µàÌòF…eˆº„„ŽU µeêI­œõEÝaÑ9†“ÊÚ‘Âe^Fߦj¢I"„ÆÿÇ£“"¿À.!J/ÆP­¥Ηñ{¾ï6Ya?—}òõ‰~¢©w€ŸÆ¿²¿úè3³?l"ÆTˆÛª–g E¡…p½ñ ¡láÄ .ic(¸·Å¼ÞO¡+Š?+E´ß …Äì$*ªVÉg¸y‰V4%ýrèÄÔW±¨|¢$’=¢¢Ì”gx äæ´Æ£ke¡ÑÛ+q[ + ¿ |3~a° X²»1B…‘ªÙœHü¿Ý[{ Û⇗O¶ö…–Ù,Š  Üh¦vÞ› ‹LÛÒBî¬$]Ds)‹Z™(™Œ¿Ëí?ÌìÉÜMÿªIÁ¤}Ôœew{u:? jXÁÿ ’^n’þd“7ebùÕåõ¥ á“:•öpmpŽã™&J/}X.9«ôÔ΋™æ“§É_p¶Ôß»>óWÃ,ïz~¯L•¦®kjëZK¹Ð–ö×~(»;·Ðf¾´0¿ò”üy³æAö€Jùf¥ü (à~ oø¯5ÞwÓè¡ßð@ø,ÍB8FkÊ_¬Yt²jGÁÁƒRþœ ÛB¿.ú]C¿WÒïZ ¯p½„­n°M k ´÷Ž‚:z|·Ðy ´ã/ás4‚c®‡ŸG ¾àv º{l-³Êm-ñý„–®éZâ÷iX 8n#˜EÐO0›à1‚yr/a Áû Î%ø&Á‹î±yàÁ…rí“°Žàmë%¼DÂeùË%\!áJ)·QÂË$l&ø(Á ×IHVÃU¶ÅĹÉß/á€<–ûÃr}À†J!ÁgúäºZ km:e‘}_åb‚¤Wj²ã8ÜCËŸN-o¡å…φhö1ÛE³‰™‘ؽ*1kOœk¦Ù;b¶R2‡zÁ7±œK³‹YIjp¸Sƒã|È›ÄMñà ³çæºåMì@ù’ g?¹]!¸Ú…c„¢ÅSSw²e8WÚA¢ƒ¡ˆ$ÿlFÉ^K(¶ä/Ó?™ÈÆ‘÷S\²ÀöšÚèíãàé¨#3ç¶/ŠAÞ(ȯ™ “N@A ¦‰2 …µP4ŵ´ôÆ dr:êxN¤‡æà¥ÔvC‰o„&‚¶FEàlÕàþÓàÔà9Þ54wúÁ¸>î"Ó´MŽK‰ÝœQÈ--ÈÙœ¤ò8LGxëNMG’&+b°r¹R %Ê}Üš®¦Inm‰r@^#•&î),X‰STè¤ß[È‘d킳;}Ö’^ëÁù Hj©:«ji—žÎ˜wrS¡=‘ÇØÛ¤£-u=Imm ’\h‡Þ†:–%Ë>ž‚¼ÇIÞñšR5mGÁ[ª²ž²Ã’¹\HëöCPÁ:¨óv 6bÒǘÔFl…’Z>³9nÉNa;ûÌT^Úv; Þ´lëbŒßRh«;[ÄÖÖôÜæ_åÒ™¹]53·OUPÖ‘‚ÛR¹¦±Ø>S®ï ŽeŠW©{ý ²Èì¬ó*”žWß¡àøäû3Ñ%4¸&¹°$°×f¬k×eÖÒèˆß«GĈK¥©ßÎè^_ò2:ŽÙQǹ^(ƒ¾º è%ßya¿p¢ —œuµ¥ÎÜ ´w–:§KlIH¬ fvú1ØeR ®Œ—3ïͼy ‚ǧˆxWx/>‰OAþßÁw¡*Ë‘•¥¬Íº:+Hðš¬]Že½uªw8^rÄ Jq+ÝÊ‚ÃÊÔF‚T—1T—«®WoS÷|@}W}àïÔ?©@•³ÀYï\L°ßy³sÁ§¿qþªìV{aËi(Æ?ãÇ ºšƒº•BÑ­h0J Ë! áàGí_x–Òr’Ú ‡Ü[ÙŽÓ°Pƒ¯¶ÓÏÀbê5¨ñºOÃø!x³>‚œ¬‚Óp‘ò!ä8g` 1Ñà¡Iz²Õ8Z ^“ÔJ¨S¢ Ån/Q–œ†!}Á4éÅg`…8z¨ø4äjðp¶w~Å$56)ÇÜeeÍâÞ,+ÓÄt’:¶ø51~É3§Áüæ4Kkx…½>fµÑàQ +/â½ ûc6Èã>r‘„låòØl²F‚¢$€†$ÂjÈ® DÅ—Í#,lvÃÛ.oÅ[ñ>@EÄVZ픬x¡m-½ëÕjí¡¶µÖÞ…íÌ{o“Ýd7ð³÷½ï›o¾ùfæûÏ|óöÕOŸ>µøˆ Ã.VÃ#.è/ró%n•a7|™{_áæ1ngÚW¹÷5n¾ÎÍ7djöpó÷róMöÁ÷Ü<)Ã~xŠiOËàƒg\à†g%xŽdx^`®oÉDþ6 úó¿è‚ïÂAÖî%¼ ¯ðòWeø|_†À™ïGÜü˜'~ÂÍOyâ5'¼.Ãð¦o±üŸ±èŸóôÛ,õm Þ‘¡Ö$ÿ ¿äÁ¯¸ù5Ë~×ïÁo˜û·Lû~Ï{¼ÏÍ|(“&àæÜü‰…|ÄÍŸeRöc'ü…ô” >¿ºHó¿¹àïðþ ÿ’áßð6äóf–ÿ2ó»Ü rs„÷þÔŸ!âˆì%öæÐ ´ÉhGOä²¢dð(‘¢ètQã’PæÁ8 O»b7ùHX(C7I8AÂb’­nìÓÔx<‹"Ll‰i=5«ãë"Ý]5ÍCõ’®h=ªG(ëÌÊ”¿^ÑÂJWDõG»Õ*1çtúÆÅcýZH nêSG­×™XÃS´~|¬OÕ„1yq°Ã¿pasÇÊ@s8cѸ®Dõ¥J¤_µd‘XÍ-ÍÁ•þ¶`;“rÄÒ†–f^Æ4BîÜp4¬Ï—°!¯1ÖÛލ$NW7ê´ÀªZcD‰ÇYÉû=©J, ³YžJ²ýéœJ´G]j¹¦¾Ó,b+Z\Õš–´—®i}åR{c¬›ÜÓû¹•L!wúy[ísï·¤_Õ6}¾MÇêý]ëHB˜OæäŒJTvŽ:ƒ&Z°^ífXt%´¶Ué3è”$œˆà"Áj¼?¢gšJÔ ÖsE½„eº),ˆ‹¬§Ã˜˜YYË,iA(öT¶¬QÖ+5DM@×ÂÑžzJ@În5ÒÂ]$§2£†•´;Y¨_'“>Dðd±!úrk]P ÷ô¨Z€ôÓ]íU£ä‹²P,QCºá¬6¥WŸÓ:T¥azÚ‘pWM»Ö­jj÷"%¾š¤¹–KXàÎ$e™ÖÉÄÒÐj5´Öo‹é±Ho4h䛇ý5úÃX1=žÍ/tîÃöµw­¡ɾB˾bꉚf5fï¨åcžúd_À)6ãTë@°"§át2\à wb¤ <Ï”°AàlØ„6Ãî†ëž;$\(púžç‚¶`«À6l—p±À%ØA˜À €‡`§€a‡Àsy㥸LàyØA‰r*tà.¸;& r)‚çã/Ä•‘¨\пj•ª ¼Â%m]â†ìRq J`*n­WÃVŠà@°!ØÜÚÜFÌavæup=ÁgXtpµÛÀ¸× Œ`¯À(ÆöÑÑ!ŸjHà uý<^$Ü(pn–ðb—à¥^&ðr¼Bà•쯫ø¯æCÞÂò®áæZ¼NBòò xÀñ&7ýoÁ­Þ*ð6¼]àx§À»ðn÷°_ïÅû FÂOà6Ü.áýÀBr³ Ó< ¡ub™ÊÂé€I==ŠõL3M­KZ$|aÆ1ähJ&c¥Þ²l±„P’± —Œ”Féq 9‰¤ë”¤¶*Q…ÒØqÃ\E£Ct¡¼Òدil暠и@Lìw„{V³È’ŒñAp"kÚ¨\b¬ ´ÜS™½Í_—^« TŒUÉ´ì³Tgƒµw±u/6D"©UÍ™G½Y2OEa<¼Y5îP?Wõ½}ú¦MS6qí³z¥žLÞÒô8eé ¦é,×x”i)Å‚Aë×Ñ>(…Ê÷˜fˆ”ã)ö r M&1Ìè PÖ¨± ɾlDX5o ©}ºáÆühŒÏ0Ð6)å#ƒpˆ›\!+ÝÝË-J;Pâôdge= ÌXX¡j±dj*Ï^˜u£y¤éáj’ÍäRŸžwS§(1ô˜1af¢,’+3ÕM'+cV°E]eDÎ(Óà_dšFF3–—¦p«šÓjš¹%hýQ=Ü«ZÙÿèú4Uµ‹=õp5•*5bÌL9jX$õ34*Ñ‘Å:¯3«W "qªÎP5ç*}}j”ÊàjÏØJ§V4õ ’Æ1fÙ笕„»è´ãÉÜiÞKN=f²S~ë¥ʸŠrÊK’‘•U7ÞL‚·1U»¡ ¨>“Êc \ Ç­3¢„²Â¼§R²bô…™zFŽ-ÖO7“]7¯ôxʆ‰Ý£#OÚµBÎÐx¼8·B>/n‚n¨ò˜”!’×6ë$)¤›_> ZO?ëĉ¹3ã§DÆÚ©©µÅLíç©£›Cá¾ÿ÷7ƒ¬? d»­2%óŒVdLïçRÒ¦tŠõ%/ 'Cþôùܬ*¤=ª&q—§¨dƒ`e|9çoÈöh„öÉ¥z.(êÄ­„xü1–_i뺈?jüâd`i`y€¾V5·6¬\DŸÜm ­Í`º (~2ØÆÀ.L-À¬ôà$ôêá(wKÒ “^Ÿ^aZTÂP²ØKÿlöŒ¨7ư/—t¥Ò ÛMMú:T3,k2§Î1‚’szòº%9ºy0î1ªw'­°ØþëÂØR ¢8Uj!cq,Fv…‰Ék¡®ÀòvJ0&I)hÊ7k]û±~Ѧ¬È&Å™ ÐtƒFœLƒX Nzè[øo-DŒ7}Öoú¢§¶€/ ·âôFÐù—Jè§ñú”ñoLo¢u@_Ï—årê…ÀnìµÌë,”^¯J> 9^ûؼÕ`÷úÀáõîGr@òºàôº©ï2Ènš`œ×Mk„×6ã½Un)y^–ÿ˜›á kÃ…´a.½ëy÷ŒÝrSw+0$²ð‚ À„¤PÇh¡WZB›,¡§ u°P’WlJ6…úP2–Ä«àjKâfpÐ?€ ¶²&É6zU' ´µú ÈÔ™¸¤½P¶‡»Ï»­š„—ûl¾>[í~˜d›m/±ÓšŠ» ÀWb¯MÀä-vÜýÙG¾=ü33l¡¶ƒP$Á5²í¸%¸C)ѯƒëM=pH†eŸzØc-?6ÖðïÐåôÌ g#Ûñ…ÖÝð±SJ›ï%(¬Ú S0m/L§©g |¤P¥ÏÐÍn¨5#ÇU±†D™`PŽš¾é­"›N •W±ôY¢lŠZ7$*8$ÇSÚ “††•¦äx뻡(m»:íçvdÜõñ¡]E!¼RTµªŸ¯vÙL?S%¸Á9娃CN«> ®A(°Æ¾AÈ“àÆCPNd'-¼ n¶Îu;yý¶Ùû ø–? ' @MÒ±JŠ_ÝôÔñc›WAó.²´”߬oMNÞ’Cº~°f™ðÈã—5Å'pÊùeRf¦ÚòÄ)y yIýI9…Ŭç-°ÕÒóÒ"‡cþ¨%5gµ°’›(=߈dS× Kßi4Êžª¢S0»€Žü´eUìq›éðÓ÷ÁšXVeLÌã†{fÕS ¨ö² ¶AðHp«½ŽBë6¸ÝR«6æ°˜i©Õæ+y3Œtssã$?ñÍeѾ4ÑrŽ0æo%»‹ˆvGëpYb§÷©FØì ¡Anóá~8³•â­aÑkñ5ÒÓ”€fB»c…ÏCîµ_$ÁƒKp)!êmp—µU>½Ù…¶¢³öX±÷Ë)æ\ôæˆspãl㣯³Óž ëÔöÚ}°hvnÕ>ðKrkë$ÃßÕ>7áÚ-í‡sêœn§[r;쇖½ÐšÜæ¸×Úæe2—}y» ±6‚Øü® Ùímä´Åuvj—l‡éôêØ¹»¡Ìmß½|”Gr•Ûž€s—X<`Šá|3ß,féA”fŸühr¾cržGœYëó*%˰œ~¡ÇƒÌñt*%¸O‚mãAîaÎYˆÓ¬÷a‚Û‡¬Ÿ§™Sî‡RÀÃXe›k¤ ÚŸÓ¼}ƒ”ϵ³Àµ ]/V›Ýç?¿I¥×†U2™ƒ•‡ ß=;,á=~މiO{'äsŸÌ¾€àsJ’^ºʸ¿.42¥µú%(Á=öç`ekµÍZsQ :-ʦB>å=;­Mß´²óã¶ù“«Éœ]{A©32ëd3ð:Í=ËŠRFU==œãkè™ÈÙÛQW}7”›ý÷ó,pÙk ‰…“OšíHJ6Rí‰n{‰Eyº«xD•þWO®%\¬ ì†qL¥a`‹Üx!%ïa£ÜàdOÂ2kÜ8:é9x$v,Â¥ÄPDçu1–À%Äú®ÂIàþPK–WoTØPK7A org/hsqldb/StatementSimple.classVÛseÿm“vÓ¸@h¹ ’æbZT.–%Fˆ$-4¡•/Ûd›’Ýt7)EÄ ¢âý‚·¢¢âCô¡Ì@éÀŒÌ8Žþ¾:þ>3U<'ÙÆPB ™ïvîçwÎ÷%¿ÿ{õ'›ð½nDDtÛQƒžz´b?Oxêå)ÊSLÄA;ê‹}6ôóáižÙ0`à ‡ùôŒ Ïòúœ ÏÛIT1dG žž†ÙBÒŽ¤ì8‚£LK×à ïT4&gYj´: žzíÈ!Ï»Q掉8&b\€ÍMGsrNà ‘ÇdZV“þhNO©ÉbF1 9IìÚ´<¤¤E¼@J{I«[ÎU ©ª¢Ò²a(†€ aMOúGˆòÏIEd•,èëçÎd¶~LÖSòPšuV –+´t>£Fã#JF&ÁEs‚!5¡Œ³xÍ`H@Ýö”šÊíÐê Ý—ËÖ>Ö€– ]¤rG¦wRX£.©ä¢Â–¸Z+¡³€ ‹ÈÙ‡H&lŠ×SC ÇVZ”€LijG¨¢%‘’‹ç¹ mµZˉºbäÓ9oaé q‚0¥`‹$2G"ZzŒÌ-­l®OÄ‹ Ee_•RM9'§µdX‹`qµPyJÔÀ‰+¶à¤€UeVÓ©!žPt%±W6F¢JŽ…^’ð2^‘ð*NIx›$xà•àƒW@Ó|÷»óÃÊ.á5œ¦šDC{º»Â^Ç<½I˜S¢±®X¶½Á"Ÿ0Å‚½Dd¡3Ô¿á`WÞÂvª  vÇ$±[Àâÿ}ÆFtíX±ž'$¼w$¼‹}ÞÃû>ÀiJø'E|,á,>a™O%|ÆñŽ/@ÂÎIø_ʾÆ)ç%|ƒoYá;jùrÔùöe5Me²iªØ’JL¬»N°ìn" ¹’逖Éjy5A¹B!n{ª-Ív]!Ô5η®%\µ¤Ô M)#¦Ëª!ÇsÔD%ëêkîx–BøêÊÙ¬ÂÞ¼® —îR±öd¥+P…{›±ž¡#Jg#è›g¼æ8ɸpN¢uawÉx±.7…Ó™dó –E¼ÓX>'-+(à•Œð4š½S¤ÔÑÿÇ¥¦í°„DfQ'â‰F"KÆGÍæ(«O¤¬>f}¼óêÓIò6Æu«"Þ¬žbŒÛ%´Ptk¦ð›sí ¼^J±–6Ç":<‰=¦û«»:ké,0^æÞ0Ý»M÷nÓ½ßÚ9‰ƒ¤²®Ûwaß%¬Ÿ€ŸÝÿ ó¶ià 4›ñ‰–i<4Qä/'ÊÆîÉ[¿ðA*ÅÚ|ö†Æ¿fàº~±w#êgÑ&Xga±·©å&D«ÍNÌ™ypVÜîçÚ)ó.<…}&s!­\’Ë&/\…×^¸À]¿ãhÃòÿPK:·žîãc PK7Aorg/hsqldb/StatementTypes.class}™u€ÕÇç›Ûä¢DqÜ5¸ÛÜìÜÝÝÍììÝ%Ðn/‚„ÈÅ¡hÝ݇bÚRo‘îÒRÃj¸÷ûÞØw÷þ ÷ù½7oÞ<ù}Þ[n{ó¦›ÇÙ·wãÖnÜgº[©„žû-¯5Â8Ó¼µkÖ ¯^}ÒÊ.>8ëçUË~Ë‚zF¦hœ©n%ö£V9¬ºAÍĺØF‹ÂfÔ|œ g½$Øð—6ýšg£™œDãeuÙΔ4âöTl¨d{jC‘[kô†QՄφ3Ë|Ó'·Ñð£8íë'À)yì®ù»Îì´Ž×ïF®—t 6eÙu¯6²¯7±IE›^X©¸Y›“Ù+/¬Vƒ¸5FKLh œn/¬Õ|϶6 ÎeÿmFi:œYRXüºÙo›Á±*û?Ö^ÌbÏÒà`¿ŸT\ÎĤÑ˳ùe ÖñâV9ˆÌA­/° 8ªå !½›c¦5ù®bžærJÊQXo¾y¦¯&:jÀægõÛ†fœI6šÍàæ+(Þ´0«…I74_˜ò²Qö\Ãë÷«® mlFdždÍ\d¾Î¾0[ ›dk[#œË"ZtxÓìÝqôõùvÄ7Ë:è¹ û­µìÍaTö#ެ ®Ëj þ  laj-«¹ÕÀkÙ¥d‚[š•GMíVòD¯{ý&¸µéQ ë¾íå6¬˜Îoñt“M§Ád¶[éc¦p[yo³^vÛÞ»œ™þï5 ªU¿°ÜlÏeœÜÎø¼_;²_½‘ï·ìºMZÁ±îó㎾˜5ûÃJYkΦú8ôvj¡.å Ó`.¨XeY¢Ú½e ¸Q, Í^'5³üýrHûjU?™øñVžI"àÌöø}A­å×Ê&05ËÐÕ°ÜL†`œ®Þ¤Ã;Áôš¿†¸ÇÎNšbŽäÞæ°°Œ/¨„¡ƒå\‘o^ïZ[jwY]4Ô"e‡û¤xûnly°?H`ØžRŒ¯Ø!Ÿu'$)j2á´ªn½žÊé\zö“²g8ànk0bdnNÍ­äGIhMfÈQï9šRV­é›Îãʲe]8ƒ‹;ý²·ëÄ)’$òn[œmFud]Të!×qVVl·3áÌiÏ.ÚóÓQçˆûY¡Ïîâ³8ºéCpŸ0=î1IÔd;»Ãºžäy˜/÷–dI¯ë)3YQ£¿—ÃA³?ºžÖ¦’ÔcÂÏä'Ê4˜à³p6·9*«ßË…ÐH;Ð jìmºª»žƒ³áU=—Ýâ š Òõü;UjËÍÀv½¦ªŽJe¿7rÍ`t½gÑüv¥•dâ®—Æ~S%ìið£];…]/ÃÙjŒJ͇¿l÷º9—ÅÉt½Â9³I[újš?G—æöÚØ ԂД¾>öWq=”[a­²ÌÔyÎfïT'aSóM8󯍙ú[tù˜åf=˜]µ¢äŒÝ«Ø¯Ö3û”xwÙhŒ:ƒQ`Oé×ô½4®s-qBÝf%æ2 âÀ­»§Ä+ÅÆcVµ›/KÂ¥‰Cn¤Æ5x™ J“Ò–Wé3ç¸Òd{È“pYƒÇ$ÛÑ)ÍšmÊÃE9Ùa¦ÊÔΙÔY*Më³ÑóSšÞù‰LÒæ «~5Œ–e¦Ä»Ë‚¶j¥•6ÿ–f¦52o› ÌEÌH©cJ³:W¹©ù½^Í<3†ßÇɲç5fFgmŸÛ¹ bˆo ›‘= •æu.(‘»9ùÄ<›˜z¼ál1ö2h„ÉWµ*Üɶ.ï=›¾S›½•ÀÞ½J ;;׬<¨Ù“)_”žµlZ5çgÛ<¯sóèèU¸¥9§dÅÙ0¼`ÌÑž°Á%¹J[§kCNZar¯5¥Ût³²iw‡ò9ß6ÝNUÚWo³ò£¯wKÛÛk²Wáñ;o#ïÝùÝ?¨•ý!Ú1ÿ =³”v²÷îjšÚK‹‹s™[ \ûú‹XÞÐ.ÅéÇŒ™ íj.ˆi_Ü(Ⱥ±[¦|®åfÕ.äݳ;gÞÞÆTI%98—öÌ®ˆÙKöÊn›éR2±½ÍG•ËÒþ>æ×ÑÆö5ãÁ¨<Ê«ÇÌd<’‡ó|³?¶­@n¥:Ÿª5íï#%^Gf·È«x3™ß^Öñ¼¥,]¡Ï¯Ù“Ÿ]¼,ÕÝVP6›;ÙÒ¼•Lõ‡ê~s‹ÿÚѸÄÜœ|³?ZaÏ!ÉO¥K³»M³ù<\Æ¥V„M2Ë2Ýåi²HJŠdpEº³4ÞêçƒÉ„]™nÇöt~Uv“°Q¯Òlð£’o¼šchMj7g‹·‡8;x”®áràœ–ƒ,#^ËÕÛïÖÊ•äe×ñø\.Û©¸žgÙ<‡ßÀ“q5k^r„.ÝÈ>Ùܘ¾…Ó`“‚mµûNU[qÕ­õfžˆ»ïäŠK*˜,d"wqIs£ªÙËw÷ÝyAû ¨ûŽçPšãåÙ}/g+§™´û¾áÌwºì‘g¼ùÙÕ™@îžHž$<™Œü.áw“[Âï! ¯ .|y¥ð‘äUÂG‘>†|¬ðjòqÂkÈk…'Ÿ |"yðù$á“ɧ¿—|ªðiäÓ…Ï Ÿ)|ùlásÈç ¿|žðùä „/$_$|1ùý PøCä „üQá‘?.ü ò'…?Eþ´ðgÈŸþùóÂ_ QøKä/ …üUᯑ¿.ü ò7…¿Eþ¶ðwÈ—_J¾LøròÂW’¯¾š|ðwÉ× _G¾^øòÂß#_øä ßDþ‘ðÉ?¾™üS៑.ü ò/…EþµðoÈ¿¾…|«ðmäÛ…Gþ½ðÈþùá;Éw ßM¾Gø^ò}Â÷“~üðÃäG„%?&ü8ùÏÂ!?!üWòß„ÿNþ‡ð?ÉO ?E~Zøò³Âÿ"ÿ[ø?äÿ ÿüœðóä„_$¿$ü2ùáWɯ ¿N~CøMò[Ãüï5#‹ïQ"¦ÿ!þýñ?èˆÿAÿCüúâÐÿÿƒþ‡øô?Äÿ ÿ!þýñ?èˆÿAÿCüúâÐÿÿƒþ‡øô?Äÿ ÿ!þýñ?èˆÿAÿCüúâÐÿÿƒþ‡øô?Äÿ ÿ!þýñ?èˆÿAÿCüúâÐÿÿƒþ‡øô?Äÿ ÿ!þýñ?èˆÿAÿCüúâÐÿÿƒþ‡øô?Äÿ ÿ!þýñ?èˆÿAÿCüúâÐÿÿƒþ‡øô?Äÿ ÿ!þýñ?èˆÿAÿCüúâÐÿÿƒþ‡øô?Äÿ ÿ!þýñ?èˆÿAÿCüúâÐÿÿƒþ‡øô?Äÿ ÿ!þýñ?èˆÿAÿCüúâÐÿÿƒþ‡øô?Äÿ ÿ!þýñ?èˆÿAÿCüúâÐÿÿƒþ‡øô?Äÿ ÿ!þýñ?èˆÿAÿCüúâÐÿÿƒþ‡øô?Äÿ ÿ!þýñ?èˆÿAÿCüúâÐÿÿƒþ‡øô?Äÿ ÿ¡þ7>¸Ex"ÿuþPKþÏ¥Ì ó#PK8Aorg/hsqldb/Table.classŽ |TÅ0>sïܽ»››'YÈ’,o!ìn@¢DH !@ $|°$ ¬&YÌ& ZŸEmµÖjµmâ‹â#V±% ˆ Ö꣭µjZßÕÚÖ¾l­b€ïœ™¹wïn6ûÿ¾ßŸ;wî<ÎÌœ9s^s.<üɃ„Rí!7½CyÁE~­¼ˆÉÏ]Ê/”_º•—”_áë˘ü“W0yk_s+¿Q~‹¯¿sÃëï1÷:&o¸•?(obî-LÞÆvï`î]§òÖ½/ÄäL>ÄäOºò‘›Š)üÙ¥üEù+æ>v‘G”¿aîï˜ü“bò/—ò‰òoÌýG§âóS7$ÿÅä3—ò¹rÔE»•/°¢ËŽá,Žãë ˜­J V¥ºª¸É|LUu«LÕàUuà«®«N7™©ºðÅ Ô 7yM5°A&æ é#jVðœæV>ݳ3”¿¨9Ø$WWóÜdò‚SO5vîTG8ÕÌzêH|:Õ"§êsª£Ü0µÑX4“±8Óqn¼›*êLNÓÕ‰nr¾:É­«“ªŸ¶ 8Õ >K0™‚KšŠ¹Óê4§ZêTÏpªgbÁt7ÍRËœêYø2Ç™‰Ã–;Õ §:Ë©ÎvªsœêÙXqlZ‰k,s“›Ô¹XVåTç9Õj§:ß©.ÀU-D4Õ`£EººØM®S^ÀvÐã:ÕÓ¨E¬ÔaÂËêuµŸK°ó¹Nu©SmtªMØg™®.w“ÛÔ˜œ‡%+±Û*Ì­vªç#¢/À¦¡S½È©®q«!u-"¦Ñ‚s c²û¬ÇýÞàT#nõbõ>„…­X݆óm×Õ(¾lÄäR,éÀ†1ÌubÒ…É& xu3nÅenu‹z¹®^á&}¸³_§z%& ±áUˆ­«]ê5굘\‡ƒ}nÅÜõXv6¹ “¯crÖÞ ‡Cýæn£ ~gt+&ßB Þæ‚ÞŽ}¿˜¹Ãɘ|“ïêê÷°çس[W{ðå.LîF¢¼§p/¾Þ‡ÈÔ0· sßÇd;&÷cÙ˜{ަ^œïØü“Gpªb²kÃ\.&?ÄäG˜ìÄvaãÇ1yËvcÒ‡‹ãjö`²“}˜<‰É~LžÂä&üÓêK}Fý1Ré³Xö]ý)ÆVG0÷3Ü™çœêóXý‚[}Qý9æ~É/qà—0÷+]E¦"S_Á’W1y ‰æ7˜ü‡ø&¿ÇŠ×iõ˜tã¼\ßpÓBõꛪCWßÂãó66|øú.Œ÷&ßDz?bò&bç?!Q~„ÉŸq®ÁŠ¿:Õñù7]ý»Ký‡úO—ú/õ·úoõ?H®ŸêêÜg˜|ŽÉQL¾À÷ëê1$…ãnõ„z¬ FaLLîɘ›iÀ¨˜Æ˜èøZûÊœ:sa+·›ÎgXg›g™,‹ek'äŸ –Ãr±y&ð2Άël„›6±7md^X‰¹BLŠtæÃ’Q˜ cÈÃØXì:NgãÝê?Ø,9ÍÍ&²InVÌ&câǰ"ˆI ÖNÁÜT@Žò" „îfÓX).ò é¦Q6°ÀÊ09 ‹gà6NÂÜLØFVŽcVèlœ6ÛM/cs0w¶[ý;çQ  r3VåfóXµ‹Íg °ÉB\rM[ÄcR $Ãê°]½›®a ˜[‚MÎÅd)&˜4eËÀrÌ­€Íd™Ø÷Üi Ç:Cm)¡‹`&ÍÑÖ®¶öÚH¬“’ÑvP­Šm¨ mÜnÁ$+ÒnïŒtn©âÝF %9facøÒ®p{3̱Щ¾«mm¸Ã¬D(ÍÑöXgG(ÒÞ).HBA•U m3×]’x‡åæ®»¤²Ie9ÍÂÍÉÍ2:;"ëéà7‰ªyáuß°5„~ÞÕƒ7Í\A.ÔÕŠ-“aV_¶±#‹E¢íÐ0gC(&.µvá.ÑU0ô_†½ u†[(QVCY4µÊÌÆNh¸4¼nþb Èâz1Ÿm¡8ÜØµV6wÂpÐ$›×ÅM’#GÛ8‚pƒaPTí¬ïjmµÊrZÄìDì0Îv2S–/EJv…Ikä¥ËCI¢ŽY‘öHçJæÛ›Í é†báŠ!fÍäå”°ªh PMfcg¨¶w#? ÌtvP?d()/xJ†4ÂÏkî‚åž4vF;`4µ«ôõáΦ-Å{xçlRñä!­,èS«n®]3¡ ˆ²-$ÞðÞ°v™_2T ¯ ±© :Bía„…]å&7ãŒMn§²¡£ª[ðp6†;+@……nó’7F:éöLi~¨|c¸rLL£*Ú¶1Ú.Þõfx‰´ÂZNOÚˆFIôIe|å k/7wrô;çÖÃb.m Mm…¹Lm„£×¾柧ӧ@…4Bî°a8|*¿‚ Ž¥ÇÌ *.24Ÿ‰§¨L¦™7œÉ\±4ÀÞÒp¨¥¡½ºUÖ¾¬³1ÚÕ,qxñªtPÄZEóªÖ®X'«³ ÅHþÑç)N; v‘Øýغ˖F£1ÞzxñêEi-ÚVYLŸ·Q¼º¦&mイÆ+"ð¬ðN‘pÜvØcd<°7«8‡lÛê/nšY‘–Rìk4’®¨&‰v;aÔØT»©†ë…Qs#1Alsßpž€Ò(†óD.d¢Þ‰áNÈ ’’;Kì”.„7ƒŽÄÎí wlAhÝ + ø”{1˜è#s„šêº:ÅÈ™²Ìì”ËÅRr¿l Þät±œ£s>œ/9tf¨¥%!Ïà¬" ±«§kc p·ª$¡ ø¹)ÜY·Å&k€É¬ïI-y–]bŽLaIR‰fþâ¤öùP´¤#ÒêØbŸ©7™_%AÉaÖ »;1.¿6Ú| À™ÄwªÓ‹fõ] ËÎ>äÖ¦p3G“$Õ“‘Å5ƒO;/k€Z’¦/J?˜Ùཽ)(±÷œšFXEŸÚhk. K’¡rš¢dZÌNåUƒCŽèÊOJ`Z1x8H.NgWE)4†¥âtñ ȱšÖG«°S”Œ…µÑµæ+ª5)Jc¶œ–Yn‰¿ºPgó¤¤dÂ0ш“ñ >W^ŸÕÝ„â®$íJË‹j…2JÛ‚šS‘ð©(< PdCJM{U²Ž‹Œƒ/Õ›ÔÊN‘ÀعV ¥zÒé—r0ÒÌÉäþíÐø\RÿIU (l¡fÆ ¬ê”ã¶O·ú2…í¡Öd&eû!‘#s¢^.¨>™ä$ÕgYÒLxŠ =<n ‹ sA±·”«ØüÖÐzèæ‚^‚NŒ´.îˆážLF=zd$6°á7w •Á’ôr"#“¹¦´Dž·1¶©ééù$P\R:¡xAÒq]ha3É@XÐíé(^½Š¯&$º<š²âz5‘#4k)‡á,†¦–­®árod*;ý‹™ÈëjîìêÀ}εJQ!6¦Ó'€ñX»Ë Ád6ÛJò¬ü, ÓÐ AK,'™8p ЋÒТdü©ôÉAZ¥Ô¼•ËypªŒ°ñ$û…0ޱz'y<îå)[e%q¼*µ—)3~ÆQŸ¡drZŠœœF·ƒóBAª¶ð‚Åz9;Yr&Ìï!«úî„ÚÌiqàjàg'ºÊs™ÙFIbÁ9Øô&/×Ù€Ðn £.*j¤!ÅñDg!a JøÁSÍ/ù ç%)mæ“ ‡°æ$¡0½$açˆõÛÁ§å™€wìH؃ô *Y¶èÏ9AåIz uó3;˜F¥MÚl0P“ª»Ì1Œ/CZ¼ ‹Ä,ªH´É³JmM…ó€Ìþˆb³¥#"»²™-ùÅiu½•—yÛL ±Á¬óÕƒ ­ÕÕ¿ÃtÖE:ld»ðÔúR{hSd}¨3Ú1x@#åòù0Þù±hNu}9hȬsÒê9É ¥pûº(X„0B’V᪡Š@r%”=µ‘¶ÈãÅ›ˆ.DD׈s<`ëPm™Âu@EQ*‹Of NžY":ÿ”¾ßcÐdý5«’Šm€ &t ”°mæÜÓ =بõ,ÒÙ:­×hî™1{#®,,BÔ¥éØ ¿aðÁ_`©~è¡¢wŽ’‹N¹Ê@à _§.OPÁ¸ÏoÊHr’E7WXc†¢òxN;嘠š€~8u)pJÉP¤¹4¿#ÚV]Š˜XÐÀ̲ÿy)'ºùC”ü?mB1 .­±¹#²†ªÿ¿¹9\ž‹1„’ª_²j¯³YBOL1DQ}‹mðm©]@¯5œ)‡ÍJî}玳ôÆ­àêH…ÖnÎ2ïH%3×YȤÌ„Nœ»Í˜jGYúÔ <ÓQ‘ʼÃ÷@Í ÏtT¶¶ üH?©åè-Ò˜RF#^øòS/s0`@Ò›fs³bÎjOq_^âb†’QÉ26¥^ZZÏÞ)Å¡•ÔÞ€<ú;%“ÈhrꈄZ#ÈŒ=¶·ªhh†âÞÇ9«¹•_œôiúœÁ.f—ô{ôn]`°VÖ¦³vƒEéûÛHï5Ø¥t»Á:è.ƒÅ0éd]:Ûd°Íô¿†¢`Éec[ GÓ]:»Ü`W°¯ô–œÀWbSBw#æ5ØUìjƒ]ƒ€¯¥Oì:öUƒ~Ÿn§ÄwR{Å ÷Ñm:»Ð ßa!ƒm…„~‡>dÐ1éÅäaL~@më5è#˜ì Š æAFŸÓÙõ»Þm°1ùÌC©AL|Ýd°›Ù7 ú úsƒÝ¾9pFÉF‹Aï§èìVƒ¾ˆ=¾Ån3èz„ï`€tv»Á¾ KVV(çôeúkƒÝ8¼A|‡}×`ßÙþŽþ¸AªpšÛµnZŽª¥Õ•MÕëf=˜Ü…èÿ/”/¨m˜[Y l¾©ºnIÃÒÊ¥+q/ †5UŸ×„{†­ª*«VσL]u]ÃÒ•¸5•skÜÝô ƒÝ£Ì6”\%Ï`÷²û ¶}ß`Û±â~ìÓ‡éð:¯z~å²Ú&ƒý×ü{Ô`;ôcØØµ º¾z)´Æ©UÖ®¨\ÙH‰R -6Ø•Ã}¡ÐÉû’Õpe„ÁvbWwUC}cÓÒÊšú&JÔúHYý²ZÀ„¾diM]%.R]\½ÒP²”lƒíBÊ|œ¾`°'°·ÒPXi¨««ŽÎ%K««—.¯KV4l7L‘ރ硾*Q*B–+#œLYœí1Ø^¾[ç¤n¢Áždû”˜Sc5NvÖÌêka¿>Â5æÛÕñðeòì<…È:‰r¶rŽÁÂVÑOè¿wUµË›ª—VÏ3ØÓ¸&­¦~^õy€¬1”2Ø3ìÇ{–ýÄ`?…ÉÑ~<¢{!Q4$¸çqTÖn+×Ùaƒa?3Î݃¸zAzÒšqí£O4 {æÃ^`/ìç˜ûnò/•k öû•Á^f÷é èýö*0ó´imAâΚ¿xL[$ֆި1åc¾_3ØoÌoÙïtö{ƒ½Žszî0%ß``oŠsoaÅÛÈ[ÞQì]öžÁÞL)åÊLdM4”qÊX<«t7.~öøÞŸ°ÛGgtý‰ÿ/ˆ¤O‘{å¤ÚGû+ûÖ1ˆÙh(cp ¿! þœýƒýÓPZÙ¿€Ý(‹ ö û·Áþƒµ»0ù”Aòæ>Wœ;ʾ0X?;f°ãì„¡`U…#©)šjh öEÓ”y†æÀDÇÄ©¹ Íí2°‡[¬eB¢´jY݉ëø!ý‘AÇÍz^µlÈi9À‚µ\|̓œòUe«¡ ÓòuÍchñnLG©¥Ï%oâJÌÐ 4¯¡Ä¶…Z‘¡ù´Q@×5ó€»ý’þ\×FÚm¬¡ÓÆÚØ ú´v𡏕Œd ÙfÐýîÃí©SJ ¥×;£M¤“ÉÀ”ÊL› JâWLáCóÓt-tø„&dhA †´)°×ÚTØít@¹Ê”vL:`PmšVjhghgBB?0´é8›-âdÍ;ï¢&C+cð2,1@ÓÐ¥xì[khgi3t h®U+×µ C›¥Í6´9Øß.NÆsk íl\Ù9Z¥¡Í…ó£Uáë<¶Ÿ‡é Ðé ­Z›¯k m¡VÄ­-2´Å@©Óê ­…um‰¡«-5´FLš´e”Œ>…¡eh˵¸Eç›Â9¬ÔVqeh«µóÁ¼2´ à¨hjwÓÖZHƒµ6k-ÉkI¨ÔæyxS›—t7Âè!ä}1F[‡tº÷w}? Õ—5‡7âý‰¡Ü£Ük(?R¾i(»0¹-¢] ¬"Y«5´K´VCyZ9¤km†Ö®EÁx7´ˆÆK5 ‹˜Öi(?T@xBÙmh]ZÔP†Wm“¶Y×.3´-ØôrÜ¥ÂÔ>7ÒêØ‚Èí Cû HíJ$¢«´«ƒj×ÚµÚu†öUmké‰$C»^»ÁÐnD~Mûº¡Ý¤ÝlhßÐn1´oj D¼J_ÓµoÚmÚ·uíC»S=fhßÁ†ßÕ¾ʺ¡uk=†v"ën` Ú=Ê“†v/¬‹~F?ÇV÷Ú6íû†¶]»e¿¡<¥0´ºŸRÚƒ0cPŒ¾›"_hÑÏ“ÌÍì‘”Œ‚ ö/M(è1é‰.…¬­{OÚ‚áQ'qNÔã)™òåF”LJJÆÚ_NmD`àÓ¢ä3i¶×ø&òÇœÊX­¥ÅB·'m@àocòðUâR›£ªl6O¢½ è™ÿK?qï na)É´æÕÆ÷Û{csã²"1¹«fŒ‚=øÞ­Qá$/L·Z^‰(´’A‰9f‹[°†3ã­[’i:ÜÑÛQ)ˆ‡°xúRnSðX<­‚q€eÝnA¿Û’Pçtcwµw‚9)AM+®IçMO-•Ím`Eè¦*ËÚh»ØjÁŠØb@ ¡-Ò…»Š€˜e £ýx]ÚZÓ¾ -î¿Þ¸Ϻ‹Á¦¨«¼h!²úÊ:Pž1¾A"tï½¢]èÂw¶‡MóûªÿÕ]“ ¨¤Ö#ª ¯ÅÄD& ±yT„Ñ%ÑØ€ :;%GŸ‚^jiI¹Å0=4«Ðû3Ð Ï}Ç“)7LĪ1~WÜÇatf“« (ð•xCšÞ´Šß5ØïSh^·· v”ÞþÄ‹›âª“ÔŽ¶"Ïí µâtKcg¨3ÜnïLÄ(Ú¯m3cÉõyéäB†tâNq$‘n®Œ«´aÀiN²T­;ÛÖPg:4nÍzŒY¼–gf[Yf".’G­¹#±DÔÉ0[ @‚@R"4D/ñzÂÒ°//#³…÷b„„|ÜÙ=J0¼D>£,ŒDMmS¸EàÝÁXÌÍ¡ÎRÃíë‘+åDáì¶µE`ÇDc ÈΨØQ`‘”À¬ˆ#…=í Ÿ˜†°Ó†ü%.%·`±ÈåPïŒJwÿÄtg'Ý5oޤ‡7o^­t¢ZE ­ó+`kÌçðÜ=›|ŽùÝ3Ÿä²ÎH«Ôœ±¼xõ¢+Êaª­!ä@§ºëJ³ø˜õ†Plƒc.H™5G›˜t6 ±åbôñ¶Hd–§AæÀ’äðL Á@+VD† ¶ÐX`Þ‡cMѹÑhk8Ô.ÇÔ‹W׬æw®Y’Y½ò7ó0E©™è²2 ÎS¤Ö çq`ܯ¬ƒÙ±vNЃ5Áà~p «uHjí/ˆNu©//OK†ÈQ¹×£BÄ)/E5—5s™”$d¬Jˆ"ï •°Ïü ¼+0qh´$½ænáµz[[´½º•s]¹-<ª»‹Ë ³}^»=BÇÔÝ#1qu¯‰‹eO—vE6…ZÃ2`j ¬[%2nµajzõç$:Õ¤!Ñ3Å6†Ã—À"WñC‰EÍà#ÿDD°2w‹-–—Gîn½€G¯óˆ„ô§#°h—p ÂyÀàÈ“8‡oòd81º†‡åŸìÒ5ÓâXó±fqºŠó.±#`ÞÙnè­è¥Ô»™Aƒð€®^N2ŒÀNÜ1[XÌô¹‰…ƒGŽ pµ%¶»à$ácm¦žƒªAšÃ–Ù–¬¹Zº6¶Fš0S¡,»Ï>¥Î9ð󩉉küXúà;ì·y×iå…Ùx_8‚ýBÎ#¢¿ø¼»KÄÁ‰Ï5:Âëä\³ÍØ ë$f[×€fIZ]²F|[e±gÏÚÔ {`Ä€r3N0kRãþF¨ªÄ“·×´§åí«’u%®dOå7œK 9àƒ`d7¼²·Ÿ÷ÆŽ(.„_¸Ò©²«Ó…^ððËd“'¡Xë"­­‰WBˆ÷í‰@IÑIŽGŠ˜R‹Â›+»:£b·¦áþC:{Cj4вäã ¼¤GyÐæþò¼Û84ærò£–×Ì#»"ò›2ÁŽ]h¯•ú{$‰Ãæ'´m»Âë¹(o×óR5:dà'ëÏ>%o° ’Žë›_þ‰ :€ÜBxÎ\ÀÛ"íœ9€Øù|‡'‰7›lrˆ`6n¦VË1= ׄ e­lo©”¼×Æ÷3bb-â½ Í*±¦"Ù«Ñhï3ýKYåÖ%õÿC7ù¸[˜‘€žtöžöˆý›DÛ&ÀqZ[$unìŠmXŠt Æþ‡Çe†w/“_¼$…ëÜrª5oà\+Ë@’ÇåtÅYÔE[8§¥dü@ÊZ–Ò08ö”PÜó0üÔ ý¦ÿAÖ ,iÃÁ|;YZ· Ox’ª® ´©Î¦¨=ž­*ݬqo;Ö…À¢ù—:n5ž?¾1¡^¡À]e À£Üœ1)Œa@šøâF7¢]Ë¿‘F*&2²n@¥2#Õ&!ÐkŸÍϳ‹‡f á® ªh Ÿ·f¤5¡‡äCLes3ì ú'+×íÒ³û´¥Á³$ ãFßÔ\‡ʳhP“yˆ½%ÚV28òx@~8'-%¹«¾Á;ðSNN^†Yáìâë=éõ^ ¢s#ëùaΓŸ$] ,¢Û`ÕP6$›kíïf*—‹OñÝóP÷0ÚLèZv[<)œIôcñh%Û=KqñàabIQºpÊðCsþ™¥.o|³j­s8 ÇXͺy‘uB‚¤7Ó[wÆú¤ !áÎŒ::#( JŠÓâùŸy½hà&¹17¼–c“hû´\ìˆ{I¡qŒ99ïDÂwjÔ‘º‘0[¤­aùG9Ç+JëÝ€W»ˆ‚¥Å5ƒWŸÌ‘º¨fpÇ-~_-V’ü±ƒ]ïZÎu:à»9•_¤;hH€¦»‰+zæáIþ <á×j¶¯—¡¥¶÷"ºo‘p,š†„l–ü½AŠÓ6½x‚…Ö†b¶¯“ 9BL[ênøÁ'ëÂ4 –•)Ž¡Æ”žü T׆¹<>Í|—ÀÉ^‚ä/÷'Z5a$˜è­ñž¨«¢Ð8 {˜,·ßÚ[æG:bÂ*¼ôÿaö`á¨nÉYøòŠÓ„nëò  "Ë~†uuØ/ju鄦$ú5Zy(+–øD¾>ÚnŠÜôfÏ¿m@ÿó:kcNýÀÿ§`‰ÿXˆ=ò–Œ%¿¦wJï$Ä‹„†q­üy½žH f¾O·óçýôþ|>ÄŸ½òù°|þ@>¡òçúþþ FUñ÷Çéü}·|ïãïcâøs,ßËŸ F6ñç“üÉ0܉× øOá=3}š‚ôht+Q‰ÏQþ=„ú}Dñûˆêì&,N´>âð=‚}7b¿Lø]¿%ðCh¸âKá÷T»à7 ~M¢=] åÍð›ëÏñôÝÏúˆ³—“ÞFñ§?§@¹ziŒíŽ“Œn2ÑVމáÄIfÑY/ajÉê%oêsìÔôç —µÙg/yÈŸ3ÊåP=ÄK_ØKržN´±ºäb’×Kbb «‹Wä†%wγ äö’skMÍï%Åbt9—‘vŒ#—<—çÙK†?í÷õ‘~ÚG 0ñú•>hºŸ®ÜCŠúˆÏÿ8ÕGFÃcL+ãÄc¼xL€Çi}ˆF×2©«eÌÃr\ÛÉ0ÿnRìaPݸ•ÑÞEÄuÃzãdr·˜f4q.¡È¿‹Ó÷!½ˆŒRu«ÀvRñdÐ|j9Ýìñ<}AöÈ‚öØCqìàu¹œ-ëre@Ô²ë/¬ê|YíÄ1âdšÙâ—i[¨»IÐlñý•l1B¶È-v“R³ÑËôײQ% Mç¤ýä  •3k¡ñôÃ@@ðˆ“²Ã$; ³qrÖŠÀNks„ö“Ótú ¼¿J_“à¦c9<Ç@§GÑ왹R݉_ÝCÊûÈ ¬JÀQ -„ìo¬í\†ÜlÎH]]*n'QœÌª/‰“ÙåÌË“|/0ž9=Ä@ÙÙ8í PèË¢Ë8è2 ŸE¥q8^qRù É ˜s­æ¯‰æ¡ù¬žˆÕUVõ¶Uç1â†USÿQ¢õCéDù< u”þÖZF–ô8ß\B'óVð!0#† ÃŽÃgQé>RMIÉ ˆWk¯ÛfIÔc¤g0ö(R$†çË!Ë%æF«s|¡–ã÷ÂWXþü­*û0q@]DéÞ”à¼NßpÔ|€ã²íÝOÀÔÖòjâdQΘ8Y¼àÔv“Q¼:«(Woå{I´hè&y¼%¶ÒÓ ô\^ºÔVšÈk´iJäq·âd¬äË—×A²¢žs&¾@zµßÃp…šWØMÎ+w`ne¹îa÷w 'È¡y€íÕãd`fu79ë"çÇÉåN¯3N.ì&cEÓ¼‹š50ïC„°ñaR([®Mn)Ú4w¨Ç·–8 ›5ëºÉÙs½ Ì|^ryóYcûK⤕¿äµ™ Ú{H_}´Üåu&~¯‹õÆ2Z‚¾ÔÇ«ääe]‡5T KƒÙ6ð° :e_" uƒÜm:­Ö]ØåÀñ«`36•3µLó²ƒeæql'ӽ̣•–ë^}7ÙÜCÆ Š/xÝr/œ>sC8޶j@Ïr&Ëý½¼›L“^aÃÊW¬Á¯´-à*ž“«gc5Éë'e:ýƒÇ“qœtú¦NߢÇI‰NßÖé;:}÷ ÒÐOÆCÞû™ÛO* þ(ñœ %Dãç²!p¸Ž“LA<ÃhœÔg ìò9Œâ¸eþ­”ö’"d\#}~§¯—8@›àüj‡ðéc¸—è…È#}dœ:Ë_d•ñ²ñêl¿Ï*óñ² 05äPO±>ò¨•ÛaŸéc)3% l$æŠrž,»MµBÙ¼Ñê†ÝK~ÈW²^Æ hó#Èí€6VÁNé©x˜¯||ÊÊÑÅ1ÁgB1ÑÐØ‘‹QIÌâJ"…?„LÓ´lxÒ"î°P¹Ã+ÐYJc×*î'…ôŒñSµìì£ÜÁ–i‰w$=©Î*”øÛ…ÏÂÒ:`ó×v“ |€ê~'´Ló0T‚ÆJ6øw‚~ÐÜ~‚°;9Ïy3¶›ÒQŸócR¤ø$ì5r¾öùNµã⧇HÁÃÑZÁ˶Q†ÆWÐÏ·á(QÄJF)£åh ¤2ê/œ#Â|¶I‹•»^®-ÚF4ß¾Ãï+)ê›K¢‡âwèhHºk«\…}¢Îrø.’‘ë¹&¸—y:ÀÝ'ȨG*÷añ¼˜ËômC}K}xþ,ARn¢ö“Ð\‡ÏÀïëåpçHÛ=k‡í~óÝÄ'§çVøW|¶¦”$©9m|Z=æyS­š¶ú³ú4«ú4ɦ²äÚÒ(N×&&Zþ†|ÙÅ)lø“ºÓ$¥X¶X³Ô9I ¨ À¡?¦hžÀÓ®(áY8ô»ÉϽHî=Èó$êAœò^LÁ¢JOgp’2ÙÒ¨Ý! W•ÖÐê`%%L€}èvüX~% ŒÓ€IåBÉ!µÌ¶3?º¿@"eeRϪÞOnCù® Š_´‡ü²<Û67ÚÝ»ÉK}ä%Ûë¯úȯl¯/÷‘—{‰g?ùµÂ+åè áØgsz(fe†ÇVÕYH #N^=D^+ÏôhéAƒß›çô7ýä—no†7^·€¶ÃØÛÉ6´ôßv“‰^'z+¹£æw=dR^¹á˜}/ù}¹ÑK²=nPF7Æ óú>ò%^²`e™žLéÙÄÝ/™¥åY^—7‹7°\yY†ïwRbΆé‰Þl̼ ´„Ï·  ‹{wðñ6x§<Ç›ƒoïR²¼§èš'ïoÍ„•ÝàÕóµÂù~_zE)0åiœ×{3`Jjiù£|í#X Ÿ~èÍ~µ,Ë“%µÎBÙÜ×”…n.»‡"­ G¶7CQE>ˆØ“¯s-t,fpoûÍPª5&æ;>±63ÅüŠ &Æ[¢ëŸg`jlý>äûV  Žá0­,°ºyý|^ÿ7#ÁH/"…ý$Ÿ‚fÃ=:Ïæm‡›ÒG‰SV? ‚|ËÀfýd‚N?>JÎ…ò î‰üSÂYv”BqQ?)£GÉ(á£/‚ÃTJäQ\'™r]ÌIˆ8K@““¸\ìAbaœü•»©çåZ®ç*ÜÖeÈR¹DxÖ~d…H›)ÁkÌöSŒ)†àc^Ë€góLmÌ{3!„&òå牱§*§[üMŒ}–¼N©S“„ÑØ„0‚Y|Ü>8Ír¾LìRQãö¼B©O 2íäo_jRkµr¹IƒŒ6 â‹„Ÿê½äï $²ƒøÎO½ï•ô㛘;CŽwovÒxãÍñ&IÝPCÁúÛ?€©Ï}(yi¿K?Ôx!ÔÏ´î¼.“òaIâê.A(³ìú‰>|Rsü@>ÿù q„÷›“ÉOm.Âá„'9|ô~âã¤â³˜nÍ""gQ™n%IGD(GBîØ½ê8ì+ƒ ;Šë2OG™v ‹¸)™h$©I=À;5qNŠ‹°ä_0žùd ŠŠÃ<(ˆÿ})Å…Ó8Ý~Pβübvåc¤©|ÌPfÊê©wyPq:<»HÙ†ºÕ•«ÈîÒ€†¡Rnu!»fHéß³‹LN…e°B/ ’z(þ#¬ÖO»ŽAÅê?øRXzXª<×@ n$þ?/ÿ`ãçñ¥ð hô˜*CëB§'ÈHî¿”q\ ^U|¾êê'xøä– K¹Àíæþ$xÛɧþ–M'ç ˜B}¨€Q*•¹â•°1HÚÍб¿hÊŸò€â+Ýiz9}“¿™¶ß¢”Ÿ½l¦?Àžr¯T‹âäž ûE…'3ŒÎÊÌU)óäT&ÉÅåàT §¤×c³¸°Z™/;Ý$yQ‹ýHž—|$·¡)‰œÜݽä8vZ€g@ÝÉïÄÄ¡n5MTóÓûÛò‰&…Ë™pf®âÐ,PÊyyäb\9¢¹™5a àhuûéãäªg»Ì6Ê"Ùæ‹Ûsoª•†Q¯ðó¨zÊÝGÁ¦¤l/Õˆ¶#ÜSvSÇ0ªT<+sòãÔUÎüfwÀuCÅŸG$—h9ºÐ. úÉrþ–³ØZŽ_RÛ( èƒï'¬ ø~†¾‡AfÊëMü‡¹d¿M›«pöGÀÎA™¯§Bf³úȧ–wðs+÷_‘ƒåeÃa§9âÜ€ê•å/ŒÓ\~Lþãç%™*yýd*¬ æPgé*Ê‹³¡'™…β•õ%q:L¸iäó¥KðœfaI#g%Á8õà ¿_ݨÎ.,lr‹tªÜò,3´—ÓÿÈÂmЇ\!ƒÃ9÷‚¦ëš’'\Oôcd¿^y7ãñ _ xΤÔSËA˜\H’ U,¤£ XtC:vE³wÊ}YbU“ÕºÀ²Ùà\e©å÷ғĆ€¦àCKÒðMAÂfã²eM"Ž$˜r•åÂ)y„ÍØ¨4I˜³á7btè!"ù úü_iœŽhà°>¶Á2ˆrŒè &Þz8¨eÔj jV N À¦p`qê=DnBˆAßjy(Õd©%H_8gÇoÎy¹¨ †ÁNƒF&ôD0)Pc‘˜ùG©3w‰™ã= å< °@ž´3}…¾4ÅÉJe•lU#i6ÐÔ8þ‹P'ôùD73Ή{ZRç‘I`1p°«%ØEƒ øÎè&9ð´`9–8Øá¬=_¹ÀF-×/áMàð R&»ú"ྑâaPä=¯²ÒÒÝ˨©’ä௜-Â-JFrúwé‘0¶ôBå" ø|ÉËf 4 ¯÷ÿÓM¦Z¡RèJüTøH“¼ MLà H¤£hÁ™ò®t&/ˆgMZÁX\Xzpà}‘%CÊZÙiôÞ&êÁ9ÁÃÀ³¹§Žá'ï>℃·†_®L øÄÝѤC¨9Ç ì¦cùÜyßéj™æÁ¨~åŠñ8T(«ÐÏŽë& àõÂy–kƒZÎL ^Öh—²@‘É:™D‹ÅÊ›•‹Ð„‚8…/‚µÌ.º‹;ðD<÷°áÈnQrúD­Ç)´Šÿ.¢MR¹eŒV+ÚÁéá-›ûÑ®Ge²^Bü…¤†ûi €‰2g¢_¬¨üÁa–>žã¨ÙŽ{ÄÁ ÏvasÌ»®b_)­9K w4¯M(l³º£Z°'}/J¦+èXã×â_j±¶ˆ%}/’Gh6HO ß=]` Iq;¿È„`ŽŽçØúðØ^”®/É(àĨ9¸çè—Ð)÷JdÁ`[[³Pò€É¨„š|ÒêB)7VÍuš®á÷l{î+—P¯XB«Ò&¡žŽP 8T°TèPu·ñëÀ¶ŸC8ðùd.ƤüG3mnkÁžlºæ(¡kŠ«ªdºy/Õm £´-£ÊF tšÍ|¢§Í.º;qÉTTj§d¥ŸdQ~ÏD•Kÿ'ǽn:îµ/ç¸ïPbr´Ér²¹r²ÈEüEqjÛ]nçåPÞÍTNC…ôÆ/ªi¡’N¥Kv)…qP¯Ÿ(]éR7Q¦qªÇgF›œ z$-NôßDÌp¡xÌ”ýëý%Ø› H+ܵ|¼Í»Z°1 3N'ÛcZ?Óé;h¼nV.KcªM4EïË’[ «q/òz89ƒ:íïá'ÔŒ*à1èÈÌíà êdpyó0N¦EqÅÉ«¿r’¸Ž+ORwÕIê®>™‚H•k”kS»úͺëN®[~UÙ*«A5äÐJë-S$˜jŠxYRUUã´¤¾—èå¼Vë£üÈ‹ÀÊé–pÄ2U¾øiênz:€ÖKԒк“"waa'H@Är*×óXιU£+7¨ÁL{£ò59ã«a<n=ßaZÚ ™!žÄä˜ÖIVLë3ôŒ2§WÓ3»‰êÕ”Æét.@› À‰„e'Ù(")†jÃ>ŒJN ¦òu¨âè»Q¹éÿ÷ÉÜœ˜Ì7Äd(0î=xoàdj™îu,szts;yÖëð襌“qã…A¡×§e‡É0þôj{ÉÓ=èß¿ßÏê&×y] %yäG»Ü_§ÜcüVhŸ³È_ØK¢Ï¿Ê –îŒCt&ü-‡swN)±ÊêSê‡a}–½ÞÀðT:½—d@^ ÷‰Y D"6DMCD•*ù£³3>'º·(ß”¤Ž»õ‚¥=>+tEÔ›hN7™…£­y¦—í¦åqZQî‘øšŠ±n€ÁíÀåw¿W ¢’9‹Oè4BQn…Â#döŠâf‘†¼½Á€À‰“¢Ø™w7®J"ÍÇq€Ü´Rõ:W¢.¢î&ç5®´‚äË4Çíð:÷ÒÙÂ0ªH ¢ZÜÊŸ¦î4ÏÑLÊoðÞÆphB>#EÇIìHú–kpZlÊMyì4àëV_dà ÷X _Þ O`,À?GhØ´³qùi‚Hó[ÊmÒ-R¨o´9À& ¿àêæAMüíFJ¨ ði¶ÃtŽUôÎ±Š”Ÿ½lfRl`F±”P`õ³(£ÜnqÀ+¤ áÔ‚ê”ôÞ94›S°9?åg/«ð‚ƒyæb¹ËÃ0’9À\Жx¦ªÌÇ8Ã7›· ¨Ø¹VS²ÓãÆž°Ûˆs|c­Z¯v°‡ÚÚdËšrØë)PËÖ óË1H~°ØðÌ{d?¿Òëô¸÷Ð…ÞŒr›6X;ÓhÛ˜rÛ¯1åg/+Ç¡5¸7`bÍ!§âÕD вtå»Üu ?›±ôf5è^.šãó}FüÀbf\å{J·ÜÆ¿úQ¢~Ão~fFÕr8R^íqåÓZ¼³ÖöÑzJ–ˆ»~{Ï"ÞTöì£ Šlõ6?¤£ÕR ¥KT²ÄfŸK,äH®Ü…Aq'@;l%ºr7z¯îfâP¡bŽ}N✎qr¯\üƒÐíá+…Ò•›ë¹R°±'xH#)Xா\ÓÔ}ô\&Ü«o$ꦞÅx<²é¥Ã™Ùe©ƒpÊx3Á†̓@JÞŒ;F2<'À±»TS1åO¤PèM;åý´qe`?mZÜC—í¡Ëëaò+ÄFbô6=O•qÒXüŠVž¥£¬‰>\_Âgô¾Õ‚­¬Í»½dl9ocùr± PÁ®|ÌUóÕ»€ÖWƒÞq]% üÞs„¯n²òwte›ÜYëzÌ\]ù~?ÚmÛ…{î~剀VI°èúĸ—?3<Þžï–/ xq´Ÿ™eÂK~7~È ”°}ô"FÑ5åZÀä±c4d?J:ѲŒL TåAå!9òJ º`“qº¶Nd3·¦hK7™ŒÏ0jâ>Ô‚uRUpÀø^Gœ®ï=ñjb¯¹Éà”z3˜DJ¯%ƦJ÷þx?Œ°AŒU&æÌ~Ð3@»™w+?°œŒc§–‘JŸà`!æãôb¾Gz4»ƒ»•›i!¬úåQ q‰\õô’¡¯78p½\Ò:äbw(Ino€tAè¢)¶4ïKâ´5NÛºÉK‰ïïÈOJà¬&{P˜óxÚÕ=ÜñÅ_h{7¹ã ”á’éqº+x“’Æ^B€Dqyœ^q^/ñA;/šN¢íWlm‡‰Ïà•‰åg¢¿gº®ìÌòÅyñÿ¹°¸ƒ“ðq¤ m/lÏÁ'ª­Ó¸ú'—ÀYØM¯6tµ ¸¾‰1ØG¯MçW=âvѳÊ·F^&Ñ1C¢£4ŽÁmG‚=¸¨=Ë; Y†ÿ÷†b†ÔšÌˆC_À¢.xX@ rh×Ù ©h P¥O‰ËS“'ý¸¯Œü¡œ‰`°b¼5ƒíâµÝ>úUkûèVJêñy=%½d;TÞpuŠ8½1Q+-i$îÓ×°?Î¥b/ýzω·Á ¶z·`ob½‰‘Ôîgcoà¼ÁÜÀu³}ôf ”+'ƒ¼PÖXðzOì•c”$ذŸdC*Ù|²ŸdêÊÞ¬áü*= ³üË™GI¾r=LÊ>åI‰år¹‘>Žüœ÷œ у¼tý†Jì°”»÷zøgg¿„sºtm GuA ¡.ŠÊ- ±kÈçÄ{?¥°9ÆÐÁïì¡ßôóÏ#Ý‚ˆnMÚÜa¼ÛÁtݾuŠnO+‡d7ó{$¨ÓóÎÓÑpv“ì„Gã¶6­&±F#À=£üX‚Ë“„êð›ÌæYå'©Nj:q~ª´îˆå7Δê/5AþÌÂV)öªç«r*Ï[ó98(S_?A¿mþ wA:’¨´[}‘ö/¯üE¹“¸Ø|2S»¸þPK>ñRÆ>†“PK7Aorg/hsqldb/TableBase.class¥Yx[Õ>WzÒÓxòHxId›Èp$''p8Æ!Ž,'„6U¤G KF’3 »én)-¥ŒR(­ …BÚØ :HK'tC'ÐI]4$ýÏ}WÒs"ü…{tÎ=ëž{Æ•xüÈãDÔ"Ú´„žôÓ4ú/?äåG¼üØO?¡Ÿègô£Oóòs^~ÁË/yù•N¿føžaølËs:ý–ᓼüŽ—ß©šþÀË™ëOL{ž?ý™—¿ðò×ý^`–¿óòz< H0 —Niˆ 7v„)á ¯Ð™æãÅÏ]¼âOU¼T3C_ÔŠi~1]œ¦˜!¨¶«gUï–XÇêεí[úÛWvwÂZ— PG6“/Ä3… ñô°åF0… êØÆXçÚ-±õ+/ZßÙ·‘É.AÐÖÙÂLq 2Öv®ííÛX¦i u´ÃÊùeš mÉÎKúËd¯Tè¤è lè꼸LñA]_gl}·ƒË/¨¦¿¯½'ÖÕßÕÛS¦#|U«Ö÷tL¤¡A¦D3 ¡cu{Ï[bÍ!>yGï:ûÛ!ÑÙÓÏdѳÉÒl»´ÀkHñwÆbŠ8‡°‰«Öww3e– O¾ÍY‚ætgsÍÛóW¤“[›‡¬\>•/4¯³¡•)Ęk)¼*’V,‘‚dÈAêJâîÖà¸C¹Ô`<·ûBkwG6äÚŒ­.SûwY ÏÚì4[`b3oÁÒŒ‰*bÖÃlA?•IZ»ºaQPx‚¼Ühîâ |Éx!¾5ž‡ˆéä:_‘Ábnµò…¾ìή$Ž˜Ú–²r¶·3£Ç ¹TÅ&AÓxWZY•eáÁ ¼*qªÉòoN§[ ‘M÷d = p€ ÙŠŠL0!wd‡30ë‡Ëi‹· –Ê÷Yñdo&½[7•ï·‡ šÊwÄÛ­¤¢í*ÈRÖNÜZ*qª°OËç8ŠU)„4ŸOe3+ H…@€ü`\áPØàÕP˜‹gòñDüqxklcwkñð!uj!ˆ³3Þe©Lª°B»qÁAZG6 “«qQÖ—V¼š®®Éƒõù“ÃCéT"^€ÒY œœý§•öíV¡¿7ø‚¬qÝÄ„ÅRÖƒ Æj²úà`ª°.gå­Ü[rT!ž¸|m|HêÄ å +Gi:»âá&ø–‰ïH 0ws_Y~®nœJíMIUˆÁÙ¥ò¦šOkבJºº‰ñrf'† ’»,Q.SM^¨!äBYÂöÁ‰kFà«@¶óE)åëYU®_ÑuAõ]“:iËu•[@ý1¾Md6ÁÜcí´ wl·—ÛRìÔ&§S*`||ΠĚ<ibh›8Mì¬<¶Wä1 u€²DÎB’:/@è¹¾Õpµ'>ˆ$2º2tt<Ÿç˜¬lÜeçj-? í‰Ò#›Ã 'o¿äÁzsI+'¿¯Ú¶,æ·ÇW;¿õ§ØÐù«Æñù(ý‘Ÿì¹1«BÎòÎ11Ž9eÎü¿ê­X‚¿1ûe§ZÃÙîaJØÉ3•fÓ4Z‚ﳋ(LËi :— ó€·;ð•À;øùÀ;ø*à8ðÕÀ»øà:ðnàkxð^¾øE¼xÌ÷_ïÀ7¿Ø_|£ß|³¿økøkoqà¯Ã'Ìþé„°„·Ä±bšJx™Â1?%&²Ä³ŠŽi'aNᘑ+ˆÁ)á.©Oã9.ñ+%Ôè*)¯Ñë|ƒ‚oTzߤð7K(ø­ ñ·*ø6 ]ü¤üoWðò<óð^{7ÿü>Á?¼Dî#ÑFɵOò ð¼Gñ @§ps‰'bbuGN%qO¤i?yÇH%_¤i”ü‘°g*ÞñQ FÜFɈ¸Rh”ªVRM$²ÄýT%ƨ¶hô½ô>e4Mn¸FôºiÚÆûhzw¼nXe›CXñ0ô—ÌK 0„Õà œ`hÀ †Uð‚a ¼ˆÞ+-×Òûéje¹Câaƒw)Ç>@×”¶]¥mßÝdÿ}°$]¥¤]J´–>Dת½yJ´šP3s/éÚi’QЇY'¹Bx}ÔÒuô%sâÀ?@M‹DÇ脵‘12£Mh†›Šž_G×+Þ™ÐÏ1 J®4ÓUbº¡äà4å —#0^t¯<µß¤œœ.÷o‘wTãn£âÞ’£:¹jÏÓ飼™>V!pUE÷”N?WmWñUŒßXéð†<üÇioFQã­ îU7u[é$ÎíYEi<ÿÔöt-XßRdø$}ª‚|Mq{„>]’··uD;üV´GÅD }gÅ‹ŒmO)^NqWqû3tWIÜvß©/Um-?í}ñª68,ºÝËÝ+Ü­ôÔ"m_DŒR}DZåÊlÀ§×ýt¢»ÕcʳŽß&| MOK›7ì=@'á] ó‡“ñõ™¾›È;BO›ž›È£­`ñ°î^´Èµ—j‹ˆéé!Yd¥í–6¿é û¥¶ñÛeYYõ)ÇIWˆöDÂ^ø8BW¹[ýîÖ€0}·Q˜ÖÍÀ¢Å7’w_ì ˆ‘£Ï°ÈcÜsXÄ„½tjô1ªn0µ½´á6ZÖ»MßrÓתi+Fhî‰7òNW öo¥Ä´Û)¤Øü­Ú9òü Ññ½¨¨è(Í¡P$ên¸ŸNÂÝï4»6d\nÁ¦Â}¥¬^CæQÜ‹G§Ïêt¸ÑÃT'ŽPʇ)Þºùá—È#ÄŒÉc̨òÖ%?yKüÀ†_÷7@ ¾­©ë Sˆ|п²ÜþÎÒìÏsÎÐ"Q!š´(ê×.³ò'÷Ímó"Zc4o„hl¥e„ó•ÏÉ{åª|ÖiT§1ü:ݧÓýšN@õ`÷q”ós"[ ø|Sä;N_°«Š1RŒÜ„NrÁW¾RËõ!šDu‘hÓ°fzL¯©Qc›/ö!aŸ]·5üSÉ܃ÐVîà®sˆŒZúê´÷Säá¦qNþ‡œÈfmwkÐ rjÎûÍ`“\Ô˜A.-&,j‰í "EŸrÜQPÝQtF0öÃ¥pÀ]ôjn[(*7ÙùäF.L'CžsLõaü㤰Ï-scØ¡G•óÛÐGy^¬‘É(êQØÑG¨ ÿ0íÜËìú&“aCKÃZˆ‡‚ N>‡6¶ÔæÇdÍ63Ã:ÝEå\û0Í/RÝL _á•ÍgaÓ8ZÖ?ßÖ߃)t† …rM¶j¦v3Wž_Z|RºmЦî¢t¯{‚{#´¬Ç>+lµšú>ÌGæôÀËlg)ýg‘ÿ0¹ÄGáÿPKƒé_¡ .PK8Aorg/hsqldb/TableDerived.class¥X `Tå•>'3“›™ü yÈ@"¨€“IB**A1Áh i-CæF'3à ¯Úú¨ÖÖj룵†ÖZM«´B› ´V¥í.ö±Ýínw·Û}¿ß¯î³ëbÙïü÷ÎäÎdÙ–pÿ×yüç?¯ÿüó½ŸýM"Zɯh˜ÞòÓn:SAß Ð·èÛLôʯHó«:KoËè;ø®Œ¾'Í÷¥ùµý€~]šßé¥ùM?ýýHF¿í§ß¡ßèeô{2ú‰4¿/Ð?µ?”é ÅèOèOe?“µ?—æ/D ¿ôÓú+㯥ùƒþ6@KéïXþ{ÁÖ?Ð? Ë’é?Ëè_dô¯Â÷§~0ú©Lÿ-@ôïìú~úOú¯ý7ýLFÿ wè@>'kïÊÖ?Ðy&ƒD\röØË>•Kc\á§.öK¦R–•ÁUWhÏ ÐF®4\‹]¸ÎÏõ<7À ‹ÜŒ;¬Ä=t=óí/yK0•ÉØè2ÏtlÕ]‘!sDõSÚݶÏJ´Oµx&Ýö 3ÛI«Ú…Ó<ׂiYÀ¿QZd;k4‘Aþp¦+B=%R”ki«ƒ~hž}ÿU %ãRý G7ÎT¡¬Ò+uÓ¢‹J…12‰.;"‰ÍuCbÁ†,×Ñf+6±ßbâúl ÍêìÙ%ySI¦Æ‘ã¦ÖšL7âN½ÕŠšPŽÏ)M‚ªÖ‹ja5÷F`ã|i‚;=ÚT{¿­¶¹Åü¶ÃeaÅH4Ú5šIæK«öÐôh&ËqÃf&O|ia SRëÕyG£>Óö‹æPOK±"Ý>àM耑›N«}^å®-”ì aOÉ»×Ðw§íWÒpØÓ2íÍC³3µ(¦±Húf+]íÅã& ªÄ˜úBvÑ^Ê;uÎ¨Ž£é² y¡P䘬vh˜T2{áGbãÌh ¶ë)ÊÀ¼ñ®,Y… ö\`Çê´µ!™È˜‡ ô…%X8@ g"9¥FÓûðʘ#f"£=‡¿øqÑ™¦ …¹gÀM#ï‡\¡+WRø®îäRÞ–\)ÓJÃe;6Û½– Ô’8bú¹aW=‰L2·ƒs't–Ôälx‹Ô¦’©bEH‘šKã+Jr/4SAæï¿]5 ÔËI0»GSqýEZîš]Šì¹Ð›l.ÄîÇ©rçq’š7¤¥†¤“q1ieÆ~ÓÛ÷uaeîï•— œµÒrW9×ü?Ÿf9J¹hðlîצ‘;RG.üºÂPÄšs)Ù «!Tê¹Y|/—ò^W“çY4_L6”ü-Hžýú…㘦ÈÓܰ"O(¤«vÿ¶ Ÿ ÓJù)HðlRÛÕü9:XdU©gëEk‰3{]J»i˜˜ö‘Ÿ‚R¾“üãS÷xwêMÝïwz¼ftç¦îñ4Õý! ¿ üðØEû!Ìî%/þˆv†[ÛšO‡=“TÖüŠÆ_¯ _¾uμø[ç‚åÆëÆIÕÒwë<§ÉûÖI,0݃¶<ç©—¼ÝkÐ}ÝÏ`_¡¥ù°#Í Èb _jKã ½“Tú&É@›¥ŠIò‡9XîÍRà¤RÈpÈò ôOæUw‰sùâ¼…nAõ^•z/n0&©ª¡ÜÖuã[ïZ|!|‹µ5AÈQ=N‹‚Þ³T!“9a0©§ªü¤6è;Kþ /DuŽVžE|ÏqçØ£‡‹aÞìã€=’‡]ïÀ–…'¨þ,ÄE7AsÇÈç9ŽqåÛdxÆ) Ã,5Ï _NžúÀF¡}ô"¼æ•æ5¿¯OÐ'^-¯¹‚}6ÑD'ÐOä)=Äs0|,/Â2‡¬Ö¡Ò9ÎqÏñbšÇ/B3¯Í¡YP‚æIú”CÓæÐÔ;ºçu±pêD•Un4èÓ˜>•WF1%ç)§Q~Ó§iÌ¡¬u(}‚~±þQúl °Ê?GÏ8à;)Þ°ÿYòž´³”éQª Ët‚šNSsø]b[ª9lK¶HÂÕ.–€”ëûÈSÑ´Xïõ¬³×“Nµ÷ðØÜ‚nSŒ[ÏÒ-­obn £iÞ9b~‡VâøÏå•q?Äó ßŽ`WsT› vŒªÃY }#ÐÛzšZ0ñÆÉË}˜„ß·y²¹FÝ:ImãÚ³A^sk–Ú±6%Å<2ÎQ ŒÜ€öU£­­äù¼åCKÈwžv‘¡]ûuýƒ{¥RYt޹‹¦q¿Ao8‡¬Ò5ûüôf>ÌÕ¹kž7h÷WioNCw;º;ÂWÑ(È ´‘¦àÿPK‰)éåü!PK7Aorg/hsqldb/TableUtil.class¥VßWEþ&»aIºPT Új„¤1”ªØ¤bhml Õ¥µ@ý±I†°°lèî¦6ÏöÍ¿ ¯¾ðªçÔÐc{ú®…‡§G¼³Y Ñxšäܹ÷Îw¿{çÎl~ÿë×—¦°Æ(’ .„@JÁ»aÈH‹É¤…˜ ãÞ ã}| FÓB|"qYŒ2adqEŒ® ].„ð±˜^†1šây³ =W Ëps R|â.ƒœ¯U8Ã°Å¿Ó «jò|ͬoX zÉä ®1ôÞp˜E}ƒœÔ‚eq;oêŽÃ†â·jv5½JöJ)=«»zIwx¶]¹»vN·ô*·Ïìγ…®¼ÚÜÆ&wÒ $³ízi–aÌá®7.Xþˆ;×k¶V/=¨s»Á0ÿç’¥%‘Ÿæêåõ9}ÓÏøº‚OéÇЯW*3u·Öª¥›:c¹CB!Bþâ‚¥•Wù†î-bÐþ ©cA:ÇSÅ= <Ëmã!¯óƒæ·1a.¨ø 7UÜœŠ"æ© *nãs_¨Ð° âæUÜÅ—*îaQÅ–ÜWñ¾VñXú-t%eP@ŽU† 5|˜Ô×0Öô‡zÚÔ­jz¾´ÆË.Ã;]!°\ Õ‡Ar¯ÓbËîÅ_§-—–Ú ×mÚÜqŒšåuCˆÚ©Uq†Ø0íûà¹*Uî¶=ŸèŠuÙæºËoÛÆ†n7nòF¾f9®­U5Ù]ZËïDôWwû6_«‹åtQP½GÛ L£”ž±m½ÑÚHuÅ0MÓY³ÊÄ:_öª9p˜ÃqÂöçÞ1%âS4„6íÙ(«ÐJÝ4}ÇÑÎn'Z¼)û½;y oÍß "×j¬s¡"Ä~ÿJhmQ<^èvöZ X˯òò:]®¿I)‰#{—aè5Ã1«Xì_Ä]îí]¶ë¡`!¬›&oeãüÿpØi.Ûma†önJ͵ëe·n‹×ËÙ®‚à4Fè*>A0q ’ài¼í~Oon™ž9V<ùý‰&B/ÂÅÔ3„,öJj 2“š8V2«¿ o rîK$Xª‰~R¢t ’¼„à+DœÙA²‚³ŒÑç‚;dßWIBEƒÁ>ò<¸Oh†ò„ÎIWcÉ—?â”È.ö Ç“±)Yuàq€míü±8„À+ØŸ”YHøp÷ ®GÀJ¹q7ŸÊȉ§ˆ<Å ¥3¥Ê gd%*_÷cd‚ Q½%Šòù½qD¤Ë¤x‹ƒôwgœþ¶¼Iû¸BÏ*BPKØÖØV+ PK7Aorg/hsqldb/TableWorks.classÍ; xTÕÕçÞYÞ,7 †0d®†$C%ê°(«DIDƒ  â a$™ 3ƒ€U«-V[[·º%.PªÄµMP‹¶.¸tÓ.Zk[km­Ý÷¿Bÿœ{ï›7[ ¶ßÿ}¿Ê}w=çܳŸ;òêÇOí€iüm<ÏF¬ÂœrÃz6Ú æ§žlÆPSé†ù,àfUl,5ã¨ïÁ}ö»±—¦áZØK½}tì)Z}ššg¨ù­î'PÏRï9j¾Iû¾E½ç½ìö"5/yØö2Ay…^¥-¯¹Ø·‰ºïì»ØÅ¾Gÿ>-¿n°7æHSèa?b?ö Cߤµ·¨ù ñ÷mû){‡,ägnösö {—­$†þ’š÷ˆç¿2Øû \‘ήԖ–HŠÁ¸ÅñD{ýºä†Ž¶5õÑ5õç&Ú"‰HÛ¢prn˜›Û©ðšp2ÂÀ—½y¾žÆ-ìuàúðìõ¥4‡‹F2’LFã1#³—[Ô,npΌƢ©Ù ¦TÛPsÊ2öyñ6Äèj¤–*ä#«§Cïk]i]?/ §" ã‰H´=vNd ƒ19ÈæÅcÉT"¥$ô’–T¸u}S¸KBAÅ©p[›uÞ`¿fP*AÏik›ïØØ‰ äÁ¤ÙÜÔ–PÝakëŒÁ·6æ‹dvç$á-‹£I¢-Î`¿1Øh– Ê7v¡„"Ö ’ æTC¬ÇX&jO©.d玕t†×Gš#›ä$åêÿ’”c¡<Æ:("›&žpG*’hŒµE63¨Ê¡/J“õriƪFº …¦·ºHÍáN!c±Hb^G8™¤Kέ^•#5scS8n$&›ã+§ †MiØ’D´3œØ"5tŽ/ˆE7lÌ’-ƒš¡¢"⇓ÆIýÏ‚ànKÄ»ô•|Õ‹/ _®ïÇÚë[R‰h¬]ôÐSWÕ+IëzT$"í¨„xõ @B†,˜P ç|µEƒQP-RFA/QýÖ`"—‘Ô–®ˆIÇôÁmæ(vg°ß!Ý­š —G)Ü@Îk)‚6Øï ö髎b‘D|y2B'›7vt„×D;¢©-G=³’ÎT¨3ó#kÃ;R 6w%L_XY#EkI2J$µ[#Œ.ꧬİ€Ž7g ®Qãg0ñX†GˆFdµŽúŠ˜>훈tÆ/×òhާˆ9~Ç^-Y5Lr»)Þ]»EÛœ­Z'Þç;ûB÷¢fI€4ØŸ|›•#Çz'/À‹^‚^†W¼ ¯ ögöƒýU°¿±¿ öjþÉ>ì_ìÐ öoö‘`Ù!ƒ v˜},Ø‚3η± nÜÁ¸Æ Á]Ü-¸‡{ ./᥂—± >Lðr>Üà#É}‚â^Á+øhÁýHÃ+ "^ÅÇ >¾/øx>Að‰|’à“©9Ž/ø ¼Zð)¼Æàµ‚×ñ `ÃX¹€×á Á§òzÁO„ï~‘6Ÿ,ø)|:ò¶qþ…oüT~šà§óN¿`!g>“.3‹Ïü ¢äLΡá\"~²ƒÏç Îö…ü,Á+ð=¾¡hˆDQðFÁÏF¢àðKÁÏÁ|1Ý®‰7 ~._"øy4<Ÿšj–Rs6ð&¼…¡Kðe|¹àò‚¯ä«ÐH¿ˆö\L3—U«yHðKéªa¾FðVBÒÆ#‚¯¥}í|àQV&øe|½€¿PïòõGðÞ)xŒÇ\‚óܫɽËã‰õI¼2~ ï"HHI:šâ¿œo2øfÁ·ð+ÿ¿ÒàW ~5ÿ4¦‚_CT_Ë?CŠÊ?Ë· ~¡ûõ®G òøçÿ~#ÿ"1ðK‚ßD·¼™ß"à/´ùVZ½”çËüvÁï æNjîâw#giµ›b0iÞ_ð~à÷êûHoîÇËÀ{ð+Á·1¯`lPvï’켄p»à_!ŽvÁ_ßA—þ*@ð‰Ä¼Wð‡H¨óG| ‚? o þ\ð¯ñ¯ ¾‹íæOþ$]¥8Ä×ý<>Vð=Dþ^¾½­àOñ§†7òý‚•²2|ÞRb˳˜Eõ‹‹ãíÑÖp 1?Ç¿)ø·ø ôyÜX°¹5ҕ‚?Ï_üEþ’Áþ2ð 5¯Ró5ßæß1øwÿGI¿Îß0øHÎ?4øÐø“îõÿ ê–¨Î]sY¤•¢WñPŽn {·‚™ƒDECä˪Æ\e¥ˆ˜¬Wa|Ö|,|y´=œŠ'êÏojÄM}Œ¹Y[pa­*ž†OÌšíŠ$’HPýõÄR- Ú[å§²xî<’ÐEŒl*[Óš’aáåD[¤#bM‰ÈZdFw»Œž:µnœ2h¬eà&ÏŠÄèΑ6lVb>…ÇÉLNRPmäJ1’H ÿP‹iOD}ë1T&Iù9XFï¨dêÄ «Dñ¸!åjxkM,ƒª `rF¢Q¬§WR§.HE;0oY¦ÝÙ-èˆtF(ï20‰Äôv%e0G½ÊH¤«HúâÏ%2+}A¾'S(B¤.4¼ׇê NF“KñVÆÚ[ZÑ.¤•!•žhRå]”JŒ(R„V© šMXßåhyöÚŒ\vµä“¹‹šT†Ž‰Î‚ÍhÈæêê!§Þö˜¼|‰Ôa+ã­-–pR‰¢„uåGH ϱ–±UF$-L¤„…ìŒ&—F:»Pl~•‘ º²úh`Hm›°j¦3ly¬)œj]GZ’[«˜„ÉZ@ŸÌ ²WO!WG ;_z5íMDâ”ãa1N.A*®‚0<ãd‰£<¨“È]E*ƒ«g%±T$BZžs…D´}]*Y¯—óJÕ7"|úè¤â‚ÜœQ#¤›u[a†ŽÜóÆ,}D§ymEÔc_%H‘Ms6¦â ÿÖ"j;$SÒ¦B4ˆÇÙ*ßq$Š­©T Í,QqV®Z‰ÿEw»èÿ‡«{6J#Uâ~A«ÂèÁ/ãÂPª½EUu–&õQw4‰¦¾)œÀ˜éNYõf©,Ó"ké]N:æÝÅ Ð!–ã1¥O^ÿÅ#ùðWnk˶Íüç¹»%«]\üùqêPÿCSÊ£½BÊ÷B+vø‘ÖxgW´eÓAÎÅRŠü¤öç›)´G“ èu³Ð¢÷¡ ïAÉf^"‹>QZFÁØz*YÎcHn$ ä;晑 ׃s:sÀŒ¬›}”läçÑȪòœ ©ts8òg”~è·š‚¬ÃÊ„gH]^_£öÙ“Ñ+ÈJZ ¦š£<ÇœXÛýž—å?†i-E§ø(,&# m>MÇ|š<(¦ú1‰Bœ$†ÂÊ(Ì¡ºÂ‰HÁƒ]ÍßÅeìA>è—ä½îdò&{õʬw,DMœYN jC냉«ÀnJ[3´ª6HdíÏúõã”ÿäœ|Üìˆ`OWVþˆ>—à‡ñv”+‹Ñ¸X.æe1¹‹Èx çÚë/<ÆË[ÞøàÜ$±,‰'uŒ Ÿbô]N+&Ú!°—¼6B™ÓJ%@<~F& SŽ"QRq‹²ÚFK|¸87’LQA,½ÓÚhDª{"U¼¨?¦ºg£“æU‹n²i£þÝË›•–0¸è?÷CÉPZ>y\9ºŒU23ŸsÉ3˜?x˜ìdPw¬º%—H Ù<\Ùtn8®¥¥d9ÏÈóŠÒ¢¿KŽVAƒ¼ “s¾"gIÒ¤¥(S¾C§òKã ÖrvÍÕ%z\&¯?oc¸ƒô±­%·Zv¢C›CÎ{lÁû½åE¤£t´¢ÿH(3}e/o«ël£ü1Z'ô«I‘‡ÜÓy?˳±’ž\åÝOº <›A’\Øn·~ˆ’ä'­²/?Åø/±²1Å ’ ÎröÃÕÜÙ/ˆ§Ï#³'‹¾=Òóæ€Í2-¥ M=ù90vúçuxC-ó'¿ñÚ>p÷ÇØSu×± &én7øUϋ륺ëØ†½ì¶Yn˜e›]¥æÅþPOÈô°jjJBv¿= ¥ÝPVe{aس[m¬÷Èkj_9IÃð0VTŸ{ad7xÊ}wíß³•&F6‹r¨§bTÈáw€QÔ¯èƒÑ!g¹ïV¿3CÐsÖý‹^µÁºúÀßósÐ5G7¦' •£Üw‹ß‘AõqöAemi¨’°ÛcÓ0î%(/÷]£Æ£éˆ¼æÆ–† róÝY›õÆ4*dìÄm´ãöÂT&5ÀÈr_7’(º-ëŽi8.˜†ãkÕŸöBu>Ä)!;ñ* 5Är½J¼¨Ý-µôØž ¶3Ùap2vÒApÔúp4€£™8Pýaì4ì×ÕM€ã ø!ú‘©¿ìðà¿ÀFÓ¨«A:‚×jªKÃÔæ:¢D±¢ÞÖ`ϰçD5wâN˜®…¡&Njpø||SHæ‘“v€ÓÞ€ú@­Zœ6üd G«ñ°‘i8%$μ¹`Ìf÷áí§‡œæ©-îÂç†$Ÿ‘ö@?œF]¿ÑåÔ öÃéô¥Ýý¢n­Ü6CnsöÃÌZŸ½fÑóÚ}0›Õú܆"é8#䪑º¸- gZº8§ÆB›kñÕ¹;jÅX‹wRQç…Ü~÷Ó0…ߨÝ Ò°+ gin΢›²$_ ¶!5àÇŒsœyÞÒ^k/zBš¹_ŠUr¥±F›JÃÙ=èØ™ä´ÕTHbÎA‘¡³¸F:‹4,êx“t"=z¾93®œ¿Ã”N:½¤Æág nQ°Êé(aöÝC¬»¸À9itEÅÄìÿÞV·°OEÕ,°=ÎBvrØœ¶ÃÖà"==/ˆGÍÅÝPS‹s—ø=¨«sL°\™ im[½¬÷pS­“†K•ïòP¡Ïô;^BÉ80pQ³°5;\C»æb›ë‹¤ÓLÆ ‹äº‹¥aM I5ËAÅÁwNÃl~jÀ;Ì€Ÿ¡§BÅ“ahªƒ†Éüœ5x‡‚MÞC°LÅ«áŠj'2vv(ƒÎà¹ùà&#Ê_À»ÚÎBËsPÎG9FZwÀ˜Úª4´=Œª~;†³dñ¾E°øpv •þß0#Ê…3ÿDǽv¿½mvÕ=ð{êWM Ùë(#ëÛ»ÁKÖõÂ+4ÕÒ#¥‘1»”ou Ã9ý˜|† 7×›œ~'AŠªt&dø ¹¡ܽ‘8ìÛá¢ÁÏ[HÆN‰FrY!’­¶#½G*,îøÀ1€‚€qÈùCÐzÂ%‹ßƒ_i¦¯Ãl˜8u¶Î±Ch¨˜(þO¯õ9´œOÃú’çè ¤u¨q~»'–†øò­ÍË~û® z¨-¨ï£|B8þuFÔa Tœ•¯ã¶ZôÍÁ>èÚ¯¦»öoí%6 ÒÄniAƒ9 ì¼m*öhtëUÊoŠ7)ã'bI5×îƒ Ìœfƒò—Sî¶619ƒ>û>ØÌA­lñÙƒ-ª{…ßI?%<®à>ø” vëò[ø½FüÞӉ߇̠ž±ôåÊncÎ×Õ2VeÃK]B‡¹Š¦3SÓe^™Ë*¿=7µq(÷àP|!%2j–¹5úpv‚b·¼‚Úµ([v°F Àr´]ýÁÌ>áNZÁïµVš¢Âñ½:ŸÈKîs’1–Cp“¤ªN‘+ë¹,w58ášXKæ6`>üüþ¤i|i$qÐ4Ò©:«Ø˜ôR&šgBL]ñxÐ,­VÇd9~ym¿Ý±®VénöýŽ|±8•XœZ,Në¢ä¸?éM'È›šÒ¸OKㆬ›æVVÇçß7W"¸cêÿ•PNÀÏŸ3¤v¢ ©Ë I­5IB€iºÖÊH9®FU_ŸÆâ²©Ž¢¦5±:‹4 ±Ø!8;¿jÔKäõ6uO\Ó”1@YáÕIG†k{ábí ›ƒæÞ}ðZ‹//殈A´] Ú®m—¡Ønò‰²ÂòY=™±NCÞ:Øà4ÂC°b4Žÿ×Ï7â¥Jñ4©¥³•i¸Ny ì}Ni'ö®—åõJÈscårå`NåÊ ˜E#ƒ=piæç{`‚ßa“þ~ÈC™C ä-÷m÷cîüª“)›Á]m¶Oæ72–c¢ä‘gn yý^¿k'8{a†L%‰%¸e¢ßîl‰ÌÒü^¹Ë·U`y;ÅVÎ<ˆQ úârj¿d*z ó&„éÕ0…_`JßÓ(§–…}|yzÑLï2êaÅîMáÊcŸõ¹›‡zN®dÄ|íH “ª ß™†[BžB}©äríŒWi‹·’[…(ñðVÝZ]ÎÖâÉ\™á݆ýŒZypã—³²»Û;—<º×Êô¼9r1ˆ#p…Ìô(/{?ë¿w øvÀ£r‡PŽ5S‡ƒàÅö0Œ¦ >‹1­8õ#(£L þ¥­m-–±ÛçÚfj©ÜÂz= ª- ê²Öš,þÔ³ ßüc]|ÎVNOEµÃÁN$ @1Êbþþ­pÚ¨ìô"ÈýÚbÇÑÃêêUµ¤D±…°@GhÄË^Âï$üSƒóè[^¶CúHí$ðÔ!;ZÃq¤c¨çU~»i Žrß}¤Œ­¦¦N:ÌŽÓìPñësi-]ZêÒ dá5™ìŠ=^Œ©^8s±y'­D­®RFƒº–2nu!çnõ;ƒZ%éîŽíhàtŸ©GudÕ(|"Aôrþ–#¨Šöiôrk«ß¿Ý„‹¬žñÈ™Ñji½?3ÒI­žYˆw·e½™’,5vd©±õŽÒ ¿$ÙdÕ ñˆŠbJl'Èš•ŒÉ@Þü¦£ßÜ^ìæu Hó#‰N™vßUðà£]·IjCîñ Œf¤^©hFO¥fcZ|£ö×ÖU‘Þ?»Õ@é¼×+YFµôò¡§ÙPGŒÊÅTÑ+Èsè…ÊËoìƒo207bvù-¿ëY Hb7Ò·™Ò‘Ñ¥©àü*Q÷G¢Ï@¸dPú9½’Qøð?À¯»â#d3ƒßIv3¸‘5Á‡àÿ_PKzƒ¬FPK8Aorg/hsqldb/TextTable.class­Wx×þŸ®ìiõ$ß œ…°a® ·[r@FXF’!àVÒ"­}º“oO´4§;‰Ó«Hâ8‰¥¸ ddž4ã8½÷â8qzov‚Mfv÷NwÇ*ðå â^™™7oÞÌ?óÞ>úÌý¸H\¨b3^ÀË*ч—só n^ÉÍ«¸yµJÍ­*^ƒ×òôu•¸ ¯Wñ¼‘§oâé›U¼oUð¶*¼ïPÄ;¹y—Š)àæÝ<}ÞË"·+xŸŠ0îàæýÜ|€7ù 7w²À‡|˜¥§™òÖþQ&LÁÇÜ¥â|Ü­¢÷¨¸YfFÁ}ÜBÅ!æQ®[qDÅQ̲í÷só3>ÉšdƒâåÇxt\ŧðiæ~†ÝñYŸãæ6<Ì£Ü<ÂÜÏ+xTÅZÜÀ¸ÿ"7_ àËÌüŠJ;~5€¯1ñ¦àë¼Û7¸ù¦‚o)ø¶€:¢eµôdfX¨í¹QÛ­µ&µÔhë@6c¤FÛIÂ0ûõÝzÆÔGÄ*ÃìH§Rúp–)þË”‘½BÁwÍ›“}Ú8©’Ý$‘éHj¦©›WDzÒ™ÑÖ1â µvÒžCš©·ók{µ”6ªgšòóöî–­ÞŽô©õDZÈeØÞ_`q‰ÞÝ4tª,qåì`Võ@V¾©W›Ô†’ºå‰ï)ø>AFÁ ~H!§ÿìÃ,lF›ÓêÊô„žêІÇÈœ˜ë&§{qí«àGÖV÷‘¦ží,ò{õhé|a¤Å-AÃìÔÍábÉJÒ´Q×FôŒ@]äôE–Á£s2!2{ø&ÖÐO”Í©ä>R[B8Ç1oŽâØŽ3ÌîÔˆ¾×:ýˆ}‹ÐŸNg)ÊÁ’stvö,(!åÍP”©g,†@Ÿ»‹h„>Ã̶^m÷z*;Mgôök‹¼yèF Xâl€ÄÕØ"щAn~ÌÍO¸¹7P4$~ŠÇ$~†Çü\âxBÁ/%~…_Kü¿•ø~¯àÄŸ–ºØ3¨ïÍZ¾ ôHü‘ø+þ&ñw\KH’øëÿ'2ObRâ)üKâß8I./RÖŸÞ#ñ4ž‘8Ei#­Â#…Wø¤ð …œ8wÌÁ±LzÃVŠKVâz)TQ%…Är‡PÈçHÝ©¬N©EÕRÔ £ˆs¤Š„Á«—”¥c×Þa}"KÑ¢Q–H±@,”¢N,’b1¶(b‰a:š8—)êÅR‰›”¢A,“È2#(ΓØÍ;5J±\¬àX\+±—<$VJÑD± û¥8ŸÜ Ç¢r¯ŸÜµ‹Qã蔢YD¸ið ®[ßÓ%E”͉ñRÿÀækú;ºh°±k]gW¿q‘bµh¥¤*:ÎJ~òX1Ùªâ•gQ˜¨^žŽ[g®ÀòyдÁHêýN’+¢ i†Jwjb2ËqÌìÒ¸Ëe•‰mFv¬¸LX5<ŸÌþ¤žÍŽYõ¬›ŠöˆS©‚¸iŸ Y ôâp®1¾e[\®I\6­¬ÚDÇuIcÀØÏÙbî£ÐŽ_3Aé¦wŒŒì¾­Zr’x‹"®7m¦§v¥)ƒÉhzr™ÙŒf¤ø¢º^™ó( ö½‡x¦«–ĬEŽKßäø‡^'u-³.™´½P3œL›záþ³§Á•õ(r$½ë!Ȧó…jQÑ =“IgZ»¸¥<Ôí~Cq*n¾öîn·“–¿% —G2˜yíྠM¯Ìh„š4”‚:cŒŽeÍV‡Ýn{b€Î8®ÙE¿9rÚV®ÏV:qÊZžW»À2ë=f«·¡±9c1û-AÒA¾'té7OjI³ì‘—?ú»:¡hrÏÒòšÐP–Lå>[VÄKCNÅ!Ò·@–!Q“Mo™LÓG@>ž—hÇ×§lã™ ¤W¨aò¬èâòY #ŸpÑ$ŸhÔÓ34îöð=d¿"hïúHÇár¦Û>¯ø-ä{c—Á'¥Sî:÷?Ëê{ŠkEyávù&p¢æ^¹ËêNh8=>ndKn†&× ^²íÜùAŠåô=¸™¾¸=ô£W2ø=”­~ÐêÐÞÑØA£xéhˆÆâ G ¢µ‡á‰zÃË/ê= ÿŒµ\ðÏY¢ž^âÄ?ß]û:\ï°ÑþÔ«Ñ (G°UTðÝ–ûQ •ú&’ðäP9EÒ¤l ÞêÕC¨Šæ û¢‰Ã¨m^Ñæ³É5Q^°”oçG°Í›{gª@˜(µm>Ñæ÷¬Qx²` ‹ë”°/‡…;™Â£º…}uJ‹ÛáÀ ø§±!ÌbIŽ#Üæû-â…aç¶UrW+·KII4\™coq·, ûgqžÓ§îF?-õ€â™F€wZNÒ±V„½caÞøV&fÑDÅÃ{|bÕvÏ8{¹©y`»—7Š EË1ö½/ºô0”òY NàQ4ÒèùäÉËQÂ)ìD@ÁNšP0¤`XÁˆBN"¨`×Â'‘X¯`ô$Tcâ$–Ч#‚¿ ¨°bÕäé"×÷Ä,;-äÃGßβ;)Ä•Ô_ÇѰbã]ãç`¯Qâä¾ÚŠ^ÒÆM S9Q¾Šw^ _±:/!cõmhØÇ‚u~›Îˆ Žñ±/ÃZt æ{5|Ï ¬`\úK"’ã‹f5¨ ŽèQ^LО(Xœ‚þüdX<迃c¢ø$h¾úZs¸ žÃ…½ ÐÐÀç¹ul5/rÀy€Hybcúb–™B€Ã¤ÌXÀ&*ðÉêjMé£Ç%_<|1]ÓÉ›O'úÊrØW‘ç9IWE§7>‹K6Ø—xÁ„öÊçY3!ñÄQ¬9V0‰lyÍ6Bˆ´»`Ö DV|qYØmŽHELC!<»/aOÔD°Ù{—,hÃû4–ÙÚ;('9$ãèGÌ=œ­qÎØè áÔxŒídwNñìžÍyÒ‹ŠP5÷üÔîèXI†^6…pôÚ –T[FçÐ>å쮂?< žµ¼pö;Š4ô›ê ÃŽc~vE—[„ÁÚ«¡° Õ•ç&õ9\­/€žÚ`# ^P°»Æ±»Âcxa!¸ÕVbÑâ‡õ¢BxöSx¸ï$žÛ;Ÿ8øÖná–#Xׯ]ŸCG°1‡ÎÚ®üh[œ„7äp%¶ÅmæÆ<3ØlIÄlž=É¡{.–P¨²C÷bW;6ý?ìØ¯½jnl›3/Á-Žq‚gpc<–ðÌ¢ÇkÕko<ÆõŸªpœûÞ äï«çñDýV|ÛþPK#Ô[U­ PK7Aorg/hsqldb/Token.classW [\W]—æÃ… ¯š&M ™!ÁÒhÒhC’† yAHk|ä2sn2ÌÐ;wbê«VãûYµ*Q#Ö¾ªTabƒ­D«ýþƒí—F÷º÷L˜i¿Ì÷±Ö9ûì}ÎÞûì³gxåöÕýx5‚AdÂÈÖ`f OBŽàò„ó„.ž$|„ðQÂÇ'|‚ðá“„§ Ÿ"|šp‘ðÂgu|."œÑñy_ˆ ‹Ã/Ö`3¾Dø2%_‰Èè«„¯qúuŽž©Á7ð;…g#ø6¾£ã»ĉ`—8úáû5²öŽ.Óò²ŽF$àyÂÏžÓñãZìñ'?¡;?Õñ3 µnöœ•s;“ÒÐ8rÖìf‹Z/_(vε3 ×/IéÓÒ‹ ggL[} ש¤ÞùÚNd3ç-ÇÏJ/- ï¯Ôr+uÌMožl‘ ƒòªMþ¤‚iˆK;ôX:¢ÇÔúAŇ?¢ø°âaŪ}¤Sz<ªøˆâ£Š)>®ø„â1ÅãŠO*žP|Jíÿ˜ç_ûºài™mA•Œ€–Øh±ÆªebABõ ð?ï¿£þ´RÏ—ªjËtB˜PCˆj ¡ŽPïí ,c!Jh 4šÍ„ÂFB+¡Ð^tçø r熸S%|õ6=~#ñØD5@Šoä¸GÖÅCrXœ$׈Ÿäˆ¸J®oɆ8L®ŸÉÕâ1yƒ8MŽŠßäqÜ(Þ“›$r³Ä@n‘0È%r«Cn“xÈíR|Ñ‹HÇpFÅÔ ÌWӅⲉIµÜ¨BÅâ’ÎbJEóªiY 7‰yýËèœÃ˜‹†@`^Ûy ]’¦{F¸ö6öÞÀJïîšóX–Á–•Ëx>½·€­§ûº<Ésx†ÜÕ?lpß@u{PLBóèèº,™‹öR;εml?µ€Óß¿„¶WÐSÀŽÐðäú5ÄÄ‹x».*ˆùÎè®vyªKè“yo•íâÖÚÂÿÒÊ¿)5¹ìÅx,úÁöÏ!î×–_ÿˆ¬=xIv)`÷œ\noWhñe±gί-e±çE¼SuX'7=qóœ:ÈOãè¼' ±  x×bIJkn`7ëa]ñèVÏoJ鹚/ø•¥D»(âA¾]C¹]x½]¸Ü.:‡­%/&eåË™%¯”’‚Ch¿ý:ä÷å”öâB:RFë-ìÔ1ù/B¯£º&ø‚·°M‡­¿Žà=-·Ð'6áPw8´=,U–ÀYU•i©ºj¶¸à^•Q©Ÿ˜σ±®þ‚Âò†.¡¾Cn¤×¿Ã^VÄöSþÒ^ïz_í-ó´ Û049V»…-âÜk" 㜜èŸ<Ž »c+×18x¨“§vÇ:eËz¹Áx§ Å1f£Ó]¬’“þ_=¦Á7Ö1£m Kè"ýƒzks¸Ž+à¿–×q íÿPK^Zé\dHPK7Aorg/hsqldb/Tokens.class„ ¼ecýÿ÷Zû²¾ÏZkÏì=Æã’{î·„öœ³çÌ6çœ}œ½Ï™3È¸ß k’$I’$I’$I’„$I’$I’$I’$I’¤ÿçû\öþœ1ýþ¿ÿëož÷ó<{ÝöZëóý|Ÿï>Ý÷Æmw …m«Si|k56ñ-ÕbZÈ«%m•õ?•4¾¡šhŸèLRMµ;KãoVó¤ZÕÎR9]ÿ)éR9S*gIål©œ#•s¥ržTΗÊR¹P*Iåb©\"•K¥r™T.—ÊR¹R*WIåjÉ“Ê5R¹V*×Iåz©Ü •¥r“Tn–Ê-R¹M*·Kå©`wIån©Ü#•{¥rŸTî—ÊRyP*Iåa©<"•G¥Z“ÊãRyB*OJå)©<-•g¤ò¬Tž“ÊóRyA*/Jå%©¼,•W¤òªT^“ÊëRyC’‚$±$%I6•¤"‰H’J’K2C’š$³$™-ÉIæJ2O’5%Y[’u$YO’ $ÙH’%Ù\’-%ÙZ’m%ÙN’í%ÙQ’$ÙE’]%Ù]’ù’ J²@’…’ì!ɰ$£’ŒI2.IW’II¦$ÙK’}$ÙW’ý$9@’ƒ$9D’Ã$9B’£$Y&ɱ’,—äxIN”ädIN‘äTINs­$gHr¦$gIr¶$çHr®$çIr¾$Hr¡$Ir±$—Hr©$—Ir¹$WHr¥$WIrµ$×H‚-\'Éõ’Ü ÉR­Kr³$·Hr›$·Kr‡$wJr—$wKr$÷JrŸ$÷Kò€$Jò$Kòˆ$Jò˜$Kò„$OJò”$OKòŒ$ÏJòœ$ÏKò‚$/Jò’$/KòŠ$¯Jòš$¯Kò†HA$)‰TDÿ/ÉEfˆÔDf‰Ì™#2WdžÈš"k‹¬#²žÈ"‰l,²©Èæ"[Šl-²­Èv"Û‹ì(²“È."»Šì.2_dPdÈB‘=D†EFEÆDÆEº"S"{‰ì#²¯È~"ˆ$rˆÈa"Gˆ%²LäX‘å"Ç‹œ(r²È)"§Šœ&r†È™"g‰œ-rŽÈ¹"牜/rÈ…"‰\,r‰È¥"—‰\.r…È•"W‰\-rȵ"׉\/rƒÈ"7‰Ü,r‹Èm"·‹Ü!r§È]"w‹Ü#r¯È}"÷‹< ò ÈC"‹<"ò¨Èc"‹%fXÒ§%}FªØò³bös€¤ÏIv†¤ÏKv¦˜C$}AÒÅ%éK’¾,æT1}EÌY’¾*æI_“ôuIqÀйH2ö¥b.“ …¼On”¬$YE2s£˜›$Ë%ÃÝ"æÉRÉns—d·Hv›d·‹¹[ Îë^1H†³~PÌCb–l–d÷I6[²9’Í•lž˜GÅà¤Öó„dkK¶Ž˜§%[Oò}Ä<#æYÉ“ìq1Ï‹yI²%ÛH2ÌÄéãÈ_“lSÉ6óº˜7$Û¯UI+’æ’δ&)6¸µ¤H¶­¤›Jº¥dÛI¶½¤ÛJ¶£d;I¶‹d¸ŒÛK¶»¤;IŠ[zRÒ’.”tL²ù’ŽKÚ•lPÒƒ$C?.&.ã’.“ sŽ•t¹¤ÇK~”äË$?Vòå’O”üdÉO“üÉO•ü ÉÏ”ü,ÉÏ‘ülÉÏ•ü<ÉÏ—üÉ/”ü"É/–üRÉ/‘ü2É/—ü ɯ”ü*Éoüjɯ‘üzɯ“ü&Éo–üZÉo”üIO•ô Éöô,Ɇ%•ôÉpØ]É×–|ÉqAΗßï…’âkŹ\!éU’^+)¾AœéÍ’Þ&)¾µ)Io—l/Éö‘l_Éö“ìÉpʇHv„dGI†ó=V²å’/飒ï!Ù‰’"Ù©’-Ùy’/Ù’](vt±d—Hv©d¸….—ì É®”ì*Ép#]#Ùµ’]'Ù ’]/ãNÉpçÜ-Ù=’Ý+Ùý’ážyP²‡${D2Ü/HuÉž’ 7Æ3’á–Àí{ûÉ^” wÅË’½"Ù«’á~x]ò‚doHu¶äÉsÉgH^“O¾”9’Ï•|žäkJ¾äI¾±ä›J¾¹äÛK¾£äÛJ¾ä»H¾“ä»J¾»dwèû2Ãw·µä¸-q«ã"Ÿ+ÙÃ’—¤ºªTçHu5©Î•êêR'Õ5¤º¦T×’êÚR}‹TבêºR]OªëKu©n(Õ¤úV©nœT7Ñp`†þgS 6ÓÿlžT·Ðp`†þgˤºURÝ:*”»Kó;QaÖðûŸ¸ÿVGí¿ìЭ:Ç/?|Ù¡;G…êÀ1ËŽ;~ÿeÇOîÔ »ÉÃÃQ!µÿ¶ÝfTHºÍq7<:èÿ]âþ÷3ÆÇèÉ|kich(*”@Øu®ÿ4G;­nk²éqÉÈH³;Þp“ºQAôŸöˆöÌDs¢»°=ÞÚ«ÑmµGÝŽ&‡ìŽæ7‡Zè1Úê.n6GíGç·ÐÛõÍÑÆø»›ù­îÒáæèPwaT¨‡ÛóÝ'ÛíáfcÔu¶u1‰å{Ä5š8Ùª6DZÕáVw‰½6Î@cPí:ÍÐèºF³5l÷£Öèë\ØwC£wT™ãÆ€½¾³ˆzSíl,r[±§Ø†îV¦Ýnvšníáaû¥ùvsÀ]´'FF}sd¤Õu»n¶Ü¶óGGíüܶ;Ýñ†½¦nh²9îÏ®=>n¿#m4;cºQ÷Ý ´'FÖ'q–cí1¿5¥NcdÌÁx3ÜXãíNÇmvb~Ó}tb¤¹t°Õñ{žÀNt£õ^ºÛnc—3ú}ƒv‹ëRGsAcb¸»g1ÚYÐY:4Þž›ö¡±†^`êÇ}jýŽ.ýHcÚœnksV™ÞÑéÚ“[z§ïw)šK»KÆšÓ¶5Ñѯ]lG§=î.É’awC¹s*kÃÝσÍþS©ÝÍ{ðok¤1ÚÃö™4½K`w0Ønv›~+£æRÞ"»¿Áæxs½“q·ôk˜©€›p¤5Š/BŸIý\«Ó»ER‹ÝÖ¨žÁ¶ÛK{b~8øqýòõ(–Œ6ìcÎfc`¡íÄьدU;‡õN×h-°§ÖÔ×Ljÿ]ÚœÒóÔq¿ åÞ}UmŽwºK'Ã~Òp»Ñ ­¶{?.Ðý·Ùr¯˜ãͦo´G\c¿eLà ÚPw5Ñ o»¡¦ûÚ†ð¼ëbCøÆº¾eoäÔ·ìÓ‡].Ä»yØßO “áų°=<èãöS-Ü]û.Ã7§hŒµÇÝw©¯×LÿláVówe _|hµ'ºöz´Fé­.ŽuemºÇÿ6‡ôƒ™kwìí3ƒÈžrê;&õd+Únè´÷»˜û÷hŒKu;mvË]¯áÆÝÈpcth¢1ä¾<Cî–nô¿8£¨[u{‚ ºN4‹ íɦ^àn®áÖ"÷~ÒÆÒñæÐ”=¦áQ÷<•ÃnX[îQ#ò/ÝP[ û™Åþ’Ž4ìÝVÖÖ”}Õáß骃Ë;Ò™>дgf;!”N’GZî6¿þ 1Òvþm-h5;n¼=81ì®ÐH{T߀:/ŠV§éíQ+»þLŒû{pÔ©˜mY%Â>F›‹í•mÛÓmºë4Šw~/w$£m' Ø=A¸ ýëbtÂË®6ôžÔ=C lˆ€—m{À½3š½øÍ){µ¡”}‰ÇA´ÝÝÜ^°Àž vlï~qÏb{tØé|{LCp'Ôô!޽½û¯öèÜɦ{r´1ÜëØÃsà‚ž1¨öH³ëïtP×ë*r¬9>`Åžq뽜º kwÅ>}ÏÚ½µ;~+µ>„³O´kqØá8$ „44`lÒ0îr¼=МðgÈ]ûž@—£ånglÒdŸð²Òû<áߦû2ì‹  }|쇆Æ5`›šFKüGA>P¨y´¾{ß5¾mvg¸=æb‡SS K–,ñ[ÀìE×¢Ùèú9¼’þ¿´q¼‰;|ÔR›ß=Ù^ä¯Ukh¡ß‚ªù ÆÄ¾‰õÊ´»n/Öûv¾¿s€{:x¡Œµ[þ !s‡Åmû;¿ÓlŒ{ÑÁ{±­ h›.ˆÓmôß¶3”:úû¢¬îtÂImŽ´†îÞíàinyÍí´GÜíŒáÎY ÙŒ>¸8E7¹ç°ØsØélxY£o4P7ÆGƒàtö÷gÙmŒûCÂ\EtºƒƒÍIV{èbCå‰ùýWQf¨Ýt(<zŒ#nfßRè—tºÍ·IÛô× ‡ÕmØ¥ê[ºkÿê.lº·„{gÓb»™ŽöÂûÍKizÂK/U®Ô€>úÏ|4è"ó:Q8j¿Ï^a=Êq{Ûmµ††üý„öˆ½ŒÚ¦ËöO4ý^Q0AÓÄh3ÐÚÓ áÄè¢ÑöâÐ=ÚìtýÜnËÝ“cƒ!TŸóÑ»’ˆW¼`úWºø–{Aö,@êÚîKÎ,—æ¦9Yqí%á>Zl¿Ô5š“~Ÿÿ[¼ÐŠnÏÅ­AÈÊü‰EþXŒàEHÝJ«»Ð÷uzç¨Mû–Çø’¦>"@m:‹¼“Ѱ_½KkŽdî©në‚wµ^ó4Ú½ÙÉÃíà­ôâ»P¸5‰8Ë… {N °´{²Ögܾú|»7\uÑFoË6úè„N‡·ãåBªo³óƆ':NÐq:Ç Áí} Æ¨fÞnS°·3\ÜžhÙ7^oÔ¾|Ä»}wæRÝ.*qÅTÜ•œßÝì6ňóõ}?ˆY¹oºÌÁ  \´µ ëÃ×^(K\´×P1Ô´BGƒKlGÌ\ŸCк1óÜ”.žŠùvÇkº)¡£#fm—hj`ngãH¯D1ëÙ=Í÷®ÿ†ˆBs*ŠÝ…b6°'9 f#gL]À·Éº6¦ÇæÞ¿ÃI‹Ù2*¬Æï¸0]ÌÖQaöŠƒn¸ëæ¬8â|©˜íœ1cÖ¬¹ï¿××ñ7-®‚Í“ˆÙÉß·óÛÃbvñŽ}8¼}V!êàîÎ÷ÜÁÍwY‹^o80Ÿ8±i?uŸŠ' ®.81 ÝeY¡ƒøÐþà4gÑÕŒ‹M'Œh¼eßâs(‹á ]ŸKé 8E3æ.—s±ý“èºkßËyôOz2| Œ¸Lù‹Ôë§½—?í0€oꚀŸ³¯OÜŒv1§Ó<»Ó3 ½Ë*Õ·»­Ø4?ˆƒB’/ª¹.[ rÔ3Rþ ÖZÙh/fs„·ÿ6]ÐñI„tö‹Y†ÑÓslÈ.´F—âäŽ÷ù¼ÞðÙ}ŽaL¡“ýÌqÄ0øà)_°é‡1{…N³§;Øj ¶ý=íRcj•ÄœéÓ # }wÌêeè¶:ÛÞV+öû‹r޽­z1˜ó|2``xBÇÏãÀ GÍ©–wû­Qï‡lFÀN]€¯ª ÙÁ=sqH¨¤‹¹ÄÍDÄë¼ØÐÒk«3õù£Öß: êäå6j‹¹Òîz¨ÝEû*/!Qû||!nuUÏ%b®±gKc}'ºÛÆÜàwï<ûì‹%<"ˆ ±‰›½¿›èzGŽÐA¾˜Û¼eWÆl{WÜî >d³1Ø7ø8¹¦T·÷ƒAãë¼ÓCü+F½{c²aw³¨wAð^Ôt6ÿzÃ+æ>7 =˜Š¹ßi£M·J—¥Ã\ä;Ü‚xùæÌô®zÄY]ÞßHcLÌcvšuáMo˜S>¤©©ÇîtCM¿#1OÚ×Nèe*æ){¥ÂX·9å.%$Îo¯¢®ÛG0##cxC<çpcÄ›b4œÊk@fo©Ý »µœ¬5¢—c‡¹¯å· pÇûigFÔÏß#äƒíA» í±^Ø5;’ÆÎíª%Öý§%»Ûöô|Dáò8&‹D€6Þr7™zW¾ÈczƒÔÈ%k¢)é¬zí{-Öä^¿Ûž–tÎ 3‚oé½·S„«®8Ão~ž}/¬0äßßéš.ºRÿî}â˜êü°¤ë¸@«/9]ÏÍn8Ç«gˆ0"ݨçÅ›ƒö²mì.¬&^¹îË…ǘnn¯`1ìOÌŒ!¦j Hºu°àƒÞ¶êS3‰CßÎ{bu´Nþ¬eõ>Ëxë›æ#Ûä,’¤»Z9ëù›6ÝÝ^’^÷´;:o%©7œŸ¤ƒÞá†ã@DÝuÇ·ûßÇ.¨ôÝî‹v ß¾—|Tí“Ö.7†ƒ]vùøjhúmMZfmu§SÎpÚN7m/çfmOØá>Î)»€@R§ÍM{ØK¶Ÿó´Íá’àÇ)øÂ‚Û£ºƒ÷äJ­½Ü—ã†'}öØ5ýæwÚé„×a'Ü{ëñvÜñbNúP¸ew¨kMºðar…ÅŸEßå×â´1Ùpëä¾íîO©îæ:®S]ºTw÷ñç”KÛe\˜Ñ°ìÓök#­áá–óó6ÑÓ[üÔ@¶Ó‘jÃÅ—“ntdÒšŽ/Á¸_±iŒúðrÊžöµÜ îh{q£…Ò­@ŒöÑEø·uŸ™tKhøw[—QÒÀ!„ãe» ãVR4R”ªË)C¤êœ[uðrô9¬†Ë áH}9¥ïºÛª;»Þmz¼±ØGî+äuw븕„ ›þ¶Ù|`»uÍûä{ñ¨f].¾5²] Z}KmáÈÀ¢ÙvNtmÒ´jåvi·Ór+ô«öÞ@/‹?§ßo¿ÁÞÀŒþ€Ë(×x¦K(Ϥ.·ZWï÷ì9ȯ9ýƒ+ÙøâfsÑ´—ôt©û^íL{™Y‡Ýñ÷4þ´{E4~ÐåpØ™ÜûͬW¬0£7ÝÐ(¿ÿðJÏú÷¹ÿto=yÇÓž-›½£½´r}ÚT×ç7>ºñùõVýö7èO«·Ffæ°wøÿS#ýsì/½øº7ûÌ>ø5†pGµF—Øé~aµ×ãŽÅ.uÀ³ÐðË7¦Üº·›vIƒ­n¹ÕïUª-·­¶[Ùêv[nABÇFZ~çô:—ê!Ëï_Ætl³½TÙƒ¶áB¢²¦Ýñ{A[âÍoîW¤=šnÿ¯ºyíý›Ù³*úÜͭ˘Ùï0v‚ÛræwÔÛ-FÚ ü–2nGÜF*]¿›y[âÞú¶{|ÒE3¶®ÓöÞ >²Õró;-óãÖ÷™o4¶õÕk][b—…¦]8w¶™Øf{£ÓôjìK6ÚCÛ8ãÙvÈ-ͰDŸ5ÝŽ9[›ÞÙôëœðH®Õ¶*ªoŽ^MåÄDË¥Ž&F[S¼‡:¥CÚoõþ¢ø›ÆæÑ½þ¦ÁU§Y/€C±ÕÑ gYhOØ}×”j¤µëlݪ-“VúÎÕ¿BÏÁ1{s«øa»_!­çâ±æ’iíûˆ²_ÎW>§£…ÓÚþ¨°½oÎ×-»*jÅa’–Mkûì¸a/ËDZ­P<­|!NÄÖO+|O\¿„Z{.ÂF}µâ'±Q­ŸÖöÅ:äj©?¥Òrj…Kì¼öŒ>­íÖ"Û©îÀ×U7§´ç38þa{—é´ŒZ᳸.½šjí¸oÖéEÖÚû9ÝvÛ=èWØÏ/v×õóÁ+\‰ÓiØÝ}Ò°B͵v_…¯Ë­B+}Q?Üô×äj;¤Å×J_ÒM¹‹zØäÒ—uÀ͹—8b+E'ÚZl¥ëtãj@¾ªS}¤òõàP”­ü5\c_—­x>;‚¯[ðAÃØýhs±6¿+:jï›pu´L[ÛßÄí-'kÇÍú‰¶Ýë·t,ÔkkÇ-ºi­QV¸U·âéÛp*®p[éÛzt.{¢x;$íMåÛ:ðÜÓ¼Ö¨}wà(Ûv+ßÅ6]·Ò8,ÿÔ~O§ØK}A“Úþ¾¶Ç\ y·Î°ã8b»Œ­pnÃ=š?Ôþ ÿî»W?:éÚ?•UÞÊ÷á\|¡·âqIzKÇÚq¿ëèö‚¥Ÿà¤¸â[ûÀݵBÑ·vÿtz·jšv?ˆCUùg¸Å§WkïC8ƒ±p[ÿ\"ÔóhÇÃ8l_®ø ‹¶\ñ;݃kÇ/±1[®ð(.G8ò_é€V…+<¦MwËý›èÕ†kÇ㸸^ѧ¹_!®=OàMHEâÚõ[»_'®OR‡=ÊßÙÍ„jqíÑâŠéãÚû{œœ¯W|:|Ì–kÏpACå¸ò3}¶;úc—X~ÖnЖ+þ 7¢[sWzÎNv5Öʶ£í«¤¸·ÅvˆöQ£NÅâÚ÷.›üi¸3„¥\u¥Åâ:9ëÍÅâ:¯9{eÅâ:¶¿f@¦‹k·Ö5õëŵç@=8*ûѾƒlÖf~ÛÞòÛ¬ÍpÿÉ=D+VëÀ¡šû˜V5®½‡iúk…ªqí?\Sgýªqí:ÂN^®ýGêõYYÕ¸eÏ—ÞhÇÑzYVR)®cË즋kÿ1.Ó5Ú³\ѱz§—k÷»õÛxSù¸Ž,wàòqí>Î^­ÊÇuàx{þ½òqí:¡×eËǵëD›þsåãÊ'yÖ rå“õ#ýZqízKôØÀ0ÏYy¹¸ŽÂ>¯ñ”‹ë”SmžÆ•‹+¿Ï¦uBŸöœæfØŠqåÓ]VHkÏè¡=Ÿ÷Û$ÑKDgڔИ{š>`gÚŠqųô4šîáþ Ýk(×->£¢qíúË yÓc3B#þƒÏ®­X"®ý°Û«®´t\?¢yû[%­Ÿ‚|Ôf`l!¹âùnÜ`kÇÇ4•ÒrÑQt…q'*0á¦WH®ºìŠŠ¤â't².å(À‚GvÌwâ+ǵü¼WV®pàñ;µßZJ®íOë§\)¹"¸éU“k‡pkç¢Ë4ga—z•Ô÷ w´Cøô²síýœM`ÐY_á:ÆCZ-ú¼íðÅçÚq¥ÍŒ9ù‚Ím¸úså«lþ£_®}_´9[®xµE[q®ø%Ý~XéÑŽk4óј´Oly¤vS^\Ô´û‡OûeçÚO.¡ì\ù«šVpK,y¥g[£¯Ù,ÇdÓ~7hÄÕŸ+~]±òE,ydc˜oØôƒ•t8òÄ—Ÿ+~Sí¿¯@W†'Ÿ1½]{aÏg¯¬]ÇàÔs.B×¾[u«¾]¦½4â¿ÕoköA«ÑnWgï_ßQ˯é w¨±w5éŠßÕy~ãðçi¿,]{¾§9 _–®|—nIËÒ¾oá:ß­Vß§+ý@ÉÖ§+Ý£Ô{¶~¨vÜU©+Þ«nÝW©+ý§mÎàD÷éÇm¡ºÒ•&ºþ»_g÷ÊÖµæ=²_{qÌÝV?Uû=­p]{œÖ®¬ú¼ÿ]¸®3š6cÅÂu/¿ÚJf„]ÀÙ¯¾’ᾂX¯ï Øáõ+®†] F¿ä*¢Gu¢«aWü•ž² hóé„f¸.¿Ö”„/cW~\“ZÉ® v¿_É®=Oè>m1»Òo]ÚÀ^Ì'­{võìÊÎã‡zvíyÊzf=/û9sß3eO;÷mË·”aíg¯¬Ô]Ç`óg®Pê®Ýpû«®´Ô]aýëo*u×?Y—íñ9=&W¶®øgÝÏô‚wí~ ¼kß_41­à]{_ÐÌG(x׎¿Z×Þp{{Ѻö0÷oêþú•ïÚõLÛ´ÊwíÔ6 òyåø]v±K+ä”öu«bm÷¾[j×»´0]i? <©6]ûö×%%÷Ñl9Žó@]a E£Úq†”“ö}°.×,Pñ‰ÑøÃ‹+ªa̰Ûäa66quâʇk²¼aÛ#l´à Ä•ì/C„ w”[<˜pÙéøh›¢¯ˆevõÃerãclJ^‹Å•Žu¹ô–;ÃwÛ ¹/׎媖¾P\ù8›ÂÕ:]¥ãõO Úã}w6mb/>ѶÝ#t’Néj4ë·-¾UxKö.˜þš‹jkµ þ½¤%©Ú>Cß;¡ÞN;Þ¯ï^aªö¨Û¶µ© ÐÏvÜM®V[ SµýA¤Eª pÙiÿO+jχl­V×UŸÅçh‚,¯jLJ]Gþ¹n¾þˆÖ„µü•;Ï M9‚—.,´Íó]$¹j×ÇtÔè¶i7§.ºW媺7„ÏÏÆŸpè“à1|ôÜÿU¨ãŸÔ.“ÕN˜ìú› ÿtàSšPX¡öOû/q¯%[Z«üéÀˆ6”/Õ4‡+°UüŒÖZåË,/éí.<çúgí»\“ýiíú\¿Ëg`ã+쎖„ }^s(½âgí 7½úgíøB蛸ʦ’l®5þ¢}ŽÚ&kl °â—l¥N¨Öõàƒn=<†—P÷«|­-ãpEÁÊðã9ÿ°Hû®Ó\Ä¿ìÃW§ý H;aÌg¯ì§?:›>ïÿ,HgÀ»¯²’_é|üÌ•Üúc9÷›!¥oè 6¼Õorµît¾iK|³vܬ„P_Kk1ì¢}|‹mÚ×ò­ö}=´ÍÖ j؇+Õ°ûÕøv»¥ùþ‡eOûeôÚßnzõîÚ¡Î]%¤í;õU?Ù…ïé˺¥)¢ø.[ `¿øõŒ~Ý£]ºÈ>f_?àê° ø'¾|_Q»/²V¼×-2ÛÖ5÷Pj­|Ÿ[æ¥jkí…w¯­X[­ýpñsV^s­£?±ïw[v­ø€E[y­øS}Áû„Zü ]Z õ×Úó3ù!=bõáÑk+bk?ÌùŒé¥¼Úû õb½Ò_í)_í”*ëð/íæ§×kÿ£ÖÙJ«XíºQ?¦Ûï|kϯÕu¹šoÅÇu‚z¦Þ›ó7ªGöj)=¡Ó]-¸âoÕÚQ9¸ö=©zä´àwj èç$Ú÷”_8ìý¢D;¯ËptøOëzž«&WüƒÃ°×gÔ©´ûÙ÷øºŸö´*ÈøYÕ¶+RŒÿ®Çd×Èâ—µûÍ%Ü:ôëY¸î\{_ѲëJÔµÿŸv†EáU5#áa†á1½ ]{_Óõ½ ·Í«Kð/M]"çߟhßtÍËÿ•)p±hYúLJûJv‘eؾqŠe #Ö+¶l׿‹‰UõOL)ÁŸÎä?É´Ô^•¢Q1rÝZíAߟÚܯýëSŠp¬3¦ÿ1*í…wÍèïQiWÕ–oÙ°¾8Ã÷þ*•vÍÔ$¢Æ~ 5›ìÒp]ß!ý¿9¥]³lç>*áOP)ÏÖ·€>Xz[·ûC_U³*ô·©´o޾üŸ§ÒŽÕÜ¢ÿÒ^1yqÝ^_4-êâ²ÿ}›âú®n`©¯1/n ©Œþ¯Ü´kC?Åß¿Åû¼Õ³¿¡‹ûMôKe‹›¸Š…ÞÞ´oSh=óVÜLÏ'üôM;6÷[ê·@ò¦ÀéÀ–úîXá7pÚ¿•f6¦ÿ N»·öû åcÅmzþ´¶õ;ïWtßæOƒ·¿?{_ T|»ßŽýaœvlïÏÓý6N{vð›¡râŽ~3>:+¾C3<ü#9íÜÉ’ÿÅšvíìçM»»øyt˜°¦«¬äGš:_:{e¿ÓÔ1-àžþKímPo¯0¢8ߟVøY§ö „#v¿Õ®AšæßÅf8ÛðkOí\à¿9úÁ§vÑçý¦¨énJÃ^çYŠ-˽ôyq˽b¦¢þ6oJóÓ|ki=÷T¯è¯¨opjú‚i6wΔ:õ˜ÍÁFµÈ{Jÿt3 ‘}wÇì6l·×·§?–‘†Í«õ×uSK}UìØmhPãßÌEØßYS†Õ_kv6DExáUx„îÔI{ ý!µ-ýÂ&¯>}Ô¦Qú`çñ¼ÿ5Ô¥KVØw?±QÜk…}O¿H{ÿM÷ÊTŠðà3§ÂŸh\Úm/jŽÿ‹ÿõ\~ðq/?ñàƒü8Ëu†Y~èV‡÷î£:`«£?`«–ÿƒþ ÷?î°‘ýÕtÍÇ}ôþËê ïY?ð˜åûM,>fùAØÆz+n£½ü ƒ—|6¥[Áç°•¹á%dW„q&Ã6Ù†/+Þ»³òqÿ׌VÙ{eÿû9ö‡ûwø˜cŽ<Žz한N±•]_vøñ»B÷7ÞdRùqÌAš%8TÏjÕß¼‡MZú@¿ÿGâóÝý8 ³«‡7€óÇvO©c#·6ÁWe?®×µÒMaNŽùIú»­9+™ÖÒ]ÎļÑc–ÑÔ´ÿIÝ|k“72©¦î“¸ˆ¸&®ÏÈ.eO:ÉŸËó¿æ/æùÓùòü¥êHž?£­?æÏæÕÑü•¼Ú®ŽåÕ=«ú{ð7ŸçÉ_ÐOapíÿûvÁ^ª¼Ú­N„Á›ëoé/_ÏîõOû£{Eû'æ„Ðñé@“~©¨VZq¥uHZOŸzjd르ÎH«‹â]µGC‹‘â]¶Ð†­«MÕº,­>Òb-`ZçÿwãæÕI\œüOzýþœ?Öü¿î2=q¼ê4§{Ì‘/;nÚEmpÄÁjgýe¤–êhZ¼ÓNôóú‹Š¦÷§ÑÜú‡ý‰ÿ[=.ïÛæ¿ËfzïÄçÜÆ‹ƒó·U=Ѱ Hû§­«+ü>›ö;÷âˆþÑ’âˆý¥²ûÛº,Û/ÛµQM´7týoH,lÿЂçágè³Þü‹oŒõ÷ÝøÐ}¾§= îê¸gAøâð_‰Á/7Á#^€í¿D<„ñ¿/¿LÜÿƒxð+Ä‹Àÿ$¿J<þñ(ø5â6øßÄcà׉÷ÿ‡xüqü_â‰ÂÜbx/ÇÄS…Õ‹Eâ%àñ^˜_&Þãâ}À ñ»0_ˆ÷Ÿ!^ N‰÷ÃüŒxpN|¸J| xñAà™Äƒkć`uâ.xñ¡˜¿ ñaàÙćƒW%Æû¹8‡øHðjÄGç ^xxñ1à5ˆ¯IünðZÄËÁk‡óy ññ_‡øðºÄ'aþzÄ'c|}â÷`|âS0¾!ñ{ÁŸ ~+ñûðù‰OÃø&ħc|Sâ3À›¿ó7'>ã[ã[Ÿ…ñ­ˆ?ˆñ­‰ÏÆø6ÄÂø¶Äç`ümÄÆøvÄç‚ßNüðöÄçw þ(xGâó±ýw ã;_Þ™øãà]ˆ/¿“øà]‰/ïFüIðîăğÂñÌ'¾<@üið ñ¥ø|“ø3àÄ—aþñg1¾ørp‹ø Ì߃øs_Ôç"ÞŸÅÿÄ7`þ»ˆ¿Žñ}‰o/%þx?â›Àû|ñÍà‰¿>ˆøðÁÄ·âx!¾ ã‡|ñíàÉ¿ƒÏA|øHâïbþQÄw‚&þxñ]àcˆ¿>–ønlÿÝÄ?/'¾ó#þ!øxâ{Á'ÿ|"ñ}ØÞIÄ?ŸL|?ø=Ä?ÁçO!~ü^⟂O%~ü>âŸO#~Û?øçà3ˆÆü÷ÿ|&ñ#àÿ|ñ£àÿ |6ñcàÿ|ñãàÿ|.ñàÿ|ñ“àÿ|>ñSàÿ|ñÓàÿ|!ñ3àOÿ×ï"âg1þIâ?/&~ü)â?ãó—?ñOÿ|)ñ ˜ÿâ¿bü2âÁŸ%þørâ—ÀŸ#þ;ø â—ÁŸ'þøJâWÀ_ þ'ø*âWÁ_$þøjâ×À_"þ7øâ×q~_îs¤ß×µ4þðWˆß_Gü_ðWéólïzâã_#†#-Þ@\ĸ׉K¿‘¸ŒñoWÀ7'ào øfbƒí}‹8ßBœaþ­Ä9˜ü|TÅüoÏÀøíÄ3Áä÷£æ“ßàÿ‹ä÷#øÿ"ùýþ¿H~?‚ÿ/’ßàÿ‹ä÷£9`òûÑj`òûÑ\0ùýþ¿H~?‚ß/’ßà÷‹ä÷£µÀä÷£µÁä÷#øý"ùý~¿H~?ZL~?ZL~?‚ß/’ß6“ßà÷‹ä÷#øý"ùý~¿H~?‚ß/’ß6“ß6“ßà÷‹ä÷£ÍÁä÷#øý"ùýhKŒ“ßà÷‹ä÷£­Áä÷#øý"ùý~¿H~?‚ß/’ß¶“ßà÷‹ä÷£íÁä÷#øý"ùýhG0ùýh'Ì'¿ÁßÉïGð÷EòûÑ;Áä÷#øý"ùýh7Œ“ßà÷‹ä÷#øý"ùý~¿H~?‚ß/’ßà÷‹ä÷#øý"ùý~¿H~?“ßà÷‹ä÷#øý"ùý~¿H~?‚ß/’߆±=òûüy‘ü~ÿ_$¿b>ùýþ¿H~?‚ÿ/’ßöÄ|òûü~‘ü~Œø»D~?F<]"¿_ŠÁäïcÄç%ò÷1âóùûñy‰ü}Œø»Dþ>¾Lþ>Fü]"_…Ï“¿—ÈßLj¿KäïcÄß%ò÷%¼KäçcÄÓ%òó1âóùùñy‰ü|Œø¼D~>F|^"?#/‘Ÿ—ÈÏLjÇKäçKxÿ•È¿—æÉ¯—ð¾+‘?º`òç%¼ßJäÇ£ 0ùñhL~䟣ý1Nþ9Æó["ÿ\Âû§D~¹ôv0ùãèPlüqt˜üqé˜O~¸´3˜üo ï“ùÝ’îŸüm ï‹ùÙèp0ùÙè0ùÙÞ%ò¯%¼JäW£c1N~µ„ç¿Dþ´Z"Z“-áù-‘ÿ,á}P"¿Yêbä/£åg©çKþ2:Lþ²¤÷ùÉÒÞ`ò¥wÉ/––‚É–ôû$?X:Lþ¯t0˜ü^t˜ü^t2˜ü^I¯7ù»Ò‘8?òsÑû0N~®´ Lþ­t,æ“_‹ÎÀ8ùµÒq`òg%½äÇJz|ä¿Jï“ß*½Lþª¤ÇC~ªt:˜üSô0ù§Ò™`òKÑY`òK¥âøÉEgcœüQé0ù¡Ò¹`ò?¥óÀäwJçƒÉßDúyö7'‚ÉßDçaÿäo¢bœüMé"0ù™ÒÅ`ò/ÑÇðyò/Ñ'ÿ]&ÿRú ˜üJIõ„üIIõ‡üHô 0ù‘’êùÒU`òÑ%8òѧ1N~£¤ïö—É_”ô}O~¢ôU0û=^ò¥ÀäJ7bÿìTÙ¨¾±?P}c úFþ t ˜ü@é60ÇÿªÿÛçøÿZ0Çÿz~ÿ—îÄ8Çû7bœâýÒ÷ÁßÌñý7Áß—~¦x¾ô#0Çïz>¿Ìñûí`ŠßKàø8^ÿ.˜âõø0̧x½ô˜ãó;ÁŸ—~¦x¼ôKlãï`œãï{0Îñ·žÇß÷9þ¾Lñwé 0ÅÛ¥'Á_ÿLñué÷ØÇÓzþOÿÌñôƒø<ÅÓ¥gÁ?—žS¼\zLñqé0ÅÃ¥Áÿ–^s¼û30Å»¥àx(¾-ýãÏþLñl þ¿Dñkéu0Ç«úýP¼Z‚Ÿ/S|=RX½Lñiþ½Lñiô+̧ø´ ¿^¦x4Â÷Q¦x4Â÷Q¦x4ú-˜âÑr ¦ø³ ?^¦x³Œx³Lñf~»Lñe„ï³Lñeô4æS|Yž ¦x² ?]¦ø±Œø±LñcôlÖ¢?‚)žŒðý—iý§ ÿ\¦x²Œx²Lñdþ¸Lñc~¸LñbyC0­×”áwË´>S†¿-ÓzL„û­Lñb~¶Ìñâó`Š£¿`>­¿”·Æ8Å‹îÏ2Å‹Ñ_Á´Þý ó)~Œp¿–i½%ú;Æ)žŒ”)ž,ï–i}¥¼˜ÖS"ÄëeŠ'ˈ¯ÊOÆk€iý¤¼;˜ÖKbÄ÷eŠ/Ë8Š'ãµ1Në#å`Z‰õû¡ø² Y¦õò"lo˜æë÷Cñe¼ ˜Ö?bÄóeŠ7cÄûeZÿ(ï ¦õŽ2üb™Ö7ÊðeŠ7ËðeŠ/ËKp<_Æð eZ¯(ï¦õ‰x 0Å›eÄ›eŠ7#Ä÷eZ(€íÓúC¼%Æ)þ,#þ,SüY>Lñfñf™âÍò‘`Š7ã­ÀoÆÛ`´~o ¦ø3~˜Öbø—2Ç£S`^?Ð÷­Dˆ¿ËŸ–Ÿ–)>öÁ|Z/ˆŸ—)^-#^-S¼éõ£õh?0ůÑA`ZˆôzR<éõ£õè0Å·ñ˜âÛH¯­DG9ÞE¼^¦x7:LëÑ»Áÿ‡ã¡ø7:Lëщ`Ї#=ZˆNS|!~/Óú@t*>Oñrt˜ÖʈgË/—?æøøt0ÅÇÑûÁ”ÿÎS¼}û§üùS`Ž—?Œù/ã/GçbœòýÑG0Nñsñh™âçñ™òûâ÷2ÇÓŸS<ëóHùýñ}™âëèSØ?å÷£KÁoÌñöåø<ÅÛâù2å÷£Ïƒ9þF<_¦ø;ú˜òû±ÞïGˆß˜߿ûçøü«`Îï_æüþ×Àœß¿Ìùý¯ƒ)~/ߦx½|3öÏùû›Àœ¿¿ó9ÿ-0çïoÅ|ŽßoÃ8Åïåï€9^Wæ|ý`Ê×—¿æüü]Ø>ççuœãwÄóeŠßˈoË”/ß æü;âù2Åï±¾?9~¿Lñ{|˜óï?Æö(ÿ^FüZ¦ø½ü30ç׿—9~ã¿—–9ŸþK0åÓË‚9~Wæøý10Çï¿Æö9~ãœ?ÿ ˜óç¿sþü0çÏÿæøþÏ`Οæü9âí2ÅûqLñ~< Lñ~¼ ˜âýXãGÊŸÇ«‚)þ5ž¤üy¼˜ü@¬ñ%åÏãÕÁäb8þ2˜óçÿsþü0çÏáÊœ?Ì~â_`ΟÔ9PæüùÀœ?ÿ7˜ýÆ`Ο« üy\“ÿ@ÇÜ2åÏãL~$.‚ÉÄ%0çÏá/*œ?¯€ÉŸÄ ˜êåbs>Ý€9Ÿž9ŸÿQá|:üG…óéU0çÓáG*œOŸ æ|:â çÓ×s>ý-`ò7ñ:`ª—‹×Ãö8¿¾˜óëb>ùŸ îß çÓ7Â8çÓ7s>}}0åÓ+«©.†?¨ªàþ¬ÿ‰·Ã8ùŸŠžùŸxLõnñ!`òCñÑ`ʯÇm0ù£xLùõx L~)þ8އòë1âé ù§ñh…òíñ8˜üTŒx»Bù÷¸ &_&#¯P½[¼=˜üV¼˜üV ¿S!¿#¾®P¾>†ÿ©p¾~g0ù¯x0ù¯~¨Bþ+ÞLþ+†ª°ÿj€ÉÅóqý(ŸbœüXÜS~?†?ª?‹‡ÀäÏ¢£ÁTï/³_ƒª_‹÷Óz@¼ÌþmLþ-žÓú@ ÿSa?‡x¿B~.†ªÐzA¤÷û»½Àäïbø ­Äû‚Éïňï+´ž#¾¯°ÿÛûcÿwÆÙÿA*ìÿà*äÿbÄÿZˆî“ŒïWh="F¼_!#Þ¯ÐúDŒx¿B~1>Lë1âÿ ùÇx9˜êßâãÀì'“ŸŒá—*´~Ÿfy˜üe|2˜êßâ÷àz‘ߌá*ä7ãSÁ´Þ¿Ìþó40ùÏøt0Õ¿Åï“ÏÓzHü0ùÓø,0Õ¿Åðò«ñÙ`ª‹á*ì_ϳý(˜ýëy`ö¯ç‚Ù¿~Lþ5†ß¨á/*ä_ãɿƂ©þ-þ˜ül ?R!?ÃTÈÏÆðª‹á—*äoãKÀäoãOƒÉ߯ð{ò·ñ¥`ò·1üJåôÊ=}€«œIüðYÄŸMü!ð9Äðo•s‰?>ø£àó‰á/+Ã_V.$þø"âO‚/&†«\Büið¥Äz~—|9ñçÀW|%ñÀW|5ñ—À×|-ñWÀ×ÃU®'†ÿªÜ@ ¿U¹‘øà›ˆ¿ ¾™~ªr ñ­àÛˆ¿ ¾þ©rñwÁwÃUî"þ>ønâ€ï!þ!ø^âï#†ß©ÜOüðÄð?•‰á*ÿü0ñ/Àÿü(ñ¯ÀÃÏT'þ ø âß‚Ÿ$þø)â߃Ÿ&þøâ?‚Ÿ%þø9â?ƒŸ'þ øâ¿‚_$þø%⿃_&þøâ‚_%þø5âƒ_'þø âÿVO }N"pL\—ˆËà qbN‰3pN\Ï ž ®×Á³ˆWÏ&^<‡ñp2—xuð<â5Àk#þMÖ&F|Ÿ¬C¼.x=bÄßÉÄˆç“ˆß Þ˜xð¦Äˆç“͉·oI¼xkâmÀÛ¿ ¼ñÛÁÛïÞ‘øàˆwïBüNð®Ä»w'n€ç€‰›àÄCà…Ä-ðÄ‹ÀÃÄðÉ(1üD2F¼'xœ¸îO€'‰ƒ§ˆ_&{ï Þ‡ø]à}‰—‚÷#F¼˜@| ø âƒÁ‡ >ŒøpðÄG‚"†ŸJ–>–øÝàåÄÇ'>|"ñIà“‰¿%§¿|*ñûÀ§Ÿ>ƒúŸþ'Ðÿ„ô?þ'¤ÿ ô?!ýO ÿ éýOHÿèBúŸ@ÿÒÿúŸþ'Ðÿ„ô?þ'¤ÿ ô?!ýO ÿ éýOHÿèBúŸ@ÿÒÿúŸþ'Ðÿ„ô?þ'¤ÿ ô?!ýO ÿ éýOHÿèBúŸ@ÿÒÿúŸþ'Ðÿ„ô?þ'¤ÿ ô?!ýO ÿ éýOHÿèBúŸ@ÿÒÿúŸþ'Ðÿ„ô?þ'¤ÿ ô?!ýO ÿ éýOHÿèBúŸ@ÿÒÿúŸþ'Ðÿ„ô?þ'¤ÿ ô?!ýO ÿ éýOHÿèBúŸ@ÿÒÿúŸþ'Ðÿ„ô?þ'¤ÿ ô?!ýO ÿ éýOHÿèBúŸ@ÿÒÿúŸþ'Ðÿ„ô?þ'¤ÿ ô?!ýO ÿ éýOHÿèBúŸ@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ…ô_ ÿBú/Ð!ýè¿þ ô_Hÿú/¤ÿýÒþ é¿@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿ é¿þÒý7¤ÿúoHÿ ôßþè¿!ý7ÐCúo ÿ†ôß@ÿSÒÿúŸ’þ§Ðÿ”ô?…þ§¤ÿ)ô?%ýO¡ÿ)é ýOIÿSèJúŸBÿSÒÿúŸ’þ§Ðÿ”ô?…þ§¤ÿ)ô?%ýO¡ÿ)é ýOIÿSèJúŸBÿSÒÿúŸ’þ§Ðÿ”ô?…þ§¤ÿ)ô?%ýO¡ÿ)é ýOIÿSèJúŸBÿSÒÿúŸ’þ§Ðÿ”ô?…þ§¤ÿ)ô?%ýO¡ÿ)é ýOIÿSèJúŸBÿSÒÿúŸ’þ§Ðÿ”ô?…þ§¤ÿ)ô?%ýO¡ÿ)é ýOIÿSèJúŸBÿSÒÿúŸ’þ§Ðÿ”ô?…þ§¤ÿ)ô?%ýO¡ÿ)é ýOIÿSèJúŸBÿSÒÿúŸ’þ§Ðÿ”ô?…þ§¤ÿ)ô?%ýO¡ÿ)é ýOIÿSèJúŸBÿSÒÿúŸ’þ§Ðÿ”ô?…þ§¤ÿ)ô?%ýO¡ÿ)é ýOIÿSèJúŸBÿSÒÿúŸ’þ§Ðÿ”ô?…þ§¤ÿ)ô?%ýO¡ÿ)é ýOIÿSèJúŸBÿSÒÿúŸ’þ§Ðÿ”ô?…þ§¤ÿ)ô?%ýO¡ÿ)é ýOIÿSèJúŸBÿSÒÿúŸ’þ§Ðÿ”ô?…þ§¤ÿ)ô?%ýO¡ÿ)é ýOIÿSèJúŸBÿSÒÿúŸ’þ§Ðÿ”ô?…þ§¤ÿ)ô?%ýO¡ÿ)é ýOIÿÓï榤ÿéwÁ¤ÿé÷À¤ÿé÷Á¤ÿéÀ¤ÿéÁ¤ÿéÀ¤ÿéÁ¤ÿéOÀ¤ÿéOÁ¤ÿéÏÀ¤ÿéÏÁ¤ÿé/À¤ÿé/Á¤ÿé¯À¤ÿé¯Á¤ÿéoÀ¤ÿéoÁ¤ÿéïÀ¤ÿéïÁ¤ÿéÀ¤ÿéÁ¤ÿéŸÀ¤ÿéŸÁ¤ÿé_À¤ÿé_Á¤ÿéßÀ¤ÿéßÁ¤ÿé?À¤ÿé?Á¤ÿé¿À¤ÿé¿Á¤ÿéÀ¤ÿé s3Òÿ,“þgE0éV“þg ˜ô?3`Òÿ,“þgU0é6LúŸÕÁ¤ÿÙ*`ÒÿlU0鶘ô?[LúŸ­&ýÏÖ“þgo“þgë‚Iÿ³õÁ¤ÿÙ†`Òÿì­`Òÿl0鶘ô?ÛLúŸm&ý϶“þgo“þgo“þg;€Iÿ³w€Iÿ³Á¤ÿÙ;Á¤ÿÙn`Òÿ¬&ýÏÀ¤ÿYLúŸ Iÿ³˜ô?[&ýÏFÀ¤ÿYLúŸí &ýÏ:`ÒÿlLúŸ-“þgKÀ¤ÿÙÞ`Òÿì]`Òÿl)˜ô?ÛLúŸ&ýÏ“þg‡‚Iÿ³ÃÁ¤ÿÙ‘`Òÿìh0év ˜ô?{7˜ô?;LúŸ&ýÏN“þgï“þgï“þgï“þg§ƒIÿ³÷ƒIÿ³€Iÿ³‚Iÿ³Iÿ³ƒIÿ³€Iÿ³‚Iÿ³Iÿ³ƒIÿ3èFúŸAÿ3Òÿ úŸ‘þgÐÿŒô?û ¶GúŸ}LúŸ}LúŸ}LúŸ}LúŸ}LúŸ} LúŸ}LúŸ}LúŸ}LúŸ} LúŸ}LúŸ}LúŸ}LúŸ} LúŸÝ &ýϾ &ýÏ ÿéýÏHÿ3èFúŸAÿ3Òÿ úŸ‘þgÐÿŒô?ƒþg¤ÿô?#ýÏ ÿéýÏHÿ3èFúŸAÿ3Òÿ þ?#ýÏ ÿéýÏHÿ3èFúŸAÿ3Òÿ úŸ‘þgÐÿŒô?ƒþg¤ÿô?#ýÏàÿ3Òÿ úŸ‘þgÐÿŒô?ƒþg¤ÿô?#ýÏ ÿéýÏHÿ3èFúŸAÿ3Òÿ úŸ‘þgÐÿŒô?ƒþg¤ÿô?'ýÏáÿsÒÿúŸ“þçÐÿœô?‡þç¤ÿ9ô?'ýÏ¡ÿ9éýÏIÿsèNúŸCÿsÒÿúŸ“þçÐÿœô?‡þç¤ÿ9ô?'ýÏ¡ÿ9éýÏIÿsèNúŸCÿsÒÿúŸ“þçÐÿœô?‡þç¤ÿ9ô?'ýÏ¡ÿ9éýÏIÿsèNúŸCÿsÒÿúŸ“þçÐÿœô?‡þç¤ÿ9ô?'ýÏ¡ÿ9éýÏIÿsøÿœô?‡þç¤ÿ9ô?'ýÏ¡ÿ9éýÏIÿsèNúŸCÿsÒÿúŸ“þçÐÿœô?‡þç¤ÿ9ô?'ýÏ¡ÿ9éýÏIÿsèNúŸÃÿç¤ÿ9ô?'ýÏ¡ÿ9éýÏIÿsèNúŸCÿsÒÿúŸ“þçÐÿœô?‡ÿÏIÿsøÿœô?‡ÿÏIÿsøÿœô?‡ÿÏIÿsøÿœô?‡ÿÏIÿsøÿœô?‡ÿÏIÿsøÿœô?‡ÿÏIÿsøÿœô?‡ÿÏIÿsøÿœô?‡ÿÏIÿsøÿœô?‡ÿÏIÿsøÿœô?‡ÿÏIÿsøÿœô?‡þç¤ÿ9ô?'ýÏ¡ÿ9éýÏIÿsøÿœô?‡ÿÏIÿsøÿœô?‡ÿÏIÿsøÿœô?‡þç¤ÿ9ô?'ýÏ¡ÿ9éýÏIÿsèNúŸCÿsÒÿúŸ“þçÐÿœô?‡þç¤ÿ9ô?'ýÏ¡ÿ9éýÏIÿsèNúŸCÿsÒÿü{8_Òÿüû`Òÿü`Òÿü‡`ÒÿüG`ÒÿüÇ`Òÿü'`Òÿü§`Òÿüg`Òÿüç`ÒÿúŸ“þç¿“þç¿“þç¿“þç¿“þç¿“þç¿“þç¿/ÌÓÿ}&´çéÿ:“ý÷ù³øwuý_ ²ÿþ9Þöÿ%ÿšB¤ÿ³Nøïß@õB„ÿW(”7ýV!úzAÿOò—ò¿ûám ÅB¬¹±oß\(î²F|E!¿±P²tÝ×a0Ê_Æ+…èõÂjQÁäÿÈ_ñŸëÖåÆByÞÍ…Êuv&ÿgþê›gÄ›Þ\HÂŒå¯ù«úC0:c Ý©Ÿòï•M)M›òzþ?eGLÐ)kc+8¹³`†7»§PÞì|¦×qCïlDϦžäo`+ÿíme5´Ù…Êð¡Ü5«Â%]ÿÙBIwµþ}ß.äKêÑÒoªß(ÄØï¬¥› 3k«V· íz9´fUBk•$´fKh­Zë Ï©õÆW«õ&Ì­™Ð\½–†æ¼ZškÔòÐ\³V ͵j3BsíÚÌÐ|K­šëÔ꡹nmVh®W[%4ׯÍÍ êñ‡B{ÃÚª¡¹QmNh¾µ¶Zhn\›š›ÔVÍMkóBs³Ú¡¹ymÍÐÜ¢¶VhnY[;4·ª½%4·®­šÛÔÖ Ímkë…æÛjë‡ævµ Bóíµ CsûÚF¡¹Cí­¡¹cmãÐ|Gm“ÐÜ©¶ihî\Û,4w©mšï¬mš»Ö¶ ÍÝj½;`÷ÚÖ¡Ù¨mšókÛ†æ@ím¡9XÛ.4›µ·‡æ‚Úö¡9TÛ!4Öv ÍVí¡¹Gm§Ð\TÛ94‡k»„æHí¡9ZÛ54ÛµÝBs¬¶{hîYk„æxm~hvj¡Ù­M†æDm04'kÍÐ\\[šSµ¡Ð\R[š{ÕZ¡¹wmÐܧ¶(4ßUÍ}k#¡¹´6šûÕÚ¡¹m,4¨íšÖÆCó Z'4®uCóÚDhZ[š‡Õ¦BóðÚ’Ð<¢¶WhYÛ;4ªíšG×ÞšËjû†æ1µ¥¡ylm¿Ð|wmÿÐ\^; 4«šÇ× Íj‡æ‰µCBó¤Ú¡¡yrí°Ð|OíðÐ<¥vDh¾·vdhžZ;*4ßW;:4O«- ÍÓkÇ„æµcCóýµw‡æ™µå¡ùÚq¡yVíøÐü`í„Ð<»vbh~¨vRhžS;94?\{Ohž[;%4?R{ohžW;54?Z{_hž_;-4?V;=4/¨Îí×£ËBûÂzáý¡ý‰záÌо¨^ø@h²^8+´/®>ÚŸªÎíKê…ÞKðÓõÂ9¡}i½ðáÐþL½pnh_V/|$´?[/œÚ—×  íÏÕ ç‡öõÂÇBûóõ¡}e½ðñÐþB½pah_U/|"´¿X/\ÚW× Ÿ í/Õ ‡ö5õ§BûËõÂ%¡}m½ðéÐþJ½pih_W/|&´¿Z/ô®çõõÂgCûkõÂå¡}C½ð¹Ðþz½pEhßX/|>´¿Q/\Ú7Õ _íoÖ W…öÍõÂCû[õÂÕ¡}K½ð¥Ð¾µ^¸&´o«¾Úß®® íÛë…¯„öwê…ëBûŽzá«¡ýÝzáúо³^øZh¯^¸!´ïª¾Ú߯n í»ë…o„öê…›BûžzᛡýÃzáæÐ¾·^øVhÿ¨^¸%´ï«n í× ·…öýõ·Cû'õÂí¡ý@½ðÐþi½pGh?X/|7´V/ÜÚÕ ß íŸ× w…öÃõÂ÷CûõÂÝ¡ýH½ðƒÐþe½pOh?Z/ü0´U/ÜÚÕ ? í_× ÷…öãõÂCû7õÂý¡ýD½ð“Ðþm½ð@h?Y/ü4´W/<ÚOÕ ? íß× …öÓÿ¯I»³ªì¢þîõNÑgÍÐÝ1tw·(ÆÈàÅîVìúøDÅÁ[P%T»[“D@º¿=|ÞuüçÝûÇÌÃÀ½çܳ _f÷ K³ûJ†¯²û*†eÙ}5Ã×Ùý†o²û†o³ûZ†ï²ûŸ ßg÷u ?d÷¿~Ìîë–g÷ ?e÷ ?g÷¿~Éî›~Íî›~Ëî[~Ïî[Vd÷m +³ûv†UÙ}Ãê쾓á쾋aMvßͰ6»ïaX—Ý÷2ü•Ý÷1¬ÿg/2¯ cØ(€áo!2lr6 ¹ [„<†­B>Ã6¡€a»PŽa‡Pža§Pa—P‘a·P‰aP™a¯P…aŸÐ‚@š …4E´(T¥åÕh¹BuZžPƒ–/Ô¤µhå„Ú´òBZ¡.­¢PVI¨O«,4 UÒ¡BcZ¡Ð„V$4¥UšÑª ÍiÕ…´BKZM¡­–PL«-´¦ÕÚÐê miõ„v´úB{Z¡­¡Ð‘ÖHèDk,t¦5ºÐš ]iÍ„n´æBwZ ¡­¥Ð“ÖJèE+zÓZ }hm„¾´¶B?Z;¡?­½0€ÖAHë( ¢uÓ: Ch]„¡´®Â0Z7a8­»0‚ÖCIë)@ë%Œ¢õ¤õ¢õFÓú Óú ‡Ð‡Ò ‡Ñ %´ý½àÿŸõþbœãý»È§ý“ách£…RÚÁÂXÚ!ÂD;Á¿C…q´Ã„#‰ŽÂQDáh¢“p m¬p,ÑE8Žè,OtN z'Ý„“ˆîÂÉDOᢗp*íHá4ÚQÂé´„3h' g}„³ˆ¾ÂÙÄíÂ9D?á\âŸ7+'m®þëãi§ç„óig … ‰AÂE´s„‹‰ÁÂ%´K„Ki— —C„ˉ;„+ˆ¡Âˆ;… ´Ë…ÿÄ+‰áÂDÚá*b„p51R¸†v­0‰v½p-q€píFázb”pmŠp#‘^»7 7é…| mª0™v›p+‘^âShé_{*í.á6"½øo§Ý#ÜA»O¸“xZ¸‹ÈÞÿj:þ…»‰ô¹‡(î¥="L£=*ÜGŒî'J…h3„iO‡ ÏÐf Ï Ó‰¹Â bžðm¶ð8íIá ÚSÂLZúsfé=›–þœ'iéÏyŠ–þœ§‰#„9Ä Â3DFx–'Ì%Ò{y‘ÞËói „´ç…爣…çi ……Ä1Â"âXáڋ‹ÄqÂKÄñÂbÚKÂË´ÅÂ+ÄkÂâuáUÚ+Âk´ôÛ^'ÒO 7ˆô³éMâ á-âMámZŠwho ï' ï' ïÓÞ> ½#|H¤UÑÞ>¦} |BûXø”ö‰ðíSásÚ2á âTáKÚ·ÂRâ4á+ÚÂ2Úrákâtáâ á[ÚÏÂwÄ™Â÷ÄYÂDúiû#‘~¦.§ý*üDœ+üLû]ø…¶Bðô§ðmð;m­°‚¶^XIŒVÑ6«i…?ˆó„5´ÂZâ|áOÚNamðm·°ž¶WØ@\ l¤íþ&‚°‰0a3c#a cca+cacSa;c3acsa'c ac±°›±¥°‡1}‚îel-ìcl“c[ÁÛ `TpAdT"A£² rOǨ‚|FÅ0*‘ £BÊ3*ž £ *2*‘ £ *3öª0*j aTÔõ G!c¡ˆQ)U•PQÁÕõ G F=ÃQ“Qaµ•P›QtÔ!r…ºD¾P¸P¨O” ‰‹…FD¡1¡è‚&ÄeBSBw#š¿ ͉ÍB ¢²Ð’¨"´"¡˜ ÐšPDB¢†Ð–¨%´#ê í ]þè@("¡#¡{]þèLèÆ@â ¡+¡݈‰Bwâ*¡qµÐ“¸FèELzÊXèC\'ô%núÊXèOÜ$ n·ƒˆÉÂ`"½`‡ÊeJÜ* #”¾0œPúÂâna$1M8€P¬Â(â~á@BQ  £‰‡„ƒ‰‡…Cå*J(Wá0bºPB(Jápâ1a ñ¸PJ(da,1SðZ¤\… ¡À„q„2¼)=ÁkÑÁk‘â Ž!ž¼)»Àk‘â ¼-¼)¡Àk‘r¼)‡ÀkÑ˂ע%©ī‚×¢ô+§ÿûz¡L¯EJðZ¤ä¯E ðZôžàµè}a<¡ïB ç Þ…0à]H ð.ô™p ñ¹p)ñ¥à]è Á»ÐRÁ» ¼ )”`ñà]è{Á» &¼ )®À»ÐOÂ5„ &¿Þ…”)p±Rð.´J¸X-xÚ$xÚ.xRXÀ-ÄVa2±Mð.´K˜B(F`*¡äïBʸ˜/ÜA|-xR‚w¡-‚÷¥'xÿùF¸—P³Â4â^Áûâ1¼ÿ|%<À…s„‡ÓÇÔÃŒyÂ#Œé3ëQÆa:-ý°›Á˜>™c¬(<ÎXIx‚1}äÌdL9³ÓGÎlÆô‘óä¿ñc¡ð4c‘0‡±ªð cuáYÆý©Å˜›a˜¸ó„ÜdäËå21)_šÉ)(Íäæ–fò’¼ÒL~R©4S$¥™$/©ég~RègARÃÏrI-?Ë'õü¬Ô÷³bÒÙÏJIG?+']ü¬’´ô3Iºûɤ‡Ÿ…Éh?‹’1~VMJý¬–ágõä(?k$ÇûY39ÙÏZÉ ~ÖNÆûY'¹ÀϺɅ~ÖK.ó³~r¹Ÿ ’ ~6d˜ì£í>3\í£ ÃM>š2LõÑŒa’æ Ó|´`¸ÇGK†û|´b˜á£˜a–Ö s}´aXì£-Ã"íÞðÑžáÞöÑ‘á=–ùḛ̀ÜG† >º2ìòÑa¯î4øèAó×3éI«ì£­ìÅìM«î£­ìîK+{=ûÑÊ^Ðþ´&>Њ} ¤µöQö¯>ÓÊ^á!´®>†ÒºùFëåc8­´þ¥£bŸ:ÅK¦‡¢ù!·¸N×…˜?v’ÙÌ}ë’¼²÷œ6Øßt†9þ¶'#ËÞ÷+ý}g˜ío<ÃÎÒXä½ü;‹¬¤$“S¸¤$“[8®$“W8¥$“_øRI¦ ÈÊ—,Às‹ñ¼_‹°pA(??xâ™s!Ýþž9…ž9…Áž9…Až9…až9…áž9…ž9…¡ž9…ž9Ë0Oÿ-¨bÀžÆKó+™íÕBøPKþt/bHùPK7A#org/hsqldb/TransactionManager.classSMsAí 01"˜ ÆhŒ ѸU^9QK´6¡9˜Cjviaã~¹3ÁÿæÁà²ìYp­Tyzóz^÷ëšîùùëûxZNòðšÁúyGßgÀ [ºï É=9äÎ5fH òí¡’D”1ȶ‡º×l6õÑùpÙ;m¶lĬõ±» ½Ó· öÆ(ß9¾É}½1lÉÇ djõ3E>µÐA‰MKھǠ[;÷ñ6_‘©õQ 7’±7\Šôüo £¾šUlÌL O`(ç&—ÿa`(l!µî Ñ“}釩 é…LÛÞÜïäF¿¾ä]*Úˆ²K‰ìŠkì¦ÖˆÔÛJ=¹'xl˜·8%òƒã­£¦ êúƒjªøLÝ•,ßum¹dóžH]$u°˜«`P¡]H$ÓÆÉÐwÔ"ÐlÑR'B¨@. è:ƒrbÀCÔ•ýŸrJvLn}apg~œ?wièó)¾íIZÅÔVÕ¬*"½³å¸á}öÕÒ–BçÖGó ­Ù+!ºþÿJßOîØâ²Í=>Æfyŧ\sè³h³j9ú¡°Fß.UÈ@–Øzô Ï'xø­ß ¾¹¢¿½¢ßZÒ—³ô–P ܆’¸«° …÷`Wá^ŒU¸ã…a_á£øþ+|‡ ŸÆxëžÅºç1¾€šÂzŒÇðRá«~PKb®§#ÇPK7A&org/hsqldb/TransactionManager2PL.class¥X xTÕþofy3“ $a2“Aš eb"˜D@¨ÊKæ™ Îæ{/lmµ‹µ»­­]bm«V›.Úš6ŶBµ•Ö¶v¯Ý÷Öîû¦Eâ9oÞlÉb ïÞ{ιçžýœáÉ“< `­èö!‚—z±/óâå¸Ñ‡›ð >¾’?¯âÏ«}¸¯aº[|t|-^çÅëñþ¼‘?oòá͸•?oáoõá6¼ogâÛ¼Ã?ÞɇwñçÝL0ÂwøðÜÉ»÷2â}¼{¿wánîÁxw¯÷რF}XŽñáVþ|˜ >Âôõóûùó>Æo}¼bLÁ'øðIþŒ3d‚eÌðñ!Þ=ìÃ<ˆOy±Ÿöà3><Š£ 9Ƭ?Ëê<æ£Ýã>|Ÿg=áÃq|±_ôáI|‰eü2 ÿÖå)Þ}•?_SðußPðM÷ºX2fnXìJéƒ-CÆ ñhËfÕTûUCkoÜ!àìHE5¢ÔÌKã©~5Þ1¤&µ¾XB3L5‘p;<1£{GOê€avsttøéjŸ®& uÀŒ¥’©¤©§âY„°Fyl©H½ša¶=Â"ÍH%ÒqÍÔ6ZWèÅ…e‰™¶&­kiU×:R‰DÌ<Ý{Þ€EY$’@U¯©\ß­¦ûÔþ¸¦à[ ¾M“œñ~BХܶWݯ¥S±¤I!0'Þh3š›lWu3¦’šòjv6î ð¤@¡;j4ºY+¨+°½ìb˜%g „<Ó¾'Ò8”åØn…Äw<­à» ¾—}3’44Ý̽yíÿðfZÓ˜a¶lÏ®ZÒì5SzY¹ÈSÊ€šìÑÔ¨@è´oñ­]Û=“;-ÜüÒØŠ$¯K ¬–“±CÒ¢Ûú÷i¦8~]K¤ökÓ®W÷kƒ±dIxTZ œ¥šO+=E“©%ÈÖCóŠn÷hÆp‚²mŽ–Œ=!q¾/ñüPÁ$~ŒŸ(ø©ÄÏðs‰_à—¿Â¯%žÁoüVâwØ&q%vHü»$þ€mä\‰?âOÆ_$þŠ¿)ø»Ä?Ð'ñOüKâßxNÁ ‰çù™“Lx»(yÊE‹Ä¤€BTHá „“. —p+B‘ÂÃ/s@T Ÿ¨T„”¢JÌQÄ\’MTK1OÌWÄ>ÔúûÔýjKœjJK$ijƒš.…Ÿµ¢FŠ…¤‹XDÚ‰€X,ÅQ'E½8CŠ¥¤•h`g’¹J唸V,“b¹X!ÅYb¥«DPbP4Ja s)šD³«E‹g‹5 ’ÃñxCÌŠø†¬Í±VŠsĹRœÇt­d9q>Kr¸PmR´³lëÄzElâ">\,6*b“b³[Ä%R\*¶JÁRtâ —±UŠ“¦àän5©’ök·w ,?% ×2Ž´úSR‘V{º ƵC› Xßž:ÀiK©2=f)Ö§¦·@ŪÙÕSÙZÅœbÙµ[åOÙŽBÏ—“ì›yÙ—”I"IL3"I8j7½‡Œ®T^Ú`c¹œðÅ‹¨jÊÓ(æÁnjT«·«ÁòM0˜5õ°‹· ¤’úN Þ¢š©Dl e£µt¥’ƒÄpåì(ɦ¤ ¥Õ‚læõqh,HjÍiÏÏͺ¾"¨'W«ý)½´• *‹Uz.—»¨ô œQ¬x<Öß²•¶u]=Äx’¸îTxŒØaò¡‡Äµ d¥`cÙØóÐc¦Ö•âžéÝYØËH2IqW Šõå'Z£¥G£=©dr³ÈóX‘ßµ+‚ÌÔþp âÖ²Ð,˜n Uä‚uÝÙ)aÆA‚"¥Ên-6e¸,e3YÝp^i°\ïNfåR¨}¤{98–NuÝ6=ªéZt«j A{i‘˜N àˆk*¥MM‘®EŠæ“ç2 ¼ò‰i#Ë'fþæ#7åù“¯OÕ€c³vÃ0‹E3áÈEÁ¾NaÈüD4•Ìfp¢Ç)Ƕ§HÕe§'8+ع»ñ´ÓÎL³v'ÇaUBÓµžü¤,O:U1N€ÊܰkéÞ8»¡.; ÒÜÖkÕö2úf7}nâ3ë©— ,¹ìóéçé±’lMÔ¶-ÛÊ'ú,ݵxU³²«ìÍiê_3)P[×t=¥·lá/T}8iR–ÙÇ5ÁH‘޽¦£NTè=6ùÁ-mó¦§X¶|W3JšHµYüƒ®õjpí4¦Mä…awwéD™ÇPi SSLÇâÅM­Ê (M¨ùÎ^R*z‹qSJEoé=þíšMë›ÕFNˆà>JÌg°„«@öb‰²qkx‰e—÷$V W‹ç°äJ×TêÚ¼’pYfÚ&çUMÓA;’¢ÞØV¦T¢ªn{ÛttŒäãl´Ã6´[kV‡ém/÷æ]t#½ÍÖSé3Ʊ”ÞiؔݟIûeǰœM’ÁŠV· Îà¬:çÞ{´Ï°3šÁÊ6§ Ví|*ö» W?–—£'±Ü©@ç¨?o‡¥$ {›T&Ì^ÚZÛ¡þål?MÄ•´Þg{¹Íe»½Õ]çwßç˜ß팶*~¥în¸üŠå^OÀó´€g#¸ÚZ‰Ø=Š+xjó¼Ç±ˆ÷á€'ƒ&Ç4;q «³"  }FœÓÆU1œa¹‚2<3j>úÖÙµf‰Ù~–MÉú0•×öÐUãXçÜ;uá+i{‹*Ëv8Ü”ÁzòᘴtÜ­ÖepñíwZ¹³‘©6usÖ4M £é8*íd 1jó†ú,É–™-#ð’Q*åäìK‹Š’3W”œT¨&ç&HŠ‹)ixM»y¡«áö¶ž@=U$gÄ®H‡ÊØ"gË&‹gg ð‘ÙœšlN ™ÃaGþftêÍZÚ>ËÕžÖÛð_üÞPKúXûW ÷PK7A)org/hsqldb/TransactionManagerCommon.class¥X |TÕÕ?'³¼™7/! 0@0dQÔ AÐÅ”#àÂ$yÂàdg&,jëgÅRk­µE+Ô*R5­[Eà nX7ÔjµîµµVÛjÕ.ÚÅ" ¦ÿsßËl¿æ÷˻۹g?çž3Ï|vÿÃD4•?ÕérzG£ßëTDïxiýAf”Ù»½§“fmÿI£÷uÒéY|(Ÿ?kôJ¬ã¿jô7[‹äó±N×Ñßåþ?tú'ýK£Odûß: §}^ZDŸÊÙ~þ£SíÓ¨W§ÃhŸÐ8 ŸÏ4êó21iìðÒDvâ"»tÌܲÔäã‘¥×Ç:û46d§ØË%ANgÈÞLOä“ä ^>³äÓ ŸÙ2G>'ë<—çÉÞ|Y.j§È²Q>M²\( ‹dvª—®æÓ¼¼˜›eÙãñŸÎ­ò9C‚¥"õ2ù,×øLºèáé,=Kfgûø^!ð!Ù;[>m°*Ÿâº¸Ïú“U»(µCg“Ï´+Eÿ5¢8—Æ«tójÏcòt„’¡¶PÂdò7Æâ+kV%Ît´Õ̶·§3é‘X[³™H„cQ¦òl {0Zr}S¬ÃŒ€æ|¦Aí¸‰­\ê4ɤƠ4—d‡É˜šñ†H(‘0L—g#ík EC+Íøøþ5¨8#±vð|tãêÐÚPMW2©iEÛ»âq3š¬‘ÃDÍbóx(š\l†:Zãá¤Ùˆ}\ö®ë_h A¼é3¦_áølÔHx­Ù˜D¨= …´„;ÍD2Ô¹ÂÈ–-n«iŒEWÎ6Ïïü+¡ÛP¤aU(ºÒLßbª,ÌP(ë ·×Ô«Aðm …Øk^ÀTšÌðÕëŠ&a˜6b¦“Ãó™œJ¬j ­þ,²Û°ãòa›º"Éðé¡H—™¹eÄcëêM¬™+¤„SÌ ™ eãÅâr#1;œš`“û„p4œœÉ䨜t:| ~Í%ÌdK¶d°Q î7¼²ƒÎ—›ÅÍÉPûy ×"Øǰ»ÆŒ'࣠±ÎÎ0”,ˆ`¹e\³¨mµÙžœÈH~H`øÜp4 'ÌűuPÒäCÆ2™àYƒ`DªÒø|d48M§_ Tha˜Î’ô`¸D.r—*d‡€¢ †‚¢,j®Op/VܾÊl?o6ÄŠÎÚ‚¸ó`Q¼ÃŒ›âÍfrú¤eÓ|¡=6Ìh‡åa-§62 +xª¥ÍÇ™<;BåŽ7áE¶[Ö"”„8¶Ù˦pGŽúÊqÔBøtØ„ _a­æì%CI³¡ 5Nd…£+í+ Y±hSyêÿ9L6¨+š‡¡ÌÚ‘PÎÚqW8”Œ,t<«B […cVšÉ“ÃñD²ñ é¾Åý©Až$°ÊI9ÔÒÇÓ5ÆËÑ¥ñZ×Ð í• ºng:êKçlƒ®¡k ú>¯Ç‡¶"Y,5ôºÓ¡ea0Ä ú!Ý`ÐMtÓÐÂÙÔ íô#¨é‹ò§A7Ó-}›®Žo7ø¾Pã‹ þ •ilÖõ,%ÛÆi:½¡Á oÒÂÔÅÿm3øþòöÜ›*Þ0æsbð¥ô˜ÁySÅçk|™Á_çMCÌU^ÈÄ_Îß4ø aò[|¥Áßæ« þ_mðwé1¿r¼Pîeƒ¯ák5þ¾Á×ÑO ÞÂ[ þ_¯ñ ¾o4xߟ1x;_oðøfƒoá[ îeþ˜’kyqç9ëÛÍ5G·1¸"eјvõ&Œ97FÖøƒïä» þ)=eðÝb[©[ãßÃ÷"‡ÜÃ; N O»øBD\&Ÿf¸w|?<†U>Èiü°ºtÆ¢ÁðÏ zœžÏ“? Êü?®ñ?É{ ~Š®B’3øi~Æ ×èuAösƒŸFžãg4þ…ÁÏó = ÎéòyU>ω ¿¨ù%_6øpDÏÓ ¿Êü¿nÐËôŠA/ è¯Doð¯ þ ¿iðoù-gðÛü–Áï€Iý=ršÁÀ=þ#¿kð{‚á;´Ù “è=£‘úþ÷~N<óâ÷ þ€?ÔøÏÿ…ÿ m ¹Ù¾”ÿfðGü±Æ7øüOƒÿ%ú=üsP^ôXTãO þ7¿ŽÜ“ÿºi¼/ÇÁÓôÿ¡@Ìñƒ–U¨Œ$û¢(úœö½/rn$¥s>^À¼´2?iÆ‘ªðöù—.Ú‹–£VväË4*?‹aZ‡6XyûÄÊIÿcÙì¬TÅ…3¾ÀTÕÄüÜÔiŠcÔ(÷`r™ÖXQ9Rþã”®éù`ºBåÉ‚o’êèh ‰HÂJ )|ò-+€ ÍÚËGòjÛ^–ÜÖà üÉ kp›gáyÀÆ PµŠÐ@-ŠZì@%ÞN³3ßÓÀ‡óŒì®Œ ¬ã³ì¢¶æTk„)šJ˜™Sc‰Ü÷à àL*,›TqC…QGÚ']I˧‡æ(CöfYMdy¡}T]ªzhkˆEº:!±/a9§h:¯+iΜH¿ ), ¿”¢dhá»°h¨cuj”XÛ’ d÷D¹åU†óÂ…?ʳxn3z@•-àÇŽÕ&h·{ƒ­bs DÙ|ÒV~âV­ï…ÓÖ'ÆÁ¡¼ióì’än´éÊG²r£:”.ó ‡p\ h Å£(`ç¬U©¨ª2KkÍÉ8N¦7ÈVTª¾Üòü¬tæUÕ¢¦"O·¹Ý#¼ºÍJ·‡~f²³;ްZ+­$¬•t˜Sq¶FF‹LK†«ât“Ö²•…û²|C‰yí–,–þáh{\É^í˜+©gкœ® Q Îë¢j*@d_PV´” ……ˆ¿r €dÅ’p" )7×Ê/=%v°Jïö0Ï…šsó\¨9ïf©m¡,û-ÜÚ Õt ׯ‚ßô[C^èÄɱ¸<4b…I‡úsÒÄB’ÒNi¨-Oæ´€þ|êÊÿ¶*ä—À‘Üúu\Ý Q] µØR½.„_³D="ò«ˆ+"m):|wP¹lÉšÙ±uQÕ¹‚õþÄJLvÔ„Žò-œ˜Ó¹&¹A=ËàÀÕ1CˆuO" ì¬TÇ׳>ñFWd'1­D#8Ü <ÈÀÑ>Ùºl>?2?º6£¢€“m^ÚÜ2§éœæ†ysšêÏ™×|ZãÂú¦9`ì¨l^À²)ä9Á3´Py¢3ª†òÊ‚Ž ‡âe‹¢ÑÌš.@W€Ô!º•{­4} ©i0—¥»ÜÐÉ=„EÂé:oä@4Y2нd¢6]¿ŠÚLíR jÓ7KäI‹D2ùiX^ìeJÍ!+s~®kVß ŒNÔoÁ0k‡™#_¥{ ü.ù9æàCch]ND%øGãKò÷-ºRè¡ÕˆD×еjDû¯F´ùjDï®Æi›o²ï¡aW#r|Y>¢ÒáÒÌ`= ÿ·ÑíØ¿³¥äÂŒ¨©jqÕT´t9v’³ªª‡œ)rí$7v5ìzv’S}©¾‹|;ɨX16Jp6h'•b:Ó!;©lYwÒ]ÖÈBD/ñÂQÀ\¾œ;0ºSä—åí]ÿ"Å0Ñ{>§Þ uÞHúà’®ûhØžQ·a¹MA`áÿü áKØE#Nƽ`LѨÖnoöÑè¼£AÐaöÑ9207R46Eã&cZ,Bâtò#tøNoñ ¸ÀleŠ&Õºe·ªN h{i¸ÌƒWŠª»i²“¡)8ÁfM¹…6ùÝ¢'šg+Ô‰ÿÑø?ÚÞ›¤G)ð€–¢©0õÑÝ4 ñNªë¦²:¨¸‡N2#àIÑÌNîþ죊¨ÄÞÚΙÇ3w@õ¯ÓÈ7‡ò®¤é¶ê§Ri/9¸—õ  pgUyù 0ï§Qû©hü,RûhÐ~r•Ètní¢ûlÓ¬‚i ì¼UQëö»ýÎíôZµß­¤„ú•’Oòl£e2‡ƒ¯úͪó<»©H[Zç}Ô>-•SÑhuŠf·¼u“Êò>Ð÷<^øaÏž|{ÔE÷6:S&'o¥–€æÜI'+Ê)š‹xƉ²¬’⚸ƒ–ãµ ¨ñˆ´ ºÉUçÙè†*w›fÐ:¢žAg©q­ ÕWSD›h ½ Ÿ¹ž^R£¥à¹äF ¡`vktÿø÷~Òæ«Á7¡—Æ@é}4œ<ÐèAÆà%<´Ÿ` É #x¬d´×ÖzÔïªÕüp›ídœ~MérŠ¸Þ€w/.s+>fÊ4(n“%¹ÂáØ€wiþhÀ@™ßЕò}¡æ”°U¼hIç€ò9Ô¡FKÈi¤õ’“ÐJÈåZùI·ÄqZòX'_„Ú±4K¨Gèg¶P' õy1Ž­P29UÀ¤EŠ@X øxwGš®—ŠD¹pT,¥ÇlLå`TbÙc¥¨Sî´“àãô„ ÑZnŒ3¤)jšigµ~ÄÌÂGhQ«ZâïÔ-ärÜQpÁ-OÛ*s‰»¾w¤)#çò1âh4$†U-á§'m‚+l‚Óó s ‚È­j‹3Ô^)Hmd6µ½ô”•W[ªä!@Þ¬ÝH†Œ¥yL0ké¡%{ÓÓÓoÈ즨µ©úá­YoN\œÑÏsÅVòõ'vðï¨uù]Õo§ÑØDJvMMÑÒà-äuÖ:»É»Ñ¶ßö; \‚ÜJn—-·;àî¡e[ì«GÊJø±R¸µ9²Z¢vù}tæ– =9ªÏ’ÏÙöŽ$ OÿäÙ³š:‰³èkmRãUô¾?¦ÿÈÈ.ÖÔÚRö2˜t½—J5z± /w1„Ê^Ìzi,lÐKå=ó) –í>ÈÑÊO+wÇëE?ï7 ÿt`¬Fϱµ;c”Ò{?ÿ+2^î&P"ýlÅ›x¨>“óhû^5^çA¥rd êò…*«LFH&'£B²Ê£È=Ôy«e™„©$´¥vÈ=Ie7¶X0!ÑV€” HLBo7­aßÀì|&ûVð–¾÷2ºûÞPùé Ðo](o§s ‚Ç·¨ü›ÈðtRž&O ÿž`¿!tUÐZ¶ÅV2üt™#“%kiP1¼LC B£#4úe/S±Š‡éÅ}T GÞKEöá~‡ _±ßiX0XÚoæ{(¹•F­ˆå\qÙæÈ÷u¡ _»Çò1| 1¨Ä£¿ñ¤¶Q9žXLŽ^šÀ ûi,6^¦Wl.î²®ê'I· îÜ‘kïʺ-±t âë,¾¦lô…wÊÔõö ‡Gî']…¯–³è«i ^„’šú,a&EvÓLMÕ¶k¬î÷¬…“ƒ·’Ë Qäõ½#l¤è¢C„ÎÖ¢»—Šaߊ"£Bšž×PøZœÔB‹ÂÉH˜I^-i¨Êª+¦BÖ¯XÆù0¯²(‚%¤ üU Bú"•vw[Á—kƒP}Îèß>åßòƈµacÍ.nÈ5Þqˆþb ÇÞ¬"b*ùÜyÑ1"+:*ò ;Â2ìé"«Ú.²†YçW·VNß)+¤ØKîLrKóþkúÈðÃNă3-z•¯¥èÒÆàÃêMV•à†"(vò»‚h)R´qE­K•ãø]ÑDèŠÓÜŽZCz,žDÐZÍÖ¿.);hÅd¢Ë¤œô|=ôõ¡îÍ×#7ËtšÛï­õ8^:²ûü.U1/ú=r³Î[í÷L‘ºøØíÔP+:9…IáaõÊ8Ímoacl½ôf\9sŠsÅ¢î¾]Ý} &×¹ú+×ÝuFÿÜY+X„\BÅ}4F¬…ªâM~‹,åï§á}0‹+½­Ñ[Øîƒz½9{ìðT/eø§Tc¢bG¿ñ»^ªÆV^ä|,E}è1·ª`àöo§ ™¤,ƽŒ6¥èC9ætÜKÉL¹¨¨ø$Æâ{ªÃ/¢«9Bߥ]‡9J¸ÿPK½£²?ü0+PK8A(org/hsqldb/TransactionManagerMV2PL.class¥Y `åuþžvvgw5²%Ë+{mI–±1Ò®daC –À±-la ɲf$¥…Õî²3ò $@ !‡9RBiÔ¤N7Ò’.´uKÓ4=ÓÒô>’žéÝâ»ïÍÌ^ÒLjYÿùîÿ½÷¿ôú…o¾ `3}1ŒI<«âKaTàÙ&𜊟ÃïLž—ægBø2fÂøY|E¦_Uñsah8)“¯Ióó*¾f˜oÈdVš¹0r8-´_óôž‰o…ñm¼$ÍËòJgðK²ûªì¾¦â—ÃhįÈò¯ÊÊYi~M~]6^—ÑoHói~S}WF¿%£ïÉè·¥ùAûÝ0~¿/£?µïËèCø#¼!ªý±Œ~ÆŸàOUüY[ðç2yYš¿€¿ø¿ â¯Ãøü­pÿ¡ùQ7ãïdú÷ÂóBøGü“LÿYìñã þ¥ÿŠ“•—•ÿ¨Äâ¿Tü·àýLlÀ7ÅÖç„ÏÿJs^𷤹 U³'b#Q…4¾0O•0ù)À'Aj˜‚p˜*Ice¨ŠÅ£%¢ôy-•¦šIR4ËdZ«Òr•"*Õ"cé©©„eãƒY=eêcV"2 «zÓÙ‰öIóîäøh{21Ú~wwO„F/¤ÁÄ”aZúTÆ »7šÈc®K¤Ö6ÂÊæR°]º¥ê¦ÑÙ2DPºÒãCLÖÉô¨žìšÔSFÁ×ÜÒC&̾¡}飦½p€‰ËBW+ƨ%Òu¥SV6´Áºy×ôÞ-iÀ0MÞíì‘–²Ò™¤a;ò6Zá ,°Ë3Y#£g.ÛNï„ÀbW XúØ]}zfPM*­ Ô8F.‘Ò>¶•¬4‹šexÊô#F&HYìÆ„%ùe‡5 Ÿ_è׳VBgM£Þšö´ qø1‚>>¾Ë(ªKè÷D(]³e/[á“é<ØÝ2oɡةRT¥U*­vv§L#kåú fŒ¬™0­ö~§7RÖ€•Îz ÅǤŽé©}†>Nˆ½#/Áêf´‹™®ÇÞ[VîXÝ©ÃiÂúf/»ô±Ic|ïèÆ˜e{M$kL¥ ÐkÙ4ƒé®|ÌÝ2mL‹‰|°÷NýˆÞžähi/!½rÊÈN»eÙù‘^=jL$R%k„J{)mïhv^˘bcÛ¼jJ°÷æô »ÄH•²Õ¢z–j±£áNܵp¿E4$1¥Q5ª´F£&Z«Òe­£õ]N ˜7ÇoÒÍI2a…FÍÔ¢QŒâ*µÖ•`ˆ{ô)£OOéFv}~ΡWjÝ©”‘íJê¦i˜µÑFÚéJ6Ñf•®Òèjd5ÃqÞƒ{9p5ÚBרt­F[©C£NÕè:Ú¦ÒvvP½F;ºh節Ñh7îÕ轑nÒ¨›viø)Yë¡›5ê¥>öÐ^úéö‰ŠBrÙá 8¡Ñ­‹¬ÜjÝÇʱ|¬óý”•æƒ}–Fí†bFQ£Ñ‡ÅÆ‘>*&ù=¬Ò#=*h§O¨ôI“ɧèÓ*=®Ñgè >KŸÓèóôNàž‹?EO‹‡4ð”pYi +…ëm}C›û{Ëýq!$‰Í†·…bÍŠz NfÓG%ar’ZÏœ曀—æçZBÅÁnûå8Ž»76ºçEÎì=–ùœL‡gAÊÕ ÆÝd"ÑE7YB¾åŽ›½éÑ‚uÍ-^ùŠN–@-÷†Qší‹AËæƒŽ³aW9SL'Œ§ZÇú¸bá{•£«Ï%¬=‹ÜŶH¦'œDrE¹À‹%ŸN)AŠx½|…6¼DÔÈ„wÕìxþ´•H¶¥ScÓÙ,çñvÝJO%ÆÚwØhË$6\$»kÈ6ä”ïØpPü¹ª`RGòF¯sG6«—}fWÿvûì}ÌÄž²nÍ-̇i&îaû†Žf–Ñ›–z)4\_ï­z’7Íö}9 ,© Hë #®^ž!tþ?(°|I»«MǬ³t^UÍžÅõnUYaÉåîtÊ!R­¦³VÙ-ι+¬âÊn¾‚‹Ôc.‰EŠÒnaæT*yfñK­8쪶KŽ2‰¼+ /R‡² N¤ôdÂ4œ ÿ] °Ë;®Ålhbg¹!‘5­ÞDY}UbÕJ»îTS^«ØÞ«r}“·^ öfÇ .ª$0@çÂÚ£€àK:'‚å–§ ùì(ov ïìènzgÇf­™”>Î$DZ+… ›¦‡VnjËãn8Îת@‚ë| 2ƒ!=)kÀ©o™µ3èÕ±2_êŽÇ8{—°1²Ùt¶}·´’’§SkáN75w—p°² ÎQ¥ìsÁËIîÞ;ÛÓVÙκ«c|'×-—à¶=žŽ'ÄB…TÇúx¿}ƒ—öºÙ)é%?©8÷ò[AÃãÀé d ÍÁã9 މþ´<œ3Ó–ÜB=8^'ZZ¾,ò޲ϓ%Ê—ò¶²_)‹¼¾ˆF=žÂ¬y‡‡•ó‰€Ý-Ë‘̤̈́s.*ÛÉñ?…)35aîžÊXÇ›ÅN웎£º³åÍž"T%Ì2w©¶J?,°r&É;lþà¤nÊ}`.xX_UÊŸ…q©&ÒS™D²ôò¨2ÙSz¡æ(û3Pº×YþÊ(Ç“ï/ÎÒ‚û©ÚÌ Q€nð”¾ÈhõÛls€ ¯¢b;ßÍ«Ó{™…t¯äºu‹Á.çÛbXçËyÜefÚ™ÿ]½~åKŽÜÇvè:øy²œŸ\dçB±ãcïaÇÿø²Ýô®K ¬Å&AH 3俌¹òz in3<;¿ 3; Š} #§á›ƒÂC?sPcñ9c±YgÊ!<‡JÞÕFj®¨>ª9,‰)sXS^BõˆOÀr¨˜Ã²S6SÂÝȺ̖3+â>ÈPµ9,ÿš aÂr!–p/ÊIwozáž/¿wGÅãçµ»W ÿ@©?H^¬{p¯ °ŒÅbñêòûïÇÜý‡]å~(>‹9¬ìsúè6VcU«ã±êçÐàÛ¢D”†ç°²5¢l>ƒÆÔÏ×<¤ÐÌÅ)[¾)¢œì¸ãhàæ½ÛÑÃzÐk÷„û¸­ï.Sq+Ñ9T÷óÆóbQ' %bý˜ÅY{~ßIW®ë]9÷Ì“/Îë s¸LÔ\g [ÿ¢me®¶¥ýa,ÞVŸÃå.EöyÄ „y7¢¹68%‡+d›±š™_‹l>ñ *ã,Då—±š¡|õE _½ Ì Æ!’9ÄE´V×43XZj&dˆ|ÀhÂ÷ð«þ~`÷޽b….`#‰ÅÎaõy\Gµ+ª.²s(*>¤âÙ7÷W2ƃ…óOq ˆƒìÎÛ‹`íB£ùxԞÕ¶ùÊ­ês‡­¯œbñT\‰&ØN»wÄSQqóñô¡‚sÞǼåu&¾i›Ù|WítÆWóø=g°EN&‡k¶Üå®­WîxÍ¬Œç°uØ¥”CÇþ™‹ßÅ#µ,õ©‚•¨¸€ul’ÓÕ¼ô‘‚Ö¸¹ 6&Jw:‡ueIP@¾¹À±Ø!î'\Ÿèðç}%P < åTý5¢FÏ¡9ꨶ£Á³Ðjèõe×½€ë_‰ã,Ú¶‡Tö¸ïÇâk£~FÍá½±¸=ò•¸TQü:(o!*g|üÛ¨âá7¡ñî#xÔîKPláÛF:ÔWÛf±ý,TeŠ­ØÚU^À6«úÚ *Y(õµhPük…zçp$p«ZgÑ|Ëø`—Èò.ivGý_gùÙ×1ýuh¶{G²8üP-ýñít õE‰PÇõT|BÅ'U<ÆÒr¢ºœQ>…O»âdqÅ ¶Gµ# ¸VºA¬T&I@$ ˆ$mñ¨ò"nôÁ< ‚BÅyD˜W/<ŽÏ¸ŒÚÙÏÜGZ…ûÕYø•“ølê›N°ƒ`»V1¶ü„‹Üá"7Š M9t»YÃ1mx•°ÈPÇTnÜüY|Î¥³•é(ܯ¿~mœ`W‰ŸÁÍBKX®^‡òžÖ¶9l/jä…yøù™¼$Þ-’ <ë#ä°gx.äC§‹{˜—üÜ·0†:²çUî”ÖöËÜñûþá6öŽp‡ÒöZTq£º‘/VðïåvïÐ^Š‹ÉŽ;B×(dg7Uïž¾­Ýn&}ϸR¼ÄšÉ™>ç“qÝAÄáé§z9˜ÃûØœk™ímu»Üä›Zçp¨õ,5çS1Ùºc[à 4:wŽ~š½8:ƒjI‡c3Š6kKnªüån;‹ÓÀµ\ºpHsí%ý4—*Ó%7»Úr ¤žƒÒí^H_\Ü yKÚ†ÝPnPÇŒ¶Ç–÷'2(䯮½n\%§´C.E›Gþ¸ÔO¡Þá7îf„]ÌØ/ö9\ =ô6+’~Ñ-µªñ 8Åeèz/]ÐÿPKørMäg PK7A'org/hsqldb/TransactionManagerMVCC.class¥9 `TåÑ3oßîÛãå€\l6‰) AQ!ILB$‘p¨¸I°°Ù »­Ö¶h[ëÕjðBÚjmk[mkEŽæ{ïí6ý!ùÎùæ›û›yyþàc»`ª4Þ ×ÃG üÁ |ä€ëà üÉ V}ò17Ÿpóg| qÂ_áo<ýL¿;!þÁ“ró97_8á_ðoÆù\_:á¿ð7ûxú5ƒìwÂ8¨À!ZApB!"­ äD ÊN¸­¼aã …Ö`oØt8`":yÏÅP*dð(“›,n²é&Å£Ñ<ÊáQ.7y|,ŸG<Ã#7 X„ÅÄ.–ðh¬Çñ]¥Nðâxšðíãð˜Àðí8ɉ'âI|{£™Ì‡›r¨à¦’›“®ÊËñ <…Ù˜ÊpÓx÷žžÊ£jn¦;ñ4œÁDŸjG¯gâé|h‰Ïpá™x–‚³Ysk ïÕòÞ\ÎóœÏ÷ÔñD©'mâ9Lu7S¹i䦉7(ØLšÀs¹YèÄl%åâyN\„mLÍb'.Á¥,e<=Ÿá.`¸ ™þå|ÃE.ôÁA'Ý:‹‰i§)©nèওá4W0—+™·Ud9èw¶Õ °Æ‰fÿ:ìâ&È!us³–›0ãˆpå«{¸×;pnäéÅŒù¿©à¥ ’!åu„ººüѨÖÙö#¾Ž¨?Œ 6„Â+«VEÖ:Û«þöªù4¬ÕÖöh3Ʀ;ÔêïÒ"Q_WwºÓ ¡àJó´ê4„:Öh¡N —"ätø¢¾@he[ØÕZ´H„ð!ä&c1Vé¼=@§[7´Ò=XÁSc·®“\£'˜ÈÒ'IÛŽ°Öª õ£t¼Ávº?èž0¦,ùºZ"¨ÝÑfN^„ ×JǬԢgBí¾@Í*_p¥çÁR6™H±û#‹†ÖGÄñeã…š3M’UM( ‡ŒhÈ‹¤ßM%É”@“”E*èhQm¶©±‚´À ›ÛÖº}a­FhíhˆìŒ–¨¯cM£¯»Õ× {üÂ(]åIT #ZAL©v‚' sØâ[§u‡üÁ(Å„LsY¿šˆ7š}á¨ßGœºÓsZ?yE<:àëì¬Õì"4§=¼&hOY!ÍÌ\V7yØ’Žq¦~I]0¢…£æ%Ëÿ‡KºµpĉV5뽌¶DCá´„,Rðr¿MaHÁïP ?¥Ã\¨ùÈX=G%€QÕ®¥#ɰ^ìNµ°ºàŠÂIJt„×ø:Vi ÚWkQa>ya­+´N;ìxÉ«5Tc†‚s{´m$’—5¬ö­óUÈmªâ¨ü.Ùx—^©ÍÝÐíAÙíÚJ0i Á%–LýTUýt>œÊeÊè*ö]üÃ[ þ(¨8ˆ1·ãwâc*>ÎL<ÁhATÂoáeÞgà]D*¼Í£!Fð Ø¥ân|RÁ§TÜCң˟Vñ—øŒ‚{IÉ «¯ Fµ•ZXÅg™ãçðaŸgü/ÀäbÁž@ ÔŒŠ¥ºI”*ø+_Ä—T؉¿Vñ7ø[~Oªðßÿ2K÷–ܫܼ†¯«øþNÅßÃ}*¾ÉÍ[ø¶Šï°ÌÞÅ÷T|ŸGà‡ ~¤âXÌ9â^¿z‰[/WñŒüOLßÇø Å(ÿŒŸ¦ •Íj[WÍ_Xü¯á_UxÿÆbøLÁ¿«ø¸ì:U*þ“ŸÃÏTüœ û¿Pñ_|Û¿Eƒÿ!ÒÒ„ ¿dÿîTð+÷1ð׸_Á*äÉ!  UI’,ª$KVU²±¾z©‘’|ª’]rƒ«°[rª’KR™”§Uxú)Pîo¼ýž*e¥I™R–*eÓUÒ(üB‘F«p3l!~¤¶ð;Ø*nåævnÞwU)—Ô%åIŠäV¥B©H‘ŠU©D*R¥±Rcza|ò£’ ¾ ¬FO"&†1G©’#B‘`bm]­çŒbÛðG á„£¿jÒ2Ê_²‡k aœXê‰úU¡`GO8Lgª8‹TqöG6¿,}zG)…j{§‘€`Ú¼ŒI³L¶Ñ1Åù-Js±IHÜ#n[Ü[6R²ÚOIóË&§§ÚH‚’ËDަ†Í¸C‘D’.)NDNB¢D7pNà|1}žYÖV®¾h¨ËßQ5[tŒ–xl$pb“r¾8± ¤`ÊñÓ³ÃaßFÞ'üÅGÚ'V1%fÊ&§qfSÄ1›ž¯=ަ¼´Žõ\èvâhKŒÕº`,=à‹Døõ•^º•-ÔhLH£œJÅqLŒf*Ò8„™ÿ ÄA@t =ÁÝ-,ÅÃt¼ Ü©Qbc>þÄ%wz΄P}Ôç= QWèeÍáq*,‚µ# ùØéƒÚ†èaÖ”5¬r#+H)Xu”/§Q1m½ šPÜ\Ji¸l’ :¾N'æuåÇš< ÿÊ©cŠá¤O˜Ò!àÚ‚ j…?è ø#š^µÇñ¥|œÄmF\Jæ>ÏŽDü)©r’<”hÈpˆ $…êÜhÚf(ãzÔ—>”›éCYüdNĬȒËtŽST¶:㛑4l„§n­Ópüá6— ÀUp0ºÈàbÀ¦—t…>hð1€Ë¬":µ R“Ðiáp(\5—[Ÿ”mµÆtJY]’Z¢a?…¹dã\h€›9ÉÌ‘ h¡ùBa< )åÒ:çPÒu fTŸÖY¦? øDðÔÖqüvòW³LÝ@ŠXðwDÆke«¦³UR–Z‘¦¤U/âq™D5RéêðGô†jFÅ™ÛÕe3£¥cM-/=X¤÷®‘>d­÷ù£$ãDMc¡R‰CBšZŽà3^ëL€[\%Qj3Ü¢Ä×—óºã…10î( \ëKÄl”ó“ÖÝl`ävÍ!¦­»‡,뤲ú4Ä¥ `d¤d}$C>t,E¶ùÑ…?‚$\´6YñtjfZK=‚’Gúг”Å]Ÿ–d‰¥+Ýõ¯Qäua²{w(â×mH!%ên(æ¥úC-"9¦î¥Æ,·,íÅîÀŽ+öhòW,ñ-¹’‹«èVŠúÝþ@òƒ”!º|ñ ,å;bKòÞÌÔb¤%õ©Ó—{ó²#&qè’´u⢢#lS˜â»ŒÍ9ž’=ý2iБ$¼ù#Âú#ÍáÔWÞ—ýƒª‘6‰IYËS±#§ç„·õØ>~qI}<_Ùáx VèöWÇ ‘ùU…b'@"†pê˜6á.Hýò’¤a;qõùùx~š§JÏ‹è4 Î¥¼-%Ήï.âs-s×ä#´óBa!=BÍŽËk”‰£ÌÜ1ìb¢9§4³4µt ’¢™nþ“Ž ó0X¨ ®ó…ý>ñŽç6,˜Ó²¼¥fþÜÆÙËç·œÛÐ4»q.-çLÿÐ8å¸Ó`rΑi„ñp\7€€?;ÿ»n=Õ㢧ÚYôT/‹þv£ßbôwýV¸“Ú±„ï.¸›Ú{h¶d¨ŸçÙèy¤%ÛÁ22 ­4´ ‚⡹ÝS>gàŒkTÉX2ê¤ìí9Yë d÷‹{úà^.aGêíttT F?`@üî3 2©gIÞfìÝ„½mðÀð=«¹÷ Èh4†Cýä| x¡–P×Â\Ñët;@új‰-<wèˈ…z]têT“ð§ÏÑǧÑxÆnð²Zc0³Úf,Çàôbù¢» Ì˜'–åÎÌj30ÅàŒÅ}‡^ò”çÙÆýqJ\ „ $žÇñZz".“B¢…cG¦‡p¦®êSô@ü)Û€{’(vR¿É0&¯Õ42[qžm ÈýÅÕJž’gÛ enkž" Ùî¶ïu>?ú¬0{Èm/'ªælRÈTß0tà)ﶆÔxÊÅÈBs–×aŒÝŽ!ÓPYà @ƒÑ‚µ¢×Ù,[Üå%ú«ÀÐWTГ \²›ØÐ]}±M¯’WTºÉ¨k½VôÚäjÅmÝ _lj‹Á\ºužr;¨ÜgÛ·ÀXÃtÙ(Îf¡Í'+•£ì€º¡Ê¨<ÜÅàœ^Ý[–\ôlÏ’°ËÑûc@ë› ›A‘û@¶°üz…†‹, ÿ¶™žb{†^©r7IªQ‡¹À¡kû…»RFúƒzÑ7B³è[`±èu–‚ ì'…‚Pt¶X]Ì‚É`3ÖdsÉšX2ø‹ÃβLÑÈš ð áµøC·ÁȢ͎”1e3œ<ìùŸÆ.>…@VëI@g»óvç5#¿ý3 †0××$™¨eFñô¿oTì Y1Ý—ðõlY{uób’ÈPzQÒƒ )iÏ^îϼÆ^vd¾@h¤=çª7´T9H‹Vƒ´i5(´{?r ƒc³?w^#pBÏÅ‘zgÍ­PÃéÜÅÿ©“1¡¢^gîcìóké8$4‘g<,Ÿ‚»©aG¾ç¹ßï÷VBKÌ]òòS÷#äøÐe´‘‡ÆTH^Ef]p‰¹,¸Â¼&¸Ê\¼Î¼!¸ÎÜÜd޼ż-xÄ_µ‹›vòo¼î_PK)çS$NPK7A*org/hsqldb/TriggerDef$DefaultTrigger.classm1oÂ0…ß…Ó4¥©;t‰ÄÚŠ¤ P–NŒkÕIû¿:!1ðøQˆ‹"Xz~ö÷¤;ûÇÝ@Q€ PàE Að?Œ5yŸPétÂÃ`³Tl+ãØÆÑçZþÉ8•VÇÓÜ«ßËäë MækµÈï¡n¢ _ IhoœŽ¿³Ÿt9gÎh­ÜP­Ú,ù›ægB¨ß‚pd­rƒTf™ÊÛ&„¨\™ðz·Zðxü[Çâ×ñMð©ÉNyÛ‚þQ,B çø™åìÕyØ=>ßÞ iÃD¹ˆS±QE-au +„B ÏÃ1¡zÝñ'î\zîÙ`$nâŽK1NÃÖ£‘ä÷‚P™JìÇ‘/½$ñЗ~|L8jõÂÈsïÔC0¸}¡”ÊNFóŒ§ö!ß ‡‚a« Š 6Š&ÖÖ±ÁP3±IØššqùž'¢q»óMyÌ ¥_;•RDÝ€+%¡üw8Áh%ó+ÿ·×­<_þ Öjg ž¹šúܦþ ”ÒŒM)j9)’Ö;§í¼ö¶‘C^cÃy9{äœý g÷ù fž´dY[[c‹X‚õPKg§/óPK7Aorg/hsqldb/TriggerDef.classÍXy|ב®ÒŒ¦[£ÖÁHFˆ[i, ¶ p¬cÂB‚‘@bãFÓ’¤1‡ÃIì8wâ8q I|$kËÆ86°qlïfrl6{Þ3Ùû¾²»Y; ûUwÏL4’ÉûûM×ëzUï{õêÕ«W=ßýù+¯ÑF~ÕK)¦2J0 )ñ‚¸äÍ-¤TˆGˆ¢°ê¥2KµÌKCìRîe+®”¶Jáj/-°tHOáaj…Ô Y(d‘ÅBüBêËx 7ÈÛR!Ë„,²BÈJ1iU=Á«…4*¼ÆK×1I÷u*¯õbMBš…Tª¼ÎËëùzá[bƒÂ7³QåM*ßèÌM2üf!ïRùÝ^¾…[½¼™·È[U¾Uz¶¨ü•oS¹Måv/wp§—CÜ¥ò6•·«Ü­ò•oW¹GåâÆ^YrŸJ¨ô Ê»TÞíå0÷«< ò•÷Š)ƒBîðò>Þ_°2ßé{¯ØrgỄrw9Õ±.ÒCâì!…#ÒB†eÆ!£ Gek 9¢ð˜—Ç9&$.=^ •·„ÊI…S‚—Vø˜ÂÇ>ÁTÙi ëé±Ô@":2b$˜´îXÌHtŒéɤ‘d*·zJgRúz:†û™¸›©¢#K¦ôXj¯>–6\)‚JohPT„eŒ·õn ìèÛÓ; ]%hkï á]´Íwº˜<í¡®¾°É¹™JÛºBaaJÜÝÛ?jëÖÃTÕ»gçÁp÷¶m¡ðÁ¾]ýf÷ô‹ ÂÕkŒO¤N¶%úI¦Åz≑–Ñäѱȡ–첌áÍ02•ÐcÉh*Šõ0Õ*ê‡Æ è”AeÄØ«' ±¤@#l ¢YÍ¡x,b‚1-r*†NL$ŒdhÕŒêÉÜ´æ,@æý3%&:$Zµw“¯ç°~Loƒ´¥?•ˆÆF€©$âéT4f0ÕhõB¡"=ÑSFG|,=.K-9€mtÇôqCá{˜ÔíÐ Ži Û½SépZc–bÕШ87 ãX«™«ŠŽÃ0LŸ0ºÙsràj4Ù2™2ƱEÃñDH Çcócñãz)©b\?žäî´‘6"ˆƒ”øGV]dg”T6vk‹ì0ªm3¨­å•Û]–=žÔhÂÐ#…^0û0\›0àù؈i S½s’±¨åNãhZlñ&œVÓÇ¢hËŽÆÄ¶¸é Ï–h,šº•ÉÕÔ¼¾ïˆG€y¦éšÜÝݽ¶ŠDë<á9G<ÎŽ¦ݳûöw‹Íý)}èÈN}œ 9±£ð½ =¤Ðà ¿Oá÷+ô˜ÂÀÍ€Ó#ÿW×¼–#x¢É½Ö.aCpø”#eøn‹·BfmSó5ž‰JŒé@¾‹XC+ÐÑ?4jŒë¯‚ï;“]ZˆŠ¨M%[¶áø§ óÄB5l  #6$i`e¡¾Ä__"qd»ží7Rö˜ŽøøDGÇ[V‹DôfKü3ǘXyYÁ(‡¬6)vÚÖµÅ"²lXY-p…IÕÝÔ-[&lç]ÑÂaE¢µ†mI¤±¥Ø¤„”~)#Uh J&â»ô(brMaŒå¯ÊFG1€­"’'ÒÉQkÔÖ¢±uÀ±ãvTé2-šlO'OZ§Ãötí KìŒ_Ÿ ޾DK3½ uËИ™c5ºH/k”¡/itAÈEú¶F/Ðižö Ý«Ñ4Ý‹Ò`®Œ®ÑKt^ãò}ˆ?Œœ¦ñGø~ÜÑ÷n-&¢˜‹»®°ÎÒèyú†ÆåÒ³hô8}M£§Ä§…<#?Gg5ú=¤ÑçÍD«ñÇè‹}AÈWé1NÉÚÕG„ü –Ï‚?‰T3oÞÐèÏèÏ»÷„ö„4þZÈg„|›ÓÛ7ØÖ= V[OÂŸÓø!þ¼ÆÓ›}~ ªøÉ†×ù ßµ  àSìŠMã/ÊÐ ù½‰R¤¯ —ˆÆð—~T£ß hŒ‰¤WêÈPW(êíèî݆(F jV¢%mý ŸÖøËüU…ÓøqAs¡®Äbì*Ó…’¦‡Ú:¶£Ü 7áiÖø ~R&ï]_®èë“ß:…áÁ¯3ÖèF( /x:C=!YŽgÏ®N¬K£Iqø—é+ ?¥ñÓ²ªÇe3¦dóþ›þGãI°ü ?«ñ!Ï1öò½¨ñóü œÔ™u‡øí~,[8%ä½Ì´,¯Ö "‘HO¤ŒHèÄ1!G@ãéû¿$QµòO°ÂíiÎh|A&¸ÈÊyKã—ù¤†þ,lg¨Ë­+Š¥Ñg賦[§ï §c1;kÎqË(|‰iõ5ܬ˜jf.(4-ãX•M Uù.ó¢ÁE9”N$$5Úå_á—+ë¬û$eœ°n¨ž¸‘»Û_ îIQŠºÖ2yqv!5ǸYx›%Ï_L¯!…0Óºw0hÆÅ¾¤©c^i÷<Òe3R–%Æ^3)1¹2ߎã d7¹©ˆqû‹T.¸(Rñì(¹;q-ÏÕi»Ó( ‡£‚k_ŸÖf–™¡ Sƒ˜î0Ðê·Æo.Œw§a—,]‘­ šç¯HóªEפ8£dÈW«ö©™ñÀ^èÀFNŠ'ZBBQ—¡ØH¡$´ÙšŠ|S8öz6Ÿm.¼ù¯[«ªlGN"Éeožy541ÓfO|,bÖ‚5Eª ùÐ4Ž›b÷p4õÞb–ùj¸æb¦.Yù§ˆÞþþƒàïsðÿáüGüýàpðÿ ƒÿø;øO€ÿäŒñŸrðŸ+Oþç’2ÌlQ‰™-Š0³Eáe¶Ú-*³Ei`¶¨ÓL,Ôw&ÚÉlQê™íÓv;iÆnŸµÛ3¶µ Ù¢Œ4Ûìy¦l9J ù MêW³6ûÝR £í”‚mŠd¬ð¼-]Œ¶*p8àž¦!®sdý³w‘.Yм†Êiú–Ö¹ý¥~_ñ«þ2¿÷¹þòi* ÔiÓä ÔUL“pM“¸Deû.wšÊ¹µÒ_î¾HZ†*.Rekå$-h­ò—_¤jy/m­öW^¡…2¬Ã`˜ošj&©1à¯ÌPíTg²u­U3uΑ‹Zi;ÝNU´“híQDÒ}h™^…Ñ£ä¹*b…¾©Ðk̬Ðë ½¡Ð/+ô+ }K¡_•î_#ËW±ØêkPV芩ÿñ¢^´ L—}ÛvY;ì*Çìú6œÆ:¦iQ`é4-Ô¡Óð—NS}À%¿2M ¿z…Ê^¤¥pŽ_¦e?ü¸<à/›¦Pqm¼B^¿âÞx™÷$¹á”•_jv{<ŽîU ­>gîç«f©W©ÊçYŸ,ê;W¡?¯R ”À݉¦ÃÔ§wÖçÝ¿6Lø.}ÏŽUñ®Äjià<•œµ#ô×éû¶¸Ê»ªÕ¬EÆ.œ²Å¿™/²Åå">Oøe•~+§Tk+©¶RVã·éwæ„Y“Uú]ú½ŒuäÔKt"xmVã÷s•6L ge@hË*d…Ò—=¢DoÚ¢$Îz Ú}Øï¦˜ œ¢ A_s†Õ+2 J_†ÖYÏ)ª úÖç|×(—V¯r]¤ô 3´a*C*ñOé…þüŸÐŸæœ\’sò ÏÛöáÓ—¤`¸mèmÜ·€‘6õ}7:f¿©`ö…ºÙÑ‘¡wpïÎqÐ]~™€uK®ËµµAz_û]ßpмÁêu¶b½t7`™­ÚÜ\ž¶Èòî/áÉ«?f ÙZ`H}†nµl æf\yš¼hVâ%Aß{œ¶4¸pø¶}·e;}mù¡¾öhèf¨#C…à n "t-î¢KJgZÑ5't±DÛÏ/á) á?Ekƒ¾mŽ=ÞîxosºmrÝSÔôu;4và²&ªïö¼$‹K©ügd ¹æ-Zîiy›zߦvëhÒ_äNˆó|Öd¨'C;³'ì‡9¥vo„Ò¢3¦˜Ö˜)‘OžåxVùz§|}S¾]S è;¾Ý)üzÎ&¹W””Îr¸a·¸‹Ÿ³p×Û§¹ÏZ™O£©‹‹Ú×?å˜òí)ŽßdáOM{³ð/‹ŠýYñ_å¬sŠWdò×9ñ:[\ñàRxÒŒþÁ Ý‘ß …JÊ»¾Áþ ýmàåYà¿Ë™•Ëu®¬M?ìrm²½Yo"ˤªÜ‰:Oû 쪸ݲ닸îùþ©(À’R@ö4í/ ðÏÅœ3¹ÜZ³Þ-}£"2ëO-ëfI¬è¶áAÍÈìNÕŽcXff~K¿§§+¤šÎ»¶a–2빫æ¦È$)ŒXÖ*RÝ%á.7åbl"ùÔlH›¬µ]µLaºd£è`Tˆí\Kò[ͲBYlëK[¢àz~pI&3ØHi?Ý †®²î,UŠ^b¢É5r#ïê…; zÕ—JEqß?uVkNù†nØ —C½ZoºÇ÷'D”\Qp› €¼ÌßœçÅ»«XS°Îqã#8ÁñÞ'=Žð¡‚8tl((p!86Qb8BÎQ†Á±…; *Û09,TzŸT帋Ž:Ôpã¾äÞÁÇÇø„ãS|Æ©·R >çø8¾DŠáxs]ÙF‰JñºØ¤XB!_1œú…ÜÊM5X«¸éeocøöÿØ ²Þ»ÑTja­ÁÐwPJµåÚºé.1;Þ[ð­V-ê®X¶dah¾]†ž¸È/J†§ñ•µLWìÅpHíú qhmAêpÙ^³PØ ÛO¹?|H6) ·Q WíRm»Ñàýë!ÅKœË,z9a8ÖæZ«ì1@íë ‡ÆÈc†Ð.•ÞKÍ8˜µj¦ë•#ÀË$WŽKo ýfl! ääR˜œJCìˆBÍm;Ç’‡½f´jQã*†3kۖݘk³;QmD7Ò:Weì£d­6æË‚nîPÈ ¼VÛ¤!Mšƒá(½Zf‘ajâ`íBØéZ ]ܾe1Fÿ¦ÃôïÍèG#Ö}â9ZOÑé<ºÀiOMŽœˆiq­CS´N-¡©?ƒ¥´®=Dh­#º‡Ø#À£¢ê›÷Ó.©;S»ˆÒ¾Æ™}_#ÂìyLøX7ý¢R'‘jk6‰);ƒˆ‡¡Kãñé? Ä¾C,úƒ§v–Ö8"Ý3Òþ…p›Žö6Ï"s¾Í7$ì Ýý c“»Pê^ ‰èôŸàò#FDƒˆÿ u5:•_Íï¡‹0>YG÷CÊ«—˜ž q©6@zGöÐ+…»x†Túâ£Z¬Žþ‡HÈ}à÷GûŽu!ö7Fœï›’ÙžÞOÑ8…¡]KÕ©g&}Î:ŽÕqü6QkAæÆhUi?‰w(>í_PKŸþ%\Ð PK7Aorg/hsqldb/TypeInvariants.class•ûSWÇ¿7(»Õm^äabÍDŒ‰¤5Vð±¼ä&€Ò¦tÅU±°$€¦é3ù“Ó¡“ÌôÇþÐ?ªÓ{`%‰«3ÂÌùÜ{î÷Ü{îÞ³wÿýïÝßBxãŲ2x±†u ½B΃¯—±JÔe, 2–‰2ÂÄodDˆOd,‹2–ˆOe¬¿•¡¿“%>““ð½×Q¢þ /nbÓƒ2¶d$$˜Ãèÿ\^L`›T;2’}/ȱ{¨yM½ŠŒ”„=/îáGêWi²µ, u ÏäüãtIO<Ñ®¦ëànóEuk3ØzõÜlc»F£i¶Â —HÇ㉬Γ<‘+ÅRZ.ŸQ#4@=-¦'r¢¯åcœ—VsÚzŠÇÎÚ­Ïm0xû£ÉB:Í ñüÚ|”‹IÜiMçÙY†á‚ž¼êsvŽaHpžá\LËÅyVK—²…L”–¹ìLVVdê)&ò¥µ\)»Æ0:H¬×tM8>݆HHç™D)¯k™u‘+nh9ŠIE*V¥µÄà L‰Ô‡bõ-S<°H¹Úó+xˆG^(hà€áÊIt/<À¼‚¯É,Y&&!³Hf‰Ì Lbç×Óf÷k›fƒ6K3ÿ¤ †8øCWhöU™úVe»b6HýJÂÏ ~Á¯ cÇæk”[æþMAqI2«´Ê GPÜh™z¥fÆü® ErŽ?ȈÿG1¤âÖѨV«ÉàÛ3Œ`Õ°v‚k›{f¹%ªð#yJ kÔÌŒa;fCœºe¾äÖv=_Þ5kF?„^‹“9”3(ܲÌF¬j4›¦X&HX(ßjT¬ðS>•>y©Û‡}QPÀ©„T#îÈ©±rº~BÓÏlÿÈÁ2L8§9zúbÃ"9;IÞKòÖñ/ü DÌÄ)vqq¡Ì‰;ç<üTæ¢å§JïqÁfØfÄæ¢Í%›Ë6Wlj6£6E‘÷˜°™´¹j3e“÷xF܇âí6ÝË‹Ñýˆá»]°·½ëQFæp˜ý7 ³wê—oô/¸½ÇPQh‡;p«’Ã'«‡Ï«žuøuÄáUÏ9|>õ¼Ã§ªŸ9|Ô‹ß%õ²ÃwEõ;|WÕk.ßHßw½èó{\]Üè`¬±÷¸Y¼ë­.ný‰qõór¢èS.àvw:˜lcr ´¥#Ò©žtºétÚ–JG¤_ô¤3mÌ ¤3¶48Þ+úž‰¿»‹ÙBm„ÚP_ÛÆý¾|k÷…õ 6Å׺ÿÿPKCvâÀÇPK8Aorg/hsqldb/View.class¥X XT×þ3ðf† ¢Qu‰ÆaJ’¦m£Õ‘VeÜšöÁ\àá03¾7¸uK[Ó¦[’niM—¤v¡¶Ñ–Ll´»Mº7Ý’né¾ï{“sÞ{3¼Áò}ÁïÝíœsïYþsî¼pßYW)Vã/Äan^ÆÍËU¼BÅ+yøªÊpc¥x57¯áæµ~9ÂÔ#jn àux=77ñôf?®Ãx#ÞÄkoà-¸ÅOb·pÞÊbocÂÛyôÞɬ·«xW x·G¹¿ƒ›÷øðÞmö>Þöý܉›}¸‹'`ò1Þ僼ˇ¸ù07akƹù¨Ãݼ÷qžžàæã,û ?îÁI?NÙ }’-ú&Tdx,7“ÌšG÷²µ÷pÎðèÓL¸Ÿ gyz–GçxtNÅgøÍ´––£2‘VPÓ1¢í×ZâZb¨%š6ôÄP«‚òd|l4±E•¦ŠÏ)ðm6÷Åyª@´'ÒˆÄ5Ó”¦‚Ëww$¡–a¢Çú[rlZB’ÆŠÜœö¬6†å¨ÖÕ?"ÒÖÎ –¸eãzK—“†ŒmÖÌá¨L[š ˽]©´žL(PÚIù~Í”=Z\²ò.ykDæëf¡Ññí Si›UÙEìyÊöTLsS‹›d\:‹ekõ„ž^§ t±‰…èøÖ9Ù<7Ï´7ö*ðF’1:V’éžC)y‚dkÍ»å ¹$1ÀþZlü¿c™Hr4•LP|IF ‰ÎF]Q`KTš&9µÀ”¨+D­¬WE4­ ìíÔR–s­ŒËwèˆè¶µ¤Ï øP–Pˆ%ï䈅&ÒÅlÜÝnGѺéP¹nº¢Ðb1', Ö(žÖàÜÂ`ÙaÈÑä~™ß±n¶™yž)Óén©ÅºñC¬÷.&T²kÝx숩\fÁtAp¦s¬ýòÀ&ièûeÌÁqKÑÈ4Î@·#Õ*°ŸhG§ÀVlØ‚.І‹}«fk7qj ¬qö ¼›y“ýÜ|Aà‹ø’Ày|Yà<(ðìQñU¯áëßÀ7¾…Í*¾-ð¾#ð]|OÅ÷~€‡ÁTüXà'¸Aà§Ø.ð(~&Ð(ù­W—~Ž_(X8ÝÇY•ø%A*Òݶ¡§MàWø57¿aáö¶>ßbPàwø½Š?((ÙHóʹùt>³—›>nöbD Žø ;ç!üU` $RcÚßþªø—À¿±Gà?ø¯ÀÿX“KfqºÀcx\à <É*_xŠrKQ„RBòЇR¼äE¥T)Šªø(ήØªâWpÙ «`Ý3(;VA Ï!×-(Xˆôu+/i²pÏXáèXÿ¾1irPÚ\°'3´îš£d¿%Üv0eØÇ+¨wso+¤¶:ùeÕŠHrŒ3¨nvv‚»Uͱ¸#ãÜ)Aª1s¼’¸ÜÚþ^UXX/"S‘¿;mÉ….1iI£¥[¥Òî[‚íEÊÀôÓÚH«¨¸ï“«U¡Ii^nabkaÖ[ØžÖãc3· UY»®;aŒgÞšsóØlJXµÑ¹f"ÉDZ¤ØUF¦-¬ì(VŸV²µfÈllvô£3_‚PÝ-óWèSï…ÚàL¼Ò‰Â ´é£Ò‰Ü•Å#6µÔí°»bæ ZiW¦¥R2A©ÔT¬öÏX²K ‰_Œ\„º$oë¶1-®ê2-D¡?J2RÅm¥½nË·Ö77‰yé¤}0]]n¿Ù\ô õ¢·&eE2% }a?_¦é0ât÷磛vEåò»,eŸà?8„†Q-ÁEfÑl4U\ ȲW3œ‚RJÕCR¿°Hx¬Öy ,'מˆÉƒäš˜S‚ÉE+3…Àz¹ØáX9Çbb>“2±Zꦹ–Û-öë¾C7ÓEžàü’ìdǘ”l¸(AßÔËüoÇÑUt‰¤åVCÕŒC×KzD•§mÀØR‹vÏò#p¸)¥ïžµnvOaýèYM?}(áçJøÅdõô^²zzC=áÐ^ŒZµC+ MÀ{Ò!¿$O΋*9ÚK¡9´Gé/+qÿ”î ŸAÙNÚCéãßÒœE 9äÍ¢|7´Ø;‘AE(‹Ê;!¶’ó˜g/g1U§¥³Î¼êNTW/x˜˜«'PsóÏ…˜L_Eµ§± Ô<…Y\’7D/ Ù¤ÅÔѨî<¼§¨÷ÜMºÕÃþ+¡oqÆ5—žFý¹S–Qý–'Ô'Q1 "ÖP¹¼¾ÄG‰AÇÚ{à!§·žAÃÎjÜ8‰gu„k–d±´jiËj–Ó¨/lû¬{—刴äŽí¿Ö³®¡þV…C Y¬Èb%ÙÈ¢ õÞØ1ÂUMÌyÄ£Œ?õH¸ª‘&öþ—OmFÛ¬²NË"x2¯%<°QÅ¢,Œ£`º£|­FŸí©Æ\0{0R¡Lz‹’Ã9r_QrS޼7O^å«xó£P=ãPC“h>‘W¾%åfŠ O ={†øaíÝNQòP8<–ãvìéó8)´†ÿ/‡¾ôuÓ·ÕÖ(P½àØi\qŽáÇ5lFájÓ8–ÛŠ¸WÃn(Q.NâÊ)@à V¨üÏG3z÷;:].׺tlš¦ãÕ!¥U=÷¤G-÷ÓNžÄUS«( ªªÊøÝÃ9u>õ|ªZ=ï.Vß ’™¯îzr1Lçñï&«9üŒa¿C®qŒ* …3Ps5è:ôãð[és ÷9G±¹hÍà19åê <7‹çeñ|»Šx¨Št:ëvêíšqDÎ`5˯¡¯µÊ¶âñNbmg¯Í`Õg±>ƒPZmàéÆ "ÜoÊ ­i*{ÊQò8:žÀzÊ~ZêpLºŸÅõT5n#°ý‹ŸPK,KkóPK9Aorg/hsqldb/auth/PKPK8A)org/hsqldb/auth/AuthBeanMultiplexer.classµWù{G~G–µ²´ÎáÄ)Ji²I›Xò5MI[9 ØJBÜ*±sÔ mº’6²’õJÑ®’¸å¦å.wËQî@¡츆(4ÊU(÷ ÿÇ%é3A|Ÿ“Ãç|!ˆø¢‚/µà4¾À&|EÁ~|5€ÍøšQð¤ôïëÒµ¼‚op§œÏøÌ\&c´D®‰ŽÚÇÍt2jf“Ñ}Ì8™+K¸½-vÖʘ†“³ÖÕ²ëEg4ÚÇ¡ßЭ]EÓÉæMã”+Óœä’-°8qT?¡G‹NÖŒîÒóRÛp6céN±`¨§n)½šº•‰;Zí­aHdmgKCó;ŠVÊÉæ,éFïVþ3¾-Y+ëlh Gö xã¹4í©Ã®ÓŽ,4œ”ièDk¹m8s-2ʶðœ0¥ÍÖaGOãÛ^=iÒøÁðÿ)Zil #ÛgeA¦oG޾FÊö(ç,Ëp¥z#W›UpVÁ9çYé ¾ÉŸ@`û©”‘—Œ/ÜXÕw]G b]PdRݺð5Q"·“ÀÀµYlvYƒ< Äæ‰íšJ¥ÊÛ¹· IU’ Ëɦt‡u´sÞ8_z%Ru¾¯PÐÇ™ö'|KÁ{ Û›‡û›dï"IÀ¿%eº»HÅN ¨èG\Å6lWpAÅ.¹2…§VW- ˜¦‘ÑM¾cTêGàö}¶¡5Ú9anƒˆ–³Ìqí$#Ô¦äÓ²¶fŒåqixZÅ·±›õ©â;xš[0Þ—HhiÝÑ“ºm¶Xîሂ‹*¾‹ï±’U|Ï´W‚Þ“¨ñ¥s»•ÉZ†–Φ5+çhã„¡›ZÑÝ;µšT«âø¡Šge¤¯BŸÀÍ;ô¬i¤5'§¥Ì¹† ›mb˜É¨Š@'ˆµ–Nº¦ŠK2„! «ĽÜd*~$a[{l}…LqŒy®ñöº¹Yì/fÍ´ìÛ¶Õºê†bœÒS¡Ü¸YKê¾[3sV&¦©ø1.«ø žSñSüL`QýÎ`ÉWÜò«*~Ž_Ü3oþJNuk’yn"ÓÉ[›+¢™ä¬Éï/ñ¼‚_©ø5^è°è²Åtä 9ö̱ šö¿…ɾU踾CÕmW*iÐ-Y[żv2댒õÆô~¿Qñ[‰Úïð{îÀ3²ÄþÈ£óZ»WE XUÃw4LEïÚÖw1î×ílJÁŸUü•Åþ7•Õ”¹éÇjwRÇð¸ícÚ"OP-wD#¦síÊtÿÏÍæÔÕUQ¢âø§ÀÒjºwêö(7"‘*ûîäQv7žl•mT©õYµõ]°NºTuö÷Žr'Ka[Õôs§;ò´ZvèêŽU]ƒË Ùº#•½}ÀpOýö€R6T_¾èô™&o'©‚ÁVåö+¹óV„kÚde½·ˆn•%’*:Æž¢Q¯“ótÝ ‚T経SŽëçA^‰äµ¤ Y{x Á íÞ@Øq8…‚ÄËgVÆ僞ÏVZ g~ëW7jô;¹Y£Ëà m6ed¶××ê-ÕEÞòÙ +›}ö*ðéé´›—PíU)žc{,ß]Î6ö9ÞQZ+·ÔR?»i~·«W–@•)nê6)ŒZ^¢ˆP¶Rž•º¨+[Ê+l0ƒn.ëA¬uÇ‚ŽëHÃòo¯)gÎzçìÁ)¨$(ß*ð˜Ôºh¤mñ$–\ìòNa©»ºžE;Ém‚_nêà9,k[>v‘è>ó’¶b–Ök®CÞ‹ð¢‡ßy›ù)ºÄ4Ä·8¡ŒW|í‡ï Ö(Ø;ƒåhR° öC(8àŸ‘‘—ÖäÂ=3o.¿CÁˆËÕ‚ƒ]ê[äÂvˆB2Øœ›dò:».`E÷®+A[å.AôZWêÞ2D‘æå|ŒÑ©]xÙ’%cÕ4B#ÓX92‰ëÛ^>H¸a«&±ºŒ¿æá¥nÍ`Ï%„¦±–|7JBÏnjÂÓXÁ§uÕÌ­—™ëéžB‡ª‰ ÂÛºò Ö+¸¯­ìÝa’î‡^ö.TŽ©µÓ„„%’åòª¡Ž»…~º¤ÔÓL¹º°´“!wVCöUBŽ0ÜÎÙÝ’ë¬ y˜©Ÿeí,³¶Iˆ–°÷”Yµ(ÎË'11/ñÚÀï_È7…¨À£°åÓÍ‚67Æ”ÒEðniB¬9Ô| Š8ÅÓØ4bÞ:‰Wœ‰ùC^®‡ü1os·ÑDÈ?Û/!(ç;NÃï¾W\äEýOÏ<,«Øƒ'p™wÑÍr>Äʉz­2Q÷3Q/" À`5™a¡ûY»³¿û¸® CŠ‚QànÙÊÎeA™µ|ôŠTvl«ÐÒ˜‹T¹#Lc32mós5•¸Hša]½„Që?ðþ›‘ÎP ~ä*ý©Óm=À*æèzÏK0» æ–óðLãN>m=¦RQá¿PKüH­,œÅPK8A&org/hsqldb/auth/AuthFunctionBean.class;õo×>#.vvvFžÄÒ’ŒÔ¼’ÌäÄ’TFK Ÿ¬Ä²DýœÄ¼týà’¢Ì¼tkLÍhL1F.׊äÔ‚’Ìü¼bvNF…ü¢týŒâœ”$}-úŽ@­4/¤Ä)51‘AaŒRVjr #ƒ0Bn##0²0203°ù¬@ˆfc`PKݵ„¼–×PK8Aorg/hsqldb/auth/AuthUtils.classUÛrÛT]Ç7)¶Ò47CÊ¥ —â[ã”â¤Ðº1‘›ÆN’—Œll7²U$¹M?~ ¯fngèÌðÈGð ÌaÉ× Žöåì½×Úûýü×Ó,a?Œ($‘’q9‚¤#XÄû–d,‡Â! W%\à >”ñQ+ÈHX c k\ÇÇ2>‘pC˜nJÈ2„ ³Vリ™V-]·¿4ªå´Ñ(§×-½É™Ö¡æzdÈwµÑj8×ü±ø=†@Ö¬r†ó5îäIßÐR¥Î›:C<¦Ý×êi –Κ­¯8 ³•‰{ZCoÕÒ%Çj´jt¼äè•Âþ`G/\Â- 9 ë„C§ôgçŽ*üˆ`3LP¶\K¸V‹¦ÁIsé¥ÉÚNÃH—¸CDl0È«ÃÅ `(“‚<>cØ+å´\vGmx8lˆº^Ü*î Ójê"hW¿`?¶ÞÇMå€å­ò}𠆩>%ýø ÓgÌÎÈnoP{Ž®j§n™šÞ‘!£ñ¬Xœšév´IÍaˆÆâƒùìë3Ãå y+üˆWÚßnsë1C,öÏ#3®ƒÂZüÈqæ>uÿ¬}tdÇèôôÍÆògÈ Û†7_~#·,“V¿^­¾Ò£<#J QJÚÁ°<ì5tÛ&(ÿqç`žî²(Ý‚t ˆÑ¥·|âì’æ5’&ie´'`ß@üd¼Ž7ÈI˜…Ÿ®G@Otà#Êý|Ð’¾Æø3„ö¦¤ÈÏ“Æ|($Â,™Ã ÇPn ejü{œcZêÉJ€lÑžm|%80ΞS]—±Œ«ˆàâÈRÒ<¶P$9‹œ+¥ô¼‰Ð˜—pñ” ù%¨ô*N&á-ù”êõy:¡xû”‚»2$¼ãzá]—F±e\Â{]°¿tÁ>ÃÄÞ Îk]Г.èBÊýf’)kS>ìŸþ–"Ì©ÌÓVáó+2FS£ =+N>¡2®Ð·dJ‰Òçg“Òocû$o¢àÊìEÈ"*!FPæ4õÖ>¡ ü⃌÷uÛ „§1óf¿ƒâuPKë™ïVî/PK8A#org/hsqldb/auth/DenyException.class;õo×>#..fvvvNF6›Ì¼Ì;Ff Í0Fçü”TVFÙü¢týŒâœ”$ýÄÒ’ }—Ô¼J׊äÔ‚’Ìü|Ú€VlåaiºBˆ£[Ãö v„ÀÎ v…ÐƒÝØƒ½ö±Ðþ „ЋƒAâõ“ž !‚î žæù f}È‘åµ ¡< 6"‡ÃA 1ÙbÃl&:F‚8Â$WC>„¥èæ…§¡ aT `9Ò0ÒŽ;̱²}I+×—ÜìšÃò¨ã¥•ÄÃáa3ïIwk¶/³Çµ"éÃæ¨™´L{ Ùã¹9{€„n5­\Öôr޽'φ#Â3Ÿ'‹YyYiÉÓ“»Kæ{2ƒrؽ9;çåHåYIr-yéí­2¸ >wßå{|œ¬$ö,•Ê–ÍDïš@+‘6ÖrÄïe‹µìÌ£õqµ¯†ÏÌ u™#»Í>KRR4¥ªç=¡MÇ2r„·Ï èfÁ”¶—ËÐ.kjx_#žƒsiÆ(«ÁµKù¥c:’pä–Ä8š:®ÃŸ˜8ýŠÔ̤DIo©H?2Wº-å#™Å™Ö”_ EýE©@Ô?õMp„-ç@w>ì£ —N1nÃ0øëv‚NïâúÅ:Œ15‰3ø–è§ð…Z ¦”ÆÈ.‰jã¸'8+È~•€¿(àgßÙ”ï*–Ò>Ë&RÁjɆ¢dK'¨7Þ¤OÞIã Îáø.u×hþ _«™×¿0¼æùwü?‰~ ¿©u1?ÇÑØq û¶LQGh*[ÔS"k”?ÎGãߨ›BK)UÓ"%&'Ë7“£È¥ô6ÌâЯœäÆéÔ.¥¸:gtœP¢^Fì;„‹‡PKhñ}V¬ PK8A4org/hsqldb/auth/JaasAuthBean$UPCallbackHandler.classTßOAþ¶½vÛã*P©P= G«¨¨(Ô_(*ŠhOK»–âyWï®*ïþ &úè Ï&ZIP_MüŒ1êÜIÞåvfgç›ýnf¿ýþ´  T´¢+Ž}0Tt#ãk=½*"èã8¡‚#Ëq’ã” ]1ôûò´;£â,üé9qœç¸àŠ$.Æ0Ä1Â1Ê1ÆÀ* ɉñ\dMa³SžS²Ši¡ÌšÍ1D‡JVÉaè2¶ûm·t?dPrvAr^X“”c6p|™ue¾â”¼Å¬¨xóÙ¼0Í9‘’Í­):1å‘z[”ˆ9S¹æ8®0¨W_æeÙ+Ù–«¡W5¤±Ÿãš†ë¸¡áÚºwÝçŽx*k{iÇM†¾]“Âu_ØNat  vM[n¥\¶O®ãÖ3ghÝJÙX¥d¤Ãp`P¯!uo±,u ·qGÃ]LrÜÓpSøC¦mÄ7MY&qèÉM»öOQd³´)°«léê–íé%+oV Rúÿuø Ô‡ÜÊýʶSÌλÏÌÂÜ?Žn ᎒2&…ulz²æ|#(¢ y›6nYÒÉ™´tš6ÎzwnAæ=†ÞºŠk=`ÝÕÈÐY—#CØð+·ië¯ehðìܼpFG,RcÝ~KqWz>Ó ©zÊÔ@5F"ÆlηFE¹,-2ôíÛfZ+,:F¬(½€@†½ÆfÇÀH[L”c±–c‹±=´Ó³k‡2ê$tçöïV%8L×^+Ú¢—:ž.ÇßìdT¤i TET^Âe¯-pZPªˆ)#KèZA|&ÍW Î,£!©U‘Hó*öTÑHjMËhþü*Ê–þ¼i‹Ä ’3ɽËhùÜQ›¥üÙû Û#4v‚ÿA#8ÇQŽcŒð Ç9:Û~âèD 'W… qú.“®’܇a\Bü/PK"Ò)PPK8A"org/hsqldb/auth/JaasAuthBean.classW‰wGÿ­,yÖëMj+¶S%i²iK¤úˆ MUCÁqêÄI\;Mq”µ4‘7Yí:»+Ç„R(”û,G (‡¹IÚFŽkZ—³P(G9K9Ê ïåõa¾Y‡mÙ©ŸßÌÎ7ßï›ïžÑ“ÿ{ä1×â?n†Ó€&¸be8¡ÂÓ†/ÖŠ¼˜Ç4œÄ¸F_ §4èpT¼AÌod8­áM¸SÅ›Åú.†·0¼UC+îÖЂ·‰áí ÷1ïPñNÁô. ïÆ{Þ«a#Áñ>†÷kØ\\|@Ãñ!±ü°îmÄGðQ1|Lh{W#>Ž3‚å>†O4¢w Ê'5| ÷«ø´ŠÏ¨ø¬ ÝËð€Püs>/¨ø¢8{RÅ—ÄúËbøŠŠ¯ ί1|]Å7„Zßd8«¡çÄâA†‡VÐ|[iÛÃfúø-¦“±¹§@ïuîõئïs_A½íf³‚nô¹^69⟰3ÃIÛNîöÌ?ézÇû$Ç -Ç ,Ó¶NñŒå°‚Õæè¨m¥ÍÀr½|BA´ï˜9f&mÓÉ&Ïr²„kó\›¦Gxΰì¤Ç³|<9¿E µU Ëìñx†;âpRy‡Ðã&u‰k)÷¸®`σå áÄaÉ*€ V ä‘}æèAsØ&h3A»ÒšXj‰[xÌs6$–µG@7- -ʧؘù`DèLŠ^7ÔС†VG–Ò(½)‹dRßÃpž¡À0Åpaš*A.¡ŒQ íOóQa5傺#mK×ê¸:ú±WGö‘ê•zm›gM›\ð2XAû?‘·È寍çŽr/˜0â “#n8n`„ô!ûq@Ál‘Ûâ¾_&âqƒrwÁn•ëhÓãF.ä)Ñ' >ž¶ó¾5Æ·FïQcÂÍ'M'0ö˜¦ßMÎÝÉMÇ\#g:f–B¦o¸žáKÁ~§Däò¾T´Ê”eߪcö2ÌèøÕqG(s‡cgÞ²3¢Æ¶ •¤[Θ{œm#.\7r<q3B·J•É}a–’«ª3 Z¡„_]Ù¡ UkåÈ`~þ¬h…½—êË \’±qå{©t©ôÁÏ=YlêK”*·i–vs£–àéªÕäW¸“ê©£Q®®\Z÷¼¬²%o^R"˃ýdˆ‚–ÄR$AÔÀ-] ñvÐÓ³çb—§çk9¹¨¨¥”ˆ,ÚEVóaE+#G-GD¼)Ü<ÅS##ËÁÝ4oç2Ñ'| ±÷ç‡éÎXPJÍ‰ê˜ rÁ«¾j{\º“d>JõU«œ;m  ¥œ"<1ýý²ëÑ#‚2aG.Æâ@I±:3“Yô$(¹ƒ°«„ÚUÕö©uKÁÔäš«nNê³2a[½5CÎr¥º¹®ú¨žÓ¤Û•SS¯‘žóÅVÁûâ%Rã„J ´¬çæG{\ê5¹ tàÊžIc[Jv ý®OEb‘¶ŸÁP•³^Jbî+­ä¯—Eož#žÔýÐc"ÝH' lé$Vcw^u´WIݱDjEÈäÜá«{Û¦ñò©xSªA¤álªQ~4Îî'QÑWÐâ•3èêšÂÎ*R×,Ä/Ï]Tn1Ø ­¦ì:bb­5Éu'N…ÖÒþéP£˜‰¾V®½Ð‚N³¤‹µ,å´uÎa= w0¼^þ›P†¯jšÃõЪéDN3dä?g8 \Ä•¡çÑDߟC Ëò#Äe™£“Wàª+rÑÖóh&¹sÔWR‚¨Õ¢/É[9àƒõ‚ $Þ¢Y½ˆ-šCÛRw›£.WW¦J0§p‰ŽCo,ÚÏ•›X›la€Fu=a]©e¼JPin¥>» ÿPKV3¾Kj‘PK8A"org/hsqldb/auth/LdapAuthBean.class9 xÕÑ3–ì]¯Ö×ÚŽ#ˆ’ìØ² PBÀI08Ž…‡rlä­ KBGâp´´Ð‹Òƒž(´´Ô-´?$`ÙÆ$ vK¡ÜgZz·´Ú¿ÿß6ÔÙC^YkêOyóÞ\oÞ¼yóæmÿ÷‡`þ­êá_Ü GDx‡ÿaŠ ‚ˆÈ°HBº¹WÌM‰€‚ˆ¢2–òXÑ#¢,b™ˆåŒ¨à¦RÄ*†ŠˆÕ kD¬pw븙/¡‘¨·€›…Œ;–›ã\$ÁR²}q±€K$\ŠÇ‹¸ŒÇ'Xï>ó, š°AÄå ElÑ/b³ˆ-ÌðD NÁ“\!Á*8âÁ•x²€§HÄSE\ÅãÓD<]Ä  pµˆkD5Öˆ'ml3ÒL½ YF¸¡}× ]…ç­ÞIñ¤~G®oŸe‡MÅʘtÜ¡àˆ÷íí‹„û|¹Ç4mOFDFئkól*LËïÁž™«>jS*g†¿ Ã#2†1eü~[†'àIžææ>Þ¨ûy£êf ®ËD¢=|MžœÛÂHlOü2í7¢ªÞׯ¥ûâ=†}Ö­¡Óe¼ ï¦ük»a9…øhµRg¦ÆüŽŒßÅÿ¡³Lâ©´ k-2ÞØêé´}ŽšêKsš§ó€÷RÒfRKLí'#[váÜbN/ã¤ÅÌ·³_÷Dh%-™dAàc €®Â Ûy/f ˜yVÏÆÑáùïGX\ÈkÝh|B´Tšò™ŒC˜EX2o*A¹K“qG–ÚMN™÷C‹-íRÞq@8Α5WhPò?þÊLŠBŽª™«eÃ)Ë9Ê„é4³z•/ãEŽ,\«´$K儼ÕôP.ÐX§¦"á\¸¦ØO‡d<Œã3Ûš·[>ÚL”Òœ´Öw’/©d| 'è6’q¿OW’Œ?ÀÇé†4®GÛ¤—Ïqõ¾>5åËÄ´é¥,©Jº]Ȳ ~~Èzž ³MyöX‹ÉF¹!–‰ÒÞ-v r^U}ƱdUOâd| Ÿ¦kQÆgx}ÏòMf8)´o¶ùá»@ÇiáF5ÕôƒŽÆSšokGÈgE €ÏÉø<¾@lyêÔÍßZ:6´vùÌÓ‘wf[“Iu_G„K™Ê-¾s1Kéž^nÅŒÅÑ5/ã‹ø’Œ/ãã2¾‚¯Êøcü‰y’òîÔÖdo¦Ÿ¢Éf`y¨»skëAŸî>Úò™qeåžM´½‘DTà ×âK¨DKÇ»h}-f"Žh)ßšóCm[:[7µ­õ­éj …¶oÞ² TÙòôFâ—ñ§øá:õ…°Þ£Ÿq«™öHWN©•kMñöX"C%1±~Ú×dü9þ‚Â0¤”¢¥ ^Ç_’×R¹º¹*UX@. QÜEvEx’ú…˲º§m†™¹q %¦¥[Rt´§§ðW2þ#àoeüþ^†ïÁ£2þÿ(Ã÷á2<ÃÕȸy–›ç¸yž›¸y‘›—¸y™›W¸y•›ÇaR†ÃOd|ÿD¥ûš mݾÖõëÛB¡µþYÆ¿ÀS”)Ö´vtlÞn|{¾h<¬F}z•ÚdÜÎkùvx•£FÇ ,GÍ›LyKÆ·ñ¯y—àæ»é4Rþs „™X˜‡‚rPa®¶%3íÎ<1 Á¤jDßâYòËtf4óð\<ÄÓAcœ º™O˜MjšžÌK‹[û’ñ½Æc¨ªà¡Jמ~ø6ïâ¹}¹ãS¶`šÜ£F 9aÕÍNO¢9ž§%j"¡Åzæ,¬9H°bš´>ª¦ÈsB¯–&§“5 …’üOÇ­7VqCûF~©¹èh!œfŸÛˆÕ…˜å…¨f;0Î4ûdû{3W¸¬6^%ù±ÅqE…§þ¢¬¢#7i=›¹hjopj3ùÌBôe6#½“Y¥1­7N×<‡×†œ–P „B!ºrhVb­T{z¶ÆÛb{"ÉxŒÓë ÿ¾öæòŸÔèé¦i7Ø•¬ïS“!^U|«gÃ;nrýÑÙB>-Ié×:ÂîÙDæ<ª«^’ùb)€ì›oŸ,w&uƒª6QžÕ¿oì 7kLO+ùÑœó\…»=q,kX~F“î^~«:ëq›KžÄÝ)ªàu Û9TÚç öÚ|rÎt‘L0muÞât$GE¿•ÀVÎ…YÅÌzÓò¤¿X¯C(7Ïý%µd2N°qîøÉß1…Ÿ¬£ý“z“ñ ]>#Åú À'¹¸Òq½&¢gtÞ7 KŸŽB8’Ú¨§Ý †©x”6‰’+u•i”YDèæº£qµg:¹œ®-tO/V2ž™TÎUN^ÿ¨Ü—JkÖ÷¥œ¦wÉsé¶]Vëât©óM,'ÔdJË ¿Ãí0¾¦¨~JÏÂBìŠóP›sS³b+˜mhÚ*~I¥£1kÝÓmŠóÓî9-¬„|MÑ73Æõ#°üݾ<Ãb¨‡»é…ú¨‰kx(âOL:<uxŸ ï7á ³0¬ÃŽšø`L‡šãC&F#…èEK þCþ”fÒ—•×P×8 EŠkÜJññ+ˆ–U”¦@­©°´qÁ”d±ÿ1–ž XÊø XØX|t»êv324 ¡É`«mtOÓu‚2ÑYÝCpìÝ?¤¶ OlIÓx-÷Q¥^àá¦8. ‹,–§UÔYôgfUá³XžÍ±ä©(±èÏ9Ó=ýygúb‹þ‚3ÝmÑ_t¦/±è/9Ó+,úËÎô\œ¾âL¯±è¯:Ók-:=|KtQ„¨¢SÕA|ì~hàÀƒ¥ÝÃp¼², 'TC}¨£,§& ScÐÔ-*þahîlVZ8¸³ØÞ¬œhIžD¼|* M‚¨¬¯E^iâ³p2i4ô² º1X<§t7ã0œ,&&¼z ·Š$O…Ó9ƒn/M¹z»·XYÃGiÎpÖÒhñ$MƒPÆ]å̦,œ•#·ú.‘–L@y³²Ž{ÆÔ%^ž®b Öwóal† ŽB›‚%d}Pƒ³ÉŠsƹwn·W†óƽ4yÂ~ðXTÆlB2³3(˜Ô›ùDžÛ­l†®q¯…÷EãDŽzõÎ(l)‚`©·tÒ¦§tBtÞ'²°å¼­†ójyOΧÆdËÂ6}wºÌLp©·Ô5 ÛI«ä•&Íù/Ðç—†ûa™]i7+¢ýØal¶M“WzdáÂ,¼ß¶F#ýœd²{êx7.„Š t.Q.eMª·x‚¤‹Ga'BŽÔcJïí"y^±~²tžðJú‚Nõ¸N-¯-¯õÜAN’jËÅ”yË&áx»é½dom9-_é›¶Ü[¦¯1àÌáÕ–9¬¶nª½¥Þ2Zò(ì.‚탰ŠÑ:†œ”½29âfXL\Ô»ì6 ->:¢MìºrœÚÈ;CW·ûØl¤åœû\”Sƒž|×Ɇëd×Ɇët’ç^ÚØCʰԯ|Œ¡äW>ÎÐãW>ÁPö+×3,ó+ŸdXîWn`XáW>Ű²yV²ÙÍd´nòqv“?M¶6OÛ«|¦y>»} ê‰zc°Š³d™—À|. ŸçÜÈÃâøB¾è-™‰†%Yø’W0úT|Ù+}1 7yK~inæ;ûtQî÷zŒ>R·xe£OéûVo™Ñ§;ì+Þr£O7ÛmÞ £_‘…Û½•FŸròW½UYøoU£{EcñŠ,ÜT¡—%«Æ¶UxR²ÝÖeÛòx‹Ã:b÷‚”š”õ¤íE iÜ®s¸J£¨±¾m¥Bûˆˆƒ8$¢ ÷‹ð3ÐÍÀNv1°Ÿ‡8*õÖ2ºbh9=¡~»Ú2ƒºˆ·qžê+âœñ.Þ£ž²/»Ë¹Xïã*‘u»!E|„EôàOD|Š ">ÃEŸ‹ˆâ+—D\Æßà[ßá ‡¦[«È¥ÒIvŠ(E|¨7ÇEÇÃ"æ™èGüD½éD‡Çˆöúû¨}âý'ã„FBý£ÔóÇÂÑ@o¸5ÞŠ÷2M16#¶5Þ÷‹¸ŠŸyü"âW\ >µ„¶”•'9‘R'5_(nÏÊ$µX}é´Ñ‰ÓJ¤›-‰âÓº6k_–­˜3SiXKÈLÔ°¢7+üÙÙÛS0)vY™£»û”I9—¦ø5FIŸZd…:­:6ewÌ¡³meû–I‚iÙ0šLÑÓN›§¥¬.†©éŠßZCš–¦+  •£TšÀú[—rH£zÊY´NÙ™­>ã°™¹*³²å±Ä4õ9lºÍ+6£öŠ!UUt+¶IvTNXA/"«2r{ïáñ‡mw IͦZHZmˆ…Ù¶GR¤:ò -“QX­ÍßÕ”ÙF0Îw[Ž¢ìâ _‹ôZV7âp¬1ïú€ÝTdǰŒ±xÄvŒd•qÀ–Yl1S‰cnóǬ–%LžŒÉТ–Í“MD;Lz8¤¬»4›CÛØfæÇ²—eí>/Ö™sÓ¤œ\ï† ½ÍVr˳Ëõ…ƒAlŸ5ähµk(¤ùbXŠ™­ˆéö´2'Š£"»1†f˜AdV4&;›ã±:ŒU’©mŠe³\É4Ýëê!åeZ»¢aˆ·-ÖŽêÞXf„qH7 è¾ã­,ûx¦b¯a˜ksZNÀï?V_‹7êõÅ´(Öfg¡Ši òék5“`®@Å0v[L))œ„Õç·²ºOÆäH| ;ͦ g+œã£Lͺüá ÆÈº¦™Ø.z»Кíè¦#êÌ8þX¶Ã &·R73q”ògžÅT©¸­ìg½³™Æø½1¯UÍyóÏÁF;‹Í }.V`{,¬ÆÒšY^]ÇOJi ™³ù³VË4Õ¬–hÐÊšsQ×1o ÜÜò­UÍCß Þh—ùÿñ¥Ö1Â`3©Áu0,Øz° †í÷w͇»Ê—ÝžìA0ìoCüùý`Wn"Ž#/s‹Ûc5\Œjˆ Â0»sØ—`_œ›.¦{ù9< Õ7¼Ü»üšá‹ê‘XØd)æ·Z9+nŽzþË2gyYÏrÄiy2µœu­@œ–Ë&ëX‰£k9ÌJËšWeÚ[a+ŽFÔMføüd®¶:Ù¾œ\c-Ùvä¦y-ö-ãvס‚3ÆáWœ×ŠÖöæmÑz< —5‹lW\Ìk²ŸidÎU«™wöÆ@W“æežMæÓ6=±KÜÞ§Ì×ìt‰x}­^'šs\˵³…ge±i0ôN=ÔlZ6`ÕY‹yÃ6éN%µ"}v y@ÑÛŽÜ䙊²—j B§¡\LaìV,ª77ãöËß­RŸñ KýF¤>ãžz¼Td¼y©7ðòà¸pþÛ"¸c4õ• †­pü·á†¶® œ‚i‡Õ,ÈÜx;»sí›P^æ£g¨ Qø³wQ)m×µŽaÁw¢‹åùfLbyòÛÂ4´[ãnÅ=•ÚŸŠ%ºû“¡Ä®d Ùؙ؛hèO lo0ÒC}ÛqˆÊsZ»™¦‡¶7ìHÖßÛÝÐß×Ý ;ïQ-‰Ô´@/Ñ›H'º©$¶HmíwÌhR²¯/½¯aéä@/eˆ§t{2m8³é¨ð±ÕÃTƒ‚,ô öbàÊä¾ÌxúÀ¶Á¡]‰tßàÓšêNY£Z{»ûÐ¥áýW™oUéDÏ©ˆÄZŠõ¦Ž÷õMø‡zmìèKã>ÿ³`çKûRˆ#Üeõÿˆ@p™p¶áÊœ1d*e.èÕfV_3ç)Œ–Â8Á3¬“jÙJõ¥Ò û»b fT†¡;Ôí*¬î4í¢±§ßIGAuM;¾Ð¸¹ßÃKy™‡w1¶¢ÔÛÔÛ)¯?AÊ›öô£× £¶*²±j§÷$wÛ;úɆ &úÐvö'Úe<4²3ùú)óœ`?q²íÂÝ;“=iŸÆCnNy8Í{<¼—7z¸‰›MÁ_+y•‡—ó ïãÓszÛ{çá%l>@?þ™ƒí÷ð|fNJb;†÷Ù¥R€ÚÁP+Ë^Þ*Ý<#nDjžXäãDÅÈ åS‰ýÉžþÄP²×úv4´§À´¸zó°æêCÉmý˜·Aé„á&lœ^ÝúÖƒEÎ͙à ¤f¸ Û¶¤­J˜}KzP•ØúTkrÞYË ÔiV¬nVlÁî=™¶NšNn*ÆíØM“h/íÃwÂÓÍïy´|†Âg‚ÏRøSà³þ4ø…?>WáÏ‚(ü9ðy |¾Â__ ðÁ*ü%ðE |±Â__¢ðWÁ—*ü5ðe |¹Âß_¡ð7ÁW*ü-ðU |µÂß_£ðµàë¾|ƒÂ7‚oRø»à›þø…¿¾Uá€*|øÂ·ƒïPøNða…ïß­ðÁ÷(|/ø>…ïQøðƒ ÿüƒQøÇàGþ ø1… ~\៟Pøçà'þø)… ~Zá_ŸQø×àgþ ø9… ~^áß_Pø÷àþø%…ÿ~Yá?_QøÏàWþ ø5…ÿ ~]á¿ßPøïà7þø-…ÿ ~[áßQøßàwþø=…ÿ >ªðÿÀï+üøC…™ß½³Ì v)\.Tx¸Ha7X(<\¬p Ø£p)¸LáQàr…Gƒ¥Âà1 W*<<^á à‰ W')<™½˜®Ž Áíróz7ûˆÝì?F#©Àf7k–é(öâƒÈ|Qq\…‘]ø…‰FÕÜIåµóî¤Ñ·Y‘•s ëNÃ1NCàç&iÇμ[eHŽýƒèAÇà ã+5“jÚìGsˆÃŽK:ÕVavÛ/8Âm¿ëztİ®Ýå'ßOñ9ƈʱF|„¬4âErœwËñF\È F¼¼HN„ºeTÈIБr2´XN–È©Pœ-•Ó¡ert”œ -—³ £ål¨”s r.tŒ¬†Ž•5ÐJY 'çAÇË:è9:QÖC«dt’\,B§ÈEЩr1tš\.O‚ÎK¡3å2è,¹:[®€Î‘+¡så*hµl„ÖÈÕÐZ¹:O®…ÖÉuÐùÒ ­—ë¡ Ò] ýÐ…Rƒ.’MÐŲºD¶@O’:t©Ü]&[¡ËeºB¡+eºJ†¡2]-7B×È(t­4 ëd êÅwÔxùzÙõɨ_n‚j2m’Ðf¹Ú"·@u¹ºAž m•]Ѐ<” hHvCò‘½Ð2 ÊmPCn‡Æäh›ìƒ¶ËÐy*t“ì‡Æå.h§€n–ƒÐ-r7t«<͸†päâ­ÝK©xyâ.JßN\ÐXuˆ†Ž\C•(eüUµ¨ê0íé8À|ã±×jÆ9 Ö>\÷Àmär5º¶»v¢övºv™ŸÎi« Â\Üå£4Ñïfã¨YÛÿPKt/øâ óPK8A1org/hsqldb/dbinfo/DatabaseInformationFull$1.classQ]oÓ0=^»¦„°¶kiÅ€m Ú3Ûk'¤ªlR%Ð&xw“ºJÍv*ñ¯ÆK‘xàìG¡Ýd›(c‹ä›ø|ø:ç^üùõÀ>^úðÐÈËzM-<öQAÛCÇÆ‡§ •¥•{ÏPêö¾2”‡i$ic2ÍÐéö>NÅ\p•ò‘>ÍÜg¤˜õZ7L"tÌÇS:‚k‡:LR«tüIºIyxàüϱÉð†§&æ{–Dcn¤M3JË•þ–š™p*Õom8‘3±K[¶ñ"@€G ¯—¬Ñ8·ð‰±°rô×”%É«=0#­¥&ÂZi귯˰Y@V†™Qî;?1j®Ëhæg1ôîÝ“¡KW4chþNæÙÜ‚HG–Ï×) ìU¶Ô´»d&Âìß=¼£Yzô«Uv‰%M»‡ôÕ 7¥€ÕŸ`??,Ïñšnc¥ ýVÖK ”ÏsI}@šµÿŽX`µ ÉT£ZFê“ÜN‚JÁT/PK†›#‘ƒsPK8A/org/hsqldb/dbinfo/DatabaseInformationFull.classì} \Õõð÷f¹<xðxÀ„Ù€D£ACÜ„H€ð ‘h$HHD D ƨµ‹ÑºÖÚj5Ö­±JÕj5*ƪѺ¶Úª­­[«mmí¾¯“ðsî¹3ðXmûï¯É;sî:w9÷ÜsÎ]æù}_ßÅ›k½ í*úmø[\ˆà"ŸFp1‚K\Šà2—#¸Ág\‰à³®Bð9ŸGp5‚k|Áµ®C° Áõ¾ˆà7"¸ ÁÍnAð%ÛÜŠàËnCp;‚~_Ap‚;Ü…à«îFp‚¯!¸Á}v ¸ÁD0€à!;<ŒàëAð(‚ÇìBð8‚'|Á“žBð4‚g<‹à9ßDð-Ï#x[üÛ)€}Á‹è÷¿ŒŽï¢ã{<ü :¾ÏÃ?àáWyø5~‡ßàá7S´¥áFÂ? ¿akÃo[áGØêðO0öOSÂï„ ÿ<ünjøá_"ø•þ5FüM„ý3ü[Ä~Ñæ…ŸþCø˜òOþl…ÿ‚a„ÿþ{„u†ÿØ?{/~?¼±ìA°Á>ƒtiuë!(…æºÎuƒë&×-®s®§@•ôÆI…wëvDOÓÓÑ™ Ñ3õ,±ˆž ÅÓ3¤éñHø=£äB€žËõ<®;\Ïçú®O´ôIvMø'˜e`údh½ëS0ÉAæúT®‚Ó,}z*»%ü;˜Õ ®Ïäú,®q½˜ë%\Ÿ¯›ÃõC#úaúÜTýphýhR}ž¥—Fô#õ£0d>×˸¾€ëGC‹êÇDؽú±\?Çs½œë ¹^®J®Wás×cÖK¸^Ï¥\?ýk0é2®×¢£Žëõø\Žž \O £‘ëM\_‘èÊýD½9¢¯ÒOâúÉ\_-} ×[¸¾&E[®·rýT®·q}-×Û¹¾Žëë¹~×;¸~:VገީoÀL»,½Ÿ Fá_EØ»ú™èÕ=­÷â›úð›"úYúæˆ~¶¾CÏAp.‚ó0ôcØEç[úÇ#ìïáŸXú'ÐýIpèŸBp‚­ñBK¿ŸŸŽèë—DØ^ýL®_Êõ˸~9ׯàúg¸~%×?Ëõ«¸þ9®žëWsýì?dúµ–~]DËзYúõ-Sÿ"€ð?RôôÜ„àf· ø‚ínÅD_N:܆àv®÷sý+\G6¡ß‰=qWDÿª~7Kõ{¸þ5$¦{±&÷q}ßÏõ¸þ ׸þ6úN®?Ìõ¯sýŒû(ÄE:y »¸þ8ןàú7¸þ$ןâúÓ\†ëÏrý9KÿfD;(Y;>ü;®‹ëϧ€û¤Ùosý;\‘ë/YúËèñ ‚ïÃ@Ö`é¯bK¼Ñ_×ß°ô7±³Ñ$|ÞB£ãuÌómŒøcô1±\ÿ)H??pÍ¿ÃõŸqýç\—ë¿°ô_F´6,PV¿Mÿ×ÏßDôßêÝï¹þÌñ84ÿ„àÏ\ÿ ×ÿÊõ¿¡ëï ÍþÁõrý=|Çû\ßÍõ¸¾‡ë{¹¾ëƒÜ`ÜиâF˜:7 n˜Ü°¸Á¹‘Â7R¹as#éÜÈàF”™ÜÈâFŒÙ܈s#‡¹Üȃ÷‚|x—1ÁDhc’¤d²Œ‚ˆv“1A!†O±Œƒ"Úvã`tLÅȇ 6 Át3ÌäÆ,Ë(Âàâˆv—Q‚ž³ÌAp(‚ø1Ÿ‡+2ŽàÆb,7¸‘€n5¹Ñd+"Ú÷•@ÓÆ‰ÜhæÆ*Ë8)¢½aœŒ`5ìâ7°‹ß0NAЂÕXôj´rãTn´qc-7Ú¹±Žë¹q7:0ðt,Ø:#Æ£ ýºA¹q&7z¸ÑË>nlâÆYÜØÌ³¹±…çXƹm·q¾êcØçsããÜø7>ÉOqãnl寅܏ˆŸÆL/æÆ%øšK\ÆË¹q7>Ã+¹ñYn\ÅÏqãóܸš×pã X£·0ݵ®ƒñgl³ #ò/"¸7℈|˜ð 7#¸F“ñ%nlçÆ­Üø27nãÆíÜèçÆW¸q7îäÆ]Üø*7îæÆ=Üø7îåÆ}ÜØÁû¹ñ7äÆ7âÆNn<̯sãn<ÊǸ±‹sã n|ƒOrã)n<Íg¸ñ,7žãÆ7¹ñ-n<ϸñmn|‡/rã%n¼Ìïrã{Üx…ßçÆ¸ñ*7^ãÆë8’ opãM¬,õæ¹ñ#|¾…àm?æÆO¸ñSn¼ÃŸqãçÜx—¿àÆ/±¢¿Š¿¦‰Þø `ÆÍÜø-7~ÇßsãÜø#7þÄ?sã/Üø+7þÆ¿sãÜø'7ÞãÆûÜØÍ¸±‡{¹±ƒÜdÜÔ¸âf˜›:7 nšÜ´ ÇLÎÍnF¸™ÊM››iÜLçf7£ÜÌäf7cÜÌæfœ›9ÜÌåfže:‘ÐPºÐБÀ3Ÿ›¸9‘›“¸YÀÍÉÜ,äænÄ̓¹9•›‡psÄ5§#˜㜉Ø,EŠ” ˜`‚CÆÍ¹ø<ZÃ<fs7Ká tÊ7´Ì£"¡'Ìù³Ì\ÀÍ£¹y 7åæqÜ<ž›åÜ\ÈÍ nVr³Š›‹¸¹˜›K¸YÍÍ¥Ü<›5Ü\ÆÍZnÖYf}$ôšŽb™þ7—s³› n6r³‰›+ Ì\‰àDn6ssÖÙ‚y2‚ÕNAÐÂMœze¶róTËl‹„~R޹Öl·Ìu–¹ž›§EB6;,óôHèoæ–Ù ýÃÜ€  €Qk™Ý³{ûZûÚ7´wõ-kݨ±É5Ý=ëçœÖ{fçÚSçtvœ:gIkïi²±}mMGoß™Gwtuô«±¼þ¸•­}­§¶ö¶/˜¹BczE÷Úv¥­oïjïìí÷²@ŠD{ooGw×¿ßÆöž^xÍœzñ„R%úº{ÚTÏôÇ¢ì (i‰¾Ö¶3 t2ÿh¢9ÑXµ¬¥¢¼bIUuí¢:Õð+“¼„dhnb,s#ˆÂ T[晛辶®¦iYmK¢jySUmEUKS¢|q•eBõZfŸÆ2¼xË–UÕ6&@4ѤF:5–)Cëêê«««–¹IcYÒ;Q•HT×Õb­,ó,•™ô‡È›-ól @ÖR™5VØØX¾°2Ó¯·Ì-–yŽÆ¦”W.«®­N46`HKC€ò¦Æ%u Õ«Ê13hÊòúúšê /x¥vtõ¶÷ô5tw¶÷j¬j̆mæ÷ééXZ_ïœÅ=­]}íí VÍ\"‘ež«±Hy"•¦w§-LzÅ’ò†òŠÆª¨.¶Û75V]\q´e-Ö£º¶ŠÙÔX]ë6»þ*ˆA–y´ÅИÐVƒWBwÕˆ7€£±˜ì>ù \”oeÝ2HêúFÝH•®—%¼ ´¹¾2ù3ƒ)fsË<_c9¾(Ô=n.Ù•åå-ÍõU@Õ+ªkªcÓgÉ×ûêožPè𴪚*$*J›€Éú«uíÚÆ-Û«»ÖÁ8/™qRÍé­gµÎélíZ?§îÔÓÛÛúÓQ{ç`ÂiUµX°J·÷Ó––7´àO–Té䄪æ!M6yYt_eK¢¾ª¢zжqK=ô Ta¢x²à[VWÙÌ/SúDúÏžQoAÃ2?½ÒPµ¨ªZ¨º¼&ØŽY4ä;7”“gŒ<]’r}3ÉW¼ÔõË ?¤„`,*”ç—íf¬[–ë­*R e!ü}-wý„Ä亃Œ‡ê ­Ä¥/Š'`h,гÌOZæ§`2H,¯iYTUÞØÔ€á¹è¬^V/HKô£`«±¾¼â„rêŽálÀšFOT¯ª®] EPdl‹ª©{2E½`V›¨qI!»±¡zñbðd:Ð nÈÐfpý‡5ƒlé ïÊ“({S= @·“ó`¿ú /*º5@‹MÀºZ*«Aa*Åøƒ*®¨®Z9¤ðõ—¼‡” ™°»šºÅ¶ù6µ-<„vÎZ˜;°Å讨ÇVd(‚¹^nú4ÏÙæ·Íûmó;ØJ/š/$h›/£ã»X²ï™¯€`h›ßGŸ˜¯‚ˆh›¯aüŽíõ†y°Ÿº…K«*Õ+Ó¤‡ûÂTé–%–.äA$‘œ©±I¾F^{jÈs*«©›P6°Í7ÍÚæÌ·lómójðEÅmóÇXΟ˜·ÂlüصmþÔü:Ì~ùzjC«*àÍ’ÁA¤4Û %®ÃBeyXäL!à™ðô§ZQ^Óð¨¨IÞ Å^Û|Çü°øµRû˜½±§Ȩ¯£DîM¶ùsó]’/cI„Ûü… r_T$úz:º€oþÊ6$öóQ`« á C%‰ÈVWÚæo‘¸~gþåצÆ:lïjÄ klÀøÆ¢òšŠK8IØæ±á¢n Uå•uµ5Ͷù'L’‰ÂßÂòD•/àÏÀÝÛü fÀ«+Qi„ð¿šÃ"ü…䦔o m Aé3ªubR-¬©ZQUc›ÿÀNýùO(tõâÚº†ª Êø=*—ÌöU‚x˜m¾oî¶Ìls¹tÛ܇…p[¢¥º˜Ëkôª Uq`¥Ð¤(º“W'ZHå°-fi(ÈêAÏCw6¶¸ÕÒó›Äùá Ðb>—ä‚Ñ•åÕ(V,ªƒ™}I5ÎÍøhñù« µø*” íQ±Dr\+d…-K·-Ã2mËÂF(.wlh5yÃFäL¶Å¡ÛC{­ÛŠÀصR-úÜJƒ^´ÒAÁ‚ÖµlÐÅl+"ZQŒ“ neÁ¸¶bV¶mÅÍ]Às‡ÞÂMëÖµ÷À®XÙVŽ•k[y–ƒ ß¶&´&ZÙÐï*›šî®õ¶5É*°¬É¶Uh>ýàq=lSÅì@Ž"U#Q×Ô스ÑÖ)4YÔ—7.q'`hu•$ÎÁÔRUr{Ê×ÔÀ+ÊP;óûÅkêj'ñZl$3aC'&¤Œšš–åMu@:ðnp»¸8Š:¶5[ð ë` ýÓLûÙ}bª±¦"=NL2“`1‹X‡XÓ@ÿµ­éæÕ¶5ÁL³Yé¶UŒ ÁlxŸ^ª/´Ò  $ÃWÍ¥4&ˆÚ†âQqÄðÔð!¶5Ç:Ô²³­¹æ»¶u8*Ü\•°­#¬y¶Uj©±Pmme͇Nök‰.{Ïôyº#!Ãç'^F-Ú éï¶U†. 4zÔmjše¶aVPrɇxâda[ ¬ysFÔÕmëhbjØÐÁ}\?;èïÖ +è-Já‹ÛP…¼½®º§0¶ËZê ®\¨JyS éÑ5$˜»¯Êâ¾,{h€x]Þ°A]qZkOo;ÌVᦠ`FSã¢ÃJmëëXÛ:Î:Ù´TOý3¾ë¥f|×G¼ç`ß{–À£¶uCû²Ö®Öõí=S]7p@…ÚÕ]]í=­½½í½¶u<¾¾ÜZh[t`L ÛÚ7ö/¨²Yæy¶µÙH<©o[K¬jËZj['`ÏÚÒRSíj[5Ö2ÛªER'ؾk QU*?·®éÊKb}yeKy#¨O ›q|€»PÎéùü»³³UT ßjÖÖBÛZn5X “Fó]¢c$à›£•@"µ8KH•ʶš)¬@°+˜îZHnƒ觸pÈË•‡ßÿêlµák%A³¥¯¬~²ø*¬ ‰¼øá d´ÚN¯­›>bE6i Ÿ±B>ùW8ÜʸÒïvTpÑä#¨Âë#V!h õÜnE|æQÏ!*r`²øó¡«f[_1_²­;ÜiÝ4ªJ¼¶õU æ¥{¬¯w«:±ª.ۺ׼öîC°çÓûÑfœB&R1×y^ð¾tw}ÕS’¤‡§$I·4y“`P’2Üì01y¸›~òà$y'QÄœdáRN&•é@¥’)ÖÄC”삤a¾Äq’»íá$ •¦?lˆVŸ7<̓ʆ‰ü%K”>­?Ð3C-§ã$Zô´@£hÔQöZJ}C]EUeZù¢¦Z¹”À]^B,0ÛzF}iùŠrÛzõ“#B=Ô#¿íg¢å\¥CòÉò¤«n%ÅäY “[I'&÷HÄ‹:6lì¤ý‰d;lÁÕK|gó×åD%bnlm;£u½(’^Oö¢47¤§¼Sä^Lœ*q‘G†W}oÑQ¤íí8§£k=&ŽÈ,¢‘]‡l䆪åMÕ *µßl/ÈÛ ,¨ÍBí¶îªêŵ…'TFü¨u-xl±¬¼¡¹c¾=1Š~²ü¾ž…Ôï)Š4Q®íŒ@†’{Œ%i¨Ì¸±¼aqÕˆô=!i°—qÒP‘q~ f²n¶N’@7ÓÜ$a²[½}DžVäírµ"×C¤ðÛÓA[ßÞSÙ¾šféZd|µÕõM5Ò@™-<‡.ÓÇÞÞ:HÀWÚm¹ªY×P‰Ì#*@=•RZr½|K˜Y^¢jwl­KO˜ÈÀš/ݮյª¥®¦Ò}íðÀZw Û¤)êV& ª¥ M+më1´™ìBæù¸õ„m}±'<…àiÏ xÁs¾‰¬7ØV®yÿ[hª{×Í^ »¢´}{è-nVYÙƒû“{ªûp¯qw®Í~Dz^Ä'ÿDãÄÐíY~ãİ0eœ$‰4i~U‹ëšå'ŒûrÜgHm‰‹ß‹ªi¾I£>–kÓË@ìõÜ*ƒ<Ïo˜:Ÿ;,È-k|XˆÇ”Ü^,(î.÷™Ÿ³ â0Ïtœ…Ȳˆ–t¸köº¨ Åk[ìrsK˜JN·T)ä’ÃÐ×e+:Ú7ƒ…úµ¹FåZ}2 «„> …¨¹;V}y¿7Ù†$…û¼‡de[/!ù½L”…b3j LT”WVUÚÖwQ ø‚Wàë$´ˆmÕ›™dGÜ‚‚[jz6ÐdµhSg'ÌTsfi¬hÜ ¦fY¯ÚÖkÖëîò_G÷œê®›ú}=í­€¢“ø6´·®Å½‘êD]ÉQGÍ›_rŽƒ7€¢ÜØ5]íb]@DÆð7‡&Œ¶¸§{ÓF뇶õ#ë­ñÖzYkGÈhco±j»ønw—!0¤®ÊÒ¾VîK ¦æa® .b‹ê&ÚÏÜÔÞÕÖ¬€[(\#pkQïí î5H¸g$`”lß{`‘xkp-Ø¿#÷¶A%ú@¬€÷dª„ »»;Û[»‚Æs¬=U9¨rWo_44øçJ¤B P¡“ªƒéÔšÉКH£/$ÊÖš¼3‡y*íîý ì´ûZÖ±OëéÞ,Îk¤¸Ûå@¬4Å1ðìÝÒKû:z)³$Ç>2Ýî*:Äœˆ9ÒÊ;öS —¾ö…P–3䱑ù3Æ•6éßÑdH@˜#ì©‡Šµ®]+HUcÇÎHrRbX»²=?ÃU¾PíYˆìZï¢ýYÉš?äúA‰»Ú7ãðõïá{ÌžÙªàQœQZ:_´t}Odž֞-'´oñmÑøÚü¤êUX[îîïÃÍEÉ©$ñ†)·—*åÕ58i˰Á5D0]Ž[Ñ<ŠOMœl?ƒ,­ÓZ{kaÈÓîìUØIäÈž1sø~D˜?×·÷5to–̱,é ›™ã9»ód%÷î31s”c8PJˆ,z|úŒñönnG/ÎV[ÊÛÚ°d@À ·àÑ Íçp‚æàðbÚŸ¥±©3’Ö,°^†AD0cxóQ~^ÇL˜1Z¿dÀ‹«6lìƒ"oÆW`–3“ì>Eaašú::Eo)W’÷¹ T\ÑÊÁî÷Fin[kWwWG[kg]Où©½À*`ô´öÜ-É@Lšok-¸£o \upä÷"mÌYÑÚ¹©½fÑï¸gFÏŒ¥þüÐÏ׺¥¯½·ÂŸåR(½ÛikE#Uto ÞÝ}­"lagwÛ‰ŽspȺ!‹zÚÛ}þ™Ø(®—Ì%]6ú×wcO§Î[¯=àÃ|IºùJ:pñɼ)­îä“ c·z-duwùv>ÖðÞEÝ=åõÞšû°ëc§ †ÑFPžÁ1ØÑK)š@¼C¶IŠç1œßøeö^‘¡S!ëR2Ðf‘ˆ„º»ú€I÷Ê’Àèèì^/7 <Ļ俵Ž^5þ±p#7ŽÎÞö>9寓ÌØ!V[÷!gÙëedœò@<èèz6FäÛs†(Ž_d+IÎC’Kx Do6õ’~¢ÏZ¶E0„œáZô” ÍA“„d/«¡ÀA94aðb‡bà)¹ï£Âu‰`PR¨'¡yÎÂDuë°—&eØ#›úº+ ;úßÁ Ù ³£…úº®Î-PåÖM}D1®T £7T þXÓÚÛ§ˆ)ȳÕ,™0UáÌ9! CÚ<1$e´mSO1O–Ï dæú/í¬„ ©ôùeõh0n±°®®¦ªôÓ‚áÒ™”ߥ¼ç–Ý"’•]IIÊî¥ÌBzé Q&ƒz‡ŠPž|0‚~Â;z+:»{Û׺ ¦« ú w¶ƒTÄ´‚XPùÚ ¨¼¡ôà)#93Vù»Jú£È•ÔWƒ‘žÒ 8”z´kYÇÚF7z[ÛD÷c…|b>ÈÃrÉN"Þ¡vÉflní@}IÕ~ØAõaUï¥\­¾nÚ½„a0Ñ~Ôµ'ñŠáT)¶å/ÀÐ$cÎ å}ÝîpMÇÒ¶¯U…5€ìÛ`Ÿ2´ÐÄá›6VvoîªÁ(Ïä1¢H©IL À‰º3ýœX2Ù™ã<¢¼Y)ò½D÷¦œ%pNOÎ`‡F$â§¶¨êjë^KmZéCgw"Lí a¾¨£§·¨sù¦î>¤ÎT¨Ig§ëŠvôV¶÷¶ù‹–©D[o€LMÂUc¬p¬8‚O¡+õÊ4){]‹íÔìÉ=?eø41ŒÃëI²š…595{Ÿ¤ØÃ}‚rK@8Í€‚ΠÄKzÉ„‘|-g"ô’pˆ.©ë¡*¸-OÆ*$e5à^¾Þ³ä`SVÕ.Ä.oî&õŽöNTw­m?{„,¥4 ÂÑZšxH0Èö1LÉç]Au=îF ?ýˆ@˜:QC”þ8_Ôu ­“2§òŠ6ưÚöÍIÃr‡¦kèÞ¬B©¼¶ÅP¥:#ENVªJy×Z—c¬ìè;­~өعÈ;< —X/ž7Œz=Ãõˆ¨ÅæÀH2²Å4îNéîlZ·QÌøÀ©¢SÑ CfWÙÇ eŠÞôÅQž4|…gÌóô§/ ®ï…y ¦ó-sÄ0BÃLK`Öv{¸ß’X¼*°\âdóÀ,™,¸2žDÁÖŠ©Èb¡›|U¾C—Ë$Yؤµ)$À^’´“è‚C®Ïc‡†~Ú̓IOp¶Œ1¼¥‡i¡Ape±ücÌœUôÓî£ Ku¼SF„‡ïg:ücáĤ;éZÞ¥2à·²<~ ðkþÚzø­_ü6Áï<ø]¿Káwü®ƒßÍð»~wÃïø="Ó> ¿×à÷-ø½ ¿·á÷.ü~¿¿Âo·ˆÒàÇáeåÀoü¦Â¯~sá7~ÇÃo1üješ&ø ¿Óá׿3áw6ü>¿‹àwü®†ßá·~wÀï^ø=¿]ð{~߆ß+ð{SæùSøý ~ÿÀÖ?l£TÀÿÏ,'ìÀ¯~Óá7~óàw4ü*fÀ+è]< ñ0ÅÃ.)âTñ°Å#M<ÒÅ#C<¢â‘)Yâlñˆ‹GŽxäŠGžx8â‘/Äc¢xLñ˜,…â1E<ƒÅcªx"ÓÄcºxÌ™â1K<ŠÄ£X&=ÄN¸‡e_-[úVc~T@ba HÀ¡f²\xÑ…³`5ÑŒ¹µ%ϱÏÚÁ–>Àjkg•dÕí`õl9` ;XB`Öäa+[‰²¢DYeE]Ê:g;WPÇyö1;ßÃ>îaŸð°O Lä¤'.è©Y×ëš £®Ù4ëš-«.Lô5k€} )Bvý/“Ä”†qÁõÌì|‡è œ[‘LØ…ÛÐ÷ÛèsQij¸43žOÝÎnwÒâ@tŸ.Ër²ØÅ˜”]Žè%H¯ìÒçÐç'ý.`—SŒÓ‰ÄÒô0ø»ŠŸpÒuÌý37_/p“ Ü ¤àøŽ+†/D’Pø–­™Zÿ`sÿ`ÜGX?`©{Øgˆ° ––¼[¡3÷°BðÚËâàLd)I©E“TQ@€€4ùV8}e²Øè‘­p¸ÒARdëÆ“óû Š¥¸@xQ—ðµH°@€õDx™Dxçáeº„÷YŒ®ò°ÏyØç“àÕ‚ Š\öƒÜa×/ûB™Mtq"‚î´Iˆ¹tçÛµD{o;6:®Ä–.͈gÄÓ·³ ¶ $6"- ˆmD]MDM©Nj€šR}Ԕ꣦T3ëz€–Ì}¸›N*NΘè‹úÍ,S¦¦× ¿Ÿ¯Cü†ë™-r»…ñ¬û™‘uB£·'¼Ù{uÿ¾K®ÍB¶ïµû”×b· o±´‡Ù—4æ–ñÅËø0ÛŽÑd)e"Ñ,·ªy¹©b žãD¿cÑ=l+ ¢ôdT‰4i…3qHL¥aÕ´=lÐün¶|73rÙq,#i:‹Ý)ÁGc!+œ¥ ‚x=Þ˜ÚØ1ÃÓ Ç™3jÁÓ¨äÙ»YFTÜ[ §›(ßka[1[4¶bîØú²'.Üæa·{X¿‡}E¨ØeG” ²î(KÝyg™uPÎWfwà Ÿ†]FTrbD%÷Àÿ²tœ¢€õ|zx.ö¹ ´¯ÏÜ'ؽì>ôœû‹!ÝÚž÷0éÆ\9\å#‡ó˜¾‡õ9LdéÃZšþÃ#GÎÕ§$é'‰z*GtÆÌ;;èž\oÎ}ºä;í{Ô=ÙÔ=Ô=Ùn÷ÜïuÀª²G“Ȩ uGg=˜€ z;ÙCÔa‹ Þ)ƒÞ£üë8ÊIëQë±$a»dØã£æðƤðQ#>©">•$øiù¶gv²g“?GÁÚûfòðoÉäÏïd/$ þ¶ þΨE|ce½”(z€½üûn™á(¹êºc °ï©ŠÚ~Ã"{X QÛ|føÉ‰ÆcÃBÔÐ?îÀ’M;°d·H²=ì0+œ‡J²7­ÿ€q6hü¢í8Ñö#DÛq—¶_ñ´ïï`?Ø«ÞþÚöºÀvzØö¦—ö‡^Šy¡oy¡o{ãçÇöû©Òrâ£)ÁyPÊüYYV¸4;Y»¶kÏ8Yq¬ÍÏQÜÔî#WYŒ¨%ÛÉ;1{ Adë°w›Ñý‹löË ±_ƒŸîÇ1ùÍNö[À-'F¤õ;À9â¿ßÉþÀϔ堚u²AvÌ`9G9þ‰beGSÐñg¡¶ö—²\'÷Y–!–“KSgv4ô T|À þ:Àþvk~„ý$Ÿ”å¹~±–9äpœö^¸4?žï8»¶³©ñü›@?Ë‹‚úûþJ'ÏqâùÐl÷Ê­ù м‰/qòØô‚=I^°Çÿ‚=ò‚Tõ‰yàg;yÏÁè}©Ÿq ýV3í¶·cí`ƒiŒÆh6JMq­ß|5RµƒYæö4Ô –“LxugÝ|´À±ø ëI®Æyñ0„Ý#d ‡Zá‰ûØ+ ¢E¾–½›ÅÞg)ûXIÐc|gœ¹B†8î<Ñc?Ó©Q?q<~t†~Ëéë1iŒø) ñâÏÐÏ‘C<¦iîèŒi¡áJcL »c1¦é 5j*ÔR(WhŠ;êcZD¡© µ*Ê5ªäö vaÆÈt2¥¤²1©€úHfŒlPõ´´mƒoÍ*B,¤Û—iüÇœX@šé¨ ‰;f .$OhZˆ•ìOh™eq'þ,û„в`ÔÇ,´m€#F¶wrвAFð€GÌB,1 ÍE,±<â+1àp¤#ùÒaËLØÆRvhû™¹C›DÃ$Fþ o6{ /ÒÁ$¡´¼}l®P ù ûÆ(E($KAØd+\èthÿRIrž²e±ÈXÅR>È%eöY eŒ³‰H9—HùD"å\” ÕNVh¡2l䎇º€p~³¥Ï**A¥HH›âkÞÚÃZ¡¸ Óã}ú²t—ÉÒI¥Ëó•.oü¥Ëí‹ba!ƒ%ãL%c!¼­Vê)h•€ÐçŠi<ð¸¾Dd¯4 \–⤉_é…ó=½ðÞ²Ôb*¶c‡K´©Ú! ÇÖT€FL›–(.rHÝùý©~Öq¦—¥„K#ñˆ“óÇvÖà¤Ä#ÚŒ1óš©ò’¥½@›U;«¨¸$Ž}°5ÓÊ÷yÕ=MSXªKB ùLÓˆr€˜¦ý¼ÏŽ íeàLÓÞg'BÍðúëóÐ_)ðÜBýåPuQ9^©N*Vh‰BgïÐæHôPŠ ÆÑ‹Cûm3 ü,ƒ×o&³ ôV*`>°Š ˜ïð0U”¹ŠŠòG“t´Ã´#PZ–~ƒ~ÄUÈf¹AªËÔ,¨Y®¤f™à5ËQªYæ+´L¡ z´BQè± =N5ì„ý˜š¢é87)«èm®UT;~˜­edã¥V®Œ—ÚBi¼Œih·Œi•d°$Í;í­ê9–GFËt}.Z/…~ÝÏ É#< -’–MK¸}–ÍþÁ•¾~,eævÍ!i£Ú4§Zá¢=ì豉ï?gø5)z¼%Œ†Ú õÔDê©‹¨§&Ž„-Vè…V«>™8¤O¢frÛa3çÁâ[˜¶ÊåyÚR슴Èîõ¡h5wQ­·ÁÛ' ?‰±ž"31Ù*™›ÚЖ¡0’ÒnY´ðj'BÙª­-(Z½y3«ìiü¤¾R&%c4†¤ép˜;\ò™“2p ÎÁ7\?ø.õyŠXÊ#–ó ¸´‘üwáÚKz<×^Nq"ñô¹È´e}TD)®¤L+w} Þ LÇ(ËðH!HáKýƒ-.gLÃÓ%¾1yËieH[å[/çIn¡_&ÊÐNöÊG±Ü Pîè\ß:ã²B&«G-k¦WÖ(”õîþÁv"Û}š¥E€lïÔî×\²Õ®bY{X§$Û”¡”#ùâiÊF}R&¦‘¾†VãQâ ™R¬#Lj…J#®ñ”Àœj#G â÷p!2-i\?‡/„¡”‰KPÃV,…i+BÙϦ‚VOÓ+ ;B¼|1Ï$ƒ8PHs=WÓáYIc±À7 ¼±xŠu- ]£ÐV5 Æ3éÇ´SËl—¾3‚#²M’¥—ZKm-d “`íˆE’°`"Ø‘*D[Gâש ûÅ´õ¾Eîm;´Ó´!Ä«×Ê‘ÓN‡·pOžã=¶/ã‡|Á¨T ¢Ï.¸Ü8†½µj¸…úüpi'›¼RÇYARG}¹ý;ˆá“2HÃd"†"†Éû¹bÓÎPBÇäýZ÷ñiR¶¨{¾‡˜äÓÀÎ||:àÓ ;uúM ÀY>-ž†øEÛÙ¥ÀøÒpý¸é€¶fôˆv!'}–­%‰«í ¬i Ïv'ñT`îcF<*Äáa¡x™;纬ò¶­i{úgùhe šÓÏ• 2’dµÅã‘},…æW±”·‰!M{­ö´›æØyž8¹º2^±º²ºòóÔ•…Þ¸îV½µQ¡gz½9®¾Y‘*­‘¥Êæ¨5[!°Ë2=ÑÿÑ¡".*M¥õܲh¸4+ž…SØ5NZ< {2æÄ´ßDÈúœLÿ4ÈÖŽ¤.xÓ¨ ˜@ª X>‘-]Šl¤ÀK{Õ.‡,èÔÓqaZuêëŒïa7P§¦Ž´Ñ%U<¦!˜6ê–FÖÍi4cLaÙ£îW˜-ãŠý »ÙÜg1Ú™¹˜9Æ,*YéDvÈòˆ¬OQÖ&…žµÿDvÐÿ "Ûüÿ‰ìßBdGºD–zÙÑŒ™ÕDd#‘…Ž&";x¿'¥³ÝU´˜¶EÙÛÏQv©s•ïy*îÇz¾B?®ÐO(ô“ ý”Êìå{”òMnnS܃o9æbÚV…^¨Ð‹úiUÞ‹•ï%ª¡.UèeªB—+ô …~F¡W*ô³*‡«”ïçúyájå{*ÙÔZçÁC˜ñà:ðøƒØ}w„s„àá¿#&ùÀ<’'æá–»##Ý-w¯¡ÏE¥‡‡KçÇçÇß~Ü™Ÿl¡Ì)C¶p”s$ Þæºð6â¥Ni€”ê˜ÐK ÄÅjI©I‰nÅçëkÄRg)Çܯ$Š1´ëHœFâìLôµœ£´m „×ocŸîõ€öE‘:šBŽlí†é ”&šéõ„vÓ€v³k4+f)¯…Ò+L”-cÜ"äqôŠ+/ÌýÚt,Ò—¶šY`èöíVY©hIÐb~yË…~³±Ì·aÈI ŒœŠá·SÌ~ö2:ú±KØ3ˆ~eˆ8i^ˆóU ¸c;Û'¦Ý‰™¤ãïZ‰Ñ¾ºS»½2ü Èà Ìàžm¬0ysŠH‹0Òׯˆ4#Ý»9à?ñûÜ&€‚í š¯ÚÆŠÁlã\ Z-yè“ ›E'˜ ߟ`‚JP¨!œD°€`!ߨr„Äwq´„Ïéø¼¤lD:ØY0 =@‘¤H˜t*ú>´SÛ‰ŽCÐñ°tLCÇ×¥c::‘Žèxt(%ÏŒiákµ ÛXžp?ˆþ³Ðo×€ö8:Š`ÈhO MŠÍaÍMHŠË%ª›› jª;¦Jq¯õï9¾¥&Pc)+ܪ’{Qç¼\<öŸ\,’{FÑJVö!ò²ý§îMvhL Yw}y’‰ÂËÕSS?òœ]övã¬*Éû€?uê¤Cd‡ÿ7Öe¬£?âÌ­p†*ù¿"sUøEÿ½…ßÍØT4ÐýÍ4´V~D|EX åÆöÏû@d?ÊÙõ/ƒÈžúázÙ§úô©û-²º ²<@½ÐghòÌëÚƒ®yסÐäš2†¦ \ˆ:Ñ]¥™j:.KÅX(ä¡á)™Ûµ5N7Ñá ²¥ƒ¾ XýÐå²u†Ë; O` ðÄXßÀr¸²¦e;9¸ ª¨,h1²>‰[â´§@Œ,Ësòpñ*W#_õöíù%†lã}3Û@ü›€b¡3›;v‚væ¥yÌÐøïôžïd@¹ xÏÀ›±.׳>Ÿ-Ë —æÅóœÜ]Û¥7ÉËmzmŽ+ÃksœÜxÞl©]AxŒlÍ]ø‹´Ûíæþ}‹qñA{N{Iûžöt¨:´<Ô¨=-&øÐ\|¸AÚÖ’,myäë.ALMºkÌÛñ¬#Ä´|Ì(Ñé¿AQI'ñÀLº(yB, †’ÛËŠ­ð|P¥YCÒq#f vÉ¥‰Ô˜[ÙûŒxÕ~–/¾|ì6d-ûQ &Ê€‰i9£LC©k?ß?’!I°šéçXG{û[^ûÖÙÃı!Žuq¬CÆÅ±ÆÁ§9À¥÷wvhÏ hßо…{PbÚóÚ eŽc@ûöJGо3tÌåbÌ1^_’ûc¤ Nó™ö§íç™$Ï" ï·i?PŸÚ‹1í¥íe\l1Ú8óB™)¶ËŒT¹sEåŽõÖ-î‘ëk©rÓ©r7Rå¦AyL«JòíKÓÇìVèR ¦>tæ+»jÏK¿·çe9Ù$+»i•Ý4¹²+Îf9éÀo׿…)ìD}öEÔ¤£ºƒ[X„–H†“Ϙë®í‚›æjѨЭ¢¨§Î$¾u7(\×?Øäë‹£p‘ëöqìz¡5Ñ½ÌÆqù;*Žódú®|›}§-£¾›1Þ… 2Û¹hr³Ý˜{œÆ4º}xÃßw•oróÚ˜V®’Ö&:­…*“´6É™¤µIîV«Wˆ¦ œ‚À^ caq(0¤S`"¾-ðúmìr§Àr&¹Ö‘N¸g*ˆŒà@ “‚© ËIAƒTA4%˜("cx©‚hªò’©)X 2HDm Uö§‚hNÐc’4HDÓá—‹eö RÑ4 w RÏ£C¤G” RÑ / ĹîØÆ@ã=ª ÅÞµc {TA4Ó×LÁôØh*HÖ–"JFùÚ¨Q 1ʽh\)ˆÆ—¶(,Ó|g6zÞX<ç&0-ð—ï•Mv&ãY‹‚h–3 1È P Û»ÓÇV°Œ=Ú É&G•ð1†ô=ì „RÜAM܃V”ãߣíqå.›à¸=n"cÆb3‰M|ØÄÌýž¿^ù/cÿ*sþ˜üfæøùÍ÷\Ú×ÕU /û¯Jp¯HØJ+jž}=íëB_ÊØÎ®w2ãq´¯ç81T¼Sëç¢ Ôƒ*-ÃuâØÖZ|ÞK1š‰_¦àWY:¾B˜Þ³ º£Aà&β0ýý‰YN–“ý„öýíÚ«HèYRßÈEMc°½°8ÀLãN\Vò"Ä$3¥Ò­Ú6ø®WªÁ7©ÞÙ.S}a¤Bf»L ™í2Õ,£¯YÊÁ³Ü¢ÙÁ¢]6´h›?Ú¢½>Ž¢•åôžé–//P>-á•ï y…FŽ:S Ýýæ6fixø ðb že}ÐÿúGnùËíÿ[ÇÕÿN6ü ÙÛ¥yáR Ÿ·]ëäÄíÇeùN¾Ÿ*·ÈR©J ŒúùO¶ýëŠ8a«$zZÿ¾;€-ë¡u¡®Ð™ÚÓáþð×Â;´§õuz—n#ÅÈ4²]å8|)›²G»YZ¿“^°á±ê e{¤ƒUîc˜L×1LñÌKr»tb¬øA㪒¸3~œ¥’¯Ñë‹ÙˆÇǼ•jŠ8c¬ˆ´Z´Dãø2MûHsÅa2¶h*}œ¥ íê S+!ñh($½ ‡ ã»8þìcÔûÒM·ñ}Æý>Jé'œüq¾— Ä8;g$˰¶ÆK·Â•R›½WB¼ªˆ£<]Lâô'Š¢f±銢V±O˜.Šr3)Ц$é¢h¤8 GESñíâ€]M+ŠÐìýb’ —EÓ‹}ârQt’ßYLÂsvQ4Z-(V’sQ4£XÉÍw»bó­Å$5gE3‹•Ì{E1‰Ì‡q”˜‹¢YÅ(/Kq¹(S­àO¶¢˜$å‰Ã›I„—“˜}ôÓàé£âÑO©“F/ûDô ÞÃ*,÷¤Ñ\(ò"¯ÈwA‘mx^EE.ö=)öŠüŽ¦ÐŸ+ô]…þB¡¿T5-Þoû×P»Ï•Âî³Ø+øåPpPX¼„ ¾ž ^â|Ôr!ú+µy¹$Ù.’` “—l£(ÙïˆC‹PWBeT²ÙT²[¨d³Çk‘: ]M¿VÂûìd¦9u*¢WBš­h²}·±içºÄ†Ë!¾…Ú%»¾,“VHHŽIJ÷ÚoHz{B¬d…Kcñ]-PâdÅcs… ToÝÌbÜÌR ¹^3ñI+$qÄž)ËÑPö¢õ…Z|þ—7ù<ä8ÆËwrv=ÁŇ ñ €oM70ðO˜½Sû}ÝÖ ý“>+ÅÌ ²þ@òÙgÄ¢¦»€Æ“áa'šp PÜ•ÃpâMò·|þpB¢&f\È0¢V<ÏÝÒ#j’žœ<ô5;µ?&„—m¡Es·Æ´þ}ßíß÷Iß)þ¨×ì»6<LápÆôwˆ)A6Œ¿S8Âc £žà2Øÿ¤ô÷?+Ûô_úW•ìo ý»Bÿ¡Ð*ô=…¾0•Œ¾5òÃolü/6•1Þ©#p¹Ø,g–4Ⱦ„Íê»ËŠˆC)E¸h@û lN¸ôÐø¡Îœ]ÛC7;sâ‡Î-+vŠQ).=,~X|æöÐ'âøa¨”Îuæ¢R:›ØY‰SP6KtL'”Íñ=Zx˜[p®3~˜Ë¸ ¯½x»îQŒÖàh¹zü“~Ó+¦í!*›°AÀ"ˆ…dÄi=¡D®+”DÓÙd%ž-7.–D3œÙ®Ý²$%‡g'.‰fÊÍrfíÄ%јòZ(½²ƒ‰â2†g'.‰æ(/)äîÆ"”{„æb¨2 —Dó0PíEœ­ö"Ζ¦ß’h>]íEœ-÷"B•Éö[€¹Þµ£ ÛoIt¢¿î ÎÀ h/bÒr÷"Ζ{G‰4#Ñ^Ä’èÁˆßçÖ* À³åÖÂ’è¤`³`Ðjé˜ŒŽ“¤c*:î§É«'¯Ã´þ½ço=`KÿÞßäõ‹ïÑöHÛpÑþo3Q§ëÑôpØå‰ YNJÞⱟ¹#B=iŸ˜eô1vø‡Èˆ¬³)32|¤¤˜°»fz;ÛðÖœý¯îЂŠ´øÀ›M,jðÎ|\ Ï||ž&±y$Ù^O“ؼq¯µ†Ô:¡Bà U7ç„ÔÍ9!S‰êóö÷ÞuCß›Þ }ké$˜Úâ“>²ˆå¾Š§ÂN,Ë ³ NH†ÛŒxÖ\ºùR«§‘)¢¿“—ce:™›©c¨8ži NK­³Šý퀖¾Ms2K`™xQ–”*3é¢,D€m†8>ñÂÌP bx]f(Bc/Ó=rrÿàA>¥äm–²‡Ý*÷½ ¿ÁOö/¬bŠ”’ôdˆï ¬wúvŒxÞ ÜS“ž ÆBèPùÁãÌØ;Mžð$®?È­ß'‚<’ò&"È#]‚ ¥**ôn•·~²Õä_¨þLºïŒ ¢bE‡ÂR¡5qã™1ꮎPÚ8vuô 5³ÑÛø/7>0ªû|ªûóT÷ù£Ö}l93”®Ð …FÇj•ùC[%2Ön¼æ(*¡ÍQEŸ”hÊèí”9ŽvzE´S“G#?—4ò<µSµÓÕÔNe‚F’µúf©æ(K¦„㹨±Á%‰è£×86Žß(j¼Â«ñ³ ¥a¿J5^@5>‹j¼` ÊK„¡ã‡ÖTµNÙã¨ÓÇEVzuú›ìÅ7©NGS¾Lu:zô^se¸~Ôª=”¦GØå4”¦Gmø8ZànÑ'z“ïÃPÿ8Dy‰Zàjg©Ž·9ÖÈÿ‰Ìc’ŽõáÔÝÌqu¹:¨îºøµw×Å4ó†rÊ2Å”œIg´Ÿu2ãYòÚ–Ξrç+ë§é<æÏ¼Žæè '#0GgÐ-ô  𣅔˜–3,_,œzåÒ\FpKF”¦ïÜ<o±t·Öfà-–ÈÓàrÍ.›&îÒþÁt»¦=¤=®=é®Í±—qIŠÍ£íbd“G˜:åÅ ñŒ¸w!Ë ûÜ3³ä=Í”ÀÝ%Šë#ãÉ…ÌÑŠ‰Sv³·çk1Þ¤ZBd|œoÚ:î?4m÷‘M[òư²X€¦½Z™»#hˆ9;žtú·íZ‹g1ÏÃ!$Ê-‹ $÷° ¯gNŽ9+œ²x¸47ž N o8ñx.&壙t 4¡Ìqò¢…¡‰4î…&•ex«Ï£`@›ê.?ƒs²ç4kÓ&ZuåÚ´…¸&Y<+ê¥xr FB>Rè%XÂÛXšãPÙ'ºüKÚù[sax¼5[ëß÷vÿ¾'q„2B¹¡|wh¿béb®d9#Qµ¤?Ú>ª_|”h¨4¹ä¼`¤åH< ì‹K Ñi8¾BÚ^6Ó ¯‚ÿƒìº‘Vñ¾6¹±Yh€nšHêž"1>l¡ÎÀ=mr‚ÿyûÑBDÇâÖ2X GÇó8É“yOæ~ÚtbÇúV«Ž¿uÌÕªc÷{µ o˜¼žC&3uMäÙÞ•ioÐQ¡):Òøéˆ¸Ã)•îa£.50ë¤Zòe¡ƒ„…öÝ¿Õ'RÌÁÛq ã¤2Ò b{Ùdëﳓ¡ÕOö$b©i¬ V?Þ×êÇD’‡ÈëÀöÈkì{‡6vNY]Ü…—<·¼ÂI‹§KÉ!/Êr/|ërÏúÉ¡åCuf,ïŠè ©’ÃE骯îþÁŽÕiÕžð( WJ`äÛÞ&tÛÛð‰¿y¤{Û’Núce‹C|¤bád¿Ú£œ™’rD9å¾£å㥜±¾¿Sþ$ë?L6 ´ œÙ\þßK6§xdsƒ´3>Dd³Èf€Èfá¿EÕoBW)û£à$¡4e„ü©k„JÃs†@iQúª·JÛåDã™’Ò@^J3oáAq×Åe¹wñ(7Њ7ЊvŠÅ’[zPÅÁ{P³Ô¥¨Ìw#*fŒ>øtlÿà"Í›µ~íN4_@Ò|\’æ(6I¤Îä]!ÐY‚@?5Šé0)Ž#s$ÓQŠˆ”ÚâRjö@©­ ±¿A”Z”ªÛD©¥ÆBS••âå;M¡ÓÇoÂ×Z®÷?µ–š¡ê6S¡³>ìZn¨Hµd±BK:[¡sz¨2ð¦|ç*ßÕïÊwžªP©ò=R¡¾eó1×àÕÚ~h¾û‘X¨L¡ T„£zŒ*Ù±Ê÷8U²ãZ®â.TmV¡ÐJ…V)t‘B«Ì–(´Z¡Kz‚z[ò]¦2«UhBëº\¡ M¨ÌUûŽºŠq›TqV(ß•j™¿"©¤‘|FHÂÿOvNü_¿1ÉÿO!V~Š·Þ/Ú[ÀÜK…(±ÝÞføSp3ügu€×¯ÖÑ_pñÕâ‚ׯ0ñÕ–/å$xýjÐßÅ+Rb¡Q5£/~lu”L!!˜JÐ&˜æ¬yN– Èlͳڋ€ŠõýÕÑtg»0½:šAo}uðb¢ÕÑLgMp}u4Ky-”^±`¢lÃ[ß_+/ïb¢5òØêh†ªõýÕÑDÐc<¶:š¿F,³wlu4ÃÕf€5j3À¹`uÔñÒÐf€5r3´mXÍÇ7Þµ£‰Í«£ü Èà Ì€6$mNw3À¹`”HS0mX=ñûÜ&H£Í«££ïýˆaK¥ÍEl"uô$‚',$8…àT PjoA :‰(èdô>$Þ²¥bØê~¦SÌiè:±é¾4-nðŒdž3ÑsMð ÕÑYèÛŠX‘K„ÙèuêЈŔI ~„ž³Sd縩Üx‡R¼Ãb¡6|Î%×á 8oh‚Rò>’àQ2ûùä*#¸€àÑ!x,ÁãO°œàB‚+ V\Dp1Á%« .%xÁ‚ËÖ¬#XOp¹ìMüåÖˆNXÅYAp¥FbÝjë>¨S&„Ô]ì=z\Êp«?Ì¥!ãý“6‰©(›¡d¸æßôR!:‚((Ž?´à—Bþ/†·*KÞàÝꪟÃþƒU×ÿ“Uÿ€]ç¿j š¢ô— 2ÿƒUgÿÙªOúß­zì·êYÿ»c=÷?Xõ´ÿÝfŸú¿[õ’ÿݪ¿ûo”£ ¯ñÖQŸc&ðw¦‰M•d`ÿ™-+½Mk•E¥]¡ëº^¡§)´C¡‡«-»•Cl'†Z¤q? rzh§—YZ§ ÛS¼åÍ3Êt±óGßµëè¸×pRc Ô9 2Ÿs8‰¬%'0Dt7àâ]î·Ú"ëHÄrL€Ü±FM‡“qwÙ^à[M½WS/!UhJÐm…[™ï ³ințՇƵ§Žû¶ Ñ‘±2·y[ä^—§OwQ§.òuê"¯S»•‘k£BÏThB{•¹°OùnRºh¤Ne»+^ú:käK¿†nƒ»Dlƒ[ëÕr—¬å—©–‹©–먖‹½ZnVö»³UÉ·(ßs’Ögqòó¸£×åÜñ×¥[Ô¥}„º,ñÕe‰W—óTQ?¶}³ä@êrþ~×eÝu©öÕ¥Ú«ËǬ.ÕR—Oìw]Ö{u¹_ÖeÕe)Õå$ªËR¯.j #¤–0B¾% _–H¶Ž¿kENó*p‡üÄê•T¨gRN£*ß‹”ï§“Vë„ý¬ÖÐbŸ#ŠÝá­ûžÅÎ(/S±k¨Ø·Q±kƾäbï{ècÜÚ˜üN¿š¾gMŸÖ°Ãä~¿ß jœzÔiC61ð´‰é˜»J-q’µ}Ç1ñÞX.·pqg,«—ó›'ÝELÜ»ÈI…ùó’D?+"ìR²÷"vY2]^fô³(y\A0_žê;Ó“©¸¼6⤆Ú°¡­ ܽ*0Õ"Nþ0AîeJ©â¾@xrw'_ªü$ùàÜþ}õõûÕxµHBÆ^Ü.€ç;ŠñÛo9ÁiÎwÕªú£)tþHQÅW }§5Åžñóå§>Ŭ»Äýú²_@´ñ3³¡[nÐË#mú¤·ÜæÂI8 ïÓŸ¶Ü7‘I×k¶ˆï‚iÚm“v¶·oâNü>Ø Òæn'½û–LäÓé¤#ÿiš·{§#éEG®.Ò9tkD’­>rcD§Ú1bpmðÈ*Oîûj&²ZîÛ1¸|¼d5ŽÚ.?à­_Á/Ú²ûÝ­_@Iôµ(Üþå£$))°ìü‘ö޲ûK’íþ’¤s »¿Îï¬&R)תµTnϦÁd”2Æ6¯at2â6¯Îñmóêò¨$ØWÚàÛØ0næ3ÆîÀ†ÿS$bý»I$¸¯ô¶ñlü¿@"݉L’$r ‘HÂG"‰b~}D$òÈ~“ÈEÃH„6úexýþõ¤rVÿ`9‘Ê"­V[þáHeÖ€T6z×.m’ž8œH¥‰Hå/D*MãžsB_Rèv…ÞªÐ/+ô6¥Ý®T¥~…~E¡w(ôN•Ã] ýªBïV¨Üè%*1þCï‚2ÕM›SÜ›62s‰2se–æ¹®{\…ä;Dr9NN€ärtŒ$H.Ç ä7ÿ V :yÊ›Ws¢¦t …q7н¥Ä°âŽØŒ’åñ<Ü5î;@r¢)ž××+‚®û#ÿ³{±4ÄKGì!Ä2Û‰XTlrÈÁ¡°ï‡¾++ÅÏ*~ é~Äëû î= hUdWŽ|—`phšZåÿjì¿éEËÆÓ0ðÎôÌʯIn}& ÁF‚×ÒlÿsÜ=¬xwãG«Q|=‰Fá]Äòþ×q“õst㙺|ÿSrjxûWYôÃéi¾acsé\¯Ô÷» ¶{1ÿyýƒ }j^#^ÌËØnªé¤/’ÈÏy\4ºlßãñYK^QùMêä•ÔÉ—S'¯üל._yŸw!§ÒÌÐ#в‹µ˜ÛÅìÚ‘z4›c½-¦f›¦æ_9¶œšçáÔŒ‘‹7ß!’‡W~È™¸gOdfÊÇÊ-ü·:Qq:9”O^‡&”eaS£Û;×Ñ鿌Î_ÆM<*°]cÂe¡ëK®‹ÇBÁƒ¾šŒuÙ¥ÁÄWê…v¶2.§ýZÍh¦É?»߯iò¿SÛ¡=è­<ÏV^#ÏV&û¸ÙOÒäÝ<ÙH?ûðÃWÓÄ9@AO—ðy—TŠ”­yÑåÑCß—ÎGú2Ì8’ŽôQ›Ñ’úÏ<¾Ç´‘Ž3«Lè"a½Þ Xƒ"FÊT'ú®'8ñ_z=Á‰êz‚GBO4»Æ‚ãâ€?úFYFpÒ\ïôäÞi®·;ÚÒÝ“.ZŽwÝÎ-x¡~a]Xbv¿ŒÊá•IT†á•%£ª9ô€¾0ª.Ñ굄Gawáj.ш˼‰qÐŒÁÞMõ+£È·ÜO¢¨È#ÚV“d‹b—™,ޏ÷óldÒ%É´Éœì³ÂŸüQ°.‘ч¡e„Ê5½¤¢­Û¥—ÔaôrÍXÖ÷¤t“IJ“êl Ä×'·ìdø–„=º±t³¾p>ÑÍ2­I;Ñ£›+‘n.—œi$c¸ ¦}@MÊ?Úî§tÆa FÞï#hc‹'„É"ÚXM´±hcõø¾žzS ‹?Tâæç•þ#…¾¥Ð·úc¥¯Nf&×iO"~ù ¬>T¦>tPš„Çd7Ø¡=w}¨lVîÓI'Zz~øG,ÄAÁ5¾zm«—[Ä” ¤fšŽ³â@è' ‰ü·ù°Yr˜bçç3qáö!ý, ½S–ÙÏx,ô3ÈxQ&q!`…?žy4i{NèÝ¡¾úþb¨/åðË¡¾´¿öWÃÔZâtûžUTh&ËÞÃî"¶f[ÃïEчy†~ª ¨"mÅ›²t44'²§sŽ'²ÿ<ÇÿÏüßyj’O7ã8Ç[,¨Æ¯½Ä8J‰q´ü¿ 3ôËrPÇ‘‘Ò†ÂÌp/1‡Ü¨#ÌôÒŠzD¨õ ̤ÐJ£Ä‚^«ÃZb ZlÿYê •@Ó+ä¬ls@4ÿßbA5ó#Z«üðUæ,àå¬àÖ*°ŒhŽþß‡Ô q``ûÃ^'iÚýc0‡Ÿ×æ¤þ0@BÖ½Ò†.s5s tÛN *Ìô:ÒûË^† ‘ÌÂLo‚}w3½ÜÎônÓûLü­Xv3}Œê§íLŸ­X@uën¦/‘’,Û™¾‚˜ß"%Yu¶3} ÓÍŒç@ôO­Ã˸¬ØµK²ïßÈÀÌ Ä Ï`ÄèŒÓ(†X Å±À¶r,ÜsZ À,nJµÀdRÇÎ\ÏÎÜòŽ.#è¾3F8hüÔÏÈr ¨Cˆ‰Ñ‹ùËEI¦·àäÅPK™îÖª\~PK8A/org/hsqldb/dbinfo/DatabaseInformationMain.classí| x[ÅõïÌ+ß±tmËv®íÛI Ù'‚(²­$"Þ°ì$ŠQl%8v°œ@(ekhéB¡-KÊÒp¡”‚J”¥-Ý(]¡….,¥;ÝX’ø33÷J²eÇÞÿõ}ߟÍœ™;sf;çwÎ,Îw>¸—²DÂKïÒŠréÍZ±¡MÁØÊÕJ´R¯V¦Ù^HNżrÌ«ð¦UzµiÚtC›á%¦V…9GÚ‘øy¦W›¥Íö’msñÛ<ä0ƒ,Ä ƒE,Æà( ŽÆ` Âà ŽÅ ƒã08ƒ0`°ƒ18 ƒ“±µ{¡§ZÐKjµÔaçë½ZH[– Éå¹Ú -ŒÁ©¬Ä ƒF š0hÆ Å«¦µzéYZù¶a í¬B~«1X㥷h8äÓ}ÚÚ™¹tö,r&;18“Q®­Í¥A­ Ý\‹aåf®­ãÚz®mÀOq®Ãµs¹Öõ\ëåZ×6qí<üØóÀ^ Úf/ùˆV‹“½Å§¯]€ÁVüv!rÿ(Ra‘!u±W»D»©Ë0¸ƒã×m\ÉOx¡…OÚ•^Ò§} Ÿ6´ÏxI¿öYü|®q%fy]Ô5|ƒ/`ðE,r-¾Žk×sí^׾ĵA®mçÚ\û2×nÂì0×næÚ-\»•k_áÚ®}»}Ö¾ùÜ‘ ­ !Û¯ap'waðu î6´oxÉ Ú=˜ø&÷â݇]ÆäN îÇÞ?€#L"Ë]Xd7R{¸ö ×Â2cãZ§=‚_öbð(×öqí1®=ε'¸ö-®=ɵ§¸ö4מáÚ·¹ö®}—kÏrí{†ö}/كƴxÉcÚ1øæ=‡Á1xÞÐ~‚Ù?Åàgüƒ_`ðK ^ÀàE ~…í_õ_sí%®½Ìµßpí·\û×~ϵW¸ö*6ô¯û´?h·cP‰Á¹Úµ?aðgLþ…kE øý;o"ûJ®ýƒkÿäÚ¿¸öo®ý‡koqím®½Ãµw m¿—¼¡ð’·´ƒŒ ƒËyy‹¤*¡ŒÂœ13ƙΙ‡³ƒ ôŒc¹\X9æÅÀÇ™ÉYgùœx™Ÿ¬È`Å^ÊØÎ,/õ±ÎJ½¬ŒÙœM…n²rƒUpVÉÙ4ΦƒJ±TqvgGr6“³YœÍælgs9›‹Ëæc°ƒ…È¡ƒE,æì(ÎŽycK8ûgÇpv,g5œÇÙñœÀY€³¥œÈÙIœ òÁ>ìe§° Õ²:¤êq¨! –y#É%###8´åœ­ÀÜ0g§b¼ƒ 1h⬙³ÎN3X+JØå˜ᬳvÎVq¶š³50¿¬ÃËNggìL/]É4VJa¼“gåBÐÉÙÙG9[ËYæwsãlgë9ÛÀYÀ‰ãeç‚´Að¼Áz0g#½Ãú0ØÈÎäcýH% 6€ñfD¶JÄÇVü¶çí|dÓa° 8ÛÊÙ…œ}”³‹PkWrö1Î.æìÎ.åì2Î.çìãœmãì Î>ÁÙ' v¥—^ Ú Ê¹©Ë1þ70À”‹Ù§qÍ?ƒÔg1¸ ƒÏap5×pöyìÔ8û"g×rvg×svg_âl»¶³1þ2g7qv3g·`¿NÅ%¾•³¯p¶Ã`_5ØmˆÈµ—ìö\vBáügwbösœÝÅÙ×9»›k>ƒ}ƒ’‚º`k}¸)ØÐÙÔÞXj¥¤´¡¯ýâ ‰ózº×.غ)–XÜáRJr;B‘ÎæÖΦfJòëV[ƒum¡ÖÎú`[2"§5t†ëCMmáeaäãm 7†:#mÁÆJ [mѵ=±À·)º1– „;4%f¸·7Ö_×M$ðËì3ÒûàkŒöF×Çúg:ièQ™Ã6K$â}½õ±M±ÞîXï%Ú§SRÔÛ×[íÚ륑|)KgÞ‡¢‰ ðøy°zQ|FÃ9Ñ-ÑÅ=ÑÞõ‹#ýñÞõ8 N“²D+‘ %rNŒ÷ÆN††æ¦®óh"¶tÞ*Jôº¾nwn´»»®¯góÆ^JNž;–ÙØŒ³8È37ÚÓãô¬|î¼Ñ£ Äú£}ý8Ì.œ“ºžX´Ö;£]5‘‚a^d Úunct“à éõ±^äS鯬5Óó6ÅúñÄÀâÃÂD ±¥áyÙ&NÇy2|ø`û&¸0 :ñD°« ™ãÒÈ–ç²eÉsÈ€¿«?}®…Y“X \è²HG¤-ÔØYŠ´µ6¯N×â†÷¼ÆYÆk°{ vøo[æÎ`; v?¸Ñ`+À@"ŒÈ®Ô57´76E`:œŒÖæH¤5´,Ôjª ïa°À·€)TÂMõ¡5á¦eÍK‚æ«Ü–Öpc°µce¨#b°] ín~s]¨¾½5¤À`»Á–ƒÀ.½¨p»ÕÔªk 77áç–Pk[8Œ÷PâUnéïëjí;ôoä=¬€" ƒýýÑ­ 0•ÙÔÿðr½1éÃÏš«q{€2%æ°MÌ}ð¿c>Þë }€3û^ü¿Û… —ÒÑÉHÝŠPc0bÐÑ6ȼ¶`m*Hazº­£ó œz?Øz“½È~e²_³— ö²I¿Aï6é½|ƒ{ `¿a¿5Ùï  ßÄäïÙoÁS0Ù+ìU“½Æ^Ç¡þÁdoПšììO&û3û‹IwÑÝ&û+û›ÉþÎÞd²°7MöOö/“þ‹þ;òö–IDŸ£Ä©\7ÙÛì˜sú­’<)¹èî ‘#•„O‡Úï²w@GjÛ—½êl5-o[zTªkÔÐY^FÈk‰„Ú뛕±C~BBAð€Ÿ¤…,¢3-RJ›Ú0 nêÛf²ýì€É²S':¥¤2mÞ»×Æ{×õ-® Á mêû XbSgºnê=ÇÔ  èèM빦îÕ}&|‚ì]ŸaêUú¦~¤>ÓÔgé³M}&çb¯ç!5__`ê õj˜\Ø¿€n‡ê:[ƒõá5”­ Ä­+aš½jiêC˸`Ÿ’¶†~•ÉíJ{-B ìm:›asÓæ®¿Ym“Zš#aD X¡p¤3µyBnÐ@i‰%ˆ|"Ù& û#Íí­u¡Œ~·`{[s¸©:ø0µ<Ôj…ÞÕË1˜ôqú„©/±/Ö2õ£õ%¦þ!œcpzŽEªƒãpšËÇLsÓækcýr’G.'`ÀKõMý$ýdSÿ0&OÁA jõ:S¯Gö!,² 9³„M­©ÙÔ—céø9ŒÔ©øÙײ2M–󜔒fÓIKy†Ï*æ[–QyÙ¨ÊË2+/ˬl€: ê›ö\×ÎÖvœr_} ““2–­tÊ·8T^=z—­ÁÚpC¸­|¾‰|S_©7˜z#ÎO“³Ð£Ÿ†ÉVm[˜÷&ú£ñ^¨Õ†eÛQÃVa°õi Xõt ÎЙmCÔÞë†Tø¶§µœÍµÌ‘×¥ù‚‘:ܞׇ"uˆGjc/Æâi ƒç_nÀ=;ø±õJŒ ÀãïL+lêgb/>¢ŸŽ´©w°¦~¶5õµt鹔Р©wë DëpÍ×ëp‡Y.\A*­–.?•“ š NQ}ÃÑ«Gñƒ¸b¥Öy‘(´,\§X”¥MtkßæxoL™M=®Ÿcêçâ`z¢6â4÷"`ôé³!´ÝyŒŠUqMF'e·ŠÆ¶`ê›À~èçáØûQúX%QÁ5ˆR¢‚í m«‚ íR#u­áœxCiØLŸuÎмöœXEŽñ×L} J‡ílw_oÏVS?Ÿý ú».[þN'6#¦~°(‹ÍXšÞ7cýæx7ô{«~!HÁh7FkD“äjž„1/`…©T¿ÈÔ?Æžq표 .Ì Xs¯ ÕrÛ‘PòNgÏnZކN-[>d;à&Ñtô²¾Ö…ÖP°¾³¹©d7¯®¹±1ÜÖû.S¿¡æ .Åà2\„Ë1ø8"!¿qG©ò&݃.Z>7´Ö€FbJ’›3-D £%ØlŒàW0ƒ 5!â#Co$lã 0¼¨ò—7…ê;ƒmm­áÚö¶Ð¯5#ìÜ|DõÎ4X/hh†/i¾C^c¸)ÜØÞèTÉ JO…› §«dߥ†˜ú6ý Cÿ„©R¿ÒÐ?eêŸFÃЪÆÔ?«_eêŸ/G¿Å’Î1õkpj ÜÚ cSÿ‘Øy›c½]0±÷¢i¸õdX w?R`ÄÛ…Ônö&Hòí\†µÄhþ  eA·”2Å=«Ê€9[( j‘ÃN¹Vec¿9‹V2ö“l}Äp|” @Ûl™X¦ÞÔB•ÖW…C«Mýaÿò†æÚ`à Ø·4À`½¨Ù3”kj¦o{MúMºr§ˆGÅó²l2Ô!7î2ú7FQ,ÁñÉÔß´3wSDßkèšú>ý1S\,µu¯ Âàå¹A‘»› $ÈÌ‚ÌÌHÆÉ:š£dÖ¤:™iåÕù%3ÆÕo¥¦”qè£ÐÌmpúY<^S„3l}m__O, M—1î=Læ§”w¹4sšã½Ý± Ày€’ª,ÝDôhéïƒä@/ ¬ ¾ÊÕYšá.H÷$sÿ†jîïŽõǺժ‚O“ªÒ¶¡¿ï|uàܨ â,×# n 9ýî—g9;T—fjxdTͰ€@\uS¼ì‚ĨJi½-Cæ>6À'qÚ–ˆnÜ$N´O…ÁC´L½WàKQÖ[ðþØÆ¾-1d¨–Ȭ6÷T!鸑Æ`CC}¿Ê±Ë˜:ŠBt+ Îør\t‘ªmnnÁgš6¶®2“ªr&8Ê!Kp\šeOO‘åÕqK|c´ëÊØÖ”­¥dÁä`ñŒ°PèH·˜%z𜳠ÖÐØM4Å.³:N·HL ÍrO¬ŠÇ·ՅEª…¹ní;?Œ/âëâ`ÎqÚç¡+·Ä©‹ä±âЕ©ñÄX87hØÓP—Å«¢=›c-0ßR•\¥ªaŒã¢nÈë@zúÖËEÈsO¦Eõê¥ÅTèû¸ÞŽm GºÀQÁAÍËr“%eJµ$b›»û@>Ý&Æ‚|†™ÞÄé§Ôàî`]€˜h×€Opò2a#Cn£x"ý{5¨èé}½P{êzò_À¹’«²±N/ œ €Ah㦭°fÒpX8cYÄKžZ_[‡å.‹È£Ô–àdd›À<å±8B™rè*¾_5ÐÒëŠK§ÊŒvá4銢ؙª„Jâb7]ˆ®÷ĶŠÕÂTß `GIÓ{~ceÄ…¥»úu}›qÔ>¹Q¹šv¶)wÞ8) ê< ¬cÖ‰ò‰ÀS`É §­>¶oÅdÄ£dLJm¼ðÃM¦€Oʤc }{[£Ýñ ¤àæ:yñDè`ŸÎÄ“sMÃÒólèÃ, NfJqO—.Ow<±©'º5¿0&›Œœ×ã‰l^+Lj7ù /ýç Î*j.¢›{¿‹\)ôâ¨Q„H@`ã½]² Ó]€8ms´©;2=Ø -!êK°B ‚X®^"u;‹íàr4ÉØ f”–Í£r´ÆÖI™ÏòH‡E»¡=!&ˆ­G÷jÔ¸ú‡³/7¼ùŠ’r˜³­¸i¯L§ ²½7~Þæ˜LÈ©„1:j#szb±`—5¬³ \[7'Oh9ì÷”Øs'Â2A0msˆÛŸxB¶²´,Ø e  Ûõ¶VÚQXš^'CbB"q~_w}|=xÈÒ0©Ía°·v;­„ ôßœ½rÕXaµÏ.¸åÊ ²m‰÷€/‘£…ÛËCr-•\e÷ºÓÙÂ…·2 –KìѦ9¯øî‰ »!6‡EÎHÑæ9{øò¬‹ëìâó79m*7¾$e–õõ»=½šÒ¬Ž=x3BwçŽÊ“jÍy>_›ÏïE2Óý$WŠ[0n^‡úwjV¿E”÷ªò¦!ØùI‡É¬ÛÚån΢ýÊê›b1€¨ü®h¯<3@K ŽpÂ8£b7í<'~_X¸¼Ò*ÉØ²º‡¢âmòÄO‡'دfד~¬RžåÞ¸Ê[„Y“l GÈ‘ôfz!ÄK8¾ÏŠã‹-ߣâoªø^Wà3/?@“"ÞEw‹x}â)ø^â# Águ„ÒG!5Ÿh„Aú˜ªw 1HÄsçßOøý$wõÂIâÝM|ý!bvØzµÎè.’ð,°O¾Ãáqú„â°8Pˆ§?D :$N’ª¤®ï"E»Hñ½ªâ·è“ªâRè²q–Ú{RÅ6mäfR‚‰Š%MÕO^ ]™24òl“Ò§pŽÛOrh TÄ÷s’‘®&2¢?­Ä™&ôÇDþ×ôrø5ÁïLøuÁïø¿ àw ü®‚ßµð»~wÂoü «ô’ûk•>œß®I–{ö}´q8¿½‡øþäü ,Ö½"*‘Q©ŒÊddËhªŒÊeT!£JM“ÑtÍQ•ŒŽÑ‘2š)£Y2š-£92š{/®†Z}›XïÒ9Yþ¹ú¶+WA Q¤w³“+…hí"V9­L’ygD‚t-Ô“dþ6F‡F^D©M’M‘…»Hu@¼ÑK’E¬Æcy†Ébà09Xž%Oµ"m`pÔ60øÕ09: W™ćâ‡8Ö!jâ8‡8Þ!NDJÜ!9@Iè™Atƒ~Ç ß5è³ loÏ™Jrd1è÷ ú}ÈŸþñÀ\ü€þPÍ…¥`!T)ó¹ôn¥†?¢Ï©"P‹ø"LèïÐØJ…-¤?¦Ï«’Ë€þ}Û<Ä’“¶½wánrr.&D¥}šxªï…Ô‡·#QZ:aÞ¤{Ï!ë'ô§Šçà©¡f“S Á»U«?£?W%º@· ˆW*lI’Úãôê=¤Lƒ~ívR„½ñÞOê“$´è÷Á§e°µ*Ñ÷匨oØÍœù ª-@¦y«S3œCè~2G'~|ò+Ô£{ÀÊ £zu1[’$+šæW…‡É©IèOuQÃ0i”T“›×ìæµ “Ó$ÕêR·\›Kµ»5V¹Ôj—Zã–ë&§%ºcbþ)»É w¶Îöv0ÖÜ¡ûys‡ÇŸÛÜ‘ã÷6wz3K’3«ï}ˆ|û¬€™†Ï¯LtÖTÚÞ=älJé*¤ÀÜGXÀgû’díö‘Wæ/@ªk;Éù9’Ý<;ïiL~Û61#†ÁºÝd} © й@Rq¤ ¤p©sÓl3IÎ-ƒ¨'àa5Ó­év(Ùó¶Ïšž$3ìiÖô%*«rÌ·«’¤wøíª}¤/I6ª†ˆ…™ç ’<ÌìO’D ª:Iùv>³õˆ¯Û3’d34 ´ oÙMÎ:é €0Ø*39…À/>]8Hò1þ(|+ƒ Ûƒ·s0ʵ Œ¼6Çȇí\$ÙøM;7R½`¡Ÿ$Û6€aþÐÁ;RZ Ä·Ÿ€Æ>;B¦‘iŽB¿` òã}~¿"£þÅŸ½ÐãUÉŸ°ŠA­Ò22#½’A_ÿ¿ìüÿ›‰ô·Àä9Ú ¿3èï GH9bòì ªea(yÁìÑW ÉÆ!C¨à¸ù<›is‰gÚÑH)<ËËupìeÛ‡‰®t¤\yòJêêƒÕ̲fYÆú’kÍB|šmÏN’ks¬™ˆOs>ÍQø4ñiŽÂ§9 Ÿæ|òÚ^O^1ÅëAHñæ 7‰U^+J¬òr¤«¼þœaòyŒ D ¹_$¦*ðE‘qí ©Ä‚HKTƒÒ©×²ÄõƒàœˆûÈ Iò%U(¿ :…¶’BÈ„¦ï'7^±›|YäÞ4Hæˆ9I’›kæ"k®ªž¯¦à•öb¹‹TŒ Îè­H›øá+Hå!óªˆßš¥Ÿ­èB,òÕA‹n"ž¢ÛEÛwàÜ{ýbʇ’äkX° Þ™^Ðë/ż»Òòª½Õ³èÐÁC¾›‚j¶–LÙO—¨.%³F+7ªv6ÝÎ…#²ÖCêP5‘Ù™x¤ˆN¢¾Àߣ\üí s'b9!3•¤ª*°`„4| ÌÓ„™ñ—­âÿïíÝ)üoî\~¦¤–¼Ió÷^4¬àk®ÓýXÁEà"݉VÐ#œîgÑ z+øu×fÜíRßp©{\ê›.u¯KÝçRÃ.µÓµ–÷»Ô.•tËír©Ýò«èT÷Û %¼ï4Q@~Ÿc§Ò¼î¢‡È0W*ì"i¥Èz¤”•*¶‹]¯»8åuùPÀ¶í½5å¬f¡µÐ*ßAªmÛZ¸$0Õžš$o'eP¨G Ò ñ٘ػzÛBpCŸ¹NT³+’äÑ4dWX°1Ú·<&«?°l˵zÈ%0Åž¢2¼øIIË5’STGJäåbÅ'¥}+Pf—í­)AúIüX€ÔSHù‘z=PˆÔ3Hå#õm¤òXMµUm•ì Û­jûÓ¶ìR«zÞ$ùl'¦Øe©¤OØÕJ»RØÕJaW+…]­ÌAO½Ò@G½’ƒknW‚mób[Œ¸mb”kçaäµó1òÙ™¶£<»P؉J´Õ0—1œÑƒ»Ò¼ú…èÕ?/L…E*ÇúÎB%\úuéÔO\>-OÕÈ'Õ“ªaÐ? ³ûz6u?y}c<.žIö=ՊÛí=Í,?¶CdQV`#)Šdzû/I¯ýY<©ˆ_Cêlü¡wÈM‡ž‡Q}ôã+Ð; @oHP=‚^޽çôr&çúWžõ¬›÷=—ú¾ fWd9¯øëÜÿÐußäRϹ_,óD§2AÏ?Æ/à39`Ÿ?Çod¿»@4´"¥0Ïoû]Ìó§0ÏßE¿R4gë>ñ|M!«™iÍ´ w·l¿53I~˜¥ˆ=ä§”ÔL±¦è;€+yΞµ‡üŒ‰W@ÿ8w˜übˆ€“ýË€A>p²&P‚ï/P(ÊAò²šÙÖlkÊr•]dÍ^TS,€S %ÇÈc ä±òXy,‰<–ß°f+oÖøñ Nɤÿoùs‹^ÄÈ‹e™å!4Y€IyŒ,£ÙFýÛfBh ¼+…Gô5Ä£™Ä?Žl ÁÜOæ‹b‹Æ±ÿD(!’|Qž=ŽþO(Úìq<Ö¬F3Eû2)Ÿ€‰ä3 6µ°]Çã•9YY‰½¼«é®â¿¤˜¢ºgc+ÆxÍáÌÒ.2‹&ÏÑoÂÕ(ù³%Z=@I 4sB‰! d3B‰q¸§)¿Hy>‚I–9h»ZïíÏaiºž$¿ ä§+=w¶ãäÑôí8n®•Òã¶|päŒ-”ÿ‡H¾ðb{îK’—ÝÆ'ÀQ0÷Ö€aÁy;HÓD;î\Û´¬tÍó–åì39¨¯»9´@Ãî9)í4ûg$g?ù˜²øY]_ÿWqIÖ.%ÊœDJÆ×—]ü N*Ê»òtZ&ëCTCš¸³Àö¯ŽDyjA¢fÂNx*JçRJw$ê7®ÌüÖ¥~—E¢~ïJT¶ªW\£óªK½æ–{Ý¥RÇàïó„JÕøƒ+Ý|¼Ãt÷¼©ù {ÖY3Mɸ¿…|seÙþˆ”ò7SñÚ}Û¥B¬äÓYÍ k†=}ïú=Ýš±$Pn—'ÉŸjÊXM•Ue•í 7ÙåVU’ü9p„â û˧ßJfSø³ûw\–~¯;×ñ°~Êd݃”Úö{æ‹w¤Î-<ÇDL,{Ž“±aÉÑñ[\Ò¤½’αy’Ú@HLã$i9R>(H+2„rMÌ­Äý݇@>D¼Åt†xãƒâ“#¬ZSÚ9ZÉÝO¾/d'ôâ¿HÔí^óŽþ&,úzv¶¯hÊðûx¢•^&%ZS'ÁÊ3‰2dÍMõ;f˜›Ž,“ϫז}B–s…,„,ç*YÒêø¡¹„|oI«ðŦ‚AÚò,I©8>¸|1MÅýø&¸z(žJ¾Mfƒªt_ל›N[,ºçÝ; ºçuT-u‘:ŸpO%Šé)U92EÎtÐ=˜(¦³Rú3;Å`N*wnŠœ—"ç§4pAŠÙB·3Ù7.Nñ¯vèaL™³ëÁÙ5Õ¦‹’tñz%2ç$öËÔÙÅ?Î¥/0ÊÚS“ôhtfvÓ% »B<ú{Þ²ñ¢BBT¨Sˆ <…¨P§ê¢B,c©]ÊlPÔR ¨ƒ$ýÐq•v©§¤r =æÚ›AciÍÉ-©¼R}'×m'å_»c|Óv¼×ÍÚ¥à, ·ãeûbû¥¼˜ž"‹Õrðãõ¸­·õ¯Â×BU>¾½Ìð¡Í»¢ÝAl÷~²Ãß}K Ï¾,õs<ì"G¥wó:Ä(²t;)À"x{eL¤=bl¥þ\Á§€ ùƒKn "çÖŒvJý8^zâà¨\“b˜'ZJÁó€2')Æâ“_„bxƒÎlöŠqú‹$Ü•"ÜÌu—§˜žŒëShü˧m¼EÊ÷ÓuÖ9õP›_@ Š/°IËø{»pÜÇ,ãF;%XQÕÑS`v¸½ÚŒ<ßí¼Çvé{m÷e–7BŽ|¯Íf}D8™fS\êãèàüÍóûî1nÙþÇ}—ÔŽïd…`Äõ¯‚mÞÔ 3âf$!̈ϵr‡r¿>욌¦±§6Åô÷y ðÌ„qšyò¬;G4&ј¶©ü¬;èă›$¹CxY¿U/£ó–ŽÈ] »@!w"wBî…Üv~†;–¯GZ뼨îC’Ϊ´_T+ðH½§.P`)† Ošá>oQ.R‡¦[}šZ¼¤œ«xO ñü¯ð-ÒNÐÒ;Èð4øW ;ÄÒ䉥¹A,M^ÚƒýÓFßJŒóZVå½çû²Ý¬Ë—6tŽvp«?ü§ÂÕ¶À”›0ÊÅHL1’ub$¦+dõ)y ¥<ˆe©Üå)rEªKæ¡öfI† þ©Õp‹£§õèr©rÌu‹‹]ôÊúá´!`€¯ŽTc’6)O6ï&ë…§n8G†ã¯{î§-Âé>mˆLÁT«HQ#Þ&ž|Üž.?ÇIϱʗ iˆZ8 soÇ›<{z’öŒº‡ò!ŒO`ƶi #Å!àIÛÊ ,Å›êƒÏ ¼‡ÒšGãt£òâšHá~r§ÚËZ㜕:¨«yPŽçNzôÃ4,¯NQʲßFk9ÙªÀO´´ ð ^«|ÿ†í ™'?€ö\8úOQÆ0LûûŽKªX9)¥´ÿfH?0†¬44ã"œ²ŠÃŸM‡1!oÏ[øG‚žÌÕžpå×d¤À‰;àÄŽp²AÆlN!N¯ p ¹àԛ™¾¹)Ý;àsÞ0íWd"E¤ÈÍ©²[Räù)òçJŠéÖTî…)M‘¥ |,uä…z9™·e™ezaSì) ኑ^ØÅqÿ_âÞÿ«cI—ì#7 jÝO/»?$`÷ÇýÞ!¢{jÊl+Ãû²t¬t™¤=H_.éÁL\Ç[‚àÇåã2n•©WfòoG,@(¹m7½B>=ƒÄ'T"ŸT /&®LÿË |…få,‘Ð,c‰|?AåcùO©Ê˜ø4&œgjCÿfÇßÂ#µ¿ª ¼±‚–éƒãÑL·Ü°}e‡(,Œj®¡yÁZžês%±'[ƒ¦´ù0꤬wp#…ñ£0ùi “ÿÿ«Âäÿ¯Âü¯Â|À cºîo(L%îÇ…Â4 …ùŠP˜Æ÷åþfsz‘üLÊÿm õê9çþïIÙý_¤6Làý²÷çýîØû´mÇÙý,ê¹\:¥þÞý[.œÛt¶Ðžê¶’®.àøŽrn+„[Û-ÜÚ“…[ûöÐÁG…[ûý}Õukçÿ~r×a¹µ5ÿOÜZ{„¬ß¡sßkNè-¦¼Øˆ}ߌn¯uB~ÿ.+Ñò\ ÌPŠP^€Ò$åA(M.  : SÐqU*÷s©Ü«S¹×¤ÈϧÈ/¤ç‹)2íæµiRVUܺ:—­´dÜËÖúeõ$éµâ_Ó!gù–Ão±J7ª8^lçäÓëðº5«_Ÿ¦ãCêë âkÑm1Md|)kqäû˜-ø¸ ŸàÍUÞ¼âÂ'Hž7yæý?>íÁgðY7½}΃Ï㠬鋼ý’_ÆW<ø*¾&áë|ßôà[ø6+¼Æoß‘ð]füž ßgÑHø¡„ëŽääàð¨€8-Po¾'¦Éѱ‰IYÍåŽç² ú¸2¯ xã”KJTS2sÑ„‘KgæúꆳÝP2ÆIEË“<Ϥ4õˆÂOÒ¨M$žMhH<?›H&GÏŽÄÇ’ Þ!°éÃ#åd;‘G'''&‹Cƒ‰Q&× 8¤3ic@Àê<)`ΦØx.Ÿ1Òóêh.—Í ì Å6Bî,#MZì—gÔ#Í?µ(­.›ÍÍEÏëµÔtô-å’#¡2äù\öEeZSûWM]ÂPf^S’,.áGž%§—œÚ[ XlK•­¡­Ï÷W¨\ƒ¾¥Ð¡MÜ=_FŸ˜¾ Î[+"ë/ÔFB[2 mŒÒãf"ÑÕœQdÕž­¢²*î \nP¯Ór9§cª®+sT¯>NL•¦ª'&*C-R:C›„¨Šp# Oªz6Ÿ›Y•ï •;šSõ¼fD'ÍeëÔ/#ñ’n¨óyƒ!W‰"u DV‹MX•#&áÇ4ƒ\f4³ueŒâŒ£8&àß¼%e¼7™wF`{•‚c qf:#°s½Ý¡|ZK©9?ÁOjzÛ©d,â¦@ófNËxgøñ3¶úskï•ñ ¦E‚-åƒ[2R o›6Úœe“¿Ä¯˜ïפ £CÆk¸Í0îD&¯iíjÉ^û|±dœc§ð> weü¿•qý 2–°Ìº~'ã=xFÂë2Vð{ qãâ/óÅ_QsVp:$üQÆø“„?Ëø Gò¯xSÆ}¼%о=¦iꜢ Î̘²Pôàšû¤9¢s9F,¬ºŒ¿áïäJuÃ4ä×—j©T•Û«”4ySNÍ©³‘£‡Òª–¢Ã¡ª5ïTÔLJ R­ø6¬º A—‘-¡qëùiÝzo2ÇKCýէޣ̚˜Ù&—ø391+~TM¦œSS3sÆyó{GŸT{¨¨-I©—Y[S¿cÌÙýˆá¢%ÿZÊ2ª¥§­ãFZ£:0²§Õ\ö¸’J©©RÔv†ŽnªÝ•ÇœGzt¨ìz@…â6']QÕžÿ÷¹^UݺÕ8;YYkæè¢¸eÍéUÔ–ÎF›sÍÈ©Ê|_i²T’)¼æðÓ2t YS8¬)º^œ²#ꌦäÔ”YœD †:·ªÝ›‡gñŽå¢*ÖO¥9ÓUç(]ÓœÄˬÅ¥/¥|1 UܪA|Kñ¬Â-ÑÃ.º(>M×,ÝhiЛ›ç­~<‹^ôÑ{ Ý–ý<¡Lú@=Hû÷½´?HûÁ²ýí‡Ëö#ØAïô5 ça¢4Ò*øRصq0AÌ:n£û8ß½þð2jÆV`›ê.À¾Çk/}S,Þ&⬡Õ#Þ€“ù¥5ž¸Åsì´ö–áï¾¶¸§–à‰Pë•éAêëh) ~|Û¦º" Î"6Wc ^V*0fÆL<@‡„q21ã–‰+–‰i?›ßG`½‰°¥?h¿‰PC3±ÅËY¶[,Áeì(C"Ê‘ø+‘¸Qó»I§éís”„ƒë~›X†o-“Gœf|›M†¦16î^5±sM"aI#÷œ´FÁIôÚƒ µ7 aö8̵ØM¤-vSÏQ‰ÕÃX½„õ 0ã–´¿l)>ãXŠ)<ÝfxzV|Z쥵8*"Ôk˜0ü#P„!¶†Q Ûô ·‰ã(•F‡ŠˆËÈí硪[‹ÁI‹eÀŠÚSTdÍýÁFÛ?ÉtcÓ«ý]oÁE \ÇL]á`…I‰=o. }ù-]oRŽØí++h™ê*ÀßÐ~n 1Ûoz춇ϾwGº¼ÁÖZ{ì>{Íu8ÑÓÝÕ꣈4Ðvª;ìsì'óÞ'áá÷Ú™î³{ƒ¤èÜÀU‡X|¸TTZ!XÀ®5Œ=p<¤–uR`$LI8-UP3ÝSžH8+é5D%¿á¥ðЭl}OSì.Eï«ÇÍ;>–‹5gf§ÄE.‹ë%Û(ÌJÆ×ÐRÖ#”™ÝVkP»#ÝËxr<²®žàäR¬Ï­Z’FNmƒÿIZFGüŽ™Âw¬eXY-‚"F·YÐKØSb™ÆŒÅò$©b–ú;]ƒç:)¶]·W1‚: ‹£%pÑò¨;¨½»ã¶þ ç5R®"ãνt¾éyç5ÔÝäŒÞºZC©û•v¼æ–éÀ^šÀ{±æ4¯E{^8þ·„Y±ç_p I˜ã u~uÒ¶™’Äg»‹}ôy÷SøßuOÇ.þPKÁŠ,_ÖPK7A org/hsqldb/error/ErrorCode.class…Ú|å™Çñ}žWƦ¬Œed±‚”+¹Kà"ÛÀ]BXK+k±vWÞ]¹È"laŒm$¦÷v—»Ð!…„^¸„@z¯6½wB/餑Èýßgfÿ!ŸÜÝçs ¿Ù™wÞwf¾«ãÖ}xýÍ™LfF8y|8q|8I2­õʼB¹Q-Ì,V =’‘¢d²Ý«WŽ ­[0´ò€á€oˆd6é®”kõj¾X®ÇOT2“º+ýƒ¥r㣂d:KBµZ©6ŠåÆœb9_]ܨuW‹õÆô¸GûÿµÇŒ¸ÇÉ|¢ÔèÚkht¸4´jhÙðHcÙðXó£¸S‡d6+5Ö Œ7V®XeŸm)™­6|±¶ddÅš±êðÐR|{ÿwÉá¢KÒðè(ÚZ1?í”Ì”R£¿’ïiÔò je P­ µ¸u+É´—}£û¯Y½fxdlÅðhcåêä€[K&WjÔ ‹êZe°Ú]hô ý=ÉÆ>'™Oa‡áµcÝCK–7p„U«V¬ZÖØ{ÅÊáÆðÈÈjÂ6’ù$ï¶dåêÑ¿ÝëóÛkÍ#Ëþv¯m%Ó‘ÌC/>OöÜohßáêêƒâæ.ÉlññÍqTqÛL»Ön‹C±ùe S+Tª ÌP¹ùϵJ÷¼Bº¾_üv²%ÞY2[úNµB÷`µÐÀ?{'ùÒßßnßßåïoïŠÛó¸cKj­Q( ÔÇOzqÇÚ's ½•j\¥jÍîØ¹’™hò½u¬?Ÿ|ÜgË òýÅžF±T´çKf|­1-þOÌ r°Q›6+Éû‹,ãUÈvžqв½g£LõœsZ3gØwwñ´ïæ›Ùe[çIfò@¾V[X©öà , ôíBåDÜéÄà±,×zñÝ•jup ^è‰;œ*™­Ózòõüœ|­Ðè)Öð— Ýé>§mØÿ[+âÇ\ÄåëÅ9ý…¸Ïé¸UÒ}ËóÊ•…xô ö3p¤ûêõF¹RoôÕæ÷ÇG«^Á«#ît¦d>¿P/4úòåžZ_~^良æ,É´¥û•+>è¸ålŒaמ9ÝôeOÓ[,Û×.ÆSm‹åÁ:^R…|ÉŸK¹¤ùÕæç«sKéð/m~u _Í— u;3žð‚m½ ¯°ô¬6g˜žFƒ7.1îq9.¿÷;n³þB#ß÷k­hûõæ‹ý¸[ãNwà]kÛ‹• úï°…ÕJyî†Å±}Òeˆ»Ü…Ž“ sòÝó¥b­”¯w÷ÅîÆîß.Öl+å~»=î‘Ìæöå}~/>Ïwwjµ¸¥§P.&wnéìÜB¹PÍ÷oä:¼`ø¥B©‚—xóXëñÊ`½QéM·ÄïÇ ü­Ÿ¾îãÄmà¢˵ÁJw }^Ƽ7jƒ½½ÅEq—±K¼EªaœÇdËG.û¡]v9Nwz†‡ñÀø¶¸”x^jõøz—Gð¤o˜N¿ÆG1!Í çz /’ »ã4½ƒý¶æ7g6ÙPn &÷è*]$?È“x›vn>?öõ„‘¸×Ë8íµaÃ+’ÙØ64/ïUœÃ?Àpãg¯a‘—êÕ"î§¾<¦¤°°¿X¶¯¼þу÷á^(ØØÞÀÓÆžm˜©7ñVà-x eYˆOI=¹²·ð¢Zؘ6=yA† ß[ámÏøV ïxÆ7bø™g|#†Ÿ{Ίù ÏÙ1é¹CÌ_yîó7žù˜ïzΉù[ÏóŒ·|ø½gœ¨ðÏÞ˜læt»¢÷š9öþ YnL›‘\~K¿gܹ¥doñi;¤[ài[¯òŒ“ÓòCÏ89-W{ÆÉi¹Æ3NNË<ãä´üØ3NNËO°Ùªg|`³5ÏøÀfëžñÍzÆ6»ÀsnÌ…žQÔì"Ï]c.öœs7Ïè_öËž¥˜»{Æ-Ù=<b~Ås~̆gD$»§gt';ä~e÷òŒ¹ÄsAÌ¥ž c7sº­àÞž¶‚ËÅÓ.áTOûîižöÝÓ=íÎð´K8ÓÓ.á,O»„³=íÎñ´Køz3»lTßð´Q}ÓÓFõ-OÕ¹ž6ªo{Ú¨¾ãi£:ÏÓFu¾§êOÕ…ÍœiøØÓ†q‰§ ãROÆež6ŒË=mßõ´a|ÏÓ†q…§ ãÊfβa|ßÓŽ|µ§ùšfζ¯ó´1_ïic¾ÁÓÆ|£§ù&O;òÍž6æ[;òŒ¿ù;ÖzÆßü{ÆŸ¦‡xÆŸ¦‡¦9=9ïažvÞTÙÉoàŽäe¾SŠfni3mQrÉßG}éŸá¹{=ãws÷yÆåÖyÆEÉ­÷Œ˜»ß3.Jîϸ(¹=ã¢äò´a<ì''÷ˆgœœÜ£žqrryÆÉÉ=îÿÆÉ=áÿJÍ=éÿJÍ=åÿJÍ=íÿJÍ=ãÿJÍ=ëÿJÍ=çÿJÍ=ßL»‘r/xÚ伨Ls0÷’§mýi3í ͽìi;'ÏB_ú éÜÖ3níÜÎ3.Jçöžqõ;§zÆuNóŒkÔ9Ý3®Qç ϸF]I.žf¯‚NPÞ¹zdÙÔå£û¯\º×Tû÷‹S ñ?»W/ųù>CM]9´jÙÔÊ^û /ÛHðóF3¹-“Ë„L j\ü·Å™Ðã©' 7¦Þ½)õfè,u+z"õæèIÔmèÉÔ[ Û©§ ;¨·Dç¨;Q[Qoþõ'ÑŸ¢þ4ú¨ÿýOÔÿŒþ õ¿ ÿ•ú³èÏQoƒþ<õ¶èí¨·GO¥ž†žN=ÝE==‹z6zêÑ;Qÿúß©¿€þ"õÎè/Qï‚ÎSÏAwS÷  Ô½è¹Ô}è"õ®èyÔýèu]¡@ϧ®¢kÔuô õôBêEèÅÔ»¡¿L½;zꯠÔ{¢‡¨÷B/¡^Š¦Þ½Œz9zõ>è}©W¢÷£^…^M½½?õz”z }õ胨ע¦>}(õaèé@I}úhêcÐÇR‡>žúô‰Ô'¡O¦þôRý_Ôÿþõ)èS©OCŸN}úLê³ÐgSŸƒþ:õ7Ðߤþú\êo£¿C}ú|ê ÐR_„¾˜úô¥Ô—¡/§þ.ú{ÔW ¯¤þô÷©€¾Šú‡è«©¯AÿˆúÇèŸP_‹¾Žúzô Ô7¢o¢¾} õ­èÛ¨oGßA}'ú.ê»Ñ÷Pß‹¾zz=õýè¨D?Dý0úêGÑQ?Ž~‚úIôSÔO£Ÿ¡~ýõóè¨_D¿DýSôËÔ¯ _¥~ ý:õè7©ßB¿MýúgÔ?Gÿ‚ú—è_QÿýêwÑ¿¥þú÷Ô@ÿ‘ú=ôŸ¨ÿŒþ õûè¨?DÿuCKü¤jE“÷Ò‚G ÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_ÈÿBþ üò_à¿ÿÿ…üø/ä¿À!ÿþ ù/ð_Èü‰ŸSòä”üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò_á¿’ÿ ÿ•üWø¯ä¿Â%ÿþ+ù¯ð_É…ÿJþ+üWò?þ;Š@þøÈÿÿùà ÿüä€ÿüð?ÿþò?Àÿ@þøÈÿÿùà ÿüä€ÿüð?ÿþò?Àÿ@þøÈÿÿùà ÿüä€ÿüð?ÿþò?Àÿ@þøÈÿÿùà ÿüä€ÿüð?ÿþò?Àÿ@þøÈÿÿùà ÿüä€ÿüð?ÿþò?Àÿ@þøÈÿÿùà ÿüä€ÿüð?ÿþò?Àÿ@þøÈÿÿùà ÿüä€ÿüð?ÿþò?Àÿ@þøÈÿÿùà ÿüä€ÿüð?ÿþò?Àÿ@þøÈÿÿùNÀfþPK5ÏÚF€:PK9Aorg/hsqldb/index/PKPK7A%org/hsqldb/index/Index$IndexUse.classuOOÂ@ÅßЖҲXðšHbH<@=lÂU⥧&&žô^èKê6°@üZˆ‰?€Ê8Û ¼üÞìäÍîÛùùýú0Áe.N,"=ç¯Ð¹z'\=Vë…|5«2ŸÉº'SË{B{^•Û7T[½!PJhN ]lƒÑcéø…à&U®B\4á ´øènŽOÝÖ|6ŠÐ:”"ÕZ­“23FBw™í2Yfz!ŸfK5çLÎȾÖ?~)†ü_—ÐÙ\‘ R+q¸6Sðéšk‚â»=ñ`稭gÌÕE§þPK)X<îZPK7Aorg/hsqldb/index/Index.class­VwE}Kj’¦ágh@±H"j›R I* %-´)˜¨uº™¶‹›Ýtg¶P¿•‡ÿ^o-µšY¶EÇ믴ðõšð"™/ˆN£ÖÛ-ûA»iü–!cÿ ß1‹Îô]ßíGýéIG»»®Þs#;hÈVt„³-{ ÂÑA˜¿8òa°!r · ×<²?Ð{·ÂP€£Ô] ­ê¶ÚñzU×TTåºj5¢À8öÒëbgFJ SN¨8|¦\IÓa˜ÅÖ29wKöòÅ®»eZªƒ§£(t›Ú’z9P®vߢL¹™§TÒ7Q¶+kÙÊP¹JKß‘v£ïZt õÀ‹ú~=ˆ| uUÛww"Éhê*ž¸P¸¦½0î  {¥k'IV÷fîϽRµ6îªi4µŽ£R9C䙆»!7EäÅ­÷Ås/ë´ödÈ+Ç¢IW-áS¢Œ<Ê]Ü¥r2';o Èk("¬îE(?”=“³c¼S¨-áTî ©½D³"•‚’µ¤o0T²:VT¯`>‚ ÉHÁ+åôݤíz  ñìÁGÐm`õ¹ªi–SêüP¿€}ãüÎJ§î³®¯dˆ!ß;ð“1XÝCÚ¶¸6ïù ±jY„Ò,¾ågé.>»¢ê «º´ñïZ׿彉-¹à†J#¹EÑQf°m»Óí¤ÚÉÁQæM•q爵L“s:)v+ЭÈóp¨|¹§IšßÏît ; kçÜtÚ ú,P.Émý›ûµŸtûª‰·êü¡˜bîLPxQ›E7ÁfÈò³Ž‡\ÏñÑ‚m>Qzêìþçc‘ÎÑy‹.¼áô,Ò{ô>N¸WSZôNr´x¿õŰ%‹[½…_–òT¢I*àyÊÜ1¨ûxÂ>ûdÂ>û4ÛÓ°ßNØga¿›ˆ/á‹*ð\2Ã^ÆåãºÀ—‹ô!ã%úˆq†.3~LW˱¿BŸ0^ñSúŒñsª2^£/¯Çþ/ã~_Åñ_Ó7ŒßÒwŒßÇþ¨Æ8K7çè&ã<Ýb¼MuÆ5bü‘î0Út7Æ{1.2Þ§ã-Ç8´ÄøVb\±Í¸F PžÓOP°ƒçó@ó9™ù›¬çt yNÆ÷º<þØür4ù?PKâ ö¼¯ PK7A0org/hsqldb/index/IndexAVL$IndexRowIterator.class­VÝSUÿÝ$ä†dC1€- mA´ÉšRí¶¦~E TAÑ%نаKw7€_ï>µÏý xј!éÐ}“ÿÿ‡ŽzÎÍ‚´@éƒÌì9÷ž¯{ιçwß?ù ÀEüEn6£1ù˜É'L>e’c2Âä³(‘|3F1Ã-ŒÇð9&¢´d2ÅÛÛ¬˜Žâ¾`/Ùc&ŠY|ÅÚ¯y5Ç«oØdNâ[‰‚DQ@º¦ë–mK =o;¥Ì‚{¿RœÏL6¤Wš\ÏvL¾ýêeÓqË®—opÓò&ÙŠÍËVÑ\èÞo®d™ÓÓy²ŠXæšgÙEŠÛuÐpŒ ;Y1\ϱWZ÷›MØ«¤Œéè²Uð²vÕòDN ì–­R…Š:Å1W(A“Ê _-[eoXÀMVæËÔö‚‚Ž.!73“šeU­ñIÏ(Ü5–§ŒùŠ©nè]‰’ÄU»`¸cÔ`2EùGK¦Çû n@"™z¾erò:’©Ùü¢±bd*†UÊÜš_4 -JÜ£8æ’½bªØ”‘tÌŠi¸œ”kò Y»R]²\ºÁäì Ÿ))y®¨\F4¤1¬á5¼®á4Îh8‹ oᜆ$Rt&½xCæŠ4T°$ai°yWÃ2û߇£Áeâñ¶Êº +XÕЇ75 á=JYÃ.køßkøY ×ð£€~äô©§ë™ŽA÷EsP¤å,Ët²4T4õdñ|³Îî;Á2VÊ%vÌ<$qp~z Î#Ó8uÔ ´ý—æÔgG åÙa ³C._aÀ(æíM@OC_õÊ•LÁ¶ UÇ¡Ü2Rº6!ó3ǘÐ(Wk^uÊž¹+"” Øÿ#´öð“zÑó²ÔàÇT.·­Ffáêî¢1ÀCÉ—Iâ¼غixÅ*\Lr/Ž~&ó ދǸwœ{'¸÷&nÞ¬¯ë‡qßÂÀ·òøCü|7óëÛð‡Ü ¸¨y„{ä†~|÷ÞÉcïb¼wsóÇ<ö¾ßçÄ÷»ñø'NüS|Ô‰tãŸáŸóÔqóaâI>†§xêGXŠÇ | Ýxš_>Ê͆}Œ±>îÁOà'ùuˆáSnü4>éÆÏà0ÓŠ›Ï2ô/ <ËôÏñôÏøy<ÏànF¹¹ÀÍÓÜ\äæ Ü\âæFþ"7ÏøœÆç™í—xä/¹÷WÜûknþ†›1n.;ñË,ÍW˜ãW üš_7ðo ü;„ò¶Xwäøöø±¶T$NÅf[,I¬ï '“‘$BI¤·/u" ¶Ç‡›$èé>ØåÙÍ‚ÆÚÝíó ‰­ é}‘D2šLEb]‘¶nÜŒ ÆÂ½¿‰àÜDt:é aA.]{¸# Ž$æÛïDÐÙïY$ÒuAÙ¿Ïz|ù½vG…û{Rëã=á> ¾óD«2s.63ˆ¨„ÕIv!¸bý==Éöp2E´¢ÉÑÞ¾žÈ–Dw„tGæg‘ÑäÖ{ÄÈ®Xô~1£ÉõñX2•Gc4ßMnŒ'Ž…¤¸‡@=ý´‰½i©ðA&1#W¢<¶.œjöÅ“ÑT4#®¤•N®M$Â' ”Ý•¤ÉóöO²óm&Äú´†Sa„ªýí÷‡ 7÷„c‡›·¼?Ò•"µ'΋é·`ý©hOsW<ÖÕŸHDb©f&›·GÂÝ{ÑT¤^™h‚Úż¹SÍ“è®cö\}e4M­B7LkÇ7_¡ýmû÷Ñ¿I6tý4î&ÝÖÇ»i¡Jv¤Â]GÉÄ|aûß4ð[J#´Ä‡#)žŒàhhl³Þ-Ó\ØÐ8Mã,¥9ëi­{⇭©%4°£ëH¤7l½;é}˱S}>ÕDôð‘T²ùu‰p,aZ¿¡q:æ9?_«XøÁèavÍùnÄCŒ¶fN„'™û¦6´±¸åŒ’ïlÄvÄ{ú{cëãý| I4:ÂîÌp’g7²ÛÈ¢Jg1«@þÀtþåÞßÀjµøt˜¢É |N{©È"<ý±žhì(‹‘ä#?ñD0ˆîN±ÛîXäxj—˜Ð2òä ¢ÒÅ×£¼§)ên{š”tí´¦M­M;Ÿp"B'¹3³ÍluÑm(r3jã}]sC‰â¶5=‚@ŽntÃ[.ðukµ6!Cáî ÇBÖæ ÙKF©-‰ÖHO$EÂ.¿îy yÞ÷‘úœ'(‰[üÈ¡ ';9t¢Pbºró Ñ£B.„{^óù,”±q7…Õ¾H‘6ÑïúZa/9…ÈqššÜæ(aëkw2EÍ“2ÑQØM$Sbûo&‡¶¶6Šz¦ucÆo&ßiq|à&¯åtxVå.vg<ňpïkwõÓaê<”ÙÝMÓs¯Ó¡jPÆeUù¸‘œÜ/·Mys¨="íÙw£Î*÷Ý ñ¶¶ýS+QF×ôýáÎY¬k×ÿÁBòIw²ñuŠ £÷æÚ>Ÿó)•<òÚU*âT¦`eà62̓ašÐEz®»ÁÝá+ók»(©Irœ·æ÷?B…«Á³Š·ÿl÷¾bÛ1UÝù²«G&º”tì6á x— n‡ठÇM8 5á œ2ácÜ Á'Lø7ŸææIn†á)ÊTMü'ø¾ Á)„Ù×Iª˜Õ?›p>g࿘øm|É„'ˆ~ÿÕ„3ÑOÂ'(_*4>çM|ÆOY  >§©yUF`”²Ô‚5§µ¿·÷„ß5áþ5ð´ ¹w‘zøï´.ø=üŠ“§Ìsff£ëúQ¢LšÃKtã¯ß¾aíÎ &~ÿ“›ð¢¾Lã»:Û¶íÚ€ µu¶nx½ —áË&þÿ AÙÒI R˜…™øßð‚‰ÿƒ?2ñÇÔƒGáƒ&|þ„ÏÀ' ü éL»Š?ÅŸ™ø¿Üû9þÂÄ¥x‡‰¿äæ6ô›ø+|ÅDºMø5ü†áEÍÐ[qå&þ^6ñ·øª iŠð Ã~‡ã&^Åk&¦0dâ3©Qs ÊÄMÅ¡¨†¢™Š®´,ñ£‘ØasšæX‘O·¡8MÅ¥¸¼ùn*G˜Y0;ŸÓ'¢$C1M¥D)%U”2S) ¬^0• ¥ÒPªL¥š, +°’·ò.„Šü`ŒŽ‡©x•¦R£Ì4+R‚¥¦2K©5”:S©gí4•[”Ù†2ÇTæ*´./šÊ­Ê|SY Üf* •ãÊʳ;¿²ºhodÃñ®HL¥‘H)~%@Ù|¾¼vª©•&SYã¦ÒÌkw;7‹¹YB«­,eÀÊ&6á"à<Šd§æÉø”SY¦‚ Lt¹2у&ïÔB54L,GƒÍ§šÊ e%‹r7-ýd~aÞõÝ‚oR1É(ŠÃ …<Ó­Ó¨j!T«NPè•ÝŠGñcÖ][9Ñõra¶aÎõb ²Ï”Ü:ª—3ùÈ1YÊá4µ=ÊJ]‘Yh·BT„f¸QAÝE>@DW`F’;ãëâñžH8& ¬F×EñåP´§gG„ÒVq÷iÇeéÆª6L·nJëmÒ¦¬–êIQ‰#†q«RX;eP÷õEbÝÁ†‰Uº‰…;ËUÒ¼Ú†õS@K’©p*ÒKÂYFP9‘6]E™êæ6 ¸¢‡¢‘îùÓÊ3…2Þ1QM¬ià$¼9g*nõ‰òu–‰¹ÁGVwjŠ^ú\­ÒûcV…»2w†]Ž¨Ô„x.×€Û#‡RVϪ¢/Ÿ^¼R´ÖÎåßí¼Dóeç»…u·bÿÊüz(§³..mʌՈ&%…)«IœYÇ$⬩b'®ò Î-¿fIgtGè¤Æéèh1k±X£uvÈ8Í T[^D²ãÁz)vŠ÷óù·Ö2oÞJæA3‘pï Ûå“} Ëk;\׎pzÌw7Ùò®¬š‡“WX'ìlñú‹·¡¸èV1›Ì¡›,ê ð¦Þ\F­r˜U,2L÷ X,K.†¬u²ULqí<|¯œÔü‹mÚú0öîœOñag—<`®Ôqy{ÐΫi“³J†»ø––+òƒ¼‰â³ZÇn²0Ò®–´³ÔÍÞ ¢¢%Jœ‹'?ÂíE/”ù·b$‘ ‹h·d<ëÙÜÐVÌ›\˜™àc…u-dÞ™Àõê(…´®#ÑžîéÖ^§ÎIŽ“÷OÒk­3G“m±ŽHo’]á*“n =~›Uç¬ä/XÙsÛ;çÏyÓòfBïÖa[\ü°Më¯(tÍ“žúI lÖä‘/Ì…÷C |€ÚYœó@%§îô¬æì]¼S.NÏrNäÅûâYÎ9½x?#à•œÙ‹qJ¼Åó“âYÍɾx~J>?-ž•œõÓSá “ž*Ä_ÁPÚ)Æ)¯‹'eÝâIÉ´x^Ï $ÿàµÏФYà„2Üé¿èŸ3Š?0¿OÕïsŽ€æ÷é—ÁãÓž}Fͧ€î÷¹CÆ~¯kœ~¯{\~¯gÜ~¯9¿O“ÚQ(R¿úE(Ûë¸DßÔg/@ùލà>ý–> •~¦Kdªè½êi¨hƒA¬TGK‰£¥Ô[Jcú³g`?½¥KOB õ ê ‚N8¥8”þŽßK½ÌÆ;傌zZÒÿ/BÍÌdñ|OÒêÄÊô[/y¬Þ fí½µ#P7Dj\‚zz»…Þ˜LÝE˜´ÞsäË\~™wŽæ!|‘ÚóP–†0 xÖ€çTž7àKü¥øÿWH?€üušÐ§ÂQ‡^·Nõwpd ^±^¹Ú>1 dò™ÖT¼½ÄMþÆ,;!!éé(¯Æ„\#‘À ÔH{ÇY þJ\#ÁŸ‡[é¿ôÕ RµDrJ$ãkðõIÉÌ·‘þþ.CF±È\‚´A·ÙßÈ`”J2 Ú°o·$¬„5ä±sô÷ð‚}ŒÌB¡ç».ÁB"ÜÐÎÏò5 ±=Pé…@ùœQî¡^Ó ”*e†•ÍÙ>Áo?‹i`5T¹$xÌçaé(Ü1 w 9"O‡úì(´ˆñQXv6c]NÀqXlÀ?Ðû?‹=­•P\OIeÎÂ?Ù° {…–àr V?wÙÐɘBîäå¶1|^’àJâË ¥ûé¬,·ò;¹*¤\<]±Eû× õJI]úÚä?/áî²ÁŸ. vÛàï¿«¶jÿß+ÖlðÀ÷‹€uüŸE‰WÙàd4k•`öÎAÐÃ,ã ÔÒÃ3†1e¬uä¢Ôam8g‹5W…{ òû“E•õØÊþþkÂNK7íøoøŸb;²áŸ)J>d“ÿüX‚·Ód]ê3ç"ÐÕ \„• ¬³îF˜ûTH˼ø´çh†‹ÈÖѬ:¸E<-ýtÀ{ ø ½ý~–C_Ë£ð_„U ¬ÍœóTHÍÒW§Cÿáç}|…Fùêëu¬R[¬ãõŒÒ-ºúŒ;dd¸úƒ£°:äô9C.Ÿó2Ì´1ÝYÎî³>cæÂr]}ª½ºqœêª!p èt!½ìúœ4è3Fa-¡ŽE-ºDžãˆéë|.Ñj£°ži¨4ñ«õƒp Ë6ô¹é¾juÞØâq´˜^S œ;|n¯yïâjØßN—¡·ä<°øÃ§ Ú§IÈÑí%Dù&µ_^„×!,sçRYÁ¸‹K?t\Ü+ÛÎí ÷»Åp\¼1!¢êá>u· b_òi!3»4æÙPiö­ô9ò¯³á.<Àwð`X¼[[uß•­àWÔ/ ø%ÒÕø+÷Ô+ô Ê­ÕÖ]ƒùA~ ¯JiÞIkÃqÇ&Ǫ¬ñˆ\[Hõ©a3 Tpï„=ZìÕ·d˜WéÙµÖù8x`„ˆfVЧ%É-ภU$É•š4]jv­¬5BøŒK©öŽˆåÈD+uYRwgÖ wfúMÖQ¬y4sÜ*žo8¼kð‹ÍU¸&Ù<$½É&¢1Ï:íÁΦ1(mê"­|çPúWÁ1Šã‚ ¤c(ý ™A…p5ólWsNÐˉærX!ž–Õl*%Ö.”¾ å,J a§…weYÞEoÜ Æ›:ˆk]°ûk¸_j÷I ÀÙ@¿t´Æ`!ïUç Ìàla¡·ŽÂ6Ûn# ¥_"<'ÃwäÁ³—y èãPÉ¢¡±nvúQ¤Xï#¡Ø!îÉ߉ì$©ªƒÂVv–l?mê Õ«òÈwŠv-áÏ2[Ä+–ç<­[ ›x`³xZ2yA¿ ÖŠUã«Pe-ðצÙb‚}'·›B* àm¢îîòk§Áó9ØSùúQØëSÇ`†OÍßGã„]dôŽQØÒ¿WâÏ Š l„MF|nµD¬©ñѺi¨g,X§|¥O}¶…ý»W÷jg„Ak^}I ÈÏ«/ZÒäQxC‹á5(•ðÃÂsË‘=Å>;NÄ9ÁÆlvH6Ën”ƒãàÈ2pJ»ˆû‡åä­¼šW=· šÍ@#v‡YÌB&W5”þÆDM º%‹¸Ô¡]°7ÁZRhjF†W? NV¨ŒÔî]\Öµ]mÑÛKÙMª•¹^…;‘¬Èc1÷ )™?-õ{¯£Eõª’ù³jsVmΪř„ÂËšjì1(Ë Ú¾J¨AÞœ²ÄKb-%ü§a Ê1¢$nÞ7笙\,ý8,ÃÇzz±êUà´Š0J°T†HZx}Œã}!½‰[ëµ8½N©Ò#B%çº1„„ÎEK|†Ýc¥\^ ÷ÚJ¹†³xäÿ²¨µÜB-§PÁÍj¹R-.¡–”cDkÀIjãí6ð‰w ²Ì9ÃéúàIw–qWfÛÊpŽúPr Ê ,£ÿ¤ürôå/Â8ÌR)B½"ÂÄòÌ©h å`¿^7Ñ‚|¶ýX±%ð§b9ëÒ°³öj1Í‘Uz8`õÜóðÆó^•k4sƒÙ­wQðäQ‡ëOò•.6õ%êK"íf€g&…ׯF²Nb­F4€X…Õ–PJ=)bÒ„½dÚJ‹aÅêeµÞ7 íípf®0Š«ºì’n¬æS/ ¿éyèæìi"áƒñž}}ó©4ekÈE´}.¯“b¼#ì/NBˆ®¯ó$,¶ÔŽ^„û9*˜Ç± Å„GOBJXódÊ(ç¶ YÝV-D¤•£ÐrûÜ—¡¼üˆ•U/~zŸó¹-•bÏyS™³#äׂ^}⬈[õ¡ô.1˜£Ò(ôÑ]¤¨P(Ðmê8B~.ä)ø²Žýƒp‘¡¡¼ô|Ë ÜÂÜ ©C0ØrÒ»“t Áv ô& ´Æ½™@ËhˆI2!ÝÂ’¢š¤ä²Ñééb2b%û=B«KØM,$Ç/ž&AëD' "ÓäÈ“qßÚBëá'¼‡Ä²tr×4†lê`çjùO^HZE¯v„k‹x4M?b“fÑï|J‚¯ònZëÜ(ð4®Ú‹Ïå(b—èTåÇ ä`Í¢q¯ÊÎÜ)¬q_‡€ùhêì n³™ñ¸–âíÕ'òuH ‡€ûtZæç2ñ3í‡|NK¡—ê—–Ç`§a§³óœ-³–úÓt²Õ\öQ5XÊwì­è¢<Í z.\TjÑgà,6©BÑ\,=V&yçΞÃ&r×ð¦Á?š&Ñ®KOÏCĬ7½ÙÒUÞ" n‘› Îo¡üU¾Ó*hÄFÌ\?ãP%^±ëäE³œî ¯ê) €Š2œòFŽÂ°{›æ¸Aá;^¡M=Þ"ɼžÈ¸éy·W/ß|Ü"•|ÛY&ÊÅL/e-¯ÁdEuËàÂð%xx/Eshh»o?›{•ŽC%l=Ζ\ÚÀ·b³¤k…kå!°)ò(«‡#®¨t϶ÉΑd7È5ä¬Ã^ƒ’ZQ’µɹ8/‡¤*I’\ó«RËoT;›òi6%)•¿5CòD’³›Gó ‹MVPîS;›DýPJÿœÂ¼fº|M"Ôd° ññ"ü¡F]Ü%þ Ìê_ ‘ªI¤¼jk|ù°‚B‘ƒ„{B1ø#9Á¿~UT%èÅ8, Ð‡‚¦ê4ÔJ;åxHÖŽHçùRçOÊ9PP±ÈvvaGÊŸ[ò#ÅRþí'ù4<ËsƸ ž•[GbQŠ¡YyUy@œ„³ŒÞt6 ÚÉ—€€CéÏæ]/õiZ 4\_„IDÞ$nÃF)ÂAYélµBhÚ×:ÛD ÍõlPDÊ\œÁRRœ[j ¥Ìz“ScYЛ!øù%¿§d½w ÞËߥqœVdN‘Ö¬p E\ù°5lvÌ…!9ZСô÷Híú-$aH·Äp¤IÊÚ Ç]$fe.`(ýC‰ž‘·ÜîV¼Ì –{8Ã¥{jÅnÙK•Kµ9(v+³HrÁ6å,ئâ ö–I¬„6g\V¹b ÊÚŠ_Öë¿M‡ÑÚlCn¶Ï¸(ÙzCÍl½:l[H³2¹ëz‘p¬£#F¦Â«óG'¡Y¦Þ×¥›>¯ó}CFøŽ›Dñójn½eèiX”›ÚʰPd¥i.Ô€ ,³€å«+V™&\$+¬O]Š?ß§…ÈvÜò`Ȥ{¿ñ ®€•7?ú€–ö¹Æð€øµ5dòW$íq¨&µÌQ¸OTnFáümé$Ò$ÎnÆ…û¸Ó^úíáä†~ùo\¾.áM¢ ë yá5!÷ü8Ÿæ»˜æG T lb„¯åã?SÿT.þcùøï)Š_™Asgñï-*Oþ²,~°¾Rùî§á÷ ÁœQʽ%CF®³Ð3äºv†\V•Ï*Éú÷’³>Ïõy¬EÏXˆé%¿ì…²Éëdïèó9‰úõv‘„Á¢Á&A›–þlÁ¦ ¦OÑ–£ù„ït.|Taù„RÎO¥N¹EÉ~Rí‚™œ”ä”CÊ ø°Èä8ÂéÂ¥¥sèß|÷|·§Ì4®€^µ°t#!¸æó·:Wö%Õ„ÍòðËòÛ@ë20äD MÉ5~W|†ãÚÙyÐK¸FÊËâ!WÝ^õIQnühŽÁ6ÓïÛ…RÖ¸ýËã]\S­ôé”\ŠO€\Ǹßë~œvZ~ ‚}^÷)Ø•…oöºË…‡ò§ ¦×æƒÍŒMñßY ›1صÏ6ã,øòìƒÝâÛ1)±—U½ÏÚÌRþøÌF⤻³ñtúk“¬Ï`ú-&›GŸ'ûæ±ÌCÁi?Jñ~ñ|óSšG'”seγµ·O´ŒÝXUVVVZVê´Œ¢™ÍAÏŸc[Âb\bY‚ã¨õ•·Ôg -ªUhQ¹Ð‚ósê,ìræÒ¯OV3D5%%*.p%¨çJ¥ ÖìÔiØÈU MTuêi¸>¿”Ñ‘;$Šš]%Ѭ „6g æñ}+ 49Ÿ.˜ Üg¦}ŒZÏo…lõ¶™¨‘¨¢¢fj$šä‰jN«Xr.hÕíTÑyë*y _;Ÿ©b¸a\y˜‡†'ÍQe&ÅIRþBŒ ¹~Å”¢å ÌK‡gæ—=¦=/MaŒ‘+˜Yš<¿x¢ÎEЍ}rÔåTlp^Ù§8·qÓ_…’+ ŽÙR¼C†}>ùa¼„ÿç= <ïíZéx'¶H´%2…ªŸ){éâ‡Ì7ð9àÄex—œ?—æóWd€ø<¼ÑJ?wÙ§ô§ÀET< ï‡?!É>Œß Oç#ÿñ8®ÿPKÌ&‘(lOPK7A%org/hsqldb/index/IndexAVLMemory.class­W{\[Õÿronnr¡@MéÅb)¶JÉ¥ÑêX×ѧÅZK['ÝæB¸BlHhl;çÞO§{8çë^es¯â(Z§Ö½¨sï§{¿nnsó¯Ùmöû›„$Êì œsÏù=Ïïñ=§Ožyø1«ño/ZЭã%ØåÃnìñÒ×µ<¼BÇuè᯽Lx%/_å¥áÕ:®Çk<yÑ‹°}¼iópƒý^ ÂêndÑ}üåaPCŒç¸5òa?¬1É{)†½¸ Xè ŽCx­Ž›ñ:nÁëyï ÌòFÞ¤áÍ^\„·xñV¼wÞ®c ÞáÅ;ñ.öâVæ7+¿‡Ûyï=<¼—‡÷ñð~îÐð w ¸¯ŒÄ"©µîðlIîv…m£#³¢¡dÒN „·ÅýÁ¢÷õ³l¡X¨ßN,ϮۮÎçÚêÚëCI»moÇÞúÍ'¦ ÙÉà.ÛzègåeC¼,{Ãvx_G¬Ï>(pqÝ!;‘Œ$SÁÎlÇRÝ©xÂncéòîT(¼¯34$Íjø†»³ÊºH1bݼ”åóDØ‹ ‹¯Û³MšqGbI;‘ØZ ¬ÛN&#ñXÛÿj`gü©•¹Ñ0ªá ÷’•>;j§œSŒRdböA2Ùs®þÏN"”j²¡õ†¢¡X˜ò°þ­QN ¼m>Œû4|ÄÀa|ÔÀÇðqë±Îfàø¤.l7p„ic¼ü>­á~ŸÁgõ&âûìX½T]ß\ïÄ¥OÃç |_ð2dè޲™q< °¸HE,^?JÐ(ؾˆ Ç0iàA¿ªH<¸#a Šâ`[6‰…Ûäô¯Hª1/DŒÄú%ZêäÝÙlä²½8%®kœ¢z‚Hhc(bµ+K§6’Ü‹ì¦# ð „’]ÃQÖÝT•K(aC¤¦;28ÄÕ¨HDR¶“gÏP<IÉzŽ;]òfªkì˜3…¾d~M\Y☲±J^BtSõe£Ð¹\Ú•Å—¹ŽGùÞ¤Ó.žíJu¸2whÙ^:…¿$#.d8h+}¡Íˆ\‰X’þó3zÈÇÍñD‡¼$·'6J8¸â¬—%Ÿ­xÝÓÁš=}T ½ôŒàâÌãØ˜Ùæâ,±M9MÌàuwÁÃ$Š%CaNq†tÔÍÉ ‹¥sy•”@Õ³ ’ÜĽ“`Æ´Ýÿ—'Á̆0"É ñX2•ÉfSS޹E¥[” ªX§?¦ÅdRd9\:k]÷´h[aõä»b¥MÃöÓ.ÁÆRVürÌ ð«#&oóz]Ò#/™ XQÜœ[§z&ìP\òtÙ‰D<ÜÄ#Îvæ`cG ¸šËMu¶ÀÞyÁkÏ‹|€y"9×b9ÐŒ$wÆã©yC;U‹7’Üœˆ:·‰–°‡¢!ÖyÝ‹|ÎÍ„¬™b5<‰öÍ÷Ý3gjg¯,£ÿÛ´€<ü¶¤ñJZ­@9ýfS ÞTLÕt›šéñë~¯ßç7„—B/ÃÚŒÈípA¥yOÓÊŽÃEWG`J§è²¦°Ðêj X“P­ ¸;ÇÒÏ6w6ÓnS ™öä¨uÑ®#êôn­jUr+S91Ž2èäÞUdá*tÈYàå4úá>* íôo¡x ·jXǾӓ8ãÚm×¢l½‹½U!óþfrÐ[yæ0|ÀWmL¢ÜT¦°ÈT ö+hŸ¸k,f_0‰ÊQg¿*ÿؒE”ñœƒPNc™ã`MI»±Éñ¬l ÜD‡¸Uiq—µh‡êV{áÊ›¦gç@SÆ ¸ZtÚ÷·xi\ä„—â©´*¦ÒªšÊI,µššG ‘OÂ<ŽZV ษLàüVŸ«Eó{G°–K\«I?}Ô¹V­6}d8ó=‰ ˆKÅ ¿>‚zJŽéóëÊ$–¶hc¨Ì¬]rÍl­)´øõQ\˜@ý–GƒÀ(á&‰]8Š…œwäØÈc9ÙU´\>‚ZšV<Ž‹š&qq«a†I4ž¨ ÂÊ 4=„À ¿vo6n>³ß=Ÿ©RFÇàáYçXœä¥{,]eª–ßIX­j“e’Ü$šs‘áB+Ï­Ìr*4.Ãnq3eîzçYÜ,n‘k'Ÿw¢*:è6k¸JÃêBh¸pµ‹4eÖ—OtR/„^࣭Áð´‹êD:½,•…R•$AÓº4µã\Jégk¶ÞÕTU>ª®§¬“PÆsÃÕ>®ÿ®1qÏÎÒMËV«"›S¶‡jª2’º©r·fûfU‹jq)­:†U¦âWi¢Ý`«›7ƒ­šl„K(/&KV ejÇ4µ),15Rl*G`˜šu :+ç’5ÝG°ÖT,f%EnëL²#iìÇ2=RbÜÕ%Sf—œ °–uçSQÝa²L(|46ÂÇqŒ5z[ofIZ )ßiÑ1.mQ¬@•âj>b5ÛeÍS"ÚÜéW2-YÖÂp¶Ê¯Üï á¦4ýÈ:–Ðßrú»ÜrQ”ÆÄrK†kº%­€_ÍTô$.§º9ÀÔ¤ð\OÆM*ÕÕ¦›™Á“/ÁÐ`]+iq7ï˜0Ý~5UhÊ%·±s wçëlbU«M4. ¦§Ð5i)ý²®-tÇQ˜c•NY|–ÃÐÉfr|£­ÔaxüjvË㌹ s´ÇÎÜUТÞéõR‹*¨w”=A‘¾Wœæ¹L+{DÎO”=ɳӪeKШÖTœ†F¿í/ \öššÆxd/mqºˆÉ™€:5à¿xišîC%Ÿ…Ûv‘¨h/`¹Ð¤á…;ŸN=X¦þßÉPLr9$‚†K2¸±eº¥í|éY8²J¬S¨d´˜…MͰUŸ»€‘|«>wßÒ¨ïåyo›¿þþíwa'p_Æ‘ÂWâøZÄñ8Œë⨈£šÇc!ÕÄQOÀÄ**6¢¥¥GËK« ¬À0–·š¶c45£Ñááè!fÞ4F³Â"Íæ0L­v-W·Ÿ6ªë9³YåÏr%«Ê֊ׄR‘?&¥hsŬÕIP›ËF›7I ·­-†×z­W¬-²‰^7›¦sƒ4ÒçÖ”ó’zfêsÄÄÛîÚ©TÉ[*Þ£GZgix‰ ºg\Ã,u]ÒÉþXV÷óñskJŒ>À5éà™ Yù™%²¶‹x)3—ý‰0žc\€Á'™Ý…vÿe¯ÇñDŠ„ë݉8-k‘Ìèãwsÿ7¤þ˜»¤àoÇG˜ -ô@á^è&òJÉÝ År1…’ü8`vBÛ¾O$ɸ„ Æ8­ŒmˆMìbÚ³u¶„dt2¤MŸ´ô‘WI¸MCÓ¦nZÒB‹ NÛ<ú€&ý—’Ò™»ÕéäXŠLúõûìÙÙÙÙßÌÍÌ®ÞÿÏ›o¸ÿ£çjÑ€o1ù6“óL¾Ãä»|ßgîY&Ï1yžÉ aDñ"“0¹ÁKø¡Šñøc–ü„ÉEžN3÷S?ã“.0!•¼\KÜ ÌýœÉ+¼ëR¿ãUü’%¿bòïÿ5›™áéo˜¼Î²ß2wm<Çäù~‡Ë,{#‚ßã*®HsÙ3Öôdsãmö©tj¤­?{¦c°g¿eŸh—´ẕ¼))¡Æê·Æ'h¢Z‡Œœ™!N¶’) Ú@r¸ëX²ïؾ#‡»$,ëÌf켑Éé)S¦FIy·•±òŸ‘ðp¬Ìa~1¡²²¼˜ÌLNå“™¼™3FÍödË ¥3›2阼1z¢×˜PrĤ™³-;ßvÈ)RùlÎloY€ƒâ«’…ýFÞðPu&Žö7Nmi#3Þvpä¸9š'+¡1+“ês¢ÒU•™d R6϶±~ñÃ×X¶ûå×ÇÊnmç訖]H òÅÕÙ»ôp”&—8´®ÝZºH¸0ñû ò~”|ÝRÝ1NêÚýÙl¾j•a'ÉeOºG'¬4ezGUêÃVZ0\Öݸ‡ÞŸ­ô$¬¡·,U$q.Tg¼OŒÛÅx¿36bôÆrd;ÑBüƒxˆø]$y‘F…ÆãúuHz`&2EÏ"¨¯ŸEž˜‡*QÕ‡<.àq²Ç)ú5^¦MŽk/¯^¹J§Ih'ºòm< EÅn{TÐ둦%…¶ìu€ve :å·ð†²@› (góûÐ)ôv’ÙE|¡Ž4‹Z&a&]fç®!8­`„Ú˜0²ŠF6"v,»,v<âí¨;raúŸ§ðk×½!v$Ñ-vì%×H×þ4V:¬<å25ÄèžÅç±B¢®»’'W¼0ʉ=€Ú@ñ¼ú+ÎynšbG8Hã½R_¼ù²JáSv)ÊMDù;ÖÌaõ;hèk-ô!6º_‹¦qȃ¯8nŽß ÎÀ%¨Ê ù2ÏÎÅç°æ¥é‚ȳW‹`t¯þåA9kr‰5¹*kt5kÏ5NðÇõ^G_«Þ ¥áík-zÜ›pJWˆ«½‰e<Ìaí4Ö&ô8¯^G#%‹³hⱤ:(¢Å RmtI2,²‡%ìb û±È–0‹–p%,yXN ,ƒKÁ¢xX".–ˆƒ%JX¸Ä,—à‘tCÃÊ]ưu)B—K²ÅKÈÏãˆ0<$ ï\ªs “ª²wBÄɬaïgE/9‚ÊåÊ$Ku¼D:\>‹$û Ôø£Ú°—»ÏQ|A@‹‹f¹²ù"µ6*˜u3Ô hl.~m¿Š/r>â˜P|Ô¸1œÔûØ nÊÖOãnÇ-¥à/øšD£âø^ߨȴ{hÞ[¹áîz›åZkâÔHPáž§ÖÛš rSìöu“e«ëÖš^OÜæFåÌ ‚*¾t€ØßŒ Ø“vÿÁÖो$ôQl¶(ÍS^Ð^§ýON_­€ˆVmåhE?&Zà7ðÿ¯,ð†?^‰ŸæÞmåâÝLÙ\§Ç©:îÞEõqØ{v)­7nësØ8Ô¨ C^þT²&É,a®[\~Ûu·]}‰ôûâ‰Öyl’1ƒ5\.÷> ð°9¾Z¡£>5T|»!ׇë¹ú½{k·¸·6ÅßEÃE¬×ã¯ÑU=‡-q  Å2ö² eÌE ¤…¥åâ—£ÑÂkâ$2bñi:›GÖMã ݹ¡"<Ð+¦Iw. ž†Å”ºLB<;ô’ŽâLiSlÆÙÏl‹®ëÒ0&ý‡)ã®úPë붨üÈÉR±¹@.‰GK/gMhzÀy¿8—¿<•yO*û¤²'U|RÅ‘Ïì@ÍŠS·ù'5r<ž’­Zè µ}IÄ-qÇ´‰ˆQ–Ìoæ¾Ãü Q˜Û!Ì5Ë{š¯ Þ*¡¦=3Xo:7„Œó{šý_9ð¢R-MO{/ÓeÎ2ýÞ›gÊ/ÑOdßRÀ¿D?¡Ë¾A¿T^íËÔžÁW|j²_í«^¼_«°öõ kôëÝ·ð­á¿PKãã`š EPK8A'org/hsqldb/index/NodeAVLDiskLarge.class½W‹{Çÿt§³äÖñÁ!€8ÉÒÔ)6 ÆÆielCm Å$¥gû°„d$9<’¥¥¤m’6â¾Ò6©û€lpÚ&¤hÒgÚÿ¦_¨;s·’NŽ-éWŸgwfgfg~7;»zï?o¾àü+€ñUeFüù±_còu&Ï1yžÉ 帾ɳ²ëòd†¿Ääe&¯P‡o19Ïd¼߯wT|—Çï±äûL^eö<û¡ŠqãLÈd)^óÓìž½ÎäǬ5Q†ŸðSüŒ%?grõ/²›_0ûK&—Xv™gãìã%&/3û+&o”ã &Ë1…«*®Ið¦’G$,êJ¦†GÒ‡ãC½É#[vumµÒ[$(V—¹?#Aê”à³z­ábTk‡‘24óZ±!ZŒIÐúbýûb=ûÚöìì° =™HgŒDf—3½„Pl²Væ ›ÃólèSdV’c‰Ñ±L,‘1SûA³%¶v—¹=9dÒ6}cð`·1ºÓˆ›„"¬bZB ãè 9š±( oJX2ߎ¶7ß73äÏf6`¥c‰nóP2uÌõK(³ÒYoØÌìH¦í•N‡íe› ¶5Si+iÜጄV_&™2[ÖΊƒ0VÉÃV#cHØXš‹½]Œ'ŒÆ¸‘nÜ>pÀÌ—²ýVb¨ÇF¥³$7¡±y´‘í2]FjØlᯞvJ`Yx^ý†HµÒÙú „›Ö;ǤÐ1åÅø:~ýŒ¼¨¼ÍÛ ‚`^SÚ61;›Þd2S²I¿] ¦’‡œ„”Á+N%¿¥$óþ"™ÙÇÏŸÎgÔ_’Ë"ß Ø^t0~M©¤] •–B¬èÇQÓÙ/]–Î}&/M%ì- ¡»Ê‡6N™£qƒÓØs—°Å˜ƒ“û‚yẍÓQ/ç"4xŸuœ¶ ‡çìSÛÇ2Šë­œ°È÷9ÜÏn•#)+s~Ȥ½4U·RÜhìJ&†»’Ƀc£äEÅoTüVB5%³3e$Òq#cîHZl-áÞpg1ëNó4ƒI³!𥒔QÕØèyÙ28h¦ÓíÉ1.d9l7Õ Ú¦@Ný’© Dø›æƒ&ë|iÑ`åp§ÝŽGŒtû5;“^…•Þfš£yLµƒ,Cܯ¡Û4<„OhØÈ¤™ÉÇѤ¡›è‚ÐðNkx›4\Ç;~Çä÷LþÀ–]èÖ°;èÔhø#nH¨óúÐð û9‰Súp“uÿ¤á]¼'¡þ¶ÍUÃg°KC?öjxŒÉ9ب§÷èƒô2ô!Èg“f>²ö¸QŒÍb¤cKcÓ(á[¶aš·b ÍÛHòo¨àùûúUHz <“AqŸ™„ª/›DYt~z²Éz­üÂ$ºÃŸ©Aù ¶*`•BÖW+Waæ5lÒ÷\aæL°ìX œ8ÅHfQ0+’Y¤°hqV¤è¤äqœ¶A’†‹çuŸ‹÷]¦¤è ºò ^…¢b«ŠJPYY‰OÒ¢LJŸ²‰eDÖà ~{ßD–"¼ oÓ‰mÂúa²%÷Ø0·¥4‰J&A&Uº—a¼u ³®¨‹ W54²«2G£ú‚ÐèÉiT 7»Fí7gíq[×\ŸF¯Ðh¥P=4F„ÿq,´§ÞiÔz©Ã×]b.2EýôYÌÌ¥¨”eˆ¦}ØéŠÖ“ß/tÉÞÏÃíZh´Ø>WKÍrdírÌ»4+!åªBü˦°ä:–6Ë!9¿U9¤[Xé|=bwã³Âa9ä-×Dn¢†ëƒr¦ På ÈÞ ,ˆLaY^’óè‡RÝJ­•Ú3¯?e¶?¥t5 §èdÉ4z7ƒÒÓ`ƒ¼¼䞆|ÞÝÑ\Št‰˜ÊXÀÖcqT°ÂUÜKUÄâè$Vð˜Çªò-¬u°Ò‚5$y죅£¸Ã :áÝá(v8A‹p‚ÅÂy<Î1Ξ; Çç§Ê §Ê'Háp°Ã©bñ|ah$ýö‰0¶Q)sëî$ŒÀ…Âê\›«ÎÏÃŽûÉ-;n¾‹üfX¼¹M*ì*ÈíóœÀ1~78ÊŠãHÎjx‰Ì¨ò戬 >7´µ­Ü‘1$‚‹Ðâfºpéy”ët|ê'¨CÐx_þë¨ðhdnÒ”ÞiÂð:åÄ÷Òi½‡ᎠOaå8V؉ÉÙÄx!ŸZOH¶³¯É^ÒÞ]…wÞ «Þfù†èMø)ñ ¨Q:ÈÔ£7(=;íTÌ$£¬»¢ä‰r>ò‘F ÜÂ:'ÙEÛUŒÌPrνbQ¢<´ /"“8(²e={ï*mV\àÃÁiðä‚ r=ä°œX>õ?Ù}6ˆr1+‹ƒ¼ˆà÷ûÿ% ¥XÁ˜†Ä¿6D[D-¬¢#Q¡Gè„­n¦CUnO×4Ë 7hˆèSïvß‚x+?€J®$ÅaáîyBEåÓ›eºNXêgÁ¢Ì¾bsm äì)Ñž=‘hÃ4Öz1PˆïO½Ég‘H­Œî)6ù÷•Ý]×; ×jI’Ê]©›Å•º:ò(ßzäuÔŠI„˜BC¾©¸ÚŠ y¹—„42ÂY¥xbxƒÁì{g OˆÅã*/KƱO·¯ÎrèµB·¯.fƒ‚¥–'ž=|ÑçÛ[s¤³nÂVçi£®ëR?õúRE_v©TW¬VùvGEÕâU¥êŒçú쳎~h …7(Ðçø½† mü²àÉCö#Öž©Þ&­¿Nå×o°ìɳ'™­·¹ àê›],Xªp²4ù'¬õó”ÜOÓR¤Ö?<ˆÔŸuÆ:%;Q‰û©ì™¡‹Kµ?æqOʲ,qk ðd‘@“8‡Ëüm˹~ÎÓ¹¹‰²åm„Ytù4>æE[ýEw{ÿÕ²JìÓ¹gò{™þ³øœ˜é$½\òK÷Ò38=ïSø‹ó›)bö%|Ùeæu›-òðþJ‘µsxÖµæq­á¿PKä|sÓÇ PPK9Aorg/hsqldb/jdbc/PKPK7Aorg/hsqldb/jdbc/JDBCArray.class­Wéw×ÿ=iä‘Ä3Æ6†`Ìfe»jhJZÛq 2MíÈvb9) ia,…@‹# tKhé¾¥KhºÑ%]Ò6¤–í„ÝÓ¦KÚÏýÒsú'ô[ÎIÓ{GcI–G@K¥£÷fî»ËïÝw—§—ÿýÂ5ûñ7?îDÊGà ?:æá$¿žR‘á9Ë”såý˜Åc~PäW“‡9óÌuÚ‡38ëÇz¼‡Éïåá}¼ð~‰€u<ÎÙö¡uø0>Â,çühÂy>ЬŠ1ë?>ŽO¨ø¤ŸòâÓ>zû ŸUñ9ž?ïÅüèÂyxBÅ—üá¼_ÆWøé«~Âñ$è×T<¥âëM‰L¾h$Ä#>½PÐÏN56Gó…TøDñ±Lr:l©æ…uFÆÈ9³Ì§$uSh?=©ÏëጞK…'¦O “Xý‰|.Gé|N`G­Æ“ÉéDxtøP$Rá ~Y4ŠEz| ?sV £V"V^É™FaFO0’–”aÒ‹#׳„fc°»GÌ,¤s)bT"ù$­úŸI³l«¨â´“yw°{DÀK´ƒì†ze•M5ÇL=qjLŸÒ§3†Š· ì–çÌt&L+Ž‚¾X:•Ó͹»¿Nbp-ìJ$£‹ƒ¡¡!gÍ›‚£#Ž ]´p+ÐÆÖðÝ I^œ4Šs3f˜ŒÏ梣 Wè>gtõ|c·é®z}[ª«_Ú×Ðeõœ·í´z^3_£)å |˜²t0K›CzÐ!Ïdê-×äûm8¥4ëKþ172³a%q­ÝäôŒ@ ØíX–ZrÆéH>3—Í•/°ÝЇ+kÁ>œ«Z~SÅ·¨ØRi¥Ê‘8a$NE¬Ú)1ƒ#wã€Ä·q¯Ä% K¼…ë†zヸGâ;ø®Äa¼]Å÷$¾§Uü@â‡ø£ÇpœŠŸÓž+Á"Ñ‚õc‰gð‰8~*1xˆI¼™±ü ÏJ\Æs?ǂěp—Š’Ä"–˜ÿQލX&79:]ây¼@[–¸‚Wme%D]‘;yØ/q×$®ã«u•]ÌVâ—ø•Øæ¯%~ƒß „j8sú|:¥›ùBx2šv7¾òɤ©Ó¨øÄKø½Äð²Äñ'‰?ã/¯à¯š“£ì¾¾’f6!P!ÄŒVÚ„£ ûÝŽFa1f˜ú°ÕýšSŒ9k¬x†£` åÖ³:á¼Q0ÉêT~”0D‚7LŵëXi·;¦F&?]v5½tq$MgÓf‘ Iptt´›ZýÆz±‡¨„ ´åç̉™I²`,¤æ²–­¶z׺ i#çP1ËVü³«aj­øT Þ,Í'èÍõs‰ðš•óÔêÛ锆ØV/>ÁÕ•  .öYNUŠõÞàO«r¹ã'.Ðj‡M¤æÖ´+Ø}ó{“sÔhYGÇvld|êð}‡'ëîUåýÏe§‚½ÁÍTcéìlƨôÁ`£b}Äx¹n¯Ìü¨­;LB¬{7ùöŽPO‰N¥·DQÖÇ;d-!öî¶Š%wáݶp«˜ž²G]|«-{(ÂýDû—ßµÑí¹ŠŽ~:8÷sØÓ…]Kó2:û=š‡VwÄÝm;cq¥mW¬„ÝDzÑw»&âŠk¢„=KW {¯ +Þ¶¯ü]B°¿Ik"¥”Ýšg{ÝZSÌ‘E©°(K(¾„ž~µóÂoÀËPõ'žB¯‡sЧùܯr|½1ÍÇH=ïþ˜¦j¾EôóRî½¢y–ñ†~¯æÕÔE„5o5":án9uE¨˜V‘P‘TA=¯Rù¬ž‹‹ÿa؇¸Çvm ÇÍ“ð·*ÿ\Ư¯Š—õµgúPKojæÉÒPK7A$org/hsqldb/jdbc/JDBCArrayBasic.class¥VùwUþ&ÛKÂÔn„v ¥ì¤)(R´-Õ6-Ø]š‚–Š0M¦!%™”dRÀ})Šû†↠.¨ÀévDðGÏñÿ„ç€Þ7IÓ$ˆÚ“73ï~ïÞïÞwï}ï÷[?_P+Nx°ßAÃCNTàa> ñÏ\0ìÄ#8èÄ£8Äp˜ÏÈ|q € ÅPøç(Cˆáa¾xÌAjŽr]>Dp@eˆñéq'Ž!ΰC³#é ¯ >g8ÁŸ'íx̉<·'žtbT'žÂÓüí'Ù~–Ï1<Ï0)À!ÇãòÉÁ“ãŠ€ŠžX<ä=’8 Žx5šJx¹ IÀ%¢DUKá,AY“”÷ŒÉ²7"«!oÿȘÐZR´69¡phŸ%øRwmЯÅÃjˆ€_,HRglj€2®…cj‚á™ÊZ/Àì®í`§¹VÎ3_YÆêZwj6©…#Þ^y¼Éåð‡Cª¬%㤹;oEóbŽY3¾ˆœH4{ZšZŒ5/swu Šüš8Jú呈°UÀzÂþ¶½‹pwÆQ¤((‰dDó+§œFÑ~{3óMœŸ1»|\ïF0__åB óE †,ÙÇAË×h×b©e”²£q%•”ûØšÃjXk°ÙmPJ‰/,™ÏæNUSâªàrדª÷Å"ɨšb$`¥¤,åq]fÜÄðËTøTH#Jà¨/K(AûÐ-b 6‹8z/a§/¶Š¸÷2¼,â¼Êðšˆ×ñQÌçÂq»D<ˆ½ oŠx o‹xgD´Á' :‹ÏXp$àíjoóeb(¢ïrän›8ƒ÷ð¾ˆ𡈳øˆK»)†ñq“C">Á§9´æ·ÄäÛÆré3|.â<¾ÈÕ•Šo("¾ÄWÀ ~-â¾àÉBªòD8$k±¸w vœh÷Íû"aj} ߊøß‹¸ˆDüˆŸD\ÂeÚ#çõý%«á€€»2i•îa®Ì„oO¦ýQ lÀ« íx¯¢Éíz;. qÎQe>2¼s*\CªÕ2¥IyH½8œèT{ÂѰ– üvwuuÕ –›¿lU–€²XRë ÍPZã¡dT× e7•lïx}òj,šqcMÁäžw•T•P]ä䘀ƒîÂUq{•9%µ8…Éä!·!ÄSUªîáÙßÏMf§:ôÊiÿÚ•Q™`­ gt;·üSY’𞈩J\Ì´­ îŽÅðH^B;v¨³o°cOÇUõb;}ÉèˆOª Mð‡£ã%?›Ý…2¹pëÊÚ]1 m<¢Dy÷Œ W':Õ rB!ˆi˜ÆRËù…´ÐšŽýÇÁÿ˜á[ÆJúNTåþ—Ž_º°˜÷ü§¥r$©ôòƒ8çêFW³ r±ÁÑÀµQüyÄæ‹¨¥pçyn’RÜY]O@m޾‚푸`5Ý[P3ÝŒ©ÉƒÿmI?霡±„äÛèÖlÂvúª¤/jÆ=³s›¬<£í’Ýìb–ÃsØà—윜ÕÅêý’M²Ï`ã$#JÖ9¸u ¶ÔJl!êU°–ßBß²|ÇMˆ ƒô¶=+â&~=½Ý¶àPK¾·vxPK7A org/hsqldb/jdbc/JDBCBlob$1.classuRßoAþ¶P¶‡ XkQZzmÕ'Œ‰‡t­É¡ÕwmÄQaPZ_öD8¾rT2-Ožr¼Q×cÈQSQÇSiÜR‘‚ª"ƒœŠgÐUìbOÅäÖO­sK'Ezï]gÎɱ¯â9^PgË—÷À ¶=Ïš®†6ÝJ!¢s|ݘ ûMXÓƒ319=ØÖG†\´ïZÞH?þgÙÒ,K§Ús ÷—•¦nC[ŽgÓñ¦fV:3šÅš4€”ðçr蒵ʉÁ°&)(K¢šybTÚ4 …Š®CU%ŸI¦7 …MUÒÂÿGb]ëü§¡Æ_% èJô¶zu+Ù¬@ž¦#3ôg¥û¼MÑÄ—™jí ¬ZºÂJõbß–œÀc‚ÅÈïT/ wI°kį±zDðÄWd;µïX»éÊUýæ"‚f±ùÙ #Ïp—l ±#ŽõǽmØi Tk3Šó$ì E e“‘üPK¿t«€GPK7Aorg/hsqldb/jdbc/JDBCBlob.class¥WmsW~ÖÚÕ®Vë8¶µrÖ‰#‹¦E/M°KHä„Vn§ubêHÖÒÚ–#kUiU0omS·PJÁ…º)fèL¿P¦™il—tdøÔ>3üþŸbÊ9«­^ì¸ýÀzöÞÝ{Ÿ{ÎyΛÖÿøï_ë¾€M!|SÆ*º0«àIžçxøßVñ\Sp_LóÈÉÈ«Ð`)X>ò.‹Xâ¡DË2n°Ø"¿¬((±›WÊžâ׊‚ªÇ÷Œ{:„OKdž¥[ÆwU܇ï3þ<üPE³|òG<üXÆ32ž Of/]»<5-@˜Ð=n—ªŽYrfÌbÍr¥Ñ%0ìÜ ˜²r-W´«VžN<)À¿r-o:¦€®¹Œ6+–éXùÌ*‰*Y9§`—U´J‹Î’_,NjÄq;o P/|/g•Q•ñ‰^´œÌªcUé@l"g‰ÝÓŽ™»1i–¯˜óEKÆi= +”ÌÊê´CÊV Äâ—ͧÍtÁNgKåšÓØ#‘e»ZðlˆÍe&X{¬®>ULgŠöü˜»ªTÛ•ÏeâYZã‡l–{ªû•±‰–Ö©šÓ¡Ö©ÔJ9òq%Ø M ËrùϸG'³ØÿP¡TpÎÈÞø ¥‚€`nÉÊÝ÷Ü.6.Æ\Éäóî‚\m¶š}u®R1WÛÌgÑ—ÙǬ8£Ã2~¥áeüZÃ+ø†/ã+ŽÙ•Åô¹>?Ÿ^ÎÏçÒç3ã Ó¸¢á!|l›ç@hø-^ÐpkÁ5làU2Ì^X ¢£Ã#ÙÀÇ1©a†5&ýÔƒå1´,åde¼hV«, ¿Ó¨†Iô—pšÕ½ªá÷xMÀÑ–ï¦æ—)‹);r†R½ù>ýØÅf"SüÌrÙ*Q˜R^šµE`,~`É þD3Ÿî¹­8vcI@(vHˆÐ~òWBQ@Ÿ]s¦'(Åk±¶b•ˆMòpãöSrMË~’imÞš^­:GÀäÔÈÙåU‰v] wŽeï±”åÒˆ¶‘(æÓN^ž¶ÌJné\qÑ®œ%®åìÊ9Ëm ÂŽÏQú«.’ ­Ð_£rµR­Xl1×J¶3]+—íŠÃÅdħ}2vñ°|s‹Z£¶Ð6Ýt@¢Ôƒ”IH0ð9¤èùóÔ[»¦÷ÛÞ£tSNºÏ”–4÷qúÓÜK*"Zÿ*½õÓ,p«OlC¨¯½ã¶êQºEZ£›JɃ¾?ý"6CGEC¬Huã&º#ª.­™obðºf·áë· E¶àß‚¼e7¢Zg‡nâÈÐ#V;2@È¡-¨rèeÔoˆ‘uÃïÚAÐð¿Ë¿8C£qÇe|]÷…;Œ<‹sž‘Çàsùhw Í²¡Ûè~÷© Æ=ü›´ ¹ÖFjXÝx£eà2p¸Ee˜lüròCÈ!ô¼3¼.æGüÉúˆ¬Ë›èÖýº¤Ëù·›†˜Lî W÷ï oDÑ•®?"@ëoƒžÅë®·Ô ï!ÆÔ‚¾=ß]ÂyqŸÕç=«ÿE¡ÐhþÓÿiõûè§dÃr`cGu?‡',s|\TX^ $ÿŽÐ&z’Ch ú¨ú6Ž$U=ð>Âdjˆ†j¨MŽA=ØÆ1ØÁ1Š@Ǩ Çá.TZº‹ãûÙ^À7<¶qb+ÒJ}ˆ@ßÀŽí&")_ª¾ãÏMñwuŸ€‡=ÿ!ä&ÞÃàëì‘ã»-Yºxª.¦êoáøÇî;AîÓÅVZêRª®‹ù6Ä#¤­„£µï¤.å?µܸù ?¥M„kG—×èÄÉȺ.]§ P(û ŧË\T¨’ÒEÃÏû´”ØB$aø·Aam9à(”` 8í ïá4»¹Ã ëyã*5ÍgÚ¼áZŒ„ýÃYíÜ7›ˆlãT«,IZ°»³'ð¨§l™\Ï_€—˜ñ¥HÀU“ª¯µ«ÚçÞ~â­È:¹BLù ÑYoÒ‰ö­¦r”EýÄ6¬´YÅELz x.˜oãþ„pÜ:ÐÎâ’ÿ ¬Ðü²"Éê#~Ï;TŸÖ(óëŽð`“‹¶AÄOgÍÝÜ© ‰ûT” ˆDÝOöE™²»'{=¬Á¸Ò · ö‡:XÐw“Ç‚Û{“'Ÿå¢ßAl7‘$î ßm ¶ü×á#j%]2#‘^ùžXÞçÄ^–—ð} °$Ñ“œâ¯'Oõ)2´‡ÒëþM¨½â¿wßm©¤B=Ò¡†>Ù¼³½ÞY‰¿¿m†¿H= înN¼‡‚gšÎ{ÎP]pòž °êæ’@ÿí¸×ÿPKS^›v(š PK7A$org/hsqldb/jdbc/JDBCBlobClient.classViWg~&F!@PT„ˆÖDZ­Ú‚ZlME hÛ:$#‡$&—.ÚÖî›]ÔÚ½µ=Ï‘V"¶çˆýÒýý=mí½3CœBpò.÷½Ësï{ï÷¹ `~t¡ ‡yPÜh@¿„¨1¨Ž3·Í?7aÒŸJˆ3eÈReŠ&a˜ç„ƒô¥JÑ„!’Ì™âáH³– ouÈòö8¯NðéI78Å«gxx–‡çøôy §Ý8ƒ\4¼èÂKx™‡W\Á«¬ã5 g%¼.@N¦ãñ„¢µkÉ~µádz e0sL‹õ·è§Rj¦…:] v¶ û 6)£f2ñdbš@Ĥºš>¢DU(‰&µ`"¦ž iÏthÉŒ£íAîxf:®+ýš*À•V3YM¨º€:»Ú¡X´%ÔÙÞÑ=Å@ŠššÐûC¬## "º=ºKIõ°Nº²±ãdTMé„+#á ‚0 êí§t5C:ü¡`c_»€2¦QÒ§"zZU†,ò7†‡”ãJK<ÙL¤²ºyÀ¥’™¸n8ïô÷µ‡Ct›ÞPé7Eµµ6ãì´ç’ŒÝj_{#ƒÁ /Ë2ÓÔøCwteõz:›ˆ*:9,Û>šŽ¤UÕˆÅ>C4t7ôÎÍñD\ß*`‹Λ›3Ø™¢ ”8pFJÔQÀæÎRòñÎm7øç¹â [‘£šª¤{S1Å]iFWÒº¹¥]tPÊ'Ê¥`"ŽëfŒ)e¬E³ŒÜ/ã!¼%`±ÍæNšò¹!ámïà]Oáiïá}àõ³:e *k~XF>”Ñs–Ïæ uhq5¡3×G¬|¯:e„–±Êø˜­B7Ó>‘ñ)o»p^Æz>íáƒØ$㬓±†=»€‹–Îw Ÿ±ÊK2>Ǿ”ñ¾–ñ ¾•ðŒïq™ÝþA@¹‘/š’héêR£T„ ²Y€7¿ì ç#' ˆK¨~î|â­š˜^=®ÑÛïAÀúE—ÔÖž%WE2«wé&øêöô@v˜Í…pw†¹ñZáž«¤-dÔåf÷qËñHóͯ8âuØ2ÃÌ•y¾ÈX.ž \G-wš½¢×‘ïc´ÕYã´neƒlÊ)ÄÊ ÷é×° »-4åD)æ“ ,œº {,¾MDc«órXv®ÝÍlwÌÈC™ÊÑ–ºœ¹Žu{Ñm©« ™Eœqµc3 oGÄâl¥$ç:ZeÆÆw'2ö¬ç+éMûÅ<6½zidK9Ci.£x.4“†5ãLôÅ>‹ÑC3ƒt…ÚQëx?ž˜åX0Ë͇8h/³Ì”³‹‹ØN]`Ù8êÇ,Î> †É°‚á%E¾ßI€gBÆá³»TEœ‡òAbͽ¦œ8Æ‚,¸Ó½VÜBø±©£_½x8‡•¼¹†U×p“˜7’'­fÒOðG ì–ØBY„'óVZ!(ã‡Û#þ9ÆÉÙ…6Ù~EZ^¯'7¡eõ\Ì‹ÌFS^_-*ËÏ]‚$^†X<šWä@Ñ’mdê?PKg0x¶mPK8A$org/hsqldb/jdbc/JDBCBlobFile$1.class…RQOAþ¶´]9Di” h•ë•䪯[1¡)©  ‰o{w›vëqWﶨ¿Èg ꃾ󣌳IHÝävæ¾|³3ßÌœýþñÀSlN£ŒE w̵d¡‚åÜÅ=ŽŽû e=PY­É°ÚMÒ¾7ÈÞG¡ï C?ð:/ZíV”ø/U$·ˆùLÅJo34ÉÔîP O%^þש¿f(¶“P2”‚(ÉÈN9œÝ×"x·'FÂ$Ç:ƒµó1#­’8ãxÀps'6!*îïI=HBއ6jxdã¦mXxlcs66àpÔm¸h”IåÕž0€ÁÞc™¶#‘e2#MCzc=ë}Jqô<#-S†…ëÑ\|$â¾w0H“FÚ_”Z²Û»TȰ2))‰Ï¤n©X¤ŸÎs0,;úewÿMOã¹í\ÓwKÌh¾ÍæÿçvñôX«ÈëªLÓ£sWZ‚T%ÇT\õ"]®´çe ·êo±FûÆiõØü¼yú,̘–“·„"Jdm·ñÌÝ\?Eáæ03HbÖ+²&nÃ=Å”ûìŠîw” xó•îU¤ñë$'Q¥»ŠÅÜRûèæ(rP-·ru‰¨ ¹_!Ú*y)ãüpB×`ÿPK{:Ü?PK8A$org/hsqldb/jdbc/JDBCBlobFile$2.class…R]OA=SÚ,KEû¡ AÐ*Û-ÉV^1&¶bÒ¦@ßfw'íÖe·î¨¿Èg ꃾó£ˆw–J$!u’½÷î™3s?Μ_üü` ›s(¢f€ã®6÷ T°4eÜçXáxÀPTà ­·Vûq2p†é‡Ðw‘ïzNïe»Óc÷UÊmb> ¢@=gxjM§öGâD8Aìd½^ã C¾û’¡à…qJ~ÆÒà¾Þû]1>n(9ÖŒOž« ŽRއ ·v"}$ˆ»R cŸã‘‰:›˜Åœ OL, dbGÄ&õ2­¾úÌnɤŠ4•)ƒ3õH7«}•HqôÂc%†;7å¬÷PDç`˜ÄucQšHwïª?†•i)©õTí ÉçË K ójºÿ¤'uÊÖMc7„çÉ”ôm‘­ÿè6¹úX¡ÓRE·–®#ôyŸPuÕI¾¬Õ=w$=µÝx‡5zoœž[\Ô Q”£ÏÀ¼ž8EË“ý’Ýüfo®× gÈB/¦•$¾æ½&¯OnØg˜±¿‚}GÞþBo¿ Ò¿Ž4Ÿfä<ªd«¨ež&H–#wÈAÕÜÎ$QËY\!Ú*E)ârqB×0ûPKÉÄ8}àAPK8A5org/hsqldb/jdbc/JDBCBlobFile$InputStreamAdapter.class”YoÓ@ÇÿÛºYÇu^)¡\iK1w!åj…„RŽB!œrb7\;Äð9ˆOHHDÀ#Ÿ ³iJ ˆX™ÙýíìÌîì~ýþး¯`‡8Ë8¢ 3G9Ž)ጄгBâ„‚.ÌÈ8ÉqJÁœbŽ#© )Ž3 ú‘âl#˜­sBœ"-DFˆ9!.p\ä¸ÌY½ŸwËŽo¸O´S,ûK~ÉÔWv.¸¥‚öÀ{l9ͶrZª 6Ë:n9–’¡?¾ðP¢k–«Í[¶9›ÉL,3H)×0z–|=ÿè¢^¼¦çl³¾øʃA9û,o}Ëu<Ž«K aòbÙ‚cèŒO¤É ­e0tÅo'E—“N§ëÞ#«H*ž™ÈÐxÞv½µIË*¶á Ãh=$[w ÚbÙ¶/»–㛥_kÒÔŠUÀׯ›pÚ¶Í‚nÏ• åUÓñ†šíå’eË6Ì-_t½DLÅu, qCÅMddÛt þƒDl}ncƒÛ(Ö¿¥bö3l]g’啳dp·¶ÿÇɨ¸ƒ»*Æ@MaŠé5±WM¥â;ÈqA øzhäòZæL2•´ÝœqGÀᜡ}‘f_;£šv³”²uÏ3=ª…õ$~+)5˜>ÃH°»èú󔆨馓Kë`£Ì'0+ -¤‹¦CU2Ýh15N x˜Šçòﮙâ­ ½¾ˆfsÓ¼.bHöL¿~bkuK–ábt™Gé¹ ÇI-Nÿm§c;µ>Ò³&ý|² 6õ=5tdû:«>ÇÂ/^b´†®l ¡l¼O® «@© » õsDÄXè!""5‘6d§ªØ˜‘·W莆hþ¦^Co6ª¢/AÍþl”W1£²˜;8•ß#ò¶õ’QH?(|‰c'Ç.Ibãß0ıqQ*˜$˜Jµ‘Öõiyò" ½†ø Z"»`§ÿÆnnÇîm°ƒ¤;H‡;UA´¬5à!²Q°è®ÃÃ#liÅéÚþòÝI_Ã÷X[ß´ÀtïÚ=ü¶…½Dm…ô°ù'PKé`vû@7PK8A6org/hsqldb/jdbc/JDBCBlobFile$OutputStreamAdapter.class}“ûSÓ@Ç¿×iCP,”7XyØ´ˆE|¢m¡ÚÊCÁq†qF'Mb ¤ILRÑÿÃý'œÑtFfôwÿ(õ.-µC+“™Ý½ÝÏínîö~ýþþÀöx !Å!ÍažG©®1½ÀÄu&2<Xäp#‚%Ȫåj¦ápÈsX'ÛšK7„Ä"Û_å˜æ¨.6\¡Ïnˆ¾Yú*ØXP«‡Ú££Ïsœ®^#ŒÕ«é:H"úé3¦NØ?Ap¿ŽP,ì¡'áó©#ú3}~>Ö[‡ð }é¯è£Á _üüTöƒüÁ‚&9L±¼—ýŠ$h'„c³nœêÕQ–dÜÃE–¤‡(Ø€g»Áóú»ÁsMx˜úXå^ž˜ôp©¿Šd 'ôkâb:q±…6ñHìdQ›§:Žxá/PKŠP®»4PK8A"org/hsqldb/jdbc/JDBCBlobFile.class•X X\Õþ/ófÞÌã%„5™Yt2Ä,:ÑD–`!@¢Ä$+} ˜d˜Á™Á$ÖV«µ¦ÕÖZc+©µ«¥­IZDÚ ]bë×Åîv³‹]í¾W¥ç¼÷f˜†ø•î}÷ÞsÏòŸåÞËÓ¯<~Àzq¹ ]ø B͇øëà >‚Gd|TÁ>¦àãø¯=*ã„N*ø$>¥à*œ’1Î3Ÿ¶ß:kþÈøŒ‚|<æÄiî'¸™äfŠya6Ø-ÚYcš›Ï梛æI0#'>'㬂*Ìð¼ëIn>ïĘÏyð%õ8ÇÍ)'žâé/óôWd<­`-¾š‹¯áë2¾¡`žqâ›2¾åÄ·lÀw¸ù.7§ØÜïÉø¾?ãÏróƒ\ü?âæÇ2~"ã9&û)£ò3?WЄ_(ØçYÞ/¹ùÉè_;ñ&û-7¿ã•¸ù=ÿÀÍøÃñg'þÂ*ÿUÁßðwnþÁËÿ”ñ/ÿ–ñ/ ´„‡Gâñ¨® Õ÷iÃq=* ¶„Ãz´1¤ÅbzLÆK…;Gâóé–ìÞÞ¾«§¹¥m{Ï®k·7·ì#~m´›´Ú¨%ê`x`‹À¢ÆH8×Âñ=ZhDOÛ×y]³±Ï1ÔÓ ÑÚb“A0RÛLcÚìê „"1½O@ì§õ¡ž>=¤Çõáæ¨N\C=1C­167ă¡Ú¶`,NÛ!=<°yª[¤ÆHmZÔ×ÛµáÝZoH§8P¶èÃñ ©JBôxѸNŸOkKuwƒ9ꤌÿÒ¯@SÃZôˆ ŒÀROuRÿdÙŒáH,ÈÜ™cwCku«Œó¬Ç¤ÝªmEz·´²–ÎXªøî†êOÓüÝÒ£çHz,SºÛÓ:'>Õc,? ´8/ÙŠUúê7 $hhü²ŒW(2 6­ ™!“É͆£–¤˜j¹jq0Ö”æb¼ßT4}^òì¯ÞC:õ“ú¡àͺ¦ãŠ`8ß*ïIg̤sûYãYÜÀ 8Ø3u2GV¸(R:®›KŠè±Øªºº::O[$:P;H¨÷õÖèë Ô¶654²L‰™q¤âªxîV¡£ŸD« /œ ÷düÈ”ABˆYØT! »Š›q¯@yÂöl}4ªIu‘Š…C²*œÂ¥ w 'C£óš¶${Uä •B-3ÑF‚¡>=JŒx¯L û+U±H,æ&OKD¾* D¡,ŠTQ,JT±T,#l‡µ8åsx­™*žj¥À²…R…[¨*¢ˆ©¸oPqî°÷r¸ªb¹(Tq'Þ¢ŠRQFÓõ¬C9O?Ìz]t!àW­#q…£**)R–„m¤¿_ê}™¨U‘ÒÜP:A{­î‹ Õ.7ýŸ=ÄÄ+T±GU `0á<È?ØÕªX%V«âbq ¥ƒ*<¸_Õ› NO¢lé¦"ˆAUÔàþW³w=ë´FÅ»9°ÞÆÍƒx€¸ò†&ïé%R£4öPÚ¬ «Â'Öª¢÷1ñqáUÔ±žëX`^K¬2‰Wj•¼Ë €õ”®MÝ\Г™)™·{09Ä…œÜÜÝ@u(={)Âç&Zh³ð)—ZPóL®#r¢¢™dê ¬õ´e‘›(™©º%¡‹AÞ®çÐPøØ=\ǹ¶pyKͶP°—bŒl6‘á#„©'kEÎ^îCÄn›Tã‘dÅaÕ ‘CÖÃT$}žù'võ¼)«¶=eÉ3&ë²31§PÏ|B¢(ˆŒÄwöS‚J#Cz˜T³°Y0­Ê@kGû®N]‹ëC‘h0>H‰©"Cˆ¾ÛŒ >s«» pGÌ dC²ÚÝÐÝb\ú´¸FlÂ#¡ÐœžöCÄžØÉã &ÏåÃ7ÑÖ7Gój‡KúAÖÊLlZ¹¢83·¶ðùéöd÷2ï\™q.f‘¨\t·Y÷ ɪ…æØiÑ …HãË"Ádš”xROÃDúðU`P‹uè‡Éb)lté· æ}M`ÝÿŒÌbó ß­ ›iº!K¤,;sW“%toiÔ‘p0 …LN£ò+h¾l¸@°/§ä]0H—f)‹03:׺C™£RBmRâR<¤ÔwiQЬ¦`”¢øæká"—ýÓ;¦‹ž‚ž2¸¡¡—¾ôÖÉA+ûRÆ;PÀ7ã›A£Z=Ýq¨_J´t·¡q˜ŸnÔçP_àDŽ÷1Ø& l«™‚c†è$äÒym§¯Ñ8 Úd ãFú–hnýÑ=ÁâôÑ)Ô÷ ¿$üöüJ”OAÞäðV”ß9§_š†««Ø1 ÅowKn{ùSÈÝç–Îa[š€:†j¿<†U~Ù-ÏpÃ:øL°È"°û]nçŒÛ>ŧH›õØL.;òàÃ6Ò†û&kÜFštb!f§µclZÑy–¶9dÄ%!cDÆMôô »šd¢¿á«ežÅb8Ó(d1¨Ä‹do*7ãõÅR€Ë«!l>ÅïÑ4bºQ™Äb«´r¬R9ö–O#¿k…(ªœ@ñJ¦°t¦æòkÎŽB­ôN`Ù±‡!Á}’öVš"ü’[ª!w•N¡l³½ÄNËÇŽÃEÝäÊ»¶YÎ@°D>I°Ïpc@¬¤井·Ÿ‚%L:n¢p‹‘îܶƷ‘ÞwáÜKãn7Æ&¸7@-Ï·½ º]HÃÈ@Ëx£Ä3’ á,a ÍMódòJÊÿ$±ÏÀòV ø“¤‡LýÑ cùd×\5gP.pýfÉu,ةѠ4Á‚¶•H)<žDÕ(òjž@ÕVøcô­”HGÏ`¥¿ÃëvÐŽU'“xÂY.o—Îc‰d«,8\2+͈Ûð&ˈN]22±Âgó‘®6ò†ïìVŸH²«EÎ,E#“9Qs;¢bnÖž˜¢î°DMÓ§j‰q\<…Kf¼ðøn‡¯X*¦«v;&àCçäò”t4§ÍL,¶Ÿ äKQ‰•ÔçÓ—ÇêëŒÒb¦§‡¾ê’&lƒ¬Ìb™™†’2ÞœÈ?+\fî%WÌ=z‰X&Ý 'øß?û*ÒB †üW‘pßš£ÈMÂ7µ]^®vŠ>‰ÚŽ1är"±‰4+|gP—ƒ½ÓX×å›Äz^:EÒVc#.KVÃE°•ï'¥ÎCfSÕº G-µž¡9ŽL­Â•ªÖ¥óÕÓØÐÅ:lœÄ¦­oöCµo—Q¬Ic(O(é·ÓŠj®ØÉkö™qÒË­¨§~%%i³ÕwðÝVlÆ.clê¿rù,ÑXaóÖ ¨FæÂðWñ‹Æ²óYêþ[È€ËG!{¥Ó¸|~2wK[ ƒzW¦^q‚2ðJö5g°U`›èc›@‡ïI\5Šß¸Ê¨E¥ls ÍÖSÊÑl½zÒØìSıfÍ«qï¤öqØÐHb;iÒ…×Ñh'CQN¸l=\Η±RÆ=2Þ>Kak!Éx‡a£´‹š— ^BÎ5|Öe”ú{-{ãnì×ö „ÛRïÓhJ†ZÕ$¶ûíl”h‰`sÛÍhsÛ9ƪp)y-5Æö%bl$M—wâ>jY—|êùر³óÈxîϲÜpÂZ>†¬åëàð–žFø±.ñƒÕ²ô ¢ãõB2¦™jåÕcPÚ¸¯¡˜Ë1ˆs©å{Bn2¶däì (r$5~ý=˜äÉ2…!SšÄkÆç’ôH¶(÷’OmÔ¯!é-^+ž(‚ e½­;¦Ð6öÓ jéj_àŽ‡"¬ tMÀ˜Ïes5rÈÛæQoÏ7j‰+$al“ì­±M¢#›fÇ-Ò."år]“©YkV“Ô©Ãg8š¢t§©X*’бbF Êxï|ÝŠøõo |ÔJ±ˆíJÛV3îw]™R¸ÊFQbN_³5}ºªü8¶$BôZ Q“¬Óª>¥£(O¬îž·ÊN–ȹyF¥_‰‹“Ê/‡c–¦9‡„0u—;¸©*O1!‡ÿ«f™°Ê Å<³J(ùÒóS¸nf<76ˆÅi{Nîm·â´Æ2ý8Ч°Çì5»}T\æÝÕ+Yx# o'le é/qâýø@–\‰TºÚD|=ùüµÄ¢Ç¨.*ÖÂüi2»ÿPK¨éPÓ˜ PK7A+org/hsqldb/jdbc/JDBCCallableStatement.class[ `TÕ½÷e’ŸL Ö°! AE@²° M&A%à2I>Éàd&ÎL¬u+¶Ö¥ÕÖZÁºÔVcë†'(U° ¶¶¶Vm«Ö.î(¸k«¦÷þÿgùóÿŸ¤ªsßÿïwß}÷Þwï{ïÇ'¿xä1˜Ÿ‘í†gñ{9Dnpã÷ñF~ý¿ÞÄd[nÇ›¸îf~ýaÞ‚·òëm ÞÎ/?Rð7äáùå' Þ醼‹_øén~ú)?ýŒŸîá§{ùé>~ºŸÉ<ìæù jq'·þ\Á]n(Ňø%ªà ¾Ûã# îáÊ_(ø¨‚ñã^÷qûãüòKfô+&¿fò&û™<Áä·L~—Cò>Éä÷üú&O)øG7œŒRði–çÏÌð™|Ÿc®aòWÿÆmÏ+ø‚‚/º¡ÿÎï/)øÿ醕ø/7áþÍ}_Vð_å÷×ÜЄ¯»a¾‘ Ú?Üø&pÃ,|Ë eø6Ïì cåâ;ø.·¾ç†9ÜZÁd¾ÏO°¨2ùˆÉÇL>aò&ÿeò)“Ϙfò9“#LŽ2ù‚ÉL‰`’ÁÄÅ$“I… »‡Èaâf’ËD2Å$I>“ÑL ˜2äˆI1“±LÆ1Ϥ„É7<'&2™Äd2“)L¦2)e2qÓùi?Ídr “YnX!f+¢,nsQî†E·T2z.“c5e_244¤ˆ*7Ü"æe‹ã¸œÏd“ãÉ|âîvb¶XÈåIÙâd.«™C “EL3YÂä&K™Ô2®ŽŸêÑà†b^,#§ËÝ Å ®[É7¬r‹¯ˆF&MÜÐÌÝWsë~:•¬/ZÑêmâøl±–ËÓÜâtqF¶XÇíÙb=—²Å™nq–8›…?GÞlÑᆧôé{˜t2éR„ªˆŠèFÝç y{Õˆj¦¢ÉÛ‡PÚ uWõ„ÏówuTù}Už@ä4¯¿_]é ÷¢A^à 7÷ûýZ5¶#…Ôn_˜ø¬î¬‰ñDÈ,óx朆àªvrTkÄÛy.1ióvøéݽls§ÚñaEô d\Ã+Æesˆ}N·i„|’¹¸Ì3§q“÷|o•ßè®Ò«I*7aê‚A¿ê ЀjW„Xqõ–ˆª×Õ!d3¯ž`(¢×´Ò°TC³Ôß=z—Æ Å«ô.ËýA¯Y® Ôì×fÁU 49È×Ý vúz½$ùž».h¯7ÒS•h«¡xAò6¨}!µÓQ»ôXʰ¦³9ëët)¼,xa|Æd•*®#ƒ:¢Í×kAp!%KˆpÄÛK¶gi 5ú|VwlR;#ëÕ5ŠØD¢ BI™ÓÄf–yô¦þˆÏ_ÅþbËÆkõu¼‘þ ߘÚe‘Õ¼I5õ~o8¼¨|IÍ{ÖlÍu#Bi¶TUcxƒ?Ø‘ª2®3šëmšëõf¶Rm(äÝ‚0ÆÔ®U`–i*õ^¿èò†jR­7 nDq.Bň°1K’=Výñ¢[f­×VÛ8»­¥Ì®Åž;«}mKc²Új¤ŠªØ&a£q† C3X[þ×—¿;œ´¨í&ÐÃëkÜRÇìp|ÕÛaZµ)„8Àüô`‡]ãg„;ÌrÆä„AÂÔÀ QasبpÔPêb‹  Œ³{¦Ú*;6v¶__Sªf:2Ž{t¬ƒŽÒwÐ<›;Ȱ):Ͷ—îãÜ5ºÖ†;}>©ÞÞtjó)…õõGt¤îñùšÒÞЖXVd,: ’iœWˆ –¡ÃØÇ€2²„©ï¡4ÚIY4&á¬t3lQ½]jHç¤áÍeO†íªΩëâZÏ©¿Ýôló|±°Ý¡¾Î¡¾Õ¡ÞãP¿Ê¡~¹C}ƒýŠ×»] ´fˆaPš-ìÝÏ!1 §àx-wZóý ŽfO¿˜ž^p=[£#iƒ2r·]L²Éà ÓÏ'MJÿ= #.úr=c†M£ÊDæ­KKðOWêÖE«^?1§ƒÏ1iW¼ÞW6çðæX’Ã/_*¶ÅÓn³¾CK?¼Ч%½‡¶MОFœ-ôA»ãƒšu×<2ߊÁ´d}jãMéfÌ=t”žá»ŠL£ {MØáø„”0D·!óK(>íü’a…Ý6i+ý^ .f¥ô°¸1íb“­áìì! ©õÔ“¼§ÕÎöAkþ¢¶jkýk÷Emm|¿Ês"—ö…ë­µRݬvöGÔSûÕÐNÖ¦äÃskUùÐ"(ú¤8O„–""ú%¼—â|xAŠ ÄfR[ð Ïà tJ–âBñU‰Wâ·F§*TŠ‹Ä×HÎD½qº‘âbxEŠKÄ¥¦^Íý½jHŠËÄåR|]\*ÅVq…ßà§oŠ+¥ø?]%®–â~ºV|[Šïˆë¤¸žý)¾ ŸHñ=qÂD‹ÒõM0e0¯„OÅ÷¥¸QüaŠÕ8±|£AÅMb›"¶Kq³ø!`L™PŠ[˜E‰- îÜ뤸•;Zs›·‰Û¥ø‘¸CbJ8 ŸK8 _HD>“ð:¼!áeÖÝÅO¤¸“æãh‰£0aªEŒU4Œî4ÚTPˆ»Æ'ÁVR¿—’b@Ü-ÅOÅÏq÷²<÷±¢ïgCÙmФx@ôÛêš‚éi0k8¾Pï÷©ˆÄ‹ÅûA;FõÃ1ª71Ú)ÅÏY?»ðZ ëí"M‰mK$ÅC"Ê\¥Ø-®VÄÃR<"öpÍ/¸†\ðQxGŠÇàEì•bŸx\Š_Š_Iñknû ­üz$Nû%N¥…ƒ¥â ‰ÓÅo%ο“8‹ëf‹'%ο—X!þ q®xJb•ø£ÄãÄŸ$.OK| áCøˆü3˜dKÌEI®†cÈÕ°ˆ]m¬Ä‰8I⿎Æ+hkÓäÝìëíï-­m­÷xJ}œKƒ”‘#¥´ìŽô”ªäÜj—ÚU]*Åëâ &oJq@¼Å÷6©«)DÇØèb>XÃ}æÄútÆ6F7›K±– y y-wˆzˆçxˆg{uyˆ-r!«á³§ÛÜKKø+üMŠwE¯ï±ë½/>¸•â²øP|¤ˆ¥ø„«ÿ#þ+ŧâ3à¤Üo¯Æk¤8,>GÈKl»9˜i7ÈÒ pèTKƒIeGÄQE|!Åx‹ðCÁÞRÚa•òÒ,•Àµ®ÒHž‘Ÿs*KÏg1«K• !322\¤æŒL„Ù ;® „ûûú‚¡ˆÚµºO y9òÄC…Ææ`¤4Ž(Ý¢FŽ•Yx½ÌP€–ô1¶!Àë÷ó%{k„¦Ñ«ò­–-nMHíó†Ô®$Ü„„ƒZ™'o+“dUj›âc‘Þt´qŠcñ­IJàŠ_Z“6%óεóÜj$uGÂ7õ|yÿêÑìâK0ÁÇò¢T Ö’„´{ñÈ~¾®ÚPw¿®‚’2óæ:®>› :¹;“¤/nëEû*MêXï\b|öiµ-õ+k[RºI ¶Æ´}“Ñ¡nõêÆeµÍ¤Nkc£aÀe‡þj|ÃQÚ<Íë<Ím“­=õMˆÑ1§cKD5zÑæ'yäÖ¦ÚÆF;Ì׬ D«!5.[±¬…uHjöPMtÏ ­{Ž?èN4¯2šV¯­k\F/ùÒ5Ѿœ¸wiw¬‰:J‹…ÁþÈê-ä+jÂpÚp§×¯}‰ÒÕ[çi®mYg;k=ð³v•iW7Ùš(µm$ÈTk޼y1úÐq3Ö¬oâÞª×RøRC½Œœœ–-.r¥óÕŸÛ‚¼¡³AYZž6;d»¼¯Í§ÍÓ´ÌÐ?¶¶Õ6­I^$,-’ñëöìĆßôO|Hötµµ¬%Žc-»\Âf.¯ml¥Öñe‰d«òÑ»c ûfò aiª¦íYóJ,H,r5âÕ7žÓ“…´€aĆ:–‡á¥ªg ÅhÞݰ¬ÞCK€fôFåòÚµäÕ2Œ´Æ"¸vYšÖziöŽÚ‰uBêE@òÌÿoæõfæ¹¾°¶õÓ}/?®GmÑ| iö~=lÕyÆ‹rPtr®2›M§zÕváS»g⛕–J×Hq™Ø‚¢c15ùü~_¸-˜ÈAãËìnÝVq r•i7A£Ámñ}aƒ×X_8y¥žî‹ô´ªyÓžjÒ0ŸˆãÃÆÏžæqÉ…ùŠ&6`—>" b|‘nö‚aãJL,ŒÝD$LË,ó´eQ¶å*£\n” †o9okºëHþüWæÑ?‰!L߆Lµñ@ãSkxâRØ}¾o’Âô=fœm“Uô¤¯-ÅIC%G™m™‰Ó·‹Ù–Ù9!+ígì/J†'nTm$^e'n@t¹ÊÄ+åÞ±*}±»þ+³©´ý:’êñ[@Sm\þ,o_éaç!|-–4ÍÙ‘`ì6´¨Ì ¬I2—óÕjrä-qP´É6æ»Çæ/w)çYï±ÙkUõÜÔèíPý²ô³í‹Hœ”RñÕÑNºÐS‡òíÇ,Yc¾)1µŽ¢ïWº“öÞzÊ,¦ ”Ý$£[uËÃzz°n 2gÖ Bûÿ»õù]£Xµ+TvÆd„~OKù0¥JŸ7ÿù”þ'@üó*Öƒ~C@26I5 †ª–1¥ð«êe•½Ë9î€V¦Ù%±jë /ÐvXÎ,µ¿‰¤òèµ)Rõª0Lƒgá9@ø ú—ÎÛT>/Py!µ¾§÷—è­’Ê *Ç•OŒ–ﱇ&.pÝÊnÈØû 5!üƒÿâp,ü“\Tñ/Ç¿ c¨ÑE¥R>qR\j!™ }^1 ó¨©œ@#en‡QTdíeõB6½åÜÑ¢ ÃÄçUxÍà3ž†TÊò‰;Á=¹û@î°Œû:¼aàO †Oˆ3k2¼wž­KNú!/„I{yyLnž»Üs'¹¢0¥yîŽø¹à*ÈPŽÀhþ“4È5œÆ·ß†ÜÇrc¹§rgâ’º4 Ó³@>Im’ù0|n0ª1McFÓ5÷Ÿað¢wšÁÌÊ(³f¥°,Tàˆ‰åQøÂŽåleYœåìË9V–CÉ,ùÆßŽeyŠ”å –ÃHÉW¾:K\@ ù¯‚?ˆ…«Ê‰®®ùM•»`î=¬íçé7Š~yô»Ž~Sè÷ýÊèÇN1Ÿ~!ú-¢ßUô[l”ëé·™~èw1ýΤßVúe¼Ÿ­¿»N§rEº§¹dŽÝÁ´J£ó4zœFçktÁò¡ãÉ•pFOÞ9;á„ÈÚ 'jÍ 5zÑJÒNó\M5s÷ÁÉQ¨ÞQí*qí†E{õÆ¤Šµ@Zc¨ª òÀV]™üyæÔ)˜y€ß$9Ï ³ƒbö{T ëÜfXçR§P¼x,1k—Ö Í}hhˆåZN¨×’ƒ^ºŒúL£Ì6ú”ðûäí„Sš@Ù K›ôiíƒÚ„ñGAVAÆh¡9‰¬äåŠ|ßo,×b#aåh°êöšÃ>æ°\è¦N¹(¹kyйùØ(Ì3ÀíTÇYó±¸"Ìvzê·Á˜=аŽ]™ÌV?Ëv?¼–ïOŠD8 ShJdSå_ÿ÷ˆ+´WÆF\1žˆümÎq#d鯲ŒHKrÕvpL©å+\½é?CŽ=дn.áš+Ùgau„yn§ÒØG HFsøÂ1Æèk¨.‹WcRøŠÍ1 kŠàTßBWå~È­KK u¡kÌZ7Ö5m;’g©GŠ#PlN:G±ÈçrªSxõ&Å´Ä8kwÃiz®Xè2À[ŸùQ8};Ì¢0•ÏJ~Î@WeuVI–! ëX¨9šPí ¡ À¥GÄ#PåZª`qAJhkHv¥!™š-°H5ÃF*R“ŒK¶*4‘Ö³´ÄhCÎ,ɲÊGJ«ÐäË3oépÜH·t/âx:Έ#¹ååQ8Ë ^’w Ÿ0r8òG¿‘.tÄÉ8Å^ròè³-¢àÔ4=Ç /ÅiŽp¯>g8Â;¬ð™xŒ#¼Ó Ÿ•Fö.+|6–Åá®d­ÓæDµÂç`¹=÷™QØh…W`¥=÷²(t[ásñXG3õXáU8Ïî³ÂÃùŽðMVø<Þ~®~žè÷[á ñ$Gx¯~2VÇOAº"¥Ÿ…€_“´âáb?9§ò¼¾˜¶¾}v=–8pžþÇ ‡¬ð¥XëÌ>lg­:<…Ĉ¹êñývöjpÆŸoB&Øã'þkô{—ø±Æ1×­ã£°Ùæ‹ËÐ îµ à 'ô+úm\鄾Њ>„'ôW­èwq•ú¢û,è÷ñ+Nè¯ÝoAˆNè‹° ?Å&'ô|«¾c³ºÊŠ>Š«Ðó,hÚ ¬qBgE <Õ }‰U’±Å =ÙŽw«ã½Ô ÏÅ6'æ—YÑ£p­ú$+:OsB/´¢ ðt'ô±vÆ<Ãqš—ÛYs#üëvælw„oM…ó6f½“èWXÑðÌ‘Ÿn6àYN¬¿a•ûl<ÇAîAø¦5¾ysï \i…w`g<êù%>§ ·¬ø.TÙ_e…oLÇþj+¾{œñר‰“†ÿµÖÍ©7ÜN><×ÉNß¶ÚÉ½ŽšùŽU’G.Iûœ$¹ÎêŒçÅofGÀú<çüv½•uÃ#gˆëïZY÷ÇY_d36ŒäžÏ'o>†Eá{\uÃ6EU7< ßGà I˜=pã:ª”ƒðË =\ñzáèBÓ úgp“Õºñ|GØf·6.p„o·ÛiÆ–F9:ŸØ«¦ÁÍ7Ü ÓöÀ-ëáÖÂÛ¢pû´(ü( wTgà]%™»áÇ{Ë+*§]…Ÿ˜>ÌJÙ•ËûÎt¼ïJÃ{i|‰:òHÇûî4¼OÆÍŽ*ü©ÝæÛþ3»­îGø=v¡Ô~¯ùá÷ÙEFgÙï· ŒÎܰF#Wz|)Åð,^|©;ã>ï«Z‹ŒÖtºÃ¾ÛרÛÅx‰!×Ý\Ù™Î2Å™™ˆƒð`ùØINñó‡`¯üý°TUgeœ˜]œ]’õØPY’Uœ=¿Z)QöÄ% Ñí5 ]Çì*Qг£0xúÖlz&á<'k*!GÁK¼LÁËQÁ¯S+ ÁK=?М>%Ÿåyd‘Ô5¤*à?Ž5fp*ÍŽ'¾ |vÓÐGá‘Ñ·Ã1úóžÆŒÅ“øÎŽ.ärRŤù­[‰u0!–vA8AFüŒ4™° ð€y W9ÝïªQøÅâI7ƒ2Éuνxg¯ HÜägðenéëÿ¯1Àl*ùK`!ñ{t¸,GÖÿ ¾Ë(ür&Çâů(^pݯ£ðzä°‘kÛOÄò * K„Üñwüü$÷É2Ð %e7ü¾:»$›£Íö–¸øV.TÃâø­þdÈ: ÓõÔЮ`Ö(Qð*eùÆa¨5)ãj¼†ž^ÒüLÏùåO€Bse´?”ü)u‚×ñš`§ƒ7¹¼–¿Õ|;nÎ7l÷xj]ááOÖ˳ïĿ䞆×áõz1 &át²öÓôûscÅ~ȬØAÏl#¢š®7LY2‡oxóünn²þPKbÚ%sË÷HPK7A org/hsqldb/jdbc/JDBCClob$1.classuR[oQþN¡X–©­¥•JÛ…^ÖzW@ 4¡jL_\`[×]dO«ü"Ÿ›ôb4±ïþ(ãœ5P4e“9gÎ73ß\~ýþþÀ}lG â–i1,sÜVèr'ŒŒ‚ î*HaE¾¬rh ²Èq¬ql2ð#ÃÎt]UB¢cy™{ 5·×Ö;Þ'»ÕÐZ¦^}Y,•l·‘'Ô¶åXâÃ’6V;a–Ü–É0Ù´]t@“ÆX]Í;FwÏhØ&âДò—¦Ù–ëxÄ`ºìH/Ëiã¶8¶TªôŠ8®©˜Â´ŠæâÆ‘¡Û†ÓÖë¢Gxñˆ!üº¾Q¨—*‰{¬â žª˜•³¾‘Öë¯jôÏT<Õ·0®¨ÌԊ㘽’mxžIKùá,W/ö…YèõŒþî¡è bcf. îuzîgYõÀJ^•Ý!†ùq©¦ÛþÀ…ºð#ÇRñc á'ì²À.¯0g?ew?c——˜êÏÙå"®Kˆá–ˆ_J؃[ÌÞkìò+ÏF®I8ù¹í ¶þZÄë"~ÃA<–¾p|d”7È¡1‘Ï醚3Ψ٢fÚ ?މõ?g‰¹¦/¤²y]K“Æ9Îé iÕP9x‡.©/ª±¬š›Œ…Lnò …„ šjhéY2ÓRF&Ÿ#­¬–›4¦88Â=ä–OäÓé™—SÚ “ÐE¼ÁAžÔŒÑâ¸eƒ/<˜ì©ç¥qÔPS—©3§Ôñ¬&â·„†TSjAMZ5ušöz&;©©i­@Ê;H²_Oe2ëRm5RÉÜLѰ¤:Sô3y=cÅà oÅ2È¢Ùi?Ð_ÈÆÙü¸uêÖ5£&’­º=I»ê=H&{’Ä ‚ªo‚êV±Ž*X V¯“µ g ÃLË(s)ªU‚ÎÐ2QÐ4³:´i ÖIœóP&—1S‘ë$¢ç ‘žƒ'5¥¥.'l¾ðSZÃu«(R!Ž˜¢nÝɘF–Ê)#‰ßQa6+ 3YÂ"cV Òă2ñ{vùƒŒ?2í?Éxw(H‹r–ÄŸeüKe=*Ë ³GÔì\60khý…‚:[òwz´·4‘Lʸ‹¿2¿Q~+Ä©p™Åc¨#ñ–Œ{(±xˆ»ò…ÉØ±$=»”OÅ $ad\FVÆ0F¨ºA€Ê¸#ãž—ñy<#c÷ @~b‚Rè[}[341aô6 {EÆßñï`UFS2.±Ìµo¤{GÝ9I[HdU]×tfìÝÒÙ+ãù,>ǀߗñþÉ¡¹Šmdü êÛ mBDªìGO Õä¯ysX&3©]œêÌŒ–#fõÖ£à–#›/ĵÎJÔ}ì2òëŽZ7ÇyÚÈd©»òEcdâ$)5&‹ÓZŽâ‰nbsP&†:Ó¬ŠÁ­ÇõʼHÖŸ|.êFO½þ8ê9?@äŸ`mª‰$›=v|TS ©©þìdžFÁ‘Ú©›'"u¬m=9ÏFñ#WÌf«isyÛ33ù‚ÁºÞÞ><倠=þ1ËÇÈÌ&OŠæZ¿a©'¬Ñš°„p2ÁL>ÚŽ¡Í'Ó“޵Wª±&Bô =D}ð´ã0>K÷OÓ{±ý´OÔìúùÍ{â?­^Ö±´î$êz:?J;&G­w¤ ®„†¹;æ‹vˆ~<=8F?ê~[øœô˜eÂqÞÏ“BŸnÂP„¹…×оÇX¼W(Á(A,Áµ ÷Ù€¤=Ýu;ºæH. ÕJJ$ÙU‚Ç’\ ¸nœ"܆ËÏ/b‡ŸÌæ».– /±o§k œÐ!âçóúšéf擵1ï¢Ï& ¼‚Æ1†»ŒK[b<…Ó¶ü>:k µuM¦¼·¹„–2¼KCÜ’i©™œï´a8Áqfƒ­³xζU 2±|·ò”nUÃn¥°ƒ•­Fÿ O° eFlEÛ?å‚óËð÷ ŠÐpn:\„Kø‹f,ÿÍÖð(Eïq¬ÁÇá7!³‘” ‡‡ÖkÉûëö Ñûhç°_ JZÐ'øDmcô=t\GSô]t”Ðw/Ò½äçGÜíçýn;I‘jb6ÄÐÑŠA|€Ï{×à¡ÍÚ6‡sçíp¢O«¯÷}¸½,#° ô:z p Á7+¦©ôÒ&Ï[&¸Sd¢‘Ö`ä-„n@\ÆîU39ΪMf¯OTø›^ß@ÇzÊ¥”)|•´Š \ºF¢›I5´f]Ò¼ŸP„ôœº}«¬úÌ­‹:f¾Ï­¸ª9>°‚ÇÆh'\,ã“qÉ/ùÅM=QBø,¡öK½„‘§çëgˈ3%¿³Œž¸D2Š»Ïãè“Y^G§_Rü€Žø©)/£WªÉÜ g MfmZ¸¶×÷G9îC´ŠøÇýnC®¿ˆ v¹NS8h=\›ëž°'‡ÅúíÒ±‚ØX$PƧªÍOÖ<-¾ Î.Býÿ8Ûc:Ûû‘ÎÆ‘²¥í–Qg¸×l>àãi„9±—fq‡ík\votéuæ©f”í»§2øðQªyÙWËàyÔlßmöèöDø{x2ÂÝþ»[ÛILØâ ˆ`ÿz"ÔŠOož¿¡ÚМ „Ò~{TVz)°Á4}›Ú¦ÐÊffeáËøÌj$J€"Ž{UÃj÷bk‘a»*ϾéŽÙë´#kfö"Þ83ÄÛ†€nö­h{î&9&ÙDÅ~ò:¤þƒe\½[‹zÇ/ôAkë¶Øº«ÝæWÂnöÅ_yGrö;’hDŽömÎUrá³s!™ÂѺE¹i¾ŽèÿËÖßkùPK‚WcPK7A&org/hsqldb/jdbc/JDBCClobClient$1.classV wÕþž4Ö“ÆãÄqP›ÄIŽ£°Ôm“@cË6ä8‰˜$Ðd<Û“È3B3!¤-]Xº]´P»´M)4m1K RÂRBÉ9í9ý1üNizïh±TdƒÎÑ}oî»ï{ß]Þù÷ßûÀí¸Ám8¡Òì$Ïô  Bbš…!1ÃjSÅ,æx6†¥â!œâ‡Ó*rXˆÀ†£"‡YxÁ‰Ç⌊Gp–uª$αø6‹ï0þwY<¦â{ø>ë~ÀÇüu³x‚Å“¬{ŒÅ ÿ”ŠáÇüh°xœÅOþ§Œò´Ä3Ï2ÁŸ1àÓaü\ÅüBâ—Ï HÇ6ÓózA p|H ¼pÂÈ9®9# Ž hôH‹CgfgM2‰fOéè)ÛrRéšzo6}Î3›˜ ÕÔd)£¹¦'pãŠMEçCÒX64mÙa°›W5)›ìñYLÝ7o/›“õ!_C«!oÞr{w ôdÂ\jÞ}873:53m¤îJ§sÎt:g™6ŸÚkÙ–w·Àöø'Ž(ib  Ž”É$2TR/JÜ)ñ?þþæ#”<Ñ?8‘Îd4¼Œ?i؃½¯hx–¸ á/ø«Äß4¼†e ¯³¸ wkxojx %ÞÖð.iø&öi8‚) ÷b¿†ãÌ©‚-á<¹ÇêË޲ú «ßeñ^yö¾†ðw “†á*>ÒðU h˜ÀdÕ—œnÏ¥j ©jÉÁÌxM«á˜¢Bœ7{\²µÐc¹=åÊßÉú˜ªeíü÷ÞF}J?cÛf!Ó]×të³óg¼ šÎñµ•š8˜­£Ö¾Bx|ú”ix >LΜ³\3õYª»gŸ¿|!™î™A­k¼ 7­íí˜3½A×°¬*ñÍñD¶‰G|åô\Î1tÈm‰g«4e6gå‰~¼Î ¶Ø¸¯¡S¬«84êöë tÆÎxv%0D‚J|Ob­²eµ5º­¶yv¤Ú^¶ÇW‡Yi0ÛšEš8Œ NaÐ(gS9Lô6ü{Bíþ‚ƒ©@{LÏÍ:…sÆ¿À=ñ/þeœŠ:öa{AÏç¹ÆxU7<>T¡{0-ÐUß½syÓMq­ ëžž¦í’ Þõo°œ(k36aÍê†I–[×è ¢«^-¼T|MÌÄç»|¤`.èÔ¼í9¿‡šüJÛoZ—ܕÆž× Ë;GÖ9kÁ¢È†óÔ:Ë©¼¡±4«e*¿•îoÜ´š5ËÅÊ=%ØVË=l“b6眥>?ÇEºµürXå~„-·Úó£ÍnÆôÐËþvú  £ƒ[>ÍÜ)ý‘º»?Rc÷GêåþHÛ©EííüÒ gIÿ4†I?B³ÓÒ 8‘ì+B$/#T>Lv(WÐRBè#È"ÂÉ õïHj²£õ ´"Ú’ÉKh+aÝÛX_B»/7ÑÁjq Ëà %D‹Øtü¥¿BMöúß‹L…Bžt «Ñé›ÑX¦­Á£Ù)TJØrW§ršÿxÇ(¾kËûû®õ_%„vúúé§ÝýØå÷‘ì„ù Ý÷‹}â:™$²ô!1Vã±Ã籿ÌCdI§ÑÊ'Ä#VÏ%¼[‰‹—°ƒÇ­S¤ÛijÎBSÑ–—¡-]åhËZ‚¼M-᦮—¡vQÜ.@²f·dûî0=‘˜t,áæ©˜,a›/·¨dÚSb2XBïîÖ¨ê«Ïã–Xk ·,¢+æóéVüõÆS®Â}Å—·„¢¡¥*»dŒ’Ix}ÑP ñ©hh¹³,dÛgHIŒ‹OÚ–8p'¡ù‘;((rã\=O×Ñݸ(êbLoóJ®y Ò˜ Ö‰½[—°-©éIp‰ .*Á%Dñ-!I™»HۻЋ[ÑW¡¹ëôÈ |äáú³ü)B3>‹7pi¯g¸lß¿ B ®8¬"ð´I<° 饲q¸Brsyã?ÑÚWaÃì61¥ÚüÊ+mdJí•{€Iã{w¼æöhå–õò¥(¡­Évd–±ˆ¶÷±ãhGê2v]exëÈϪÇa²Ÿí Ž>èÏ·ðœï‹ áÿþPK hÁû PK7A&org/hsqldb/jdbc/JDBCClobClient$2.classVûWWþnØ®¼ "ˆŠ5$Ö¾¬Ú*,؃(A©bk—°`²³‹Jßµµ§ïÖ¾µöeôÝjM¤ê±çÔßú'õxÚÎlÂ#- 9'sï;;ó͹ßîŸ_¾`#®”`=f±ß‡VàÙ€}؇Gxñ¨‡ðX 4 úÅ 7†Ý€#ˆñ2îÃ(ó,Á"é#a°0y#ÅvGx™æYŠu ›Å;=Ê»ÇøÙã|œ—+xBÁ“^<åÃ*<ÍŽ±x†Å³,¬²}ŽÅ žÇ >¬ÄI/*xYÀ—<”2­¸7 Ñ%P’<iiK·–…Gµ£ZЈ›Á¼.¨æÆ-Žá5‡ô´ÀÊy ;r&d/sŽÛdž‡ù‘ê™GÔiuÎlpÜÖç0kŸV“™b:+\í^rž0-}ˆ’8@»GµDå%PlÇâVÓư™ Ƭ#‰¡ÁàèÐ`4ØÕÑ®ª sPMÄuƒ3*Þ7âöMþ›w­Û'àQ)5:ÂÎãQ=Å'h)xE èX:ÎÀ<þ[-ŠØZôp·–êÓºsî¯*x@úÚCd¢àuoÐsÉ1+&àöócEN>¥Ñ˜=¬:ÉQ© ¥c¶AÁ›å›Å‘nÝŽ™dð–Ä)¼-ñ¶IÜ ÛÑ#wod}[D …$ÞÁ»w`£‚÷$ÞÇ >”83 >’8‹%>aq'î"hŸâ3‰»qAåÅç÷b“Ä}Ø,щ{8È9|!ñ%‹/¿Â×øFâ[ž}‡ï%vñÆl•ø?JìFÀb§Â Í NŸä”–Êꙥ­î‹é–ÖµdcÜjÌÕ¼•“üIâgý ÎK\À¯‘Q•¸„I‰ßp™z`áª6m¤ÛJ2 =­&4ËÒ©ƒ–Lé³ScvÄ NH5ù Fö„g!¬˜É¦gpTÚ öÅÒæ1îƒ)macÏÖª³.‹k@hX½@Ý·6+Oa¬õw­ ÏŸš½,Qw˜é]Z’ð´úÃ38ÉŒšj˺… f¾=º†~¬cŠVûçw3C«þob†ÎtÚL·Es‡«ôvî·©tEçpù_{òºâ&©^¦Ñ­%†ÍtR tBúoÅù­$Um{¤–JqÉyW‹ÚÔ«%fTc–¨!–˜‡ · èÏÕRZ4n;t"6NëIèËq¨C׸—füô£n'ǺùÌãÞ3œˆ§ˆjr/°Ó?§áœ¸Ìu0|½º5–àÆñÆ-5OÖžèºz®Ö#,NèÆˆÍ”8Â]UëPç;+QÁ @ýlâ¶ÇSºäÒ¡ÙZ¨ƒ_t¥-§• ,#9mÈ ê kQ,ëpD)PVNµÖøôÔ5 †œ÷€×6s©¥LfvÂh¤·y+}q”ÀÅ|M3S´3;#q°3ýÒXŠ쬉RŠ f|g$ú'½Bÿíh£ývšB<4F͈@c®À%¸‹pùô <ª¢Ig °JÉÂ{%YøYš T-šDYåJ&Q‘AeÀsÕ›AÕyðO¥¿‡´ƒþØ‘{t¶‰œVíïþƒwÝ©¾€3ñd±¸åú¼»Z®¯ÿý<=£  dß@Ÿ)<Ò}$¹®héVðP‰®¿ÈïTÌUNÌù˜gIWLcš\Bq*³¨®?_=¡ž üH³ÙC²<‹¥¤WÈì¶Ü²&oV–3+ß\TKkûk=ÍËë³XÖÏ˺~Ú’µžÚ"wËûk‹ÈͲϢþü4â/U„o ‚d%M»o H²3½ó˜«i%¸üfTx¨l¼{Ú8I£‹ÆÒpÛœ<4WEp‘W’„œÀŠð¼›ÍùC/ÅZò·~gÌ¥ À5Bç\7 „‹_õy;àv@peE+N£”Ž qž0Ã:EW°jÕêKh¢ ôV@*©ª9ç^¸÷(èEE÷È´÷žû¦—ËnÎbM?‰Û¯u7·d±–~®ƒ¸ˆu¹;ÊÓân¹–Eó*vqôõY´püÀ~Þ»vR£>g,Ëé*mšÆât×&§»¨@ ú¸¿ze²½Î|úñø£^Ðuu~ÿPKfÑ«P) PK7A&org/hsqldb/jdbc/JDBCClobClient$3.class…ROÓP=ott+Ý€"ÂpÊЮ¨Eð7ˆJÇ[ š@0èæ­+´PÚ¹VÔà‡ÐoA ÑDÿ÷CïëMf“÷î}ïžwî;÷篯ßÌ¡œFÓbº¦ ×E¦)4•Ò˜‚.¦7pSÜRhiȘMá¶‚>Ìɘ—q!»ÿÆò‚Ú‹ t#7ðX•!o†v–¯äîAÈÐ9nXœe(¬Íà ßzõš±[¯YFµ¼lšÄdz®íG „]t}7Zb(jÿWK› ’Ôm†äû¦Q”µ×f¥"”•–ÝêHArÛ{: =š8JÆ2ú,ǶöÌŽæÌzÄ­½5ÞØà5NûW|sý5;r‚ºŒû*ࡊ\P1ŒA£˜T1 ²‚ÈaAÅ"ËXRñOUä0¤â–†vù7ÜÀ¨†K'JñËÈñ/“„cGèm™‚43‘?FJߢ4ÿ‰Ÿ1LÄâ¨Giä1ÙáÊÄÜ4þ]>å( P¯.µþ™­ÚAΡ'FNôd„¬c(Ÿ‘ù†¾­œz‚ÌÃøÊ+í·LŸcºçS(â.e ífãÛðPKök¡æŽoPK7A$org/hsqldb/jdbc/JDBCClobClient.class¥W x×þ×^y¥e ¶± ËY˜£Ía ÒÈ56X˜Ô¡GÖÒÚ^WŠv•¶izÑÒ+½hSr´M/z@‹SMhé‘´é}ßgzßwûõë×tfw%¯dYNSùó›Ý÷f柙7oæí£ÿyàA›ðO x‘„˨ÂË$ ÐûËyx¯•!╾Ûw~<õ*¯Ækd’}­„;øåuüòzÞ áLß´;p”‡c,òf o‘± wúñV¦Çy¸‹‡»Yþ†»—ŸÞÆÜo—ð¸OÂ;e¬Æ}2Þ…wóÊ{øé½ pÂ÷1}?‹~€Ÿ>(c;îäד<œâáC¼ða §eLáþ  à Îò `3 zNÆ8ÏÃGyøJ¸ ᢌmxˆy>.á>)@IeôqÝP“½ÉÔ¨€•ý©Ìx÷„yS21ÚmÝšÖÌn^Ø©ZjtçbÜf“LÍ4õ”Q"sf£†¥eÆÔ¸Fþx*5ÚaB”^u“ô™Z‚^o ëæõÝRG“š€@F3³I+¦YÚ½j&FãÝ};wôåHñâqÍÚnÆu=fe4uRÀ²PgÿAõfµ[OuGtÖrØèÞT‚ôË»ǵ´Eš>% 4ôN¨5Nææµ4x´ ijBË…8cÙQâÑqÍ¡¾¨Ë•Tñngžøjc–?´[Mïc(›Ô$5cÜšPêì#ÿÓ)S·ìÈ5‡æªècž¥î9oŸg)i»hçÉq³ÄñÖP߬̓YËëzƒYÆÇ¥^Ž¿íd€X=Î5®“ö¯¥ÜB4ÊK~+“5âªE‘ `?‘±Œ¦ÙžÓKc¨¯¯Lhýî&˜*ë^zتºµMÀÕ¡ŠÙU1WSbåv¶ӶVÎl²’ra6#W‡HÃ(£(ñ¤¦f†Ó òÝd–š±œWz‹OhñCùœ§|ýú¤n9þRHtqœ Yצ2ê$ ­/“nì žËÞÝëÐ-¦ã­àV$ËYÌžö&uͰÖl²9jZ¦7©št’¤ñH±äl€/°ì< _°ª²±ÌõeVz=?=›ÎxiXvdõ$%›B¾ûètõ|_åák ¾Žo°eßTÐg(øÛxø‰„i«üöÂ|›)øìÑwŒaBÁwñ=~ú>C'ŸÑñ}Œnà‡ vc@Áuˆ*èå8þ?°¢BjJø ›ü˜‚Ÿâg~®àø¥‚_á×~£à·øGõ÷þ àø“‚?³ËÁ_ü · X7'm¢É¤6NßyåŒ+l€5ù:l˜Ùt:•±´Ä.#žJP°=û˜Æßöêf·dpô §â][T¾4Þc{û=Xu¥»9 ¸}®Ÿt]ØÒg¦ÆRŒaK§œhHe­Á±!²GÛžÏNW×Îþ²öSÍØ\ÙŽyº„â=¥JŠÎË–ù¡ƒ•¡¹,`Ý<Ýgë“-‹×¨é´fP©ëš¿†Í=¿äP[¡)•]ö[©|Ž4†Ê†52?`™ø5)§Fs¥ïM%³“œü fŸ>Ô*¢Ü/³£f¡_FËïõBRÆdèX@ŠyV/˜{ÜJ‰l:©;]¹g”©°µtϫعåÛ½°>ÑÒjFKÐMÈÒœtYÙ î)e$µOˆQÀš ²E–ïW“YnºKô—Ö!>i>ÛÆF/ÓŽTŠÚ6§BýœIrgßÐð.R[V`y(:bµÌצ©Ï'´1•V˜h Uèêd„aßéf,_Š©˜–KsºDHcùÛCYŽý%·Š}™Ô-œûóžúbi O>z$ú´¢nþír)]lJ­ŒÆ*îp6í·)¸ÏѸŒ´ bÍ亮VT“> 6< á<ªFˆVŸ¶Ù‡è_¤Å ìð+°~[ ÕGÂgà£ÿš@8iþ¹ÂtYp…QÑõ,܈@»¬­<2ƒEwAšrÕ°:žÎ¡ötØ*Î`ÉÒÓLÀ—b1==“ä%T5J)‚¡û s9Ñ*¢Í “WšCÝ©þˆ«NÄÔÔÕ@ØSª.7®¶‚c£»Èà ¬<özÔGh)‡úS››°†¬öØ\›‹òå%ÄPÃhsP"¡á8ÖF.¢°zÄK8%tUrNÚÿ³ÚÆYS g ã.N ÅY$ª„Û»ª»rX›Ã¥'ç$-]]þ;ˆŸÛ!æ=Ò$iò)ÎÿÅØ®&‘þ|7æpÙ€'ßIw¨Éw²§¦µÆÍž½öä·-±)(«¥ù£ã kåͱWW´¼Æt–ãÉXšŸ@` ‹§ìD醢Õ+‡ÏWxI°(‚º°x‘°p–´Òà›*S<&]™m¤•R§sö;ŠÃè­&¼êÇ*Sõ­ «{ÊÕz¥[UZŠëÇ:oýÀ^ ûóMvÔ¤—q ÕŽOáuä㘀 L—±ž(«¶-vê^U]«Ìr䤻œÅÍîr› cp㬷E÷”Ëy …Úá »¡n"E&¦n¼7LyCÔHœ‡ [tÐ-îÃŽœ8Å‚5$ž-Š/bÓYûe=ýw‹”˜›ùå žrOå)æ¦.ç©ûqE¬×ï eõº¬qC°„Cpr½øØ ®¼P$»Ø#ëçoW×ë«h›¸"^²*pìn¬ ò¸¬YdR\Õ,jÇî…$ž€X}² Î‡ªà5tËÀ p›kÂ^Âà0w†û#@žÁU9ôp#Ør~"[O“ŠÝç±m$2§ÍàN—Zªm¸ÚÕºâ¿Q+á…‹vH¸EióR§¦ÚýÆÙ7ç·Ú!ÿPKpÉú; PK8A$org/hsqldb/jdbc/JDBCClobFile$1.class…R[OAþ¦´X–Šö‚"AÐ*íÝâ+Æ*&mJ 5ñm/“vê²[wôùL¢A}Ðw”ñÌÒIjdÏ9{æ;s.ßùõûûOñdyT p,iqÛ@ w汌»+k yÕ—IµÉ°ÚâžÝOÞ¾k|׳;/v[­ r_Ê@lò™ ¥zΰU›íœ3Ç–‘þu:õ× ÙVä †œD 陚v.)Ç{·ï 7÷Œ½ž*… dž{¡‘ao_¨~äsTM<Ä#³˜3a`ÃÄ &j¨sX&ؤ^¦ÕWÝbƒÙC·'IåzÌ`OŠÚGµÃá©:R±pNv|g¨DÌpk’³˜¶8aÏ>îÇÑÝÛØKCi\µÈ°2­P†BO¨Ä“ò2ÃR­~5Ý¿r;ÅÚ¤±Žç‰„ømÃÍÿð6zúTÉÀîÊDÑ«…ëZ‚XœDgTZy”/íóÀOm×ßþ££ñ±FëÈi3Ùâ¢&¬ }æ5!d-î Vã ˜µ¹^É] s}˜&šðwHZGnX˜±>ƒ}EÖú†\o>¡Ô½îiü“hPôÝ?Ê8{P"I­›ÜÎÜ—ovæ›™_¿¿ÿ°…gÓ(bÁÇ=}-(ci÷ñ€c™c•¡¨z2­6VÚqÒuzéû0ðœ~àùNëån³ÆÞ+Šmb>—‘T/Ödj»ïž¹ŽŒì¯U{ÃoÆ`(øaœ’²48{¤\ÿÝ;8v½Pp¬3{}1P2ŽRŽG ·÷""£îP½8ਚxŒ'&naÚ„ ³(™°Pã°MÔ±IR&•WÝbƒ¹E"i†nš Êõ”d‹ÚEu†j0TG*îéNà”HæÇ£™þкÎq/‰?hu#”º²ß¹ɰ<©T†R*ÔNêKy™‚aÉjÕ®ûûwvÐ]kLç ×÷EJn4þ?¹«§‡J†N[¦Š-ÝDh qŸQm•«t™ÐŽ×¾Ú®üCÒ¨X¥…ä´›lnNϼ}fôLÈ[D²¦]ÿfo®] w}˜ž4±5묎۰/0eûмý …Þ~B¹}©ÿ<ÏÈyTè®`!³´\tsä^sP-w25‘¨ó™_&Ú y)âòp<ÄÌ?PKh Éå`PK8A$org/hsqldb/jdbc/JDBCClobFile$3.class…RQOÔ@þö¸»•ÒC”;%zJ¯gÒ‹>bL´bÂ¥@ß¶íæºgiÏvEÿ‘Ï$Ô}÷Gg‹bðáܦ;³_¾Ù™o~üüú ÀôgÑÄ’Žkf»n¡å9ÜÀMŽŽ[ M¨²;`X òbä%å›4½qFÞðÙSßOóð¹Jå&1©LéÇ g:5‹cá©Ü«NÃÞK†ºŸÇ’¡¥yIvÆ1`kO‹èõŽ˜ì‹0•ë ÖÖûHN´Ê³’ã6Ãå­Ì„¨l´#u’Çwltqׯ%ÌÚ°0g£…y÷°ÁáØèÁ¥R¦¥×}È{;Ëdá§¢,eÉàN 9,”–Å“XLÈPâÿœ«‚S‘¼ý¤Èß™rþ Ô†íÝóªV¦=Äpµ”ÚOD!"ºyORÑMΰwÞÔ³·IKD‘,I»ÁàÿšüŽ«UêªÔ?! y”S'ø[Ñn8–‘Þì½Âͧ±b ¦ýäÕè' L;É[Fƒ> åö?¹ýû맨À,fT"º¡½ k7ÜS̸Á>£î~A£†Ãh‘þ÷“Š\G‡ö–*KƒA;G퀃’¹R¨yD]¬ü6ÑVÉ3Hg‹º†ú/PK` ÕPK8A$org/hsqldb/jdbc/JDBCClobFile$4.class…RMoÓ@}›&ÙÖu?h“ðѪ´¨ã 9 nEH`ŠÔÈU«~P©·µ½Š\;ØKáq®*p€;? 1ëBQ9„•¼3;ûÆ;óÞüøùõ€GèN¡Ž–Žëz»a ›Ó¸…%ŽeŽÛ uÅE»Ç°âeùÀ‰Š7Iè;ÃМþ‹ç®›dþË8‘„|§±zÊðÐõ†âT8qæ”§~¿óŠ¡êf¡d¨IV°tpf_‰àõ¶?‘k Ææû@ŽTœ¥Ç†¹ÍT§Äé`[ª( 9îšh㞉IL™00mb³&îcÃ2ÑM½Œ«¯ý˜ æVšÊÜMDQÈ‚Á›²'E(óg¡)™SáÿœËŽ‘œƒ(ÏÞévþD‰‡­Ë®–Ç=İ0ÊD.úó¾Ê¥8ahXÄâ%­“"†Yz=Ò¯÷U~ç¿Uqâxq¡(öj„$ÎåIvJU4-ïoK;þPj£sŒUš&NƒÅæç5ÿäUè#4Ÿä-Ñ­¾Ÿ³»ŸÀìVí•3èÅ´P” »duêº}Ž û#ØgTí/¨Upô ïj¤ûý¬WѤ½‰Vii6hç¨rP9×JñGÐÅÒol…<©ãbqŠ®¢ú PK1þ Ý PK8A0org/hsqldb/jdbc/JDBCClobFile$ReaderAdapter.classVYwSUþN{““ÜÞÒ1¡ÎTMÓB‘!Õ‘6´’R¦2Ô€Zo“Û$psš'p¨â„S@@T´>àƒkÙ”e×’G×òøî¯p¡uŸ›)”â2ûœ³÷·Ï>ûÛçì›ßÿùåW›ðƒëqHƶ›Íÿ„êÇO˰#Ìq”㘠‡xFŒÏ ñœÃ2œ;ð¼ #BDdD¡‰=FeijÇq58Á¡ËXƒ$‡!°)µH ÄI™Ä˜8GFø›Bd…VÌN qZxœ‘q/Ãi!^¾/ ·—9^áx•¡*¸«{°çp__ïàp°{wðP(ÌÀB ¥Á”‘1UÃ<¢êY­˜ò?ÏàHijTc(8®žR;©ŽAKÓÅP"¬I5a$ŒmÒO›$‡Gº¶?•0Lá¤$‡GΚZOvtT,]ù= Ú¤gAÝeÁ"qulXpAM0»OdZ62Ô¤ÆbñÌI=:Òq<:éèßÙ ê©‘>Š.ÛèPæv†G½+C’²Výý­G¤`*ªQ.M5rbš>¤ŽèšEàk¯S±¨NT"¹÷LDK› "Žã Žqòt1pï±`(Ôâx“ã-Ž ¶ˆžÊжÅ^cUL3û ™"u¿‚mxBÁvP°~ÊÓ:®±Ž½Y]Ÿ/D¥p‚máñ6Có"8¤ëZLÕ»ÇbÙ¤f˜«AÍ1ª[O6¡[õµ¥S™@£‚wð®ï)xéèš3ãFÊ^ÁøPÁGø˜òRð &ÐEŠÅ§ Ããó!æ( é¬I‘45)ŽùÃÚys¾¬Zô.Èç žyH)é|KuYÁflQ°_ 1 àŠ˜]Å5_Ẃ¯Åì|ËqCÁwø^Á¤t¯`?0øVº-ùpÝQ5mU§ô®µ2 m,¨«™Œ–¡j.} µ+mNî…1Ô.÷¦Ì¾TÖˆ­j}÷h—>’BmOÁÃ+:¤g帻ú]â.ÚÕtZ3èÖ®_pjîÆÐ+«õö¯dv˜©¼Š¡Ú{/²‰h™LËæô¨›ðT[.:lùOÔÕª®§"ªI,×xC­÷i,KMKZS…wi‹„Õ,ê n¨eš?à&qÀÀƒ¸S´¿ŒfZÇ¢‘oZ>Èý]Dxê""鈚V# ó¬Õu4U\ oa‚óÉÓ¾ô"óÍê>ÜH£z"½˜ØV‘X÷ÿN¬×ˆ¤ò·£áº—š5cØí]ölËVìèr±Å~ƒZ&« bmz"™0ÑD߯ ô•ãôÅíÀFз‚VEôÕ¯­ÅšS¶ÆÎ¹‘ú›5RÓÊËE»¦µD¾Ûñ$éw¬6”’ö_Û˜oE¾jOÁÖþJg`Wòi8n79'® ~Îð äð4J*•J›rX•CÙ4Êo»mÑPˆ¨ „Û¶i»…ÊËh¬ÀyšUÅýMo¡z .ŸËq î)¬žAM¸}žŸÁš°‡b¯ 8fPö8È©nõ§ÏãœBƒ³SvËMs­/‡F¿âRŠ®Ã> Å-Ëj§<9û§Ïm£<~¢äè ìŸE=l=AŽ’46¯›E;œJŽ^Ž>ާÈìú ì"g;ñB?mEí{Ž»⮄FÉ÷3l’[rN\…­è¦[ª§ƒq·ta;™ÚjërhòÛ]v:"Ù]öq·4q åðÛ}”me¾0íB&–äň­K¨ÌϪ\ö¸ŸOâ¢ËN WÍ7À¥IHÅ~‡Ëq %.;9 .¬§PUYPá'jó¦ÕÙãÌaÝGΡeÈãl«uÙsxhHhÊãñ8=²”ƒ×BµZÒççbÏ2ŸG¦"Yp‰ó¶¹ø¸:EƒýæÍ~”ÞA™TrUÌURS¶ƒýU`Äíž;p“¤ÙÞY¢‘[œïcLbŒüvÍÝMÁ1}òò£šVÂêDæÐ.ʹ;ˆƒ$¶‚|VÐ×ö£d8OR¦q=ýá<é_PKç6Õeë- PK8A0org/hsqldb/jdbc/JDBCClobFile$WriterAdapter.class•V[WUþ2™dh ×T ÐRM5”ªhhQ’ ¥ÐR#Ú:L†d`˜Ig&P¼Õ»¾ùâ£ï<³–M\f-y³kù›\Æ}r!áZ É>çìóíïì½ÏÞ3üõÏïÃ^D\À-¦E4ãï Hˆ÷`†·™˜eâŽ7CÌóOJ•ˆ6,0±ÈÄ’€÷,{p_D'ÞgüI6û€‰â#6#Ø}ˆ‹˜ÃC‹€Ì«l¦0‘bb‰¡Tf²& -@ãàÛ|hÉFÊÜœRÕ¶§5]åpav]ޒÚ^8²7ÁÁíd4{h”Cÿ¬i¥Ãû‘žZ ¯§V•ðL<‹éæj yC34g’ÃhàlèÁqåÕLp™ƒ+f¦È“ÖEGV6îÈÙ%yUWËN¯ Ø ”•S£Ó—ƒxë±¢fÍ4l› üšž³3šŒŒWtÓ&6~ÛÒ…ÀJ,‘.SÞ([FpUÂ+¸I1•=Ñe#žËéú]S3Õ:à'¿ÖÈE69\ªƒº®¦e}ÊJç6UÃi0讃K3ÒÑœ¦§T‹¼Éšvd@B˜°$Øp(>¡³²5´ Êd?•’³£i=²–†¡Z1]¶mÕfžæ$la[Â$ °½îNƒ“=§Ý7‡&k›‘<–°„|"áS|&às _0ƾšmtÇQ§,KÞ™Ï9ÙœCѪò¦„'ø’*ªjÜ»ÏnÃbì_Iøß°Ù·ÞÂÛ¾Ã÷löÃó’Qá¨'ãȺ­vnEÏ¡÷,6J^c%ÊÖRÆ2·Y6DÌ@s¦3mæŒTC6Ûkû‰ùmg`öh)L°âtËÙ¬j¤8\= pLU-j¯ÞÀÌYÛǬ¨8tŽ qíÿµe¹/ÛҪÖÕÎ(wØ ‡ËÃà“CuÙªºAC LÅ3ª8ÕFÍ»ªq\µKË:&‹¢ëäƵc(Ôûr¹V‡®Òiì9˜ÝõÆâ,;\ccì‘ÿÆn‘’‘-[u±ÊH§\?å”ÓmØù-ŽyÐU,oÁ•(å-° .cÞAzñ4ÁÇZ8ž=ÈHãG¦Q€‡-¤ý)4ü\¨€¦‘gh-¢9ésÀïzþýE¸“EÉ<>oâ`-yH´îs¾ˆ¶äðÈ`ÎðB„÷óyøÆÝ~þO ±yû.z#ž]tG¼L×ZÕñÑïÝÑ™ñuÐý=¡_ÑÓåÎÿGn.cР܃B.®Ã„EkjyM%Jr B Ýp p]À«.` „+p×5^£¨¼^"Zþž©ÇKô6õVƒ^Ào”m¸¥ê(ð&ýÜ´!ÿ8ÜÀÍJBÉŽþ€Kòxq¨°Ü3øä¼£ ÷Tà½Ç±ôÀ«b5Ò¹i¼]D]EÄEFÜo¸ø çŠHúéÆwÑ^™Wö.p™]Épo_¾rWØI~W/åñòÞA%4ý‹¦èÝ=äÀ=šûÈ…6ú—á.i4fàúPK)a:˜vÚPK8A"org/hsqldb/jdbc/JDBCClobFile.classZ |”Õ•?'ùf¾ÉäK! “ÊdB  „ÐÄ$<ÂkœL¾$#“™83´V©ïÚZµE-ÔR­±Z°dD v»ÚÇv]·«uw»ÝÝvßïw«‹ÍþÏ÷˜ÌL&ÀoóûåÞïÞsî½çù¿ç~ôÛWß ¢üfÝKÿ*Í¿IóïÒü‡4ÿ)͹Ñü·|ý›~M¿QéCÇ=“æ›Üô‘4ÿ+Íy•>vÓoiÒÍÄŒeœ§r¾›ÊXq³ƒnVÁÃ.™)PÙí¦yôQ!k\¤r±›*¹Äų¤Ÿ-M©4Øçˆ¿qLÚ‡r—KSá¦nž+ç\VH÷ƒÚˆæbÊóÜÔÀóå¬PyÊ•2˜+‹.—EU.®–íkdp…›ò"4tÞÅWÊôU2½Xe¯›Öq­Ê>75J_ç¦&^ââz¨ÌKUnpñ27mâåÒ¬@Cça,¾Zå•nêÀáPði®-äU¼ZšëTö»©KŒ±ÆM;Ì×ú|ƒ‹×ª¼ÎM{Å®÷ñz¢Qå *7ÉçF™,‘¯f·¸x“,ú„Œ—»¸Um2¸Qšv7wpgoæ-nÞÊÛ¤é’f»4;ÄI;…e—4»¥Ù#Í^•÷©|“›Èi¿æOJs³‹»Å·¸8 Æéqs{¥Ñ…ܧr¿Ê*‡˜Š¶é^=ÖØJè1&­5ÑcMá@<®ÇU¾»b¡DǬíÍ[º[ZÛ›»·lkniÝÍTÚ~kàö@C8éoèJÄB‘þ5X×ÄHbg <¬g¬ëÚÑb¬sv÷… ›„¢ -c±k°;ŽÆõ^¨½ôÁî^=¬'ôÍ‘–˜ŽîÁn=Œöâ(¦0bq=Á4ÏÜ)‚­¬¹†&³_c0«Dš›MðÏùê½»B½‰&û38(Cc¶[Ç1=0‡¦æÖÉP¸¡=—“a=Ò/¼ùÞÚ6&¥ 'ÀD]‰@pG`h{ '¬‹WèCd¥@ dóÁ >”ÁŽpL¿žèî1ÍËTámk­nv•÷#‰‘µp ˆ ÜÖeȆIomÊÔ¦ç!\18ãÁPÈæš›ÆÕN˜ìî‡k†¢ñ­¼ûšÚjÛT‹@Ó¥1hµ&˜Ò"Ço 74…£=&-„4‡í`Ö4½¦ïSÛjìqY.Zk«P!tq %Ö2•çð‘ðÎöfŠ$s ³ær­TyÒǧ¤Wù6•‘\ÅVJµDcAˆ°4×É3§*@ ôàþÖ¸i7sÔd‚;%t“äƒz<¾hÙ²eL˼íÑXí·§áÖÞž`CÛÆ Ms¦nÓ“Ó^¿\Ö¯¸´õ™Î±wX!;ø/m‡ÜeïtµìTs±öN-XyI Z§\# ÿß²Ú(©Ñ“ô”F_¦#=Mkô%:¬ÑéŽÒW4úKz[£Gé ˆž¡¯2ù.t⢌ûH£÷8®q‚‡5¾ÞF~N?Ž*Ðø ß¡òŠïÒèeú1@Ì_¸1 Üaæ³ìùi•ïÖø>¼DZ¤©kk{j[?Cï0]~Ai—3²_ã{ù>ûÈ´ÐØ0 ÷GŠð*®ÃXÂ_­ñýü€4jü?¬òg5~„?§ñçùQ¿Àit’N¡† Yj^ÞZ5@p&y4~œÞÝÛfôÞ<¥=ÃOht†^và®Òø‹ü°FoÒ÷Ÿ‰39€í"ß“Bù¥È|aõWˆ1Ÿº×Õ€u[  Ã}}z WjÊOãX((Ç~YÂã²x"½ÑÁF#ZÍDÏ‹S~ ñú¾FÑ㶪F:N–œÖø(Eãgø«€eÑ»ŸM·ËÔ­ÄÍuIhô¢™Ÿ£w¥¦ÄüÖt¥F$ñþVV¬nˆEÈüÏŽÑè}þ„Þ‡$²s·ì+åOQuÒ—&‡4~ž_ks~¢Ñ_ÐO5ú3ú`Wãoð‹*hü¬ñ·øeKs‚¿­ñw¤9ɧ4~aÂßåÓrRã1úÓ’iiÞëý°•í‚â©HbZd[lG$><4%ô^ûHK q1ü±`Ik¼:MTªE|3^…16Fu“ „ßdþ ŸUù5_ç74ž Ÿi|N6Xp!»gXusÏ­zeZQF½q1ØÉ*r‹3op„Þ¾¦´Y“ÛžHÝ%HÙ©‰VpQ©©Ó/R;Às@*SÕEЖiùE;óÒF-‚«\‰ï ™¥ jO‡QX#Ö²÷Ù©!,fÒˆwê!¸1ºÌªÛŠh>;¥¢5 Îíúà™Å+sgF§OÕú³äUˆD#¡` l•¯ý@*¿z/^r1]1ÅÄÞX,k š©«nkÞÒÞØÔŒ\ʱe6¿ÈtÂ}ÑØ Þk\L›¼—²ôRD.FvD‘„À©wB oé w$ôø=&ÓFL¶ :·Ã[ýz&Í‹K+ÞM"Æë¢¸Wï ‡)]p+ʃ+ﲯ­^Eˆ#µÏ~½8Û pgȪDês¡ÌPbž·uæüŸ›•ÿr„‰……V2˜£ùÐjV1ð``¿¾%C:n Å  C‡ÌEfävê„™jè^º˜î§BòÐgé|Žˆò(ˆñçÓÆ½T*…»ñRË蟰zÔ÷Fbßèñ0ú§-:žF'ú+°'JŒaôsrQún_’TßiÊ?B³Ñ¹’T€.ïÁÜ~–Ü{|2YPF…cTÔ^‡>IÅÕ«”º·H«KRÉ9üÎ åDÇ’qš=áWÓç]u‚´†ÖÑšEóim²úÝE»h/Æ›h³1fúÚ&R=“ä%E¥gUzNQˆUzž'!wž9eL4«ôÂ$i䲿äG¥¯›Ìô Œ°.Ãï‹4béüwFtîc¿Â~Çìjª§Òk¾ªÊ’4ǯœ¥²=åÎ1*÷;<ŠÇQùÀ8Uìö(oÑr’¤¹#TëwŽÐ"¿ÓãœÆTYŠ,Si#Iž“ä¤PÕT#\fô­q»a‚Ý´ãuÔiŒM¬'uËPM>/©ôMC¯*} ¿Ïo2t/&5!¥ü‡Ð6]¼E,ýË¡?žJð°Ûp䜓†ÙÒ™Oз-æH>úÅgi^zÌo¡ÓÛ˜tÖ¡y´«î¤±ól*ƒ6¦åm‡<çEïd‚w•y¯„D(‡«Ý‡Ÿ¡yg©rÏ]^Z•¤êê$Õ$éŠqZ8˜š]÷ÆÒª¬‹#µŒ®<'úªM=üŠG©«§Åãä]å¨p€|ø(AÞ+GH­®pVe9© B=;&¤1¼èÎd(ô¸'à¥>ÚOht-(Ù¥?hAaG>JùïfÒ*gçL‹á¥IW90}E‘™´ˆV¦¦e2ûî4ÚÌÑ}’¾k9l-æô¥¾º·ñ†æÈÃZ˜Ñw"%Ù<ÊkUéô$<›ol?ªHVÆ9Y»&-1'úá…=„ ˆ†:¦›V)°¿á¥ ¥Œ–Àeóí•K±²BI[ú&5¡ÒºsÔ¤eI3Åv²_•d£å~6]Á„3ÏЫ–Cw€QZ櫪ϯ‡…óáÓú$]“¤k§¤k5ÃØmTBê4~ϲídcÖaÏrÖa¯Y‡ýsnô›qPAéªqZ=Á°ü| ]}¹RPó{œbyg’ÖˆåU±<übXÞ%´"‹†ó¸&ÊÇaí…@ó:$I]Nˬ~5ŽZ(”û`°nuJŸu¤º'©ÚÈa·×møK%‡+ƒ:#ö½A–~ À™ücWGUF_h¬²ƒñ† ã2LÒÚ³´Îļ*·>Fë;G¨P0ƽzôêô®¤k ½ zE”_¹×@=ɹ YÞ¤ïY²ÜcɲûeiL“eƒÜRM{<Êm¼°Xëq•¦‹¥Ûb½ž!ÖïÐ÷­Tß ±$ž­*H«yºXÜÉ"†UT™ÕA'B³e•mÉYÚ´G(¥Ÿ£V‘°±ÓVÒ Þ* <¾NàöÆä8iÉT ¥3¤pùF;ªNÁßû¨›z ^ð|ú«PKÜnõwC‡ûéaP³P"=ògh‡ŒyÓýTX9‰ès˜QôœJ¿kr;šIÒ)ŠAØ”VnØóiÜnzÆŽé‰]#޲üÿ0¢¿ 6j?BÊ)Ÿ2J¨¶:`ïÎö:qåÚ OúxÔ¸a·0u,9C[¨u->¶1uÖ¿I]ÀÍúsÔ•¤í#4߯ŒPfw¡ÌîHÒN±˜22ù6vÜ…Y³¾Û½k„”ŽS@‡&jÃ5?‹öâ‚è£tPhÇÌ *p}L UúJ?”Œ4/+©ô#Coe šˆ?¢¼­ø¢¬ºãÇ–¾#°Tôˆ÷…ïõ5‘· 5S gi¯p5c´Ïïè·Š01™Ça†¿Ç!ñ¿ÕÖ”.ŤTVo³ॠ9~‚ö˜Q½°QÅ8ä³6bú}z'Ùa“ÿ€ÞÍAÞuÜ"ÿ!ýÔ"—J‹Þé›?J»NtEþPi) > ™ù¾1º IöÉ*E©UÜa~+Kørûðf¸ÙX\‚v*®¹—à«$àUä¸ÛdD­j\v°¾@ÒÔ%p3~ßKÉPŽÞ,ùuÑ-§¦ˆïÑûó>¹_Ð/…ÀŸ½ˆWÊŽ_i°´wœôQrIpïJÕŒ§°G -¢Å)ßÌ‘ l±UÜqåÈ:ògÖ‘sp ØPõÕñõå’î‹u?XÅœþ,éêäzë—ëÍ·Dä„°"d~’B¾|SÒÎz[R.§«S’Î¥üIL™•Ó‹°´'KÚ2ù²%£è%ì{P™ÞÚÓö¿Bá$ mDà2ºZA;´Ú1W™ ¿íÁ'R ¾èU¤³’ÇI¹s”ò}}”ò|KpÅûêa'IÀb —û©”ã=bL¿UnŽªô§*ý<&[?åòdü¹Ú²ÓòâU¾v˜Æ=NqlÙ‰GÈ…nø¤ ÅY:°§nŒN`}Ô\@MeÖy*ÂY…TúsJ;¥Lþ2nò²…xÑüòך0tÇ i·×‚#TaNß¹6sº¦ò(­±áS“í.ë6š„*mê§§Qå™!åk‰ñê\ˆÛÁvå> ‹NQã9œWø‘ö?Öø‰æ/h¼¨ñ’Žªñ3|®pTãeyc:o\ûE dÑ¡ïä 2Bcü Øc@ éèðNÑ¥ð©Ýê’wž(m*‚9˜¦O!Bß`†Œ§wU©$ µÈWd§ÀæM|M5èAÒWÖÜ£hа½‹ª©²ëÞ«Gè]*>›J&¦Œœ‘Kþ‹ÙbΘ\.LDˆ0X/d¯Iia‚ÄCÎÖsFò¾Ô ²EÉ^ðÁíÿWÈn(.BnW5&·4ƒÄ>>ebÊÄ·&¾£]ï@™ø>& ¯é(ûªj.ðPKå‡ôc{PK8A*org/hsqldb/jdbc/JDBCCommonDataSource.class…UYsÛTþ®cG¶,'µë4]Ò%m“:6`v)š´ÅÅYŠ“†²ËòÅUbKF’Káþ¿€—>´3 íÀ ô fú£€sdy­Çþνç;÷ܳI~úÏox–ŠY”¬«ˆ œÀl0l2l1Ü`ø˜¡Â°Í°Ãp“a7ŽyŸàÿ4ŽÅ8xù™ŠÏñ…‚/|¥àkº‚ªÀ´a[–4<Ó¶¶»å )ïéwôbÛ3EVIÇ3¥»"¬I×pÌÛ d:f ݪ+žcZu2™ªéž^±ÛŽ!7ô¦P]éÜ‘Ng3mIï;ÛÙ'¯žmØ ­a×MkÛlJ»í ˆ’@‚T»ŽéIG`¦s‡iS ¦åuÔtM´í2oé®Kkm‡ÜM^4-Ó»DÛÜÒM2[µkt­V—^¹ït6·ô?nÕ+w é§ç*0è ;tðh.ôß4ݱH%š+ùD}” Ð(Ë)Ò¯ –3Ûj¸ i¶©i†t£•L‘²2Xëà`UwƒcÉ •Šv;\3…~99‰á#3¹ñ˜8«¤;äÊ \±z«×Åí:N±¾7IÇrá#Æ®SO7ö×õÖ¶^mHVé»ÞIhKw¤Åõ¬³Û¹nÉ|?46Tæz±Ã®hÈa‰Êv‘†ã8¡a'5œb8Íp†ag5,ðj‘áÃ9œWPÓ ñ†:nk0±§`_CMœ…ûm£X¹Q¾*u¯íÈ Û«´[-Ûñd­7Tçm§^¼M¦µjq¯V5Š××.¯®Úͦmõ›,p¨_ôÍê=œÇYu׿eÜ>ÛKSo˜?pé¨{ƒ D‘î»/Yžôk÷ìN¹é¥ÐQLö»ø½ÀrÈh„ Ky4r3¶%GG¾GgG‹´CÝ£‡Ñ¨)ÏPpx4¿•è<½géwÇ "Êͦk”ûíËS<È3¤Þ“ü‰ûíïýb /ø2 Á£E˜§Ý&h,çAäGäÖ#L šˆ1L2( ñ< ^© Iíø#PÀ 1{LÓŽ=Æò‘ºïÓ/ú× ¼D¿"^ 3$#$'󅤌Y¾Bÿ%Ës$[ÎæOpÍL&cúWÚ?ú^‰&qoÌð ¼bÐ0v?Èê­Pz²K/‡Òñ.ýv(­téwBi­K¯<›¾ølúÝPZíÒ—ð^@u¡×Î÷ŸÃðþr?ô.Í|Òï]ºÐïšÀj¸©ê›f†L×p%0ý10­ä #Œí/PÉüðDx€)Û¿0UÈdxÅ^H&}MšW&ñ3Ò…±i¸J8‡Ø¦‚kÿb*(±¼F2›æ§è:> ¦ìpPcå1²O0óçМÍÿPK£òg  PK7A&org/hsqldb/jdbc/JDBCConnection$1.class…RMOÛ@}c§lH -¤ÄGÇ­dàØ¢‚‚T‰(HpÚÄ‹ã`Ù­×¥?©g¤*~?ªêlÔVâPºÒî̾}~;óÖ?ïîìÀ›„ÀœYæK(¢^ ¼*c¯–VÅK7Îc¬³SÂD>Œtc‹°ÜI³ÐêÏqÐ÷GAàîïµZi’¨A¥É{æîFI” ¬»ÿ#Ÿ6{„B+ Áξ$¼ºªçrpq$?ue?V\¡z âTGIx¤òa¬:XCÃAŽƒI”T0í`›\4 ³#y)ýX&¡ßféW#Ç]<]Wc›‚Óf kÅRk¥ µGRJ„¥§u"Ò=GL-¸í&YUÎõË}™K¢ÛìŒUYÂ7P_jõ瘭¬ÿó0ÇJQ9J³žÊôøR¶°e~à"?¸U«oŽl”AxV0Å V9[à½Í±ê½¹yo¯ay·°¯`7éßÄwL3ŸÖ½ï ~àáäÊ,Ûî^1Ñ(×0ÁÙ çÖGYxÎÛÿi/¹0p9lÍøüPKÅJ–¬˜PK7A$org/hsqldb/jdbc/JDBCConnection.class xTÅùÿg÷òòr-Ù„ÍáÙÄjÀ"®0 Â&y„…e7în8´¶¶bOÛÚÖP[©­¦­´B+ŠŠÖVZ{ÙZ´—µ­½ïû°(ýÿ÷fwßI ùÈ̼™þùïÿŸ ϼö…Ç`¾jð.Ê£¦EßDÁk4pâR[5pã2Û4\Ží ^«†+4˜‹+¹éàf•‚×iP„üÑÅ£ÕŒo Ör³Ž1¯ÏÇnìáf7¹ÙÄ ×sÓËÍfn¶ps77æãM¸•á¶)Ð`öñG?7ÜÜlWp‰ÛÁAnv*¸Kƒ ñôn&%Ì£ˆ‚CÌǾ áñC¼ÿ yHÃã½Ü|„›rs7‡ü÷÷sóq?¡Á >À§=¨âñI ðS~RñcüŒŠŸeÑ>ÌÍQ1ø6 1­ŸSñó>‚ÇUUñ„Š'U<Å_Pñ´Šªø˜Š«xFÅwhø>©áñ) ¿„_Öði<«âWüªoÃgTüš‚_×à.|†…ù n¾Ég|KÁg¹ÿ6Ï|GÅç4ü.žã™çyæ TüÓú} €?TñG,…Uü±Š/©øªâÏT|YÅŸ«ø ©â¯TüµŠ¿aÀß²:§àïüBA4¶2ôCÁø~ì@(ì„Ãk£‘!#1„‘è`ãŽØÍ¡¾FšcñÆ•ô™Z„PÜ á¸}£3b±`„‘í#äÕv<ÝÖRG8nD·ú  cæg8"J6#äc«x‘ƒ cm¡HÌ@ÈF"ñMh8Dðvî ì 4ÖÆîurš°•Ø ¶îŽû<l(l\Ó·Óèà¤X`1 †ãË»›‡p¿A‡Ãý´9'"ÍÓ×F"!>½dˆí{ˆÕN’ƒ6¢ vÎvôõ7®Z¾¬ §#A8YÔ5q£;NÍnZB(«kã#1O Î¶È‘£µïë7†ɵx(j ¢öý—×ÚXëŽGY6Œk­ vÌôÑ¿«+0Ôè Ôˆi‰¸- Mˆ“x§g lAŠ@˜=övû”iŠƒ4‰¢˜oŽGÚ"»w‰)gíæ¹iz0}ÚQ;—ŒÃÝŸú$ 5 …úˆ!W? qCûºŒx`y  ë³K˜§ú1#±L¤çÓáëÀÀšph¿i‹¶Zj#¨P„í-[D€6h*­ÍÁ)B9!ꉱ€i±HH˜³¶ƒ‘”Ž@\vX,I›&;(O3»ñô‡Œ@49¹¶£c ›ŸƒŸ4à\¶3á¦\ÆÁêÙ?dÉ‘%hŽC4ÅÖÓ$Ž’ò®Î\oÉ>Ñ6Ó Äb-uK-Ydé+y§6ã–ssíÿ‰œ7ú´¨Y8˜1A/Þˆ*™Î˜'Ë'òjÇw²4«;זʯȩ½‰t>ñ®\JŸ—k×ÿa][&ÚÔ–kÓ%EÍŠÌ”júl6j2GS)€eÙË,€| `µ…Âc‡X-qè2ü¯ë¼¾‹å¤ 7¦IR‚±PpÀŠ ›ü£‚¢RÈ “mf²ío ÌÉÁyîå³›½-{ÏÝH–híˆ'§ù`Z¶/°XhFû×lGX0ôe¶µ1jn%ø³‚I‰$î'ë]xÉè¬D™{8¼7ÊŽ?«6Ó…ÓÒO2ÿÏkéiΞ_’µ»¥§‡µDn0¶‰!y\‰r¸Ï>jsÊaÓƒ¯äq€èßaì¦Ä”7˜»}‘(ñ?Ý®(ªÇú‡£QRKcû>£Ÿ2aÔÔf !¡úho$º«'¸Ûˆ ÓÆm4ÓLÉ`öNwK0Œ/1óöÄõ[Ì_üBMí¸e·¶v‚úhÑ%ÕOfºß¤21x Õ-ÏZ¸;UÅ34±a}'{ã£W¢rÔÉÂqrmš×%’'sö1«HäOÿNª‰4Å€‘];2+>Øba*¹Ëø®7¦`·ÇúCFªØ¼ìb†LÍDÉ,\«c%VqeÀáÄÒ ]¬ŠX¥‹ëxÍ33 ÛÉlª>6ÑHCÈÆwÔ$V:Ù–ºà% ¢†Ì :|NS¡13¢×u±¾NËC$=Ê|aM xkœ*k‚݉ñmˆò•.Öˆµ<ÄwжéF4d^bÍ<ŒÇ‡¬¡èn¥Ì¡‹ub½"ºuÑ#6(b£.6‰iЏ^½‚2¤Â[MðJ›P,-¤´ÍbÙÂÀ„Üž:ðÊžžµº¸]úFq“Çà(…d»’Sª…GᳺØÊRr GC”t± çéðÏØgR8"îSD¿.XŽíaRŠ!¨rDvÖPQ›×ÓÑÕÞÝÓÚE b€&œË[{Úiç1/ò•¢&¶µv’¨×,®‘3y×Ô$ÇŠa&ŽŽäàƒ‚Ä=e|H·YÂÚfÅ–ÍiÆHvO÷]NQ)t¬éXc©ïI9Ê/„iV d„©@H©Á¢v¢R©—Ê:J·Ã¡xãz³³ã+¢œK•ñ°A¥óJFoÞuèz˜ç­íÈy+) †÷ðõ¯5:8l=ñùjÇ6’Itxò±(EÒ m–>Ñx÷ðGlæ¿¢¶cl„Îp`·‘þ`š´ƒ¼Xê™A‹s¾lFùT=ž3ëaªšS i1®…c›‚l¢9ŸÕ(D]•«4¾½•Ù` &¯Q©™¯‚±X`0[úIý¼Ê¤ Kë·Öš‰¨#m%Þ*{"¶›†‹ô*³X",U¹hO-{¨Z³}=-)‘ÏšÐæ·˜O®.S5éeî~ò¥ÝdûòJÉÇ®`(Œ™“«Èfv#RV1 oÌ|ºûâfÖ ˜E^EÖ¥ØZ1µ–ÇwжÀ0iQ&Y–¥‰$5K18×K…ùŒÒ¾{ˆå|™!Àšóã‘ |›o3Ë–<ùP¹::†]vXWNéhV‚4Ý)gòäG!Š]\ÆY yAâ¹/9^Ùk9Hí!ÂWÑdüˆÞ6þízÌ'‘Œ?qHÄ=>¨3H”DÓU›#§ÁŸ\šç 'ÓBUó¹‰ Àöf{A¡˜1E"9’ìôk£²Ç ËÎ$!R%‰÷”ŠÁqù1]𠙇‡ƒ% vЈ¦&Ër¾^ʇøŽ0y‰y/K{(KT9üd›éVi°ãXö³96º ÒÍ@,õX”Ž‚Ï²‡²ÄÕ|Ü(ç?˜±ýd‰iŒ9¶tÂó8†½ÉG‹{.êñð¢f&~5Êùœmß$¸m¹1Tl¾ ŽÄóYV­œ|µÇYé;cþ t²4!þ f «©ªBó­n_êÏ–ºùœ”TCkíøÜeÅ¿iÈ~{ û$«Õb»‚CÝC3büW_c¶tâä 1®,6ç8ª@Ê¿.ÃJ›¹œ;v¾‡ið ÐMüð[ðÏÃpÔìÉþsðy³ŽSëä{¾ù}Âì?äPïáû©ùý¨Äó˜ì—ðgà jÛèÔ'á‹÷}Õ>õSêFK¿+qü©î'ÁÑrœ½u•'ÀÕUoÑñ%ót„÷†/ÃÓC+h&†iŒá4¸{ëü)<.Ä íª? ygh«* T¥-nÀ- |% ñWá‰x)(4 Pc!ÖÒŸ€|"kuC¯0ÛðnÎÄû5øº…Ÿ ¹ê÷0^ÿÓPêý ø‹o…q\þ£ŽÅŽ%<Ýät4¹°Ùíh*t4y‹¼Îûq–ß[4 …MÅÕŸf©à$°~\ô;‡~ß@¿wÑïÁÄØ[\<ç0¨Î%#ð2§ÓØEãh|ëaxÖç> ŧ¡¨—<ÅÍnŸÛï-äCJFÁ³©Îïs{‹NÀ$& ©Ð¹ø€ Ý´ÿƒÞ»8.ŒÀÛ-Äwp¼6·É‚ºYž¨ÒØ ñm‡áŠtü>wqÍ(”n:P„ ü¼®C 8FÀÉ]f:çbÈ"$#¯ý ê Ñ„g¦’‚—MÉÒÒBðøðx¡Xo(ðM¤¾%¥‰pš0?òl]ÏÏŸ·¯@Ý+àr¥éõYø¶´—«©gCœÌz%)«<åF Ï2¿c¦’îv¢€XGv’Žð;ðœDx%ÍêKOÁdòÕNÒè ÍèVgÝwáœ8a'Îq |&qº‹$îùqV\:Â’wQO2‡nBVy4ꪂóXó8TÕáq¨æf MO=•ÔÕ< s¹;Óx­f„¨!Jž†KZÓ­ù²cI»ÁY ¥i$œH ¼„f˜Ÿ}$+æ|¾/}¤h,°BÌ޺03;Hý`\Û˜ué¶ñÃñlcö¥ÙÆàE‰«™Hcâ| \nÿ)˜ãȤ®ˆB¼ºõYÔý^’f‡ûÔ ÿsÚ(,±!$ ×gRøø©Ä“â[Ãø*ͰóM¥ah”¿óm}â·q”“PwFJÝŸ!õEÐ+“dhàºR8:³Xû¼<¶àë/Mð?‡_H\^ioyWu¶ ý2éeÒ?4˜ýáXô“ð+ =“æœ TVÉœºÄ̩ՔSseÔ_˽[Y Ô7H²D“³ºÄñçÃàv59­ [UíuÊÜÚìô9“¼Ï„YIÞ'ƒ8¥a‹Á™ˆ°€Ùùö7òز*>¶*•o«ªe®M?e”Ú%Ü“‰ó·ð;2—§,L¡éΆÞpY&ë¿.Zþ@ûþ’ûJ¥–UÞwÏäÜógÚ󗤑.—FoŠ­ò!sÇÎ2ÔJ9®Ldåq©ÐäGp¤ññפÕeZŠÈŽNƒ¿KàmÒŸç›À£pùAÐJ<çN¼3§a>Ǫ+:ÙrýÀ•§à*v•¢É”pUB-ø“â-‡ç‹ÑÔà?Lý93Îý§÷ý%HýãÁ@³ËÑäöºë¿j}N3"{ÝóGÁhV|.¯Ûšò)£°½û€G.¼ÀÑ™.êì‘§a°×ç"°ƒgìƒ[“îY ª~ 2¬©üJpˆ¾‡ˆDú.JÜéhþæ´­¤(ݦ&ïÕ›WßàÍ?o'H&|í,$¸w$Ofð»²Àߙϓ%yYÝ)x—€:??6X¼w#‡»ÙãtŸž¨‡n!wñ%½l\ °“Çe2Ρ»NòZér)ù ŠîWaŽ‚µXPSPãº)Ëgá\±ÒüÒZ§æRW2eÖ-7ÖÉm²þ_s#UýeÌ7õS˜Eêï&înj]ýq¨±:ÑOWO”´–™òí#N*ì x9Γo‘¹Œß•öôv}‘ïäg!Ÿå\MêçOŠï¯Š.,«ëŸj ¬‚ˆ©¡*—+ÝÙfoB—ÞóP¦à|e9åÎW-^‘ž\ÙÏ+Ÿp¨‰•¬Šo[yåAGqæ’2Ëyi${I¹¼ôIG±’ Ø=ÞŽ %ø)õ(|ê$|šãNu*áé Õ¹|ôSQ1©$MSüöOÝKÌŸÿPK‰¨¡ÿ®3;PK7A1org/hsqldb/jdbc/JDBCConnectionEventListener.class;õo×>#NvvvFäü¼¼Ôä’Ìü<çœüâÔFf Í0F1„„kQQ~‘rriHZJÃ'+±,Q¿¸0G?8Ðǵ"9µ¤Ê¤K;¿(]?(•’¤Ÿ•’”¬ïåâäìŒ0©,5¯Ä'³¸$5/µh9Ø œÄ¼t}ÿ¤, 6FF&`bº„…H³2°„PKeçkǾPK8A$org/hsqldb/jdbc/JDBCDataSource.class•VkSe~Þ$°É²X7‹½Ñ V­¶i)¥ri Ak]’%,Mvéîh½Ô»õ~שÀ/~À'02£ßìŒ?Êñœlœú!ûîyÞsžs{Ï»ùûŸßÿð$~   C~ ˸„žçÇ ~Œ2r™…ý“i—0!£“,\á·«~L±F\Æ4fü˜•1‡—$ÌËhfµf,ðãe¯°A®ùñ*#×e¼UÆ"~$%hüº$ã(R–ýÐYyEÆqÜ`0ÍbFF“ ¦„U 7%Xlú”æ ™†¡%Ý4ÚB]c+êšµo¦£»1ß™ÔÈ î¨‰ãêê´º˜&Y¾´‘ÐVYÇ–àÄB®}Z5RѸcéF*V‰ìçäü¾ÖYGOG¯Xæªf9ºfïËP›5Ö-uU ³”j(­ÚE›<2¹¸B6dˆë)Cu²%sºº¯Rg ‚©z:6뢧€¢Ûsäâ1-æ*n¸®áüŽB˜Ò–4K3B{¡QCÍPúÑâ^LB–òë× Ýð†ºf c^³VZº‚ ÜRp¯+eÜ—µ5KÁŒŽ1à_%Ç릕TÅ ¶Zi â"+<£àM¼E¦Í”nLëÍÌ: ¦pGÂÛ ÞÁ»´·’\Lô-S’‹}ÞSð>> t÷vñbVO'9˜ñ›Þ•ð±‚ú$}IMh}Çxï Ÿ*ø ŸKøBÁ—¼ÝiZ©^×A/;ë½<|qhXuÔ¸™µÚˆšpLë–@kõª)ø w9¥¯©¶e*n`¤8˜LRãüIâ\Tm²øÆµøVÁwø^Á¸+p„ˆºaD9Œhy'«) ™™Œi”ª5»1ð¹­€£ºk–®¦õÛîtµWOÊÝl(N@á ´¡øÕ±âd *ã™È/%ÛÁÊ©£ö&4Cç„:ndÓéA+•ÍhÍ{¤ÊÄ–ÌfiÄy QœU>ptµVoRÕ5*Dr×U­9ê÷ÙÿsÑ”¼hÜÅG GKqõüŽéšQ!C£]ÕŠÒ°£ÐvT˱çtg™íªÄ@S^Ë 2’=û׫r\¸ ¡ªq´W=Ž–¾Æy”ù(dý_>öjS)ø»À×”@SYî•FíÙ‹nÚ6_¦t:G,3C£M,tØè¬ž{¨nU)Í,õX† Ã)pêáúNv^5I?ª¸Oyàóß Ý‘è d>DÐôÒ÷]‚ +ð xpš¤ Ú´^ÿq gÞ?IðÝG˜–Æj·!1æg!x‹‘äMW»‰1±ƒºù-([¨ßÌ˼ǹôׂÝ×Ô7)J+ž"}?çL!žx †#EÇÝE¯ò‰ž`m$‡Gæz‚nw=@~¶ÑÈRÞoO™S€ó…ŒuR㌯Œíàè¼Ëv,"¶Ð1Þ½ƒãóÁ„ÜBg»@-§Jw¿xЂƵB1 ô£/=9€FZùÐÕ„·ú5¯ˆPKöÊç+÷~ PK8A+org/hsqldb/jdbc/JDBCDataSourceFactory.classVësUÿ]Hr7Û--K¡„G)Z0MK£€¨)*ЂÛR)  (›d›¦$»a³âûýDñ‰¶*âc†¯ø¥02£ðfü‹gÏÝÝ$›ªÍt÷œsç}îIþºýû6âW ûdŒc¿xà8(áY‡pXÂ<'áy Gù‚„Åû˜MF’â‘’‘†.ÄŽImÈŠ“) Ç%ä$ä9 !59 'd¬†%E ¶x—d¬ÂI§0ÍqZÂK2V¿/KxEä÷U ¯ ò˜xLÈxÇëop¼ÉÀKVnTËë êð”vR‹ç4#·­¬‘égh0¢­öA-W"’Öl-©uWG*uË%•2é±­X>Pð!>rÑqèx-šZ[î4ÇÇ ÎàòC³¢àSœ¥Ú‰n{ý§ÄtŸ ±TϯøÛ®à |©à+|ÍqNÁ7øVÁ fÖT“-哺µË´òš])?òšîÓ'tK§(øNXü?0,o”þÍCwý‘µÊ¹žö§½îžØCÛý¸®Fõ0óyÓ¨ÂœÇ Kªùùrj¯¿n;JÙ\Z·ŒáðÃÊD'%»=¶: Óî,êv¢³Ü?‹äÇp–æCÁ/¢«­õ6Y㤖˦˦ª&(ˆÜÖ¶7ÐsOÐØh¹õn ç™­]ZÊ6­Ó5ѺÃNcYÓèb!ëTtÚê'A8§ëy×µ«‡z÷®ÜÚ‹ÇÐRÅY3´'Loµ­‹Þ½ý7ÕQ …Òd觪ۡ-Úà6{QÕ/)Ò¥ýâñ”åúÿðXÙÏMÔ±ÁJ7—6R£ÕÀ uÀéÀU H¾>ÒŠíPN72ö¤³_†¼»!*eƹÿÍ*êÄÞÃ7©µÇaß ¯Ñ!”Bû6zH?QÒrÅ:C^ÙºP„gˆÝ³2õC!2Ð Ý D7ü¯zz%Û,ßY„)fǰ±qúúdxâ»t#6½™~ ,'þa$~‹ÿˆúúx…øÇ|ü"â>žßïãÛ‰ßêã—ÿ¸`!ù|O½$çè ÷q•]Á‚9,¼†ÀpL Î!4Ò{rLå‚ìéƒSÃU±\7ÅT¥L7ÇÔEäVÛ2BÖóhé齂ÅsP/"0Ús‰‚9 “XBÔvr¾[èàØÁ1°Œ~„ ;I ãUô¿ O¹Ñ.ˆ‘L¡=s¡ç:Úfd—z®¡-ŒP¼K!•EBsX6‹µj»Gµ«Ë=ªY8Ô KEBå\W$‘ Ève‚GøM¬¹ŠU‡¯bõáËèè5j'=æ°ö2îû3B¥¸?!E¤ëèšm]烆#Ò5tÍa=™ÏcþŸŽ‹œßG´nÒT*>d5–.b“'œß\Os½¤¹È3wƒìø²žA—jIÈÙi®JвÓÞ L4E—µ˜açØL¥Å4…oa3Çnêñmlᢻ±çb9žææáåØëbà÷›âñ;4Mó‰£áùìošÿÑ'=·9£Æèc—Ñ÷œ¿PKÙCϸ PK7A*org/hsqldb/jdbc/JDBCDatabaseMetaData.class­\ xÅžKÖXVG‰“8N‚BbËrN‘«È²œˆÈ’#É W‘6Ž@–„VJâÞ'…Þw P gzÐ6„â„£\m^ô†–ÒBïzÓJßÛ{µ«°øðìÎÌ?oÞ¼yïÍ›™U¾ö¿Ûî$„¬mamäGô{^ú}úNòBæávúCú#LÁäÇœ>ŠÏŸpúSNãôqNÆéÏ9ýEý%ý§¿öÒßÐßbæw˜ü“'8}ÒKÿ@ÿˆÉŸ0ù3§áô¯œþÓ§°Ó¿súNÿé%wÐqúoNÿƒ½ÿ—Ó§9}_ÿ‡É³0‚ åŒqÖ‚¯./©37g­œy8ã˜kãÌËY;g>ÎfpÖÁÙLÎ:9›…•~Îfs6‡³.Îær6ÏËæ³n[à%ƒ¬‡³…ø\ÄÙbÎNÃW àl gK9;³e?XfË9[ÁY/g}œ9ëç,ÄÙg+9[ÅÙjÎÖp¶–³uœÉÙzÎÎjcg³s8;—³ È÷FÎ6q¶™³-œ½„³ó@p,ÌÙ g¬â,ÊÙ0H„mÅd›—<Ìbøv~ÛÎâœxX”äl”³œ¥8Ks–álŒ³œíâìÎvs¶‡³ 9»ˆ³—rv1g㜽Œ³,g{9Ëq–çLàlgœíç¬ÀÙ%œ]ÊY‘³IÎJœ•9«pvgUÎDÎjœÕ9;ÀÙAÎq6ÅÙË9{g¯äìUœ½š³×pöZÎ^ÇÙë9{goäìMœ]ÎÙ›9»Gv%goAɾÕKaoó²·³w P߉ٞ6ú}ö.LÞÍÙ{¼ì½ì}8Ä{?ýœ}³«ÚèØa/»š]ƒ…×bò!L®ãìzÎnàìàÃì#öÑ6òUö1/$÷°O´‘o°#œ}’³OqöiÎ>ÃÙœ}ÖË>Ç>ŒÅä&;†¢NzØÍö»Åæ)™KdÆ#ÉøØH"=žHŽ'Æâñ4%³ã—ddW³¥‰U±RM˜ª)ñæÊ¥’«Ê%JñrubÕ~ñ²b~ïªKò{s«ÎŒD4à;ë¢Îí&³C¾l½X£„{0OGÓéX21žŽ$G£ã±Äx<–ÎPâ7tœ®U ¥  3¨Šµl©¶3[¬ ”ô Ltd4™ §v7’X$զ‰t8’±éÂ# E V¥¤íà~¡*dªHÓ‹Ü„ÏO¦€ËX 8%ó³Åâhµœòõª †«B ²{‹Ð ¥·ÆâŠ”óØ:z('TpØ¢‡§d.À2ˆÃ6i¡"‘[µNµ±TßÛg7Ôv¬…j";‰d bJÈæ“¥âˆ¦T/%zåjMÈo+Lì§d–¹0^>HI—¹,\KÃhAö³Ë£¥<° =e½¬(ÀPóõ\Mî¼ÛZ±S¨ŠÒäÏÀºjá€Êh§–× ]ZÑHö’²^r‹™j %Cm¨Œ/ç²ÅáH€¦‚Q¡š‘¹P¬W*0q¤pHÈG€ÇX^(Õ û @Š’b­ 36V©Õf• ¬æ•öd—ZzÝQ/ƒ,M @CßÍ!Í!'ëh>Q/²"¡*½#¾]˜:X®æ; õI¡ZÈ ×K’…B©aR“ÆÂ)±&L ç@a¦0)€F†bœÇ´­æöËd¢b.[d­ŠªU³¨‘ýÙj6W“x>M•`¸XS&sW¡¶?œÏGÊÅú$:{ÄPµ\Q!sUˆ\.²¢4lIõG‹u1Q.%à5&bJÉL½A tŒÁÝ‹¡ÏãÈ]:’­HyØ p *X*Š”«U¡˜ÅñâX`ËÕú¡Â¾}à@Jµ&@MG£‡*0•¨áb¬”¬æ…ê ô|µZ)+I텼߭Õr½b+%pOCÕ 0U.åe¯ch/\*ÈÓ)fÁªPÕUmß\¨…” Â[Z¨™W+3ÕlI̪¯µU$-Kg*»u3)&ë“ ‰[«ÙÉItº†¹Od¨X K«&”òBÞX©ÜzìܵÑR­:EfL®Å«:)ä ©¾Ë\? üJåËÔri«jSÑÒþl)'L¤gs…"AhUÂç— 8FmHÍXÑ­ |²d¬C¿)¯ˆàPö›Úú"¡åFÀíË ¦ *yݓ똴PãWAɵc¹ºï‘l©P©Ëzi0? £uK›hGEÒnXÁa.•É·bb0a‡L˜3lz*>a¦¥¹Te@¶l¬ F¾mèX·Y9_n×™ëši–E©LÈÕÕÛª±J>‹Uó4ÁH:\®ª5Z£4ºþ¼xç­¾÷²:xq¸Š”'aò ¢Ù ˆè¡‚ˆÆ<Ï®2VjFxG=+/*y£#PX¦†•V«ÇJÒTušòaô¾ZÉŠPŠÔ«b¹*†sÕ²$'ÁF eA¤ÊÅâ^ðІ¹C BM²ÒBËNÒial3’=4X(eÁ€•V³Å¸Pš¨AH5O®ÃE«¡f®R#¹9ôñ¶ ?ÍkÏi¨”͊ז„®† Õ‰7ÒQ‚ Yj±t‹:mIˆF&°ÄB㲉ÁŠ€44Ö©’­ÃX3C®I•¦ /Ç&_†F+ˆ•rÅz^,–÷ŠÚXµIR‰t6”ëPiÔÆþæÊ­ÒRãh½cNy#bXËbbYö2v+lÇ µ¶ü›¼%6ÅZ[i)‚Ý@¯S¬×‘î1Â¥|£g3wÑkl× &oÎÈ›HGpA7r¦ÚÃéf\l¢„ž%ÖÐñ ã2ùx¯uoâ¤DÙÒÀžp•Jl”—+Ý]«AÂÅ/°ÇݶaÈ*©%ã/°³ öæa Ø®i«;Úao¶ÚõÅ[½Ädfª‚Œ" MD³µŒ¶)ñ¹ÔÄXˆ:?(ˆ505}K@IâŽ;¶§É0ÉŽDÙ°iœvHS\€Xm öP0÷&“i§©—@ l(ABÉ1 R—ñúM+NAspŠp>b¥}eJ|8ôšrö…ŠtO3‘ÞfPµrìÞ°öjåàësõ* ——òÁ’<à¶~gA,HËˈ¥Ö|ã`Cñ¼rm?̦ ¥Æ†”RcCÍ_×è A«œ´Cñç5†Â‚ÖZ/Ôœï`¶–Û¯ðD‰E†2â —þ…±&s=C²1ý\kžÑnMÇYÚ6 = T  7EV¸ÒäG!Ÿä®¶eQ7P’È=cÇ­Bm«P‚0C3 i“P¯ÀÞWv Z^qf×`\{ë5Ó>S×¶r1ŸÝ«l_p½n^£ñ˜OiL5¦ôIxVfÆk¥&ìLùBZÊe…öË9Ü­(ê)W¦Lq¯²æ–ËEiCÁ€äÒâ…}B­€gM LŽÕXs´Á‘z4Q…åæø[;æÃÃÜf¤§Jµ,Äo˲õZY^b‡³…"®jÅ2,Àí·Ð(ÄH±ãAÏ+ ÌaM šÑ¥4œ¸¨YÍ¥¶ÖK«Ù ¬õÆ1ÁÞ]7Ï“{/Åõ.]˜(ekÀ %k6e6X1[,”6e2·l샘*ˆ» C`r·“slºÝƒöa¡Ü"ÕH›YQ¨çËÚLT;\<˜Khë­›0*ÙAJïs%÷픎­o‡”’–,ž[žÿ|"ÛcWpHÈÕqÖkC¶™çP©açŒZy슦F«o–„š“2 Öñ Èu™š'Ê*Ùöƒ°Õ“¬.;¢{ä³@Õ`• WE¤I0x¸ÆJñ$•¶í»®aøˆ[A¹ÜÑX7šO••Þ”`H#«ñM¹¢¢%-½};}ä1ò8èü<¢‰„ãñÀX:šêíóÑ{è½ÃûØä>öEv§ÝE¿ ~XÅÒã©hx(™ˆï gƒát±»iT}x©€ÊV Zš(”p•ËÍòJñøÙ­õöM»ù@›÷Ú•kWžK ]J ñ°{|ì^ö%Ȇ<ìË>övŸÝϾäc`òU©ê";ác_c_÷±o°oú؃ì[` éȶèH,{4•ŒD‡ÆRQPÕpOn…F+}ägäç°¿–F¨Žj<–NÆÃÒÍG<º3G~;pìHrd$–ÉD‡|ìÛô·T:–ÐÊÁ€,cáxlOx0õÑû6+½;‰ŽŒkL¤a2Vo^ã£_¢ŸñÑoÓ}ô›˜|™~¬@ƒ§Àåf½‹ÞícßÁÚ™z­48Ø3ÅcÛaXzE"<õ±ïâÏkìZ¹ªÂ©—Þ$0žâʸ ² µmÒ‹Ì@»ü®tç•sr³9pb( —dvF±D X^ܲïS Yy€îéh<É”9ÈÂé€Ö]`8•2ÃÉÔHX¹}¶+­EãF"º”%RÈLZï_µ»&ŸRßÇ~ÀùX½I¡˜ª>zªþÝ »{ØŸž  ¢ 3!]J¡€AÒ¡ÀÖT8‘I¦”—(”Œ¦b;cñèVE„Z6„6'¡VSÁ(ÔµféÀ®mÑT4IE8ÃôšZjä›’c/Ê0_ô‘ÉÄívÜ»:´&´¶¯"ägK¯”s'øØÙC>òòSpíŠ FÓ™TrWl(šÈĆcѸG¼¯Ån@W$]–î:QÁy+ÍvFSxÓªé_³©ØH8µ{{twZGRÉt:F Ú>¼Ý`J3ÔœbL>5/«ðÆ@25MwF·Ä?jl¥ge±CÿãéèèjÔÔÕhCW£¦®Ú+Yíâ*÷A¼Á’©šÌÎ l±|ìGìðxJM,1½«À!$`ÆÆ±càï®ÄÕ ]Á†$ÑŠÌ“WzUj“227³%Ù£ÖÝ:úëf¦d³¦(ú”U§WÉâ:6>Ž%¢Cãj¯¨Ê!›*YÇìj$±FÂéL µÝ“rÂú5®kRXùón¡·™X˜KÃjõeÄCÉ‘p,¡SÉ«cS²Ò€19qЯÜ0݇#Ñ߫ʂ&Bå]ÖE +£ô¬Õ ßðÑûpQ{£ÉÿXÖ„m…Ú»ÁÌ0¹3½è¤n& ìr{6ôA[Ë„µcƒ@ÌáL&¥®  -½«eMÉ€sKI²Öfƶ¥®}s •ŽíiN?ŸŠmeÒÍP‰1tnÑÈx*<» 9Jöœ¡ÀŠ˜O,SÛÕœÄ hn³Öh †ÑžÍÄF@ÔcƒÍp‘máÔx2’Ƀ-±5³­ük,M¦c¨*»ƒ‘?yÑìÊX¨—±,#·ÕûLƒ”ãÐqŸŽyn«SÑÇe?ñ±Ÿ²Ç|ìq|{”ýÌÃ~îc¿`¿¤d³Ù÷Ùù5æI$¢ò<ý¡)Ä0$šk¿‚€‡ýJþ¶v2<®¯¬¬¨gÎã¹l-ÃëJÑðŠÒˆq+cBÉ& ûS®”L0I¥ñB¸²² ›¡ê¥"VËú”†ŠÙkLpIcð:«²R¬¹Â¾BN£™ ŽEdád`_µ<(”`}›”nd.³+EéûŒq+1 V¿Pú¢)`â·6U›k1æ€s`ÍæÕxK× <Þ²H–/ËÐñšBr%÷Ü6aN"a®™„*'-hcl ’ÎánLGÕ¤3§ŽH¥X¨ác½Vp¦\°N+X/œ‰¡hC ŠA€z·ÊTΜî ä¼îìä<:¤Æa÷B^±sˆ# “† \Ty—Ä4ð®™5"(†Õ@nöjT¶P£œÖ€ºÈRué’Ž®JøÖTrljSý”Å(‚D¡Õ¢KÊ…R@S#³~HìšTY3[ %A熡Y…Õ$úh4Ár)`£§›Vï@IšU[Í`…É ÖÌö/LþMÀÅèë”°‹Æ19Ì*ãƒEmÅE°éÿû/h§ÝY¤v2ícO“'|ìzo¤vBècÿÃÙ%ϹࡡÉ[CäGß$‚!€ÑB‹g6Ë%³¥£žÈX ögmÜžŽfÊöÖÞõµê£_%Oùè·ðe–åk^J–Ù1¯ù µ,¾›$. RÒ­†6ƒcr” ¾C+‚xHûNÊ  ÖŠ«”+ëa«iƒårQÈÅ'?4¦ÄUÕä{`õ»È®Þ˜í±¤;‡øòõ«ÖA·¡íx¾.ÖÊ“XWäï<¬_Uζ¹56S+ö*cµBQ¾ßŠD`v{¯Mãçq§aîs¾Æ¥å+OCUã·ž ´*üÚ¿ú4Tâ¥-ž~ âtÉŸ?ãw1åSbå ¨Ã¯6•ï@Pê¶Ó –€-íh2%4Ïo~‡‡Ú´³A¬M/ot±ré¶-+¢š>®—ï®@î EÒ§•aQÄ[³½EAV>_©Œ—­òg `´½ÍçÝ[¾­–²EÔbp<Æ+¾ÓJ\Á«±¶jduÐXòœ ]•ì”ü[…Ö¢òES;î0w†S 6ü"C6íËkÅÖŸÎ7'[b¦,ÝÛÊZ±ÜÑL ²Àh ²u —Õ³EQþÞ?_ñçªÞ©+)耮m’xÕ¤4)}5†W¥Ê-›t7Ú*]½ÊÎz±­GU| .=x¥†ŸÍ«#±»Ý‹ì± YB~D!Œü˜+ì6°VسPC̓r˃¢ð_ó:æD´ÅÊååv2I´Õ-#wÔc›#Z^G¨vG(ŸÍÔvX¦–ΰʹÂ:4Ø<0D„µ#þYþ™'ˆß ŸiŸÝÞiŸÓ>ËÞÕî·â\+l¶3IÌq4ß]ŽPs¡æ9BÍw†¢Ý * O7»]÷wË=WßÂYžïÝ@Ü®»]Ó¤iRºÒ¤å²ÀC{àP7c7 1³Èj±#ÔiŽPG¨%ŽPK¡Nw„Zæu†#ÔrG¨ŽP½ŽP}ŽPAG¨~G¨#Ô€#ÔJG¨UŽP«¡ÖØxšVO³ÖÖc…­³-´ÂÎtÄÚzb‹¬ÄÎÒˆ-S`3 \|5ñ¸ŽW‹î#Ü„µŸGMmÏ>…¶çœBÛsO¡í†Sh»ñÚn:…¶›O¡í–Shû’Sh{ž#% ;B :BE¡†¡¢ŽPÃŽP[¡¶9BÅ¡Îw„Úîw¢Ž8¢•p„JRâ ÇQG¨ªSA¹f‘×Zq)GÔÒŽPG¨1G¨ŽP»¡.p(‹ÝލíqHíB‡¸‹â^ꈻ‹iÚ¸#Z/s„Ê:ä¯#j9‡Ôòn\9W9/è?­ùÉŒ?0M–&n÷!ÿRùÕ¯§K¯­üFwæ`…‡ ºÏÛnêv‘x÷Ó‚‚Z§œyôô¸®'³{ÜדŽÏõ¤­§“ß`YLZIKWKÃjr‰#/t©#¶ŠŽP“Žz,Ѳ‚ÊCnÂ’'ȲÃÄôŸá_~œ¬8ì?NzãÁÐqÒ7…ÇIÐßïõŸ °[é_å_R^×øWȯ\Án×4Y óxT l;M}WèeJßSPÖ Ïö}5iïv©<¬³ãaügúW#‰w°ÛÝÈ‹°™ÜÄP•Š CW) ½Bf¨£Ûuñw»î¼yZoÇÓzäé,§³užÎÑåâÆÍlë²°Ûí? º]þYþ 'ˆÞ;û¦ÉÆ]6Œ¶—Ÿ?M6yhm¾‰ß:= ʇ<èßD‘9ËDÔ°]Š.·ù7Çq .+øá-ö„§ÌâKì$ö'{³ør¡ŠÂÐ…÷ÃhÏ;AÂwY¸ î>N"þ¡iõ«ŒDý[ý¡òzŽ?4 ¼êŒD§É6‰—Fõöšøx…fZ;ÓŠÚõ³ô¾Zï]ƒÔ#Ú”íl½’¾Jéèa(kƒçÍú€»\Ÿ–5òCšú…ðw:üýçomœçߎNmþ‘$a’T—û0xß#¤õInðý£–© éSR§n‡?Ôí‘ßÕÁ¦`,Ý­ò€pFy°›7ΨŸpï¢ÖÖÖ§‰÷œA}µi¸¯Ñäz±"טýüýi'|6sVæÙ|­ó^3/^¯¯ÓzÍ)½&šõ:†½îÔ{Ý¥÷z>'»wýzç–ºÞ£w}¡ÞõEÏsÀo oTz½Ê8<¯z})öÚÝŠ¯@‹èÊ2#h‘}`™ÎBa©®¥ÕíÖÅÕݪ0í v{l\Ž×Ìõ›ìü帽¿¼œ¾YÁ¾JaÎ^®]®Ã¤íytCkПudt{ŸƒyNZ¼sÏóÐ+LL]©E:!eu˜Ó3«å‰ë‰OÚ†8!Î[´óÜ3•Pna°gšä“®…³Zþ´àñg[Zsi½UãƒÖ$xy›#ÔÛ¡ÞáõNG¨w9B½Ûê=ŽPïu„zŸ£ÀñýôN¢ ¼´¦ï2{‚<ꨠëè>}MŸ°‚ö«QÐÌ¤ð‚¢ Ò«~g)£rãE°Õò;þÕŽP×8B]ëõ¡“Äà—ØEN—'Åç–²£ü:­ï Ò÷â éƒOÁ9±!eæþz-Ü *êJÌ¡›™Â šòö*Χ·Y¼Çmë,¼ÎâÃÖ©”?¢¡Î†2tOý¶ØêN³%ä_4MÊÓ¤r‚\f%÷Q\Äæ‚çú“’“ˆ¹^¶%´^á½ÚŒðǬ£ñXQw´ ÿ„å¶¢Ž8Ú)~Ò‘.Š~ºqߌˆÖ9¯ÓÏ(¸µP†â[[ôÃv;‚Dp ™öÜ舯Ï:ãçl6Iµf›¤Ïk¦sƒb:—ßNê»gQrœØà§vq“)L^ŽÉ+0y%&¯ÂäÕ˜¼’]²ÉûÁÒü¯…¼2\Ùä¡ìuºX^¯›û4sßecíœÐ§I ¦‰ï£ªÁÒQÙ`ézßnðÉoDÒoÂärLތɘ\‰É[0y+&oÃä혼“wbò.LÞÉ{0y/&ïÃäý˜|“br&‡5ÊWcr &×bò!L®ÃäzLnÀäØ|“bò1L>ŽÉ'09‚É'UAê»O¨Ûÿ)‹@ÝþOcƒÏèR½Q—êgõíççôí§ÿó²˜-+SaO“GAÌ&9ßD›Aý8KQ¦%Áþirô0¬OGÕ ÑM°‚Âc°ÂM±Œéͨ°V5üþ\¡ªFj]ý°*÷§ÉÍÓä ‡í®6f¦Bë8TŸÐ\7+j0 õ–»,š~«#ô6z»‚Ú"gKƒÇÉt°ÿBƒý_ Ç·–#į'ü·N“Ûn!‹oÒØ<°gÑê<ôý"¡zç³ Àjžw½¾ˆO¤}$‡ëÎC!ˆ*ü3¢6'·'B÷;ÎraÝMî˜&_¼šÌðß ÓÄù¼KÖŠ£ˆ˜qŒÜš&÷!Ђ{7¸u\g#åü«a®¾t˜ìévwŽO“/_K–ÀÛÒÛ¼HE£Ž¬Üu„ øW›Ë@ñ¾ Áµd¼Ýo×Eþûeøì~3ž®gó ÷(«,ná¡ûHR.X| ’R°:£ÕÀ°©Ÿ/ӯȳHV߸*÷HΈ< Îh$„­D¡ø¿ ‰Ì&Ã_ª*–*æ5à½øO?(ø^Egï#AI#lìe&Ø Áß("ؤè36›üßxLYãAm”U÷húP}èz¨pžy¸„~ÍîCÄï:ÿ‘ЯÓo(ú‘UxžTgæ{83KÁˆ¿/ÏÞu“en¿IÔ6jTbâ4¼=LºÁ“tõKRAáü`¦×Š÷›âÇE&v¾åHHîç!$†ÿ ‡#þzNþ8ýý®2õó%JÐïíäáÝ-ÇÉo&IY6äÿPKÀK3¼^aPK7A"org/hsqldb/jdbc/JDBCDriver$1.classRmkÓP~NÓ5m—¹¨Î¹ÍÕ™fJÔ¯“ v• ””ìƒ¤É¥Í I¼¹+ûG~X þ”xnt¦ äžsîyÎÛsÏÏ_ß~xŽNu,éã¾>–›h`ÅÄj3x`bÍĺ‰6¡> Óv”gaýÐÏåÀ–ŸÓ¸ïÅýÈ{»ûªÛe§ˆT’gÛ„††2/JÂÆEx!d™”Ê{Íæ;ö ©QrDMGˆÂ⡎B^ðÞß;‰Dqžµö"ɵCøèü·‡k½ªPç€Píæ± ò˜'6}5¨0ú´½°Ÿ æ†0¿—Ei^&Ù`_¨a›xha,41kÁœ…˜·`£EXýwËå.mа|Yô®LFB¶Ÿ@°Þp*ÙMòÌ»=I”†ÙÀë ¥cÂÒÕ9x¾PÓn/š!P’§Üþss¬’Ô»@dgJä_[°é\ã:xÊ›×àu4l[°dî&’écO…7yÈ[¬­±]eÙr·Æ ÷ñ÷Ɇ{†ê)ôG¸Ö9z‡WYǯ¸_AÆwÌ|`¥r†Zð³>놱œ2\ “µÖMTz&î°À]6«XÄ=l°Öd@}R¥þPKÛ ÜqÓGPK7A org/hsqldb/jdbc/JDBCDriver.classVûwWþÖZé®äµ+Ž¥¥à4$²­TM I#›”ÚN¹²û°ãbp×ÒZ^WÞUvWI 8”´¼ ¥J …ò.à‚ÓÖ²¨q^ ”÷ûñ3?ð/À ”¹+ÉZ;rû˜™;sg曹ûúÿ^} À~ü#€ÃH3LPƒ´1h¦؃‡ùáä=@#€,N` ÀFNÂ)>ŸæÃ™fñ¾üx¿„pÊ#\úƒ bøp-x4€âláq/œŸç_œô1†óù|ø$çžà6>-á3Üê“ ŸexJÂç$<ÍðùÚ‘–ð…vã¾yÄO«/òᜄg%|‰¿Ì÷ÏIøŠ„¯Jxž+üÃ×¾Áu:Ž~“_ù<÷æÔ§Lí”jÆuËVô¤*àæ„a¦£SÖÉLj":šHFû{»{z©N[ì)SUR=†®«I[3t-‰iå”Í(z::ìpFRɰHKëŠ3Iï¡êR]UÍUÔw&=¾.M×ìÃ<á¶b‘",Y”pWØ¥|È65=ÝY¤äl-½Ï4²ªikªÕÙV$“¹¨Ë†€º![I>< d‡•‰ŒJ‰8r&©f9ß"~Zµ+^ ÔPR¾Íð†ïR2‹)¤‘Ž*I~Ô:þ@BÀ¶*—kÐ@*K7›ë“†€c7îÆ‰ŠÅÔ¸5u2Ì3¼X41 LæˆjZN®(€ñ]Ó]ô:úc&›ÑÝväÊWTLU·F:­š„Žp›ëF¢Ò%£E.…QêJfœTÉ8Š>ò½jÎet£‡pÃmÆRê¤’ËØ±äZte|Éø>d\ÀKn¹6Dd ¢Ÿáe¯`‘!/c J‘Œ )@¦[jú°6£9[Æ«X–ñC¬0¼&c•:Š‹äjÅþ¸=›Ueü?–ñŒ•½à±º?±† Ææ•²kŸí8)5{2Še©·ôSŠŒŸ¡á’ŒËø¹Œ_àur±¨¸n«¦™ËÚjjÍ–Œ_¢OƯðk[×ÅÔ8Í»Žê:õü–.áĹxϘŒQîÒM×€ùFRÍÙfŽÌx'•ŒEsS5X’TÎRMîçïdüñGü‰P‘%ÿOfªˆ¨ñ¤‘ÉÍèãº2ã„ùÏ2þ‚yÓ&Õ3še[¼+Q1n%§Ô…xÖTÎN§É§¿¢ ìNÉQÕé1ƒ†=”Ëf Ó9;6Ï’ŒwânÃß×ù|ïÄ´ÓV6I@«KW–׎eGÑÖƒÖ×ki¶»êשÎu÷(– åöÄÕ} sí@]3£êi{ŠŠÛTÓ¤|@±)štÃPx,~µÆxœ—¼‡Dé-—¹+¤±ÙåX¯b+Š¥:=Ž2l––‡ª4±±±¶Äu#Gú›6î8Œò é§”Œ–ºÛLçfTÞžBá¶MÈ4ëÈLÖž$_x5¥+¡ Wo©UÂ[e’J¹³Úä8—š7äc@ѧkrÔ'\]HÀîð „ë¬u½α«ß’jàhѬ¸Nç’ªe•35LmMÀxøºø¼«m†_~e/}J˜öú.2kÙꌀÆdÎäÏ Ã€–Éh–óÔôSç˜64*V1Üï¼ð–md©ñZΫk«gl§‡& %Åã¹ÃÇ1/Ó¥ÜåŽoŽ•=›¾¸ë"Ì"ò¬mÉTOæ4S¥Z¨†î¼1­Õ4±ä”¡%9ÐdÝÕΨ#ò¦ šåVÔÞXþtO´ÒÞazxî¢ïW?ïnô½ÙÈŸ[¢õÒºG 5½Î4#ÊÍðÐ ØÒ¾¡}5£Kð,B¼à|« ˆ£ŸNqÉ>ø ÒÜÞ!z‚^úçá˃Csû+ó.Â?¸÷2¼ÂÂÞ…ŽHGÃ=4Ö¢æ v2$þC„"ˆ47ÓËê…àE=qþÙ.z ¨ˆ\+@^äQwŽ+õww\‚ܬ'vÃÙîHG[ZýO? ©€Æ³ÝÎR^†4²„àB$¸5¦˜7ä-`Û9C\?棱9Æ–Ñ2òEBl ÛcRHÊ#TÀŽƒþÔ„›Zµ<Þ4o¬–3Þ’„<Þ2‡p¬v·rbq¿ï·ÆäòÞ« É«!æÙ ŸVC¾âš¦…Fo_·®B£xOâ<ƒçð<%î)ZÇNÌáE,”ö‹óDáóVp‘è‹´Z\ ¬‰Æ+h`¸Wº‚z±¡þ ¶3Ü÷n‡Ÿf†û‰%:«††)ð Ç…†‘^†û‹óÈ‹ÚÍN0¼‹ŸþšÚZWþþ5QÒ‚G Í·u<ó$»è_‰Wœßˆ"yæ×<ñÂã isï.ªºÉŒæ]í”ë·R¢=+ؽà]ÁžQO0<4*Û†·øˆ .µËh'ôv ,c÷h0",a/Ï$HºmÑW\Äí!Ñò9"û*"ûÖ‹ˆe‘ý‘ýÁpos„<\È»wo‰Þ²èÑ;‚mÕD}eÑÑÕEYYô`Eô`uQ‰DCb¥ÖdÔÔý­ ïax/ÑÆñP)Eõ4óZ¯ñΗª[¹oÉ<±ÌKA-u…­%ÕêqhÕ(#äá|r­Õ #\tÛ2b”§Î—Ñõº xÇÄ{.»éÛYòƒ¡†à÷ 7÷Úò¶Õâh—þPKršÄƒÞÇPK7Aorg/hsqldb/jdbc/JDBCNClob.classm» Â@EïDÍj| ‚–v>Š[ÅÂh#"HÀ>‰‘øâoY ~€%ΪX¹0swö {gÏÛ@5iT* ”Ê‚> ¢ RíΊ6coM¨·ç[ûdËÐŽ|i%‡ ò Ó³»Þ%Aªè*åÍøàËÍqzŽÜzŽ+g“±¹0ÃØ!4þ±*½mÉooý÷`-ç?7´âÁ ^Eãs•åªÊJ¬™ît:¤Fâ6…k¬«Þí]¡}¸Á¡>Ë/PK“Ã#ÏPK8A+org/hsqldb/jdbc/JDBCParameterMetaData.class•W \×ÿ»0Ë8⺰JD-Ð]cRÚˆP¥Á@©RŠÃî£ËîffVcz¤im›´µgÒÛ&MKÛb‹‹ÓË´éÝô¾ïû¾%ß73,{‰V¼7ï{ß÷ßýÞ>þ¿GflÆ¿KÑŠ£ wð×±R܉çóò^ˆñp/.¥áîb’Á]sss¼z Ó_ÊÃq^Æ¢/gÑWˆ¸G‚÷zðJž_Åëy8!á5x­„f¼NÂëñþºW"¹7–â>ÜïÁ›$¼oaM&󤈷J¨ÅÛxñvHX‡é<Ä`§øÀwŠx˜¡Nxð.Þ-bRBˆCxï¿×ƒ÷ñâú~þ:íÁxþ „aJÂ|˜¿>Âôˆ³"RZ0ÃësÌøQˆ8/âc\úxD@mg\ ·G#Ã!]5’Q3ÔcM]ª©ìPL¥I€Ž*†Ñ­Œ«†€òÎCÊ%Ub£¡^S×b£ÄR–PtÚ7U½-žŒ™„^SWbFT1Õ¾¾Ž¾c •È,UÍ=9ì®@ ¸Ûâb’vÞV¦".ÐZ3º“Ѩ2¥Mw ƒY=šÑ«ÆÔˆM!X™au5¬$(`i¯©„w)‰>–1K2ÄÑVÅ›©ƒ­ZE.‰ à'ôBû³¬˜wPr—eOI2vTWÖ2,™¦LìÝÇ԰IØ¥lšb&u¾qkß–|ž–<¤­}}M-Mu4’+4£ŸL¨z{\'Ë K[™Qßbí”lÕbšÙ"`g 3?E†Ã¡];ZÛÚâ±iA~nºzþÔí³²î¢ˆG)* )a9}SÖ&ÑŒï_ Ó9ÇÔðáRÚɆ}Y3n†-.*-òÊ!â“2:°KÆ8b2v¢•ñ)|ZÆa߬ŒKxLÆgxø,ºe<ŽÏÉø<‹|—_DBÆ—xø2¾"# ÊÉ•¹*´&µhDÕeŒà«DmD «[ªe<¯ñðuq$D|CÆ7ñ-߯wD|WÆ÷‘ñ}t“ÿdü?PÉQؘvãijC–DüHÆñÏF§ŒŸâ1kòœØ£´<¢DÙ™2~†ŸËøEaÎ$m\µ9‰_±ž¿¦¯ÖŒêxÒ¬ŽTë¿a•uP†—/ØÝ7¦ÇÚ5[9éú!u¾¼›©! X‘﬑öÕø­Œ.t ð d7˜æMƒ2~‡ß3ϨýTÓ¿4ÇSÿH±•ñ'vÝŸeü{eü“ñwVÓ›[PÔ•Hì£Q;V”ÿÀ?ï_T¾…ja¡Ö„°Ê‚"¾PMozÓ)Qj%iRïméÞGô‚% `íâ5) újE) *³ëêH”dC´=4q’]a/+ª. Ç£Éñëgp¼¯X½2÷òñáù¦K}ŸúM™fdfÁE4#UŽõjwÒª4±ÐÖ…]Š »‰/£V˦³Œ}s,% ·áùfàu82ú³d¥ 7fR´h ÕÒZH #Fnä÷ü–âÔsS¿Óžã¯ÈÞ^S‹’1ZŒÊR‹l×G“ã*߉Á++’›+Möåf™I!ÊjvçrHäÍØn|ÕP•¶ëñqŠ£X¡t.fo8ª‘6{ô8¥ª©±Óžš\¢ša†n¥åWsU&+îÎòXŸž´.Û&Û ’Ù¸ìÀ¶Q$Ãéû»6PàÎÈâ!­VdgZ¿fŽˆÇHzæîP“³7k AgròêBï„…¨ûl÷ˆuk-D¸áS»!c°Ž*=Æt5b—#ùpM nÑR® ´-YUXkg—ŸTT)ÚˆFœïkÙÇ8»ÖƒlOr8ª…sxNK¨ÈVs>)E§`©þ(ÿã‡éã–õ4°x‰¥N ×X‹–}¨¡Wu3ŠÐ†pÓoºûù§ž…[­™^4ñ}J³ßE´ÞM«å´h.®Ÿ†pÚbßCn"ÞF=èuËi.¢Y¬¯J¡¨8Ÿµ{ÖõpÑ Êb­'d×4ÜÇ…¹ªÍ3(îjH¡$_|_ú¤¢ño››¯(.NÀC“çtÃ4J[k* Ý÷ŠéëÆÐO£Œ¢Ë¨ñœË(sg´?}ÒÕ†œ¯èkOai¾øž{ÍâeSyâƒÿ‡ø²|ñ祕_ëÄÓg‹[Ò^–¾)_ç!¤£XªÑ‘ª©¦°|‚Òfê<|ûgPî«HÁOÄ)¬<‡Ê‹é@¸ HhŠ•ŠÃôMLµÁAõ/Á¬OáºVM@tOÂíZi1ŠÊ· yX*#uìêrÜRW?C®i8 —åšVŸ…œÆšKðÖóì[›ÂS΢úLßa¸DŒ‰ÐDÊrC?£é‹ÙF3+ÌÐÕ¸žì®™@YðQÔ¦è^™$+R¸~Kˆ².…:ƒSéSÜ(º®Œfz¦;*sí²Êë«ÜaIWâÃXíø•¢³Þ ß’_»Ρîâ™L¨¥•Y‘¢Ç·£b»ãÓÈõS-(1ü¾ N°|mä)« pÝì;EÜNô ¶î†;óڦΠwc?Åls£Ûï>‰eAßML!ô›§ìP>­+èH¡±¿a¶±ØÕXâ/ñ»OáBÐ+11è{ºÅï/qLáýAo³E¶E\¢_ôŸÂ¡¿¸¹›ô¾å¶œDÉ$zhÑ4ë~¿Ûƒ´Øjá8âêÝмßu-ûzÏìMa[ Ûûý¢û C.z죪y:. “s÷½ƒ¼`Ö2—§„xZç5·Y-KÓ1D)'Q±•DS1?D{-„ í26R²U“¦‹H ÖÖ’ÿ¢uŽ"‘+²æ?DœöàIPK̶Í|7PK8A'org/hsqldb/jdbc/JDBCPool$RefState.classu»nÂ@Eïð°Í+@%ýJ|BœšD ѯíåa »„]"ñkù€|bLMŠyœ«ÑÜ™¿ÛõÀ ÃÝ}BÓŽáB 9¡—:냶a­ùlê2BKÿè=ëŒU³Ëu0E%Ôb wÚªÿæ"Se‘åjññž~9ÇÓ¥Ù¬‚ ’gÛ[kN)kï' JñP¬íV}f¥Éaôߨº©&ÆuŒ%BÍê DÂñ '­n?¾y“Ü–Jè %wPKœPpÃPK8Aorg/hsqldb/jdbc/JDBCPool.class•W xTWþof’7yy…’@hY&K3”jmI H0 )Š¡jÌ<&C'ó¦o&l*­­BëR—k]h-.X‰Â$m,ÁZQ«Ö}­V­[]êVW¤Ë9o™} …/÷½wîÏ=ËϹóèsž°JÌ/E?Þ_ŠÜÉo0áÂe8qHÆÜÍÇùó#2ÊñQ™Ð“p„?îáá^|¼æ¿€ŒûpTÂ'd|Ÿbð§Ëp9/ëÇ1 Ÿ‘Q‹û]ø,?ó0ÉÃçýy8!ã$.LI˜æ×d\‚%̸ðÖöŒå8ÅÂYN³ä‹.<Ì.|É…Gd|g\øŠŒ¯âkåù¯óð ¾ÉÃc.|‹·ü¶ ßáïïòð=¾ÏÃxø!?âáÇlØO$ü”íœ ¼_ÂÏx†ž?gÏgÄ~Á±ø¥„_IxR¯%üFÂo%üNÂï%<%á®ÍêvoÜW”ÞHDջþXL ”ÄXL/+ûvøvú<ãñPØã×"þq]W#q/®…üž.ãщ«AUïÒußžv2ÂET<¤EHAëu}šôŒÆn F<;#~OTÓžëÖvÒ‹èNÂÛycm\÷“A-ç[¶Î÷y 0/󇵘Ûʃj<¥Tà"w“é)ódìæìÖ´W9ÁC¿/:ä «D:¢‹€¼~·_Zn´»Ma_$èñÆõP$Øž+)´OÉxd—î‹ ,KWcDÛ^cH6ì 5´ Ô F|ñq¬»¬chu.¦3GSÇÐP{g{”ÎPl+mUõM¨Î³í6LŽŽæNcF¡9TJ6'c¡ÁÝžˆoŒõ$çÚ%üQ "•òn+‹ÜÖŠÌ`¬ßIôioº–ÎíŸZ¶^×5}“ßà­žkðoŒ°¶¾†t}^{ÖV'0?¹"K»Ò§·ê¡¸ª§‘!¤y)iqs‚cË.pçÅñ^sMd(2Sµñ8ÉÝkL³'î¦^9$_§Æüz(jR²ÚÝ”ËyŒKòzÀ7¦š:Y6â‹Y’²4 q‹¾¶èa‰_bl:Û—¹¤&}Ùà²X†ª˜¥ŠÅƒD‡]šN”b¶âr–ëÑ*âêPëN+©‰v;ƒ>®‘ ¯®·6àa’2•ÌY>$¡H(ÞiÄŒÖGšê˜‚×âu ÁŸ¼ד3ÉC潦/yHÉš¹X4†bf]PpÞ®à5VðgܬàiüEÁ6\§à ð)ø+þ&ÐtÁuJÁßñÏàŸ þ…Kø‚ÿâDúT¹(êúx4®’&J8«àÿ8Ç>« Œ1âcv^ÖŽ‡ÂUg“ßC±m÷ùÕÕ žÃó4M…À~R#ŠáNI+¢„5-#ûÛLûÛØþ66=ŦŸ?®é{è¤ä?ÉŠXïÂEç=bÚEÀ®@€Òè X„QpÐ\QªY”Ñ)±á·b?¡¢<,2;œv.$QNnˆ9 £ØzC{UIÌUD…˜—Üœó›ø=Ø«àx“‚7cŸ‚›p³ÀÅùç¥c¾Ý1RÎá•t¦ !Ü®¼Yrˆ‡Ã<ÜÆÃí<¼ïTDÎ ¸ÓÉ×£5z@‹{Ç£QMOO6'pßùY•J@ÛK뵊¨f‹ªR Õµ]ÜÃQÃìY½¹½/•ììŽBE)øt«ªí2èUõ/ÚËds$I#srIÁÚߊÅÕ—ƒÆBõ<©HÛêf¤¹KKS—™ú ÓŒGZT‘KÂj$¥’æ×Æ¢T¦º"¯JA(q÷öör ¬âú•Å?nkM}…ùIUl¡/(èòòiŠ6Ê(žµ¤¥PP–î„:1ö§˜üᯊ –¨>ªëű°ªF¹ymdDuvd·©Ž‡";)ë.=8ÎqÕO»ç¤—`ríK¸'Œa ç:B^š¯m刬ŠÙž…·.J/†wÅ5SD÷ÍÂ[åqÓÅWL¾0O2Z¹y¹¢¨e‰(¡XW,Æ×::!=º6fvl³?_uAaËßÃW\XÈ™ĪdÓN?º\Ø DeÞ[IfW3zy ]xòak ò›.µän²¨¸óÞ{ëó©MåK‰¤UZ²–ZÉ¦í› ©¦Ø)éjX¥î„%ô i%Ø„A\ƒÍðbˆ~H‚oÆ/CjÿÆ“n4®á»= øN€"ŒÐ×3´‚INέÍ' N hs¬· y”…Ž ”ÏÀ9\Y<…’YÇÕõuGp“£³¦¤\G0Âo ÎâJ JrêÊŽb‡)¾’u& œFùjg­³99Æ8×€×:½©e«æÂ*8ÄÑç'ª1oUGá8PDßû§Q3k8p˜Z˜wãú \MŽùÉ•F”C­¨8!ΡD,Ù)Ñä³(Þ A=±PNB;P­PÔÁAÿa$ZZ˜ÿ.8nÄ0}É(Bä%WÐÒ"z.inI`ÁŠ›Ï vx +ë¨'aC‹¦±x–@¦u9MÛz+ ôN—%Kk«¥µ¦å *[(D ,™€ä¤8Ž%5£¨jÈÑ¡w QË©Cc§öU^Ü7ƒK†MmK[Ä–õ·Î`ùpå 31î)4%ÐlÊZLYkºìR“mé2E”i¬L_ƹ<•fÆðFúÓ£‘-ÜDö1kWR´VÆåý&±äSG°Ø¤Dë}FNˆ`Dˆ£(58ñÄd2åp< YB\,âì Œ'•_o)_“«Ü“T¾ØPN,­0D›dŸ½Ùcù6k37Û‰]ÖfåFü 8i¸+°»ð]ó¬ 1m=]fÈ_–Ë7º ZØ‹¥Exùd˜nùÀDÇ+rÁt»ÌoÅ+Žå`ß‚ý–3Ki cØ\¿’¸nD5«ˆïÇ-ßš\1×Òî¨\mOHNfmÝn#B¸mÄ-çÕqk!D« ±…Èn‡«C!WÛÃ!6ä¶‚WÚÛ BÖØº§€tÙwáÝVR«,Ÿ¥i¬=îÙŒœvÓý³´UY9•š+ä)¬³uÑ ß¬¤E¼ÝÒæ)¬ožAeþU'!šëBùIÈ$Ú0\7…Þ“ìÕïMrñN«¶êîBi]EǽlÓÆY³·8'›'á˜çxªnô Yçû©ÉXç´ŽŸõ«Î@1_è3šÀ“)ˆqnë…×?=I;×IWàÕÖ™­…,;¤A ï7……tpùy–b˜Îð­ô.Ós õÕkK\/PK¥±_¨ µPK7A+org/hsqldb/jdbc/JDBCPreparedStatement.class­< xTÅÕgîÜÝ»{sym` ABF@@@I †€„‡_K²„…d7în|תõQ«¶V ¢à3>h 6±QP[¥Z[ÛÚV­}Ù—ÚÖ>mkÍÎÌÝ»w_1´¿Ÿ;sï̹gÎ9sæÌ9g&¼üÉ7À,u‘›5(Ót,N¤b:Ô6CW*•*z­vÃûJ 'Ñk-õžLÅL·2K9™ÚfSq µÍq+s•yôtª·(§ÑSÎf(õ2ŸŠš²P‡ñÊéôr†KY¤+ J£KY¬)Kt˜¤,Õ”3u(S–iJ“S”åôr=5S÷ MiÑaº²’>[E-+ ÑÙº²Zi¥áÖÐÓZMYGÍë5åª7P±‘Š6‚9—ŠóˆÅó©íM¹Ðù4e“®´+Ôã§žÍÔÜIO[¨ÐëVMÙ¦C£Ò•æ*Ý”#\5<<¬)A–)K]Jˆê*.¢BP&àˆ¦DuX¥ôRq±¦\¢C«$;;4åRÖ+—å° J·K¹œê+4åJÎU®¢BÀ^MÄÆ­\£|VGi_Kè¯Ó”ëuèP>§±e9LSn ž ð&zº™ž>OÅ-ºòåVzº0Ü®)_Ô¡GùRŽr‡òe]¹S¹KWîVú¨Ø©)÷îø»:\¬ì¢Ö{éé>]Ù-!÷hÊý:\©< +R˃ÊCÔü0õ ÓO²|TWS§1ž öÒëWÜØñU‚û½îÓ”ý¤2OÒG_×”:ܦ¤cT P1HmO†oP1D OSÇ3ôtˆŠÃšò¬»”¥:Ô£¸ðé9j~Þ¥|“^Vº”o¹”\Ê‹ôv„Šo»”—¨~™ŠïhÊ+:<¡|WS¾§³FåUçû$³ÐÓ©xй”Sý—òº®¼¡¼©3Ž(°ø)5¿EÅÏ\ÊÏi¦—ÑË/¨ø¥KùÍãÛŽaó?âÿ×Dáo¨ø-¿£+¨ëïUjû=ïïRñ½þzÿèRþDJö>!ú31ý]ù«ò7ú|)AýVé?èézú§ŽÅ¿Hfÿ&DÒÓ¨8JÅGT#TëÊ' R7‹¶qF…‚3Æ9MÛgt客q½ÞB¯Nk¨kÜ…cq7ÁëTäPa@.=¡b¬‹ç!Ñ<Gâ.^èâE.îÑx±ÆÇéð1O^Oà%„r¢ÆZ4^ªñIÈŸ¬3•—i¼ùçS4~‚ÎÜ|*>€OÔá}>^+4>Cgcy%N ¯rñj¯ÑøInV¤Ü„ºÈk© X‘ÒMÅŸ©ñYnV¢Üäâ³q%òS×Ïu³2\IXtSÑø<ŸêfÓ°ùi¨¸¼Nãõdév!,GK7‹/ AR±@ç§ó3èiñß ñF¤‚/ÖÙ< µ„–jüLê^FEË5~–Îêy3ÉtñÛB» ¾’ŠU?[ã«5ÞÊÀÕ uù6uù° ÆöøÂ¾nÔ^çëêõG¶5oõ]ì«íò;kWnÚêoÖ30,¸V”A‘¨1ú}A„cA­ÙÑCÈÆ·5‡Âµ["uulªRc-u%Á®u¬ÒÖÀ 7 û}ÝÍþ`gt‹h\Î@ßâ‹´ŠvlÑð¥ye=" ¾hûÄöGz»¢+üQßb_ÔÇ`Š}XÙY»: )ÈOP`}˜/‘ÉDÛt;²­›Úk—/nh\ ˆyOwƒ‚LäøyrrvbWN$ê‹ú»ýÁhÓbœd8ÏjYí’¼°¹ ç.‘£"ï$”Ú©k•­MAdj³¯älø·ûÛ{£þ³{ýá Š+fHðƒZ‹„SqpZ£¾öm+|=k¤’èK¶·û{¢ˆõy ö›èÖöt ‰ÈWÅŒ&AN´¥· 9tT45ÍX‡ßa‹©¢qãŒu¸ô%dÃúÒ…-­[Bá¨hj¥&'6!º9ì]ËãÐK»B> ½”šÜØ´8Ô+ÈŶÅÔ–KÃ:ûÛÝ>$kBE“d»ÛÝR›è©#³AòiJŸ£øÀD8*ž³¢©MNä-b(ŒFb¥¦úxÿš@wj?5‰~ÃìÇéîîÁÕ’ $Úä„\iä:°1Õ6{z£²£^?¡×í8£²YØÅ³ÑÝA÷ ='tš4ŽÞO ÎÓbOØßŽ£æŽR úÂ;âÃŒmÇ ¯Š/”ˆ˜pSdR·mdÛ5^jÁ¸Œ]ÔSœ©GÈÌT01Z(—¯£C,st¿pá¸[œv2E&‘›,Vû}þ°ƒÔhµ3~e,¶X“ÓÐÚ”29ÔTOÊŠ ^di(,Åb Ý2‰¡1C£Ä ?o”ŸKE²>—ê´(öá’,²,ÚÄøåèg¢qè´›¢IW¯ÍMOÓCùÚ a¾.°Ãè×§ ¥Ì Ì :³ffÇiϲŠâÖÈ4ÜjÅŒ6TÅs4¾…ˆ"Yi÷õøW…CídÉhAªéCOEf„™Ú3[¸Œ(6fiG£æhï EüBí\ÑPÜ@ŧÀŽþ¤T·µ«›mêôGk±EZ„¹*}ÃIšÑ´þzZ(éÃ5y™;6’ôÓ;ÚÄ'Yz6fc[f±Œ±Ž!å …ýr"4™b´´Qãm?Wãç1XðéȳùõBë Ú·øÛ·µÆg9{…¢Ñ2­MÁÿv´žÔf““:ÎLï(HÆêIZfs öKß‹,†m¯Ïè-'æOÂPR~Ò`ÿcIŒårC?؆*ÏtˆmMù8©›CáîUaÿ¹¹bàˆA"*àfRøxȈ, &<A~AüÛP$º$îwšwe°1ÔÝÓå7×X{j›Á.`J.{×PÊØû;óü|~N§ÁþÁ¶JÛið ¹Ïà›°PJX·Á^cK ÞÎ;pê îÇï”±ˆÅšÑç2øfÄÉÎdË ÞÉ·ö,§§€¡Ld—ìRv !!Lé÷Š“o5Ø ì- ”¶k|›Á»8Xu횥(Æ¢¸”j·>@þñv'ƒl ÕØT+¬LGè’ ÍÐz”€7ƒ –&—Bïá<Ì#ò^”£¿Ò ¢ ö<û¦Á/æÈËì-o7ø~©ÁV²U¿ŒÝmÿÌF߈Æ0ÙÒl7Ûc°»PÈJ>M@+‰ör~Á¯ ¹–ƒãm .Ã*A Rqe’0¥fjü*ƒ_Í?cðkøgiˆ7 ~-¿Î`°‡ e<ÍèõüºdÄÖR%56øçø ¿‘ß„ªŸºæz]¤¶•¸Íº{»Ë蓲ñZÂ}:ZÖ%‚ÿ2?êïðwÔ•üfþy*n!š¿`ð[ùm臤Ì1Gšð WöF“¦ïvƒ‘ß® gÍ–pè2Ç{œ=f(Elg¦%Sì›’ê²ÆÅíqï"Õ_âw ƒ—ª`ø… ÑRCþeCCK`[«ñ; ~k6øÝlqÛ‡z—‰&Âà;ù=ßÅï5ø}|·Á6±vƒïá÷l=;Çà° 5þ Ábß7ضÖà“£=mTù ¢ì÷üQþ˜Æ7øü&ï5øWøW þ5¾/™93»â(pIìçOÒÓ×5~Ààé;oÆïâŸÄ4>`ðA4 ü)¾Ïàßà}"µ~š?ƒÑ‚Áa»‡6”)¨èüY*žãÏ“Àpu}‹ßƒö*1Ó”éDQóå‹ü¥‰x¶uéa$–qÄàߦ¥ú/“1sòïõÂiy…Ûyì|ƒ—Ï`+X‹Á6P:­8]Ý7o¦‘o毬‹nf›0¤¸Ý9Û€mh³ðeLu™•Š,h£O¾OÅ0>¯µéF"þ‡ìÝ,ó—;Á¯¡Óš=º0Ø«¨üGd¶Ìb°+ÙU{o ©R§Q•Ù/È´ºÖ¶Ö,jmlˆíuƒ¿Áß4øOù[û%{ ƒâa05âN_ìm´)JQÒ#}€œüÌà?G#ÄÛÿ%¿âoü×ôô*~‹ ðßKÐ *\Q)CHI0i@~Of«Ûàïðw5þžÁÿ ¨ó‘Áü#}þ'*Þ§åógþƒÿ•ÿÍàçÿ0øüŸÿ½þ›Šiþÿâ¿bðø1ƒLÅ'ü&ƒã ©€ËLeªb¨ÕBUÙ¶$]4sb†ê@Dl5ޝ:UÍP]ªÛPu5Ç@ªK.âSǨ.1K+P<舔…ÈPn. #6Éš:–dƒÛÝÔ–P´¬©¥,ÆråÚ5eÝ¡îï ͪ+C›L`ÔG=yéÀ‰½Óøº—JvrÚ^Žpr1•OÍ3Ô|µ@S µHõj1¿?i»‰‡i%i¸d²EàQÇÑl:ÕññÝÏJ’ì ¶7nÑEB47"QCõ¢]T'¨%†:Q-5ÔI(lu2;?i°"CC-SËi)¸gâïädË–´4vе4ÔÐ.¨SÕi$e~”¥ñCí¶ÝY /Fav”Yþ{ÝõÄ,7XÛ‡kÈ2\CòpÄÙtâݸ ûäFj…:ÃP+IÛªÔjM­1Ô“ÔZC=Yi¨³ÔÙgÑÓÜ4-6ÔSÔ9†:Wg¨§ª§en´ס?¡Ö«ó uÛ…6xÄmˆ¨^h¨§«g™Úe('P1•\šÌö/ìGÅõwXÞ?ƒòLpVƒ/âO2é<öÖÚèT¢;3žl OžÃ¥iú.tú¢¡0å-Ó–ø;!nʦz¶³0C(•ìº$…Fq¥OÅÑœK¨&Ä8!{\…^ôšÕk— ’ŒG>Ž¥‹š[—PŒl#°ìÓÂ8ŒMD4e%vH€òB»˜¢Vn)b{,lîâõ”m]nï E&2+Dæ¿(uèµ8¨{»º…;{åÌVœ6´O7‰¶"kþ¥2sWö33¡Vˆ¬‘ŠÐtlÑÖ(RŽ—SˆBÀw™A7ì.;ƒE™Ž'š38µ#q“â‘ ³)¥äÞ )‰´tEE†“ÀÌ9{™ 1¿sKýYIÙ¡2ŠlÉÁòwÄ——f®ö_Ô‹Ž"ƒÙI1R„2ömdG×+Žë£ñÛC=;³’tìí¢,~ÂÈâL²Ó E[{{zBaq€â­ÈNòXÓæ'”Pí)`J‚7 7(ýqî±_)[Dœ5ÙU5=®Âq&&¯ŽÔîêŒ\Ù©îL=²^)*OÜg?’ʉ†¬à mdg†cœb3•™ÈT¥í”e³W‰ÌzN{¨«·;hžDç"bli£'X¦%“nušG3â5HLJœ¢Li9W§í'c⮩è’V69<©I¶sñ<4¤ûÃQò§Ö„4#žñfÐÌŒGøáȪp¨QH S²IЄR¡‘™ÂD^D2ŒºÎ¬øô3ö?m# ¹,9™WNì£Öñuò¡“Ý+’²Zgüèu\Šy¡~Ùã5E½^ ²4êN 7ùÉã,§•IÙæ–P¸3n^r82çËerxc(è—³ci¢CäåÒü$(7é5©ZJ "{œMò“‚ô³8©‹-¾`(’J¡üx¬Ý² µÂ¥mÁÄý£3É©HVÓ¬~K½·Ì¬ÏÍ®õ3Fr3bAQv ?€5¤î ©¸²­_¢¥Å¿=JGGÁ¨¸×‚jä‡Cá8£¸ßJÙ‹³q#\"@kï&ûëúNº&•,q†l·D=V„ùr@i ‚þK–†ýþÖhwÔÚYJÉZ •êQZJ3 xIEã½Õ¶ÅÀéH«ÙÜ”–ü÷©yˈs\ûџ휇vB˜tôG'TMé)4If£\&”K, $¶›5ÖImý¨]³Lî´;Ò»)’¸Ò”¨0mwËCô•›WS€žØìµîø±šqQÒ ZN8ŠZN¹'˱٘Í)ç[î͉Ӭ¸ð’²ŠÌÆÖö0nA–LkF©qÌŠ8 "ní€òØ=¥ ·0ÜkÑŒwiÛ ³JI°yñIÚ=‰`¡ÉÞn˜·šp ÚNž$µ_ìÆêÄQ­$g®2ÓkMÜ¢2WÛÄŠ9;Â^, …Itq“‹:XJ=íʰéÚwÊ“3Æ7pò%ý t‚Á„.¦ÓÎ`W ¸-¥ÃˆX*¢#ñÖËÌQ›H›.E¤´Ä·©Há·EìǺtÛj¿­–goΫ;q›Î~çÁtÄ&+•ÍùÑEîɼ8Fœ´’gÆL(„æÐ&Ó…JLsš·>§"Û#ÛZÃÎ I% Úê©—Ç~6HoEf@qщöíQÜùýIÜäXÍtŸ¡ù‘YhÙfSÙ ¦'±·=C'ò(Eƒb£f„8‹è´õн²ÖüÐá#hš‘ÚËoYìßìCäDᤵÈsZMm â6 ™nsêÛë­n\¶huJâÀL ÅÃSEr­a$þÇëgQÌ>ó&™è07]• È{—n:ú1Û1bk4ƒxs‹#ýß„þþÚ`çQÞlpâ”úº")Žâ&˜N*6Ú©°%Y*ä}Cu“Èø•¦³ÈÉ8@:¥·ã†õ›iÂG#Ãw%ÙÖF3!‡ŠNKEçU,_žåbLÖå†˜è ®¯«+Ôn)½gNv‹FeÍÄÆ7UÒb–ŒFˆ³=›8íb1ÅØ8‚“à“ÕhÔ,» ¬»GŸ"£òÄÎcnÒNØwŸ‰6˜ ›“7SúÂŒ%œˆ4Ö×—‡—9Ÿ:ÂýŒÑ¹‡yұߚ<òõëz(ÇP¡[ tú*]!u[.ê³X³¨W°Q¯d«D}¶ ¿Ú¬[Íz [+êuf½ž#ê l£¨Ûع¢>/ê Ø…XÑ‘’xßÄÚ±¾ ©ë`~PØf|«ÖÅ•€9vƒ«Ò¥2ê>ìa¬“þ’X.ÛBh°!€(¶²m&Š“L^B¡ 5Žâ 6çÞìXºX·‰¥;9ÖZe ‹¶Ÿþ|' 4ÈBÖ€[<ûÀý$¸úÁù$¸[*KjÌå`(zƒÆz’°\ÄÂéNŒž>`„EMÐóMÐ3‘¡œ‹•qrûðÛŒ©,‰ÁXlÊ+Q;f€|ט€¯ײᒉƒPØŠ/E%HgëþÄP’Dð|^™4j¯%‘ãUûŸF½˜]bŽz¶‘p—jÔ<¯mزAð$ [ƒâ”a«’†ÝÎv˜Ãa1ëª,™zK Æ¥OÇ¥ì2v¶Ñx Áø à­S+K¼jF­¹œ]‘>ßÕA¯dWôjö™Ñ‚^Ã>;ZÐkÙu£½ž}n´ 7°MPJ¦Ö ¥×Å`B:ðMÌðKØf`}…˜rV§VwAÉ L<\PZç‚I`r6eª ¼Î5S6x]^çœPçÎWáiGîuÑ@S¯Û«Ç`Ú†¹9»!Ï«yuîɉÁ‰ýÃïöCa+ŸÝîuÅ Â넇q2µT nÐØ¢Jn‚é¦ÍÇ1(ÐØÍÃ0r4öy¦±[ðw3àOc_ÐØ­»Mc·|pùql‚Aö%ñWåtu)‹LªÒeòev§ |µa='óÚÀeÀ¡šVÕyËñ©†Œ`Í¡A8)±TPòyÒw±»Í!–™º=³ú9¨íƒ|$ëY¨õ rŸÜ“°qf¼q&5Îê”Ç`vÒ:ó9Rð÷ÙÔEµÔev:·w±£Õ¬{Ø.t†¹˜VŸ9ö€¦öƒÊ÷ÚÈRòÎ`Iîµ${9Qõ9™%;§`ËœÂöÌÁ¼Jõ ΜŠü7W BÝa’þ¡ù%Ï@ý zäÕuu>#ñ H‘ªád˜ §™äèàÈçÅK5v_²¨v³=YTcaª»Ÿ=`çáÄ€:§N“Ôƒì!n³)ÿ¦$KÚRƒ¶ô ú Ï$!U€ùø›‚¿T#!pÆ~1‹úA„†Ã‰yÏõœ¢±‡.»v)tKÎýdIÃú*T¤Æ>ÈŠÔƒÅ4¿¸Àusó­~ –0h(/‚¥wÜåC° {SÁòœUƒæ¬¨sä³G¼ŽAh9ŒÀ+Ô9†`Õ¯£ü†8»Î‰k؃ՈŒ¸ŽÁúbÆašfØAh5iÏG‘~ ªUŸÆúÇ&ÉîQö˜Iý&SvK³ÈîdSvÌ”™aÖ$K!»µRvëö“ä,ÁéÀMÁ9“äö¸5²]nëãr[ƒsÒå¶!ƒÜ6f“[›”Û¹¦Ü΋Ëíü„ÜnÿoåöÛkRÿwp‚ë½$· PnŸ] 6í=ßóÔ ´¶1Böþ9èèƒd´#þgas.èuHt'íu<›û 1l©szØO šW;„K°Nås]—W=ôLôªøäÄa^Í㚃­­×ºXÿ𯅟.V.RãU¥ï vïÁšS@;“qvÏñl†JpKÃÿlÅ}U>02úeÊQH¶®_cûLIÜ…³HÉfÀÉv°}ø´íœ…U× tÏ/Y€žf_XŠ ÁB®&˜¥'í_€fèZŽ<ýªrz6P_ÉDB>„m„.áJ€–ÏÝŸ@1clâQpü·‹da¿Iî8m:Öß ’™K»0¹ê H\UúZ¸<ê¬:Gͱ2OA˜àœ'ª|d¢ó´bxï<ÍëÀ%ó¸Ø qQ´ù}SÍ÷x]/G‚‹7kEpI÷ìh퇙^'!ºt®;µŸ{ÜùüÝ®¸ Áâje#Ó’ÁšÔrF3Ê>CcO~ ó±T‹Ot¦¸D_7eñ p Yì½,íËç9QÓ…âöº‹$'UWÌs ‘µX*9Îïî€äš-5€•×W*×v ²iÀ½ø£`´aÒ‹mÛT fq˜ÏÄ٥پ„à®™çL rI?´¦aK‚JH¯*°7.>¬ÔÀ‘TkèéRž¥«ì„ÊÒdAw±ƒé~Qæð3ÆÌ9Ù€æÔ‰µ–ÙˆˆàW8+z¾úî |öp%Žr­t\и~>½;*ij¨ñ)øœÔƒ, +9:8ý0yE597-:kˆ{œÆ›Ð×Ê¡ÇA¸ù°Œ¸¯[â¼þi½…ÏU=j š«2lø<hGGõ:ø¬g£¬/¬¼VE£õËšC%»á4üöÖ#` ÁmjàvÂuk ¾¸žÌgY}IVw Ô—×ìCÉ-@¥é@׊ê­(´ܤ¶Z3R9ù¼`êA!»’c÷-ÁýÊSð Æ­lPcO±£p‚gZ’oõ 6dÎM>n{´$IDcÒ°{ÙÓ6'LÉê„u°gFÇЭ=4*¸­ìð¨Æ}Öòr6=êK‘‘;û@Ýõ]¬ÙT PdêÄ݃Ð'Ôb}?8WT7“ÂPQDE;©Rq!Û¨¸‡ ƒŠ€T1,æ’§œSõ"¸„—LÄt,«-?8®cP¦±ç0XºOùš’˜|ž}K"~I§ÈäÖ!Ø…^ͽÍUè߃Ýë‘â=Âén©~42;U÷SGU ØWUð >£þí.xˆkÝ UÓsB?«òÚbðÈú*TOôú×W4ö-ŠasÎ1˜Dj…“Ã^`/ŽÊO?¾mÂÕ#¯äGžh:÷Õ‚'h%äB À^’8ö< _IÊ“MJÑ’—F14iÝË£‚Ûʾ3J|¯ŒßwG‰ï{£á«ìû&\® ZèÓÀW÷¦AþÀJBÒgæÿÚ¾4ÀZ©ÆÙ&`i6ÿ ݵ}‰3=Ð~ CV–2&¢ÄaÇØGÅäO²¤Šö§ï¯³7¬—C, ‚–g'ËÙ›ì§Ñ>™úèq }½•6C²ãÍlx¿žnxÆ~>*iÝ`¿ÀÄYQî¾c”æ³þxˆt "Ql$Ç<˜ØÕq]•Ùýù‡‰ô&lÃýZͰKÏÏmBç`}"aU]„:ŽzŒ§€jðºr„ÌŰü†aD¢*K #RöÇÿYýÉ"«Á$«23Y÷€^’ÕðC ê^LPç5ŸëìwGBõŸãBõ½‘Pµy¡‰jz6TsúD£™H‘Y^ÖØ±ÑÊÌi™}lefš³™e™á,¾:ÒñÚ'–®*A¯fcÃHƒ<kT^‰1è÷ûp‘í‹» ?@W(|“×§ è“è l Q¡(¸òèï‚M¬Õ&VÆëUHÑbðã¾L'i…g°4\è*)NE3³Tïƒc±¾—ÿO( ð*e^¯¬¢dûƒðfeÕøéATa˜ñÖ Vçöj/Ât¯vèi½ÎÍçêŸ×MOý$µcåµ:åïUÂÏÂÜRêA‡æçsuqÖÆ9ÿ½èÑ=N¯Fgº¿HÊsÕåxsdÊÊíÍ +2‘Þœ:ÃkÄà—/ª%_ßîþ“ׄ_×Ñ<9‚„{s¼_DàG¼¹1øMÿðKfD~$¿­ôæÄàwánñðûƒÀ*i¼w(UBïRº„¢÷¼G‰yòJ§P÷B—ìýÓÜÜJOî3PO‰zxŸ’/žÜ§sB Ÿ;Æ3Æ“û€Øìó†c%GAa:QyN£àÕÀ0ÃÜçÍód›¨#¨A5 +ÿXXY-¤v¡¨€„Uú´‹UjJ¥ÔJ©)Õ£–> ìíNª®1óÑB4.!‘Ëù¹ *ÛƒðO”KB ãÃ&p˜bPt†¬O>J‡°ôºX~–\"“ɰÝ楣=”ký=e„óÕßQ•d ÆÙ“¾*ýÃ&²µˆŠüÄ™7 õ~0h˜‚CÁÄøòþ.oŒþË›r³NñMrÇ' 6Öì23¤ßô¿ FÒÅxe¶¶'ôŸd ×litÈ;~jIyI_1“Þ_øÿ ia©8O˜ò?Â;Å|·ê~˜Çsñ”"ž‚²“ŸK'e¹ã?†*4“åö€Žþq“‰³mNÉë”Tåó‰è¢C¦2–ÌÖvC!µ”Ì:‚zÂ%¹–¡2þ4éðÜu Ÿ§Ä“™g /H¤ž‹ìB;¾JDŽ×²áê#"c[PÂì·ž(¢´J§I?<<|±ÑE=Tkå§L⛵jÖ³všµfÖ.³6°~ë1øû'þÆšµ×쟄u)ˆ“,åDW MÍ|¬éÂà³nÃþZ']¢>ϬÏ7ë d­®ÇçWªŸƒc}tãêã ÕϱødE¿rj?èuªW„á|ÏÐ Ãàzß2ûÕ1Æ,ÛnIncW?Ç””¶÷°§´ý8ãôéÔ!¦"-LÁÿ…â2ÇNs«`Nütgt×g@×ÏzR냱•%ê…ˆQ‹1×~lr£QÇWwŒé+ªÅq÷bqÜ­V›§Ý¯Cœv;ù\Í£yâ´Û‰O* éux4yÚ­Ñi·—hrZ£Š±b°h¿ù°n¿$·P’û$ˉ1cE?üÈ$¶âË“öÌ IÙ—"yïÇX.Yä>о°4ŽÕ ›(à²$\Î~Øjï=¯æ£ß±ÎÀþ±}P2ÄøõiÇŽcykX>ÂÍ‘cN0Çìw!+èg!+ÄÞqv”qÁ‹%Sm[2¸ø>À /7¯RvëÁz&kõ¶NÔØVQ?Šâa8MY¯lS.Ã:¨lõ5Êʬû”oQÍ«ø~ªuÆñÔ”ƒŸhìar8]…øŸ|†ÉñD ]"îbŸÃÿ5¦ Ó’´õ¨VsÊs Æ Sr+dÞG7ŽBÙ‡àp¹\ÅÍ\| JX£¦¢ ncz1¢¹™‹·$›SdÝÁ*23”„uSbŠ,J2¬â1=¾lC[Á¦áŒõA;NT©èæyŠ3 ©16n'Ôz16¾Jo8f¥;Nš–|*_U¿ŒáFº«“nhà0ú`|¶¾’>XŽ$”H&¦‘€ñD>ë/d¥"ƒgC’>¼¼öVþi@¤ÇÓ‡`=Y´“êq¶qâø ›Üš|ûgʯ֔â£Açñʸ£P:µ2IÊã³ÍÈPúŒŒ·fd•9#Ó‘¶29#eRåÙfdŠ˜‘þ뙚qF¤x¦É™&I8ñœ‘ÚÑÌÚéCзÓlz†I´gœ¯5'hNª“ä\bÝ”~ÁL?–šÓ]X*öài•;04˜¾IƒÜiEM÷<.”;$\%wHªÅÎw]¦®S+3]Rê‡Ó&^7ž¬Ýâæ¾îpeÉܲaâ«Hº¤®Ó}Ö5¬t’ÛHbn¢u!ûËòº\šÊÙwébÀ9&SÄHµÉH‹ÉH‹ÉHË›±¡l€Uf™TjMè$jÝtÅð VžD¬BÿªŸ$V¹õüò¼þ²ÓrÆ = ˆQg­@¯ÉÙÏ>‘~’y<ñ«sÈ5â¡5r€U‘ŽÆXuC?|Wjõzì˜*®%ŠK!bçS¬†CNöÒ=D—Té“”{]ÅÎAV[çÛ±÷Ž“9ˆH ÷ô™ý–j|¾ÐÞZº ä¾ã>ÀЉpψŠ])Ã@mnA—#äˆrl#äˆòøY¸)"y³L¹£ÔûÅ&h²_±þ&Ù/’ì`³åx§˜ìOìO· ç9åc[œW’Äœ8‰§4¤²?wDög~:û6Ütí8ý¹#²?O²?/Á>ùÞÿ1¡UË @øÞÇ ·ÑOèÞ«¦Lú6ƒ êêQXb|ºÙ>9©}˜þÊC\*[ŒJy*aY\-™ÁÈh¿”9탻âWŒû(’|GÜÚáD>qC„Çz»âoø{¯à¯+ÆN£›È/ô äõäôVõÊ«#k:Äêåýj“ ï °ùÙ‚~‘K kÕ®Ê[¸~?²³º ‚ŒR½™‹À¥¢–B-¤K7ž¢â6ó²³`z²…)·ŽÂã¹ÒIÖbq ÆK/‚CÝ+B¥÷lù'q_Va…GE¨2%Cö}€ž²/æ-¢-+à{Ó§fĸ(m§ý?PK¨@èb²*jPK7A6org/hsqldb/jdbc/JDBCResultSet$JDBCResultSetBasic.classU[WWþNH8! ‘pK½ÖÚ’Ž¥wc½$¡ X j5méÉd$a&N&¶¾÷OðÔ¿@»\@ëZUŸºVÿSm÷ÉŒ8!‰ÀbΙ³÷7ûÛד^ýù€9<Ž`ŸF0…Ïäòù-_ à"2òxi_ârWp5‚kÈÊcN*òó_q\—òŽ›_GÅ‚-r,qÜâø&‚ ÜæXæ¸ÃЩfÖœË W –½¦VŒJYµõFÓpÔåÖ–é©YÔ‘ŽÈÌÜe權Î0¼¦;9ËhnšsåI$©DÁoÁ!aC•ªÌ̺x,TC˜kê­òº®9†¡¢#´EQ_eCç¸Ëqã[†ÈüÏš^wj–Ùà¸ÏÀ‰‰Ø‰!š(x¦ˆB•²Œ«^©mv¨¥ŒÔЧn8b³Î0Ñi)2n@Ùš)ì'EÇÖÅ&Ãä>¶f©³Þt\ £2úª°…æèöküq?~YÝöüËVù Ræ©s]Ô9W}ž’Ú’5 …¡›ag:ãœ=Ð VA”ð‚ïñƒ‚UüÈ!”¡)¨€ªqOÁC¬qT԰α¡ÀÀ¦–‚“8Eõk+„ÿìU£“XAüH7/R–’íkõJYSoæ³9©—ÎÚ pü_º)yÓWT„š¹ÖÃNγÓd¸ÐMï¶yQwε²¢QÓ(’nB¥`šº3D£¡7N¼Õ,õF©Û ĺÎK[\.– û¡o/ìOÃjÛ@¿‰Ø"÷4 é=ÖGøˆìЦmë¦t#1Ó5’A­ªkî…@wµ2}yÌn³ÆpöpF†Ó‡a$[‹H&‹r?Yêqï0 84¢KMîw:>ó€!,¿p/5V`÷ÙÒmÛ²Õy¹2„tw?!çÔºAÛ~Aˆsì`=îÐDRªmý4ÿÚFo 2sa*òjþÚÊ<éÎàäÀÉ¡ò‚TLË)6ëuËvô ÃTÂ7ôþf!h(QÊJûŠŸ‘aºíê9ðM[ÞÜ1#qš~ަ!ÿé‰ãPXô6† úh'Ùljì·&(/ ZA{?íW“;,%ã;èK>Eð)B¿°ÿâsƒiZBÉ©Ðú·bÛS¤ã)z~…2ûcá= L…¶Éµ ­Ã¼B‚ã ÇYŽwÇp®EÉð=çñ¾G€z$Ü|èáöëþœÆƒ•¹ÅdCô>GéÇ·[I{¾Ÿß!ôý‹“nrcmìsøÈc×<öü¡ì1—=&ßÇ·0ü ’}|“o§Ž(ÔǾõõLPŸ ·BïÚe_þPK+G<í¬ PK7A#org/hsqldb/jdbc/JDBCResultSet.class¥< xTÅÕ3sgs“Í%/’@H@PÀQTÐð$$˜&á-à’l`5ÙÅÝ k}+øÖŠ ¢¢«¨hÉ¥l¬ÚÖjmk[õ·ZkŸZ­U1ÊÎÜÙÝ{÷Þ» ÖÏ=wçœ9sæÌ™3ðÒ7ÏVÙ¿Uö‰›T³O‘ÝTöY:©eÿEäϱÝ/0õ%‚#¾B0ˆàkß 8 @!(†@AÀ¸¤ PA•Jjª’æVÜJ:f4Uß ™²Üä%±sŒL#ã”\y˜ÍG0JUF»ÉZ¥@UÆ€„J!aj,rç&W(ÇÁ€)ã1;úªÙÜÊDef'#ò‰˜-ÆìU)q“MJ)‚2å¦"B…ªœä&£v.VNF0 ÁTU9Û)Ep*Œ¹ršªLO'[”ªrº›\Ðø {¥ÁLU™…âÌcSæ 8Á\UˆZµ5(Ø<,«EP‡`>‚ê4 8 A#"7!Y3XµÒ‚`!²:ËZÝ´ZiCÐŽ`‘ª,v“‡•%˜YŠ`‚åV Ñ9V"X…`5‚sx¬AРA‚µÖ!ð!8Áùºô ð# XàA!aUéU• nò¢²Gij}3f/T•ï¸ÉÏÁF•‹Üä—Êw@áÅnòš®ÞKTåR7(÷2Ì\®*W`æJ7ùr–\`‹ªlu“·”kÄ\%DùЭ\«\ç&3”ë±þU¹ÑMÞWn‚i£ÜŒ n§ |±nu“3t¬mn2RÀç6LÝŽew îîÄT¦¶cê.wãH܃©îU•ûÜä ]äûUe§ª<à&ƒÊƒ˜SßÀ>U•]øý‹FŽ?ÀÔ#˜zS»1õ‚Ç<`‚'<…à‡ö"èGŠHª2€–¼-åi7=KyÆ­ìWЯ)?Fz+`êœÑpžCüDU~ê¦ã”ç1ó‚ªBâ©©Êa¤1Uù–OJU^ÂïË©Ê+à•Ÿ#ù/å/±…W1û+æ5̾ž©_#xÁoÒÀ üSèí”7Ñ'ü‘ÿ€àÞÂFKÓ”·•w|7 üŸlä]T🼧*ï§±gÀmþŸõƒTå/nåC寪ò77] ü]Uþ¡*ÿT•Q’Ó0¯º¦Õêí·yÃÕž¯ƒ­Þï÷kº=¡7DIšß³Á·Ö)™Ü®­Xº »sME¬¼¢5°È›£ù™”dÓ&oØ3ÏöPr¼‘R¯¬h5áUV8èñ‡º=ao{{}ûæõ^JèrJÒ;ݽ=þš@¯? %õ âFO¨¹·»{±§»²ƒÑ.Ä,j<ϳÁS V´&ÖBSi:Ï&ÏzJÆeëö­©¨÷‡çžÐ:Àôô` ^â ú}þµ”äÅy·Ý(‹‘i( ²÷xQÌŒLÏë\ÓQºn‹"€®½@¡‚ŠC¾€Ÿ’±Fü6½äð»<ˆéîÀ°t„òx[æ51 À×|¡¶Ž` »Û³¦Täö…Z½žÎ÷fè/´h}'(BTf½?ä F³ÁÐÂ``=ä}bø»¼áŽum¾ ¡*ÍÓÔtBNÑuNÉÇ‘)FÔÕ¶×,X]×Òº¤ªuäAFP’Ô¯‚Þ'†ÔZ»¸¶µ­ ÿ+\Ô|VsË’f,ü tû²…µQn«[š—aÅß)%*ÚjZ[W×7·Õ6·Õ·×/Ìþf¬6Uþ¬®¦¥¹fQ+´_çùQ¼|ÑÂyUíUÕÿcJF/hiœ·jÚZZÛV·€Ð«kZššêÛ¡žP¥¦±¥­6†PÕn¨fЇõAïzOÐÛÙ7–mÇsa"¢>¬0ÛÄèy;AK¾P‹_=(¦$¿£7LŠš{{Öxaær¿w4¤O Åkhµ›:¼ëÑ^B*vØÕ¡- -ÖÐlÇù`þíº]¨rάõ†ÛÂA}*×OÑgC·Ç¿¶B/†µâ¨ç¡À¬º½0Z¨ËUÔ¸ŠÅ›Ã^½¬š’Tä¸. ë%m`^PRï—ùz¤1€-bAƒNR×ðH”:]¬y^!,¡¹aC¾µó¼¾H>¦¸>*n'¼®"^‡áÈ;Ï £Ó¡ë6UJ “ÀìVTC˜© >Úȉu–ÍÔ«Û}=–j,Ãá“Õ0zÀóŒ²àˆ t €Xêðù@£^OX] Õµ¾7¬×Ì„¨bV0W Xä÷uÀÐFi2E÷ýžàæhÉäbë`ÙŒŽ« âr‡òj‡ò6‡òz‡ò‡ò:‡ráR›r§!†éaÇeˆ‚³^ ƒ;–ã⡱¢£<Å5a”ÁiÃ`Ê¥&„–3ÅaÑÓ-ÇÄ9PÓ ‚Í´ËÜbÛGöñÕsœ‘½íú è-k΃åÆâôb°Ë_À~dh““è0ùº|þα,«Ê¿Uå˜C(û:OÐÓ aÔ†Gg.j^Œ8&&Ue ­ ØÙ:JœYX‘ÁóV{»Ao/ ‹5µª ¤lô`Nõ…dyŠ/¤¥¯1¢§yâÈ®.½Œw‹,º>áÌÁÃLIõ¬ RÐ㤽ù6`üÔ_ 8;žéy¾`4@@ÿ><{­µJ‹¢ëkº¶Ö”þKD^è`µÖ”ˆÜAÃÂÑF}ÝÁVÍóv{õL¯@Ò׊z&¶€']Ž’I$}€Âj,L× åJ¥mXš¦—ŠÕÀ…sÎÌ)ÅÁÝhp½7X‡'é¹6Í.Oît%sDÍdS¸œDÐiÂYÈÒ9¯:C5W3´.øÛwë‡A)åOYae©*ÿÅ«€uÞŽó£žFæÄ‘ŒPÌþ|}ÛiÚCDƒ¿å*žgŠ}-’ÔûõnèÆpþ†ÂPVÙõXUÁÿ0EÛÍ0 çFOPž¬gˆRÃáz:,˜Ay F Îfba¤^©G‘ ?,¸Ñô°“®@°GGU•ÏãE‰(ú¾[7›ãW5Ånó²O ”ø‹PL£Y>¿/<‡’Ë‹‡º’Æ}ˆóMÂзGS«Êªò¥ªQ•¯Te’ÕÇ$Ó±7Q¿ß»Ñt…FÉÊâÿ‰©­Ä1ö35v-½A£çЕm¡ aNht ݪÑuúÿµ¦|CoÓè¹Ô£)G9-hœr¦q©Î£í]EWƒ–4z=–,vý@£gÓVP›Æ¹ò¹ª|¬q]¬±›ØÍ”Z¦®Ÿ(mý<§pUå©Oãn•§k\ã#4žÁ35žÅ³AA‰^@ã9|$Dñry4¤ñ\èÏãù&*ýþBã£øhð|á…/ÂÔXú®ÆÇaê8N4>Søñ?OÔø$>Y£ÐßhüDú ]7ªãÝ »x±Æ§ð[BÕènú˜F§Oht}R£{ô#8Ÿ‚Os<¢ñÓé‹]J—ÁÊ›ÔÔ£SB£]h¶k¬¡Øû346€7¡ÁTò™Ÿ€ÂNÕØIìdJ޳ŒaôTwà:Ï—ùlJFÐÀ'¦GTÀ@¢¯hüL4£åt…Æçò*W+ÿÖè"˜¼†h|žò‰Êk5^½âóA9@¹@ãõ˜M¡ï‚ž8ª{}ÝÍ@?`ò~‚F7!I3}â8+IWÎÞ‚`!%ã’_XkülÞªÑ×y›qkÄ ¿ÎÛ!úˆÞ€`AýµÆá4ZŒÓPÇJ8­ÒèU8¿C§ó&‚ß#øv+º”+¡–/Aûù#V¼…àmïàh-…)Kÿ„6õ‚÷±lj؇*]Ž \€Ý†>érz…ÆÏaÙ_I?×ø*ú¥É5è'ºh«5~.çãA°†eh¼ƒwjô#dò1…û„~ªÑÿÐÏ4ú_àD¿ àЯ4:H¿Öè7ô¨Æ£cLÑg.¥0Uc©,Mcn`Ê4#€3ËdY²5vt—õ!¸Áíî@p'½Á8Û g@ãìL'_M·°/à-º8¸Éu¨?Ïl¦&"~5&~ç;0ÖÀ¶°­àJl¢-wã^Ï +vôÂMi¼‡û±•ÌV®±©¬Â,• ¦¢OÌ>¾–&~ƃ<„Ä Ü›mn'N'IÐׇÑ>zQ1øFoâ›Áç°¹¿k¿ƒÃý8ƒEé"žFÖ¤ñïbª…-ÔX+kÓøÅh[„bÙÙkÖ5ãa ßÌ„­l…l£Q‰]¹DcA˜Dº”¶¢Zc^Ö¥ñËX@c~`a4¤^´Ø h±.GpT@í&¬¸+.ÄŠ ±b“Æ.e—᥾©NàJ_ŝָ¾Uå×hüZvL˜ëP?Óùõ¿Þ¢Ñ6œ7Ræ±õŠ÷%<Ýëjü&~³Æoáß‹®- k‹æO7:¼ã] íè«2º‚žñÐÿñÈq<%||8•Û°2­lüôJ(q‡éÞ‰²ÜÓmñº缘1ÛÐÞ©\ªñ>¾]ãwÑnßM[5~¿Wã÷GŸIŸ§/hô½â=ï„P‡ÝÃvhüt-èUºèm«‹åEŽÔƒˆ¦ ¢M=AZûV =©|—Ʀ”œ”tÉšh}M…ü`V½•ÎäÕ¢'qÿaÀË3Ú£ahòl·/ 3;vÕ;z…1ÊÔ÷Bò=RŽõÙ¼7ÆÆ0eâpv ‰­6[NîÌðîiÂ{³·3ÙæèÈ6þ6‡‰¯°(9Þ‰ñÅTŠ/´ÀÛ ÛS¾aé÷¸ ¸5Ä]«A¼Xœˆ¨AØÀ Éå;7T°IEÕèuR`$Ö†×AŠ“¾Ãfò Þ`F !HãÕ¿cñ¨Ë)òAÈMÔñ"°Ø¡‡×k£<œ9ˆK@‚ º¥¥±¶ªŒÉJ ·][£gå#Bµ½¾yY}s{ÂS§wSK—~8ÄɾQt|™$F¹¥àù®<~ù°žÙÉ­ p+*®IVþÛ:Öy{<Ɔ íéqÛ8»6hȇ 6ä{!¿ÁßùM†üfÈ_hÈòòß…üņü%¿Ô¿ ½œ^!ä¾Röç*ù½ZôçuÀÝB·î5K¡ðÍ. ´„öV²—(Âw ’kq€à:ø]OoD«‰"ˆæ#îaŸ„¯kIé#ùRu©O“4…ì"n=ëFæ ¤Óû ±½D;$j´ñ¤ÐîSO-J)05{SLÖaÃL11{€>HÁl:°âð-,º›¨ûHÙ´Þòær˜,åErÞ½}ÿÛäÏäⓚ*&™ƒd+øEþë?M«VéÏ‚9ðä·ÏWé/Ž@ÛfuþÒÉäηZÑ«Q?ÓL!éð â –Æ ¤ûŒAÏ!páð)eâŸ]Äî%®¢ÝúØšÙle:Ïã]¿“Œ)-Ïã#\jÈã³w‘´+9Ýuô=9XÉ!Ô)Q¦»ò\:þ¸Òžç‚¤q м¨J³¦FHñï&éÙô¡Ò}¤÷€2=%/E§ßä)@¾¡R-P‘k `Ú¸¤ì"ËšPejé~²iÙÙŒ•"Ãï¤B*B.’¦@£íÿ»•ii‡È™iQN§î'/+H — í¥Èå2=\.‹Ë+Ý¥n«´+S@þÕE‘¯d8Iz“ ˜$W€0Wö“¡RpªW-)ŠGdzI¶6êØN¨ôW´àq}!Åkt,$ÉhX¿üއ5|TXð rÒ—Ä•žkØ×鯥\$#Ís†\Ñsõ=W_ѯƢ-úоåi²U_Ñ‹g?¹f k‡XÌsdzÃÉ4¯³šæô7û¹­Oâšà§=zf©ƒr¯îFÿrYî’ßTIS€ù]$ã)r}Ó.¢>EnhŠÆÈ7ÆV:áƒd)ôŠ¥$ô¿uêR¹µK¿‹ípK¤Γ.ô¦>âRvëè›ãÎr„‰Ã›ÃâpK¿‡ï%áð‡aq¸5 ‡?ÆÖ®Y’ÃdÁa€lC.ÛÅÁm}Ä‘»Ü~@çxÇ’øù',?ÅÄó­oÅóΤ<ߎõt¦ä9i<ûv'aùηb¹=Ëÿ£ïJ–2#ÇMÁ0$wñsMƒ’eb󧨱E;°ASž•T²ÂàìèÑ]$³p;D‰ú‰–`–Þo(…ðü”´tS[ïÅÚš%Ûz°€ë=ÉÔð~L³s¥J’óŒŸíHÆ÷ÏôÉ·¸¢¬Ó‘oá#Âï”á?H„ÿÔ¤ ‰LÚ%fÄ6p+úÖÒ{Ä M%®ñ,%Á“ü%6йÒ0R±™låCë~áØHã¤Hi…ò!Þ pª‰ê¯±ÃËû¬Mü-†Ü>VÆ”c%áÌu¬$)L=V’T–v¬$n–.IŠä`eHÆFÈ#Vm(šG­4#XFršÝVšL–»¯p šlDÙe£èG,Ç)n{ÜfⳑÛz*ò„ý–눾ÇfV³4¾&SQòFZ‚Éî8áÿ`gwg8-¸´bŸÄ*°»¬Ø§°™NØ^+öt6Ë Ûcs[ÁfKì…P†·«Ó¢7–É[QC‰·sÉ;¾¼ìI/ˇ)õî °ÖËòÁZÿdRç ÉQÙœA’ÇÚ9ÓQïÙ\‹°¹ýr(S‰xþ _|$ïÇÅúó>òl!×]5ƒKÀ-{!Xè_¶“Ée‡…¹¨O“)ÙExYeJAŠ?Å>œ!úð·x²ñ, úP5H*ø\•Ug'HVãØ‘¿ÛÜØ°y}«ìˆ7zãj§_K'N°é ‚ëÈ~2SôàØ9`ôÏùWAе;0$¥¢; òÕ:vç#«qÕ±ùÃr¯ulÁ°ðêYƒOI‚wÖ°ðYSÒPùcëZÔÈš%IÜõŽ ˜S2þm%ha “¶ñ‰ÉÙIÚøÔJÐÊÚŽuÛÓÊÚ“´ñ+Á"¶xXc´ˆ-ÞR¶lXc´”-ÞŠdG.ŸYN<Ø9±³‘‰„þ¬Kå0o”øì[ÓçšÞç°•±-óH©oU,•6QøÊXÐG-ÔÿZQW±Õ¶\m|;×–ëçVT[#Q£/vFÅ^Fà=]ú~ò¾ø2Á/g¨ô©ù*ëH`Öé´Z±N/ëÒ±ÁÖ\-è_å½$gÎXqgA_Á–=ú9|_ƒïøÅ øíRé_6Ô’÷Ä-¨¡öµ(û:dJ"ÊÊQX»3¡ä–„^K±âª‘:V”@ù:(§´äËrJáÿÊ ª I Ò,BôÚJ—Àpd*C„-aK!ª’ŽªÃ_YÜ”Vü¯É¥øÖ& ¢·¬#DÁ[{„d‹Äº#ø2ʘðE«Î“%@6jÌøñ@z=•ÊΧ*Ã#ÁÖz,“*VËô³@2‡I¹uùÙz§¥º¬èÄ^dæÈ3}±±>ÓÌcxÔƒoÇ×zc˜Çp¿ÈB,;žr‰í€ñxjB„¦Xûb½±Cz&¼àªv;ú Éù§ÚíꇠI³ÛÙ{?Ülcì¼Ö%¢Ú¡¨é®’<—¤Ís9 9\b[i{‡Il#vãPêqÛÑ WZâ–¡t›nG3ÜÚ¯ú ®ú_ ±MIý‚fG²Y’LT^4’„cí Ýì¤m°³µä$vvÌ=r³ï £G¶â ‡ÐVÈo©ÃÆ!’iG2!m[†Ðd–ÉpúeC¸êØÛZõmÛºˆ}W¾ä›!W”ãf÷WÉù^h$͉ ¡td„\´æÆgBÝqvìbH1v °½”]&Ù–I¶y¥‡HNiI„æEh~Ÿ]œ=ÒgK^—‹Ó•+$¯¤z’âJAq•ýËMÐÁ({²« ÇÎG*±W6ÔŠ›‚ÆÒÃxQžE „ÑiegŒÌªÛG On–ùù2‹Ì/Ðót ÆÚQú2ãfÛ%"k233ñ¹4yÃ00 ÿ¥º„J¦¾C‰²2Ýn7êÿM:I;GjÿD3m!¿Ÿ¤âÓ±IF6}¨p-ÄçYOÆCÉÐÜ&®×³ …\OÝ—FwLËûõ¿LÑ©GV¯²¢j!dƒ(¿7Ràr»Y—ŽÎi€ñÍ5÷âH£’—p•¸¢gs%{)Dµ90ˆcûHzÙA:.BƒÈ¶øøé^²íÔWÐñ•®]dceJë92a;IÇ/PÃ7BßEÆÅlû°m,»œ¨¿†«Tc•“°¸M†ïHz"@h½Xd¦`•*)R³óž.HÝGKö‘‚¾_l KÉ :A*dQ¿!Å0ÆúAfÞ9*»ÿ*‚}O][­#dŽiðo þ„Øvv/-ÝžøzF>ÝD¸-F8IfÉ}ðJ$¦ "2ˆ£fÓfzõ"G&ÊAžõâ Me÷Ë‚xõ²¥!°¥Ü‘Æ[‚ÿB™lj®lª´¤p€–C/§Ê:÷ŠG*FhE‰,é‡:ÞOn3uaŒ© ·Çúoø/zR”‘"©‰‰è»çÃ@mÝdžsÈ&lˆúbD¯@º–ë`/ìIaâÀï´6e–˜•;Él½zZá´Cr†É’SöÒSqûŒçæzÉi…ÓðÍÞv%¥»Ž>'ñ²ÎŽÐºT§ ß3ôÇ>ªŒiD×gI$£è¨¹ô(ì´ÜmQœ¹ÛñaA4¯`ìøK’bêã]±>Þ)û¸ëÒk—Šð>#_Á›zë™Þ§ƒÑ>MFŸâÝÉB›‚Ý$éôK2Ö$ïÝ1y×c|;£i“t¢J÷T¦Ú¬œaJGLsá¶CúÕøM¼X§ ú^˜c4aÏWÚOÁ–ÚûÙN½žºeÈ;ݘ)\3ÝEÔÒ½tV?QKÊúÁ‰”÷“¥H½º¤|/Ý-•GèüŰö,7+BÏì‡г3:·Ÿ–ꩪ>2§ÄJ«ÄÛet½/=» ‘çšz7,´`Q«bo—KöÓêee{i ðX:@çõ“! 2Õíáw$­‹Ðùý´(>nUD=JF.ì•=¨²‡Tö}BÅš¢X+pqQÙ®AÒ.ÞçŒzyXêí.-rÒ‹T‰‚ú(“ú(7«cRŸŠg#Ä…Î$²¹TÊû©&iìì)h>ˆ)¶êûé‚e%¥´^7J›±¾ hm"©ÿPK}Ë=**šxPK7A+org/hsqldb/jdbc/JDBCResultSetMetaData.classµXy\Õÿ>X2Ë2e!'I„vI6&žY‚I H ( Æ8,L²ìâîl{¥MZmë]£%­gÕ¤j[¢ÙM4­ÚÃØÚ»ö¾o{×ÞV©ñ÷›vg üQøðÞ÷ýÞï~Çï /¼þÔÓVŠP1†ñ)ÆpÄEèñbBO¸p FI¦sá8ž”ð” Å8ÁsŸ.&Êg¸yš‡Ï0óÜ|–…>çÂçñžxŽ•Ÿdô¼_d†/qóS¾ÌÍWxøUnžãá×Xüë<üþ¦„o¹Pƒø6÷ßáæ»Ü|Ï…ïã.\ºð#ü˜Ñ‹,ò¶øÓbü ?wâ.ü¿âÁ¯ø ~ËÓ/±¿c ¿gSðGÎßxðg qa5þ*áeXéÕl­sâï܃°­:ñ/ü››ÿHxÅ…M¦ÿ-&ô*£×3ú£×"$@HFŒ 91šÆHbädTÌÈŨ„‘̨”Q£éŒÜŒÊyU0ªd4ƒÑLF³Íf4‡}yšÑ\¦U1šÇh¾$Hâ ITK¢F ,ªÆâ!½MÕ•fEW¶F¢þÁØÕ¡¾^¿9éßžÁ(ÇÔ¦H(>nW†TÑ-àÖ£J8Rtµ³³¥sd˜È%Aƒ§)ëÄÔBæT½ÉN,¬­#²£)ÒGü® ×Õa]‹„cӵغ¸i £êʼŽÚ–ºnc¢I‰©j8¦éÚ’+íЕàî6e¸Sé ©’X( k±U‰™BšI&ªáàˆ1h‡Bæ +%œÄ¯ „Õ>Ê”ÍZl8¤Œthשv×[•^5$0ƒ$[w){H ø;ô¨Hb9”â5óÃãŽà :¤˜c™ÆÛ¢jP‹Q¬dܘVBÖŒ…Éh¥œ‡"iM¦f3Ååc“‡âÛ®*}[Ã!3Ø®¨¦›ÁVj±fµ_ kºI“=éU )±˜©eZ<|MTXRk‹Ò`ØãÞÚ»K ê´)Š9Š’ðY «sys45tvuÔKÖE‡ÕèÆH”|Íc–VV®o£13­kØT{ú=ÜÝmçÙÕ×ôoi^ßÔ ‡ÉSZ•@Ý¥´9X£À†I(œŒºÚÁÝf¦ÍGÄÒô¹1VtE†1h1?ÏPÒóÓiÿès÷qÖòíI¼lß)éþ”·p~Ç팾0ð Ý2bÐ%±XÆux›ŒáAY,gJb©,jE,¼Â'ã!^ŽYø¹Y!Î’ÅJ¦­";âlq+YœËƒópXF{dq> @0y57š ܬáa#k¸P¬•Å:ú(î¦ ”žõq-Ô§FeÜ+Ö HZ¿TWWË¢I4s³AÆ!–ÄFYl›eºÅ¶Hâ"Y´ân÷ã×bDm²h[év¢4ï4ï½a:H’Ø&‹‹ÅvYtðôlNñòÔ’ïÔum§‘fê”q Çu > ‹KE—,.ã ÎÏÉ`K˜²·G ™ ¼\tË¢'?g3ï+mH59¯;fæ& ¿Ÿâ§X¯$ÿ{l—öš;˜¼SÆ#x”î’êêj+4&_Å —ŒÓï ·qL½"(ã.F}ŒnÀûd¡ÒzãýLëgÚŒÝγƒ<ûN¼‹›=2ö2ÚËh?£ýŒîdt'£÷’5$qÓî`Ú>Fû]ÏèzF`t3ÛÐXâ–½‰ïbã·2Ú-‚tÍé¢èü·¦ ]‹ù¢6/…ÕVPÝÙ× ÀÜ”Ê<ü3òžò =‡½út·mgs½¨žÎtsyÖS dšLOµ£¥J¯¦•º;UÒÙ¥wWiû9§ ȬÛ-áXºr;YÆ,þE1³rÉ3˳š0¼Þ¨íñ¡Þ e%}öÚ,Ó…™Üªèɽ©>„Ôð€>hÖP®qi¬È¨ÎT7QyImuZ¶HV­öØkuêάØäé–hg*Þ³0«Ö…"h ÷©×rZ zZÒöm%™2Ac×È0=T–Õæ†™{û[×[ ‹ß*ÉoÅ_™½Ã/ѵ¯l˜®­o]t n>Ì|oîHö¹ ˜¯#(Ê|Fµ2‹<È"Q.è-‹ñó‚’µ1Ê,+yê-í£ ¶E#ôžÐ5Îê"û^%jL‹éþÍ4L3‘ñšÓ2‘j-f G:£qZ˜™yÐÍÇÅ i”"»ðŒ|É"V‰’W·öÓ6#s¶‹¦¾¶e*é%çìåÁÜHYGqamžÇD)šIE[õèÒôÁîH˜¤ç’Âì™H\7'kò©¶s8¢Ém\.KÄ^UÛô–³yžá©ÙúIîy‹½$hl{ò]#ÓƒÙ/åò`î×BIÐþ©à Ú>\AÛû½x8}½¸b¶O„b}âf¡áaúDˆÂ~€Ñg}¿€Œþ«§Wõó‰žf4~;*iD/$8½G!’(x üóús=BTZ-Þê ¨Ÿá­:†B8 Ç~qªjeE¹‚{S‚­(¤_Ào š’Ó ÉcÚê“pŽ¢¢þY'á:ÉqŽÂÇ Y¥À»©-Aá8|Þ³VdÚØ7)çJrÛŸÜf9·êMœ; yÚ½(á¾è>”Q_zÏ„‹™žIºÈC»zpLÂÁ²\¯O9¸Ôr°êM³7=Wü†”ÝÓ‹»sÅéµe‰o¤žÅë½U$“ò¼¼je[ýIÈ$î¹EõcV@MÅX*/NˆqЗÁ3´ß˜Ò>`ißlÓ^9Šùvmùì柇ÇÎG+RŸ¶\ŠÂºqÌ#Ók³Íß”2ßh™¯Î³&3Ø€Ó33S­Œ‚q,ȧõæ)d|VnÆo™‚øì\ñ['Óœ)ÆtÛ¤´Î¢ÖÛ§jUn¨J9uzñyc9âw¤ÖÙÖ‰œŸ'¦ùsÎx ª²N÷”®K×›®'1ËB¬uyÁƒùt.ÊÒyçÿAç]SHÙ¹)û0FIˆÅϵ\ªñú’¨E‘wìj.?†…žEI,&â’$Î<Ž¥Ï¤Ü)„pÙ´4JÑGÓ·¶¥µ~âjô„ÇçM¢6‰ºÑ|Udf꺇Ú{qŸàlÒYÄÛÏ{ ^¯oŽ# ß‘¬ˆÀ_åÑ8!Í^_Âk•ÁÝwŽ*ic;ŽÐ•¿ì$ʽÜ{–“B?ÏÅŠ“p3q…ç¬$V&°êˆÍÕ¹•6“üŸË¤ß wN•ã~”T‘ÉúQV.ª:޳ãœgÒz¨œ—º2Ô<„‡ ±šµÔ³öyÕ¨‘üsGQæ{ç%q~ë!JeŒ¢„(«“´úÆìzç”>„Ö¶eÁAým'Ð@빦ÕG lLâÂ.öï ¦ûï¶µÈ1ÆÐ›Ó^hêâ‚©Þ¶_fò½"Ÿ55« N:EÃ*PœcœtP9}¡¤™‹°‰ìœžszÓ ¡‚î¤_;:Añ„è0äØe%žØMN!¬Ü¶?žÈTâzh(è•cK{ˆâ4¶ï _=.P’«`©ï¨ŽúÖà_O¦–ø@q†ƒ´ÖýB>ŽC Ó'@qÉŽzd1¬&™ú„ Ã*ªG%ü˜ÏÁOõ°U›—k¯!Då—Ð>aK_ =XEMT^Amç Â+¨[Cýú¢ £‘$V{M*ðÿiò8Ä›+Þ²£tIZ·ËnO}Cä š’Hm BÛ¢oÀ©zÀÿnË€ |­ýôþ·Þ£ˆAüb)i PÞ»b™¸ÀHñ@¡¤Ë¼o¡â¤‡è¤>"FˆÆ·'ËÈØ2EäO ~°(m­t¸å̈ÇebüPK@u==PK7A+org/hsqldb/jdbc/JDBCSQLXML$Exceptions.classTYSÓPþnYÓ ´P\ˆZ Z÷­nP«EGëÆcÚ\0“˜Üºü¯ú‚ŽÎ8úÊ«¯þÇ“&¶™Ò2µy8wî¹ßùÎòåÞ­?_¿8ƒ’‚=ÈH˜QCV¬‚~ddÌùë ßœôMNÁ)œ–qFÆYçdœ—qÁ÷]”qIÆeWdä%\“p“aðªaâ:C_fæ CÁÖ9Èn¿,ZžÐ,ah°-†“™Ò†öZË™šµž{ôܵßh“çg¯÷ÊÌ•”n½­rÇÇçv—…V}±¢9| •Í0êÙ5·Ê[˜G]îÕLÑâ;šëñ%Í0¹Î0,\ÍòÖl÷å?OܲÅC®é>9ÃþLçBf£•—…kXë;”íó>u ðNê†Ë«â±£k‚/¼+ÙUMØî=[”kŽc»Â¯$aXK.ç:õ+x{±zjflûGó {[‹Y¨¦Î]JF¥<[)©‹÷WT#: u­Þô5|³˜À-,IXNà6Š Óah¹>àÑMØÃúÄ;†ê³8RñGœC2ÃRifªŠ¡zÁnãÃá0mHÞ„“ áq ƒZ«ë VÞ©f CºI°æ«DJ¸ËpÔv×sÏIc½’ÛÐ+ÕÜÅ…BŸn¨â1(ÑM¢hYÜ-˜šçqÚŽ4Õº_Ù öu¸ t}5Çáý':ÿsÛ•Ï·àƒD;âea.†±Ìv !ÆZ›, “Ú#O£]†ùLq{ð^ô¹váãUÁ$ÒôÆù_œÞ8ºI «M»$­ŒÖìg°Ou€Œqï¢àôFf"öJöbÿ†Ø*ô•’lëúW?c 5¸ )» y»f¿@ùHQô’•Z–pˆˆ÷Bï‚x¢âDÄj/Ä»» žì…x¨ â) ‰ÓuZ`W’ýJ ÁÈÇPß)L‡c”Û—œ ÿ’$ƒ$%‰ÄmO›Š@޵ üNF ÇÛ±l¥Æ†dZÓ¸ŠëHüPKÓæ…€ý¥PK7A/org/hsqldb/jdbc/JDBCSQLXML$SAX2DOMBuilder.classV w×þFÛÈÒ³Áb«I–,ƒš¥i‰Ó´ C•Íbc–,íx4¶òH™Ó}IÒ}KWh›Pº@[J¡Å…$М“Ÿ‘_‘“Ciï%y|àDGsï[îþî½ï½s÷õ·<‚·cØ -†IL1˜fPbp<†(w`3 t•*ƒçc؃Gff¼ÇIÌ18Åàs >ÇðE_bâ/Çñ|•G_cðu/òÚK ^–ñ –ûMž|KÆ·ãèÅwXôw™ð{<ú>ƒ°1?dð#ÞxEÆ£øI iüTÆÏeœ‘ñK¿’QËS+JŽIèRg CÓ­]em†„D¡bLeO>ªf‹•™¬»<(!îŽTŠš„ž*^#’h±¢Î:RVµì¹ëD#—+ªbUŒ†¢¹™rÖTæ²g™("O–ô’õ”„`*=.!”³ÆvÍ©ZÕ*UtSƯÉS³b ‘kR¾2YLÏ”ýêTz #:MK1<ò^Ó‹ ³{w¿¡M–憕jµ¤OIèKŽ+/(Ù²¢OeG-ƒ¯°-ËIXs‡™I…­É;œ÷¥Ãg¥ÙË-NÌZši«èµõY2¦L”5¯RÂQ¼ÉFOíö¨–ÅÇÔiÅPTK3L:ýÔÓ¹|>=.ã5 +JSzÅ`¥‡§KdMUQé U£¢j¦IüyÝ´ŒY•OäD©ZÕŠ»t«d’¶³˜òcÒÐEKfÎMkÊ›cœ¯Óšz¢±o:~ΓôRùÙM„¹¶’XÝF¾PÝæbj7 Û‰9] Â2ZÙ&Ù-¤.³.‘ZL–xƒ2Î üç~‹ß üžÁp^Æ?âÇñQÇða»À1 Œ3øþ,ð4ž‘qQà/¸$ðW\–qEào¼ów\˜gPÃUJ kØ-pûLÐ Ôñº€Š¢À³xNà3ø¬À L¼ Êóö„`ƒ¼‰·h³Ù¡1mθ‰=·ðýLöOüKàßøÀ‡ñ° ¶ü¨À¥7góèŽ#^k°V­è…­wZÑ‹eÍè-™½N»ÛÆÊ÷ȸ-!ÍüÓæóåâDöxqBÍîÚ™=P82\xˆÄ=2´oxçl©\Ô¨Etµ/ˆ¼®kF®¬˜¦f¶ø¸o⸦R¬m6/çØ³Ç1‡2Ʀ/U²vfròKØÆks6KU1Lª”ì~ódijÖPع&/Wø$X[D¼I-–ÜÈuסÝTšƒê)®k'¹à«p€ó~yív©YãJ¹T$K¹…RÇ8ß¹D ë,z’¡[èeo6ÈÝõKž=@a‰ØŽFG¼ü—"‰ƒäÆšKF=KVÒÛí'½5<¸Øê1/oR”5L»Þµº33PÇCAŒ°ú­ Ú[ùyéÔçÖ:¿ŽÍ 3ûÀRìôØjª%É®¥Ð<¶4jé°·¿ÙÝOrþ÷K\¡úDxåGÏ ŸòÛrÑÞñÏ38hoóá¦N£óÒG{¨+dn.™(º[ ¦7¡tù²+žz>Û}mzúµŽ¾+î>½}Ø£ vzMú±G®Ÿ&#<€ŸáÿPK8Q!f ´PK7ABorg/hsqldb/jdbc/JDBCSQLXML$SAX2XMLStreamWriter$QualifiedName.class•QËNÂ@=#…)_¨‰&,°>JØJL7šª!$Âv  )Ûjü-ÄÄ…àGïèÂDtA&¹sÎäÜ9÷ñþñú †âȧ‘@A¡¢ «:Ötl0d|>á”÷Ä †¼3âÜö¸?°[Q ýÁ Cbˆ¾|" eX®ê(1ZgZçÚ!•àãv #0—¾/‚†ÇÃP„ Ug ìaxï¹]{äv{öÕÅy£Õt(±üÇʬ.}2´+‹&Ï×>ÿ²Ç 5&®0ÆŠ,¶ ¤4 #ÉP_̲Ü|àžìKá~/ó‹›?þ·Ý‘èE:¶Ž3aˆUTÙ¥ÿÓ°GKMкcÈ©FåTW€iª>‰3:Y˜sÄv±î¢u0³^°dγŽfО/}†bžtËØ„šQœÐ:´OPKåÏÞù@YPK7A4org/hsqldb/jdbc/JDBCSQLXML$SAX2XMLStreamWriter.class­XûwWþ®^Y^Ŷű›´nãÖ²dGMZµMŠ£˜FFq;‰£”×ZZÛ¯WªvÕ8å åÙÊ£ ´@xHhb£êò,‡á¿áô´ÌìJ+ÉRN]àkvwîÜo¾™;3»ÇÿxãåWÁ߃¸º„Õ <ÐÛIcHÈ0„~~$H¢Ø–„’„Gƒq™Ÿ×X\añXQ|„ÅGøk>ÞOà“,>%áÓíèÁgX<ÎkŸeõç:ðy|ÅY|‰Å¼ú$‹/³øJv|•Ÿb_cÝ×™Ò7$<Íξɚo±æÛ|÷ Ï1‚gÙú»|™$<'á~(áG»ç&.¹p*=gUeu¾¨YjQ@N†ZLêŠiª¦@èLIѵEMÍM+«ª@Р‹YP²¼Ø•¾¤<ª$J–¦'Òši ´ÏiK†b•Šd;³my+=§õª}O]m_iàÑu7Ù$q‚ä$=€—V€ƒ± ˆØ&<™ xo ¡Mø3á¶ H[±øM®“™À{IvB¼‰ðHxHÂI[Âá0âxñ¶Ø:Úc7(#(h(†Ò›3ñ „¶®ÓBèBGQ‚gFÂûÚ‘¦)eúr1'+˜5Ì]ÎMgKð½è­Ï4ÓЫ€OÎO×þ*x|ÿ2º|Û9êcÜ^_ ¸‹X{Û†ãeìñqP¾2"G%ïÑ@$‘žÇ0+#ë^ÍîžQ›eoû ìcÑ[FŸÄÕ7ÿåì¾M —.û@FìM6Ìœ›Û«7wxè•ÑïsPþÉûíÀýµÀ¯á%7ðûx¼LH˜}ûI ño$^Ǫ‹{á·ëb¶ú7oÊÒYœ«¤ÿ-§ÿ@ílï­sߢbQÏc¾‚:‹6Ò‡ÝC.ã.¯ÞMôdbñá ,cÀƒy*Ÿiv5Rót÷Ô{Zl*Ÿ ÈTä Öñ¬.ûœeg(.’zÉ*W(Ç^dÆ|7w p˜†‹ ‘Çb…ï*î 3Â#æÐÖ©m‹Ã‚—8F0H!ðõ0GOãù°;3;è%K!¥$,w»aÐ>–Z„±ÖŠËw|ðr˜²šx†Ç³œ ß»Ã[µÉLÝ I{gåØàû8 þÀ¼ ¾ÿPKMëµgPK7A org/hsqldb/jdbc/JDBCSQLXML.class X”Çõ½aaàçGDÅsñˆÀ‚5‰£A9Tð@“˜eYaã²Köðj’6&iÚ&½“6¦MÏ´6MÚ¢V ¥ é¥é}¤÷}ßw›6Imì{óÿûï¿Ë¿‹­ßÇÌ?3ï½yïÍ»fÖÏ¿ô±§`¥¸WƒÇ0¦Á3çæ07G¸9*ñ˜yxœ/ãæ6nnçæ‰/—ø ŠðN t~‰wý2£…¿¾ªÁCø5n¾Î‡ò,ã×ðx?¯~3¿ÅÜ[ƒø|ü.÷ßËÇïsÿE&ò^þ!Ãþˆ‡?ææ'<ü©†?ãMOàÏä¼ðK^øýšç~ÃÃßòðw¯Ámø‰ÔàüC>þIÃ?ã_$þ•IÄüoÿ®Á=,Þ?4x/>ǘÿäæ_Ÿçþ‰/rÿï|¼ÈúûŸîKl61F¸$!4#‹“"‡eñŒ‹fD.7yÜÇkRƒwà ˆ|MMŠB)t)Šˆš˜&E1Ï–H1]ŠRM”‰R”K1Sƒ'Ä,)f+¢‚›9RÌå~žó¹_/JáÖà4ïR©Á÷‹h,Ó@,!ž˜“‡ÈIÄRq7Ë48+ª¤¨Î5ù£‰ZQ'ÅrR¡¨—b…WJ±¡¬«iïʽím]±ˆß;¸'ˆù#zk(䴽Ѩ?Š06v¶7ÇÁ>DŠUÚ¦£>ÿP,@a_xp³ß‹G¼´íïao}Ðê¯'ºP#Âti úý¡˜—ñ¶…#ýõGVùêi±ž6H ¬ŠIX;ýýh,r áÊìÞp8FóÞ¡Ét(D¯ØÔï‹Ç‘.äpÀçG¨6˜ÇÁz_8ä‹G"„Wß=@úèÛ7™„]裵@ìXwÄŠ GYY•ŠÂÑú£ƒÁúXb¡ÞB˜¥±äp³×GäH€ª©MHÂ/ŒÇ®iðF¢þƒçP \ï3æêÍ5-8ŽÚ÷Ç3 ׉x5þCt6 ”ñºý!u„ë/o­í¨wÆC!ooÐߏލÉ^ÃV<꘢·ûzëoéëõÕoÝØÜÒµ£¬nIªa^ž/Žúûp ú÷yc^±¿™t Åc†¡"”;“ Z“ÓD@Çc6°åö݃Þú¢Ï\6‹ù•<6xVÓN4$=/v< ÓV ÂÈŠ÷¾Vb:Ÿ†©ÓgôX4æT³GÈ­ŒÙ¼µP ¶!§ªz7‚«%ÜG³¹Uû›«wK±Z}¶ðJEUªo„}q¶çF^›]å(;/•%—v+¤Rž]èli]áxÄçWåU“}–çggWZœWjœÙs^:‰ag¸e fÚ~ó¾Ë.êŠy}‡Ú½CÝ|>*.^E-ëKk«3’ë`ÄO§VÜï5BÞȱ„±ÍªªÎ`•ÅÑtØÙ6Ø4,%ÂìÏäýþH¾ÔojŠ&£S@Íšh" ÌH¤Fè‚hD+ó@¨·«^儯êlö„°vmwCC6u“H®íQM­ÁHÂ/{sË3on‚dßœ•¿)=ITUeˆ¤i„_Nø“C8›¥3ßážÊD„™D§Õ)Ý,žšQxaQȘ Vÿ5RqjÕ¥dGNP>L#ì”×§ùÈVcþDXCØ}Yþí» Qs—T®æ¸J®ÌáXŠ«¥¸†Šcª‹©¦ª˜j`Ê7d†[ö†6ª”ßo}ºªªU>êO®ÓEŠ5R\K\e0ryŽ­ö”UÂ3)é©Ð7à÷j1s^‘í´rH¡r„ÄÈUµO…,´ÇJ) ”ihƒ’Ì>5•\/K Z|2†±¥Åc¡È Ƹ,êˆ>9 ™èÑTô"+¬ãRà cotH}¦…t¶›ó\H7Pým-Qí@yž”› •œ}QŠF)ÖJq•àª/Vµ7×ÜT(‰@“ÂJb2É„1CE¸}ûÄä\*Ê©Oa"±6_ŠuT…“ì|ú“ÅEþZ_PR¬§Â\‡¿ÁßulÆ7QCÃÿPƒ’*KbÈJ€b£ü››KŒG—˜åðoJœNÈQ%e½]ïäΉ¤aœ˜‘d˜ÞEn^¤€’°j'›y3ÌstÏÖE“hÖñjxN‡¿À×tø|2c•ÍD¡Zä |‹¾›&nZQÓq#µ¡®ãVœ¦c;–è¸ KÉÁ{ƒq²‡ºØ$6ëØA b'–ëØ‡³uø|[Š-º¸^´šÒ_FË|lÕáGðãL8“/Œ³M‡ïÁ÷¥hÓE;ÎGXsy!¾%:èGT8܉1Ñ!:uø|WÇy8_Û‘Líª)È¥ÒI\Ètø|SŠÌÓâı%³]‹7KŠ¢Á„i Ec^J;©4S@™Žpls8êsi ýýÞ`“ÏçFmœ}žÕq.Öá«dX%ºè:“r‡ˆý6š³Ò“@sâbQL¸£ñ¡¡p$æïkpë¢[ìÒÅn,%ºX-ÅkÐCñ?-Ù¨çE ÿÁ…¬î©}%á¼ó'¹Bj\_´¡ã¡ú-ûZ·ÛØtöR4µŠÅNÛôˆ½”Žt±Oì§Êc °áÝ€k(Ið…I‡_‘#â5¸F‡?Àuq£¸IH1´ïÍ”¨tøüžBPGØÍÙk¹.¼äI¢· \k°èŽSJrÓ&n¾½Þ݃ñhÌÝëw74wo<æDÝQ’1èùCDÅ—•ÀoÔÍA°Ïí õ1n(ì†Cýþˆ›\:з\ÇõäôÄKŸ¿€_긎cÀ5ðø-…óÀO¸·èðg†ºž¾ÄAFú+¯e=ÌŸ|iÁê*òŠu#.‘nvuÕ5uÑ@Š~] ˆBíÿr•ÔÅ-ìXsœjüÄ3Ë‚äáöB}»[›ö6›Q]A·shëÂò ‰ J3V*Ôq.v6d†Œ%A{´ÈðåÒ†ë!¶†vAEÎ\›ûQØ#ÆÙL.L1K qnÈ–£ §ÑÅ­ð‚."”¨D.’g³:%0NÀ;&â”´™ƒÃž$å!~ãˆDë3FQ iQŠ.¿I|Ó•÷¶·m:L1ÝLAâˆ8j‚ˆ᮸o Ý÷Ù„=&ާh6IÍ8U[X)Iëì½Åï£: ‘Åy¢É12Ò¯ÊQ¾' ñ RÐá°OIÚí¨;ŠÅØmâö,¶djý”ñ ÎÎnF èÌnF Ð ƒEÔÈ4#Óî/`Õ—ý"„°|òñoW}†Ü'î/×Å+°Žê.Vùº8!îâÀw·™ œO/á“óiƽjù 7Ùô›7èö(k‰ºW._AvW÷f*ô×ëâñÊDW'eËr?€’ 2K™°SZ¬OÌ,ŸB)“8]šÁþ8[nßÊÙH×~ÇSKÔ‡ §HE¶ 25ÚtDUTøˆyq¾‰¸bùtÐtXqvyº8¦¾d8REÒºzW:,Z0³3½¨ª·1{Ñî3ÞÌø¢ò§?§þÎ/ ê‰g¤Ô.òM*ÐCñ åüäóNOpmŽgט’ßìE*ÕN»èNA»wmjéìØØÅìYAù\¥Øl­jmÝ:°órêS2Óºâòê`º½†üGŒŠ“M¬ØÞì ùJ¼Ü®Ëz²(fL1Êúÿñ‘ƒƒt°WÁüXât8S½räy‡¨.")ê2ŸíäÊ–Ÿ”cá„KÎϺ‰z(v|FäSàWÇTW,°ŒÐ˜õU8Û Ó.Œ…­º‡Ì2R‡zËž‘öØ¢ÜÅx,é²^Ä—9¸”ó[ka(l{ÉDo%2Ý̵$k ³5è‚ê"uù jÉ·iõœ±-…Šû*–Ù~qè¶N¤ñ²ß·^YËŒD™f_%hS4Ê?Àg›#áAVää—Ï}i¦d›l¦T©â:hÊŒŠ/ƒó­‰åžFß)QYFÇ˯MÉsLš9bžq°U:Í%)o—Îñš}˜Ÿ£ìQUÕþ ÏÀS‘™a¼Æ¤–{I_¶ýFâÈ” ©‘MvvÅ[Ÿ_Ój4ÛOi A#^O¢ ó¶0U$OŒ˜0— ‡àGWëÙti…¦d7~•¶T‘ZClpŽ ?w¤m§Ðhý‚“Š—D¹Ã;èO‹é©¾âô“&TÂ3ð |JAãwê¿ϪþðMÕ ¾­úïÀwUÿ=ø>õs¸SãÁ‰ÆOè[ÀOéïgðsõMMê›ùʬÆtÓT=ÝUOhÕÿIí+øÊ©ú¿˜ã¿ªñzpñíðÍ~Â(®¬ÉQãœÓÀÿð9`À2È¡/YãÁQp_Q@ÿT ÿ2AgB®Õj<9ž§:× úyº‚F ]T3y=žQ£ï„ð‚#'N /:‚jé ÈïÓÂdšáB'ÂMh7ä)èÄ´Þ3EÌø´Q(ÎÀûL¼JÂË¡¾ÜÄ+a¼éµ£Pšñ%›Ns,ÖfÐé%zŽ =MmãÉL!#FY Ì Š¡‚,ˆÂD >—úÅJÓóNBi{ÆÓP~ \ô5³¦î̪©pƒÙL‘wYâg®D—„r”H_¹@}Þ%ZM›4Môý¥¹ÿÈWûÏ6¯èñÌ›? s*\μ#?嘸Ói†Ý%·fæ¦Vbj&àRÓœ*pýͧ¿m†ƒQ“ãž„\ˆzä…ôçVÈ9ì¹§eÙ¹2ûÎÅX’eçEmjÓLÈÓ±4Ë΋³ï\fyÔ*yç”.ƒ¥j²ˆ+’û' "H×vR3°œ&™ÔDˆAæX|‘eíIFjÓù } œITfáì T+UíI^2P©çà\3¾¶šÆ¶ú T_€:Wc‰¶Vk:5 ®qðô”h£P{êÆayÏœ¹î ר…ú³PMðÃvaW€zn7µÕ`ÚaÅXqJÇàʳ°âl«ƒU49LËy C1¬4iùwJ\kcX=&›¯3)Î;«/@ù\5WŸ…Õ6¢« ¢Å”Ü®IÝ)±2•è"\l2‰zÎÀš @‡zíYXs æ2ÅÆ‰É- ƒñÕ—ÃZÕÏ%¹¯„uæÞ H %›$.¥¿+èoY*UXmòÑ­æÖõ x 6œ¦h> ëÕÌÒqh¡H°±g6•n-jyË\? ­ ÖÖ'σ2Vé²”½jÐcîµ’æ\ÔÓ¡l­ñÔ> Û\0ÜQÇ4…$D›I'°Mbm¥:[öâÇ =ÝÜ\ü³™ úy•ÔÇ”÷t°÷ŒAgû8l'‘vtŒÃNê»Øæº{8ÎíjÈ=… yy|´u¹#°§ÖS7{mÓ<»Ï>&ÓßßWS‘ÇQÚæ“9°j vC#4ÁFè!wÒw›bÖ‚Ô.Á"#Lc½Ä¯”¸’ã÷ª‹ %®îx•ÜBC™"áÕVý‘.%JÂT|ðœƒ3Fÿª`za2ln4ôèâ×wƒ6r ÂÚ{œÜü¦6ÏyÈõ äó°kþ›Î; ½í;X¹ä¬¾rÚÕµ¬¥¼ÜŠ\¥Óè³ ÙÏŒƒ~5‡iHŽo9IãCjlLYÍÄo7X;Ü>¡ R? *ò&(ª\ …”½ :a')û^x+M}Ö™Uce eép2°2oô7D·Ö y:¬ëuªß «U$cä<Ô@”¡#§`F›ùQØ®>j'N«³™FÐnÕ/.†f©~!Õa - !g7±}=±-iËõÖ– ¦éÌfµž‡2C»1*7ÔnþÓǤ§[›9;ˆm½„ìµ*Êt"> r â)æW˜¢®&Ä8ü0#†²!6c‹Éy©Éy^ÍÜspÄPæþ½ÙðQEøX6›œ 7WòUsä sùzÇåãO˜gÜj?×ÑÖÌ/kKT¹në¡úðöá6»„¢ÀG¹; ÷°Öí>¼Õªk8/+YÇᎮ¦Fáå“Câ6«Y‘ [úŠ1¸Ó¾oݳlûnMß·Í*ÆšÍ;Ä"*OP½‹,†Ã([ÒaƈòÝL¹pJ‰Ú­bË&Ñ=,‘{^9Y¢Ž©/N—þf%sÂÔÄ@ÜK5Ì«NBÞ)ØRº1(àÂæÕÃöŠÊ Ï6÷šá2¸Ï6¾ŸÆ¯µ_7œH™¯§dIo „9oœ°,0òŠŠ‹r‹‹j-ÿ\hrø:âsæzl§ð^Äâ›NFDßü4èíT3p }pbrËåmG-…Û·Ô««älªP}%ÕÜ/£šû:®›cóA^„‰;(äíh‘¸Ó¬"–Ñß’\Gn»,nÿA}>õ·'¸Í#nßjq›—[ÊÊlœŠ• ¹ãð}œ¤,›ËIäaÊÆœaU2‘’M¶–'n·©ï¼dÍM“u)ëZKÖÝpx)A2_Jæ’¹Á”y™)÷’ÜK„!U~îVYR4%Š‚»Üਓ=–NNRÏuîÖ„Nî#™±trß”'8ïàlúΗJ¥ïú?s/ ¶÷ò³'Á8ˆm>Ì'É1;°Á… ¹Ø@åλ IÀƒ$ÓL2~×'à½=9eðh×¼ïL÷¤Ltœ‚²B¢gÙ\ÆÉžjȳ‘¬#ÜÇzr*òõƒOÃkICW§c;õ#ð!ûéIƒ" èå”ëçS=°™ôÅ}¼n t; :üN¸›æ¹¿Wý¤GîßNzåþQxBõ±ôÚ%—ˆ¬eû$î—xƒÄ%ÞÄVq@Îl§9V9•n7K²¯ì2F½ô·Œþ–ÒŸÂëg ê³î[o0£ÔauײîºeðádÌ2bÔv[ úŤ‡lãaŸ¶ÏÐø¬müQ+f˳ærÈš³¨Läߦ3Å,Uj[¿=añwOLnUýÈ1kÏÿaæW’™_9µ™3·-nï4Ë®5¯*âX¼Ž´×Ô> ƒTeÖ2ƒ“[%+\¨þ b“ûZb“û•›³ oqØ¿5CG,Ÿ5ˆ?¡ÎÓÄâ¨ÅâélêDŠcþdû—«Â¥tlJÉR‘¦Ç¹|§þã#ð ‡à9YéWQÀܳªg#xH´À$å_¢;+á&‰·°wšlñ,r0!2]ßr)£SŽíŠYSâqž"¶Ç€ä3nO7¸Èö5óû¡dΪ[Ü'I)K­ô)ŽA|ß0‹Ë,g hm&ÍuÔ©pâ¼Ä-©ª€TrzIÜ(•€…îcJeà8…îï¢0Äý«•JÀë) qÿ …!C•×@ÑK@éePbHbX*›I[› ¥öšJõQÀTòÍôçu¶ð!«Ê/5ï$y\0ê¡|¼ÕZߨâËÌÒOŸ…&ÜVú™1øì6u 8 Œ;@”Ày“Í~q,჌p¥ƒ/¿”æÐuûø)fŒú/ÑÙ™ú¯€þ_PKÍÉìØr#:PK7A#org/hsqldb/jdbc/JDBCSavepoint.classSmOÓ`=OÇh7ËÛ˜ ¢Ðm`}Q@ecêp€¦ˆ!Ænkf±´utÄ£?À˜È šÈG”zŸ² ]²{Ÿ´÷žsï9}~ýþöÀ-dÈ"!¡;ŒQŒI¸B'Tnðp3L5·EÜ #ÄËÆyžàá.“¼ë‡˜”p_”ˆi3"0fešl}Ã`ˆd×õ-]µt»¨j^É´‹S á¼cÛFÞ3›a 딊êÛÍ÷V!§®ryu~.™JÕ*¨¾yÚ´MÐÇ•“pÿj­Ð0)§@ôhžž· »ËzÎ2ü©ŠxD¥?ä ——oŠ˜eRþµµhxš¾e¸Ži{Ú; Ähóö£}¢J¬‘’çœeô")"%ci—ë#£=2. KÆE\¢9e<ÆCW=R²lZ£ÄС­jËé…5mv%ý|)³¸¼&ã žò‘GLÆ<ž‘ž¯¹93dÔ†¾F›Öæ§ué–rë´>™ê?¢µqÝÁX ýg‹ÈpþèE¶æ/$é­o陃l—-k¶T,oœ7Ñà›¨ª]ºñ Õ2\¦Ø áZ1 bPÄÐ}¢MTpÕ'¹V%yEå‰Iº‰Ghuáȹ äøW4WÐRA+çM£l㔂OI|Gè†1R¥¦Ì(wp,á#$ž?ï¡m¿†k9Ö­ Ö°û“ßÜ>»›îEÞ­V»‡ª;ÑÆí´U¤ã`µ ?G(Ð~Û¾)ø PKÛÑïn£JPK7A#org/hsqldb/jdbc/JDBCStatement.class xåõý{ÍfwB² !‰B¸6» P”P „‰R’¶t²; ƒ›03‚=l­mí]{±ÅR-­µ-T²‰¢`/¬ö¾Okíií}·ÖJßÛ™Ù]È÷í?ó¿ÿ]ÿ»'O¾øðYXɶ`7|˜–ã¸|$÷Â}ôöQ‚ ·ÑòqZî'Ø'ð|’¶Ÿ¢åÓ´œ¤å-Ÿ À8NË}„ü ÁNÅ4½eh™ À,žqÌϳ Dez 2žg•lp;ϪVMx5ôVËü›Ë³:âY= q¬góX#Ïæ³&ž5³ òB§`ºðì2v9Ï 2l!©ÐŠ ²El1Ç–ðpˆ-åÙ2ØÏ`žÅª[ña–rž…YÏ"p˜Þ¢¬ÒšlKa2ÏÕTbådz,K%°l ðÒt š n 7Ü SX…~Þ˜–’ TŽÒå9iDˆ‹] xÖźiY˳u¤Ãzv-Ç®ãÙ˜âÙF2t9c-›Ù¼“S0š™É³ëÙVºDŒgÛè:¨£å’ëHíOÇD*Õ Ëžo¨iÖæOž°ÚY‡}ÄÚ L«cBYd¤„ iTÐd¥û%ê¿3·gà¢æW²7‹!Ù|kê`£ítÛƒÉv†=5›Eún“  ؆3Uû¨Éâ–ʾàb鎵IÉÓãÄøM¹ XWH{ƒ&aó®Å^Þ7²£AÜ Œ¦u“5ôpÓD(ËM ­P+©ÅCÈ6(YÎ hûÓAµÞ­}ürÇûÚúHAG®’RBRJäïR1biЊŠzbh’ˆh-å+R-¶ÃÌùNo_gœõÇ9™4ûÎeåÝ„:aû&D¼?ƒ¥¥GK+)%Î 1±YŸ öˆhhïØŒþ*‚4—XÂ7lÇ.èH鯩„ú·C…£æàÍN*ÙqѨE¹ÐæP¤as•ÂBN¡M'Ñ6-VÑýúÕG…ªJl*sÌ`u¸ô=Ëš ý9"+c»dUÛœ'ykmg°ÊÆÜVø»Ëäf€¢]W•U®$=9GœÔhºmsì$~)¥Ý($Ó¨qP$Q9#{ÃCÙ_™ò¥”*4Q8…Az8‡EÛ¬æúKÄ!&]bÈ:BZ26Zþ;©àê>IÕË^.ÇlÓ›Šu ïã’2ÄèbÝø¹h-ƒï×äœMü4KÓ¬…]ÝfD}.ÃH/aÝ’Ô ¦8â4¹E‘ǰÃb¦A¦—&3QƒR*ŽOÐ.”/î1+¼…†UE±O1YKÒŽ#ý•ãüc¢&èÆn-¥½ÞóÖ‹Ž–Žç¶~Ü]:.®)M*&GúL‚…ø ¿\ÐÀhªÁu9Â÷ÂK¾wóÁ‡os"Q¯—±`‘ ¸Ný âσ”CHñRx™AÑbPÔD¢ƒâ4¸3ày ˆèå°ß êÆ'©°q½Sà9…R|6 -~ZÜ´TD<Óà=…˜ ^«˜ßÆR€aƒe-Bˆ¥YÜ…ÂÄ!a`¶âŽ4®$̦»›…à9› Þ&C4e„ D‰ªóÅw1Å,Ã'‰©µŠ‰4M_RƒQ8`×ä¬,$«s{óRÛgaé¹üV¯ØË¦ Ho³>§Cš{Û‘ç#îÕž§ãìqX€€¶Ç Òåíy½î•šª½ï6;qá鎳MÇ` Òv<üX¾¯c:‰WG®ØKã]¬Ð+kչޓxíVè‚u°Ä°H+ø.àÎÅÁ­hC^_Õô"Ôppo`ÏâЛÁÞo*cþâ|€Û-ièʦaÓ \Y-ov(¸Ê©)¾Å@Œ¡»Üø\Õì9sš½Ç ¢võ,\}›d³¥I›Ü“¯FTÕó ¼Õpµ!`aûy𷟽 ù_cð¯µta“]…·€ÝÛ.]µ_»CðvƒÝê»âë»­×_“g‡Ñ_]ÀíUÎm»ëšòʽóØYïZ–ݻ̊SgÄ„_¯6]Åñs‡YðóñƒcO1â»K7ÿîâöö“ma´w÷ÿ÷ÂûðÒºotÖ #˜¸k§P—“g`ݾX_{m®Cà† l$ƒX}°p{?¾¹àø~'L\Û ®¡èy¨¢=Ø4åÔ`çÚ¬Îë.\ÂÝ!^+BZŠýssÄ—Ç2·…†Á(͆z»~¶Fš§¡A7Œ‹þƒj˜ã ‡Ï{fés¨ëQߨû4ã2‡|×Òˆ-1K­°WÐ`—¯ÑgTNÇä]3…f=Û¨ÌeuÓï4lŸÓP5XÇëõÞƒçع÷Þy5ìÄÉ •!Åä: 3y†É4Ÿ2~hÐù”ep–Á<“Å`„­œóãœH´ìØç$vIðeÔѨ~Þ$“ÊN +1K]*ísGʘ³Vjs$muÒqe¾a‡Ýµ™,†¡)¡jPhÂP-‘œãȆIg…a¥ù-sô{Fèªr@%ŸÑyF 1bB³VLkí¢Iå(€š—¶Z¹¡ëÖQÕÐì2ÕE†Õsj;iޏlR sa}D³„AážÆ…x*#tލn¾ÀZ‚U§:µáHOLé÷E£Jw¼?ªÄú"q TmÓR5눚š>I²CŠÒ[ ÊWEª3{#—ã Õ1Ö+±XwOg÷þÏììì]ª˜rL ÷Å•þý{;#Jsÿ£ £J¼/ÚÝ@éV¢{ãJGÿ!åxŒ¬“r!¯dwJKY{$x‚Hð†õ$u¿8Á“Fó¤Œ&D–S4}x‡Ê˜‰3scX³ÔÄ™.5WÒ$]C]=­™^Ý´”Q‘±„ïúð:(¬¾l’ºbWÖvG';¯KõÁóÉï)«wé†px¦­N;à v2ª£Û‹4½ÊÎÂat¨–J°9=ZXÏdÓÂiÝ2w¯ò¹2!"#ˆ 26¡MÆfcƒïËøÊØˆÉèfÁ'ùúcÛ±…r–ñ ³·a‹Œv;ñ„ŒOñ™ŒÏ|£2¾ÄWT_ã[Yj ßʸÌäaVÿ'eaÑÇð¸Œ8%aõ}Ç_Æ÷øƒ¿"cëŒc‹„æÅt¨w–ÈÐríS¹Ó»îiUlï¦ §²æ/In$4,µýTËEöŠ–£ÐŸ•JSó‰“gv%53²¨K€5÷Êh2SùëHªÑr  ©)mþ%j¤i»ÏCVÏ#«¥SÚ™=]Ä/dy=H3—åÖàÒÖ6.ñàTšÂê£ó/SCpQI^Í€šLD²ú~.I¥œÌ»&¨%)ÓÙ‚ÒŒ°TçØ²¤.W†¢¼|ПdÑû¶kéHçR+2YëBÁš£‰~“ëé‰\§y=éäå­µ1m¨[ÑfãM.ÞìbZLouñ6?âÞowéG]LKhã.¦¶ñ.W~·ÁÁì!,á)~Ù)ºìÍ£÷Σ;ˆVòèýDÈ£Ÿ!º³ÀÞÁödÂôh§‹N-Ä“ׇn@ y§PòLÁªöü3ïu;Îf~»HŽå+ø×ÄŸsÕc'$¡—ðáœP¯ktghÅcðW{ÿ¾‰’[Dù&Q:†ÊÐ4ʪ‹;]¦ß¹(¿B’óºí%J°žÊÚÚ~b9?æÿÞ§Q’¦Èö$ªnSèL˜ˆ´N£zIB5|^X6Ž–Ö›¨í¢ëÀm”‡ÚHt‚0‘mÓ¨›˜ý‹åŠÇ‰Õ:…ú‰Ù[¶^­Ë¨œ˜ý™%ã³?±:/Ÿ˜½Ìê3v>>N£a>å(«½ƒ2âwô¡ï_øŠª5Õ 2£'ÜÍl'q¸‚ÍT©ìb†²#4•c¤9a׌¨UWsJà©óì—<†ã®ÁFÂE„®ÁÆ×§±õÚ=m<“®NÛÆ’w«¯."yÊ•ÌÀg[?2îm{®†œ«§PÅgPµªøŠyã4ÖØþÔšB¿aíq»nÌàoM7ÐLÞ«žùi*Vñl.Å(Ááî&ý–ÛO û™Dåm¢~ÁC<sž$æó7ç©…å¯å\yQTY±ÀÓs¹¹;àf«“V.£…~%¶iO¤Äàt¯/i^BÎ|µÛüb®fážIx>¯A’Û ôÜÓ ÿPK{˜h GÈ PK7Aorg/hsqldb/jdbc/Util.class¥V[WWþ†±@rS‹­ÚHÄ Øâµ- ÖT”JŠÖ¶Ãà8'¯½ßï÷›ö~õÕ¾«¬Õ¾tõ¡¿¡oý}èêÞ“I˜`d5kÍ9göù¾oïsfŸ}òç¿¿ü  7dìŤŒ“8ÅÍcÜœ–±ËxOr£rsš›)ÓHð¬Æ£3¼d8\†•%ª™ŒŽñ"Ô)C+#ÕŽ•ž¬ó+ÓœÀöpÌç îØº™,£Þ_ ¾ÊÛñ2!î ÙS>Å‘©YmÚ)#§˜–ϤR–íh Öpih 'R Õá-#sÎd~Æ0úídæœf:‘ðjö£N7/¨†žXâ­Œ3rf”ØÚ’±uÚ2MZ‘ +­%|#“ì„j›äH`g¹l+ˆÂ£¸;¶ÊÐ{ÛNü¬x‘¹Õ[e,kãŽ:}ö¨šc ‚}Ø/á-oãïróÞW0€ (ø-qó1>‘ð©‚Ïp§ytGyô97_„ý~iª“±µc¾|ɇž¿dú@óòU dt#¡Ù ¾Â×TaövpÊ(ø†ãÀCE¾ ¥’ßzÌ2ÇlÕL딃ùl(ðÿ­@E÷n ß)ø?ˆ^?ò `+©üD*==”s~ÒAÊy_ÎUôôR®ù1ÓÑ’¶î\&Õ´c«ºéŒë–¡È3q·@W!1{2ÎŒeëW\B<¥MûI»(œŠÞ>¦÷ tøéñ˦£^r s£»ØªUwµ£–aLQÒøñݤÛT4ÇB¾dŸMLMGO8º!P¿¼Æ´”*ÂtJ“šsTK§Õ$Ý&¡\ñg¾@-axIŽêH¡7w]Ùˆ®£X¡‡‚ƒG'=оgå²üxfÊÿê‹g=…PòÊXç›Ó8ˆ¨w÷Ui¹;0VV Zü^(ÃØè–õ2€CÅëT‰r_F(|{•ˆoçj5•ÒLººJ—õ[:ù8Vnç[JÔ×ñ‚ʡ崣ÚNzBwf(%‹y=Iê“9ðÊê8ý—ÚCòø×ÁÕ“ÚôÖ@½ ¾ªsâgp?@…;½kÜé†Î9TÐSIÏšÎTýæB¤‡}.©ß#ux¤«é‘è ÐSS„×Ê5Ù‹¥¤³›.‰¡}ЊåÐHtȃ†¼Ú / 6‡8´"‚J¶‡h"g쮦|(Ãd*©—]Èö¬]ÂÄn‘i_Ày™‚<ìAšia,S+ÚÚI¤Î:‚a´UnÀm UQÈGQ?™Ûˆ†6Ï£!Ë àhžÓè2©¡æ÷³€+7ò€Fò^+=¯âÆ"'çÝÜ\G͚В}¤¼(Fò{_‘Ý{tú$ޝ$q|E‰Ñ"UÍ>‰8Æ<@‡·¡¡E´Nú³vm9ôNä?cv#jÑ>Içfýd …„ãLe;[r-Wç«3嫳üPK¨urPK9Aorg/hsqldb/jdbc/pool/PKPK8A/org/hsqldb/jdbc/pool/JDBCPooledConnection.class•U]WUÝ7™00P L ”H©ù F«ö+m­M©¥†¦€©Vd®ip:ÁÉÀª>û'|õ¥/>èZ&¬ÊZêSü.ÿ‡kùqÎdš„AaqÏ™{ÏÝûžsö½üö÷O?8òNᚊëýx[C7T¼ÃS75„eï{óìÝÖÅ»<ÜQ± !Œ»M¿Ç39UÜ;†,ñÚ2{+¼ù}(jy÷9쪊5ë*>°*5WÚÒ© œÎUrúQí Ë,¦­J1½ä˜Ò‘æ£ö(/ÝŒ€VªÚ¶,¹•ª-0ݾaKé»·nf³­ŠܪI'Û±G­ÔìÕšÂeév®ŽÇ¹ cÛHfz’­š´)œwÒç‹Ææ}£hÑ·6ÿ¤$79†Ž*YUFÆk' ÓlCÌoKÛÍù© œ{Ð1ÃÞ‡˜ÓqÓ:>ÂCã!•üÐÎñÎOt\âMŸÂÐQDI vd§u¼“7Ó1?c/ÅÌQÿ{ÞDwB›ÕªåeµLŽ4;Õ=äUË2ìrz©¸A³Ô¬öÙöǧz«K&¿ï~Þu*vÙkùò‘íAþÑc‚CXl!F_ÀŽôg¬£ÿØÄ¿£/¿Šþâxücq¸ › rSÍÜ,åö‘ÕW¡X¿I¨ã+Øp?“Ð&¤•˜™ðl\"Ç{B¦1Þ„´0FöIb#QØTL¯`ó ÆYƒ7&V‘(&¶okÛV0:TrlïthtîŽNÇ09F¾`gÓ×M`øPK]+ÕTUPK8A+org/hsqldb/jdbc/pool/JDBCXAConnection.classSoOÓ@ÿëVV;t àiËô_BLtøB2u‚Îw·®™Å¦­m1û*~ H$K\¢ïýPÆçº¹ §ƒ&}îÚûýyîyî~þúöÀ&i˜Ã-·5Ì`9J2¬¨XEYCwT¬É_w5ä±.ᆠS…¥bƒAëˆ×NF¶Ã°V ¢6ÿòZM~ÐjÚ< ïî<­¾{ò¶ÅÛv}7y̰kLcìˆDÔûœ ˜DTßwìÄ ü-sŸA©-J¢Ðv’‘CÙ0kâ³èð$~,Rï~*%íYÇvB¹÷%Fâ K N ð1WBÖa|!Â7¢é‘YÖö‚˜ÆŒaîë˜G…üÏQ ]Ðq E÷pŸáÊЮþª6L¡8r/¹~é0N©œ¡2ÅeÄy‰0t"ðP7uÜÀMjÜ¹Ø æq/iâ´Æ±‹ý¢Ë=œ)O6ýÝTÝø¹¿'kÉÞS=Œ~<á·y=‰\¿¢4{L¸t–.C0õÀ ÏÃ4ИÞÙûÀ Ýœ90\¤²ÁšS¿)^¦¯ed‘¡qÁªtÁ¬f4Ëœ@9†|h÷X¤Û)ÁEú’BYë+”£tyi ˜#¯«¸6n“ª®0û…ryµ‹Ù–r‚lù†”°(h]\8J}®SÌ€Ç4™< æ]èÇ™ã7PK…¶5dSPK8A2org/hsqldb/jdbc/pool/JDBCXAConnectionWrapper.classSíNA=S²U@J•/‹ˆ.[p¿-’@%SŒ åß´´‹ËNÝ*¯â[H¢4ÑDÿûPÆ;¥B¥-°Éž¹³{î™›sïüþóý'€9,èÔ~ÜÔpKƒ¥aZƒ­!¥aFìÛpz(㎎îF1×{b¸Ń(2{ü­ån SYRøÑ+äœíB.ôœ—Ï—2ïÿÑÒ ±P¨Å]%3rgÇU ÖÖô-Y cy//ÊÊ•~ÈЕ¯s:,Mé¤çåxþCÂÊnó wè4gWDYº¾Jk’IòG_†¬éVL«®àq¿è¬©Àõ‹é6ÔI®Üy^¶Jë@×¾¢Ïìšw}W-0Hë\&œFÊHßµsšišÑð_=Záž[àJ¼’jÓU%×o¨”Ì^Sä×*/¯óœ'LL⪉AÄM\ÑÑð!Œ˜؆q×41GQ<6ñOM ಉ4æâÇþ¼ÉuŠavU¨’,$Ë,¹9W‰BòS­˜$O=™ã^R—¥åŸ1̜˅̀—Ë"`?Ý †×ÍæŸ0ìŒÿË᫬*á‹ æîä9ºy8Ñ…LžYˆÖN:ô¢fÏM£iß"¯[ èY×G—`ˆèÆPÔC1µ”öC´¢5B«aWÁì‘*"ûÐO‚ÞNbÆè¥Þ×ÙqÚ1­QcWÑÑLnKîlEiYGªŠ Ílº6Ò]_ZÇÛIG›Ù4Åí én.d×ëì1tÐW ßž©¢'ePbêzO&Eô]ª'Ù”¤«Û_Ñ{ó3b?{?p±ŠK¿ökͺAH¤ÁüPKs„qt˜PK8A+org/hsqldb/jdbc/pool/JDBCXADataSource.classVéWWÿ=œ\ZëB ÀTí¢bµ°`‘ ‹ÖÚ!Ã`˜‰3D»ïûbw»ÚUÛÚŠVJ]ºé9ýÚ¯ý[´÷MLHàsò–ûîýÝûîöæŸ[—¯X›¹4ìâC»»Ñ! ( Ó‹ìñ¢ Ýü¤Ç‹^ìå«}^ñb?å§š‡cx\À^T ž‡'ñžð ?~6«ñžç /ðáE>¼$àe¯xUÀk^ðC®¡˜zÜ)&Ã’݈Hýæáh¸OŠª}R“lö·Ê±:†‚ˆbõêuMSB–ªk å¾Ê–yH–ˆ_rž»»^+ ÞÆáã4SÀ› [}¶ˆ•µˆ´ U‹ÔeRfÁÍZrè™Ô)÷EIHfu(CÑBŠÓ&M$(iò¬NÀ[ yr8Ü‘º/Ãv_ŠÙ2dÍ”mÒ°,õ¨á:§'Â}!)¦ëQigÃöúžÀB]eÃü-ª¦Z[\>¾]`(ƒú2¥$0‹’Ê9iI:¿ÝPb²¡„IŽ"µÜW¹of\oSvÐumï$aD¼ƒã"ÞÅ{Þñ>dX1]=×ìŒñšYì›â± øXÄ |""Šã>ñ>¡q¥›A&}!âKœñ¾N×&k9p-Çl-9h»ƒî£GJ³GSÀ7"¾Åw¾q §¹?PøÓ¸“ÙD2pØ`ð„ ¾O6É?&%~q?S²ÆMÅñ NWL6Í#º¦ÜŠêUëT=n‰ÐqVÀˆˆs8/b#6‰ø8ÌCdföºq †Usˆ²ˆQŒ ¸$â2Ƴ‹+â7\qר^gÊבñ;Ίøƒgx,þÄ_"þÆÙã:†ÕÙdpPלl¥Îzu,²k[Õ¥ b¨rT=–¬ÚòìQM;ä`™šJl@~ÜÝ2Ù\–¥!¶Ù“ãxñ4w6[Š!S†QÕÆ(CQf¢ª Mfx»¡Ç¨êJ“lqKJœ¤–ª˜ÄZžÍO †:¤Š|ªBgQm›± NN6³”+]p§o¶Æ1å¯Ì.–^àv[4gYAٯţр‰*šÅPæsãô=™³púu¨+*‡ãr”\Vâ¼ì®¾R\W¹7=ÁÃÐ ©‘ 9Jr^îkNkM49•ŠÎ=ÃßÌÌs²0~ˆG±\ÀÉvšº+i ë,ZY»ÂÐ÷+i›¾ßÛÔî+n·5&ˆ&nÓö§œÓ¿©§§3»WÒ °0çp/wîܹßÌ|3wùÏÿÞ{ÀI¼¿ ÝÈñp3Œ¼ ;‚^d,E0ˆ[2–y^aágxø,Ÿ‹àóøB_Œ`Vd|‰ç/óð¾!¯±â«2^“ñõ¾o†ñzO{›ßâÍo³•ïðò»2¾&Ÿ‡ð‘Êø‘Œ‡ñVú)?cùÏðn‡ñ‹Žá—låM¿âí;¼}WƯyþ ïü6Œß…ñ{ ‘´•Íêiǰ²ÔI+?]°oš™TôF&•Ž^-kœ’Ðjåy#«™±‚cZ‹‹†3eet ÒU Ms±k‰d,9~->OÆc“$ŽûÅ4Î&ÇÇ$ì.‹Æ§ÇX°·,˜™Ÿ‰ÍVËÆâ‰™‹ –ÕÛŽæÐuʲ6¦9ZÂ*äÓ´ìÞ‚ð˜X–)Kç¦ ¦©’¿ ¦ð–‚1ŒK8ž\ÐóºjØjÖRMcIW}&TJªJue«•¤(¸‡?Hž Ý,[óÎ:¤§9ªfÛVÚ ‚ʨ\‘›«VêyÂæœbôÁGŒ`4Œ?*øÞ¦ZfW¢¦–&œ¼‘)f†ÓØE`U?çÕÍnÒ ŒeHUÜÇŸyø‹‚¿â‚$.)8Ë1:åË#£6²ª¦žÈ‘]u›”zkœ:!D¤’×ot›Ü‘p6æ8úbŽµÔŒå;éÕ‘wÔ©¾ã"X™ cUÁ ˜#J¹R’£‰&Ë Rð"åå!ÞVpŸ°?žu{”?ˆ.TgXócR°†K. |zBè•#¡ôs3$P¹¾/è…¼a;FZ3Íö#gê|^4ì¼øâ4k.êYV^áªïªÑ¢*̹ˆ)¼¬à¬‡QT°ÁñØï;|ž&_HþÆ|ïIÜ)÷ìR)Öž.æ9¨×ùš¡j8â¼£¦tJÜfâjUw)x„ Ç?èi¬Ðó¢Ëf ‡vhd”r¯wùYíÖrˆø¥™ö&Ï®ÛþŽ>Qï§æGÙ®\«Õ*k='åÖKд\ÎíýÛaß"Ezj“~É•ú²cy" -=[I£³vW¤o“¼¾H¾Ïzì(< ݶ]íCÕ½YÈãÄæüuÍõ½½Æ64óŸ"-m^÷^ðAC ·ÍïVí·‡Ÿ?Ö-“©x2R#•O”ÉÞË8L”ƒðaDPÇ—>Pë¸uÐ,svçÓb>#æ³b>çÎàÇÆ=GÍÚ]ÓûAã>²ûqLÐxžVÝ´/ÑÜÔ÷¤‡¨»‹pð‚û$“§±u»ÏI¤FíF>4Iëu4ö€ÆG\in þŸd"T„YÐÏ’"äÛB¸‹…«>ËÝM-d ’(@¿S˜ö ÐÜÞ·HßC4¬Cê“Öê;¶¥¯«ð~¨K‰C{ifoêéâÆî¦D-|Và>O÷ð·þs¼Ý_ÄîéÐÉÐaÏ• 45ï-¢™6ž*¢…±,b_° é¿è #Q…™Þ+aߢ5cžlm^@[ï ßÛØ^ûí²üŽï‘SŠ8pMS,‹xÞ÷@}r^ /•é4$ètÔwy9>GK¨dƒŒ¨²øI¼,,¶ºk âšx–M¸.ûµ?…kB{f¾¿£ÿßè¾úÀ}—ÿBw=om)ˆ»öREø}š06A2æÀ@‰cSÇjsŒ’Ý[1¾=ÅReÏR"Vç¼0©Ê‘G£¾wÑ/ÑG_Û$…¬•BÆ tါâ‰ÈjÞPÑEÿÇ–n´L‡‘~ªêæ Qû¹’{³ÌŽñ܃-½^ÎèÎAˆn ÂñêŒ> „ùY„㛸â  âå¤p¼ª–ZÐŽÎ27ÙéÍ¥$a†Hu;éF¹ŠÞU´âáj¸SªöŽÍK}ò¤Û'«Û¨çÁ‡ÖÑŶ)2n!Je¯ºûŠxžfd’Ú,C­Ï¿&̲vÑ+ÒyMÍ‘õpQ‘ÃÖŒèhФÓ’t"I­´øÂVÆ|È(7Ê+!rS挈mTAwÄGœ|Lm·Î®!ƒÃßs¶#O(éqQÆ'ø”Þë\kìéç¢@§¿IUb¯Œ¼·Ø&â3Ÿã _ÊøŠXS.po>®¦ùm nÓš3’©ÐQEKè "¾–ñ ¾å…'c?oõ{Nð~/á2C³ž™ ÍeO¥±Ð|"¥u=ì ¸òs½¥¼kððÔU}™Œ²H¸qøc„YÑg¢m‚£3ÌAçTÒiU£'n÷­‡ÌzY³¦&›JˆØÐ[]ö„5Cå«4ôj¾QïFçé¤×´iªAUcg_"‘Q³Y &@èYj±¾„ðRd12Ônd·¾ª¬ÚØbÖP¨äx.“Q5#’\PG’©T2k¢xˆOjˆOJä«CÝÆ>Õ¸ž^dl°á L4ll¡o´hOè|9À?´&yGÑN‹BÔÅ1fò¦½¯gè$Ù*I¦-!úYª‰3âŽÀo`×Í4ŒïÏnÛ¢»{C·PrÈŠîVºÐN¼6°{ i ,о[`ë„_‹Ñ»WKI@0“P2Ç ¸Å%8î1Òs¼¾é§u[â3&¡d²/™E9¯›—ìá5‚ýC›Âè‹¡¿xã4ÕGÿ9ÐüÒtÿ€Äogí¿£‚á'´ñ[Hq1Pyuü Òå¢.Ú¯Á.\Ê·TAx„{ØCÓH«oÝF­ æ4þºƒªhµ +Ø4ô<· w`ÕËðzj¸FwÞ#ÕSKÊq¡§Ù4\ÅçÍ;ªñä|o‹Û}A·o™ ØÌ×Y.ÚØµ'·ƒž:+\0Ó×—Ó ”~çkÓ»¬ôf:a}ºûAOƒé^FãÕþ›àü!ûØ#t°¿Q÷^[¹HÜ¿úÚõ4{þ‘o¢É>} MÄ-ü¹ø÷Y1ê0MŒc"Än¢ù´вŒço¡ùšŠw¥¨à¾‰Ú…HÔAN{„\yƒ‰p£/ëa®C†p°˜ý¢‚ø½;h°e/ðROc/5õr§Ý½ç®´ËaRg¯ìD¡Á!ˆ¼Ê%§) ’Wrþ ­Áá•Äéæj†ô¥HƒsÒì–Îôp·[šn)ûËZ ôšò´×¾&¢¬zíÓi¿(Ñè/ßA[Ôãkp48Wà/¿¶'´PLÄ0cDG¬_šàC¤é;äF‹­{ͱ‚bibßÚGüPKúËf¸Åþ PK8Aorg/hsqldb/jdbcDriver.class;õo×>#..fvvvNF6›Ì¼Ì;Ff Í0Fçü”TVFÑü¢týŒâœ”$ý¬”¤d—¢Ì²Ô"F)4q}/'gˆ$ƒ"Ðt`B 1@’ ÈóXµ¶30n+`PKöÁvu’PK9Aorg/hsqldb/lib/PKPK8A(org/hsqldb/lib/AppendableException.classSÙRA=…É2Dˆlj‚ˆD¢‚+E@\‚ êƒ iÂà8‰3Â7ø¾øê+®ˆVY>i•àè›U”z{°ʚªÛ=÷ž{îÚß~øà8î†PcAÔḆ®¼èVâD'q*ŒÓ8£ÄY =JRÀsêÖ«á|•èVÀ Ф[‰>%.*ÑÀ@ƒ¸¤á²†+ Uް nŽ Û1 Ö­¡6ÌPÙ_°É-9ÆÍ9áÿYûãíôý|†Á“Î2DÓ³ü1OšÜÊ'³Ò6¬|Cˆ‹ÂÊñ¼pˆ¶„˜“†™LŽ${0kä-.çlÁÐZfNm'ìU”y!3Âqˆ“¡¦½c§°¾þBެ•Yɧdxq”Oš‚C}Ó0D†RZë4µíÛY:Æ*R†eÈ^o»úmØ ± O¯‹ŒíÀðOp 5eºÄ:¢UÇ~`¨+÷¿87=-l Ñ1Œ«Ò:2¡ t\Ãu7p“ºZî§#‹QhÒq ­ »7úÚgÛ|A5WÇÆw\‰N%’ JKt:¢Èm. ¶†Û:&p‡¡¥`ç“3Î#37™4Éd_i¬TÐàü”(JZ“µ8n&›´ÑèCR¸¼ÔØÒ;u~›ªÔ ldëŠP+uκµ]Ø‹œ´y鎑ŠñYîÏÖݹ69+¦ÔJV˜ÂÊËL«…R¤à¹\Ù®¬z)ÖÍsXp¤xȦU½nŠÂ– mÿUjšéáÖÓ‹÷¢¾=`ØKìCP •îLm ÉfWßî´H$‘æ)éütÞ‹-¥coàù |ñ#¼Kðeâ_LÄßÁ?®L˨`9² áÓ%ÀðÁ³¾Ä;„ž#œx…°'öøÔñâÏw2è‹nm$á_ADÃáTkh_APCÇ ZH󋦗øjb]T’‡Î¦RN‘ØGTRJ‘·ð(M|»<¹Ní‹Ò•ö• ŽÜ!ª¬*ÆÈOábÖ‚ÔF ÇâK¨.u’« JÀK§‹'–°{*€£ë9ÕºÁhÍ{Ô¾F¸Á_PKÜ+'·PK6A!org/hsqldb/lib/ArrayCounter.classEQÏkAþ&;ûc6ml'5¿,¹”$‡V(RŒ=E*Œ‡l’%¦Ýlìv-xðÖ@A¼å$zH.¹XГ"Ò?@ðîßRJâÛ˜Öw˜oÞÌ7ïûÞ›_³çîbÝ„Š¤ Ž[ѲªcM‡dÐôü^¸Í KÏøÎ ã2$Úƒ×~¸çvû®1˜ÅF=ŠR£N—{¡Ó>xâ¼zê´**©Š³Bfx(F +Spn«”÷¥:tή« (—Hpë!ã/PK4 B]  PK7A&org/hsqldb/lib/ArrayListIdentity.classmP»NÃ@œµcLƤ±tI(,¥ä%¡P)(ˆ†êÁÁØàˆô| 4i(øþ„_@Ø@D\1s{3{7{ÏïOê([0PÌ#‡©L›˜1Q21K˜X‹’HmôJuŸk¤¡$˜QÊËö!Á­´zâBø±Hº~;èÉŽZ­6 Å]%:Ç;âtO±´abÒ†ƒ9.æ ‹iÖõúgqøqø›Y&­¨¯š¡LT¤ï—e›·?6Bùù[±e,Oø–FzžpIœ¦0>ÚJœƒ¿™±ÄƒàùG4f̘çªÄLÌFít‡Ñ"X(Œå¶ëÌ úºW»‡v —I÷êË70¼á•F·/Úð«Ëf´ ¿A#畟Ã'PKXjy"ƒPK6Aorg/hsqldb/lib/ArraySort.class•TÏoUþ~o×»¶“”æ…†}nËÏ&ÏM]‚´— J…d‰F\¸dãµZ·ŽíÚ›V¹çOàTUü•|é%'‡Â…påÂ#ލjXfìuk‹„%ÏìÎÎÌ÷Í7o÷§¿¾}`¯ûðq¾€ð¢/±y™Í+l^esÁÇ V]XçV§•¼)[YýX@nuã¦@aÐŒúkï´úƒDàí•O޽݊ªí¨sµúÁÎõf#Ù¨ÕþGö’V»ºÕÝíEý(éö7Vk¥z5n¼õ>ŠvÚM ÜÅ!ÅÍ+{½v«%„{é¿fõ•ƒn?ù¿u4§ws¯Õ¸QzñìÒZ‹K­Î ÙOZÝθÜŽzgf“àŠ…Ýî­æf'® ?ìÞÈsˆ®˳ ©²ˆФS—P-â –‹xžMSD™ÍYœsq¹ˆ×°Nºý«Õkƒ›íx§ÚníT7ûýhLr៧gÀ ,Κ\ÀmŒnhIVž&×t„·3…Yß$Í]>bJno_ÀÎh4ãT±t =:Ùüó X²%º;E^Wökˆ£,aóÙãO!Ge T&t‚ÐÍ…yzZiço±ÛVíÐ]–kV»ëßà™¼Îß…¯ÝЦ¿êüg(jWn‡j˜þÌAú{Ãô{í™/PÐ*‘ñJ{÷ †F&{NJ |§„pñ¬‹Ó‚ÀjÉ/m’X„ÎÆÄÐ%¿„2`ûàTî¾V払\·ZeÌíÜ3ÄÜô„Ô”¦¿h)·Ÿ0˜‡<Á¼Pá+B\Âsâe(‚3_BÙµÀÈø¹É…t+–fäΓ Ý% Òß+|oœT;Óaíhu8iÒ†–ÅÝy2e+†c9[ÑJnbîɬÞ ¬‹K'¼±¥%Ïÿ“^7_¹lú&iç¿bhURËòWØÐ’h*s¦’mKƇ=Pé0ýMK­>GÁ²?†CÛ¦?M­K=‚¢myâìÜC‚ðùÏ œ×5oƒõ÷m@BÖ­Y«ÏºÏ,ñ|¶×ÅQ¢!†¡‘ÝélúZdÙ:Ëö¸%é§àoPKQ‘>Ó}KPK7Aorg/hsqldb/lib/ArrayUtil.class•Y `S×u>Oï==I–mùçÙØzÏ!Œ€ýžl›˜Œ‹-C"ÇXZ i,,J…DdB–%t…5k×mi³uBBã­%¤ñR¦µÛšn]ÿ–.i³¬i²´Yþ»­Í¶PÀ=羫§'#Fäûîßùι÷œ{ι7ߺøT:…j´ÃYü5ä½ÐãƒEð5¾®Àß*ðw ü½ßPài¾©À?øàá[>œöODõmª}‡ŠïRñ=*¾OÅ?Sñ ? â_|ð,<烈ìybö¯Ô|Fÿj?¦Ú‹ò,ÿ§ÀOH޳^x ^¦Ú¿{áxÙ ?¥âgT¼JÅPñ¯ÃË ¼¡À›T‡‡úFFn GÖÞÖ¿et­BD€Êp&=‘‹¥s›c©É„ˆkï/¾±o#u‡¨qtD7õ­¥ŽuCѾQê_'@•£?2Ìz#¥èCÑá¨{°=Ú?¸6Ìæ•¢ÜÝÈúG¨u.(ZÛ7L#[ð§báL<±>¶G€…C™ìÎe»&îHÅ·/K%·/‹ðåޛ؅3V àîI¦“¹^ÄÖ¶ÍHD‹8;¹pJ€úÖ¡Ûc{cËR±ôÎe¬UmáH.6þ1ÄmOá4ßx*Ëöe³±ý,h8ˆ¢ÛoOŒçVE"Ĥ"¿}r"Ç'6•ŸÈfz'2ÙÂ<¹uë“v$ÓqZ[·]JviÉéFʯŒ°Š‡*VŸBpÙ.:–M¬½c2–Iä&p©#0€±ÎÈVê®ÜÛë$ðXc4Tm1áqÐ('n™.F^CäáÌîÝ™ôÚTbw"ÒU;Û6»¶m¸†ºñÌd:ž3/ 2óH™>š\ÃÀFb»%¼ú#ÛúùÖ…#ÛÂT•'ÓÉLšmJ„{ùvF°ßMõˆ=ÁÚïÛ34“4Û˜Ñ Zd$OÜ™˜`êÙÊÖ³ i÷Žfúóù¢¶’,²äÌŲ¹"H$]v:bVe²— mµZP¿}©Ôû¢ f‚ɉ¾ôþÂ̹óÇ3é\,™ž@´Ñìd¢D[-k{KGåVKFeWlbx2•¢ÓSÎ\˜qøpâ[ó|6Ç\QK8©¾¸96|SÞV&+ÎΤ/™äÏìÙß¿?G*©h$Õ rå"l¶mëç³øº[[¯ä(²Ó[Mdë3{#‰–a›WFÌ=‚/F,GRÉñ„u"Ö@»K¥Šê GÂ4[¡é§Ú•º‹ÍwaUxe+³”ªøädË%8«%e„o»´K€†lb"y—EÙ1ܱ#‘eË_Z!R£ªÃ‚{™Ëô1Ošˆóž•W¸—eEdªésºæUW7Ÿ›W‹â…3©ÉÝ…SâÛ“Íд™}¤ý²†^Î7m.¸_+Ôa6&ö&²‰"4‹~¸Y™l<‘ÅZ²Ÿ d$qÇd"M¦ؾŸ+q4ÞËZî§¿m[X·px|d耬£€ÃafùÕIt#˜ìmw·†­CUáp´]¡Ï/¥L#`­§Ï:Æ8%ÇD±y2q {ЃYÖnÔfŒßýÉt,»8“ÝK%'P‰d*™ÞIÞf0Ò†y‡/91º/³!³/‘¥N+r²Ð».•ÉàÔjÅÌžñËü°Ö)ð¶ÞŸû! ~øOø/\$ŽkÛ*©XGÅ_Wfù ü·~¿ôÃM0ä‡wáü° nñíT†Ïû! ü°Æýp/ðCvP±SÿõÃÿÁS ¼ç‡sð+?œ‡ ~¸HÅ,ªŽÂC~A\~ø$܇Žþòé"ˆ~Ad¿àEð(‚W|ŠP¡~E¨T„*ÜŸ¹â£¯žƒÊ´)—LÑš1{¬ž“;¡&“²ÉÝÉ\ro‚e^¸3"n<º‰²Þ RÂwd?©Ýx˜+¤CK¾ Ý|Ó ÌåPËy/”¥ªØ»>–Û…ÂŶãôÆbw6±#…³—qcô¢ðC‰ôNš[”ì§S¢´:•PZ¦‡9ÌžLãèþ=¸5éľKÓéÌ.¹4 -ïÉÄ ÚËrQ©Ìž0¿^ì¥#†6?ºe^jʈ)WQdá ô!±ñ/‡ ŒìÊÐi®)ö &vÒ,‡C:ª2<Œ±\‰ d&YÚí@âé\·§v¼ø  –Á@€k±å‚Nlw9Ú˱}£ÝíŽöõØþ £½Û«íl¯v´{±ý!G{ ¶ûí~”ý]o°Ý–7`«¿~eãINýóÀáí ²á:ã ¸Ž€;0tò  ×Nb·ƒXâxɇXT·A¿mþ" aºãÑ= ÿ&ðï3ØWÍûßµ¾¬þuü{¡Øžï¦/3Þf~ dü­”гºöT4Iº8:=û‹Ó—qã¯td3QðW:å#ü•Œx7ð/þJF*næ#>ü•ŒTmä#ø+/›%#ÂØ ¸‚¿‚Üyð( WŸ˜SsÛ5Å®yìš×®ùìZ…]óW£f×Ã0·‡,êÕ‹ß›Ié´¦Jcݲ*=õz·[§–¢éñnÏ4v¨RûX xTÏ1¨2U·©*ªg*Ué(T4›ª¬Í@Uq1Õ »ÏCP¸ Õ~ä‡AˆóEË’ðÛ-öˆ«5#/ÅC«¡uš4ÖqÙ·—J쌚•zº„éÙç‚Gf¿[dâG” Â’slE7ÃFÎaš3ÝéÛþqXdhæc k'ͧ¡ÚÄÖ¨>Lm†û¢«x*@:.¡ªº€9Â1¯ÃH˜M³… NÙï80| 2ŒÄèü×]!Ä&±ðTB‹Ö-©’¦‡zC•Æ­J'JˆóÆ\Q¨µp6_~5_(†pˆpá·ÑÈ›ù)¨1L#?àHÓ ‰E\êŒr°‡E»iÉ&NÍaÐôÃÐ`U¢@Sé¤H©e ¹:/e8êóåÆoº%K'áQðjfþÈâIMšÂõ‰¦Øaã8·Ör Ãf±¾RjŸº& Ï„¬‡ÆvUîh’°x˜Àʸ=¯;g#x+*„”ë",ÆÓ‰?¡ÎÚ«[m!×ñõ¶–J&öê)Pï0u/"üÛx?`Buð0?Ê1·pÌ•å0—z§©w~µ£w¢Í[M´ú#6—\*Ámq¹J°ØÜf«y#·¸n)KÑRzE²>[uº©J¸­2·½·˜ù<ïPZ-Èd>SÉÀ{ [øcãø¿…‹Pð{“°Þ0g ¾W?kô³¾õȃ逘.»Ýèt°v•š@„<«Bª„L©#zÐl_bÊù~è”Í|!ȳÐnK/¤A §è4”ã=& &Æ\”Í|©âjÜEâÛf/´‰”Ä–ê¥%bIË}•íäµ’å^IÀÍô ç ËÝqÎã#Ü\—‹Ö&ƒÁ–B&Íx”;CªÜù⋌ ­ègŒ×sú.²Å¥Ñ悉=粉s¹Nì5òÁ81 ¡y(¡<ßTU¢%©rp¬ ùuMù1f¯:ØTxêˆ íBc,vþÿY,G˯˜Å.Û4¾ÄMc9†1fq2Â0ʬÝyr‡Í¼Ã^:m{i,Ú‹³“×Ú†C}§ý±@é ôfÑ~ÚÀ; fÁ~f@–ýÔã–û˜ ¾5ØÏ¼trŽ’{‚Ý’ÖžKc«ÛÅ. ²…:UêRå)hjÏK–ÛÆô;êá¢ÿQ‰–.@µ 4úIÉ·Û\9ËHùj¶þö¼ºÚ™bE¶Â7ØYM‡RdæSƒ‹p!îÇlÜ wYw©ÛXÄe¢ôkLàçË£Ó6Y,ÅÑ×`Ð ôk VG=t郟¾*ÛÙB~Å饸, .BÛ iŽçN°‡ç,’uáF+’É•ôðóÜ`è8è qX²Ãû†Ã] §`‡—bÝKåŧ â)Â$ZWåã\_91‰×Ѩr·BĪBÒco¥¦ÊxŒ£…°a¼[¡î ŠöcÓHÄ.‰†ê1U#20?”Ùâ‘C|Xl-ž7éö2j/£.z/ü¾5¨^ŸÐ‡e“°V¨ cÅĦo€LêÓð{|MÍ|ÿª´³¾a#ØÎ–Þ~Нý3ðû|^ˆÌ:#ßK×òà#à3tmÓôì/‹|òš¢PÅ(ÿàò”£óSþ!§4ù!©5ò«ºfµ‘P3G¦gß½„°’Þ9Â`t~ÂÏÚ„Öe»–ËJ„úÒó~î²Gç#|þˆ.åf4f ©Ç8Íg œm½!†D¬T† Êøc¼½YD7p¥µÑjnÅÆ)í°†‰²¬õx‚}N A·—ZþAÛ «9è¢!A¯NhzO‰@…0‰W•ˆDFu´/»2óS‹ˆ\ë–8$™¶¶R6šdSÓg@o’ k; ÙÎGfiìlj¶[Öâ± C%“…SMg¾á,Qe=N.¦Ž.´Euƒ€¡Kc&þ©nœ4 ¢—–Â<šQeÍàãWчmò¢â*À}ê…Ks‘Ï8fžÇpÃh s©àQ¦‡<ž$çuì&Jƒ' iªjcQrÉÐÎú§ Y;J»eÎpoS‹ùò¯yUzêUé¬o¥ÜÞÄ<ÅU¸‡õbºâ–/‚åÞ-UÕ”tã†).s'Ws#†WÊjB:‹°#,ºþ¼L TÇè¹<}Gô²ôÇü¥Rz¢éïÃÿQ›ÿ(¿v^ËéM± ƒd°KgE=f´˜ÊŸ-"×X—lʸØ×Á6‡ ®Õ <ÕÔ ×Ú•öµ–„î–MvŸb¡ÊÑõ„ôõ„XOA€o0Δ`…-Àì'¿Â[QØ$*`0ŠÙXÉ ¨½=ô\ùLsÚ(ŠNÛû#/§ÎÊC,a&Ùš:¦uÏôTØU³÷Œ}vÓA—‹Éö’#2V‚ë"T(ð§‚ð,Bð?ƒ/rð›­WnèDð]g=Cv6¾ÈЗwK¦¦JÏ]÷šÈB•î-À¿X^&øÅÿ%8Éáwsx¼†úfS\þT6›f^Š/·^kV›yzÐtÌ{4}LNuK͸ûËñB¡J½˜ï²Ö ±Þ"ñžUò"V îÌ"èY£©š<Öãðçœõ- -ÍÒ=‡¡ªY²¯*ÍÒ]«˜._)9dÌ·Õ1ɼøß_ÁSö»®¸Dìi>Â&°„!c¾b¾)ït¾zIä*™…¦¾jÿß¼O0D€}_…E[ž„ßø2ˆOÐoq ÿ \óaV_±ëKõÖ@Ä®·íºXg×ÍÀ€]¶òz´†¨n]à×PKy¾mpÒ*PK6Aorg/hsqldb/lib/BaseList$1.class;õo×>#.vVvF~×¼äœüâ̼tßÔ’ŒüvNFÉü¢týŒâœ”$ýœÌ$}§ÄâTŸÌâCFFϼ¼Ô"çœÄââÔbF¬Ä²DýœÄ¼t}ÿ¤¬ÔäFq(µ31@3dBv æÊ1‚xPK éBˆ¨PK6A.org/hsqldb/lib/BaseList$BaseListIterator.class…TßOÓPþnWÖ2 lsˆê„i¶)?TT‰„Ä™‰|²Ûn¶biq½#ü+¼ú⋚K4‘wÿ(ã¹[§üZlÒÞsîùÎ9ßýÎÝ~ýþþÀVb€ÙOŸ| ƒ˜’Öý~LÃ’ÖLŒ¬Y s1è˜Ò1/×ró¡†Gkx Uü¦'xƒÈkðWÉ{Çu'ÈÌ0ŒýFͪÝjÙr²õÂxÑ Ä"–ÏË ãÙž¨\‰A]õ«œ:Ôí`ï †H6G=6„]ùðÚÞÝ´Ë.ÅU¯LesÅm{϶\Û«YoÊÛ¼"›i2Zð:ÙÄW—~Ñ÷jíWĦs€¶KMõ€‹’í6ic8{±`®¤á)Œ‚çñƪkzŸ¥W 3Kå \Ȇ¥5i Ž„†EKHHâªg ­Òm*Má¸Öº¿Ñ¬Ô×\¾Ã=±¶_á»Âñ=¢^ ©ØÂoÈJÏ Lȼl¯æ]£›Ä¿dë¼ #ç þö<çŬnŒt䃬Ê[ES¨q!¥/\:Í3#Ù Ç«‘†HÓ夙 !Bל„|H†V4·ÈPßSóü×зZè?ù[7–'ón‡US!ýT‚Ó¸óÄ&CĦ,Kë2Qˆ`@“±®œ˜j‡œz€ñ.Gµz ãm‡eUJt¤ %‘!;ƒ»§8(ç9ÄAúçBD’ârVQ3ßëÊž #÷è/q¦:(PKt“cdž¿PK6Aorg/hsqldb/lib/BaseList.class}TKoUþ®gìqœ1u“æ¥:Å€ ¶ÇÁ¤-´ÄuHcZ08 b“–G'ñ$™2™I=“ª€ØuÉ(+ÔM6Y€„•JÝVêž{Hü*J8g2IZ»®,ŸsçÞó}çyïÃÿ~»à$®Æ0Œ·cÂ$‹"‹s,J|0Õ‹w0Ý‹ó˜aQæƒw{H\Pp1ïEñ>ë ‹X|È6Ó¼ª²˜U0Ãæ|¤àcŸ@@­Ø¶Ñ,[ºë®@bFwªézÏhêžÓ$ Ã2Ö Û+;›¶' *‘s¦mzSR&[ËNàUƒÎ2•lõš~C/Xº½Z˜_ºf,{EÂ4uç›é›ue/—k~køÄä'ºìØžnÚX|ÁÓ—¿žÕ7.éK(¦Ý0nίtaªPŠä“\·,™ªÓ\-¬¹×­ÆRÁ2— eDzÈÒtlr«`A`0såÙ!)¦{a}ÃûÆŠ¾£ž³à5M{UàXæÉ\÷v‹Ô22 xœŒÚ¼ïW·¨âE¤ThÈ«Hã¯!£âe^]˜‚OUœÁYŠOE §TÔñ™ŠW1¦b'(ævç3›++F“Y©sÜÈÔdŠKZRqWX|Îâ _ª872mÑíÏ@º}˜÷+¡.ö4>íéF>ÑIt8tãú¦n¹ðþQcÖtwθINdÛWO·ã`ôdÉOÃÆ†aÓìå3Mëìã^)‹Ü¿ÊsOËÏ9Í?k8»›Ÿé˜Óýr»¤'ŠÙšœ¢»> ¾Ð2O­âô§Ù¢—hu”4Ýw„s;¿Ð‚ìxÌ|4Í•¯i}ª,}ïÁÇ¢p$§µ ýEÚ‚,oûf9æE(>Í.Ò˜qBH¤|L)I¨°´K¶ ÕŸ@F þEœ¡t h aÒR)ׂ<•½ƒ1F†'åùz´H$·GdbŽÜF8¹}+$¶vÿÒöC~ E÷ ‚ñGˆýCŒ¯£ø˜&”+ÒRI»K–˜¿‹¨ÀmôË¥­{ZˆÕ·vÿJÒÆzL' ÞöÙ&¶³”*³%¥’45ªÝ¿ã³h£'™â–DÁýÝÎ" ñˆÞcAoÿ©€%t)žû½?B‘©ÈÒSEîõ‹L·6@ü@›\dûÔÅDŠq‘µ«;ˆWµ¾Z8R×x«…D]K¤Z8Jê;VTÖ¾Ù|pFËéö׃½Ý?µD~ÏÞ‡míþ®%¾÷7Z8öóAH*grZÁ[T‘qÚ£Ç*ˆlêÁ¹Äîa`1'v0È(Æ'ÙGÕ¡™E"J5B¡ÿPK÷Ø«ŠÒ PK7A-org/hsqldb/lib/BasicTextJdkLogFormatter.classTÙrA= ÈÀdâB£&j\!2îKˆ[Üb‚Fâ:@KFgÚ%Ÿâ/øä –Tù¨Uþ’–åí0Ñ å`è-6ú÷ÆOPKàa¨¿F#PK7A$org/hsqldb/lib/CharArrayWriter.classmS]sU~Î~dÛí¦JZ%›"Xj²¡ð#4 ¡ÌÄAêâTnºI–6³u³Uë•¿À0zÑ.쌴Ž0(WÌpÍqd:”÷=9 ƶ3Ýsö¼ÏyŸ}óüÕŸOœÂ%oáØ0F1Ãã6Š8Á“NÙHà˜MÇØ836œµ²ð!o?²ð±…OµÕ[·‚H@»Y0ëáj;Uªœk¶›qYÀÈUó7h©„€ ¹›~=»|ÛÿÞ/6ÃâÕÀoQI¢’×b¿~ç åº_k’¥$`ÏýXVâfØîX8'0¶ë2ß5ˆšq°wkdíÎj\ Ão&¦å·—Š×â¨Ù^*U¥3 :yÐsü6‡•e?:Eþ[ɳÍᥠ¾ |æODÅPv{±ˆün0å`RöcŒ¼9˜EÙÁ§˜¢+=Õsó—ú†FÚÂgÎゃ . ìûcî;'0FKÅåÎw­F­ØjÖŠ}å_s0ÑÀÅùÚí N6G£¢l{Õù¾²QYÀ¢¯W•išõVØ µ¬u′ö™³®PbÞsîr–ª{Éè‡(WÖÜ¡m®Z%*>Uœ7(ˆQX@ƒÁÒÎài¥‡4=ÇéímBh´:Þ„—yl>„¶þcÔ„B+”-Q… w`LL &­ŸKŒ+;¹åì=” ÞïÐè_ÏnÂ8k¤ í>ƨp¤° ó [°þʦFÙ[ TÚX|}}çÙ†dxGªÔw„aá …ŒÀ6râ_räJgY©eRiY#%:­_J-)ü,Õôuðú„7 4ë’œÄ:¦%¹ËÜ}Ì}$=~1—71´¾óô¢ ¬Hë*b=“â%i‚õc.“ 0¿«µ±H­¥0¦ÿFzÏÜýê “1.{½«Ì]WAŸ‘éß+]²3¾;Ðn¶ñ ß7 }šØ¦<_ þ)ÝWˆÉ õtFŠþƆÜ̺™_`»æòìúÎ?ô­¯ð©>#“ûÃÞŒ‘.Õt{¦‘>ލÞ'Uï£2‡,çPpÝìbÏÏ&Û‚¬úÞ¼½‡)u}?ÅAƒ€„§Ô{3;¡fvDÖ†ö(¦hZ}—ƒLøØ¼,mz6 cä7uçýþ­Ll2¸WÎ!¿GY Ê ªœ%F.§ÁYtŒÛB²Û ¯PKY†‡rPK7A2org/hsqldb/lib/ClosableByteArrayOutputStream.classUÛseÿ}Í&›n·ØÒJ“–´HJJ0Z¨Ò- v›lÚ…ÜÈn ÅûeÆgÞdÆ`FÆ0í»£ž³»Ý$42&3ßíœó;¿ï\¾ýëï?7Á  ­ †We|¤@ÂBó¼ÈÃ5®+ðáF7é~Ÿòê3KÐx»,#£  ²Ðù$Lj+2V„–a(ÂM–Ü’‘—QP0Ì aÜQT0ÊÂQ”·ÌÃí *¬s#“ýX2ª2îø–«9®ë3þL©Z´DJ É—L=K›k$ÈUt^NEÃ:CF±É«Ò¹RV§)–â]ï¼¥en]ÒÊim9¯¼€r~-£—-£T4 änŰH]Ž]ŸIÙþ\¾j®Ò‰-I—vÇfojw´¤QJÎU­rÕš·*ºV˜fí`F+kÃZ·ÝEE7u¢«X£.Í÷½Ç*ͬ[úÙJE[gj“|1É´e2©;Zƒ-Z©¢çG ›ôtÒ˜&V‰ÖFqE`×–v^+®$ÓiʇÀþØvAGÝ»v5æ97ètA »Äa'Ú†yÁ‰OfUÏÜÚRRì+ dJåõ¹œ^ºµŠ×p”‡ÃãMÇ©|^_Ñòg++Õ‚^´¼ ½Èn¦jä³z…$—ÉÄ2îèQN¿¡å£Ï“QkXçដ ¸ÈÎ>W1‰¸ŠpXEe|¡âK|¥â æö¶)fõ5Jò\n†ª.kzLd|­â|«âC9ޱ¦›‘ÿ0ˆ¼,}Lñ„ŠË”[Š©¹óᦧ+Ô FAoö½"ÆûNÅ©Hâ@¿iû‰fÔi :rϨÑrz…Ev;‘É÷øJà`©²’\5oç³Ëɼ±œäôryü[;j®SƒLl/Íj¹\ªXzö|1SÊË–´rY/R½Lý¯uK€ª>BMþq¨5íŽæé%Í¢^÷´5*ù½©ö€®›–NéÖøÎ\ÍñVÔ¹å›zÆšNu8²_“Ýö»Ò™†¯`1FÏ`Œi‰þT¤öŠJÔž)ƒöœ´çAnÐn'ºhÈñ¾hâ1øÇ GIÀ ï‘a͉x]ámÀ·Ø€´X‡ Pƒ®!XCwÊf<ü,ø=mˆ×iì…ø{Ñ%ã vr̦AŒ‰îqÏC~:NÅkPã WZ:¡¹gã!†ãq^Ù;i-ò;jxå‰sÀªáŸÒñÈô6] ž#!<_ö¯®¯É—Ÿæ<ûŠÜG8’Øø¡‘ûèŒ,ñº›æèi nØ¿9ò ¤Çìid阒\Zá6Z!É㕈l1yŠxHjãÖ )*KÏ1ÙJOàMʆC¯Ÿv(?ÓsrÑz“˜vGݬ âÎûô±Óvm·:…Ó®Õ  ¯°•Mþ÷mÚg<2ƒni(v^|îMÚµßò´ÙgÀ˜‡Í„Òz+T½NˆšáðADÛÐÞÆYm„…­àÑ6 3ÞõšÑ#Ýí7;Gç}Šj€£w”êYm ´®cp3ܱæÂÍš ·%“л‡`ßÁy×ÿ6̤ZôòRÇ«³t¸;±>}[\V\ó}lþúf/&jˆÔ1²ÙÀh+ÜžGöM%Èv1]e¼«Ú˜)—Ò8õc:”Z0uD›lXk˜z} ï{póˆSmÏý,.¹Ì[?æ~Œ¿C.И ²x hçššëˆ;îàNð×׋·S$ìögô60¼8°·Ž‰Í¶ëoAŸàïnóñ-ó}/5—øKï’ÛCA“ø< ^Nø¦|‰ zŸöSÛO9qÅ¿PKÀ2ÀXz8 PK7A,org/hsqldb/lib/ClosableCharArrayWriter.class}V[se~¶ÙdÓí{ -RÊ!ÝØ+PB ªô€ÔnÓmº°MB²…ÏzÏÂx#3Þx3Ò0†iïýMŒú¾»›MÒDÚ™ïø~Ïó|ïáÛüýÏ_ãG LÉÄ´„ ×dˆ˜âcîg¹¹ÎÍ >Ül'ÛOøÀ§<úLÆ4žÎKÈÈèÄ´Œè2âXä&Ë{KŒmH¸%£SnËØ “w–%ä$äeD>†› |Ìdð;܃(ñöÍ ,&[‘pWÂ=¾ù•Em7Æø3ù•œ%@H dÌ|I_ ÉuÚX,ê<œ4r†uš%gˆcùºDšg¡IKËܾ¬¦´yS'xòùÕŒ^°Œ|®D ÷ІEæRâÆXÚ>Ñ—¿¥ÝÕR¦–˦&­¢‘ËŽ:;þEs¥´D¶ö™©¼€×Öȧ®ñZq”í‚­ e kÍ–D²ýE½¤ÓdB[žÊO÷‰±ÃÊ-ių޶Ærù²bÉÞ“Èܱꪳºªk zQ@$1èÑnÙ%v+侮½jX ;•IÆFiÌu)I%§ŠìT`”.8ÞíÈ,é™ÛU#Ùž¹[L¾°6±è:ô+x G¹9,`o8mšzV3ϳ+ËzÎòÜO¾ÞªîÜŠaÚwì»BG,ã®çàšgÏœˆ+XÅ7÷¼4“}®@ERÁ‡8¬àM IøBÁ—x à*& Ô É-è«+ÖÄâ9Ê©…’§DÂW ¾Æ7 ¾Åßá{1Ü1¨!Ø®þ_˜ê…šãÂ:+¸Âžé©Ú¤'êN\¥|7–õºÍέ~R0Œ”‚CHQŠØéXŒ¥¸SÃzíµ8UÑ¢³c×ʰ‚ð@À|1›Z*Ý1æS¦1Ÿâèryx¢d°­1»)äZ¡ ç(öC-ª¤9ÙÜpRVF©_³n7S`¯^Ö,ª=ß²¶Jé› ŠL7úe­déËÚ5¾g¦µubþ–ž±FÓ-–ìê˜z.ËÁ¬n±'èu§ö 9ôÓ›5HϪHÿ”söˆ2Îî) vÈî{!pP{„f=h£ ©ñ2„gà?68Jlp‰¶QŸTËh‹<Æî |³ˆ³eø»ë"뮣½ yS¼ô?GÇ3âmjCþÅÚ$Œ0É;¶ RLry SðÓ pR]‡¢þ‰8w*J}ÇÆìRUÙ3q5úÛÖñÆsgM#§Õès„j”¯<®¨ÍuÜåú‰¸üÔ›Ì}„H4¹ñ±GèŠÆæxÜNýctTÐI7ìÚŒýñ3ÅæFİèÊŠ4È ‹ž®d´ª,öÝjXlÐÖ1.‰¯0¸UÞ WÞC ÞbyÉuôŒˆ¶È°XÉã׈ô‡ý­EúëDÒñªÎulWÃþ™ Hã¡I©€QÊGiÍ8¤~VêdMý•Nâ”k8ìæÏN2 3á¯èL2¹Ïaï­ñú ìh@93.J¯K'»(4q¾ë‰ëu“Z¶3Êç^®Ñú¬g=b¯ý6+{‚Ï!Ço Jã hç0æ¢Åx“d£ÕªMl© ± !¡£ Û»ÛpK–[ØÝàO³ðø£ŒËä*§ùò2óÞ›Ÿß¯oogxÌ0"$^*Âu>™2í?vûpb½&tKÛ©OxÊ[y”ÂÈf#–ÅV•aÊ':('ƒu„—|²°n#j0U!Œ.ļ]Nc¢¬*BêÔÎcaå»1„×üÒ4³ÆÄxmnè”FIÇ/­b_-}=³UŒxþ×G\>›W8O/‰aH€ÈRf†.³‡æm«û-ïpÏ|À€9<û?PK FÂ8ÝPPK7A%org/hsqldb/lib/CountUpDownLatch.class‘ÏnÓ@Æ¿Iœ81.MKé?Ó–mµÄ „*AÐJ½±q¬ÔŲ³¡}¾òœ8T¢T‰à¡3±k¨–<;»óÍo¾µüüúÀ=ܵ`ᆉ %¬ÖQÇš„›²]—pKBÓÄm-B%TÚ; ´vÕ;åŽtº^y£4õ#ívâQ¤ÇGюȰޓu Õ‡AèG„òÆæÁèÄ}ŸêH¬˜z©•÷æ™J^©^ÈçÖ“cÏOtGCwuï‚M¨ |ÝÉÀÌzJ0'ÅÝ„Kâdlt7÷lL£Ahþ‡]‘:6®À¶1…«6fѰ1/a‹„µ8¸÷a¿ç†A/ëÞMŠ~Bc2%TÑÀ}Ñ;ô=6±úû¨i?MG‰öûÅݰÎÛâ?Q¶Læl[†óZ‰wŽ3¼[Á0Ó>µ¿¡´oœ£|ãò˜eˆH[¼i£ý•1+x5¾ z:Ñ]ãXÕ0lj0¯ó;_ÌÙ’"¯Kí}î6úg¨d+£˜—(‹œò·É{gÙ€ôV¥ãäSnl©`ßÏïÐÌPµúû1¦ÿ¼K6ó5ÏükÊ2œœòœ)%¡9cvyAú€Vnð#œòKhæ,/¿PK3åÔ PK7A)org/hsqldb/lib/CountdownInputStream.classuRËOqþ~í.Ë.Ë«PäÑR}¨+¨ø9HÔ”š`Hˆ³m7°²ìVº¨7O$üÜŒ\½ÀÁDÑ&þM8³Ý”6b6™Ù™ß7óÍë÷Ÿï'&0¥¡ iȰȲ™SpMƒŒ4×YÜ`aȧ§§nbœÅûo)¸­àŽ€²þºèmº¾€˜ ,Û-o’öÆ|g¶gäÙ±èoXæú”@Ë´íÚþŒ@ú\DfI@šõJ)r”¢éL^ }Ñ7‹kófù¥YpèQ{ü¡h•}Ûs+ &äô«GŒSHçóü'¯bñ”S%.Û©ÅJ•5»L*=—¡š[W,¶ÖAÙQ©;²¤#Ž‹:zЫ£1ýªwLwÅXØtœžíúÖF½*F ëHqäÜÕq÷Y<Ð1Š11ocÅX­¼uJñ FÀYòÞ» óè9gJÞçuJ޳šæM•Z·]žÍ\ЩœæÉ`œvÞE[ÐGýÔi´8ô‘¼@V_€´ìD6w€ÈW>z¥Ð c¦éd3–ý†¨ºórd~#‡¦‡>¡=»L~Í:@th/$© ÒVE\`ˆ ‰œ‰ g2ÌY¢œé'¹_hûyù-?òçN&¶ØÞÙ…Êzû!S梉C(3É]t¬É-¦MžÑêt­Š˜¨òþš¹‡CîqóÉ?ýw²™x& N$‰xRŠK»è ¨ãRÀ—ÎÈU&ï¬"ÑÌL÷2÷’%H·ÖÆ×Z›u#v¤>õQª‘±}5¬ÚK;"ÚcèÛÇhßû'’Î-Œ§È(éÁ7¤¨_ã¢ðCtì×K¦Íj RS¢K¸G7%ädÝïâ ®†Ï1baž–lŠQëPKl4¾-¢PK7A%org/hsqldb/lib/DataOutputStream.class•TKOQþî<:íXt€¶X(R@±Q«¨TžJ+‹ÔDˆ a5СTK‹eð‘è·&, 7¬XhIÔ°paŒ?‰àãÜéÐò2Ñ&s÷<¾oιÓ¿>mèEZ…†ó>œBL%çBçÂPq¹¸ÄÝ„‚Ë*|¸"£úøi¯Š«¸¦àº‚>Õ¶—R+óóV™A˜I1x†òż=ÂŽM<4Ÿ˜‰|)qoÅ^Z±'í²e.Æ0HéRÖbð=-çm+õÜ&[ŠexD{6g-ÙùRqYA’Áë¤dŠö^öD©˜ãÙã<»z”^0 ]­ÙË A¼`s ÎspämÎ=ºc.M™³B•c3i~î!íàËN†@ý}ËÌZåÁñøø—ÊëïD1M~4ã†ÜêF ý~´¢EÁ€ƒòc#~œAC´TÎ%–²³‰B~ÖEÙ×”w»É{œSpËQÐp;Ý6msÿp"{ôªK±²ÃÍ5ö÷jƒfhý˪œ‰(±™TƱ´Ã#¥¹¬bÎ^`cñ ¹s4þQ»ºÍ4Á™"ïÓ|Ì©„T¶—A']6n£‡FJR%»’Aò"!ÖtCónéš÷‹÷#„Mç®6"„ŠóÌ&Ò<Ó£·U Vã§é‘¨S˜2[k™wéL$‡õ"«kÓN¿x3U÷´žw¿G&·ÅHÒQ”6b,¸Ì«(šÞ¡E_¾®@Ö;¸<\ÃÐ^cÖëÖôìgöÏèŒî\‡Ûɤ3é1£ϰ8ÒyA£½¥OûdÞ#(¯Ê,(Õú»þBP&ˆU‘­ÿþ¶é,(ê,Gø …± îtalWà=Žd—›;í’©òë7Ú¯ý?»ïuv>»ˆÜÀÀnœu{Žÿϵ~†oÚØ‚: éa)À‰| ¤7ŽÐ¥OÓ­~Lµ>~%|ñH¾¤ ÉVR )aiûÕÚ;ø¸N*FXC -ûä+T×Þ³Ž}ïX É!ÅLÊë¿¿†äýFH?¡*è‘v”B;ôÔ‰àPK@—ÚPK7A#org/hsqldb/lib/DoubleIntIndex.classWktמÕîj-y12Fذ»€MRìub×IP `ã8`ãà‚yÔ¤4^Kk[X–d=CÒÖ´ôý"iMxC«>L[·±Íizšþîééé9ýÙ?ý×ý×_mT¹{µ’…!¦3÷Þ¹óøfîìÜ«?þ÷·¿€çàž¶Áy4À;D¾@ä‹D¾DdšÈ"_&ò.úÁçý¸ø*‘¯ûë4û‘oÊhÎçóyÿçßÁ…ßòCÐQù6‘ï(ð]?¬w8ß#ò}"—ˆ¼Kä="? òCfh¼Lä}"Wˆ\%rÈu"7ˆÜ$r‹Èm"wˆüÈ?†œ~?U “ÆŸûçDf¸«À/ø¥r8‘gz¨[I+ÍL àM'R;‚ü㨴èµbY;-€ÌJwYñQÚ÷DÏØ‘èY[iÜžÂ}ÏëhË{ŠKWg¬Ô¨°­TxŒ™ÀÍ]Ñx4ÓÞ{Ž7EÍ®D„ø(¸ßF÷RcOY5±Âã¯YÉÃÖp ÷+p¿`"ÍEÑD™¨H»{RšÁÉF¥‰‰ÂaÒ’¹œçcÑɬ)Ç?ÔDÉöö’¦C!ʼnñl’Ðõ6õbºÏ„íd&šˆ§¹02k¡W£©tfoʶ2vª{2kŦ\fya0~OÙž1G²…r=ñˆ}F€uî~ÙÆÆeb‰ ¨ŽÆ­Ôq|"‡Ç5 Ü€Ã%Ý+è°º'’™%|‰ÒŒÇ6b¥3³Ñðø[û’V*¥Da1™,›ë–²ÃÙT:z Í7YÔ\§íi:ëÀDâ”Ýô0ö¡ÄiòyÚÂ3Q‰ tCE³ÓéÃXŸ8%q”Jüb¢«"‰,S—[ê•)›‰QA£wgÕÃó:s§QUIÚö8+:Íxµ‰ÉD’"–•”̦ÇTxÞPa;ìPa'ìR¡ÈK´Ü *ì!ò2ñ:`—[NZ§¬ÖºoegÓŸÍôìÁ¯2’v L…,™Œé"C£Ð¯B0% %걘=jÅ:S£Ù ;ž)Ñ> ŸUaúØÌij™h¬õ@b ëŽÙeƒ°O…a"½D,"a"r: û°.©ÑÖ±ôd,2Ü‹·¾ÂrÚwª‹ЭÂÛpP…¤s–È9"oÂ[*œ„qâЧB’HŠä&h–€>~¥ÂüZߨðÌ«°‹*ì%ÿŸƒXÅxû‡OÚaLA]ÄÑÇ?Õõe[}‰øha¯ÄÒÀT:cOP+H¥¬©p"‰gl6ö•»ÚÙ³ ‹•F9„N²s³Ìê‹úã°u9«M󰽄cøYqµºÆG¸†zlèÛÀ!x|8bÙáÍã¡zc#V ÛùØÁÆ5T€l%ÉÆ=|ìbzÏ‚@‡ˆôU\µ#_ıÍ\ÁçÁcJó ‘LmdSû¼Î ˜úTjæ๠•‚p*?Â¥Wk™ÅmzJàQTï]±º²œú~èãê/cHã#Ô¥Ë\¤Ð‰Þ?çÚ’AT•J4öÚÊÍ)ËÆQ -²3ËÓöÒ²Ûra¿¾ý.ÆJPÞ"m¹*f@gÍPq!ÎÀ.Úžm¸ :#–i¹›ÖÔR(^—ÍC Ó,ðµþ‚¢Þo’à–„TL¼¤µbs B<äB¼À!N<"b{ÆÁ¶v)¶uâìRT¤óä6Ò€ é„„cæqY»Œfa•éàRôHXñUÈ[Ýaxn”"ñסÚ4 iˆ-" Ìœ×pÀ@¶”µ¢¿‡ó¸8"à —Â}¨6 ÔQ8ÆD¼ôÌܱi-T_º •8Ö\ºBeIJ[÷Q=ç×—ñÍMë/.@í’„”ÕôyàåðÉ ñ¬ !uNBŒÿ'!Æ“$dŽc Ä!^U›NÈz |¾Ú…»¥M! Àël†÷³¶[ëâ}ŽÇ¶Ê)}‘u¹ÐÛu ¯hY_€Ô xªïáÌôçxj"Ï‹ãÎ2 rý݇f=$eJ' etUƒÏN܇ÕóQ8>jÓt|O-ß9}Ö4–®’©+ÌÄÆ'ÍD=|Þà(·¢ijek–ô[ºJŠ RAE¥¡å•ܾ*.§d¹—E b-aÞÔN-a+¬X½·<„v·€ºÃ®®É/š`iÉó:ß<[ê“úxxEzuezzQq½s¸¢ú8$²&Ý.vˆ!‰f!YÓoA‹¦ɱ:ºú”®@…ÑžËÿ#(]?~_»rù¿íFHÎåÿ”‹b Ö‚77¿—}Qø¯ÑJEíÄ lHWÔbÚK„úG@p¼ÿ]+É®Vô9*ÈÜ'ºôVî&#®Ç#ÜcÛ'y¼Zæ±èe ˆå^Ðè¨ëâw±½ÜEã òê™-ñTR™§J*œ1·R‹75ž¼óþi ‡;ß~O™Î9õ!4 6‹‹°¥/ho«mž:Ö¼O_ƒÍ‹ð©$[CÒÆcAɈè7ñ‚4pF 96´M!¹ÙÊ\'CA‰¦9ð“à"˜¹ü{­Í•dKz(‚°Wþ^ªY|•»½JdwhX‚~ÜÍ5#]ŠÜ†ØŒóÌ VtPJ¸9- Ó²€b%–\n• >ÀÞ"ècþ ææ¡‘uÝt#¶85]Äô$pŸ\F-Ç\ Сkã\×5<@Ä”4Ëoj •©;kŸ©élI\¶ï ÄhB2Ω·b|8†¼&†‚/ôæòÿ2ƒÞi9O"œA!ßÂEï¨æò"‹R„œhA™âJÒŽ“¹’ÏÀ÷¡*ðj!ðùÿ u[ÜmßíÛ5i¨ÃÐoC›A©ÝÁ^‚'I(œi)ŸËÿ×^€–i³ÿ—¢³Õ ß oKE¨U?fwzÂuµÌ;;>¶;œG3&P×¥!M/ÜѺÁîhÌZ¿s ýXã6º8ÔËmÐ’i·0m™`óå Nº]óVuÍn§½×ãPåÅ'‰4[\Þ‚-žÂÒ»t×K»øN—¼qÖUUU¡«”ûèëä¯öfþÐtì:@ñ¡ÉÌyÃK ´/.ùEQ@Š¿¼¹¹&þd2б÷ µ=­ gÝòïæå¿Ãä/XY»Ÿþ´áý’âÏÙ¥l…ÞKÈÂ_\ŽIN¹‡ò4ý¬Àq=V>{³£¤~)|bTN»(žç(¶²[ ‡°°oð<ÇVJaÅ~ô9Úà Lq»Ñ'Û Î‹+—¹Ö"’ë\"×…gºè>ÓÅþÂ×}ÖíÒµt-RÓ0>°ÏÏr¡s2 BoÂ[î-ìÑ-칫‹H–' Õ ÞÛnqÔðâPXÓxÁ1 ÿPKð].) 1PK7A(org/hsqldb/lib/FileAccess$FileSync.class;õo×>#>vvnF–âʼdFf Í0F.׊äÔ‚’Ìü¼bvv^F¥ü¢týŒâœ”$ýœÌ$}·ÌœTÇääÔâb3¬›ÁäñÌËK-rÎI,.N-fdÈJ,KÔÏIÌK×÷OÊJM.ad eæë{úícdÄi##0²]ÊÀä³y š ˆ¹€l.*vN6NPKh Ûê«äPK7Aorg/hsqldb/lib/FileAccess.class…’ÛNÂ@†gA(rPOx>F𦉷zƒ°&Dˆ‰7f©,)[ì.F_Í À‡2NUJƒE/6Óofþ¿Î¾¼¾À1h°£Á®{bç¦Å/ , Á¢Å¤ä‘Vè%­6ïê´P"@ÊRE[HÅ„j1kÀÃhF, û”^Î*Ôíwka k7õr“ºÉ)i¿±WÐÌ ÍúuµXøÎÇ,Ù}.Ê¢?P åpÖ£ïq¡äs•.{bºÅDGÇš):'ùï”ië>Å 8}6x_™8û–]ÓÚ@ýv=úÓÕ/AÛYSŽÉƒä·8mŠ_1ÛJ¦#'´¶ð·9¼g?qÏY°ÞˆtÁN‰W£ Ÿæ‚ÇÈWl§£?ÈGë¾­[f[w%ÃàRîÕ8kvbN7z}­Ýå~åîÿ¦2Þ¶jÞ‚¢xÛ „»@¢ !ÅB0÷q9éãòŒg‘ç|œ ïß<¢Ú¡TJËf#"­/n%SO$Æ’S†ÆapÌs˜i{ˆ"ºäá+)mÁÒ©RŽK ÞœYD¢Ð>î£(dXÈ)XÄe†LÎÒà5}!xX›1’––‰å¬…œEð´ä<ÖúN"éÑ\eè¬u¤Uç^×Ú+¥ŸÊ™–>¯•3l]ÏËPN7¦µ ƒbR¨„þõM¼%š·¼ƒwEæëD†‚÷ð>1¢à|¨à#ìSð1ö1´Ùiõ´Íj-¦Oð9Ç ¾Î_á:CKÃØ\&}¹À÷× ¾Á· ¾ùºk+˜2"fcÂJ>ë÷ sU-œ~`ØP]s¨‹a[=‘×I²౩ Zʪ1ødP ­T:ñTSIkÉZ«Ç™¡êˆXÕ6nÔ³¯aC›×Lâ¯óôNKéͬú·r@o½€h|ƒ¤‘¤\9Kß#³T‡P)`?i{õ¢õŸ€ÂãÙÞ È^t'à4ÃîÆpÖ\ëùp7⃫\ð±\4ÙšãeÍÙ2C¸Jgi;ÝÁ5t%Ti Ý$›ž<’–°w ;ȨrØS°^]Oת«"iŠqR˜™Çï©ÈŒ;ýž’ÌܧæÙRÍåÞû¸È”UÙ——ÄåA }/Oˆ8;ÎFH\^´°qêSd/ÎÏ•bN=;Ï~fKä?N£seÑEÑq¡±Î¢fHi{Hi­ÍŽvOEjõ•ÖYWh ŸÑX¦þ,}äêöþPKPtF¢¿o PK7A4org/hsqldb/lib/FileUtil$DatabaseFilenameFilter.class•UÛseÿ}¹í6ÝÒ4´”K‹UJM“V@¼p(EŠiAC©¡ˆÝ$Û°°ì†Ý-´xA¥Þï>8Sgœa|á…±aF^ñßððœM€$ >ôœ³ß9ßùý¾ß÷ôÏ{¿Ý°ß¶ Ca$1&á°ŒWd¤eŒË˜qDÆQ¯ÊxMF†ëޱ™”p<ŒvL±y]B–ý ÎLK8FÆxå ŽN±y3L¹ j*¹Gy66¯Í²)†áÇi6:›3l¼µ³2 öçd˜JÎK°dgnvVŸ×ÕÓé3êuÈPÍâPƵu³¸S TÈM¨ç4hÓlIµ5ÓXUÉêÖÐAÝÐ(Ó–WMËÔóªÁ T¹K7uw@Wle£Áã«@umWÍŸWKÇÔœ¡yL“D닚;b+š««ºÉm3š›Ö‚ïˆ N×3àTöŒÎS4ì!56Öä9lj1ó€nkyײˆµšÏk%Ø«oßä 'Â\î8ýÃÃÃk¨®šS7˜¤!yW#Í•1ÓÔìCuÖ}o,mÙÅ¡ÓÎy£2ôœ‡0éêFó;ë¹(ØŽm žñŒ4òR9Rt®$К*ÙVI³]q¥”“·u>\0U º‚”a=—?Ë«†•£:9EÌ*9¥–J*HaHÁ0ž¡ãÔ’a;Ìá=¨G\FçYFÝ2\Ä…Æf›@w#×ýsºQÐlóXPp o)x›£]Ø-ÐÓ Ò! ÷Ù¶ºÀ—¦à¼«à2ÞSð>>Pp‹ >ÄG >æµOð©‚Ï8ñ9¾Pð%¾âcšÚE_WbË(HøF õÿî¢Nñ#¹3ôpèæk©­mŸnŒß~„ßvý¼Dbƒ+FŠªŽzóV)‘¼o÷´@çƒâ†é¤ÛÒÌ‚À–f3·b©*?m”]ëÁë i<ŽÇ”^¸_-f¸rjïýý’敎=×òîG` YùÊ%ƒ°øp„7X?qµÏ…Š!íüœjð›ÖÍ‚6dö1?3Ä*D­Š¬Y‹3—sª‡ìŠ50츪í:S:ohÚ‘-“ÄÕ’îÇ<ôÑxtÐ? š²>ÏÓ4x~»çCôGCDÕÏQô=‚ô« èñðÅ#-·àÏú£L6 f²Áh(“ E¥LVŠÊ™¬mÉd#¡h˜¬m%+G•Ì2Úâ‰e¬ŠßD{6q‘eˆxüWˆ2:(¼†Àxõsõ2:!à dqQŠž'èÕðݧOŸ„$¼!a'(ESYå¨Bò8ŽP—¶Û·ÐžöïîñâŸ0œèaØ›èÊÞÀš Lwk9ݳ•‚2̢֥O\»ÿWâg ŠªÀw­öˆ;$‡ÀKáN˸+^ÆúôMl Î=ãþ=½ Â[Ÿè¥®½KhMzÑÆ©E?uþ;YÆÌ,™(£oª'ÿ=´Ž„½bÍ’[`ßC¬ít->ò̼“ðžL'~GØOH¶z¶ÿ¢“ºì¥?ZÛ‘j‡?ˆmü5î@àO-áÇ$Å«ÊØô¾«†ýelžðïtªº-lá +@GXB0pýÑ÷ÓK˜ÜB[.ô_å‚d4VÆàÖÖ礙«àlÜËn¨ÏFZf¸€¶/H¦+þë5„îb3ݸX××Û÷‚ðrõXäù _)ëÀÛ’ “OÀÂ(äÿPK©vNÙ$ PK7A+org/hsqldb/lib/FileUtil$FileAccessRes.classTYSAþ6 LX6rƒ È-IHˆ‚'åV4‡Åa‰oËf ÃnÜÝ þ€/>è XR%oXå?²J-{r‰šªÙžîžîþúëÉ|ÿýå+€ Äd4!(>c2BËGD|nȸ‰0Ä0O e’á– ·îÈPd¸Ç0Å•P?­ºó@‚Ûx.Á³`¦¸„&Ý^s,®î-¥ù7 þØ®º¯FÒª±!ŸnlG/%øÖU{W3ëêVš3LSa f†+F&ëœK¨–&oÒÍHED”a&—J^:ÐxÆÑMÖЬ‘ÏáÏT‹²-ê–]uâ³øž¹ÏK•I7Ô½²>Z%®z¦.ÑL2ë\ì&ø×n*CˆéÆmî,ëi¾öÖЈqoQ“ ¬·ÒªmsêiÚ_=I fZÛ‘ûu:µIë[‘aNÓ¸m“E´ UÁCÌ2Ì)˜Çâ‚%,+x„Ç +Úʰ×w,ó˜‚'è‘Ð[¬,&LgÙÌ©Ò Dò¾b¼˜X²äbx*a¤ À GO—‘®Š}çôæ2 äÖ.׈Üîš½_¹ãw"«±J8å $aðßdÑh*9Þ)‹?P1Μ‘ÆÖtΔ$6³–F•ÁÚw €/z¦=⛫)b@ËZâõö3ÕóVŠìøLÃáy˜1SMq‹Ø¹6ï1UÔ`ð9»HSW‘a—èu!ðôÞxIÒµ¢oi-$%’uÁ#HŸ ~Ô: îpÁCr\Šá;„;ú†öÏð¢.>EC˜Œõñ÷ð$B§`Ú¸?P´ ý£]'Å7£î'úºæ.ƒÍŠ¢Ýè¡S¢Ê;¸QG2Yªâ­V¥ACÇ7ÇŽÐx’ íZI›òª”ÔnÏIè#A0ÂCÈ(•Ó³*d39™‡×S€w%Fðâ´~a WP\/ù=tN¡u }b|´\"¾ÈYm×+\îJ׆ ´“QÞc(›GðäNTAà¿ÏúißJg®ó£õ ÔÍ]ÜGÃPKIllŽsPK7A&org/hsqldb/lib/FileUtil$FileSync.classuQ[KAþÆÛê¶–©y+KÍ@ía¡W#M$ß×u°•m×vƨŸ”Aý€~TtV*‹tàÌ9s.ß9ç›÷×7'8RÁ¶Š$R1„‘V±ƒŒ‚œ‚]E†¸;“m.LÏšJ×cÈ]NŒ;C·\½cÙ|i2DN-Ç’g ÅÚŸ¤ÞLNg²/=nÜ4ë†PËqõâÞäSi¹ŽP°Onñà˜ ÁZ} AEBÁ†Ê¢ˆ)¨hØò‡ %×ë×âÖ uÛ.º\IË®úF]šZ×q¸×² !¸`H,f³ g¬÷†nJU†Ê ÈsÓäBüM}¯ÕíýÌN”¬[–!<æ²Óf(ÔêëyˬŽ0d׬É_;-Êô‹0($ð™£;@¢bƒ´FVž´ï‰7^ÀÇsž|„â$!*Ü$!²¿ ÒôZ€5žœ#ô?·@v’²ÃÈ|Œšï!‰}PKê+2_fPK7Aorg/hsqldb/lib/FileUtil.classW |gÿOv7³;™„Í’„–p-Ɇ  Q b!$íb– Ƥ^“ÝIØÌ„YÕzVm­ÖûjµÕÔ’ÄÆR¼¨Öû>ëQo­µÞX)õ½™Ù+ÙDòûå{ßñîsöÁË÷ž°Y%\‡ÛE¼Þ7H(Ã~¼‘á›hÇ›ýx Þ åmÞŽwðõ;E¼KÂNH¨Ä»ùæ=¼¼——;ÿ}"Þ/¡w‰¸[ÂðA‰^îáåC¼Œóòa‘°w1ÁGëc,ऄãŒðI^&øõ ;ÍÇ3|ü/gù8)bŠá4ß|š—{™Ç /ŸqŸˆs6á~ç%lÁ¼|VÄç$´áv>|žw_ðã‹ /0ƒxù¿}YƒøŠ„¯âk~|Ýoˆø& #g}KBÃo‹øŽ€º]Š¥ (¦Ú©¥T]fh©irL×Õt{J1MÕPÉï; Õ4÷ñÙÏçžãz‚¶ƒ´=`i)˺ŒôPô y$•ˆ¦´h§û´•8 sX?îš"QDY5hÆÌØn¤ÕvÒT€Ð/ ~ÐÜc¤‡•”v“jî5Lm´GQÒŠeòåiEOÃB]‡”£J4Cl£ûì;âW¾MÓ5k»Oxà ¼íF’˜V ©VgÎ’åá Ùââ:Z Xî/‰î¼3A¥$Ç•‘ýÊ@Jµ=¿H3{¬´ª w¤ÔaU·Ô†mSŠ>¥7MÚºL­3FT=¦d¬YJ8Wš- ØJ¹,@êM¨#–fè¤r0A–ºWI«]ZÚœG>9¨2­GÕœX:s¦äÎëKЕ洄-éÎXsMiZДB`RM©ÅLv6ÝzǨFLªÃ9 ö¾-²\ÕLË,­eÁ•ê¶¿;öõjÖÁî£júXZcYWhe?µ#RL0T†ýk°n~ë ¯Èµ E7t-¡¤ØN¬Y4.è7)ÏÕQ§±4×bU–䈺Ó; ¬¡¶E©2¬Î玚 ªÓTSÄw)¯ù©èò¾|qqÇñ=ÛÂ¥ƒ»@­É2 å–»Oï³CUØÄHàyß§0’̇.Ê«K9ìÆÙ éê±]š™PÒI¾ÙC2¨ÑmK¤ìÎ!ãôR ‰¨+íàûAÚ(2~€ÊxöÑ)*ãGø±ŒŸà§ä áE2zø)8»9‰ø™ŒŸãÌè—2ö「8öÈèÆ^¦° -(q&ÑÉè¼qû¦cN»ù•Œ_ã72n†.ã…,?ÅËP¯\ZȰ0Œô°Œa¦ù-~'â÷2þ€?ÊèC?+C þ„Gdü½2nCFÆ£læ_x9ŽL‘.¹Î#ÃbÌÇé¯Ìþoø»ŒàŸYtn\Ý9tW/4%8Øð Ø8^é'ã߸˜õfA.ìÌh©$?ÿËø/.Ñ|Øh Èx‚U¾Ì*?‰‹²\AÊ(xeÁ'”S¬72º‘Jr«+­€µW4÷²ÙaëÖ=pˆÊ‰æë¼ÅQ„î˜Buþÿk‰êuNò—«G2Jjö@pt°¤H•åt’špÉÞ0ó³8T Á¯êI“l±ÞÇMK¥©]Ȥ¹µì׆ո–Ji¦=«w“sû¹©ÓÔX9Ë<›ÑnZ²|*-£(—"…öäÊ£pdæ±Ù”0C¬"‰‹‘£fÍ §«Q¨ŒL:¡.ØŠuÕŠØ×ņ;³e¿QbZ‘IeCb»£h~馽¸‡ì¤íáY>|8iOð ÒËŠéIu´{c½ffÀt3¢.‹•ŒXC±2Å=™<¾’Äuð$%ôl3éÙ6œ­™ÛE%ÅI¶ÖÖV׆çýà+]¢sçX¹2BßT\-W4OÝZf¯[F¶&*4³@ëå–=˜Èyõ&ÆM·KDµœ±QgÓ-uˆ?‘+,ãzu4˸6\Ú³³kÖypZA•eìU’I5™eRê‹.ÖÞ_‚1VÑçüup=|xJÐO"‰Áj=6ì±aG ÁåôO£‹¨žK»=DI} ;›¦ 4Í ¬/䙂×Þøh3‰ò³¿}œ†4‰Š³é¶²oUSXtÁSà¿O—wÐæ xO£zÂ}½Ïs_×ä÷ªú1æG¹‹'àù´Š(“vŠxiZ¹DKᡟ7€Ì 5Ûú,>i³ `€Þ«Œò¬›AM_s µñÈ4–Üo‹]DêÕ¹¢Ê!ì‘@’•¥»VúW1èÊ\Fw,³²)/té)WèPm !1Ú¢¦æI,#›Ö÷žÊäPEÛƒÐ\Šºb5ýMÍ‘),ïÍò<„î!+ÈæœÁŠCoª›ZÈE+³.¢9îbUd,_ó4®Ê 6®ÈÏF\¬]„å%ØÔ|Y{õ ø<'WŒ¡Fh¡ãª{ zÇQå‡4FºY}2ç ?|BÐÓÉjÐ7ˆË1Cü|sÆîiа[ø±õXÓæ­õŽÁç=9µÎ+¯«ÇPŸE²á4Ö9øEÄyèwòX#Â8é‹d~Ó×O¸¦Å172ÅX“âܨŨ‹•ÉÅŒŸç\šì8nrÉòa"ÜRˆ™’ú8¼çâ¿8ge a{ì¤&Î&â š'ìÊðQ=4å+£SÄKèts.uzݨo#’H…e>5îÙÞ9w7‚‘†ÍTJ½·x„ñ'sÂØÖ7…§Q=,žÄ3B×Ð2‰­œ·-“Ø6†0g^ãõ´ùj}˼Ä%´Ì[ësøøˆÏ#-¼%1Ûã‘s'ܤöp†³ÈêH­×Áõî£6ZmŸÚH|¾ÛØyó©¾ÒeE¼ZÄk„ǺŒVÊ{çP÷8¼—à£mÍ%ˆÖ’S^‹[Ý@Ô»N¬*rJ¶ß– ØVr('T”­ÓxVÐlõNãÚ.×KM쟴4óf§ã¨xÄaäÇëri•-¨A;î:ƒêtЮó BÙNµ›ÖF’¸…`ŒÈ;>›ôÙD°‹à+i$v•þPKï·UºA &PK7A$org/hsqldb/lib/FrameworkLogger.class­Y |[guÿKö•åë$–ó°óBMÚÔ¶ü iq[§/DZc'¶“ÚN‚“B¹±¯m%²äHrœ -”GiimÐtŒn`(4)Ub\Z`¬a°ì={ÀØÛºÒÕûŸ«+Y¶ä$üs¾çùÎwÿs¾s¯¼òÙçl“÷¸è‡`¦ølfñ¬N?çÃsÚ?¯+Ÿ×Ñ´ù¢ßñ£ 3eø~WW^(Ã%|Y›ß3ð?*ðUm~_ þ@›?TƤl¾¦£?ÖæO|øºA|ÃÀŸêüÏ|øsþÂÀ_êê_•â¯ñ7¾é÷üø6¾£‡ÿVÿ·ïjÿ÷>üƒöÿèÃ?iÿ=¾¯ý?ûðíÿŇõáß|ø°ÿnà‡>ü¨?Æøð?þÿåÃû9чÿQa_òã§xÙOAþWG¯˜ócf ;E8‘"m<†x}RL!¥„”bøÄç—RñkS¦©Ëå>YæÇzYîÇfǰ²B› C>©ô〬T«x£¬Öf 5”*mªuºV›u~4c†¬÷Ë٨ͫôŠ 6×ød“O6r­O®óÉ?Æäzmj ©õc\ê ùS1©×¦¡L¥I›W«–/*ÕVC¶rƒ'•°Sn4ä5‚周è¨ïŠ&’VtÈNp¥û¨uÂjšL†#M=ÖÄvÁŠ£ÃÇbݱÑvÛ'쉖Et¶ËNv;ÇkÓ§"Vt´)nDì¡dS‹ oÏP“4½"(Ë,8g9g÷9Ê£Ôü™ÝXÈ^W>扨 Új ùS‘U@˜œ•±xlJýà¸Æ˜ˆ‡O8üöÿÜüºòrÀ[˜ìèðdÂŽ;÷4þîQ‹GÂQů1eÅ£\$$WÄxÃÑ‘çJ‘ Z‹íx¤Í¯šr¯Æà›å-ºû°‰à Sî“û y«)o#©< ÍÛåÚ¼“~ëvõI_85fGƒê©ñ [€´Ew3ÎLGèp¬©#ì U§c±qŽW«÷2Úæ¸‚—)âS™<æžîŠNL&™Dlk\iÞͬ5³}9®|H&MyXÞà iÊ# ÊGe·)ïU‡Uf8víͱޢœÆ¢ÀÄû”|]Nú²‡&5sŽ•Ïc$ræç]„®•Ô´¿¾`ÓcE-­/xX’ Ä­!»=bÛQ­–VÍŸoNŽ+ÛÅ—S^fDøtº^éâãcMLð}ãí5]ùµ’ûyCÁÇ~iú’cö)GÕŠL –Ñ~13·Ú»3_2–^â0œµ×êœ3vÜ®ª´]Ž›1f%z™?h‰¨Ó-¬³Õg‰}|ÒŠ,. 3â²Ìô3|âÉÄAÆæÕ#‰<Ö0­[·Çc'ìÖ‘^[B´Å"Z'ÓQu±S’RÆ‘X¼×Rð_wçK•tzÏ”Öw8s8¿¼¹\¹¾f‰*‡â/Y ª–âHk†£'bǨÐ-¬yøòxȺÄÃÀæ«U€ÃU2(îèêmï£}õíêÝE¹úÛ´÷ña-Ñ­þ…•ˆ“Šy/+3º¸;“øÖFÝ ³='Uä,§kÓh2Â,£kÜ´Ã×yËUE’~r¥ñ×5Åí6+AÛ•§ßðlN.ü¬¡óaÓ8ôÖÒrÑä$ûd*ƒç³ûNéã ×õë—.~•²’Òõ¹Ïhk"c‡Ú¥õÕì:Ÿ«)lûá6·èpÓWUMAb½°j©OÂù:½À­…?!ýŒÓlͱ±¢î®sóJeÂÞgÅ™{Ý ýnžH# “œ‰Ú$Èe¬’ßÜ=6QàU§l¹B"ÌâVŸË–Ž¿Òs°î2ÛÄ:i -\y6{¤ç^*ͧ¢ïgüªZú³’¶ýE3]òÛèú«ûÔ= Ù)‘®;*æÑ¦ Î&a1ƒ•»¥Ç)5QBóx. rž\9ߘ†­koR—é[“5?ó|,aãtb3~ýÖâȯ&NÏï§¿ßé‹´´szÖyÎ:¿„دE)Þ…!x·þ}ûú³e2xEçá™WBq $Ùût^š‚ÿ)‡¶áa÷ü³<_Ìþè,ÊxÞìΘA¹ ÇåZGN+SXF-Þú,œA-+ŸGEo)Ãl¨ö¦PyfîÛ¡†¬,ÂÁé¹od8†f°Š+çx›à=lï„g!xÄÀ£ÞK«<ÌÑ@ókÎÀYõçQ§¥XZ“¢#œQù±çi¬–=έkü¦|UüWX{ëöLÃÛ]÷‚ôœÇÇPÞ'ð½ÀFî^åý‚ƒžJTô§p ±á<6…„«›=k¹xÝ ¶xpÐÙ¹>»S³h§6»S·h'”Ý©_´ÓÝi\´Ó”Ýyõ¢­ÙmKJpÃüN]àF#«à 7ðêÜ?X\‰Íýƒ%•hV¥i¥ºÀM ì@ã£-nv‘¸…P¥Ñ”B ­ÙãX¸Z­Ø~·v‡^@y(p[ ·Ÿ÷ÜEÜÑswžÁÎúZg±ƒ\Úzf±sÐsí)t4PývÕW¢3ЕÂîöº/¢§Å[íåFoµ×“ÂÞid°o+{¼t0% ÜE¸Öw^Ta#ck=¶È]Ò‡õÒ/‰¡Y‘oÊw¸žFÜí(›#™ø%m~?ÅON³Ÿ#E üŠ®à%àel Æ^Æn| ž¤ZÁXy,9SÄ ‡}WÝôŸÇêÇÑ|U—°¬.DáŸÁÀ4®«ãŠëŠzâìŸÆrFÕÁÀÁú xíó„i¨.í sd¼Øšw¥È:•쌃÷ý¢Œáϯ3Wˆ•ìEñ7x‡Ò®¿æRì Ðš"jC—௻ˆÃÓº¾ e¢ZsL—º,Ò×(*»›w;ü~Ýåw‡Ëo‹ËïÐ46àWÙ`†Ù‡\f7Ñ‚*þ&šV¸»ˆû+Òã×1±t>5‹ÎAøõóŒx¢šÃã7\&U(!³.Tß@ê*øÔL>¹@Á Ž={£-^Gnfè´{H&+ ¶¸b{—º!#t p0+t)¼F0J)×;Îúh޳<®³d‘³>–­µ¤R-«sí"ºé‚tµyt/HÊ£ûDAº†<º' ÒmÍ£ûäUÊ÷1œÍ¡ódõ­ÏÓ·]mÝÇ Ò…òè>Q®!îÉ‚t[óè>yUò•êÝ·ºkrík³ „ùjŽ^À±=L‘ÇQì9+ÝúnÌb\ƒ?Ú=‹a7ÑÛÀsœAoñzš‹«½3Hh!Òÿ@±è$é#-%õÕ,}&ÆÆ%¬ö4ûø"™uOËK(ÒGæòD/*Qy>‘ŠáÌçžì®³6‡eZ±e|fIÒÌ eóKéϤ°°KeÊ<ÜÆÓúd¬ŸÅIbâÔÓðdG.â4+’=šVb áøÆù×ç ýPKgRWˆRPK6A#org/hsqldb/lib/HashMap$KeySet.class…T]OÓP~ÎÖ­£+:>†  N܆P@Á1&Ê"ÆD ¼êº†K‡k%âO1&^zÃ&:ˆ$zïo"Æ÷Ôn"ºfç¼}Ïó¼ß§?~~ý`Å6đЬˆë|W$1.a“|¹Áu7¹4Å—i·$D‘•ˆçnó厈»"fDäÂNŰSã —ªµ ¥b¿2Ë%Å4JÊ¢jWž¨Û9ÂÌ–áÜcèKŸʬ0…jYgˆŽ^Sjã3§ EïÌ ¶ñ–ðÁt¦H,­j9ªaÙ ñôÒ¦º£*¦jm(OK›ºæä2ëÜІáV§~Cû²£j/)¸çjÉä~Ôr™r¡uÎ4ú}¹ª¦IT£j¹îÂ5}«ºCDѰ¶¶]7T:i¦®ÖÜ·]è–GZhô„I›²Ô•yÕÖ½"¥r±Y ˜_%-K¯LÕ¶u[Æ}Ìrós"æeô¢OFI¸´€‡2a‘¡÷OþÏ^[ޱ¥/¼Ñômž‹Œd\Cš!Ùº{©Çúî2¯m¸!ÄNד¡ó×Å%þ•/5•:æfÂЕ>Ù$WI=ú« > ¹u>W=­£fˆ6f†Â&gÒÿAIÕ4ݦ±§Á;shýSS䣨`OpöèÙ#ÿÂÏÇ ]´PµÀb1>to%úÇÑCÚ $õ @i³#_À²|ÿÑ Ä%Ó$ óÁµìg°µ:„Uá¡}K“àa»içØÇÕÞó $=DÜóØÆ#uˆ H?<È}E‚´']a"‡hË'Þ#Äö¹êRbrß% Ò;F÷{¹é¥Ûó9BtíòwÏÉ®ü‘jÚ˜¦sF"[G{Þ ÷Ü*K|€(|„ÜkFAà½l–ÇqÞ”WvÎzç#…ˆº º­+x¾Ñ1Þ7¢ŒRGbôéÌ¿PKOd¤ÊŽPK6A#org/hsqldb/lib/HashMap$Values.class…“ÛnÓ@†ÿ8q\0…†ž¡m€(.åt„€ªR#! Jï6É*qqì`»ð(¼7½ ‰JpÏC!fS§…&%¶lf¿Ã?ë_¿¿ÿ°Ž)¤±¬ÃÀІkò›Ó¡ ¯£€¢†›:4¬èÄ¥gUÃ- kn3$–dצ·=¿iµ‚·N£f9vÍÚâAëyh»vøˆa.w”¯0¨^C0$íPø<ô|ÉçOo(G‹V ìÄ+¹|™vÕ=7ä¶0Lå¶wù>·î6­çµ]QKùy£AÅÐû‰ã0,³á9Á¶çöù„/ÚÞ>eÐì`³Ý ß÷sÑÂÄË×ßPÙ¯xÍ¡õxÝÜï¯V œÃy&–4¬3¬þ•" ²…õ”"ê:;°ËÇ›Ã.£ìºÂßpxˆÀÀÜ•áïi¸o` †Ù“n_칡Ý›ïê¢#û0pK £UÏV¸³'H±ÄÀ0O Ç0s¦H óÿëŽfÒa¿n†‹4É“Ø}'MpùŸ E(íÈc‘]t…ÞqÄÒ%A§ctoú@©RʦPÌë¤Ušþ øPKæíØ,:PK6Aorg/hsqldb/lib/HashMap.class•UKsÛTþ®X¶¬¦nìØi-I+Ëqí¦< nnZ¨Ò<  )Myɶpœ(’±”LÙó'X±ì†E:C ̰e†ÿÁŠ¿@)çJ²“ÆòLñŒŽî½ç;ß9÷<ä?ÿýõwshÅp7Eó\| bЍàW,ðím.îpñsÜÝ8T,ÆqK\,ó³.V¹ø$ŽO±È î X‘Â:ß|&`CDëøœ!²¡{ºÍ ©¦©· Ͷù6rOÿ~Mwh±ã/RKV»Qܲ¿3êբѬé´Lú}Ÿ`ò´~Á2 ½æ4-“Ãn4ͦ3Ï–s C V]§—¬òxçqMoq¤-à!aÜá%yi[Û׊†f6Š«Õmâ*çúά9ZmgYk­kUƒXí=2¿`þŠ„‘¶¾kíS¼f™ŽÖ4mÊÃXP@›ä¿‹rsIæä¿b”ùtNîjöZÎmà–^òÖ­J»­‘‡´ü(Àe(NU8 Ë#Û¯x© ¢V«é¶=]*•® Œ®?5§[_åÖ…Áw ¸ƒ„GøB—øJÂEÌpñµ€o$h¨J¨q]º„oÑpE %.^û¶$4±Mù’°CÂ.L 2rò˜•ð® °8öuJ@pLÓ^7s·sÜâÂ`dwÒÁz†© Û±Úzñ–fë=õÅ㻫”ù†fTÚ½]ÝtzMÎ9E®:z[#.†ËMÅë7s2 › 1š%ËÚÙkñnP/AVUu“·Oâ4€!ºE{SH#Iè„çÙ½¿ï;®Õë«íûþ0”åÅÅW©ÍÀ™’¼™êº¿t°áh§SôÍ^Æ&û{¾›N²èš+úcǽ%MÜénRr ¯ó‡èë9Aßë=Ôjà?j$’# ªãM’Ó´K‚Ñ[PÑC„Ÿº@˜!ŒaØ%‰)“‘HøCä=C¼L5·Ïv a:&ò ßTòS„泡Ÿ *¿ ’;`.½Â=‚=Ç8c´¥Áð Òˆ‹ågÉpàGTè9I"䆜'@´  1ô£¤æ€ˆ’?Dìg__ Ö‹]ýUúoóô·éü9ºEüÃòìÎ0üˆqZŒ0¬(…|¡ƒ³$fz‰ØX†NÞ ¤óüÿtô±òé n%q*RòœU~Cê¡rˆ±gHò£ãš…Á’´¤oX€iÚ3ÍpÓñgHó£—MQ¼‡÷O”1ì•‘·‰[”qÜs¹‡‰ˆu«<å×/Cý=Ië½³ÀPK×™:ùžPK6A#org/hsqldb/lib/HashMappedList.class•UkSe~Þì& É6ÜZšD*„M"…Z¬´ ©MA¡i­º$KHI³4—ZüÜ?¡uFÛÑaœáÑ0Ú±~Óƒÿ€~v¨xÎf —lgfÏyßsžsyÏ~û÷ǧ‘õ¢#^„1ÒH§Q¾¾Á§1/N`œ¯X;Á§7Y1ɧ –]äÓ[ .yáG‚/o+¸Ì<Éä “)&Ó>¼ƒwù4Ãd–]_Uð^#9c2©àš€ç|6Ÿ- H‘>ºÊfÚ IðÍ;y/e¬”²f¾¨`Ž0£$ eò–~WïÏéùLÿôÂ-#U:G® Æmó.Y÷DêÕŽGfKzjùоrU_È‘¡¤§Ó½æ¯~¥Lùœ=Þ)©Èê$‰÷dóE£@&'§$©9dFa.«펑è% „¸¦çÊuˆðß@‡D>mÜãª;X&¨†%Ó2,Ž ú*gvÃè ð•LвcèM-©åB*^@—Š÷1¯â<Ÿ®ã†ŠpSŇøHEzU|Ì QÄT,à¦ÀÉÝ(VÚÓåÒôⳜOk£ÄÎ_TÑM l2ýKÅ;¹ôB.»ÐI/.Ñ8¬éd¶XR1„—U¼Ä¤‡I i”Ý"2*^ÃYqœR±„Œ@óÁRµ½ tïI3—32zn¼)ß6ò¥Z–Üë"'! ¨?ͦåÓª´=¬mŽ5mX¢ Õ%¢¢þ4R “¦¹\^áö×›$,PuufÌOüÕPÔ;\Ì~J̳l¬Îò¸¶Gú’^FrŠÝZ/¥„Rf¾¤ÓÜ>g„èqãNYÏÑE'ÂàŸîÑNºµÁE'@Ñš6![t‘‚Lj»ˆû´à&\šü=¤*¨›>™ 'é£6Úðã6\e¸¬}wppcÞO ™ÿ $’a-­ÀS2ún±¡E7Ñ0¥…*hŒoX9Eˆz ¶Ð,,;!Cä‚C6WCRLop°_}XšK;쀶£v4üni]‹Æ6¡ÎÉë!ijU“è—«fÁ7ìªÅñŠS—í?°SJiÊb±Ùx}bý8eþN2…ø·Áðµ Ž| ßøç7Ñô³‹U“’²•®…ø ^-¯ yý ZæYBv‡<ß!ØáÖdØjÑ6‚ÎÝ÷ˆµí?Y-§|HdíQRm¯mÿ-±´ÃmÙ‡´·e_e»þØS¨.xUe -Âÿ M Ä?èÜ‚B¬u .bÝûÞ¯½ù¢]¬j±*Ä~@» ŸÁ¯Ñƒ¿´:S­"MŽö@“$ˆð>ïƒ8m{ï${?ºg"§´ ìøz]'^­Ù-’S7ñÓU“a9ö+Zcò7Pä5ÈÒèšu­ ã󉅌͆÷ÖÄó íÔÑ3cBRÇÄ6ÉÜ\’ðw úÐó÷Èë´GôwÒžÈv{ ¼µ^·‡òu Û˜¤]‰w}$ú £OCÐú '’Òh˜Î­Ñ0Å †gïKÔÞ¿¢»«ç‡¼…&ADP/ÛHzîÿ{Ƴ‹ÿ1Ùž£vµ}x¸»k.d¸TZ›ÿPKþào²£‡ PK6Aorg/hsqldb/lib/HashSet.classUßsUþnw“mÒ „–´Å&ü²B²›E-Hh¥T”…”"•"ê¶YÒÀ6²[T@Eÿfá¥/<ÀŒ“2òèƒÏþ¾éø8 ž³Ù¦% `frî¹÷|÷ÛsÎ=çÞßþýù€]ø.Šñvƒ8ÈâïváŒ.Æ ™Œ¢GY;!ñkï3ø8kS¬`톂“ç&j‚ýÏoûuLødû×ÍØFÅ ^¢÷hÔ.$Ó4ëAi€¢Å;—!î‚ È „H"Ú@X’–ÑQ‡hô— ¨ÓŸ.”€­›  kú2¤2ºQÚÙåÛý¼Ø÷“U¢qP¿‡ÀdöÂ7‘ÐHSj載ðÒã?¥ÛþnA¯+…ôŠ‚×ú­¼Ž7¶q1[Ÿ¦ë5DjˆŽ$¿'Þ;ÚOèJîºÓ CÛž€mq1[R‘FSúƒ[Ì¢§vù7$±ôøïfYˆè™åÍ€å q„iÌHÃrr8”1Q2JÝBoBÖôDÈ'–o„ˆñ„ÜDfÊ-´²·‘«&ëzM§­ÿµ%;TB1?5ùÖÔG-®vOªqÚñ«£”šTsj(3¢ßgkIÜœšøÕ祆¬€e4ði+ñ†I©áQ·žª{4åSýu·Á¤2—qõù\£×@Pêë¹^~A÷„F5Ø£ß jžÞÝØë÷9uOiò2+zœŒôÅ;6q½§–Ñ7©îe²5ôÿ€X¶{S /L/!šŸ®a`:«yLN/=þý>R´m3·Ô°5~¦†m5l_í‚u!F±(ߎÑꌟ+z?èò8ù?PK{´0v,Ñ PK7A"org/hsqldb/lib/HsqlArrayHeap.classU]se~Þì&›¤I›†¶X’b‹|¤I0¡´ZŠŠ(ÁÖRÁn“m»°ù IÊ8ã —úD™nzÃÌØTEàÒ/ý!þç¼»M;42æâœ}Ï÷yÎyßüñϯϤqÓ6œÖ0¡áŒ N{ñó³L2LÎùáÂy/&5\ðá|Ìä"“O¼øÔOü’†¬—ýèÄy>Ö†)LkøÜœS¾n4füèÅiÎvŽ¿®x1Ëü &W™\cBº/1§A×0/à*åz&¯ë·ôÔrÍ´Rã¥BY¯èµR帀;WZ.ÖDF@]2ô²ÀŽYÛØÒ‹‹©‹ó×\ =ÃfѬ ìŠeZœ¢㥼!ÌÖôÜ zù²>o²*Â?q;g”kf©XåÄ–¡W”û)z>/ÐÛžypŠ0ÐÌêD¡\[‘W¨³zfÙ²(cÙ0ntÅ[V]1 ¥[TÁ²¬šw éO½zk¥l­b_wµ¥Ç kYÌU ½jŒëe=gÖVHà°ÀžMóŒe‹ºuª²¸\0еf‡;_9¶lZyƒZFyL8‰S•êè(RCý¹& ”ÿõŽD<€}ØÀÄÒǰ NÀ1¥mz]¢ÙšcKUê90ŽÃ4’–`ÒÀ7¶Xöl¯aÁ¨pÙ× ¿þ¡~Æs„Ï7˜XL Š”@k-USKÕ›V~>e™ó©³ôyªRÑWÎÊ-ÛÙBmkºZmR/—"mÉÁØöqmŸ ƒ6í@4–y“º»U8ZIÍžmÌkÙbQi«’ÿ³4’RGZWÖÔŽ¿A›luWþÛ|Ë*eWª5£ àÓy¹R™.U¼E´L Qfp ô:µA`/½k*ï"½*¯£ä´ Äý¤O IÞA:Í“\!~"¾¹ÝOášy efjØ]‡'R‡V‡w¾ÉßduØÏ§xäÚÖˆ'×|B!Þ%Ú WƒªP4¤„†÷€ ÉìôÜQ}i¦/Î|”òºˆ÷)ÑøOhˆ±@Ddï ±Úø+®¬¡}3®®Wp‰—è¢(ïã§þß(²›ø7‰â:dqu„¾cAçL8¼Ž/8‡þµÚÅç‘ø QuŽòDïÃ³Š±¨šW.˜`ã¾ô/èVð=ëö¯"<¤r†^µŽ2 ™Dm»lßÈjã™$²O¨äó¸Fw®Ç)¾¾öPÇ+´ Ï+Dʆ#í/’Èx¨Á6€ ›½Äé1B˼M]…ªÉدŽÝÓ‰Po›e¦ØÈ>D2a£XGÿtT³…‰PÒ6–>w]t¿þL„®JY›@¡üCÆDü%¯ ÿ9¥¥å™6LÆ=ò6-¹-uÎ~ŠÜÎø3ö<‘­á_PK6.Ïvˆ PK7A"org/hsqldb/lib/HsqlArrayList.classµWÛSçÿ­Vb…¼Œ!¬påâ:B‚ÈÅNÓÚ˜DhÔ‚I,ìÒÖ^¤/+YZˆIï­›^Ü{z³“¶1ñŒ_x35xêÖéS=Óÿ£}èC_úæ¡¥ç|û!@^¿t&û»s~ç~VþÛÿø@?Þ‹ 3ˆ#ÏKAƒÅû¬†¹0.GÐ[ü†×"ˆ`&Œ"ï ¼8a”x/GÐ;Œ+’«„Q —/‹¼,ñõõ®b9‚7ðe '"ø ¾ÊZ¾Á×ñ ~þfß·ٖk¼”yù/oòò]^¾ÇË÷5ü@Ãu ?TÐ1<2š>?6y1{6;™M]̤_Ng²“S ”¬‚¦LÉ©º¦ã^0‹‹–JÞ†´mËœÉe§G.ަ3“çH`4ø"q(Øg­Ëq‡M×TpàÕ±ysÉLMg.513oåÝÓ Z+VÕª,Y#»Y›lÇ^°ß°&œLÑ2+„9­ a€^ÝAíq¨lÏÁL©`)Pã| ųӼ7å\3ÿÚ¸Yž4gŠ9M|qÁ®š…‚‚CñìãpLn‹û¼“!êœå25Ûãç‘f;ëêÄìä)š k¡´D–°©UÆzÆ×?ô`•Â"<$ ÛÉW,³je̲™·ÝeíqÝŠ½@AÈ{ÔHON4·”®TÌe¶¯Ç7'íñlÖŸrÌÏ#3KòëiÉ¿èÚÅT¦´P6+¦[ªˆè†)ŠÒ°íZ‚ Àˆ÷Œ•*s©ËÕ+ÅÂLªhϤ²’H°a·”#¿œ9ã»{¯"úÕ‘…2G‚BÄEC)N‹œe˜ãp¼^a¦T,Õ.9‚!œ/9®i;UÏã”N~BÇÐKñ¯Ôñ>¡àèÎûYkÎtí%KxÊ ¹š·ÊŒMš³Î’Y´ 1®kÛ,Æò2±9’pXÝtï€eEe-º³C¥E§PÝ…Õ^‹¡E»X°(¢mB*VZtc¥ÙØŒ<Óñü”—ŸQs ê˜Æ«”µØ@츎1œâóàâú9Ò:&ØíqÛ[ø…†_êøï¿ÖñÜÐpSÇÛxGÇIœÐð[¿Ãïu¼‹ ·tœÇŠŽÏcJÇðE_ÂE^.éediѺø¿DG¯1»JEÔ^G¢‚÷§° GÑåèÉ»n]'ÊZál0ËeË¡ÐçÇðØ“Œ)•Ytoóד¬+‹f±êy¦hVéx`OÁŠGâl®{¢¢bj•’CöO.—­=É­X³\›)Ù9ûëõ¬Íy«®== þ3jWáæ–«®Eƒ¢ÑdÄ|©L¨ Ÿ6÷PY1D;ê’ ,;O ¯ "†4µÃoÆyäò˜å̹—Ÿ—ÓäYß¹Ÿ}ÒˆÁú,öÐw(:‘D/ûèËÀ³tOáxíþqñý>þsRìîdÚ£Äó<>Ië§èfÐ;ýšPÉ»$¢w¡® Af<%;‰Q¡ý)ÁØþ3‚ļÃwZò–€ó-á4´„†ÇÏà¡5!2À`P¶ÐUÃE‘@ƒh˜`´@ï é>¦Zµ „?x v7b` ­0"}Óéõ¼(×(jAÚß2€z‰ûhœºÈÔöµêëh2ÖñTk3˜Nçu´l`ÿ¤¼Û—µ•’‡%è_àÁ-hdð¾v·Ñί]b ús×Ô­;[ÿä«Ñ›KLW𒌷瀎Pª»yAå:„ùéZd½€óÑà·ä.Ààj Q…ÒBÇ!d$P™¢À@Ó"·ž‡ƒÿoFÿû5å¤)ÕMçaŒHísdÈPò!bê™(ëXÁAŒö?D(ºz- PŒ«5bGÒ£®£íFá@ÛDƒÒú!eŠrˆD­¹ü'™ú·?4—ÇAβ,¬ìÉù%Î9™ûw/7…»^î˜UÉñz“’¸ŽC½;1kæøÂ>MEÐu˜ž_BVz²L~°'ùÍ“³²:û곸ŸÁg¥ûiçŽ ±–U1ü™•äçèÆ%vXÔ)¹¼ƒ°8o6Í_§ÎÝ@ûNÕ‡Ї¯õÿu™²yCȽ‹àÖÑ±Ž§{èü ú;.¨½n#Üû`[É ¯j¯Úu\B¡8B[×Ct¶Œ ’àºGæñá.º½{¦H3‚‘Mtk0†©žŽ³«gk¾µÉIØÈªtƒ%'j,Ó²U=å\ ]Å!èâ)¨°J•û^0¼oQWr×*–yÄš=¨G¸®á ½¼\‹ÑŒì¥aã&yNU´&ÐÞCÌØî%Ü€À5׋èmDxzÜÙú·÷º{5n¢‘µ…šé휓úNr¢hïd‚µÔ’á7©zÑäû22¯ 'úéÿŒA9Ä$BÔ(Ô¼ÚëSÅ[´oG~RÊ¿ -H$ïá#ž‡­É=–øÙP„t< ¬WBîW5´"+LH|lm·d#?W Äîò+[Òü›ð1òŽl“é©ù£Ûdú1éCî^•dú™)É­²·É Ý¡_ò£l›>ZûŽì¡Û¦›þôg¼ÞÆÿPKµk‚PK7A-org/hsqldb/lib/HsqlByteArrayInputStream.class¥UßSWþn²aIX0(¡hùá ±Rª¥ZÐ" 5*¥´El›…,°šìÆdc¡iûPf|më‹3¶3:ñÛ:£ÈÔ|ï?Ðÿ¥ckÏÙÝl ¾” ÷ǹßýÎwÏ9÷îÿü¾àM|B ãADñ>7Ü|À͇!\ÄdˆFS2.…Pqž\–ñQ Îäcn¦D„—ôÂ̰éjŸàS}&#]5„fy>BZóX±(C—qM n¶4?¯|3#þ¼Y))§® æÌ’alH7të$zfFz/Óú¨™Ñdš¦Rl45s¦”Í. „N/ÍiyK7¢ biœ´Ô¹ëãj~JÍҮƎ˜fVS rÚÓ{E Þ¶-[šm -a6\2Šú‚¡UR®§ÉE³`Ù–Iæj¨»bó.ª4JRÙ2ÊKLcÁ^:WÖž5U‡ñ €-cfÉ–K¦1¯ëyÖA’zR¬Ä!Ò Â´ôô^¸¦ÞTû²ª±Ð7itcaÐuziŠ%yã3S³%Ð^=ë„§‘c?YÊçé ZÆñF´¢æ(äÙ\Ö,j ö㼂.t*Ø‹v<Ú‡NY9 zÐ-°¯¢-ed´¥‰’51?B¹Í½\)³Å†êfßé‰35ký ÞF¿ SA7ÃqEX NƒÎ¸§âå"•žÓ<ʧaZz.ŸÕršAç:ÌÚK Ž2çM#ø\Æ’‚e|!Ðmú‹7²™Ù¾¬>Ûw–†ûS…‚ºœ2ò%‹B¬©9]e¹5Öæ²uLµT{¥9Q%«©¢y\µ)¼9Ýà:w²´£²ìH“nX#ºUœ2]§‡® Ë…ÎR‘9ز‰ÓMAŽôl­ÎêÞMçv–FMã¦Fµ@µÜæÔÏvµV%`r¹hi9®*Ž×œ™§K™¨v91{M›³SÛ˜¨ÖÐIïE qHô£Â¢gFâÚ²û.·ßg÷» ·¨=H³ƒðÑØ“x ‘ð?/‘|?¤Drã øÍ²÷t»{úá'6àÀ¦=1Þ‹§“먣lð9Û›©¬#Þ¡Íì2˜Hú“kH¯­‘Îmƒ»]ðUPGýPü.ž¡~ú)‚ÏýRDŠßGo"‹HéxDʬ!4ˆlP”ç)HH^þùÈÖŸ¤¶ ’ò>ñâ/k|Âë®Ï7&Ñć¢UœÑ;¥ü«eþhò°¨a;Œ>—íËÖ²•í» MÓÔp¼A‘v8’.Ç®­¯¢ôÕ:âRd(~ê')3!e÷‰g”¶2Mý‰iZ½"¥É|¤/¿ÚÎx"®_Š¥¨¸÷CÄkäõ䣞}·Ûò¹9}S} ›¬Â%Cü6QŽ·ìÄ0ßq—¯ãÕ|ß¿’PðëèÞ¡àð·ù[/8òÿ ÎvƓۤh¸m)/¥ã¤9MÕüŸü‚»‚Û9ÛnA4­„;–í¾;¾Vn¹Mï`ÐÝÖBÞVÏðu4ÿ²;„Öçaw®cׯ›°'ñ®‡õÛõYŸˆ®¬¡åÖêì0N¹ØV>õ¡gˆLïl}Š×žoAxèó„æT!ml)šæ´Ü«$ÛŽ+/¬c÷¸à(Ç÷Ðoµ7cOmòéûè>gƒ”z´ŸI˜û>½†ÛäŠî½¯’œ|]ÃÂ&s‰fÈÈïâX™è¾UžÄmÍ?£Ñ«¯“ñ𯖵'cñuò:mcÉa¼Ú‘¿±•Ò'Ûuôž{—ûyëJ»Ê¬+·B“G¿2ܼ}àC›“0·ˆµý¡ÇJOp”.Q•ÃÐêæ;䑬º/ÿYzL“[?>©¼Ö…”»qߨ _É{ùÎQ+Q†øHPr N¾í9ýoþ(à_PK¯çðˆ PK7A.org/hsqldb/lib/HsqlByteArrayOutputStream.class­VÝs×ÿ­´òJ+adÙ8’l·&`­HÜ&”üÕLœb%)Ц–¥µ%Z#­ ФI[Ҧߥ}i3 3~ÉC2“ÈLÃÀK:yî_Ðéô_èLªžs÷îêÃj&™©îîž{>çwîÕ§ÿùóÏà÷:Fñmcx-DoßáÏ 9G²ª#‹M^Öt b—¢Ž.鸌2o\ñ††ŠŽ>¼¦Ã‹¯ê¨¢¦Áf“M×ð:‹¯sÄ«n舳ö n²ø»ÞÐð¦†ï)èYÝ\[3« |gòÖfÅV dhçx©R²§ø'R¯(Pg­‚I‰ íZ¶sùËgsÙÜjÙ$d;qq†·†'/å®å&KÖd¦²±i/ÛU3weŠÌ4¼¥@Ÿ¿ž77ì’U¡|ßV°·»:{Ò_¯–ls¹hU)¥ øÈpv!ñºhUÖ9ŸÓMÕ™¶YS“.˹Êú$ù+UÖ[ü-”­œÍ† , ÙœµIe°pŽ…Ç›e•Í\…¥8ùq72‡qßg‹¹ªë™ßkn¦/g“µòf­HO!R F`жœÌì™HíÌ—{Q¶j¦›Ì‹ÖlÑÌ_0Ï~&Ìöèí3s³êˆ5á)kµ/mÚí¨ªfÍ$€Â¶Å…žªVs7ƒD­•nš‚ä/Lz/Yµ7SÁþn¨ïiø¾ÀaÖÁA]+•Ë\•óZ7íÉHݬÔ6«æ9˺Bk™bG°)^DðeŒG0‡3T°[Íü҂ǯöáIâ\?À#¸ÈvÏòr ˼ƒiøqïâ'~ÁÏðóák F\gÔ¹œ[°ªWr¶çVÃ/"ø%~Å¡ç5ü:‚Ûø‚hg¥œ$íÿ–ÃS¼“H)˜h* \3•‚y:°´6CƒW¨µä¾¿‹`IYÕõÉbíj¹°:Y.­N¾@¯^gZÛׂC»¸ßs9Ζ‚.ôi•.yÉ(ØçAB-ÙØ 4 ó•¼U :[ÔTòQðXÎgHÙ¬¬Û4=yšS¶s~Ì*ØÝBÎcï?³MøLÉ®9šiÃÕÒhA¼d->\å¹Ôij]TN'f­Ê5“R&NEkB’µ¨·ò´x¾ o?/äS).ߨÙ&ÁʱfÞÚ Ñ1Z,­^2óöT¦‹H @oûàò¨2˜Ý4|‰Îò1(ôôAåi »FeÒÓóÉ÷‹u‚¾ö†BϠч··¡|þ±FJj& =‡Œmøâ¤u­ÇøýàÇð(Ô ZwAi`7|ÒŠôqPú”>töa¤¥™£óí°Î,ü”#0&t¹‘NÔ¡N'BøÎo£ça3`…J5<­pÐIQ¨‚¯×_•®¯ÑeJ×#Î ×”¼pž6>¢Aãç~)Ô<‘𽇞-ŒçI’XùXì;:ïQd]Gh«ñ—fCPT½ÏÉx„åßHøÚ²yÆô(eÃ`šàþ‡F¢§Xq*Ò¦E€€h»q¯²0Y«1•Í¢F’ö<[J)II´d˜ä¼š…á{„å1¦ÿÖ œ¥CÏIn—P†{Úµ*Í}ávÍy§\Œ¼8 9BÌÝÛŒ´Ûˆ†où[ì ¢ý"Üâ,^”!žÜèM{Ý«ã‰-Zònæ~y3÷þJ¼„oÈýqÙÂ!öu?¸(ü¦…g"SÚ%Æ9:غ.…ë¼/·³%º÷|\^%4¯qš¹ÄC#.ðn€>AΗem#è–ýmäLo#ùA[}¯Ð_•ñr”³ÊH ÈŒuòޤcê¡ÃNþº²*@¬RÛO¤Ï¿.¤o™œp'åä=ÙrïÄw²_pôŸÞ4¾ÎIpÁ¿K¿ õEˬœ˜£ D|å„@t:‘¼‹/:U<½ÕøWò~ð˜ÿ°ê6ÎVÛþU…àLÌRÂÂn„´ìÖ `‡Û2}ÇŸ2jVLº‡Ô4 öÿbßò¼§¤Ò×qЈ×éÐÚA„^à¿PKì÷–|ªËPK7Aorg/hsqldb/lib/HsqlDeque.class}VMWW~nfÈ„0`D‘µZ+&jÔªmÔ¡#صhU†dÀØ!Ádðˆ‹®ÜtÙem~²aQΩâiO鮋þŠþþKkß÷ÎdòA”s¸÷Î}¿ž÷óæÏÿ~Yp³AtãB+¶!ÍËE c¼órIÃgAh¸¤ÏyÉð2Äe\ BÅU _ÑÁ ݘäå/×yù’—¼ÜÔpKÔC@µòe[`Ëõôãž·ŒÂl||úŽ™µO gò¥²/äÌû"%0 9÷³çÜðHârzâVj,5‘J¤o%—ÉÔĤ@{²X(ÛFÁ¾bX ¦BnüƒùBÞ>%  ì»Bv“ÅœI[9ÿÀ”w¤]Ë—‡çæíEù}ôdl#ûÕEc~˜¶ˆ+0kÚ#ŒH`ëÀ¾¦€‡ïgÍy;OöI±§ æVè$Ð5j*¤¹œÀ¶ÔF"#UÊ,¼·)¹™º¶’9W¼gJ ”<å\8Pºš¨!_5ápèäzÙ’µL£Äá˜Ï¼EœBçwl„ÈÕTÁ6KÃJ9™RÉobi/™äIÒ˜7²y{QC鵋‰RÉXdï›{È“.Ã.Š0żXšß.ßµrÓq+?O¹Dr;`3v)_˜mLŽsK~r,aYo3FAØ>Ðh Y´,¢RB%C [,ØF¾PÖñvé#¢£ò»Q¡Ž^ôé˜fâNI\°óV|¬˜YÈÞ¶Ì9³`{Õ¢c§tÄq\ÇiìÒÕ‘ƒ©cÇvWuËŽ/Øã3g‹ …\¹FCçt cDǧ8ÏKJÇ +e= ާã9ó»tÖ(›iÙ•r(ºéx$v÷™Å²mÎ ´œÙlqž²mR5MÊ9•âŒû •a•)ÀÛhVrš+>&õ±#.÷~¹÷a;í;äÝNâœZwÓÍût'hBD•ðñ¢DCÁß ¾@Ë øOßWb3í,Ñýþe—üöz r;“AS— *Ë’i€¥àk;Ãû%Ó,qÐ…ÐëH´ý mrßé“møŽüäI+›£ƒJýï÷´b"íáæZ5÷.=$ ÖÓK»"ñ‡WÑ:Äâ) O ƒþãdÐx?ÝßHËŒî‰àÕ h›ÔqªŸí?ÅaÞXßÚSìá½_.êß÷ç^AN2Ð)Šÿb÷+»šc~_…¾)Y•7RÉþ ßùYÖ¿â¹€²i§ÅÞ:è‡éó¹¹R(!œ|‰Sj:rBu5öªÝþЋ÷YrÀÍ·e-]9‰ŒƒwŠ‹K¢$ä~G,*×È_"-akÅݵÇÈZŒUS”¾œÔp4T—¹c¢EÑFD2ª¹Nð9Ø6EdÞ‰h ó<¢€KTtÛP})Ñ€r[a”ÂË€ŽÉR¨$ßõÍ«I]µÔåÚbí¢ãGžÞNÒÊzýÑUZ¥?öè×]»#Ò®W+ݰÝñ¥rSç]%cµê¢ã'ÞðHs;sï9¡SW¢Nðün•Á°[ï!ÞÃ"óPˆ¥7¯Ô1°Žx vñNºš-2ÆM•R†"¬ü)Î0°È”l¦–µ'hs9·jc?RŸ.Çþ@g̹x‰öïøê¡,®ùª^lFË:å:vˆ¶×è|M>z:–i„8íüWmÿ1ßãjSÖÕtµj¿:uóäNhl⩈×ÄïV5⪒þEähaY%’S«³¢¶ªIQc>j»½ZÛª…Üõ_ *ä0z¢2J­ÛSçÝix0ü=Úä€{ÂÕAµ‰[Ýž’ ’q¹¡H5Ø4tmÝ¢fŠøøùvóü5E›+(˪ÝZ¡2âCËmz¼!óBS?vÝ÷ »ù^‰U¨Ê«Jøƒ›)s_2T+|íë×p†.8ëb™¥J`_Ǫfœâ{NKÛ‡E‰ÔÙßáØ4µ]5«Á·Žq4”àß!^ÓU„ä¼%2ýBiBÞ\!Óo—“`Ë=ÕŒ¾¥Bl6IV±µBmNïr& þPKEºYË PK7Aorg/hsqldb/lib/HsqlHeap.classeŽ»NÃ@Eï€ã…ðJ ‰’Ê©V¢¥¢J¤HHtk{d6¬x×ði|…X[Q"Á4wgîÌ÷Ïç€kœ œ œz‰aUv£É#Ah;Í+÷ÞÕO„PÛ»Æ_ª4%Œ£ÅR­”4ªÈä}¼äÄÝ´kýé[•ÓeaFcBP1¿FÑäÿŠ÷­9/Wì1«?¸»6'\”u&Ÿí«Icit,g>±ªƒ¿„«mkn gÊÜÖY“sá6Ï.·ÐCS8óf;hCþ€×ÂNÅZ÷°ï¹¾§BOàÐ÷ŽpÜÍNÖ:À°µùPK ˆ9lï]PK6Aorg/hsqldb/lib/HsqlList.classmMNÃ0…ßЧüµü„8ÉÊ[–¨‘"±cÁÎ!VêÊ­!¶*ÁÑXp…˜X]…,¬Ïã7ïÍÈ?¿_ßî088¸ ŒT].³¢\©­’VmùT­ôk¸ÏŸ ólàý…mZäÿuBÒêµÛjnó]Ûí`úQ¿X¿…vfݘ±7Ÿ:!5A·*¸–p“å¥k¹ôï¶®¤5•,v"§\õ¤G¾–Æó&³þLÂu¯ùÁYË‚q›„@Øã3â_KǼ öÈ$R œìx€ÃÈ#Gž`9Ã)'àPKÜ­[X߀PK7A$org/hsqldb/lib/HsqlTaskQueue$1.class}O=oÂ@ }”£i(3bêв\aF]RjUu¿S=9j.á1UêÐÀB¤¶–žíç'ÙÏûÃ÷€1z!j¸QˆÚ Bc’qV>j÷ï„ú4O¬¢bB{Æ+—ûŒÓ…-×y¢Ðp…a©^ûO—ÄÚe±~–öÍø—ÊVönD!š3ÛbêŒ÷Ö:³5ÚNõ2ÞØUIèý^+f;9Ý¿´äñ)ßq#LIוJ§Éð ´Ã)Í?¹uæø•\K®#”|+E ÎJóPK¸­{®Û,PK7A-org/hsqldb/lib/HsqlTaskQueue$TaskRunner.class}SKsÒPþ.„Â-E¨Zj­¢Xž-õ¹¨Ž£ÓÖiGÚN%>w"¤ $ȸ÷7¸ðȺN[GâÈŒ R⹡N­Íâ|çñœWòãçç/®àFAÄTpLp“BœU1…s Î #.Œ Aȸ¨’™PpIAŠAvj¦˜c˜*4ZÕ|ÍnZ•RÞ2KùeR5ÝÞÚhmã&1o™uÓ¹ÍOOM?bƒÁÛj×I¦„k¤èèå­Uý¥¦—,cX_AšúãAˆcQŽ,r3˜Uç˜Ãe†È¦þJÏ[z½šЮ×E>§¡¯r\C”#"ÄuD’Ç5–šÈ7Z êŸ_¸`é¶mØ áÃrë¥M£ì0D]Z­Õèˆ&+G5L»Xk;•F‡–Àž1øšÃÀÄQ \4šîžÇÿcðW çžÙ²©¡±Tºðw›”̋˵ÅõÇkÚÝâ}bþݱ|eËÐiî ‹4¡W§/ˆƒî ‹‹Ð‡åDg “÷Y§Èöª™ì.Xæ#<Ûr˜L ™|o2;`;ð¾Ãó¡&=]ýv íÁ÷r!×ï¿–ëÏô² ¼Ç¬K»ð‘àdu^ÊõcR¯‹Hö;BÙOÐ^ ÝÁ[ÁÛƒÚÅè¼ï@ùzÛÔÉHR?Id\\Â4B O\^ C²ƒ×.ÒÎHÞALëà$œ)8= exÈ¡`MºQ2~Ç÷!{öZ!5HïÕT ýnÓ~PKXÎØ;«PK7A"org/hsqldb/lib/HsqlTaskQueue.classTmSW~n^ܰY­@A*FPó‚MÓ7[¡¶4X¡¨&BÓ~é’ÜB4$¸{Sé_ñøÅ¥-a¦ÎÔ™2SgüI~žs7lM“ÉžsïyyÎyÎÙ¼xõç_>@©gð™ × L›ÆŒÏM„1Ö¾0Á—|˜åÇWrì>Ç›ìøµI×·Ø6ÏÇ6|c`ÑDŒ“-X0‹¶{ÿN³^—Ž€µÀ2W³]Wº§•o+n:Ò® äïÙ?Û™š]ßÈxwÓV˜¿[œ[Y[.Îb>m¯×$y™U·°ÙT•ÆÃº€ø^ ü )›R`4ßp62›îƒZe=S«®gæI“då(ÕQ_²—'7p›3Mþ× nHU|£þX"Ù«ƒP®Q¡J¢åš´}ß`"¹*p² ìòý%{»È}Ð,NÌTëUuC{P†#]e;Š4¹#ËME™†½HH®jÚW<æoî”嶪6ê®o©`·ÍÎìOJ:º#.¸ë6×tYWÎ [[²Rµ•¬ý"™)×tiFqÎÂmÜ!×®~¹ i$Îþñ. .på-éæt 1aá<Æis^ç˜=2ŠHX¸‹U WYûÖXûŽË9,\VcÇùt¯¬ß“e¢jàÍAÐÎu]ªê–ô§!0äJ•kÔ•ÜQú]È7ì ¯ßhçP;,Ó¼'ñı˩}ÂG{bW*yÛ%m¨3¥Wñ4ïTXo¢@_•Êpœæ¶Bœ^äaúo#ÄÓ%mŒ $9Ǥ“ŒñÔ´¤I4é4‰KÄÚe:õ“ŸúâWðgWh›?D€¾À›E ÇåSbbW‡EE´$é‹R<´Ÿ Au±ãXj¡ÔS„Kû8±ƒÔH‰îúö`îjXš4¦zT}¢Íq^޶ùz;é%®ê9.°×#ŒPN«Dº¹“T![8µ«ssTè$©ï!C=q›dˆäe/Aœ„QZú›Eº…wÖ¦#²˜zæÁž#v@¿¸–ì‡t hX“\>ñ~l%S¡=D;`Zz¤½Ñø=çM™ Ýh=Юùh6Úµ#4ñLo ƒo‰=JãÉRŠ,1–õ±Ï 8xH[ý:xŸúàÃzQèSÄhɆ~GÿÑbð“9B‰ÎRXLßGþPKGM¼È¶WPK7A&org/hsqldb/lib/HsqlThreadFactory.class…’]OQ†Ÿ³ÛöÐv‹åCëÖVA–]“M¼ñÉ‘bTñrÛ®¥°n¡,ÿÜb¢6jâ­‰?JœÓ–Ä”Íffvæ}ß3sfÿùþxÈb æ ä¹m¢j^ÌM­@–z‘w5÷4óš…~6ÓnºÖíµƒíƒý¸ÕâN#ØØîEaëé°¾¬È=î$tEa»K›ŠÌ“n+RÔÝñ<Í'ÑûaVáºk;á»0ˆÃ¤¼“ðœè9þóÆNÔLsãÚPTþ‰›Ôd×y”,Ydº“?"+±t,öŠ|McI9OõQŸ0©—GõŠÔ-ñE¯åù_±·NA2Ïô{ªzŸÉx™üAöµß'wDɤüoh‹ãkF¬ÆšYÕÌR7×6y!¶øYÃX÷ü_hïH¸_È<øGõ±N¤y[SÑ\—¥¹q"•3)KRÆ×¹É­‘ü”x3hÖÈFà/PK%]*T°$PK7A#org/hsqldb/lib/HsqlTimer$Task.class…S[O[]›i™¶ljQ´ˆ¨eŠV¼¨W¼Ö‚¢ ¼˜¡Àè8ÅÎTý!¾àƒ¯ç圫FIäÍŸdâeíép‰Ú8É|kö^ß^ßmÏ—ï>8™8vb,N¨¯“:N)<­ÌeÎ*sN™âÇDyœWË š‹Ê\J¸¬Ì“±ZÝuÍyÇØU|d>3sŽé.äî…»íKVÍ®VDA ☞Op­„xÙtË–ãXŠÍõÃ'ußz!еMðÎü#«ìO¨€–cúö3l÷moø¸Àžbµ¶[ôž:•ùœcÏçnò³d?±j*~Þvmÿ‚À©Lk·ÂŸr/Ì<`®“ÕŠ ÖÌM@˨ÝÎû¾Y~ôHt¡[b—ú@¿Ž7QÐq[¢ˆ)‰^ÅAFbHéM#+qwöµjâpÉô³_M·\תMrÞžå to¥RZ¬UŸ7¯ÌîVZ,×§ÌLݪÓ-^Úún9ÄáM/N}èï^Lʳ\ÓQ;ÛÆ6Ôúž‡'Ô44·ú\@7+•f¹ç2­®Ð_Äp€U„ÿgŒ/gõp,ö†Ø"§JÛ¦¦HL©ÉRjî\ë|Ó„ &pZ 9fdÆ;´Zšñ‘Y.ˆƒ ´ý‘t£7Ú@Ìèш¯¢ùpî¡T…R*Å1-o¼Atvê3A{…„™ÍSstý_ĦG×®í]F’œxCî-:V™kœ9ððsSÈÒ²æoè:]Õqø+"Inòº…oð FìâƒxÙõÿ¦²ë£k¤ttBHR'¹©ÙñƒË6#Ôų²¡èNžÄ(ÕäÿAƒý#ݾAűîcBQb‡‘n@Ø»ÕÐ)‡ã¡Ó SSyS#–~¹´¡s™š+iµõò5wÒªÕ+$‚V½Ç‚®èø[¤V6ˉBK‰\\ jkc‚ã¸ÊA䉷 PKKR12ØPK7A(org/hsqldb/lib/HsqlTimer$TaskQueue.class…S]OÓP~íZ6 "ãKÔ­§¨¨|ãÄ€™ã¢Q¯Êv„Big×Ü{å?ðÖ ¹•D 1ñ#šxáßðÞ`Œøžv ¢¨=éyOßÏç}ÞÓ/?ß¼0„k4à¤ØN…Q„Ø’*ta(Œ „Óa2'"ô™Žg„!ç”1Ó6½ †öÄ\vÉX5ÒeÏ´Òg¥h¸†ç¸£É» rÆ)pÕ(rFi™Ðæl›»Ë(•x‰¡/‘uÜ…ôbé±U˜O[æ|z–Ž9s…»ý"ÀÏÕ7ì<·¦-K¨(JJuýÏÈ/ß0Š9cÞâ><ê₊aªFXDÑÄuá™y’çEÏtì’Š‹ µEΗ<½‰ä0DKæ‚møÅ3>‹(©ËWœU¤Qʶ¨¨á5\Âe #Ö0Š1†FŸ%˰Ò·æ—xÞS1ÎÿgY ˜Ô0…. Ó¸¢!ƒ«fÐJœý3ðv™—‰øðsç!Ó®k¬Ïr£HííÃË-ºÎš`“´³¿Ã&*ºöus¶Ç]·\ôx¡J/†ÎÐ’ø3Ø¿‹~ÅPÞ)Û›c8ö·n¨‡ü>ÛìE¯&EÕ™¥c »@&%CŒæynÅv<óÑ:zé¶7@<µôÒ°ÀÐD§($Z€ªw ì€m"xšÑRqhF -@ÑS;¨Ù³EkÅþŒ¬!’“úý›õײ´Éãºü¡-Hº´yðÓ"#$Úä÷ÒD¼ó¢©øÐ(òÔ§ÛØý¶IidÄÑC©zÐïKâˆö$ä]ú”U´L´ƒ©èØ¥_T"ŠNücß#¯8º(Q€;hLÑ»·Qàî¦W¦´=´zÑWé`Š"( t–†>£=8¾mDž£NßAݽݯUõ«*8™b»)Ûñ*_Iª*øŠ¥÷—Ðüx}Úf5N‹’诂ˆ‘ j…s¥„`âD•覊Gh/“È«LHAŠF)ÓS8íPKa÷/8çõPK7A)org/hsqldb/lib/HsqlTimer$TaskRunner.class}QMOQ=À# R­U mù0Ò­Æ ›š`š´¤ûÇð#Ó¡«ÿȵ‰mÓ.êÒÄ_âohŒzÚ¤¡³xçÝûî¹÷̹×w?xfE)¬(a-2ždƺ7ž l l’ÑÈ kmÂzw íQøÙômÏíÛoøÚs?ª`—«ö\ßö ›õÅe„Dg2P„xpìóYשìûH:ãCù©'ûžx.P5a c„%P3ñ/9oâê&–a™hÀ"Tªõd8~wìû* æÆŽ'ÃP…ëH~‘¶'ý¡ý¶¤œˆLi’ÖIJuþ»ÿ$¹½Q09™‘Ë‹X„”¯N£·Ro,´nÚžmN»ÿê䊌ã)ðp%¨ð’S ^+Y–v”wC‚mÍr6ÇQ‰ã£Ñl}5¿#vý‘vy^ã0ÆÛÍ Ð7Ä»­+$ϰܺ@â–g÷7³'Îfç×Ëóiç ^ô§HXásK¸EN ÿ™ Ä3~È3E°¨MYf¬ ñPKìâ…Y¡³PK7Aorg/hsqldb/lib/HsqlTimer.class•X \çÿ;»³; ÈájPÔeÑÅ€$\A4Q¨«mÆÝ ¬»dwV mÚ´MmÓ¤·=°Iz¦ô0­$²˜ÐÆmlÓ6½ïû¾ïÛŸ)yofö‚~òïýßûÞ÷Þÿ|úÿ< àrüWFî’щ»%¼I†oöÐÊ[$¼U† oãÉÛ¹y‡„ã2d¼S»d(x·„÷È(ÄÝnLp‚1Þ+ãÜËÓûXæ}ܼŸµ?ÀÍ%|ÈËðâþ|lÅGx{’m~TÂÇÜø¸ŒJÜÏ}‚›“n< c#>鯧Xè/N±ÎƒÜ<ÄÞœæfÚCM‚›žž‘ð0ë=“Y7ÂÜš>òòY qÿ8/?!ãI|–õ?ÇÓ§¸9ÇJŸ—ðvüi _”ð% _–ðŒO¿;²;®Å5Jw8¬E;u5ÓbDÞ s·'Î[$n¤Åkz#ÑÁÆ¡Ø-zðP£:Ô¸†ý¡a-Z“m!}#Cíâ:–)¥•ú‡¢šPÒ{X=ª6êjx°ÑZ#¹ÃmSF$:.`Õ|üþÌ}ö&ëŠÁÈhX€°_€;íŒÄÃM»¸¶„Â!ã_í^ŠAg$HG­ö-ŽË¢}†8²SéWéšåg¨ "Ã#j”`Öû2Îpý¡ÃZÀhY¸RKnxÂÚhòà¾L-Ž ã·Ôæ ‡gP3’j¥¾œ"RT‹j”Ž+o h#F(¦Ë.ˆ†´`\×Úo6ø¢j}=—²j»K@)]BÝl{7Bzc—jh-ϧ<‰sƒ E‚¡€ªëãŒÙ¼3§sûs¢zs¢Z§¬óõ¼$w,•9æ°Ë.M®vkÁy§¯P*Ôp@Ó”å¸vΘüP¬ÓѵàE¤ö›RÛBcZp!oQ™Ú ]š®Ž›<Õ %@¯3úì3nM.Üùñ$š¡ì‰i†•;U{rD…¨Ä²ºKË´*©Á Å›sgRÅxQ. €çtMµ €HŽ‹•¬X°Õ¾KéáQSy›ÅÜCÚ[ºYÝ öb€›}V_šÄXò+ z°CÀšçÁ_,ÿU½Ø©àì°rQ%·ãN âübe˜¯ ¨H¯÷ÑPx°#Òƒœ½…Ûûv÷vuT™PUm ¾Žo(ø&¾%áÛ ¾ƒï*ø¾¯àø¡‚áÇ váz{Ð' 2ÚMù7¨êD_†–¢ò'Í”­­FÔ ÝUÁO°OÁOÍø-jƇµ°‘‰µ¯½ªµµ*×uoÀ ^×P>ÉpzãgŒü3«¶´VmTðs¶ææø¥‚_ñ(ÊÁÓ_£OÁoð[·²javj³×¿Sp~Ï£?°Í?*²öŸðg*߬°GFÙKaà¿â˜„¿)ø;»ú6ðO†úŽ)ø7þC¯MÆÙÃD(Ñøˆ¡SçVÐ Xv±ÛϺs«žˆ¶Óîwšï†J/Œ€Ë{,÷u÷æR4yfå‚×+傹_‘û¡—:2¢…©œ2E¬4Ìâð¬ÌdªRcCÖÛIµGZqv¨ùôùFd»6f©2ÿu/Dd(#’É~ÒRñÖ.uX›Ç¡I7÷ZÌÖ¥jÜ‹¢o?/9íWÐS¬ˆP$~;CŒRhw»®syÒã(…bízè¨u¢dO(yÛä^”hØ07]#6y =l¦‡Í”ùr±¦€+¹“‹ñ%Á­¾¸šEz¦M:mg„\3̹ވjòÅòÌèdìØQ:ƒéT#švÄ"ÚŒíÚ0]f R…³Ý!]ñ×"S3uV0å(û¨f!ÆG¸Ä“¯ÅžžÝÚ½ØDŸ£ÈC}?»PÊKßñ¥LœÔ‹ÌVæœ8”ú.&.êÝ\UÔ/‡À Ní4+!z—_˜0þáý{?'Iõþäùgá(*¢¡8 'Í\4–¦áö׃䟄X7 Ï”‰±ŸÚµÈ›ÃzäIx‰„$œ£åäœúƒæ:^Š—ÙwÐ$êëƒLÿÈï¨O ›œÕåÎã÷@ʛĞ€ä ³âÉ”Múr«EQn£„bÖµ¯¦/zõ ³PêfP°³~…3XRR”@±?’3XJ£J(«(¯?e¤‡(L13`NÿiT$·‰)J¼½‡lðv m/›@Á,¼%Ëg°â,ËŸÃ*?õúu?ŒËò0 ^O`å$d9X•ŸŽâj4óV鋌~oÆ mi#…I¤~EÃ96S9PR5ƒê³þ3X]©6x ¬9•B"§ S8•ô;„s áp\|uIœÆ©ÏF­K`mý)]€“B¿Ž^9¦“f¿‹žWîÐãtÀ¤‡S86; :W™Ã xè™4w)£œ˜£ÐºhUÅôRA† xžÙ;æhäLIÏÂ'ŠçQP2Ç”fÊwHx=ÇŸþ¢°ïj™yS€ò ÚÅ›B;EòsÅ7f±ÿ8$‘üb¸üeÁùÝAi¤€ÿ—«ÈE}7ÄçPKÞ'Ï lPK7Aorg/hsqldb/lib/InOutUtil.class­TßS[Eþ6ÉÍ’›[š I¶”ü@Rj ZZ”¤‰ &P PST¼I®pi¸Áä¢â‹/vÆg§o:­o¼´3ú:â8>ûgøgt:ų7!?hh‡“™»»ç|ß·çœ=»ÿ<ÿã/—P’1€ ïâ=W1ÉqM†×e81%>ï ËÓ2dD9b2ÜŸ8GBú~¿ö“ÑeÜDRÈ͹„-%#Ys¸Åñ1Ç ;ý3{pdw!¥öà̆wÁÓ#´YW¸ ×oVD­ô0Fêô uúÀä,…ï&¾"ø'Ò#Utÿ“M¶“8¼MüQDêü>H4”P¸žS~<Ák_ØoëxáE-äPØ4z¬Žþ‰ö”iÜð:îùŸ çÇqÉ+ýÙuÕéšà>î¿ÿ 2¶P¿ÓèÍŽ»"KW^¯ëEäãÚýpÓl‚ïÀíãdVkäŸáôñÇB™@5ñýGdjœ@¤çèa—è$.3îzŠ“‡"}çè:ø:evù¨:tD_yi¤Žu8Ý^‡¾ÿ³ãë€ÿPKÚÌPÿªPK7A)org/hsqldb/lib/InputStreamInterface.classeŽMnÂ0„ÇmÀ@¡À Ø„•%ŽP© £J,ºéÊ &˜š$MUõh]ô=TÅsÞŒçÓ{óæïÿçÀ cŽGŽ!CTiµb¸Ž§’¡÷ü•êÒ›"w#†Vüö8'•2ü"÷nJ’x>3tÕ§2V%VÓlj §ë¤W†¾Ó~i¾õ‹Ùœ4;£4J!“¢ÊÄÆ}ØU"¬I„Ì˽_z굓¹×ÕZ¥{¿¥[ª<‹d«SZÖÈB.N½Û W¯ÑDä[ä‚¶kÂ/H§Aºè5ÈÍENƒ¹ÅjЇpþPK£zÿækPK7A'org/hsqldb/lib/InputStreamWrapper.class¥SASÓPþ^›6MJ  (¶©XDEDQ‹8ppÇCÚ†imƒ:Þ™ápRn^ñÀ ”™Á»¿‰Q÷¥±€E/æ°ûÞî÷Þ~ßîË÷_ cVF†|?ÝOB+®s3ÌÍ 7qKĈˆÛ2$ p‡û»ÜŒ0Æý¸ŒîÉŸàpÇÜçæ7ELŠ˜ñˆÁc”"³+Ú[-eRi«¸nÏÛ%][cLcͰç:›ahXÒí첞«Füã†eØ íñsÏ'„©BŽ r Þx"ÍÐ8okÙÕçZñ…–1))O¿ÏêEÛ(XDÅ5ÉA"ùtš¯„òªQ$ŸI‰ fõ /kʺs-•RʺCu–s®ây4&JÐÝH*èD—‚(7Ñ!bZA/úZjRæj¼Úœ¨©Yù©3¬üäºaæôCGÙQ³ vŒ¼=1{YéVNÁc<áæ)µ/¦ §ö3^i@ÁÄ$Ч@E’¡·Pʧ–ËoÌ\&e™Ó­|YÒŠE^¬é„Æ\fEÏ’¢þ¿K[¶^ZÒ²úiU'iš ¿Ö¢Á º<%p,Qr5ÓÃè¢æþ#° ÕC8^$D伂 Ô—Vzúô¢à¥?æþѤu¼DùnôÑ®ò­ê˜†g‚*íç&÷áßuÎ1>YBqü;øüku0{¶>ÂçÙ¡•¿q¼s£5òZUwŸ[ŽÇ0elìð]nÚÜiš/k;¢î—òÛ6…ϰtZu8E8o4H=ŸÚ6iRPvm›PËu‚öñ®h»»t ÕòÖÛ/8&7}^K*_óšMõXݼT·tœÁY)dUÜa(ÛÂ#•Â\ãžMÊ âÊ‘A©á”^qÑ-ÛÜó„§ã.îÉö÷U<Ð1…i†™Z_½w|«-Ö?ÔEGêб€,CvÔ¨rnJ#ムuÒ<†ô‰77JMÆ›á¼q|"A’²ð߆:”¶å%šuv\£ë¬ƒF–JIëé— Ñ'…s”MS4½)[XþVè#òòE‡Â…É@¡H Z-|«ö ¼Qúˆ} Y2:dåÉ&$×C|?$.âÒq¸câjµÄ¯¸Œ™1ÄìØs¸2†ÈŒíq•\;$r¡–ÉBŸ *Ÿ¡D÷hžž1D’O$A—ètõÚÀ˼tv‹b ¹™¤˜[À_PKF•˜É>œPK7A)org/hsqldb/lib/IntKeyHashMap$Values.class…”moÒPÇÿ— ¥Ó:ÝtN¨<8;çÓ ŒQɉ3&j0ìÝn ³´Øv‹ó£ø|³š($.Ñ÷~(ãiW6 mÚžœû»çœÿ97ýùëÛw븗B+*4ä\ ¾Š*J(+¸®BAN%¦xVÜP°¦à&CÂïš^~ayÓq;F×{kµ›†e6ší?{O¸×}Æû"ï›¶é?`È&£Å:ƒ\uÚ‚!iúÂå¾ã2,ŠcÛ¢E .{æ{â¥B±F»ZŽísÓöæ ›Û|—·;Æóæ¶hù•â¼Ý¦’èýȲ¨ø±’ªŽel:vÈ'\Ñsv)ƒbz½¾¿梅™—>o½¡²_ñ¦Eëñ–%¸®Ö5œÂi :² ÖVÿHáQÙÂxÌ=©ÎìÚ‘b}Ü¥Õl[¸U‹{žð4ÜÂí üw5ÌažañXí‹Û7{bã]Kô.#Ë›Ôû|[;‚ú–úÉö1,ü·U ™Ii2á‡Õ3œ¥yÇ4Ç•¿1¡²ŽÌ$ ¤2Mç—&¦ëÁè„§èÑq†¼³dÍ#F7 –Ê_ÁJCÄ>#¸¨(œ‹˜eÈd³¥/`ä×ÒñOKýŽØ`OÀ&n€Ä~DœÇ…#â0còJcˆäˆX˜J,bi ‘™ã"©9$òQ¥3¥R È!Kû!t‰ÞqÄÒ‚NÊ¿µ©£N] zCÙ$Šy•z•¦ÿ‚üPKhê°3RPK7A"org/hsqldb/lib/IntKeyHashMap.class…T[SÓPþN[©T ,¨Ü$°Šw®¢„«2#>¥m¦B‚I`ð]„O>úâÌtÆWgü+þo{ÒPVíLöì9ûí·{v÷ôëÏŸô㩈Z\Ãu®õW‘¸Á·7¹¸ÅÅmn¸S»¸W r1ÄqÃFDD0Ê7÷Œ‰ˆbTÀ¸€ †ðŠfl냤š¦nOšãðmxF¹¤»¤løJݬeg“kÎ #“J¹T’Nɾã$ÎÚ',ÃÐÓnÎ29l(gæÜ† Ü½Âš°2:-²ÊwâänZßâHGÀÂdyÀz2ήk;ZÒÐÌlr!µNlDYrµôÆœ¶µ¬¥ " nmºKVKÁåýÓ–éj9Óñ®Îã”q\¥”m}ÓÚ!@õ±Õ¤3Y#…{/[c¶­Ñqƒü¼ ÍŠ€Inë._¼–RéªIHà"%<”Óf0+á º$tC‘Є¤€9 óX X㉄E,Iˆ£‘¡ý ½jºt‹)ÍY£všÌC,s¦ ÿÃKó¿Pšײõ䏿èEsÛITºlV3Æììö¦nºÅ9`ˆŸ áê¶F\ ‚¬ªê*Ÿ›*š“YËÚØÞ*´EeˆZ^å½Dýùˆ•i 5UËdìE¿Åòt)¨ôdµì@5ýµ… •¹bÞ‰Òf_ŠH„5Í™×w]ï…Ð|…LoS'— Ù*—Pn Zé¹Çèß#@øZLR%ƒf’-´‹‚Ñ*(ÑÊ<ؾ䀋dà€zTx$UJ"æ(@.Ñ"àeúZÑæ³õ4Hk’8Dp¸9ð¢ò¡æþ=¶ç·“ ƒ}G-£]:}Ï:垢’xÝË(NÅžŸ »©%vžJXéÉ#üÞ·ËÅèœ#às0:ÅAo¥„#‘‡pÌÑC™ìc”EˆÖNå•G¨b˜ ŽôAdxƒÚžR«–^Ù»_ßö‹WøI@‹ÓIW}º>¯H@#UAú‚å"Ï”<Î@âG'E ‚ÅH¥]Ƶ¦àå®çH§£×zÿzQ’u¤Ghm~PKο)%GPK7A3org/hsqldb/lib/IntKeyHashMapConcurrent$KeySet.class”]oA†ß…¥ËVmÕ¶¢¶ù·ÖïÔ•4‘XcbM ½`[—]ÜÝ6ÖŸâð¦š($6Ñ{”ñÌv©miJ! “sž93ï{f÷Ïߟ¿,âÑ’ÈjÐ1¯â†ü/jˆ¢¤á&Ê*niP1¯S–CÅ‚ŠEwâ~Ûô² ùÇmmïƒÕ¬–Y7ª¶ÿRl¿à^ûïV»±éºÂö—hÍcÓ6ý' ¥S/*¬1(§)¦/\î;.Ãt¾0T LÒ6Šg~">š/TiUñ}nÚÃD~eƒoqÃâvËx]ß ª¿N`Kø ¹ã²Ã!Ây³IZh|fY ™!-Dz5;(wEÇÙ¢©¦·ÜéúÛÁÑ(1¾êóÆ{Òû–×-ÊÇ–àn]Óqgu¤0§â.CùÀ©Æsî‰Ð®ì`^Ý7(5Ò«¶-ÜŠÅ=Ox:îá¾,ÿ@ÅC˜d˜ú¯õͦí›±ü±!ºR‡ŽYÌ>Å MËRpUZLRGmdH©p3'ɤ^R£ çó{©5³‡z1Tai]^§ÜéTà]{Ô&°TJ¶ƒž~)œ£hšf“ˆÐ—¢ÅÒ°b‘o:.„L Í€ô.¢µâw°ZÊ;¥Ø×%óCV®‘lBr=ÄwBâ".í{;&v¡ÖúHü‰Ë˜AL¬1ƒ+#ˆÌÈWɵ="j/ö0öªòJt'€®ÓC$ùTt±ŽW¯ ¼,H÷h·(rÈ“›IzÝþPK©Z—©HÄPK7A3org/hsqldb/lib/IntKeyHashMapConcurrent$Values.class”ÛnÓ@†ÿ8q\0…z Ð6”(.åtQ„€¨EH€‚Ò»³J\;ØNEy^€›^€‰D%¸ç¡c×iiMmy½Úùvfþ™µýþþÀ*îgÅ‚ ‹ ®…ï¼ E”ÜP¡`Q%¦®,+¸©`EÁ-†TвüÜ C~ÃõšFËg7ê†mÕŠ<;O¹ßzÎ;e×1»ž'œ`ö<°+xÈP:õ¦B•A.» Á¶áñÀõfò…!±‘ÂȾõx)_¨Ð.Óun9>ÃD~c‹osÃæNÓxQß&ùß$7”m›an(¹²kÛ[®ñ)O´ÝmŠ Xþz»ìD±È0ö*àæ[ðš×m²'M[p/²V5œÁY :æ¬2,ÿ§´…ñ„û"ÖŸÌ+Šõá%­â8Â+ÛÜ÷…¯á6î„îï*¸§a“ Ó‡j_vÀj‹õ÷¦è„:4\ÅüÑ,NèB®Êí®  ¦ýx!¦þ[4†Ù“ÔRš"ˆt0œ§ÎúŽ©£ GZ2äam3<&K§CʳtΩ[`ºv…¾„ =:ÎÑê8Í&‘ P‹¥o`Å>_^”.ÄÌdšã{jů`µä7RÉÏ1K=ˆÙpOȦC®‡ÔnL\Ä¥b?bzJ­ôϘ˜ILcf1;ÒÇeR³OäâLÇŠ=d>B‘?A–v#è I$²B‚NÏ¿µ©ƒJ]kCÑ$ò¹DµÊÒÿÃþPKH?ÖÜ<zPK7A,org/hsqldb/lib/IntKeyHashMapConcurrent.class¥V[SÛVþŽoÂB‚'`“&„cã¨!mÓpK'-"6¤@½ [5ÆŠDeÚ÷öOô¥3}ÉKèLgÚ™ä±3ý)ý ™¦{$apÒ„Âèìž½|»çì®ä¿þùý € TE àŽˆAÜð‘?>“dŽs çæ9ws9—çö |»È·÷EŒqÙ >áÜ}Î-ñe™›¬øTD¾y à3gP°*`!TPõºVcÃЬ¬®Öj|º§}¿¬ÙÄT=&š3­²¼YûV/mÈzeC&ééw<€øQ}ÖÔu­hWLƒÌºY¬2\Ëm©;ª\·+º\4bݲ4Ö¹²&/iÄ[ªa/ijéU±µÉɹË"ç¬ÓnÉÛ1L¿9ÜÈ7á†w¤>§mˈaæÈí)‡¦+FÅžeð'Ç tü¬YÒˆ$¾ï~WÔ¶ùÍÔ|Aw_Öì¶Ø“c¯ŠîEð—yUN¢k¬«FY^ÜØ¢+'mϲ­«yu{EÝÐ5§Ú_’Ïv|F“Êq—Î(ÜV+FÍé­ƒ#ï"K{hîA÷µ{\ÒF)ÓE«¤YZ)¯ÚÅͬY7(`r]SbtÜŽ­5t\ÑÖSÆ!óå+†«o\,îøµ„a\”0•/£’ØàKš+2Š(IÐð„2ßn¢"a ÓfqSÂ9¼Í9’ bØtô9µ¶IwŸmå2⎺%á<.¼¾çÁ€^~={†D›aÍ6-M¾­Ö4Ïaòä#Ã0õ?¦‚aø°yªcYÕoYåúCrk CäÐheÓ2wyÿ2IEQÖœQJ:döÕCòßÃóDí3¦¾Î™fµ¾í¶:õrŸé …S³7óÈz§É Õ ÷Ø­–J‹Ö’7?SÉùùãæÇ%kÇ5<://i’©±.Ðç`>?Az¨•Áÿ¨1JcáP ‡ÒHÐÚ Fý›¡õ í"𩾮&دŽ!7IÁ ®´h:„üMøRÀ¿h"Ð@0•ú Á}„äï²] „]wè ÔUz&pÍ‹wŠ($óðží]¼ç©w)?Ê R ûSñ}tÏ$|?#B)1±à*z2{ì xì@à)}bAw’qÎ?âÐ &ãzŸÖ(|Ï0ÌžC„OÀuJGÀ¤»I/‰Et9IŒò÷ñV*þc˜ÓÙ{\IŸ’³<$¿Ÿ~ÄicÈ¡n¨غ Nï|ެ¼H'L7qjÆË?ñ¸u(µ1Zcô­µ£\Ô™Ö½å)eŽz©=eFUêÍ{yŽïµ’1áDÇ„éÝø²„ãMôŸ0áqËC-SœBû=(1‘~ò b©tâ áÿ„Ð#„ð±GÏÿNÌz!†¿Phýw*°„À3„YpÞ z·½ §!³„ù½ÔÊÑÕT§N{EöZ~°±ç‘íàs]Ïp׳ Ê™DÇ\Nè"œ Žâ"ƒËÓ/ PK7A1org/hsqldb/lib/IntKeyIntValueHashMap$KeySet.class”ooÒPÆŸ …²Ò)¢›ºÍ©›ÄÎù?£’%gLœÁ°w¸ÎÒ"íçGñ øf/4QH\¢ïýPÆs»2çX„6½½9çwνÏ9·ýõûû«x0$2t,©¸&ß9 Qä5\GAÅ *–4b ÒbªXQ±ªâCÜoY^f…ayÝí6Í–÷ÎnÔLÛª™eÇ.vi¬p{[<ã^ëï)â¡åXþ#†¬1^H¶Â ”܆`HX¾èrßí2ÌÙ¡ðÐI‹(žõø¨‘-STÝu|n9Ô±¾Åw¸is§i¾¬m‰º_ÌnØ>i8É;l"œ7¤„Æ'¶Í0?¤¤äÚ6¡–ëéã]ÑvwhCªå­µ;þn°5rLnø¼þ–T¾æ5›ü±º-x7ðVtœÂi),ª¸ÍP8²„G*…ù”{ƒ"eóòaRÃ&½ì8¢[²¹ç OÇÜ•é喝¯c Ó 3µ¾Úv|«-ÖÞ×EGêб€E†ü8-ËiC4>˜¤Ž‘!},SÀÍýO$u’ÚlŸá¬q´3‘³ðO'†27åaÊŒ£Wè¸ë ¥R²ô¥hô¤p†¬išM#B7Ysùo`¹>"_ /ÚÎ…Ì<šé}D«¹¯`Õ”7J±Ï!K…Y#Ù„äzˆï…Äy\8$VLìC­ö‘ø13‚˜™c—Fó#s\¦ª™PËd®‡‰P•OP¢{t•Æ"ÉÇ’ Cu²zmPˬ¬­Å2 ªf’þ@7?PKT&óöE¼PK7A1org/hsqldb/lib/IntKeyIntValueHashMap$Values.class”]oÒPÇÿ‡ ¥Ó:Ýt/N·á¤àìœo£’%gLÔ`ØÝN ³´Øv‹ó£ø¼Ù…& ‰KôÞe|Ú•M‡ 4œžžó{^þÏsÚ?¿~°Ž»d±¤Bò‚+á=¯B‚¡¢€¢‚k*,«ÄÕU׬)¸Á Ú–Ÿ[cXÙt½–ÙößØÍºi[u³âOÄUnïˆÇÜo?åÝYܳ+¸Ï`äÇ31ª rÙm †´®Ç0—7†ÌãM "ûÖ;⥼Q!«†ëÜr|†©üæ6ßå¦Í–ù¬¾-AÉØ"7›”m›aa(µ²kÛ[®ñ)OtÜ]Š XþF§ìE±hcâEÀ¯)í—¼nÓ~²a îE»U §pZƒŽEë «¿…ð)ma>âþ@un0¯)Ö‡—´Šã¯lsß¾†›¸º¿­àކ)L3Ì«}¾ãVGl¼mˆn¨CÃe,2ÇéA.z ú¥ýdfþY2†ùÿi¥µD©`8K}=ö-R?—þhȇÒVxHrãH!ÕY:ßÔ)0];Bo@†þ:ÎÐê$ͦ‘  P Å/`…>Ÿþ(9œ‹™È4& Õ ŸÁj=ȯ¤>’c–곡MȦC®‡Ô~LœÇ…#â0búJ­ô÷˜˜IÌbn1?ÒÇERsHäâL' =dÞC‘?@–ö#èI$²B‚NÎßµ©ƒJ] kCÑ$ò¹BµÊÒwÃ~PK×Ò×7rPK7A*org/hsqldb/lib/IntKeyIntValueHashMap.classT[OQþN»í¶ËJEÚÊEÔv¹Á X¨\Bâ"J"h4‘DMüMÄ8g»\l‰¡MÏÌ|3ßwΙÙíï?ßǼ„6$%´CáÞP–a#|åHŠçÆ8üHĸ 1Z{(ê$œ‘•ö@ ìø‡D)Á ºèõòpšo žzIŒ~Æéw½nñ8Y/Ù%zïLÌsI9‚­žÂ·^ƒÿ§#ßG«ì ìBÉç(õ»ç&%lØQÊÄÏ•â£ÕXµIƒ3\æñ8³û’Ù:ì­sW„ª·áì{tÙS8ì^åbF‰Ä£kÞÇ9rQøáŠHž3ÄÙ,—¹®Ì$á¼w9i†d‚Œ \%ö•X]%Œ‡®ÊˆÓ~•#¡M9…´®ÔÐrLã èëß ÖIn‰k¨râÔÖcÈj¢vÛAMуs‹|þÚ üPK‰¨êóæPK7A+org/hsqldb/lib/IntKeyLongValueHashMap.class}RßOÓPþnÛ­[AYÇ/E» Öð¤A„ÄÎ)F ÆñÔmMW(ë\;¢¾ïïàÑx01,ÑDßý›ˆñÜ®0ÈšÜsz¿ó}ß¹÷´ÿýü `¤1£@AŽ¿©i y³ ˜ãÈ<¯-ÈX”q›!ùÄmºa‘AÔ Û Ò ¿nSÒL¾S6>×ìVèúÍ@Æâ8vØ/–F·B«¶÷Új½·ªišáIÍÜ)*Änu¦]²mïû±w%ƒdyXÊà.îe ¡À0¿kXF't=ã¿Õ©56<{ßn†çÇàŠL:îg°Œ†%¿íà“W¯ž[5ÌføÊþRö›Î¶åuì—VР2¨xAè·mã¹ Ê‹QcÏj:†éy¶cyÏÚNçRk™nbVø\Ò4‡²ïïuZýë˜ Yï¬g<a‡f!îW;š-QF¬z}³ý.ÚV*•m7«»v-\F*…a ôðGã3¡8J» ôF¨>–ê}(œ¥'LÒ_ PNë9)!ö ô)×hID£uã1y•²HyFÏ@\W…C(úHªqü ‰=$ÿDö“`§gçN‰ÈéF|®r’xûÈ©˜?sÊÇj÷xÈ„K'céCréô@š]ûâ·Ò‘xtY=ÅÕS¸«#©çôÈE=×U»ŒÑ½Sò9„,}ƒtÁ$áyö”ÛLãVlóˆp>‰Y.Z'›4cwQ¯pQ¹ þPK˜²‘d6™PK7Aorg/hsqldb/lib/IntLookup.class=Ž;Â0Dg‰C  ¤¤ •%î‚‚8僱qg£à a"Ä4Oó´»Ú×ûñ°Å‚cÆU„0‘r# ‘¶ö4t–Œ=NïyٹƚžcNXÙk%êþ¢‹Lè&Ò¸ÝocÙª›Z™J²¶Ìa=ªÁ5ZìíqÈëT—çÒ¸ÿш@˜à›€ù_ÀÏ‘÷Ü[æ9 û}PKUÊ®…Ÿ¿PK7A+org/hsqldb/lib/IntValueHashMap$KeySet.class…T]OÓP~ÎÖ­£+:>† c" ܆8@Á|L”EŒ‰xu¶5¬X:\ Š1ñÒ.0ÑA$Ñ{1¾§v)akvÎÛ÷<ï÷súë÷÷Æ‘oA)mH˸%öŒ?FŒa\,w„î®&Ä2)ãž‚0Ò Ù9€ûby 㡌)Ó A»¬[‰Q†¾¥Ju#S¶Þ¥BÆÐ ™¼i¯pcG[äVù9ßÎvJ7uûÃ@²8µÂ å*%!¤ÛZ•Û•*CO2å1tɽdéï ïO¦òdU¬˜6×M‹!š\Úä»\좺i¸49§"†Žäéa9JšUÿÃðxÈ® ~Å/Ξ!\ç¥OAˤÿKI…‹šE´%âO6%³—MyAѺ—1áe¢ù•xíõƒ>º˜m .‚E"‚;tÏúGÑEÚ+$uÁGiÓÃßÀÒ‡ð}ø1\Å5‡DÐ~ ÿZú+ØZ ÒªtˆÀ‹%¦¸ØNÚ6$p5÷]D ½."êFlˆáä:$Žë.d‚¾:~Ú{aBGh™Ž}D€Õ”ØøcÔGkì"îF”N7JèáµC¨?Ý ýh‚H4|LÒ¹H#–®¡uÚM÷Òªx‹}‚,}†äßod‚ïÝlVä1ˆ!×GÂíG«°úà1 Àv,èœßÁËõyÜp2ÆM$BŸÚ,ðPKiœPAоPK7A+org/hsqldb/lib/IntValueHashMap$Values.class…”ÛnÓ@†ÿ8q\0…z ´M 9P\Êé"U%"! Jï6É*qqì»ð(¼7½ ‰JpÏC!f]§R[^¯g¿™f埿¾}°{)¤±¢Ã@Vê|çu((è(¢¤áº Y˜’´¬i¸¡a]ÃM†DжýÜ:ÃÒ¶×kYmÿÓ¬[Ž]·*nPåΞxÂýöSÞ-{ßvíàC6? .TÔM¯)’v z<ðz ùÂÈÆh‘Ü«¾ýžx%_¨Ð®†çÜv}†™üö.ßç–ÃÝ–õ¬¾+A¹°C o6))9Cf$©MÏq¶=7ä=Ññö)‚fû[nð.ŒE S/ÞxMi¿äu‡Öã Gð^¸Z5pg ˜XÖ°Á°öGŸÒÖcîUç†óʱbsÔdT\Wô6îûÂ7p ·¥û;î˜Á,Ãü‰Úç{n`wÄÖÛ†èJ–°Ì°:¾ú¹ðƒ*—NÌ È0÷ßb1,ŽSI½i‰ ÌŸá¬Ô5YŠ¦Ï«T«4ý,à7PKÓLq;2ZPK7A$org/hsqldb/lib/IntValueHashMap.class…•[SÛVÇÿ „eî!œBR[ iCš8¡‰¸¶BÞ„QÁ dbÉ”¤—·~ˆ<¥oyáÌ40)3Ícfú=ú-ÒË®,;ÄvÀ3Ú£sÎîo÷ìž•ÿú÷?\Å/A\À˜Bâ‹û : ËWP‰ “˜b…i3 ‚øœÅ,‹9Øä 6™g± ãKõ˜`“EK š°Ì“¯d|­ ËlðMßâ» ̲Xáµ$‹U¦Œïªæ +k:ªnÛffÄ2‡§Uæ£9Ó¥—Mÿ¥i2Y‹¯;­Õ•¸•Z‰Ój‚öw|@[ñþHڲ̤›JÛ¬v+e§ÜA@$:/ ¤WM":Ï”Ñݤ¹ÍšŽŒ5ÒYc‡Í‘É cLj[†½ŸYÙ V"ª Ô̹FrsÊØ~`¬X9[FOgÅ–2Ëzt‰¢!t@ö¡GK•¨ÄvÖ}œs+½c¾'LR%Ó¶k¤lÇsT“ŸyùÎ|‰ñÑòi —n¼›OŠnز.EŠõtÛõœÜ7œuÊR":/c’l$“¦ãtõõõ œjõžœæ)ýL¹vºïåRŽŠ6Tl¢_E1tŽO/리øtz.›\µÌ-Óv Wƒõ¢2¶TØH«ØÆCžcî71ãw 'ï¼+ÿ®»fÆ ]ºâ%†’pàªÈ2v“Å‹°«â&n´¾=ÂlÖvS[æ± ºpYàòÉièÊ5;Rqžn‘kKÆß–ñHÅcüHUTñ~VÑ‹¸Š\82F ý¤ t¾=šN·kͰ†3kÙwòN}Tì¤Ï3i¯¤t<¿ËÔ[ Hí6™NofÉ£Ñu}‰»¾®XS zË}è;Á½žòäó+–i±ókWrª„G— 5m:M¶iBé¡ÖsR 2VWg2³~'"ã㥡—®,•ù\4”ö0&UÈS[i7ç“HÖ’íÅÙ)ÃÆEúZwÐÿG=t×¼7ºA4ÖBpKÔhÖHë‚FY««>Dà9øÇ 1Ú`…fú›aHPk«’‡r*ÝôH¤ØCÝ+_y Z¥ÝØk„ŽP¹xˆªW±È·µXû*ÃO¡h¿£:Ü»—ß÷ö‘¬F…úZ„(Ð+=z¿ëÑ+iŒÓµX˜èR³Düó›¥Þ½ö½"t+¡xÕÞ#' ì9XÛð‘3Ò^ zÞƒ~„}èA9Ú‚‹eL™ê>@è ZiPÃm¿¡†p‚f5W÷Ÿý÷·Ø/Þ@‘q­•«B­ê3GÉ—Ç<¨v€3ƒZ°ýט /µ a^x YzéX”AÔ7hCæ'¸á#¯2@£gu[ cBbJ{y µ¹Y€4PÝùrTi±CÔíù—'[þ~“¿_}„zŠ¹á•¯AŸ'_£Ç«3pŽRÒøµ”µ¦EíÍ/ÐÈKos€h¤×+,cz6gÚ¦ç^à,/•˜~Š!ßô®_£(ûƒ—t/0Õý’އ'8G/íÓZO¬çt Î/PžKg…W¢áp]5îÐÌ÷QÀK§œ»è^*Há.•.§PáE[ɵß÷óÐI²•ìZ¨[/zùº€Kž“|éPKðÔTöÁ PK6Aorg/hsqldb/lib/Iterator.classe޽NÃ@„g‰ñ…ðB-¥SDKÂ( R º³9ÙŽ.w`Ÿ£<[Š<…Ø3R g›Õ|;»;?¿û€gLî&Qªf©wž0Hf„ÈvbšÌkµUÒ([È·l­sÿBÍw¹þò•³À=owjÿ·SÂ0è…³E^ q­7n«;¹ây£ýJ™–ÁCrú X]]Ȳù6Ÿ™4U&S¯kå]M÷ý„§µ¾2réÞÛ¼œ½ÑÖcÆÂBŧ@p?GÌ\0¸™\`Ô#—¸ê‘kÜôÈ-ÆáôPK'eÜÝÞWPK7A'org/hsqldb/lib/KMPSearchAlgorithm.class­•ÏoEÇ¿ã]ï¬7v~v“’x÷M²ëÚ´1hZC ¸4rEQ¥*—nìÅqqìàlPþ€pà‚Ä•C½ø’JpIQ©Ì©• ŽœàÀ­üTmÍ›µ›8?Tdeí̼yóæûyïÙþáéÝ:€3x[CFƒÖ£a ¦†nXâÍÙ) $Åë%±<-fg8ÆU¤4„ñ² ›c‚ãå\±\ôÒ ÒèØ5yº’wɺä:ÕÜD«AóØ×-ýøÛ!C¥ñSó>ÂÖ}¨VýsðCܶêi&dC^Lj%Û<`nB¾n+_ ¯_Öœ YWt¾Þø³_¾-H6? ß 8³íšzæjé||¡UÎjèÑùÂq'lNëŸûéªüÇ®‹ÑW€Þ—ŠH ¢à‡9^àd²j`p‡‘í/HOÐÖÀðž½HCOœú0ž7©f”ÿ’>³íÚžÔÿËÀŽáÝزí“{{2kµÈï Ñ¸Þž``ì۲U·ƒ†­èAÊÁq¿ Y¾ÝÔ•qb‡¢+« «56 ›K¶ºÕMÏ)]Õƒ·pV°tÕï•20×Õ„Ò9í‡ò7(°º®‡l•¶…õ†­ÔuqZÜÂ7[99…p„u¨~‰ý*‹è >{‚NÆŽ<ÆaöPȇ=úü°©vØÔ?Âò½°)‚M4ìp« ÿ{¬ûc ö3‚í$XÍÚ„ê㊉-ë2‘j¦el"´a “àßA¦Í¡6–iœ7 ò-Â×{#wÐùY'¥ÍuWs}O»¼âë>¼æÃy^—ñ.HxSÂ[å1u8šI˜»SISKf¢¦–J«NDNFOGÉh2î1u-o»oÜO¦t5ÖcFu“Œ]‘²BŠt5Su{WK…#ZRíÎŒªúk¬J’êYÓrÆ›¥Fnm ˆN¢´À*·Sn¨CÌ9‰ó:G±D[H¹¨]Kjf‡@qf}žÝ©Q*¡ƒC§º¢éÞè`Bµ’÷6•S y‰órØØ'¡Y@Ž«fÍP ÞßIéñðˆ1–ˆ †Ú`x-wêzt<¢f5 U]ÀG§vDB ¡À™¨1B{i5æX¡ÝêÉNn…¿«ãœ!Ã)«mWÆó³íö7R%¼C‰”¡ZO”¡Ò¡Tò´ª›½)Û›@‹éx:¤@ýK¶%¬º(Ø[ТàqlU°EÍ ¶£YÂ; Þå‡6±hg±­ žÆ^j–û{Ωi;ÓµKÑRðÞ§²*ø%|¨à#|¬à|ªà3VpÝ ºX|ŽÃÔ9Kæ_Á|æK|EUÈVA/Ž*ø .±Ã#  ªÌ7Û•Vußà[…îž^}§à{\¤‰¨§ÿÍ^S“ÀrÊšºÑPÓQ=j¦x^d ?(ø? ¬ÍãÉõÜ«§2é#ÎlΣwpð$õŠ@Õb=M“<ÏA`j¸/šÈ¨‡R©¹RGÓæ¸ÍÞJ,5I4Ëë:Åê:_vÕû ´…@u}{㨩\‰®ÅGÌ^]íÑÎ-ÖÛÔ°ÅFfÐpš³ÒßY¨ÿèJH¨É¸9B^©óç7½Ç°œ»é5C,8í„B»é ín-fÀ 9­KÏèטB÷Q’ò*”·ØÛÒ–gžKÀâæ>snfç÷è¸aª£Ë(àCz*M³=žšãúÿ€µÑ¨‰>š€ŒaZÕðÌ’®â®ÿÑäZz‹óLCoém–^ÁSoé6G·[Z† ‹¢ƒäôƒ n>¸Á£1 WÀ= 7 Oà¼Ó("%MÃGªxr 8e,”þ)xº®’›&"ÔŠZ=IŽVÁ5K. ;%ì‚°âS¢JˆÒ­…C64»¯›ñ‚FË^%ãµÀmãIØ3Iwšy›Bô’> Ën ´+ð3\¿¡<Ä:‹ýZxˆ„»CDh¹,‹•‘)x·{‚¿æºto¢,‹U‘`峂7P1¢©Ù?yY9¯§£nLÙ°ý¬¦¨BWBAF™š$B뢊æè¯ƒtõ°o–~¨x¬(:éIXayMqYîÇ'”cN(­·PE¡TG85]¡,j<“DkCî,ÖüŠÚîç&ê(‚¦jOk üïàÀ] ÷ |"3(%´»Ô].¾¦”1Bá®àdøî\Â÷ŽZZÝ™DUµ›²xˆv_¾àS³ÿx.Û¾œ…/gáq,Ü—çÀWAš,Vß…WÌ@X ‚?8ßáÀ¯³Ê9§òNeŽÈeû8„ÃŽ¯•¤i/·Ìù}:œí&Ò.ÒŠ]®zj²ÈUë€D.sU’àÚouU1„œ£ˆ#7rÓ-4P)Öu­é¨£jÔL¢:¨£*dñð5¬ÏbCÿ7³¥*=r¿ \÷@Ÿœ>quð¡ŽÓfË-à÷ÞF퀻ìÑžO™¿ç:Åm¿h¤uqY Œ2të¯ZÖøPKXtÝp PK7Aorg/hsqldb/lib/LineReader.classT[SÓPþNoiC¸¡Tð–¦Hð "´ T Up˜AžÒ6-ÁÒbTü>ã“>ñàŒ3™ñø“GÝ“tP±:fæìåd÷;»ûäó·Ÿ á¡ˆ „ÆE.¹P\áÇeî q1Ìňˆ+¸Ê­k"®ã¹ÉŨ€1®o‰hÆ8·nó€ “ Á‚Q6¬=ÏÀ3øŸkVrž!@z:“fðeµÌƒ’®˜EuÅzZÊgÕ’‘UgÈLlÚú¤ij›™ {}Ã^°M][¥d˱:Ò«Ú3M5*jªük€[ÑLK·ºÝˆ2…ÔöÔ¤«)¬¡¶5§­é mnhI+UB2ÊE~Ô•oSrݳþ̉-RSÉJžƒ’Oe2Ãr¬|ã‚­åžÌjë´l‰ÂÄé9}Ý6*eK@’Æ•+U,Ú÷ʱE ýˆK8N ]\DÐÉ ÿïÜxú”„nD%ô WÂiô ˜–pw%œÄ)3R¸'á>iL1´¯YÂ,æ8TFÂ^Ž‚8CäX¼çyê]7ƒÈdWõ‘Ò~4ÉÌQ¿449Åg×õ7ˆÖBÅt¹”ë þ_T·×!Žä9ÓM‘c/u~CMÃ&*êvb£Pà=øäØ2Ý刼œH¥êSî7u: }ô…tÐÇ%Ð"¦ÀŸ®šŽÔ4Q@²…³àh𽣉Ò^0ï’gÉ›€v€åLñVááÂË…O9„©Õ‡ª”xAe Š2ðb »Îi çpí=d¯”=x¶àg;d÷!E=oV|Â>_#Åv¢ï Óây"-ŽÓH«‡G{·ÑO Þ-Dº¶¿ïòüè>šjþÛC4/¹˜-Þ6©ÐZÓ®ÛßqʼàB_ÑËz„¦/ô?‘iËG¯b´è¢Õº“ÇHÝâÛÝ>ÆâPK‰.D€ÇáPK7Aorg/hsqldb/lib/LongDeque.class¥UÍsSUÿÝ÷^š4JRJ­åE ò¥ÒB+©¡­ÓŠS¡¯yL“’¼"0㎅.qU]:ÓM]0c‹£ îõŸpéBþ,à9÷ݼ¤µ°13¹ç~œó;¿sî9÷ýþì—GŽà£0Ú0ØŠ8Þçaˆ‡ §‚ȆтÁ0-Nó0ÌÃðp&ŒFƒø0Œm "ÄY£T¬¹Ú…Qðåbµæ˶sC@äBNÙV˨Sræ²›­,–Iïéá‘ÌÇù©K¹±ÜT.“¿”ÍLd²¹©iX¶R®¹VÙ=g•X‡Zú‹å¢;( ÷O8“®Uøì¬µ0eÍ–H+4ç¸#LP*0ÝágÁ-’;²¦Ó¼%iFн9Ö‰TùÊuGÙ…½•Ò³l›õFÙYÞvˆfJ½…¦™RI ³7_©Î¥¯Ô®•ìÙt©8›ÎWÊs§k‹NSJŽU%Û[Nµ2)c ʼ_ö9§ÌÑØI;=´'Hî1@˜ú*4t3~Y…qüœeÐF’ æO¬¨ãÄÇ;~UÇøx Ac†¾"•^ñèF†X£‡45iqH1èð,"¿¢eú‚¿ÑÒ ¿–þÑ·Ö!¶ã5ý_÷Qó!ÉÄÖ(ºa¿ ‡n^átÔ%ÿÄ„Ø<)-ál£ÿAßñ Úcƒ‹/¢?TŸµN˜Ó$ŒN2͆½ê¥q qÓÔÏSÞéh»X›­ÝAHÞIWƒ{úöuôñ ˜>ŸÏŸO7ó™–Yà»U)ñ™é³òÙÉ:Kˆš’ínAgc>©§T=Œ*:Ç©¾Z§9.ŸJ—"0Ã$QšéÆJóqݾåãî -Æm1»Ö®×á!ÿü‚ò;"ýʼ۫2«ÚwØïERßÙ[ý¶š)m$r˜¦iVŽhË Ù­胩5Dîa·™ê\C”ˆ}r[·u±üü¯d# í) !žP7 ¼í÷b^v3Õ²wÆ}Ó»…€º ½?!YÞ£ë!™h¸-úñý&d=´Ž8!s¶ŽøÈIBæîˆoB¬·÷QSš)˜É~ †iÜÃQÎFçÌ £ÝÞï"¦fö )Ût×7Kt®ÈHÿБÆa¬Cëè!J±'’Åqê5Ï×3ªöõgs¯J²¿;HmÙ6ÆøÚôŠó+©ÿ]´Ò¯KcFžØ?Ë·èeP# jP20f¤àºHÚ†4ÿOëÐæ²ÙÔ@±Fu7º% ã)„ñFOòÝŸðëõäÝPy×_ž÷wð®òu\õÆ>} éùÚ‘JšIªØ/Ç©^—Ÿÿݨ¨VhŒô„>* ñž‚8¦ :|ˆ61!oÐNÅMŸ]õNQí¡Ä·ˆÈWû.?VÛè±ÚΧ–˜‘ÐxÄ›ØMMDO4¸Ž=¢é]Öø‹®~AÅÅÍ4ËЪm¨£x¸ò0’¯×DÊ/„¦já‹Ö¾Gïë©ú©Î‡þ‚_(3¥¾‘~¨±uŒéQÀ¿PK`m‰Sº PK7A*org/hsqldb/lib/LongKeyHashMap$KeySet.class…”moAÇÿ G«"Úª} ÚÒzPñj}ÆhI‰kjè»6põ¸Cîl¬Å/à›¾ÐD!±‰¾÷Cg¯Gm )–ÉÌoggþ³wþþü`&DVƒŽe7ä^C«n¢ â–Ë1é1U¬©XWq‡!î·,/»Æ°Pq»M³å½·5Ó¶jfÅuš/Äþsîµ^òN‘ÐÇ–cùO1ln›A)¹ Á°|Ñå¾Ûe˜5rÃûÊa²+žõ‰ø¨‘+Ó®ºëøÜr<†)£²Ë÷¸is§i¾ªíŠº_ÌíØ>ÃÊiÑQá¼Ñ h}fÛ ™‘J®mj¹N>Þmw R-o³Ýñ÷ƒÒ(0¹åóú;êò ¯ÙÕmÁ»At[Ç9œ×‘Â’Š» …GxÔ¥07¸'B‘²»|,PjÔ¥—GtK6÷<á鸇û2ýuLaša毯?8¾Õ›ë¢#ûбˆ%†ì™³Ê’¹%•ŒŒÔ°z é¡7wVw4BšOP7ÃEãäHgqød(îÈ[4fñ¸FWZ ,•’âÓÓ Ñ/… äM“5}É›_ý–ï#ò òCUáRÈd ¤­æ¿ƒU{PÞ*}ľ†,I²rd’ë!~—qå˜8:1qµÚGâwH\ÅÌbvlŽ9Ì!2cs,jGD6ìe2ßÃÄg¨Ê(уºNk ‘äSIÐ5:½{m eNªG§E±ƒÔLÒ[æ6ðPK;$? PK7A*org/hsqldb/lib/LongKeyHashMap$Values.class…”ÛnÓ@†ÿ8q\0…z¦m€(.åt„€¨AH€‚Ò»M²J\;ØnEy^€›^€‰D%¸ç¡c×iQR[¶G³ßÎÌ?;òï??~ØÂƒÒXS¡a]Áµà›U!!§"‚‚›*¬«Äφ‚[ 6ÜfHømÓËl2¬T·e´½÷V³nXfݨ8vë¹8xƽö Þ-úдMÿÃZv›«2È%§)’¦/\î;.ÃB67¼¯-RtÙ3?/eseÚÕplŸ›¶Ç0“­ìò}nXÜn/뻢ás;òf“j¢÷ËbX©©äXÁ¦c‡|ÂgŸ2(¦·Ýéúa.Z˜zíóÆ;*û ¯[´oX‚»ájUÃ9œ× cUÁÃÆ?)<*[O¹'"Õ™]>Q¬º´²m ·dqÏž†;¸„¿§à¾†Ì2ÌŸª}µgûfGlhˆn CÃU¬2dÆ6?SåÖž Æ%†>Ü?†¹ÿöŠaqœH:š–ðÃò.ÒžÆÅáé‰PÜ ¦ci¬Ò™¦¦³Óõà hÊSôè¸@Þi²f£Pó…ï`ù>b_\T.EÌ2d²€é#Hµü7°Zò[©ø—ˆ¥ŽGl°'`“×Câ0".ãÊ qœ1y¥ÖGòWDÌM$æ±0Xœc‰Ô™¨Ò©|©OPäÏ¥ÃZ¡w±ô〠Y9[›:èÔ 7”M¢˜×©Wiú7À_PKš]™2VPK7A#org/hsqldb/lib/LongKeyHashMap.class¥W[SSWþNnÇ„CE®*A©†Ä˜¢õR¬R[‚Z@,¨mÉiˆ„'!…GËÌÞkí½öúÖÚë²søóÉoÆ÷tà:1¦b<7&üܹ ¸IÁ]Ü»‚› Šiqþ’X^Ë+ôˆ½N¼'¸+‚{_LˆI‡gT$U¤hƇ5HcVL!¾*`æTdb^,r*ÌÚ1¯bAÅ5¾I=[4ò ´x.gXƒY=ŸKß9ãæ¸Q 3ç0 ÓJÇfóײ©™X63ãnå‹@ëFù ™ÍÉBÆÌñ˜'k&çI\ÕõX±ÉÆ’f.Y´,#Wˆ a>6f·ô\aÌÐS­LÁHpŸÊÛ,n^…ÅÕ˜³RpòùáºJÚÄõ_/íªà üåC ú_¹ÒeßÉL.SPàuOòúƒfÊ ÅÅ*pöFÒX‘É«`hµ´Q¨°½/Ô½•uÇ‚;-²Òvgõ\:6:s•!§´v¼ 'çÎë úLÖÙ.Rg¡H¡áÍ*ÕQh¼ gryY%ÂZÅiÞÖ2æÍE¨))°|Äu‡…Ô›Ì:§ÌÓ–¥ß8Ý—6#©XTq•Æ›Z)Ã2RçõBrvÐ,æè¶7t)ÞWÐÌðT-Ŷ͂ŠÔð*ދ醂žçN®P¼©!Œˆ†ƒ¸%¦˜†Wp[LG„ਆð±†O°¨áS±ü ŸkÄÞÄ[†ÄÞøRAÝÆ«+ˆV8ž/˜–;£ç!=?Ëv•øxÁ°tJ ±qK8x‡áÓð¾Öð î ³ßjØ º6Ä%aæÒLQ ßnvñ†ºŸ©Pz5Ú¶<¦ ¸Õµô¾xû*èûª s=qÖHZÏž¶ÒÅyª•›SAÃú¡‰Y˼.z‰»UjWAˆP¬çJ Åãñiù „$غÁŸýpz!€Ê÷ÉÏK˜æ\qÁnSöU)¯"S;aßÔWÌÙïvžJZcN—÷…†«¼ ›w¦«>*ž|æ–!Fí %¶*‘>/uVÏ7 R‰Š''¡êø|d§7"o.ξîIþ vðgðr°O þXþ’²Õ%e£KÊ6ç\ …]r”ó1®à"¨áºº5(÷åAqà8âÀqB»H#áV¯Ï½WøÜSž5xVà ‡w¾êÛì¶ømB½ÆÑ‹>ÇÞRaÏËãþeÇÚIô;âÛü’ð‘öS¬®"n_EÍ@›ë'4qGk;Üë±%µ»<ËJå¢×[â½¢b7?6€.ÆDÐÞ½GàÜ×ct)O¡Á¥âÝTñ:e§qÆqäml“Ž„„Ÿ«x)ÜîW¢¼þvi“;u%›’§MmÖó+{$µmù \¶Ñù:èC<í!Ý[ºfd ;œ;×ï8\ÔF­åw8Z$-£NÚ¨gËÁ¡Ï²*|V˜©í#Ž›Ñå ïmìŒ8‚’–±§ml¾úö0c*°;ˉYCý€ãgÛ½ŠLüÛçU}*×_œÔåDBú¼†ÇÅ%Ô&6òè¾D­AÏ6³©ŒªÂu¨~.ãtÓ†½ËðŠô%Jñw4%ÜýÐ<f"[F¢¿b§‚P Þq)\íR0¾ôôïÈ–•pá/Ž3’Ú.ì†û ZUœc%ZDU‘9U*ªóLŒíUšAi?á.Õw0òðg4‡#ÁCkØý#|KðÓ—¥§9VƒõbÞ£.¶ûAÙÔQImjá} ¿Rï;¡ØQÇhTv!°“8­`;û78Å0·­ Ul-—AÜPȆXü›U÷تíBuï öˆ­Mª]òÕñòó¼ûd'tàe äÆ!øÙnþCágþ:aÀóPK?z@ßc PK7A2org/hsqldb/lib/LongKeyIntValueHashMap$KeySet.class”oOÓPÆŸ»uë(EëTÀ©°AW˜EüŒQ ‰‹3&bfàÝÝv3Š]‹k!âGñ ø†š(K$Ñ÷~(ã¹¥CdÄm˺›s~çÜû<çn¿~ÿ`†0Œ¼³òÛÒÄœ†y”TÜР¢ S’[Å‚ŠE·Òá†äf+~»ioïÜFÍvš]ñ½æs±[öÂ*w·Å3l¼à[KTòÐñœðƒeXS¬2(Ë~C0dœP´yè·&ÌâÉúrœ¤]”Àù@|Ò,–©ªî{!w¼€aÔ¬lòn»ÜkÚ/k›¢.× lŠaæ´loˆpÞhz>q]†\”eßu u|/jŸn‹–¿CR`¥µîFG£ÄÈjÈëoIåk^s)Ÿª»‚·£lUÇœÕa`ZÅm†Ò±-R)ì§<èš”ï®ËG½!½ìy¢½ìò Ž;¸+ÛßSq_Ç(ÆÆÿj}µí…NK¬¼¯‹-©CǦæšYžB«ÒÑtwaœt‘!{¢UÄMþO%’æŸá¼y|4Q&3õÏ(z:,­ËÛTH®Ñ•×AC3 9 úµhô1pŽ¢YZ!AoŠZsßÀ¬_ _t:\ˆ™ZÙ$׬¯`kûPÞ(¤>Ç,Y³²F²Éí#½qéˆ8Ü1su­ƒÌϘ¸Œñ>ÄDß“¸Ò‡Èõíq•\;$ò±–kC¡*Ÿ $÷"è:=SH ?–]«ÓÕk]/‹Ò=Ú-‰˜äæ0ý ÝþPK‹Ð| IÀPK7A2org/hsqldb/lib/LongKeyIntValueHashMap$Values.class”]OÓPÇÿgíÖ­+ZQP^D!{‹øv1cÔ…ÄÅ53ãîl;ÙŠ];ÛBÄâð† MtK$Ñ{?”ñié@™ºµi{zÎïyù?Ïiüüú À&î¦Æ’ Ë V‚gV…„œŠ< ÖT(XV‰)3ë ®+ØPpƒ!á·M/³Á°ZqÜ–ÑöÞXͺa™u£âØ­'b¿lûUníŠÇÜk?åÝ"™Ü3mÓ¿ÏÏŽi“«2È%§)’¦/\î;.Ã\6wÚ¾-RÙ3ß/ese²j8¶ÏMÛc˜ÊVvø7,n·ŒgõÑð‹¹my³I¹Ñý¡e1, åVr,‹`Ó±C>኎³GÓÛêtýý0-L¼ðyã5¥ý’×-Z7,ÁÝpµªá Îjб¨`“aý·¥-ŒGܨΠÆåcÅúð”V¶má–,îyÂÓp·÷·ÜÑ0…i†ÙµÏwmß숭· Ñ th¸ŠE†µ±š _¨€‰Á@?]G†™ÖŒaþb©E-á‡2ÎScO|‡“ÔÐ¥?:2䡸ì’•±´î4íq꘮=¡¯ E—Žs4;I£iÄèÔ|á X¾Ø'e‡ ³™FÀä!¤Zþ3X­ù•ÔGücÄR"6° ØdÀõ8ˆˆ‹¸tLELB©õ‘ü3#‰YÌ æGú¸LjŽˆL”éD¾‡Ô{(òÈÒA]¡{±ôƒ€ ½ówmê R«Am(šD>¯Q­Òôï0€_PK•í:vPK7A+org/hsqldb/lib/LongKeyIntValueHashMap.classTßOÓPþîÖ­l+L~ Á1(ÚU ˆŠÈù!j'J"<hÆ kçÚñÝ¿ƒG_ö ‰°D}4ño"Æs» İ¥÷ÞsÎ÷}gçœÞýúýí;€<¢ƒZ†¢hÊÍanÞ1Ew¹{˜»ïñÓ}ñ cÜx(b<Š8ÆDdEL0„—t³b8 ’fYFyÖÔ‡›áÆî¢áÒaÛ?´ÍÛ强é¼37ÖT³°¦’7Kñ_ y6>k›¦±îl‹Ã& VÁdÊ™%aÖÞ0h“W Ó˜aèÙÒwtµâLõ•½XYßœ3¢a¹ÇqFRÂ,žH˜ÃS í¸Ê0p&Ù¼må©ïšåzSy®;›Tðú(¸Ä3 è¼4ñïlû/gè:…s\»l¨3ºsîóª4u+¯jÔ•¼nN—ó•êdˆiÐÅÂcÁš+–Ü]F-eMÓ¼Y7ü¬þ«4DÁ!‚÷nÓ76ʯý™eå\nþ$ñÂÚ#{Þ³’9ïcPä³½¸ölf ½t?ZèžèKãñNÔmÚc`|~´v‘ÕJ~F»¨\i¨}ÿp@Êtx€T(É}NPÝã¨B*¢$CB°†`’¦G `=½èóÁ#’¸¦¤ L¦{ˆ*_J U^®AüáÉ_§5 v„v¬ö”nø?N%¥íW=¥Q!!VŒk%„¡jªú¯L‚yä~Ÿ|—99yš úô¡<#ÐÉè¢ø-”=ÈcJº††ªß”[ýø8¼=Ê"£‚’N}dŒš}›¸k¢ð ©, ¡›Mñ<(¾Îòó~¥8iRIG¸Jê?"ɺH;nû"ƒ^ûhžT^ì'âÊ!¤e¥†Æ}¯a±ÏÇü X+;0pµ©Nsê•}4q×9j›×œý57Ó Fïí àPKkŠeW-ûPK7A3org/hsqldb/lib/LongKeyLongValueHashMap$KeySet.class”oOÓPƟ˺utE+ * *Œ¹?Î"þÏŒQgLÄÌÀ»»íf+ví\ ?Š_À7¼ÐD·D}ï‡2ž[:„0º´½9çwϽÏsn÷çïÏ_Vðh $5èXRqC¾³"Èi¸‰¼Š[T,iÄäeÄT±¬bEņ˜ß´¼ä2CºìvfÓû`׫¦mUͲë4^Šùªp{K¼à^óohÎc˱ü' ¹SOÊT”¢[ qËÙtf°@)LÒ2Šg}">’ΔhVÍu|n9ÃTº¼É·¹is§a¾®nŠš_ÈlØ>Cê¸ìpˆp^¯“z>³m†ù!-E×¶ µ\'(눖»MR-oµÕöw‚­QbbÍçµ÷¤ò-¯Ú”ÖlÁ;A¶¢ã Îê0°¨â.CþЩæsîõMJöÇ¥ƒŒá^rÑ)ÚÜó„§ãîËòT<Ô1…i†™ÿZßl9¾Õ«k¢-uèXÀâÑ]œÐ´$ÅÖ¤¥±þÀ´‘ar VÀÍ$“zI 0œOîM¤Ö,éÅP…†hÆ [çÚõÏøÑ/’h"h¢MüMÄøžÓÊU[Ú÷ržçé9ïÓþøùù+€A<Ôpý º]Ôp¼¼ÄKKÅe ®ðÎ _»ÊÛ×T\×Ä/n¨¸©¡ C*n©¸Í ÌÙnÝñô|¥âÔ&]Û÷y©ÞYÈï1ôG}þË@†ssè¡oå$}n1ú“m"#(j`ÜWº§©j¥>£¨š'vÀ>‚ÿ8àt8%$=˜é-ÄöQZã¨dJ˜iYŽï BÎÐ%0KW7í)"N] ËÌnCÍÄÞB3?AÎX›_ Ìï@ý&äÏÒ]ÛE ÛSR„Ò¹hs));„Òœ’I+ɵR²µÙ³yX&Ź7"_%A™b:$K)‰ÈÍqA—¬§ÒûøûÃ\à<ú"[hOÏšÛh’ÍlctöÄ‹”Ì;o¡Jï i@l6Æe.ÀˆdnPŸ#ÃI£f6Á˜ÄU2ÿI‡")ä"‘1²‹v¯}G³ùÉysú–˜­öak¥´æ¨!µ‰S›·ÐÈ[Ǩ­”¶—Mô޵Pž¤ØüPK¡®,{áPK7Aorg/hsqldb/lib/LongLookup.class=Î;‚@à䱊šØÚYBµ‰w -<Áò×]0žÍÂx(ãBˆÓüÉ—&óù¾ÞöX3x K‚%²ŒàøQ®ÔúÒ7Û‚ˆà…Ï4oºJ«–a5õŒoõ½àe{“YÂe•ðX«"žV7µx.…*ø)©ó´#ìFê»Jò£>÷iÊüš«îÝ%fƲÍS°“\ą̃mr>Êb(ýPKžÆ{Z¥ÈPK7A,org/hsqldb/lib/LongValueHashMap$KeySet.classT]OÓP~ξ:º¢ãc¨0>¸ ±€ê@‰²ˆ1¯Î¶f+–×BÄŸbL¼ô† LtIôÞßDŒï©ÝDFœkvÎÛ÷<Ïû}úãç×o&kA)mHK¸!vU†c2Æ1!–[Bw[H“b™’0-#‚´L<pG,w%Ü“0#a–!ä”u;1Æ0¸lUJjÙ~móª¡çÕeË,­rcG[âvù)ßÎxF7uç>C"ÙZed­¢ÆÖ­Â«ÂГLeæ¼C²°õ·„÷'S9b,Óáºi3Ä’Ë›|—«7Kê³ü¦Vp2© –4‡aø¼ÓFCëŠÃ ¯(¸ô{Iúöøiïu!„ ¡e6þAv TGã.i€ÖØ :„ßÁº—NÏKø‘õC(ß='C¸Ú‘¨Û˜¢sF<]Eë¬î…5ñÿ)ðÿ~=Š0|'èfs"Žköl$¼z´ Ö»R¾ˆË Ks~/ÖúqStÀh£Ô‘(}p3À/PKgœ†JÑÄPK7A%org/hsqldb/lib/LongValueHashMap.class”[SÛVÇÿÇ–‘-‹;ÛPšÚ2®6Ж@B;\ÒBÞ„QAHÄ’3ißû ú’¾ä‘˜!3-LÊLû˜™~ŒÎô[Ц{daˆmB´Gڳ緗³«?ÿýíwƒ(p#‰›\ŒJcLÄ- >Ü–0Ž;Ü`BÄ] Lq1ÍÅ=.ÒüH†¹ÏÅ 71'¡ó|ïAŸáa ˜æâ×}ÎÅ¢ˆ%_0ÔÝ×¾_Ðl9mZaBW-K³H¿åêÛfÌB.µa=Ö××Rz~-EÚÚ¿™7òöƒ7_d&Ìu–XšI“O³ÚŽ7 KÄ2Ùä8)›ÙTŸ¨)]5r©ùµM-kÄ3 õ ¶šÝšUw©k:AÚkØ¥¹aGÕL|…¢!”÷‘‰WQõ(ˆ¢]^B´mó‰vA˜dÌš†­æ ËqÔ‹_Pr3®ë ½±JƒÓÈ-ªzQ»§Z”ïHœ®È’šÍj–ÕÛßßÏ0|ù±ZåIŸa8fèx_­ÉXÅ—2¾Â×2ºñ.ß0t;vE;¯§æÌ…bvcR×¶5Ã._3·»&â[*Ödd±Î<ç߲͂–º£Z§Î{OßÓ¶VPi—¡©RÅ¡šŒï“±<ŠØ›\lA—ixd\EÃõKRí-59ÞàG>±-ÀIå—±ƒÇ2®ã} ÅÐu Œ!ò¶ÌzΪšÖu-§êã…\ñzQ/Wx9«Cƒé\…ìÎCk{bPËϘæVq碉¡–cétz…dS¥ƒƒ".Í- 1Y7è§©ºž=«4u=otRU¾#^$ÖœöÔvPÔÒ~ƒ>xåQ+ÿƒêúú|á¡;j#±L¦:òjÍJ™fh©ž?rœ/2\=¢§U¦Ó‚á„Û«ÁÆ5úE†éÿÌè¡#YOïÔã${è«gOTšüGð¾cšÚà!ú}{h (á:Ÿ÷Bɤ— ߣ‡:Î5ž‚—´@_â‚Çð-¡îÄ!ÄQ%9„g,êyIùþhjÿtßq#é‡GþŒ•é>‡wc½Kt­J%}LID‰>$„â9?$¤ö#?îW°¯›—8M^81ùvbcŸ×e>ö¼{Ы4>š&h‡#°¬Pɤ¹ä!‚Ï¥EÚ…®Ÿ~F=)êv_ÿÅÊP ÞH"’Q~34È.vŠÜñXçcUÑ0$(î#GK!kžCv!œ‹4¯|‚»ÍCíÇ€Ë&¦—Ö(?5ª &pL¤6…ò=A¸,CZèòy‡Ô)‰#4í¹Dÿ&w?é\%ÐI7¿B£rŒ–eå­¿¢™«ÎR÷‚µÒëG¸Q¾qÁé§8ÝIÛK„fû^¢á:饃aNI&¨Š‡xgi÷õß/ÎeìqÊ8mòSž—ûÝëd,–Ò‰– >Á§®A3˜­ßÏ›LÔM³…¦)âÀØ„ðPK…ÌòiüPK7Aorg/hsqldb/lib/MD5.classT[OAþ¦-²lµ´\äª"biikÁb¼P@iB!±hBxÚ¶›v±ìÖÝ-Â/ò5)&’ȉ¿É¨gJ„bÜd÷œ9·oæ;göûÏÏ_LbYBcdÜ“ĸ!±K˜@„#Ê“Àq_‚qá™ä˜j'ùÀƒ„„i<äHJð‰ˆiáœapn C+[ÊŽ³Ô|ÕÔì½XFµ,¥¨.jEÕ²gÜsš®ÙO(<8þšÁµ`T²ªz¾¡$ƒ'ùeE/Ʋ¶©éÅÙË–ñË&ii7¯VlÍÐ-*Xh2Œµ(Ø2=øÈ›)oÖVòo2Je]É•Õ]2¸™"7qAÜpÌÊèA¯ŒA sÌÉx :´”ήE’ÉÄL$.£ýOe<Ã<ÃhJ3b¯t«Z©¦­–)„zz0†þ³½¬ê¶¶­ž:e¤° @èƒß0‹±’õ¶\ÈÅÊZ.–YLÈèB7qO*Ç’ŒçxAýݱU#[Í—æËEƒ–¥ísà¾3ðµÜ–š'z‚À™}½dï+ ÃàO\0ô•g2tåöluÞ4•½ucYÝ=ñ3ô[uÈwÑÆà)ªvŠªX"íŠnylãOxW°eáîV©4œÿe†ÂNë–­èy:müê9»â. N÷)@בÆB´…´6Òihè{ƒV$™°†À>@<}bhàh¸»I:H¶‡Âu8êpî7BèuQž‡B1Ô µxÈ画­Uèp34 'Y‘ð1Ü~×J(\ƒ;ó¾Õ/ðlDjh?€t8QGÇ>årxé7ÀI»I9^8ù2Ç­9n_iØM€©ä•oá=Æ€ÿZ×?ÁK83QC§À!o¨øh5|9¤T1ý„éFQ*%"£ ÅzáüEÁsÜã•ÓwÏí¿PK8“iÀPK7A-org/hsqldb/lib/MultiValueHashMap$KeySet.class…”[OAÇÿÓn»eÙj¹y‚[Øu/\¢6$6BLÄ”àÛ´Àⲋ݅ˆÅ}áA-‰$úîg2Æ3˶ Û¦3³g~çÌùŸ3Û_¾ÿ0….$1®á&Täå|CC75Ü‚)‡)·5$0¡X¦åpGÅ]3*î3Äý ËËN1Œ-¹õusÃ{k×*¦mUÌåÛ·ÊÜÞϸ·±Ì·g‰ž³Ë_`Èñ|™A)º5Á°|Qç¾[g2ò§]Ká& xÖ{â£F¾D^U×ñ¹åx ÆÒ&ßå¦ÍuóEeSTýÙük×…Ï0~Ön»‰p^«‘ ŸØ6ÃH›Š¢kÛ„Z®„×Å–»K %W|^}Cª^ñŠMϪå-nmû{Aªƪ¶àõ੬#…½È©xÀ0}âT ó)÷šEÊ—í¹Ø+µª4pŽ]/9ލmîyÂÓñäA³*æt\Æód<–þrÇñ­-±ø®*¶¥,¤ud‘c˜èÔÂ,½" o.R§‹ÊÐ{*JÀ¥ÿ'š:Km D0ô';©Q£ÿt¦-Bp·2ÒgènÞ ÊŸ„'éa¸–JÉÑK¤Ñ¯}dí§Õ%DèKÖÂä7°Â"_ ?ÔÚ;b†¡Ð è9Dt­ðl­eõ±Ï!JmÑ~š%šXñý¸ŠÁì’ÄdjBºäI"±v€®Ÿ!1Ü r1‚kˆL+Æ íGiNÐæÃlºWåSú#Tå”è~à3*ã ò›îÙc)o ×ÃÙPnRz}hsŠ!ÒxÐÝ;»@z³Ú“AWdF Tï$ýiÝþPKÑd ;ùPK7A-org/hsqldb/lib/MultiValueHashMap$Values.class…”ÛnÓ@†ÿ­8q\0…z ´iJs ¸”ÓE¢JDj…((½Û$Vâ²±ƒíTÀ£ðÜô$H$*Á=…»N MÁ¶¼^Ï~;3ÿÌÊ?}û`÷ÓÈ «BÊ‚ÕàW!¡ ¢ˆ’‚*¬¨Ä”˺‚› 6ÜbHúËËm0d··mt¼7¢Õ0„Õ0vú·j\ôͧÜëìð^™è–mùVóñx¡Æ Wœ–ɲ|Óå¾ã2Ìç §·V£E {Ö{â¥|¡J»šŽísËö¦óÛ{|Ÿ‚ÛmãYcÏlúåÂ.¼Õ¢´h|,ÃâXZG‚-Çù¤kv}Š XÞV·ç¿ cÑÂä Ÿ7_SÚ/yCÐz¢)L5 çp^ƒŽe› ë„ð(mÓx½‘êÜh^=V¬›´ªm›nEpÏ3= ·q'pWÁ= Ó˜a˜;Qû¼oûV×ÜzÛ4{ KXfX‹«.ü Ú%Gýt fÿY.†…ÿé¤î´M?TÀp‘zzâ;4R/³5cÌCy78 Kq2Hm†Î3uL׃NЉOÓ£ãY§h6ƒ ºµXú Vbâ3‚‹Ã¥ˆY„L3`êR½ø¬>€üJ"ñ)b©îì ØTÀ <ˆˆË¸rLELB©‘ú³±Äæcˆ…XWIÍ‘‹2,þEþY:¡k4&0‘ytbÎÖ¦Ž*µÔ†¢Iäó:Õ*Cÿ ø PKÊ2%|5bPK7A&org/hsqldb/lib/MultiValueHashMap.classUërÓFþ66V,oš‹sƒ$”¦ (rŒ^ $\‚I…\ZBCqz“má8Q¤Ô’3ð(<úfH<´þ2Ã{ðLÛ³k9qm…âíîùÎÙsùŽüæï?^¸„mCøJÅ0®ÆIÌ1«â®‹³BÜbNˆ[Bdã¸ù¾Æ7 ,ÀbQ¥³;ÂÕRœÄ¼‚e}X›UߪÀŠ‚ïÜeˆ­›vÕò¸á8V%k›ž'¶±;Öã5˧Åv°è_r+¥Ì¦÷›]Ìgìr>C§3¤ß Œ´ê³®m[¿ì:ë’0÷*¦ïVN¶¢*ár¶ì”ýë mj!šu‹½4CìÔùGkWxõ¬¦$‚KkK[æž™±M§”YÍoѽ3Sï¹"²[%«+!Va~ÚŽ(ÆŠµãîQXgCo±H\Ç7ËŽG•e3ËQ(ÙJWÖ-ëVÿ#ƒ‚¡læl›z µæ¼`z›ËæîŒ(]ךo¶iwÏÌÛ–‚{ ƒZ[•êmkW4õ“c“B|ϱŽû?à‚Ç~äø ?sü‚_9Î#ÃqAˆ‹0ä9F1¦ ÀQ„€ã!J›(shHsèH1œk¹x¹jûeY ›‰:9E[§ññ‡Ø4ˆ~æÿ £Mcen™Þ‘zü¨ •¤dÚs•RuÇrüCn2 C>E3 #'ÒãÊÊËeO’aÜéÞ9 2ÀulYzZ¡ ›e}`hzˆ½4õÔ"8Â#ã}ã’4‹ÅÕÊ]IùF½fµÅÅ \.t C£ Ã9ÌÐ×NUʸ|˜×H;i›’P¨4+Ö#_V†ªuä¦_ n²m”ÚˆBC…Oè£:Lï=ÄmˆR¾Ïà ÆàS’´K¢ƒV€¢÷tÖÀžK L’bB ЯÄb‘:tý"¯þŠî#ZGŸ¥'J6çèÑ08¦Dò#<ÅôT ¿ú áúxC‘þ MJm >Ãçê6•#Jï©Ô $^‚3,O¿Dà Óâ#†=J û=÷Ÿþóö¹tðIJôT_ŽÑÁ(.Ó²Àt?Õ¾÷5ºõ?Ñ÷@¯!¹^qôìÐA,IËÓ¸bÚ_7¦ƒûÔR:j3=Ôa€JzR®‡0ü PK#î̵¥PK6A%org/hsqldb/lib/ObjectComparator.class;õo×>#nvvNv.FŽŒÄâ çü”TFQ Ÿ¬Ä²DýœÄ¼t}ÿ¤¬ÔäkMOFöœü¼tïÔJ*¼äó‹Òõ3Š sR’ôs2“ RÎù¹‰E‰%ùEŒ èúDÀB¥%™9ú•lŒ Œ L@Ì t) # +fc`Š0PKê·HIÄPK7A#org/hsqldb/lib/OrderedHashSet.classTßSUþîî&›Kù¹P"ÒjnÀTTª¶`)EI¡Å’ -¨u“¬’d1˜â3ÿDLJZ¦3}áÎh¨:â›ñ/ðÝñQßujõÜÍB ÙJ3“ûcÏ÷sî9÷»¿<ý~ÀÒ!Å;AèxW¬Î†huNl‡ÄjXÅ{!¨8/6#b¸ bTÌz,HßÇ!„1. I1\ÃDÇ0¢bRl—U\Q1¥âCÿ¹\1Wfc½3 ʨ•5ékÉ,X«´Ðc“·ŒU#‘7Š ‰©ô-3S>Û;ÇÐ*™¥ËÆò5#wpÉÞz$ChìvÆ\.笢M^sEÛ,•ÚcI/·*®R¶IˆSž¯²‘Í>Ï#H^îÔ²5R*k8ï 0YÌš·Ÿsè$C#A&Ò‚iï"Ç&­ÒBbÑþ"ŸM'ò¹tbª”5KfvܰSf•ÖD´TÁÈçk<>Z…‚UË›³H›•"åÙQço׉ŸŽ9’Ï3Ü<,äabg˜>4‚GgsÊ,š™¥iâÐmQè¶Ìhˆàm ÓHi¸†4œÛ\Õ0‹ë 'jQœªM­”§>¿@uÊÚ{—JøèÒpÝbè¦ZLMC}æÐ¥b^ÃÇøD縮á&>ÓÀÑ£¡¯1Dÿ÷Þ„A—çȵRßh9™³ÉÒRßO†V;(äaW9Œ¦UX5 =Ô3æ<õpÄrVæš+MÅÎ}i:ú¦kÈXŲ‘jôeò¦QÚW²Ôš]6 ACˆ%c-“`¸Gd­%“Žˆ©"Õ'$(ÄbYK+ËBt‘ÎKuWmÔ"dDoéA@½VG!¡“ž0 Lô›Æ(íÄwF³Æ›Û`\ùÒCˆùE·‹: ™pÄåqeòÏP•PäMö2>H ç™Ãé!¤àD]N3lCáüø"‚½å¸?N…*ýOà—t—H>šW#_!áøï#üÔÛüÄû*ÞOÞt,_#(¾„6ÅæG„¯ðþ c ò ¢+‘ ´ð~] ÈìºÂüû§ŸkÿNù¥vž45ØðZU¼ÊþFÛhÒ÷¥}§Ü´Ûh–iì¦ZwÄz_Ë÷j(º#9Ýqjè”°¾|¤M·O¢47ôˆ—ã;иÛNR¨ kw[âñxM4oº˜N»˜K„ñÓÜ' ÉÄò*Q]Ù@”Ç£´TÐ:èÓ}]÷á×}Cë2Õï·®Zý4ÈObŒuþE)1¼¾çwÞõ{æ€ßØ>¿Ò]4wѤµ¿>¢J5ÄôPk¤j ¼áw¯—)¯ŠÄE£ß¡MÂø×%æøþÝ+ýá5HïÖ[®×ÓnGŽÅÃÇ·øcq=uêcû§ÓtÌò­=/ $˜Ø1 ¾;Tϖăî²ã.[ßǽš8>KÔTà?PKÈË–K PK7A&org/hsqldb/lib/OrderedIntHashSet.classuTMsÛT=Ï’-ÇVJãमíô#Pl%i´4䃖*qâ’”†¦+ʼnU*’Ò ¬Ã(,:t“Mí ÄS`ÊžÁ +àÀ””{eÅñÄSÍè½ûÞ=ïÜ{Ï}Òoû?½p« ¼‰‘Ò(u‘õ.[xï"[ï±õ>[°5ÊÃ%Æ]fëC®$1†ñ$&0ÉÃG žR0@ 3 f|,¯ÛuR@*o ȳNͤ© ó*qu»jÞ÷ëŽí)¸*¯:¶oÔm¯‰X¥SF­&нìÕÍãþMcÍ¢ã1×¼ç<0\#ĺé7á:ÐB·kæ¶@ŠL:æú †_ݘu¶l‚E w\†œ·fºf­£Ó–%0P(;îziÃûÒª­•¬úZiÖ±,³ÊùŽW|" øÎ´ë_qÅ;Äœ¨n˜ÕÍ%Ã^7Uô!ÃÃu:æTÌ#¯¢Œ‹¨¨°ŠèW1ÀŽó þ×T,aPÅY *XVqŸQ$·°¢âs>|ƒƒwFÉ¢8¥ àÊ–_ùb†*¨y-Q9v¿Àé#U„…ë¶Ýð6–Y¾\Äó×,ÍžÉn]àl[0R`ݰ¦Ýõ­{¦í·b D¸üþ#±tßt "$¥ º®¯r×cu¯\÷(ª 'Z>o²ˆ^ýk3¸+Ä•¤FTÜ¥ Õc…¹¹òa•µ»Ô‰±ÎÕbç5¾j™e‘¬Û>E ïQ]ƒ²ãlnQ™×öš®U½UF¶P±m†ì€²kÛ„Z®–Oz¢íîÐTË_mw‚Ýðhßxý ©|Åk6Åu[p/Œnê8…Ó:2˜Wq›¡xd ŸT ó)÷EÔ¤\ß®6(3èÒ+Ž#¼²Í}_ø:îà®,OÅ}“˜b˜þ«õå;'°Úbõ}]t¤s˜g(Œ0±™²ŸÉ¾‘9ÞC†‰c…Bnöi4¥ðô g£ƒ 4—¹1P¡´%ïÒüp…®ºX&#AO‰F¿ Îw‚¬)ÄèKÞÂÒ7°B±/:ÎEL YÀÄ>âÕÂW°jÊk¥‡Ä爥¶G¬Ì‘lJr]$÷"â<.;¦ö¡V{HýŒˆ‹˜BÌ ­1‹KCˆìЗ©kD.Ò2^èbì#T唸^]¥5Xú±$èJ¬^ë÷2/»G»Å±ƒº™¦·ÏMàPKðnȦG¸PK7A0org/hsqldb/lib/OrderedIntKeyHashMap$Values.class”moÒPÇÿ—…Òinº§LypvΧ£’%#Î,Qƒaï.p¥Å¶[œÅ/à›½ÐD!q‰¾÷CÏeeÓ¡B›¶7÷üÎÃÿœ›þøùõ€5ÜO"…% :Ò*–å7«AANC74¨HkÄäÎŠŠ›*VUÜbˆ-ËϬ2,oº^ÓlùoìFÍ´­š¹å5„'e'x*ö7¸ßzÆ;Erx`9Vð!›Ë#Waˆ–܆`HXðxàz sÙÜiïrh¤QßzG¼’͕ɫî:·Ÿa*»¹Ã÷¸is§inÕvD=(æ¶ äUFïǶͰ0TYɵm‚-×éóqO´Ý=Ê Zþz»ì÷s‘aâEÀ믩염f“=V·÷úÖŠŽ38«ÃÀ¢Š5†•ßRøT¶0Ÿp_„ª3ƒuùX±1¼¥—Gx%›û¾ðuÜÆþ®Š{:¦0Í0{¢öù®Xm±þ¶.:R‡Ž«XdÈ1‚L…Û»‚Ú,ŒÓ]d˜ùgÇæÿ'•ÔA_ÃyëIìþ&séy E(nË3’C iNÑÙ¦9†œþ$=ÎÑî$­¦¡Ðò…/`ù"Ÿ /ª BfQZ“‡PªùÏ`Õ.¢¯”bC–º²ÒG² Éu?‰‹¸tLeLB­öø3#‰YÌ æGƸLjŽˆLXéD¾‹ä{¨Ñˆ*}è ½cˆ¤I‚ÎÍßµiƒN]—½¡l żF½JÑ?Ã~PK?€ðá;nPK7A)org/hsqldb/lib/OrderedIntKeyHashMap.classU[SÛVþ6‘ì@™¶¤ê6½&ZB“¢Äà(mHo²}j‰J‚¦ïíèLgúØ—>™‚›v¦¯é_É_èmWµ•™xFç²ûí·{ö|’ÿüç×ß\‚T1‚×TŒâõ~Z½ÁÛ7yõÛ.ópEÅ,®²cއy¶½Í«w°€kXÄ»<\ç° ÞS1„%ÞX nªÈcIÁ-%̆íìÊ@@³\Wú‹Ž¼ÍÜ’_¯ÉÛñ"_òüzq+øÒ©UŠN£R$ë,ù÷b½Ó¿è9ެ† ÏeØÕ†ÛçRÆä†@zÑ«Iš ‹wêõU¹ÃÈ@Á2aêœð9K÷ì=»èØn½X®Ü#6¢\ íêö²½³nW"Iíìú¢auƒ“㫞Ú 7ˆŽÎy7©d_Þ÷ö0p@=iÕLÞÁֹ׽߷ÉÔ`bJÁGî`“}w5|Ìø¼¤a ¯*øDçøŒJÐð9l T5è(˜YË~Mú²f¹!qɶ¨½ç[àjLøÜ3†)êÜ3€ ÇPAèù²xÍdÛ=ñ¤§5¦n; ~}÷¾töfF;2Y¡ômâP ˲6Yc™FPj$A—×O+yÞöîNë>-¬]YT|,¬\Â’ìZ­ì¯ÆÚ¸bÜìu[6•8tìpn(ë’+ŽtUþ‚Uó?ýLjYvt“Egèo)vÕûJàÌSu%Ð×h7HïVàQ÷(“²e+òA½¶Ô·´mòFâq £“*éÊé¥À8}ŠFék×Céü#ѨBÞ^ qœv9Bš3Ûׄx0AœEoDrÂÔÓ™T=fú©î=iBŸ§ç^Œ)§ Ÿ¢9oê‡HÏz~€jþŒÞÂ¥}±±_¤1ñ†I,00GŽ•#USÿvZP²Ì~\½ˆ1f˜Ø¹žŒ9Õ„òSìŸng¿LišÇMýôQýs…ïÑ+ö‰Sˆ4q®˜…C¨3¥d¹z±»ÒèM ¥)âåØ¿@…rš æ!´GXNÍO? ï0<5FË“kߤÄÿ>~ØN¥¢çoh ^£dÑéϨE7õ8MÊþ“æoºc61|€,›ž›‚ÈÑ’¾> ¡¹VhžCO Ǧ®Ð3ññòÔïÓ´¢ù,ðPKÙW PK7A'org/hsqldb/lib/OrderedLongHashSet.classuT]Se~ÞÝÍnH–ÚC$Ðm“[´|XÀj ÔbÁ¯%YCJº‹»K½Æà záØnêŒQ2U§Þû+œñNý:•zÎ&†h2y÷¼ç=ïsÎyž³ùeÿ‡Ç®ÀŒ Ž"èÄå6²®°õ"û^bëe¶†Øfë^^師lð2ÅÆ£x ×x™ààI™Òðz1\×ð††7ÔÑŠ]ñÇätæ–€2å”,z¤s¼‹\ß*Z~ű= 7ÂEÇöÍŠíqÄtf™n™¥’@û¢o×gÍ›æj•®«®u×¹giÈQDÙòë€Ó@›œ]²¶êtÜAºíú³¦_\›r6mŠ¥W‚Ãn:,¸%˵J-1*ež¨VzÓyÇ-g×¼«¥Õlµ²šrªU«Èed–5P^Íw&\×ü„ÓfVÈ)®YÅõÓ.[:N£‡—yÌê˜C¯Žæu¼…ƒ¸¤c]:úø ËÁ7‘Óñ6.è8ç4ÜÒ±„w(“ŽÛXÖ±‚wu¼‡÷u|€Îß1ï™Ù*%ËÍ6ýÂG“ÔFÉkÌt œ=ÖJ£û¼c—o˜ÞÚ"s™<ãùŽke'MÏâcR@àÜ‘lÄCÙ¬N¸åÍ»–í7“ HLÂécÉr¾åšH|¥s¹Ü2€Zñò² R;z ÿŒÅTz•O­`pHª(ÉQpÝFÒÓÓùÃ: «wH‘VÏr¦ÕGò«–IUèUj›R5¦ª¦!ï8ë›Ôd÷ÿJNCViö‘HgŽÇA“”G[3½9kËz öÂ6m˜êÀÁSRwÔSòs£Û?¬IZÉá,½WàÁ2ÒÚM»$²Í8®A< B8 ‡8 !²€F"$Ë5H†ò=äz\‚~ E'é—Bo²2}Õè«AyÐ@ìkž#L·€”±‡Ð¸Ñ×&áªKÁþ+hÊ.ùApé ­aHO×H]êâdƒü=gA”!%®ì M.íjȨ!,©qµ;ôø>bFw(®f÷ж´­ŠÝ§ĕÔ1(õ”ûˆ çÄ_Dˆàר‘½‹(aRt#QCÄøÑDö›F£ÏãB+{Ј¸ˆt“ˆúyJKöSMF2K”}umÛ•õ{ò(òH¢#DûLd‚¸d‹ 3Ifà>ºŒäÚ ðóC¸_[á’ g ¿7O`,ÎeFë„sƒðŒÀNd`ÖvŸþ™üoÁÚ¡üx茪џS=OØ*=¥Q¾ûStVO PÕ)&òÔ(1Ù‘¸ôÙ°2êTæ·e*ù·o KûˆŠüM%ñÿ\¹¿¡H<ñ%‰Áà_#ú#b·kxöç‡M’Ncó/PK!öú\ÅPK7A1org/hsqldb/lib/OrderedLongKeyHashMap$KeySet.class”oOÓPÆŸ»•utE' *àT(Ømbÿgƨ ‰‹1˜ñîn»ÙŠ];ÛJÄâð /4Ñ‘H¢ïýPÆsK‡ÈˆÛ–Ýœó;çÞçœÛþúýý€e<E†ó*®Éÿ‚†$Š®cQÅ *æ5b¥ÇR±¤bYÅ-†Tزc‰aaÕó›V+xë4j–c׬5¿!|ÑXõÜæs±óŒ­¼S¢Œ‡¶k‡òæp)ù ¥ì5CÚ…ÏCÏg˜6óÇÓ+q6QûñI3_¡¬ºç†Üv† su‹osËánÓZ«m‰zXÊoØ!i8)Úï"œ7¤„Ö'ŽÃëSRö‡PÛs£ò)_´½m:j+íN¸cë!¯¿!•¯xÍ¡øHÝÜ¢:Ná´Ž,æTÜfX<²E@*…õ”"n’ѳ+‡ Êö»ôŠë ¿ìð Ž;¸+ËßSq_Ç&¦þj}ùÎ í¶Xy_©CÇ,æŠÃŒÌ s]64Õ3²Ç›È0~¬RÄÍüO$M’ÆŸá¬yt2‘“3ûÏ$ú*”6åe2†Ñ€+tÝuЈÀ²Y9 zR4úeq†¼ãdM"A_òŠßÀ {H|üÐáp.frPÈÆ÷‘¬¾‚U»P^+{ù³Ôø˜•9’MK®‹ÔnLœÇ…Câ`Çô>ÔêÒ?câ"¦ÓkÌàÒ"7°ÆeêÚaÄZÆ ]Œ~„ª|‚’Ü «´Ž ‘y, ºT'«×z½ÌËîÑnI,À¤nfè tøPKŸ@¦%H¼PK7A1org/hsqldb/lib/OrderedLongKeyHashMap$Values.class”]oÒPÇÿ …Ò)N7Ý‹Óm8)8;çÛƨdɈ˜%j0ìî@O ³´Øv‹ó£ø¼Ù…& ‰KôÞe|Ú•M‡ mzzrÎïyù?Ïiüüú À:î§‘Á’Ë2®"84eÜP cY!¦¬¬Ê¸)cMÆ-†¤ß6½ÜÃJÕq[zÛ{c Ý2ú–kWUÇn=û›Ük?ãÝY<0mÓÈ åÇ3Ñj RÙ1CÊô…Ë}Çe˜Ëk§Í+Ñ&‘<óññ¼V!«¦cûÜ´=†©|u‡ïqÝâvKßj숦_Ò¶ ä†A©ÑøØ²†R+;–E°éØ!ŸtEÇÙ£²émtºþ~‹6&^ø¼ùšÒ~Éí'š–àn¸[SqgUd±(caõ·¥-ô'Ü‘êÜ`^9Vœ^R+¶-ܲÅ=Ox*nãNàþ®Œ{*¦0Í0{¢öù®í›±ñ¶)ºW±ÈP§¹·vÕ/9˜dO—‘aæŸ%c˜ÿŸVêPKø¡ †óÔ×ßá"õsé† y(m‡$7ŽR¡óMËfƒŽÐ¦'‹s´:I³iÄè”Bñ X¡Ø'%‡ ³‰fÀä!âõÂg°zÒ«x‰KõØÀ&`S×Cò ".âÒ1q1u¹ÞGê{DÌŒ$f17‚˜éã2©9"rQ¦…Òï!K ÅBè Ä2‚NÎßµ)ƒJ]jCÑâäs…j•¡ÿ†üPKcx<rPK7A*org/hsqldb/lib/OrderedLongKeyHashMap.classTmSU~nÞÂi^°m‚”mÀ(Ö—–Š»4m´‰h©:³°%Ù» ÿ‰Ÿôô3£c¿:ãorÔsv7/„ýÌäÜ»÷<ç9çž—û÷¿¿¿°‚ïâÈà£8f°6N»Y|"á¯ë,6X|Êb“¡[ ýŒÅ} ‹-ÖnKxGeþx(áQ)”%T$|.ÛQ›Gš- +†¡YMÕ¶ù3ö@;©jmýMºlZÒý}³¾Wjê{%:]%ý±OÖo˜Í¦¶ïè¦Á°»º¡;ká|aG ²aÖ5Zò Å7ŸïkmFÚ¾ˆæ•]>Ÿ¬:êþáCµ]S÷š…Læ Ž%“ß.”Ÿ©Çj©©Reï9"/Ó¤u/´~¢uí9#•@d†Umß4êçñi:¯èÖÐqƆßÌ+Ù¦í@âpûÈašíi&)GÕ Û¥áûîR¾-­e`¢k@å„o³öv¿#§ •Móð¨íÑ) :ÚÒ-ÛY?éjfò…à~™½¨h¯cžÅcUÔd| êƒÄp2¾ÂŽŒ¯ñ„w»¼û·e<Å72Ï»2ÞÃû2®"+°8ä°bÕ5K«—M£AY¹¯ÚÔc ^dzóoeä0;ª]w‚FA ä`¶cZZi]µµžúzÿ® ¥¥¡6ïY£–f8½!òŠâHL·ËºM-$¨¬ ÓÍŽ;2©§A5œò€–Kèví³Ò7¸4L¶BóÕ¢)né?jc³Õv¨¡&Ôz½b=ö›íÎh}µØX…üpcfpµ°ƒyzÊfè™ ÑŸ* þQÅH&!¨€s$¯ÑWŠ‚V©˜ë@¼t ˜'Å5×8ê’L³ÑX¸ƒP1r†°‡»Nÿ¡o¸ ¾E,´ÞêYEäÕŸˆž!ÆÖ’K‘û Óš1>ézƒýAü‡·–ð¦C¾n"Dž"´¦‹s¿!¾6úqæœ]9§=®Ä?HR €âÀÅCîÅ ž]9õ/¾ˆõK€±>`™¢ö9?¸„ÇðÈ]–ªË]d)9æ!Ç‘o㙡Ë0r¼8·,(¹] ´IúqÅŠ‹È/|ý­^Θ"ìQˆsôô(Â.$Vœë`òE/Š|ý QDiSW"ƒôÂqLu9îôÒwÃs*úQqÚ¯ƒW´0„DÛ«Xõ –Ýú— 9ý5ÏH<)vpéŒöttÎ4EÛî˜&=Ó›¦Ïä£ ¦—ý<¦([¯qah½üPK¥+;¥Í|PK7Aorg/hsqldb/lib/RCData.classÍWyxTÕÿÝÉ̼;“I& ú˜„DÁ¢N@ IÐ@˜„`ì‚/™—08™gÞ—ÚÒµjk+µ-uéT[Û`e@ÓJíÔî‹Ýìbk[»Wkk1é9ï½I&aRýúGÛ|™sî=÷œsÏ=÷,÷=1öð#Vˆ•>ôã~Äp‡Ä|HâÃ~¸qÀàNw)¸Û¯ÞÃø£ ²c|¯ܧàã~ð ?*p?ƒOú±Ÿb0Ìà ‚ü²Ö >ÍàA‰CŒsÌ}XÁ‰‡XåÃ#ŸñCÉϲð#>ÅçüxŸgc¿ ñE‰/IŒJ¤˜pL"Íø1‰Œ—ØÅø ‰ÝŒ¿,a2þŠÄWMbˆñ×%¾!ñM‰oI|ÛO„ï0xR⻌¿ç§]¿Ï£HüЧð#?VðöϽ?õcù´ÄÏüø9žñãø%ƒ_±Ø³ ~ÍæÇoÿ–Áïü^â¬ýâùsÏKüY≿HüUÁß$þ®àEÖú‰—üˆà@)þ‰ã/+¨lnY׸¥­kÛúæµMÛš;Z»[:m;ôz}LÔwš©h| A ¬)O›zÜìÖcC *bô뙘¹>ÒÛלŠî4Ríú Ñ]ш@I&™´‘Š[T™ÔÓé]‰­¹Ì¨€7b‰(}ÛõTÚ0üf*“6Óf"EüJ,Ú›ÔÍí³i±yúV´ýÒ\Ö-ànJDH~Þ@)ÛÀÙK—;Ÿwu45ÏXèhŽ&ê×EcFCñ}Ê:M½ïŠz²KïädãtS VߥÐèT-»ûŒ¤%ç \_Äèÿ&… ¿õlCq«îù¿³j†k§¸¢Dˆ}|¥sóÁ”¾2V?¹Ð !Ððª5“UQE”T»“z<Ò9”ÞœJ$»)]Î(þÅÂÚCéÓÕ*ZZt›â§ô›Ñ®„=çLk-¢YEq× ·ÀüDj n;iŽôÖí l«ãj’OÔÓ'E[c1c@5¦2ƒFÜœÈ ÒÐѤõS²i\-´xÂÔÒI£/Ú5"´öPr©Â#¼T±ò¹Ùº©@~îtûÖf¢±o¿psÌÐÓ†FnÐ2IMϘÛiëhŸÎ‚öžKT¡ÉÀGK3?®˜“ßhm¦¿ßH‘C·4 «ƒMd?”2PUQ†kUqƒY¢\" ´D2f4æ˜×•¸ÂˆG¯"IQÉ\³yG0¾MUìÓÊÉœ“Šp*•IšZ,746y]±kK¨ô- kM©öF#ª˜+æ)"¨ŠùâdET«bö¨¸¤Å³Áb2Žeô“ªˆ¦Sö:j‘â«M3ØÉ`ƒÝ L—fJ§£é„Š ‡˜è[«Glq X²À¾Drz"Å{•.a+mSPtÒ9†jµ%N™_b³g’ÉDÊ$k† “ï}ƒ(£Ô°Ú]z:¯ZŸY§ˆSU¼·QÑgŸí®‹f]:«³úI'÷J&Uhâ4Uœ. œbù–Øê7ê1²oЈléh+p³ß²šhlk¹5áVfG§å8&å[š"©b±8C¡ØÁb)ƒe*Þ‡÷“ðôÀ¤þ·h*B¢†A­*–‹:êIì½z*ÊÍ„Ïf«*êùT ÛÚzÒ¢¥‡Ò¦1¨%©)sHÛ5·;&‘ì¨îêhlïllêjÝÔ¾­£¥±yÛ–ö¦M7¶vuµ4S–°\°xòÔÅÍ-]kÛZ,>rmájgKGkc[ëe¼NG,\jßÔN¤ª‰RÓyI¡_uqäÔi;±::/=$¦]|ïÅOÕ“z»žÔS€Ôw45릮Š39K\aª¢*Î+êšèŠƒš¥W·JšÖJÊíìŽS™IQªÇì­ÂÚ”ûØÔ»ƒŠ €Z˜ÏS¯k{*±‹oD@›¤6ÅèÞÛæºD&)8ÜìÉ$ßl_QÔHçõM-»ô@ZÊuVéÓã\A¬ùe”€z2iÄiºüU•w§È5Lã·öoù¥9QÞ+¦=wØ®ÊIš]à,ªLѸRœJ ’½1#>À42ŸzŒ—ßräR7µŒ&Êù>r‘iÕ:r„/nì¶'Túb‰4é©.Ö[&ÍôWfôXzÚk/¾Ë¦¦—•dJ"CTM`3©¤*@¶6´2ÝC’g±¸Ýß oo^¾¿O»W6.e &vÓzqç;$2-ɦ[„ýU*˜5- Ér*Dö³vñ+„Œ%Ðïkv‡Þ¨ÇõîkËfV0íÑ °ñ?|®Í¤O‰Æ#ÆîMý3¼ë)¶€rÂÕao`AXÉâR‹x7æÚÄå9œÂ im5otjž°Ú„­§‘‰U2‡Ó óV/¢`›¾øhí1Ì zgä°äöñΰ4¨ä°,;~qž=¨ÔZƒrbèN ÕBȽÊ_X|[ÚH%5`å'álM>ËŽ=]å¾}ì)Ú¬ÎÚC •C¨ÏŽ=F¤3 HgeÇiEievìN"]@zMvì&"­* “»šHçÎËŽE‰. 5dǺ‰´º€´&;ÖTü|翲['EØ—EU¸t‚¢%XÊŽw$ÖCm¡ò òλð„@[|”ø×Œ:ÚÈz Å(‡çŠ5âBH×<×—FøW·«—ÒH§(ïsmw]AtFº• ×(âqÌC‰‚7)x³‚½ÀLðO¼…sH(x+0ŽS§-Y"öbÙ)'_¤àmbu'2Ùÿ6ã¼Eß ÏÜ€ý7³X^·Ãá™Á0o‡jÑUïàA1[¸ëËñNq“k4«P¼Ë.X@š%דPMíò ;è zƒŠ8ŒµvÉ™*´Ï"G‘PY(”$ÖTLìGl?UM?ám“E‰«[ˆÓ®>´œR!tS‡‚>ŠÛPÐC™ z)øíx%oPN‰“šQ(µViÓzÍJó€e(G›ã–½3ýŠoŠÅ7â&ÇâJ²˜]­„„È¡exâp’Þ6Xì7Ûìâ%RAÍ¢]„ÝG°.졪;—b{å1È@I–Ѹ= Ysµ“ÝsˆpÎ(ª)ìÎÂWk ‚nªHAOàâZ·fQÆÃ ;‡õ[EØËéÅ\Þ,Î +#ØÏ2.rmœd 0'ò¬ý¨³ gb5#V¡° Y¨B:*6Ù*Î:A…$êy£8“«Y, û Uø›'Å–Á%[ƒÊ1”½GБ¥²bEÍt†}¤©a”(Öຂ¾aò°ŽÔtݸ÷c˜ð³x/X×Ä·»c˜Ÿ¿Æ[š•¸çxfùÆq”îü¾jJ‡[kÇQYt} ‹o&–<—Vq±‚÷GÁ‚¨Ø@qáãÏO§U?E{9üG°¥‡B¿»­&°5‡K×TßAÍ{kʯ©ö\žCÏù ,Bº†¦Ô/sªûN'Þ_ËñôÁëìèXÄÔ|u}}¾NO^•÷¨³XSRMê˜ÁÍ¥w›v{ƒÍÕ–7k†'2¦Þã|ð½ÇQ&Ž£\¼Œjª1{ÇQ ¯SçD>m^Äb:(}Ô:Ù²ZB8áZSØf5›†—ÛC u{¨Ð°×zË%ûlr »„zFdâTYY‰þødÛíÆaŸ.z4Týv¸0™ï¥l}™ðûKýµÍ—q;Õû2®$[9£·Î¿ÏJæµ°ÿ¸^@¿•ô[åÐÏspþ·:°m8pùp@ôú†óF^A&ͧ¦IfMzRÂ{¶‹ÿ€PKçz)ª/ PK7A1org/hsqldb/lib/ReadWriteLockDummy$LockDummy.class…QËJÃ@=7}ÄÖ¨­ï(E©.n+nª‹JAà.¡¦¦ÍCí?¹Ð•àÂð£Ä›´¤ª&gîœ{Ï=sçóëýÀ>6ÊÈa^ŢЫ„â+ÝèÓë—„|ÓwƒçÛ·„j-‰ ˆï"×òú„òñ“-8ðe¨b FA¿f³Â5a[?iwÍÓˆ#×3l_ÚqçnO\p¯F’UŒå …&ÅcÓ—Ž›(t½>¹:É,³¡¡€¢ŠužtŒ›ðÞs,Ãs-ãL˜ÎUàF"qu÷zýlG(íµ–”"hzfŠPI{¦ì§VWØaë/ƒKoŽŠ²A '›¡ö¯=Ô ð«ðÔù‰TF¾ÿUŽªŒÄXØ}½"ùS=“ÆQ%¦”IT™Wž¦yiLêg‡òJîy( ñ™’qù1n\aîw•ÔóqzrË© qƒ,¡ô PK‹Á¬b•PK7A'org/hsqldb/lib/ReadWriteLockDummy.class…PMKÃ@}“´æÃª­ö=¤zXðªx©¡ xP !Ú$ºƒ!ÒèG"ÊŒq=’r’S©—7†9àPK UsYÿPK8A7org/hsqldb/lib/RefCapablePropertyResourceBundle$1.classSÛnÓ@=›¤ukLã^BBÅ%-Ž[É-¯ ¤T”Šª•xE{“le¼aw©-ˆ>€BŒ]"U4<„•¼cÍœ™=sûùëûO±»ëÅuÛÅî¸h஋ ÜsIwßÁ¦ƒ‡1xcž6û2GÜVº§|Ì£”gƒèÄj™ ž1ÌÛ¡4Í=†ý®Òƒhh>¦I/Je/:ýñ¹k5Úž £r‹—y–¤¢p~.3i_0¼fö¾N¦õŽ¡ÖQ‰`¨ê ¬u–­ãe‰âKdx‘á=ð^àm”+dì‡gex€GnçÖƒÜ:Ê­‡¸5€Çdø:œ•ñ8Þ°t¶Íw円4ƒr†Œw¢*ã ÆeLà15‡à,rV^6wU*mçüRÒSÆ$SŽh”á m)Þð.¼aEai/ƒ©­íT\ËrÒ¥£¶KWúÆL%ïÅÔ,eH7û $)u»:%•Q²y’Q>-”z:¹šÈà˜FX}+åÉ¡TFK¸³ÌbPVGSºSX¾3d Ô1K:²ˆIgpíÖ†Ô\š-Ÿï¢päÿ÷"˜÷Oj2Ö™˜"²~Îå”Êg 9ÏbçóÄMoóvn¿Rg|z øæ/8tV’_hY/µ¼Ùæ9eýYÐtç®’àBœ‘ÕÚZY«ê‹ŒPºçÚßÅ ³Ú5µxÎHYcÍ-ö{£•Œcèé4#SNè=Fj”raR#ðnvµž^Q˜l‰Ûß(Šj\FC©´“u¯`çÙºúø%£ÕÝÕnßoŸ¾N X5ýÔ"Q2ù§–çrà&.Yî¥)Å/#~Åm²Ü+àôqAS°zá~X%üVâ7ü„±ëÜúA·~È®%¾]ÒÃãöØ¡ŒoÄv›žJvý¨[ÓŒê|>Jô³Ç>NýOxúŸ¤þ§<ýOCµéÁFíÏÐÈêÑ;ÄðóP2¥gø[”»÷géG·Tšgʧ©ç§údx|á ÿ<Ίv£,9R8zJ¢° æ 7ž ‡| Ÿƒ…vcÑ9(·ç ’ö[8AßS´52ÅóPîé—S¿ÒÓ¯|ÖþFö9*W@鿟à <%ÀÓ<P^NôöpÆŸ’¸Õ‘ XÜE …Æ Xó•nñ_€ªþIX °8ËN£/䣯ò˜ÀýïC>? Œƒce!á<¬ˆ‰¡²W`SH|ÄàÊqX*»«ˆKupõÔ„*‚ °&DF¹nÖÒ"Yõ6j8%¶»éwàÔöçÙ¬›f³žŠFnÔ9ü&¡þ¥àʘ8kÆaµwM¬š€°K ¸U~V…42W’b÷ÇÁ¦Ðt„Çš·øÇßúE•ŸL-4Úìm¡Àl`9ªÈ%g¦ðTLÁ*' íˆqª¾ð¬¡î-ô{–Ù_dšš†@ÉŠ)X ÒœEýC‰_à+S´ÍåÈJ2jþ —ÝÎCÈ/NÇõ% ]×'§—Eæszµãôó°É—Ø"õ|•½øHÑ*q“= 06‡õ \Oª}w’/¦Q ¸(xA®ÚF!·ƒ•ôë _ŸÇ¥Ñ‹ça3ûþ.¶°÷ØqsÑ GCu4Df¢Að¢A(‚†:hˆÌEC¤(ž€à[°ÔõÒ›°Ýÿ”»@˜¢¬#åãõ«Xp'; Á-eÃLx!œ Ž"DE¡ñEøš›ÆV€ÏNc‹Âá™êÆh)½ÕI{_ÏC–j9l§hµ‡ê <ëRí"7rúÜ⚉ð&±§n¢ÂÉp5Á˜Ó.÷´+ tv=ëò3iOþº§cÚw[gÔI‚máÈ$lïŒVË›Kž!‚;‚; \Á[ìʦ{VGmúÄ´THŸ‡òhi¾팞‡]—•Aɰ‘¬³†šÏM °‰¶g…Bg¡•ï>M9~œ¬l£Ú¨ÀA€’ò}lÞ2xÎyÌ[â˜÷<쉜‡½ôÛç(Êtó–ºæ%ÁöF§©$þÈãR‘«Ø ñÈËÐþ8D.Àþi¬`4N@Çt:Ö\ íÔÆIèzé,tG^€ž:è*œöÁ¸½g.@o8r Ú£“Ð×ÅS/À¡R8ÒXЋh^NJ¼/º'ÉwI f^öx¹¢©¢yn¥­¹>L’ÔDݬ°4/â̇WMc±éÆééÏ_æçt ‚·9Í%²þþpÈ? ·Ÿ‡£—`€2ZàUX}…À¡m¤de†v«‘lrŒC=PPò— 'íP ROæð9p…ù{~ñ¼óS°1>Ìü¿Àßà›SŒ¢â¥…ÍF¼¢y9ù¦‰è?ÐboÏ_"Ý£â4ù¶Œ¬òcì,ÝŽpÐr°r’ÕbþÿUhöâ»šà\Ü™Ç^/a/ÂØ Q‚T¿!vŽC*ð.Ì/Œs‘àBcSfšÉbæºáüºTqêj>¢V…üQjTÛ»ú·øž„ÕU¾;wŒO½>gò»û üXô8ˆÎÂH~QÆC;ú8DéTskbâlBqš0$°|Ÿƒ›½dÝc*x‚ä"·Œ¼Pæƒ^«?ÌMÂèV¤¶?˜„S³Œ4–_ÿ.qÉÛû ú Ö®†$Eú÷àûÄ2\„•ÔßG­ „‰Mx#Æh|µ¸ŸÆgà¤]Ÿ¡õN(ò)bÈÃï%z3È`¿—N ðrãê]\î¥â¸ßš"ÄY´ü&ÐáõòÊŸCÉNZ÷[{—*DømxÅÍ„•î=ÝOÀD'QŠð*¼æNרI`ñ¸—ìqßsÐ|']ZŸƒÖgC×Û¹¡ß¹~ü PK!Üæî€"PK8A*org/hsqldb/lib/RefCapableRBInterface.class;õo×>#v!vaFÎôÔ’à’¢Ì¼tF MŸ¬Ä²DýœÄ¼t}ˆ¨5#ƒºF4¦0V•‚@Ã\+ óRRS`†ŠjxbU+¦á‰]B(]F]ÓH‡¨k`Šb7Sh‘†j`³—©XTbWj‰ÍT"]d‰ÅbˆM/±!¡’_”®ŸQ\˜“’¤Ÿ“™¤”šæœX˜”“ää™W’Z”–˜œÊÈ €Ð꟔•š\ÂÆÈÀÈÀÄü,Œ Ì , ,@šH32°AùlP>3;”æ€ÒœPš JsCi(Í ¥ù 4?”€Ò‚ «PKñ‚Í‹òPK6Aorg/hsqldb/lib/Set.classm?OÃ0ÅßÑ6å_[(±£t²ÄÚ±b¨T‰¡›“X‰+7¦‰©À‡B\­LÁþéÝÞ=Ý÷Ïç€Ü\ L® ýÆ|hB/™- Â4ÛWÿô !Î\å•©Â4YmÔ^I«ªB>¥ùy1^×Ê»šp—ÌV®.dÙìlžJkR¹l›svTyΡ=áþ?³¿%BTë­Ûs¾AfµªC®g.ëÝ›²œ*.US.\ΓÎêõaѨëI¸íÌ-œµÜ0®Š„#~=¾Ò°Ï·Á`F1އ8 Nâ”…8-á \x’ÅO9ð4žað¬„ç¨Àó¬ó‚„Yü’/ãöý*ƒ×¼Î o0ö¦„3¬Ç8ƒ·xï0x—ISë=†„³v¼oÇv|hÇGv|,á çØ}݃]Ý]í¯€‚Öp(f(!£OѧT ¥ù¬ÓÞÓÓÝà A€#iÔÓÙâcN^ŠÓÖhñš‹€b=<8Q»”Iµ=4¦…T.ß„rBiÔ•ÐX£ßˆj¡±f;Î (T"ß‚zL@É‘¥ª¤;®çêÙNF5C (KêkáÆC¤lô›l2±êê U§<µ˜ÿtÌP')ÏbyØ'@ÖsÜÙG5]=¤ãòbC*—D±jtÔtlÛ­…4c¯€ ÷ÒP½u}ÄÖðe]à7”ácJ$  éªYø³&Ü'`UL5¦"ý©$,n6³›<Ê“ŠèΤu€"k®ë£® 1Õð%ó"oÒ$ÅÝ^vâ$•¬Jp˜u+”ÈA5 g7ÔS†€r·wi:ì°i9Ápظ>»Fñhø$—be/gxF§ôD£úTŒÂ:¬‡cTFûîaÝ,¹ ze´ã€ /öÈè`¬ûd<Èà ¶|ù‡cÛ£2ÂÃ2Ž0Ö†í2FÙß~´Rß-S" ŸÉøØö j™ìaÞ—2úÐ/á+ñµŒKè§VÏÖJúaÝo|›¾Ç ¯ýÔ°1´pHF½¦e|‡ïeü€\–ñ“?ó=¿àhŽm¦”2®`F¬Œ«¬|Š^E‹ë ðDÛÌi®%$9Å„$‡—ý-~o+‰*ÃѱÆqš¸‘¡F]jôk“]5Û2Ëi÷Є:l°Ç®/o‘5¹“Kˆ*Ãj»®Nª!£97¢ÔDZÂSÆ’¦pUe’ ª† {ʈL¥%ÜXeË ó+ϯÐkh4«h0¨jšŠTéæ²Iå­ƒ(Þ¦E)ÏpTã5áZ4–æ´—.0S£5°8’ƒt´)†Ð&©¡K(’d˜N¿NizNsWŸV¤а\Æ+¯©jwëm¤v#œ¾WŠpÑõ­{s™„Æx pŒ™GPë®û·÷­¾˜¦‡¶êJ,Æ7é¿S5ÆÃ#Lc}ð¶Ò÷É*úîn§NÝÁßì$ú¾,zÑ÷gÑÝ”E7½{2ô^¢i7^Å‹ÂäѼ›'mó¤}bžæ ^#&M+Æmy;Z–&³5sJAn8!Ú¥¿0!aXÂo53!RQÈN~73v&àÎ) “ÐÑŒÅ.ê6¶XŸ´¨ä9:â”aò¨ófg9YM¿ÖÇ2NZ͵AΤßà Z\õþ èjð­®Mþ ÍµÙ¶lQcŽÈšìpüPKôØM+¢ PK7Aorg/hsqldb/lib/StopWatch.classSëNÓ`~¾h7:e“Óà…QðÌAE&& t[3 ÝÁ¶˜èp$’È0šx^”ú¾k™CÐðç{OÏóÛ?¿~0‰—atc2Œ8¦B¤Ýbó6kw¸‹{¬Ýgß Óa„0ÅÏŒŒYvαñPÆ#–óìYàLó2ÙóXÆ’Œ'2–%<•ðL d;šål%]@¬mj¶³Î> Sq4S@²öÊe£\$Ä–@ËŒQ6œ9jä•@`±R n µÅV„¨ùݬVÝÐr¦NEZuS«ÚzÁ­A$ªËïY–^v–šCºU¡ª¶[=`;•*‰’fí ´7eÙ¨duÛÖŠÄJ­îh﵌©•‹™uÇ¢.§Gκg+6¥‘Š‹¤B©sø ’äg@A?®*PYëCBŠ‚çVЃ„‚Q týM_Ø3Ì‚n)XE–J夂!&­â;Jö¸‚›˜PÂ0Ýà·ðYF¬ (édãL³Ôm:Y¿ ©â­@wÅ*f¶íwf!—1­T_kN~[ íO+k¹=ïœr­°½$õvÃ鳆i6]Y«VõrA`ìBöF¤E÷¦VþÞúwôÁÆé/ÀÇ %͇^OöÕ%xÿô¶Bð9è½FVŒâ‚d‹8†8¬ã8>èÅ'(îcœz Ÿê?‚?±I­!pXG^§7ñ Qø$Üu']È£g¨!öõ¨ŸáßG”Dð ­ˆ¤¤°uÐHã‡è 5Õ {ä˜KVˆèòB§Hm¤Ž4êdɰ:Bð¤Q†« LÜÃDTJyDãh®Øh6©ëwëÇÕM·ûzg÷{¼F/}¤¦ xN¢6äæVÆ0îAÒÄâý&¿!´yŒðh ­1…‚Gj¸»Lz mŸUm ˆ„ˆ:dÐÓÄØé‘ÝöȨçÚøCö{»z÷LpØ!G˜RÁpÜFàPK.ŒßBðPK7A%org/hsqldb/lib/StringComparator.classeP±NÃ@ }Nr )m¡+&Z) ˆ¥ˆ¡û%BJHJ¸òILYº€Ä€Øø(„›F¢ˆ“ÎÏg?ÛÏ÷õýöà=M‰]Zm‰ŽÄaë,É}N0Â5ʧA†ùý\ì.gêIù©Êbÿ:˜E¡>ý^šc­Â»+5Ÿ¨ HlÚ¿Ô±.’,v°.¡Ÿ±ûøN?M‚:9ª¦**×CÝ*´ÐIêo2µØINèmÊ]7eq8€Åûó¶ü#kcÛàW‡‘ÅÑ+h‰Õ!ØØ©Ó'L7û®÷ a–î'„Qzl­Òý€áñ}YVeΪL)ðPKÃ,¦[zPK7A$org/hsqldb/lib/StringConverter.class¥W]TT×þî̽sï \„«ÀÌÆDa€`ü!*‚ ÑJ*eH5É Ì(“àŒÁ m‘¦´ékÒ?­D[ÚÔ¶š Ñ’ßþö>{ŸûÁ½wæ¬ÇM5tD¹9êÂ#8¦¢_CÌÏixÞ…W±QEÜ…$¸9ÁÍ Nš<¨bˆW&Y2Ìo'¹yQÅ?O¹°§¹ù7Ÿ×ðrs†7SñE/¹P…ˆ“f|‰›q_æé´×Wð2¿}•›¯ñª¯óªoðÛ7]ø¾ÍÍw¸û]žrVÅ+.4"¢âUß“ íÙu°-ØÕ-Áv¸M‚c[,K¶J°×Ô>)AnOD¢œÇ¢É®Xoï½Ë5µ »“á¾ç;Ã'a!.ëŽt'cñcDÛ©dtçà`ø”„å5{Ÿ Ÿ 7„ãÇÍñæÚÃmĊ׮‘¾è‰d,§NÙÐ m±dFE,Iº%4ä[¿71x¬±ŸDz‡’‰Áh£9½™|@šzÓÛ{Ò Éá¶Ú¥Ê$¬È™ß½oÎ’\Ml´€4u|U9k _Œ%£¤›¹!s5ÖA€ˆã’ÜEÖôÎgøÅsg±Öõ‘ì=vÔä5ëmÜÃ$§wÛ7œ<1Ì£áãÍK5ª}’ÂL‚1l*M{& qM^Ïä!E¥ "=ÝÊÙèüÌUŠ¡ÃíyõŒ}Ý–mÛóìþé­åvQL“¾îØiŠ^#Ÿ14©4ϬʚÞlÍŽ%;âÿüÖ%û‡Éh$ëì¥ÓÚå]«ô%†ãÉüǪ—¤©Ú“<>åêÿˆQwÒ²½§§ã1Ñm‹Åç̮¶­o@d 76¡Éïãnü?rc3¶‡®öe<lÊáH´/v<ŠVÇ@4~,Ù/Рōƒý³3i–’öû>ŠºòE[ ;{’± ƒÑ!:¸V‘Y›«ÀÜ´yAš±d掤Ù>¥íUjÍã¯ÔPæ!¹ê楆ü!!)zEþtL#ÉD;[c‘kjÙ§®h|hx0z ‘8N‡Edþ.ší{žTŠ.m‹G¢#ûŽÒmÞ!`ILNïðÑ£ÌcižC;p25 r›5‘7¥Ê- S*D"ÍV©éµ;'lÛÓG…Lá,ÿD"O²oŒŠ';Ù[ífÚQO††£ ڨɟÇ]Â<‘x°Šn"ëéEÙO½­ wJÔ>J½zJôTü³®ƒÿ\œ2¬á°‰áæJ}Ý%Uê[.C£÷ÈÕJ=| %•úÑË(Ð]•!=̲B¶;-Û¹j»*vßÊ{À^RZ 'š±ô²þ`§>pÁ?Û62àQN„njö&YnRìM{“j¨ž)ý†:{“fhzõ$ÓØihs[}¶IÞ€\昅ú®¡œC‰O/UGšd{“2 Cæ~Hh¬7ãÉÏÆUi:5m(ç­ÕšXí¨ŸŸ‚N³æà|.ú﬿–1`7´<ÐT´H*ñ$Ñp+¤Êà´Ä’dÊ—¥`,ž{JQ)ZI—L:²};vX\¼I\¨ôì\Ø[o  è™…{+Ûa(DB»ßP˜‡á°H¨c¤r‹÷–yå‰\"¼ò$\²o…OÛ¥q…Ìý­èUÈY“Zá`ì† º3cP9TJBHÒ‚á\0ŒY`JÚ­°9I}=÷ùçÉ©ý7•N{+¹ÔG64ù}Je_Èã²ôŠ E=MÚðJOŽÈòéÔo@ÖÏ¢$ Û€-…"(L·Š•ŒïcÚÙ‰Ç2^¶0„L Ž¡¨·ë{êe}mÂx ™mòr‘ö[(#±ðÈŒ§ÞGîªr¨ÛÔ.ŠÔ¥Ðs³Gp„¬õûtm`C“\ïãHÕNÌaÙ9hú#ÓPôu&[ºÙ&ÈwÙ+ÉUU¹{ÚL™”+³‹ÇÇćŸÉ€¹`1tÀ“&§m19õDŽ@grc(Ü]Œ9ùë}8Ù ù ±} 1` SÐ\a.Ò=è°-¤-õó&4ß6Ôgüæ÷ŒK¹~ d¢+Þºž傸“¤ÛÄ¢ã³Ö6;)”íôôÖ½"¶…’bé4Üâµne×:¥k"–£‚Ümj+€½x‹*ö’ºNt™ê¤NR§Ñ³˜ÔÉ×ëèTxÅwÞì,ß*û}J¿šÁ q¤É¦VȆc#§<ýÈ$'™™Â–Ê¡úð$D,÷ëâ]—Ónmµã å½—ÄÌŠiœ"mÕ—°–g.£ÚT@µ“x†Ç!SÀ ]~ýHV;¨ênAi¶¯-ì«‹†Í!0ßè~Ÿ¡„,J½Ó©Š¬êáTîÁM %E…ˆÒÍ>‘q¬³sû%Íÿ ¿e·E‚yû-OÝ¥>Q‹?øBÿ²Êx¨(þkfI'Ã(†9k"fõ 5bõEË¡t:%jS˜øé'fSVÕÝ#ì‰"m$´X¦.‘À<.ê+=Ó(°ŽNȈ8.vß,¼Ù³ZÑQÈÇ·%MÅ]ú¤hUmô3©8€n«l”S”Éôt{o*]~·a¾k¢çæfºìšó¥?‰>¤Z;Hª§Þ)©Ìï1´rCn˜ŸDqƒWÔ¿•ôße(¯¡t\“Dn62)uËPÌ“Ç'îu±n1úñ²~‘qÍF\AÁ TgQý®ØHŽl`ÒKðÞh Æ&²£é=ôªQÝ1BnÙ>:Æû==®ÙóèQXOF£šÑ8É‘ø_´’o…vÚeŒ‚vû¨}„7º÷Qz.»¦ÁnÈ |ó*Ü)ÎL¢È³kÄR¨Î‘IBV¶VOÁ—+–Ì©åK¦ÒĺY®¦(ÏLÑý`ñæ ¼Üƒ'­ÜÓG}ºLHËù@´«ëÞÂ*oH×BôòÀ<1YçÕŹôs*RÄ)ðNá e VŸ| «|œ/<<¿.H«É¡·IxV¤S\ô•¨©+8²h¸÷™)cìl`ÉØ˜Owœf§æ³[Cã²}-K&¼'WýÏÅ665khQ×pDL[Eª4äì´ê=¬"ßÜå«×£‡Å½‡r‘”¦ù<»¥"Å%Èà ÐJZìÄS8he¤èxqeïð¿•ð«æ-®Å,òý>Î4”ˆXŠ(1ë·e†,ˆ¤­rŒÛl¢âßòf1.‡ªµK÷ ¢;„¨ð6lf╺).9 ¬¿ÕÁ³x°“<$îÇ‘y¸¤>9gkìÔ¬¥šV“ ïbØï € ¼C9™2Í‚Ð:Œ#–¥—­;ûI²T‘®Q )ð{æP; ÙÞÊV7ÉŠ/dÈt§Øj]á)¨Tºp{z ‡!O¡Ño8ÄeÞ’Zi)54Ýå³2á­?sß#nÊ‚«…GÁqýÑÌ›jú¨Ôsq ïl ðÌÜT±7¨`”S–œ?Øb»7ßÉ©}YÂ5¾h’Dwz<‹¥æ/D5ßÏ'3å¼Å›®å]~¯(qä`:Dc”i6ŠzCn®¢ÇTq}ÍJè±m.z´N¢™&ΡŽÏÞ¡&Oq Òu>–úQ‰WsËà 3xد7S—¿i½z n¿^-úNñaP.ªÊX¶¾RZRîÀI±íffîàaú•’kWSü˜!Î\˜/IÁ§ôo*{Mçúçu]dÐFÊŠëÞ5oñ~úFê×øª§[êÒ—v/]ILg¡Œ(ö©—Røt×åÔï|ʉó©ys‚Þ@Éý ömÝ×.ƒ,"qeÑ=@éßTúè¥ÏFêIª~SKC%‡èæ‚%o{ëkÀÏU×:Tžé˜PrPÔ!Qò°I^õª½„•^BвÜÅzÃìÓ©«uY¨ePT—~vIúÝSœhèË|bÇEð½ 6h×ׂ²þH ¨èëA‡¾!Tõ ¦o u‡ÞD­ª?J­¦o¦Ö©o¡Ö¥‡©-Ð{©uë}Ôêj‹ô(µÅúÑÀ›(6¿ßñPKo|yÁê :PK7A&org/hsqldb/lib/StringInputStream.classuPËnÓ@=מĵqB’6¼¥±»°Ä– UHDuQ„ÄŽIâ&nƒ‹~H¿!›J¤H,ø¾ QθQ@Øšssçžsï_ß¾x„Àƒ‡›.\Ü2Ð2pÛìï®ñ6là6l Üi>Ù?<œÆ¹@:¯7ÔË„«?ê$ÕÝ4Ø,4^1¥:Dù$ÉåÝ$Kò'‚fûßëàµ@íúl¡&±î³S; Qå ×½ã—zü겿÷ìS/çÉ(›:ØöQÇ=Wàû¨¸Ššƒû> é£j2ÑlŒ&ƒh8}Ÿö»Qšt¤lü!§ëw‚ÕBR2Šþ“Ý_Ò(·ö÷1³A>¤cöó”»QíN°‡MnÕãæŠ-¼ÊÂV–ÒimgjW…Œ-Úõð+$´ç° ØáÎ*Ü9G©4œ£|ó ÖÐdµy§_P>EÉš…oè©>«™R<Ö9œ]ZûµP±i«±rR[ù<»d`¹¥Þ’°UÇÅɬèèÀr"\/D nðT—ÄuFB[2ijBןBüPK47Ïß©€PK7Aorg/hsqldb/lib/StringUtil.class­WÝsSUÿÞ¯6Ü–ô#­1 PPHÓ†B•*¥! ´Š´€´¢M›ÛôBhBr˧ø5ø8ÎÀ8•™¾ð€/‘‘ñÅqÆÇÿÀ'Ÿ|Ðá ¦Rwo.I?n„;=çîž³¿ßîÙÝNyüý}øÜƒÕèհà ôzðvzÀ.QÖíf±‡ÅÛ,Þa±—­},ú=؇‹ý,x0€ƒ,Þås‡X ²Òp؃FFàxOÃ1^‡5Œhx_ÃqµÇœ2­^)ÔzD@ަ†@•6²éƒñDÂH ZYs*)ÐêïëkˆŸ‰w¤âSÉŽ‚a›@õ ?¹?žŠ¥ €j¬%ZCË/÷E‡]]v»]®r¿\m¥cé³Fvpz,gX\œEÝoÆ³Ùøù¡ôÊëÞ;aŒ[Û\.Ú©Ô’†3s„·/4²ü̳hʤbÄ%òg¿ÜÿÜ—c¡‘ÿ3ÍÌí9•±Î ø\¤u˜ÒŸ5““ÖPÖ<5h^0ÊœëðäNš™ÁL|ÜÈ 4º• ŸRr™”IϱÕ個_—P©t¬A ,µíšž˜0²>Ðñ!FuÄ1¦c &X$uLÂdë öa²õ¤ŽNi˜Ò‘FFÇiYä4X:¦qFÇYœãËçY\`qQ 9MvLæN§c)s¬c/mwrrµéøÝ:.ácŸ`LÀ»”©ŽOñ™@½K|þ%¾ †Ã–™Zä©PúÔÓ%U,Í Ri{Åêw}v5eL%­I{ÄЫTå¨+‹WÜŠÏdŒ©„@ äÒ§…ÔÓ±v·ò(¼Š†AÌá"2Í»†+~c¨Ì¤SÇ'ãÙVá~”’Z:%K|Ü2²+Í\̰h;Ým&Mûx”ë›:ÀQ¬pFT4ž3 fòÖTò–5&R”ñû‰z²DÝç6“(±RrÙ¬s¬‹bqtK²Wv¶³p{«V—Ç/Z5s*aœ˜ ’ô¡L”9g·½f¥¸Ÿ6Z°Šþ²òO w,ɵôUK« U ßøÎ>P…uxÅ1­Çï¡âØHÝòªª/¿†ºjzǪ»»¿’‡Ò|+üJsª£èR}jó jý²wSÚÑ˪˜ÿË/³±òhLU~9˜g™‡ç6¼J²Êê4¬ŸC£† sPÅ#Ô×¥ZJ§!Ù”ö…HöÉÄþ6 ÜÁŠn%x¿f$ŸÌL3ðÚô"¯O0£˜@˜CƒMB"ø: vࢌTÒz£ái½ ?C‡¥@úí0i>™·%jö5àSí´Ëtitau‘I;+}šm£{v*Œ¾E#ÙhºÔÙù?(Ž&RK>Í9îTTÊëyŒn Kˆ`…Ô†v'¤¯(£*­#Lo;³m&¶¤.ŧÐSí ûÈ_5Çz5W¡GœÊY¬ó)WÑÀÚ•WJÚêk¼v¶ÊöýÈ"2­Pæ©êTz^!ˆ Wß<gQ!Há«z…8F°Ñáx޾Z†ï¢¶' 'lžJ@d®ïE”ì™AK$Ì$êò¨§h¾OÄÛn3’‰Ñïï%þˆ,©=ižCÑÐQàÙ,6a³Ã"EÏ™Š…ï÷2~ÐëeønÙÎUp›ü²ýJ~™’ÖYØžM‘GÉîñËmüigæ·%Õ_é1êmìö'Èe‘+ÿyc /ŠüÚs!wäá{Qä×ä)ù@¹lw.ʶô´|ÿZ{c{ ºì^ú/¡‚ֵ១I³Ð¸7zß .|YÌS©W{×Üœ Ý’oýy WFiv@ðÄzo:¾¶8¾šŸøh á‚kó¨†oI%/*æ ˆr±ÝŽ‹r ÓÚb·h —Ghc8XpuU—%ŠðÏ`ÉO¤  QËm#OÓNRÝC#Mô¦ýR¯Ì]s›Ãmäð%ÎmÅuèö¬R¨£ÚÃA_aù)­m<}zé!yZ½ü(Œæ¤ßRbk9±Õ¶ ÊF@<¤Þ¿PKä¯ ã PK7A"org/hsqldb/lib/ThreadFactory.class;õo×>#vvVv6FμÔòŒ¢ÔÄF Ÿ¬Ä²DýœÄ¼tý Ò¼¼Ä¤œTkM$AˆJkF™ü¢týŒâœ”$ýœÌ$¨„[brI~Q%#ƒB‹RVjr Ð&F&`dad`f`1PK~=-qPK8A-org/hsqldb/lib/ValidatingResourceBundle.class½Xi{W~ÇZFV¦ŽFiœ4®’6Ž,K Û„ÆŽS‹z«­:¨ cëFždÀ¿äâC\<áLJñ>ô£">æÃǹûOðö“><åÃ'ýØ‚OñèOpןæâ3\|–‹Ï‰8ãÇ.ÌñgE|~¾€/rÍÓð%|™‹¯ˆ8Ç»¿ÊÅ×|øº÷ø œç¿)â["¾- qVV•”l°”á~>¦ågóY& eð¤<+ÇTYKÇúTY×»É|\Ik²‘Ï‘~Oµ¾§³¢§Ÿüô„t QM‰±‘#Ç{ûNÄGÆ(R\À }M7d͘՘ɥcÓúƒjj2¦*“±1v¢OÎÊ“*Íe²,gÌ1=“ÏM±Þ¼–R¡»iFÑuEK— zÙ´<«dršŒn‚\Ñ4å,/÷°ùüã¶PUîÝãFŽÜP,w_&Å©«¶æLÙðö(šbЪU×LPÇÑ4nÈS§†äl‚gmÎó9ß¡5) Ç“kÌ"wݘfFq”€;j>ZëÛ6¥.»än!ýsYYK±T Ê6CךCw(ΡWÚÔÌæ¶t®PG|µIÍx_i™Ö"žñ]»k(ŠÛæ²#ÄÞ´½Ö¥½a‡­O{ÛšÕH†ö–a{¯öƵ+$þ¿¬§ƒkÃÖZÙ¶ ëtð6$:DÜmϪÃÑ6b¶|ýÛŒ| Ž;ÉØ!{ƒ)p讚WöiÚB»~wN 9]s¡9s'â{¾ ‹xVBÇ$¼oЇ. ‡¸x#öÓ&áxNÄ \”p½ŽâÎ+>Çòš¡Ì°þ¹)–5”Œ&â’„%[“&ªLƒÙ\:­«\U¨È8öKÑb}Uú}ÌA©f…긎¢·r Ìë#v\,GŠA”Ll”bòrÉ3¼åe¶F¯„¨ °Z²¬ÍÕ]e_œÔºö>#S*ìn´Bó”å-•&8`…Š=¿¢ÇÍ·ŸÌ€]|þÒ)Í%Å©E¾È`Ø\0vµ÷«WV¯Meë  s~o× c?º™—дJï/sÔq´–%Zr*U$‚.½b¹Wo6²Ý8-ëC™ëW?õt³&ž7hlΰ:«÷^97Çf2³Dµ[§³·tÒOSÍ`i¾×!»|°“ž³ûè1胛_ôËÍï zLÞÁŸˆ¸­xº¨Ým¶{¨ýæŠöj¿¥¢}§«ÅüM7ù=d~· ý8Lí»©µ.Há„æãÍ{ hXà¯X+îiãx«e=GÖnú„/Âv]€› ÞpäÄpg¤ß%4^€ŸÚºåΛö›9[nCGzuœG«Ž‹n´ 4Ÿ|GG:ut±H ]Ç%\ÖG›@ŸÄn¸;=[œÛÈå§¼/7µ•³Jn¡è踊¤@ï‰,”ÍRÉ*W7A ?cGè§ó AÐ%©èdªt—f+5‘šhIMD¥îòu·ŒëTO“’¼@^;ÅG}ã#(À?Fõù¨6BHG$*U‡é÷1]„PH7aŒî ‚ÇÀ‹>°‡Fàf-üТ’š«ë9àCûüž±jϰ1Tj+ЪhÚ¿~OXžåñÚ6î“ ¢Ÿ”zˆ²ËÆW4l#Ü5u’Áp}0l|A„ãJµ*¸$©F޼C7kö3‡h6É>¯ qçïïßLQv%Ë+¼=h‰h8Ú ¥¢¡Sðy¿•ßxíñ~æñõx7~‡¾¸èÏöQÏ>'°'§ ÂM ;¨™%êÙUHXBx°mZ&ÓgÚK’wf¯úÄS ីoH?ÃçóoE«ÁsE CÿA\;º·³×Î#æßZ=BCº¦‡ðb ÝÎ'¼KÀ?PKÑbŠËå¨PK9Aorg/hsqldb/lib/java/PKPK7A$org/hsqldb/lib/java/JavaSystem.class}UkSU~–\6Y–r¿¤E[i²ÐÆjµZ°r Ô`h ^ê²9 K7»a³áR/õ®¡3N?9Ó/ÌHéLÊØG?9ãorÔ÷l6!`>œsö=ïû¼×çä¯~ý ÀËøQÂL‡Ñ|y[B3"Þ‘@’Kf%ÜDŠŸæøé]¾ÌóeAÂ"Þ“°„[üó}Ëa2^‘Ђ$|ˆD|,á6>‘ b•kü3-á7Éþõ~"ÖDè3Ú´Í6 ÌÔv MY–µìy¦Yv:/À?¿}Y@Wr]ÝTcYÕY‹Mè™8Óô¬jŒÌ–‚£º©;×ø"Ñ%2›´ÒL@CF#ÈGÕîΪ¹EuÕ a“c%RSÛË9ºe Ž”À ÕÌÄ×lk‹ëDKRÝŠUi“ÇpÎ&ïy×ôt¤~\QÊ$äX Ž­›ÊIjUŽKº„ߦYÙœj³„™1-›MªyŠùBä¸êq wÛH¶y· n®uì¢qªAÁÌkªÁÒKªQ ½KÿaYœ0–a6Ey*Ïœ¤•Y´vòËRÅ#+Ñ%š ršÌa)sj[w´F*µœÖyi—8€ºÉæl+ÇlGgÔéqO©àèFìð¢Nš°TÁÉ’25ë‚J•F`“]0§uS5ô{Ìæßé9ì&ÛâAÔ‰j…x  ™2›ç’$33Κ€3‡Šóª™¶²ãšÆòy×h†» j†;~2^Ä Œ³ñ<D¬Ëˆ`P@{YâÊwe¼€s" Y\”qçd˜°d ó%‡ ¶Œ<™øûŠŒ+جœ£’8·lÝa¤·…mŽº#➌OñYYÏ­^űˆÏe\àˆ/dÜÇ—2¾ÂUcøZÄ72¾Åw2¾Ç”¸egbkù #½3ôÕ˜‹5CK¹é-‡è©Õu¦95¢²VÏ £ÊuÔ›:â˜ÇE‹îªKì„KÞ9CÕÍ2µ:"uIÔrTF•¨`&ªˆU— ‰€2—z"'²Ág(õÎdMS¼¹<|%êMl—{C%ŽÅm}“Ù³ª©&Q¨D°RgkXÛqB®žârI°ˆ—Ñ¡¤ L2v{ ‡Ê|¦V¬PH'‘‚úǃ÷Øã¸7ùK“ºÃË1­ÿÚgúéï ð#ÌID§0çí=œ'î~ÞÝ›!p®Ñz¾Zih(O!<\ÃHåz ®¬{ Ѿ~†ä{ßüÜ@@”V„.²T0äY*\D{§òR~G`ïËä(¸Wm'“Ý0.zv“ä‘ûŒ*"àÛUö!ú‰pö¦ÓC4*EH£²ˆÆÑ¾Ý V¾`ßßðSq 1pÀ˰‘ {d$׸’öK¸ìi·yîƒÊPM»^Aèõ¨Ô«Á«×Nýâ]_Á«ÇÊYDóžwý®z×ä£?×û-Ïв¼Ö§h{D1'‡ÐN‡äc ½èð‚”áoñú op¼k©ã®³Ü½Q¼INøu;¹óÑ.*ÔMWIáº;%4Ö¤úVÍð_À€î2ÒƽëíZº-é€ì©k7Ãþ`È í1Â[Ã~“Ä6½367÷‡‚­¡.÷>2â õÑÒš¬5B"Û§šÍMˆ^Cï#¡Êí-¡pO]odw «³.àï¬köÄøÍAÓwë>>›iìõGÌú_ c;yàò÷CaÃÚQútP`vÕöéÎWo!þÚPyžÕnê¾]­zÿ&½3`¨ø‡ü{˜R“ô5íõý¦?Œ¨ø§€ãJÐo®XPuá=Ò[Xø¥¶±XfĈ]N ¡jºÐE¡ÁвHj–(¦QÆrÉmHÆN©’n¸iwÍÔj=ˆÚªª fwOIû ‘-ôò}½†oWS$B±õë™”ð”ë”Ü*þEÕBއ ¤¨”h ™k{É_£‹»–u½FE=FÐë¦Ñ8ÐÝm„!ß®-z`€³³jJZU7 äUMÝSño ÿÁiÿÕpg)ù¦Â#P2lS×­ël¤èWqNÃyE‘¡ ›&ÜÊÚ°ã,oÏ!Tʯ7¢ï14á™ô¶¼^~+1„æ'­6FXîè#˜é¦áݸ“”¥Þ€÷nåá=nÃ~ d2é^šÆñMzøzCï2è½ç¥¥¤é1Â>‰AÒ'T\š˜Åú2½^c¯Ö}¦&4ºzá×°“]šÈٚȡ>Z¢„Ùœ©06ødU¹"n¿¤?ê7¦߈hÂMÅê’ˆ/ìï'·íKºtSçN‰1E}I ÔÃŒ@¨3¢aôÞ.â hèB¿†Ý4ˆ|Q@%Hú6`úuë(y4Q(fkø_µ<=bW[y’dlæh¢·k¢XÌ¥7k¸(KåíúÐ@°+BQÂ)QÊ×-H:±1E·˜‚”+±Í2M\"Ê51=Í 6oHèpöñÓó• 1Ÿ^Þ>ÆwßZ1Ãü0ʧe;ÓHñq!û¸ˆ‡JÂE,fªŠ‡j¾°‡©1û‚—²¡s§á£Èå§©«UéAmÕÝ¡pŸn¦øŸŸ<¾©7ºëï…or_Ä4¨(ÚBd¯0ñž7’­Td±0Åë©×ÄŸíŽÈ¾ ©ï%¼§VRK”tä$® èŠJ5Îê}UÕi»_¬Ú²h,NÛcÒÊOs2ÖÏ«a’Í™DwXhQ$©ÇñTÕÌ5ÚaìБ)¥ÝŠÈ .Íë§T½æ4޵L++¦”JîŽä•`÷0Õ’Yÿ#¡À€û\Èc”lìY$´QÇz?¹®÷÷ARéMו¦mÅJ)rš¡8ÎNRÙê7{gèmÛ¬¸mò÷YèZESÙ–æö²ü-AȺvFSÐ ïKöùéð¥b¥uµ£Ï‰H/SáÙ¨³³Óz1ÀEIVJv_ ¡‹Ìb$­²A.U^|üeeåŠõ1°VgMyñб£?¡/W:ßåp|(^ä“FOÀl‰Æ¯ç‹wå,¹LJ;ºŒ€Á}-Û0ô ¥J¸¯[÷SÕvŒ`Ù‹ úúí¤ïPþ„¦®A”ÂÍDÎÔ@äLmFÎ;å .ûr¦š.g*ërÞ-çlÒF0ŒÛ0 @¼ä™P†Pâ82”S°uØò¡DaoÂ…JŒ(œ’…‹vl'1Ëc«wkQdÄV:nRïΖª2 Åv¥g¢„h•hÇ!ÌGNÇr'Ç¡tŒ#¯Ãã™°wÕÑ9:ÎD~kmIµQ‹E¬~¶ÔfàPò¼h¡õTðqòµÅ¾²Ô31„¼šR{—§´¾}†>ÿÆ8æXV6a«GQÊú$ŠÇ0WŒ –ã$+“Æœá.‰›¬ôL”¦zÓFë#XD#{ÓVº\)TØŸ|o¡RÚå)TÈ#…§à1[œ…ÛâÌ> Ó‚؜ ?7°¶ä¾’اãY*ö²éHÔFûÊp#pPBnÀMä$}¥ÑHÉ)®’i±Ô3†rmó<Ê(E½fó–Z‚¤ÍãbA G)DVŽb±'×qŠØ6 Ý ,G¡UMäâ(<ÃÞöe™%)2ödêRd3È\š"£Î ó–ç 2õI™Q,õÐöÒ‰Sxë(–YôÌò$yÙˆ|ñ æ{-0q;É?joz0O±’„“i‰§òfp.¹(×È`EÜ©÷áæ˜S×ÐÏkŠ0jm«Ê¤ðð\F÷­¤8]~Y´^VVÛ>ŒÌý6zD/HœÊôÛþ ¥ìüÓt1[pkŠV›ÔJu!Eké…Z/+U6±ÖŒ7ÓJ?bZÝ”¡œ©ž/~—÷§ç'îúÞâç¿g;™žw4ƾ#-»"Φß)V¡Æ«P¹Pã‰q\Aè7D±b5Á~å8VrPæ³R.|Ï“XE…c WµÙd)² ¸‰¤Zô4ry‡¨(VÇ‹Ûr{¡}Žal`` •¥yј8²À›8S™ Öµ¼Pa‹.ä/“T£¬z·Ð«\ë)b]ã¹È<‡K©JÜ%æÙ¸°d ­ú4 óÔjþ¹kUÙpR C¸Ù’ ñK¾|ÊÕfjëÙp 9›Ã%©×[Y:ˆŠq4uÇz«RÆE®æb9†k&÷ òuœÁgãh&”¯m­–µ¶q\×áCKk 5§ÖÚ§ ÒÜ&Z‡‘+GWƒ"Z‹ªÈkÚÒqíĵwAƒ#•× Z|'ñ“ÅŽÉ÷Æ(ÞÖæ} 5^÷õQ´Bóº7qÅãØLWØb]Ák¹¾ur¹”§wáaÆó}„Û*ô<ßG¿Äxç0ñÀC8›OÐþ1<,çˆÊ™åø(“ÏOâC¥˜‚ÊH=‹JVñ‘u*înRqÀA%ÿngêêÀy «ªâK´¨ø(À"ëYä<Åß–Â>ƒR+LäI6E?+c/åå ×”gã±LÖ–»ãµ…c 'oÙÒD^¼=™e©yßè(¿÷~\cÉn›Y–TŒ«Ü>ƒ˜¬cÁaxÚøåFñŽA”É.þÎÄù1qjãÞInâNÂÝ4ñ~œŒóŠšJB™@¼ï ªøÄiâß(?á"…ÇÊKí1*ë2W3ÆBO½zå…öî]|?—E®–¾R^€}w¬*£/C»r´Ì­í-;šˆwgéÓEdç‘Ôß…SŒ-’ŽšÕ@<íT™¬Ò†ÿPKþ.¹Ä¼ PK8A org/hsqldb/lib/tar/PIFData.classVÛsUÿr9Év‹ôF‹¢mš¢¢XÚ‚ÚBm°iKÓ‹¥\Ü&Ûd!Ù ›M)x}a|dœÑä¥ŽŽ ¦;Zfœéƒo¾øä¿¢ñ;›´Mè:Cfçœ=ßýû}ßù6üûËo^Åg~<‡Úq’ãMŽ·|x[‚\Ë)!qZÂÞ‘0Œ(Ç?ÞňDKL‚ŒQA“Њq‰DÏŠeBB“>L‰Ã4ÇŒ„÷0ËqN¨Î Õó>\F/r\âxŸaO^55%3­šyÍЧ¢§Ø†úACÏ[ŠnM+™‚ê ýuë졳ßÿCò9maBMfr\±,ÕÔ#—•E%R°´LÄTSêR¤ÂêcòÚ ulþ²š°H·,˜QôTdÄÐSÄç)ÕŠ“Cc°k'Û=h$‰çí×tÍ:ÉÐ,ËhF$ªç VÜ2U%Û×5MÇ-%q%¦ä&•ùŒj§§ØØÎpÌs$ìçEtz)¡æ,J6Ï‘dðõ'2ë® 0äk)]± &9>^•Ú°’O“ùþª(ɽFqì“щ ŒÃèeØ»ó@aaA5Õ䄪$U“sHf“癚 ÷ ªXd¤–ñ:84—q…ò’‘A–!h˜©H:5“œd´ùˆ¥˜‘IÅŒ)™ÃÌ*ÖVʺ 9Wa ³y 2qMƮ˸9ŠÈÝ¢|2>ÂuªÞ“Yr|,ã&n1´o³F ÙyÕªu+㓲ÏÛ ç“Ý»ƒsO\èî:<ê’ñ)î0ìsHb<:tJ±ÒÚQ†&ôZŸlƘb%ÒѦí('Ó¦qMôIµ•±­xBζ³Ò¢cš¶…ËÕ³©>ÒHŽh:ùh®é튦C¨[WŠg7ƒ>¬ÒL+f\½ZPõ„Ú×µãÚU2íÛÒÏÛ=MMßâ€íÄ]ºÍ—²›mB8 ’E¿¸¨và Á¨N¶ó¤L£ü¨£ž7£ê)+m‡¥£©fE²£Ú^y¬Ô8®HjÆÐã þ”<‰Œ‘'.Ê›awíd"€Å\[`xÑ)Å“¬±éKy{æuçžHž0²9Môkøÿý9L`}Áà/Uô _ÆyV.ÈøŠÇ¯©T|ƒo©n–ŒMe¦ÄxÌÐÇc”DlH³û4cÒ²SÚJÊ2.ª¸„9ß¡MÅ÷K_T\æ\/£[ż÷J,Øï> LakŽE‰‡ ÛÝ1ëˆvÛÖf‹Û„r)nx [+(¡¶€ˆ.Ú’æHÉs]²[%DïÞ×CS¶uŠÏ£ æ“=¤óɦ#Û#¡®ÄdÆÇ:›qeSISûm+-lgV–RK]>-&í­ÿkF¾«hbÝwuwÞÍíw¬B‘«8pͦ¶ÏïCáN+\EKeéל)º¦V–ì°,Ch&éXÉÔŠ°qÓI> u¥¢ÞS8¦®­×â¨ê"=¥ëe3É‘ÐÑÍ\W¢ ¨;•Ó¶F݇€ÎfoI­VA‰ê ¤õÉQDzÆuR¼ù©ÞI#›™ÂFz£vÒK衺ÊÜW‘®Aw¤»Äé é‡Ä§’äc¤ÕÐ(Ñèþ éGæá«3ï…e4îŒ. ,ºˆò‘hгïUøæ±ªwþ‘`Eó”ëä¬Y€šCÕjTOŸ½ŠÀZÄCÏpdúê¤e(»Iª$c?‹®J²·£;O– 7’ɺˆ¬f½gU‹Žk°úz4¼Š:"©'’5Áµ×pOë‚ëIPä­9„HoÈáÞ«®ðÏ—´ ÒMÔ¢ŒH%רŽyF“ËiŒ3c40CÍ9lø þ`x ç°±¯@Û”›Š(cDI ûÈt+k-§Zï²Ê8tˈ“«SŽÌ]ŸçV¢Í ×°9‡û¯¸åï¥ašÐçâ•Äo¹#þð2ÞãváÃ×ÐxG|ÿ¡ù×ÔÍ7(Ó¨¥Ä"žK¨láq5‹hù Ñh¿[®³—=c¾±}å»<¡€•!ÏØ.Ï<úB5¯«µ…jÊÿdÕçªÛB5•¬Ê®º1ÜÊšßÕj—HZƒTÙmLC•öÕyÜ|·ów œÃþh.ÍZ %oÈá•í¨†mÕßh¤ªêêªUÿ©þPK p€„ PK8Aorg/hsqldb/lib/tar/RB.class— xTÕÇσ„¹ Cr³ ìÈ„aß‚ˆaÑ(&ˆFÔñÍÌ›ä‘É›áÍ [­Uk­µVíÞZ÷}.: ⮸ïmmkmÅÚ}ß×sÎÜdBòòu>áûþ¿üï=÷žûîöÞýÏÃ0×È …"ø«þ÷Á{>ø‡®ƒ’ü‹jþí‡kà?$ÿE1€Ä D2˜¤ˆ¤˜d‰D %ñ“ # p½ŠŒìÜ(p#Q ¸‰X&àfb¹€[ˆn%V ¸8BÀíÄ*wG ¸“8JÀ]ÄÑî&V ¸‡8FÀ½Ä±î#Žp?q¼€ˆb€ýÄé%Ö 8@œ!à q¦€Çˆ³"68Lœ-àqâGˆsAhG(‚ãv^IK¬×/DÉrÛ ”Š9wÏÈÙQm¯åÆérÍHšÖµ{ºF÷+£™Ë-qﺾ³:Þ»Ž¦Ù SãQýº:s]™[Œ.ušN nçNl¥ž¢ÜäOS¤ÃŠt¦2]½BËõÂ%œøNÌ‹‚Öö—îc›ÏÐ ¨ÈÉtY®éSULJ¥¥í>_ƒ·¹aêúÞL›Ì¸s‰‘-V*‘q#Vîи…w•¯fÓIkÏ\ÝŠy6x¡ á|8ÓÕÁº£ŠVòzû8x}Ì€úàÚ-æ6³!Ž[©¡5íbþÆ~cË'Yf;vz9ž&fÍu›p—¶Ú펙θ˜epKÚ­t.§>X׿"èŽ(ÃèÕ;’¦µ¢ÝeµÁÍ^ƒôèhD°Ù³¼*Øì]1+¼kjƒÍ&­õœ ¯È f+°Ó Wúzõˆô]âÕk#Z⑦Ð!zµ-t&IJH\ïºõ½êWãq[6ÀF]ÞØ·¢ÅŠ­4“tc´45;iË™«1ß§¯Õ÷F›qîÏÞð¾±9ÀOð]ø^ŽçŒóPà㜜Oe,!’ HL’0I„$Jb‘ÄHÚI:HlÝóõpCn$¹‰äf’[Hn%¹äv’;Hî$¹‹än’{Hî%¹ä~’H$yˆd7ÉE²—äa’GH²$ûHö“cKÀè4â>£+`8ðQÀHI¼°f¹¸d?C[†k¤FÚ ·ýñÏ€šB6˜Å‘x±ú^|ëÃ[ðe{{Aïs±2n¦Rÿç4RrlWì[æytJ\=)§Y;×$ðmº¨_»BoÖ©ýZzŸôiýãº_ûzGöt¡WGÿ–…^X‹=FW`R¦Ÿg‰à×Âüg¶[ôòïÝJc³²~…ø„ ×™]ø×ú%äàGôLÏ/¡n‘¾;½ÿ¬äN3}U§¬ôé¹¯Ì ‰Ô&úòj²:Ìm6È¢`sßý[®;fÅ(‚ëÀ€ïÀ +FÓ‹y£æMš7kÞ¢y«æmš·kÞ¡y§æ]šwkÞ£y¯æ}š÷k> ù æCš»5÷h*ͽšk>¢™Õܧ¹_óQÍš5Ó<¤yXóqÍ#šOh>©ù”æÓšÏh>«ùœæóš/hÕ|Qó%Í—5_Ñ|Uó5Í×5ßÐ|Só-Í·5ßÑ|—~ú´ÕôE‚¾†Âà‡¸ê?BW…¤~FÁ»Ù…÷áÇ:f$ â¨aP4}?¢\Ð úÀ@¥  Œÿ|ÓëÇîƒ!{8à§ô!¶>éÞ*uoBalD®+ƒÞ:¢ IŘlhwõÇuàÏE\‚?×#p$ƒè!(¢> úCŽ èÎs ~á2& Ãó!¿ì™½"~h?‡ŒÍBI>æW=³WŒQ8{¹˜qY(ÍýÚ³£Yù˜ßxÅÔc²²|Ìo½“ÍÌBy>èwžA3pDù ß{ÕÓ°+óAðìi&¦‘ú£gO”®*ô'ïtØÓÈ\€?ó â*bÿA(j+5xŒÞ ÕlƱËf\1›ñl& a3‘Í$›Él¦65l¦Ê\Ü4vµ2dW's‘ÓÙÕË¡ìf°›)ýìf±kÃØÍf7GØÍe7Og7ŸÝYÂn!»E²”ÝbvK¤d·”]£,c·ŒÝ ²œÝrv'Ê v+Ø$+Ù5±[)G°[Ånµ¬b·†ÝÉr$»SØ5ËQìNewšÍn-»Óe5»uìÖË1ì6°;CŽe×®UŽc·‘Ý™r<»MìÎ’ØÍ®MNdw»Ír»sÙ''³;Ÿ]HNaw;SÖ° ³‹È©ì¢ì,9]Œ]»¬e×ÁΖAv[ØuÊ:vqv]r:;‡]BÖ³K²Û*g°sÙ¥äLviv9‹Ý6vÛe»ìvÊÙìv±û”œÃîBvŸ–sÙ]Äî3r»‹Ù]"ç³»”Ýgåv—±ûœ\ÈîrvŸ—‹Ø]Áî r1»+Ù}Q.aw»/ɥ쮖‡ÐVPÝÚV¤`lk[±‚ñ­mCLlmó)˜ÜÚ†WjMk›Ä¢i, "°p:¯Á¼}f!ðœÎFÌE W0Q¢`!¢TÁb„T°Q¦`¢\ÁrD…‚ˆJMˆ V!ª¬AŒTp b”‚S£¬ET+X‡£`b¬‚Ä8ãlBLPp6b¢‚s“œ‹˜¬à|Ä j„SDÓĵ :A[u âˆé D½‚$b†1SA1KÁ6Dƒ‚ˆÙ v!æ(¸1WÁEˆy .FÌWp)b‚Ë \ŽX¤à ÄbW"–(¸ ±TÁÕ­{Á8×´„kÛöÁ—ñ5›…¯dá«YøZù×Q²ð ,ÛßÜ ¸&¾â,|+‡oïÑiîEû—ÿPKÙœî»D 6PK8A+org/hsqldb/lib/tar/TarFileInputStream.classmVksU~N³í6Û¥·4´ÐDn"ÉVŒ‚"PŠÐÚÒÔÒb[ÑPµl’m²t»’ 7/xCŒ£3~ò¥Mf¬Ò/Î8㉿ÀAñ}7—†’Ìä¼gÏyÎû<ç½lòç¿<pß(ˆ"ÎÔŸ†·h˜æÙy3˜•qíÛ dÌñl^Æ‚ïࢌw²ï)èÀHðpIÆ¢‚^¼ÏÈøPAK2.ó$ô³«(R Ò0d,ó^†÷² ˜“aòÊû*ÀZ<[åÁæG[†##'àOÞtœ¡§Ä”€’§é¼Kãª@púŠ~M™N,nçŠney¸ -./y–ÅQî­•QËI­È[\ +嬿òF¡`:öÂÍœ!ÐvÊ´M÷´@O¤î|´ŒáèEiÌIF¿‘2r.!7½Ûpq2†;÷ £/%ÎÀöÞ‰ó®žZ9¯çô¤ex·¿Z»Hõ¸ñ}¼6VÕmÔwýu¨GÄ"xeƸáN’­ªðö(‹¦@kÊr Ä”Wñ*Žó0¬âáÙ˜Š!¼HT0.nT<ã¸NÑN×£ ÂE‘]SqázZfë 7TÜÄ-Ê…·kév&F3팊𱊣ÌÃËýt ©eŽ×TÆK5IE×´b·Ì\ìÜ¥ø…mÈOöoQÅ-ËÈèÖÙ|¦¸jØnƒøOq‹ÜVqgd|¦âs|!qò™X¶pÕJ'c–™Œ¹z>¶ çÏëÖ²“_Õ=|Yñð%§¦||v¢p‡oàŒŠ¯qRÅ(øÆ6'Ùvï§b6›¼b¤\µ1Hµ˜{ˆ…lÞ¹ÎeDål*Û]T‘g“Ç*ºÆÝÍ’ÔHtz{&¨w‚‘gW¹šä”nWÚ0ØDóõX×ÛRÚ°MƒPýÓMaÄà')LJ"‹MèšéÚiÚì•vkh㥢½b;×m¾I¼©§@?Ô]yïrrdq”:’ú´Ç´ Ô¾fʤrYªìîŒÄ›ûìKòºí)G~Bš§‚^vQz÷­¸·hÖÂ…LVâ¢÷,uŸgzÖÁõN¸cô€f€¬ ùÊkàÏëœBïAW¡AZó±m(ÔÝWF˳à8I#ƒ{È Ö¥=„ïd_ÃU_Ñ/ƒDöG­ Ió¯£u¨„¶{èÚ€œ i{þM²Ê=„6Бøªôv$|¼7_Bg]›Zx>-´Žn-ÜÓ‚ì¯íëè ýÄ\oz¨|v{Ü@TÛ@ob¨ŒÀ:úîã0=µ%’Ùó¨ŒÞVïú‰r T®2vo®yNѸmO‚$cDÆiAn÷Ä:ww>jÈê-uJ Gl’¼wߥÀ –0¸F}LçdÑ%„F´ÄC´†î膷ø=ú7& Ïy¤cO{tÈhÙñ'„GÜFtô(ñ›¦J%êV¦ö‡ÁìéPøŒÔ¨CáPšˆIAé[6°¨ö‡ÂÍMONPªè J—Gî?ù}‹º¾Ñ.Äch⪟ƫӨÊßK–ƒÞ¦I%<¿U)5­‚R4^ÅNåd`y%ü½Z /x1:z÷ÉßÒƒû¦iéU; ì«ÊñùÀ¨LN¶ù?W×2Uõ¿—ýÿi­ÂÑ„—íŽio2DámA;ºèŸè;àÙ I;|í32&å†ÛâPK<$&‹ý PK8A8org/hsqldb/lib/tar/TarFileOutputStream$Compression.classËNÃ0E¯[hè“òØtØZꀛ¢ˆRGIaÁ&rÀ*©\§ØÇ‚à£RÊŠÍHgfîÇç×û€)N Œ FKž1~'ašF|I@"‚!+µuB»¡*Ùö Œo£¸Ù[ç ÁÙ,œ_Ý/Vû6“ßìõ‚³Û4‹Ã$KBÆ“Y-;pB0-Íš¾ØWõœSUäÔ CWÂÌ %yåv•K‘b{ÁÊíÎHk‹Rô÷hi- SÂZiýŽñ&¨zMy¾‘OŽàòC:þr´üj˜ í#Á¡§:žƒyîþ©÷ÜÿyÖ±=ÔžŒ:ÝoPK­‚Ñ@õxPK8A,org/hsqldb/lib/tar/TarFileOutputStream.classWù_×ÿ.¬´^·;¾eɶòqã¦q°ƒ±‹ƒ ¤QVÒ2‹V^­Œ¤wܺ÷•¸GÚô ­¶`#¹@´nÒûJïû¾þ|øÔy+„ú!|àÍ›y3óæÞÇsÿ{jÀ~üGÁQ¤x9« ^Úãå‹)F?ÇRŸçå ¬ä2Ÿ^É  „u<éÅñ%¦YÁ4fXJð^õàš‚Y¤edd\—ñ ëÚÌñ„¥'“13.AíˆÇu«ÍÐ’I=)¡4ª‡S#¤A ·„ 32–ìÖ­=bZQ¢v@ø¼­'û­˜më$/ „é½¶¥kãê;Okgµ`Ì v¥ìDÊvèwIPlÍÑíc1C—P‘ãbœN½B‰sè(lM ë–„’¡Vlïé µvvµÝ#¡¬%Ù‡%Tù Õì¾O‚»ÍŒ’¥ý\DOØä$¹U½Š¯ƒkVµ¼×Ö"c'µDŸ6t·‡).Â"ºÙ7Ô*ØÜ>ÇR1Ñ!+±[‹ :]_^@àò1[¥ˆd§>lwÄW(Äuœ Ë>b j«™ŠG5ë<%$¡EÛR–¥Çíå‡Tr”`Ä0“dìSÄD!n-H)¥$• SÌ’£Tôô+ÁÓ1DUôcˆ—ûyQq÷ª¸*^‰Êw~ŒTÌa^ÂzA3´øH²‹´¦bFT·T<‹ø*]°7¡YvL3T|‰ýøºŠ^ô¨øž¡à/«íèÊ%JÆ7U| 7(4«/PñmVò,žcMßQñ]<£â{¸¡âû˜WñFÈèxéÃ) ò-ϯEVñ*]è–°I0¥ì˜|(–ìè^Íúc [Wìé0 }D3ŽX#©qJDÎx?ᛟÅOUü Ï«ø9/¿Àó2~©âAüŠMů™ë>œR¡#¬b1¿Á ¿å@ýNÅiN‚ÁË8/¿gÏþÀB8!ã*þ„?«ø ‹üUÅß8Ç?¨޶·ž:.ãŸ*þ…KØiZ#ÁÑä#±pº/اY«ƒQì®ði=bKØÿâd·Œ’š=}£–9ÁýCµOõØ­qÍ:½]éÛ½ºõeb¹W§ÃÚåüÔC™–Hèq@{}k×Jd«‘=¶é$l[ÕíEQO–éçbI;)š†F`]‘8ôÐ4ª7Ïê¡ Ó ¯Öwå¼ËéÇ#á¤i¤xØÔ¬^¢,[µË7ôb<"=uÅ\'‹=-Þï § ÚÚ!²ÌÊN«ü»³“5–<³(Ç&G@0‡¢1µåq3”Érð¾âÃÜ™Ÿ‘•ì‡Rñ±¸9g;;ŠÚ_žÔ©YôHÊvê¢Ô78È!^Gô]‹:TÆØ«-v9Õ aÇ„° ‰ÏTÖ ƒ^}ÌéÑìI87@+Vìê49üu¾Å .ª:G°–sÌ)9”а3 çÓù¤­“Q.3ES—‹W7©ZùöñèÎ74oæ1’k Æ rÂCY žè3‹|å(lU+´š¦¡k$¢ðè_FŠÖË ¶ÐÓ Þ zÑ@¡›‡½€4ùÅ„£€4ÿìPâ©J°§ÁJ¢Ð¥óÂjࢠû® ¤iñ8jéó+X‡²¬uDsôúM•µ”c¾ßa–.Ó+†Þ:Ò#þ \~ï,ÜþæY”ú³(óÏA¤á™ƒw …¶ëÒP«ËiI£"ƒ[fQ鿆Ê4ª&±yÕ3¨q?Ú—C®ëM£>ƒõ‹Á²À†Khr8Î@!ÛFºï »Á-ö2lœÄ†$y‡#ÙäH21'êœ49ñ7W•`tÞ3‹MM—9'DÔŸ"òÀrvó[Á­³Ø2…Ûˆ²u J`ÓBÛÄiõ¶Ó};šÒØ™Á®EæqÑ­¾~±såïv‹Û½¼cš?Gó÷O ^Mk3<7ñÜ2’ȰK8HÛ†UÍ)¤]6ß[)œïzÒ¸%à"‹þkp7]Ð(k“ÿ ÂYÉúlQ)~ö­1=k¹#ˆf¹¹o ,P@G‚½…åx»gŤ ÊôÜÕ·Ó!Ýà:ÔÔøjý3ØG¿,ÿh‰4uó¿+Z¼(YB‰ôv¾®aŒduUä–ù)œÁµ.ЀVæÜ—uCå®Åmg.¶4^B©ë 9Ô½’»² Ò*éõͯ…¬ìÔÓ|ËvûE¹³÷/É•»û:nwJn×bA¶Ñv,gl0óõ¬†owO³ï|¢˜.´A‘ <1rjj! k<œô4^ºÖëñïêq¾òóÞà …ÌN¾ìÒrëÞY´uý’(øub ßJ(pˆ4Âa—åöì¡=4ó 1‘Ȇ°*›¨RדÂb‰¬[¶sž|v4³Ù¯ÅAíîÍ„•^8ã}l5Î~\ÑŒ‰3Á©_<<ƒ–ITÎàÐ 7SE¦ñr?Áàý/D‘½{ î“Å<×é¯,#ýÓ"8'i(WÓH>E#·:ëPeKØí^Â&é&ÅP¢¶äÅb¤DôhRàxùyòÀÎUM³p˜\¯n½Ž¶«h¡J›÷\žé¬û¯àþ#xŒ>Ç˼ÿPK\!ܽ5ŽPK8A8org/hsqldb/lib/tar/TarGenerator$TarEntrySupplicant.classX |Tå•?'sgîÌÍ ä Á AQÂ$!ˆ1<BÄ`0 à@K¸ÌÜ„ÉLœ¹Ãöj[èÃÖ>kÁ Hµikm!I0J°¶ÚÇên»ïG·»Ûn·í>ÜuŸí¢éÿÜ{3$0î/.üò}çû¾ó÷9ß¹óƒw^¸@DKùUþŒþ\†¿ðÓ_j¤Ñ_©ô•þZ#ýT¥¿ ÐßÒß©ô3Aù¹†Åßkä§_h´”þA†_jô+úµFÿHÿÀòŸeø¥7úWþÞRéˆ,þÝOÿ!óÊð_2ü·Jÿ# ~#„«Ñ\ú…lÿ¯FÐ%æmY¾ïq0cÄìç<=¬ÈÂëgŸÊªÊ~êD¬ZøY“9_å™g¨ÐæV°…„ª¯$„³ú.#¹Ò@›,QÐòG ËèŒÞ*þ~ã€@ÜݱìÚ4S»1l¯k^¿fs[W÷ú–¶æîíëš;™ šq¨·¶±4Hhû“QË\5åF㻉áXÇÆZ~µU¶¯]´:6ÙV+è´ŒðÞF—±+fªA‰@á§æa³ßŠ‚?á˜i$]¶ÕÓaë0Y4ÔV·´?in2"3Ò¶Œ˜#,SyukË¢\®U{Mk“í§Òêœù@X—5¾§zœè[G­ULwT_}¥iº^m]´5IeØ«Æé3öš÷šq+y^~³€éþþX4 ×ÁÓ-ñ¸™lŠ©”päÍÍéNx†•H.¸š 4jË!´³MÔ‹”Ëß“~•{˜Â¹ˆN'OÞ/¦®ÿKôIä—·LÛ ¢B/Š²Ê»QS12yñDÊq6xÎØmGYÓn3¼7•FÚÞ8p”›Ëþ™%WN+ä§Ù$˜^;ëˆn3úÜ‚w]õTßçLÿŠpÌy´Èn£¼Gç½¼qÛÒÙ^·lÙ­·×ݤsŒaŸô6ÇSˆ»DÒ2#Íñp"ZÙrÀ4ç2ŸŽtÜB…ÌêtžQ[±F¬'‘ì3¬,¾Ê ûù>¦Â+…×9ISl Ñ´NgéœN_¥¯©¼Oçý|@åƒ:ßÏÐé):¦Ó):Dz]§Çè:?ÈÒé‹tñаd‰NGíËôŒNÏÒ Øï2Ç–XÌì5bk’½é>$òeuø¾2@zœ¾ óƒüÎæèt’žÖù£|HDú±Î‡ùžˆtÊL.ŽÃC*Lçó'tþ¤(ÉDu`^³ljYŸÍzTŠÉ½Æå ˜ÎŸâO«üÓÒ÷^:tþ e˜*'ˆËCº&™4NJ)fØ»i+«ÇC6ω¼ß 8Mg$2…Øó:SŒt^sD(‹Õ/^\¥óipá3N$ý΃€à{ù#ÏJü̺29Ö¦£1ÔÞŽçx1~ñ!ˈÿ†eóˆªçu~At¾/Šë^âÇЀ,‘kІ!3xÌÉzB’e†ôT‹Sf¿aÇ“Îùå LíÌľßÖù‘ø;2|W„”Éí»ö˜aëêx¸ºÐ¡8O¯ì3Í8w'¬õ‰t<2É+%9ž•)ò£éJì—våPҲߌ§«è´ýΑÛq–çx¼Iû:{òA–¬ý”åP§W t÷ˆÊÝV"±+ŠgV®w c­To+1ÑlÁxaõöå*ÿe¹$ß2¹ön[BHX‰)mWYukN‚WˆêlF €¨•p¸ "‹rpoiÚ–“°<ÝqóÊfÎ õES)`vËÃÔíôç0ÑmŒá½&x/iöÇЛˆËššr?ˆÖÁ~³'f@¼ë§ñþB°´ô©ÔÁ”eö9ïñ¦dåÌ:hwÓsзסXtåÇ`À3œHFr‡Ý9äzG&?Nßm3É·Ùr·¤ÚŽ[oµÓsû¢)ál›_$ñD\’¿ÛmfU<0¨ ‰"Ý3•¯—™ ¾fW*K[¦Ó‚ëèm-´%ÑÁ3ã½²?»:g“'¼‹ÂédŒä kc4‹ÚŸvÂ&fußÄtíå«WÕ|›@¾Ý­M÷ôÈs¢$mAUhÖÒbg²IûÔK§ ÌõÓèjÅûŒhÌ)Þˆ¹+Hñ$ÒVöëT‚/.╦l¨{—-J7b0!¥$6Äê—U,îøÈù¼ô‡³-jYuî°Õ%ýÑ´Eû¢R¬Ì$töÚ´ »OJŸÝzû,›ªOÚ8lR7­ÀtŸ”å™kc‰ð^Ç×vÜŠMËŒ»ÁÓ"±d[W—Ün¤b¼×Ž~#ÒäxÖ¥ !Šš˜á´e«jÄ·:ÝleuŽ»IRlkîhï^ÛÖÞtt‘T_c9L›d²cO: –ž^½}Fo4Lói)=JDd7‚€üÒºa®”ç ³"=¡=£!´gôöü”»F7cÏèñìù”»FTÚGÌôà3 Ø¿U`ßnO;Ï’ŠÿD=Á ñ* y JM±'CJ£w€f6úFɪð “:Vá½P¦ÌKOêbafÌÞà9*ž8Fó“=ÎË—;Ø_q¬$‹qä½k»‰}å„Rßq•ú®«TvE©ùÁ¬&ÁºkB&'.j]Þt™W2|¶ÉÇÙOƒÈ– o)µÐ\åÔ„Aîv 2Jí¡aÚÔ¨ºÚݪP‡©ÃQ¯¶Â{Ž:=öx!C]¡ßq*©Pí2_†6Œÿ¤BÍЖ <Özž¶2†©éÞ£4wÀh›cdqøm;gè}råýܨP~£s…l€4ú‘œÝ€“4AÐÆ*cq'¤52´ËµÇ¨ù8jàI¨zURæjì<‡`‘ùÖÊ˘_F¾ÉüvÎe÷åþ ½ÆàDoÃk*}oeÌ?õ ßCª -¾¯ŽÃÜWË-©s?Ø„q”"-ǹJ?œœúWD=¾ÝiÃ,™uXü5RÎ8–3>ƒÅÚl fìŒÐF ª°ŸŠ9öì(í'“°ÏfïŒodëÖaÔL©¾-ÕžUsÁ`6jþJ84‚Â÷49PÞ)R¤œ§A™W¦ Î”’9@3Šh\n̽ùÃÆêC”é‹óžÏ²’ïmR®ZÍãx"è®ÈàŒ“–]å)Êo`#Âï»"•¹jj„øõžqË)>Y]Ë”£`KÉÖjjœ« ¼`ÿ(‹­Øï‚VSå`ïÎ…ýc»Â¥]PS9BÑw!Ïòmí&à>¨ƒ×—ç9îÙô¦*päÙ1~àq€URVÎÙ•Gž¤YAE ~†öf(6H}Åñ %PÈû¥xfè>€I€s;Õ}ˆQ±j!—‰‹y†Ì\Ƴìµ0uxÞW´y /ÑjE’U„8o¥„òeÔN¦Käç)icÿ äÆO‡?Ë<+Àú£GÉ«pè(ù±t+mHqíV|¶‚â+þ¸c´Ó““- €þþvè¿áö OÒ'2ôI<ãg¡ÐYšïÑò¦»BJaª+ä-´ºB¾B£+¤&»ÎÒÃş“Œ¦ìÓËçÖŸ £ôHhÎ0}7é³û…Þ=HŸs¡*h“¾­FÚ¶Aú<òq…g%Þö‡‘¡eÀ¹¦r'•hËòy¿ÂN«…KºlÀ@:¬V˜Ç°V*!ï%jå-*ý)Lí—ªG%90/eÆHÿPKÅgAg‘éPK8A%org/hsqldb/lib/tar/TarGenerator.classX x\Uþo23ofòše²“š„6t:i2µh)I‹$ébjš–&´¦¨á%ó2yÍdfúÞ›’TD\Áº¦Š@ƒ"j#4DZÜ@w¥nˆ¨¸o­¥ñœ÷&É$™–À×ö¾{Ï=Û=ç?çÞéÃgï;`(õà¼Åƒ·âZ o“ðv/Þë¼´¾Þ‹wâ/m¿KÂÞí…ïñƒ÷ºñ>{?/>ÀÃM<Üì¡áƒ^\ƒ>äE2åÃN2”EÿÀ >ÂÃun|Ô‹l|Ì»1"á;ð ý$ïßâE%›òâSnå½Û¼¨±)·óp˜iŸæÙ<»“gŸáÙ¨„»¼â³^|wóìóìÃ=š}¾ÈGû»{D˜ëðåÜ‹££@C&®ynÎäŽÒû”^[¸ö|&Ò¤[™Ûyµ®™ªu~òðVëï%üHÆñ¨„ŸÈø)#8ÌW)Pž!ã{š)'‰¸„Çeü OÈx?—ð Oᤌ_âW•/€ÂDz@d °è"ä¬a†´¨Œ_ã72öa?ºŒ«1$ãMèf®!ÂYh6éº2Ìø”±WÊø-ž& Ô›á2~‡g¨PêÉ|}ø€EUÈöiyŽDÔ°iÒÉA*lÉø=“ñ,þ ã|Æ?á¹i«âíiœfοàiÅs2þÆË¿óì<û'ÏþÅñ½pqUÊ'ü7ANÆð_^œ’ñztÉ8ÿÉ8Ã:ŸÄóê k^|I²Ê³¦dªDA ‘ÅC¶,¤Z8ɦpáQÒùphNh‘ªËB"óÂ-<„¨ª`O½<äðÎ2é<)‹%"—ã]_Oûyœ»§hù<áO…Q$ŠeQÂ)Mƒßöž½j/ΟùtÛ”H_LTfÓEµ¸ v–¦c¬=fnŽ%¢¡4ß,ˆZÍi`¦WÁ°aªƒtÊX‚œ)ž)°Ù–ZœÁÉÍ–ô…uúÓ=PÀ­FCÆnÍì?‡É=¤'5¸1ÝTCÝêYw“æTx çÅ"6ÚAÛ¡°Rùk˜†Õ÷HWNH5ÌîiÚ‹M§š·ýËÑŒšN¨‹qgÏ[[ÝјÙÒnªœÝv-à"ê¶Zj·ÍF¦ˆÔúR‚½ÚïS4ji¾y÷„?7E{—IØ}¹•3ËîÝ!µ'AétOO\ïNõòbÊB¦ä¶½àå³ØÇ‚u‰æÎ}¯J(4/_vµZùê}©—Ú‹rªsÑ·_Ëbõ²ZŸSë†ïÖUF¡ÝÐpŠTQ`ƦËÍ¥Äã„_ºLÐ]@JõNJPE¦Ä¥o·œoÛiU)ùCð]‚T"ˆÎODÝl2›#±Þfn{ ÃÚÕGO£ŸÁ7ÓïJ¦«hNäBêWŒv«æQë3· ÍsöFb†ŠjzE_Aïúl8øº¢™ƒïc¼Ázò¿‘ÖtÓœßàWA!Z­n‚‹d€ÁÀqÇaTAŒ!Ëq?²»² áHÂÙ‘„+ )ûÜ“ðtMÂÛÈ^3އ‡ÜFb·ÁWë[2†Ü?’ÈE¥cCEàøa”ÖZÜÌDþõYbtêÙÚ$ ŽAB+ùp,;¿„кO£ *Q]ä\ úˆ'Œ~ÙQ¹ÉŽº•Gác ¬CÃÞÔ~Éú:÷ÂwOj›ž4ö9ÅèD{`…Iu£ø(JE(%}äUYƒ#{­³ŒÎür_y‡o/–ÒbÇZç(.¶I¯°H®Q¬˜DeתœVÄITsȺÌv‡nËNðbùªIåÁIÔÿ…v„Ó¸VX\þW™ËbÞÂß•‡°Ô¤\é´¨=„ר«ÎÁQ7££>G î!L"ØUæ(vŽcõ(|Ó«º$^9Ž5GqQ݃(ëFPhÁãÕ¼“ÄZBÅl"7!g —ÀE™”0H/‘((yËjÎ`5-ªO£z§„Ør°e]B¼ÂʾƒTÖÐ?zx¦@ZH™ç_­R@P¢.¶“? à =ÇRÌ~¸- TJ&±®«vÍ.bXŒã’ 4dawf ‰Åhh<Ÿ†ý) +Hƒƒ¾å³–æ¯f%ãXŸIvze§àZCâü[ý¤÷—YqßÀÊ&@?ìàgo¨˜¡†1ÆH¸Œ`ÝTá¸êš“hñm¤!MjS~U›“Ø’Äk™\1Ö,<€um³Âà­,ú:lN¢´±ëIl#¶$Ú­B¾Á&mņÙ6´C ½n— Œ „&;h°*¢ctê[¬sŽöU'ŽÐqËq;î ÜÇée]“ÂÓrxÊŸ§¹8…kZ% Ÿ¥V!င7ŸF9pŠvç†o·õÿ‚~Ë{° òÿPK6ÂGþ­XPK8A'org/hsqldb/lib/tar/TarHeaderField.class“]sÛD†ßekm«”4IÓ6-i¾$çC¤4H)!m i¨ ˆ3Š­¸je'Ør‡¯{¸ã.Ë?à‚ª”200½æGu8g­‹t&3Äã9÷Ù³GÚ³ëŸÿù€Kø¼ ï”°k:.ë¸^ÂElr¨ò̻ޓ˜(·xpCbŠySbš¹-1Ã|_Âf~ á0?”¨0=‰Yæ-‰9æm‰yæŽÄó# —ù±_@kÍP`bk¿Ýpïv¾ˆë»níºIÐvoíÍ0¨‡íkQ×—)¹¹_§ä\7ªSlpÔ:ÑפòÍ$â:²v7¬Ýït›ô3ùê Ü‹ƒÏ¨Fìöž–oôX8h‡{Ñ—$:ô¼D@T¹b²  Oî\ݺ½á LÞ9ÖËq7ìLÛÎñVhëj;ºZ¸½'pÅÞº<Ü8h5\/iG­Æ²s¼‡¯D­(Y8}D‰jµê콈ötÛÜ»çd#L¼ÞÞs¶C»×•àÈ•Zœ¥)Ê]:Ty£Õm®ãÍV— ¼Â×ì²OpG`ü×x ŸxŸx‹ÝÙER¥ L˜â0Ía†ƒÍÁáPá0ËaŽÃ<‡.&N¾øòÔ‚Z¼ß¢Vœ²CÛÞ½ÖêèÒáF®ÇA§³|Ôá¼X•Ö uÎÎÚ"]ù‹ôì_å}Ä©ŒÓg2ÚŒ•Œ³ç2Îg\Èè2ÑÇmS¼Ä4Ïð и€"–ð*èžÑh˜ÈŸR ñ;úž!÷«©ý¯g9#Tƒ³ÊƒÐ* ÿ Z/©Ïƒ"'Gyâ@eöÜS*cO W†´'TîŠÊ“ ­â­¬°EäÂùÊoÐQikGNËÞ´ÄU¼Ý›ë´^qå/hþ@1—3ëOQzŒ²šY7ï+qB‰“y36;Jô+aÌÄüF K‰ÝüÖÂwÊ *sJZøÞÂJ )5l,üdá¡r#Ê6u~VnT¹3¦´„°„®ÜYåΙEKÐ×VnL¹ófÉŽ%6•» ÜKfÙ¾%~PnÜ4þ&›KQö|-Å Ïϧè÷üB Ëóõƒž/S y¾Ij„@n”@ò,¡˜bŒ@G|PN1î=†x”õ»w0ëÿPKAÞ¢IPK7A.org/hsqldb/lib/tar/TarMalformatException.class;õo×>#..fvvvNF6›Ì¼Ì;FQ Ÿ¬Ä²DýœÄ¼týà’¢Ì¼tkÍ0Fçü”TVFü¢týŒâœ”$ýœÌ$ý’Ä"ýÄ"ßÄœ´ü¢ÜÄ׊äÔ‚’Ìüorg/hsqldb/lib/tar/TarReader$TarEntryHeader$MissingField.class•RÛJQ]{ÔŽNÓ=»ÚÅ´ía § èAQ òE#ˆbÊÓ8153DýUEêú¨h«EXÒåeŸµ8‹ÅÚ뜗×ÇgËȨˆ¢?1$0¬"Ž•ɨÀ¸À!rdK§JHmÕ=˨ùgNõÀpì#0=cÛô6¤Y•^±!Z%t­Ù®¬ô?è3;„p¾^•Õ’AIú¾i1Ö3[Çæ¹i8¦k•À³]kUC7¦5Ä  Ìh˜E’ÐÿU%0§!…> iÌ ,V:Ç(7c¤ÜÀ»l¥J—lßg—bkåÞö[‚¶éºÒË;¦ïKŸi»|è3LáâPžvÝ%„ôÆ–ñ)Ê9Þ´Ö´Þo–¼Òò#Œv*¯œã‚“¿¶JˆõV„×úõ½ï­v(Z@',ý£6Bâ'5’üâüãJãù)Œ»¡ñìa6Â\áSÍ>€²KwP®¦¾}ïš$"Œ€ø Bá'„wCÙ[(÷ˆTîÑuõ.Ÿä9ÈVcXÀÛ F hoPKòX°¥†ñPK8A1org/hsqldb/lib/tar/TarReader$TarEntryHeader.class•X |Swÿþ“—¾$<º4´@!-í¸ÒÐZ6Œvk¡lËÑÔúš¼¶]òJéPæssÓMqN; <ª´àšàº :o§óšS<ç¼Ï¹Éè~¿÷’4-q²ðéÿøý÷õÿ?ž¸øðc®v'Úq·ŒwÛñ',8â@ÞkOÿxwïsà^¼ßI«ÈrBÁ}¼ù Ëñ!và#¸_Ƽ?ÊÃ1'A>ê„‹YÞ‹1öÇ™Ó'x;Ì«OòêS<|š·2×ã¼=ÁÈŸaØgy;«“¼:%ãsN,ÂÝ<<ÄÃ(G?ÉX)§Y•ϳô‡¨ÁcN\Åó#2µÁøYŸec‹Ï8± Gxø‚_tâq|ɉ/ã+vœeà9;¾ÊóQ–ÿ5;ºpã ¾î$È7xø&Ëÿþ-ã;,ÿ» 6üð=O2äûN´âhZ<*d<%㇅íj|CTnÒÔ PüѨo «‰„– mK(‘E{šBZ8(`M»<Í{Õýj­®ÐkÛB‘¾°¶^Õµ¦X<¢êõޏ:agÙÓ õ©z¯€Û$ «ÑžÚ6=N\ ÙÞ k-± & ü´ ªºÚº‘·›äH,ØŠÐΡ±–íƒ}|ÒHûØéÙªò™­?¡«$Lì(¸. ékèÝÓPµ“„7̧·éj`_‹Ú×®v…5Ãü=J&Ê熭OÅ¢ltF¼Ù$ÒMÀå­25ÅjRo`è&²z«H%™€[ K‹3“m–ÐôõYû$ïfÖoZO.8‘ÙN‚µd,g„¦¬“ݤÇL®FV=B²C‰¦a7ï£AíÀ –üÐà÷TqŠJc/c-ò6Çâ=µ½‰ÂÁ®Úp¨«–ˆk)ÌÀá®g£œLcÊXyYT—šNYIv0'T×z81®yµ¬šc£')g{ ”Æ^-°/ÑQЋ Ìùß9)P2H¿š––š`pqûâM›ê"‘ºD‚)¬àuèPð&¨ vsNüDÁOñ´‚;ñNkó+¹ÝÐ`ÁäâY[+Ìûg îÂAÏà €7?§5Üm(™M@?W𠜧ěêH7a€‡_*ø~­à7¬èíx‡‚×ã ~ËÛ7¢SÁïxõ,]lØï™ì9Þ¾·)€ôûo5&û#ž˜5UXC(LV)øþÌÃ_¼ ·(èe¼ l8¬õ¨aª/]Ë¡à¯8ÏJP±äÀÌKuwsJN6{pPÁßðw–þ*oêZÿTð/ü[Æó þƒ¨¿TTðé‹tZ£à¿lÒ¼¤à"ÆR„ ‡q+±BÚ{ã±îа’²B¶I†µöGº('GG8/ Y`É«HI±ÜÒµW èF¥Rý—x/­†Wþßò ‚¤k@`þe”Óå–=Iw„);Õp?¬$ÉvjëEé‘P‚| Î7+ÿí õlçæ¼MÑAí-Ó_{÷äqF>*)jt~)b4E)a4O[D7:¦Ñ>µDBíѸUR‹î«=|O˜T}q­;t€j_Ÿ%GÖä Â% tEx·ñ•ŽÝêuºÖ‹†;£œ@aÖnF‹r…™Éßȹù¥pµÐiQN fºêt=¶% s1š-ñúór.%ó`‡"= õØV5Ô²]¿*sü»ó2®¾LG¦m°EÔžP€"Æw—žØâÛ3oEðÕ «ëzoN?_Mv#sˆÎ¼zÛôX­èº£ÛŽRØÕ¥;Í«¢s¿™É²1ó­¸0ŸM—\7³™I´?¢ÅC)Ì<¯Tÿ¨¤'Y;½´ø‚¡•Ä׋1S¯6fêÔÆLw1w¥gjÏÆ¬¥ñ¨ãÒ|uÄ=÷â6ØQ@ór_ Â7K‡Ûš‚4 ›¯£°û–ŒÂá;gÓZªÏ¡p JmS˜~Æ—DaCuWTÞ3„ùcpÑA‘íQ¸;¬ÑÖ!UžFq[%)Ì<ã#.³’˜=ŠRßC(Ͳše°:…9$¡ÎVjËÌ1Jm$àöQÌ%Oå,Î žBÙTʲ ÊQ”ÃÕÊÊÕ$1/£HE•£¸’—ó Ðj!­Zk΢’±¨#…ÅDáuÕ&QÅ Ó: kOv“WªO’'Ò%ÿ =øö‘oWÁ1Ne«Œ°ŒˆŒ(è©‘<0›6³Ç1-÷PȈ)°VFn0BDéFq$h¤ð`-¬´|¤À•C˜Ã“kéý(C Ùùš$jSXzf Wu°Š)\=Bئ2DYNKýifE433s9n<àöc ÏqéHúøÓÇnbh¥¹À7¼~2}~#fÉ-Yrû‰ôñ›ó—gŽß‚Cy„ÏÍèvSF7± ü<5†eéà¦m ËÙðòb\Jae×rÄ(¸UªV5/a[ïƒÝU1 ™×IÔíb`õ}ð16ÒLÝõÄ€u8ëdW…õ4Vg8²]”ήiY°{™I¬5x.8»{)h‹dJÞÚ îkLî¥9tI\?³m(ÇjXŒy+'ÈÍãäõÌžæ›ÅV(&ŸÇ¶<¸œX‚Ÿ[fµc%ÍìF®¥Jöæ%gáZânLbýdi’õxVòø”‹u"';üJ­Ž˜ñ§`¹g…T"•ÃL_‰´lî°—HžàñÃ’Î’ËÑzVá~‘¨$~B¦ÕZJ3§V±¼1›»Œl†½ÚšÄ†)ú’>ësõ‘øÝšæó.ÈÜÌ ›¦Õ4l\CÎvX=e§±‰U|ÐülOþÖ=ý)ë#ežà iŒºyJ¤ü#u6³­½V2ÚñlÎô3_?6Ó?SÁBH±\ÐOj•qÇ$%é+ ­änRR¢yyÖX›©vQjµŒ´šÂ¶Ø&„uHÔ„¶æÈT¨gÐG¸)Sa§(ä”&™ÌÏ•xW¶ôn!ws˜6:ÖY×”Yp «ËŒŽÞtEæjã±tüWHóJ¤!8бm…Egg”-;t«ºî°•âùø¼ÙˆøPð$I”¯ã˜‰2O¢‡²Æ)X™E’^ “vMÄBÚ°ƒWhµ ÊËPKGœ›A; ÄPK8A"org/hsqldb/lib/tar/TarReader.class­X x\WuþæÍ¼ÑÓÓfil-9^âXE–£€’Y¶œÈ‘-GR¬È”'Í“ôìÑÌxæ-›%@Ó6ÝhnA’¦ Ð…8Ä£€h±!„} k¡-MS7t!5K0ÎyoFËc¾ò}ý>éÞsÎ=÷ܳßûæ™W>q@+(Ňñ‘Rü5þFÅߪø; Åcãg4<ŽÉÊ‚žÕ˜1ãǬžTñq™?!܆r<åÇÓ‚œó㼊OʶOi¨ÅS}Zƒ‚¿—á4Lã3¥ ]á¢lý¬@Ÿè1?ž!Ÿ÷ãY_а_Tñ% ëñe _ÁWúš°] o¨øf)ÏÏih·dø¶œñ w㻂~OÃ÷ñý@†ŠÀÒðÏøáû‘ ÿ*ú=/þ›@/¨øw}IøÿCÅ‹Bü±†mxÊËþÂ}ÙlVHÿ)’ÿË#¨ìýog(ŠÿѰŸQñ ½xI„ý¯ —…üS~&ÐÏe¸$,—TüB4~YäþRν"¾ø• ?”áø˜r³ T¢a3žÈ#4E ¯@>Tü• ¤±P*SI×pˆÊ…\!C¥ ULµ‰F‡»©:gçáX"CÈ©U)@¨4ÝQ;qüÓ› ‚Þš‰#™4“¬coÏÀàÈž¾Ýê!”ïˆE“¶µ÷‘”éÁ¼§ûžÁþí;\>¡ îÛßÝ?Ôß3Ø=O-!¨FblÒ:j6ôÆ-“É#‘ðhKÄm±D +³ËŠ˜=Ñxʰ¦1ÕAðÇ Û6QÖfÅÁÞCÆQ£%e[‘–„9aN·ìs™O™Š…Yp…9m'Œ1»ËHš;-¶¨ÂÝcÅZD¶ÃhXQÂÒ†œ´ˆháã¬èDGã~^ßá*°±Ã{Œø 11¹FTZJк§Ç̸mÅDßf+jÙ[ »®>¤§ˆèJOÔfåWojÜÏ«Ò2ñ%Öƒ&xx–;ýMÎhÖa´÷Yã; Û ÜÙpOö;½ñêw4ãÞ׳K„upžsÊ«äcx$”åœ)ú6ý–G±Ú:û$yØŠ‹ 9E¥:­¤:•êuZE7ªûŠP÷›RiµNkh­NëèF•ÖëtmЩn “)ć67‡­„9fÇÇ·èÔD73­Ðá:5ÓFZh“Ži'¸­Ó-ÔÊÀ4amA¸"sˆlOL¤¦Ì¨=Ÿ:Ý*G¾Š<ˆwêx7Þ#¿‹ßÓñûx“N¯¦6à8ží‰:½Fñlœ8AXvlÖé6z-aýÿ©DDùvN:ØF6ëøܯÓâÌlú-"¦Ó6ê Ûuê¢:ÞÓ:í¤nvÑZÎAn§;tî»uºSÝK{TÚ«SmÕñ!ü•ŽGy }n$6ét—Ä·&ïõž¾ßõ³Ÿh€î 4×q%¦ŒB‡Šä»eØEûåŒ!B0/~Ÿ7Ã}){Þ5„åW­-òÚ=: K Néu:½^tzÞíæúe"[GtºW´08º4*Ö?Hc:…5¥qYM j zH ÃEš(*PL 8m,ÐW‚\hŠpD§%u²eHÉpTÂqŒ¦%•:¾¨šúFqþsŠ´#Bõ5 ‰›å­7&…X³@œLÄŽI/¼ºb'm“=퉥ø¤À|KÛǧ,4ñ@wöw± ù\IÚÞ²bM¦¿‹…T.œê\P|Ÿp'ÜkL±Fµ Ål,e†|OÙP´áÛUSÄ>,.X„¯Ž@Cñ›£"b%mFFܼå’7§-™zdYã›3a'‡,{ò:2ð1£ÂÀ}Ÿ/ÜÒdj4™3 ÀbŠ©ë3¤ŒHr‘L7øŽÌ>7Qèe3!±æö82=2‹ŽG,I“JvÖöÑd,’²M·ãW彺p{úÍh8g‚:›Š;|ÍÅŒù wõ’Å÷¥¸Ço垬ðâu‡¡FlØËW’Û®º"±±ÃŽŸØDMÖºRãã’Å%9µ¼ »d—ÎV9MnðxÜtØw¸‰3`0E•BŸJÒ‹‘v,Ÿ5¥&åÔâ½»ùRLš¶ôw¿Ò°[NlŸx…#?6)jÜZè•“Fb€eFÇÌ"¾Ùãnê(r)ìÉËËIæ@W¥¢ÉT<KØfxÄ}÷ I¦Ø;O˜I†Øc‘X’yÊ& 5¯[ã#©èáhìXt$Ìä¤C®² #v,6j9y·»hÞm(õâºj!ž×4i§rjX³þù:‘M惚C¼Ç–Íú©W7Jç—yu<’J²÷—/œTøŒöjÇ(12oµ“üÜ5òù®YÉ|Ö-JÂâ5_î>Á~vEø¸ä“6ë[{;ñ½5’§V˜›->+éî ^Ã>ÙãÎZ™•Ü™Ê\ÍwNΑ°É;tžýlñÖí«µ“ï“”ÞÆVw:E¾ýüêZtP{iP½Àå¯f0È”v­­LØÊεós¸{8È5¼ÿ1vܧpϲ¿žÅù.¦<Çž“ùyÆ_ÀñÏ/á²3?Ç”çç«<ŠÊ+*+³¸)E.AŽãC*>¬ØNVô©xX•À\A™ŠG²ŒkYy~8ËÁÑ®YQñ—Ϊú ÞxudùÚ¬'ÅùÆ‘-¹G"[ס\\…ì„okâJeßÓî•B>…ÙÉ«.¢ÌéNs+—æ°Jð³8è2¾®Ý'Óëgp»Ô‰÷!ÔÏa3ô÷æ‘Å÷â¹÷¼ Æ©<Çh1Ÿ+Kæ±yÎpŽÓ·ˆÓ<…m.Çøu8&æeLá`{­6ÎÙCÃAï,s:x=ž "Cî<•›£<Ԫη̸žGqyj5¡8åñÖBbt¨þ4:ꋤ¿R/­‘›K_}]xëBZ×¹yKg/”¢yÏrc’ËqŽ,Îû•n¢¹&у^69Q‹¤•AjH<TÂr­®—Žù/ ‘+}`Xq£3ìÄú¨r®;ý€~D—8ñ/Ñ‹ÎÜÌ”Ë<ÿŒ®”p‡.))Qd¦ËL¹<_!ßÅÊeYÜât*Nl'¯ßôÉÕu›xZÓ¸fMm(-äp¯¹Jæ§³,¦è"ß|iøàP–wÒšùBu ±¬sa-þ=‹ÊñCùrÄIÆäçô#âÙÒ“§ œq¡ëæarS[çkµþ^y©?ÓŠvSe>Ÿäצ¤³__xTï-­ê¤WPÎ6p#ª^ôª:Á˜Æsëzú¯PKÖÆà PK‘®Aorg/hsqldb/lib/tar/package.htmlMÁnÂ0Dï|Å*\!þÃà@…*àÐSµI6±UǶìTþÛQ ’O³óÖ;#O·óv!w—Ã×v°w–QÛ¬ÍÛŸÉCk0Æô.@“mHêéá)\?ÏÐ!cƒ‘’mqòÞNÛ G±€*L&{m’¤-0†â÷ø›#r˜+H¨ßTu-Þß0éŽDGÞ¸ÇH–×­BϵâÑ,_êwS®^Gj¹Ê¿ Ä›ª°UΘ£ý ³²W; ®/ãÿh÷HŽ•SOb.Jй·'PKs_Õ?PK‘®A org/hsqldb/lib/tar/rb.properties•XmoÛ8þî_1ÀîÂ-.Ñ&)ŠöŒÓÒÄíhœÀvÑë¡_(‰¶µ‘D•¤’¸‹þ÷{fHÙÎK[l?¤6ÉÎ<3óÌпЯ“bD6KZkZm}©½xñê%ýóðøäðø5¼¼½úuS7º _ƒ_è\/UWyzorUiš{[6+²Ú™ÎæP³4–ʾӶÊ›°Ðäâêr¶8.FDêZ“ë¬&o¨sš&óËÃׯ_â^ÒMn ÖÇZT³!}çuSàî|­¬Ê½¶îú2ã×T6ä×%n,aÇ3lvªª6"¶ïo?ÇjA؆¡Kmq Tz(‡.Þwbå»ñt<;}Ozþiº8ýï»D×¥‡é­Ê5.h<=§Ë·ô~2ÏáÍ'煉·“3¸ùè¸ò”éUÙ4ìœYRU6Pããåðg>r£-\†¥ñÕÀÊÁK @ªÊܲ´l(ÊMã˦S¾4MX{v[úµ(#¨¥²n«n6úV¶.M7ªêt=;3u†Í‚XVö[«oJÓ9:!Û™ƒr­UÖÀÊÛ=¿2Hé¨M~f¯\¹jÊe™«Æô"ó4Ñ¿óÄE}žçÁØÏ FË Ý{MÊA3i—«V'DI]S"4}îŽŽŽ”$‘¸žY­®wã¼V…Äz±Íü_Å9–mh¦—gªUY¥¯Blf1³ßtMQér@vÉI%1O6´FNÑZ±u`rÚìð¦‹óÜæe„’«¡¡By\ P¼²«¾h~¿š]^g‹OÓÓ‹qµ·ˆ®õÆÑÅé'š^.èì :™Ò‡éùx6?»œ ÔŒu9BÃ^Ó¸éjÆÙy„ѽ-Q ªó¦ê¹” Œó1sP™…ñ."¥­×ø:,Ws-ȳա¸Fƒóìʯ»6q›Æ«»tp!ögˆÞ­T¥Cn¬胥©˜cUQrª¨ ®Ix÷ëUà~|£¶6Ë'ÂGÜI4ëš•ÅV¯uÕŽbþpÖ øïŸêFÑaÞR«üúwo~_»/U‘%*K¿ýuümÐ"«2Äò:¹µHôôJBcÊæëòF‡êâ“ôU[CrÔ ò Em½Te•¾ÅŸ€½ÕµTkœ+3Ä´]ë{u£p)h¹k[c°D7Þn€BÕø4Ø/çSÈ}Ú  ¿iõ3÷< ÁÙšLƒKãY9ãhHÃñŸ»!=Û‰K¹¯Ímɶ,­ó¸°êêu›µ6ò‘N>rª „CîÐjxX œGÖIÖ-ÁщÕ|}úF¾Áâ ´ñLéÖÔ´‚o Mš¶ós„Ànvz1‹’/ÓE5"Í.UÂJŽd·˜óqβ$p¾&u Ü›U:Ó_º’¯îy"n ‰Ijôª%(¶Ï¿M:ì—†tþfG²Ä0è/J§ÚV+¨NÃ:í-‘Z¢ÍQ&éK(YŽWDlV;¡øõ¯ùñm¹LjUÅb{Ï¥%°¤¯&oé\y%(ôG Kå·¿N¾ÝO\ùuЋmsp_˜†|hj¶• $& è¦c¼¹$Bî„D åÄ+ݬðŒH¤(;¼1Y¹Jƃ&x÷¼Iá¸ÃX‘k]8wA9ŸÙUF Ž€ÇbŒåvQèMÑ`ì®­¨-oóŠ{4W­ ©ë375¤W%]sÝ FÒ¾kuÎ÷ìmK!E)€„Œ/ó%–°ÊtÜKôwì*ဲŽë­«ŠP´qÑ(ôþý`vÓùt†Ž‰ÿٿݾt>.«¬‚A¡‡E#sR­7a'Ó êÞÔ:3f– -"–›É¼êT­Žÿô4º÷o²dz¦SYÀ^{€0bˆZMp†Œød:„à{Øžë«M¤¥ý‰t‰á(ð6à·¨¦1I‹ª.Ö25¾=>˜Ýo Ò-#xB ð¸€ö˜¬2,Î% ôË㓨R¯T5e­UÙMzÖY¹UÈ(æ½h c’ C̈PqÈÊÃ}5†õ²Å°ÁØúÑ•†qzNXÝE ÷é^—¹‹D*¹§•8b»P•2°sʹôavá¶‘øÕ×P§²–¬¾%Ì’¬ÎC;º½KÏ5÷ü0 Š!ªâ”ä·ïúŽ+㔫‘†§?Àè¶ ÷Ô-í"6ÚK¯« °W´ íwµ±B#Ú³'‡©± «ÓFÆ$Ì{¤ÁÀપè)L”˜+,"ûr¼Ç/6¦„C•ð? Û70L¬‚—'—½i¶™Ä®lDª7’#ÒßÓE˜üýÚÜ\±(sO$â‘ã—ÞGyò’œæ!uV>9NÏ{άåå‡ôAQ¾qÒÊ(Á‚ÿ¢c)‹A–±mvs­ëøò`Z)BšJ8Yn²[¼UîA> æË[æ*ãµ` ‘âH÷ž “u˜EÑ=öiûYåž²‹˜ÝŸZyÔäÙrø³©q¸8ïFÎ1ñmˆ?‡mÛÓFûx1ò(¹KÐY—˜i<‚…š=<ÜfW:$‡’Ì×!2á)ЗJå9ŽõK¿Œý)a îwnþFq[ŽJpbrnOõ •›çÎV–M“Ó¿c¥³´¬÷-ññ-à~ësߊœ0+}>ɤ˜¤SMÅ{2’[VØ+¿=%?f½µˆ£û}†yZaÏOÒÍÓªµÐ‡ÿv|ô‹ëë¿AK;#~pñpD1‰ðE¥Ã€—¯ÓSLyuG—Ð_÷zÖ†œÃ0ÅH–öuùâÛ –_ Ã'FræÀ8ÖÆ]ù‰Å%ÊòµÆ;£«wf…ç›õð4ÑvÚêåÄäG<²%¼žó®’W³$xìì BI· á§_Öú€ÙçÞûJ¸Ùž‰X öÓ'—§Ï"š Ú•™#/ãoú“DøÑp„]Cdš®Ö¶Ìÿ®ìH¼¼÷`ŒŒ΄Y”Öfèâ@eÚî„ûv]‚–D¯}jG<¢jþ9ç d2AÛ±èé­<¶ã’°g·Òý/xÿPKÞ¤>‘óÖPK9Aorg/hsqldb/lib/tar/rb/PKPK‘®A*org/hsqldb/lib/tar/rb/DbBackup.syntax.text•‘OOÃ0 Åïý¾ 1iMµ+7þœÒ Tzp¯ÍÈÚ›nñÝI£˜ÄåÙ~??=ß=-îÏÏo=BZ9p(M&]Öð«Õ¥Z£‡“ùg:•´agqi Ƙ±¦ir»üÒ”±'€ç8ž§iדßz#T€ ÏF ÐeV"S,A·†å›~ÀË=Õ´›+¥Š#p´•üíwe,ý,ÈUý^Œ®µ9\sÛs¨?D%CSvT™•!½WOU’,T©bów `Úʾé õ0Ö¡Å ÍÀš ]¸¾º¸„‡å Ï`Û'ädï(Ü ÁùΑ‡I(P%&*ùPKÌ®ÍPK‘®A-org/hsqldb/lib/tar/rb/DbBackup.syntax_de.text•‘MOÛ@†ïû+FBUН•+·¦æRµ´‚­Bcï`/lÖfwœP£þwfÊ¡õe½óñ¼ïÌžý>ùùéבùnpUü¸F“}È›xçL©o0À‡‡Ùß±êc¿c)|#gz_ú¡ÈÖäÕ÷âøôß`e×p5Ö/²¬]SØË´ƧF-?P̳Ë> ä²ú? g#?K¼.Õt?ÓZ/÷;ä&çvî9`ÅûmÈdw ]›çýFq\$yî°ºå´NKƒŽÉ“ßbä´~L¡¯¥³”T‚Œ¯#‰M¶j¼‡Z©¹e&( «FXG Nt©Sæ%FÊÓl‚®\o(µuR/qð¸¢)8{KIøK1ÿ ç§_ã6 ¨„`l+  mG& ŠÛðg¢UAïKœX?ÎÅ€}Õ@r¿Í¯_ŒƒIiè©ÚØdߎúÙ“~;¶í)HqÛ†:àÕÄkõPKAøé˜xÓPK‘®A.org/hsqldb/lib/tar/rb/TarGenerator.syntax.text=Œ±‚@{¾â5†/`¬ìlLll´Ð‹–°r·JˆñßELlç½™ãåpÚž7¸Ó“°,z,^Ùʃ3ò¸²šwÒp朻Eû ÚáÈ3BÏ…TÂe‚`¥(iä ÏTÂ: ^ŒAú§ÙêH©eÄó?vÀ^aµ4dÆN Ú? _*íT˜[YºZ§ÈGãà¢PK“¶"•½PK‘®A1org/hsqldb/lib/tar/rb/TarGenerator.syntax_de.text%Œ±N1DûûŠiP°rˆŠŽÚ4A„(6ñ`r›È^'âßÊ_Pã#ÝèÍ›Y=-ïo¯ñ.ÁÅf³¯þÆ\2žoÅ©Tó,©!¼t4ÃGCÄ©4ˆ%&®[:ÖiçˆÒ¤£æˆÃÎP<ª!qËÒœ:`ZîN·Ý ŽÈKýÛ3ŒeOݼ1[À‚Š-}tææhi åôdÍ”©¯èç—Ws,>§º?PKôò³äPK‘®A+org/hsqldb/lib/tar/rb/TarReader.syntax.textmŽMKÃ@E÷ù—‚Ð “ÐmÀ…B·"Ø…³xM^š©ãL}y4ÑÚÿn¾Ôw}Îá>>ßooŸRèD0ÅGÒ:ÑÔÍ»+wñWçõgýê.ÀK„y™1¥.4ÈÇÍ`娬ãd dñþ3G&¼çnÇqµ5 ¾¦ScK;Ç&T¦^Ù+ÞBÉX:ûÊXô íÍÅj”ºYÚt*TüÃvìpbÀï¨að$ØàñûU;R{ê ¯b¹ÕñðuŠReñËf…¶¶E O"¡ýaál£\¢ÏÌ}.£oPKƒF^*ÚNPK‘®A.org/hsqldb/lib/tar/rb/TarReader.syntax_de.textMÁNÂ@†ï<Å„ÄD-áÚÄFŽ9h*‡¡;ÐÁe[g§P‹¼­â¶4)sÚ™ýÿïŸyûxYÎÞØá!ÊJxÝ ™4•LrÿmÍ:Þ¡ÀÍiz†“þÖg€Ïô•F‘a¡L ùylm«ÁüŒJQ‹ÚΕv°¬Èeº¡D©·`Rk ð‡Ô‡öàà@ ‰$õÔ’žnã<é\j}³aþ_Öš9–.Õ5M^êF§%],¯#³_´&/i_9 ;a’ÁHäÉRÍÀ)5Ó]X9òû[¼ÕùÛñ Òæ¹Z\ÃB‰.òp P¼¶ÓuÓ|u}y5º¾ùåâø|”D¢®#RsZ:u~ü‹º¸¼Q//Aг õöâdt=~yy=b0Ð3Öe( g­F¦­gçQFwQ tëë ¨gÒ6Î[ÔXÂAgæµw)´žpâkè𹲮点l†÷Htc¡g–ÿæü³ÞÀób ­\ûqG! hwÛ4µEU2Þ.êiü0$wÒ žÌL—E#Í<ú‰×ßûþfÙÀü-ztTÀÐGà”œw…íÀ«¦µ<ãé¾êï«þÿ¸ë«=1¤§Î/PÒæÌU”_± .MÃÁ ×¦´"d%H‘g3KX+`¹!Õ Ì4^%=çÑøU’¶ˆ~b‰q^É_ësKÈÐwð[qbS 4½­+è'€$Þ¹†,ôÄuò[KÐhNÌŒJª€)©m™Y§óN~”¨äL’$éqW$Uáü _ùä¹vy€À$àç>V±ÂTœ@Ì×L_ûSúÈMN^ F¢meÙBSÑ3ªÏÇúÁQ^8Ý4¤-åÃð9›G< 4-¢tÈQÒC‚ø7§bï„󽈻{6xþêÁϽa|ôPSL’J—±Ùß«³ÀË ^¤´’ßDzc¦'>6éw¿þ±k qÅŠ†Ûcv‡.2ÌL~»?x‡¼"æ+²uä7‰ÛT5ôà†fø{º$JŠ_Þ;G¥Ú{MË'ª0Z{"MO6õ]€Òø<¤íë:-¦ÃˆÑ+rºòåG`.ݶµˆrS÷©Ôñp¯²ºìtê¹¾+*‘OK*–§J  O(×"p«xœÏIŠÖYa¹PâšÐþÍoX-¤BÏNVW¬#:œ´fnê…¾…ž/˜êÜR¯·/8$;b‘‰‡ÁUô`‘h™„cŽÖ»]¹ñ¾¯æµáîBoZ‘®6סäǽœºá`ˆÕ­Gžsþ°¨ n’h —sªSš2§aÙh(Ó‘ÿ ¹®aYOr8AÞR»GÂôþ Ä[–É_©’õ’»" Ü£ˆÊtÝÒ«vKŸÿÄYÒù÷ŽŒ Š»¯Ê(ô<–ÒÂ#rØ fö™ÂR þ(hS(|jk9´hmNX±C‰0듚‰ô²à …ù Þ)ñŸ:¥1ý(b"h^^ØÇLÀ§ ‘“È`§Š=ßM=é™:i °Êö^ÊpyJµÍðæ¡‰^º;S“’ÌðÕ›òüf6ó3Q…yXk±¬a«ôêùÓÃÔ¼Œ†Ò½¤íRî´ÚFhôÜ·PRdŠÇ†9_¾è–C,¨œ€6aIÀOذ×D‚)Šå¥I%NsvgL.¾bÆ;CûΣ=VÔ"Æ@}Ä)‘Á@%ZЉÌj"´LêH°~åI›øé*Á/ØÉä³dºê I ˜_ÈÑ ß#¯†|À}ƒpYdÖËD¬Vp©KÉNùÔk<"Ó@|ÀrS¦hv }Ô!l(qp$º»ë KÇ„íEÖ"f^ªí‘êÄŸAs¾T–‘•*…ùÌñN¼|©¼]xs|=èê"Ã;a׊W î¦d8ˆ´NñŽYW"® WùûÙð Kf˜i\öÕ‚¥BÔÅnÔ ärÞà´ Qh9#\”åùŽeþœüŒïI$¼Â©ÔñiY&9£õ‚V¸{»æ[&Ié“§ÃÆžf—ó0MǸÑÅÁ×:Î9x`¡e3ˆžg.â.¾Êm“ôÀ:½Y3Ʋ؆±Æa ÎÆ\&ùzõ b”ì>äõMË ò½V„ýÏuw*ô(¶`™0_¶Öô­ö·†îʸ#gᎂ[XwäYŒ¼fâ¶ãÿ'y/kO¶ä°Ýû _J¶—þWo}mC=¹°ìH¶DŽpÃËfm‰ë@ËÉr^ç€CØd0,.ø1Fôur—à®8¼´8 ÂkÔc0Àc€PƒIýX~¦HhçÕ÷Ï*.xXñÁ-sCÖœ¸*$\ðÝõlj?ýEÒ¼­Ii®1ïÃf$܈ʹ]æîwFÃQñÒ£ËÝMè•Xü; ›c×›µ¥ã~ãºÕ寛xŸˆê\ì©ë5÷À¨’Bº®L>8ÌŠ)+ÃÙÕȽ ”ìI°Ô‘Û}ô`!„ ö«2ÿH’÷®äm0€½Ê-w•Q,7òÔ£ýe·¬Øü•ÀWÕú1o_RëGüUó¢½V˜¿¯Ù(b)£¿0{2ìžog¸Cd³Í–·³šÊÖØgBín8_ÚTŸý±}Þ‹ÚFÄúøsm;bDq8ÄŠo)ž/£,Ì,1+¾Š»QQ¢í*ØÆ%šÍ][m“x±ý†Àþ}CJm÷ò+{?É*Àð@Lå³`óëòJÓÅ[›r ÊàrVß·A™*…{žôÜùöR%ŠúKY[ÂiÚL¤/Æ!ÊßcFvȈ½\Ƨ˜A|§*À»Ed²ÍrÊ´Ù"ûç§$÷¯H>{‹¥Fõ!›ØD‘kÅxÉÞ|é‡;"O2û%Ü &YŸ©÷ˆàíçõI,»¥>q2×F¥;û›m7i¹ÄÓ ãd=ßËB¦™ÌUºØìùÛyc'íèÆÉŠ>è‚ÃøEèXöï':;rK¨Çë•ׄጥ-½† ÆtNf„ÑKŠ\?J:m|ž©cã{Bÿˆ@¨À—¨•PJÖ 4›h¾¡ØyÎ]ôüéPK}qêgˆ³­©±ã[VD›öd Qá¼*iYüÓ$~M%‰µÔcé+ÁQåc¾mÉŠŽá¿<_ÇÐ4¾oŠñ-ƒ¸'”(97ÑqoÇw$þ$L‡ðšÀy ñ ÎSpZ Ä”@ñ-é>ïF¸›Ò}f¤{Bº³äþ ýè±M¥Z´ÌYBœCÅ¥}ÆTÚØÀÞ¢àHb}© ÐÎúJϪD'±=D›@|rûtý hú*J oRî ÈiÄP~´<‰}^Å)Ê8ykDÐë£ÊeÏa[|Þ°”=5¿äRßCú'©Åx/Ñ¢ ï«KñQʪÀ]’ÁƒfDõ@öyš’ ]¾ìñئ@KôþIð°)œ~ ˜#R~ÒݼF=¢/(Ìi‰9ŽžÝ€dÀInˆòŒkþú]ËKeHîÅÈ룙ðó(Ý )ÙâØ£t«§h*Å6ÅÎ×b9€KUíke=bñ*è·PAIHdÒIs×—TÒ£ò­qlõôž~Ââžg0Øç'èÑçè*qBïï쎴¬üGä‰wRµ_Â%‰|9qÃ*ŠxLÞÌÝ>qgÿ‚~EôË/\‰aŸ>Ht-’™Ì+ŠY’ÌQŸ™ G’Gù*\CRp£c/ÞèÄãcpÿVàÆãìcŒÌ¶í|‚t¶-৪tõ!Uoä³È«7ä»áoPK á{D€_ PK7A0org/hsqldb/navigator/RowSetNavigatorClient.classUkse~Þì&›¤[”K¥5D© ¤I¡R”VPJÕÔ–"A+V±ÛdÛ.¤IÜÝU¼#âý~gøÂQZ­3ÖÏúô«ãpñœw7iÀT;v¦ç½={ÎyÎû¼'¿üõÀN|ÅZ<Áìe“Ѱ/B;òBš‡Ø 1êa6ûÙ<Âf˜’y,ŒQ<Ž^lFÙdÙ ³É5ÀÄXã˜à™Õ€ƒ8¥ežg“¼W`oE^–xöDl8Ü(Ê8¬áˆ†£Qs²äNí3Fó¦ÀŠááþƒÆa£#oÆ;GšY·K 1[¶m³àŽ9¦+ Ò´7j8æÎ|1{(c=IŸ]ÏE¨Û*Xîv%Ñö€ÚSÌÑ®šHó*•è/ÚãÎùÜhGÁ8lnÑîØ[<’1ÝÝ•uWZ¢3®‘=4`”dv•„5Ja—á+õÒå/W&Ò œh㕯¯£”겤Ç#,Д¨jœQòËmµÔh@!Ûœ,&úŠ‘ËqÄ’ ѱô²Ôñ>Öð‰ŽOqJ ¹¦N÷ÑP­½†Ó:>ÃçÉÅ< /]µ‹SÁd¹èêÒƒÕˆtŽ|ØjÁ<êÊçL2k5ÇŠ¶ye;´õûž¢CꮉeÚ6Åée+ Ûå‚kMšþrS"]s=×¶ ã]m5[{}x%zHA 7žˆ1F’ê78øMÿ-qùdŒ\ºàåO]kõ ‘(féeMöM•LbÕ<\«]—7;øˆ’ ³oï› ‰…`õ»ÇšE< ‚Ì~ ·™WO±ÌyæEßÃÝ®~ø:Ñk‘y‹tf8ÔcKf®ßrÜ®aÙz%·þba\®O `ÑË}•ÀÞ‘šè“=Õ1GJ&^ë<ãíÎwØ¿{½™êà°Fúè'`Q¿žÔÉ÷µ5¢šr\s’åbÛÆT¶X¢v‘Lü³é:[D­ôk¹–~ÊU´p[ÿQÓc›?&å~w²hÕŒÍ=ùDò¦¡\hFmôQ-„ ÐØ(Q±¡^ëða%(Ò˜–°ÔE§JƧ¡%WM#œŒ{¦VÍ 2¤lQ›ÔøY´$/BiRS3ˆfÈ4 WŹËÐTº Ü"³\&BA ›4t A9ÿ‰RG«¡TR$™š£à•oÅfµ‚rTh sØX{¦‚Ø‚­>b¹ïG“ˆÎ¯}5^°ŸpÍv ñ–ð@ÿ¡/_û é~nä –&çW3«T 9éÛㄲLÜ@‹mèòÃ4ùWYŠŸ—]ó=®ýÉϤ»z{ BîÄvr3%ËlZèN–úÑC©Lr? êHM‰vயz^ï®#’Ì –%g°¼âhç¢Pôcæ£üp›c§qz#Ý<%ôŠ!å|Ì+-/›hÉ«O¤IlêùjCP¢K´êÅ=ä] ÷ Ê›JÍâ:–#ß;9K—Á£§Ie{ÜÛ”rŒ§Ú/bå,šÈWHŽ¿Ï+1 ¥õ„øqÜ+_œÀ}ôŸFŸuåÂÏ`sŠ]΢%€ªû5Ò}ç65Õ>ƒë9J‹*Ä,b!È@¿ÎŠ p :ÅYEœû«ìŽùìF˜Ý*f¯áY™…«3­Â]ó¹kµÜµÅqßQ{•ûIâ¢ÑbºRäÒ¹2÷"rÜÎE‰ÏâóåáY؛ŽzùÍa­×:·çë¬Ô‹ûÄoóÉ5B¹„q ë)¿u2¿eÕJ²È*½,Íoƹ¾‘sai³XÄ@’(ÜÿïáoPKµ°›O¿ PK7A;org/hsqldb/navigator/RowSetNavigatorData$DataIterator.classSßOÓPþnÛÑmtcâDAÄ©SÛ"Ôð¤1&ó¥5c"{ñŽÝtÅÒb{ÆÿÄW_|Ñ“¡‰þþQÆs»†H²&÷œ{z¾ïüêéï??XƒW‰«U”ÑR·kU×+¸¶7MÜ2á˜pôý$c`>Ô„Yû.ƒ»‘¤7ÈÞDýžóap™¤ÞfònKȧGö#.ù=bÝãP>`Xµ'§ùÎ £“ôC5 ¯x/ Ç0k;ÿF¡w”Â, l§»±Ë‡Ü‹xxÏz»bG¢¶%ùÎë'|ÿ9ïEÓðlÌÐmg›ŠLÅ^2¹I™k™Pé:Iôv/¦îKvw[ÁÌTD‚g„+9Âïç”Ç,Ô,Ô1o¡Ši s¸hbÙ¬XXÅ4Ãú¤Í·•ð¥HÕ ë”éDZH;Ï2A•5N7ËÐ:+ÑI{ÒZ¨u9žX³ûßÁYøA EÛSCm h4ÔHÈ*Ó©c†¼ º]&„NzÆ]>s@s¡ƒzÎa¶ÖI3Ò;(|çÑ,|ëBùZîw±à¾A7^Qw6B‰”¾v3i'H~‰®ôUŠ+Eˆ9³¦Œþ'˜Ægú—cb Zó¡ªäæ j-wÒ9*zº:)ZM@Ë#(ßâÙ´+X:¦iã^+_ Ÿ‘Ž~ÆÛÀ_PK³Ñ'n·PK7A.org/hsqldb/navigator/RowSetNavigatorData.classX |[UÿNr“Û¦·ëڮ뺶lƒÁÒ$]Gìźncm7Ú±1¸¬¹íî–&!±!>Ð)*‚ ¨t ¢õ²ÁÚ­¼ÝE|+¾PAQQ‘Y¨ÿïÜ››dMY¡¿ö<¿ó½_·O¼ußCDÔ,.ñÐ&úv1m¤GyxŒ‡ïððÝb:BGyõ=Vóê >û>?à퓼ú!¯žRéG*£óæ'|üS•~æ¡JõÏ=ô ư‰~éÁöWLói~ÍÛßãö· ‡ÛßÑïùì>ûC1ý‘þÄÛgùs*ýÙC³é/Œ÷ù"ú«‡þF/ðõßyxÑC/Ñ?T2Tz™—¯0ÆW=ôOzIý‹·ÿfÀÿðð:ÿå‹×yx†oß(¡cô?FøöiÀá›ôV1†Q\m!J„ƒžæùN°.\¼ró òPT"Š…‡‡ÞjXÑã¼*å³I¼*]1Ò‰rUTx¨ST‰)LT©bª*ªU1M¶2” Sz"”Š%° F£z¢5J&õ$XÒûâ©=BÛ"º )[¶´íí 5EBÑÞ¦uÛvèݩłJ»Ó‰„M­ëéIê)A"ˆ³m¡¤¾"ëÞÙe\§®”‰BÖ¤‹Y[,ÑÛ´=yY$¼­©Ë<²²ËÒzbϪÝñD°.ðüü[<¨Øe$ ànEÒ}ÑÖX: Êd—Ñè-½½ ½7”iq‘ Êdþ)ËŽÓ‚b÷…Œh0Öw š–˃ÁgMò`îDìòöPXL$é”iÚÐuâÚe„åíŒ\ c[S[,Ú{ž¾gM(¹Ý„t/1¢Fj™ jo!Õ4l¤´ÆÂdAA€1jêŠëÝFÑJeÞ—v¥BÝ;ANT:A*¦c!hþÄæèž1.=á«hh—Ñ˾ÕÔ»¼KOudöxT”Œ%R«Ó‘TÎËu‰°Gœd¯/ˆJ?˜wBR]xÑ wEŒn]rç …Ã‚¦z Ø—¯Ý¸S0]j-n€³¸Óñ°ôœ†BÆÁYœ-áédJéi_p’Mêà׆-‰'b|oú¤oœ—]ÕmâBx%ôˆŽÈƒè^&âêÆÊ, mK">XÅdá<½zªÕŒ[AUÞÂxK³@ROÞ†ãAÔ¡ïf“u%Šä€•˜Ðûb»8Àm8;Év%ö0¡‡ x0Oû'#ƨƒÑx:Œ"3õ„`Ï<=™Ž¤š:åÔ®§BLXªß³jw·g‡Oª¢T/O,õÚÂ4Ö¥S ‰MQ§z×֜ҋCÂ9ÞqC!“r-wp¥M/oy÷eóW$qµÈˆ2X¶$˜Bj·×¸REŒ£KmÌ\È'S¶‡’9äáŽXªq 2Éq³L<Ù4ñÊt<ÂɆˆ’J}Ê”©@Ù!#¼p,‰ž›ˆ¥ã¦b½á ªº¤;M!U'¥‹j=HÏ«DÒôØ…ñœØ(P"’Ì møok(ê6R0í$=šL'ôìA±,-}2 ÔîX_<”Ð¥Œ¡_€#”Ì¢%ÝY4ŠÓµm¡‹5ÚÊCˆ¶iÔMa¤jMÔÓ¥š8‰‡b¦F:¯fQ¯&NÆ@=¼:…vj´ƒÀyù˜’äb¶FêÓÄ© Rÿ¶uI£(ÅTqš&æ€ÝO÷iÂKŸ×D}Z£ÒUšðÑNUø5õƒs1—Oš41ùx€ONÍÐXVl&¢‰ùâ ¾: è8WnУ*hb¡8K£Ó'4º†®RÅÙšX$`žÉÇëPKÄRM,£KUqŽ&–‹>E×kt 3> Æés`œnãb…hUÅJM¬«5q.ݧŠ5Ú–™šX+ÎÓD›h×D‡X‡ Ñè£tµFwÓešX/Î×èJ¬hˆîÕè&ºVšè4qبÑ!:¬Ñ=¸›Ä…]ÇfÜNãÚ,è̉ñìÜ–Œ †øP:»:Àðq1‚c¢ˆÍž(b>ë'­ÒsÍ㊱Ÿï0cû S‰ ù5¸ÎNÆ‚fž(äðÐ̸°©¾>–4̇¥‰ü=—›¼^u&ÈÉ-iwuaƤÌ&¼öôòÊêäj¼m…d5󺶠¦ßöÀIÙÒʤ&+jU@íA–ËôŒÇVK"ÚÃ- cÓÜBÉ)ŸAOŒû! õ8÷œ&„µMÐYË@[àâtc(’6еœÎÖNðíÔöôDÆ^Å#,•€ÙŒ>ÝÚžî æ<ïBáˆöæaì´À3¾´xÕ^…,ÌóÈ“`ÏJ£§G7{œB‰8XsÕˆÉâ/܇Óýy¬O!¸k^ŠêÚƒ±8Ä|™½¯C…ü; 82’26tdÛÃY–«×ZÙÈ£ «b扺¨.½jwJ‡#…ó¢ Õ–wöĹÎOÛ’[JS|ØÄW‹3,˜ØÖ{ƒãPäñ_JV)B,·ÉLûììÕe㺶  QªC‰îí²´üíâllXŒ‰¼`¾7ç|ÿ!=Éäl›íPwQi58íˆEÍvKв‚=ÖÄ>>‚̦'‹v¼o³ ~ÊÙi´ ¶çŽßåŽéOÍfW7c¿©pìç [ƒ)ù4‹6Ò&t!iTÃñ*¼œßcÍ[åùdî›ä­“œuëM’œQš1:¸U’{4ErF˃± qº ÔXÕιÜwˆ„ïr ’Óç$å€|"š´@H!'æǃúƒäò’{T_`ˆŠ©˜÷ž~š„©d© ^;Iãm?Uómé MòÝOe›oò •ã¨âˆ<ªÜ|ˆ¦ RÕÉA £Ÿ”Q:‹œ*¥UÚ¥Òå$TÚ=Š›œ#ŽD}¹dzÅ´Ò1Ó'ÃôM³Ya¯°Þ­·ÞùǾ;HÕ‡h^Ö@<Æ0}ˆjF_Ír[IŽQš–eí½Ð/®®´µÞU²Öë}¾ƒä:Hu¬Šƒätb¨÷·C4#ÃÔûìgK¬gsÌW3P­…`æxL†œ„6ZÐû首-gAšYG¨Ž¥šuB3±Dolá¸Ô±*:™ò;—o3&eë p¤ò#TÊ“ß?D§lªêM÷c.n~„f·óx*nOÛ”%)ê±þ}Ø¢Ue¹iq9=^1ç0y¶”³—>b”Jqfê¸Áµ®jpÁW¥>?¨5´ù@¯6ö±ñÀ61˜/†VÝ[ ³7p”ª¤,‡ÉÿðÛ6@•|ð 5vø‡inc›®\SË0_cë°•ÜR®…9:lÊÌÊVi ¬Â‡i^æ4WÃù$]›ÏBƳå³N6DŽ7]7qP|fX –úݾÚCtú]Ö=>9¬ûÍì˜W0ƒ7K7b)êo'—ØomšY€‡¶ÞzÙÝÍÏ‘º9ÜœU–‹œø ôº1Ç D!/ø¬ÍIf™ AÎè'¦3‘zD¯JŽIËU `‹'ëY¹õÌ;,ÈÈw“­ªv˜‰¯[òL“aÛ4‘’c¤z%,¤™š”ð `¤ÁÂ9ë·QçR^˜¹Þg36ɺv(®n¦[ †ÿéa‚nÅßé6 ( ÖÙ[;زì­g ÓÙNâUý0-rßiNö÷#% Ñ’„¥È Ë…¦sÜ40úl~ZàX‘GûvºÃb¾Ö ¨2ŽóC´ÜŒ’ý–$_¢;-ÀyVHM÷S k§‹L7‚ÖÑò"· ú2}Åz…¯¸0¯ç€]à!'¯¤8ÍÇNoÈo«(UÊ-TU¥¤”ðÅW¥°©ó£Oæ ©‘³j„šá5Ǥ Ø´çcÏœ×ÿ “Ôd“T£¬ /Ñ–R‰õWm«€€™Ÿk3¿Ú4@­4@hÎeFQCq°f`ô¹|ŒO-óô5å£8,Â|¾Ï¹ïj¯©“aB´H1©ìd*‹ÜHËÖµ¿ÆÝÈ9l˜Öº` ³r/P«TT»wG Æ=Dç-Rji¡E®×” ûmË~¼Ü£7›\ߘÏõ RߢzèS¥¯c¡9ËÅ• ï2Ú¾ñŽUÔ"Ýe£|ÊRÑ­PÑn[E'ç«È„lôNT5ç8Uå#±­|õ ôÕ”Õ×t: ÷Mú–%œ7Sd¶²T5C´›¢Ìóe\³½Ÿóbàz1‹¡@ã0u(`Á弫±}`ô)™rLú¤ŒP‰¤<cõ1íwÛÉû±gm¶I:–Š“è©?¥ñ¨Y–Ö(£Ïg¨6²v@¶ŸÊ÷:î8Fëj”®ÑÇ|u\åªóUQIÊ›T*$/µ2"g²øûé€ÅËõVHîà@߇N¶Ö,EEÀ³î@m¿YäœËêkï  .›Xå{ÑZg‚*,º;À4ƒÈë×LÊìG£¯ä37…ŠŠ´*Ǩ²hÕï•Uàüº×î¼ÌÆrºs)+¾ÍQ]óQr)wAþÑ—œY­{È9BQv ºt-çX帴~šŠiýQÔ:ô§ëe½]¿_6]Ct~6ãÚ ¨Š•3d34Ÿãsýœ—ÖÝl9t–Ÿ"rŒPµXÎé¶´X¼Ç#¸…Jx·t€Ü{£÷Sçf_Ý!êÊ+Ű¡`Q†é¾œ>Α­jþçlN3ÏWUVÑu>t'HÔ>HèåyêÀ=`רu‡ íw·Q£éª:€o,]Û—0¢v)D@ŠÁõ<³›œÕ«Ä4¬´‘ç5%Ó™¦ä!zØñZ2œc@±ÚÅ€9Iÿ7Ë{=b#ž"ÑâÌ ¾î%G¦9¸Hz† N|4n&ú?PK©qxý>— PK7A4org/hsqldb/navigator/RowSetNavigatorDataChange.classRËRÂ@œU$>Qñý¾†‹©òš#jU,K,rZÈ€±â.îný4~€e9» "r2‡tM§w¦§³ï¯opìz°ÇÀS˜"×È`Ò/ÝRÝBSM^úuÄ @õµì^I˜D 9=ã¾Þ1˜«cS*ÍRÈcÑø‘øÇˆŠø‚'ÂU¤üò<Ž]p+þhn6ìæ/¶ŠZ“»pT9&ÄÚ°Æ<·Q7ôkÑøÈ‹ ) ÓÇt7 ö=õ¼“´¸‘ÊN$ë—_µ]¥ÿ—,v¦½E‘E•ïxó L€} 9ºW œ‚¼Co€Ó0ãpv€s0ïp aÉá2©ß uË®³ë#ÌÆ`Æ&l pÛᎭ>PKkØ–%PK7A:org/hsqldb/navigator/RowSetNavigatorDataChangeMemory.classUëSWÿ-Ù°$YÞMµ­À´j±¶*` ‚X)Ò‡›äѰ‹»kßöýþè·Ž_œÎðN%:uÆú©ÎôOr´í9»›B:µ2›û8çwÏý×åÏ¿~» `~ b´aˆ‡ã †ƒ1›AFy{’·¯óꔂ1žÇLð|ZÁd!¼Á›)Î07x oñβLã!ÉCŠÁé f2Ä2 ÎñUçù–¬‚yº„˜_°—N—Æ„-¡{Ø0gãsÖ…l:×µ‹™YÍ6̸«>QØh¶Ö?§é³bDÌæR¯ÙÊ\¤„„`*gšB·Oɳ‹ìî,µ›Í$ã£fZ˜"=lè³ÇÅÒ1ÍšÑÈŽb ËÊD¬¥ôȘ+%@u_FÏØ¯HØ­h?Mwöi⢘"+4‹V¾(‹•Ya9,iO<ëhOŽÍŒíÜ(ëbÑv´g$ÔŽÙZê<‘×’Y:JŠÃG3&ûSKgû]7É„„¦h{)’Õðc­4ŽäÑöéásÚE-ž%i|4yN¤lÂo\‡ï7²¹yÃHGˆ²ÿ’™±‰ÌÐßMãRÆà;GsöBÎNè¶0g´”è]V.kÇO9Óˆ°5æâ„+8¸˜ KAw™BKKHT¾#¡?ÅuBOhNUké´¸æhyÜ8ø3s[ެÄéRŒ½´ ¬ø8½Ó‰Ê!oJºMĬª[¸œjúRY§ÈTt ®b'v¨hGLÂö'©b>EÃ.DUtcŸŠ ld;1A¹¬[ë† ›¥Íø©È±ªj:¡â"¹ˆ%—ñ®‚+*ÞÃû >Pñ!>Rð±ŠOpUŧøLÅç<|KÅ—èQ𕊯ñŠoøŠïñƒ„}OÓèìZ§Šç𼄆rºvÿ?›ä´cƒ +1Z,Bªòhâ W?EýkJ¨§¾8­esâÈRBO‹Eî D{¥trÇ Êiz-¾…äãs³Lì'q"ítü„í† ã|nûmˆŸÕº„Ñ¡õ—­—TdÔ´¾Ž©ÀÒƒ¤ó4…K vÀÓ¹æ b* êô¥Äø@ÿ½·Ô,­%PašñAÉ=áÎm­Ð1¶R7Gͪµ]ÑÄzÙbUŒoEÔy0,˰÷ VìTB¤ŒùͤUoåWàIR‘(Õ=¯eÍ{Ø4µ¥ ;“¥Håt71Ñé? ê¤K÷spª[©Š»kÂ5ħÝtv9lÜè"~6þ˜[× kÂ5yl¤Tåé ^Jz‚‘à}´v”“–V|Ý¡p(â¿{8´»[ÈauOG ‘ yé!ªè7$=@ÍŠ•„׊Y¦Ê4w–gÑï+fËõÿD×}(ò È%ù¨ã|4“íVºæ½'8V,Nuê´MI·°åWlu«ÿPKÄ'ÄiÐ' PK7A3org/hsqldb/navigator/RowSetNavigatorDataTable.classµX |›Wu?Ç’üYòç&vl×$ͳ‘dÉM›R§Mê8N£ÔVNSš´´ŠõÙùRYR%9qJ¡…–×6ÞOgƒ­ÝÀІ-Ù"§æÑÁ€„ǃmŒmÀ¶¶0 …òÞRÌÿÜïZ–b›Âò³î9÷ÞsÏëžsîùò…_}ô "ºŠG}dÓ½t˜þÞKÿ@_ìË>úGúŠ`_•µìŸû}þU¦_÷‚äßdíß}ôô Yû¦»ßì[²ñŸ‚ý— ÿ-Ó'{R°§{J°§{Z°o ömÁ¾#Øw úßõaøž¨ø}ž‘áYYû—~è¨óœ`OÊð”L$ÃeøI5ý”~&\~.'¾_M¿ ÿõÒÿÑó‚]0è—/ô‚~ESÝÈ„SÌÕ\AÏ``— n<Í•`dž6p•L½2õÉP-ÇLÁjÀUˆ¿Æ— ¶HÖWs-×ɰDTyF†g}\Ï ^ ²q¹0h’¡Y„‹‘Ü"2«V™.•a™¬-—á ™ºeX.ÇVˆ¹Ï ¶Rv—ÉÆ*™®Ì+ÃÖŠBWŠ ë ö`2²V6k§’Lõ½©ÌPÇáì=‰ø¡Ž~gu“';”°˜‹·÷ÉÚÖXÖ‚l.•Ášb‚´•ÉÚÙ\ÇnZÉ\¿P¼ÊÎY™&L«ŠO$cGí!YïØ›:Ñ4 ÷ Œd28U¦ÅÅ'°‚ýÚáØhŸ5œÊǼ;5’Ì1qDäd»©¬ÇôSÝQ;kCéîTbd8©éªíl×ÐPÆ‚\PkgûíátÂ*Z[’-]ÙËŰz°÷Hìh¬#Kuì:tÄÈA“êœ5œ†™±ìdÜÝç¸Ï;³“Y`j*¶Bu¨ððŽ$šÌ—ÊÄ­Ìôd(“Ië‰aÇ5Vy½´s›™6úË]_ñÚž+s¼?m ؃ö@,'ÛýLîîTúÕôçbw÷ÅÒJ_AƒÛ )<Ìt׋‘0ç ÷[¹èô\]Tš¼žFL~  ^š|o0)'+Wc QÁ®¡aTQ“7òµ&%hØä—òu&wÒ1”U“7ñõ&%)eÒq:fò è^^%Ãýô€I¯–á52<(ÃCô<{©ê&½’îÝ^gÒ£ôa“7Ó¸É[èÏMz/|£É]ÐŽ·r·ÉÛ¸ÇäíÜcðM&ïà±`§É7Ó; î5¹’8Ê»PúJ3ÝäݼÅ©hu@!Ñ Þkr?ï3ùÞoÒçùVT“_F0éCЋ“áÏèa“2”5éŒhøAèJiºÇäÛÄeø IGÅ·ó&}D,y9ßið]&ÇøÉ7Ø2yP,âÃ&Û|Ää»9!‡Múcú““ ¯~J.ëóô“Þ!Øçè³&§’2 韑iŽqWˆ'E·WÀ|”"á…&”~äý ¥G 1LË~ãcŠü+÷ !sfór„¬˜/˜Ñʨ8Bù‹ì*\!Vj·áeíNemgµ&S:¿‰9]K0Týˆ4TÒ¤ôÚÃvn¿Ó}!%ÎÓ]Q|º2Ès˜«Å¬Î[ÕT¦Ú¨ª&ul¦¡ÃSR£Ö1GG¹§S½Á_^ÐÀÂZX¯UõHD¨ú¥>C ¬eîné$oiI*^,èÖY¾–.L±E`µå5–9®ûÖR§–6›RX·Ïô›å Q²³ö½PmÓ¼Î\šv¢ÙŸŸN½I¨_•9z)¼¶£Ws½Ý±ÃVÜ©‚—>í-gUúò—]ÌK}¬h}˜ÖÍk½´Aò¤—Æ„}¨£+“‰¿%gˇ0€/ÕJdp›=8h9×:ÿl #roš/I ª”j+ß"–m™R/ú_ÜKét—’JÙé/9xv°ðïð/(†"ÏT]%z§R¬[g¸¦Â–ïD„éêô…ˆSÕGJ‡'ôNõI¡–"r™ÒZï/­¾e»GÄüÓ3 UâV¼´( ¨Ù¾ãi陚Û‘“ÅÙÚ4­‰Ãm·?2a™ ì½$LwIJ‡ñý‡ªÖ ïè†s‰ô¶Ö` Z;úB D}¿ç÷O·ž)ŸÚ7-òÍ2—wjðEž;>óÚ­ñ/HÈ’Ôp:–±°M%Ž—isYsöý‘÷Ð7ÃöÒGè·ã¦˜áƒªû°<Èq¹ý´’“MDu´XÚS`, §‚è0Iþ¡ÉR½—‚hVD·¥à¨ž×ó{5DS¤à+5|•Z¯UÁWkø Ôð!WCt¦_ejÈC.¬~(Øv–8Ø–§Š`è ¹òä¶M'O•27òT%Ð;A¾Iú¦—B“tµ‹‚·¡v÷]p¸ï4εQ;]£YT‘4è„x_=š}¿Ž£õ¡óÔ ­zœ6~’®Å_ï82 ˆíh[(ü8½4Ü+·´죳Ù{Éݸè&%€é}ô~-`ì=€;ÀjɹO.¥µ¯sS4RpN£öϰCX94IVBS£ä`Í9~J¥ “„Ô_Óßh¢8UªÀŒŠ ÌÈ$ít‘`í“tsI(,€°w ±5A}ˆ× Š"Áv…™'iw%O=5+AW”È>:F\§+a¼W¸Úú–O‡¬,É|’ö0MÒ^õ!ýú™¦e‚Îj6ëunµ´©Ê\ °& Cµ}ãS?Äì–uTd>žÎé7b¥p§Sp÷?±Q=z·âøªbØrNÐË:=Í•D'¨!Üà.ä°ÚÅSð•P‰´0¹^ Ô™)ä¯gúMx«A×âê¦ wfM]&ÓG jõÈ6`»£ †ÛÇ·*LJ ïÀFwƒÏ)ŽO=]*žõµJH}¬Àò9,z?ÌQîôpg¥°¾]®Ëa:=IwH]p$Ý/’:ð9UHšÚš°Cór¹‘;=¨$ÎS¾±ª¡ /b³ 5tW§»ÙíT¸ë<YШŽÜ©’.R#Æú ªX|ªÐÜ©åm*•70FëâQi.âS–“G$}½´" [‹ñ±÷wôi-ìmˆvD*Þ óVAÆC6AÖéÖ1ô‚àçÚ¼¬õª-nY¹x|ê¹¥cT½Ô!Ç#à-}Í¢)’Ÿ:~ZT88>õ£ÝÈ[e^$/_ %Õ¸ EuØø }V«·Q÷7-®DRÕ#(xK¯:O÷ɇ* ிúÈu‘*xÑD*Ó9:¯yd´?w;Í‚¼nƒçá3´~ƒ|Jf§f·RUûÐRÁÅVíU…Ñ’…å…çSÉ‹ ¹ôµ;quAIû\Á†v-•~ZgKÙRÏç2çU#ùc}ö UÃIõL—œužú5PK†Šp DP!PK‰®Aorg/hsqldb/package.htmlEŽA‚0E÷œbÒ´(,ÔDcÐ…ËÐ[Ó½½E$÷þ{¶¾_šª°‡ëéYÇ}`è}õ÷M©½5@aô Ÿ‘™XçeKaJ4”Jk³e\¼#ャžä5+L#I©þZ2Ñ~ü`Jp^;bG?3`ÙW³Q&̶fÓµf³ÿPKm#ï ”ÅPK9Aorg/hsqldb/persist/PKPK7A5org/hsqldb/persist/Cache$CachedObjectComparator.classuSKoÓ@þ6v²y8¡šÚÒ Í£ÔAˆ`å>H„£¸T›d•¤;Ä©ÜápâÀ5‰‡à€8ó›bœ8Uh‰¥Ý™ùæ±ßάýùþÀ-ìÄÅj kë (¸êo×|xƒãGŽ#Ï0oTªÅG¥£ý¢Y;*FÉ4X™!i8¶ë Û;Ös©PU0̌ë³\+Wú8cÐÆ¸Y~\ò±C¢á<튞¬t%CänÇîx÷”lîA5œ&¡Ü•ÞȯfË>΃$†Íìþ±x!tKØ-½R?– ïÎy$ç35=Ñxr º5Q·(3Ún{Tá?Eün9vkOžL‰ØÕ0‹æ`Xuz-½í>³šu½+{nÇõtC4Ú²9 ×PÀ–†›ØÖ°„mAŸ–³1™i ï*<§ÇžæÐʶ-{†%\Wº4³lÿ%huêúù‘–ôªŽ;lþ.CŠL“¢%ÍÎK9„©)™i¤±Cï(JãAEq$H×ü)#Ivj¾@öÌ„=K‹ºHz˜5•< ¤¥ g$ãù¯`yõ3B1úÒX bæ(&D2’_:õK\ ü¯‰_µ•ÿ„ÐûQöÞðT k/úíÂO(ß 2lù •ä4_Vë±7oÁ•>R¤½WûPCƒaÙË´'Á×Ò‹¿ÁÔXì>ý-4öå€Ó,IÿÌpá "ƒ€ò ®L\ÛwÇO)}b²>J’ã:6‘ù PKˆ!¨/ÉPK7Aorg/hsqldb/persist/Cache.class•W |SgÿÍMo’ÞBÚR ´)–Ò–:Dd¼´0RZ:)kqÈmzi!Éro¡EÝÜ„ùœNŨ“1´¾PPšŽá`‚n8uS|Í÷ûý˜oÙdtç|÷6IKW\¿žïûÎ9ßyçÜ”àý|øƒ28àºó™áaí2øƒ3øSïgðÑøqˆq08ÌàAÆa ?Æ»ón€wŸ`ðIfùkû4ƒÏ08Ê@R?Ëàs|<Æ»ã¼û<ßøK9Áî²iÞ 1xȇ“x˜w§ØÓ/2ó#œæÃúpîóàK¼žepŽÁ—|ŃÇá€IÅ ‰<á¢ö¸]ߥ×Çôx7¥,w¯êݶŸhµÃJu Fa6G¸k-zÁ·,~df@Šp3Èg 2ð–D’ÃMÄTYVŸÅŒ^áSE&4Q¨ŠIš˜LV ¿(Òp'ÌÑõ3*w¥Šª9ëf’,jco¿ßÀÕZ‹|ˆÔÆÕ`8î}&(—‚z_¶«Ï NØj—È+¾HNϯûŠÆéñzö¹“SÔÙŒÜ 0™ž¦}¯9‘ØÑ›dëšØ\ç¦Ó¥ò6‡3cÑï`K67 ÏI5¥wv—TìvšOø›”•"½««5µÁØ™ØeŒ7¼RTSÇÜñäáx ]OQܼ$uÄtÖ<Ê»¢+ú¢@éh¦#£•Ý>ÌŽ»e(_=º¹Þè³dþ:È‹¸§ldRRDç¯>ÃÃr0L¢ößhXz4æ4ÿÒÜŒÚ]@JÎדI#N¾×ŽÇpÊîKxl„'¤6LHmš€êá´Nzkdt®·šXJÆASíY}-zœêœR53÷æÆ”7õ7+‡dTNÈ@Y¤Â¼1–è¤ï YœtJðNžÃV¶ylý9aC}â®§>úB¦H»<žr¥ Hk1O3¹Ò¼‘x[à¿-’¦rÕµSÞ/¢ÿº `Ðîn¸é&°+T“†Èw)CÈ ‚«Ý5eîœ}~È5Uò ª„×9øx-„FÜ…íC˜4ˆÉ¡Ð øE!ï Š‰TÒ"ñSQÊÄɃ˜zöß6t;öÒ¿Bÿb„Ôƒ¨C*"CiR‘M'P|T«°;ryâ¦u%‘§O?B& ¡,”Æ ZËC3Ó¨X^™wnqŒ8*+CíħlíÄ´VB\S9ÿQø+eÊ1VAy¥—@ã1€ˆ;zîqôÄêNb¦ÀB…TØÙÃ()Uö±q:mÿý˜Jš«FÈPìÒ˜5¾uu$ìeÔ˜†P½©N9‰Ùy`ûŠI NÁ;ž1É×%â,žB6%2¾7’EµPH̤W“'ëë—®²ÛÒ}IªsIáuÇr$ŠK(R‘$‰·g¼¬ [ì¥?4s×’“¡R¥®ÍNKÔ8œ]Äɺ¹–W2×éèÏij¹æ1”לÄe2ìóŽP¹ð¦¢u¯K ?™õm\—¹Å0æAQa±Q”ñ‹²F{3;èÄçe5Î¥±ÈÖ´¬¦â$‚yzžWOõX=³ø3ÌÖ#6ÐÙGüTܱ¥¡òr¿'–ÆÜe®å¤¥4½ÔÀy{W+ëÈÞ×-t—Q:ç ÀÞQŠü ZP ¸æ—º+9¨¥êAxJó`G™Ò¾Øs–/ÔóU?K«P¶¦ñò¬`ôuŒžDè¢Jr¯Li+UàÚ2ÅN¯­|¾L¾£Uf¯.óœ@Áb/­eÞ3¿¢Ó‡(%•Cx…kùÀð‚PÅÈãq RžÂŠÁú¿‰à"^Æ5Bˆçq=O¬ *pà%T¨Ø=eÎj}ÏAÆdcbæº ð®“ÇýNÕnÈÖl ›kÚ[ÎÖH"T#ãqU5WúY“u³–\ô¬¯=Wwf`øèq©uuMÐÿ­rµ½˜·ú<Ö’dp#™û,”<ªúfv,ì#ûØÂHùA(ÇI›;Wrƒ™¬¤±Öü4^e/‹8’®r¦=„ëmÜbû“¼69%l¬Z¾•[©¤.•ÒXš-O„›,~}&N¡\´6¹–ŽÔ‚òLË9K³‘k©uª¤YÊkÛö zç%_V™Ê%xEY%7dTNuz-?Uoñ²4–ôã;2­ú^§Þu 7PÓ_Á½³xe«6•qõ«i4ÐÎ_›F£¹4VûÉ×FB¯!F Gƒ¤Û7˜%`ä2ݘ‘æ=µ'> úyN›UFIX—1­Š!dÌw9æ¡YŽ›Gà¸Ëá™N+óh91=æpÝ$çjM£´g Íâ(/PK‡íñŠ÷ ¡PK7A%org/hsqldb/persist/CachedObject.class•’ËnÓ@†ÿ!N㦡´´Ü/-åæ®,u[„Ty•(j%e5±δ®ÇÌŒ‰Ê[!v•àx(ÄñĈfxóÍ|.ÿ\~ü¼ø`Ï{x²§=<èÓYåÎ÷Œ‘ç[ïGÚäñÄ~,²q\‘±Êº8‘鄲ƒñ ¥nW Tö5iÃùhûX`µ®2éh/MÉÚD×¥¢áö;åœÜ\œ+†¶äŽœ62§#õ™fys¼ÕÖì³´­ ¢ý¦oWÙ74e÷i“‰,sʸ‰²¯ˆªaùÛÞàtNÑqc·¯ìŸØ7žÏàî=C–ÍŸÞ茵ÑM:Û:$YÌLFÑåã2zªt|¨§µ«jîêÈ|)í6;îNrÿQÂS“K½œT¨q<Òe>Òú´®|—ðEZ¨R¹—¼»Dglaã/W<@€®Àʉü$ã‚Ï6žÅ?š?!;M ¯Ö¾ôfˆEÏ>–<­¾Úêe\ó\Áªçõ¶n­åz˸éy«Õ·yZû¸çy¿å<ôÜÀfËGì(ÄÿxÌëufó…o_qå‹WøPKÑ·?¹§ PK7Aorg/hsqldb/persist/Crypto.classÅWÛsUÿmºéI¶[(–Ë¥HÒ”U•Ц½j*õ¶MÉÒ46ÛÒâý~}uFßñ…qFh…QŸf|ò/²~çd“lb*ÕÇNÏùÎùîç»mûÛwp_hxI ç1Æ0®¡aìä†)L‹í9q}^œRâ4#¶ÄváE q‰á2Ã,ÃK /3¼¢¡¯2¼¦¡ ¦›cH3d¸†+ÈŠ-'6« W1/8ò [AË<_Q°oüª¹d.ig¥èÚF©ÈÓFЧîŽñ•݆„íEwÄ*渣 «ž¿Œ&žU¨°l± )×áæB±•äë1­'¬‚åžRp<"õy³5ˆÇ*d‡6ƒ‰^P ŽØ® =åšéù ³8cÎå¹|]‘áš<8:Ôȹ,w“…bÅ!qÏË6|ø¡hS,½…ä§]Ÿ‚Ã5~‚OCšŸáié¹™M$“´¢ÉjæˆÌ er˜LMòëc"M‘MÅ):›`(•9*µdRÖ R¥F¤ Êý‚Ž\†EK¸® ïéìË:öãQЦŽÜÛë:à Ž7𦎨8[ì¯Ó8i§Ó¹i3“!G—Ó¼èZ6eæ-oãå#J<½èXîŠÇ>œÏÚtÍ-T¨Pë“…%3oeÈKÏfʦ{ÉÊpÇÇ×YÍí”ÛÛ¤²}É‘x·1`e.‚Û{:ÞÇI{ëxf¦1Þû«,É|žgÍ|"o§çEæß_eLålÇM,^¹â{¥^äæ±}¨ã#|Ìð‰ŽOñ™ŽÏqÆs½\0ž!j×o¤Çv²F®t-Ÿ™3ŠÜ)Y%בtÔ¤§æ®ò´[‡*W ‚Àl‹oCŒHy–2w–¸cº6ÑZ"¢£{}æóÖœ§tÄ.,qÇ*¶çør9c'V\>ì8&uGw“îˆ GvP‡5mr”\³¦þˆ6S°Á¤Ú\+n ­ŠÁ'KŽ×+ÅC:Öí‹wÛ1FÅ® ÈËðHETš›É9öu1øÈ¢Oòj^Éì@ó)×ÔIáÅFCmC–±ÏX3¯Àxp,ý¹'ç†ÿMDtP>å…Ëq¹3ÒÀ]iÄÚÝœBó¸66ÅÈ”Ô^›÷Ôô5ÞGŸq H‹f"ÄMB y0âÁ¨„ M„~Úã€rŸ$…ìï±U(ýk ª±{h¹Ô£ÆW¡ÞF06pZ| ­ß"X»Pì„TÚ‚wnB׈¤ý ½HmÁé:‘ô ýûAu›2Ö£®aË/ÿäH¯Rñ¾F»„ß`«„ß¡C»Ø&á¯xˆ"1@ø íëÀ Ãa£òû†Ç׉÷/„Ž\þéëÂs?Mxtô<ôŽÑz’ÖSTOãx9©'u-ûE )Ãý·ü½‡ÎK‚¢¯bû­ X\Æ‹¾ï²–:¼x0ÂÉ!1ÔDs¨¢¹šë{è’šµUtoNó œô4‰V"ÓžÏ{nÖU ûwïéQ»è¶ãæ`«Ès«LùƒŽäqX¶F‡„–p=Žb§çV'‚áË垢õ ­gÉÅá¦.†*.ÖÎÿ‹‹a$0⹘A@¶óÑ~êªØvQWŨ­wOÄï`ÏäÀèU0¨ö¨µôÔò Á½ôâ­ƨCÊV©þÚN3œž¦š;GõF,£8ãY4©T1dÄûwÝAß͉ƨHì$™¨š ‘×{¡¡}Õ²ØýIxvþ{h¡z§*?'Jýð'PKåhØ3´ PK7A-org/hsqldb/persist/DataFileBlockManager.class}T]Se~v³›d¤­.)JµÀªV‹bÛB©¡Ðbƒ øÕÍæmزdawÓi½Ñ áô¦3^Tn:ÎàEg˜Ñ€?Äá0Åsv_¨Ž™ÉùxÏyŸsÎsòæÏç¿ýàªIïĨ.­“E>ËýŒRQgäŒw{4ͱbº¨qsOähE-ž­¨ïwÛ ½[9@·òËŠ¢ä鈞ƒl»´BºCR°+é¼€Q™Q -r·’ýU†GðÁqX9çnˆ1>%o–,°SÉÊT~2k…ÈSI_¢¤ÞìÃG(p:“Ò»±MKæ»<ÿ^7%PÆÛ‰7–Øã–)‘“¡3PO`P!XzβÌ4•Iq÷©‰~sfÌØó1o?¨Ê“ÿø(E+{å^êTåoz*&¨q5FìŒè›Ì4I_>þPKR¾-è#ÉPK7A&org/hsqldb/persist/DataFileCache.class¥{ \T×õð9wÞð†á!‹€" c…D îF‰(ˆ—¨MÌÈå¥G½øž–KÐ_i>Ïpñ/žÁ/2Η¼øeüŠ¡ñäWy¯eáY|–úºŠßðà7½°¿ÅÓßæâ;ü.c~aŸãâû\<ÏŬÕÞàú!?âî¹ø‰Š?å¥_ôÂfü¼äÁŸ«ø þ’!ÅůUü¶ãüÏo™›—½ø;|…·ÿ=Óÿný‘‹?©øg/„ð/YøWüÏý[¯zð¼Ò?½ø/ü7üGÅÿòr¯ñðÿx„y;çT<ïÁ ¬ß7˜ 7yð ^¤D§@.w]¡x„›ÀD†*T/Ü&<ªÈ$e¯nY<£©"Û wŠ)ªÈñÂÝ"Wy^¸Wäs1•ÌBp«Ð+ŠÄ4†˜îÅb†*J<¢”ûeÄ­˜ÉE9Ïø¸˜ÅÅeDš˜ÍÅ.*x…¹™41g+y¬*KøE€ ®æ¢Æ}Ñüóˆù$0Që—3È ¼€yZ˜%‰+¹UÇc‹yv w—rkËyb+³Ä*q•*V3@½W4ˆ5ÑH'@¬å™&¸Úƒ70äº,Ñ,Ös±÷mñ`qªx®•‹\´q±Éƒ]LÄ5¼×fnµ{ű‹­Œ¼Íƒ{3 y»W\+vòÄNÖàŸ/¼,ösÑÍEl~‘AR1ÂÅ9Uô"ˆÎ BIK$ÚU»7v ;´§¶;¼§¶)Ü­×wtè±Ør„œ¦–ú«w7··¯«olÛ¾¶›²×Dzcñ`o|[°»_wÑ!AÍ­ß¶¶‘Ç„5¶¹m{óƦ6s!xäØK/羂 Êþºk¹ë¦[Ú6^½{më¦-;v·7ï\‹'Gš6¯]»{S[;TC(p€6ol\{­5W€É«ÚÀ¥ÜÚ¼‘ š·4×·Ø‹ñœÁÛÕõ†îHÇþB•S }z4ŽÅkƒñ Fµ{ƒ]z”Ä“î Ç›Ûú;;õh{ø&–E.ß!~c°GGÈoÙ<¬íövÕ¶Ç£áÞ.²'ر¿¿/åa¤=Á5 44šÃ„“ÙéZ{P︓öé$ìÖH(ÜÖC¤—Ž`Ç^gß"£½#Ø­[ó›õ`(ÒÛ}˜È—ýÐæÈ¡MÁPˆÈ"ª˜£p°»‰$²)BÛòíñ`4nÑt„ŒדÜöc„ÜÜÛ¡N,‰êk"ý½qw”‡æ8¡±p¤V"ôõÇ›{ãz´3ØÁ|eÐT[?áU¤…§©„œžà–NXî´c8vÅ’ËM)ò0‚?&7{C‘ÃÀ+æ2ŸÉ,j´É)±È!’D¶Õm8שï–ÒC˜‘n ¸œ¥²—¤}È hVZ‚êÛmBPØÂ˜vi2ýñpwmG¤·£?%µ×J­e n†ãz u Ç¥‰7k"<<ó…K’_Á _EV¦µ¹±–[µˆ\ ?^ÆÝŒ{XU@hžœä&±")”xhŠFzXFªˆR†@*¢±ÍÁCóÈ&çÔä©4Ää妱>¯°~’+XÉcR³ë'C¹'oŸ7;½OI !S(Kh×êQ]æ ʱT;F¶ì%d§½|=Ûƒ²Ð ¬Ñ^ÿÍ Óà2“Ԩǃán ¨a .Õ0§h8 § \1a´£v”²Í¤°§a%V©‚–ò‹~*0 a5·ª¹u9Î'Ÿ?žýÓöâ †s°‚ì+•Þ†þpwHj⸑ÂÁ|Î'4qoÖЃ™t\æAC/fj˜…tGºI7‹·ªâM¼MܪÁ_áoš¸ h˜¯j8•‹*ÄÛ™ã|*Äíæm5s¹’‹Bf9O,á"‡–ËäÌ›dZ®‰GX 5âC*H7Š¢4"Ó{éäMMcÔÅiÀ;Épõ†wàÌáBò~ \Ã0KjâÃâ#ªø¨&#UбÜ×Ä'°IƒR4—8¿Lùªø$Û÷RM|б?͈y ÿkÓÓËJ;¦‰'Åg4ñY1`ñDñ¤¹ÍΞ˜´ã^Í«¤Ø'½>™ühxÞ|fÖQe/Byn2ªÄ²)ideM‡WÇ‚ÉdÉ´Qq‚Án!=‹Ï‘±ˆÏ§!ÉD*I;eíY‚t¯›=þ…¡!ÜŒ¦[Ëô$ÂÜK®íí ¼VCb˜QF4,Æ—¬“v8•|dÒA6êr¥Tý’Ù!>¥‰ÓlO‹g4ñqF_ÔÄ—Ä—5ññUU|MgÙ]»vQ°,0–›눆ûâ»;#Ñž IýYv3_ßÐÄ7Ù¿Åë}›‹ï°:º¹èábEñ]^û{â9M|ŸÇ:0D9–†íì›6‹ç5Ü&~@fÌš1̇rŽ£>º…{ú{|1Џ>M¼ ~H‘'ÖìíÄ}{tR­ô !_/Ží÷Å(âëŒò#:/¸ ¯ÑÄÅOTñSM¼Hôâ6$e߀[4ñ3ö0[ÅO4ñÛÐÏÅ/4Ü…;5 âJ™¶_’:Îf¼­³•2eRn4!çð+>2¿ÖÄo¤éù©ž/Ò÷E:}=z½ÿoéìbá$ vG(+ÔÄË$ ñ;ñŠ&~/þ a;5¼•E¶Û¸ÛÆä“ÿ(þ¤‰?‹¿¨â¯šøû…?¼ø»xUÿÐÄ?ù üKÊ>h±¢±1o/•i­C.à|Xèãò[<îëQzWç̹’OÖ8)ûDÇÏΕ“ü±Á]¦&{ƒ6òªKß›+ÒÞj’"“Œ`_Ÿt_5鲡1CfÂÁé{Ƽ¶¬˜¬@Ó_ 2ºõÞ®ø^„ÚÊæte&¤ ’Y59nU’P³”kSeÚûJsó®–Ô´mâmø°l¢ôh<ÌO=5éï_ŒfqŸ'üªI{56$î…Ö++ʳM€.Ê9#íÆ;ÜÛAÜ6Ž&&mÅcå¿^>”_Â- ý½’ºŒþ^ãé²$;‰vì dÿ“ÙO‰ì ¬™ø¦iŒïž$‰YæÓžqÈ$Ù’ã²:‘žåH}w·á¡Z"±¸aT†×Êæû4ËÙ¼äJ=ÐÆ™ü†=ÜŒq£v¸“Ó´ƒ/ý‹˜1m,ç®ÜÕÀõ„ HËäÕžÒD•N“áw³cÕ4¯R)oÛíÎ9ót4÷†tò÷þFÂ]Y%³ÐéãáxÉT¶è=}N´ŒJÂb2\$gÂ'´-Oö}Ž2y"ÚeÖk£Ó$3`ˆÙù0¿•CsÚ—ìXò¡ôÈ[Ü3ÓxÎ’íãák#Gƒ†ìX²l²B{R¦$†¹NdÒ×€i0¾ðQùú)·pW’¡Éhzo¬?ª·˜” ¹é f“Ÿ·\}òÛ”ô¢c„'¸C9b—›Î™<è]æ&Þ09#¹&‚öëz_¢ËÏþDÐÕ•“yéœÌÓ¦F—™}M·ìÝÚ—œï¦l±Atu ”òCé–äA>vòé5ò^¦¶jWU9ìj0¤´+~—ŸÔ÷RŒ’CËãFhE¨›a±ÿáo‘ê£Ñàa'tJ61!,gÒ?i¦÷ÚB7†Ô3Ë+PzÕ·=ïØ»<ùl&Í‘‰êÝÁ¾˜âehm¾…˜/þ´|Ȳ4ÕöÞÙ†ÑÛ¹CºS•Þßdß]ؘùÆQjëYÞ*–œYn+Å!§Ì®1ëFC‰§Ù¹“ʵIa+IzèuË –)I„‚XåštvÄæ²œgÓZ™œ…YðØó@á‡@jÃßáU@ø+ÿ¤þ¿ýSÿ?Žþ©ÿš£ÿ?ê¿î蟃ép>i~:\pôß þ›ŽþE˜ŽèÓ½n: GßÀeÔžŽŽq~ñ”ßÒ{Í: 5YgãYç˜u®Yç>×ùfªÙ/0ëB,’õ4s~º9^Œ3ä¯J°TÖeøRΗ£êF~•ýËL¼ÙfVHšçâ<‰W‰U²öc@ÖÕ²^N+×à|*k©·™ôÃ?hò 2Âï—ÿ4(;FÀ=~ÿIÈa>³9k.3›³ ÁT0𑰱˼#á!¨ôãTqá?!µq• Îà ө·ºîd“ØÏÐÓ$~`2ý%ÃP}‚i˜I[ÔøóçC­ q._ÉÍa¸b<îUƒ0¥” 5Ü®U%G!ÛžÝÏ+L£OAIÙ)XÀ„ªX8 Wº€Û£P‡P§ø õ,> ª2 ©pI¡â¡ðæá×NÁÒ3â2ÑÀ\Áj¬ñÃÊ™‹›Á;Â*u6±WÕ©®:OaÆœ!m­ÞaQ”_? &E£°aq¦«.«(SòüÀ£°.=©Z¡æ&ÂhEMáZõj©¤kéJ]–ØHy/\IëjÄPþÚSÐt¦0+Á^¡gÊ ÕÉŠ >h;Zˆ €x‰á«aa2\faæQ²o×0¬„i §‘Q7×e ’2G`}]ÆU°Hö§g2Ó_˜™Â”¸ÁHâ—RG-Ô©‚V¢vã ¨Tµ±¦øxnââRÆæ¶–ÚÙ‚]EÊl‚­þümdoƒPÝêÏ¿¶zv0c;«ó𫹋ÜÏÀ®.:poißÁÛ´Ÿ‚ëΜ 'y<->Ûáñ>YFÿ˜1õT¢ç d_„+Á­â"¤?@¯¼È?Y² `þ9(»wC–1ª8eX¢œƒ)%Y¯ƒ/wºÈv_„e™J`& šxõ®‹°€;‹$\]%ÕÅÖáUt8ÉiãSNbÆÊ’Š­ÑÒ ×*YZUŽ{”’O’Ûq’2Œ“}ý0ìV>b.X§º ”Mn›”awnËîÜc¨dð}iÍ©áÒÖ”Ö\=þBO*ÿ/f7ëÿÇêr`ö’µíÇý²6¬.djÍ *·MÀê›Ú÷½ óÉVã(F2œà‘Évã33Él®H1›%¸”¢'G­{(f ª$ÌÆl´&Iø¤4™šQ¸Á® =S(!ç\Qâ–¥ÊeªèKFa0•@I; w‰3ÔO«—1Ó”ŽôÐÄr"Ыɪ)Ÿ¥Î=ç3-†÷€Y¤§å«™Ê"žÍ[ # 'Å41NíÖ™ïÑBõ;Á; i†OVÊ\®$SåF×ÊTÀÒ6"¹*%у0›ì$,í$1–³ÑîÔy(Äè6ØCfÁõA"kì“õA8$kƒ‹à¾Õlµ­¶Ó'‹tºW™Ì½T©ÙõdÔûìˆ]ܰ#Áä›Ò*Sû•c®c-¶á† l.’6Lë)à‡¢1Õ²6h*q*^u$9‹$MDÎj›œ¦¡]žŒ`º©8IÆ)èæ% !:§ ÷ŒÄšCéuTÀ\Y›{õ*ÖS·ÁR). aVéh’JŸ•‰†!ë%F`Œ Ê=ýg!‡«aè“)…ýù†!*s#3Q1ñ¶g9‘•”ÔdI1ñ ×µVŸ!ÅÇYñÒ7\™Þ7$‚— Ž@ŒT½IÖ;á°¬yün:sÍãwKƒÉ…cÒ46ɚǹ>OÊÚ×4ÈšáÍŸ•»µ *®i uH«Qøë\;KF)ð*§ü¦ C¿Óp[ìN@ú5ÞŸùR(ƒR{?ÒÏ[äúˆk±É\?HfÀYòâÄú;NÂÁ’†à <*ñ!çn­v§ÚÜm&!Ð' kc7¸fn0·»Úb÷|á™ædÇ7¤Îü„•¸z¥1½(ëWèèµÅœꌲóйè‡ù¬³ÍçýìÍ©¾™6¹õYXNÕ>ã§á¶y¹Ì]Ù¼}n„r¼Ý ¯Ãð{úš¦Ö‘g¥‘zAÞÉèO{Fà®!82H— Ópw22OÞC“ÎÀ¢Ì.ñÿˆ}½i·ÇäðŠû>|î5b jîk!¹½Ó¯PTO3þpöL댑w໇á~{þ=” ¼×œÃ/Âûhn Z“GªÏ˜ùQþûmĆáÛÍa÷0<˜Xqrv>èì =¥ÏÃ&¦‹1©x$‰¼%PN£g!׹ćMTbêÁ€Ã>Ž;‰íØ }$Ø>Ê>¸ÎÄ|Ç ºˆWØb/ãµFÅ Ýd¹çᾋäzA±[Msé¡EUª×$´Q> Y¦+g¡¨X…¢‘Vn-/$‘<æ0ö¼ev¯8Ãô •°ˆ–[u²¶=C%{†lêoÄ6sëlùXB0ÆMø‡æÔ3D•‡êGrŽõ[K‡ácGfÀãäõo1C@é‘ÎCkJ»‹˜L¾µUX7ýüOÐ-ŸÍɸì#Ì<|Áº¡¹GaД«G8OŒ‹Sä¦ì,0k>é‚YOÚìå€ëMØŠrâëdÞˆ›m.o!Vø©§=!`… ŧêÙ°}Ôú´Á'¡ÇeFp«Ñ…cÒ1%®$®˜_üRM²¶¾Äx;n1I‰“#ÎùÈIðØ'ÔýäÆš³0­ÆÐµbÌÒ…Ê1»Í›»í^±û ›ÉgŽ™Á ŽV­#Jêœø- ¶Ú¸ÎÆ"[ÄèglA¿·ÅÀf^AIHÂÜ)ÌéæVÛp»¹ÕŸi#6¡‡lfi«HùÎÌ2ÊdÙŸ°= mØä*ã¸AÎb¥HÉ|àÈÇäY¦²ˆŽè“-³.“$651£’ )Õäa?\f›³à6"±®’õØ+ëÛàvYÜ]êÌ) L)žr²ä¥DÅkUÜa¤ [‘Œï4ÿ¸Éx°œYpãñ1Ú^æ.vŸ…Y… %ÕÅn“ƒb÷¤Y(¯)T$ ‚‚ÑXÏ&-²¶HvÓ¾‚È̱HVœÓe¦»,’ñÃ$ p˜ƒÒƼ“¦Öò=Ç]u…îÇ@g³<¹L-VŸeíy0žã5Åê( XF×Ý•’% *#§à”uòÍCŸ?J-óþb•ŽaÆ£AŒß‘ƒ.vKY-é+&—øédÒjà´€T©—²ÏÓŽ}2hò¡Ë2(™gÈBÈåïƒa:9]²ÖÈZ^¢Dt)s}<'kGyIƒkdMã²~ ]²6SÞ PÅz¹@ ¸>ßr‘p3, Ñ”ÔÒu Ï»|;%©!Ž€×ãnÓ¾ÚÌ+Û¼„¦JŽÐÇZFvZB(%”›–8o»xq…jf_™ÜÒA´&]Ê¥§§>•X{”ÛèϦ¦|¾‡Ï×ð•%ÙuÅ™0æS´ãú*Ú`>ÔËÚ Å üŸeê7ä)i5ȉ¹ ¹ë‰¨8R^6 g+=2 _DPËÔÐ(|IŽ!ä9‰@™£]«í»”ð5Xm\¦:0dÐN¤³<©Çâ+Oá–žOI'å²¶~Á¡Žæ˜ñ¿½ì(('üÒ²aø*å2_+­S •Ò²ƒBeL¶õ³ÔÆö;:/óSÍ ”rª@ò&ÆŠ)ú žù;ûd’1Y¯¢Ô–ëfi¦dmÝ‹TJX²ñÌl"“k$"×Ó‡D‚]vì¸ÙÔESB0žeZ¹qÖ9*èÊ÷õj×2¯fÊ’/ylÓȶËz)­<–ÉÚ * \œ]o53ì½6!w™_3„8PÂ7Pj‡Zß4nƾ)Æb@| éÛåè|g¾«ÉÅDò÷Æ’|BÚÉzhµí$ÄkÐJvRHD…IÆ+Ò'  w·”ÛÙLNÂsÃðýÅJ);G©ÊùÂŒì$.f'é/òðàG™¤ç¥Ÿ{θçü ±P‘¢/Vì,ér^ ŸÊÿ¡‘/ð gFW¢Ä \o@‘Bº]pV8ž˜˜ú6“ú«hŒuë7¨¯pŠs¿/`g’•ô¦T•ôrµÏ~Š@sÙ“ÎÓc?aÍò'¿ƒ¨Io'ü·ÕX_2¥)üÇFŠÈO—4ÒZ˜.rLÛw$>?q˜i¹õ$•Þ@ùb臇ˆ§EpŸ¬¹?(³ëûdý emßæZI}xÀÜ66©æ ñ²cÆ£³§…==çIs:nO˜Ó#íû¹Ño¯_`®Ï[‡áÖmˆ)&„pYs‡Òn_c-~cÚÅiû_Z âWÄMxs7§§ÙÏ»Îi›À·¦ÞdMß’vúkúmöôsš-µê¬ùèšxØtƒÈZMÞ–Žob¼f^õFœV²é¨32­¶›¿ö§ý2¬Ì} ºV¥Î•}¯“‹üÆŽM¿5"’¹”R¿˜Ùâ茹mòýì~xXæ÷“£j?"ë'àS²6xŸÊy¸ŸíµÅ¼„Þf+u¹é¨JÒò·¢äX e4Ý~ʧ4íZã™æíiÕã³Ôs;¾#Í´ß0 Áÿmœ^k^üùå_ @à4¼¼#0¿ã«U®o^™5 ¿ßÎùÝZL‡Ã?·øcR­•KÞi.Yez·cÉœqѦRó.¼ÛD«4}ÇTmŠ…6 JÂʧæ=“Àús üPK¤„XK¬GPK7A-org/hsqldb/persist/DataFileCacheSession.classVi{U~§I;Yn¡…((-n¤éEP0ˆm¡•@ZjÅP¦ÉM;0É”ÉtÜPqWÜ÷ân•´—>~ðwø3|¬çLÒ=rÎÜ{ß³½÷Ü{ó׿—° —}Ø‚/6c§Š]>¸Ðʢ̓{Yïæ•‹=>ìE”¿ÚYt°ØÇ¢“Å},ºŠÉ%NOOOó(Æb¿Š>T¢›}$îWÑãCzyæŠÃ^Á<èÃQhŒèS÷á:ìö!ɰ¤ýà5Ýc8î‡Ï¥=00èà X~d`³R1ìC#,FyMgÔI§T<¤ d»žÖí ‚¨iõ‡2'ŒD_h—fk}ZF†£Ç´a-dhéþP̶ôt¸¶[{§™ |lÛ©YZ*Csæ L“ ô2¢4fkñãíÚà~­ÏT›‚â¸af¤£¥f)pj»U<,pîx*X½8ZËn$¤Å˜&ÓxL·1AÉ5Ú©AÇñ„À“xJà žVñŒÀ³8+ðžx/ ¼Äâe¯°xç^cñ:ÞPP=¯âAieôŒŠÅ5C&ºšÛtCrØ7Þbƒ·Ñ¤`c¦ŠÁ-†É§µþ\¾çÞÁ» VÎÕ´À2Gr|¼'ð>>P°¾M#ÛDmÖ051™Éèfº¦«¹&©3ðCð±À„”ÍùÚ×wLÆmŸ|ŠÏ>Ç*Æ.0Q÷ IÅ—lDú+¯ñÀ·\Aõ\ ó!Ô\ I1bè}¡ˆ--Í6©}¼†Ùß:,Ó6õžÒK¬   M»d*ßYDªÇ6sS *K„‰|RZŠrZQãIä ñTð$-­…=°uC¿_Ús£u”Å ä¥(©¤ 9'f R:“¯ÓÌDO„Z'΄&hß:µD©v_]3Ú,);M¢Q¤´Q‡wBѰtfØrÒ–ÌòËinf‹bú)™/œ‡t‡D lh—–N˜©\n‘4m_R‹3 ×záôö:7J·g>UJ›ûÇÏ´ %“JˆD"{êKÌ94][(©B‡–rZY #ê,ê4Z_ÄúŒ«¨³HÆUW\$ÚÈÅAÍJS=NÏ:÷í’J£® ç¾]5ϵ´,Ó µ²¤»Tæt[  m$r(ºøÊ/ d7©ÖѸdF©Û2J¬(س¢¾ ÅÍt|Ȳ(õÃkˆ!„¯¾ „ÃQkm…D.ìmêIK¦ÌaÙjÈ”Cce¡ÃNŒ• ¥sq‹ã¹‹dm¡½sº›ªXs¥µÜÑœ»t Í™Er£h™9j;o]Iî´3Xx«äw-{~·c=Û[ø_Š¡ð›Ir+ÖÐi¬«Ÿ„teQ4îàÜØ6‹2ÈŠQGƒ?ÃÕ3 wýŠW”˜€š…'X—…7x ¾,üÁ²¦,¹ ^„È¢4¯—Ë=ô ,çáòr7ÎdQ¬@9/ŸÑ³XT²¨ÈEVpÂùÈgáq"PäÊB{éçq¹\“XEìoùZœÀ‚Tõ¸Ø£Ë;‰µY¬æv¶¹ˆëW¬§œ«ƒ® ÔÔ—+”m.þz\4yC¬ÇÍNc—pãoãÄÔVúߤ`;}«(Uqw# w̦u¦Ý¤-2¼i 7Ó‰œÀ-4¨øëYMa#ÍqM4ò³û)Šƒ×*öÙÌ‚œ™“Ô–ÂIuÌš5P‚.xéßX˜d-)‹0’ŽÎ%,àí¥Œuúù)KzÎóYF‰Cf3ù«›@}´n ΣŠ>üŽP{=1t+%pÛØôß9ئ`Žå#Ds·3Óã³Á¼(úÍëÿPK*åÔ(¸ PK7A'org/hsqldb/persist/DataFileDefrag.class­Y |[õ}ÿþt½'éÙÁvä bƒÃ‘Ȳ‡Ø!;ä$hâ¶ë³ôl+‘õ”')=iš¶´š¡Ç²°-;º ºX‰¡%eíèF»«ÛJwŸÝÑÝí ÷÷{ïÙ–d9dû,ŸÞÿúÝçÿï¼üæs/XGŸ¡„§üt<D?#ŸŸ•Ï™ ~?/³_Ï/ñEü’Š_áWðŒ,ž áKøÕÎbJAY`ÎÉ⼂éZðœÀ<—ñ•0^À?sÄ333!|/*øµ–ãk‚öu!ùë ^ á<-Ÿo¨ø 3„—ñMù–‚ßRñÛ!¬Äïˆ`¿ÆïáÛròû!þü,ÿPÅw„ó+A|dóãšý±|þ$È|þ4„?ß϶Éþ_Èç/Uü•Š¿Vñ7!ü-¾§àïü½Š˜…TEžI¿¯âŸÄ^ÿ¬â_dý¯òù·0þÿ¡à¢ÝEŠÿ ±þÿÂãdùªHý£0^Ãë²¼(Ú¿!Ÿ7ŲÞ$ “‡¼òñ…ÉO>&Å€:¥’*»A•BL†Â²ÐdÖ¢FZ"¤§TºB5ùgÜB¢Y>-*-•£HZi™JW²> ÑU´\¡6…Ú K,=—6'7¥RF¡°½T$Ä“¦5Þ3Q8Möä «){vV@%rEÃÓSF?k0–ÉÛÇÆ cÒV‚¿P4ó‡WURÉfF{†yÿ~½˜š`,-­õ»s›>iš“ûôƒzOVÏ3˜•É3LÐ2Íb!ÉÌ Þ‘&­ Ö¨^`ŒH%õÍî¶ È žš`˜këé±ÙelÃô‹¸)=ËÀ” 4äÍŒ¨–4Íý¥<ášZ6›¥Ñ¬Áê'riã0c6dr™âFB2VW ·–`¡æ÷|ƒfš…Rò–)gÄd»a¸¨§öéù]:Ë!䀥«9÷ìÈý/›¦”g#6ˆ-çN±#aé!+ãnï2g… ´VIn÷wŽlUè…:Z¡Ðµ ]ÇŽÞr8eä‹3Ç´Æb%m¬ÓöP#«”Ú¿)›µéðÁ•õíÒ¹W¡ë5Çà ²XœhxïÑðA<¨áCø°B7h´Ç4•Ï{ñ>¡A«(Æ:o6Æ,}¼ÃµWǨ1žÉêÔ(N]uÓj…ÖhÔCkÙ^ÝHëž‘­ÞhtÝL¸¢Ö ÝBë4ê¥õ ݪÑmÔÇѨŸ6(t»FéBû%#„5¤;5<„h´‰Ëj½=PÊdÓ†¥Ñ mf·¯É‡4ÚBw)t·F÷PBÃAp2ÝP'ކ%pÓ;7‰‡3“yq¦Ç:$<·jt/Ž)”Ôhˆ¶i8Œ#Çm‹/)Šz)SŠë´ƒ†Ú­Ñ}xŸF÷ÓÛ5Ú#Ÿ½4¢Ð;4z'½K£Ÿ wk¤ ¾bgf_gM7 j”¢4¡e^½]–yHØp%˜ßåú²}lȘ4­#[,Ë´¸Ø¤Ïé¬Fºcu‡Y*v˜c“6¯-ã@)cé¾1;eŒº˜¦ëð"W¯Â˜aÍ)#`ã´C±š°F”ÑhíW(«Ñ¤qÄ͘=‰ísÁ-~åIy¥PA£"•4:Hì™Ãt„SB£è=½—ØXïÇÃ}@¬Ò˜µË†{bfúAzH£Ñ€F¦£œJ£ =Dá¸u+NG^ÏXc¦ÕÁVc´ãŸaÇM–¡‹øFCô1>N+ô >IŸb F(°ö¥\‘‘€}”ÓèÓô‹äPÄ/9>?AŸQèqž '¹x9§bÖ“ =¥ÑgÅ(+.Q²£sªTxttŸ‘â ÝV“÷ðt“eéGœÞ\q<ÌÊ–æ]‡Õg4rE®GÏu@¬+{k§yˆã(_*Îõ!BGTN?˜×[  "s®æu¸Ù58=«CKRUMºn çr8ÛΆfÈšããó\^¯$íCîÑEíhßl9x·dcp¨Äê·Š†‹0©é9ÝF¬ê»Ã•gýÕµv¸Oã’^Q¸WÄövÖ¶¿*Ÿ25_!ó€a÷&nžÞqÖ2Ñ™¬Ž~‡ºÓzŽä%š¯vó ™Í2 ½õl¶c1øŠÞóÿo,šk·ÆÊÞy∂FÖ˜äõ d¢mn‡­¨†Ô»·êù glsU‰…çJ‘ÜNb‰½âäæLÁf”– s.a6½kz>o䏸®® ¶Ü†Ã´Õ¢élñÕ ¶°¿~ÆTvî$ܯªwv/rZ@~o¢®e»gn¸\ºõ³¤Qîi={—e;L6^ìry³ì‹·½ØÈ@"!Ôü…#¹Ôïpè87XU<çLµD.gXƒY½PDZ[àasóîúÙu¿BŸ«.v‹ArÞ圡`ûyˆm™‚¶”ISüÙÂ÷ |"—²ìà;£\g¹cYƒ‚DTÏ@¦ÈJŽ&ûÏ—lVmj e_ÌÑ9•5%]¢ ®kbäÝÅLÖ±‡Sïûb#[/Ë7õâ®5ºDàj\¹1Ó-Œa#«ç FzWFŒ"usØ8hX†{¯“É:÷§˜²•)Ö[Pçû£·­o4¶8u°.–¨Ï÷R ¡P{ѱ½Ý$EËé£s¼FØêãakqEñá#…¹ÖÜZ— 3 ·U·`öÅêA]fÉ Xv#çÛmò2z¼ý¸+å³™”.ÉX“V—Àj®z«ØýK‚ºSÞ+AÇGÜ÷8iØÔ÷bÝJMìÒ-»¡-µæïƒÙ+ÀU˜pOìrt¬±îµ„åS&ôÂ6ã0ó I9៳ØÕ òž˜Œ!ìòÖÓéݹ‚iE;k9»ÝVÆ>¶[³ß2ì´Œ]–±jc]ª‰ó¶³c “wP8 }’н0?$‚Ž ÛЕÐýÕE÷’°ìæ5P“àg T<:ÝÛ:–ÉqC´ Å-Jz–}gŸ:+á4öûôlÉpnÉó7Á[ß:jsVÅÍ—Ó¥h°¤^Sb8’œ}Lìà3¯r[õ…¨¶–µÔÁ²ßý¼Êr^µxCÀZQä¿í¿ñKÏùålüJ¶G~æÚ#?¦í‘ßÓöÈOi{ä'*ü;Ž‚ð1žÝ/|<®ŠŸÅŸ‡gÏ9x§à‹wMÁïžB Þ}ÊÔøê)Ÿuÿföq<ìð™L°ðž¢dü,ügj—¡9ó_Cñî2–|WL¡)8àíõ˲7ñG§±±;â/£ù«héS¢JKÕS¸ÞAŽÈºµOªÓXFXl ®8ñZƒGýtfæÅKq%o„šFÏ㪠,ýò=+Ž{Ï¡m í®0e\}qY=kX¹žËXÑ|-ʸÎ8ë§pÃÄ™ÀÊ=‹C6¯:‡Cò¶ügÑùeÕëΦ÷!î.ŽM¡«Fϱ:zvÄeÖݧ2ZSÄU‡…ô4VÎ ìlÒ°«ˆ+SóFÐzÎb­#[Û¶ÇIÁ^Чq“®]Ó¸Ù –Å¥r·œD8â÷Go¯?âWÜÑoõs"þiÜæÁœTΤ'ÄvðöDÆz•H ¢œÆ[âÀ:ñØKˆÕÈÝ/r«Íšo?ó‚Xð¯ Ý—ì˜qÈŸ¿Ïßõ"î<9 sd61*û} SÆf›Ä–®o°«îb Þâà»{L;c‹oÇç=]e$æâck}oOã^ òÍ>ÔŸl¢¯GÙDCÜÕ·ªV/»«p==´ÿo=pËÿ^høÂ³P<ýž{=ÛpäÙ+HÚã÷p§=þÐÙ÷ç²×ÛâmÅžWxFò'j|‚¿Çpõ ×£€‚O*ø”‚G|ćý?‚¿ñuܹò ¬!ºˆõ U^EçE¬¥7p7Ñm¯Â¿d@Ác´ª³¨àÓC Nðï1ùÍ  áyzNmáà"Ü8|5Ÿ™->ÐùTêÙ¦Šr“ôÞÎvY²±­ý4ººÚܤóE}NÒ5K”¶­c×ù¢œ‘ÛŽz8¿ó윖ð¾‰æE´’UãÇñ³avž'Zç±^Æö2v uq–¿m›“ø;§1Ì÷%óßÕ'ÙÔµ>\/éÝ^Æng¸¯ÆÇ÷³›ºæÒ¹ùíu\ÞµºŒ=}¡hhÜÿOâ¨ÌF˜‘\{4­*³°9º4f—­9Þ­9Ó ÇôõV5¤¯WÏÌ®!6úÖ:°jÕ81§FÔ7ß]y"M#íÔÙ7D¬1¯LùÑã”Ù=lÙ9±¸Ö:ÚöÏk»¶FÀ‰*mke›UkÂÛŽ„Y‘Ìi Fý‘pÏRìcj3Xc[Z¶Ø¼Ù^-¢yNqã¡oKã‘}9heLÛq4Ìõ\¹*9|£þgæÂîv„g¸ÑíPTÁ“ N*xJÁ>ÿÏÁÉó¹×éªá¡e±œ^Cãk¥Ÿg>&•äßð“nz4ñ(ù+¡ØôŒóŸ]8…Ÿr/pï—{Åñ¸ËÒÀŽíÝh÷._{ÄwûºÛÝ$òsÉ—¤‘<Úõ³>¦t3ןÍ2ªvUÿþ—ŸÕþ€Ä˜¿:B"d–mˆÂQ/Ã?îûâœ5n€Qøœ¶MñˆTš7q›†ØWr}‘Ü$ÚÉÀ!Fú.í¢·!úcPKiÜéØ ÿPK7A/org/hsqldb/persist/HsqlDatabaseProperties.classZ |SUÖ¿÷f»M$ÚR6J—°8"VQ¶•.H LQ‰iòZ"iR’”EÇqÔÑq›qÁ]GqAe3ÑQaÔqö}_}wåûŸ——¼ûÒ ÌÇOß{ÿsϽ÷ÜsÎ=÷œ›¾þÁs/0ÆfŠ×ÊØ›üs’ÞË$¿ÕË.æ·Ñãör~¿“_ðð»$ßJÍÛèq7u¸ÇËïå÷•áq¿—?À$ø—Á¦Ö/zñxDòG%ßNŸIþ¸äOç“’ï ÒS’?-ù3’ï$´KòÝ’ï‘|¯äÏJž¥áöyù ßOc>çá<üy/«áiø¼ü‘ú½D/Iþ2 ö ‘_•ü0Ð_öð×h€§èñMÿ:µ½áá_ñ²Fþ&=¾*ù×$ÿ:}$¶oÐ ß,çßâß–ü;Ôç»Dùžäß÷òð7èñCzü¨œÿ˜ÿ„?õ²kùψösá züBò_ÒûWôø1üÚÃãáoyÙ þ["þNòßKþÉÿHrÿ‰û³‡ÿ…”ÿ&ñÿµœÿÌðwþÉÿéeSùÛ’ÿKòÓDÿ‘ü¿’¿#ù»’¿GýRÿ÷I o{ù´Äc‚y÷²õBÐù…Ó#\ànðxÙF!éQF/ü åRøˆc˜Ã¥!…ß+B#ÁþUˆ‘1Ê#* £¨$\%Åh,HT“Ôÿ‘bŒc¥'Åx)&PÃIRL”b’“¥8YŠSˆvª§I1ÅÁFÌŸ+E 6UŠZ)ꤨ—¢AŠ Ó¤˜.Å )fJqº“â )fIq¦³¥8KŠF)Ζâ)æHq®çIÁæI1_ŠR,”¢IŠER,–b‰ÍRœ/ÅR)Z¤h•¢Äh—b™H±\Š›Ë˜ƒ±—Aê”b…+ÌÉ ÃUœU¯M¯G»C}zfm2ŠÄÃét(îÓÓœi-—†7„§ÅÉÞi™T,Ñ{6gÃ$éL8‘YŽè ‰èét¬;®ŸîVcœ¶Ü£[’©Þi¹¦ÅcÝÓ–„Ók;ô ŽÇ“ ÄãË™µœñÕœèèêèlj -[Þ¾¬iyg¨Í›1°/jni*4‘sæë¸ ÅF™;Bmí¡Öö…Í‹š›r6Ž®PÏ :CmóZá4P©«uÞùíËéÝÜFo¹¼ie3ñÓ¢Ë8;5½9ÑûBñdd]O,®‡ú“ñx(¥Ãþz:ÔŸJöë©Ìf)`¯)&k_xS(²6œ %S¡ á”ñ¥ûãáÍ¡tì2]Š !µéh±D$Ôެè‡]LÚ=•Ž%РIHéáh2ßlQú’ÑXOLBI&%ެխ®#S‰L¬OõF0GFOmDZþT<ëÑ7ÅÒ™´qæ%Jd ×ÅÐá¨ÞˆgBi Ù–b &6øÖê‘uÆ¢áÍ#‰Ò«gB‘d| /aì)BœURC:“L…{ueIq ¶µ‘sÛÄÖ6gÉw]§C¯Ý¦Ðéµ™hrcBŠÜ?'ôæþLŽ jn‘2›û1šn®%GƒÌbQ=%E7žì†záí¦3›,%g6…âúzkQ"ÉDO<É„Rp²Ä1[Ãýýñd¯…ñ4p…‰1™±vè5‡|U6Ó}HKJ‡"“0¨å7¹–Trcº˜F.f²¼)3aD$C5°œÕE‡â±¾XÆ’’äH+.ç/HÛS£¥ ¬. ÓVU)9ò~™ˆ% ³ëH…LÅÎœŽ¤b°JO2ÕVD®êÇJé¸D_ØiZÓ§÷¡ÉTˆf¶oLÅ2:–‰giD!†úbñx *ókG6ÖÒûNyÕÆÃ)x$­C „ç¨àé1¶V/kÑ"ɾþpJôeØÒOt=5EòÆ©²‘JàN¹3&H›såIæQdÎß;¹l´<:]4\&‰% ˜$øu$œ % tA$ãvK¥3&Ó@"¶~@Ï3Ì~:p0ÚšD oèÍ{òpÂÑäy_"œ0 é͉ Œíži'ô¥ÓE„ÍE„;¡¿—NÖK£ÝˆN¤ãˆd¡L&–WF¼Øúˆ†™Í¡bö:“O&zŸ‰†iŠÞކÒýá"H |tY;ËÜœv"ì–o ØZÌÍ9„Û¢áЭHf(ŽWZ´äÆœ#ö©À³AODôˆ'#MJ¬7‘Léy 3©ùËLL>”ÿÞ€o¯ù' É¥»ÃiU¡žÉ M2d/NïÖ¦ŽŽy‹›HqýýÉT&m%7èY343šŠѹ ÅÀÃ:2“8Ý;)yÄ¥(5 œKÄ2çÂv5%'žºMi=Ó¦oÌÓ–åNÛ™ÕQC Îx25ÀjTÀéð們ËU"âààk‹µúzÄ:òf=³by‹:âi69úé Mg¦-´¸ ©ÆàÐ[‘ÖS õžX¢0òæ…F ¬¬™ZœÛP†ç8E*béý`Xz~2‰3ÛÃK71…ŽkKçÔ ›Cà"= ç”š/m‹Qzaî,XEpa.(BsͰ›R©dª%wÜ Æ6Ä(˜¿yµžJÒÖ@ïù­…¤ÃYÓLš ~*¹Øî´RnQ*‡(ÝrDÔ5(!H,oèL ÀwxŽ;ÇeM¥f¨MOYÄ’nÙŒÂg5#¬JÙf3<%ŒÓgýP æ!ëXô\!œXýç¬4ª¦äËc镹ÄlÆlXõœHÜð}èC‘åcß`ßÄ6§~AêlžúD‚¯ö‰¤è÷‰õüzlŸHñ¨O¤EãâY8ÁZŸà×úıÑÇ~ÃÞòˆM>±™ßà—‰Ë=â>±E\áŸÄ(<$®ôñ•|•‡9bŸ§8ºfgÏò‰O‰« ª•gúɆ„¾±ÁH|âÓãÝ>~5¿:œœœî7“5n·XK²%8>~ 1|Žæô‘±Ç'>O†ÛBT›þ@,Žôv…âVqœ.دD7gÆóñq»OÜ!îôˆ/øÄ]b+Ø(dNì CŸp®mânŸ¸GÜ›ËQ‚%r¸Ìt¿O< D,õ‰‡È+ÐÉÉYúÄvq;†Vê¿J<æ‹G¡ã [ŠõIQÀ¢™[Ù'žà}âI±ƒ";ÄŸšzÄWî ’‚Ÿòñ G"SYº¾ö‰§Å3±AØ'v TZ3ÞúÄnšÂirêô‰=b/¶T±Ï±™ô7 OËÿ1gèÁäÏŠ,ÔÌ»=b¢…b'=2@‰bÓ¦ˆÞŸÁVó‰A±ß¶ì‚Pƒâ9Ÿ8@j}ž_ËÙIKÛ@_·žZd¸5¿Šî *‡:EOádô[ÅAz¼Àéþ`”mš{¾E{Þ9#xfÐÚZ¥nB8γC>ñ¢xÉǾžmÛ5©J›i9éå>ö[öV!ë e=>ñ%ñr!¥ æSš€Å]HsÌd(hO†Ì„'Hɯ§á^±ˆJ4² 3Å Z)–·¹£½aöì3Îj˜QȃJH#¾ZHƒÇMƒ%RA…Û'‹#³Vµ5¼¸ü2 Ó ¦®–öK;¬Pj¨Ã—7Í[ZÐÞÚÚÜÙIW:y–¢ÒÉÝÚÔÚ¾¼«PÒK—´ù®^O¨ ¨E©Y‚EuŒíT°J `QiSi£E#TÑé½DÃ@?¤Í7CËœà2'8´Ì –(s‚EeN°¸Ì —9Áâ2'X\æ‹Ëœ ZæTä$RbR9,Uã‹k³2–ªŒƒ¥*có.#Xt·ÌÝmÐ6ø²ålǹà½àiÜÊDþÒ*h»´*E¹ 1ï‚Ç»©$ÖeÃÔãµ¥Ê dCÓƒÓ0—t\Ð21Ï1±)Ñ‹ž³qJJ2ävéy>†~Ä eúæ¥å-Æmeá¶k8xkÑmÙxÈ5¬Qò~Nzëb 3æoÔb Wi|Ö$°_žZéÖÌŠÖ݈¹/ 54lwœLRGÆ@&ŸÖ”è#²qhhC«§¢Œ¡V{Ó™0JÑU1*“%vh&K¤‹3¿ HÆ ³{Ö†ÓmˆÆ8îÆËž¹’’rè•ETßÔÞE¥ºÓfº]YÓÜ\2ÙY¢šÅ„Tqõ¼ûÆÈ5Æ–ª7[ŒF S}ÜÆ\ݵFžgû`hÉb5c,_,M•åùato®9Þõ{‰jòøã®¦°<­–|³O¬-¥6j]œàQua¥êÛÒZ/Źº$'Y¢ÓpïÊ–Z±¼^›Ó×|àh¾!×Ef’ùzKÒ6k3v–:Nuô4£šFøÐsïEªt…ºâìææ™°Í”— ÕÙ´UsÑ¿3IVoþPÞ¦Õ—#—h7r‰Šœ~ãP5»Ýõ’©†*ÙÍbãìã”Øð Ñ.òï!>Y}ÜFøwJ§Õ×ûtŠó'x͉‡csu %JéMŒ®µÞÕ²EΙ ÷ ”a´X!J¹B¬(Eÿÿ8!Ì ËÿdþRXFÅñ‘ÌŠÐÕ šÚw9…°‚²Êóp)Åsw â½è6¦àj%džëamêÊ’[ ñÔÑK±YÆ ?~úq^Ç(Ù²:/=!¥”Ü%öî´šæRýMàÞ@¢•Ž‘ pXcªc±?ZXh8ŠÍáÖׄ)!tôdŠÌm }‚*ö™yŽ%f”^•EZn²+ëR/€ŒŸé‡–JçÔGÙúC£¦ÊhV¤$rwîÓ´´DJëÍäock” TzÒ}YM‰(\h-Vz®yœ±ù%…gض*™!P¬Ïý–<µÔI²zjÉ›ˆÆR¼1e¡s]©ÎøWšÛ Wš§_{&S`*=è…%e“Ø›ì ÆXþʾ†rÿëôÇìJ楫F|{©jÇ»š}‡}·Ðþ=àï+øÀ?Tð€\Äÿ“"þŸñÿLÁ?‡<¿Päéþ¥‚×ÿJÁ1à_+x4ðoØ[øC—†ü¿SÚ§ÿ^ÁÀ(ÂTðŸ€ÿ¬à¿ÿµHþ¿á¿+øÀÿTú¿ ü/ÿø? ~ø¿ üŽ‚ïźÞUpÚßSð࣠> ü¾‚?>faýp®`ìPø—;•v°[Á`©à2`¯‚Ë} <\Á#€ý k  MÁ§(ø àÏžªà‡kü:p‚_®Wð!à?Tìýħ+íÏPðà™ ž|º‚LÁ;€ÏPðÀ³ü$ð™ ~ x¶‚Ÿ>KÁÏ7*x'ðÙ Þ|Ž‚wÏQðàs¼ø<? AªÍ2gþ;Ë\-uû™›c±Óñáሲµ^+Ë2ï¹ã1÷öc¿¨­wŒw^’eåùQ¶{Ó±Ãø£¹‹ð¬dé-?ÊÜ~ñûl’‡¯áï0¿@kˆ_bÊT™Þkw3_]– «ÛˆgÙ|ú÷±@mݳLƒ`#w1ãý¨föÜÂX)c=µÚ(­"Ë*WÕjUÚhãc/ÓŒaª·²æZmL üX–Eû¸@Uîk¼ß›û˜à̲“ðžèȽ'™x²vrnÌS ®ª\Œ¿Çt€š¢ 2¡Øëiâ,;u¶ÍÐï>6åœílbk}€¿âë:Ȧv9곬¶£Ë ÖºŽAVh,X;°Æ,$Ë‚­õ •jÓ²lú¹ãïaÞuÍ84~Y«Í̲ӷhõ±V¬÷ÈÎÐÌœƒU¬Æ”º‚yF,öpý(Ç]¦1FV¢±'¯Plq™‚Kk[YU|l–ûòoeÎ]Ø]°WŽ2¬ î˜¬%'¤ûV^§ÍtgÙ¬Uu9 i3Œ¿focŽ:­ æË²³ˆ­îkìÚÇÎ&eÙ9Úzœ‹G–—esAž÷!%š@ÝÏæ;p24´˜Ój к°N1L]‘avA‰“‘¨ý¤ Äjæž„L!èὓ!­ân<ô©P[¬à™ëá™.¼Û1T“¶(Ë·Ôfà 4³,!=4eYský~v>m±)øXjl±6¨µ!ËZf9+œÛ 7¶®Ú~ì»– ú™ó(«† 2‡_:•¶Ô:7íx|±ï)Ž9uG`¬:¡­­á0 Ôi ©½N[§¿`DZÞè¬všÂd¸“ê]3µî,‹l=‘ƒù‘S':rô9}¢#ëÿëÈ>`޼ÈÜïSm#·ÕÕ7Ѐ§6"<¶r‚Ï*§5d9ãï³ñ^ҾѳÁ‡N· 5dzž¯ïð·­þ8øÜTè7Üì'ŒIˆmsá˜*´9òm—ñËÍ6C‘v}ÂhkÈ·ÆÙ<ÿOÂÿS´ÞÖíl´¶OM‹áé °×´KÙºCFp«2–‡£,nm*ss¹\G™Ì-ñQap¾ÖüÁm-”×gäZÌütíÐF›Ÿî6S8Ž2 #z½ láW˜cÎ1|r‘‘°r•:Š †“­}#öüÚÍœ²0Ô åÆ;üÑCµ¼f[>Ô9Ž0­ùÔ0p&Ú¶3W£ ¤ŠzÏÌFWµ éßI­gÃNå<¶-fIS Ì“(ŠæòcL3ãËšœ¯p:v®„Ø#<üSïRNBª`Jþ<$÷àµûcƒ"yƒ¯oåΆ!¢»*\»$v#Z£{»qÄ+ÍysYµs¥Zaí4eç°ù¬© ü¹Ìó>J<Èy f^jþiÓÉ­få„6znAÎ22çÕô`%´³Îøˆ•ÈV»€îjgk½eà“˜(ˆ4ÚiM^$°]ï5ç¼Ü´ûܘ“t6Ç>ípÒKfŽaìq¤™ÓÙYÐ΀)Æ$ŠÏ¦“òbðüæ÷ðÏp¤ë×ñëMAF›;H9vš÷³ü“ëlø;í¢Ó©fÙ†­lü¶±K;eÛÔRçGò³ùëe« äå;µOX:Aä8Ÿ7¢Ã$s ŠZm ekW´Ô9<”]~û/0$¿)Ÿä¸zYí4×,íJxÊÒÚìÞ<Ìö ”Ð>5È®jqÌW÷ÂCl$ ŠºqH ?½êjÁ·ûs¡K ~/BhsîaWÃý–`×vùìcŸÙÃ|ÆwÀø¾n7»N»^»Þ±›]=È>›e7¬"ÊÚ.§‚oÒnr9|³v³ ߢÝâÒ>7È>Ÿ'ܪÝêâ ¾M»Í†o×nwiw(„;µ;]~¯_úýƒì yâ]Ú]DtûG)Ä­ÚVWÀñ;TÛ¦PïÖîvù£~¯B„¯Ë²{ðŸvŸvŸ ߯ÝïÒP:<¨=èÒRk»Ô'k“]ÚÂ#Ú#ŠŠ}Ú)Ú)6ü¨ö¨ OÒ&Ùðvm» OÔ&ÚðcÚc.UäǵÇmíOhOØÚŸÔž´µïÐvØÚ'hlíOiOÙÚŸÖž¶µ?£=cÃ;µ6¼KÛeûµÝ6¼GÛcÃ{µ½.‡ÃïµÌ«=«=kcÉjY›Hû´}6<¨ Úð~m¿ ?§=gô6ü¼ö¼ ÔÚð Ú 6yi‡\H+)~Eêµ±·ByI{©ˆ2S›ér¸Ÿ÷v9í]Ng{—ËÝ>Ⱦ”o~Y{ÙåŸè7ÐètÁÓÞåöËö.ßßÞ%ýUþW´Wˆ¿,ÏO|.âsƒ=æ¢G€]ÙÞåw8ÃËô’'Sǯwùg:~¦Èúªö*&ªk‡AR·¢6Nç‚°k(Ô1Ú—öå"âkÚk.Ì_4ÍëÚë4¦Êø†öôËüsµ¯˜Ô]Fl_ÊÚØ5f<®b® Ò¹t3‡U¼Ëªæ{ø-hù?PK BDÓEl<PK7A'org/hsqldb/persist/HsqlProperties.class­8y|çuïíÎîÌ®F°Z±‚ pÌjäÈ ¶e ‚@F€ Ć‘4’Ö^íÊ;³€œÄéáÞv¦ih“ÚŽ¥š€-Ø86I[ܘ¤÷‘¶é‘Þu´Mj &ï}óíÁ2þèOÒw¼ïÝß{ï{£7ßyå5èÀ¡.jðõl†oà›ð»¼ú=^ý>¯þ€‡?Tá‚€‹¼ùcþDƒ? ÒügAøü9Cþ‚‡¿ Âðm>ø« 4Á_3Ñߨð· ùoþއïðöïáÿUø'†ü3CþEƒåù-Fü7þ½þþ“‡ï2Ö©ðßAX yø¾W߇ÿe¢·U¸„ÿƒËAHÁÆ~‡Ï®„ "z†^‚¡Âƒ¿†j5 1ˆuu¨c=¯´³{?ÃAOgÌcÊD÷=l1Ú3Fv¢}ÈΧ³÷3>ï>f›Y+Ë"ÔYâdW>7m!49$;ig™·Ó¦EdA3ŸÏå·æÆLÂò$­²Óœ!@ãA7QZÞ´r…ü(©‚ˆjÜ@XÑ—ËO´OZfÆFÚ3é‘öR§ktÔ´XŠ6eÚÆ6Ã&ÄeµˆÛ k²ß˜&¬@:;fsltÖ{f¦ië­òØ]@z­Ý¤—pœ¡AÀ¶™ãF!Sñ¨Bžµ/w”>„EàöôÄ$Cýä4ÄB”ZÞ—žJÛ ¡0õoHgÓö&o¬m‚ÂÎCˆÄ®w¯u»cöÆr ‡…½}€yEcîÎgu–i÷”ƒ‰waÆ]ÛÞ6· pÃ<àŠyÏ­yÀ´©J¹ÞñœÝ},mÙ˜õåƒ4Gî²XÛB^7Qmàn×ä&:Ld½YÛœ0óê&W÷PÒ$ð÷èõC¶1ú]íc$cRù¥Ë1i•DíÉŠ©îjàƒEys*wĬ(\oŒUÔQñ.áªà¡‹\Ú¾¶5q²dº¼ïµÅq=E=IR29cŒª®ŠïQñ½ôK™Ò}lÔœ¶©ú õ„bGÈTèæ’Âz÷º‡þb#?Ñ•Ï3{r²`툹”·«»¹-cf†ØëÊOì2Òy«,gê–‚óÿO•zéÔÎ>‹µ:p»³…)3o° WM[ÝSÓ|:cw¥,Gbmî…ùˆ‘I6y]%Š~“ n§[̺¨_ÍqpäasÔ&ŽmnÄÜpÅ;x7B¢÷`¯;wìÞ°C%û*¾ó–îÏ…›{½qÍo wÍÎ9[J‹˜ )µ:< O!€9ȪxŽ÷‚¥Cžì„‚6Gà(±p«:Lã:L?Þ릫àOÂGU¼OÇ ¸Q‡c0£ÃcðAÞÄM:|žÑñ}¸YÇ.ÜBªÕL‡_" ~Y‡O¯è¸.è¸ »n«à¦FÌ|O.?eØå,ÖáÓð«:öÀÊe› ’ŽïÇí:u.;txÎR5Ñq'|NÇ>ì×a>†°´Vþ–B:3fæuÀAR.¨¸KÇûáwãB‹ HçÄ F¾'WÈŽ•UPqŽ{ÙÎ'ái~…íÃaæðª<:tx‰Îðñ:>ˆ‡–oº¿¯•[ŽÃ2[»³é¬ÙÚ±®cݽ*:Žà¨Šc:šð”Šã:Nð<©cFXuÓL¦. •š43Ó>1ëø«ùE˜§†(•Ò1/P{´NÇ)ÌꘃO1Æ´¯Â箹&'u|©@úKA¦nÉå2¦A¸[G é¼€6å‹DRÇŒEy~{:+’¢uÄ!h=ÂÍKëx.ßZª4­ÔUJ:aÿ¯vðsÛJ™­ynˆj¨u<ŠÇʘٜÝj¦§sy*§5˜*Îèøî¨iËùÛt}tŒ;ÁñA?„C¼ú0S‘s-‹Äº1½Ùé‚M|Lcª¬÷LæsGù]½ZŽ©kœ!ÝLñRuå–Ë›í¢ ÜEçT´M.Ãä8ñFÑõ‰½c‚-uiÈö’îNÿQÙ­ˆµ¹õn|xv÷fK¾g ÷&ËK¾¨iµ¤Ûo\úÊwCž&?jÓFÞ2ÉÔºj^êìõÑf~«Áè7-P(Ö —$Qéô;=IMëu#UOV?]AwÆœ2³ÜsÔeÍc¶ÜÖVà2™ß˜ž6³c©[êñde"Âè‚Í4é’¶œ+K÷gÌì„=)!òFS±ørj—ÍNP¼À–eL˜ŒEªUl™›Û+u½6ʼn¹påÍäø6B£¢÷ÑÈ÷mÔèpd’èÁ‚}½ìø eW“ÜW ã¡™ì(…Ie©÷f³ üuÆuqC̃kØ;^¾½ÄŒÄ¬¬Á¼vÐ04cÙ&è"î*« q×-·Þ (¶¯ô לp‘Í,ºéÕ7WÛ]1-«ÁõAVúnN?fÊŠ±Ö%z];`F,ù0-ÛÈÛÖpš#Ð?:iä»è&ª[¹aäoU.Ôi»W¿óY#0ªä«À…`Ïî½Ô4ö]W%éÐ×ÓÕ7D§ZZþׂðÇÓœtþØÁÞÞÚ„¨úˆ¥|!Ñ\·ºå"¿,œTùœºYKªäM*Ë5è° 6C?}Ê7B&`Òü_x˜öTí3 p7ÆÿDà–NÌÔ¢‰™º:1SO'fjëÄLÝ™˜©A£9 ªáÿákøGáñªýGhÿCUû¦ýTí”öOTíŒö?^µÿ ÚÿdÕþ§hÿÓUûŸ;hMM*?KNðÒ `]ü4`<ì™oüEPæÁG“Ô¸w´øYì? Áy¨‹ã<è§Àù?5d’Ïâã¡Y‹'Âõ§aQ㣣‡0øŸ'·,)A’âIÆ;‹ç!Táùs’çâè£yÓ-óL2Ïp=#¦ˆ%Ëh¨ðý˜äÛN¶°5knÌ—ˆëJÄ?_vEXû…¥óÃ/Èó&éˆ`<Ñ|ÂEhþE¨K$‹9M%´O”Ñ–K´EqÆYÚ/¦2»ãpBâ5ÐÌ‘àcv¥cúdÇiU@H+² Ê3×)-Š–p> ŸrÅ!Û–Ï œ˜Hœ-$ˆouEœå ¤ÎC}ª+Rg yã,ø:•æ9BõSÐ-…Z=Ë^ïeX¢Âs[Txž-ù4¼ ù5ÊØTã oVÎI¥èÃF"ÜCÇ Í+K¶ ¤Þ_óœ#µ·…[‹°jNP±, ð2,&Y´ÿLùÞ›¤‡‚’ËêáÒÝÏ–kPì]‰7@9EHkú“/Ãí|«iñ.ºÃÉ\Ö©0ŸTT¡‹ž½ú­SeñAðú.ƒ¢Âg× æ¿&™¯‘ ,Ìã "/Â:Êt-éªÊÑL"I:Yì; k)Sb¼/BMä°¶"ÄûhJ¼ ÌUó ÐrŽøy¿“b?N1ýy˜Ä&yBg!µ?D·½î4´¿/Â'Xö-$¯Ÿå‘CÞí>éÎŽÄyˆÐ|×,, µÊëÔëÊ ß{á0 > †˜ýV¿A×®ÒõzUø >/nL…/\M…“—í”(Ô/ÒßKT;†dÀl¼± ;‹T{OÅï xôQOKQ½Òe¥ƒßë¹Zï’îöÀ{!|Oò ÜK‰Õ™zøÉ+ÂúNêwâ¬"@áOPyÇôã„Û'œÛ¾×”Ãg`ã9ØD¿\Ѧò_ þ>ú ‰>¶b°‚3–:%3¶§¥wHˆŸæ ga3¹¤«ß»©%þÚóðj¼¥£S‰*á-”?' žV[iu’¥ÈÞV„îYxšà=ExÿqØÜ¢fº8-:(×ÞN_R:š¼ÚÞNCTñ Rvv”–ÃOxq¶GºÞPêYØx‹|”ëù0««Û’'«Â(x‚A”ô+)„ê£]4Æ—óx Ö^¢„ÀxYúâÛ´Ò<'}Ñ©x×ûâÉñß±Þñ{ž¥JÑ´Þ÷FüEØ™pŽÔˆJGKI§xÄ'¨ú÷ì`€ê:µx„#?y¸„Ò Ù"MK•MÓ³:µ¨Õ¢6.âg¹Ï‚GüIf²Þ7{u<ªT«^Ý1v ýÅð l Cé÷mÔ½ u„ø œ-?ûΣ¡ÅE±YS*ø¯–kL F_©ú~ ^syxÔƒ×ËJ½ØÓ_)ìÎÁ—åQL&Os(ð%èHyãC)eÅJùƒC)59”:Y¦úФ2%UÌjQ5‡À‹pÿ,ø_„ÝÇ9 ð\…Õ\yŸCª#G…ßÄ«üz”A^©ð[BäoK‘w˲Ÿ"9#H(Ý´JÑ¢Qmvv!55ä\‰£÷ùªf‡“l“ÃÄõ1ŸdâL|’‰T¿Ÿ&­ÅÙ†üÅY•ø¾¿#ù~Wò½˜ôu„waÏq¸“"ì¶¾„xöN€žïYëÓ2ÎÂû¸â9!v’é!ðfHlOÐ{½‰ôHú;Š0|:“ZÇ9x û×+É¿´öµD”ç ñµ<KKüTó©ç!Å“SµØdØAΗÁª~Ê—ÖÚjlÔßMˆø64ÞyIÄÛðUiÿ'¤ý6Å_þà9xˆ~EàK•íÙK¦¤¤)±TÅ”T•)ÍÒ”æç­P|EêÅ›ÅéX™óVÓ0Л¡º÷²ž¸’µ|.H-?#µ HÚcfþš ïÀL33S‡9i×&±„ÕÎ@TGpPKö€v_ªÎPK7A0org/hsqldb/persist/LobManager$ALLOC_BLOCKS.class}=nÂ@…ß@bógÊtT4+qp@²0Ù­µ+d­¯ÃáRä 1& JA13úFOOoætþù0ÃÈEÏÅÐ]D2X§|{MúAil­L½UÅ·n³„ÞŸL®Vñ2ivDp"¹H׆Z.|´¬rña¿Š]&>ue÷¶Q™m”Q¹®&óˆ=Ò«QÌŽÿ04FWA¡¬Õ–àÔQ‰B™\Èì ßkÂø®»Ó¤lq”6ž¹˜›`p˜Ýî0?ݰw½oÀÝãÉAßñ.PKaÁF²Ñ(PK7A1org/hsqldb/persist/LobManager$DELETE_BLOCKS.class}1NÃ@EÿÄ`ƒã@€Š"ÅJ!Ž#­²‘‹XˆÎZ'+Cd­Ákr8 À¡¢ŒMcQÐÌè}­þ<íÏñëÀî\¸!ø*çrA I˜Äµu­¶í³®>Ç/Aˆæ*Wyº\n’¬Ëˆ0þÍ”\Ë>γîéÀ pKx¬›R¼ºjWˆwÓ¸7× Ukmuiš‡E¢’,Éûž _þÑ´Ö4q¥3Ž0Ý냕¶¥H‹½Ù¶„Ù¿ý~g>b™3ÜÃãÉ‚'|æ`ÀÌ—™ÇŽú?˜ò y³(®ýðPKýOßGPK7A0org/hsqldb/persist/LobManager$DIVIDE_BLOCK.class}λ Â@Ð;>ÏÖÂÎÊfÁOÈCXŒ¤PÒ†.Q ÍF?ÎÂð£Ä5•XØÌp`¸sŸ¯ûÀ#Ž¡ï†‘·J¢årl Ä ¯PºªŠE~•Ms‚FnÂýÈÆ0/ÊŒô%ß§ì,K}Ô ‹t-”Èd9óyÌý ©ÓÍ—r¥déåBk© 㓸 – •±(=É]E˜þM·>¦J4Ñ2jײŒí/wêî}3³ ]ô,ç PKÞ•Ó§¼PK7A0org/hsqldb/persist/LobManager$GET_LOB_PART.class;õo×>#Avv~F6§xOFFOF^çü¼â’ļ’°ÄœÒTf JF'gïx7·`×##7DÌÇÓ×,ÄÄÎ ÀÈ •_”®ŸQ\˜“’¤_ZTœY\¢ï“Ÿä›˜—˜žZ¤âî²-À1(h,×3//µÈ9'±¸8µ˜‘A +±,Q?'1/]ß?)+5¹„‘A¯él §2ÂÌ Ä,@+Èa l@>;ŸÈçDâs=É$¹€4Ðk ¼l\PK­ô¬šÓ(PK7A(org/hsqldb/persist/LobManager$LOBS.class}ÍNÂP…ÏPl±Tågå qß@ZI 7tKná¦Jš[í­>œ €‡2Lé¦+73ùNNfÎÌéï÷à c·†šÈp¾}Ž¢bÂMX[)S½©ü[;ì¡ß¸BùºÜÔ‚F’³Ùúå¢un"§Û8ªÉñ0"LŠ2ïö+ß§âS—öÃV")Ò…2*Óå#ÛׄnÓ‚Ø]†¹²V[Âà ~”ȕɄLzWþæÖA;¼º‹{8\ Wu,¸Ì^‹{Ì×-ö™û-.'¸úÜù#¸sý3PK`¦óõÛ:PK7A+org/hsqldb/persist/LobManager$LOB_IDS.class}ÁNÂ@†ÿ¡Ú…Š‚zâàMÏ›øZhR¨ ń٦Jš­v+ÇÁࡌ³šž¼ÌÌ÷g2óϾ÷_îq-p!pIð“ôq?(&œ‡•±2Í‹*?µÇ ®#‰fãlâ" œ²˜?Œ£U˜.f™“;„®“³ås䨏"ÜUu!_íG¹Éå»®í›mdRåSeT¡ëÛ¿Ýs‚8VýØ]‡¥²V[Âp«vJ–Ê2Í·zÝnþé;Ë6p‚<Ž„Sg>³hq—¹×â€ù¬Åýßã‡Îü üàPK&[0vß@PK7A1org/hsqldb/persist/LobManager$UPDATE_LENGTH.class}ÎÍÁ@às‹–Rl-ìì,&ñþB“úY`+S&Eš)3åá,<€‡Ó.D,lîÍ—œœœçëþÐCÃëÀ#¸Áb° ÆóÉjJ Ÿà ©S.Ó ¯¢`Ò ØYÊe"uB7Q;èK¼ÙY(}Ô) ’pÆ%„꬗£þjüéõ~\ó¥js­…&4OüÆYÌeÄáIìRBûo¿m²Ì -P4*å²/—óõ5s]ó Tm÷ PK`‹¹PK7A0org/hsqldb/persist/LobManager$UPDATE_USAGE.class}ÎÍÁ@†áïøiiým-ì¬l&qU"R µm¦LŠ4S:åâ,\€‹ÃJ,lÎÉ“œœ¼çí`ˆ¶ ËD“`üÀEn.ÖòM7“ªà²Øðô"ÊúÃF‘7~‹L´ƒ,OØ^Ó]ÌN"WU0?‹ç\òDäýp9vÖ“(\9Ó ¡ñCOJ‘»)WJ(Bçȯœ¥\&,ˆb[z¿N)¡‹2*ZÕ mó˵O{COKoB¶a½PK÷B¿PK7A#org/hsqldb/persist/LobManager.classµ; x”ÕµçÞYþ™þ$“Iþ ?[&‚:Ùœà€H6 !LÐ’!Ã`Hbfbkí‚•Z»Yµ…º U±-Úh!`Q°¯µ¶Ú½¯­ÝìúÞkßÚ÷jkµHÞ9÷ÞÙ’Iðë÷žÀþsÿsï=÷œsÏrïøÒ…/€ZþYšX§í¶‰‰ 7<ɺ4¶Y;ë$d‹‡me×Ò[7=¶yØvv=®w³w°:ëaú°Sc½:°¨În`ýÛ¥±˜‹íÖ¡ˆÝ¨±íÑ¡„ jlˆ¨‡u°ØMô¡GÜÅ:e{5¶Og7³ý:»…½Sgïb·ÒãÝ4Õm.ö½—½ÏÅÞOð€ŽãÜîb ñîp±ƒ?èbwü‹ÝEðÃ.ö‚u±ü¸‹ÝMð.vÁ{]ì>‚Ÿt±O<äb‡ ~ÚÅî'ø€‹=¨±‡Üì{XÇÇQz|†X|„xzTg±cDø¸Žèg]ìsû¼íì85>ábOjì :tH|LcOé°™=ía_dqâÿ-ï¤ÎÆÙ)zœ¦Ç3û’׳3$„guö;ëÆ ÏéìyöezüõüŠÆ¾ªC”½ ±¯éÐÏ^ Æi–¯»qÌob^rJé?âøeå›:ûû6 ÿ‚ξþ«±ïé`ß×áCìûGâç‡ö#öcïzü„¸ý)½ýÌÃ~Nìÿq½Ê~IM¿¢Ç¯uöö[¢ý=þÉÅþ™¦ùB~¯±?Ð4ÿJ£–§ÇÐÿIsüqÿGjûo"ùzüÉÍ^c¦·¿èìuöW¢{C{ScÓáÓ¬Scç©Ë[ô¸@\ì«ð3ZÚÓ¨<ŽlÞÌm8 ·£ˆ¹CãN‚šÆ]:|Ž}‡ån×5îѸÁ oó¦¦ú®æmÍík»Ö10Z£#‘x<×x¶(ŠÍõk›5ž-õmmw4àc}§Æ p”¦æ¶f¤I6y‘¨©eKK“jÒx!¶¬mîÚѶ±aǦúŽ.ûh„µ4a‡"vD:xG¢ñ¡Ñ‘ÞèšØ@´=²'ÊÀ×¶;²7R3ì¯éLŒÄûWà”CƒñDd0±%20uñb.ÄGÑ‘8ƒ¢í¹ú¸ú"‰ÈÎHÇ4Û†FúkvÅoèÛYÓ¤š‰d`hggbhIæe’ ã°±x¢¦M}&âûã„FãñØÐ ƒâLzÕ*Ȉ~ÃP_ì†X´ÛÆ@ß¹?m½á†è¾½…ƒó6 õÞØ»çf-8^b(m±=±DãÐè`‚³?šÀiø³æKDÑ=ÑÁΨKŠM( œ¾/:MDoŒ 0(Láô=ÙÛëËns÷ŽD#‚¿§ÞÓß F‡ûd[[t°?±‹A~ªes<Ò‹0öèÍÄK .Ü+gÞ<8öaªÉ#9U++¥~iÜ…Š#iÙiù *¤:G±šÞ¡ÁÞÑ‘\k }Œ×tD#}[Gb4uï¸~÷¾$ l¦ŽŠ¾(6KÄ"±xTH;ÞyMŽ"yïyi‰ ¼xŠE³‘’“@}“D$»N‘¥q² DsNÜ9D–æqM›‹›$«,a â‚Ly‹o–ò则ZHµæg(B48W’PV1˜̹SÊ· n‡úPͶ !ÎÑA©*%„ÎÞ]Ñ=Zfï"Ã]‘Qr;"bÊH‰ARã~Œ…/Ñø,²´¡=øñSæŒ>ÈBI¦5DÂŽôâ¼ö¡á(n;GïÀíheKjó–Ë/²}=BZûHXMb­Ÿ-ÛÖ¡MÑæô[Ë3}ÉÆ»£½‰Ÿ£ñ¹èÁõ‚{d>fΘØ?×Ð7’Ù IÚ8icšT—"”g+ éWZË[StrTwJ×èº&Í€>ut …N078ÃgÏSÖ/¬c%2Oz‰`ÁV¹½¡¼Eãó5øƒ+g"œáS9º¾¶}‡" Zû ²›êõ‰¡Rlþ»þ1k(Ù4 OGŸæ¶¶R³G5wáŽD?4ãä²G)öœYo>©ð¦ÑáXoÒ;S·m3v+DevŒŠ.Ê[#×Ãû¥K‰"îàöí-ø—¶²‹,uW„â(Ý2ãØD¬V®ÇÕkC=-¸µu{ÃÌ}SZ0ð/ ¶JíņjZ‡G¨ÀhdÏŠ׆9Åý ¾äëš¡ÜÜr-nä™OI!@kiœq˔ɹE9·Ü•®„’»Øö3ÏèŽ'÷zîHßîÑxbs*"2¨Íífq¡tP½7Ö÷õá·8 Élmi)Ge§Ùd § Ø’ K“¿£ËÏ)G•õ¹`Ò¤è?ȼZÈÈÑÑâÓß?Ø‹Ët­ìÆ€×àu¾ßc°dÆXï#˜öe}~ ¿Ñø%ü–/Àü΀¯Á‹_H_pÜ¿Âë¿Ôà—ñË54x9¯0à%x-:ËÀ…gtŒìõGÐ×Õt íÃ’ª=‰g»Ý¬q7Dò>“Î+Õs{î#EkZWÇ`öôef®Ž©Ž|{#²·{̆éJ°ümœ­•^„—žãx ã@\®6µƒçä…ú8I"“zzé -û¨ÖŸ}þ‘–ì%ÁiN’SQÕ3_¬)ÅÕÄûkê{ÑÚãCX— ¤iF£ohÓNQq†¹,Ø–Ý#ý±¾WÔÿå¹´_ÌYµæ8â@žŠÒIJ­‹Ó­“KŠ9NÈ“Å}w •ðYRšº“I[?\œº€œkòM•:*hò¡_zíYÜMwÞ­EoFÉR‰½8g‰ø·á;~¾'à÷üü£€?TðG þXÁWü‰‚?Uðg þ\Á_(øª‚¿TðWjþ_Ãoü-üŸ³áŸ2Öшø?gà•ˆÿK^øï3ð:Äÿ× þ¯ø•ˆÿ[¾ñÏÀ—"þø"þ_ø Äÿ˜_…øgàW þ?øÕˆÿ)¯‡ÅøþüŸÁ–e`ÃV€`Å)`>~lgÀÞ} 'ÁYQqœÏ€Æà$¸**O‚û)!)FW%j?B†PGZ×3 3HÒüu:OšæÍ`Âc4©ûãwòÏ@A7òæ= …σ¯m8EÝ•¾âS`n8öö3PÒ]u fá‹Õ]ý4Ì>sÂvË>sÃó,‡oþ8”>°‡Î·œãPÖ,q¸$ì²\ã°à¸ .<'§¿ÔwÙ8\v+Œh}Aj+ëãPñ²] h´¸7‘ñå`›@Ô¦Áß48¯Á[À4¸p ¸SmL 45Æ4Æ5fÓ˜Ä@—J P 9›g…˜»™> U©È"‰Ôd±D–¤V"K²L"W$$‘:,—È• Kd…@VJä*¬’ÈÕY-‘z4¤ôy ÚRHå¹§p nxT¨ù)xZ@)%7ð×á)9=¸l-µì«Pû6„KÄè8z›ó9hÚPe{š;«ìØl; k:«îÓ°¶“¨*«ÆaÝVeHtR¬†ú08„±íU†Ô2­'a=!ãÐæÛðXhâíÝÔ€ÿÖŸ‚'aÓ1X—¤¸æ1X€HAíÖuºŽÁ\ü¾¹[~Û’õ-½RØWÎBÖÜ)Öæ Xˆµ$ßô lEå2ì\ƒÎ<ŠðRµa¼Dø"hhq×ÒëXjt 1§“hÕe;ŽM¿@ #Ý*eÚm•°î'ð¥{ lÛªy‡Á/ÛÝOàó:Ú*¶ÚçáúqxÇ©Á €Ÿó-(ÒX>É ˜WMôqT•ánœ‡ØÑŽÖ؃ºC•&µs"´ûvQr£9Ô‡qèµ’36FoÝa'íÊm!ÍÔƒNïÛñ‹“ÄÝ™^µ ü¬ÑX¡Æ|‚=K°ÇX+Vì݉ìi[Ó¨ôôµW¿>¶§ŒÔ²h7~»8Ì©/Ž1á)æ<‡Âvã6_‰£^‚þ“àJX% dËOòºyš 8nv;î}æD¾Læÿ{øê'¾vý?òUÂf)¾B¾ „£i¾NA¬ŽZŒÚ•šúE—ióÛIÁ–fHè íiiNï|Ú¤_êgi¸5î ûIØí·×¹SLûÝO„=é%xÎ ?±ú‘~ˆ (Yw{ú%³Öÿ5³ÁÿGfg³9ŠÙ ³.„×¥™=¡œ;ƲÛS~ˆhë¬CÕO–#Këca-i’§hÇyÚa“€<µ žàU6Wñô'p žŽgò´û0øž†3øX*´Þz[ÈnÚ+Ï…¥•¦½v†ó9ÃãpSÃïpßsòüŽÀ=÷ƒÓï¨?`gÇ&¾iO®ó \ß8#É5®N®Ñvñ5’ÃÈw)Ü-àƒpD@¹Öyà,½èæÙYÑÜ7Á1‰F—¿%Í}~J)O)ïº õ¼»OCü\µ]9Ä:{µ_ã0r–’5íÍbl¬½ú4Üœ½wÑR˜ëœ˜l9fÈûÜŠ7Áz·B·€r³Ávf‹ZžÞ©¥’ý+“ìó9èã °Ó-iö+Ÿ¬GÄÒŒ«V›Ÿ‚[ÂN[H³…\¶ÛowßsæT= š ó'Jçd¦~œÚ}öì6Ëijµ¶E¦»'D™Ï;MÝþ ¼Ëa-d˜†åA³ØkºL£§êìÃPá·W½çðÙByéaòŽÛ³QËcK«D·¥GȘªEK!L¼[µÒë# Ù—Y}hY¸™IÂ^ßr™nÁ¥}Ñpã*hÌÔ,çY1°×tcøæ<6qE{Y«”í&çËúÎOë4ÿî7´²ÔÚx‡€»áQŸ‚>ðˆ†Bé@³4„*ñÄu;lÇ'›N•2 [W¥–9ïx–U“—™UXÝþ»R@¹ ¸¯/9÷¥ÊH[ÑɘHqoz&œãÝÂHɤÌÔ¡Ú•™*EÍ39 óÐOÞ–2Ô´+6=Çå4Õ¬VK3]dªz¶“©z”©~‡øæXt»©ß!«¹=V ïÙ­Ëó“m­w ö õZ—wÝ–qÞgóç<ïД¦»/ä5½’êðÈ—·ÚtãoÏ8VZVá8Üò™¾CPdúBEi&‹ŽЙé–{BnSŒ)ËոШ-MZ®ÏtÓ¤IÛ]èwª¬7káÉ/)ûÍú.Në²ø*Ç íìÔÞ6èp˜¹ b¶r½€1öNï`ߥ®ãP0ÎKVw™Æ.5L–Éšpg =bfV_Ù[PI TŸÀÚnÚŽÜÊ—mϤHÛtPÙô•È:ÕK ¥ÕT‹§²éÊ̶Sðã™™²ØrV!‡ac¸1È< ÏU¢#eΊ²ÉM®ŠRežzE™z#χîÍÊ·… üN²U¯ßE@Úêq‰8ìÇ-Ý4È"ó{B^tpyô^Ð*ÖéUÖéX¡ÂŠl¡b³Øò¡[]fùÌâ¥V>„AÌ89FÑ–é!(F§øÒ|v €™ùb^eTùè/Í1»j)8ÇÐsëÒÌ ÍSÝ»€\@ɬÕ4œ£¤CŸn4îö¬¦ò£’U)炱æ"+wUHU˜ñ¥T¥að™Üæ®$•†_ÕkZy¶×¯Iý¹3õçNê/Cg–aæÓ»·'4Icó)¬Ø¯‰^äk ²}é7søÓïCSov‡IŽ%Â9 çd çd‰–bÑR"ZfWZ–5›¼Ðsfkæœãh¼¹,Á+¦W-^4¡´A¢)IÛ¸ðš_ó»•mÐÛTÛ¸|Ä6È“yZóèß4I Á}~Û/ÀÂYp¦ìdú‘¥©0ø«Vþ¢M…J®YeÄ´QQêwØÆáŽ±Bø†ïàiøà¹LQ€®fQ*M¬S®f^Eé8ÜI ;U«Õc¥ÕÏÇÆá.; ”™lŸ‡:Í¡Aj”©nCG3 I¾k’}¾³e¶I dVN™iϦã0Ìõke÷<&Ö §‹Ë=&JL|ÎRŠí±<6¿¨!,Æ@è°œ‚8Ÿ³6]ïx(ï6,C¬©È2ÂéäÊÊ5‡X‰ß]F)oÖ粺<MeÅf7x<þ<´×X2–Þ¾ç n+ùzUN´» ¿ÛfzOÁGRþ´šä«¯Â*´|§à£Ç`V¸ˆLû欠5–í`¨È,:«,:H{_m¸Ø*¶-²Ší‹zì}!SlDSmD¿å7‹l§ácÔŠïÔþq;¨Ue .Ic%˜á±KXšeíö0*¸ ãÚÃ"ã;"àq8'àË,D5°{|˜}F´K³èý&ðÉöñÝ飸KÀI ˆ&ŽaÓã<¬BOãu½‰95 t)[¦oG·A]VQZF†m:»Æáòx7 BܧÂÜC' èwîÒ2ËuîäæH§pErlþ0:…b„<¥¬²äžq–%\+3*`»+á7Ì4ËXrãj)cD7a•–= ÷†O†Ó¥‹¥aJi:žuað+5¦K?tè‡3ÝOÖþÆÈˆÑ€âƒŽE=¦³/”?¹ÍõÌ6§¶ö!©Ð¦!¦úЇJ5ó¥² h‡{-/M\˜ž¸NÖ›ù»LMdئÓISIáT7±Ç§`J1 ¹Äélq…û#/ŸYÌZ…Äœ/Íœ/ÉœäÌÔû]@âÏ–ƒ½c4©#k‘át%`Q%ù ¼Ž¶²½‡ÝÃ>)üM7{Ž'àNïc6‚¬€ð8û½€¯±¿ˆïÒÒ6PÔ] .é T8œ}‹` ¿õŒEЗœ‡bl9~æÿ4l!ïbÍš@{Ìò-œ~y«Ìun‹’fÓyÜ¥aöŽ¥,׆†š6Ò”–™Î´ñêi ¿yLOÒx=d¼:CÃt™º0LÓEÆwöA˜m‘‘¢{w,J¾¡ƒå™y¦~”b2½˜y}"š¤ºÛé#ßtЬޒ4³¨a/eV2«ª+¸=… Ü–ÂM[¨¤Ì_ˆ™é/—h´®ÈoÒK¤ÎÄtÎ_tÏý0×ÔÏ_„x4¹°DêD"h90Ôäû‹>‡°.9$6x—-‰ñãè›Y"IòqØÈAdÆĤ̋´zÚBÎMh"ìM·{ÇÂ³ÒØ,:z:ÎFØ(U1{7;Š:¼“Ý'àQöAe<·B¾gZDyFhKZUoè+À Ð EÙ4Ê“ÚÉr`®}Ù”¨p6‰ l¾;Rߓƶœ]©*³úÆB„Eî:ÍoOZ[½¢”uSOšNæãFó±™n™U¼%óTê+62:WB…'E¿ü”2•½ï˜)"Â4S¥™ÿ ¬­&jßÇá0?‚þÄy·~È{ ügàÓݧà~Ôј_£ì“¶|ÓÛGÊ$gPplâKÇÀ.° ˆ&©1ú<ì2H„÷hG\+¤¦ým:ÌQß _„ïÂp¾%à+ðGøêWê±¼àrÜþ¨·bûyÜ¢ç!„ÿ8þ[Ètí ð¢ÂÚ6TÆ› aõõ&]–±ÉíÎfãvÏÃÁžÍµÝeöŠñ.+{ÍÌÆ,-³p.³¦ó<Ö-]e›zÖ‘ú˜p¢Ê¬¯ÔËaê¡é»àw2ý¬¶°‘ÆŒs"ÂV“B(Ûì‡xŽ ø$Œ (E·žótTá{ jÐ6íµ”oM¶TÆV²«T†°KeWËÕ©’ªÆbó¡”á"ù•.…%8ÔX*`ê`-¯WκŠ]­´Sƒ´ó-Ëqv:õ¼íâÂrœ†‡±¢)ŽåÆ1»fV’ ¶4ÔV•|Ç’Íó"êÒ.®.lªÆ–Ãn÷ÂC~-žà9ø2¤«µËÀaHu]€«ì¢^$ß“Ì5¶:©°ú¤kÁþ.qs´o…‰TÏIZÓèRH¬F›lß²ü«sù]~;ƪ*]ãp e§^“îŽl¨èZˆ! «àzcp£€rQ°çaÅ‹KÁ¼Ú>Òþ48ŸNùX£²„Rš{ýd’ö–#KûY·*™]eu.Ë‘¬d ç5.LxÛˆM…p|YN×kªÅÍFeuseØÏ@¢›Bðgq< ?´‡G3î´–SÁ¹“ÍÒ2´—­¥X„=–u°>.HcòÒ' ~*D¶Aðeô{/§6—®LªÄž½ÔŽ»Yœ‡ÛSuHSRXP¯ê+pü0­ÃA—Îb¸[lebN{i·aÊôבP>O—óÍlnƒ®éVNδÓí"Ž'n+é"Ü)/ÂWVÒ-¸V©®ÀÕМþ×.5ôŸqhÚàÏ#õ¢©C—*NçÉrª uÝ®fYT¡®ÛµŠôu»F—ìâ‡.Ǩ€p¾ó°n£|Ìt…õ–ËDÕ~v+Q\‡ÚÕMO­ u¬ d£h°£²³¨ðdÃF¬Ô;JK €O •{H5t¶£nîéÚžb Q;Š …µ*lQÒmMÝÛåÌiqR‡O)1¯gmjŽ«Õ]üR¤ZFsˆ ‰9p6›Û‘eˈ‹uagr° )†×)†W"Uí æä8sÔÚI,¶³jÔ´:€ª¶­šG¯—aìX$Šáž¹@¡¨¡E[ßÜžãX›øiÆ9œN›ƒ³KD|‡_²MjØç0àÐÊ3Ø_i? Ê~ÚÒæ“õë?ýzëùô ƒýxæOI>7Ÿ¥µ`:ŽçøÕB ˆ:»GÀ„ô½˜E?òhWF2ó²nr¯Iý˜¦—B¿”¢[«»Á•6} j3¶éÌn˜ïNqã—J%©\›o¿Sr±ŽÔ¤–P @žý9tÛ|Ot~f'ÌF°EÿJ/œ:<ð‹O <‰pá)„§>ƒðKÏ |ásÏ"<‡°¤94òÇxXÿ PK1öœì"”NPK7A!org/hsqldb/persist/LobStore.classUŒ;‚@Eï(?ÔÞ @5‰K Ã˜XØPÁ8á#a”™˜àÒ,\€‹2 …¯9÷åÜ÷^ïÇÀ+ž%—sÖ‚ÃNqI`ùQ$¡ò_Ø~ju$ptÚÑý]ÇåLý "0Y-ä¸éŠ)»†Ñæ´×ú”Ñ oe)Ý‹,V¢ÕÝu•ÞRZ§MNYÅ™²&èÇ2ô/€¦ ëK{ ƒÙÀ9ÝžÀPK¸«N­®èPK8A&org/hsqldb/persist/LobStoreInJar.class}TkSW~H6¬ 0"RlmC"¦b±/-áRÃ¥ Vjo›d……%w7*ôÞÿA?vúÕ/ýPgJpj§|éÈL?öôtÆÖ>g7 ©ÉìyÏ{Þ÷=çüñï/¿· ú0ÖŒcË„ŒIMSð..‹]*„´ W„:#cJÁ4f3+vï)ÜÍ)8‚y!»*v×DÌë ÞÇ  ø@,7|ˆ2>RÐ…e|" ?ΚØeeädäeèTÓÊ&M+·2o¬“•RByÍÕ²šC6’±ìÅÄ’sÛÌgãñy M· “êî̲vGK–§KŠ%wÞµum•&!a2­­Ò¬Ý73µÂb‚z£°H½J;sÖr ×° Lœ–¼` ÷ãFëæM \gê1+Ϙ-ó®–[™ÒŠWµ¬©{Ýb¿¨XÔ]¯ äš«; M¥n&©pö*äèÍdÊ â.íoÕª·ßŽÆèÈ™–ãs49`ëŒä×)cÑKªLÜËéEQ‰#c©Rü¼®¯o4-¼ÎZ!·¤"Žý8®âe¼"¡óùÎ$K†™×mV£ÂÀ²Š˜ô>Å19*V…ä5D%tì:^]²­»~ *,UœÀ«bw[Å;UacXÅb*Þé¸2J*î஌{*Ö°®â3|.ã ½Õ‘NŠùYî¤U*äwÊ|Y…½îBý•Šó"Ë×øFÂK5s,ê¶c8n"ceç]ËÖS…´fKhÛ­d&»¬ç\ =/ðbéuÎFµ!„T§V:³SGÏ)Ïj.u(:PïpµbQ/ä% F÷«÷{T†&N½kù" ‡k`ê¶mÙ‰ ±r˜ºO‡¢©L)2~çe’äLÐM½Pß̺ó“%Ó\#–9fj{Çž:=!>'¢]ætÇ*Ù9}Ô©vqàÿ»°·áç÷Œ“% o^®dÛzÁ­ò{›îKép­‚«ßóQg,M¯Á>ì¾JøÔUP^1¯aW´.lïaqVŒ¢_Ó¼¡Çø¬òü"€6q_!~¼²åõâÚ&n¢Çójqm¦}'¹’Ë¡‘90Û„;º†X|±ÇhZØD ^F° ¹=Ä¥Œæ ( N‡¥?AÝzÈ ­ ÇîN1Ì!4<#Û(#!ãu¾—2N‡¨™JB“PeÒ+±ŸÑ² %,ýþ­[=÷É7Ü7’G]:ˆ~ cý›8(,»ƒ‘@m±þHྶpwð§ŒQ$w`Èhhåwšì®dná'J•zݪ³5ª`­êMœ«¨Â¤i@àú±¢æûTQ_Dÿ@ùŠ e´³K¢‹W» ïÀ ¡±5éu¦Aì•ò樞ó/óÀ‰Y‡“}ýß}fÁ6‹ýèè&}ýz½ZòÁ³¿b}8ì¶ïÀS´5Ej2IœþHÍ4¥Ýiâ?PK£øÚ:ÂÙPK8A$org/hsqldb/persist/LobStoreMem.class}”[OAÇÿCw;»uQAFÅADm«X¯ë…‹±¾XSô£Q^ܶ(,»IM4Cbü¾‘˜˜ðâƒA£„øìgBê™ÙmQQšî9sæ\æüÎNûcãë€3¸Ã.5±ǤHJ‘âHÇ ÛÇåêÇ` '‘‘Æ))NKq†ã,Ç9Žó –W)d½Jqf¼üØe`9†Î‚´ýÜ\Þ©NºÊɰÓkAd{¡^sÇk•ª›/û5†ƒùJu23å?ôJ…ŒW.d®ÓòjµêÔ¥ˆ!:\ž+×F´d.u‡ÔµJIÖ™tkªl–êù–ÌåRYrŒ×œâ̘3Û)x.µL[þŸ±<9‘Í©b­nK«Y0è3’L“^ô*~`Qˆî×çŠSöaÀÂtZè¢ ‰í0,ìµ`ãCÛD–㢅K¸laý†1ba4ŒßŠÌ»UŸR3ùJAkÌeØ=í4zhˆŸ=¡î 5ÍŒ$§¸}ØO²[]áÚHMKwàÙ2ÚÒñeDÒñô'´M-CKƒ~ï3¢ËàT†ˆ‡ùß…Iúq‚Â#S«ÆÍˆ­%1£Ò=['Å…¾ã;Lú^Ž*ǼͶ!¸0Hó-,©/ÙFwTpUkPhJ C©/ˆÅ)|Xh$é a”F–¯ß«Ž$3ˆü„Åa²Ý“£‡1ihÐOPoíª´ƒè AÖBWÔÏ"aÿB¬`ÇtÈ=Úª±ëî²DHÖó²ã!P‹p“ŒhŒ„d=D6ºÔxò¡Öm¶Ž#l§M“EM–¾å#ý¹ÄH?ú"žöÉ–f_ÚQÝ–%ºÉƒ¤‡/ E·MaSâhõY²MÂéæÒCý÷ sÁ¹J&]˜%[_j¼ØD襛¹Ž$õ6ì¿¿Ù¿öˆ¶‚þ;HË=9úÈ»ðÎÆ@èî ÝF@ÓÞ¼•GZíʦ'páPK²A*°PK8A'org/hsqldb/persist/LobStoreRAFile.class•UßSWþn²Ù aE@¢M•¶bHÄXÛ¢P‰b h Ò ­í&¹$ K6î®"öç‹ýxéC„Ú©/v¦Oþ7}hé¹»KZ›Éœs÷ž{Î÷{÷·¿ø ÀY|Á1 5á(†…¸¨àR†"¸Œ±J‡qEè«M´3Á5¼×Œ1d"tz\Áûdq]œž¶ÜÄ"Ò¤‚\SaÜŠ ÓâØ‡Íø·…˜bVˆ…øDÁŸ*øŒA5Ì|Ú0 9ý!g`iN7h™ÈšV)U¶ïÅ|ªÊ-[·Ô¤V)š‹#…·íLÅáÖœVàƒ á¢æhyÍ&¿h½ßU›ŽÈCzEw.2Äâ Odú¦ ûŠY¤rŽVX¸®U§´¼Á]º%O8f•W®¹ü‚ñ¾iyט'—wÜDÒË· .žÉôͦÉ`ï6(ñÙtÆ ÓjÜ[ªÛÞ^(6"T0L‘QÈ^®Ê*N"¥¢¯©8^†#óÚ}-eh•R*çXz¥”¾§EnWUpÌ‘÷i*±­¢$vÊÐÌ«X€¡`QE¦ŠÓH1Ú‰6U¶Ì%/ñªŠ»°TØpT܃£à¾Š%»Øv'kQ{}Ð6/ªZ‹úØ…ŽA°VàPKšZ^Ï‹ PK7A#org/hsqldb/persist/LockFile$1.class;õo×>#.vVvF~×¼äœüâ̼tßÔ’ŒüvNFÙü¢týŒâœ”$ý‚Ô¢âÌâ}Ÿüäl·ÌœTCFFϼ¼Ô"çœÄââÔbF¬Ä²DýœÄ¼t}ÿ¤¬ÔäFi<†(`b€&f É„ ì@Ì”cñ8PK̆󾌰PK7A/org/hsqldb/persist/LockFile$BaseException.class}RïoA} ”;®‡…£µj¥[ê)þ¶ÆmjÒ´I›&ý¸À†^{ÞáÝÕøgib!±‰~4ñRg)PCÉe“y;;ofÞÎîï?ߨ᥆ Š î¨ÈjˆaUE.…9¬IsWÁ= *Š*îK,ISVaJ¬(XWðAu¼ÖÉ[Û ùºçw¬£à£ÓnZ]ávZõaxƒ¨¶Ûá‘×f0êÇü·îv¬½Ð·ÝÅ“¯m×ß0ÔJ‘•®æ–[^›D¤÷BÞ:iðî>o:b ò‘‚ƒÖaCïk¾Tž¦`–8;c‘Ò«o·B)Qªt,à1ÃòeÙw§Ž³ëÙn(üíÏ-Ñ mÏ•¬':²0tä0ϰ8)cóÔvÚÂ'Á£É¾*èxŠgÒ ôÉÓÈÓõÊÂÖ6y Æýi@¾¾ãºÂßrxˆ€!w©ç?ÒRD†Ìäâ%ù& ¥éo•äÝ®piÄëÓWކ#Ù˜à¿o‹VÉWCïâ(Q¤¡Oƒ!§O;C>a$×É.’·‹8- böÁ*¿>GìЈ÷‘øYy3Ò3+gHšÕ3(_‰Îpƒl±¿T7®à¦‚[ –€4…n#?¬nQF¸zõ°”¡õ0k~C²ÝH_ì‚®}u—ÇÉYB™<#I£ð SÂÉQØ"«ΡЉÔ?PKqz‡¼ úPK7A?org/hsqldb/persist/LockFile$FileCanonicalizationException.class•R]KA=“Äl²®¶ÆøU5¦­›µ²è[ñÁPEˆ-}œ$Ãvì2wÖRú«ZÐüþ¨Ò;&Фé˹_ç̽3wnþ\^ØÂºQLåacÚÂŒ4fMfÎx¯r˜7vÁÀ¢…% o²±à:R Sõþû2òŽ>þhŠv"#U%¶T2ÙaØwëQø_õiØjømk©¿5¿íÉPT{ò«ÀÿœÄRÕG¬3djQK0ä‘|êwŸq+Oô·‰u(´æIŠw´‡}ŒcÙƒ1:g°º{&Öˆ gÅÁ$ŠV±FÍ˽‹(›„ë ‚¢áýK.¨q)Ùä¡üÉÍŒ÷Ã2,>Sw”q-äZ ÍPÖj—kñ@:6oýï6Ìç]ƒYÞn ÕbØp¡ý“ê¿`u€Ô8Íd(?—D½Ãüa± óI†‚Ù"yiòÇñ‚ð%E³gÈ:Þú».˜·qÔoàV1Ašk‚,#;â#õ«_¦…÷ËR·åÒÒ_ºÈx]Œt-XFÑA®ƒüî5a6J(cŽÆ+ám&ÿPKïªC ¯iPK7A7org/hsqldb/persist/LockFile$FileSecurityException.class•Rm/ÃP~î6ëVõ²™wfÞ»" M| $’‰„Dâcm7Ušvz;á_‘°%$~€%εI*¾<çíyÎ==§/¯ÏÖ°¤¢ƒi¨R0¬"Ž™•ÞX ãÒNH˜T0¥`†!pKøÃdùܺ²L×òlóˆWêÞì\Wx-t|¯DÄ ÇsÂM†½ì¶y&.Ýê©YãpDh–ýÊÅ®ãòÒç6aàxv)²qñ˜!±íW9CÚæáa{š)½øÇ<*±÷¹–MÒÜWzë] ½˜Ó ¡‡a¸³ºUwÜ*$g^Ãr°HCZ Y/È„®¡ˆœƒa5â£ç$|’að—¼¶çy<Øv-!¸`(FµÞ²ÿ$íéˆ×þ{ ¹ð¸.1iÕjÜ«2¬è?о¥Ú+uðNÏy%Œä§B¿•b«?+À•W#/N~/úû)¡8AV3––›`ÆÊbwÀ»"Cš+C–‘í2î»m—éÀí²Ø{9ÿ„øI £‰®’Y…@*H5þÐMfI¡"Fi¼Ììμ7~3?}ÿຨázÌ uÜtÑÁ-Ž WpÛÅlrlqÜåè2TÍ$ÕÝ>ÃÆ Pãx¢?dG£x*•Nµ‰Erò2Íä>MóÔÙ6<èq„"ì0DeÅ_I¡ÌH ónffX½ñû£c™†æ"dQ–”¤.ý †NIžÁI"µîîöij5S Jó1ÃzÐ,ØþFiníÿŠI¥ ¿°–¡1%„žj#ßïϨ׫Áå÷½Côi‘ê4(Ì÷­°´d8VgŠ®Ò­M7‡¼F_á„稜Á~¤Öæ˜Çä-¦~s¥ÏXDßP½?£Àa÷“ûsvÞp´¸b¹6¯Ð¤÷òÕ0:ûÇОgÖiÉáר×¶Ñü PKO)É»» PK7A=org/hsqldb/persist/LockFile$LockHeldExternallyException.class•R[OQþNoÛÖl¹)E\u[(«­ZãS›ò‚ÆÄÇ=)«ÛݺçhðG™h"­ÑÄà2Î)‹hš°sûæÌìÌ7þþü  ‚ÇYL¡Á$µ¸f`)‹®ë°¥­å4ndq+iÜÒþí4îhm((3$BÁÛ ¬ÉÙorg/hsqldb/persist/LockFile$UnexpectedEndOfFileException.class•RmKÛP~n[›6Æ·®Ú:]­Î¹4*A?É*û T: Š‚cs—EÃMÌßµÁÖ„ý€ý(Ù¹¶é\`_žóö<9çÜ“_÷?~ØÆºŽqÌ¡cNCEGU•™WÞË”]TðJÃ’††|Ì †¹ö¥óÙ±ýÐnuZ·]%~(šÄØõ…Ÿ¼g84ÛaìÙŸäuà^Ø¥/»v¯ü€7úÀž}’ľðšÏ±qÆÛ]ÎPôxr<ì_5ÿš@'Ú.¥ã‘¦üÈ{ÚÉÀ$V ˜`¨ŒV÷nüÀå±â¼1ðekxKÝëƒÝßÕUÂ4Ð@YƒÅ°“²æê©à·ï&Üm ·óQåþÌʰ˜^6Ž„àñ~àHÉ%C#­Ñž#ŸJ'Fâíÿ½†z÷¬©0ïD.æù í¯Ôðýš#üÎÅ%í™Ê/$á Ű2,¶ þR€¡¤nH^–üILNST¥8GÖ°Ö7ú`Öæwd¾ŠÒ X3dÙ1ë2_†e:÷°l!óP®Ý!{ÞGÎêc¬‡|I#PŠ =uË„%R訡Žy¯†×¹âoPK†(+°jPK7A;org/hsqldb/persist/LockFile$UnexpectedFileIOException.class•R]kÓP~NÛ5mL§«ÝGíV«›š¦ŽàÀ;v±¢£Ð1P¼ÌšC–NbN6ú³\ þ€ý¨á{Ö JÝ»y?Ÿçý8ï¹¼úýÀ::`¹ +Vu䱦"ue=)¡¡ôºžjxÎPŒ¹#CÁ°<8uÎÛíþÑûÑG‰Š.v}á'{ æ Œ=ûD~Üc;â±ôebÂá·~À»SzàÏþ”ľðº·la(ôB—3”=ž|L»¯ší;úë„:äR:Qj7°Ù>±eÀ@…êÌg÷ÏüÀå±Â¼0ð5/ñŠš·¦‹¿k©€i š‹ámÆ’[ŸE|˜pW¹3ƒ2Ô3rF_÷GJ.ÚY-öÉg¨•9ç¾WPž7•,:Qą˰mÞû/”¾\wt|JKfâKI8 142†Å¨Ï 0TÕõÈÊ“½ˆ‡$‘·F~´au^OÀ¬í ä~׌%âLQK¤éër?Ò4:M[È]§›ÿ:AÁš`aŒbU#¡c”Æ(ß𞑬CG-Ôi¼&6 åPKcXÝ«aPK7AAorg/hsqldb/persist/LockFile$UnexpectedFileNotFoundException.class•R[KA=“Äl²]o1ÞkŒ·v³*K}ì–>( …ÔR¥×ì°®.3ëÎZüY4…þ€þ¨ÒoLI%¡/ßõœ™3ß7¿ÿÜÿ°ƒM¯0]†‰³&ò˜Ó•y-”°¨ýkm– ,Xe(¦ÜWR0,7Ïý¾I÷ Šù¡Ìä•ö¯[<É")<‚~ˆD”}døj7eºgê2NÝ„§*R™Û”­ MõºžÝã,Dè 9ºñ¡°'ÎPyvÔS´b7†j2 ÿ™+å‡D®>žßma ë,Œ2Ìöww¯¢8à©ÆlX˜BÕ¼%õîXÞ×uÁ¶Ð@Õ€Ãà xøú7Á¯ÞÊxð¢\šñP„õIžîžR\14]·ë+þŒ:Ú—ïüï–ôò¶¶E?I¸¶í`ÿ”zSôúð_NÏé©ñ¥LvK ‹Äâô7*z“å)Ã8Ù Êæ(/·œÍ­˜³}‡Ü ðȘ$N5Iž‘qn‘ûÙkÓÒ{m¹Çvíù“ N#m+Íh£ÔFù‰·B¶B 5Ô1OòjX+”ÿPK{;ÿÛ¯‹PK7A6org/hsqldb/persist/LockFile$WrongLengthException.class•RMoÓ@}›/'Æ)4¤4!!MKÚÚ•¡ÜâЈJ©R+Žn½rÝZëÔk ¤6‘@â𣳉(‰"q™y3ïíÓìþþóã€Ctu<ÀF :žhØÔ‘EM!u•=-¢¡Î¦ Ï4liØa(„\øÉPñ6AòŽáµ9Œbß¹’·¡wáŒx,™8Ãèòæ8yoxí~vоsšÄð{ëŒ!×<ÎPòy2LU³¦Eº:!¸”®Oíªi-ò ¬¡cÀ@™as¾{ô)=«™]Q5°‡}º¨=3ÿ¦­Ó€…ª›áå óó8þÌßû/—|”‘ WËaãD÷CWJ.¬UÂG®äÿPËsõáÿîT­”öG±àŽF\x æ’±(ÝW¡iVµ‹I4ƒ+¼áÔ/*ê‰(ËR¾†‡QU£:O§aw_LÀìí{d¾SÆ:qfSëÈPäí;d¾¦mzÍ´mOEÖOd?N³'ÈQ¨hcŒâ¥o)o›b…u´ÐFìµðÐ ¨XE™cAï2ëì+Ïų¡Ç Ñ ,×aºÔ«>sámØ†ï Ÿ!ß-mÅðÅjº gÚ'e(ýïNÂ$´P¦ŒVK8M†Eí’°Wüª´%9pÏËO_(n[õ8tÃuö…]? ĺç‡ÛîSqpÎÑè6.»€ž†í:ò¼¾#ýžì2,–éÞèþ-ž.ƒ¬Dd‘&4F8IZ-NÀ ‹Ÿ!}"]Iõž¢$Ò/¾!ñúÉ zŽ‘ÊrÇ«±»H°ð ÒOÈÙÞ#ÌÄî¬û¿ /d)g¬˜[ü%9éK8Æ8ÆÁ8&N1õ“žˆü˜ÄÕ¸³iFzü¬.gGÈ„æ1ÔHÓ÷/;‡ÔWåH\"˜¥‰úQÄ"e }+ÙûPK—-í?H,PK7A!org/hsqldb/persist/LockFile.classY |Tå•?'ó¸7ÃM˜ ! *ä ¢¢!HH`’ 0 M‡äF†™83a­µUÚj×V«V¡õQÛš¶bËC’(Ö¨´ØRû´µjÝîªí¶v»nŸÖmú?ß½3¹yþÈwîùç;ïs¾ñÔ?}œˆÎãW}äa#C– Ù>žÌ~s4øè.ž"˹2¨¯©çùh’ “xšÎÓæËÊ |”Ã…>žÉ³df¶ ùB´È‡‹æhZÀ‹„ôy>ZÊ‹5>_§|TÆøøB^"ÃE_,ä*YªÓ+«4®öÑlÃÊ%B`™ÆËu®2µ:½ªñ Wúh9×Éj½Zx•N¿Ö¸AãFÕój×ø¨ƒžël®}Ô$,4 lÖ¸Eά¾/•¯u:½.¤Öû¸•7h¼ÑGy“Ì\–’È/Km2l>¶Èp¹No ¼B§?³’¡]Ž}XH‡dتq‡ èâJ;š:oØ¥óvòïJwŒè¼S–òu: sÔÇ1î–á*YŒ§ŒàÓ9áã$÷ȰK–vûøjÞ£ñ^AþM†kdøˆ ׊Z?*_×Éð1>.Ãõ)z:“LÜàã}ü ?©ó§t¾Q¬{“?Íÿ®óÍâuŸÑù³ߢñ­LÄd4F£f|E$”H˜ ¦)›â±hWS¨+ÜQwu‡Ù Ç¢L¹j6hF»’ÛÓ³7DÍ«»ÍޤÙYŽ˜Í±d}¬'Ú騑?rGc‹c­px­.ÚÙ²M68– ‚±Ž fä’f<ŠDö8V§ÊîõfGO<œtÎÏ”ù¡h,îEÂ{C2íXϪ %œ·Ln0CñäV3”\×#Š` 4ÔÕ¬k­­«imoln­[·±&ÈÄ«qtE,šH†¢É¡H ÙÆnl_[³reÝJ&OSͪÆL[j™&mX_·²}]ݪƖfjtIB©k[‚AL·®k¬[ß¾²®¾fC°UÖ|oÄÚÚu-këÖµ¶¹à•¡]¡ŠH(ÚU±>G»–êü9¦<µ˜ô鸻½¹±¥½¾1XlY±&uÙ,—‘iôžáóy#æk6Ö4kjƒuàDdRÛWkÖ¯gÊq°§\j)T‘ ï½ÎÆâ]ÛWE:·VDÂ[+ðÙ*kØäÞ³1e[çñ 1£îè%·3¹â¡mB"µ¼.íŒí¬éè0 {«71;™2Õ…­¡ÄŽ‘újÙz%œ ;³£ænp/þU¯®=“¹n3ž'’© ÂߊX'6f­O†:v4…º[C[#&r7®­ GÃÉKÀâüakÐ&¼hþX{M|JÂ8í ˆÈÉŠ5¾ 5@ãÛ!HÇvSbÄö`°9ó‚(HûLzG$–0×ÕÔk|<ª3Ö¢H†"B¥¦Ã&¶7ÃM†W×™1’Þ %ÌäZe„©ãI™µX·U÷Àã}Š'•@âóÓ[J†£Ý=I4C;qP£‘î¡Tà!À’2¼b<1O:Ö³ÉX·÷íF0í³âXõšWõ„"‰QÜÛ¾ ¢û»Ìd:aX‚æÂÆH …n%¶[Ž1Nm§W7 ®…HaìГ1k97õÙ¸³;Â4 ¬E"éÈĪdãé£W£È…»B8”ÕíœW±×%ã{„%h_¶)Q¶Ñ`ÛÂQI‹¦R­/¤hÞ¢… ™ŠæOè˜bh½ª#¢¼]Õ¸áç ú=cÐ#ÔgУt\føN¾ Ù{Z¨2úJ»ºA?R'éiƒ^¡_A-£ZÛŽtšqƒ÷óøzy¤c‡A£· ú!ýˆiÁWΑö þ½¥ñ ¾›ï1hˆ^2èq4ø^z)Å\ÖQ­ ¾›øKôDsð5¶-šˆ‹q‹çû þ²Ü½p¢Óãa9ü¿jðô†A¯Ó÷ü5þ:Ó’‰ˆMP]…æ7 z’ž2øAz†é‚‰±Â ™ƒ?dð7ù[âÃð|g~‹ÿÊà#|Ôà‡ùÓÅ僚3vƒûÄž #š3 ”ãønáª}‚“‘q—¥ï]ä1§åŠƒ¾Aü?Š|’º¬®¥ÞqÇEï펱͑\pœ©â]ed'ÇKÅ•-º#%ËòQÇò¨Œ-Ëß6è×ôŸ?.¾öú®Æš'èL%ñ2ªÇJOô}Ûà§ø„Áßáï|’Ÿ6ø{ü}ƒOá‹þ‡þhÐÿÑŸ :!Éå9ú…A–É›¶m“CÛ"MDQµä‡  (-2¯ 5ñŒš°Z„jd²Ò¢]’–« ú«Í(-2èïôº¢+P¶,AÊe»Ðl—\Û·²²Æ?4øGücƒ"ܽM‚7:P.ÊÃv²Öø§ÿŒŸ5øç¢·HŒ>gð/øi¦YÃÒ¨Üïé“›ìIНÊðKISoâ‹O#bèw2÷²Ì½ _¿—¢—4~ÞàøE$Èd\ÚÔÑ”Gñrùˆ¨:áÙ†êhüKÆÑÛ ~™þ‚FK¸R;¶‡`²H¢<Õ~ü #9Ï‚½Ëmʶ½ËGôTþÑÅZšÈGéÒb žPûk¥Ñ,¢ò8Åï«d¡v„2öSîr¤lŒ}ä~‚<‡Öð!ùm•¦Ryñõ}lÕ(c£F§äF¼tm:96Oq?i‡Õ¹ùòœ;²¼0pÚéÁ’§iÒqò´õSf°û}%‡ÔïwB\'~‡üý˜~Ì‹CK a>ý4MêN@7` Ó$1Šû(+¡&?ØK“›røDihÊ «º¤r«1ÛŒÙ2{¶ðeÅÒTAÁ‚p˜Ër¨˜*è<%’°ty†0¡ÑÏ„/ÖèÙIC”I.k‚­™lŰg~Niómv ‘2oÊ\â-ØOSЦ¼>š¶ŸÜ‡{ÉS©[xþàÖçŒ%Þ^ TêÇ©°­803_ï§YƒyÞ\š}û~*ÊófÞ~"«­s6>NseWž·ŸÎ y5ÐçÙKÜEyns€ÎÉ¥so¿›rŽÓÙ„É~*< .5H7•¦“ °œ ÀñçR‰‚–äe”9„%MI©¤£ZN³oFÏgO7†èlòÈ¢Û-øAºP=/¹œG_o+#„h’kKÁÉI:W@0>F%½4-£å%ýT1ؤfKÁ® 4³á€Ó< çóhž‚›“ȇ<ÔèE-m…2ŒxiØî™m»g†ë Y’¼|Ƶ€ülc3üE›á­´œ. §óÚÀßâc”‡9Ëç÷’¿É²×¥b®bkû…ØÔK3G,Yb# [ç/>F•"f.Í‚ `‹©Ê†ÛÓOžôn4a€¬§!Ç•Íu¸–h«·KÛäŽ@U?U+%-n.)n€,·‘šA[ý—(õVr瀧çÐ2ËÓüL&w«ÅÊ ³£ãØr°S†ðĶz ÉÿßI¸«PíãéÍ® ÝSÝò}?•MuCY+ZNu/¶ø^ò¸ªopsïÐ˽´°Òm±¼2ß-< ZŸBW)´,…VH\O>N 2QÖOJŽLDóCàJªSp}ZŽBÒÿI‚ø¿xöÛä‡?߬Ñkø;=Y 僿*—w~Þ°Äâë!”Žõ;8ÈMé@ÎË¥ÕµðnB%Æ=s:NMÊýÔ -·ˆ­m*†\Š,µnôîfKÞõe"n³e"Aj©·‘U‚”ÙHÅ`¥×IDË÷ª˜™A3!èJ0¾Ð ö[ ˆ9°‘@Á/‡a(x \ à»pNð]öùë!°ào¤›éÌ·Ð>…[ 2ÃLr#3hô~ë–yšß&Bj3?„s®ô¤Ì¥œêµ ×C¨AÚð)BÿmV2`ˆBð”2ÑïÒu©ʰ3NëIÊ0@öÓÌã´±­˜ûiS°ø]–™Km%î>ÚrŒZ§%qSFN>èý>Mo1¨I²˜eÑË·éÁ鬯Ë%k9(¸ˆg‚À›éØÜeÇfµä¾Ì>ºB <¿>4œí©à¬·‘U©àlwg)¼@Á¹°•À gpn°ôøÚÈà´ü8 ¿wÛíµ9ª±9y|ŸÍÊI}x˜«“«“«ƒ«<ÑÏQ\åAg®Ú&à*G~-³}xrKŠK û`É“äÙOÅ%èJT¨=MR47Ê¥«—²e¶TáÖƒ*•§îôhïÐL8k5\PrØÿÒ[cÚ–‡©òJÿ9òk½\l/O±nÔpÏŠóŽá  ½Iõèæåg½qÈv´»¡?Ó_ìåe¶l¹î*T S©«ŸLWU/¹› bOB7'ÝoåPÆ h7T¯qJ.þkú®*û®³ÑmÛO³…¿“4ÝNGû•^DMn×®ÏZ.'ÿ–VF»x+àúãÔÕ†>b{?…WöÑQ@ b} Ý>Úˆ ŠKå;f}wË÷UÖw\Ž$0ôQò]uÿž¾l²Í¶+Ðc-²üi/ÖÛ šá÷Uv Ðî>ºÚÒû~xC•R“‹²PSj khFª%;¥Vþd’ΫjÐy`mOU.íEsT°og¨&pMÑ}¤®­‘Ìé.ÊDË”íX/’îݯ2iê®)r×L•´X%±Sìï¤cê7€RîsUÉuÕ>ZË•žÂ ½S½÷ÀV¨U¦ UkÈùt]/é•Z/eÞàêz©à™ùž'©p?eæ{ž ÂAÁØØ…-·±å «·±z…•ÙX™ÂæÚØ\…5ØXB6ƒ¦©®#Oéý>–îz éý¼""#eÿ?Œ…’ø,âöŸn”Éœ,õ߈¦ÏJÀÒôåÈÿŒ²uÑg7ì û%–á[ÇßõÐÊ ›ð±œî¦>Qì>†ÍýôI9p€Š±íS²íÆ^š…ê6£Éš÷;æÝÍ¥ƒV¬¹©šjPð¼¨ò‹À Ñ<Ö.Þ€^ª!íÿEäÍÜ Ã­PÕeвeªªœ‚Ÿò™$“§mÉ^„Cy¯²²B¬ª %ãMŠAnâf‹I½ÒïnÊ¥O+cÃÕì.¾Jú}»Ç¹Yõ8ÍÅ.¨ —²*=ê+ß3Xz’<¥ƒeËáý0&+£RÕÜxÑ.Cµ+Àü¥˜ð·EAKÜ Êš´O+/‹°R‚YcüC5ÓØån^-]ý*è#ÓãI÷–ÒÊåÂÉSž°ãÖ á>³ÉzéÙ=7{ü:{¡¿Œ1OBÞ8œîuÖSu•¥ÅUÞè×ÓÛ\þ†Ö6·}k›Çik›×lmÓdÐý-­m~¯FÍ¿¦õ(ÕÐgÒeSðž\ó”«*pKàV@Ü >7@·õÑí*s¸ª¹+y;èó›wblvW+;¥Œ²£ä*>ü•Ÿ€¾å•´ ¾sØ QŒâ€Õt-âƒð·OAKµ-¤Q‰‡3YFþIKcM¸¬ $ïFq¬!é¢djŸdeém€e öâÛ*Ç|d7ã]³_2–_‡ÛyðɇzènÀå€÷–Þ XxàÀ/©G¬‡î\øeÀÀ¯¸3i#àW)ð/PK¾B–ÛTÎ'PK7Aorg/hsqldb/persist/Log.class­Z |TÕÕ?çÍ$o2yÙB$l’ "ˆ›LBJTd2ó’ŒLfÂÌ$€]\ÑÖÚZ[[ ®Õ¶QK•(™AÁ¥ ˆX•ÚÖݺkëÖÚ"‹|çÜûÞ›™0Y¾þŠ¿¹Ë¹÷žó¿çœ{î¹/îûæ‘Ç`†2Á ÷ÀÑ¸Ž¥À7p܉€H]Tœð Ú¸eçV·’ShTMñÏLr0)…[Nž–Ê-MÅ4'dÃQ*0Ý\gòH–³¹ÎqR‘ëÄ8’[y\ŒâîèTƒùÜKp°À‰'á8r=ž‹ <6‘‹I\Læâd.¦pQÄ<йUÂE)e\Låbå¼ÃSÄt'´â žÊ[˜É+OcÊé\œÁÅ™\œåÀYœÍ¸æ8p.Ïçijq>SðŒ æXɼr±È‹™rwÎ墊·²Ä‰çaµŠ5¬uàRžQǃßâÁeN¬Çå\œÏ´l`ÎßæÎJn­ââ^ÈõEŒ~u µ.æb]LnTÑí@ulr`3#maº×0xxö%N\‹>[yÈïĶq±Ž‹ !.Â<Úέ×3Ë ÜÙȰ/åÖw¸ø.ßãâû=¬×êëø=K}†BÜ4I® .ím$IvuÕè,ÚàÖY›~Z•Ôý¤'bfî !â™Ì¢i¢X N¤˜«R$…4M~ã -ðo« x¼M^Ý#ÀÖ š{m[ÀëS˜ FÑ~%ë@3£ÄeºÔX²Go ºšéô“Í›A7 ¤¬W¨RÐѬ‡æ¤¢âáXÓÒÖsØ‹ªXûiÄ¥!ÆE89IZ(žšMý*¿;¨·êþ°©„áZKÃ-z,cÅqžRO€Ì1ûijU¼‚™\0©ò‡èHÆp9+1—Ú²Àú¸¾p.Ṧ˓…bXÎ’¥dqA Ö¥—èî°à:Rp­××µë~w,ßCò­mom$Kc0VZ[½±ÛÎKÈKž’~w‹p8•„Z*v]&AO•…ÓŠÐx/’B#!“zŸŒ–L’Î+™Îšé,! Ä*Þ;´\om3Žbž$š”…Þ é'$IoÎ O¹ä”'X]ƒ>Ø©Á½pŸŠ¿Óp þ^Å4|·jp?¥Žhð[èÒð!|Xƒ_Ão4Ü=<kØÃ-îbh°º R!í^ŸGjØ‹}¤­i2Šj¸Y?¤4û4 ¤€5ø>ÖTºG†JL–ëH}мd¨¹‹ünJ x¶.9:p…nibº~fÒéT’4%™ ½‹Aõ)*MIa…3ž(ç PäÜ…º %US4%â ¦¤ÃÇ£å´B#&Rô0­¨)ø˜˜Ë =¼´©Fo¥p·H€/”LUÉÒ”l<¬)9|v4Sÿl>MÉåÓG{TF(#5%O¥)£áˆªŒÑ”|ÜÅç4àóhÊXŠ2Jyªrǧ‘ |B„ëÌþWí ÁÜÊàÆ¶p`ö¬™íº–Ó2Œ›ÑØ%9 rBŠdëfNtó%%ÕbpvbàÕÆJÎJ¢4÷øç„[¥ùu®p‹\Yó˜š85ðAÊo +IJç^l"”á -ŽÏº“]mt{XR‚$ç’q9ñÓ"$Ê™†PnpaE4ÓLõ†Vð’€ú™ñJ×’ÀNuWë"Ÿ‘nŒHy§wZ]5.¿K˜cL\V;6;>0Öǯ˦Œ‘r›ºöFŸ×-LjØäõ{d‡÷ÈÉ‚ª’>Ì¢*¿_Vú\¡où¬„šíy¥!x’Ùgt”¹Ròìj÷…ãe" ‹‡È’CñJÏ¡lÏÇQHDi‚™ÉÎ"ÍbqY“qB–7’«LI°ªI’õÄ‘ã‰#;™ò½RCJ£´œî½Á­J›Èa|'dñù‰<&ènñv°U—l"T&àš€2ð)•Ï ßšH%‰Ñ;½¡¨þGŠ7—¥üè@:Åžz“€EB@Éà¬ÜDÈHÉŒÛràüéxÔóG8HÔåk«Y7œ²„®Êß0°9}FkÁ¸ÄÁ²1*®`Ð ”û‰'¹ˆtžóýí!ÝCHðØø(HØè<”/qNs‹‡He ©„=Ù)£ÜRñMççF}‹‹žè† òw‡ÅA]¯ „¼FįËgP&þ"•ÏÙÙñ7È*ËÅÕJ›Ñe=£¨*±¹úŸ]+Ý!®¹ìéÂ3¤ j/íN>QG±‹Ç."i¢~…/à^K¤Aa‹IQƒLæT„,ñ8 …¥y·”$þ¤’ØûSÄW€z20å ¡p ÍÍÙ)Byœ† ±ê±‡€ä •1ßÖµÓkŽÎP X02ˆ‚Äv”óť7¼M¬Z%>ö,îüA¤2Ÿ±EK»[9 ,ÔÔÉG­lø8™ýâaO§C¼Éé¢@(6Ïÿ‚AF#ÉšõCF|¢‹Éüª5žâD_ è" ›Ü#ö‘Aºmpý$ÜPnAQÕ þ6.D#½l狞\.Øî7qesš OŒÍ]2ÅÇ.Àïu»|1™ž‹î“°–Ìï Ñü4ÅG¢Œ/YEÅ'䯜6Ê\ ³¿^ùkŸ¯Pƒ—…9(Å3šÉ2¼ǰÞÚf}aPª2aâ0’ J©žãán¸RAá ÔRø“ˆ¨ï…ûD}?üNü€^®¢ÿ€1þ Qo…nQ?‹zôˆ:½T—Ò¯¶Â#ÔšNtzÂä’^À’ÒPJJ·-öH*)@r¨\;z ¥ÛøÓÃØi,_IÔÐKJ¶B ·sS.%¦üë´(9½2D/™=U²²WöBQÔäf "#{ ¯ÿÈ(sd´)þQKüQÂn£ú•’Œ¡)ÈŸ“¿˜µÝ˜Íã·Òoý®¢ß¸.ØLÓÇÒ¯@.9©*©•D¿¼í0NNp’: »¿€?>ŒVöÄLª)Ûé¡,“»HE4Ÿ~'×)]pUEô+¦_ ýJY)µLLÛY›a$‘§v’NhÄÎ#´PŽdPsšIæ=#ð_÷2!õ(”¡R”’¯ØœyÙDÛ» MÜAûd;^K‹ËéwŠØ^¦—äG`†ajžJÍ™{ •+âËÉ>ݲÒ8³iIR©œ>%¿r¹¡­‰jVds‹65[R戽ûŒÂN[ùìtjÌ?[Ü'G5Mêµÿª$PRÅŠ¿À_gYd‰H‰ßý+ñ#øØu! â8=KˆŠÀ÷HRÍ!ÉAÏÀIç™’>±yÖ ÿtNçKœ|ÿÝZqs¢º)æâ’B¿_]º— í€Ë̳7Úf³õÂå=°ºK¼Ë®°J{áJ"³8>=QÇï·Ón2WÀJ+*eÐÝv¦¨ðœå˜R)h}j;ÇÈËfÈíL5°iEöUñ a•EàjJ*"°Iö¯‰Ûñtª>³Ü”“²—]sõÑnk§î…ùÑ›*ù.#Rn758Êaï…kkº`Š©æMí…ÔŸý~×`MaØQ ÌÇâã0ì*|Ž*|Aà‡ú—¦BÈvÉÂiŸÆê(òš²½"õG>o\gZ(¯ ~D—Ȉp½E+#kþØ`$ªü¤¶”ŽÝ ä¤?íOMéÏí’_fÆÝs#íêgeƒ»e»Á½‹Ú”M‘ñËøŽ¢îÏé…ûûà¦]Y¸OPÙº©š,(ƒÔc0Q… uäfç”ôA@q±çÑÅv˜4¦ðÿjóé‚el4uÉpºé¤}ð‹8·È§ê+kùíDbÕ6ZŠý%‡póJ©š[z¡³š”±9·²ÊíݶyeÝ ÓÊ fDà6º-·wÂ(ÙϾ#wÒ–Eﮆ«mØuüENpøŠN‡bÊAj¡„âÐkó£AM?ù*ü[…ÿÄ’CTa$/‡,¨×PZFÿÕÞ¨’b ‡š æs †OTU!@-j j$ǃ:Ù&¦¯-LË|ºd˜îj0ÕÀ’‹„äÉ¢¶b[úJCÂa8’à~½UÜΈ{E¬Güƒ2÷ÀèÿPK츄ú,PK7Aorg/hsqldb/persist/Logger.classÅ| |TÅøÌ{3û^6/׆K@‚ „ ˆ(Á+$‚90 `Ð6n’MXÙìÆÝ ‡Zk­Gµ­ÖÖ£AÅÛ´J[°d‰¢b[Åj­õÖÖ£­GµjÕžVEùßÌ{oßn^ ÿ¿þþ¶™yóÍ7ß|3ó]s,q߃„ž©^2Wy7Kñ)ïq|øÃÒû˜üMW>ÀüCL>Âäï˜üC%äõOLþ¥)ÿö’¨«[1¿^WoÀüF]݆ùMºz3æ·èꭘߦ«·c~‡®Þ‰ù®þóëê]˜ß­«Û1ÿ‰®þóŸéêÌwêê=˜ÿ\Wwa>¬«IÌwëêæ÷êê}˜ïÑÕû1@WÄ|¯®>„ù/tõ—8æ_á,<ŒÉ#˜ìÓÕG1ÿµ®>&”“jñ8Â~£«O`þ[]}äwºúæOëê3VWŸÃüy]}AW_ÄÏ—tõ÷ºúü|YW_AìWq‰_CþèUÿ¤þ“×ö&obÅ[^õ/êÛšúþª«ïb»÷tõ}Ìÿ†²öêó‡^õ#õï^õê?uõ_¸ZÿÎRÿ£~Œ_ÿÅ.?ÑÕOuõ3¯º_ý…ü lzˆ00¦ ÌLT,2L8&/Ó˜ÔY–—yY6d&9XÌõ²<–ïėm m6“"L&b2 “ɘø1™Ö‰c¿SñkšÎñF`xlº—•°:;f3{&G`r$Âfc»RLŠ`ªØœ¯0 é¬ •ôÐLVލhEX¥—Íeó09ÊËæ³Ør‚ÆŽÖØB/­aÇhl‘—.cÇjì8/]ùb/]ɪ4¶ÄKØñ;ÁK›X•ÎN„9c'iìd/maÕ[ê¥m˜×xi-«Å^ë²Ù2¶“ØM=ÎÑÊlv kÀ¯F5é¬ÙK;”Ï a«tv*æ-¨‹qîZ ìI­ÖÙ­Õd§!°“uYìtvh$Cc¾ª³©±€—ÆÁ ÝwuÖ©³.uˆ‘zÎz1_¯3˜¡³t¶Agaõé,¢³¨Îúuv¶Îb:‹ë,¡³mÔÙ&mÖÙ£³suvžÎ¾¦³óuöu] ³oèìB}Sgéìb]¢³Kuö-]¦³Ëuöm}GgßÕÙ:»RgßÓÙU:û¾Î~ ³«uvήÕÙu:û¡Îu¶Ug×ëìݨ³m:» §ífÝ¢³[¥º3DîoÃñÜ®±;0¿SgCˆø#ýØK÷âlîew#cwël»Î~N€ýTc?óÒ}0/¤ˆí@Œ8‡÷èìç:Û…K9¬±¤—>Év£lèì^݇d÷€ad÷còÖ<¨³½{ÈK_b¿Àä—¨hìW^ú CKÁÁ¯}˜<ŠÉ¯½ì1ö¸Î~ƒ…'² ð[=©±ßyéÛì)/ý {Ïà׳ˆóœ—=Ï^ÐÙ‹ØÝKÈêïuö½¬³W4öª—þK]¬±×¼ô?êbýQg‘ü9|]go`ƒ71y+ ’¿àÞÆäýÕ«(ì]LÞC!]1{“¿L}Sc`áÃlöû{6ûû'&ÿÊü#þ°åǘüWcŸPâ ô÷7D{)™ÒõÎ[?;ÜÝ9/êœ×êë¡n `X`é=› ï Æ()Él°,è nŠÆ6H h–%› t½;tâAJŠœ-kM0 ûºÖ»6ôGC‘DKðìP,ØM ]GINª¢v ˜†XŠ:ȘŽöÆ[D°/IÄ% 7é­‹˜z|K¤kY(ŒúcÑþú8jm¾ ˆ xK0ÐÝ o¡dÂ,”¸P´tÅDgK]ú)ÉChS(Šø²Ÿ\ÒØÜ:t¥Ù@–Å‚Á¥áh×`–ÖS’ðš *[¢›â Ia‚ ª öĽ ¡¾PÂ$juÜÚÀÞ‹ÖÜœhĺ?0\_ÃYyá@¤w^k"s´Ä\G7-‡WëÍ!¬…Ð>€±g#–U²c•°k“‹º0'jn †ÍYi’`B<Y^C‰Wô¹¹1Ú4ÇÚì©$‚½ÐßÔí³$û Ö®X¨?±,ë ÀprV Ö”L¨aÕÉN)ëÆâ¡xbžgÉÉšæŽ%«Qò»b[úQJŠÝkD%Jº@Naͼ=дº«+g4ZbW¢Ä‡@b£ çËMŠBñ¦à¦ÑðìþZЊ.¨Ú"'' &„¡øÉ4v·"_ß臾rÙ”´Ð7¬|8('"»S±P JÊ¥„ $Báy]ÑH×@,k:/ˆö…ºæU‹L¬“Ðóì8¶jÂå€ÕÍ©‰FI¬ „‚*š| E* ‚(È…ÕØªŒ`8îۜFâ¡(ø´O nJƒ‚JÓ• •6'švA”B”„²Œ%BÁxFMA·©\NrÒ21à CøL€¥X9Àûµ K §ÊÙǵ5Í0,›Y Óˆ$B}bá@'C}hRS]³> t%ÄÊx:MÓ4-S0ؼÚN¹ ˆx|(JœTêj笡„Õ=̓ Ь’ŒtD-Åê® lmhoÁ»€o›È|Ø Âø9È^<Ò !"Z¹®p4L#ÉJë笃øÈÂÊ¯Ž„Î6ûW:ÇÍ|顸p5Ý‚p¡¸°d D)[ÖLXÖIx¥üx `'^Z¿‡ƒî£@± @ ¤¬tt¿HÛúXtHÌU´^ˆEÐÿÈæ@ê#=Q³XäBÍê¶6˜„Â&bòa¹5V¶H­`@š–¤Á¬KNwôÓÜyX%õØQ!ÌXåŒÑÃÜ'Ò¡NXJfÁt»X>ËÓ,œþõ¸Ù¢p:‹æÄú`Ìæ‚’9î,»ÎÁA¡>EtX|ÈQƒÓL+·Ùë!I‚¶AÉãIR’p™D¤:QPm…`¥ÖAwÁ!é6 ôu™M<ÖDûÀ¡;hMr¥… D@³^fÞTH„Ê#$Ø&¡­ŽEÐ:{AâmçZ¶Æ†Iï™é_Û¶ôeÙéþ³P6L§8Í]8l·˜Ó›ÞÖÛëèµyÉ:ø/ã24O°븬t´é ûôúƒò÷eø'BSÁéæùÜ\:ªaJr[OmËvúh\4Öÿñ˨j4н †,[¨±kœÀn6â2Ò@„X7(¥u:¨{(jiÑÉJ·yrév®Sc aSÿþDÔfEô"Fpqf°ÅGÛŽ¸àØèqCP=¢žÈ;«PO(Øm(g)C™¡L5”ÙJ©¡ÌQÊ(!†2O9ÊP"ø8¥ÌPãW~-A„‰î» C©W`;gÜ{CiT`m¦ŒÖ‚…Ýÿ56vwÏn›½bE__<ŽL_f(Ý .ñ-ÌnµæÆƒýEÓ¸bpUyÚàŒshÍ=†Ò£ôŠ_™¢qÍà:Ï‚YÅFaº:ºPé:" O÷¢* f¸ØºHà†àgÜà9ÏåyÏ7x÷QRâà[6Eas:é®ÛÜìGãaðBÄ+u‡–@¤;Ú'M©Íž@WÐàx‘¡,W¦‚ïÈ Š‘Œ|"Ÿ¤ñÉ÷ó) }cÚjC©Uê e,3/æ@|¢;¿ŸfðÔËÒ†V/·u¡bب@c¬ g[0£½°ä"­íŽw@³3:]¹@ã%†r?ŸaðÕó5>Óà³ø†r8NÛœ1|¡å¤R–ålƒÁä³”ÎîιÜ:tôÀΡ£ŒÁK‘ð|œ·9Ê`2µ}é@(Ü ’ÎË”ó ^Î+(ÑæÊ-¦Á+6(ðyظ@²57éê6ÉàGñùÍaðÊ-†r ªâ×°áÑ |!?79=ÁÍ0¸8˜‚ö c‹4~¬Áã‹ ^Å—˜Zï€úî¨8­ÒSŸùf×tuôHço‚`; [ ƒÏO@vNLÕ@*ŽT&™å.4-=± ( ˆMBã'üd^m([ÀÊð¥8FéÍÍt$ ?'uÈh(Ç Õ9‹×J¡2ÁPa±¾x­²ÍPT.0”bœ’é¸u|™¡<‚󲜯Ðx½ÁW*‘t{å8ò1”” ~ šÀ” ϪÕKêk ÞÀ ÞÄ› åFè…¯RηÎrPÛ1`ß  çÊB,º1ÔæÇ?fì‹#9ÕPª•¥6 <0”ä¾g©f}Á¾*0IæÄâ OG·3¼ l™²B9 %#ÑR²Zy#kY„tuôŠë¶&%Za<ëÀ# C9‡œƒkÐèîˆ÷ û²–Ÿ¦ñvƒ¯S¶A|g¶Šãnvô6wcÀBìiã?]¹Fk"uË ´#þÈœOMuÍŠºZƒŸBþDϲƴ¸o\SS Ѹ¦¡¹æ”VˆýÌüp§‹"ñ€ˆµÌ`§qÍ‚U ÿ*ï dÆ!0‘~žÝeGXngÖº–úê†úuÕKê ~&:µâ¸­žp¨+à ‡Q ÀÉ*ÀÉ Âf=Ö^æ Ó®ˆ{`~­Š.¬Èw¶ˆ{Þ= ‡àÚàÁQ=ˆÍà=X11­¢»«£[ìY ÞëZ;Ðß-¬Àz¬|Vwg×ÜÎN ‰DÈ¢²™AWHtDÀ´ü,áa.`bq¥ 6ú€8z±ÐÃ6ï@f#˜ÏŽDl Òeð>[Æ{;â¸Ç1x§;ÝÑ–H?Ѝ>i"½a"CqÔƒ÷cÀ‡m„°»sÁÏ΄bhÀc£ [Ï„‚ç6x"Úß ¸-’céƒ"ØŠ’õh+f¢½™…Ɉké]$š%ì§¡‰u…Ž:TŸ¸ØG¤L¡KJ9NJz… ¥+ŠlûÜ)È›S©ìB•ʰ¿ŽêX]˜RPˆW:¸4”J$ké®8a@‘ léè …Ã!`h"øF#¤ô L·Éãшëw‹3ƒBóDrnoL"Ä0aC9VŒTjL€‹c}Cy-ú h7ñÍCwÎåçükøu>ã¯sðïß0ø…Jz8`´ü›ü"è!‹Ec%ƒ.A¦\¬\|Z®^Ôaü-ôçcóK4~©Á¿Å/Óøåÿ6ÿX±°É¨]jðïò+4~¥Á¿Ç¯2ø÷ù e¢2 êëš–×7ÕI·fºs®Æ¯6ø5üZtÀ×ü‡èº/Ä•K ¾•_É ¿‹Û°ÿ›èòfƒßÂR‰ýßjðÛÐÑß®\}ßað;ùÆdðó»4~·Á·óŸ ŸÊ•Ê÷ å*ô†ßW€¯«•k åZå:Cù¡2h([èïg|‡¡Ü„S¸Å"?µ….8-ê}ÿ¹Æw|§6×QŒÀ,MC‰¿r;&wájÍEwüò ƒ'•+ &yt…ý I»±ÃðÕIÊÉ1ø½ü>ƒïÁí~ƒ?€-w }£r^½¦¡6ǃ—ÌíúÑ)™uðÆÂW!î^Ø^º#yÐUqpÄ[:c¡nqVß-6Pü!JŽ8H¤ {“H¯àú‡äZvR%£ þKþ+J¦»ï©ÓFùpz葎6ÄuïoðGø]ßÇÕø¯ þÜà¿TWž4øü·‡üw(‚Oa4qt„ÛÓƒQk©«®ÅB‘¬šæÆÆú¶¶:xÆàÏbûç8$Ïãª{„©ÂAÊxÂà/àöì9þ"& ú/ü÷üÛ½‚#¦“÷Âx’45s ŸÕ±X`‹¼ðÊi­k+©­n«^ZÝZWý¬nª?u5¨(kªnÿ*ÿ­Á_C5P–× „0¤¶nYõê†6Àn©k•uÍ-í8¸æµŸÔ­©k¸Úм£(ÂĪ⠂#eÀam-Ø_VÝÐ ¹ÖR·|uCu X‡–ºeu-uM5«µ~bµµ¯Â¢ÚV Ч¶®¡®­Ù]ÌÃGV[KuSkƒøVÛÚê1¤jnª©nÃþV74 OËê[Z¡¬AÅšºøÒÄÁ6ÕkÑÖšê$[Û .‚›ªaß­547-_ƒ¬)õ­bP–zZÛ›ÚªOƒbíÒ6¶bUc;¦Í-Õ®ZßÙ‚±êš¶úæ&Ùw[K3ÌBV}k3°+ :@–Vלˆ2`-ƒøº '©î4C[µàG7§™¶r&¼Dà•àd•Ȧ—Õ7ÔµÂúòµ-õ8^3XÝŽ WßЀƒò`ÿ«W!cM5-ubù¸ a(ÃB¡–êå8)õÍ( 2øŸ±"?SÒ þ:|¢$YRßT²ª¥y9ÈJ«¡¼¤¼a¥hŠŠ5èï7ù[¸å;·÷°bØË_À¦JjE´ö6õø¯—!p±I!6©(1IàGï9èVÞ—bqi4B›V°ðï£ÊL¯„ÄîÜŸÜO–D{JBbWÞ,m-m({‘Ë¿ñ þ!éaK:/ÝLÉ- LÞˆ³ûž&!»7ø?Ðaä*ñþi(ë•Áÿ…1ÔYüßÿ²Mc_ücþ_X”¹b[Â?Agø)nnfd¬ô$`)‚¾µ1ØF¢Õ™äœröð&û þ¹Rjð/øÃCSÃS…g‚§ÈðLôL2<“±è‡õóLA1qÛèZW¨ln4Ü«¯`bñì}æ8ް))9Ôñ¨æ)Nw‰¶­n]èŽn’·“2¤6 îhœº½%ûk˜ïÔ±òôPë±ê„¼ «Á¬FÜŽº\‚ËéÕ- Îk˜#ܯÀ2n]ÒeÜ)Yrƒn|ú$U­rúí·„âã¼íŠFÄk<Ðkˆä Eº£ Û¸V€ ÇyÒxÄ!ÎêÐÒ@Öå’æ‡âÕñx¨W<ºZ‹ö!Ï£Zà}®ä9þ^Þ§]zúhDvx3ÏѺžvPXnqí"Õ™’Ù¥nW¹£Aà%¢ ûa(ý*¼is–8l ÓÐ¥pD¼®/Éê#+±ÑŠu«ÁPrX麃߭ix•&Y&ºÈ$H#P—áýO·U!›¸¾2€¹÷u:ÅG?ã>2•w~–µ‰ˆ¡ÜH~åý ¾-„à™’ÊqÝø˜'¨ø˜ • ØÃá )œÜº°yžНAÞ¢‘ùÇáá¼S™g»]þ¸Þ-‰ë×¥Öõˆ,;_™ä ÄÒTs渔|¢kÿëÒ—NlWçÕa f3(óy¥õns4–_"o´3lÑ‘¥ã¼öõæÕLjòܘ¯Ç× n³Zï:«™Ç»"P—rަ³mSTÜý. GqÌhqëÅg<ºœäÖ¡¸ÂÃ;û– lC‚xÝv<ÌI»,D™Ó.»ŠsNÜM_ÀôQïa[uãlMoç“çò«:á.Y#Å›D¨ë­š„¥|àbWåÏ 0ð‘z#I¶t|·ÈâáVoºì»q4ÒÊ d-$ÊhÆÚâC ‰Ÿ’¼¼¾À† õT@¬ž«ÝªÇ³ùh8ÑÔÔÑwÜ5V-ÌÍ”±kå‹—Uînac& žñä»1°Yî²Í×·Á³`ZßÁ—"(t¼Ê@'ÍlVb³-ÓÓîlGT£ã5OÐëãQÉùöÊ—Ø\cH·˜çÑòl¶NøâêÄ%¤EA›Ü(G:À|k“ Çé(°%­Í¬–mÚ¬³d±%E”q|Ü„ÇÁòÀW|.Ãcc‰`J’DðÉxR܆Åâqi6ná7öša ÔHq<Üh’½6ÈsázI:%B«8·­í\à,6b„â(nI+6ÇÎâª^¨€OM,)¨Æg$‚/„®îë— v;Së7í `Óų,yt¿:2~Y¾ žšn•ä}Ë<)|èøâëÕ‚„rqf \ÿXR(Yôõ€ÅñÒ~á—i®Ý|^®=lFÿ®Ï¢íXÑkL8n/ WZ[b¡Þ¸Ú ‰èŠàfËí•®tu0™7Û²Bz˜ÜDU:Øm™ãæFjÜã¬ø@gÜîÜݻ姶ñ–ähuMËê[WØoêµKÄ VãöUÚëá‹ǵ£ÃþË ˜~ùŽN<Øa>ôO5¦•Ö4ÚÐñe›ùz?.^Å µé57=¸0àÊ,¦ɺ…€­m’fÁg†ÀAoà3ƒh[|£p–` ƒÛ"·§¯ržÄ™'ŒôbL:¹þüA„­8/°wŒ7yJ<ë ka-IßɺâHÏg÷`Zá)¥sÆzª•eÈ pKÒáøÌë·¶( Ï’÷“Ýö6c‘wŸ…*·U¯ïÏ1ïѪ!ÈÁ—z⿪x·——‹f›É4ÓÑšV™¡é­-}± |±Ú4é¸ÜÖƒ‘­Á ›¡¸m¦XeþÆ<l­’|88ÿP!™ËE¼ ˆ,óèGûiž|“ꈂ®áúø º?&sû\óÿÐOŠÊÿ³'”"²?ý÷B¨æ¥¹ëšï¾ÛJZLt‡ ü¯Ÿe®±ŽDÂ}Ó>à¤PAñÑ’ºéwýXoÓÝoˆä]ú³KÇ»ÑO1S/ Ñäzdpœ«[ ¬K“FÇÁÒâ:àèIbѰpš ¨·Òi—Ö¸àUðU1Γ×`z1m#>Omî‘ÏÉG‡ôŽSÂTTâ<ò]ª!D m­5-õ«Ú:–5·4Vã=H¡Ë{VX½Þ1ö$Cq÷ ° ±Æ18BéëŠÝâ{.ŠÝB,»–É Z"*öð¯vvn–…ªâí¯ˆõj0èu]Bë´ÇÓc¾åŒð¢Ä=:r;ŽpwHz0Ò_¹Xæ…Ô»jÏÁ¡¼Ô*jd„žm>–—Qh±ûSy¬Ä±Ê-þäÉñ®]žTºÿòjÌç̺x«Q§fμqkƒ-¸hAÉÌC¢‹C"¥êÎh,±º´OÊÌcçÉûL÷cçñ¼yÚ&îmÄṈõ[:i‡ 2øÁÞ'§`ŽÛQ%ð¶âKüíªh<$·Cø Üîš? ` àk¤FXç³U‡øÍDÆå“ýw‰eœ•£Ìç˜eSóG‰rÄš°Èh}&u"ÑH6ͱêÎ8ÿ„ùü3’É’¤m³ìWÏB#ÆñÇ öã¡öq.º2—r2¡øJÇŠoTñ'®øBHä“E®à›sQ_¬Lù43?Lä ¾cy‰™Ï9ÁÇË"Ÿiæ³Ìü3?ÒÌg+¥"Ÿ£”‰¼ÜÌ+̼ÒÌçšù<å(‘Ï7Û/0áG›ùB~ŒY^dæÇšùqf¾ØÄ«2ËKÌüx~‚r¢ÏIÊÉ"¯V– x9þZ¥NäËÌòr³Ý ÁŸ‚?-ðSÌú³¾Qi‚l²Ò ýQe•À=Ê-Žr+”ÛåÕį¬ºVy-”OK•I+”Ûå³ ¼ÎQÞåÓSeúw(Ÿá¨o„òWõû¡üUGù (w8Ê@ùL?(w:Ê]ð×­ÅwÒ+ƽ^ AV8g) üw¢8ôNH¢l7¡eê0QÊ&ÈxYB†‰§Ì§ ½Œ “,¬õâWv™Ï&9XÎ-ÛCòÚw“üaRŸ>ø,&೨Ý7q7™4L&CÁßî›2BŠÕ$™º›L&‡••“é;Å?âA•>%"¹áñÂÖ•í"Ó“¤Ä7#Io° 3¡Ð¨ž¨.båûÈ=t@«8­òÐ*m„‘$GVé~½(ÇVá÷°He»ZHæ¶&ɼ*½Ì¯dn»êç8ê!2˜,@Ô£‡ÈÂ*Ï=d¡ï˜$Y4„½`á8Q˜" U¢# Ç‹BA™ä÷„r"R’¥“FÈÉä {ÈÒvÌw“šaR+êw‘Z_]’,&Ë¡X=Hî4¡I²âDø\°‡Ôį”´NI’_#$IÒt/iVÈ"f£¯$“¦-âÑSa!ZÖ‘º"¶ˆñ­äø±©ùZ${]ÒáIÒV†Í56DHÃê!9«aõ Ù3¼¦Jôêܵæ ,òy$…Ó|íI²n+)´Š§³$9âw"’‚ú´ÉÓùÊ^³o³E’|uˆ¼0m«ÍCžLj@Ú[£î`8j«òÌôÊ3Ó*’»6 :k;•$驸žø,ŒÎ"a·tA ¦£ô¤PŠ,”ž">BzÖn²ž ±–K_#§ ´•,½NgÉ%ªâ£«6˜UÐÂp»£OÝM"Ã$*!H¿Ÿ ÈÙØþ²“$KßJØNTò&’èF_$r‘V¤ ‚f[<å–Ù]nJ Ý"½H$ÓU€"¶ì†@Øœ$[€ƒsL¡?w˜œ_ç%É×P‚`–¹>¢ KÆÎGš³M¾¯'ÉUYþ¬}$Ïù³’äe°^ʦß|TʆÉÁN°wÇ’fÒBJÉ|r=Ùfæwó²Xä%`“¢`Ÿ>"Gt]Sú5ålø?¥"Áÿ |ÆsòJâI¯5 š’€¿øÛø)ÉRr>#—ì'Õ´^S6ÒÎ6”(¥ŸÎ“ˆ–NŽJk(¶U¡PZô )Ì:uÚ~r8=üSrÄçd•DY´ŸÌWRFûͳ2Gq¶Õñ~r¤¦lþ”° à1¶Ø9 Ùy©%¶¡Eû{¼¸­²U¸ M°¬—¶—WTî&ß&—•Yu—£R “oÛ*‚4E,Ówl-uB¿k/ÿi¦Áô]q‡¨-In°€7 ›|Û*“ä&›Ðf=In¶n„*æ»ÕÏJv=Dfùn³!L@|¾ÛMˆ.}ú.â½ „£Fþv"ðÃFKó‡H™tOw˜šzç0’&kù‘ ü1->îB>¸ïn´ùЇPÌ|}˜làØÚnZÿáâ~êýL€v8A;è'èç´Ë  ¤´[€Fœ {è>'hÝï= @:A{è!'èôK'èWô°ôˆís‚rõk'è1õ¸ôz ú­=éýN€žr‚ž gœ gè9'èyzÁ*¾(”ϴЃIò’­‚Û>»å~»Ü!ýÞ.Ÿ)ʰ˧ŠòËvùQ~Õ.¿ô YñòdžŸVÅŸEG¯Ûå7LÄaò¦ { `Iò»ü¶(¿c—ÿ*h¼k—ßå÷­â߀—­RÞ·q>8ÚåÃYvùï¢þvùŸ¢>{§ˆhÑoC&ï'+ÁÂMõM-€o:¥(»x?)Ø~2҂ܩʨ™‰¦ø3:ô8ªœ£œkçÏ•à¿e„êrÞ£ ¨`7þŶK?ùoÙó’äcûë¿k‹Q‘«Ä?”„ÿ%!Óào6ü-À?Ùò“!°ðÔ>•:y˜ƒO%•Ï’dÿ™lZô/|*’¸gu» +¤4IH4IU  wfÛ¡ç2%1ò¹9Ñrgy5ð‚çÁ‰jŽïàÍüÊF(ÏÏÏ?J¡žÓˆR lwy¾'Iõ{hV’z¥)o(ßaî¾®\`’š Ýâ'•‰p)3nØn/ lwŠN\åvÛ³-GË·Kˆ¿¼1«W›\V•í¢Ùû¤µÆÀ¢¡üQ,RÃæ74k%«#4w˜:„"‹(ú~bˆAù¦r‘ÙÅJèzAñõD/öÜN¼E»FhÞ^p…eŨh»ÈÙÅIš?Dò±Ü‡åiaYžBJ+—˜tu¤»¨l7-옕âb\ÝG¦U<*Lt”•'iáPþhE9KÒ ;“¦N˜˜…KmÒ MÒÓ]H¹ÑP ŸßR.3),Îë´…lA!IQ<£Jk_Ÿ—Ûí«Ìö³F·Ÿ$Çf`æI'kY˜ßßV¾cÒ¹†§CÀ9ÞGÎ(Â}Sÿm¤N¡þ*C‚Oƒ}#Èbq%·“\¿G…$Zå©ÜG&U>¸ø*sZ’–_2B§WiH°ˆù¹ßã×’´$Å„¨_Å2ƒÿOú/É…šï*W¸Hd¿%‘W*ß3«4« ¤]àt‡Pl:c‡s¶@Öðç]c´Q¥¡‡oOo3 f·‘öÛœ?(¦ó<\ß™i«’m®V®1Û̆F»ã“mrd›Ê$•Ö¨]«\w¨FGŒjôCeðÜ9Š»­Êõf›#@bPfòeaû`™g§5Ƀ&7Øê?Ëœ¸<ÙÄkZß´¹ÐâFe›Ù¢Ýdl NPy’–n…¦¡B—ÒÎð$-"¹ÖwÅÞÀY!™LfBÓ™ÐíL»¨…Í`=½ 7Ù݄̱´‰AaÜ¥u.Gë \BWHa&çÚÕó 8±ÃËuøk¯GJS—E8í7+·˜ÝVšÝNF;ô!ö³OPA_ða’ÎO›˜IÐôV›ã6Sc+±iÖØ[¼²v˜jÕùPHÑ+"Êéæ>¶,ýæÆz¸ÍfnŽÉÜ„bhž{3ÚçbŒë!ðM¤1†‚~»Ýl¥ÙìpÄ~_Ž Æ—bÉšÏ)"‰ºz47^¨½C¹ÓE/³œÖ«š¿¿Ý¬þ‘kõ‡Võ]«sdõ ü‰¥Y]cŽ©§â囥߂qM1‡r´©ÿæ&C9m᳦Á÷Ýö$ùL‚Ä|Ý:¼ÛîÊÏë»?±›O4ß[VlÆo‰Ÿº’xÓ"ñ3›DƒÉÁ1`æãŠó½#ô˜â|ýV’WÌn²ý&¸„Eƒ¨tÏK¥¦ Ó¼YÖ¤(ì°)mR>lL‚é$@‚&ÃçN7ÎéB‹ó{ìê#FäºA’U@.ÁbiaIŽK~nó´Îœ0<ëÊs&F¬–ÒÒc·9)§5Ç®<ÎþZœ¶®9Èú.»Ÿb³Ÿb­¿€ù÷0OK«˜Ÿ=J%¹†‘íåÙPù¸ò¤9äÛ "Å¡]îgö˜Ïu ÏŠ:Ì?ëû\¬#³~mi//ñ›Ñ°_/Ê*òe»i+°Û6FÝj7ö5¢ûÅÅ‚áß™ Ÿ ly _Xùàý¬ŠU>ø]S…[ˆµ•~>BO+«¸—¶Sé:JÊ+¡3èN…ÿ’ôtKkŸRž–ÔT4DÊŸÖ軨œ1Hê¤9º—~…S ÊLˆÙ\¡q„LõÝš¤_mÄs¶ÛäG–ïvü¨Øá»K’:E’Ú~7¶=ÉlS„ ²xíh/¤gî¦ü’$í,¤]IÚ¤A‹àÝ&ÁNI0WnÄ{Fhïß[†Ám޼mèBèIaxàÏ)ÀëðF ð&Öún”€â2óôž®×o&Y…44D<…ô¬¾¿¦Z¼+HtH@~ꈈnØá d@úQªqÖ ïð}|(¨½’¼*0^K`}ûvø®–ãQÀôìð])! ¾ëSó4=I£‚äß$ oŸÞ4 ý^ŠôûóŸ0I¶??[ <¶Ã÷bª—aG/»HRûyl—€ý, ¶CÀv¦Áî°Ýi°{ ö €ý& öÂhj/¸˜”ï' aŸ©ëœÎ9ŒÓÂ|üoêR<†È/*ÂB·°ðdªæO@(ˆÿ€À3ʳR'òƒ Ô1öÐxûnšhDÝMš* éFÎBº R!®k´Ù*X"´{-né@„·¬­µ;Çnwnª ÿ#IÏ ókÎη …ôëH½Ò,\F—û ¿á¤xaŠâ7SHßh ¸5$-‡$t‘“µCRµÉ]ä$wqúˆ@d„^"DðÒƒÌl•o”ä=_†äe™Tv}*—gRI~*ßΤ2òe¨|ÇYøn&ÉûþŸI^‘Iòþ/CòÊ”|}Ï)_£æàÁ/Cý*gáû™$ú2$¿ï,ü “äÃ_†ä¦ƒrù¥H^í,\“Irß—!y­³p]&É_×üÐYÌ$óø—ál«³p½³pC&ý'N_"=9HÖ¸÷t£³°-“øsã!þÔøˆß”Iü©ñf|ÄoÎ$þÌxˆ?7>â·|©iya|ÄoÍ$þÂ8æ6§q¹Ý¦2*>&#ž…±l%ÂݰݚPé»M~y+1³»4÷~‡«3^ë a;šŠ‹ÍØy>´=3Õ¶ËîùîñôN'CÎÂ2'ò§ãœÈ;©Ü•âîîT¿ù³-º:Ö‹’Ûš›±wvE!ÝŽU¥.bElÉ+bê;·š¡¬|¬UPÄò'ÜJ|ù4[`„1‹»Ÿî~êäîgV¡ˆ¡uB"ùÖÌìp¢$²Ó9…÷¤MÔˇœ%IâçNéQÁ›xàäj-]š¦G€¯§5ÃMÐ"OñV’[äÉ/ÉÊ/YäI§u]ŠV‘ç }ÞZGG“²$ÝuFÃLØ*3™†ùê8ç0™bêò4|Ý ç½c5¼0mÒ²ÆÙÝ…Nѱ—LÞdެ"Iï{€î©òTà=Úýký{“¢¼L–~NÏДç4åù~Myáè4Ãsu ÂÓõ`kò1i>XåÒÿMåAûuÞS—„ùâ ­(ø¹¸&œH¦|+_F*Dn^NlÕ”ó P§—¬þXÉ"…„¨ÕT>ÅM’Sª<{èÞv¿g7}(IQ¥•—'i1ëN’©ød3ÞMàItÀ=,Iy³åM²Š˜0 ¿&áá*o˜ˆ¥H¨\5ÛÓ©æK?>ÜÈݨLÞC÷µï¦&é¯ê7qì¦;ͪl6°Ô“ôñ­¤À,ýJÖÉÌ"£ÈØJ*Ìš‡Þa´€>©r°)íª¨hmg…ô‰ÖúÛ½E¬È¸‰ÌŒß>åÞCŸl/b»éïKb#Þ4ó8IŸ2c‹/ì÷O#Ã8–BúŒd;I•©ƒäf°ñÏVåøs%‡ùù>bŒÐçübœ ¨¾‡0¥Á~#&§=›°¼é0ƒ§HSüGåO&§×&Lñ)eåI…”U$ÚXñ(É. U @ìQ”öòŠÝŠZÅý|šùt=IB–IJ*øT¨C}Rñ¬õóT¯Ç6é™b>òþ³9a¯£#y£þRÀSuà/ÞÀ{¯7•·ˆõ‚K‘Ïø¬Ž’Šö¢àØ –Tt࣠ï±ðåH±’e?NPàÅ®E_tûÜ(½m_œvš¤ñ¥qARñÞ«dSÒXq¯bP2³q¯’C ôÕT<;¸]JnRÉÛ û¨¤’?DôJÑùgš˜¸Rzg?™ =~JìÊ”¿Ú—~µÀ%îÓæ8ûk(7û›Pnõ—T ¼—v˜EIڀߟYü†Pž þÿPKcáš¿5+PK7A(org/hsqldb/persist/PersistentStore.class­–sEÇ¿Kb“´¥…Š‚DB"j›R(i¨B‚M[%u†Ù^ÖäàrWî.­õ]9þ猾_”ã³Ïm;—’LÒûG?·{ÏóÝÝg¿»¹þýóo÷ðsÏshe°#0gÕ7_47•M«U–Àٲô¢méöUŠÒÒóµF}=ª»³Óª·®<XÚ©ùA§Ø _»íÝâž B'ŒŠÏb*/jF~ JÙŽŠ6宫.å Éî}$C5«£œž¢©ôöRùB•:ÃÎt¾ZØ&A'|ªz~pÈa-…õ¤ó-3Gr«¶­Â°ì÷½ˆ#i±)Џ‘6ó²´»ªÝØ}©ì¨¤5R8¸ZNÕÈW[“ÄUÆ=‘Ž^ ®°ì¨¦ó›Š‹£W(ÛmõQÿÀñ‹þåíõ#Ë‹Tð‹´Ui’qºãçû ¥—TW”©íh+]zk’¼…8/Ù+P˜w“Œàø^©öRîË¢+½Nñ4Å>»öÕ±·õärqߪ벹È/Sq@&P®"[S¢í÷zN48Õ¦·=Ü>ÅDÕ±;Þk«_©EÃÆŠü\˜HÀ²´ÄLà»î®´_Å*G‚¡ÀÅ¡*&çÀ¢”ä3½¥òä¾ÓÑox·M”9î\¾72ŽŠ»&#ùØqGéŒð8ci¨ÛôÌÎo?à{F`e •×W´ôÿáÞ{óžšIh ”N'wÂ03aRky¤ÖD÷Ðå‘é|N‡Jv·ì‡dû»c-‘Ì'k¬Ñ-K~ìQ!ÌM9Ât/$·<çuŸê¾8ºP”2O…¨ È_½^N¦+Ãz_Ÿª4ÿ¾D5Ÿ¨ÃP—dg䨤1ß9™°˜/ŒÌ ês«]&plG9(>gtöY[ xª­àóFëÜP²Ýð\ú%ËN¤j¾ýŠÞðó–çr+»l»ŽçD+T£²ß¦M¸6~~³˜Æ œ“7à}@ÿ¾§ðÒx‹ZSÔ:ƒ µ³‰vŽÚ$AÏwè agùKaóÌs8Ï\ÀÛÌ x‡ù..2/Q¶æûX4¼lx…ù®2?<ŽûÈðó:n0—p“yËŒ—Gù±iß6üÄè|ŠÏ˜EÃ;¸Ë¼gø9¾`~‰¯˜_ãæ·øÎèÅú%,3ïc…ù W™Pf®™z¬¡Â|Œuæ÷°˜U#nvNv.FŽôÔ’à’ü¢TF Ÿ¬Ä²DýœÄ¼t}ÿ¤¬ÔäkMŸü¢týŒâœ”$ý‚Ô¢âÌâýšÑi 4¥nŠ%Sˆ1D3Œ‘½(5'5±h ³ˆ¯CXŸs~NЊÌüLËI)–¶t”Oá x2‘JÐÄð¤‰?âOuŸéõ6ûœ9gïµÖ¾Ì|ùöþ#€>ˆÁ=U¸¨Âñ!®ÂLÜÇà#¼¼ŸI>Ê'>æF=>Ο¨¤Ù¼¼‰7÷Iž}Š@âÓnبÏà³<ûóø<φ$†™úA&ü+<"qX"åF ©ÀQ7™4êÆC8Ƙ‡ÝX/28.q‚Ç1_b_–øŠÄ#_I#™ŒÄcµÁ¸ÙèM]iìJ3¾¿ËŠ›F»žèÊÐÎ˧FºÁx¬çjc`ƒžì%::VŸwl«©Ç’zÈJ‹Éçgé–ÑgÄ,º :IZyøó&KÚ@ÓuÆÞ~ƒ„T™F²?j­ÕC½†À’|Ò„a&‰S`néWE¢†¢ÉYåZ‰E¬Ëf{Š™½d›€cmüå_£¡› •(h7ÿÐðO køþ­á?xAÃI+ Pá&(’-™Æ©l2õDLd¯žì0P’9bj¨õMråeJΤ¥÷ÑçTwv­îg~–)Y»ò…Ex+ ˆG5=Ç kM(D>‹›tW‘‘s=g<ÀÎYýÿf—ºžéy˜G™d|`{·3R‹0Øïiט¦Î!ÐÃaõÔ˜ZúiÅmº:6´ˆ›ÜéæÔ̤ٙk£0¹$'‡3i².b¸9Щ[½“ã`w Ê=‘0b¤c³çìͤàr ƒNŽ›ž#áiiÅ3­tRGÌ õzŠ6˜" ð»˜ZpŒ_ƒ;yåTïrL˜/–Á÷ÐoŒ tWµÁ…~˜Ðo·~¯ÐXÆO5n²GºvÁÿè²$XMç¶âU·Ñj9ʉðy@x¡lÇ”†#7uæ¦.¯ï0ä°b&øJ·™< ý÷úÆPÑÑ<‚ÊÍ­ôÕÑ7‡¾yôµÒgðèGw®æÜ)TmDwféOA£õ›Ä™#¹"³´I6‰#G27³´I´jE¤@uõtBõ!fëp²¬‚Æ+•-Î'ÛÀUákq5¸¸DœMu”L~'Q×"\ÊM^¿H¡¹Ažðúx2Lüj±‹³5²å˜F"O£R".‘ ÿBJy‚ʃ[ðÞl̶Û-x I½hөߨß.=Œ‹²QœÁ{ââ–m·zIq>ÆL œe5u47ó#ݲZøP /Ã¥ô?È•X¾z®ïøýXè›»Œ›…jÄ£x…5fî£7—‰ÁÓÏæ¸k({µ—Š“d®@–-å6HÚëˆÉòqlÏ5. úÆáCdÞŠöÆ1´¥+ɈU5«S*ke —Å´HáÊ#XsË™Yy ­ƒpµ îmˇH^#Ýa×`m¶«“Û%úoØw\áû³Æ·Òš=<ŸÏ>J½'Íp)¬§&ô ÄÑ”¨§ÀÍÉfpùîgZÈò«¶š“ÜwUº‰áPKx;y BPK7A7org/hsqldb/persist/RAShadowFile$InputStreamShadow.class•TÛSeÿ}Ù…Ín–”Bc¥I[ªaÓ¢mZn P›Z¥xÛ$ɲ›f¼¼×ñèSÛqÆ'_èCg ÌÈL}óÁÈ—Žãù6!$˘™œs¾s¿îŸÿöÀî«x SqCPpS€iÀŒ f5œÃœ‚yjÐp#ŒN °ÆÇg4¨X6KB=Ë*nán«ÈâNŸj¸‹Ï|.˜+BgQÁ=« ¾Rð5CÈòú2ëæ¶™²ÜÔ¼eó´SÞò³~…›› ªmmZ~Öú3°†È÷ó%^¨q"–cù–i[/üC§_²¼¡Ë ç3n¥˜*y÷íB.UæÏòüÔí›Ù’Yp¿qÈy礰ŸbJž¨=|—Ažq U¦Ü(œ”N3te}3¿±h–ï˜9›„ÚÜwy^ö-סÊ:’«ÓBI!œN Jö6¬2¡äÂ0U£RÝ–]3ìÈۮǷJ÷xPuF”_ÓÜb —TɉvÔj®Ž$†u¸®ã"†t\àu¼¡cRðÎゎQ¼ÅÐ{Øõôr#g†³×6bІ`9Åé-Ë.ð )G…n•kÔŽ„ãú‰¼»Y¶¹Ï:¾)@ކ@¯< ".鸆ë ÖtE&%X ÖulÀfˆ{Aƒk.=*,±æVµ8ã ›:ðäÚD‡ êf¼Y¼äúóî–ShªéÊ ÃjrYã2œ>†§§‡WflÓó8M·û¨U˹už§‰\lŠd[¹T““´ãóÊš™§r:Ír™;´B£ÉÌ¿Û=1ÜÆªO€v€Öà%â°ïÖX g’튤;. -Öà ¢Só¾wò¥ wŠ~‰"LßÌ™b_cͧ3[gS¨ÞcØTºí‹b›ú»¸L $ã¾ÿ2DÉÅ,÷épæ¶¹CM—M¿´dn’ûžöò Ô áúÒþCüè6|©ŽéB€înq=ôÒèo`„¬Þ t$„÷#{`Æ>B†ºIÙöÐñ,pÁÄ]‘¢0Ù¢`ÂdÕØEÇ#(dÔI¤Léá#t„vˆRªOö?ÁèÔ•h+ûˆôèUt Í*¢=§j´DtÝû8ý»±B"ͤÀý;AÈÁ0¤H× \e¸L/™¸jÌ•z21â‰dTcDy^EÏNo«òX]ùÊ\4êÇ—e.©#.!âñŸ Úxþ4%ŠˆWÑ{MŽÉÿ¿Â˜ü@Ô“ŠT!Gº.¼Àxk•oãzâQÂáú´­¼«ÁDéÅ„–ÔÞúPÕµ†êZ§D!@« ë̳F6X´Åö]¼Wß–Š<:AZ’ÃÕÇDc›BïîÖKO›GH‰¾×u“íú³)²]Äö‚NõÊ.ÎöõÕ–^Vi]ƒAýLÄÎ­Ô ú÷1°åWÈCV—Q˜42ˆ7ú ï‹t¾ ŽÑ ÝÂÀ?PKΦ™¼KHPK7A%org/hsqldb/persist/RAShadowFile.class¥WûTWÿžìݽ»›š,l`I ¡Òv¹Iˆô‘hˆhBÁn Y &´µwwo’…ÍÞͽ7„à£U‰¥>ªU|@«ÖV¯jPv“Ÿ­âûýÖÁßúƒ¶8svC6dAú‘Ï'3sÎÌ™3ó=3s—K¯<Àøgo€@'rLƘØL&®Šñ TáÅ“£*&ƒ¨Æ1^¼ƒÉ;ƒDÞÅVïæåü|¤ïÁ{Ùî}LŽ3™bò~V<Êä“ÇøÄT|ˆw>ÌÇà#ø¨Š'‚ØË1ÿ8““~|‚ù'™|*ˆOãT§ñ$KOñ|VÅçüx:ˆ|žý=Ãäq¾æY_â.|Ñ/1/óM_ñã«lñ5&_gòœŠo¨ø¦@],›wã®m£ñ#eMh±lÖ´·g Ç1Êp„á˜á^ËnqÆ2©Dë½¥í­d’3Ü‘ÝÆ(™„zGŒÖŒ‘n%·éì0é}Ž5n'I«—;È™¶“vÜÖ½F6ev%“¦ãIJ®iIöª¤LǕ·Íxú1uÔ8ZZõçDÚÝeä"åžײÍÖn©"GÕÇLÛÚÃ^Lò'iÇ1Ž˜©^3;ìŽðj2›YXùãCC¦-Pu°›RNLºf—m“}ãÊ$“N´ÞGbw%[ο3M»ÛD+"xã¨,G·'¶éaµÝJ$5q×H¦¬÷‰Œ)yFÅß"“¤•›ðF‹'‚;Ž&Íœ›¶²ŽŠo“:JÛT¤$Y93+à‰²™7™±øé½#æ/ÌzŠÛe¥$pGtÓÕ•éËŸ9ÈéÁè}Ìk´,íå;›^MmUÛ¦,’é ÝÚùÜz@Ã~¤4¼ ]º±]ýءá͸OC Íêk&Ÿ34¼½ÞŠ½Ñ­(>yVCû4ìÂn °£< vòÝI¤èÑ5ÌbDÃ7ç5œc«óøŽ† L.⻾ǤÃ\¹˜Ú¾ÛšàÒð}vúüPƒÉNg4ü/PNWãÐ=žÎ¤¸i<9ËÑð"~Ìä'Ôm,\ÒðSüLÅÏ5ü¿Tñ+ ¿Æo4ü¿Sñ{ Àn«ð~ñ¤‘1S{»øâéÑ¿–Çžp‚¬†!Nn‡¿¥ÒãwGÞ¸lб‹?Q€6u‡†?ã/#Cmo“ê¯ Ýßðw ÿùúÿá] v‘¾Ä!3Iƒfe…šZúÊ×­Ò%>‹(/¼RÚjõ]é_îéƒÝܬ‡w2 J_¦Ô¡^ªu¹?”ÎdØ8&€ÂN»&]'b¯Å7(Ñ9PÓslÜÈPárŠíµ•sâ¯[ï±Òìê”ËU–4%M=àç5×5ýê¤ß€€†ZÕ$Õò´–œ6øßNÉkyvKNã[rÑRO³Vò>¹<’Óô–œ2Ñ ýíÇô“t üÄÔg!ô¦<ªô–< qm‹Ä›ñ=3Ž'þüzÿp†SG>Žê©ÄÌVƒþ@ uù&iaÒ\i'ž&z` ý„ÌUšÑuž*Có‚â©; øÁÝEÙ\íµH 1±v¤Œ@÷õ—iXo˜«D éÌŸ}Mf¹&÷IµR=æØHeK‡n9 —Jrß6)ý\Ðð·¾mÈnS“ùCA^$áL?eÓI¸ B§Ú„ãXMóÇs)IëÈþÃ},ù¶î<~‰Ã,VI8šÌIrÍžCiF£ÿ7© ¬À®ŽÇ…àñ\ãÉj‰F‰4+™Ö*¤]"ë²Q9ÕA·D6+wmUúô°]";ØåA`«û8pzhøPKâùY53PK8A$org/hsqldb/persist/RowStoreAVL.class­Y |Sçu?GºÒ•äküÀ®ƒy„¶dp0©›ÈBÌË`Šy$¸M#[#%G’ n×µiÝWÚum—=H[’Ò%^²°„«¡[À{‘5m·õ±w÷núÚ³[»5ÌÄýŸï^É’‘c’_‰ü=Îw¾ó_›—^ýâ%"jåt€î¥?ñÓŸÒŸùéúšŸÖÒ×eô ?¡oÊèÏ¥ù iþ²x壿ÐßÐßù–N'À¿¯ö?hý£ þ“‡Ô¿»HfÿìÌÈ¥ÓþE¶|[¶¼¬Ówd×w…Ø÷¤ù¾4?¨ ¥“æßuú­¢ÿ”-ÿ%ÍuúoýO€~D?Ö©_ÐÿW§˜ôÿ'ÍOéi®êôÿÒOétMŽ}5@iÚÏÄìg»+XcO€½¬ëì P„ýp…Œ 0Ç•ÂáÀ/XU€«¹çr­LJS'MPšEÒ,¼D¸xY¦¦ì¨—o ðRnÐy$ÇËå̸¯ Ð!¾Ùf•LoÑy5xä5:¯Õ¹Qç&&=ce2ñT’©®+•l9–y ëo鵡íL¾X4íf,¦`1Æ6 }(šŒZi¦õÅÃV:Ïd[öÙ½•ÌöfSi«#•HXY›º?žŒY§º°ÌdöïV -Òψ €¥TÚF½¹¯ÜAÑcVloÿqÇL€íEŸv·Íwµð¿=a µŽÔH„y7βJ@þäH"‘±Ïuõa d¬hzàXGJ î¾¾mL•ñL/Ίª‚ ÐüÙø•ÉF‡†1ÎŒô«¥ Ó겼ϸónŠ'ãÙÍ8¢±é“֑вoÐʰﵤ±i®›‚5s<(Ƚ2%@­q·ÐõÅ3ÝÖP*=ªÐ„o å!ZãÁYr[•™³-0™niœWBÃ=(È«wiºÝmŸŸè ÑÎE 0ÏÞø;,ûÖÂz4cÚYrJ:õ`<Õ²?õ`grx$Û™ÌZé£Ñ«ýFÎ96?¿?«£äJ=vBÉKÐy#ûjí}ÅP¦Ýå¼¾ëxôd´%M¶¼aפa6'­‚) s~¶5‘€EÛcŒ4\L…”šÔÐP<[²EL\Q–«•=WbÏŽxÂRX£2…«Ë*¢tƒ˜cuÁ¤SiÇi77ÎÊ2q½ÇVÑdj}äfɲ²78ÑvœÝƒÈ²¬-¯±"̪Ýöl9 3$AüòÁD¡ÅeÉ4Ò9„œ‹»ÀD;a–ѬÜe–’Ñ“ñAYQ&ì`µëƾL± 6Í)ƒŠKçÜ®Bì­è´=ÖhF¶Ì™Eärk™ªg﹩±é5Rφy^ŒßÙÙ´mNé"×'—ƒÉø#–00'ÏØR…K–f©†¹å¢£‹fzFÄå4ÄÄtŸø8Óó^g.ÇÕ ÁfU9øt^‡úAçõ(:”C+.˜Z^—´„Y±˜ýV4¶7™@Æñ?˜Žg­®ÔÀ ¬¨ñÁdBÍjbéÔ°Ú¶#²­xã Ù×l#X ÷'3V:«`=H¬oŒ$«co65(CYx€Á-ÔoP F1ƒÐ`”6èi,:jÐ03øVzWÄ=”t·êÒyƒÁ­¼Ñ 1úâ|©Kt†oCCÉèMÅA„¥IÐÁm²ú8=†º hã.tÛO XÃRoüf£Ÿ¤wô4ý¦Aãôðwƒo§w|G äÒCÁ•Áí”5x“ ÜÉ(G–Ïã¹(f.¥óƒïâ­£ß2èËôƒþ˜¾dðÝB¯CDàêÛ†+0¼Æ,/ga‚úè­oç°;ƒÞF÷é¼Óà]Ü©ónƒ÷ÐC:ƒÓn¡W=»&2¸‡÷ê¼Ïà·ð~ƒ{ù€A'éAƒò!ƒ³µÁ÷ð½ʶ>ƒßÊo3ø>áïí2º_š(úý¢Áý²0 MŒ-<Èǘê‹RæHvïQ»‚ÚžN§ÒÇù8„Í› >Á Ñ!:ÄÐGŠ¥ú²¯-©D?Ì0-+#ð"³Ág§kÈóû3ÓŠùB:jçò*Á[ h!;:leZ E|»Þû™ö]_QÀL¬¡áìèÖt::jçÎ}©L<«6k‰ [”$QæQÃ:Ó E”{³éxréu´ßAÏ»ŽÝó†`¹$»¶l½1{§`zíƒ}U'L[§ÄcTmv* ªai²•“ð:@Å”îI%÷¥ãCÑô¨´*♎ÄNJ[¨g}GãéŒMd×ñ5V/µÏD¼¿Eiì`6ӭʦ¶ÆŽËù1G‘ÆëU}=©¤œEà-’O‰Råâ¥82”trÞ¦7¬¶&y¡É‹HdæPkãÔðzXXæ,¾SÝù‡ðò’—Y:šÌDÕ“×AÀ]^&O¸xG*‰4‘ו{ò9/>™Únè/ˆOJ¢Ò÷ ·ß«`dñKv¥´Í:IdE¢•ÆòuM9]Î(P8‚©ÖϪ²f¢†|B£T}´2ô„™í0`œ6få@*yu eßùH9æfÞVeì²<7e¯S5µmݱôö²ô²¶h°83 £êµ²1ØV<;šWW¨¬ŒËÈDÈÔ"„ì´’â«V,Oa!*ªY@È¿ÆJM¥”tÅñè,èÀ S ™h<)poE£…eWaÙÎY~½ÓY®%7þ#ò†–O_Qט~ŽÞ¥ð~žÞíàU*ÞË£¼‡Rý{é}ª£÷;ýTÿAúê?\XX‘£8$ —£]á皥_P=*5ÕlJÿ HúO:ó_rúGÚ¿L¿¢ú_¥_sÖ³ê¬ÓôhÑY¾‹óú}ÚY»+ÂÇŠðE à…µ’ò\ú,5ô¥ÚŠçɸ,€¥­Ï©}ŸaO‘)bG=ïPyP ý{CÍîUNÒ‚n÷æìt_:K‹¥oh ‡š/R•FcnŸþ޽¬cy‘ôXÆjµÛ^ýns(G5¡{/PmÀš Z`ÔÖÑÂGÎÐ*â/XG‹†ù4- `‚‚!ž¤%dž/ðYCž)2ø*-"FwÓXx<Ï2¯Ë:о^žÑú£m~AÍáVpô ¦Ø½ ìjÀyyœBOPkó*Ì ·­ÚAûžé¹lß):çâ˜_w§qj‰h mpô”—ç÷CÍ9jÈÑ2S»|*½™:h-Åè,”³ÔÉ:ªœ‚@ n¸[§Ï^#ŸNg¹þr]¥ÛlˆW æ+€?G¿îhøaèWþ_Å}š2Wðé^ÚÊ9Z>æRLähE7¸Z)Ö׆ÁÍL=ë&iUŽnÑ!ÊÎ%Ò‹tBëlI‹x¾=>ýâŒöêÉ+¬^%sŠ4ž¸F¦NOò+´Ì¾ðøsø:ìØïíBÒÝÚå.°·Òæî"­n*íY×8ù¯ß ‡.ÒÍØu%¹¯‘_§§xÅUòÀ‘ðÌTõ4=£ð tlçC…ý!ÚW“:÷4â0îÖ¡¿°D0~Ö"Œ—qøIÒdàéQ+mZø’Ä à6oÐã:k;_£8¦S ¬qº?èy´dI{œ¼ãÔôµ³ˆš"SokOÜ?æÛ0½ÚóÔ4I!ü"º©½‚Ö2õ…Ca4çç¡" ƒLУè4ã'aY.ôœBmñ;»s´îð8Ø6+Èúqªè¡u² {ݦCeÖ¸™[ ÚBÕS´L§PošÖ’®Ó³˜¨_33"¹Qé[ìY»Øs[¥«¶çè|™\à¶#ÝJ$ Ï;Ëg 4¯Ä¨ VÝô˜2ˆZ‰"? Cm©jÀèV ž*"¶ 1óŠÂ6/=Ÿ£ª¼B7Ø*7ƒèz…Œì-²lZÅÆZÝÔ;³ØÚ Å6<[°¹yjê¦h W¬$^È[wÁÛ$b¯q¬Zxõ#ÜՅ“´³Ûàjoz¿FÎèù$6¯„ +j¿íPû0¨It>fSëÎS« AÃyRá+´-|Ú.Л/ÒíL›N«³|9ºãi‘f“$*üIØ\æü lÙ ™s¥üT‘[éó©)º¾øMÒ’ËNK…Ìœ£/ef¯ÊÌ+ÀY>ï?Og§4÷3j­†¾H¿c¯¹VCÑU@ÿG<ñrøSnp=¦ä雤"e{Ägú`ù›`”60Gw6´FàŸ¡%‚¼*ÛÌTXñ8x¶à¹è7ýN¬“‚]$`rtW¤Â„жF ŽTµG©^ÈÍ ©4½a³Òôäèn8b…i˜zCÎÙfL#GÛdçöÓTáÌw8ýN§ßB‡Û‰Y€É‚íŸ>%ÛöœFd1=Wh»Ðï:Mw^Çhø:F…)Ã4`âÐ}·i¸rÔ3>ý5Ó{IƒN:ë±yÓbmZž÷Í6ïR ì5=¸ h?ÜÂ;æ>C•¦~Dôñ隺ã7AƧ/Ï\h1iרâW%À< ñ¾Tóñ3ù0êäÅzˆ±s6›¦"¨ ÄEP¶8e$<á8poÜÅ”÷óðTcœ‡»™Ñùí^ø†{ƒX‚køHíüühÇp\Ãǘþq&Ò°…‘'‚a"€äø '5œb1“,ý¾ NãÌò~ꌆ³¬Þ'yò)fòiž~†ß>Ëà ¢ ŸcÀÃL9YƒGðy òä ¼öE~ûR5¾Ìj}…mñX ¾Š¯ñðu ßÐðMBOì3–õfÌáØ¾ìÁÔÐ`lÔ0³É¬Û¨[úÉ”Ñ͘µUfæ†mc–ÀÊb4“™Øµ4:fÅÓ–aîÕ¼!ÒÍaƒÙˆbpi2´.0Båäm·ŸFÚê·2¦ÑI¥Œ„•̤×ή]1â*}0e¬íØ)àëÎ Ñéæô[zâ@Ÿ>ªVÔÙ¿¥áÛdez¨NfûŒ‘ŒyDÀê =çÖúDÂÈf»3ciK‘ã4f z_QVw¥ÅжÁý¤±í¶Á=³ÂÉ ¡žJp›f—]> ÛX6ú“7’…|¤'ŸPØ*{¿ñtÉõÎ.‡BµՠÍYKO' 6I¼çÙûŠ©=%šõÓ)ïØ¯Òc)==«Üï|óé!ã0MàÂò¬‹h£›¥Ø%Ç6É_ëS)å;96Ŷ$ÍëíyÞ¥ùäši¤ =Koõ‰ÌÈHÒ*Y Ø4¥LGEÊÄã,©Æ¤8$ÿV;«ÉlÝvL¯•µÂÔ¨®Îæw¬,ë^¥”È||dLµ%»”Ecq+r‘G‰]¶˜Ý¥3²«(îZfÜÞ×w»ºš"WG²¼kÏŒ‡Øik¸ÃЇ¶¥SGøŠ˜¸ÁLZFo&q€êýêtŠfÛqPâ;ø®Ä÷ð}‰à‡?Â%~‚Ÿ ´Ír ‰Ÿáç=¸’r”D/ú4üBâ—ø•įñ8å.‰ßà·~'ñ{üAÃ%þ„k$¶b›Ä\CAWê)Æ_4üUâo¸Vâ:ü‡H$xÛ?ñ/~û·Äð¸„k—2X¿³wc2{ —Ó9ïœ@cY„À|Œ”1âÛ6N£œ¿5üWâ ÒlžAò”ig”¢A4J±@,ÔÄ")𨨋¦9ÎVª: &.º‹E³Ä͸E –˜¨ÒæXKŠÑ*q«X¢‰6)ÚÉmÄR¤r\ÆE¦ìXr~@ô©ÔXöÙbŸrÅÍU k,Ž—™Ò‰6¢§©¬P ¯zj5žš‹/E`Á´b¾Áæ-)蘒ì%Í¡Ž£–Â3Y@6'u'ØÐe{*(NË+èHƒ¡±ÑT2¡[——޲EuzÓT§í˺æQí‡/¤2=gjE¸$4=Ž*0·JfóË\°TfX][s9>½j‘´kšq‘Â…®Çu˜+ô„ÅÙ<`îs¢­ä^M=ÕÕÕ;âÞz^5d"z<½7#õTrôŠ£äì ÖÿMWQ**)» •oº¦úwiìô˜›ÒÄ­ •œŠº9rŒE8Ã43fl˜†ý\йÝUûˆ™Ýj÷Δ•é˜ÛgЪL%¨Ôƒ/Ÿµ=*ˆÙ0µkÚ£b)`º%fJ¾É—R½Ñnâ¦yœ¤>n„4rÂSô”Tr0¶Þ4õ#W[Ij{“©”šó-—;ö4 kªÌ­ª9GsJœÆŽŠ«êO6’Þ–AC–Rj¯5£!ËÝ•jzIîöLVõÀ=®êô Ó*rIEÍlù¸ª!¥²ÝÑçWÖìÔfý|¦‘ c4žv¿ï¸u(õô¢j`Ç$(i;Ûu«ú‚lòÑRR繈˜ä Éà ˜Õ%Òo™Éô0EI´ÃÅÉR{yŒ|&–Ȥc¦I'‰qG™q—I˜¶Y tÀ”zT©VK±q^úQC þ£†R=©]¤q µ^ÛñwÐlœ>zá“áÎðLÀŽLÀ?Ü™CÕ´pø´îGõáè‚ÑÑŽž@Í$¨ÑšÀœ¨/‡¹‘Îð$j½`¸÷êr¨÷ÝÍ7ŸwóŽ“ ~/‚÷Il‚OÃU®Ö@ú.`@ÃsŸ¤ÕR²‡¨Ü/îÆ€£ô\ððxïUÜ;k ÎZ5©Ìa¾‹x®umð(óÌœECŸ­ict <8Ãõ¸ ~eŸ9Ì®-ìÍaáÖÎcy˜îÀš æ§g­ k%X—¯ÉWæùù”pÅ/nÉaQoÄ…%0äÀZˆÃê b'Ñ$àžÆÈŸfá¹:BÐ9“XìÁºu[uuû®_ÇÄ–I45BÏ”àZ gÝë°êwtãÛ›wu§±d7½ú#'Ñvì4ÚÝÉÒc}õâ±è),?C¦$C’×-#÷«§}Á< ½†iºÉ¢{ã ážx?8k‡hK=láÍ®ðèY¬ rÏ•]äG‹\= ô º|á&ò¾ [¢å4B»Ù~²¾8‰Ž.“¯É?°}¶rAxÛΡACŠÕ¥Ï G‡µN0,G¢'Çü­÷èô óÌqå[U Z8h\C¦–¦£8è0ZLŒ87˜À*â§s-N_ncñ }Í9\äb¬xêÙܯÀ+gòî[ó†mrîEeÚØ4‰+D>ÁßvØf†ÿPK“ðLï8 ŠPK8A,org/hsqldb/persist/RowStoreAVLDiskData.class­W‰[Çÿ ‰lœÐà§Ž-$ˆ×i°“| LÁGl7Ii k-Ù];=’¶é}ßuÚæêAë^b'­Mz'½û7ôÏèׯïVX¹R?ן5»óæÍïýÞ1o‡·þýÚ5½øG;q,Œp<‚Çp"Bo'ÃôvªïÁã<<Á OòÂ{ ˜¬:AéFd øí4¿MðÛcžåá\³8Ïö.ðð4ïkÄûñ|±žaɳ>Äû>ÌÃG"xŽi<€òð1 Ÿà‰Æ'ñ©0>ÏølŸÃç |ÁÀêw[YËX` šr܉Ĥ÷”OÌ(׳ì–xIöRØþc©½–7µ×ôM‰WðÆü®ïI|s?À!‰â’ÄðcŽ2þQç}í³ÄO°›‚«ë€*.yxßù´šá£jà§?üÄ^%•Sk‹… ÿÜÀ¢Äeä$öa¿Ävf W%^Ãë~!ñK\“Äu‰{4ŒeoHü —(4äŽnä“įñ‰ß2¡Û‹H¤Ç +’x7vS2,ùú;ì§œ­‰‘ÄïñoJ¼…?ø“ÄŸñõ«;¿Jü Ø^&TE A¸«²b!¨:^G&é@³-æRžê:hA›Yí·l¥sz“[—æEâ^@ ³’Ž€õ¿u´›8V]+Ϻ–¯RNzŠ›…3{ø,õ‘»Ë6LZ*é˜[*àç{Ǩ2í1ëir,Z¾ï¯ÙL Ý0'T~o(š?ñšïѬ­×ùùÔoZ“˜G©uC³šX›V½»ª¯Æ±Ò’½‰Å–1âxº/ÒÔ ¦ÉóÒù¡…Iªl•aŸOêVLŸÛ$] ÈÏ"SÊu7±G „Ê?{£ÉT™ÃQÚ›KŽ=)ÂIrfópOôÖ¢1r /Ór㪤O«À:O¹~A2ZñÓQÞýÍK•³BÑ12Êó]ç‚€¤/â4¹0àœÍR2åQšÁ‡1EÞQ)œªâÈw`ÛOô»®yá¨oÑG;|Ú²m=çÃR&åVtVÝF÷€*8ZÑ7> ©p­|À¥K‘°¦UP…÷•TߘïZÙ ì Ñh ^T|†gžSº]×g(¾>_8<}ͦ›«·úôß|ÛX.Ñt¡ÊPaë×¶b¨½˜Hl(#&B¶31¡È¯;Ê1HéžÒ;Dé"µ±´íxjåR@ Ö/⎭ôGÁNð¿úöï¢ñAšmDµôlˆÅE÷ˆ­#èvóP Ñh4ÅQuäP›ŠÏjtÑ ÔN †{c9„⬻ˆº«¨¯ÁžxÇU5Ðûsd)‡ð"Ãüì¹¾ ÷mE”öFÑ¥ŸÔ$h4PCP=\¯Ù<˜yušÍž×9#ÈÆøÈ¡îøU4 äÐÌoëøm}wm-lt­Ý9lèžjÿì^BÛuî§l l‘ßÀ»´©þÀÔ.2ÄÝ_F„-Ȧøü0ô¬€4¡¹d8ò(Ä·Žž=+|»—qý¿‚Û ÅÚC9´o¾ˆfŽXc{h o;Þš_‰AÄ¿3°—ætG @73‚‹SÎî(äìÀJ2šèWòÂÒA$ƒ¥;i'o¥ðwÄ—±™,ß)–°¥ K³@wSzö¾f mè,èÐM.Ði#Cl*¤wkAe¸¦¶&‡»Žtc$Ðy@X§“Ò÷vò½ƒY]{²o¶n[ÂÝ×YÐÑ{#4õšvê’|£ Pî Pš2ÛçZÐþ6 ;nTÖ!£Œ4†#ÁÞgh'gJm¾¤Ù¥µ%èØA¿-ô¡_"FuÃ#üìšÃ®¶Ðóhæ (>‡””ºo6µ….R!–HŠ2\ßiëÖ·Òüè ™ç2S«ˆÌ΀ ˱ñƒTR=„z¶‘(õ®æ±uÑ›R2P×ÙÖ¶®I'±P7½Zf°]×MP2\´‹¸w÷ñÛ2zs¸?&.£&Ÿ`üPKÿ&'?mPK8A*org/hsqldb/persist/RowStoreAVLHybrid.class­X \›åÿ¿É>’|PÂYZZ{¤_BQ:…¶ƒÚ`¡µ`»çÂ'MLBçæݧ;ª;Ôl®ÛèVÒbµ²K§»Üåîûp—»שìyÞïˤ’þ~ãïùÜ×û|<öÜýg´ˆ‹]èÂ;œØ;xx'ïâáÝ.¼Gyu'w¹ð^¼ÏÞï¢íx{7¯îqã^|·b¸óðÆ]ø(>ÆÃ}Åø¸ Çð Ÿäý§ÜhÇ„“VÇyõi†þŒ'0ÉÛƒœTqÊ…FL©¸ß…å8­â{YžQñNó† ?ëÂZ|NÅç]ðã *¾Èû‡„þC|‰uá1|™I…‡¯2ñ¯ñí×yxœ‡o0ú7ùâ[¼ý6Ã}‡Íó¸Oà»*¾Ç›{T|ß…ÍøŠªø+þc7~‚Ÿòð3Fü¹ [ñ ûÍ333*~©âW*~-àC 5;bñÁ惉ë#ýÍÃF<N$›·“ÁËÃc Ãô‰D8mð G»Œ¡X|lwì†-±‘hR@Ô‘„±5œ8L»ýÅá„Ä(‰Çn ô×Ñ1+Úކ“›®ñæ²MsÈ'Ê.s6¢Éžd,nl‰E"F(9º7Ø16FÛþ5{”-±bWÒ“ †w‡åµTþ7*žTñ[)¥©Š€Ý»†Äv&ŒdúDñ‚(4’¡ héKÀ¤±€VxóIl*¿³ÿÉÙÆÒØMàμ¶žN)°ÒÛ¹aPm ³/ˆëÈÆ =á V¿S* ^1‹ 94k&÷¢Ã#É@4iį †Œ¶BT{ÀdÕmr"”±Â(DÄr/÷T 3  6G‚ÑÁæÂ@éM'÷1:"éfò\‘ybZ„ösŸ‰IÖ@ƒ"nC±¡¡prÖ­Ó<#ƒQª-ôÖ0'wœ½Ÿ¢Wb“ú[Ì|]á]8cÉ`ʼn ÆÊ¼a2A*;@Š$ auArJ)éìˆÅ6Ì GŒÑæy{^šÔŸ=mûnWc Fé;£¨ƒ‰îv§Ba¶Ÿ=tâÂèqµ’EA &¯¶œþ\OUüNÃ^Œj؃Ý~?hø#žÒð'ü™ª‰†¿ÀÐpßõ —*‹†¿òÉßðw ÿÀþ‰ix=Þ@…Gÿñ´†ÿ0ÀYüWÃÕèÕ°»T<£a€âY“ì+«]ÇžÛÇúãáÏi˜¡úŠÅ9Ân§iÛhÈæzH¸Bh"*Â&ìšP„CEBUE1 §&\­!†AÊÃÙÎÔ„&JªfŸw¶é/J*d^QòvfyŠE¢LÛñºï›ŸyŒê(›[©5Q.*HÏyü¡R rÎEÈTp¯¨ÒDµ¨ÑÄbòˆ¨¨¢Nõ¢AØX¢á&„5±”M?Ʀ¿·±E#šhË4±\\¨‰t&V ·*Vib5(–.œëÎç]²"H^±F 6x’ª³]iÞuÓ³ÅVºðqä ?h¢I¬ÕĈ&šÅETòH3/`–Nfˆö†‡ zÙ††åÒIT²rQúI%Pç]sÎúe–pË ë½ós«}eä'—ŠZÒ;£T¦¶>ªŠ« ìÞÎBØÔuTç€ñ8¹~d¤8‰I6³¶{9Ê÷$ãáè µÙ£Ýxº(íðÂÑÿM"j‰vŽ-Wæí“èjV£D¦Œ«`Äìµ¼ùÛ«¹hÜ9ÃÙЩ}žÀ¹°‚æ“HDKóš?Ù€¨$%½ ¥óÂO`£7æÔ.Ú!²uúC‚Òe×9Hæá_hø/¢&–ÚM#n¥¨ÀîÛ›üºÈ¦gÎAGºš\U¸äBEo?A7Ï•´OzÑOË8§ÐåÊ®P}ŠÇè»G Zí•dËû ˆÿÜW,îoîˆÇƒcW'ÃÔu9¯ G"rÏqžÏ‰óNXhoaUFö¬¥»b ³¥~@s;Øç# 6Œá@4÷ÃO~Âr*ÉÖ»,8ph$‘~?d¤VçÏ<3³Iš°iïÒÌûa5â¾Z÷ìÓæŽç¾„Û Ó((ï›ÚfuÅÆ()â’_U£æ×I¹wnp³#ÑH8zØ2kCžÝjYȘX†è¢µ€ÛZmÜË™ÚcðÏÕÖ¼Gž7ü^¼˜Æ}´»v‰{­~B·O¦û&a×ý“Pô¦I8t_ E“Põ*eÅú ¨wÒD€ÅM)8ËœwÃÍ ®Ít¢¥PâoÒ§Pjï=@heljƒÀ~k`›A *úT\£â%*®@]¿,¡V€ûn „ØyŒC±ËÐpÀængˆ ú-ŒKH]Í¥z]ž$̲­‚- "4Ãv!Ö‚Ç ûÑ'€EB·˜V0Ó£’wy óX{$ëë0há•H[ÀqidAíoغº‚àš—˜$K™äRÝžBå„–WBõCÝbB¢{PGÆ)§‘g“› [ùv‡$ÑÃÑíD”=¶tцYD[•B©F,ªí$(‹Z“CÕ§×§°xÂ7‘•±RR«s–Z‡ImQ‹Ú6Kñz“ZEVñ)Ô ³ë&£2ÉjÔ©,–s†dE2–1ó-¨LrÀ$¹ÞÇ4Oà‚)ÔÙ°‘ÕŸ)+;x`£u^?…ºðѼÄ©N K}ÓhLaY—}S•¹Õþ†–Gàâ]ƒÒ{‹]ŒÏ<™›R(Ÿ…SÅjQu–”b“ [u‘<ö¬#ÊNcù>Z:|'qáÄ8œ]b‚~-ÓUH-y¾@†7× Tn&=éïzÅ‘°H—ÒÌX6Â6ƒŠ>F¬»‡É>*Í÷˜ÉÁšEM+9;o½ã.ÊOÒu•)Öº´Xþi¬¦_Êso«¢×*)¬i8 ÛÑ1 :8ßÞZeBßw¶ýÊ*—*§áÏE®R½©Õ¡×:LôúÓX»O’Pjâ$š[‹jµT/.ªuLd¬X¥ñ¬Sqä,lÏârA+ºº£SÚ¥¾[ ¯§h霔µˆSXgßPgù«Œç:{ï-‚<õTÖS.ØÝÏ Tœ¥\ü1j‘^eyÉcšC3C1…dQí\^–Á)‘‡9)}S9û|r)\²w¹—Ÿ»B¼7[Wû¬òÛÞpŸ¼Û$ï!#]çØ¢¿Ëè¯I÷§pi /GÍ8*³;§î£õeYî*.›‹Cõ•6 ‹MŸÅf_›v‹ Ÿ]¥û).ÖS’t‘Çýd¦V?emÛ^ÉeÃ8E›d—åïN/³‘·ËTÚ½ ¯¶ðXÅÕÁöJÇôk(©Íë*«|;3,cøtˆìa»²¸¹!bE‡é Nr[ u1‰r~¢ØI §0ß#ލ¬œ =#´¾·Y<*,窤åIlJ»ëv¼Ö¨³ŠÐ"_7ónšÂ‹èÛ¼' øº—+Y—/ãGYW»,]×Ë’e†P‹jP¿¼õº<~í“h9nYÆ*:ՖެØ=žE´y#Þ”QÁ¤®Ê4YwL²÷ðÿ‹,€ûH..·1#e›SØÂæ"Û=Œ!fno™ÆÖ.SªilcMdíË[•Œ½ej*¦Ë)b6Ö*S¸Bà(Vñj»Õ‰e>ЧÖ"Úq Í<á§¾ S/¿’ºŠ¬.å°?‡.oUñ6o÷?ÍöûPKwLö$?îA#£ 4d5;¥­ªéy-son î–w½ ®¨ÑœšÏF‹ŠTŽÎA¬¸@í„­¦ÇÔe‡€@µžÏhk÷U«§†Hjñà”‚Ï)1-§Ùà%Êé4i¦@ü†ƒMð? 9Ÿ©Yûh£Úº%àÌœI‰k;f2l˜EXW€ÙÒï ‰K¸,ñÓ3˜Uð¥ÄWøZ"Šw%®à*9?èÀTR⨭ÄÒhA„ê¤ÄCd%æ¡KDR° ±ˆœÄòÝèè8%| Ëï!&)£K”œz"^#ës¦ž¹³F5–Ñ2`JX ˆo±"±Š5'âu|'ñ=~¨;šÀå³88,ñ)*SR¸xàU^]ѳ*Ù2FÂÖLÞ Ô8&IÂh=ñ*íb)6—ïÆrrI•—Øwq!|ƒ…;Ëé±ö@"x\¯Óɧ´5Âk{“’×r•ÖÑÎ9a8åÊ4†T[hbºÇzXàk8½EÉ6¥¤‘¸V¶7Ëö+åµ|RŠ­;nX:'§Y”TµÔJŤvÍœ¡m«uëuljiŠÑ*Ò£ƒ+Gš–Ô¼šÕ¨Dzþߥ&MÏS°Ú¤1¤[‹¥ÖR67œm¯y°GÎvJÉÓ*›#˜W­b•PÖ(d3·×l§¹Çô—Óþ(<‹h}‡žšQI_À Gº›ÜÛ›Ž–à™TÒ郛¾@gh t¹ p?A]¨´- ’ŒÛ·QõÌ1 Ðê‚h¥- «Æ,‰ØÏ­È.²ªN¹úÜÝ¿£î±[to¡&õôÕßMnv°óš@³~¨àðÛ†wsσ®— ¢ÎO¢Èž§KäÉE÷ÆØ… G ¨- nÌAxëux4K£¨p bᨸá'CßÎϨe6þXø …Z@Ã3VñÇöãUPñÚD=å™z 8IÀtïuÂÚ€d+Wì4…ÂÏ)“Žø7œ{ß&í7PÚFÓf(¼æýH+áòù¼„D£¹„üUN6þŠ–dzž®VæHØ– ³¤€ , ÔùÇ"/Ð.° mÞH9 Ý”Š©jýnGÒJñyŸ¾ú+ÞÂE&H÷N&·GE¢â%®(x_Á=ÀPKöýJ[G PK8A*org/hsqldb/persist/RowStoreAVLMemory.class•Wù_Gÿ96 ‹ ‚x ’ØÔ[Ájƒ€Gðz¸$+¬æÀÍ¢bïû¾Oí}ÒªmµÔú©úijÿ&?µo&›“"°;;ï˜yïûŽþýïÖaÒ…&r¢‡Xˆ>þ%^ýü5à"ÚÃüë òñ±râÀ  !„P%•0äB%†%h.Tã˜Çq‘p”kÄ\ˆcÄE´NèHH0\ÅIþ:Å¥Nså1þu†K=οžà¯'Ëñž–ðŒ„g%<Çà+†2¨$T†š®¸>äNœˆ„ý&¹•¡BŸ „ƒê‰Q5"9`°oÓbšq?C»;[kDÕZÂðïMŽjÌq]mG"jÈÐâ±Ölé^e0¢¶6d°¶Çô²CKt«Ñ¸>Æ`q7÷3ÌR¶PHM$Úã£1CiwKB¥ïÆ‚[·+¡a5¼gðm(Ö¶ %…;›gghrwö—"·cö½KZ‡;È!R†Ô v† °’ÜC%fØ•³ …A‹û÷S0b#£F f¨úQ%D–¸OJš CAltJÑ«NêeS:sÌ RtDd)'D‰ ù¡„Žw+#"Df>/á /Jx‰Á©SBœTÛ"|Ч=IIBEóªä8k+Ìì³=¿CˆéÔSu˜—éú$Û¥°š0ô8U„L]:J6˜‡;ëd¨ËRŠhƒþ6]WƵçQ-s·»€§Ó)Ü&‰²7Vºàðœ&C¥RàÞCçL$>$ £¡€]‚IÊõE™Ô¡Néš¡v—†JÇœ!œÍoãE.LîPrU:ÊUÝÈZukI'Yáû—=,ldX]Ò"©“‰n=tqKäëÍ”eQ΢÷Ø)2{ã q°SèeZ±—òœ®(Ñ‘ÜòÉj´sRMãé„åt©mÃ*”Ñå›.ð:Åè]Gt/|ô^C³XèØâ¹æ±L¢Ìã›Vw6ovo Ò$Ï7þ„s.¯Ïs å\+SŸ„ß\qŒÆ2ëE“w/Öæó,)Þ:¬7yœÎi©%7`£Éª!7ÒY…ªå«¨¸™Ù”%bM‰ÌÉÙœµ9_¥Ì{ÉämÁÖ|^Ú°–™ kÍRã¬2–Zrî+Ê»˜¼ è8äék±ýåé›@Y¿õ¿ÉZoû{å-vëí7¯£²P·ûna.ýÕX)LU-¶Åg±è:ªû¼œG*ì æq•zû$æ×Û.ÑÆ6‚¤N„{±©“‰ÿÃ,whj—Ð&a»„vêh“Ðq‡¾l:…é6ÖKØAš;±Ë4| ¡ÄXí™B‡¡–,p±«X‡.Y¸Y²që,ÎÚ]œÕU<Ýè1Yc|;”ªu„Ïyú ˆ´Ø@Ïbzºéé$“­¨àÝÂÂzÛƱ"Eö™ô),‡<§ÇK«.¾œQ†í6%Ì­­)³mOÚ L·ÑØ/ g™°‘ž¥&mwõ6SP+ Ç%bý¥ãXũ˓»ñš[6…åã<èçPžšg¬°Ãº¬¦F¦Ù^ì˯¯tÎí'Š ·;Õ•fT$£:%°Q!N)ô
Ð@ ܧJo—\s +é>ÌÌÚÔšÙÿPK ¸B}PK8A+org/hsqldb/persist/RowStoreDataChange.classµSQOÓPþîÚQ™"LÆEtèÖ k|tÆD†‘qd‰àË]wÝ K;Û«Ó…‰q‰&Æg”ñÜn SÙ‹ÍMOϽßùÎwÎ=ýùëëw÷q/…4Õ+g`i&®XNAõ9×ÕΊroX5pÓÀ-y†©‡®çÊG ‡…m?hÛðm·Õ´ë" ]ß«ŒïõDº¡´_ ­ðd]ú¨úÝ®päßè}ÞìŠ ŠJ±Á Wý–`˜k ù\ô«ÜéˆÖnóˆâžÅg>âï¹Ýå^Û+Å85ã\20<ýƒ2ðû®o¿ôû5¯÷NÖ<)‚7Ü!að¥ë’;Ç;¼Õ3쉬™¸; Ëc”aÓ 7¹äÕ & (2Ìž-FqX&J(›XÇ]åÚ ‹cl[dž|pDOµ–H" ª£¶;¶»SɈ.æTCþ¸Çí­ÍÀm1¼þoCp ¦à²ÉÙ÷U›¢3†llJ…NÊ!b!ž‘¡Yˆ?‰i÷%œ©Ðx‹“/œ;+ l„Cý ™¸ªöÎmðip«ôg§¡ ŒÆè½gÉ[B:Ù«T^×`Vi€Ä§IW¹®„)B+ß ½²>C/ÿ@’–Řz [9ý Œœ~2 œGfX¥0lvxASŽé“¦t8K™R‘Íà"^¡ï{6 dßPKÄZ÷ÂPK8A%org/hsqldb/persist/ScaledRAFile.classY `Sçuþ~ëJW’¯ñS&–i²LbĤ&!ØØrŒ ¶’ÀµtmB×½’w[³eË–-{—µ#̓fݼld#k,gu’¶YÚnk×çÞ¯îýNöÊÖ„¸çü÷êe;„Ðÿÿçüçœÿ¼þó‰/¾ó©—lY?þäÅûñ'øS/þÌ?Ç_ðð—~üþZÅ·üðãoTü­Š¿Sñ÷*þÿ臆òãŸñ/*þUÅ¿©øw?êñ*^÷#€7Tü§ŠÿRñß*þGÅÿúÑ„7UüŸ!ü¿ŠoûÑ‚7yxËG ¼íÃU¼ãÅ’*HöF!TQáGÞð!$\<(<¸yðx…ê^¯ð©ÂïÇQÉX‡*U¬ñc»¨f †‡ZUÔùq»©ç¡Y¼jd]ÞâÕZZ‰hoyEÕ“ÑëÜKòÏë`ž&šbòõªhñã¼áašE+xxŸWÅL¸Ñ+nb}61C„Wmp§_Ü!îtƒÿ(€½¨qôaÎ]<ÜÅ컽¢Û1oiI ª·{¬ûXl°ïØHw¿€ˆn™Îdõtöžš1\,§Œp(6ÌHQ†èad…@M9:6<Ò×ËxW9>6t÷`ã5EüXß½cŒu TNÌLNÖh\OI4J•ü cjPÀìÓ3§HõoBÏêzÆ šÖTljÌR‰‰Ž^½S@™L¦h{ÝàIýŒÞ‘4;FôtÂ<Ý™L?íͦé52q+95- Ôýe;Dëµ =1œNÍ’GdÖ!ý4Qg3¥ôôTÇhÖJ¦§ˆÜc«,Pq´‡† ] ­TÓTr¢c/-{f³F·eé³±ôôL–Ø ý4±Wžá˜ô82”3º)½¦€á™l©æI h¶Ó“#KždµôTöíç²F:Q3†qj¿™If“fš,ŒëñÆÞ$qU§³2B JéÖƒ‘UݾÒGbefOV&™É–#–ÎÖ¤—QÛc&H|ÕhVŸÚ§Oé)C=²6}‹‹”ØCª¼ø|›ª ™Öw.nL³îUôRîH¦“Ù]7_·®GŽ´¢F¼)Ç'®H¥›Âž¡)2Ðvˆ²fÊȲö›IÖœœd…™q‘œ×‰ƒw$s2hÐLO ¨­"G{b1ë>k%³d»WÎrS‰ÈŸÄØœîxÊä´÷'3#…„$ùG8œéÌŒUˆ.kKXÅÝFQA!þÌl:N»URæXAåj2ª¯,˜Ÿl×,ƒ$l]Gt=É´nÍ™Öi=•̉=F2•”ÊEbm.Mô ª2uº;ú”q,žÒ3™ciº.ª¸[{¹üTæ7O³ªÐÄ=bPûÄ*†5±_C´‡% ™Ù~s&(DZ#LW½ŒŽŠÐòà ÔQ=¦™2ôtÙðÄI#žÕĨÓ0/R¢iâ8,¹Þüh\vAGméî¯"#£¢Ã–>M[|ø½õùB.Z‹y¼$ÐRTzȉŸØgdO˜E§”ù-f—ø¤Î;ïB’JSzÊ6¦„¤½Hb“)òI;cÆ¥¨1Ý’S ¾ñòm‰¥tiÜ8Yð´lhŽR¯´kx¿­Qé=ªŠû4q?2Á-é¤yË>ö]‚ka>¡7¾Ç{g'¬d‚z ïmij‰·?¥á<~AÃÏãÃ.âÃTûùz[g)Å*¬³ô`¼Ûë‚iøiüŒ†à£›®³ø3ãq ¿ˆ cÆÈõ} Ããž N¡‹ ?‹ŸÓðÕð"çÍZ.:á cÖL'ÂtÑÃædxRªúq¦ù5Çç4<Éà×%ËòkÔ3“L%ؽ"¬‰„0x˜ÔÄ”8¡‰¤8©áiP=ª”'Mê$<¡‰SxIÃË,ø3A|¯4äýÖ7Ü_r›Sø‘ŠÓM6w8k†¥0=vÂ2ÏÚï ©`²Ýõ#ÝÒ5a®–aòL‹ì'UñR £áø¦†¯²¾¯â5JEîHl#âËáØ&i«ý÷àô\wÅlZE³ÕuuSï#gn¨¨c[—ôjý·Ó¤&Åýއ«}:![»ëHK§h‘fêi®±íÍšùn¡Yóâæôì2­œ”Š­‚¢þ’¾‡è«85H¸þžÃ,­?(¿T~Áß_ÿÁ*$øKà"ø¡ø‡ þ‘øa‚´þ1‚)œàŸÀ£¸¾ýÑ#,¿èÒK*gzÔh®ã'YÂô>Ë™Y9ÓÃ)çǘÞD9?!ñàÇMÎOɹ†_u ÜÁÓFãZxñKøéðˤH?Tøè›ðç"¾ÍAÔUäàêRäRá¥û¸sðt©A5HµË3 åøº|i3}±™Åºknš×³¹¡‡ué³'Q¹ˆ{)FãWBÒMŸÀžk»ðF'ì½N´7‡8úã¶PÎÓï!lL> €Žœ¿PT’÷ä‰G;yf@‘‡”ÐÓØ¼Bµ€r<Pi-Éç°Ž^±’ÈÞÇ%ý@P¡läàòÞqá’³ÜZø×n SxÛßB…¸±ÌѯæMO©Gþ<ý`¹:e~x\ÆÐ CL^62k÷\ú@‰K ¹ù1¬åˆ1qWrè{©V­°äXÑN•¦ ø lïX©9}Y,ÉÎ ';»r8ÎSSz!Ï&ž[‘`Ÿ/²MN!k*á¦K/æø*ì_(T¤‚Jjfb%íñ»4ÚeNÊ\»ô¿‡ßw¶»ˆE¡ù†™äOÀ­\ж,À˜ƒgÈuI¹Dt•ÔÕ\ã…«ònò WÏ/äÄÈ–Óæ”¼Iž}N§®ócáãQN+—H´Ôj#9rÊì˜Tñe‚þ€,Í«ç’næ¸3‡s¨̇/I%æ¤:þ‚~**H½*âûJ!Ñ2”f^š†:•æNw±ŒuzžÇÑp<‰Nw@ xŽw*®NOI21ª5 < š:•ö‹Øð¨{;U|n4T¼ƒ½zo#$Êž“¯âkŽI÷9ßm§ª»åÙ–¤(Q½î]sØ@@š_‡ ‚¦%ä%ÈS£íj©ÑBÇ_€µ»åÙ©TK}ZUÕÛü.ü †ctÒy¸îä€fäsÅel G¤Õo8Wß•C6Ú*ïGc—;ïÜ™Ò7§š¢ÔVpp*–tÑ+¯(ÜÕ\©+3õë…èíp¢×hG¾¤g˜ƒ2h‡®–²yªº1Î Õ7ðÍ‚E¶>ëp¦y¶g}ëƒÜN®§R§5º•æsë ½¡B\Ei†ïPK\wYéJãPK8A+org/hsqldb/persist/ScaledRAFileHybrid.classTßSUþ6Ùd!,‚hJmkX ©h­ÒK Ø`H…ZuI–°vÓÝmªmýýøÒŸû‚32CÊ`g|uÆÈg¬ç,›”ÊÆBØïìžóÝsÏýî¹÷Ï~ûÀ ¾à5Ì…À€zœÅG 3Ì3,H¸A>a¸!ϧìþ¬qÜdøœAeXdÈ1ä4†%†Ã2ƒÎ°Â°ÊYŠÖØì1Jõ¸«6 ·#èÁ ë6"8M w%|!áKuyÕQU[p,mZ…IJ}«˜_LŒzîKDYÒ‹ZF]#JszE½£&ŠªQHdK7 èöŒ¦æ§Œâ¦aA@¸diÝÒm×6é†îèjqRÝHkFÁY&Þ…mÇ´(«rpâ’fÙºí$fT#o®äršm§ G³–ÔW¾ÌɆôÅ}ë=\áBïœñš™§©"c9­äè¦aSª¢WL0ÞK制¦­’‰Oð€hAsÆiáӦγ“ߢEºÜ”)~#™J1/´née–8L…’^®Ç}ã.§ŽciÓ(¨wƒûï¡\Ñdá)國¤¬ömK«ÈÄÅ·1먹ÕIµ4«.5ÚmJdkN…Õ@µŽV÷±=Þ[c'Cö¦‘#~¡­gY{·è]Æ\—ñ:eôB‘ч~8G¹‚êf‚Õ`ÞW2ÞÁŒ\–ñÞ”q‰ß®°oï2\•1ÂäÏk•1ÆÑqæ½Ç %cïËHð-•9RSÕ ’qçdd˜ô®K¸'ã>HøZÆ7pʧk²9µ¨ågF¸ÖLjŠËý¶’Þí‰ÙeË\gÄ^0ž'àÌ h×7-£éÙ$S‹+Z޶?~Ô¾¦Ã?ܸÜ->;Ék Ü”~G'íi¿;j©¿K–Y¢ÓIg2«ß¥œG>Oî9:N µÖYº#IHh⣫²‰Û̵Ôiîå™ðìyÏRCº–ÚŒ°™Æ_À[à"} #H¹èúUv!(­”!*}e„”þ2ÂJwÒÔÍ÷ï¢~(Ü~ŒÈEQi£aÛÍù6="e줇ÚËÚFV Qv ï¡QÀ/‡ØÔï»j’m`vlÑ '¿R+ùK~ÉéUÙÂAv“€-öUÝA>‘l#³ûºº÷ð²èSÌÈÿ hö¬UO‹_=tØ«ÒèçIÓ¹‡Ö€Oò±ZÒó“f¼¦îm~ºÓMã_y»àæ+‰Ð‡ýJeßXçž'^&F$ñ§Ÿõ*éb‹^?„¬Ä¨×AÌ< =DHäp—x‹êíÄI¼J8Dº'ÝÊÒ4OáÖŒ„ID]$o¦ZËÅèV žÂ´GŠz‹ ¿z1ºTý|¢"øŽ÷$ü„ÉîÖ'™õN(¼ôÐb;8IH"­%XÆñGˆUÛ;YÍXU~_œ –-FÃF”'è™çLô„鑤ÝÅ©2 EC{ܳ¥p~E,£k{(´ÿAÐE)N?—B îâÌs#·iÓø?’¶ûŠ*?E7‚²"õ€„Ù§äõ>ô)„:ÿ¸„ÃúÿPKCü/£ô PK8A*org/hsqldb/persist/ScaledRAFileInJar.class­VÛSgÿm²aIX€XÀ † ÆªÕ¶à…¨Ôм!½¸IˆÄ]ÌnDj«½ˆµ÷½x}è‹/:SgJèÔŽÎôÁÎôéL_;cµçìnBéL “s¾ïܾ߹|_øãñ/÷lÁ 6"æÅÄ™$$¨>ˆåÍ“q‘$¯Nòj‚W) §Ê¡ù Cgá$ OûÐŽ4¯ &&+2ë “)&gY6í¡ƒñ„>,²wôy÷&Ç8Çä,ãzˇ·qÞ‡ x‡É»>¼‡óÞ÷¡ º„‹fØö“) H¸,áCâh2¥ X=©œQBI=´O1•ˆ6™1‡Ì´ªœêPÎ&ýÊ)2«±ÍRŠ6"}R#½õQU3ǽ*b™ÑQ5½/™6§Ir\@™-à ‰)Ú£zz,4nœN%b¡T2:@Ëð´©v§ÓÊt1Ùv5T“¶†ªNÔ¤™Ô5Ú’Uja[Ö•Ô’æ.þÀR´íG(å½z‚rñí?W'ÙÇ §”ƒßh§ D>X —ªÆT³‡r<¨'5“³¨¢ÍÔÃNZäEv•C¦ŸèS&)1.ªÈf–2BUäMTׯHŽ;­#áH„}=Sé¤I>å·”bÀÒx-‰í鉧tƒ±'AŠ1 ¥¦­øTb/Ì5¡"­R¡ìòIøÈjÿE§‘CVf²ª™t¾kœ(Ç0 bP<ž…˜Â6Šú•SPo<Æ´—± d<‡í2vàyëÿgwÙñc/àEÏb‹Œ#Ø+c+¶É8Ê»°M@mn8#ù¦&.cKLÖµD‹J_}´…3ä»eŒ`¿Œ6Ëøý2:9äN&/qÜO™|†Ïeôâe}Lzñ…Œ!V|‰¯$|-cßHøVÆwø^Æ\•pMÀªž‰~ÝìÑ3Z¢WíÂÔOëSö04üÇc´×¬-¨×¤š6’†Š+)51ØÍçD´^…­z!ö@줧1 ”ðT´„~ª;W #Â3;ªÄÕÂ:.œO¤!´ëÙ“IñLy¬ â‹0‘œ´ç£7?®<Í4{SŠAW§–Fc•%¤±X¶HDvä2¨z&W»Üáí¥.i´Î΢䩰ÖݪŒgÒiU3sûº"0¶”<ý W§BœµQGu%Á÷våRì¶Š}J*¬”„×~›éÉÞ›à¥WšFh5OµõjÓL[œîˆÅéšXœFß⎾Ëá;-î§/3\ØC«Ýôð»8VpBPœƒ+¸¼¿–ÏÁ¼q8øÜóðÌ¡,Ø1)Hf¤óóݵ‚vÓ·ŒB´Ñï‘€0ö:—ˆ{(‚÷NÞT$!îÃ~ǰnú£ Áæ9TÜ]bÙS2dÅâ.¾…Žá%B$Ÿ`Ã=A7eÕ̉ܟ9f8Í­ªºÃSïñÎÞ@å=ÈÃ5•ó¨zPï±fo¢Â^íðÉvËh[Í"w½çrËY:‡š ‰jê=Êj·€Q/\±IÅÚ¢4èQpгê$Ù½ë6­\W±ÚÖ°>·¶Á($’¨ðu´-ËÂÏ,g¡fQÌ–7t‡Iê#T·ó°ïƃnõ‹/0ÒC<<ÌÛc¼ú"¯¾Ä«/{ix„W_ñ¢_åÕ×xx”‡ÇøôqO¸ñu/Êù /2|OºñM/¾…o«øŽßõb!žbŒïñï3©¨xÚ‹ ƒ ðC?ëñðc~Â/ü”W?ãáY~®â^œ‰{Ýø%ÏÏ1ίxõkžâ'ô~Ëœ<îÆïxó{')‚¾‡?yñ"þìÅ_ð’uão|ã~ìïnüƒ þÓ‹áe7^á“Wcüh±º»ñšŠ{± c^!TQÀ³Ã-U8UáR…ª ·€»WOëÛô”!0·-‘ì¯ÛžÚëÝV·Ö¯$”¤¡÷vÆcCDàBÏ.ýÒ6#ÞŸÞNûVo_4fd oæ·íÐ÷èuÑD]—ïMìjŠDŒTj=½™Œ³ÖHE’Ñt")Pfc¯?á„p]Ûûú Â)7qâ„Ô® ½ÍCi£Y2Imc"MGqÍØ|†Š"ƒÉ¤O#©‘íz ÇÓ–¶%âýνÉhš¸tËYž*Á0³ï‘ +K°WU:ñFS]¶ˆüX3â©Áä¸ç‹aÄ¥:™AUÌ$š)#Å™Aœ¯µãe^°ê$ãL Å#„_2`ùše3©‹ ÀöÄ69½Òbúg³åñÎÁø.}@`Ap ïb=q8k¸· øNŠ©!‰”†·âb Û!ñscŽ®‹" ïÀ~UÌÒD±(¡¨1ŸŒIÒª¢\¢2KJzö¦íÉÄ^ö_ oŠÀ@z{ÒØ$£ $’i£7`?¦‰¯‰€8EÃ]xŸ&ŠE Çi…c1£_5%ûw‘‰r..K4|yuª&N#Eû5ìf…T1,$ª5Q#jÉc&Æ]ó`4ÖËÆ.ea9/¤ÛÖRß Mœ.ê4ô’ªhu†&–²™>ƒCËsÔ#ïŒd2‘ ¼Ž¨ wâòlMÔ‹35q x/Ë|6ªb™&–‹sT±B ‚<ÙŸóJT&©1'e§vt†'˜É°Œ”‹¨‰F±êD®ûÉÈ´¹«E¥*ÎÕÄöI¦«É¢OÁ6máïfQ›D3gÿ˜¡ÇYùEãfi‰é©”&ZÄZU¬ÓÄzqÅæøqç¶F$­‰ \Pœ’€@õøyÒè‹B]8¾Çò×MœLÒ9níÇîHtF¶·éí‰ÞŒ…9Ie€ L4•®“e ·«‰ãdæAÊ Ô0§Ö>=BÞ?;O’:A*Ó)¤·²Z(s´Ë* …©ö%¥F ÊòK¦,‘‹íksƒ“Ë §`ÿëˆE]iª9דC‰ä.=M½-F4&™s[ÃUÔnœ–‡|þ½D®%[áO¡dýz5ÞÉ…i-ñ‘ÅÍב8cÑ]Ñ4½D¿Ù™ä¬Mºï¤‡\¸ý=z2N ¯Ûcp M-œÒ¤|ît"k¹9YŽOl,<Ü´èƒlïš`~By¡D|Àn“æPq×ÝÖ8H[²–’Ó”›E;+·r¦,Ó*-ÌêìdÒ(Ê‚'½¬Žy§Œ*ôÉ^àjï• Ïd_˜²Ò.]¬°iæ=žIZk¤)›Yòt­kZ{qgGÛòÄ©*DÆ+oõt…7­Ë6)̾@å”HM²XœæK­¹ ÊÓ‰æÆüP*mì"nôdRŠ$†&xŸ™êV†ó€d¯å”é›DNý&«°ÛØc$ K…¥ùC‹{EJääy¶œt(sàÖÈ^MfÒX“ÇÞ['ÝÉ¥’MÑ&…•Ù>'ÏõÁÔ•™é4*û%x!‹îŠRzßIûy¶u2¨j2gÐo¶jÞß‚b”p[F­| wQr¦æ.ür¦KÎÔQÉ™ú)9ï´Î©«’sÜÚS&çÝ’^÷~4ÏGƒôæ [„2ì¥{Ùý¥´ÊÙ_Fûˉ^v¿¥4_+i}ýîX 'ýÖ B„¡`ŽPõ”P©kΣpm©…Úà®<€BŸ;÷re äªT¹é6x-`©2«ìx–+¡£ðn©!twÉŒa8K´QŽ`f¨rE¡ÐÌÌ`ÖŠ­eÉf‡J• æÀ†9õ#˜Ë«¹”Ž`^È3‚2|ÃÏ`þQ”o)©EeƒÇç9vXþ|ºšFêê ª¸FÅÛT\+EÅu@±{ 3'Ãi¸Þóé£bß™„áÌÅ ð«8¿o§§Â^H_êµMEÔAP`µ)Ö‚{Úh¡¿$PÁ)ÕÇìý"Þ³ 4/&)Úkh±¤gJGÍ1ð¯Dn”˹Œ^©Ç9X)_c!@Ù â*Þ5F@‡dùÝ*ÞA ØÜ•Ó—:B‹»gÉÌ.šc!ÿ(NeÝúi(3ögp½ÜÓa3[k1Gs«Xñ)µ&{ΧO9fc.ÊÁ\œó°ÔÇÌCdXFb—÷M4_D.ÙgËÔµGÅûǰ˜mr }?HŒ‘ ”Û[fñ2¡äŠýAÛ(ý–Qª‰iß=Ó´@$å$îüXB¼g¹œǺéhýÜh=¿ÛzþlÓ™C!eÕå‡Þ#3QDïU‘[×ç22-ó߀›,F#qTš/g£ÓwÞ>5bpÔVî£ V+÷Qà—Õ¥ 9EMÅä~b¶r_©bì_]A“¾UåA¸†é3öà0–6(¶>Å’ƒÒœ>'¯Mopùœä ,NmÄõJeƒ¶8ÕäíÇQ¡¼‚`A³”+—”ëCBLeçŸLѵ!õÿ©èØ—´Yf2rúšÐ,7qâ#¾W„Yô`ˆŠË™¹œlœ'µMþ¤eòkBÊê¦k÷3þGvïÀ›ˆõ•ªËríîü¯ì~-!¯"u;eÒµ„œ[žÁÒiýa„ÚmFk,>kL6;jk²<*µ‹³©2.$¥/£T•“l7[jç¬3+qW7ÛÉöZ⊓m³Í•?ƒúÓ†QûFRh•BÚ)Ôæ¬gºùðÜjqöÁØ=¯´88Š3·Œâ¬’³3Òc—gpN+2h ®Á4;˹(?|'æËê\^?Š•r!º¯bxì9³à5£ÊvòUS9¹)T76“0Ô– ÙB-†ë8jÄ+ð‡Oâì•~>F#‹VL3ÿ%ÕI<‚ù7ùÛq‡u¼Œ®pi pÝs’ç;‡x¹œ–…\W{ÉqH9dw f”«wfiˆÙdU7<ãoæGBƒsåò<÷£‰"ä~478ÍÃj«àGNÑoº…ôGsç52há­#ƒµR½Ê%Ôz5¸h]ìsJ¤ Ö5¨²ò¹ç¬÷¹äʧv‡|.îÔ¶Hz#X>Á¢çM´è0uLÀÙ@8~A Ï<‚QÛ"¶H¡¢Q|~ü8ΠqŒš×ñzì'¼OØJn´Ük~V³©ÙC!Oa6¾|¡Èrhó7EçÉ<&ðI|Ê¢4Ó²f¸Ï2å09±°Š™™c¯r4:VUXÎÉ=£¢>ƒVò²Ùv„OáÔ¦4^_@ŽútùÔßXœ{£øÄÿÍΠ=ä (&;›tPòh;L\’óI’s­ºv µð‰Ýy_ƒ"Ä$]Ñ+ \ç”ëBZwðLÎu% Sª ä\ì õ²1»éf”øÇ“6mݬÊÎ [ÈO]ñá\—-£/ÿ%Ó¢&ª¬«¥œöË÷éM DÑ@ÑÀ D]œ¥‰ìÝ6³AʺL¶Â?«ìòý«eb¨”m»6^}ÑêØKÃðß9­ìs•­ÃÕB9L¡«¤›~qlÊà‚ö*›kªiÛ“Á›;jùp‹u(Ó¢uB¶Òڇ᦯Ò~Xl$ý_(çl•óy¶ fÁéRqO‹ŠÏ¶L¬–¢PþG›ÀóxQhðüPKZ‚¨S íPK8A+org/hsqldb/persist/ScaledRAFileSimple.classUëRÛVþä ²… BH4NZŠ1qœ´iJBKbhM ¤6M›¤7Y>Ø!I†æ‰ú‡Î”™àÌ´3}€>T'»²p<•©=Þ=g÷Û={;Çÿüûçß–p¬`k2ÖDðe3øŠI1 _£Ä›MÖm1Ùfò„É7LÊL*Lv˜|Ëä)“ï˜|Ï䙌çÌ_(ø?Êø)‰ŸñKš‚*t5BÆ®„Ø®a WJ{Ú‘–7ì|Y³jöÁª® ×]'ݲ„„#´Ú¶e¾” =§mMó´ªæ’ÙdÉvêù†{hÖªùB &‹¡†ex+dú":§™šUÏW<ǰê}$ O)ºÇvŽQÖ~ÕEÓ3lË•Q'÷¦°ê^CB4³°A(Wˆ}b™ ¶­ b–'’sø>¶äR²-ò"ó²hy´Ê¼xT,²qüØ1<:1ás_Ëøš¤/éXÆuÓæôÉ%iÃ-w D"*‘*,·åˆR&GFÒ¤+¼sÑHÅÓôýM­¹£UMj©‡)ðB·´S™…Å»/-½A=U1‡û. jë*®"­â|HÝsd*ö°¯â®«ÈbQÅ äTÜäU·TÜæÕ¯LÜQq—ÉÇøDÅ=Æ}Šû*V“0ñ¶c; Ç>æóG5õ_)©8li&e:Ùë¥å²?<ë-“'Îc[ ›H}ï ª \Ý1šžíPë/ö×ð RIûL _»^ç›0]êS™’¯$ç—*éR‘‹Š8ŽX;|+²ï.Lw"¨6¸EÙ,$¼(R<Žô¦x}N“I|Œ~søˆž¬yZåGŒøµìkHÙ¿yv#÷Ñ3IJ‹gˆgsãCmÈgHœ‚?ú ‘é.Ñ14Ô› Ä%â‰ì+ÄÚHþÞEÇHÎXšý;IÁE‰'{µ å4¾9ÈñpØ1]¥.VêŪ'!ìíA~GÂ~—ù ûÍãN€"×s˜±‹3³m¼Nïî;à©0œÞ„né"ô J7ÝÆX|o`ÇÃ`zcúç8Æ~†e¢óþu°qÂ&:Å ÿ< Ô£ÄùÜHì\·ÒÕåHÃùŽ1]ˆlEO|oI(²„Ïý“6d|A»U<êq˸ˆôGàö1EßÑ=$·\—™NôÛ˜ú c%ÚÅ_áòø•Å6¦O}k#~6|ŠŒÈ¦ŒÂðPKëD.´ç.PK8A/org/hsqldb/persist/ScaledRAStorageWrapper.class}SkOQ=·Ý²´]° òJQ¶T]|?@’bMI4ÑOËöÒ.®»uwQùOúDcê€?Ê8³}¤ [ÛÜ3sgÎLçž{ûçï¯ßîb'ƒVÒ¸€;YÚÞc¸Ïð€á!Ã#†Ç Ož2¬2¬1ˆT|M¶½5Êì|±d3´=7P±¥b›8Ò­‡ ¤^Ü#b å{2ú—Öe¸K#¼òl7”>Å}iÖ"nY`˜7ûž[PÙ-»!yú»­r™‹SŸ};¤Žl”Tô(“Ž"íÊ”åxŒZR&cUêTqÓ(ôV@“npâËýΘ<EÓ »¡TpêZ ã(j¸„1/4\ÁŒ†Yä5̱WÀU óì-°WÀ5 ‹ ×qCÃót._FI Ø§dSú„Æe:²VÝì¨úÆ7›MV$wl~2 ÇtëFåðXZtJ=¦¼jº5ïæeÉ (³–G¦E§ÎGÕ¶g°Ê/½p×;qk½KëæË•¾èDüMc…ž^iåX z–9Z㸌&È› › ›Yþ ±\úÄø3Ikˆ2S˜¦ZÒ®/"þw$ZH |ëñÊ0›Dî°'‘¤/ev¡%‰³sô¹AÍSqÍéÞzlÑÏøzŽ=?¨·×{aPïá¸Þôd:ìiŠ)dG˜]šÍ·VbºøŸ‚L\=ÅžíkŠ„œi!›ˆ¡/ Ô]‹ÓžwüiGD ›þ„1ìÑ®67q«Ã%Ë$”nîöù\²›3h’vn$ÚÓj€PKI_K1vKPK8A%org/hsqldb/persist/ScriptRunner.classµXy|Õÿþ’Mfwò²ÙL8 ʱIX"¨QDCÙ$@"¨ÅÍfHV÷rfH/{Øû²w£­Z­µ'T*U°­ØZ­­µµ§½­m=zW[$ý½ÙÝd7Ù„ôæóÙ÷æ½ßï}÷ïÍäáÓ÷Þ`5]¡b,ÒØ¯â*R᫼FE9^«àun¼^’®S±oÄ7JÊ›¼YÁõ*ª`)x‹Šj¼Ue˜·Éáín¼CÅ;ñ®²ëF3*Þ÷HÒ{¼OÅ|X*nÀûåð‰ñA’䫸>*w>¦¢ÃòéFÉu“>.÷>!ùnVq n•¨ŸTp›Š¸]Á§T¬Ärø´ŠÜ©â3¸ËÃÃgåòs|__Tñ%’Ãa9|YÅݸGlG<8НÈå½Ræ19|U‚Þçaæû%á¸\žOH×}M²|]Å7ð Ü;)—IC¾©à[ VÑ ËoËù7•ôïÈÅcrø®ÿ=»ñ}7ž«(ø¡‚' å뢉¨µžPêoØApµ%ûu‚ÇH'z"F4eþPÒh4¯õ÷5o [á¾°©¯ ]ÞnŽ&›;©´Õcz8¾VBTöXáÈ5áTo¸/¦+øGXÁ ÓʼnfF‰&EÁOü”ÖOq*oÓt4eU2*o×Ãýº±ArI¤ë9ð ~ÆY¡àçBO)ø…ã·Ç^‰+Y˜À/ñ+¿ø ~KXr&ð^ý %Ï^EXv&Þz„}*¹G˜5nlï ‘< ]Dð%Sz‚-¯%ê÷EcÌý4~/°Qyî9ü0;çòöîMí#º• ,ÈÓ íã€X[ô¡Íasƒ@˜›GæÐXz\OX;Cô9çñ‚ÀŸñœ ÓÊ}éXl/k²×ÐS±ð‚¿ ü g üÿø^$Ì› µÇJ¦v†­È ÇZà%ü[à?8%ð2NjòuÐM“õ%(D‚J¨T‹Ê•“"ÈÓ‚<|”TV*Hª$¯BU‚|’¡§uÅ¬ê‰ êñ° š%:Îᤢ Ùµ–æ(4WÐ<Òª4_b. …‚ÑY Õ ZŒ§Mçp¾ZBK-“<ËɯPƒ Fj´/ ÐJ…šK«­¦óO³]@-‚.¤‹­¡  µ´NÐÅ´^Ð%t© VÚ ¨ /(´QP;mtmÔ+]Ž+ =»™§¼PÏX+ÒÑçá,3ç„zÝ0’F}ÊHF¤§³Y%h …¸ÜcÑ„äU§tÅêÔ-½ÜH[Ù§ãèÝi«{_§OCíNfYÚªOî«;›à9’õ9äFÚÆêäÙÒ 3jZ¹¢H'Ra_ž°¾«õw­È¡6c(e%gP’²Þ¹¾ŠôŠY·q-ËŸBߺ™ŽYÍÛ‰¡÷„&ª¼–àÍ;°=y@z890 œ*bNÈ!®-nk({Ò3 [9»úŠádÈŒÓñ?tçi€vËÎíeÕ{ôýº¡·ïw¼Á{Rsé`Nßoši{wdmš)÷ôJ+ÔCpË*é Ç9Ò¢CfW[,lšº) èèM('ÉØN„ÙÕKrkDžݾ5l rr°Ó')ÂiÄ Wlm5¸]VT XZ<<wœ.>#»?jf—C½Fš©-âþ†Ýœ‰&çG2žâ‹¢7×¹òãÜç]þË¥s™¸]ßÇALXÑpŒ/}ÀˆZC’Áñü,Î…~'ÕúónA<²=Ú‘&­Î®»Òñ>™ ü®ÐÁ#¤’ Å £züXÖÛ“’¹<¡(&žõ%ôÙ½MI#${ÎWLƒ—r!–û;&k[ÔwÔl‹%M½ß±—QnpëÛ¯g=’s]ïPŠ·jxk’O}‘Lò¶ŠUT¡¾9^Ö R&d^‚¦N¶œñI×0cfBEÔÜ!Y’‰UeJ!c˜à§Vc -U2e´Š·AÙ²’±t<Ñ–LKC=c|uÈÉÓ%³Ÿ¹¬×¾ ä“X)‘ÊfTÑ Í·xÓl–$ƨ-J`5¢æ†hÖ”Šžm¡½º»Cí­]„E“±6$“1=œÈB*fÎuþ)äÊrÊ1­¤¡7ïÇÒúVÆâ Ðã)k(ã¥VÃsÎÓê‘´¥g 8?_ÚýÅ3¡ˆÇ 7'漉4gaÊôÌÜâŸZì´Èå\Nñ(›ã53EÝ–äævКpÕö‹w•±“¾HÚ2/ s¦*ÇŠ>} šhdÜ M¬ÜM"ó–P%Ë #¢7ó®?»Ð}Î.ƒÏŽ&L®Å®dÛ ¹f“‘Œ;-®±h[.–,¶*êg5ºz.ðuÓEØ£'úsÖ,œ.(òÒé1ÝÒù%gL»53Ö.ŸXzU¸¿?ƒ˜Óa¹²c&žÛÓá|bšNƒ» Ììɧeoílr}eÞTìÜÈ÷Eý™½ñ·Š5gêÚS¾W°,s‚øqX¿Æï&eyÉ|•sk,–u6·äòpŠ¿ûõ"ZNñŽ^BüÒž»ÕÞäÙÝV2÷ò¼±x?阗ò zá„{¡®P/áœ8¨°OàÂbìÆÈ?H~îóø*^UóL<—5r<üÁ}U–<ˆr”ñ¼®ñn”Ø(í\ñ|ÇàÚÕØte]#¨?†r^¬pÂËê KrÖx4— õPcà(*1–†¥ðÃÍOaF«Aé)h úºDN¡RA¿#UÏJ½9+usžÔêŒÔÒ#,§j\l%/]šëx‡Q>oQ ÜX††1 Ö¡üêXƒS¨`é£(A©‚} xÄj½ ƒê¨tÙIj ¨ò_]]ϲ¦5@)Ž¡j×ø:©«´Åu Õ»|Ûª•'èj‚J£YA7³kjmÌiñhÊl̵¡5–Ú¨;†ù|rAPm ØX8Lw4ÙXÔR8 µÖU[q –ÕV´¸VÔ²Ag@}Wà!Ìf¬Åü;»‹·ùÔ9;yX2ŒJ‡kéΑQ›¿¹gYKymù]µ²Þ2Ðåü[Ê¿çù÷ ÿîËШ‰™—ËZ™ °’±l4c‹Vi£É×y+ZµÊXa#PºúV½¥-UµUš×FómXªyk«lœôi>«l¬F…æ;Œólœ}Œ>Ð*ã-A1ôjÞ£¸0(4q·kÂÆEøIÎkNÂãÌÇ5qÁãvÑÚ\¸ë4å\ÐëYÝK‚^/ HZ‡±ÁFÛvLf¼Ôa¼$ÈÚ4Vs£Tó$ŸÔ|d£}ì°Æ¹³‰y/³±9èu;FPšq®šsîé]M'¡0Ûå2 6¶4ò~ÝNÕcèäXvÕtÛØª¹y¨ÙƳn·Ñc£7X!³S«ÐTÎÎZÏ0¼šZMjGqÅñâ¨wŽ£îC}ÅÔ¨ÕôÈQì:þÑeA°ºA«>~ˆkë$5ÑJžƒô\‰ !gÞÎ|Cvÿi ÄUÒæÌ»Ksæ§Kž‘s¦6éF,E›¬K.º~W+¸†3WAŒkK3œÂ<:Û7ŠfÙ;ò¹hœ‹ `çÁWÀ“!çs9«$‹XúÊFQ9tò§A¸ëF¹ôÏ$_ñb5ª§çbé R ®•úzΈYû*eÇR‹{ˆ¸¯ëåh¦YSç)"‘k¦:áüq»“ x§æ=ëô?Âi;þí¿PK]à áPK7A"org/hsqldb/persist/TextCache.classYxTוþfFO3zªôf„A $d;v$°AX 0–0†ÇÌ“4xŠüf†–âJzìØ!q qKp\DÐH26à„@ì$»©Û{Êöl_ïÆÄì9÷=fÄHhóñé¶wî¹§üçÜs‡·Þ}õ,€ô–ð㢆K>¸ð]/Á›Ò¼¥á{>hø¾L~ NÃïÉè÷5üЇ"\”ÉdôcýćŸâgþ@ÿP–ÿH–ÿXF"£?õð±¸ÿÊ•+2û3iþ\š¿ð2Å_JóWþZú¿‘æçÒü‡ üR¨~¥áoeåï|XŠ¿—•Ðð>øñK ÿäC­½øÏ>üÿR€õáßðï²ò…øOü—Gÿ­ámnÆÿÈòÿjø†w|¸—EòßÊâ»B&â ‰(OF.¹ÉÃGS¾4*`vä•ÆÇŠR![‰t!.â½T\ˆmTâů©T£2Zñý*瞦Éä²¦Ó ¡™)Ô³dólæÈs½4æÒºNš…ìªf‘Ð_/'.–éi*eºT£e>TÅòSµðð ×áZ+Ó:!].¤õ2ºAšÙd´¢ÞC7ÐÍ"Ù{…ôÝJï+ áÐ(ÍÊZ%Œo#Ü.ú¯–å55ÉòZÑb‘fÖIÿ~á¼^¨[4ÚàÃC´Q£VÚ¥ ó@b](lvš‰D(Ú'T¶Æ¬Þú¾ø}áàžú~ÓŠ‡â‰ú­ãÈ ù}¦4-Byë^cŸQ6¢½õ ‹?óWOÂØ6åc·­²ÆK“Ñ@, %fp­ècº…™táОúÖX´w£yp½ïk3úå¼=Éž9Ï?žt=›&Ì5–eìH&ú“ –Ã4"²ke(JÜFXVuµ$W ^}'Á½6d‰|²q“a6Š?k÷kgÄ'bPÔ™0÷²Ô[m §&%=³rU©Cbýf”»ªîê;Åø Ëj™öª'ŽÅy£§?iõŠ(qSYSŒ÷/©Êå eÆ`Çž½f ÑX½A1‹Äöñ檪 ¹6l²{3ʶŠYf£ˆ1G£vB™½3M0§v¨h›†µ%¶¿%bôšÍ[XVœGÜöš<]›ßT„&BËÔ 0%^qcŸÉúÅP;®¹¡¥E¬¢9›^V~½6Ó«ªsδø(‰X-d„C‚„U¹¡æMSsô3Òö[¡„9ºÐ¡Ñ&Nì>¶55Û“‘=r4C°…OâÕñq-jå´CŽPŠ·ôFÙtëBV\ñWœ» %^ÛbÁPOÈd¯—eœµÅ1@åä'ÙdmÖi uêø Ž0š§ûLO[u<ŠÇt|Ÿ$,˜4Áû'u| ŸÖiÝ©Óvº‹°x –Ðñ|T§.œÒ©×h‡NwÓN¬qʦm‰PX§{h—N»ñšNíÑ) £ ™:õHÓ+k}Ò„h¯N÷ÒÞlA¬ØþP¬^‚,ÊÚŠ8›“1Τ:…ñq"ÒD¹aÄtê§û8|sm·­•¹ß²wÅuJP2ÛbWJ¸nr®:í#Îûu:€Sœê,3Þ ÑAÑtú }H£ët?= ãóx’‘—ÃØ’iÅnMá˜dÔ(gKD|P§‡èaÆðXTlícì„[:¶j¢Nˆ{î¦Ã:}„Š/à¨N¥iÄÆú{ž>IŸÒˆÿ¨L?v°p⌧dùqzB§ÏÊ舽ÆL>'$Ÿ'–ÖømJ†Â é ƒ¬FEëQÁДüP1„"ÉHE0û¡XT§Sb¯oÒi)¥ã<+£!/Ñs|‡ Ó€N#2zDðü*áëC^ã|UÁ¿ÎŠEÄyýVŒýQz¾®ÓY<©Ñ9΋׽¥ŽŽ7Dî7pœPì¤ÌŠƒÅußÒñ1ö·ÅC8M˜aÉ™âÓÉwtºH—ÿ£:n‹Æ“ýý1‹áÞÌ5H½”±ë"[gÄ2ß• [tÍì$g¼I˜?¡SÛTLl‡äúk_PY°¶FÈÛÁY¿t|aÃ÷TÐ)QØ9+)=ÔåTØkçjÉL„yÙ993mñ–¼ƒIr¬ ̸\ £ìÚŸ­5íéÌŒ¦eŬúfi¹Ð1í~ËÔ:‘W™û¬€EC#Üa­Ù…“ s“‘è#,ÍuAæº_KXÀ6〲»}‘둬)ñÕXšA$· /E²çÄ5V ¯:²“™7T`2§M\í(Ú “Åׄâv¾eÝRÆ×„ã+y=Ì:oŸ”‰air¨5••nq­Ç’tÍèo0‘·D¦ÕcÅqµw4.­¿ëá¹k•|KÝã^ã.ŽLJ%c®³L©{C‚NV9°Ì–TûÍܹRÙ=¸eø€}5÷g¯l›jmßÝ’³`ÙbDƒ±ˆ™âŒ:~Ü“åZûª¦JË& ›Ñ^?×]ŒG­ª¥¥eƒØÚ×ÃfS—&ƒ(§Ô¹nV:Í-ë2ÝŸ¾]¹¦ÝÑ:þ~mœ4j‹TPHÆŒEÃ9å«*µ•ÏåkóJr‚©Ä¢¤eq«W’× ï_x ÎeaÕyv6;aaÞ˜}kd}s uŽFÁöVf? °qóƒfØLLT…w«÷?{˜0µ)f@JÒf£Úy!?ëí•R`^.ÑZÕGy­ýüä»ÓÜgZfó>6œzÌNÅc®VQ˵¼zwº«²fpwµÿÙvIE㡸öS*³&¬ …cUÛ–]d7ummîÜÕÚÒÞ¼«³yÓ¥ð¸ä!¹ÏŒËCSÒ}æ³€P{õ7ÙnNB O•ý–ó(ìÊ|G“2Oï¨yâ¦y¯ýÂkr~¨pWUËõìŽ+h¼Ãæá“Û…Ù·½n%£‰PÄtn«Z&÷ü‡<#¾\ý*«æ~æ^õF_Æt9â7‡K¹b7‚ f¥‚¼6;cIK <+ˆ6(õúþoû‰.¤©`h~6ÇG…ÞcY×2.£Ûú³ë§ƒ\X1òzœŸœb³=fg“Y>ȇɒ\ahì-,QÒ’³ú¨ÉS¯&U–,0ÙåÆÌ\ AÐ¥÷d=´÷ç4~î«fJïü©¸Š« ,Â#8 @~Kæ1·n©×UÏïoîóäu-¿4Ë£œÛ¹ü÷<Â<º‰é\ÜWùkNƒj‡ç?WW‚{Í òyIëBÁ ¼Š“ŸÅ‡ÃC|¶pˆ©Ï?ŒÂAè¼£¨«†Ù¢Äï?’JQÆ£²Kð•QÝ0ÊÏÉý<¦Éj Óå»M:c3á¬Ãƒ˜íŸŽ9ƒ˜çg‰æK³@Ä |Ž[hËÃOYGž¡€G@JöŸÆuÇPdÅ–«¢Ëž.²»ëín±C3„%ƒ¨d²¥“’Ùݲ!T ¢úZyƒ?÷×jl޵¤yÕ1¯1żpMÛßÁz^à‡³£Þ «'æ~ØïÄrÞëK¡¾ü†ãÐ<'à.X%fó‰AçÍƃX! +Fð‚M¿œmyäiñÁO•R¸‰…»¹KäXàòὃ¸å*ÚjËèB©ßó:Þ×åªM¡¡³Ë-|;‡ÑxÎ?o+X$vb7nudž ÏŒÕt7Ðçi8ÆÕ¶†/Îço_J{hcR<äÑV¦°ÊÉËÞ!ù94v*oá/Á=Àým#¸oÑÓXš´R§Ð”ÂÚÃGž‚æf¸VÙ_îP”‡/;<Êòçs¿!Ëx SØzÛÜsÜU°Õ(­æow6¸3ŒUÖàIÏæx‹ÌC#s­D½ê±Jõ¶ sẌJ _¹Âxv±gÝžWÎ-bНâ¸#Û&»8vÙ˜lJ±±£K²]‘Ç«,=—˜›¡y^·²}žüHåpm/qrmûSØ~6(¨Á]Ê <è"´×•VÌO¡»Ž Rœ=¼ánÂvºT Ô¥p‹›]#ØíVB•áMFÿžaÎ ¨pmÇféä”÷66kx¡¾–§Ë¹MnÈ Wû(`pr­ga1ï]Œ%ªOkPZ^L³Û9æ– ›¦`Þ%^OÖ³}òÓ®ƒŸYøQ£úôi{Ó^ÂËöi”ä$WÀýìšKðÐɪ¥Ðk£¬¼& FBë±=“B_«Ëw1¼M3‚™[öÊĹR¸Wñ®<ÿÍÇÞ¾+…p­Yå".lÏ6yMCþ˜Dù'Œht±<Êͨ21Ë9Ìx³kû‡qßx.ÚØL;ÇöYa\`t”`)ùäÓ1¬ú xWzò‘®æ¶™Ã5!X+Û«•'kU¾úqí0ö]ux± *‡.ç¸7«ÞÖº®C¬Ø6`­¶|eÜK€‰köŸtÄÿ&N;Ÿùâàà2Œ ‰ý£ê ¦¿ït °F)Ž¢N2©÷È1,‘\sPí;™mgp¨‹o·Ÿ ãÜáƒçÊèW’z™Õ4¾®*pÈ–‹ŒÝRåR?¥zží(~¸‹Úü°¡:Ô,¹¼½. Öµ€¯ÁÍå~±Ý oóµ®Ú³*ÉøkÏrm·üô¶2ú…2¨D¦d¥ø°º‚ÚÓ Ç÷^¶Q2¬a„[ÁÉ«ùWXê<{Y^êï ^s$žåضРxÙ±àë8›Ã%£8‡óÎçéÎçÇÀ/;à{#}{—;M¾§Žºè[ø¶ó} _Oò}ö<Ôå~‰H$·û¶ÏÄÿPKóÚ"›‹"PK7A'org/hsqldb/persist/TextFileReader.classU[SSWþv²““„ƒ5*¬‚—/±ÖÒrK!%–›±h­ É„$žœˆ¨ít¦õµq¦Ð>ô-åvµÎhŸúÐ×þ„¶Óþ‡š®u’ P꙽׾¬µöZß·Vί/~z à4>õà Þuã:yêâ)ÌÓYïyàD7oÎñ꼇V=ˆàOïóY¯}èçíoy{‘WCì¡exÎÔº #673)Dr£Åfø‘v=¥›!YÿöQØVÛÁçJÓˆ€<›N ƒÓ›Òâ¦ÀQ¤i{WFÍX|º/–Ž%5‹Ýq*ì²ÇB±WOÑvSD`׸žJôS¼—²Z‚/ÓD‹¤'é²rB3×›ìö7m?«±BnfL3TœDBEUÁQ‡pXEÇüÛ%ƒ}h*Žã„ŠqöÖŠ6*&¡«˜B‹Ši´(Hª˜AJEžn¨0pŒWdœåÉD“ŠnRZp—RÙ\&“6L-ÑŠ§”C÷­¸–1õtŠu;êÿmfVÅ,nre‡‘5{s*nãOwUøùõO8þZ¾¢T†Jõ]õß2ÿU›!·¸)²4Â]¨e5s#º¯¬Y²ÌjÚ4;¸`ùáÒàCý6Ý5n£ ©œÂ£ÃÝÑ뽑þîëÑîAÛÕ0…2kè&ùPüWÑbp´béÒ³siÂ\ ‚¢¥*Ó0r”µr*SAšfºœæÿËmË t“Ëh:gpn{·0º`Ųg]fša¤`7ϤV”§ý‘u¶Ã“Ä=7RÛ†öã¢]#œÞ®ßÔž›ï+²Óz&Sl.ú úƒ¶q‡ÐÊÆýaIjKRÕX’ZÆ’Ô–¨)‚8E«3pôBŽ-Ã8¾ {àÄ2dÀ+—áÛwpˆ%:³ùî=F…õ ø…·¡ 4;ÉÀë$¥PѬrÕeÈ+çáÌã[:u,àk6ø;ì4ž>Æk¬M›Tå1ëu~Ïq]£a§á¡1H£’F˜FIïHŽ,íP=3u PdÒÞ‘ÇѵM3Í5k»PêzS—×¹‚ùB{ý<½ŽyìâÃRì2±²¶§7v¯ÀÛJIìhUŠ {[´?c_Ów¯d´‚>\K­ÎjñGó|Ï …[Ôˆ:ìÁ~ôг¨EŸèd)ºDØÚ ¼IyµaOTœ ÎþQö«hîCµÂ®t IÃîzŽŠ}C ÞZ…GAósÔt)x›\¼ƒ–‘ST \ÿØÛ™Ê2‰„»Û¢ÓŸäø| ˜·”J4J¯$›_rh_”íEîö¿’»(áÛ꨿?BÝ3¯´x,r‘È%"}’XÚ!ÛópËPÅX·P¸ëã")ä,^¤Å‹^¿%9YF}U­2Pb…ö%íE¡{ ÝZêšóô¨E’–ü âo⣌{Uew‚“€o¶…¾þx.Q'¥ÃCì&TR Q©ÿ¢’eÜ¿ñuøJ5Vî”—ð:¾° ¯Ãg”†,ÐäåF§JJx…%qgÑ—Û ö×|'¹«š6S­Ûù¸jÃqÝb¾ðyÑ}ܪFîªÛ¸O ßÁ—–üŠæûkUØ÷ 줌Wéå¨Þ-ªŸC06‚4ÛÑQJºš$•*ø¿¢~©ô§*×"P¼®X èõEK ÿPK ÿCÝ PK7A)org/hsqldb/persist/TextFileSettings.classV‹_Wþ†}Ìì2¼–d PM²L ´1bÌËÂf‘m@’¨dØ–I—ÝÍÌB}k|¿ë3±Ú´>P5iÂ[M}6Zµ¾Ÿµ¾õŸPÏ™v‰Ùª?ùý¸÷žï;çÜsÏ9÷Î>ýüãWlÃß‚¸F/‡)Á’0/áT÷a!ˆEÜ Õ«˜|5¯^Äkñº ^7HxcoÂiæÞÌúo‘ðVÞ&áí<¿#HÃ;Ùà]Þͺïaø½¬û> ïgá àùƒ>Äó‡%|„5?ÊJg$œeðcdð —ð vü;>ÇÃÃ" ¢ŸäáS<|šáϱ„ÏJø Ÿ—ð¨„ó¾ÀÒYéK.q±×K _æÕ²ˆ‚ˆ+*†„O¨§ÔMwZ†žMï"fƤá ž Õ¦ÍijÉ\Šf’nœÏYZJ€pL@¥nöf2«H¥žÎæ ­_7L‹TSª¥N«¦& <˜3ÒݳæÉLjº{Ÿ Óv2«ôëmH#5yN]ˆ©ÉYíPî>Ú\H¨Z…ú-ê‹N &†âS£ñ v¢O@ݾáÃ}ƒñ©ƒ‡‡ÇâS±ÞCd#ëX.kZjÖ:¢fæ5õÄFvÑÛ?:Ø;:`k2:)@ì/ŠAc‡Šb•ÿn=«[{(ѲG¹9—Gxc¹«jÔR“÷PócêtF³‹°"âË"ñe-­Y¥4D;ʦ†”ÜO´ƒòS»wS$[†š53ª¥jy›£e‚+·Å–2ŠÇÊhŠø µ%Õww2ãf…b9"㜔±Ô[Âú'—~K[°RÓtR_ÅU:·Œ'ñ5_Ç7d@ŸŒoâ[” ßFZÄS2®á;Ž]׌I’ñ]ddÄXûi|¯Äž2eì•?èFâ¬w/[|º€z—sZsj†{SÆðŒŒ»0À«R…\¥“v#Ëx¨©\PÍd¦V‰5.¡¹·BF?Grá$×bÊLªMÆðc~"`Ý´~QgÃ¥Ýڠ˹™`;>ÞœŒŸâg2~Ž_hü÷õÍÏÌhWä—2~…_óðÏâ·"ž“ñ;ŽÇkjsºŒßã|f^MRóùìs§æs&ïðG]ûjª´ÖejyÕP­œ!âÏ\ Êq/gû/ø«Œƒ K×¾ærä5ÃÔM«{ŒâçþÕ,‹b£­-Å;<}BKÒcQ_æVÝ èL@[™H1r$Z:߀ŽÐYu¼V·b‚Þ‰õ)-£ÏéTâ^#=¢RŒåX‰ø¹2·âÿC:ÿkèteªèB¯¯3ú‚v7‡ìƒšaä ~xìÃѰ‘ýÚ"õån¾—sÔFkö±mºã~5Ÿ×²ôl‰Nĉ›Oè\Y:ç†hì?°s~Út¯Bc´œ#®C sI¯5]]S#‘Z„>‰†eÕ9›åGIò±w:•dåVïÞÚë¸hZõŒD©t¿;|à>´Ñ;é£Y‡?´øé¶ç}îwç~w¦çÖžî|—=ƒ¿%ö|ÀÖ?”öFòÄy"Í÷à•„L°^F„(W ([—Qq[Èò†|+ðm-@Üéí¼ éê£dÕe{pþ"vä@‹",# Nг­€J–¬ºV ?©D¼¡ªª—Q£t†ª”˨) –%"êl"DD!›1Qo DÔÑ` ¬r • û`="Jbƒ=¯ Ì®YÓ^†xÙ`/œ­Ï`³­ªçg9ÜîÕp×°~Úœ5#¼ˆ%"6ØDˆh²‰&&šm¢…ˆf"Zl¢…‰[ìs´q ­ö9Z o+`c¯3ÔöÐÞã#èV†ü¡[Ã~†üŠ7ì[ðÏ.c;ÚLæ› ØÂbçªÔÎ’7ì_`q¶Î‹Ì2¢´ŽŠ@RDÈ´ƒÛ4J¦®ÔÎÒ8-ÉŠöˆ^´kyœÆÍ\ÇøD¨"èwLRDJ„xküÇxõ^ÿ?ñŒÀuŸAÚé ê|Áî9\pÛczzÓy—>Q–Ž:tθtˆŽi¿âYr¡ÈÏ9¼p>H4ëÊ5ø„ Jíd[÷4U<$ÜíÙ«pÛN¯§ÇG‹Æÿèû¯ k§#Þæ¦æTÝGOWM{›Âþ‡QÙþö£K‚¸á,oÓö_ØW›=‡:â‚ÌöKx–@ëŠàSZ(‚ œtÀÉ"ø óçÐJBDTš›ÅãÜQ[»‚m8:Þ%,(¡S—m?cÛî*âÇ•ÐKJx«ƒû–0 „zJøÆ"~»zi ßRô³~5"ÎEÓv76J õóŽñ=çžÎÎRØï¤)"ð²ýv œ^¹µþëØ‰ÚDYr@[ þÚ×Ñ_ƒ|Jè±5ÈDB'ÝʶØu¥ ‡v®`×%ì~ » Øs {/:=ò/PK‹W=–ÓÖPK9Aorg/hsqldb/resources/PKPK7A(org/hsqldb/resources/BundleHandler.classVéSg~–»,‹È¥Zh1$ÐÔ^*j=ð 5Á ¶µ YCtM0Ù(ÚÚ»ö´÷9ýÖ/|é„™à”iqàƒ3ý“:Žôywˆ$8&“ý½ïï¾³ÿ>øëÏá7í¬FCâñšŒ˜‚anœ•ñº ƒ ÞðMñ8§b ΠηTt@—1¢ò2*0q~âq^E‚aLœ’wAÆE-0e\’‘’‘–1.㲂S*6!#hY¡Æ’‘SqW…© ׄžA×…–AaímïHð\ÊYÆ„„†ÈýŠ2õT"tbä‚1jí‘à5Ó£ºi,SsVÒ El©u#¹TÜ4útñŒêãZ"éL"4–½lÆGBfr$Ô§gÇH!³ê0G’YKÂÖ2>f2ú5A†Ç3Æùä*·¬L2• µ¶7ÊZzÊÔÍœð.e\=fX‡l QÃKÇ%´–HR™ÉˆBMèß›L%­—%¸üƒܽé8õT' +Rˆ¸ÉßY)æÚK½ÈÎè#¦Á˸AÁìŠ`³¿\NØPLŒãV’®3u‰¢»Nö$tùË#-Áôšz6Iëq#³§3l—ý2»ÆñÙa—°Ý.WÒYŽb±}è*eû+¤n³¿síäÙ]÷®cØ“0´¦ó¥YX+œÎÓF6ËŒŽbÚzOÆû”½£¦]0 »Ñ£¡ ÝžAHBۊΰi m”È]2RÖrº%Ô¤r¦¹Íée¡á Wû{(—4é “RÒš™‚;Ù†ñ‘†ñ‰†g±CÃM|*¡¾ÄzÊ2FFÃ)œÖ¸ž×ð>×ð¾&¿Òp _køF\oâ[ÎÊZQkã; +ºKB©[•C ëWGRD•¤žQU̽†ïñƒpùG ;±ë!eÎñ“†Ÿñ‹†_±O†ÊóÍ–yÔ@kˆ¢Ÿµª˜ÙÒ1È<ö™±Lúª3NøÙÕÍÃYܺ‚êgO¦“¬A¦$Ym+yˆ&³Y榘馿 ½+æÕ«)NCw%†2T¡è–b¥‹…hòW˜>.ŽŽ„ùÊí¬´…]z<¾ÊÏ"û0wW6yݰY˜XøîÏÑÀ® iRI./×fª¬ÄÒñXiÙã,Šâf9PA¨¼´Ø>•UTظk/•âèUPϪ'SWÒöî É;û˜ÙSña㼞3-ìà?m;ß¼hk‹'Ul.r‘ØÛ‚°/àEHx‰ç*TóΑäYá[”=¼ÕJ„žÀ,¤ÛŸjìžù™«Û4ªbǦá ,NE‹Áy¢½¨F¢Æ· %¼Ìg¤%^%ûÅãõ´õ}gàâhú" {¨ƒ;Öà™…w>0WpqJ4¸Ø5Û¶ÐÊ× ð·Í†E ®ûh¢þ>ªÿ/E½DºItÓÖa)øþ€w…ðÖäØ,”†ê<ÔyÔô¸…=Þ…å¡‘æs<Ó¨õyòXwuÑ®{ù(â ÞÁúþiÔwçÑ04‡ºÏy4ºã³hŠÚ]y4ù¼ £¦G&ôÉó”–«&!“´áOFµ9Lб ܰ¡Õ x–,㨌c2ú`ŸŽŠáó~÷{Ó#Ù.ÇrX6ä*2Aa‰#÷á,ªXû…xN³¶¢:ÑrÜû76Å\Ø<s7bË@ÌÓˆ­‘@ÃtvÛTTš¢Ô&´qpŠn5ˆ&mG•Œ2N Ãæ‹ÿµ…>f¶Ü„»xu€Urjm¥g‰VÛc®mi±k §˜·©~‡ƒv6ØY´¨À¥Ö ;½öøVa€Ó àÕåQÜiOœ£bNã ªîàiÎÄ:xß>#fÅÏSç êï€ÓÒæ ,þPK­Xê8 PK—®A.org/hsqldb/resources/column-remarks.propertiesí=ÛrÛÆ’ïþ ”ò`ªJbâÔní–mÚ‘Œ˜íè¼° ’pL JÖ±òIùÇíî¹ãBR²|ì“uUbƒÀLOOOOßgü“ÅázQZól±^¦‡y¼ óÅ“Ÿ,ÿÌœÑ̃³SÇOžÔ_Íða6¶GN¯¼Š­7þ»áàè°XÅóä"™[QX†Vy»Š­4\Æ/¬ò*),øÛÎÃ4K“y¸ oÖºˆ#+I­¾çØcöÑбÂ4²ìaàxüwQ†e¼ŒÓ²è6!3°›0êjð®e8ð2¼µÎc+´þ^‡ÝâE7€¯…jx߰篿ü’j¸g9 Ò>7 Màw\&Kjž¤eœ_ÃÔd£â€Mž‘ÙÊãr§œY:OŠX°S¬çWVX 2³¿ˆÄîÈAÐôÊMÞÛðtæØ|œÌþMÆÁ›ýFºœzNßõÝɸÀxËðS²\/*Eò¯ØºÈ„_uVézç|¶Æú 0«R$YÊ{ež¤— qzY^áϯÂ<œ‰Š*íjôÚÐ×Ê.è0“x#,«Åz‰tdÃÅ"»F“H ~Ú1¬H„Kµ\e)Ü,ÇÓᨤ0´n®â<6ÈئYi…«Õ8û|!¨ØÎ|~@æó8Gd´ùÁl‰?Ä›ê9êø"ø¦ŽÛ:Ia¢ç·•6q!Q$š9fèƒç»¿÷L4`B–´qË !^$Ÿ` 4=œL÷Ñ.þ.W Úf ±ˆ­?ÖŸ Š«ótŸª±Á^lX5(Ç¢¶›&éOw$üžnýÖó,Ö;Ï“‰ÔÙ©íÙ#¿gŒ¢D¬?Æ·7Y+ñ )¿ß/Cx9Ïrà6ØÄ00ù8©„ —1¢\^…¥©\*2M€G¯€S ï°,Öc0/€×1Qó*®HéX"%¸‘=?Âôr^Æ‚õç뇲†è ·ðé­Ü×îxü¹Å…Èâ}˜8öc#ß"ã0cb’$enaÛ}ôÿX'@ùDöà[]®½AuZÎHá‘=´ne Q`¤¸²„½u“­BÛS~{/€½·½þÛÓz±éíq:Âf_“@"nJˆÈAðš©U,¸è×ÕÉŽ¹µÂΨvN¯Qbà0¨£{4^Hq+Õ ÂýÜúl3k¼^, ëŽþFÖ…Çiú1ÍnRëÏF6¶}gæ;cß Ü÷N/ð¦ŸCµkXć ‹„X Õ¬?m¼‚Œ ”éažðû…ul}ЩH˜PÀMcú‘çkŒLõáã9| )â܇=lu&éâ–}³º]kè¾uöáÛQX€îì8Ÿæñª¬öÝ@àÜ;öbdZrn·»ßL‰)Ðàdì fvxîÑ40©¡VH²b\‚&àb¿‡%hÌóuÙ ¯j»Òªqïà ƒF^i È¡Õ1óûö° »+ÐSÀêBU<343®ñ¿uRà#J¿%üÖRV‚1y(Œ™˜ÙS0•Ü1l§‘3zÚÞx\ªX–{aᬅš!:ËåIEIZÄyi‘m‘¾X§Ékm÷²$W9ÜÞ(¼7N]ÚóI:ÏÉ<èpÒv-;Ó!%T\‘Ô Y¢™3´Âu™* |ƒÑ £àg«°{Êd¾^ϯ2À‰Y»¢hJ#‚ÑlbL€54ÿd8Q‘u bI³oÈ=È*ÌóBʵÉOêIMùÜ‹õj•!é„ù/>¢-”F\*EI±Z€ÖÈ`ÿ‚:àv7Ž( Ù¥už}Š‹&ôGîØMGœÁÁ( û’ñ«º±£ý»Þ‘¦;tDË_y8JÆsÒ.M¢äÊÁÔkØ®?tÉ‘8~ŸÀÁæ‹¡¥5°ãà 7vÓQïrr©ãb ‰ôÖûF80¦Wvw&Ü->ÁÏÒv-Öçó,Òü-a‘GN•'ÒCô4Gá:±E‹˜Üò옄ºÔàÅø2<û……Øîl[õ'Ãéh<óÝ8ÒPu¤ý¼\¢{\&%:E¡”vG]ú„ÊÛsôIª7‚£Ð:nœ[ÍߨúCÜögàÝÏ€J†žkd—ØEÅ=E‡'’ÎlŒ+^€Š&¥Þ2Ì©7é?hœUžÍãh ¶“2³œ{ñœ‚›G‡]ÏËî½%–+&Y5£?˜J#ÎÃ%{Òd&;,*·ÍÁiÅZä=&†4Ûˆ)éÚ1²|0u‡€ÕvŒ€4 ébr3F†} Œ€Ef~0ë}Úº+õü8Ð4äçèZé·ð:´æ P¥lóPzJ‰ˆÐ¨ºÇˆby/³üv&®ÂöÔ`ÛÇ7¦T:`|0—L³¬(qkÿö~D’”o’óu‚ZbEu£~°ž§'½õÑêH£0`yW+De§™mÂi"~áèmÔn*P³q‘a…¿ˆh|íAJ]'Ñ.x^'¡š+Éó‹pÞ¼8n»sà—bñØ,9Â=„Côô@ è?K`4Wóm(ø¥ân¨nZÐî$]0M¢Mï·"gˆ=íN"¯e¡'ÎñlâqWŽÙªdKðt`Åü5&un†¤ÌóŠ'•™»æ35!nší½õ{ºƒ= K”^ªBîÊRÓÐiÍT ÉÊ š< ¡c^ªà½Ô#«º£ùÌêI©p`ý ¿€ÉÓ2)Ámø/üu™f ‹X%OŽ?ð&Ü8›î±ëxOÚ>‰'`ÕÃb®ÑÒg+¢,PûÀÒ"º »eþbžÃˆ£¸ ÙvðÜ%ñR$΀‚¥½ß”Рשóͳ_­ ÎFOYŽÌ‘AwƒïO.*ðñ=n΂6X5 MÞUÑ>âÑôøþ:ã“à‘aRY›óÛ’I–J.D1%G1¿áÌ2Óâ"ÅI÷ýÅ ºž/âVöHNûµ=WEYΤQ‚P\§HA]ü¬oöÄ ¨Ë“"[çsÉð20CÝ¹ÐÆgÝÉã‰Ä;OÒ0g!«n„ò&™Ç›ú›W¢hØ"Ì/… ¼U•ýIÚ&ûUÊpÐ$‹^Ïî‰ø=)÷5duktê;ÓÁ„3j/á8YE¼Ž2EüRkÓ‡Äë ;wȬo=ð»)rS¾¹J€MˆÎÜQ$ŸV$•oÊeë6ð~ÿ3‚™_ÅËðkÀ×¥³nïm€ÞRä…ÄáâžGÛ7Ð<Ä·ÎY/Êb)\YD/YaL3pì“–÷«ü[ ?–îoÿÕ¿ ð·O‡nÚµÞ'ž=&^ïlñ2cÛwöb¬Ãw/»nux÷¡áå;C§`!‚ïxð÷ôKÖÞãßÝn÷ÏÖ‘\ŽE„ ÙAÏ­3Ç·ÉK ·¸˜Ïs`'ðƒ+,ü)K¶ÉêÍÐW:F"§ÊÁÆý*üúuØô ¸³ èœèÿˆ>hѹ"ß:æPYÑûDê†Z„°:ÊèÂß0º ÷·Sø ©¥Uâ²t8ìŒ5ì·†´JòÞ £ä ¢òd‚XBÅ­,h!T–À÷ëЕ?M¬Ë‹Û¨ŒÍyœ±š¶ðÄ9ÖÙ•ûâ“(rë(Ö¬}¬•¿‰±EœÅ¾#öÅÅ[ê½¾UýIeü¿Uí‰\‘7 õ'}@TH:±=•²Q’Où#Lò‰Bq^ÁósŒ* Ûµ=GÅ«Å*†oàŽ±ºd‚õ—“qü‹ø“D$‡SÁò#HÜg56rÍ­T KánBƒ¬³L.¯˜÷yƒµ’`‰i[‡ö–¯Ÿ>µ:ÜìÚ¯ïJª ¡ž†´µÉXUª!lEÆ%R‘ Ÿë%¡¬tîJŸ––ç×7 ÊœaŠ}Ñ Øv÷™ËF#EÏSÛ_kÐÉÔë;šd`*[Z8L”`æv^Jã ,üð2NcVsîÅÜZCÙ@.òli \fεàú;îM0052€UɆ…]βz Žr«óì9֯ϵtßs–ìÃ\ß¾fì{߇qÏ÷eùvvúVÿÌ&kpäºDœiìóf°ÌügË\w·Íl¯Bl³Åü×àT<Ðñ}ÈG*q·yß‹~, ö “—`[aéTÜØFR¾uÎf¾ó®WĬIp­‚§2c`sŒêkZ`1?|æMAð\a¨ S cÖ+ԉ̓ Œ!%†´£ƒŽ4F|A ÷ÿÙê‡`üE1Ë—tT€?¸árâO€”Î8³l²uU`bÊ"L£x‹H\XEõߎâñ[µÀúÊj+Һ͚{Öv—UzuFþ‚“Á™ÛÁ…Ç(%¸J`Ë€‡T*‡›—©«ï(‚ãkn)`X•ÏÛ2{¬ë$[SuгîÿtÙo](xòì#wèg=Õ ´ù˜·Ù¼ ›8)ÕÒ×ÒeÃ;íet” ‡Þ‰ryhDûO%×ÝñÀù]?ÿ*_ìÈYÂ6g$¨ËŒ*ÀmAœûCÜÀ©À«OƳéØ}7ÅPmÊGå%]äèˆU~]ïKO³wS{HÙÅfJmŸÓ6¼Éa°Q¿«-»XeÌØáMX\Ñ•.«]© ÔL_¹‰%g .»Uà¨ö6¸F\$9 ¸±rT9™={ÏêØÅ<¦ƒzh+ï àÍ V¯&Õ·Ù¬pw1 ÍÃZ‡ °qž[äŠë‡Q¤—ÁwTmb$i¿>Ä©}âøø Oíáª]:»ŠŒà f™qçG¤†ÈÇÁ“& Ðä¾NŽdäŸéUÕ"%‹€’ž‘9_%»À_b–lÇú9Jòg?w»]|H_°m7þTîÃÚ.âÁt,©FíB¯˜¤Á)ßÅ@5A`ì+ú³@â*+Šä|åÌKp5Y!¥Q_H FƒÿîÁÿ”gNƒÒ‰/ÀÚMÉ¢¸ÄTù«áu–D:ñrUòêÍEF¼Î ÆHeº>ô˜ç[òM-Æ»¡Ó4Bà"<µ¹¢“Ê…Mý` z²ˆ aÕúžzîÈöÎÀŽ‘Ë¬½Ú(›«ak]çÕ…Pj‹€þR°ÒmÐ&H íZ-‚Óª9Z ¶Š "|[àëD§Š™ðÃóÎ`ê9•¼Iõ½zѼ¾ê¸FÕ[a5¯êñ©Ê¾Ò­lí«¯\‡W~ ßabw¡>¹‡OX”gßP"m Iž|¬Öîg /"yg¹cúc2 P3ÒŸžL½1=øÓa ”Jm¸i•¶©ç~ù›Jù·*ŒÇÄ€vú©éR‰GÊ÷40¹8`¶)í³ ?µ¦~Xé8¼­4bùTTî ÉûvCÂu|Ÿ=U(U )åŸÚ}y-Vt’Qq‰‘é¾´c$?ÊÕåíðŠ€;F—Ý+°£syÖ Þ6žÿ"IF¸îoõ ¸mêfî”õÇYôÿ. XÅ?·jIDæ™ÑcÉwÖy–-â0sÅ{Ÿº>»çOQ²˳J^à?›uÝE2›ñbÔº¢¸&wE‹XŽm½›«˜×ÄBÿÒùH½g)öV›ã55 þ[<ÌÜøßuq.[÷'ã±Ó¯GcDWÐqi<çUŒ‚ãjPPŒ0><"úc’•#ÊÒjaŸ6âØƒ‘K‡|thö…Ñ2a¿^×úá-=ýÉhäzO4×eÆbüŠë=ÁµLÆÃ³J¿<£C¼â¥¥ÛÈþÝ›|ða µä<ëþ”®"À¯(Û1dRïlÌØšàÌB¡+‘9æ†ü0q‚R‡©É"Vb‡Êa‰1ÏueàeA·y•t¯W’ðkò\˜1Ì–×O~* à<ëþo÷—:«±‚… ±Ù·p®žÑ^ÑA"øÍÅʨ—ä ½ugqîÅ6bá-Žðê/íXõ£|P>(sBG†‰0úó¹^"S½èއ¹é —ˆâT"fÚkÍ Møø¨W¨W^k±Hî³39³¹9ÏE³“™ŒêÛ3É.Ë>Úo-ênì°©¦»Ú¡­¤ûy½¤›Ô,ÖtS´ ‹º‘(›Œ‹KÉZµ–ÕŒŠntó8ŠÛKºñ š2;WrÓæú;®æ.‹(ڥͫ‰TVK’•rî¬÷®óéKäÛ“áäÈjf±[ø8;8F¡‚@ïìT')ùšœš$aå7tQñ2Õ²6ÀGÇ3‘?vÇ'twСŏb&£öõžR¤{Â!ÏX%’¨é`Yš>чý¥Žg'ÎØñè¤ iÊ*eÖŠ–5§LÑëêúí±ö0‘‡’‘°½3ÀgbÑꊱ8"g¶ò&=é+ ®‘3šõK‡P6ÎïAÅ’”³µ3Ò¯Æí‹¢FªYã6$s!†æ>¢7ͬ]É b•(ßl݌Ֆ6dµiÛ¦Tí(â-*áœcwLÜ€ÄÙÃ%Ø#óX¿Z‚ z/’oM܇ Ý“ÅóEÈ⊠ãÑy¸S;xÓ£3ª¨³8À2þÄÏÁiaÃ6À’“0eÒ ¨ýDÆé^œá¶ºÖ¨Xt;—•õòëe³¼¡7¿ÇTëM—bæ;ôNÆ'õþ‹,½Üè÷d<ñðì¯çƒÁI¥}˜ Í tuÙ®D2àáæ0Š˜ñœÇ , –_-¯ÿ¬ô»é­qBƒ™kx0Æ>A¦Ä¨ÃOM6÷)`Ä×1Ha6!Øk ÎëænT4€»‘…½ô‚ܘhÄ„D÷ÊïßÏýî?.woH*ý¸ÙýÇÍî÷¸Ùýï­ûÿ‹;Ý\è~õãB÷¯z¡ûW¾Íýß~•ûwxûw}‰ûwzƒûëÛ¿ëÛÿ“ïnØÅí»µý›_Ùþ·¾¯ý?õ²öozétÈ >k±Z€Šy3\¦Úð8keÊT#Q+€mG`Ñèq2jF¹_£V _k­6*p×o@åGCØAQ:ýÍ~oÏ&G¿9ý€Â¦>qþ(‹î)]LCQnI …+ýÏêIVyàT×"ôÌŽõŠ[ë“UޤªÓ¶z0¶)> ÈÆx=ÇŠHŠˆ:T”ÚØÆ(Gõ²ø›‘ƒÙ«ê¨•Š_÷Pò—B˜Î`ß ÔIJî é"^Å€Wq þ ?{ÔÅXúÆòÆW¼ª‘’Å žú"cp•'×É"¾T™\Ö ${à¢óÇ2™üÜHÁ_ðS §÷Ð f]©67ßn‹+7¶n-76׋õëaæJVØ‚«‰NJK#½–¼á”Q¥uKhÍ8…Ý6¹û*H ,°B5-N­lºñ™–¶æU0êŽ2½rTVù¶MµáÓ–¦¿§´ZôVZ§¬ÏxøS‹½bžN1þ¨T¥ÈóÕê”ë$¾i¨MÑað­°Në7ÉWË w€Ötª»™mñO&B\™Ùê«Ä ˆ–\•ª ºf’ŽÎzô‚eU6+D]˜tÿílrJÃÞw³oXöllWzOÆÎÞŸfO×g‡™ÉUü¼wæø¼iµ!Cî ÷™ü¢;æÒ™Q^`!²êvB‰³ûÔ·OÔ µ/XÇ¢Ú«K•&©£¶Æmy;á\ Áh(‰Ú ‚‹  ^…ÔÐßäcC~nÚ`_K¥»õlÉÙ5NRÉÊÊQ)íà4j½džà±9ô™–òWXÔyõeAu`ñ•ºçLRð<¦hº¨ëÖyE߯b/?|§4¸£4BØO´îìÍÐ5¾“´h o} ñùGà* öêÀzeË¢JÍßa‘_‚iŠ•˜0®ö‰™zÒÈ!l+UVÖ8Æ’”Ú?Ï ÊÑ$ËÖ /óuʼü*;x“)ØrN“ì0>=˜%Z¡Üƒ)ZaìÊ&Y‹\-Д:L$ìÄ ^;¼Pó†žGÉdBCq³"@$Žî€»üOºi‚·€ŽqBžrh½”Ý ãWozÉ‹©¥ 2Þ3‚ƒVÀ¬Þ a5³–ï´ÃLxj"µm÷Šc&º6ƒ½ ñðl4¿Þ®x6ö•5¥³±—¡@Ä¿M¦-3ýT/•JzÅ®o¹5)%›¨%­/Í¢|ñ Ó‚ÿ=$Æv›¥Åöþ$…VtúnŠ®«V/Í_È'9yl¹Iò5ôRAtk*¯÷b_ôi*Ñ]Á`¦.ÛïɘAÈwšðœôô0s7!JVå*q±Jã_úÑzñphµ‹¶ôR1x5gF®·îŸõa¥¹9®Öã&^Õy ¦öS¼Ðm“VTY”V²›X#_µuå|UéY Q·ô%ÞÒîúãëÁaÑTÕÁ-1KÊÁ©ÐRl¶“pßa¶g÷±ÌÍwöf2RÄ•~ÑYí·{ŠokC¥ïm K˜¦CíÃׂ‚+M+ÑÒ/ukØß-½h XЩ¶»ë]vBm=· ¡¶~…P½SCàµvõgk(A 7»“’ƒ×B Ì]Æú— m7¯~SÏ]Ö¿©ßVxdoṗ9ƒ› n÷¿;GU•ßeÌS7Øï!/jÝva—Z§­¼r/÷osÇdE‹øˆnŸõuº¿TÐÎýIaOƒ7Ïý)i͘oÍŸlŠÄœr6(#[B32v‚%,UßñHwy“!hág°¾ÀûÄôÒÔc’DE¥ÀlkÔ˜ñuêVomì'•ßæ¿ VÛ'Úþ ·,Ô€ñxLÂÚ"bw…7ù0vÛHÌt7()qç>‚ëÖàñ«#4I¢²[®L«E¡Éש,^çLgĵÚid±@»,»¿ ò.€höÕ‘‘Ë·I}e&XôHç+wIG20O 0¶èP¦0ý5s\jI@ýJ´†4à“ÿPK–@7 ¤•PK—®A-org/hsqldb/resources/content-types.properties­ZKä6¾ëWðÞRÆôc’Ùú°öqH€÷¶PÙ²K]–­¶äG÷¯ß~‹¶{°‹ 0ÕÖGŠ’(‘¢(E?¤*“MáHªÒ«ÒÇþÝ*÷C§ýíYxU—Ò£œTÆ€ªRñœš—>H¿ô1JAÇä‹´¶Ð‰ôº*¿T‰W>v¾VÒ)¯±eãoUÝÉZÅW]‚Áœ3iÁàΜʅ¼&/^õþK[¦ø2Éõܼ)„ÌŠ—V§ªú"KmPR½:i+ç]RkëAÉ^d“jpë,ÑZF»„à'áÉŽe'd'e7j ei;vœÆnWe>Ö¥¯¥@ßY…R¶:†D€WSYݵŒyxxˆiF›’HUË4«2&á¤C!mXÓh°N>™Ôú5 ¢ŒA2Õð/èi®Ð¯WL™Ë¦9écãb™eìܤ | Ð³±[ÈwU?¡YÐBQ—°Û¢Éi¡5Ó\¥Ó‰ˆ¹NI# LÖ„¯«,ƒŒAÚôŒZ=517 ŽÌ²u ¯‹GìšX]±&LÀ BýË„,CÖï": ¤Ë™ª/¬‰=7ú9KW3MËÕX즭E˜».ÓªsñÀV…ã@ùNàýýàCþÐöI\Ýãî&®GÌ@ŸeLF…€É’yñ$"ùñÇ- Õ‚úðXö®J‰„ ÚJJdÔM Yk$>™I•TR$iÖHaÿsš±9)•'ÞDÕ¡kºkp«ÚC #õqÿÓÃ/q"Gzr“¼‘›`ˆÒ¹sƒöôWÙʸ a; ¾¾{}¤Šq ‚<ÒgW&˜ÂªÌ‚òÞ”KJ¬ÝLžõ;³‚\+ok4§÷ê… ‡¾ê‚MLâb€š±àO§²æmo§òr@jœª§yÞÙˆ<}ÜÊM0…ˆbá[„­°»À?b>ú~«á4ák-ÕµJ°}ˆT)Ûr"a ³”~¾^S½îi+"*Ÿ59ïài¾b­Vˆ´ ÷)㙤€ý!lCãĶX•y]5%huÓZf^—¹HcÏ×jÚnG‘î¶ "í²ˆƒÍ éà2°‚ü!i—‡{*y™ˆÐÑlùevÈøij eÔøIÓiUE¸|T¡±óª"aȶɴGz´g"TÉWê](jl/Åצrµº]zæû¥kŠ>„jßæQxtÚj¯Îç/X²Q6·”U5®Rdß¾í _vsðP= ‘±%Õp/²€)eœ|‰¬˜c |¸Ñ€¬¨f梪5µWôKÈ›M1­£IÌÌjSˆõŒNžÓ8SÒ7ˆóÐÙp¬sy3Û¯‹0mìQ1¡syYåPI¼Èšò>ÅUFÞ•È·MæÏ“¬ü9“½È%àKä³]ç0ò|5rs—.±ZŽàÿYÙ²‰”/) "÷’ÛA"çÁíµrÇ hGÌ)2¡Ÿ#<-møÎð-Ðþâ­oâ¶ €ˆ›*¸t‚2](qË ¾Þn6þ×ÿüMÜX3ÛvŠkhã@Â&PF•ÓvÙÆFq³ùioì'=} £ú+‰Ã’;Æ¿O12ðøëÃ>>‚·5Ä͇!ÊÀÖ€+¢*q2h6'LúaE”ýXêÔµÕª›À~âõBòËLÕªLÔÐXUÀWÜA«–0ߥÐi±j5[¾¨ä¶ÅœùUD4Àãö3:?æ ™ 0º[.ÞÛ”ˆVè2\Ú(ãv‰ DÕä\œÎ˵¸DŠ÷µkŸ §ƒ–ö“Ð^hîüuÙb®àu[¿è)c¡ã¶&…³¤ Ý*X…R¥x•«{Á7Êm`SKyŠh]ÕÔ‰"6Éùä!cÂÿc`Li—¾î¯Vå´v@ˆýµ,¶lø k-e;ÓsÎ3ÎÀén=Å['^ùDÒ8&×òÚÌ'~|µÚQŽâN®wÜtŠŽÊ¦ÁiUñ-+l÷]x{§ðöÎÃ[B‹ù_:;|ˆ¨XOõ Xl擦yF!/ÂDÁNR(Cðí<ËÅ| ñ·þ”] tòÛ•R˜ƒ˜£‘TÁ~Zìö½1(+œ •5ÀkÔ-aU!‡LáOôñq;KÄ©¨õ©ùe¡Lý:W ×!øƒ3`´¤‡Œ0sÐmhYš§YUS1¤>7‹"¼58šY²>OÙÄ@{F™6rfF”¹†ÉsUi¡¼0É_x¶Jæ‡Oicœ/ï°‰øñl¬úðs”*û‘L²öÒI✂U|€vÎÔ$¨ãQ*anþÅ ¸!qu–üõé‰ lcÔ»î –;à‹%_ýêtû­/£uíºD•iu<Ùû ‡~Îäë?§Z!Çø£=ˆ Ôç^Àº®ó¢æuÍä"–ù}þ½·EEî÷×;ùï*Õò¦r Kr°¢†âÁ‘šp¸J§~þŠNñ}Á(j’MãÄyÖPE §ZcdLUÍfð†^ÝýÐûcL«¥—.×ñ€cŸ¶V­åÁŽòËjck”Þž$äó‡€Ò¶Ù,רíÍï¹7Ÿ,±¾QÖ‡åÕëiÓ–1”SLçÐÂt«¾ãkzsÚDÕ»‡‰ib ¦IıW0ZQÎì÷ܵêûprõæ>¤û“ÒÝD_áøõ.„™Ø ôèÌÙ¸Ìæ¨‚Ò)›ýßóÃ…º }t­KÀyŒu¦ÜŽ:G^[.0õ'cßQ 'BLQÛöàsréó”j¨ur®lf`3Áa³(CÑž÷È…Ëë*ö¼Ù9<^Û3‡nûØÄ=Ï£Á—p²Uæ“#w½sU Ü.­WT¾qcR1¡T q 4o(«@޵ƒPE¸Ô;¬cט(CvÊÓ»4 ²]ub¾ w”!Bñ(‘`§Ãe&pîÙf¼;Ä»ŸÃl½G³ªÎTâ~õñ”új(szÍ/; _"Z‹´õµ¢»>²ž¼ÑÃÇn}׋éï¤%@t*|§R›æ'õ±é;—ýøô,:,‘é¥ð£¼ÖD7ÇVSkÐ2þ'¼µ‘”Í1þé$?|W›^< êÛawí™vAúéÿ¡ÑœÙŸ?©™žÒ"NÄtÁ‚Kѽq¥ÑÕšjˆx"N€ Zƒ/ýq÷Žˆp¾ô»úcC%îÎâ¦0nÐ7ÝuvŸG]ç{4Æ9¼jé7 Ù~JÄF!hæ}ìjDsÌò°Íxx$SÕM)zl™}^|™^WŠ^oâšž¶¿>T†êU”hÄá>»LÖ,äz,dgIïŽÍb’c1»µþ1é±¾Öföû1;Ÿ°™ýH‡¿ßIs,f—zùŽw,æ(Ïy*ætZý±pîïgöö˜}÷ubïŽÙ»?£ëKRÃ7@²é~9çâmg¼3¤¼;߸ʴpCBÔ}†>Ú€ Æaz½w¡Éâ`Ð &Û¥«¨n)†íƒž\‹þýƒß¢œÅÇ"ú$rÞ¿Ò<ï$Ž=×ʨŒ—m¨HO;?ªOn?ø€À¿ÿPKÓ¥§lc7PK—®A;org/hsqldb/resources/data-type-create-parameters.propertiesSVHIMK,Í)QHI,IÔ-©,HÕM.JM,IÕ-H,JÌM-I-*æ öŒru±ÍIÍK/Éàrquöôuô±-(JMÎ,ÎÌÏÓ)NNÌIåPK®PùÈMKPK—®A/org/hsqldb/resources/data-type-names.propertiesePANÃ0¼ï+"qîö°q6©‹c#ǩȩŠÔp„D8ð{vS›qðÌì¬£Ìø¡º./ó×ëZ]çu>¬ßËá}~[>b¤ 7„ÚvÖ'¼Qž.¶aŸlš²]•Yöž¢ÚJP‡à˜D640þ·Ê­²‚çÞ¡øPKk^;S >PK—®A1org/hsqldb/resources/data-type-remarks.propertiesµ“okÛ0ÆßçSô…Zˆ×Y[â-tk¶¤Ý’@7Œ_œå³­Í‚$'íº~÷J mмL`ôpº{îüC:‚Œrì*äæ~M\Qê‡î½›^G‹o㊠¬ ’†”ÝE‰ …Õ °)(„`>ó<6bð :™?ËÈÉ÷ _CÝi)‚@M\6š-Ü”t¬:m”l ­=ÒÆÉ6·Û²­š®NmOims£û@^áÙÖ>æ~z°Þ$ZE³éõ§¿æÍ[U£Ñ!°X‹’j “ÝÎõš„Ì¥àkT&>Ê55&ap¬ÉfÌ: ¶Û­'Éä^«ŠÊ…û‚áèÜ3w°Éæ] —w↻|i°2H€ÝÛÅëšg³±GHz7««ËÅÿâoéËÆŠÖŠž]l": ™&%­ø‰F¶Í®ü#nÚô; Ó[Mç‡ ¡,úµÞ#p5ËU4ÿ|¨Pÿ‰/†½Kìåû•${˯óÙ‹wijÈ~ǵû/[Y+:w=`+M Ë/³7ã·.Nh3 Ajû–´)e ¸ý0 '‹%÷ÆpðÀ÷>y]ºÐiÞ‹ç»OÅN³õ›AÖe'â'£¤¿¨áoÞÒ·'Z×îÞ÷»ÆÈ†jæªBg<˜GÖ›é*‘BwÇC½?ʱÅï\üèük <¿\ƒÏz"+ {’Qê,(DtË–R&º ŸÙ†ù³ ÊF¦…i¬}¢õ-m4¶if•ë1µ ó¾kô€´K³!¯Ðæ+Q³7›ox¿Å§â…†/ ²ÖxjvŒûª:oव¯¤ùÿl„iôvkÁ&A±ú¿!ÓùË¿tDð›;}0êwooÎ (ñ­±xpçs`kúÜÁßéÿGcø—EÊ'Iè˜cïñ“÷' Ò,t6 ºø}«üýøf<Ò´K4½0J"'R—¨†ÓáÄ’Ò\”h&Nj³UÃ~í$ Tp•¸R¼v#k/îÙ±–„š›)TUsÌÜ%ÁÏÝ™ïDT”öœaƒg'€=@ÜÙŠ@"ïéYÚÊ/Ña8_ù®æ;ÁÓÊyr+Wê:a³ŠP¶:¼:7Èiƒé:©ÚZmðZ]'VY² ^²ë¤J+·Á+wƒV¾€¼€Í3ØmdšÍJJéÐ4[Õt*cÓlWÒ*Nó¼’Zitš•´jÃÓ¼¬&VŸ«JÒ:Vþ«Ϟ݅s: ƒÄʹ1DÌÀ±ivß?¸/®¯õƒÄ™»øÅs´ß»7†0Äø\„ÜD\ 9b¼@…9rd· 80­¡>ÀƒµwGæ kè”{§ Hƒ`"£’Ñ •ÔŒõË¡ùÝ`¨7ÁަCÃìw¦É¯G^ò¼px.]àÞa´'ÜyñÝ,\,È‹Ã`?0ZýÅÒ÷f^¢Íœ&Û“æ,Bø7yvµ ’¬²fIgØšf0%w™Xë¤1ìšXòäÊä¿zÄftÐoýÑí1[å÷¾ÿ:¾z¿m¶KU½£[ûs&²ìKi ˜öñ0i>YÓË6±;¼,¿ÆB–8‡¡wžN&‚U Æ_á¿ÒÊ0T×ø/4}xxËg’¥9ÛJº_yô~2¶úh 9Bý›ë#'åT¬dôç ƒ0íFrÆQIÁÜ¢ëúÞÖÞ\óʯw¢& ÂïX}'v@"¦`GŽçc'­@§‰âYmg3ç…믕½–u iÏ(Ðs?¥§¾e÷Gû @ê¯[s…ß5±©”(kû°Y¨šð Ç«å2ŒJ¤E?Ò+Hek~ аznZgjZcó¨´.Çf×0É“Z]RY‚œï*æY94èw¨i¥ Ï ¯ÕßdÐà' AoØ£{hAO˜äâ-³õÀ".׊¨š·ÁfžÁØ:*,ïC=Ãî|Îa5/µhŒ?ì#r™m¿ŸÇƒ®ø"Vn ǘﳉ#…ÕÞðŒæžï¹«Üò^ºÐÛ…ºzAâ>E^òŠŠSœDŽ·V²?¯õ4Êjýí¸©ô©Q|‡]P(xÀ%ÑzŸ˜ý¡n~Ó¾ߎ؈vþQolýÛÑZlÞBÙo4Öôù;æî£³òa¯…éõÂëÈ}t#4â;>¼ôÝF#Úrñíj9w²·ÖøIç³ÑùrÄa‹¹¢‡B^•& @o`h2ôNaL+ƒÙÇ(58;84®÷hº¯©9^Ø’ÑɃãòª…ѼFbc´9A,ƲbÞRØ€ÇÃa_EªÇâh‡ñ`p£Ã$P@kæ}i¶fƒb‰I­.¡(£¤jõ–O>j}k< xjm`Ü@3ûú ÿOŒ€–máêµhJjazWßhµÒ¯¯fßNk°}úŸcšâ’&½35ìË(Û1j;”-m¸7 Q¨­bôýù®3Ç¿óp…ø /XÉÑ.S4Ë&ñBqÖ^UEám¥* iÛzgÍÒÚ…5¹`ÏJª¤Bž®&ŠŠ‡MÛý~õ…ߎÅ2jßøz8T;«Ö}g<²`÷Göá°)ÇÆ–ÝQÁó½I¶7,¦ÖÚ§½˜/°ÆaeP—¤Í$Ôf‘‹ÛóÃÄ >|@_>-ïm|@­àf¡`œRn­KÓŒmIÇä´Æ9­õÏGMïvÅ ”zæ¬T»$ºæx²Yi`L¨ÍG(æ"+¦ÜíÇ-…ÝÒÆÝøË~ áé¡[½khó(\‚Äòì¼xlﯟö­š!£†oŒY=Ÿ`H£é×u z^†ëopÙ!3¢Î@æŽ@ðvع~à'èN:áÿÜYÍdW¨F³zÔŠ¶YT ¤£§PT«²ÅÀr"@³rc34šÍÍO ÷%®«=;±¦j5î%æ…´1“Ž\¡°Ü8 øN{÷°JȬ¸37ŽÈ¢þh3ïï `¿ß¯0˜Ð~8Ôë£}6Åõñûx«W‚ÄQéýÛχCq,å*=™Å à”l ’`’Úf?£… GˆåQÒ„|÷1U‡qhaV,•êøqˆEÃìj‘À/ö« i{ºïÚ¹ƒÏ‰2Ó P½ƒ§Ù*ÿ×*N´¿oŸ0Åè V¢AZO¼…|^×R [(îË™[S{ç3E²wjèÖC‰Ý=ë)dÌþP^}”–Æ:ÅcÄJ ãk±‹.ö=ó3/'‰€m€ÊÝx¶gíZií@wN”ªÈ_î[O*þbÏÚr°sEÜÚp°N¨†ø_Ѫí]}¹|XMâ¹CXCÉw× ècüŽñ‰l§Ø[YÑ,WOM”Ùﱉ{⿌; 6@¿ì rU¡ÎÝŽÄ, ¼×! ¬³œìÀƒ|-Óßæ@Ÿ¬ Õ^B°peL•™ZÝž~ŠèFòÇE1¥h½ø p©Ð¤wµéˆ H¶ÑÕ¼2Ä1 lfþGŠ"Òt$c©dÕòŠ:éÜsž‚0†é£¤îÉÍÌ®µ'wÛ&'fÿ®?0n%ÆÓ:4؃֊cÀ±yc¤”ÑXàé† ÇSuøôšé„0 ñûS · :¿]ÊO³o$iøÊž Ôøu¿·5Kçc}`XšÒ˹vîDª#è ç4v—˜êP áÊ8ŒyOîÍL Õ‹pUã‹§4k˜MÑ—³*l¤‹¨¤»NEUt­+K¸­ÔÊ5ºÈ›Å¶´Kp5 ¦ƒ)zŒÊäÉóàüÅn¡ÎJ%¬}¡¥ àlÍcõ š®¶ù"Œ”Àè½ÀcU ¡äÊà>],c€Ãn¾Å¢Z…¢Ð, \{ î#[K96¢ÞZªXÉDŠ~––Hhb˜·;ØÍ[,"LAþܼ+ù½ZmAè(ïè-áq^=,£ð)rª[]ëªQb×{¸é!DtðG=VrE©׬+Žü^©óH*xmTKäýb€‡½=åÑ@Æ\7 ç®æÆ3gÉæN ­- ª»dû¬Ü_»x,d´"öM·§¦>¨µØK‘¨¯zÀ$7ÿKÁ¿[–‡Jۦyzô€=Șã›Ôî(r^cV¿¨Å®\Âh3Ó³Ñööï0pw:/Þk3§9ÂÄ›IFR–P½œù© ‰Bß§íµ‹™þ¿>&SÇ‚#KI…uìTª\N3/§×7­cB·rè~TävŽ *’J¸2ôy­ßXÀ«ÙX}$ô‹Ý40ˆìN ½½Æœ ÖÕ=°ÝæíÝû‘¯Jâ9 ÇÇczmV9 É1ܤ ‡HÉ/Q‘—,"ÅfŽïDi¼Úkáw-qºÍ-êI|«®«´¯…r•…ÙVÛi«hÏÅŠy"ÙÇrŒ€š9_ä,¦»ï¸H ê¸Í×êÿ5µã ¶RÔ>ºê2{Ç9W#Ëù7g”Ò-îj¤*FÞ“Üâû‰9îõe±vÊèYö‡“14F6gêŬ½Ç)!ëÛ‰Þù"ïZÞ%õz…ô‹½sf|¶»&äÀ:TìýóóRí7ü­Rf ½ühæ‚óKŸ ‹ NÜXÎzÎyýwÝÈ{I%#)Ñ…ð)ÄcÂmYÃ*úö‚Ù¾~g&ï&Ä|V³$”‹¹‚IC~øD™Mð4¯&$_\-zнLU´BºRhem½d·›D!Šu ô0l îìÏΖô.®Ï˜AûÂû¦¸9^\—Ólw€t™Æ< ™ÛùZ „¥?C•üõ9ÏO'ˆ·×£’_Î9‹H¹I£Ä"$H—gþ†Ò!éP\6 ªðœ,ÓR‘³ËŒ “}cè«ê+’R±ËAÈ7KÕSö½ËöFs‡:JiõÙýøÒ¯p¸ù§E¬¼àdKCÎøõD71n9-˜—è°daøÙÅæz)–¨˜rÊ^ãËÔJ.K‘ê¤lúNƒ9Dzn&@šmm©rÃ_-Ñ•hÿxšŠª‰Rí®ªëµ`½1¦f–²³Âvu–ï4EY66W²Ðþè;OOP}I¯…"Ê4­½Šj Ì -¸\#6¯•w‹8³È b—®­Ã©P²c*ÕÕA%4Ë%ÐÉ*äþêðç´ßØáò”â<´¿³ñëen[÷e|’v.s…J4å:€ÒT¨’âqÅòÚˆb=×Ê‹"裛̞µG/Š“Cq/×Ú}DhŠÛ¸ËØ\«ÕQex~¿à•ìˆp×ÿÝyqòcMõÄ“3¡â€D ÃÀ²Š„³ ïáb¹J2‹Zˆ’"ð èLy¡-fÍù9áÌPi0·ÓçXU§PsFó4ÃÁ Ô(ù&‚LëÚ#f @DÒAU÷¯jÃ,‘ ¹ëa&ÕY¢ž XB)xñÆuª¤uÆùÔÅ ÒYV8ÃT m—úygr6ãyË»+-gø]—:v†á3É|4ká&Ï!ImÖé#TʤP4_&n´XñN5íÚ q0Wš’¢ úžmñjÍh·J±#µP@¹Ä.û˜åણÌ΃jK'y¦%‘_að°F ¼Ä}‘ÌÑ´ nj³Uu¸.ty,ÕA ¥p’ »ãaåùÉ©ÈC¼eÀÍ2ð<]͇`¶2ÌuK5ØZ02î” Ãª çº]FØqʱîÌ.KpñÑ~/óX U~çþHÏW›&äìßï«4i¥™åÖƒ¦±>R°4 ùèôÙ ªŸF«YA´­Ø*^KVØ親>e ,;K Œd‹Tb›„/¸O*a‘¶8ÕFÇ=ØìL“ÐÀ+Çs o™VuXÙup݈Eò}E”„ocòW“qô¼¸lŸU¦öCè”xŸ :!n%ÀæQ?‘D/ÍË#CHÏúQŽî­l+(*Ü„­^a ‘·‹$òžžèÚ¨¥óà"]— äâd¿‹©Ý/ÔùÐzN<{¢±ÿ³ƒˆD±°ßa8p~Ð㈫h0¯fúÉÖýSíg= ƒ8‡¾ŽMÍÐ1ˆtüõ(¨¬pñLïÃVêWL[´v3§ùY`Ö“´ã€–ôàbÞJÎd/à=QÉ8qH­x!‰Ä4oWÁ)¥^ˆÐGEʃ2ð,•}’lúpÀ¡$ǨRUØ£höoñîOYÂy%D²ôå'ÁÓ:§m¢+ܲF®¸Ö˜OlSb)òÀÂïÏÞŒ2½¾jßaM‹\pÙw3ŽýÚ^ÑràÓ‹Z˜ê",*éÄviëæ~=ma_©É;@I>„£D² §'BŸ9%d’§.•·D¸*œw*±ÑËr§Ç)¥z8±-Œë—ðÞ/Ÿ0×ÊÇ,%òQ¼*ÇcÎEˆ£@¢;Ñd­4P&H³èÌÝ%îàÁLî·Åñ3N‘òM5ÊÆnSTTÙDp¶iÉË5:·B-|q#?¤Ô§‡ÖÜ(,fßü2 ap(–úè…¶ŠcGÌ;?V³?*+§xUvþPP¤ÿ´§æèX|=Ëx bt½G[³Ùë¦>4ð¯‘g}>Џ¡óy†»Y>ä󺬾ƨØàîŽL(RµJ*¸cK¸ã+ÁÐG+]m¤Rr쀙Ò`æ÷:²³WøY”B€S¸”Iõ‹Ý*æÇŒByl3P”mõD ÄºË„S]íæ[ŠÂûžòˆßì0ú"HEº‰èÛ,Mó»_ùðáÃ/¿fOdiÿívé تB y§ß6:V q€oý‰” EY¥­ZœµÊÆ’·`?fB‹'3mKá#r¢° Áʃv;¨˜%…ʽRNôDÖ9@Õ>V B ,ËSZ}zUmÏ%ýÆb ׸«>ÿÅ ,ëf@‚÷ŸWÞ¾Y‹p)ôTò_’«'r“Uð‘ )¹8ÿ S¹Î‹‡*d´çk–ª{ké¹KPè ³p%2·ÏÛk¶µº¨Ù*z^–YhæùÇ4¡,ö§4įAâü¶ð³°Â*zCmqö…¯§<^¸v²¡’IëRvî…[U×+1ÞPŒ-˜ÑÊ$Òª Šç¥ô$k7,C€}€* @a5CÏÅY!|Z+Ïq*ÈàtäŒúD9´èË>*Eê8\¸U‰À2Tâe–ƒ7ØÈâÇmuš­Âxråis‘ÚX7^¢5‡îæ!4R ^—™6-ÔåÀ[œ”¢ó;†šíNälÛ&ãTõÊyŸ1ʼn‚÷ÆjÕVkW9îâ¼]_·ZÀêŽãë9_g :>,¡TéKT0~{óë/ñ_þýäÐ|ã_~}ùÁÞ¼úËíÙ£Ïro>:³l§ ˜Úì"kº¥u>ƒÞ­å=–£ae`Y÷Îïf)êÞåj~…) MÑèpdŠ:sbm^’—RPlu‘‚$U–99xÑ(\°"U9æxp;“ñY:Ú±œªt ¾yÉæʇ*JÊãÔ·Æ×g—秬þ£ü{ÚŸ;ŒK À¹Ð;.TÏꚦŸÓÚè /ŽCèÉ Õò¸å‚Dèû0}¯%§Èýa6]p1ÒuÓ…nÞ6–Y?q/ó0Ä%Ú 6ŸlÑŒZœiÊc#Pöëæ)€8TBÞ æõf;ö_šMþ)Ýá‚¶C:E0áT;‹­† õëÃÁ©)îk¶Š :âís*öþ øÅIÕjŸë¶?œ5qÈLJ-œî€Òh^¼õÝà 6 L žfˆEC[gEκSB@ª }¹ñ½…wj§B9‰ˆ¾·ðNö¿p!ìܨۊ2¯¯«1ÒþT0g›'6ö„ ¡Q`‹¬µò:”èGâÜÝ$v×·û4 j@¸ÿK t[cÅÒÐ÷ÅVwÍþåJ 2ëJ Ìzîì¼€Òïâ1½> m)³Õ,|ΧkëØ„Šõ¤ËŠðÔ¾6¦f«t B4j 0¸®ˆÓ¬ÃIYJÇ©ØeœÔ©® gë߯ÏÎúògÅ…†‡J¶•Ç£ÚÇ€¦Èý,òбA=UCSF뛓a+Éooã¥CFÙ™ð{¼©È…qAaõ‹ 8çßÔ‡úGàåß`ñsâ„“f}ÞŽÞ¾-¬Qlp%ÌC6ÐÈF°<ôÿœÃ§šq~.ŸŽÍˆùA5dþ"n¨»10É/åjf¨ý‘ýQ;û¨Íü0ÎÜT°í‰<º ‚€hCÆöÃÍA«Åüªk6?⭹㠵° ÿš>JkzBW6èš5žšc­;óæþm–ÌÆ†~B÷·à…«·èP\MÝ›¡µ÷¤üîMйvÈ;ŠÓÒ°kqø˜|‡&¥ˆW)"ð`‹³ Ðæ‡æ‡ëóe(átÝ«á ,®h^ ÍC²ñéýmŠ¿­OÿCÛŸþWûÇ;Ó>~ü»ö·¹÷ä%ŸÄMn}ÕªzUõa[|˜ç ‚ÑÜ8mħtèé•8Žp7f—nε†¸¤¯˜÷¾)žåOZø¤œ=¾ý±œf^T‡¥°¥‰ô¸­¬P›ü½$ÃnáBJ<¾Ã„]áÞµ´Úùw°œÉ ¨Íâs?üž>oŸ/8¿>?å?ùÙûvý‡^~L_´ø Ym‚[P/76V4_fûì=eYú1>‘Ÿ6Ò×\ãòÛtÂ#¿[QåšDµ=v£‘®ÉkäpÖÄèÀæ*U…‹wÎP´…HIkã/Ø?XGàLbõæi]Û8‹°£O„T×Úì˜0)ä¡€®è´CŸ»QFȲ»ÝŽ-] ‹ïI€g­Òçè*ð’4Öß·Kï½§@¼€ŠþöæÿPK û d Ñ¡PK—®A2org/hsqldb/resources/jdklogging-default.properties•S]kÛ@|÷¯XH /¶$7Iq zpÒØ5éG ¾­ïVÒŧ;õ>œúßw%+­C(¢â@è4;;3{w§K9‡'¹Õ¶,•)'’ Œ:$³ ¹ ÈÃù4›Á»,»šd³Éô¦óŒWö¢ñ¸# §£Ñ ,<„Jyà…°ÂÂ1I¡4!z‚åÃçÉlvy5™a%w…Â:@³gúÈHæ:œOZö"¨BhæiúÄ܉&¶î><¥ïSi…O‰ÊØ@>-£’üêm¥vGn§è9©B­™îÐ^¶Á,ž`uó úð{¨nñ𯵴î.¾,Á:&êÄÄ tÒ×%¼¹,`o#<£ P[ÇÆÑH ôŠÜ„5ÁY=†95:½ï¤t}XZ1‘¡‰ ë¤?äÇ.V  «CÙeóX‘»‡¯ë›ë3·kz¶nÛjeNmQö£áÎ…*£Ã ¬ƒ €Ú[fàA•\Æ}•@ÍjPÊvŒ¬ñVÓË×Lõ}è¢kPl±ä±FžUƒueRùŸZnQK­ {ÞÀVðq¨Ò’7g|lëHlŸÛq ø†„*”€—Ư„ƒV[ê uY‡65ó/ Rª¶5 È2þ’ߪ?Î虫‡´AÕÖ´>8áªåo‡ý: Q¢iG:_¬×£Ñ¸Ç>.¾Ý/ï?Ãç‚/D~¶V›äšÏ•øÎg%ۙ߾àøh¼%=24Ìä=6 £†Š´ªUÈ/3~† ÂFòéŒûò•σ‹4ýÿ †Ü¼šÁoPKõoRlWPK—®A#org/hsqldb/resources/lob-schema.sqlíXKs"7¾ó+ú¶àÅ6N%‡XG̬ò0ƒGÛ$•¢œ5ÞuUÖl§*ÿ>­Çh¤yÞ8åK»©»õu÷×­ÇÇp÷¼ý¼ZÃx½¼±zÞl¡ý€_¶??o–ë ܯ¶°Y=¯?.VëOË“§å¶áÎãê ÎN~<éµZ§G¬~_l>~^~¹[Ü/Ÿ·¸}tÚ RJ\Ð)>ç‚NQ2â@2q‘¤ì"XC8"-0‚Œ" £( .y[ýY0LÅ¢«—A’ÅB.@œà¿,Šº n,„›xË-’˜‹”Èumu1»„Yʦ$Ã%;‡t:‹Cz›+°ðö §‡J¡è”pKçJ¨ÍðõN2s*´«h©ð¨ìˆ<¦ì†VðMuj³«3Èbv•Q×w¨ñ ò¶D-G4žˆ‹J¸Õ^ÆÉ„:N†tL²H@¯$'æ3¤Æ”DÑ®”õÎVò¥ÜÃl}'³åâw@:œbâ ÷Ï=₤núxÖ²ò³4 h˜¥T¼¦©X¨ðµG.C Ïå/£EL“åÀ¯"‰ 0¢¸D$S @H#ЧŽÓdj˜745šς>¼ò,æˆIž•¨@À5‰2Ê < ­€¥!uP—Æa›¬ØväRÀ-¶ƒ\q¡WÚÂq¦ë”GW¡|W¾hÏM¢†¸¤&Á9IŒÑݱÈâŒÓP…ò…¤)™˜Ò "©-0vM•6öÅ™!ãٯșÝ]rr½Zrg}ôÝd‘'2B@ÒÅ$bb®}é@˜ÈÒóY”ÔLRâ¿–~ë+ÉpÇüÐýò^‚TC!ª(ôÔrJgôV „õÞÆä«!“n÷À<ØhȃÉȉwdL;øiÊ0f½^¯_Æpg{ 44qµêy•tî^G%t7Ÿ3Tg§Ê÷ÃÌL0S!#“8á‚ÜÏZšÜèÏ•s#r÷YäÑOÅXQBgüÀ¢S“C[eéÅôUÊé¿a)²ße鬇ÿò ÙÌH3 z·¢Ûã¤Ò÷-ækܘ25œ¢š7m~È+›ƒÜÚËö•Ïhîza)s3t±8ɸ£ÆÏ™¾^Öê ^¤•¾`çú²”ô¥mEºŽÑ¦&{Þ{ iÌÓ»¬k2|:Õ²qŒ©pF•ÌÇ‘7šwT‹bc*WA\ÐX&Œ³ ^ü2$8åb”ß}ÿ²ÿ]~K³±2‘ÍB¹iI×\8C §f"µG—‡RcÌ E¨pH°³©“‰ãbµ×É<ª;¥éö`×,¤vHÿw³¸fÀ(jο#³ŸJ(Tà)Iå\2‡u­Ån¡v¥J¯Ê#²®J[®¾¦·7ð÷Þ»'jöIúÙ8•È·‹}–~—Žÿð‰ö½|Üæx‹vÝöA±Ï–"ëNc*&‡­@ù°Fââ›8 yÛ÷ûšés.™qáe|vx(Y°—Ñ)âcœÅ“ú¡èeåÑ<\í«Žž-2 Ûl›°Š›GiK=$“ÙO ÿW|5 †WÕªÚÓ›‡8‡ôèr•˜ß?t¥¨R þ/ ¡KGÖqYgc'ÅåbTžÛm¯¤¼Ë ¢äšÁÓ«®„ß°^óê¼Ex ¾1²‡‡¶žÏå•cRñêöhîôŸYƒ%¯ÈƇ8ЈS7J•ñ«™‰zLKòz!®%¯Ÿª_ÉÌ“¹/Ûþ´Ü.äïÛ>/×¶J¿Ôܧç}GíëÝz»Ølï¶Ë/˧íaú¤!Ma4÷¯ZóçÜ0þ\2ž+Ê÷[ÿPKÑæGIVËPK—®A>org/hsqldb/resources/org_hsqldb_DatabaseClassLoader.properties½UÛN1}ç+F<”„–ªOTÄE¢â"…òTõaâÍ:xí`{û÷ñ^@)H„T}ÉÅûœ9sfG¼+4|¢a6‚sç™EHaƒþžÇÂ1¼:ÀN—ER.£ö&¹y:! óDVÆN<¨†Œrm›`뢈€dÛeŠêg4‚[]jƒÞÔ`Z=¾k®›£ï¥J Üù¶¯Î~/®Ï÷v·€§9F:6Á $ U†«ÂåI7×>²<}‘àQÇ¢)–ÌT>Ðx¬N‡)¤Ý«Óor²€%šê™b«QH,”+ütz¼< ôÀê§ûì 3ÖXÏlªÉÖ|ß}ÿ<>nM2¡P™ØÙÄME®BP^O©õ&Çû_V[‘×Dþ2[Â:ÏÑ+$tÆYê¼îð"{˜bïú5q÷Ç©JÃtUúÙ£Mã€ÿ°ž%Ö0e͹¾ä“÷<,¼‹N9w“KlN¥<¹6ÄÞŒ…º³æýÍ?¡Ò-iµý۾﻽QáEsçÞ•­v’Çj‡7ûžëfña+Uö 3­…þOí´ò0”âñv…Ú¾‹Ñ+»°Kw߬…J‹jj´blŒüµt:c¢ Ôœüõ[üv:KŠ…ËºüÒXoÅ–ÑÝEiû—U[ŸIÔõ+Vmšáå§'R•Ä5Óø)½5…æñÏÏ«NÊ¥À&ù™î{ZÏ䕼©2ÜÍ:á[ oÌáëXÊÊð(¯N‰Ã@üô <ÈF‡Ô•ýil¶þPK妻ZÂÐPK—®A:org/hsqldb/resources/org_hsqldb_Server_messages.propertiesµVQOÛH~ϯ©mEq€ËIw‘8éHèÑ*'WU€ÐÚžmÖ»îîš)?þf×vb§„ÂÉ ìÍÌ|3³3óMÞ@ÈÒL \¡Q¹Žñ$— 3­2Ô–£)Ø1¨P3Ùñİ{ìÃ7öÀ@éû`f¾‹$ J•Ð?àZe–+inoäMÇýííoöv~Tmj:¸¸ÏÅåøÓŹÿÍøëåiyž~üs2—ÿž†ƒ«O5¯Ùnt«"ºý}wW5/°OžVp“ ¶4`gÜ@ŠÆÝo#:Ç’D“hm%YŠ+™§]ö ˜\V‚¢À%ZhÕá2¥m=ž©<ý~ppØýµ×£W¯È,,f<žUà‚‹ÒlàfYÄ ¼¸¶Ë oM†±;[4v6¨)TÀá‰è’È鼊‡ Î6©×î.×¢N•Þ]Ãjai7VV縚2Ašå©ßÿQÕ„°|ÏQ»AXÃYÍâu~€+_j•…ÏÓVeyM-:+jzn< »a8‚wã\ã{0*ž£5Íd¥º3K*Oz‡Ü>©,pc(ÿЛÎäÝû:œÆTY¼#:ÏG3 ^«ª‚ÂV,ë}GÄbjÉ:vɘ§-x u˵=³{Ig¸nq¥æEW1x[rÛ&Œ·E\ÒÐ"P5´k°„kŒ­ÒÔ72qxB±Ä4¢×*N—>uÿé¶5Ó¨4%#š,IóQp'(rªy‚äDÑ5;4L çvWXA•NˆèÏ¿GØ>ü•;@—×4×$¤©A˸0A§³ÀèåDÿ£ÿÈõ°·S´£6?gû Ý·Í÷­3~ëœßëÿvÐíõ~)­ò~ëÌÿrî×J5R®È¦8Ým‘U@cM³F„8e¹°w™¯XITk .| f6®Ê…ªÌjn¾p;µ¾ŸÚÚP ÑÙx|>½¡^¿£ZßR­ï©Ö7Õëv•k¬§öÕ†È_¼²¤_@ÿïÊÚ™Ã|ýÎRÒ¹/öÕXA,œW©tJ“±ü±’’òsû˜B§¦´ÔDg“ñðâË9çñ£ .®%ór¹X-n÷®·ŽXäù0ÒyfŲÓy'ZÍ©‹¸$éÕ_S›;ÅÅ?DK0yd¬.ܰèªÜÂg·Oƒ^@ —¹Î(âi.Üôqò~&scHÔ‹µÔQV¿cñÑFŒ2¢Û#‡ýê–üøž£](=‡‘'iÒqÉUmJ÷Xh%š»vYpê×Ê‚*IýË#òo—ðjCµÜövÔ‡¬š\(¬9ÂÆÉ·$Šûůÿèw»ÔÖ3ztþPKûŒtímPK˜®A2org/hsqldb/resources/sql-state-messages.properties]{sÛHŽÿߟ‚U3U»Wgħ¤\¹j[I<ãGÆV23w{µEK”Í‹Djøpâ¹/øÝì¦HJÎîTÅ6@whF÷þàÜýzéœÝœÏœe²J³´Jó¬<:úAÿçü#®«Ç¼pÎâÍö>Y¯·y½xL çm]dIåüý^þ¾ÿG]&Eé,óÊ)óºX$«¼xH^ÌXdÞÉÒ™çuY¦ÎßWôGuï‰iLŽ÷zôÚŇ2͉㾞¾ñ—¹“nUÄY¹Ž«Ä©ÓÒ)“¦r4Ü“7Î?:EògR‡øŸ½“ÿÄç*¾_'ú›¿óÍYäëz“q3uµIÊ2~Hœm\T%Á{îÉ?kú1bî$ÿJ8uV9IQÐtUÏñò•“%É’æÎyžBt¾yöà,ã*vhÞNš3*'ß&E¬Æïù'qU%›-Í1'âYFSs¾>¦Ôãò YJ$~Z¬sbÍ0E}fÉùŸCû3&c‰ÔçæÃ¸ùðz[`(Uš”ªmrb}ÊâMâ³³šô‚FA>÷1*pOfÌ4sªä›–´³J“õíÞ æÁY¥Š÷ÌA%™À?QóhN¶uñ0ÐÞ3¢Ð= )ùÂ;f|!zF³™[[@¾²‡hõt¹'ÙS¼N—N¼\ÔʪòÏl^<;y–8ùJÍ,òz!ÑâŸÜ%­gy¬Ò´ÿ1&yäÎY¾ÙЪ¹& 4e‘íB‡'g˜Õøß?þø?´à zZr›¸Z<:yY±& ±o®ã­ªÛ¤¬×ÕŒTuŠw·eK „ÞÓB¹‡!€ŠDŸDxo|¼ªh~ëXA÷ d‚îH//®.毜›wïîfsèí»Ùüì0ÈÞÍOçmcøƒSÖ‹ÑZÕkZ›í:Ѧet‚F„ù(ž¿5뙆á‘Aº…„Uge½ÝæEE£O3}¯í¥ï+HeeâWn“Ɇ`1d%Øc`À¤/õ. Zk>9ÀùÎ_I‘¯“ì¡z$sILŠ«¼@Àýêð«çšQñr'ÙÇëuþ•(çjA‹üš-3àòà=¦&ê[V¤MøŒcGÛeBñÅw$[äËÄù‰äÀ¿ð ³ø g’dôS85%L’ØÆeù5/–JßR1H¢ýG£`¤çð+¬ˆ¼(êm…ЇÏá>.ɦ¥2¹à+€³uJp–EŠU¥Ô™haõgÎß~üño`—žàkÇùç‘£þ§&RÊªÔø ,t¤„à\'Íç ÙîP³_øùüí™°Âöðj6G ô±ª¶Yï*'¯OS‘Ý#Cã<–®)ä‹L)q¦‘AâlY>Æ_@îþ¹JJÀ+EáH ׶qõˆ(‚‡G žæúûSžÂŠÜ$XJ¾PÚ.²m]ÝUÔåF œý¦QÙÀâ¡Þ0#2™û‚4€üHz¼I tR&CÕø)û’å_fR.â-­éùŒÿ³4,˳ãìMœ×‘ õ,Îõ<×ùâ‹/H¾b†œUœ®ë‚õ´xᦘÛOy]Ñfr¡žœ ˜*c(•˜žšD L®t6ùRÖö=Q¼_ê­´5æ™”¿ÄìC=ûùcb:!ÄB‘o¶~=vdËånY,À´ìOÙð¡yI’×H8Qm¬ÆÚÌwºË?Ì#Ùäìó˜n4R 74+Ò»+nEƒæ}¢ãˆrQ¤)ÙD^#bcTËzµJ¿ØXO¬/Z‰¿ÛJÊ7ùÕÿ--—«´wO‹0I2Ë¢b…ÀCè`¬v­,¦+ z¦ ýbÈêyËãwÚrÄ‚‹" Æy7¨W‘ÎÅù6éà–é_¤Áé&­”t)Œ‡ü¢i·V Ô©y¬EôV”®±ÍƦc°wW‘þVŠ*©ØOÒ]0–ý-÷>ñvVü|öû\i¢Â,«‚Ý`¢u÷Á©0 á.…¨›û¤h¢Þ`¢…2ˆf1o¢…“dËã|uÌdiÈ--‡h-¦´`”jÜ%ù†<'»!ãׂš·bbê>^cµ=ÙO´ü®sŒû5˜þ5.—¹Œˆ51Ÿ\þäêOoœE]”4ãÎɹ­Ö颴ÇО6ÎO±ÂÅ @¾âà_ŽÚ”ÅÏÀö:«:“}áŒL‘#+Å+§H±‹#„Xc„Œ rZX¬ q…M∠IÅIJh£EmKþ‘¸J¡ dQ$Où’ÁŒr<ù@1B%S†œZƒOâ‚,ñg)¦_ËUíãèß°¸¤uµ‰‰ˆ+:5DÈórcJ^@DdúÖ’R²Š)"V2x‘ó™¡PpH ÁTØØcÒ®ÈúÜÒ„'KF}G¤<³pÌæUàxˆ›8{¶iUÄýÎVDŒõ fÅRw-]'G~üsüs4ò ¬ žÕ\ñó~Òâ£À‡ƒ]×ÅâóT,¤?¹üÉÕŸÞà—C D>㙜GºàÄŒZuÈ9èkt¹Ñí6¾Qàb×¶G§¦Á·MĤÜÛBmUˆ´Ç¤½ï%]Q˜F«¿KÏgz~=ešZ8Ýeâ#h‘$‹š£K2†%94*y³Ì;Óå…L*ì#E‹’`“¥¥†z÷´"¦õÑ"a“±Ã&B| ¼>VF‘RøFÁ^š¯2c&3þ¾Ù)mâMOlÂT&}Tô†Ì²œ³ڔѦ/DK³eòÐ\QÁ·}hf¾œ¢ÃÂkÜBkâ®(ÛYïÄ3!8ç§óS1u@}:ß7\F…†èÎlÆåìóìÒô!*òî@³ùÅÕì_×óÙíçÓË!¥j¶D&‹°—7ÚDQ2F¬Ó¡ÇÍ^»YÑG»Ïí¾ÕÞ¬¹޳Ib“JÀ(Á!”Æ'dœpwaa]ó& "†ŠÚP Û†¤ù«ø²N¾-’­ÈÚ‡A›À  µ»Üîö¶‹iWâ:ãØ¼ -1ú5-¥¹A9Éy䬯’Ò”X×E®xþa¼]—‹, Pƒ=3P›ÿ"ù_N/˜ 0Gi÷ÓGÈD£ÃãÑQ‰g<€Ã‹2–Ϥ ´?ç_kÙ)[;âIA¯'á ¤ªtƒ°·K ã“Ð0í ˜Npk¬Ï°ƒœ—uƒ]9æ‡f0î .€šM¡f{ ˆÆ*‰ÉÿJÌ× èÈ ~Ê{ø!—Ü~€7ΆVVºÅÖBDm1»´X;D¼= Ƀ‚¶@Êã²ÝqL¦qŽi¶(J\$ ‚”²Ú%;Ù™MöÑ^ç $mM@æÈô6ºÜèvñíô¢¸ªPŽü`Lkñoß‹¥âP‰76¯2„ϥ䠌y&š´4Ò„m_i»ŠtØZoíHœO´Ð¦˜È/˜ÈAX‹Ë¼Å Az¼»´Ù©›Œñpl1º„Fìa›KÛñÒ9»‘/ú×ÝÙ‡ÙÕ©ÙÎØ]ªÐïØ!¸H–P­"YÑúÈÉ‘ÇÑì•=”C(õ"_ï*•ÇñëG›`”5Mv–íiváiÆ‹´XÔë¸&Íc4o?šÞ[ëÝÇÎõ#¤¿¯1ññS ­Ø7E^o[©zÍv{w­•x 6N­WIÇ¥eüP$4ζ÷£[¾9[¾ïÅ¥þ¬-[\B—ñ2Võ–ó‡DIF<¶‘ŸÐÑË‘†zÈ‹eÂMœ-×çAâ»ðD—”ó1½O«VÔŽÓ„ç+ˆ¾kÆPþ@í*˜elÏ~ã3„›ˆ¥8¼Â8•åß‘[½ßmMØ ™Ñ¼«GÒ’‡Ç¦Õ¤Ž<¶?è3 .ƒº‡@‘mGš‚Ǽ呂L˜™Õ2²¼¬ÒEiÙ}Ÿáñ†wÀe·€ŽÍ€èuMnðœ.mSqãÍ&Ø>cû=ØZß •ØÊåD€ &¹3dÀ öôÙÊËú8FØÁhŽÄ´0Ï}‡<ê€k…æ#[úÕ‘\PÆŒ2D¡ï "b eÂ(“ŠÅ–ÞÉÉ(¬h&@™2Êt°Fû Udï·ˆ“ ­¸¢o»|±&±m’Ä$ºq6Ø)2$ž]@í8DU89ÁsW¢³}’…°89§6ö„%úð®ƒes›©©3­xßÁÛäV+±òFM´ãCw­¨ãD½Å&Í’3–ÆÊ²èÉÏÝæYº”ƒí5´Wg⬫G² #€ˆhÎ/û‰Ô-5˜$|à¢~b¢S—=Äh eÎïWÔ”/jµ6ÊatÉù<ÅõBSO”ãÓ (~åCÍ]ú¼äÉ‹:|f±à1—¿Éé ÐDð¿u àޤ„þ—Á’röŸåïîúÛ6v,}c|V·ÇÍÔ÷ÊÓ4ý°"¸]Dz¤} ˜Ü?ó,KßíºÃñ„6. j˜~ð1(Ùúc™5'VD‘•ÃíºM±)F€Ó¾ž_\ÎZè¬-n×ßDZkÚ}ÖwØçìôøá_ŸO/?µ{eõq÷ú x§4ŸÖiöè¬Fn×5*Þ˜PY*^Îû¬Kî°cêqhÒi¿±o¦‹(“[åÍX¡È²lXSQª®Sk¶tÉïÍa°D¿º^{G2‹n›dÀÕ©&ïd€*êÖõjÍÕ™(›ý² HÅ€hW×ÍõÊ:CˆTf?ÄYp¬Ý@¬ëòz)l) *lM DÙºž¯ýkº$¿q_SÐ[µ¨ˆ¾u}Yc@”?4G9L§Ä@}6©ŠL¿øDᆬB–]‹³ZÇðø¡¨\×À¶N*9nrâv•œBѶƒÆV‘a&dQº®É5Ù]DŒÊ•ét©‚”ƒåûýe$T†?_­à V@¯k‡ÍW)}šFRTyZ0k׵ɯæ[-d%óöXåŽY£¼®Ùåí·.08³Ê:äõÚ–ÝѪÖ¯kh[[%v+ì‹Xw¼®u%´Mã¶"V¯k)43Ì%Æ~:»ÓÓ0yËξl rȆ‰E1 ‰L qºÃh%u% ]“AkŽÜôªÔˆË;ïq±ãìõ‚µkE f6`®›Ø\›É¢0¼k.-Döÿi…S^69›ºbu¢ï<<{Ó8At­§l ’µÊÚ(‰LE"]S¹÷ˆŸðx­zÃ6K#®Ze‰1"k$ý›•6ååêu7 M [ŠH©J låÅÉÅ)¶ofÛ¤’‰£@º é€4'Ôö+ž/ ÕýØ×7sçúÓ%ñÉâ‹tD¡È˜‰ø‰èØ—äÙ¾ƒÀ{d™ßI VW@\ä |œj"PgéŸub7êCn›-nÈ3rϨà +A¨“¯HóùHu"k;l'AvJÜn'M⟔&Jƒ:‘ÅÅ {Œî}ºN”k>“‘(tÇN¦@Œä–`ö>âÀü•s>»œáçÝlþ œ~?›[i/ê1@®?У2„\½ï\Ï~'"o/nn_9gŸnog×Bôvvy:¿øLÝ(l=$LQsR_!÷54;õèÿ-±ï @„D]—ÚÈDȉp€D¼^«L5Y¶’ 8ü±ºç 7ˆŠÇ‚ö† ¢t’Ë&›"`Ú —$Þ× |çlB|*}B¶ÉûÑ~ —Üa 7:lj#"«È#{ûïéê…¬­uꬌèøLÇßG‡‚‚-.&‘ÿBQƒ%s].I· ˜lðr²i©6OÉzéI‡ûH+ûÔåܲ“ö‘ »G cÆïÃWg¸(d–bs²I¿!2jŸQÑ ì#úˆh@©±ªZ*%ý´ÃÒcJ»òŠóT86Á©ÐhT«(€'A1Wö`WYù8,ñÆíÊ€~PkDr…Q‡Gí˜îobm¸‰ö^HœâĶþ{Àcë~E€²^ob[þý¨ås‰ºZcÍAÂgþ Iì/ãÕsVÅßT¢‡@²@‹zm±žaIª@´q”pÆ¿OÇ §eKN%4%¾¦´±JÉÁ92Ý; ¤7çö%¬Ð7ÎÙÍÕÕÅœþíÍååÛÓ³_Z•ëÄ×ÓùÍÕÅ_}࣪ƒM ´UKup°ÚªÙ‘‹wäÙê …õfëpTÄÅ!ƒxýoÄC>ÃpÁòo¥t@Âgþ ë8˜«¶k£òB$`"Á}Çtx!‡4û·%qP ͸ VUc­–…È"BîãC[-ˆAûkÛƒˆvÁþhØ [°;ô¬ÒQ5 1‘òwIí‚u£f…=!ì¾ ¹ƒÕTéËy0¡ÒÒw´² ƒcWz%BÆ'ú–ò!†òÙ‚sÎÝ ÷†]c‚뫪 ˜cz/ÄÄ–]α<Ö*‰÷>åƒaUwWaC û‡Ôä;Ìc°¦UË!äl8Ÿá| ÷˜¯—°ïrªØÖòcˆlü}ž C…Æ|SWm{ì  Ÿ½ø~(—¡Ü=P\YѦO­úÝ?h¹&uÃækBæËçÕ}t^bÃ&dÃ|.YÝGé€!ëã/*ÇTp`3Ñ%VO{Y=„à2BÏøú+ †ñS²Í±Y·é{4 öúÍ.7»}ÍCÕˆ„å1–×¥¯ÂpMÔæ>}¨±¡l¹‰OÃ⸡À6s8zÈ4b@ˆ­8¡ÕÞ_êIhä#üwu\[Ãä>pù”ÐÈ)#‰¨ûÛ]nw{Ûß ä Íc4oí@Œð}Æ÷‡ºmV‚¹¸ßd;`ì`{Yqá+mmUÿ“12„Sø²¹6•Ä»%Ä/²…Gðt'÷bã¹“Žæ ©*I 5(BdÎJãýU}j‚dÐVðÍ^„p<Æñ¬¸Z JCˆÏ ¾Þˆ(*&é­s€ 6°‡¶»û ¨¡Â>}Æ^ ?EàƒGý«†ÚÇÜ>vâåg#H›Kþ˜0À„xrŸ¬ÛóŸrÓTÊILÑŸ½;ýt97ð*]¦o8ZÓYå°y´½‰O׿~šÙƒk+¿Tñ()·|e1Íã™{¾*‘Uï§ 6qñŒT2`XѼ 3w0ZÞ…€Yß¼PÅÁdš†AY×¼HOTîÚìôÍúæÛ0VN™@Xã¼ ±áÝÍíìâýµóË쇬ŸÞ´—Ÿí+.œÎÕ<¶ú,~dOc˜>Ëßwûd,/&ˆÅì{-’­)ˆåèûr™½ÙÎ~ž…Åꚵċ˛·X!§··§È*5–§.elžh¡ÕWx Ëš_³|Ö?Ô…;:4Êï³ø}[üÖÈSaéûc= ”Ùýv1ÿ óÍÇùÅ͵º¨3Oiò¨¬þÄ™ß^¼?»Ý‚Þèw[¤²ðX ü©îrYä[R6PÕc,÷Öê‡3ëg½™—¸êüê’,ÓÀ5ëX/l’g ‹4ð ÌÍçÙííÅùÅõ{c•–ià¨$e~ï„ÈzñYÀAÐßjܘµüW\‰x2¥–‚›K¨b;-xVÄÈ€WÆ–"o•S# VÊÈßÓƒ±Î:ª&ƒµLJ3¬ #b–D!Ù&°e,#æK™ ²?kâ3—ˆ•ª¶ Hr±‰PXI¢±5>Tké×èV­ =àbÏDÛv<ÜtÖšhb¡£È× +Ô#y¾Nbž.+M4¥¡å\2eäoÅHcvc¾ÿ‰GÆ2³y³‹¥¸CU1Åú5féŽ]‰+Ô8w¸4f‰ŽMôþöæÓGçííå3f1ŽMRûÃég6 oìÊÇüEò€s!DTº ãÇ,Òqhñ—|×—öƒ €c¡Ž²ßÜž“±î —9&AÖÛµ<̦”I_YU®ÅŽYrãÉ0<.Ï<¡vDÙý1Kn<µ08Ý“˜ &,¹Ik7*t[×ÁðôêU!2aÙMhÃÑÌäÊk•I˜*Ëlâé­—i`)M|âÝEó„ÓQ,€±œ&¦êj¨1 ­6}³€£˜c ‹aYPu–òëc†Ë`2¶``PåÖ€0Û'“Heµ3“'S«] ‡á”y;ÙÂc/r{Åd°8æ_\ÎÞËìLYÈÓHoùÜq»¤Æê-Ç?é¦1¼5V‡é¸qæÂFDÖª8ˆwïüJ_çVðYW¦ÓjY™nØÉòm`³&M§M•š®)h8P÷YžóØùxwe‡„8ùÁcj´T#ÞÛÓ¿º¼Ißa]&ZiqD¼›F»/ü±.G¼¬§>Znæ).ÒÖëÁ.®o>qxM™Zñ6?>[iûa3DóÀÏ)d*ƒ,úßÝåÛÖ»™„ˆSôï‰fV½‰ˆˆ3‘uþÞ<7)a ALb¢^„Ë[—GØh– ]Á)&¼%)cO{¦Òº_F œV UGÊj<›9t²:«S|{”‹›Tm­•j±HÀ§2ûÀLUádîDÁøQq¬Ÿú0É´yù€kÂâÕA¼úcneFœü⃚n‹Ë-îN‹Éç~º½˜Ç`Þ ØÏ§·½F8-¬?K¬,ñ^žz&4ÂÓXÀ1¬:b€ü´ÞSÀL> .n †Ñ=aì·û±7ùS/ò”‘Ïöò±)|ŒP?ðóAp<Í8‘¬W&ëÕ±,°4äá¾@œOQ8>ãtåRgüðÅS¢EÄW«Ç|)T`ÂõiQúùÓÏ·s"LV„Š[Y+‰]Ú,; õRµxE½EU?O9“×eÎx|º&Nâ}:µŸ°ìƒqCaFž^VÅÂ`âüeɧ4§·üywþÛqÏÅáçñøBö0„ËîÄýࣹ¬êç"ø zƒ¨]W¢Nw$QÁé€B0H¡u †K¥#¸ …ƒHv´c²¹< £—÷f׎€@ÄÆ X#Ú˜Ñ&/F“óìîˆÓƒˆê2'oùÌJЧŒ~z]Ñ«K®¼ ßDÓ Ñ¢³ƒʯÈCT„'*tþR<ÅQWôæçA4 ¼¥®èÎ/ƒˆ°ÃÏÖ¼De.áÍsF*ð´œU䊾\½›»¦¨Ìõ 0Í3JÖÓCDAtçã …,WA24ÛUùuZŸÁX¼ôDKnq$™ÖBa5q‡Ì‘U5cBlel<ÖwØTȭݦD¿‚¼N¬ˆ kŽ7lîœf%E€üþ–ýtZó!Ȱy‡ —õfÇŒ„Ê*5æÁΪTÛ™Ö+<€­ò+D‰Õkºo.Êž™iÈMvÅOsÎe‚¿égº­.·º=­oÌq¿<­KòØúày/ÀÓá¸Áõ×ïŵòð}¯*G(vЋ­õµHñHÁ¹ŒeÁ@ ÷¢tï7*EŒ½ ?NA7Çd*‰c&1~Ñ„M‘$zvyÑëí–øc4õ z¦¥2¸ÿPKä>Œ&lydPK—®A5org/hsqldb/resources/sql-state-messages_es.properties½}KsãF²î^¿qìÉÝáAÔ‰Ž8j‰Ý-[-µõhÛçÎ ˆ„(Ø ÀÁCvÏýµ½ô‹Þyuóˬª¢|'®m‰¬üêõUfVVVé çú»sçäòtæ,âû$Kª$Ïʽ½/œ›"ÊÊ4ªâ…s÷ÉyŸü³ŽS盼XDY䬸÷±û_u¥³È+§ÌëbßçÅ2þ:‹«¯ö¾ ”*_äΑsŒþý¿¢ºzÈ ç$Z­ïâ4u^çõü!.œ×uABÎÁü~·¸ySPónòº,çàž~©ž{¤/©‡Ž÷õáׇø L²yì¸_Oñ+}@ÍÍH¶Ò½wª‡¤tÊxŽÙ;<sæyZ¯2þšªZÅe-cgUIå=÷Õßkúß!"”‹‚:9ϳ*ʨa÷I•#¥ñ|á¬ã"×͉‹„>§€Q•ä,¦ÿgNNÅ£yòGF“í$~„ÿ*ɪ˜ê¡j¨>ênT8«„>)¨JjÍ]TÆ$ÆÃ‰Ë*r¢»‚Ê IQ=h%ÐUú{GGò3>YŸ£Ýo>7|½.Ðê*‰KõÝä1ËWw”:“ý¶Ô>µÌÉêmzŒæ¿çCC¸¯f<¶4(QÅ¿Ò@lN¼$É"YÆ—À{Õtñ>1ó£fbÔ4þ+Ý÷Íe‚Wi²Z'[ ´rä¾PA£4/5ˆÀ¼¶`·-½²þ®eZº¯N‰õsæ­œ¼(@æäß³3¦PìÔ¤!À½Bo³¾ö_ÍR´¥J¨v03Aä|LÔÎ,wh^³Ø¹9?ÉWbnÂ`«˜ÈÔ™š\¦‚šî.Ð@æ‡B…ù}ùåÿF;¸åå:Ïh!Ð*ql"B#¬¹ìÐÐIP=P§•4 ‹pøÐVøJe]*û!/±h^ÕQÊUlŽhèK.µ.’©Ô"^&eU0 ÷ÔÕú7ü3­’UÞBtp‚FÓŸŸ½?»yá\¾ys=»¡Eøfvsòdi®oŽolKó…SÖó9AÝ×4äùjÆZÓ¾Â?‡†ÖRßG‹ÈÑ$Zq@G𧯥°@“þp_]Ž,¨¹‚øI³Yæë¼ØÞ¡¯Jºüyì•ÆW QíòqÒ<[&U½ó¸|ÀåúÑ;Äž‹)jûB“þ #°¢á\`ÕñâB‚ZXo‰;êyÔ¬Öy‚f?~N!ý’UgL³I®ºStÐÃg ßUö‰— 7ëoô‰ù1;0ÛT/}!“ìO ÊÅ$¯£²ü…¼ 5Ç¿&Õ'æ -ç¸Ø; uÁS6@lŸïañèp¡^sÿ5+AÇ`—•YÃtj*çÚ¢4 ŒTëx^˺Y`èçÑ:–9ŠåsZIGÎÿ1HŸåÙKª>& ½€ùŽ n¤{þ&Ji¦Hçw´IkÓôߥ9ysÜÔîhBÔ(“¿QŠDŽšèñøØ’T›yúÑž-ñ1ö#=$ôEÄívÈ^ñÂÆ¦ ®Htþs½–ï9”¹Î´vË òzÄλŒ`ÂRçVØ”`ªê¤ÂVªQŠ%ëdÜΆÑjq’T“?E-W'šE9ÍÌ'Ão“æa¾‰Š,É–{.û«\:Z7 ¾>vùc×üøþ>MÔtXN»!5Ý {¶p3¨Ê«ùN–‹x ûvañEyCÓ”u1T©CcµÌÄ_#€¡ŠÃ zùó¨½ G¬ÎX­/í°¶&–=pÇGŒ1²1>“™.uÛI=6}ŽÓXÛj(½9û6%pBÆ mÚã<’ÙY&l¨‹ø1çCÇ\|¼­89HÅRŸrñioz‰™»?K2Ç‹¨Ë¨F…Äø~IPå>/V2¨ûê7øºd ¨ Þ¥ú¸ÎãάþªUõ¿­¡Þë!B¬™A÷¬ìúò¿^Ÿ°õ¤7–?ÕYehу}Ùv–qµÿ}üXǩҮ&+(”>}b„¹ƒÓÊŠD¡MX=³ÑôÞM‡¿H"OéûvXʦƲ5'Ó…ÓûªÛ4òp;¤ ÷[ê—ßDÿƺxõxo¶,ü4Aäï`?*ŠèÓþW›UiGZkð÷\ÚуvÌD—ªAt¡½CÙx7Ÿ)s(“÷g`ÎyiO:j^|Ê¢U2çð¶g×CÆhC£@ÛÉB¹E’}&™E].ê>UôF$vn¯Ï.Þ*+hFä¨ÆÆŠc•­G{•SÛ’ÆhƒÇmðþ´ÁvFH7WI–£ >·Áº Ù2#'Κ'y¤?Ѧ©ŠŠ2dÀÁNÝêL»ï¶{ ä#ž‰Lj—ízdlÀ¥'âu9däðiä¨*Úå–¿Ò,G^@ŠÁˆ½Qál©ªsã…„˜R©Ãw*ògwKS60P®kòt]|ö°h½ m±[pS†›> ÷;¨oseå½~ìžÔŽ2ÑjÔ›å =ê‘Õuòt=b0OoŽYŸqð’§Ì•Åqú4„ZPbwWVÃl×fœÏ>ÎÎ;Bû7OCPõ³›³÷³œ]ÜÌ®>ŸÿƒOþ ´&jA¸#Ìb¢6ïÞùä`-5ò¸”×+eDúQÌçb~_-i%Ï;ÒfãÁg] X.Ø"Wg[<‡]hÔ*íÔD$öï¢jþ°™eÂ~å[Äh©9™œ’W7×ìt}ØŸ Û|¨¹ÛzðˆB£€;\ਉø©F(åZòvsα£È‚óÎÛ×îÿõgzƒë"X YcS´D»¹w±†P°I¨9œAØIøW¤NŒ>̈aÂM0÷3ë ]È2ãM2Ć<­-}ÍÕ¯MÜÎÚm˜B¬‰Éhó µ~X•Ä8J<¨’U¼pòºú â‹wös¦g45ËÖÉú,»yFÔ’D‚ö²Ë!å¨×…,œÚ,ÑŒíº“Rouö­"‚¾#Ú½Çé+ë5š/öÜP:W›øßK„ù;áÇ`ø–bGÎ ÇMðUšyj%a1S›Z„©:=Qp’ŒTk² ß§XÆ•S}ZS=Ú?’A ѽSt¯±"J£7ÎŽ­D5¦¸Öù¢1;Î]à1€gâëÅ(¶î»òvE)í{+DÛžóMWϤ\Tâø ¹\ÈÝ\H›œ ]Tï°çcZýo@î4¿Ãid²¬sç"*âW)oРޏ Ï_Òü¨@ÖÜ¥Šå›¦†«Äþx‰Â¿<e¢l‘ÆOÇñƦfãäjFvü×'ïfïÍfc7H?ç?ÓÂ_ù<^`]´Ë'/pïy¼ {îèÉ¢E©*œp¾GÎÊ0[h]äiwx¼½úÀàøv+k¨4åeSiê=;q%í\’b^ÓÆb‹y»ˆóšHÇȰn‹$eü˜êAû˜D¼^˚øëÎrŽºî)ÖÙ²¨×µ‡ÖD°ëÐÅÑ’x\:¿$ÕƒÞšt*f­~à ÊÜÁmHZèlÔPeTUd¯¨Î܉J¬2‡÷0ÙËz<"ÙK{ëú[Ô%A“¼ ¢2 œ‘æ\O’H³ÔÆ óbcKÔÔÅŠ÷ã³ê¢€Éš³gb÷Cr— “|ÅaF>f¬‘ @ŸÒ2AÊΑB„cÇÃÊêù{Q'ív‘ᬱhy†ÙÔ6™ÒÍTÓ‰è£×%Ÿpwç“uøR±ò™â_‘¹°‘38@Y=5— š2’Uãl¢è&áKj€:q@sM$j3 º,è>OðÈÉ[³Ò0®i2Áz ë=vNÖa 0‚?I´Ìr˜ûÒ0Œ>kóÿî9à\ú”ÎKr¹»¹Ð‘>Cj·+mX[ªN¤âE"«ë0xùáú=À}÷¶·äù0„ƒ£6lsØrµöJÃB¯{‡6MOޝg²ü3I…šGeΡ1ò‡8[IªOÎc’§B91/0øÃÆÁԥтǧÁÆ Bóx^P9¾ç#oÃóú£)Q¾ç(øHíTwìª=æx©†…FþV„Õo̓s_ÇrNk| ¯…67ž¨Þ ü@lÄb£A±XŸ§/>3 ŠHØ6—ˆ.iÔlÒßG†ÄÇ[Åï1¨{È‹¨#¾ÝÂÇÕg!þý+Aü#à ËHBÓwÃHJûa Òßi5H~ƒ$a,t˜J¥ÒLHûÍ yø:P½øSÈJ=Åäì­tž „Âß·+CP‘uê1鍨 Ux|¾¡*p¼Èç*åè‡÷ç$å Wß/'³°MOz±‰ã¤ä1¸}9á䇭«-54GOÍyBÍïž­ˆ«RÁª¦Ý»Î¥2ü»„á|$Zþê¯Ã«_o «Jb4GG{3(”dÔÞZÇ@dOTZ~xê Oo7Ð@e!·3Û0ã‡ïh¤?AèùqóÔêdôæH\d;}>~¿eGœ°×]Xmð™–îÍ6iÒR!²¤vC|¦ª;lá'‹&Ùžvùõœ0/|&®;lÜ´÷eåŸ@é1ŸyêÛr•êïœHP8ð&Jõ3ëóv˜ácè“»_ÌTwØÞGC©…úMÃ]ܜπÄ\u‡]€çÛKÍ×övlË»|<>¿åö0‡Ýa}²¡Ýq›ÎÜ ×À#L“ìg™Gf·;ì?èx’Ižê $™Ðî°£Ð7ÀödBèã'ˆ*í'еˆiÀk¾Ò´ØÚµ@ˆ>ìw´Ù¤ù«°ÕF ôv8øJ5ÍNrRQYÞÏAø>ìmPÛÛU»¥b–™ó_À{®A?ì”l& —¤l+˜KÄb£hBúaïd'Ê®óJ{ðØiy éÇõóD¨?ìf4þˆV¸Í ©QçQö@Ü!ù°ñé3!ÎzœQ„ðÃÖ(o"óC¢#¡û°2"%E¼b·ºh/ ¸„#!ö°E©²&¯³ªõÀ¤‘P|Ø ÉÕ59MŽÌ£Á²‰?–¸qƒ/ŸØWX|d1þ‡çÀc«j¯õ ëê À™úÞ° kt™®ó(IOòñœ 1ë½ f¬¯êÍÝéˆIîmÛÚFÙ~f¶7l®dOø.ôK¦ºÍ<ö† S9èn“ùë %6#æ¾~Då¬IT6Ua…LhoØ$5çÚä.¬P˜ùê [ •G4osIMýÛ“kãà¢È–Ïö´6•ƒ^Q²"ÇŒR§@z'6õGÈÐjTÑÇb &ã2OsŽixi¸at÷S\Yñd¢¢ÇÃæÍÞ/6þCâ€ÌÕ°õ0Ô:OTü¥ç–5ÚFÔ`rý`*37l5b#+¾ñf;;Z`È„Û fÒÎIgÆzÈ{ÊVñ:Öf¶†ZJW5ÒrbLÔ”UŽ7¼ÁU.¦)Ò;,©âe(›ø}`ÜGljpKU^P³Q0¿ù8?…ˆ»«È‘ÌK#]4Iøâ/b)>ŽSvÆ3¿:ØŸ?Äsø—7ÎÅíùù¹•c†ôw‡ä%ÛèzšŠn1ÍN£Ç«Ï|#å±)¹ ;#c¯ŽµµCÐuÖó‘ò×FTe4å ÷Ï ¹{äëó ¸Ï„áq $™{æé>ÂyÆžSò‘¦Úƒö#ãTŽè°ŠÛRîh(‘b£»„T y ä=Ùõêе…ò*ø‹m›žë´vœ±?Íó݆Ão? ùé…s:;Ÿáÿ׳›4kog7hB€&`/¹µ ¦9xˆpÃw[‹Ùöáêìòê…sr{u5»`ð«ÙùñÍÙGªúýÏZ2Ñ\ûì"Ö×%…š3âæì8"$Ë'Z’2µKnècÂ#2Þè ¼*_ð]ÿR¥•’ƒ{g:E¥pÚ\C\ £ß³‹ëÙFÑcryO‘+U$y×+uQtц¢šûÝÃW•Ì¢H³9œE¤·òzLâAüÑ¡Iü e¬Ïq.ƒ 1¼gb‰€©ÉýÑgDD}£+’knðàÈ?‹tn)ßúíWŠ:®#Ø¡Ž,yŒyã%eª½ÔgÔ4âšF»Ô$Nšœd9¸@Ó…ÅÈ7IÉÃÕ…\]ø¦.ׯ5B3Øx·¶—±N!rVñ¿æØã5šÆÈPÿÄ!7n©”{Z2vÊ=U=áª';TÝ.¨E¬"À|];‘±˜ÅN–ˆqŽ,†=ÇÍ8k7óìœÇN‚B“`Æ^49^Ù26}6{cÛ·‰Ø3½Kp ™Ç‡gö‘_°ÏÌÍæÊK/ä˸YÇä0y¯Ñ÷W¥áãåÇœ¢NñÇ–g7ªv¦÷>%>¶ï?PC>6ÞJ1½¥e”=5“ð›Q]ÿœ¡SMjR“ÔM!ÓQ%iª.È ò^óeb¹˜«K~f” ʽ/6F¿ëžg–ïó övÈíH¼ñN˜ÀHËQæJ³i7ðÃÉL¦mQ»c!msÖßEÔ“³ˆ»JÉà[À'Þ§xaag¡#çäòýû³RW—çç¯O¾ÕîMf\zìOGTýÁW"pÍ{Ȧ6ƒUƈ÷\Ã&óÖÎÏÍkÚÞÆÆ9`?³“YH*PÕŠx\ÄÛTä¨1ùZ ¨lfë)‹H>#ù›‘:)ç’½0Rt€0J°%ã'›2bÑv³nÊ麚ÝÜ^]Øs”ª+S"°÷Ξ¢Ÿêx)‡°mHƒ6Z²—v8¬çµþ‰ ª%<|åsºˆ­•žPú&p»ÒuËÇ„éÛ-7 mFSM¡L%èPt(ÃÇ ¹ä7!qãŽ;7%v Ûìœ6ÁÈFÑ»¨8#JŠˆ¶êÛá`úaí\ú.á`°é­p2QÞÝ©ü‘ƒøÃ\âÄœ ºÂɆ÷\ Ä’T»ê•~¹$áDuO¹¤*\4&!9Ü}Ò!¹Í=s=ñz"œH2">‹ø=‘Æ?)b¦šµzž‰Swü 7ÆìÿmœºGM‘œ;ä÷•!|&߸Îaé%ˆR.—r·”:âåÑžê[D„à1‚·=+±[UÙ„´ªo\ìFÛA±NH±úÆea 'uëÐ KòqçâB0qi¼§Öx“Œ¾ZØxÐ|jµosñÍ \àcô¯sïÌÖxÔš×=å°®›“R{ŸskqòöIÌe1÷9bmÖ–¡¾Êc(ïyPí­fÎÂ%Ö,ë¼.m=<ñ©w'ƒzXIXJç‹ùRË${Ú‘ªÏTb‡[$O6ÐcËß}0·‚ì!ž£!y²nÁ¡ò5%Lcº]ûº(ÏGèra÷éÂGñzˆÇ Þ. »Æz ÕgTTóÖy×ñlCK„0f° fK+sáô6jÍöJ­bcVÈÚLÆàÑŽŒ¸PŠ8œ¥ï•öe  Å|W÷ ›Ð9$âÇlp(3—ÝF¹7B>à³¢º¬9Ϩy¥ÐÜÑYPMr®cŸ"Êc(·:´¡QÅŒÝ ù\Èo¿m Ö!uNƒPÀBùÀ’o÷”TlÄÅF[×íC»†¼yA!c„O¬y*8æ‚cl¡››Ürx#—û£mÀpÀü" Lòt¨QU÷‘0*1åS9•³i9ÿp×9",T¡Û~XOc€Ë8+øY\‰’²O!'/µÏ-5;xÉ~¢™=y7£‚γ«ã›Ù)Dyb]ßÈvÚ» *]2R—Jõ!ßA®ÄïMʲæ¦{Ütï¡m>‹±_¨k®bÔ)ŸÜ‘sØsYàtöæøöüÆ–i»£3=†‘œŒT Úþ6c(SÑñ!É çöâì»ÛÙ …‚æ5^ƒ$‘ç[¯%©¤v>uA¶Àg<ÈEe™ó^ g‚¸ª­×6?Xk6£÷|"Äy-x£¾¸l•àæìËÏÕ'9 éƒðbðBc`Ä‚7YpíAš©¦óÒðÆ[Ä:# !^Þ¤3ÜÖ)µøÍåÕììí…óíìG«½uÄyIyÓövï¦I<Ø—i” Mëð@ß` Ïäô7L‹=ƒƒê3[}ÜFoƒž;’âLK¿KË|æš¼q‚®lÑ“# & ˜³¸PWÎ/_Óò?¾º:þÑ:LªKÉâ±hß¿¡EŸWœô¦Lm—»ÏLõGM†i[Ý0U!ÃÄô-bò@[=Á+ŸÉèûíüþìæRe—nÎ./ÚsG>¥ïF× ŒIêOz³ß¹i|suööíìJ/+§}|“ãxM6!2Aý©Õ¼;Ò¸â¡hß¼`M½üM?l-^ýéûs ˜Uk™#>=$-I½Rj%™@×/‰µyùqvuuvŠç5¨(s(ð­¢ù¬þ°À$ ‚!™!â´vI6Hÿ€ÙŒÔiÝ‹Îy(5äæêöâ¯óö.iŸuÃ<É€d2¡ýnCÓë"bå¿Ú˳(KV_'0ž,/;ß¿›]8ïoˆj§V¶Fë뾟]½A†ùLD¹;Ê1‹‚éð›ÅP´K”ÛÐD1]F®±‹jòZô#:ôƒVãÕ:âñ™>ž,Ob¬RËAñ°ŽBóá4.Ýú©|i]ßÒ€Ó; ¹©¡k½{b¿h«_Üjow@Žyz;ÉÑ^PÝZ"Af}èï&ˆ~iA&{ :˜öƒ MŠÄxHÃÑõµ*•Äx|ð½Z ïmÔ¸ÒÌÆplYþm]}c‚Ú¬)#K6©ð)ͤ '½wdI´fMtá]žÆQÆ‚ÌÚpj©Rzv0—ߥ¡HÒTvc6ÁãC5ãäž«;²:)'ˆr¯ÑÌEނ胸÷Н‰1mìš]d÷³ì¡ÂÌ®±é)¿½º¼ýà¼þÑŸ·ó«Ïü rtI§0x3΃ ÷‚ºÑ³ß“Ý7Rý¿ É»F Éê%Sž~ižF8x FÝøUÂHgí!Oe$Ø\ó[±íû&!‡Æùˆ»ÿË߸oŽœÛ+ë(‡Õ\Òë•léóÍñUGÆg¿'ÖJ=^Ÿ"ðn‹,6ê‰ñeRÒ2ÝtœïACä¸'b]“2ïI¡±ä”à>pľsˆÌs€¼ÞÒFð)êaLãd[—{ãäÊüœö„øù_«£®LجWTV¹m8„+W&’*!ÌûŒ¹SZ€÷Y¼?¦‘à§÷p¯Ëú“<»–†§ÿÿ훫‚Ed:Ä}l¦a$WL¯ýR/×…üqÃ|fZÕi=@Îüoø#t¨é6û9ËÉäï9'x¯ñåqšî…HšNÍ¿- }RIødÓŠ,pžÚîQ¢dëDgú¸=&øãdú²?ÉRò£‘Cëñû.ú Š”*jø›Óï_<é"ëÝGûIŸæá†b(ãrwcãº8 #¶¾Eó.BØJˆ{[Äíˆlû¨GßzÏg¼` žµ6—,)„G[„ûû#ûÀ-„H¸$U2H²—T»ÉEnZ™› E% C†?«}vÇŒ0نР¶u&Œ0Ý‚0ðÂɚÒҙ2Èñã!šªó·)Àf¾Þ`»gûb÷ì|6úžlj_Î{ €øt§9Æ~ó€.ç\!î·O ÇÀhè&P„¹ç[[Š7ç·Wh¯PX¯“C(úþQ!>µCƒK/v1Þ¨5ž{õÃv ÜP"¬2WÈùÝ6¦¶OÝyð„–WÛ´>a4™C\n!Aw³¦5.;¹ íÆŠ ˜ˆî6Íg¾šÓÆâ:ád“m(Šð™§Þ6Eo¿4›:Ž)ŸqN2ëmkm{'¹yõÜZ8ÓuºmÌšÍ!¨ú>.QGÅcâN·v¯“Ϊ¯Âvºi<§^F0Üëîû»ï{™]M¦´Ž4£¤Ë%Ý'J5mF¿á—5e3‡¤OàxÏÆù¤Îï,0ŸÁü'Áì¿Ýc¼Ú>éâúЂ'Ñt8ï`¿ÊŽ3~©ÊiÿÚ9•¸)ÐÑ“ ú+^Ù)Õ:|ºMQ¯…ZÍå(I.-Ð$‹izµ1z# 2 5Q¥Í4×J Ž´lM%Ó4Mè-M0à>u×P´p˜N{6ŸD–ž¨=–h"€âØ?K˜$pJ*'VFºmƒ*žÜÐïž'¯—ÌÃa ]9Fª\r ô·ªýÄã(yüLOR 7ˆo¶äIl×ßtHof møÛË6º3ÂUFye¸ f€xY€1ÂV…;ÇuZã¸È+FÒ/#²¬”¯;4³‘«•0d¡ó­7:»É ÅÜZç¿EHZëÇvÙOj¶íË#<Ç\6$÷ýz!¹7”o¡1áïZ5öZÅà*HÈ^}šÄ•‚4£àa/¡–ƒÐ²ótoMÐ4…¦h/ì74yÇ¿`$Œ4Ìr0á'gŠ, |#P!ÿ^êJ½b”~Ïöùaiu…ÊÑôŒ6m‹îLJĿ$zñˆÝƒ89¼7F4B«‡î{}~7¦ì!ˆÎø/}r˜ž™ {å,¥Iz¦Â[¢ú ×N¯ÌËã¥ßAƒá†DFi‘´Éý{Y™ÚÂRT¨ÈaÒ@Q_D³ì~šÄ?¢ÌSZ+áo´[Æúôð£ 1Ô£SOa!0ŒC?cEè²/>êA ÿ5Ñ»ƒ¦ðŽÃVâ& ¥lº¬VÕn¦Þ)ý0ªa ‹âIÖ,a§èG¼´›SØ+Èe}^K.®qˆ;æ=Öryi3ÞŒELŵ_:!I‚?á©u8X- ðhÿü3kQ4µ‚¼ÝÓáçùèd:Ëâ =…ÿƒTÏú ÐÔ ¿³aaª|'¶70•,¬>¹lŸî+y}çõHÚާíqç¶ö†ê±Ð¿@º))ºlCÕ“;·½µö›îo~ØÚÏÜÒÉ~m³W(ìŠý²ì â¥íT9‚¹‡Â1®°×ÄÂjmÜÍHså± …6ûÞ®Ç.|dÑhz7ŸDã°pCíX¡Wç»+™B.:23¿¡é0‰²ir¤¨+de˜BË¥RB.@¸Y} ÊéñdQÿqØ>vƒ¶wEüIRþ+)Œ]Rh3…;Kà gšË ·?ÀôWj[ïR·÷}<áö=Qs¶òËò³,ÄJtäøkL¿½Mÿ<¥?€ƒø¹)`ÛÇJÁe¤oý_ËÖG!ë°©Ã v¦ëf¾áwl ¸ ` ‘׸þg÷.…;lgîž>…Hÿ”v4•ëkÈÑú0_±a²GnÍ ßÍg)ûPKƒÉýi_©PK—®A)org/hsqldb/resources/webserver.propertiesuͱ‚0…áݧ¸‰»Ä½’@ ÁDAcœ Ћ4iZí}}+Ä Ïp¾ ‘¾+I-\°:¡}¡‹ô0šaÀoyt¡°Oz±¾ž:»ö)/(ìzû´—}†ÝàcŸe7Òô/»‰í¥ÖÍ ûÍ}ž:·xÙ$À­ û¢JÙmÔùµn§ÖDaŸ—ÝɾLÅ]Ôý µn$~_%»©{u¿FÅ~*îUØ}^Ïî§Î× C­¨xºû¨õµ¦Ö#TAÃßSØsEp{žŠï+ì/ùͼèe?d/Qñ²—ýˆý˜8þ„ŠŸ‘ŸQë…½ª°Ÿ{a {Í «ÙëTüBaoÐä/‰Ç÷H’_Qñk*Þ¤â7„ÿ¼M ¿%f¿£Öï©ø-à^ØÆþDÅŸ©ø ÿUa£¹¿+ì^h§µ³zØ;ö/j¾«°{ÙØ{´½ÿãaï{ÙIö®b§©8CÅTœÅ‚ Áµ8*œÈ†»¨p£$\¡ÂCÝ"šõRáór•ÝååÅ|M F¸‹—PkN°341”@Ji=·xx€F†µáÄu„—y•REŽU¢-ð‘ÄaÁ&ÌÓ<ÆÃÇzù8>ž &(|¢öóIT„pÇxÁ„‰L„VS«†Z“©UKÅÁ”–JÅ:óÓédlSWZK5iéè¢h:Ê`lcGrKíÖÔÕñ¶MµI-ÕO×®•3›A‘ÖÞ™ÞE JEû"-¡%£i­MÂ2(ë“âû»:Ûx½–ì0àË¡ Íq¶w´i Ø^œŠnЦ´†E8Ѐè+ýe x¬j@5GÛqHãUÑíÑÚx4±¥¶šØ‚œ½íÑXBöˆJ×&£í½¦#¡™Z2Ù‘\(øi;[µÎ42Ë[ÔR¬sHÚ—JãÚµDš¤jöVié®dbõ®N$æ“«\ØÑ•ÀmÖÒ­[[b×àLqëV”,«?O¼c“æÅ¦N1¨ìS¯›P O»¹•%Ñ$j"­%³Û[²Åب옚L­LvtjÉtLCêÕ]Zr×êX»ÖÑ…ÜUc¹¶ g‹¶Gã]šD´jxŦ«´VÚÛ"sá †Y…m1Æ (ÝÛMw$L´™ãµ«:v´héf£Hî9±D,}ZF¨¡j-Vrƒ\¡Ñ-Jh; í- ŒhU!+­D6…æ‹qE­Û𢫣›âšÂ§âåÃ`eHj%ÖQKZjHtv¥gçéØs(‰˜ZKD“» â5Í 7@ËYZ‹<³þËLñZdHjѶùmm1b›6¸ÞN„†Úæh«6û\Qð\iÑö„Û8ˆ˜6š¯ði}­ùÿ²äB;ªðé ?- ieK“aKóC çz’s-¿àN}H„2’!©á ÖZ²ŽOf %ªÄ fqÛïÔZÑÁ›¨3B¬¨iôJ©ZòM³—¤9i.ŒÆÉ:Ñ ñØ-í›Ò†¹ØaH|pŒrÈ”vLJK+‘SÌꮆ…ìØ¡!UXu5Xñ‚vx Ò•ŒFÔQôÍZ[_Št„`´­­À¸8$*h3e¨wUhCCß:ë{¦ }ÏPxÂgJ㨖ÖÏ’)R9ísG"ÊÝîæ¬*x>ÄHaÏ::WŠÖm‰Žq­m‹E?Ós\Â"ý柽¬0ᡦ¥YcRsTܸÆð…¡þc¡ÂìH¸—GÂñ®ö„Aù‚P¸?ÑUZ¡w3"ásàv1 Á>›3ÈU•5kRS9Á¾œ*ŒDå¤Ã^¡tL%Ï%Ùä“[º´Äœ à@NT”ÖHÙ“ ç‹1½ŸÊí‹%ëæÝ¦¯+Ûõf» >†9k%|âfíûp^ž5ÑKY{´K9K-#QS«“ÑD**$^œh3Ýú0»T j­Èûü´&qâŠå™ „ªlbL ºÒÈÍ%hiV#Y·'—"…•Šó[-@ÚrÎÐ0Ê{‘eçNdŸÆÈ*,o?Äoaî[ñ[“ˆÇÛò&üç U¸h3}ˆ¢;\ÿÈÜ$#Ͻ¯•{Ûh¾”]5®X½nû^‘|-Q‘›™kæÛ9ðâ`µÆµh²Ñò"㥄UúC—†l°5@ègk5>qKŒ.·g”ïíûgÖGöDªlÎ>Ò„rUY虆N³³j O1Èt(=ðÄ¢ñ9-“‚gNk\¼ü¨ð œRá0t«ð]8‚¾²¯Õä«*ü~Æ <ö ã1áSÝ_á³T^Ï1eš£ò¹9¿o)|šÊ/äó¨óGÖx~hXaÚ¤Êçó*[ÃÖ*|¡Ê¶±8†±çú/•/â‹U–d)•/aq"ø†Ê/b£¾Tå |™Ê—óF•7ñf¾GTÖ†Ëá+Øž„oªð"ŽÁK¤‚Ñým0ª‚¯Táð˜Ê/fç«ðUáÛT<‹Tø*ޢ‰Þ1¢üOSqœÆz¨èE`¶ %`+I«ßGRð¬‹mWáeø‘ÊWó5 _«²%ü…_ªòuì~ ?Qøy*_϶*|*‚ó *¿ŒŠËù*¿’_."ßúT¾7™Gá=t ¶ *ßÄ[UÞÆñ µ1_•oæ[T¾•Ç~•Ê·¡Öxœ·+õÞA*|^SÙH¦ª¼“_­2+FS2v³½UsWû& Ãh›†öWjLI #FÉ“*O±9†99²æÀv±kTžFµ³6Zå]Tlg[U¾ƒïTÙ\$ÁwáÒA¸ ÿ(«WáQÚ­kIðaÁæ# ±p®ÅçxCžoaú“=-èŠÅI\~ÿ8z¯Ñ±Ähóvôìr•‚ä/³è±+½bs“ÖÞ‘Ü%…Rå×Ó®Ìç»ÍôS ÿ´Ê?Cc7i~–v#µöàšX„ߤò½¸~3}ŽlçbZĆËÞÁ?O X¬ ´[p;øø­ ÿ¢Âo£™f•uVžƒçUþ%~» 'àN°j•ß§€Ê®%ÍîcU~' ôe•ßÅ¿¢²‰l’ ß#Ãþ*¯SùÝü•ïWù½¬Vå÷ñûñŒ·¬kY½¸Iá_Wy†? òùC¹¶&sä?ÐÎ<¬òGø£*ŒCå“ú%aÕ䆚8žÂC%Ž´A$ Ž’T  ”’êeGç§ŒS3<ï‘4«üºõÞjÙÏ¡Y·&ã˹Ã@·•4½HæP-vŸŒKÌì5+N¹õUPÊj±÷Y!ûËÈ«ˆ,–"ŒÛ¥÷Ë@»t¥dí¥'<áxòe’†æ'–‡¶íìÔm¼Srú´î0vÊz•íB‹Žœoi¥wæ†þñò/‡¡6 Æ ½Âõ îS$gòfs¦„‹ô|Úzî¦KXî&Ü¿@”.Ú#ÚâXz%=é®—ý·RA‘÷L¤-Ñ;’õ‘Auîñ¤‡HR(-]øáœI\ë@asïG»÷MSËm»è³ìÿï±TXíæxWj«´úfmgZ>}É¥?)ŒÈ£#ä^“Žá4 µˆ»+F6/ŠÑ%-â³I6/} ¶„¾VÁ‹NzJw Rï5}_#¶±ÔŒÄ]jè Ù÷œÍŒ¦¶6ÑE•JÏÞ Ž·o“¶/à%±$=ƒ•˜i‘u: ý±„ÅÁXõÙru¼!±=šŒEô2$–’‡¹¥u«Ö•·ƒí£-½TKÍ¥òálèŽÌ–ÿ×¾WŠWó”ñj^êksÖê7í‚+Ïof0ò\ÈÀhÑ„q1wÊoR¤NX£ H9 ¶Ê(ÙÀ:H©†¨êõ!Q3zú‡©º¨1[Ç’Sž/jLëEý¤^?¥×O‹(Ï}ÌEÿÛèÝAÐÿ®>ÿ¬^Ÿ|9%Y“4÷}!'£—Qÿ@¯_ÔéüP‡Iï¿ ?õá'¢þ)ü ë«ð÷ ¼ŠýŸck8òáXûÂG€…Ëoé~@a”Äë@âÀÚŸ WtƒCBÁëð Ò!Èùsû¸#ánpG7!ßl$BÍS¬‘5•=$æ‡?‹àï5½O¿oéuþû]Þï5ý÷¢û†e<v ¿CýŒÊÀôc ¬SŽ€§1“¨í”írËøà ¨%ðÜ¢^ð>MJ)C¥4UGP)Õ 5ÿËPÎ@¯¿Rà×ÜçóqÐÕ›¨ËŸ St ­³ðQð1GzA•*ý þÜ89¶ ”·t”eˆâÂzL¹È=PTíè…âÇÃÕ5å½0¨Þt>^ï,q•ö‚ÿi¹ý0I¨hTK¡àêrÞÎáÁà·¸|Éc1òpc=)\ï Gz ¤º†Ô¹®;Áy€U×\‚Y8èì¡™³o›ËUŸ®õ4­&—üïMò{ЇC}˜ð«z`v½'è9 ÓÀË)è<sÉ è<Ý0+„œÛØð­3 P(®W„»QPVÞŸ¬Òs(FŸ/ˆôÀ…8Þ÷ì¼ ì7e:—Qv˜í{×”uG`>^<ù¼ê ©Z¬%{{-QÀÛä6ø“Ïìó‚Uƒk+'úÎÀ`>þ>xÎ`ÈÅ|ؘy –UhÝ~ÆO?ó++OAS•'ï.û üU*Æá˜“blsMž¶¼AÇÔ ’gÕ±Å_ào:BPjŠ‚Af™!Èßá:Øá‘§‚óÿ„wôù^@Ä·Â?NðEb PA5£pk¤…™ÌÿïêXÄ¢›w”?"®„ SÇ :G ã¨A<©>Bü·É®JgWé¯2Ø-ÔÙ…jO¢,?ÿ÷ÌUÈźè’YFðö?ð¾¹ .ä©ûÇQàFP"z £‘DÂ'šŠuNéX‹PÒÎä°¿ˆ°ÐNÀ°ÙtÓ…ê¥ÑXv5,"Ù«– 7¶O›rŽÐåT ë8(x/1È3æžLÒCr¼q.Zç8K[–û=r¥ÍüÎêH7£1‘³¼ÜïšCÒCkð 5ˆ4´Ô;ñ4Já§ž„eõ.Åá§öCEÐp#ä¢uŽpÀ=¹–·´ìv³ÌÙ·j¤¤A¼Êk²ö> øY¨EÁŒ~­ÿgLa5v§‹˜Ã\P)Ö¤Hß‹²-ëÒ3'sé3pÁFUùG‘Á¸‚®0]0®Ý.®º\Õt…¸h¯A—AÂçM’˜©Û\ÄïÓmn”¸|*Å]î&qa£¹VˆëË â1%&¬ÀKaªÓqV0EFÔ.`˜ Sf…a^f¬~\‡¡¾G4á®]Ü\]Ž‚W×àŽTð>¦šÇ[æ ÃÝÆa­‹d]P$‹PlZ´´‘ ·a« ¿G§‰5ˆ Ö±®G ‘šç!|KÓ1X½î¬Y9kÀ%Í ¤.­wfÀ…[à mh½´Œ ³¥6dξ† ÀŒFb&¹N·‡*p€0ÿY ¥] +¡ÿb€¦1„a9ÊJuæêÐTÅX÷ÜîÐeè$°º\t®ÀË“ê+iaq}Í4×`ÃL‡'IûǓΫG" SÓÃmÞXÓá16‚õù ‘³0œÄ˜<'12pѵp£ÃŒ°ÂAOoƒKé'™•™»4Z?ï¥þ‰b}%“ðXΠEDÍ”³ ‹¯^Ê_¬[ðHq»Uˆ«­RÜkVe_¦c±š°ÅSЗha¼Ž0Â_Zƒ±Ql´ŽQ¢Ÿ_º­±èǰ±úôN´)’»µ¢rcD¸ÃM÷A±Þªh»À?X_Õ™·+ÍWTV㎕m= ‰SZ"àÇŠKsùÒà€›ZÄÆ±ñºkP :róÊ+6†M)ôVyÛ\ÿ y£†]&a)K ‰B@åR”šsY˜™}öNd˜kö”M0Mlªî &¸…·3²b„Íä}‘Ÿ‚G O“é '²I:zµÎe´¨äÒ[ЩފîêÞþ&㫲\ƒÄØf½pUv>¬¿7LG„¹]Â+=ÛöÁÚêðqØÖ ñêê׬ô¦àö,L<íh ‰êõ‡aLt éÄ"B«±èdƒäÊÀH9µfôBºº„½€¾¦«Oú9ˆþ¼np•XÄn;¸øù\óè TäìFƒó4\Œ¾ªøüS”€Óßè¹í帗˜[º|5Ga'7? »8`ÿÌr5Ž£ð4މ‹3ÙœVÅæq«ÅvRÎ9èå騬EûY„ySŸ{ë^Ì?(Ç ÔÈí‘tyÛ!¬ßÁó[xi×ybžë˜%áù½´ª‘bUÇáŒã@¶O­1Gᣲ5Ö'Za=¹TÃzn¹ñ¹6ãˆXÕQø˜‰^)ŽÞYEÔÚu’TÄlf‰ ÿx!æü¤ÉœÿÀ&›D²äjÍÖ³%EÉð'úªì£Î4SÜéb=vœ2/Û ïÎÀÈûSÖm¢7ƒ‘`y3°ìÜ”³ !“q¾XØdÏnya<Ûm´ gÓÐéŠζ€ó(|ÚÕ8ð=pƒCNõÀgqm7Ö¹ÂõnGP®ý02è> {èÑ ‚!ÞM²çÞ­`Ðÿ&rÙ{|ÕŽ¸9#.ѽ ]?‡ŸÏ&8ó`ìiøSù,¯ªž‚K¼ç«§áB9 ž)§ ù,™rÁ°Ó0š©82zØž` £4ù$ŒT”ûîI½fqðGô€d2«Õ§kõ‹n8M»¥àþÁ÷€‚±«Óñˆ)¡%ŽyH‹M1‘'èȃÉu.Ž =·@™j¢LÔQ >CmqŠÎ4{6Îl¦÷Á&\€Íy&NµŽÐÙ»½ÏÚa˜3XŽãFÐ7“oNssºêQ}z«7c n»Ã”ÑëÉ3›ÍæØPcPŸË.°ËØÇèÚ¢×èól§§ÓómÍgªa> ØB›éYö"¶¸Ðk[Â.²AŸk /e vès ôe¶²O6З›_£²èåæç%Æm×1ÖÖd1ЛmÑúŠÂÓ+ûîâÂè«úAo±µ¹é†Í­¶·¹éú¶ÖräÄ—7r•Ï‚*ŒúnÉz, é1f—Ø <ÍøR{§×Ù 2^o ÖÀ!‹T£0ËÉ‘ b¶¡=]Æ.×ç—è#ËÂþ1ô2EPáêàò<öÕú‰’ÄË€¯QØg‰xŸÄdœã€HÊÙ•l#ov’ç(¼*ní/âe‹¹‡¸nnë…/Éë·ÑÌ£&âp]…¾ì-mm²2©@­æ²‡ê"(9aéÏÒíô2Ò˜×lws¤±››m§ÇÓ[ØV›é‰†t13­³Nï5¦¯2§­o{{ìïLj‹ëPÓônªŽÚGUSæì»ô=tovÛŠèû Ç „øí,¡ã×éK厹‘§öC R1­noÓÃÒnŽ—÷ŸóiàU‹Ú§¿u¶YȆ:ÙÕ6Ó{Œ$YJŸž£Ûô±‚=r{Œì ¯C¢ÎÝpGkI›ï«ÃõÃã#eí¡ÇÓ;ä–zéoþõ/ eºÂ¡á„ç†#‡a_Ü™ýðK©ö`ÄØÁvêèÖÇ:vÊH]Àm„WÍØQø²ä!3úz›Å»Å„}Ôη» ¼ÖD¿]_ÒÇô|þ] ò‹~)þ4½O¿K-õ¥–qëO³™×ÂâMã®K„ˆ²óÑ6CBSó 8NÁeª<ìc¦ÞïòF¥¾z6¹»î¹Ä1»LÙaóaøZÙ1Ø¿Žá¿#poËn@³ú­œpL; =pŸì9sz.ìÝoöÜØ[*{=ðu‡`•9™^xà<ˆý‡ÁÃNQ=’g*ƒÑd+þPK"Chh€KPK7A'org/hsqldb/result/ResultConstants.classu”éZ7†5„}%¤ !ÙZ§tß+Ï{ÂX4ÝT“PRJ¡aI×+ë^@n¥íÓÞ@C?Çæ ¦ø~¿stt6ùÉÓ_cŒ-²_úØO}ìç€Ô³•Äò4¶Už‰€1´po÷à°µ{Ølímöà X¯Tö¡<¸¡Ê¥q– `g…ÖJ;87X¹ûÞßT‹”kay¸ì¤Þ€fÂd"Ëb%¹1Å¡sPkÿQû6Vå&¬‹5F±aq]À†»rn„Ó iqØiƒ› •”8†Ë¥ZMDT+¼‡P_™W¨¸;ŒdµXÉEf:ù¬ß}×j5sÃ(Q¼ƒ©nHËed‘J,6M‚S½Sa˜ë¬ýV FÖÁ1jÓ†8-l¦x~è — Ì èÁhgøK<Æ ÷ÿƒ•Èò0IJ[©°KÊÉO݈\¬LÈ,6qS8?îÖ®2âÂŽñ²³Ð•Å«‰(ÃPa¬tª«$j+ÃN9ÁI‡«±©«Ü …&ײ<åÄ®R^flÑ­öÑ"!Âf=EµJãUDVÉdèù* í´hMÎü‡› 1Ÿ2þ‰½Áâ¢ëH„ŸÄüëDïÞïô¿vÁ•VÎ)³ª‰uë¬×L{¿;6nº–év™¶û~í²XϬÔ1+ß4÷Ì#ˆ˜;ùÿ÷ˆe„åp>{û[•‡vlTö7Žv+ºø×ù?@¥Û­Ç­ÊNkw«¢6¶7ïâW7`g°ƒ56ËzX/è¬ûgçÀ}÷žOžŸ'< ~Žð øáY|.~üáÁ/ž_"<¾Lø ø*ákàë„À7ßß"||‡ðËàWWÀw ¿ ^$üøuÂo€ß$üømÂï€ß%üø}€?$üøcÂ\%‚#¼DØíGp ¾Gxœn€¥·?ÊÛŸÔÛŸo_´·/™·/†pnzóY%¼^'ü øSŸ?'üØzùéåßòòßðüï{þ<û¦gÿʳoyö‡žýkϾMøðáoÁ»„÷Àß~Þ'|>ôâyõ>öìß{ö¼÷ùã©÷€¿PK9Z]í*ˆ PK7A0org/hsqldb/result/ResultLob$LobResultTypes.class}ÔÿNÚPðsD¨ (¢àÝüÁ6§Ûªn>t6!-k/&þEÊÖ¸˜¦LŠKöjûc°‡2ž[mw,è„|î÷ôÜöpé¿Û?àN8TàŠ­í뎜êbйºƒ€BIáÄ &ç®ãeè"dÅN\,ƒ¹Tí¬mGA&uEÌ#l§÷ôÚBè¶9èYŽ! Ë”…ÙT¡ì0³0‡°j¶Þ¦~Éý)ÓYr' å8vßÔ(•ëy„ ߸«›§âL&„åG‰Õ‘Ë‹ÕxùK¿×5d§8,"4ù5ñN¬m)ÚÐéY¦£ÿÿ-dRE(& Q®ÕÒÕÉ­#ìLõ™9²zºòÉá6¢g{¨LO·9#Lîf#:!Ÿï¦ŸöGãKõGxíªc/¼ñ'ª}uGÃ}î!~ÿôB„¥ôBÑo¬ùnJ–¯Ü_®ê»Á¥j ¯¼oú3ýéÄ ÌÉùB20OÊÊà 9²Â¼@Î3È‹ÌEr‰y‰¼Ì\&¯0WÈ«Ìkä*s¼Îü‚\gnšÌäMæ—äWÌ[ämæò.s‹üšù ù-óùó>ù€ù=ùóGù® W ýU@ÎX…£\þPK8?+“ÊyPK7A!org/hsqldb/result/ResultLob.class­W[xÇþ×^i%yÁb æR"ÛJÜà´œÐbA¹&›p mZÉ^ŒV‚^Ò&ÐæÖ&iCÛ„’´´š NcaBJzoúÜ·ö¹¯}lÈzÎììju±l¾¾93s.ÿ9sæœYùƒß¹ `=þ@Žkx8€&|ÕOäkL¾ÎäLaòM&ßbò(“ÇZp'yõm^}‡Wóê &OúðTO㻼ùã>À³xŽÉ÷yû&Ï39Å–?dÁ˜ü˜É L^dršÉOZp/ix9€58Îä§L~Æä,“Ÿ³Ö/xõK ¯h(*X8”Mf!ßu|Ò0èñLÆÈÅÒ Óä­'MÆ·*Phf!ÉZ´‹+hI¦³£‡vŒ›FÞÞ ™‰üþäñ¼1ÀMûˆ1z ‘s1Þœ‘3r ‚CG½©lï°àô“ÌÌ“ô°‚6GÏLò#‚Í w¤2©üfÍ‘®Ý ÔXvŒ‚ eŒctš»¼ưq¤`˜[gd°k(››è=`I%{s⼽ֱɂÛÛŠÜtLWGãó7ŽÑ)ËÆ’?R º†@÷Ìu¤UXÇæi½+WÈŒ&ò†c½Š¬ç² U'ÜÌfÌŠ ËlÁ"'Ö2oMÊÎD>oä2;³f*ŸÊfܧÙ?0gD| s*­©ˆ®‘ÃØœXK-¬œ(ä¤c¿B©[–ׇsc®wcÊ6˜/×¾d»û–Õo_ʲÚª.·\1¶ è8r–º[ “éTEyy-‚¾ˆs ­‰|B$ªÿ¹Î´`$Ÿ=´=1¹+‘LôÔ*l{hÔ˜ä+45üФc¹Tž¢¸±F Ó$•x†î|<1jô»…éTR±£/_WE$Ùcœøì1K£ŒÂ¯‹_8ÈŽW°å:e¼gÝÝ¢kÇ}2bL62y:ëË•B®i[¨À7apÊøe¦7Þæ1Fìç™Xô@û‰e?Ï i=à~¡õ «/·är :˜éâgš¹ìÈÅYÆ®J§¸"]³¼ÌìsX¾ì‹]Z²¨u܉W,oP¬²YÇ­X¯£ŸÖÑÇä6&ŸÁgulÀí:úq‡ŽØ¤á5¯#£ã Ö?‡´Ž_³ê›8¯c oQD²†ßèxÓ:J¸ ÃÀ¸†ñªŽwØçÆu`rÉ%¼«ã·,½Œ÷tŒ2äïð{^ýÉ5üIÇŸ‘Q©ºø{héd×]:þžFñWã¸ßGŽ·0¹Bý9[ft7HÚÚê¯øçzv8ýÃ÷ç \TÓ™ômçï1U2UÒq“ Óàâò1{(›™ Dš²Ü‰ígö]…tšŠÄ¡oÙn©ÊÅ#êÊ&ä ØÈå²¹ÞmL©Êè‰É§r{k$nÕI:‘™è¥<¥2ý].Ö°T·Ò/q†…3ªÜ•s´žÓÇÂÆ3ž.˜ÔêañËA!Ÿ‹ XšÖ©Uúí@‡ XÈ_=qâ3ÑY>Ô7DjôÁÊʯ~>¨c¸‰ˆèÕ‘ÔÃ+]6·ð,ÞâÜêª)T¹û ããÜ}]K\\wm(dC ÖD?g ê3ð?j:1÷Éýmr¦Æ3õž˜©óÄLmHt-!QÏBÁçh·„v ÍZwpñ(SBÑÏc‹TX…fú´]BÓ¾ hÞ ¦¡Foœ†'z^ª &Õד²—æuR}“'ìQI?ìaƒ°§sÞ°§M=9 -ì±í·6´÷Îi¿ wIûMÒþ—½§Æ>L!ùxº\‰s7îi€£ÕÅñ×Á‰cPâôއæ•6ŽVƒ~R*€TÛð ÎAúe½®‚mó>És’º@Kç}”íª<ŠV>ʽØ! o—D]ø\¬DÅA¢UîïÅN—{ÍíÞö ¯@ñ†T†ñÚ†÷aXn”îov'À[Ï¿¿Öÿ}ŽÿõÒÿ:— ¦2‘'Œì’ö}dÏÝ{“m¯…µN6Ô‚¢°´‡-5¾ˆ@X³îÇî¹|Õ-e€=ZyAM+ïm¤¾¼F}_#õ5ê4®¦ŽY«iã{hq݃¨gq®{øb£8õš8¿„éa$õ¦()«€ò_G½û"tÓXÀ«…¼juVGªF߆úš€SÞdB£ƒÆioÉù_rÍó k(ÖòÓ–mÃÑMãÝrVŽSöpbó:+­¨tÖgûë±£tíñw©È|Ý´ô]D° Eü³.U¢¿ysmü—Ï¢çÒY¤àþÍJñÚ¿‹x©l^Äs×á×ød~׹΋°;}Þ_¼xKÞ[þ$¸AÁQ ¾,*'øf4|%êùʇhoÒË+Ý@‚ÔTROÒŘUCXaÕ‚Ý=ÑEÕ\BˆK­¯­Û†~åZ6ÊâQ™*¯tS½.©w¨ ihÓú1ÐGrÍÿüi ¸'z˦ÄžªËnŸŠ9»§yA +xn-¡ƒgœUâwËêUV»jw†Æ£r>#×g,¡wEŽkØüÙþA³Nó$o©º=8¯ŒJ“³¯„EÁÔŠü%¬,âhµ¨ˆQ›UÄÞÙ1ïœsuki«\0SN‘,Akg«·Õ{çÚÛÚ۟늛øÏYÏXWl<ŸK©ŽÏUë”F”õ–nçÞ"‚¼o±ö«ö–CÖÐ|{[õŠ08•ØN<†ý°ç"V+ØÌAlPçó%¬Ù×qkù™.áSa/ÇÔQº=ÑÊz̾餽Š4‹} ]!Õ’$6X‹Ž³P§ª1„äEnÞç ÈÃÌëõyíÙ"šË©Zˆæñ˜¢jHµ_¥¯™;cŒ­³2¦xÿokéð¤Kè®È™'=û H6KÞl¤ræ’s¦UenÞž¯=Y›½'DöV\¥/¬ûå;„´ü@/’’xØý9ë ŠÃÈ8bÅ«oHq¶®µ×¶ž¬+Ölñäê€ûÎK±‰|±ßp´Ž8`‹á¡:â[| ÑÍQ ìf¯ÿPKÄ}MËÞ¿PK7A&org/hsqldb/result/ResultMetaData.classX xTÕþoæeÞdòÙÉ,aÉL $„ ƒIÀ  @[:Lžap2'/@¬¥´Å.v±v‡¶j颵´MÔ„ Š]±ÚMk[»ÙÖ®nÝ´+‚ôœûÞlÉó5_rî¹÷ÜóßsÏ=çÜûòØ«œÐ(š¸ Ÿ/‚ w©¸ÛIíTÜÃý/29ÆäKN|_aÙ“a»WÅ}N”àþ"b„¹Q–W1ÆâL`r’Ƀ<á!&§˜<ìD9¾ÊÜט|É7˜|“É·˜œfò“o;ñ(cðï0÷]æ¾ÇÜ÷™û“Çx‰âIþ‘“,ú1“Ÿp÷)6ð§Nü ?gò üRÅÓN,ůXöëbüÏððo™üŽÇ~Ïc`îÌý‰y–¹ç˜{žÉ Ü}‘ ü3“¿ðØ_ÙQc”¿ó®_â±—™û‡Š Lïj miß¼³£ms˺–Í-"(PÒšˆ÷ḱ5Ðmt*B :ìØÔÞ¶sœK HºeõòJmÓ6µtµtäŒ*5W´u¶u‘ÖºÁÎum×æÈ fdä-m9b»€b öéZ$è·‡wé±~Ší{Â{à ±p¼§!d$£ñž&bsÒfÒ 95;ÚÉž†Ýý7ĺw50L‹2[qƒÀôý†ïÖ»[sG{ûŒÁ.½ ftèFx]Ø \”™”†Ü9_.U7…“áÞŒ¦“Ö Ò*ûÙ¶‚tªiÅSM3Ö†ûÙTgŸ„It›jkéÜäHç@,Þ#ר›£ñ¨±š\å Öm¥¦•&“_ãú¾-}ÝaC¿‡fßdž©›Êî8íí‹M.#Éø±ùdÔÔQã=1ÝÜ~a™oâYO rͤûÜ NͪJ²Jž£nèÉŒI¾BëIò®5ýée¾Á<ñ9¥KBF8r}G¸o3.UF Ö¾¤NG®›à6Ÿñ´ÝȉV¦ˆª¦á¶|Á\CëM"*#ô­Ôqûê&Ož¤0nó¤MjU¬–'/]5Ò™ £h¿Ü±)5cy;ÕtÚS·¡€Î’¶F’4=¾à$YS·•. ú%e=ž_Ùí›L7˜^Rz%G«Ð”)fÁNœÀfÀ¼ôdb_4ÑЕØŒ÷ k£ñprPÚø/Jï¶ý½ÏˆR)Vño*I=ÜÍ'ÍÎ6³L`åà&=.-‘®Xòõ¾dÔÐSC—ç‡ß8`~0Naq]8¢7MV3Èå9ˆ­f±*”ƒ¾©Á§ÂºSß—I¥‹)•¦”7å” 2x[½}a#*+ã|ßk«Ömp4Gb²†j¸7iØŽÙ¯¥Ê“côyÝ¢áõxƒ†èÐðFt¨ø†ÿ⌆0À$©á:ôäjg¢¡_Ñpç4¼ŠóÞ„›Jǧ–†x†nÂnD5ì!B—»ÐD°iBaRˆš° UQ¤ '“b&š(ÑÄ41]¥LÊÄtŠHM”Ó||‡5QAê8Â\%MÅp›†[ð:¦\G¨¢JÕb†&jx-—pkÂ#¼š¨351 çT1[sÄEš˜+æib¾¸˜p‚ÛZ’Éð é»ëÅMøÈm¢N~Ä4`ëyg Å"M4ˆK4±˜œ+IŠÛñ)M,K5|’8|ÒÄ¥¬¶Œ=°œ÷ñ~ܪ‰â2M¬MÂØ¥a/C»r\»q×=BuqÖk¤½¤ ‚ÓYL¥6K/Ýenk‹¥P)Š$úe_fÅø5›&ŽÈjsUž ðÿa´ŠÐÕí;·¶tµ^ÙÒµs]ÛúzÉQ´OÌîÖÝTÞ"Ö¥@)¦Ò bŒÜâ9®Sgj‹Ë7ye*ál§›Ã4Ž.[š›çö(§i²€gϵÇôx±›b‘¬2ßBÑXÔä¼VšAãÁn=nXƒÛyP£Ák¸*™/§ê†ôp2²ÛìËò“E·*=¸œÑþ  QÅ(ŽögáhÑþl•+nïV's)“ÜY;È%±:Ë%z2™H6´1åbMwr´W·º‹éŠËóŽÈ uYÓSá×d-c:¿‚B¿.L¹šN. ìq/²qÙ×dúÁÒKx>k¶\°=Á[$çl çdE˜ÀÌ }ð[&5ÒÉmÞ|AÃSè¼øF3?±°™p3óÎNÉ9p{RÛ•ûdȾȆ ìß3Y6ÈäuÖ(0w ×  ymšöR˜e\9}/Ĩ*A|I˜ƒEô:ŒDû¥'Ć”ºyŠo›PØ s\:¤Hf±dS‘Y•ï…½5…e†l%;Ò:–èÉÎC±Pd·ÞÎuö%\¿hߎ‰…-÷…l Ê'@$L/Óø^=i¬O&z/Tl¶c1}â^E߉ep¡èäUl¤þ¦¬þÕÔïÊꇨ¿9«¿…ú[³ú×PÿÚ¬þ6ú£G"ó•+[ºß¥l§/à[žZß,²ÈVðí,[ºîeKµl÷ȶ–4éAý^êUS¯€Z§ÿ8„ß3‚‚aðOâHXs–ÑžyŽÿ$lÛìÇ¡´ü§BáìÄŒ@•ÔáÜ»ÿÔŠCF_Ãgax£ÐħŸÖ¢·Š¥å‚"µJÜ´\{@¸Ýcp¦¦õð¦-…CNó)c(n'34ÛI”lBЮ¦…ä@㽘>ŠÒÀ(ʲ°ZɼBj—³y ™·Rq)Þ‡P>‚ É”Œ@s)l²K Œ ’Ép—RK†»”àÞ´å—[û]€ªÜ¯Ûr™Û„ ¸tŒ Êlªnöƒ;Û û°ß»…Ü P»ÛM è ÀŽzé;IDt’Y¶ÕµþSGQY?*kýµ‹”î‡lâ®ó/ÖN£ŽuKíR9pÊ4ƒF H” ‰!.ƒDK¡œÃ\7Š3¨>QGãô2´ìj·Žç?yø4¶fqêQÌ¡Æîi|å’a±§q3B‡óôpß ÛY‰YgÈûoÆ ¹ŒZÁÿ­a¼cÒ!oÉ+v¤ÄÓvU‘U,.ò³:mlØšòV¼-‚}È¿‡òˆ+Râ›ñŽ<âÊ”øx—%ÞHë+)¿ðÆk:Rœ«sái¸ŽÂ};ÊëOcZ½dUå.(¶ci¿” à©x7ý®¡êƯ` üf+²VÜö·Âp«[£ðܥެ~-õK³ú33Îo‚=¤â½çåÚT¼ÔS"“è}k™´Î*"~ÿ(f5™MëyÔƒÌÎ9 ‡§Ô!ù‹$_z°Ù“Ù©ƒ# T½÷-Äyä?þw\ ù­Úë¡n&®ÊëQo,Nó@ øÝmi̦ù¬QÉó«UI¯àóPŸv‚f/Ë2fþ‘§ 2ÂÌĶÉ)úÙ»—Ñæ…PÀ??,§™ššUÁ±ãå%7ÊI/ [Xœ•9³*xÖüPî,^1KÁ\€ Jš«Nƒ,Htq(ƒÇýÞãðI৆­í;À‘³2Çsî@Éø}9Ž¢Z®Ó)—\hýlÚ’­™å™t2Y©HZ(© ÷B—â*tQš¶Ru©©Ñ¬Ý \êê8™¼.Õ¿;cNíœ[†GËýc<œŽ¼õ¨:5Î7ªøèÛW£*WCm1µ3¬>·jXu–¾sÏÀm6ÛSb|”°ÂüµôkFÖZ5`Q¿Ê[Úx§•‚«k£ÄÃÂ!"‹2õVãl˜.Öˆ³˜&r¤‘÷™±‹«ó!;ä ‘†åìÖ¹ËìÞ{qÉ(KÚX­TÙǰd¥JSËNbé6—Z¦à8.eGg̨„’2£H¼Š% %þ'rÌ¡¯^+ñ®´oI€.e'°¼TÓV¦ó¢ö²ÔKWž@“MrÍ'°ª™Rdƒ˜IÍíiÔ¥´YFuaÔ wàNÓMâióÒ·8ŸåzÌ©’ËJñxVŠg¥øYØ€pV^R±¸ÚÊë´¬* #n‘D—ÂçÆ +¼'pùDa ƒº&{^ÀO¹Ùrk-•'‡Yê ¤“m‘©úˆ¬9š·ÑJ;¾j³`¥þãé;­¹9«‘Nkš[—æ\i®ÆâÆÐ–1j(“|³MüÊSùœñlžükFÕ+Xcfg·®qmƒÌÆ9gPjö»Ì¬sggÀ§qÔ ›V0Ò{†ž‚|ëVpUŒa={ƒy»ÉkÌkÄ×§îïÏà³ʦTHóîèõ¨ÞBÛ±´ÿjMÇ,÷^q„¥r›Ï(™‹­J íá·ŸK¿N<2Ü€é62ñ>\IMð>l0¯4üPKú ± ¯PK7A(org/hsqldb/result/ResultProperties.class}’KOQÇÏí¼`ÚB Tí”7S|TQ›˜b¨1ÔÄ`¨² &fèŒ08™Á™)7¤_WìØ¸q¥qáðKø4Ñ ñÜÛÛ2]œÛsîùÇîç¿?ÀTUẠÜ f‰š› ÜRà6!ÛŒžûVØò]c˱:lÍsƒÐpà ÃiYVš¹ã9&Í£1Âé é{ŽÓ¦§ÑÖži„Ý Àƒåvhï³ H@¥A;ر“F$yÓza´œð±ïí¬=Ñ^­“(M ßµ];\& èå bÍ3Èn[¬€å‡¶ÐëôWÆÕFðêáý•Ú*[Ävìð5b:»Ë6B£ùò‘±÷¤#E7Õh¶|ßr›˜;ƃ ¾5/1Œa6Øϧ×8šÎ[¦íàiwN¯MªfÐèéF…V¹´ ht…bWë–a®¹¶‘1ÅBÞ0ÍXUI¯o²^>)”E/Þeý:+ PÌÀÌe LÍ<̘öüíÊNðÊ1·*¾àg¨¬³#.fnר7*ŽánWÖ¶v­fSø dú=°¨‚ч*úé˜O›fcþúÃ1?‡~>æ ?óÇ …¾úE8óÏcBC«a$'¡Ïjñ=wôcb Æùõl좦D%9jKQ{BŒÚQˆÚU© ½åÈ\äÈ,¯˜Õ>@êñD–Fàm©ô=:ÍdÐ9‘GB8„Á¼ðýä¼ð£Ê®Pj*‘õQ_¨i˜áÔ3\HÁ󎆙G 8¸\ÂfGQ…ª8.öþKQŽ&pé‚„[Wå‚|R=2nòÒ„Z•°­fQ²®)®Cnàà ï” Ã|˜áDFS’• €t 'Í”;k¦ò©[0YˆÅ$bò¬—á 'Há™+‚Š}ÚÇ h¹ŸýPBW{Ð<‡†Ô¤ó§ŸQsíFé0¿’˜ÊiÃMv /ÿÿPK¸á÷šìMPK9Aorg/hsqldb/rights/PKPK8A&org/hsqldb/rights/GrantConstants.classMÏÝJÃ@à3M›´Õjü·w}ƒ_@C:†@¨’ñv«%µ„“èµÏå…àC‰³ao–ýfÎÂÙïŸÏ/W˜z¸ðpIp3N8Ì &á¶n;]wºz[9’$IÌ%‘³QO/2Ns£¾¨¸Ÿ»Ý0(² úƒOðø‘Ãb·›Æ)ßrÊ‹33¹‘@žÆQÄ©áÁ ’Ä\¯ ³mSªuûZ=/UóR®»VE´úo×ü~תÒu©î–›ÕSçÊГ÷#Lá /˜ÆpÅžå¡xdy,Þ³¼/žX>ZöÅG–Å'–OÅg–ÏåÄ/PKÙ(—íxPK7Aorg/hsqldb/rights/Grantee.class½9 x”Õµçd––?™$ a’\(:ˆB€hH‚Ôê$’‘d&ÎLP¬¶Z—Új]ŠØ’Z×J¬Å6h2ˆ+¶6X—ºT[mmíbµuyïõ½gUÓsî½ÿ?3É$AŸßû`îzîÙϹçþyúÓ‡€cñ}\‡š¡ƒ'7.nÜÜèf»@“9z\à’“\nò¸ÉçfІS]+÷ 4œæ‚)rRè¤Ñt'zqЏ)Öp¦ f æÀ#¸ŸÅÍlÎqÂÅx$OæòÑy.jŽb´óy´€‘”ðt!O}ÌX)Ó)sÃõXÎkGó´‚AqsŒ†ÇrïÏÍb&ÿ%†ZâÂðD–ÇïÆ¥x7ËxãdnNáå \ÉÇVpS¥áJ,ÇjXÅ«¹YÃ|¬a25<­ái†§º †™ªÁÓM-ªcFëyÔÀ’®eÖñ´‘›&nš¹YÏäN禅e>Ép£ Ïijxíl>ûenÎáæ\ pÓꢦ9iç&Ȩ6qÓÁÇ:¹ qs³¸Ù] ¢árf{33ÙÍ»anˆñ‹1–èáÑùF]C÷b.Œóò ìuà^À;Â$jx³ù&z±/qàWùø×xñR /sà×x¹†W8ðJ^åÀo8ðjVÊ7ø-^£áµ~ÁŠ5Fº‚¸!;«lï…W†¢Á¶8‚¦æžP¬©­3بŠñHÁŠ­ímí µ‰aÓÖX<ØàîˆÂñ`°>ÐM8kbçwÉ¡^£U]X,C8ª6í¨è¤íöÖ ª.t£óŒùR¢Û.Xi utÆcu„#SOv…Z+êz»â¡Ó]½Á5X'ÁбìM½]])‡¦>”µEI|âhÖh†h{0lgȦ`œ s¥lí)xs”¸ŠóQÜE`Åê4BäŽ\@ºh¼Žˆ=‚´Ÿ ‡â'#œZrX ›œúÂÓ¬U‘v2‰ÖŒ7oí¡‘¥daœKc-(Yx˜öɦ3Ò1äÉšWâ®H‡rZh`qf¦cMçOáj n"¥‡ÛØ"sÒá3Ú„ÏTEº{"á`˜•©µÑ$Äþ¼(McMÁX, §)HòÝÐz9˜Ð‹…YW‹0•(ŸØ¨è „;*šâÑP¸ƒˆå3±NZ 6‡ºƒ±x »GèîTÑn”ÒËØi”N妅JòD9+ ™·2Üž\Ÿ•q½%ï4"L§@lkcZY¶…‡ç 5ÌSvS<ж™¼µ9@gé¾@(._ t¢äð°3h~ ½=ɹgyÉ$f›Ì¬t—Ð%G¬wDr2ÒÑ%ø³£©Õ"0ÎþÜq#Cp‚ž®áuä5Ñà–Èf¢¹n|µ~nü‘SIü+[%®Ã·y´§­+ˆ®†¶PLt°qÈQi}†›®ÞîplU$J— âŸÀ=&µÅÂ4éôÒj©ˆ 冰=uÇMDÚ67»2Ø9372û¼& FãÆl}O{ d‘y–šGt±ÒLê)Z‚¯$Z >Q,˜”dìc’M$é5D…4F./(›7M19æg=FþìÅ\@DýâÏá_Œ¥0[E×áÖdY±UF‰KJ'¯øim°Ìn•½ñÎH4 Ä)e’F·„Ä)å˜1 ¯'h’¨>–&©E$hÚ®eH7‘9EŠÊ‰‘_¤Öy½BKõ”cƒFVñȵJã^§J>Í‘U½É•¢1™Ç¸ç9–®¥²c ÀØêíU⩦lcRÛø¡7Á•îä[N¡›7ö†ËTÍLœ÷8̹†á‘΃pÜä9xŒÇÑS‚ÅdOÜ„³ÇrÈRVF£­µ¡G|TÃè½BÕ¤;á¾7ê°››¸ÙÎÍÍp#ùLfãèð¸•HM¦ ¾·èp7ß…>î„»¨ª˜PNnƒÛ)Ʊ‡?„»u¼n$§Öñ;¸MÇ›p»Ž7ãvâw´ŠVônÚÄ)Ä^ÕX]Ù\­ãwñ{Üì šª±¡–úðû:Þ{t¸Å~î×ñx«¿€aocÔ·óôxRÇ;ðNïÂêðcØ¥Ãã¼v7<¤ãN¸—wû©8×ð:ÞÈ! ð1ÐñG,É=x¯†?ÖqÞÇ~B7”Ž?eœ¸›i?à ŽC˜Ðq!Ó<¤ÃÿÂ+t›§kŒôÆCa¢ò ±F"ìå&Á ñüCç¦@‹ ãÃ,î#p»Žâc:üt|÷éø«eþLÇŸóôIn~ÁÍ0 Þf‡!&÷ãSþRǧñ ŸÕñ9ü•ÏÀÓ:>/èø"ëï%2=þšG/só þFÇßâ«:¾†¿Óñ÷Œæ.|]‡ÿ¡cðü‹›tüþQÃ7tüËüKFùg2þ…UýWØC9z"?×áS!G'Ç7©¼XÝXYߌÕÜ Ã'pPÿ!Ì=ŒÔ ã[ø¶ŽÇÐá†zÂÔ\¹‚çfæ]|/Ýäõ½Ý­ÁhSðü^¾Ëz}Såêjªª›ª×­¯®¯¢aA xœªùX…¬éí+ê*kˆ‚µyÃZ‚ӪϨ®Zß,¯­®ªYUS¥Ãà^ÊHkªªW®oä½Uë뫚k˜³Ü¤÷•Gá8y<}‡•WFå;qö¸l>šrGÇ™x–rbG˜/ËQWÒô q}L<®4Qù1å¢ _šzº­@OO0ÜŽP–é³$“ÀR¾mª&ØÍ¦÷1NÏùÊÏô¢pÄÍŒMedwdKpT1R–»zÄc@Þܺû¨¥d0?Ó±KdhºáRÆZ"®^záWw÷Ä·ÒB,t‘ ^“ñ¬£-BWa(LG]›R®ÜâLwS²öHMùÁh4­¨æ–<9(û™LoTàT_ØìaCÝòŒÂãmKå >x!©Å]ú[Δg"¾éFu¶÷ö²EEY”ñÝjÜç–ž^¢rB6Ó*žŽÑU†‡ß¡=Á¶Ð¦P›tžÏUú‘6Qÿó§ £Þg|Mì5Ž Û] §~ Œ¤W"ÉOúnf”ò…0P ¿‘Í#$«(©Étx£7J…¿Nc³ì—[F‘ï ˆ@k ÆþŠz¥Z&¬S2,s U›™jÆX3$?ëLoðPœK£ÉO!3ÍDéÊYkȨ‰Ä.™£€”™rÚÌ^.¸“_bc>°Éôl,©];%–JN¼GŒ© SàØ€Ž™ã‹Æ"M É|‘v(ë$ ã8†HIöÍAå–c±JË»Jì„#†Ûf«Yfjí †;â2 šÒÓ2çA~wó×ÄP¸¯—fù«ÍüiiŒE'±±š^;ü.ÿ¢îžŸ1ò2Ü ³Ìpëz]”1‚í£$ÌeîÓoëåÜoìJzbNK:0Áu€p=dp­KmWþ¢ß&zàú_ôÛU³è­\½ 8ªçÅ:Õÿ¢§Z]¬ß!Ö­\à‹žŠtê—Ño'ôÕ{ht%XèÀVß@Ÿe²¸±pc寯Ý÷0hö€cœ4tÑÐ=zr˜í+‚_Ùxh1—ó† Ÿ†Sh8u |ƒP`‚iÜß…C0G¾!ðî,#×PŠ%õH½%×½KmRa¯6óÔ¦Îç ¨íûÌíµ…ÆÞO&Ø£ÊzܽÝp¿Ú›Jªä=‡’Ì€xÀ„{z†Ô–Œ†  Ø£¶–â,ê+†„¸¨¶4¿83sg'àˆüY4j)cuf‹…Ì1h<{Mú’Ã,ç}jïx(ƒÂŽ4ôysÆm»±ý°)Yêv¾AøsÛ«$Èö%`nm)µóZJ °GM°b–«4Xë+ÝG%!3!Kdñ(H"ï„ù X<õ8ìS§–Ñ+õGúH?%;ÀfÝEœ4Y¸¦Ô—ï›eW9éÖ·Kœ|‚Z'd¹Bž?¨~®P*ܾҽPÊÖ*ÛeÒ{R5Ûô„ŒôêʆA/K@yŸÚ°õQXHJŸ%É… ,ÄÅtâ"ŸpÒëVQhU-f.h±œ<“ €£ï„¹<š™€Š}°¨®”èÓÎ2¡¦+,Ø?òªPD_–Cày`Õ`¿OQKýlDÞoŠ^ÛÉȉÉc ¡ŸÉ’€c“ ÏÂs ä?I+NêŸ,§ýãü6ôÛËî‡ãwB¾×FúØÖÝ^[]?LñÚˆïÅ}àÊÓ^x¾ô8QÕéÈ¿æÕö ; „G'"ÙxŠßáu Âôòëuøí^;ö÷ƒ½äe¯}?̦éR^.§´âµsRø¼öœÔR`ݳ½öAX¶<âèÒ!XÖºXcLå 8¹rÊ![! OÙm*Ñ ®C0ƒLDÿmžƒàÔàW¥Ys¦;òhóyxA ÿ ï >!Ço+}–ï >öÁòTú9„tÖÿIP»´ˆGJP_:òf?X¼Ú~V­,†lѳ¹W°DÖÝeƒ0$“H½ZªZXc,Dðjâ¯ò‹&„5Å-‡ðÈA6IJBϱåÙæÎ§­—à×£ãTYne‹Õ§ Õ-»•¼ ¯¨SG«ë7‰»!K˜çÕ0‹–þð…lü,$ÿø…lú,$ßøBH6’úÿ'ùgø‹"y® í*I²bThK’©a= nâ`ýáR›AK5©u+jµæ /hŒ?L9•,]ëõ€%GÆìA(”ÅÅ›ð7Ez¾Êšy\7œÞnFÃÇ“ÙטK÷àmufµª5¸h1J *%΄ „e#e¢b•Øš}ÿRŒ=@lÙ©¿ŠD í…ó(%–)¿é-nS_Zn¤~uˆ‰ÍkÛOå·•kq›ØàZw3¹¡‹êLZö{­¢§²}ÀkÃ)¼C#£&ÏëjÉß?ru’ß"Ђ‹<òSX®Á‡²·» ?sêð‘à%@£þ +]€kRX2š{«jã‘*ÇíR&{f™ì,“Ý鉙ìce²2íè‰&ÅšNC¬¹B,®·B…îèAgÙဒï1UðÝ(kŽÊžT¨!ù¢ƒ«Óñ–“kô\K‡å¤PG¾^&\í¨2Óˌ׺œl‰‚á=¨‡ÁU.¤¥òº»4ž¤¾:ùž¢C`§L‚s€MƦ­Š4‹ÿЗ!Ïé*4Ÿ…Cj{šº.]êQºÀ|RÏñFÐë:9¯%í:`ğˆBP]¡>ðZJ…ZŽ&íœ+¸ÊripDK©©¤2vh¢åo2B?/”©/3Æ}E™Ô¥‘x ˜V³$9ë±”•<ÄÆeCŒÈÅkEœïÞ:B±e¬d6òàÒ=pA}yþ…Æ¡2&U.¿ m5[Ê}I>Ø­ç$à¢ßøJ}¹áþ\¡Iß¶x”oûmåê!j¼B³þ™ú Mr@OoÛ>¸Øïô:éú¾—$ËÚòƒÖtàG™øñšX>96~xý–¤¬iê·mœŸ–¬o©®å†\rm.ñ»¼®á¬¯#©—¯Ã«y] ø*ëÀëúZÊvþ¥©°”/cÈ~ÜŸ$”F'—Å_ß—ûÝ^÷0Þ1ŠXþãÒ¹23sÆ£“-è\å×½ú0žxøt¾‘‘|8loö0¼xøt®ÎLçúqè!RþoÎ0„FÓùfê$η’“œ½p BnÞíÀF¾VtÓðÛ)\¦²ãuPˆöQ>´Äak îÔð`Pý‡ÜýßO©{nƒœC°AC‹†ÖCàÑÐF‰Xø·¹ðwð3~î€Åð÷|æxø™šàøGø'žþ3sý óÿ«þ Þåá— ü;¯ü3ü'«þ/žþ7ÿÃÃÿ*pÁ>xþ‡.òð+\rÀš ’8Ì!eh"‹Ñ¬ …—­$¦lvhB;S^Ëe¿¼ËÃ/I-ª|žÄ•ä1,wÀ~¼Ž7VñÚjÖðt­‚ë°ÎóJE.Vb òÐzyÍGÀ*–ö>æ{—7ª™åýL]OAÄõ̲Xà;!¹™odj#[}S›x¸YÁÆQkÃÍü½Å†·Úð6n±a ëmØ`ÃFúܪ`Bq|"žÐFêÆCÑX(L„¢„²æhl°z(¾?<ÐW %âÕÝq-V‹` Ž"¬Hg‡úª·ãC-ÁÑQm 9OŸ‹†µæµ Á¾`\Cp¥kÔ—‰Ù1:ÖõwЄ%Y”7Å‚‘„ƬÊ@_Pò9âýCÚˆ>Éï F5¶C.É“‰X(2Ø”•óa"‰]Áð˜¦Ã'ùÖÍ¡H(q+ù "+ØÊ]æ†èÔõuRß²ŠÊ+âÎ#æNákÉoä-„ÑŠù˜ÚbZL`HZ¢6}»SXÜÖ·O럻¡«ëàO¶ G/ÃÏëLû‡ÉÜ®`_X£üGØ5{~û0œ$¥X_â¬A¸îj0*wQA¡«P_Ѽ/8¬SØ«e”k³¬\ƒð„€À‘úÛ³ ]xx²YY,â,#ßmyŽpcÅoîO–fiãÑamûíÆK˜ûN¡´ ¦DÇ5ÿÈhbBÞœåW‰j¾<ÒØ'•SÚF¼­Á:¬"-ÖÆãZ¡bŽ,ƒ­% j±ÕƼ6 ˆ!5®à6Z¥ê¦Õ…ÃÂ’˜'Ùt2i$«msXzL•»TxÞ&\ñUá£ð1îçá|\Á€ŠÛqhï®o4(جb ¶ªðSáÛpZ…OÀ'UlÃvRC— ð|'ëÊkèð×uù÷v6ló·Ð΃ðI„’†mu­Mþ½uÝ]ÛÚ:½u]6’÷‚À}ôN¦!숎%BM^};°S…Çàq»TìFroQ&³Š=¸KÅÛq·Š½¸GÁ¨x~PŽø!ƒð¨ OÀ¤‚}*ö〠§ìœïSZgãÃ;UxÛU8 _eÝŸWá%x–™=ÛU$fÂ#ñ‰¯òYò†²·swg—¿EÅ}8¬bGTŒ0uFµîË&² Ó,hžQq?’š8R°¦qŒ×«8Žw©x€¥MÀ7T¼ï¡r¢â‡Ùäƒx/ªÜa?Â_†gYÖ¨Š÷ÁÛ*ü)Æâ°‚Sñ~Þ;D<‚WñH±~T! 'Uø<Ì–<¤â§à ùù¾Å'†×–ÎO="ëb±à„̼×ጂ¨ðÜÃ2‡Ux‘„à§ÙŸŸáµÏ2¤Gñs*>†ŸWñ øEçÝ'pRÅ)¶ûKL}™ðI¦¾‚“Tޯܢ±%OQîÖ57³=OS®wú›ý ]Dt·7RþÑH+‚´vú;hKñßîoèæ%Kwg]}þ­þkƒ¿“¶»:MMþê/RÝûsrÏx`ÍÇœÐbÁD”˜‹³ôT£"³á$G_¡`S©Y|ù]–¤Ý5ûºÕf©j½Ê=TBq£?¡›ùq-Q70Š4†bÂJ~ :GµþÐܪ‹ËKåo—¸Ìk];×+éÝ€,™ñºŠ…¢+HÓ.Ïæêô×ÔRõÊ:ÌòŒ÷£„e8qnÑb±h¬ÚÏ#%”&¿Õ«¼ulŒÿ@¿6ª?^J(.ü+ ~¯|SÚîŠpXç—ý¹ý‰‡îÖĹ?2tȺÑw,¬¸æ>?÷ LÃm‘ð4Œ/¤G#[­Úþ±`8>ï!Ö¡3C>ÿ¸‰§?³å™Oñ¼ö“<Ø¥tEDç™÷éÎ_›Mo6/. Å·Ž…ÃuýýZ<¢\«×Ñ…6d9"2¶([fí¼†Ä½Zh,1é´Œßé.³Ê~UtÍüÓ"­k¥ªØ’Lß%®V†½U;ÀiŸ¹W(åÉBÙ,·jô[h@jAX ÆÚc¡ñPXä•\#†;´‰¹ÝEçþp 2Œ…ÈPbt†âÍѾ¸t˜¬E¡¸ü¥•¾¸ýš¯ÁÜÊ/úCÓè¸)Kò,0LÔ¨sÙ[€^î@3×|ë­ãü*’¬ÃÚ„( îy!ší”E­lŽö•k©˜r$ºO%o»ÞËÿNxcefèç4œBdýšëç5ëlL1½V2@Ò š,¯ÖoòhI‰ä*Ù°éýëÞm„¿µ®…Þú5 ”å¤/@-x(– D™hÝÚÖÑ"ºÞLÁ–¨,×%Ímõ™Û%DmÏ\6SiÚu¹ÈöB9„{À6î°‰Êá6_|ï_àf_|©™ßôïƒú÷!ñ-㾫é×ħiü Í^ I8â9è9 9»Oé$˜gI‹Ç{¬Ï °ž¥Èfræ&ÁžGÇSdKBîIPiS5Ÿ„¼Wþ®|ÁU@›Ip¦˜ ç0 ¦¢ÔnñœÝb±[ò¼0á³ð¨n@!}‘¾–~LlÛás©m§Ø0×1ý0ýÐwß+q<å{ J'Áí;¥IXTcõxÝÖ*·ÙeIBÙó¾ÁM‰i%¦Å“ Óâ$,©±ºÍ¾ª$,‚¢Bå{ns–%aùiXñ*Ó+'!—–ÓA³Ç›„ëL—BĪðÞãu)IX}Ö$amÍmKi[ç¶€ŠI°{ÜäÛÊC ¹tþyû 4ƒ²l)ðŲ‚Pðú÷(~lÑãºECd‘¾ÓF«Ðè{å0x©KY/ÁZ@‰Ç+æR¥Ç¼Ñ*ôüÀeÍ´eVwX.‚±ÔIJ‹i‘~‰éZÐ÷vÓ-K¥‰íÞ¥ÒÀVOÛhv›ß„Ü‚é*Jƒw’§‡«¤¿^ß$”ºÍçÀwªÄÖÓbëP{vD)Xf /Âj¦øRþXløàË:šç•óžýž¦Ú˽)ÕbêñQbÕXÜf±=áp,nó×xzÞkL“ð¾I±"ªÜä¶ê)($_U¥‡×ßÏÜ×»ÍFiV9'€3PÂÀg ˜?…¥nÚz¾¢ƒ?Oà9%Ÿ”à-G—Õ'|ú°Ïe•N­Q ¦ (ÊŸ ”®d©Üt™'¡ŒÞÀ©uã$”Ó9ÝBcq*MY¶2ÃÆCVŠÇþY{–‚í"8È I¥ I±Ííº%2*OÁÓºa+hnbp±ðŠ+å£KIîYgÜêéT‡õn— …®ûOÃÆWçôiÁ`!ÿÜt6QEn¾b À¤;ÖÒ(–бÈ%¦_ÈŠ°Ä¨ UE\ŽAQ”y5A!˜Ú)(.t”L'`s¶¢`ÚhsÙäe©õºlz` ­mt¸Ø‚i·]¶‹´Á ‡l‡×ÓdÔd•áÓïø-n{ÄaxÄÁµ…E|{Ö/k!w…¬-îyÇô€^¾ñ¼t³ ê4<£Çi3¹‹ËMyªÖ¸Ój »êVQZ~>«Æ93`Â÷(u€ÿŸÐ%5RÄÍô­¤B!%gÝv–3E…d ·µêÔ‘­õ=¢&üdžÄ’¸†¾ßÐ%nÑ%®I—¸xŽD× ¤ý4‹´rZøfªÄíÓ3ÒOg[(ˆôvOÂÍDlE8M­¦f—9¥gSœÜ[d^ZªX•™¹ôFz=0Ï€Eß½.ò<^€5üMùåÝŠžt+®›ç*³MúæGé¼+çóNB`®œïÌ")+Û½J„±\†ú[𬤇€ðý­¥[˜‹é( &¥ÛIp‹ïM^¡{¸ƒ+j¥O`*ä»É=¼Øl>šRæ“} )¹–ÑÊspLWr7ÙÊJú…lº9Ih™„ü‚g¼ú5’ßV*q’jÛ‡í³°i·—z™ö5$†R¿³G ‘“Žß±ªKîbMž‡ã©gTâØyí8|GgË™Z¹3\ì"sôíºg[ŽêýÌ 8©³xu–bÏièÚ¼„â°äh¡ë»Ö™mœ\¤ƒÉÔAÙíý8t{LIØuT/º§à´ÎR¦ËVuõ\RžéE8£s•è —MfXÑsM™±ZçÈcŒ“ ˜€Ùt4ÍðœÜ- î¥Ô‰zÒË'¨Ñ“ï×rÑ4á!ªè7dг‚iµIÈ{9%o‡.oƒ!o!o¹!Ï%å Á¶Ë ®bÁ¯À«ºàZÝEkø%º}Jô F[A—"ýÚÝ3{·ÌãÌ®¯eñ"Õç^Ãϯgõ³%ågäÿíuŽô¹X¿f7é1*-Ûlœeòµ{#kÂYfá;ð{iýן鳰‡~| Ù“„;^„"¤ŠàZ£R}1:…9ÖK³½IøPÏ‘K?¤SÁ¹§ÒN‰ö¯ºÊèþ¬G.ý8uX®öMB—É$ôK‘gïÀËÔ`2§ÖS5kk(¡H7©¬VäØå+ÿ,çœx+eØãzAI3lD†aÜ{ˆ—˜!JØÎtØoß5/w!ƒòô@šS / „ôØ_ îÄ¿oë ß"ßs¼T´Þ™{†vp]ñ Õ•ÀÅÝÓIÑ' ûŽó|8 áã0BôIˆÐÔ ¢1*‰³°·S9± ›êAQÜy[=LŽ™ jÜi3È»,u@1¨ çJƒ¼Ûé4È{œ[ òÃ…pÓFw÷uQ÷šàûpÜ¿PKæa½$PK7Aorg/hsqldb/rights/Right.class­X xב®§îé×=js!ĘËÑ8Â&Æab²,2 , Ë‚$Î 5bli$ÏŒlã\$!÷}œÃ±“CNÄ%“àØÎ‰sßwv³ÉnöHv³›ÍaLªÞ{ÝÓ#Dü}èwT½ª®WUï¯×züéÏ>W±•A¸ ´ >EͧƒÐÓ4:JÍ1jŽSs‚š“ÔÌPó5§¨ù ‡Ï±šÓÔ{gvÔq¶gÆÈ‡‘ÝéÛ2wfÚF3¹‘¶>ÜCn¤Ý¿¬ÿ-«ÚÝÁÛÍe‹h-«nf wŒ£±¿¹ý´Ývbã"ŒqpÄ)v¹K´¬ZpkÞbÚ]ØøØ\Qƒëš¾bfèöm™ ažOÖðäÄhvH¤–f°¸e^ d¶‘wÆÆïÄÕW—­ëÚçŒezö܆Õ¾ ‚ÀШ“ÁÍòl¡“âÃ`îD¦Eá†ñü¦R ÖTrÝErñ#<4Ž~Á\]x;èÿ¨ÜΖüøÄ„3¬¬`ðì–‹¼¦rLËw²ÃM’Ùú¤@÷Ŷ‚1v÷Nñl[ûÌmÛ½‹öZëjsýÛѲ먪Àj­¡LÎŨ† ûÜí­r¡‹Æ.nÙ8ö@ S§`Ñ:­jq¼i1E`fÞÒMzÂŽäÂöqÏ Ë[8¥RÇ\³8.)x3h©÷øÞQ'7R܇¾/Lî)¨µ‹Zº»+®Ž‘o»¤Ã;ö9C·Ë ¡#†¢»j E,‚cNN àH‡´UvÈ¬ØøÝ‘˜ýÙ|^Wð½²Rè*¥îÒy¯¢^G û hÿ¦Éâ¾ñ|¶¡—1h¬pãÚ‰•¿®Ä›ðó2† _¿êwªþfÕ¨þÕª+ˆèŸ§úç«þª¿UõXFD…EôâèŠ~¯àÇ©Ò`ßH€#æˆ5¢G¸Á~90ªcØŽãlTá ˜|XR; UGAþÆ`B­éÀ5UØ_ã­Iê'AK¶ÎöÕªçª7UoI… Ýs‡Rž^Hž€ª)ÅÎC¡;8­ØÅŠìj—= w*v«b‡‘mŸëÔA£p2-VÞ…-‡ªšwãt¿'ج¶Ywj‚ºtkrê[Ý7`– Ù«A£…ìV2ÿèG[E_ƒËC䙪£ÉÁFjøÀI´'œDp¡I'QœDiÃI '1šh8ÑoQöT'ú÷´ 9p–!5pj“§aØpR¸ @ÌhÀqDÉRÆ2F™ŒAb*™¨’áR†K^&CîãÄT21%cJSʘe2&Qˆ©dâJÆ’2–”±Êd,¢“dŽzáŠAȬ z«k}ÿ‘ùbx‰ŒIÕs0¦öÑ”ˆ…I±8*ã³L¦,ýô]è[|bøDñ‰`xP@#M¹ý0Rø¸#%âPO̰ Ɔ”ÆÕ2DÉj} šÔi@nJD¤™výbÒÎ$+"µžöˆÒQa#í†ÔQÚ#%í"v);¡Ý(i'VTjçžö¨ÒU&í\j*íÑ’v唈²ÐÎKÚ‰“ÚMO{Li©T í¦ÔSÚc%í"R"„v³¤Xq©Ýò´Ç•ö¸JÒnIíq¥=^Ò.2'%2Gh·JÚ­R"Å¡Á^Q]I4Í~ùR·€) dHš¤6;kð »)ÅpbácâÃñ10Ð.â½ÌC¼)Pz¥äaX)m‰ÌˆFºôq0)2 M%E¢Õ©,:¬H†$>—$î#™’dúH–$Y.IŸòüba€Y˜~89/WV¿aÜ%’I€>-Mo”¦‡¤éAr¹@æmÒ|;•,á“¡æ.öp5wqÅTs©^×·›õsÐÀáuuuH}%TFž]Àöû¤‘}J±ÜtØEHBãSpqQ€ÙGºHGí£Ç\4#¸öÑã.bá÷ѵÃ`·ºôy:¦e6Яg¯‚W«]¤qìWkèÅKîGLÌÀ’Ç`éz=×OÀ²X~/*Eꥵ 5väÂú4kç Š­|õ0x ¼VU«öÄßøƒ¸ø“"E¿GeThXƒŽÝIL| ø\Ï;DJ—€$ù#ÂOQ]WÈꘖåã~¾1-AÇÇç~>Ÿ–9äã›~¾9-¾oùùÖ4Ks9,²×ÔØXä_ u¸Uü.UAØŽŽÒURÜ«R‰5‡ ‘<+‚Jž¿lVÎÀ凤&bð#_xmPB!Fa0éƒ[é^‡&ÝK›DŽ&Db¤Î@¨õ T·¦f eö¡4@7u5àÍJËj´‚Ù$q$(c‚úDš§NÁª’<‹Z’~ËBÒWÚ˜Gú­ IG]i>ôÛ’Ž¹Òæ<Òo_H:îJ[óH¿ÃCß”BßhI&Ç4Ò5¿¿µZízZùNx— \îöÀ¥YœG\"åÁé‡ÖlV(­},º¶Ëƒt³:H»éõ› Ô#ðdJ܉CðÕpò´>êYW–õlÖå‰ïö¶÷Geä»=#%8/‘àÜ(áÈW^¤ë´ Í’C^9‘.9 \2ø†)æ†%V9£äàçBµµœ]€¨Â»7ýê¹NŒ«x&STù7Jì*å€ ³¢ô»¢4¢¢ô¥ßª(QQ:ëEÉ;_r{ßö¦ÊNÐ\ON•‘¹*;sý:U–çsÝ;_²,ƒF‘,fó¹R£ ÿ½WùoÏ–}“?ÂòšòwäÑÆDÉ;òFª‚/Æ|ŒJ &•L0*%ØFYrOC /W¬×㺌ѳÄÈðFÜ™ÞÈ¢‘¶6 Ü/Žë­±€ òmBïÁ"ü¯¥$~=„¬U"‰uÌE‡8vSÙOñRöKäçá:÷²ø“¢p¿Þ¯b8€1Õè,œ†Õè‰+·ÉX᫦eGSá53ðìT=›«ŽÈÏÉ3Фè­4E$]«ÈÔF©kæHBêWÊ(—Š ©us¤¸ZçJñr)äP*|­OJž Tµ¾LU£ÊrºÌF\Ü>g±%ûéØlа¹Nž¥KCìsæð†ý‹6à?¼W}îSHûMt1ƽÚFüÀ|Îz]䎼¯])rG\ØŒdܶµ<Æ«î£Û‚×c\ïǃH©¯cÚÚÞÁMÕ·]¨M[kÄq³ñ*àõcÅAƒ¥’n^ž€ëi#1#q?Õv¤ÂTý*šõ€ù4T3bçár÷³'ÀÄ´±ÏƒÍØê'Ä=ñï¯<ŽÑ´L‹j‘§`“Œ·˜rÊՔ˩©¦¦œZjjá´d ‡@]-þÐÀ‡Õ+ ; ŸïÖ®#wn×Öê1]zsMkLÞܼ>ŒÈ•FÌ@WÚ¡ØKâhWÇ£WÄ ôg;¨ãöGD"ëly5t UW /¹"¦£C­IR(ö BæW%óÀŸ† òU’ÃGØ_¡&x Ö,ïÓEc¥Ñ§ÕGѽ²ÆÀ!quE¦]™´*2·¨"“UÅåU\Þ:‹ß¦:ýå %þ¨° iñWµ#°ÅeFˆ‰©³Æ%D‰€ŸñË]BŒøår q"ø>xkÁÞ`òj“‹dÒÇàãj#'$bÀÛ$R,3?›µðš¾A=|Mß` ¼®oÐ_Û7ÈÃëûð«® aåÆ4:·ns¿<¶¸w…­îMŸûVu¸qv­š‰[>Þ­çÖº?×ÿÝ~ÙyHpø‡OÖÐÝ9å}§¿W8àê“ó8¬P»;ioTãq·ƒô1Ø~‚8 ?Ô$Jˆzc¡Ýšáö¾ãÐSo<ÔôžA÷ êÍžA#Ð3Èë¯ï4Cp ç8ìp¿ý¿ôIÆðnñ8|âPKÖ\KÙz†$PK7Aorg/hsqldb/rights/User.class¥VûsWþ–`vÁM$ÄG⫾CK«µ5mE …YbjZ[7°!èfÁÝÅGßï÷û]ûüâLD§i³3ý›œ¶ç. l©;™Ü{÷<îwÎwÎ=É_ÿú;€øÙ‹}8éÁ^¤¼´¤yŒ{áFFÀÛO±%+@b9öcRÀiSìû)¦<ãÅ4žöâœõâY<Çç<1ãAv©â%¿Y/Š˜cKIÀy&¹ @0/@c÷”T\  0¼0Qåq‰ÇeBE6ŒËe½ÀÁŸ:/_’#ª¬#’©—´â(‡µ%#UÎËjFS¯rà¦9ô–ŒÄSѵ†°§¤•Ì’¬Jù9e^æA"a̸¨ŽËó 1©iŠS F18ìM•õbdŽÔ…™HÃ*-krQÑ÷4¾ ·û»õq'«òpé¥âœiDŽë²f* ÓÑáÓܱrbê‘L9!-WròŒªXT\åñ<¡S:•â°>0܉>ÒOØ„ÅKEÅ0‰!£%ã°1°ÜošA÷;ù -à  ‡OóxƒP’NN9 Q<«#n°åœÑãʬ\UÍÆ->cÙÅÕÑË2èoËbjI­™4Ý’lb$¶ódi¶×5±ª®+Z'ƒ¡Žì­T‰X™Z+oÚÀ"Äa< âE¼D¥hw;VUtfGÚîX6Í%D¼ŒWØò*uǤ”ÈŠxÝð:ÔÆQIšÊdãdOOH9Cˆx#<ÞñÞ¦Š‰xïòxOÄûø@ćøˆšIÄÇø„ǧ">Ãç"¾@TÄ—Ìí+_ãß"ÊaM4•c˜ßa„C—”Èqà“ãÉ\2JltK±±D:ʾF¦©LŒIݹìd‚̤„$%3ãÔYÑÉÜX&›œŽæè›Ç÷"~À”ÿò'Á¨¢Yñ­ðø‰ÃîU4‡w{pÔní n©V ²©DU5kùPÒÖ[Ýr¥¢hô,žÅ2Q½’Ô[±ÿЮ-Ö#ªGÜc˜=OWÿÌr#,¿#µ4IÇQLŠ–·ÆÅá1­&J6Æ”‹UY5Úž{fæ<õíèðôÒ")º^Ö# ¶R¹•ú¾-\öôWòJÅ,•5Bè-¶±¾ëî£r§*È3²AÙmpÚÇm1™ôw3­§ßDÛìô–œ:º‚§GjsoŸ„¬äEµ˜-i…º¬Õm#Ûbuq€°— ÂÖµlÒJK»ÂM|SCnoëˆ:&MœKŠn²0{Íò©jÙT ”BŒu^›W;éoú>úïÁ ›5tâ0Œ µ‡¬ÝÅfí=ôK#äét]ô¬†Â7Á¹p…oƒÖÐuÝò~ˆV?¸Ð.‡x<ÌãKs#ö-%ºÝEûÙßà>s“fNÈß]ïÛQƒà÷Ði*dƒ‹ð.bmC5ò‹M³ž–™o¨nÛË”C–a ë öÑ&líík˜mC=Š#¶z/ÅÄróm½Oˆ»_*ºÞV^]à¼t| Û.m—AË<®Ñw Þ¾u¿Ü‚ÿ–¯îx‚zð1|\Æ'<(Â],á(/w3ó'e|ÊO{ÀX.~&—ô~Öƒ{ð9v,—T}Þ/0Ãywã^f¼5|‰i&Øœã2Rlò Vx’~™—ûeœb_ašxy…<Ä»Ó2¾ÊÚ¾æÁ×ñ Æ$OÉxăK9ßÄ£¼|‹õ=ÆËãL@T*¾Í$ßa³¿Ëf/¾Ïg?`u?ä×ñëc¼üXÆO²%“§`/:eüIÁŸñýø«‚¿áYÏáï þgeüSÁ¿ðo:nâÝtá:ÊNÚ¨Ý7i=IÿUð?!a)¼V±™í °y墂ý *¢’^ñœ)â^ÂâBEl!™¸AT)â"²·3ÇV3¦ó½­îëã˜:"MЏXTór •zc]G]}]¤‰¶»ê"‘ÎíΆM ×ÒÑö=m Í;Ûq)˾ŒC´¢nOÇŽ¦¶Žæ†:¾š‹±ŒÎ~¹6,£ñÏ eB3†£Ép»ùð-¬zò$ÀUU”åEУò¸zÞ÷scÖb_ð]w6j¶jo¯…Ð+—÷Q[¢Ë¬ÊÒÍŽ3£âËVý2`Þ×Á†êÂî¿ùF’>,ƒÔ,¬PgVœ–HÄá&^)ïšõ šÏÒ«ç€L* 4/yï[ØéáÇÆ÷Ó¦3kcÏRŠYŽæÍ™È1Ç(-¹Wk5uN‚Á4­t[-ʤ5ÁEqóè Ò5 w¾õ=°Á@Æ[ïçgÉCV^íÀ°5šûcñ„Ö`ÕÝ;‹Ù⬳ 4±4¤¨w,8".]ü–%i‡ÒõV› y “˜Ð$K7Zâ=jtg,Jóè²¾¬ÔŠÛ)Œ ‡%ŠØætkÎg˘V–Å¥’oÎgé¡/ŸÇ—˜~`X³<›òÙ*Ze¡ïºiÕ’ñÞF=aB$ȳ%Q&ë†]A¬»UÕc–ÂÝNj‰ØL¨ †‡(çZ]4ÚnzÂs/±+¡Ô£Z?ÏÊ<ÍYq /sfJGöÜÀÙ¢e˜ãÅ,*Jç”^æ]íܦ™ËçéÓc½ÖYöIµ|¡`’X¸àÐò×JÕæÀrè5æÍKevã½fÂêzuúŒäÙ³®Õn%C¿Ù*ÿf¾š³Öq¾mîLŽ‹³5€.ž‹Íz§”1bPÿå-žÐ ÕšøJ–˜}çƒdC†»u#b #’qsj E<ÐÅz±³Ï¤fu a‰[ž1iª¬÷Ž4j}ü“Ð4ÛŒ[„ØB¿Ô½ýˆÎá9’v9¯7Ÿ…4›¾’Öém#D ”Tœ€¨¦sŽŠSö€ó8\÷šœ‚g<›£8\ô¼¨bbk$¿TY–‚›\Á äú¥<ÕÎbç¬(,¸›ŽòNByÈ/›¢4Zs!^Â…2ú¨_Ѩ;`Ë®"ÙNz–KGPT ¥žBqûI¬x¨2TL’Ý÷ÎJq€¦EÁã°ÍßE–1Mp2§` Néo‚ÒðîsTF„#…Â6ì;"6}ylðÊ#p:ŽIÇf…¯€”GFdì—e;³õôPÌXO]ð$НX3Š¼Â‚£AvÒʪmeGøð®™Cžs%¬q*}“öÅ Ç4 Å4VÒ?E†Î㲪”Xz³´-èó§P: ·ÏßâØÆú&°zk‚eÞ¼Êj¤ J9ynÓc-“ø%Ê‹ooSXŸÂyiÅ.B/ûw K&ïréYœ‚Ë·¡¥Ò|´Ú~l$?ÚB“XšÀÚQÈÒ$GµD·›&á.–Fáe$ߪLashœ/\ °Ïa[›BydŸŒìsVFR¨`CSŽ¢€ÂÂÛJ.N3G!ú«q…¦°)ÃUÉrU®ð˾ ìk[ˆ<½ÀïšB.¥6§õBGµ\,û]µxý®b¹ê4)l©q‡üîªÆà¬qß&‹±3O0[šaˬ²­i¶‹kÜ~÷$ LÞê.C®Éüxhœ÷žÄS¸Èk¼²k¥”É«(ÀùB™ÆÅ„¥iTÉy¦áª C¼'ïÃô$Î$†íŒs™Ò(89èãvÄ!û:@äº-œÉÉdå!ÀNä\ÅB臗͵•xô,ÍÈdke+Ó%êf\”X@¼¯¶‘á! nº9…K©E\ÖJRjª%ZkkLS'‘Ï.§‚ª7CjE#ïŠå®0!D¨CE~[ WÖ¸9J%½^Õ9†"¿ÓOLu£ÈµŽÌH§2 ¼òl‚KÆkd¼VÆ-2rgÉ8ƒµpÏ^q§áKŠè¬ZxAæUÁb<Î…zèâux½Y¯.é>Ô[ÙZ7Ìö‹>»_\é¸bÍl0¶ònÍL,Rh°z…deЬWÓ{wHÒnË!ç§ÒE[ i9äéF²RÆŸ‡×Ðmx“­Óg#ÄU<Ž‚™>þæì÷›fîoÇ[ìû;í^|#gÚ6ú[2]¨žãšFÙüÒ9Î(ÜÅ·›d'&¨\MÍ 5HÍaGgF>WÃù )¾„»uäé™Ûòì­³–=MvKô|ÄÆ` 7øItB3½^Óò]›B‹w] ­¾6Úu†¬ýΙÓÎo×,Åî4Egˆ%¥ÐÎGlv„ͶúZÛÙ¤wdHßÞ3÷|‰‹† 9ÓœÏ[^Än:ê¡#=U܃nøÿPKIM¶ˆ9 CPK9Aorg/hsqldb/rowio/PKPK7A#org/hsqldb/rowio/RowInputBase.classV[wWþŽ5òÈö¸qœ8iTJSYŠQ[B!Í…DNÚ(ø’ÆnJâ4almÅÒŒ2%uií´\{¡…’r)„‹¶‹tQ;]´„ž€Wyd-þCa5|{tdËc§f-íoŸïì½ÏžsöÙ£¿¼ÿûkîÅ­Hã\+28¿®ŸR¾ˆŠ‰@æ«"ηàm^Äã">/â OЏ(â "¾(âK"¾,â+"žñUO‹xFÄ×D|]Ä7L|³I|+o >ÛÊåžíùV¼€ïH>/ŠáK¢}WÄ÷D¼œÀ÷M\2ñŠBóðÈ™£#£ *¯Ð>๕Àvƒãv±êÄäÅÌéBÑ9êUhrDÁ¨wè¶§à‚} ±Tßq²ÞÙxj<'Ãæ'=8KŸöÑÀžœ²ËcöD‘f&§GÃ0œç² ß±§ÆæË$Z=6锃ó0ñŽej4ð îŒÂæTßàYû¼-ÚîL¶ÆîÖîÃÕb1ŒwR³¶¯I zþLv¶r®85‘ ¸F%++í^7’®V²‹Å‚(t­Z/ïÎŒãÓ¬MÌôP§˜+Ì„.«\½•9v1ú ½*7¤ñ 3Y(‰Qö¿$]²ƒÙ,WÔôo sð<ÙÝÕY‡¤íÖ³+”h²óÆ ¬åéqÐìzꌰë&#°ªJe¦½žHH2aŸplÈsƒYÙWÿ¼lÃÞ›X£î†ÐëtÕÒu&=wj%î¾ÿ#n-†îöH0+§¿ú@G&Î:“Áîå¢pm^¡'µNäÚdÑÄy)jA½|‹Þ„Br=O™j<‘ÜMs+¦aÒ|ßfB;n¸ãë½LýÜm…þÔøM¸šøÑÿx—jï_q‚cÞi(GòÒPZØ1rÕéiÙq#Õ7ž#U™+”sóS*¿ÜG ®cáã¸ÏÂݸÇb¿îW舮dÁÁ¬…È™ø±…WÑoa-Âqy G𠃲p £Žâ! c¢=ŒãÁg- cÄ œ´pŸ³`cÂÂ$¦,Œã”…Ó8¥pk´×䪅â”ãKž;6ð]ón¹äìŠÓÛßká'ø©…ËØoágØoâç~_ZX4…~ßXxM†¯ËûYX î{ ^võü] óÅÂDö0UÙʰæv4½6ebF½‡Û"ñgkñ›X 1b§J/¡åâêJæ-´¾Æ(ÿ GŠÿ ߣþp­&U> 5–6T5¬§ÄG¥Œ´=óV%¢©1¡ÑÒþ·ÿNÜ ±ƒÈuÑMtˆ·ÿ$9ß ÿ’Cý•¸‡ø7â^ãÄ‹ÄSÄgˆÌA=O<­ÇgôxJ¯ËØêqZã ñ2qVcAãYsÚ®¨Ç%®FOcYã¹·€·Ó™%´ -à·Üa‹¸@l'¾J¼…ø2qñ91ì ò´(©<)J'•@”MTæDÙLeB”.*'è½…øñVbž¸•x€ØMÜ%†¢r7‰Ûˆ)â6bïFüù$O\Åí=Kè¥Ù‡ KøÈÛ¸ã;V ©[þ6…©Á¦„É'>¡fšÛV•ÖYnW­t/’3d;ÓlWå¢w²½l¿–¼ŒÖtòÝÄ"¶§{¤¥“'q{YÚ\dr´‰%;¶>±×/¾0&C#ÙÑÑ0Œ'; ÃædLÞlìpÝ«²*òÐÖöºíWt÷ty†µ¤»ˆÒj[¸9}²¡Ic¬2ÛàŠ±ú cüPK ZP¥MPK7A%org/hsqldb/rowio/RowInputBinary.classW \çÿÏîÀÀ8(‡¹5ê‚Û&–6A‰,J²Ĉڮ$­¬°ºìÝA%MÓ$5mš£GzÆ^Ö¶±mL‹V]ˆIz¤mzßé}_i“Þ—µš÷f¾]v™!jà7oæû¾ÿû¿÷¾ã}oŸ<ûð)—ᜊ îVqî-D+Þ¤’x3‹·pó­,îSñ6¼]Å;ðNx‹wsó~þ:À_ïañ^n¾OÁûU”ànPQ†ƒ<òA9TˆáÃ,>RˆpXÁGUTâc >®¢²8Ââ!ŸPðIµWpTÅ2Sð)ËÙÑVWQ‡ Nò;ÅþP0¡¢*ø´ŠUÌõV0Éð)0ìGó¨‚ÇT4áqŽù3ÜýYŸcñyO°¸—Å‹/°ø¢‚/)xRÁ—%xQSÂÒN#1JÞè $Œ½Q#°ÙØÛ=jŽŒšÁh\OŒ5KÈ_GÍ y¾Þ`Ý6 r›1‘°Üw~m†$"úÀ–±RñúêBÔ ûú##fÔˆ'|…Ú è1Ñø „ù¾ºÎ]ú=Ó・·YlÅ,’íŠzL½w—>²Eï‹E mHOHðç8f’åd€í7»2k–õa=‹ÆiJÊsì‡âfd0’ ؆‰¦p9´TJsT:i‡7GôØÌÖ£äpšq}¤?:Ì ÀyœÖÍ¡Y ¤_hù`}®×V§oVðÕôôG‡ µzvÎ~ÒX¯›z:ú&†+.’!iêÃ#‚¦(íˆÕI>s;Ñ]FÜâ©Mìá™X{6ÒZ…°Sn»;Öé7âÓ¼-/€×æÄÖ„w›C¼r×´»oW¤ß$ˆbï Ú‹}.´ö©tbqOzûÆŒ> 5nš<”½ÁÙ¡Ái¨åqk"¡“…†YÃïuF¢àkâdÐLÙW×Rðõé ¡Khôõ^­ØÁ13’EÝ|z³ºÛ|ò•Œ˜”W¸3Äù$Ï×Êä•Îhœ¶earwt„Y“6Š’Lá`Ä ŽîܹЄ0½†¤Ù½‰hóék“‘´RN‡†v\­à›^›5¬Ç ß·5|×jø.¾§áûxJÁ4ü?Rðc ?ÁO5ü ?×°Ý~_jøîÒðküFÃoñ; ¯ÆÍ´™rNx&ÉÌw;øìÆï5üOkø#®£#®áOxFóxFÁŸ5üOI¨˜õ<³þ_%,zþãʨ¿±¸Åßé¦8ÿÑ£í8+ˆg›™þ!aÙ6†þ“ÎÚA3b/” û®ÖðoüGBÕó6¦û¯$}ªBë] 2£NãŠgî cxƒ†M¸Ž¿nÒp†'ß^7º 7t·g®:öáÿÎâ6ôu+Ïíëx_ìÇîä]ôFÜ•uæV Å3—jî<Ï@èÉHîbåŽ[S½Sï'PYÚËPwÆI %Ž[„®'ÙÓbÑ&¡ö|e€HD=CF´SÈ”!¾>óûÄ1õp&ðŽð“B¹[4í7v›ßI˜Œ·(¶ni—°*“PÈõz¯ÌbIšF"ئÇF#›(8;I¤ >§úì¥'+” &¬HøBîŃª 6ÃÙÅþ*óu¸Ô ì’]"ð­ÞáZ9Tú:Ý2F³•‹8ñeÒ…„U>÷bÖºbN¦®àÅ—·lÞºœu)/(··vöÐh¹kz¥¸¹aW‹ù¾PÈòO¦ ¶q»Ãn/óuÌ~ÿÚYšP—ü`Ö>k§2‘öœjM„i§¦¥´C:Îw#çh;Ó”ö±ms:|¢ì`*Ü.[Ë2MD¿1·÷6ßPÖ…%T¨!¡_ô[e}Ó=Bòj•R¿‡Þùõþ¤£à?‰ñJ1>·Þ‚ÔûOÀ›ÆuàZe\ µ$zçÕŸ„|Äî¤G¦Î.zèöÀ¼ôOn0oMýq²|JÕ º&PØUææŽPÆ4”æM0hÔ5U È‡!{Xnm&YÏIë¤,=Ø’å°G8ê][ÍýWY™˜sïv™“ïå%8wK‹[g“쯮).ØW.ï¸oë~…ÿ¸:üyðžÁr¯=‰f·5ÇÇ[q›¸VV‹¨“ïXÀ¯ª“x{祋æÙMኣ¹Ù€nQ6‰°$‹¡fÃbJtWÎàÈøSÜʵ¯ãúJ¡yÆäêcÇÂU¥°æˆI¿ÌDˆÙ”k-J¦bÝm´8MR5îBtÕADuzfØ“^÷ŃçPK6}£ÏÁ—PK8A(org/hsqldb/rowio/RowInputBinary180.class•SëNAþ†n»t³\*E@ *.]@DDÊ}ÐD‘„¨?ºÖÕínÝ oàcø˜ 5’ø>‰Oa<³½@4n²ßÌ™sûfÎ9ß~ý` –†$úU\ÕЀkq´áz¸¡ÑÎÐ0ˆ´„!ÃQ„_䇆8nJý-©2UŒhhÁ¨„1 ·UŒ«¸ÃÐ,ìBq»‹öK¾ë †äÚk¾ÇÍ]á¸&Û^ŽÓ ±ÇsÄ,CÔx6?¸É ,ø9›¡1°ynÃ)ÐvÜXóƒ¼ùªôÖÍm›â h—Ì ÂéÁ3ÎÉc‘ N‘›ž¾óf7ø¶Ka´¥w;vQ8¾WR1QÍ@¶¤šúÏ %Á ÅZšÑðPG:ºOîºØy?p¸W»´4¹«£ULê˜Â=Ó˜Qq_Ç,è˜C†¡ëÜ«Iÿy XÔ±$M{þÎQÚ/KX‘°ÊÐÊ>ð÷ß|ìï[^qWÌ;F'GzÿaÄÐÞ‘Ö£úË2D YÄö3Ÿ“Þ\ •3«Z‚5ߡ~Y†ŽS~«´ÈòTš kÇ÷öì@¬;®ë”–¿P{O†Nã¬ÞÊÊ€‰¼-úA““]í'ÅU1ò,IV•,,O„$¬ß}*"}6e“fC—­´AMB’ƒÑO%ThO-@ØEÒDh´€Dz¨ –>FÃV‘OP>†ó¤àºÉ@š>EŒd`nèÑÖç0þŒX&}%õj† 1sŒøV* ­ð>)C?”2™5Õ~yÒ¹,§l˜T8õö"UM6\M–ú#G3åh©ä(£õ0¤y:F_=†$­~Q'L4&”zÈz´v¥ŒÄ¡¥Ù á çÆ/PKu' €©PK8A+org/hsqldb/rowio/RowInputBinaryDecode.class…RMOÛ@}‡˜˜å»…á³Pl²Ä•–C!K $@pÈiãjÙ®½”æ_‰‰GýQˆYƒ*.…þ}3ófvfwÿ>ÞÝX…c¡ŠUt㣆‹aT³OÆ0®£&j&& • ë¤*!Lì$Ù©÷=ÿÙn5½4Ìò(WÞF\cÙ×(ŽÔ:aÆ~Cר;G„òFÒ ÝY([›RIŠÝx¥:i˜{‡ŒkNcçLþ’^[ƧÞ^ó, ŸÖ{ dðcW¦‡²ÙæRÖÖï LU”ʼn)i =3˜˜Ãgy,˜ø"°[ „…WGfÉE”xûÉ…§çªÅ2ël†AÑèô;:ÂpÑ#ü½ºìçy4É äL=²+öÙÛ•æùÉI˜J:aì¿ÇÊÖK3õ}^ŽY~²*¿(a@OˬÄ\ —±­Q¶ Þ{Üå[»tÒ%P$ðpP‹¶QAY ÷ ¥ؼßÜ”×µƒW—öLjR»A娭]Ãp—naþ)* 2 e 1)³cxPKÿdñ`›jPK7A(org/hsqldb/rowio/RowInputInterface.classeMOÂ@†ßÕBü@Áï›§ö`šxåÖè¡„#Æ §¥lK éÖí"âOóàðG§ 1MÝËì<³óÎ;ûýóùà×6.l\2Ôc¡eΰë¸}›ÒQò!L0ì)Á§ÏëŒ@óá=™NdšÛ¸¢¼(´JÒ˜¡ë¸ƒ9ãÞ‚§±·¡½m»¿Ö=Ÿ¡ašfRiCF4± Aª·²3×{®9í3H{³üu1xš¼ä^á¨çŽK#‡“¹õfd.ô“\1Ôœ~à¾ÐPZÊ_F‘P –ãŽÉÇMIRÉU"=êÒl©ÉŠPÉr»*ÏÐ1ˆžÿï¨30ì 8-‹Ö‚P¬¡n¢M‘lQÕ¢Ø ÒD«BöqP!‡8ªö?cs+“t*¤‹Ó 9ÃyaõPK_Ä6. PK7A#org/hsqldb/rowio/RowInputText.classµXx[Õþ¯Ö“ägã%qg@–e”„‰3 Š‘³lN ðl=ÛJdÉHrPºèÞ…ŽÐ–B›6mqZ'Ä–Á@hKK¡{ÓÝÒEÝ“è9OW²d=G ß×ïó;÷Ý{ÏùϺ÷¼#?ùƒX)¶»q-&]¸¹ñ0á·“ uÃŽÏðä³N|ÎåxŒ'Ÿç·/0yœ§_dò“'™|‰É—™|…ÉW™|É×™|ƒÉ7™|‹É·™|‡ÉwÝøžbÐï3ù‚*ø‘‚»±?qc~ªàgÌôs7–ái7Éü‚É/™üй~íÄo˜á~‹ßñòï™üAÁ³ ù4»öG&rãÏø ¿ýÕ¿áï þáÆ¥Ì`Ç?™ü‹É¿ü‡ÇçüWÁ)'žg”\xQ€‰ Maq «°)ÂΣÃ͘äeEN7Ú…Kn7ÂÂåc¡2©dRÅä&ÕLj˜Ô2©SÄ,Ex1[ÀÙÕc‘N}H 6¼GÛ§bZ¼?ЙNFãýkû´¤±ëŽ%âý¹IEN*¬ÇDˆÌÍnóÊ)Vcžçn‹Gˆ{WžÛ˜ps%­Hr6~£!ëv…¦qcÕ¥ÅbÛ‡iER½Z<®'f…ÉþÀ@ê¦X¤'Й]%/<ƒÚm‰DLd#øþôy·.¦7´xK?“•];É¢M‰XÙ™Öz÷vhC]ZOLçãY²3¥§;ÃÉ^â˜c¢¥=ÄÎ~=½9ëŸ×„)´«±t‘Î/¥¥í@¯>”Ž&â)š$uMzH¡ðšÈ•̳“Â-Ùjx¦¬¹ œD’âlõ6vR„y%ÏÎ)ÝΜ”±Ð.ºéòuËp,fìí’ ›4ÊO“·0AiâOXj­©­ªaÇ e:ʪ=E‘5z¿‘Ý iOe‚Ñ~C¤¶H„ ^+íÙ¡k±éAjM Særˆ­zot™eŒÔÒÒ(rº¢ƒU3 —®“D«–ÖrôNkÎ!•Ö‡$LeÎc‘BÈón]Kv$âéŽYr»¸þ,tä¤ ©Ç“5÷`§Þ›ˆG¦p7¼Ü,†6Žb¯îôü‹Z|­"æH¶­é£±míÙ£÷¦‰k®<ÅÁ(‹E^‚Ѹ–<(ËcÄ+¹Kô4˜IòVaâ‚3³§X £7&“iðϨݥÎP^©^„©,nìaŸ+R{£CCz$l”JºvTSìIjOî®.f LëT,lÞßd!‡ûúÅæmÜ4HpGb?axe}’ÇQ;Ã+œ7´Ù»û¬SÈœÎèÍd«ƒÞ¶%R*¢^ÅÜ ˆyª˜W«ˆãºÚ¥•žxqTE ƒô™q«bhPу^U,$1±H,V¡)t&{™ìÂn×1¹žÉËpƒŠ™hDÄ~ëç>ž.çªàµ(›³Lç‰óUq𪢷 ÔMy”¯ËÕÓý¤ª[RÇØOŸ*š¦`¢‰@hkF~ÑÌLªØ*^Å‘¸·ª" –S­¤|…âCÃé.ú<ªb…X©ˆ‹T±Š­}9qá6F®ž^eUq±¸D—ŠÕŠX£Š±VëÄzElPÅeârºMf%NEP›D«*ÚD+õo3çZ›ÅKË—sÏ .ÐIíÚqu›*® týUÆCÏoŒ³|ÍÆè9FÖ $‰Î…õE¬†]AJA:ûGŸªúzÚÆ>éÑX š -³Yˉ=×·x õY»O`žíÆ1Ìãé|V¡¢f„E0B ­=%Zl¾°\bg‘ù,2¿áVó=sïEÕ‚»á®ÏL`ÁIZ™Ódx]íãÝÒuÞܶ±ï±£aÌ·XîA…ÁIsWÃ%õov‰bFFzËRo©·ca‹‡Š»à `E‹Ýþ0w['±¤›dæg°´³ÛVOªÎílqLbYwu£µÞ1ó28ÿd½m”ÂeÅaÁ"^œÏ£™c:ÇÑPõ|A›q³eôP‡– Œ5PîHY5=uô¸ÇqÁ¨É)! 7lfB5ôÌ¢§ÒTè6s¡Zz<ôT™ ¼¯”Bµ4c!‡oÞ;FJ8©ß”œkhf¡q!q6†›‡Ý:B\n2¢Ë³ øFò‡ÐË)TP”*‹_ƒÛ% ‡FVíªÁµ$ë?Y¢ýµyíUÒN‹uº6¼¯—Gz:— oÀ%Â-”E+׉ަh¾÷WÒc5,–‚›9ÀGO„Gö³ãå,ƒ itÒèð“ßb”o×vê$–wû3X1êŸÀÊѼ÷•pœ‚—¯žb³×™û&¼Yš´N†tI>¤b´0¤4£Nà¢)\Ó¨Úð–ÿæ[ñ¶<¦¥<æª \\óíxÇŒÇÉó’²€ïÄ»$àz™ß¥FÞòyZØáÏNâRNÕê² wàÎ<¨¥ (…&kÊ‚¾ï9[Ж² ï={еeA߇C´UÆ´ñô MbÝ8Ö?Š e±ïÂû_"öee±?€Jì°<°þ™WíåãØx®ãã86MÁWÁ&᫨²ß]¤ãC¸'¯ÃfØ_¨ƒ-&­~1Ž6×òØmî&Ÿ®ÈàÊBÒ…S˜¥àÞ"ÆG¤Žå2©³Ku„:üShNˆ,ZÎá3Ái-óQ|Lâif£ñ‚Ó‚“hï^œÁUe3v?[ä0#w”Eþ>)¿ y¦}fî£K–¥F~6¸‡˜7"·GpTnÏ¡ØñvÅT/tL2}*Ïä—L‹}µ[¸‘²råÊwQÜ;1ÉJVoäÿH×§´g°uÚ·šGq,ÿ­ÎzâðQÓ²m¤„ó8î/q(ƒí£Rã ŒI :lÅ·¨!ƒÇJÆ‘)ÑÙ”Ag©uã˜0ãì*å|À$Ü\="­{ú‚ܶ%¿½ó¨ƒÿPK‰JQƒ, RPK7A&org/hsqldb/rowio/RowInputTextLog.classY xSÇž±Ž'ËÏÆ6æ6B„l"H–m@D¶Á2CBòl?ÛY2’Ì•ƒœä¾OC›’^4-iÛ I mÓ½rßiÓôJïôÎA’Îì[I~–S¾Ý·³3ÿ?;»;;‚ç>{ô 8w9á x;¶Ã;ÜüB_:Á ïòàW ¼çÅüš›ßðð·üõ;þú=7ï;àN(ƒ?:àOø³þ‿:Iåo<û+ÿ¿þÁÍ?ø—ÆÂ¿øÏü—?Tà#|ì„Oàh.| Ÿ±ðsˆ æZx`UЦ Ý TœèÀ\:˜Gب²8ßþù þØ'?¶§>>4>ˆ œP‰#,t„…›"'ºp$7ÅN,ÁQÜ”*8Ú >Ãc8Çs#&(8ÑfZÞwÂR,c¥INœŒ§pSÌͧ²“§:a9Nc­ÓXË­àtî= –+XáÀB<=Ö¡×3¹Ÿ¥à¬r&7³ô¡Iê4$:E2餲„bœ :eî,Ô¾PD‹m•”ò ±$y|ÃÑ„ Ù,yjð–ùŽ­êK« «b1*Ž¢µ™+¡,ž¼¡ç„ø†P·okBs²òsrÉ¥´áëioçhXÝÓ×ú„e°ÆèfÊ¥îe~NWÉó¥ óZ¦"9ýö$ü¥Ès m#_íôµ<WávlTá¸V…p-¸tB^Ó;¢±IffR†;T¸n£ëœù¼¨p\­ÂMp³ŠA¸G…ëàz›ÈWÂ.¢ô×k›T\…«iTS¨m¢ëm¯n¨«ó7QŠ ÖRkV/­­«RáA6<žRá¸QÅfèUéIYK.f¬ØÈ½¼n/À FRYJ]*Ÿªp ¹_„;èEšçèå^§âEx±‚šŠ-تÂð%„¢Œd§b¶Ò‹fNi*êØ®bOgKG&VÃm;á!C*®Ç *†Ù½*vaDÅ(v«¸I)Ž “±‘!UìÁv7ñüf·0ÒV·á%*^Š—!Œ9f^ã­¿\Åíx…‚W²ýU*^Í&ŸÈØî¯Å ^Çv´É7@/ݳ ;N™lkìÌ|n›àoÅÙl’‰Ç°¹ oG8åÄYaÊ0RÝÁ¦Æ•µ*ÞÁ±wÒ\\’d&Š2šŠwÁ^ïæóR–Á°ŒÔ»e gžÌt.SñxYÅ{)S/™¹ü5YQR³*ÞÇWÀZ¿2 ç««šé¸hü «pÈ8ö"©Bq:9|+°B…×àuïÇÕ*öòžM*îÄ Uxv©ð¼¨ÂKä5¼¯²é*¼I×Þ‚‡& "ŒE7‡¢^ÊiþHwO¢Iß’D;Ì»kVñiqݼ±æy±wí×x#…‹4çoH]cNk}œ:m"›R åÊ·žˆœ›¼Ðv}cŽ©e>)¯2*ZQF7è£xÊ£!ÝÉöˆˆLK$½CÓ²‘dËãAé±X4æ­å–묞H‚nŒÎrû³¸ƒDR=~ý³ºIÐÁ‹‚uU€¿žòì„Ìå¤Ó(—r¬NšµKj)™Ñ¢Úžâ#kw³ÚôZõ8ÿ©½«f4œLåó/~å†)Ê;ñ>ÍJ#›Ôk‘(í¦N×ÉE‘¤¯‹cZk2yùEuh§úODQ•Q”Œy4L—íµYø]°»X,4r¡¿ƒ<Ò«E™µ„7r©øÙ8†?GÌ`^Jt®è‰rŒy±²Úe¨%2t\­ÑpXËæ”/wkmôÙ…¨’ˆŠg &Ãv¸®—’âŸo¨2ýÙSM)zª EOÕ¦èo‘=§ÔN'ªU©½“F³ÁB_nå1G? B7Ï!°6÷ƒí ØéS¡OÇAÈÝ/á.‰0r¨Ÿ1LϸƒàLÂÜ ÷H˜wÄBýÏ#[ÞyëAPyÐùFWPWáÑ…½Pî±Ì÷H%f7${ §ÂU$ ¦zlÇ3ØçU¸\B3Ï£æ˜_á)³¤º«Xê é¸ ‹§Ú/Öu/µy`= u Ü7½p‰î‡^¹Ô"ê9æ6²U÷ÊHì„]Y¦söÉé/d¶ÓV.ÚåôŠ#O—zú Äì䨃Pº_Pé. ¶QØ­Ô76Ýè"KánP¬{ÀjY0¾œ™p$/‡cŽÀXú*íÚàR²©ßO s¡–Ãx’°_„G! sØÍ~<˜r|¾tüT™°&¥]Qm»¡È¼wé(ÓñJŸ_¦øäœÑ2>*­g";tÊŒ0}E¬á«ô÷kðu©_"ys‹àYפ˜|8Cymݰ•¿ _ù›)äévŽeï-+| öÊ Õ²ÂÃðíA Ï9Á­ðØ'õÇI÷FxÀ)}0Å0™ši²?e²@È8[€S¥É“0­\,@cûO£í„•Ú¦I&Ðð] Z'SÐÙ„á– Oƒ ÷èÓ &’àG`Ú>–Y>i+äŽ6‘<%É4âS¾‹Hf !ÉuÞÞ^Øf:c£å‚c¦ß]pßN¨O‘ÎACg1ÌòïsÓÒb8ÓŸEòÓÒòCz6I‹ŠJž€y‡eçqÀüT°*Ó )¥ðSX¨@Ÿ¥´ÄnÿÓªúa@®j>…Î"îLùà5•Ë`s¦×•cE, /Óf˜¿JDlÀÿ;ÐXuV›¶5ß„wžJÙm} ó¨Õ‰£VáÚ ÎU¸Âô¹“CcdØ¡åc—iúD¨(Ös©9Á2Ç*Þ‚nñØ÷€·ÄúŒ²$„JîÄæÛfŒ±õA|õ5VÜóù3 AÐÃ’xzæ[gŒ±öÁ¦Õc¬éeŽå(¸ùpOüF(ðs,(ýF¦W^XÅÿ²$Wž.òúaó™_€¥¢K^D»g\?lÙ›¡ù¼œQ7öÃVIÓ¯À«h¤| OÙ„~ض?é5x=ƒ³¼.Éôî5x#›æ¥™šof©‰ûá²½Ò»·¨”JN礦/XàÀÿPK:á|” PK7A)org/hsqldb/rowio/RowInputTextQuoted.classTßsW=v¹°YD’`BÕ¤µ ˜R­Å–Xk$`גЄ$J|H7aƒXf—¥¦/þ }k_êô…™>Ù fªï¾ô/èÒiü.Ä„$ŒS˜½?Ξ{îw¿óÝ}õߟ/\Áª‚¤Dó¡‚˸À0>ÍU},FiŽk üøDL>¬Œ˜N‹æ:Çg78>WÄM'4£à² ˜åÈqäÔùââÜLa-¯ç ³ Lg8‘µ­¦kXîŠQo™^  'çs¹ÙµÜüìÚÂrq)'PÆ0”/.÷Cù‘kn¹ žûYßõšUso0d´ÂCã[#U7¬jªä:5«:ýÕø ƒ”µ+&C iº%»ålÐxd€Þ]ýUÓÍ×Ìz…A@ÒWãÇA:sÉ56¾™3KÆzÝä¸ÝÍÏ5Ê"ƒ’ÛÚ0n²¢b“*ÞÃE¢¨øºŠó¸ â¢*Þ‡¦âKD†nq«µ¹i:byAÅæUñ•Š,ª(a‰!|°b;†àZ\hnP^Cn¹fµ§ºüF¡f§ôâ¾ÇŠŠ»¸'(e†IÛ©¦4Õ+ë)Ç~LÜEû±n5Zîy¶Ð²]“Ò{+ëPP½ÃQ¸vöáÌ8Žñù¥Å…ù’ե˛=7¼Z×Ë^uœd¯Ys«¸Iùä\œjÓg4¦EjcZö¸‘½,“’ߵ߄vFh¸¤u«e¸ï¬¦ãØN*'Z2ÊhÎl6*U[\Óõû…£^LŽ =¾‚ tGGè†H8‹QDéF÷cÔ÷ÍcÔ¿Ó7?GU½„QõQû.͆!ÓPÉKS©ö;z7•ŠsÛã„Éó‚âI$·á}©G•DÁ’¨™šÂ]ƒé«¼PK``“³TPK7A$org/hsqldb/rowio/RowOutputBase.classWi|Gÿ-{$yíœv*§ML¨|ÅI .Ó4‘í6*NœØ!& kicm¼Z)Ò*ŽK ¥„–£”r7”³(Є¦ri WJ[®r´ýľñ…o5ïíŽ|Êvü³çÿæÍ›7oÞ¼ùïø¥7ž¿`+^ãV<ÂÛñA–Îpó¡0ÄCaÒ}8Œà£ãÎÃaññÁ'¸û(7ŸäæSÜ|:„Ï೟ãÎç%c<Ë͸y\⋌_’ø2ãW$¾Êø5‰'¿.ñ$ã7¸ù¦„Ëø-‰o3~Gâ)ÆïJ|ñûO3ž“8Ïø‰g/pó¬D1Œ-x ˆ ÆçÂØYz>Œ‹ø‘Ä%.I\¨ëÞÕ½»·çØ@ÿ¡c[:7 ˆ¸@mwÆÎ;ºíÔ­‚QIYÂË[6³VhùQ3;8žwŒth$2vrÚóí‹xöm—rö\÷;)>ûeÜÝE'Ñ?|ÂHx—¡kúÅLª¦23b¦­çƧ¬KÅÊ©‚¶2Ãå3Ï#×vz±}Ä®Á‡¿ï]¹œNAµG‡fTœ¿Û¥ðÉ¡uV™±®¡Efî‹Æ^"ËîØ­çS{ôlÖHö™y§kÈc¥ÚAGOŒ’ú€N7RâŠÄO<šý©ÄÏ$~îGù%ç¯È—NÁÉ"CO³ƒæy¡WœiÝEéI²–™ð®éM³§æ2cf†³äOñjõ¸ž0º4t£GÃ.ÄXºƒ›;%~¡á*^ÐG6£á—xQ`Í Ý«¶)#­kèg/á׿Õð;¼¢aöòìû4 `¿†}ØOÙÑð{l'¢žË¦q`–Þ§I ïÄA ‡¸9Œƒ³,|ÔpôýY]Žø4 áÝ+æQš†£¸[`Ýâ4¦áÞ#Y£4èÖ`« KóŒ†$è\n¼ÞÐpô¡[¿'hHÁ,aéjÈ [Π{Ê âýUe®€†“ fZ»Ëh°0ªáF©6æži¬`ZIæ¶åSEÓóFS{“†?àþ„W5¼†W%þ¬á/øëì™S¯¶eo¬Àu чÀ ‹²…@Å=°êf“•€¤Ûî3Y}´¹ÌÐcŠ,x4Þ\n”çïÕùCä<ø¢·m#×méù¼‘ŸG%»=º­Ó›cc©ß%ñ·Ù)[È’X.½ü [-¾rþÛˆ"âüøÀjN¿ùÚË=Ûæ©TÙZµ¿Ò³out¾µ·T¦dÑ0cF.—ÉuôrKYÉl‡n­ên‰Æe@™ŸNYÇÌØ´LãÂÉ 4ÑûûVz.oC%"èÂv’o£·rvPÿöý0Ó’¼tD¼ÔöR¯Æa¸e¢¥òYTœ‡ÿ'JV6kȦ‚°¦eí*çÝ9Ϩui£€ÀnZ1NïRøôyHŒÍ†ÌåÊY­çœþ|fqk{H,íá!…‡7{H<ì!Ñ®‡D¬z˜P}"H‰ý<$zóÆCK!‘–‡ÄnSy¡æá¨ÐQ þw¥®¥íR[kUBQ]Ê}Õ”Ýe²âmŽEª®¢6Rué,dÀE ²³º¾ú,B¤¡ÞÚNYÙ¬ÖË'ÐÏúšHU}p“ j;Cíõ¡­ÛÂmÜÖDW±>¨!¯ ¸Mk)"ÔÑŠ_@MZK¤&.¢öLP¸“çÎ{ᜢ¶¡e;Å¡‰âtbÕ.ñ6 ‰1‰Ó“dPbœº÷H´I¼Wâ^!Ôfîó7Sq/m†6]±¯íZ”v]wžÛe­°ü)Ò¯'ûèäää¿iÚaø¹ˆûg,ú¼ú„8CX©0@˜ ¬RöÕ„ã„RaP¡¦æ×‘‹Õ„Ë.'ý£„B:0¬#ü;Ç@øOïÿpŠ…î*B„·)"ýã„T4Â%úV½,ó/uÛ]trwS.Z•¸ÙEÓ ¼x[ŽL`ëÊ·ñ6²½™ ˆÎçpËåé*mDCø?bEM˜~jÂ5üCm]8|=Y¼ïW×ªŽ«³¢åœbŸûñÏ˯˜åÁoð2"ÿPKüj|QÉ’PK7A&org/hsqldb/rowio/RowOutputBinary.classW `[eþþä&7Mﺶ[ºemöä‘&… ´PX» 2»n´eƒm°Ý6—6[šÛ%éÆP±¢ˆ Sœ`Q&2ÝÒ2Pd*‚|á T@PæÇ£žsïŸ4iÓ–>ι÷üß^ÿùÿÿÜ£o?xÀ2q²«ð©œ‹O3Ù˯Ÿá§Ïz‰ÜίŸã×Ï{p‡wâ ,ÞÇä‹^œŽ»¼¸_â×a/îÁ—™|Å‹{±ŸÉWyà>&_óâ~`òu~ý†qˆIÆ‹Œxqxñ âÑozñ0Žxñõâ[ø6“ÇJð|—Ÿçǘ<^‚'ð=/ždÜ“,kÄQ/–ãûL޲ª”â‡xª?ÂS^Rð4Ëžaòc&?QñSàg*žUñsžõ ¿Tñ+Võkþ9&¿aò[&¿Sñ{žù~yžÉ3L^PñG²H{×Öήu«¶vF6­­f"•Öé z|ÐpRÒÒTÚLê½Fgì CÀ•êÑãÄ•~=µCÀ}V,K7“<‰Ôn y«eXps ¿j»“±´I¤Wêi t¦õžkõ.½›µ”XÃöX8Øf&{ëûR;ãÑîúswÓæ|AzÏ€‘ªï"ÚÄŠ=ÖÌU‰¨€3È[•í¤ŒŒ‰x Ea§“±D¯€/ض]ߥ×ÇõDo½-´´ª½FÚV1k‚7µ” 2ÏO[b¹¥}üGmsó‚SønûÕ>gŸ[ûô¤@]¯¦P3é_Çc‰ô¸ Úû»dSÁ½F2›‰–X¯5ɶßaèñq Všƒ´Dy V=±~†*aýzº¯žôÈ©\µ5´˜fÜÐUù†¤”pT¯Öߟò ƒrÙX,—±~ƒ*µ€kg*˲.pÆ$ЦÓQ–Óa™$ÿ-Áņž\k&Ò}œÚä.NMs ÙQ :©*÷žN£ÇLDÇ4Ÿ3…f;j¯¥z]º‹à„"êÖÐ’¬ëÞnôX›5o—µÄ¨P™ÑKèÉ=9t¶²X˜«ì¸Ù]<ó<òÎV¯eR-ï@‡÷ŠdR'§–7畞íT“鋌•@Ëžœ¢²Ü¾•B¶æfБP_ÌRdÒ#-2nûOãZDÅŸU¼HщÔ`Òè0Í~²4Roêèà@<Öcíž“ƒµùJ’æî˜ÉçÙºÁôÀ`Ú*¡Ëô£I`&n¶”ÎCïg æÆcÝõçÓc. ùè&+€âîNŒ‹3µ>8i:¦Y$Ë=ÕGÉ€m‹¥ÒM¼LÖâ" ïÁyÚ˜¬Åz /ñÓË<Љ. kp…šK€]­*þ¢á¼ªá¯ ü“×pLÅß5üÿÔpÚUüKÿñ ÿÅë*þ§á8ÞÐð&ŽiØ‚jØ„Í*ÞÒð6KFéÐB8TáÔ„"\šp •};¦ &J„W¥šÐÄ ×b=zš(3UQ®‰ ºˆD%qR$f±/jb6…!|<½JsÄ\Uø51¦‹jQC~‹€*ækbÏ]¨‰Eb1|+,a?&P>þvÑÄ âDÙÅŽsê)ö;¥GÔÐ-Yd¡Ls´hâ$Nќ困‰õ´žN™ÉKÕ6΋ڮá|’ûM`þ3ôm€Š WMA&l·èò+Z‰´§zÌA¾(=Ù[”é<¨‘LšÉúULiÅ“¥kB¾žŒi3òD~y1Ž™ ÊË2“=µ:ûÌ$tÇDoºÏju"…!óV°5Sï¶ËH¦ùt/OY’.ó®ռYSÖý1eo1õÞ¶zœÂ~Èn–ìÖͬ-ZBÈNonáQbIy}5»˜ÜîµZÍø`‚"Å=Uídç…@¥tÆžÑj¯Yùø~ˆ\ŠÉî–Nɸ™è•Ï”Ø5Ùë¦ÍäQ ®áCª||GD×\Ôz›¹’`¶¬ËäÉt_¦XÁJÖ9~±,}¼:÷¤Ò²3VO• O™¤½ª-Ë~®iüöëóÒfÞ}¥PòZ¨B»í-0æü¦B‹´WTŒÜöZMÅ埴‡²¼]O˜óð˜ý1À…²ÉLÐÓâé»#Úƒ +‚²·ä4=¶YYç%ݱt›Ü-…-K§‘JÑ»ñxuTúN±?\&†•mPÈ#Ò‰ôä0•=fŒšFÅO‘]!¿+ƒù¡@žýHÈyÒÇ Ö¾`/TeJ6#öRµ©0GyªP±“¹I'/’Håâ̲0ÏÅ4%d¹Ìèb†,ÊØ™]L¼î –”_z'U( NnÚ¶‹HÉ®œåÒÎâ¬æ'f•l•JN*¦d7.ŸèìAœœçì\!! ±ò”vjóRø^¼¯Ø2‡(ÕYÈûq¥„œÈû’¸?„¯“Á×9™É`ivÊrS ´Öåi½ ÌílÛG ùœ"ÈÕøP1P}h×HÐÙôÆgÚb2têÚP˜\r;›á#û(uáÀ² NrŠáÑׯ²ZÇ›˜!ŽÓi&HÕ‡¥ª³¤½ERËÙ5¬ÅgíÂP¸æ’ 9HÓ+ã4yHÓ\›;™«eÒfÚšBagx,U×á#S—e[p}Þ¹Ë@U ñôåúÆ‘€Õt*©¼›œ гÁåsÕì£ås-ktû”ß½”Gð®m Ê‹bxÞ§ìÏEá…ã-¸…±ŒÐg‰­Óq3yç!¾Zi?AWÄ~®Ô{-ÓŽz"ÁÑÑÑã¤d+lwÚ,ì9+vZlsZ#awI<íx±ƒ’Ü#¹&ç—š3#y9ñ¸%n>ñØÉ—ÙZDˆ‡­º°ùfâ·ßB|/ñKˆßMüRâw'_‡•vÉGÁé¿Lò^â#Äû$I¾]ò—ïý’'$7%|§Í•”¢êa¼:äTáGqúaœ±­yÏ 9Ãx–¤ÃxzÈéÆQ¢hàC‘ÏFW€ÅÀFßÇ•{,Ü>‹Þ>äÔ†q›Eor–ãzK>dI®dk×¶å´—ß­_G*vL]dÍè ŸInks9TŸêwÓž¨ PEùÔeu\QÍC*ÔKÃXHðÆF7+ô»3hbswÿ#±z;sy×¼!Ö9fº\®j—ü©¬tR¥{¬£ú\g=Žy¯Ã1ËC n,vóà¬ìž¹)׊TÉVÄ]üÔBŒaŠ´#hZ?DÖ9 ›ñ‰¼­ÌÖf>„s/®ÀU|Ç`ÅýŒ+_ÁÇXa]äVKv¸·í°Zä·ånU·u_j¡êº¥~ÅïÁJÛüPK„zÔ`b –PK8A)org/hsqldb/rowio/RowOutputBinary180.class…SÿNAþ¶?¸ö<k±Åb¥R´´ÅEJA ‰–M„˜Hô…žõôzW¯[à{📠M|ŸÄ§0Î^[$¦•»ÜÌìîÌ73ûÍýüýí€;(©ˆ ©àº ÆÃ¸„”Š˜Â{ü¿T¤1©ÒþÍ0n!£b Y¹ÌI+/Å´ ÈK1­à¶aHõÆ ·V·¼e †hå=ßåzK˜–Nû†]åna`Ñ´M±ÄÌ”ËS/+NÕ`﹦0V¹ {!SqÜšþ®ùѪnëb¿a4õM³n4¯7È…zœ“,H¼6tg˜ëtÆà†à;Öyc“o[„3tŠé• aW|â5Ç5¹ÝíTºÌh¸Œ¨‚Yný®‚{æp_ÃÌ+x¨a‹ò°¨a ËIë1Š gŠs=ÓÑ_8{Ï[¢Ñ%Óæîþìü Ãøy^ þŒl(ùÿûdPk†Ø0v»ÚôbÖbgbž’’Ü´¯5F~»†+ÖMË2››N·i†x¦ëk®ÍKűkÄyfMV5Ò“†\´Ç‚•Fûrè•J!»l íMUˆúyÆm‡ºQÈÜrl)šáM8£ˆ! ›¨$£U~zH61v–ýß«ø¿ pèýÄ1ÚñMÓJþ0ñÜ1‚Q ˜¥ì©¯•²©c„»W‘èDlt"Šù#¨Ã¯¤Ð ŸzÄ~F"+ÏŽ¡I=ØÑC¤½òÇPK8A,org/hsqldb/rowio/RowOutputBinaryEncode.class…R[OAþ¦ív¡ND¤¼Áv‹VPðR@}ب!bbˆ Ëî€k·ngCðÉã‹’H›hâ£&þ%ñœmM F}˜3çœùÎwnóíçÇÏfp/‡~{‘ÇYÖÆXÏáÎçH»Àâ"û.å0I6-ƕشM”ùmŠÝ—M\ÈzÑ^C‡£Âh§ò¼ùªæoU*jM]YN«›ê^·þsœÒÌrè+ÞÝ(Ð꾫]ò‘¨Õp·ºqØ¡÷ªYY'Ye‚üšv½Ýƺ»U#&sGéµà5iƒð”ÊäÇZ๚“Vé0$ wƒ+±nÄÚ©km»žªJ ¢"1€§pZâ*¦MÌH\Ãu‰YÌIÜ`q·LÜ–¨b^bCFpFbw&þžh)¨»ÑÞƒºG£¸‹iÎw’Æ÷¿ÃêŒÑð¸®uØw´krðHt¹;ª3™´Å“È©z3ŽÔj¾¤=X OO²‡©²[ñö¶ŠRK#]$!UR:1ZKŽC‡éåoªÎV¹ˆN‹~§ÎH0£é¹5E_2O$iΤeH§1"kiòÒ.Ûvù©} ‰ •tQ1Ldé~f@ê+ËSm¤ßb…ìÌ¢]nÁh!k§[0;Oì/ú¦?—á:=Ess(ÓUZè3ì!£ØBÎæcó™ý$é0É,Rýßñ,Ús·„Y*4MwÑ.·qli¿`€¯‚é· û{6 ïQˆ¥Åa….Å Ò€ÁOÈ?åȼ¡«¯ãï“–ñ PK¦ú N]áPK7A)org/hsqldb/rowio/RowOutputInterface.class’KOÛ@…σ ¯¤Z M_ôa‹J–ºõª)H5 ¢‚ª¯ÆÉÄ1rmwä²ÿm »»£mÌ¥Ïiž ¥b‰áýè·eQ@,Ä%؆Ë5[X1\­¿×j®×Ü@Û°ƒ‡†°YsËp Ÿ`Çð)v ÷ð̰[ûvëy]<7|—†¯ðšâ/PK…l¦"PK7A$org/hsqldb/rowio/RowOutputText.classW XT×þ/ ¾áñ@@@wÞ Ž±M›Jb*ˆu,h4Q’&™ŒóÈ›7*é’¦kºïMíÓÕ¶±­¦2¤Õîi쾦ûn÷}_MÏyïÎ<Àsï»÷¿ÿ=÷ÜsÏ9sáÒCçl!]¸/ˆ·WbÞ¡’xgïRñn¼‡GNrï½,ÞÇŸïgq?‹S,>Àâƒ,>Äâ4‹3Ìñ@%>Œ³Üg‘c1Á,“ TñV±ᑲÈ)8Çíy~ŒÅÇ™ë*>‰Oñç§U|ñY^üh%.às<üy_`ñE_Rñe|EÅWY\À×T|{ßðx¿©â1î=†o1ï·«ð|WÅ÷ðý*ü€{ÛðC?RñcüDÅOñ3þ¼Èâç ~Áí/Ù\¿bñk¿aqQÁoüN 8˜4S‰^sT ¾ûqĈ¦ŒôP´×±“é¡vG ÛUSVz(ÿQ•_Õ•Nˆƒ•Þ”û]]„ºßJÚ<æx$²çW©Ôž¬å˜Ôšé¸• -iÇk“餳E ;4S¡Ë98s¨u¿@ ÓJ˜ÍÌÞGjl3cÀȘ{­£»³ÎhÖ!Å{#~¸Çí3R„ µ“Žé*[bŽJw 7yMB±âPߨ( UyÓîž>ú󊵟ì#õî@7­t0>lÆwZé#¦í䯹,“´ú]dpÈt:Æ3#Ðä§X‡ë¿Wðrì¼–¼b«mc¡þV_õ9lÙNÞB±4uµ|— ËðX‰}øpl²Elgòì¶4ÔmÙCÑáÌí©Ä@Ô¡±L”gÚ‹»²©T¾ß9lØ?[ÌNSí©=BN—du§ÜήìÈ€i»¸Â1Ì!ÓÎ_iGrÈ]äí¿×4RÓ¶YYò˜‚mf<9°6b8ÃQâ‘s©ê1tXVÊ4ÒÓ®KŽ–X†ÌM&ÜìgÂ䈙qŒ‘Q¾‘¹6”>Lp«g!š£¦ÀánIj»LÃî±ÒÎ0[Ô>ÂÙâ³C~օηU“<÷X¯·Ò‰"óõs0{Øù¨=çÞí óݯñ¡ÛI7±{àwÝÜ]”.Bþ±ÂgEG2mØctÞ¡x°àÐ)kÀßòfS=gQ@¨är';8Èq¼"ne9{‹ØT+óƒôhd™Å`¯NØa“'ò1¼Ê§®ä ä냠cå/C³iÊòHW…bs—f{%<ï7|BßgÏ»PãÕ¯µÓcŒ@CÈ×\µÓË œqï }¥×…|œ[ÝŒD`ù<éQ eŽtH—4tº¥gNM½ä d’bÐoÝIçȇó>‹Òmþ‹ù†|unž5Ÿ’SƒÄ¼Âž¨kŠ«½Rµ‘JÕË£ì(RÚfƤû¨™ͽÚ[þ¤X25Q¹£ü¼‰ºÁoÜKV*;’f_ÈpµÜ:[~ ·¡ôŠ•ô³¯‹~+«pà§^€c¿ÛÆÜ¶Œ3…Ûv˶G¶»äün÷;À™ÂýÞãŽëÞ{IöÑ×*, ? IŸ€ÐëËÆQ®‡#mæŠ ÎîÊ}ü]ÄÇøCáúŠGƒ‡.ç $r¨ìŽ”Î¨‘òH~¦§­t¦ª­¼-?³KCÓ#ã¨ÖÛÆQ£7`¡Þ\1ŽZÖA`?É ”/mn¦ ÜR)G¹‹õ³¨;Ž*Úòêõ°ˆšâÚrˆ…Ô¥d W.¡•eÔjòÐåã¨óŽ+Ð_@U»Ç§±ü%'9ÕI–(§vƒ¦MµºÃÉôð{t:÷¹™•瘟ZEnQ¢Q€/aõ„Õ’Põ#¼uš9k$a•!’p; 1a4\«æ°¸ì>T‡k«¹wucÉ:qqÍXz>L·ÞBÃâtøté 6T«dQªM œe´9 èa-ksXÖs’<‚üéÊžÈiB•¡ 5¸BR4¡ìqú,WP`*„P0TATHÎ ôÅ·¶JŸ«Îa¹žÃ "_ž¤±Ü¡ñÛÆ±2­‡ 7^/ýbÞ’ÃêüüáÂüZ9߬·Lb »šÏ ó’Fä’FZÀf«¬Ã£õk'±î¼„¤aÍ pE$!q¹qwÞÇÃg±þ~†¨tSþ—Ñ‚Ûéžr‹f÷Fº™P=ß¶]ذh º‹Ð©PŽœß#uÞ)*²Ñu¸orTH— éÌÓz†¥îÊðÔí+ø³8RbÞ¾’¡^)58:?äØü1Üái+<Ï’&éøª!̳̆ñ?šh äN܉»xìnÞƒ÷úð>¼ßûÇë4Êp’eà⃬þ!û0Û=ÅÝTâ£ø˜÷àt%Îpëîeé}Œ;Ë­ç|˜Äý\©ðqûŸd»¸8ïÃø¯âÓ^|ƇÏâsÜù<g¹ø_ôâK^<äÃÃø²_ñâ«^|Í‹¯{ñ ßôâ[2¾-ã;|¡Áx8¶·w •P6ÊÄûÂ*íζÎhŒzv¯³·K‚×nGbyPgç õzúºÂ{»ÂÑpœT¤ˆ„ª­z&kªs—šžÐ\2ÉEzcáþ8̧²»”ijÒÛ#ANë#=zR“ dô˜6®ª©Y åR™”¹I‚+вK‚{«’³šiÃÝ×!kÚ¶”–Nî0´ý©£äJÌT{Ôñ¸:œ&d…Ù:ªÚÑêaµ=­fFÚc¦‘ÊŒtDuc¤}4{(n7kÙö8•lÝVí×Ô´„ºbÕ.}‚l[˜* SÓéTÆœ†ëÖ çµpáLÒi†R„nÌœ>”ʨƱ.ÕT-ÅJæÁüjÒú°„u%”Yb©Î¹¬Ð¬6B—`ÃgÙè4 •œZ*Ztßð-aÎíwv,uoïˆfÚ­SÜê×t´˪YNüPG„³€ÆËF$cj#šQˆØˆµ!ö½iÚÄÅ%V;mI}æ(ÛX^ÙMK´7msl&MÛ{A/FÙþ…t=­©Düúb˜%œu^éï»26::]Z"5Æô»J茩æ(1dD.åêÂÙ(uTgWÝî‚g9^‘O )Ú Ô˜Vš!,¹4–Šl\;‹ JcãsªÎ;cÁ)~ÖÀ ¦=zÆå}7s6•˜Æ‘Zй¦ª>‹i =“,XÞ|Ë6öÒLlT7L'D˜žC£¤FáJNŒ§S +\+-Å– ýHJçCÐ7aŽO˜Ö¼ûÕ„Ö!a{”覩cœâ¦è¦SÃíÛ©:&Nk1º£h—T+;–öæáæíD†fQ˜#XN©ÙQJÒãZ2šÊšCïZgûÙf°Rê†DÚº%è¾SЃ^סKAÝ "\lÁFßÃ÷¹Ø)ã ~ˆÉø±‚Ÿà§2~¦àçxDÁ/pHÆ/<Š_ÉxLÁ¯ñ¿ÅNã ¿ãîïñäîŸxŽ?ã/2þªàoø»Œ°ê?eüKÁ¿ñ!žö x£‚NnmÀFO*ø/ž¢Ó­àxZÁ&–læâ‘é$âQIRp zéNÉïu\;jÊR™"¹$·‚×áõl÷V.n£3l_é¾H¬oÕúõë®YµZ–<ä³TN2ûr÷ˆkÝÓL7z3 7GbTÉÍÖM>DyÎÚ(¢×@&;1>NìÔ’áLBORî MhãfJ§”U3Å£¨NdÙì Íc–ÌŽ ©Ybúü‰|µ(ÉÉh(ÄÛ¼dsìÄJŽÃyK¹º6kÄõLŠ<טëô„ظôƒ03oïá©ëJ’BÛÝÛÕ7ŠRl›fRÔ¾÷-¢Jh¼ˆX‚?a/$®“Mç"Y(qäfúèd±àšé:tDLݱY(ia¦w…÷=ÃÒZfÄþP‰iÙ,ñ¢‰ZºÉ(dhýºNiÈK‰I¸å´ð£³b8eF…µÚagâ:½ƒÒŽGJzYÁæ&öïçíö$ô ΜöËk»vTÌãem›2 ³¾‹HLE’ÖÃ’œ®.Lf_Œut1–ò`¦ÉPÞ$ía:Mñ¦0­ím˜šˆ‹r—„¥s¼-ì§Žµ.'dä.¿t†íSb=³­AzDÏ+PH²èXå_EuÒ¡­/òE3 ÝhsIsfºuEwu RâuS4Ô/àNÖè˜ÂHǵúRo¤¡–Ñ'P}#TÂË “¿¾8GZõfQou§¨CVÝ€­è¢o‹0¨aõŸ[ÔßNÿtXmº¬:jõ„¡KƒÊ>êͧZ¢Ú<é4ìÏ•Ø)Ä~R+£º<Øxe¶Üþ¼úZ’²ú’à}pݪÊÜwb>ÕîÛá ž'‡òÓ–Õ•.HMd Ža`) ñGÒ‚`ÍÊä`«{^»í̶ »xAÙ…ìV´æàË¡ÒA=ƒU'|®DÉC$ìÉ»]eõá¬Ø!<_ˆ6Ác9´&Ø*åPU‹êT-jÔã9øm·ÈèÕŸD]O°&˜êïõy[½-OBŽ­ši¶‚9ÔS¨²ÍI, Rû渞ÂiÞ“k É<¡ª,&¢À5mvÑ~ŒQ5Õ,*s²Q¤¦ËO‰E˜‹ nœ’Ƙ€t ÈZ›ä+É«(>K)>'QcÓ݉ÅÎM²æ)Ì'V5(â taw+õØîÕ<õ2Ϩg_)b\áÃí›Æ ã8$ .烎‘‹Ž‘³YØ"VRÇ3>“<>ƒå'Q~WNñµe½2Ì Œ–1!ã0צŒ#dí(Ž kõ‚Z>âC+ŠbwC>v!1c«»"vJ°f#-¡dè¦ÄlÅL ñ¢üvÙsV—3Y‹ñ’"¹Š÷x©]!´ëE”Ùï•3ðËðòË¿â2ñ7áæË¿¯º ¼„ãù#U wã$EÑzõÜ[òÙ²^$yÝ-|ÎÝæ5xm‘ÆTÌÇCþà$ZdDM'?ÞK\5m÷1}.‘×e“·íVÎnÍgÿrúåìߨ¶ªÁÝà9‡gP·•4Ón{êÅ›ò«9(<íö_å_Ú{Ñì_+ZËýÏ­+ýëDËãŽh-õ_-ZM'Qu¯ôZéîÓ–½ t_¯Ä¥´£Œ7WÿPKºüîÐX ŸPK7A*org/hsqldb/rowio/RowOutputTextQuoted.classRÍnÓ@œ˜8Û’¶¤´M)¤°ãCO J%äS¤ i{ÈÍILbjÙÁÙ´}^"âÂ¥Pˆ8ð¼ OÀŸÏI ‚F¨¶ô­¾ùfgÖ³þòãÓg›ØT‘Â…$TdT,âbT–¢²¬¶¢"‹Õ¨½¤b —\QcHl¹¾+¶ÊZù™}`›ží·Ìª]¿uï,Hí4¤ï1ÈVÐtæm§±oþŠñ˜áΙ¬ôÓÃLUØý‡vgÇ®{¤?Û¶»»~‡¦b d¦hë5ŽŽu\U縆ë7 EEç˜Ç‚‚‡"Çn*09ná6C>[f»ûÜkÖÍ08tóIpXé‰NOì8Gâq/N“aíÿ4†¤íy'dVcHÿ{FºÏñ[¢Í iz‰Aqý¦sTyJIj¥˜úa¥¿½=·>MwBŠHcë'mŠ’U›w¢Ñ¶Ãb|‹aáÇ¢‰Ý9p·[ªVÈR„q-½†¢ÿ1z$°(~ª³Ô-!A/À Fq##/Ç?‚½ñdœGzÂzD»$Zï> ö†1€ÔGÞH¯ Ç^c¥HÀ+pƒÖ8õª1D¢ä!”²ñŽ63ÌQS¢ …NC×Õ˜&D zYìÕS¡£^o#â«5~Ôü§&Ñê$Û' )…,šr—»eCH±Lp¡í ëÎGФ¥æ×ÜçÙ´Á²™ëñR¬¿|PKÙS?¿žÓPK9Aorg/hsqldb/scriptio/PKPK7A*org/hsqldb/scriptio/ScriptReaderBase.class}TéRÓPþn[¨”@ ‚ˆ;ŠÚµîŠÖ4J¡‹’Z~0i{§Ô) &©Ë;éŒÎ¸ÌøÃð¡ϽM Åh;sNÎù¾sÏv“_¿üpë $QÁ8Ê !ªÂ|,Ä!Ö„Ð…¨ ñTˆºÏ„xÇ‹8^2Œå+/6ôZ¾¦•µJɧZ¦ã¦[7º=¥ŒŒ!UÐJZMÛå „üÅŠ®­ÕýQò«Õr¹¸ÇcHèš®«•bAx†¦thê²Vβ‡öµ ×hg˜.Yv;·é¼î¶¹‚ç^dévL®Z=ӥʩl—oqÓ­½ßæÂæŽÓ±ÌJo«Ám†qÏV7 ³Í[Ô. n[oÅy û×K¯Œ7F®Kh®ÚxÅ›î¢<äu›M.ÇA1+”t'Ãd HwíŽÙ¦ ¥Ù³mQ‡ÑèrÁ /}ŽîZ6q惜mn;ÇÍ=îkŸEQI?Ê«Šáp0°ßªŠò}~s“oQ“Ãw:fÇ]b8˜h¦ÎS­“áF+ßí2Ì põþ%Ur …m\ RÓ4¤¾$ñ¤ü†^¡ŒWééåŒNd¿ƒe¾"òYr®áºÇ™ñ8£Ù…oˆ “¤XL¬Aê›R3ÜÂm¼ˆ;^°h‰O]ö †>xgß …‡}x ÷Bàø'¾|¼Ï‡@ G|¸mŽìÀ‰üB¢GýèåÐÜŠC“ÑxV°*žþPK´¦ê> ÊPK8A,org/hsqldb/scriptio/ScriptReaderDecode.class…VéSgÿ½!á%Ë"àE­MiªU+Dm95m Hl«9Ö°¸îÆÍö¾ìaïé÷ÎðÅ/ÎÄ–ŽýÒ©3ý úÇ8µÏ»`Á ÙÙ÷|®ßsmþùï÷{öãg?†0,a£8ŽžF\B/ùiõ²'%4à”ØŒqœæxE‚Œq ‡&q†cJB Æ9^mÀkÚ—ÓBÚYAûºÞàxSŸã8/¡ )Ž´„ ²‚V‘p9±š†¨BȬàšå¸È¡q\bðgSV*®ç‹C 1›šKEU#:¼t8a™JêRŒ¡>c^Ë[CgÂ0sÑ™Âe-›Žæ³ ¬è})ÈÒÅ “ÁsvvGT]µŽ1ŒÝ\Bz:UPbŽ>-¥ç¢¤HÕs±ÇŸM1x‡Œ¬Â \Í(yK5ô‡Îœ|ÂãÆ²‘Ц +•¹x2•ŸL¥5Åö“Á‘ç¸ÌÐF² #—S²De)—ü¶e•ö ¥P Ãb¡i“âC!¡è0ø2šQ Ûë‚¡);†Œ,Ž¢Œ9\á¸*ã®Ëˆâ€Þ’Á32zÐ˰˥À4®¤qãŠjR¹j‘E‚c@ÆÛx‡ìY'Œ¼¥›A;LJÖu+$¼+#„0A•qï1l·é‹–ªE¯«ùèñéøéUò.³45M¨º2N. Å'Æ"‡ì‹ì¢ß—ñ>”јŒð±ŒOð)yt%&g™ð¹ŒÏð9ÃæµÙ!Ä|Á°g ĽPÌç ÓR²#zÆÈÉr^pÜ”ñ%¾’ñ5¾á¸%ã[|'ã{ü ãGü$ãE ¬Ò¾Ìɰׅª1Uq°¸a%c§ážEp–´ˆ4sii«‘±nÚõü¼:gZÍ=ªSTCwb£:qäÔR äl"̫߻í:&†k“×ÀHÊdÑz a{çZï®Iæ¢óą˨Ä©o‹ýhQÓ®Ñ]ðì`<.DÖg«™)ÙGô Ú€½©mD‡K©bš†#¹Tqæaw„–K4VKœÀ š–“ì÷k„fÈ( ŒlÚ±¬#cÈÐçªgÒÛ^ÔUŹ˜4œ™ŠsýŒq‘ÆÂJ‡n­E°9o"=7îäSØMÐ }ãëè¥ ñ£ÆlÏÔ¥iô‚Q{zì£]7|ôážž°2<½¿¡ÎƒH»·ï›o•ë9›ó@•ó&êéÒáž |á†?J¨GJàáE4$+ð— µ{A€öÉEÈÉÞ š*ØTBóQA{  †ƒ4nç!úàã8Äñ<ÇaŽ>‚ì6‘7ÂÄÉ@îVxÍ÷á–n¹-6el=Ú囡eý½_!‡iíXOwâ°®«ŒÀ<êOÕ rîÙcGÑ•tŽ„‰ÛOÍ£¹ßð¶°¿Ø]ìü3œ\À.ïùv…#w±»„n"î¾ ë)ãIïmra’mÃ9¤±£ p/xÓt²‡h†ÇFyŒãèx}â=@#Ç Ûˆš> U”Ã4{hÞMZ:þ†$¦2ö(ÎŽÐ>5oâ‚þ|í$5Ž:?¼›š9iý?PKL—l# PK7A*org/hsqldb/scriptio/ScriptReaderText.classW @åþ, ?„,ds™;ËÙ“H  ‡®áHFÁ.ËV—Ýuf6&Úû²÷m[Ò+mµØ6¶Å† šjjkµµµ­=­½ïû²¶VMß›Y`!K¤5òÏüÿÿ®ÿ{ß{ÿÎCÿ¹û^[¨SÇ8TŒ.ƸIÇ‹ñ’¼/Óðr…x…†Wê(’竊ðj:^#â¯Õp³h¼NÇëñex£,¿IçáÍ2}‹Lß*ÃÛt¼ï(Æ;ñ.y»Eûu¼ï•aDǼOÞÞ_„èø >$“£LJ5|DÃGÅÄ­:Öá6èÎNo—µËð ±øIñwL”ïé§$®Oëø ÆDäN™~VÇqŒË4-à ¸KìÝ­ád>'þîÑÑ€{eû”óóîÓðú¢Žûñ%9ÚExP}Y†¯Èð„öUÑúšL–X¾.Ã7$–oã|K¼}[†ïÈð]Ùýž¸ø¾†G5ü@Ãc5¶Ãݶi„‡Cq²ö„9²® ôcÑþ`{4nì3†ÙD(07ˆÔšl)^‹&‚ûd'™²{ŒCv{b…‹¢V(n¦M >BáÎh䀣ñÁ¦>Q*í¶Ã‘ë:ÂÉžpÌpÎõC ?Òðc‚Þz(b$íh"nêÎe–àÄïBáD£ñÛ@KK;añ ÍnòØ"Ëhø‰†Ÿ2±å"Üz(jÙ˜ØÖð3Î1¡B6‘Ac€µa#nÏi±ÏM>›Kš‰¯N©hø9ã‰%,(ß/¾Ux>^ ð ü’¬ð+üZÃo~‹ßiø½ÂðGNèäév§0Lc 딢ÿ' G$eGcÁ£Éà¥}¡½YBßœ”`€CÝ]u ÛvÔÕ‹µ?+ìÇ•„UÏÅ…¿à¯þ¦ðw<.šÿP¸ ½ $žÀ?úpµÂ¿ð$©ðo<¥ái…gpZáYü‡i”åâ2~Leš3¢p†™M„Ç9CŠòØ哇àe¥M®Ò¦öh¿63UP¡"Š“ÎèO3­«ÿZ# [8½ŠÛÆ a**!Å¡S©FeŠP¹¢…|òò2UàIE‹¨RQy-¦%Š|´TÑ2Z®Ñ E+éì6²]¦>ÌT¿º}v‹“Œ‡ŒHÊ6šÝ`²ï«Vn×9ìÌrFi°‹²¸qC«i&ÌÉb©Ï>æTk;·-j96øwzw„£ñÉb^ä¯ÎtQ$·YŒ¹,ÛsóPØì6®Oñ;ç”*¶—Õ’–Ϭ–›]ÀõyeØŒ³“Öƒs¦/÷I™8Å1¾R›)Q¤ð)$ËUY 9p0sìÃ}¶å/z®´ÌޱepÏ”ßq;Ž97œµ™)¥ÖLB—FR¦HuG†Œá°PÛ˜z¯ÌEÙý.–γÎð0›(dœÃ1k–üd˜}n.]›®Â†¹»ÊÌì–ZŽVG8vzÞÒ¤ÍÞkšÙÁ»gêIÀWðO×÷šmÏùcíœùÍU°Ž5v¬2f¬{sÉø2mH–znNÄb ÃÅí¹zÛÞ¹ä³n‘­ÿ׌ÓÖx“Ð+có'ëÔKëæ§¥1§%îb³Q⥨ó}Ñf&†ÝkŸÐ™;Uóð•«d˜»Aè9Ò:»–ʸt¹–2­ ÈNLv¥2ˈÛMœ?xÏù:àê'´ÌQÌÿ£û•³îmW§9çˆl!we*ðw–»Ñ3›Î•nÚÖ•Q{hŽRî“Ö0uàä…Ü»-ÕoeLTÉZζ› ›–4rZIíºÐt¦†û0ý¹M9 '‘2# Ùffsv?0ÜžQ4ýªBñ¸a6Ç–%øÆ³[¹ÈeŠÝä¼I£ÂÚyHr¿Ž;2 'K Ç¥W²«¥þê¹ö•…­½ft˜¿AöÜi½¬==ÏXpøá@.[Õ9oó¥s‡ŽÕèÁòù?Ø ÿñç—óäï.‹@òuÉã yæEÿ 5'@cŽœì¿ˆWeÿ&ð? ÛÙGÞqä§á©½ yhôœDa¯ÏsZ£gÅÊN¢È™7z'¡ó»·äÔ8JyZÖ[s Ò(?…ãðŽ9®®á± tõ(ÐÀ×ý"¤a€× þó°ÌÅNH2!oá€äxÜÄMí¹½ˆ•A eôŸ@±s¤û5iTŒð§|uòɼi,*<Š’€g•£¸µ†×ªÒXÜQS{'–¤áëEI£Çç™À²Îº4–`Síƒ(ÅÆÚ4V”o>ÊïgîpÞËŽÂË"+½ç¥±jDÖoq5öd ”Mþ[ÆšÚ°`R‰c²¼.÷܃µ½ù'±®—•ÖŸÀ†î^èuO`ã©Ñ3Íc| ó·­XšÒ¿¡Wjˆj¸¶GÃuZiÉbÿSXŸÇÄ& JFÀÃâQ‡„Ãùôó³òŸÝ…äfžV—3eB šQ\'k¼t• U-‡\wdfÁM÷„ÁšZŽuó8ê3 [øQŸÆùãØ*o"//ÛÒØ>Š2>°À= Nòÿ3IQóph£ØÚ‘AÍ»ƒ½6ÖΉï69è4Àm¸ hV£ø4tæVYÅ3yuí c•ç0nÌ·øfL ™!ÉA¦˜@´‹ï<‚íü(MãÂŽQ”wæë¬[H÷Ó.9èeçžkƱ>P;]㨒c<ˆ‚üc‚ånÏ1.$ ¸Ð.rž•›%¢ xöi¸~·ó4Š9²§9OòLšú˜¦…ü\+&½Íi´Œ8xW•´4Z/`« —§Ñ6KÇq™3_^pM!‰ƒi¼3P4Žê1At§$Êeôå ÛyO’êá<hÛd¨“%íì%¡ƒoz-ccÏ8cSH£ý8:æI!Ów¥³Ñ3Š5î{×Èäê^YUSŽG3âyÃ(4ø &ÓÀù¦Bª ª)tW ø\Rç]ù,Ú[þ¿ò4Š4Ø]Œw ¥8Çn®ëø)=P¹IÞ7 O»K 9Ò1¨!ïr 7p>h7Ou^~„Zh|ÿPKâ»®A³ ýPK7A*org/hsqldb/scriptio/ScriptWriterBase.classX |›UÿŸæñ%é×­ëÚmíÞXš¶+ ¬¸®íXFÚŽ¦0º#M¿¶aiRò%{ â D|¿@‹‚ŠhA¬aa“!*¾ð‰ >Ÿø~€‚ŒzÎý’4IÓí—{¿{î½çþÏóžÛÇ_}àakiȃ&¶Ï_åF/Žx¸y@¾”æ+n<„‡=8Šc2üªà¸4Êðkó _—Á7¤ù¦ã[Ò|[v~ǃïâ{åxß÷àø¡,ù‘4?–c~"_OJóS>åÁÓøY9®À3Bû¹†_¸ðKáð+™~Vš_Ëšç„×odÍo¥ùLü^š?ÈI”æy ò`þ,Kÿâa(•P÷àø§4ÿ*Ç¿ñ‚4/jøçâ¿Ò¼$ÍËn à²éž(Ç«²ôUL2 iTæÁf9¤—l²“ÃCN¼À i¹4rËŒG˜<ã¡rÒ=TA³3Í–¯JÍqQ•‹æ ©Z£æ\¡d¨?d„š@<1Ô]HFù$Í{¸á³7èALG\š›eâ™ØHçët½ŽPYly6Q«lݬSµëø>©SmÑèB¶’_çKá"ŽvÔ©Su3—b—Òi;Ò:],+z(¨S¯èøã¸M§Kˆcu‰N;è2wàÓ:nÇmY‘œÈ:îýôé|›íâ×érº¢(ïçÒzeqéÇ]]©Ónbk…tê§°Ž×ã : $ÅÞŽËøÎrnöwµöôq¾këîÜÞÓ v°Øp-ßçyrY%Û$ß ›U R5utO*VœúŽÐˆ}nåk¸ÛYæ÷GÒz‡ñ}Öɵ3žÌ «hÎÏB„¸°!,Ë›‰…öF†„,Irjɪ™–dWvÌ9Ý´2BF ÂÂé"3¹¡n°h§D|ð€™«æyëKWUÓ©¼;[^d²µ ¹ä]ç-}»«ÔS¬(Qâ%Éß™åŒij´°QþR†å4ä–4Õý7=ÍsæTŠu4Ê×;ïk¨É"NZ:Ê7ñâÒˆ¬iæ5;bZ‚vD39x^Þr•Pš;¤åükX}³×_~qUš‹[>¤º”f™á`4e3{G(c>{_ J¸·ºKóõp²ÓçKY“rNÔRÇÔÏTûg-m¼gp—“h;¿èw%ãÖy¬o}©Êu‹·¤À~©ûùdâ»%jT–Uí¬Ÿ¹n’›WEC.âê â+Ž/˜iŽS‘:SH’°ÌÖDBnèo}É"}^ög‰3•bÖ”°š†³ëå72»ŒýIU p@ÙcjP¨âÜ%¡3J«Ø<0Ê™Ò1{ŒÐ@w,ÊXµ!Éb’lW{§©w†—ÓÌä’êÄT¢lcOJõ@8¯t}8U®•gŠÀaYT5[UˆHJ×Bk˜•­!Q$˜F^bözg>9?…oÈ(Ci²È„9UÖ•¸‘rÞà=Ë;ŒkªééH¨f‹„(˜ã¤'ÊHEíF"ˆ„CÑèÖÁ¤Ì5x·m L¿vùÕU «3â24Z”†óJݺ™Ím_Ž^4ñ3öÔð«•kJyÕJ5§z.UÏ¡êCèW=דªçZOõ‘Lu¦ß“飙žË4ÕÇU¿IÊCîˤä~ÜLEKò8•7ÞË-W´ÜÖJÝ¢h\æpß.Õ0÷KøwÞÄ;ÞÌ_»ààÿ@·ï~¯ªl6_v_þûœ>ß!8AKÃ5·ŒÜò;ÏÎ ”O@÷=ˆŠ¾Æ9›p?fM`¶¯i•aý»oÉtìЄRxm³Æ1†Ù‡1§1ªuÎqT5ÂÜ4ª ¦ <ïCe} åsèÑÆÃ˜w4ƒÎ1ù¾Å±q N3Úƒê¯oUj´Mb4 oÓp½†ˆÿ³æØíòbPë¸ Ï ÷qϳ¨f–uc°ä~á4æ¹hЧe.ß”Û÷>ؘ lËí³M`!f÷‘.ÅÜUÁ¾úa©ýª ,ÇœNKœ¹UËY/+ŽÃÕÕp¼éèAæX58˸oe³Ši/T½…b!®IxQ¦D{'Hû*Ú5¼ûe†BòÈ€»…YÉ__.f)Væ ¦°¥±J„³0žæ#±,7•>ö‰:§³áxãÑq”Ø,‡qúQŸ{«¥ñ ƹ8 ë˜ù:¬W½Ž ¸€1ç0ꓨÏÇ(ð63T—¼—gaœÃþ+Šw0Õ÷Âú+Òûs"œÃ}™²Kõüóåá9¨6ºPž;UCÙEê»<¾2,nb²h!Ì'̃›=qí³ø{Á4”¡Ó×ÀNÙXÑC£h¤ÐõDZ,ÐÀ§WÖ9BSŸ­!5Á>»ìFsÑftäé°Wø5|p„a-bXü`cyV…’”V(}X¹—æÜÞœ[´‰{¿NàòÏy+4û8GUg||ü™SÎY²nöôI!°ÖEõ×Sß[²|i Ü<ó¢D[½ÜRÇÚ4Î ØÎ_ÔððxªaÑÚ® ¹É™ÆÙ-öZûœCÃýòµŽp ç¶88Âkiœw·*$,æßÊ ­Ñ.¿B$ZùठûÖgE²ÁVŸ[aƒD´|o¬ÉÝiœß¢ÕjGp X(_ü¦mq©DPë’•›Æ'ŸU[Z9¾Z46T-g‹6É(ã“×—Ñøäjö¡öƒ*JžÄÓŒÍÒÝ:Ì> ¡˜Ï¹BÃGO EÃ9\U›ˆ^Ár ·.öà½„Š—Pƃíò‹7Ï´e¥M{ûkYÄÏðÌ¢V‰>OgSwtr¢Ø2†EÜ]x [»”äM¶µÇàOcÛøäsS¾àFÙ+phøÔÒ)ÆÌ‡ŸàÈs ΄wª0ɧ|Ÿ- <­‹(Ÿ›F¹»ˆ3á󸧈r/¾PDùbáYüûR.l×f"¿’¥´Y™ø"v“€c嘕3ž ¶r1‹_Îì¯Ê„ŽÓ·¯¢ƒ™Ìr_Ž3ï£LhÙnGï0r¡ØnðqtuN kJ6P-Êm®Ïd-¹.ºã<ÁÝa¾c©xÛ\þœ@:—ì(—ìl÷(H.N-Y®«•­9yjÁßg«Úι¥êâ`Ÿƒ‚}Ϊžà}f娑ð <+n Шý?PKX{«<Ç ÈPK7A,org/hsqldb/scriptio/ScriptWriterEncode.class­WùWWþY† ƒŠ‚6âBmHÀX»ØŠZY56Š5¨ t1„FC&ÎLDìnk­Ý÷Öî;Ý[,­¶¶µçôœþC=§§Û}o„ gÞ{wÞ]¾»¼w'¿ÿóý6`B†!ê°SÆíóÕ. »e¸ÐÁ‰=î°WF1"œî”±û¹ÔNÞ)!*c!º8Ñ͇»dÜ{øê^"&£ñôBåCßè—0 £·rˆ¿9,#A>$eèHñwGø`pT&·`ña“i¾:ʇ! Ç$ 3¸ãÆpÊÒ–‡u£?8`IôöSªaj¦l› Rϰ¥v¤->_Bë î e3í6Fl˜XRi+bjlÄŠ…v!·4|(v4Ôôà ÷f-©Y[%'þv-¡F†“q%”LªFK"fšªÉôåÛmY±ž˜©6V:"×Ú«¦Y›3ÐØuëö38[ô^•¡4bÅâ‡wÅR±ž„*¢vŸ„û ­„(à íWC–ˆ%ûƒ„JKöÏaQƒ móÕ5øb=¥&¹« ×ý´âlØ!bÛŽÅÕ”¥éIŠnÙ¡Yê^}ˆÂØ©sAª\ +¸(8õä­‚Gñ˜‚ Ö3¬ˆÒ––×RÁí]¡=ùàr'<ŽS Kr) uLšdX4åRGÏ!5n)x§<‰§$<­à<Ë•<§ €zß|‹Ž 5+hÀ:Ï㔄¼ˆ—¼ŒW(u ^Åk^WpoPX¼‰·¼w¼‹÷ªrh›Ó}}ª¡öÎTþ¾‚¸…ñ‘„|‚Ÿâ3* Ÿã _â+_óá|«`g|‡1ã|•ÁY†µyî˜qCãA FÄâτіŒ‹ò«‹±S=F‡kõÜO‰(PZ å…NƒwÖ›–;»§³O+ÁÞ9`èCü 1Dþ÷Í ¿´“BHÜ: ûUkºcë|…MÔÍv?yg s’fŠ 0°.:u–ž‹G¹¯îÊCKüzÚ²åâBÛKóÜT C7‚m|dp©öÜî fc(ÔžyžÈ¡²Ô0ïK«KÄÕ­™­éÁò™ØG×C …zŠZî«+”4¾ÉûBïdýUBz¿jÌÒ˜Âb³±p†³’¥YD¹B¬.ŒÉÞnä¾Ñ­™Ÿã¶„:¨&yÓó]™Y &ûÔmžµÞæQÓäUL«j}^µó«œÅjH$Óî´0Äϰ&_+½$1»$¿a(¢¤tÕœL rÞ¾:©…ú꺛i2µãv# Q%‹NC'Á×Ýh<üÓ¢EOó8³D'´dŽ^@Úì«°7"”8}!®EV“fÚ †¥Úï¸WjöΔ…jz8g‰©Z{tS³»N±°JZXEŸH~úsÐCüš†˜©ÃÑè£ëþ&o&ê$$úvûõ Î 0¿×åCQŽq8ýàŠIîqùãF°f“Ûë.c¿.ªtýOÔáug G¢Nb,‰œƒri”´{G}$2l$ýÕ(ú—H·„[$Ü*a“„F&a3hØR# mÍB:A€ÜYHÕNÇJý^çÜ\^W>$ל*mH®¤ÛfàÙ–Å 4NškÃ!ð4ŒcáXÀ¢q” £"ÆN4¡9+xšáyˆˆÅgà9‡%#$<†ò1TdèË1ÀÑDz"ì"ÝçqMõR¯¿ž»u•Ñú²m˜Àr"G°2Ès/PÀ;á¶Iï8KCZÉŸ*‚ÕJ»E–Ÿ88wéÏp˜Š~…¬Š{a+p€•“>îÍí“þÎFä. ó©ì7lä=Õ¬pØsM+ýÑ1¬Ê’'cã´¦«eZ­\¥“¼k¶pMUÒÁ j§6&•ñÍ ®•2X+\'2ðemó}‡Ppu»#(Þ¸Ü@qsP’špQD8/â’˜í0”Áñš%lÿÃvüIŽO…áFZË4o Ÿ27¸=ÿPKæXG PK7A*org/hsqldb/scriptio/ScriptWriterText.classX xSÇþ×–x²x6X`À$€dÙF il#‚ˆ‰% ¶Û:Ïò³­ +OO“¦MôJï›ô>½[ˆ-ÒÐMÒ¦Iïû¾ïô>Ó¦mÒ™}+Y¶e>vgfgggÿ™7³â±§î¹À&q•‡ðÞX…ƒx“†7óü/\x«†îðBÃÛXøv/Þwjx—:ÞÍ’÷ðð^fßÇÔû™:éÅ8ÅÔXöA/ bêÃU´ðf?ÊìǪp >ÎzŸ`ö4¯žáÕ»˜ðbyV9Ë*w³ì“<Üà çXö)fïeö>Þv?³0õidö!f•ÏTÑðY¦ὟóâQ61õy–}Ù/2û%¦¾Ì|…¾ÊÃ×¼ø:¾Á ßäá[|Ûƒïxñ]|Ï‹ïãüЃ1ùc~âÁO=ø™?÷àüÒƒ_yðk~ãÁo5<îÁïÊßkøƒ†? ̳ÒG{r¶ÀÚ®´5ËÞ˜ ’0žöÊ¥LÎŽšÇì®ôh›€7éܶmËöÁ¾®Œ›Œ`ÂH#¶O±Fug:•µ”}ÈHäLšŽ¾h(2ØÞŒ„T t莴³§»;¨uØðþH¨7JS´§¨r¨½ë`(B';l4ÔÛ]Ôßê ECƒ{z{H6ß‘Þê „®;ÚßIßtÁ`wx·ÀåÆ`x7Êž”Jœ³”‘ν¡îvlg<·¯ÒðgÏžxÂŒŒ§b¤N¥L«3ad³fV â/…s·aCFÖls#h\ 4ÓH¶•ª&âCA¶Ú‹™Ùlcံþ¦C®Îô0AÚz>ã¥Ñèï—ÛZ.^ŸÕ«#¶;Òmd¢ÆP”‰ò ¥/’@æËwäFFL‹nYé—úG­¸m²Ù¨i%)R¡c13cÇ)–ÊÅÝ…øðp{j83“­LóJi´±ÁÅΩG¾ØfÒLÙþN€ï%íýF’@ðOÛ^w)cÔ´ ¼´W+íQ 4•=}6$¼ß#÷Ó× °½ü¶©Mã%ˆÒL4#ù0¡(Pç/¯¸H*öØc¦UⱃJ8•5-{–x·™0 ²)ñÎ :êœ7Pråž¡̘-]X¢ÂvcÎLÅJínº Ýý¹ä9®¶–´3LÆK]×G(›²cÎWP“St¢iÎ|êþAØK¨¯îqq$yHëø'žX)/³ã‰àñx&xMø@é×¥ã_ø7ë?IÀ>¿pO1GÎD@Çð_ÿC¿†§t<- °ú‚Õ‘Ï8ªã0ž© !*tQÉìž­ —pkbž.4áÑE•ðê%1^M b¾ÐuQMž‹çëcýôëbX¨ãYÌÖòêqܬ žÐÄ"],uºXÂ;—Še:ÙÚõ¬Z/–ëâq©ƒÙb¥Ž[ñ]¬ ºXͽ/Ò1Ä;b¬²F¬ÕE£X§‹ËÄzÞë×D“Ža^ ð1.>Ád¶™ÜÇs˜jaÏ[Å]ÅZM\ÎZu±I\¡‹Íâ ÊuŠ—¹!kf ˰Ó!èÕÄ]lWR)ÑÅ6±Ji¡üsWiå®Òº‘—¶s9•­ [A%@ƒÓüd¨‰VÂßÀ…ŸVµYô‰ZÐÞEE»¡PäIRÓЊDÛÉÔápt/ *ƒNjB ³H(ÚàÔuZh,$ÇÁT6—ɤ-Û¥béa*¥Ù‰YñŒ}˜sÕâÐëb‡ ¾×X’ Y©B¦fê^„Z•fMìXsá®@]¦°OËh§Œibuø‹¨—…oDîŽQ¦s• ÄãYú|3nSú©ì°ò“ˆ%å››@½¿üŠ,­vÚñŠ„¿©Ü{BKçl¾/Pâ¿iYi+âQÀm:óWçÛÂárEnf÷(†˜Î¬‰å,‹J”*oä[¹¢G&]Ý-+Íþ¾•o¶6-ŽšvxX6Í}Uª'ñÍ]þ}¼k~Vv¼hšŠ‰Àº‹jo™DztÔ,vÕêl¡¾:áœïr…q¿|‡«.\XY©J™æpÖI±…3{Å„®â˜_ïŸä~ÎË*ÛAÖ-ß1.XöE²Ö™Nä’©èx†OËýM¥Vmy±­çº@³fçkŸ£Å³¡dÆŸóéAIí-tSƒÔD˜|ÌJ¦|ìLç¸wQiÕ“²®x–D«f¾ãöÙ1zFeÌaVà·1Y9`Å“†5~­9Î4 •þð\~—ÉÜ œ2 1­Ÿ³!;^8vbèʘæ Ó aZwžxއŒBü8i..÷°”öaylÕÐ8÷y‰à,ç6 øÒ¢4ž¥¥ä”x¤3ô¢!4¶•IÎ2éZ®HxØe:š’gI¹—?9,r#ž4UÑØèŸßx¯R/© õs–dJÚ¹?¬¦_m‡è7o ý£÷õèC?=+ˆ®ÀTq§'ÚÃýU΃j¾^͆š‡ÔSó°šM5¨yTÍcröÑYôn¢1Eܸé/à 4·´Ö¹ÎBœÿa´ÒY†yôÐIgE«Î}SZ¥uŒ~ ³ÖÖrU’Nëv\“¨ œƒ«/0Ú9oîSX»Ã]ï®/\¾ÊzwU‘>éx#wcþý§Éê"¬Á:²*p£ô¢âibÝ, Y ¶ ÄÒ[E?oÂÑ¢¯•D±¯ç ÷Eõ$j_]äáQB˜µª¥ï(\v\.SöÒH+¥tœLUÐk~®ÓÍäÚ‚“ØDSM y:ƒÚ<|L5ç±(ÅŽ°Ž…Í“XÈc ‰–6O`ÙI¬,ìdÑYÔ³Á¥“XÆZ§¥?|K7*Ý[וxTÁAu¹âØ£ç å…Ó'pI—:Â$,‡ž{ê.;i®¤ùò)¯œÄÒ¹¼ªä.-Ó HÏ)p ³ñ¡7£²i‘EÍ#Ö|™Ðuß+ _:"D^eh-æ³.&1ÀÄ®1´/Ÿpɳ<ÏÌŠOú<'n’ÈU|S®dضQnS¸Î°eµ+¼:C/½egnLTù»Övoä…SÈ«ÎöŒqʘK//§ŠW LÅMÜÀMµdLLã–ªø¶‰;¸kb³µLU÷WÒê¸gâ>èxhâ›àªW{7Z¸ã9éùoH«Œ§²ó"'k\å"jº0ýÄ÷^©Á’Ž—•œš© Ê¤(àÉ:Zïé[ïb8PO}u‘-«)©w ½‰j‰’;p–»ŠJ+®M¼Xnž!Y'×úT•ñ¥×àËú/>*½åæu$êÖÐYQl!ÂîÅŠŒƒðÎÒô7Ï Yݨï{$¨®š¨+S¡ÀU­˜Ïgsö-éÔm¨Ò ÃPMËjµ\ØZ}Sì­UïEĮЉˆ²í&Ml˜úB“£ïƒèA7}Õ¯þô!Ýzj'K÷‘þ°O!`ö`/Ôñhh"ûv 3Ú'“1-)¡éN2¦÷—mtG ›È;•]BóÌÌ”fiÉZ> 'YBëÌÚÈß‹•°Å¢%t.`ëWK+¡ë=ö+»-±"ßa½ƒiE¾ÁZÄö¯íìç"v¨¥d§¥}$ÆC8…al¦Ý>¢×í/=FtìgLG¯Ž ›èþÝ:ú~QMýÓÞ üPK›r;–8'PK7A)org/hsqldb/server/HsqlSocketFactory.classUmSW~.y¹ÉfÃ;Ál‹JÙ$Vû&X­€Ö”€Ö -Ò·e³„@ØÅÍ‚õ[ÿ†¿€éL?`!™2­¶~p¦?©ÓÑž›Ý¼‘0C^öÞ{Îsî9ç¹çÜýçÍ︌GúpC‚„ÏÅã&ÇŒ/f%Ìá–˜ÝæøBBw8RAB|)`7Äl>€´X,HèÁ"Ç]1ÞãøJÂ}d8–$ àÇ2Ç×¾ÁŠ„3xÈÜ)¨y#µ½S`M›V.¹Q|TÈ®%‹ºµ§[É;´Ê˜Ú–nßV5Û´žL3ðb±àXø¯å¼}Á£Ä—¼³fVgný¤é;vÞ4Š ¡œn§Œ¢­©åaü”^Â[Õ¶Ô%u­ S ]ši¬çs»–î€ú•ô¦º§& ÝN:²iH¯f骭g*»W±CJ*Þ€nБ· %åè ª‘Kfl+oä¦O†Ë®wë÷•Vã&gU»@¾˜Ñ5J Bñ/=÷êG0¦œŽ:XŽU¢šÌ3™´c,úcÀpµMH§Ýû[ªŽï8¾çøj§ò[¥â‘ñÞ•q—d$q‰a -Aö#‡*c šXdé쎑!ÄÄÂùSD$#†ag1Ì'ü¤ƒŸtð“-x‡aâ#ëÈUW¨˜-¨Å¢Œ äºëâ»k›ºfSÒ26±Å0^WYúztÉ”±gjª(ë%Õ"ÞkU.£€m†¾ºIMEUW—Þß5ìü¶^S§2 ˜‚Š&û¥ Ë|,ʾ)FçζÆ6K½f[»"}ªþÕô±|©òú…N¶$õROP¿ô×'E›Ù¬¥©wƒ”åÌ“Eu›âH´­§vv´mLI¥Úë„·HÛn!_7-ÇÛèÉÞš²ŠP„sºVP-=ÛÄÁ¥•„Æ ÚGÛ…¨ƒê—Õ˜Ò†³x;{)ŒcEÁ0¨4bkG*nÛ¬žeÈÍ”úª]þËxC4ROÐLmQ½¢7Ió­zÀè ø%°gŸú{I8ˆ Îá¼ sCO,£cþ2<$a¸@OŽi†c´Áœn»Š™0WbAÕÝ;ÀSQà]‰•à;8†'\ð0|º+àü\B°}“n¤n¢ž_+(IÜ_îNh¡^胴2ÿ÷o½Føˆæ%ÈÏJ¼ÚG x5þ‚4„ôÓ«3Fø1«QÕψp|0Çqù_ ¡ˆ$nL×YÆuv®ê,ü¡ÞÎ2ºž#Üè*츊 Jè(QmvÕ‚+ºõ\W¿?et§= gqüâ!zhÚ7åˆzÑ?åÛG|Êõ"2Å£ü/ >E(Ê_bp]G8³凈–0ô"ê{ é€ÜD(ñ:a'šxßÒÒÇñ1Ç'Ÿr\å˜ã˜~CTq\ãølžãú[BûÁ(‹¦CÃÿPK—h&J PK8A/org/hsqldb/server/HsqlSocketFactorySecure.class­W |Wÿ¿ì†™L!,X’â7Ù, Th›”¶IšÊb mC¬8Ù$›Ùef6$Ö£VÀ±ÞËé>(àC|r˜S}XÀGjðQ|LÂ}ø¸ˆOp&Ÿp„ß|TÂe¸Ÿ¯|Š7ðæor|÷¸„%ÈšÄU$_ˆ–¦ Ó$k’6|AÀ<"àK¾LS2ܰ¢'ÍaeŸÚ‘&ª¥&šBÓØlAÔ9ªêÜô2ž µÓXÆvtËØn!žÕ·Åã¾"ã«øÚDzd™Õ×Ñëè‚ušn©†®¤ìÉ#=ª%UCÀ×e|ß”ñ-|›a‰}‡É­¢YãÑ•Œïà».S&=XÆècXZA¥2¾‡ïËP1(c7ú.žÕ†~ ã‡ø‘˰XííY-EPX¿Œã'¼ù)ÑÝÔœ¡F?ÃÏeü2,L(e@Ki–¦šÁÁ´$.- ‘Y~ÄÚÌf2iƒ,Lh™aÕšYÍRM¿Äc2öàE uªÎ#{ůðE“Œ_ã7\ðß’#Èø~/CÃ^ dü;eü’±)=ܘãÏ —ÌÅÏet9þ°bv‡&”ñWü|RÆßñŠ·Žž-2þ‰¹±îÒ÷ééúÖ´i™÷ßøwÀG9ùe<'eœÇOa‚vÉõ“Yó0,£‹ƒ“ÎL™T½~6U—Wÿ'Ѷí_K§Ê"%ӊ̼dcVÍæ L™È|ü”‹A-éžjLCÑas*9uRxt+ÍJ4TÈC«ç@K©è™"·K3-UçκxR»1jÚ’Iƒà•DRï°‘>À}¨$Ÿ'•VÊ5”gûÝ 2® Õ°¢7nZE ´A-AQAÉlõÈ WúšNêVR3’BÜ0ÔP†-¤þÔT|if$Bµ`Џ#¥p¥™=ÊaYS™ÕÔâQ£«bºi)zBåïfc¹G¾FI&§PÖ‡*AjŒQ0íl挽h¥ Vª4÷.—¡'YF¶géU¯+‰$\Æ_ÙBžì°ã3nç@~¤±LÅ@J¡#NÚ,=à£öqÇš*«`Z4Ç ¡X¬ü^¥R‡¼mTIeÕíƒÓ –ŠÚãJ!O3¬I“S!g,n<6”/PœÊÀ¡½VT²)ÒæÊÚrU ÷Ôši»Ky쩪QÃʦۅÒ\3ƒlÏ–øÚž©Ëd®0MOªc\ae}!æˆØM+C*'Š•Ub5ÙŠÏK©ú5l×~4õ™ÙÓõÉ%œ¤ÜÙZuVI™±!=m¨Š©VÀB±ÔH<úçh×5sªÄÿ,T¹õ•ËHî)DYäÛ$5-Ä(²½dœvz°‹òBJp¡t¤uòË~7Æ-µÍ0”ñÞôVu,>©™þö2"`}emÃóà¥?* è;ÒË+ êó2ÑîwØ} íPAIŸ–qš ÀCsàò¦ã`M'QÕwžcðN «ýóòÎa™_Ì׃t5]á<äÃÛs”n]…K±Ѩ—8Õ¢j‚¦LÀ.Þ\Ü`£a6U‹Ôò›‡Ó7…c~ø t77åP{üÇx¹èb¼Ù¥Th{a}þ3XÔ}?ß…'QG(—ø—æ°Œvþå4È¡>†ÂÖÅ´ÒÌ·VLnùŸÅ› ­®Ìc•5 .¡Aóûb.„v{¼ ünÜäBºÖª©O5籦Åk[ˆ[ÞÖºžÿ ]¤,ºH]ÄA™BWv{ €”xMêj·ÍÕÙÚ¦GÏ–†ð©Cð‡6æñlZ8XÅO”±àà]nîɹß÷þ<_XLjc¬6­Pµ¤L+E•ë´bØ&ç^Œ‚+r¼ÐÕÜqcØÙ®QBfR[:IYÉüÿ,Ã"™z©6 oí ë’Û¹ÄsýHWd]>K×Ï&)TÃ/eïIC€i‚Ð#~/MÑPKd÷ñâŸÀPK8A-org/hsqldb/server/OdbcPacketInputStream.class•V[sSUþvs.áô´M[b›&XE’^ ‚V,´BK+Å–"„KÄKO›Ó4ž”““Ò"¢"(Þ-ÞÑÁÆ™¾ø€&jœò茾ø#ôÁGß‘¸v.mzSèLÖÞ{íuÛßúö>ýõÎO ¶ãšŒC žQ à°‚#É8jÇ1"Žóv„e<+㤂J<ÇížWàÆ hö¢Œh\=ª` ‘Jè—Uàäj'&ø^ŒÏNqqZFœûOrqšï2 6cJƦ‚û‘TÐÌÓ+°¸Ù‘’1-㬂4;fø8ËÅ9.^RàÇqeJ;­[¡Ù)õ2¨£©ñqÝôSóT¼…ËÔJoãïªÃ)«,û±÷ð¾Šð¡Š9\ah(ùðv-«ç*úU|ÄQqÿG‡y=Ó.3ÙOCüõ‹<^Ôªø„GïÃCu*Ÿ©¾ˆ9ËдÔìÃ)ÊMêeÑVR¦'‹S'š¦âqÞPÝ4´8oaÁÀ§Y¾Äøx’R¨øŸqñ¹Š/Ð_^[y£*NöÐ\va+Ó«B¦û&pª0Èþ“=NíÕÄæ†v*î˜OéyZ“¡H.|£Ñ¿îe&C’R\7¢Ö-i—agy‚áÑSú˜µkµ&°ZE)Ïš1‹ °—®Y>·ÒJ,Ò†-ÀAÇâ‰$™ÈÜúh¨¿8£;Hð\Ež|ÍJT·†ôdR‹’«¤MMéáÓ¾*«TÅvR¥žµˆ¥m»•(¨àÿ’ô£[“ŸmÇØé…xŒÖ´j¢/ªÆê¦Ö,XØ“AŰÝÿ{œ~}l›ó;‹õdÏ£ÊM­l S…??S„™v2¶±íLÈ?Û;%[w«Kòº¤o$ !Ü!\G¥×)ŒtÏçþâê¯Q•…®“2o¹$ÛŽZä.8g\’P˜:fF\’X˜Ûù\ÊÏGäH‡8 miØ;D§x/¹6ð\Y(á¦,*Ã.J­fPÅÆÐIröª!3ôzï¦Ï¸Œ. ×’ŽtŽá,•ÜbŽ@¸+×2+ø«G3Žx­x*[Ú2¨nqšïPøÛƒ½Å¶%nÈÂΠv¨%ºÁÖ4ê…æQ×ÖÊ5?b£ Ççs´-® ¶¨Å2zr¨MF¯Œ}´"V”Uþ¾“]$ÖðÆF²pR²û['Òh(HJÓÕ3GËùÜßT…ë ‰¦ö1Ò!´Ûœ‚Ã~~.Ô.8…¹Pî0‡½=zu§èÓðtJ| &-Õ©¢â66Êxê6jÙ²Êöc XÙP‘Ï[¨ŠM»Ý_Èó¼É›ÃîË-øneÑ&Ž<Áƒ·È]$x韻BŠjØn£Š È8°GÆÓË’ .?H#¿õåIì-î4¶,U«ðj«¹oŠCÅ0¿QüÒÖåGˆ¯‚K°¹óȸÁ=jq ¢gÄí!ò>î®ø5÷ (ïH×|îO»Dß­œ¾b·×%,‘hw Þ×àËÂOÀ¨A-u„~›W¤@íi<œAðÖ%›Ïý^ÂÞ%üø› ÝA#½uèÊÁ ‘XRâm5kËŽÈpÃÅ#ÖÑŠ®$NЫ߮x+ð/PK\+$á2ò PK8A.org/hsqldb/server/OdbcPacketOutputStream.classSkSa~^`YÄõR¤á-£,aé~Ó¬ÄLL£+óÓ›nØîÚÅÑÇþƒj&×™œáô£šÎY62´ŒÎ{Þó>ç9×ýþã[À¾}àø¸§¤ù¸ýîIqOaBÇHž¢[/Ù[Õ¯ô÷•·À¿“ÔœzcL~ÒYMø¿¸€3n0³.tÔƒf!#ª@Ò¤’t K3$•´5ôðà'„T¿ƒvf¤- é‡HÿAhfqÅ£V›Ô æMMÕ™\QSRCkÛŸ(-ŸÇóêî!ïöæú·áS}DÑêB iÏq€lüëÚEçò.º–wнƒ#Ÿ[\¼„žË w*ܔ䎪žÓ6‚¤F–9}2o# ú9ä6:TÇögç=Æ9²q“ìåiºÞÝüXHHéfE"%ÄJ0]ÿX`ÆÔ€ƒžTÚAoÊÁñt}«%BŒ?/B”,ÜEÝA”;î ÚšQ qÉÃ¥“k ªÞ@÷"ñPKý,™MPK8A-org/hsqldb/server/OdbcPreparedStatement.classUYWÛVþ®7„’@H¨Ò%ñFLÓ6‹¦ÍBZ§¤¦@C Ýdë! I&Г×<ô)çÔ¦”sš>÷¡¿¢¿£éŒì°Ä†F ™«;Ë73wîø¯ÿÀeò“ÛIÜÁ]&÷’˜À}^}®à‹$úPRð ‰~ºð%óI&™|Åâr¦ð5“éÌ`–É7 %1‚9þøVÁ¼‚ljeÝ6,)00¹¢oèyK·—ò3gÚKEøzMz[ÝzuuZú5+8;éxKùeÝ2*y/ÜÌ7ed øÒ÷MÇ<¨6ÓÜ%…Þªcºi“ÿ‡º+p¢ [ L+OìÂu¼@·|þ²IÓgÿ‰›dÜÈ¥ú÷¥·!½|Ù¨T§<éêž4f=kÒŠéG±»ŽAI>HµgyÔÎ^HaŸ½Q]%Y½bɰ  ¾S𽂒›Ué¤M©Ä«–ãSÑ[vë†1f)p±S"{Á7µNE×Nî‡vÛóô-.‹Š42*4\Pñ.ÞSñ¯.!¥â}\¤XTüˆŸTè¨Pl*ª0TH, ¤Ú‘§eÕ!Îq5ïë¦Uó$£/ œy½Twj¦eHOàF¹¸µ@k6‚¶è9kÚ^šKg¢™¾æ,j5[nº²HC ¶\YÐT,Ãd²¢b#­QUØpT¸XWà©ð±ÈÔ~þ·Z*®âšŠ6.½a“P³íçV®¬P„‡¶šéÒ™j º5í½!0tÔ¡ËcË'-ð=ìiI·Ì'á¹Tú¸»uÞ—A˶ìMlÊj-SžãJ/0%õØx‡æ.…ÏBi¡]ĨȦ«©£¡JY’Á,dØÛ%Šò8G™Ð]WÚ†ÀX‡pÓm[­+ruJlj»çÕ! ¦ÚIãT'@Š(J+pý ´ÙÅötû¥äÉ5º4á]~3‹¾Ãƒæ“oþ,9ÄRGý( Œ×xåþ1]üQúM<h%x„œæAÈiðT9M â1úË"Gò1úÊ!J@ËlCdv™ßF´ŽX&û+âuÄ™'êH<BŸY\&}¶üIBž¶Y²Y®%3VGWf8VG÷oHâÃñ\”Ÿ¸ ô`8Þ€JÎ3„Ñ@ï/!F&Œµùކñ#Ï0¾‹¾yVÜÆ‰¼ÞE?!¾50ÐÀÉ–ƒ8µÓ/Ʋ™œ‰bîyu>ô{  ã >ÿ¯(øPÁG„Õ£á㋎‰^š%­úÜ£8ñËÑEo|CÌÑ*¶ƒa§8Íkú8ÁŸiàܳ—ÿì£Æé¥õuÜhy"œ›ÊvÙœ4£¤ç?PKöW01PK8A org/hsqldb/server/OdbcUtil.classÅXw|÷Ïwñ1½±„0ƒ, Ø–±lŒ­9Kg[‰,9Ò lÚ¦+ÝMÓ&mÓ¤IH[§-m’ 2:Ò&M÷Þm:Òtï‘´úýt¶lÔ„æŸ~>öÝïßÛ¿÷~§'ž{àa"ZÏ}¡ú}T¢ItD÷:ÈF'd:)Þ÷ƒt¿X}\¦ŒxŸ’é´xB¦d:#Óƒ²ÒCÚMÓ#ôI±ú”x|Z<>ã Gé³}N9h =.ØýyyB¦/ÈôEú’L_–é+2}U¦¯9èëô ñø¦x|K<¾í aúŽLß-Æû{:Hß—è2ýÐAkéq™~$P?¦ýD¦'eú©Øô3™~.Ó/„ª§ôKzº_9è×ôñø­ üN~/Ó„pü2ýI,ÿ\L¡¿Êô7¡øïúýS¢g$zV¦Éôo™ÎÊtN¦çd:/3ÉÌ2Él‘Ù*³Mf»Ì’̲ÌÅ0˜ÏžYÁ›çÊ5–Ö,Èàv&Åäí ù»ÎÃ4ßÄ»zÁÎÓ¼)®Nðµ1Í1==ýL‹ ÈÛÛ³k Û¿w Ë õ»Û„8‹iÎ5¸Gà jFÔd$œˆh‘.5©Ž¦˜8Ð~¥zXmŒ©ñáÆžŒÆ‡·Nùèèj÷tÛàË@ù÷÷ø;ÛümRHe&·I2_pŸ¿{ŠXÄT’•ä:ÐÓ?°ñi¿ëïîv_€íòv|¦ø)lŸ·»3йSˆ·Âþ™ÄÎ`OÀg¨¶] ®ÍßÚkl³›ÎL‘;‚‚"1-˜Ii[P/ó‘ÁpH;¬%£úD‡:Æ´´=‘nI]‹ 6Æ¢ƒ¸¾G›Ø¥¦F@GíÍÑxToa²T×ìc²úy¦Å‡ÕX4¢êZ >–Ö»ÔðUšŠ¥¾:_bJKBYcj³L?R¤©£[…¼¹!x¨êQcšÄ‹Ñ˜þñ°6¦GQyI´‚«[‹MdÓËTU}aÎ5âptÐ ò|ÖŒ’aÚU`s̬д©ºLë3˜£Æ´¤î‹Eµ¸ÎtYuàEÊ ÜùbdI\jü-a*KŠ\ëéøp ç%©©I-²7­%'˜ÖB¢>‡5ÝHO0Ù‘Hú±ôh\ìä[“ÔRé˜ÞØm¼:4]¦m­ H\†Nÿ}3zˆ{D÷áȧzÁ°®ÆðÐtT…uTB΢êg_ÄSnÇŒÊUè­t Kár®@5ÜÑDc 8UdLÕÖl·NàmøòÝ¡Fcé¤(ýÙêZÓÑXDK2-ËV'•Ã*âT#ž˜ÖGå¹*ÉŸ=èË£¢i§EfÚÍËV6L×BI4<P ¾[ÆÄîª7â Ì¡h9>•Gð³J)JWâñ*ñÝF1À£yppb}l|õ,8™§ëypšd1°.¥ñøRšÈƒ~YürÀ¯˜E¿fý•³ô¾*~5à×äÁ¯|mü:À¯Ïƒßøyð›`7îYX+ÀávŒçÛ-À›Åggí)â{Å×6¯§·c‹ _O6ß‘á¢æÚ 5O’µ£Üzœ¬÷ž!kÿ²õŸ"»KÊ\{?gÈᚃuy†×\,24Ïä™_ˆÇ™åq-8E®G`GIä€B¦w@©‹,çItŒ”èFóNñù ºf¾‹Þõ‚wƒ"ãí‚‘%'ia†Ü––Êú -:N‹ë+3´ø4•ÞLöI*¾Ö“çŸ>CKúë- ”¢ò-Ö%Ö Ul±-±¹€ZzŒæbµ «›iÙ«é‚'g6,ÎÐò¾Iº\+¦øWüÑÊv·=«¹´ÞmϪ>–Um‡ê§Üö’[šâfpH‚c¦JLeÙXe5¯¾U†¾ŠiæÕ3í3|ºÇøýDDs Í;Gs%º‰Ý¶sT#Ñ{°./9KE¼Øv–,x>K+V Ž7Ó±\ú« +Þå§iMg‚[ÕP'Î̯îkÈPM¶fÌ´X°ýº5·}!pƯeu\šj ñÞ–ã}8Þw×?Wê:NR=ªGç°º^š¡>¬l®C¹•Ý¥æV’k0·’]áÜÊiwEÌ¥äÒÌ¥ìËllè?PK77Ü} PK8Aorg/hsqldb/server/PgType.class•Y \›×u?GHÈ 0lcGNRó²K츱 ¶2‰Ó„  [HX~4mÓG’¦ik7iÚÕn×e[6wk·§±½ºy핵{?º6é#},ݺvf[»¦YØÿ|ßýÄDö+?ëœïî9÷ž{î9÷|’¿üúž&¢üñ2ªe—!¥^·›=^*á27{=¼ÆKn6J M÷,,,x¸ÜKÃ\!Ú•¢å+ã*®¸VHZ!ëÜ\'cõBÖ›àÏ%+lñB„l²ÙÃ×xØ/[„\+ä:_ïá7‰ÍVÁBš„4 iqs«—Z¹ÂÃÛ„o÷b©7ËS›—oàBv–ѾQÈ./È[<|“‡w‹O{D{¯›Ûeúû„ìwóѼY¬oñr€;½ÔÎ]Bº…½|{d†^±ì“§[…Ü&$$¤_HXF#ò4 äv!Q!ƒBbB†„ 9äæÃLÎLr‚‰û˜Êò§g‡’ùiÛ•IçòÙx2g*™ŽaŒ©.”ÉNµM玧&ÆÚD=×&0Ž G;#‘S¹iOç‡ã©¹„GàcòZ #±`@$U¶IWo *‚j[ôE°Öô…c{DP£ vŠ –©² vÅ"æLë4½]"¨Ã~LA4Ø3t‰¬ÞVŠÇD°žÉc "}Ý‚7Ø8fá6>láwYxS…m¿èËf[k0h®â/ÌÒ|Ѳq  Œˆð¬-‰ì”ÏéÙŸ×%þ¤-ˆ`ã8Û{ {D0b ±^±ÝéŒ|‡©Hh¤'Ù[mö…‚êpwޝ¯[6êxi¥Š̰;¾¸D$>:ž²çtÆú¬©ž^<-{Æf [ F‡,dz¶æPø¶päéÝsö®û#á DϹÎÖÂA¨Lq¶Ø²þ@W Ûôع1M̳q&–Êœg4™Ú»ólÁ9¤Ž}hÎ3ù¬PÈ‘ä?aª2åÃè’ŸÚá± rUÛ«)]‘Ê ;“å]í…̵‚åBõÕƒ±@ÿÀh82ë?‚ˆÈøûeÛèQ¦Ú‚Ñ衾X¯fñÊbøÕŒ–ølïÂCýÁhŸ”Qécö&¢Á®HT Áó%Û¿a«’<ß·CC¦`Íý…ë"é„ ±ÂžÇ=b%oce!5û—ÖÛ+!6J„õå“éÓ}éü`2=•Jä3i¦ ú•KdO$²mSêš*Çu¶3·¨,x×2¼GÕ™¹±TB›¾|,“Ié8Ÿ8¥/_>Ïëú¾¹ô±tædZcIÝb-àp<{MZ7?=˜ÇÞ°…¸¾býtf.[|¨n&™.>R“+*.Jä#ÒœMÍh®®Ì„”¤±ÅfP ÐûAé¾d:™?À´±i•ŽÐ×<ÌÔ°ê¨9ܶêpèhüD¼-OOµ‰ÓS‰lÇ­bQ>˜ëÏÆâ8t{7àÕw@ðÔxb6Ÿ„L_dÞ"¢æaÌŒŶ­ÄaÚµÚ”Gšß(Ý$ñl|&È3µ7i« æ³8‡Ý|0‘Ëa ÍšZdìhb<ß^×7£˜×œ¶j™3mmZ©Ü¼r7ãn÷æ§³™“Ál6g6-ÙR/X!†ëúäT:“ML,žû¡x6m®¹aµhˆgßxJe’jØ CtØ !G„ü€p½T­ˆ:­¦ie4£‰ñ ¸œxdblü`<™šËâLv†é©ütÛ@61ž”¸ùÍÀø“9ÿX"•9éG1$gæf”83é¿AAëêXÝ2>†µü3ñSK-wîØµ{מoÚµ[¦pt½Õà»èe$ Á£²¯¿§¯ôB¾*äkôÄpµÜ0øm7xÌ È zAl^òM!_ë­ÝÙ$Lü™D.ݘ÷çæfg3Ù¼_îoìÂåÙè?@96¾¡b$ÖŒšš}K&IÈ7d…Ý«ÎdÒùéíÙD.“š“„ð7Ú}¸1g-¹oËt&½WM&=ñæ^8Ù o‹ßò]!ßê–gnç\25!ÅS=”V‹$&̵û ç ƒÏòÖNºÀbÑ¡ švhÅÙa‚’ƒ¼k3¹Í‹#2‰Òü<]´]ƒXÚ/~Lþ•7l‰£‘Øï2¨2$j>–±NåHS‘^böüÉøx¢ce›Xí_©‰ˆëNLÆçRykÍ®_tÍ¢“W&·ÃoŒYqQ¹FrD’¨«è±mXyËJ£Ê'S0šNœ’Èåb™Èx>žIäsËúæª)„Ù½È~l,>GÖàœð’WïIf7µÒ¶Fóã(h³<0ô;€i°ØKÀ ‰þª“®-íÏvpyåÁK·zuF__y¬á¹™±BÚ’gƒýPÈT7ÓN®çž ÒÎ+¨³¯Ç2Awd¨3Tzòý>3m^¹ˆÊdµŠÇ´Å¦kVêv#|±äLB)ûDYò~´;x00ÂÚnˑز÷yµT2¯,+•š¶ßu{?ÒnàÁÈh,‚oß]‘pwQWì—b5áÆ%潑¡¨n¿iÉh_x(ÔÇ×.·¤´…ji_ëÃäw!<9äuÈäGÇë„üAw3ÝeÊFߦá8ð˜†Ç'4œžÔð𴆓ÀG5| 8¥áà´†3À³>œÕp8¯á9à> |Jç߮á»ß¡áw¿KÃ÷¿[Ãï~¯†ß|¯†ï¾_Ãï~@Ã~PÃþ†? |FÃg?¢á‡€ÖðGÑðÇ€?®á_þ„†ÏŸ×ð'?¥á_þ´†øQ ÿ*ð¯iø×Óðoÿ¦†/FÿüÛþ,ðç4ü;À¿«áßž×ðãÀ5üðç5ü$ð% _¾¢áßþ‚†¯QÃO?­ág€ŸÕðsÀ á?þ# ÿ1ðŸhøyà?Õ𗀿¬á?þs ÿð_jø¯€ÿZÃü·þ;j—~ù-PÞûMþUÅ¿¦ø Š¿¨ø×ÿ†âßTü[Š¿¤ø·ÿŽâßUü{&/‡ÿH/ƒ~_~Jgð’–ÏÎüɛ韊;ìá.:ì´†]ò⨆k©„ä7ɲ–ÖæËäz¼ òC¥Ò@¥ÀD>¨\¥’‘M—©t©æ-Ѽ“<Ð%º šÛEuë(Cw«ì‘OQùUrT{.SÙ3ë\5ä}äÓJdˆèqÓó5r,еTâ¦sÓ¿³›þëWÓÍåÐ;ÌE_QîÇâò_-—©¼Åñ$9„8[ZŸ¤Š–†'‰[¶?OnÇro¿D•2¼Þe <ë]¦Ä¹¸r?¹p¡k+ãÿç´L쀘C昫è•ÑÑ[Áq®r ¯^ÄAø>kÆÎqdë«XŸéqÖL>â¸SqlŸ»åÁoGù(¸[qâøYð LQ^ ^/GyÚl@Ľà›ÁÞþ8Öfø@û¿v àhZ¿y°äˆ‚£0{ÁGÁO¨õÀ÷‚O*>~|Zñ¤âðÑ1~L饔|FqøèøxFáYðGÁƒa8î½HU󩟵øÔÌ_¥Ú‘–ªÒÇ]çó«»/^CõñË´ñi˜ßxŽê-MWµ©¹¨°i^ð²µT–¥¨¥wŽ6c¶ j¶µúl¨ô"mž7-® K©±ÂT’åL¯JÃPõ‹êEÚg®Åç:µ'W‡‘þ”.1¯r½b+ެbQâ+2€•¯·œÄÓ›Ì ^¡­©qÞâMŠ7+ÞbÚ\¥Ö‘Ë´­åôæ–KÔv‰nëB5’ÿç|‹›œÎzguÍu(*óU–AV¿²27þ´’fú ýÔ*~Aê ü¡Öç©„ç[Ãp¹ÂªFÊP*™¨*•¨*•¨*•¨*•¨*•¨*•¨*•¨Uè˜VID­’€VIÔY%aâýŠ£$xU&¿Sñ»µ¸¤(×µ^¢®G©«Õy‰vZµ¾Ûò‰vàs#>1ÅGÏ+~ZøEºi°k¾õ ½eIÌo’˜#K®+ì.¦ ‚mÛ/ÒžK´7|:Ú]ë]W¨ãíX6²¥0Rg\¢}{•xû<9¹‡c|ˆÚ9Îi>~7ßÇP»:ùÍTQú=î¦ÿ¹Ùétùý7ý¬Ì$¸(Vjx)íUóÈN¯©[<™ô¡YáÛß¿xæòwÀ:bóØ®WdzWÏÞÖgéÀ%ºùy|ù T⛼B·Ìo»Bþmó…œ,§’×h—›þ·"ÀNÕË5ªom2s½é܉O>ÝHùà3æÚv’¾J^ùaKyܨŒª­Ká<­‘‹ç<úâb;qW‘‡ì´Œx Yÿk½ Uy‘V5Vº.SÏTe z}µ%&®¶pŸ¯Îmâµ¾ÕW#5 A%¸­Êñ”’l´$!ŸÏš²ÁÂ{|ë/Sÿ´Ù‚á*W»5åu– RåxÎ÷º)ÙdIªJëM“-¾½ªtƒ‰¯µp´Êñ¬ÏgZ4Z’ÁEI“%‰-Jš-ÉТ¤Åzu ÿPK¦TY¦4 PK8A.org/hsqldb/server/RecoverableOdbcFailure.classRËNÂP=·TA(>@Dj)š&îŒÆÁ•ÆDönjMÓêm!~–&~€eœ U0TcsæqÎLfnß?^ß`kI”¤)§‘†ô*Ò«¦É«&±™D!Ûsî…<,›3äÎo¬¡eº–g›íP8ž}Ä wn;´B~ê÷‰“áBøâŠ7d(ŸûÂ6¯‰Òïšb”4Ç5R.Ù€Bœ%©ZµI-yÎ^fçœ=ÿùûó7€ tæ0EE,iXÖ‘ÅŠ‚» VuTqOÇ}ÔÔôNÔ‡:¡^ÀšŠ5<Ñ`3äe&õ6ÃÊÖ0î;Aòuàï;‰ˆDììþb½ £P¾cpÌÙ´­ïÈs^ÔwveFý޵Çë}Á#BÓÚã0Pâ(£Á°xùȇÃpà‹XmW8šXWÐÒàp´ñTÃÇ3»”Å\,΂õã€íØ|™`—c¹Wö),¯ìÓ.v»?®ÁÇgû,–ŸCà;]ìZöyz`× vƒ`7 ölÿ">¾„/cϯöUÁ¾&Ø×û†`ßì[X}“‹Ý̾­³]‚íìì~«‹ÝÆnÇ%Ü=:»Sgw¹Èyìn|À÷w°Ûw]d-»‚}Qø¾`÷bË}‚íì‚ýg¸_°\l{!¾cçAÁ’‚íÇC:; زññˆ‹b vX°Ç{\° ö„‹–°'±÷S‚ì¨`O#˜g{V°ŸöSÁžìg‚ý«ŸìXþR°_ ö‚`/ ökÁ~ãb¿e¿ì÷‚ýAgt‘ÙŸðñgÁþ"ØK8ÇËøxǾ*Ø_q9ÃY_ìïøñ:>Þì:û§‹ìbÿÂÇ›‚½%Ø¿±ßÛ:{G°ÿ¸Èì]¤Í{YDýÓ_ÿÕÙû‚ýO°ûP°cì#䀔†ãëÊk§‹„ØÇø‚q¢sšÃç.ò×ð-Kðl˜Žë |ËÜ…¹ø0rH Ï<_ðq‚à°ñøpë¼Pð .ò$/ÂÇiø˜ˆÃ'¹h˜{\|2/¼kJa>GMÒùTyžµÂƒ{ñ1Íŧó‚ÏÄYø1[ð9X–aM¹à>Á+¯Ü/x•às±mžà§ ^-ø‚Ÿ)øY‚Ïüll9Gð‚×àëBÁ ¾_—~.–K¯Åù‘*|>ê\¼ž7¾\ð‚¯Dtñ± «o•Ÿ·à£Uð5.~o¼]ðäoŸàk]|_Ä:_ç‚_ øÁ/|£‹æ0¨¸Çnüb\Ô «§n¾Yð.Á»ñ5(øìÒ㢳|lÕy^ù%¹|çò^ÁGûÀ|—b[Lð8âŸÐy?˜×òí¹ü2~9>v`Û.þ)~¥Î?-øUø}5X~àŸAŸüs‚ïüZPRþy„}>®Çž7àãFlø>¾¨ó/¡ô|Y’ü+:ÿ*¨ÿš‹.±g—ò¯ þ Á¿‰¿%øM‚ߌ°¾]‚ïÆòÁoÅò6Áoü´\ßÖùÁïü.Áïü;‚{܃Á¿‡å÷ñq¯à÷4󽸢èÌA&†Ç{Ø|¿à¾_Dl·‡u>(xRç`ÂÀq`Òàÿ¾„Áü|ÂÇ£ø8,øc‚?.øqü‚?)øS‚ü¨ 4åi„Ÿ–ðgÿ vù©àÏá÷Ït.mE éy|ü¿Ôù¯P“Al^üEÁ-øopÜoÿ˜bþ{ÿ£=ÛŒulÝðÙ‰cuá@<ŒSâŽËÖeý‘îppeŸ”ÐFJ TÚX´/K„°ï̦h¬gîÖø¥áîÍsUóÜö½R’§šê¢‘H{0AÉ$ç°phóÜ•øVh®z÷æÚp(° 74]ؘDzæ¶'b¡H´gwoîØÑ”/k‰­rN†ØlpÂ…éã¡xbîJøLÃFëÞÜXO Û€k‚麡(àui0ÒÄúU”ˆ"!‘Íï \Ž˜e?˜&?0bÅj‰@Ow&¼ómâ%¢]Ñ0%Å)š(ÈŠ+bÑþ>J&:`8$-£]Û‚‰å€D4¶ƒ’YX€KnwvC©q6èH0a²Jõ„.F¹ªOC,QR”Þ%zY`s8˜êÕž$€>"o…ƒ˜œ^Ó„âmÁÞh"ØÚŒÈÖú|ÃkN8Ú³>JS Cѹk€„ U  s‚±˜Õ‡º€’¥c amWIÓoíO$€õÑË`šq=ÁDº L(+Ï´X­.Ú¢¶( %–À|eåë ¶¬ £kk°k[[$€±ö¬Íƒ5wmkôu )@!Nƒ’©ñPO$® GãÁÚp¸}÷ã`áÀrèü@‘-!躦v5\Þì3Ïx×vwÇ‚ñøH”m9õÕÍx°%Ð N+k¼à»*UrÖ(-+‚µf;{·úÉõAPÄè›u+ƒá>Õ ß )fM´ÅRìØ”â¼Ÿk¢±„¤7èh>~Ç¢Ýý] µ¢ñ©Šu¨ä(:¹ªÎT®|›Ã¦ NÉà”¨Ú]Qw~)©u[¯õÁxW,Ôz R\€5·E£€aÁVi S|DÆ8L©Vù:ˆRuþ')‹-ÑöñD°·áòZ"¨D!ªD<ˆ%Z#(«ÝRN³BñŽ0°Z‡2@KSÔןHÙ²å±hïòPX²i4“îœ õ™z‚;nq2#øu45â™Ï |™†¦wUÂ7>>Z¤ô¸% `›œÂ4©,£,I½Œ§IN”Nò P“Ú9Pm™©lx—¤ø¢hŸ#1V† WmË@^<˜p:ÅÙe§à†€|ô6ÿ¸,1èlH<ã?.G/û$™öjh—’¦ÐfG¢‰Ðp YeÒJ‹ÃA ±EkhéC‚AX˜ËW E´?ÖƪúË*iÄÌuO*˨9Ü-;¯%¶v„z‘¢½}YiZW—¬15Ñ0ççܧ€€8¨rüŸÛ& )cS•ÆÕ/kŒt/CÁJ@ÚHj•§(ù@S2&XŠÅ ½}‰sÂ<'`0ÓSx¡-ÑÚX,°*ûuþ’2;õËPòe=%^0;#BÆHbup<à$êüe—ÁŽà$Nw °üï`€b‰ll„C‘`3h›ÔEk§ðšüN‡µ M¬?q,Ĩ2I7qS ê`à„Ñ¿XUÈÉTµˆÛ ƒ ;2x*ìBÿÖî榘‘#ÑDß2ÛEÐ0dïP¦\®.XÞÌyóæk/Ó·ËÎbQWXúfƒ-¦G ú}Ø OÑ£ø8“d3 z½Å ‡éc+¢GÁòÄdY–„És:ù2ƒ¿ÊÿŠ¿ÁšÊ½`*‚±`·Á_£/l=fÐ×éËÒ: †ÞPÜ ë„‚€1‹)0:ÿ»Á_çoúLRt¤üƒ²Ôtt7`Ïÿ3M‹:©‘ÿ'ÿL…ar/¢ÿ¦ÁßBú”¤?ƒ-Dòî£ôÛt—ÎV”é7ø¿ùÛ:Çàÿáïêü=ƒÿ—¾˜êÕ½9:Q…S¿oÐ[émv2QÕm I•Aï ·ôvlÌÙи¢¥µ­¡~£Ao¢7ÛñdÕV!ÿÏàð ú(=dÐGè¡T{ø ƒî¥7ô]úŽÎü#~Üà'øÇÀË•íç5Õ/óª¾`««ª«@‰õíÀ), :H“½—ÞgÐýçoô5 ^ûʵõ­ë[€‹­kZ[VÀ[]Sk»|Ënmijli€ªµ-«[d·ñ#ƒ2ƒ² :64‚´/LÉœãA4?Âô—•×x»ì/o,¸¥?ŽââÞf½Ÿ> kÔÐ}ô@ㆦ!3f–pa#y‰ÉIú!¼,`ÞÈXÙ ? ?ÄÆlƒàêŠL†D¢›âÒõnBì M§àæ&›1å„7E#›,«bÐ!zÀÖ ªú`ÃúPþ(·ªÏ¶wý/ýŸ´DRáR º& -GsZ.ÛÐ -ÏÐòé;0wÆ ɼfr€Þh0ƒå¥­Õ ‡&-À˜no" ²”pÌ j­ÃG®Ç a±%cDUæ”t#üÃO¦hŠÈš[+4èÓô¨yUò_)âV UÝË m‚V$õ(-ä¶Êôj ¯Êd^?"¾‚ÊBK Uæ>éV„v•á$§)hÎJÖO”\I•©ðH…Revò_7c+]ÅVe*¢’AF™®M24.ØeGYŽ¡ÝfØeX1ò mü1C›Œ²›ŠÇÊRÖ Ÿ†V –K+ÑJ m òÓ’LÈêSŠ‚4€ÊþŠˆÛOLR7¡g6èèƒtʦÌ=3(‹z¢>L54/ã1 ‘RFœ’*³¦Æë̺½Ó{#ýáðBo$êUû ÞD``ÀNCO•A‰Õ|3ÓÚ|ÓÖ©Z/¢2Í`.úŒ¡M×f@Ø•’êFÄ(Öß¶ÃaˆR¿¥Ôçcpê\A¥Y‘†?ø¼Œø;Æ+€}Iú‚6ÓÐfi³ mŽbUNoh>­Â²éñ½®Uš_«ÂåÌ5´yZȪŒxC;À¾zÐñßEï6˜cÁˆÐ·Ì ß¡ß5èz'v»Yùpky”‘o¬ñÚé(VÕhÅ<‡þD(lê~G–‰9xæÊC4Î0´3é;†v†“a$›Â¸®Í7´³Q0©-´ŸCŸ€xdtœ±e (<U[€][hh‹y7𯮩±Š5m kjÛÐsk‹ m Âu47œßP·¶£¡ÆÐÎÕ–bŸZÑeµu+›[ëj ’3û¶5´¯mêX»¦¾¶« S –·54´w4w@íi+Íê í íí­-µm#Y íi 5鸴Ôw´Õ¶.ËpÙu­ÍÍÀ¤¶Ö¦¦eµu«N{íº†5­-›Zj›6µ545Ô¶7@ˆ4id‹9Æ›†k{Gm[N’ZŠzc{]kKKCLæqtnè0«%®†V‡hM‚–MX±)}F˜hÊJ5];â†3 ·©±„£^[ aéJ‹¢ç­ÂAkÀyÛZ×·._ÓÃbU]ëÚ¬YŽ5†‰¦ä’¡­â¯­ÔµFC[¥¥J­ØÈ+7#½ÝÑ (D“ ³˜:Ko'2nDƒMG‰\ʦ¬Œ•ñ•Mó¢M“Ýd¸ÊìU[r^æÈ.« /L.fj8ÔJx£[T/kLâ“ÌݺÖdhͰ¨(ÙØu§àöÉd_tÛÉÁ¸”Þ”ØÑÔµVC[£gÐïÑï³sh‡*°4Û»!„¹P «ÒÛ½JQi¥`£·À¥ ¶5ÀŸ‰i)#´fU24ÃIŒ•-$¥§ž4"™hs¶>èÚŠææˆœ:Ô óMØ(çø Þ™Ì0‡; ­¿ibÓ²ÓYuʃo²iJÉ´OÜM0´v­C×ÖÚ:m=d¢†v>ÚœN`ý-ý ÌÛŠÇ+’l@cwKóôÂ[¢±Þ`÷è"ÃKN–ÄÚFí"Hd mÎz±0´Íô}]ë2´n6Ä%eöZú{7cËa®@ÂÁÉ)½‘ó#ý½ÁX !A0¯Ú ìôøîþ¾p¨+0Å[·j!˜%ÕÄ~#“l§7›fnI •:šÚç¶·7ù!§í@Çè]U¿¬ÎÐ.ѶÇTèK@Z-ŒHõÒ÷ -¢Eñém©½O³6²-áÐÊh<µRC»T+ßQéM ,[7_ `h1 X™@?_¸ÄÕŒjÕÆ=.`Z»³Æ!f9ëǦdm|ìuŒAË-¿‚ë{L!zó¨Üq€Â‹É•×`^z ,œª– ™ÁJ°ª4Ã΃“À“Ûd;â5baÞ¾±Õ!Síwo—™¾¦ •-äH«’1Ð1óíí]jhÛArøkÚJ°x V‰<Ý:²ðbLíÝì @æçMlt½øA|•n|±öˆCêØÛÊ~†Á—i—ô_ôM+D‚§Â¿4ÚW©eŽN4‘º…¶ m‡v†ÏV"à ïT'yÍö4újŸb« íJ4 ŸFݺ ѽ¥ÐåÅͤXtÂÉ—vÜQQÜ>šcÑôm$å+y÷ÖxUS…Rè]Pβ |ïDÝ”±Gƒr¨ÞHðòfé£a­re×УºöCû¬ö9ˆ¯€oàûƒ^0xÀÈ0P‘DÁ–£Y©.¦”` vbݘ{h.tf!6böŽE}jhÊIܦ¼VÐl öÀŠ`…æ®@n(^ŸÚTÉÅ“»í–ùÒÍíeU(­åUºÂ n ï¯Åz¤Å²#°U™nûüÿ†Wùxˆ±=˜Š°¼‰X Ë«šÒ[Û'ßv—™#»8³SÝ&ÙÝL§š0 J¿ŸÉ#9jä…z¹y™D#™Fo¤µ„ÒobR‚·Zð/kð2,wÓ[ ÐðnŒ,o7Ë;Ìr½S–wÑ»eùú]9îsÜ€„·Lä÷½ô>Yî•õ^ÏåýôYî£BÉð”,iÊexåE–Cô”õxì-û”%ÃÛ6²|Ô,ÓÇdÿÇe{;¬ïÇô x> _ã … Éò=LØò/‰(ÞË2›Ý„ÉælŸ¶Ÿð}²]ÃË[fûl¡!“}û‰æ;H²:÷“ìA¢ûè ¾â$ÉÙgÂ|š>cŽyÆà_-]ý]Ð?×m$IôÍwƒ—$)H’ñ¾$q/.ÞED‰¶w“¼’‚‚;ˆ® /)ÝEæYƒ q0ttO Yî"ørŸ¦ÀÔhãé³mˆL<Wâò3›R?4WÕås{ÿ‡ÉäΖc‘$ŇHI3¾V&I©ÿ‰âªÑüOx´Ã°’ÊGï"•¥Õ5šã@Í£%ÉT…¾zwr:0ü¢Ï=M"ÌH™NfÁt³H¹,Õʉ6 Ÿˆ(!:ý9¢þü0É&ktú BŽC×cÄ\ü%àÎ$îÓL!0PŽ÷ö“é)ªpBsé¯ñP†ß ôEsÑg›â1Î8JÆA1Ó=+If<¬J’9IRö€ J'¬°HŸ¿¦¿1tà Ê•%»$ ™Ê¯|’ ³@‘a˜]*Ž‚â[ˆQŒïÞ + 9ø^\ýMMç"YS‹yN5¿ýä+ÇœÑï˜Ñï˜Ñ²Goθ…z2†T9@U9@U( |‚‚Célz3ÅÝs-]ý£ÝXd2#çA2Ï}ú©¶ºü‰þ9ƒ¶Ÿa5ÿ%có™VóKôe³yJN$Ù|<ç…Î"ç$É‚½f÷W2 [cÁz5CãB«ñ¯vc™Ù8Á£j/BÕ^œ&GF­"Îßèk°_bý» ÔÙ|®Õüº½8góRk1oØ£¯F™ó¥ZÔå¥÷É>uR/ˆºØ|?]òµƒøU¸—5 Iî:xºÝõð4Ü ðÌv/oªH-ª”dŸ g‚8ü# þn¢ÖÂ*¡FvúçÉäà_ôM³ñ)°CÙPÞl” Ö`Oœö¾Wî&(¸5Y>÷j¬v7¡õ5!¹X@‡ä4èç )é¬ãÐÚ⌔$Éš0ÇP{Ô>FÚö“vl8/I:j´ƒdm'Œ[ç÷€çXß šu¾ 0Ÿ ,® «Ì…O€ _§oQ#¿ôcbþ[±ömú޹¤ÓLÑvIÉëL’ ,ýgŒ>}†ì>N&_h5¿;ˆïÑç"GŸÿÒ÷Í>L¯(|îMIrqªÇÿÌßFoq štl¸*w]ÕÙ 4ïjÒ**‡Hw —?I‚»Hßkst‹âhž»'ÅQèµØQ£yÐïLÖ‘P'w_Ò>D¶ÖöÖ«H+i³É>tê8ñèôÚä/‚êÁ5(¿ ¢,_h!è˜C$|¸bˆôî"Ú>•ˆ…JÔF¥ÂÝç¾Ô"ñf_¥Äjb‹4N( ç’z²ÂFiÑ ôaðöä„.ì­Bh?nãÖd’÷lO’„B(ÛÝßd£´ÝBé²u¤g‚ÊË×§y6Ð$z‚~lBn7à ن·Ãt î+à¥r4à «Òš çþ¤ >uŠTfž$Ò¢Í*“6g¥OpeFŠÌ—ŒDÊ|z4eÊ.µ½&\:Ü«,ÄGPú,¨¼ÚF1îˆ'L¶¯bœaµk™ÛÏ´Ú³ìØñL2ƒk¬€nPùƒì“@øì6¤AÐm)RX>7„‚¯x\hÀ¤QôÚ1`mLÃ&ÇsŽ ¦Ò†ðù1 \$!‘ë,(®OBæú1@݆L®-}ëL0µÌArcgÅ~ò…$ùbJ7¿ô ’øåÑ’xÌa°<3X}ÃY(ïTÚ„Ì€_ßW›+½ä§7Wòjô<¨ÿšOþz̵`|´ç›@U» 8°G}|K~ܤ>n7Ë÷oC4Ø\y„Ì…eìêÄuUºö“ݘå@¬tDÆDî&ùPÈš$¹%µ†ñ„'Ót– Œí`Ød< +jg`ðhݤàuàpuûÜ·šiÐ"•çúÜ·AMñ^Ÿž$·"wtúÜ{ö“; ƒ7ï’þšA²p–èoa°¾‡L w‘ï ÿ§y`ø-Ÿ{@BÛ»šœG:È=&’y$ë8™L§e¯ÑÙx :ÞÏ5‘ZbjålŸû{N¤Ž"RßWHAÊàsß«@[ëÎ&A ÿªÂ„µÐ„5ܧœì¨ÌìPplo’ü I~èÄs\ͨȶHaðOLRª `,M%Ÿ“}€àýƒä\äã¹ø+¨J’´‹“dÖ‚:Î÷<8Hf¨‡:$ï'ƒ`o̯¤ü:Ô%å3ñj÷(# –ªöñl"›dÇŠ* ØB¿ßißKð%‰KчÊ!m Ÿ¯i€ñH Q¢*Š´ê#@£%;5Hÿþ57í&d¿û‘CK€y¾$‡Ò¢c$k™‡×¬6´è¤C—¿ò%6>-|RhðùYEYæÔð(ʪ*ÞCK,²‹3T%o…ò‘¢¬œ5ª…¶cd–UfyËY€óe"\“åÈ„kp…“1«-õdA2œ[“ ¥'û°DÁ£S<Ì õÙ“G áÉÆ¾4z‡©<#W‘›î×ì"·ËR¨ŽˆaH`²1…WAàG¤åCaöt»2•0Cp¦êÌ”™Ñ +ˆßdÛÔ­6=ùé¨íh|•b%eö{.Z¹ÇMs'ñû18í'RL¨ótVL ðvž ¸ø…‘W5¤q·‚h@!NusåQø8Hžì¬t?µŸipïè.08P>$Ï ¿“‚\@404šãÄ¥³Òñ€ú6Õœ¡Ò”߉˜!î ,“äYU<‘f{Oܼ6n>Ó¾O±˜0D~‚«ü©s•ϘÛDøÇvæ¸sÍq¨™Ïí&³|NR ‘Ÿanòø(ŽPDÃKÒ&°KLÊ£ž”o“òÖÏ+ǘÍl­È̘VŘl¦š—ݳcÆìÏí’ÌxÀþ¢ÅRøËõþ‚š$ùÕz€ô½¸~6O.Ü”!´~ãͺ_¨ÒúÑéß#äÑ“·§Áº~¸ô G>†ßP÷ø2ÈDòŸ~÷‹Iòëõ~@õ7ø2@¿æx¿Öïþ­Õü»$ù=TŬ*÷F´œïwÿqDUƒßý§UÕ~÷Ÿð2¿û/êmŠßý¾A¯—%½ÈF¢þA៱ÁpVÕŸíw¿"Ç‘×üîWÕÛý¯ƒ<ãwÿmDUß_F {ýî×Tí¿ûïêí&¿ûu7TJ?›Èt~N”…~÷?F âû `§ßýO«ù_r­d¹ßýfZ•ßý–õýo)'î·­ïw˜ä?VÕ X…:ýnšL%“Äq²_g³Ü¹nÛ“ãÏÉq»ssrJ¡¢-þl6ÇN.¹´ø} “ä½Å-´F+aw ~æ¿-%ÒJC\á"ï£áe{ȹí(©ÆLô?ÕdÛjúh‹•êCKmŽùÐ$VÛçGS~|oQVÊ_CÀó1™Fe&¨Žê Ie¬ÜtI]ÀcåTåÐ<8ã ˜±ÅçþAÃTùƒš /)ewA¨ž¤D¾Mž…Ðrš^$â¡®ä|ˆ2Ì~šý8öË‚~\öËÂ~Y‡=Z!Õ’4«& ß²ñ üŒ' Q}¾Žn®´H—n®Ô÷0ÒÑ•VH?Kú¹RO¶ôs¥­½tonQªº€B¥à• i®2FU¥ÕêÅ/_ ©¡>+ÌÏ<ÜíÕ“4ßAZQÕƒ^OŽ£4Ǥ«h¥ÇIX§9C2¯[‰òs@íÔ¸-æ‚WØ\iñ§ðEjËô.2Am—%YÅ{wRp¬o°ÿ\°2ZˆN¯ï:›Œ; ¶–èXÞ8 ùöÓ¾¸D¥2Z( Ù´"E“ñ&%J,JÈdžÁAêîÜO [T'Õ£·C%ÕÈ•i­Ú¢r°4Ú%iÔNŸ#Eíµ³Ò©‚!»¨XFUª8ÅÙäOÒ &ÅÓ†"íÿ2¿u4‘jhL-ßÉèÀLjI*º ¢bmQñn`Q’Ô…áÒ ‘0`)Ãöõd¹Ò‰ÙDœ ã(0 ê„Bg~)ÇIœ~H6`D80ü³“›úçîyš*’tòb;ÿÙ%™…´¸Ö¹`IIé]$«t±¯ä ’ Ÿä´|÷;Þ«Ôû#®ArÀ|Í$˜=hÉ 9Ó” S(i(×€N¥ží/%ó³|EY ”ÓPBn`Óz:FE@©öyÈÀð“žl¥ìºG?J¦¦zÏDîfÛb50¼[Ñ Âc$¤‚UÍ£+ bVù™m~ÂÏvootž e >ÍoÝ¢³yP,¡Ò¶•KE\$IíºôÙ ÿVȤ¶æ8ꎸ˓tÖâƒt6Èú”õ™IZ†ë-Gb܃o>JO0NYؽb7¨ÒðKž,·}C´r~ö™æ47UJžS+~ábÍì$[ƒÖLGë2o7)I:]Ùk”¿(ûT×8âìwÆHèëü€Ö²’úMÚT}˜L”3ŠÝ\1ót O³ÎÎEÖ†¤uɇÈuþ0™LrÍzåc‹ÎΆ‡Í‚~‘q 'H4ž3LÆ„ñ©µŽü cø‡)¦+©7]É9æj€«¬ÞWK+פ>ÎQ[•M>`B3,£%I[­ä Æ†Ø£âj²ÚŠ«MÍhª0õâÌ K-ðàe&DI³[,bÊÍÒ>3<±¤Ô8'ƒÀI™\@¦ãÿ ÜôKfF² ÐZ£ìîŒ#äüÎKñÈá¨|7_°ž¶ M0¼ˆ=n­yÖb: ²}Ö™ <“,ÃÑž:ä»Jg‹¦j@áŶuÆ<¬Æ­Ç9 éù(IÚiªD“¢ËÚO/ S ’!tÛ`ÆCôB<6ºHñcSAÁ½X-¦å tú÷ÓÍÍ•€ºq€¬ôÔ)êM[nÈÔBºÍá†%Þj”W-ŠöâòUUØ|ƒnn*¤³A4ï%ƒdˆ^Bî&‡ÈS@X,?¢a,i>ÁðweùÍÆ’æÓù­0ä&m·_5L>AVêl 褫­ùWèôù6øå€à.µóè´Íê%Önhm¦}¢!±Ú—ÙíÓÌö"Ÿ†¤ÄNr‰’²V÷º w1°“µ-UgíáÒ+M¹Af,-(؃šTH£)KŠ*Ø'¹G¦û†è¥>y¬=…/)Å70€…>ü‚O’÷ þxGÈW°HÒØnrz‹ãF•ùz;™\¤AŒ0ÁÜeijDé=_QìÍdõÙ/íÃö”²’ÊÔÍgÇö°- e”â~'îåÞî«,¤—›™¤;vAÀTH¯P¦æSö4x»RU|ÃÕ!zÕ1Z Á÷Ŷ“+ÉÕ Hב½ä~¦Z IØ2’ç:AfƒpÐcdÒ RLéùxT 1UÈÃ1R¦ù;àE/«·;ü=2Ö9D±¯’ˆ®À ¤–õk°Có|óH’1uJ(ÿÈÌl›Œ›ØçAòðƒdžoˆT'éÕ F[ÁVšœ¿ì'FÓ&Ÿ;6D¯i2·Ãw‘Y0Ô6ŸÁÓ%^mR–^í>}ˆ~v¨õç øiqÕh~7ݱ÷&<Ùu©–Cd3X׮͗iº169JòÒk;µýôóÀqL¡p«Ý>ö:|\ÒAð¾€q†e[Ȉ1t÷% ðP%@ã÷aðõE`¡'ë)÷è6²_2:Z G®ð äË8äË8ʯÈ2I¿ºí+D” úÖqb=É9AμˆåŸÀ“NÌŽ²¯N?¨…ß0)'ÚTÕ Õò¿ŸHkPP=®@°F¶jÔò~B#[m«èDÉv‚èѯ?DæYg€ß25øz#ý&p{ÙÅÿB<ÿPKoÉe+W\PK7A#org/hsqldb/server/ServerAcl$1.class;õo×>#.vVvF~×¼äœüâ̼tßÔ’ŒüvNFÙü¢týŒâœ”$ýâÔ¢²Ô"ý`0嘜£bÈÈÀÀÈÀã™——Z䜓X\œZÌÈ •X–¨Ÿ“˜—®ïŸ”•š\ÂÈ Ç L ÀÄÀ $Y€ˆ¹€rŒ žPKöpⓉ°PK7A*org/hsqldb/server/ServerAcl$AclEntry.classVYsGþÖ’¼keÁЏm&à`¶…Ž NŒ,bBVÚ‘´x½+vדƒÜw~yIRÅCxH¨XvÅUæ= ïùTÅéY]S$.oÏLOO÷×ßtOéÏþXð"¾#…sÁkB¼.cTÆù0B8§`LŒãB¼!Ä…0‚˜PS0©àÍ â¢—Âx SbvYÆ´‚·\QðN[0!´WÃ$Þ•¡)ȇÑ%\ÂLN¹˜…º¤ ¬ÀPpM¬.§3B˜BÌ aɰ8 Ü0˜áɘ—š×Ì9.¡m:#!8«¹3Ô¼áeL»0“3nÑ–4BfšiÚ7h~YBûqÃ2¼äØtfärü"¶u²Ü”ó´ÂÌy­2©åMÎÞ,ðŠgØ–+AñìœçVIÂÖX|ôš6¯¥LÍ*¥jÚc”©ÿƒ˜¤³šW(s:¢Xq ®^C×<~Þ‡ˆÅ/ª8‚³2nªXÀŠ["æÞ–ãÓä%ÍL;¥¹YnyM0v<=3g˜:w$ì·Ìvi–Ά³ü‚Ç]æÎU*¶ãq½ŸY¶ÇT¼‡÷…ø@Å œ(>¤ds^0Š×™„ýÌ5J­ šå1bÕígù9ùœ3[Ä(k.†üM/á Š’q[ÅGøX¥*£lºZ@'æ,Ϙåë²8’Ñ\£À*Ž]r´Y¦¹.wÄ+j†ÉõAÆÎr‹;D™ÎÄý2“[%¯LQ“,æggºMù‰¤|¾YɘçVeÓº£a=¨â«8ƒ³¶oä°X¶§uݹIÓ*>Á§‚©ÏT|^›}Aúå¿Dõs:;6¥âK|¥âk!¾AVÅ·øN í”Re÷º©çS”Ùôðj¢}ôp’$šð>7VÐ5í^BÏh’âFV#‘ŸÐÛ@³»†&²Œçh¹RÅBqáš’Uñü¥dÃxo͸“ðFhgÍwÞÝw¡ho-ÿ@/üÚÄ>†à]c›ý{z íÍ5i™5ÄS ¯‘ƒ†*PS‘!)O#[Oòd=É>?3Áu(pOÌEªÑeì_Fß2b?@¦Ëî5Aµ# î#>.fvvNvF6›Ì¼Ì;FQ Ÿ¬Ä²DýœÄ¼týà’¢Ì¼tkÍ0Fçü”TVv^F½ü¢týŒâœ”$ýâÔ¢²Ô"ý`0嘜£ÄnùE¹‰%®É©%™ùyŒ BØy<óòR‹œs‹‹S‹„6#)’Æcƒ!Ð À„@×I6 O(Τٴ´·30n„ªà’\@š‰HKPK¯œìã» PK7A3org/hsqldb/server/ServerAcl$InternalException.class}ÁJÃ@†ÿIÓnˆ©mÚ›âE<¤‚¬íU)Hñð&ô¾&KŒ,Ý Å×ò$xð|(qZzèA23Ìÿ ÃÌüü~}X`£‡$FˆDàX`LÜÖ¶n—„^6[ÂUSj”B’[«ÝÊ(ïµ'œg«ä³3å“ôÚm´“»tW˜‹ùÍl À„pÕÕšÛV;«Ìý{¡_Ûº±„ômú¢6Je+y žu.A8íà¸æ„ØZÀÎËò™‚«”3ߌþå'‚-s£ì1í0 1Ç Ë†Üñä!F8ùPKLI1dànPK7A!org/hsqldb/server/ServerAcl.class•W `÷yÿ>IÖ峑E L¸lùœ”’Ø`jc68†&p–ζ@¾S¤ØIßMºg¶6K·‘®¤KÒ¹Y².ä!CÝ™fË’­{tïµÝºuë–mÝûÙ&qßdÉøÑ ¬ÿó{ý¿÷}åí/ÎQÿB_Ó+2üª ¿&ë ýºJ¯…(H¯‡è7è7åð+ådÒoÉðÛô;ô» }5DUôŠJ¿'óïËð*ý¡\þ‘lþX†WCô'ô§2|-Ô¯+ô •þL¥?—Ý7eø …þ2D[è[*ý•ìÿZ¥o«ô7å8ú[•Þ‘#pý]ˆ¦W„ÿßËðû¥èUú'…þY¥‘Ý¿*ôo*ý»,ÿC¥ÿ Q›¼!Eÿ¥ÒËü?*}W¡ÿUèÿB´›®†¨ƒ¾§Ð›!ºC´ÐAo…èmšÇÀ$+ì Q·Ðèf¿Âõp™l‚r­È ÊPEqHå Ùh*Wª\¥ò•Ã*W+Qx­Êש\¢!¡¶…×AS¼^¶PRoÀ«¸V† o ‘!ò\§òf…¯ñÖU¾Aå­ÂàÆrÞÆïRù&•·‡¸ž¾©rCGQ…Un’‡¾. ºªp³€¶@ƒÜоYŽ_Ux‡·…hŠoQùV¹ywˆwò{D€]2ܦr»Ê*ï†ð…oWø&x‚ÖkYfzoÒÈdÌ Su¯å˜iËHvOÆÌ”“°-&µ3–ì¶œôSËývzÂpJî«:ûúNtž¼µkx°{€Éw¢‹iMátÇÎÂqêSMßiã¬Ñš°[§–3”N€_ìcxL"EØÊ:‰dk_"ãà¾úð‘C=½]½ƒ'…nïác·2ÝÔg§ÇZÇ3÷'ã#­3}ÖL·¸ÄÜVz9äL îO$MÈ¿ ’ì®ANŸmĸ绷nj÷ÛŽá=z]ý‰®1iXc­Ýr`¯Rå€cÄÎ4RƒÆHÒDhâ(f'm«H¢*c:%J`ÚP¿¬rŽÁŽíq`º®~Y¾ZÊLO$œÎXÌÌ@…5õKŽ#b™ÊDôãÐ@J˜$­€Á5¸;a%œÛ¡ÀúÅ:’ËЂ €]Ä´2Ù´ gަ;n8п¾á‚:IB™*H^4,¢Aá;%†¹Ñ©Ð#nxa ËFÂÓör*¼ªÙKæÅ\w-LWvtÔLkô‹ô÷q· û5z’žbÚX>’µ˜ºÄ§÷t:º3žÈèr®·,²œn[É)}ܰâI3£›gMK™rLýþ¬2£ð{5îá^áy—F?IŸÐè“ô(ªñîcZ¿TÚD2.ŽtW̃2ô#xÚ±=će{·ÂG4àAò1ž¦i¦Í.5ËtZZg,ûœÕcgJ£”·35o×㦕0ãúˆ3²S5`θîØzÚÌØÉ³¦, K7âq¨íóôŒF¿D_`ÚöN"Mã!‘$Ø d}»FÓ§ËÛu¤‹Ø8¸¤³IS¿~Ñ®ã1|Sm¿í{0—1è< £ÑÏÒy~š~F£ç颯Çù×¹·/Å«@v4mOè£n(¯-ª´äé;ö—¼Rtp1ZtýˆéÀÅ }ÝNº™‘î}|oœ¾÷P ¹ „€xŸ¸Þ7±lGOApÓr4>)¸ëÎ pË&´ËRãS.éâµ±‰‘]¡ç¸füˆi¸) ?ïPœìY luê36¦$¶4¡§\Çè)ãܧ±É£ÐyØó»Aû ¼âä1qÌæÕŒ½¤@ˆã'„Éi>£qR|>É[l#Ýɤ}Nã}ºó²òìj*m'Fä,çD‘ ¦ÍÓf û-Ekög'FÌô’ÒÓòÜr ÂÆ)Ë1&u3¶Óºá,x‚ŽðP·7éH%¦.Oº_ã4g4vÄ ŠÓèSô’vQyûä4ΊGÞ0˜žj×åJoŽ¥ô”ጷ:v^²–Ó0=Ó¦UdUø¬ÆçĽ¹yÜL¦ o¡ñ$gFp=À"†û;ïùAÌÖè'äUr×âL:÷*ü~Ij…ÇÊ9RÁ¨‘M:‰‹í¨†¯´øL=–M§áÌz<‘†-ìôT‹Æà¢Î”z¢WF±$XJj—ÆâE›Öè³ôóß“ˆ²RYîgywæðGôcL»»ÅÉôqd0˘@V€­zrƒéJ<‚TefP“õz&ƒ_¹¶kh‘|ø9…Bšç‡5úqzD£Ÿ G êÍ-îI¦íLõG-s2…Ç|ñ7!ÏH’éRQFÒ õqzÑxºy5÷Û±¥P½«ÀE)kpúb†%á‡)vh^ïz€óêIí,6µE+Ê: ÐÕ¦OÝ"‹’Ù±èÓ ôBðJâ¹Ë¶“¦á6ôÇ—Õ÷r^Ü·LaÚoˇ‰H¥:I¢XÕIÅì“fÖÑÏbI}tçO¹³O6wF÷†Y£réñµùsØÝM~ü'j›%ž!_ŸO]tîIÒë.P¨1Ü’#ÿPc´î–jšÿ`ŽCùxzþ[9*{žä‹õ3+Éÿ…ºÀá«T òO,Ÿ¤2—ü=ѹ²dÙxtî ªœ¥àpD™!õÊ5ÊQMŽÖybBW—WÒÕú«0*KyÌKq oŠÆhã%ZŸ£ 9ª}î`´Àp¸€Vu¤8ÌÐfÿs@%ª€M7æé‰ûú—ðtžð/ãyÌŸŒæèúÅO»¯(÷—i Èëçiߢ³þn.ÑV‘áÆâë·aÙì="5¿DïzÎ}ø§ÅÎÜ›Jp7äW¯,¨E#ÿ›äï‘qã“o¼ðÍyÛm€T¯Sà¢Ìt»Ì9ª¿¸@ÃO¬b‰>‚Z#A­‹ÎPC”aúhùË'hŒBM/“æ9Ãs®æ|ÔFC´M¾±ò̇¡7¡° Ì¢øoócDˆ¡ÚÕÚ²×I«UçÂêø4aw‰úw†š"‡rtø<•v–OÓPSäî’mOSäHÉö¶¦È€·õË6Ú,ÙnjŠ-Ùž¦{ۑdžTxÏbc¨Q®_ùׂϖáZµ&TS>C'.Óû|44ýöùwFÄÍFµ•9º·`FP„Êö*wU[/ÐI²,OyKx±â#9Š!Njµç‹oðçùY:æÎ_£_™o£o3ÂäEßï$|ö¤ÏÙso~†6ÜÜÚ:ü[©Ð ä:ü‹n’Rè%…^&šGá’;9_z«ÍSíµ‚\º½¥pïþå¼/†Y¿<ŒB3E¨}<Ø\Ž pUòo…w%Pæ"cßjÂîRR¡ËóÔôˆ )ôÅyºmeÍcµ‚šAev•xeäE9¯œ¾D¿â%#Þ…S©ߎΞ¦úÒ,‡K­%3G£ârcÅ<»@{¢þ¶ÈxŽç©í:]À9³'éáäh  ³ÿÙ³d‚Gj8:÷8©‘û§Q¨ým3”ž¡L ®3üegèlŽÎaŸž—”¦põÀ =ˆœtw‘÷ã¦IRÿk´ ¥K’M>}G±ýÀ%B+3ŒT¬{Ii¼}Í 7G•N»þĨîiYé)ÔùírµûÒ›´Ûð‚F‡ S•®,T‘o ŒDõÏ*_R‡ý¾Áá~eø}ƒ/Ò‡Âá¥Çà ~*~aÙ„ev·å2„d¨A“¡R†*ÖÁKúˆ|ÄË‘~?RÈ‹tÒ=û袳SHpÜfìc(])]KeCcù( ™/àQ ÌwéQ´àŸ8üan…Ç|*…UêÁü#@Û‚ùG1aþ1ªý>PKÆWwuý PK8A+org/hsqldb/server/ServerConfiguration.classµVÛSWÿ’¸›¸r‰€‚¢â5$Ö¶Öª¥…’‘ŠJE-Ý%¬nvqwA°µöbïµ÷¶}é 3ð%0uê[ǶÿE§3ýúà8¥ßÙÝ„ˆ¡òÒ@ö;绿ó/ûû??ݰ߇° Ý!$ñœ€Ã!øâ#z AàÂ^<ÏÇø£óŽóÕ þ8)¢Ÿs^pŠÓn}ZÄNÏŠxQÄ _¾$B‘æË!ŠˆaY#"TçB8?H3Ç©.Â1*âß™",¶ˆ1¾pQÀ„€I†T]µÛ|‘èIÿA#£0Tfû2,iv¯aÚ Hr šdXÕgËCçÈ£Çå´FŠu¤Øk£Ši«ŠÕe¹.•óG’©sò¸œÐd=›è³MUÏîMf61b]Ð2é„¥˜ãŠ™èsÈ‚Óý„ K24hªe§Œ!YKêŠÝžÉ˜ŠeõÈ9Å¢T"ÑÓFpIÀËt µºr±PTÑ;ÃŽHrYi0¬µMY·4ÙV¼Èž”`Ü)uAL‹MtÓ¶ÄxSч—Ê!Ù–Ó²¥,øÚºX¥Çè›´l%×9¡2Ÿ”¨ûðŠ„Ëx•aóà àW$¼†×V/àÔ91¤ŒÚª¡3Ô—8ÑÔt¢[¶Fú› ”ðÞ”poIxïHxïIxŸo?À‡ ¢f£iê ×ðCõâsð1>á|ÊÐè&ØJÚ²iú 52fgŒ‹º„Ïð9µŸ§!»03»Z?.ÿ‚ŽÚ“ëÆ å 3¨4T–ÇÏÉV‹›|Ië‰,jOTCÞÞÖȽTؘò²à&ãÂ?8*g‰RõŒ2Ñ:bç4†•… ƒœ±V_Iøß0„‹Õå [$ô©ª)~F5·^j­»ªñèÚ‹„ëø¶DšÖ©Ç¹>è*Ëš¥HøŽ#±m©s?hèÃjv̔ݣ-9£ésÊ%Ýü¦t0ºMÀÔ:ftÕ%÷awÑ èŠ4,j!÷ôOØ*a&¨Vgn”wx]¤Ì(`ˆ,sjðA¥rÆ™Zd'Ñr¦B·aQek#Ñ¥òãƒ+K©-è–p=¶kZÇ$. ñr / ‚úvQ‘.èN‘+½\ÏAÚ¢ÄÊEY*ˆßR/)4–Ûh7M™ ­œ.–Fcî¤Ó¸ö¨ÙQ&â@Y@ö–Ñ\2ÛûMËI–Õl~è uá»oî./‰Jµ8­›cü'Ž_Ðñ’±[¶) ±úÄ’Ã=†Mcز-<‚ýø3¢€ˆ >i÷íjˆÒUE 6 vüÄãØã‰‡‰VílüÑ‘uÀýp^”¾ëè»gÝ‚5±i¬¨Ù½áìØ­iª{ùF¨p×nTÜŸ Oг ¡õÁê¨vê¢s/žôbŽ#€DwÆçP1…›¹ß©ÆxË,üûü þ<mÓö‘ i bƒ~6CÆu”Î2uc$Σ–ìì£zeÙZ˜§7““q&Äg8 â)´¹9°Ë¤ã''ß‚pjâ‘9ÇòÍaeÊ×Ö¿ý6¶Ä›v+©ß]®âË«>6=ÿé®Z®.åßÃæPù¿h WQˆ‚†·qtiÕ?£¦§egá3T=½º!K`ŽàüJô7ü‰¿ŠàžEå<êáð´BÎwÑ|AFdžúüÝó¨\®êþ £èÀA¯†HÎÛ­ßé‚Y¬NÅõ¾<êúãáúðš<ÖÒ‚wg4VS}ëh±Þc4yš<º1¼Éµhov3^ÏB§p¯°)vþ›±p}[Rn/J17äÖþ›Å^¢"põ¼Ã‚è*z1=/Ç#.vVvF~×¼äœüâ̼tßÔ’ŒüvNF•ü¢týŒâœ”$ýâÔ¢²Ô"ý`0土——š\’™Ÿ§bÈÈÀÀÈÀã (rÎI,.N-fdÈJ,KÔÏIÌK×÷OʪddP"l–€Ð$&`b`’,@ÈÀÀÄ\@9FO€PKó$9¶Ž¾PK8A2org/hsqldb/server/ServerConnection$CleanExit.classP½ŠÂ@þ&FWsñÿD,Œ‹¶ŠM°ìûU/G؜٠¾–•`qpuÜ$XØé Ìß÷Í03¿÷St=”à{pá 4Z„Ê<2Q¶ ”†Á–à†ÉA ´ ø+ctÆÊZm Áp¤GùiOña'­NÏ:•›Â… 3÷Y”˜Ádl}”QèÆot„±Vfy‰2Bí)î~©³’±2G¹¼ìõwÎ% ÞYÐMCŸá"‡•7æ“gmö|?Ê£œkŽ·8ÁÇì<`*`.xl;\®¢Îô*O®£ ïPKÉ(Ô ÞzPK8A6org/hsqldb/server/ServerConnection$ClientFailure.class…PMKÃ@}“¤‰¦_7"‚m"^/AAÐSÁ{L—¸6º›–‚"xðø£ÄI-ˆFð2oÞÎÌ{³óþñúàCül.Ö]ôAVH¡ª aLš Bïü&§q‘ª<žTZªüÐ>’JVÇ„Q³Ü|_œ¤œ²\˜‹*ùé0›#>\ô}´Ðv1 ì—:¯Í]1½ŠÐs¡ãÉ’R)‘U²TÛ_²§©,fšeƒ_Ü?ãN©1Âúß–'÷™¸­%Ã?þSo¿õ¿?6ùŒŸ•`Õ{sfqîb…c‡Ùs›1Œv_@=Êö8<‹)«ËÎ.#1¶¢'XËr—£Çhc !¼OPKUd= ÄPK8A(org/hsqldb/server/ServerConnection.class­| xTÕõø¹ï¾ä½L0É0$“…<Â’…$„Ũƒ I›I@*N2“0:™‰3mÕZkWkÛŸ UKµ±µ¶¢0‰¢`µ•î¶Ö®j­ÕZ»ï­e1ÿsî}o–dðûþ|Ì»ïÝ{î¹çžý.ð·?+ÔˆN*z»MÉÓ‡¸’O=fiÊlh²y=œô( G¡¦¸0K™«)nÌQæQe=Šéá¡G =Jì&¥ŒÞÊó”ùJ…C1•ôYéP*‹èm1ѰÄoUôYíPj”*‡R«TiÊR‚¯#ÐzMi ÊešÒ¨)Ëéu…ª••¨RVRÇUšrU79 ^9›jÎ!¤çò‰W{‡ùÄkЉo×ÝèP¼ÊjM9OWÖ8”µÊù奙-ÝJoëè­MSÖkÊ…š²Á(:=Úuå"*ßEœ¯tÒ0]ºÒ­+éûbztèÊ&N¶‡½„p3=¶Ðç%ôvi>¶Ò<· Û©îÝôyY¾r¹²ƒz…Cñ)}ºÒŸ‡¥ŸÆ èÊUêÊN¾zßw@W‚¨T:5åJ]¹Š@Bº2DUH@Ø¡D”añj]‰êJLWâº2¢+×hÊ.]Ù퀫•N‡²G¹–p^§+ïq@“ò^]¹žÊ%ô¸7êÊûˆ²›4åýšr³®|À×+·ÐヸAùáø0=>¢+¥Ó•[©ü81ñ6zû„®|’ÊOÑãÓºr»®|FW>«+ÿ§+wèÊ^]ÙGîÔ•»¨üœ®Ü­+÷èʽºòy]Ù¯+_ ÝGûiÌ/êÊ(•TóñòKºòe‡ò òz<”‡¯jÊ×èãa|Y9@58”G•ƒÄ–CôHPÃ=Æéñ˜Cy\9L'tåI]9¢+Guå)jú:õ´®<£+ßЕo’¶>ëPŽ)ßÒ•oëÊwhRßÍW¾§|_S~à€o’Ú>ç€cJ•®üPW~¤+ÏëÊuå]ù‰®ü” ¦³OQùs]ù…®üRW^$Š^">¿¬+¿¢ò]ùµ®¼Jõ¿! ½F×uå·4ñ7tåwºò¦®ü^Wþ +¤QÿDÖ•¿èÊ_uåoºòw]ùG’ñÏKç³q>‡N”/ ·Bzs!ñ|®ÎÝ:Ÿ§ó"ë܃æ%:/Õy™ÎËQiù|WèÜD&ó89^I…4Íz[¤óÅ:_B«èQ­óÔ,^‹vÏ—Ò[=êuÞ@ÍËPåy#Z%_Žþ†¯ ·•T·Jçg鼉`Îvðsø¹:÷"£ùjzœçàkøZj;_ç „y³ƒ·ðV£+XƒÆÏÖð6Bµ^ãR¹]o×øEä}©æ]:ï ²õw¡ âÝôØH¯ëüb¢a}¼¦ójY ó^oÖù_¢óKu¾•8¾Ûuþn_æ`ÛÉÀ|¨JürïÐù:»Cç>÷鼟üÜç4î×y@ç:ÔùN‰Wêü*‡A>ˆ‹CÄápÊ$B‚ÖùÕTF<Æã:Ñù5ßå`×*s‰µ»‰VwίÕùu:Æß‹Îœ_¯óüFþ>ߤó÷ÓëÍ:ÿ€ÎoÉñ‡¿i½€_ãÔø‡4þaÀÀh‡ÑÖ/ ÄÌj áøz_04 0Èk |á¶ÝÁ8¾_ 7‡‚×`=ÛÆ@‰¢ ;®ô]ã[ò…—õÄ£Áðàjló÷µ¯C°v¾†ýÝø†CÄ‚‘0ƒ¹‘èಱ«Cþ¾e=²{åÆ"ýWp¨‰3ˆ/ëU¢1½†,Iï,+•ç÷Å}íááÄâ‘X‚‘eëìJ$0àB8ÁuÄà‚tŒ¡`Ÿ€—ÉÚPïN|õ3ÈoÙ¼~}Û¦=íÛÚˆc‘p,î Ç·øB#àD®:†|ÁpËÈÀÑ«loA꣑]Ý4Öâô±°©Û$šp°öp<ðõp¼lkO¢- /&Ó û¢{ÖˆŽmÓ%"ëföPëH4вµ¡–J¨‘x0´¬?î—­Ë|ñÈP°Y³(ˆ AÁWgoÛ¥½-Í]]8ñÍ›z—O­ZÜïO©KôbBŽ…ýq”ù¢¤z‘è"#ñ>©µY:wûûúeû$Ñw6_ºã’æöÞë»7íhíhoëêݱ®¹·ð"Ô—´š»;:Ú».ܱ±mS{7j¨ÓÒI<Öéf0'1XÌMŠD㾜lŒFâ‘þHns׺¶õí]mëvôônjkîܱqSwowkw'ÓCDz.îÈÖÆ°­{]Kk¶6Á‘[#CC?Z_îyÁp0¾y\=ÅP¦7Žš-h—­Á¬ž82'Ñëë „GøˆÆ?Š $LêPÉcÁÁ°/ÔŠÄžWSçœ~úÂñ"£| Fýô ›±‘ÊO­n¯Ù¢ñ¡)´íî “°Ñ½X`)Qh+‚*çiüVÌš;e5üã¿MãŸÐø'5þ)Zã·c(Ç(®ñÏ`ú§ñÏb惑6T~Ì“‰ä@œ ·ÏG$7UgŽ k™$ouÍôM˜‰1( ÄSJ* ¦Ë7„XçV×dswy;}al§ï*É+ BHš@£ñÿà€á5N` …zÑ!ÿæÞõ¨íÕíIW•Œ¥±¯ âæ¶ÝþuAd(òÐ]=’$¦Ÿ×ªb°o³ ö õ®{'v‰ùcã{Œ=Ž"LÇ_l'êÁް£{Š_gwì[ìNæônNú-¼—AÅiÜí3Ø×ØÃ{ˆ}Õ`÷°{ öy¶ß`²ƒ¿“4Ø(»Õ×àwqŒ½wüŽ0ŸeÈóÏ|?ÿ‚Á°G ~Uÿ„ñ9v·ÆïG­gàJr¾;©ªÿ"‚òQþ€Ýn;ÓÈ.²ƒ‰õdšøÂ Ôn‘A àOk5øƒü+4­‡ öv_& ²Eƒ•: îg_4Ø vRã þõi²ä1V¡0É_itˆ'Ð >ÆÇ þÜ`ÿaÿ5øaþ„ÁÞf/eL0Éó&£µÃYÑÔ†`ȈüI~½­—’‡€ßŒGÌ~©Pf¿H*â¨ÁŸbÇq2J®Áî`¨ºinF54«0RV ˜¯ãè¦)\”b84"¡PdW [ŸÆ~üþ šÏ7 þ,·ãß2ø·Qøwøw þ=0ÎúûÿÎà?dÿÕø þ<ßkð³—ÐÏüþùÂHÜŒ ›Õÿ©ò ùghJT9,|“ „ã;ÍÈ€i🳓 ÊÌ¥f|ÏpÀìÛàû*3¼6`îD‹&ÖÌkÇ|á@fw¯‰j’—Nãsñæð Íq`$dñÉ  ÝyM¢ç Ê×£6„L æ°iÌ™ŸêœÆs66.×ø/ þ"Éà/ó_QV7ŽlLñ•áo1ë6 OëP*CC¦Ñ̾A¡‰\CjÊ`IÏ®`¼'Õa¬0¢‘!³§½scG‰ÔÆ2 `r•P#R ³i$Ò¦¿`s8°{•5FÌQP'^C •×DWÂ#™¾ÂŽcìki»°½kµÁÍ_ÅÙ‹/ƒÿ†¤ÿ™CÀÒõ…c&æeQDÜ€ÊdM·y$¡8Œ›õkÍõì¸8Í7`‘F_õTg¹I2‹üűd®¼(Mñ1 HyQ!„G%Zâ’êoQýùÂøïÐI¡ßä¿ÇHÙÓ¼¥mcw{W/BýÿY,ÂáHŒ˜ÜÒ†ÙMê@pÝ¢Ä7„êB8_ã2”Âôgê§ojëhkîiÖ¿Ðh%Æ97ÉØë7¯ ‚j4åX $ìSæ~;bý;C¾êõíCÃ!Þ¬šÈ „|4· *§´†ÑŒb#ÃÃ’€¹‡"}Ncscc#† c¸!c\­C=èÙå#§™VMiohh¨2øßÈ[ñHÐoð¿ÓknN³µÍÒê€MudŸ”3%dPÕ”¤¦áž J#`ÈN«ë‹Z°óòHtHZúäÎ/\? ûÐjLIâ0ø?ø? þ/þoïx¥#7ez!äbÁÿÆï¡Á¹˜‘”!Ðð$Öÿò· þ?ŽÂ«Néæ&æP î£ :ƨ%N™ÆÄ0m2ø ²†“ü”ÁßæŸÈToK‡7öâŸPÁP™ª*ÇKU 5FÍU5CÕÕðM]O¬ðx{£{¬ìå׈µ¼Ê«¢Úu-J/dÇ5uƒ¡¶«¡­{[“H`C}—Úa¨j—¦vêF’ëÅ*†cí`!ŠÔ^y¡ö`n öâÒŽÿ )Ní ?êfµË`‡ÙÖÚq·XÅb¡e==r=d°'Ù†ºE½dÊH…t¢#ÃHWjiÎѪQ[Ѱ¼¡±¡Ñ` R¼KÕ­´¤Å·mìgm \)§ã‹£‡-µ²ÖW#BÜîÍ ½½“Ë*CÝNYǹͤøõç64Ú,$‹ZtB—ë¶ÆA×9ÔÀ`•\ÃK Éä8izÂ’vE#8ô”õa-:}a3­wfg²À¸Ø‡21>"#¥ÃÞ0ýᤒSKwwK&4…Ç\žL`â;ÑžlÔhÐ"ÌɆ€=?ì‰ó9OR$ÙÔBD'êíOÔ†¡a¬/ Æ÷˜[äîÚà ê» õ2õr r¯ÀÜè F-Ï“†šxÐxFÛR§º?¹Ýg¦<¤ðÙA?~‘LÌïõE)Ù5épArîeÓáåV_¿Œ©“»3t»sí}Ÿ¶îõi«Èm‘ÈU13Ä2£0çÃgq“†#õ¾Œ–¢‘naöEŠÙ‡ËLJîãÇ¢äÁðózw¢ÀC{0Ím³â°/Û‰úI‚»Íªá*©'4`•H ,ÝÄ $(v {`:cñ!6Ò‡ž›[ùKjkg„2Àiš EQ82]ìíP@6Q…“@ȶ •'vD1õ²íÔ6(±±ÑØØd¨;Ô+ Õ§öj¿ŠÕË;7 fG”¢íô]Hi%çtìQôPR¹¤þüE5 ©†:¨îÄàgi"M>Œ ˜zô1˜TûÄ •bI$¿ÆD»ÚG)Ó@L,]Ê’›{{âæhÔ·'}wO ’«×£¸²!%›Þò5†äG‚´àhC‘Á(ê—X—ÚKvZˆÒ¸ÉŠä®¶ƒ™-O&Q¤g|ÖC;Ÿ¶.AkÜ!­q‡dãÌ©b¾Á@LS¯4Ô«T\Õt¶÷ô´w]HÔDF¢ý³e„Ò±á‚ó•uýâÈÁìŽ÷ù蜪ó•ørCRÃSëW08g´æPl5g€v´É=e¥òôN„AaƆT˜6rÐ6ÎÀý,ÇÜlÒN^ÖÕuuRY<Ý1ÃôkS2¶’Ó û® ¢Ô¢´IÞˆwÙß“öÛÓÇêÄÕ7ååHÎöôsRØ2ÚXÍ t{–s#¹I€­®íÙ=2ѵŠÜ¾õ|r™j¯¦ƒÐmY7Ô²ìab›q‡êV}&GŠËÅÉGNõö*WÏpÞj ÜôìÍa{×wrO`V,‰¹GÈyò!1ôˆ£éyÙ[0õùý“Ng,nÔlËXŽØ‡²³ú3i3Ï›’‡¹¹»}!\âN=G§³æÀP„NéÝ1qŽE&Nø;"rŸº$ ´Á œw¼·s˜„ì¡ó¹mT={p’^Ù¤M:´BNUg?Ͳ؜)äâ44“Îu=ÕÙ[Qiºê‰p•náóâ‘.šúа•‹Ø'#îêö¬xé‰û²6z¢d¹¾º#Ë9Ðêöö,šžq¼˜±ŸLG…áÀ.Û l¬žzCaõiÏûg8½Ä ’†4ûýÂCúB²e[u–+©ûÓÞ”8=5dl»¢Á8êÛÀi9Ý-‹3ºAæú†‡aJÙ²ÉÓ:BnÔg;^GlM©;ît(†=çàº1¿s(Ûte8Å꥞”]LÒ!šP çV·ÿWÙD[G¤/©† r“\ `ºVÝ>ñ9ª¡÷ŠÝqçÈ0fÒmhÄÖç’™†6h3!žtRå$¹ìd6Ú‰°Aùòi¸7Ó˜šLÚ…g Zté†hÙ–BC:¦‰ÌÍÕ­ÓÛŸap§{Hr-(YZVÝ:“væaK0$Ó•úl1e†¾%ÙIÚŒÁ•A¾/ˆÆ¥eÐnßFHWý,5§³f¡.Á˜¥ü¼šBžƒôÏ61‡8Ÿ‹‘ÑLs…{äÊõΗ#1«'ŨÔQbB­ì”é)Î?p 6ð1ÑÊ‚7ûe u·Àµ¥zکѽ¶ Ýjë—]°b^u{öà’6Þž„Æê!:jŠtDva~!Ö¦áA{hI‡Ú'>ÚIEdR‡å]¤¥–UϨùåÈ!kg¼;jaØ(Öñ í6faK»ø³½=K¶Gü)ŸéF ¶ƒ iu&Ó¦®äv‡’9jå´cØyìj™‹È|SlfË ;´½ðË–.¹쮮ɚ¼æË½h²;ºöˆjJv%»J‰¢îå!Z™ã«zšäy[6sO¦Îš‡(Éš,ãØ‚mCÛ*æ’‡‡ËAÿúHÔ&iÉ ž9ÉRC‘¨½óž=hj”œýR’Dÿ%A?Y%mÅ=ǨO,_U\aZfgÝ*œÂédÖŸ/öìÙ-9#¿µ:iÁkiY®Ó@”§âÒ"##•«íeYªJ*yg+·§/Úl]JkEO4H.þt„$éW銇P˜pg{W“â"±éá#+¶o-ö¸ºl‹”ìÞ_M0–îÈJ¢b‡¸s$< øí“Jq`<‰äiS’ÕbÇÁçߦ+|¿åT4ª>åÜ3òˆÙ}ÀEï oòe¶ÔFÌH¢=”Vˆ­äú¯²C~Aò`#µˆ- ›´«-ó-!Õ›nië!‡ôH&HME¦w’=R¤RÉ~¶î^‘mògxƼ:‹mLb±ÄчQÅž¾#u®#î8ØÝŸÅŸ{ª³ €Þ\áP¿¥Aä6‹´Írœ®@ÿÎH‹`ùph=Ñl13{hËó y>‘¶Í˜½ƒ&qK:2’;r1=W‡»äU§0yÊH’ûS·ÕI¨R‹Dj_•®€Öºë:zÖŒ£¶)ð¡c=ÁÜÀNÛ"ᤠKO¥lô¾0’ˆJìÀ€Ìq»Î0“ÊÆì¬äóÓ¯¸eê°Ý@—ÇE |¸…œHNËþ¢»ú&RžZC7÷_ŽìB4Hwz‡Ñ÷c—•ÕYÇ»¨}ÆTDßé‹í”B-È<Û+Š I'' †ÉO_$.¯b‰3F55t‰>g 4À”#- Z¦IÀÛßI>'•’ŠÃ ¤Ò1iWÀ=Ë€Ì-Œºê™Ç›´­1½Ÿ¶+ýÂÑ÷ö¬9Š ˆÁ†3ó¼g’”ŸU-Ϥ§+ ·Q:rÁ«Uooi™°ˆ5âfse¦^ˆ­Zô³b;wƒ8JŽJ;M¯Ê¾øžn˪]æi)ß•erY|˜ì68 Œ}Êè²°¸jÛ+®êïcwŠò.Q¶Ð…aÑ~»W”ŸgûEùvŸ(ïg_娀/f`ÉØ—DÝ—ÁI7¯¾‡ØWEù5ö°(°G°pÐ]f,Åá¦(¢Tèâµ(cc™GǨ¢|R” ]½åSVùukü§ÓÆ¿¿‘öýMü~6íûÒñ-Ño6¾}›}[¾‹_?4,o«V[à„'ôC Ô¾•zrjÙ!ÈÅ më`[^êÕQËA>=ŒÃ0kkíAPÆ`vÌÙZ?ÎCPP[ k—WmÝ!˜[û¸0ïÕ„â­Þœ§©¬M€çOÎ3£ïÍÅÒ“{ô(° Þ· i·ÀGEÉØ÷ðYÊ~æjìûûÆžÓØAc?¦±çÿGsa?f/X³«C4 Ë""²dJ‘Ʋ”ï ç;ÿ@+6¹ô“dϱ'ýsªö¨xæP‘“˜QQ»µãiüvÉjWPµkÔNñ²g¢w-}¦þ(6Ï¥‰ ø¹rª /¡v‡W]úŒG%ˆ2–€EعãäBÔB=TbyœƒãŸ«Ey!l†K±¼Þ-Ê0WÂb‹üzp¸NÂIÙþ‰ e{ޝ¡I•¦&ßœ¦5ù4 Í¥>3¯ŠÅ&ÁñíøSÉÍào-þÜøëö¨R&þVÕ¢Y®öª£°êèñª*2«Vjv¯¨…ÒõõqØ<[èk5â—xU:‰ßTÉ?—*@ÄÑÇ‘l-Û‹89GSæUÚÛpêàËø7/oö¬¼ìWXŸ‹jÁQÛº#™QvNa ÀÜûùZæÍcÞÁŽqØæ-H“Dáv§à ¼;—9kð‘’‡ r¹IÀ’ûI‘‰ªBßç¡ê0TÚêQØ—x úŽÂvïÜt¬œ›€ä€9G3!3!TzßY$ÞÕ£ãu‹^ø0¾,Œå-ën’‘ø…W(³söÜË y®Ú‹™6L(…CÉé 6°0ŒŸ£pH‰w þzð·eÒÏoýÒß³ý2`ScEÄXíb,¡¦eü“üEpÃnÁa¸:Éú¨´;9/˜#Îä& n^PfÑž/ßàìÐ?0k“l£ŸH½gûicØ?h½ïœÚžûIÄ;×3·ðšìÚ³ðmwöì…ÝÉ7Šz„¸6×I¹¾GêAOÀ{G¡Æë> 7$gw#‰ £Þû¤„èõ¦1x¿˜#a½™^œ­¤ øÀ%ž¹Ç@W׎:»p˜[½€oÎÕ øàݤVâ­É®úÆÝˆùÃ)Çd׌ÁG L{§°9;û_HÀ>A@Bp§E@Îdœ ½sÀÆ_r ïšÒwðLûžñg#ñŸ#â•}‚ø»‘øq¸Çëð8Ph<ÿ2L(î%}ô8Èuç{òí QeùEÄ'J{€eIÇ“?Ÿ?š®¹ûI´Ô×6Ì/¥Ïû¼ó<ùá~o‘§èÌ’ý¢hDéŒ6Sñ€×ã):_òº‹Ÿ„/{]¼©Ä]âqÙ徺KVxŠÜÈ’Çá+=7—°Ñ‰W©ËC^Ê>rÝÅÈÞTê.uï‡=wéŠgEÀÉïÈ›Që³D|~Õâ–»ÔS4_³X+¿¶Œ#è«Ñú|$³õÑ4©Ü\ŠdÝ)$Ê3/÷Â)l¦×CÞ2O™Í‰„àDÙ"{U:7Ç›4«–ÂqâkÙz}Œ*KSüM›z¹»œp|ÐSæ._q fÛƒy RZ¾BÔ'àq¯&ˆG¥:œ´ÐŽt }£ðIz+'ƒo)<"ˆ(Ž&à)Êj¾NU™òeIS¾¹9°[p`ÍÑ 6½‚æôia]O{Üäí®Uý xÆYy/΄ZÉyâ«W÷èÜ£[0öæ"¢Uüj/8ÉHXá+~}ôæ"rIùÕ§úª5êºÂßЛš)Iú¾ön!«r,Kwd'/BÉZá?q±pdÿ´3æ/Y+<™!<º„ÚkKrTÅnÏ }¾ôÃ7{PÞ¿ŒŽ'S "Š.)Q÷CU’%ÒÀÿeY3œ”Œ¶€€ð–ˆ>ž$yE:Éÿ&B©‰Hý}”ªÿ›¢Úãá D¼¢Ï‡¼¥¼©Ì]– [e¶ÊV`ü)³ÃV™[%G<¥8dcúoÑ(¥b”ÿ¥<žPÆ®#‚C4H 2`´²v4+óxÒ¢™øJ‹fe™Ñ¬,3š•MŽfDí™Ñl4ç ©Î9iû2ô„ê-çMóÝóÝeûaƒ§Ü- öeÛËô&¥²„ÚVî…ùé {‚”d¾ lFæãÐc– pOÂIï|ÞTá®ðÌÇi7bYŽe1bª@LNÏ|¬AàS=”n[o÷Ü\X~ ±Tð&Ómº+,GòrÒ‘LXŽÄÌp$ËÒˆs‘”ŽÀE¹Ò:OΔ  \H* ƒ…é¶åbŠ!eS9Âÿ¬ŸcùŸúÌ^<9ØT$ÌP˜ [Xßè=Дٛ†-ÈV˱ÍÐN¼m?vl«'Ç3ÛCâpŒ±\éÅV$Îÿ&ð_5™Ó°ˆò·)FÒ³³HÌ2ާ°(Ï✃ÌA|·Éy‚"I¥ÊTž*Ö©XkG‘ŸâïüÝ/´g!›=ÎæL];Q«‹!‹öìƒzë«@,æ*¬¯BÑV`}¹D"ýºçÞ;ªü»`ÊÚmAjí¶ÀZ»JÁNI™]lît9óÞT)<.ú6ò° ÙÁ½ì¼›+½ò.ò,ÊL"q/Ì–D.L&‘‹RIdå¤$>k'ñ…V"¾Ø½Xx´…è"£G[¼Â†s/¶ýÚb4ž(‘ðAÏ"„š’ƒbGª?ã´2™ƒ.NËA%ŠsÐÅYrзŸF®1÷^(Ÿ&ê•ëŒ%+àÄtñÛÌ–wvˆ¼sƒ(Er3[Z#Ð3éÍ&6Ï‚s±";B»X1½¢¿Ñ ¿tµ æIåšÎ•©ù,Í4¸’,[bÒŠDÏ“÷,,Î  ”:ä¥mäa–Z¾WlñÑþ É´Pw¶B޳7ÁDwnKÑqRl°rÚE8ýô>>,*0¯ÀÂôâªPn—Ï¥åaç(Ô$™R‘AÓ‘S¤r›bì–ã)‰™Ü>[›ìY™Ñ³Rn´°…ÉÎ9â“‹¬ÞXÖu‡µkƒšüÍš´‰;۲̴°6ÇÚÈr±Å´Ùèp |ü¢|*á[ð3ø%¬U¾ª$”Çàú¼=yÉ»®w^éŒ:GàzEq=àzn[£ÚCp'gjìûLЀuìU‹.ý Ec¯ù4öÓ h÷ô`{vùÎÞu~8OÀ¶YʼYJù ˆ¿M^ágµãc³Æ~»Ø<½И!K!ÄÏ“°Ëù'àÆðÄl¤C†ôrK7£“è§äÍ?e{Cc¿›€ùP:S7½©±ßË®² NäØxœ"Öü‘•Ï>[N‚“Sc:ç$ä3Ï ¸ò8äç”N&lÒLDÍlNQÝ@Œûó`Ï ÀûK&xaÍq.˜×L߯&hÏtZ…±š3ÉS.CQ/ç@ÅÒK(*ð³¹¹rí,š‰º X*›™ÅH"Mq¥¸|ÅrcŠx.ÏThfA£¨- @¨Ä›¤qì8˜³NB%¶:O¨ P å§C#Õ(‰JTþ”G(ÒY'Á@ÄWN€sæé•CE’Y²qˆýþʨǼwÖC¡'‰ïõâôdõ("š™­+ËÚÍåaÏSÇIù¬ X5Ž”)LÅrþ¬Ÿ©_š<'õœ@Ï8#Û[aÕ<#3V‚_5 |R§ôX“¥y¡éûœ€­‘·Tò*Þ&Û~ƒÙþg*`ÉÌØ’ê˜Î Ä ùqªN¢•Z>ŒDºè'P,8­:Ÿuzk­,Ÿ€sO ¦ˆÃö¿M`V~Æ pZP.A™~š‰T-Egö÷ lœÁé!sb¼üǬ”ngºXùOá#^µuxñ[àTª *Ì ˜=ÉSËJº2Àþ•¼/ð~ÓjåãµcŒNé*ž…÷aQ"“”º«:¯ÔÙ¸òkKÇXõèĵ¥Ÿc5£/Â¥Öuwúñe­<°v±ÚÔ±´LkFaI§ÄOðu è×ä*yÁA…|X޶ÂE¹é¦r®åžä ‚2ÈË? eè uäß¿7`¾±5~¨L»»âb{H¿ÔêòÊÍ*íR‹›sìÚ­õcìº1X*íú=Þ*ÞëÉyì»Q.È=nœ¼êq‘×oÀt0ÝÒÿù(çÅÞ qÁqÝÒÎ:y+£«ÞÅ®g”ðí±Õ¹VÚÖâÖ…}míV.¯•WDèb ÅÙ[íÊ뤕‰›HiçjÆE•6hsÈñl²¶Oj`êý¾ {_4gʾèû,¿µ)s›ÒÚk©Ç¦ì[ºõövî‚z{+·¨ÞÞÆUomáªä.Ô /œ¼…››ÚÂ͵¶p û Y +ǰn‡sýl•á)X+·(0ó?bÌýn@±èìíÜïz+´÷f7måcìý¢<eëñ·ÁÅnfãì«Kî"­ºµêÒ‘ûà8ûáÛ‡ÅÛ ÇÏBâc6èGt.ûè£ì‚¹ìÖGYKêFøI¨eÇñ±Oí“söIv€SG‹¼ÝN0X~ÿPK<þóÏu/wfPK7A'org/hsqldb/server/ServerConstants.classe”mOAÇgK¥¥ ”'åQEµ‡ø˜øjÛ®pÉõö¼ÝúærÈ¥@j‰íIø~!Mü~(ãl)0·ä’»üæÿßÙ™ÙÍýý÷ëlÁû¼,Àƒ)%Â]FJs-"é{®/0—Áhí´ÓKãNº·$C¸Œ1˜ÎÚá»þ¶Ñò¶Vó¤hE3Mí4u]îùF,›…µ¨Î5¯r•Õ€Á¤ÑÄGÞôtÄëõP(…Aï$>‹vÜi9*íwZŠðÊ4sm¾LX„× ˆ°£>yÑ œ@†7ZYg°hY”åÉmXi´, V´ØiØoóÄS5CÉó“Áq TÞÔ»×<Ôx>_Ì/#õYiшľ‹ú]ïzÂÇØ‰i§X¦×D6g(rpÆQ½Ê`–h ¾5`e:/]¤ B©eMzýÖí•Á8 aófq.{r{¢5ܞܛ›BÀ·Qx{S¥ÔExÇ`ù´ÛrŽzßÛ‡N/éž%]Gõ?—÷¹‡…]ßyp’|M6+ý‡A>MzI“óÔ9J¿µ”Ž;‡ÉyåXe_ÃÊçð‚<Ò-Ó #‘G—o¾ƒ-EºœoQÕRGTSË«‰Ž$Ô8áJ'Œaó iiñaí€n ”ºæ)Bå·¬¤Cr™zLK:ØŠ‘MŠ Rê()©và~md8ªíUÓ1k8©Ži2¦ò6òÇ”aX2ž¨rˆqõÀð¨‘Hh£–NÎÛ›Ò↥ I-A¾,ölp½5óV©£1ï*mNä­L¦Œ¤)ãySv(v fûâzœŒžžûÁö†*bÎÛ#Ai÷Ç5KXÒi¤ÆZÆÍ›bÑ‘–˜>Ò²C5Ç»Ôd›€œM=›½r6WO*ª¥´(3÷kV–Ù°ŒQƒÜ*Õº¥«1ÝÔ¢dÂrLWÄtÕ$ÉçÍ–Ö‘°vjóšK™¿WµÆmöâM,p •`mG¶u£å*Js[Ý ù±Ýˆrõ[êèÄ? ŽÄ4>#¢ˆº$|ôGqo?0ª%íœIÂO»j;xs­+Ñ[Ös)Ì*ï#(“¤ËW[7(‰5-ISˆÇ4«7ªh•Ó-°¶¶€œk<´ž‘¨ŠÈÛJWr%Iï¥äk)ë ÀÆ ¨›ËE­‰JÖÛoO^®¼i4fGTÁ!Ü¡àx“Àòs¥DÁ›q«‚Ûp+o:É´EJ55N„¤Y”H"¨ˆR¡(b‹®åoeŠX(Ê)lЍ!E,‹éÏ6]Ákñ:ETŠ*Škg|rðìÛ–ÖcQî0Ué„™NrKТ5IÇçH"ªÅE„ÅRE,Ë*òÈUmLK)b…8OÁ=ø°‚»è!VŠŠK\7MRP³ûiÍ^#å‘*‰UŠX-ÎWÄâBE¬k%Q«ˆ:QO…¡ˆö³‘„Š&ÑL1aÔ$©¨m!nO¨Ñ£YëZ–ƒÊ§¤nÁ뱎…UŠõŠhq«²ûj³Ëªˆ‹Å%EÍëq)³^&6(b£ˆÐ ÎûÛŽh©«ŒT\µrÇ‚Ne\%µq [N³–Hǵ”J}éšš̲Ûk–è   cfØ}y©Üée$†Íñ´5öS˜B¹¹†ÏS Kœ=µr!s:|™«Æ–¥ –ÍÜž—E“cƤY”§çŠ"®ä„¯öD(ËÕÒo/Ρ׹‡¯ò0ÑÔM«eA/O±;¨]eÞ阷–‡H>žö¸(±´V˸§õDT;М\ûŠ·kø|5Œ§Œýܳ]*1uôxê²Ò¦¦-=ÖÒîÔ”M¯žÝ±¬l¹ÑÙ®;&JM»Oôfm­êÌ ÍûO½xq!:‹˜¡Ò,[’ìé|¶üÀhÌàûL¡¶_x ,pë¿›Nß›jë: ºJf-§ÑI·©ö˜§‚6íDƒµ4A1wˆd|m]¡ùâ£ù$°¦öÜ£#Ç^¬&©¦ÉÛ¦BlÉé¼|°Œ,i¶%Î^â ºoO¥8GU…&¯=guçîjûH7ÚR{¼ºÃkͼŒj›1Z²®Ùåë‘´a~™*(Û­yi;ç%m~ã›r@—¾~ÎZrVgï[¡¹TŽ]î ,›»Ñ= ´[¢zê¦Ò¡7® ®žRê6–ª'LšûÙ ØrZΑr¿©ßÌ—ö™\¹R ÚýÓÒ­qf*]RQL3Aå\Y¨B™zøK(1Ó#¦Sa•… ³ï¡jÊÔl‡ *䂲ŒNc¿–ÚnÿñÑ9æcÛ1Ïãá½²8ÓF¢ í²oÓ‘* ÕyÁ{à†þÏÓ¨ºBz÷VÓPˆ—þæöÑ‘Å*ú º‡~Ö` ®Áµô³â:þ‘ˆ—öàë «ÂcÜMx܃[ ëÜFøî%|£÷ŽÍÂqî œðàN†ï$œôà›§<Ø$lyð á´÷ÞçÁC„÷{pἋðA¾™ðËgûE´ÝOëÚúƦãX0?‡qGV€¸—¶Óº—ÝÏ ¬³á2ÃãôR.p ]÷#Ô˜Á¢SXLÝMgPRO¸’ßVŸD)¨-É LÄpK#þz_ØË&¦ ¡¿õ–g°"pÊÈÌ Î‹ø'p]Žîwé+™Þβk"pà Ö5I­g°ÌձʫcËh“ÔšÁê Κ€Ò4M₈?ì?`ΆõäY ƒ O`@Wã ¬e÷ÖÑK­ÀúX¼"ƒº;HœÏUTOJˆØ@Š2hœ˜~‚¹Î%"0GDÓ”„¢ûråÒŠò)ÈÞÿê%Ü)añê),¥·ê)ÔÑRvò³(-š‚"á­EJ+W ýdt¿‹ª†‰oóòûÑœAËݨ§ è:ÊYw°þ0*(wM¹Ü½¥HLL?)ŽæÌÂ7…"QÖ>-ôcÑ)‹Õ•D”§}”¥ŠˆŸÖÅú¢Ã¨ µ’WFµã+¡pè’l^:Âþ .õ_ŸÁe“ذeáHÀI„x²|GY^›-oW‘7e°9°ƒ¦|m‰‡‹O甄¶z6O`sÞžVw¿½¹ø7“÷ëèìnÃF'  ø9"QØwI¸{•Ð1Φ…ñÀ¦¢Äwš>>6¸<;ÜY¯©úsöp çl¸ÜcCØLâŠ!O&Ê žÇ¥¶Nþ£~ö‘Ü!í±s±ý$¶‘¬í tWÒ[ûh¦ ‡(~1‰«2xÑã¶PÛ ¼#´#àÅ¡Ÿo/vñÎÐθ3Ô9w…º|ÞýÝ¡îß{B=3po¨wÞÚ5÷…úfÈëõû*ίó…&qµ—XÞ;“6ô•GýkË=ġЯ<è¯ð=“#6sq¼Ä~is_vð‹ÓBÿPKòÝß ýPK8Aorg/hsqldb/server/Servlet.class­Xy|TÕþN2“÷òò² $0ˆ0AÀdHˆ ‚NJ ÈÄBÀÄ_f^’af˜yb÷Íj­]bZQ‚iµ‹ÕÚ}oµvß÷ÅZAé9ïÍ$“d üÑü’sî=÷ÜsÏ~ïË“/=ô0€Õ4 a/np‡‚;5âÅØƒ*ø†"|X&w)¸[C1>¢ñäü1Wñ £¸WÅ'JÁ§5Ìq{ð‡JðY|N(÷©8,˜%ÜT<¨âˆHN«8ª¡c29¦â!Áã>/(xXÃ2<¢â‹*¾$ôGKpÉA_Vq¢ã+*žPñ¤ ¿*à)_Óðu|CÅ7U|KÅ·U|GÅwU|O|_TøŠªø‘Š+ø‰H|ZÃxFÀO<+àg¢ÂÏ5ü¿ð+¿ð¿ð;¿Õo—ÉüQ6ýIFÖðüUÀß4üÿÚ?üKÅ¿U<'ºþGÁó‚ÿ«¡/8)à”€E‡eÃKN3 °8"… 4˜ö¡TÈ#r p+T¤ðJZvlÞÜÚµ»;Ø×J  ¡tc<–²Œ˜µÓˆ›…“QîïI˜Oûã&£1jÄ»­d$6Ød¯vÖA5“Éx’éLKÆl¶KÚãÉÁÆ¡Ôþh¸¿‘‰‘xc—½”¶Z"1#9ÂܼŒjò2c¹¼jdû°™Œ˜)Bq´#Ž DÌ0+ÙÆ‡6Gbk=¡°¶n'Áµ1f]B$øjmÝ6¦ÌäMQÓjìv0Û;l’ ¥Ý–ÚÛa$zŒþ¨ÉI¬ÊQãÌ"”šV»‘²&OôO8dY‰Æ- 2’»ÌýÃfÊjªcÕÜáøU&kÑu®›feK%8P&ë­P1»õ`ÈLX¦)¤ILâñ”eǹD!]¡RN_N!…Ê*W¨‚ٙ͡¨í3/ÃËu¼¯bOÍ1f¦J† ‹g‰˜ðztÜ„„Ey0¡¹Nsh®NUTM¨vD®^3¹2lXF¿‘2ušGó9Ø+YØTŽá”¹û€Ù߉ ìNp6rètòÒŽ¿•æçÑB¼ééÛ2‰†Í¤NçÓ"–Û¨Ðb|4_§ZÂþÙÕÚÒܺ™éè´”–ænÊèâˆD͘±Ïô­ó*[Œ°obIÈ:RØÏ"&u_Îr‘by(‹™!±z·Å•¥#ý ]¨S-Õæç8u £ùi.Áä˜EŒhäfC¨¾P|_‚=i†Ù/K&”Ň£a_,nùúM_$³#ÅL:Fp3ç…N+ÄáõÔÀµd™%ÍöE9[tv0¡¨3i î3؆X¼!d„†Ø†FºH§U´š°¶Y¸×7™Fx}³±¢æú-ÝÛÛ'½ÐŒÄL_&ÎÍç«N‹üÕÍÎæþxx„­še?3ô ™¾L ù")_r8ã@®lNð¢O³—U#šŠOe)Ÿ¤‡®Ð¦ÏÉ´_"™)öSÀ§ã öI*\BXÖ<´zýtñâÜŒôÖo5Ë™/ÕŠg2·¶.ßÓ 0çŪڙk²¿‚ïTédF’KÑváò|¬yì6.îiÂ4Õõ±p‡!8‹'͆8.¯ÌZÉzL¾¤Ês¡îŒïá`žmßVƒ4#꼊¸TÌ?ÎÉÂ̽ħTç„"Ûºvtµ³÷F23¼<̾¾ºöY»@“£f†0ÂÝ5ÏiFŒ»XÒaÍ 7ä94ev¦è™•Ïši|\‡ÓB¹wòD:ôH6ãŠøòÏòcß­e©Œëc–óT-f¾]Dñ ÏIUIÉb>&[Îó²9=µÎY3%!Ó(רÂÚàÙ‚WfgøD_",=SZåpñ¾ùµ'ç.ˆ† ÂÁ'˜*£ö¸8ƒ}Ж!HC´ -Ž'ÛAm°mŠ«3+|\qÌž`ûŒ«ªiÖÇú”Ó¦t >³45™LA® W­Ý{ôԄʵÍ6š qÂZ*IaDbÙ4ÐÅÄáþìT–ûâ13;—ìHð•mnŒ‹Ó46uÂ%·ž[ ÿÒ|æ¦àÂQ%qÜGä1¢ŽË¸Õõå §‚™0BfÓÌeÒfö@ít²=º%‰9sò,;Ÿˆã&nœìà¯Û ¡½±ø¨4'/°‹kóžÔÃkáLO¦}™SÚý¡W̃fhX„­©=³}g5ÝmkA˜%‹fy³åÏ&‡cRŠýýŠÜÌç)ö¹=qÔ`öP±Qì!ƳÄù?ìq2ƒSÌߘ6æïGó{œ±&0Œ‹X·2|Ï*íÿUnÿQÐaÈÉ­³L—ÁÍ€çü+Ž¢À?ŽÂÞJVò(\GxË8ŠzýÂ}ʨ£Ð;üõihi”ø=z¥õ£ÈSÖá÷”ólk½§,Š;±ÒSÙ†ç,ǜޣ˜ëO£ÊS} ó Æ|—Ë™ŸÆ‚ŽúÂÂ1œpù3¬ž…“‹|Ž×õ8t¿çü#X4ŠKý^—gq¾#¨‘á{xk(5^×–îEYÀí÷ºÓXΛ˜¾È–p! E¥ßS+Ú ™ñavp–£ãxOaûåÕLó¡x@ÁkÔS(UðÚSذ^Áë˜üz­¼.¼·dœ\Í>IÚý¨»N3@Ý¡Œ§ßˆ7ñŠð›¼•4…ð4÷z9̪‡p™F%ô–Ñ:$Øž?Ãù%sÁÑ ?CÏ †‹j褽þ¼OÒiÁ™„|§Y,WêÛ¼CÁ;¼KÁ»¼‡\¤à½ n•.È…[RzmŧQVnþåžyƒ(šÉ´‹$ï;)„™? nŠOs5¸rù€M¼}zá¨xNß.°¸‹¹›8}ÿPK»t§ À pPK8A'org/hsqldb/server/StatementPortal.class¥VéoWÿ½øx޳ 9H‰Ð…´`;¸áhGK”@B. z°±_‚aã5ë5$¥wé}ߥ_*ñ%ú ;PÔÐJ­*õ?j…Jgl'ä°R-í›Ù™ysüÞ¼YÿõïÏ3ÚñƒD­8ì‡À‘Jâz+ч£~´ Ÿ_øu¹A憘Ë/Õ8†gý8Ž~âžãå$+N1wZây?ð‚Ä‹~4âˆ/1=ËÁË«c¼!îƒòaÔ‡1–Ÿõ!Áªsçý01ÎKRÂò!Åú U°‘æÅ‘ÈøS†mŒ+GÙi†Ó½çŒ‹FÔ4’cÑþ‘s*æì"“‘D2>¤ÒÓXÝkÙcѳé f|$jç…Ñ‚Ž,+ØùYCiÆ3Êž¨ŸçtرÉ12õž5’qS TǬ¤c$’$î3R+ Ö'aFI@¦2­Òé„•X9?øpAʾvÓvg¯@_pi¨ù[Òʾ¨ìh|$6`+ª\ŇÃQã*éìZ7t\ÀÝmÅ)Eÿ‰˜J9Œ0:ób”À·DØjÚ;OoÇŒSÑ1ÑYJ\”ˆH\’˜˜¤¾£3ðÄL+M)º‚¼±v±w ØÍË! [ÑNN4¼Œv —ñІ-̵!ªažÔ° Û%^Õð^§ ÞÀ›ÞÂÛ®à O°á»xO ¸´Ü!³ˆr¾\ùA#aflÅ‘ßXµ°®LÂŒ+[ «?ã¤2Ž^h}Ô¶Æõ4¹Jö¤>›ž" õDZ·FõLRM¤¨2×É”êÔ5|€yùHÃÇ\U>ѰêÕ£–N­mÄ ÇÐG-{6 KÊn3Á¾ã‰xr“£§ÉibtR7LS§Ðï_ =ÈÞ?%¬Û:Ú¶p€Ï@]¨Iâs _àK _ákƼž0ŠöÎõí;6™"k}´€P!ÿoè\5|‹ï4|«ë—<Æ€e;†)°é!{ŽŠYÐaz¹ÜGXí'¬šNÏoi:¥Ä]6υ­®r¬^ë’²» î¿•ÁP©[ÞT.”@ÝÂ÷Ãn(;\fmÈgݘrf÷rRt)WCå3®¡ spôìÏ_–äº4‹Ö Ë8jHQqiJn{°œ»Ã¡å ¤Pl–Ñ#Ð,oÍÖk¤R*ˆ”˜*K-Þ ´6سœÚçX5b)ÏÇÙC÷rv–s!a×MK[s`¬K%^‘ß,ƒñ©P‰ZØE™ióÏ_ óóxö3*õi[{Qº*.V%v-ïg. ×Vã4(6> rQ¾ð‚þkHZi¨'xçi[‘ÒÏÓ­yZÁƒÀ âHÎ ŽZ3BÔe|ÈgåâTαs®Œ“8%Â%0Ùâ/êŽg讈Ó2>ÂÇ2>Á)ŸÊø Ÿ Xf;Ùøˆ{ØÔÒñ`[|ÈoK;e|32¾äâ+.¾Æ‹¯ßHŽ öÊø†CL{ çXFÏy†Mqnêe†©kªg«®î©¹²s¾Å ãøN@;ÅÜñò9‚ÎëVFW¹ã æÑÆaÇUyÎÄZÔQݱ5ßs4%m¦`Ze€ÝGÎ*óÄ~˻켩©–í©&í¹nǰÁSvéN—¦RÐãZ]å@Û2Çdü€eü„ŸÉÚb<ŠÐ9JC¿`ƒˆ_eœÅåißÐödw§J!RÝ¢§Îá¼€š¾TjpˆJ··¢*‡ÒNÆü&ãl g q-["†®ázñ>N‡‘V(0õ3çˆF¬Ÿ^ee‡ã°±”ÍՆ͕j´BÕ&oȆ–©¶zÇv¶èc¤»!ÖrC~c®§S½WÙy*džmØñA‚z´Ag£´!Är9ÝÒ(‰b•¨ÍR–´Qòì),¨ Z€˜ã#Óâd+ßUaÁ/˜ÒM °ò¦È‹Ee¾3t¼—rq§g˜ÂéÑâØ5n.‡r-fÙ–‘aæ6§#íÚfÞÓ™7"`ÅlIÔe[ÃF6ï° N¦éS¼z©,zýªØëÿß90ËÍÂïc¦iå9JnºqîpO«žÃ,פ¡xów3¥™«O»¼y&dÀ2¨ç˜Q™¦¬CÓÝu§—jÝrÐsà‡×OZ*\ô8¥–!×4•Ç85âØGù‹åÓ­ñÁÔºübó_@zëÝ!Ò7ç7%Xºö-¿ÌÉ;ïdt7^Ž!ÚaŠëTš¯ªËŠYYc¸)Óõyï%ÓIǵG·UHï²™.“¹®=;[ú±”>Öƒ?W¿Ù¨'QŸÞE’i¤`õ€PkÕEà¿06á¾`]èE5¿„d«2gUÉÕTom»|ÍçPs ¡=!*Rᶪµ$ ˆ0W‘'Q;±Z™W@Ý€RŸ¨n¿‚ˆ2@QÕ“XÐ^Àªö(õ5Ñš+˜w {ˆÂ¢qÐ8Š†èœ¦hhQ.nábñ%,¡ÓnMˆQ1*à¶q,LHQQQ XJSDbÙ —ЭùË£â¿ÄŒ ++§(6c>aWq¬¨Äü¦€–Ýdøqú8‰Û©w?™Þé*Ö‰x@ăWÑ ¢ƒþCÑI½Îщ–@°JÓþ¿ ‚ˆîúÕµ¤ª½EŸ7}i½€V…ìl;ëû]ÀC%LC>‡vîÌ5S¾¤ŽZ©RâS‹ý¥ÅXq±®µ€;NCRî$Ç*kÏú0n•ˆ92§JÃͳ0»«ÄL–RÆp ÿQ8…I¬;»ƒ¬ÁPKfz—ìv PK8A+org/hsqldb/server/WebServerConnection.classX `ÕYKÚÕzíÈJìD‰MD.ÙŽ QŽâC‰l9±‡ÃÈÒÆQ$#É8áh¡'=h)Ѓ£Ü­)w‘]L9Û„£-m¡¥'л\¥¥¥-åpgvWÒÊ–œèŸóçÏŸy3óÿ>ýÁƒÀ‰‚[†[á- þ)ÿàm;ÜÿæÖ¸õ_.Þá2Hð.wÞá}JáîLRÀJ(ÈàÁ.,\XíhCQ¦ ;we¦*•QÁ2Ëeœ…\X!£g‹8G†x‹vÁJ.ª˜z®ŒóÐÅ­ù\,࢚Çj¸8Ną̘Ŀçb‹™ëæ¿DÄ¥2ɰLÆÐ#ãrôÊX‹uÖóºLÝÀÔ+¹XÅʼn2®Æ52ž„\œÌÅ)\¬åÂÇÜÖñ±Ösw¹ø§òÚ&n5ËØ‚­\ø¹»IÄÍ\·‰àz‹Œ§a;·:¸2a§ˆ[Yæm2tc—„Ýö°|ÛYÒ<¸“‹Ó¹èå‚·K†³IeÄâ jagJx/9[Ä>TÖ¨Šç°Ü!nÑÙû¹¶ÃF˜P•p7 ˆ8(Ó`TÄseHâÞ=Æ#{eŒóv F°KÆ!…FÎãV’‹K$L“ ±Ž™ ‹x¾ —âû$Ü/á^(áE^,áGy˜Dù‹t‰„—²J?.á'$ü¤„Ÿ’ðÓ~FÂË$ü,A?'ãçñ ^.á%ü’„W0¾,â•^ź¼Z¯0°¾*â×Düºˆ× Hþ`Kgk ¸ÁÙ~nèüPC,hèN'£ñue-‰x*Чw„bÃ*BI4•@˜¯“Æ£‰†ð`(™RÓ -zMKœDÒwÊ)'­í[ÕQɈšD8~Æ­: -´¥á=j¡Â &¢nmH›T“ç3§šöDr a0u^,Òß 6ìTû»µ:ºüÛ¶û»{úzz·úûš›Z0PB Sç6û{xiÂñ6S+OS'¶vvk+JÈ—™ÈßÕ×yØhÓ^}=me ;{ú6un¶æ‡6uv5Z[ýA„Òæí›6ÑPw`—¿„%D÷†¢ñæáÝ»ù°ÂÍtôdb¤s˜ô²È|t$eviSCÃéæh<”ÜOç·ÒD Î/Fˆ›iíͽ=þnVí«·YÆ\‡LÐ;-Á¦÷w¶¨ÚÚÔâ'= Æ#}áD<­ÆÓ}éýCjŠÄ^GÓVy¦Ùó¨6\¾ÁÒB  ¾jº#ºWí!–:&–y¦uyQìv§Cá=¡¡žPL¥0HðM“jJ<Ëwh>P.£ý(¬Šx-ý'ƒ %a5•ÚšH‘½ÆV¤;MqÄZ í]WdYöï «Cé(9 ‚bðÙ6¬&÷#Ì+ΈŸNÄëEü?Š{ÄÅX¸™¡ªÈQwñ"ù‘´Ó¦†"¾b„Ó‡EôD1(/®?™Lì,žŸh.ñ'ÿ«a>UÏ É †ö’]æxŠj\ZŽiF§ £À3ð'ÐÝYÏÑ ~•ˆ7*xÞ¬ÀíðmoÁ[¸îTàxÁ},lC¼MÇàq„…ÇÀ6Ó~S'à{ Ü÷*pÜMpO«ûÒ ƒé½1¿…£ ÞŽ$Çð¦ˆw*xÞ-â= Þ Ï*xPài8 âAïÇHY¶†Ò!“E<¤`Çø¼/‰8®àwðA„Ùyõäp¡à>¤àw™÷FÞà >‚*ð} â0OQáã >tNÇT%óÁèL¿†ß(ð:¼¡ÀŸàÏ ~Ÿ5=;‡°NÓŽ‡ñˆˆO*ø>-â3 þ(â|Þ$WjÑ]¶žýËç Å¢á/lH„Ójº>¥QÁãOx^Rð§$<>‡Ï+ø3ü¹ˆ/(ø ü%áWÁ_á¯ü É„¿Å|‰ _†7ü-Æßãü#wÿÄÅŸ¹ø “ü_QðU|Ü@Áב–ÿ¹¿‰'·1™¹*Ó¹þoQÊ«§k8ž¦@a¢ø'’õþ¥àÛøoÿƒÿUð|MÁÿá»…ø‰Eû5›êXë6Nü¾ÏºþaV[OÏÖ†U+VºO\¹ÒÍÞŒŠ‚WàU'P$° ©C(7Ì#¼º¼Ð (o˜ƒ¡›¥šK6Ï¡` ¡ 9qw©ç «©´"̃œÉÍÙ¿ÊD½Ú½)‘ìF"*¥»)ù›‰Ö¸ƒ‰4Ç)šÛM—†r³0,Ý<>ak³›»óÑÙ}ª"¸ñÂ|òma%9-«[ô|nÑ3¹#{Ôv5>$«À“{—dM»=žJ$Ójħ{(çQ|}ÊFä ¤í‰E¨jHaFæ¯×2¿"'Pª]z”Ÿ» ÄuöŸK£t¡*pë8gï‚€J™(1b-L«ÄÀ´w7)OÛÈL’jj8–nèÒ*BM–‹Ò´b¦;+¥Þ݉¤ž WÌ|)~?–ãêHkö^¼Ø33mþflõœÑÌ y©çØ7@¦+…Ré@<¢îëÜ­gsºYØSÃý)ãUé)v …éD{b„ D΃°à(&$ÃéC[“‰!5™Žò•oI‘{]÷*Úeѱ©Hº|}º@Ùbbµ»[ Ù21œ$¡ÀÄÔ¶—$ 8d/'xòÖ8kÊ]•\øÀknÖhS®s…ã(ˆ“m¶§£1 R|{jעъ£]+§ p—Ì’ËlÏåü,°¤¢¨Ó·Ôˆô-eöKzM¤šèa(@0ÚEpSœ!þ¡dÚS÷’çPІs5Š`">ÈÅDÅtI°³†c ÆÍ¬!Jk·ïžd(¬æï¿…î«-šƒ?1ûð±Œ$CCún&ÉS®Ão4úó¡ÎS”‡‰3/Íqž]d˜Ô“NdÑ$F³¾UYÌûI"[;Ogížàe„Ý-ÆK¡ !ç›,˜Í\¡xh€w•Ĺæ lYÞ>=¸ñSŽ¢J6œ©žb4¾r7ØuÇ|#ìV5ùÅÊ6PÞRR9Y¹kñlaó+…S+áb O¯O>]k³©ˆ>Òhå7/鯌~ݬÆVÃp¶ËÓ»ñÜ›]tûP$”V[¸zÍ©-XÌù?ÌH`eW² ›"‘(§°PLWŬ]ÅO(P“»É ÖM7@Öói†z@ÌjOAEpÃɂéßM*È'Ú¦ðžxb$¦FTwˆ©Ädµ§(-£š½œkב,ÞVÍàÝGÅÎ@!vªL´*3o0Þ¢VU¯k<…R¼8­¦LŽâ>º!Xåº_öçŒ'ªûÔð0»e£gfÉz(ø”+„)U„uŽm3|N"F"RÅ¿hñß:’Œ²´v­ÖФµµ¸³ûX<Æ ¨8&uŠBEŠÚž= Ú]GR;£œ¦‹ÆEJ=6z:©|Ç­ÿP_qŒgÎ:ýKP«º;DЦ;ÈV Žzô NW"‘Ö‚ÑP(J'’´éíÔ¢Eᡘ–€ª<--ÅÓ½–«XhýûÆ ¢Ó9+òöâ×’þ™J_bÝN joˆ™ܺyB#éT»’åÏ?kDí7ßoHÛƒ¡Ô ñ™,¿Žm£%Ž*O øOIOe]ÌUǺM}Y8/¦ØaM#-t!Mµ'B|–åpÃ-p+ Üsa|¾EíQþâªý»¾­µï€;µú.¸[«ï{©ž÷ÁýAêßoê?@ýC¦~†úc¦þ8õ¿cÚoõ4õ/§þ„©%õ2õ¯ y¿kâ÷08øó•Ö~ ×ê'à{TKüUG«õ£~R«çñ·í#9£`uYîÓ¾·ÿ˜ÊÙ`?€¥(ÂOè¿ËÞD%MýžÓÅÖ‚ ìDÆö p±ì³Èjc° ƒ%–Z>Ì8To¨¾J' ¦w Ž{¤Úzóä+<‘…>«ÞpWGm.k¥í ?‹®§­Ñ¢õ>§Ñ6 õ¹ÅúœEŸ[¬Ï-Òç–èsV}n‰>g#!ôé¥ã°ŒÅà‘J[õ9Ùíhü„ àéånµSƒåÁJËtø  ÿ±)—ÑoýN¦_·¶~ ¼£0ß[2µ£àôÖ[Æ nìÞz©«= bmêum¬…Ó;Ø uX9 í¹ö4²U&²¥>qÚ|¹Ob—D.ñ‘ ¢‚ ð8hZ^¨ÁÕØŒ~£¿ì⥮»±UhÀmÔÚ–3ï…P5 Udcx^„Ÿ&aNvõ‘÷a?Ç „Š’(Mðc ˆ^8M„_8ŒÆ/' RvšþDøOÊ“!r3¥’Ѽ‡jFs[0k¬·N¾M›”qX•3°š¡ê\““®Ï#j” ùÔd^RY#û8@#¬…ã¨vòÉ“šIN ~K] 7Pý"¼”C²f‘bîdׂ;È'o¤â”“-T®m´ÕTYÆÁç]b¥­Žä*‡u>É%Õd`½Kª"_ÚÀ¶ÙèXx¤¹õŸ¬Œpjc©î‰M•¥+•J…盹hᢕ ÿ8l"î’KÔ¸g`³KÌ@Je¶øì£°Í'»HCíÜö›Úk™C°Qv‰G ¢¯‡Ncf!sÌÀVãm.‘É»|vMàF¹Rv¸o®ä›À?݆+÷ŒÁv_©×¹£Ä¹ÓaËÀé>ÅUêRœBz3°ËUêpgà W)ñ?ÓUZ¢µ3pÖ 8›,Óç+eV®R梸촫¢Ûóœ)[”é[ðâïRî*s•çwq‘Ìý\œE¦ÎyÉ2ãføÜ§iõ]ÐAlÅ›Éüx׆õÏû$‘é°|™‘m!lÿN„ßÕ Øþ±ô}pN°O§bBxæà»Ð4 g(~™ þ¯ÃŸ €(Q½²ÖÎ@䨞•T±›`9À‚g`Zˆ¶×:Ï% 7B)a÷*Æ®Aª“í!²Zƒô Ä 7BY­£šØÛŽZä,7V8ãyâ $&`ˆ!|žOd0O@²×E&E ¦UÎ/M¦ב²ƒ£0×'’ W“ .ëa\Ö œOÒŒäM´ý®Þ°ÈþêkÀÅDô6Úèe. ©¸ptò yÁE\\¬1¥hj–ó£$#åŸeE½„'ë [^Dw†{4·\v²ÝxL«G›Vë¶ ¼¨Â; A°iVàeØâ…÷ÁIí¿LYv’3OS\;Î<(Â_µáÊI¨€’,'6èRZý ¼j$Ú‹(þÛxÛ ¸´·.ƒû¬.+)ûÎOR±“tQã²:?Åmª?ÍŸÉÍÖ†j½Ì˜ý,Õõ¹I0ê |.Ÿuí ¼"¼VMÐzÞ0 µ˜"”…¦ß1+ôó¤Éø‚nøœ·D{ý®¦öñz_ûµqíu^^‚ä§§wÈ‘Â_¢k€n•ŽQzW'û²™ì¯óÊâdWåÉ a¬¯Ë‚ˆôpý.žŠ‘«gÆ>ž¥ëG °­_¶ì=XLÆ ¦û¼i˜ÎC¦ãû¾ô¥ÎØ.3:c;ã?ä›ã9ûmB ˆÌfÏžs¾ß9ßï;ß9;ùëŸßÿÐU´ãz1ÊÚ;,ÆX¼Ëâ=ãH¨˜À Ö&YL)˜®ÂLa¼"Ì!rÎòÊ‹›,>dq‹Åm±˜g±Àb‘ÅÇö ‹OÙüŒµ;œt”M]Á’CÁçäcË‘ -H¨ÌÚöJ~Œ„%iç-×È‘–3Víu#E7c:}Z'í\:žqîfSKqǵsFüºî㺓™Ò×9hZ¦{MÂÅèéÐî[DaÔN.ýt±9Ã1\ Á([JFw¦MaÓ ªç\=¹Bà›úR–RÊ–·x.Ú=¹¬¯ëñ¬n¥ã3KËFÒ%’¡±Í¤±æš¶EPš°D*:Û“¶•öt$QZ!·ôlžÔÆhy^æU“6Ü‘dÒpœQ®"9œc9š` JÀI¯êºÓЃ> —Ñ©áEthèb-Ši ˜ –5¬°3ËË«èÐîQÈ»f6>mÏå“™±¬±jXnñtT®a{‚®S§²ò.–†—ѯÁí|äsX¸œ5Ïb6Yl±ù¾ÔpÅWøZÃ7øVÃwø^Ã}^ýÃ`C•Ӯ°£ ˜Hˆ”»´„e¹Ñ¬î8]Läx…%4•l’5—⇱-§mOåÎðNVÊØ$hy·V©9Îÿ÷*Q4D‰ýË ›Ž vÃØ¢b¬“šdÎÍ™VÚk’è01rÜÔu5v!ßÁ ‹'unÄ>ÜÀV™u¯G ä©þîaÓ*IXL0AëH¨j:Üè^¬–ZO_þҀÚÕ|Ö5K=Eš¾°žJÍäfý1ˆNL”s/÷,œ8› %¹¦üÝ$ ž5çÉI+é ¦C¦ŠYžµ7˜µ7—ÞAèCÝN}‹PApAðÍ£÷îòßQöG"<±di„ïÁK$¯ÕŒýµ±ž=H±b={ ìõí ÒûÜQ`¬erGŸn!´Dïˆ÷PÁ¢²€¤aö‘½>²)¶K˜]H»PvQõ ù!äà#þ É ‡écWñÅpìÏĈcïQœ¼j®nIrìx9ÉÚAõÏ×k¨~âñˆí£fC±yÚT¾ÃìJOpµÌØKñü öÿ&Œ:aæ+TPQQ¯jx ™œazÞÀÕSÉÖ'ÛðŒd9[°÷‘0…qV²oâ-Ÿì}ŸìŠÈóÜ6B‚å3qã#ã¿ ãyaœÀ­rÝqjÔZ5©ªGíoНÜ>BÈ#‘b2S+tCNh/ZæM¦(“ ¥nèRçå¦Ö#•Ä?Zýt‰<ÛÄÑÂ\©´>)!Ý3w˜n¼–ÔkÔ±"~ÐÍN®ôN¡cÛžÏÔ&º¬˜HF N!ým û™†|&]gÉÔ<ó¸,ÕH‘T$+¼¯CS$Côn§_‹IÈÿPKõ6Y?ÌÑ PK6A8org/hsqldb/store/BaseHashMap$MultiValueKeyIterator.class•T]OÔ@=Ó-t)V>AA»E-.~ƒJ$$®.ø€!QžºËd·P¦¸%ðW|ñ‘4I4ÑwÿƒE½3TA¢m2sçι÷ž{nw¿|ûð @S-h…kÃA^YžM˨˸ÒBËUµøƲ¸f#‹‚…q 7-Üb0WøfÂÀ^04Gq¼ÒX£C‘ÁªÄ !y¬:_×ùd-L†ÇJq½ê×’—ÑRÙOd\çþà Ⴄ6¬Mr2¡¼Ï0äÍ/…éx‰382žã²”’ȸêîļ *+„|”#Yµ Q(}OœM¡]n¾´¬~ˆªÿ´¼Ì+’hØ3¾&ÃXP‹–‚Å^(u˜ºš¨jÇc"½×(Ý$\.QƒÌn÷pÞü‚ƒ.t;èAŸƒN:8> ·ÜÁ]˜tpÔý ŽmÈ0òçâùF¥6ñU.ä>-jP)1X$¥Gå|ÀP8N³áÙF$CÍï ßüITÿâwŠBðút$ 'röÃÐû[¹(,û¿bû#BúŠßfºE%kûê>tfÆ" ª-ÖňYêí\tx@2)Δ¬$ªûy¢.Õ}-·¶‹°Ú†ôÙß½€d Ѹ#Zz¢Šàb Äè?¡mA }€,m@ ò©#©ôr`¸„^BÅ– ©Š þ–ˆ°Mz m¡ILä ZÃ’…µƒ(¹ ´Ó…˜ÑÙòþÏÏ „s›û„•_Peôåq™l‰æãô»‚þÀŠü‹•¯ˆ¿mUwÑüÝOë =€«g ¯!s: -(^*¨Ä!:E7¦q ²–Kï‚íÀ ?Uj$z+_‡ôPK9‰êÏPK6A"org/hsqldb/store/BaseHashMap.class­: x[Õyÿ‘îÕ•t¯dYöµ-K²ì$GÆv0T“¤ ®C’ØÄ!!„-,Iæ‘Q]h³ÑvkǺ9Y×RÔGN‰^…µ]“•½ºG·îÕ®clÝÖµ°g\´ÿ?çÜ«‡ÝP¾ÍIÎë?ÿãü¯óŸë¼òÖó/ÀôBœóÀœ§æw4øº±ò 5¿KÍïiðû^ðÀÐä©ù5DÍkð'Ôÿ)5ߤæÏ¨ùsj¾EÍ_Pó—Ôü5MÍßPóm"ùàoiô]6G€Wuø{xÍ‹£ é?jð=/¬†¢æŸiÿ¿Ð†ïÒ¿ÒhúCÚú:­½A£#À¿ÿ éÒ迨ùo ~ä†ÿñÂpv¿Ià%‚ü˜FoѨŒ j®1œÔ(H•©ˆÆ\4Õ¨q{™‡yiŸNƒÖ|´ÏOk 4 Àée,HÓ&jšý°\v>X.7ÒÃ35Ö¢±Vk“…Ô¶dáÐh1•OsyÆh6›Êg’…Bª ±6æÎÙL1½7™™M]Ÿº¿²ÓÏ— •wº0š-âìOº°#—=Èçzº0vû©IEÈ®ÇÆÓs$9ÑŠœù,$9¤ {îÍÕ,¹!](¢0÷Ô Ó»#—?بpwfêöþ.¥ú­ÃîLά©•ý”é©!;•ºAd9î6 z IÉO¹'y{EpÜ<ŠìsÖéäjÓÍ;îLÞ“ìÏ$³û…Ȉid„BlÔítJy|¹ÈU(—üK)rÁ“œœL ;ÓYT5²×Å|87›-Ú3¹·aÚ6ŸÍ­ÓXÏfm‘É%§¶&'¹ÙVÄMgÓÅt23œœIN¦‹dºâ¡|ªp(—™B>ÓÉû*}f605žË¤'ï'®ˆ:>œËŽLÏÜ;™›žIJëtUk8“¾]ªhØÞ‚Êò¢E¤ò9î2Æa1’2²4Ë[ž2œËŠI©H'¦Š­l¢E&UY»ê°u^»îDÞ5vëø»¯ÁƒóþÖ-;v db¼mËÔ‘OLn¸qËî=#»¸exxdbâÖ[nBÿÜ@ÜÄ@ë=°n/e87E"O““w¡+råc@"æÈ}“©™bÏ‚ü¦Š;r¹»fg´t/w¦Ñu£˜‘\7ލÛN]b‰ n#®ÔjߊôêMR^]¶{MMåw§¦s÷à9®éÞ¾}9µå+Ö­MU´¬4Ã`ÃOKse¢CÝÿ‰Œ<F̬]AU+#6VÅÂî^{ûÊè*†U QœÝë0:]ùå#a^tš&„b0dRÓ©lqK>Ÿ¼}DE§"hp2“Jæë€­â [ó¹é:ˆ7›ºÏörÌÜ…<awî^¤Ì)ri¾‰>´¥’a†SéL:{PòG̦B |k&G^ÖœÎNæãêì„$%À[pOÚ¹D¡Ã¢lé‚L>Ü<\•?Öt¿m!ÁõÉ\¶˜Lg <‡˜+Xƒ”M:> B;Ÿ…ãƀÁ‚伪Bb4“ILf¶äÎÒ)íè5à>¸ß€Ã„ó3„Óþ“¯¤ÏBÜ 87pÒ¼nFÕ kÀp—·Ð¶ Lp+²„¤QŽ ·Ñh† ï£Q‘ ¿ Ç Ö_1X˜FZ{~VcQƒu°mø5¦UÞónM’½Ó`]l•ÁVÃóذ5»„X\Š,ØZÖmÀÃ([ÇâoÀ xœA'?íl1éß•›˜<$ÖÖ*Z³Jâ}™Ázᬳp'áÓÜNG>Oð ±(Ág x€øœ!#ž§ Ö'Ø>eÀiø¢¿ Oi¬ß`ëÙåÜ‹ dðUæ]AÔî¦ýOÓ®+ ö.–0`‘x~ž$µÇbábÃ:ä¢ ]^ \tÿO(Å\Ýòrq¥îžMf0Æ}²»ªÂ܃{—¼ÿco:x«p[1f°jéê¾h}Å£Ï+ê5ëׯg0|q„ú‚l¥ Iº)+Š tEÉ0³xòm•ZŽ×uòàš(AR+§õ•Éyg³¤º]œ'é™Ëa¤„wÊÔU#ËD1Ù‘kÀ]AõgS÷Òh<‡eI*_Þ÷Š©i*ë(COæfPññ•îè–¸8 "uód)ع§sSé;Ò),ÓÂuææ×œÄPòÉì]xÌî›GùϺQèÂwB@ÝøsUS”txÿ^Ù¿Oö·Êþ6Ù'y¯P$ò~’÷J.|މŽ÷˜æx÷˜ÏxŸ•ë9¹>#×1 y_}QîÃØçý½|€2/ïó}@ù—Ãýûeÿ ”Ó ß÷°”ÿŸÃžÁ.û#8ÿ`ÕüC8?Z5ÿyœÿBÕüQœ¸ÿ#uø­ÃÿÅüüRÕ| V¡¤ƒãø—±Š5ÁB^Ÿw.€#îXgø“ ¿Êþ³ ¾vÕµ!n,€+^wøƒñ3àºóÑ„jª¸ÁåJ¨ñÀ³ßTÃÊYð.€ŽpwÂQN@S\Y#nº^Äu_ .¸N@3-úqñKаh¡‘vé ŒZxM¯¹WD-<ÓÂk)A4ªÊ­­¹­nš‡Leåøí§y%ÿ¶ —¡T ~…á€k ºØ¬c¦Ñl6+|‚=ÿà…†#TŒ£ÒTìûñhzd›¢Ça5NÑ!¥'¤,Bd\%h  ÑEˆn*•¿=e3nç>«— Uƒ¹  sêÇ$õíH]Á¾‡ÃH}cä8Äpâ‹ôm GOáÁÎ@G¤oc©üj¤BÙgQ² `pºÇ%Ý8saßG¸±£Rì.œ£ýƒJ¬EyìX½ÐßÖ‘ö"iS"ÿºMz¯$=XC:޳˜ÐÊsÐé€A¥E‰-çñ­•xtHŸ„ß<6s#`‰÷ Ê»6!…Uç‘Ð °z?:íšXEK=ÑgáÌÛD]€ÛɈŸ²M¸œÜ„WIjQÇ P§”„bKFK(j‹8AÙ´üÚ…¡)M¥"2*y üÈÁÁA䕇àál7_‹M¸‘ŠºCêyPÙJ=½’¦ž08%²”^zËcjÇÀMúu mUârµˆË —”e¯ªL‰"S¯ŽL}ydêõ‘©/L½.2õºÈÔ—G¦¾<2õ®qÓ/&¨#eOu˜ê5aê«„éN¸Ä ÓøêÔâ ž5ÍÊ›°Óñ&lÓÔ¶†7áZæW[±ßÂüŽFcµ Y£_lOˆ˜e?À+UÇþƬ‹«ÌEq¨Y¶ÓúnGÂÆ¼¦û8\Ss鸹‹š˜ë…aÝömã–1í&;ºKås„¼`ªs¹ØÝâ®Ü-nîS-¦{`È+2’4̶nádW =$̾?LÈ+¯‰æ:*½Ñˆ!e¢Úî xçIb— Uñ¼Váyþx¬7¤˜˜†D4qÙÈÛÜâL âL±£•CÕ¹[œÿ‹e;Æzh)ã{ÌK.QŸ¸ÃþÆP£v™ßÑÚÐæÐb,¦ZÉöŸ'eáôœ¹±ÿxÏÑX]J¥•LÝ¢x"Púª#ábCš©‡;¸€ª¨¡`«œ ib m¤˜.ÒËeÕ&›Zhbzâ´ãš†:–ާ’³¨¥òq\´OØÏ2V÷n+}ùF,½ØwuÅ—‹$Ù]¡NhŽ„› aV9Ž‘NkC~yxYÛi9°&+7dÒJåoJ†ÞÃOžÔeºiOMù¢YåËÕq«|é·ÊQ!~Oµ{æ‰Q}!ngÄ{:M|•l¨Ou. ‹DBûièÛê]EϦNðí*õv6ö†;®¨§Uü9ø¼t™Gù àn$»Q„íFï |­ i;^RáA•S8uàƒÏƒbo3|éµÐ.·–¡6à>¼ï Õ©Ë@Ǩ˜wVŠt7¸‚ ¾öv7Šò8%mÿQ¬= ì¥Î7“T=äÍ΄–z< ÊiZï\|m¡<|u‹ÝK õˆZ&'÷óì¬:÷”ʯWe*z#;гL5%\»?¡FN‹žA—gýʈj.tyo‰ß0Ưx|¦Ú÷È :˜ÁÓÚ?誾Ap¿^‚µâ ð„ö㛢I\!¿BœsðJÛ\q‰4¶6~´p ”HB;dß®x„Eèå…ÓTž…÷%¸Y‚›9¸Ù7 pÀôuƒƒ6¸U€Û$¸ƒÛlpà¿Ö+8<`ÃMqí·Xðo±á#Ä‚pøˆ Gµûv)|;·ÛàA$0Þƒ<(ÀKA÷lf?Æe±X¬£û´­Øòý}¡ÌöȦ#Îr4ü8Pñé‹âmZ~£Ä3Vc=4õŒs(,þcà:i­ÙˆâK®ü†°E-~³E}ƒÐu-´Í¢Þ!TYK¶Å&Û^ϱ]ª F)ߨhçÝ`Ò÷‘ ÐèX7ï}KÀh`ÍëúÚIÌ[ù¾‡u©ò•ªüaûgoX¹­7 O ãù"<ÃÛXFxíRQj˜;ZÝ®@„_!¶“×›Û‹ëÀmëíæ^ZnAâ§«>khK°–uøZÑ‹p~¾(O]Ä3Ó§“ýG c*Û¯| œƒ áSÒµèØá>¼•§¢s°&lbjïàÐ`¸ßó˜Ð9ÇH°T~:\IÛМ-º¡«Èó´ý…ìÎاI©û“pK[-9bUrP†ŸƒÂrž€Õu¨OB-‰>娕(Ò0$Ñ3¶'„yöñ] ¯ˆ­ûâØ^wšÿeô«"¹ñpò»pDˆ½m¯B¼,ÖSV]¿£U7‡ÓºÏÂv.Âõq^"Øß5*ÖR½ ïÁÉ"œ•œÖ¢sÒ9Wùf*·¯È³°ã”ïYûAyþwÔÿ9x^ÂÛ¤øFUm ¨(ô«0¹kwÑÇä"´‹+ÀƒøoЇ#‹°3¡8ésqô$ÿòÄïì¢1Wª£‰^:®Ûƒnî^º/æÖ8Õ‘­”>ìèõ«ÃÞæž²!_Y:pͲ 5ªM»m*R9«TNõÒf¨³ÓTmá )¥n‰ãF¶ Woª½ ‚¡Z Ôz•»m`QäNs°áÅV„¡a_“Ä¿²´›–—”åÛ*7cli›õž«˜öüƇܟ¾—ä,uÂë&íˆÎpåQšT 3h-½ÐåO€õ$®ï1òÎâÉ f’8¢!!d†›hS í•Û‘6_@r$ÒéK éïÀéÂü[†Ié.·ƒ£×RŽ~?eà”‰6~D޵-/WKEÃÅ=, 'ZOa@ÓDSùwÌdÊÂèX8ÝYÄdÔw¤„ ´ý4mËÑs)TÓœôm[÷¤û¾SÉŸ?¢º\“_üÏkæ®Y£c^ÿì:´ÁÈzŸ'ïòžA\—ñ~…qþyç÷;~#h<&+hìâ˸1­¥=÷M /)ŸÉa¬™UNÃç<²·­‰Ýã?°ùCy5%Ž:kñ9C§â³hýˆö®åVl&¼©Ö÷²!¿ßTT|¦4¦Ÿg–vŸZWt ¹5¼G48¤;(²‘ ðAGn ó§!}¿Ísž).fÅ3²gä¿?¸ùšž¿ìyåsxv½Ÿ’§‚ôdpÅ2¼!Ýs½ÞúŽÄ6;¡®1~@lŸîC$)$ø•ÿÁ­ÿŒàWéõ¶Ç_ú¿ïkmÚõ¨/p}7aðÀÿÒö%§È™a-€t…®*¤ËêWà6•`^?‘ü€ }o[ã¯m?b¤1•îù|NÑ´Bøö&æs™oûÞ˜ØÇf}*ñ€Îk¸hœö00á蜈Åm]È,üy—fÛ.ó)÷|7ÊN”ïìO¨k=÷ý$ßúÚYü~b¿í&šGÔÇ‘QŸÐYDnqé~ïþ PKÓà‡K¿ PK6A org/hsqldb/store/HashIndex.classmSKoUþîÌ?Æc'McÒtì„ò(ÎÐÚ¥@€$‹ £6. ªD`щç6qc{Œí”„lú+親¼É¦RSª²ì‰Ÿÿ‚MTbιžÚ-ª%Ÿsîy|ß9çÞùãä÷#—ñ© ŠI¤Q²I\bë=—Y¼Ï¾ØúÅ"‹ÌŸƒñIKq, $·ýîöWþfC ßTÈѨ·v"G¦¥¾_ u=¬·zª# (ÁQ ÕT­Þ•p·Õ˜î¨Zï7UðRfòV}OëõFl$šaP¿UW@l¥Þª÷VÉ(T* 7ä*H¯÷üÚÎ5¿­é©C«£ºŠX,JåÌ”>ëxWÀ,,܈c’µ†ò‰ÕÙR½Ïi J+P{„[¨,ðH但;»mâ {MíÎ wMÓkJ·w[c'÷¨™':ªÞQŸ5Û½ýaˆÑ7Ì✃,N;˜Ã¼ƒ×0ã`“N±x£Sfq3q¬8(ƒæ?v¶JÛÝïÁf©Û ;ªôBï“·ý;~©á·¶JÕÍÛªÖ{ɵ¾ßí©&æw:þ~-lï x…«ÿ¯Y®¼ÂEãཆ ½¢8ý©YðïT¤©[­§#4M¦õ­mý,I—Ne˜¤sÞ¯žq#ç>€å–=7÷¦—?„|Hqœf"“qä…ÚM»‹ Þ†‹ô¬ûÄ^Ë=±—¤wñ–7+ó#þPw!xµQÉÄn’.z`­°¼vW Ü{°/¸Fµ?øÇ3‘`‘Ôͱeû±aü‹”ˆã4yÞá.E¸s„Ó¸±1®©q£~^…ó2Ä™¡‘ Ò)w*õ£î±} q~”t‰R˜Ì¥„äϰŒƒqv™U®x0b2!’d¾3ª>QĹI·ø¾€…(¡A÷Ã7ô%%«yã>¦¼¯!±!oÒjVûH{\š/òÝQ4Í”n¾Ú‡Íþ\¾ªÃF•«’\”ôèFìü¸©$ä3ÌŠd&FïFÌ×#楜&eØ!aOhì訷Wå÷b ‰"oX˜N‘}#ôÄôsùÓ,«\¼(³ò–³Ò½ó<ç¤7Ü AF„ù¡£*Ë}Le%—Ų²¸(ûƒ§9Z½y`2 ¹0EÝ_šßeP½+Eð·’7µât7ÁopøÌG˜z_ #ñÔ:¢ZcTëEÔ¿äx§ópN`ÓW’KÉcd¬g0ÄÜ1H—Äü1OþPKñ²£PK6A*org/hsqldb/store/ReusableObjectCache.class…QMOÂ@} •ÂZDñQQ ‡&^1^ˆ‰&!&·eE•ã?ò*I4ñø£ÔÙ‚_¡Ñ&3³³ï½™éìëÛÓ €88² lèÈqD±©c‹cYÛºŠy; ±C§ëøG Ñbé’A«ô’a®æ ûúL¸uaudÀÍ1¤šÒ?^‹î]Ù¨:žÏ/–ª½~Óly7†evËüM)“ÎLévŠÿÈÔ4|Ò°&I±Þ‰0jÁ'-f6´¶"ª¢±¶uJ¿Lšã;[º¾ÓëzfaXƒÁn‹[avD·i~ ì*(÷çÈ ™ð¶ …€ç÷úÒ¼OíöÜjKÛ¯»EkO~·ß3,¸}§ëÏQï ["O¯Ê¡¾˜›üeeŠŠ©½Yäñêþ#´!âDÒiž(IDÞ)e:”KjT2…ÅI¡¥  ÆÌÕ±‡ K MȘ¡Œ)N ed¦Å:‰ãŸâ¬†‹#jéäC u2.¢ÀPKTtÔÇ€ÚPK6A org/hsqldb/store/ValuePool.classVûsÕþV»ÒZòZ–Ÿ!±óN@VìØ1!¥±›F–e£D¶ƒeÌZ^d%²d$¥ …´@Ë›ÐBK_)Þ8VÇÉ4vð Ìôèô/èðsf¨{ÎÝ+¡Äb Îwç~÷œs¿{Wÿúßß?пy@Ö 9yÆE6ëx„ñQ\8Í­ÇØü„Íãl~Êæg:ÎxàÅÜù9»>Éæ)uÏrël~Éæiö{†[ÏrëWÜúµŽçÜx/°y‘½Äæef{…Í«lΩgÖÖÖ¸õš-ø »ü–»¯³yƒÍïtüžñM6P 'Óùc™LJÁÎh&›èœË=”šéÌå3Y«sÂL-Z<{—™›2zT¥2鄽À3›YœIYvÇ;“LÌZñä¼™’³¹|6Yt­‹ †ÂÓ±±ÑÈðàt,r<¬@‰(¨ eÒ¹¼™Î‹T*óaúÃÁñèØôD0:ž>62KhÚM³ÖƒæbJDÍdN-.Ä’Y SDXÍÞ±éÐÈøðm+]ÙaÀŒSN¼…CA³œ2‰0£V:‘ŸãYå¸ÀÔÉ\^Á®©ïT•Úù뉸#ÃcáÁðèt—‚†èIóa³3e¦‘tÞJXÙž2}eínJ¡Ø ÞKê‹ N÷‡C‘¡`”¹šm®y3?×Ù—LôÛ%ï¹Á‘(}ÖüBþ´T0›5OSSeØ3=EÇ‘™“V<_ÉÑžá„#% ½ªs fܲyÔWâvõ&ÓÉü!ª¿mBÊÌÒIUñ -ŒšXÞŒŸ¢"Ž™$%Iž:þ¨ãOʰn< ADÇìÎZ9KR¸üS‘³»ã)ËÌÊAZK‘R½ü‘¶Šå×É#šáÈüGÊ]x‡æû…ÀIr×{ØÃÒ§˜ÿ­þõh[?DÏ€ƒ×-Ηú+,D*,¦zÑÊoŽ]Á^e=´U¦W„n&sP•,3Íõ9^¾‘'Ç?Ó9õÆSâü Œ"fà‡8¨`Ó·ß}Øo ûl¿éµ1pAfþ‹ì5Ðɦ‹Í>6ÝØKâ¼±¼à¼c¸ÛÀ_9¨·ð¶¸ßÀ;0 \@ÜÀ»° ¼‡û ¼ |ˆ |ŒO4Vª åj`  ,³gÖ˜+„~a6lÙŒ¢`à(×»1p„ÍQD¯‹Ô¾1†0l`„‹æ˜ ‘ξñ›Ëf1…¶êÖŸ%±%íôO… iÓñ ݇LºxÉüiž·ýjéHG²ÁÙY©o[bbÄÖ¸·Ø-JÚ•’ª4SQÈòòWÔ¢;·8““‹šýß"ؽÍtsúÒs£Ž‡¯<‹ê¤Ä‚ÑÍjþþ¶ l§oY€Þî ¨b)Q«ŠÕ$°Kâ>‰ÝoÁíØO“;ø{€ÔÿAYÿNê“Ø…©Y`oÙü¨¨¬ÿcâ%1 þ>á¿‘Å#0,q@â D’À#IDI4GÄþnV:¡—ö¢;HvŒzu„ ¡3p ÊEðÏú•Ó_A§¿ À›Ëpuö6@úÜç+@[†óS¸ ÐÕC›©}Û›÷ a}ó¸&›´&­eÎy U±³ªraíß4¡và&Ô=„NÂjB¡A¨Öø_u«h¹ïðyÔvn?«ÅWWà츄Ú|í«à9èl_ÝèüÇE*›—qŽâ<‡×*˜´\kh…¦ãE}q »¾F§ŽIåê×P UÎÌñk”«S¸Ofï¥'«}(Zn~äìú9Žó2D^ ¬î‘Ôµ¨'Ÿz4 ´©ëáX#S–²FÌÓ%æ´’ÿ»ømfµ·E$ÅÉ´pRgJã¿b§¡Àj»Üi+vКØ-p}ý¥­è9”[ Ê­š–ឌRîM+hܳº4´‡ˆe>q m^:”52ŽR D:ƒx‰T¥m©‡…ì–4µ¯. ·¯vÜœT+#…µž´ZVió÷"} I:%Óßø5l ‘½E÷pi5¢\’?&ÙøÒßáþ¦¢¥,ƒ»âIjXŠÃÅš¤æË6H##7¸M¾QÞMoðûÑz®el^*èpxút,ГùPIÈψ¯ºê™Të|™Ô„u ëVg[€ƒ.ÐgÐÚ¢^ÆÖ¶i¶;ì¨ß)p×´Lz/a÷eÜZÀmÜ«-öüê§ðÐF(`zÕS@»ýžâÿPK§£•Ã÷ PK6A'org/hsqldb/store/ValuePoolHashMap.class­–ûsÕÇ¿kïÖ7Žƒ£$Ž,ä<dÙŽJ *5©‹c‘±ÀÆà˜¶YK[YÉZëH+j§¥PBK(åý áZZÁ$rÀ3Lgø…öþ~ï0UÏÙ]É+["”Á_ß{ö{ï=ç³çéßÿýìsð‰×ãH3~„;y¸‹‡»›1‰)Íîáå4Ïîõ‘í>~0ö£ f}Pq?/~ÑøÐ×¥«~ÉË_±ô/5æx™`qRîÃvüšÍ)žÍûÆq'ø¿Áæže|è„ÉÃq y8© ëC7r,µx6¯ ïCàá7l^âÙ2§xù[¿Sð ù`:“¶iŽÇã=ÓÄa3© ðݺ”Э´™É)ø½€MY=§[ÃÚ¢–H[ˤ°#ß4ii‰ãÚâ”6gоÍ)Ý:’J&ãKOéYÛÂñž±ãÚZÔÐ2©¨k¿Ùö`V€ZÞ0ffRÚã^5IJ·–u“V6ÍÊ}aîÈÜq=aÝìÝêèhóC„RÀ–Êþü\ùˆpx£>¯qˆÇÍÍ"oö°›f6Ï4’sQkyQÏE§Ò zÎÒI¤ÑÍYÛ#fÞä¯Ð1“6ïÑ:Ñ\=DפRÊ>¬âxDÅiÅüIÅc¼8ƒ›T<γ?ã Á“*žÂÓ*žÁ³„eÛQñžWñïx/©x™Å¯ð¶³xUÅèÂsxo}‚œ®~Y*^Ç*ñs~þ&ÑWñžжªŠ·q^Å©xT¼‹÷T\Äû¼ñ×~;^òE·ãpÕÙOÅßT|„¿«Å*þû±ŠqLØå9;g™Y=:­yýNÓ4k¹yJg4‡´œ^y¼ÛÎ0ô”f eSù=cU*§Ê±ò;U¸ÐŽré´,hKk%Äɲ˜Ï¦È # Kó<ÝÏ$õ%rflƒ7‡ËO);wÖJ©«:û5læ3䀔0t2³Ùš§šž7$UVç˨úÃvUs¶{N`kÜuÈ­ó†Y2´švPwèË®µ}vcv hJg,›¯€Æ0Ô¢%z.ç:Ôf·–!¯‰dÓ™{ö&òiB_²ÆLóDž^€do³µGé#91a·.»5±»åãÚ½£Ç(ŸÛÄq8mNÖOæ5#ÇeY£Ôø\Ë,w‹­áš¡9—ŸË¹’má:í£Å2‡çµìP6«-³=³Ãìèì0ûã£È&õ„™I’#-I;ƒ×ü!BŽmÊä ;”¶r|ÄGÔf¸–)³Ü`8ÈG0]Ôì¯ÿ4C ø1p­B ÒÿöH@nW D:/£!¼ŒÆmùô'Ò–ýý7¹ÛN“·¥g1¹ñ¤ÀDËÓä`0ØtêØ`Ð5\@‹;Œƒmò©"dÚÚ «r;""š®ä<šhÖp0`W:]Wü”F¿Áá?hêò¸&r3¢¹&l†L¿À§|Û<èë î‰ 1É/žCœL-~ñÀ?¡Ž÷±)ðö’©õšÍ DŠh£Å¿™!ÛQñØe´é+øÅ˜ÄGùÅ"®‰‰KW\9†·ÑJûÚïå@¶øAÐ/ቫPg+Ø6îÜÙ7yÕ‹*ÁŽ@.Ñ÷YÁAê ‚”°×Y*ø™mh/a‹W°£DíU ‚CMØ…ÓAh²}Á†Bm]ž>Cˆb¢ËÈ/îI 1Ù/èí°D¶Oô±#ô«µ(I^çû ~)&Û”$¦$],­Ô¢*¢£àÀôËŒIZÅö™Ð vN8·ö×À´î¦jL!;j±Œ©ÛY*¸¥“XÁ©V&úr1mssÈ~ýE\5:Ç{)‚g°4¢K¯-Ð÷æÒÿŸBcÌf§ª‚áê$"ƒ‚‘j>ÑŽ2CŠÝŠÛ\F7¡&²}ÕÛ,¢kÌEµ‹ÓI*§“´?&7Ä¿|c¶ó2Ã{;(úÝgѽ1ÙI‡XðË1Åæ%3/ùbér]^«èœ¡Éžì$ô+ Nvîîk[_Ý£Ûƒ&›(ÃÛ·f*ƒÙÊøÖ `t£’Ò7áná—¡3\Šgqê3£6ÃÑ Ãn.É}uJR^W’ë Ö+Éë UÐVÑÍ%vJR®U’r’<ÌìöB)Wœ[“ŠSqqa-é¼»*«5Ä‹¾·¹¼Bn÷ú×wè^ã•îÕè"WÐû=Ø¥:´úÖ7°ž™Ðô¯`ÿÔÃÂå5V¯‡õW+}«u`á·‡¾½‡Ýæö°ñ¾ÞïÛÀVëd´êsй§÷j½«wÉ@ÍÞµk­+ ×ë]]ÀÿPKj8M’ßÄPK9Aorg/hsqldb/types/PKPK7A org/hsqldb/types/ArrayType.class­XùwS×þžõY<Û²Œ¦@ µµ` ­ÓÚ!ÄKL„È@!Px–žˆ,9’LYš†¶Ð¦û–6uÚ°%.n뤉Ø't mº7é/ý­=§ÿÇ@gÞ»ZlˆäpÜeæÞ™ïÎùî“ß¹ue À*üË…ÕxºššãÕhÂç¸ù<˾ á„'5|Ñ'¾Ä¢gxôen¾âÄW¹ÿ7_gÝ7¸ù¦†oqÿm¾ƒïjx–'ßãæûÜ<Ç͸Öð¼ ðC ?r¡/Ì‚Š4œbåiaxŽÕgxtÖ‰s,>ËÍ‹^âþenÎ3Øã<ºÀ ÌÍÇÓ·oßVèlà ?ÁO5üŒ8Â+îÂ/ðKFñŠ ¯âWܼ&anÜì3†’¹ŽLÆ862ñDÊH&rG$H]jÂéT6g¤r;ŒäédHX(¶DŒL¿9uŸ3n䌞#ƒ&¤3ý-²O&ã½-9e[XÑ.¡vÀ8y¬Uõ)c^õœÔ·ªŽVÍ«ñt9# ød¯¶Ê§P“GC«Óë†êuŽœÐ¤ ·ÿM»iÏKlÚžc_Ö•Ú}¨ÖåîÓà¡„·JZzŠËE èé˜ST*õ] V0»Cc|ú—યyñf¿{Þ6ÙѪx•ùšOà eÈ«¾9Ñ ÁúŸO.©²:޹äü&a!7èwºÄŸÂ÷ËäÙIýaÛ7*8Êcîóä×{…ýÃF‡œ„(ymŸ’‡o˜÷Ò"†i’&çÐèS½Zy4ó˜µ"øŸZ‚ºšªÔŒÃG0ÇÑ@%.2ÓÈžB¸$… k´áª£U»Ï0ê “[å ØKÂè%á‚<v_À£$iÆ\’4汨|ñJR©ÃXJ*õ2>$¡\ÙЦÔ{/óyE畇±Ö¾ ÅѪzU¾e‰*nC¥ÛX$ ëQéÌïù”ÑШUñ&`±8ýJ¸è† Í®Ÿ¿GÃ^çm:¤b1ß§4ìã07QkÇcÅ ª& û‹ÔF«eê—Û‘˜_ˆÄU,Øòç±Ô¸ˆûFþbȉAÑÐ(Úa^b†® ¸®1¡["jXX1÷S5.-7¥Ò0^\~œñpöÒrÕ³|4`CÚ, ;d|È*ót•^9Ha\î•OÁrYâð½2Eï~^|Bæ² ÙlšÀõµ[XlZTòÜ€—ôE*Ь&èÖÓ°˜ `%8Ñ æm¶¼äñáRáʨR‰_øƒUØ.N¿&à?/6²…ª®:[ugQgÝ7Íòh)Wá¥rÉ]—æôñË“(b\#0..bœ·9ø6<že£\Æ/³à°«{ãÃüžÐOaª^¼/Vm®2Y|~ÊÕrá¢_“_§¢Ž>׋|a_ëQé ¼ŠÀyøí.09Ê£Kì0WÄÉ&-@‡¡¶:Ø=AY#fÀÌAexM»B^ù"B¥;'zU*QÆŽýÇ8gÀÆ0Ã9G€™/züägÙmcÚP‰&ÝËN[ŸLN<-g¬IÐv}’Ÿ4Pæ(³±òÙSpR÷€Â@óå™ `j!£ž*Ö©£‘ÿ´˜%Ï6‚e¢¬ê˜®…wh¬t‘¢z†pHìˆC±ž„nJ-Tþ,Œ‰Çkl?—ŒÅAA¢_GA} «B4Ÿ¼šÄD<å îä(ÑFáq¯Hð°•à”~×°z­t«_ÃGÝ«N3ò²d?ƒy…·žr_1=ËÔI6{)%'Íé7œpµCäPkÀ ‡cà†n‹˜L½²vs²‡Uÿۿƪþÿ.) ¹C½]²I‘™ô>#||„|¨#^/JÆVzñ­’ îxÀ';¬Wû>þŠHó§ðÙ°ý…*ù µü²ÝüÕÿPKýÃK+| žPK7A!org/hsqldb/types/BinaryData.classWýWç~fgvgwpAwq¢Æe²’1aEëR!´@Û8À£ë.î.Flš¤mlé÷ý4¶µiéGlƒ`õhûcûkï’sZzïÌ»Ã"+{NÕ3ï¾ï½÷yï}îÇŒÿüï_xw|‘åGNEÞOë¬Q\â“7ý¸Œ9Gys…_ª@ o¹Éïllløñe¼ÍGïøñ.¾Â_­À×𞊫,û:ã}Cż!\òâ›|ø-ßæó·ü؇ïðßåí÷øñ}÷†øÃç?à£2êdx~Œ?~‚ŸòÙÏøñs×T,J¨Ì™é©”‘0ó#F6#a_&;ŸÎ]LMŒÅós3F.ž0Ózv®GÏë4G¿?mHØu…¬úŒôT~:1—7r\£ ¢cËšÎÍ R¯e‚$xÌ4"Á7fæmu Þi=7}"3AèRR‚ÊÈ“beôDd4ÑÛ\ÆEÅ6®Èëãç_Ñgõ±”AI¢;»Ì´™?N?g¤yHÂP¤lÀÈåÌL:™ÎÙI}Üè,qS*3fݳƒ¨yHÅû»Ë_º§6ÒÛwN¿¤ÇÍLœu’é™Ù¼¥ø Ê9ÍQÚ*‘f¦Ð“|4îìb3Q*Gš‰Äƒ;+ö&-\•o"O%t•Ñ/It!FJ½•æ} Ÿ5ô ž)ã©Ã€½mE@Ï•÷£´¡7çv¸ Æh"™ä<”ãh4ÁZÇËhíÀK¯•î]¹G¹)dÉÊ›ÏΦÇõvJ¯w&“3ódP–4.ñÞ²å´gl^™Î¤Gœ©!ÁM啜°j›¤îœ½S"V”5$´9"ñóæÃÒ¤yá5s'R™œÁÊ“YÃ>'?!§Ê÷뛹dºÏ¼`Í(O¤—;b¡šÇ¸8«§HŒØÉKéé©xÿØ9cœ:›u»ÆSÖ¼ÑЂV O¡UBݳKÃKèᇩáy¼ â ×ñK Ïਆv´ièŧUüJïqCÃi¼¢â7>Äo5<‹çh˜hø–$ìvª©ÿäåqc†óÈF¿×UãÁM‡“é ãrÿl¾2‘™MOä}¢ Øµ?àÄ[É$•,{ÿ' ᦆ òöe Æ_4|_ÔèÅÙ¦bYÃ-¬¨¸­ác¬jˆsxǘÀ£DJ?¶n¶’ùh%To¸öY¤Ì±xw6«Ï½ž7SªœÎ±%å'Ùi$ŕմ2ïnÆ\Ñ FˆwSé¸hU­û¯Þ íŽBµP`{Aü,úJÀW$ÄôÊâ‘ḠßT®®#¸ˆŠ{ ¯¡öaP¹ïí°|kœ»å Å»7 R†´—~¾Š~$oÑWÔì]Gø¡¸ô3xM¨ÔS³Ë{Ø7‹RaÞAÝê—Í3B³‹4ìˆp/¤lõÎh,pܪ¥ŸôòHÂQiH¾­@…ð=vøá¨qÐsvûí&¢"+AwAÀ•Y\›µ©À:l]þº¸9ì+À81s¶?‹Ï ¼JÎ;‹ W cDˆºÉKî8]vPÄ\ðc"¤›bôsŸwT¬ŒVZ#‹l”54ÒIŸNµ)–COµ<°€?Úx³Évbá}{Ë»¦yë¬eOX5ï0[Ue!¾!OŠú=*‡@ºn#=:ƒ¨cawÓ¼YK~ž-×q:ÆŠ:®ÐR‡ âqLqÆ4:Vq¨@½I!ß%:R®9\èÇ)§]«„Ð%dÓ0‹Ò)§óΉ\›"/_ Q±Æ Õ7úˆàÚÂK€:I?°ðTe Šu—͆®}/³ éí.)—2˜)ç{ëb‡| Á<)q3Y, a{ ×6ížwÈÐ €ÉJ—žE¼ wÉ/Ö[Äß@C} ñÂu†éjlða}ÛÛg»ÞsIKÿ®³”ÎvEëxH“ñæ=•ÿƒ Iú‡>Fd\t(.¡vÔ>Õ™ÎØ¹Ó·çœÁt>ÍHz$Dº²™|ÁÎÛ#' ¡íéLº°S‚’èîÙrX‚Ü•"xx(±OJßG»`bK7ñ*؃wï³Çúì‚.v =»;»úN9—) ]#v>/¡.±¥÷„}¯Ýowÿ’öPASðsÔ¹%œxµ²_{hPê Ú ½¯½T­HŠmy7¯ç9UÅŸ¤ÝÄ­ø„‰Ob‰çñ) ;;ɾÎîýRZî8X|_潬'ÐÑîý·š8ˆ¬ù•ÑyòØ1'Çr?mâ3ø,/Ÿãåó&^À‡q„ºTÉ_0ñE|ÉÄ—ñ&þGLü<î2ñ6üª‰¯à¯$¬Yħ‰¯â¯Mde#!¾häMü-¾¦âë&îÆ JFßÀ7)#ç» âïLü=þÁÄ?âŸLü3/ß·YÓ¿¨øWÿ†WñßÅ‹”œûïèí5ñxÑÄ)|OÅšø>þ‹†‰à¿Müÿcâ>¼™íû_Þþhq8 L·w1?Šÿ'!Vµž©1-L©J…óKšê ÑÝÝÓÍW}¬4ǵ‚Y‘¸ .EÈs2CR‰…mqa§ôò’sM¢kIlÏX­à÷g«Ì'—Ëæš÷ðJ7™ÜÉL!=êˆí‰î¥Í;(ÈOñU‡ËŽ/mzïêèí½«ïèí{IX¹Hˤ¹‘Îw·sö …Ћºâxz×&*ï{éQ®Cã=]pòÐ-nµ%îììçȆY=•W×ÞŽƒÖ/T^¡’d­[š‚ÊŒ”¢!“qÈ2+Qa˜€·ÏK˜"ui2z™É­Ð%J“;݈“.'o–*<ƒ"™l¦ßÉe{‹a ±s÷Ø×&*Ç®aiù”ÜêUe4#éæŽ\Î>}G!=BÁ§;,M#"as•[@wÕž»nžH/0âÀ\1@§íŠíËîuNùyL§^õ^±²Œž¢ŒeûkÌßò>w:_ph¢ê6ëÌŽ‘ËÕ\®r›€1˜sè²Î øl«N¡¼{7g}ÞÏú«……þiÜ€XðΫ¨_r®»}äíaÔÓgd}äRNa7öÐóÚÄÈÜÀ ÒM !ÚFctÇšõÁ‹>ä~KèÁÏš&¢˜¶ñiV øð#Ðj• h¼pÒ¥î¥UA º›z1öù¬ Rɬ5DŠn?-úÊ”è• ®e̵· ®($—K®ƒ:%̹v¹Àkµ"ò l\ °V'…µÆ”¯Pe…*Ѷïª|áª|wø|)6zîàX蟥 LÜz‘£ÑèE,ëMò~Ë$£‰iD$™p5´ßâî§Q[Ò„´Œ^é"ä/ÎäIáë—ÀE¿BÏ™ÎëI½ÓçÜ$°Ë]owœ‡*O@VJdKÿYüœày‚xØÓ·'ŸFó‡œ$óWœE¨66É '?è²³uÀîqyÏun´€íô·#F]ÄÇâ¢ëÈ•LPªnݼ™å¼ye²Ÿ®µf°ò£¾­µˆDôm“ìå¿%aèŠæ.õÑQŠKuÉç¡4N%ŸÂª ü³øóˆñ™ÐküásPIorŠüZ=OoÍS=áñ eÎmÎmÎ}X8wX8—c‰+p½ëF;XÅz!?̪×Ï`ýÔ<ÅË„Mq q$®]ŠˆŸŒg\’pâpWÃÕÄž™A})ˆÍ°BÚê]*Þ³eqùVöKä`=±Ê]ùýMb%¶:j/Âj"* y~mtã£ÐSÓØàº–" ìV%%â—§¿øß·7ˆ(¶‹(¶‹(ŽŠ(ö‰(ö7ú’б$‰m”°[ܵ¡'÷äR Šº«Q»Ä>ZŠ×³ê‹¥Mˆ3¢˜üá[•¸LVZ Çʘæê–²´J198²2G„(*†h/1 X!ÇD_=ÝôB–VC»µââMrcéGi*YL×l—± >×fÁUK\¡ÚmÌÆÝk¯«`Réõ$îL[ÓžCã¨ñ®†7iç_@BÆ‚î äŠ7Éw­o$/”îÔ‘Š‰Á#¨l@?$FËE­dDÎ<$rf[é&Sq’)²óX€ L&—ä,G×ùè³EîjÈ2Ñ~Ö`…ªµ®¦ pÇ”Vþ#’S8-»Ÿ<ÖÙŸÔ'¡Ò”QW åÉ”(0ÕR,Õ;ÊYl²(á_¯¸µä©ÓÔ‚³¸†ïú÷áÍBöD„ž§‹òŒe¡Yo)v«6Z˨çÏË ëë[µzKóJy˜3w€ai:•˜¦wêDÀ¯ŠÞi [c­š¥Õ;tIH’PQH¦[H¦›à¾×A+©ç†wÉsÓÜ)ü‹TF²,ÉÔÞ#Y á/á~aýNÊîû’nRïK]Þy&8·ö–§Ön= 6s?8”Ö–Ân pšWh¼oÙ·WDâÑØK Ì»^ÓgØéTyûŠk—[ô˜2޵gô¹˜~µq-¦o]{žtë¤û{gt)ØbÄäqÄcFLÌ%0<ƒæì‹q­-3Î"ÓIØ£Ô[õ˜1ô‚2a<t÷3xCñ´&_~Û4ÚÚ̸™ÔãáKhWçoŠi˜þiD¹U„÷8ÌÐ,VÉWgçë³´Æf¥ÝÊõsôE.^{Æ$I’™ˆ*\¥´Á ýÒë‰Y„Hö‰¸¦¿"¢¡©ÆQý¾È]ŠlL; ³©Þ²ÚþœÛU¼Z¾CÔòFQËÙ»$5?Ý’é°½é"v´é.0ÎSß’­­S[Üî"âú”GË77Útq¢B³m…œV#i¥Hê"’IúõH]NZ¡B,£ôy§^“ „4)²ù†—ÝNùΈä}’ŠšÇÿ{J¡á™,Tûov«lÉ¥Úíßl)nMZ2ÛЇ’:3ë% —°SÁ+eêMó ܼq©EÑ+¥L˜Ž•no›å—i«óˆÏ]»V{G×RvrMâäÄÉ5<‹›®¾ö"v‘¦Ž£ôÒY%H$o£NwêÿPKˆ¶ò"H PK8Aorg/hsqldb/types/BitType.classµY |›eÿ¿Íñ}I¾¤ÇštYÛmiÓR`ØÊ H[Ji ÝÑrlÇ×ö[—‘&%I‘áê¦UQç±rM¦0´Lì:Àq¨ x (Þ‚ Šà >Ï÷½9Ú¦åøiÍ{<ÏûÜÇû¦}øµ;8NT»±W¸Ðƒ+\¥â*^^­âS*vºiùiŸqÃ…Ïòð9vñ0ÎÃ5˜?v0ѵ.\‡«y¸’ ¯wãìæÕçÝ»‘å|AÁÝâ&ßìÁ|IÁ—ݸ·z°{ܦà+nÔà«.:6ÁÃí ö¹±_ã71ÍR,”ÌBeÜ×™ó$¯ö»1…n܉»XÐݬÓ7xuW÷(¸—çûÜÏó7ó-&&ºoãòüÖú!æá»<|Ï1-T|Ÿíû y„‡²ÌñêQS«Ké?ÆO<Æ®PðSâaýâ¶hzMÒˆ¦¢‰¸€èð¶'â©´OŸ­ÇF ç‰Ñx4}²€#ÔÕ]{¶€½=1HpÏ`45Ó·õF/¡-TÛE‡Œt÷©mí}ÛF ë”&!í1=•XªlÕ/Òcz|¨Ñ¶”äêч‰®|ÆÁÞt2¢“~:Ù»6ÒiÄdt 'ÆKp&´Ò¾7­\p¦>Ò§÷Ç «uäTc3cÚꊦÈxfaj¿ÁÒþLýâ<œœ¥áWX'P´±Mïñêšm]}t?иüìÖuë»z:5lÂyÙ)Ú6ºy³‘d.¿Õð;<ÎÃïyxBÓ8OÃðGê’>O*ø“†?ã) [Õð†\(P¹@˜4#ˆVþR·É]Ïj:û4T¨öP¿\œúȈ'cëCs»åÜje'\e¨}Al÷X5È=JÖF6µF"›úÖ¯é記§÷Q¡ä!Œd2‘lìà‘Þ`†5W‡fÞú§ÓÔqñ€1š¸ú£éˆJo™ÝÈætNn´\ö½t-Ð«Š„‡f°–ð–YaʜֲW %À±=»P#¥°Ä¤¦Z¿USòå©¥ˆ:fßÕqÚV¿oöø#™0/zóÙÓ—°öþB·&%‡[¿xbÑþÆÖdRßvV:£ŽIOLºzLˆÀQÔí*ø¢©Èc™J'’×#½})]Fã)#m)aV€‡Sšrûé­Ô²—Ïõhû=©¤­vÕ" ÚV¯Žt´ö,-+dùÇ»zú::;ÖŒX®ò£ÏdÞÕIÄ{–c¬ä‘δò~ò»é3×2UUaÚVèõS‘G@’òh4~ûçú’/š2ûiRY/ásvÑ,ššá⧣ƬËcC] w”uòx^:¢©Þ\pè©e3cå‰Eé~Ï$Âë½ö²y 2#+ÎùwܶTÚ WžKgv‰bYW(· €ˆŽ¥ï‹kè;$¥.Öbͽ´+B1ªiM÷?gd}ó¶ó÷àºÊåû!n7¿ œƒså2"4;ëî@ÑØ^‰_ŸÅÓÌx[ÉËäl”ȉ´/‚mBb߉óf“–Ù3Èweù–J¤ƒä:2œ7eië¤Z¥Œ.ñí†ZæÜG™2a<ŸMB‘¯UNÛþ,Ý:²¶ˆæ“Ø×Îq¨u“P'î‚k}IÉ~¸#aÞOÂsN¸$4 íœ0œ„—öµæ~¾œ èZÀ äï“jÙ3:Øœõ†¥³½Å·IìP–òH‰-6-*Þ Å¾vÛÞ¬,м§0wzIIšG¤57…$GM„÷¡ôf^0‹ð(Û ?«OËE;¯¡Ãð#nµþè7Ù²ÖÀñfD`fÍRúÄès¢œOây'Ÿ²h åÌsã&Ëཉ›(õß9ÿ=YKÃëT—œ¢`+š‹»\·š®£bžq ÍãÕ%GÜW]ý$lYQ= Ó›õÒŽÕœò¯8'HcZ¤1­Ò˜NiL§4¦“|´Šü»¸žÇ²úp]õ$*2Š¡×cq&¹Ü¥þûAàfGÐN‚6-kÑápi¯w»p8”iRÇ© ® AV úP…-¶ÓQzùJãt2Ž=ßQ®oØÅMv¿}Íõ`eý½ŠI,i3%©Ã¶wôz+AŠöúí¹qÃ~!QAyBzJq~f£ÙU'êël“¨Ì\£yGìæÒÈžwä¢ÂGr\À/uëˆí4²ÝE³«ž2RL4«na.—OOO¿b9_Dy?Ïg©ÄÏ÷™}–ç“å§s¾™O!Ù'¿ºÿÇÇÔ;|ô8§èR.]E…thY(¿zöà\Â,_åØƒÕœùî»(½Wp.¢f‡í‚²‡OìóOPª¬ ¢9rœ1ÁÇ$Æ”qTÌ’½•œ{DÕŸp©íYš dáËQ«—#<<Öääh–,ÝeDïò; ÁUÊ]®*|t?Ž^eök«½¡UÛhS×o˜¾²qR A1çÔo‹R ^µ2ß9|\6uÓ6©½¶ÃŒÏòK]5gØùï¼ ë´¬‚«iú~t&Ɔaûy¿V·.ÙgÅþ ¶vv4b‹¡Mì`Õó2ñ ÖˆW=»X'n`Óóšçuâ Ü$na›¸ƒ[ÄÛ¸ãy—xÏ×ÛÅq÷‰x@<ô}â1Fb'ÇOPKxIÍÊÌPK7A!org/hsqldb/types/BlobDataID.classWùwå~¦™ÉLÒ)K%Á„BQCB¸ ¦• ¡¨©-EŠ ­Û4™¶!)™‰R×ë‚—{¯»¸€ûþ‹ž#ç(Tñˆþêÿäò¾3_¦Il;j{ú}“ïÝŸ÷ùÞLùíû\‹ÏãHaBù]üÄ ã>^î#Ž:ñ ŠÃÄ$/E%>¶TLÅIgš—v+q˜%Gâ(ã(?Ux©ò2ËË1þÖ‰­¨ñ‘ËËK—‡ãxÇUÌűq<ŠÇøøqŽñ„gýåÇÖOòùS*þ­âi vI‚4$!Z¶*Óî = ØÛÝ)AN m½›¶=Õ’%!VªÏ–í¢éÒs.5\­MggœcåÒdvÌr»Z)T\«6e­þ­ÍRwnÖr²ùrurÐtÍ~ ]c®Y<2bÎ4'Ë„EIÅ3eªf‘çHŠC®œ¶Ü¼]1kscnÍ2J¸>,âaóa3kW³…ÊlÝõ­(ÖŽå͆†–2Ô8ƒ9×r†­y ½!® ž–ÊvT«„ðÐË¡¤£BÉ„š£8þ§n:õs$Õâ‘1ûQ³el;{ÊUÇòmÆ%ô„@Fnc“¶;Üh»íäm—êÕf«Ží’nh Ë0ÄîC ›È{Z]•jeܪU‰hNý!Nä æKXo&ò¬µ3Dk¹r¼›°Òi§e¿e»Š“+¡Þ)Ò×ÜZ½â_¾M!1=un&'J}µŽÕÍ2™HùÙ”ÍÊtvtò°Utû™'ÚŒéÌð×ч:¶!£#Í˳xNÅ Ïã?tGuœÄ^ÿÅÿ$¬kÊ f9õ²›=àmÃÕIÿÇ®V•V4 ƒéjŽt+¿¨^^¬ü‚Žñ’Š—u¼‚Wu¼†~¯ã”Ž7ðœŽ7±KÇ¿xy‹ÏÞæ§Ó8£ã®à]ïá}bÉBù…JÉ:>ZwG§òÕz¥äì=^´f™ó*>Ðñ!>Òñ1>Ñ1‚}:rÐñ)>“°ª@ Æ’eJ¸t)”$$+Ö#„Õ`c¦ .YŽË\h íèö·"ÛÞ~š@Öq«Xg¢´’³ÅQÿÒ1(€j;{kµjM‚Nó&ÀFÂúT‹Ýí´R14)Å „[þùäðœðñ¹MŒ‚žÍ©!š´!%›Ä’å(–¿ÿedÚ+ÔÅ×ÂîZͤ»µ*Ȳ%ÁÐ&;èÖ+ü¯â‘Æ0ì 4÷̘µý¦KVö‹˜ÅÈltjŠfJ³'º”EojˆÇoHžk_ÅøiäµÈíöæOü¸í*ÃöQïû$ê!2Þr{Ææ×¢ù3Èbu–ÀL/2Ÿ ‹šø1ÖΪ‹§}H]ºQT`½)Ö;l¢÷©$zê w*“ÞkÙ6o_Gç4ØhÍÒ§Ë¡_`uú<¤ôt| 9½ñ[(g= ×`»P†Œ(íÙô7PæÉlûjöõƒvm±‹}?!~7Ê JÊçÑõµçæZZ;!ýŠõ*®Sq=Ý€Âs—§B 7â&!ÚÂÝéÌ9¬Ø}+eÒ±žóXõu {³Ð5H—ìòµz8| –C¿P[A;GëdB6*í}\cOBžÇ꜒1¯Ð\Ôˆz¥ÆŒè<º/Q¯ØKÚ*ÜTx v ¿wQbqÚoòü&Éïš\4cD}¿ª¡ ¿ªçW jˆÚŸA\Aß'"Äjê5—¥pˆ¯De»ƒFw‹FG[º›ÇžvT"_ Ù ö.)£/E!§öpƒ(¬Lü9õ>4~üÊgIbQ–¤}š$™l¬T§£cÕ¯X”w['IQ˜Ìqk°ÖnÔxû2y¨£¾lu€;»ó¢” ºHó¸lñîrŽ¢»ë’ó O¹p‡ð]¬Ùæù&·ëÿ¶ÛÞÀípPòn*˜¡ÝâCyù2.Ùæná–ÑËp÷!£½œPΠ35ä?ÀvZO$”‰è‰yl ó ØxèéÇÀPKí|’´§PK7A&org/hsqldb/types/BlobInputStream.class}TßSUþn²›eÆ߄RZZ$6(¥­B+†¶š¤¬VÝ„›°²˜]T|P_:û}QG_ûB:Ó  3í›þMñœ%íX&çÜ=÷Üïûι‡û÷?<ð:VÃ87Û1…iƒ¸Ææzoa†Wo³É´c7xu3Læ¯Þaó.f5äÂxy•ððÃÁÁA ïÏ1ìûæÃ¸ÂèLJ)hXÐð‘€R¬ÚE¡¼]¯¤W¯ª+Å´»µ!t†6n˜®9%Ði~mZU³X•yY«¸«"'`7ËeYŸ/—éRRi³^—5÷¶íX®e×B‡ åŒ@›åÌVmG®Ðé%Jwܺ4׉¥´V°¾“Í hŽtïðY¿¢Âa4[se½l–$i M[5˽.p-qbæ …årÉ;ÔY{…ØRCÒ‚‰$Ɉ\³´6gn,pÑÔ]ðÍoKrƒ s(ÙY³6È%rIÚÒÛ# –¸F‡°ÛK«²´vTvS2;ÓìKØr²µ¼µn¹„JäHÐ’$&5Ü1ð1>1ð*†pFâ%,8‹aq køÔÀ]\0ð2^1p“FpÎ@Œ®`R ÷KR–®šµJúX½†Ï |Ž/ œÇKlÌ£<ËNgç}yE%¬°i ŒŠ@ü…½ÌÖ66Ý‚w›~(tð/ê®6g*~òEr§;ZÍ™|&¸nѬ¨Ô:Þ:á¼@OE6ù†nØw¤jÓAŽLaËq%I¸¶¯+c‰|KÄÂjÝþ†/~*™A§¼9 aúXd½n×Ó7ÙÒ¦9RjVHK"›ô“V«V™âø£<]mt8³åJžó'÷.—M.gh:é¡ÚÐÅ#E«.ž&~3xh<ozš$ÏÓxžfŒl7Ï£‡ h,RdGé+þ€Ë©]ˆ±Ñ}¸¢¥F¦ÆPR#Q5ªÈ=¨f¡ÔH´»6ôG>5ðð~DˆVÀ] §Sòc„îÿ 5°C«ö¿m þ|rϤ½>/w‘Ðó£{è|Ê{Gyr{¢ßO§)&ÚÐŽGy‰þQ:hu‘èt(=ƒ9 iãô©P¸Ÿ~¯Ñ }¨ëTÉ3WL¿ÿTý!SÄLOá爜ñ¨bL{èÕwÑà Ï¡OPÕ‡]§£ŸjaÄúÐE¨¡žžØöÎ1Jâúá&›ÚzÈ ÞK) ôö´Åàç¡™y•X8óqôþ‚NrÊ>ú~F÷Ÿè_ìŽü´‡è.ž>òëî<‡GïKS÷"4O÷ŒO7÷&£ýé×½ÅLŠ™èôZ¶½S*Ý;‡µŒ›†À3t)4fWñF“f‚¨CäÏÄuºî¨Â®+UÌa"Ó”P‚­©œž¡*ÿPK„›–ü0dPK7Aorg/hsqldb/types/BlobType.class•VëwUÿm²É6a±iú€ÐÒVQL›„¢@ X’hMË£,u“nËBš„Ý-¶ø~¿ß ÖøE«‡S¨ž£òEÏñ³ŽŠs³›í¶ áxNöÞ™ùÍÌ™;÷æþùïO¿Ø€½4ÜïÁzq‘O\»vÍÉTáÁ*ir±.UQT´˜’•Ô)– ¢%s)ƒÒ¹ñ¼¤ÕLæÔ±èQíDf$5æ¡Ó–ÍžÔ19­—‘°’Ö¦sÙ“²ªæ˜ß¤2®èT·x9Ÿ=Y]VG¥´\ÎU©ˆ*³È7‡Ãÿ׫]]'Z”9*¿XµXÂh5cÍjK\ܯµÁÊá[›ï_0Ý—,ZûLa/é€1ƒ9&±¯ˆx©Ç”B”µ¾É¯#~Áó±äžmC¬§Çþ¡ÖäŽý»º[÷Äz»ãƒtFvÑ×Gß½–F›•U¶Ök"ˆ‹xo°áM6¼%âmÄ94–”Ð訄¤KÞqg¼+â=¼Ï!PªMQ2]Óø@À‡"öâ#6|,àg±IÄ9|*à3Ÿã _â¼€ "¾Â×Ã1à7¾1ƒ‹”oÿdRÄwŒn¶­vl$•޲CÉŒg9«‹ø³e30cêI0ç?\/l£®Wõ-­*W°§pyò Ç‘ö0‘[Êçåì‡p°´aJ{ÈØ!ê¤Æ`¼"Ú[­Ò­Îõ—žÂG¨)I£dêíç%aŠÉEm1/•¨OÊJc²Ê¡Ånš—UMÑôhÒR`qЛÒeU£m˜zvuE­ÁÒó[ܺÎá»}¶TR©1Ûú²—+˜õoàÎÈÙ1ýèÒPJnv×6VP b¥UYÒeã̶² «Ð•¬ZšU­5•×î¥JPk5ØtdUÍ©Ñn6R;ÊÆ¼šZÐîh7MÝ“ì?†]÷”kp8v˜y²ŸªŒ’2û)nÜQl_êRØU•¦s»åÉbw5ƒ²÷à ›>Ýq6õD¡$-ÁUdÛ .ÿJÖmé±³žP€܉ôn¸«À­"þnl²øÍ¨'z :hì$I½šœìEÕîkn¹ î‡ÂÓˆÃVl35"¤Á^" í—ਃóô'¨ò».ñ/δ·Óè‚× »÷X¦>pS¾FøkÆtÜ…KÑZ¸gM4†¸‰V›¨Ó/ÁD°ªv—=Ep§^¡lØsñ ‹¾‹ë7’òžðœþ~“ïò‹ý°Ù`—Û±å„UÖd°¾Vm2„ùûFíÏwu|€oŸCýx_p+hn™ÃÊC‘ßá ði39f­bÖ€ÿkx»WþuvЃ^3‹›Ì|±¬÷–bÎ"–DŸUr‡Qò:¬ºh¢ý¼î©€íÅ>;BÄÓÜŽœ‡Ë9þ.ÇL„F~&rMÓh ]ÂêKhÿ†–}óhå0‡›g–ÈçpËBC¹Á .W3qû1` ƒµ«#\ÜÚA0±ã´±nšØúÜläÖøšÏÁ6È­g!ˆmçf vð¡šÇ­Ìã6':\WÈà ÁÍc­ ×lMýüÜþ«=(··&HÜA+¨ó ÝÊφ¯"8ÚŸÑ4DËé缌¶O<î¢á>ÓO»™\}¨@¨X¨¾ð´/ô†œ›È!Ë.dÚ5ÛZl^d(yØ |ƒiØdTŒLcM­¹®lÀ¬þÖý’±_cÙG§á'û(ƒÈP(rw”uSüPKVämú PK7A"org/hsqldb/types/BooleanType.class•Viwå~FiFÒÈ–%+Ž“¤T¶ä8J!‹-;Œl“È “6Œä‰2‰¬qfÆ)¦ì;t§t‘i!P Èa8"¥çtùÔsú/úú±[¸wf$[–:gÞwÞ»–ot•ÔjÖ¥1E»¶­*ªÂIO—µ¯¥‹ë¢Òj«ã½©-ª¥½KåÃ¥ŠÓ§ öãEÊÖz ž GÛÏ´ý-š4>;›Ÿ›Qð^Vð ^UðFÆ^Wð~¤àS~ ²³»Ó½ªš+ª­*ø ~ªàgø¹„_(x¿T`à-—xù~­`Ghät`dÏ«¦Z¢jáhü¿¥KÜ|4{掟˜TPê€À‘±|a’81óÈÌìc3ÞVð;ü¾Mqfy±¨™ ÞÁ» ®°ÿÂï±”pPÁ&¼Ï±ý—ð¡‚ †ì¹Y¶9Ã#’[^ 9”Êå¦r<*£T,gÇòù³s§,èÛ¶åe»52¤ºÕ–;6hj¦i˜#“¼R4wHµO”£´M>QÒ–x2’Åú'ÕÊ2á…Šº×ªeû«Z”•dª³ÿ9‚΢w ˽› nÍk¦±I½9QH=T1ªe/ñôI¢|†t+o=u×j{Ýâ8ʦZq9$EIõÞ—L­¤[ÎgN˜ÂAúš§é¿ˆ€\±ô¶ƒþEP]åú¤7 2£_Èÿ9„OGá ýq…ºhg!Ÿ|ÍãÝÝâu{<,ÖdÞƒoy̘ÇðÕ=î½øöfÕ¸¿É¼o ¦ØdÞ3&MžÍÞŠM‡hDy¼£¼öé¿#0TO¯!ð¿ }†`ú3HWjr ¡ôP¡zOò‹ëÿÅÁyÖ Ä ¬(tz{¨‡hiß7ð±cq# J=È4©1ìf$¾^™ÞÇ0îáÌ“oAÚG3Ãä•ÿZ†œô]¦U¼–ù+| (÷ŠÃÞK )&W ù¯"š Ô ù®BtBvá£JÀÿ°Gä‡9#YLlÈŸ3”ifÆ­ËräA€ö>6ž©SR8(ýŠÞ¸qãß´ÿË‹ïCÆ çŸ|Þ.zü€·+ž\=¶suî£Ç¤§ß“KÑó6= ,Ÿ©S¸ÑCb¿HwÑ~k/õ‹ tû¯#F7³†ž«®!^_C"n wšÒ’Lgb{E’Û1Mê}ñ ôS^Hºîœw5Ïq÷¼Û9 õÌuìq`ã¬#>ÐÀ-!2,¹fzê=ÑjÛõíEwð?Xþ‹Û%|g\ÂQJMh ;ªð;ùJr¹fZéó&:©9ÑžVôz©ätĉÞÀ­5„{’d[ÃN!Ä÷R Ýæy¿½uè©9ÁßQo9%#L Ñ×çTë¾Ïi¾Ÿ‡Ø8…û7øjì½ôÕ%Ê#ãa †ÞŽ|xþ´ÌDÈŒK8é‘–¥ÙaKa6°¯Y^yL{<6¸dv¦WÒn1× Çw^E ¾kc(þ`ט„:϶ôïöôûI?ßýRàQó¦¸ïØn÷RT`‘UÜÆ=¿Š]´}c•jª;kˆ‘È7¹ø$‘ZË¿ÞZAø3~§§Ž£àáîó‹¦~ç¶}ë*ø"¤ÂNlŽü×r%ãä†Áìsh‘?aðÔçú)w0ãKPK*Ž‹ÿ^PK7A$org/hsqldb/types/CharacterType.class­: t[W‘s¥÷ôžäg[R,%rìØnÒͤØIÛ$uÒ6þ$©ã¤¶“ÔIϲ쨕%W’Ó¤PZhá[ÊÇiICik(˜’(N–ÏRveÙ]Ø_ÚíRvÙ°M]¼3÷Ý'Éö³“.ä”ûî;w~wfîŒÌ‹¿úyXÏžwÁÛáßœðKxÍ iø• þþƒf¿v!ì?iö_.þ›fÿC°ßÐì·2ž†{gffì4èw*ü¯ ^‡ ¼¡Â´ oªð{fT*c*³!fW˜ä‚åL¦ÁAƒBƒJƒ“\È‚¹˜ÆŠUVâDá~‡²Rû}ÈÙ07Á~K0á{iÀÙël ÍÊhð)ÌïdKÙ2' °r[Î*\àe•Dzͪ\¬šÕÐì2‚­¤a¼œ`«iXCËZ«cõE,ÈB´ Ólm4²iXGÃz®PØ•Ep=kä¦Á6Z]åbØFw‘¸ZaM.¶™9¶ÅÅ®a×*ì:…muÁ5»`}[\ÐGßV‚·¹Ø6¶ïPÙõôÝD4Û‰f o“gÄ?¼“”ÙéBõ×Ò¬‹`»èÔnnPX· †Y ½48°›í¡a¯ÂöΦÕdï>íWØa7)ìfeÑA}4ži=¨§v§¢‘X:–L0`í Š[“‰tFOdöêñѨÁ°TàïÕS‘Â#¸}n»‡õÃsIu0pF’ñ¸žáëŠÎdj¨á`úÎø@CæÈH4ÝÐjînf Ùt4àÜÑØC4w,½íÎQ=Þ>Mdb=ŽŒö3p%ôáhO&K 1ðvÞ®Òâzb¨Á€ÑÁÁØáè@/‘ëŒ&†2ídi7§Rú5¬Yë‘L4EG‘ŽcK,Ë\‹Èµ‹)ÔÞQ·—Ôšˆ¢E{2zäŽúH¯Þâ)ìȵ^Ñ@,=×ôÄîFt{m^CéP4ÓÑÖÒJ| 2š€´ÆõtšÁ’ÚºE9ô,DêB«à]ÏBÌYć˜=7tîˆ&¢©X$Ϧá]æ,›µÞŠÒ3ˆæAðöÑx¼•޶EÉBüεƒzº5ï¨Þ•‘rÀBìÒXz–µ ìÔx’@¿rë‘Ht$“.Øð¤¢wŽÆRÑB˜{çQô”H´-:”Š"År‹[ã7K&'Û5!âjhHи þp]¥\ÅáþXÂp9ÛfÑ鉦IÂÍ Ðh_˜ø­)Éá=…D7[Íßõ®þÛ£‘Œ¤®]a·a’G/Š$‡¢©Lo’8tƆcô­V+Êí ¼˜A=µ"8¤03¢§mûß*Õm?“AN»R­…ê08ðGb¹ßRÁ~tùÈl†žYkŠDŒ ¬ÍÈ¢ª[€;poC'‡i†ÔêÚÅ goþè æé’ˆžÙžJ/æÿ™Eˆ½3y(j j…qÊ`E­…WfpîôfüöP&¯°<’ËåŒw=mO¤£‰4æ€Chu$™éষ|u—z™”CœéÑþ´0ÓŽ·Êª£c¿µGø1©ŽŒDS š.1:-½YŽ'ï""Jˆw±ý­ Øn)&¼ÞTœ»ÿpó¢,™8Ð#::@çÿ?AYÑ•Òü}\ÿ–“^·<¬g"t]L$Pæƒ ejI&ãQ=71Þ9/WymÇBIÜÀïŽ ÌôâåöÄÒˆï¯Ï¯•Þ¤UT"\¼,ÙŠh‹…ç%P·D⢶ÁWv¯aX¨h, Ç48 Ç6¨±!øžï÷jì <®ÁqxŸŸ“¼>@»ßÕX îרíp•’…<v‡Æâ ÝÙ=WWZK µ&ÈÙz}swskï¶nôÛ½ÍÝ´Ä<'f·¶ïèÚÕ½­µ¹gZ»Z0£äNT#V_{×´lÖÙܽc[õ®–Žm­½œ‚“¸;W’–ÑÁÁhŠ”Oh,ÉFh¸“†”ÆÒ¤çc¨6˰»vDcw Ð`œ€ogïÐàE´¼¯hìöN ¾_¢åË ó/ žìoÓ3:¾ê»—ݧ°wiìÝì~…Õà ;¦±÷À˜ÆÞK´³÷)ìýûû Æ>Ä>¬±ØG ‡ŸÃ/4øûú£<Ï+ìc{}_(}‚}Rƒ)8¯±O1$w‚=„„ÙÃû4 'Ù#;Å>c%`‹Pc²Ï*ì1=ΞÐàðM ^€gÑÞóË |ï8î`CKl¨ ë±a=®°q´ ûܬÛïî§4WÌAÈ»¡—ùuoŒJXï¬5v'Ã#ø¸qàh&fœÒØçáó {Rc_`|Σ_tíéìÔØiöE}‰ì8I×ÙSû ;£±³4dÙ9´üPƒŸÂϰՙï±ø÷ x• Ðì“ ¹@ehSŸeÖÀŒ²pt£}æç´Yv6!Û,G–/’=±Ž²È|µíííÔ«¸ÍÎ1Ï}ÙB< ftt w•ÄÂ/š¸æø]ú‘tA+çÉïj&בø èGS©dªaX¢¤FñèpT,×Õ¶/žµ»úaꌪEªåZ9t|´ B‰x~½ed <¾¼¶uÑÝŽEvÕL®ÊSD…ÀëQOcªµ'°5ã\kò5³«)o§žÐ‡¢©U柤笼LUÔFF‡õð:bƒ±è¶ª™è0ÞˆQŒÅä­Í·ööíÞÖƒÁ±à£&GK¨¬mŸ'g¡ÁÕÌ(ý:=z¾B¼6¦RÞŒ­ƉP%/<ŠåV:–Î4tæHå¢sk“¹ï¥ÅžH†µ½ÓŽ8ÿUÅŒ¥wë=#<˜TQàõ©AZ¹³ÆK<ÖßÀ~؃y #`0‹Ÿ#”ZÄo¥Ê!ú)f× Õ ,n3ï;xWØ>”H¦¢­Übk,|ÙZz? gIV&~{g§-Ù@0d.NåkªÏ|V!„L\úÀÀ>=•à_Y»°“CW$EO$«3¨¶¬¦ÌioÛLå<º²ˆ¦+/;,ÄÛKL=EEdI"™à7Û).›z¤žÑþKelmc ~CÏ-9¿˜6ÞÖr$CÉbåE%9Ð2ûñÊߪh)HÊú‘wÇÞäõÑæžè…-–ªÌ%ÈQ¨¿í9’ƴ ^øÆœâÀº¥%ÃïÿÒ9¾Bィ ¯ Lù|Vy –d’7Œ&3”å ÄZ«²{¿åY-–6^Qã9.Š¥ »ð•K D:ÿp;yQ&¹‡C#4W_Ò3³™ë¤VÐ8æà¿VfŒg Ÿòð%¾V¼€¡pÞÞÜIõò‹V‰övï¡bº–ÿ(Y¾ð5†·ó_ó—Á;à`ðNúµîÅõ}ëwáúÝpn­áˆÿi›þÅ‚±À±>XpþC RíDæ@–R8~WGÀô÷uõn­¢Æ~XðÛ <¶ÎúàY°×Otäúú3`Ï‚c Š+Ü€"ƒd? J}ý9PÏ‚óË@¿n ÇZ°Ï€$TàãL¸MOÌàNdCãb|RˆÑb *4 Ë«I äì*`ùEØÖ€m.;ò@L°K“ß§`Lð #7ì7ÀŠ•öàIP½%ã ÒúøDެ 6w=‘;º­IG[µô Æ®"õø!€¿µÜëð´–&ÜÚ„Gùñ„¾ãuOç«96¨|#³Ùqõ<,ø¸ùŸ îðNr. > 'Ån©Øµ{—˜›äD¬"zIDé¸è;2ò/Ô¬´™hœÊÑôš2¢; ª6jIÅö-‚ê¶Å7Y(Þ ¿J(¾Þ[6éõMzý“Þ¥“óuW@n´á?\>úÇᵌó ,Îë³9^ÝHÕ†ßkèîž@'ÈBùä3°¼Ïí>AZg¡r_Ð]›…û‚„˜…*\×ñuª's<ðKpŠÝ­ ¿Fè⦠ÂÈz\øñ¬»(ÙJ¶"'T½¸ ò®ƒ#/ËÂÊIïªY̼8Ï1+çlÒ„p‹ÏÁçse"¡ÃŸ»O.rò ¹½Fqr]‡[{4>85Oz¤ë2§Åé3xš ü@ð \NOlŸ@«­>ïš óŽï(¸à:qÁ›Ä¼‰h¸k‘±‚Œå ¾$ødÀ <ƒ@uOSüÞ"ü–@I±3¤¡ØF£†[_„/°§ a£˜åúÉàSPûMHr" ï }§u>„é ù'iÃp]v-.¡ÙMB³wp›ÛÈ£Ùø®_Ô˜-Åï±¾F|ÉßG#í£õŽ^!L³f ç®-¸«•;As¡ý î‹û*šMqB謡K!t±}ïé)U|r÷t”;Ôò­ LÂpkifwð'aYÁÜxôËð”¸G;Þ£‚„¾^é^õ8ëCYXKZ…P }£W–àAiü['îí qoW <(îcºAFÁuóìÍý D{+MËåAn>º„Š~Ùx„j8â–SüQÚ(ó¤A)\å뀄úå)hȧ€(ÕÞ„ë@b²ÇN¶‘4>Ê3¨¼ƒ¿¹_Á5#@@Ãcgà¬0H1ªéD"? …Ÿ Ð ¡Û&Â8Já¯Aã,Ç»YwÖS ¿¡À›…+24i’Â4¢\Y¸rƒ# ÓGñ9|Ê)pŒC„fÁ:#y]5Ý>dzr“í>% "lC@õ)îê)ØP§`Sj¼6‡½Ê§plÉîsä°Ø’iéR:ˆÿÕùyS>/­U‘å3°'Â&Yþß9üá_Y_†¸Sp^˜fšÆ_™lš4c*Þ¤W 2VPøÇ“Â?~!üãIÃbW^[yŒ»<'!æ'¡žvI¥ÍäÓà!ˆ×!YØ2é)n'ák´†Äw+Ñ&hŽÊ ²O6Î= î€ä“ÝÕ{ŽÊl|æ—Ï€·/ ƒk&ç°¿t–¡ÉÅZÅ×ÚiXÂêoÂRžf`éëàœ†uÌqåþgàY‘ûW¡ÉB¥ÂŠÁP}åÚY/Åèsð¼qÂv­Ž.i‹„sùÓÖh‘?o2ò'ß+_ÊŸ¯ŠüYbäO¿F|Œs<¾$ ³A6®v ÚLcž„«is ®3×Ë}Ò VÃ0Aý5üž‡­6˜e¹¦gt[¼dÂ/Ö 9ÑYhF#…$ÇÎC‹šGÐI óÐ*CÀ‘¿6ÏC› 6æ„Þè—…Œa±½Í“Ú”órÖ 9û„œufn*+¤ÆÓgèôËÇÏÃvv …LÉ*s’-1iuv8 Ð±<¾óÜÙ^€ëQööBÕ–玘 bræ˜ÓNš”€2;MÞa»šÔ…€JvC! šè9/lÿpÛ4lbEÅ!«ºê4l‘ŠBe’ï2tpÕ1 uÒ¨˜AvòòUž=&Ét˜A8¥s{»•Û-wâJħ+Œäüî§èàö! YØ•'€‰ƒš€¯› )Ù8…1ƒBèk°{ _¶,ÜÐ5ÇpÙu$Z¯{ z’FHoa—^Z¢ãár.÷ø{²°!­Ùg@öeáF„¬CHŸéËÂ~„T!äÀÏ'xê¦)¸¹k<§B8/¼\ŽOI‰Çã)›¦G >øÓœ&KÐ<ôÿ*Rø5Ýb68߀o „óh^zŸ?BõË'ä{¸e ¾LøóaáLJƒF”]c:Gq…™UÚš)¶‹ö º¯ $Ÿd&ØÒ°O¢ü*a~}òk˜Ò+?:?M.E—¹|Ê™ô&øŒ$éTê:¿•S£^èéC5Þ[ÑM²pÛÎ{4ú,_Qpúmø3q.ˆ_*¨Ë¿ÿ”à'rª«ðòJü;¹JüG¢Õy2XÿD¾Ç¿ Íz°À†w ®9áæ|?«àµ#gÉ,´çíØ&l¹šÜâ˜Í<¸$·w"°À¢E]SŽ-%­–Ñ@3Ü~¾kÑÂÚM¿ùsøžÅ¶lnϵ9…ÛŠÙ}?·½ZtA¥ 5?hñbnñ¿€¿g^Ä׌^®ÇCßë*¥ Nó2ެÑÎgtÅ/ûÝ| 0]qT¿b$_Ì]÷ó 2R®b¤Ü&þN(faðØiªÃVÁú° ²QZŠy̪#RTû4ÔK¥ rVcê£d󸡍Žö ^øêÂëfeëÎ?NãFáùÔ1¨ñmDý”„5g ®°Î«óùåhË8Tû”1Ðjü²¾Ñ‰½€¿¨†~ñ¡mkð˜³cÕ"õküN¬W\~§ª³Å¹ÑYCS©:9}…órÖDñyâÍK²Ô'ú¼º ñ²vsÐ/Ïm±ù¾<0ÁóUk* ã1.¶õpûw`˜/—¤PÁ•{$‰êJLÉÅE[q‹<´%ÑN±¤-Ÿ†j~„–Fœ¿‚ ×¹Cü4×Ê%92ôfã1͛۳‹èYê †ÉòY8Ø$¤ 3lH.»q/CùÜâÀgä ØŠ«¿þÇ.qÌŠñOào„SÙD°ü`6ãõ¡Â(™¡Ù] ª¢ŒfDƒª£ÊŒOyÊØdáöÊSàDÐøÌ¯Ž*̾AõIØçø°y”£¨&ŠJ•´O=nlWˆïjJ…èlir˜"Vù¾¨àœ'ºŒÃÐß9‰%\Ní*аl^Òëà_¾i(a>Û4(l©Çµ ÑþþN\D “/ÙãF‘<Ð&$M®›t‡ c.ôŽz†§Ó/Q“p^J¼ÉYÏNú%¿CwÚ Žà¼X*È*+ß!Qòú)üLðÿ޵˟Ëó7¢g…µ+PGë}¡g¤«ð\< §Ñ9šª\ä=$ï oã>ÄËà€$Š`cûX@6‹âg`¸ï$œ¤SÉ,ŒLÎÊ_¬Æ0°øl­¿‡ª­Ç\N¯\¥)@I^™Ófö:]øSwøðOâüoDã|.oÖ$Ù7ÈÒ‡½N ?ÿ(Œ…}Êúoƒ†-‚±™§5>ˆãð9Æ`§O°Û°Ò¹ò1úéýÎÉOÎÃÉÏ$£§5@McVeÚsMˆV>´Ä :´ú°ÀQó8(ºûøÌàSÊ[*E*›¢|[Œ ñ?óž“—_ \^2 eX¾”\@•¼ÿ"L°Ž~ìÃoE•Ù×Öã­¤ûHV²jÕ9ÈÌ*bŠÐb?ǾØ8~µ¸êz*ÊŽÚf*o}ÆÞrŠ=†ç¯ÚXEþyUÃDe^$ó¼,È܉R™¾r£~Ùó[ò&Q¾l¥`SUŒÒ«òÜUu|=—º¼êø±spçGúPò»-½¤PI‘ÊÙ¿"ØŠ\ysØø³I—ãmb…›„Aâ6grŒ)y†ÏÒu[‹ 5/Æë¿Â«B„VP8›Zwõsþ Üeß\ŽŠ¡ÿ-ÃO91‘ÊI·ž£€×ÿrþ&N2¨ ï¶ÛöC@=6c;ÌF!ðPKÛh®ÐT3PK7Aorg/hsqldb/types/Charset.classTkse~Þì5a[ÒÒ¥­¥\$!ˆŠrÕÆ6Xˆ4±%T-Ûd›.$›twƒ£Ÿý þ€Ž3|)3^0̈òÉOþgü!Ì žw/¡Ûé8Éœ³ç~Þçœ÷ýý¯ŸŸ8‡1L Å8>Œâ8f9™SPˆAòÕ×ù×G æcˆ"¯âç79)ªøXÅ­E,¨(©(sí'1,b‰“ÛQTpGÁ2Oó)'Ÿqò¹‚wè ñN»mØUÝ1æ ×5l‡AX^.0 w¬NË5j…ša¹æšiØ ûWuǬn׈–Þ4TÔ9g£q“$­`Y†kèŽcP“ó-»žY'sm5zÝÐ-½nØ'Bùå¢ì-ÛºUçqòeÓ2Ý« ‰Äž2$)G®U£JÝpË_¶éKH$ ¾ì÷v*‘Üc;ƒ“Ó]½Ñªû¡¤(UצîË*ÉÅ/,ÃdVÛ¬¯»Nf–Nâ<]0Ö Û°ªühÓýþ s5S´kd®ÍéÎzÉpƒ˜\«ÙnY7Å(UÌ>Û‡GÉp³e]êÓymWïU×ÃEæ½ßšg¡Ê÷ôz¦A(gJ®mZu*6Ì‹­sàËfÓp\½Ùö°»NuM§`QK ‡¯†Ò²$ïP³%W¯Þ¿¡·Ëú*o1F)l×Y2Ýu?ùŒ±¦wnÁ"aÀ0ÑKÓr2Ô‚íx§W/WÁø©E IÌh8†×5Ô81°F°ïŠ¡†Sܳjáà¿¿ÖY[ã““s ùl9¯ÁÄ=Nî3DssÙ…l®œ_ Ú¥|YC"Ùɳ\nâ¢KC §5´±¡ÀÖà€ Š,4¼†) G9™ÆÁ¶Ó1éú½lËáƨ Ãp|«Kgr¼8©å¯çø®Ë)èµÃèöᆛC“•uz!,rxã?¦ÿê.ù¸RÖñDnëTï.Ýêè þ˜Ôhƒ\£I»Ü.·åÇô¡ªä†aÕùnÉUÂ2K¸‰‰B2Ç0¶í¤ü(XtÛÔ½¤Ò X)ço—Žì¶{GvF™&:Nï5­dŒñIÓ#>Ƈíñiƒï)QÆГž~?i’HM“tú±Ô°Tú'D¾÷| iœ|x#.Ä·ãdãP`”Rù.0Ÿí™æ}ÜüýC§7{N#“8…çðÖŽiÄÐém¼8Mg9ðRå äù4y+]¨KéÐù|Ïy0Èa¡í]¼Øøa¹.Äâ.¦FPãîSD©Fl>=¼¯ -~´‹áÁÞ×þðk‰÷é"NŠ¥´oê¹ ¿Ôú­ún]›º„˽†#~ÃÑGž-Š+¸Ø6¨]™ø\ª‹‘+ÂÕɉM\IMv1z^ÎK£RúÙ&NŒŠéQéœxæ[È÷%áÌ&„­¯%öðï?ˆ Ä·¼Úï{À+/ 0öƒŒhÏ!=#Jå?è•¿IåEâ™”@%y}^ïØDz²WóZ’°%úUþ^V€ô*cC± wׂÜqïЀøú ¨Èa&°nBñt߈¿âPE~‰U„x¶XãwŠ¥qXÞ¦>ËÕХШïV‘|y…Ë+!ú·!y0 Œ ZãJnô»?¹ŽiGœ å%ã¬þžTʹR,XY›ö|é?È>Íiéþ©8óõiùB¾¯H'{Eù!]#š2%EŠ ¶>Ʋå>…³V*ß›=’µI%–¦«h•æ¢ú— ”µ6góFiÔ'Å<:bä2«d×À!3cwñà°a »Ýn¤4$ð¶†8–kˆñðÞUñž†xŸj_ÃèÓpJ˜_A¦dZ#9›|ä©·0 á#|¬áœÒð)z5<„¤„ƒÂÖ>Óð9û½Õ˜ÕHmáÃ+4|‰¯4Œák&¹ŠD©y#•/ŽØn¥ðµo4|Ë|¾Ãi ;±KÅ gñ½ŠsÎゆ‹øAÃÌôI.²‘Ÿpª£Í£*\M%蓺 aîd’9âSü"yóe’o›¨Œ==Ó¢ÝÅ”©ªÖ4Qñ®jª³ƒ*×<ãù溮ðå“® üPKÅ_ÀÇ|ëPK7A&org/hsqldb/types/ClobInputStream.class}T[S#UþN2É0Ép]–k‚ë%4ì.fUXD² ‰AÖ «²x›„I2Ì êZVù"U<뾨¥¾ðÂ>lÕF@«vß|ðÇø,JìÊ•‡éîÓ§O_÷é9þóÛ#WPöa“~LẂ~L³xÕ‡¼ÆÖ,‹”70ÇÖ¼Äël½Á"ÍËŒŒ7}Èboy()¾>::r³à E7}x·| Ç@K2nËxG@*TjyÁl­^J”ÍO+«ù„uwC7)Ú¸¡YÚ¤@§ö™fT´|EÏêÕ’U5¿Y,êõÅbÑÔ- *lÖëzÕºY3 ˨U¼Ç®•”@›aRJS_¥Ów(ܴ꺶>[©ÖrÆ—:yÓ²©›¦}x¸•QîØ›®Zz½¨tâä2ª†5-p=rnä9…e2Qî@ª¶Jè±!jîH”h´ç,­°¶ m,qÑÔ]ßÜ}ƒ 3‰fd%•Ns¤d®¤"™(µD9m”€§ÀÕÚ Å_(ë…µ“t0q¬Í:òfºš5Ö ‹²{#¢vGEIïªxË*žCDÅ †dÐÎ ÞW1ŒaŒÈø@Ňx^Å3xVÅ5$UŒâ)!x I Ÿ³DE«–§uÈøHÅÇÐTŒñÙKxú$Ψ%Ò‹-qy¬2]E%𻚮nlZ9û^©Æ“T·¨V®±ÿo‚J®8ƒ>ÿ6¹ÉÍZ4>ã^7h`<Ô5Þ<ç¼@OIw¶LÞHË‘Š‘Oع»¦¥S-íV­¥!c‘l“ÄR¹^ûœï|2š}BûhVƒ-ùõz½VO̱¤k'6 ÄQ+‹@$mIK,ji’ýÿõòHµÑáTY«ÓÄ\:¿k™tt%…Ëô ÐÓІ.ž#²ºx„øµàI±uØÑ4>¶¦¡°5 ÉnBÒ ÍBŒdœV³´VH'c{cñ¸\¸&Çâ ¸cc H±Ñ '(êûðh xc£ ÐîÚPØùÏ \v¾¯à% X¦|¾ØC ~ï½áqí’åÿAÇ©òòÑ–F{½vìÚw dãûè|Ì{'qúöÄTl™>" îÚpô£tõ‚]ÔÓO¯hƒqZJäØA—Nòñ»:†Ó'yxK³?£ƒ5»ôí顤†AO< Å~E×··¿‘ÄÎÑ_ûvÅ ìgàC¸Äßè=}Wèyv“gèrï'x”ûŒ:Ál?Åœ±« q•¡û§ \jß™ìÔìãË'g¿ØÌêE7eõö\Ø m7©z!à /"épë!-x/&5Ð{|•M?ENdœP8’ï®÷{tÿŽÀrwûwûî¡ïñƒSŠ œIAÏ—Cu²Mu¦…*·Ã¢…²E”Û˜‰‘’èsÛ]Ú>ÀEMšŸÝrjL†ë]R'ý/ãæ*A{I…¬¾ Äª+”´“¥HîfW

äÍ»÷wï}w{7ïÏúÀjüèÆZpá>nHÛ¤†²Ú£Ë±#rºWŽ&™Õ~E·mõO+†–hrBI9“áP!5Dåcr0)§úƒYf ùœ+Ô%‘^åÁ]K¤úI²Š${º#íJJѱÙc¿MécŽSÈ”|ª”áN§<’“ r›’áJd"j”ig981u(-kD·HUëdŽ&ãÑ`’aŠ-9¾ìˆ*1½‡%¤2¦¦Ž)šÞ«¶ù5 2Ú‘Ò­OŽ)…lå³(˸‘Ë¥âªVÞ¼³ªÝ‘mÉ “|˜eÑ«2>gZÍd³Êáàÿ £'Ç€N¹ÉY†Z að²ˆW°ŽÊ™Õ#© ëO“n"º‰Ñ"^E35l;ý:é·Cõü˜7÷õ)³ùšˆ×±UÄx“-o±åmï`+…;_MÀgñ®€÷D¼Qçð‡š<¯™m²NáC;ð[΋ø­.ˆøŸŠø Ÿ øBÄE\ð%]¤®Ý‘ˆˆô øJÄ×ø†Ã’˃ñh,hÜ5J&””.b —9ÔÞôüŽ6ã·¾±ã"® ‹í¾§Â1–]?`âfA º$59F¥5ìRGv¸Ò³—É©[÷—:Ê®!»¿3æÓi%çà—ò»2¿Q¢Q»ÖJ¡¢h¸êÔ­ëáÍïVÂã”¶¨œ!¯«r»±Íd“‰ŠlnÊV§œ’ûC}®jZÑ2‰ŒŒXdÄS“IÙ¸8‹óÛ>4ƒ’h]Q["R1ý˜Ù-’NCj÷m›»9Äì:’Jª_˜Û®ó§å1¦)²®7{)«e‘îf‰ÌÐÌ7+º¦ø ˜Ú²:GGÑ4U na+uµb|ë¨}s o£Ï–‘˜’6 ä™?ÇæÞ˜d"j2Æ'+Z™®v«ºŸñ]*pB Žkî‘‘ŸzéVéÙx‹¡\L›%§ªàDæ°áví²aNV‰Ì¼r‹Úåç!kGÔ†SzbH1+¶Jê(>Iv™âVõ°ŠÞSkéeS‚ÜuôÂyÀ¤j°ÍÝBï< iÝDœJz ÚØ3°Ñ#Õ_w%û°ãð = ‰I°7SuãJ*a;sN¯ýi}z,+ý­v”xÚè ›-UvSåË…¿ÆLÃ!´ÍG+à7Ñ-Øj¢ MÔæfÀvËp¹ ÚÉçŒåm–î”ùÀ=Ë\låº Ï]G]gÎ¡Ý J³„×$†Z½ º.Áge¹XašFˆ,ïúÞýÏUT4ó5|ã$*'Qµ·†÷H“¨¦oý$îØø î>`" 2‰EãVÆÊÁÿƒ•¼€ŽÚÒ¿Ñ$ LÀvD¬ü”ù©DÍe3ÆNt™h™™‚~&þØib‡)~ž¾Ûü‹°ÛÆü¿Ã^2 • \Gí(îôM`ñê(¨%þk¨\Cí$–Žå³)–»f‹ì/ØíuDuc—yZ7åšÖÌŽáÆý×Q? »Ÿm褥>Ööݧ¦±Ì†®€ÏÅӸǎÀxyÕôîý5§‰lç2"èý`šgT Ø—5ï˺´|6‹6pÚÅZºŠÞã¾IH~Ï ~ sôÚî±âXM_¦·ØŠ£q¥ä,Ø—ç)«Á^K½™õe–¾^Ò÷S¿4î÷®˜™©¢ý>ì7ÍôPún¬á'Ðä‘. ’•ÂÇjQmŸFЎˬ‘VŽÎµ XE@9þð®žÂš9Ô.þPKsM €f&PK7A org/hsqldb/types/Collation.class­Xw|ÅõŸ7ºÓ>ζ<¶l„1¦%-B71œŠ¥³Ndcâ¬t+ÝúîöäÝ= 9!¤ÐIÍ”„’`H €Á²Á ¤Bz'•ôÞ{Bˆ ¿7»;§“-;þã÷ùH;ßyóæÍ›WfæÝçÿûÔÓŒ±3øÃ1¨…ËjØ"x­ül®a1xD†üŒÄ`2™ò3¦ÁxŒ²1°`‹¤äj ‰lù)Æ`¶JähàÆ¨õE{1–„R-lƒI‰.¯…)˜”Ûe÷õ1¶Þ Ñ’öF ®ŒÁ›àÍo‰Á[á*„«¥¤k$ñZ¹üuòs½\ê9p£o‹Áx»”ó©Ú;cð.x·{¤½W~nª!–›åç n±3á2 n‹±³á2„²½]~î@¸S » á}5ð~0î–“îA¸á>„H®"ܰS®ðƒ|Hªÿa„‡FøÂ#"<†° áq„'v#L#ìAØ‹ð$ÂSû>Šð1„§žAø8Â'>‰ð)„O#|áY„ç>‹ð9„Ï#|á‹_Bø2ÂW¾Šð5„¯#|á›Ï#| áÛßAø.Â÷¾ðÂ~ˆð#„#üá§?Cø9Â/~‰ð+„_#üá·¿Cø=Âþˆð'„?#üá¯Cø;Â?þ‰ð/„þðÂö#¼Œð_„W3䀜#¯BAE^\CŽÈkÇ×"#Ÿ‡|>òÈë/D./B¾y=ò%È—"? yò£‘/C~ òåÈE¾ùqÈG~ò‘¯D~ò“‘Ÿ‚¼ù*äMÈ›‘· בŸŠ¼ùiÈOG~òW!?ùYÈÏF~òs‘Ÿ‡ü|ä«‘_€üÕÈ× ¿ùEÈÈÛ·#ï@Þ‰|-ò.äÝÈ“È×!ïAžBÞ‹¼y?òä#DžF>„|ùzä_‚|#òMÈ/Eþä—!-òÍÈ_‡Ü@>‚|y¹‰| ù8òl-·øùÉQ ò¼Æ ·-ΘcF)ïµóyóŠvŸQ0‰Ôc›Ñš7ìñÖ´çXöøj`óm*®£‘€ë¨TÑoͺ[ó™‘Ö¼5ÒÚm¸Ù^c‚xë2#}p/T¤òZ’í€åS)Ô›š0ÝÖò( ŽH%4^†ÝĈŽ'mÛtÚó†ëš.°“*E(®^Ã6ÆMg¥ê“,õ²C°aÏ¼Ü —+:ÄQ/Žùƒ”<+ßšòir“æÖ’‘OºÉŒi{Á&`šå®µlÙà #“ž0FI€6š5×ô€=ǃ1s‹%gÔ ¶U}e[Þ`U«ÖÓÖÛ‹¢ž×x°sŽ„"Elm<"Ó·־bɶb1o¶¿¦7½ŽÀÍIÛõ [šãØÆU‡÷ó"Ûœì0!hzF&C2Èk›¤»Ë%Ü@ºêè^!]ÜYº4ÞÕÆYî@9Æ(L(ü–Xn§ŒËD~Ò˜ªŒMm´X˜0b<åˆBhU’’6œ“·‹ŽÙNÎVë‡'&(ßüÞÉsnŽãƒ¦¥Š“jš°ÜŽƒr¡åöl1G+iù)H‡Sf;ù0‰-ç ‘¿|“Ð.æQ?=š5 áQ4_úž‚+_H„þI:C€-Ÿ½Šcg=·µË1lÏ”²¥¬AsÌtLŠH:lŽ?8ôú gäi˜ö³zžk…‰¢MÎpCOXò\9mVB¦M×=0ǽ³ø.¯–›¹8E!Õ8‡é½Îßkâ°ÓÉxèt‹Ã¨‹ó+ø5~eœ¿ Nó7ó·hü­qrä*~uœ_ïóëøõqXuJ§ ëhü†8¿‘SÆ®ñ·Çù;ø;1¹ÛF9ð®87Oœ¿—ßç7ó[â°. {ë¼|Ôœðµâ·òÛâ|¿=ABãwÄùˆC;tЇ¤@§u™‰¿¿Ÿ¢ë°¡BÉ{ Êm¥±1–Õ탉¡Î8¿›ß#?÷«iïO¥CÉþ¾8¿(2ªÖöjütæ¬ìïóÂ|"$:€EÓ‰öN`¼¯?Îï÷™ÓCäôŽÄP¢-‘îŒC7P¦ …Âæ¡ÎKhhÉÜ—»ôëNZ<1æX9ð)œ£Æ˜¾)Aa(ÐU`JJA—⫎1" Ü =`Âu)ÝdúG WOöQÆ'¶›Îˆam1lksŠ\m˱íz‚²Å•cíSŽ•ÏKQµ4ˆv9¦™£ÖÌë]ƒtùû>}s—I<¨£¦­ÓRZ§=ž÷eit‡RM×W;]¯êjzz'É­n3Ü­%2.7K4…Þ á”1K_K¾­^+Ï,Ÿàèkia­«dй&M2nëd8ì*m!’ç“J¾•¢ÝFÉ5¨ÍzÙ±ºÛqÌII0õdJ2XvFNÈZþlwŠ$Á×,ëèÝ´PMwÉ.û#[Ò»‡e083Ü@vJOô’/“v†ŽÈЗVFORäF’ã#EÙ÷—¯IŽ’ÃiAe‘´S’|Nòôää²K9ÏòJž¤•ôvr%®3ȈAôm1ôur»&y03gè]Òˆ=Æv#'”Ëé=Ò¿=Ù‚LÀh® ÷tÓb=†mi‘\GÕ=t52Šz´kOÑÎùv­ÎsQz({ –C4ž“7@åŒg­írÒ”ÞC«Jr›ù¢ž"ec)ËË–ŒÐ>yOOÑ®4 ”m!e›ž¢$ŽöE)3Z°ô>R6ÖKŒŠ‹BN塞饞¢ÿ‚¤å}}jz‹öx14ZÁÖ{¥Žt“Z%)¯º`ÎÔze8dý%œ |i²ïê½}޼Xµàé½RͶ’fyaJï%ÇÖ9±¹¯èLš¡½í½¯ŸVê3'‚¬´M½|í(y~Úy½Â«fÖ$ÛŸíw¬)éb “6P²·ÐAC” #ðÉ@1ÈœèD^HI9À“žpõÄZ2Õ@ÑñJã¥@Ñ OÇá`± ŒîõAZK,¹aD:%}PFnšN½œcÉØrÃåÒ”¾•ÜLHÈ·2ÉÝœž–Nïn^OË„LÓjþÞÝ¢žî—9‘QË»[õé]—¦3(`ÔuôÃòý©sÓÍgVzÒÌ›w·ééNŸbd­`¥I½GžACFÁ’Gn`ÈÌ“1$Á ÜDï†ÈPÖó½¬>$³`¨ää(%%§õJ î$½Ä$ÁÖÛ6„,ž£ ú2=yD=Ï7dÍpÎ1¬p¿¥œ>LÊG†ŒT£äèd¶Úáí#f®¼ÃÒv}XæäzÓ–XMõožØzËôlu·l³ôõrO‹NiDj4UôÏ­=k…Àö¬àG6•òrµí%#ß=üzðù‡âüÃü¡YOˆà F/¨C<΀x¯Sªl.ëu¼ô勼úºRÉt÷ì÷ÑòILI{¬X©R°àê9^è›’Gú–>ÂZAz—Ðä@zoÎÔoª²©¬£WÍ]z7T¨'ßòI{›ƒÈ÷óƒŠ!ª¡F´ÞÈË;°:gN/ªƒßçÁ£\L¥ ´Êv¯Þ&%¹U’WêIö êÀ†CÒ©>.¥Îª‘ÔSþ`­éÿ¢@kÖÏ5ƒ"¿jB^içÎ1z„+T¾êLÇ):­ò+_AÛÚ˜ü•ð¬'ðûæ {þùâNäåAyd?Z¬š35–7¬•ëÇf~`¨(ŠfÿTãÿa‘2ÆTŠ„—(ÊgÜ2G4ÎÖ@óC¡LFÓ¦Us”âä9z[ùÙ¶d®l“éQ–ÒCÅÜ[Qn{€)}&ùZzÊõLº¿…ªÇ튂¼Úõs^Þ‡A »ì°lµAÕ»ÖrD¥{P¬–?²´ftE¹Æ¾˜BسÌLÚ3Hi*yß õË]eîlVôŠxùûIRZOËnò@¿™]ý–ã[sLrò¨ïˆö9ô]ÍŽg‹ –ÄÙ<†²œeŒ5ÈòÒo†­ðÛ£daJm¬t©å²Žõ[ª…ý–Jd¿=.l[*qýv¥?o!ª¨iÕS¨w&‹0*;YcÓM‘ÝŒËOUÓ.FM”šêªº{™¶›¡¨yŒ1_U©¡„~%Œµ a‹mlÑ÷°Z)§é ÝËâ»Ù¼¦*ÉÑ)KÝÅæïf *„ _ O3Nâë:@x³œÙBB¥pjçIÉÔò£¦I—B‰‚»Y]SCdš-¤yÁ5ÐÍáuþî‹ìbâÑp´¥<ºŒ–—ã ö±E÷°Å=Rûš&Ũé!ãQ¡˜ø.V?Í–<É–S\­‡à:êIòmȵ NƒÓC.Ú«¦öš]ìè¦i¶ìãlQªùYm~”¼A„cv°Å4DÒyš-ß UßÅŽ xWô¶<'ë+ºµ ë¯hÙËŽ{¦E¿—ЧWq~D:z7«Ñ#gìdQqâùQ¹E2TCt[™’K7KÙÍú9ƒ¾Ç°è~¶PƒW½Ÿ¤Á™/³¥œE AÿÄs6œî`™S»˜Ü^³ƒÅÖ_¹—ôLӲм*Fñpn9×IFÒÑ{ÙÉ©fŠÀivJoSKÕ^Ö8ÍVíd‘¾ÇÈ€qVO†l …,aüêV‘Zœç+¢Áùr‰ÕpA(÷2¨Fí#:d+›¥5Ȃ;9OPáNá"#~š57Œ(p;ÙV²fs`Í>ý96Ÿl]Ñ•ÆõÅÉÙͤs³î[ùüHC„ìmˆHCÇ"ÊÒÕ~j4Dª‘-3ÁlrÓ4îg ´½Ú—ÙÊ«¿ÈŽ#–WÚp§ É>2ÄäNª ³éÂòðÊpx Ï{Ži²©Ï,e¼ö"â¿…3’¡KZ‚ñfÒ­eÍÎ@‚ìèk–ßδª,¾üN¦‘±"‘µ,Z·Ÿ2@Ó|±me±“P)ö̲ؽìT[/û2ðZ¥ZHüB%¾:BñõaüÕ4KÓN³Ó MÑyH–ÓËÚ²µšCk-”œ/mºc.£ ù®9'R¼É‰óž=ôÄnHÎá>T ­ƒžpxA8L'²òmª?*>¦àÓâ?.>¡à'ŧü´øŒ‚ÏŠçü¬øœ‚Ÿ_Pð‹âK ~Y|EÁ¯Š¯)øuñ ¿)žWð[âÛ ~G|WÁï‰ï+ø‚ø‚??RðÇâ' þTüLÁŸ‹_(øKñ+-~£àoÅïü½øƒ‚RðÏâ/ þUüMÁ¿‹(øOñ/_ÿVð%ñ÷‹—ü¯x%„‹€ª(wø"¨*w"‹ ZîT/-ì¨WnOÓ“€ÀvPñ$Ô£·Sª¹N¯Û< 1ÿ¡wZ/½ªZü'çÎWžŸÛ3±KþÉaæ5TK‡WdPƒ×¼Ät"E¤µK`–²†ÿPK[^ƒ»àê%PK7Aorg/hsqldb/types/DTIType.classW |SÕ?//ï#iZ^C‚-m-à¥u(T¥ ’ MipÖGûÚ¦¤iISÃ/œ›ÎMÇT˜JŦ֋|(ˆºéœÎÍÍ9÷½éæ6¶¹¹/ÝD”ýÏ{/é+)û­¿Þ{î¹çÏ=çÜsN’—?~ê%x½t íõÐÚÇÓ~žžôÒÅô¯ðtP¥§½tˆžQèY/yé9ž¾Á’oòô¼Ó Y^~‹÷_äéÛ<½Ä{/óôƾÂʾëÁ½ßãéU…¾ï¥rúC_ãé‡<½®ÒTzC¥«ô•~ªÒÏTPiP¥kTºN¥Í*mRér•®Té*•~ÎŽ¼Â _ãÕ/ú¥B¿òÒ9ôk/½Io‰$,¿Z¬Ýþ2±ößdíí°âa{1]³ CÖb¢…ÖâÎÛ¯6Ò{o‘¹`e¼pE Þ6'-ÙpØ\~ýDŠ|Ld%"«ä»«ÐeLßVèwéßóô…+ôG&m2ôT´¯ÕhïKv´ýzJO÷¥r­Y$ÐD§t±Þž…ò;EKã½ñ4$pS4Ô²²niÛ²HStI[¸©!t±@ð…õ}É´žL¯Ôƒ†È. TžÃ/n©«†#MmÍu-Qëcd&ô§Œöø@¼/™½Åµ¦Q -·³KKêɾÖv=aä¶éx¯qE_Ò°ì0U@ñóo¢x2m¤6è‰f=Åjs|tS¿^\Ã~jÙÝp²ÃظLïèô¥}©®šîõ‰Žµ5‰øÚšp2}‘±)lû¶D讣áe¡Õ‘¦PÛ’ÈŠ‘]†?¹Íeá¦Ño»*h¨‹µE·­ ….â-Q Ÿ½eÆ’÷Ü£°X¨ÎT(ÆGœ{š²|â2YE •O5Õ-3/SòZÏ“ÝñÀÍÖP}¤©¡F54…/\å}/N†[#9Åã Sé°#RðÈHvŒÝ)2QÍ&Qƒ€8Øò£SL¤£xÅ)<ž±9ûž¢Y4ÕºÞþ< @%6&{ûê”ãäã¨ôêÇ=î±dãÑœEMH¶+«’Ï'ãéyªÂáÆp8j£Ë|ôwú‡vÑ×xïŸ>ú]꣱ޖ¾Kïùè}ú·þCøè}裣ô‘>¦c•åEµi°w­a¾.B‘£»AÕ:VÕMq¼87dŽÙmàº6¹¢b¬î‡…ÕyàC¶µ†›êC¹Fä\ô@y·s6ps°r'_î,ú©[$š£â#MLòÔGhè§þ?ýœc¹Ç‡î‰ÆP’oŒõ"ÈáqsÎ#ƒà£Cj¤R}©šψ]j0É©m³sªÂù…ା±Ýèçú¬µê MFÖûûÑmñ^UõùÕdåОþц&42ºñ ¥þXeÔ8šC©é\û T[ÉEñ±Ï†œGUJ†åvÅqMi ˆÓÅ‚ÖåKÛVÖµÔ/Ἒ’_çõÝ:7,+)³øKÆ…!¨È?0šÂ@ËUv£VYhuoX<¶“Êíz²®ñ6NûqBÍ~¯ìQÁ8³"fsŸ°9ˆýƒi»ó®vOÅ—¸KðÁ4J¹p±*å¢6©nÓµÔŽÎþô#|§ƒï²4q=6~M\/•pm`]ÂåaRt!7àÀ¥Á:ø à/wðÁorðW€¿ÒÁüUþ3à7;ø«Á_ã௃¿üøÏ:ø©˜û(ÖÅÜJMz“Mo6i)}Á¿ü‹×—ü­ào;Nþe¿üWŽãowðóh¹ÑDîÄÎ6ìÌ'™TÐÙÕeåSƒÒ>ªƒòrU•=$V;(ï%iÉæZ1×ÊãæÖ³ÝÖóôÈ ›szÊfLc F›™3Ds0fiµfðUZ®ÚEÕÕZ·Éö˜lYVj±¾bzɯî'Ï3lHõä5 œ8j˜@_Å éA’Bw ü•ŠŠŠØÑ»éËda.ðaçØòÆ´…û¨`¾TéÙzW.,•´Y{ñ­viA÷6*?“y\%Ï•ƒ2¨r]>B…Ayö\¥2¨lé=W5÷å!:¤È³u;)Ò.R™¹q®7èû'tÌ-ØEIj€4ÜÅŠÏdÅ¥Ò$u/ùW±¦õ ­ v’V*ÐÄ |ömŒ¹^v»’À6š`JTKPqÉé¢mY`'M¯¡ LKÌU*‚еîîXP*ñN²4½Q*í¥“2¹F…G©R¡¾£$ Ñ,ÁÝ iÐ)GHòËGñeöB*ÐÝk?{1¨À¿ùA†­‘´s\±˜ßG÷Û/°…¤$ me˜¢˜4 ƒ€vڴ˦Ý6Û´c¿ùŽ„ó¬=“ò7ç›ø§ŠM%›Ê6UlªÚÔcS/FEõ^*ÙF>vH3v·8øä~*}¦¬XPÁx†œ¡²LÆhªõ& PyŒ ˆù-:Ïû¨ÂD‰CTi¡JL”æaî²-NŒë^*0±÷ç®åKF-µžcEOÐÉZÛšh..Ý1F˜«GQhÒÍäBQ<í” ²ˆÿ‘<¨Þ훌_ïÚ¢É#TY6;aÎÝÖÓ©ü¥ÍÆÍCñp˜+Ý”ДC;iÒÉ å5Èiyy®w!Á—ç®VIä H¸î!zØVó>.ãyu²™ô‚aŒ[¹`lÅxãŒG1nÁ8‚±ªËÌŠF³½´ÞzI×ÝfK"×= è ® {ˆŸŠèIÐC–N׋–N×ë Ï~ú´f kÃZ×°Ö=¬Å‡µžábAÀpa¨ Ã!bH2†w8?âA*FÄ]柘ûC ¡a;ïØ1xÁŽÁÑ*`_¸ LŸ»ì˜tÛ1‰Û1é±c!رà粫à1» †í*±«`]ÙUpŸ]ZU@ûýS3þiÿ)ÿ©ÿiÿéÿôŒ¿*㟑ñWgü33þ32þYÿ쌿&ã?sœ\sz>úÏ¥¯ÛžwÁs¶v2|Îv’ÄaôØ9Ûh&²ù,í’!òÍäÅš4wÖ QÑL[°›ág£V?KçÌ|–>±—æ‹Î”“=%x:?Úÿc„>ú8‡ÀLŠÝ¶³ñ¹Å¡™V‰üåj¬‰/¬œ:bUëì-½úBsµŸÎÍØUðÂgžuÝBDr]«ÉÕ˜¨ÍŠÆÜmiB’~’¶´¥¤ÛdÛ,l>$ ˆ?TëDPIAZD‰JÔXJ@ù*òEQAEDüA(ôÍœsîÝ»ÉM‹¾×öžÏœ9sfæÌ™™s¶¿}Ï}°Ô±À w°€æ±|/ÔšEEŠB7+ò²bV¢±Ù+ÕX™›•»Ù7›KØóܬÂÍæ»Ù7«t³… i,ì…|VEE„ŠETT»Ùbª—Ù¥¸Œ¸Œz±XFÅ»¨8‹«ÑØrÂZAÅÙD³–ÆVþ*‚­¢Öj*ÖÐÀ9«óÂ"VOEƒÆ½°„­¥¢&¯#ðz*Î%Øz*6™&/kfK2Øy¬Ec­^ÖÆ6º€ÿq¾âe›ØfÂÜB$Ú ©ƒ`[‰Î6ên§Ñó‰‰Tì$¼]»€Æv{áBè÷²v‰Æ½° bÒ 6LØ—jì2]NýT\AÞí‹Ùj]IÅ{¨ø¢xµøòïÓØûÉB>@ä®&mÔØ5ö!/\ÉnvˆêSñ*–МÒìQñq7»ÆÍ®u³OxÙuì“^v=»AcŸ¢¡OSç3Ô:—öâF*vPq5;©q|ëE*ü°u}؃rÜD7QëfjÝL}–Š[¨8âaGÙ­T|΃ŒÜFÜ|Þ˾Ànw®<ü8ˆÝåŠý¥â‹nö%Bú2»ƒŠ1}…~Y<ÙÓïíìï‹1`;xû¢½±öä`¼o?ËEÑK£Õ‰hßþj[‰“bý]=í±®þ¾î!œÔÌ ‹ƒˆÐP2Ú;À ¬¥puÏÐ%‰î½Õɱ¡jstm4E2êªx_<¹•MMM ·1Pû»‘‹Ìöd´ëâÖè@Gto"†‡ÿ1ÈèŽ $¢ÚãW ޳raƒìý±dóÚ†Æ\@ÌÕ%¤1BÞr+Z$à@\ÙgEjCqä¥!š¢˜›c]ñ¡xƒ‚Ú7·œë‹ Æ»R+g"¼Í¢º¼´þ¦Áø¥Ñ¤D[ÛG¢#9<èFPñ!ÔJŒTD¹|¸ùéàí¸Yb£ £]]±äÐúÁhщ&,Óõû÷ÆöÓ\Nnq¥Í~`¹rá p<B½ý½{ã}±nAg]öØ­¸rM3ÿ*­«¿w :ˆDWÚMmÇÆ½ź’6²\4ÃKcƒÉŽ~¢Ýï'qãíh6õ%cƒû¢]1;RÓAènÑÉâ‰êŠ&bmѾ~$¬T6Ѫ™i«2ØùŸ®7ã~LÃDS2Cˉ'’bMŸ7㌎~´I}Mcã)• ¨£ŸFÏmíH¡›P”¢¯°7šˆqà 72¬x~åéUežjêæcvVW´¯QÀ×ö÷¢ÝÎh‡híˆÝÚiìL¨¨~g´»›ÁFæþošv ïMÒ™Âfrp¸¯‹ŸÙ6ë4ÙÎw ö÷!gjì’áhÍ%`§?”Uãµ):ˆë„Þ¡õ£ÙaDbàÁ™­ñnÚ Ô›…“!GaàQ_øksÍ™vµ7šì©nˆï_‹îMc¥˜LÓŒM}§ÇµÉÆN4öuŒ‹¨\¤¹-šFåT67Ù+³\å÷×?œ°¼ÒÆ»X±W ÿ•îVçV6Ùy¥)ó¼]=ȈŒ‰çØÙ Ï^íºžìuŽIsqi4až‚Ú«KKíÃ{Q]x*ÑÜÊ«lµ¿kúº»f`ò?@µJÓÐߟˆEûPœ,㌴ö÷%{¥µv'5-ØŸi|'Ùö1T<k3¯¨,ŸÑl\ŒQ<%HÉà¯ñŒüÍDÌš®œYÊy²’q¯êJȼcü6޳;uƒ¯èð-x@‡¯Â×tvœÝ¥³ væ3VÓÔØ M²»ñLòÁu¸éZû‘ûÓú2'ãH‹¸È2‰÷-“Ì>Ÿ¤Ã=p/½µõë°êhjÅ*—ª²íMÊxkçÆ6„z¨ÝÞQߺ‰Á,³=M‡‡áÌk¦:††á}ûbƒ¤Œ{tv/ûߤâ><ÅSi°ûQQìö Î‚ÇtxžÔá;Øb³o1(9íñÖÙ·I¹Pá`N=J¿CÝÇØã:û.OÀc ‚3ڗΞ„{uö©föéwQÙÓ:<?ÑÙ÷p‡»HÌgtö}öŒÖ³uöCö,Æç©JÑØtöcöœÆpòOÙó4ïg:üžÕÙω_Ø :{‘ý’Z¿ÒÙ¯ÙK:û ðSx+':œŒ KÑÙËì·:{yb¿c¯êì÷H‚ýýQ‡×ØŸtögÒÿ_ÄeÓáWÄûßÙ?hêì_ìq½F<½ÎþfѶµ¥E‡_ÃK{Cgo²“ Ц©¥m¸wolPlÁ[ìmBM;ÀÁt‡ÃáDç8£kä瘔‰þ{F$á6¸Ê |]w¸hK³X¶Î|,‡Z~þ ÿÒªCCi©åvhCm}Ÿ¿ê*Òá%Eβ mÀjÝ唀ó|»`º5ÇݱA4]«å•EÊТTèº#Ó‘¥Ãßàï:¼îÈfx]eþÁªÿ`Ь;|Ž ˜ºÃÏþ‰§.µŠ¹¶/¢18ryº#@¬æSQ€’;fQÄž†ïéð*ü^‡ïÃ4G¡î(rëŽ*f;JuG™£\sÌÑsq£áU4'Ç<ö4¦(K"‹éŸî¨pÌ×a• ÇàÎtUÈÖÑ$â«zlJ·…©™qšÙ‹p„Ÿƒ’±Ë“ÕíñÞºØzJU“izèè쿌îˆÈ,öf~‰t'Í+ÃLÑÅ“wt9&bƒƒýƒÕë¨D‹i^·Hv—T6MO[¬p‹D7ö`¥¸àÊjt` FÙ_UåéIX}N/ªl<í¨M"eŽº“fªž‰‰wg}KKgÇŽMëÚÑ,gˆêh–ñ¡Æž(…pq QK1!}Iez K³tœ™ƒŽm0iÍYÊœÁÛl: Wì Ý÷âCý}çb–Œñh61ÜÔÖ±n˶ú–εõ;:[ëÏïÜ´e]cS{ÓÆ6¥gH—,J#Ѿ®qcÛZNeý–úÆ$2•¤J9"L8ÌÄxH$¥ò–‡¡¹Y$é" Ty’Š{ìëC„v2©õ¨¾þAÄuìj’„0Ïë£cŸŸž›JøÊ)ÇÃÀ¦nwhæd[† v¿ãk¥43›ÜVœMûûNÁ”½6ü•HCÛŒÛa·H”ÊfR U¨Š,©S¦ ©‰‚˜«Rh¦4Æú’‚â»,~jÊ䪔'›6[¤ 6–1%‡Ï4eJ’AKã¶õuGå¥"£_)¶\ðll‹¸CÑ45}V¥Ýl®œt½I]š×lã½Fª¤ifRMt5í± ™Žþ+™òŽcxnŽÝýþæê–Cò%CÞþùyj§q ½Wƙ餌[´Drï튙o]‘wÞx„,ÛG0cØzK·0ØDO@ÍÍ3>Kä“Ç’ðw®ÙÆÙ¶M èýãtâÀ¦h7O¢ºOfó¬G‘fØ¿tq7$.DÅiNfšÖ”+xðÈâAsœÝ±Ëé]<ÄÈnδ[6]µ¶l¥«–í ܵ¾¾¥v%ë@WÀÅγwhÙCâ¸5õA3yœmƵ1mc!*ZìR:,ÃóþßÖ_4Øw€9tÏÅ–ƒn¹X)©ä5æ•ô+&Áx?Âr{ â€ù¡¢bOÉ `¡bß…GÀSìë< š2 Šó.p„B'k…è08åpž‚(L2†I w7âwŠX0öq„.·r±Á‰-€kBÇÁõeñëØûðÛÅtà· ¿¸Ï;æs#²z4ç(x¨©ìÙc ô©ϵC¶r<æ×&Á}¿)TdU:ZØ)p‘@“xmb,½«œ~é|Ô6—ÖEÒŽ‰_‹à›pŸÞŠ;Dë-ÊXdgËa§Ïc >lòfÕŽ2·ô8#‡wJÖë,¬/³a="Ù_ì÷ûsÆýþqî¸?ÏF7æ—‡áÛæ:÷ I:±¾Á²N«Í:g5®#ÌÉBpÍ–Q(#ˆO=jÀr¦›Ü ù;|¾PÐZž€YÛ«|•Ü^E“& û ©]Çx«üEiŠÇMÞóÀ]éÈpeºN‚[ƒGN»4xǾI9²¤:Š¡êÇÍ1«ªÆðwÍáùRÕ٤߮#òØ™«»À‘YG$ž€'ÅÂ9½~ÉŽ‡AÉíÔ áã0û(ä‘xØ,½´Ò ü0Çž€²ð„QYåÔ™s¼9{&aîýá`^kÕq¨ÀÙóoƒ,¬*°;ÿó&­°†h#XE05GA£^B"±*®J!FK’«È¹¢F ¨¾ž£p€Ûwá(Ê~ÁšQð‰~'õw¯) (“° µK¡@uë4x ÜzæI(Ä“¯ž„|ÖÈNB6sÖa•Ë;~VÏœžzþæð4|OêíqÔ›ëánk¬‹2üaÛ/¿Þ™?8Ïî#•Tq¥£r« -W¥)¶ [«Sµ´ÛÔŸ¢Û²•RÚuón*Ô›A½”~5ƒhJÁ¿¢Æp“†óZJÃ5®QÈ¡âWÀPIÉÈpå§Ä­°%) q6²¥„¥„&$CÄ_ùQ¨DðB…1ÃÖ1ƒ*BŒŒ.¤|æ66BðMhÑݸƒ%bg±µ¸i>±ƒy¼C;¨à¢‹×xPÓàÜxÜÑùlžÓ¤¾?gèDU¬©Šà9pŽUá±pŒE°TÆ Ïr»Å­tãWn­qM@uDTÝ—+ùŠç†Ã‹ÅÀâÔE³ljÞ"6Â1†˜K&`iDT1+,ðe§£0ÝiC–ærÍ; !Åë­coœ„…Fq~ÏJ <‰ò“ŽèŒûHŸ-²j<åY­±~.~øµ5nÊØA)ñ ” x· ‰DÆï…E;p¨:àÂò¬PCØK{™-öÂ^ʱ—Ÿ€6ñ ܪw>{Š4øc¯Coþ˜7qü9ø‰­-ňìcp6ɵhuQq¢¸Çð¤?…ç¢r 5àÆ:I:¨àQ¤œ nÀÏÃq¶ã§ËšÂú©“ëð»@Ö»e}¡¬;eMÖB‘¡¶5¥SkPœ;õ ß ˜†QU«ÐÙ®…ÌQ:íw§Óp>”NƒÅæÀög1ž“20öO ŒÔß,ëù|ÿÈòDµü`” -ÖÄ'¡n¹J[’¯b·÷ԨƨÂGcT2h®üM©›Ni+Wá7¿¶PµÑÀ §V! ¢!T£Ô ºCÔYŒ†!ú†Í4—^KK.wÑÔ|×!>cΠzù” ‚ÊÁØrW¾ë´“SËM•cÌ"G=~ï•rl˜"gí1ùw­”¨CœIÔò™øqþ'’Ÿ€uÓØFûNíûƒòÌ^/mìc‚wz=ÎU5qÅ·Ôe Áe¢“hŸÒî”y†6WØhÀvÒ²´I›†ù gjdŠ”wYd¤kÒN¹_äþ×<¿C圀smwvŠX„fhÁàºc«‚JõMتÌÏv8Ôù X¨D-W+¯VËç¨ËÃêüêj$¨Î[š¯2çüÌôáK1ŠÑe0Xõ , ílõ4ÑACOÚœJ„4Ì èÚÃàçÆ|ö(ú?Ì Ùv3pÃÖ[t{#~sð{¨q-Ïf¬[ç°|LÙœ<×Àtá( òZ vΛ€ÖIhk…\ÙkŠ®QË'acNÏ˘€M ÈYOÂænåå‡rœ¯$(ÙàçáAðÒª0ÊW…£Ó–Ašu ´å¦Ó2æ ‰9 §»í9-²pŠcHs qQ£ fƒ&³¡íiìÊU·¦­šÚ¿²Ô Ï)XÏK~¡Á 8†ñåÞºT¦¨ã™gá ØS±‹_®ò¢i£2µ¹ÖrCz¿eC7È`°Û¨e*ƒröl(—ù‹¿=q0Šêôî(?Vÿ@·Nfp[­+è’ Ìlºf¸™ÎÍ›‡½_š–è–¯¥["¼da|¿´ÀË(v¿Ø£¶ˆU€I8¹ÉÇ[ÀŠR^ŒRÈ­TÇ%Ú‚–pd’ÌB$áΧ¹>w+Ÿ;3VÇÚFX¹UC9B1„ÿΔãM­X¨X2›¿2SšÅòÎ,¼2 ý;÷¬=õÖŸ7–+ ­·?'dx±ókÔžÐî ’vÿè\N×/¥Mé9B5~WuX1 »ÆÃä‘ w. w“pž¥€zº‹°»MÜ7x>—¿#r.¬Å«3Ìõ~ÖA'zÅ=mA%B÷er‘ÅDtI­‹°O@”œ)ÑZJºSª–‰3¶WPöˆY‚&ÏYlhN×éÙ á=œ-ðžB_+ŽÔ ¯å@‰$ªà”P€·á,„?ЉåëP‚~ch>ˆ‹ÒÊÔ¡êïâBúÊè ¥Î5S²;zîXnÔU~±9 yUþÑòVùsùóAïÕݾÎIˆMNÐÁ…,F¶<Š/Ão%O ´ ÊüZåe]—uÑÀû$Þmhˆ®Y~á¢Í÷¿À€§Þ””-e‚ÇãvêЇÀWàwrå5råŠpˆß ì_œüžâHQ¤›YPÐz~/i=/ãØ}aÜá"ü*Xf\u¼ íC¥ìo==Ç ŽÍ‹Rjÿ€E륗0kôÜXžw°ŸA…¡UâYL‡^QõMBÿ¸@Î%óBèÅÇaàÐ$\2.æ%8mΠÁe€ÇÍfy+²‹ó‹ôSÐ¥ ÿ—‚²ºY hÖö‚n±:,¹N¦DÍ³ŠšLÉZd‘Õ2í´ÒÎ.˜ ?Ÿ¤´ŸB§Nÿëþ€t:h‘C åÅ“l(§Îp¬Á”l‹E²Õ ÞîVKÉVótçd9¥G¡¼À ½Néì/^p©'álE ä!äÏ&‹7ÌÄâ¥gfqÎÿ/‹P8‹…Äá_௒ÃÕæ9{.ÒPø\>zyC§HŽÑxø³¼ªà,Çìoðwž@ۣǬ+1RjÔ’;dª—…_Œ”€ß>×µýÒÚzð»¿8ßO€‹ð»Y$#¸ÓÀ5†ó9ÆÛ°VÄ<†JeçàG™jQš‰W_æÅþ¸Rƒü¾¤Ô¸\ÔxÞMå³¾ ªžòéT=êˤêŸFÕÝ*•wþ«š7.ÎU îä½p%°÷øÿg®*™€÷NÀûhkCxx‡–kù=J¾? b2»gŒ?Ëþß»åNÕ@þÛx³dÌåv©øÇ•§S¢ÞªÁ?˜–—‘Ÿ™¡ž‚ Œ[ÏPb\û@ÿqKÉ.éWê é†ŠŠ„!VK{ÜÃóžúQ˜%C»H£”¢Ô—}Å4 78ý'!Ⱦf.tÚ"A–L[(W®`,à“”E áì“ Ó/¯Ã¿%áíx é ®±°ï¢ øÀÁz'æ©z¶ ¶Œ0nºX‘^ŸÊÊÁ ¸zܲˆã-˜£0zJÞ”‹\‹ñ›ò MþƒµJ êù@?ds=£wŸ9þÖâJšÿCxœ€C”÷Prña²(•ßè>Š÷Ìù\Au>6Žô—À X ‘ëW€ë$”aŽ¡:Sþ32ïÐà$ˆ·è‰þmL?swIWt“%9»Ò“³óAŠâ+4WB®h*yV.+`„KÀ Bt¾n˜:7ß‚®Ø¹´V ;±ßŽtÕvÁGÄŽÐpĉ}”F ㌈S g„q°%¨¶ † 0šógñæuKj·åf,#ã$4kðTÖììÙ³óý¨Ù ¦Ë}z7ë‘cpdGÛCh³èN—bp^zÃ-…i@µv^ÐÕ‚ã!ó^}{h^·Ö¸°¡Pû‘pj<à’Ý5®€*‘ºkÔâÈ ¨>½‡~µšpÝ ž«]úÕê)z—AðDWFÀp%é¹)òðX­y8¨ÝÖ¨Âgø[טÞÜhÊXê[äÇ_`oA;c^ç…Z´iúåÞe˜Æð–Dÿ§zJ$k(A‰ïYSZâÿ\â`´«5%7ƒŽ „zcu¥!þºX‡îú¶K OY#]†SªFŸVŽ‹øx<£EÞ-ÝÃ:D_¶Zhwº‹&à tj±=·“¿/‰ü“ÈG¯E]$~&škxdiàµñ;6;…]…ÿÌ’&­_2²Y>ܬ"Æ—NZâ­4jütPb0B¯+érºY.Ë“äçðl ß?: _¼¾$ÄùF¹;áË_'ÿPKÖŽhÉÏ>PK7A(org/hsqldb/types/IntervalMonthData.classS]OA=öÝnY¤@‹ˆÒò¡°mÁ**Š%‚5”´EiCÄ—f)“¶Xºe» þ/jb|ó¥jŒ&~¼ú›Œzw·7Ù¹3sïœ3çÞ;_¿¿ÿ`S"œ°?Ù†Ad ypç<ƈD3E"GHBÓ1*bŒÁ¹Y)56ÏÐ^áƒë[jy™«:Ã-e>©é…h±¶Q^]‰ª¼ÝÉÒ*ú»?¥UŒâMÕPc ŽYm•3x1Xn×T‰npƒaèx®%†¶Œ¡æï§ÔjV])s’-â<Á+ó¦ÓÅ76Õ2©ñ+É5uK–ÕJ!º°²ÆóF,tÁ]TkEû*‚J0Hym½ªê<«1Œ(ÿ£Å<å6´Œ¡—*Ÿ:Deï’ÞÁã‘dtÁgQ’ ã.Š—q —e\Á„Œ6œqUÆ5LʸBõþ.Š¡ïŸ)³dRbünìï/©åMž,­— ËKuï>„Áu]Ó£qs¤æà¶íS¿ÔyŽLüažW’V‰™ù .;­ŒÒã?r'û.ý™;É\"/.Í$s©…tv.—š¹›»½ŸMd i†à1-@Mš×*[\7²Í ÿ©ØG‹‚j™C‡™[š¹!¡^kè… ÙÀ–>´”F÷àxe=* ͸n8­8wÃÌ‚6bÒ„å  ïÁÛ…kû<méw?íÀíå/Ð ËŸßBzmAøiì@ËBDt;Dœ„ÅÜ…ž&¿`ó›ØÍ£æáS¤ÁŽ™ ö²È°'è ï@Š|#³ý¢ã%B]¨7)Iyï43W§q¦ÑIÌô™‡×}4ü“Äaj Xàôó™~Ý)ÔÉ>·YZ8$ßÐ鈇 þŒ¯Aã~CŠvÑj'?PKÃíVµÜPK7A)org/hsqldb/types/IntervalSecondData.classUmSU~.IØl²ÐP ¶4‰ ‰/•ZÁš„’^J"ªâ’Ü´! ËËWg:ÓÀëËø­_pF±/ŒÎø2ã§þ ÿFÇzîîƒE!3{ï¹ç<ç9çžs²ûô¯Ÿ~ð>•ðŽ Ö¯çP÷€ã ÞÅUÞCB&]R,&lìþS¸žÓï> )¤e‚f„4)¤k2¦î9!½/(óÂ}Z C«Vãiu‡¡?¯é«ñµ­Íjy%nìlð­x¶fp}[­xI«•Óª¡Ž1¸êµŠ±ÅÀr$×Ôš&ä,C{vè`^‹æþ›²H§±ÁS†t¦´2g8ÓaJ«ë MšéJ­nêl“Îb¡[Ç+”õU†‹Ñ\ö¤¬Ú †Zº=­nÕ•*§ÖH˜¥ë’³°öGs']mIàZùf]­Rø@4KÝVãUµ¶Ÿ]¹ÅKÆØàƒ{MÝZ³.çˆRå’¶¾¡ê¼¨1D£§*pó¬r£qWb¢Ö¸I5cuÇmhC¯ÔVüÑÁ¦L,-Ø=^ªÚ"oʼï‘ à±\¡â(˜Ã% ×Ì£ àÆ' –…FDÁK8Çàûw­zÿ·ÚT`ºí¡fA­Öy¾²^!¿®&?®ëšψ•ZÉ­½7š=2…S´eî”ø†QÑjT™ž§‹Y+¦O ¡¤Vù¤Z24*Ýr“šáÚ:†Î®êEÍ*X¢ðZyNÕ)Û2¿C‰¿Ào‘®ç—³3ÅÌüB2¿\ȤfgÒËÓÉË“óÉT1;;cææ3©lN ¡’þ>”Ç6×bcŽËãæÃw$›trzéíã •šF’O4ÝܩﴷÓË(lâ^¦SZ tÿ ¶xÁ–ŠNóq ?Aë÷æëN&Ø¡CÈvè´Ž_l€ÏÙà3 ð`Øm½&° ÄÄ0Û œ¯Öpì ¤PÐùîÝ/áéh»}ù×Xè<±ÞGðþ`úEií{ŽœLBÌ&j¤ç JJOõ·€Ã6ðO‚É´`Ä…âöˆ}ý²yÜœuIjâÂtjßýšŒuÛ*öͺ°óÄ>|A×CtŒŒJ‘€tw}B¬•‰¼û º"òîWð 6u"äáD UgD˜Û„“A%–³‚¥“XB‚%!ÖJ"tWȽ# Ò7‰ªî¡²Äpþâ, Šü*Fì §éÂ-´ýöbáú Œ¶ÝûÐÑk½ßBr>€Ó±çØk¡^FLœâx­Ñá’¨Ã‚êž ø|Ï®óëô™µ@9 +7ãÑÓa™v™é)ßµ.Ç^X”ÅŒÝòOdŽgèsÊáM\²y;ìà.Áûö­Fn4& ³÷0«Q\¶Í~ÛÛ½ì1Ödºñ6®4.ç0u^Ï>ºÐý#z¬!ÂßPK7C$¢XHPK7A#org/hsqldb/types/IntervalType.classÕ:y|[Åѳғޓül˲¥øˆ›8–rÀ¹_!6ŽÃIêH[vd|Å–¡”6-½¾RH[œ1„⶘V¸Á1¤-¡”ÒÒƒ¶ô ô¦´´Ðˆ éÌî>é=YJÒö¯Ï¿ßÌffgggV~êÍG¾ ËmsÜðy–ãf^–ë‚,ŸÐ,Bù+ …*+RÙl7+f8j›«²7d±R]@å<"ΧÚ-ÔØ…+ÓØ"•k, ± Ækl‰Æ–jl™Æ.ÒØrˆ?-s1 ¿De—ºa«ÐX%•+]FÍ+©¶ŠÐjB¸Ä[ËÞBmëU¹X5rh¡|7¢Bµ„êT¶ž¸œÐ•Õ±Á`ÀEÔ+hX#Mµ‘›5SC­Ül“2ØfÖ¶m« ?·¸Y [Á¶±í*Ûáfoe­*Ûéf»Ø•*»Ê ›ØÕ4t7¡=4>Dh/¡6êÕNµ°Á„NÝ:\¸4ù>ªEˆ§.Zð•uÓGÊz©ì#b?¡ý„46He”ø¢Úª]Kµëh™ƒ*»ÞÍÞÆÞ®²w¸a?{'¡¨ùF7ô±wºA²bÑÍnbï¦Æ÷Ÿ‡áZM콄ÞGŸ7z?}¢ŒmìÔùƒ†(nâýCDú°ýFúÆÚÿú¡[}ÔqFþQß[ ÝF&ô1B'ô B·&t„Ð' ÝAèNBw:JhÄÍîf÷PÏw­ÁN¾QY-*ló’’å!^Ž¹Ù½ìS.D÷=ËH¼Q•}š§=ÜêŽn·E#}½ ØN‘ÁÖph`c_otwG¨-Ú7Ðr°?Ì ¸±o sé¾ÁýÝí{—F‘4¸´i¨go˜7¯bà\éD×⨲úú†úúú‹¶3PjúÚqpæÖh¨íš¡þ–ÐÞî0š-.Õìïܹ;ØËÕ3Èî Gj«khJ1P—”šîÐà ƒÜ²E]¡¡¥Ý¡ÞÎ¥œˆK{ÌšB=8.ÏÒqkt ÒÛiêiÛ‡¤­›/÷†"m‰•3‘Ns‰±‚“ÍC¡îHG$<€ÃÊêS®@Ãjä œO>ƒ¬È`}o4

ÅbyñÅjÅI• É 8¢¥í÷%ÞÓ0Õ…eg—(n¬ÞÄÐꮏ¦Po ¯èëA Kk1ä1°÷ƾásu­ç«ñ=úÛ‚œ„é¥ÞH-´w°¯{(>·8q9{¹ã µ·3hN1îÛmpho”΃ò²†††&mœWqzkCÑëÁ Œôwd°â¼˜J-^{ä@„\SãDRÍë1¸k¨•+\v^\îL1J׈/"µÀ[Â0ý‹v ž~ôYáöpo[¸6ŒîŠ<8ùåhh jõ€^$×%»ÅìÞðµVÊü2¼ƒÎ²=òÒ"ŸfX‚-ƒÎgÚü (ñvb÷«lLg°Ïé0êCÄ>Ïb:{ëì ,†á„Yû:;ÎÂõÒn?GäLÌ;—£² €S:<'Ñj’÷­z(ÒÝ ^= \õM-u[¶W5–èl’=¬ÃWá =§ÐìZ몶 ®¨(ii.ÙØÜÔ²MB–öÚªV¼Sã†æmÔW~m¬oÚÖR—øÞZWÓÜT‹SŠnYT˜ûÅ FG§ÑâK›¨èì$j'Vý3…ìè2~wÉ‘Dü¡/ëìQÚ’IvŠÐc l-Í*ûŠÎg_ÕÙÔö5ö$F?:û:|C‡ïÀÓ:` Cá³%Ci›Sð&Þ‡ ¦¶ õF#=áºë(ZCË×Ù7hÖ)˜ÖÙSp\‡/ bß$Ú÷á}‹}›Ðwtö4Â*û®Ê¾§³ï³gP)Éâªì:û!ûzÎTQ–Î~ÌžµŒ¼Î~Â:û)û™Î~Nè9ö¼Î~Aè—„~Å~MZü ¡ßêìwìýžÔó"ÕþÀþ¨ÃOà§ r“>:iæ—à8nm¢ÎšÎþDòþ žÕáð¼ÿ„çÑ.š¶56êðØŸiWŸBU°—Ù+:¼¿§µÿÂ`ÎL'…:Œ†zú…ÝÿUgcgP²#õÑ™'uöDðü ?I³ÿÔٿث:üþ¦³×Øë:;ͦMëð üE‡?ÃËôù†ÎÞdgtØòmÃ}~Îèð¡‡`‚öó´n³£blŠÍ¡Ûœ6U·i„\„Ü„2é„2 eÊ&ä!”CÈK(צª¶<Ýæ³ùuæ¶ÍRmù:Ë´è¶B[‘n›m+f?CÎÚ–zá½|):ƒ¢³äqè döFÉ›ßÔ3<0Ð7°´Ž0žÿ°(‹Ë¬—Ü,âN¾1O§(ƒpõ›²MôߎÁ¶P7%yòlˆY/*«OqÓ4¦?Jt‘'e…ââ¹ 3ÔßîÅ€pqªlI:GÎ~<@É'Çt#£Ž‚ç9'ù"œ²¨¬æ,­9ƒ3ž¢²†³Î—" MÌgÚ›–¾k½¨—| õwÞp÷úúºÆÚÝMUë¶bò´+U’ ‡ÅýZßÛ¾ŽRy_ÕØ¸»¥u š•6pÈŽ &]¨zdÐlknšªºþrä†gɵ”¤âÆJKŒ§ (¥_âw#FÊÎÒÓ“SWÇP/Ï=ÉAƒõŒ$'v28Á¼§—üÖ AÒ)¹šIE¿”HëPX²bƒ9Ww>)÷f¦¤òð§Žóù;9`#-.(KQ^çêÆŽ<œ³†×ôdÁ`}YÃOÎÜ0Ô½ijùê”e"Õ†0eºüYÌ’‡™ÙÐ7„‚ä˜×ôò|3“»¥v© ÚáTAj% õçâ ]ļsó½r¢f1#âü®ço¸E¶]d¨½¡Þ>2T*·sñö :BÛ«¶Ôl 8­äÜáj†qü/¯Û"¿jëjê7V5¢æ¹û1õì¸Ã6Lƶ«Ò›†sIÄÿfÆIÖže¤Ó|çqöÚTÏæ >U¶nißÉ߸ëç*›•t; ˆx¿/ž6¤ÈüÁûIûêŒ î ô¥I<ðp¨è`4wÐjH›aÒtés­nŽå*‘ôÆŸïê®ëïë ÷Fé®i ¹üfÙFç2¬¤E-ã™dª7I#í&1Mß´ ømßEV–c¹Dà?÷œ‰iáŒQ»[šwËüÀki”D…È3ˆüdÍ!ò„ÂTMFf²ÑȬòˆÙŠfÐÌÓåZÙ•ÔÔcŒUŠSŒ1·[ç4¨æ°­;²wiÕÀ@èà¶h½Ò¡X¥¬l×y=èÔs;Ko„3#æ¤;™^JÎ#Íu÷šÞ½é^¾Í·ûiž`L¿ÀE°>O?Î@eÉXË¡”Ëʇ°¼ lXƒøuhàÂrSyÑìRŸÃçô©'€ùTO×QÈö9†Á“Ù4 ¶G}Îûé è‡8„0B!B•åÊC`­ÜŽe¹O{Z‘Á$b?(g 4f˜tá@‘ª`+¦Ò‚ ¶ùE2Sʃã³â·•Wå*ûjZ®D¸á$ÂsíÝC·#Œ <Žó8oVöŒñR•¥’TtO¼âÞƒ¥zT”ÆEUeOú1çîš¾GŠ–ø†W›×£qÍ5€ 6¨ô§magÀ •ˆ‰cªšLØlýNúÄ¿hh-‚¾¤í1ñ[| ¾,›pƒ©¹Õ´I›A°! RÑ8ä‚;– ±™ª`G í´ù©¸IŠõw›Öß’bý+’ ®?:±@E:.œNü|,…’& ÓPÒWâÍÙ²ÙîqÇ%X(%(< Y­' Û뙀’f¼X›€Ü㢇!9æv9&Z(Dî2I\ƒP/wá­!„N„õÍR;Ûv!\MG›óúb^Ì;+æÍy bÞ˜·(æóǼsbÞ¹1oI Ux!k jmæ?lùš!+…ÿ3dÇyPzøžþã0ÏÓ5:Y²Ç9‚~`æÇN‚VOÉ XØð^8ež’ X´#€Ê¹ÊvFhàŠ€§ÌhsN@`‡˜è(ä_w¡ŒÆ3>ß•r¾ZÓ©Y+í„lhu¬MAã`YÇ ¶)XG3ë,R};ÞfX~¶¡NUÅ4¡l™|¾ïÀÓÒ¦Vã¤+è•À“xÚb¸+ÝG$p–À¥´±X½øð'ÁCÛõKî–}DɆc8,†»té0¸hŠôQyo2ß#t“NÁ aå÷‚›ŠQpKâQ’Ì»2å×(¨DX;»x.«Pâ‹ÞŇ;GùºW: Ä´ª _R¡ú”ÙÅ~‡OµOÂÊØJMòâÿ~/À*©›‹!Û©ÍË×3óÖ³iÈg5ì (d¬í+W©A‡ž*:t¾Ëè&%ïþ=ú}xFjÿëhô¯ #ÅÂnE(A˜‡°O~ÏEXާjõ0 •çÁbtÞ$T)V*‡¡5ˆ¢¯$Qí ¢È£:ªtÖ‚sªb£p1v®†Œ` ¼xjäØâr,kùø—°Óüœ3DOî¯6 P®j~pÍ*«/.ø!üHJõ1´)˃ÁÅhö± š‰ml1beÌ0öV“·¬’°1 RÑ8 ¨îŧ蒨ÃzÖñ¦XŸâFvƒSu8ÐCfd åÇð¬d1„ ‹õÄ‹÷0Ì¡y›‡ËÑ7±äd^CÒÂØ#cŠh5êQŸÔ#˜p0NPœsls¸±üT,g©*–Är8ÁrR‚=|æÌ™ÓB 6;}§öwÑž’û¦›'œmís{ù¿ûÿø^EÀÖö4¿ØçIšù[–öyx–6†+ІÑ|6’Õ5 C~cÀÞ|$aL§`Ól®¤Ã<;†~yZºä³á„Uü^B3ö+xGo‰ñb«(ZD±MÛcö '¹Ž» W¬«=®IØqs…ó$d´úŸ³ü¼üÃ’7„%z¨\9½‰eggÖÿ”‹<†‹¸±¼/ð5PƒÖóö‘çíê$HEã ù”^5dq«’aé C•Nɹôˆ{UjÜá9ýš`æuCcxb‹–!á%Cv‡Ý8SI!Îç’ ƒÐþBR͵ ¶ ÷ô Ã¥A^,áÉeØH@*Ù‡Ãú|Ê$ôªtð>0.¤0ØU"8»Äª,\˪¬öC•òvð;…²pø~1|¿¾ñûFÔœ‚6(ƒ8ƒVNÃýÚ ˆJþ/ü/'~'`ˆæ§ ß’ÏÜ(dðZT¸ŽÍÖÖ®]Çæ%ø“4¿-¸_*#‘¨…²¹ypm„¾&á V{Ö•&ª]¤µŒÖ¹¥aTœÕ¾íÀ–`õÏð²œ?OÞqÞ5öp½qÙ¼1õPxàb%ÞÃFÿ0 mj—x›dó6…:Ú„ùF`¥l,P6¢®6U(ÅÃPãS†!'8 o†ÊœÌ}tŠ|Å4\Ã(–-AÃ7𠉓0ŸaèüߎÁÓJ‡镯6 ïX‰ÂiØ1¶Æp(T©úU }Þ¹Ò‰ŒäÑDÎÇÜ€s‚ âûFš[-P-Áñ}‰X/‡L²@€wq«,Pe@Å$§û4éWÄ'á&ì›ØŠ¥±¬i˜Í Ð^ Âß§¡q^#¯zecÇįÛÇp#È}œß³ݳRöêRî¤K‡ªƒžÅòM¥«Âá#-;mkùK*œ¥>硞J•Ó1ëÏå—‚E}w{…krýj¼gr=Ëø¥ëW顆†í¯³ÝÙx¿×ç¸øVêñ=sÄz€ó ’èϘ/cJöëPzš{ëÆÅYˆßD)œáŸËK|Š}ÞgXã¿â7î´<²×‚Oa½ò¶\3›XkóÞßÌV!-?·˜¿cHA¦à 9â)ùŽ3R’>lÄ:8ó­È6ÿ)¡°èÞD]9ÙEJ‚0)DƒÂ¢hI…:·.ÇŠVâ:Œ»‚3¯9|'¸Q=.â{–†ëåAi•OÁ…¼ôûŪÏ)|¿O£ß5Jˆyɹ:t}›† æÌð¼ ư’³Ž M¾)ÝP'n†åª"Ëž¨>'|cÔÂRŸ£h¶ÏIÃßo_ë{„ñ>qýóˆ·jÂû>p á™Rñ°úÅqøhLÖcãp«Q¿wn3ê·Ãa£þ¡qø˜Q¿q>nÔ£>½Êb^ô ƒ‡Ûú¶q6êèÜŽõ5bXÅ8|Ò • Ò¼q¸Ã Í$ôrw&î ™J‰«¼¼Uüuk ª2øŸ—Àë%_ÿ*œ‘ÆtXÆØƒò9¼f>‡ÓÓ·ñì’ôfl3Ú=áÕ£Pîé@<ßÓ‰xŽgâ|O±×Ó…X3_”8éÙ MA­ƒÿMƒFfñZœÃ'$‡wJ?šÄ¡ÁA ”\Ü’Dƒq[8‡Moà|Vs>Ws>+8ŸË8¥œSæsÊ^Ïçõ³Èâ‡ì¸,³H蜘éN<Á±H~¥T¢|M þ2ê¤}uZŸEñgQÕò,ª&=‹š¥æ­A ñ&¿rVm’ÕãRû·€£pLnÜ$w!â霾éyƒ~=<ˆx­áš±"ÞÛxíñ[f1B‰§{ÌÓ3æé…‹ŠÄ»|)ˆßrù¤Ì!½ÒM"Àb;ïýì °þJÖ-Íë9l›°Vš$½“h_EøÐ;2°Åã0"R9z Y7ÊlV†‡­¡u£ðRœŒÏ›úÜɃc°á‰t cénK×p½©!N §"nJE\e!"¡<™P`–(qvæ>`=;<~=ÿòòò<ÏŽ‚ljºûá–)ñÓòíý H¼±]â}m+„w#Ügz»y,þF×uù¸üÊÍ£àö+ؼŸ7S “Ÿê1}Œö¤ê·¹ÿ±”]Ž%º¤kžiÌ‹ » Åö+ëÙi¬Šš©"ÛP/sÅÃ|aæš Æ¦ÊÜ,Cö¨’áÚ"#\¿ W ñbÞMÀgÌÙ;ŒY´z|Ár#vÇŸ;?Óf”I°üèe$÷%‰gÄ©˜©؃¹>ä!“eIJñh’Ð>N?š„Ï6ÒOQó‚û"rÒX6óÈîr v†)ErãLƒ{]щÕÒ”Þmíó¶`˜7ÌéRÔOøM8^—¡4f¹¶×µÂ,1’üàÐvIoΘ€ÃÖ›æ+jѳ=y5Yätd «¸£ã.,†âyÉÖÛ6ï Ç÷t,ኊ{:îc]Çl0,ûA×ê ÜNËG}>°žQa¨òt4Ñ™ÅÉñ´KÑu'z¹N˪{»‡â…p\šÊ bmñó—S-OôàAàÖ–|Óßãa´ŒúÅi™‰²m gw¦Af:ü/uÚ‚é°B˦ÑòÑÉiÒWš.eòôU È(&*_ÁN€5‹™.S™BQ“p¥úÊ9§qêĈQ\ 9CĈöùBöýÚ$†H~?!nœäóôf˜%vÊo:**Š*J`*æ2•q邳OPŽ#Õy,Dðl'%|ú1Âq9Â7"ç%‰¡7ÈN5²3ªT‘:s“Û&t¢}š2šÔØÀU,OÀR QýôXÿÚ™¿\T­ÄC PKóù6PK7Aorg/hsqldb/types/LobData.class…Œ» Â0…ϯ½ywttl§€«›¸(‚ƒàà–jL[JªM|5À‡ctpó,ÎùÏÛÀƒ½}BP %MFÇ«ª–,Óçò²Ð:¯ÔBQù^L“%Á—Â,„fìšþ4/^&[BÛÖïë¿Ìî£\ÏrÅë«óí£Ÿ‡¹ž„f«*sà Â_8+¹’lbo¡w|Ï à–>Ç‘c mǺïé PKçk–߯þPK7Aorg/hsqldb/types/NullType.class•TkOÓ`~º Ö]Ø`ãŽ÷ v€ ðîP£“’£ ‰|+ÛK-éÚÙ"þ&?xK0šègýQÆóîmKã>¬}Ÿçœç\ÞsúûÏ·ð( ®§Âles2æe,¤q79z+‰ÛizÞIâ®ÙÚ5Íõý“0Q³½üºýÆll•]‚ÚåU¬Hè]4,Ã}(!®”6$$ªvƒ|2 £Ý2µý5ãëPª„¼ÎÜ•¥'Uî(¬²R5µv[BQ)Õv´=­lj–^?l´ª5Éoðˆášë–N–}dÉ  ÎKl›çgØ–Pz¬ëÓ5—‰Ú攓Åu +uÁEU»¹eX¬!D–ˆ¬±v›ÂUº¨Ý•“u»ÙÒR¬D+Öülk‡ÕÝ„7ºX·­=æ¸ë6®MÃ¥îV£4UËeζVgQR'!êém ›ÿ«ÚµßÁƒ`tڮ銘ùöozR9=ý`D ‡®Ïk¾w®®YU?u즄ñ®S±I£Í§,XŽ1¥û}Ê‹u³³Yäp/‹û 0w˜Õ†m4<`–³H¬¾¬ÕÈÛ’Äb@*YôQÄ®ÛÈÃä% EæC㥨êŠÊ—Tvƒ”h^†CÌql§¼Ìÿi?]Ë5šÌ;Î+êÉž†ÛüÂ3[g-¾rÌÓ%CŸ £<{z+ ÆÓ$¤ŸNCè¥7 5§â>ó2&9zr“Xò½ÇnÀãz¦¾ æÓƒ¤*è~Nÿà±ÃñØ¼ÇÆ Ÿ {|rì4r¡|c<ßiŸ;ƒ³!.Á¹Ÿ;‡óA+b.5€_…Þ¯HþôL.àbÈ=ÎÝ%ßý.—¸+§ø]Åd(l,*ìµ›((/:!n!…)L‡nÿŸ ‹ø2f‚ éø™ïH½:@ú3d1ø PKÿè¹·ºPK7A!org/hsqldb/types/NumberType.classÝ[}`\U•?÷Íû˜™¼I&“Lš´IIK?’™I?(¦´¡%Ÿ¥ IZšÒÒ¢–I2M’LI&…ºîRjÑ*TKJ¥åË(K A\pE‘ÕUüØuuÕÕu]×Õu•’’=çÞûfÞ$3Ó¸î_›rçó»çž{î}ëï|öóp‰²Í /²-.¨f[ìj7ÛÆº¨°’kܘì ÜNDz#Ë1صÛe°Ý»ÎÉÞídïq²÷:Ùêv½“…¬ÛÉzœ¬×É"N¶×ÉúœlŸ“Eìêr£Áúݰ P2HIŒ’ý”ÜDɆ"Á­ÓÓÓÔ}˜$‹lÄqkIŠTs3%·¸0ÙNÒ¤ÜNJ¸´ï£Ö¿ äýTäýþÒaöW.v+;DÅÛ(¹Ý`pC»ƒ’ÃÔõƒnð°QñåîtƒI öaÊ}„rMÉ]nv7»Ç`G]°™}Ôɽnv;F<>f°» ƒ§ä~ƒºa+;a°ò`;IÉ'ò؃ì”ÁN»ÙCìaó%ì17ìfŸt!«1J>EÕŸ¦äqJž0Ø8ið¤›=Åž&‰$ÌgHÓ3{Æ }ì¬Áž¥Ê ƒ=ç†Iz“}Ø`“nDE‘éóû¬nbw/Pò97¸ „„î ³hˆÑýý\6§÷dd¨÷FDiËhÿß;Œ|b½#ý13Ü=ë‰ÏÁ¾Rƒ¹ßÄ"G<#iµ<=¹Ætß^V•ÝÝéÑáÝ‘¡X–Yà wãÆA¯ˆð'ç[ ò ÓŽÓ›´å’ LZi#ãû ­0Ë –Ue6qzåÌ6kÁS›Ñ‰ös»ÕööÇbC´ê†F{8.Ë3¾>”ÚPld°Wî×¶-o1Gf£•êCÖvyO¿Œ_pÿÝaÂ/Ù/MøWxÑJu4Ø¿™ìWìßMökxÙdÿÁ~cÂoá7&ûOêX8ËŸ!HéνÅL'ƒ>7j’Ý ê¹"¨³±iìV»)v&üü¡–ñ,*l±X)#W´³bè¶­¥}¼¶©}Ku·bW˜bNÆ®(‚h¬Üº kºZ·tšðü g¦ÃjÙ»72DÐþÖd¿cÿEÉï)ùoJþ`²?&ë O•1 rL™ÉÞ‚™ìc&Ëc¦ÉÞfS&»Šµ›ì<Õ峓½Ã¦Mf(Š©8pÆ•j466‚«©èøfÅPœ&»˜-1—â6•Žýà Å$%顨¬¯›áÿ­Þ©ÓŽ0_~xž%@Nc· ,ªÉþQ$òöÃd ÕסvYr褋2ž5“=V£°ø2ydÚž >Ùî´Ý¤#LS ¢„qa†Í<–nä?<*oÎ:…®èp{¬[˜Ù-¶7¹ ²ÇäüDèO0g91q7!oå…¡\È;¶5mnÀ…\9Ð4/E&6íÁõà‹[À¹Í’®hY.ºåJž†Û2˜ýIÒ ÊˆöFn¡¥N^ý€Ž†ÐCÛõ²9yõºÔ©z–WÉÔáFÙÜ+rœ=W&%4âgU–ñ9¼NiUÖ¦ü¡|? -¨ô«Ï[ð8}±øòôôô9>àn*ç ÏI:téŒr› }:àu> ÊÔ¼^ž¹$à­ä™ê€·žg*…pˆçJ… xÎ,„¯ú“ ~á3üûË¿cZÎi¸T~g4'þ¹\NlÅã¥ÀíGÁÀ³ =.>-=hÃâ(•sÐý’ŽJú˜r› E™”qoý8>õ#ãI “ :A}ީІåÿLªôªTé)›JÍPé¡tBÒ1¤{må7:®;ǽîqoÑx` µ7ƒVnÐQ+Æ<ã2º±¦ë•ëõ›^oØôzÊ9Èš¢¯#}é+6Ê5n.ô5”ÉyæÑL¹ŽÝ糦^ÏŸÔ|ëóx¥.*h×{ç{‹Ç½yã^}ÜÈF>¸ ŸQl(øGŸÜ~—œè€œè"Ä[vœÞ·ÇÀ Òx’J~û/ø½÷9îI§gÈétR’èý6Ê5n.t¬܉"ÈC2‘<‰Ù¸@CHø‡ÿ Z}Ijõi›V'ghu2J²´ú¸r› ÝçËOø >oÂW˜U#š`¬øcr~ ù'VœB\*¾q®£Û*Ùü]©ð¤Má'f(üDz éSRÁûNIa¾À¸¹Ð¨¯(á+Nøü _IÂ7/á+MøÊ¾ù ß‚ ú #W¬?¬=—Ô²V‚PIZ>!´œÇG’ÿ(ö•'ŸŠD’› J)ñx;ÉãNp V7Úxtð:¢r$úè]þ,Üåõ>µ‰çTî z«&`ÑÎ -Ø X¼“Vò(½!«Ú9c·j^ž€%3Ä1ÁQ9ë ˜:yXwÞ‘bÕË ØÄªÌ$V1,}™.?ü¤]ÉJ²ÿ餵\.Zv!n…·N;Ægrbü?ΩQr Ù k™ä¢#-‘´LÒu¿*b¦$ù­—ü–Ø$[˜I²™|*‰#©aPâå'>ú)îL5í4踡hi½Ø‘®eåÀ|)€¢ÊUÄ´dÛu²­Á¦lŒìk…¤:I!‹ãÂçꨎq5%€´UÌ]ÏèEzfO¡ Ë•[”ÆËBÁø?BÓ™Á»P”!qq1·l^̈MštÕ(ø‚_„j측œº÷Žû)Þh=%86™r§¾M™¬+ø ²OÏ@ð“” ˆr ‚‹–XM"xVGmžë.H¹áLtWÊ5n.t׸ ýŸ„•_ M1Ò<Íeê‹b0AMÞúGàbYOyÚüY~·a4 Þщ*®zÜ”Åí™J’1A‹«©êpäØƒàMÕ'ÕÔ¨/*?.Ÿ„KR~¥¼ºS7߆£Šž—¿¬Þ`(lbS°”µb Dät¼†Óaàó#!ÄújÓQÁío5q±´ */¢ü”¡w[ƒ³ ¼‹'àÒD+Þ•À¤êÄL|N7dCÇ8µ‰ ïŧ¹kÏÂe'`9u•®¯Uýª·òê¸.Ùzž]ŸàB½a“©B–)¢*¡4 ©T«¦ÃòêPf$SMkµÍ^«ÁpÚÈU‡±2Û;¤~õQØ óµ¸êW§¿;l½Ábs=uJLt¿z¸D ûÕ´i\ %®…Jæ)qLA);î >Ëp±p¡P›Ø[P¶ä<8ͬ—Š™U¾ƒë}‡ÒªÁ•åázSÆk0UÇ¥›QÖ¤/,eMÊd-&öRŠrŽ›±ŠšÁ= 5hupy­Z#3š_õkr?Zà×dCá.˜£°R ذNذN/UKõãòÞR,Q>9Ä3 U¡Iظ^-£ž ¸_¡¡£v %øµ“¢¯J}ó’ìë×JöõkõµD?&Ù—`éØƒé].‡LBÃzõðì‘æ4>Mëµ2µL£Wê~Ýz¥n%Š·Â>þBfR~šG¡°TçO *㲄óžŽ rô”©Y_8;:ÛU††êQ4EFûÚ[€Ȧ#Of+ æcN«^UEý;p)Ö˦?RÓ2{¿¥î®<‹IYªM¼ˆKçE[]X|l›%’›çŸraq¯¤»%ÙýýŸ{aqw(ÿÓNZö5Ðr <5”ǸpS'b~%9¼Ãä+ÐÜ…ž«ÈwÖdƒý`àÉ÷£ ?¡1ó Ú´ý´¿Ž…èÊݸ Þ 4B‰tè„ÈiØŠ®¶ d0°€$\OÎÒIs2”©–d„(æLËTÔ¬†ï1´¾Íg¡•4á臑"H7@* ´ÓF€»EÛ$\µ^ Ë4ôðÐNHuœ…εšÈl9¼ÖÀ®[K´c®^ï*sq¥H“ ÈY~DÄ¿ÔëY©=UùÔäS—OC>òiÊñäà&‰·|–Éö*¤Ûz©Š·-èâéóÐ¥À‘ça»X¸†VïÀàegG ˆ:^+»cPƒ²¯vã9¿»ìž€ëkp»<ïîƒÂ3ðž\/!Ð z¡3pÇ΃¹ÛÓ Ãùü€šBn‹D®Uç·ç¬BÜZ«8jó«8hEUÅpb–‡ÏÚ «º‡8Ïôp¥à.Ê›‚‹H_ô\ho•Ž Ìià¦$I5 =Ñ~¶#ÀW³E0®Sm€‚´ì#›1¹³–G¢Ëýê‡zDªaí~õTRŽ1È …6/Ÿ„OÂGRóª9µ4þ) ÁűÅR†ÃR†^!1¡h÷éÿµåò‰oICö乇ږ?”¨´)Q!Z€a¹˜-IÂ".'v ÁâÆ¹ ðÙ—Ì)ÆN¹—Ú”ÇIs/OÛš°É’y@7=î)(wàÔŸ_Ê–IÞ”éSÁd`Ê7òƒNéOÛd¸rŸ Wî“áJ› WÚd˜²E†)[¤n NÀ_“Ó  [Ñžî:NßîI`ö(ÏÞ›¨âòë¾û(wŒ\ƒ·e>†k¶Lõ}|ŽsÇH†? ÷gPm¸pí@¯çs¸]xô4Øò·@¡=´*©äbŸð ’ºo4@ÁN¤ÌÆŒúW³€ì5]4áó² ¸jPÇÅõ‘Ȭ±2!+óÎTPÆLZÚ…•šËétâI—­K)Ö$س‹‚~Þ•ó¥Ÿq™/;Á«’ÎÊÐé÷)Ê5n.¯ÚÎSGOtþ· ’˜#/‰ÒÊÊQ‰ÝL«q«c| ®¢’.k§¡Îº;: «(4'œpŸÐè~4NŸgt‹•“¿GI¡èƒ|OnÌíò2¥ w34Äj$ »P>]èñêNp!Å*>ôwÂÖ7XÖý’.Á^'û½Ò¸ß+ûjiÜÍrBÞí=T«zo­ÕÆà.Ü jUܨpȨU}');âH}%‹Ã'ð¢¥WÂ*Søz’‚G½LÇX Ö(ÓéŒåô'ñ ‹ÞZ§£ÖH æu‡9:ê:iÐhh~íp%n¶ht•x:£œ‚µ6Ü….ôÊͪÛt3_Ù4®§¿6Ø T’«3ÎkfÓ¤}²þ<¢Ë\®?òcÛJ¶JÂÜ îiØ’à—ÁH?È2Ívߤrv‚qIoJº;E¹ÆÍ…à·É8!d¿gé‘[E€ár½¶=Àø‰GD#<,“7a|ÆD0´nxBöžë1`•MõkÕý²%Ì7ÈY* 'ÃЬ"0>¹úÿœ}s„óá ÁÙ›ÎȜ༄­‘p¶"œt?Èg‘ ÎS9;Áã’~,ÉgŽqs!8'álK?«Kµ%˜äÑÎ/0 Y¥$´âüPCx>²^C`5°“7’~uŸ ÖF UmQ‰Í ª\ÔÏüÒR„õRö. ë礕¾?„°Ö¤ÃIÁÊüTÎNÖox?ÿ XsŒ›]žá~QÏÇ£mAÞß?Ê£¤}"ú/Õcôt˜k¬†{×Zx {F¬ï<‘dAæM~§â±õ:N…NS‘áRXK!{柳ÉpWËnau$ëÈr_Ë.³}Ö¤}ÔGÁÕ§)ÀÆçãüë‘-R¼õ¸ÅàÀuÖ@¶GœXu0ݸJlkvŒÊÙ)yôC¤—fWŽqs!xK®Ù›éœ$*¿ê~ÂZyʽ‡N'Cðòxjía† YÛ|ÌMõ •Å0. ‚7VŽd¶†%`ÒU«×˜‚b†‡®)ð‹‡,•¨tcôÿ÷ÈYú†üø|Æöùö±¿¶x,Y@[¿¶°ÿ<$׸¹Ð¨×9îõŽ{+éÇb9~/†;€õ; R®Ž].•+·Í¦\;¤>‚¯’Ô.)ùü <•ŸÁcPôTï"$€ã9x:H™°´U÷ •—ØFùî~ù³®vq–+ p¹3ùa]œÞ.’§Îüã£àùÄh²‹˜|ò²&ùÖ|pùëžß0)¨§¨ì ëͬXÞ!üœÖOò0ðºmZé7¯ç ‡%Y¿´­ŸœãæB/Y÷Uù÷Ÿ´4KèN{™ÖÄŒ2b‘¬™m Ÿ¬ ÔÔƒÀx$@ˆP}òxP+šžÐ¯lÑ9êW9È ²ÎJ²#”kÜ\èë)„Ž‹OYù+ñ-Kb5žô¢Ynï!Ü·_É‘Ëö-l)Xȹ8tè@ ˜Á³X©ŠJ´ïÖ(í{‹¼5\@ ]O.8Ai€ßGáñ…—BÜ7uP%Ö=ÜZ0Ÿ™€‹ôB‚6–ùUЖ’e[k§„:Üàd¬SŠ·ß[l¢áZ1|Žö¤gà©bøü$4<·a°À3·ÃRž9X 7óÌûø ñŸ³üÒ3g>ÃyÁÿPK‰1ù_ŠÙKPK7A org/hsqldb/types/OtherType.class•V[WUþ&™$“0@áÒÚ‹JKÒz·`BZ‚S(MÚ ¨8NÓ©!'cW鋯þ_ôÁÕ'}ák—­u-/O®å÷™9I&°–YÉœsöåÛç|{ï3ùçß¿x ,†¼Å>‘_ùƒ‹æ#XPU°ÈW¹(™ÎÇp×"XŠ C–cøš‚ë|\á’Un{#‚µ7#(HˆZÎ=fwkLÂ)Ͳ˙{õ/*Û¥ŒC¢zfµ¡•ž3«¦sEB05q[‚œµ¶É©gÛ¬×*únÁ|Ä\U^BoÁÑϯ뵢^ª´¿ÌœåÅ…,ò¼T!ÉVôz]Â`jB»¯?Ð3½ZθB ÷­è;ä—l3,8¶Y-“åYÖ´k¬ÊlÓh…Qœæ´—L8†çã­Ù]~$ÓªzÁæËe›•u‡y|\L%Äåb¢‹Ü;iÖÚ)™U¶íäÚ@ ¬^§p³]òÝ‘#†µSÓmBœíŒØ¢eµtŸN ÏÍ aU0Û)ZX3wL‡í„™¯:̾«¬ÔQqÚ†-aãÿ¢vå»C°d3¥Qÿ²âx1û›âF¦ÇSÇo¿YE‰–ëšÖðŽ !‰ŠÖ29Iè3ôjÖ“^µ­ '»Ê•ºY÷‚zû£ÙðêµÕygRïï=eΨ¸Ý§â$Š*ná¶ŠqÜ¡ý>›ÍpÑLCZ-.ånªøël¨ØÄÇÄ ëjZ”ÛÔ+æ#¯[ÏÙ ?¶‡´¨;ºŠOði[*>±!¯ÜÒ4%ÂÀ¶ŠQœ Jº‡á%êÙŽ”Q¡§òùå<¿a¢5›fÝmOi™~îÕ²¦mÍkÚVqýFŽî¯‘® 3ìS0Û¶ìLŽ?‰ æ§Síí¶DCî¡ÁjüBàœSŽvFí!§&6(M>ëŠY•#Jd²Döó¶­ï­%ö°QCéͅŽ7â³§ƒù\¢¼@DòF—Þ¡TÍâÝã#ôj N;͆àô’ä­N L3 wr@¾Cßhð¤ŸøË„ħqF˜MCv͆'Ÿ"Dð›ï¡$B?Báë¯÷\ë³ô !_¤<àå¦ë$×5D¦á=ü ^ê¸P˃ˆì íÎ m¿ÐJCyþxäñãÕ:@GЩ㔘ÊËÄ`€Æ±©¿ |ê b?ð 3õ=ùb`èÅs¨ø˜ †•SH œ>e“Ó˜ºsB×—¦½izÊ{ÁÑ2áÍ3¸èC r´tíýE8©©{½éw^øÅÓ¡÷[„Ò´õ_Û¶„¥éxS¸ŒÓÈ àHûS¢ïô?G|ßïà 뭦Ïá“ Ÿpb å”hsŠÐôíæÞÆÄÞ\¤ý´ë3x$Ê;xW8̈Ԍò<ð|<æ¼ñÅwG ìUh~³>’xβW,QÌá=_•òüIBWšM4âÆz~ÃÐú3 ÿŒ¤×BøPKÇÞXa^« PK7Aorg/hsqldb/types/RowType.class­VûwÇþÖÚ‡¤¬A¶X@ ·< ÈzØÔ´nkó2Æ!¦²yÈi`-¯@–Œ´†¶iÚ¸éûýtš@K)4­Û8)9Iã¶?åœþý!=íiûW”cHï]Ë–|šž‚<³{ï;ßÜùæ›ýóƒ7çtâŽa\ð!ˆ‹²^LhÈù¡ ïÅ$÷—¸)pP‘Ÿl?ENi¸Ì–+žâþ*7Oûñi|FÃg9â¶|ŽŸžõâóüò,7_àæ9žlZÃùåyŽù7ÏûÁ—¹ù 7_õ‘÷kòun¾Áƒ¾ÉOßÒðm?ä¹ùŽŸ–ð]?¾‡ïsó/~(Á7jÚæðÕI«(aý™d¾0Þq¾x);:Òa³±ƒ]=üéüĤY0í|AÃ$¬fûh_Ù(AÈå¬B_Ö,9׎کZG©ÕÝ™\ÆÞ+ac¤Þüm'$È}ùQKÂ#£™âdÖ¼šÊÇþh!?!aC¤PÚÛ&Š>`õÒZÇsÖ¨3€ÉÒ;>^°ÆMÛr@£îùcŠÓ©ÉP^'Im*ÔN0P?3“MœÿÞBÁ¼Ê l«/Ãÿ3ÿªÆå von4•ÍÚH5ü˜ä‘ÄŠäÀº4ef‰—F­£"{Ï›ÅóÎéª2଩R›öÔ„]§&5$j?)Ó²‰êUi »4Ìèè ::˜¼Í"€Fv·ŠÄÝ”e»Æv2¶W×>œêÀÔØ˜Uàd?!E9~䤎ñ7×t<†}:®sÓ}tÞk Ö1€ÃÄʇ:>¤Ž>ÔðS?à º–-ÐÕ2gð„ŽA éHá8‰óÐãI=ŒÇuœàæç¸IÛS³@:N⓼€êøné¸_êx™›_á×:FÖ1 Šû>¢ct ×ÕaŽßà·:^Áœ¨ð«èÖñ~G€6µ··KØö_í0Õ~9=ªj´(Zd`àð_G$æÔªæä¤••,ßôåÏЧFŠ‹£-ªq±™¾‰Âô×€Bð?"µ!1©ý½…¡R ˆ‚ ÏsR4ö:^#$|Ýnä*ê%Îè™u}=+øvcë ¸>9ÏœëÝ‹}®wµëõ4Ë‹Îý+¤í]Áw ì+' tÒ(/úúËh.ÂCÿä[PNÝ…šŒ5k%xOÆ‘|'={ÂÑ;h˜¿-ákðÇq¶ÆØî,ÁÏ¡Ó Òí÷ÞÚ„«„GæÄRÛÏ}¬×pH Þ£í‘XÀ܉›\PJ´}±$]®ûeú¼öQÿL†ã®o3G>zL¬#JZ»”ßI¥ÇT9ü9ÈÄ à…«ÍëæbÎB]%'\wɆ§EE ™œpœ«“;ãôWÂzÁb™ypXœ¨bqdí6‰¥’šïÑš%¾ +ŽLý¡˜`gLìQ6æPÔ>N¥'›go‹{ž6pßÒo!!?í!ÿ’—8×L¥õ.pM,@’BD7òœø?N¼áýLL·º;ñ‹ôÎ[`óÄѹØkØxK°´-k¡©^µñ>6Nµx·™¼§pÚEúáÔ¨¿Üh½_”vÿƒsq:^e·wό✥ ¨j¨.P>ÂâÙPYUTªJPÿÎPCrVª®ÔÖJ¨[ÉIßYË‘’. â§\÷ßh«ý\ûQYD5$ßÁ¦ù.ÍÃBgh70R„Íð¶w†Ôòó§Soc?[6Þ]3XIb±Bog,ž`Õô¾ºE„j†Ïž5|³Ó^Z÷L…\äò=ºl}žÔpVÃ9ñ3] •n( ØBuhpøEß…îZm—ØG¡ˆÙBx}D ðl ¯/²œÀ ÆçÅŽ<Äòµ,o,—+圮­©`ø¿Eñé£ÔEð„+2»™á”w«2C•\ÝdÈTÙ á*¾n;·Gö¯á¥ÙV ×%G·“ŽaÜ逻V–¤íï 5öv–EHËÚ†„NÍ—G©þ±hüulç¸*yŒÐE™Ây7]\âºuä±,‹z%ðG+õ0FУŽv+á€ÿ&ZCJ ñðMlL„OØ;ZBBÈjs;w·i(G¸ºùJMÝ\GE¾Ï׉æviÈ܃êìõ‡ÉÍ7g'1d|ÿPK´¹á' PK7Aorg/hsqldb/types/TimeData.classuP1oÓ@}—³ãØI )$Pœ––vpœÁÄ€!,¥¨jÔ¡—ÄJRR;­ÝJ0!$þ ¡ H]² Ub@°ò‡Xå;; •áÞ»ïÞ÷½wwß}þàV äPã`›/thX°(áªA°¤aYÃ5åyà{ ÌeÐB¯øÝAõ…g›Ý¡åºn}›Úï]j/nE¢óô‘µD{è‘ÍXI‡Ñó¢­Ôˆ[u2ÎÑÑFâ¨Ñv'NÌzû‡bHGk}W g(üžó¸½ëu¢µúMõEØOâôN°7^+`X´ÖƒƒžÓ÷‡Ý¶=y¡ÓìyD$ÖênE¬ Ã( /¡ ¡ˆs óÿc(ý{…øîÛX¦¿ÊÑr”¤'íJÒ6æBÌ90iOxžª d 7ì0óòæ\æIóøôñäGM{a n›S(vm õ#µÓËà§4­h(3Æ€¼{Ïͼ/’Æe¢mÖø ²rPŽ^ %é(ÓTû”ÉL®œ)«©\=Sæ©| —gò&=-C|»ñ ÚÜ”¯ÐˆÆX‘–I¥ŽQ‘IÅÇДc(|[&͂ߺËd5ÿ'½Jæ2ݾÒíez…+0g=åï_³iu_Ý[Ò_¿E5ާ•¨|Bü>ÉÎüMÖÁbUÑeúoPKãß:Çý+PK6A$org/hsqldb/types/TimestampData.class}P¿oÓ@}ç;ÛqâB M˯¶ Yœt°T!Š–D$uèvINIJb§µA¢#R¥þ,0 n,a@¢Bb@°ò7!Äw¶JAXºï}?Þ½÷ù¾ÿüüÀ:ªyX¸æÀIJ+:¬Ú(Û¨0Ø‘ê„A7b`M3A¨óƒ8Å`݃øÕ^³¶Mp?ìRÛôš ]Z„I’ï©xkªÅ½©å¨õ(¤IÚÔØIUÕÞ39¤AÉÛܕϥ?”AÏÜÞUx£¶Ã0·ËÎÓ‡rÜ’í!]ÈõeÔO­N8Ë}Õ ªÞf¸ßóûÑÞ°Ûöãcù­ÁHE±ÈXnÔ.\\wa#çÂAÞEy†•ÿßc(žÝ+ù‹mTèù,zXŽ¢Ö¤¬¨e,$耑åÅsT•‰É êŸÀê«'0êü\ñúÓìó§ØâOöòßìbÆ®Û$,a—Ä)ú<.dôy”fý#Œ÷Ùø"fc6óI6.ýs,¦ãE,eã'´·AxkíÌ׸¡=Ö¾Â$xõU­™–ü˜ö%‰´ǰÅ;>I,.Q´ÀoÞeºº<³_Ê–/há#-÷rºÄ\ÍHMZB?ŸŸ¸ÓQ÷ÊÙ/&ötº‡iÃä·©·ñÛÙÿªp´û/PK¿¬:VéBPK7A+org/hsqldb/types/Type$TypedComparator.classSMOÂ@}ˇ¥X‘Šßˆ‚”bÒDà 5ñ ñ^ ’ÚbÛ˜ðŸô`"šxðø£Œ³µÔ’Øf§›™7ogÞNßÞ_^ìCM#…5Ö¹Ùàf3"¶¸) ØP°Ë x†ç™ŽÍ?wÜžÖ÷n¬n[»üô2$üÑÐ`(LF¹ËÓZd9Às\ŸaåG:¹Nìî¥ev8dæÈ´Mÿ˜X”¨CjWÄÒpºtŒÐq®‡ºK»ªr>ÐouÍÒížvÑÿð¯§ÖdHõu¯ÿ™.G$qˆ`9vïÌMAœ:ø­ ÓeJ«S¬]IÈ¢*!Y óÈH0'@‘°ˆšK •HÒ27ÝFдî;.CæGjÚ¶á6,Ý£»bÈþ®Ÿ¡8Ám™íÐ?ÉW¸Èrd ­ÈkùþÓ5i¢DC—ƒˆ8 %iþ2Á—d"›¤•Å¡r´ÛDŒ^ §>ƒ©õ1bªúˆøñ‡ ‡‘žùol2àÍ"A+VßãØ'$ïB,ÉbåWäØúf¾ ,‡ùïÃØ VÃX"ü¨Y^RBÝ›¨§tFãC¿ÕÄPKu'ä­PK7Aorg/hsqldb/types/Type.class¥: xSÇѳ«ã=‰gü|6§9 p…Hð!lmm æ¶°²d$™@Ò&¤¡9›¦mÒ¦6¡i =ìÖÁÁºMÚ¦mz§m’^é}¤Gzß Iøgöí{z²dáö÷Ç›ÙÙ™ÝÙ]ñÕ7>õ$,ãzá;lØEìóž ð)#*û´—}†=éeO±ÏøÏ{Ø ö4•¾@à‹¾Dà_&•_QØWö5v·\¼xÑAÀ‹*¿®²oþ&Ô¶‚=ëaßbß&ò;TzŽJÏxºþ®U~Èïøã(j¤~¨°½PÁ~¤°SËO¼PÉ~J£þ™zÙÏ ü‚~©°_Qõ¯ ¼Dà7~Kàw~Oàe ðG"ðg!ðW#ðwÿ ðOÿ"ðoÿ!ð W \ ð× ¼Aà"NÀAÀIÀEÀM@! ððâTøaJü[©pÍ ;Ù0žG`"|4×M¦£^¸—xá/ôÂ-¼È ñb//á“Ð"|2iâ…^J¥2S½ð,ŸF¥é^>ƒÏTø,ê¶œjf›ju¢æHŠ,…ÏuU´67òyÄ7_á ¨órÉæ3¯PøB—P\I ŠÀ"…/öÂ]|ž—_Æ—xùR~¹Â—Ñ,–Só sD­4)‡Yp™¯Y(Rø*šõ$°Ú¬ådƒ+©ê*³J˜x µÖ¸šÀ5Ö¨&PC Váud7ŸÊ7®Wyƒ /«Ü¯ò*ߤòF•7©Ì¡òf•T¾Yå[TÞ¢òV•·©|«Ê·©|»Ê¯Uy»Êw¨|§ ¯¨|—Êw«ü:•ïQùõ*ª|¯Â;hI|:Rø>…w1Èo;Òê¬õôãÁd,Î@óG£¡xm$˜H„ ¼¡žÞä‘êxe™•)Õ ©®ñc©,SsM8)çK6[»¿¹ÙGÕìiª¾vO£¯¹¾­×ÚhlÆ&Ó³)ŽãG¤î¼³0R¡¶Æ™' c*-I£G™ªf,SÕ¤Lå ´5øÐâÓ2¹Éîôõ« }ÕÍ fdQ‹EBÁ¨½yk“¯Å_›uæÍ}={Ó•×ùjýMÕrí%•šÐ${m¿Þßܶ§uK‹´q]`kM#®±ÒæoÆU@~ª[‘¹Q¢ ,ùê}-ÖºÔ‹&aªºê6Ÿ™9к`2Ôî Ù½¾Í߄̓Íâžíþ¶£´#Ðì“‹Dtk[uÓf´mÁ^šÞÜس¡¥º¶Í@K˜ãnÙ†ón÷Qpd¥?Š¡v(1ý?Mª)ÐLΨ§UÖU·ÖÞØj†^JÖß¼•,“^Ûê« 4×aàg©š@YÆö´Ì!M=$j3†Q–­ÉMÖFsPS3&eÍÞjÊNÏ2y{ûÌÌÙÐt7ãvâoó•iúÑ,32F?ŠafæGq”ggNÛâØx.»Ôލ{9s³¦-ÒhVá]Õ--Èc;{²lIâØ4w ªªŽ„ƒâXM;ƒ"á½Û‚‘¾PC0ÑÝìE 4{ˆ]ßß¹·£6=Š‹½=1jS“6…ޤäÝkÃÑpòjÜe*üþþ…Û8cXé -  ý´$ƒPª-¸7"Û©c…‡q iÀ.ˆb° b¡½S³¡) v…âsMûžˆjƒÉ`$ÖeˆæaEkGw¨'hÐ*Ò¢tÒOO×wu'KêãAÜ$ÄAƒ¬-¡}¡x(ÚA/Oç§©âØÜIso %¥ %#±h(šD¥‰0Ími…]¸5” ldMZf`ïþPGr YÍMcß‚[}1ö¼?x(¸$Œv-iMÆÃÑ.Ú¾¨³n¬;o"ìé–ÅÇÓÙ× wঌûfú¸mÙ ^mÐ?:ÉÞHðHkøFdÎGëjjÛ¬ÜI—5"33Œ¨Ù«Ð-Ó†'*פ˜Zeª%ÉÍ©L¬Ä˜_}—#Ü‘ê1Oº1QÜ~‘ÞЉØëˆ§.´¦±ñ?0²êÅs±Øv…ãìE,ž·ÝÆqíF÷Fc,nZyÑÐ ö—žuYûÃ3æŽz(¢'ãì§=Ù¶AÍ¬Èæ\öLxbJÎ)Ë*"S£_ùƒM€6#K¢ðlÀM¼®&•µ8Q¦¥Â?vb+ËØ˜#6êÇ Ôÿ:~=21iŽZ/yJÑÊ$φX\dyæ©u „M!nõ}½½˜=„:é´†¤¹ãB+=Á$&±è Ë+Æz±«žäÕµywÀn›Æ³³ü~¨Á‹~?Öà'Tú)ü {%A…ï×øQxÆ–²Ë5¶œ­ÒØj<Êc»’]¥±5l­ÆÖ¸š÷jl=«ÖøAN6È:sí -(ͱ¤5mßaÚjqÍ4`Õ @c[Ha‚U+<©ñ>~Hc;ØNß@¥ »^c7³VæG4~#ŽŸÅ˜Ocw³ˆÆf—3˜7.×G{pÌðËÆvr}˜"¶›4ø üJcÛÙµÛʶ‘i>Ž‘“šUjðsø…Ææ³¼„2ð[ ð;ø½Æ\ð†ÆœÜ8xÀEà5 þÓà_þ ÿÑàð' þŒ€)LÕ˜‡€—À‰,_c“è L&0…@)Be¦("0@1x^Õø›ø›LíÈ5}áÞÍ4~3¿…ÀQßJkt˜¿Eã·ñc+¿]ãw¸“ߥð»5~›Æîa*ÙBßËß®± ,±*¶ˆÈû4ø|_áïÐø;™¯ ¹ŸsiÞ¥Á/É’¿ÜNJÇ|‹%Öû5x™¸¦Œõ®ªÁ_àO ¦æxÕ௴'ðOø[¶.Í7M…? ñwó÷(üA¿—Ϧ8•‰ÑOhèê¸ø ÞÀËsÎ@bHcy¸Êü}dÕZ³éf˜I`r³ Ì!0—À<–ŸnÜ,ïÔÃûq;£—êêÚ6_‹Ææàd½«ÍVÑi<[:IíÉQ5^èÉÒzU¬P·ùúélñ“kCc I·õ’j½Þ*Öˬb=»Í÷gí-Úi<Í;gg‡xMwuˆ¾¨ ÏæÆ@s}j64cüy²ÁÔçÔlôբܴ\3dŸ“ô 3ê„ÆØã "m»› ½Ò(ü æŒã5OW(Å—øb²ï‹&ÑU$y9™™‘­ªE²›[žcå—ü• “³Áíuœ¯G“³'&ÛpÝ;"âV‘þc%T3­W¦-˜ Q÷­IŒ‡žP4iØ"Íȶ«7.gÉæ¾H$ш—d|'ž„©².”èE;Å5Ñ2l5}TÊB£·ÛEOØVÐ8Ê¦Ž•<ˆ§9Ýþ´a¬¯ðoÌ•©ŒñòaÿËìíÅ¡3Xœ-ÇȨ’»õzWÙ˜«YMZ×î%Ù½&‡mÄ»’ír9»ÂŸ5éJûÑ…„ì÷ÆrÊ"“ö•WȘ”D¦ÝYçTø³u;ê'”Ì6ý>KzÓkæŽ1ŸQ¿z8ºèkR–d]$°%äaY|<ó(!§•O²&å"Ñ«o…@™ùŠõ‹™ñg#³¾ÄÙ`›–iyû-žRü´ŠYÙ¦ÿ箯ÔXð‹B>^XÒMK .68zûÆ4Ýz§öóV6ö†ä,‡"øpxž‡:(¥œ (øE‰1ø'‚f”#.¥tN`L<þµÄ/Iü‰+1fy¿,é?HŒœÀ–ø/cŠ!ðß%þ‡Äÿ”ø_c(0fic–(0æ_40%3‰¹Ä‰»$vKŒy¥À‰½OX“8ObL7Ö%.¸Pâ"‰‹%.‘x’Ä“%ž"q©ÄeO•xšÄÓ%ž!ñL‰gI\.ñl‰çHQïàhÑ+,Ñ¥RtjvÑ ƒ–!½z¼OÈÅ[àøDó2Dñî8>щ¢ëÆ+šŸ!z5»FŠ^†¢Zñl¢Uà?–.Ëèz;¾n G‹Ö°Z):QŠrÏ€pÆê˜O¶-Ã6ޏݬð³P4Øh)2 ¨P,»5(lƒ“±zt9@Ü ±‡Ix#Û$ô7Z.Y€ZH ‡éê—Ý7Ù<Ö)š'a³³JxÔÂɧA%úΔ¿º€ëu¨‰5gÕìšq2l¶ì–b†)ƒ’m‹dka­– 6î0Ùf©È—mŽÂÒAÙˆñÑ‚ÌlÛúm¬ÝRºP¶ë©âðÊL†iik©áxw°¢jÛ%Å£h8Ú6-Z| \ŽþEÏ@Q©óq˜îX~çipòþÅiuëœý•U‹ÃŒU.j˜I žWò4¸J\)k€G)XÏ€¾×` «f8†Ýì:Á°‡]/ÇPŒcp"V ¥³L둃8÷ZœU’s²•oAÉçaöS69kºh3Ö]¥,HÙÖí« ;Ñïc]wKfû…쑲3¤Û{ª*…ùxÚÖ¨`±e Þ+$gÀåì¯Bw;qÙ8ùIÃÚŽ”œîÇzò֨孙þ³b0Ó…zsøåÁmñm‰mÉm}9Úåh»!GÛámGr´Ý˜£í¦moÊÑöæm7çh»%GÛÑm·Zm+å¾<ÝØÇic7xæèZ¦_¹Á1!_¸Õ[Æ¥"/—ŠÛrŒðX޶·æ8UnÏáíwäh»3Gwåh»Û ç52DçQpÒypó&Dú²“›ê\<\çü~Gáü”9œÀgÑÖv{›Ø'îeom÷±wØ:åi¾“½K¶•˜{HêÄ4Xî¿4ËìÝ6g6–÷\šåAö^‹#ËqvâRZº4ËûØûGoºÒ À¶Œ5Kkm”Ž~´ù‚´móö;)¹o'ó#> ¶`ÜW?EÇáº*LBäÊ‘IÙ)c—”“2…NÀƒyÆI(1(7ÅÂ)3 là·Rœ·C+¶|s6 ŒtÄ!RëuJE\×ÖõÃÆŒ=ììQË`¿g*Ú1ƒZ8(Y>È>$Y¦Ê '*ÛËÎCUÎÁ"“ñÃì”d\…ÑIö˜TvðT¼LÀ%ÇyX:؈'))Ä åå©l¬Ua§QÇGL|Ž#쥲‹µù%‚Š‹/âµÅäz‰ ÿµÒ*"¾A,°›D@ëJ·€ŽNÊ0XèH3°*±†x»ð`÷ÑäßXG| ЕØ cØ=4Ä{€²M`Äk߆xâ;cvÃD¼ ñCˆw#þ b<ÎÙ#ˆQg Љ˜2¡bšá>ÄCˆq¬ìânÄÏ #~1ûìEò1ÄŸDA<‚¸1ùvñÓˆÑ6ìkˆ{?‹ø âï¡9pŽì§g`ÙàXŽß üVâ· ¿+ð[ß•ø]…ßüÖâ·¿«ñ»¿õøUãWƒ_-~uøùðÛ€_=~ øùñÛˆß&üñk¯¿~›ñÛ‚_ ~­øµá·¿mømd©¼© \`Žqý¡Ã|”}L:ݽrSC†:Ì+dtÄ·"¦ûþ^įKL÷ö]ˆ/"Þ†þñœa|åycq”·ë¥ýºÖ¯Wôëkûõü~}]¿>£__Ö_–ŠÃ<ð\€6.ÿph ÖÐŽÉ¡í“Cë0ü|Žü„|NàR¢ák°Éð5¾F~C¾FC$_ƒöåùþå…~ýB¿þF¿þz¿þ ÒÏÙ‡¤zЖ4 2ÖRô41"ö{#çfOËèzÁ];dtÕÊ誗ÑuLF×1]Í2ºZdt]'£ë¨Œ®£2ºêet”ÑuRF×{dtm“ÑuBFW½Œª2ªNȨ:%£ê”ŒªS2ªNɨ:%£ª^FÕ€ŒªU2ªdT ȨQ5 £j@FÕ€ŒªU2ªdT Ȩ:KQUV¾è<\›HåÅÐŽÁé%ßíç`Waé0ì.†ë†aÏy¸þ) µrîúJ1kÊÊK\ç¡C]Yùyè04XFÕûæ.3öƒÍXî(¸Àên r‡Gq¸\n…ÖýÖ/=qµ<ÅgU} ¼”aœÀcf°‰Jƒ¨¬Â$£;npN`^†ZØ'¤–è¤eÚWΆýk§Î? ygà€IÛ35ö”‘†OZ'Äd™qM8‘²aè¡ëºð:dÙaÁDg8‡i‡°¹Ïà¦ip¯Ã*:ÎËë¦U>ù(fMӖᜪ|„¤qvúâK6^p¼†W•I¯¢«ìqvÖPåú´¸‚kÐñ(‚èyˆ Á²èmwzÏÁÁ!ˆ‹r1$Õ'©C‚ZA”®y±Ø Šá° WŽÀíÅpÓ9xó\!Ú: Æ› Âd\5·´ë±·£CP+ˆ|ƒ¨3ˆb¸U·À±v}-¶½un71.$ï0ÉÂ\/ÈuAÜif[õÜe ìî!¨9÷ Áöóð¶!¸fîmw¡k:ÎÁÛ‡`‘n‹¼Ú$õY‚¾OÒï0šßE¤®z j­ ^-†û z Ñj1¼Û ¯$ƒàAƒ\-¸K‹á¸A_5µë»õH¾o|‚Ü¥ï2È ’¼Î ë%ónÝ-èIï‘´ßl7Øß¯‡ŠáaLONÁF}ŸUnÔ»¬r“Þm•·èa«Ü¦ïDzîÄ6ƒðâú‹k“±ÊÍzUèÑ”ôf=f5´è½©†Vý`ŠØJƒ}Ôàú V–?Lƒ•åS4XY>Mƒ•åÐø•Š>jÆ`?Fƒ•\§A™ ý”ìᇖZ4ËG` ]Ÿw>1aŒþÂO:‡ap;•Ó5³xFï4‹C©ÚÇõfñ¬¾Ë,ë»Íâ9ÝkÏ믚Å'T³ô)Å,è¥fñÓºUûÝmŸÔ-©§\fé³VóçtÝ,~^_kŸÖ×™Å/èfñ‹ú ³ø%}¢Y|¦À¹ÊÂë…=àîWøei…_QÌÒWÝfékÜ,}ÝœöÂo诙ÅoZZŸVþÖDp‡,pÌÇŒm¾½]ë0u³ˆ¥vb…¨À Í"®ÄTÍ"®Â|Í"Öà9e«ñð²ˆÅxšYD9i±O-‹Xd'ªìÄrÌ!-b!&“18‹˜é¥E¬Å<Ó".³ 0Sµˆ¹˜ŠZÄÌI‰0~F`ð] ûÇl¢^ÀCbïf+¡ôÿPKy‰êcšš=PK7Aorg/hsqldb/types/Types.class}˜ x×€ßX’w-ÖX>À6!Û$ÈEÀ&Ñe{A–Œ$ÛC”µ-llIN!=’ÞMï»%=ÒôJÛЖ@khÎÞiÒ‹Òû¾ï6)Ðyûf¥§ÅôûlÍûçÍ›7óŽÙ•;wßCŒ±õ°ÏÍ6C­ unX + ¸¦±Áb74Á’ Ö ÍŽÛÐÚÍêa©;–ñŽåüãV¸áRhäê•*\æ†UÐÂ?ZhS`5}¹Wð±kThçr­ ëTX¯Â•*\¥ÂÕ*\£Âµ*lPá:6ª°I…:UجÂõ*Ü ‚WŸ ~*UèR ÛÍÖA-wßSÁ6ð¨×^Á®ƒ† ¶Ø¢ÀVBn´èåfa" ô󒣩I#íO¹\ؘL« í1n6ÚÓÆÔx{,ŸMMoVéÏLåòÆT~ÀHÏ QeÀÈ'¥A•ñÔ¤Ì5œqÀä´läKgFdö—²ÛJø{¼Q` ;p‘Ø<® ÷÷£ºŸ«ÊHúõ^oˆ«¤ÒÃñ`w0ÊUN`WÅÐ$„z®s«àº®PÄk*ÊiÆhPøQ€¹Mב~_(È5*yðFyX\¥‘ʉ„‚Þ0Wy€-àªþX0Šquéá` ê3]TSÌI"ƒk- vq¬£)}z7EÙHAùBçfkYˆ[( o4êr˜ÇV¤ÚÛŠë± éäÚ‚Û°7jZuàjS&Ee'ùxãf¬ÃÄq½×ä4ˆs,îííãÊ]Àê-ebP÷ˆÖŽHØs#°¦’1sØ$€U[ð†CA±¸üà”tôFÂñÞ³jIO@d?nwÕé7]M«-u¥‡ûEš){W,脼k°ED–ˆGŠìÖ`„Xó¦í¨¿8ýäE,ŠQL[|AR¥N23)z™¶dŽ(5ÚGg—W~Í|x„Cz¯ÎÞBqX}&²ùÀªù9ÒÃÝ\]EO‘ïÚV®ë¢‘ý8 ÂV"ñ{ãs™jh?ù1—õKIï·é[iŸÍc/w\ ¬N>þrß:¿XÌc\ÉŠá­ƒ^A:k©¸ÎM)lï5ñvºwa³œ?þR Š‚eŽ´ ö?Oº0é(±ÁP$Ü-™=gù·Ç)I2¡‹ŠFÿ%#¬xÝAº¤Ýýz€÷=[¬QºkªöÐ\±~_" Çâzا›ÅU±x´ß﨤Pzw8 ú½1sAÆ€¹¬ £<¬œ :É$+²sÀüx`óE`NªZÊ“¸xT!Q+ÒwR SžÂ ¬Ã‚j¾hN÷QÈÜöqœMÔcŒÈ¬ÜhJ…ßâð&"¾-Aa}7¼dñÐĶÞçqë¬àäáþN©ÐçˆÄ{ÌGˆs{ù“ÅZyš¯<=P0,±Œ¼ã$šò£„»T({è“¢E;ƒ]%;zû Ã…_Gå4BX(ÕâÁÑxED ZÉS<Œm!qD•gpÛÍ{lî{°Ë‹ib©+¨Š[ŒÑîæ7<¬ã-åOýøédxfr$™Í[ÊdÇÛ'rûÒc#íéÔH»Nÿ#7ÑkLãkA}*NŽé>#‹Oð|2k>Í“8¸Á>˜Š%ó8hY¯w»ù˜OD¢Ö£•ŸÓ¾^혾Ã+ïHM¥ò›1¶–Ö~t2cøl¨Oæ 3aÞW‰Y3iìO`ÙD&›¸ÙŒ&›Kå¦ÓÆD.u ®JJƒ=°Wƒ4`q_,½&Gg²©üà~ž©™uÙ°®±—V¨æÿZxŽ|-RSy ¦`Õf Üñ´MŽ'³¸ñc™sm<ÅÎÀ…*ñ^ŠÛYÈ•¿ÊÌß?±¼•°ù>*ñ÷Q™ý&‹œÉ§,¯u¦bÒÈO¬ñ¥Æé/ðH&“NS%™ø,sä;_ê2®ÜD&›§ûFÙ3á9I#B¦¢lØW’|ddOr4_b8IaÉ^8÷•Ó= ¦a›)©’vW LhºÒw   ?XOé Å{•£ðÄ +<ýkD‰kó¢–:Lf³™l{b¼Ù™©<îáºý¯%­’*JæÖÉÜT’«X'/x¸[Ô l@JFãŒcV†ƒ‡ Çe,Æ oßÅ_wóp‚—÷H¸WF-½¸çûyxÀ‹e|È‹‡e<‚Gy8éÅcŠ]$'µî@yY©Æã9Cêó¸À’þŒ6–>®åó—¢GÔãj8©¦FÂ1#“H˜Ôʘ¡íRÇû-'*G4#_.TJnÞè-*ÖÙ̦ùcMžQÈü$ÓfRbB'#jMó†Ü¯Ï¡Æ"Í.¶bQ$BG&“®î´ÁW( ‘Vñ—•©k Y 99n13?-I/­{î¢4XY¨$“5ôðÍ5ehŽhŸ6¬e´Ô×ÃêB~21îÉÄ Žw¨úhL3¶Q-;756žNif¨¥!Z$ø—Ä#– [ÙXBg̹Wj v¢W« ^ÛyØŽ ÂØ¨à:\¯àl’ðº‚7ð¦‚>ô*èÇ^&LJxKÁÛxGÁ»xOÁVlSð>ö(ø€…?ÄG‹S°|ŒOxøTÁ!|&°¬ØÐÝÃÃXO¤¯½µ¿]Á)|ÎÃT3ýûo¥/qXÀÕ“𕂯qXÁ7ØC!ŠôD£¦Ä·Lð´õtµvvÓ~[ûM­{£ý¾Sp'Cr¤§;ÖßGh¿‚)L ”G:Ú#äËiÖv†9«ç”î^]Ëp u¥ã‰á›èÏÙnõ- ß ¬¹Œœ¢’-Y7d›66nœhÍdÔÔÊŠjnï5”ÐT‰{4›¸6¿-[¶u6Íݨ™›ŽX{>íØ„šÔ‹z‹­†+»ÊH·ÆL膷ØZ‚Y¬Òvù¨Ù:Åê±Þº–´Udõ –˜‡ºg+Ë](.­H:™$ýf…ÍËK;³¡dQìå=OVµ©ããZ*.°®d-Ödm} ²ºj¶ÓôRø9ÏâÔà mŒÚÀÜÄɽ)VÇ >È/”ù®)£ªÎî«Ör™ÙPìe>oiÉîJúôÂs+XÁ¨6tÔl1^#ídJÝüùŽÕô·ÊzúÓÇ?7úòsŸ1gj5àjCæLÅœ©#Ѹ‚ºÕ4î¢Õ:¸PFscð,Dð \3pËfP Í <Ø0O°yÒiSƒ 3ZmÉjšÍåÁix¾¶á݈Øp ©uÓ| Áî ;‚<5”>ïðÑ/ŸÃ[¡,;êÛÐnËߎrS~—{Gƒ©â#l4Z²¨˜†Ê¢ru¦^Ñà:‡E³zOÁwÒ%Nýû³£Yà&e¸/Á%Zþ$Í7£Ã>©“BÀ'5çNZ3÷$ÙÚš25ÿ"¦ŠÕ^i©íÄ-%âãž²ýÛŽ=%à2'|Qt•€«énôØp Ùìâëçkªr¢w+zópaâbwñ³cãm¶|À¼k÷özÛñ:žëÉqÿ$¼A7a'ùû{Q%Qk¹[8è‰+—;þì›…—ذ—áiT;ŒÜf3–ÛŒ ›1‡D¯ŸMê¶³9|‹÷ŸÅ’hîJW:Wº´»ù"|¡æ,– ˜—ù[(w™•pÿ YÂAÑÀVS:º¯µCf*ü åbÊ9$Ä;Y,ÈSä†ðÑç!Üa‹o¦-β•9“–X&…D+LKþÈ…ÙgÕŸô_à·ÕÒ"ZZĦ󨥳ë¢m¿ò’¡šú,üY¬¬¹Âù`ÓʳXE! l,¥,V3h}^9‰_mÚšbÚUL;…óù]ý¿ªºˆF›sM§*‹µÌÉ…¨Ëæ xNi6åvk‚üM´Ù{ñFƒfl§h½.w?5(»ÄÿÁ©aðº3ÁéÕÂËtßµÿPKK5”o‰_PK9Aorg/hsqldb/util/PKPK®Aorg/hsqldb/util/Bold.gifmÓ[HQðÏn…X TP1öP/.Aj­ÕKÎ.”S’K”‚D1(Á±ÛöÐRa`4ÆÉ4F5Pâ(‘Z¹¸‘N%Û(á†]YìN°_ºoµûÁᜇÿËïüË=[‹Kjó‡˜N0u‚©+˜zuMÅéºõ"Á„ÍQ“¶Æ^•í2 ‰œ¬t?„Š ŒÛŒ˜lÕØ¬RÈôIÜÇË ½B‚’Ú6M“šFU¥,S’’€X€@ÁÔLœf„Z+ÕfÊ‚’ØåÀcÁ­£H@RO;As”šMµ—r;%ƒ0„,tø¼ \´I“ÔH•”I‰I$8,º€P db1'ËÝ á‚’‰E7¬"èD>”4ÿe™X„ÇÛB‘I _ÉÄ"Bü:¼.%E$“pXtB@™šI˜Õh«ì•Ùžbý_˜Í¸ÉˆÆV•Í2…DÒ ³i›45j*U™²D)…8íÍVjÍTe¥4´GiÚÔz©¶S6R²Y`Zai,LNNŽÅb±h4ÚÓÓÓÖÖfFKKK(jll õõõ~¿¿ªªÊëõ–••¹\®Â‚‚‚ÜÜ\þI„Ã7‚Á 3eÅïYYSk§7az'3 Î]*ßo9ŠOÏ÷ôªÝxl<ºøLvx哦ş_ÏTî-ë>ñe$kóÙíÕÏÎu®]ÌîZÕ}xÕ» ?+ª›xc^*^x«ô2$…ïeugÓxÍŒ_%•ï;¯—g½¯|±îÓã†õñgƒ}•áŠ0Ƥ3«Ûj:N• ïxÚ÷ãj÷µ¢CDvÖ¼=y0¾{Ûê{ËK®¿Ý1¸æÛÈÀ‘œò{K‡Œ®@"öyö{MððùyÙuw†\û{8ñ½nþîp鑼MçnFÄŽoŒ\é_²ïÕÝñî†þ+G£sNg/ÈÁ†¿PKίÈPK8Aorg/hsqldb/util/CSVWriter.classuSßsUþn²É&› ”´ÅR…Vêvˆ?ÒV!P©RZ)6FüÁ6¹M–ݸ¹¡òÎßá/>ø¢3%qèLŸqü‹Ï݆þLrÎ=ç|9÷»ç|û÷϶p×Ài\Là=—ð~Ãø@™•ùH™bS:¦ $1£ãc)|bPþ²:]I ¤üÕ®©ä¬ŽO ôã¢ë˜Sæ3~®Ì ó:n2èžXwO0¤oܳÚy×öêù%8^½È_)†ÌvÕñó -ÙhIBûA9¬U›• ä»M6·Ýò×)ŠO9ž#gÆÌ³Ž+Ї/›XfÐJ~¨[’võþ¼Ý¸m¯¸"¤º c‘Á¸öcU4¤ã{M_0¤Bz×…]SO™wz·M†°«¶´bU×oÒQSUR5¿¼[3¤_j>\¶ÝÆÍͧhÈ£È3WsœlІØÒtÜâXBã 2#xã œå8‡³ôÄUšÂ¤ðª~º0 íÎÞ«æ·N=~…ø’ãmä8&VäXF™£ï @“9HûJkuUÅEޝPáøw8¾Á·ßá{†a?¨çך?¸µ•|K:n¾´´\î*¡o·×ÂÊ=Q• |/ù}ˆíÛú_!ævV¸ø¨)ÅZH]ÈÅÀoˆ@>b8y@5jeY³§PT,\=Ã`¯mR=î ¯.×B=rãÕ5;¸LOÒ̹‰Åv£!¼Ã³txùÛS$ù'¤ÿê¥f‘зéÓ4D”èQŠ=‰"ôçB£}ŽQü&E6bô`Úê€YéÈïˆ>…f±§ˆYtŠ+£çþB2 Òü&’•lÆMk©Ê…\œ¿Q†ódÓ`/1ލŽqoé0)7Òb°è—E®{ñùyne·Ô=Ôõ˜ê³aŸîâB’0»ÈŠù„µXÇb#JÉ]¬¤\”|9:Én=ÁTæ'bDÿKŸh£/›)ü‰±0:).÷)Š‘ŸÝD¥ƒùèÌH¶Á'(dGÚ8uIË Rû×ʃÚ/êEÃasÐ2i:¹¾QUz%.ÿäÚúuçê~hÿÂÐñ.{ öqEÿPKmXð¹vPKŽ®Aorg/hsqldb/util/Clear.png•S Pç>@ùùD>• 0ÚJR”eïv¹[Ü»=v÷À³=îÙÎÝ-îíñccÃC£u˜I°"à„Œ1퀭1T4(¶'µ€ÕZ ©HQPÃ$™D©ý¾*mÒÌt˜Ûýxßï}Þç}ÞgSS€^*«’ÅM¥ Hr$ƒô•+Ó^„ -àK`äòh@å‚K*s dÉW RîrµÌ dÁ+Èå‚sŒ£+8E¯"‹Å>E”<ÀîqŸW¢x%ŸìÔH±è±ËU D’Ý^-¨•R Éê[ò)Å-9ÅÑaGZ`—P&ÈnQQ'(“¥rÑ J©]â¸\R…èÙ’Ç)¢"¯Zä”'//Jf9$'¼éó*pʼn"H{±TŽR3òx$EtZ˜½ÎÁÆì†ç±.»èäïVÇ‹d™¥Å 8¡Ó™}†¸ü¿DÀô|NÉáC;UF`°(î@‚I¸íŠ ‹v—÷©Øê’ÔÊYÌŒeDµå=v·€)ÿÓAp†§WÕMˆŠ**œa Z’½C(yà4Q{PÄèĺÞj}×7¿+]X5hÚ(V‰ãWš2¤¿ê99–Öl¾<:ñ·¾¾‘Gc§†¬ÿ™%åù¶€Ì®¢ì'Ë?~uüë»ÌÀ½¯Ïn¿qœ¦ƒê#[óÃNoúüJýflISÓé·s×ü¾¨¿¿õȘ¼ßâ«“vÆ·µn}|æ«Ñ#Aõ —,\ËIÊñÓãó Ãê­´ø$Bpá×Ú‹œYXððýû©n÷šç4qoEÙ±t±øÂQÛº7Wb¡…§øë×¼~5$Pð÷Ãî(‘…Ad^YÑÄÇ)!]íîϱØI¬ûýsdáU˧`Õ†„÷àã•”|Øßº;¾;¯—ûæ¦÷ù×Þ¢[è?¥µ¼—å.|—î(ÔYrìØÃÈÒw^ßÒ9ð^fÅ[÷¿æþ£¦ùvúªoöÕÖЉóO`)5i9VëƒòúËoam‡øÚ¸.I“5vµ¿ñ¯væîО Å ‰×Þ©J[cFn?óÊíÍñ–Ö+}×±¤€ ~obôÆ-wû4v/Ž‹ýûɉeX¶N›ÓùÊÚ[ÞÜŸ½zñ ÃÒ2ži¾Ssëýî¥ÏÍËK"lEEKê>ý°³Ó”ò«—óÄ”mø9zCä¿áC¾½‘%ÄŸÙ¸Û˜»ªiYúFÔ¹ªˆ˜³cXÜë–¤{1Ƶñ‘½Ÿü ÃÞêNLŽ‘¢£Vî]Þ°k•å´éö Û°Éê¤-mCÕáƒ/õ¸.öìÉ|ía¬f®Ñïèí"9ûâQíö'|VÓLa`PœÜ+!ôƒá/£ööÆÄö5ç6FÈ#7¦Þºäú©æð¦9!‹–wÕŽžNÂjþ¹3áÓ¨ó›ÅU£{R'¯íÿìyMÀÇóòb:&nR“ƒq%Áu?ïµFUVf6÷®–l#™÷›»Éíî÷w<:Ü?àß^}ïVøƒŒùéÕsNtí«× ï•4mºÛþPKS … PK®Aorg/hsqldb/util/Close.png•S]hU^LÍÖ‡P ¶VñPQ›2&QÁªµÈìÌÍì­“™í½w²Yð¡››fpwf™ÍŠH£H^«õEAk‘‚BZúTP‘@ƒ"µE_ BíƒôA±øTQ¬çÞݘ¨µ ËÎÜ=çžï|ßwÎŽì+i/¤Ñá™v7†à±ÑÑGÁÇ^ÄŒ„2?è‚-ge3i·dœƒ“&vö€Ùl‚.Ë •™Lge8Œq•b2Œ²<¦:y”ÄPCèd¢²¤“6¤ŽLEq=]€é$meÌEù $©~'\¡´’0šŽu…a@=•Жi+ÊsB;Mf£ùL=LJDœf3™‹âÃÐHâ0RE™.jÉüé›òÊ ™^#ÔHB¼ÙÉrԒב¨‚¬O%³*µfOœäQC˜‹2×D0…±±aþƒ vl4ëQK¦7w'S¶lðb* ;ÈìD˜âò‰@O_˜4:j¦Úa†E#8ƒ“)´ê¹L£z3[7[IWn°&Ë“‘®Sù¸Þ’ŠPþŸ„Ö¯êID¹65t¡“4C 0%Õò šdbTª=AN­$—е w0D²¸‚0‰¿&”%ÓùœZ‚ÞZAÖ– µTX©mKÕ:ÅÝÅʲ jD™ràþ˜¨šŒž+ÌŸ 6±¡TÃ$˯ÔuÊʾkÆÁôlŒz‚ÑR | ì29VîÒÌ™^ Èd…ÎÁg@Ç+.Eußõ¹ö2àÄÀ>ÂÔíäûÔ¹pª-¥ž ŒA}ow Šþ SKÕ¨m툧eãØ|VS¸Ê=ªe‚q¦ìÖ®™ÊŽîYbã5l‰f …¶®<â¸Ô!žEÔ_U)'C8LÊÕÚí\5±m µ«EnÝ#å pm½ =m c`ÚTñïÝÇá´·NÚ>«Üs_ýMFŠÅâRÅsŠ÷ …-Û _ÛÕ÷Ž~|^žÛ_ýSÏ9vá†ú¼ÿÙÉ712Ð.ײBaËVõ½íâw¯üŽÁÍ9nßæ‹};¶ôß þÙï1tŒâæßýéèÊÀ«£w’û¯^xÊ®¾8øE{ÇÃ×._XÜ9¿íù•û®˜¯O®ùŠ\]¼øÄño<4¸ôÚÑù_úNoúÒZîK½|Wyÿ_÷=8úñÙ{_úaáçŸ /JóÓ:Þoà¼çä2úƒ8¥ãg5¼,óŸ3`àçuTu|P˜~A¶ýb¿„Ó:~ÙÀ‡ð+Âña g $ñ¢Ž³ÒDˆ¯èø¨LjÎixÕ@'~ÕÀ:|Lšó"ýפùui.È†ßæã¢á7uü–ŽßÖðšŽßÂE—¤ÿ]i~OŒ¼(£OˆMŸs~_Lj9h` /jø#áyQ–ÿXÇŸÈäSþTöü™Ž?×ñ:þRÇ_‰ÆOëøŒØð×2ùiþVÇg…õïdßßëøY~]Ççdþyÿ¨ãŸt|Afÿ,Í¿èøWÿ¦ãßuü‡@Þ/êxCÇ—DÌêø/ûßÒü-Éÿ8*P(Žâ˾b`\Çÿ‰Ý_•Ñei¾¬ãÿu,è¸bð¤W5,*„ ®Bb÷c¹ã¹B®xl`_¥ìÝ£=¾Ûq+Å™ŠS8`WJe.Æï;áTÆ'÷Œú8Ÿ_Z°)vÅÈöGŽîÚ=4úÀþ·*¨a…Ö¥¢[É+r…;Ì`Ú«™Ê9”´zóá-Ùr€ë;K6÷î«äÆÉMïÏlF £‹Þ¸P “Éè:ï cx󪊻“¥»¹c>…rbÛœ¢S¹ÌÓåÒ¸íÒÈÖij©,ËMLìrÊ ÉÍËÛ²2 ;¥û‚Mš¦”BK Qho²ùQ†“‚yÌ®Ón§(ú6\/îF¸éd¢<ôä¸=]qˆž¦B÷DÙ©ØM‚º7߸óKñJòNaâ‡ñ#rq6QÆ@ÚäåØÌQzÀT[„èf-`ëä'ì<5mìñ‡=þ}.J'¨Ñ)ºAª¯Éͤ°^ÕÇÄæm.ú»oí Æ_w;K 7ñ,kz¼AE‡L–f*MLº0'VÎT?ZŽ­½±6帮ßOà'€±Üã¦Ê0_¨~5@UõŒ#EaÔ Ì ï¨Û$u_“‘JáÊír·‹(™j«ðhC{÷îÙ›åQW°4Øý®=+ç*R-þuÇ5þÜ3ö]΄´LíVh;|m ª'.·÷4%.ƒo‚rÅ=È£Kážs= RI‡·,'Ø`*ØSŒÓëÊ­oW«c»xL$6Ç߬[±§vYª|ü‡¼w@…isªÙÊ&²÷là¬@{[wWývx¯‹Gåé0=M7)d–«þ7‚J$ ñI°}Ì-f*¶ä–›ÍËZ¯”ö¸t,½|{Ö%ë‹ïi«Ã }r#+B‡åu5¼<”¦–uW-ÿü‰9Á'ÌåÍô¡ËlßÛ+7¸,ð-â1GsSÜ«¦À×BôÏ—ò ²]ydm¹!päb€-EÉ}§Ó me{ªtÜj6hN"ÒÆKk—+Mœ«—áôµNð€ÛC¸È3ì/-ó¤òèx¡$w>ê=ÏØç 3.×"Ç,—¦©Žñr÷2ò„Ì=èb†œâ£9†›åÊr’bìõå wƒ¾âõ7cǹë„G{­ˆcï å)ÆåêSç¡ChwúÂ<´W>£FÔhx0’Œ¤/œÂóéddk6šŠ&"5DçÐÑû b©('Z z9®Ä½•5çaòg-\=s´Š$´^³ÜÚX©¢›„ ¹mMr㽩h í'#ªºødæ"¶õ]гX™HÔÐQE&Sêyl"å<’´uâ¦Öšb—¸™M kɪFú.âµóXwè<:õÃús¸%IQ‘u(½ˆçRÑö¤z+RÑp’&l¨"*tgc©MŽœB¬ºøÉÌ%´y‰ñU´Ê8#“Y=¥×pëÌ^lª.¾¿É¸$rºÅºÍ 몋³UlÊFš8Ó\ì Ž±ÄØ[C/MhIô½Š Äy¿ VÃÀ»$:ŽÐE_¦c ßWàO&‚[Ó¶½Œ`Æi~ulc;{½xîd·=±£†sX)Çç|—wG7r´Êg ß×ÙÇ|ÑžîëÜJ±'Ã4éKK&µ"Üu­~@} ø ôõ…ÏR›ÉŒôFݪˆö ˜÷û`JJab FÃ1^„²š¸2Åë:poÍêáÁx2îMO!™ÒSZ’É(K[OÆiÍš–ÕƒE˜5RÆ%Þnõ™dlSFb¸†·Í£•£9šC»0ŸŒ/Ö°»ª>Dòˆä,õ2G£^ör’‘9‰=¼œáÓ‘ÁHÊh§p-Û’–lÉ|÷Pè%˜‘Ám¯bCZr]@M’šÒÃ4Q z{d0*þõ—?³>Ñ«êêÛÛ¬o_“>£®¯mY}±o^^£¾ýž¾|2y‰ öFYbóD §’\¼KЉLL‰ðsXEùú¤· ò4É#pLŠg’s U¤²ƒž²‘ddžºñtI!¢WEÑí߬¢˜¯®ðÁ:È‹‡¤DIwJO¹,%^¨˜G<2g:i0f>ŒÏ#9Ò˜u½>.7âRb¨†o?Ø'Ý‘ƒõHζdË#ýÕÈé¬&Š¿Ã32¸úÓô%5(½ºKU½þƒ¡éC«Bã^?š÷ú÷…^÷øý;5‹®Eì‚á%ÞgƒÄ®”†âùð2Ö. ÄTßÉå5æ- è’œÉP²i¼ÚØÔ]™ìo¹ŒsQËD•êæ(¶ˆ ]'”ÿ4¿½˜L$_<Âü%ù‚Ið¨WeÓ^•ýÎÝAž!V¹ÑŒ\1´ôe$´ß m¬ïÃô°J’á ?JËÐB…— Ïq%Bާ>~öúöùéÎó”'$÷¤=w®ëKwú—º»ï,òì¼Lô:Kê1þO.e$¡+¢é§˜'­kTÍ52fPX6ÔÓwSªwèüt#ËûiTÇ|#ßÔ­–Äc‰Ç_Eá#ȹökPK' ªÑ LPK®Aorg/hsqldb/util/Colors.png•S}Pç§&3?´}!&s€ÂE«;{»{w w»Çîâ¨ÇÝ"‹w·ävBEÁªfRb 1É@"1k‚m F"‘M“&ˆØâG¥í`¥$hŒÕ>ï•6ifúÇí¾÷¼Ïó{~¿ßólòD©ÅeAe}¡Žæ{PÊÂ…‹á±Ä„¤BÙÄL;¢åÙ§û倎¬A5T ÒçCF™†‚²&KdoÄñ• {M*ù!]QÈð¢&#%€45ôÈF$_ ¸ƒe¨@ ú5*UôB¤·Ò1Š_õ*ŠÇ1LÈ”Q±ô+º.{QqP-Q¼pÐ Ý:íÙÆŒÊ Æeq²bÔáû€Û/cBúÿÜ Ðð Õ˜„¢¦‚†Qh5¨‡2”/ãå5*’^ˆÊxO€“_Õe4jì È ¢¸ø÷„4µ@/ÅK0¶VH+–=x© NÁÛÄë],M› F²±"y‹”M ‚³Sà³Xš¡‘9.DñÎ\µÚ$dãí4#ˆˆähˆr’Àš]xR„Êxãc;’ËELŽS`DñbN; xÐ@ 9‰eDb9Êî¢YÎjB€8^BvÖÁJ&ñ&܃}·ñä`ÊI3kg¥\£¥…•8ÜÎýHä$‰¥\vR@N—àäE ë£Y‘²“¬ƒ¡“€ôELÃIH´‘vûØ!bç¶ ¼Ëi2â´9‰¬Æ*Bÿof€Ê6æ>þL’#""v:9kÄcaaa¬à5 ÿ¦L†çÅÒ߆…MaÁÇçúõd6¸f†_˜W{âÊ¥+¯½ùŒâxuÿ³™Ï÷ô¦G’q‘‘o>óE`AË‹•ñ ¤_šŽùñ´iU±û ¢£Û߱Я;«NuÆ$Î_Y”à77Æõ´Ÿ«[sëɺ¦TÏÖë[Únnü£Ö}ëtÚýCÇ-¾]o»˜î‘)÷ïDÞ^U{*¯¾è'öTï¶ìêåwú}OGÛÆƒswF[²w\K<´Ù¾ûÄŽ³Äù_ä±gίÞðîÞS_Þ½û£V´&½¥èíòmþÇË}ƒ•qgŸ(_L”=¼äñÜôµi¹êÅíõ—wì®Ì¾µ‚Èx5-%꽡¨/Ùÿ™º¶nÛqôPjóÓÇ›§?{~WüJ=#Húôâ¬þ®‘ñD/‘ØDLIØ[ýÒõm¡5Ã5UGO?Òù:‘x¬c@Ž\r»<¯1ç79W”!âä™Ïëï{d}0íÈGn)vøµäEUåŸ n"š’G&÷¥6ì;|¨Í¶å©þ«k¯_™-Ö¤'Ÿâ/¦émÇ7lÞÙœ÷A-U=ùëOn¿±=jjÿìÎÞš¨Ó›§wæÌz$œÚÐ;³¨B¸~´ÑrpåÉ ÷‡+¾ ߲Ƴ.÷gÝá—Ê•®m%ܙĪ÷ˆ}«òÅ?á>sdé‹ÖðÍ¿³ý)~Õ¦W.™ºfTQeÕççe®m¯º^Iš:ðÕ¢¡ÅÛ}ôYóÔ=[Wzñ¹º9wg}á´,«˜!_&âQ2O­ô?Õ;2Ü—òØÒØ—"í–îIüûEq[+¨ ±bµ¾bf–þ¨Û‘¦Êýócon}á“ðwÛkŸv4ìi¼9¦Ús²êW){B]܇/ëõ¸ÚÔps“wÎ_}MÙîlni¥£ßNKÏzt÷B¢ãñsO¶þú…º¤ƒµ»Ë¦û<)íÝq3n¬ÎœûÖ¼ÔûkwÜ»1çë%±®[ümÌçyK‹‰»¶Ò0üU0Ýb^Wñ/PKCÃ*þg PK9A!org/hsqldb/util/CommonSwing.class…VûÅÿžeùÖ狱Ï$‚ d9• )´à‰åG”H±±ì@B)=Kkù’ÓrwŠÞ–w -´ð -„7I ŠBÛ_û7>Ìî)²Ž8ŸúcïÌÎwwfv^çÿþøÍ÷¶ã_6ã^†ƒá>¿Qq?Ão5<€ßih‡)–9†"C‰3Ì3”,†Ã Gl† ƒÃà2TŽ2x >CÀPc8¦b‘a©q×ð Òˆ{XÃ-xDãxL,kxOvâ)ü^,Û§ÅòŒ¸ö¬†çð¼X^Û÷GÁý‰á% /ãÏ*þ¢a^QñªÐþW†¿1ìfaÈ0ŒŠ³¯1Œ úº‚î ÷}³Ì½=Ü,qO‘;l3Ó¶é”Ó…À³œò°‚Žýf`ã Ú÷¨ žwkž¶UÛ$›˜ÙG‡vZŽÜIÛÄàÂ2n‰n¨ed‹®£àúÄŪC‘¹¤³rƒl­+fñHެΘs6)йç¹^>tSÁúµ´¹+ZåcKE^ ,בЕkC‡¨8¡à2ŸãžYáS®oÂÓá…¥´¿HêÓ{%:,ŽŸTÐEÇ BžÛ=®`0±ú‚Œ[©ºw‚áµ\¤|(`;‹¶Œ’ŽqLÐã Çý€W25Ïw=oèxoÑ#[ÍËÀ„!ìw½rzÁ?j—æÒµÀ²…ÉŠëHw(r{ÜšW¶MßO•­yoëxï K§t¼‡¿SÞäKh¡qŒ24¶Ä‹µ€Ä]^Íy€/C¹HDPó§kŽªŸæ¥Œåmâ] œ ç8EqÂãÜiÅã››TQ’¦ªB‡:å¹”Õ ½¼r~x˜¸viÜu‚Jµl`ÚV1”76!Òqm×+p›E2 •?4C¦]ŸKÓDCYÏjN&çÓ5m“ûtÜ…]*þ¡ã}| #‡I§1¡âCácŸàSŸéø\Г:¾ÀgÅrË:¾ÄW:v uç±¢ãkäuŒ`—ŽoÄ6ƒ] RE·’òkNJø’iM‰ÖIUD¥d7å\÷Èn§4ι­â[ÿÄwôÌfqÉÌéø^TMßå,|߯`Ó¨˜s¦Ïò¦#úz@ÇÀ˜h"£Â¯1áRß}¹Ÿ„šÏhÚµ*Üñeh{~^Í$âGk¦ígËŽëñŒé_ª1Qa¬J3¢6©ph$LsŸŠµH÷¶\z,8t@Îâä@t¤A3 :Ú c’2ú£¯ì!®—¨B4ž<å, d±7„•Yú׃`åÖ¤ÑVGì6|‹öƒ}ˆu¨çÁêè<“4´(ÖÕŠéQl]+ÖÅ.kÅz¢Xo+fD±¾Vìò(¶¾ÛÅ6¶bWD±+[±«¢X+¶)Š]½Š)g(š öѺ]›ú›?c3ßÈÀèDÑþöï°ù`̸¦S’ç0ÐW††bÛWpí=a^:Ŭm\2èŠH[G2¶‚-«ød¿ƒv1¢×5•æC¥1eÛ¶PiÿI¨É:®;Ût’Aù¶¨˜"înL7TÝO% Tݵ‚ëëØš£;7䇾ĽmŸÂ@R°Û请‰M› ¶ŽÁÓèNÆbÄ$‡êH®šÑÑöv¨(ЯF¦f0Û0U£W SSCç0$ê¯`Û ~q[I”º JK‘A¢›¤ˆ7“$¹‚íÉÿ`Ç hÉcG¿< –§ë·ž•±š ª¾¥áC:úŒîÞÚÉ…{šý0$׿ZÆ€ñëe ·-#eܾŒ›Œáeì4îXÆaÄñPK¯D?°6Ä PK8A(org/hsqldb/util/ConnectionDialog$1.classT]SRQ]GÑ×k’¢Ù‡¥¦†¨]µï0­P“5{¾À¸v¹·¸'í­ßäŒQÓCãSý§šöµ1uŒ`­ÅÚgœ}ùùûÛwÓxFnˆbÈÀ0F$n@ÌÀ(âca"ã$& ÜÅt’é£iFwÝctŸÑF%I$$fZuÙ †&Ó~µd•ƒ÷n1o}ÐŽk%}ÏSíøÞ¼c»~)AîÇsô¬Àpì|ûè¦@(é•@ÄѪ’Õ¶Vɲí•TQ /–Þ²·mËÞÑ–ÚVž¶RäY`Tl'{ámÆ~·aç]ES» ^ÁõÇ+e”.ûE‰§&f1g¢—MôbN♉çxAIëç»”ÏÊê*…˜Hb^bÁÄ"^ œÝAVi]XBÊÄ+,K¤Md°bb••5,›xÍhQ–Ñ££M,Ó<Ï›ÏДÌÉÕ¤k ޽šß"¿ÀµSæ”v­(N ÿ¼úlƒø[â†ÄMJßORˆþfñ„‹%SW½LüPK dÕÒPK8A(org/hsqldb/util/ConnectionDialog$2.classSmOA~¶-œ=Z ¾ Ô XŠzÅ·"ÚTŒ&·wk{äîVïÖª?Kƒ¥ÑÄà2Î^IšH“rÉmfžyÛyvæÏߟ¿¬ãQS¸`bM\œy­œÃ‚>Š&.£”%Û--f [2±Œ«ÊV \c˜T/^¬2”š2jÛø£ï¶ìOÊóí† Cá(O†=îËv¼7½ÐS[ Kåñî+o2 é †O /Eô^FpÊÍ=Þå6ÿ¬lÑ¡²ë‰Ë¶–“ÐÜvèø2öÂös¡:Ò5pÝ Øò8e¡Û@ÕÂl†™$Wr§<î(Þò…EÝ´p n[¸£#ïâž…û¨YØÄ[‚Ú*ëeq Ö3‚£†ÏãXÄ ù¤ªÏöý¢µGþ s#›jz±ÉPW‰8v"Á‘–.k–ÇE4dÈaÞ¾Pâ•p¨ðÐiW(EÒuMî8"¦Ç®R7;ÇxÀæVk+#Ñaöµ* ÓÆqÆc8Žô$÷ÄD »¢îûÄ·>¨¯‡ íð€Ì…æð vUD8eIs—&ìtù¨M: Bg‡õ_‹/ê‰'|—‚ GQ#J«(ÒÎMÓ$äÀòy=ˆ´Š)ú ˜!t–¤3¤kĬ¬þ« õ ú£ ‘màSG:ñÙè#]Ùû…Ì»Lô1ùV«}=œ8”¾#Û£d¤ìã$ëÁ¤Ká,Zéó¨èr”z*±àPK’jC2"PK8A&org/hsqldb/util/ConnectionDialog.class­W xTÕþOf&ïÍË $“Ä@Ô€„€Ñ$ `À…—™G20K˜yaq©¶¥ÖnÖîE»i—ÔÚª(™ ©[mmíb÷Å.Ú}ßmUJÏyïÍ2>¿Î—Üsï¹çœ{îÙîyOý÷¡G4QÂË1$Ã'5Ü…OÉp·†Oã32¸Gý¸O†# î×àÇ“U0¬AGÖSð †ÉxH†QŸ•‡U<¢âQ©x\X>§âó~|_”Ý'T<)ðK ¾¬aŽ} _QðU óð´Ÿ_ô×5|߬À3ø– ßVð !|WÁ÷4„ñ¡ù¡‚©ø±†<«â'ªàgšd¿?Wñœ‚ç5,dzrË_¨ø¥À_É‘¿–ÙoTüVàïTü^à„–Ùþ¨âO²þ³Š¿ü«àÿ¦âï*þ¡âŸ*þ%÷zXÁ :áÿÌdxQ†—dxYlt\fÿ•á…H`™ æ$¯ÈxBlò€ G5òQ¹†½¤ÈLå£É/KM¡ •t Q<+Ì•‚œ$Ãd6 Uñ­¨Z6Bò44…EÓT¦QBÓEÒT…f(Th&¡"Ñ’J&͈K% ÓÚwûŒÆÌÞxc½‚àKt “0ÕÙ7ö[Ýæk}ÌŒGy[I¬KÇö™i‚7±es»ÐoÉÈÒŸØdd2ûSé(¡<ÑšN§YUÒnôšqàðiÝÌ Ÿ±c‡C7’}]V:–ìc5cZO3y-­X¼ñb#Óo½qS´´ Õ…ZúS±ˆì•§Íˆ™´øôHÚ4,³øÖW‡Æøê0‹'°Ÿ·%eói­"æ€àXËò•±dÌZEX*è»>Ív.%x+38šìWh»N;hƒNWЕ:]EótºZ–;ÉÈ…‹]äòáB¨`7dÌÚÌ€‰í:Xí­0¬~oÄÍ:õ w„¢â3S§]ÄÑ/:Çdc·ØâSU'×Ðbÿ;êrå*YòÚcËLJžÌ*Q× »"y 3™q^õBqiM&Ì´á\lrA;4Ùó\z—~áÄ¿À ïDÒÜß–ÌXâM~»CÅ4{w³+˜¨&ÿÆ8‘Õa$>Q·²Ï´Š_âŽWùOôŠ-:p»¼U…I¥â{bÜ(T³nëÌ]Æ`ÜÊãò÷+¢\á\£‹ß>3Ù»†ÍPSL–w„ô9ÜÄ8õ*~@çšÅ~ |ûcQ)ƒ\& „ÚøgcCôQ~äVNh­ Û’/“ÇväøáF0.í™Â½˜•NqjÖ´—¢ûò5ÖróÑ—N &Y‘)cÞx¡%çzù‹•YtªDfâ„„Èñ”uêÿ¸’Ì<=4Ñ[:y€ dÙMSwÚh­2ÖA—× û@©ÖsZ©\Øš+câFÕŒ›ìq‹• ŽQ¦(÷D~#Ó‘J›­yjnë¶Û uÀr‘ì Ž,·õ“ZyÝžNS°Uº«htl©¨-Ù"åöm¦*ö³SÄú†¸ºšåœ\’æOЧ‘¥òMÜŸÓ£t_ÁçµFúSÜÆÉ·D¨ÅfŒ¦r)ã`ç9Fq­¼ßŒõõ[g{*â6%“#˜*•ˆ"Ö›éOí'Ìœ¸Ãäû÷»¹¹wЈgN ·Ò‰ÿü¢\j0-&ŠÊ›Ë³X2jظKnÕ¶˜sÚËwN°¸¸™ì“ïáÞ{5¼Oâý:$>ÀŸê¸Òða ÑQ†#>ª£ãµçÞQ Ÿà•ŸÔ1ŸÒÑ€O³ì˜†ã,åU£NhøŒ†ÏêXŠ{$Ƹ=©c1Nqï>Kp¿†q+IâsÌqZÃ:jXéu8Ëàçgâ¾ÀŸ/2ö%þœçÏ(Oe£”ø²ŽøŠ†‡4|•»_Óðu‰oèø&ÖðˆŽoáÛ¾S‚ïâ{ß×ñüPÃ$~,ñ‰ŸJüLâç¿xTâ—¿’xLâ×KüFâ·¿“ø½Ä$þ(ñ„ÄŸ$þ,ñ‰¿JüMâïÿø§Ä¿$þ-ñ‰'%þ+ñ”ÄÓÏH<+qA H!¤˜!E…RIQ,…&…ÔD‰@Iرí# +%0gÏžÎ}æ33íÁPŸ›ŒÚƒMzª£µ¹ÅŸ#÷FcV··*óM.mqì”kÚî.3–¦IeI+lÙnŸåº4ʼUQ'´•˜hE…O¸#þYrâV$š(Þµ£îÕÕ5» [œÉå åúöÌ­®Éoõâ˜cFz•r2ɶÂnÔ±'̘W]ã­J»ÑXh›™rÍeOiŸk†oí2; öR“²’òMeÙ8!ä–¶ƒa+Á¬D·ÄŒDv:W×TW[§“ ¥öÇ"žhÚÚ&Þö’”ë$­‹³ÏÏÏ^³‹²›[ºÀÒˆ³ÜKè)ËÝF~o&)mÉÉ›Ã1å|/ÁíÒpfçÑc`·xOz1†ŒÜ“Cyƒ‰¤µ7Œ˜.±‰™†0D©&Ê Q.*2¬*~;‡’Î0³RˆriÚíDÚ¥àZfœf ,Ȉ{öÑ^¦L¨4Äl2HÌUËŸÓÍ^„aCÌó 1_,0ÄB±ˆDFE[ÏÖl´ ±· &ln‰™©T·ãnuÒv$;/³-ZÞÞ“ƒÎ›š¬Íéh,bQ²Ï¿Ñ¦Óâ ÚÑÛ¬H ̬—Ò<`ˆ%b©!–±uúÐþ–S†O± ÅL¹VâÍx‹!.—o®#{ÒnÖQ ';1WÈZ®0Ä q%å!VŠRCT‹*CÔˆZCÔ±sW‰R©´LYát2êŽMåÕàõ–»#é$¬¤;r]ØóZ½ ”O±™ŽÿTw"$®š„{¶Ñ]•NYÉ ß šXmˆ5b-¥µš–QÚ‘Œ MZO­&Öb½Ø0)DzNÒÄFC4ˆMk»€[ìq'À*tÿV'9 (_(KÒd]`8ê9i7 j¢ÑM‰Ùyo ¥Ûúnè ´štHÌ”h³£¶h·ë»¬8Ñ TQZ½´ î‹ „[Éx΃Y˜´”SÔÕ“ð€\—Ôø|Á¥Ë'6×S ó0VzG åtqÒþ.þ ·Fé>lqâq~,«&ê6;·’¦÷ˆ®¬ž~ãNG¸v*¶FSnJU7ÓAËÑ‹„Ôšúô¤\‹^ÄRï°w[Ã^õ2«zrÁÊ$Ó°]5?÷¥ˆQ ˜ä Hæ1›“)@sž8z44*m½"xò„ì«RlíO›1ÚOUõôõl\)hÈ#Í3?Ÿ d®ÃIXL·™eGêó8{ºm~Ã?h]ô”šƒ\«»Ž'ŸbqNˆ STð¨Ñ½½`¹Ոš(©„S2¥xZnýž“¤¿|ÈLuQÁÜ–=Ó¶ºþFÃT+X™@äõ#Gmo,"7x…3…†.J/4+žÃ!ª´!CÊÈê÷P2Í÷•Õ{¦MË]HErŒô‡r5ñ«|© jwÃÞå¶øhìù?=¥vºNÕ?\ê$XŒÏ®q& *uþ¶/ZmåW“[áù‡¬ÀJ}U6ÒDdgS7çÀäþb6ôã½@1t¤àRo!ÿ8Qí Cà õg „äôË„ú’«{juþ}¢Æàß44óêÍ¢VP[T{â8 &¼/óÅJŽbÆ1Õ«ÆËñ R@Rq' QDØSã(è?‰Âí£(z¡S(…ö q‡ì§~eÉIè'PDò1Ì< ƒ:§`ì®=vŵÇD§èGM-:‰òÎqTôפ§±v •«Æ0û,æt¢ª~ sÇ0ï0Jk¹Ków¹ðh÷ªóÐhÚºóØ_7†EG°¯{KúDZ”ÌZVÃrš|5c¸ü$®8“O|eŽ8‡q™Ç8¿±0Ô\Px¦öyZb>¶  °Iµ­äÝÛiÄí]X¬ÚãX¡Ú‡•üºƒÑí%´"CÁš+w2|#ÃŽ] ïfø&†3$ý ßÌð†K|øy ?Ÿá[Ö}ø ¿a“á™><Àp8 >aØbx/Ã¥><˜…‡.óá(Ãû¾•árŽ1gØf¸Â‡†>|38‹*÷Ÿ@u4ïàáPK·r! 5PK9A+org/hsqldb/util/ConnectionDialogSwing.class­YxTU>'™ä½¼¼Nê ‚“F44!¡S€4CDx™y$3óÂÌ„fWìk/+öÅH&Áì¢î®¸ëö^Õewu{ïXØsî{3™úÉç·Ü{ιçÞ{Þ)ÿ½Þúø•c0Gs ¾ ÀáKܼ¡ÀqxSkáË|E¡±·Ȇ¯²Ö×ø:|ƒ›oró-n¾ÍÍw¸ù.7ß“áû<é2üP†Éðc~"ÃOeø™ oóJïpó®?W`2œàeÁI~)ïpÀ{,|_†_3ó7ïòœ ü~Ëc¿cö÷Üü§ ý?ró'þÌý_$ø« SàlsðïL½+Ã?˜ù§ ÿbÿ­Àà¿2œ”á >T` œà#–ÁÇÌœ’¨G$eÌP0Ó¤lÜd)˜72³9 xQ![0—)•›àÙ©l¾ö <§=ÈlŽo î2n„Éñó#‘5r\´iÛž~=ˆPÒÝmãÕHµ5 ¤"õPˆÈ`ÔØÇ[³F ö…´¯Î*Æö:ÍïÒ½•è~+B!ó{\^]#ÛT_«¹œùyeñêu†¯ÇXaì¦ \€îyÅšˆ0£ÑôÖô‘ÏÜ=¦1IJ´@ Ùbò,çiÌ.ï §Ön²°Àе³ÍÎd?}:Iyšè++w»ô~fÈëÙ‹=~Oh)B¹3Þ[«äÃT«’õÙ¦Ù™NfóZCšk{“Ö߯!£z”°À@Aâd]rº+§´W ¨¶¨®)¹ÍmµNg G•Çï$4é‹'{ ͽAw¥Š8禳<&÷:hØо ©ôò51aØj|:%þ4komW¨FßIËÖ,*+™&Q‰Sp=!ÝG®¡øö‘ÐôÃrI­ C渚¼ƒË©–ÊŒk™zÉ„¢l <ÀÐ@}Nˆת{É“‘5UìA—Šn¤¬ŸuÈn8 Âmp;BqŠB§¨ã:æù+]*<ÐþB.áV{±O…{á³*zp›ŠÛÑ«Âp» wò²­ËU¸‹©‰é‘ T¸î!8ø§e»è*ÜÏ›åX)Ô²]Eú%4TìÇdÃaéšÍjì*JØÐÏ©±Â2@Ô¬ôõ‡ö¬4c@Å †¨æê(B$¢¨¸wI¸[Å=ä1Ü $¼DÅKñ2/Ç+T¼’›«ðj¯a¯ïcêZn®ãæz¼š SÅðFoâæfüŒŠ·à­*ކ䜙éA¬žN#£·• æx=#á*Þ‰wY!3«1 0Þ­â=x¯ Ïrho[asAbýEÖ‹?T¸öS’#Å÷>Ü/áý*>€ªø>Ìžy„JVÅGñ1ÇõÓ?#ûxŒš†–»ŸPñIöÕSøˆŠOãz™}Ÿ¥üí§t êŽ`¿îòlÝãp÷8úµP_ä+b‰}}€£øœ OÂS*>Ï‹¼€/²ì%â!ëžöµ®oŒÚÁÎ{YÅ#¼ÿ†Uæxp¼ªø b|¥˜á! I Ož`H÷ó)>) æÇ®I°bMè×{|º?(Žª¢dXh gÓ¢MÄ2Ì1u^ª5‚R󔞙Çc&ˆçúõ] âÖãÒc0[è´ôl£¨.² E¸ÑĨ&ͯõò'åõÆØMŸò˜Mw¨ÎŠAötÜF†øRgòYÃòbóp[c<{ Hó ¿;ã4óúRhêÒ­0äqYš¥‰óiÓÂ2gCù˜itPô~>nèðÖÜ„uÎT£i¦”$n²š®Ÿäugý¢xCMíâx¡e'ÝtCf–Ò>ÍïsUâõ£ OLè3ÒœÈ 1qÖ'áoÍÙ!S¶XWú¶ÔWW‰¬à²I°ÓJEÞ.ßÒ³Ò‘òü³1—¶Þ`!>!ì ñ_Z”x›Ãž¬×·jÞPäàœp³nμŸäl ¦rhžyîÐÁ?Á:šÌQ1mqÚú9­Dg–#}¶etB QnyØ#±È•R|ÜF£¶Ç༱õÓÝ3½¬ÖfÞí)ìú!*+‰ÝÆ’.2Ñ¡•ÒR÷·zö&ZE<:+ ¦L‹‡¢±ü wò݆ˆX¯©l¢Û^s¾ù¢âˆ½©²vyÜ|–`)÷éžÞ>Z!—Öj4\š‰]YN3`¼ƒiL™3•¹¬£N‡'è¡Ã“|åw÷Gy;ƒ'äá|/èw‹'‰¬6òJ{Cü1á¥å&%WW‘X˜Þdz `šô`€8š‰ ÷±NYÜ5<ö ˜½“Ÿ¹Až«Rgx½Q.I%§LñD¡ñq“#‡M-ÐùÊ÷t,JÑ”u¾‘âЧ›E¤é=D¼Í/˜‰éŸ´goÜeë;4oÐÌ—Vc à²ÒÌÌ"Éãwë»[¶rʸ+ï®ãlè®OJ2“À(Û«û{9ÈRÚô{N¦Æâ)„qmFú·Õ"gʘžæ3Yr{‚ýFPaʼùœÏþ¯ ÝBäL’ŒÉqñJuk˜ê¦Ù!=ýWŒ è>c§¾Üëåõ9Ó=ã̈1 è„k!®ƒë!& p# Ü@²›é—n¦èï°ú;­þ.«§§ˆèéU#zº‹ž^#¢ÐêéÁG½Â/GÑçÀcð8íøq…ÔÓ»²*^<$þµ(‡o¤4‡'A&بϯŒ0dvVVU€í P|š~m4{#õtã·VœA²LêË**«lôð(dwU„AyrÌ=2øÞoN°m r©Ÿ4Jãä6Ño3ѵ6"j³˜Ê®,PF@ C^gåŒ}•h“åÕIò|ÑÛ³cY{V”`Õ“¬L?d·¥³dUE…#P$¨¨¤8IR’$)M’ŒO’”%I&$J¢U[’Š#SdÃD&(“ª™°4„³(6“»†aÊL¥¡©¤3u¦ZcŽ®¢éÃpÆÌ ጢ3Ã0“ R›e·1%>ßf-f·EÎ!†³j%Jç”g.KešP~ìq(³KL•Ês3熡bŸŒƒ§Þ#Y*«íRœýlëfε͆ª!`ãª#VV'èd™:³‰›Ñ™´^QКCƒs"Zs´Îî*¢µæ Á|œOZç°ÖüX­ê±ð§ø~Ów „ïÒÔ…Eçš¾[õÝB¡†óLº6v™’¸eÅ,³8å2©C°„B°´V¶Ë£°¬«@1ÿ ÃùaXn—‹VسÂPÇÔ-‡a%Ó«èwõ¬ CC-§ÌÚZå0àq¨ç¬ * „¡‘/˜&“™-˜f“™#˜“™/˜uaXoÏ9 3®| ά´]¡Æåe¦•™VbÂÐ6H`“™I©…¡½‚ꮃAá9jçAÖ)|r$x^‚’þ¾HXv¦|Œ'$xI‚ƒô·2W Ú! žZžѦBgWEå0\ØDÔ5r3Ŷ»j.ª:›ÿ'Å8ÂÇÖÎã!ã±™–àeÚP‚#6Ò‚°µx!_õ¹£pqWÅ0ln¬4¡ùßß,¥kH‰²c¶Pˆ´F s®!pS½èÜw¶º'5U†¾0x:«ŽÂ6$ˆ/«$Šn¶¯W„ÃÓ9xê}²Ÿ¿£»’ /†FúNŸex1Ø>‚ ŽJðÊI˜¼B‚QFíÏÁçMƒð 9(‹ú ÁŸ¿©ŠsÕ¸òˆë&vÂsa<y£°±«(8 ¡W+Ì:Üai˜µ´cºÌ‚Ù9 »F`÷l2aeÇqh²¨0ì ÃÞý°d¼]–ì4V†KšÙ=¬K)A/„cÍHTS\1Eé8ªbè3öÃfô®| ̉a¸Š\Wk³ÛŽÃ2Þ˜¡=’ÖLG²šéHR3Éi¦9¥¡®Š+’6QLSæU1HOq¼:6¬Â„k¸Ád·M¥Âh†þüýþû•û8÷ÜsÏ=÷œsÏ=_ô±ïßOY(þî¦Ï°vÉ:\¤”­Âbu ;ƒu,ŒuBÖ`k-¶ºÝPœé&NÖc°³°ÓŽÅÙ8öq,ÎÁâ\,Îs³óYG{±è3XÔM¦±7‹±u’õK6àfqvâ^ˆEB²Aœ“t“óXJ²!¬/Â"-Yë¬dÃ[o° nR…LoÄz»I%»D²K%û„dŸ”ì2É>%Ùå’]´¯”l3ÖW!+Ÿ–ì3’}Ö`Ÿs³«Ùç%»F²/HöEɾ„Ì]+Ùu»Þ`7¸I »ÄM–³%» ë/»`ü+’Ýìf[Ø-nöUv+Rý¶¾î¦v› Z·ã"ßÀb«Á¶Iv‡›t±K öM7éfw"|g} ÁwañmƒÝí&ç°vƒÝ#Ùw$»W²ïJö=ɶK¶C²8ç>ÉvI–“l·d{$Û+Ùý’í“ìɾ/Ù~ÉHö dIöÉ~(Ù${X²ƒ’="Ù£’ýX²Ç ö¸dO¸É'Ù%ÈÀ“¸æS’=-ÙO$û©dÏHö3É~.Ù³’='Ùó’½ Ù/${Q²—$û¥d¿2ØË’ýÚM®Çý¼â&7±ß`çU,~‹„‡ûù=ìX¿†Ì¿Žë½áfbobñgxËE¯bÁâmìþ‹¿añŽ äþ.Êôï(ÓàÜ"ñ÷Ô¿PÞw³³CX|€Å‡n6Ê 8áLr.¹lî܉µ!¹tswK^"¹)y©äS$/ss/—Ü kp"V`Ë/ùTɧ¹ùtüÉg t&³ÜôB> »ƒnPò# >Wò£Üä~4Ç@ÁÞÁÖ±Ÿç&/ ¡<Ã+y^%y5@x ‚/–<$y-l”×Á–y½äó%_ ùBäæ8,Ž—üÉpÍ%?Iò“Áy£ä‹$_ŒÐ%nz%_ŠÅÇ@~üÉ›$_†$›±X.y‹ä§â¤Ó$_!y+6WJ~z oãí’wH¾ —¯–ü ¬;%cÝ%ù¬×JÞõ™’÷`}–ägcýqÉÏÁú\ÉÏÃú|É#X÷JÞ‡uTòÖë$ïÇz™#K Ÿ‚µñ„䃸É$vRˆ0„\]„E‹ Žf >,ùz7½ŒopÓy|#¶6I~1ÊóÉ/—Ä7Jþ ¬? _&ù§°s9N¿‰_‰s6cq²ðiÉ?#ùgKøçøÕ%üóü,¾€Ý/bñ%,®•ü:ɯ‡&ëÄ»Aò%¿Iò/Kþ\úf,¶H޾€;·Jþ5ô#_—ü6Éo7ø7Ü´‹ÝˆkoÅb››ÞÄïÿ&¶î4èëØA¬NƒËàwIþm7=7zž²V~·ä÷HþlÞ ÆÀ¿+ù÷PÙ·cg‡Áw¢:¶ü>7eµÜeðœä»Ýtˆï1ø^ÜôýXìÃâÉ¿oðýnºQ“?€ÅƒØý­äIþƒÿXUþï’üG4 W8è¦W!¥ËPÝJyo6ªÔ#.þ(ÿ±ŠÇ°õ8O”ð'ùS’?X?‘ü§’?#ùÏ þsØ9kÇÑgQÏIþ¼ä/ !ù‹’¿„~)ù¯$±~-ù+’ÿFòWñd€ÉßIþ{ò$ÿ£ä¯!Îë8ô†ä’üMÉÿ,ù[’ÿEò·%ÿ«äCŒw$Wò¿#·ÿüŸ’¿'ù¿$Çþ-ù!É?À懒JA )¨ YÙ,‡ûB·pÀ¥!œØ1¤R¸¤pKQ"…)E©S Qf!Ê á¥„u´Qâm» ²>RŸˆ$ûëÃÙt<Ù¿ˆw¼=²±3ÖKf)¡­””6§’™l$™]I Ç8\ÐÓ)1»ºÎkZÛÔÚÖ´¬­ð΢ĵ¢¥mõy]-gv‘¦e«ÖtYGPHRâ×Ëe.JÔ# Ö—§’°¢#ÚËF(™Q_ÉFz#™`ùÊ„³‘llPñUQ@µ¡€c æ/Ó‘ ÙúöXrÇ2ù1ßÙ“íÛˆçÇÝÙÙæÔà`$ä¡®ØÆlS:¦˜éζlŒõ gc””P– g³jOš±H¶—íJÇmj[*Ý_?Øß28”Ý4f´u0Ò£®Þöá ì8Äœñu+†û%W4¶ny:¾>›tB{M'è” ‚J µ:’ÉlH¥£9Ü—Ž'ÆÓ ©4¬ç\OƳK)á•Uk)Í©(P7ú´ŽP2½rRÅAÜR8ý¾ Û#C]‘ÞD ÂC˜ŽÄ „ÐxÈÀEcÑåË0Ž1„• ¦VN¢HÓ•HmX“‰à§Ä“°—lW,“E5„ˆ7À߇‘h•‹’ÆÊ±ê¶,’^4‘øaÖ3-2­ ÆJŽGëpÓÜÆ6­NÇ2™ìsfѤØzÐâúÓc›Z°¡pK·3ê¨%ôº6 a³,¢d¹:–^—J"dÎJM %O B ˆ QÎH¡¬´n•mˆ'£© ˆ½,rRRÝ ¥ÀW¹ž³<)Ì25¬9‘RÌ–º°ó¢)qÐøº¸Ú…†µ ‘UC±$v}Ú˜¶YCøáî´á¡(¬š7“2BIJšp ÓŠTÏ£ÄT@Ï‚ZX¢‹$ûÐ"2‘õ±¦Lsf=x»ÊÉÎ x¸xᢠ, ŧé¶&ѽbœ(DW*ï ÔçÓÖ´Âe W'Œ¦cëàØÐyÀõïµ¹¸/¡ÌÈd“”“ú¼I_¡¿­7Åtú ^󌶖}±!Ú;¨¬K÷Òí"ï­ïlÆm€ñªã‰§êO: pq"\ÛX—Œeë2™D(N&†[hŸ$N6E£XDىʹ7*Alj$xvmmJæ÷†X:´ºÁx²/15ºƒðOK*8îšs0;ÏÁ1= WkAL•„ w)S´·/h (¸… ’ .¶pòÿ. äQ2Hl,‚¨RË>ûª´¦åO)¸8ßZ´a8CqŽ„ ¬€Ž-VÕÒÂ:Á ç^oí#ž ¦ûÔ¹Z´Bc™§P ·<^µa^ñYÏC¨ APÿª¼ìâid8;P$‹¢é ÂÂÕ–2v9¼ÿ3ÁuéÔ`Ð.âO;‡±‡M)µï‹$Á̦ ÜÊuˆTYeˆÅ¦X–b©)>&N1éŸè›¦hËLÑÌ–˜b9}ÝdˡŎG+26ÈM^n×Ö¸ ¥r”mÄ8Æ[pížTìN §û”v·˜âTqšI? šb…h5ÅJq:\!ã<¨ÈoÁ¥Qk¹Jp à)jñb êpÌ‚„áæš¢/'ñC‚}™õ ê¨ÕQ¡ÐV8“Í îìÔwTPG¾žÓô$´¡ †§ê*áÍö¼ <Ü^hM*]Ø’L€‹Yý²ã¬a;4÷ŸÇ°Abm<7†·´µ4ÃÛÃhmí·tbkÍšÕË›ºà±b,_£Ø*­mîlX°K?cJj—w®ZïÙ£­Ë[δGí^óŠ–æÓW¯jí@êµáæÎÖÕ]è»Ã-]èáÃ+Öt-_ÕÝ;«Å2˜ ›ÝÒ1‡W¾ôMúúGS´‰vP¢Ú¦ál g€žâ­T6°nÐ[¥{°h[g*‘è…¤S»<žÁ¨8ˆï¹Ô†Œ:ÁX6ßEë[0>n¤-Õßj¢È›…Ò.¯mUpc`T9^c•öˆxøË‡á¾µpšèfqß]éH2³õÚÑ•J%Mè±|Ìn1Ü”¦ÞÔp6™äÇ©t5ÔûS¬«Mq†èD‘„MÑ%Ö˜b­èy5ƒ´ ø™&k(„¾F_7D)Îg›âãâSœ‹Åyô¦8‹ˆèÆÙ½¦èÃ' —ªˆ‰S¬Ãé¿„àBô‹“ÍfsLâBS$Ä )’"eŠ!&!ø5ÅEpÉ‹´È˜"«îNû5èPÏ>“‡.@ q˜¬ž…@HyÁbØë™†µøX-Þþ¶Y-ÈÎ]8Cl0ÅF1GUt6&}ãjæ7é¯1P0Ç=Ê›Lq±¸ˆ±þqÆhÒ€\èßè;¦¸eðOúž)>¡<Øx?á+¸40÷åñH"…Þ¥ 쓦¸ ýá§P2S'FQëÖá™]޼B\ ϧ.¼xàQ©|3¸Þ$zàÞX0ã Î\­/A+~âõ†bvcȵï¾JЦ¸ —ú´ø DN“ù°²b`s&´ÞdË0¨]ŒaÜ”ñ®°¤`ÒÑ7ÇJUû³Ò1†kŠÏâ No¼f±—3éÛô¯¦øjìÕ¨¢ŸÇS(ãËÆ9=S\#®4ÅD2:ÎE:õR¦ø"òL´e™w¦ø¢”s†¸Ö×!mïd¾Ã©ý¬)®§¯COûZSÜ zÚßšâFÕÓ>×7aÏ,ö»¦ø2ÂÜßkНc)kŠ› Xd‹‚ü°)nQki_lНbOæ±)nÅ>ÿlНa³¤È/›âëp}Ó÷Ñ܆^çvtßPb­­]ºtiWK¸kñâÅð¾`‹ph«ØfÒwéßá¶ÇçÆx ßwšì$vò˜wN×@:µ…JÉì–tt7Ï %"›Ð’³yEùšbÌY| Õõ.tÖb¹a¸Ä·ñIã BÑÁ˜¿^7ƒ˜4i„ÈÝÈÆ|qÈÆTr ÁßÁ7ɉÈö½X|‹ïa±OÝiç•*c˜‚PǯÂðÎ5ÅN$yŸ€wÕ.ô€9lí)˜V™N$ÀÆK+{ãÉHz“Rª*\¸1Ìf8ç tˆß¡C^M±WÜï³}¯­=ʈïãæöC?YÁù€zp0l b-•ÀìÀøç ˜jw:®.€ÅC¦øø¡)~„Ü>Œb<(1Å£(F_þ©Ðºªè}wDáˆ:Éø`¬hШÈ,>‡îµ$§X™©B>9“¾ÊQE8øS<†^ïqñDqì§yÅÜ2˜cé¶È&¸øLñ¤xª885…ÒrjÏŠ¾ôéâ{3ŸÄ¸Å~"~jŠgÄÏTH1œŽã[6.iÒ?Ó·LúúÞF‘ †jÝ1¬*&K‚´;àî˜dX»¯M9,™QùƒŸ‹”!ž5Ås.Óð~­Åó†xÉ¿Ä{€‚ÖÜ%~…Q¯<§µ­ZÖÔìji_½ª³©³÷֖î|«]«â{S¼,~mŠWÄo0é+ `r¯*ºLCõ Ä#¨èw¡—§  ߊßÁ„¾T' \1í…X¿÷ŽÙÝŒ¶Ù¨^Œ£ã4Z“Ñx_ ®÷?Š×LñºxCe£H³-k’ñ‹†c¨¬ap‹»W§SCà^ã1àˆ a8‡‰P$ü'•™Âk½ž#«’‰M~ˆ á[¶p-(šC˜¦Ó¹UDü³ž‹¸`‘èp_¡oièz€®¥ñ$ú„NÓN¡?–Í¢“Œe#hš ˜‰x2V—‰ EÒ%Ù·Å_ ñ7 Q—OLñŽx—’ÝáXL¹'xfBÁÁH<ÔñLºpÁñA³|Y÷”c§Q4Æ—…›lg54”ˆeë›TEɬIóÛm°ÑX©×IëÂø3í…Aß$_*&N)J©ç™“aÎÏÌ ƒ½ÝªrÚ© 8ä’þâ¡Y•Uù­¬®l¬èSÚÔâÅÓʆ –̪,p:˜ÞN¸€í=æŸM¿xóçM’ÿß U‡ù€XœðP ¸QA*Åþxz~—ŠïÂÌ®˜ ÷À¾KO*f~Uï°æ¢‰ª‰ JN®ÿ•í¿ßQI6Õ–ÚK7Gðˆ+*«&NÅ/¢Ù8Åî8^ד~nÀ¯²™áÞŒ•òW¶NJÈ Þ4‚uÿ$»E"N0¡^‹µ“­2dåÉñ«b6•OA•°šÑyâGÌX¶C%ÆJ §µ‰’cÿ«E€úQ¢•žL¾kµ*ëã¢ÿJw2\§+ì…Wk#­\Thñ/ö°ö1ÿ!#!òh™>OÔ—ÍÌØOQ3Å N) k'P99ê¤_½3±¬~®–d­ùaŒÔ]•­­g·¶¶ª¯‡š¾ÊGR2¿H­uºR 踽jâ×cÁs_åxõ-nÛñ®vîa¾ æ1ÔDÁ7ÿlZ5®ñ[¥Þp“O0£7/?bó4þz˜ÈÓX 5±rULvçHÁЊÑ[©[ÿ$’‘S8~1¦—*õ¡,>¬ã\У¡T²èÔÇ‹ÓÆxã^ˆÉÃr°“å:±nÃlÏS„¹H›¼šc±¤fjj1šý.X¤MÜâ{C<Š~Ê9ÃxFC[ª/b}k«œŒ€ú9~TA?–YÁ«`NÿTõõÈ´"ÁS!øÈha¶¨`“Á•g!gß@$Ý”Õçßœÿ¬7ñK9Ìn¡×<€GÁ+¹4žóϦS‰å© I=Kÿ6!3ŒžËSôùÛ9îYE>ã=·}5H@i‹ôâ»púÄgV>}*6¤ÒR2{Ü÷/Eo%ù»nŠ’dW*(/úº ñ˜úÆ Az™X+nsÒ«" W:6YSØ’Ñ”~¡ÜñGÝcJ%ÑÌ‹~ÖgoRÿ˜g"–ìG]a²¡ÿòNÁ¬¡¥RÚc¹6àã_/1ï¿sêx—…×Hã§x2>8<¨5Å9 †TBÖyt´FÝröYTdÚN¼{'ú^ËÊóyxè$@:+îÖ?1±::ßcu¢€–ïX›º 4¤4 7fQ߀‡klcFQ ¼’û.JÁed­ ¿ˆéŽ™΂sMê.nR·$Þ ºé`3„åÙÕ)ˆà•å˜ÌR‘¨ˆ©/Aå}Ãé4l·ÔOÀkQôJ-ê5jƒÍ:+„ŠQôŽ E ?·Èó‰jm×ßV1,‰F;Ñ9êcüªuš¢zûêÍœ,â)„'wÀ#F„Õý}@SŸÐ„7g$Ž\ºôq)»˜=)‹Eöm$†“Ö ËâERk/®mÅFƆH”̨lþ(Ýãaâ>Ñ—µ¢ÄZ'éJñÌŠô¯zÒ`2C^‰bå¤DgN/H DŸ’¿²jòߨ¡#P!JŘx\gyðŠÎ(‹+Q–´Ô%@üÈnSvBk{Tí 4m§öcZ[Ç9g§¶¶±Ž}·êß¡sÖ¾oF–†Yšr%Ó&q:úvžš9æ]8ñ·PEÃö¯³Þb‡›²‚<¼rǸ­¢k=—¢sS 3*c~¾§†0ÀG;;m4Rp» éð4ÞÃ>õõ‹¾Æÿñý¦…‰ÞÚŠ`ÿׇàd?€›ÜO¸Aì- Kå'}̬U?'ŠjO¢íX;÷ÿãZÌJS]¾3!(ù2ykr]Š’Žÿ‘¯³Î:œ„€þ2ˆãb‘¤v"gi/ˆù!ýsÇ3ù¥Ö:eуS-FU±2‘z 0qÀÊIê5WÃÕ¨|¶LDd‰Yl\c]ÊZ÷˜ÿ#¨å"r$)¥ÏNFNŸ%sÈtLÝ«,¿@A(}ÚŒ¾DÜøÚGà7TUÿZÕ.§êWéoUý;ú{UÿþQÕ¯Ñ×UýÐÃúOôMUÿ™¾¥ê¿XõÛô¯ªþ}GÕïÒ¿«úÖ¼Ò÷Tý/kþûŠ‚¿kSõôC¨$þØ ûø[>ìãìTͬš[µ°j‡U;U}$¡øk@(]Л†d .©ÞMhµ—í"|;Q«áïó,¤, áo¼[j!b{õ}D$¬ö%#D´W×ì"¢Zƒ Jviu\ØqWçHÉ‘í¡1·1“øÉtâ$³Ébò1¨)3|)q8: VJbPN±Ù<‡8ó÷‘ÒžÝdJ[MŽ”Õì ž¤|ñî ¾=¤"GüžZSXlúvØœIæ‘jب^ÄGØ(tAeðG¨Á<‚¸X¹½Ô°uÛðá‘#3»éé´/áKùN2Ëâ Qð@q™í³‡#ÄÝè 8aå€e°…lT’ãɉ63 …®Ó`^ø£T±ãSì8ÀOók~ØÝ°u7Ô¡b~:h£à ÞàÀo0üFõþ­tmµßX؆EŽÙòÎÍ‘£¶W8=ºÇäȱ·ãBÞyÐØBœ#dÎÑÛÉì}¤²g©‚­U{A‚!ü/Gjw“º› òÖ«)¤½“xDlõÕw~1´\AŸyC½ š yC} z{È{œ‚NAh‡h–® yW°2„5 Üòž €¥zzɆ¼'ƒN!gè-j³1:B–æ7kì!'o/Þd£µIï"(|dqŽ,ÁÞÒ1ûùð®üyC·ô;¶¯ß « 9ïÇaÓÆ©c£!½ˆwFí#î)ˆ ;ˆGÈÌ<#M{È2\¹Y¯Ü(ö‘åÀeKO@ì&§'§Qï …ÓŠ$ˆ­oõÍp¡¾I¥oF@j}£Ÿšfë[ŒFÉ," z6!y¥Ã%sPƒŠ*Žšî÷û}^¯×¬4ÆL%är´VÚéÞàì’eZqÝø[TËü`èøÏµƒ¬ôžž#mÚ±üͯ…r!Ø"5ƒ³pï!íè' Ù¡»«rd5Bøâ;Èû·o5Ô3î&›)}Ã`éè ÌíÊ5’%¶;™BÄ!2‡¾O¦žjù“Šü¼‚¸ÀÝötõ>ÒÕã]³›¬ÝEfWC¯»Çáðxp;»É™9Ò³‹œÜ̆ÿÎÊ‘³U3G>¾œgwn›G~Ÿœ×ýç‡{„wn¸Çá„{œÞÞpáí ÷Ho4ÜãqâˆÇðÆÂà'½ëàû=.=oÀžÇy༹8ïB5/¡æ B)½ÉpÌNÕâlž=„³/ÂÙiœ±ggÕìa5{½š½J—âÃíÝe‰w”¦÷b(K½—@9E–y/ 7 XèèÞú÷‘Oöx/ÛM>Õ訶ۻÈå5 ˆËsäŠn©Y¹YÙŒ¬\…¬|Úfå3Š•Ï*Væ*V>§X¹Z±2W±òùp£–¼g¿Süü"üR¸Ñ€ÑkÑþ4C×!Cr¹¾Ç{Ãnr#ZÀ>rS§i7ùrŽ|%à‚#º9 Ñ.¶t+´ëÍp+´šÛBs#ž,èÑ-X—³O•ÓWr䫨ñÞ h_ë†ûñëÕžéÀÜ.rÛr{Ž|£uuvŽlm4%÷‘m0ídÂT7`Bu$°svî€NŽ|s„ø‡shkä¹SSÙAN:HNØA’¹–€8†ä[ª¦çUó]äq@x"GžÄ ,ô>òTŽ<Ý­?!ïOò§÷‘gz±ŸñÝäçʴܵʨžÅ}þ{c¹ƒäÌ}ä0¸_(W§LÆ^{CuC£Sƒð¸ÜC€(éKÛȇ÷—9ò+\¸#½—qÍè}qìñ{CÞ_+^ΰyyEü^Žšœmæ¿ÙC^áÝ!ïoÙˆMöw‡%ûb£PÄH|¶E\Qõþé;¬ØÃp„€*GþP°?ް·CÞ×Ô2kìe^ÿOÜÏC‡ÝÁÖØM!ïŸéšj1ɉ¾Qt¢Hp„AÈ÷¦šP x]ü™‘ÖÑ1ÂV†¼oF¸5r<Œ€þÿETÂÈÛ9ò׎ÚðËžŠów‘mÿ¦½ï;#Œ…¼ï*ìúqØQÀ®…ÖWU€2f}2äý»š4Ë:w8£ˆósäŸ6Ê·CÞ÷l.ÔpT)ÿ,±•^P³Š±/ yÿ¥°}úõ><²hÇí yÿm›ÔÔy#~€ˆKôÿC[nÇ(ȃ #Á5„·ÛµÆ$Œ £VL½ƒ2´bò6À¸  öK€9l˜SÁ˜aä‚Ý0— s+Øí+±a¦‚]°R6EÁ6¬Ì†y, °ræU°ÕóÙ° [ 0¿ ›ª`•›fæ+XÀ–©cùÁzV¿G¦Øƒ Ùü5¶rUÔ"ÕpK¿O\sGÉ"Ô­^‰8¾«FaýbÒDubÏ})Ggæ/Ô:Ü][{ø¡ºÃÕÛC­÷cfàX–0Ǧ%Тè¬d<ù:[¿<Äg?Œ\Dxðñ@Êæ~ŇZx¸!‚?ø·†f[‰¯N²ÝyÜãó¸ô|nA} m+¾mÐóð¶ýD'ÚVã£sÔ*«s4¸/øöê=ôÈ]t.Ú¶•¬q×ì¥G1Ò#Õ÷ѹ1kx/=š’¥³Øíd©îC „þà©é±#d^£#Ä}´2Œwk(G«à> ÕÎ8ó°šD¤â³öÐZ{¼Úâ^l#d°£˜œWgÏ«ÍÑz|øî%%ÀäèBëY\ÿh¾DaÝ=amØš‘!›È¥t¼ ›ÈS`­ËÈãªÖ§¿Œ¸‘ih}SÄÅ£ädâP¦ä…× ha ï“£ØÌQ8_n!¼ôß$'w¢}Ê`5ròø-d1ìvÆrôG+Í(Ãz*GOÔÕI#ÄPW0 žªEÄq”ŒÂëC'øÔé)«\d[×[@ÒÏæÍÈŠûÚ]Ë8î bó—¶’9°!|ˆ8ýNû6âù9ÚÒ­xTîå6ňöÔpÀ!|ô4¨>º*§¶*y£ÙT‰g±î×x™ÊÄ=^ãY”£+1{Çnƒç÷9zz£¬ñ> ¶îªi”^Ö>Ú¦L½< :znpŽŒî H+É»aõ€ »Nt¡=¤ß¹‡¶Ÿè:rª+² ØœêÚC;Q„×"¯#K`Pñ¿êì0‚áAJWÛÌ×ì +-Ó›êÊÑ3|´ã9© /GÚFF|6 v:Ð`L I:`%›Þ?†Š>ùE*¨au#ôÛvÈæ 8æÙp²¥xæ‡H üÃÞéæ(9¸ ˆ8 Gîêà§¾Gjàì³%ÖÙ· :ÜùµšÝäÔö}´«'DwÓ5ÚøÖb»¿Á¡{Ý*›KÏlµ¨«=¼ÁåwùåVÒpúAg=Hφ?LîGupó† t¶’c†¿da£0Át ÒË ë†q3¼¹ôè…Ú€;G?¾Ùí»Á™3BކÎËç(}´ ±’’´÷€¾Á¾L¶Ðs-im$Æ(¸7w^K ö1í»N!:Å$æ$ƒZTÊ„‘Y0ú/Ò,)Hs !¤ã´¬Ê‹Âmš’]–·*†/ûð6KŒm5û—Ì|ÀÝ‘—#¦ËAŽN•«ž¹•TÔú•¨~i&ZGßT#~çVr ¸ £ [o~ Sæ~‰ðjý²î‚•ßµj³D«Tdä_qF~ÚqXçýª»fìüm`M†'¨ìÏàMEçÉ€±ƒö!zžB ÏÏØªfÔfØóqæ³cgâ^>{‘cö”€ä vãR\Y—Ü~w­ß5†-·b —zÜ&®ÖÚ0ò "„*÷´ÐG£ÐDãR†ËÛ¨z ¾ ´—­€C«Înâ× `8UuÐÍy¥yŸLÅdÊ(™®õÁUZc™£N ‹‰á°D0Ðé˜{4t·ˆÔ½Rì!Y÷²8K)ãÖÄQ2eo€„îÿ'ÕÖûhF€Ûø’™žé[É4LNÞ6SnÛ73Ö빬[xP½Î/ÇvŽöçÁ5aôúžš;ìÇq ÷T‚3V±Æ€–c&«ÀiÜØÊ{»G´¸×é%Gã!LPáø‚j¬ÅùžéC»èº‚äM £>ØåÔZØN‹}=í3s@}Ã>zaÏnšh³êöj«±‹z°ù©]ä©j›ãËdžGÜ^R { ™f{o­QùØ}ôJ˜·yyÛÊÆ ü§“°|£ï£Wõ”“G=ÑÝôÓð\×iWõ¬Îq1 ¯œ†F?ƒ‹(¶1 åT¤€/óÂñ¥Ö uªú;M§Q‰Àÿ—}–F œe¶ù|±"G?§ž'ôjŠ¡a>Q±ƒ~>G¯Y²ƒ~ª¥;è¡j8ÁË ”{é—(ñÑkyŽ^§³ã>z}¸îÖÂ=oÜntì£74¾ÜèÌ7Œ|C" 0ÙÄg_qL–[!\mÀpé¨-Go‡ärÚpÉ|gdôiœ£"´²F·Õ¸pôXàUè™[ÙÛpݹÑÑÁ-X—c¾mÚwÙ J”A]kEí¥¸É@i ÄGo™ »ƒ˜%?oJÀËÕ>ËØç,Üg™G‹ºÑ[ÌQ¹š´mGw =oaSež’½ô› XP™#Þà›HãÎq4Fð†ðåè·4‘ÑE¸ëD+¬v âÀDùÜ¥)ùè·wÔ@["œï¥w;aû´vfIåÉ€¤r# Þ€'¿IßX’ßÁ ùƨ"P~^ å†sZ­äUðÁš~¡µùªP3ï·Ãïâ½·X2±wð!s—fÄ?‘Î÷13ÐC Õãž, MµÚ©ðFþ³ oûèvÝQ vÚìܧ.´Ý]˜n+h`ål¬Ý <ÂÀÊó¬±öÚX÷ÛXWOÀÚgc=`¯øý +î·±ØXNÀzÈÆúõñXb†N­’žö²¦]û(ý‘å4k!b­·©bïøq³gÀìiÓŠAŽÆéi´—|x;é×Écàj#O`Mc׳[áæ¿•}]Õ¯ðûø~Bø~þ Öâañ´xü­ Zϧƒ;JÝwTÀøsÚ1ÕtãЪÈ;tz9™5 KbP¾’ª/d§äÿN ä¸Vƒ5”èèVR69-þŠNȿɲCÄðɵ6øú9Aû€œ¨Þ±ÞÉ*kæ(YJüÿm5§ZPLK´ªæJÌþO$„M‚šï‘d_%‡¡…!¢c”ªdc™JC–B€VºI× ºMW#“ý3Øéj“YðJmvå+[v“ÜC–í¤}|'¹;¯Ÿ¤4GÉÑG•ÕþØú8Cë€Öº­Ç«o¦wo!ð†!ð&"ÿùô‡6Γy—>z¨^° ça}z'Ÿý“¤ÜGº“x½l'ñᬔ, ÇÓyV8PEœYØ4éV€@ØÔJfDh@ÈÿPKpm^ X.ÑZPK8A+org/hsqldb/util/DatabaseManagerCommon.class¥Y œ›ÕqŸÙÕñV–íµðbl yØÀJkízmÀ!ë]ƒVÒÚ²u¬õi½–—%|+}¶„µÒ"}²½ÁÎI '!$$$6¥‡›«Ø@ÖJ/ÚÒônÓûmÓ+½ÛPwæûž´’-S~¿Úþ½cfÞæ½y3š÷ùÕ¼ðlÇ/xàËðû=ÔüŽÁºáü±€?ð§þLÀŸ ø )à¯VÀ·á57üµ€¿ð·¾#àïü½€ðþIÀwü³€ð¯þMÀ¿ øÿ)à¿ü·€ï x]ÀÿxCÀ÷ü@ÀE v ìèèèè(öô\!Ð+p¥ÀUW ì¸F OàU× ìxµÀu¯¸^à7^ë0nx÷×só6’v‰7Ü$p³À™z“À›ö ô ¸E`Pà À![ ÜæÆí8„·¸ñVÜ…·¹q‡îÆ„¾å@Ûo&çt™¢kŸ^­LÐæ‹fiŠ£Já–Ð)“í³É5Q/•˜êJíAwʤHvi•ùyžöh¹BÙ(æyìÔLàü)&)½Wk¬Nì1(h-\W˜B4ÇÐ ½Js/Ý<ÊNŽP¹Ìí6*Õ#<ÐKÇŠ:[T™£_K²lPïNs5¸Bå|Õ8N‹ÇÉ,âhõšnÁ8ãz½J‹»Ç+s¼²^b(ÇÞJ¬ñL- y9Y¢œ®ÐŽŽ2tŒgƒrû°Y ‰Á3Í8F©©`óDÒ8.³•êQRÑK%¬vÓýàºÃ…bN?Ra#(c›œ!WjzYNЯH®XËÇ9nTÙ8GªVâé¤^-òÎ㋌Ð3©—*2T2™•*™ìG¬jÇèºd Ú3\ªäŽr_Ћ|îú](T,X­P¡nÝ¥yp¼^,‘c¼ð»ð-„±¤Mgø‚§–óÖP|*ªù½ø~ü7 tû9ǾD‡ØìG@I´þ€?ˆ"\Û ÓH …å‚´ p‰Xãâ7ŤœÁá¡a’¼¦M’£´)æ nºD¦&#à uZ4#­45–NM%#~k<0´‚”²Ÿ¶ X’#yŒ›¿FñVkåD:•hB.P/§÷PœÉfrcâ…B¶ªv¸VFk`jS ¿¥¤‘I¶Ë ¸™3ÆÔÈÆ¾Z! Ø ®¡ÒËrh±²•wÓônù¢% Îxýða£jä—¹jpÛ.KyñÃø ûø#Ü|Ô‹ãkqU*–jImª§ù·Ÿ–öâ'ð/~¾åÆG½ø)ü´ƒ—éªl®n¦!~Æ‹ŸÅÇÝø9ºBøyž<Ñø…n)!ÙÐ'©Èiß9¢Kfâ±D,#Ër~VÎDèg5– gf¥ç~ižÑ U£V#SåIirI54@£yJÎåÐÐ$áëFÍ„Cá=ÑÈÉL41IÍA‚)Ç­2Œd,½@¼HùÞ3c{jŸqRéý¾g/W>s?e^R‰jáS³J÷¬¥|7]ÍI^Ô*ÞŸJÆ(Ï„âñY…Û¬ˆf½ðSð4U®­‘pwëÔ²YÎH®RªÏ3´…Ö)©jSÍü@Cî¤ÔÚuÊS^8ÃJÝê¦#Ü©F¶*¾ñJ×X§=u8:/œµ¶¡~¥líSµKŸá¥+Û~Ù^UóöælÓ·‰h"•Î*ïÚ²e.k<~erÄ8̵c«½éñ\Ê‘Š$¹æÎ,.ð Ï$S„šœbGÍ´”´å†ÔŸy£¢ÛšbN6Ê*&±Õ'e&– Žï'÷³¼Ã-Å$JËÌ:/<×z±d$zäv4ÎnÑþ©è¬bùMÄuÇ>×åËaí9à…¯/ël`]Ý2³CÉ‚ñÂËzè€Ãû&S´;„5þ=TMDÆ%µ²R.-â9–riátl’$6Ù9Ó˜Gÿ¬ÇÓaÉy^"´=S™Hj:‰p{cHM%&CáÌÉX"Äh‹ñìI²3Ôó å້ø%îBS™pö¸_fÒS|꡸•§<Ì'G„ÆC4 §âñP†cpÓ(SIç À·f×&Kp"çâ³¹{Šñ‰th·­ßeìjÇŠ%c™X(.5O„H„¤óºÖ‚Oí–ZìP´":˜NMkr^?Q­¯Y´É¦MSΑ£ z­v¼RÍ·¢ã#´µT2ž¥­M§c™ÆÖ®¤Ý¾N£–o-ê›`\.«¥¦Òá¨%M²©‰‰ÿKrÓ(»~×&JÜ”Émüöù gwíÚ•‰j™ÑÑÑÁA¹Ó38¸yÛðððNOKð¸åyåiK Ìô{¤Œå;¾CˆÓùyEŒ6Úm6íPl² sZ®e‰¨Ôº9ØoÕ–T!5ªÝA»Àínæµ*yZËø¼XÝXÿ½\ëo”ù±Í$ØþhÉ·ñ[Óeî Ñ™)k’ßàÒþ "iºÀu^Î-J³`XynN¯ º/T¥{b&]ÅE9gHª´é=§i¹N5ïâL×KFmÄ3(‹$TgPS¯šò8=d»'‡HÈÐsI/vÖ5¨ì¶$ûwöK¹"k zΨIý0^€äY´fCRÅÒ@•z•Lá·FÙ¬]Qj3Ep½lî’ó/ýœšü/-¢Ç 8IôµŸ³*ò.£«ÊŒ* Kèô3‰0Þ¹T“:Ý‘$ݽ½”)š5b‘CF§o¬8´ü FØ}Ext"#SS™·Š4ÖÑv™o³†ëO o4«P„;®`‰}ÃÔ׆xl_Töo»©_6ë þ8Á1ðšBЇŠù µ‡9ژœ’Þ[žð‡¬’9 7…©lÏl RQN Gýµú|“”Ã$’IeBñV‘ÐÝË",A„MÿÏ#”Í*íM7à…o𺉨[ ô¦ÎÏÙÅì%Ѧ{ÊÅsË©Ôܽß2ßåß½¨Ô*'̺ýüÙÐmœ0ru~÷uúLwˆ~gõ…Š$„Á·ôO=wÒãÏ{3¶0+Ogký?pv´è=ž öÄ¢Z_ãE~œߢ¥üB!=×úÃoÂuæJ•šÁßk+ô®†ªUë[…?0&¦õ’zÿL˜X½@kMëSl¦ªsL·~)\¬Y½&W¯VÉ™â¼ÁŸ8ø]NÞØKÞ°Ê Ôá+ìüÕS«ÏÕÔ±]íu8a2yÕ2-¡ó‡B0fgq‡oàHø2|Vƒ‡?tÒHð“ÀêϨþ¬êŸQý³ªNõ_Wý’êÏ©þ¼êŸWý ª¿ úoX}^„—á§i¶ºhDÜ—În?cý÷K¼¬$¶(‰µÏ@×toXعáIÌÓàØðU¢#ü µNèòÝI×~~N-<ú è/‚#ÛísjY‡Ï¥e>·–uù„–uûz´¬ðy´l¯Ë·‚Z·Ï«Å»Ç6nyé)X7°eãöçaeL“®ä]xúâwÎøí0QX¥4¯Ç÷a»~ÓnøxLð ü"™MVt}—æ=Ô?ݻڶb5[ÑËV¬a+|lÅUlÅZËŠ>ËŠ«©¾uÔöø®¡Öã[Oí ßj½¾k©]éÛHí*ßuZ¼|=#¿‘%#ßÀÈ›y³…|£…|“…|³…Üo!û-䀅<`!o±ƒZÂm2ðoeàa-Ùëµ9Û˜³9·0çVVy«Üa©|»¥òvKå;,•#–Ê–ÊQmÄÑë²ÆhÝÁ@w2PˆÆµgïö®îî>wŸë)xnà„³ç â‹.ÁDŸ{ vûöÐ(xbÔùöR³¥e¼¦k€.Kí£Ù` g½CMâÔ,AÂöu>Ù¿Þ©„÷µNRÔô®uöž …{Xv²ë7Ý™}MÓibïob§yäRj­‹{×ÕyÏÑ'ž€Tsi¦}©¸ „'ŽÞkhf4Õf¸xúâ3–Y•ßµcßtcpÐø²gš‘5®‹8 ¿D—¼õRX¾çÞ€.|Fñu˜äËÿË´ÆAkWQ¼ ¿¢‚ñQèõû/À¡ìÀ9˜‰_€»²[ÎÁlâÜM{gGÝ;œÁ%¸';âxÖ=àÄÁõŽ%Ч{=K07}úâkÄÍmY‚üàgâ4:rÆJ{aV÷C÷EÊs.7|Ó ¿ê†_sïӘĮ»^@sódßoÂo)ûî ûº©¿þؾb"Hè÷.ÁQRY: "AýüYKY\ÓT憮ƒ„å °ß†ß±c¾m倳ç¡<¾¥wóTº¾NÇí¯Ï¹ñ)xlˈk½Ë·°÷ñÝ ¦ë4ܪ<¼ÞÕÍþ­’ßÎC­ÏùÐчÉë]}n9Ô´Ý9â:}ñåõ. {bèrˆ>§Zìh_üÊÀz—ºNº GÉÔŒ¯5½~ˆ7 ×aû–|ÿÍ7` yxØî¾Gî]vtV¹†z>$'bý¬Êæ¿×`cÀJÉ€×]€cÙµpü,> ]N; ¼‹“ÀýÚ³pRN1áÝDx"¼— ï#ÂûáLx€T„™ð>¤fÂGˆðQEø>N„‡áLx„ŸT„G™ð)"|ZcÂgˆðYExœ Ÿ#Âçá &æZŒ¸â‘HïREgÄ8—Jš †N{9JçžÁê'¡`¨ñÀÈDÝŠô!Ig"d8l§|Î}¾0¾˜ eüË2ÈâœZ¨ N4U 3IB».ö°ïÂFÅE5‹àƒeÔ4OÀà^+%Ò~̵šÁË5Ä\EþÍx*ÃÐøWÖPj#ˆÉÐ\æ52>ãR1Û™‡Ðôݽލ%%RRó¼Ì uª@³ ‡²+mÑ9Ë8ÝãW°î ÏÈ©Çê¦N{†©t_ÀÞQüE°F«E­ö¨ òŠV~ƒPK9™ØGPK9A-org/hsqldb/util/DatabaseManagerSwing$10.classRKO1þ È®‚ø~ˆª^5&Š45ïe—5k7n ø·L|$üþ(ãìÊÑMÚNg¾of¾¶ß?Ÿ_ö°VDS%Œaº„2fÌ:˜w° ·ÝÀTw6[QìË®y ;mÙ³A(O”UmeèBiåS|3´¿ÏŒƒ@öP ^R¿È5£ ”•gƒH_Q|ÅÔX¯µT_I5°’ú¤­yA2X(&†˜YÞL¡ñ ñŽì"ƒI^sü-*œiÆ\Á/PKÅ$šf@PK9A-org/hsqldb/util/DatabaseManagerSwing$11.classSQOAþ†VŽTT!z–»½¶>ˆ1!•“k$)ÑÄ·íui¯wr»Àoñgh%>øüQÆÙ‚1AŒÝd73³3ßÌÎ|ûãç·ïšh–PŠ ·mÜÁ]ËX5ǽÜ·±†FY·°aá‘—0­±rë„J˜åý` Ž’^78Öq¼Zt…’m‘оÌ;§qÚßæˆqë—ß›,ÄK(¶²ž$,ˆHÇYº'óƒ,ÊaÝ ʼnÄ©ä‰Lu°3vÙ5ò8t®£Eô¡->î‹nb0vÓ(É#·¥d= 8˜s0Š…M|UÔlá ªž:PwÐ@…°9IÙn£AÁy¦2o%B)©åqµ‰HûÁ›î¡Œ4aíÚ„±Ò’# î$éϼvõßÝàä}©/ ­l8)÷oÉóÃ?%ut~1¤YER)·ñ¬Þ$„Nêo¤ÿ3qžOJƒë ÊWmÌ/yt,nõ²^mö¶ÿžÓçò —j°ŸK‰ &¼Ícš•ˆü¦xÏc­e–VX7»ZûÂ\øŠ©3˜E¸‰ÅKŸKŸ­êgPm„Â9ŠïŒ|Ž‹Ó#XŸà•~ÛG˜9cÜâ³r9|‰Å"/à¡IÇ—¥q"üPKá %åŸPK9A,org/hsqldb/util/DatabaseManagerSwing$2.classSmOA~¶=Z‹oˆbkQ¯òµÄÄ”&bÚÐHÂ÷íu¹¹îâíJý[&Ñþ”qöÀØø’t“»Ìì>3ÏÌ>³ß|ý`"æqÛC•"namwp×#ëÞ<î{x€u]Â.’ w˜5sL­~ v©/(2Ü ´8]¼s‹/`‘þEzKÄ ËHÜùú PK`e[¾åIPK9A,org/hsqldb/util/DatabaseManagerSwing$4.classR]OA=S*K—Eê*‹¸ÖvyX‚¾aL¤ò€i£ FÞ¦Ûk;¸Ñú·Hþ”ñÎRß4é$3¹s眹gÎÜ_¿ü°Íܱ€;5ÜÄJˆ»¸rtß/«x !0ïFÊÆ[Í®)†éÈ~ÍýôØ©<}-ìKK=©åŠƒS¥‡;Ìx¡´r/Ú­Ù(íÕŽÀ²Ìœ2úŸL1¦@£Õ=’'2•§.¥Ò.}UBö|\R—÷t–Ë7õÈÌ Àz„G؈b1Bä£Çˆ<‰ÐÄÓ-´#$Øà7Í¢/~.h_k*:¹´–¬@½T•K=Lßö(skÿÚUÖ3âYª±c©´À\Ë?n±o&ïÉúÂE¥“Ôzdú¦3¢ìó®™ôHï;ïL5ü *{@9ËõÞr‰CNÉ,#kãg[ÛÉŒvè™KYråa{jªAÔëÞ|nµ ÏKœ½ÎÑ ï}&L6/ ’o¨œÁþDÔ§˜æ³šœ3„ç9æ.QýŽkýîóWœ nðZåv½…5'óƒòPK÷\™´çPK9A,org/hsqldb/util/DatabaseManagerSwing$5.classRMO1}deYAÁøÊÆ–9ùq9h &šxðV %›n¤Eý[&~Ń?Àeœ¢Æ‹št2ó:Ó7}ÓÏ·w»pˆ#cÃBÖÆm,!g¼¼…e «Öâzà+·Æ°Ý G}o n‚^Çk?ðN¸æ®D›KÞ£Ë;_ö÷©âÀ—¾>b¨”§+©\1ÄaO0DGcI¶l TSvƒPQF[èAس°î ÛA)(X(:ØÄ–ƒ Ôá4ln Ω”bÔ¸RB1¤‡ü–{—}ï¼3]Íùƒ.ÆRòN@ý¹ÓP0ؼÛJ¹{5îpZZ†ñÞS&òÎŽÇZ‡’ôÌþ…º9éªGꕯb¿´õZ Eš­EK§l4òí$BçÈËQl»ºóV}Aäf1Ì#õ“S¢ Ò ùê#Ø+¢±gľÝã~D&£¬˜ ©$>9ÁPK\¢äThlPK9A,org/hsqldb/util/DatabaseManagerSwing$6.classRMO1}de]AÁøÊÆ–õâÇAä ˜hâÁ[–lº‘õo™øþ”q /hÒÉÌëLßôM?¿Þ?ìÀM Ž´ óX°±ˆ¬ñr–,¬XXeˆëž¯Ü*ÃV#t½žº :-o¨ýÀ;åš·¸M.yW ®î}Ù= ŠC_úú˜¡\š¬¤|Í«…Á %Ù’’uÙBEM¡{aÇšƒl3H:XGÞBÁÁ6‘§'as÷ÀàœI)µ€+%CªÏï¸pÙõ.Z}ÑÖ é?èr(%oÔŸ; ƒÍÛm¡”»[%áŽ&•¡a‚Å>¡e¿þ,à~qÞÃGÿ\¾#´îÁŸ€Aù ÿ¾+ íC¨ï øi߯ڡ ¾?9|‹Ž:Ò±G¦<éâ:÷N> à4(f’Chê‚A¨= ì;†ØŠ‚!òà íùéý¸þ;XÁ~PKãÉžÝPK9A,org/hsqldb/util/DatabaseManagerSwing$8.classRMoÓ@}Û„nëº`RRÚD´äɈˆK(R,¤$‰Û&Yâ-ÎnÙÝPþçJ|‰½ó£cÓàKžg?¿y3;ž?¿}p­UplXÁÕUlåa›£`×8®sìrÜdXö©rõ{ û]c'qêÞfãa<ó*‹Ÿ/†ÂÉDh1‘¶¬ôä!e5cŽÛ!¬……¨çaû µCñNęГ¸7Ó^MåÁû‘<òÊhŽ;!hÒ¡i°þ€ á3­¥ídÂ9颹ÿóá¡y†Ê?%uÞ6ÃÆœ¤Öÿfë‹f¸1d«²%òÜSŒ>ˆ¸-ã®h1,9µC~Â]~ª\q""ån§!{ÚN¡ ŽÏu~tÀ›¡Î±y¡L(s]¨Žl(Y(cÕÂnZÈã‘…ÇxbÁEÅÀšEÚ<3ðÜÂ:^ú,4>Ö J¼PðØÀK ¯°aá5lRa˜ŽŠ `°ö£HÄÕ'‰Hì´G¾û¾y(<Űxmkµ Q‚ ÅaØH/\‰)ÃN°9§”ŠÖsà¾íŸÐp2Ž–,O)^©ãv[3MÖþU×PñÕ$MÕSUÙíòˆ1;RôÔ6ÑRØôµ †/”Þ1Lõ Èoúèò„"òU'-tŸaaP]ŽŒú}["Že\IBbPÎÿ$ºÛqîyS\[¯TP€~„³m}#èqŒÐŸ‡MÞ[dÍÐ^{Ìòê7°òwŒœA$n÷c¶ú1¥ò9Ø92¿0ee/pã£Ù¯ÈM—;ÓîKäÎÒS´fÀ– ;Mf–¸f±¢¹èÐLYðPKˆµ,±PK9A3org/hsqldb/util/DatabaseManagerSwing$DBMPrefs.classÕWësUÿ]’f·éJ RÞ m“@@‹<ÚB-ôESÁ‚ŠÛdÛ,$Ù°»¡ â ß/PQÅ7Ö÷ ŽM;vFœqFfüOüäwÇ¡ž³ MHªÓ¯fšsïùç=çÜÛö÷[?ý `3¾/G3{±Gx÷0“G˜<Êä(“ǘ¨åD„wQ&šC–“¡{Q‰cŽËˆ{Q…„—äI;YÅð"…LL»e´Èh•Ñ&cŒvÖ¶$Ø^¬Äi^O2arJÂi/Ö∄ǽ¨ÃfžàÝYOÊxŠã>Íà3éY&ç˜}NÂó^:Ú/0ÿ"3/19+áe¯x±•~UÂå)S²öêqM`nç1õ¤Ú¨Ì7 T¨iÛèÓ†LÍŠ ˆÃ•VÌé3FZtÒ¶r|ø´Õ¯Æ5â+>Ó*q^2LÇívS ¸âê€/#®&‡ö©'‡)ŽÂVý†·õ™yì˜nÕnX×i˜Ã1ëD<:ؘ¶õxc›j«ƒª¥u©IuX3Ã#YžízR·wêggr¸á €»ÕˆÒ±+ö9Þ¥¦œC8…9O¹ï9ÑR¶n$)#wÜPùõ %\pTNS÷Ê,Û05‡» àt(؇>÷c‡‚Ø¥`7“&­LÚ°K› ÞÂ^{˜´3r^ÁÛ¸(P}»=ÓñÃÇõTŠòös·4SKF4Ëoé´ø£†?iØþãIcÄ3è&'ñ•µ°ä;:˜pº½!e)Í´uÍbÍwàœßÃ% —\Áû >ÀUâªÀ¢â†µ¤õxT3i^º ¿•ŽÄüCä¿É¯à#|ÌäŸòa8–Nz§#Þv˜K«#™JÛäWSœËgœËç ®¡O`Õ^•4¢~Ûð“vJ·øÑ󨩔–¤÷`ý¬òÊÝ—æ"ýlÏþS_¶Ûý™_çãÌUªÉc×È•Eâ†E™{©]Ô0j>5«š½ˆ§ Z¹•[9Íms8«PsëìúVz6`>ÅÂË÷/m/Ч­VÑoÐíô빂Rð‡ÞRgÝ[[rkknmË­ô¤:k;óUUü$ç"Oû°sÐIÜ9” Ç ã˜cpÜcp\c(câaVb"~@ù¼¼¯XvžQ¬™€r•“¨ðÍǼIT è›?ûÊ ú:…è"êƒk MpIè–Ð#€yóÐK¸›ä•ô¥ç7›Úœý„¹ÉìfàG¸nbŒá[ÁÂÎào˜Nà® qž,¨)”9‚Å¥#XR*ÁÒRì–± ¼‰rªÂ(ÜA® –g-ÄŠ¼EŨ¨âÄ3Xq«¸:“X90¿oU«³’5ÔrÅ&±–$ëº&Q7À’qÔw‡ÖgÐ@ßÀ(6tšóæ¾íI‡~Vç\…¸BŠ+âò£e!®M1ê qaŠQ)ÄU)Få—dCqIB\bÝŠëÔÜ?pKdÛÌ£p ÕÃ/!\CŸ~ ýSÎq#Ì+Aá¿°¢nŠþäy„!$ Laan‚ÂŒa!}äàÓ>jî±C4bÂ1‰0žþ?³#澞ëDgз€ ÷e”O qž lÌ`Ó¡ ¯†à²Rx1ÁžRx ÁR)¼”`¹^F°7»]NÛŠbIlÎÇÝ]Áïž î¥¸¾[hHhz¶Nɶ¢!  IÓ nÅ5ü‚_§[q óä),ÊUß©ÜC¦è*Þ†\Yˆê9…êÿâŠÙ)ªÐŸb`I†Ú¸¡[¶ªÛƒj±¤ù¨Œ!è:e;6¥\UÅ »ªxoj ÝÃu>!gŒŒ¨úC(µKÝ«F‹ª>ÍØfA^Ç Ú¦¦õ©vž¡Ñ±E­}dŠr}4ëɱÆVw=O)gK#º+Cµ«$ÆÎ¬¦ ËR†9Í[{ŠC;¢%»PŒvªä¬ZZZÕÕaÍÌìsAT¯/èûF†Á–‹ ™}’ÁÞ:ÈàC„q¾š³ †Þ§™; sD£¢\ÑâæR÷ÙQm¯¦ÛÑÇ%Áy'T´ w†ú–Ö¹jX7¬Ùq·ÊÏÚŒ­æv§ÕÑ,/Ž€#ÔBÎð&]³Œ­HÉHã-ItÊØÂ—8_èpTÆÛ8&#‹Œ€wd¼‹÷¼/ã|È›Ñ%cÉèGFÆÇøDF7<"ãSd¨¤™D*ÏÊø Ÿ34ÌD½©T(i&Ã<×O‰(]ý½iEÆøRÆŽËø _34Ϫk§¶S-ítɹw^媭ŒøPÆ$ʼØÝý2Nⵟrsw¢?A‰Oã8uŽ’JnM(ÍK—63ø” !èëìÈ&ÈÕeHP2‰,7u8n’]ÆÅHúdO&ÑŸ¥á !<çÍ»˜¾Á·Toßá{?ðóI}¨Ó,†ªf‚PÕFd7’ìÉö’è“Zh *­Ò`Gj ‘QZh£VšŸÍ†­ä5SS º¢™¦a’Û%×(J&o”ŠCŠNýc*yutT£)Xy1ÜÔgŒ–FSËÖt~µ3d9©UËâëÎ_cïŽ]ZÎfX2g÷žÏP7óæ9*SB/h¦ÊCèÜ-¼Ý›.7]¤=Véyj¯iÓ·%«Ù¦¦®óöše k°4›KäÑ2{¤8޹¯Õ}rd8ÎÅ’n;À“îºÊ‘QC×t'wrêÀº5#TµŽ«I>n¾%Þ\_èí ÚÆÝª§2P÷i{JjÑšÝKÞz98-@uiŸël³TÞ,ò}Ôµ¦Õtíu+èùLýçÇpÎWªžR­™5šþ¦M+Q¤õî¼À'§v?¬˜ãyM>9á ¢™-JiççU+m˜Z¢¨|˹|*yP§fò”Pèû}-bÆ:¬'~ÿ†Ä$ß4EÞHrÇy­ôƒÿÑ;ìÐÍíöhÒ³oá´®Ž?ä$ùé“Feê%.B¹¸æòÈòI°ÈITEØ$||ñGÚ&ˆ´O¢ú¸“‡¡Û¼¸FŠ«":?rì„Hb5Gzë=ÇDé‹€‘Ç„gÎV̾³ð!HtòT—!­oôCu(8Ñ8†Å®„ìPµeÌ#tÕǰ*âFÌŸmö¢ê¨¨ý$‘° *cá!|ú-êo=‰E¡KÊhà‡ ï.%©Œpš$ÿÏØïî±ø'4ö°˜¿½ŒËŽÂ ²„RÆüaèò2®8Á?¿oMÀËÙFIBÊù¼þS¸ÒË»(p‹§º]åÆÑ0U}µ§n›¨Ànr`o«À^: vhÙ4ìK§¤›ŽcŽäÍÓkÒò?©I+‡ÍX(ó‡"±Qj˜@fù÷“¨ËÓm§ÑÆÐÓ~í ‡p˜khðÄ0µí¼PÔ9õø¹ßÃ",VÃbR¸†Žv˜+ã¬s<),yÇ“B+bÂ8¾Ÿ2L-Ø®öÎè$þç1Å)Pq ž)º6F» Wª¿röÕ^ÇýyúÐ*Îñ¡ÕnøD%læØ®÷lδ Ðz gPÇWŸÅvƒn¦u#;ƒ›ØXø'ˆ»4Ä\Èáš! ¸…†Ù±{ÿÀ9šqÇ àVÁÉ2ÅxŠ€ÛÿB½›p±ïtÃT¹™Ý´JDo Ÿ(¯£êoPK’?’F PK9A@org/hsqldb/util/DatabaseManagerSwing$StatementExecRunnable.classTÙRA= aÀ°0¸¡³¸1 ! ˜ˆE¢Tù¢¤+ &38Ó‘ü‰åðLFÊy÷£,o“ ²U1çö=s—ÓÝwæ÷ŸŸ¿LáM'zqCGnvâFuÜÆµ 踋±ÜÓDH'&¬ ¢`\ATÁ}1 :&1¥á†Çž0´Ë Ó L0Œ¥m§Ûp?—‹ùXUšåØ—<Ï]‘á/ '»mZ¥Yʈ›–) ¡àåRBï¯Îèé©íZ¶×uÝeI+wä²$Û2*F’‹lÀ^Kkk±¤«• 5„–ÐÁ†PL%´²‘Á¦Ù@èZ€ÐB‡Jc£ïÞ™÷ÞîJ+âäü~ç||>hÊ™û¦Ü¹mf–§~~à!BÈTv8…ܦžÁ™œ…ÁÙç`ð; ÎÅà÷œ‡Áù\€õ.Äà" þ€Á1¸ƒK0¸ƒË°òåyI½³WRõ*ƒ ™«1ØŠÁ6 ®ÁàZ þ„Áu\Á ÜHÕíL½É cÔ›1 Uoej‡A&¨·aþv¦ÞñLý3y¥»¨z7Sï1Èd‘¿—©;0ÞÉÔû0¾Ÿ©G™Ú…ñ.¦îÆø¦vc¼‡©büS÷b¼©cüSÅø1ª>nEb8û©z€©Oä8ñ±'©ú”AªÔ¿`æi ž¡ê³L}Î 5¢Æó¼@Õ ²B}™ª5ÈJŒ_1È êËXø*U_3Èj‘yƒ7¨ú7ƒÔ È›T}‹©od@øwœíwp‚ßÅà=ª¾ofõ¦þK>Ä:1õcŒ?aê§ÆÔÏ1þ‚©_b¥êW꿘ú5ÆßPõ[CýNý7–|ÏÔ˜ú£A«1ÿ“Fø?åcÑ!ªFèÏLyØP{4Â4ÉÐdMäš 4i:ÆÆ´¦TK¥ši+Ô+˜–±–ŽA†A.WofZ&Ó²˜æbš›i˜–Í´ˆnÓcìjC˜6”iè6ÜPmÓF2Í‹£°Êh¦aÚXLŽ£ÚxªM0ÈNõfƒìÐr˜6{š‹™N{'E>G{;}ÕÞcÚû†´6Œöö >Äà#CûXûƒO±âgLûÑ}Á´/ íŸÚWLûÓ¾fÚ7Lû–ißÚ¿µï™ööGC;¨ýÄ´CL;lh?k=L'L—˜.S]aºjH°ó!Ð5 t ( ö­žÌA7˜žÊt“éiLOÇ¢ Ùg03z&Ó³ #º fOw3}lQ=›é1ÄôÁXèaú¦EÐ0¦gúˆT}¤îeú(¦†}¤aúXŒÇ1}<ƘžƒñD¦ç2=“ùL÷a\ÀôIOfúŒ§2}Ó§#ÂLŸÉôY=ŠéGc\ÈôÙÏaú\Œç1ýìѱaŸçòr½S%L/…ŒÖŒYhÈ-ú"Ì–av1ÇÁÐõrl^û]¯„Ý©WSÓ—À¢êÇzµ^ƒÍj!PÏÁKa#ëË€ ôe˜]ŽxjÔaAÂê°ÙJļ Ø»~Àó‰L? !«™¾èS÷S}­!T_f:r½?@ŒëpÖcЈAKO¦ú¦wQõfüB ÓC¸¨­L?Å {ôf¦‡1nczãv¦oLÑ7é›põ-L?•é¿bú¯ÕiØÍß0ý·L?=U?C?3U?K?ƒs0øÂÎÅà÷œÇôó!¦®_`Èc€sÈcô !Ð2˜~ÓÿÀô?2ýb¦_‚„t)öé2¦ƒê²+\Áô+±»Wapµ!ß8ð´!·êÏ`á³TÎÛDæyL½€e/bê%œ­—©þW¦¿bȧê¯bרþº!ÿF3Ãa¿‰©·0x³§ú;†|Žþ0và] Þò÷©þ!ŸÏ•-ýTÿê1ýcCþƒþ‰!_¤£6£ÆôÏ1óf¾dú?™þÎúÜÿ¢ú× ÖôoRõoõï°ÿ¦ú÷LÿÁ¯žù18ˆÁOØßCÆìÏô`_ÊF  §2kªPª"M\F5ë†2R€Qà[·ÑF FSá;ÔÄ|¶Mç0Í`4[e1ê‚u¤nF`a62:ˆÑÁŒzÂèPF‡1:ÁèHŒ½ŒŽÂê£ÃèXFÇÁèµkÏèFsÈh.ö(æN;‘Ñ|F}°i£“LéC~ (ŽNM¡ÓètÈÐŒÎdt`¢G1z4Æ3(-4ä@^ú‡ÍèJçòçzK{ÛÍSu«ƒÁ±ÀhŠÂk@øÒù©´˜–¤ÒRºƒ…”.B0ÌçÚ]8†ÅŒ‚´•³ãôbÔô?`´”:ZAi%ÆUŒ.1èñ´šÒƒÖÒ¥”.ct¹¡¤èÍ”®0ã:CIÇx¥¡db¼ÊP\Ÿ`(€¿ÐÕI] Ê"]èŸÑµŒÖ3ÚÀh€ÑuŒ®g´‘Ñ £'3ºÑ&F¡y ,)ÎSˆÑVFOa4Ìh£FÛÝÈè&F73º…ÑSý£¿fô4FÃèo=Ñ3E‹žX´ßtš–ó}6¥çPú;JÏ¥ô÷a%ó+–„ëÚ$b–µ´ÂÅMþ¶¶dÓ–„ZÛ[˃m‘€%’]ñGÍ–Héæ@}u{K‹mS@"´1ÔhB WùÉþþIMþ–õ“j"á`ËúÙð`[UØ_5¥•Éh Õû›Šê#ÁP â¼¢U{$Ø4©(öoA04ÔO^ö7C³¼ÂæIm›ã¤Å  åé%¥ Š––×®®.^PV^ ý¯­]]´¬¨¬¼h>fS•–/Y][º¢V"FÑüª¥µVF®,‡nU.-/_]S[ -µ´Eü-‘eþ¦vøž¬ðo®ÔÃH¡ÏeÑê¡F‹ÓÓ¶Sš&! À=¡áÐ&QCk¨Dü«Yâø×úÛX€i¨o´9SiŽWu ˆ³Ùî;qø–v,osÊW%›v´ËÈæHq¨¹ÙßÒ ‘A‰Èj›#Eáv*3V­¦>jj’ˆ'±²/ñ·àìkÛ9´GöÄ8ç·G"|b´Hm8è3Bij$†–+ЊPC><&¡>L* ¬ó·7q|¼v!‚h5‘ØK&Õ:åH‡áP(R ‰Lì}E;o‰_Áª8­Õ6(éC†ØkÄ«5Õ‘J¥ÅPy½]yhy(¼~R#¬jÃZAÚ ÃÁ†šMbqL«^­ØA½0s(ÎÏúÄùÙ±±g8i{©R[ÚjZ›‚Qwp¯…³Ki`S\Emí¢@S+Äë*üA ß‘ «aưÐvŠahŸ²¶¢½ V>ˆÝ€áA‚­‘ùíëÖ!`'GB¡¦µ~Hì5(€Ï÷#†Ô¶ÆÐ¦šúÆ@³™æ°0l…lª¿=ª¬ Úa…×ä-…›ýÈ'€KAzt¦$èo ­ç³)‘ñ}¦ÚÙrþÿú@Øžõ̆`[k“K5îÖö–Hî"ìËHebª¬¥!°¹6j° @F}{8 [¨¼hÒîÎvì1ì,Ã'^[ÔÔäŒgtâ°«ý ÁظqË`#å6!Q´6Ôé³%㪥ðjb…\<½´µX„ó±´µ¡ÍE0a¸oqA—oqqc ~ÃüÐæø/C‹òÐúõ|æÒ!S¿é>gR[rq“—j5GʘkìÙ4Âk+ý‘àÆ@ùÜykC·0™^[Š×a:õd1…åÁ–¾{ Ü¿–ï.³º´¨¤øtQíÒ`$EKk«Š«**ÊjWϯZa1ôÌòª… Ë*ÆÔ,ªZ^S¼¨´¢¨&Œí«KT—Ö,ŠgaíÚ²%ñU]ÕUË‹«–VÖÆ39ÚºxPÚÂê²’¸|*ßJÅíá¶ì‚,Á›ý›"“(‘ÓÚÕbÚ†è0åþV›w Â^äok § –vgÙŒMþ Ó0¥!°®$ SH ½´¤ÅD‚R!µ$ü¦P¸AT;¦à ÕBá-¸19úÁ¦¶ÓZ…’0éˆvÛX[«ÀýÞÐÞܼ¥¶ÄLC¢Ž `È›×¶·mAY+àj…Ø21%c@\3 ³aK'«î^Ëb»„ío»ç/­­­ª\ dQ|Üê%¥ÕeU% !Ò·¸“âÀèO€â¦2³t+ëH<7J k›Ä>›îoÂ/mYKÛhpô\þÀF`%“*BímÒBÆsƒ›«%Ô{ÇΦ‡¸Ò\·¶¾tP@™N5‡\báP‹Š)o#{w$¦c§¡;@jÒç[‚‘yQr&.“ˆZÌÅç œd ¯€Õa2ac×oBå’ŒÒó¨ú-áT= Uš¹ ˜“Dk™¸Œ* Tk§ÚpèE½P±@šå$Õ» ¶6ªR v] ²ï¥m@€0uÁœ×Ú@[i%N “ZjÎJhª Z„ª·Rm+|ËßЀLR"Krúrc[};ßÿªµ'C§fOLª©™räÀ°<“|!)²e`”ll*9Ó°œÞËx\`‹ &œþT¨[Šå•äj·´b2ÃϧlI ¼„)BFöÁ$ÂFFéùTW¨6çX½&ÕžœKq°XV[Y‹ ±®‹`0Þ†Ð&üÎFØdI;±œW‰(K´) øc­L+n ña:U‚@0ÁuA>^+‹A¬FU­@íM‹áà„®Õ‹}n®Â]×PqÖªÛIF¸0xŽB Ÿë†¨ç"Ë5óOdç$%xõ)ø:ìú0Rf[$ÔJÕgaPÁhŠ…Rs<ðpÂA†Ò  ¯íœY9:á:®'Yja âìS¾o0_Û )½ˆêÛPîÀ&±ÈÂßR ú–*$ˆe¤ô”ª¨œ54Ô†l»ÂlF^Vܬ߀S:¢ÏbÆñ:œ Q¿´ø+ÖOYØ’|}xÎ!ô4žÑrj#ç¨Ü"¥ÚéT¿…Ò?Rz1Õo§:Rç)í¡H€³›Jn3ŽO6ÛÉì¤ ÞRì9Ñ”"[¸´ŒêQª?Hõ§Š›ýÂvXÓw«ö5'zÛGnqPý¯0ܰ,ÂzÊjàR¹:£ú÷”^‚,U3a²€ÌâU©IÆ^†ìäC´<`‹ÆT¸œœ8©²Œ‹þÙ}!W•Qz)P`éæú@+² Ô=ëAÔÁœ ½¹t/öÓøÝ‚Rcš*è¤Hõêi0ª@ÄÖ2)½ŒÒEðÐa{œ¶‹’ŠªWQu;ü]ñ××­ŒcÒgés&}ž¾`ÒéK¦:;íN`1E­°Ý ÙËLŒQ‹Kæ{cßò¸ë)ØÖhÀùö¨Þ@·¯à‡Ó½ öÊûÛ¼`M( ôU“¾¦zì-^V›ú:}C’çp¯L!'¿Þlšw•ÏVʼnƦF°½Väa}S{C ÐðÂ?A‡Þ^ÿÐVõFƒmÞfФ©UWl0/¨T@d-À[çÁ¶æµ 8ܪ TæcÕ±ÿñºP`WiCd‰u†L4ðÍ^ïL§Õ̦pï;5ÏëÀ°ï9"Šu¶ïÍ‹}ÇÛgÏL²Æ*C¸žï ƒàÞ9Úr„±Ù†+;¡am³˜þ‚pýD€¸^à,í¹ †±Ã‘Ƹù°0xl±UW0¡ÄÏ¡loó® ‡š½Vq\ÿ·M\Ćg@ØM–†S€•r&Rú7“¾‰²¶ÍÛÍ:öÃ;ô]“¾J#}_i0Õ|H©#à}ÿ•s7Ï&ý*ÀµˆíCað1Ÿ(‹)ýÔ¤ŸÑÏMõxµøte(i4éôKt Û %¼5›ôŸô+“þ‹~¯ Ï–I¿¡ß‚Ý™Ìǘ  ÙØTŸµEsº*t`y…Ç^@|5þ$á¿áÍg9>7üAùѤߡñoú=妄/ Ÿh±Õ–ÃÁ+¼ê²``*}5¥å¥Åµ*+«¬)­ÆÔÒ¥KJŠjK!UR¥˜b¥¥+J‹—bRñù|€ÏW\] •¼µâx>ÕWR]µÄÎ9¥e•%¥+œR+ÇŠÅ™O.0ÀòêªòòùEÅÇAÆôqWþ’ª²J,£¾šâê²%µ((kJÑ+ì«Y´´¶¤jy%ÖE‡°×>í Î‘¸.Z¦âWÖšôÐYaN~´$¼½HB«Zµ·bñA“þ¤|Cé!“¦?›´‡@Y¾ ¢ª¤´Ðd“¬˜‚bj¬=“‘Æ€eDxÓFpïY¬ õéa%ÂÅêÅ“>n ðý`ûõ‡ÚÅ­áPC{=¶.?®Œ²Ký ƒõB÷­Åc[d±B‚—WÇ+`d´4Ä÷f¢Ï^îÃ-À‰[¼uUKÑ Bqì°ÿ'èÐ û“âE^È»è}MÁ ö`± Û¶ðmâ¹&lìZÈ–,#û½%ÔöæŽO"ž¤õÑ´8i7o$’cw0bÙbÞœÆ2ÍÚUù^ÞE\“©(Å&£‰Õ济}½Ü¾‹³ ¼^îíÄ/Ô7Â^±“Ø„ U¡o[ÇÛgM&Ãß×®ãsˆ)±PP §)°è6W?¥=Þo6®çf#¶ƒ¡yÁ¶ ­[7f —ÕéÝmLàNX.ØX|Yðtû¾q°æÅ«00Bñ¼ÜÊbŸ¸÷&ËWÆ[¼èHæ4û Êöj¾’öf <æv„ºnÉÚ°¿¥ßÐÐF.\Ìö ¦™LgôHM¯)GZqê‘Vœv¤§›Œ±S‹Zâ ¥ÎTêA 1Cù»eÕ +8ÔÜjAÎÂR•oLf"?HU“¥#óÝË20ÈöPøÏâQ^d×^4” …  ö$ûç5Àòì TfVzaKñsL@2 ,!–¤•òùË W¾ÿbþ‹øLu)L7saàf€S³lS9¨üDÙ@“ bƒMæaCL†ª;¦ÔYæ±ã¥Œ›qö[ÞÒ–Àf°4Àžôšø­+Î{sìåþm¨[è¥l¸ÉF°‘&ó²Q&Fçù&£®1ÙX6ÎdãQCVQÊšª[M‚·‰œ² &ËQ>‚b±dZtÎv(³Û[ 7ùª½\ xQΊnDB†pÃ^Mœ3ÿ:°ƒ½¢½Åúšöõë€f6›h²\–‡ß ›,Ÿ¢Ìg²ô˜‰ò\CÙ$“M¦ûC¼’agÄ‘Þ ÇàD¯hqc(ÄW©ÀdSPòMeÓL6Í0ÙL6ËdGÁ<Ñìh‰Lü/¨aÔª–Þ[ùI˜¬»0›Í±+::‘©NÄ­ûF˜â°=“ÍÅy¢–®a²y¨Rfˆ¬×:}u3—3³/ßKq4“ƒM³l€ÓÐõb¬”^j²céåèàKÂ_u¡m™¬HAUEh\&›ÏsBë2Y1Ï ÍËd%˜£ŽöeÆ«]&+ÅR#¦z™lBÌxõËd cµ,È"„¤&¨[F,g²2¤#w 7d]he&[Œ8˜­’™ì8Ì+ ©™¬œ£ÓÐLV áqÛTbÃ6¹‡‘)šj zº \Ìve£É*1uš„Ðcd²*mQN5Ùv¼Éª1û[%h*gÔa5 î©ÃeÔbÀYÌ2€±å°ÉŒ»Ž­4Ù*v‚©Ü§Üo²ÙI¦Ò‰.Í(fW3`~`çêbtL¿‰•×‚Õ £Œ„Z[Ñxgõ O©+C^tŸÀºZcÒPç(<"‰ÓÏÕÛ4ÁáQ½ä¦š­+ °u¦²IÙl²õôn“5BïXlª£Õ1 ιÚFP ¢¥á0°ëŒñ!'rM¶y];Á9v îëfÜC04ŽÝM“DÒ‹·E`X ½ˆÀ| !¿hñ#üš¥A"‡£¬Õd§0X¹6†N¹¢òÚÒjdŸ@Œ¸¬œNMµWªw™nŸ€Óœ@skd ˜tÛHé…&Û„ÃßLï5Ù¸ìTdà¿¢W›ì×l´]ÕÒÞÔt"t¦¯;o4âøNfŠ74>b XX,ÈÄpÁ¸c²ß°ßbÕÓ!ß2 Xî…¶ EüM&;ƒi²³ØÙ&;=·î$>ÁïLe)¨ :×T Y°ß#kPg±óØù¦:M- ôb“]€ÝOôÊ#_7Ù…8à‹0øû£5°Ø¥U<@Þ{½Äzz $ðN“.NQÍpÞ&‘©GDœ ÷Äq@÷.aÀÖ.cÐwÙ›ðzspTW€”ÝÛõmÝ–Hì©sI^i*§+g˜ì*äÏÙŽ†5?n„Ëý[ðhˆ]ͶŽˆÙä¡>8~U‘lë}ºd_~ÆÂkâmu>žÐ¼É®5ÙŸØu&»žÝÐË Œ» o4•F`*l;»‰Û–íá ŠDO¿·€Ážë]Ư/Ô„Â1‹7›Ê)J¸÷dñJ¦ò+å×&»…Ýj²v›ÉnG–u»TÁ#¼h'çÑù&û³©´)0c£þãÕk¬}—©„”VLÝm*MJ³©´àðïa÷Æ«À% sµ´áضÓd÷A œ©œÑ{Pü¶§©Ü¦ÜÞÛg)ìî^+WÖ Ä‡—{Pàó‹üF.ºs¾Æ.w¾BÙ î¡a!ðKΉ;±äre#p“å|z Õå4š,Êçqš»ußÙd](v™l7n¨X·íøG3 &¦>Øìo²/(ôæxÇÀ¿|ëƒÉ^PÈv³=&{=d²½lŸÉFÖõÂ<²Ç0õ8ÎÿK`E(/£)±Ÿ°2q1Lö02å¯Ê+&{’Þd²§ •Z¡V€æ—UŽ…ÍÌõ/ìiS-Rç›ìö¬Éžãîh¼†œ÷y–+_ L‰¡O%Ø èËiiÖ@z‘½d²—Ù_A„-m ‚‰\̨ª.òM1åè)…Vfò”Y“§Æ2“§ñ’%áP+0Ž ^`Ôñ@‰7ÆÅ©jiÚ‚ßÙ–» ‚°WƄՌù×°Ç)K„—1¤, „Û¸&Ó/dËzá=9âGí ¾>$ ×m¹O8&U¸kù9&ÀM@v4‰Œ„QÕ €á6¢¦"{½¦r?Yz——ßÎÉè]P]Um”Ñ£Mö:?zi‹°ÑCØ›˜‘-üº¼í-¯w)Þ1³Ž„&Lž€£Ht:whÜv² ØV Ü”ýÍdo2 ‘·Ø—)Â’ã7Â4žFŠvB°mZI)ïRѲ ’§ÚF"ÇH ®Gx˜9 ÷wMö{ßd`ðö¡É>bSö‰É>eŸQz™É>G±{*×›ËÇldzûÂd_²“a!øÁ¬h°'Ö^báP¶ÝP‡Ç}mÐÝp0²¥@(‡ ‹·ˆ &û'ûÊfî\ÜòN&ûûf}êèÿ¦ LôoÙwö¡£xÒ KèÎú@ƒ@HÙ¿Mö=ûÁºÜxNȯsÄY™Õ‰C±íƒ^`ÔâiK€»¿-BĉA뉆;àÍk¨×¸ ¦#cß­ Õ´×7V"¡†¸Ïz{¶2Y€w“W)¯Ÿ‚ÜœŒ7‘cU ¨,@Õ¡z^¯Ö†ÅÕ›8mb*“‚˜Œ«–6)þøÁd?²ƒ”ý+Qó í©A¯( ÖaøR ¿ rïÂö`C wX;(Xèòk† Æ™Bf›×ðÃ$G"­…“,Ú-2.0Œ%ü"!½Dæu¸»8“Ø(x‹Ã¬±-œdþ–-Fk8Û©V¦ÄrZèü *Æß+ôzÇVÊ æ4}êä)^`Â͆a·³8j‚Îû­uvT\^TS³¤¨vÐX#~q·þó½þ†…©àd˜„rç(GéÅ#šIЧÞк¤GmÈüÖ-`?5F¼9õ½S'Ožâƒ“ó½µÖt{K€6…Z¹C„û» Œ>3 Ú\¯5ñÂâ¹LñÂp§v[0˜soاÂâ·fì õµÈvüõõ Åq‹#·æFˆ#Pü ¡z~ ›ˆ{Ë»ÃÔ£ýÑ Ðñï¼›k ü¤×¿Øfð‡^Ë`*â28½-À» ê‘´úÃþªô×&Äér5èØ= Ôº!S( ›Í…€D®)B¦8ÌÈ\X^5¿¨Ü[[Z±äcužž”•.Ç{Du5µO=z]·á·v¨‚Ú9¯8«–Ö–W¢";¿¦², ­¢DÔ¨ª Á%KÊ—.,«Dhqí ÕJjxÌ–”V/Àç3ÀÜ—·¤ºjôF[~œ¨´¼‚ÇÊŠ’ù°‹*«*ë*ªð¡RURžÜ’ŠÕøF’V•-k«‹ŠKk–U—.)*©(«4•WQk9ÄÞ²n]õûРo¹8‹•é{Ã=V8,ÙãX±;É;¾ãnºÛZ_Âi»EÐ~¾ K½j%e Ý÷Q•QýX»Ò*KzÚ.Kö84¾?qoD]1:)ë@©šSÆß\´O ðÐ#e=v?JúÚ—â>º£!àMà%~<°ä^Æõ !áµ]¦¸ö?¿«“Ü7þß ûy`;7é‹“#oßÇÔBå3Ôb Éä¦|…¸>{n’x‰_Öïûñi`v’[àxåWkk Zqmó7q=ä< ÿÖ; W“íkÓ¢_±’Ù–’ØkÜŠ¯êïz’)½È 5*m „‹¹eðÇm˃HµI)¬Äç5íx½ÌzÈP–ô¢«îom àªïˆîÞ[÷¥ðõW$ä<=‚Ù·ðÇXH¬K<ý<ºHÍæ1·ñ„9ûˆ³?¢Ù›hú¼<Íà{!æïHB8©Ø¯Øžž÷$ïÁBml™=ÎS„†Àæªuý,L™Ý…@¯ÿ±øå:|…?ëKüI%¬2öÃrãú_ÄXK\<œsÔF€û&ܦçÀÙb*Ð#2@•jò׊ðÑòQÿÍú$Û‰ÿŸñœä„ÕÇ~ê͉„tâAŸ‹[mø'~{£X·å‡Ç=¦IÖrvNÒ†}n¢÷iËû? -Ð+sdí3aÕÄ}1TáùS.‡Šý>)¡äéKÅ–ÝîHÃ$ ‘á«aë5µÂŸDg;{¬¯|˜ðãëew0>ÍÆ\SK!ÖK ¶ÍbxÜPk½·Œ,Û58é±Êb;ç$¯šôWðe ejÄj_ƒÞã#G‚RG\À‡>ø0+öz'Íz½nÁÄc<¥É¿®×ø>ïùapë­•h±~Àa Ž0Šô{—pÀLð,Ì\xéÆöÏL¸¿ýyøR²M4àyä'½«ð'ÐÞ:ãè~:Ï[ùû3ì,V±pãS+ Úž-Ð’½ÁçoG[@6Ázgéo&ö92±jâõl!¼ðÝw£>–àᥦ)´! º—šSÖ«·N!þ&  DË»ÉV‡äôS—or^·¾sJ×j4ëMºõ2«6Ø*Èxr’ à3Õÿ â‚õ6ú.X¯÷ÈöüÄ.Çyúy™‹53 &× —„ÀägâY61?ÝJ‰3î^N\ÀoSëM–õ¨õ &?ó‚S[†[ ,¹†cZvÿ°IÑÃYßèEDûbŒŠcJŽ gnÞ¼ËBÖhyÑmØ€øfAg ¦8N ¥†ëõ ûÑñ§[ÏŠkâŒÖMÁË ¾æ“eu‚Šq6Á\€§mMIhS ‡®/¯ÛÚQZs)H ¨#Ôp ¼÷ó9G¿Ä%¨epŸ#ÇÇ£n …7ô>S‡#ÊBæf)å¶z5ç¹OÒ÷øÃ>m±ý6¢×ÝqÞ©ßÖÔ‘öËCëkC6 +Þe p•‰Á´Êp~±¾èhm0„e°¸÷» Y½[.bp¬xÓÂè ¤å ßúÓdœi¯‚QT†jjXæ¨/™Áò :9ï^š°{”²)ŒÄ'™Þ¶Lÿy¨5²ü#tƒXÕuÁ@ ´n_LéO×úu5=ØÆ¯cÔŠKR°40Â"ªšâN¿Hã‚P¸Ü:ÈAMµ·J™àˬËþçwØ¿€ÖÖÉùÖÇø°å:9q¯y’ŠÅ2.܇%'3›òsÊú×z‰Ùe‚ûTµjCíõ¥›[AõñÛªdÄæíCãz#`Ödp ƒ’,¿è)×3‘»B,R)\†×ã/ãÄ3QqE¨Ào\á}<%®8¡}G‡|]ÜqÅÕA/•Hx}~L÷•˜â‹°êWr£Ñ¾À$öG¼=“æxÌ…{Û´´Ìãñ}NÌSx3g\ÆzP[½´Ôùå·ø2lÐÚŠqwÎH²ý’œÿõkÂõá,¹É¥Hr9Íí½¦àú¤6<öÎYà˜6x…åùÂÏðŸÖü>Å8ƒRßØÂµô¬}MÌaZzØ9,˜PÝ>DE °ôT®½Žÿê]ì•»h¬Wy6”Xû_81I8±\®mœ`ߦ%ØV¢Z|CûòM\£Ùö9zða›ÄÍžzn²÷û{u½F×ëúSÂ=ž&þÓˆ ¡Ø(‰L·öþ.Lõ?‰K@Bqc*;Á‘d7…SW[PT^SJF‘ÛÈKDUŠ”ùJ±RBšˆ¿ŒC‘ñ'løÿ%¦B©äù*e ÄCð7ð×Âñ½Ï×ðüüˆãÕk/ƒXR–c[yaøÄ‹ã[©¬âñ V|¢rW+kxìWÖò¸^iàqÀj·NYÏãF%Èã“• Íjÿë;¿µò§+gðøL+>Ëš—³•s bø›<.7Q~¯œÇçë|—ñ7‚x|¡_Äc†?öÀë_lµ¿ÄŠ/µâË,|—ó~3¼ŒËóW*Wñøje+·Yñ5V|­ò'_gÅ×[ñ V|£o·â›¬øf+¾Å«wXñmÊí¼wXë}gl}ÉÈÿ9.?òwÅågBþî¸üQ¿'._ù{ãòs ¿#.,äwÆåçAîSîçýê´â¨w)»ø<ïætäŸÎáýîæýføc-<~Њ²â½V¼Ï¢ÿ‡­øåQŽ÷1åqžßoÁ(OðøI+~Š—QþôjõSyþž±ÊŸåë'ã¯Gñøy þ‚ò"o÷§÷!xu™ÇU^áñ«Ö>xMyçß°æÿo<^ßzSy · ‘:‰F$ˆoÏí"Ù¹J'˜ÛMÕu‘ÁÄ“ ÅC0š«v’ada0ƒX{$^ÌŽÂz£¡ñ˜:ר.2®“Œ‡Ì„:WNfQ™ØIrE6/sÏæ‹¬¯‹t’I™\çšÒE¦v’i"3gfˆÌLž™%2GñÌÑ"SÈ3³EfÏÌ™yƒt{Èi<Æÿá=$Êã‡È>N¾&ß‘sa"ß…\ÉeB¼r9ßuvóÂåR¥T¨*35e¦®ÞG.RfÒlšûÐviYn6ZŽA”ü¡"ßõÇ(¹x+IÉW£äÈ^ CÜF¦å».ãcÕ;Èl§6Ü@Ft“ËëºÉ@Wº®Š’«óà/J¶v‘m{ϦR¾ëÞ$qÃBª3µò^¾ëÚxh‡>ïúS<´C£ù®ëâ¡›8ô†|×õšŽÐJu&téÂ|× –°B•7å»näÀ4Ñ|{iÈwݺ¹ƒ/† fålÚÓAæÙƒ¥»È-;ây«5HWnr[”ÜŽ¹;ÆÝñóíÝä¶:Îæî6×Eþ\H=ô>r—‡Â^ ™‡rºÌÖ¶W¶ŸÆo¸îÆöÔ‹X YYŽõøXuïÁº0õIÙIîºó¨…)Ýd|wg'¥‹ÜìþBÃcH®Î]$%]ˆ'ÃCmºÇ~RQ˜âIÊ·óé…©"éIÝëaû‰á¡俓ܵ‹ìÂQìÞATéOòy9dz€Ú&È<ž%±EÄÍdhNU>&@ŸÀ’¹‡Œæ@Š+0fpvv¶{€Ëå2}=@É4¡)!‡ÉÑTù6Á`WZÀƦân¨‚Ý`ÀfÁß„sdƒæD:š³Ä¼°a×?°Ÿ Àh7é–`²Š|ÜôÀÒÀàÁ\QöD:É^ÌìÝMöIÄõp”‡iûŒ¯<ȉL%3`\béD=DIÉÀ8€~­|c}Ð µñƒ4wùPà¶àûÐîí±lW„å‡u¹ÖRu‘@UT v0tèã.òIY‚Uªï'Ÿ¢æ"’Ÿ¡ê"’Ÿ£#’_ ’#’_¢‚#’ÿD­G$¿|ø¹Ýä_@OQòµë›(ùVtà;à2˜ÚG¾sý{ù>J~?"å?B“ƒÝä' ¥C•™ôAr¸Nqý\S§ºþXS§¹zjêt·ºuKRMCh&@äv>·¤xÔ.I-×fjÙZ^TÒ¶“áyÙZTÒ+@r¢ õäG%ºül æÿ@/±:Å-¥~(;¿uHÏ…O@T߀h~âcj@Ãg ŸYžéæýsK©€À-™ÐÞ-¥ñ.¦ó.f@s·”)ú˜À\Ð QŠ[‘ÁG‘ê–²!2ÝÒ@ˆÒÜÒ ˆÒÝÒ`ˆ2Ü’¢L·4¢,^ßå–†ÖêØa»Ãõ0·41iDîýÒˆÌê¨4Ò‡©¨ä]Þ-ªë’F£€±G¥1è–xàá:!à‡*Ázläa‡'ópƒµÉ{ˆU‰JM`E Ñ9¡Üª†<Œ» ®ÓQ©EˆJ7èˆügHö2Û$ó'Rž; ‡‹÷oAUûT6®ã ³TùwX#ZB]€)·’Ô•gqõð{‘°Ð¥öB—¬–FŒ_ÂDÈ!Ò¥FÍ8DfHdÍ P-~P~´$ýP-ðÿ> :é4±|˜¬PTjÍ¥¬K:%Ï£"ÑyÔ{-Íä ò“¥wИì•]R8*µU*3Õl5t‘ùÙêT°°¤ÈV‚û«½ƒÜ V–í»_Ú˜%Ÿ~£]zñ,~˜LÓSûÈ„B°šôðV2¢ä0Zl]¤ P³òØß™z¶žé»í ” …4ÐߥM$§[Ú\çPÕ l&TSËž‘NÝëÑ€*ó<n׳UØöGípTûÑÄ8ŒS}Hò 'هȱ°*‰|ˆŒå ó ºá”ÃÊÏÖ´¦q§%´¶U§ž~‹Tâ@!kúU¦qqAâ×[I*D§¡6ëB¤ÁÐVReÑVÿ42JˆöÔýMEþ2¿åó™Ž)˜Ï¨t:èÚS ¬„EŸ –¿tf‡¶ gqˆ!í’ÎîÐ:p¸U‹­þ®†—\%çò’ñŽ"æ–~ï–ÎSwIçÛ•/•×仦[–-ðî¨tá.é¢mq¾ë(ÍF­„Ö…¨‚Þß¡M쀖ú0n©ï’.ž'v±´r8¬â{êOPåÞf2pL·fî–\Ûø«t¼ªðr¨{s}`âu¨å»æÅzq ïŰ¼¿rm¬R±Ê?ñðº^lóˆYe‡rÌŽðL¬HœþãìÜ(fgxlv\|rïݾKº©CÉô7sô'$¢¿ùHÑŠ¡âïëÒ­Ö'ä'ó]ÇÆ–¾ˆ/½—Ó›|w¾kN¬h./)Š.Ëçª"â€\ž”ÖpFôI‡¼ò¼™)|r ß5…C¦žP¹\»¥ÛÀ•ËP°O³`¶) ú¬MR9ÝΛ Û[ºLMØ*OsÝæÎš.éϲ\ÉH¡Á]–«¨‹œÅ{+ý€wÇc¹§7–{9i…å~h°ƒ7@Eâ1e·´ú*ýÉ*¾ŠïãÅ,Îl°ÊO³ÊÛ¡ü~Ëç´Sêä¨ý‹:°.«Ø.¶›ÃŽØ¬›ÃÆlà þÑ! ÀƒN¥‡x%T»÷:°}#Ÿìaö‡½°GØcöÀç°i¹¶‹Ã-íß-ÉòÄ™z‚ϹT •œ-Ÿt°=ÅË6ì/ìi[ °gسV °çØóV˜ïš£¹Yœæ†ñU$#„× (¼b2ka‘²$ˆ4cå2å&P0ö(Ï*Ÿ*_=êu²: âRµJ­†¸A ©a²G›¡­ÔNt¼»ÈÜCdU>ѳ2=ùÙC2G÷±DEåBU¸Cê="¡ö ¡C‘ITU&µU5®U¬þ ’ø ÉsR“ä!C†¸VQå‹âŠÇ¦ê€M¥è)I„Ê•’”FhCðpË1pÿL N±sC†ÿ.–ªWÞЮDºé’^ì ¢—b¢S%rºÍRœfG¡8…8XÄËQé¯Áß+néÕ¨ôš¾Ñ +ÿ&²oZ^ü= Ët KN"–·±7ê…!Õvf“-?ÏñÈ ón¹j§ôö/"®–§òª­¥ÅÚ(€EI·U SMëO Iï¿(£ÿ¢Ìþ‹²ú/rõ_ävŠ„â+A-C9ô€0Ë„3Õû ÚAÕèè$ŸZÉ‘ä3+éí$Ÿ[Éaä +9¢“|i%³:É?­äèNò&£Ò»ŽŸÔöY†ÒQé½ä¢­ iï’ÞG#A%!vŒ„4¢ø‰¬œ>w ¬ë‡2ÆÀP29r½ŸïÙÕ&„lu ÕÀgùðòýÄàÚõ;ðdfKÞ.)QL‡¦ƒœoc}k"Ò«ÖwTú“Qé#±)ÒmBã–„1ðáÿ¤ÄRï‹-‚üýÅ8ÛËÒ\Û×6@LÌw€ðã¨ôI‡eJ'À§––öYTú©þ¾€d9Ëy¹¦L STú²Ãšo”æÿì”>ÎôüU§ôY®àü"IÈñ½ú€«˜´ú ’81œ419ÿøëØl,$©ÒŸÄý¹)–?÷îÏ¥êÁCÒ²{ÐuV>‰y~?!ŠCÂÿ-†µ:Ó`’quFÀÇÓ€r‡ç–>©Kú¦“[íéQéÛ„åšÀ_Ú´̲L„á;¥ïÜÒ¿£ämlSž·Ÿ°±9’*PgÈ߽Ǚl·,IdÞpù2Ode‰€†îQ»d¥m¿<Å-k5¸:`¾|œ¬êyŠG·`2í “°s*å)ö)l¯«‡Gå“Nuì¤{Nݹ`ñ~à赸ØœáÊøªø Ãù„/*§ªÖgÀ.íY6!xšø^ïÒtQš!¤v¡ CP>¡:'5÷’£rÝr&’`þN9+*»@á•ÝQòˆ|ñ@r€H¦C2“7Co£òÀ0Ÿe¤ŠTË*,ÅÓä9G¢CÌÃd¤8v*æ´Y`¹"Ò×ËúA2FÎ}(xBñi9DfAñAÜøø?E³(¦É’mµ‚‡Ì…þ¿½•þò2WAf±Nò ÇßbˆÿŸH~y´:Æ¢±nËÃðQÞ2é¬"d0ŸÁ|XÌy¬œLwäí–‡H¤m(’ð¿BuøµPSÑt~™âQÁjÈÏÖwËÃdRãÑœìp™dš7XÊxíÙºÔÑó"F÷LJ€x„D¶’Ñ<([ŽDPÁ‹† ¸À;m+IqË£¡Tƒ'æ”c}Ä $Üs´;Ãõ¼„MI_(ï–ÇÔuÉc+Ræ+ÖqÊšíd$?NÎãzbÀÂDåqâ@åmXáñåxfƒ¦¬ûX=Õ-ç@¤¹å‰én9—Z|ÂR%ìdd gn#_æeÎF››fSùz28Oɦ`²¼lª¢AWÞARò ™ëérsËyÜàËò0]8fê=»<̺=™;áëV“2+™‡eë»äüY)£¦øçC7ãYÒÀ”¨ìCžýއã S\‹´þÂThÊGW°ªÁžÔ¨<©Æ“Ê5>>™î$oZX8b·<½Ì6æßîèÉèÕQ±ï»å)8oð9_üd¡‚ó†4Zç`9IE‘'x(ë9*PÞXøÃdú#‘<øƒâO›=¤†¤Ä*b1ÒŠÊébè@®2þ–¸EA!iÜÀe±<µ<Ãö•"; ]’QyúLßä¶ òeÓ<¼Æ!Ï¢©Â›=ŸðÂl};©… H£òÌ}ò,ø¯PSf²l­f–dSXØ’Ê3€/<ðe³‚›I DÙFÕÙ >ÅQßiQj!¡‚ïcó£–‹û13%ÛÜÄB3½œlSðV òÐòÑQ¹p¹$O±[lç-|±N{lù×Ä–8Äf"K"`” `T)ñCLáCÄ[ "ÀÓƒ5èo÷e§$ô3•÷¿ý€ó5þñKQkòÀtŽ…5Æ©#ëVçÀ@˜äR5à•…ƒÄsˆÈÀ4 pJ1…\ ÙXà•‡T  ¤¡x4 Õ=;—çÒ³,ÜÞ ¸±•þ0ÉD÷#GÐCÒût*s•;ßVuÉã@ƒ¨rw(s‡í”ê€ÈòÐÃ8l*·ËÕüêÖÇʽ_ž=u?×£G`:*ϱÁy5ÈÅ2ónÆC|×å)™9–ßMž+6f9:²óºHAE¾c×ÿ‘û鲨µ ¹q•¥Nê¿hrÿESœ¢‰–ò‰J÷Ú¼[ñ’ (1Ç¢q°6AMLfSÿ·fÓìfÒx T(x*mƒVϯÈX.ÆLþ>¹¸Ò ø+Ê Kབྷny!lÖE…š8ÜwËeèÁ‘ãi |žËå5ÖVöЇ¶“Æn¹¢.×Ca#£öYÉ9‚\…{ˆï™Ìœ›‰×Ö댾kZhà¢z <”Ð=:²”Jæ¶¾Dì£+= àäãcý­Ž|.¡ „MªN?LSuUgöÀ¤ñí£‚°.`T=ŠˆsŸÃdU ÿ T\¨Î¶¦ú ˜FâPž[ºÔĹî%ÃòÜr ¤ç ¿†yÊpèzy.П~ož2 2•yøØÃ t˵PÅñ5$Í£*(Œ×;m®ZÁ€3 ¢òRTÕy†¯3–D­ íg’cÝd‚.Îqº8Á¢†¡6ñËˬ»f"e¡ÃÝ9בo€r«B¼»[^«»¢<×Jt‚æÙ-×Õ)¸[_î’WvÊ«`£¬qB^·|"Ô9)*¯ÆÂX®[^Sç–ýJ¦Ù%¯­€öõu™43§KnèäÖâ;Ýr ŽÁ¿.y]T^ÏmȨ܃h¬½Ó%ŸÜ)oí<¢7ooíÕNÔ—nÅúÒ[Ø4˜&Q{Ð,z0è½¼ÁRŸ»åèg¨Sz£[nÅöotɧTæú:å0”µÕùºäH§Üîƒ&íQycTÞd}HnçzSJTÞŒME¥-½4ônùTøü¯ºä_wʧAî7Øú´.ù·òé-Æìé]òò™6î3ù ÏÂ̘ðòYÝò9uYä‰,éâ.ùwQù\–¹ ³C~£âµäÉè\DîÕ’^á éé,)ߪ†‹ª"F\M¾®çAê<\WçÔ 8"ò-T?&í‚NùÂnù¢ºnù0¾?î"ßwÉйKî“/Ý)_* — hT¾Ü¡!ù ÀtE<µÈW@}·|%7gxñ…¶qûönù*üvT¾ÚqeÚÎ"y«íÉ·Eåkb»=ƒÈ?ËwSuU¡ê±è)*Rç;žHéĬP¬Oeþ~<’O÷åƒMs­D¢òŸ|±íÆíûaT-û¾Ä±Ö[Öš‰~?˜•–O V©]+å%àCÑ`¶®ƒy¹¾K¾¡güt¤…¨|ãuxn r@MÛ÷ɧj@Uñ& nÆà–ŽžgcnÅdTîÀ…‹Ê·I¼Åi¹öý¿¨Ìï‚€þ9°vÊwt}§|çnùÏ)Ôºå»` î.ÔíµÌ£YØÐZwË÷Ȥnï6î%*úNù^äÜ;¸VþÕý$ÕTâ=û@ ‚òÀŸ5cÀ fv¦£çZü ØcÐsäÞÓ÷å¹P ûÀ,0P(€® ÅË·Ëû$êÙ©¨ŽebŠÎŒö˜nù~n" òûåË=†°óäó Ó:äs@ÜØ-R\O¦yRö/z*·-gRlV‹iiäV2Æáš¨ë«yÙ©çDå¨`œ`b²tAVAï„'ÝS¹ž ±Õ»*ùJxR<¦´[Þ“o`ã í¶ ¥Ô\O p›®å`ÔØ½†‡µ2jeŠZ†µB!AÅ eåz²°¬Ðå12Åœºs1<€}s‹¾y\Gfên¹[,Ÿ9 V}šJ¢òƒNõŽž‹`vIŽ=»dÌ.ñf#4Ãj…=Ù{sÝòC¼38—£¶â"§;“ (»å½:)L— 3$eº5–&O:ŒeŸLffyÒí!¸<ûA>fx\|fäz\ž4ÄœëìÃØÙ,çlOt:“х랙‘ XGÏÅžôý Ø§[ä—ÞAÖfx2¢rê~âã±[~jЖÈ=Ês¬Üc<§{2ö"¢±ñˆBXZ æ´uþÃs`N·¢"Ö÷ý½®ÐB×ó±—±DvËOà¶~°o'OõSã/öWä§ûùÊ3½.ûö­ñl¯Û¿v <ú X{¹ƒ¬*Ô;ȲBFûœ3ZÜ¿©&3D;o‡kHRšCR:’Ô`„f8P­Ðã¼·_ΗÛEì .i¤”#å‘Ó¤€Ô$…ÈùQù)ù²Gš/­‘_Ä$òC˯ËïÈïCù‹òË<H9WÙ yŒßåx«ò<ßS>ÀX}]}G…úäDõeõc²G¨ ×¼"¯ƒòµ,Œµ|mš6ÊÇi0/Ćò)èAÃ4Ltî¨ ™ÞCŽá7˜}8*UjØOr¯M€2ú3…æÿý”O\ɼ/´×\»S =ïë?óO=äh’Ö_=Èp÷÷$õ)$½ŸšÜÇÀëbu2¾ˆ;;«ÑäõA:þR »Ý!Pª•O~&5¼=¦ÇB½N !•üŒS-þ†Ã®=$“ üÅZö?ª.⣗pެèÌ:’qc™W$ОðI|Ò¼Äý_6–b‡"eè(üŸÚ+¢½”§ÄGŒãav‘iTÕùxkrÿbMp’yõÈèLøPÜóCGB±½!$kõ·‰€ÎÐ#©Í»ïI€öù—@½1£†·X=ÎRß5•É[@—ÍÛï¢çó6×Ó•BAå°Ò+§/ ^Z9L½Ù¹êã%/A8,*§¸å—­:¨;Xð}ÆNù~è!üò«dlŸ:yñæ3Ô‰)Ècˆ~UË‘šáBäŽèrÐt 3 ð&üÿ÷™; ®ƒQã9ÓÈmD“îu˯Uæqí 5Zò ¿ÚQ(ü‡ßN^È>BÐh˜‡Y³ &)w¤ºeëõH!³µ*çÙ­ãÍVT㦠´cñîD~uUOŠ¥Q¸Ñ?éIQ¹šSÕÑóI™[ÈvJß9_ÿ¿¢ˆ_ˆJ×r 0Ïιå7Eפk…—{(óQ5Õ…ìRïÂÈ']ärÉ&awÛGÔí$5¥‡x„7,¶#p«TIȇC~%çÇ [\%V‰Í”ö#zå~P!?v †ë*þŠ8ž«v¼ZmQç×`Ò£àÃnù-Ððß.ÏsËß)¿•ßÍEÎ-¿' ¶÷m3îƒNn^eºåðz抛íxϺٞÙ-T—Û%•?±°|*°|‡%Ãj˜¥VÃŒx¤Ýòçˆå ÀäòebŽÊÿ\ng2ìŒøúWQù_NêkÍ‚‰Ô×yÂ¥AÔš¸CXë²§uÌR”¤±‰Ov2‰ÛñÀÄÕXç*µŽã²ÃÂs^cw$F 'Øüûùy8¿ cÕñÓñ¼]ò7¢<]”ã¹Ü‹è‘íù+Š3Å5òb0¹¿í “9PXðR,à¹ÖmÒûÉB„ÇŸ@뙆 4¿Ôü¹ÀšÐÛŠï8GåïvËÿ–HyÞnù{Ü!>Hü ‘}òùxOCÜs_œ•–ë TÂ'ÿÔÑó|ìCÓñ=SU—õÁ8ÔeT]޾Þ=ø¹¸É ~È©ÁLÖ9N¦9P ³§[YÊ­gØü>¨©‡$Ré;@À¾Úu¸Kþy¯ÏÚÔ®|Ÿ*¬H‰‚2ÿ™o?™ç³TÅ…Ày'[on¡`œ]0 jK÷9z%X§ W’ʨŒÇÔxÇV=à0ïo‘üÆ‹‡4•"¹x¹‚ÇeùüÍñz<0ÃLJÑk7¦tã 5~­™·÷›=šàþxQ OWøPû¼_*x4D À*R?¾¼’÷Nj·º0 [H*È V)&K!^CÖ‘ •oZJNàq„œ ¼`¤[y^¬ßC$ëg’‡W×Õ•Àa•¥—À_ˆ?@7¾¸aoÕˆ‰Â‰¼”ª«œÛdN XèUÒÏÄÃuÍ…â´Á.äüjò*õ爳w! 8Aªû5~ ,“©'ª'YäeÝCÓ„€Û˜©«Õ5Vq&Jžº“¸ïµJýÉJ]véZµÞyš§XOó†®ì$Y¶*4¨>ߎd·_—´8Ã.^¯6&)N·‹ƒêÉIŠÓìâ I‹M»¸)é´¤ÚÓÒœ´Ø°‹[’§ØÅ¡¤ÅÌ.nUO±Š]›ÔÑõMí¾…“—ëvy[Rôš>â4-K,‹j·oW7&™§xS²EWìÒÍÉJe»tK²RIȦžjs5¥¸°ZùµÿÓ¶Ù´6„qü™ù¯I«ÕÆL£5¾·Zí‹oU[c­DMIJ‘bT,"~+"âëA¿ƒ^½ÚKÌÀ‹À‹?èÅ{Aú̳³Ñ†= ÿÙ™ßÌ. ;óì<ü•%¨ti$øÔ`èo%DP "£"6ðeê3Òsc-tñÂ#ÞÑ÷Ò± 6º(1Ä&w65M¹L3­$Q›;©×ITo'µ˜Dmí¤ÊI”餆’¨Üzªmt‚ ç°-¶85`U1KõÛCô ²#Bø]Vfxu,µï‘·TñMS¦ vÆó™6³+fº vË©]Ìd ö´(´ºé·ªf°×êoû,Ý3Øoé¾Á€¥Ù/–ú ]† \† ]† C«—R‰ÝV/ġڶº‘ÉyfX˜aFeŠ1çÎsõ.ƒ#â0ÅQq˜â˜Øóp\ìy8áìyãb1ÅI±˜â”øópZ,¦˜‹)&ÅbŠ3ÎbjP)βƒ)–>ƒs‹iL囘^yK¹¦np-?â|õ%¹,¿‹Ñ0cI7qA*꽤†&¨€nÑôˆ¾ÂÑedD¿"+ºŠ>5©n¨[:ð;O‰z¥ƒÇwÓÁ.O¹<ãòœË‹UºÈ{Uå÷Ö}à¼ÞÏòÚ[Ô¿†?ªGý&”]æÆEÞ¬~P—Hé9Ö+¤¹·Ž"?µ(¤ë^oz]ðz'Uö:ïõª×J¤ú§×_‘®PKÕUì<ÝU)´PK9A'org/hsqldb/util/FontDialogSwing$1.class…QMK1}é×Öººõ["‚‡ÖKÔ«"H[AhQ(xOwÇmJLp[üYžþ”˜] ‚†¼ÉÌcÞ›||¾½8ÁN,7" Ð °`¡v&µtç åVû–¡Ò1 1D"vÒèÊîLvO Ã^«?SÁÅÌqš’vü¢héåø4§F=+c¥NäÆ& °b[!jBl#`Ø7YÊÇöA%#þè¤â—F»®ʤÙg3€!¼Òš²ŽÖ’eh“•Ð)¿M(v »ŠéKëÈ3½Üy¹qFÂý<3´[ý߬®pb$, „)eµ0[·ä†îIŽPö{e¨ú%—|x³>«{´âooÕðgä‡ay¹9'T^Qú®–°˜çþ‡–°êQÞY.*õ/PK ûa\1ÆPK9A'org/hsqldb/util/FontDialogSwing$2.class…QMK1}é×ÖºÚõ["‚‡ÖK¤WE¶‚ТPðžîŽÛ”˜à&¶ø³<)üþ(1» y“™Ç¼7ùø|{ÐÁ^¬6¢ °`“¡v&µtç åVû–¡Ò5 14Eì¤Ñ7”ݙ잆ƒÖ`*f‚‹¹ã4#íøEÑÒÏñiNmöu¬Œ•:’›˜$ÀVˆm섨!±‹€áÐd)ŸØ•Œù£“Š_ízR(“ŽæžyÔaCx¥5e]%¬%Ë“•Ð)¿O)v ûŠHëÈ3½Üy¹qFÂý<3´[ƒß¬žpb,, …)eµ0[·äFîINPö{e¨ú%—|x³>«{´æooÕã°gä‡a E9Z*¯(}WKXÎsÿC+X÷(ï,•úPKà%Î1ÆPK9A'org/hsqldb/util/FontDialogSwing$3.class…QÛJ1=i·îZW{Áz|h}YÑGE^@hQ(øžîÆí–5Á$m¿Ë'Å?Àg·AÉL2s2gÎ|~½8ÇA%T\x åžÒ"Öj*#{Øg8V:Ææ9FÁÔ&iÐSÒvžªx8§oN.ÀàßJ)t;åÆÃPÍi¤\ÆÁÝh"BËpø'³~b¬ $qÿ§qµàö癡ÕìÿFu¸å#nÄ€K CóÎ=#l[¥ŠJ5–2åü†V/Rp‡ô'µiÚ¤ÝVÉ«‘¥6Q:}{A¶H+¬-Ãu²`¥^xCq/À§Ó¡An`“¼2å8yÄûPK?½‘MðPK9A'org/hsqldb/util/FontDialogSwing$4.class…QMKÃ@}Û¦MŒÑ~`ý<´^"âM´­ ´(¼o“5M»˜Ý¶¿Ë“âÁà'iAÁ…ݙݙ·óæÍç×û€ìº(¡â êb5u ë åóXÆæ‚¡ØlÝ3Xm † L¬äHTú$B†ýfo̧Üç3ã‹©Æ¿ÌSº™–A+]$JÇ2ê 3R¡ ›Øò`Ãap¯xð¥j"CÛØa8Piäôsý‰‰ÿZIÓ‰y¢¢ÁŒ¾9äZô¹ä‘HshÞ¹£…i«DQ©ÆB¦œßÀ¤óÃ"ýImF6)B·%òjd©M”Ž^Á^-Ò Ë‹pl(× o(ÎãxtZ4ÈU¬‘çRŽ•GœoPKqçôNðPK9A'org/hsqldb/util/FontDialogSwing$5.class…QËJ1=iG§Ž£Õú~V¡‹©›Á•"ˆµ T„.Ü¥Ó8L38‰Ößr£âÂð£Ä;£ ¨` É}œssrïÛûË+€mlxAÙæPKG>‚u“†PK9A%org/hsqldb/util/FontDialogSwing.classWxÕþGÒiWë•%’±‘±±OÅÈ– ¶elTl£³ gÓV§•|øt+nW– )HH%¤â‡TÒ'¾“ÃÒIBzï•tRHO€”™Ýëº|Èþ4oÞ¼æÍ›yovî±ÿ<ô€v Wá$Þ¬ag…{‹÷Vá­x›Æäí"{‡ŠwÊä]²vŸwËô= Þ«à}*Þ¯a1> ¡ø‡TÜ_…ɬ‚5,ÇY™Ì©8'ˆ+xHÃJœURñkX…Gdé£Â±ÒÇ4¬¥U¢ôqYù„‚OjଊOÉüÓ ÕÐ* Ïà³B>§à1 ›ðy_ÐÐŽ/ ìKÂÍ ù²¯ùª,|M¸¯+ø††1ÒŽ9SÈ·dúmßÑÐé­}WŽý=ß×Ð+’à‡B~$âWá'ø©†Ÿáq?ô/4ü¿Ò0€_ ùß à þNÈï5üO(ø£†#xRÈŸDò¸@ÿ,Áú‹pÕ0¿©ø»(ÿCÃ?ñ/‰ÉS2}JÅÓ2>#äß*þ£à¿*A%R©L¥r•*Tò©T©’¢’ªR•JšB‹TÒÅë'ªVh1¡*bLÇb‘ØŽ´®ÎîûF†õü7'¶¨›h :quª»­˜í1çˆ6 ‹ÆÌqc:êôY1‡õû†Gz3úÕ£ÝVÔŠwM;Ž#,síj³gØTÛ~OÌ&•ð‰ÑQ+:FXQˆè>n†OtY§³(µl3c©z¼Ðrõ8ïnw[“£ÃçÛI/°:A#7™y説Œ°äX©CWŽÏÄÌ8aý€Ÿh;nßm›v"ѶÃ1F Û4bÆ„Îx¾ñ¸1ÉáYZèIŸHy¹ŠqŒh$ÌÆwGbg¡<Ðt„PÑm±bM8nnT{"FÔâü4¶¹©:FøÄ 1uȲ5Å6ÓZ”æä¼œ’Àü㊾ʨ sZT…uƒÍÙ5ÂaÓ¶×mÚ´‰°<ÐTúlêîpÔ=‘Ž—ã:^‰»tœÂij¨V¡:ü¸Y§%´TÇKñ2Ž•«©Ó2Z®Ó :O§zjÐi%Ï–¼EòþI>}Xn‚ÖïFUNÈ;³-&«t܉[ùè{KOoL"2¦Ðj. FÖÐ…„5Å‘ÍÞ êºÍôþ_ƒî¨aÛ¦­ÓZZÇÇíâ«ëí÷ÙåYMµó-+ñäñXqs"nMÇø),vc4£f؉X19ÇE:nÇ- Øa‹âwÓ€Nƒ´W§!Vè ?ïܳãm ¹¬¸G§+hD§ Òé0îJ®¢¡UžzWÑSoì>nq¾s¹ntoÎ¥ü˜BWët ]«Óutý³È]¼ŒƒŽé4*Š•™úS[\)ø“±ƒÿvÊ6o²YH»-B¶ Ù.„aeí2ݲ=}M «¡¹¤{ÙÆìhÌxrÁ³$¸øeô4.eG"vÄ-‰£RéVÛâÛ9iÅÒv*‡ 'rÒôʦ+èìsKq6ûŒŸ²bfÌé(]J• ÓñjÓºRÅ6gÈ­b\?uÛSpç|”@1ĵ*þ¸%ÜèïIv æAËŽ¸õdE Tì²ÂÙÍ•×åü벬¨i°•ŠC#‡{Ùykò9švº£>ýÁ¸5eÆÓ„ ùǽ“×1_ângŒuº©ˆØŽé~a/Ì;®y’ ·"\Å %"YúDçgí‹SÇ#a»7v2·b\ øk¸’“3`…hÉÕÆ@^zJ :<'HT¾*r ûŒÉHôôGÚ–87•ì'–Ž•ŽÈbNâ q*29=éewE^8²UÕ…Ö2ô`Ü7ãqsÌË%íã¾Â½àr!¼·cŽõ;ædÑ×¾xWþdgw­áĈJ.-óÒ’¿îY™F!æÈe0bf®CH?“˜cD›ÿ¡ÈJ¹%b'¼êËQÍÛÍ“¥Ë‚»Q9{Ç£äl*%äK<Å%’_àB(vÅ9匘6wµóZÉCæ)§“;³ŽâZfÁ{ð^¯U—±VÍDqV–fPùi)(·žŒ[ ÇÊTÞB¥ìÅR'²}w“ýž3…7)_Á«þ@‘—"Ô8R iF|Ρ¸ifŠ@îÌ,ìHW!«ËW-ý]ᢩ™q®¥^hü¾ù±Ñ"v&4®ÒQÁõÏÇUš7NQûÿ\hÖªæSç>Šb¥à^ðŽ­Ô5%,õ>‡ÒéÚÇ­™ÌgãòVûâ-JìYm:¶$0Oéˆç~~/Xmçϱ†¥ÎðøÅФ¯f®7áfîOŸÃ|Ö³œ(Wþ¼<ùj–s+ȼ&­ª;Þ–žßž¹sÇ;ܱAZ+wκ;rGïŽwºú*Ûæöžé«xVÇ#·Éð5Ï¡ìÈ¿*¼¯ñ–Ëö£’ÿs#@ùT'@ITÜW¶Ž¹|çPÙ< …'~õª’Ð*fQÎÓº²«jÇ’XÄì9è)T‡RXò×0hµs¨›…?¿IK“XÆl ËCsX‘ÄyYt}º!†º!…•Œ>ßE¯ ùW»ø 2øÆY¬I`M!³)¬eüº$.rñëçá7$°!‡ßB€ñM|³‹oÎ÷$В÷¤ÐÊøŒ?‡‹Z’hLaS¨÷ÖÖÏaóP í¡Ö9l™ÅÖ¶¦·1Ë*Û½á’ܬ<‰ AîLb3)t°õÝI\*vØãZÚ+;Ônt7ØU‘Àޜٽõœ¦ËÒã%é‘-³J'[êJ¢›3“DÏ._½/…^–õ%±¯ÞÇ›%qù•ÂìÍ0 ÆŸaÖd˜ ¦E×d?Sö¿BîáµL+QVûtY#ß«»³×îN––óxkʃ؟Ä—Â@Èub0‰¡æ$†ùïà®Hb$ p¹`”n™t¹CÐV†¶f ‡3wþu¸'íÛ{ÆwÇR8âgq¥äóª^ÏR!¾EG‡¼çë°ç ï%rɃL%Þ9/ÜŸ7­÷ñJfÓ×grŠ7•wx]y‡ñcg 4TÜÒáFÝød"›f7dØÕYФéͳ.¤¥¹¬(({5¤³g²G¿•½(ãñD³}לÁ6ò_›±qÝ9\?Ðò(VsÞ9"†·#s£B¸ûÐNþpFc,§±¦@ÃÌj˜9|(ßQvq­Š7àijݘUºßåT¼)³qT¸²£å\tüã³ØY»èaL„Êýǃ¡ $òùo†*ý'‚!Å †Tÿd0T[é1UüSÕ?Å´Ê#SÍÎbO vÈïÌazäå‰dº‹C¶<íÃÊô¸6=ÒckzìHÞø?PKý0©Ñq ½PK®Aorg/hsqldb/util/GreenCircle.gifs÷t³°L``øÎÀÀ%*,3õYö±°Üò÷wõ÷ðoikÙµu×/–_¿nýb£`˜‚ÿÿÿ+þda2t@|PžpàhbøÏ)ÒÁp°‘™•ˆAá@C»€<—€ÃÆzƒ‡#]l¢‚Ï–HNLòŸ£zKdç'Mÿ•>ÒlÒ¥+½š9î²±0XPK{½Ñ¥PK8Aorg/hsqldb/util/Grid.classW x\Uþï¼7óf¦/é4Éd!3]°âdR 5j7¡éiLm°%-K^2¯É+“™03é‚(.UTT¤…¢¡ZÀª;d©¨h÷wEWPÁ•¥¡œsß%i¾~¦{Ï=çÜ{ÎýÏrg}éþcÚÅü zp‹}¼ û Ü„Ž[xq›~Ü„Oðú“AÆ Ü„‰ƒÌùs>ÍÔ!îä£îbéÝ|‡™÷Y¦>ÇÔçy¸‡‡#¬rï½——_`ê(Sy üÑ ¾…oóŽï0ï»L}©ï³ô<ü0€áÇ<<Æ‚Ÿ0õS¦~ÆÊ?g•_0ï—Ìû/aÁ¯ ü&ˆNdÎãÌù-¿ãåAüOñü‘oñ' æüÙÀ_ üUÀŸèvRÎÈØˆ@݆ÖN«ÍÚ•k[íŒØ©¬“N-ðn_›Nåf—ÅÌ ‰{·Ë8ƒYú©BÅ'ßP׈5d Ô–5Öe¬Ña%v”8TKŽ”mq¹aÑ%`8ëmgh˜ü:›Ò»Š‹€³ÖÉdsÄaÁºŒ“P{fÉEQÍã\ÄCùœíL'×ÛV‚<ÚæÚLZ©¡¶^r85Ä×ݹÚÊY5®p,ç$Û6Ûƒ¹tf›£ÝÊ‚g[—bt¦ÇRÒrCÑFv`}:ã\9ÕÞÁL:™°ø$_v`³!M¿Ó; N YôØ;°:c ÑÝ·2¹ ?[sIßr [n¥€kÙ, w¦„¢1dçÜË…c-3^5Ü ÖÅZfºbuÖΩ”èu®¤3b3å ê*ºo‚ÀˆuÑslчúØ .°JUoμ¼Û½ÐH’ Ÿ•HÈúÆFVŽ8¦•Ø1–͹ˆQ4‡­T"i¯Ùi3¸µIÖ²BÉ;j9,­ÍiÒÝ‘ôXÖîNï´žéGó[‹:.Ä.½f·C‡Vfìív&c'\Pê‹àM¯–á»qªnõÐ4DgT®ª­äàùc¹´Ê=&a r œìhÒÚÃæÈ½™Â©‘¡Å¬ÝÅÜiŠÍ\-]&r#'§Ÿdb‰"¿"LØØN.N9ŽÂ´Ú±’é!>í)›ÐkâiüjæÔTg›L\ޤ‰¿ã&F˜Úˆ7›xÞnâFÜ`àÏb›‰4ÿä!ÅÃÅÿbÊaÞ†Mì`êl#Ÿb©±d²ÅÄ¿ñ—1¿Ÿ‹‡ÿ²©¦þ‡ç \càE'0ià%' O!hƒðͺ)¼Âgb3¶˜Â~â-¦ˆ ‰›ñqÆM†˜e ST™¢š‡Ù¼9ÄÔÆçR6õ|Ô5Ì«u&FquÔ\c™,¡-¢ÞD†õ³<\k Ñ`ŠFÑdˆ3LÑ,"¦ˆŠ¹¦˜‡ç¨‚Ó™¡¶áìÉÄ€4ny”o¥c7Z);Y®àÊÔqk•+xƒµ'=FAm®È—×m¥¨gdñhT¢ñ ÎôÈh:%«o&fe6” „Â4\lp»Üt72¶*Ü ™X“´Gd‡+}îØAéXê9›­ä˜M=Ç?¤hÙ»*o®:…‡ñ¨+gåžlΡšÎáAÊeÊÒ)W…Ý`Î)„;§N¨‚oaýÛdrùK…>˜±©©'®®\Ä•Ï\õTí¢k•í…+;MÅËÉmÖ­Æšiå.½à¦SQû•çL}£«§Þ‚c3ìä¦>ÊEHü +s9¹±‡ÉŒµkƒ“²ùµJRC§2ËÍ0 U’#íêX îwnl:]]eŽÃ—ß3µ3;9·ºwË„‘Ü0­täëfºᙕ©öž¡ʹ#¹Ý+j#ÖnºzÛÍÌóenNiÆ*;IG¾¾|i̧¯^=ôÕ¶ nvDéÜ'iöpÿ3u9S_“3u:9_¬æKÔ|©š/Ss¿š-5ÈYç.gjÙ’O RÎŽ’ïPúÔ‹å<¢æ”â§ÕL½IεÎʹ‚wÒj>¢€-ñ ˆ¸öW,ðV\¥Ä5t ;xksŽ(9=@J~¼ô7G¢aò¦FùW{uy„•c´ªÏ£!ÖiNäÑÕ@Tëk44Ò‡áÎà]¼d~˘W@s\ä!"Zôäj¼Cy2BÒhÞo=–Ç\6ÑôõÅ5©µP:þÙÖãnè´cûXÚ¶ˆWM¨ é¶·‘°õ^œ]ÀâV•«*?)gÛhŠDzx¼(+àÕœ­Ì/àœ<Ú‰âO°€siZrÜ-æö^“Ç7H¼%÷¡ƒR°¬êxd¯•zF†›6݋בLiZÙ`›+z}Q¤ð`é‚–r4s+J9y3ç@tq‡îî:[íŠèýZX÷&ÜMêÈeJÈèDÛ#Þ~–ú,Ÿj2Öûõ„æN¬£'\óPj”ä¼X! bhª/š¦W¸Ážñu"•¾i€’òØXb¥Ö¡GÝõ8B{u!ý+9ÙÃz+\™Ä¢qOÉÖ4O(:¼a¯ ÓA†)ì]Üá£+,5‹¥~6Üdï ûÊ—•N5ù‹x…½ÜWb®˜½¡„‡ÀŠªIj•P‹×§H™±b¯—0ë›o´Œ‘t¨òòµœº‚¬€ó¶”Ë1†·ª /¢ïj©&k´IœÇŹúr}M´º«U6¡kN} 8¿Ø“ßk•ü›æ«¥ù;‰tèÕR&ú9sõ#½gFBÏ„ ãðBmD¡ÎwMÖÊ<ú¬ ë=ÅÖ«— ÈbHŒëK‡·©â ÷ð:yMùOÏͪŠ#4ˆF"?€fx¢çŸèO/þàéÅ:ØÃ¿Ì”8In3*CAÙ­™ZV×}x£ê$T4-üŒÔ<Œ ô©Œò’&½¤)kû1Æ®9òõ÷”3/Ï$8ÕÎ&ËôkOYŽÒŠßó9|t¤tts{ÑÉý¿ªAþ¹©TkI•¯kPܺþÃîûò2PK5É\Å OPK9Aorg/hsqldb/util/GridSwing.class…VéwUÿ½N’—L§¥[Š¥ û’LZ£U+›H-…IA‚EÀ…i3mS&II¦-â†Z÷]q¥n_üPΔâ±G¿è9þ+žã7¿Ô*Þ7™lB¡óæÝû»ÛïÝw§üwm@;¾—± }lÄ~Žb}„ã  gV‘!áØ>*Ó¶Ÿã0ÇcBxDšcA±>.Oñ“û”ŒãФ3F¼ ÈDT¼éâ1T‰aŒÈˆa´'`Ȉ#áAc•8‰”Œ4LÛ~±àIŽSO3¸FMmÀÐöjÚ©Pz2–í=$¤Ûøˆ®EõTš¡þ˜…é÷Œêƒ&é©ä$)벺q3f„úI“L‘ε=–ˆ™;$ Ÿ ]É(ªÖÍ®¤1OôiqÚ{ý½"Ï3E uu×ehiŠÑP ´¤„«Š˜Úà‰°6f¥Lä—˜&Ǧ•@/C%‰&'m§]'2”­M vi¦&BÊ( _3ÆõNò×èï-ɯà& Ôè/GPãÒ¢QÊŒÁ9hèZŠÁC6Ù3`Xî/w4¬f(–Ò­m×yÔ)ÄÆR°>¡'Ì ûF·Ø[¶ Ú¸™ŒÄNÛö[iŽÓÏp<ËñÇó îDHŠucâ Tsò"^´¢MÁ 8£àElV°RƒX°ôI#t(×Ó¦££+*x /+¸÷*˜Â+ ^Åk ^ìÆ=è¦ü¼7¼…·9ÞQð.ÞSp¿ó>>àøPÁG8K(øŸX%|ŠÏ¨çpžãs_àKªQÁl渠à+|­à"¦|#Þ¾Åw MÉÔph„‹dKÛ“ŠE#‚Q†õÅüZ—'Ô96SÚ YàÙ.¸ôÌZn¶-¶ñ-¡ÎžNŽDmÒ u%ãcÉ„.úxÝRFºaÔtyuj(7¶u³Šš¹ô¾9ÒÔ w'{áêýåî›G7ô8E=ÃÝÍ·¼LýÜ… Pù¦¯Méñä„Þi64n“±Ú޾]öˆ°=ÖbX[Öfo†¬VÞA4‹{¯iã†Y pÓÒé3]2¸ìJ6Þ´€#˵·Gÿy÷¢ÞÞÛ¸¶óÉ–fͪ h¾›Åõ5ÚβsèfOGæaI«Rˆ q ¥é©”XýÖè/Âî¢1HÇ’"íº›¥4'cQs„Ñ8¯.DkB(Åc"æ0©— žJî@ ?¡oˆR\;E-š.Ê÷p6´ƒ8ïÇjú2o¢O²D¿4!~hZ+Í?zVƒ‰ñIÏ»h $£Õ§Î‚©ì *TégHWàP‚óÈ,\WÀ/Yæ wÓY³FTÐ?úò«—áhnÏÀ=cchLÚ˜äZ¤ÑNžç6¨Rsr¸õ7¬hý•ç!Ó¢œ¯‡4ÓšAÕŒÚ<‹êËÓ}ôT -bG‡´Éh¢ÚÞëh‰»Dó?ÚÑ·äõ ¶ÞmGÏ!¶b›¨µNá!—þv”÷ÔCžDjËQXÚán¼­¾ ¯=ÒêkÿÒ”DžþÙëµUþ…›Rcµ ô×£2Cå ­Ë5Å.tç$Û.5H}”ÓÓ7ÒÖ7Ùú*58‹zrSq Y˜G|EmØßਤõššw ³>©ÃQרá”:\$ZžÁ[¹Ôáöºi×4³´¬ðºçÐ\pW©¢‰~æàãèkË`åe¬ª‘çœx¼žàVÓ­_yk¦±Sõz¼î Ön•›d5(6sXG½+e_‹¼t¸¼.¯ó"¸×Õáœò‡™V¯Ã뼊õ ƒ Sn’Å |༎Uðpôrìåx˜ccŒ#LT.b3û»‰èÔÿPK3ëßß´ PKŽ®Aorg/hsqldb/util/Hourglass.gif¥SÏK”ažjK34)%ÒL’:ù&• š‡jK„,÷Ôt0°< ]¤p+"…hÈCÛ%»lH„ÚBdyPœ Zð ^£S—ðPR<ͼý Ímxgžy~|_{G[Ëá‹UTEßè_"&"%‚w!P` BA)À93±+1|V “‰’ÀW52©*) ‰L‚àÀmX¶lÓð;^‚„ !ÀÏZÇXk`8 {"A4œ”Í*• ÆÑV8@4NÙ5ici´à ü’A–-Ãyo%ÌÊ ×gg­aQ¸\ca*¬Ê So¤l–! eÀÍp³lÛì0ýpo\’ic ·Ê¶AÜ9¶ÞJEàFš>;kª(ÌW“k,ìQ ¸Íž û¬ wݽc_u;à!¸Bv$' ÏÄy°;4<"Ÿf¿ãKÌŒ4}vÖ:¿ļEÌ 1DßEôÑDýˆ 5 ²Däx  qÿz¢òòòšššd2ÙÜÜœJ¥Òét&“éííÈf³£££¹\.ŸÏ …ùùùÅÅÅ••üwÕÿJ¬+5™ü?ð‚J§ö—äŸÌÜ*Yؼ«´bðýíÊú›-•TwæãØÝ¥¹ë uG)¹møÄ/³C‰Ú‘ ÓM=S}Tv¶ççé¯ÍýÅôƒ;G?ô/¿É<~¸}ëtß2¯ýÞQñöÐÓbëúÒÉÕ+Ågãdzç_5Ž+¬]½SÖunb˶¡éêï]ý©û§ª·¬Ö.÷|Þ}r©ëòë\wq&1yp/¥_V´î»v©cdx¡{v|¢¡ýùžÚÖ{sêß}jÚ¸)AGþPKE*÷2„ÛPKŽ®Aorg/hsqldb/util/Italic.gifmÓOHQð¯ Z…ì°’‡‘°\Ëu»äì9 º'…–À`ÀB† ‘‡³°ÈÐ!m£¨X)›‹9ÑSè IO›ˆvÁ]:Ôä%$ØoëÞr÷ ÷¿Ë‡ïû Æ.ž;¥ m(`?ÉÊIV®dåµ\Ž·üøƒO_2çPZ\3¸¤2«0 / ׄ€Ð ‡À¼äºÃy‹)ƒBe\á¼Üìz”’ŽCË¢aPU©(%À\À £<“§³NkžFŠª 'F<Ä\Dlô(:‚”>-Icê•,‘õvaÚHh:B”¤CZ¤Aª¤ÂJ<® [@èÐk±˜†gÂMÀÖ BÐk±ƒÛ[B¯b8(«Å"b".zl(A½‹H{0]$lh!½ŠE”Jð<¸.lB@/Ïøs¥Á5•KÖÁÂ$ó×-ÎL© ã¨*LR:t,Z •ªB¥Š…<å:yZ)‚jœJ >eŽŽ¤µFc‰j¶"ûŸVVÅÂîîîÎÎÎöööÆÆÆÊÊÊââb6›››K§ÓÓÓÓ¦iNNN&‰ÑÑQMÓ¢Ñh(êêêjooüëg2’É$k¥s¯±®ü÷pzöw‡€MÇÕ™ ·ŠÀÓÁ…Î7fsKóê“Öåþ)¿82s²u6ŒÂGçaïPGŸU¿U׺Xî›iø¶5üùÌxänCáýpáòxÿ=þ¬»öò¹ÎìÏô¶ß™þú©Còë¥þÙíúDøþÀ§#cœ±œýþ¬±oáê9pûÕ©îT·vó׉·_ŒÍލu,ßdÇ7gWEàhøu¡mbáPK&ì!ÄPK8A!org/hsqldb/util/MainInvoker.classV[sÓFþ6¶#[ˆ¦\B ˆ´€/ØnÒ %„KÓ&†â¥{c dÉHrˆé½ÐËsgúÐ>´3¼ä¹0c2e`xjg:ýKmzV ±IÝF«³ç;·ïì®ôç?¿=0ˆïTôâX oãx ¯bDÅ Œª$žŒâ”ŠœVpFEǤðŽ|S ø®|{OÁ¸´šB^Á>©9+…sòñ¾‚ó*¶  `R†ù@ÁÛp1Ь§TLãR32ÞeéèJFqU†úHgØ(ª5¯QðÃ*8o0lž¿ÆçyÎäV9h†ºÆ ñNµ0Ÿ™º:Q8ÃÐ}İ ïC(‘¼ÀµK‚a½Û°<¾pšfÝ!9\å†Å°5Ñ!”4[_ðxñú¯MòYSAT(ù6¬yû:™'ÿ5ëè‰èS0« HYžZ(ŠšgØ–« ¤€¼Î)(3DM?g )¤T4¸¦!‰„‚ëLT5X°)~&SfMC 7ˆ&?^Ý3ÌœOܸáz¸<ùÈ ­¡ŽyâxmföbŸ†›XÐð:ÞÐÐØ[-¯>v5a #Ͱ¡¥5¹K!>Á§Ïx?;{M)‰Ïð¹†/𥂯d€Û =T¢Èº¢ÆîÙŽ†;øZÃ~$ëÓé’>tÛ)g+î ³4›•ee'¨Ic>åŽ>S£†ð²Èú±ô.Ÿ³ÙlöŠÞß…Fý²*ý­ §ô”žòÑS>Z={^}¡¸媚·=¡{îé »®¹¥Û–ÙЃ¡eá’¨ï·xU”öë ˶2%1Ç릗|š›Õõ“Â4ª†§WIaÔÌ–ñMëèþvÐ]¿Mn–©¾Á· }”e.È2hz[–´1Ú—Ÿ_óðšô†fõ5@ªì´]·J«ífØÝ‚äíB½X™^ÅnG´93MQææH±(\· ’nA1gRðœL·È¥z’:!¼6tûm¸ž¨ÒU¶%¨Á°s爰àÕá§ õÙi¥&%“né°GýA, ‰1)u‹unºkà+\%/ÀVÙ«øçÉ™¹Æ-:ºQµç…4Kv"Yñì•Ó,‘èÐ…dÇÎDЦàTrˆ—J´ÝjAa´r&^¤`Q¢ÌoUŸHvh¸2g;yZ~ {;UßÁ"F.ƒæ2ΩØ´{yÚ×À¹Ûþ:†ÃîÄL'bÖQ–ç»&Ý÷œÚZGÔLbnÄ4u°z!?ØCß­^ú–† Ês“Þbòä¢Q•‡40yvÓóI›hdr6õìWÀfVÕ;ÐåÏõÜC×=„šG– p1d‘[ÁýEÃ4þ’zü3úR¡ÁxwÊØ¸j"»‡ˆN?@l¼ëè.¶3õø.N¤v6¡†ï"“nbÝKÐÒd°þ zÒ÷°¡‰O°‰î%Ä ²yqù÷´oôÒÅÅå‡/`´-ŸibkØOœßãú`xތ访S0Àv½¬ª— F©2úÐPå²²ÛTW7CáGØ6òo/ …Iì¥ÿ@Œ¦N†"©%ì˜8ïë 7±3Ÿa½‘&v]”lÁ¢k»Qð¦BÌCÁ[)8H7[–MhW„Wrâß–0cÃ8B3GW[4JÔË+z„žûØy »ïCï¹JW÷S'~Â&jC¼Ÿä&^!E+©XøPK*3Öƒ PKŽ®Aorg/hsqldb/util/NoWay.gifs÷t³°LT`P`øÎ `ܦÀ¬@pçÀ²Sþ+*;vìÃ5Ž{@$ ðˆ$$ÞKH|WTÊþ×Ôü? FÁ`¿?,X°¤¡¡á?0ÿgø¦þƒY@ ø“…‘áƒ('€òÇ?†¯œ2læv‹8!àp¨YÒkÊ E9„ ²ÎX|<ØÜ%f˜6Ç HŹ_ÎQMåä¤%^µÜËjn:Ýd”.7' QýäËeF‘Ð<¦!—Ôj§ÍᘨêÕ,%|bÊ AÅs3eW UtNÍbœ->ÝÌôfГ Mž÷\f|‹w`°PKmã;*Ê PK9A#org/hsqldb/util/TableSorter$1.class}PËNÂP=Ó‡—G0à3îH!©º•¸!.H$. î/¥bíŶúI®ºqetaÜ‘øQÆiƒ1QãMæugΜ™yÿxyp‚ÝL”*Eh¨ lÔ6 k]/ðâ3‚Þl]Œžš¸ᨛ… Ù;h^Ìå½´}LíËñÜuâÓß?­>¡4Œ¥s=‹‘ûŒ,Ÿޝ"/˜Üx¦&[r„Ú7¾—ñ¤ ÛØ!ì«pjÏ¢[2¶ïbÏ·³nCÆnØ8&€`õƒÀ {¾Œ"7"T~NóEÁW± {ÿô&äW;¡þÇÖ­>Ž`ðùh|S…·á(Ï^•-óð ôˆô (®Ò].×Ù6Ú˜zÒ^¢ØY¦ž–¤ÖHÚoÐ:ÏÐ5$Öb½CäÉdl‰#ë¬k,ÎGîPKwlð<áPK9A#org/hsqldb/util/TableSorter$2.class}PMOÂ@}Å…Z (ŠÜLlÕ¤†+Æ ñ@¢ññ¾ÀJjW·«¿Ê‹L<øüQÆ¡b¢’¸É|ì̼ùxï¯oÚh¹(`s¡Ê.*¨ l Ô¶ kgQÙsBÞnNWAŒôí4ìú—3ù(ÃX&“ðz8S#ÛY=Bù"Å:’É•²S=Øñ PôÐÀ®Àž‡&ö -m&á4½ÇÃðÁFq8ÃXõµ±Ê´ x½$Q¦Ë4U)¡òw¡–…2x7ÛTZmÍzŠV÷­áýï?ŽøŠv~Mú®,-™hBÝ_=œÂaf™Jæ:ÇÂ7ó¯Ä^•-_„ÂÑ è‹Gp±¾L7¸<ÏÖ;ž#wÂ2Gþ)«ÊÁcí`ƒuÅe„“eŠŸPKÒ.ãÀ*ÕPK9A'org/hsqldb/util/TableSorter$Arrow.class}SKSÓPþn“æ¦1@Aâ Q|·¥ŸõŠPª  qEh3m &5¹Šúع×?ÀÆŽTÇ…[gü'îü¾ÎMê â˜Å9ç~÷»_ÎýNòùLJNâ¦<æÐ‡C2–áH ”0ªy!Ÿ—Ê8jàlƒ6Ëê„ 'åòÇŽs猆×Ý áMvŸA½g.•5½ya䉧 ÚE/ðÄe* ÷kµâ]âUÃñrmÇ D­ åÂì¢óرeaWÃí0p1¶ŽMGN»åÕã±T¡ç¶pêKsNû޳à»’¶Æ8.2˜M7½ç5D‹A)©Ÿž.8ãzÍ–0±—L `«‰AX&¶Á"—1N2&®`‚cÒDS¤iâ*®™˜Æ„‰ÔL\Ç ³’3ǰ/Œšv+~è7ìGÂóí¤§Ûa$ÜèàD…Ë Ùn6kAàFU߉c7fÈ'÷ó ißZXtë¢ =±ãerÕN½éýÃ?Œ6[ÅпɫäîÒîfäÐò³uÆRW&ÉÈf> $\(n&õ®79ç$޶“+¦¦ŠS4E9Aì;•X:­áDK.uªÇ®è6½µð·´dêÈYžõ:Ìépz\_ˆä”¤ÀÐÌÅ}ÁyÐÕ¡ #§IßyF4ÉÛ’¬Òþvì ¸“V#„«”KïÀJCkÈ”v¯A) ¯A} ù0ìÂPÊf7 !GØ×ÑOȽAv|´íB¶ôJÖ_§J]yÜÒóŠFuætK[…fi¢Â-U—ÌV^óçÓÍœÅÅ*Te¾¢¦Wi™©èåaKíÀ(ïÌv°¥³liYßâŠÒAO·¶ôyÅÒåZ’z×I–¶‘ei -}ÁÀoI©ºŠ¾ß‡»ç•ô 4ËÃÂRuñ:ña7Å £Ê1ü(²Iö“ìÑ9öpìåaL¢ôÇŽàÆz®°oXd[HpöwÇÐO™QNŒ|ÕõýÀÿ·ÏR4(÷á4*0~PKê¦Ãö×PK9A+org/hsqldb/util/TableSorter$Directive.classPËJÃP=“wc´©o‰ ÒlÔâ¦n‚ Å}—šLÒ~•Á"¸ðü(q‹nDäÂ9wæÌ™¹wÞ?^ßa¯ƒÖM¨ØÐ±¥c› %e>»/ziV‰¤ÉJ޵³¬Èšs‚ê†áè– ŒËTÌ(ID]ƒ€ _†9 VX¢çQ]‹šà¹—e5ñïê‡<ýY“åþMç⺬Q ¿§£ð§éIX0 [ÐZèaGÇ.áð_ö4šG~ÿ*žr– »íÛ?à€—¢ò’$><¶»Ëà/Âd\áÈá¼ÌÜ÷^ {Î’·¿=q ¶ ýeမ˜UïÒãR¶•©“9\cl)ØÄ*ÌOPKƒé]‡¸PK9A.org/hsqldb/util/TableSorter$MouseHandler.class}SKSÓPþnš&4,HADÄŠi(A((Åœ©Ã8®m„@H0I¿¢—®µˆ ǵ?É…xn¨Ì0hîâÞóüÎãžóó÷·ïÆñBA ºn)hCZÁm ʸ£ 3™fd1įa#¸«@Ç(WŒqjœS÷8u_Æ„Œ R°eùéQ†Þ¢ëmê[þ[»º¡×ËÖ_¶Yv½Àô¦ÈpÚr¬`†¡_‹´Ì¬1ˆy·j2¨»nÍ7ó¶UÙ1« }ZqÛØ7tã ÐÍ}Ó ô×/r2tk)Fe§dì…xa†“TœŒ‡21€ ŽczyÛð}Óg˜N%J™£*:RÑŽ«œš¢p*¦ñ˜Rå‰êþålê÷Ò—Cç%Ó¨šžŠ̪x‚9ÊMÅ<ò*°(㩊g\¸¤¢À…Ëx®¢Èc”8µ‚U-*«°#K†SµMʽÈöü«}sUc/àÚîÿ6—aàr=aÔ¼k×vý–MÙ.†˜Æ?)±ie·æUèƒ;´ÌÙ—Úá®nl›•€F¥•L. 6ì¢3 O‘<_…‘ mç0§jÎq¨¸*q®¢ÚHNÀ½‘4z&†¢VGô‚!öÀ ŒF6¨Ñ(¶X~ÞuϵÜ',á5ƒbT*¦ï§'GiÚ-¿¼e½ Î ’þ%Œ¸V(dÖÐOëÝFëÎ’I>šDÅ ðI¥è$®“8^%;ôBö±#ðÃÐ…k ›Oä#ÓkÕ!þ@¼4\‡´2Bœ|‚&9q$%ž ! %OÅ…˜Ï~†Š×Ñœ“ÈP}OHò-)η¾ƒ,|„(®ç¤”$¯K{b5'ù¤¤:®…9tÓ=ñ‹e\—Ñ#ㆌ^Æhƒ‹ì”Ô—äc¿Ð•y³Q@;•£Wʃý-°¿¡é ù&j”Ž„?PK»T±‚Á PK9A%org/hsqldb/util/TableSorter$Row.class…TISAþ:[g&„%` ‹`$ˆY¢@YTF(P¼ a C‚™aùž¹yãÂÅÿù @?%xC·Œ pÄdô @½åV–Õ-ÛÌ©‹úrÎX(m£˜&Ç3oÚc ±ªžZ|‰Á3Ii¤lacS/‹†P,³®oëjNϯªsËëFÖNÇ @Í‚­g?Îè›Î&i*ÑA«Z=›5,+:”$€îùƒ¢åóFq2§[–a1D«‚‰R%QЀFM)hÆÇ(CÇÂŒá9Ç 㘠T &1¥à%^1tW‹2‹Tš¹-Ê¿Z+xiÞp¼UÁŒ‚YÌq¼Sðó 0ͼICSE5ép)2148j'·FIu»P$‚b‚úHpFS‚QµúIÆ3•,Ó²© jÿÕ0øÍ«ôͱëeXÄ×tkÖØµ„¨9òŽÐTö¿Þ„a¢úñ^ñët’l ÓŒhp†vgï]ÕÚ1iwÇrêØ)Ok5;m¶jØKznË·Eišv+Øò*‹ÃA8¦]'¡bJ—ò†žØ)݆ž[nÈíw¦ÌÑ`2‰{ô6ÁPýÔè@0(zÞ7é›ÑBã’"dwÓ\—è=‚+ñîDëØWˆ°ãî¥#ãä&“î[âl´÷šÇHpÃ{ð'ì9gØÃg±ò3œBö†½ÇS>ázˆ@kÈwÅa^R´•~wJ ó3Ô†ýgHØGŸ%—Xv9ZX¶ˆÈï;jÂ<ì?A­))$í!$RÕ¹¾€${Þt°±á>pJ‰Ð8éFÅ´^Г9Ú8Ú™£ƒ¦v!²ÜØ8Î.(Â{ÍøWÐOìÞ/±WO3^‚”ƒg]46­zm;iïoò_PK]OæB¿PK9A8org/hsqldb/util/TableSorter$SortableHeaderRenderer.class•T]SÓ@=Ki·„ -4"ŠR4m‘`UT@t¦£FGð)mw l–áŸø/pFê胣¯þ&ÇñnSÔ‚Ã`’Ù›Ü=wÏÙ{ïæûÏÏ_”ð¤ :®¨áª† wã®q\×Ĉ†FÕÛ 7aiÈ£ >‹c·8Ʋҭø¢,|ÿ•j¢.ê £ gG»^°f7öòqØ4CJ®{Qn‚ah!¬¯ÙëÑ[¿V±·¥çÇð¥°.càŒxr–á©u*òL¼ù†ÎrXÄ»&ä @9ÜÜ H†'VÛŠóMlÌbû.y^T6DUN¯®:N>v»»Òþ½IïY’nõÍ¢»ÕŒå°4·ZQ”+MÐÖ”t55'\¢ÿ“DÝ ã»Q$"†×§î<÷ïU¦ógʈŽ^dtdѧ£:p¡¯më nEø:n£ÄqGÇ]ÜÓ1‰ût<Ä­2ƒG:fñ˜¡ôÿZ2ÇóÊ0rù-¥í™gHXªÐf$ä\X÷öÃ@ºþ²Ø“/ÃÈ“^PXŽ‚ô,1ÅUÃ`GÔe9ô·7‡˜ö–ÃEj?Žs85ϳPQe­¿Š¯\ªîm޽ä틦0Š<%C ¡ÛÓãT•äë¨ÑŽ+?ÑqÚg 1¬“óù Óï£ãÝA7ÕÈdTÉé7 ?ÎÓhÐ× Í'ÈöЇè(|D¢0vöêbª7ZÀ84²ó…`ű!£ÓH©OèäÔ&ÿ†ä;Œ›ü+’Si3l U4R ðÉ.3M!Ùèéj@k ÛäM†‹4¦Á~à9‡™Iã†ZŒY²ŒlR1´]¦Q#«ÓÿPK é&-~ÛPK9A3org/hsqldb/util/TableSorter$TableModelHandler.class…SmOÓP~n7)ë ”Aa‹ Ç&t È›:@¦#!&ê§²ÕQ¬¶ôø/ò–è0šø‘þ&c<§ Ä”&=¯ÏsÏ=÷žûëÏ÷ŸÆñDAb$®+èÄ ) ²bqSA+Òl ³•a‘e÷‹£2tçXŒqd\ÆmwdÜhò7-/•H«nEßôÞÛå }Ç·l}ÝØ°Íµªë›î g-ÇòçúÓ¡ÈáÑ|µl ¨>Çó›†S1ËCéâ–±k|н=Ë©èæ®éøÇÔU‚ÛKìô–5ß(½]5¶ƒ¤ŒIÐjÇ1ݼmxžé ,„o#,™£2*zpEÅet³5%cZÅ=̨˜åðúTÌcAÅ}v°õE‹*–°¬â–.ìHÅ ózPPñS#a;;%¯NÙ6]öÿÄ4.«Ût°úÓ-³ä ¤ÂvR´<ßt˜™ =Hšo /%³<6©P€% ¥’éy©ÉM’öÆrÍõsW¯˜þ²åzþóê^À)œr¦˜#@¾jï¼s(AvÑh`5rÅh*üºùhºp–?Íü †ò5â ÂXŽ2-¼þq›Ætðü\C{æìf ôñ¡týëkÑðFoè§—ÙIãÙ¡i;§à<¾Ä×e<© _áÍWyøo¿^‚oà›<|KÆ·4à;Œ÷]¦ð=Þ~ŸW?`ø§ê‡|ö#^ý˜/~"ã§¼ù™?~Ϋ_”à—ø¿fV~ëßÊøŒß+øžfêäáO|ýgÏ(ØŠ¿0±¿*øþΫðÙ?yõ/†ú7ÿáá¿<ü‡ge\PdE=§`;ÏÏËxA ¸=’ÐÃfdTPƒ±˜žD5ÃÐ šÞxÂÔöFõmº6¨'zôzBÀÝ–HÄ|(>bèÛ´Ø`”+û8Ô£©3W*fêF`YçmT»ÍoŠÄ†üÖ?ÙJÐí½Ž®ö`× "(PˆÇ S‹™ýZtDw]¤‚êêîÛÓÛÝÓ×Ñî"·‰Ò–Dã!PÞÚÑ7°§=ØÓè öw¬íŒ'†üû[£ƒ{ý#f$j¿Ì‚ꉆ”*ˆ‰ê@whG[OÛu{œe_w)ÅâÞÆ ćj ÍŒ'¡ª³ã¦` ­3 ºd4¢ê‹;’¯Ü]ðyRÑ)fà¾x?a H»Iþ’ +¬È£¿ûÒD£t˜ Ó1L=Æ(¶ÊýÚ!Ó¯ê1ÓʼgæÓJc­ÉzÈFìË#ìÊp<:2K«ƒœ§)Ȉ\vr †ã1 2É’ŽÏ[)g‘6ÃZ,¬GSB- 3ü¥²+J|ø­ŒÖš?pYGlãLä%^çõh)9Û&ìÏ íoã\‚[±‚;H²Þf e{áp§sÄGb¦e´  ›”Ò:.MtiÃdÆêϖȽf‚´Óš…ÈZ CeÚº!¸ˆУюÁˆi{©e&r…Eå¼ÛffÆÆîÞ{€|ƒ32 ysAØæ¦…úa4l^·NÀï-¤±ÖÆÜôD¿œÑWÌ‚žñÜ ŸÜ\É›úY-;8ë×1Æü-ᨕœT¼‡U a¿Šûaª¸‡[‘Pa€¤¯L³½M3öSÜ«ˆã yjú‚ ¨v; %à-ä5™–ÈSð⻵BÊ)Ã*†Sq'FUÜ…W«Ð±OE?vÊB¨B.UñàfA"8 ‹yªÅ|U E`C¡Çò÷ª(ª*JE™*ʉ±^!‹JUTáU, VÏ)稢ZÔ¨x94¯ÃݪXD[±˜KxX*<¬öûTQË«{Ùõ…([­‹*êÄ2fj¹*VÀ”E=SZ©ŠU¢AŇp„y\I±’/ $íð±‰>¥U¬kTìEXÅ ïÇËgI ÌÇZ¯ÁkeáUE£ð©x7Þ£Š&Ѭ⽸GѤ5|TñaUñ|TÅCxX ®íõ‚»¢‚ <î)¯å–˜¶½†™ÐÂY%®|FB¸¦p€Ì•ë­à­-Tf'ôáø¨žÛ4zçÖ¹ð+ÕÚà`>Kö‘ ÚL™‰‘°9’ÐSEmYáºK‘nóÊîœ6æ’m³SÅÅYß§DÍt¿½öÒ=çì$`F‚ÜÀkwA\"r[çúT•‘‡Sï%»°,l–´‚?CA³øÌ\I—e*¬Fä*i.RnN¥L—0GwYw¾ÂºK÷D\œ“˜—1æÂ”ã´k¦–ò9¡Ô"\¹çÙÎÁŒä²Á×Eš!„w Ýû.GÏÎóªÛê[©'Èj¹©Ï‡˜Ot×ÁbìŠ<às$P1Ú #2c¹¯Oć¹ÏÈé2X¸Y ¯%OÅŒBÉ]&·—ÜìÎÃQF¥ßÄ&h(lkø)lØâó<Ž­çäwž£XÌ÷µÓØ:à#[]Ýk¹ÙÓä×¶¼¡ú4®å)ýf)\ÏÃ#Ä,¹@ÁMmž¬ÔæÙp×%=>²R~o+Ž¥–ÎÃË gˆ©ÇJ;6O ùÊW;@m·ÅÏ3|é÷$uÏ’§ nËg8u5 {²ëÔ”ÜYÁX²!œf{^LêÞ3r§dåNÛˆ’9о<.´) DŸP­£;CzXú)\ïÂq’¾ AÞàJѤ ²ŽŒ]Œ=´¦ÉRiݶÁrèŠù8†åI³î1çúãøDÎ5%Œ$ö'ó^»’×Çñ©<Ä¥$ñO繞„°¥˜Ï¤b²Å’**§ÉE)åÖL#HuóÆS¸jÛiÕy ­É0ÝAãuD¢¼­ü_ý!¼˜,à§¹ü§…zi_NsÍ[i~ ÍAçéíöüPK†ì²¬— ÄPK8Aorg/hsqldb/util/Traceable.classmOËjÂP=£Ñ<Ÿm þÝxÁmEÐàN(¨táî&†¹$4½í‰qÑèG‰s-観™sfÎÌ™ù=Ÿ~ ñì á¡‰– m]Bmµ˜„3­ëRÆ !èÏwò[ %óT,u™åéëË;ÁÅ*Ë3=&Tû¦`…ņõíç‡ÚDƒ/©Áu‡GO|ÔazE™Š?‘0"±2")nß­Þ¢]kÞw/M‹B%2'xi¢oäß×uðc5þ• /£ŠÅWÃeäÀÃw|Ægn—ލPÝ_).PK ÒŒKÝ+PK8Aorg/hsqldb/util/Tree.classW xÕþŸ¥ÕJëg[–½ND.®[v0 T€Bœ€KŽzm­íMdÉH²¤Pz„Þ¥=Ú’´niÚ’ÃrÊUè”Þ÷}_л¥¥…îÌÛ•%Ç"²5ovfÞ̼¹Þêñî}ÀJq²M¸YÇ; Tàæºð.ƒÀ»u¼Ç@·0å½LycïgðÞr+s÷…pngÚ»ƒ±;|ˆÁ‡YäVÞû~¼‹±ýŒ`ðQ bÒÀIø8Ûþï6ðIdÁOñã§|†Á= ±ÂÃŒaìhSȳ3Ó!Ãg Ü‹ûÜÏ 0ð >ÇÂ1x˜Ÿá|­}QÇ—Øô#  â1^¿Ì‚³ÌWXú«¾†¯ëø†A”[˜üM&‹Á·|‡í|7ˆï±Æï³ë?Ðñà ~dàbüØÀOðS?c±Ÿëø…Ž_ hƒÒ©œ@ÍÆÖ¸ÕjMäZ™Ð.ì²sg +Ð0—éÑIÆp.OO\b;CäBt H§3•°S¹mN"7,PítY»¶Ø»ríÔ‚‰.'匌Ô•v8#v*ë¤S¤20Ô9b ÙuEþÅktصp¾Ø$°%~‹ßQ)Î//Þö{‰! KüOH8ŒmÕ׸7a¯Ž'%þˆ-;ü‰Á×2¸†ÁnŒH\…«%þÌØ Ó¶bKÁ’l @â/ø«Äßðw‰Ëp¹ŽHüOIä0&ÑÃ{-} úü‹=`ìßxš"$ñ~؃Wëø¯Ä3x–2(ñ?<'ñ<˾€Â(„¨èÅv‰nl–Â'üRh" ….‚T.WÍ/6)B¢OÓj–BŠ*‰+Èš¨æ}5Èè",E-ž¢dφs]:I‘©#D½0¥h $®Ç ¤i… ETŠ“XoÕœlRqw8V2=D©¦.I±X,‘b©X&ñ6¼ÆB:3Ô:œ½.™èw3˧Ôüf+eS3ÔÎ+oEWu–Jz ¿ÑÚ#|QIu¹´.+Ec0£Ïߨ:×Gý/+]—M§T•#–ÛlÏÐQ‡½šÖ&¼›±½öÔÇ­ä˜Ý=ÈÑÙ4?34vɉõI{DÁ,Ýý;¨Ø•ÃõåZ…ú0«´xÓÓ,3x¸›8.[Ù Úòp5W;yª'JÕ÷ìÎæì•yr~€ŒQK͹áJ$ø$ÝžtÝœ82›=:Éäåtòv cÓ¸ó.¨zÉMó/©ê¹ÚE3o–Ž­’{O'?ܺ‹7W”Úİ“›{+N²Ýà¯ÍÍË‘—ÊQ6gerÙm΋†™&r é]âûº1+™}‘l’d(ÉåBÞïæ?cMltRv¡Ò•pg*gS±{ÔÊdíN>˜ÖŸ¤{ÆÛáFÔ`´0‚”ñË»óXÌ çÙÇǼ³³Hq˜âÒ»û³vfœ†<–ÞõÅ85”9˜k‰’UðáY­[ÒéäN‡HµÄî°­±dn–V_šQÚîÞ9sj}ù¼¼–¿?p2½¿m¢·eH žÈj¥9¬Ö+ÔZÁã\­t5¨•¦ªZiê«õ­·¾Ê[û¼ÕòÖ~oðVºÔ:è=ÓM¤VÇ[wxôjЗî9¤»~€5±iˆØ}¨è†o þ˜ÈC£ç@¯oú‚±ØQómSD¿"L4˜xüHcÔS!ƒ´bÍS¨,ðéBôø×C£?`4¶hñ“ôIÏBÕQTO¡ÆSMOá)ÔÆL?=×$¦‰-!¬–°:–÷ˆÐ—jò¨ç]üÈôZæ1-3&¦Ð@È‚‚'ÙÙ4çB°¬ôøª}ac ÑÒtÅzÓ´Q§õ2ýœÔ¦µ<Š@dQWTó5÷D5 m€é?†Å=äŒ?ªå±ä0–¶ä±,0D‹@(fØHïQ,ô÷‘áCÊÐ8ø¢¯xU:Îyç e|Â3nRô|´†bÍ-—ÇÉÿvÍÌ„P ©ƒÌü®á‰ŒÑo%ÖâÄ㔘²?<…S9øQ°Ó8Æô=½ÓÓòx-gxrÇ—‘ 8ê‹û\,á¦rùmtS*—“¾3 ^Ò‹‡çB‚àBÙÔ|w»vP¹öÒ÷ÂO?þûâÊùŒþƒ±æi4œ ¡Ë§·×¢ï|:t-il~DÕHݪf"wÀ¨ù0HKs³WR¯Œ¨´Zhix±X—Ç .*¦çqæZ k=Œ³òx¹‹­$MŒù|Å--áÄýFW8A%³i…/²¨Ç÷Ó)âš©q\qÍøâº©s4ïÓ\7¦žÇÙáúo Fƒ¾•m¡hп²Íˆµ•m•¦?.My'FC+LIV_±I„öʙə']R<"p{¥0ûPeJÓ€ÄDw´’â­Œœ›Çyû û'á'h[4Ôsç›r˜+ ¯rOÕæÊ¬25³ŠúL*ëö"©Å”g?±ºMÎHöÅ«•´6ܯa“•ÀÕgê}ÝÑ``å1¬Š‡•’ðmQð&!ïýfx«gM²¹@ÂÔ‰°ÖݬOkæè$ 'ÂÁ0•É…E²–(8¬¹.ÏžyiQÈÔH¬€Q-·O¢Ò¬¡çD¼f®­¨aÖ˜Õy¬5eܯÙ×öêbò… Ìo ¬çqѶb3?ŒH„Þ°7Ì`-‚:^£ãF¯¥æ¦—lêÓ´r«Ï%Ó¢ãuî?ÉÔiµÕ‘ Å ý¨¨=¡¨RI¤g|)¢Šÿúg±§BŸÁ©åü{–&—æOø<Öû Øëñk½ñÃu]yǾéÄì7ž˜ý¦³ßŒ·¸lñ •*Z7SVö¡n1÷ß~TòÕ9ͦð)Z²oµjÄ6Ôï¶"gQµŸ/dá3úV›AՈد1XlÄP4äã ©ÔÜŒF¨^>áÑâQ£Ø„ºÛ„7!Ö˜%û6\FKi%oŠ=eÛS§¢Ó\éx`oPLÎl7ƒ·Ã*x{eo5öÖxõQÃSfD:ÚŒI40µ–¨®‰È¹êXd[]Z!Ö³Þ®³Å<ˆpÕaBªRÞªŠªPÈM^!©³Güz-R‰rW•Ù­=6W:ò êéõ‰~ÀyI¯£zã¤ëäË­ï J{Îâê• ›üâÞÈ%¾°œFçœu ¯TsùÒ#XJ×ï1l<‚SÂòÎ÷®ÄÿPKAe§ìË ôPK®Aorg/hsqldb/util/hsqldb.gifažþGIF89a-/¢™ÌÌfÌÌf™Ì3f™3ff33f!ùÿ,-/ÿhºÌ50ÊIë(-+"ºÿ`(vƒÖp ®lëªainÝkß(›(]¦÷+²H¼.dÌ DàÈø= ÑÖt„{fWÛ°Mø……Å®]9w>§i)W{W•Öô9ë¢Ônmnvu~"?h„`\FSU‰RLMl†…’“#–G†“‹1ƒr˜Ÿ”:¢—€7"œf¤ ¬‘¯¦³©ª£§Šž¹T´$¨²¸¾ÆA𠫱ˊÇ¿Á¶·}ÁÕÖÊϺ͊ÞÜáSKáâרß/U.Ò¡çh…»¼ày„ïðíô÷ΉçÄé)0 º{Ì4×O büä©ÈW§`6vaöùÙ3(&¡ŠpœVJÊH’%e­°è1¥¿,}š¡Í rêÜ9¡@;PK§²ã¼faPKŽ®Aorg/hsqldb/util/hsqldbtab.gifs÷t³°Läfàa8ÄÎ0óÌ™4 šyÆ8m¦qZš±qÃÿÿÿu€H ³fFÖå8îœm“”žgm¸Ç»Á7rGo“fÇêI'ò­&Ì¿”÷ðO¯ƒ5PKÍxN{\\PKŽ®Aorg/hsqldb/util/problems.gifs÷t³°L``8ÂÀðÿüþýóïßßÿÿ¾ýýýöÿïÇïŸo?¿Þþ½ý¯(«÷íí÷ÛÛϰ°¨··ÿS_þüÿû:æÿÿÿŸ¤DâŠ?YDt@ ¬õ ¢=MŠ=Z~‰92ìÙž3?íb~úL'jˆKÅõ~«j/u*40ðàmKqzÌÈÖÎèx0BC,rÖÃiñòÂ.I—&¬Iyz\Ù¨rÁ{C^.®bf¾T®ÁtÞNa!Þ‚‚Œ2FannA~^'MÉ|¥Ê¢+W­^#ªÈ` PKþ°éPKŽ®Aorg/hsqldb/util/run_exc.gifs÷t³°Lbb8ÄÆ`o?þü†††úúúøøx†ÿ` ø“…‘A(ÂRËÀìS±ëÎ;æ _8>m»~Õç´xÏJŽé-s™8zlb=Á{åZžY¿ë¡ÓktZæ*J=‘cž­ tÛÂN†ïdÔé´í§ÜTèJqgb°PK ó"‡‡PK®A#org/hsqldb/util/run_exc_running.gifs÷t³°L``˜ÈÀ°ÿþùóçÿÿÿŸAñ' #ƒÍ’g`ÒŸÒ¿’]põ澩OEw7Ú°:<Ê<×á9Ÿ£1#{_·rÄôë³ó¤|7%³$šp-a`°PKeÎðÖ`^PK9AXÖœ,íMETA-INF/MANIFEST.MFþÊPK9A META-INF/PK0Aî~=÷;^BMETA-INF/hsqldb_lic.txtPK0A>Z¶íä±  META-INF/hypersonic_lic.txtPK9Aï META-INF/services/PK8AA¶i!1META-INF/services/java.sql.DriverPK9Aorg/PK9A Ñorg/hsqldb/PK7APôÇM&! org/hsqldb/ClientConnection.classPK7AQãŽi6%l org/hsqldb/ClientConnectionHTTP.classPK7A¶À?AQ´¿'org/hsqldb/ColumnBase.classPK7AXØË Y+org/hsqldb/ColumnSchema.classPK7A=-U%z9¤6org/hsqldb/Constraint.classPK7A[²P‚ãNorg/hsqldb/ConstraintCore.classPK7AeÄ\ q[*mPorg/hsqldb/Database$CheckpointRunner.classPK7AtÜV¹íS-6Torg/hsqldb/Database.classPK7AŒ´FH ± jhorg/hsqldb/DatabaseManager.classPK7AßȰa]iuorg/hsqldb/DatabaseURL.classPK7Aeòº€!(å`§}org/hsqldb/Expression.classPK7A4àfà?E #¦org/hsqldb/ExpressionAccessor.classPK7Aj+Ïš7n$¡«org/hsqldb/ExpressionAggregate.classPK7A¿@.O  %*´org/hsqldb/ExpressionArithmetic.classPK7AŽè/Ä z)Âorg/hsqldb/ExpressionArrayAggregate.classPK7A¸4#-Ž8!Îorg/hsqldb/ExpressionColumn.classPK8Ae×5"¿ )çorg/hsqldb/ExpressionColumnAccessor.classPK7AuÇyç \ìorg/hsqldb/ExpressionLike.classPK7A3ZL #ÊX":öorg/hsqldb/ExpressionLogical.classPK7A|‰2èû%šorg/hsqldb/ExpressionOp.classPK7A}‡;ÓU¨"+org/hsqldb/ExpressionOrderBy.classPK7A› ÔÆ& ¥/org/hsqldb/ExpressionTable.classPK7Aê^üR,L ¹8org/hsqldb/ExpressionValue.classPK7ANUkbD9)Œ3<org/hsqldb/FunctionCustom.classPK7AÞû>3i#÷ZÄuorg/hsqldb/FunctionSQL.classPK7A‘­á+G Ž#w™org/hsqldb/FunctionSQLInvoked.classPK7A>øö·ßé'¥org/hsqldb/HsqlDateTime$Tokenizer.classPK7A#„noE%C©org/hsqldb/HsqlDateTime.classPK7A+ó ö¶5ýºorg/hsqldb/HsqlException$HsqlRuntimeMemoryError.classPK7A%50™Ž¼org/hsqldb/HsqlException.classPK7A±Âÿ‰®"û¿org/hsqldb/HsqlNameManager$1.classPK7A°³oy¨)ÔÀorg/hsqldb/HsqlNameManager$HsqlName.classPK7AY>ãÒNa+¤Éorg/hsqldb/HsqlNameManager$SimpleName.classPK7AmÅáü KÌorg/hsqldb/HsqlNameManager.classPK7A¢GEÎR è•Ôorg/hsqldb/Like.classPK7A•\y¢ ó*ßorg/hsqldb/NumberSequence.classPK7AóYIø¹P íorg/hsqldb/OpTypes.classPK7A%5·¨ `%òorg/hsqldb/ParserBase.classPK8AŒúrQ9"ÔJorg/hsqldb/ParserCommand.classPK8AQ¢îdM¹%org/hsqldb/ParserDDL.classPK8AÛ\9-ÿ}@²rorg/hsqldb/ParserDML.classPK7A8FÏŠÅ ¾)ùŽorg/hsqldb/ParserDQL$CompileContext.classPK7AÌß; òUŒË›org/hsqldb/ParserDQL.classPK8A—a¸žg)aOñorg/hsqldb/ParserRoutine.classPK7A€?¼{„H@ org/hsqldb/QueryExpression.classPK8Aƒ„Ö; †#Ô6org/hsqldb/QuerySpecification.classPK7Aƒ0Ŷ+ûrorg/hsqldb/RangeGroup$RangeGroupEmpty.classPK7AšÝÁw,[torg/hsqldb/RangeGroup$RangeGroupSimple.classPK7AÐ= \8vvorg/hsqldb/RangeGroup.classPK7Ab|¸Rˆª ÷worg/hsqldb/RangeVariable$1.classPK7AƒxZ#â0Íxorg/hsqldb/RangeVariable$RangeIteratorBase.classPK7A7¯%X B2N}org/hsqldb/RangeVariable$RangeIteratorJoined.classPK7AO€{X {0º€org/hsqldb/RangeVariable$RangeIteratorMain.classPK7Aþ´â§/J 1pŠorg/hsqldb/RangeVariable$RangeIteratorRight.classPK7AM½ëO6þŽorg/hsqldb/RangeVariable$RangeVariableConditions.classPK7Aj×™dAM˜org/hsqldb/RangeVariable.classPK7AìÍò¦ Ø$²³org/hsqldb/RangeVariableJoined.classPK7A_…ÏB&ª¾org/hsqldb/RangeVariableResolver.classPK7AÕ9¯ø÷# PÝorg/hsqldb/Routine.classPK7A¯ê)JdÂQorg/hsqldb/RoutineSchema.classPK7A¹=QhÉý org/hsqldb/Row.classPK7Aþ‡ÃÛü¥ org/hsqldb/RowAVL.classPK8A Ÿ]µMorg/hsqldb/RowAVLDisk.classPK8Añ»bSœç óorg/hsqldb/RowAVLDiskData.classPK8AÐsÊ‚Ó Üorg/hsqldb/RowAVLDiskLarge.classPK8A©!Ñ„G ƒ9"org/hsqldb/RowAction.classPK7A+8I!È/org/hsqldb/RowActionBase.classPK8Aq<«–C› "]2org/hsqldb/RowDiskDataChange.classPK7A„ÔšÐC%gTð8org/hsqldb/Scanner.classPK7A™¹ìã ßy^org/hsqldb/Schema.classPK7Aþ+7ÕŠ¿gorg/hsqldb/SchemaManager.classPK7AìùQPôv-6Ÿorg/hsqldb/SchemaObject$ConstraintTypes.classPK7A„(”Î"'… org/hsqldb/SchemaObject$Deferable.classPK7AÕ"[fÆ)¨¡org/hsqldb/SchemaObject$Nullability.classPK7Aåe.ÜÕD,Å¢org/hsqldb/SchemaObject$ParameterModes.classPK7A=Hïðd/ô£org/hsqldb/SchemaObject$ReferentialAction.classPK7AÙüÉ%,A¥org/hsqldb/SchemaObject$ViewCheckModes.classPK7Af3²d²Éd¦org/hsqldb/SchemaObject.classPK7AvuºØl  aªorg/hsqldb/SchemaObjectSet.classPK8A!&³|oŒ¶org/hsqldb/Server.classPK7A//õ–"2÷t϶org/hsqldb/Session.classPK7A Œ–¡ E7éorg/hsqldb/SessionContext.classPK7AëòÇ:e+%ôorg/hsqldb/SessionData.classPK7AºØ¸ØÚ)!©org/hsqldb/SessionInterface.classPK7Aâ2ÁÖ öÒ org/hsqldb/SessionManager.classPK8AN‘*J!)org/hsqldb/SetFunction.classPK7A<ôªQ )½"org/hsqldb/SortAndSlice.classPK7A™'±\/ Y0org/hsqldb/SqlInvariants.classPK7A0$&)5org/hsqldb/Statement.classPK7A1j}j`C!r;org/hsqldb/StatementCommand.classPK7AÂpWÚ®½+"+Worg/hsqldb/StatementCompound.classPK8ApS‚DŠK )lorg/hsqldb/StatementCursor.classPK7A¸X|c$òRporg/hsqldb/StatementDML.classPK7AȇÁ,÷0¯”org/hsqldb/StatementDMQL.classPK7AÃvÛX"$'«org/hsqldb/StatementExpression.classPK7AߤëD&™!–²org/hsqldb/StatementHandler.classPK7A•K˜ðþB ºorg/hsqldb/StatementInsert.classPK7AD Y§»K!WÂorg/hsqldb/StatementManager.classPK7ABQv4! ä#aËorg/hsqldb/StatementProcedure.classPK8A›ˆW0ÍÓØorg/hsqldb/StatementQuery.classPK8A¶ÑÈp©±&PÝorg/hsqldb/StatementResultUpdate.classPK7AˆŠš¥ “N Mæorg/hsqldb/StatementSchema.classPK7AFŽZ¶§.*@org/hsqldb/StatementSchemaDefinition.classPK7AÛ]ÛdË%!?org/hsqldb/StatementSession.classPK7A–WoTØY!org/hsqldb/StatementSet.classPK7A:·žîãc ø/org/hsqldb/StatementSimple.classPK7AþÏ¥Ì ó#)6org/hsqldb/StatementTypes.classPK8A>ñRÆ>†“yCorg/hsqldb/Table.classPK7Aƒé_¡ .½org/hsqldb/TableBase.classPK8A‰)éåü!”org/hsqldb/TableDerived.classPK7AØÖØV+ Äžorg/hsqldb/TableUtil.classPK7Azƒ¬F*£org/hsqldb/TableWorks.classPK8A#Ô[U­ …Àorg/hsqldb/TextTable.classPK7A^Zé\dHzËorg/hsqldb/Token.classPK7Aþt/bHù"Óorg/hsqldb/Tokens.classPK7Ab®§#Ç#–5org/hsqldb/TransactionManager.classPK7AúXûW ÷& 8org/hsqldb/TransactionManager2PL.classPK7A½£²?ü0+)qCorg/hsqldb/TransactionManagerCommon.classPK8AørMäg (ÄWorg/hsqldb/TransactionManagerMV2PL.classPK7AX®ƒTãÄ-'§forg/hsqldb/TransactionManagerMVCC.classPK7A)çS$Nß{org/hsqldb/Trigger.classPK7A6І×Þo*I}org/hsqldb/TriggerDef$DefaultTrigger.classPK7Ag§/ó'~org/hsqldb/TriggerDef$TriggerData.classPK7AZCŒàS2$€org/hsqldb/TriggerDef.classPK7AŸþ%\Ð Ÿorg/hsqldb/TriggerDefSQL.classPK7ACvâÀÇG•org/hsqldb/TypeInvariants.classPK8A,KkóT™org/hsqldb/View.classPK9AŠ¢org/hsqldb/auth/PK8AüH­,œÅ)Ê¢org/hsqldb/auth/AuthBeanMultiplexer.classPK8Aݵ„¼–×&½«org/hsqldb/auth/AuthFunctionBean.classPK8Aë™ïVî/§¬org/hsqldb/auth/AuthUtils.classPK8A–²½Ý€“#â°org/hsqldb/auth/DenyException.classPK8Ahñ}V¬ )³±org/hsqldb/auth/HsqldbSlaveAuthBean.classPK8A"Ò)P4`¸org/hsqldb/auth/JaasAuthBean$UPCallbackHandler.classPK8AV3¾Kj‘"ë»org/hsqldb/auth/JaasAuthBean.classPK8AÌxìÏ ^("¥Äorg/hsqldb/auth/LdapAuthBean.classPK9AþÖorg/hsqldb/dbinfo/PK8Ar"ªrõ[ #@×org/hsqldb/dbinfo/DITableInfo.classPK7At/øâ ó+†Ýorg/hsqldb/dbinfo/DatabaseInformation.classPK8A†›#‘ƒs1Áéorg/hsqldb/dbinfo/DatabaseInformationFull$1.classPK8A™îÖª\~/£ëorg/hsqldb/dbinfo/DatabaseInformationFull.classPK8AÑ%©ƒ2zƒ/ªHorg/hsqldb/dbinfo/DatabaseInformationMain.classPK9Aˆ{org/hsqldb/error/PK7AÁŠ,_ÖÉ{org/hsqldb/error/Error.classPK7A5ÏÚF€: éƒorg/hsqldb/error/ErrorCode.classPK9A}˜org/hsqldb/index/PK7A)X<îZ%¾˜org/hsqldb/index/Index$IndexUse.classPK7Aâ ö¼¯ ÿ™org/hsqldb/index/Index.classPK7Aô$þQ½0žorg/hsqldb/index/IndexAVL$IndexRowIterator.classPK7AÌ&‘(lO´¢org/hsqldb/index/IndexAVL.classPK7Anto¸^ ø%)Âorg/hsqldb/index/IndexAVLMemory.classPK7Aób»iØL ÚÍorg/hsqldb/index/NodeAVL.classPK7Aãã`š E"þÒorg/hsqldb/index/NodeAVLDisk.classPK8Aä|sÓÇ P'dÜorg/hsqldb/index/NodeAVLDiskLarge.classPK9A€æorg/hsqldb/jdbc/PK7AojæÉÒÀæorg/hsqldb/jdbc/JDBCArray.classPK7A¾·vx$Öîorg/hsqldb/jdbc/JDBCArrayBasic.classPK7A¿t«€G µõorg/hsqldb/jdbc/JDBCBlob$1.classPK7AS^›v(š øorg/hsqldb/jdbc/JDBCBlob.classPK7Ag0x¶m$ˆÿorg/hsqldb/jdbc/JDBCBlobClient.classPK8A{:Ü?$ org/hsqldb/jdbc/JDBCBlobFile$1.classPK8AÉÄ8}àA$¾ org/hsqldb/jdbc/JDBCBlobFile$2.classPK8Aé`vû@75ð org/hsqldb/jdbc/JDBCBlobFile$InputStreamAdapter.classPK8AŠP®»46“ org/hsqldb/jdbc/JDBCBlobFile$OutputStreamAdapter.classPK8A¨éPÓ˜ "² org/hsqldb/jdbc/JDBCBlobFile.classPK7AbÚ%sË÷H+š org/hsqldb/jdbc/JDBCCallableStatement.classPK7Ao= @¨ ¾7 org/hsqldb/jdbc/JDBCClob$1.classPK7A±‡þ–ê L: org/hsqldb/jdbc/JDBCClob$2.classPK7A‚Wc„< org/hsqldb/jdbc/JDBCClob.classPK7A hÁû &ëD org/hsqldb/jdbc/JDBCClobClient$1.classPK7AfÑ«P) &L org/hsqldb/jdbc/JDBCClobClient$2.classPK7Aök¡æŽo&¤R org/hsqldb/jdbc/JDBCClobClient$3.classPK7ApÉú; $†U org/hsqldb/jdbc/JDBCClobClient.classPK8Aúj è`$ß^ org/hsqldb/jdbc/JDBCClobFile$1.classPK8Ah Éå`$a org/hsqldb/jdbc/JDBCClobFile$2.classPK8A` Õ$Pc org/hsqldb/jdbc/JDBCClobFile$3.classPK8A1þ Ý $we org/hsqldb/jdbc/JDBCClobFile$4.classPK8Aç6Õeë- 0¦g org/hsqldb/jdbc/JDBCClobFile$ReaderAdapter.classPK8A)a:˜vÚ0ïm org/hsqldb/jdbc/JDBCClobFile$WriterAdapter.classPK8A±ÙEp÷ƒ%"Ãr org/hsqldb/jdbc/JDBCClobFile.classPK7Aå‡ôc{( … org/hsqldb/jdbc/JDBCColumnMetaData.classPK8A£òg  *È org/hsqldb/jdbc/JDBCCommonDataSource.classPK7AÅJ–¬˜& org/hsqldb/jdbc/JDBCConnection$1.classPK7A‰¨¡ÿ®3;$ org/hsqldb/jdbc/JDBCConnection.classPK7AeçkǾ1¨ org/hsqldb/jdbc/JDBCConnectionEventListener.classPK8AöÊç+÷~ $© org/hsqldb/jdbc/JDBCDataSource.classPK8AÙCϸ +d® org/hsqldb/jdbc/JDBCDataSourceFactory.classPK7AÀK3¼^a*>´ org/hsqldb/jdbc/JDBCDatabaseMetaData.classPK7AÛ ÜqÓG"RÔ org/hsqldb/jdbc/JDBCDriver$1.classPK7AršÄƒÞÇ uÖ org/hsqldb/jdbc/JDBCDriver.classPK7A“Ã#Ï¡Þ org/hsqldb/jdbc/JDBCNClob.classPK8A̶Í|7+½ß org/hsqldb/jdbc/JDBCParameterMetaData.classPK8AœPpÃ'’è org/hsqldb/jdbc/JDBCPool$RefState.classPK8A¥±_¨ µªé org/hsqldb/jdbc/JDBCPool.classPK7A¨@èb²*j+žó org/hsqldb/jdbc/JDBCPreparedStatement.classPK7A+G<í¬ 6© org/hsqldb/jdbc/JDBCResultSet$JDBCResultSetBasic.classPK7A}Ë=**šx#,# org/hsqldb/jdbc/JDBCResultSet.classPK7AºjÛ º+§M org/hsqldb/jdbc/JDBCResultSetMetaData.classPK8A@u==ÛX org/hsqldb/jdbc/JDBCRowId.classPK7AÓæ…€ý¥+e\ org/hsqldb/jdbc/JDBCSQLXML$Exceptions.classPK7A8Q!f ´/»_ org/hsqldb/jdbc/JDBCSQLXML$SAX2DOMBuilder.classPK7AåÏÞù@YB!g org/hsqldb/jdbc/JDBCSQLXML$SAX2XMLStreamWriter$QualifiedName.classPK7AMëµg4Ñh org/hsqldb/jdbc/JDBCSQLXML$SAX2XMLStreamWriter.classPK7AÍÉìØr#: šp org/hsqldb/jdbc/JDBCSQLXML.classPK7AÛÑïn£J#Zˆ org/hsqldb/jdbc/JDBCSavepoint.classPK7A¸Ž¬ÊÄ J#N‹ org/hsqldb/jdbc/JDBCStatement.classPK7A{˜h GÈ 'c— org/hsqldb/jdbc/JDBCStatementBase.classPK7A§Upÿ org/hsqldb/jdbc/Util.classPK‡®A¨urÆ£ org/hsqldb/jdbc/package.htmlPK9A‚¤ org/hsqldb/jdbc/pool/PK8AºÈ/öÒ/Ǥ org/hsqldb/jdbc/pool/JDBCPooledConnection.classPK8A]+ÕTU/© org/hsqldb/jdbc/pool/JDBCPooledDataSource.classPK8A…¶5dS+ˬ org/hsqldb/jdbc/pool/JDBCXAConnection.classPK8As„qt˜2%¯ org/hsqldb/jdbc/pool/JDBCXAConnectionWrapper.classPK8AŒzüð +ù± org/hsqldb/jdbc/pool/JDBCXADataSource.classPK8Ah&=Kß÷)N¸ org/hsqldb/jdbc/pool/JDBCXAResource.classPK8AúËf¸Åþ "„À org/hsqldb/jdbc/pool/JDBCXID.classPK8AöÁvu’™Æ org/hsqldb/jdbcDriver.classPK9AWÇ org/hsqldb/lib/PK8AÜ+'·(–Ç org/hsqldb/lib/AppendableException.classPK6A4 B]  !Ë org/hsqldb/lib/ArrayCounter.classPK7AXjy"ƒ&kÍ org/hsqldb/lib/ArrayListIdentity.classPK6AQ‘>Ó}KáÎ org/hsqldb/lib/ArraySort.classPK7Ay¾mpÒ*ªÒ org/hsqldb/lib/ArrayUtil.classPK6A éBˆ¨fæ org/hsqldb/lib/BaseList$1.classPK6At“cdž¿.;ç org/hsqldb/lib/BaseList$BaseListIterator.classPK6A÷Ø«ŠÒ ê org/hsqldb/lib/BaseList.classPK7Aàa¨¿F#-:î org/hsqldb/lib/BasicTextJdkLogFormatter.classPK7AY†‡r$Ûñ org/hsqldb/lib/CharArrayWriter.classPK7AÀ2ÀXz8 2´õ org/hsqldb/lib/ClosableByteArrayOutputStream.classPK7AÐv“X˜h ,Žû org/hsqldb/lib/ClosableCharArrayWriter.classPK6A FÂ8ÝP€ org/hsqldb/lib/Collection.classPK7A3åÔ %ª org/hsqldb/lib/CountUpDownLatch.classPK7Al4¾-¢)Ñ org/hsqldb/lib/CountdownInputStream.classPK7A@—Ú%Ê org/hsqldb/lib/DataOutputStream.classPK7Að].) 1#9 org/hsqldb/lib/DoubleIntIndex.classPK7Ah Ûê«ä(³ org/hsqldb/lib/FileAccess$FileSync.classPK7A¸»ýæŸm´ org/hsqldb/lib/FileAccess.classPK7APtF¢¿o !  org/hsqldb/lib/FileArchiver.classPK7A©vNÙ$ 4® org/hsqldb/lib/FileUtil$DatabaseFilenameFilter.classPK7AIllŽs+$ org/hsqldb/lib/FileUtil$FileAccessRes.classPK7Aê+2_f&w' org/hsqldb/lib/FileUtil$FileSync.classPK7Aï·UºA &*) org/hsqldb/lib/FileUtil.classPK7AgRWˆR$¶2 org/hsqldb/lib/FrameworkLogger.classPK6AOd¤ÊŽ#ZA org/hsqldb/lib/HashMap$KeySet.classPK6AæíØ,:#uD org/hsqldb/lib/HashMap$Values.classPK6A×™:ùžòF org/hsqldb/lib/HashMap.classPK6Aþào²£‡ #5K org/hsqldb/lib/HashMappedList.classPK6A{´0v,Ñ )P org/hsqldb/lib/HashSet.classPK7A6.Ïvˆ "ŸU org/hsqldb/lib/HsqlArrayHeap.classPK7Aµk‚"[ org/hsqldb/lib/HsqlArrayList.classPK7A¯çðˆ -×b org/hsqldb/lib/HsqlByteArrayInputStream.classPK7Aì÷–|ªË.âh org/hsqldb/lib/HsqlByteArrayOutputStream.classPK7AEºYË èp org/hsqldb/lib/HsqlDeque.classPK7A ˆ9lï]Cw org/hsqldb/lib/HsqlHeap.classPK6AÜ­[X߀}x org/hsqldb/lib/HsqlList.classPK7A¸­{®Û,$§y org/hsqldb/lib/HsqlTaskQueue$1.classPK7AXÎØ;«-Ôz org/hsqldb/lib/HsqlTaskQueue$TaskRunner.classPK7AGM¼È¶W"j} org/hsqldb/lib/HsqlTaskQueue.classPK7A%]*T°$&p org/hsqldb/lib/HsqlThreadFactory.classPK7AKR12Ø#tƒ org/hsqldb/lib/HsqlTimer$Task.classPK7Aa÷/8çõ(÷† org/hsqldb/lib/HsqlTimer$TaskQueue.classPK7Aìâ…Y¡³)4Š org/hsqldb/lib/HsqlTimer$TaskRunner.classPK7AÞ'Ï l,Œ org/hsqldb/lib/HsqlTimer.classPK7AÚÌPÿªG– org/hsqldb/lib/InOutUtil.classPK7A£zÿæk)’š org/hsqldb/lib/InputStreamInterface.classPK7A ¤Øó•'Ï› org/hsqldb/lib/InputStreamWrapper.classPK7AF•˜É>œ)Ÿ org/hsqldb/lib/IntKeyHashMap$KeySet.classPK7Ahê°3R)¬¡ org/hsqldb/lib/IntKeyHashMap$Values.classPK7Aο)%G"6¤ org/hsqldb/lib/IntKeyHashMap.classPK7A©Z—©HÄ3«§ org/hsqldb/lib/IntKeyHashMapConcurrent$KeySet.classPK7AH?ÖÜ<z3Tª org/hsqldb/lib/IntKeyHashMapConcurrent$Values.classPK7AQ¹§p> ,ñ¬ org/hsqldb/lib/IntKeyHashMapConcurrent.classPK7AT&óöE¼1»± org/hsqldb/lib/IntKeyIntValueHashMap$KeySet.classPK7A×Ò×7r1_´ org/hsqldb/lib/IntKeyIntValueHashMap$Values.classPK7A‰¨êóæ*õ¶ org/hsqldb/lib/IntKeyIntValueHashMap.classPK7A˜²‘d6™+3º org/hsqldb/lib/IntKeyLongValueHashMap.classPK7AUÊ®…Ÿ¿¼ org/hsqldb/lib/IntLookup.classPK7AiœPAо+­½ org/hsqldb/lib/IntValueHashMap$KeySet.classPK7AÓLq;2Z+ÖÀ org/hsqldb/lib/IntValueHashMap$Values.classPK7AðÔTöÁ $aà org/hsqldb/lib/IntValueHashMap.classPK6A'eÜÝÞWtÈ org/hsqldb/lib/Iterator.classPK7A=6Q›±­ 'É org/hsqldb/lib/KMPSearchAlgorithm.classPK7AXtÝp $£Î org/hsqldb/lib/LineGroupReader.classPK7A‰.D€ÇáÒÔ org/hsqldb/lib/LineReader.classPK7A`m‰Sº æ× org/hsqldb/lib/LongDeque.classPK7A;$? *…Ý org/hsqldb/lib/LongKeyHashMap$KeySet.classPK7Aš]™2V*à org/hsqldb/lib/LongKeyHashMap$Values.classPK7A?z@ßc #¦â org/hsqldb/lib/LongKeyHashMap.classPK7A‹Ð| IÀ2”è org/hsqldb/lib/LongKeyIntValueHashMap$KeySet.classPK7A•í:v2=ë org/hsqldb/lib/LongKeyIntValueHashMap$Values.classPK7AkŠeW-û+×í org/hsqldb/lib/LongKeyIntValueHashMap.classPK7AS»WDHÄ3]ñ org/hsqldb/lib/LongKeyLongValueHashMap$KeySet.classPK7A—ug:z3ô org/hsqldb/lib/LongKeyLongValueHashMap$Values.classPK7A¡®,{á,¡ö org/hsqldb/lib/LongKeyLongValueHashMap.classPK7AžÆ{Z¥Èú org/hsqldb/lib/LongLookup.classPK7Agœ†JÑÄ, û org/hsqldb/lib/LongValueHashMap$KeySet.classPK7A…Ìòiü%6þ org/hsqldb/lib/LongValueHashMap.classPK7A8“iÀò org/hsqldb/lib/MD5.classPK7AÑd ;ù-ø org/hsqldb/lib/MultiValueHashMap$KeySet.classPK7AÊ2%|5b-Ò org/hsqldb/lib/MultiValueHashMap$Values.classPK7A#î̵¥&b org/hsqldb/lib/MultiValueHashMap.classPK6Aê·HIÄ%[ org/hsqldb/lib/ObjectComparator.classPK7AÈË–K #= org/hsqldb/lib/OrderedHashSet.classPK7Aàz² éŽ&Ù org/hsqldb/lib/OrderedIntHashSet.classPK7AðnȦG¸0 org/hsqldb/lib/OrderedIntKeyHashMap$KeySet.classPK7A?€ðá;n0» org/hsqldb/lib/OrderedIntKeyHashMap$Values.classPK7AÙW )T org/hsqldb/lib/OrderedIntKeyHashMap.classPK7A!öú\Å'K" org/hsqldb/lib/OrderedLongHashSet.classPK7AŸ@¦%H¼1±& org/hsqldb/lib/OrderedLongKeyHashMap$KeySet.classPK7Acx<r1X) org/hsqldb/lib/OrderedLongKeyHashMap$Values.classPK7A¥+;¥Í|*ó+ org/hsqldb/lib/OrderedLongKeyHashMap.classPK7Açz)ª/ 0 org/hsqldb/lib/RCData.classPK7A‹Á¬b•1< org/hsqldb/lib/ReadWriteLockDummy$LockDummy.classPK7A‚A\¦'Q> org/hsqldb/lib/ReadWriteLockDummy.classPK7A UsYÿ&¨? org/hsqldb/lib/ReaderInputStream.classPK8AŠMîœåè7UA org/hsqldb/lib/RefCapablePropertyResourceBundle$1.classPK8A!Üæî€"5ŸC org/hsqldb/lib/RefCapablePropertyResourceBundle.classPK8Añ‚Í‹ò*‚S org/hsqldb/lib/RefCapableRBInterface.classPK6Aß´'©ñ€ÌT org/hsqldb/lib/Set.classPK7AôØM+¢ V org/hsqldb/lib/SimpleLog.classPK7AY(çIÓ{z\ org/hsqldb/lib/StopWatch.classPK7A.ŒßBð™_ org/hsqldb/lib/Storage.classPK7AÃ,¦[z%ô` org/hsqldb/lib/StringComparator.classPK7Ao|yÁê :$Ob org/hsqldb/lib/StringConverter.classPK7A47Ïß©€&‹o org/hsqldb/lib/StringInputStream.classPK7Aä¯ ã ˆq org/hsqldb/lib/StringUtil.classPK7A~=-q"Ùw org/hsqldb/lib/ThreadFactory.classPK8A­iùûæ)-šx org/hsqldb/lib/ValidatingResourceBundle.classPK7AÑbŠËå¨$Û€ org/hsqldb/lib/WrapperIterator.classPK9A„ org/hsqldb/lib/java/PK7A`ÂûÓ† $V„ org/hsqldb/lib/java/JavaSystem.classPK®A_;=òAO{‰ org/hsqldb/lib/package.htmlPK9AŠ org/hsqldb/lib/tar/PK7Aþ.¹Ä¼ !HŠ org/hsqldb/lib/tar/DbBackup.classPK8A}­ 2´Õ S– org/hsqldb/lib/tar/PIFData.classPK8A p€„ %U› org/hsqldb/lib/tar/PIFGenerator.classPK8AÙœî»D 6E¡ org/hsqldb/lib/tar/RB.classPK8A<$&‹ý +Ò¬ org/hsqldb/lib/tar/TarFileInputStream.classPK8A­‚Ñ@õx8(² org/hsqldb/lib/tar/TarFileOutputStream$Compression.classPK8A\!ܽ5Ž,ƒ³ org/hsqldb/lib/tar/TarFileOutputStream.classPK8AÅgAg‘é8¼ org/hsqldb/lib/tar/TarGenerator$TarEntrySupplicant.classPK8A6ÂGþ­X% Ì org/hsqldb/lib/tar/TarGenerator.classPK8AAÞ¢I' Õ org/hsqldb/lib/tar/TarHeaderField.classPK7AÀ9Ÿê—±.§Ø org/hsqldb/lib/tar/TarMalformatException.classPK8AòX°¥†ñ>šÙ org/hsqldb/lib/tar/TarReader$TarEntryHeader$MissingField.classPK8AGœ›A; Ä1ŒÛ org/hsqldb/lib/tar/TarReader$TarEntryHeader.classPK8AÖÆà "&å org/hsqldb/lib/tar/TarReader.classPK‘®As_Õ?ó org/hsqldb/lib/tar/package.htmlPK‘®AÞ¤>‘óÖ (ô org/hsqldb/lib/tar/rb.propertiesPK9Aiý org/hsqldb/lib/tar/rb/PK‘®AÌ®Í*¯ý org/hsqldb/lib/tar/rb/DbBackup.syntax.textPK‘®AAøé˜xÓ- ÿ org/hsqldb/lib/tar/rb/DbBackup.syntax_de.textPK‘®A“¶"•½.Ý org/hsqldb/lib/tar/rb/TarGenerator.syntax.textPK‘®Aôò³ä1Î org/hsqldb/lib/tar/rb/TarGenerator.syntax_de.textPK‘®AƒF^*ÚN+à org/hsqldb/lib/tar/rb/TarReader.syntax.textPK‘®Aבþ†. org/hsqldb/lib/tar/rb/TarReader.syntax_de.textPK‘®Aæµömv‰)s org/hsqldb/lib/tar/rb/listing.format.textPK‘®A§1±Œ,@ org/hsqldb/lib/tar/rb/listing.format_de.textPK‘®Ab¤L’¶ /# org/hsqldb/lib/tar/rb_de.propertiesPK9A  org/hsqldb/navigator/PK7Aî‚ê…Ë(e org/hsqldb/navigator/RangeIterator.classPK7A— .$ org/hsqldb/navigator/RowSetNavigatorData.classPK7AkØ–%4­2 org/hsqldb/navigator/RowSetNavigatorDataChange.classPK7AÄ'ÄiÐ' :¥4 org/hsqldb/navigator/RowSetNavigatorDataChangeMemory.classPK7A†Šp DP!3Ý: org/hsqldb/navigator/RowSetNavigatorDataTable.classPK‰®Am#ï ”Å‚I org/hsqldb/package.htmlPK9A[J org/hsqldb/persist/PK7Aˆ!¨/É5žJ org/hsqldb/persist/Cache$CachedObjectComparator.classPK7A‡íñŠ÷ ¡0M org/hsqldb/persist/Cache.classPK7AÑ·?¹§ %sW org/hsqldb/persist/CachedObject.classPK7AåhØ3´ mY org/hsqldb/persist/Crypto.classPK7AR¾-è#É-í^ org/hsqldb/persist/DataFileBlockManager.classPK7A¤„XK¬G&kc org/hsqldb/persist/DataFileCache.classPK7A*åÔ(¸ - ƒ org/hsqldb/persist/DataFileCacheSession.classPK7AiÜéØ ÿ'‰ org/hsqldb/persist/DataFileDefrag.classPK7A BDÓEl</J— org/hsqldb/persist/HsqlDatabaseProperties.classPK7A¤¼xæÅ 'ì± org/hsqldb/persist/HsqlProperties.classPK7Aö€v_ªÎ%'Á org/hsqldb/persist/LobManager$1.classPK7AaÁF²Ñ(0$à org/hsqldb/persist/LobManager$ALLOC_BLOCKS.classPK7AýOßG1SÄ org/hsqldb/persist/LobManager$DELETE_BLOCKS.classPK7AÞ•Ó§¼0‘Å org/hsqldb/persist/LobManager$DIVIDE_BLOCK.classPK7A­ô¬šÓ(0«Æ org/hsqldb/persist/LobManager$GET_LOB_PART.classPK7A`¦óõÛ:(ÜÇ org/hsqldb/persist/LobManager$LOBS.classPK7A&[0vß@+ É org/hsqldb/persist/LobManager$LOB_IDS.classPK7A`‹¹1EÊ org/hsqldb/persist/LobManager$UPDATE_LENGTH.classPK7A÷B¿0]Ë org/hsqldb/persist/LobManager$UPDATE_USAGE.classPK7A1öœì"”N#zÌ org/hsqldb/persist/LobManager.classPK7A¸«N­®è!·ï org/hsqldb/persist/LobStore.classPK8A£øÚ:ÂÙ&´ð org/hsqldb/persist/LobStoreInJar.classPK8A²A*°$Êõ org/hsqldb/persist/LobStoreMem.classPK8AšZ^Ï‹ 'Fù org/hsqldb/persist/LobStoreRAFile.classPK7Ă󾌰#jþ org/hsqldb/persist/LockFile$1.classPK7Aqz‡¼ ú/Gÿ org/hsqldb/persist/LockFile$BaseException.classPK7AïªC ¯i?®org/hsqldb/persist/LockFile$FileCanonicalizationException.classPK7AÜ}îÅžq7Êorg/hsqldb/persist/LockFile$FileSecurityException.classPK7AO)É»» 1Íorg/hsqldb/persist/LockFile$HeartbeatRunner.classPK7A‰Uº”õ=çorg/hsqldb/persist/LockFile$LockHeldExternallyException.classPK7A†(+°j>a org/hsqldb/persist/LockFile$UnexpectedEndOfFileException.classPK7AcXÝ«a;} org/hsqldb/persist/LockFile$UnexpectedFileIOException.classPK7A{;ÿÛ¯‹A‘org/hsqldb/persist/LockFile$UnexpectedFileNotFoundException.classPK7Ak´´áœ 6¯org/hsqldb/persist/LockFile$WrongLengthException.classPK7A—-í?H,5¯org/hsqldb/persist/LockFile$WrongMagicException.classPK7A¾B–ÛTÎ'!Zorg/hsqldb/persist/LockFile.classPK7A츄ú,ý(org/hsqldb/persist/Log.classPK7Acáš¿5+]<org/hsqldb/persist/Logger.classPK7A”ʀ˧ü (irorg/hsqldb/persist/PersistentStore.classPK7A©í™2fvorg/hsqldb/persist/PersistentStoreCollection.classPK7AþLˆœêª:_worg/hsqldb/persist/PersistentStoreCollectionDatabase.classPK7Ax;y B9±zorg/hsqldb/persist/PersistentStoreCollectionSession.classPK7AΦ™¼KH7‘„org/hsqldb/persist/RAShadowFile$InputStreamShadow.classPK7A3kµ¿^%A‰org/hsqldb/persist/RAShadowFile.classPK7AâùY53.S‘org/hsqldb/persist/RandomAccessInterface.classPK8A<® ƒ‚ž"$ä’org/hsqldb/persist/RowStoreAVL.classPK8A“ðLï8 Š(¸¢org/hsqldb/persist/RowStoreAVLDisk.classPK8Aÿ&'?m,F­org/hsqldb/persist/RowStoreAVLDiskData.classPK8AwLö/¿^org/hsqldb/resources/data-type-names.propertiesPK—®Arhç7Ó˜1(`org/hsqldb/resources/data-type-remarks.propertiesPK—®A û d Ñ¡+Zborg/hsqldb/resources/information-schema.sqlPK—®AõoRlW2´‚org/hsqldb/resources/jdklogging-default.propertiesPK—®AÑæGIVË#k…org/hsqldb/resources/lob-schema.sqlPK—®A妻ZÂÐ>‹org/hsqldb/resources/org_hsqldb_DatabaseClassLoader.propertiesPK—®AûŒtím:@Žorg/hsqldb/resources/org_hsqldb_Server_messages.propertiesPK˜®Aä>Œ&lyd2•’org/hsqldb/resources/sql-state-messages.propertiesPK—®AÏ…E$Úy5a±org/hsqldb/resources/sql-state-messages_es.propertiesPK—®AƒÉýi_©- Öorg/hsqldb/resources/table-remarks.propertiesPK—®A¹“<*³7)ÃÛorg/hsqldb/resources/webserver.propertiesPK9AÍÜorg/hsqldb/result/PK7A"Chh€KÝorg/hsqldb/result/Result.classPK7A9Z]í*ˆ '`úorg/hsqldb/result/ResultConstants.classPK7A8?+“Êy0ßþorg/hsqldb/result/ResultLob$LobResultTypes.classPK7AÄ}MËÞ¿!org/hsqldb/result/ResultLob.classPK7Aú ± ¯&4 org/hsqldb/result/ResultMetaData.classPK7A¸á÷šìM(9org/hsqldb/result/ResultProperties.classPK9A{org/hsqldb/rights/PK8AÙ(—íx&½org/hsqldb/rights/GrantConstants.classPK7Aª:´ 1þorg/hsqldb/rights/Grantee.classPK7Aæa½$&W0org/hsqldb/rights/GranteeManager.classPK7AÖ\KÙz†$¬@org/hsqldb/rights/Right.classPK7AFq¿új¨ qPorg/hsqldb/rights/User.classPK7AIM¶ˆ9 C#%Vorg/hsqldb/rights/UserManager.classPK9A¯aorg/hsqldb/rowio/PK7A ZP¥M#ðaorg/hsqldb/rowio/RowInputBase.classPK7A6}£ÏÁ—%æhorg/hsqldb/rowio/RowInputBinary.classPK8Au' €©(úqorg/hsqldb/rowio/RowInputBinary180.classPK8Aÿdñ`›j+Ðtorg/hsqldb/rowio/RowInputBinaryDecode.classPK7A_Ä6. (Ävorg/hsqldb/rowio/RowInputInterface.classPK7A‰JQƒ, R#Hxorg/hsqldb/rowio/RowInputText.classPK7A:á|” &Ńorg/hsqldb/rowio/RowInputTextLog.classPK7A``“³T)­‘org/hsqldb/rowio/RowInputTextQuoted.classPK7Aüj|QÉ’$¡•org/hsqldb/rowio/RowOutputBase.classPK7A„zÔ`b –&¼org/hsqldb/rowio/RowOutputBinary.classPK8AR~l/U>)r©org/hsqldb/rowio/RowOutputBinary180.classPK8A¦ú N]á,¬org/hsqldb/rowio/RowOutputBinaryEncode.classPK7A…l¦")Õ®org/hsqldb/rowio/RowOutputInterface.classPK7Aóÿ©þâ ³$Ò°org/hsqldb/rowio/RowOutputText.classPK7AºüîÐX Ÿ'»org/hsqldb/rowio/RowOutputTextLog.classPK7A1³bu*³Äorg/hsqldb/rowio/RowOutputTextQuoted.classPK9A Çorg/hsqldb/sample/PK®AÙS?¿žÓOÇorg/hsqldb/sample/package.htmlPK9A9Èorg/hsqldb/scriptio/PK7A´¦ê> Ê*}Èorg/hsqldb/scriptio/ScriptReaderBase.classPK8AL—l# ,õËorg/hsqldb/scriptio/ScriptReaderDecode.classPK7Aâ»®A³ ý*QÑorg/hsqldb/scriptio/ScriptReaderText.classPK7AX{«<Ç È*\Üorg/hsqldb/scriptio/ScriptWriterBase.classPK7AæXG ,{éorg/hsqldb/scriptio/ScriptWriterEncode.classPK7AÔ^§¼ M*×ïorg/hsqldb/scriptio/ScriptWriterText.classPK9A®úorg/hsqldb/server/PK8A›r;–8')ðúorg/hsqldb/server/HsqlServerFactory.classPK7A—h&J )þorg/hsqldb/server/HsqlSocketFactory.classPK8A“ü‡ç î/ org/hsqldb/server/HsqlSocketFactorySecure.classPK7Ad÷ñâŸÀ0 org/hsqldb/server/HsqlSocketRequestHandler.classPK8A\+$á2ò - org/hsqldb/server/OdbcPacketInputStream.classPK8Aý,™M.org/hsqldb/server/OdbcPacketOutputStream.classPK8AöW01-Ãorg/hsqldb/server/OdbcPreparedStatement.classPK8A77Ü}  !org/hsqldb/server/OdbcUtil.classPK8A¦TY¦4 ì(org/hsqldb/server/PgType.classPK8AôaĉO.Þ7org/hsqldb/server/RecoverableOdbcFailure.classPK7A/äQãßp+Ã9org/hsqldb/server/Server$ServerThread.classPK7AoÉe+W\û;org/hsqldb/server/Server.classPK7AöpⓉ°#Ægorg/hsqldb/server/ServerAcl$1.classPK7AȳåB * horg/hsqldb/server/ServerAcl$AclEntry.classPK7A¯œìã» 4:norg/hsqldb/server/ServerAcl$AclFormatException.classPK7ALI1dàn3Woorg/hsqldb/server/ServerAcl$InternalException.classPK7AÆWwuý !˜porg/hsqldb/server/ServerAcl.classPK8AÄ÷vÊÎ +ä~org/hsqldb/server/ServerConfiguration.classPK8Aó$9¶Ž¾* …org/hsqldb/server/ServerConnection$1.classPK8AÉ(Ô Þz2ñ…org/hsqldb/server/ServerConnection$CleanExit.classPK8AUd= Ä6/‡org/hsqldb/server/ServerConnection$ClientFailure.classPK8A<þóÏu/wf(Ÿˆorg/hsqldb/server/ServerConnection.classPK7AB§[å'j¸org/hsqldb/server/ServerConstants.classPK7AòÝß ý(ݺorg/hsqldb/server/ServerProperties.classPK8A»t§ À pNÆorg/hsqldb/server/Servlet.classPK8A´³Hãm( '[Òorg/hsqldb/server/StatementPortal.classPK8Afz—ìv !Øorg/hsqldb/server/WebServer.classPK8A;V/§$+XÞorg/hsqldb/server/WebServerConnection.classPK’®AË‘)ÙAGàðorg/hsqldb/server/package.htmlPK9Amñorg/hsqldb/store/PK6Aõ6Y?ÌÑ 3®ñorg/hsqldb/store/BaseHashMap$BaseHashIterator.classPK6AõÙT„Ã8Ûöorg/hsqldb/store/BaseHashMap$MultiValueKeyIterator.classPK6A9‰êÏ1Åùorg/hsqldb/store/BaseHashMap$ValuesIterator.classPK6AÐŽ|)"ýorg/hsqldb/store/BaseHashMap.classPK6AÓà‡K¿ oorg/hsqldb/store/BitMap.classPK6Añ²£ yorg/hsqldb/store/HashIndex.classPK6ATtÔÇ€Ú*jorg/hsqldb/store/ReusableObjectCache.classPK6A§£•Ã÷ Borg/hsqldb/store/ValuePool.classPK6Aj8M’ßÄ'¬$org/hsqldb/store/ValuePoolHashMap.classPK9Aà+org/hsqldb/types/PK7AýÃK+| ž !,org/hsqldb/types/ArrayType.classPK7A"t*r=‚!ë6org/hsqldb/types/BinaryData.classPK7Aˆ¶ò"H !w?org/hsqldb/types/BinaryType.classPK8A?jâ. òÚMorg/hsqldb/types/BitType.classPK7AxIÍÊÌT[org/hsqldb/types/BlobData.classPK7Aí|’´§!k]org/hsqldb/types/BlobDataID.classPK7A„›–ü0d&adorg/hsqldb/types/BlobInputStream.classPK7AVämú åhorg/hsqldb/types/BlobType.classPK7A*Ž‹ÿ^"Ÿoorg/hsqldb/types/BooleanType.classPK7AÛh®ÐT3$îvorg/hsqldb/types/CharacterType.classPK7AÚøÒ¦Æv ”org/hsqldb/types/Charset.classPK7A§»ü–Ц’org/hsqldb/types/ClobData.classPK7AÅ_ÀÇ|ë!‰”org/hsqldb/types/ClobDataID.classPK7AÀ—Õ¶lÍ&T›org/hsqldb/types/ClobInputStream.classPK7AsM €f& org/hsqldb/types/ClobType.classPK7A[^ƒ»àê% Ǧorg/hsqldb/types/Collation.classPK7A–°{ï äõ¹org/hsqldb/types/DTIType.classPK8AÖŽhÉÏ>#0Æorg/hsqldb/types/DateTimeType.classPK7AÃíVµÜ(Jâorg/hsqldb/types/IntervalMonthData.classPK7A7C$¢XH)Uåorg/hsqldb/types/IntervalSecondData.classPK7A発ҵ„=#êorg/hsqldb/types/IntervalType.classPK7Aóù6% org/hsqldb/types/JavaObjectData.classPK7Açk–߯þ“org/hsqldb/types/LobData.classPK7Aÿè¹·ºŽorg/hsqldb/types/NullType.classPK7A‰1ù_ŠÙK!’ org/hsqldb/types/NumberType.classPK7AÇÞXa^« k)org/hsqldb/types/OtherType.classPK7A´¹á' .org/hsqldb/types/RowType.classPK7Aãß:Çý+l7org/hsqldb/types/TimeData.classPK6A¿¬:VéB$¶9org/hsqldb/types/TimestampData.classPK7Au'ä­+ñ;org/hsqldb/types/Type$TypedComparator.classPK7Ay‰êcšš=÷=org/hsqldb/types/Type.classPK7A"ͪ’ óÚVorg/hsqldb/types/Types.classPK7AK5”o‰_'¶corg/hsqldb/types/UserTypeModifier.classPK9A”jorg/hsqldb/util/PK®AίÈÔjorg/hsqldb/util/Bold.gifPK8AmXð¹vâmorg/hsqldb/util/CSVWriter.classPKŽ®AS … ¥qorg/hsqldb/util/Clear.pngPK®A¢Æ%ÙEqyorg/hsqldb/util/Close.pngPK6A' ªÑ L"9~org/hsqldb/util/CodeSwitcher.classPK®ACÃ*þg Z‹org/hsqldb/util/Colors.pngPK9A¯D?°6Ä ! ’org/hsqldb/util/CommonSwing.classPK8A dÕÒ(%™org/hsqldb/util/ConnectionDialog$1.classPK8A’jC2"(œorg/hsqldb/util/ConnectionDialog$2.classPK8A¨˜Ç l F&žorg/hsqldb/util/ConnectionDialog.classPK8A·r! 5,Pªorg/hsqldb/util/ConnectionDialogCommon.classPK9A4åtyw ù+˵org/hsqldb/util/ConnectionDialogSwing.classPK8AFý«àé'›Ãorg/hsqldb/util/ConnectionSetting.classPK8Apm^ X.ÑZ%Æorg/hsqldb/util/DatabaseManager.classPK8A\†má—!+¯ôorg/hsqldb/util/DatabaseManagerCommon.classPK9A9™ØG,éorg/hsqldb/util/DatabaseManagerSwing$1.classPK9AÅ$šf@-Šorg/hsqldb/util/DatabaseManagerSwing$10.classPK9Aá %åŸ-K org/hsqldb/util/DatabaseManagerSwing$11.classPK9A# ±äH,‹ org/hsqldb/util/DatabaseManagerSwing$2.classPK9A`e[¾åI,É org/hsqldb/util/DatabaseManagerSwing$3.classPK9A÷\™´ç,org/hsqldb/util/DatabaseManagerSwing$4.classPK9A\¢äThl,org/hsqldb/util/DatabaseManagerSwing$5.classPK9A”‚6ýil,Øorg/hsqldb/util/DatabaseManagerSwing$6.classPK9AãÉžÝ,›org/hsqldb/util/DatabaseManagerSwing$7.classPK9AØ"0+Áì,’org/hsqldb/util/DatabaseManagerSwing$8.classPK9Aˆµ,±,­org/hsqldb/util/DatabaseManagerSwing$9.classPK9Aé b<" 33org/hsqldb/util/DatabaseManagerSwing$DBMPrefs.classPK9A’?’F 8¶#org/hsqldb/util/DatabaseManagerSwing$PopupListener.classPK9AcÞnߦÊ@®*org/hsqldb/util/DatabaseManagerSwing$StatementExecRunnable.classPK9AÕUì<ÝU)´*Â-org/hsqldb/util/DatabaseManagerSwing.classPK9A ûa\1Æ'÷ƒorg/hsqldb/util/FontDialogSwing$1.classPK9Aà%Î1Æ'}…org/hsqldb/util/FontDialogSwing$2.classPK9A?½‘Mð'‡org/hsqldb/util/FontDialogSwing$3.classPK9AqçôNð'¥ˆorg/hsqldb/util/FontDialogSwing$4.classPK9AJËWh'HŠorg/hsqldb/util/FontDialogSwing$5.classPK9A³ û/Å'Œorg/hsqldb/util/FontDialogSwing$6.classPK9AG>‚u“†'‰org/hsqldb/util/FontDialogSwing$7.classPK9Aý0©Ñq ½%qorg/hsqldb/util/FontDialogSwing.classPK®A{½Ñ¥5šorg/hsqldb/util/GreenCircle.gifPK8A5É\Å OS›org/hsqldb/util/Grid.classPK9A3ëßß´ `¦org/hsqldb/util/GridSwing.classPKŽ®AE*÷2„ÛŒ¬org/hsqldb/util/Hourglass.gifPKŽ®A&ì!Ä[¯org/hsqldb/util/Italic.gifPK8A*3Öƒ !"²org/hsqldb/util/MainInvoker.classPKŽ®AÄèò~‡-·org/hsqldb/util/NoWay.gifPKŽ®Amã;*Ê M¹org/hsqldb/util/RedCircle.gifPK9Awlð<á#bºorg/hsqldb/util/TableSorter$1.classPK9AÒ.ãÀ*Õ#ï»org/hsqldb/util/TableSorter$2.classPK9Aê¦Ãö×'j½org/hsqldb/util/TableSorter$Arrow.classPK9Aƒé]‡¸+µÀorg/hsqldb/util/TableSorter$Directive.classPK9A»T±‚Á .'Âorg/hsqldb/util/TableSorter$MouseHandler.classPK9A]OæB¿%DÅorg/hsqldb/util/TableSorter$Row.classPK9A é&-~Û8ŸÈorg/hsqldb/util/TableSorter$SortableHeaderRenderer.classPK9A öA؈Û3ƒËorg/hsqldb/util/TableSorter$TableModelHandler.classPK9A†ì²¬— Ä!lÎorg/hsqldb/util/TableSorter.classPK8A ÒŒKÝ+RÙorg/hsqldb/util/Traceable.classPK8AAe§ìË ô|Úorg/hsqldb/util/Tree.classPK®A§²ã¼faåorg/hsqldb/util/hsqldb.gifPKŽ®AÍxN{\\=çorg/hsqldb/util/hsqldbtab.gifPKŽ®Aþ°éäçorg/hsqldb/util/problems.gifPKŽ®A ó"‡‡éorg/hsqldb/util/run_exc.gifPK®AeÎðÖ`^#çéorg/hsqldb/util/run_exc_running.gifPK{{pΘêhsqldb2.2-2.2.9.orig/hsqldb/src/0000755000175000017500000000000012007557304014675 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/0000755000175000017500000000000012007557304015464 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/0000755000175000017500000000000012007570424016737 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ExpressionOp.java0000644000175000017500000006766512007547374022274 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HsqlList; import org.hsqldb.store.ValuePool; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BinaryType; import org.hsqldb.types.CharacterType; import org.hsqldb.types.DateTimeType; import org.hsqldb.types.IntervalType; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Implementation of CAST, CASE, LIMIT and ZONE operations. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public class ExpressionOp extends Expression { static final ExpressionOp limitOneExpression = new ExpressionOp( OpTypes.LIMIT, new ExpressionValue(ValuePool.INTEGER_0, Type.SQL_INTEGER), new ExpressionValue(ValuePool.INTEGER_1, Type.SQL_INTEGER)); /** * Creates a special binary operation expression */ ExpressionOp(int type, Expression left, Expression right) { super(type); nodes = new Expression[BINARY]; nodes[LEFT] = left; nodes[RIGHT] = right; switch (opType) { case OpTypes.LIKE_ARG : case OpTypes.ALTERNATIVE : case OpTypes.CASEWHEN : case OpTypes.LIMIT : case OpTypes.ZONE_MODIFIER : return; case OpTypes.PREFIX : dataType = left.dataType; return; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionOp"); } } /** * creates a CAST expression */ ExpressionOp(Expression e, Type dataType) { super(OpTypes.CAST); nodes = new Expression[UNARY]; nodes[LEFT] = e; this.dataType = dataType; this.alias = e.alias; } /** * creates a special conversion for time / timestamp comparison */ ExpressionOp(Expression e) { super(e.dataType.isDateTimeTypeWithZone() ? OpTypes.CAST : OpTypes.ZONE_MODIFIER); switch (e.dataType.typeCode) { case Types.SQL_TIME_WITH_TIME_ZONE : nodes = new Expression[UNARY]; nodes[LEFT] = new ExpressionOp(OpTypes.ZONE_MODIFIER, e, null); nodes[LEFT].dataType = e.dataType; dataType = DateTimeType.getDateTimeType(Types.SQL_TIME, e.dataType.scale); break; case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : nodes = new Expression[UNARY]; nodes[LEFT] = new ExpressionOp(OpTypes.ZONE_MODIFIER, e, null); nodes[LEFT].dataType = e.dataType; dataType = DateTimeType.getDateTimeType(Types.SQL_TIMESTAMP, e.dataType.scale); break; case Types.SQL_TIME : nodes = new Expression[BINARY]; nodes[LEFT] = e; nodes[LEFT].dataType = e.dataType; dataType = DateTimeType.getDateTimeType(Types.SQL_TIME_WITH_TIME_ZONE, e.dataType.scale); break; case Types.SQL_TIMESTAMP : nodes = new Expression[BINARY]; nodes[LEFT] = e; nodes[LEFT].dataType = e.dataType; dataType = DateTimeType.getDateTimeType( Types.SQL_TIMESTAMP_WITH_TIME_ZONE, e.dataType.scale); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionOp"); } this.alias = e.alias; } public static Expression getCastExpression(Session session, Expression e, Type dataType) { if (e.getType() == OpTypes.VALUE) { Object value = dataType.castToType(session, e.getValue(session), e.getDataType()); return new ExpressionValue(value, dataType); } return new ExpressionOp(e, dataType); } public String getSQL() { StringBuffer sb = new StringBuffer(64); String left = getContextSQL(nodes.length > 0 ? nodes[LEFT] : null); String right = getContextSQL(nodes.length > 1 ? nodes[RIGHT] : null); switch (opType) { case OpTypes.VALUE : if (valueData == null) { return Tokens.T_NULL; } if (dataType == null) { throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionOp"); } return dataType.convertToSQLString(valueData); case OpTypes.LIKE_ARG : sb.append(' ').append(Tokens.T_LIKE).append(' '); sb.append(left).append(' ').append(right).append(' '); case OpTypes.CAST : sb.append(' ').append(Tokens.T_CAST).append('('); sb.append(left).append(' ').append(Tokens.T_AS).append(' '); sb.append(dataType.getTypeDefinition()); sb.append(')'); return sb.toString(); case OpTypes.CASEWHEN : sb.append(' ').append(Tokens.T_CASEWHEN).append('('); sb.append(left).append(',').append(right).append(')'); return sb.toString(); case OpTypes.ALTERNATIVE : sb.append(left).append(',').append(right); return sb.toString(); case OpTypes.LIMIT : if (left != null) { sb.append(' ').append(Tokens.T_OFFSET).append(' '); sb.append(left).append(' '); } if (right != null) { sb.append(' ').append(Tokens.T_FETCH).append(' '); sb.append(Tokens.T_FIRST); sb.append(right).append(' ').append(right).append(' '); sb.append(Tokens.T_ROWS).append(' ').append(Tokens.T_ONLY); sb.append(' '); } break; case OpTypes.ZONE_MODIFIER : sb.append(left).append(' ').append(Tokens.T_AT).append(' '); if (nodes[RIGHT] == null) { sb.append(Tokens.T_LOCAL).append(' '); break; } sb.append(Tokens.T_TIME).append(' ').append(Tokens.T_ZONE); sb.append(' '); sb.append(right); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionOp"); } return sb.toString(); } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(64); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } switch (opType) { case OpTypes.VALUE : sb.append("VALUE = ").append( dataType.convertToSQLString(valueData)); sb.append(", TYPE = ").append(dataType.getNameString()); return sb.toString(); case OpTypes.LIKE_ARG : sb.append(Tokens.T_LIKE).append(' ').append("ARG "); sb.append(dataType.getTypeDefinition()); sb.append(' '); break; case OpTypes.VALUELIST : sb.append(Tokens.T_VALUE).append(' ').append("LIST "); for (int i = 0; i < nodes.length; i++) { sb.append(nodes[i].describe(session, blanks + 1)); sb.append(' '); } return sb.toString(); case OpTypes.CAST : sb.append(Tokens.T_CAST).append(' '); sb.append(dataType.getTypeDefinition()); sb.append(' '); break; case OpTypes.CASEWHEN : sb.append(Tokens.T_CASEWHEN).append(' '); break; } if (getLeftNode() != null) { sb.append(" arg_left=["); sb.append(nodes[LEFT].describe(session, blanks + 1)); sb.append(']'); } if (getRightNode() != null) { sb.append(" arg_right=["); sb.append(nodes[RIGHT].describe(session, blanks + 1)); sb.append(']'); } return sb.toString(); } public HsqlList resolveColumnReferences(Session session, RangeGroup rangeGroup, int rangeCount, RangeGroup[] rangeGroups, HsqlList unresolvedSet, boolean acceptsSequences) { if (opType == OpTypes.VALUE) { return unresolvedSet; } switch (opType) { case OpTypes.CASEWHEN : acceptsSequences = false; break; } for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } unresolvedSet = nodes[i].resolveColumnReferences(session, rangeGroup, rangeCount, rangeGroups, unresolvedSet, acceptsSequences); } return unresolvedSet; } public void resolveTypes(Session session, Expression parent) { switch (opType) { case OpTypes.CASEWHEN : break; default : for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { nodes[i].resolveTypes(session, this); } } } switch (opType) { case OpTypes.VALUE : break; case OpTypes.LIKE_ARG : { dataType = nodes[LEFT].dataType; if (nodes[LEFT].opType == OpTypes.VALUE && (nodes[RIGHT] == null || nodes[RIGHT].opType == OpTypes.VALUE)) { setAsConstantValue(session); break; } break; } case OpTypes.CAST : { Expression node = nodes[LEFT]; Type nodeType = node.dataType; if (nodeType != null && !dataType.canConvertFrom(nodeType)) { throw Error.error(ErrorCode.X_42561); } if (node.opType == OpTypes.VALUE) { setAsConstantValue(session); node.dataType = dataType; node.valueData = valueData; if (parent != null) { parent.replaceNode(this, node); } } else if (nodes[LEFT].opType == OpTypes.DYNAMIC_PARAM) { node.dataType = dataType; } break; } case OpTypes.ZONE_MODIFIER : if (nodes[LEFT].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (nodes[RIGHT] != null) { if (nodes[RIGHT].dataType == null) { nodes[RIGHT].dataType = Type.SQL_INTERVAL_HOUR_TO_MINUTE; } if (nodes[RIGHT].dataType.typeCode != Types.SQL_INTERVAL_HOUR_TO_MINUTE) { if (nodes[RIGHT].opType == OpTypes.VALUE) { nodes[RIGHT].valueData = Type.SQL_INTERVAL_HOUR_TO_MINUTE.castToType( session, nodes[RIGHT].valueData, nodes[RIGHT].dataType); nodes[RIGHT].dataType = Type.SQL_INTERVAL_HOUR_TO_MINUTE; } else { throw Error.error(ErrorCode.X_42563); } } } switch (nodes[LEFT].dataType.typeCode) { case Types.SQL_TIME : dataType = DateTimeType.getDateTimeType( Types.SQL_TIME_WITH_TIME_ZONE, nodes[LEFT].dataType.scale); break; case Types.SQL_TIMESTAMP : dataType = DateTimeType.getDateTimeType( Types.SQL_TIMESTAMP_WITH_TIME_ZONE, nodes[LEFT].dataType.scale); break; case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : case Types.SQL_TIME_WITH_TIME_ZONE : dataType = nodes[LEFT].dataType; break; default : throw Error.error(ErrorCode.X_42563); } // no constant optimisation as value dependent on session zone break; case OpTypes.CASEWHEN : // We use CASEWHEN as parent type. // In the parent, left node is the condition, and right node is // the leaf, tagged as type ALTERNATIVE; its left node is // case 1 (how to get the value when the condition in // the parent evaluates to true), while its right node is case 2 // (how to get the value when the condition in // the parent evaluates to false). resolveTypesForCaseWhen(session); break; case OpTypes.ALTERNATIVE : break; case OpTypes.LIMIT : if (nodes[LEFT] != null) { if (nodes[LEFT].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (!nodes[LEFT].dataType.isIntegralType()) { throw Error.error(ErrorCode.X_42563); } } if (nodes[RIGHT] != null) { if (nodes[RIGHT].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (!nodes[RIGHT].dataType.isIntegralType()) { throw Error.error(ErrorCode.X_42563); } } break; case OpTypes.PREFIX : break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionOp"); } } /** * For CASE WHEN and its special cases section 9.3 of the SQL standard * on type aggregation is implemented. */ void resolveTypesForCaseWhen(Session session) { if (dataType != null) { return; } Expression expr = this; while (expr.opType == OpTypes.CASEWHEN) { expr.nodes[LEFT].resolveTypes(session, expr); if (expr.nodes[LEFT].isUnresolvedParam()) { expr.nodes[LEFT].dataType = Type.SQL_BOOLEAN; } expr.nodes[RIGHT].nodes[LEFT].resolveTypes(session, expr.nodes[RIGHT]); if (expr.nodes[RIGHT].nodes[RIGHT].opType != OpTypes.CASEWHEN) { expr.nodes[RIGHT].nodes[RIGHT].resolveTypes(session, expr.nodes[RIGHT]); } expr = expr.nodes[RIGHT].nodes[RIGHT]; } if (exprSubType == OpTypes.CAST) { if (nodes[RIGHT].nodes[RIGHT].dataType != null && nodes[RIGHT].nodes[RIGHT].dataType != nodes[RIGHT].nodes[LEFT].dataType) { Type castType = nodes[RIGHT].nodes[RIGHT].dataType; if (castType.isCharacterType()) { castType = Type.SQL_VARCHAR_DEFAULT; } nodes[RIGHT].nodes[LEFT] = new ExpressionOp(nodes[RIGHT].nodes[LEFT], castType); } } expr = this; while (expr.opType == OpTypes.CASEWHEN) { dataType = Type.getAggregateType(expr.nodes[RIGHT].nodes[LEFT].dataType, dataType); dataType = Type.getAggregateType(expr.nodes[RIGHT].nodes[RIGHT].dataType, dataType); expr = expr.nodes[RIGHT].nodes[RIGHT]; } expr = this; while (expr.opType == OpTypes.CASEWHEN) { if (expr.nodes[RIGHT].nodes[LEFT].dataType == null) { expr.nodes[RIGHT].nodes[LEFT].dataType = dataType; } if (expr.nodes[RIGHT].nodes[RIGHT].dataType == null) { expr.nodes[RIGHT].nodes[RIGHT].dataType = dataType; } if (expr.nodes[RIGHT].dataType == null) { expr.nodes[RIGHT].dataType = dataType; } expr = expr.nodes[RIGHT].nodes[RIGHT]; } if (dataType == null || dataType.typeCode == Types.SQL_ALL_TYPES) { throw Error.error(ErrorCode.X_42567); } } public Object getValue(Session session) { switch (opType) { case OpTypes.VALUE : return valueData; case OpTypes.LIKE_ARG : { boolean hasEscape = nodes[RIGHT] != null; int escapeChar = Integer.MAX_VALUE; if (dataType.isBinaryType()) { BinaryData left = (BinaryData) nodes[LEFT].getValue(session); if (left == null) { return null; } if (hasEscape) { BinaryData right = (BinaryData) nodes[RIGHT].getValue(session); if (right == null) { return null; } if (right.length(session) != 1) { throw Error.error(ErrorCode.X_2200D); } escapeChar = right.getBytes()[0]; } byte[] array = left.getBytes(); byte[] newArray = new byte[array.length]; boolean wasEscape = false; int escapeCount = 0; int i = 0; int j = 0; for (; i < array.length; i++) { if (array[i] == escapeChar) { if (wasEscape) { escapeCount++; newArray[j++] = array[i]; wasEscape = false; continue; } wasEscape = true; if (i == array.length - 1) { throw Error.error(ErrorCode.X_22025); } continue; } if (array[i] == '_' || array[i] == '%') { if (wasEscape) { escapeCount++; newArray[j++] = array[i]; wasEscape = false; continue; } break; } if (wasEscape) { throw Error.error(ErrorCode.X_22025); } newArray[j++] = array[i]; } newArray = (byte[]) ArrayUtil.resizeArrayIfDifferent(newArray, j); return new BinaryData(newArray, false); } else { String left = (String) nodes[LEFT].getValue(session); if (left == null) { return null; } if (hasEscape) { String right = (String) nodes[RIGHT].getValue(session); if (right == null) { return null; } if (right.length() != 1) { throw Error.error(ErrorCode.X_22019); } escapeChar = right.getBytes()[0]; } char[] array = left.toCharArray(); char[] newArray = new char[array.length]; boolean wasEscape = false; int escapeCount = 0; int i = 0; int j = 0; for (; i < array.length; i++) { if (array[i] == escapeChar) { if (wasEscape) { escapeCount++; newArray[j++] = array[i]; wasEscape = false; continue; } wasEscape = true; if (i == array.length - 1) { throw Error.error(ErrorCode.X_22025); } continue; } if (array[i] == '_' || array[i] == '%') { if (wasEscape) { escapeCount++; newArray[j++] = array[i]; wasEscape = false; continue; } break; } if (wasEscape) { throw Error.error(ErrorCode.X_22025); } newArray[j++] = array[i]; } return new String(newArray, 0, j); } } case OpTypes.SIMPLE_COLUMN : { Object value = session.sessionContext.rangeIterators[rangePosition] .getCurrent(columnIndex); return value; } case OpTypes.ORDER_BY : return nodes[LEFT].getValue(session); case OpTypes.PREFIX : { if (nodes[LEFT].dataType.isCharacterType()) { Object value = nodes[RIGHT].getValue(session); if (value == null) { return null; } CharacterType type = (CharacterType) nodes[RIGHT].dataType; long length = ((CharacterType) nodes[RIGHT].dataType).size(session, value); type = (CharacterType) nodes[LEFT].dataType; value = nodes[LEFT].getValue(session); if (value == null) { return null; } return type.substring(session, value, 0, length, true, false); } else { BinaryData value = (BinaryData) nodes[RIGHT].getValue(session); if (value == null) { return null; } long length = value.length(session); BinaryType type = (BinaryType) nodes[LEFT].dataType; value = (BinaryData) nodes[LEFT].getValue(session); if (value == null) { return null; } return type.substring(session, value, 0, length, true); } } case OpTypes.CAST : { Object value = dataType.castToType(session, nodes[LEFT].getValue(session), nodes[LEFT].dataType); if (dataType.userTypeModifier != null) { Constraint[] constraints = dataType.userTypeModifier.getConstraints(); for (int i = 0; i < constraints.length; i++) { constraints[i].checkCheckConstraint(session, null, null, value); } } return value; } case OpTypes.CASEWHEN : { Boolean result = (Boolean) nodes[LEFT].getValue(session); if (Boolean.TRUE.equals(result)) { return nodes[RIGHT].nodes[LEFT].getValue(session, dataType); } else { return nodes[RIGHT].nodes[RIGHT].getValue(session, dataType); } } case OpTypes.ZONE_MODIFIER : { Object leftValue = nodes[LEFT].getValue(session); Object rightValue = nodes[RIGHT] == null ? null : nodes[RIGHT] .getValue( session); if (leftValue == null) { return null; } if (nodes[RIGHT] != null && rightValue == null) { return null; } long zoneSeconds = nodes[RIGHT] == null ? session.getZoneSeconds() : ((IntervalType) nodes[RIGHT].dataType) .getSeconds(rightValue); return ((DateTimeType) dataType).changeZone(leftValue, nodes[LEFT].dataType, (int) zoneSeconds, session.getZoneSeconds()); } case OpTypes.LIMIT : // fall through default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionOp"); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementCompound.java0000644000175000017500000006767412007547352023303 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.OrderedIntHashSet; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.types.Type; /** * Implementation of Statement for PSM compound statements. * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public class StatementCompound extends Statement implements RangeGroup { final boolean isLoop; HsqlName label; StatementHandler[] handlers = StatementHandler.emptyExceptionHandlerArray; boolean hasUndoHandler; StatementQuery loopCursor; Statement[] statements; StatementExpression condition; boolean isAtomic; // ColumnSchema[] variables = ColumnSchema.emptyArray; StatementCursor[] cursors = StatementCursor.emptyArray; HashMappedList scopeVariables; RangeVariable[] rangeVariables = RangeVariable.emptyArray; Table[] tables = Table.emptyArray; HashMappedList scopeTables; // public static final StatementCompound[] emptyStatementArray = new StatementCompound[]{}; StatementCompound(int type, HsqlName label) { super(type, StatementTypes.X_SQL_CONTROL); this.label = label; isTransactionStatement = false; switch (type) { case StatementTypes.FOR : case StatementTypes.LOOP : case StatementTypes.WHILE : case StatementTypes.REPEAT : isLoop = true; break; case StatementTypes.BEGIN_END : case StatementTypes.IF : isLoop = false; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementCompound"); } } public String getSQL() { /* StringBuffer sb = new StringBuffer(); if (label != null) { sb.append(label.getStatementName()).append(':').append(' '); } switch (type) { case StatementTypes.FOR : // todo break; case StatementTypes.LOOP : sb.append(Tokens.T_LOOP).append(' '); for (int i = 0; i < statements.length; i++) { sb.append(statements[i].getSQL()).append(';'); } sb.append(Tokens.T_END).append(' ').append(Tokens.T_LOOP); break; case StatementTypes.WHILE : sb.append(Tokens.T_WHILE).append(' '); sb.append(condition.getSQL()).append(' ').append(Tokens.T_DO); sb.append(' '); for (int i = 0; i < statements.length; i++) { sb.append(statements[i].getSQL()).append(';'); } sb.append(Tokens.T_END).append(' ').append(Tokens.T_WHILE); break; case StatementTypes.REPEAT : sb.append(Tokens.T_REPEAT).append(' '); for (int i = 0; i < statements.length; i++) { sb.append(statements[i].getSQL()).append(';'); } sb.append(Tokens.T_UNTIL).append(' '); sb.append(condition.getSQL()).append(' '); sb.append(Tokens.T_END).append(' ').append(Tokens.T_REPEAT); break; case StatementTypes.BEGIN_END : sb.append(Tokens.T_BEGIN).append(' ').append(Tokens.T_ATOMIC); sb.append(' '); for (int i = 0; i < handlers.length; i++) { sb.append(handlers[i].getSQL()).append(';'); } for (int i = 0; i < variables.length; i++) { sb.append(Tokens.T_DECLARE).append(' '); sb.append(variables[i].getSQL()); if (variables[i].hasDefault()) { sb.append(' ').append(Tokens.T_DEFAULT).append(' '); sb.append(variables[i].getDefaultSQL()); } sb.append(';'); } for (int i = 0; i < statements.length; i++) { sb.append(statements[i].getSQL()).append(';'); } sb.append(Tokens.T_END); break; case StatementTypes.IF : for (int i = 0; i < statements.length; i++) { if (statements[i].type == StatementTypes.CONDITION) { if (i != 0) { sb.append(Tokens.T_ELSE).append(' '); } sb.append(Tokens.T_IF).append(' '); sb.append(statements[i].getSQL()).append(' '); sb.append(Tokens.T_THEN).append(' '); } else { sb.append(statements[i].getSQL()).append(';'); } } sb.append(Tokens.T_END).append(' ').append(Tokens.T_IF); break; } return sb.toString(); */ return sql; } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } sb.append(Tokens.T_STATEMENT); return sb.toString(); } public void setLocalDeclarations(Object[] declarations) { int varCount = 0; int handlerCount = 0; int cursorCount = 0; int tableCount = 0; for (int i = 0; i < declarations.length; i++) { if (declarations[i] instanceof ColumnSchema) { varCount++; } else if (declarations[i] instanceof StatementHandler) { handlerCount++; } else if (declarations[i] instanceof Table) { tableCount++; } else { cursorCount++; } } if (varCount > 0) { variables = new ColumnSchema[varCount]; } if (handlerCount > 0) { handlers = new StatementHandler[handlerCount]; } if (tableCount > 0) { tables = new Table[tableCount]; } if (cursorCount > 0) { cursors = new StatementCursor[cursorCount]; } varCount = 0; handlerCount = 0; tableCount = 0; cursorCount = 0; for (int i = 0; i < declarations.length; i++) { if (declarations[i] instanceof ColumnSchema) { variables[varCount++] = (ColumnSchema) declarations[i]; } else if (declarations[i] instanceof StatementHandler) { StatementHandler handler = (StatementHandler) declarations[i]; handler.setParent(this); handlers[handlerCount++] = handler; if (handler.handlerType == StatementHandler.UNDO) { hasUndoHandler = true; } } else if (declarations[i] instanceof Table) { Table table = (Table) declarations[i]; tables[tableCount++] = table; } else { StatementCursor cursor = (StatementCursor) declarations[i]; cursors[cursorCount++] = cursor; } } setVariables(); setHandlers(); setTables(); setCursors(); } public void setLoopStatement(StatementQuery cursorStatement) { loopCursor = cursorStatement; HsqlName[] colNames = cursorStatement.queryExpression.getResultColumnNames(); Type[] colTypes = cursorStatement.queryExpression.getColumnTypes(); ColumnSchema[] columns = new ColumnSchema[colNames.length]; for (int i = 0; i < colNames.length; i++) { columns[i] = new ColumnSchema(colNames[i], colTypes[i], false, false, null); columns[i].setParameterMode(SchemaObject.ParameterModes.PARAM_IN); } setLocalDeclarations(columns); } void setStatements(Statement[] statements) { for (int i = 0; i < statements.length; i++) { statements[i].setParent(this); } this.statements = statements; } public void setCondition(StatementExpression condition) { this.condition = condition; } public Result execute(Session session) { Result result; switch (type) { case StatementTypes.BEGIN_END : { initialiseVariables(session); result = executeBlock(session); break; } case StatementTypes.FOR : result = executeForLoop(session); break; case StatementTypes.LOOP : case StatementTypes.WHILE : case StatementTypes.REPEAT : { result = executeLoop(session); break; } case StatementTypes.IF : { result = executeIf(session); break; } default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementCompound"); } if (result.isError()) { result.getException().setStatementType(group, type); } return result; } private Result executeBlock(Session session) { Result result = Result.updateZeroResult; boolean push = !root.isTrigger(); if (push) { session.sessionContext.push(); if (hasUndoHandler) { String name = HsqlNameManager.getAutoSavepointNameString( session.actionTimestamp, session.sessionContext.depth); session.savepoint(name); } } for (int i = 0; i < statements.length; i++) { result = statements[i].execute(session); result = handleCondition(session, result); if (result.isError()) { break; } if (result.getType() == ResultConstants.VALUE || result.getType() == ResultConstants.DATA) { break; } } if (result.getType() == ResultConstants.VALUE) { if (result.getErrorCode() == StatementTypes.LEAVE) { if (result.getMainString() == null) { result = Result.updateZeroResult; } else if (label != null && label.name.equals(result.getMainString())) { result = Result.updateZeroResult; } } } if (push) { session.sessionContext.pop(); } return result; } private Result handleCondition(Session session, Result result) { String sqlState = null; if (result.isError()) { sqlState = result.getSubString(); } else if (session.getLastWarning() != null) { sqlState = session.getLastWarning().getSQLState(); } else { return result; } if (sqlState != null) { for (int i = 0; i < handlers.length; i++) { StatementHandler handler = handlers[i]; session.clearWarnings(); /** * @todo - if condition is "transaction rollback" promote to * top call level without any further action * if condition is system related promote to top level * schema manipulation conditions are never handled */ if (handler.handlesCondition(sqlState)) { session.resetSchema(); String labelString = label == null ? null : label.name; switch (handler.handlerType) { case StatementHandler.CONTINUE : result = Result.updateZeroResult; break; case StatementHandler.UNDO : session.rollbackToSavepoint(); result = Result.newPSMResult(StatementTypes.LEAVE, labelString, null); break; case StatementHandler.EXIT : result = Result.newPSMResult(StatementTypes.LEAVE, null, null); break; } Result actionResult = handler.statement.execute(session); if (actionResult.isError()) { result = actionResult; handleCondition(session, result); } else { return result; } } } if (parent != null) { // unhandled exception condition return parent.handleCondition(session, result); } } return result; } private Result executeForLoop(Session session) { Result queryResult = loopCursor.execute(session); if (queryResult.isError()) { return queryResult; } Result result = Result.updateZeroResult; while (queryResult.navigator.hasNext()) { queryResult.navigator.next(); Object[] data = queryResult.navigator.getCurrent(); initialiseVariables(session, data, queryResult.metaData.getColumnCount()); for (int i = 0; i < statements.length; i++) { result = statements[i].execute(session); if (result.isError()) { break; } if (result.getType() == ResultConstants.VALUE) { break; } if (result.getType() == ResultConstants.DATA) { break; } } if (result.isError()) { break; } if (result.getType() == ResultConstants.VALUE) { if (result.getErrorCode() == StatementTypes.ITERATE) { if (result.getMainString() == null) { continue; } if (label != null && label.name.equals(result.getMainString())) { continue; } break; } if (result.getErrorCode() == StatementTypes.LEAVE) { break; } // return break; } if (result.getType() == ResultConstants.DATA) { break; } } queryResult.navigator.release(); return result; } private Result executeLoop(Session session) { Result result = Result.updateZeroResult; while (true) { if (type == StatementTypes.WHILE) { result = condition.execute(session); if (result.isError()) { break; } if (!Boolean.TRUE.equals(result.getValueObject())) { result = Result.updateZeroResult; break; } } for (int i = 0; i < statements.length; i++) { result = statements[i].execute(session); if (result.isError()) { break; } if (result.getType() == ResultConstants.VALUE) { break; } if (result.getType() == ResultConstants.DATA) { break; } } if (result.isError()) { break; } if (result.getType() == ResultConstants.VALUE) { if (result.getErrorCode() == StatementTypes.ITERATE) { if (result.getMainString() == null) { continue; } if (label != null && label.name.equals(result.getMainString())) { continue; } break; } if (result.getErrorCode() == StatementTypes.LEAVE) { if (result.getMainString() == null) { result = Result.updateZeroResult; } if (label != null && label.name.equals(result.getMainString())) { result = Result.updateZeroResult; } break; } // return break; } if (result.getType() == ResultConstants.DATA) { break; } if (type == StatementTypes.REPEAT) { result = condition.execute(session); if (result.isError()) { break; } if (Boolean.TRUE.equals(result.getValueObject())) { result = Result.updateZeroResult; break; } } } return result; } private Result executeIf(Session session) { Result result = Result.updateZeroResult; boolean execute = false; for (int i = 0; i < statements.length; i++) { if (statements[i].getType() == StatementTypes.CONDITION) { if (execute) { break; } result = statements[i].execute(session); if (result.isError()) { break; } Object value = result.getValueObject(); execute = Boolean.TRUE.equals(value); i++; } result = Result.updateZeroResult; if (!execute) { continue; } result = statements[i].execute(session); if (result.isError()) { break; } if (result.getType() == ResultConstants.VALUE) { break; } } return result; } public void resolve(Session session) { for (int i = 0; i < statements.length; i++) { if (statements[i].getType() == StatementTypes.LEAVE || statements[i].getType() == StatementTypes.ITERATE) { if (!findLabel((StatementSimple) statements[i])) { throw Error.error( ErrorCode.X_42508, ((StatementSimple) statements[i]).label.name); } continue; } if (statements[i].getType() == StatementTypes.RETURN) { if (!root.isFunction()) { throw Error.error(ErrorCode.X_42602, Tokens.T_RETURN); } } } for (int i = 0; i < statements.length; i++) { statements[i].resolve(session); } for (int i = 0; i < handlers.length; i++) { handlers[i].resolve(session); } OrderedHashSet writeTableNamesSet = new OrderedHashSet(); OrderedHashSet readTableNamesSet = new OrderedHashSet(); OrderedHashSet set = new OrderedHashSet(); for (int i = 0; i < variables.length; i++) { OrderedHashSet refs = variables[i].getReferences(); if (refs != null) { set.addAll(refs); } } if (condition != null) { set.addAll(condition.getReferences()); readTableNamesSet.addAll(condition.getTableNamesForRead()); } for (int i = 0; i < statements.length; i++) { set.addAll(statements[i].getReferences()); readTableNamesSet.addAll(statements[i].getTableNamesForRead()); writeTableNamesSet.addAll(statements[i].getTableNamesForWrite()); } for (int i = 0; i < handlers.length; i++) { set.addAll(handlers[i].getReferences()); readTableNamesSet.addAll(handlers[i].getTableNamesForRead()); writeTableNamesSet.addAll(handlers[i].getTableNamesForWrite()); } readTableNamesSet.removeAll(writeTableNamesSet); readTableNames = new HsqlName[readTableNamesSet.size()]; readTableNamesSet.toArray(readTableNames); writeTableNames = new HsqlName[writeTableNamesSet.size()]; writeTableNamesSet.toArray(writeTableNames); references = set; } public void setRoot(Routine routine) { root = routine; /* if (condition != null) { condition.setRoot(routine); } for (int i = 0; i < statements.length; i++) { statements[i].setRoot(routine); } */ } public String describe(Session session) { return ""; } public OrderedHashSet getReferences() { return references; } public void setAtomic(boolean atomic) { this.isAtomic = atomic; } // private void setVariables() { HashMappedList list = new HashMappedList(); if (variables.length == 0) { if (parent == null) { rangeVariables = root.getRangeVariables(); } else { rangeVariables = parent.rangeVariables; } scopeVariables = list; return; } if (parent != null && parent.scopeVariables != null) { for (int i = 0; i < parent.scopeVariables.size(); i++) { list.add(parent.scopeVariables.getKey(i), parent.scopeVariables.get(i)); } } for (int i = 0; i < variables.length; i++) { String name = variables[i].getName().name; boolean added = list.add(name, variables[i]); if (!added) { throw Error.error(ErrorCode.X_42606, name); } if (root.getParameterIndex(name) != -1) { throw Error.error(ErrorCode.X_42606, name); } } scopeVariables = list; RangeVariable[] parameterRangeVariables = root.getRangeVariables(); RangeVariable range = new RangeVariable(list, null, true, RangeVariable.VARIALBE_RANGE); rangeVariables = new RangeVariable[parameterRangeVariables.length + 1]; for (int i = 0; i < parameterRangeVariables.length; i++) { rangeVariables[i] = parameterRangeVariables[i]; } rangeVariables[parameterRangeVariables.length] = range; root.variableCount = list.size(); } private void setHandlers() { if (handlers.length == 0) { return; } HashSet statesSet = new HashSet(); OrderedIntHashSet typesSet = new OrderedIntHashSet(); for (int i = 0; i < handlers.length; i++) { int[] types = handlers[i].getConditionTypes(); for (int j = 0; j < types.length; j++) { if (!typesSet.add(types[j])) { throw Error.error(ErrorCode.X_42601); } } String[] states = handlers[i].getConditionStates(); for (int j = 0; j < states.length; j++) { if (!statesSet.add(states[j])) { throw Error.error(ErrorCode.X_42601); } } } } private void setTables() { if (tables.length == 0) { return; } HashMappedList list = new HashMappedList(); if (parent != null && parent.scopeTables != null) { for (int i = 0; i < parent.scopeTables.size(); i++) { list.add(parent.scopeTables.getKey(i), parent.scopeTables.get(i)); } } for (int i = 0; i < tables.length; i++) { String name = tables[i].getName().name; boolean added = list.add(name, tables[i]); if (!added) { throw Error.error(ErrorCode.X_42606, name); } } scopeTables = list; } private void setCursors() { if (cursors.length == 0) { return; } HashSet list = new HashSet(); for (int i = 0; i < cursors.length; i++) { StatementCursor cursor = cursors[i]; boolean added = list.add(cursor.getCursorName().name); if (!added) { throw Error.error(ErrorCode.X_42606, cursor.getCursorName().name); } } } private boolean findLabel(StatementSimple statement) { if (label != null && statement.label.name.equals(label.name)) { if (!isLoop && statement.getType() == StatementTypes.ITERATE) { return false; } return true; } if (parent == null) { return false; } return parent.findLabel(statement); } private void initialiseVariables(Session session) { Object[] vars = session.sessionContext.routineVariables; int offset = parent == null ? 0 : parent.scopeVariables.size(); for (int i = 0; i < variables.length; i++) { try { vars[offset + i] = variables[i].getDefaultValue(session); } catch (HsqlException e) {} } } private void initialiseVariables(Session session, Object[] data, int count) { Object[] vars = session.sessionContext.routineVariables; int offset = parent == null ? 0 : parent.scopeVariables.size(); for (int i = 0; i < count; i++) { try { vars[offset + i] = data[i]; } catch (HsqlException e) {} } } public RangeVariable[] getRangeVariables() { return rangeVariables; } public void setCorrelated() { // } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Scanner.java0000644000175000017500000021002312007547362021176 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.math.BigDecimal; import java.util.Locale; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.CharArrayWriter; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.lib.OrderedIntHashSet; import org.hsqldb.lib.java.JavaSystem; import org.hsqldb.store.BitMap; import org.hsqldb.store.ValuePool; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BinaryType; import org.hsqldb.types.BitType; import org.hsqldb.types.CharacterType; import org.hsqldb.types.DTIType; import org.hsqldb.types.DateTimeType; import org.hsqldb.types.IntervalMonthData; import org.hsqldb.types.IntervalSecondData; import org.hsqldb.types.IntervalType; import org.hsqldb.types.NumberType; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Scans for SQL tokens. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class Scanner { /* ::= | |

* * DDL BLOCK: definition of DB objects, users and rights at startup time
* DATA BLOCK: all data for MEMORY tables at startup time
* LOG BLOCK: SQL statements logged since startup or the last CHECKPOINT
* * The implementation of this class and its subclasses support the formats * used for writing the data. Since 1.7.2 the data can also be * written as binray in order to speed up shutdown and startup.

* * From 1.7.2, two separate files are used, one for the DDL + DATA BLOCK and * the other for the LOG BLOCK.

* * A related use for this class is for saving a current snapshot of the * database data to a user-defined file. This happens in the SHUTDOWN COMPACT * process or done as a result of the SCRIPT command. In this case, the * DATA block contains the CACHED table data as well.

* * DatabaseScriptReader and its subclasses read back the data at startup time. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.1.1 * @since 1.7.2 */ public abstract class ScriptWriterBase implements Runnable { Database database; String outFile; OutputStream fileStreamOut; FileAccess.FileSync outDescriptor; int tableRowCount; HsqlName schemaToLog; boolean isClosed; // boolean isCompressed; boolean isCrypt; /** * this determines if the script is the normal script (false) used * internally by the engine or a user-initiated snapshot of the DB (true) */ boolean isDump; boolean includeCachedData; long byteCount; long lineCount; volatile boolean needsSync; private int syncCount; static final int INSERT = 0; static final int INSERT_WITH_SCHEMA = 1; /** the last schema for last sessionId */ Session currentSession; public static final String[] LIST_SCRIPT_FORMATS = new String[] { Tokens.T_TEXT, Tokens.T_BINARY, null, Tokens.T_COMPRESSED }; ScriptWriterBase(Database db, OutputStream outputStream, FileAccess.FileSync descriptor, boolean includeCachedData) { initBuffers(); this.database = db; this.includeCachedData = includeCachedData; currentSession = database.sessionManager.getSysSession(); // start with neutral schema - no SET SCHEMA to log schemaToLog = currentSession.loggedSchema = currentSession.currentSchema; fileStreamOut = new BufferedOutputStream(outputStream, 1 << 14); outDescriptor = descriptor; } ScriptWriterBase(Database db, String file, boolean includeCachedData, boolean isNewFile, boolean isDump) { initBuffers(); boolean exists = false; if (isDump) { exists = FileUtil.getFileUtil().exists(file); } else { exists = db.logger.getFileAccess().isStreamElement(file); } if (exists && isNewFile) { throw Error.error(ErrorCode.FILE_IO_ERROR, file); } this.database = db; this.isDump = isDump; this.includeCachedData = includeCachedData; outFile = file; currentSession = database.sessionManager.getSysSession(); // start with neutral schema - no SET SCHEMA to log schemaToLog = currentSession.loggedSchema = currentSession.currentSchema; openFile(); } protected abstract void initBuffers(); /** * Called internally or externally in write delay intervals. */ public void sync() { if (isClosed) { return; } if (needsSync) { forceSync(); } } public void forceSync() { if (isClosed) { return; } needsSync = false; synchronized (fileStreamOut) { try { fileStreamOut.flush(); outDescriptor.sync(); syncCount++; /* System.out.println( this.outFile + " FD.sync done at " + new java.sql.Timestamp(System.currentTimeMillis())); */ } catch (IOException e) { database.logger.logWarningEvent("ScriptWriter synch error: ", e); } } } public void close() { stop(); if (isClosed) { return; } try { synchronized (fileStreamOut) { finishStream(); forceSync(); fileStreamOut.close(); fileStreamOut = null; outDescriptor = null; isClosed = true; } } catch (IOException e) { throw Error.error(ErrorCode.FILE_IO_ERROR); } byteCount = 0; lineCount = 0; } public long size() { return byteCount; } public void writeAll() { try { writeDDL(); writeExistingData(); } catch (IOException e) { throw Error.error(ErrorCode.FILE_IO_ERROR); } } /** * File is opened in append mode although in current usage the file * never pre-exists */ protected void openFile() { try { FileAccess fa = isDump ? FileUtil.getFileUtil() : database.logger.getFileAccess(); OutputStream fos = fa.openOutputStreamElement(outFile); outDescriptor = fa.getFileSync(fos); fileStreamOut = fos; fileStreamOut = new BufferedOutputStream(fos, 1 << 14); } catch (IOException e) { throw Error.error(e, ErrorCode.FILE_IO_ERROR, ErrorCode.M_Message_Pair, new Object[] { e.toString(), outFile }); } } protected void finishStream() throws IOException {} protected void writeDDL() throws IOException { Result ddlPart = database.getScript(!includeCachedData); writeSingleColumnResult(ddlPart); } protected void writeExistingData() throws IOException { // start with blank schema - SET SCHEMA to log currentSession.loggedSchema = null; String[] schemas = database.schemaManager.getSchemaNamesArray(); for (int i = 0; i < schemas.length; i++) { String schema = schemas[i]; Iterator tables = database.schemaManager.databaseObjectIterator(schema, SchemaObject.TABLE); while (tables.hasNext()) { Table t = (Table) tables.next(); // write all memory table data // write cached table data unless index roots have been written // write all text table data apart from readonly text tables // unless index roots have been written boolean script = false; switch (t.getTableType()) { case TableBase.MEMORY_TABLE : script = true; break; case TableBase.CACHED_TABLE : script = includeCachedData; break; case TableBase.TEXT_TABLE : script = includeCachedData && !t.isReadOnly(); break; } try { if (script) { schemaToLog = t.getName().schema; writeTableInit(t); RowIterator it = t.rowIteratorClustered(currentSession); while (it.hasNext()) { Row row = it.getNextRow(); writeRow(currentSession, row, t); } writeTableTerm(t); } } catch (Exception e) { throw Error.error(ErrorCode.FILE_IO_ERROR, e.toString()); } } } writeDataTerm(); } protected void writeTableInit(Table t) throws IOException {} protected void writeTableTerm(Table t) throws IOException {} protected void writeSingleColumnResult(Result r) throws IOException { RowSetNavigator nav = r.initialiseNavigator(); while (nav.hasNext()) { Object[] data = (Object[]) nav.getNext(); writeLogStatement(currentSession, (String) data[0]); } } abstract void writeRow(Session session, Row row, Table table) throws IOException; protected abstract void writeDataTerm() throws IOException; protected abstract void writeSessionIdAndSchema(Session session) throws IOException; public abstract void writeLogStatement(Session session, String s) throws IOException; public abstract void writeOtherStatement(Session session, String s) throws IOException; public abstract void writeInsertStatement(Session session, Row row, Table table) throws IOException; public abstract void writeDeleteStatement(Session session, Table table, Object[] data) throws IOException; public abstract void writeSequenceStatement(Session session, NumberSequence seq) throws IOException; public abstract void writeCommitStatement(Session session) throws IOException; // private Object timerTask; // long write delay for scripts : 60s protected volatile int writeDelay = 60000; public void run() { try { if (writeDelay != 0) { sync(); } /** @todo: can do Cache.cleanUp() here, too */ } catch (Exception e) { // ignore exceptions // may be InterruptedException or IOException } } public void setWriteDelay(int delay) { writeDelay = delay; } public void start() { if (writeDelay > 0) { timerTask = DatabaseManager.getTimer().schedulePeriodicallyAfter(0, writeDelay, this, false); } } public void stop() { if (timerTask != null) { HsqlTimer.cancel(timerTask); timerTask = null; } } public int getWriteDelay() { return writeDelay; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/scriptio/ScriptWriterEncode.java0000644000175000017500000001250212007547362025222 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.scriptio; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.zip.GZIPOutputStream; import org.hsqldb.Database; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.FileAccess; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.persist.Crypto; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @version 1.9.0 */ public class ScriptWriterEncode extends ScriptWriterText { Crypto crypto; HsqlByteArrayOutputStream byteOut; OutputStream cryptOut; public ScriptWriterEncode(Database db, OutputStream outputStream, FileAccess.FileSync descriptor, boolean includeCached, Crypto crypto) { super(db, outputStream, descriptor, includeCached); try { cryptOut = crypto.getOutputStream(fileStreamOut); fileStreamOut = new GZIPOutputStream(cryptOut); isCrypt = true; } catch (IOException e) { throw Error.error(e, ErrorCode.FILE_IO_ERROR, ErrorCode.M_Message_Pair, new Object[] { e.toString(), outFile }); } } public ScriptWriterEncode(Database db, String file, boolean includeCached, Crypto crypto) { super(db, file, includeCached, true, false); try { cryptOut = crypto.getOutputStream(fileStreamOut); fileStreamOut = new GZIPOutputStream(cryptOut); isCrypt = true; } catch (IOException e) { throw Error.error(e, ErrorCode.FILE_IO_ERROR, ErrorCode.M_Message_Pair, new Object[] { e.toString(), outFile }); } } public ScriptWriterEncode(Database db, String file, Crypto crypto) { super(db, file, false, false, false); this.crypto = crypto; byteOut = new HsqlByteArrayOutputStream(); isCrypt = true; } protected void openFile() { try { FileAccess fa = isDump ? FileUtil.getFileUtil() : database.logger.getFileAccess(); OutputStream fos = fa.openOutputStreamElement(outFile); outDescriptor = fa.getFileSync(fos); fileStreamOut = fos; fileStreamOut = new BufferedOutputStream(fos, 1 << 14); } catch (IOException e) { throw Error.error(e, ErrorCode.FILE_IO_ERROR, ErrorCode.M_Message_Pair, new Object[] { e.toString(), outFile }); } } /** * Always use before a final flush() */ protected void finishStream() throws IOException { if (fileStreamOut instanceof GZIPOutputStream) { ((GZIPOutputStream) fileStreamOut).finish(); } } void writeRowOutToFile() throws IOException { synchronized (fileStreamOut) { if (byteOut == null) { fileStreamOut.write(rowOut.getBuffer(), 0, rowOut.size()); byteCount += rowOut.size(); lineCount++; return; } int count = crypto.getEncodedSize(rowOut.size()); byteOut.ensureRoom(count + 4); count = crypto.encode(rowOut.getBuffer(), 0, rowOut.size(), byteOut.getBuffer(), 4); byteOut.setPosition(0); byteOut.writeInt(count); fileStreamOut.write(byteOut.getBuffer(), 0, count + 4); byteCount += rowOut.size(); lineCount++; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/scriptio/ScriptReaderDecode.java0000644000175000017500000001073212007547362025141 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.scriptio; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.zip.GZIPInputStream; import org.hsqldb.Database; import org.hsqldb.Session; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.LineReader; import org.hsqldb.lib.StringConverter; import org.hsqldb.persist.Crypto; import org.hsqldb.rowio.RowInputTextLog; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public class ScriptReaderDecode extends ScriptReaderText { DataInputStream dataInput; Crypto crypto; byte[] buffer = new byte[256]; public ScriptReaderDecode(Database db, String fileName, Crypto crypto, boolean forLog) throws IOException { this(db, db.logger.getFileAccess().openInputStreamElement(fileName), crypto, forLog); } public ScriptReaderDecode(Database db, InputStream inputStream, Crypto crypto, boolean forLog) throws IOException { super(db); this.crypto = crypto; rowIn = new RowInputTextLog(); if (forLog) { dataInput = new DataInputStream(new BufferedInputStream(inputStream)); } else { InputStream stream = crypto.getInputStream(new BufferedInputStream(inputStream)); stream = new GZIPInputStream(stream); dataStreamIn = new LineReader(stream, ScriptWriterText.ISO_8859_1); } } public boolean readLoggedStatement(Session session) { if (dataInput == null) { return super.readLoggedStatement(session); } int count; try { count = dataInput.readInt(); if (count * 2 > buffer.length) { buffer = new byte[count * 2]; } dataInput.readFully(buffer, 0, count); } catch (Throwable t) { return false; } count = crypto.decode(buffer, 0, count, buffer, 0); String s; try { s = new String(buffer, 0, count, "ISO-8859-1"); } catch (UnsupportedEncodingException e) { throw Error.error(e, ErrorCode.FILE_IO_ERROR, null); } lineCount++; // System.out.println(lineCount); statement = StringConverter.unicodeStringToString(s); if (statement == null) { return false; } processStatement(session); return true; } public void close() { try { if (dataStreamIn != null) { dataStreamIn.close(); } if (dataInput != null) { dataInput.close(); } } catch (Exception e) {} } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/scriptio/ScriptReaderBase.java0000644000175000017500000000730112007547362024626 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.scriptio; import org.hsqldb.Database; import org.hsqldb.NumberSequence; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.persist.PersistentStore; /** * Base class for all script readers. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public abstract class ScriptReaderBase { public static final int ANY_STATEMENT = 1; public static final int DELETE_STATEMENT = 2; public static final int INSERT_STATEMENT = 3; public static final int COMMIT_STATEMENT = 4; public static final int SESSION_ID = 5; public static final int SET_SCHEMA_STATEMENT = 6; Database database; int lineCount; ScriptReaderBase(Database db) { this.database = db; } public void readAll(Session session) { readDDL(session); readExistingData(session); } protected abstract void readDDL(Session session); protected abstract void readExistingData(Session session); public abstract boolean readLoggedStatement(Session session); int statementType; int sessionNumber; boolean sessionChanged; Object[] rowData; long sequenceValue; String statement; Table currentTable; PersistentStore currentStore; NumberSequence currentSequence; String currentSchema; public int getStatementType() { return statementType; } public int getSessionNumber() { return sessionNumber; } public Object[] getData() { return rowData; } public String getLoggedStatement() { return statement; } public NumberSequence getCurrentSequence() { return currentSequence; } public long getSequenceValue() { return sequenceValue; } public Table getCurrentTable() { return currentTable; } public String getCurrentSchema() { return currentSchema; } public int getLineNumber() { return lineCount; } public abstract void close(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/scriptio/ScriptWriterText.java0000644000175000017500000002440512007547362024756 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.scriptio; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.zip.GZIPOutputStream; import org.hsqldb.Database; import org.hsqldb.HsqlNameManager; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.NumberSequence; import org.hsqldb.Row; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.FileAccess; import org.hsqldb.rowio.RowOutputTextLog; /** * Handles all scripting and logging operations. A script consists of two blocks:

* * DDL: SQL statements for table and user definitions * DATA: INSERT statements for memory tables * * This happens as part of the CHECKPOINT and SHUTDOWN COMPACT * process. In this case, the * DATA block contains the CACHED table data as well.

* * A related use for this class is for saving a current snapshot of the * database data to a user-defined file with the SCRIPT command * * A log consists of SQL statements of different types. Each statement is * encoded as ASCII and saved. * * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.2 */ public class ScriptWriterText extends ScriptWriterBase { RowOutputTextLog rowOut; public static final String ISO_8859_1 = "ISO-8859-1"; /** @todo - perhaps move this global into a lib utility class */ public static byte[] BYTES_LINE_SEP; static byte[] BYTES_COMMIT; static byte[] BYTES_INSERT_INTO; static byte[] BYTES_VALUES; static byte[] BYTES_TERM; static byte[] BYTES_DELETE_FROM; static byte[] BYTES_WHERE; static byte[] BYTES_SEQUENCE; static byte[] BYTES_SEQUENCE_MID; static byte[] BYTES_C_ID_INIT; static byte[] BYTES_C_ID_TERM; static byte[] BYTES_SCHEMA; static { String sLineSep = System.getProperty("line.separator", "\n"); try { BYTES_LINE_SEP = sLineSep.getBytes(); BYTES_COMMIT = "COMMIT".getBytes(ISO_8859_1); BYTES_INSERT_INTO = "INSERT INTO ".getBytes(ISO_8859_1); BYTES_VALUES = " VALUES(".getBytes(ISO_8859_1); BYTES_TERM = ")".getBytes(ISO_8859_1); BYTES_DELETE_FROM = "DELETE FROM ".getBytes(ISO_8859_1); BYTES_WHERE = " WHERE ".getBytes(ISO_8859_1); BYTES_SEQUENCE = "ALTER SEQUENCE ".getBytes(ISO_8859_1); BYTES_SEQUENCE_MID = " RESTART WITH ".getBytes(ISO_8859_1); BYTES_C_ID_INIT = "/*C".getBytes(ISO_8859_1); BYTES_C_ID_TERM = "*/".getBytes(ISO_8859_1); BYTES_SCHEMA = "SET SCHEMA ".getBytes(ISO_8859_1); } catch (UnsupportedEncodingException e) { Error.runtimeError(ErrorCode.U_S0500, "ScriptWriterText"); } } public ScriptWriterText(Database db, OutputStream outputStream, FileAccess.FileSync descriptor, boolean includeCachedData) { super(db, outputStream, descriptor, includeCachedData); } public ScriptWriterText(Database db, String file, boolean includeCachedData, boolean newFile, boolean isDump) { super(db, file, includeCachedData, newFile, isDump); } public ScriptWriterText(Database db, String file, boolean includeCachedData, boolean compressed) { super(db, file, includeCachedData, true, false); if (compressed) { isCompressed = true; try { fileStreamOut = new GZIPOutputStream(fileStreamOut); } catch (IOException e) { throw Error.error(e, ErrorCode.FILE_IO_ERROR, ErrorCode.M_Message_Pair, new Object[] { e.toString(), outFile }); } } } protected void initBuffers() { rowOut = new RowOutputTextLog(); } protected void writeDataTerm() throws IOException {} protected void writeSessionIdAndSchema(Session session) throws IOException { if (session == null) { return; } if (session != currentSession) { rowOut.reset(); rowOut.write(BYTES_C_ID_INIT); rowOut.writeLong(session.getId()); rowOut.write(BYTES_C_ID_TERM); currentSession = session; writeRowOutToFile(); } if (schemaToLog != session.loggedSchema) { rowOut.reset(); writeSchemaStatement(schemaToLog); session.loggedSchema = schemaToLog; writeRowOutToFile(); } } private void writeSchemaStatement(HsqlName schema) { rowOut.write(BYTES_SCHEMA); rowOut.writeString(schema.statementName); rowOut.write(BYTES_LINE_SEP); } public void writeLogStatement(Session session, String s) throws IOException { schemaToLog = session.currentSchema; writeSessionIdAndSchema(session); rowOut.reset(); rowOut.writeString(s); rowOut.write(BYTES_LINE_SEP); writeRowOutToFile(); needsSync = true; } protected void writeRow(Session session, Row row, Table table) throws IOException { schemaToLog = table.getName().schema; writeSessionIdAndSchema(session); rowOut.reset(); ((RowOutputTextLog) rowOut).setMode(RowOutputTextLog.MODE_INSERT); rowOut.write(BYTES_INSERT_INTO); rowOut.writeString(table.getName().statementName); rowOut.write(BYTES_VALUES); rowOut.writeData(row, table.getColumnTypes()); rowOut.write(BYTES_TERM); rowOut.write(BYTES_LINE_SEP); writeRowOutToFile(); } protected void writeTableInit(Table t) throws IOException { if (t.isEmpty(currentSession)) { return; } if (schemaToLog == currentSession.loggedSchema) { return; } rowOut.reset(); writeSchemaStatement(t.getName().schema); writeRowOutToFile(); currentSession.loggedSchema = schemaToLog; } public void writeOtherStatement(Session session, String s) throws IOException { writeLogStatement(session, s); if (writeDelay == 0) { sync(); } } public void writeInsertStatement(Session session, Row row, Table table) throws IOException { schemaToLog = table.getName().schema; writeRow(session, row, table); } public void writeDeleteStatement(Session session, Table table, Object[] data) throws IOException { schemaToLog = table.getName().schema; writeSessionIdAndSchema(session); rowOut.reset(); ((RowOutputTextLog) rowOut).setMode(RowOutputTextLog.MODE_DELETE); rowOut.write(BYTES_DELETE_FROM); rowOut.writeString(table.getName().statementName); rowOut.write(BYTES_WHERE); rowOut.writeData(table.getColumnCount(), table.getColumnTypes(), data, table.columnList, table.getPrimaryKey()); rowOut.write(BYTES_LINE_SEP); writeRowOutToFile(); } public void writeSequenceStatement(Session session, NumberSequence seq) throws IOException { schemaToLog = seq.getName().schema; writeSessionIdAndSchema(session); rowOut.reset(); rowOut.write(BYTES_SEQUENCE); rowOut.writeString(seq.getSchemaName().statementName); rowOut.write('.'); rowOut.writeString(seq.getName().statementName); rowOut.write(BYTES_SEQUENCE_MID); rowOut.writeLong(seq.peek()); rowOut.write(BYTES_LINE_SEP); writeRowOutToFile(); needsSync = true; } public void writeCommitStatement(Session session) throws IOException { writeSessionIdAndSchema(session); rowOut.reset(); rowOut.write(BYTES_COMMIT); rowOut.write(BYTES_LINE_SEP); writeRowOutToFile(); needsSync = true; if (writeDelay == 0) { sync(); } } protected void finishStream() throws IOException { if (isCompressed) { ((GZIPOutputStream) fileStreamOut).finish(); } } void writeRowOutToFile() throws IOException { synchronized (fileStreamOut) { fileStreamOut.write(rowOut.getBuffer(), 0, rowOut.size()); byteCount += rowOut.size(); lineCount++; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/SessionInterface.java0000644000175000017500000001024012007547352023047 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.io.InputStream; import java.util.Calendar; import org.hsqldb.jdbc.JDBCConnection; import org.hsqldb.navigator.RowSetNavigatorClient; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.result.Result; import org.hsqldb.result.ResultLob; import org.hsqldb.types.BlobDataID; import org.hsqldb.types.ClobDataID; import org.hsqldb.types.TimestampData; /** * Interface to Session and its remote proxy objects. Used by the * implementations of JDBC interfaces to communicate with the database at * the session level. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.2 */ public interface SessionInterface { int INFO_ID = 0; // used int INFO_INTEGER = 1; // used int INFO_BOOLEAN = 2; // used int INFO_VARCHAR = 3; // used int INFO_LIMIT = 4; // int INFO_ISOLATION = 0; // used int INFO_AUTOCOMMIT = 1; // used int INFO_CONNECTION_READONLY = 2; // used int INFO_CATALOG = 3; // used // int TX_READ_UNCOMMITTED = 1; int TX_READ_COMMITTED = 2; int TX_REPEATABLE_READ = 4; int TX_SERIALIZABLE = 8; // int lobStreamBlockSize = 512 * 1024; Result execute(Result r); RowSetNavigatorClient getRows(long navigatorId, int offset, int size); void closeNavigator(long id); void close(); boolean isClosed(); boolean isReadOnlyDefault(); void setReadOnlyDefault(boolean readonly); boolean isAutoCommit(); void setAutoCommit(boolean autoCommit); int getIsolation(); void setIsolationDefault(int level); void startPhasedTransaction(); void prepareCommit(); void commit(boolean chain); void rollback(boolean chain); void rollbackToSavepoint(String name); void savepoint(String name); void releaseSavepoint(String name); void addWarning(HsqlException warning); Object getAttribute(int id); void setAttribute(int id, Object value); long getId(); void resetSession(); String getInternalConnectionURL(); BlobDataID createBlob(long length); ClobDataID createClob(long length); void allocateResultLob(ResultLob result, InputStream dataInput); Scanner getScanner(); Calendar getCalendar(); TimestampData getCurrentDate(); int getZoneSeconds(); int getStreamBlockSize(); HsqlProperties getClientProperties(); JDBCConnection getJDBCConnection(); void setJDBCConnection(JDBCConnection connection); String getDatabaseUniqueName(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ParserCommand.java0000644000175000017500000017663112007547372022361 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.RangeGroup.RangeGroupSimple; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.HsqlList; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.result.Result; import org.hsqldb.result.ResultProperties; import org.hsqldb.rights.User; import org.hsqldb.store.ValuePool; import org.hsqldb.types.Charset; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Parser for session and management statements * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.8 * @since 1.9.0 */ public class ParserCommand extends ParserDDL { ParserCommand(Session session, Scanner t) { super(session, t); } Statement compileStatement(int props) { Statement cs = compilePart(props); if (token.tokenType == Tokens.X_ENDPARSE) { if (cs.getSchemaName() == null) { cs.setSchemaHsqlName(session.getCurrentSchemaHsqlName()); } return cs; } throw unexpectedToken(); } HsqlArrayList compileStatements(String sql, Result cmd) { HsqlArrayList list = new HsqlArrayList(); Statement cs = null; reset(sql); while (true) { if (token.tokenType == Tokens.X_ENDPARSE) { break; } try { lastError = null; cs = compilePart(cmd.getExecuteProperties()); } catch (HsqlException e) { if (lastError != null && lastError.getLevel() > e.getLevel()) { throw lastError; } throw e; } if (!cs.isExplain && cs.getParametersMetaData().getColumnCount() > 0) { throw Error.error(ErrorCode.X_42575); } cs.setCompileTimestamp( database.txManager.getGlobalChangeTimestamp()); list.add(cs); } int returnType = cmd.getStatementType(); if (returnType != StatementTypes.RETURN_ANY) { int group = cs.getGroup(); if (group == StatementTypes.X_SQL_DATA) { if (returnType == StatementTypes.RETURN_COUNT) { throw Error.error(ErrorCode.X_07503); } } else if (returnType == StatementTypes.RETURN_RESULT) { throw Error.error(ErrorCode.X_07504); } } return list; } private Statement compilePart(int props) { Statement cs; compileContext.reset(); setParsePosition(getPosition()); if (token.tokenType == Tokens.X_STARTPARSE) { read(); } switch (token.tokenType) { // DQL case Tokens.WITH : case Tokens.OPENBRACKET : case Tokens.SELECT : case Tokens.TABLE : { cs = compileCursorSpecification(RangeGroup.emptyArray, props, false); break; } case Tokens.VALUES : { RangeGroup[] ranges = new RangeGroup[]{ new RangeGroupSimple( session.sessionContext.sessionVariablesRange) }; compileContext.setOuterRanges(ranges); cs = compileShortCursorSpecification(props); break; } // DML case Tokens.INSERT : { cs = compileInsertStatement(RangeGroup.emptyArray); break; } case Tokens.UPDATE : { cs = compileUpdateStatement(RangeGroup.emptyArray); break; } case Tokens.MERGE : { cs = compileMergeStatement(RangeGroup.emptyArray); break; } case Tokens.DELETE : { cs = compileDeleteStatement(RangeGroup.emptyArray); break; } case Tokens.TRUNCATE : { cs = compileTruncateStatement(); break; } // PROCEDURE case Tokens.CALL : { cs = compileCallStatement( new RangeGroup[]{ new RangeGroupSimple( session.sessionContext .sessionVariablesRange) }, false); break; } // SQL SESSION case Tokens.SET : cs = compileSet(); break; // diagnostic case Tokens.GET : cs = compileGetStatement( session.sessionContext.sessionVariablesRange); break; case Tokens.START : cs = compileStartTransaction(); break; case Tokens.COMMIT : cs = compileCommit(); break; case Tokens.ROLLBACK : cs = compileRollback(); break; case Tokens.SAVEPOINT : cs = compileSavepoint(); break; case Tokens.RELEASE : cs = compileReleaseSavepoint(); break; // DDL case Tokens.CREATE : cs = compileCreate(); break; case Tokens.ALTER : cs = compileAlter(); break; case Tokens.DROP : cs = compileDrop(); break; case Tokens.GRANT : case Tokens.REVOKE : cs = compileGrantOrRevoke(); break; case Tokens.COMMENT : cs = compileComment(); break; // HSQL SESSION case Tokens.LOCK : cs = compileLock(); break; case Tokens.CONNECT : cs = compileConnect(); break; case Tokens.DISCONNECT : cs = compileDisconnect(); break; // HSQL COMMAND case Tokens.SCRIPT : cs = compileScript(); break; case Tokens.SHUTDOWN : cs = compileShutdown(); break; case Tokens.BACKUP : cs = compileBackup(); break; case Tokens.CHECKPOINT : cs = compileCheckpoint(); break; case Tokens.EXPLAIN : { int position = getPosition(); cs = compileExplainPlan(); cs.setSQL(getLastPart(position)); break; } case Tokens.DECLARE : cs = compileDeclare(); break; default : throw unexpectedToken(); } // SET_SESSION_AUTHORIZATION is translated dynamically at runtime for logging switch (cs.type) { // these are set at compile time for logging case StatementTypes.COMMIT_WORK : case StatementTypes.ROLLBACK_WORK : case StatementTypes.SET_USER_PASSWORD : case StatementTypes.EXPLAIN_PLAN : break; default : cs.setSQL(getLastPart()); } if (token.tokenType == Tokens.SEMICOLON) { read(); } else if (token.tokenType == Tokens.X_ENDPARSE) {} return cs; } private Statement compileDeclare() { Statement cs; ColumnSchema variables[]; cs = compileDeclareLocalTableOrNull(); if (cs != null) { return cs; } variables = readLocalVariableDeclarationOrNull(); if (variables != null) { Object[] args = new Object[]{ variables }; cs = new StatementSession(StatementTypes.DECLARE_VARIABLE, args); return cs; } cs = compileDeclareCursor(RangeGroup.emptyArray, false); if (cs == null) { throw lastError == null ? unexpectedToken() : lastError; } return cs; } private Statement compileScript() { String name = null; read(); if (token.tokenType == Tokens.X_VALUE) { name = readQuotedString(); } HsqlName[] names = database.schemaManager.getCatalogAndBaseTableNames(); Object[] args = new Object[]{ name }; return new StatementCommand(StatementTypes.DATABASE_SCRIPT, args, null, names); } private Statement compileConnect() { String userName; String password = null; read(); readThis(Tokens.USER); checkIsSimpleName(); userName = token.tokenString; read(); if (!session.isProcessingLog) { readThis(Tokens.PASSWORD); password = readPassword(); } Expression[] args = new Expression[] { new ExpressionValue(userName, Type.SQL_VARCHAR), new ExpressionValue(password, Type.SQL_VARCHAR) }; Statement cs = new StatementSession(StatementTypes.SET_SESSION_AUTHORIZATION, args); return cs; } private StatementCommand compileSetDefault() { read(); switch (token.tokenType) { case Tokens.INITIAL : { read(); readThis(Tokens.SCHEMA); HsqlName schema = database.schemaManager.getSchemaHsqlName( token.tokenString); read(); Object[] args = new Object[]{ schema }; return new StatementCommand( StatementTypes.SET_DATABASE_DEFAULT_INITIAL_SCHEMA, args); } case Tokens.RESULT : { read(); readThis(Tokens.MEMORY); readThis(Tokens.ROWS); Integer size = readIntegerObject(); Object[] args = new Object[]{ size }; return new StatementCommand( StatementTypes.SET_DATABASE_RESULT_MEMORY_ROWS, args); } case Tokens.TABLE : { read(); readThis(Tokens.TYPE); int type = TableBase.MEMORY_TABLE; switch (token.tokenType) { case Tokens.MEMORY : break; case Tokens.CACHED : type = TableBase.CACHED_TABLE; break; default : throw unexpectedToken(); } read(); Object[] args = new Object[]{ ValuePool.getInt(type) }; return new StatementCommand( StatementTypes.SET_DATABASE_DEFAULT_TABLE_TYPE, args); } case Tokens.ISOLATION : { read(); readThis(Tokens.LEVEL); int level; switch (token.tokenType) { case Tokens.READ : read(); readThis(Tokens.COMMITTED); level = SessionInterface.TX_READ_COMMITTED; break; case Tokens.SERIALIZABLE : read(); level = SessionInterface.TX_SERIALIZABLE; break; default : throw unexpectedToken(); } Object[] args = new Object[]{ ValuePool.getInt(level) }; return new StatementCommand( StatementTypes.SET_DATABASE_DEFAULT_ISOLATION_LEVEL, args); } default : throw unexpectedToken(); } } private StatementCommand compileSetProperty() { read(); String property; Object value; HsqlDatabaseProperties props = database.getProperties(); checkIsSimpleName(); checkIsDelimitedIdentifier(); property = token.tokenString; boolean isboolean = props.isBoolean(token.tokenString); boolean isintegral = props.isIntegral(token.tokenString); boolean isstring = props.isString(token.tokenString); if (!(isboolean || isintegral || isstring)) { throw Error.error(ErrorCode.X_42555, property); } int typeCode = isboolean ? Types.SQL_BOOLEAN : isintegral ? Types.SQL_INTEGER : Types.SQL_CHAR; read(); if (token.tokenType == Tokens.TRUE) { value = Boolean.TRUE; if (!isboolean) { throw Error.error(ErrorCode.X_42563, token.tokenString); } } else if (token.tokenType == Tokens.FALSE) { value = Boolean.FALSE; if (!isboolean) { throw Error.error(ErrorCode.X_42563, token.tokenString); } } else { checkIsValue(); value = token.tokenValue; if (token.dataType.typeCode != typeCode) { throw Error.error(ErrorCode.X_42563, token.tokenString); } } read(); Object[] args = new Object[] { property, value }; return new StatementCommand(StatementTypes.SET_DATABASE_PROPERTY, args); } private Statement compileSet() { int position = super.getPosition(); session.setScripting(false); read(); switch (token.tokenType) { case Tokens.CATALOG : { read(); Expression e = XreadValueSpecificationOrNull(); if (e == null) { HsqlName name = readSchemaName(); Object[] args = new Object[]{ name }; return new StatementSession(StatementTypes.SET_CATALOG, args); } if (!e.getDataType().isCharacterType()) { throw Error.error(ErrorCode.X_0P000); } if (e.getType() != OpTypes.VALUE && (e.getType() != OpTypes.SQL_FUNCTION || !((FunctionSQL) e).isValueFunction())) { throw Error.error(ErrorCode.X_0P000); } Expression[] args = new Expression[]{ e }; return new StatementSession(StatementTypes.SET_CATALOG, args); } case Tokens.SCHEMA : { read(); Expression e = XreadValueSpecificationOrNull(); if (e == null) { HsqlName name = readSchemaName(); Object[] args = new Object[]{ name }; return new StatementSession(StatementTypes.SET_SCHEMA, args); } if (!e.getDataType().isCharacterType()) { throw Error.error(ErrorCode.X_0P000); } if (e.getType() != OpTypes.VALUE && (e.getType() != OpTypes.SQL_FUNCTION || !((FunctionSQL) e).isValueFunction())) { throw Error.error(ErrorCode.X_0P000); } Expression[] args = new Expression[]{ e }; return new StatementSession(StatementTypes.SET_SCHEMA, args); } case Tokens.NO : { read(); readThis(Tokens.COLLATION); HsqlArrayList charsets = null; if (readIfThis(Tokens.FOR)) { charsets = new HsqlArrayList(); while (true) { SchemaObject charset = readSchemaObjectName(SchemaObject.CHARSET); charsets.add(charset); if (token.tokenType == Tokens.COMMA) { read(); continue; } break; } } Object[] args = new Object[] { null, Boolean.FALSE, charsets }; return new StatementSession(StatementTypes.SET_COLLATION, args); } case Tokens.COLLATION : { read(); Expression e = XreadValueSpecificationOrNull(); if (e == null || !e.getDataType().isCharacterType()) { throw Error.error(ErrorCode.X_2H000); } HsqlArrayList charsets = null; if (readIfThis(Tokens.FOR)) { charsets = new HsqlArrayList(); while (true) { SchemaObject charset = readSchemaObjectName(SchemaObject.CHARSET); charsets.add(charset); if (token.tokenType == Tokens.COMMA) { read(); continue; } break; } } Object[] args = new Object[] { e, Boolean.TRUE, charsets }; return new StatementSession(StatementTypes.SET_COLLATION, args); } case Tokens.TIME : { read(); return compileSetTimeZone(); } case Tokens.ROLE : { read(); return compileSetRole(); } case Tokens.SESSION : { read(); return compileSessionSettings(); } case Tokens.TRANSACTION : { read(); Object[] args = processTransactionCharacteristics(); if (args[0] == null && args[1] == null) { throw unexpectedToken(); } return new StatementSession(StatementTypes.SET_TRANSACTION, args); } case Tokens.AUTOCOMMIT : { read(); Boolean mode = processTrueOrFalseObject(); Object[] args = new Object[]{ mode }; return new StatementSession( StatementTypes.SET_SESSION_AUTOCOMMIT, args); } // deprecated case Tokens.READONLY : { read(); Boolean readonly = processTrueOrFalseObject(); Object[] args = new Object[]{ readonly }; return new StatementSession( StatementTypes.SET_SESSION_CHARACTERISTICS, args); } case Tokens.IGNORECASE : { read(); Boolean mode = processTrueOrFalseObject(); Object[] args = new Object[]{ mode }; return new StatementSession( StatementTypes.SET_SESSION_SQL_IGNORECASE, args); } case Tokens.MAXROWS : { read(); Integer size = readIntegerObject(); Object[] args = new Object[]{ size }; return new StatementSession( StatementTypes.SET_SESSION_RESULT_MAX_ROWS, args); } // for backward compatibility case Tokens.DEFAULT : { read(); readThis(Tokens.TABLE); readThis(Tokens.TYPE); int type = TableBase.MEMORY_TABLE; switch (token.tokenType) { case Tokens.MEMORY : break; case Tokens.CACHED : type = TableBase.CACHED_TABLE; break; default : throw unexpectedToken(); } read(); Object[] args = new Object[]{ ValuePool.getInt(type) }; return new StatementCommand( StatementTypes.SET_DATABASE_DEFAULT_TABLE_TYPE, args); } case Tokens.TABLE : { read(); Table t = readTableName(); Object[] args = new Object[] { t.getName(), null }; switch (token.tokenType) { default : { throw unexpectedToken(); } case Tokens.SOURCE : read(); return compileTableSource(t); case Tokens.READ : { read(); boolean readonly = false; if (token.tokenType == Tokens.WRITE) { read(); } else { readThis(Tokens.ONLY); readonly = true; } args[1] = Boolean.valueOf(readonly); return new StatementCommand( StatementTypes.SET_TABLE_READONLY, args, null, new HsqlName[]{ t.getName() }); } // deprecated case Tokens.READONLY : { read(); Boolean readonly = processTrueOrFalseObject(); args[1] = readonly; return new StatementCommand( StatementTypes.SET_TABLE_READONLY, args, null, new HsqlName[]{ t.getName() }); } case Tokens.INDEX : { String value; read(); checkIsValue(); value = token.tokenString; read(); args[1] = value; return new StatementCommand( StatementTypes.SET_TABLE_INDEX, args, null, new HsqlName[]{ t.getName() }); } case Tokens.TYPE : { read(); int newType; if (token.tokenType == Tokens.CACHED) { newType = TableBase.CACHED_TABLE; } else if (token.tokenType == Tokens.MEMORY) { newType = TableBase.MEMORY_TABLE; } else { throw super.unexpectedToken(); } read(); args[1] = new Integer(newType); return new StatementCommand( StatementTypes.SET_TABLE_TYPE, args, null, new HsqlName[]{ t.getName() }); } case Tokens.CLUSTERED : { read(); readThis(Tokens.ON); OrderedHashSet set = new OrderedHashSet(); readThis(Tokens.OPENBRACKET); readSimpleColumnNames(set, t, false); readThis(Tokens.CLOSEBRACKET); int[] colIndex = t.getColumnIndexes(set); args[1] = colIndex; return new StatementCommand( StatementTypes.SET_TABLE_CLUSTERED, args, null, new HsqlName[]{ t.getName() }); } } } case Tokens.WRITE_DELAY : { read(); int delay = 0; if (token.tokenType == Tokens.TRUE) { delay = database.getProperties().getDefaultWriteDelay(); read(); } else if (token.tokenType == Tokens.FALSE) { delay = 0; read(); } else { delay = this.readInteger(); if (delay < 0) { delay = 0; } if (token.tokenType == Tokens.MILLIS) { read(); } else { delay *= 1000; } } Object[] args = new Object[]{ new Integer(delay) }; return new StatementCommand( StatementTypes.SET_DATABASE_FILES_WRITE_DELAY, args, null, null); } case Tokens.PASSWORD : { String password; boolean isDigest = false; read(); if (readIfThis(Tokens.DIGEST)) { isDigest = true; } password = readPassword(); Object[] args = new Object[] { null, password, isDigest }; Statement cs = new StatementCommand(StatementTypes.SET_USER_PASSWORD, args); String sql = User.getSetCurrentPasswordDigestSQL(password, isDigest); cs.setSQL(sql); return cs; } case Tokens.INITIAL : { read(); readThis(Tokens.SCHEMA); HsqlName schema; if (token.tokenType == Tokens.DEFAULT) { schema = null; } else { schema = database.schemaManager.getSchemaHsqlName( token.tokenString); } read(); Object[] args = new Object[] { null, schema }; return new StatementCommand( StatementTypes.SET_USER_INITIAL_SCHEMA, args); } case Tokens.FILES : { return compileSetFilesProperty(); } case Tokens.DATABASE : { return compileSetDatabaseProperty(); } case Tokens.PROPERTY : { return compileSetProperty(); } default : { rewind(position); return compileSetStatement( session.sessionContext.sessionVariablesRange); } } } StatementCommand compileSetDatabaseProperty() { read(); String name; checkDatabaseUpdateAuthorisation(); switch (token.tokenType) { case Tokens.AUTHENTICATION : { read(); readThis(Tokens.FUNCTION); Routine routine = readCreateDatabaseAuthenticationFunction(); Object[] args = new Object[]{ routine }; return new StatementCommand( StatementTypes.SET_DATABASE_AUTHENTICATION, args, null, null); } case Tokens.COLLATION : { Boolean padSpace = null; read(); checkIsSimpleName(); name = token.tokenString; read(); if (readIfThis(Tokens.NO)) { readThis(Tokens.PAD); padSpace = Boolean.FALSE; } else if (readIfThis(Tokens.PAD)) { readThis(Tokens.SPACE); padSpace = Boolean.TRUE; } if (padSpace == null) { if (session.isProcessingScript() && database.getProperties().isVersion18()) { padSpace = Boolean.FALSE; } else { padSpace = Boolean.TRUE; } } Object[] args = new Object[] { name, padSpace }; return new StatementCommand( StatementTypes.SET_DATABASE_SQL_COLLATION, args, null, null); } case Tokens.DEFAULT : { return compileSetDefault(); } case Tokens.EVENT : { read(); readThis(Tokens.LOG); boolean sqlLog = readIfThis(Tokens.SQL); readThis(Tokens.LEVEL); Integer value = readIntegerObject(); Object[] args = new Object[] { value, sqlLog }; return new StatementCommand( StatementTypes.SET_DATABASE_FILES_EVENT_LOG, args, null, null); } case Tokens.GC : { read(); Integer size = readIntegerObject(); Object[] args = new Object[]{ size }; return new StatementCommand(StatementTypes.SET_DATABASE_GC, args, null, null); } case Tokens.PASSWORD : { read(); readThis(Tokens.CHECK); readThis(Tokens.FUNCTION); Routine routine = readCreatePasswordCheckFunction(); Object[] args = new Object[]{ routine }; return new StatementCommand( StatementTypes.SET_DATABASE_PASSWORD_CHECK, args, null, null); } case Tokens.REFERENTIAL : { read(); readThis(Tokens.INTEGRITY); boolean mode = processTrueOrFalse(); Object[] args = new Object[]{ Boolean.valueOf(mode) }; return new StatementCommand( StatementTypes.SET_DATABASE_SQL_REFERENTIAL_INTEGRITY, args, null, null); } case Tokens.SQL : { read(); int type = StatementTypes.SET_DATABASE_SQL; Boolean flag = Boolean.TRUE; Integer value = Integer.valueOf(0); String property = null; switch (token.tokenType) { case Tokens.NAMES : read(); property = HsqlDatabaseProperties.sql_enforce_names; flag = processTrueOrFalseObject(); break; case Tokens.REGULAR : read(); readThis(Tokens.NAMES); property = HsqlDatabaseProperties.sql_regular_names; flag = processTrueOrFalseObject(); break; case Tokens.REFERENCES : read(); flag = processTrueOrFalseObject(); property = HsqlDatabaseProperties.sql_enforce_refs; break; case Tokens.SIZE : read(); flag = processTrueOrFalseObject(); property = HsqlDatabaseProperties.sql_enforce_size; break; case Tokens.TYPES : read(); flag = processTrueOrFalseObject(); property = HsqlDatabaseProperties.sql_enforce_types; break; case Tokens.TDC : read(); if (readIfThis(Tokens.DELETE)) { property = HsqlDatabaseProperties.sql_enforce_tdcd; } else { readThis(Tokens.UPDATE); property = HsqlDatabaseProperties.sql_enforce_tdcu; } flag = processTrueOrFalseObject(); break; case Tokens.TRANSLATE : read(); readThis(Tokens.TTI); readThis(Tokens.TYPES); flag = processTrueOrFalseObject(); property = HsqlDatabaseProperties.jdbc_translate_tti_types; break; case Tokens.CONCAT_WORD : read(); readThis(Tokens.NULLS); flag = processTrueOrFalseObject(); property = HsqlDatabaseProperties.sql_concat_nulls; break; case Tokens.NULLS : read(); readThis(Tokens.FIRST); flag = processTrueOrFalseObject(); property = HsqlDatabaseProperties.sql_nulls_first; break; case Tokens.UNIQUE : read(); readThis(Tokens.NULLS); flag = processTrueOrFalseObject(); property = HsqlDatabaseProperties.sql_unique_nulls; break; case Tokens.CONVERT : read(); readThis(Tokens.TRUNCATE); flag = processTrueOrFalseObject(); property = HsqlDatabaseProperties.sql_convert_trunc; break; case Tokens.AVG : read(); readThis(Tokens.SCALE); value = readIntegerObject(); property = HsqlDatabaseProperties.sql_avg_scale; break; case Tokens.DOUBLE : read(); readThis(Tokens.NAN); flag = processTrueOrFalseObject(); property = HsqlDatabaseProperties.sql_double_nan; break; case Tokens.LONGVAR : read(); readThis(Tokens.IS); readThis(Tokens.LOB); flag = processTrueOrFalseObject(); property = HsqlDatabaseProperties.sql_longvar_is_lob; break; case Tokens.SYNTAX : read(); if (token.tokenString.equals(Tokens.T_DB2)) { read(); property = HsqlDatabaseProperties.sql_syntax_db2; } else if (token.tokenString.equals(Tokens.T_MSS)) { read(); property = HsqlDatabaseProperties.sql_syntax_mss; } else if (token.tokenString.equals(Tokens.T_MYS)) { read(); property = HsqlDatabaseProperties.sql_syntax_mys; } else if (token.tokenString.equals(Tokens.T_ORA)) { read(); property = HsqlDatabaseProperties.sql_syntax_ora; } else if (token.tokenString.equals(Tokens.T_PGS)) { read(); property = HsqlDatabaseProperties.sql_syntax_pgs; } else { throw unexpectedToken(); } flag = processTrueOrFalseObject(); break; default : throw unexpectedToken(); } Object[] args = new Object[] { property, flag, value }; return new StatementCommand(type, args, null, null); } case Tokens.TEXT : { read(); readThis(Tokens.TABLE); readThis(Tokens.DEFAULTS); String source = readQuotedString(); Object[] args = new Object[]{ source }; return new StatementCommand( StatementTypes.SET_DATABASE_TEXT_SOURCE, args, null, null); } case Tokens.TRANSACTION : { read(); if (readIfThis(Tokens.ROLLBACK)) { readThis(Tokens.ON); if (!readIfThis(Tokens.DEADLOCK)) { readThis(Tokens.CONFLICT); } Boolean mode = processTrueOrFalseObject(); StatementCommand cs = new StatementCommand( StatementTypes.SET_DATABASE_TRANSACTION_CONFLICT, new Object[]{ mode }, null, null); return cs; } readThis(Tokens.CONTROL); int mode = TransactionManager.LOCKS; switch (token.tokenType) { case Tokens.MVCC : read(); mode = TransactionManager.MVCC; break; case Tokens.MVLOCKS : read(); mode = TransactionManager.MVLOCKS; break; case Tokens.LOCKS : read(); mode = TransactionManager.LOCKS; break; } HsqlName[] names = database.schemaManager.getCatalogAndBaseTableNames(); Object[] args = new Object[]{ ValuePool.getInt(mode) }; StatementCommand cs = new StatementCommand( StatementTypes.SET_DATABASE_TRANSACTION_CONTROL, args, null, names); return cs; } case Tokens.UNIQUE : { read(); readThis(Tokens.NAME); isUndelimitedSimpleName(); name = token.tokenString; read(); if (name.length() != 16) { throw Error.error(ErrorCode.X_42555); } if (!Charset.isInSet(name, Charset.unquotedIdentifier) || !Charset.startsWith(name, Charset.uppercaseLetters)) { throw Error.error(ErrorCode.X_42501); } Object[] args = new Object[]{ name }; return new StatementCommand( StatementTypes.SET_DATABASE_UNIQUE_NAME, args, null, null); } default : { throw unexpectedToken(); } } } StatementCommand compileSetFilesProperty() { read(); String name; int type = 0; Boolean flag = null; Integer value = null; Boolean mode = null; checkDatabaseUpdateAuthorisation(); switch (token.tokenType) { case Tokens.CACHE : { read(); if (readIfThis(Tokens.SIZE)) { value = readIntegerObject(); type = StatementTypes.SET_DATABASE_FILES_CACHE_SIZE; } else { readThis(Tokens.ROWS); value = readIntegerObject(); type = StatementTypes.SET_DATABASE_FILES_CACHE_ROWS; } if (readIfThis(Tokens.NO)) { readThis(Tokens.CHECK); mode = Boolean.TRUE; } break; } case Tokens.SCALE : { read(); value = readIntegerObject(); type = StatementTypes.SET_DATABASE_FILES_SCALE; break; } case Tokens.LOB : { read(); readThis(Tokens.SCALE); value = readIntegerObject(); type = StatementTypes.SET_DATABASE_FILES_LOBS_SCALE; break; } case Tokens.DEFRAG : { read(); type = StatementTypes.SET_DATABASE_FILES_DEFRAG; value = readIntegerObject(); break; } case Tokens.NIO : { read(); if (readIfThis(Tokens.SIZE)) { value = readIntegerObject(); } else { flag = processTrueOrFalseObject(); } type = StatementTypes.SET_DATABASE_FILES_NIO; break; } case Tokens.BACKUP : { read(); type = StatementTypes.SET_DATABASE_FILES_BACKUP_INCREMENT; readThis(Tokens.INCREMENT); flag = processTrueOrFalseObject(); break; } case Tokens.LOG : { read(); if (readIfThis(Tokens.SIZE)) { type = StatementTypes.SET_DATABASE_FILES_LOG_SIZE; value = readIntegerObject(); } else { type = StatementTypes.SET_DATABASE_FILES_LOG; flag = processTrueOrFalseObject(); } break; } case Tokens.TEMP : { read(); readThis(Tokens.PATH); type = StatementTypes.SET_DATABASE_FILES_TEMP_PATH; value = readIntegerObject(); break; } case Tokens.WRITE : { read(); readThis(Tokens.DELAY); type = StatementTypes.SET_DATABASE_FILES_WRITE_DELAY; int delay = 0; if (token.tokenType == Tokens.TRUE) { delay = database.getProperties().getDefaultWriteDelay(); read(); } else if (token.tokenType == Tokens.FALSE) { delay = 0; read(); } else { delay = this.readInteger(); if (delay < 0) { delay = 0; } if (token.tokenType == Tokens.MILLIS) { read(); } else { delay *= 1000; } } value = new Integer(delay); break; } case Tokens.SCRIPT : { read(); readThis(Tokens.FORMAT); if (token.tokenType == Tokens.TEXT) { read(); value = new Integer(0); } else { readThis(Tokens.COMPRESSED); value = new Integer(3); } type = StatementTypes.SET_DATABASE_FILES_SCRIPT_FORMAT; break; } default : throw unexpectedToken(); } Object[] args = new Object[2]; args[0] = flag == null ? (Object) value : (Object) flag; args[1] = mode; return new StatementCommand( type, args, null, database.schemaManager.getCatalogNameArray()); } Object[] processTransactionCharacteristics() { int level = 0; boolean readonly = false; Object[] args = new Object[2]; outerloop: while (true) { switch (token.tokenType) { case Tokens.READ : { if (args[0] != null) { throw unexpectedToken(); } read(); if (token.tokenType == Tokens.ONLY) { read(); readonly = true; } else { readThis(Tokens.WRITE); readonly = false; } args[0] = Boolean.valueOf(readonly); break; } case Tokens.ISOLATION : { if (args[1] != null) { throw unexpectedToken(); } read(); readThis(Tokens.LEVEL); switch (token.tokenType) { case Tokens.SERIALIZABLE : read(); level = SessionInterface.TX_SERIALIZABLE; break; case Tokens.READ : read(); if (token.tokenType == Tokens.COMMITTED) { read(); level = SessionInterface.TX_READ_COMMITTED; } else if (token.tokenType == Tokens.UNCOMMITTED) { read(); level = SessionInterface.TX_READ_UNCOMMITTED; } else { throw unexpectedToken(); } break; case Tokens.REPEATABLE : read(); readThis(Tokens.READ); level = SessionInterface.TX_REPEATABLE_READ; break; default : throw unexpectedToken(); } args[1] = new Integer(level); break; } case Tokens.COMMA : { if (args[0] == null && args[1] == null) { throw unexpectedToken(); } read(); break; } default : { break outerloop; } } } if (!readonly && level == 1) { throw unexpectedToken(Tokens.T_WRITE); } return args; } /** * Responsible for handling the execution of COMMIT [WORK] * * @throws HsqlException */ private Statement compileCommit() { boolean chain = false; read(); readIfThis(Tokens.WORK); if (token.tokenType == Tokens.AND) { read(); if (token.tokenType == Tokens.NO) { read(); } else { chain = true; } readThis(Tokens.CHAIN); } String sql = chain ? StatementSession.commitAndChainStatement.sql : StatementSession.commitNoChainStatement.sql; Statement st = new StatementSession(StatementTypes.COMMIT_WORK, new Object[]{ Boolean.valueOf(chain) }); st.setSQL(sql); return st; } private Statement compileStartTransaction() { read(); readThis(Tokens.TRANSACTION); Object[] args = processTransactionCharacteristics(); Statement cs = new StatementSession(StatementTypes.START_TRANSACTION, args); return cs; } private Statement compileLock() { read(); readThis(Tokens.TABLE); OrderedHashSet readSet = new OrderedHashSet(); OrderedHashSet writeSet = new OrderedHashSet(); outerloop: while (true) { Table table = readTableName(); switch (token.tokenType) { case Tokens.READ : read(); readSet.add(table.getName()); break; case Tokens.WRITE : read(); writeSet.add(table.getName()); break; default : throw unexpectedToken(); } if (token.tokenType == Tokens.COMMA) { read(); continue; } break outerloop; } HsqlName[] writeTableNames = new HsqlName[writeSet.size()]; writeSet.toArray(writeTableNames); readSet.removeAll(writeTableNames); HsqlName[] readTableNames = new HsqlName[readSet.size()]; readSet.toArray(readTableNames); Statement cs = new StatementSession(StatementTypes.TRANSACTION_LOCK_TABLE, readTableNames, writeTableNames); return cs; } private Statement compileRollback() { boolean chain = false; String savepoint = null; read(); if (token.tokenType == Tokens.TO) { read(); readThis(Tokens.SAVEPOINT); checkIsSimpleName(); savepoint = token.tokenString; read(); String sql = getLastPart(); Object[] args = new Object[]{ savepoint }; Statement cs = new StatementSession(StatementTypes.ROLLBACK_SAVEPOINT, args); return cs; } else { if (token.tokenType == Tokens.WORK) { read(); } if (token.tokenType == Tokens.AND) { read(); if (token.tokenType == Tokens.NO) { read(); } else { chain = true; } readThis(Tokens.CHAIN); } } String sql = chain ? StatementSession.rollbackAndChainStatement.sql : StatementSession.rollbackNoChainStatement.sql; Statement st = new StatementSession(StatementTypes.ROLLBACK_WORK, new Object[]{ Boolean.valueOf(chain) }); st.setSQL(sql); return st; } private Statement compileSavepoint() { String name; read(); checkIsSimpleName(); name = token.tokenString; read(); String sql = getLastPart(); Object[] args = new Object[]{ name }; return new StatementSession(StatementTypes.SAVEPOINT, args); } private Statement compileReleaseSavepoint() { read(); readThis(Tokens.SAVEPOINT); String name = token.tokenString; read(); String sql = getLastPart(); Object[] args = new Object[]{ name }; return new StatementSession(StatementTypes.RELEASE_SAVEPOINT, args); } private Statement compileSessionSettings() { switch (token.tokenType) { case Tokens.CHARACTERISTICS : { read(); readThis(Tokens.AS); readThis(Tokens.TRANSACTION); Object[] args = processTransactionCharacteristics(); return new StatementSession( StatementTypes.SET_SESSION_CHARACTERISTICS, args); } case Tokens.AUTHORIZATION : { read(); Expression e = XreadValueSpecificationOrNull(); if (e == null) { throw Error.error(ErrorCode.X_42584); } e.resolveTypes(session, null); if (e.isUnresolvedParam()) { e.dataType = Type.SQL_VARCHAR; } if (e.dataType == null || !e.dataType.isCharacterType()) { throw Error.error(ErrorCode.X_42563); } Expression[] args = new Expression[] { e, null }; return new StatementSession( StatementTypes.SET_SESSION_AUTHORIZATION, args); } case Tokens.RESULT : { read(); readThis(Tokens.MEMORY); readThis(Tokens.ROWS); Integer size = readIntegerObject(); Object[] args = new Object[]{ size }; return new StatementSession( StatementTypes.SET_SESSION_RESULT_MEMORY_ROWS, args); } default : throw unexpectedToken(); } } private Statement compileSetRole() { Expression e; if (token.tokenType == Tokens.NONE) { read(); e = new ExpressionValue(null, Type.SQL_VARCHAR); } else { e = XreadValueSpecificationOrNull(); if (e == null) { throw Error.error(ErrorCode.X_2A000); } if (!e.getDataType().isCharacterType()) { throw Error.error(ErrorCode.X_0P000); } if (e.getType() != OpTypes.VALUE && (e.getType() != OpTypes.SQL_FUNCTION || !((FunctionSQL) e).isValueFunction())) { throw Error.error(ErrorCode.X_0P000); } } String sql = getLastPart(); return new StatementSession(StatementTypes.SET_ROLE, new Expression[]{ e }); } private Statement compileSetTimeZone() { Expression e; readThis(Tokens.ZONE); if (token.tokenType == Tokens.LOCAL) { read(); e = new ExpressionValue(null, Type.SQL_INTERVAL_HOUR_TO_MINUTE); } else { e = XreadIntervalValueExpression(); HsqlList unresolved = e.resolveColumnReferences(session, RangeGroup.emptyGroup, RangeGroup.emptyArray, null); ExpressionColumn.checkColumnsResolved(unresolved); e.resolveTypes(session, null); if (e.dataType == null) { throw Error.error(ErrorCode.X_42563); } if (e.dataType.typeCode != Types.SQL_INTERVAL_HOUR_TO_MINUTE) { throw Error.error(ErrorCode.X_42563); } } String sql = getLastPart(); return new StatementSession(StatementTypes.SET_TIME_ZONE, new Expression[]{ e }); } private Statement compileShutdown() { int closemode; session.checkAdmin(); closemode = Database.CLOSEMODE_NORMAL; read(); switch (token.tokenType) { case Tokens.IMMEDIATELY : closemode = Database.CLOSEMODE_IMMEDIATELY; read(); break; case Tokens.COMPACT : closemode = Database.CLOSEMODE_COMPACT; read(); break; case Tokens.SCRIPT : closemode = Database.CLOSEMODE_SCRIPT; read(); break; // only semicolon is accepted here } if (token.tokenType == Tokens.SEMICOLON) { read(); } if (token.tokenType != Tokens.X_ENDPARSE) { throw unexpectedToken(); } String sql = getLastPart(); Object[] args = new Object[]{ new Integer(closemode) }; Statement cs = new StatementCommand(StatementTypes.DATABASE_SHUTDOWN, args, null, null); return cs; } private Statement compileBackup() { String path; Boolean blockingMode = null; // Defaults to blocking Boolean scriptMode = null; // Defaults to non-script Boolean compression = null; // Defaults to compressed read(); readThis(Tokens.DATABASE); readThis(Tokens.TO); path = readQuotedString(); path = path.trim(); if (path.length() == 0) { throw unexpectedToken(path); } outerLoop: while (true) { switch (token.tokenType) { case Tokens.BLOCKING : if (blockingMode != null) { throw unexpectedToken(); } blockingMode = Boolean.TRUE; read(); break; case Tokens.SCRIPT : if (scriptMode != null) { throw unexpectedToken(); } scriptMode = Boolean.TRUE; read(); break; case Tokens.COMPRESSED : if (compression != null) { throw unexpectedToken(); } compression = Boolean.TRUE; read(); break; case Tokens.NOT : read(); if (token.tokenType == Tokens.COMPRESSED) { if (compression != null) { throw unexpectedToken(); } compression = Boolean.FALSE; read(); } else if (token.tokenType == Tokens.BLOCKING) { if (blockingMode != null) { throw unexpectedToken(); } blockingMode = Boolean.FALSE; read(); } else { throw unexpectedToken(); } break; default : break outerLoop; } } if (scriptMode == null) { scriptMode = Boolean.FALSE; } if (blockingMode == null) { blockingMode = Boolean.TRUE; } if (compression == null) { compression = Boolean.TRUE; } if (scriptMode) { if (!blockingMode) { throw unexpectedToken(Tokens.T_NOT); } } HsqlName[] names = blockingMode ? database.schemaManager.getCatalogAndBaseTableNames() : HsqlName.emptyArray; Object[] args = new Object[] { path, blockingMode, scriptMode, compression }; Statement cs = new StatementCommand(StatementTypes.DATABASE_BACKUP, args, null, names); return cs; } private Statement compileCheckpoint() { boolean defrag = false; read(); if (token.tokenType == Tokens.DEFRAG) { defrag = true; read(); } else if (token.tokenType == Tokens.SEMICOLON) { read(); // only semicolon is accepted here } if (token.tokenType != Tokens.X_ENDPARSE) { throw unexpectedToken(); } HsqlName[] names = database.schemaManager.getCatalogAndBaseTableNames(); Object[] args = new Object[]{ Boolean.valueOf(defrag) }; Statement cs = new StatementCommand(StatementTypes.DATABASE_CHECKPOINT, args, null, names); return cs; } public static Statement getAutoCheckpointStatement(Database database) { HsqlName[] names = database.schemaManager.getCatalogAndBaseTableNames(); Object[] args = new Object[]{ Boolean.FALSE }; Statement cs = new StatementCommand(StatementTypes.DATABASE_CHECKPOINT, args, null, names); cs.setCompileTimestamp(database.txManager.getGlobalChangeTimestamp()); cs.setSQL(Tokens.T_CHECKPOINT); return cs; } private Statement compileDisconnect() { read(); String sql = Tokens.T_DISCONNECT; Statement cs = new StatementSession(StatementTypes.DISCONNECT, (Object[]) null); return cs; } private Statement compileExplainPlan() { Statement cs; read(); readThis(Tokens.PLAN); readThis(Tokens.FOR); cs = compilePart(ResultProperties.defaultPropsValue); cs.setDescribe(); return new StatementCommand(StatementTypes.EXPLAIN_PLAN, new Object[]{ cs }); } private Statement compileTableSource(Table t) { boolean isSourceHeader = false; boolean isDesc = false; String source; Object[] args = new Object[5]; args[0] = t.getName(); if (!t.isText()) { Exception e = Error.error(ErrorCode.X_S0522); } // SET TABLE SOURCE ON if (token.tokenType == Tokens.ON) { read(); String sql = getLastPart(); args[1] = Boolean.TRUE; return new StatementCommand(StatementTypes.SET_TABLE_SOURCE, args, null, new HsqlName[]{ t.getName() }); } else if (token.tokenType == Tokens.OFF) { read(); String sql = getLastPart(); args[1] = Boolean.FALSE; return new StatementCommand(StatementTypes.SET_TABLE_SOURCE, args, null, new HsqlName[]{ t.getName() }); } else if (token.tokenType == Tokens.HEADER) { read(); isSourceHeader = true; } if (token.tokenType == Tokens.X_DELIMITED_IDENTIFIER) { source = token.tokenString; read(); } else { source = readQuotedString(); } if (!isSourceHeader && token.tokenType == Tokens.DESC) { isDesc = true; read(); } String sql = getLastPart(); args[2] = source; args[3] = Boolean.valueOf(isDesc); args[4] = Boolean.valueOf(isSourceHeader); int type = isSourceHeader ? StatementTypes.SET_TABLE_SOURCE_HEADER : StatementTypes.SET_TABLE_SOURCE; return new StatementCommand(type, args, null, new HsqlName[]{ t.getName() }); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Token.java0000644000175000017500000002261112007547364020673 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.types.Type; public class Token { String tokenString = ""; int tokenType = Tokens.X_UNKNOWN_TOKEN; Type dataType; Object tokenValue; String namePrefix; String namePrePrefix; String namePrePrePrefix; String charsetSchema; String charsetName; String fullString; int lobMultiplierType = Tokens.X_UNKNOWN_TOKEN; boolean isDelimiter; boolean isDelimitedIdentifier; boolean isDelimitedPrefix; boolean isDelimitedPrePrefix; boolean isDelimitedPrePrePrefix; boolean isUndelimitedIdentifier; boolean hasIrregularChar; boolean isReservedIdentifier; boolean isCoreReservedIdentifier; boolean isHostParameter; boolean isMalformed; // int position; Object expression; void reset() { tokenString = ""; tokenType = Tokens.X_UNKNOWN_TOKEN; dataType = null; tokenValue = null; namePrefix = null; namePrePrefix = null; namePrePrePrefix = null; charsetSchema = null; charsetName = null; fullString = null; expression = null; lobMultiplierType = Tokens.X_UNKNOWN_TOKEN; isDelimiter = false; isDelimitedIdentifier = false; isDelimitedPrefix = false; isDelimitedPrePrefix = false; isDelimitedPrePrePrefix = false; isUndelimitedIdentifier = false; hasIrregularChar = false; isReservedIdentifier = false; isCoreReservedIdentifier = false; isHostParameter = false; isMalformed = false; } Token duplicate() { Token token = new Token(); token.tokenString = tokenString; token.tokenType = tokenType; token.dataType = dataType; token.tokenValue = tokenValue; token.namePrefix = namePrefix; token.namePrePrefix = namePrePrefix; token.namePrePrePrefix = namePrePrePrefix; token.charsetSchema = charsetSchema; token.charsetName = charsetName; token.fullString = fullString; token.lobMultiplierType = lobMultiplierType; token.isDelimiter = isDelimiter; token.isDelimitedIdentifier = isDelimitedIdentifier; token.isDelimitedPrefix = isDelimitedPrefix; token.isDelimitedPrePrefix = isDelimitedPrePrefix; token.isDelimitedPrePrePrefix = isDelimitedPrePrePrefix; token.isUndelimitedIdentifier = isUndelimitedIdentifier; token.hasIrregularChar = hasIrregularChar; token.isReservedIdentifier = isReservedIdentifier; token.isCoreReservedIdentifier = isCoreReservedIdentifier; token.isHostParameter = isHostParameter; token.isMalformed = isMalformed; return token; } public String getFullString() { return fullString; } public void setExpression(Object expression) { this.expression = expression; } String getSQL() { if (expression instanceof ExpressionColumn) { if (tokenType == Tokens.ASTERISK) { StringBuffer sb = new StringBuffer(); Expression expression = (Expression) this.expression; if (expression != null && expression.opType == OpTypes.MULTICOLUMN && expression.nodes.length > 0) { sb.append(' '); for (int i = 0; i < expression.nodes.length; i++) { Expression e = expression.nodes[i]; ColumnSchema c = e.getColumn(); String name; if (e.opType == OpTypes.COALESCE) { if (i > 0) { sb.append(','); } sb.append(e.getColumnName()); continue; } if (e.getRangeVariable().tableAlias == null) { name = c.getName() .getSchemaQualifiedStatementName(); } else { RangeVariable range = e.getRangeVariable(); name = range.tableAlias.getStatementName() + '.' + c.getName().statementName; } if (i > 0) { sb.append(','); } sb.append(name); } sb.append(' '); } else { return tokenString; } return sb.toString(); } } else if (expression instanceof Type) { isDelimiter = false; Type type = (Type) expression; if (type.isDistinctType() || type.isDomainType()) { return type.getName().getSchemaQualifiedStatementName(); } return type.getNameString(); } else if (expression instanceof SchemaObject) { isDelimiter = false; return ((SchemaObject) expression).getName() .getSchemaQualifiedStatementName(); } if (namePrefix == null && isUndelimitedIdentifier) { return tokenString; } if (tokenType == Tokens.X_VALUE) { return dataType.convertToSQLString(tokenValue); } StringBuffer sb = new StringBuffer(); if (namePrePrefix != null) { if (isDelimitedPrePrefix) { sb.append('"'); sb.append(namePrePrefix); sb.append('"'); } else { sb.append(namePrePrefix); } sb.append('.'); } if (namePrefix != null) { if (isDelimitedPrefix) { sb.append('"'); sb.append(namePrefix); sb.append('"'); } else { sb.append(namePrefix); } sb.append('.'); } if (isDelimitedIdentifier) { sb.append('"'); sb.append(tokenString); sb.append('"'); isDelimiter = false; } else { sb.append(tokenString); } return sb.toString(); } /* for (int i = 0; i < tokens.length; i++) { if (tokens[i].schemaObjectIdentifier instanceof Expression) { ColumnSchema column = ((Expression) tokens[i].schemaObjectIdentifier) .getColumn(); tokens[i].schemaObjectIdentifier = column.getName(); } } */ static String getSQL(Token[] tokens) { boolean wasDelimiter = true; StringBuffer sb = new StringBuffer(); for (int i = 0; i < tokens.length; i++) { String sql = tokens[i].getSQL(); if (!tokens[i].isDelimiter && !wasDelimiter) { sb.append(' '); } sb.append(sql); wasDelimiter = tokens[i].isDelimiter; } return sb.toString(); } static Object[] getSimplifiedTokens(Token[] tokens) { Object[] array = new Object[tokens.length]; for (int i = 0; i < tokens.length; i++) { if (tokens[i].expression == null) { array[i] = tokens[i].getSQL(); } else { array[i] = tokens[i].expression; } } return array; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/0000755000175000017500000000000012007570422017637 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCResultSet.java0000644000175000017500000116234612007547356023106 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.io.StringReader; import java.math.BigDecimal; import java.sql.Array; import java.sql.Blob; import java.sql.Clob; import java.sql.Date; import java.sql.Ref; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; import java.util.Map; //#ifdef JAVA6 import java.sql.NClob; import java.sql.RowId; import java.sql.SQLXML; //#endif JAVA6 import org.hsqldb.ColumnBase; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.HsqlDateTime; import org.hsqldb.HsqlException; import org.hsqldb.SessionInterface; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.IntValueHashMap; import org.hsqldb.lib.StringInputStream; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.result.ResultMetaData; import org.hsqldb.result.ResultProperties; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobDataID; import org.hsqldb.types.ClobDataID; import org.hsqldb.types.DateTimeType; import org.hsqldb.types.IntervalType; import org.hsqldb.types.JavaObjectData; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /* $Id: JDBCResultSet.java 4966 2012-04-05 16:36:01Z fredt $ */ //boucherb@users 20051207 - patch 1.9.0 - initial JDBC 4.0 support work //fredt@users 20060431 - patch 1.9.0 rewrite with RowSetNavigator //boucherb@users 20060522 - doc 1.9.0 - full synch up to Mustang Build 84 // Revision 1.21 2006/07/12 12:27:25 boucherb // patch 1.9.0 // - full synch up to Mustang b90 /** * * A table of data representing a database result set, which * is usually generated by executing a statement that queries the database. * *

A ResultSet object maintains a cursor pointing * to its current row of data. Initially the cursor is positioned * before the first row. The next method moves the * cursor to the next row, and because it returns false * when there are no more rows in the ResultSet object, * it can be used in a while loop to iterate through * the result set. *

* A default ResultSet object is not updatable and * has a cursor that moves forward only. Thus, you can * iterate through it only once and only from the first row to the * last row. It is possible to * produce ResultSet objects that are scrollable and/or * updatable. The following code fragment, in which con * is a valid Connection object, illustrates how to make * a result set that is scrollable and insensitive to updates by others, and * that is updatable. See ResultSet fields for other * options. *

 *
 *       Statement stmt = con.createStatement(
 *                                      ResultSet.TYPE_SCROLL_INSENSITIVE,
 *                                      ResultSet.CONCUR_UPDATABLE);
 *       ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
 *       // rs will be scrollable, will not show changes made by others,
 *       // and will be updatable
 *
 * 
* The ResultSet interface provides * getter methods (getBoolean, getLong, and so on) * for retrieving column values from the current row. * Values can be retrieved using either the index number of the * column or the name of the column. In general, using the * column index will be more efficient. Columns are numbered from 1. * For maximum portability, result set columns within each row should be * read in left-to-right order, and each column should be read only once. * *

For the getter methods, a JDBC driver attempts * to convert the underlying data to the Java type specified in the * getter method and returns a suitable Java value. The JDBC specification * has a table showing the allowable mappings from SQL types to Java types * that can be used by the ResultSet getter methods. *

*

Column names used as input to getter methods are case * insensitive. When a getter method is called with * a column name and several columns have the same name, * the value of the first matching column will be returned. * The column name option is * designed to be used when column names are used in the SQL * query that generated the result set. * For columns that are NOT explicitly named in the query, it * is best to use column numbers. (JDBC4 clarification:) If column names are used, the * programmer should take care to guarantee that they uniquely refer to * the intended columns, which can be assured with the SQL AS clause. *

* A set of updater methods were added to this interface * in the JDBC 2.0 API (JavaTM 2 SDK, * Standard Edition, version 1.2). The comments regarding parameters * to the getter methods also apply to parameters to the * updater methods. *

* The updater methods may be used in two ways: *

    *
  1. to update a column value in the current row. In a scrollable * ResultSet object, the cursor can be moved backwards * and forwards, to an absolute position, or to a position * relative to the current row. * The following code fragment updates the NAME column * in the fifth row of the ResultSet object * rs and then uses the method updateRow * to update the data source table from which rs was derived. *
     *
     *       rs.absolute(5); // moves the cursor to the fifth row of rs
     *       rs.updateString("NAME", "AINSWORTH"); // updates the
     *          // NAME column of row 5 to be AINSWORTH
     *       rs.updateRow(); // updates the row in the data source
     *
     * 
    *
  2. *
  3. to insert column values into the insert row. An updatable * ResultSet object has a special row associated with * it that serves as a staging area for building a row to be inserted. * The following code fragment moves the cursor to the insert row, builds * a three-column row, and inserts it into rs and into * the data source table using the method insertRow. *
     *
     *       rs.moveToInsertRow(); // moves cursor to the insert row
     *       rs.updateString(1, "AINSWORTH"); // updates the
     *          // first column of the insert row to be AINSWORTH
     *       rs.updateInt(2,35); // updates the second column to be 35
     *       rs.updateBoolean(3, true); // updates the third column to true
     *       rs.insertRow();
     *       rs.moveToCurrentRow();
     *
     * 
    *
  4. *
*

A ResultSet object is automatically closed when the * Statement object that * generated it is closed, re-executed, or used * to retrieve the next result from a sequence of multiple results. * *

The number, types and properties of a ResultSet * object's columns are provided by the ResulSetMetaData * object returned by the ResultSet.getMetaData method. * * * *

*

HSQLDB-Specific Information:

* * A ResultSet object generated by HSQLDB is by default of * ResultSet.TYPE_FORWARD_ONLY (as is standard JDBC behavior) * and does not allow the use of absolute and relative positioning * methods. If a statement is created with:

* *

 * Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
 * 
* * then the ResultSet objects it produces support * using all of the absolute and relative positioning methods of JDBC2 * to set the position of the current row, for example:

* *

 * rs.absolute(5);
 * String fifthRowValue = rs.getString(1);
 * rs.relative(4);
 * String ninthRowValue = rs.getString(1);
 * 
* * Note: An HSQLDB ResultSet object persists, even after its * connection is closed. This is regardless of the operational mode of * the {@link org.hsqldb.Database Database} from which it came. That is, they * persist whether originating from a Server, * WebServer or in-process mode Database. *

* * From HSQLDB 2.0, there is full support for updatable result sets. * Supported methods * include all updateXXX methods for the supported types, as well as the * {@link #insertRow}, * {@link #updateRow}, {@link #deleteRow}, {@link #moveToInsertRow} * methods.

* * The Statement must be created with ResultSet.CONCUR_UPDATABLE instead of * CONCUR_READ_ONLY.

* * Updatability of a result set follows the SQL standards. Some or all columns * of an updatable result set can be updated. The current row in such result sets * can be deleted using the {@link #deleteRow} method. Some updatable result set * can also be inserted into and support {@link #moveToInsertRow}.

* * A result set is updatable if the SELECT statement * is updatable. This includes SELECT from TABLE and updatable VIEW objects. * An updatable SELECT statement has a single uderlying table or view. * HSQLDB supports both scrollable and forward-only result sets for updatability. * *

 * -- In the SELECT below, columns A and B are updatable, any row can be
 * -- deleted, but it is not insertable-into as column C is not directly from
 * -- the table.
 * SELECT A, B, A + B AS C FROM T WHERE ...
 *
 * -- The SELECT below can be insertable-into so long as other columns of the
 * -- table that do not appear in the SELECT list have a default value.
 * SELECT A, B FROM T WHERE ...
 * 
* * JRE 1.1.x Notes:

* * In general, JDBC 2 support requires Java 1.2 and above, and JDBC 3 requires * Java 1.4 and above. In HSQLDB, support for methods introduced in different * versions of JDBC depends on the JDK version used for compiling and building * HSQLDB.

* * Since 1.7.0, it is possible to build the product so that * all JDBC 2 methods can be called while executing under the version 1.1.x * Java Runtime EnvironmentTM. * However, some of these method calls require int values that * are defined only in the JDBC 2 or greater version of the * {@link java.sql.ResultSet ResultSet} interface. For this reason, when the * product is compiled under JDK 1.1.x, these values are defined here, in this * class.

* * In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the * JDBC2-only ResultSet values can be achieved by referring * to them in parameter specifications and return value comparisons, * respectively, as follows:

* *

 * JDBCResultSet.FETCH_FORWARD
 * JDBCResultSet.TYPE_FORWARD_ONLY
 * JDBCResultSet.TYPE_SCROLL_INSENSITIVE
 * JDBCResultSet.CONCUR_READ_ONLY
 * // etc.
 * 
* * However, please note that code written in such a manner will not be * compatible for use with other JDBC 2 drivers, since they expect and use * ResultSet, rather than JDBCResultSet. Also * note, this feature is offered solely as a convenience to developers * who must work under JDK 1.1.x due to operating constraints, yet wish to * use some of the more advanced features available under the JDBC 2 * specification.

* * (fredt@users)
* (boucherb@users)

* *

* @see JDBCStatement#executeQuery * @see JDBCStatement#getResultSet * @see java.sql.ResultSetMetaData * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since HSQLDB 1.9.0 * @revised JDK 7, HSQLDB 2.0.1 */ public class JDBCResultSet implements ResultSet { /** * * Moves the cursor froward one row from its current position. * A ResultSet cursor is initially positioned * before the first row; the first call to the method * next makes the first row the current row; the * second call makes the second row the current row, and so on. *

(JDBC4 clarification:) * When a call to the next method returns false, * the cursor is positioned after the last row. Any * invocation of a ResultSet method which requires a * current row will result in a SQLException being thrown. * If the result set type is TYPE_FORWARD_ONLY, it is vendor specified * whether their JDBC driver implementation will return false or * throw an SQLException on a * subsequent call to next. * *

If an input stream is open for the current row, a call * to the method next will * implicitly close it. A ResultSet object's * warning chain is cleared when a new row is read. * * * @return true if the new current row is valid; * false if there are no more rows * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public boolean next() throws SQLException { checkClosed(); rootWarning = null; return navigator.next(); } /** * * Releases this ResultSet object's database and * JDBC resources immediately instead of waiting for * this to happen when it is automatically closed. * *

(JDBC4 clarification:) * The closing of a ResultSet object does not close the Blob, * Clob or NClob objects created by the ResultSet. Blob, * Clob or NClob objects remain valid for at least the duration of the * transaction in which they are created, unless their free method is invoked. *

* (JDBC4 clarification:) * When a ResultSet is closed, any ResultSetMetaData * instances that were created by calling the getMetaData * method remain accessible. * *

Note: A ResultSet object * is automatically closed by the * Statement object that generated it when * that Statement object is closed, * re-executed, or is used to retrieve the next result from a * sequence of multiple results. * (JDBC4 deleted:) [A ResultSet object is also automatically * closed when it is garbage collected.] *

* Calling the method close on a ResultSet * object that is already closed is a no-op. *

*

* * * @exception SQLException if a database access error occurs */ public void close() throws SQLException { if (navigator == null) { return; } if (ResultProperties.isHeld(rsProperties)) { session.closeNavigator(navigator.getId()); } else { navigator.release(); } navigator = null; if (autoClose && statement != null) { statement.close(); } } /** * * Reports whether * the last column read had a value of SQL NULL. * Note that you must first call one of the getter methods * on a column to try to read its value and then call * the method wasNull to see if the value read was * SQL NULL. * * * @return true if the last column value read was SQL * NULL and false otherwise * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public boolean wasNull() throws SQLException { checkClosed(); return wasNullValue; } //====================================================================== // Methods for accessing results by column index //====================================================================== /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a String in the Java programming language. * * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public String getString(int columnIndex) throws SQLException { checkColumn(columnIndex); Type sourceType = resultMetaData.columnTypes[columnIndex - 1]; if (sourceType.typeCode == Types.SQL_CLOB) { ClobDataID x = (ClobDataID) getColumnInType(columnIndex, sourceType); if (x == null) { return null; } long length = x.length(session); if (length > Integer.MAX_VALUE) { Util.throwError(Error.error(ErrorCode.X_42561)); } return x.getSubString(session, 0, (int) length); } return (String) getColumnInType(columnIndex, Type.SQL_VARCHAR); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a boolean in the Java programming language. * * *

(JDBC4 clarification:) *

If the designated column has a datatype of CHAR or VARCHAR * and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT * and contains a 0, a value of false is returned. If the designated column has a datatype * of CHAR or VARCHAR * and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT * and contains a 1, a value of true is returned. * * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is false * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public boolean getBoolean(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.SQL_BOOLEAN); return o == null ? false : ((Boolean) o).booleanValue(); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a byte in the Java programming language. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB converts the numeric value to the return type. If the value is * out of the range for the return type, an error is returned. For example, * this can happen if getByte() or getShort() is used to retrieve a value * of type INTEGER or BIGINT and the value is beyond the range covered by * the return type. * *

* * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is 0 * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public byte getByte(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.TINYINT); return o == null ? 0 : ((Number) o).byteValue(); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a short in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB converts the numeric value to the return type. If the value is * out of the range for the return type, an error is returned. For example, * this can happen if getByte() or getShort() is used to retrieve a value * of type INTEGER or BIGINT and the value is beyond the range covered by * the return type. * *

* * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is 0 * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public short getShort(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.SQL_SMALLINT); return o == null ? 0 : ((Number) o).shortValue(); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * an int in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB converts the numeric value to the return type. If the value is * out of the range for the return type, an error is returned. For example, * this can happen if getInt() or getLong() is used to retrieve a value * of type DECIMAL or NUMERIC with a large precision and the value is beyond * the range covered by the return type. * *

* * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is 0 * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public int getInt(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.SQL_INTEGER); return o == null ? 0 : ((Number) o).intValue(); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a long in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB converts the numeric value to the return type. If the value is * out of the range for the return type, an error is returned. For example, * this can happen if getInt() or getLong() is used to retrieve a value * of type DECIMAL or NUMERIC with a large precision and the value is beyond * the range covered by the return type. * *

* * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is 0 * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public long getLong(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.SQL_BIGINT); return o == null ? 0 : ((Number) o).longValue(); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a float in the Java programming language. * * *
*

HSQLDB-Specific Information:

* * HSQLDB converts the numeric value to the return type. If the value is * out of the range for the return type, an error is returned. For example, * this can happen if getFloat() or getDouble() is used to retrieve a value * of type DECIMAL or NUMERIC with a large precision and the value is beyond * the range covered by the return type. * *

* * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is 0 * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public float getFloat(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.SQL_DOUBLE); return o == null ? (float) 0.0 : ((Number) o).floatValue(); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a double in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB converts the numeric value to the return type. If the value is * out of the range for the return type, an error is returned. For example, * this can happen if getFloat() or getDouble() is used to retrieve a value * of type DECIMAL or NUMERIC with a large precision and the value is beyond * the range covered by the return type. * *

* * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is 0 * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public double getDouble(int columnIndex) throws SQLException { Object o = getColumnInType(columnIndex, Type.SQL_DOUBLE); return o == null ? 0.0 : ((Number) o).doubleValue(); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a java.sql.BigDecimal in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB converts the result and sets the scale * with BigDecimal.ROUND_HALF_DOWN. *

* * * @param columnIndex the first column is 1, the second is 2, ... * @param scale the number of digits to the right of the decimal point * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @deprecated * by java.sun.com as of JDK 1.2 */ //#ifdef DEPRECATEDJDBC public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException { if (scale < 0) { throw Util.outOfRangeArgument(); } BigDecimal bd = getBigDecimal(columnIndex); if (bd != null) { bd = bd.setScale(scale, BigDecimal.ROUND_DOWN); } return bd; } //#endif /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a byte array in the Java programming language. * The bytes represent the raw values returned by the driver. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB returns correct values for columns of binary types * BINARY, BIT, BLOB *

* * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public byte[] getBytes(int columnIndex) throws SQLException { checkColumn(columnIndex); Type sourceType = resultMetaData.columnTypes[columnIndex - 1]; if (sourceType.typeCode == Types.SQL_BLOB) { BlobDataID x = (BlobDataID) getColumnInType(columnIndex, sourceType); if (x == null) { return null; } long length = x.length(session); if (length > Integer.MAX_VALUE) { Util.throwError(Error.error(ErrorCode.X_42561)); } return x.getBytes(session, 0, (int) length); } Object x = getColumnInType(columnIndex, Type.SQL_VARBINARY); if (x == null) { return null; } return ((BinaryData) x).getBytes(); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a java.sql.Date object in the Java programming language. * * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Date getDate(int columnIndex) throws SQLException { Object t = getColumnInType(columnIndex, Type.SQL_DATE); if (t == null) { return null; } return (Date) Type.SQL_DATE.convertSQLToJava(session, t); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a java.sql.Time object in the Java programming language. * * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Time getTime(int columnIndex) throws SQLException { Object t = getColumnInType(columnIndex, Type.SQL_TIME); if (t == null) { return null; } return (Time) Type.SQL_TIME.convertSQLToJava(session, t); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a java.sql.Timestamp object in the Java programming language. * * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Timestamp getTimestamp(int columnIndex) throws SQLException { Object t = getColumnInType(columnIndex, Type.SQL_TIMESTAMP); if (t == null) { return null; } return (Timestamp) Type.SQL_TIMESTAMP.convertSQLToJava(session, t); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a stream of ASCII characters. The value can then be read in chunks from the * stream. This method is particularly * suitable for retrieving large LONGVARCHAR values. * The JDBC driver will * do any necessary conversion from the database format into ASCII. * *

Note: All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a getter method implicitly closes the stream. Also, a * stream may return 0 when the method * InputStream.available * is called whether there is data available or not. * * * *

*

HSQLDB-Specific Information:

* * The limitation noted above does not apply to HSQLDB.

* * When the column is of type CHAR and its variations, it requires no * conversion since it is represented internally already as a * Java String object. When the column is not of type CHAR and its * variations, the returned stream is based on a conversion to the * Java String representation of the value. In either case, * the obtained stream is always equivalent to a stream of the low order * bytes from the value's String representation.

* * HSQLDB SQL CHAR and its variations are all Unicode strings * internally, so the recommended alternatives to this method are * {@link #getString(int) getString}, * {@link #getUnicodeStream(int) getUnicodeStream} (deprecated) * and new to 1.7.0: {@link #getCharacterStream(int) getCharacterStream} * (now prefered over the deprecated getUnicodeStream alternative). *

* * * @param columnIndex the first column is 1, the second is 2, ... * @return a Java input stream that delivers the database column value * as a stream of one-byte ASCII characters; * if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public java.io.InputStream getAsciiStream( int columnIndex) throws SQLException { String s = getString(columnIndex); if (s == null) { return null; } try { return new ByteArrayInputStream(s.getBytes("US-ASCII")); } catch (IOException e) { return null; } } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * as a stream of two-byte Unicode characters. The first byte is * the high byte; the second byte is the low byte. * * The value can then be read in chunks from the * stream. This method is particularly * suitable for retrieving large LONGVARCHARvalues. The * JDBC driver will do any necessary conversion from the database * format into Unicode. * *

Note: All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a getter method implicitly closes the stream. * Also, a stream may return 0 when the method * InputStream.available * is called, whether there is data available or not. * * * *

*

HSQLDB-Specific Information:

* * The limitation noted above does not apply to HSQLDB.

* * When the column is of type CHAR and its variations, it requires no * conversion since it is represented internally already as * Java Strings. When the column is not of type CHAR and its variations, * the returned stream is based on a conversion to the * Java String representation of the value. In either case, * the obtained stream is always equivalent to a stream of * bytes from the value's String representation, with high-byte first. *

* * * @param columnIndex the first column is 1, the second is 2, ... * @return a Java input stream that delivers the database column value * as a stream of two-byte Unicode characters; * if the value is SQL NULL, the value returned is * null * * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @deprecated use getCharacterStream in place of * getUnicodeStream */ //#ifdef DEPRECATEDJDBC public java.io.InputStream getUnicodeStream( int columnIndex) throws SQLException { String s = getString(columnIndex); if (s == null) { return null; } return new StringInputStream(s); } //#endif /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a stream of * uninterpreted bytes. The value can then be read in chunks from the * stream. This method is particularly * suitable for retrieving large LONGVARBINARY values. * *

Note: All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a getter method implicitly closes the stream. Also, a * stream may return 0 when the method * InputStream.available * is called whether there is data available or not. * * * @param columnIndex the first column is 1, the second is 2, ... * @return a Java input stream that delivers the database column value * as a stream of uninterpreted bytes; * if the value is SQL NULL, the value returned is * null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public java.io.InputStream getBinaryStream( int columnIndex) throws SQLException { checkColumn(columnIndex); Type sourceType = resultMetaData.columnTypes[columnIndex - 1]; Object o = getColumnInType(columnIndex, sourceType); if (o == null) { return null; } if (o instanceof BlobDataID) { return ((BlobDataID) o).getBinaryStream(session); } else if (o instanceof Blob) { return ((Blob) o).getBinaryStream(); } else if (o instanceof BinaryData) { byte[] b = getBytes(columnIndex); return new ByteArrayInputStream(b); } throw Util.sqlException(ErrorCode.X_42561); } //====================================================================== // Methods for accessing results by column label //====================================================================== /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a String in the Java programming language. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public String getString(String columnLabel) throws SQLException { return getString(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a boolean in the Java programming language. * *

(JDBC4 clarification:) If the designated column has a datatype of CHAR or VARCHAR * and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT * and contains a 0, a value of false is returned. If the designated column has a datatype * of CHAR or VARCHAR * and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT * and contains a 1, a value of true is returned. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL NULL, the * value returned is false * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public boolean getBoolean(String columnLabel) throws SQLException { return getBoolean(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a byte in the Java programming language. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL NULL, the * value returned is 0 * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public byte getByte(String columnLabel) throws SQLException { return getByte(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a short in the Java programming language. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL NULL, the * value returned is 0 * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public short getShort(String columnLabel) throws SQLException { return getShort(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * an int in the Java programming language. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL NULL, the * value returned is 0 * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public int getInt(String columnLabel) throws SQLException { return getInt(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a long in the Java programming language. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL NULL, the * value returned is 0 * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public long getLong(String columnLabel) throws SQLException { return getLong(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a float in the Java programming language. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL NULL, the * value returned is 0 * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public float getFloat(String columnLabel) throws SQLException { return getFloat(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a double in the Java programming language. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL NULL, the * value returned is 0 * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public double getDouble(String columnLabel) throws SQLException { return getDouble(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a java.math.BigDecimal in the Java programming language. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB converts the result and sets the scale * with BigDecimal.ROUND_HALF_DOWN. *

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param scale the number of digits to the right of the decimal point * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @deprecated * by java.sun.com as of JDK 1.2 */ //#ifdef DEPRECATEDJDBC public BigDecimal getBigDecimal(String columnLabel, int scale) throws SQLException { return getBigDecimal(findColumn(columnLabel), scale); } //#endif /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a byte array in the Java programming language. * The bytes represent the raw values returned by the driver. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public byte[] getBytes(String columnLabel) throws SQLException { return getBytes(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a java.sql.Date object in the Java programming language. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Date getDate(String columnLabel) throws SQLException { return getDate(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a java.sql.Time object in the Java programming language. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; * if the value is SQL NULL, * the value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Time getTime(String columnLabel) throws SQLException { return getTime(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as * a java.sql.Timestamp object in the Java programming language. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Timestamp getTimestamp(String columnLabel) throws SQLException { return getTimestamp(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a stream of * ASCII characters. The value can then be read in chunks from the * stream. This method is particularly * suitable for retrieving large LONGVARCHAR values. * The JDBC driver will * do any necessary conversion from the database format into ASCII. * *

Note: All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a getter method implicitly closes the stream. Also, a * stream may return 0 when the method available * is called whether there is data available or not. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a Java input stream that delivers the database column value * as a stream of one-byte ASCII characters. * If the value is SQL NULL, * the value returned is null. * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @see #getAsciiStream(int) */ public java.io.InputStream getAsciiStream( String columnLabel) throws SQLException { return getAsciiStream(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a stream of two-byte * Unicode characters. The first byte is the high byte; the second * byte is the low byte. * * The value can then be read in chunks from the * stream. This method is particularly * suitable for retrieving large LONGVARCHAR values. * The JDBC technology-enabled driver will * do any necessary conversion from the database format into Unicode. * *

Note: All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a getter method implicitly closes the stream. * Also, a stream may return 0 when the method * InputStream.available is called, whether there * is data available or not. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a Java input stream that delivers the database column value * as a stream of two-byte Unicode characters. * If the value is SQL NULL, the value returned * is null. * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @deprecated use getCharacterStream instead * @see #getUnicodeStream(int) */ //#ifdef DEPRECATEDJDBC public java.io.InputStream getUnicodeStream( String columnLabel) throws SQLException { return getUnicodeStream(findColumn(columnLabel)); } //#endif /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a stream of uninterpreted * bytes. * The value can then be read in chunks from the * stream. This method is particularly * suitable for retrieving large LONGVARBINARY * values. * *

Note: All the data in the returned stream must be * read prior to getting the value of any other column. The next * call to a getter method implicitly closes the stream. Also, a * stream may return 0 when the method available * is called whether there is data available or not. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a Java input stream that delivers the database column value * as a stream of uninterpreted bytes; * if the value is SQL NULL, the result is null * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public java.io.InputStream getBinaryStream( String columnLabel) throws SQLException { return getBinaryStream(findColumn(columnLabel)); } //===================================================================== // Advanced features: //===================================================================== /** * * Retrieves the first warning reported by calls on this * ResultSet object. * Subsequent warnings on this ResultSet object * will be chained to the SQLWarning object that * this method returns. * *

The warning chain is automatically cleared each time a new * row is read. This method may not be called on a ResultSet * object that has been closed; doing so will cause an * SQLException to be thrown. *

* Note: This warning chain only covers warnings caused * by ResultSet methods. Any warning caused by * Statement methods * (such as reading OUT parameters) will be chained on the * Statement object. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB does not produce SQLWarning * objects on any ResultSet object warning chain; this * method always returns null. *

* * * @return the first SQLWarning object reported or * null if there are none * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public SQLWarning getWarnings() throws SQLException { checkClosed(); return rootWarning; } /** * * Clears all warnings reported on this ResultSet object. * After this method is called, the method getWarnings * returns null until a new warning is * reported for this ResultSet object. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not produce SQLWarning * objects on any ResultSet object warning chain; calls to this method * are ignored. *

* * * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public void clearWarnings() throws SQLException { checkClosed(); rootWarning = null; } /** * * Retrieves the name of the SQL cursor used by this ResultSet * object. * *

In SQL, a result table is retrieved through a cursor that is * named. The current row of a result set can be updated or deleted * using a positioned update/delete statement that references the * cursor name. To insure that the cursor has the proper isolation * level to support update, the cursor's SELECT statement * should be of the form SELECT FOR UPDATE. If * FOR UPDATE is omitted, the positioned updates may fail. * *

The JDBC API supports this SQL feature by providing the name of the * SQL cursor used by a ResultSet object. * The current row of a ResultSet object * is also the current row of this SQL cursor. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature when the cursor has a name.

* *

* * * @return the SQL name for this ResultSet object's cursor * @exception SQLException if a database access error occurs or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method */ public String getCursorName() throws SQLException { checkClosed(); if (result == null) { return ""; } return result.getMainString(); } /** * * Retrieves the number, types and properties of * this ResultSet object's columns. * * * *
*

HSQLDB-Specific Information:

* * Example:

* * The following code fragment creates a ResultSet object rs, * creates a ResultSetMetaData object rsmd, and uses rsmd * to find out how many columns rs has and whether the first column * in rs can be used in a WHERE clause.

* *

     * ResultSet rs   = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
     * ResultSetMetaData rsmd = rs.getMetaData();
* int numberOfColumns = rsmd.getColumnCount();
* boolean b = rsmd.isSearchable(1);
*
* *
* * Changes:

* * With version 2.0, the engine's SQL implementation has been * completely rewritten. Changes to this class and the implementation of * ResultSetMetaData reflect the engine's new capabilities and provide * more accurate information.

* * changes to consider:

* *

    *
  1. isAutoIncrement(int) always returned false
  2. *
  3. isNullable(int) returns the nullability of a real table or view * column in the ResultSet and returns * columnNoNulls for non-base-column ResultSet columns * (columns of the ResultSet that are based on expressions or * aggregates).
  4. *
  5. getColumnDisplaySize(int) returns correct results even for expression * columns.
  6. *
  7. getPrecision(int) returns the correct precision even for expression * columns.
  8. *
  9. getScale(int) returns the correct precision even for expression * columns.
  10. *
  11. getCatalogName(int) returns the catalog name of the database.
  12. *

* *


*
* * * @return the description of this ResultSet object's columns * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @see JDBCResultSetMetaData */ public ResultSetMetaData getMetaData() throws SQLException { checkClosed(); if (resultSetMetaData == null) { resultSetMetaData = new JDBCResultSetMetaData(resultMetaData, isUpdatable, isInsertable, connection); } return resultSetMetaData; } /** * *

Gets the value of the designated column in the current row * of this ResultSet object as * an Object in the Java programming language. * *

This method will return the value of the given column as a * Java object. The type of the Java object will be the default * Java object type corresponding to the column's SQL type, * following the mapping for built-in types specified in the JDBC * specification. If the value is an SQL NULL, * the driver returns a Java null. * *

This method may also be used to read database-specific * abstract data types. * * In the JDBC 2.0 API, the behavior of method * getObject is extended to materialize * data of SQL user-defined types. *

* If Connection.getTypeMap does not throw a * SQLFeatureNotSupportedException, * then when a column contains a structured or distinct value, * the behavior of this method is as * if it were a call to: getObject(columnIndex, * this.getStatement().getConnection().getTypeMap()). * * If Connection.getTypeMap does throw a * SQLFeatureNotSupportedException, * then structured values are not supported, and distinct values * are mapped to the default Java class as determined by the * underlying SQL type of the DISTINCT type. * * * @param columnIndex the first column is 1, the second is 2, ... * @return a java.lang.Object holding the column value * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Object getObject(int columnIndex) throws SQLException { checkColumn(columnIndex); Type sourceType = resultMetaData.columnTypes[columnIndex - 1]; switch (sourceType.typeCode) { case Types.SQL_ARRAY : return getArray(columnIndex); case Types.SQL_DATE : return getDate(columnIndex); case Types.SQL_TIME : case Types.SQL_TIME_WITH_TIME_ZONE : return getTime(columnIndex); case Types.SQL_TIMESTAMP : case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : return getTimestamp(columnIndex); case Types.SQL_BINARY : case Types.SQL_VARBINARY : return getBytes(columnIndex); case Types.SQL_BIT : { boolean b = getBoolean(columnIndex); return wasNull() ? null : b ? Boolean.TRUE : Boolean.FALSE; } case Types.SQL_CLOB : return getClob(columnIndex); case Types.SQL_BLOB : return getBlob(columnIndex); case Types.OTHER : case Types.JAVA_OBJECT : { Object o = getColumnInType(columnIndex, sourceType); if (o == null) { return null; } try { return ((JavaObjectData) o).getObject(); } catch (HsqlException e) { throw Util.sqlException(e); } } default : return getColumnInType(columnIndex, sourceType); } } /** * *

Gets the value of the designated column in the current row * of this ResultSet object as * an Object in the Java programming language. * *

This method will return the value of the given column as a * Java object. The type of the Java object will be the default * Java object type corresponding to the column's SQL type, * following the mapping for built-in types specified in the JDBC * specification. If the value is an SQL NULL, * the driver returns a Java null. *

* This method may also be used to read database-specific * abstract data types. *

* In the JDBC 2.0 API, the behavior of the method * getObject is extended to materialize * data of SQL user-defined types. When a column contains * a structured or distinct value, the behavior of this method is as * if it were a call to: getObject(columnIndex, * this.getStatement().getConnection().getTypeMap()). * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a java.lang.Object holding the column value * @exception SQLException if a database access error occurs or this method is * called on a closed result set */ public Object getObject(String columnLabel) throws SQLException { return getObject(findColumn(columnLabel)); } //---------------------------------------------------------------- /** * * Maps the given ResultSet column label to its * ResultSet column index. * * * *

*

HSQLDB-Specific Information:

* * Starting with 1.9.x, HSQLDB does an exhaustive search, backed by * a cache lookup (to improve performance for subsequent invocations with * a given input).

* * This is in response to an observation posted here:

* * http://sourceforge.net/forum/forum.php?thread_id=1388727&forum_id=73674

* * Upon careful investigation of the JDBC specification and the behaviour * of existing JDBC drivers, there is actually nothing preventing the * findColumn method from doing an exhaustive search, as long as it conforms * to the following rules (which describe the new implementation):

* *

    *
  1. the entire search is case insensitive *
  2. each search iteration occurs from leftmost to rightmost column, * returning the first match encountered *
  3. the first pass matches only bare column labels *
  4. the second pass matches only simple column names *
  5. further passes conform to the identifier qualification * and identifier quoting rules of the engine *
* * In this implementation, the SQL tokenizer is not employed, both because * it does not yet correctly handle greater than two part qualification * and also because is is not immediately considered important to do a * truly exhaustive search, handling the full range of possibly mixed quoted * and unquoted identifier components.

* * Instead:

*

    *
  • a third pass matches simple table-dot-column qualified names *
  • a fourth pass matches simple schema-dot-table-dot-column qualified column names *
*
* * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column index of the given column name * @exception SQLException if the ResultSet object * does not contain a column labeled columnLabel, a database access error occurs * or this method is called on a closed result set */ public int findColumn(final String columnLabel) throws SQLException { checkClosed(); if (columnLabel == null) { throw Util.nullArgument(); } int columnIndex; // faster lookup for subsequent access if (columnMap != null) { columnIndex = columnMap.get(columnLabel, -1); if (columnIndex != -1) { return columnIndex; } } final String[] colLabels = resultMetaData.columnLabels; columnIndex = -1; // column labels first, to preference column aliases for (int i = 0; i < columnCount; i++) { if (columnLabel.equalsIgnoreCase(colLabels[i])) { columnIndex = i; break; } } final ColumnBase[] columns = resultMetaData.columns; // then bare column names, to preference simple // quoted column idents that *may* contain "." if (columnIndex < 0) { for (int i = 0; i < columnCount; i++) { if (columnLabel.equalsIgnoreCase(columns[i].getNameString())) { columnIndex = i; break; } } } // then table-qualified column names (again, quoted // table idents *may* contain "." // As a last resort, "fully" qualified column names // (we don't yet bother with catalog qualification) if (columnIndex < 0) { int position = columnLabel.indexOf('.'); if (position < 0) { throw Util.sqlException(ErrorCode.JDBC_COLUMN_NOT_FOUND, columnLabel); } for (int i = 0; i < columnCount; i++) { final String tabName = columns[i].getTableNameString(); if (tabName == null || tabName.length() == 0) { continue; } final String colName = columns[i].getNameString(); if (columnLabel.equalsIgnoreCase(tabName + '.' + colName)) { columnIndex = i; break; } final String schemName = columns[i].getSchemaNameString(); if (schemName == null || schemName.length() == 0) { continue; } String match = new StringBuffer(schemName).append('.').append( tabName).append('.').append(colName).toString(); if (columnLabel.equalsIgnoreCase(match)) { columnIndex = i; break; } } } if (columnIndex < 0) { throw Util.sqlException(ErrorCode.JDBC_COLUMN_NOT_FOUND, columnLabel); } columnIndex++; if (columnMap == null) { columnMap = new IntValueHashMap(); } columnMap.put(columnLabel, columnIndex); return columnIndex; } //--------------------------JDBC 2.0----------------------------------- //--------------------------------------------------------------------- // Getters and Setters //--------------------------------------------------------------------- /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a * java.io.Reader object. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @return a java.io.Reader object that contains the column * value; if the value is SQL NULL, the value returned is * null in the Java programming language. * @param columnIndex the first column is 1, the second is 2, ... * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @since JDK 1.2 */ public java.io.Reader getCharacterStream( int columnIndex) throws SQLException { checkColumn(columnIndex); Type sourceType = resultMetaData.columnTypes[columnIndex - 1]; Object o = getColumnInType(columnIndex, sourceType); if (o == null) { return null; } if (o instanceof ClobDataID) { return ((ClobDataID) o).getCharacterStream(session); } else if (o instanceof Clob) { return ((Clob) o).getCharacterStream(); } else if (o instanceof String) { return new StringReader((String) o); } throw Util.sqlException(ErrorCode.X_42561); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a * java.io.Reader object. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a java.io.Reader object that contains the column * value; if the value is SQL NULL, the value returned is * null in the Java programming language * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @since JDK 1.2 */ public java.io.Reader getCharacterStream( String columnLabel) throws SQLException { return getCharacterStream(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a * java.math.BigDecimal with full precision. * * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value (full precision); * if the value is SQL NULL, the value returned is * null in the Java programming language. * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public BigDecimal getBigDecimal(int columnIndex) throws SQLException { checkColumn(columnIndex); Type targetType = resultMetaData.columnTypes[columnIndex - 1]; switch (targetType.typeCode) { case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : break; case Types.TINYINT : case Types.SQL_SMALLINT : case Types.SQL_INTEGER : case Types.SQL_BIGINT : targetType = Type.SQL_DECIMAL; break; case Types.SQL_DOUBLE : default : targetType = Type.SQL_DECIMAL_DEFAULT; break; } return (BigDecimal) getColumnInType(columnIndex, targetType); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a * java.math.BigDecimal with full precision. * * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return the column value (full precision); * if the value is SQL NULL, the value returned is * null in the Java programming language. * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public BigDecimal getBigDecimal(String columnLabel) throws SQLException { return getBigDecimal(findColumn(columnLabel)); } //--------------------------------------------------------------------- // Traversal/Positioning //--------------------------------------------------------------------- /** * * Retrieves whether the cursor is before the first row in * this ResultSet object. *

* (JDBC4 Clarification:)

* Note:Support for the isBeforeFirst method * is optional for ResultSets with a result * set type of TYPE_FORWARD_ONLY * * * @return true if the cursor is before the first row; * false if the cursor is at any other position or the * result set contains no rows * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean isBeforeFirst() throws SQLException { checkClosed(); if (isOnInsertRow) { return false; } return navigator.isBeforeFirst(); } /** * * Retrieves whether the cursor is after the last row in * this ResultSet object. *

* (JDBC4 Clarification:)

* Note:Support for the isAfterLast method * is optional for ResultSets with a result * set type of TYPE_FORWARD_ONLY * * * @return true if the cursor is after the last row; * false if the cursor is at any other position or the * result set contains no rows * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean isAfterLast() throws SQLException { // At afterLast condition exists when resultset has been traversed and // the current row is null. iCurrentRow should also be set to // afterlast but no need to test checkClosed(); if (isOnInsertRow) { return false; } return navigator.isAfterLast(); } /** * * Retrieves whether the cursor is on the first row of * this ResultSet object. *

* (JDBC4 Clarification:)

* Note:Support for the isFirst method * is optional for ResultSets with a result * set type of TYPE_FORWARD_ONLY * * * @return true if the cursor is on the first row; * false otherwise * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean isFirst() throws SQLException { checkClosed(); if (isOnInsertRow) { return false; } return navigator.isFirst(); } /** * * Retrieves whether the cursor is on the last row of * this ResultSet object. * Note: Calling the method isLast may be expensive * because the JDBC driver * might need to fetch ahead one row in order to determine * whether the current row is the last row in the result set. *

* (JDBC4 Clarification:)

* Note: Support for the isLast method * is optional for ResultSets with a result * set type of TYPE_FORWARD_ONLY * * * @return true if the cursor is on the last row; * false otherwise * @exception SQLException if a database access error occurs or this method is * called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean isLast() throws SQLException { checkClosed(); if (isOnInsertRow) { return false; } return navigator.isLast(); } /** * * Moves the cursor to the front of * this ResultSet object, just before the * first row. This method has no effect if the result set contains no rows. * * * @exception SQLException if a database access error * occurs, this method is called on a closed result set or the * result set type is TYPE_FORWARD_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void beforeFirst() throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } navigator.beforeFirst(); } /** * * Moves the cursor to the end of * this ResultSet object, just after the * last row. This method has no effect if the result set contains no rows. * * * @exception SQLException if a database access error * occurs, this method is called on a closed result set * or the result set type is TYPE_FORWARD_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void afterLast() throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } navigator.afterLast(); } /** * * Moves the cursor to the first row in * this ResultSet object. * * * @return true if the cursor is on a valid row; * false if there are no rows in the result set * @exception SQLException if a database access error * occurs, this method is called on a closed result set * or the result set type is TYPE_FORWARD_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean first() throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } return navigator.first(); } /** * * Moves the cursor to the last row in * this ResultSet object. * * * @return true if the cursor is on a valid row; * false if there are no rows in the result set * @exception SQLException if a database access error * occurs, this method is called on a closed result set * or the result set type is TYPE_FORWARD_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean last() throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } return navigator.last(); } /** * * Retrieves the current row number. The first row is number 1, the * second number 2, and so on. *

* (JDBC4 Clarification:)

* Note:Support for the getRow method * is optional for ResultSets with a result * set type of TYPE_FORWARD_ONLY * * * @return the current row number; 0 if there is no current row * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public int getRow() throws SQLException { checkClosed(); if (navigator.isAfterLast()) { return 0; } return navigator.getRowNumber() + 1; } /** * * Moves the cursor to the given row number in * this ResultSet object. * *

If the row number is positive, the cursor moves to * the given row number with respect to the * beginning of the result set. The first row is row 1, the second * is row 2, and so on. * *

If the given row number is negative, the cursor moves to * an absolute row position with respect to * the end of the result set. For example, calling the method * absolute(-1) positions the * cursor on the last row; calling the method absolute(-2) * moves the cursor to the next-to-last row, and so on. * *

An attempt to position the cursor beyond the first/last row in * the result set leaves the cursor before the first row or after * the last row. * *

Note: Calling absolute(1) is the same * as calling first(). Calling absolute(-1) * is the same as calling last(). * * * @param row the number of the row to which the cursor should move. * A positive number indicates the row number counting from the * beginning of the result set; a negative number indicates the * row number counting from the end of the result set * @return true if the cursor is moved to a position in this * ResultSet object; * false if the cursor is before the first row or after the * last row * @exception SQLException if a database access error * occurs, this method is called on a closed result set * or the result set type is TYPE_FORWARD_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean absolute(int row) throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } if (row > 0) { row--; } else if (row == 0) { return navigator.beforeFirst(); } return navigator.absolute(row); } /** * * Moves the cursor a relative number of rows, either positive or negative. * Attempting to move beyond the first/last row in the * result set positions the cursor before/after the * the first/last row. Calling relative(0) is valid, but does * not change the cursor position. * *

Note: Calling the method relative(1) * is identical to calling the method next() and * calling the method relative(-1) is identical * to calling the method previous(). * * * @param rows an int specifying the number of rows to * move from the current row; a positive number moves the cursor * forward; a negative number moves the cursor backward * @return true if the cursor is on a row; * false otherwise * @exception SQLException if a database access error occurs, this method * is called on a closed result set, * there is no current row, or the result set type is * TYPE_FORWARD_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean relative(int rows) throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } return navigator.relative(rows); } /** * * Moves the cursor to the previous row in this * ResultSet object. *

* (JDBC4 clarification:) * When a call to the previous method returns false, * the cursor is positioned before the first row. Any invocation of a * ResultSet method which requires a current row will result in a * SQLException being thrown. *

* (JDBC4 clarification:) * If an input stream is open for the current row, a call to the method * previous will implicitly close it. A ResultSet * object's warning change is cleared when a new row is read. *

* * * @return (JDBC4 clarification:) true if the cursor is now positioned on a valid row; * false if the cursor is positioned before the first row * @exception SQLException if a database access error * occurs; this method is called on a closed result set * or the result set type is TYPE_FORWARD_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean previous() throws SQLException { checkClosed(); checkNotForwardOnly(); if (isOnInsertRow || isRowUpdated) { throw Util.sqlExceptionSQL(ErrorCode.X_24513); } rootWarning = null; return navigator.previous(); } //--------------------------------------------------------------------- // Properties //--------------------------------------------------------------------- /** * * Gives a hint as to the direction in which the rows in this * ResultSet object will be processed. * The initial value is determined by the * Statement object * that produced this ResultSet object. * The fetch direction may be changed at any time. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB does not need this hint. However, as mandated by the JDBC standard, * an SQLException is thrown if the result set type is TYPE_FORWARD_ONLY * and a fetch direction other than FETCH_FORWARD is requested.

*

* * * @param direction an int specifying the suggested * fetch direction; one of ResultSet.FETCH_FORWARD, * ResultSet.FETCH_REVERSE, or * ResultSet.FETCH_UNKNOWN * @exception SQLException if a database access error occurs; this * method is called on a closed result set or * the result set type is TYPE_FORWARD_ONLY and the fetch * direction is not FETCH_FORWARD * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) * @see JDBCStatement#setFetchDirection * @see #getFetchDirection */ public void setFetchDirection(int direction) throws SQLException { checkClosed(); switch (direction) { case FETCH_FORWARD : { break; } case FETCH_REVERSE : { checkNotForwardOnly(); break; } case FETCH_UNKNOWN : { checkNotForwardOnly(); break; } default : { throw Util.notSupported(); } } } /** * * Retrieves the fetch direction for this * ResultSet object. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not depend on fetch direction and always returns * FETCH_FORWARD, but the value has no real meaning.

*

* * * @return the current fetch direction for this ResultSet object * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) * @see #setFetchDirection */ public int getFetchDirection() throws SQLException { checkClosed(); return FETCH_FORWARD; } /** * * Gives the JDBC driver a hint as to the number of rows that should * be fetched from the database when more rows are needed for this * ResultSet object. * If the fetch size specified is zero, the JDBC driver * ignores the value and is free to make its own best guess as to what * the fetch size should be. The default value is set by the * Statement object * that created the result set. The fetch size may be changed at any time. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB may not build and return a result set as a * whole. Therefore the supplied, non-zero, fetch size value is used for * some ResultSet objects. *

* * * @param rows the number of rows to fetch * @exception SQLException if a database access error occurs; this method * (JDBC4 Clarification:) * is called on a closed result set or the * (JDBC4 clarification:) * condition rows >= 0 is not satisfied * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) * @see #getFetchSize * @see JDBCStatement#setFetchSize * @see JDBCStatement#getFetchSize */ public void setFetchSize(int rows) throws SQLException { if (rows < 0) { throw Util.outOfRangeArgument(); } } /** * * Retrieves the fetch size for this * ResultSet object. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB may not build and return a result set as a * whole. The acutal fetch size for this result set is returned. *

* * * @return the current fetch size for this ResultSet object * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) * @see #setFetchSize * @see JDBCStatement#getFetchSize * @see JDBCStatement#setFetchSize */ public int getFetchSize() throws SQLException { checkClosed(); return fetchSize; } /** * * Retrieves the type of this ResultSet object. * The type is determined by the Statement object * that created the result set. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB accurately * reports the actual runtime scrollability of this result set instance. *

* * * @return ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, * or ResultSet.TYPE_SCROLL_SENSITIVE * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public int getType() throws SQLException { checkClosed(); return ResultProperties.getJDBCScrollability(rsProperties); } /** * * Retrieves the concurrency mode of this ResultSet object. * The concurrency used is determined by the * Statement object that created the result set. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports updatable result sets and accurately reports the actual * runtime concurrency of this result set instance. *

* * * @return the concurrency type, either * ResultSet.CONCUR_READ_ONLY * or ResultSet.CONCUR_UPDATABLE * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public int getConcurrency() throws SQLException { checkClosed(); return ResultProperties.getJDBCConcurrency(rsProperties); } //--------------------------------------------------------------------- // Updates //--------------------------------------------------------------------- /** * * Retrieves whether the current row has been updated. The value returned * depends on whether or not the result set can detect updates. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports updatable result sets and accurately reports the actual * value. *

* * * @return true if the current row is detected to * have been visibly updated by the owner or another; false otherwise * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see JDBCDatabaseMetaData#updatesAreDetected * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean rowUpdated() throws SQLException { checkClosed(); return isRowUpdated; } /** * * Retrieves whether the current row has had an insertion. * The value returned depends on whether or not this * ResultSet object can detect visible inserts. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports updatable result sets and accurately reports the actual * value. *

* * * @return true if the current row is detected to * have been inserted; false otherwise * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see JDBCDatabaseMetaData#insertsAreDetected * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean rowInserted() throws SQLException { checkClosed(); return false; } /** * * Retrieves whether a row has been deleted. A deleted row may leave * a visible "hole" in a result set. This method can be used to * detect holes in a result set. The value returned depends on whether * or not this ResultSet object can detect deletions. *

* (JDBC4 Clarification:)

* Note: Support for the rowDeleted method is optional with a result set * concurrency of CONCUR_READ_ONLY * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports updatable result sets and accurately reports the actual * value. *

* * @return true if the current row is detected to * have been deleted by the owner or another; false otherwise * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see JDBCDatabaseMetaData#deletesAreDetected * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public boolean rowDeleted() throws SQLException { checkClosed(); return false; } /** * * (JDBC4 clarification:) * Updates the designated column with a null value. * * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow * or insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateNull(int columnIndex) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, null); } /** * * Updates the designated column with a boolean value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBoolean(int columnIndex, boolean x) throws SQLException { Boolean value = x ? Boolean.TRUE : Boolean.FALSE; startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, value); } /** * * Updates the designated column with a byte value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateByte(int columnIndex, byte x) throws SQLException { startUpdate(columnIndex); preparedStatement.setIntParameter(columnIndex, x); } /** * * Updates the designated column with a short value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateShort(int columnIndex, short x) throws SQLException { startUpdate(columnIndex); preparedStatement.setIntParameter(columnIndex, x); } /** * * Updates the designated column with an int value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateInt(int columnIndex, int x) throws SQLException { startUpdate(columnIndex); preparedStatement.setIntParameter(columnIndex, x); } /** * * Updates the designated column with a long value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateLong(int columnIndex, long x) throws SQLException { startUpdate(columnIndex); preparedStatement.setLongParameter(columnIndex, x); } /** * * Updates the designated column with a float value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateFloat(int columnIndex, float x) throws SQLException { Double value = new Double(x); startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, value); } /** * * Updates the designated column with a double value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateDouble(int columnIndex, double x) throws SQLException { Double value = new Double(x); startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, value); } /** * * Updates the designated column with a java.math.BigDecimal * value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * * Updates the designated column with a String value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateString(int columnIndex, String x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * * Updates the designated column with a byte array value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBytes(int columnIndex, byte[] x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * * Updates the designated column with a java.sql.Date value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateDate(int columnIndex, Date x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * * Updates the designated column with a java.sql.Time value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateTime(int columnIndex, Time x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * * Updates the designated column with a java.sql.Timestamp * value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * * (JDBC4 clarification:) * Updates the designated column with an ascii stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateAsciiStream(int columnIndex, java.io.InputStream x, int length) throws SQLException { startUpdate(columnIndex); preparedStatement.setAsciiStream(columnIndex, x, length); } /** * * (JDBC4 clarification:) * Updates the designated column with a binary stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBinaryStream(int columnIndex, java.io.InputStream x, int length) throws SQLException { startUpdate(columnIndex); preparedStatement.setBinaryStream(columnIndex, x, length); } /** * * (JDBC4 clarification:) * Updates the designated column with a character stream value, which will have * the specified number of (CHECKME: characters?) bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateCharacterStream(int columnIndex, java.io.Reader x, int length) throws SQLException { startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, x, length); } /** * * Updates the designated column with an Object value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. *

* (JDBC clarification:) * If the second argument is an InputStream then the stream must contain * the number of bytes specified by scaleOrLength. If the second argument is a * Reader then the reader must contain the number of characters specified * by scaleOrLength. If these conditions are not true the driver will generate a * SQLException when the statement is executed. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param scaleOrLength for an object of java.math.BigDecimal , * this is the number of digits after the decimal point. For * Java Object types InputStream and Reader, * this is the length * of the data in the stream or reader. For all other types, * this value will be ignored. * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateObject(int columnIndex, Object x, int scaleOrLength) throws SQLException { startUpdate(columnIndex); preparedStatement.setObject(columnIndex, x, 0, scaleOrLength); } /** * * Updates the designated column with an Object value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateObject(int columnIndex, Object x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } /** * * Updates the designated column with a null value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateNull(String columnLabel) throws SQLException { updateNull(findColumn(columnLabel)); } /** * * Updates the designated column with a boolean value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBoolean(String columnLabel, boolean x) throws SQLException { updateBoolean(findColumn(columnLabel), x); } /** * * Updates the designated column with a byte value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateByte(String columnLabel, byte x) throws SQLException { updateByte(findColumn(columnLabel), x); } /** * * Updates the designated column with a short value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateShort(String columnLabel, short x) throws SQLException { updateShort(findColumn(columnLabel), x); } /** * * Updates the designated column with an int value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateInt(String columnLabel, int x) throws SQLException { updateInt(findColumn(columnLabel), x); } /** * * Updates the designated column with a long value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateLong(String columnLabel, long x) throws SQLException { updateLong(findColumn(columnLabel), x); } /** * * Updates the designated column with a float value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateFloat(String columnLabel, float x) throws SQLException { updateFloat(findColumn(columnLabel), x); } /** * * Updates the designated column with a double value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateDouble(String columnLabel, double x) throws SQLException { updateDouble(findColumn(columnLabel), x); } /** * * Updates the designated column with a java.sql.BigDecimal * value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBigDecimal(String columnLabel, BigDecimal x) throws SQLException { updateBigDecimal(findColumn(columnLabel), x); } /** * * Updates the designated column with a String value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateString(String columnLabel, String x) throws SQLException { updateString(findColumn(columnLabel), x); } /** * * Updates the designated column with a byte array value. * * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow * or insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBytes(String columnLabel, byte[] x) throws SQLException { updateBytes(findColumn(columnLabel), x); } /** * * Updates the designated column with a java.sql.Date value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateDate(String columnLabel, Date x) throws SQLException { updateDate(findColumn(columnLabel), x); } /** * * Updates the designated column with a java.sql.Time value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateTime(String columnLabel, Time x) throws SQLException { updateTime(findColumn(columnLabel), x); } /** * * Updates the designated column with a java.sql.Timestamp * value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateTimestamp(String columnLabel, Timestamp x) throws SQLException { updateTimestamp(findColumn(columnLabel), x); } /** * * (JDBC4 clarification:) * Updates the designated column with an ascii stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateAsciiStream(String columnLabel, java.io.InputStream x, int length) throws SQLException { updateAsciiStream(findColumn(columnLabel), x, length); } /** * * (JDBC4 clarification:) * Updates the designated column with a binary stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateBinaryStream(String columnLabel, java.io.InputStream x, int length) throws SQLException { updateBinaryStream(findColumn(columnLabel), x, length); } /** * * (JDBC4 clarification) * Updates the designated column with a character stream value, which will have * the specified number of (CHECKME: characters?) bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param reader the java.io.Reader object containing * the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateCharacterStream(String columnLabel, java.io.Reader reader, int length) throws SQLException { updateCharacterStream(findColumn(columnLabel), reader, length); } /** * * Updates the designated column with an Object value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. *

* (JDBC4 Clarification:) * If the second argument is an InputStream then the stream must contain * the number of bytes specified by scaleOrLength. If the second argument is a * Reader then the reader must contain the number of characters specified * by scaleOrLength. If these conditions are not true the driver will generate a * SQLException when the statement is executed. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @param scaleOrLength for an object of java.math.BigDecimal , * this is the number of digits after the decimal point. For * Java Object types InputStream and Reader, * this is the length * of the data in the stream or reader. For all other types, * this value will be ignored. * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateObject(String columnLabel, Object x, int scaleOrLength) throws SQLException { updateObject(findColumn(columnLabel), x, scaleOrLength); } /** * * Updates the designated column with an Object value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateObject(String columnLabel, Object x) throws SQLException { updateObject(findColumn(columnLabel), x); } /** * * Inserts the contents of the insert row into this * ResultSet object and into the database. * The cursor must be on the insert row when this method is called. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY, * this method is called on a closed result set, * if this method is called when the cursor is not on the insert row, * or if not all of non-nullable columns in * the insert row have been given a non-null value * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void insertRow() throws SQLException { performInsert(); } /** * * Updates the underlying database with the new contents of the * current row of this ResultSet object. * This method cannot be called when the cursor is on the insert row. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* * After updating any values in the current row, it is not possible to * move the cursor position without calling this method, or alternatively * calling cancelRowUpdates() to abandon the row update. *

* * * @exception SQLException if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY; * this method is called on a closed result set or * if this method is called when the cursor is on the insert row * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void updateRow() throws SQLException { performUpdate(); } /** * * Deletes the current row from this ResultSet object * and from the underlying database. This method cannot be called when * the cursor is on the insert row. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* * After a successful call to this method, the row is deleted. *

* * * @exception SQLException if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY; * this method is called on a closed result set * or if this method is called when the cursor is on the insert row * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void deleteRow() throws SQLException { performDelete(); } /** @todo - fredt - implement */ /** * * Refreshes the current row with its most recent value in * the database. This method cannot be called when * the cursor is on the insert row. * *

The refreshRow method provides a way for an * application to * explicitly tell the JDBC driver to refetch a row(s) from the * database. An application may want to call refreshRow when * caching or prefetching is being done by the JDBC driver to * fetch the latest value of a row from the database. The JDBC driver * may actually refresh multiple rows at once if the fetch size is * greater than one. * *

All values are refetched subject to the transaction isolation * level and cursor sensitivity. If refreshRow is called after * calling an updater method, but before calling * the method updateRow, then the * updates made to the row are lost. Calling the method * refreshRow frequently will likely slow performance. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @exception SQLException if a database access error * occurs; this method is called on a closed result set; * the result set type is TYPE_FORWARD_ONLY or if this * method is called when the cursor is on the insert row * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method or this method is not supported for the specified result * set type and result set concurrency. * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void refreshRow() throws SQLException { clearUpdates(); } /** * * Cancels the updates made to the current row in this * ResultSet object. * This method may be called after calling an * updater method(s) and before calling * the method updateRow to roll back * the updates made to a row. If no updates have been made or * updateRow has already been called, this method has no * effect. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @exception SQLException if a database access error * occurs; this method is called on a closed result set; * the result set concurrency is CONCUR_READ_ONLY * or if this method is called when the cursor is * on the insert row * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void cancelRowUpdates() throws SQLException { clearUpdates(); } /** * * Moves the cursor to the insert row. The current cursor position is * remembered while the cursor is positioned on the insert row. * * The insert row is a special row associated with an updatable * result set. It is essentially a buffer where a new row may * be constructed by calling the updater methods prior to * inserting the row into the result set. * * Only the updater, getter, * and insertRow methods may be * called when the cursor is on the insert row. All of the columns in * a result set must be given a value each time this method is * called before calling insertRow. * An updater method must be called before a * getter method can be called on a column value. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @exception SQLException if a database access error occurs; this * method is called on a closed result set * or the result set concurrency is CONCUR_READ_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void moveToInsertRow() throws SQLException { startInsert(); } /** * * Moves the cursor to the remembered cursor position, usually the * current row. This method has no effect if the cursor is not on * the insert row. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * @exception SQLException if a database access error occurs, this * method is called on a closed result set * or the result set concurrency is CONCUR_READ_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public void moveToCurrentRow() throws SQLException { endInsert(); } /** * * Retrieves the Statement object that produced this * ResultSet object. * If the result set was generated some other way, such as by a * DatabaseMetaData method, this method may return * null. * * * @return the Statment object that produced * this ResultSet object or null * if the result set was produced some other way * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Statement getStatement() throws SQLException { checkClosed(); return (Statement) statement; } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as an Object * in the Java programming language. * If the value is an SQL NULL, * the driver returns a Java null. * This method uses the given Map object * for the custom mapping of the * SQL structured or distinct type that is being retrieved. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature, but ignores the map.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param map a java.util.Map object that contains the mapping * from SQL type names to classes in the Java programming language * @return an Object in the Java programming language * representing the SQL value * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Object getObject(int columnIndex, Map map) throws SQLException { return getObject(columnIndex); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a Ref object * in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not support this feature; this method always * throws an SQLException stating that the operation is not * supported. *

* * * @param columnIndex the first column is 1, the second is 2, ... * @return a Ref object representing an SQL REF * value * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Ref getRef(int columnIndex) throws SQLException { throw Util.notSupported(); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a Blob object * in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports this feature for objects of type BLOB and BINARY. * The Blob returned for BINARY objects is a memory object. The Blob * return for BLOB objects is not held entirely in memory. Its contents are * fetched from the database when its getXXX() methods are called.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @return a Blob object representing the SQL * BLOB value in the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Blob getBlob(int columnIndex) throws SQLException { checkColumn(columnIndex); Type sourceType = resultMetaData.columnTypes[columnIndex - 1]; Object o = getColumnInType(columnIndex, sourceType); if (o == null) { return null; } if (o instanceof BlobDataID) { JDBCBlobClient blob = new JDBCBlobClient(session, (BlobDataID) o); if (isUpdatable) { if (resultMetaData.colIndexes[columnIndex - 1] > 0 && resultMetaData.columns[columnIndex - 1] .isWriteable()) { blob.setWritable(this, columnIndex - 1); } } return blob; } else if (o instanceof Blob) { return (Blob) o; } else if (o instanceof BinaryData) { byte[] b = getBytes(columnIndex); return new JDBCBlob(b); } throw Util.sqlException(ErrorCode.X_42561); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a Clob object * in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports this feature for objects of type CLOB and * the variations of CHAR. * The Clob returned for CHAR objects is a memory object. The Clob * return for CLOB objects is not held entirely in memory. Its contents are * fetched from the database when its getXXX() methods are called.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @return a Clob object representing the SQL * CLOB value in the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Clob getClob(int columnIndex) throws SQLException { checkColumn(columnIndex); Type sourceType = resultMetaData.columnTypes[columnIndex - 1]; Object o = getColumnInType(columnIndex, sourceType); if (o == null) { return null; } if (o instanceof ClobDataID) { JDBCClobClient clob = new JDBCClobClient(session, (ClobDataID) o); if (isUpdatable) { if (resultMetaData.colIndexes[columnIndex - 1] > 0 && resultMetaData.columns[columnIndex - 1] .isWriteable()) { clob.setWritable(this, columnIndex - 1); } } return clob; } else if (o instanceof Clob) { return (Clob) o; } else if (o instanceof String) { return new JDBCClob((String) o); } throw Util.sqlException(ErrorCode.X_42561); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as an Array object * in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * From version 2.0, HSQLDB supports array types. * *

* * * @param columnIndex the first column is 1, the second is 2, ... * @return an Array object representing the SQL * ARRAY value in the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Array getArray(int columnIndex) throws SQLException { checkColumn(columnIndex); Type type = resultMetaData.columnTypes[columnIndex - 1]; Object[] data = (Object[]) getCurrent()[columnIndex - 1]; if (!type.isArrayType()) { throw Util.sqlException(ErrorCode.X_42561); } if (trackNull(data)) { return null; } return new JDBCArray(data, type.collectionBaseType(), type, connection); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as an Object * in the Java programming language. * If the value is an SQL NULL, * the driver returns a Java null. * This method uses the specified Map object for * custom mapping if appropriate. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature. But the Map parameter is ignored.

* *

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param map a java.util.Map object that contains the mapping * from SQL type names to classes in the Java programming language * @return an Object representing the SQL value in the * specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Object getObject(String columnLabel, Map map) throws SQLException { return getObject(findColumn(columnLabel), map); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a Ref object * in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * Including 2.0, HSQLDB does not support reference types; this method * always throws an SQLException stating that the operation * is not supported. *

* * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a Ref object representing the SQL REF * value in the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Ref getRef(String columnLabel) throws SQLException { return getRef(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a Blob object * in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports this feature for objects of type BLOB and BINARY. * The Blob returned for BINARY objects is a memory object. The Blob * return for BLOB objects is not held entirely in memory. Its contents are * fetched from the database when its getXXX() methods are called.

* *

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a Blob object representing the SQL BLOB * value in the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Blob getBlob(String columnLabel) throws SQLException { return getBlob(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a Clob object * in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports this feature for objects of type CLOB and * the variations of CHAR. * The Clob returned for CHAR objects is a memory object. The Clob * return for CLOB objects is not held entirely in memory. Its contents are * fetched from the database when its getXXX() methods are called.

*

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return a Clob object representing the SQL CLOB * value in the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Clob getClob(String columnLabel) throws SQLException { return getClob(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as an Array object * in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * From version 2.0, HSQLDB supports array types. *

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @return an Array object representing the SQL ARRAY value in * the specified column * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Array getArray(String columnLabel) throws SQLException { return getArray(findColumn(columnLabel)); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a java.sql.Date object * in the Java programming language. * This method uses the given calendar to construct an appropriate millisecond * value for the date if the underlying database does not store * timezone information. * * * @param columnIndex the first column is 1, the second is 2, ... * @param cal the java.util.Calendar object * to use in constructing the date * @return the column value as a java.sql.Date object; * if the value is SQL NULL, * the value returned is null in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Date getDate(int columnIndex, Calendar cal) throws SQLException { TimestampData t = (TimestampData) getColumnInType(columnIndex, Type.SQL_DATE); if (t == null) { return null; } long millis = t.getSeconds() * 1000; if (cal != null) { millis = HsqlDateTime.convertMillisToCalendar(cal, millis); } return new Date(millis); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a java.sql.Date object * in the Java programming language. * This method uses the given calendar to construct an appropriate millisecond * value for the date if the underlying database does not store * timezone information. * * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param cal the java.util.Calendar object * to use in constructing the date * @return the column value as a java.sql.Date object; * if the value is SQL NULL, * the value returned is null in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Date getDate(String columnLabel, Calendar cal) throws SQLException { return getDate(findColumn(columnLabel), cal); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a java.sql.Time * object in the Java programming language. * This method uses the given calendar to construct an appropriate millisecond * value for the time if the underlying database does not store * timezone information. * *

HSQLDB-Specific Information:

* * The JDBC specification for this method is vague. HSQLDB interprets the * specification as follows: * *

    *
  1. If the SQL type of the column is WITH TIME ZONE, then the UTC value * of the returned java.sql.Time object is the UTC of the SQL value without * modification. In other words, the Calendar object is not used.
  2. *
  3. If the SQL type of the column is WITHOUT TIME ZONE, then the UTC * value of the returned java.sql.Time is correct for the given Calendar * object.
  4. *
  5. If the cal argument is null, it it ignored and the method returns * the same Object as the method without the Calendar parameter.
  6. *
* * * @param columnIndex the first column is 1, the second is 2, ... * @param cal the java.util.Calendar object * to use in constructing the time * @return the column value as a java.sql.Time object; * if the value is SQL NULL, * the value returned is null in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Time getTime(int columnIndex, Calendar cal) throws SQLException { TimeData t = (TimeData) getColumnInType(columnIndex, Type.SQL_TIME); if (t == null) { return null; } long millis = DateTimeType.normaliseTime(t.getSeconds()) * 1000; if (!resultMetaData.columnTypes[--columnIndex] .isDateTimeTypeWithZone()) { Calendar calendar = cal == null ? session.getCalendar() : cal; millis = HsqlDateTime.convertMillisToCalendar(calendar, millis); millis = HsqlDateTime.getNormalisedTime(millis); } return new Time(millis); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a java.sql.Time object * in the Java programming language. * This method uses the given calendar to construct an appropriate millisecond * value for the time if the underlying database does not store * timezone information. * *

HSQLDB-Specific Information:

* * The JDBC specification for this method is vague. HSQLDB interprets the * specification as follows: * *

    *
  1. If the SQL type of the column is WITH TIME ZONE, then the UTC value * of the returned java.sql.Time object is the UTC of the SQL value without * modification. In other words, the Calendar object is not used.
  2. *
  3. If the SQL type of the column is WITHOUT TIME ZONE, then the UTC * value of the returned java.sql.Time is correct for the given Calendar * object.
  4. *
  5. If the cal argument is null, it it ignored and the method returns * the same Object as the method without the Calendar parameter.
  6. *
* * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param cal the java.util.Calendar object * to use in constructing the time * @return the column value as a java.sql.Time object; * if the value is SQL NULL, * the value returned is null in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Time getTime(String columnLabel, Calendar cal) throws SQLException { return getTime(findColumn(columnLabel), cal); } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a java.sql.Timestamp object * in the Java programming language. * This method uses the given calendar to construct an appropriate millisecond * value for the timestamp if the underlying database does not store * timezone information. * *

HSQLDB-Specific Information:

* * The JDBC specification for this method is vague. HSQLDB interprets the * specification as follows: * *

    *
  1. If the SQL type of the column is WITH TIME ZONE, then the UTC value * of the returned java.sql.Timestamp object is the UTC of the SQL value * without modification. In other words, the Calendar object is not used. *
  2. *
  3. If the SQL type of the column is WITHOUT TIME ZONE, then the * UTC value of the returned java.sql.Timestamp will represent the correct * timestamp for the time zone (including daylight saving time) of the given * Calendar object.
  4. *
  5. In this case, if the cal argument is null, then the default Calendar * of the JVM is used, which results in the same Object as one returned by the * getTimestamp() methods without the Calendar parameter.
  6. *
* * * @param columnIndex the first column is 1, the second is 2, ... * @param cal the java.util.Calendar object * to use in constructing the timestamp * @return the column value as a java.sql.Timestamp object; * if the value is SQL NULL, * the value returned is null in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { TimestampData t = (TimestampData) getColumnInType(columnIndex, Type.SQL_TIMESTAMP); if (t == null) { return null; } long millis = t.getSeconds() * 1000; if (!resultMetaData.columnTypes[--columnIndex] .isDateTimeTypeWithZone()) { Calendar calendar = cal == null ? session.getCalendar() : cal; if (cal != null) { millis = HsqlDateTime.convertMillisToCalendar(calendar, millis); } } Timestamp ts = new Timestamp(millis); ts.setNanos(t.getNanos()); return ts; } /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a java.sql.Timestamp object * in the Java programming language. * This method uses the given calendar to construct an appropriate millisecond * value for the timestamp if the underlying database does not store * timezone information. * *

HSQLDB-Specific Information:

* * The JDBC specification for this method is vague. HSQLDB interprets the * specification as follows: * *

    *
  1. If the SQL type of the column is WITH TIME ZONE, then the UTC value * of the returned java.sql.Timestamp object is the UTC of the SQL value * without modification. In other words, the Calendar object is not used. *
  2. *
  3. If the SQL type of the column is WITHOUT TIME ZONE, then the UTC * value of the returned java.sql.Timestamp is correct for the given * Calendar object.
  4. *
  5. If the cal argument is null, it it ignored and the method returns * the same Object as the method without the Calendar parameter.
  6. *
* * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param cal the java.util.Calendar object * to use in constructing the date * @return the column value as a java.sql.Timestamp object; * if the value is SQL NULL, * the value returned is null in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public Timestamp getTimestamp(String columnLabel, Calendar cal) throws SQLException { return getTimestamp(findColumn(columnLabel), cal); } //-------------------------- JDBC 3.0 ---------------------------------------- /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a java.net.URL * object in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not support the datalink type; this method * always throws an SQLException stating that the operation is * not supported. *

* * * @param columnIndex the index of the column 1 is the first, 2 is the second,... * @return the column value as a java.net.URL object; * if the value is SQL NULL, * the value returned is null in the Java programming language * @exception SQLException if a database access error occurs; this method * is called on a closed result set or if a URL is malformed * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public java.net.URL getURL(int columnIndex) throws SQLException { throw Util.notSupported(); } //#endif JAVA4 /** * * Retrieves the value of the designated column in the current row * of this ResultSet object as a java.net.URL * object in the Java programming language. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not support the datalink type; this method * always throws an SQLException stating that the operation is * not supported. *

* * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @return the column value as a java.net.URL object; * if the value is SQL NULL, * the value returned is null in the Java programming language * @exception SQLException if a database access error occur; this method * is called on a closed result set or if a URL is malformed * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public java.net.URL getURL(String columnLabel) throws SQLException { throw Util.notSupported(); } //#endif JAVA4 /** * * Updates the designated column with a java.sql.Ref value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not support reference types; this method * always throws an SQLException stating that the operation is * not supported. *

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateRef(int columnIndex, java.sql.Ref x) throws SQLException { throw Util.notSupported(); } //#endif JAVA4 /** * * Updates the designated column with a java.sql.Ref value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not support reference types; this method * always throws an SQLException stating that the operation is * not supported. *

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateRef(String columnLabel, java.sql.Ref x) throws SQLException { throw Util.notSupported(); } //#endif JAVA4 /** * * Updates the designated column with a java.sql.Blob value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports this feature for columns of type BLOB. *

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateBlob(int columnIndex, java.sql.Blob x) throws SQLException { startUpdate(columnIndex); preparedStatement.setBlobParameter(columnIndex, x); } //#endif JAVA4 /** * * Updates the designated column with a java.sql.Blob value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports this feature for columns of type BLOB. *

* * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateBlob(String columnLabel, java.sql.Blob x) throws SQLException { int columnIndex = findColumn(columnLabel); updateBlob(columnIndex, x); } //#endif JAVA4 /** * * Updates the designated column with a java.sql.Clob value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports this feature for columns of type CLOB.

*

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateClob(int columnIndex, java.sql.Clob x) throws SQLException { startUpdate(columnIndex); preparedStatement.setClobParameter(columnIndex, x); } //#endif JAVA4 /** * * Updates the designated column with a java.sql.Clob value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports this feature for columns of type CLOB.

*

* * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateClob(String columnLabel, java.sql.Clob x) throws SQLException { int columnIndex = findColumn(columnLabel); updateClob(columnIndex, x); } //#endif JAVA4 /** * * Updates the designated column with a java.sql.Array value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not support array types; this method always * throws an SQLException stating that the operation is not * supported. *

* * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateArray(int columnIndex, java.sql.Array x) throws SQLException { startUpdate(columnIndex); preparedStatement.setParameter(columnIndex, x); } //#endif JAVA4 /** * * Updates the designated column with a java.sql.Array value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not support array types; this method always * throws an SQLException stating that the operation is not * supported. *

* * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param x the new column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void updateArray(String columnLabel, java.sql.Array x) throws SQLException { int columnIndex = findColumn(columnLabel); updateArray(columnIndex, x); } //#endif JAVA4 //------------------------- JDBC 4.0 ----------------------------------- /** * Retrieves the value of the designated column in the current row of this * ResultSet object as a java.sql.RowId object in the Java * programming language. * * @param columnIndex the first column is 1, the second 2, ... * @return the column value; if the value is a SQL NULL the * value returned is null * @throws SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public RowId getRowId(int columnIndex) throws SQLException { throw Util.notSupported(); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row of this * ResultSet object as a java.sql.RowId object in the Java * programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not support the RowId type; this method always * throws an SQLException stating that the operation is not * supported. *

* * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @return the column value ; if the value is a SQL NULL the * value returned is null * @throws SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public RowId getRowId(String columnLabel) throws SQLException { throw Util.notSupported(); } //#endif JAVA6 /** * Updates the designated column with a RowId value. The updater * methods are used to update column values in the current row or the insert * row. The updater methods do not update the underlying database; instead * the updateRow or insertRow methods are called * to update the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not support the RowId type; this method always * throws an SQLException stating that the operation is not * supported. *

* * * @param columnIndex the first column is 1, the second 2, ... * @param x the column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateRowId(int columnIndex, RowId x) throws SQLException { throw Util.notSupported(); } //#endif JAVA6 /** * Updates the designated column with a RowId value. The updater * methods are used to update column values in the current row or the insert * row. The updater methods do not update the underlying database; instead * the updateRow or insertRow methods are called * to update the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not support the RowId type; this method always * throws an SQLException stating that the operation is not * supported. *

* * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param x the column value * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateRowId(String columnLabel, RowId x) throws SQLException { throw Util.notSupported(); } //#endif JAVA6 /** * Retrieves the holdability of this ResultSet object * @return either ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT * @throws SQLException if a database access error occurs * or this method is called on a closed result set * @since JDK 1.6, HSQLDB 2.0 */ public int getHoldability() throws SQLException { checkClosed(); return ResultProperties.getJDBCHoldability(rsProperties); } /** * Retrieves whether this ResultSet object has been closed. * A ResultSet is closed if the * method close has been called on it, or if it is automatically closed. * * @return true if this ResultSet object is closed; false if it is still open * @throws SQLException if a database access error occurs * @since JDK 1.6, HSQLDB 2.0 */ public boolean isClosed() throws SQLException { return navigator == null; } /** * Updates the designated column with a String value. * It is intended for use when updating NCHAR,NVARCHAR * and LONGNVARCHAR columns. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnIndex the first column is 1, the second 2, ... * @param nString the value for the column to be updated * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set, * the result set concurrency is CONCUR_READ_ONLY * or if a database access error occurs * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateNString(int columnIndex, String nString) throws SQLException { updateString(columnIndex, nString); } //#endif JAVA6 /** * Updates the designated column with a String value. * It is intended for use when updating NCHAR,NVARCHAR * and LONGNVARCHAR columns. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param nString the value for the column to be updated * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set; * the result set concurrency is CONCUR_READ_ONLY * or if a database access error occurs * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateNString(String columnLabel, String nString) throws SQLException { updateString(columnLabel, nString); } //#endif JAVA6 /** * Updates the designated column with a java.sql.NClob value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnIndex the first column is 1, the second 2, ... * @param nClob the value for the column to be updated * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set, * if a database access error occurs or * the result set concurrency is CONCUR_READ_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateNClob(int columnIndex, NClob nClob) throws SQLException { updateClob(columnIndex, nClob); } //#endif JAVA6 /** * Updates the designated column with a java.sql.NClob value. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param nClob the value for the column to be updated * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set; * if a database access error occurs or * the result set concurrency is CONCUR_READ_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateNClob(String columnLabel, NClob nClob) throws SQLException { updateClob(columnLabel, nClob); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row * of this ResultSet object as a NClob object * in the Java programming language. * * @param columnIndex the first column is 1, the second is 2, ... * @return a NClob object representing the SQL * NCLOB value in the specified column * @exception SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set * or if a database access error occurs * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public NClob getNClob(int columnIndex) throws SQLException { String s = getString(columnIndex); return s == null ? null : new JDBCNClob(s); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row * of this ResultSet object as a NClob object * in the Java programming language. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @return a NClob object representing the SQL NCLOB * value in the specified column * @exception SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set * or if a database access error occurs * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public NClob getNClob(String columnLabel) throws SQLException { return getNClob(findColumn(columnLabel)); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row of * this ResultSet as a * java.sql.SQLXML object in the Java programming language. * * @param columnIndex the first column is 1, the second is 2, ... * @return a SQLXML object that maps an SQL XML value * @throws SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public SQLXML getSQLXML(int columnIndex) throws SQLException { checkColumn(columnIndex); SQLXML sqlxml; int type = resultMetaData.columnTypes[columnIndex - 1].typeCode; switch (type) { case Types.SQL_XML : { Object object = getObject(columnIndex); if (object == null) { sqlxml = null; } else if (object instanceof SQLXML) { sqlxml = (SQLXML) object; } else { throw Util.notSupported(); } break; } case Types.SQL_CLOB : { Clob clob = getClob(columnIndex); if (clob == null) { sqlxml = null; } else { sqlxml = new JDBCSQLXML(clob.getCharacterStream()); } break; } case Types.SQL_CHAR : case Types.SQL_VARCHAR : case Types.VARCHAR_IGNORECASE : { java.io.Reader reader = getCharacterStream(columnIndex); if (reader == null) { sqlxml = null; } else { sqlxml = new JDBCSQLXML(reader); } break; } case Types.SQL_NCHAR : case Types.SQL_NVARCHAR : { java.io.Reader nreader = getNCharacterStream(columnIndex); if (nreader == null) { sqlxml = null; } else { sqlxml = new JDBCSQLXML(nreader); } break; } case Types.SQL_BLOB : { Blob blob = getBlob(columnIndex); if (blob == null) { sqlxml = null; } else { sqlxml = new JDBCSQLXML(blob.getBinaryStream()); } break; } case Types.SQL_BINARY : case Types.SQL_VARBINARY : { java.io.InputStream inputStream = getBinaryStream(columnIndex); if (inputStream == null) { sqlxml = null; } else { sqlxml = new JDBCSQLXML(inputStream); } break; } case Types.OTHER : case Types.JAVA_OBJECT : { Object data = getObject(columnIndex); if (data == null) { sqlxml = null; } else if (data instanceof SQLXML) { sqlxml = (SQLXML) data; } else if (data instanceof String) { sqlxml = new JDBCSQLXML((String) data); } else if (data instanceof byte[]) { sqlxml = new JDBCSQLXML((byte[]) data); } else if (data instanceof Blob) { Blob blob = (Blob) data; sqlxml = new JDBCSQLXML(blob.getBinaryStream()); } else if (data instanceof Clob) { Clob clob = (Clob) data; sqlxml = new JDBCSQLXML(clob.getCharacterStream()); } else { throw Util.notSupported(); } break; } default : { throw Util.notSupported(); } } return sqlxml; } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row of * this ResultSet as a * java.sql.SQLXML object in the Java programming language. * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @return a SQLXML object that maps an SQL XML value * @throws SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public SQLXML getSQLXML(String columnLabel) throws SQLException { return getSQLXML(findColumn(columnLabel)); } //#endif JAVA6 /** * Updates the designated column with a java.sql.SQLXML value. * The updater * methods are used to update column values in the current row or the insert * row. The updater methods do not update the underlying database; instead * the updateRow or insertRow methods are called * to update the database. *

* * @param columnIndex the first column is 1, the second 2, ... * @param xmlObject the value for the column to be updated * @throws SQLException if a database access error occurs, this method * is called on a closed result set, * the java.xml.transform.Result, * Writer or OutputStream has not been closed * for the SQLXML object, * if there is an error processing the XML value or * the result set concurrency is CONCUR_READ_ONLY. The getCause method * of the exception may provide a more detailed exception, for example, if the * stream does not contain valid XML. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateSQLXML(int columnIndex, SQLXML xmlObject) throws SQLException { startUpdate(columnIndex); preparedStatement.setSQLXML(columnIndex, xmlObject); } //#endif JAVA6 /** * Updates the designated column with a java.sql.SQLXML value. * The updater * methods are used to update column values in the current row or the insert * row. The updater methods do not update the underlying database; instead * the updateRow or insertRow methods are called * to update the database. *

* * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param xmlObject the column value * @throws SQLException if a database access error occurs, this method * is called on a closed result set, * the java.xml.transform.Result, * Writer or OutputStream has not been closed * for the SQLXML object, * if there is an error processing the XML value or * the result set concurrency is CONCUR_READ_ONLY. The getCause method * of the exception may provide a more detailed exception, for example, if the * stream does not contain valid XML. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateSQLXML(String columnLabel, SQLXML xmlObject) throws SQLException { updateSQLXML(findColumn(columnLabel), xmlObject); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row * of this ResultSet object as * a String in the Java programming language. * It is intended for use when * accessing NCHAR,NVARCHAR * and LONGNVARCHAR columns. * * @param columnIndex the first column is 1, the second is 2, ... * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public String getNString(int columnIndex) throws SQLException { return getString(columnIndex); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row * of this ResultSet object as * a String in the Java programming language. * It is intended for use when * accessing NCHAR,NVARCHAR * and LONGNVARCHAR columns. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @return the column value; if the value is SQL NULL, the * value returned is null * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public String getNString(String columnLabel) throws SQLException { return getString(findColumn(columnLabel)); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row * of this ResultSet object as a * java.io.Reader object. * It is intended for use when * accessing NCHAR,NVARCHAR * and LONGNVARCHAR columns. * * @return a java.io.Reader object that contains the column * value; if the value is SQL NULL, the value returned is * null in the Java programming language. * @param columnIndex the first column is 1, the second is 2, ... * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public java.io.Reader getNCharacterStream( int columnIndex) throws SQLException { return getCharacterStream(columnIndex); } //#endif JAVA6 /** * Retrieves the value of the designated column in the current row * of this ResultSet object as a * java.io.Reader object. * It is intended for use when * accessing NCHAR,NVARCHAR * and LONGNVARCHAR columns. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @return a java.io.Reader object that contains the column * value; if the value is SQL NULL, the value returned is * null in the Java programming language * @exception SQLException if a database access error occurs * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public java.io.Reader getNCharacterStream( String columnLabel) throws SQLException { return getCharacterStream(findColumn(columnLabel)); } //#endif JAVA6 /** * Updates the designated column with a character stream value, which will have * the specified number of bytes. The * driver does the necessary conversion from Java character format to * the national character set in the database. * It is intended for use when * updating NCHAR,NVARCHAR * and LONGNVARCHAR columns. * * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 * @revised JDK 1.6 b87 - length parameter changed from int to long */ //#ifdef JAVA6 public void updateNCharacterStream(int columnIndex, java.io.Reader x, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, x, length); } //#endif JAVA6 /** * Updates the designated column with a character stream value, which will have * the specified number of bytes. The * driver does the necessary conversion from Java character format to * the national character set in the database. * It is intended for use when * updating NCHAR,NVARCHAR * and LONGNVARCHAR columns. * * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param reader the java.io.Reader object containing * the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 * @revised JDK 1.6 b87 - length parameter changed from int to long */ //#ifdef JAVA6 public void updateNCharacterStream(String columnLabel, java.io.Reader reader, long length) throws SQLException { updateCharacterStream(columnLabel, reader, length); } //#endif JAVA6 // --------------------------- Added: Mustang Build 86 ------------------------- /** * Updates the designated column with an ascii stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateAsciiStream(int columnIndex, java.io.InputStream x, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setAsciiStream(columnIndex, x, length); } //#endif JAVA6 /** * Updates the designated column with a binary stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateBinaryStream(int columnIndex, java.io.InputStream x, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setBinaryStream(columnIndex, x, length); } //#endif JAVA6 /** * Updates the designated column with a character stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateCharacterStream(int columnIndex, java.io.Reader x, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, x, length); } //#endif JAVA6 /** * Updates the designated column with an ascii stream value, which will have * the specified number of bytes.. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateAsciiStream(String columnLabel, java.io.InputStream x, long length) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setAsciiStream(columnIndex, x, length); } //#endif JAVA6 /** * Updates the designated column with a binary stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param x the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateBinaryStream(String columnLabel, java.io.InputStream x, long length) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setBinaryStream(columnIndex, x, length); } //#endif JAVA6 /** * Updates the designated column with a character stream value, which will have * the specified number of bytes. * The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param reader the java.io.Reader object containing * the new column value * @param length the length of the stream * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateCharacterStream(String columnLabel, java.io.Reader reader, long length) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, reader, length); } //#endif JAVA6 /** * Updates the designated column using the given input stream, which * will have the specified number of bytes. * When a very large ASCII value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.InputStream. Data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from ASCII to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnIndex the first column is 1, the second is 2, ... * @param inputStream An object that contains the data to set the parameter * value to. * @param length the number of bytes in the parameter data. * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setBlob(columnIndex, inputStream, length); } //#endif JAVA6 /** * Updates the designated column using the given input stream, which * will have the specified number of bytes. * When a very large ASCII value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.InputStream. Data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from ASCII to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param inputStream An object that contains the data to set the parameter * value to. * @param length the number of bytes in the parameter data. * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setBlob(columnIndex, inputStream, length); } //#endif JAVA6 /** * Updates the designated column using the given Reader * object, which is the given number of characters long. * When a very large UNICODE value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.Reader object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnIndex the first column is 1, the second is 2, ... * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateClob(int columnIndex, Reader reader, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader, length); } //#endif JAVA6 /** * Updates the designated column using the given Reader * object, which is the given number of characters long. * When a very large UNICODE value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.Reader object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @exception SQLException if a database access error occurs, * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateClob(String columnLabel, Reader reader, long length) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader, length); } //#endif JAVA6 /** * Updates the designated column using the given Reader * object, which is the given number of characters long. * When a very large UNICODE value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.Reader object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnIndex the first column is 1, the second 2, ... * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set, * if a database access error occurs or * the result set concurrency is CONCUR_READ_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException { startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader, length); } //#endif JAVA6 /** * Updates the designated column using the given Reader * object, which is the given number of characters long. * When a very large UNICODE value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.Reader object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * * @param columnLabel the label for the column specified with the SQL AS * clause. If the SQL AS clause was not specified, then the label is the * name of the column * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set; * if a database access error occurs or * the result set concurrency is CONCUR_READ_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader, length); } //#endif JAVA6 /** * Updates the designated column with a character stream value. * The data will be read from the stream * as needed until end-of-stream is reached. The * driver does the necessary conversion from Java character format to * the national character set in the database. * It is intended for use when * updating NCHAR,NVARCHAR * and LONGNVARCHAR columns. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateNCharacterStream which takes a length parameter. * * @param columnIndex the first column is 1, the second is 2, ... * @param reader the new column value * @exception SQLException if the columnIndex is not valid; * if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateNCharacterStream( int columnIndex, java.io.Reader reader) throws SQLException { startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, reader); } /** * Updates the designated column with a character stream value. * The data will be read from the stream * as needed until end-of-stream is reached. The * driver does the necessary conversion from Java character format to * the national character set in the database. * It is intended for use when * updating NCHAR,NVARCHAR * and LONGNVARCHAR columns. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateNCharacterStream which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param reader the java.io.Reader object containing * the new column value * @exception SQLException if the columnLabel is not valid; * if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateNCharacterStream( String columnLabel, java.io.Reader reader) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, reader); } /** * Updates the designated column with an ascii stream value. * The data will be read from the stream * as needed until end-of-stream is reached. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateAsciiStream which takes a length parameter. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if the columnIndex is not valid; * if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateAsciiStream(int columnIndex, java.io.InputStream x) throws SQLException { startUpdate(columnIndex); preparedStatement.setAsciiStream(columnIndex, x); } /** * Updates the designated column with a binary stream value. * The data will be read from the stream * as needed until end-of-stream is reached. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateBinaryStream which takes a length parameter. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if the columnIndex is not valid; * if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateBinaryStream(int columnIndex, java.io.InputStream x) throws SQLException { startUpdate(columnIndex); preparedStatement.setBinaryStream(columnIndex, x); } /** * Updates the designated column with a character stream value. * The data will be read from the stream * as needed until end-of-stream is reached. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateCharacterStream which takes a length parameter. * * @param columnIndex the first column is 1, the second is 2, ... * @param x the new column value * @exception SQLException if the columnIndex is not valid; * if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateCharacterStream(int columnIndex, java.io.Reader x) throws SQLException { startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, x); } /** * Updates the designated column with an ascii stream value. * The data will be read from the stream * as needed until end-of-stream is reached. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateAsciiStream which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if the columnLabel is not valid; * if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateAsciiStream(String columnLabel, java.io.InputStream x) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setAsciiStream(columnIndex, x); } /** * Updates the designated column with a binary stream value. * The data will be read from the stream * as needed until end-of-stream is reached. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateBinaryStream which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param x the new column value * @exception SQLException if the columnLabel is not valid; * if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateBinaryStream(String columnLabel, java.io.InputStream x) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setBinaryStream(columnIndex, x); } /** * Updates the designated column with a character stream value. * The data will be read from the stream * as needed until end-of-stream is reached. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateCharacterStream which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param reader the java.io.Reader object containing * the new column value * @exception SQLException if the columnLabel is not valid; if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateCharacterStream( String columnLabel, java.io.Reader reader) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setCharacterStream(columnIndex, reader); } /** * Updates the designated column using the given input stream. The data will be read from the stream * as needed until end-of-stream is reached. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateBlob which takes a length parameter. * * @param columnIndex the first column is 1, the second is 2, ... * @param inputStream An object that contains the data to set the parameter * value to. * @exception SQLException if the columnIndex is not valid; if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException { startUpdate(columnIndex); preparedStatement.setBlob(columnIndex, inputStream); } /** * Updates the designated column using the given input stream. The data will be read from the stream * as needed until end-of-stream is reached. *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateBlob which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param inputStream An object that contains the data to set the parameter * value to. * @exception SQLException if the columnLabel is not valid; if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setBlob(columnIndex, inputStream); } /** * Updates the designated column using the given Reader * object. * The data will be read from the stream * as needed until end-of-stream is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateClob which takes a length parameter. * * @param columnIndex the first column is 1, the second is 2, ... * @param reader An object that contains the data to set the parameter value to. * @exception SQLException if the columnIndex is not valid; * if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateClob(int columnIndex, Reader reader) throws SQLException { startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader); } /** * Updates the designated column using the given Reader * object. * The data will be read from the stream * as needed until end-of-stream is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateClob which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param reader An object that contains the data to set the parameter value to. * @exception SQLException if the columnLabel is not valid; if a database access error occurs; * the result set concurrency is CONCUR_READ_ONLY * or this method is called on a closed result set * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateClob(String columnLabel, Reader reader) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader); } /** * Updates the designated column using the given Reader * * The data will be read from the stream * as needed until end-of-stream is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateNClob which takes a length parameter. * * @param columnIndex the first column is 1, the second 2, ... * @param reader An object that contains the data to set the parameter value to. * @throws SQLException if the columnIndex is not valid; * if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set, * if a database access error occurs or * the result set concurrency is CONCUR_READ_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateNClob(int columnIndex, Reader reader) throws SQLException { startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader); } /** * Updates the designated column using the given Reader * object. * The data will be read from the stream * as needed until end-of-stream is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

* The updater methods are used to update column values in the * current row or the insert row. The updater methods do not * update the underlying database; instead the updateRow or * insertRow methods are called to update the database. * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * updateNClob which takes a length parameter. * * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column * @param reader An object that contains the data to set the parameter value to. * @throws SQLException if the columnLabel is not valid; if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; this method is called on a closed result set; * if a database access error occurs or * the result set concurrency is CONCUR_READ_ONLY * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public void updateNClob(String columnLabel, Reader reader) throws SQLException { int columnIndex = findColumn(columnLabel); startUpdate(columnIndex); preparedStatement.setClob(columnIndex, reader); } // --------------------- java.sql.Wrapper implementation ------------------- /** * Returns an object that implements the given interface to allow access to * non-standard methods, or standard methods not exposed by the proxy. * * If the receiver implements the interface then the result is the receiver * or a proxy for the receiver. If the receiver is a wrapper * and the wrapped object implements the interface then the result is the * wrapped object or a proxy for the wrapped object. Otherwise return the * the result of calling unwrap recursively on the wrapped object * or a proxy for that result. If the receiver is not a * wrapper and does not implement the interface, then an SQLException is thrown. * * @param iface A Class defining an interface that the result must implement. * @return an object that implements the interface. May be a proxy for the actual implementing object. * @throws java.sql.SQLException If no object found that implements the interface * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 @SuppressWarnings("unchecked") public T unwrap(java.lang.Class iface) throws java.sql.SQLException { if (isWrapperFor(iface)) { return (T) this; } throw Util.invalidArgument("iface: " + iface); } //#endif JAVA6 /** * Returns true if this either implements the interface argument or is directly or indirectly a wrapper * for an object that does. Returns false otherwise. If this implements the interface then return true, * else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped * object. If this does not implement the interface and is not a wrapper, return false. * This method should be implemented as a low-cost operation compared to unwrap so that * callers can use this method to avoid expensive unwrap calls that may fail. If this method * returns true then calling unwrap with the same argument should succeed. * * @param iface a Class defining an interface. * @return true if this implements the interface or directly or indirectly wraps an object that does. * @throws java.sql.SQLException if an error occurs while determining whether this is a wrapper * for an object with the given interface. * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public boolean isWrapperFor( java.lang.Class iface) throws java.sql.SQLException { return (iface != null && iface.isAssignableFrom(this.getClass())); } //#endif JAVA6 //------------------------- JDBC 4.1 ----------------------------------- /** *

Retrieves the value of the designated column in the current row * of this ResultSet object and will convert from the * SQL type of the column to the requested Java data type, if the * conversion is supported. If the conversion is not * supported or null is specified for the type, a * SQLException is thrown. *

* At a minimum, an implementation must support the conversions defined in * Appendix B, Table B-3 and conversion of appropriate user defined SQL * types to a Java type which implements {@code SQLData}, or {@code Struct}. * Additional conversions may be supported and are vendor defined. * * @param columnIndex the first column is 1, the second is 2, ... * @param type Class representing the Java data type to convert the designated * column to. * @return an instance of {@code type} holding the column value * @throws SQLException if conversion is not supported, type is null or * another error occurs. The getCause() method of the * exception may provide a more detailed exception, for example, if * a conversion error occurs * @throws SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ //#ifdef JAVA5 public T getObject(int columnIndex, Class type) throws SQLException { return (T) getObject(columnIndex); } //#endif /** *

Retrieves the value of the designated column in the current row * of this ResultSet object and will convert from the * SQL type of the column to the requested Java data type, if the * conversion is supported. If the conversion is not * supported or null is specified for the type, a * SQLException is thrown. *

* At a minimum, an implementation must support the conversions defined in * Appendix B, Table B-3 and conversion of appropriate user defined SQL * types to a Java type which implements {@code SQLData}, or {@code Struct}. * Additional conversions may be supported and are vendor defined. * * @param columnLabel the label for the column specified with the SQL AS clause. * If the SQL AS clause was not specified, then the label is the name * of the column * @param type Class representing the Java data type to convert the designated * column to. * @return an instance of {@code type} holding the column value * @throws SQLException if conversion is not supported, type is null or * another error occurs. The getCause() method of the * exception may provide a more detailed exception, for example, if * a conversion error occurs * @throws SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ //#ifdef JAVA5 public T getObject(String columnLabel, Class type) throws SQLException { return getObject(findColumn(columnLabel), type); } //#endif //------------------------ Internal Implementation ----------------------------- /** The internal representation. */ private RowSetNavigator navigator; /** The internal representation. */ protected ResultMetaData resultMetaData; /** * Translation of INTERVAL types */ private boolean translateTTIType; /** How many columns does this ResultSet have? */ private int columnCount; /** Did the last getXXX method encounter a null value? */ private boolean wasNullValue; /** The ResultSetMetaData object for this ResultSet */ private ResultSetMetaData resultSetMetaData; /** Accelerates findColumn; Map */ private IntValueHashMap columnMap; /** The first warning in the chain. Null if there are no warnings. */ private SQLWarning rootWarning; //-------------------------- Package Attributes ---------------------------- /** * The Statement that generated this result. Null if the result is * from DatabaseMetaData

*/ JDBCStatementBase statement; /** * Session or ClientConnection */ SessionInterface session; /** JDBCConnection for this. */ JDBCConnection connection; /** * The scrollability / scroll sensitivity type of this result. */ boolean isScrollable; /** The concurrency of this result. */ boolean isReadOnly; /** The updatability of this result. */ boolean isUpdatable; /** The insertability of this result. */ boolean isInsertable; int rsProperties; int fetchSize; /** Statement is closed when its result set is closed */ boolean autoClose; /** The underlying result. */ public Result result; // ---------------------- Public Attributes -------------------------------- // Support for JDBC 2 from JRE 1.1.x /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int FETCH_FORWARD = 1000; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int FETCH_REVERSE = 1001; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int FETCH_UNKNOWN = 1002; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int TYPE_FORWARD_ONLY = 1003; /** * Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

* * (JDBC4 clarification:) scrollable but generally not sensitive * to changes to the data that underlies the ResultSet. */ public static final int TYPE_SCROLL_INSENSITIVE = 1004; /** * Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

* * (JDBC4 clarification:) scrollable and generally sensitive * to changes to the data that underlies the ResultSet. */ public static final int TYPE_SCROLL_SENSITIVE = 1005; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int CONCUR_READ_ONLY = 1007; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int CONCUR_UPDATABLE = 1008; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int HOLD_CURSORS_OVER_COMMIT = 1; /** Copy of java.sql.ResultSet constant, for JDK 1.1 clients. */ public static final int CLOSE_CURSORS_AT_COMMIT = 2; //-------------------------- Private Methods ------------------------------- /** * Fetches the current row of the result set. * * @throws SQLException when result set is closed; result set is empty; * result set is before first; result set is alfter last; no row data is * available. * @return Object[] */ protected Object[] getCurrent() throws SQLException { final RowSetNavigator lnavigator = this.navigator; if (lnavigator == null) { throw Util.sqlException(ErrorCode.X_24501); } else if (lnavigator.isEmpty()) { throw Util.sqlException(ErrorCode.X_24504, ErrorCode.M_RS_EMPTY); } else if (lnavigator.isBeforeFirst()) { throw Util.sqlException(ErrorCode.X_24504, ErrorCode.M_RS_BEFORE_FIRST); } else if (lnavigator.isAfterLast()) { throw Util.sqlException(ErrorCode.X_24504, ErrorCode.M_RS_AFTER_LAST); } Object[] data = lnavigator.getCurrent(); if (data == null) { throw Util.sqlException(ErrorCode.X_24501); } return data; } /** * Internal closed state check. * * @throws SQLException when this result set is closed */ private void checkClosed() throws SQLException { if (navigator == null) { throw Util.sqlException(ErrorCode.X_24501); } } /** * Internal column index validity check. * * @param columnIndex to check * @throws SQLException when this ResultSet has no such column */ protected void checkColumn(int columnIndex) throws SQLException { if (navigator == null) { throw Util.sqlException(ErrorCode.X_24501); } if (columnIndex < 1 || columnIndex > columnCount) { throw Util.sqlException(ErrorCode.JDBC_COLUMN_NOT_FOUND, String.valueOf(columnIndex)); } } /** * Internal wasNull tracker. * * @param o the Object to track * @return boolean */ protected boolean trackNull(Object o) { return (wasNullValue = (o == null)); } /** * Internal value converter.

* * All trivially successful getXXX methods eventually go through this * method, converting if neccessary from the source type to the * requested type.

* * Conversion to the JDBC representation, if different, is handled by the * calling methods. * * @param columnIndex of the column value for which to perform the * conversion * @param targetType the org.hsqldb.types.Type object for targetType * @return an Object of the requested targetType, representing the value of the * specified column * @throws SQLException when there is no rowData, the column index is * invalid, or the conversion cannot be performed */ protected Object getColumnInType(int columnIndex, Type targetType) throws SQLException { Object[] rowData = getCurrent(); Type sourceType; Object value; checkColumn(columnIndex); sourceType = resultMetaData.columnTypes[--columnIndex]; value = rowData[columnIndex]; if (trackNull(value)) { return null; } if (translateTTIType && targetType.isIntervalType()) { targetType = ((IntervalType) targetType).getCharacterType(); } if (sourceType.typeCode != targetType.typeCode) { try { value = targetType.convertToTypeJDBC(session, value, sourceType); } catch (Exception e) { String stringValue = (value instanceof Number || value instanceof String) ? value.toString() : "instance of " + value.getClass().getName(); String msg = "from SQL type " + sourceType.getNameString() + " to " + targetType.getJDBCClassName() + ", value: " + stringValue; Util.throwError(Error.error(ErrorCode.X_42561, msg)); } } return value; } private void checkNotForwardOnly() throws SQLException { if (!isScrollable) { throw Util.notSupported(); } } //-------------------------- Updates -------------------------------------- JDBCPreparedStatement preparedStatement; boolean isRowUpdated; boolean isOnInsertRow; /** * -2 after moveToInsertRow() * -1 before any updateXXX() * row number after any updateXXX() * -1 after updateRow(), clearUpdate() or moveToCurrentRow(); */ int currentUpdateRowNumber; private void checkUpdatable() throws SQLException { checkClosed(); if (!isUpdatable) { throw Util.notUpdatableColumn(); } } private void checkUpdatable(int columnIndex) throws SQLException { checkClosed(); checkColumn(columnIndex); if (!isUpdatable) { throw Util.notUpdatableColumn(); } if (resultMetaData.colIndexes[--columnIndex] == -1) { throw Util.notUpdatableColumn(); } if (!resultMetaData.columns[columnIndex].isWriteable()) { throw Util.notUpdatableColumn(); } } void startUpdate(int columnIndex) throws SQLException { checkUpdatable(columnIndex); if (currentUpdateRowNumber != navigator.getRowNumber()) { preparedStatement.clearParameters(); } currentUpdateRowNumber = navigator.getRowNumber(); isRowUpdated = true; } private void clearUpdates() throws SQLException { checkUpdatable(); preparedStatement.clearParameters(); isRowUpdated = false; } private void startInsert() throws SQLException { checkUpdatable(); // check insertable isOnInsertRow = true; } private void endInsert() throws SQLException { checkUpdatable(); preparedStatement.clearParameters(); isOnInsertRow = false; } private void performUpdate() throws SQLException { preparedStatement.parameterValues[columnCount] = getCurrent()[columnCount]; for (int i = 0; i < columnCount; i++) { boolean set = preparedStatement.parameterSet[i] != null; preparedStatement.resultOut.metaData.columnTypes[i] = set ? preparedStatement.parameterTypes[i] : Type.SQL_ALL_TYPES; } preparedStatement.resultOut.setActionType( ResultConstants.UPDATE_CURSOR); preparedStatement.fetchResult(); preparedStatement.clearParameters(); rootWarning = preparedStatement.getWarnings(); preparedStatement.clearWarnings(); isRowUpdated = false; } private void performInsert() throws SQLException { checkUpdatable(); for (int i = 0; i < columnCount; i++) { boolean set = preparedStatement.parameterSet[i] != null; if (!set) { throw Util.sqlException(ErrorCode.X_24515); } preparedStatement.resultOut.metaData.columnTypes[i] = preparedStatement.parameterTypes[i]; } preparedStatement.resultOut.setActionType( ResultConstants.INSERT_CURSOR); preparedStatement.fetchResult(); preparedStatement.clearParameters(); rootWarning = preparedStatement.getWarnings(); preparedStatement.clearWarnings(); } private void performDelete() throws SQLException { checkUpdatable(); preparedStatement.parameterValues[columnCount] = getCurrent()[columnCount]; preparedStatement.resultOut.metaData.columnTypes[columnCount] = resultMetaData.columnTypes[columnCount]; preparedStatement.resultOut.setActionType( ResultConstants.DELETE_CURSOR); preparedStatement.fetchResult(); preparedStatement.clearParameters(); rootWarning = preparedStatement.getWarnings(); preparedStatement.clearWarnings(); } //-------------------------- Other Methods -------------------------------- // HSQLDB Specific RowSetNavigator getNavigator() { return navigator; } void setNavigator(RowSetNavigator navigator) { this.navigator = navigator; } //------------------------------ Contructors ------------------------------- /** * Constructs a new JDBCResultSet object using the specified * navigator and org.hsqldb.result.ResultMetaData. *

* * @param conn JDBCConnection * @param s the statement * @param r the internal result form that the new * JDBCResultSet represents * @param metaData the connection properties */ public JDBCResultSet(JDBCConnection conn, JDBCStatementBase s, Result r, ResultMetaData metaData) { this.session = conn == null ? null : conn.sessionProxy; this.statement = s; this.result = r; this.connection = conn; rsProperties = r.rsProperties; navigator = r.getNavigator(); resultMetaData = metaData; columnCount = resultMetaData.getColumnCount(); isScrollable = ResultProperties.isScrollable(rsProperties); if (ResultProperties.isUpdatable(rsProperties)) { isUpdatable = true; isInsertable = true; for (int i = 0; i < metaData.colIndexes.length; i++) { if (metaData.colIndexes[i] < 0) { isInsertable = false; break; } } preparedStatement = new JDBCPreparedStatement(s.connection, result); } if (conn != null && conn.clientProperties != null) { translateTTIType = conn.clientProperties.isPropertyTrue( HsqlDatabaseProperties.jdbc_translate_tti_types); } } public JDBCResultSet(JDBCConnection conn, Result r, ResultMetaData metaData) { this.session = conn == null ? null : conn.sessionProxy; this.result = r; this.connection = conn; rsProperties = 0; navigator = r.getNavigator(); resultMetaData = metaData; columnCount = resultMetaData.getColumnCount(); if (conn != null && conn.clientProperties != null) { translateTTIType = conn.clientProperties.isPropertyTrue( HsqlDatabaseProperties.jdbc_translate_tti_types); } } /** * Factory method returns a new JDBCResultSet object for * use with user defined functions that retrun a ResultSet object. * See org.hsqldb.jdbc.JDBCArrayBasic for usage example. *

* * @param r the internal result form that the new * JDBCResultSet represents * @param metaData the connection properties */ public static JDBCResultSet newJDBCResultSet(Result r, ResultMetaData metaData) { return new JDBCResultSetBasic(r, metaData); } static class JDBCResultSetBasic extends JDBCResultSet { JDBCResultSetBasic(Result r, ResultMetaData metaData) { super(null, r, metaData); } protected Object getColumnInType(int columnIndex, Type targetType) throws SQLException { Object[] rowData = getCurrent(); Type sourceType; Object value; checkColumn(columnIndex); sourceType = resultMetaData.columnTypes[--columnIndex]; value = rowData[columnIndex]; if (trackNull(value)) { return null; } if (sourceType.typeCode != targetType.typeCode) { Util.throwError(Error.error(ErrorCode.X_42561)); } return value; } public Date getDate(int columnIndex) throws SQLException { return (Date) getColumnInType(columnIndex, Type.SQL_DATE); } public Time getTime(int columnIndex) throws SQLException { return (Time) getColumnInType(columnIndex, Type.SQL_DATE); } public Timestamp getTimestamp(int columnIndex) throws SQLException { return (Timestamp) getColumnInType(columnIndex, Type.SQL_DATE); } public java.io.InputStream getBinaryStream( int columnIndex) throws SQLException { throw Util.notSupported(); } public java.io.Reader getCharacterStream( int columnIndex) throws SQLException { throw Util.notSupported(); } public Blob getBlob(int columnIndex) throws SQLException { checkColumn(columnIndex); Type sourceType = resultMetaData.columnTypes[columnIndex - 1]; Object o = getColumnInType(columnIndex, sourceType); if (o == null) { return null; } if (o instanceof Blob) { return (Blob) o; } else if (o instanceof byte[]) { return new JDBCBlob((byte[]) o); } throw Util.sqlException(ErrorCode.X_42561); } public Clob getClob(int columnIndex) throws SQLException { checkColumn(columnIndex); Type sourceType = resultMetaData.columnTypes[columnIndex - 1]; Object o = getColumnInType(columnIndex, sourceType); if (o == null) { return null; } if (o instanceof Clob) { return (Clob) o; } else if (o instanceof String) { return new JDBCClob((String) o); } throw Util.sqlException(ErrorCode.X_42561); } public Time getTime(int columnIndex, Calendar cal) throws SQLException { throw Util.notSupported(); } public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { throw Util.notSupported(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCDatabaseMetaData.java0000644000175000017500000101655212007547356024256 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; //#ifdef JAVA6 import java.sql.RowIdLifetime; //#endif JAVA6 import java.sql.SQLException; import org.hsqldb.FunctionCustom; import org.hsqldb.lib.StringUtil; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.types.Type; /* $Id: JDBCDatabaseMetaData.java 4380 2011-07-17 14:41:52Z fredt $ */ // fredt@users 20020320 - patch 1.7.0 - JDBC 2 support and error trapping // JDBC 2 methods can now be called from jdk 1.1.x - see javadoc comments // // boucherb & 20020409 - extensive review and update of docs and behaviour // fredt@users - 20020505 to comply with previous and latest java.sql // specification // boucherb@users 20020509 - update to JDK 1.4 / JDBC3 methods and docs // boucherb@users 2002 - extensive rewrite to support new // - 20030121 1.7.2 system table and metadata features. // boucherb@users 20040422 - doc 1.7.2 - javadoc updates toward 1.7.2 final // fredt@users 20050505 - patch 1.8.0 - enforced JDBC rules for non-pattern params // boucherb@users 20051207 - update to JDK 1.6 JDBC 4.0 methods and docs // - 20060709 // fredt@users 20080805 - full review and update to doc and method return values /** * @todo 1.9.0 - fredt - revise all selects from system tables to use * SQL/SCHEMATA views with column renaming to JDBC spec */ // Revision 1.20 2006/07/12 12:06:54 boucherb // patch 1.9.0 // - java.sql.Wrapper implementation section title added // Revision 1.19 2006/07/09 07:07:01 boucherb // - getting the CVS Log variable ouptut format right // // Revision 1.18 2006/07/09 07:02:38 boucherb // - patch 1.9.0 full synch up to Mustang Build 90 // - getColumns() (finally!!!) officially includes IS_AUTOINCREMENT // /** * Comprehensive information about the database as a whole. *

* This interface is implemented by driver vendors to let users know the capabilities * of a Database Management System (DBMS) in combination with * the driver based on JDBCTM technology * ("JDBC driver") that is used with it. Different relational DBMSs often support * different features, implement features in different ways, and use different * data types. In addition, a driver may implement a feature on top of what the * DBMS offers. Information returned by methods in this interface applies * to the capabilities of a particular driver and a particular DBMS working * together. Note that as used in this documentation, the term "database" is * used generically to refer to both the driver and DBMS. *

* A user for this interface is commonly a tool that needs to discover how to * deal with the underlying DBMS. This is especially true for applications * that are intended to be used with more than one DBMS. For example, a tool might use the method * getTypeInfo to find out what data types can be used in a * CREATE TABLE statement. Or a user might call the method * supportsCorrelatedSubqueries to see if it is possible to use * a correlated subquery or supportsBatchUpdates to see if it is * possible to use batch updates. *

* Some DatabaseMetaData methods return lists of information * in the form of ResultSet objects. * Regular ResultSet methods, such as * getString and getInt, can be used * to retrieve the data from these ResultSet objects. If * a given form of metadata is not available, an empty ResultSet * will be returned. Additional columns beyond the columns defined to be * returned by the ResultSet object for a given method * can be defined by the JDBC driver vendor and must be accessed * by their column label. *

* Some DatabaseMetaData methods take arguments that are * String patterns. These arguments all have names such as fooPattern. * Within a pattern String, "%" means match any substring of 0 or more * characters, and "_" means match any one character. Only metadata * entries matching the search pattern are returned. If a search pattern * argument is set to null, that argument's criterion will * be dropped from the search. *

* A method that gets information about a feature that the driver does not * support will throw an SQLException. * In the case of methods that return a ResultSet * object, either a ResultSet object (which may be empty) is * returned or an SQLException is thrown. * * *

*

HSQLDB-Specific Information:

* *

Metadata Table Production

* * Starting with HSQLDB 1.7.2, the metadata table (a.k.a system table) production * implementation provided in the default build filters metadata based on each * SQL session user's access rights which in turn lifts the pre-HSQLDB 1.7.2 * restriction that only users with the DBA role * ('admin' users in older HSQLDB parlance) could expect trouble-free access to * all metadata.

* * Also starting with HSQLDB 1.7.2, the metadata table production implementation * classes are loaded dynamically, using a precedence policy to find and load * the richest producer available at runtime. In the event that no better * alternative is found, the default minimal (completely restricted) provider * is selected. Under this scheme, it is possible for third party packagers to * create custom distributions targeted at supporting full (design-time), * custom-written (proprietary / micro environment), minimal (production-time) * or completely-restricted (space-constrained | device embedded | real-time | * hostile environment) metadata table production scenarios. To learn more * about this option, interested parties can review the documentation and source * code for the org.hsqldb.dbinfo.DatabaseInformation class.

* * Please also note that in addition to the metadata tables produced to * directly support this class, starting with HSQLDB 1.7.2, the default build * provides many additional tables covering all or most HSQLDB features, such * as descriptions of the triggers and aliases defined in the database.

* * For instance, in the default build, a fairly comprehensive description of * each INFORMATION_SCHEMA table and each INFORMATION_SCHEMA table * column is included in the REMARKS column of the {@link #getTables( * java.lang.String, java.lang.String, java.lang.String, java.lang.String[]) * getTables(...)} and {@link #getColumns(java.lang.String, java.lang.String, * java.lang.String, java.lang.String) getColumns(...)} results, which derive * from INFORMATION_SCHEMA.SYSTEM_TABLES and INFORMATION_SCHEMA.SYSTEM_COLUMNS, * respectively.

* *

Schema Metadata

* * The SQL SCHEMA concept became fully supported in the HSQLDB 1.8.x series and * this fact is reflected in the all subsequent versions of this class. * *

Catalog Metadata

* * Starting with HSQLDB 2.0, SQL standards compliance up to SQL:2008 and beyond * is a major theme which is reflected in the provision of the majority of the * standard-defined full-name INFORMATION_SCHEMA views.

* * However, just as CATALOG semantics and handling are still considered to be * implementation defined by the most recent SQL standard (SQL:2008), so is the * HSQLDB CATALOG concept still in the process of being defined and refined in * HSQLDB 2.x. and beyond.

* * Previous to HSQLDB 2.x, there were, at various points in time, experimental * features provided to turn on pseudo catalog (and before that, pseudo-schema) * reporting in the system tables, using the database properties * 'hsqldb.catalogs' and 'hsqldb.schemas', respectively.

* * However, once the engine fully supported the SQL SCHEMA concept, the * experimental 'hsqldb.schemas' * database property was retired.

* * Similarly, starting with HSQLDB 2.x, the 'hsqldb.catalogs' database property * has been retired and replaced with the convention that, from the perspective * of SQL identification, an HSQLDB JDBC URL connects to a single HSQLDB * database instance which consists of a single, default CATALOG * named PUBLIC in which each SCHEMA instance of the database resides. The name of * this catalog can be changed with the ALTER CATALOG RENAME TO statement. * As of version 2.1.0, HSQLDB supports qualification by the containing CATALOG of * database objects at the syntactic level, but does not yet support operations * such as opening, manipulating or querying against multiple database * catalogs within a single session, not even in a one-at-a-time fashion.

* *

Index Metadata

* * It must still be noted that as of the most recent release, HSQLDB continues * to ignore the approximate argument of {@link #getIndexInfo * getIndexInfo()} which continues to be simply indicative of absence of a fully * statistics-driven cost-based SQL plan optimization facility. When, * such a facility is implemented, corresponding improvements to * getIndexInfo will be provided.

* *

Notes for developers extending metadata table production

* * Note that in the absence of an ORDER BY clause, queries against the metadata * tables that directly support this class are expected to return rows in JDBC * contract order. The reason for this is that results typically come * back much faster when no "ORDER BY" clause is used.

* * As such, when adding, extending or replacing a JDBC database metadata table * production routine, developers need to be aware of this fact and either add the * contract "ORDER BY" clause to the driving SQL or, when possible, * preferably maintain rows in the contract order by correctly coding the * primary index definition in the table producer class.

* *


* * JRE 1.1.x Notes:

* * In general, JDBC 2 support requires Java 1.2 and above, and JDBC3 requires * Java 1.4 and above. In HSQLDB, support for methods introduced in different * versions of JDBC depends on the JDK version used for compiling and building * HSQLDB.

* * Since 1.7.0, it is possible to build the product so that * all JDBC 2 methods can be called while executing under the version 1.1.x * Java Runtime EnvironmentTM. * However, some of these method calls require int values that * are defined only in the JDBC 2 or greater version of the * {@link java.sql.ResultSet ResultSet} interface. For this reason, when the * product is compiled under JDK 1.1.x, these values are defined in * {@link JDBCResultSet JDBCResultSet}.

* * In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the * JDBC2-only ResultSet values can be achieved by referring * to them in parameter specifications and return value comparisons, * respectively, as follows:

* *

 * JDBCResultSet.FETCH_FORWARD
 * JDBCResultSet.TYPE_FORWARD_ONLY
 * JDBCResultSet.TYPE_SCROLL_INSENSITIVE
 * JDBCResultSet.CONCUR_READ_ONLY
 * // etc
 * 
* * However, please note that code written in such a manner will not be * compatible for use with other JDBC 2 drivers, since they expect and use * ResultSet, rather than JDBCResultSet. Also * note, this feature is offered solely as a convenience to developers * who must work under JDK 1.1.x due to operating constraints, yet wish to * use some of the more advanced features available under the JDBC 2 * specification.

* * (fredt@users)
* (boucherb@users) *

* * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @revised JDK 1.6, HSQLDB 2.0 * @revised JDK 1.7, HSQLDB 2.0.1 * @see org.hsqldb.dbinfo.DatabaseInformation * @see org.hsqldb.dbinfo.DatabaseInformationMain * @see org.hsqldb.dbinfo.DatabaseInformationFull */ //#ifdef JAVA6 public class JDBCDatabaseMetaData implements DatabaseMetaData, java.sql.Wrapper { //#else /* public class JDBCDatabaseMetaData implements DatabaseMetaData { */ //#endif //---------------------------------------------------------------------- // First, a variety of minor information about the target database. /** * Retrieves whether the current user can call all the procedures * returned by the method getProcedures. * * *
*

HSQLDB-Specific Information:

* * This method still always returns * true.

* * In a future release, the plugin interface may be modified to allow * implementors to report different values here, based on their * implementations. *

* * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean allProceduresAreCallable() throws SQLException { return true; } /** * Retrieves whether the current user can use all the tables returned * by the method getTables in a SELECT * statement. * * *
*

HSQLDB-Specific Information:

* * HSQLDB always reports true.

* * Please note that the default HSQLDB getTables behaviour is * omit from the list of requested tables only those to which the * invoking user has no access of any kind.

* *

* * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean allTablesAreSelectable() throws SQLException { return true; } /** * Retrieves the URL for this DBMS. * * @return the URL for this DBMS or null if it cannot be * generated * @exception SQLException if a database access error occurs */ public String getURL() throws SQLException { return connection.getURL(); } /** * Retrieves the user name as known to this database. * * @return the database user name * @exception SQLException if a database access error occurs */ public String getUserName() throws SQLException { ResultSet rs = execute("CALL USER()"); rs.next(); String result = rs.getString(1); rs.close(); return result; } /** * Retrieves whether this database is in read-only mode. * * *
*

HSQLDB-Specific Information:

* * Starting with 1.7.2, this makes * an SQL call to the new isReadOnlyDatabase function * which provides correct determination of the read-only status for * both local and remote database instances. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean isReadOnly() throws SQLException { ResultSet rs = execute("CALL IS_READONLY_DATABASE()"); rs.next(); boolean result = rs.getBoolean(1); rs.close(); return result; } /** * Retrieves whether NULL values are sorted high. * Sorted high means that NULL values * sort higher than any other value in a domain. In an ascending order, * if this method returns true, NULL values * will appear at the end. By contrast, the method * nullsAreSortedAtEnd indicates whether NULL values * are sorted at the end regardless of sort order. * * *
*

HSQLDB-Specific Information:

* * By default HSQLDB sorts null at start; this method always returns false. *

* * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean nullsAreSortedHigh() throws SQLException { return false; } /** * Retrieves whether NULL values are sorted low. * Sorted low means that NULL values * sort lower than any other value in a domain. In an ascending order, * if this method returns true, NULL values * will appear at the beginning. By contrast, the method * nullsAreSortedAtStart indicates whether NULL values * are sorted at the beginning regardless of sort order. * * *
*

HSQLDB-Specific Information:

* * By default HSQLDB sorts null at the start; this method always returns false. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean nullsAreSortedLow() throws SQLException { return false; } /** * Retrieves whether NULL values are sorted at the start regardless * of sort order. * * *
*

HSQLDB-Specific Information:

* * By default HSQLDB sorts null at the start; this method always returns true. * Use NULLS LAST in the ORDER BY clause to sort null at the end. *

* * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean nullsAreSortedAtStart() throws SQLException { return true; } /** * Retrieves whether NULL values are sorted at the end regardless of * sort order. * * *
*

HSQLDB-Specific Information:

* * By default HSQLDB sorts null at the start; this method always returns true. *

* * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean nullsAreSortedAtEnd() throws SQLException { return false; } /** * Retrieves the name of this database product. * *
*

HSQLDB-Specific Information:

* * Returns the name of the HSQLDB engine. *

* * @return database product name * @exception SQLException if a database access error occurs */ public String getDatabaseProductName() throws SQLException { return HsqlDatabaseProperties.PRODUCT_NAME; } /** * Retrieves the version number of this database product. * *

*

HSQLDB-Specific Information:

* * Returns the full version string. *

* * @return database version number * @exception SQLException if a database access error occurs */ public String getDatabaseProductVersion() throws SQLException { ResultSet rs = execute("call database_version()"); rs.next(); return rs.getString(1); } /** * Retrieves the name of this JDBC driver. * * @return JDBC driver name * @exception SQLException if a database access error occurs */ public String getDriverName() throws SQLException { return HsqlDatabaseProperties.PRODUCT_NAME + " Driver"; } /** * Retrieves the version number of this JDBC driver as a String. * * @return JDBC driver version * @exception SQLException if a database access error occurs */ public String getDriverVersion() throws SQLException { return HsqlDatabaseProperties.THIS_VERSION; } /** * Retrieves this JDBC driver's major version number. * * @return JDBC driver major version */ public int getDriverMajorVersion() { return HsqlDatabaseProperties.MAJOR; } /** * Retrieves this JDBC driver's minor version number. * * @return JDBC driver minor version number */ public int getDriverMinorVersion() { return HsqlDatabaseProperties.MINOR; } /** * Retrieves whether this database stores tables in a local file. * * *

*

HSQLDB-Specific Information:

* * From HSQLDB 1.7.2 it is assumed that this refers to data being stored * by the JDBC client. This method always returns false. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean usesLocalFiles() throws SQLException { return false; } /** * Retrieves whether this database uses a file for each table. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not use a file for each table. * This method always returns false. *

* * @return true if this database uses a local file for each table; * false otherwise * @exception SQLException if a database access error occurs */ public boolean usesLocalFilePerTable() throws SQLException { return false; } /** * Retrieves whether this database treats mixed case unquoted SQL identifiers as * case sensitive and as a result stores them in mixed case. * * *
*

HSQLDB-Specific Information:

* * HSQLDB treats unquoted identifiers as case insensitive and stores * them in upper case. It treats quoted identifiers as case sensitive and * stores them verbatim; this method always returns false. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsMixedCaseIdentifiers() throws SQLException { return false; } /** * Retrieves whether this database treats mixed case unquoted SQL identifiers as * case insensitive and stores them in upper case. * * *
*

HSQLDB-Specific Information:

* * HSQLDB treats unquoted identifiers as case insensitive and stores * them in upper case. It treats quoted identifiers as case sensitive and * stores them verbatim; this method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean storesUpperCaseIdentifiers() throws SQLException { return true; } /** * Retrieves whether this database treats mixed case unquoted SQL identifiers as * case insensitive and stores them in lower case. * * *
*

HSQLDB-Specific Information:

* * HSQLDB treats unquoted identifiers as case insensitive and stores * them in upper case. It treats quoted identifiers as case sensitive and * stores them verbatim; this method always returns false. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean storesLowerCaseIdentifiers() throws SQLException { return false; } /** * Retrieves whether this database treats mixed case unquoted SQL identifiers as * case insensitive and stores them in mixed case. * * *
*

HSQLDB-Specific Information:

* * HSQLDB treats unquoted identifiers as case insensitive and stores * them in upper case. It treats quoted identifiers as case sensitive and * stores them verbatim; this method always returns false. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean storesMixedCaseIdentifiers() throws SQLException { return false; } /** * Retrieves whether this database treats mixed case quoted SQL identifiers as * case sensitive and as a result stores them in mixed case. * * *
*

HSQLDB-Specific Information:

* * HSQLDB treats unquoted identifiers as case insensitive and stores * them in upper case. It treats quoted identifiers as case sensitive and * stores them verbatim; this method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException { return true; } /** * Retrieves whether this database treats mixed case quoted SQL identifiers as * case insensitive and stores them in upper case. * * *
*

HSQLDB-Specific Information:

* * HSQLDB treats unquoted identifiers as case insensitive and stores * them in upper case. It treats quoted identifiers as case sensitive and * stores them verbatim; this method always returns false. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean storesUpperCaseQuotedIdentifiers() throws SQLException { return false; } /** * Retrieves whether this database treats mixed case quoted SQL identifiers as * case insensitive and stores them in lower case. * * *
*

HSQLDB-Specific Information:

* * HSQLDB treats unquoted identifiers as case insensitive and stores * them in upper case. It treats quoted identifiers as case sensitive and * stores them verbatim; this method always returns false. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean storesLowerCaseQuotedIdentifiers() throws SQLException { return false; } /** * Retrieves whether this database treats mixed case quoted SQL identifiers as * case insensitive and stores them in mixed case. * * *
*

HSQLDB-Specific Information:

* * HSQLDB treats unquoted identifiers as case insensitive and stores * them in upper case. It treats quoted identifiers as case sensitive and * stores them verbatim; this method always returns false. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean storesMixedCaseQuotedIdentifiers() throws SQLException { return false; } /** * Retrieves the string used to quote SQL identifiers. * This method returns a space " " if identifier quoting is not supported. * * *
*

HSQLDB-Specific Information:

* * HSQLDB uses the standard SQL identifier quote character * (the double quote character); this method always returns ". *

* * @return the quoting string or a space if quoting is not supported * @exception SQLException if a database access error occurs */ public String getIdentifierQuoteString() throws SQLException { return "\""; } /** * Retrieves a comma-separated list of all of this database's SQL keywords * that are NOT also SQL:2003 keywords. * (JDBC4 modified => SQL:2003) * * *
*

HSQLDB-Specific Information:

* * The list is empty. However, HSQLDB also supports SQL:2008 keywords * and disallows them for database object names without double quoting. *

* * * * @return the list of this database's keywords that are not also * SQL:2003 keywords * (JDBC4 modified => SQL:2003) * @exception SQLException if a database access error occurs */ public String getSQLKeywords() throws SQLException { return ""; } /** * Retrieves a comma-separated list of math functions available with * this database. These are the Open /Open CLI math function names used in * the JDBC function escape clause. * * @return the list of math functions supported by this database * @exception SQLException if a database access error occurs */ public String getNumericFunctions() throws SQLException { return StringUtil.getList(FunctionCustom.openGroupNumericFunctions, ",", ""); } /** * Retrieves a comma-separated list of string functions available with * this database. These are the Open Group CLI string function names used * in the JDBC function escape clause. * * @return the list of string functions supported by this database * @exception SQLException if a database access error occurs */ public String getStringFunctions() throws SQLException { return StringUtil.getList(FunctionCustom.openGroupStringFunctions, ",", ""); } /** * Retrieves a comma-separated list of system functions available with * this database. These are the Open Group CLI system function names used * in the JDBC function escape clause. * * @return a list of system functions supported by this database * @exception SQLException if a database access error occurs */ public String getSystemFunctions() throws SQLException { return StringUtil.getList(FunctionCustom.openGroupSystemFunctions, ",", ""); } /** * Retrieves a comma-separated list of the time and date functions available * with this database. * * @return the list of time and date functions supported by this database * @exception SQLException if a database access error occurs */ public String getTimeDateFunctions() throws SQLException { return StringUtil.getList(FunctionCustom.openGroupDateTimeFunctions, ",", ""); } /** * Retrieves the string that can be used to escape wildcard characters. * This is the string that can be used to escape '_' or '%' in * the catalog search parameters that are a pattern (and therefore use one * of the wildcard characters). * *

The '_' character represents any single character; * the '%' character represents any sequence of zero or * more characters. * * *

*

HSQLDB-Specific Information:

* * HSQLDB uses the "\" character to escape wildcard characters. *

* * * * @return the string used to escape wildcard characters * @exception SQLException if a database access error occurs */ public String getSearchStringEscape() throws SQLException { return "\\"; } /** * Retrieves all the "extra" characters that can be used in unquoted * identifier names (those beyond a-z, A-Z, 0-9 and _). * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not support using any "extra" characters in unquoted * identifier names; this method always returns the empty String. *

* * * * @return the string containing the extra characters * @exception SQLException if a database access error occurs */ public String getExtraNameCharacters() throws SQLException { return ""; } //-------------------------------------------------------------------- // Functions describing which features are supported. /** * Retrieves whether this database supports ALTER TABLE * with add column. * * *
*

HSQLDB-Specific Information:

* * From 1.7.0, HSQLDB supports this type of * ALTER TABLE statement; this method always * returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsAlterTableWithAddColumn() throws SQLException { return true; } /** * Retrieves whether this database supports ALTER TABLE * with drop column. * * *
*

HSQLDB-Specific Information:

* * From 1.7.0, HSQLDB supports this type of * ALTER TABLE statement; this method always * returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsAlterTableWithDropColumn() throws SQLException { return true; } /** * Retrieves whether this database supports column aliasing. * *

If so, the SQL AS clause can be used to provide names for * computed columns or to provide alias names for columns as * required. * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports column aliasing; this method always * returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsColumnAliasing() throws SQLException { return true; } /** * Retrieves whether this database supports concatenations between * NULL and non-NULL values being * NULL. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this; this method always * returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean nullPlusNonNullIsNull() throws SQLException { return true; } /** * (JDBC4 clarification:) * Retrieves whether this database supports the JDBC scalar function * CONVERT for the conversion of one JDBC type to another. * The JDBC types are the generic SQL data types defined * in java.sql.Types. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports conversions; this method always * returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsConvert() throws SQLException { return true; } /** @todo needs the full conversion matrix here. Should use org.hsqldb.types */ /** * (JDBC4 clarification:) * Retrieves whether this database supports the JDBC scalar function * CONVERT for conversions between the JDBC types fromType * and toType. The JDBC types are the generic SQL data types defined * in java.sql.Types. * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports conversion according to SQL standards. In addition, * it supports conversion between values of BOOLEAN and BIT types. *

* * * * @param fromType the type to convert from; one of the type codes from * the class java.sql.Types * @param toType the type to convert to; one of the type codes from * the class java.sql.Types * @return true if so; false otherwise * @exception SQLException if a database access error occurs * @see java.sql.Types */ public boolean supportsConvert(int fromType, int toType) throws SQLException { Type from = Type.getDefaultTypeWithSize(Type.getHSQLDBTypeCode(fromType)); Type to = Type.getDefaultTypeWithSize(Type.getHSQLDBTypeCode(toType)); if (from == null || to == null) { return false; } if (fromType == java.sql.Types.NULL && toType == java.sql.Types.ARRAY) { return true; } return to.canConvertFrom(from); } /** * Retrieves whether this database supports table correlation names. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports table correlation names; this method always * returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsTableCorrelationNames() throws SQLException { return true; } /** * Retrieves whether, when table correlation names are supported, they * are restricted to being different from the names of the tables. * * *
*

HSQLDB-Specific Information:

* * HSQLDB requires that table correlation names are different from the * names of the tables; this method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsDifferentTableCorrelationNames() throws SQLException { return true; } /** * Retrieves whether this database supports expressions in * ORDER BY lists. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports expressions in ORDER BY lists; this * method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsExpressionsInOrderBy() throws SQLException { return true; } /** * Retrieves whether this database supports using a column that is * not in the SELECT statement in an * ORDER BY clause. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports using a column that is not in the SELECT * statement in an ORDER BY clause; this method always * returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsOrderByUnrelated() throws SQLException { return true; } /** * Retrieves whether this database supports some form of * GROUP BY clause. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports using the GROUP BY clause; this method * always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsGroupBy() throws SQLException { return true; } /** * Retrieves whether this database supports using a column that is * not in the SELECT statement in a * GROUP BY clause. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports using a column that is * not in the SELECT statement in a * GROUP BY clause; this method * always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsGroupByUnrelated() throws SQLException { return true; } /** * Retrieves whether this database supports using columns not included in * the SELECT statement in a GROUP BY clause * provided that all of the columns in the SELECT statement * are included in the GROUP BY clause. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports using columns not included in * the SELECT statement in a GROUP BY clause * provided that all of the columns in the SELECT statement * are included in the GROUP BY clause; this method * always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsGroupByBeyondSelect() throws SQLException { return true; } /** * Retrieves whether this database supports specifying a * LIKE escape clause. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports specifying a * LIKE escape clause; this method * always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsLikeEscapeClause() throws SQLException { return true; } /** * Retrieves whether this database supports getting multiple * ResultSet objects from a single call to the * method execute. * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports getting multiple * ResultSet objects from a single call to the method * execute of the CallableStatement interface; * this method returns true.

* *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsMultipleResultSets() throws SQLException { return true; } /** * Retrieves whether this database allows having multiple * transactions open at once (on different connections). * * *
*

HSQLDB-Specific Information:

* * HSQLDB allows having multiple * transactions open at once (on different connections); this method * always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsMultipleTransactions() throws SQLException { return true; } /** * Retrieves whether columns in this database may be defined as non-nullable. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports the specification of non-nullable columns; this method * always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsNonNullableColumns() throws SQLException { return true; } /** * Retrieves whether this database supports the ODBC Minimum SQL grammar. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports the ODBC Minimum SQL grammar; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsMinimumSQLGrammar() throws SQLException { return true; } /** * Retrieves whether this database supports the ODBC Core SQL grammar. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports the ODBC Core SQL grammar; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsCoreSQLGrammar() throws SQLException { return true; } /** * Retrieves whether this database supports the ODBC Extended SQL grammar. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports the ODBC Extended SQL grammar; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsExtendedSQLGrammar() throws SQLException { return true; } /** * Retrieves whether this database supports the ANSI92 entry level SQL * grammar. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports the ANSI92 entry level SQL grammar; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsANSI92EntryLevelSQL() throws SQLException { return true; } /** * Retrieves whether this database supports the ANSI92 intermediate SQL grammar supported. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports the ANSI92 intermediate SQL grammar; * this method always returns true. *

*

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsANSI92IntermediateSQL() throws SQLException { return true; } /** * Retrieves whether this database supports the ANSI92 full SQL grammar supported. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports the ANSI92 full SQL grammar. The exceptions, * such as support for ASSERTION, are not considered grammer issues. * This method always returns true.

*

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsANSI92FullSQL() throws SQLException { return true; } /** * Retrieves whether this database supports the SQL Integrity * Enhancement Facility. * * *
*

HSQLDB-Specific Information:

* * This method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsIntegrityEnhancementFacility() throws SQLException { return true; } /** * Retrieves whether this database supports some form of outer join. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports outer joins; this method always returns * true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsOuterJoins() throws SQLException { return true; } /** * Retrieves whether this database supports full nested outer joins. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports full nested outer * joins; this method always returns true.

*

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsFullOuterJoins() throws SQLException { return true; } /** * Retrieves whether this database provides limited support for outer * joins. (This will be true if the method * supportsFullOuterJoins returns true). * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports the LEFT OUTER join syntax; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsLimitedOuterJoins() throws SQLException { return true; } /** * Retrieves the database vendor's preferred term for "schema". * * *
*

HSQLDB-Specific Information:

* * Starting with 1.8.0, HSQLDB supports schemas. *

* * @return the vendor term for "schema" * @exception SQLException if a database access error occurs */ public String getSchemaTerm() throws SQLException { return "SCHEMA"; } /** * Retrieves the database vendor's preferred term for "procedure". * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports declaration of * functions or procedures directly in SQL.

*

* * @return the vendor term for "procedure" * @exception SQLException if a database access error occurs */ public String getProcedureTerm() throws SQLException { return "PROCEDURE"; } /** * Retrieves the database vendor's preferred term for "catalog". * * *
*

HSQLDB-Specific Information:

* * HSQLDB uses the standard name CATALOG. *

* * * @return the vendor term for "catalog" * @exception SQLException if a database access error occurs */ public String getCatalogTerm() throws SQLException { return "CATALOG"; } /** * Retrieves whether a catalog appears at the start of a fully qualified * table name. If not, the catalog appears at the end. * * *
*

HSQLDB-Specific Information:

* * When allowed, a catalog appears at the start of a fully qualified * table name; this method always returns true. *

* * @return true if the catalog name appears at the beginning * of a fully qualified table name; false otherwise * @exception SQLException if a database access error occurs */ public boolean isCatalogAtStart() throws SQLException { return true; } /** * Retrieves the String that this database uses as the * separator between a catalog and table name. * * *
*

HSQLDB-Specific Information:

* * When used, a catalog name is separated with period; * this method always returns a period *

* * * @return the separator string * @exception SQLException if a database access error occurs */ public String getCatalogSeparator() throws SQLException { return "."; } /** * Retrieves whether a schema name can be used in a data manipulation statement. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports schemas where allowed by the standard; * this method always returns true. * *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsSchemasInDataManipulation() throws SQLException { // false for OOo client server compatibility // otherwise schema name is used by OOo in column references return !useSchemaDefault; } /** * Retrieves whether a schema name can be used in a procedure call statement. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports schemas where allowed by the standard; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsSchemasInProcedureCalls() throws SQLException { // false for OOo client server compatibility // otherwise schema name is used by OOo in column references return !useSchemaDefault; } /** * Retrieves whether a schema name can be used in a table definition statement. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports schemas where allowed by the standard; * this method always returns true. * *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsSchemasInTableDefinitions() throws SQLException { // false for OOo client server compatibility // otherwise schema name is used by OOo in column references return !useSchemaDefault; } /** * Retrieves whether a schema name can be used in an index definition statement. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports schemas where allowed by the standard; * this method always returns true. * *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsSchemasInIndexDefinitions() throws SQLException { // false for OOo client server compatibility // otherwise schema name is used by OOo in column references return !useSchemaDefault; } /** * Retrieves whether a schema name can be used in a privilege definition statement. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports schemas where allowed by the standard; * this method always returns true. * *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException { // false for OOo client server compatibility // otherwise schema name is used by OOo in column references return !useSchemaDefault; } /** * Retrieves whether a catalog name can be used in a data manipulation statement. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports catalog names where allowed by the standard; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsCatalogsInDataManipulation() throws SQLException { // false for OOo client server compatibility // otherwise catalog name is used by OOo in column references return !useSchemaDefault; } /** * Retrieves whether a catalog name can be used in a procedure call statement. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports catalog names where allowed by the standard; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsCatalogsInProcedureCalls() throws SQLException { // false for OOo client server compatibility // otherwise catalog name is used by OOo in column references return !useSchemaDefault; } /** * Retrieves whether a catalog name can be used in a table definition statement. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports catalog names where allowed by the standard; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsCatalogsInTableDefinitions() throws SQLException { // false for OOo client server compatibility // otherwise catalog name is used by OOo in column references return !useSchemaDefault; } /** * Retrieves whether a catalog name can be used in an index definition statement. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports catalog names where allowed by the standard; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsCatalogsInIndexDefinitions() throws SQLException { // false for OOo client server compatibility // otherwise catalog name is used by OOo in column references return !useSchemaDefault; } /** * Retrieves whether a catalog name can be used in a privilege definition statement. * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports catalog names where allowed by the standard; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsCatalogsInPrivilegeDefinitions() throws SQLException { // false for OOo client server compatibility // otherwise catalog name is used by OOo in column references return !useSchemaDefault; } /** * Retrieves whether this database supports positioned DELETE * statements. * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports updateable result sets; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsPositionedDelete() throws SQLException { return true; } /** * Retrieves whether this database supports positioned UPDATE * statements. * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports updateable result sets; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsPositionedUpdate() throws SQLException { return true; } /** * Retrieves whether this database supports SELECT FOR UPDATE * statements. * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports updateable result sets; * this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsSelectForUpdate() throws SQLException { return true; } /** * Retrieves whether this database supports stored procedure calls * that use the stored procedure escape syntax. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports calling public static Java methods in the context of SQL * Stored Procedures; this method always returns true. *

* * @return true if so; false otherwise * @exception SQLException if a database access error occurs * @see JDBCParameterMetaData * @see JDBCConnection#prepareCall */ public boolean supportsStoredProcedures() throws SQLException { return true; } /** * Retrieves whether this database supports subqueries in comparison * expressions. * * *
*

HSQLDB-Specific Information:

* * HSQLDB has always supported subqueries in comparison expressions; * this method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsSubqueriesInComparisons() throws SQLException { return true; } /** * Retrieves whether this database supports subqueries in * EXISTS expressions. * * *
*

HSQLDB-Specific Information:

* * HSQLDB has always supported subqueries in EXISTS * expressions; this method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsSubqueriesInExists() throws SQLException { return true; } /** * (JDBC4 correction:) * Retrieves whether this database supports subqueries in * IN expressions. * * *
*

HSQLDB-Specific Information:

* * HSQLDB has always supported subqueries in IN * statements; this method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsSubqueriesInIns() throws SQLException { return true; } /** * Retrieves whether this database supports subqueries in quantified * expressions. * * *
*

HSQLDB-Specific Information:

* * HSQLDB has always supported subqueries in quantified * expressions; this method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsSubqueriesInQuantifieds() throws SQLException { return true; } /** * Retrieves whether this database supports correlated subqueries. * * *
*

HSQLDB-Specific Information:

* * HSQLDB has always supported correlated subqueries; * this method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsCorrelatedSubqueries() throws SQLException { return true; } /** * Retrieves whether this database supports SQL UNION. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports SQL UNION; * this method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsUnion() throws SQLException { return true; } /** * Retrieves whether this database supports SQL UNION ALL. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports SQL UNION ALL; * this method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsUnionAll() throws SQLException { return true; } /** * Retrieves whether this database supports keeping cursors open * across commits. * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports keeping cursors open across commits. * This method always returns true. *

* * @return true if cursors always remain open; * false if they might not remain open * @exception SQLException if a database access error occurs */ public boolean supportsOpenCursorsAcrossCommit() throws SQLException { return true; } /** * Retrieves whether this database supports keeping cursors open * across rollbacks. * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 closes open cursors at rollback. * This method always returns false. *

* * @return true if cursors always remain open; * false if they might not remain open * @exception SQLException if a database access error occurs */ public boolean supportsOpenCursorsAcrossRollback() throws SQLException { return false; } /** * Retrieves whether this database supports keeping statements open * across commits. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports keeping statements open across commits; * this method always returns true. *

* * * * @return true if statements always remain open; * false if they might not remain open * @exception SQLException if a database access error occurs */ public boolean supportsOpenStatementsAcrossCommit() throws SQLException { return true; } /** * Retrieves whether this database supports keeping statements open * across rollbacks. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports keeping statements open across rollbacks; * this method always returns true. *

* * * * @return true if statements always remain open; * false if they might not remain open * @exception SQLException if a database access error occurs */ public boolean supportsOpenStatementsAcrossRollback() throws SQLException { return true; } //---------------------------------------------------------------------- // The following group of methods exposes various limitations // based on the target database with the current driver. // Unless otherwise specified, a result of zero means there is no // limit, or the limit is not known. /** * Retrieves the maximum number of hex characters this database allows in an * inline binary literal. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory availabily; this method always returns 0. *

* * * * @return max the maximum length (in hex characters) for a binary literal; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxBinaryLiteralLength() throws SQLException { // hard limit is Integer.MAX_VALUE return 0; } /** * Retrieves the maximum number of characters this database allows * for a character literal. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory availabily; this method always returns 0. *

* * * @return the maximum number of characters allowed for a character literal; * a result of zero means that there is no limit or the limit is * not known * @exception SQLException if a database access error occurs */ public int getMaxCharLiteralLength() throws SQLException { return 0; } /** * Retrieves the maximum number of characters this database allows * for a column name. * * *
*

HSQLDB-Specific Information:

* * Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for * all names. *

* * * @return the maximum number of characters allowed for a column name; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxColumnNameLength() throws SQLException { return 128; } /** * Retrieves the maximum number of columns this database allows in a * GROUP BY clause. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory availabily; this method always returns 0. *

* * * @return the maximum number of columns allowed; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxColumnsInGroupBy() throws SQLException { return 0; } /** * Retrieves the maximum number of columns this database allows in an index. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory availabily; this method always returns 0. *

* * * @return the maximum number of columns allowed; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxColumnsInIndex() throws SQLException { return 0; } /** * Retrieves the maximum number of columns this database allows in an * ORDER BY clause. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory availabily; this method always returns 0. *

* * * @return the maximum number of columns allowed; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxColumnsInOrderBy() throws SQLException { return 0; } /** * Retrieves the maximum number of columns this database allows in a * SELECT list. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory availabily; this method always returns 0. *

* * * @return the maximum number of columns allowed; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxColumnsInSelect() throws SQLException { return 0; } /** * Retrieves the maximum number of columns this database allows in a table. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory availabily; this method always returns 0. *

* * * @return the maximum number of columns allowed; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxColumnsInTable() throws SQLException { return 0; } /** * Retrieves the maximum number of concurrent connections to this * database that are possible. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory availabily; this method always returns 0. *

* * * @return the maximum number of active connections possible at one time; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxConnections() throws SQLException { return 0; } /** * Retrieves the maximum number of characters that this database allows in a * cursor name. * * *
*

HSQLDB-Specific Information:

* * Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for * all names. *

* * * @return the maximum number of characters allowed in a cursor name; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxCursorNameLength() throws SQLException { return 128; } /** * Retrieves the maximum number of bytes this database allows for an * index, including all of the parts of the index. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory and disk availabily; this method always returns 0. *

* * * @return the maximum number of bytes allowed; this limit includes the * composite of all the constituent parts of the index; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxIndexLength() throws SQLException { return 0; } /** * Retrieves the maximum number of characters that this database allows in a * schema name. * * *
*

HSQLDB-Specific Information:

* * Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for * all names. *

* * @return the maximum number of characters allowed in a schema name; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxSchemaNameLength() throws SQLException { return 128; } /** * Retrieves the maximum number of characters that this database allows in a * procedure name. * * *
*

HSQLDB-Specific Information:

* * Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for * all names. *

* * * @return the maximum number of characters allowed in a procedure name; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxProcedureNameLength() throws SQLException { return 128; } /** * Retrieves the maximum number of characters that this database allows in a * catalog name. * * *
*

HSQLDB-Specific Information:

* * Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for * all names. *

* * * @return the maximum number of characters allowed in a catalog name; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxCatalogNameLength() throws SQLException { return 128; } /** * Retrieves the maximum number of bytes this database allows in * a single row. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory and disk availabily; this method always returns 0. *

* * * @return the maximum number of bytes allowed for a row; a result of * zero means that there is no limit or the limit is not known * @exception SQLException if a database access error occurs */ public int getMaxRowSize() throws SQLException { return 0; } /** * Retrieves whether the return value for the method * getMaxRowSize includes the SQL data types * LONGVARCHAR and LONGVARBINARY. * * *
*

HSQLDB-Specific Indormation:

* * Including 2.0, {@link #getMaxRowSize} always returns * 0, indicating that the maximum row size is unknown or has no limit. * This applies to the above types as well; this method always * returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean doesMaxRowSizeIncludeBlobs() throws SQLException { return true; } /** * Retrieves the maximum number of characters this database allows in * an SQL statement. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory availabily; this method always returns 0. *

* * * @return the maximum number of characters allowed for an SQL statement; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxStatementLength() throws SQLException { return 0; } /** * Retrieves the maximum number of active statements to this database * that can be open at the same time. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory availabily; this method always returns 0. *

* * * @return the maximum number of statements that can be open at one time; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxStatements() throws SQLException { return 0; } /** * Retrieves the maximum number of characters this database allows in * a table name. * * *
*

HSQLDB-Specific Information:

* * Up to and including 1.8.0.x, HSQLDB did not impose a "known" limit. Th * hard limit was the maximum length of a java.lang.String * (java.lang.Integer.MAX_VALUE); this method always returned * 0. * * Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for * all names. *

* * * @return the maximum number of characters allowed for a table name; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxTableNameLength() throws SQLException { return 128; } /** * Retrieves the maximum number of tables this database allows in a * SELECT statement. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not impose a "known" limit. The limit is subject to * memory availabily; this method always returns 0. *

* * * @return the maximum number of tables allowed in a SELECT * statement; a result of zero means that there is no limit or * the limit is not known * @exception SQLException if a database access error occurs */ public int getMaxTablesInSelect() throws SQLException { return 0; } /** * Retrieves the maximum number of characters this database allows in * a user name. * * *
*

HSQLDB-Specific Information:

* * Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for * all names. *

* * * @return the maximum number of characters allowed for a user name; * a result of zero means that there is no limit or the limit * is not known * @exception SQLException if a database access error occurs */ public int getMaxUserNameLength() throws SQLException { return 128; } //---------------------------------------------------------------------- /** * Retrieves this database's default transaction isolation level. The * possible values are defined in java.sql.Connection. * * *
*

HSQLDB-Specific Information

* * Default isolation mode in version 2.0 is TRANSACTION_READ_COMMITED. *
* * * @return the default isolation level * @exception SQLException if a database access error occurs * @see JDBCConnection */ public int getDefaultTransactionIsolation() throws SQLException { ResultSet rs = execute("CALL DATABASE_ISOLATION_LEVEL()"); rs.next(); String result = rs.getString(1); rs.close(); if (result.startsWith("READ COMMITTED")) { return Connection.TRANSACTION_READ_COMMITTED; } if (result.startsWith("READ UNCOMMITTED")) { return Connection.TRANSACTION_READ_UNCOMMITTED; } if (result.startsWith("SERIALIZABLE")) { return Connection.TRANSACTION_SERIALIZABLE; } return Connection.TRANSACTION_READ_COMMITTED; } /** * Retrieves whether this database supports transactions. If not, invoking the * method commit is a noop, and the isolation level is * TRANSACTION_NONE. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports transactions; * this method always returns true. *

* * @return true if transactions are supported; * false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsTransactions() throws SQLException { return true; } /** @todo update javadoc */ /** * Retrieves whether this database supports the given transaction isolation level. * * *
*

HSQLDB-Specific Information

* HSQLDB supports all levels. *
* * * * @param level one of the transaction isolation levels defined in * java.sql.Connection * @return true if so; false otherwise * @exception SQLException if a database access error occurs * @see JDBCConnection */ public boolean supportsTransactionIsolationLevel( int level) throws SQLException { return level == Connection.TRANSACTION_READ_UNCOMMITTED || level == Connection.TRANSACTION_READ_COMMITTED || level == Connection.TRANSACTION_REPEATABLE_READ || level == Connection.TRANSACTION_SERIALIZABLE; } /** * Retrieves whether this database supports both data definition and * data manipulation statements within a transaction. * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not support a mix of both data definition and * data manipulation statements within a transaction. DDL commits the * current transaction before proceding; * this method always returns false. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsDataDefinitionAndDataManipulationTransactions() throws SQLException { return false; } /** * Retrieves whether this database supports only data manipulation * statements within a transaction. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports only data manipulation * statements within a transaction. DDL commits the * current transaction before proceeding, while DML does not; * this method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean supportsDataManipulationTransactionsOnly() throws SQLException { return true; } /** * Retrieves whether a data definition statement within a transaction forces * the transaction to commit. * * *
*

HSQLDB-Specific Information:

* * Including 2.0, a data definition statement within a transaction forces * the transaction to commit; this method always returns true. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean dataDefinitionCausesTransactionCommit() throws SQLException { return true; } /** * Retrieves whether this database ignores a data definition statement * within a transaction. * * *
*

HSQLDB-Specific Information:

* * Including 2.0, a data definition statement is not ignored within a * transaction. Rather, a data definition statement within a * transaction forces the transaction to commit; this method * always returns false. *

* * * * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean dataDefinitionIgnoredInTransactions() throws SQLException { return false; } /** * Retrieves a description of the stored procedures available in the given * catalog. *

* Only procedure descriptions matching the schema and * procedure name criteria are returned. They are ordered by * JDBC 4.1[PROCEDURE_CAT,] PROCEDURE_SCHEM, * PROCEDURE_NAME and (new to JDBC4)[SPECIFIC_ NAME]. * *

Each procedure description has the the following columns: *

    *
  1. PROCEDURE_CAT String => procedure catalog (may be null) *
  2. PROCEDURE_SCHEM String => procedure schema (may be null) *
  3. PROCEDURE_NAME String => procedure name *
  4. reserved for future use * (HSQLDB-specific: NUM_INPUT_PARAMS) *
  5. reserved for future use * (HSQLDB-specific: NUM_OUTPUT_PARAMS) *
  6. reserved for future use * (HSQLDB-specific: NUM_RESULT_SETS) *
  7. REMARKS String => explanatory comment on the procedure *
  8. PROCEDURE_TYPE short => kind of procedure: *
      *
    • procedureResultUnknown - (JDBC4 clarification:) Cannot determine if a return value * will be returned *
    • procedureNoResult - (JDBC4 clarification:) Does not return a return value *
    • procedureReturnsResult - (JDBC4 clarification:) Returns a return value *
    *
  9. SPECIFIC_NAME String => (JDBC4 new:) The name which uniquely identifies this * procedure within its schema. *
*

* A user may not have permissions to execute any of the procedures that are * returned by getProcedures * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * In version 1.9, the rows returned by this method are based on rows in * the INFORMATION_SCHEMA.ROUTINES table. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schemaPattern a schema name pattern; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param procedureNamePattern a procedure name pattern; must match the * procedure name as it is stored in the database * @return ResultSet - each row is a procedure description * @exception SQLException if a database access error occurs * @see #getSearchStringEscape */ public ResultSet getProcedures( String catalog, String schemaPattern, String procedureNamePattern) throws SQLException { if (wantsIsNull(procedureNamePattern)) { return executeSelect("SYSTEM_PROCEDURES", "0=1"); } catalog = translateCatalog(catalog); schemaPattern = translateSchema(schemaPattern); StringBuffer select = toQueryPrefix("SYSTEM_PROCEDURES").append(and("PROCEDURE_CAT", "=", catalog)).append(and("PROCEDURE_SCHEM", "LIKE", schemaPattern)).append(and("PROCEDURE_NAME", "LIKE", procedureNamePattern)); // By default, query already returns the result ordered by // PROCEDURE_SCHEM, PROCEDURE_NAME... return execute(select.toString()); } /** * Indicates that it is not known whether the procedure returns * a result. *

* A possible value for column PROCEDURE_TYPE in the * ResultSet object returned by the method * getProcedures. */ // int procedureResultUnknown = 0; /** * Indicates that the procedure does not return a result. *

* A possible value for column PROCEDURE_TYPE in the * ResultSet object returned by the method * getProcedures. */ // int procedureNoResult = 1; /** * Indicates that the procedure returns a result. *

* A possible value for column PROCEDURE_TYPE in the * ResultSet object returned by the method * getProcedures. */ // int procedureReturnsResult = 2; /** * Retrieves a description of the given catalog's stored procedure parameter * and result columns. * *

Only descriptions matching the schema, procedure and * parameter name criteria are returned. They are ordered by * JDBC 4.1[PROCEDURE_CAT,] PROCEDURE_SCHEM, PROCEDURE_NAME and SPECIFIC_NAME. Within this, the return value, * if any, is first. Next are the parameter descriptions in call * order. The column descriptions follow in column number order. * *

Each row in the ResultSet is a parameter description or * column description with the following fields: *

    *
  1. PROCEDURE_CAT String => procedure catalog (may be null) *
  2. PROCEDURE_SCHEM String => procedure schema (may be null) *
  3. PROCEDURE_NAME String => procedure name *
  4. COLUMN_NAME String => column/parameter name *
  5. COLUMN_TYPE Short => kind of column/parameter: *
      *
    • procedureColumnUnknown - nobody knows *
    • procedureColumnIn - IN parameter *
    • procedureColumnInOut - INOUT parameter *
    • procedureColumnOut - OUT parameter *
    • procedureColumnReturn - procedure return value *
    • procedureColumnResult - result column in ResultSet *
    *
  6. DATA_TYPE int => SQL type from java.sql.Types *
  7. TYPE_NAME String => SQL type name, for a UDT type the * type name is fully qualified *
  8. PRECISION int => precision *
  9. LENGTH int => length in bytes of data *
  10. SCALE short => scale - null is returned for data types where * SCALE is not applicable. *
  11. RADIX short => radix *
  12. NULLABLE short => can it contain NULL. *
      *
    • procedureNoNulls - does not allow NULL values *
    • procedureNullable - allows NULL values *
    • procedureNullableUnknown - nullability unknown *
    *
  13. REMARKS String => comment describing parameter/column *
  14. COLUMN_DEF String => default value for the column, which should be interpreted as a string when the value is enclosed in single quotes (may be null) *
      *
    • The string NULL (not enclosed in quotes) - if NULL was specified as the default value *
    • TRUNCATE (not enclosed in quotes) - if the specified default value cannot be represented without truncation *
    • NULL - if a default value was not specified *
    *
  15. SQL_DATA_TYPE int => (JDBC4 new:) Reserved for future use * *

    HSQLDB-specific: CLI type from SQL 2003 Table 37, * tables 6-9 Annex A1, and/or addendums in other * documents, such as:
    * SQL 2003 Part 9: Management of External Data (SQL/MED) : DATALINK
    * SQL 2003 Part 14: XML-Related Specifications (SQL/XML) : XML

    * *

  16. SQL_DATETIME_SUB int => (JDBC4 new:) reserved for future use * *

    HSQLDB-specific: CLI SQL_DATETIME_SUB from SQL 2003 Table 37 * *

  17. CHAR_OCTET_LENGTH int => (JDBC4 new:) the maximum length of binary and character based columns. For any other datatype the returned value is a * NULL *
  18. ORDINAL_POSITION int => (JDBC4 new:) the ordinal position, starting from 1, for the input and output parameters for a procedure. A value of 0 * is returned if this row describes the procedure's return value. JDBC 4.1[For result set columns, it is the * ordinal position of the column in the result set starting from 1. If there are * multiple result sets, the column ordinal positions are implementation * defined.] *
  19. IS_NULLABLE String => ISO rules are used to determine the nullability for a column. *
      *
    • YES --- if the parameter or result column can include NULLs *
    • NO --- if the parameter or result column cannot include NULLs *
    • empty string --- if the nullability for the * parameter or result column is unknown *
    *
  20. SPECIFIC_NAME String => (JDBC4 new:) the name which uniquely identifies this procedure within its schema. *
* *

Note: Some databases may not return the column * descriptions for a procedure. Additional columns beyond (JDBC4 modified:) * SPECIFIC_NAME can be defined by the database and must be accessed by their column name. * *

(JDBC4 clarification:) *

The PRECISION column represents the specified column size for the given column. * For numeric data, this is the maximum precision. For character data, this is the [declared or implicit maximum] length in characters. * For datetime datatypes, this is the [maximum] length in characters of the String representation (assuming the * maximum allowed precision of the fractional seconds component). For binary data, this is the [maximum] length in bytes. For the ROWID datatype, * this is the length in bytes[, as returned by the implementation-specific java.sql.RowId.getBytes() method]. JDBC 4.1 Deleted[0] JDBC 4.1 Added[Null] is returned for data types where the * column size is not applicable. * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationFull}. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schemaPattern a schema name pattern; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param procedureNamePattern a procedure name pattern; must match the * procedure name as it is stored in the database * @param columnNamePattern a column name pattern; must match the column name * as it is stored in the database * @return ResultSet - each row describes a stored procedure parameter or * column * @exception SQLException if a database access error occurs * @see #getSearchStringEscape */ public ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException { if (wantsIsNull(procedureNamePattern) || wantsIsNull(columnNamePattern)) { return executeSelect("SYSTEM_PROCEDURECOLUMNS", "0=1"); } catalog = translateCatalog(catalog); schemaPattern = translateSchema(schemaPattern); StringBuffer select = toQueryPrefix("SYSTEM_PROCEDURECOLUMNS").append( and("PROCEDURE_CAT", "=", catalog)).append( and("PROCEDURE_SCHEM", "LIKE", schemaPattern)).append( and("PROCEDURE_NAME", "LIKE", procedureNamePattern)).append( and("COLUMN_NAME", "LIKE", columnNamePattern)); // By default, query already returns result ordered by // PROCEDURE_SCHEM and PROCEDURE_NAME... return execute(select.toString()); } /** * Retrieves a description of the tables available in the given catalog. * Only table descriptions matching the catalog, schema, table * name and type criteria are returned. They are ordered by * TABLE_TYPE, JDBC 4.1[TABLE_CAT,] * TABLE_SCHEM and TABLE_NAME. *

* Each table description has the following columns: *

    *
  1. TABLE_CAT String => table catalog (may be null) *
  2. TABLE_SCHEM String => table schema (may be null) *
  3. TABLE_NAME String => table name *
  4. TABLE_TYPE String => table type. Typical types are "TABLE", * "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", * "LOCAL TEMPORARY", "ALIAS", "SYNONYM". *
  5. REMARKS String => explanatory comment on the table *
  6. TYPE_CAT String => the types catalog (may be null) *
  7. TYPE_SCHEM String => the types schema (may be null) *
  8. TYPE_NAME String => type name (may be null) *
  9. SELF_REFERENCING_COL_NAME String => name of the designated * "identifier" column of a typed table (may be null) *
  10. REF_GENERATION String => specifies how values in * SELF_REFERENCING_COL_NAME are created. Values are * "SYSTEM", "USER", "DERIVED". (may be null) *
* *

Note: Some databases may not return information for * all tables. * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * HSQLDB returns extra information on TEXT tables in the REMARKS column.

* * HSQLDB includes the JDBC3 columns TYPE_CAT, TYPE_SCHEM, TYPE_NAME and * SELF_REFERENCING_COL_NAME in anticipation of JDBC3 compliant tools.

* * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schemaPattern a schema name pattern; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param tableNamePattern a table name pattern; must match the * table name as it is stored in the database * @param types a list of table types, which must be from the list of table types * returned from {@link #getTableTypes},to include; null returns * all types * @return ResultSet - each row is a table description * @exception SQLException if a database access error occurs * @see #getSearchStringEscape */ public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException { if (wantsIsNull(tableNamePattern) || (types != null && types.length == 0)) { return executeSelect("SYSTEM_TABLES", "0=1"); } catalog = translateCatalog(catalog); schemaPattern = translateSchema(schemaPattern); StringBuffer select = toQueryPrefix("SYSTEM_TABLES").append(and("TABLE_CAT", "=", catalog)).append(and("TABLE_SCHEM", "LIKE", schemaPattern)).append(and("TABLE_NAME", "LIKE", tableNamePattern)); if (types == null) { // do not use to narrow search } else { // JDBC4 clarification: // fredt - we shouldn't impose this test as it breaks compatibility with tools /* String[] allowedTypes = new String[] { "GLOBAL TEMPORARY", "SYSTEM TABLE", "TABLE", "VIEW" }; int illegalIndex = 0; String illegalType = null; outer_loop: for (int i = 0; i < types.length; i++) { for (int j = 0; j < allowedTypes.length; j++) { if (allowedTypes[j].equals(types[i])) { continue outer_loop; } } illegalIndex = i; illegalType = types[illegalIndex]; break; } if (illegalType != null) { throw Util.sqlException(Trace.JDBC_INVALID_ARGUMENT, "types[" + illegalIndex + "]=>\"" + illegalType + "\""); } */ // end JDBC4 clarification // select.append(" AND TABLE_TYPE IN (").append( StringUtil.getList(types, ",", "'")).append(')'); } // By default, query already returns result ordered by // TABLE_TYPE, TABLE_SCHEM and TABLE_NAME... return execute(select.toString()); } /** * Retrieves the schema names available in this database. The results * are ordered by JDBC 4.1[TABLE_CATALOG] and * TABLE_SCHEM. * *

The schema columns are: *

    *
  1. TABLE_SCHEM String => schema name *
  2. TABLE_CATALOG String => catalog name (may be null) *
* * *
*

HSQLDB-Specific Information:

* * Starting with 1.8.0, the list of schemas is returned. *

* * * @return a ResultSet object in which each row is a * schema description * @exception SQLException if a database access error occurs * */ public ResultSet getSchemas() throws SQLException { // By default, query already returns the result in contract order return executeSelect("SYSTEM_SCHEMAS", null); } /** * Retrieves the catalog names available in this database. The results * are ordered by catalog name. * *

The catalog column is: *

    *
  1. TABLE_CAT String => catalog name *
* * *
*

HSQLDB-Specific Information:

* * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @return a ResultSet object in which each row has a * single String column that is a catalog name * @exception SQLException if a database access error occurs */ public ResultSet getCatalogs() throws SQLException { String select = "SELECT CATALOG_NAME AS TABLE_CAT FROM INFORMATION_SCHEMA.INFORMATION_SCHEMA_CATALOG_NAME"; return execute(select); } /** * Retrieves the table types available in this database. The results * are ordered by table type. * *

The table type is: *

    *
  1. TABLE_TYPE String => table type. Typical types are "TABLE", * "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", * "LOCAL TEMPORARY", "ALIAS", "SYNONYM". *
* * *
*

HSQLDB-Specific Information:

* * Since 1.7.1, HSQLDB reports: "TABLE", "VIEW" and "GLOBAL TEMPORARY" * types. * * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @return a ResultSet object in which each row has a * single String column that is a table type * @exception SQLException if a database access error occurs */ public ResultSet getTableTypes() throws SQLException { // system table producer returns rows in contract order return executeSelect("SYSTEM_TABLETYPES", null); } /** * Retrieves a description of table columns available in * the specified catalog. * *

Only column descriptions matching the catalog, schema, table * and column name criteria are returned. They are ordered by * JDBC 4.1[TABLE_CAT, ]TABLE_SCHEM, * TABLE_NAME, and ORDINAL_POSITION. * *

Each column description has the following columns: *

    *
  1. TABLE_CAT String => table catalog (may be null) *
  2. TABLE_SCHEM String => table schema (may be null) *
  3. TABLE_NAME String => table name *
  4. COLUMN_NAME String => column name *
  5. DATA_TYPE int => SQL type from java.sql.Types *
  6. TYPE_NAME String => Data source dependent type name, * for a UDT the type name is fully qualified *
  7. COLUMN_SIZE int => column size. *
  8. BUFFER_LENGTH is not used. *
  9. DECIMAL_DIGITS int => the number of fractional digits. Null is returned for data types where * DECIMAL_DIGITS is not applicable. *
  10. NUM_PREC_RADIX int => Radix (typically either 10 or 2) *
  11. NULLABLE int => is NULL allowed. *
      *
    • columnNoNulls - might not allow NULL values *
    • columnNullable - definitely allows NULL values *
    • columnNullableUnknown - nullability unknown *
    *
  12. REMARKS String => comment describing column (may be null) *
  13. COLUMN_DEF String => (JDBC4 clarification:) default value for the column, which should be interpreted as a string when the value is enclosed in quotes (may be null) *
  14. SQL_DATA_TYPE int => unused * *

    HSQLDB-specific: CLI type from SQL 2003 Table 37, * tables 6-9 Annex A1, and/or addendums in other * documents, such as:
    * SQL 2003 Part 9: Management of External Data (SQL/MED) : DATALINK
    * SQL 2003 Part 14: XML-Related Specifications (SQL/XML) : XML

    * *

  15. SQL_DATETIME_SUB int => unused (HSQLDB-specific: SQL 2003 CLI datetime/interval subcode) *
  16. CHAR_OCTET_LENGTH int => for char types the * maximum number of bytes in the column *
  17. ORDINAL_POSITION int => index of column in table * (starting at 1) *
  18. IS_NULLABLE String => ISO rules are used to determine the nullability for a column. *
      *
    • YES --- if the column can include NULLs *
    • NO --- if the column cannot include NULLs *
    • empty string --- if the nullability for the * column is unknown *
    *
  19. JDBC 4.1 Deleted[SCOPE_CATLOG] JDBC 4.1 Added[SCOPE_CATALOG] String => catalog of table that is the scope * of a reference attribute (null if DATA_TYPE isn't REF) *
  20. SCOPE_SCHEMA String => schema of table that is the scope * of a reference attribute (null if the DATA_TYPE isn't REF) *
  21. SCOPE_TABLE String => table name that this the scope * of a reference attribute (null if the DATA_TYPE isn't REF) *
  22. SOURCE_DATA_TYPE short => source type of a distinct type or user-generated * Ref type, SQL type from java.sql.Types (null if DATA_TYPE * isn't DISTINCT or user-generated REF) *
  23. IS_AUTOINCREMENT String => Indicates whether this column is auto incremented *
      *
    • YES --- if the column is auto incremented *
    • NO --- if the column is not auto incremented *
    • empty string --- if it cannot be determined whether the column is auto incremented *
    * IS_GENERATEDCOLUMN String => Indicates whether this is a generated column *
      *
    • YES --- if this a generated column *
    • NO --- if this not a generated column *
    • empty string --- if it cannot be determined whether this is a generated column *
    *
* *

(JDBC4 clarification:) The COLUMN_SIZE column represents the specified column size for the given column. * For numeric data, this is the maximum precision. For character data, this is the [declared or implicit maximum] length in characters. * For datetime datatypes, this is the [maximum] length in characters of the String representation (assuming the * maximum allowed precision of the fractional seconds component). For binary data, this is the [maximum] length in bytes. For the ROWID datatype, * this is the length in bytes[, as returned by the implementation-specific java.sql.RowId.getBytes() method]. JDBC 4.1 Deleted[0] JDBC 4.1 Added[Null] is returned for data types where the * column size is not applicable.

* * *

*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * This feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schemaPattern a schema name pattern; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param tableNamePattern a table name pattern; must match the * table name as it is stored in the database * @param columnNamePattern a column name pattern; must match the column * name as it is stored in the database * @return ResultSet - each row is a column description * @exception SQLException if a database access error occurs * @see #getSearchStringEscape */ public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException { if (wantsIsNull(tableNamePattern) || wantsIsNull(columnNamePattern)) { return executeSelect("SYSTEM_COLUMNS", "0=1"); } catalog = translateCatalog(catalog); schemaPattern = translateSchema(schemaPattern); StringBuffer select = toQueryPrefix("SYSTEM_COLUMNS").append( and("TABLE_CAT", "=", catalog)).append( and("TABLE_SCHEM", "LIKE", schemaPattern)).append( and("TABLE_NAME", "LIKE", tableNamePattern)).append( and("COLUMN_NAME", "LIKE", columnNamePattern)); // by default, query already returns the result ordered // by TABLE_SCHEM, TABLE_NAME and ORDINAL_POSITION return execute(select.toString()); } /** * Retrieves a description of the access rights for a table's columns. * *

Only privileges matching the column name criteria are * returned. They are ordered by COLUMN_NAME and PRIVILEGE. * *

Each privilige description has the following columns: *

    *
  1. TABLE_CAT String => table catalog (may be null) *
  2. TABLE_SCHEM String => table schema (may be null) *
  3. TABLE_NAME String => table name *
  4. COLUMN_NAME String => column name *
  5. GRANTOR String => grantor of access (may be null) *
  6. GRANTEE String => grantee of access *
  7. PRIVILEGE String => name of access (SELECT, * INSERT, UPDATE, REFRENCES, ...) *
  8. IS_GRANTABLE String => "YES" if grantee is permitted * to grant to others; "NO" if not; null if unknown *
* * *
*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schema a schema name; must match the schema name as it is * stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param table a table name; must match the table name as it is * stored in the database * @param columnNamePattern a column name pattern; must match the column * name as it is stored in the database * @return ResultSet - each row is a column privilege description * @exception SQLException if a database access error occurs * @see #getSearchStringEscape */ public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) throws SQLException { if (table == null) { throw Util.nullArgument("table"); } /* if (wantsIsNull(columnNamePattern)) { return executeSelect("SYSTEM_COLUMNPRIVILEGES", "0=1"); } */ catalog = translateCatalog(catalog); schema = translateSchema(schema); String sql = "SELECT TABLE_CATALOG TABLE_CAT, TABLE_SCHEMA TABLE_SCHEM," + "TABLE_NAME, COLUMN_NAME, GRANTOR, GRANTEE, PRIVILEGE_TYPE PRIVILEGE, IS_GRANTABLE " + "FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES WHERE TRUE " + and("TABLE_CATALOG", "=", catalog) + and("TABLE_SCHEMA", "=", schema) + and("TABLE_NAME", "=", table) + and("COLUMN_NAME", "LIKE", columnNamePattern) ; // By default, the query already returns the result // ordered by column name, privilege... return execute(sql); } /** * Retrieves a description of the access rights for each table available * in a catalog. Note that a table privilege applies to one or * more columns in the table. It would be wrong to assume that * this privilege applies to all columns (this may be true for * some systems but is not true for all.) * *

Only privileges matching the schema and table name * criteria are returned. They are ordered by * JDBC 4.1[TABLE_CAT,] * TABLE_SCHEM, TABLE_NAME, * and PRIVILEGE. * *

Each privilege description has the following columns: *

    *
  1. TABLE_CAT String => table catalog (may be null) *
  2. TABLE_SCHEM String => table schema (may be null) *
  3. TABLE_NAME String => table name *
  4. GRANTOR String => grantor of access (may be null) *
  5. GRANTEE String => grantee of access *
  6. PRIVILEGE String => name of access (SELECT, * INSERT, UPDATE, REFRENCES, ...) *
  7. IS_GRANTABLE String => "YES" if grantee is permitted * to grant to others; "NO" if not; null if unknown *
* * *
*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schemaPattern a schema name pattern; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param tableNamePattern a table name pattern; must match the * table name as it is stored in the database * @return ResultSet - each row is a table privilege description * @exception SQLException if a database access error occurs * @see #getSearchStringEscape */ public ResultSet getTablePrivileges( String catalog, String schemaPattern, String tableNamePattern) throws SQLException { catalog = translateCatalog(catalog); schemaPattern = translateSchema(schemaPattern); String sql = "SELECT TABLE_CATALOG TABLE_CAT, TABLE_SCHEMA TABLE_SCHEM," + "TABLE_NAME, GRANTOR, GRANTEE, PRIVILEGE_TYPE PRIVILEGE, IS_GRANTABLE " + "FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE TRUE " + and("TABLE_CATALOG", "=", catalog) + and("TABLE_SCHEMA", "LIKE", schemaPattern) + and("TABLE_NAME", "LIKE", tableNamePattern); /* if (wantsIsNull(tableNamePattern)) { return executeSelect("SYSTEM_TABLEPRIVILEGES", "0=1"); } */ // By default, the query already returns a result ordered by // TABLE_SCHEM, TABLE_NAME, and PRIVILEGE... return execute(sql); } /** * Retrieves a description of a table's optimal set of columns that * uniquely identifies a row. They are ordered by SCOPE. * *

Each column description has the following columns: *

    *
  1. SCOPE short => actual scope of result *
      *
    • bestRowTemporary - very temporary, while using row *
    • bestRowTransaction - valid for remainder of current transaction *
    • bestRowSession - valid for remainder of current session *
    *
  2. COLUMN_NAME String => column name *
  3. DATA_TYPE int => SQL data type from java.sql.Types *
  4. TYPE_NAME String => Data source dependent type name, * for a UDT the type name is fully qualified *
  5. COLUMN_SIZE int => precision *
  6. BUFFER_LENGTH int => not used *
  7. DECIMAL_DIGITS short => scale - Null is returned for data types where * DECIMAL_DIGITS is not applicable. *
  8. PSEUDO_COLUMN short => is this a pseudo column * like an Oracle ROWID *
      *
    • bestRowUnknown - may or may not be pseudo column *
    • bestRowNotPseudo - is NOT a pseudo column *
    • bestRowPseudo - is a pseudo column *
    *
* *

(JDBC4 clarification:) *

The COLUMN_SIZE column represents the specified column size for the given column. * For numeric data, this is the maximum precision. For character data, this is the [declared or implicit maximum] length in characters. * For datetime datatypes, this is the [maximum] length in characters of the String representation (assuming the * maximum allowed precision of the fractional seconds component). For binary data, this is the [maximum] length in bytes. For the ROWID datatype, * this is the length in bytes[, as returned by the implementation-specific java.sql.RowId.getBytes() method]. JDBC 4.1 Deleted[0] JDBC 4.1 Added[Null] is returned for data types where the * column size is not applicable.

* * *

*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * If the name of a column is defined in the database without double * quotes, an all-uppercase name must be specified when calling this * method. Otherwise, the name must be specified in the exact case of * the column definition in the database.

* * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schema a schema name; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param table a table name; must match the table name as it is stored * in the database * @param scope the scope of interest; use same values as SCOPE * @param nullable include columns that are nullable. * @return ResultSet - each row is a column description * @exception SQLException if a database access error occurs */ public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) throws SQLException { if (table == null) { throw Util.nullArgument("table"); } String scopeIn; switch (scope) { case bestRowTemporary : scopeIn = BRI_TEMPORARY_SCOPE_IN_LIST; break; case bestRowTransaction : scopeIn = BRI_TRANSACTION_SCOPE_IN_LIST; break; case bestRowSession : scopeIn = BRI_SESSION_SCOPE_IN_LIST; break; default : throw Util.invalidArgument("scope"); } catalog = translateCatalog(catalog); schema = translateSchema(schema); Integer Nullable = (nullable) ? null : INT_COLUMNS_NO_NULLS; StringBuffer select = toQueryPrefix("SYSTEM_BESTROWIDENTIFIER").append(and("TABLE_CAT", "=", catalog)).append(and("TABLE_SCHEM", "=", schema)).append(and("TABLE_NAME", "=", table)).append(and("NULLABLE", "=", Nullable)).append(" AND SCOPE IN " + scopeIn); // By default, query already returns rows in contract order. // However, the way things are set up, there should never be // a result where there is > 1 distinct scope value: most requests // will want only one table and the system table producer (for // now) guarantees that a maximum of one BRI scope column set is // produced for each table return execute(select.toString()); } /** * Retrieves a description of a table's columns that are automatically * updated when any value in a row is updated. They are * unordered. * *

Each column description has the following columns: *

    *
  1. SCOPE short => is not used *
  2. COLUMN_NAME String => column name *
  3. DATA_TYPE int => SQL data type from java.sql.Types *
  4. TYPE_NAME String => Data source-dependent type name *
  5. COLUMN_SIZE int => precision *
  6. BUFFER_LENGTH int => length of column value in bytes *
  7. DECIMAL_DIGITS short => scale - Null is returned for data types where * DECIMAL_DIGITS is not applicable. *
  8. PSEUDO_COLUMN short => whether this is pseudo column * like an Oracle ROWID *
      *
    • versionColumnUnknown - may or may not be pseudo column *
    • versionColumnNotPseudo - is NOT a pseudo column *
    • versionColumnPseudo - is a pseudo column *
    *
* *

(JDBC4 clarification:) *

The COLUMN_SIZE column represents the specified column size for the given column. * For numeric data, this is the maximum precision. For character data, this is the [declared or implicit maximum] length in characters. * For datetime datatypes, this is the [maximum] length in characters of the String representation (assuming the * maximum allowed precision of the fractional seconds component). For binary data, this is the [maximum] length in bytes. For the ROWID datatype, * this is the length in bytes[, as returned by the implementation-specific java.sql.RowId.getBytes() method]. JDBC 4.1 Deleted[0], JDBC 4.1 Added[Null] is returned for data types where the * column size is not applicable. * * *

*

HSQLDB-Specific Information:

* * HSQLDB does not support version columns. This returns an empty result set. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schema a schema name; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param table a table name; must match the table name as it is stored * in the database * @return a ResultSet object in which each row is a * column description * @exception SQLException if a database access error occurs */ public ResultSet getVersionColumns(String catalog, String schema, String table) throws SQLException { if (table == null) { throw Util.nullArgument("table"); } catalog = translateCatalog(catalog); schema = translateSchema(schema); StringBuffer select = toQueryPrefix("SYSTEM_VERSIONCOLUMNS").append(and("TABLE_CAT", "=", catalog)).append(and("TABLE_SCHEM", "=", schema)).append(and("TABLE_NAME", "=", table)); // result does not need to be ordered return execute(select.toString()); } /** * Retrieves a description of the given table's primary key columns. They * are ordered by COLUMN_NAME. * *

Each primary key column description has the following columns: *

    *
  1. TABLE_CAT String => table catalog (may be null) *
  2. TABLE_SCHEM String => table schema (may be null) *
  3. TABLE_NAME String => table name *
  4. COLUMN_NAME String => column name *
  5. KEY_SEQ short => (JDBC4 Clarification:) sequence number within primary key( a value * of 1 represents the first column of the primary key, a value of 2 would * represent the second column within the primary key). *
  6. PK_NAME String => primary key name (may be null) *
* * *
*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schema a schema name; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param table a table name; must match the table name as it is stored * in the database * @return ResultSet - each row is a primary key column description * @exception SQLException if a database access error occurs * @see #supportsMixedCaseQuotedIdentifiers * @see #storesUpperCaseIdentifiers */ public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException { if (table == null) { throw Util.nullArgument("table"); } catalog = translateCatalog(catalog); schema = translateSchema(schema); StringBuffer select = toQueryPrefix("SYSTEM_PRIMARYKEYS").append(and("TABLE_CAT", "=", catalog)).append(and("TABLE_SCHEM", "=", schema)).append(and("TABLE_NAME", "=", table)); // By default, query already returns result in contract order return execute(select.toString()); } /** * Retrieves a description of the primary key columns that are * referenced by the given table's foreign key columns (the primary keys * imported by a table). They are ordered by PKTABLE_CAT, * PKTABLE_SCHEM, PKTABLE_NAME, and KEY_SEQ. * *

Each primary key column description has the following columns: *

    *
  1. PKTABLE_CAT String => primary key table catalog * being imported (may be null) *
  2. PKTABLE_SCHEM String => primary key table schema * being imported (may be null) *
  3. PKTABLE_NAME String => primary key table name * being imported *
  4. PKCOLUMN_NAME String => primary key column name * being imported *
  5. FKTABLE_CAT String => foreign key table catalog (may be null) *
  6. FKTABLE_SCHEM String => foreign key table schema (may be null) *
  7. FKTABLE_NAME String => foreign key table name *
  8. FKCOLUMN_NAME String => foreign key column name *
  9. KEY_SEQ short => (JDBC4 clarification) sequence number within a foreign key (a value * of 1 represents the first column of the foreign key, a value of 2 would * represent the second column within the foreign key). *
  10. UPDATE_RULE short => What happens to a * foreign key when the primary key is updated: *
      *
    • importedNoAction - do not allow update of primary * key if it has been imported *
    • importedKeyCascade - change imported key to agree * with primary key update *
    • importedKeySetNull - change imported key to NULL * if its primary key has been updated *
    • importedKeySetDefault - change imported key to default values * if its primary key has been updated *
    • importedKeyRestrict - same as importedKeyNoAction * (for ODBC 2.x compatibility) *
    *
  11. DELETE_RULE short => What happens to * the foreign key when primary is deleted. *
      *
    • importedKeyNoAction - do not allow delete of primary * key if it has been imported *
    • importedKeyCascade - delete rows that import a deleted key *
    • importedKeySetNull - change imported key to NULL if * its primary key has been deleted *
    • importedKeyRestrict - same as importedKeyNoAction * (for ODBC 2.x compatibility) *
    • importedKeySetDefault - change imported key to default if * its primary key has been deleted *
    *
  12. FK_NAME String => foreign key name (may be null) *
  13. PK_NAME String => primary key name (may be null) *
  14. DEFERRABILITY short => can the evaluation of foreign key * constraints be deferred until commit *
      *
    • importedKeyInitiallyDeferred - see SQL92 for definition *
    • importedKeyInitiallyImmediate - see SQL92 for definition *
    • importedKeyNotDeferrable - see SQL92 for definition *
    *
* * *
*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schema a schema name; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param table a table name; must match the table name as it is stored * in the database * @return ResultSet - each row is a primary key column description * @exception SQLException if a database access error occurs * @see #getExportedKeys * @see #supportsMixedCaseQuotedIdentifiers * @see #storesUpperCaseIdentifiers */ public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException { if (table == null) { throw Util.nullArgument("table"); } catalog = translateCatalog(catalog); schema = translateSchema(schema); StringBuffer select = toQueryPrefix("SYSTEM_CROSSREFERENCE").append( and("FKTABLE_CAT", "=", catalog)).append( and("FKTABLE_SCHEM", "=", schema)).append( and("FKTABLE_NAME", "=", table)).append( " ORDER BY PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME, KEY_SEQ"); return execute(select.toString()); } /** * Retrieves a description of the foreign key columns that reference the * given table's primary key columns (the foreign keys exported by a * table). They are ordered by FKTABLE_CAT, FKTABLE_SCHEM, * FKTABLE_NAME, and KEY_SEQ. * *

Each foreign key column description has the following columns: *

    *
  1. PKTABLE_CAT String => primary key table catalog (may be null) *
  2. PKTABLE_SCHEM String => primary key table schema (may be null) *
  3. PKTABLE_NAME String => primary key table name *
  4. PKCOLUMN_NAME String => primary key column name *
  5. FKTABLE_CAT String => foreign key table catalog (may be null) * being exported (may be null) *
  6. FKTABLE_SCHEM String => foreign key table schema (may be null) * being exported (may be null) *
  7. FKTABLE_NAME String => foreign key table name * being exported *
  8. FKCOLUMN_NAME String => foreign key column name * being exported *
  9. KEY_SEQ short => (JDBC4 clarification:) sequence number within foreign key( a value * of 1 represents the first column of the foreign key, a value of 2 would * represent the second column within the foreign key). *
  10. UPDATE_RULE short => What happens to * foreign key when primary is updated: *
      *
    • importedNoAction - do not allow update of primary * key if it has been imported *
    • importedKeyCascade - change imported key to agree * with primary key update *
    • importedKeySetNull - change imported key to NULL if * its primary key has been updated *
    • importedKeySetDefault - change imported key to default values * if its primary key has been updated *
    • importedKeyRestrict - same as importedKeyNoAction * (for ODBC 2.x compatibility) *
    *
  11. DELETE_RULE short => What happens to * the foreign key when primary is deleted. *
      *
    • importedKeyNoAction - do not allow delete of primary * key if it has been imported *
    • importedKeyCascade - delete rows that import a deleted key *
    • importedKeySetNull - change imported key to NULL if * its primary key has been deleted *
    • importedKeyRestrict - same as importedKeyNoAction * (for ODBC 2.x compatibility) *
    • importedKeySetDefault - change imported key to default if * its primary key has been deleted *
    *
  12. FK_NAME String => foreign key name (may be null) *
  13. PK_NAME String => primary key name (may be null) *
  14. DEFERRABILITY short => can the evaluation of foreign key * constraints be deferred until commit *
      *
    • importedKeyInitiallyDeferred - see SQL92 for definition *
    • importedKeyInitiallyImmediate - see SQL92 for definition *
    • importedKeyNotDeferrable - see SQL92 for definition *
    *
* * *
*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in this database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schema a schema name; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param table a table name; must match the table name as it is stored * in this database * @return a ResultSet object in which each row is a * foreign key column description * @exception SQLException if a database access error occurs * @see #getImportedKeys * @see #supportsMixedCaseQuotedIdentifiers * @see #storesUpperCaseIdentifiers */ public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException { if (table == null) { throw Util.nullArgument("table"); } catalog = translateCatalog(catalog); schema = translateSchema(schema); StringBuffer select = toQueryPrefix("SYSTEM_CROSSREFERENCE").append(and("PKTABLE_CAT", "=", catalog)).append(and("PKTABLE_SCHEM", "=", schema)).append(and("PKTABLE_NAME", "=", table)); // By default, query already returns the table ordered by // FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, and KEY_SEQ. return execute(select.toString()); } /** * (JDBC4 clarification:) * Retrieves a description of the foreign key columns in the given foreign key * table that reference the primary key or the columns representing a unique constraint of the parent table (could be the same or a different table). * The number of columns returned from the parent table must match the number of * columns that make up the foreign key. They * are ordered by FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, and * KEY_SEQ. * *

Each foreign key column description has the following columns: *

    *
  1. PKTABLE_CAT String => parent key table catalog (may be null) *
  2. PKTABLE_SCHEM String => parent key table schema (may be null) *
  3. PKTABLE_NAME String => parent key table name *
  4. PKCOLUMN_NAME String => parent key column name *
  5. FKTABLE_CAT String => foreign key table catalog (may be null) * being exported (may be null) *
  6. FKTABLE_SCHEM String => foreign key table schema (may be null) * being exported (may be null) *
  7. FKTABLE_NAME String => foreign key table name * being exported *
  8. FKCOLUMN_NAME String => foreign key column name * being exported *
  9. KEY_SEQ short => sequence number within foreign key( a value * of 1 represents the first column of the foreign key, a value of 2 would * represent the second column within the foreign key). *
  10. UPDATE_RULE short => What happens to * foreign key when parent key is updated: *
      *
    • importedNoAction - do not allow update of parent * key if it has been imported *
    • importedKeyCascade - change imported key to agree * with parent key update *
    • importedKeySetNull - change imported key to NULL if * its parent key has been updated *
    • importedKeySetDefault - change imported key to default values * if its parent key has been updated *
    • importedKeyRestrict - same as importedKeyNoAction * (for ODBC 2.x compatibility) *
    *
  11. DELETE_RULE short => What happens to * the foreign key when parent key is deleted. *
      *
    • importedKeyNoAction - do not allow delete of parent * key if it has been imported *
    • importedKeyCascade - delete rows that import a deleted key *
    • importedKeySetNull - change imported key to NULL if * its primary key has been deleted *
    • importedKeyRestrict - same as importedKeyNoAction * (for ODBC 2.x compatibility) *
    • importedKeySetDefault - change imported key to default if * its parent key has been deleted *
    *
  12. FK_NAME String => foreign key name (may be null) *
  13. PK_NAME String => parent key name (may be null) *
  14. DEFERRABILITY short => can the evaluation of foreign key * constraints be deferred until commit *
      *
    • importedKeyInitiallyDeferred - see SQL92 for definition *
    • importedKeyInitiallyImmediate - see SQL92 for definition *
    • importedKeyNotDeferrable - see SQL92 for definition *
    *
* * *
*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @param parentCatalog a catalog name; must match the catalog name * as it is stored in the database; "" retrieves those without a * catalog; null means drop catalog name from the selection criteria * @param parentSchema a schema name; must match the schema name as * it is stored in the database; "" retrieves those without a schema; * null means drop schema name from the selection criteria * @param parentTable the name of the table that exports the key; must match * the table name as it is stored in the database * @param foreignCatalog a catalog name; must match the catalog name as * it is stored in the database; "" retrieves those without a * catalog; null means drop catalog name from the selection criteria * @param foreignSchema a schema name; must match the schema name as it * is stored in the database; "" retrieves those without a schema; * null means drop schema name from the selection criteria * @param foreignTable the name of the table that imports the key; must match * the table name as it is stored in the database * @return ResultSet - each row is a foreign key column description * @exception SQLException if a database access error occurs * @see #getImportedKeys * @see #supportsMixedCaseQuotedIdentifiers * @see #storesUpperCaseIdentifiers */ public ResultSet getCrossReference( String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException { if (parentTable == null) { throw Util.nullArgument("parentTable"); } if (foreignTable == null) { throw Util.nullArgument("foreignTable"); } parentCatalog = translateCatalog(parentCatalog); foreignCatalog = translateCatalog(foreignCatalog); parentSchema = translateSchema(parentSchema); foreignSchema = translateSchema(foreignSchema); StringBuffer select = toQueryPrefix("SYSTEM_CROSSREFERENCE").append(and("PKTABLE_CAT", "=", parentCatalog)).append(and("PKTABLE_SCHEM", "=", parentSchema)).append(and("PKTABLE_NAME", "=", parentTable)).append(and("FKTABLE_CAT", "=", foreignCatalog)).append(and("FKTABLE_SCHEM", "=", foreignSchema)).append(and("FKTABLE_NAME", "=", foreignTable)); // by default, query already returns the table ordered by // FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, and KEY_SEQ. return execute(select.toString()); } /** * Retrieves a description of all the (JDBC4 clarification:) data types supported by * this database. They are ordered by DATA_TYPE and then by how * closely the data type maps to the corresponding JDBC SQL type. * *

(JDBC4 clarification:) If the database supports SQL distinct types, then getTypeInfo() will return * a single row with a TYPE_NAME of DISTINCT and a DATA_TYPE of Types.DISTINCT. * If the database supports SQL structured types, then getTypeInfo() will return * a single row with a TYPE_NAME of STRUCT and a DATA_TYPE of Types.STRUCT. * *

(JDBC4 clarification:) *

If SQL distinct or structured types are supported, then information on the * individual types may be obtained from the getUDTs() method. * * *

Each type description has the following columns: *

    *
  1. TYPE_NAME String => Type name *
  2. DATA_TYPE int => SQL data type from java.sql.Types *
  3. PRECISION int => maximum precision *
  4. LITERAL_PREFIX String => prefix used to quote a literal * (may be null) *
  5. LITERAL_SUFFIX String => suffix used to quote a literal * (may be null) *
  6. CREATE_PARAMS String => parameters used in creating * the type (may be null) *
  7. NULLABLE short => can you use NULL for this type. *
      *
    • typeNoNulls - does not allow NULL values *
    • typeNullable - allows NULL values *
    • typeNullableUnknown - nullability unknown *
    *
  8. CASE_SENSITIVE boolean=> is it case sensitive. *
  9. SEARCHABLE short => can you use "WHERE" based on this type: *
      *
    • typePredNone - No support *
    • typePredChar - Only supported with WHERE .. LIKE *
    • typePredBasic - Supported except for WHERE .. LIKE *
    • typeSearchable - Supported for all WHERE .. *
    *
  10. UNSIGNED_ATTRIBUTE boolean => is it unsigned. *
  11. FIXED_PREC_SCALE boolean => can it be a money value. *
  12. AUTO_INCREMENT boolean => can it be used for an * auto-increment value. *
  13. LOCAL_TYPE_NAME String => localized version of type name * (may be null) *
  14. MINIMUM_SCALE short => minimum scale supported *
  15. MAXIMUM_SCALE short => maximum scale supported *
  16. SQL_DATA_TYPE int => unused *
  17. SQL_DATETIME_SUB int => unused *
  18. NUM_PREC_RADIX int => usually 2 or 10 *
* *

(JDBC4 clarification:) The PRECISION column represents the maximum column size that the server supports for the given datatype. * For numeric data, this is the maximum precision. For character data, this is the [maximum] length in characters. * For datetime datatypes, this is the [maximum] length in characters of the String representation (assuming the * maximum allowed precision of the fractional seconds component). For binary data, this is the [maximum] length in bytes. For the ROWID datatype, * this is the length in bytes[, as returned by the implementation-specific java.sql.RowId.getBytes() method]. JDBC 4.1 Deleted[0] JDBC 4.1 Added[Null] is returned for data types where the * column size is not applicable. * * *

*

HSQLDB-Specific Information:

* * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @return a ResultSet object in which each row is an SQL * type description * @exception SQLException if a database access error occurs */ public ResultSet getTypeInfo() throws SQLException { // system table producer returns rows in contract order return executeSelect("SYSTEM_TYPEINFO", null); } /** * Retrieves a description of the given table's indices and statistics. They are * ordered by NON_UNIQUE, TYPE, INDEX_NAME, and ORDINAL_POSITION. * *

Each index column description has the following columns: *

    *
  1. TABLE_CAT String => table catalog (may be null) *
  2. TABLE_SCHEM String => table schema (may be null) *
  3. TABLE_NAME String => table name *
  4. NON_UNIQUE boolean => Can index values be non-unique. * false when TYPE is tableIndexStatistic *
  5. INDEX_QUALIFIER String => index catalog (may be null); * null when TYPE is tableIndexStatistic *
  6. INDEX_NAME String => index name; null when TYPE is * tableIndexStatistic *
  7. TYPE short => index type: *
      *
    • tableIndexStatistic - this identifies table statistics that are * returned in conjuction with a table's index descriptions *
    • tableIndexClustered - this is a clustered index *
    • tableIndexHashed - this is a hashed index *
    • tableIndexOther - this is some other style of index *
    *
  8. ORDINAL_POSITION short => column sequence number * within index; zero when TYPE is tableIndexStatistic *
  9. COLUMN_NAME String => column name; null when TYPE is * tableIndexStatistic *
  10. ASC_OR_DESC String => column sort sequence, "A" => ascending, * "D" => descending, may be null if sort sequence is not supported; * null when TYPE is tableIndexStatistic *
  11. CARDINALITY int => When TYPE is tableIndexStatistic, then * this is the number of rows in the table; otherwise, it is the * number of unique values in the index. *
  12. PAGES int => When TYPE is tableIndexStatisic then * this is the number of pages used for the table, otherwise it * is the number of pages used for the current index. *
  13. FILTER_CONDITION String => Filter condition, if any. * (may be null) *
* * *
*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * Since 1.7.2, this feature is supported by default. If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in this database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schema a schema name; must match the schema name * as it is stored in this database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param table a table name; must match the table name as it is stored * in this database * @param unique when true, return only indices for unique values; * when false, return indices regardless of whether unique or not * @param approximate when true, result is allowed to reflect approximate * or out of data values; when false, results are requested to be * accurate * @return ResultSet - each row is an index column description * @exception SQLException if a database access error occurs * @see #supportsMixedCaseQuotedIdentifiers * @see #storesUpperCaseIdentifiers */ public ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException { if (table == null) { throw Util.nullArgument("table"); } catalog = translateCatalog(catalog); schema = translateSchema(schema); Boolean nu = (unique) ? Boolean.FALSE : null; StringBuffer select = toQueryPrefix("SYSTEM_INDEXINFO").append(and("TABLE_CAT", "=", catalog)).append(and("TABLE_SCHEM", "=", schema)).append(and("TABLE_NAME", "=", table)).append(and("NON_UNIQUE", "=", nu)); // By default, this query already returns the table ordered by // NON_UNIQUE, TYPE, INDEX_NAME, and ORDINAL_POSITION... return execute(select.toString()); } //--------------------------JDBC 2.0----------------------------- /** * Retrieves whether this database supports the given result set type. * * @param type defined in java.sql.ResultSet * @return true if so; false otherwise * @exception SQLException if a database access error occurs * @see JDBCConnection * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public boolean supportsResultSetType(int type) throws SQLException { return (type == JDBCResultSet.TYPE_FORWARD_ONLY || type == JDBCResultSet.TYPE_SCROLL_INSENSITIVE); } /** * Retrieves whether this database supports the given concurrency type * in combination with the given result set type. * * @param type defined in java.sql.ResultSet * @param concurrency type defined in java.sql.ResultSet * @return true if so; false otherwise * @exception SQLException if a database access error occurs * @see JDBCConnection * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public boolean supportsResultSetConcurrency(int type, int concurrency) throws SQLException { return supportsResultSetType(type) && (concurrency == JDBCResultSet.CONCUR_READ_ONLY || concurrency == JDBCResultSet.CONCUR_UPDATABLE); } /** * * Retrieves whether for the given type of ResultSet object, * the result set's own updates are visible. * * *
*

HSQLDB-Specific Information:

* Updates to ResultSet rows are not visible after moving from the updated * row. *

* * @param type the ResultSet type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @return true if updates are visible for the given result set type; * false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public boolean ownUpdatesAreVisible(int type) throws SQLException { return false; } /** * Retrieves whether a result set's own deletes are visible. * * *
*

HSQLDB-Specific Information:

* * Rows deleted from the ResultSet are still visible after moving from the * deleted row. *

* * @param type the ResultSet type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @return true if deletes are visible for the given result set type; * false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public boolean ownDeletesAreVisible(int type) throws SQLException { return false; } /** * Retrieves whether a result set's own inserts are visible. * * *
*

HSQLDB-Specific Information:

* * Rows added to a ResultSet are not visible after moving from the * insert row; this method always returns false. *

* * @param type the ResultSet type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @return true if inserts are visible for the given result set type; * false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public boolean ownInsertsAreVisible(int type) throws SQLException { return false; } /** * Retrieves whether updates made by others are visible. * * *
*

HSQLDB-Specific Information:

* * Updates made by other connections or the same connection while the * ResultSet is open are not visible in the ResultSet. *

* * @param type the ResultSet type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @return true if updates made by others * are visible for the given result set type; * false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public boolean othersUpdatesAreVisible(int type) throws SQLException { return false; } /** * Retrieves whether deletes made by others are visible. * * *
*

HSQLDB-Specific Information:

* * Deletes made by other connections or the same connection while the * ResultSet is open are not visible in the ResultSet. *

* * @param type the ResultSet type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @return true if deletes made by others * are visible for the given result set type; * false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public boolean othersDeletesAreVisible(int type) throws SQLException { return false; } /** * Retrieves whether inserts made by others are visible. * * *
*

HSQLDB-Specific Information:

* * Inserts made by other connections or the same connection while the * ResultSet is open are not visible in the ResultSet. *

* * @param type the ResultSet type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @return true if inserts made by others * are visible for the given result set type; * false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public boolean othersInsertsAreVisible(int type) throws SQLException { return false; } /** * Retrieves whether or not a visible row update can be detected by * calling the method ResultSet.rowUpdated. * * *
*

HSQLDB-Specific Information:

* * Updates made to the rows of the ResultSet are not detected by * calling the ResultSet.rowUpdated. *

* * @param type the ResultSet type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @return true if changes are detected by the result set type; * false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public boolean updatesAreDetected(int type) throws SQLException { return false; } /** * Retrieves whether or not a visible row delete can be detected by * calling the method ResultSet.rowDeleted. If the method * deletesAreDetected returns false, it means that * deleted rows are removed from the result set. * * *
*

HSQLDB-Specific Information:

* * Deletes made to the rows of the ResultSet are not detected by * calling the ResultSet.rowDeleted. *

* * * * @param type the ResultSet type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @return true if deletes are detected by the given result set type; * false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public boolean deletesAreDetected(int type) throws SQLException { return false; } /** * Retrieves whether or not a visible row insert can be detected * by calling the method ResultSet.rowInserted. * * *
*

HSQLDB-Specific Information:

* * Inserts made into the ResultSet are not visible and thus not detected by * calling the ResultSet.rowInserted. *

* * @param type the ResultSet type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @return true if changes are detected by the specified result * set type; false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public boolean insertsAreDetected(int type) throws SQLException { return false; } /** * Retrieves whether this database supports batch updates. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports batch updates; * this method always returns true. *

* * @return true if this database supports batch upcates; * false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public boolean supportsBatchUpdates() throws SQLException { return true; } /** * Retrieves a description of the user-defined types (UDTs) defined * in a particular schema. Schema-specific UDTs may have type * JAVA_OBJECT, STRUCT, * or DISTINCT. * *

Only types matching the catalog, schema, type name and type * criteria are returned. They are ordered by DATA_TYPE, * JDBC 4.1[TYPE_CAT,] TYPE_SCHEM and * TYPE_NAME. The type name parameter may be a fully-qualified * name. In this case, the catalog and schemaPattern parameters are * ignored. * *

Each type description has the following columns: *

    *
  1. TYPE_CAT String => the type's catalog (may be null) *
  2. TYPE_SCHEM String => type's schema (may be null) *
  3. TYPE_NAME String => type name *
  4. CLASS_NAME String => Java class name *
  5. DATA_TYPE int => type value defined in java.sql.Types. * One of JAVA_OBJECT, STRUCT, or DISTINCT *
  6. REMARKS String => explanatory comment on the type *
  7. BASE_TYPE short => type code of the source type of a * DISTINCT type or the type that implements the user-generated * reference type of the SELF_REFERENCING_COLUMN of a structured * type as defined in java.sql.Types (null if DATA_TYPE is not * DISTINCT or not STRUCT with REFERENCE_GENERATION = USER_DEFINED) *
* *

Note: If the driver does not support UDTs, an empty * result set is returned. * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * Starting with 2.0, DISTICT types are supported and are reported by this * method. *

* * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schemaPattern a schema pattern name; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param typeNamePattern a type name pattern; must match the type name * as it is stored in the database; may be a fully qualified name * @param types a list of user-defined types (JAVA_OBJECT, * STRUCT, or DISTINCT) to include; null returns all types * @return ResultSet object in which each row describes a UDT * @exception SQLException if a database access error occurs * @see #getSearchStringEscape (JDBC4 clarification) * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) throws SQLException { if (wantsIsNull(typeNamePattern) || (types != null && types.length == 0)) { executeSelect("SYSTEM_UDTS", "0=1"); } catalog = translateCatalog(catalog); schemaPattern = translateSchema(schemaPattern); StringBuffer select = toQueryPrefix("SYSTEM_UDTS").append(and("TYPE_CAT", "=", catalog)).append(and("TYPE_SCHEM", "LIKE", schemaPattern)).append(and("TYPE_NAME", "LIKE", typeNamePattern)); if (types == null) { // do not use to narrow search } else { select.append(" AND DATA_TYPE IN (").append( StringUtil.getList(types, ",", "")).append(')'); } // By default, the query already returns a result ordered by // DATA_TYPE, TYPE_SCHEM, and TYPE_NAME... return execute(select.toString()); } /** * Retrieves the connection that produced this metadata object. *

* @return the connection that produced this metadata object * @exception SQLException if a database access error occurs * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCDatabaseMetaData) */ public Connection getConnection() throws SQLException { return connection; } // ------------------- JDBC 3.0 ------------------------- /** * Retrieves whether this database supports savepoints. * * *

*

HSQLDB-Specific Information:

* * Beginning with 1.7.2, this SQL feature is supported * through JDBC as well as SQL.

* *

* * @return true if savepoints are supported; * false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public boolean supportsSavepoints() throws SQLException { return true; } //#endif JAVA4 /** * Retrieves whether this database supports named parameters to callable * statements. * * *
*

HSQLDB-Specific Information:

* * Starting with 1.7.2, HSQLDB supports JDBC named parameters to * callable statements; this method returns true.

* *

* * @return true if named parameters are supported; * false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public boolean supportsNamedParameters() throws SQLException { return true; } //#endif JAVA4 /** * Retrieves whether it is possible to have multiple ResultSet objects * returned from a CallableStatement object * simultaneously. * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports multiple ResultSet * objects returned from a CallableStatement; * this method always returns true.

*

* * @return true if a CallableStatement object * can return multiple ResultSet objects * simultaneously; false otherwise * @exception SQLException if a datanase access error occurs * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public boolean supportsMultipleOpenResults() throws SQLException { return true; } //#endif JAVA4 /** * Retrieves whether auto-generated keys can be retrieved after * a statement has been executed * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports retrieval of * autogenerated keys through the JDBC interface; * this method always returns true.

*

* * @return true if auto-generated keys can be retrieved * after a statement has executed; false otherwise *

(JDBC4 Clarification:) *

If true is returned, the JDBC driver must support the * returning of auto-generated keys for at least SQL INSERT statements *

* @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public boolean supportsGetGeneratedKeys() throws SQLException { return true; } //#endif JAVA4 /** * Retrieves a description of the user-defined type (UDT) hierarchies defined in a * particular schema in this database. Only the immediate super type * sub type relationship is modeled. *

* Only supertype information for UDTs matching the catalog, * schema, and type name is returned. The type name parameter * may be a fully-qualified name. When the UDT name supplied is a * fully-qualified name, the catalog and schemaPattern parameters are * ignored. *

* If a UDT does not have a direct super type, it is not listed here. * A row of the ResultSet object returned by this method * describes the designated UDT and a direct supertype. A row has the following * columns: *

    *
  1. TYPE_CAT String => the UDT's catalog (may be null) *
  2. TYPE_SCHEM String => UDT's schema (may be null) *
  3. TYPE_NAME String => type name of the UDT *
  4. SUPERTYPE_CAT String => the direct super type's catalog * (may be null) *
  5. SUPERTYPE_SCHEM String => the direct super type's schema * (may be null) *
  6. SUPERTYPE_NAME String => the direct super type's name *
* *

Note: If the driver does not support type hierarchies, an * empty result set is returned. * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports the SQL Standard. It treats unquoted identifiers as * case insensitive in SQL and stores * them in upper case; it treats quoted identifiers as case sensitive and * stores them verbatim. All JDBCDatabaseMetaData methods perform * case-sensitive comparison between name (pattern) arguments and the * corresponding identifier values as they are stored in the database. * Therefore, care must be taken to specify name arguments precisely * (including case) as they are stored in the database.

* * From 2.0, this feature is supported by default and return supertypes * for DOMAIN and DISTINCT types.

* * If the jar is * compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is * not supported. The default implementation is * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @param catalog a catalog name; "" retrieves those without a catalog; * null means drop catalog name from the selection criteria * @param schemaPattern a schema name pattern; "" retrieves those * without a schema * @param typeNamePattern a UDT name pattern; may be a fully-qualified * name * @return a ResultSet object in which a row gives information * about the designated UDT * @throws SQLException if a database access error occurs * @see #getSearchStringEscape (JDBC4 clarification) * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public ResultSet getSuperTypes( String catalog, String schemaPattern, String typeNamePattern) throws SQLException { if (wantsIsNull(typeNamePattern)) { return executeSelect("SYSTEM_SUPERTYPES", "0=1"); } catalog = translateCatalog(catalog); schemaPattern = translateSchema(schemaPattern); StringBuffer select = toQueryPrefixNoSelect( "SELECT * FROM (SELECT USER_DEFINED_TYPE_CATALOG, USER_DEFINED_TYPE_SCHEMA, USER_DEFINED_TYPE_NAME," + "CAST (NULL AS INFORMATION_SCHEMA.SQL_IDENTIFIER), CAST (NULL AS INFORMATION_SCHEMA.SQL_IDENTIFIER), DATA_TYPE " + "FROM INFORMATION_SCHEMA.USER_DEFINED_TYPES " + "UNION SELECT DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME,NULL,NULL, DATA_TYPE " + "FROM INFORMATION_SCHEMA.DOMAINS) " + "AS SUPERTYPES(TYPE_CAT, TYPE_SCHEM, TYPE_NAME, SUPERTYPE_CAT, SUPERTYPE_SCHEM, SUPERTYPE_NAME) ").append( and("TYPE_CAT", "=", catalog)).append( and("TYPE_SCHEM", "LIKE", schemaPattern)).append( and("TYPE_NAME", "LIKE", typeNamePattern)); return execute(select.toString()); } //#endif JAVA4 /** * Retrieves a description of the table hierarchies defined in a particular * schema in this database. * *

Only supertable information for tables matching the catalog, schema * and table name are returned. The table name parameter may be a fully- * qualified name, in which case, the catalog and schemaPattern parameters * are ignored. If a table does not have a super table, it is not listed here. * Supertables have to be defined in the same catalog and schema as the * sub tables. Therefore, the type description does not need to include * this information for the supertable. * *

Each type description has the following columns: *

    *
  1. TABLE_CAT String => the type's catalog (may be null) *
  2. TABLE_SCHEM String => type's schema (may be null) *
  3. TABLE_NAME String => type name *
  4. SUPERTABLE_NAME String => the direct super type's name *
* *

Note: If the driver does not support type hierarchies, an * empty result set is returned. * * *

*

HSQLDB-Specific Information:

* * This method is intended for tables of structured types. * From 2.0 this method returns an empty ResultSet. * {@link org.hsqldb.dbinfo.DatabaseInformationMain}. *

* * * @param catalog a catalog name; "" retrieves those without a catalog; * null means drop catalog name from the selection criteria * @param schemaPattern a schema name pattern; "" retrieves those * without a schema * @param tableNamePattern a table name pattern; may be a fully-qualified * name * @return a ResultSet object in which each row is a type description * @throws SQLException if a database access error occurs * @see #getSearchStringEscape (JDBC4 clarification) * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public ResultSet getSuperTables( String catalog, String schemaPattern, String tableNamePattern) throws SQLException { // query with no result StringBuffer select = toQueryPrefixNoSelect( "SELECT TABLE_NAME AS TABLE_CAT, TABLE_NAME AS TABLE_SCHEM, TABLE_NAME, TABLE_NAME AS SUPERTABLE_NAME " + "FROM INFORMATION_SCHEMA.TABLES ").append( and("TABLE_NAME", "=", "")); return execute(select.toString()); } //#endif JAVA4 /** * Retrieves a description of the given attribute of the given type * for a user-defined type (UDT) that is available in the given schema * and catalog. *

* Descriptions are returned only for attributes of UDTs matching the * catalog, schema, type, and attribute name criteria. They are ordered by * JDBC 4.1[TYPE_CAT, ]TYPE_SCHEM, * TYPE_NAME and ORDINAL_POSITION. This description * does not contain inherited attributes. *

* The ResultSet object that is returned has the following * columns: *

    *
  1. TYPE_CAT String => type catalog (may be null) *
  2. TYPE_SCHEM String => type schema (may be null) *
  3. TYPE_NAME String => type name *
  4. ATTR_NAME String => attribute name *
  5. DATA_TYPE int => attribute type SQL type from java.sql.Types *
  6. ATTR_TYPE_NAME String => Data source dependent type name. * For a UDT, the type name is fully qualified. For a REF, the type name is * fully qualified and represents the target type of the reference type. *
  7. ATTR_SIZE int => column size. For char or date * types this is the maximum number of characters; for numeric or * decimal types this is precision. *
  8. DECIMAL_DIGITS int => the number of fractional digits. Null is returned for data types where * DECIMAL_DIGITS is not applicable. *
  9. NUM_PREC_RADIX int => Radix (typically either 10 or 2) *
  10. NULLABLE int => whether NULL is allowed *
      *
    • attributeNoNulls - might not allow NULL values *
    • attributeNullable - definitely allows NULL values *
    • attributeNullableUnknown - nullability unknown *
    *
  11. REMARKS String => comment describing column (may be null) *
  12. ATTR_DEF String => default value (may be null) *
  13. SQL_DATA_TYPE int => unused *
  14. SQL_DATETIME_SUB int => unused *
  15. CHAR_OCTET_LENGTH int => for char types the * maximum number of bytes in the column *
  16. ORDINAL_POSITION int => index of JDBC 4.1 correction[the attribute in the UDT] * (starting at 1) *
  17. IS_NULLABLE String => ISO rules are used to determine * the nullability for a column. *
      *
    • YES --- if the JDBC 4.1 correction[attribute] can include NULLs *
    • NO --- if the JDBC 4.1 correction[attribute] cannot include NULLs *
    • empty string --- if the nullability for the * JDBC 4.1 correction[attribute] is unknown *
    *
  18. SCOPE_CATALOG String => catalog of table that is the * scope of a reference attribute (null if DATA_TYPE isn't REF) *
  19. SCOPE_SCHEMA String => schema of table that is the * scope of a reference attribute (null if DATA_TYPE isn't REF) *
  20. SCOPE_TABLE String => table name that is the scope of a * reference attribute (null if the DATA_TYPE isn't REF) *
  21. SOURCE_DATA_TYPE short => source type of a distinct type or user-generated * Ref type,SQL type from java.sql.Types (null if DATA_TYPE * isn't DISTINCT or user-generated REF) *
* * *
*

HSQLDB-Specific Information:

* * This method is intended for attributes of structured types. * From 2.0 this method returns an empty ResultSet. *

* * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schemaPattern a schema name pattern; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param typeNamePattern a type name pattern; must match the * type name as it is stored in the database * @param attributeNamePattern an attribute name pattern; must match the attribute * name as it is declared in the database * @return a ResultSet object in which each row is an * attribute description * @exception SQLException if a database access error occurs * @see #getSearchStringEscape * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public ResultSet getAttributes( String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern) throws SQLException { StringBuffer select = toQueryPrefixNoSelect( "SELECT TABLE_NAME AS TYPE_CAT, TABLE_NAME AS TYPE_SCHME, TABLE_NAME AS TYPE_NAME, " + "TABLE_NAME AS ATTR_NAME, CAST(0 AS INTEGER) AS DATA_TYPE, TABLE_NAME AS ATTR_TYPE_NAME, " + "CAST(0 AS INTEGER) AS ATTR_SIZE, CAST(0 AS INTEGER) AS DECIMAL_DIGITS, " + "CAST(0 AS INTEGER) AS NUM_PREC_RADIX, CAST(0 AS INTEGER) AS NULLABLE, " + "'' AS REMARK, '' AS ATTR_DEF, CAST(0 AS INTEGER) AS SQL_DATA_TYPE, " + "CAST(0 AS INTEGER) AS SQL_DATETIME_SUB, CAST(0 AS INTEGER) AS CHAR_OCTECT_LENGTH, " + "CAST(0 AS INTEGER) AS ORDINAL_POSITION, '' AS NULLABLE, " + "'' AS SCOPE_CATALOG, '' AS SCOPE_SCHEMA, '' AS SCOPE_TABLE, " + "CAST(0 AS SMALLINT) AS SCOPE_DATA_TYPE " + "FROM INFORMATION_SCHEMA.TABLES ").append( and("TABLE_NAME", "=", "")); return execute(select.toString()); } //#endif JAVA4 /** * Retrieves whether this database supports the given result set holdability. * * *
*

HSQLDB-Specific Information:

* * HSQLDB returns true for both alternatives.

* *

* * @param holdability one of the following constants: * ResultSet.HOLD_CURSORS_OVER_COMMIT or * ResultSet.CLOSE_CURSORS_AT_COMMIT * @return true if so; false otherwise * @exception SQLException if a database access error occurs * @see JDBCConnection * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public boolean supportsResultSetHoldability( int holdability) throws SQLException { return holdability == JDBCResultSet.HOLD_CURSORS_OVER_COMMIT || holdability == JDBCResultSet.CLOSE_CURSORS_AT_COMMIT; } //#endif JAVA4 /** * (JDBC4 clarification:) * Retrieves this database's default holdability for ResultSet * objects. * * *
*

HSQLDB-Specific Information:

* * HSQLDB defaults to HOLD_CURSORS_OVER_COMMIT for CONSUR_READ_ONLY * ResultSet objects. * If the ResultSet concurrency is CONCUR_UPDATABLE, then holdability is * is enforced as CLOSE_CURSORS_AT_COMMIT.

* *

* * * @return the default holdability; either * ResultSet.HOLD_CURSORS_OVER_COMMIT or * ResultSet.CLOSE_CURSORS_AT_COMMIT * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public int getResultSetHoldability() throws SQLException { return JDBCResultSet.HOLD_CURSORS_OVER_COMMIT; } //#endif JAVA4 /** * Retrieves the major version number of the underlying database. * * *
*

HSQLDB-Specific Information:

* Returns the major version *

* * @return the underlying database's major version * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public int getDatabaseMajorVersion() throws SQLException { ResultSet rs = execute("call database_version()"); rs.next(); String v = rs.getString(1); rs.close(); return Integer.parseInt(v.substring(0, v.indexOf("."))); } //#endif JAVA4 /** * Retrieves the minor version number of the underlying database. * * *
*

HSQLDB-Specific Information:

* * This returns the digit after the first point in version. *

* * @return underlying database's minor version * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public int getDatabaseMinorVersion() throws SQLException { ResultSet rs = execute("call database_version()"); rs.next(); String v = rs.getString(1); rs.close(); int start = v.indexOf(".") + 1; return Integer.parseInt(v.substring(start, v.indexOf(".", start))); } //#endif JAVA4 /** * Retrieves the major JDBC version number for this * driver. * * *
*

HSQLDB-Specific Information:

*

* * * @return JDBC version major number * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public int getJDBCMajorVersion() throws SQLException { return JDBC_MAJOR; } //#endif JAVA4 /** * Retrieves the minor JDBC version number for this * driver. * * *
*

HSQLDB-Specific Information:

*

* * @return JDBC version minor number * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public int getJDBCMinorVersion() throws SQLException { return 0; } //#endif JAVA4 /** * (JDBC4 modified:) * Indicates whether the SQLSTATE returned by SQLException.getSQLState * is X/Open (now known as Open Group) SQL CLI or SQL:2003. * * *
*

HSQLDB-Specific Information:

* * HSQLDB returns sqlStateSQL under JDBC4 which is equivalent * to JDBC3 value of sqlStateSQL99.

*

* * @return the type of SQLSTATE; one of: * sqlStateXOpen or * sqlStateSQL * *

sqlStateSQL is new in JDBC4 and its value is the same as JDBC3 sqlStateSQL99 * @throws SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public int getSQLStateType() throws SQLException { return sqlStateSQL99; } //#endif JAVA4 /** * Indicates whether updates made to a LOB are made on a copy or directly * to the LOB. * * *

*

HSQLDB-Specific Information:

* * Updates to a LOB are made directly. This means the lobs in an updatable * ResultSet can be updated and the change is applied when the updateRow() * method is applied. Lobs created by calling the Connection methods * createClob() and createBlob() can be updated. The lob can then be sent to * the database in a PreparedStatement with an UPDATE or INSERT SQL * statement. * *

* * * @return true if updates are made to a copy of the LOB; * false if updates are made directly to the LOB * @throws SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public boolean locatorsUpdateCopy() throws SQLException { return false; } //#endif JAVA4 /** * Retrieves whether this database supports statement pooling. * * *
*

HSQLDB-Specific Information:

* * Starting with 2.0, HSQLDB supports statement pooling when built under * JDK 1.6+.

*

* * * @return true if so; false otherwise * @throws SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public boolean supportsStatementPooling() throws SQLException { return (JDBC_MAJOR >= 4); } //#endif JAVA4 //------------------------- JDBC 4.0 ----------------------------------- /** * Indicates whether or not this data source supports the SQL ROWID type, * and if so the lifetime for which a RowId object remains valid. *

* The returned int values have the following relationship: *

     *     ROWID_UNSUPPORTED < ROWID_VALID_OTHER < ROWID_VALID_TRANSACTION
     *         < ROWID_VALID_SESSION < ROWID_VALID_FOREVER
     * 
* so conditional logic such as *
     *     if (metadata.getRowIdLifetime() > DatabaseMetaData.ROWID_VALID_TRANSACTION)
     * 
* can be used. Valid Forever means valid across all Sessions, and valid for * a Session means valid across all its contained Transactions. * * @return the status indicating the lifetime of a RowId * @throws SQLException if a database access error occurs * @since JDK 1.6, HSQLDB 1.9 */ //#ifdef JAVA6 public RowIdLifetime getRowIdLifetime() throws SQLException { return RowIdLifetime.ROWID_UNSUPPORTED; } //#endif JAVA6 /** * Retrieves the schema names available in this database. The results * are ordered by JDBC 4.1[TABLE_CATALOG] and * TABLE_SCHEM. * *

The schema columns are: *

    *
  1. TABLE_SCHEM String => schema name *
  2. TABLE_CATALOG String => catalog name (may be null) *
* * * @param catalog a catalog name; must match the catalog name as it is stored * in the database;"" retrieves those without a catalog; null means catalog * name should not be used to narrow down the search. * @param schemaPattern a schema name; must match the schema name as it is * stored in the database; null means * schema name should not be used to narrow down the search. * @return a ResultSet object in which each row is a * schema description * @exception SQLException if a database access error occurs * @see #getSearchStringEscape * @since JDK 1.6, HSQLDB 1.9 */ //#ifdef JAVA6 public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException { StringBuffer select = toQueryPrefix("SYSTEM_SCHEMAS").append(and("TABLE_CATALOG", "=", catalog)).append(and("TABLE_SCHEM", "LIKE", schemaPattern)); // By default, query already returns result in contract order return execute(select.toString()); } //#endif JAVA6 /** * Retrieves whether this database supports invoking user-defined or vendor functions * using the stored procedure escape syntax. * * @return true if so; false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.6, HSQLDB 1.9 */ //#ifdef JAVA6 public boolean supportsStoredFunctionsUsingCallSyntax() throws SQLException { return true; } //#endif JAVA6 /** @todo */ /** * Retrieves whether a SQLException while autoCommit is true inidcates * that all open ResultSets are closed, even ones that are holdable. When a SQLException occurs while * autocommit is true, it is vendor specific whether the JDBC driver responds with a commit operation, a * rollback operation, or by doing neither a commit nor a rollback. A potential result of this difference * is in whether or not holdable ResultSets are closed. * * @return true if so; false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.6, HSQLDB 1.9 */ //#ifdef JAVA6 public boolean autoCommitFailureClosesAllResultSets() throws SQLException { return false; } //#endif JAVA6 /** * Retrieves a list of the client info properties * that the driver supports. The result set contains the following columns *

*

    *
  1. NAME String=> The name of the client info property
    *
  2. MAX_LEN int=> The maximum length of the value for the property
    *
  3. DEFAULT_VALUE String=> The default value of the property
    *
  4. DESCRIPTION String=> A description of the property. This will typically * contain information as to where this property is * stored in the database. *
*

* The ResultSet is sorted by the NAME column *

* @return A ResultSet object; each row is a supported client info * property *

* @exception SQLException if a database access error occurs *

* @since JDK 1.6, HSQLDB 1.9 */ //#ifdef JAVA6 public ResultSet getClientInfoProperties() throws SQLException { String s = "SELECT * FROM INFORMATION_SCHEMA.SYSTEM_CONNECTION_PROPERTIES"; return execute(s); } //#endif JAVA6 /** * Retrieves a description of the JDBC 4.1[ system and ]user functions available * in the given catalog. *

* Only system and user function descriptions matching the schema and * function name criteria are returned. They are ordered by * FUNCTION_CAT, FUNCTION_SCHEM, * FUNCTION_NAME and * SPECIFIC_ NAME. * *

Each function description has the the following columns: *

    *
  1. FUNCTION_CAT String => function catalog (may be null) *
  2. FUNCTION_SCHEM String => function schema (may be null) *
  3. FUNCTION_NAME String => function name. This is the name * used to invoke the function *
  4. REMARKS String => explanatory comment on the function *
  5. FUNCTION_TYPE short => kind of function: *
      *
    • functionResultUnknown - Cannot determine if a return value * or table will be returned *
    • functionNoTable- Does not return a table *
    • functionReturnsTable - Returns a table *
    *
  6. SPECIFIC_NAME String => the name which uniquely identifies * this function within its schema. This is a user specified, or DBMS * generated, name that may be different then the FUNCTION_NAME * for example with overload functions *
*

* A user may not have permission to execute any of the functions that are * returned by getFunctions * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schemaPattern a schema name pattern; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param functionNamePattern a function name pattern; must match the * function name as it is stored in the database * @return ResultSet - each row is a function description * @exception SQLException if a database access error occurs * @see #getSearchStringEscape * @since JDK 1.6, HSQLDB 1.9 */ //#ifdef JAVA6 public ResultSet getFunctions( String catalog, String schemaPattern, String functionNamePattern) throws SQLException { StringBuffer sb = new StringBuffer(256); sb.append("select ").append( "sp.procedure_cat as FUNCTION_CAT,").append( "sp.procedure_schem as FUNCTION_SCHEM,").append( "sp.procedure_name as FUNCTION_NAME,").append( "sp.remarks as REMARKS,").append("1 as FUNCTION_TYPE,").append( "sp.specific_name as SPECIFIC_NAME ").append( "from information_schema.system_procedures sp ").append( "where sp.procedure_type = 2 "); if (wantsIsNull(functionNamePattern)) { return execute(sb.append("and 1=0").toString()); } schemaPattern = translateSchema(schemaPattern); sb.append(and("sp.procedure_cat", "=", catalog)).append(and("sp.procedure_schem", "LIKE", schemaPattern)).append(and("sp.procedure_name", "LIKE", functionNamePattern)); // By default, query already returns the result ordered by // FUNCTION_SCHEM, FUNCTION_NAME... return execute(sb.toString()); } //#endif JAVA6 /** * Retrieves a description of the given catalog's system or user * function parameters and return type. * *

Only descriptions matching the schema, function and * parameter name criteria are returned. They are ordered by * FUNCTION_CAT, FUNCTION_SCHEM, * FUNCTION_NAME and * SPECIFIC_ NAME. Within this, the return value, * if any, is first. Next are the parameter descriptions in call * order. The column descriptions follow in column number order. * *

Each row in the ResultSet * is a parameter description, column description or * return type description with the following fields: *

    *
  1. FUNCTION_CAT String => function catalog (may be null) *
  2. FUNCTION_SCHEM String => function schema (may be null) *
  3. FUNCTION_NAME String => function name. This is the name * used to invoke the function *
  4. COLUMN_NAME String => column/parameter name *
  5. COLUMN_TYPE Short => kind of column/parameter: *
      *
    • functionColumnUnknown - nobody knows *
    • functionColumnIn - IN parameter *
    • functionColumnInOut - INOUT parameter *
    • functionColumnOut - OUT parameter *
    • functionColumnReturn - function return value *
    • functionColumnResult - Indicates that the parameter or column * is a column in the ResultSet *
    *
  6. DATA_TYPE int => SQL type from java.sql.Types *
  7. TYPE_NAME String => SQL type name, for a UDT type the * type name is fully qualified *
  8. PRECISION int => precision *
  9. LENGTH int => length in bytes of data *
  10. SCALE short => scale - null is returned for data types where * SCALE is not applicable. *
  11. RADIX short => radix *
  12. NULLABLE short => can it contain NULL. *
      *
    • functionNoNulls - does not allow NULL values *
    • functionNullable - allows NULL values *
    • functionNullableUnknown - nullability unknown *
    *
  13. REMARKS String => comment describing column/parameter *
  14. CHAR_OCTET_LENGTH int => the maximum length of binary * and character based parameters or columns. For any other datatype the returned value * is a NULL *
  15. ORDINAL_POSITION int => the ordinal position, starting * from 1, for the input and output parameters. A value of 0 * is returned if this row describes the function's return value. * For result set columns, it is the * ordinal position of the column in the result set starting from 1. *
  16. IS_NULLABLE String => ISO rules are used to determine * the nullability for a parameter or column. *
      *
    • YES --- if the parameter or column can include NULLs *
    • NO --- if the parameter or column cannot include NULLs *
    • empty string --- if the nullability for the * parameter or column is unknown *
    *
  17. SPECIFIC_NAME String => the name which uniquely identifies * this function within its schema. This is a user specified, or DBMS * generated, name that may be different then the FUNCTION_NAME * for example with overload functions *
* *

The PRECISION column represents the specified column size for the given * parameter or column. * For numeric data, this is the maximum precision. For character data, this is the length in characters. * For datetime datatypes, this is the length in characters of the String representation (assuming the * maximum allowed precision of the fractional seconds component). For binary data, this is the length in bytes. For the ROWID datatype, * this is the length in bytes. Null is returned for data types where the * column size is not applicable. * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schemaPattern a schema name pattern; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param functionNamePattern a procedure name pattern; must match the * function name as it is stored in the database * @param columnNamePattern a parameter name pattern; must match the * parameter or column name as it is stored in the database * @return ResultSet - each row describes a * user function parameter, column or return type * * @exception SQLException if a database access error occurs * @see #getSearchStringEscape * @since JDK 1.6, HSQLDB 1.9 */ //#ifdef JAVA6 public ResultSet getFunctionColumns( String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) throws SQLException { StringBuffer sb = new StringBuffer(256); sb.append("select pc.procedure_cat as FUNCTION_CAT,").append( "pc.procedure_schem as FUNCTION_SCHEM,").append( "pc.procedure_name as FUNCTION_NAME,").append( "pc.column_name as COLUMN_NAME,").append( "case pc.column_type").append(" when 3 then 5").append( " when 4 then 3").append(" when 5 then 4").append( " else pc.column_type").append(" end as COLUMN_TYPE,").append( "pc.DATA_TYPE,").append("pc.TYPE_NAME,").append( "pc.PRECISION,").append("pc.LENGTH,").append("pc.SCALE,").append( "pc.RADIX,").append("pc.NULLABLE,").append("pc.REMARKS,").append( "pc.CHAR_OCTET_LENGTH,").append("pc.ORDINAL_POSITION,").append( "pc.IS_NULLABLE,").append("pc.SPECIFIC_NAME,").append( "case pc.column_type").append(" when 3 then 1").append( " else 0").append(" end AS COLUMN_GROUP ").append( "from information_schema.system_procedurecolumns pc ").append( "join (select procedure_schem,").append("procedure_name,").append( "specific_name ").append( "from information_schema.system_procedures ").append( "where procedure_type = 2) p ").append( "on pc.procedure_schem = p.procedure_schem ").append( "and pc.procedure_name = p.procedure_name ").append( "and pc.specific_name = p.specific_name ").append( "and ((pc.column_type = 3 and pc.column_name = '@p0') ").append( "or ").append("(pc.column_type <> 3)) "); if (wantsIsNull(functionNamePattern) || wantsIsNull(columnNamePattern)) { return execute(sb.append("where 1=0").toString()); } schemaPattern = translateSchema(schemaPattern); sb.append("where 1=1 ").append( and("pc.procedure_cat", "=", catalog)).append( and("pc.procedure_schem", "LIKE", schemaPattern)).append( and("pc.procedure_name", "LIKE", functionNamePattern)).append( and("pc.column_name", "LIKE", columnNamePattern)).append( " order by 1, 2, 3, 17, 18 , 15"); // Order by FUNCTION_CAT, FUNCTION_SCHEM, FUNCTION_NAME, SPECIFIC_NAME // COLUMN_GROUP and ORDINAL_POSITION return execute(sb.toString()); } //#endif JAVA6 /** * Returns an object that implements the given interface to allow access to non-standard methods, * or standard methods not exposed by the proxy. * The result may be either the object found to implement the interface or a proxy for that object. * If the receiver implements the interface then that is the object. If the receiver is a wrapper * and the wrapped object implements the interface then that is the object. Otherwise the object is * the result of calling unwrap recursively on the wrapped object. If the receiver is not a * wrapper and does not implement the interface, then an SQLException is thrown. * * @param iface A Class defining an interface that the result must implement. * @return an object that implements the interface. May be a proxy for the actual implementing object. * @throws java.sql.SQLException If no object found that implements the interface * @since JDK 1.6, HSQLDB 1.9 */ //#ifdef JAVA6 @SuppressWarnings("unchecked") public T unwrap(java.lang.Class iface) throws java.sql.SQLException { if (isWrapperFor(iface)) { return (T) this; } throw Util.invalidArgument("iface: " + iface); } //#endif JAVA6 /** * Returns true if this either implements the interface argument or is directly or indirectly a wrapper * for an object that does. Returns false otherwise. If this implements the interface then return true, * else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped * object. If this does not implement the interface and is not a wrapper, return false. * This method should be implemented as a low-cost operation compared to unwrap so that * callers can use this method to avoid expensive unwrap calls that may fail. If this method * returns true then calling unwrap with the same argument should succeed. * * @param iface a Class defining an interface. * @return true if this implements the interface or directly or indirectly wraps an object that does. * @throws java.sql.SQLException if an error occurs while determining whether this is a wrapper * for an object with the given interface. * @since JDK 1.6, HSQLDB 1.9 */ //#ifdef JAVA6 public boolean isWrapperFor( java.lang.Class iface) throws java.sql.SQLException { return (iface != null && iface.isAssignableFrom(this.getClass())); } //#endif JAVA6 //--------------------------JDBC 4.1 ----------------------------- /** * Retrieves a description of the pseudo or hidden columns available * in a given table within the specified catalog and schema. * Pseudo or hidden columns may not always be stored within * a table and are not visible in a ResultSet unless they are * specified in the query's outermost SELECT list. Pseudo or hidden * columns may not necessarily be able to be modified. If there are * no pseudo or hidden columns, an empty ResultSet is returned. * *

Only column descriptions matching the catalog, schema, table * and column name criteria are returned. They are ordered by * TABLE_CAT,TABLE_SCHEM, TABLE_NAME * and COLUMN_NAME. * *

Each column description has the following columns: *

    *
  1. TABLE_CAT String => table catalog (may be null) *
  2. TABLE_SCHEM String => table schema (may be null) *
  3. TABLE_NAME String => table name *
  4. COLUMN_NAME String => column name *
  5. DATA_TYPE int => SQL type from java.sql.Types *
  6. COLUMN_SIZE int => column size. *
  7. DECIMAL_DIGITS int => the number of fractional digits. Null is returned for data types where * DECIMAL_DIGITS is not applicable. *
  8. NUM_PREC_RADIX int => Radix (typically either 10 or 2) *
  9. COLUMN_USAGE String => The allowed usage for the column. The * value returned will correspond to the enum name returned by {@link java.sql.PseudoColumnUsage#name PseudoColumnUsage.name()} *
  10. REMARKS String => comment describing column (may be null) *
  11. CHAR_OCTET_LENGTH int => for char types the * maximum number of bytes in the column *
  12. IS_NULLABLE String => ISO rules are used to determine the nullability for a column. *
      *
    • YES --- if the column can include NULLs *
    • NO --- if the column cannot include NULLs *
    • empty string --- if the nullability for the column is unknown *
    *
* *

The COLUMN_SIZE column specifies the column size for the given column. * For numeric data, this is the maximum precision. For character data, this is the length in characters. * For datetime datatypes, this is the length in characters of the String representation (assuming the * maximum allowed precision of the fractional seconds component). For binary data, this is the length in bytes. For the ROWID datatype, * this is the length in bytes. Null is returned for data types where the * column size is not applicable. * * @param catalog a catalog name; must match the catalog name as it * is stored in the database; "" retrieves those without a catalog; * null means that the catalog name should not be used to narrow * the search * @param schemaPattern a schema name pattern; must match the schema name * as it is stored in the database; "" retrieves those without a schema; * null means that the schema name should not be used to narrow * the search * @param tableNamePattern a table name pattern; must match the * table name as it is stored in the database * @param columnNamePattern a column name pattern; must match the column * name as it is stored in the database * @return ResultSet - each row is a column description * @exception SQLException if a database access error occurs * @see java.sql.PseudoColumnUsage * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ public ResultSet getPseudoColumns( String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException { throw Util.notSupported(); } /** * Retrieves whether a generated key will always be returned if the column * name(s) or index(es) specified for the auto generated key column(s) * are valid and the statement succeeds. The key that is returned may or * may not be based on the column(s) for the auto generated key. * Consult your JDBC driver documentation for additional details. * @return true if so; false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ public boolean generatedKeyAlwaysReturned() throws SQLException { return true; } //----------------------- Internal Implementation -------------------------- /** Used by getBestRowIdentifier to avoid extra object construction */ static final Integer INT_COLUMNS_NO_NULLS = new Integer(columnNoNulls); // ----------------------------------------------------------------------- // private attributes // ----------------------------------------------------------------------- /** * The connection this object uses to retrieve database instance-specific * metadata. */ private JDBCConnection connection; /** * Connection property for schema reporting. */ final private boolean useSchemaDefault; /** * A CSV list representing the SQL IN list to use when generating * queries for getBestRowIdentifier when the * scope argument is bestRowSession. * @since HSQLDB 1.7.2 */ private static final String BRI_SESSION_SCOPE_IN_LIST = "(" + bestRowSession + ")"; /** * A CSV list representing the SQL IN list to use when generating * queries for getBestRowIdentifier when the * scope argument is bestRowTemporary. * @since HSQLDB 1.7.2 */ private static final String BRI_TEMPORARY_SCOPE_IN_LIST = "(" + bestRowTemporary + "," + bestRowTransaction + "," + bestRowSession + ")"; /** * A CSV list representing the SQL IN list to use when generating * queries for getBestRowIdentifier when the * scope argument is bestRowTransaction. * @since HSQLDB 1.7.2 */ private static final String BRI_TRANSACTION_SCOPE_IN_LIST = "(" + bestRowTransaction + "," + bestRowSession + ")"; /** * "SELECT * FROM ".

* * This attribute is in support of methods that use SQL SELECT statements to * generate returned ResultSet objects.

* * @since HSQLDB 1.7.2 */ private static final String selstar = "SELECT * FROM INFORMATION_SCHEMA."; /** * " WHERE TRUE ".

* * This attribute is in support of methods that use SQL SELECT statements to * generate returned ResultSet objects.

* * A good optimizer will simply drop this when parsing a condition * expression. And it makes our code much easier to write, since we don't * have to check our "WHERE" clause productions as strictly for proper * conjunction: we just stick additional conjunctive predicates on the * end of this and Presto! Everything works :-)

* @since HSQLDB 1.7.2 */ private static final String whereTrue = " WHERE TRUE"; //#ifdef JAVA6 public static final int JDBC_MAJOR = 4; //#else /* public static final int JDBC_MAJOR = 3; */ //#endif JAVA6 /** * Constructs a new JDBCDatabaseMetaData object using the * specified connection. This contructor is used by JDBCConnection * when producing a DatabaseMetaData object from a call to * {@link JDBCConnection#getMetaData() getMetaData}. * @param c the connection this object will use to retrieve * instance-specific metadata * @throws SQLException never - reserved for future use */ JDBCDatabaseMetaData(JDBCConnection c) throws SQLException { // PRE: is non-null and not closed connection = c; useSchemaDefault = c.isInternal ? false : c.connProperties .isPropertyTrue(HsqlDatabaseProperties .url_default_schema); } /** * Retrieves an "AND" predicate based on the (column) id, * op(erator) andval(ue) arguments to be * included in an SQL "WHERE" clause, using the conventions laid out for * JDBC DatabaseMetaData filter parameter values.

* * @return an "AND" predicate built from the arguments * @param id the simple, non-quoted identifier of a system table * column upon which to filter.

* * No checking is done for column name validity.
* It is assumed the system table column name is correct.

* * @param op the conditional operation to perform using the system table * column name value and the val argument.

* * @param val an object representing the value to use in some conditional * operation, op, between the column identified by the id argument * and this argument.

* *

    *
  • null causes the empty string to be returned.

    * *

  • toString().length() == 0 causes the returned expression * to be built so that the IS NULL operation will occur * against the specified column.

    * *

  • instanceof String causes the returned expression to be * built so that the specified operation will occur between * the specified column and the specified value, converted to * an SQL string (single quoted, with internal single quotes * escaped by doubling). If op is "LIKE" and * val does not contain any "%" or "_" wild * card characters, then op is silently * converted to "=".

    * *

  • !instanceof String causes an expression to built so that * the specified operation will occur between the specified * column and String.valueOf(val).

    * *

*/ private static String and(String id, String op, Object val) { // The JDBC standard for pattern arguments seems to be: // // - pass null to mean ignore (do not include in query), // - pass "" to mean filter on IS NULL, // - pass "%" to filter on IS NOT NULL. // - pass sequence with "%" and "_" for wildcard matches // - when searching on values reported directly from DatabaseMetaData // results, typically an exact match is desired. In this case, it // is the client's responsibility to escape any reported "%" and "_" // characters using whatever DatabaseMetaData returns from // getSearchEscapeString(). In our case, this is the standard escape // character: '\'. Typically, '%' will rarely be encountered, but // certainly '_' is to be expected on a regular basis. // - checkme: what about the (silly) case where an identifier // has been declared such as: 'create table "xxx\_yyy"(...)'? // Must the client still escape the Java string like this: // "xxx\\\\_yyy"? // Yes: because otherwise the driver is expected to // construct something like: // select ... where ... like 'xxx\_yyy' escape '\' // which will try to match 'xxx_yyy', not 'xxx\_yyy' // Testing indicates that indeed, higher quality popular JDBC // database browsers do the escapes "properly." if (val == null) { return ""; } StringBuffer sb = new StringBuffer(); boolean isStr = (val instanceof String); if (isStr && ((String) val).length() == 0) { return sb.append(" AND ").append(id).append(" IS NULL").toString(); } String v = isStr ? Type.SQL_VARCHAR.convertToSQLString(val) : String.valueOf(val); sb.append(" AND ").append(id).append(' '); // add the escape to like if required if (isStr && "LIKE".equalsIgnoreCase(op)) { if (v.indexOf('_') < 0 && v.indexOf('%') < 0) { // then we can optimize. sb.append("=").append(' ').append(v); } else { sb.append("LIKE").append(' ').append(v); if ((v.indexOf("\\_") >= 0) || (v.indexOf("\\%") >= 0)) { // then client has requested at least one escape. sb.append(" ESCAPE '\\'"); } } } else { sb.append(op).append(' ').append(v); } return sb.toString(); } /** * The main SQL statement executor. All SQL destined for execution * ultimately goes through this method.

* * The sqlStatement field for the result is set autoClose to comply with * ResultSet.getStatement() semantics for result sets that are not from * a user supplied Statement object. (fredt)

* * @param sql SQL statement to execute * @return the result of issuing the statement * @throws SQLException is a database error occurs */ private ResultSet execute(String sql) throws SQLException { // NOTE: // Need to create a JDBCStatement here so JDBCResultSet can return // its Statement object on call to getStatement(). // The native JDBCConnection.execute() method does not // automatically assign a Statement object for the ResultSet, but // JDBCStatement does. That is, without this, there is no way for the // JDBCResultSet to find its way back to its Connection (or Statement) // Also, cannot use single, shared JDBCStatement object, as each // fetchResult() closes any old JDBCResultSet before fetching the // next, causing the JDBCResultSet's Result object to be nullified final int scroll = JDBCResultSet.TYPE_SCROLL_INSENSITIVE; final int concur = JDBCResultSet.CONCUR_READ_ONLY; JDBCStatement st = (JDBCStatement) connection.createStatement(scroll, concur); st.maxRows = -1; ResultSet r = st.executeQuery(sql); ((JDBCResultSet) r).autoClose = true; return r; } /** * An SQL statement executor that knows how to create a "SELECT * * FROM" statement, given a table name and a where clause.

* * If the where clause is null, it is omitted.

* * It is assumed that the table name is non-null, since this is a private * method. No check is performed.

* * @return the result of executing "SELECT * FROM " + table " " + where * @param table the name of a table to "select * from" * @param where the where condition for the select * @throws SQLException if database error occurs */ private ResultSet executeSelect(String table, String where) throws SQLException { String select = selstar + table; if (where != null) { select += " WHERE " + where; } return execute(select); } /** * Retrieves "SELECT * FROM INFORMATION_SCHEMA.<table> WHERE 1=1" in string * buffer form.

* * This is a convenience method provided because, for most * DatabaseMetaData queries, this is the most suitable * thing upon which to start building.

* * @return an StringBuffer whose content is: * "SELECT * FROM <table> WHERE 1=1" * @param t the name of the table */ private StringBuffer toQueryPrefix(String t) { StringBuffer sb = new StringBuffer(255); return sb.append(selstar).append(t).append(whereTrue); } /** * Retrieves "<expression> WHERE 1=1" in string */ private StringBuffer toQueryPrefixNoSelect(String t) { StringBuffer sb = new StringBuffer(255); return sb.append(t).append(whereTrue); } /** * Retrieves whether the JDBC DatabaseMetaData contract * specifies that the argument scode> is filter parameter * value that requires a corresponding IS NULL predicate.

* * @param s the filter parameter to test * @return true if the argument, s, is filter parameter value that * requires a corresponding IS NULL predicate */ private static boolean wantsIsNull(String s) { return (s != null && s.length() == 0); } /** * Returns the name of the default schema for database. */ String getDatabaseDefaultSchema() throws SQLException { final ResultSet rs = executeSelect("SYSTEM_SCHEMAS", "IS_DEFAULT=TRUE"); return rs.next() ? rs.getString(1) : null; } String getConnectionDefaultSchema() throws SQLException { ResultSet rs = execute("CALL CURRENT_SCHEMA"); rs.next(); String result = rs.getString(1); rs.close(); return result; } void setConnectionDefaultSchema(String schemaName) throws SQLException { execute("SET SCHEMA " + org.hsqldb.lib.StringConverter.toQuotedString(schemaName, '"', true)); } /** * For compatibility, when the connection property "default_schema=true" * is present, any DatabaseMetaData call with an empty string as the * schema parameter will use the default schema (normally "PUBLIC"). */ private String translateSchema(String schemaName) throws SQLException { if (useSchemaDefault && schemaName != null && schemaName.length() == 0) { final String result = getDatabaseDefaultSchema(); if (result != null) { schemaName = result; } } return schemaName; } /** * Returns the name of the catalog of the default schema. */ String getDatabaseDefaultCatalog() throws SQLException { final ResultSet rs = executeSelect("SYSTEM_SCHEMAS", "IS_DEFAULT=TRUE"); return rs.next() ? rs.getString(2) : null; } /** * For compatibility, when the connection property "default_schema=true" * is present, any DatabaseMetaData call with an empty string as the * catalog parameter will use the default catalog "PUBLIC". */ private String translateCatalog(String catalogName) throws SQLException { if (useSchemaDefault && catalogName != null && catalogName.length() == 0) { String result = getDatabaseDefaultCatalog(); if (result != null) { catalogName = result; } } return catalogName; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCParameterMetaData.java0000644000175000017500000004136012007547356024464 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.sql.ParameterMetaData; import java.sql.SQLException; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.result.ResultMetaData; import org.hsqldb.types.DateTimeType; import org.hsqldb.types.IntervalType; import org.hsqldb.types.Type; /* $Id: JDBCParameterMetaData.java 4141 2011-03-14 01:35:49Z fredt $ */ /** @todo 1.9.0 - implement internal support for INOUT, OUT return parameter */ // fredt@users 20040412 - removed DITypeInfo dependencies // fredt@usres 1.9.0 - utilise the new type support // boucherb@users 20051207 - patch 1.8.0.x initial JDBC 4.0 support work // boucherb@users 20060522 - doc 1.9.0 full synch up to Mustang Build 84 // Revision 1.14 2006/07/12 12:20:49 boucherb // - remove unused imports // - full synch up to Mustang b90 /** * An object that can be used to get information about the types * and properties for each parameter marker in a * PreparedStatement object. (JDBC4 Clarification:) For some queries and driver * implementations, the data that would be returned by a ParameterMetaData * object may not be available until the PreparedStatement has * been executed. *

* Some driver implementations may not be able to provide information about the * types and properties for each parameter marker in a CallableStatement * object. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @version 2.0.1 * @since JDK 1.4, HSQLDB 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public class JDBCParameterMetaData implements ParameterMetaData, java.sql.Wrapper { //#else /* public class JDBCParameterMetaData implements ParameterMetaData { */ //#endif JAVA6 /** * Retrieves the number of parameters in the PreparedStatement * object for which this ParameterMetaData object contains * information. * * @return the number of parameters * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7.2 */ public int getParameterCount() throws SQLException { return parameterCount; } /** * Retrieves whether null values are allowed in the designated parameter. * * @param param the first parameter is 1, the second is 2, ... * @return the nullability status of the given parameter; one of * ParameterMetaData.parameterNoNulls, * ParameterMetaData.parameterNullable, or * ParameterMetaData.parameterNullableUnknown * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7.2 */ public int isNullable(int param) throws SQLException { checkRange(param); return ParameterMetaData.parameterNullableUnknown; } /** * Retrieves whether values for the designated parameter can be signed numbers. * * @param param the first parameter is 1, the second is 2, ... * @return true if so; false otherwise * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7.2 */ public boolean isSigned(int param) throws SQLException { checkRange(param); Type type = translateType(rmd.columnTypes[--param]); return type.isNumberType(); } /** * Retrieves the designated parameter's specified column size. * *

The returned value represents the maximum column size for the given parameter. * For numeric data, this is the maximum precision. For character data, this is the length in characters. * For datetime datatypes, this is the length in characters of the String representation (assuming the * maximum allowed precision of the fractional seconds component). For binary data, this is the length in bytes. For the ROWID datatype, * this is the length in bytes. 0 is returned for data types where the * column size is not applicable. * * @param param the first parameter is 1, the second is 2, ... * @return precision * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7.2 */ public int getPrecision(int param) throws SQLException { checkRange(param); Type type = translateType(rmd.columnTypes[--param]); if (type.isDateTimeType()) { return type.displaySize(); } else { long size = type.precision; if (size > Integer.MAX_VALUE) { size = 0; } return (int) size; } } /** * Retrieves the designated parameter's number of digits to right of the decimal point. * 0 is returned for data types where the scale is not applicable. * * @param param the first parameter is 1, the second is 2, ... * @return scale * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7.2 */ public int getScale(int param) throws SQLException { checkRange(param); Type type = translateType(rmd.columnTypes[--param]); return type.scale; } /** * Retrieves the designated parameter's SQL type. * * @param param the first parameter is 1, the second is 2, ... * @return SQL type from java.sql.Types * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7.2 * @see java.sql.Types */ public int getParameterType(int param) throws SQLException { checkRange(param); Type type = translateType(rmd.columnTypes[--param]); return type.getJDBCTypeCode(); } /** * Retrieves the designated parameter's database-specific type name. * * @param param the first parameter is 1, the second is 2, ... * @return type the name used by the database. If the parameter type is * a user-defined type, then a fully-qualified type name is returned. * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7.2 */ public String getParameterTypeName(int param) throws SQLException { checkRange(param); Type type = translateType(rmd.columnTypes[--param]); return type.getNameString(); } /** * Retrieves the fully-qualified name of the Java class whose instances * should be passed to the method PreparedStatement.setObject. * * @param param the first parameter is 1, the second is 2, ... * @return the fully-qualified name of the class in the Java programming * language that would be used by the method * PreparedStatement.setObject to set the value * in the specified parameter. This is the class name used * for custom mapping. * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7.2 */ public String getParameterClassName(int param) throws SQLException { checkRange(param); Type type = translateType(rmd.columnTypes[--param]); return type.getJDBCClassName(); } /** * Retrieves the designated parameter's mode. * * @param param the first parameter is 1, the second is 2, ... * @return mode of the parameter; one of * ParameterMetaData.parameterModeIn, * ParameterMetaData.parameterModeOut, or * ParameterMetaData.parameterModeInOut * ParameterMetaData.parameterModeUnknown. * @exception SQLException if a database access error occurs * @since JDK 1.4, HSQLDB 1.7.2 */ public int getParameterMode(int param) throws SQLException { checkRange(param); return rmd.paramModes[--param]; } //----------------------------- JDBC 4.0 ----------------------------------- // ------------------- java.sql.Wrapper implementation --------------------- /** * Returns an object that implements the given interface to allow access to * non-standard methods, or standard methods not exposed by the proxy. * * If the receiver implements the interface then the result is the receiver * or a proxy for the receiver. If the receiver is a wrapper * and the wrapped object implements the interface then the result is the * wrapped object or a proxy for the wrapped object. Otherwise return the * the result of calling unwrap recursively on the wrapped object * or a proxy for that result. If the receiver is not a * wrapper and does not implement the interface, then an SQLException is thrown. * * @param iface A Class defining an interface that the result must implement. * @return an object that implements the interface. May be a proxy for the actual implementing object. * @throws java.sql.SQLException If no object found that implements the interface * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 @SuppressWarnings("unchecked") public T unwrap(java.lang.Class iface) throws java.sql.SQLException { if (isWrapperFor(iface)) { return (T) this; } throw Util.invalidArgument("iface: " + iface); } //#endif JAVA6 /** * Returns true if this either implements the interface argument or is directly or indirectly a wrapper * for an object that does. Returns false otherwise. If this implements the interface then return true, * else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped * object. If this does not implement the interface and is not a wrapper, return false. * This method should be implemented as a low-cost operation compared to unwrap so that * callers can use this method to avoid expensive unwrap calls that may fail. If this method * returns true then calling unwrap with the same argument should succeed. * * @param iface a Class defining an interface. * @return true if this implements the interface or directly or indirectly wraps an object that does. * @throws java.sql.SQLException if an error occurs while determining whether this is a wrapper * for an object with the given interface. * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public boolean isWrapperFor( java.lang.Class iface) throws java.sql.SQLException { return (iface != null && iface.isAssignableFrom(this.getClass())); } //#endif JAVA6 // -------------------------- Internal Implementation ---------------------- /** The metadata object with which this object is constructed */ ResultMetaData rmd; /** * The fully-qualified name of the Java class whose instances should * be passed to the method PreparedStatement.setObject.

* * Note that changes to Function.java and Types.java allow passing * objects of any class implementing java.io.Serializable and that, * as such, the parameter expression resolution mechanism has been * upgraded to provide the precise FQN for SQL function and stored * procedure arguments, rather than the more generic * org.hsqldb.JavaObject class that is used internally to represent * and transport objects whose class is not in the standard mapping. */ String[] classNames; /** The number of parameters in the described statement */ int parameterCount; private boolean translateTTIType; /** * Creates a new instance of JDBCParameterMetaData.

* * @param metaData A ResultMetaData object describing the statement parameters * @throws SQLException never - reserved for future use */ JDBCParameterMetaData(JDBCConnection conn, ResultMetaData metaData) throws SQLException { rmd = metaData; parameterCount = rmd.getColumnCount(); if (conn.clientProperties != null) { translateTTIType = conn.clientProperties.isPropertyTrue( HsqlDatabaseProperties.jdbc_translate_tti_types); } } /** * Translates an INTERVAL type to VARCHAR. * Removes time zone from datetime types. * */ private Type translateType(Type type) { if (this.translateTTIType) { if (type.isIntervalType()) { type = ((IntervalType) type).getCharacterType(); } else if (type.isDateTimeTypeWithZone()) { type = ((DateTimeType) type).getDateTimeTypeWithoutZone(); } } return type; } /** * Checks if the value of the param argument is a valid parameter * position.

* * @param param position to check * @throws SQLException if the value of the param argument is not a * valid parameter position */ void checkRange(int param) throws SQLException { if (param < 1 || param > parameterCount) { String msg = param + " is out of range"; throw Util.outOfRangeArgument(msg); } } /** * Retrieves a String repsentation of this object.

* * @return a String repsentation of this object */ public String toString() { try { return toStringImpl(); } catch (Throwable t) { return super.toString() + "[toStringImpl_exception=" + t + "]"; } } /** * Provides the implementation of the toString() method.

* * @return a String representation of this object * @throws Exception if a reflection error occurs */ private String toStringImpl() throws Exception { StringBuffer sb; Method[] methods; Method method; int count; sb = new StringBuffer(); sb.append(super.toString()); count = getParameterCount(); if (count == 0) { sb.append("[parameterCount=0]"); return sb.toString(); } methods = getClass().getDeclaredMethods(); sb.append('['); int len = methods.length; for (int i = 0; i < count; i++) { sb.append('\n'); sb.append(" parameter_"); sb.append(i + 1); sb.append('='); sb.append('['); for (int j = 0; j < len; j++) { method = methods[j]; if (!Modifier.isPublic(method.getModifiers())) { continue; } if (method.getParameterTypes().length != 1) { continue; } sb.append(method.getName()); sb.append('='); sb.append(method.invoke(this, new Object[] { new Integer(i + 1) })); if (j + 1 < len) { sb.append(','); sb.append(' '); } } sb.append(']'); if (i + 1 < count) { sb.append(','); sb.append(' '); } } sb.append('\n'); sb.append(']'); return sb.toString(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCClobClient.java0000644000175000017500000006120212007547356023156 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import java.nio.charset.CoderResult; import java.nio.charset.CodingErrorAction; import java.nio.charset.IllegalCharsetNameException; import java.sql.Clob; import java.sql.SQLException; import org.hsqldb.HsqlException; import org.hsqldb.SessionInterface; import org.hsqldb.error.ErrorCode; import org.hsqldb.types.ClobDataID; import org.hsqldb.types.ClobInputStream; /** * A wrapper for HSQLDB ClobData objects. * * Instances of this class are returned by calls to ResultSet methods. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since JDK 1.2, HSQLDB 1.9.0 */ public class JDBCClobClient implements Clob { /** * Retrieves the CLOB value designated by this * Clob object as an ascii stream. * * @return a java.io.InputStream object containing the * CLOB data * @throws SQLException if there is an error accessing the * CLOB value */ public synchronized InputStream getAsciiStream() throws SQLException { checkClosed(); return new InputStream() { private final byte[] oneChar = new byte[1]; private boolean m_closed; // better size than 8192 for network connections. private CharBuffer m_charBuffer = (CharBuffer) CharBuffer.allocate(64 * 1024).flip(); private ByteBuffer m_byteBuffer = ByteBuffer.allocate(1024); private Charset m_charset = charsetForName("US-ASCII"); private CharsetEncoder m_encoder = m_charset.newEncoder().onMalformedInput( CodingErrorAction.REPLACE).onUnmappableCharacter( CodingErrorAction.REPLACE); private Reader m_reader = clob.getCharacterStream(session); public int read() throws IOException { if (isEOF()) { return -1; } synchronized (oneChar) { int charsRead = read(oneChar, 0, 1); return charsRead == 1 ? oneChar[0] : -1; } } public int read(byte b[], int off, int len) throws IOException { checkClosed(); if (isEOF()) { return -1; } final CharBuffer cb = m_charBuffer; // int charsRead; int bytesRead; if (cb.remaining() == 0) { cb.clear(); charsRead = m_reader.read(cb); cb.flip(); if (charsRead < 0) { setEOF(); return -1; } else if (charsRead == 0) { return 0; } } final ByteBuffer bb = (m_byteBuffer.capacity() < len) ? ByteBuffer.allocate(len) : m_byteBuffer; // Since ASCII is single-byte, retrict encoder character consumption // to at most 'len' characters' to produce at most len ASCII // characters int cbLimit = cb.limit(); int cbPosistion = cb.position(); cb.limit(cbPosistion + len); bb.clear(); int bbPosition = bb.position(); CoderResult result = m_encoder.encode(cb, bb, false); if (bbPosition == bb.position() && result.isUnderflow()) { // surrogate character time cb.limit(cb.limit() + 1); m_encoder.encode(cb, bb, false); } // Restore the old limit so the buffer gets topped up // when required. cb.limit(cbLimit); bb.flip(); bytesRead = bb.limit(); if (bytesRead == 0) { setEOF(); return -1; } m_byteBuffer = bb; bb.get(b, off, bytesRead); return bytesRead; } public void close() throws IOException { boolean isClosed = m_closed; if (!isClosed) { m_closed = true; m_charBuffer = null; m_charset = null; m_encoder = null; try { m_reader.close(); } catch (Exception ex) { } } } private boolean isEOF() { final Reader reader = m_reader; return (reader == null); } private void setEOF() { final Reader reader = m_reader; if (reader != null) { try { reader.close(); } catch (IOException iOException) { } } m_reader = null; } private void checkClosed() throws IOException { if (JDBCClobClient.this.isClosed()) { try { this.close(); } catch (Exception ex) { } } if (m_closed) { throw new IOException("The stream is closed."); } } }; } /** * Retrieves the CLOB value designated by this * Clob object as a java.io.Reader object (or * as a stream of characters). * * @return a java.io.Reader object containing the * CLOB data * @throws SQLException if there is an error accessing the * CLOB value */ public synchronized Reader getCharacterStream() throws SQLException { checkClosed(); return new ClobInputStream(session, clob, 0, length()); } /** * Retrieves a copy of the specified substring in the CLOB * value designated by this Clob object. * * @param pos the first character of the substring to be extracted. The * first character is at position 1. * @param length the number of consecutive characters to be copied * @return a String that is the specified substring in the * CLOB value designated by this Clob object * @throws SQLException if there is an error accessing the * CLOB value */ public synchronized String getSubString(long pos, int length) throws SQLException { checkClosed(); if (!isInLimits(Long.MAX_VALUE, pos - 1, length)) { throw Util.outOfRangeArgument(); } try { return clob.getSubString(session, pos - 1, length); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * Retrieves the number of characters in the CLOB value * designated by this Clob object. * * @return length of the CLOB in characters * @throws SQLException if there is an error accessing the length of the * CLOB value */ public synchronized long length() throws SQLException { checkClosed(); try { return clob.length(session); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * Retrieves the character position at which the specified substring * searchstr appears in the SQL CLOB value * represented by this Clob object. * * @param searchstr the substring for which to search * @param start the position at which to begin searching; the first * position is 1 * @return the position at which the substring appears or -1 if it is * not present; the first position is 1 * @throws SQLException if there is an error accessing the * CLOB value */ public synchronized long position(String searchstr, long start) throws SQLException { if (!isInLimits(Long.MAX_VALUE, start - 1, 0)) { throw Util.outOfRangeArgument(); } checkClosed(); try { return clob.position(session, searchstr, start - 1); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * Retrieves the character position at which the specified * Clob object searchstr appears in this * Clob object. * * @param searchstr the Clob object for which to search * @param start the position at which to begin searching; the first * position is 1 * @return the position at which the Clob object appears or * -1 if it is not present; the first position is 1 * @throws SQLException if there is an error accessing the * CLOB value */ public synchronized long position(Clob searchstr, long start) throws SQLException { if (!isInLimits(Long.MAX_VALUE, start - 1, 0)) { throw Util.outOfRangeArgument(); } if (searchstr instanceof JDBCClobClient) { ClobDataID searchClob = ((JDBCClobClient) searchstr).clob; try { return clob.position(session, searchClob, start - 1); } catch (HsqlException e) { throw Util.sqlException(e); } } return position(searchstr.getSubString(1, (int) searchstr.length()), start); } /** * Retrieves a stream to be used to write Ascii characters to the * CLOB value that this Clob object represents, * starting at position pos. * * @param pos the position at which to start writing to this * CLOB object * @return the stream to which ASCII encoded characters can be written * @throws SQLException if there is an error accessing the * CLOB value */ public synchronized OutputStream setAsciiStream( final long pos) throws SQLException { checkClosed(); if (pos < 1) { throw Util.outOfRangeArgument("pos: " + pos); } if (!isWritable) { throw Util.notUpdatableColumn(); } startUpdate(); return new OutputStream() { private long m_position = pos - 1; private Charset m_charset = charsetForName("US-ASCII"); private CharsetDecoder m_decoder = m_charset.newDecoder().onMalformedInput( CodingErrorAction.REPLACE).onUnmappableCharacter( CodingErrorAction.REPLACE); private CharBuffer m_charBuffer = CharBuffer.allocate(64 * 1024); private ByteBuffer m_byteBuffer = ByteBuffer.allocate(1024); private final byte[] oneByte = new byte[1]; private boolean m_closed; public void write(int b) throws IOException { synchronized (oneByte) { oneByte[0] = (byte) b; this.write(oneByte, 0, 1); } } public void write(byte b[], int off, int len) throws IOException { checkClosed(); final ByteBuffer bb = (m_byteBuffer.capacity() < len) ? ByteBuffer.allocate(len) : m_byteBuffer; if (m_charBuffer.remaining() < len) { flush0(); } final CharBuffer cb = m_charBuffer.capacity() < len ? CharBuffer.allocate(len) : m_charBuffer; bb.clear(); bb.put(b, off, len); bb.flip(); m_decoder.decode(bb, cb, false); if (cb.remaining() == 0) { flush(); } } public void flush() throws IOException { checkClosed(); flush0(); } public void close() throws IOException { if (!m_closed) { try { flush0(); } finally { m_closed = true; m_byteBuffer = null; m_charBuffer = null; m_charset = null; m_decoder = null; } } } private void checkClosed() throws IOException { if (JDBCClobClient.this.isClosed()) { try { close(); } catch (Exception ex) { } } if (m_closed) { throw new IOException("The stream is closed."); } } private void flush0() throws IOException { final CharBuffer cb = m_charBuffer; cb.flip(); final char[] chars = new char[cb.length()]; cb.get(chars); cb.clear(); try { clob.setChars(session, m_position, chars, 0, chars.length); } catch (Exception e) { throw new IOException(e.toString()); } m_position += chars.length; } }; } /** * Retrieves a stream to be used to write a stream of Unicode characters * to the CLOB value that this Clob object * represents, at position pos. * * @param pos the position at which to start writing to the * CLOB value * @return a stream to which Unicode encoded characters can be written * @throws SQLException if there is an error accessing the * CLOB value */ public synchronized Writer setCharacterStream( final long pos) throws SQLException { checkClosed(); if (pos < 1) { throw Util.outOfRangeArgument("pos: " + pos); } if (!isWritable) { throw Util.notUpdatableColumn(); } startUpdate(); return new Writer() { private long m_clobPosition = pos - 1; private boolean m_closed; public void write(char[] cbuf, int off, int len) throws IOException { checkClosed(); clob.setChars(session, m_clobPosition, cbuf, off, len); m_clobPosition += len; } public void flush() throws IOException { // no-op } @Override public void close() throws IOException { m_closed = true; } private void checkClosed() throws IOException { if (m_closed || JDBCClobClient.this.isClosed()) { throw new IOException("The stream is closed"); } } }; } /** * Writes the given Java String to the CLOB * value that this Clob object designates at the position * pos. * * @param pos the position at which to start writing to the * CLOB value that this Clob object * represents * @param str the string to be written to the CLOB value * that this Clob designates * @return the number of characters written * @throws SQLException if there is an error accessing the * CLOB value */ public synchronized int setString(long pos, String str) throws SQLException { return setString(pos, str, 0, str.length()); } /** * Writes len characters of str, starting at * character offset, to the CLOB value that * this Clob represents. * * @param pos the position at which to start writing to this * CLOB object * @param str the string to be written to the CLOB value * that this Clob object represents * @param offset the offset into str to start reading the * characters to be written * @param len the number of characters to be written * @return the number of characters written * @throws SQLException if there is an error accessing the * CLOB value */ public synchronized int setString(long pos, String str, int offset, int len) throws SQLException { if (!isInLimits(str.length(), offset, len)) { throw Util.outOfRangeArgument(); } checkClosed(); if (pos < 1) { throw Util.outOfRangeArgument("pos: " + pos); } if (!isWritable) { throw Util.notUpdatableColumn(); } startUpdate(); str = str.substring(offset, offset + len); try { clob.setString(session, pos - 1, str); return len; } catch (HsqlException e) { throw Util.sqlException(e); } } /** * Truncates the CLOB value that this Clob * designates to have a length of len characters. * * @param len the length, in bytes, to which the CLOB value * should be truncated * @throws SQLException if there is an error accessing the * CLOB value */ public synchronized void truncate(long len) throws SQLException { if (len < 0) { throw Util.outOfRangeArgument("len: " + len); } checkClosed(); try { clob.truncate(session, len); } catch (HsqlException e) { throw Util.sqlException(e); } } //------------------------- JDBC 4.0 ----------------------------------- /** * This method frees the Clob object and releases the resources the resources * that it holds. The object is invalid once the free method * is called. *

* After free has been called, any attempt to invoke a * method other than free will result in a SQLException * being thrown. If free is called multiple times, the subsequent * calls to free are treated as a no-op. *

* @throws SQLException if an error occurs releasing * the Clob's resources * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ public synchronized void free() throws SQLException { isClosed = true; clob = null; session = null; } /** * Returns a Reader object that contains a partial Clob value, starting * with the character specified by pos, which is length characters in length. * * @param pos the offset to the first character of the partial value to * be retrieved. The first character in the Clob is at position 1. * @param length the length in characters of the partial value to be retrieved. * @return Reader through which the partial Clob value can be read. * @throws SQLException if pos is less than 1 or if pos is greater than the number of * characters in the Clob or if pos + length is greater than the number of * characters in the Clob * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ public synchronized Reader getCharacterStream(long pos, long length) throws SQLException { if (!isInLimits(Long.MAX_VALUE, pos - 1, length)) { throw Util.outOfRangeArgument(); } checkClosed(); return new ClobInputStream(session, clob, pos - 1, length); } char[] getChars(long position, int length) throws SQLException { try { return clob.getChars(session, position - 1, length); } catch (HsqlException e) { throw Util.sqlException(e); } } // ClobDataID originalClob; ClobDataID clob; SessionInterface session; int colIndex; private boolean isClosed; private boolean isWritable; JDBCResultSet resultSet; public JDBCClobClient(SessionInterface session, ClobDataID clob) { this.session = session; this.clob = clob; } public ClobDataID getClob() { return clob; } public synchronized boolean isClosed() { return isClosed; } public synchronized void setWritable(JDBCResultSet result, int index) { isWritable = true; resultSet = result; colIndex = index; } public synchronized void clearUpdates() { if (originalClob != null) { clob = originalClob; originalClob = null; } } private void startUpdate() throws SQLException { if (originalClob != null) { return; } originalClob = clob; clob = (ClobDataID) clob.duplicate(session); resultSet.startUpdate(colIndex + 1); resultSet.preparedStatement.parameterValues[colIndex] = clob; resultSet.preparedStatement.parameterSet[colIndex] = Boolean.TRUE; } private void checkClosed() throws SQLException { if (isClosed) { throw Util.sqlException(ErrorCode.X_07501); } } static boolean isInLimits(long fullLength, long pos, long len) { return fullLength >= 0 && pos >= 0 && len >= 0 && pos <= fullLength - len; } protected static Charset charsetForName( final String charsetName) throws SQLException { String csn = charsetName; if (csn == null) { csn = Charset.defaultCharset().name(); } try { if (Charset.isSupported(csn)) { return Charset.forName(csn); } } catch (IllegalCharsetNameException x) { } throw Util.sqlException(new UnsupportedEncodingException(csn)); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCStatement.java0000644000175000017500000022555312007547356023117 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.sql.BatchUpdateException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import org.hsqldb.HsqlException; import org.hsqldb.StatementTypes; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.result.ResultProperties; /* $Id: JDBCStatement.java 4879 2012-01-06 23:44:17Z fredt $ */ // fredt@users 20020320 - patch 1.7.0 - JDBC 2 support and error trapping // // JDBC 2 methods can now be called from jdk 1.1.x - see javadoc comments // SCROLL_INSENSITIVE and FORWARD_ONLY types for ResultSet are now supported // // boucherb@users 20020509 - added "throws SQLException" to all methods where // it was missing here but specified in the // java.sql.Statement interface, // updated generic documentation to JDK 1.4, and // added JDBC3 methods and docs // boucherb & 20020505 - extensive review and update of docs and behaviour // fredt@users to comply with java.sql specification // fredt@users 20030620 - patch 1.7.2 - rewritten and simplified // boucherb@users 200404xx - javadoc updates toward 1.7.2 final // boucherb@users 20051207 - patch 1.8.0.x initial JDBC 4.0 support work // boucherb@users 20060522 - doc 1.9.0 full synch up to Mustang Build 84 // Revision 1.16 2006/07/12 12:40:59 boucherb // patch 1.9.0 // - full synch up to Mustang b90 /** * *

The object used for executing a static SQL statement * and returning the results it produces. *

* By default, only one ResultSet object per Statement * object can be open at the same time. Therefore, if the reading of one * ResultSet object is interleaved * with the reading of another, each must have been generated by * different Statement objects. All execution methods in the * Statement interface implicitly close a statment's current * ResultSet object if an open one exists. * * * *

*

HSQLDB-Specific Information:

* From version 2.0, the implementation meets the JDBC specification * requirment that any existing ResultSet is closed when execute() or * executeQuery() methods are called. *

* * JRE 1.1.x Notes:

* * In general, JDBC 2 support requires Java 1.2 and above, and JDBC3 requires * Java 1.4 and above. In HSQLDB, support for methods introduced in different * versions of JDBC depends on the JDK version used for compiling and building * HSQLDB.

* * Since 1.7.0, all JDBC 2 methods can be called while executing under the * version 1.1.x * Java Runtime EnvironmentTM. * However, in addition to this technique requiring explicit casts to the * org.hsqldb.jdbc.* classes, some of these method calls require * int values that are defined only in the JDBC 2 or greater * version of the {@link java.sql.ResultSet ResultSet} interface. For this * reason these values are defined in {@link JDBCResultSet JDBCResultSet}.

* * In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the * JDBC2-only ResultSet values can be achieved by referring * to them in parameter specifications and return value comparisons, * respectively, as follows:

* *

 * JDBCResultSet.FETCH_FORWARD
 * JDBCResultSet.TYPE_FORWARD_ONLY
 * JDBCResultSet.TYPE_SCROLL_INSENSITIVE
 * JDBCResultSet.CONCUR_READ_ONLY
 * //etc.
 * 

* * However, please note that code written to use HSQLDB JDBC 2 features under * JDK 1.1.x will not be compatible for use with other JDBC 2 drivers. Please * also note that this feature is offered solely as a convenience to developers * who must work under JDK 1.1.x due to operating constraints, yet wish to * use some of the more advanced features available under the JDBC 2 * specification.

* * (fredt@users)
* (boucherb@users)

* *

* * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @revised JDK 1.6, HSQLDB 2.0 * @see JDBCConnection#createStatement * @see JDBCResultSet */ //#ifdef JAVA6 public class JDBCStatement extends JDBCStatementBase implements Statement, java.sql.Wrapper { //#else /* public class JDBCStatement extends JDBCStatementBase implements Statement { */ //#endif JAVA6 /** * * Executes the given SQL statement, which returns a single * ResultSet object. * * * *
*

HSQLDB-Specific Information:

* * This method should not be used for statements other than SELECT queries.

* * From 2.0, HSQLDB throws an exception when the statement * is a DDL statement or an UPDATE or DELETE statement. *

* * * @param sql an SQL statement to be sent to the database, typically a * static SQL SELECT statement * @return a ResultSet object that contains the data produced * by the given query; never null * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the given * SQL statement produces anything other than a single * ResultSet object */ public synchronized ResultSet executeQuery( String sql) throws SQLException { fetchResult(sql, StatementTypes.RETURN_RESULT, JDBCStatementBase.NO_GENERATED_KEYS, null, null); return getResultSet(); } /** * * Executes the given SQL statement, which may be an INSERT, * UPDATE, or DELETE statement or an * SQL statement that returns nothing, such as an SQL DDL statement. * * * @param sql (JDBC4 clarification:) an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or * DELETE; or an SQL statement that returns nothing, * such as a DDL statement. * * @return (JDBC4 clarification:) either (1) the row count for SQL Data Manipulation Language (DML) statements * or (2) 0 for SQL statements that return nothing * * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the given * SQL statement produces a ResultSet object */ public synchronized int executeUpdate(String sql) throws SQLException { fetchResult(sql, StatementTypes.RETURN_COUNT, JDBCStatementBase.NO_GENERATED_KEYS, null, null); return resultIn.getUpdateCount(); } /** * * Releases this Statement object's database * and JDBC resources immediately instead of waiting for * this to happen when it is automatically closed. * It is generally good practice to release resources as soon as * you are finished with them to avoid tying up database * resources. *

* Calling the method close on a Statement * object that is already closed has no effect. *

* Note:When a Statement object is * closed, its current ResultSet object, if one exists, is * also closed. * (JDBC4 deleted:) [A Statement object is * automatically closed when it is garbage collected.] * * * @exception SQLException if a database access error occurs */ public synchronized void close() throws SQLException { if (isClosed) { return; } closeResultData(); batchResultOut = null; connection = null; resultIn = null; resultOut = null; isClosed = true; } //---------------------------------------------------------------------- /** * * Retrieves the maximum number of bytes that can be * returned for character and binary column values in a ResultSet * object produced by this Statement object. * This limit applies only to BINARY, VARBINARY, * LONGVARBINARY, CHAR, VARCHAR, * (JDBC4 new:) NCHAR, NVARCHAR, LONGNVARCHAR * and LONGVARCHAR columns. If the limit is exceeded, the * excess data is silently discarded. * * * *

*

HSQLDB-Specific Information:

* * Including 1.7.2, HSQLDB always returns zero, meaning there * is no limit. *

* * * @return the current column size limit for columns storing character and * binary values; zero means there is no limit * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #setMaxFieldSize */ public synchronized int getMaxFieldSize() throws SQLException { checkClosed(); return 0; } /** * * (JDBC4 clarification:) Sets the limit for the maximum number of bytes in a ResultSet * Sets the limit for the maximum number of bytes that can be returned for * character and binary column values in a ResultSet * object produced by this Statement object. * * This limit applies * only to BINARY, VARBINARY, * LONGVARBINARY, CHAR, VARCHAR, * (JDBC4 new:) NCHAR, NVARCHAR, LONGNVARCHAR and * LONGVARCHAR fields. If the limit is exceeded, the excess data * is silently discarded. For maximum portability, use values * greater than 256. * * * *
*

HSQLDB-Specific Information:

* * To present, calls to this method are simply ignored; HSQLDB always * stores the full number of bytes when dealing with any of the field types * mentioned above. These types all have an absolute maximum element upper * bound determined by the Java array index limit * java.lang.Integer.MAX_VALUE. For XXXBINARY types, this translates to * Integer.MAX_VALUE bytes. For XXXCHAR types, this translates to * 2 * Integer.MAX_VALUE bytes (2 bytes / character).

* * In practice, field sizes are limited to values much smaller than the * absolute maximum element upper bound, in particular due to limits imposed * on the maximum available Java heap memory. *

* * * @param max the new column size limit in bytes; zero means there is no limit * @exception SQLException if a database access error occurs, * this method is called on a closed Statement * or the condition max >= 0 is not satisfied * @see #getMaxFieldSize */ public void setMaxFieldSize(int max) throws SQLException { checkClosed(); if (max < 0) { throw Util.outOfRangeArgument(); } } /** * * Retrieves the maximum number of rows that a * ResultSet object produced by this * Statement object can contain. If this limit is exceeded, * the excess rows are silently dropped. * * * @return the current maximum number of rows for a ResultSet * object produced by this Statement object; * zero means there is no limit * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #setMaxRows */ public synchronized int getMaxRows() throws SQLException { checkClosed(); return maxRows; } /** * * (JDBC4 clarification:) * Sets the limit for the maximum number of rows that any * ResultSet object generated by this Statement * object can contain to the given number. * If the limit is exceeded, the excess * rows are silently dropped. * * * @param max the new max rows limit; zero means there is no limit * @exception SQLException if a database access error occurs, * this method is called on a closed Statement * or the condition max >= 0 is not satisfied * @see #getMaxRows */ public synchronized void setMaxRows(int max) throws SQLException { checkClosed(); if (max < 0) { throw Util.outOfRangeArgument(); } maxRows = max; } /** * * Sets escape processing on or off. * If escape scanning is on (the default), the driver will do * escape substitution before sending the SQL statement to the database. * * Note: Since prepared statements have usually been parsed prior * to making this call, disabling escape processing for * PreparedStatements objects will have no effect. * * * @param enable true to enable escape processing; * false to disable it * @exception SQLException if a database access error occurs or * this method is called on a closed Statement */ public void setEscapeProcessing(boolean enable) throws SQLException { checkClosed(); isEscapeProcessing = enable; } /** * * Retrieves the number of seconds the driver will * wait for a Statement object to execute. * If the limit is exceeded, a * SQLException is thrown. * * * *
*

HSQLDB-Specific Information:

* * To present, HSQLDB always returns zero, meaning there * is no limit. *

* * * @return the current query timeout limit in seconds; zero means there is * no limit * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #setQueryTimeout */ public synchronized int getQueryTimeout() throws SQLException { checkClosed(); return 0; } /** * * Sets the number of seconds the driver will wait for a * Statement object to execute to the given number of seconds. * If the limit is exceeded, an SQLException is thrown. A JDBC * (JDBC4 clarification:) * driver must apply this limit to the execute, * executeQuery and executeUpdate methods. JDBC driver * implementations may also apply this limit to ResultSet methods * (consult your driver vendor documentation for details). * * * *
*

HSQLDB-Specific Information:

* * The maximum value is Short.MAX_VALUE. The minimum is 0, indicating no limit. * In version 2.0, calls to this method are ignored; HSQLDB waits an * unlimited amount of time for statement execution * requests to return. *

* * * @param seconds the new query timeout limit in seconds; zero means * there is no limit * @exception SQLException if a database access error occurs, * this method is called on a closed Statement * or the condition seconds >= 0 is not satisfied * @see #getQueryTimeout */ public void setQueryTimeout(int seconds) throws SQLException { checkClosed(); if (seconds < 0 || seconds > Short.MAX_VALUE) { throw Util.outOfRangeArgument(); } queryTimeout = seconds; } /** * * Cancels this Statement object if both the DBMS and * driver support aborting an SQL statement. * This method can be used by one thread to cancel a statement that * is being executed by another thread. * * * *
*

HSQLDB-Specific Information:

* * Including 2.0, HSQLDB does not support aborting an SQL * statement; calls to this method are ignored. *

* * * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method */ public synchronized void cancel() throws SQLException { checkClosed(); } /** * * Retrieves the first warning reported by calls on this Statement object. * Subsequent Statement object warnings will be chained to this * SQLWarning object. * *

The warning chain is automatically cleared each time * a statement is (re)executed. This method may not be called on a closed * Statement object; doing so will cause an SQLException * to be thrown. * *

Note: If you are processing a ResultSet object, any * warnings associated with reads on that ResultSet object * will be chained on it rather than on the Statement * object that produced it. * * * *

*

HSQLDB-Specific Information:

* * In 2.0, HSQLDB may produces Statement warnings; * this method always returns null. *

* * * @return the first SQLWarning object or null * if there are no warnings * @exception SQLException if a database access error occurs or * this method is called on a closed Statement */ public synchronized SQLWarning getWarnings() throws SQLException { checkClosed(); return rootWarning; } /** * * Clears all the warnings reported on this Statement * object. After a call to this method, * the method getWarnings will return * null until a new warning is reported for this * Statement object. * * * *
*

HSQLDB-Specific Information:

* * In HSQLDB 2.0, SQLWarning objects may * be produced for Statement Objects; calls to this method clear the warnings. *

* * * @exception SQLException if a database access error occurs or * this method is called on a closed Statement */ public synchronized void clearWarnings() throws SQLException { checkClosed(); rootWarning = null; } /** @todo 1.9.0 - implement */ /** * * Sets the SQL cursor name to the given String, which * will be used by subsequent Statement object * execute methods. This name can then be * used in SQL positioned update or delete statements to identify the * current row in the ResultSet object generated by this * statement. If the database does not support positioned update/delete, * this method is a noop. To insure that a cursor has the proper isolation * level to support updates, the cursor's SELECT statement * should have the form SELECT FOR UPDATE. If * FOR UPDATE is not present, positioned updates may fail. * *

Note: By definition, the execution of positioned updates and * deletes must be done by a different Statement object than * the one that generated the ResultSet object being used for * positioning. Also, cursor names must be unique within a connection. * * * *

*

HSQLDB-Specific Information:

* * Including 2.0, HSQLDB does not support named cursors; * calls to this method are ignored. *

* * * @param name the new cursor name, which must be unique within * a connection * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method */ public void setCursorName(String name) throws SQLException { checkClosed(); } //----------------------- Multiple Results -------------------------- /** * * Executes the given SQL statement, which may return multiple results. * In some (uncommon) situations, a single SQL statement may return * multiple result sets and/or update counts. Normally you can ignore * this unless you are (1) executing a stored procedure that you know may * return multiple results or (2) you are dynamically executing an * unknown SQL string. *

* The execute method executes an SQL statement and indicates the * form of the first result. You must then use the methods * getResultSet or getUpdateCount * to retrieve the result, and getMoreResults to * move to any subsequent result(s). * * * @param sql any SQL statement * @return true if the first result is a ResultSet * object; false if it is an update count or there are * no results * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #getResultSet * @see #getUpdateCount * @see #getMoreResults */ public synchronized boolean execute(String sql) throws SQLException { fetchResult(sql, StatementTypes.RETURN_ANY, JDBCStatementBase.NO_GENERATED_KEYS, null, null); return currentResultSet != null; } /** * * Retrieves the current result as a ResultSet object. * This method should be called only once per result. * * * *

*

HSQLDB-Specific Information:

* *

* * * @return the current result as a ResultSet object or * null if the result is an update count or there are no more results * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #execute */ public synchronized ResultSet getResultSet() throws SQLException { return super.getResultSet(); } /** * * Retrieves the current result as an update count; * if the result is a ResultSet object or there are no more results, -1 * is returned. This method should be called only once per result. * * * @return the current result as an update count; -1 if the current result is a * ResultSet object or there are no more results * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #execute */ public synchronized int getUpdateCount() throws SQLException { return super.getUpdateCount(); } /** * * Moves to this Statement object's next result, returns * true if it is a ResultSet object, and * implicitly closes any current ResultSet * object(s) obtained with the method getResultSet. * *

There are no more results when the following is true: *

     *     // stmt is a Statement object
     *     ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
     * 
* * * @return true if the next result is a ResultSet * object; false if it is an update count or there are * no more results * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #execute */ public synchronized boolean getMoreResults() throws SQLException { return getMoreResults(JDBCStatementBase.CLOSE_CURRENT_RESULT); } //--------------------------JDBC 2.0----------------------------- /** * * Gives the driver a hint as to the direction in which * rows will be processed in ResultSet * objects created using this Statement object. The * default value is ResultSet.FETCH_FORWARD. *

* Note that this method sets the default fetch direction for * result sets generated by this Statement object. * Each result set has its own methods for getting and setting * its own fetch direction. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB accepts all valid parameters.

* * * @param direction the initial direction for processing rows * @exception SQLException if a database access error occurs, * this method is called on a closed Statement * or the given direction * is not one of ResultSet.FETCH_FORWARD, * ResultSet.FETCH_REVERSE, or ResultSet.FETCH_UNKNOWN * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) * @see #getFetchDirection */ public synchronized void setFetchDirection( int direction) throws SQLException { checkClosed(); checkClosed(); switch (direction) { case JDBCResultSet.FETCH_FORWARD : case JDBCResultSet.FETCH_REVERSE : case JDBCResultSet.FETCH_UNKNOWN : fetchDirection = direction; break; default : throw Util.invalidArgument(); } } /** * * Retrieves the direction for fetching rows from * database tables that is the default for result sets * generated from this Statement object. * If this Statement object has not set * a fetch direction by calling the method setFetchDirection, * the return value is implementation-specific. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB returns the fetch direction.

*

* * * @return the default fetch direction for result sets generated * from this Statement object * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) * @see #setFetchDirection */ public int getFetchDirection() throws SQLException { checkClosed(); return this.fetchDirection; } /** * * (JDBC4 clarification:) * Gives the JDBC driver a hint as to the number of rows that should * be fetched from the database when more rows are needed for * ResultSet objects genrated by this Statement. * If the value specified is zero, then the hint is ignored. * The default value is zero. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB uses the specified value as a hint, but may process more or fewer * rows than specified. *

* * * @param rows the number of rows to fetch * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the * (JDBC4 modified:) * condition rows >= 0 is not satisfied. * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) * @see #getFetchSize */ public synchronized void setFetchSize(int rows) throws SQLException { checkClosed(); if (rows < 0) { throw Util.outOfRangeArgument(); } fetchSize = rows; } /** * * Retrieves the number of result set rows that is the default * fetch size for ResultSet objects * generated from this Statement object. * If this Statement object has not set * a fetch size by calling the method setFetchSize, * the return value is implementation-specific. * * * *
* HSQLDB-Specific Information

* * HSQLDB returns 0 by default, or the fetch size specified by setFetchSize *

* * * @return the default fetch size for result sets generated * from this Statement object * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) * @see #setFetchSize */ public synchronized int getFetchSize() throws SQLException { checkClosed(); return fetchSize; } /** * * Retrieves the result set concurrency for ResultSet objects * generated by this Statement object. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports CONCUR_READ_ONLY and * CONCUR_UPDATABLE concurrency. *

* * * @return either ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) */ public synchronized int getResultSetConcurrency() throws SQLException { checkClosed(); return ResultProperties.getJDBCConcurrency(rsProperties); } /** * * Retrieves the result set type for ResultSet objects * generated by this Statement object. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 1.7.0 and later versions support TYPE_FORWARD_ONLY * and TYPE_SCROLL_INSENSITIVE. *

* * * @return one of ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) */ public synchronized int getResultSetType() throws SQLException { checkClosed(); return ResultProperties.getJDBCScrollability(rsProperties); } /** * * Adds the given SQL command to the current list of commmands for this * Statement object. The commands in this list can be * executed as a batch by calling the method executeBatch. *

* (JDBC4 clarification:)

* NOTE: Support of an ability to batch updates is optional. * * * * *

*

HSQLDB-Specific Information:

* * Starting with 1.7.2, this feature is supported. *

* * * @param sql typically this is a SQL INSERT or * UPDATE statement * (:JDBC4 modified) * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the * driver does not support batch updates * @see #executeBatch * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) */ public synchronized void addBatch(String sql) throws SQLException { checkClosed(); if (isEscapeProcessing) { sql = connection.nativeSQL(sql); } if (batchResultOut == null) { batchResultOut = Result.newBatchedExecuteRequest(); } batchResultOut.getNavigator().add(new Object[] { sql }); } /** * * Empties this Statement object's current list of * SQL commands. *

* (JDBC4 clarification:)

* NOTE: Support of an ability to batch updates is optional. * * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 1.7.2, this feature is supported. *

* * * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the * driver does not support batch updates * @see #addBatch * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) */ public synchronized void clearBatch() throws SQLException { checkClosed(); if (batchResultOut != null) { batchResultOut.getNavigator().clear(); } } /** * * Submits a batch of commands to the database for execution and * if all commands execute successfully, returns an array of update counts. * The int elements of the array that is returned are ordered * to correspond to the commands in the batch, which are ordered * according to the order in which they were added to the batch. * The elements in the array returned by the method executeBatch * may be one of the following: *
    *
  1. A number greater than or equal to zero -- indicates that the * command was processed successfully and is an update count giving the * number of rows in the database that were affected by the command's * execution *
  2. A value of SUCCESS_NO_INFO -- indicates that the command was * processed successfully but that the number of rows affected is * unknown *

    * If one of the commands in a batch update fails to execute properly, * this method throws a BatchUpdateException, and a JDBC * driver may or may not continue to process the remaining commands in * the batch. However, the driver's behavior must be consistent with a * particular DBMS, either always continuing to process commands or never * continuing to process commands. If the driver continues processing * after a failure, the array returned by the method * BatchUpdateException.getUpdateCounts * will contain as many elements as there are commands in the batch, and * at least one of the elements will be the following: *

    *

  3. A value of EXECUTE_FAILED -- indicates that the command failed * to execute successfully and occurs only if a driver continues to * process commands after a command fails *
*

* (JDBC4 clarification:)

* NOTE: Support of an ability to batch updates is optional. *

* The possible implementations and return values have been modified in * the Java 2 SDK, Standard Edition, version 1.3 to * accommodate the option of continuing to proccess commands in a batch * update after a BatchUpdateException obejct has been thrown. * * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 1.7.2, this feature is supported.

* * HSQLDB stops execution of commands in a batch when one of the commands * results in an exception. The size of the returned array equals the * number of commands that were executed successfully.

* * When the product is built under the JAVA1 target, an exception * is never thrown and it is the responsibility of the client software to * check the size of the returned update count array to determine if any * batch items failed. To build and run under the JAVA2 target, JDK/JRE * 1.3 or higher must be used. *

* * * @return an array of update counts containing one element for each * command in the batch. The elements of the array are ordered according * to the order in which commands were added to the batch. * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the * driver does not support batch statements. Throws {@link BatchUpdateException} * (a subclass of SQLException) if one of the commands sent to the * database fails to execute properly or attempts to return a result set. * * * @see #addBatch * @see java.sql.DatabaseMetaData#supportsBatchUpdates * @since JDK 1.3 (JDK 1.1.x developers: read the overview for * JDBCStatement) */ public synchronized int[] executeBatch() throws SQLException { checkClosed(); generatedResult = null; if (batchResultOut == null) { batchResultOut = Result.newBatchedExecuteRequest(); } int batchCount = batchResultOut.getNavigator().getSize(); try { resultIn = connection.sessionProxy.execute(batchResultOut); performPostExecute(); } catch (HsqlException e) { batchResultOut.getNavigator().clear(); throw Util.sqlException(e); } batchResultOut.getNavigator().clear(); if (resultIn.isError()) { throw Util.sqlException(resultIn); } RowSetNavigator navigator = resultIn.getNavigator(); int[] updateCounts = new int[navigator.getSize()]; for (int i = 0; i < updateCounts.length; i++) { Object[] data = (Object[]) navigator.getNext(); updateCounts[i] = ((Integer) data[0]).intValue(); } if (updateCounts.length != batchCount) { if (errorResult == null) { throw new BatchUpdateException(updateCounts); } else { errorResult.getMainString(); throw new BatchUpdateException(errorResult.getMainString(), errorResult.getSubString(), errorResult.getErrorCode(), updateCounts); } } return updateCounts; } /** * * Retrieves the Connection object * that produced this Statement object. * * * @return the connection that produced this statement * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) */ public synchronized Connection getConnection() throws SQLException { checkClosed(); return connection; } //--------------------------JDBC 3.0----------------------------- /** * * Moves to this Statement object's next result, deals with * any current ResultSet object(s) according to the instructions * specified by the given flag, and returns * true if the next result is a ResultSet object. * *

There are no more results when the following is true: *

     *     // stmt is a Statement object
     *     ((stmt.getMoreResults(current) == false) && (stmt.getUpdateCount() == -1))
     * 
* * * *
*

HSQLDB-Specific Information:

* * HSQLDB moves to the next ResultSet and returns the correct result.

*

* * * @param current one of the following Statement * constants indicating what should happen to current * ResultSet objects obtained using the method * getResultSet: * Statement.CLOSE_CURRENT_RESULT, * Statement.KEEP_CURRENT_RESULT, or * Statement.CLOSE_ALL_RESULTS * @return true if the next result is a ResultSet * object; false if it is an update count or there are no * more results * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the argument * supplied is not one of the following: * Statement.CLOSE_CURRENT_RESULT, * Statement.KEEP_CURRENT_RESULT, or * Statement.CLOSE_ALL_RESULTS * @since JDK 1.4, HSQLDB 1.7 * @see #execute */ //#ifdef JAVA4 public synchronized boolean getMoreResults( int current) throws SQLException { return super.getMoreResults(current); } //#endif JAVA4 /** * * Retrieves any auto-generated keys created as a result of executing this * Statement object. If this Statement object did * not generate any keys, an empty ResultSet * object is returned. *

(JDBC4 clarification:) *

Note:If the columns which represent the auto-generated keys were not specified, * the JDBC driver implementation will determine the columns which best represent the auto-generated keys. * * * *

*

HSQLDB-Specific Information:

* * Starting with version 2.0, HSQLDB supports this feature with single-row * and multi-row insert, update and merge statements.

* * This method returns a result set only if * the executeUpdate methods that was used is one of the three methods that * have the extra parameter indicating return of generated keys

* * If the executeUpaged method did not specify the columns which represent * the auto-generated keys the IDENTITY column or GENERATED column(s) of the * table are returned.

* * The executeUpdate methods with column indexes or column names return the * post-insert or post-update values of the specified columns, whether the * columns are generated or not. This allows values that have been modified * by execution of triggers to be returned.

* * If column names or indexes provided by the user in the executeUpdate() * method calls do not correspond to table columns (incorrect names or * indexes larger than the coloum count), an empty result is returned. * *

* * * @return a ResultSet object containing the auto-generated key(s) * generated by the execution of this Statement object * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public synchronized ResultSet getGeneratedKeys() throws SQLException { return getGeneratedResultSet(); } //#endif JAVA4 /** * * Executes the given SQL statement and signals the driver with the * given flag about whether the * auto-generated keys produced by this Statement object * should be made available for retrieval. The driver will ignore the * flag if the SQL statement * is not an INSERT statement, or an SQL statement able to return * auto-generated keys (the list of such statements is vendor-specific). * * * *
*

HSQLDB-Specific Information:

* * Starting with version 2.0, HSQLDB supports returning generated columns * with single-row and multi-row INSERT, UPDATE and MERGE statements.

* If the table has an IDENTITY or GENERATED column(s) the values for these * columns are returned in the next call to getGeneratedKeys(). * *

* * @param sql an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or * DELETE; or an SQL statement that returns nothing, * such as a DDL statement. * (:JDBC4 clarification) * * @param autoGeneratedKeys a flag indicating whether auto-generated keys * should be made available for retrieval; * one of the following constants: * Statement.RETURN_GENERATED_KEYS * Statement.NO_GENERATED_KEYS * @return either (1) the row count for SQL Data Manipulation Language (DML) statements * or (2) 0 for SQL statements that return nothing * (:JDBC4 clarification) * * @exception SQLException if a database access error occurs, * this method is called on a closed Statement, the given * SQL statement returns a ResultSet object, or * the given constant is not one of those allowed * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method with a constant of Statement.RETURN_GENERATED_KEYS * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public synchronized int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { if (autoGeneratedKeys != Statement.RETURN_GENERATED_KEYS && autoGeneratedKeys != Statement.NO_GENERATED_KEYS) { throw Util.invalidArgument("autoGeneratedKeys"); } fetchResult(sql, StatementTypes.RETURN_COUNT, autoGeneratedKeys, null, null); if (resultIn.isError()) { throw Util.sqlException(resultIn); } return resultIn.getUpdateCount(); } //#endif JAVA4 /** * * Executes the given SQL statement and signals the driver that the * auto-generated keys indicated in the given array should be made available * for retrieval. The driver will ignore the array if the SQL statement * is not an INSERT statement, or an SQL statement able to return * (JDBC 4 clarification) * auto-generated keys (the list of such statements is vendor-specific). * * * *
*

HSQLDB-Specific Information:

* * Starting with version 2.0, HSQLDB supports returning generated columns * with single-row and multi-row INSERT, UPDATE and MERGE statements.

* The columnIndexes may specify any set of columns of the table. * *

* * * @param sql an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or * DELETE; or an SQL statement that returns nothing, * such as a DDL statement. * (:JDBC4 clarification) * * @param columnIndexes an array of column indexes indicating the columns * that should be returned from the inserted row * @return either (1) the row count for SQL Data Manipulation Language (DML) statements * or (2) 0 for SQL statements that return nothing * (:JDBC 4 clarification) * * @exception SQLException if a database access error occurs, * this method is called on a closed Statement, the SQL * statement returns a ResultSet object, or the * second argument supplied to this method is not an int array * whose elements are valid column indexes * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public synchronized int executeUpdate(String sql, int[] columnIndexes) throws SQLException { if (columnIndexes == null || columnIndexes.length == 0) { throw Util.invalidArgument("columnIndexes"); } fetchResult(sql, StatementTypes.RETURN_COUNT, ResultConstants.RETURN_GENERATED_KEYS_COL_INDEXES, columnIndexes, null); return resultIn.getUpdateCount(); } //#endif JAVA4 /** * * Executes the given SQL statement and signals the driver that the * auto-generated keys indicated in the given array should be made available * for retrieval. The driver will ignore the array if the SQL statement * (JDBC4 clarification:) * is not an INSERT statement, or an SQL statement able to return * auto-generated keys (the list of such statements is vendor-specific). * * * *
*

HSQLDB-Specific Information:

* * Starting with version 2.0, HSQLDB supports returning generated columns * with single-row and multi-row INSERT, UPDATE and MERGE statements.

* The columnNames may specify any set of columns of the table. * *

* * * @param sql an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or * DELETE; or an SQL statement that returns nothing, * such as a DDL statement. * (:JDBC4 clarification) * @param columnNames an array of the names of the columns that should be * returned from the inserted row * @return either the row count for INSERT, UPDATE, * or DELETE statements, or 0 for SQL statements * that return nothing * @exception SQLException if a database access error occurs, * this method is called on a closed Statement, the SQL * statement returns a ResultSet object, or the * second argument supplied to this method is not a String array * whose elements are valid column names * * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public synchronized int executeUpdate(String sql, String[] columnNames) throws SQLException { if (columnNames == null || columnNames.length == 0) { throw Util.invalidArgument("columnIndexes"); } fetchResult(sql, StatementTypes.RETURN_COUNT, ResultConstants.RETURN_GENERATED_KEYS_COL_NAMES, null, columnNames); return resultIn.getUpdateCount(); } //#endif JAVA4 /** * * Executes the given SQL statement, which may return multiple results, * and signals the driver that any * auto-generated keys should be made available * for retrieval. The driver will ignore this signal if the SQL statement * is not an INSERT statement, or an SQL statement able to return * (JDBC4 clarification) * auto-generated keys (the list of such statements is vendor-specific). *

* In some (uncommon) situations, a single SQL statement may return * multiple result sets and/or update counts. Normally you can ignore * this unless you are (1) executing a stored procedure that you know may * return multiple results or (2) you are dynamically executing an * unknown SQL string. *

* The execute method executes an SQL statement and indicates the * form of the first result. You must then use the methods * getResultSet or getUpdateCount * to retrieve the result, and getMoreResults to * move to any subsequent result(s). * * * *

*

HSQLDB-Specific Information:

* * Starting with 2.0, HSQLDB supports this feature. * *

* * * @param sql any SQL statement * @param autoGeneratedKeys a constant indicating whether auto-generated * keys should be made available for retrieval using the method * getGeneratedKeys; one of the following constants: * Statement.RETURN_GENERATED_KEYS or * Statement.NO_GENERATED_KEYS * @return true if the first result is a ResultSet * object; false if it is an update count or there are * no results * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the second * parameter supplied to this method is not * Statement.RETURN_GENERATED_KEYS or * Statement.NO_GENERATED_KEYS. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method with a constant of Statement.RETURN_GENERATED_KEYS * @see #getResultSet * @see #getUpdateCount * @see #getMoreResults * @see #getGeneratedKeys * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public synchronized boolean execute( String sql, int autoGeneratedKeys) throws SQLException { if (autoGeneratedKeys != Statement.RETURN_GENERATED_KEYS && autoGeneratedKeys != Statement.NO_GENERATED_KEYS) { throw Util.invalidArgument("autoGeneratedKeys"); } fetchResult(sql, StatementTypes.RETURN_ANY, autoGeneratedKeys, null, null); return resultIn.isData(); } //#endif JAVA4 /** * * Executes the given SQL statement, which may return multiple results, * and signals the driver that the * auto-generated keys indicated in the given array should be made available * for retrieval. This array contains the indexes of the columns in the * target table that contain the auto-generated keys that should be made * available. The driver will ignore the array if the SQL statement * (JDBC4 clarification) * is not an INSERT statement, or an SQL statement able to return * auto-generated keys (the list of such statements is vendor-specific). *

* Under some (uncommon) situations, a single SQL statement may return * multiple result sets and/or update counts. Normally you can ignore * this unless you are (1) executing a stored procedure that you know may * return multiple results or (2) you are dynamically executing an * unknown SQL string. *

* The execute method executes an SQL statement and indicates the * form of the first result. You must then use the methods * getResultSet or getUpdateCount * to retrieve the result, and getMoreResults to * move to any subsequent result(s). * * * *

*

HSQLDB-Specific Information:

* * Starting with 2.0, HSQLDB supports this feature. * *

* * * @param sql any SQL statement * @param columnIndexes an array of the indexes of the columns in the * inserted row that should be made available for retrieval by a * call to the method getGeneratedKeys * @return true if the first result is a ResultSet * object; false if it is an update count or there * are no results * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the * elements in the int array passed to this method * are not valid column indexes * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @see #getResultSet * @see #getUpdateCount * @see #getMoreResults * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public synchronized boolean execute( String sql, int[] columnIndexes) throws SQLException { if (columnIndexes == null || columnIndexes.length == 0) { throw Util.invalidArgument("columnIndexes"); } fetchResult(sql, StatementTypes.RETURN_ANY, ResultConstants.RETURN_GENERATED_KEYS_COL_INDEXES, columnIndexes, null); return resultIn.isData(); } //#endif JAVA4 /** * * Executes the given SQL statement, which may return multiple results, * and signals the driver that the * auto-generated keys indicated in the given array should be made available * for retrieval. This array contains the names of the columns in the * target table that contain the auto-generated keys that should be made * available. The driver will ignore the array if the SQL statement * is not an INSERT statement, or an SQL statement able to return * auto-generated keys (the list of such statements is vendor-specific). *

* In some (uncommon) situations, a single SQL statement may return * multiple result sets and/or update counts. Normally you can ignore * this unless you are (1) executing a stored procedure that you know may * return multiple results or (2) you are dynamically executing an * unknown SQL string. *

* The execute method executes an SQL statement and indicates the * form of the first result. You must then use the methods * getResultSet or getUpdateCount * to retrieve the result, and getMoreResults to * move to any subsequent result(s). * * * *

*

HSQLDB-Specific Information:

* * Starting with 2.0, HSQLDB supports this feature. * *

* * * @param sql any SQL statement * @param columnNames an array of the names of the columns in the inserted * row that should be made available for retrieval by a call to the * method getGeneratedKeys * @return true if the next result is a ResultSet * object; false if it is an update count or there * are no more results * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the * elements of the String array passed to this * method are not valid column names * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @see #getResultSet * @see #getUpdateCount * @see #getMoreResults * @see #getGeneratedKeys * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public synchronized boolean execute( String sql, String[] columnNames) throws SQLException { if (columnNames == null || columnNames.length == 0) { throw Util.invalidArgument("columnIndexes"); } fetchResult(sql, StatementTypes.RETURN_ANY, ResultConstants.RETURN_GENERATED_KEYS_COL_NAMES, null, columnNames); return resultIn.isData(); } //#endif JAVA4 /** * * Retrieves the result set holdability for ResultSet objects * generated by this Statement object. * * * *
*

HSQLDB-Specific Information:

* * Starting with 1.7.2, this method returns HOLD_CURSORS_OVER_COMMIT *

* * * @return either ResultSet.HOLD_CURSORS_OVER_COMMIT or * ResultSet.CLOSE_CURSORS_AT_COMMIT * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public synchronized int getResultSetHoldability() throws SQLException { return ResultProperties.getJDBCHoldability(rsProperties); } //#endif JAVA4 //----------------------------- JDBC 4.0 ----------------------------------- /** * Retrieves whether this Statement object has been closed. A Statement is closed if the * method close has been called on it, or if it is automatically closed. * @return true if this Statement object is closed; false if it is still open * @throws SQLException if a database access error occurs * @since JDK 1.6, HSQLDB 2.0 */ public synchronized boolean isClosed() throws SQLException { return isClosed; } // --------------------------- Added: Mustang Build 81 ------------------------- boolean poolable = false; /** * Requests that a Statement be pooled or not pooled. The value * specified is a hint to the statement pool implementation indicating * whether the applicaiton wants the statement to be pooled. It is up to * the statement pool manager as to whether the hint is used. *

* The poolable value of a statement is applicable to both internal * statement caches implemented by the driver and external statement caches * implemented by application servers and other applications. *

* By default, a Statement is not poolable when created, and * a PreparedStatement and CallableStatement * are poolable when created. *

* @param poolable requests that the statement be pooled if true and * that the statement not be pooled if false *

* @throws SQLException if this method is called on a closed * Statement *

* @since JDK 1.6 Build 81, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setPoolable( boolean poolable) throws SQLException { checkClosed(); this.poolable = poolable; } //#endif JAVA6 /** * Returns a value indicating whether the Statement * is poolable or not. *

* @return true if the Statement * is poolable; false otherwise * @throws SQLException if this method is called on a closed * Statement *

* @since JDK 1.6 Build 81, HSQLDB 2.0 *

* @see #setPoolable(boolean) setPoolable(boolean) */ //#ifdef JAVA6 public synchronized boolean isPoolable() throws SQLException { checkClosed(); return this.poolable; } //#endif JAVA6 // ------------------- java.sql.Wrapper implementation --------------------- /** * Returns an object that implements the given interface to allow access to * non-standard methods, or standard methods not exposed by the proxy. * * If the receiver implements the interface then the result is the receiver * or a proxy for the receiver. If the receiver is a wrapper * and the wrapped object implements the interface then the result is the * wrapped object or a proxy for the wrapped object. Otherwise return the * the result of calling unwrap recursively on the wrapped object * or a proxy for that result. If the receiver is not a * wrapper and does not implement the interface, then an SQLException is thrown. * * @param iface A Class defining an interface that the result must implement. * @return an object that implements the interface. May be a proxy for the actual implementing object. * @throws java.sql.SQLException If no object found that implements the interface * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 @SuppressWarnings("unchecked") public T unwrap(Class iface) throws java.sql.SQLException { if (isWrapperFor(iface)) { return (T) this; } throw Util.invalidArgument("iface: " + iface); } //#endif JAVA6 /** * Returns true if this either implements the interface argument or is directly or indirectly a wrapper * for an object that does. Returns false otherwise. If this implements the interface then return true, * else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped * object. If this does not implement the interface and is not a wrapper, return false. * This method should be implemented as a low-cost operation compared to unwrap so that * callers can use this method to avoid expensive unwrap calls that may fail. If this method * returns true then calling unwrap with the same argument should succeed. * * @param iface a Class defining an interface. * @return true if this implements the interface or directly or indirectly wraps an object that does. * @throws java.sql.SQLException if an error occurs while determining whether this is a wrapper * for an object with the given interface. * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public boolean isWrapperFor( java.lang.Class iface) throws java.sql.SQLException { return (iface != null && iface.isAssignableFrom(this.getClass())); } //#endif JAVA6 // -------------------- Internal Implementation ---------------------------- /** * Constructs a new JDBCStatement with the specified connection and result * type. * * @param c the connection on which this statement will execute * @param resultSetConcurrency int * @param resultSetHoldability int */ JDBCStatement(JDBCConnection c, int props) { resultOut = Result.newExecuteDirectRequest(); connection = c; connectionIncarnation = connection.incarnation; rsProperties = props; } /** * Internal result producer for JDBCStatement (sqlExecDirect mode). * *

* * @param sql a character sequence representing the SQL to be executed * @param statementRetType int * @param generatedKeys int * @param generatedIndexes int[] * @param generatedNames String[] * @throws SQLException when a database access error occurs */ private void fetchResult(String sql, int statementRetType, int generatedKeys, int[] generatedIndexes, String[] generatedNames) throws SQLException { checkClosed(); closeResultData(); if (isEscapeProcessing) { sql = connection.nativeSQL(sql); } resultOut.setPrepareOrExecuteProperties(sql, maxRows, fetchSize, statementRetType, queryTimeout, rsProperties, generatedKeys, generatedIndexes, generatedNames); try { resultIn = connection.sessionProxy.execute(resultOut); performPostExecute(); } catch (HsqlException e) { throw Util.sqlException(e); } if (resultIn.isError()) { throw Util.sqlException(resultIn); } if (resultIn.isData()) { currentResultSet = new JDBCResultSet(connection, this, resultIn, resultIn.metaData); } else if (resultIn.getStatementType() == StatementTypes.RETURN_RESULT) { getMoreResults(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCDataSourceFactory.java0000644000175000017500000002015512007547356024524 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.util.Hashtable; import java.util.Properties; import javax.naming.Context; import javax.naming.Name; import javax.naming.Reference; import javax.naming.RefAddr; import javax.naming.spi.ObjectFactory; import javax.sql.DataSource; /** * A JNDI ObjectFactory for creating data sources supported by HyperSQL * {@link org.hsqldb.jdbc.JDBCDataSource JDBCDataSource} for plain * connections for the end user. * {@link org.hsqldb.jdbc.JDBCPool JDBCPool} for pooled plain * connections for the end user. * {@link org.hsqldb.jdbc.pool.JDBCPooledDataSource JDBCPooledDataSource} for * PooleConnection objects used * by external connection pooling software. * {@link org.hsqldb.jdbc.pool.JDBCXADataSource JDBCXADataSource} for * XAConnection objects used by external connection pooling software. * * @author Darin DeForest (deforest@users dot sourceforge.net) original version * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @version 2.0.0 */ public class JDBCDataSourceFactory implements ObjectFactory { /** * Static method to create a JDBCDataSource instance using the * given properties for url, user, password, etc. */ public static DataSource createDataSource(Properties props) throws Exception { JDBCDataSource ds = (JDBCDataSource) Class.forName(bdsClassName).newInstance(); String value = props.getProperty(databaseName); if (value == null) { value = props.getProperty(urlName); } ds.setDatabase(value); value = props.getProperty(userName); if (value == null) { value = props.getProperty(userNameName); } ds.setUser(value); value = props.getProperty(passwordName); ds.setPassword(value); value = props.getProperty(loginTimeoutName); if (value != null) { value = value.trim(); if (value.length() > 0) { try { ds.setLoginTimeout(Integer.parseInt(value)); } catch (NumberFormatException nfe) {} } } return ds; } /** * Creates a DataSource object using the javax.naming.Reference object * specified.

* * The Reference object's class name should be one of the four supported * data source class names and it must support the properties, database, * user and password. It may optionally support the logingTimeout property. * * HyperSQL's JDBCPooledDataSource and JDBCXADataSource object are intended * as factories used by a connection pooling DataSource.

* JDBCDataSource is a factory for normal connections and can be accessed * directly by user applications.

* JDBCPool is a connection pool accessed directly by user applications.

* * @param obj The reference information used in creating a * Datasource object. * @param name ignored * @param nameCtx ignored * @param environment ignored * @return A newly created JDBCDataSource object; null if an object * cannot be created. * @exception Exception is thrown if database or user is null or invalid */ public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception { if (!(obj instanceof Reference)) { return null; } Reference ref = (Reference) obj; String className = ref.getClassName(); if (bdsClassName.equals(className) || poolClassName.equals(className) || pdsClassName.equals(className) || xdsClassName.equals(className)) { RefAddr refAddr; Object value; JDBCCommonDataSource ds = (JDBCCommonDataSource) Class.forName(className).newInstance(); refAddr = ref.get("database"); if (refAddr == null) { throw new Exception(className + ": RefAddr not set: database"); } value = refAddr.getContent(); if (!(value instanceof String)) { throw new Exception(className + ": invalid RefAddr: database"); } ds.setDatabase((String) value); refAddr = ref.get("user"); if (refAddr == null) { throw new Exception(className + ": RefAddr not set: user"); } value = ref.get("user").getContent(); if (!(value instanceof String)) { throw new Exception(className + ": invalid RefAddr: user"); } ds.setUser((String) value); refAddr = ref.get("password"); if (refAddr == null) { value = ""; } else { value = ref.get("password").getContent(); if (!(value instanceof String)) { throw new Exception(className + ": invalid RefAddr: password"); } } ds.setPassword((String) value); refAddr = ref.get("loginTimeout"); if (refAddr != null) { value = refAddr.getContent(); if (value instanceof String) { String loginTimeoutContent = ((String) value).trim(); if (loginTimeoutContent.length() > 0) { try { ds.setLoginTimeout( Integer.parseInt(loginTimeoutContent)); } catch (NumberFormatException nfe) {} } } } return ds; } else { return null; } } /** * supported properties */ private static final String urlName = "url"; private static final String databaseName = "database"; private static final String userName = "user"; private static final String userNameName = "username"; private static final String passwordName = "password"; private static final String loginTimeoutName = "loginTimeout"; /** * class names */ private static final String bdsClassName = "org.hsqldb.jdbc.JDBCDataSource"; private static final String poolClassName = "org.hsqldb.jdbc.JDBCPool"; private static final String pdsClassName = "org.hsqldb.jdbc.pool.JDBCPooledDataSource"; private static final String xdsClassName = "org.hsqldb.jdbc.pool.JDBCXADataSource"; public JDBCDataSourceFactory() {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCArray.java0000644000175000017500000005740412007547356022227 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.sql.Array; import java.sql.ResultSet; import java.sql.SQLException; import org.hsqldb.ColumnBase; import org.hsqldb.SessionInterface; import org.hsqldb.error.ErrorCode; import org.hsqldb.navigator.RowSetNavigatorClient; import org.hsqldb.result.Result; import org.hsqldb.result.ResultMetaData; import org.hsqldb.types.Type; /** * The mapping in the Java programming language for the SQL type * ARRAY. * By default, an Array value is a transaction-duration * reference to an SQL ARRAY value. By default, an Array * object is implemented using an SQL LOCATOR(array) internally, which * means that an Array object contains a logical pointer * to the data in the SQL ARRAY value rather * than containing the ARRAY value's data. *

* The Array interface provides methods for bringing an SQL * ARRAY value's data to the client as either an array or a * ResultSet object. * If the elements of the SQL ARRAY * are a UDT, they may be custom mapped. To create a custom mapping, * a programmer must do two things: *

    *
  • create a class that implements the {@link java.sql.SQLData} * interface for the UDT to be custom mapped. *
  • make an entry in a type map that contains *
      *
    • the fully-qualified SQL type name of the UDT *
    • the Class object for the class implementing * SQLData *
    *
*

* When a type map with an entry for * the base type is supplied to the methods getArray * and getResultSet, the mapping * it contains will be used to map the elements of the ARRAY value. * If no type map is supplied, which would typically be the case, * the connection's type map is used by default. * If the connection's type map or a type map supplied to a method has no entry * for the base type, the elements are mapped according to the standard mapping. *

* All methods on the Array interface must be fully implemented if the * JDBC driver supports the data type. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since JDK 1.2, HSQLDB 2.0 */ public class JDBCArray implements Array { /** * Retrieves the SQL type name of the elements in * the array designated by this Array object. * If the elements are a built-in type, it returns * the database-specific type name of the elements. * If the elements are a user-defined type (UDT), * this method returns the fully-qualified SQL type name. * * @return a String that is the database-specific * name for a built-in base type; or the fully-qualified SQL type * name for a base type that is a UDT * @exception SQLException if an error occurs while attempting * to access the type name * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public String getBaseTypeName() throws SQLException { checkClosed(); return elementType.getNameString(); } /** * Retrieves the JDBC type of the elements in the array designated * by this Array object. * * @return a constant from the class {@link java.sql.Types} that is * the type code for the elements in the array designated by this * Array object * @exception SQLException if an error occurs while attempting * to access the base type * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public int getBaseType() throws SQLException { checkClosed(); return elementType.getJDBCTypeCode(); } /** * * Retrieves the contents of the SQL ARRAY value designated * by this * Array object in the form of an array in the Java * programming language. This version of the method getArray * uses the type map associated with the connection for customizations of * the type mappings. *

* Note: When getArray is used to materialize * a base type that maps to a primitive data type, then it is * implementation-defined whether the array returned is an array of * that primitive data type or an array of Object. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB always returns an array of Object. * *

* * * @return an array in the Java programming language that contains * the ordered elements of the SQL ARRAY value * designated by this Array object * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Object getArray() throws SQLException { checkClosed(); Object[] array = new Object[data.length]; for (int i = 0; i < data.length; i++) { array[i] = elementType.convertSQLToJava(sessionProxy, data[i]); } return array; } /** * * Retrieves the contents of the SQL ARRAY value designated by this * Array object. * This method uses * the specified map for type map customizations * unless the base type of the array does not match a user-defined * type in map, in which case it * uses the standard mapping. This version of the method * getArray uses either the given type map or the standard mapping; * it never uses the type map associated with the connection. *

* Note: When getArray is used to materialize * a base type that maps to a primitive data type, then it is * implementation-defined whether the array returned is an array of * that primitive data type or an array of Object. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB always returns an array of Object. * *

* * * @param map a java.util.Map object that contains mappings * of SQL type names to classes in the Java programming language * @return an array in the Java programming language that contains the ordered * elements of the SQL array designated by this object * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Object getArray(java.util.Map> map) throws SQLException { return getArray(); } /** * * Retrieves a slice of the SQL ARRAY * value designated by this Array object, beginning with the * specified index and containing up to count * successive elements of the SQL array. This method uses the type map * associated with the connection for customizations of the type mappings. *

* Note: When getArray is used to materialize * a base type that maps to a primitive data type, then it is * implementation-defined whether the array returned is an array of * that primitive data type or an array of Object. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB always returns an array of Object. * *

* * * @param index the array index of the first element to retrieve; * the first element is at index 1 * @param count the number of successive SQL array elements to retrieve * @return an array containing up to count consecutive elements * of the SQL array, beginning with element index * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Object getArray(long index, int count) throws SQLException { checkClosed(); if (!JDBCClobClient.isInLimits(data.length, index - 1, count)) { throw Util.outOfRangeArgument(); } Object[] slice = new Object[count]; for (int i = 0; i < count; i++) { slice[i] = elementType.convertSQLToJava(sessionProxy, data[(int) index + i - 1]); } return slice; } /** * * Retreives a slice of the SQL ARRAY value * designated by this Array object, beginning with the specified * index and containing up to count * successive elements of the SQL array. *

* This method uses * the specified map for type map customizations * unless the base type of the array does not match a user-defined * type in map, in which case it * uses the standard mapping. This version of the method * getArray uses either the given type map or the standard mapping; * it never uses the type map associated with the connection. *

* Note: When getArray is used to materialize * a base type that maps to a primitive data type, then it is * implementation-defined whether the array returned is an array of * that primitive data type or an array of Object. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB always returns an array of Object. * *

* * * @param index the array index of the first element to retrieve; * the first element is at index 1 * @param count the number of successive SQL array elements to * retrieve * @param map a java.util.Map object * that contains SQL type names and the classes in * the Java programming language to which they are mapped * @return an array containing up to count * consecutive elements of the SQL ARRAY value designated by this * Array object, beginning with element * index * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Object getArray(long index, int count, java.util.Map> map) throws SQLException { return getArray(index, count); } /** * Retrieves a result set that contains the elements of the SQL * ARRAY value * designated by this Array object. If appropriate, * the elements of the array are mapped using the connection's type * map; otherwise, the standard mapping is used. *

* The result set contains one row for each array element, with * two columns in each row. The second column stores the element * value; the first column stores the index into the array for * that element (with the first array element being at index 1). * The rows are in ascending order corresponding to * the order of the indices. * * @return a {@link ResultSet} object containing one row for each * of the elements in the array designated by this Array * object, with the rows in ascending order based on the indices. * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public ResultSet getResultSet() throws SQLException { checkClosed(); Result result = this.newColumnResult(0, data.length); return new JDBCResultSet(connection, result, result.metaData); } /** * Retrieves a result set that contains the elements of the SQL * ARRAY value designated by this Array object. * This method uses * the specified map for type map customizations * unless the base type of the array does not match a user-defined * type in map, in which case it * uses the standard mapping. This version of the method * getResultSet uses either the given type map or the standard mapping; * it never uses the type map associated with the connection. *

* The result set contains one row for each array element, with * two columns in each row. The second column stores the element * value; the first column stores the index into the array for * that element (with the first array element being at index 1). * The rows are in ascending order corresponding to * the order of the indices. * * @param map contains the mapping of SQL user-defined types to * classes in the Java programming language * @return a ResultSet object containing one row for each * of the elements in the array designated by this Array * object, with the rows in ascending order based on the indices. * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public ResultSet getResultSet(java.util.Map> map) throws SQLException { return getResultSet(); } /** * Retrieves a result set holding the elements of the subarray that * starts at index index and contains up to * count successive elements. This method uses * the connection's type map to map the elements of the array if * the map contains an entry for the base type. Otherwise, the * standard mapping is used. *

* The result set has one row for each element of the SQL array * designated by this object, with the first row containing the * element at index index. The result set has * up to count rows in ascending order based on the * indices. Each row has two columns: The second column stores * the element value; the first column stores the index into the * array for that element. * * @param index the array index of the first element to retrieve; * the first element is at index 1 * @param count the number of successive SQL array elements to retrieve * @return a ResultSet object containing up to * count consecutive elements of the SQL array * designated by this Array object, starting at * index index. * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public ResultSet getResultSet(long index, int count) throws SQLException { checkClosed(); Result result = this.newColumnResult(index - 1, count); return new JDBCResultSet(connection, result, result.metaData); } /** * Retrieves a result set holding the elements of the subarray that * starts at index index and contains up to * count successive elements. * This method uses * the specified map for type map customizations * unless the base type of the array does not match a user-defined * type in map, in which case it * uses the standard mapping. This version of the method * getResultSet uses either the given type map or the standard mapping; * it never uses the type map associated with the connection. *

* The result set has one row for each element of the SQL array * designated by this object, with the first row containing the * element at index index. The result set has * up to count rows in ascending order based on the * indices. Each row has two columns: The second column stores * the element value; the first column stroes the index into the * array for that element. * * @param index the array index of the first element to retrieve; * the first element is at index 1 * @param count the number of successive SQL array elements to retrieve * @param map the Map object that contains the mapping * of SQL type names to classes in the Java(tm) programming language * @return a ResultSet object containing up to * count consecutive elements of the SQL array * designated by this Array object, starting at * index index. * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public ResultSet getResultSet(long index, int count, java.util.Map> map) throws SQLException { return getResultSet(index, count); } /** * Returns a string representation in the form ARRAY[..., ...] */ public String toString() { if (arrayType == null) { arrayType = Type.getDefaultArrayType(elementType.typeCode); } return arrayType.convertToString(data); } /** * This method frees the Array object and releases the resources that * it holds. The object is invalid once the free * method is called. *

* After free has been called, any attempt to invoke a * method other than free will result in a SQLException * being thrown. If free is called multiple times, the subsequent * calls to free are treated as a no-op. *

* * @throws SQLException if an error occurs releasing * the Array's resources * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6 */ public void free() throws SQLException { if (!closed) { closed = true; connection = null; sessionProxy = null; } } //------------- volatile boolean closed; Type arrayType; Type elementType; Object[] data; JDBCConnection connection; SessionInterface sessionProxy; public JDBCArray(Object[] data, Type type, Type arrayType, SessionInterface session) { this(data, type, arrayType, session.getJDBCConnection()); this.sessionProxy = session; } /** * Constructor should reject unsupported types. */ JDBCArray(Object[] data, Type type, JDBCConnection connection) throws SQLException { this(data, type, null, connection); } JDBCArray(Object[] data, Type type, Type arrayType, JDBCConnection connection) { this.data = data; this.elementType = type; this.arrayType = arrayType; this.connection = connection; this.sessionProxy = connection.sessionProxy; } public Object[] getArrayInternal() { return data; } private Result newColumnResult(long position, int count) throws SQLException { if (!JDBCClobClient.isInLimits(data.length, position, count)) { throw Util.outOfRangeArgument(); } Type[] types = new Type[2]; types[0] = Type.SQL_INTEGER; types[1] = elementType; ResultMetaData meta = ResultMetaData.newSimpleResultMetaData(types); meta.columnLabels = new String[] { "C1", "C2" }; meta.colIndexes = new int[] { -1, -1 }; meta.columns = new ColumnBase[2]; ColumnBase column = new ColumnBase("", "", "", ""); column.setType(types[0]); meta.columns[0] = column; column = new ColumnBase("", "", "", ""); column.setType(types[1]); meta.columns[1] = column; RowSetNavigatorClient navigator = new RowSetNavigatorClient(); for (int i = (int) position; i < position + count; i++) { Object[] rowData = new Object[2]; rowData[0] = Integer.valueOf(i + 1); rowData[1] = data[i]; navigator.add(rowData); } Result result = Result.newDataResult(meta); result.setNavigator(navigator); return result; } private void checkClosed() throws SQLException { if (closed) { throw Util.sqlException(ErrorCode.X_07501); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCClobFile.java0000644000175000017500000012051612007547356022623 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.BufferedInputStream; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.CharArrayWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.RandomAccessFile; import java.io.Reader; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; import java.nio.charset.CodingErrorAction; import java.nio.charset.IllegalCharsetNameException; import java.sql.Clob; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.InOutUtil; import org.hsqldb.lib.KMPSearchAlgorithm; /** * *

*

HSQLDB-Specific Information:

* * Starting with 2.1, in addition to HSQLDB driver support for both client-side * in-memory and remote SQL CLOB data implementations, this class is provided * to expose efficient, relatively high-performance CLOB operations over client * accessible files.

* * Design Notes

* * Although it is possible to implement a transactional version of this class, * the present implementation directly propagates changes to the underlying * file such that changes become visible as soon as they are either * implicitly or explicitly flushed to disk. *

* *

* * @author boucherb@users * @version 2.1.1 * @since HSQLDB 2.1 */ public class JDBCClobFile implements java.sql.Clob { /** * Retrieves the number of characters * in the CLOB value * designated by this Clob object. * * @return length of the CLOB in characters * @exception SQLException if there is an error accessing the * length of the CLOB value * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public long length() throws SQLException { checkClosed(); if (m_fixedWidthCharset) { return m_file.length() / m_maxCharWidth; } ReaderAdapter adapter = null; try { adapter = new ReaderAdapter(m_file, 0, Long.MAX_VALUE); final long length = adapter.skip(Long.MAX_VALUE); return length; } catch (Exception ex) { throw Util.sqlException(ex); } finally { if (adapter != null) { try { adapter.close(); } catch (Exception ex) {} } } } /** * Retrieves a copy of the specified substring * in the CLOB value * designated by this Clob object. * The substring begins at position * pos and has up to length consecutive * characters. * * @param pos the first character of the substring to be extracted. * The first character is at position 1. * @param length the number of consecutive characters to be copied; * the value for length must be 0 or greater * @return a String that is the specified substring in * the CLOB value designated by this Clob object * @exception SQLException if there is an error accessing the * CLOB value; if pos is less than 1 or length is * less than 0 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public String getSubString(final long pos, final int length) throws SQLException { Reader reader = null; CharArrayWriter writer = null; try { final int initialCapacity = Math.min(InOutUtil.DEFAULT_COPY_BUFFER_SIZE, length); // reader = getCharacterStream(pos, length); writer = new CharArrayWriter(initialCapacity); // InOutUtil.copy(reader, writer, length); } catch (SQLException ex) { throw ex; } catch (Exception ex) { throw Util.sqlException(ex); } finally { if (reader != null) { try { reader.close(); } catch (Exception ex) {} } } return writer.toString(); } /** * Retrieves the CLOB value designated by this Clob * object as a java.io.Reader object (or as a stream of * characters). * * @return a java.io.Reader object containing the * CLOB data * @exception SQLException if there is an error accessing the * CLOB value * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setCharacterStream * @since JDK 1.2 */ public Reader getCharacterStream() throws SQLException { return getCharacterStream(1, Long.MAX_VALUE); } /** * Retrieves the CLOB value designated by this Clob * object as an ascii stream. * * @return a java.io.InputStream object containing the * CLOB data * @exception SQLException if there is an error accessing the * CLOB value * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setAsciiStream * @since JDK 1.2 */ public InputStream getAsciiStream() throws SQLException { InputStream stream; try { stream = new JDBCBlobFile.InputStreamAdapter(m_file, 0, Long.MAX_VALUE) { public void close() throws IOException { try { super.close(); } finally { m_streams.remove(this); } } }; } catch (Exception ex) { throw Util.sqlException(ex); } m_streams.add(stream); return stream; } /** * Retrieves the character position at which the specified char[] * pattern appears in the CLOB value * represented by this Clob object. The search * begins at position start. * * @param pattern the substring for which to search * @param start the position at which to begin searching; the first position * is 1 * @return the position at which the substring appears or -1 if it is not * present; the first position is 1 * @exception SQLException if there is an error accessing the * CLOB value or if pos is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method */ public long position(final char[] pattern, final long start) throws SQLException { if (start < 1) { throw Util.outOfRangeArgument("start: " + start); } else if (pattern == null || pattern.length == 0 || start > length()) { return -1L; } Reader reader = null; try { reader = getCharacterStream(start, Long.MAX_VALUE); final long matchOffset = KMPSearchAlgorithm.search(reader, pattern, KMPSearchAlgorithm.computeTable(pattern)); return matchOffset == -1 ? -1 : start + matchOffset; } catch (SQLException ex) { throw ex; } catch (Exception ex) { throw Util.sqlException(ex); } finally { if (reader != null) { try { reader.close(); } catch (Exception ex) {} } } } /** * Retrieves the character position at which the specified * Clob object searchstr appears in this * Clob object. The search begins at position * start. * * @param searchstr the Clob object for which to search * @param start the position at which to begin searching; the first * position is 1 * @return the position at which the Clob object appears * or -1 if it is not present; the first position is 1 * @exception SQLException if there is an error accessing the * CLOB value or if start is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public long position(String searchstr, long start) throws SQLException { return position(searchstr == null ? null : searchstr.toCharArray(), start); } /** * Retrieves the character position at which the specified * Clob object searchstr appears in this * Clob object. The search begins at position * start. * * @param pattern the Clob object for which to search * @param start the position at which to begin searching; the first * position is 1 * @return the position at which the Clob object appears * or -1 if it is not present; the first position is 1 * @exception SQLException if there is an error accessing the * CLOB value or if start is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public long position(final Clob pattern, final long start) throws SQLException { long patternLength; if (start < 1) { throw Util.outOfRangeArgument("start: " + start); } else if ((patternLength = pattern == null ? 0 : pattern.length()) == 0) { return -1L; } else if (patternLength > Integer.MAX_VALUE) { throw Util.outOfRangeArgument("pattern.length(): " + patternLength); } char[] charPattern; if (pattern instanceof JDBCClob) { charPattern = ((JDBCClob) pattern).data().toCharArray(); } else { Reader reader = null; CharArrayWriter writer = new CharArrayWriter(); try { reader = pattern.getCharacterStream(); InOutUtil.copy(reader, writer, patternLength); } catch (IOException ex) { throw Util.sqlException(ex); } finally { if (reader != null) { try { reader.close(); } catch (IOException ex) {} } } charPattern = writer.toCharArray(); } return position(charPattern, start); } //---------------------------- jdbc 3.0 ----------------------------------- /** * Writes the given Java String to the CLOB * value that this Clob object designates at the position * pos. The string will overwrite the existing characters * in the Clob object starting at the position * pos. If the end of the Clob value is reached * while writing the given string, then the length of the Clob * value will be increased to accommodate the extra characters. *

* Note: If the value specified for pos * is greater then the length+1 of the CLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * @param pos the position at which to start writing to the CLOB * value that this Clob object represents; * The first position is 1 * @param str the string to be written to the CLOB * value that this Clob designates * @return the number of characters written * @exception SQLException if there is an error accessing the * CLOB value or if pos is less than 1 * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4 */ public int setString(final long pos, final String str) throws SQLException { return setString(pos, str, 0, str == null ? 0 : str.length()); } /** * Writes len characters of str, starting * at character offset, to the CLOB value * that this Clob represents. The string will overwrite the existing characters * in the Clob object starting at the position * pos. If the end of the Clob value is reached * while writing the given string, then the length of the Clob * value will be increased to accommodate the extra characters. *

* Note: If the value specified for pos * is greater then the length+1 of the CLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * @param pos the position at which to start writing to this * CLOB object; The first position is 1 * @param str the string to be written to the CLOB * value that this Clob object represents * @param offset the offset into str to start reading * the characters to be written * @param len the number of characters to be written * @return the number of characters written * @exception SQLException if there is an error accessing the * CLOB value or if pos is less than 1 * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4 */ public int setString(final long pos, final String str, final int offset, final int len) throws SQLException { if (str == null) { throw Util.nullArgument("str"); } Writer writer = null; try { writer = setCharacterStream(pos); writer.write(str, offset, len); } catch (Exception ex) { throw Util.sqlException(ex); } finally { if (writer != null) { try { writer.close(); } catch (Exception ex) {} } } return len; } /** * Retrieves a stream to be used to write Ascii characters to the * CLOB value that this Clob object represents, * starting at position pos. Characters written to the stream * will overwrite the existing characters * in the Clob object starting at the position * pos. If the end of the Clob value is reached * while writing characters to the stream, then the length of the Clob * value will be increased to accommodate the extra characters. *

* Note: If the value specified for pos * is greater then the length+1 of the CLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * @param pos the position at which to start writing to this * CLOB object; The first position is 1 * @return the stream to which ASCII encoded characters can be written * @exception SQLException if there is an error accessing the * CLOB value or if pos is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getAsciiStream * * @since JDK 1.4 */ public OutputStream setAsciiStream(long pos) throws SQLException { if (pos < 1) { throw Util.invalidArgument("pos: " + pos); } checkClosed(); createFile(); OutputStream stream; try { stream = new JDBCBlobFile.OutputStreamAdapter(m_file, pos - 1) { public void close() throws IOException { try { super.close(); } finally { m_streams.remove(this); } } }; } catch (Exception ex) { throw Util.sqlException(ex); } m_streams.add(stream); return stream; } /** * Retrieves a stream to be used to write a stream of Unicode characters * to the CLOB value that this Clob object * represents, at position pos. Characters written to the stream * will overwrite the existing characters * in the Clob object starting at the position * pos. If the end of the Clob value is reached * while writing characters to the stream, then the length of the Clob * value will be increased to accommodate the extra characters. *

* Note: If the value specified for pos * is greater then the length+1 of the CLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * @param pos the position at which to start writing to the * CLOB value; The first position is 1 * * @return a stream to which Unicode encoded characters can be written * @exception SQLException if there is an error accessing the * CLOB value or if pos is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getCharacterStream * * @since JDK 1.4 */ public Writer setCharacterStream(final long pos) throws SQLException { if (pos < 1) { throw Util.invalidArgument("pos: " + pos); } checkClosed(); createFile(); Writer writer; try { final WriterAdapter adapter = new WriterAdapter(m_file, pos - 1) { public void close() throws IOException { try { super.close(); } finally { m_streams.remove(this); } } }; writer = new BufferedWriter(adapter); } catch (Exception ex) { throw Util.sqlException(ex); } m_streams.add(writer); return writer; } /** * Truncates the CLOB value that this Clob * designates to have a length of len * characters. *

* Note: If the value specified for pos * is greater then the length+1 of the CLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * @param len the length, in characters, to which the CLOB value * should be truncated * @exception SQLException if there is an error accessing the * CLOB value or if len is less than 0 * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4 */ public void truncate(long len) throws SQLException { if (len < 0) { throw Util.invalidArgument("len: " + len); } checkClosed(); ReaderAdapter adapter = null; RandomAccessFile randomAccessFile = null; long filePointer; try { adapter = new ReaderAdapter(m_file, len, Long.MAX_VALUE); filePointer = adapter.getFilePointer(); adapter.close(); randomAccessFile = new RandomAccessFile(m_file, "rw"); randomAccessFile.setLength(filePointer); } catch (Exception ex) { throw Util.sqlException(ex); } finally { if (adapter != null) { try { adapter.close(); } catch (Exception ex) {} } if (randomAccessFile != null) { try { randomAccessFile.close(); } catch (Exception ex) {} } } } /** * This method frees the Clob object and releases the resources the resources * that it holds. The object is invalid once the free method * is called. *

* After free has been called, any attempt to invoke a * method other than free will result in a SQLException * being thrown. If free is called multiple times, the subsequent * calls to free are treated as a no-op. *

* @throws SQLException if an error occurs releasing * the Clob's resources * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4 */ public synchronized void free() throws SQLException { if (m_closed) { return; } m_closed = true; final List streams = new ArrayList(); streams.addAll(m_streams); m_streams = null; for (Iterator itr = streams.iterator(); itr.hasNext(); ) { final Object stream = itr.next(); if (stream instanceof InputStream) { try { ((InputStream) stream).close(); } catch (Exception ex) { // } } else if (stream instanceof OutputStream) { try { ((OutputStream) stream).close(); } catch (Exception ex) { // } } } if (m_deleteOnFree) { try { m_file.delete(); } catch (Exception e) {} } } /** * Returns a Reader object that contains a partial Clob value, starting * with the character specified by pos, which is length characters in length. * * @param pos the offset to the first character of the partial value to * be retrieved. The first character in the Clob is at position 1. * @param length the length in characters of the partial value to be retrieved. * @return Reader through which the partial Clob value can be read. * @throws SQLException if pos is less than 1 or if pos is greater than the number of * characters in the Clob or if pos + length is greater than the number of * characters in the Clob * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since 1.6 */ public Reader getCharacterStream(long pos, long length) throws SQLException { if (pos < 1) { throw Util.outOfRangeArgument("pos: " + pos); } pos--; if (length < 0) { throw Util.outOfRangeArgument("length: " + length); } Reader reader; try { reader = new ReaderAdapter(m_file, pos, length) { public void close() throws IOException { try { super.close(); } finally { m_streams.remove(this); } } }; } catch (Exception ex) { throw Util.sqlException(ex); } m_streams.add(reader); return reader; } /** * Retrieves the canonical File object denoting the file that * backs this CLOB. * * @return the file that backs this CLOB. */ public File getFile() { return m_file; } /** * * @return the name of the character encoding used to read and write * character data in the underlying files, as well as to determine * the character length and character offsets into the underlying * file */ public String getEncoding() { return m_encoding; } /** * Retrieves whether an attempt to delete the backing file * is made in response to invocation of {@link #free()}. * * @return true if backing file deletion is attempted; otherwise false. */ public boolean isDeleteOnFree() { return m_deleteOnFree; } /** * Assigns whether an attempt to delete the backing file * is made in response to invocation of {@link #free()}. * * @param deleteOnFree the new value to assign */ public void setDeleteOnFree(boolean deleteOnFree) { m_deleteOnFree = deleteOnFree; } /** * Ensures this object is freed in response to finalization. */ protected void finalize() throws Throwable { try { super.finalize(); } finally { try { this.free(); } catch (Throwable throwable) {} } } //-------------------------------------------------------------------------- // Internal Implementation //-------------------------------------------------------------------------- public static final String TEMP_FILE_PREFIX = "hsql_jdbc_clob_file_"; public static final String TEMP_FILE_SUFFIX = ".tmp"; // private final File m_file; // private boolean m_closed; private boolean m_deleteOnFree; private String m_encoding; private Charset m_charset; private CharsetEncoder m_encoder; private boolean m_fixedWidthCharset; private int m_maxCharWidth; private List m_streams = new ArrayList(); /** * Convenience constructor for {@link * #JDBCClobFile(java.lang.String) * JDBCClobFile((String)null)}.

* * @throws SQLException if the platform encoding is unsupported, * the temp file cannot be created or some other * error occurs that prevents the construction of a * valid instance of this class. */ public JDBCClobFile() throws SQLException { this((String) null); } /** * Constructs a new JDBCClobFile instance backed by an File object * created by File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_SUFFIX), * using the given encoding to read and write file content.

* * @param encoding the name of the character encoding used to read and write * character data in the underlying file, as well as to determine * the character length of and character offsets into the underlying * file. Specify null to denote the platform encoding. * * @throws SQLException if the given encoding is unsupported, * the backing temp file could not be created or if a security * manager exists and its {@link * java.lang.SecurityManager#checkWrite(java.lang.String)} * method does not allow a file to be created. */ public JDBCClobFile(String encoding) throws SQLException { try { setEncoding(encoding); m_file = File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_SUFFIX); m_deleteOnFree = true; } catch (Exception ex) { throw Util.sqlException(ex); } } /** * Convenience constructor for {@link * #JDBCClobFile(java.io.File, java.lang.String) * JDBCClobFile(file,null)}.

* * @param file that is to back the new CLOB instance. * * @throws SQLException if an I/O error occurs, which is possible because the * construction of the canonical pathname may require * file-system queries; a required system property value * cannot be accessed; a security manager exists and its * {@link java.lang.SecurityManager#checkRead} * method denies read access to the file */ public JDBCClobFile(File file) throws SQLException { this(file, null); } /** * Constructs a new JDBCClobFile instance backed by the given File object * using the given encoding to read and write file content.

* * @param file that is to back the new CLOB instance. * @param encoding the name of the character encoding used to read and write * character data in the underlying file, as well as to determine * the character length of and character offsets into the underlying * file. Specify null to denote the platform encoding. * * @throws SQLException if the given encoding is unsupported; * an I/O error occurs, which is possible because the * construction of the canonical pathname may require * file-system queries; a required system property value * cannot be accessed; a security manager exists and its * {@link java.lang.SecurityManager#checkRead} * method denies read access to the file */ public JDBCClobFile(File file, String encoding) throws SQLException { if (file == null) { throw Util.nullArgument("file"); } try { setEncoding(encoding); m_file = file.getCanonicalFile(); checkIsFile( /*checkExists*/false); m_deleteOnFree = false; } catch (Exception ex) { throw Util.sqlException(ex); } } protected final void setEncoding(final String encoding) throws UnsupportedEncodingException { final Charset charSet = charsetForName(encoding); final CharsetEncoder encoder = charSet.newEncoder().onMalformedInput( CodingErrorAction.REPLACE).onUnmappableCharacter( CodingErrorAction.REPLACE); final float maxBytesPerChar = encoder.maxBytesPerChar(); final float averageBytesPerChar = encoder.averageBytesPerChar(); final boolean fixedWidthCharset = (maxBytesPerChar == Math.round(maxBytesPerChar)) && (maxBytesPerChar == averageBytesPerChar); // m_fixedWidthCharset = fixedWidthCharset; m_maxCharWidth = Math.round(maxBytesPerChar); m_charset = charSet; m_encoder = encoder; m_encoding = m_charset.name(); } protected static Charset charsetForName(final String charsetName) throws UnsupportedEncodingException { String csn = charsetName; if (csn == null) { csn = Charset.defaultCharset().name(); } try { if (Charset.isSupported(csn)) { return Charset.forName(csn); } } catch (IllegalCharsetNameException x) {} throw new UnsupportedEncodingException(csn); } protected final void checkIsFile(boolean checkExists) throws SQLException { boolean exists = false; boolean isFile = false; try { exists = m_file.exists(); } catch (Exception ex) { throw Util.sqlException(ex); } if (exists) { try { isFile = m_file.isFile(); } catch (Exception ex) { throw Util.sqlException(ex); } } if (exists) { if (!isFile) { throw Util.invalidArgument("Is not a file: " + m_file); } } else if (checkExists) { throw Util.invalidArgument("Does not exist: " + m_file); } } protected void checkClosed() throws SQLException { if (m_closed) { throw Util.sqlException(ErrorCode.X_07501); } } protected void createFile() throws SQLException { try { if (!m_file.exists()) { FileUtil.getFileUtil().makeParentDirectories(m_file); m_file.createNewFile(); } } catch (Exception ex) { throw Util.sqlException(ex); } checkIsFile( /*checkExists*/true); } protected class WriterAdapter extends Writer { private final RandomAccessFile m_randomAccessFile; public WriterAdapter(final File file, final long pos) throws FileNotFoundException, IOException { if (file == null) { throw new NullPointerException("file"); } if (pos < 0) { throw new IllegalArgumentException("pos: " + pos); } ReaderAdapter reader = null; long filePointer; try { reader = new ReaderAdapter(file, pos, Long.MAX_VALUE); filePointer = reader.getFilePointer(); } finally { if (reader != null) { try { reader.close(); } catch (Exception ex) {} } } m_randomAccessFile = new RandomAccessFile(file, "rw"); m_randomAccessFile.seek(filePointer); } public void flush() throws IOException { m_randomAccessFile.getFD().sync(); } public void close() throws IOException { m_randomAccessFile.close(); } public void write(char[] cbuf, int off, int len) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStreamWriter writer = m_encoding == null ? new OutputStreamWriter(baos) : new OutputStreamWriter(baos, m_charset); writer.write(cbuf, off, len); writer.close(); m_randomAccessFile.write(baos.toByteArray()); } } protected class ReaderAdapter extends Reader { // private static final int CHARBUFFER_CAPACTIY = 128; // private final Reader m_reader; private long m_remaining = Long.MAX_VALUE; private long m_filePointer; private ByteBuffer m_byteBuffer; private CharBuffer m_charBuffer; public ReaderAdapter(final File file, final long pos, final long length) throws FileNotFoundException, IOException { if (file == null) { throw new NullPointerException("file"); } if (pos < 0) { throw new IllegalArgumentException("pos: " + pos); } if (length < 0) { throw new IllegalArgumentException("length: " + length); } // if (!m_fixedWidthCharset) { final int charCapacity = CHARBUFFER_CAPACTIY; final int byteCapacity = charCapacity * m_maxCharWidth; m_charBuffer = CharBuffer.allocate(charCapacity); m_byteBuffer = ByteBuffer.allocate(byteCapacity); } final FileInputStream fis = new FileInputStream(file); final BufferedInputStream bis = new BufferedInputStream(fis); final InputStreamReader isr = new InputStreamReader(bis, m_charset); m_reader = isr; // seek character position 'pos' for (long i = 0; i < pos; i++) { final int ch = read(); if (ch == -1) { break; } } // important - do not assign until *after* seek above. m_remaining = length; } public int read(final char[] cbuf, final int off, int len) throws IOException { final long l_remaining = m_remaining; if (l_remaining <= 0) { return -1; } else if (l_remaining < len) { len = (int) l_remaining; } int charsRead = m_reader.read(cbuf, off, len); if (charsRead == -1) { return -1; } else if (charsRead > l_remaining) { charsRead = (int) l_remaining; m_remaining = 0; } else { m_remaining -= charsRead; } int bytesRead; if (m_fixedWidthCharset) { bytesRead = (m_maxCharWidth * charsRead); } else { final boolean reallocate = (charsRead > m_charBuffer.capacity()); final CharBuffer cb = reallocate ? CharBuffer.allocate(charsRead) : m_charBuffer; final ByteBuffer bb = reallocate ? ByteBuffer.allocate(charsRead * m_maxCharWidth) : m_byteBuffer; // cb.clear(); bb.clear(); cb.put(cbuf, off, charsRead); cb.flip(); m_encoder.encode(cb, bb, /*endOfinput*/ true); bb.flip(); bytesRead = bb.limit(); if (reallocate) { m_byteBuffer = bb; m_charBuffer = cb; } } m_filePointer += bytesRead; return charsRead; } public void close() throws IOException { m_reader.close(); } public long getFilePointer() { return m_filePointer; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/Util.java0000644000175000017500000010714212007547356021436 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.sql.SQLException; import java.sql.SQLWarning; //#ifdef JAVA6 import java.sql.SQLDataException; import java.sql.SQLFeatureNotSupportedException; import java.sql.SQLIntegrityConstraintViolationException; import java.sql.SQLInvalidAuthorizationSpecException; import java.sql.SQLNonTransientConnectionException; import java.sql.SQLSyntaxErrorException; import java.sql.SQLTransactionRollbackException; import java.sql.SQLTransientConnectionException; //#endif JAVA6 import org.hsqldb.HsqlException; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.result.Result; /* $Id: Util.java 4413 2011-09-17 10:38:53Z fredt $ */ // boucherb@users - 20060523 - patch 1.9.0 - removed some unused imports // Revision 1.16 2006/07/12 11:53:53 boucherb // - merging back remaining material overritten by Fred's type-system upgrades /** * Provides driver constants and a gateway from internal HsqlExceptions to * external SQLExceptions. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.2 */ public class Util { static final void throwError(HsqlException e) throws SQLException { //#ifdef JAVA6 throw sqlException(e.getMessage(), e.getSQLState(), e.getErrorCode(), e); //#else /* SQLException se = new SQLException(e.getMessage(), e.getSQLState(), e.getErrorCode()); se.initCause(e); throw se; */ //#endif JAVA6 } static final void throwError(Result r) throws SQLException { //#ifdef JAVA6 throw sqlException(r.getMainString(), r.getSubString(), r.getErrorCode(), r.getException()); //#else /* SQLException se = new SQLException(r.getMainString(), r.getSubString(), r.getErrorCode()); if (r.getException() != null) { se.initCause(r.getException()); } throw se; */ //#endif JAVA6 } public static final SQLException sqlException(HsqlException e) { //#ifdef JAVA6 return sqlException(e.getMessage(), e.getSQLState(), e.getErrorCode(), e); //#else /* SQLException se = new SQLException(e.getMessage(), e.getSQLState(), e.getErrorCode()); se.initCause(e); return se; */ //#endif JAVA6 } public static final SQLException sqlException(HsqlException e, Throwable cause) { //#ifdef JAVA6 return sqlException(e.getMessage(), e.getSQLState(), e.getErrorCode(), cause); //#else /* SQLException se = new SQLException(e.getMessage(), e.getSQLState(), e.getErrorCode()); if (cause != null) { se.initCause(cause); } return se; */ //#endif JAVA6 } public static final SQLException sqlException(int id) { return sqlException(Error.error(id)); } public static final SQLException sqlExceptionSQL(int id) { return sqlException(Error.error(id)); } public static final SQLException sqlException(int id, String message) { return sqlException(Error.error(id, message)); } public static final SQLException sqlException(int id, String message, Throwable cause) { return sqlException(Error.error(id, message), cause); } public static final SQLException sqlException(int id, int add) { return sqlException(Error.error(id, add)); } static final SQLException sqlException(int id, int subId, Object[] add) { return sqlException(Error.error(null, id, subId, add)); } static final SQLException notSupported() { //#ifdef JAVA6 HsqlException e = Error.error(ErrorCode.X_0A000); return new SQLFeatureNotSupportedException(e.getMessage(), e.getSQLState(), -ErrorCode.X_0A000); //#else /* return sqlException(Error.error(ErrorCode.X_0A000)); */ //#endif JAVA6 } static SQLException notUpdatableColumn() { return sqlException(ErrorCode.X_0U000); } public static SQLException nullArgument() { return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT); } static SQLException nullArgument(String name) { return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, name + ": null"); } public static SQLException invalidArgument() { return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT); } public static SQLException invalidArgument(String name) { return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, name); } public static SQLException outOfRangeArgument() { return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT); } public static SQLException outOfRangeArgument(String name) { return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, name); } public static SQLException connectionClosedException() { return sqlException(ErrorCode.X_08003); } public static SQLWarning sqlWarning(Result r) { return new SQLWarning(r.getMainString(), r.getSubString(), r.getErrorCode()); } public static SQLException sqlException(Throwable t) { //#ifdef JAVA6 return new SQLNonTransientConnectionException(t); //#else /* return new SQLException(t.getMessage(), Error.getStateString(ErrorCode.GENERAL_ERROR), ErrorCode.GENERAL_ERROR); */ //#endif JAVA6 } public static SQLException sqlException(Result r) { //#ifdef JAVA6 return sqlException(r.getMainString(), r.getSubString(), r.getErrorCode(), r.getException()); //#else /* SQLException se = new SQLException(r.getMainString(), r.getSubString(), r.getErrorCode()); if (r.getException() != null) { se.initCause(r.getException()); } return se; */ //#endif JAVA6 } // TODO: Needs review. // // Connection exception subclass may be an insufficient discriminator // regarding the choice of throwing transient or non-transient // connection exception. // // SQL 2003 Table 32 SQLSTATE class and subclass values // // connection exception 08 (no subclass) 000 // // SQL-client unable to establish 001 // SQL-connection // // connection name in use 002 // // connection does not exist 003 // // SQL-server rejected establishment 004 // of SQL-connection // // connection failure 006 // // transaction resolution unknown 007 // org.hsqldb.Trace - sql-error-messages // // 080=08000 socket creation error - better 08001 ? // 085=08000 Unexpected exception when setting up TLS // // 001=08001 The database is already in use by another process - better 08002 ? // // 002=08003 Connection is closed // 003=08003 Connection is broken // 004=08003 The database is shutdown // 094=08003 Database does not exists - better 08001 ? // //#ifdef JAVA6 public static final SQLException sqlException(String msg, String sqlstate, int code, Throwable cause) { if (sqlstate.startsWith("08")) { if (!sqlstate.endsWith("3")) { // then, e.g. - the database may spuriously cease to be "in use" // upon retry // - the network configuration, server availability // may change spuriously // - keystore location/content may change spuriously return new SQLTransientConnectionException(msg, sqlstate, code, cause); } else { // the database is (permanently) shut down or the connection is // (permanently) closed or broken return new SQLNonTransientConnectionException(msg, sqlstate, code, cause); } } else if (sqlstate.startsWith("22")) { return new SQLDataException(msg, sqlstate, code, cause); } else if (sqlstate.startsWith("23")) { return new SQLIntegrityConstraintViolationException(msg, sqlstate, code, cause); } else if (sqlstate.startsWith("28")) { return new SQLInvalidAuthorizationSpecException(msg, sqlstate, code, cause); } else if (sqlstate.startsWith("42") || sqlstate.startsWith("37") || sqlstate.startsWith("2A")) { // TODO: // // First, the overview section of java.sql.SQLSyntaxErrorException // // "...thrown when the SQLState class value is '42'" // // appears to be inaccurate or not in sync with the // SQL 2003 standard, 02 Foundation, Table 32, which states: // // Condition Class SubClass // syntax error or access rule violation - 42 (no subclass) 000 // // SQL 2003 describes an Access Rule Violation as refering to // the case where, in the course of preparing or executing // an SQL statement, an Access Rule section pertaining // to one of the elements of the statement is violated. // // Further, section 13.4 Calls to an // lists: // // SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION_NO_SUBCLASS: // constant SQLSTATE_TYPE :="42000"; // SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION_IN_DIRECT_STATEMENT_NO_SUBCLASS: // constant SQLSTATE_TYPE :="2A000"; // SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION_IN_DYNAMIC_STATEMENT_NO_SUBCLASS: // constant SQLSTATE_TYPE :="37000"; // // Strangely, SQLSTATEs "37000" and 2A000" are not mentioned // anywhere else in any of the SQL 2003 parts and are // conspicuously missing from 02 - Foundation, Table 32. // // ----------------------------------- /// // Our only Access Violation SQLSTATE so far is: // // Error.NOT_AUTHORIZED 255=42000 User not authorized for action '$$' // // Our syntax exceptions are apparently all sqlstate "37000" // // Clearly, we should differentiate between DIRECT and DYNAMIC // SQL forms. And clearly, our current "37000" is "wrong" in // that we do not actually support dynamic SQL syntax, but // rather implement similar behaviour only through JDBC // Prepared and Callable statements. return new SQLSyntaxErrorException(msg, sqlstate, code, cause); } else if (sqlstate.startsWith("40")) { // TODO: our 40xxx exceptions are not currently used (correctly) // for transaction rollback exceptions: // // 018=40001 Serialization failure // // - currently used to indicate Java object serialization // failures, which is just plain wrong. // // 019=40001 Transfer corrupted // // - currently used to indicate IOExceptions related to // PreparedStatement XXXStreamYYY operations and Result // construction using RowInputBinary (e.g. when reading // a result transmitted over the network), which is // probably also just plain wrong. // // SQL 2003 02 - Foundation, Table 32 states: // // 40000 transaction rollback - no subclass // 40001 transaction rollback - (transaction) serialization failure // 40002 transaction rollback - integrity constraint violation // 40003 transaction rollback - statement completion unknown // 40004 transaction rollback - triggered action exception // return new SQLTransactionRollbackException(msg, sqlstate, code, cause); } else if (sqlstate.startsWith("0A")) { // JSR 221 2005-12-14 prd return new SQLFeatureNotSupportedException(msg, sqlstate, code, cause); } else { // TODO resolved: // // JSR 221 2005-12-14 prd // // "Any SQLState class values which are currently not mapped to // either a SQLNonTransientException or a SQLTransientException // will result in a java.sql.SQLException being thrown." // return new SQLException(msg, sqlstate, code, cause); } } //#endif JAVA6 // ----------------------------------------------------------------------------- // TODO: // This is just reminder stuff to borrow from as error reporting is refined, // better localized and made more standards-compliant. // static SQLException blobDirectUpdateByLocatorNotSupportedException() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException blobInFreedStateException() { // return sqlException(ErrorCode.ASSERT_FAILED, "valid==true"); // } // // static SQLException blobInputMaxOctetLengthExceededException(long length) { // String msg = "Maximum Blob input octet length exceeded: " // + length; //NOI18N // // return sqlException(ErrorCode.INPUTSTREAM_ERROR, msg); // } // // static SQLException blobInputStreamTransferCorruptedException(Exception e) { // // According to SQL 2003, error code 19 should not // // have sqlstate 40001, which is supposed to indicate a // // transaction rollback due to transaction serialization // // failure // return sqlException(ErrorCode.TRANSFER_CORRUPTED, String.valueOf(e)); // } // // static SQLException callableStatementOutAndInOutParametersNotSupportedException() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException callableStatementParameterIndexNotFoundException(int index) { // //String msg = "Parameter index out of bounds: " + index; //NOI18N // return sqlException(Error.error(ErrorCode.COLUMN_NOT_FOUND, Integer.toString(index))); // } // // static SQLException callableStatementParameterNameNotFoundException(String parameterName) { // return sqlException(Error.error(ErrorCode.COLUMN_NOT_FOUND, parameterName)); // } // // static SQLException characterInputStreamIOException(Exception e) { // return sqlException(Error.INPUTSTREAM_ERROR, String.valueOf(e)); // } // // static SQLException characterInputStreamTransferCorruptedException(Exception e) { // // According to SQL 2003, error code 19 should not // // have sqlstate 40001, which is supposed to indicate a // // transaction rollback due to transaction serialization // // failure // return sqlException(ErrorCode.TRANSFER_CORRUPTED, String.valueOf(e)); // } // // static SQLException characterOutputStreamIOException(Exception e) { // return sqlException(ErrorCode.GENERAL_IO_ERROR, String.valueOf(e)); // } // // static SQLException characterSequenceIndexArgumentOutOfBoundsException(String name, long value) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, name + ": " + value); // } // // static SQLException clientInfoNotSupportedException() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED, "ClientInfo"); // } // // static SQLException clobDirectUpdateByLocatorNotSupportedException() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException clobInFreedStateException() { // return sqlException(ErrorCode.ASSERT_FAILED, "valid==true"); // } // // static SQLException clobInputMaxCharacterLengthExceededException(long length) { // String msg = "Max Clob input character length exceeded: " // + length; //NOI18N // // return sqlException(ErrorCode.INPUTSTREAM_ERROR, msg); // } // // static SQLException clobInputStreamTransferCorruptedException(Exception e) { // // According to SQL 2003, error code 19 should not // // have sqlstate 40001, which is supposed to indicate a // // transaction rollback due to transaction serialization // // failure // return sqlException(ErrorCode.TRANSFER_CORRUPTED, String.valueOf(e)); // } // //// public static SQLException connectionClosedException() { //// return sqlException(ErrorCode.CONNECTION_IS_CLOSED); //// } // // // static SQLException connectionNativeSQLException(String sql, int index) { // boolean substitute = true; // String msg = Error.getMessage(ErrorCode.JDBC_CONNECTION_NATIVE_SQL, // substitute, new Object[]{ // sql.substring(index)}); // // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, msg); // } // // static SQLException connectionResetFailureException(Exception e) { // return sqlException(ErrorCode.GENERAL_ERROR, "Error resetting connection: " // + e.getMessage()); // } // // static SQLException deserializeToJavaObjectException(HsqlException e) { // // TODO: This is wrong. // // According to SQL 2003, error code 18, // // sqlstate 40001 is supposed to indicate a // // transaction rollback due to // // transaction serialization failure // return sqlException(e); // } // // public static SQLException driverConnectMalformedURLException(String url) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "url: " + url); // } // // public static SQLException driverConnectTimeoutException(long timeout) { // return sqlException(ErrorCode.GENERAL_ERROR, // "Connect operation timed out after " + timeout + " ms."); // } // // // static SQLException illegalBestRowIdentifierScopeArgumentException(int scope) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, // Error.JDBC_ILLEGAL_BRI_SCOPE, // new Object[] {Integer.toString(scope)}); // } // // static SQLException illegalConnectionSubProtocolException(String protocol) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "protocol: " + protocol); // } // // static SQLException illegalHexadecimalCharacterSequenceArgumentException(String name, Exception e) { // return sqlException(ErrorCode.INVALID_CONVERSION, name + ": " + e); // } // // static SQLException illegalNegativeIntegralArgumentException(String name, long value) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, name + ": " + value); // } // // static SQLException illegalNullArgumentException(String name) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, name + ": null"); // } // // static SQLException illegalResultSetConcurrencyArgumentException(int concurrency) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "concurrency: " + concurrency); // } // // static SQLException illegalResultSetFetchDirectionArgumentException(int direction) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "direction: " + direction); // } // // static SQLException illegalResultSetHoldabilityArgumentException(int holdability) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "holdability: " + holdability); // } // // static SQLException illegalResultSetTypeArgumentException(int type) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "type: " + type); // } // // static SQLException illegalTableTypeArgumentException(int index, String type) { // String msg = "types[" + index + "]=>\"" + type + "\""; // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, msg); // } // // static SQLException illegalTransactionIsolationLevelArgumentException(int level) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "level: " + level); // } // // static SQLException illegalUnicodeStreamLengthArgumentException(int length) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, // "Odd length argument for pre-JDBC4 UTF16 encoded stream: " // + length); //NOI18N // } // // static SQLException invalidDateTimeEscapeException(Exception e) { // return sqlException(ErrorCode.INVALID_ESCAPE, e.getMessage()); // } // // static SQLException invalidNullInputStreamArgumentException() { // return sqlException(ErrorCode.error(ErrorCode.JDBC_INVALID_ARGUMENT, // Error.JDBC_NULL_STREAM)); // } // // static SQLException octetInputStreamInvalidCharacterEncodingException(Exception e) { // return sqlException(ErrorCode.INVALID_CHARACTER_ENCODING, String.valueOf(e)); // } // // static SQLException octetInputStreamTransferCorruptedException(Exception e) { // // According to SQL 2003, error code 19 should not // // have sqlstate 40001, which is supposed to indicate a // // transaction rollback due to transaction serialization // // failure // return sqlException(ErrorCode.TRANSFER_CORRUPTED, String.valueOf(e)); // } // // static SQLException octetSequenceIndexArgumentOutOfBoundsException(String name, long value) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, name + ": " + value); // } // // static SQLException parameterMetaDataParameterIndexNotFoundException(int index) { // // String msg = param + " is out of range"; //NOI18N // return sqlException(ErrorCode.COLUMN_NOT_FOUND, Integer.toString(index)); // } // // static SQLException preparedStatementFeatureNotSupportedException() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException preparedStatementInitializationException(Exception e) { // return sqlException(ErrorCode.GENERAL_ERROR, e.toString()); // } // // static SQLException preparedStatementParameterIndexNotFoundException(int parameterIndex) { // return sqlException(ErrorCode.COLUMN_NOT_FOUND, // Integer.toString(parameterIndex)); // } // // static SQLException resultSetClosedException() { // return sqlException(ErrorCode.JDBC_RESULTSET_IS_CLOSED); // } // // static SQLException resultSetColumnIndexNotFoundException(int columnIndex) { // return sqlException(ErrorCode.COLUMN_NOT_FOUND, // Integer.toString(columnIndex)); // } // // static SQLException resultSetColumnNameNotFoundException(String columnName) { // return sqlException(Error.error(ErrorCode.COLUMN_NOT_FOUND, columnName)); // } // // static SQLWarning resultSetConcurrencyTranslationWarning(int requestedConcurrency, // int translatedConcurrency) { // String requested = toResultSetConcurrencyString(requestedConcurrency); // String translated = toResultSetConcurrencyString(translatedConcurrency); // String msg = requested + " => " + translated; // // return new SQLWarning(msg, "SOO10", Error.JDBC_INVALID_ARGUMENT); // } // // static SQLException resultSetCursorNameNotSupportedException() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException resultSetDataIsNotAvailableException() { // return sqlException(ErrorCode.NO_DATA_IS_AVAILABLE); // } // // static SQLException resultSetFetchDirectionValueNotSupportedException(int direction) { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED, // toResultSetFetchDirectionString(direction)); // } // // static SQLWarning resultSetHoldabilityTranslationWarning(int requestedHoldability, int translatedHoldability) { // String requested = toResultSetHoldabilityString(requestedHoldability); // String translated = toResultSetHoldabilityString(translatedHoldability); // String msg = requested + " => " + translated; // // return new SQLWarning(msg, "SOO10", Error.JDBC_INVALID_ARGUMENT); // } // // // static SQLException resultSetHoldabilityValueNotSupportedException(int holdability) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, toResultSetHoldabilityString(holdability)); // } // // static SQLException resultSetIsForwardOnlyException() { // return sqlException(ErrorCode.RESULTSET_FORWARD_ONLY); // } // // static SQLException resultSetMetaDataColumnIndexNotFoundException(int columnIndex) { // return Util.sqlException(ErrorCode.COLUMN_NOT_FOUND, // Integer.toString(columnIndex)); // } // // static SQLException resultSetMetaDataInitializationNullResultArgumentException() { // return sqlException(ErrorCode.GENERAL_ERROR, // Error.JDBC_NO_RESULT_SET, null); // } // // static SQLException resultSetMetaDataInitializationNullResultSetArgumentException() { // return sqlException(ErrorCode.GENERAL_ERROR, // Error.JDBC_NO_RESULT_SET_METADATA, null); // } // // static SQLException resultSetNotRefreshableException() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException resultSetNotUpdateableException() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLWarning resultSetTypeTranslationWarning(int requestedType, int translatedType) { // String requested = toResultSetTypeString(requestedType); // String translated = toResultSetTypeString(translatedType); // String msg = requested + " => " + translated; // // return new SQLWarning(msg, "SOO10", Error.JDBC_INVALID_ARGUMENT); // } // // // static SQLException resultSetWasNotGeneratedByStatementExecutionException() { // String msg = "Expected but did not receive a result set"; // NOI18N // // return sqlException(ErrorCode.UNEXPECTED_EXCEPTION, msg); // } // // static SQLException resultSetWillNotBeGeneratedByExecuteQueryException() { // return sqlException(ErrorCode.JDBC_STATEMENT_NOT_RESULTSET); // } // // static SQLException retrieveAutoGeneratedKeysFeatureNotSupportedException() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException savepointIssuedOnDifferentConnectionException() { // return sqlException(ErrorCode.ASSERT_FAILED, "savepoint.connection==this"); // } // // static SQLException savepointNumericIdentifierNotSupportedException() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException savepointRollbackInAutocommitException() { // return sqlException(ErrorCode.ASSERT_FAILED, "autocommit==false"); // } // // static SQLException savepointWrongObjectClassException(Class clazz) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "savepoint: " + clazz); // } // // static SQLException sqlxmlDirectUpdateByLocatorNotSupportedException() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException sqlxmlInFreedStateException() { // return sqlException(ErrorCode.ASSERT_FAILED, "valid==true"); // } // // static SQLException sqlxmlParseException(Exception e) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, e.toString()); // } // // static SQLException sqlxmlParserInitializationException(Exception e) { // return sqlException(ErrorCode.GENERAL_ERROR, e.toString()); // } // // static SQLException statementClosedException() { // return sqlException(ErrorCode.STATEMENT_IS_CLOSED); // } // // static SQLException statementGetMoreResultsWithCurrentResultSetHandlingNotSupportedException() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static int toObjectDataType(Object o) { // if (o == null) { // return Types.NULL; // } // // if (o instanceof Binary) { // return Types.BINARY; // } else if (o instanceof JavaObject) { // return Types.OTHER; // } // // try { // return org.hsqldb.Types.getTypeNr(o.getClass().getName()); // } catch (Exception e) { // return o instanceof Serializable ? Types.OTHER : Types.JAVA_OBJECT; // } // } // // static String toResultSetConcurrencyString(int type) { // switch(type) { // case JDBCResultSet.CONCUR_READ_ONLY: // { // return "CONCUR_READ_ONLY"; // } // JDBCResultSet.CONCUR_UPDATABLE: // { // return "CONCUR_UPDATABLE"; // } // default: // { // return "CONCUR_UNKNOWN: " + type; // } // } // } // // static String toResultSetFetchDirectionString(int direction) { // switch(direction) { // case JDBCResultSet.FETCH_FORWARD: // { // return "FETCH_FORWARD"; // } // case JDBCResultSet.FETCH_REVERSE: // { // return "FETCH_REVERSE"; // } // case JDBCResultSet.FETCH_UNKNOWN: // { // return "FETCH_UNKNOWN"; // } // default: // { // return "direction: " + direction; // } // } // } // // static String toResultSetHoldabilityString(int type) { // switch(type) { // case JDBCResultSet.CLOSE_CURSORS_AT_COMMIT: // { // return "CLOSE_CURSORS_AT_COMMIT"; // } // case JDBCResultSet.HOLD_CURSORS_OVER_COMMIT: // { // return "HOLD_CURSORS_OVER_COMMIT"; // } // default: // { // return "HOLDABILITY_UNKNOWN: " + type; // } // } // } // // // static String toResultSetTypeString(int type) { // switch(type) { // case JDBCResultSet.TYPE_FORWARD_ONLY: // { // return "TYPE_FORWARD_ONLY"; // } // case JDBCResultSet.TYPE_SCROLL_INSENSITIVE: // { // return "TYPE_SCROLL_INSENSITIVE"; // } // case JDBCResultSet.TYPE_SCROLL_SENSITIVE: // { // return "TYPE_SCROLL_SENSITIVE"; // } // default: // { // return "TYPE_UNKNOWN: " + type; // } // } // } // // static SQLException unsupportedDataType_ARRAY_Exception() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // // static SQLException unsupportedDataType_DATALINK_Exception() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException unsupportedDataType_DISTINCT_Exception() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException unsupportedDataType_REF_Exception() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException unsupportedDataType_ROWID_Exception() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException unsupportedDataType_SQLXML_Exception() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException unsupportedDataType_STRUCT_Exception() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // static SQLException unsupportedDataTypes_STRUCT_AND_DISTINCT_Exception() { // return sqlException(ErrorCode.FUNCTION_NOT_SUPPORTED); // } // // // static SQLException unsupportedParameterValueConversionException(Object srcVal, int dstType) { // return unsupportedParameterValueConversionException(toObjectDataType(srcVal), // srcVal, // dstType); // } // // static SQLException unsupportedParameterValueConversionException(int srcType, Object srcVal, int dstType) { // String msg = Types.getTypeString(srcType) // + " => " // + Types.getTypeString(dstType) // + " : " // + srcVal; // // return sqlException(ErrorCode.INVALID_CONVERSION, msg); // } // // static SQLException unsupportedResultSetValueConversionException(int srcType, Object srcVal, int dstType) { // String msg = Types.getTypeString(srcType) // + " => " // + Types.getTypeString(dstType) // + " : " // + srcVal; // // return sqlException(ErrorCode.INVALID_CONVERSION, msg); // } // // static SQLException updateCountResultInResultSetInitializationException() { // return sqlException(ErrorCode.ASSERT_FAILED, "result.mode != UPDATECOUNT"); // } // // static SQLException updateCountWasNotGeneratedByPreparedStatementExecutionException() { // String msg = "Expected but did not receive a row update count"; //NOI18N // // return sqlException(ErrorCode.UNEXPECTED_EXCEPTION, msg); // } // // static SQLException updateCountWasNotGeneratedByStatementExecutionException() { // return sqlException(ErrorCode.ASSERT_FAILED, // Error.getMessage(ErrorCode.JDBC_STATEMENT_EXECUTE_UPDATE)); // } // // static SQLException updateCountWillNotBeGeneratedByExecuteUpdateException() { // return sqlException(ErrorCode.JDBC_STATEMENT_NOT_ROW_COUNT); // } // // public static SQLException wrappedObjectNotFoundException(Class clazz) { // return sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, String.valueOf(clazz)); // } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCResultSetMetaData.java0000644000175000017500000011543312007547356024501 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.sql.ResultSetMetaData; import java.sql.SQLException; import org.hsqldb.error.ErrorCode; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.result.ResultMetaData; import org.hsqldb.types.CharacterType; import org.hsqldb.types.DateTimeType; import org.hsqldb.types.IntervalType; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /* $Id: JDBCResultSetMetaData.java 4703 2011-11-05 00:29:47Z fredt $ */ // fredt@users - 20040412 - removed DITypeInfo dependencies // boucherb@users - 200404xx - removed unused imports;refinement for better // usability of getColumnDisplaySize; // javadoc updates // boucherb@users - 20051207 - patch 1.8.0.x initial JDBC 4.0 support work // boucherb@users - 20060522 - doc 1.9.0 full synch up to Mustang Build 84 // fredt@users - 1.9.0 usage of types and new ResultMetadata and ColumnMetaData // Revision 1.15 2006/07/12 12:29:42 boucherb // patch 1.9.0 // - full synch up to Mustang b90 // - minor update to toString /** * * An object that can be used to get information about the types * and properties of the columns in a ResultSet object. * The following code fragment creates the ResultSet object rs, * creates the ResultSetMetaData object rsmd, and uses rsmd * to find out how many columns rs has and whether the first column in rs * can be used in a WHERE clause. *

 *
 *     ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
 *     ResultSetMetaData rsmd = rs.getMetaData();
 *     int numberOfColumns = rsmd.getColumnCount();
 *     boolean b = rsmd.isSearchable(1);
 *
 * 
* * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports a subset of the ResultSetMetaData interface.

* * The JDBC specification for ResultSetMetaData is in part very * vague. This causes potential incompatibility between interpretations of the * specification as realized in different JDBC driver implementations. As such, * deciding to what degree reporting ResultSetMetaData is accurate has been * considered very carefully. Hopefully, the design decisions made in light of * these considerations have yeilded precisely the subset of full * ResultSetMetaData support that is most commonly needed and that is most * important, while also providing, under the most common use-cases, the * fastest access with the least overhead and the best comprimise between * speed, accuracy, jar-footprint and retention of JDBC resources.

* * (fredt@users)
* (boucherb@users)

*

* * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @revised JDK 1.6, HSQLDB 2.0 * @see JDBCStatement#executeQuery * @see JDBCStatement#getResultSet * @see java.sql.ResultSetMetaData */ public class JDBCResultSetMetaData implements ResultSetMetaData { /** * * Returns the number of columns in this ResultSet object. * * * @return the number of columns * @exception SQLException if a database access error occurs */ public int getColumnCount() throws SQLException { return resultMetaData.getColumnCount(); } /** * * Indicates whether the designated column is automatically numbered. *

(JDBC4 deleted:)[, thus read-only.] * * * *

*

HSQLDB-Specific Information:

* * HSQLDB 2.0 fully supports SQL Satandard features T174 and T176 that * define identity column support. * *


* * However, it must be stated here that contrary to the generic * documentation previous to the JDBC4 specification, HSQLDB automatically * numbered columns (IDENTITY columns, in HSQLDB parlance) are not * read-only.

* * In fact, the generic documentation previous to the JDBC4 specification * seems to contradict the general definition of what, at minimum, * an auto-increment column is:

* * Simply, an auto-increment column is one that guarantees it has a * autogenerated value after a successful insert or update operation, * even if no value is supplied, or DEFAULT is specified.

* *

* * * @param column the first column is 1, the second is 2, ... * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean isAutoIncrement(int column) throws SQLException { checkColumn(column); return resultMetaData.columns[--column].isIdentity(); } /** * * Indicates whether a column's case matters. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 1.7.1 did not report this value accurately.

* * Starting with 1.7.2, this feature is better supported.

* * This method returns true for any column whose data type is a character * type, with the exception of VARCHAR_IGNORECASE for which it returns * false. It also returns false for any column whose data type is a * not a character data type.

* *

* * * @param column the first column is 1, the second is 2, ... * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean isCaseSensitive(int column) throws SQLException { checkColumn(column); Type type = translateType(resultMetaData.columnTypes[--column]); if (type.isCharacterType()) { return !((CharacterType) type).isCaseInsensitive(); } return false; } /** * * Indicates whether the designated column can be used in a where clause. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 handles this differently from previous versions.

* * If the column in question is a database table or view column, and the * type of the column allows searching, then returns true, otherwise false. * *

* * * @param column the first column is 1, the second is 2, ... * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean isSearchable(int column) throws SQLException { checkColumn(column); return resultMetaData.columns[--column].isSearchable(); } /** * * Indicates whether the designated column is a cash value. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 fully supports this feature and returns true for * NUMERIC and DECIMAL columns.

* *

* * * @param column the first column is 1, the second is 2, ... * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean isCurrency(int column) throws SQLException { checkColumn(column); Type type = translateType(resultMetaData.columnTypes[--column]); return (type.typeCode == Types.SQL_DECIMAL || type.typeCode == Types.SQL_NUMERIC) && type.scale > 0; } /** * * Indicates the nullability of values in the designated column. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.2 fully supports this feature.

* * columnNoNulls is always returned for result set columns * that represent constants, sequences or table columns known * to be not null. columnNullable is returned for NULL constants, * or nullable table columns. columnNullableUnknown is returned * for all other columns such as aggregates and computed values.

* * To determine the nullable status of a table column in isolation from * ResultSetMetaData and in a DBMS-independent fashion, the * DatabaseMetaData.getColumns() method can be invoked with the * appropriate filter values and the result should be inspected at the * position described in the DatabaseMetaData.getColumns() API * documentation. *

* * * @param column the first column is 1, the second is 2, ... * @return the nullability status of the given column; one of columnNoNulls, * columnNullable or columnNullableUnknown * @exception SQLException if a database access error occurs */ public int isNullable(int column) throws SQLException { checkColumn(column); return resultMetaData.columns[--column].getNullability(); } /** * * Indicates whether values in the designated column are signed numbers. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 fully supports this feature.

* *

* * * @param column the first column is 1, the second is 2, ... * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean isSigned(int column) throws SQLException { checkColumn(column); Type type = translateType(resultMetaData.columnTypes[--column]); return type.isNumberType(); } /** * * Indicates the designated column's normal maximum width in characters. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 fully supports this feature.

* * The current calculation follows these rules:

* *

    *
  1. Long character types and datetime types:

    * * The maximum length/precision, repectively.

    * *

  2. CHAR and VARCHAR types:

    * *

      *
    • If the result set column is a direct pass through of a table * column value and column size was declared, then the declared * value is returned.

      * *

    • Otherwise, the computed length according to SQL Standard is * returned. For very large values, the value of the system property * hsqldb.max_xxxchar_display_size or the magic value * 32766 (0x7FFE) (tested usable/accepted by most tools and * compatible with assumptions made by java.io read/write * UTF) when the system property is not defined or is not * accessible, due to security constraints.

      * *

    * * It must be noted that the latter value in no way affects the * ability of the HSQLDB JDBC driver to retrieve longer values * and serves only as the current best effort at providing a * value that maximizes usability across a wide range of tools, * given that the HSQLDB database engine allows very large * lengths to be declared.

    * *

  3. Number types:

    * * The max precision, plus the length of the negation character (1), * plus (if applicable) the maximum number of characters that may * occupy the exponent character sequence. Note that some legacy tools * do not correctly handle BIGINT values of greater than 18 digits.

    * *

  4. BOOLEAN type:

    * * The length of the character sequence "false" (5), the longer of the * two boolean value String representations.

    * *

  5. Remaining types:

    * * The maximum length/precision, respectively, as reported by * DatabaseMetaData.getTypeInfo(), when applicable. If the maximum * display size is unknown, unknowable or inapplicable, then zero is * returned.

    * *

* *
* * * @param column the first column is 1, the second is 2, ... * @return the normal maximum number of characters allowed as the width * of the designated column * @exception SQLException if a database access error occurs */ public int getColumnDisplaySize(int column) throws SQLException { checkColumn(column); Type type = translateType(resultMetaData.columnTypes[--column]); return type.displaySize(); } /** * * Gets the designated column's suggested title for use in printouts and * displays. (JDBC4 clarification:) The suggested title is usually specified by the SQL AS * clause. If a SQL AS is not specified, the value returned from * getColumnLabel will be the same as the value returned by the * getColumnName method. * * * *
*

HSQLDB-Specific Information:

* * In HSQLDB, a ResultSet column label is determined using the * following order of precedence:

* *

    *
  1. The label (alias) specified in the generating query.
  2. *
  3. The name of the underlying column, if no label is specified.
    * C1, C2, etc. for computed columns that have no label.
  4. *

* *

* * * @param column the first column is 1, the second is 2, ... * @return the suggested column title * @exception SQLException if a database access error occurs */ public String getColumnLabel(int column) throws SQLException { checkColumn(column--); String label = resultMetaData.columnLabels[column]; if (label != null && label.length() > 0) { return label; } return resultMetaData.columns[column].getNameString(); } /** * * Get the designated column's name. * * * *
*

HSQLDB-Specific Information:

* * In HSQLDB, a ResultSet column name is determined using the following * order of prcedence:

* *

    *
  1. The name of the underlying columnm, if the ResultSet column * represents a column in a table.
  2. *
  3. The label or alias specified in the generating query.
  4. * C1, C2, etc. for computed columns that have no label. *

* * If the jdbc.get_column_name property of the JDBC Connection * has been set to false, this method returns the same value as * {@link #getColumnLabel(int)}.

* *

* * * @param column the first column is 1, the second is 2, ... * @return column name * @exception SQLException if a database access error occurs */ public String getColumnName(int column) throws SQLException { checkColumn(column--); if (useColumnName) { String name = resultMetaData.columns[column].getNameString(); if (name != null && name.length() > 0) { return name; } } String label = resultMetaData.columnLabels[column]; return label == null ? resultMetaData.columns[column].getNameString() : label; } /** * * Get the designated column's table's schema. * * * *
*

HSQLDB-Specific Information:

* * Since 1.8.0.x, HSQLDB implements standard SQL SCHEMA support; * this method returns the actual schema of the column's table. * Columns generated in queries have no schema name. *

* * * @param column the first column is 1, the second is 2, ... * @return schema name or "" if not applicable * @exception SQLException if a database access error occurs */ public String getSchemaName(int column) throws SQLException { checkColumn(column); String name = resultMetaData.columns[--column].getSchemaNameString();; return name == null ? "" : name; } /** * * (JDBC4 clarification:) * Get the designated column's specified column size. * For numeric data, this is the maximum precision. For character data, this is the [maximum] length in characters. * For datetime datatypes, this is the [maximim] length in characters of the String representation (assuming the * maximum allowed precision of the fractional seconds component). For binary data, this is the [maximum] length in bytes. For the ROWID datatype, * this is the length in bytes[, as returned by the implementation-specific java.sql.RowId.getBytes() method]. 0 is returned for data types where the * column size is not applicable. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 reports the correct length or precision for * all columns. For DOUBLE, the binary precision of 64 is returned, while * for other numeric types the decimal precision is returned.

*

* * * @param column the first column is 1, the second is 2, ... * @return precision * @exception SQLException if a database access error occurs */ public int getPrecision(int column) throws SQLException { checkColumn(column); // type in columnTypes overrides column type Type type = translateType(resultMetaData.columnTypes[--column]); return type.getJDBCPrecision(); } /** * * Gets the designated column's number of digits to right of the decimal point. * 0 is returned for data types where the scale is not applicable. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 reports the correct scale for all columns.

* * For datetime and interval types such as Timestamp or Time, the * fractional second precision is reported.

* * The reported scale for INTEGER, BIGINT and DOUBLE is 0

*

* * * @param column the first column is 1, the second is 2, ... * @return scale * @exception SQLException if a database access error occurs */ public int getScale(int column) throws SQLException { checkColumn(column); Type type = translateType(resultMetaData.columnTypes[--column]); return type.getJDBCScale(); } /** * * Gets the designated column's table name. * * * @param column the first column is 1, the second is 2, ... * @return table name or "" if not applicable * @exception SQLException if a database access error occurs */ public String getTableName(int column) throws SQLException { checkColumn(column); String name = resultMetaData.columns[--column].getTableNameString(); return name == null ? "" : name; } /** * * Gets the designated column's table's catalog name. * * * *
*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB returns the name of the catalog. The default name is * PUBLIC. * This value can be changed for the database using an SQL command.

* * HSQLDB supports use of catalog qualification in DLL or DML when it is * allowed by the Standard.

* * However, not all clients respect the SQL Standard and may use a * catalog qualifier in a context where it is not suppoted by the Standard. *

* * For greater detail, see discussion at: * {@link JDBCDatabaseMetaData}.

* *

* * * @param column the first column is 1, the second is 2, ... * @return the name of the catalog for the table in which the given column * appears or "" if not applicable * @exception SQLException if a database access error occurs */ public String getCatalogName(int column) throws SQLException { checkColumn(column); String name = resultMetaData.columns[--column].getCatalogNameString(); return name == null ? "" : name; } /** * * Retrieves the designated column's SQL type. * * * *
*

HSQLDB-Specific Information:

* * This reports the SQL type code of the column. For time and timestamp * types that are WITH TIME ZONE, the values as the SQL Standarc CLI * codes.

* *

* * * * @param column the first column is 1, the second is 2, ... * @return SQL type from java.sql.Types * @exception SQLException if a database access error occurs * @see java.sql.Types */ public int getColumnType(int column) throws SQLException { checkColumn(column); Type type = translateType(resultMetaData.columnTypes[--column]); return type.getJDBCTypeCode(); } /** * * Retrieves the designated column's database-specific type name. * * * @param column the first column is 1, the second is 2, ... * @return type name used by the database. If the column type is * a user-defined type, then a fully-qualified type name is returned. * @exception SQLException if a database access error occurs */ public String getColumnTypeName(int column) throws SQLException { checkColumn(column); Type type = translateType(resultMetaData.columnTypes[--column]); return type.getNameString(); } /** * * Indicates whether the designated column is definitely not writable. * * * *
*

HSQLDB-Specific Information:

* * From 2.0 this method returns true if the ResuleSet is not updatable * or the column in question is not updatable.

*

* * * @param column the first column is 1, the second is 2, ... * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean isReadOnly(int column) throws SQLException { checkColumn(column); return !resultMetaData.columns[--column].isWriteable(); } /** * * Indicates whether it is possible for a write on the designated column to * succeed. * * * *
*

HSQLDB-Specific Information:

* * From 2.0 this method returns false if the ResuleSet is not updatable * or the column in question is not updatable.

* *

* * * @param column the first column is 1, the second is 2, ... * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean isWritable(int column) throws SQLException { checkColumn(column); return resultMetaData.colIndexes != null && resultMetaData.colIndexes[--column] > -1; } /** * * Indicates whether a write on the designated column will definitely succeed. * * * *
*

HSQLDB-Specific Information:

* * From 2.0 this method returns false if the ResuleSet is not updatable * or the column in question is not updatable.

* *

* * * @param column the first column is 1, the second is 2, ... * @return true if so; false otherwise * @exception SQLException if a database access error occurs */ public boolean isDefinitelyWritable(int column) throws SQLException { checkColumn(column); return resultMetaData.colIndexes != null && resultMetaData.colIndexes[--column] > -1; } //--------------------------JDBC 2.0----------------------------------- /** * *

Returns the fully-qualified name of the Java class whose instances * are manufactured if the method ResultSet.getObject * is called to retrieve a value * from the column. ResultSet.getObject may return a subclass of the * class returned by this method. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB 2.0 fully supports this feature.

* * For columns of type OTHER, there is no specific class name and * java.lang.Object is returned. * *

* * * @param column the first column is 1, the second is 2, ... * @return the fully-qualified name of the class in the Java programming * language that would be used by the method * ResultSet.getObject to retrieve the value in the specified * column. This is the class name used for custom mapping. * @exception SQLException if a database access error occurs * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCResultSet) */ public String getColumnClassName(int column) throws SQLException { checkColumn(column); Type type = translateType(resultMetaData.columnTypes[--column]); return type.getJDBCClassName(); } //----------------------------- JDBC 4.0 ----------------------------------- // ------------------- java.sql.Wrapper implementation --------------------- /** * Returns an object that implements the given interface to allow access to * non-standard methods, or standard methods not exposed by the proxy. * * If the receiver implements the interface then the result is the receiver * or a proxy for the receiver. If the receiver is a wrapper * and the wrapped object implements the interface then the result is the * wrapped object or a proxy for the wrapped object. Otherwise return the * the result of calling unwrap recursively on the wrapped object * or a proxy for that result. If the receiver is not a * wrapper and does not implement the interface, then an SQLException is thrown. * * @param iface A Class defining an interface that the result must implement. * @return an object that implements the interface. May be a proxy for the actual implementing object. * @throws java.sql.SQLException If no object found that implements the interface * @since JDK 1.6, HSQLDB 1.8.x */ //#ifdef JAVA6 @SuppressWarnings("unchecked") public T unwrap(java.lang.Class iface) throws java.sql.SQLException { if (isWrapperFor(iface)) { return (T) this; } throw Util.invalidArgument("iface: " + iface); } //#endif JAVA6 /** * Returns true if this either implements the interface argument or is directly or indirectly a wrapper * for an object that does. Returns false otherwise. If this implements the interface then return true, * else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped * object. If this does not implement the interface and is not a wrapper, return false. * This method should be implemented as a low-cost operation compared to unwrap so that * callers can use this method to avoid expensive unwrap calls that may fail. If this method * returns true then calling unwrap with the same argument should succeed. * * @param iface a Class defining an interface. * @return true if this implements the interface or directly or indirectly wraps an object that does. * @throws java.sql.SQLException if an error occurs while determining whether this is a wrapper * for an object with the given interface. * @since JDK 1.6, HSQLDB 1.8.x */ //#ifdef JAVA6 public boolean isWrapperFor( java.lang.Class iface) throws java.sql.SQLException { return (iface != null && iface.isAssignableFrom(this.getClass())); } //#endif JAVA6 // ------------------------- Internal Implementation --------------------------- private ResultMetaData resultMetaData; /** * Whether to use the underlying column name or label when reporting * getColumnName(). */ private boolean useColumnName; private boolean translateTTIType; private int columnCount; /** * Constructs a new JDBCResultSetMetaData object from the specified * JDBCResultSet and HsqlProprties objects. * * @param meta the ResultMetaData object from which to construct a new * JDBCResultSetMetaData object * @param props the HsqlProperties object from which to construct a * new JDBCResultSetMetaData object * @throws SQLException if a database access error occurs */ JDBCResultSetMetaData(ResultMetaData meta, boolean isUpdatable, boolean isInsertable, JDBCConnection conn) throws SQLException { init(meta, conn); } /** * Initializes this JDBCResultSetMetaData object from the specified * Result and HsqlProperties objects. * * @param meta the ResultMetaData object from which to initialize this * JDBCResultSetMetaData object * @param conn the JDBCConnection * @throws SQLException if a database access error occurs */ void init(ResultMetaData meta, JDBCConnection conn) throws SQLException { resultMetaData = meta; columnCount = resultMetaData.getColumnCount(); // fredt - props is null for internal connections, so always use the // default behaviour in this case // JDBCDriver.getPropertyInfo says // default is true useColumnName = true; if (conn == null) { return; } if (conn.connProperties != null) { useColumnName = conn.connProperties.isPropertyTrue( HsqlDatabaseProperties.url_get_column_name, true); } if (conn.clientProperties != null) { translateTTIType = conn.clientProperties.isPropertyTrue( HsqlDatabaseProperties.jdbc_translate_tti_types); } } /** * Performs an internal check for column index validity.

* * @param column index of column to check * @throws SQLException when this object's parent ResultSet has * no such column */ private void checkColumn(int column) throws SQLException { if (column < 1 || column > columnCount) { throw Util.sqlException(ErrorCode.JDBC_COLUMN_NOT_FOUND, String.valueOf(column)); } } /** * Translates an INTERVAL type to VARCHAR. * Removes time zone from datetime types. * */ private Type translateType(Type type) { if (this.translateTTIType) { if (type.isIntervalType()) { type = ((IntervalType) type).getCharacterType(); } else if (type.isDateTimeTypeWithZone()) { type = ((DateTimeType) type).getDateTimeTypeWithoutZone(); } } return type; } /** * Returns a string representation of the object.

* * The string consists of the name of the class of which the * object is an instance, the at-sign character `@', * the unsigned hexadecimal representation of the hash code of the * object and a comma-delimited list of this object's indexed attributes, * enclosed in square brakets. * * @return a string representation of the object. */ public String toString() { StringBuffer sb = new StringBuffer(); sb.append(super.toString()); if (columnCount == 0) { sb.append("[columnCount=0]"); return sb.toString(); } sb.append('['); for (int i = 0; i < columnCount; i++) { JDBCColumnMetaData meta = getColumnMetaData(i + 1); sb.append('\n'); sb.append(" column_"); sb.append(i + 1); sb.append('='); sb.append(meta); if (i + 1 < columnCount) { sb.append(','); sb.append(' '); } } sb.append('\n'); sb.append(']'); return sb.toString(); } JDBCColumnMetaData getColumnMetaData(int i) { JDBCColumnMetaData meta = new JDBCColumnMetaData(); try { meta.catalogName = getCatalogName(i); meta.columnClassName = getColumnClassName(i); meta.columnDisplaySize = getColumnDisplaySize(i); meta.columnLabel = getColumnLabel(i); meta.columnName = getColumnName(i); meta.columnType = getColumnType(i); meta.isAutoIncrement = isAutoIncrement(i); meta.isCaseSensitive = isCaseSensitive(i); meta.isCurrency = isCurrency(i); meta.isDefinitelyWritable = isDefinitelyWritable(i); meta.isNullable = isNullable(i); meta.isReadOnly = isReadOnly(i); meta.isSearchable = isSearchable(i); meta.isSigned = isSigned(i); meta.isWritable = isWritable(i); meta.precision = getPrecision(i); meta.scale = getScale(i); meta.schemaName = getSchemaName(i); meta.tableName = getTableName(i); } catch (SQLException e) { } return meta; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCDataSource.java0000644000175000017500000002501512007547356023174 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.Serializable; import java.sql.Connection; import java.sql.SQLException; //#ifdef JAVA6 import java.sql.Wrapper; //#endif JAVA6 import java.util.Properties; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.Referenceable; import javax.naming.StringRefAddr; import javax.sql.DataSource; /** *

A factory for connections to the physical data source that this * DataSource object represents. An alternative to the * DriverManager facility, a DataSource object * is the preferred means of getting a connection. An object that implements * the DataSource interface will typically be * registered with a naming service based on the * JavaTM Naming and Directory (JNDI) API. *

* The DataSource interface is implemented by a driver vendor. * There are three types of implementations: *

    *
  1. Basic implementation -- produces a standard Connection * object *
  2. Connection pooling implementation -- produces a Connection * object that will automatically participate in connection pooling. This * implementation works with a middle-tier connection pooling manager. *
  3. Distributed transaction implementation -- produces a * Connection object that may be used for distributed * transactions and almost always participates in connection pooling. * This implementation works with a middle-tier * transaction manager and almost always with a connection * pooling manager. *
*

* A DataSource object has properties that can be modified * when necessary. For example, if the data source is moved to a different * server, the property for the server can be changed. The benefit is that * because the data source's properties can be changed, any code accessing * that data source does not need to be changed. *

* A driver that is accessed via a DataSource object does not * register itself with the DriverManager. Rather, a * DataSource object is retrieved though a lookup operation * and then used to create a Connection object. With a basic * implementation, the connection obtained through a DataSource * object is identical to a connection obtained through the * DriverManager facility. * * *

*

HSQLDB-Specific Information:

* * This implementation of data source is a basic implementation and does not * perform connection pooling.

* * The getter and setter methods of the parent class, {@link JDBCCommonDataSource}, * can be used.

*

* * @since JDK 1.4 * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.5 * @since 1.7.2 */ //#ifdef JAVA6 @SuppressWarnings("serial") //#endif JAVA6 public class JDBCDataSource extends JDBCCommonDataSource implements DataSource, Serializable, Referenceable //#ifdef JAVA6 , Wrapper //#endif JAVA6 { /** * Retrieves a new connection using the properties that have already been * set. * * @return a connection to the data source * @exception SQLException if a database access error occurs */ public Connection getConnection() throws SQLException { if (url == null) { throw Util.nullArgument("url"); } if (connectionProps == null) { if (user == null) { throw Util.invalidArgument("user"); } if (password == null) { throw Util.invalidArgument("password"); } return getConnection(user, password); } if (connectionProps == null) { return getConnection(url, new Properties()); } return getConnection(url, connectionProps); } /** * Retrieves a new connection using the given username and password, * and the database url that has been set. No other properties are * used for the connection * * @param username the database user on whose behalf the connection is * being made * @param password the user's password * @return a connection to the data source * @exception SQLException if a database access error occurs */ public Connection getConnection(String username, String password) throws SQLException { if (username == null) { throw Util.invalidArgument("user"); } if (password == null) { throw Util.invalidArgument("password"); } Properties props = new Properties(); props.setProperty("user", username); props.setProperty("password", password); props.setProperty("loginTimeout", Integer.toString(loginTimeout)); return getConnection(url, props); } private Connection getConnection(String url, Properties props) throws SQLException { if (!url.startsWith("jdbc:hsqldb:")) { url = "jdbc:hsqldb:" + url; } return JDBCDriver.getConnection(url, props); } //------------------------- JDBC 4.0 ----------------------------------- // ------------------- java.sql.Wrapper implementation --------------------- /** * Returns an object that implements the given interface to allow access to * non-standard methods, or standard methods not exposed by the proxy. * * If the receiver implements the interface then the result is the receiver * or a proxy for the receiver. If the receiver is a wrapper * and the wrapped object implements the interface then the result is the * wrapped object or a proxy for the wrapped object. Otherwise return the * the result of calling unwrap recursively on the wrapped object * or a proxy for that result. If the receiver is not a * wrapper and does not implement the interface, then an SQLException is thrown. * * @param iface A Class defining an interface that the result must implement. * @return an object that implements the interface. May be a proxy for the actual implementing object. * @throws java.sql.SQLException If no object found that implements the interface * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 @SuppressWarnings("unchecked") public T unwrap(java.lang.Class iface) throws java.sql.SQLException { if (isWrapperFor(iface)) { return (T) this; } throw Util.invalidArgument("iface: " + iface); } //#endif JAVA6 /** * Returns true if this either implements the interface argument or is directly or indirectly a wrapper * for an object that does. Returns false otherwise. If this implements the interface then return true, * else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped * object. If this does not implement the interface and is not a wrapper, return false. * This method should be implemented as a low-cost operation compared to unwrap so that * callers can use this method to avoid expensive unwrap calls that may fail. If this method * returns true then calling unwrap with the same argument should succeed. * * @param iface a Class defining an interface. * @return true if this implements the interface or directly or indirectly wraps an object that does. * @throws java.sql.SQLException if an error occurs while determining whether this is a wrapper * for an object with the given interface. * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public boolean isWrapperFor( java.lang.Class iface) throws java.sql.SQLException { return (iface != null && iface.isAssignableFrom(this.getClass())); } //#endif JAVA6 /** * Retrieves the Reference of this object. * * @return The non-null Reference of this object. * @exception NamingException If a naming exception was encountered * while retrieving the reference. */ public Reference getReference() throws NamingException { String cname = "org.hsqldb.jdbc.JDBCDataSourceFactory"; Reference ref = new Reference(getClass().getName(), cname, null); ref.add(new StringRefAddr("database", getDatabase())); ref.add(new StringRefAddr("user", getUser())); ref.add(new StringRefAddr("password", password)); ref.add(new StringRefAddr("loginTimeout", Integer.toString(loginTimeout))); return ref; } // ------------------------ custom public methods ------------------------ public JDBCDataSource() { } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/package.html0000644000175000017500000000020112007547356022123 0ustar renerene Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCDriver.java0000644000175000017500000005344512007547356022405 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.DriverPropertyInfo; import java.sql.SQLException; import java.util.Properties; import org.hsqldb.DatabaseURL; import org.hsqldb.error.ErrorCode; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.persist.HsqlProperties; // fredt@users 20011220 - patch 1.7.0 by fredt // new version numbering scheme // fredt@users 20020320 - patch 1.7.0 - JDBC 2 support and error trapping // JDBC 2 methods can now be called from jdk 1.1.x - see javadoc comments // fredt@users 20030528 - patch 1.7.2 suggested by Gerhard Hiller - support for properties in URL // boucherb@users 20051207 - patch 1.8.x initial JDBC 4.0 support work /** * Provides the java.sql.Driver interface implementation required by * the JDBC specification.

* * The Java SQL framework allows for multiple database drivers.

* * The DriverManager will try to load as many drivers as it can find and * then for any given connection request, it will ask each driver in turn * to try to connect to the target URL.

* * The application developer will normally not need to call any function of * the Driver directly. All required calls are made by the DriverManager.

* * *

*

HSQLDB-Specific Information:

* * When the HSQL Database Engine Driver class is loaded, it creates an * instance of itself and register it with the DriverManager. This means * that a user can load and register the HSQL Database Engine driver by * calling: *

 *  Class.forName("org.hsqldb.jdbc.JDBCDriver")
 *  
* * For detailed information about how to obtain HSQLDB JDBC Connections, * please see {@link org.hsqldb.jdbc.JDBCConnection JDBCConnection}.

* *


* * JRE 1.1.x Notes:

* * In general, JDBC 2 support requires Java 1.2 and above, and JDBC3 requires * Java 1.4 and above. In HSQLDB, support for methods introduced in different * versions of JDBC depends on the JDK version used for compiling and building * HSQLDB.

* * Since 1.7.0, it is possible to build the product so that * all JDBC 2 methods can be called while executing under the version 1.1.x * Java Runtime EnvironmentTM. * However, in addition to this technique requiring explicit casts to the * org.hsqldb.jdbc.* classes, some of the method calls also require * int values that are defined only in the JDBC 2 or greater * version of the {@link java.sql.ResultSet ResultSet} interface. For this * reason, when the product is compiled under JDK 1.1.x, these values are * defined in {@link org.hsqldb.jdbc.JDBCResultSet JDBCResultSet}.

* * In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the * JDBC2-only ResultSet values can be achieved by referring * to them in parameter specifications and return value comparisons, * respectively, as follows:

* *

 * JDBCResultSet.FETCH_FORWARD
 * JDBCResultSet.TYPE_FORWARD_ONLY
 * JDBCResultSet.TYPE_SCROLL_INSENSITIVE
 * JDBCResultSet.CONCUR_READ_ONLY
 * // etc.
 * 
* * However, please note that code written to use HSQLDB JDBC 2 features under * JDK 1.1.x will not be compatible for use with other JDBC 2 drivers. Please * also note that this feature is offered solely as a convenience to developers * who must work under JDK 1.1.x due to operating constraints, yet wish to * use some of the more advanced features available under the JDBC 2 * specification.

* *

*
* * JDBC 4.0 notes:

* * Starting with JDBC 4.0 (JDK 1.6), the DriverManager methods * getConnection and getDrivers have been * enhanced to support the Java Standard Edition Service Provider mechanism. * When built under a Java runtime that supports JDBC 4.0, HSQLDB distribution * jars containing the Driver implementation also include the file * META-INF/services/java.sql.Driver. This file contains the fully * qualified class name ('org.hsqldb.jdbc.JDBCDriver') of the HSQLDB implementation * of java.sql.Driver.

* * Hence, under JDBC 4.0 or greater, applications no longer need to explictly * load the HSQLDB JDBC driver using Class.forName(). Of course, * existing programs which do load JDBC drivers using * Class.forName() will continue to work without modification.

* *


* @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @revised JDK 1.7, HLSQLDB 2.0.1 *
* * @see org.hsqldb.jdbc.JDBCConnection */ public class JDBCDriver implements Driver { /** * Default constructor */ public JDBCDriver() { } /** * Attempts to make a database connection to the given URL.

* * Returns "null" if this is the wrong kind of driver to connect to the * given URL. This will be common, as when the JDBC driver manager is asked * to connect to a given URL it passes the URL to each loaded driver in * turn.

* *

The driver throws an SQLException if it is the right * driver to connect to the given URL but has trouble connecting to * the database.

* *

The java.util.Properties argument can be used to pass * arbitrary string tag/value pairs as connection arguments. * Normally at least "user" and "password" properties should be * included in the Properties object.

* * *

*

HSQLDB-Specific Information:

* * For the HSQL Database Engine, at least "user" and * "password" properties should be included in the Properties.

* * From version 1.7.1, two optional properties are supported:

* *

    *
  • get_column_name (default true) - if set to false, * a ResultSetMetaData.getColumnName() call will return the user * defined label (getColumnLabel()) instead of the column * name.
    * * This property is available in order to achieve * compatibility with certain non-HSQLDB JDBC driver * implementations.
  • * *
  • strict_md if set to true, some ResultSetMetaData * methods return more strict values for compatibility * reasons.
  • *

* * From version 1.8.0.x, strict_md is deprecated (ignored) * because metadata reporting is always strict (JDBC-compliant), and * three new optional properties are supported:

* *

    *
  • ifexits (default false) - when true, an exception * is raised when attempting to connect to an in-process * file: or mem: scheme database instance if it has not yet been * created. When false, an in-process file: or mem: scheme * database instance is created automatically if it has not yet * been created. This property does not apply to requests for * network or res: (i.e. files_in_jar) scheme connections.
  • * *
  • shutdown (default false) - when true, the * the target database mimics the behaviour of 1.7.1 and older * versions. When the last connection to a database is closed, * the database is automatically shut down. The property takes * effect only when the first connection is made to the database. * This means the connection that opens the database. It has no * effect if used with subsequent, simultaneous connections.
    * * This command has two uses. One is for test suites, where * connections to the database are made from one JVM context, * immediately followed by another context. The other use is for * applications where it is not easy to configure the environment * to shutdown the database. Examples reported by users include * web application servers, where the closing of the last * connection coincides with the web application being shut down. *
  • * *
  • default_schema - backwards compatibility feature. * To be used for clients written before HSQLDB schema support. * Denotes whether to use the default schema when a schema * qualifier is not included in a database object's SQL identifier * character sequence. Also affects the semantics of * DatabaseMetaData calls that supply null-valued schemaNamePattern * parameter values.
  • *
* * *
* @param url the URL of the database to which to connect * @param info a list of arbitrary string tag/value pairs as connection * arguments. Normally at least a "user" and "password" property * should be included. * @return a Connection object that represents a * connection to the URL * @exception SQLException if a database access error occurs */ public Connection connect(String url, Properties info) throws SQLException { if (url.regionMatches(true, 0, DatabaseURL.S_URL_INTERNAL, 0, DatabaseURL.S_URL_INTERNAL.length())) { JDBCConnection conn = (JDBCConnection) threadConnection.get(); if (conn == null) { return null; } return conn; } return getConnection(url, info); } /** * The static equivalent of the connect(String,Properties) * method.

* * @param url the URL of the database to which to connect * @param info a list of arbitrary string tag/value pairs as connection * arguments including at least at a "user" and a "password" property * @throws java.sql.SQLException if a database access error occurs * @return a Connection object that represents a * connection to the URL */ //#ifdef JAVA6 @SuppressWarnings("deprecation") //#endif JAVA6 public static Connection getConnection(String url, Properties info) throws SQLException { final HsqlProperties props = DatabaseURL.parseURL(url, true, false); if (props == null) { // supposed to be an HSQLDB driver url but has errors throw Util.invalidArgument(); } else if (props.isEmpty()) { // is not an HSQLDB driver url return null; } long timeout = 0; if (info != null) { timeout = HsqlProperties.getIntegerProperty(info, "loginTimeout", 0); } props.addProperties(info); if (timeout == 0) { timeout = DriverManager.getLoginTimeout(); } // @todo: maybe impose some sort of sane restriction // on network connections regarless of user // specification? if (timeout == 0) { // no timeout restriction return new JDBCConnection(props); } String connType = props.getProperty("connection_type"); if (DatabaseURL.isInProcessDatabaseType(connType)) { return new JDBCConnection(props); } // @todo: Better: ThreadPool? HsqlTimer with callback? final JDBCConnection[] conn = new JDBCConnection[1]; final SQLException[] ex = new SQLException[1]; Thread t = new Thread() { public void run() { try { conn[0] = new JDBCConnection(props); } catch (SQLException se) { ex[0] = se; } } }; t.start(); final long start = System.currentTimeMillis(); try { t.join(1000 * timeout); } catch (InterruptedException ie) { } try { // PRE: // deprecated, but should be ok, since neither // the HSQLClientConnection or the HTTPClientConnection // constructor will ever hold monitors on objects in // an inconsistent state, such that damaged objects // become visible to other threads with the // potential of arbitrary behavior. t.stop(); } catch (Exception e) { } finally { try { t.setContextClassLoader(null); } catch (Throwable th) { } } if (ex[0] != null) { throw ex[0]; } if (conn[0] != null) { return conn[0]; } throw Util.sqlException(ErrorCode.X_08501); } /** * Returns true if the driver thinks that it can open a connection to * the given URL. Typically drivers will return true if they understand * the subprotocol specified in the URL and false if they don't. * * @param url the URL of the database * @return true if this driver can connect to the given URL */ // fredt@users - patch 1.7.0 - allow mixedcase url's public boolean acceptsURL(String url) { if (url == null) { return false; } if (url.regionMatches(true, 0, DatabaseURL.S_URL_PREFIX, 0, DatabaseURL.S_URL_PREFIX.length())) { return true; } if (url.regionMatches(true, 0, DatabaseURL.S_URL_INTERNAL, 0, DatabaseURL.S_URL_INTERNAL.length())) { return true; } return false; } /** * Gets information about the possible properties for this driver.

* * The getPropertyInfo method is intended to allow a generic GUI tool * to discover what properties it should prompt a human for in order to * get enough information to connect to a database. Note that depending * on the values the human has supplied so far, additional values may * become necessary, so it may be necessary to iterate though several * calls to getPropertyInfo.

* * *

*

HSQLDB-Specific Information:

* * HSQLDB uses the values submitted in info to set the value for * each DriverPropertyInfo object returned. It does not use the default * value that it would use for the property if the value is null.

* *

* * @param url the URL of the database to which to connect * @param info a proposed list of tag/value pairs that will be sent on * connect open * @return an array of DriverPropertyInfo objects describing possible * properties. This array may be an empty array if no properties * are required. */ public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) { if (!acceptsURL(url)) { return new DriverPropertyInfo[0]; } String[] choices = new String[] { "true", "false" }; DriverPropertyInfo[] pinfo = new DriverPropertyInfo[6]; DriverPropertyInfo p; if (info == null) { info = new Properties(); } p = new DriverPropertyInfo("user", null); p.value = info.getProperty("user"); p.required = true; pinfo[0] = p; p = new DriverPropertyInfo("password", null); p.value = info.getProperty("password"); p.required = true; pinfo[1] = p; p = new DriverPropertyInfo("get_column_name", null); p.value = info.getProperty("get_column_name", "true"); p.required = false; p.choices = choices; pinfo[2] = p; p = new DriverPropertyInfo("ifexists", null); p.value = info.getProperty("ifexists", "false"); p.required = false; p.choices = choices; pinfo[3] = p; p = new DriverPropertyInfo("default_schema", null); p.value = info.getProperty("default_schema", "false"); p.required = false; p.choices = choices; pinfo[4] = p; p = new DriverPropertyInfo("shutdown", null); p.value = info.getProperty("shutdown", "false"); p.required = false; p.choices = choices; pinfo[5] = p; return pinfo; } /** * Gets the driver's major version number. * * @return this driver's major version number */ public int getMajorVersion() { return HsqlDatabaseProperties.MAJOR; } /** * Gets the driver's minor version number. * * @return this driver's minor version number */ public int getMinorVersion() { return HsqlDatabaseProperties.MINOR; } /** * Reports whether this driver is a genuine JDBC CompliantTM driver. A driver may only report * true here if it passes the JDBC compliance tests; otherwise * it is required to return false.

* * JDBC compliance requires full support for the JDBC API and full support * for SQL 92 Entry Level.

* * *

*

HSQLDB-Specific Information:

* * HSQLDB 2.0 is aimed to be compliant with JDBC 4.0 specification. * It supports SQL 92 Entry Level and beyond. *

* * This method is not intended to encourage the development of non-JDBC * compliant drivers, but is a recognition of the fact that some vendors * are interested in using the JDBC API and framework for lightweight * databases that do not support full database functionality, or for * special databases such as document information retrieval where a SQL * implementation may not be feasible. * * @return true if this driver is JDBC Compliant; * false otherwise */ public boolean jdbcCompliant() { return true; } //------------------------- JDBC 4.1 ----------------------------------- /** * Return the parent Logger of all the Loggers used by this driver. This * should be the Logger farthest from the root Logger that is * still an ancestor of all of the Loggers used by this driver. Configuring * this Logger will affect all of the log messages generated by the driver. * In the worst case, this may be the root Logger. * * @return the parent Logger for this driver * @throws SQLFeatureNotSupportedException if the driver does not use java.util.logging. * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ //#ifdef JAVA6 public java.util.logging .Logger getParentLogger() throws java.sql .SQLFeatureNotSupportedException { throw (java.sql.SQLFeatureNotSupportedException) Util.notSupported(); } //#endif public static JDBCDriver driverInstance; static { try { driverInstance = new JDBCDriver(); DriverManager.registerDriver(driverInstance); } catch (Exception e) { } } /** * As a separate instance of this class is registered with DriverManager * for each class loader, the threadConnection is not declared as static. * The registered instance is kept to allow access to the its * threadConnection. * */ //#ifdef JAVA6 public final ThreadLocal threadConnection = new ThreadLocal(); //#else /* public final ThreadLocal threadConnection = new ThreadLocal(); */ //#endif JAVA6 } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCConnectionEventListener.java0000644000175000017500000000337112007547356025752 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.sql.SQLException; public interface JDBCConnectionEventListener { void connectionClosed(); void connectionErrorOccured(SQLException e); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCBlobClient.java0000644000175000017500000003307012007547356023157 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.InputStream; import java.io.OutputStream; import java.sql.Blob; import java.sql.SQLException; import org.hsqldb.HsqlException; import org.hsqldb.SessionInterface; import org.hsqldb.error.ErrorCode; import org.hsqldb.types.BlobDataID; import org.hsqldb.types.BlobInputStream; /** * A wrapper for HSQLDB BlobData objects. * * Instances of this class are returnd by calls to ResultSet methods. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.9.0 */ public class JDBCBlobClient implements Blob { /** * Returns the number of bytes in the BLOB value designated * by this Blob object. * * @return length of the BLOB in bytes * @throws SQLException if there is an error accessing the length of the * BLOB */ public synchronized long length() throws SQLException { try { return blob.length(session); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * Retrieves all or part of the BLOB value that this * Blob object represents, as an array of bytes. * * @param pos the ordinal position of the first byte in the * BLOB value to be extracted; the first byte is at * position 1 * @param length the number of consecutive bytes to be copied * @return a byte array containing up to length consecutive * bytes from the BLOB value designated by this * Blob object, starting with the byte at position * pos * @throws SQLException if there is an error accessing the * BLOB value */ public synchronized byte[] getBytes(long pos, int length) throws SQLException { if (!isInLimits(Long.MAX_VALUE, pos - 1, length)) { throw Util.outOfRangeArgument(); } try { return blob.getBytes(session, pos - 1, length); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * Retrieves the BLOB value designated by this * Blob instance as a stream. * * @return a stream containing the BLOB data * @throws SQLException if there is an error accessing the * BLOB value */ public synchronized InputStream getBinaryStream() throws SQLException { return new BlobInputStream(session, blob, 0, length()); } /** * Retrieves the byte position at which the specified byte array * pattern begins within the BLOB value that * this Blob object represents. * * @param pattern the byte array for which to search * @param start the position at which to begin searching; the first * position is 1 * @return the position at which the pattern appears, else -1 * @throws SQLException if there is an error accessing the * BLOB */ public synchronized long position(byte[] pattern, long start) throws SQLException { if (!isInLimits(Long.MAX_VALUE, start - 1, 0)) { throw Util.outOfRangeArgument(); } try { long position = blob.position(session, pattern, start - 1); if (position >= 0) { position++; } return position; } catch (HsqlException e) { throw Util.sqlException(e); } } /** * Retrieves the byte position in the BLOB value designated * by this Blob object at which pattern begins. * * @param pattern the Blob object designating the * BLOB value for which to search * @param start the position in the BLOB value at which to * begin searching; the first position is 1 * @return the position at which the pattern begins, else -1 * @throws SQLException if there is an error accessing the * BLOB value */ public synchronized long position(Blob pattern, long start) throws SQLException { if (!isInLimits(Long.MAX_VALUE, start - 1, 0)) { throw Util.outOfRangeArgument(); } if (pattern instanceof JDBCBlobClient) { BlobDataID searchClob = ((JDBCBlobClient) pattern).blob; try { long position = blob.position(session, searchClob, start - 1); if (position >= 0) { position++; } return position; } catch (HsqlException e) { throw Util.sqlException(e); } } if (!isInLimits(Integer.MAX_VALUE, 0, pattern.length())) { throw Util.outOfRangeArgument(); } byte[] bytePattern = pattern.getBytes(1, (int) pattern.length()); return position(bytePattern, start); } /** * Writes the given array of bytes to the BLOB value that * this Blob object represents, starting at position * pos, and returns the number of bytes written. * * @param pos the position in the BLOB object at which to * start writing * @param bytes the array of bytes to be written to the * BLOB value that this Blob object * represents * @return the number of bytes written * @throws SQLException if there is an error accessing the * BLOB value */ public synchronized int setBytes(long pos, byte[] bytes) throws SQLException { return setBytes(pos, bytes, 0, bytes.length); } /** * Writes all or part of the given byte array to the * BLOB value that this Blob object represents * and returns the number of bytes written. * * @param pos the position in the BLOB object at which to * start writing * @param bytes the array of bytes to be written to this * BLOB object * @param offset the offset into the array bytes at which * to start reading the bytes to be set * @param len the number of bytes to be written to the BLOB * value from the array of bytes bytes * @return the number of bytes written * @throws SQLException if there is an error accessing the * BLOB value */ public synchronized int setBytes(long pos, byte[] bytes, int offset, int len) throws SQLException { if (!isInLimits(bytes.length, offset, len)) { throw Util.outOfRangeArgument(); } if (!isInLimits(Long.MAX_VALUE, pos - 1, len)) { throw Util.outOfRangeArgument(); } if (!isWritable) { throw Util.notUpdatableColumn(); } startUpdate(); try { blob.setBytes(session, pos - 1, bytes, offset, len); return len; } catch (HsqlException e) { throw Util.sqlException(e); } } /** * Retrieves a stream that can be used to write to the BLOB * value that this Blob object represents. * * @param pos the position in the BLOB value at which to * start writing * @return a java.io.OutputStream object to which data can * be written * @throws SQLException if there is an error accessing the * BLOB value */ public synchronized OutputStream setBinaryStream(long pos) throws SQLException { throw Util.notSupported(); } /** * Truncates the BLOB value that this Blob * object represents to be len bytes in length. * * @param len the length, in bytes, to which the BLOB value * that this Blob object represents should be truncated * @throws SQLException if there is an error accessing the * BLOB value */ public synchronized void truncate(long len) throws SQLException { try { blob.truncate(session, len); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * This method frees the Blob object and releases the resources that * it holds. The object is invalid once the free * method is called. *

* After free has been called, any attempt to invoke a * method other than free will result in a SQLException * being thrown. If free is called multiple times, the subsequent * calls to free are treated as a no-op. *

* * @throws SQLException if an error occurs releasing * the Blob's resources * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ public synchronized void free() throws SQLException { isClosed = true; } /** * Returns an InputStream object that contains a partial Blob value, * starting with the byte specified by pos, which is length bytes in length. * * @param pos the offset to the first byte of the partial value to be retrieved. * The first byte in the Blob is at position 1 * @param length the length in bytes of the partial value to be retrieved * @return InputStream through which the partial Blob value can be read. * @throws SQLException if pos is less than 1 or if pos is greater than the number of bytes * in the Blob or if pos + length is greater than the number of bytes * in the Blob * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ public synchronized InputStream getBinaryStream(long pos, long length) throws SQLException { if (!isInLimits(Long.MAX_VALUE, pos - 1, length)) { throw Util.outOfRangeArgument(); } return new BlobInputStream(session, blob, pos - 1, length); } //-- BlobDataID originalBlob; BlobDataID blob; SessionInterface session; int colIndex; private boolean isClosed; private boolean isWritable; JDBCResultSet resultSet; public JDBCBlobClient(SessionInterface session, BlobDataID blob) { this.session = session; this.blob = blob; } public boolean isClosed() { return isClosed; } public BlobDataID getBlob() { return blob; } public synchronized void setWritable(JDBCResultSet result, int index) { isWritable = true; resultSet = result; colIndex = index; } public synchronized void clearUpdates() { if (originalBlob != null) { blob = originalBlob; originalBlob = null; } } private void startUpdate() throws SQLException { if (originalBlob != null) { return; } originalBlob = blob; blob = (BlobDataID) blob.duplicate(session); resultSet.startUpdate(colIndex + 1); resultSet.preparedStatement.parameterValues[colIndex] = blob; resultSet.preparedStatement.parameterSet[colIndex] = Boolean.TRUE; } private void checkClosed() throws SQLException { if (isClosed) { throw Util.sqlException(ErrorCode.X_07501); } } static boolean isInLimits(long fullLength, long pos, long len) { return pos >= 0 && len >= 0 && pos + len <= fullLength; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCConnection.java0000644000175000017500000045600512007547356023250 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.sql.Blob; import java.sql.CallableStatement; import java.sql.Clob; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.util.Calendar; import java.util.Map; //#ifdef JAVA4 import java.sql.Savepoint; //#endif JAVA4 //#ifdef JAVA6 import java.sql.Array; import java.sql.SQLClientInfoException; import java.sql.NClob; import java.sql.SQLXML; import java.sql.Struct; import java.util.Properties; //#endif JAVA6 //import java.util.logging.Level; // import java.util.logging.Logger; import org.hsqldb.DatabaseManager; import org.hsqldb.DatabaseURL; import org.hsqldb.ClientConnection; import org.hsqldb.ClientConnectionHTTP; import org.hsqldb.HsqlDateTime; import org.hsqldb.HsqlException; import org.hsqldb.SessionInterface; import org.hsqldb.Tokens; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.StringUtil; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.result.ResultProperties; import org.hsqldb.types.Type; //import java.sql.SQLData; //import java.sql.SQLOutput; //import java.sql.SQLInput; /* $Id: JDBCConnection.java 4944 2012-02-26 12:33:00Z fredt $ */ // fredt@users 20020320 - patch 1.7.0 - JDBC 2 support and error trapping // // JDBC 2 methods can now be called from jdk 1.1.x - see javadoc comments // // boucherb@users 20020509 - added "throws SQLException" to all methods where // it was missing here but specified in the // java.sql.Connection interface, // updated generic documentation to JDK 1.4, and // added JDBC3 methods and docs // boucherb & // fredt@users 20020505 - extensive review and update of docs and behaviour // to comply with java.sql specification // fredt@users 20020830 - patch 487323 by xclayl@users - better synchronization // fredt@users 20020930 - patch 1.7.1 - support for connection properties // kneedeepincode@users // 20021110 - patch 635816 - correction to properties // unsaved@users 20021113 - patch 1.7.2 - SSL support // boucherb@users 2003 ??? - patch 1.7.2 - SSL support moved to factory interface // fredt@users 20030620 - patch 1.7.2 - reworked to use a SessionInterface // boucherb@users 20030801 - JavaDoc updates to reflect new connection urls // boucherb@users 20030819 - patch 1.7.2 - partial fix for broken nativeSQL method // boucherb@users 20030819 - patch 1.7.2 - SQLWarning cases implemented // boucherb@users 20051207 - 1.9.0 - JDBC 4.0 support - docs and methods // - 20060712 - full synch up to Mustang Build 90 // fredt@users 20090810 - 1.9.0 - full review and updates // // Revision 1.23 2006/07/12 12:02:43 boucherb // patch 1.9.0 // - full synch up to Mustang b90 /** * * *

A connection (session) with a specific * database. SQL statements are executed and results are returned * within the context of a connection. *

* A Connection object's database is able to provide information * describing its tables, its supported SQL grammar, its stored * procedures, the capabilities of this connection, and so on. This * information is obtained with the getMetaData method. * *

(JDBC4 clarification:) *

Note: When configuring a Connection, JDBC applications * should use the appropritate Connection method such as * setAutoCommit or setTransactionIsolation. * Applications should not invoke SQL commands directly to change the connection's * configuration when there is a JDBC method available. By default a Connection object is in * auto-commit mode, which means that it automatically commits changes * after executing each statement. If auto-commit mode has been * disabled, the method commit must be called explicitly in * order to commit changes; otherwise, database changes will not be saved. *

* A new Connection object created using the JDBC 2.1 core API * has an initially empty type map associated with it. A user may enter a * custom mapping for a UDT in this type map. * When a UDT is retrieved from a data source with the * method ResultSet.getObject, the getObject method * will check the connection's type map to see if there is an entry for that * UDT. If so, the getObject method will map the UDT to the * class indicated. If there is no entry, the UDT will be mapped using the * standard mapping. *

* A user may create a new type map, which is a java.util.Map * object, make an entry in it, and pass it to the java.sql * methods that can perform custom mapping. In this case, the method * will use the given type map instead of the one associated with * the connection. *

* For example, the following code fragment specifies that the SQL * type ATHLETES will be mapped to the class * Athletes in the Java programming language. * The code fragment retrieves the type map for the Connection * object con, inserts the entry into it, and then sets * the type map with the new entry as the connection's type map. *

 *      java.util.Map map = con.getTypeMap();
 *      map.put("mySchemaName.ATHLETES", Class.forName("Athletes"));
 *      con.setTypeMap(map);
 * 
* * * * *
*

HSQLDB-Specific Information:

* * To get a Connection to an HSQLDB database, the * following code may be used (updated to reflect the most recent * recommendations):

* *


* * When using HSQLDB, the database connection <url> must start with * 'jdbc:hsqldb:'

* * Since 1.7.2, connection properties (<key-value-pairs>) may be appended * to the database connection <url>, using the form:

* *

* '<url>[;key=value]*' *

* * Also since 1.7.2, the allowable forms of the HSQLDB database connection * <url> have been extended. However, all legacy forms continue * to work, with unchanged semantics. The extensions are as described in the * following material.

* *


* * Network Server Database Connections:

* * The {@link org.hsqldb.server.Server Server} database connection <url> * takes one of the two following forms:

* *

*
    *
  1. 'jdbc:hsqldb:hsql://host[:port][/<alias>][<key-value-pairs>]' * *
  2. 'jdbc:hsqldb:hsqls://host[:port][/<alias>][<key-value-pairs>]' * (with TLS). *
*

* * The {@link org.hsqldb.server.WebServer WebServer} database connection <url> * takes one of two following forms:

* *

*
    *
  1. 'jdbc:hsqldb:http://host[:port][/<alias>][<key-value-pairs>]' * *
  2. 'jdbc:hsqldb:https://host[:port][/<alias>][<key-value-pairs>]' * (with TLS). *
*

* * In both network server database connection <url> forms, the * optional <alias> component is used to identify one of possibly * several database instances available at the indicated host and port. If the * <alias> component is omitted, then a connection is made to the * network server's default database instance, if such an instance is * available.

* * For more information on server configuration regarding mounting multiple * databases and assigning them <alias> values, please read the * Java API documentation for {@link org.hsqldb.server.Server Server} and related * chapters in the general documentation, especially the Advanced Users * Guide.

* *


* * Transient, In-Process Database Connections:

* * The 100% in-memory (transient, in-process) database connection * <url> takes one of the two following forms:

* *

*
    *
  1. 'jdbc:hsqldb:.[<key-value-pairs>]' * (the legacy form, extended) * *
  2. 'jdbc:hsqldb:mem:<alias>[<key-value-pairs>]' * (the new form) *
*

* * The driver converts the supplied <alias> component to * Local.ENGLISH lower case and uses the resulting character sequence as the * key used to look up a mem: protocol database instance amongst the * collection of all such instances already in existence within the current * class loading context in the current JVM. If no such instance exists, one * may be automatically created and mapped to the <alias>, * as governed by the 'ifexists=true|false' connection property.

* * The rationale for converting the supplied <alias> component to * lower case is to provide consistency with the behavior of res: * protocol database connection <url>s, explained further on in * this overview. * *


* * Persistent, In-Process Database Connections:

* * The standalone (persistent, in-process) database connection * <url> takes one of the three following forms:

* *

*
    *
  1. 'jdbc:hsqldb:<path>[<key-value-pairs>]' * (the legacy form, extended) * *
  2. 'jdbc:hsqldb:file:<path>[<key-value-pairs>]' * (same semantics as the legacy form) * *
  3. 'jdbc:hsqldb:res:<path>[<key-value-pairs>]' * (new form with 'files_in_jar' semantics) *
*

* * For the persistent, in-process database connection <url>, * the <path> component is the path prefix common to all of * the files that compose the database.

* * From 1.7.2, although other files may be involved (such as transient working * files and/or TEXT table CSV data source files), the essential set that may, * at any particular point in time, compose an HSQLDB database is:

* *

*
    *
  • <path>.properties *
  • <path>.script *
  • <path>.log *
  • <path>.data *
  • <path>.backup *
  • <path>.lck *
*

* * For example: 'jdbc:hsqldb:file:test' connects to a database * composed of some subset of the files listed above, where the expansion * of <path> is 'test' prefixed with the canonical path of * the JVM's effective working directory at the time the designated database * is first opened in-process.

* * Be careful to note that this canonical expansion of <path> is * cached by the driver until JVM exit. So, although legacy JVMs tend to fix * the reported effective working directory at the one noted upon JVM startup, * there is no guarantee that modern JVMs will continue to uphold this * behaviour. What this means is there is effectively no guarantee into the * future that a relative file: protocol database connection * <url> will connect to the same database instance for the life * of the JVM. To avoid any future ambigutity issues, it is probably a best * practice for clients to attempt to pre-canonicalize the <path> * component of file: protocol database connection* <url>s. *

* * Under Windows TM , * 'jdbc:hsqldb:file:c:\databases\test' connects to a database located * on drive 'C:' in the directory 'databases', composed * of some subset of the files:

* *

 * C:\
 * +--databases\
 *    +--test.properties
 *    +--test.script
 *    +--test.log
 *    +--test.data
 *    +--test.backup
 *    +--test.lck
 * 
* * Under most variations of UNIX, 'jdbc:hsqldb:file:/databases/test' * connects to a database located in the directory 'databases' directly * under root, once again composed of some subset of the files:

* *

 *
 * +--databases
 *    +--test.properties
 *    +--test.script
 *    +--test.log
 *    +--test.data
 *    +--test.backup
 *    +--test.lck
 * 
* * Some Guidelines:

* *

    *
  1. Both relative and absolute database file paths are supported.

    * *

  2. Relative database file paths can be specified in a platform independent * manner as: '[dir1/dir2/.../dirn/]<file-name-prefix>'.

    * *

  3. Specification of absolute file paths is operating-system specific.
    * Please read your OS file system documentation.

    * *

  4. Specification of network mounts may be operating-system specific.
    * Please read your OS file system documentation.

    * *

  5. Special care may be needed w.r.t. file path specifications * containing whitespace, mixed-case, special characters and/or * reserved file names.
    * Please read your OS file system documentation.

    *

* * Note: Versions of HSQLDB previous to 1.7.0 did not support creating * directories along the file path specified in the persistent, in-process mode * database connection <url> form, in the case that they did * not already exist. Starting with HSQLDB 1.7.0, directories will * be created if they do not already exist., but only if HSQLDB is built under * a version of the compiler greater than JDK 1.1.x.

* *


* * res: protocol Connections:

* * The 'jdbc:hsqldb:res:<path>' database connection * <url> has different semantics than the * 'jdbc:hsqldb:file:<path>' form. The semantics are similar to * those of a 'files_readonly' database, but with some additional * points to consider.

* * Specifically, the '<path>' component of a res: protocol * database connection <url> is first converted to lower case * with Locale.ENGLISH and only then used to obtain resource URL * objects, which in turn are used to read the database files as resources on * the class path.

* * Due to lower case conversion by the driver, res: '<path>' * components never find jar resources stored with * Locale.ENGLISH mixed case paths. The rationale for converting to * lower case is that not all pkzip implementations guarantee path case is * preserved when archiving resources, and conversion to lower case seems to * be the most common occurrence (although there is also no actual guarantee * that the conversion is Locale.ENGLISH).

* * More importantly, res: '<path>' components must * point only to resources contained in one or more jars on the class * path. That is, only resources having the jar sub-protocol are considered * valid.

* * This restriction is enforced to avoid the unfortunate situation in which, * because res: database instances do not create a <path>.lck * file (they are strictly files-read-only) and because the <path> * components of res: and file: database URIs are not * checked for file system equivalence, it is possible for the same database * files to be accessed concurrently by both file: and res: * database instances. That is, without this restriction, it is possible that * <path>.data and <path>.properties file content may * be written by a file: database instance without the knowlege or * cooperation of a res: database instance open on the same files, * potentially resulting in unexpected database errors, inconsistent operation * and/or data corruption.

* * In short, a res: type database connection <url> is * designed specifically to connect to a 'files_in_jar' mode database * instance, which in turn is designed specifically to operate under * Java WebStartTM and * Java AppletTMconfigurations, * where co-locating the database files in the jars that make up the * WebStart application or Applet avoids the need for special security * configuration or code signing.

* * Note: Since it is difficult and often nearly impossible to determine * or control at runtime from where all classes are being loaded or which class * loader is doing the loading (and hence how relative path specifications * are resolved) under 'files_in_jar' semantics, the <path> * component of the res: database connection <url> is always * taken to be relative to the default package and resource URL resolution is * always performed using the ClassLoader that loads the * org.hsqldb.persist.Logger class. That is, if the <path> * component does not start with '/', then'/' is prepended when obtaining the * resource URLs used to read the database files, and only the effective class * path of org.hsqldb.persist.Logger's ClassLoader is searched.

* *


* * For more information about HSQLDB file structure, various database modes * and other attributes such as those controlled through the HSQLDB properties * files, please read the general documentation, especially the Advanced Users * Guide.

* *


* * JRE 1.1.x Notes:

* * In general, JDBC 2 support requires Java 1.2 and above, and JDBC3 requires * Java 1.4 and above. In HSQLDB, support for methods introduced in different * versions of JDBC depends on the JDK version used for compiling and building * HSQLDB.

* * Since 1.7.0, it is possible to build the product so that * all JDBC 2 methods can be called while executing under the version 1.1.x * Java Runtime EnvironmentTM. * However, in addition to this technique requiring explicit casts to the * org.hsqldb.jdbc.* classes, some of the method calls also require * int values that are defined only in the JDBC 2 or greater * version of the {@link java.sql.ResultSet ResultSet} interface. For this * reason, when the product is compiled under JDK 1.1.x, these values are * defined in {@link JDBCResultSet JDBCResultSet}.

* * In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the * JDBC 2+ ResultSet values can be achieved by referring * to them in parameter specifications and return value comparisons, * respectively, as follows:

* *

 * JDBCResultSet.FETCH_FORWARD
 * JDBCResultSet.TYPE_FORWARD_ONLY
 * JDBCResultSet.TYPE_SCROLL_INSENSITIVE
 * JDBCResultSet.CONCUR_READ_ONLY
 * // etc.
 * 
* * However, please note that code written to use HSQLDB JDBC 2 features under * JDK 1.1.x will not be compatible for use with other JDBC 2 drivers. Please * also note that this feature is offered solely as a convenience to developers * who must work under JDK 1.1.x due to operating constraints, yet wish to * use some of the more advanced features available under the JDBC 2 * specification.

* *


* * JDBC 4.0 Notes:

* * Starting with JDBC 4.0 (JDK 1.6), the DriverManager methods * getConnection and getDrivers have been * enhanced to support the Java Standard Edition Service Provider mechanism. * When built under a Java runtime that supports JDBC 4.0, HSQLDB distribution * jars containing the Driver implementation also include the file * META-INF/services/java.sql.Driver. This file contains the fully * qualified class name ('org.hsqldb.jdbc.JDBCDriver') of the HSQLDB implementation * of java.sql.Driver.

* * Hence, under JDBC 4.0 or greater, applications no longer need to explictly * load the HSQLDB JDBC driver using Class.forName(). Of course, * existing programs which do load JDBC drivers using * Class.forName() will continue to work without modification.

* *


* * (fredt@users)
* (boucherb@users)

* *

* @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @revised JDK 1.6, HSQLDB 2.0 * @revised JDK 1.7, HSQLDB 2.1.0 * @see JDBCDriver * @see JDBCStatement * @see JDBCParameterMetaData * @see JDBCCallableStatement * @see JDBCResultSet * @see JDBCDatabaseMetaData * @see java.sql.DriverManager#getConnection * @see java.sql.Statement * @see java.sql.ResultSet * @see java.sql.DatabaseMetaData */ public class JDBCConnection implements Connection { // ----------------------------------- JDBC 1 ------------------------------- /** * * * Creates a Statement object for sending * SQL statements to the database. * SQL statements without parameters are normally * executed using Statement objects. If the same SQL statement * is executed many times, it may be more efficient to use a * PreparedStatement object. *

* Result sets created using the returned Statement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * The holdability of the created result sets can be determined by * calling {@link #getHoldability}. * * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 1.7.2, support for precompilation at the engine level * has been implemented, so it is now much more efficient and performant * to use a PreparedStatement object if the same short-running * SQL statement is to be executed many times.

* * HSQLDB supports TYPE_FORWARD_ONLY, * TYPE_SCROLL_INSENSITIVE and CONCUR_READ_ONLY * results.

* *

* * @return a new default Statement object * @exception SQLException if a database access error occurs * (JDBC4 clarification:) * or this method is called on a closed connection * @see #createStatement(int,int) * @see #createStatement(int,int,int) */ public synchronized Statement createStatement() throws SQLException { checkClosed(); int props = ResultProperties.getValueForJDBC(JDBCResultSet.TYPE_FORWARD_ONLY, JDBCResultSet.CONCUR_READ_ONLY, rsHoldability); Statement stmt = new JDBCStatement(this, props); return stmt; } /** * * * Creates a PreparedStatement object for sending * parameterized SQL statements to the database. *

* A SQL statement with or without IN parameters can be * pre-compiled and stored in a PreparedStatement object. This * object can then be used to efficiently execute this statement * multiple times. * *

Note: This method is optimized for handling * parametric SQL statements that benefit from precompilation. If * the driver supports precompilation, * the method prepareStatement will send * the statement to the database for precompilation. Some drivers * may not support precompilation. In this case, the statement may * not be sent to the database until the PreparedStatement * object is executed. This has no direct effect on users; however, it does * affect which methods throw certain SQLException objects. *

* Result sets created using the returned PreparedStatement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * The holdability of the created result sets can be determined by * calling {@link #getHoldability}. * * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 1.7.2, support for precompilation at the engine level * has been implemented, so it is now much more efficient and performant * to use a PreparedStatement object if the same short-running * SQL statement is to be executed many times.

* * The support for and behaviour of PreparedStatment complies with SQL and * JDBC standards. Please read the introductory section * of the documentation for ${link JDBCParameterMetaData}.

* *

* * @param sql an SQL statement that may contain one or more '?' IN * parameter placeholders * @return a new default PreparedStatement object containing the * pre-compiled SQL statement * @exception SQLException if a database access error occurs * (JDBC4 clarification:) * or this method is called on a closed connection * @see #prepareStatement(String,int,int) */ public synchronized PreparedStatement prepareStatement( String sql) throws SQLException { checkClosed(); try { return new JDBCPreparedStatement(this, sql, JDBCResultSet.TYPE_FORWARD_ONLY, JDBCResultSet.CONCUR_READ_ONLY, rsHoldability, ResultConstants.RETURN_NO_GENERATED_KEYS, null, null); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * * * Creates a CallableStatement object for calling * database stored procedures. * The CallableStatement object provides * methods for setting up its IN and OUT parameters, and * methods for executing the call to a stored procedure. * *

Note: This method is optimized for handling stored * procedure call statements. Some drivers may send the call * statement to the database when the method prepareCall * is done; others * may wait until the CallableStatement object * is executed. This has no * direct effect on users; however, it does affect which method * throws certain SQLExceptions. *

* Result sets created using the returned CallableStatement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * The holdability of the created result sets can be determined by * calling {@link #getHoldability}. * * * *

*

HSQLDB-Specific Information:

* * Starting with 1.7.2, the support for and behaviour of * CallableStatement has changed. Please read the introductory section * of the documentation for org.hsqldb.jdbc.JDBCCallableStatement. * *

* * @param sql an SQL statement that may contain one or more '?' * parameter placeholders. (JDBC4 clarification:) Typically this statement is specified using JDBC * call escape syntax. * @return a new default CallableStatement object containing the * pre-compiled SQL statement * @exception SQLException if a database access error occurs * (JDBC4 clarification:) * or this method is called on a closed connection * @see #prepareCall(String,int,int) */ public synchronized CallableStatement prepareCall( String sql) throws SQLException { CallableStatement stmt; checkClosed(); try { stmt = new JDBCCallableStatement(this, sql, JDBCResultSet.TYPE_FORWARD_ONLY, JDBCResultSet.CONCUR_READ_ONLY, rsHoldability); return stmt; } catch (HsqlException e) { throw Util.sqlException(e); } } /** * * * Converts the given SQL statement into the system's native SQL grammar. * A driver may convert the JDBC SQL grammar into its system's * native SQL grammar prior to sending it. This method returns the * native form of the statement that the driver would have sent. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB converts the JDBC SQL * grammar into the system's native SQL grammar prior to sending * it, if escape processing is set true; this method returns the * native form of the statement that the driver would send in place * of client-specified JDBC SQL grammar.

* * Before 1.7.2, escape processing was incomplete and * also broken in terms of support for nested escapes.

* * Starting with 1.7.2, escape processing is complete and handles nesting * to arbitrary depth, but enforces a very strict interpretation of the * syntax and does not detect or process SQL comments.

* * In essence, the HSQLDB engine directly handles the prescribed syntax * and date / time formats specified internal to the JDBC escapes. * It also directly offers the XOpen / ODBC extended scalar * functions specified available internal to the {fn ...} JDBC escape. * As such, the driver simply removes the curly braces and JDBC escape * codes in the simplest and fastest fashion possible, by replacing them * with whitespace. * * But to avoid a great deal of complexity, certain forms of input * whitespace are currently not recognised. For instance, * the driver handles "{?= call ...}" but not "{ ?= call ...} or * "{? = call ...}"

* * Also, comments embedded in SQL are currently not detected or * processed and thus may have unexpected effects on the output * of this method, for instance causing otherwise valid SQL to become * invalid. It is especially important to be aware of this because escape * processing is set true by default for Statement objects and is always * set true when producing a PreparedStatement from prepareStatement() * or CallableStatement from prepareCall(). Currently, it is simply * recommended to avoid submitting SQL having comments containing JDBC * escape sequence patterns and/or single or double quotation marks, * as this will avoid any potential problems. * * It is intended to implement a less strict handling of whitespace and * proper processing of SQL comments at some point in the near future. * * In any event, 1.7.2 now correctly processes the following JDBC escape * forms to arbitrary nesting depth, but only if the exact whitespace * layout described below is used:

* *

    *
  1. {call ...} *
  2. {?= call ...} *
  3. {fn ...} *
  4. {oj ...} *
  5. {d ...} *
  6. {t ...} *
  7. {ts ...} *

* *

* * @param sql an SQL statement that may contain one or more '?' * parameter placeholders * @return the native form of this statement * @exception SQLException if a database access error occurs * (JDBC4 clarification:) * or this method is called on a closed connection */ public synchronized String nativeSQL( final String sql) throws SQLException { checkClosed(); if (sql == null || sql.length() == 0 || sql.indexOf('{') == -1) { return sql; } boolean changed = false; int state = 0; int len = sql.length(); int nest = 0; StringBuffer sb = null; String msg; //-- final int outside_all = 0; final int outside_escape_inside_single_quotes = 1; final int outside_escape_inside_double_quotes = 2; //-- final int inside_escape = 3; final int inside_escape_inside_single_quotes = 4; final int inside_escape_inside_double_quotes = 5; /** @todo */ // final int inside_single_line_comment = 6; // final int inside_multi_line_comment = 7; // Better than old way for large inputs and for avoiding GC overhead; // toString() reuses internal char[], reducing memory requirment // and garbage items 3:2 int tail = 0; for (int i = 0; i < len; i++) { char c = sql.charAt(i); switch (state) { case outside_all : // Not inside an escape or quotes if (c == '\'') { state = outside_escape_inside_single_quotes; } else if (c == '"') { state = outside_escape_inside_double_quotes; } else if (c == '{') { if (sb == null) { sb = new StringBuffer(sql.length()); } sb.append(sql.substring(tail, i)); i = onStartEscapeSequence(sql, sb, i); tail = i; changed = true; nest++; state = inside_escape; } break; case outside_escape_inside_single_quotes : // inside ' ' only case inside_escape_inside_single_quotes : // inside { } and ' ' if (c == '\'') { state -= 1; } break; case outside_escape_inside_double_quotes : // inside " " only case inside_escape_inside_double_quotes : // inside { } and " " if (c == '"') { state -= 2; } break; case inside_escape : // inside { } if (c == '\'') { state = inside_escape_inside_single_quotes; } else if (c == '"') { state = inside_escape_inside_double_quotes; } else if (c == '}') { sb.append(sql.substring(tail, i)); sb.append(' '); i++; tail = i; changed = true; nest--; state = (nest == 0) ? outside_all : inside_escape; } else if (c == '{') { sb.append(sql.substring(tail, i)); i = onStartEscapeSequence(sql, sb, i); tail = i; changed = true; nest++; state = inside_escape; } } } if (!changed) { return sql; } sb.append(sql.substring(tail, sql.length())); return sb.toString(); } /** * @todo - semantics of autocommit regarding commit when the ResultSet is closed */ /** * * * Sets this connection's auto-commit mode to the given state. * If a connection is in auto-commit mode, 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 a call to either * the method commit or the method rollback. * By default, new connections are in auto-commit * mode. *

* The commit occurs when the statement completes. The time when the statement * completes depends on the type of SQL Statement: *

    *
  • For DML statements, such as Insert, Update or Delete, and DDL statements, * the statement is complete as soon as it has finished executing. *
  • For Select statements, the statement is complete when the associated result * set is closed. *
  • For CallableStatement objects or for statements that return * multiple results, the statement is complete * when all of the associated result sets have been closed, and all update * counts and output parameters have been retrieved. *
*

* NOTE: If this method is called during a transaction and the * auto-commit mode is changed, the transaction is committed. If * setAutoCommit is called and the auto-commit mode is * not changed, the call is a no-op. * * * *

*

HSQLDB-Specific Information:

* * Up to and including HSQLDB 2.0,

* *

    *
  1. All rows of a result set are retrieved internally * before the first row can actually be fetched.
    * Therefore, a statement can be considered complete as soon as * any XXXStatement.executeXXX method returns.
  2. * *
  3. Multiple result sets and output parameters are not yet * supported.
  4. *
*

* * Starting with 2.0, HSQLDB may not return a result set to the network * client as a whole; the generic documentation will apply. The fetch * size is taken into account * * (boucherb@users)

* * @param autoCommit true to enable auto-commit mode; * false to disable it * @exception SQLException if a database access error occurs, * (JDBC4 Clarification:) * setAutoCommit(true) is called while participating in a distributed transaction, * or this method is called on a closed connection * @see #getAutoCommit */ public synchronized void setAutoCommit( boolean autoCommit) throws SQLException { checkClosed(); try { sessionProxy.setAutoCommit(autoCommit); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * Retrieves the current auto-commit mode for this Connection * object. * * @return the current state of this Connection object's * auto-commit mode * @exception SQLException if a database access error occurs * (JDBC4 Clarification:) * or this method is called on a closed connection * @see #setAutoCommit */ public synchronized boolean getAutoCommit() throws SQLException { checkClosed(); try { return sessionProxy.isAutoCommit(); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * * * Makes all changes made since the previous * commit/rollback permanent and releases any database locks * currently held by this Connection object. * This method should be * used only when auto-commit mode has been disabled. * * * *
*

HSQLDB-Specific Information:

*

* * @exception SQLException if a database access error occurs, * (JDBC4 Clarification:) * this method is called while participating in a distributed transaction, * if this method is called on a closed connection or this * Connection object is in auto-commit mode * @see #setAutoCommit */ public synchronized void commit() throws SQLException { checkClosed(); try { sessionProxy.commit(false); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * * * Undoes all changes made in the current transaction * and releases any database locks currently held * by this Connection object. This method should be * used only when auto-commit mode has been disabled. * * * *
*

HSQLDB-Specific Information:

* * Starting with HSQLDB 1.7.2, savepoints are fully supported both * in SQL and via the JDBC interface.

* * Using SQL, savepoints may be set, released and used in rollback * as follows: * *

     * SAVEPOINT <savepoint-name>
     * RELEASE SAVEPOINT <savepoint-name>
     * ROLLBACK TO SAVEPOINT <savepoint-name>
     * 
* *
* * @exception SQLException if a database access error occurs, * (JDBC4 Clarification:) * this method is called while participating in a distributed transaction, * this method is called on a closed connection or this * Connection object is in auto-commit mode * @see #setAutoCommit */ public synchronized void rollback() throws SQLException { checkClosed(); try { sessionProxy.rollback(false); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * * * Releases this Connection object's database and JDBC resources * immediately instead of waiting for them to be automatically released. *

* Calling the method close on a Connection * object that is already closed is a no-op. *

* It is strongly recommended that an application explicitly * commits or rolls back an active transaction prior to calling the * close method. If the close method is called * and there is an active transaction, the results are implementation-defined. *

* * * *

*

HSQLDB-Specific Information:

* * From 1.7.2, HSQLDB INTERNAL Connection * objects are not closable from JDBC client code.

* *

* * @exception SQLException SQLException if a database access error occurs */ public synchronized void close() throws SQLException { // Changed to synchronized above because // we would not want a sessionProxy.close() // operation to occur concurrently with a // statementXXX.executeXXX operation. if (isInternal || isClosed) { return; } isClosed = true; rootWarning = null; connProperties = null; if (isPooled) { if (poolEventListener != null) { poolEventListener.connectionClosed(); poolEventListener = null; } } else if (sessionProxy != null) { sessionProxy.close(); sessionProxy = null; } } /** * Retrieves whether this Connection object has been * closed. A connection is closed if the method close * has been called on it or if certain fatal errors have occurred. * This method is guaranteed to return true only when * it is called after the method Connection.close has * been called. *

* This method generally cannot be called to determine whether a * connection to a database is valid or invalid. A typical client * can determine that a connection is invalid by catching any * exceptions that might be thrown when an operation is attempted. * * @return true if this Connection object * is closed; false if it is still open * @exception SQLException if a database access error occurs */ public synchronized boolean isClosed() throws SQLException { return isClosed; } //====================================================================== // Advanced features: /** * * * Retrieves a DatabaseMetaData object that contains * metadata about the database to which this * Connection object represents a connection. * The metadata includes information about the database's * tables, its supported SQL grammar, its stored * procedures, the capabilities of this connection, and so on. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB 2.0 essentially supports full database metadata.

* * For discussion in greater detail, please follow the link to the * overview for JDBCDatabaseMetaData, below. * *

* * @return a DatabaseMetaData object for this * Connection object * @exception SQLException if a database access error occurs * (JDBC4 Clarification) * or this method is called on a closed connection * @see JDBCDatabaseMetaData */ public synchronized DatabaseMetaData getMetaData() throws SQLException { checkClosed(); return new JDBCDatabaseMetaData(this); } /** * * * Puts this connection in read-only mode as a hint to the driver to enable * database optimizations. * *

Note: This method cannot be called during a transaction. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports the SQL standard, which will not allow calls to * this method to succeed during a transaction.

* * Additionally, HSQLDB provides a way to put a whole database in * read-only mode. This is done by manually adding the line * 'readonly=true' to the database's .properties file while the * database is offline. Upon restart, all connections will be * readonly, since the entire database will be readonly. To take * a database out of readonly mode, simply take the database * offline and remove the line 'readonly=true' from the * database's .properties file. Upon restart, the database will * be in regular (read-write) mode.

* * When a database is put in readonly mode, its files are opened * in readonly mode, making it possible to create CD-based * readonly databases. To create a CD-based readonly database * that has CACHED tables and whose .data file is suspected of * being highly fragmented, it is recommended that the database * first be SHUTDOWN COMPACTed before copying the database * files to CD. This will reduce the space required and may * improve access times against the .data file which holds the * CACHED table data.

* * Starting with 1.7.2, an alternate approach to opimizing the * .data file before creating a CD-based readonly database is to issue * the CHECKPOINT DEFRAG command followed by SHUTDOWN to take the * database offline in preparation to burn the database files to CD.

* *

* * @param readOnly true enables read-only mode; * false disables it * @exception SQLException if a database access error occurs, this * (JDBC4 Clarification:) * method is called on a closed connection or this * method is called during a transaction */ public synchronized void setReadOnly( boolean readOnly) throws SQLException { checkClosed(); try { sessionProxy.setReadOnlyDefault(readOnly); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * Retrieves whether this Connection * object is in read-only mode. * * @return true if this Connection object * is read-only; false otherwise * @exception SQLException SQLException if a database access error occurs * (JDBC4 Clarification:) * or this method is called on a closed connection */ public synchronized boolean isReadOnly() throws SQLException { checkClosed(); try { return sessionProxy.isReadOnlyDefault(); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * * * Sets the given catalog name in order to select * a subspace of this Connection object's database * in which to work. *

* * (JDBC4 Clarification:)

* If the driver does not support catalogs, it will * silently ignore this request. * JDBC 4.1[

* Calling {@code setCatalog} has no effect on previously created or prepared * {@code Statement} objects. It is implementation defined whether a DBMS * prepare operation takes place immediately when the {@code Connection} * method {@code prepareStatement} or {@code prepareCall} is invoked. * For maximum portability, {@code setCatalog} should be called before a * {@code Statement} is created or prepared.] * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports a single catalog per database. If the given catalog name * is not the same as the database catalog name, this method throws an * error.

*

* * @param catalog the name of a catalog (subspace in this * Connection object's database) in which to work * @exception SQLException if a database access error occurs * (JDBC4 Clarification) * or this method is called on a closed connection * @see #getCatalog */ public synchronized void setCatalog(String catalog) throws SQLException { checkClosed(); try { sessionProxy.setAttribute(SessionInterface.INFO_CATALOG, catalog); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * * * Retrieves this Connection object's current catalog name. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports a single catalog per database. This method * returns the catalog name for the current database * error.

* *

* * @return the current catalog name or null if there is none * @exception SQLException if a database access error occurs * (JDBC4 Clarification:) * or this method is called on a closed connection * @see #setCatalog */ public synchronized String getCatalog() throws SQLException { checkClosed(); try { return (String) sessionProxy.getAttribute( SessionInterface.INFO_CATALOG); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * * * Attempts to change the transaction isolation level for this * Connection object to the one given. * The constants defined in the interface Connection * are the possible transaction isolation levels. *

* Note: If this method is called during a transaction, the result * is implementation-defined. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB 2.0 accepts all isolation levels. Connection.TRANSACTION_READ_UNCOMMITED * is promoted to Connection.TRANSACTION_READ_COMMITED, but the transactions become read only. * Calling this method during a transaction always succeeds and the selected * isolation level is used from the next transaction.

* *

* * @param level one of the following Connection constants: * Connection.TRANSACTION_READ_UNCOMMITTED, * Connection.TRANSACTION_READ_COMMITTED, * Connection.TRANSACTION_REPEATABLE_READ, or * Connection.TRANSACTION_SERIALIZABLE. * (Note that Connection.TRANSACTION_NONE cannot be used * because it specifies that transactions are not supported.) * @exception SQLException if a database access error occurs, this * (JDBC4 Clarification:) * method is called on a closed connection * (:JDBC4 End Clarification) * or the given parameter is not one of the Connection * constants * @see JDBCDatabaseMetaData#supportsTransactionIsolationLevel * @see #getTransactionIsolation */ public synchronized void setTransactionIsolation( int level) throws SQLException { checkClosed(); switch (level) { case TRANSACTION_READ_UNCOMMITTED : case TRANSACTION_READ_COMMITTED : case TRANSACTION_REPEATABLE_READ : case TRANSACTION_SERIALIZABLE : break; default : throw Util.invalidArgument(); } try { sessionProxy.setIsolationDefault(level); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * * * Retrieves this Connection object's current * transaction isolation level. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 supports all isolation levels. Connection.TRANSACTION_READ_UNCOMMITED * is promoted to Connection.TRANSACTION_READ_COMMITED. * *

* * @return the current transaction isolation level, which will be one * of the following constants: * Connection.TRANSACTION_READ_UNCOMMITTED, * Connection.TRANSACTION_READ_COMMITTED, * Connection.TRANSACTION_REPEATABLE_READ, * Connection.TRANSACTION_SERIALIZABLE, or * Connection.TRANSACTION_NONE. * @exception SQLException if a database access error occurs * (JDBC4 Clarification:) * or this method is called on a closed connection * @see JDBCDatabaseMetaData#supportsTransactionIsolationLevel * @see #setTransactionIsolation */ public synchronized int getTransactionIsolation() throws SQLException { checkClosed(); try { return sessionProxy.getIsolation(); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * * * Retrieves the first warning reported by calls on this * Connection object. If there is more than one * warning, subsequent warnings will be chained to the first one * and can be retrieved by calling the method * SQLWarning.getNextWarning on the warning * that was retrieved previously. *

* This method may not be * called on a closed connection; doing so will cause an * SQLException to be thrown. * *

Note: Subsequent warnings will be chained to this * SQLWarning. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB produces warnings whenever a createStatement(), * prepareStatement() or prepareCall() invocation requests an unsupported * but defined combination of result set type, concurrency and holdability, * such that another set is substituted.

* Other warnings are typically raised during the execution of data change * and query statements.

* * Only the warnings caused by the last operation on this connection are * returned by this method. A single operation may return up to 10 chained * warnings. * *

* @return the first SQLWarning object or null * if there are none * @exception SQLException if a database access error occurs or * this method is called on a closed connection * @see java.sql.SQLWarning */ public synchronized SQLWarning getWarnings() throws SQLException { checkClosed(); return rootWarning; } /** * * * Clears all warnings reported for this Connection object. * After a call to this method, the method getWarnings * returns null until a new warning is * reported for this Connection object. * * * *
*

HSQLDB-Specific Information:

* * The standard behaviour is implemented.

* *

* * @exception SQLException SQLException if a database access error occurs * (JDBC4 Clarification:) * or this method is called on a closed connection */ public synchronized void clearWarnings() throws SQLException { checkClosed(); rootWarning = null; } //--------------------------JDBC 2.0----------------------------- /** * * * Creates a Statement object that will generate * ResultSet objects with the given type and concurrency. * This method is the same as the createStatement method * above, but it allows the default result set * type and concurrency to be overridden. * The holdability of the created result sets can be determined by * calling {@link #getHoldability}. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 adheres closely to SQL and JDBC standards. The * interpretation of of resultSetType and resultSetConcurrency has * changed in this version.

* * HSQLDB supports TYPE_FORWARD_ONLY, * TYPE_SCROLL_INSENSITIVE, * CONCUR_READ_ONLY, * CONCUR_UPDATABLE * results.

* * If an unsupported combination is requested, a SQLWarning is issued on * this Connection and the closest supported combination is used instead.

* *

* * @param resultSetType a result set type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency a concurrency type; one of * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @return a new Statement object that will generate * ResultSet objects with the given type and * concurrency * @exception SQLException if a database access error occurs, this * (JDBC4 Clarification:) * method is called on a closed connection * (:JDBC4 Clarification) * or the given parameters are not ResultSet * constants indicating type and concurrency * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method or this method is not supported for the specified result * set type and result set concurrency. * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCConnection) */ public synchronized Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { checkClosed(); int props = ResultProperties.getValueForJDBC(resultSetType, resultSetConcurrency, rsHoldability); return new JDBCStatement(this, props); } /** * * * Creates a PreparedStatement object that will generate * ResultSet objects with the given type and concurrency. * This method is the same as the prepareStatement method * above, but it allows the default result set * type and concurrency to be overridden. * (JDBC4 Clarification:) * The holdability of the created result sets can be determined by * calling {@link #getHoldability}. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 adheres closely to SQL and JDBC standards. The * interpretation of of resultSetType and resultSetConcurrency has * changed in this version.

* * HSQLDB supports TYPE_FORWARD_ONLY, * TYPE_SCROLL_INSENSITIVE, * CONCUR_READ_ONLY, * CONCUR_UPDATABLE * results.

* * If an unsupported combination is requested, a SQLWarning is issued on * this Connection and the closest supported combination is used instead.

* *

* * @param sql a String object that is the SQL statement to * be sent to the database; may contain one or more '?' IN * parameters * @param resultSetType a result set type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency a concurrency type; one of * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @return a new PreparedStatement object containing the * pre-compiled SQL statement that will produce ResultSet * objects with the given type and concurrency * @exception SQLException if a database access error occurs, this * (JDBC4 Clarification:) * method is called on a closed connection * (:JDBC4 Clarification) * or the given parameters are not ResultSet * constants indicating type and concurrency * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method or this method is not supported for the specified result * set type and result set concurrency. * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCConnection) */ public synchronized PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkClosed(); try { int holdability = rsHoldability; if (resultSetConcurrency == JDBCResultSet.CONCUR_UPDATABLE) { holdability = JDBCResultSet.CLOSE_CURSORS_AT_COMMIT; } return new JDBCPreparedStatement(this, sql, resultSetType, resultSetConcurrency, holdability, ResultConstants.RETURN_NO_GENERATED_KEYS, null, null); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * * * Creates a CallableStatement object that will generate * ResultSet objects with the given type and concurrency. * This method is the same as the prepareCall method * above, but it allows the default result set * type and concurrency to be overridden. * (JDBC4 Clarification:) * The holdability of the created result sets can be determined by * calling {@link #getHoldability}. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 adheres closely to SQL and JDBC standards. The * interpretation of of resultSetType and resultSetConcurrency has * changed in this version.

* * HSQLDB supports TYPE_FORWARD_ONLY, * TYPE_SCROLL_INSENSITIVE, * CONCUR_READ_ONLY, * CONCUR_UPDATABLE * results.

* * If an unsupported combination is requested, a SQLWarning is issued on * this Connection and the closest supported combination is used instead.

* *

* * @param sql a String object that is the SQL statement to * be sent to the database; may contain on or more '?' parameters * @param resultSetType a result set type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency a concurrency type; one of * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @return a new CallableStatement object containing the * pre-compiled SQL statement that will produce ResultSet * objects with the given type and concurrency * @exception SQLException if a database access error occurs, this method * (JDBC4 Clarification:) * is called on a closed connection * (:JDBC4 Clarification) * or the given parameters are not ResultSet * constants indicating type and concurrency * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method or this method is not supported for the specified result * set type and result set concurrency. * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCConnection) */ public synchronized CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkClosed(); try { return new JDBCCallableStatement(this, sql, resultSetType, resultSetConcurrency, rsHoldability); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * * * Retrieves the Map object associated with this * Connection object. * Unless the application has added an entry, the type map returned * will be empty. * JDBC 4.1[

* You must invoke setTypeMap after making changes to the * Map object returned from * getTypeMap as a JDBC driver may create an internal * copy of the Map object passed to setTypeMap: *

*

     *      Map<String,Class<?>> myMap = con.getTypeMap();
     *      myMap.put("mySchemaName.ATHLETES", Athletes.class);
     *      con.setTypeMap(myMap);
     * 
] * * *
*

HSQLDB-Specific Information:

* * For compatibility, HSQLDB returns an empty map.

* *

* * @return the java.util.Map object associated * with this Connection object * @exception SQLException if a database access error occurs * (JDBC4 Clarification:) * or this method is called on a closed connection * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCConnection) * @see #setTypeMap */ //#ifdef JAVA6 public synchronized java.util .Map> getTypeMap() throws SQLException { checkClosed(); return new java.util.HashMap>(); } //#else /* public synchronized Map getTypeMap() throws SQLException { checkClosed(); return new java.util.HashMap(); } */ //#endif JAVA6 /** * * * Installs the given TypeMap object as the type map for * this Connection object. The type map will be used for the * custom mapping of SQL structured types and distinct types. * JDBC4.1[

* You must set the the values for the TypeMap prior to * calling setMap as a JDBC driver may create an internal copy * of the TypeMap: *

*

     *      Map myMap<String,Class<?>> = new HashMap<String,Class<?>>();
     *      myMap.put("mySchemaName.ATHLETES", Athletes.class);
     *      con.setTypeMap(myMap);
     * 
] * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature. Calling this * method always throws a SQLException, stating that * the function is not supported.

* *

* * @param map the java.util.Map object to install * as the replacement for this Connection * object's default type map * @exception SQLException if a database access error occurs, this * (JDBC4 Clarification:) * method is called on a closed connection or * (:JDBC4 Clarification) * the given parameter is not a java.util.Map * object * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCConnection) * @see #getTypeMap */ //#ifdef JAVA6 public synchronized void setTypeMap(Map> map) throws SQLException { checkClosed(); throw Util.notSupported(); } //#else /* public synchronized void setTypeMap(Map map) throws SQLException { checkClosed(); throw Util.notSupported(); } */ //#endif JAVA6 //--------------------------JDBC 3.0----------------------------- /** * * * (JDBC4 Clarification:) * Changes the default holdability of ResultSet objects * created using this Connection object to the given * holdability. The default holdability of ResultSet objects * can be be determined by invoking * {@link DatabaseMetaData#getResultSetHoldability}. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * @param holdability a ResultSet holdability constant; one of * ResultSet.HOLD_CURSORS_OVER_COMMIT or * ResultSet.CLOSE_CURSORS_AT_COMMIT * @throws SQLException if a database access occurs, this method is called * (JDBC4 Clarification:) * on a closed connection, or the given parameter * (:JDBC4 Clarification) * is not a ResultSet constant indicating holdability * @exception SQLFeatureNotSupportedException if the given holdability is not supported * @see #getHoldability * @see DatabaseMetaData#getResultSetHoldability * @see JDBCResultSet * @since JDK 1.4, HSQLDB 1.7.2 */ //#ifdef JAVA4 public synchronized void setHoldability( int holdability) throws SQLException { checkClosed(); switch (holdability) { case JDBCResultSet.HOLD_CURSORS_OVER_COMMIT : case JDBCResultSet.CLOSE_CURSORS_AT_COMMIT : break; default : throw Util.invalidArgument(); } rsHoldability = holdability; } //#endif JAVA4 /** * * * Retrieves the current holdability of ResultSet objects * created using this Connection object. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB returns the current holdability.

* * The default is HOLD_CURSORS_OVER_COMMIT.

* *

* * @return the holdability, one of * ResultSet.HOLD_CURSORS_OVER_COMMIT or * ResultSet.CLOSE_CURSORS_AT_COMMIT * @throws SQLException if a database access error occurs * (JDBC4 Clarification:) * or this method is called on a closed connection * @see #setHoldability * @see DatabaseMetaData#getResultSetHoldability * @see JDBCResultSet * @since JDK 1.4, HSQLDB 1.7.2 */ //#ifdef JAVA4 public synchronized int getHoldability() throws SQLException { checkClosed(); return rsHoldability; } //#endif JAVA4 /** * * * Creates an unnamed savepoint in the current transaction and * returns the new Savepoint object that represents it. * *

(JDBC4 clarification:) if setSavepoint is invoked outside of an active transaction, a transaction will be started at this newly created * savepoint. * * * *

*

HSQLDB-Specific Information:

* * From 2.0, HSQLDB supports this feature.

* * Note: Unnamed savepoints are not part of the SQL:2003 standard. * Use setSavepoint(String name) instead.

* *

* * @return the new Savepoint object * @exception SQLException if a database access error occurs, * (JDBC4 Clarification:) * this method is called while participating in a distributed transaction, * this method is called on a closed connection * or this Connection object is currently in * auto-commit mode * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see JDBCSavepoint * @see java.sql.Savepoint * @since JDK 1.4, HSQLDB 1.7.2 */ //#ifdef JAVA4 public synchronized Savepoint setSavepoint() throws SQLException { checkClosed(); if (JDBCDatabaseMetaData.JDBC_MAJOR >= 4 && getAutoCommit()) { throw Util.sqlException(ErrorCode.X_3B001); } JDBCSavepoint savepoint = new JDBCSavepoint(this); try { sessionProxy.savepoint(savepoint.name); } catch (HsqlException e) { Util.throwError(e); } return savepoint; } //#endif JAVA4 /** * * * Creates a savepoint with the given name in the current transaction * and returns the new Savepoint object that represents it. * *

if setSavepoint is invoked outside of an active transaction, a transaction will be started at this newly created * savepoint. * * * * *

*

HSQLDB-Specific Information:

* * Previous to JDBC 4, if the connection is autoCommit, * setting a savepoint has no effect, as it is cleared upon the execution * of the next transactional statement. When built for JDBC 4, this method * throws an SQLException when this Connection object is currently * in auto-commit mode, as per the JDBC 4 standard. *

* * @param name a String containing the name of the savepoint * @return the new Savepoint object * @exception SQLException if a database access error occurs, * (JDBC4 Clarification:) * this method is called while participating in a distributed transaction, * this method is called on a closed connection * or this Connection object is currently in * auto-commit mode * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see JDBCSavepoint * @see java.sql.Savepoint * @since JDK 1.4, HSQLDB 1.7.2 */ //#ifdef JAVA4 public synchronized Savepoint setSavepoint( String name) throws SQLException { checkClosed(); if (JDBCDatabaseMetaData.JDBC_MAJOR >= 4 && getAutoCommit()) { throw Util.sqlException(ErrorCode.X_3B001); } if (name == null) { throw Util.nullArgument(); } if (name.startsWith("SYSTEM_SAVEPOINT_")) { throw Util.invalidArgument(); } try { sessionProxy.savepoint(name); } catch (HsqlException e) { Util.throwError(e); } return new JDBCSavepoint(name, this); } //#endif JAVA4 /** * * * Undoes all changes made after the given Savepoint object * was set. *

* This method should be used only when auto-commit has been disabled. * * * *

*

HSQLDB-Specific Information:

* * Previous to JDBC 4, JDBCSavepoint objects are valid for the life of * the originating Connection object and hence can be used * interchangeably, as long as they have equal savepoint names.

* * When built for JDBC 4, JDBCConnection objects invalidate * JDBCSavepoint objects when auto-commit mode is entered as well * as when they are used to successfully release or roll back to a named SQL * savepoint. As per the JDBC 4 standard, when built for JDBC 4, this * method throws an SQLException when this Connection * object is currently in auto-commit mode and an invalidated * JDBCSavepoint is specified. *

* * @param savepoint the Savepoint object to roll back to * @exception SQLException if a database access error occurs, * this method is called while participating in a distributed transaction, * this method is called on a closed connection, * the Savepoint object is no longer valid, * or this Connection object is currently in * auto-commit mode * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see JDBCSavepoint * @see java.sql.Savepoint * @see #rollback * @since JDK 1.4, HSQLDB 1.7.2 */ //#ifdef JAVA4 public synchronized void rollback( Savepoint savepoint) throws SQLException { JDBCSavepoint sp; checkClosed(); if (savepoint == null) { throw Util.nullArgument(); } if (!(savepoint instanceof JDBCSavepoint)) { String msg = Error.getMessage(ErrorCode.X_3B001); throw Util.invalidArgument(msg); } sp = (JDBCSavepoint) savepoint; if (JDBCDatabaseMetaData.JDBC_MAJOR >= 4 && sp.name == null) { String msg = Error.getMessage(ErrorCode.X_3B001); throw Util.invalidArgument(msg); } if (this != sp.connection) { String msg = Error.getMessage(ErrorCode.X_3B001); throw Util.invalidArgument(msg); } if (JDBCDatabaseMetaData.JDBC_MAJOR >= 4 && getAutoCommit()) { sp.name = null; sp.connection = null; throw Util.sqlException(ErrorCode.X_3B001); } try { sessionProxy.rollbackToSavepoint(sp.name); if (JDBCDatabaseMetaData.JDBC_MAJOR >= 4) { sp.connection = null; sp.name = null; } } catch (HsqlException e) { throw Util.sqlException(e); } } //#endif JAVA4 /** * * * Removes the specified Savepoint (JDBC4 Clarification:) and subsequent Savepoint objects from the current * transaction. Any reference to the savepoint after it have been removed * will cause an SQLException to be thrown. * * * * * HSLQDB Note:

* * Previous to JDBC 4, JDBCSavepoint objects are valid for the life of * the originating Connection object and hence can be used * interchangeably, as long as they have equal savepoint names.

* * When built for JDBC 4, JDBCConnection objects invalidate * JDBCSavepoint objects when auto-commit mode is entered as well * as when they are used to successfully release or roll back to a named SQL * savepoint. As per the JDBC 4 standard, when built for JDBC 4, this * method throws an SQLException when this Connection * object is currently in auto-commit mode and when an invalidated * JDBCSavepoint is specified.

* * @param savepoint the Savepoint object to be removed * @exception SQLException if a database access error occurs, this * (JDBC4 Clarification:) * method is called on a closed connection or * the given Savepoint object is not a valid * savepoint in the current transaction * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see JDBCSavepoint * @see java.sql.Savepoint * @since JDK 1.4, HSQLDB 1.7.2 */ //#ifdef JAVA4 public synchronized void releaseSavepoint( Savepoint savepoint) throws SQLException { JDBCSavepoint sp; Result req; checkClosed(); if (savepoint == null) { throw Util.nullArgument(); } if (!(savepoint instanceof JDBCSavepoint)) { String msg = Error.getMessage(ErrorCode.X_3B001); throw Util.invalidArgument(msg); } sp = (JDBCSavepoint) savepoint; if (JDBCDatabaseMetaData.JDBC_MAJOR >= 4 && sp.name == null) { String msg = Error.getMessage(ErrorCode.X_3B001); throw Util.invalidArgument(msg); } if (this != sp.connection) { String msg = Error.getMessage(ErrorCode.X_3B001); throw Util.invalidArgument(msg); } if (JDBCDatabaseMetaData.JDBC_MAJOR >= 4 && getAutoCommit()) { sp.name = null; sp.connection = null; throw Util.sqlException(ErrorCode.X_3B001); } try { sessionProxy.releaseSavepoint(sp.name); if (JDBCDatabaseMetaData.JDBC_MAJOR >= 4) { sp.connection = null; sp.name = null; } } catch (HsqlException e) { throw Util.sqlException(e); } } //#endif JAVA4 /** * * * Creates a Statement object that will generate * ResultSet objects with the given type, concurrency, * and holdability. * This method is the same as the createStatement method * above, but it allows the default result set * type, concurrency, and holdability to be overridden. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB 2.0 adheres closely to SQL and JDBC standards. The * interpretation of of resultSetType and resultSetConcurrency has * changed in this version.

* * HSQLDB supports TYPE_FORWARD_ONLY, * TYPE_SCROLL_INSENSITIVE, * CONCUR_READ_ONLY, * CONCUR_UPDATABLE * results.

* * If an unsupported combination is requested, a SQLWarning is issued on * this Connection and the closest supported combination is used instead.

* *

* * @param resultSetType one of the following ResultSet * constants: * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency one of the following ResultSet * constants: * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @param resultSetHoldability one of the following ResultSet * constants: * ResultSet.HOLD_CURSORS_OVER_COMMIT or * ResultSet.CLOSE_CURSORS_AT_COMMIT * @return a new Statement object that will generate * ResultSet objects with the given type, * concurrency, and holdability * @exception SQLException if a database access error occurs, this * (JDBC4 Clarification:) * method is called on a closed connection * (:JDBC4 Clarification) * or the given parameters are not ResultSet * constants indicating type, concurrency, and holdability * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method or this method is not supported for the specified result * set type, result set holdability and result set concurrency. * @see JDBCResultSet * @since JDK 1.4, HSQLDB 1.7.2 */ //#ifdef JAVA4 public synchronized Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkClosed(); int props = ResultProperties.getValueForJDBC(resultSetType, resultSetConcurrency, resultSetHoldability); return new JDBCStatement(this, props); } //#endif JAVA4 /** * * * Creates a PreparedStatement object that will generate * ResultSet objects with the given type, concurrency, * and holdability. *

* This method is the same as the prepareStatement method * above, but it allows the default result set * type, concurrency, and holdability to be overridden. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB 2.0 adheres closely to SQL and JDBC standards. The * interpretation of of resultSetType and resultSetConcurrency has * changed in this version.

* * HSQLDB supports TYPE_FORWARD_ONLY, * TYPE_SCROLL_INSENSITIVE, * CONCUR_READ_ONLY, * CONCUR_UPDATABLE * results.

* HOLD_CURSORS_OVER_COMMIT is supported only when * CONCUR_READ_ONLY is requested.

* * * If an unsupported combination is requested, a SQLWarning is issued on * this Connection and the closest supported combination is used instead.

* *

* * @param sql a String object that is the SQL statement to * be sent to the database; may contain one or more '?' IN * parameters * @param resultSetType one of the following ResultSet * constants: * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency one of the following ResultSet * constants: * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @param resultSetHoldability one of the following ResultSet * constants: * ResultSet.HOLD_CURSORS_OVER_COMMIT or * ResultSet.CLOSE_CURSORS_AT_COMMIT * @return a new PreparedStatement object, containing the * pre-compiled SQL statement, that will generate * ResultSet objects with the given type, * concurrency, and holdability * @exception SQLException if a database access error occurs, this * (JDBC4 Clarification:) * method is called on a closed connection * (:JDBC4 Clarification) * or the given parameters are not ResultSet * constants indicating type, concurrency, and holdability * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method or this method is not supported for the specified result * set type, result set holdability and result set concurrency. * @see JDBCResultSet * @since JDK 1.4, HSQLDB 1.7.2 */ //#ifdef JAVA4 public synchronized PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkClosed(); try { return new JDBCPreparedStatement(this, sql, resultSetType, resultSetConcurrency, resultSetHoldability, ResultConstants.RETURN_NO_GENERATED_KEYS, null, null); } catch (HsqlException e) { throw Util.sqlException(e); } } //#endif JAVA4 /** * * * Creates a CallableStatement object that will generate * ResultSet objects with the given type and concurrency. * This method is the same as the prepareCall method * above, but it allows the default result set * type, result set concurrency type and holdability to be overridden. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 2.0 adheres closely to SQL and JDBC standards. The * interpretation of of resultSetType and resultSetConcurrency has * changed in this version.

* * HSQLDB supports TYPE_FORWARD_ONLY, * TYPE_SCROLL_INSENSITIVE, * CONCUR_READ_ONLY, * CONCUR_UPDATABLE * results.

* * If an unsupported combination is requested, a SQLWarning is issued on * this Connection and the closest supported combination is used instead.

* *

* * @param sql a String object that is the SQL statement to * be sent to the database; may contain on or more '?' parameters * @param resultSetType one of the following ResultSet * constants: * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency one of the following ResultSet * constants: * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @param resultSetHoldability one of the following ResultSet * constants: * ResultSet.HOLD_CURSORS_OVER_COMMIT or * ResultSet.CLOSE_CURSORS_AT_COMMIT * @return a new CallableStatement object, containing the * pre-compiled SQL statement, that will generate * ResultSet objects with the given type, * concurrency, and holdability * @exception SQLException if a database access error occurs, this * (JDBC4 Clarification:) * method is called on a closed connection * (:JDBC4 Clarification) * or the given parameters are not ResultSet * constants indicating type, concurrency, and holdability * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method or this method is not supported for the specified result * set type, result set holdability and result set concurrency. * @see JDBCResultSet * @since JDK 1.4, HSQLDB 1.7.2 */ //#ifdef JAVA4 public synchronized CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkClosed(); try { return new JDBCCallableStatement(this, sql, resultSetType, resultSetConcurrency, resultSetHoldability); } catch (HsqlException e) { throw Util.sqlException(e); } } //#endif JAVA4 /** * * * Creates a default PreparedStatement object that has * the capability to retrieve auto-generated keys. The given constant * tells the driver whether it should make auto-generated keys * available for retrieval. This parameter is ignored if the SQL statement * is not an INSERT statement, or an SQL statement able to return * auto-generated keys (the list of such statements is vendor-specific). *

* Note: This method is optimized for handling * parametric SQL statements that benefit from pre-compilation. If * the driver supports pre-compilation, * the method prepareStatement will send * the statement to the database for pre-compilation. Some drivers * may not support pre-compilation. In this case, the statement may * not be sent to the database until the PreparedStatement * object is executed. This has no direct effect on users; however, it does * affect which methods throw certain SQLExceptions. *

* Result sets created using the returned PreparedStatement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * (JDBC4 Clarification:) * The holdability of the created result sets can be determined by * calling {@link #getHoldability}. * * * *

*

HSQLDB-Specific Information:

* * Starting with version 2.0, HSQLDB supports returning generated columns * with single-row and multi-row INSERT, UPDATE and MERGE statements.

* If the table has an IDENTITY or GENERATED column(s) the values for these * columns are returned in the next call to getGeneratedKeys() after each * execution of the PreparedStatement. * *

* * @param sql an SQL statement that may contain one or more '?' IN * parameter placeholders * @param autoGeneratedKeys a flag indicating whether auto-generated keys * should be returned; one of * Statement.RETURN_GENERATED_KEYS or * Statement.NO_GENERATED_KEYS * @return a new PreparedStatement object, containing the * pre-compiled SQL statement, that will have the capability of * returning auto-generated keys * @exception SQLException if a database access error occurs, this * (JDBC4 Clarification:) * method is called on a closed connection * (:JDBC4 Clarification) * or the given parameter is not a Statement * constant indicating whether auto-generated keys should be * returned * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method with a constant of Statement.RETURN_GENERATED_KEYS * @since JDK 1.4, HSQLDB 1.7.2 */ //#ifdef JAVA4 public synchronized PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { checkClosed(); try { if (autoGeneratedKeys != ResultConstants.RETURN_GENERATED_KEYS && autoGeneratedKeys != ResultConstants.RETURN_NO_GENERATED_KEYS) { throw Util.invalidArgument("autoGeneratedKeys"); } return new JDBCPreparedStatement(this, sql, JDBCResultSet.TYPE_FORWARD_ONLY, JDBCResultSet.CONCUR_READ_ONLY, rsHoldability, autoGeneratedKeys, null, null); } catch (HsqlException e) { throw Util.sqlException(e); } } //#endif JAVA4 /** * * Creates a default PreparedStatement object capable * of returning the auto-generated keys designated by the given array. * This array contains the indexes of the columns in the target * table that contain the auto-generated keys that should be made * available. The driver will ignore the array if the SQL statement * is not an INSERT statement, or an SQL statement able to return * auto-generated keys (the list of such statements is vendor-specific). *

* An SQL statement with or without IN parameters can be * pre-compiled and stored in a PreparedStatement object. This * object can then be used to efficiently execute this statement * multiple times. *

* Note: This method is optimized for handling * parametric SQL statements that benefit from pre-compilation. If * the driver supports pre-compilation, * the method prepareStatement will send * the statement to the database for pre-compilation. Some drivers * may not support pre-compilation. In this case, the statement may * not be sent to the database until the PreparedStatement * object is executed. This has no direct effect on users; however, it does * affect which methods throw certain SQLExceptions. *

* Result sets created using the returned PreparedStatement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * (JDBC4 Clarification:) * The holdability of the created result sets can be determined by * calling {@link #getHoldability}. * * * *

*

HSQLDB-Specific Information:

* * Starting with version 2.0, HSQLDB supports returning generated columns * with single-row and multi-row INSERT, UPDATE and MERGE statements.

* The columnIndexes may specify any set of columns of the table. * *

* * @param sql an SQL statement that may contain one or more '?' IN * parameter placeholders * @param columnIndexes an array of column indexes indicating the columns * that should be returned from the inserted row or rows * @return a new PreparedStatement object, containing the * pre-compiled statement, that is capable of returning the * auto-generated keys designated by the given array of column * indexes * @exception SQLException if a database access error occurs * (JDBC4 Clarification:) * or this method is called on a closed connection * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.2 */ //#ifdef JAVA4 public synchronized PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { checkClosed(); try { return new JDBCPreparedStatement(this, sql, JDBCResultSet.TYPE_FORWARD_ONLY, JDBCResultSet.CONCUR_READ_ONLY, rsHoldability, ResultConstants.RETURN_GENERATED_KEYS_COL_INDEXES, columnIndexes, null); } catch (HsqlException e) { throw Util.sqlException(e); } } //#endif JAVA4 /** * * * Creates a default PreparedStatement object capable * of returning the auto-generated keys designated by the given array. * This array contains the names of the columns in the target * table that contain the auto-generated keys that should be returned. * The driver will ignore the array if the SQL statement * is not an INSERT statement, or an SQL statement able to return * auto-generated keys (the list of such statements is vendor-specific). *

* An SQL statement with or without IN parameters can be * pre-compiled and stored in a PreparedStatement object. This * object can then be used to efficiently execute this statement * multiple times. *

* Note: This method is optimized for handling * parametric SQL statements that benefit from pre-compilation. If * the driver supports pre-compilation, * the method prepareStatement will send * the statement to the database for pre-compilation. Some drivers * may not support pre-compilation. In this case, the statement may * not be sent to the database until the PreparedStatement * object is executed. This has no direct effect on users; however, it does * affect which methods throw certain SQLExceptions. *

* Result sets created using the returned PreparedStatement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * (JDBC4 Clarification:) * The holdability of the created result sets can be determined by * calling {@link #getHoldability}. * * * *

*

HSQLDB-Specific Information:

* * Starting with version 2.0, HSQLDB supports returning generated columns * with single-row and multi-row INSERT, UPDATE and MERGE statements.

* The columnNames may specify any set of columns of the table. * *

* * @param sql an SQL statement that may contain one or more '?' IN * parameter placeholders * @param columnNames an array of column names indicating the columns * that should be returned from the inserted row or rows * @return a new PreparedStatement object, containing the * pre-compiled statement, that is capable of returning the * auto-generated keys designated by the given array of column * names * @exception SQLException if a database access error occurs * (JDBC4 Clarification:) * or this method is called on a closed connection * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.2 */ //#ifdef JAVA4 public synchronized PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { checkClosed(); try { return new JDBCPreparedStatement(this, sql, JDBCResultSet.TYPE_FORWARD_ONLY, JDBCResultSet.CONCUR_READ_ONLY, rsHoldability, ResultConstants.RETURN_GENERATED_KEYS_COL_NAMES, null, columnNames); } catch (HsqlException e) { throw Util.sqlException(e); } } //#endif JAVA4 //------------------------- JDBC 4.0 ----------------------------------- /** * Constructs an object that implements the Clob interface. The object * returned initially contains no data. The setAsciiStream, * setCharacterStream and setString methods of * the Clob interface may be used to add data to the Clob. * @return An object that implements the Clob interface * @throws SQLException if an object that implements the * Clob interface can not be constructed, this method is * called on a closed connection or a database access error occurs. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this data type * * @since JDK 1.6, HSQLDB 2.0 */ public Clob createClob() throws SQLException { checkClosed(); return new JDBCClob(); } /** * Constructs an object that implements the Blob interface. The object * returned initially contains no data. The setBinaryStream and * setBytes methods of the Blob interface may be used to add data to * the Blob. * @return An object that implements the Blob interface * @throws SQLException if an object that implements the * Blob interface can not be constructed, this method is * called on a closed connection or a database access error occurs. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this data type * * @since JDK 1.6, HSQLDB 2.0 */ public Blob createBlob() throws SQLException { checkClosed(); return new JDBCBlob(); } /** * Constructs an object that implements the NClob interface. The object * returned initially contains no data. The setAsciiStream, * setCharacterStream and setString methods of the NClob interface may * be used to add data to the NClob. * @return An object that implements the NClob interface * @throws SQLException if an object that implements the * NClob interface can not be constructed, this method is * called on a closed connection or a database access error occurs. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this data type * * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public NClob createNClob() throws SQLException { checkClosed(); return new JDBCNClob(); } //#endif JAVA6 /** * Constructs an object that implements the SQLXML interface. The object * returned initially contains no data. The createXmlStreamWriter object and * setString method of the SQLXML interface may be used to add data to the SQLXML * object. * @return An object that implements the SQLXML interface * @throws SQLException if an object that implements the SQLXML interface can not * be constructed, this method is * called on a closed connection or a database access error occurs. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this data type * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public SQLXML createSQLXML() throws SQLException { checkClosed(); return new JDBCSQLXML(); } //#endif JAVA6 /** @todo: ThreadPool? HsqlTimer with callback? */ /** * * * Returns true if the connection has not been closed and is still valid. * The driver shall submit a query on the connection or use some other * mechanism that positively verifies the connection is still valid when * this method is called. *

* The query submitted by the driver to validate the connection shall be * executed in the context of the current transaction. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB uses a maximum timeout of 60 seconds if timeout has be specified * as zero. * *

* * @param timeout - The time in seconds to wait for the database operation * used to validate the connection to complete. If * the timeout period expires before the operation * completes, this method returns false. A value of * 0 indicates a timeout is not applied to the * database operation. *

* @return true if the connection is valid, false otherwise * @exception SQLException if the value supplied for timeout * is less then 0 * @since JDK 1.6, HSQLDB 2.0 *

* @see JDBCDatabaseMetaData#getClientInfoProperties */ //#ifdef JAVA6 public boolean isValid(int timeout) throws SQLException { if (timeout < 0) { throw Util.outOfRangeArgument("timeout: " + timeout); } if (this.isInternal) { return true; } else if (!this.isNetConn) { return !this.isClosed(); } else if (this.isClosed()) { return false; } final boolean[] flag = new boolean[] { true }; Thread t = new Thread() { public void run() { try { getMetaData().getDatabaseMajorVersion(); } catch (Throwable e) { flag[0] = false; } } }; if (timeout > 60) { timeout = 60; } // Remember: parm is in *seconds* timeout *= 1000; try { t.start(); final long start = System.currentTimeMillis(); t.join(timeout); try { t.setContextClassLoader(null); } catch (Throwable th) { } if (timeout == 0) { return flag[0]; } return flag[0] && (System.currentTimeMillis() - start) < timeout; } catch (Throwable e) { return false; } } //#endif JAVA6 /** @todo 20051207 */ /** * Sets the value of the client info property specified by name to the * value specified by value. *

* Applications may use the DatabaseMetaData.getClientInfoProperties * method to determine the client info properties supported by the driver * and the maximum length that may be specified for each property. *

* The driver stores the value specified in a suitable location in the * database. For example in a special register, session parameter, or * system table column. For efficiency the driver may defer setting the * value in the database until the next time a statement is executed or * prepared. Other than storing the client information in the appropriate * place in the database, these methods shall not alter the behavior of * the connection in anyway. The values supplied to these methods are * used for accounting, diagnostics and debugging purposes only. *

* The driver shall generate a warning if the client info name specified * is not recognized by the driver. *

* If the value specified to this method is greater than the maximum * length for the property the driver may either truncate the value and * generate a warning or generate a SQLClientInfoException. If the driver * generates a SQLClientInfoException, the value specified was not set on the * connection. *

* The following are standard client info properties. Drivers are not * required to support these properties however if the driver supports a * client info property that can be described by one of the standard * properties, the standard property name should be used. *

*

    *
  • ApplicationName - The name of the application currently utilizing * the connection
  • *
  • ClientUser - The name of the user that the application using * the connection is performing work for. This may * not be the same as the user name that was used * in establishing the connection.
  • *
  • ClientHostname - The host name of the computer the application * using the connection is running on.
  • *
*

* *

*

HSQLDB-Specific Information:

* * HSQLDB 2.0, throws an SQLClientInfoException when this method is * called. *

* * * @param name The name of the client info property to set * @param value The value to set the client info property to. If the * value is null, the current value of the specified * property is cleared. *

* @throws SQLClientInfoException if the database server returns an error while * setting the client info value on the database server or this method * is called on a closed connection *

* @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void setClientInfo(String name, String value) throws SQLClientInfoException { SQLClientInfoException ex = new SQLClientInfoException(); ex.initCause(Util.notSupported()); throw ex; } //#endif JAVA6 /** @todo 20051207 */ /** * Sets the value of the connection's client info properties. The * Properties object contains the names and values of the client info * properties to be set. The set of client info properties contained in * the properties list replaces the current set of client info properties * on the connection. If a property that is currently set on the * connection is not present in the properties list, that property is * cleared. Specifying an empty properties list will clear all of the * properties on the connection. See setClientInfo (String, String) for * more information. *

* If an error occurs in setting any of the client info properties, a * SQLClientInfoException is thrown. The SQLClientInfoException * contains information indicating which client info properties were not set. * The state of the client information is unknown because * some databases do not allow multiple client info properties to be set * atomically. For those databases, one or more properties may have been * set before the error occurred. *

* * @param properties the list of client info properties to set *

* @see java.sql.Connection#setClientInfo(String, String) setClientInfo(String, String) * @since JDK 1.6, HSQLDB 2.0 *

* @throws SQLClientInfoException if the database server returns an error while * setting the clientInfo values on the database server or this method * is called on a closed connection *

*/ //#ifdef JAVA6 public void setClientInfo( Properties properties) throws SQLClientInfoException { if (!this.isClosed && (properties == null || properties.isEmpty())) { return; } SQLClientInfoException ex = new SQLClientInfoException(); if (this.isClosed) { ex.initCause(Util.connectionClosedException()); } else { ex.initCause(Util.notSupported()); } throw ex; } //#endif JAVA6 /** @todo 1.9.0 */ /** * Returns the value of the client info property specified by name. This * method may return null if the specified client info property has not * been set and does not have a default value. This method will also * return null if the specified client info property name is not supported * by the driver. *

* Applications may use the DatabaseMetaData.getClientInfoProperties * method to determine the client info properties supported by the driver. *

* @param name The name of the client info property to retrieve *

* @return The value of the client info property specified *

* @throws SQLException if the database server returns an error when * fetching the client info value from the database * or this method is called on a closed connection *

* @since JDK 1.6, HSQLDB 2.0 *

* @see java.sql.DatabaseMetaData#getClientInfoProperties */ //#ifdef JAVA6 public String getClientInfo(String name) throws SQLException { checkClosed(); return null; } //#endif JAVA6 /** @todo - 1.9 */ /** * Returns a list containing the name and current value of each client info * property supported by the driver. The value of a client info property * may be null if the property has not been set and does not have a * default value. *

* @return A Properties object that contains the name and current value of * each of the client info properties supported by the driver. *

* @throws SQLException if the database server returns an error when * fetching the client info values from the database * or this method is called on a closed connection *

* @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public Properties getClientInfo() throws SQLException { checkClosed(); return null; } //#endif JAVA6 // --------------------------- Added: Mustang Build 80 ------------------------- /** * Factory method for creating Array objects. *

* Note: When createArrayOf is used to create an array object * that maps to a primitive data type, then it is implementation-defined * whether the Array object is an array of that primitive * data type or an array of Object. *

* Note: The JDBC driver is responsible for mapping the elements * Object array to the default JDBC SQL type defined in * java.sql.Types for the given class of Object. The default * mapping is specified in Appendix B of the JDBC specification. If the * resulting JDBC type is not the appropriate type for the given typeName then * it is implementation defined whether an SQLException is * thrown or the driver supports the resulting conversion. * * @param typeName the SQL name of the type the elements of the array map to. The typeName is a * database-specific name which may be the name of a built-in type, a user-defined type or a standard SQL type supported by this database. This * is the value returned by Array.getBaseTypeName * @param elements the elements that populate the returned object * @return an Array object whose elements map to the specified SQL type * @throws SQLException if a database error occurs, the JDBC type is not * appropriate for the typeName and the conversion is not supported, the typeName is null or this method is called on a closed connection * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this data type * @since 1.6 */ //#ifdef JAVA6 public Array createArrayOf(String typeName, Object[] elements) throws SQLException { checkClosed(); if (typeName == null) { throw Util.nullArgument(); } typeName = typeName.toUpperCase(); int typeCode = Type.getTypeNr(typeName); if (typeCode < 0) { throw Util.invalidArgument(typeName); } Type type = Type.getDefaultType(typeCode); if (type.isArrayType() || type.isLobType() || type.isRowType()) { throw Util.invalidArgument(typeName); } Object[] newData = new Object[elements.length]; try { for (int i = 0; i < elements.length; i++) { Object o = type.convertJavaToSQL(sessionProxy, elements[i]); newData[i] = type.convertToTypeLimits(sessionProxy, o); } } catch (HsqlException e) { throw Util.sqlException(e); } return new JDBCArray(newData, type, this); } //#endif JAVA6 /** * Factory method for creating Struct objects. * @param typeName the SQL type name of the SQL structured type that this Struct * object maps to. The typeName is the name of a user-defined type that * has been defined for this database. It is the value returned by * Struct.getSQLTypeName. * @param attributes the attributes that populate the returned object * @return a Struct object that maps to the given SQL type and is populated with the given attributes * @throws SQLException if a database error occurs, the typeName is null or this method is called on a closed connection * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this data type * @since JDK 1.6_b80, HSQLDB 2.0 */ //#ifdef JAVA6 public Struct createStruct(String typeName, Object[] attributes) throws SQLException { checkClosed(); throw Util.notSupported(); } //#endif JAVA6 // ------------------- java.sql.Wrapper implementation --------------------- /** * Returns an object that implements the given interface to allow access to * non-standard methods, or standard methods not exposed by the proxy. * * If the receiver implements the interface then the result is the receiver * or a proxy for the receiver. If the receiver is a wrapper * and the wrapped object implements the interface then the result is the * wrapped object or a proxy for the wrapped object. Otherwise return the * the result of calling unwrap recursively on the wrapped object * or a proxy for that result. If the receiver is not a * wrapper and does not implement the interface, then an SQLException is thrown. * * @param by which the return type is inferred from input parameter. * @param iface A Class defining an interface that the result must implement. * @return an object that implements the interface. May be a proxy for the actual implementing object. * @throws java.sql.SQLException If no object found that implements the interface * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 @SuppressWarnings("unchecked") public T unwrap(java.lang.Class iface) throws java.sql.SQLException { checkClosed(); if (isWrapperFor(iface)) { return (T) this; } throw Util.invalidArgument("iface: " + iface); } //#endif JAVA6 /** * Returns true if this either implements the interface argument or is directly or indirectly a wrapper * for an object that does. Returns false otherwise. If this implements the interface then return true, * else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped * object. If this does not implement the interface and is not a wrapper, return false. * This method should be implemented as a low-cost operation compared to unwrap so that * callers can use this method to avoid expensive unwrap calls that may fail. If this method * returns true then calling unwrap with the same argument should succeed. * * @param iface a Class defining an interface. * @return true if this implements the interface or directly or indirectly wraps an object that does. * @throws java.sql.SQLException if an error occurs while determining whether this is a wrapper * for an object with the given interface. * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public boolean isWrapperFor( java.lang.Class iface) throws java.sql.SQLException { checkClosed(); return (iface != null && iface.isAssignableFrom(this.getClass())); } //#endif JAVA6 //--------------------------JDBC 4.1 ----------------------------- /** * Sets the given schema name to access. *

* If the driver does not support schemas, it will * silently ignore this request. *

* Calling {@code setSchema} has no effect on previously created or prepared * {@code Statement} objects. It is implementation defined whether a DBMS * prepare operation takes place immediately when the {@code Connection} * method {@code prepareStatement} or {@code prepareCall} is invoked. * For maximum portability, {@code setSchema} should be called before a * {@code Statement} is created or prepared. * * @param schema the name of a schema in which to work * @exception SQLException if a database access error occurs * or this method is called on a closed connection * @see #getSchema * @since JDK 1.7, HSQLDB 2.0.1 */ public void setSchema(String schema) throws SQLException { checkClosed(); if (schema == null) { Util.nullArgument("schema"); } else if (schema.length() == 0) { Util.invalidArgument("Zero-length schema"); } else { (new JDBCDatabaseMetaData(this)).setConnectionDefaultSchema( schema); } } /** * Retrieves this Connection object's current schema name. * * @return the current schema name or null if there is none * @exception SQLException if a database access error occurs * or this method is called on a closed connection * @see #setSchema * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ public String getSchema() throws SQLException { checkClosed(); return (new JDBCDatabaseMetaData(this)).getConnectionDefaultSchema(); } /** * Terminates an open connection. Calling abort results in: *

    *
  • The connection marked as closed *
  • Closes any physical connection to the database *
  • Releases resources used by the connection *
  • Insures that any thread that is currently accessing the connection * will either progress to completion or throw an SQLException. *
*

* Calling abort marks the connection closed and releases any * resources. Calling abort on a closed connection is a * no-op. *

* It is possible that the aborting and releasing of the resources that are * held by the connection can take an extended period of time. When the * abort method returns, the connection will have been marked as * closed and the Executor that was passed as a parameter to abort * may still be executing tasks to release resources. *

* This method checks to see that there is an SQLPermission * object before allowing the method to proceed. If a * SecurityManager exists and its * checkPermission method denies calling abort, * this method throws a * java.lang.SecurityException. * @param executor The Executor implementation which will * be used by abort. * @throws java.sql.SQLException if a database access error occurs or * the {@code executor} is {@code null}, * @throws java.lang.SecurityException if a security manager exists and its * checkPermission method denies calling abort * @see SecurityManager#checkPermission * @see java.util.concurrent.Executor * @since JDK 1.7, HSQLDB 2.0.1 */ //#ifdef JAVA5 public void abort( java.util.concurrent.Executor executor) throws SQLException { if (executor == null) { throw Util.nullArgument("executor"); } close(); } //#endif /** * * Sets the maximum period a Connection or * objects created from the Connection * will wait for the database to reply to any one request. If any * request remains unanswered, the waiting method will * return with a SQLException, and the Connection * or objects created from the Connection will be marked as * closed. Any subsequent use of * the objects, with the exception of the close, * isClosed or Connection.isValid * methods, will result in a SQLException. *

* Note: This method is intended to address a rare but serious * condition where network partitions can cause threads issuing JDBC calls * to hang uninterruptedly in socket reads, until the OS TCP-TIMEOUT * (typically 10 minutes). This method is related to the * {@link #abort abort() } method which provides an administrator * thread a means to free any such threads in cases where the * JDBC connection is accessible to the administrator thread. * The setNetworkTimeout method will cover cases where * there is no administrator thread, or it has no access to the * connection. This method is severe in it's effects, and should be * given a high enough value so it is never triggered before any more * normal timeouts, such as transaction timeouts. *

* JDBC driver implementations may also choose to support the * {@code setNetworkTimeout} method to impose a limit on database * response time, in environments where no network is present. *

* Drivers may internally implement some or all of their API calls with * multiple internal driver-database transmissions, and it is left to the * driver implementation to determine whether the limit will be * applied always to the response to the API call, or to any * single request made during the API call. *

* * This method can be invoked more than once, such as to set a limit for an * area of JDBC code, and to reset to the default on exit from this area. * Invocation of this method has no impact on already outstanding * requests. *

* The {@code Statement.setQueryTimeout()} timeout value is independent of the * timeout value specified in {@code setNetworkTimeout}. If the query timeout * expires before the network timeout then the * statement execution will be canceled. If the network is still * active the result will be that both the statement and connection * are still usable. However if the network timeout expires before * the query timeout or if the statement timeout fails due to network * problems, the connection will be marked as closed, any resources held by * the connection will be released and both the connection and * statement will be unusable. *

* When the driver determines that the {@code setNetworkTimeout} timeout * value has expired, the JDBC driver marks the connection * closed and releases any resources held by the connection. *

* * This method checks to see that there is an SQLPermission * object before allowing the method to proceed. If a * SecurityManager exists and its * checkPermission method denies calling * setNetworkTimeout, this method throws a * java.lang.SecurityException. * * @param executor The Executor implementation which will * be used by setNetworkTimeout. * @param milliseconds The time in milliseconds to wait for the database * operation * to complete. If the JDBC driver does not support milliseconds, the * JDBC driver will round the value up to the nearest second. If the * timeout period expires before the operation * completes, a SQLException will be thrown. * A value of 0 indicates that there is not timeout for database operations. * @throws java.sql.SQLException if a database access error occurs, this * method is called on a closed connection, * the {@code executor} is {@code null}, * or the value specified for seconds is less than 0. * @throws java.lang.SecurityException if a security manager exists and its * checkPermission method denies calling * setNetworkTimeout. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see SecurityManager#checkPermission * @see Statement#setQueryTimeout * @see #getNetworkTimeout * @see #abort * @see java.util.concurrent.Executor * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ //#ifdef JAVA5 public void setNetworkTimeout(java.util.concurrent.Executor executor, int milliseconds) throws SQLException { checkClosed(); throw Util.notSupported(); } //#endif /** * Retrieves the number of milliseconds the driver will * wait for a database request to complete. * If the limit is exceeded, a * SQLException is thrown. * * @return the current timeout limit in milliseconds; zero means there is * no limit * @throws SQLException if a database access error occurs or * this method is called on a closed Connection * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setNetworkTimeout * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ public int getNetworkTimeout() throws SQLException { return 0; } //---------------------- internal implementation --------------------------- // -------------------------- Common Attributes ------------------------------ /** Initial holdability */ int rsHoldability = JDBCResultSet.HOLD_CURSORS_OVER_COMMIT; /** Properties for the connection */ HsqlProperties connProperties; /** Properties for the session */ HsqlProperties clientProperties; /** * This connection's interface to the corresponding Session * object in the database engine. */ SessionInterface sessionProxy; /** * Is this an internal connection? */ boolean isInternal; /** Is this connection to a network server instance. */ protected boolean isNetConn; /** * Is this connection closed? */ boolean isClosed; /** The first warning in the chain. Null if there are no warnings. */ private SQLWarning rootWarning; /** Synchronizes concurrent modification of the warning chain */ private final Object rootWarning_mutex = new Object(); /** ID sequence for unnamed savepoints */ private int savepointIDSequence; /** reuse count in ConnectionPool */ int incarnation; boolean isPooled; JDBCConnectionEventListener poolEventListener; /** * Constructs a new external Connection to an HSQLDB * Database.

* * This constructor is called on behalf of the * java.sql.DriverManager when getting a * Connection for use in normal (external) * client code.

* * Internal client code, that being code located in HSQLDB SQL * functions and stored procedures, receives an INTERNAL * connection constructed by the {@link * #JDBCConnection(org.hsqldb.SessionInterface) * JDBCConnection(SessionInterface)} constructor.

* * @param props A Properties object containing the connection * properties * @exception SQLException when the user/password combination is * invalid, the connection url is invalid, or the * Database is unavailable.

* * The Database may be unavailable for a number * of reasons, including network problems or the fact that it * may already be in use by another process. */ public JDBCConnection(HsqlProperties props) throws SQLException { String user = props.getProperty("user"); String password = props.getProperty("password"); String connType = props.getProperty("connection_type"); String host = props.getProperty("host"); int port = props.getIntegerProperty("port", 0); String path = props.getProperty("path"); String database = props.getProperty("database"); boolean isTLS = (connType == DatabaseURL.S_HSQLS || connType == DatabaseURL.S_HTTPS); if (user == null) { user = "SA"; } if (password == null) { password = ""; } Calendar cal = Calendar.getInstance(); int zoneSeconds = HsqlDateTime.getZoneSeconds(cal); try { if (DatabaseURL.isInProcessDatabaseType(connType)) { /** * @todo - fredt - this should be the only static reference to * a core class (apart form references to the Type package) * from the jdbc package - we might make it dynamic */ sessionProxy = DatabaseManager.newSession(connType, database, user, password, props, null, zoneSeconds); } else if (connType == DatabaseURL.S_HSQL || connType == DatabaseURL.S_HSQLS) { sessionProxy = new ClientConnection(host, port, path, database, isTLS, user, password, zoneSeconds); isNetConn = true; } else if (connType == DatabaseURL.S_HTTP || connType == DatabaseURL.S_HTTPS) { sessionProxy = new ClientConnectionHTTP(host, port, path, database, isTLS, user, password, zoneSeconds); isNetConn = true; } else { // alias: type not yet implemented throw Util.invalidArgument(connType); } sessionProxy.setJDBCConnection(this); connProperties = props; clientProperties = sessionProxy.getClientProperties(); } catch (HsqlException e) { throw Util.sqlException(e); } } /** * Constructs an INTERNAL Connection, * using the specified {@link org.hsqldb.SessionInterface * SessionInterface}.

* * This constructor is called only on behalf of an existing * Session (the internal parallel of a * Connection), to be used as a parameter to a SQL * function or stored procedure that needs to execute in the context * of that Session.

* * When a Java SQL function or stored procedure is called and its * first parameter is of type Connection, HSQLDB * automatically notices this and constructs an INTERNAL * Connection using the current Session. * HSQLDB then passes this Connection in the first * parameter position, moving any other parameter values * specified in the SQL statement to the right by one position. *

* * To read more about this, see * {@link org.hsqldb.Routine Routine}.

* * Notes:

* * Starting with HSQLDB 1.7.2, INTERNAL connections are not * closed by a call to close() or by a SQL DISCONNECT. * * For HSQLDB developers not involved with writing database * internals, this change only applies to connections obtained * automatically from the database as the first parameter to * Java stored procedures and functions. This is mainly an issue * to developers writing custom SQL function and stored procedure * libraries for HSQLDB. Presently, it is recommended that SQL function and * stored procedure code avoid depending on closing or issuing a * DISCONNECT on a connection obtained in this manner.

* * @param c the Session requesting the construction of this * Connection * @exception HsqlException never (reserved for future use); * @see org.hsqldb.Routine */ public JDBCConnection(SessionInterface c) { // PRE: SessionInterface is non-null isInternal = true; sessionProxy = c; } /** * Constructor for use with connection pooling and XA. */ public JDBCConnection(JDBCConnection c, JDBCConnectionEventListener eventListener) { sessionProxy = c.sessionProxy; connProperties = c.connProperties; clientProperties = c.clientProperties; isPooled = true; poolEventListener = eventListener; } /** * The default implementation simply attempts to silently {@link * #close() close()} this Connection */ protected void finalize() { try { close(); } catch (SQLException e) { } } synchronized int getSavepointID() { return savepointIDSequence++; } /** * Retrieves this connection's JDBC url. * * This method is in support of the JDBCDatabaseMetaData.getURL() method. * @return the database connection url with which this object was * constructed * @throws SQLException if this connection is closed */ synchronized String getURL() throws SQLException { checkClosed(); return isInternal ? sessionProxy.getInternalConnectionURL() : connProperties.getProperty("url"); } /** * An internal check for closed connections.

* * @throws SQLException when the connection is closed */ synchronized void checkClosed() throws SQLException { if (isClosed) { throw Util.connectionClosedException(); } } /** * Adds another SQLWarning to this Connection object's warning chain. * * @param w the SQLWarning to add to the chain */ void addWarning(SQLWarning w) { // PRE: w is never null synchronized (rootWarning_mutex) { if (rootWarning == null) { rootWarning = w; } else { rootWarning.setNextWarning(w); } } } /** * Sets the warning chain */ void setWarnings(SQLWarning w) { synchronized (rootWarning_mutex) { rootWarning = w; } } /** * Resets this connection so it can be used again. Used when connections are * returned to a connection pool. * * @throws SQLException if a database access error occurs */ public void reset() throws SQLException { try { incarnation++; this.sessionProxy.resetSession(); } catch (HsqlException e) { throw Util.sqlException(ErrorCode.X_08006, e.getMessage(), e); } } /** * Completely closes a pooled connection */ public void closeFully() { try { close(); } catch (Throwable t) { // } try { if (sessionProxy != null) { sessionProxy.close(); sessionProxy = null; } } catch (Throwable t) { // } } /** * provides cross-package access to the proprietary (i.e. non-JDBC) * HSQLDB session interface.

* * @return the underlying sessionProxy for this connection */ public SessionInterface getSession() { return sessionProxy; } /** * is called from within nativeSQL when the start of an JDBC escape sequence is encountered */ private int onStartEscapeSequence(String sql, StringBuffer sb, int i) throws SQLException { sb.append(' '); i++; i = StringUtil.skipSpaces(sql, i); if (sql.regionMatches(true, i, "fn ", 0, 3) || sql.regionMatches(true, i, "oj ", 0, 3)) { i += 2; } else if (sql.regionMatches(true, i, "ts ", 0, 3)) { sb.append(Tokens.T_TIMESTAMP); i += 2; } else if (sql.regionMatches(true, i, "d ", 0, 2)) { sb.append(Tokens.T_DATE); i++; } else if (sql.regionMatches(true, i, "t ", 0, 2)) { sb.append(Tokens.T_TIME); i++; } else if (sql.regionMatches(true, i, "call ", 0, 5)) { sb.append(Tokens.T_CALL); i += 4; } else if (sql.regionMatches(true, i, "?= call ", 0, 8)) { sb.append(Tokens.T_CALL); i += 7; } else if (sql.regionMatches(true, i, "? = call ", 0, 8)) { sb.append(Tokens.T_CALL); i += 8; } else if (sql.regionMatches(true, i, "escape ", 0, 7)) { i += 6; } else { i--; throw Util.sqlException( Error.error( ErrorCode.JDBC_CONNECTION_NATIVE_SQL, sql.substring(i))); } return i; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCRowId.java0000644000175000017500000002140012007547356022160 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.StringConverter; import java.io.IOException; import java.sql.RowId; import java.sql.SQLException; import java.util.Arrays; /* $Id: JDBCRowId.java 4319 2011-06-10 12:44:08Z fredt $ */ //boucherb@users 20060522 - doc 1.8.1 full synch up to Mustang Build 84 /** * * The representation (mapping) in the Java programming language of an SQL ROWID * value. An SQL ROWID is a built-in type, a value of which can be thought of as * an address for its identified row in a database table. Whether that address * is logical or, in any respects, physical is determined by its originating data * source. *

* Methods in the interfaces ResultSet, CallableStatement, * and PreparedStatement, such as getRowId and setRowId * allow a programmer to access a SQL ROWID value. The RowId * interface provides a method * for representing the value of the ROWID as a byte array or as a * String. *

* The method getRowIdLifetime in the interface DatabaseMetaData, * can be used * to determine if a RowId object remains valid for the duration of the transaction in * which the RowId was created, the duration of the session in which * the RowId was created, * or, effectively, for as long as its identified row is not deleted. In addition * to specifying the duration of its valid lifetime outside its originating data * source, getRowIdLifetime specifies the duration of a ROWID * value's valid lifetime * within its originating data source. In this, it differs from a large object, * because there is no limit on the valid lifetime of a large object within its * originating data source. *

* All methods on the RowId interface must be fully implemented if the * JDBC driver supports the data type. * * @see java.sql.DatabaseMetaData * @since JDK 1.6, HSQLDB 2.0 * @author boucherb@users */ public final class JDBCRowId implements RowId { private int hash; // ------------------------- Internal Implementation ----------------------- private final byte[] id; /** * Constructs a new JDBCRowId instance wrapping the given octet sequence.

* * This constructor may be used internally to retrieve result set values as * RowId objects, yet it also may need to be public to allow access from * other packages. As such (in the interest of efficiency) this object * maintains a reference to the given octet sequence rather than making a * copy; special care should be taken by extenal clients never to use this * constructor with a byte array object that may later be modified * extenally. * * @param id the octet sequence representing the Rowid value * @throws SQLException if the argument is null */ public JDBCRowId(final byte[] id) throws SQLException { if (id == null) { throw Util.nullArgument("id"); } this.id = id; } /** * Constructs a new JDBCRowId instance whose internal octet sequence is * is a copy of the octet sequence of the given RowId object.

* * @param id the octet sequence representing the Rowid value * @throws SQLException if the argument is null */ public JDBCRowId(RowId id) throws SQLException { this(id.getBytes()); } /** * Constructs a new JDBCRowId instance whose internal octet sequence is * is that represented by the given hexidecimal character sequence.

* @param hex the hexadecimal character sequence from which to derive * the internal octet sequence * @throws java.sql.SQLException if the argument is null or is not a valid * hexadecimal character sequence */ public JDBCRowId(final String hex) throws SQLException { if (hex == null) { throw Util.nullArgument("hex"); } try { this.id = StringConverter.hexStringToByteArray(hex); } catch (IOException e) { throw Util.sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "hex: " + e); // .illegalHexadecimalCharacterSequenceArgumentException("hex", e); } } /** * Compares this RowId to the specified object. The result is * true if and only if the argument is not null and is a RowId * object that represents the same ROWID as this object. *

* It is important * to consider both the origin and the valid lifetime of a RowId * when comparing it to another RowId. If both are valid, and * both are from the same table on the same data source, then if they are equal * they identify * the same row; if one or more is no longer guaranteed to be valid, or if * they originate from different data sources, or different tables on the * same data source, they may be equal but still * not identify the same row. * * @param obj the Object to compare this RowId object * against. * @return true if the RowIds are equal; false otherwise * @since JDK 1.6, HSQLDB 2.0 */ public boolean equals(Object obj) { return (obj instanceof JDBCRowId) && Arrays.equals(this.id, ((JDBCRowId) obj).id); } /** * Returns an array of bytes representing the value of the SQL ROWID * designated by this java.sql.RowId object. * * @return an array of bytes, whose length is determined by the driver supplying * the connection, representing the value of the ROWID designated by this * java.sql.RowId object. */ public byte[] getBytes() { return id.clone(); } /** * Returns a String representing the value of the SQL ROWID designated by this * java.sql.RowId object. *

* Like java.sql.Date.toString() * returns the contents of its DATE as the String "2004-03-17" * rather than as DATE literal in SQL (which would have been the String * DATE "2004-03-17"), toString() * returns the contents of its ROWID in a form specific to the driver supplying * the connection, and possibly not as a ROWID literal. * * @return a String whose format is determined by the driver supplying the * connection, representing the value of the ROWID designated * by this java.sql.RowId object. */ public String toString() { return StringConverter.byteArrayToHexString(id); } /** * Returns a hash code value of this RowId object. * * @return a hash code for the RowId */ public int hashCode() { if (hash == 0) { hash = Arrays.hashCode(id); } return hash; } /** * Direct access to id bytes for subclassing. * * @return direct reference to id bytes. */ Object id() { return id; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCClob.java0000644000175000017500000011343212007547356022022 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.sql.Clob; import java.sql.SQLException; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.KMPSearchAlgorithm; import org.hsqldb.lib.java.JavaSystem; /* $Id: JDBCClob.java 4167 2011-03-29 21:41:14Z fredt $ */ // boucherb@users 2004-03/04-xx - doc 1.7.2 - javadocs updated; methods put in // correct (historical, interface // declared) order // boucherb@users 2004-03/04-xx - patch 1.7.2 - null check for constructor (a // null CLOB value is Java null, // not a Clob object with null // data);moderate thread safety; // simplification; optimization // of operations between jdbcClob // instances // boucherb@users 2005-12-07 - patch 1.8.0.x - initial JDBC 4.0 support work // boucherb@users 2006-05-22 - doc 1.9.0 - full synch up to Mustang Build 84 // - patch 1.9.0 - setAsciiStream & // setCharacterStream improvement // patch 1.9.0 // - full synch up to Mustang b90 // - better bounds checking /** * The mapping in the JavaTM programming language * for the SQL CLOB type. * An SQL CLOB is a built-in type * that stores a Character Large Object as a column value in a row of * a database table. * By default drivers implement a Clob object using an SQL * locator(CLOB), which means that a Clob object * contains a logical pointer to the SQL CLOB data rather than * the data itself. A Clob object is valid for the duration * of the transaction in which it was created. *

The Clob interface provides methods for getting the * length of an SQL CLOB (Character Large Object) value, * for materializing a CLOB value on the client, and for * searching for a substring or CLOB object within a * CLOB value. * Methods in the interfaces {@link java.sql.ResultSet}, * {@link java.sql.CallableStatement}, and {@link java.sql.PreparedStatement}, such as * getClob and setClob allow a programmer to * access an SQL CLOB value. In addition, this interface * has methods for updating a CLOB value. *

* All methods on the Clob interface must be fully implemented if the * JDBC driver supports the data type. * * *

*

HSQLDB-Specific Information:

* * Previous to 2.0, the HSQLDB driver did not implement Clob using an SQL * locator(CLOB). That is, an HSQLDB Clob object did not contain a logical * pointer to SQL CLOB data; rather it directly contained a representation of * the data (a String). As a result, an HSQLDB Clob object was itself * valid beyond the duration of the transaction in which is was created, * although it did not necessarily represent a corresponding value * on the database. Also, the interface methods for updating a CLOB value * were unsupported, with the exception of the truncate method, * in that it could be used to truncate the local value.

* * Starting with 2.0, the HSQLDB driver fully supports both local and remote * SQL CLOB data implementations, meaning that an HSQLDB Clob object may * contain a logical pointer to remote SQL CLOB data (see {@link JDBCClobClient * JDBCClobClient}) or it may directly contain a local representation of the * data (as implemented in this class). In particular, when the product is built * under JDK 1.6+ and the Clob instance is constructed as a result of calling * JDBCConnection.createClob(), then the resulting Clob instance is initially * disconnected (is not bound to the transaction scope of the vending Connection * object), the data is contained directly and all interface methods for * updating the CLOB value are supported for local use until the first * invocation of free(); otherwise, an HSQLDB Clob's implementation is * determined at runtime by the driver, it is typically not valid beyond * the duration of the transaction in which is was created, and there no * standard way to query whether it represents a local or remote value.

* *

* * * @author boucherb@users * @version 2.0 * @since JDK 1.2, HSQLDB 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 */ public class JDBCClob implements Clob { /** * Retrieves the number of characters * in the CLOB value * designated by this Clob object. * * @return length of the CLOB in characters * @exception SQLException if there is an error accessing the * length of the CLOB value * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2, HSQLDB 1.7.2 */ public long length() throws SQLException { return getData().length(); } /** * Retrieves a copy of the specified substring * in the CLOB value * designated by this Clob object. * The substring begins at position * pos and has up to length consecutive * characters. * * *
*

HSQLDB-Specific Information:

* * The official specification above is ambiguous in that it does not * precisely indicate the policy to be observed when * pos > this.length() - length. One policy would be to retrieve the * characters from pos to this.length(). Another would be to throw * an exception. HSQLDB observes the second policy.

* * Note

* * Depending java.lang.String implementation, the returned value * may be sharing the underlying (and possibly much larger) character * buffer. This facilitates much faster operation and will save memory * if many transient substrings are to be retrieved during processing, but * it has memory management implications should retrieved substrings be * required to survive for any non-trivial duration. It is left up to the * client to decide how to handle the trade-off (whether to make an isolated * copy of the returned substring or risk that more memory remains allocated * than is absolutely required). *

* * * @param pos the first character of the substring to be extracted. * The first character is at position 1. * @param length the number of consecutive characters to be copied; * JDBC 4.1[ the value for length must be 0 or greater] * @return a String that is the specified substring in * the CLOB value designated by this Clob object * @exception SQLException if there is an error accessing the * CLOB value; if pos is less than 1 JDBC 4.1[or length is * less than 0] * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2, HSQLDB 1.7.2 */ public String getSubString(long pos, final int length) throws SQLException { final String data = getData(); final int dlen = data.length(); if (pos < MIN_POS || pos > dlen) { Util.outOfRangeArgument("pos: " + pos); } pos--; if (length < 0 || length > dlen - pos) { throw Util.outOfRangeArgument("length: " + length); } return (pos == 0 && length == dlen) ? data : data.substring((int) pos, (int) pos + length); } /** * Retrieves the CLOB value designated by this Clob * object as a java.io.Reader object (or as a stream of * characters). * * @return a java.io.Reader object containing the * CLOB data * @exception SQLException if there is an error accessing the * CLOB value * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setCharacterStream * @since JDK 1.2, HSQLDB 1.7.2 */ public java.io.Reader getCharacterStream() throws SQLException { return new StringReader(getData()); } /** * Retrieves the CLOB value designated by this Clob * object as an ASCII stream. * * @return a java.io.InputStream object containing the * CLOB data * @exception SQLException if there is an error accessing the * CLOB value * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setAsciiStream * @since JDK 1.2, HSQLDB 1.7.2 */ public java.io.InputStream getAsciiStream() throws SQLException { try { return new ByteArrayInputStream(getData().getBytes("US-ASCII")); } catch (IOException e) { return null; } } /** * Retrieves the character position at which the specified substring * searchstr appears in the SQL CLOB value * represented by this Clob object. The search * begins at position start. * * @param searchstr the substring for which to search * @param start the position at which to begin searching; the first position * is 1 * @return the position at which the substring appears or -1 if it is not * present; the first position is 1 * @exception SQLException if there is an error accessing the * CLOB value or if start is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2, HSQLDB 1.7.2 */ public long position(final String searchstr, long start) throws SQLException { final String data = getData(); if (start < MIN_POS) { throw Util.outOfRangeArgument("start: " + start); } if (searchstr == null || start > MAX_POS) { return -1; } final int position = KMPSearchAlgorithm.search(data, searchstr, null, (int) start); return (position == -1) ? -1 : position + 1; } /** * Retrieves the character position at which the specified * Clob object searchstr appears in this * Clob object. The search begins at position * start. * * @param searchstr the Clob object for which to search * @param start the position at which to begin searching; the first * position is 1 * @return the position at which the Clob object appears * or -1 if it is not present; the first position is 1 * @exception SQLException if there is an error accessing the * CLOB value or if start is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2, HSQLDB 1.7.2 */ public long position(final Clob searchstr, long start) throws SQLException { final String data = getData(); if (start < MIN_POS) { throw Util.outOfRangeArgument("start: " + start); } if (searchstr == null) { return -1; } final long dlen = data.length(); final long sslen = searchstr.length(); start--; // This is potentially much less expensive than materializing a large // substring from some other vendor's CLOB. Indeed, we should probably // do the comparison piecewise, using an in-memory buffer (or temp-files // when available), if it is detected that the input CLOB is very long. if (start > dlen - sslen) { return -1; } // by now, we know sslen and start are both < Integer.MAX_VALUE String pattern; if (searchstr instanceof JDBCClob) { pattern = ((JDBCClob) searchstr).data(); } else { pattern = searchstr.getSubString(1L, (int) sslen); } final int position = KMPSearchAlgorithm.search(data, pattern, null, (int) start); return (position == -1) ? -1 : position + 1; } //---------------------------- jdbc 3.0 ----------------------------------- /** * Writes the given Java String to the CLOB * value that this Clob object designates at the position * pos. The string will overwrite the existing characters * in the Clob object starting at the position * pos. If the end of the Clob value is reached * while writing the given string, then the length of the Clob * value will be increased to accommodate the extra characters. *

* Note: If the value specified for pos * is greater then the length+1 of the CLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 2.0 this feature is supported.

* * When built under JDK 1.6+ and the Clob instance is constructed as a * result of calling JDBCConnection.createClob(), this operation affects * only the client-side value; it has no effect upon a value stored in the * database because JDBCConnection.createClob() constructs disconnected, * initially empty Clob instances. To propagate the Clob value to a database * in this case, it is required to supply the Clob instance to an updating * or inserting setXXX method of a Prepared or Callable Statement, or to * supply the Clob instance to an updateXXX method of an updateable * ResultSet.

* * Implementation Notes:

* * No attempt is made to ensure precise thread safety. Instead, volatile * member field and local variable snapshot isolation semantics are * implemented. This is expected to eliminate most issues related * to race conditions, with the possible exception of concurrent * invocation of free().

* * In general, however, if an application may perform concurrent * JDBCClob modifications and the integrity of the application depends on * total order Clob modification semantics, then such operations * should be synchronized on an appropriate monitor.

* *

* * * @param pos the position at which to start writing to the CLOB * value that this Clob object represents; * The first position is 1 * @param str the string to be written to the CLOB * value that this Clob designates * @return the number of characters written * @exception SQLException if there is an error accessing the * CLOB value or if pos is less than 1 * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 */ public int setString(long pos, String str) throws SQLException { if (str == null) { throw Util.nullArgument("str"); } return setString(pos, str, 0, str.length()); } /** * Writes len characters of str, starting * at character offset, to the CLOB value * that this Clob represents. The string will overwrite the existing characters * in the Clob object starting at the position * pos. If the end of the Clob value is reached * while writing the given string, then the length of the Clob * value will be increased to accommodate the extra characters. *

* Note: If the value specified for pos * is greater then the length+1 of the CLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 2.0 this feature is supported.

* * When built under JDK 1.6+ and the Clob instance is constructed as a * result of calling JDBCConnection.createClob(), this operation affects * only the client-side value; it has no effect upon a value stored in a * database because JDBCConnection.createClob() constructs disconnected, * initially empty Clob instances. To propagate the Clob value to a database * in this case, it is required to supply the Clob instance to an updating * or inserting setXXX method of a Prepared or Callable Statement, or to * supply the Clob instance to an updateXXX method of an updateable * ResultSet.

* * Implementation Notes:

* * If the value specified for pos * is greater than the length of the CLOB value, then * the CLOB value is extended in length to accept the * written characters and the undefined region up to pos is * filled with (char)0.

* * No attempt is made to ensure precise thread safety. Instead, volatile * member field and local variable snapshot isolation semantics are * implemented. This is expected to eliminate most issues related * to race conditions, with the possible exception of concurrent * invocation of free().

* * In general, however, if an application may perform concurrent * JDBCClob modifications and the integrity of the application depends on * total order Clob modification semantics, then such operations * should be synchronized on an appropriate monitor.

* *

* * * @param pos the position at which to start writing to this * CLOB object; The first position is 1 * @param str the string to be written to the CLOB * value that this Clob object represents * @param offset the offset into str to start reading * the characters to be written * @param len the number of characters to be written * @return the number of characters written * @exception SQLException if there is an error accessing the * CLOB value or if pos is less than 1 * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 */ public int setString(long pos, String str, int offset, int len) throws SQLException { if (!m_createdByConnection) { /** @todo - better error message */ throw Util.notSupported(); } String data = getData(); if (str == null) { throw Util.nullArgument("str"); } final int strlen = str.length(); if (offset < 0 || offset > strlen) { throw Util.outOfRangeArgument("offset: " + offset); } if (len > strlen - offset) { throw Util.outOfRangeArgument("len: " + len); } if (pos < MIN_POS || pos > 1L + (Integer.MAX_VALUE - len)) { throw Util.outOfRangeArgument("pos: " + pos); } final int dlen = data.length(); final int ipos = (int) (pos - 1); StringBuffer sb; if (ipos > dlen - len) { sb = new StringBuffer(ipos + len); sb.append(data.substring(0, ipos)); data = null; sb.append(str.substring(offset, offset + len)); str = null; } else { sb = new StringBuffer(data); data = null; for (int i = ipos, j = 0; j < len; i++, j++) { sb.setCharAt(i, str.charAt(offset + j)); } str = null; } setData(sb.toString()); return len; } /** * Retrieves a stream to be used to write ASCII characters to the * CLOB value that this Clob object represents, * starting at position pos. Characters written to the stream * will overwrite the existing characters * in the Clob object starting at the position * pos. If the end of the Clob value is reached * while writing characters to the stream, then the length of the Clob * value will be increased to accommodate the extra characters. *

* Note: If the value specified for pos * is greater than the length of the CLOB value, then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 2.0 this feature is supported.

* * When built under JDK 1.6+ and the Clob instance is constructed as a * result of calling JDBCConnection.createClob(), this operation affects * only the client-side value; it has no effect upon a value stored in a * database because JDBCConnection.createClob() constructs disconnected, * initially empty Clob instances. To propagate the Clob value to a database * in this case, it is required to supply the Clob instance to an updating * or inserting setXXX method of a Prepared or Callable Statement, or to * supply the Clob instance to an updateXXX method of an updateable * ResultSet.

* * Implementation Notes:

* * The data written to the stream does not appear in this * Clob until the stream is closed.

* * When the stream is closed, if the value specified for pos * is greater than the length of the CLOB value, then * the CLOB value is extended in length to accept the * written characters and the undefined region up to pos is * filled with (char)0.

* * Also, no attempt is made to ensure precise thread safety. Instead, * volatile member field and local variable snapshot isolation semantics * are implemented. This is expected to eliminate most issues related * to race conditions, with the possible exception of concurrent * invocation of free().

* * In general, however, if an application may perform concurrent * JDBCClob modifications and the integrity of the application depends on * total order Clob modification semantics, then such operations * should be synchronized on an appropriate monitor.

* *

* * * @param pos the position at which to start writing to this * CLOB object; The first position is 1 * @return the stream to which ASCII encoded characters can be written * @exception SQLException if there is an error accessing the * CLOB value or if pos is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getAsciiStream * * @since JDK 1.4, HSQLDB 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 */ public java.io.OutputStream setAsciiStream( final long pos) throws SQLException { if (!m_createdByConnection) { /** @todo - Better error message */ throw Util.notSupported(); } checkClosed(); if (pos < MIN_POS || pos > MAX_POS) { throw Util.outOfRangeArgument("pos: " + pos); } return new java.io.ByteArrayOutputStream() { public synchronized void close() throws java.io.IOException { try { JDBCClob.this.setString(pos, new String(toByteArray(), "US-ASCII")); } catch (SQLException se) { throw JavaSystem.toIOException(se); } finally { super.close(); } } }; } /** * Retrieves a stream to be used to write a stream of Unicode characters * to the CLOB value that this Clob object * represents, at position pos. Characters written to the stream * will overwrite the existing characters * in the Clob object starting at the position * pos. If the end of the Clob value is reached * while writing characters to the stream, then the length of the Clob * value will be increased to accommodate the extra characters. *

* Note: If the value specified for pos * is greater then the length+1 of the CLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 2.0 this feature is supported.

* * When built under JDK 1.6+ and the Clob instance is constructed as a * result of calling JDBCConnection.createClob(), this operation affects * only the client-side value; it has no effect upon a value stored in a * database because JDBCConnection.createClob() constructs disconnected, * initially empty Clob instances. To propagate the Clob value to a database * in this case, it is required to supply the Clob instance to an updating * or inserting setXXX method of a Prepared or Callable Statement, or to * supply the Clob instance to an updateXXX method of an updateable * ResultSet.

* * Implementation Notes:

* * The data written to the stream does not appear in this * Clob until the stream is closed.

* * When the stream is closed, if the value specified for pos * is greater than the length of the CLOB value, then * the CLOB value is extended in length to accept the * written characters and the undefined region up to pos is * filled with (char)0.

* * Also, no attempt is made to ensure precise thread safety. Instead, * volatile member field and local variable snapshot isolation semantics * are implemented. This is expected to eliminate most issues related * to race conditions, with the possible exception of concurrent * invocation of free().

* * In general, however, if an application may perform concurrent * JDBCClob modifications and the integrity of the application depends on * total order Clob modification semantics, then such operations * should be synchronized on an appropriate monitor.

* *

* * * @param pos the position at which to start writing to the * CLOB value; The first position is 1 * * @return a stream to which Unicode encoded characters can be written * @exception SQLException if there is an error accessing the * CLOB value or if pos is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getCharacterStream * * @since JDK 1.4, HSQLDB 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 */ public java.io.Writer setCharacterStream( final long pos) throws SQLException { if (!m_createdByConnection) { /** @todo - better error message */ throw Util.notSupported(); } checkClosed(); if (pos < MIN_POS || pos > MAX_POS) { throw Util.outOfRangeArgument("pos: " + pos); } return new java.io.StringWriter() { public synchronized void close() throws java.io.IOException { try { JDBCClob.this.setString(pos, toString()); } catch (SQLException se) { throw JavaSystem.toIOException(se); } } }; } /** * Truncates the CLOB value that this Clob * designates to have a length of len * characters. *

* Note: If the value specified for len * is greater than the length of the CLOB value, then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 2.0 this feature is fully supported.

* * When built under JDK 1.6+ and the Clob instance is constructed as a * result of calling JDBCConnection.createClob(), this operation affects * only the client-side value; it has no effect upon a value stored in a * database because JDBCConnection.createClob() constructs disconnected, * initially empty Blob instances. To propagate the truncated Clob value to * a database in this case, it is required to supply the Clob instance to * an updating or inserting setXXX method of a Prepared or Callable * Statement, or to supply the Blob instance to an updateXXX method of an * updateable ResultSet.

* * Implementation Notes:

* * HSQLDB throws an SQLException if the specified len is greater * than the value returned by {@link #length() length}.

* *

* * * @param len the length, in characters, to which the CLOB value * should be truncated * @exception SQLException if there is an error accessing the * CLOB value or if len is less than 0 * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 */ public void truncate(final long len) throws SQLException { final String data = getData(); final long dlen = data.length(); if (len == dlen) { // nothing has changed, so there's nothing to be done } else if (len < 0 || len > dlen) { throw Util.outOfRangeArgument("len: " + len); } else { // no need to get rid of slack setData(data.substring(0, (int) len)); } } //------------------------- JDBC 4.0 ----------------------------------- /** * This method frees the Clob object and releases the resources the resources * that it holds. The object is invalid once the free method * is called. *

* After free has been called, any attempt to invoke a * method other than free will result in a SQLException * being thrown. If free is called multiple times, the subsequent * calls to free are treated as a no-op. *

* @throws SQLException if an error occurs releasing * the Clob's resources * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ public synchronized void free() throws SQLException { m_closed = true; m_data = null; } /** * Returns a Reader object that contains a partial Clob value, starting * with the character specified by pos, which is length characters in length. * * @param pos the offset to the first character of the partial value to * be retrieved. The first character in the Clob is at position 1. * @param length the length in characters of the partial value to be retrieved. * @return Reader through which the partial Clob value can be read. * @throws SQLException if pos is less than 1 or if pos is greater than the number of * characters in the Clob or if pos + length is greater than the number of * characters in the Clob * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ public Reader getCharacterStream(long pos, long length) throws SQLException { if (length > Integer.MAX_VALUE) { throw Util.outOfRangeArgument("length: " + length); } return new StringReader(getSubString(pos, (int) length)); } // ---------------------- internal implementation -------------------------- private static final long MIN_POS = 1L; private static final long MAX_POS = 1L + (long) Integer.MAX_VALUE; private boolean m_closed; private String m_data; private final boolean m_createdByConnection; /** * Constructs a new JDBCClob object wrapping the given character * sequence.

* * This constructor is used internally to retrieve result set values as * Clob objects, yet it must be public to allow access from other packages. * As such (in the interest of efficiency) this object maintains a reference * to the given String object rather than making a copy and so it is * gently suggested (in the interest of effective memory management) that * external clients using this constructor either take pause to consider * the implications or at least take care to provide a String object whose * internal character buffer is not much larger than required to represent * the value. * * @param data the character sequence representing the Clob value * @throws SQLException if the argument is null */ public JDBCClob(final String data) throws SQLException { if (data == null) { throw Util.nullArgument(); } m_data = data; m_createdByConnection = false; } protected JDBCClob() { m_data = ""; m_createdByConnection = true; } protected synchronized void checkClosed() throws SQLException { if (m_closed) { throw Util.sqlException(ErrorCode.X_07501); } } protected String data() throws SQLException { return getData(); } private synchronized String getData() throws SQLException { checkClosed(); return m_data; } private synchronized void setData(String data) throws SQLException { checkClosed(); m_data = data; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCStatementBase.java0000644000175000017500000002510012007547356023674 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLWarning; import org.hsqldb.error.ErrorCode; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; /** * Base class for HSQLDB's implementations of java.sql.Statement and * java.sql.PreparedStatement. Contains common members and methods. * * @author fredt@usrs * @version 2.0.1 * @since 1.9.0 * @revised JDK 1.7, HSQLDB 2.0.1 */ /** * JDBC specification. * * Closing the Statement closes the ResultSet instance returned. But: * * Statement can be executed multiple times and return several results. With * normal Statement objects, each execution can be for a completely different * query. PreparedStatement instances are specifically for multiple use over * multiple transactions. * * ResultSets may be held over commits and span several transactions. * * There is no real relation between the current state fo an Statement instance * and the various ResultSets that it may have returned for different queries. */ /** * @todo 1.9.0 - review the following issues: * * Does not always close ResultSet object directly when closed. Although RS * objects will eventually be closed when accessed, the change is not reflected * to the server, impacting ResultSets that are held. */ class JDBCStatementBase { /** * Whether this Statement has been explicitly closed. A JDBCConnection * object now explicitly closes all of its open JDBC Statement objects * when it is closed. */ volatile boolean isClosed; /** Is escape processing enabled? */ protected boolean isEscapeProcessing = true; /** The connection used to execute this statement. */ protected JDBCConnection connection; /** The maximum number of rows to generate when executing this statement. */ protected int maxRows; /** The number of rows returned in a chunk. */ protected int fetchSize = 0; /** Direction of results fetched. */ protected int fetchDirection = JDBCResultSet.FETCH_FORWARD; /** The result of executing this statement. */ protected Result resultIn; /** Any error returned from a batch execute. */ protected Result errorResult; /** The currently existing generated key Result */ protected Result generatedResult; /** The combined result set properties obtained by executing this statement. */ protected int rsProperties; /** Used by this statement to communicate non-batched requests. */ protected Result resultOut; /** Used by this statement to communicate batched execution requests */ protected Result batchResultOut; /** The currently existing ResultSet object */ protected JDBCResultSet currentResultSet; /** The currently existing ResultSet object for generated keys */ protected JDBCResultSet generatedResultSet; /** The first warning in the chain. Null if there are no warnings. */ protected SQLWarning rootWarning; /** Counter for ResultSet in getMoreResults(). */ protected int resultSetCounter; /** Query timeout in seconds */ protected int queryTimeout; /** connection generation */ int connectionIncarnation; /** Implementation in subclasses */ public synchronized void close() throws SQLException {} /** * An internal check for closed statements. * * @throws SQLException when the connection is closed */ void checkClosed() throws SQLException { if (isClosed) { throw Util.sqlException(ErrorCode.X_07501); } if (connection.isClosed) { close(); throw Util.sqlException(ErrorCode.X_08503); } if (connectionIncarnation != connection.incarnation ) { throw Util.sqlException(ErrorCode.X_08503); } } /** * processes chained warnings and any generated columns result set */ void performPostExecute() throws SQLException { resultOut.clearLobResults(); generatedResult = null; if (resultIn == null) { return; } rootWarning = null; Result current = resultIn; while (current.getChainedResult() != null) { current = current.getUnlinkChainedResult(); if (current.getType() == ResultConstants.WARNING) { SQLWarning w = Util.sqlWarning(current); if (rootWarning == null) { rootWarning = w; } else { rootWarning.setNextWarning(w); } } else if (current.getType() == ResultConstants.ERROR) { errorResult = current; } else if (current.getType() == ResultConstants.GENERATED) { generatedResult = current; } else if (current.getType() == ResultConstants.DATA) { resultIn.addChainedResult(current); } } if (rootWarning != null) { connection.setWarnings(rootWarning); } } int getUpdateCount() throws SQLException { checkClosed(); return (resultIn == null || resultIn.isData()) ? -1 : resultIn .getUpdateCount(); } ResultSet getResultSet() throws SQLException { checkClosed(); ResultSet result = currentResultSet; currentResultSet = null; return result; } boolean getMoreResults() throws SQLException { return getMoreResults(CLOSE_CURRENT_RESULT); } /** * Not yet correct for multiple ResultSets. Should keep track of all * previous ResultSet objects to be able to close them */ boolean getMoreResults(int current) throws SQLException { checkClosed(); if (resultIn == null) { return false; } resultIn = resultIn.getChainedResult(); if (currentResultSet != null && current != KEEP_CURRENT_RESULT) { currentResultSet.close(); } currentResultSet = null; if (resultIn != null) { currentResultSet = new JDBCResultSet(connection, this, resultIn, resultIn.metaData); return true; } return false; } ResultSet getGeneratedResultSet() throws SQLException { if (generatedResultSet != null) { generatedResultSet.close(); } if (generatedResult == null) { generatedResult = Result.emptyGeneratedResult; } generatedResultSet = new JDBCResultSet(connection, null, generatedResult, generatedResult.metaData); return generatedResultSet; } /** * See comment for getMoreResults. */ void closeResultData() throws SQLException { if (currentResultSet != null) { currentResultSet.close(); } if (generatedResultSet != null) { generatedResultSet.close(); } generatedResultSet = null; generatedResult = null; resultIn = null; currentResultSet = null; } /** * JDBC 3 constants */ static final int CLOSE_CURRENT_RESULT = 1; static final int KEEP_CURRENT_RESULT = 2; static final int CLOSE_ALL_RESULTS = 3; static final int SUCCESS_NO_INFO = -2; static final int EXECUTE_FAILED = -3; static final int RETURN_GENERATED_KEYS = 1; static final int NO_GENERATED_KEYS = 2; //--------------------------JDBC 4.1 ----------------------------- /** * Specifies that this {@code Statement} will be closed when all its * dependent result sets are closed. If execution of the {@code Statement} * does not produce any result sets, this method has no effect. *

* Note: Multiple calls to {@code closeOnCompletion} do * not toggle the effect on this {@code Statement}. However, a call to * {@code closeOnCompletion} does effect both the subsequent execution of * statements, and statements that currently have open, dependent, * result sets. * * @throws SQLException if this method is called on a closed * {@code Statement} * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ public void closeOnCompletion() throws SQLException { checkClosed(); } /** * Returns a value indicating whether this {@code Statement} will be * closed when all its dependent result sets are closed. * @return {@code true} if the {@code Statement} will be closed when all * of its dependent result sets are closed; {@code false} otherwise * @throws SQLException if this method is called on a closed * {@code Statement} * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ public boolean isCloseOnCompletion() throws SQLException { checkClosed(); return false; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/pool/0000755000175000017500000000000012007570422020610 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/pool/JDBCXAResource.java0000644000175000017500000003716312007547356024142 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc.pool; import javax.transaction.xa.XAResource; import javax.transaction.xa.XAException; import javax.transaction.xa.Xid; // These require a global transaction API: //import javax.transaction.HeuristicMixedException; //import javax.transaction.HeuristicCommitException; //import javax.transaction.HeuristicRollbackException; import org.hsqldb.jdbc.JDBCConnection; import java.sql.SQLException; import org.hsqldb.SessionInterface; import org.hsqldb.HsqlException; // @(#)$Id: JDBCXAResource.java 5026 2012-07-14 20:02:27Z fredt $ /** * Used by a global transaction service to control HSQLDB transactions. * Not for use by end-users. * End manage global transactions using transaction APIs such as JTA. *

* According to section 12.3 of the JDBC 3.0 spec, there is a * 1:1 correspondence between XAConnection and XAResource, and * A given XAConnection object may be associated with at most one * transaction at a time. * Therefore, there may be at any time at most one transaction * managed by a XAResource object. * One implication is, the XAResource can track the current transaction * state with a scaler. * Another implication is, the Xids for most of the XAResource interface * methods just introduce unnecessary complexity and an unnecessary point * of failure-- there can be only one transaction for this object, so * why track another identifier for it. * My strategy is to just "validate" that the Xid does not change * within a transaction. * Exceptions to this are the commit and rollback methods, which the * JDBC spec says can operate against any XAResource instance from * the same XADataSource. * N.b. The JDBC Spec does not state whether the prepare and forget * methods are XAResource-specific or XADataSource-specific. * * @version 2.2.9 * @since 2.0.0 * @author Blaine Simpson (blaine dot simpson at admc dot com) * @see javax.transaction.xa.XAResource */ public class JDBCXAResource implements XAResource { /** * @todo: * Make thread safe. * Figure out how to ensure that orphaned transactions to do not make * a memory leak in JDBCXADataSource.resources. I.e., * JDBCXADataSource.removeResource() must be called even for all * transactions, even aborted ones. Maybe tx managers are * already obligated to call one of commit/forget/rollback for * even transactions for which they have called start???... TEST THIS. * (They may only need to commit/forget/rollback if prepare has been * called?). * The answer may be to implement Timeouts. */ private JDBCConnection connection; private boolean originalAutoCommitMode; static int XA_STATE_INITIAL = 0; static int XA_STATE_STARTED = 1; static int XA_STATE_ENDED = 2; static int XA_STATE_PREPARED = 3; static int XA_STATE_DISPOSED = 4; int state = XA_STATE_INITIAL; private JDBCXADataSource xaDataSource; Xid xid = null; public boolean withinGlobalTransaction() { return state == XA_STATE_STARTED; } /** * * @throws XAException if the given Xid is the not the Xid of the current * transaction for this XAResource object. * @param xid Xid */ private void validateXid(Xid xid) throws XAException { if (xid == null) { throw new XAException("Null Xid"); } if (this.xid == null) { throw new XAException( "There is no live transaction for this XAResource"); } if (!xid.equals(this.xid)) { throw new XAException( "Given Xid is not that associated with this XAResource object"); } } /** * Constructs a resource using the given data source and connection. * * @param xaDataSource JDBCXADataSource * @param connection A non-wrapped JDBCConnection which we need in order to * do real (non-wrapped) commits, rollbacks, etc. This is not for the end * user. We need the real thing. */ public JDBCXAResource(JDBCXADataSource xaDataSource, JDBCConnection connection) { this.connection = connection; this.xaDataSource = xaDataSource; } JDBCXADataSource getXADataSource() { return xaDataSource; } /** * Per the JDBC 3.0 spec, this commits the transaction for the specified * Xid, not necessarily for the transaction associated with this XAResource * object. * * @param xid Xid * @param onePhase boolean * @throws XAException */ public void commit(Xid xid, boolean onePhase) throws XAException { // Comment out following debug statement before public release: /* System.err.println("Performing a " + (onePhase ? "1-phase" : "2-phase") + " commit on " + xid); */ JDBCXAResource resource = xaDataSource.getResource(xid); if (resource == null) { throw new XAException("The XADataSource has no such Xid: " + xid); } resource.commitThis(onePhase); } /** * This commits the connection associated with this XAResource. * * @throws XAException generically, since the more specific exceptions * require a JTA API to compile. * @param onePhase boolean */ public void commitThis(boolean onePhase) throws XAException { if (onePhase && state == XA_STATE_PREPARED) { throw new XAException( "Transaction is in a 2-phase state when 1-phase is requested"); } if ((!onePhase) && state != XA_STATE_PREPARED) { throw new XAException("Attempt to do a 2-phase commit when " + "transaction is not prepared"); } //if (!onePhase) { // throw new XAException( // "Sorry. HSQLDB has not implemented 2-phase commits yet"); //} try { /** * @todo: Determine if work was committed, rolled back, or both, * and return appropriate Heuristic*Exception. * connection.commit(); * Commits the real, physical conn. */ connection.commit(); } catch (SQLException se) { throw new XAException(se.toString()); } dispose(); } private void dispose() { state = XA_STATE_DISPOSED; xaDataSource.removeResource(xid); xid = null; } public void end(Xid xid, int flags) throws XAException { validateXid(xid); if (state != XA_STATE_STARTED) { throw new XAException("Invalid XAResource state"); } /** @todo - probably all flags can be ignored */ if (flags == XAResource.TMSUCCESS) {} state = XA_STATE_ENDED; try { connection.setAutoCommit(originalAutoCommitMode); // real/phys. } catch (SQLException se) { throw new XAException(se.toString()); } } /** * The XAResource API spec indicates implies that this is only for 2-phase * transactions. I guess that one-phase transactions need to call rollback() * to abort. I think we want this JDBCXAResource instance to be * garbage-collectable after (a) this method is called, and (b) the tx * manager releases its handle to it. * * @see javax.transaction.xa.XAResource#forget(Xid) * @param xid Xid * @throws XAException */ public void forget(Xid xid) throws XAException { /** * Should this method not attempt to clean up the aborted * transaction by rolling back or something? Maybe the * tx manager will already have called rollback() if * it were necessasry? */ validateXid(xid); if (state != XA_STATE_PREPARED) { throw new XAException( "Attempted to forget a XAResource that " + "is not in a heuristically completed state"); } dispose(); state = XA_STATE_INITIAL; } /** * * @todo: Implement * @throws XAException * @return int */ public int getTransactionTimeout() throws XAException { throw new XAException("Transaction timeouts not implemented yet"); } /** * Stub. See implementation comment in the method for why this is not * implemented yet. * * @return false. * @param xares XAResource * @throws XAException */ public boolean isSameRM(XAResource xares) throws XAException { if (!(xares instanceof JDBCXAResource)) { return false; } return xaDataSource == ((JDBCXAResource) xares).getXADataSource(); } /** * Vote on whether to commit the global transaction. We assume Xid may be * different from this, as in commit() method. * * @throws XAException to vote negative. * @return commitType of XA_RDONLY or XA_OK. (Actually only XA_OK now). * @param xid Xid */ public int prepare(Xid xid) throws XAException { JDBCXAResource resource = xaDataSource.getResource(xid); if (resource == null) { throw new XAException("The XADataSource has no such Xid: " + xid); } return resource.prepareThis(); } public int prepareThis() throws XAException { /** * @todo: This is where the real 2-phase work should be done to * determine if a commit done here would succeed or not. */ /** * @todo: May improve performance to return XA_RDONLY whenever * possible, but I don't know. * Could determine this by checking if DB instance is in RO mode, * or perhaps (with much difficulty) to determine if there have * been any modifications performed. */ if (state != XA_STATE_ENDED) { throw new XAException("Invalid XAResource state"); } try { connection.getSession().prepareCommit(); } catch (HsqlException e) { state = XA_STATE_PREPARED; // ??? didn't prepare throw new XAException(e.getMessage()); } state = XA_STATE_PREPARED; return XA_OK; // As noted above, should check non-committed work. } /** * Obtain a list of Xids of the current resource manager for * XAResources currently in the 'prepared' * state. According to the JDBC * 3.0 spec, the Xids of a specific resource manager are those of the same * XADataSource. * * @param flag int * @throws XAException * @return Xid[] */ public Xid[] recover(int flag) throws XAException { return xaDataSource.getPreparedXids(); } /** * Per the JDBC 3.0 spec, this rolls back the transaction for the specified * Xid, not necessarily for the transaction associated with this XAResource * object. * * @param xid Xid * @throws XAException */ public void rollback(Xid xid) throws XAException { JDBCXAResource resource = xaDataSource.getResource(xid); if (resource == null) { throw new XAException( "The XADataSource has no such Xid in prepared state: " + xid); } resource.rollbackThis(); } /** * This rolls back the connection associated with this XAResource. * * @throws javax.transaction.xa.XAException generically, since the more * specific exceptions require a JTA API to compile. */ /* @throws javax.transaction.HeuristicCommitException * if work was committed. * @throws javax.transaction.HeuristicMixedException * if some work was committed and some work was rolled back */ public void rollbackThis() throws XAException { if (state != XA_STATE_PREPARED) { throw new XAException("Invalid XAResource state"); } try { /** * @todo: Determine if work was committed, rolled back, or both, * and return appropriate Heuristic Exception. */ connection.rollback(); // real/phys. } catch (SQLException se) { throw new XAException(se.toString()); } dispose(); } /** * * @todo: Implement * @param seconds int * @throws XAException * @return boolean */ public boolean setTransactionTimeout(int seconds) throws XAException { throw new XAException("Transaction timeouts not implemented yet"); } public void start(Xid xid, int flags) throws XAException { // Comment out following debug statement before public release: /* System.err.println("STARTING NEW Xid: " + xid); */ if (state != XA_STATE_INITIAL && state != XA_STATE_DISPOSED) { throw new XAException("Invalid XAResource state"); } if (xaDataSource == null) { throw new XAException( "JDBCXAResource has not been associated with a XADataSource"); } if (xid == null) { // This block asserts that all JDBCXAResources with state // >= XA_STATE_STARTED have a non-null xid. throw new XAException("Null Xid"); } try { originalAutoCommitMode = connection.getAutoCommit(); // real/phys. connection.setAutoCommit(false); // real/phys. } catch (SQLException se) { throw new XAException(se.toString()); } this.xid = xid; state = XA_STATE_STARTED; xaDataSource.addResource(this.xid, this); // N.b. The DataSource does not have this XAResource in its list // until right here. We can't tell DataSource before our start() // method, because we don't know our Xid before now. } JDBCConnection getConnection() { return this.connection; } void setConnection(JDBCConnection userConnection) { connection = userConnection; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/pool/JDBCXADataSource.java0000644000175000017500000001553712007547356024406 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc.pool; import java.io.Serializable; import java.sql.SQLException; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.Referenceable; import javax.naming.StringRefAddr; //#ifdef JAVA6 import javax.sql.CommonDataSource; //#endif JAVA6 import javax.sql.XAConnection; import javax.sql.XADataSource; import javax.transaction.xa.Xid; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.jdbc.JDBCCommonDataSource; import org.hsqldb.jdbc.JDBCConnection; import org.hsqldb.jdbc.JDBCDriver; import org.hsqldb.jdbc.Util; import org.hsqldb.lib.HashMap; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.Iterator; // @(#)$Id: JDBCXADataSource.java 5034 2012-07-25 21:51:59Z fredt $ /** * Connection factory for JDBCXAConnections. * For use by XA data source factories, not by end users.

* * The {@link org.hsqldb.jdbc.JDBCDataSourceFactory} can be used to get * instances of this class.

* * The methods of the superclass, {@link org.hsqldb.jdbc.JDBCommonDataSource}, * are used for settings the HyperSQL server and user.

* * @version 2.2.9 * @since 2.0.0 * @author Blaine Simpson (blaine dot simpson at admc dot com) * @see javax.sql.XADataSource * @see org.hsqldb.jdbc.pool.JDBCXAConnection */ public class JDBCXADataSource extends JDBCCommonDataSource implements XADataSource, Serializable, Referenceable //#ifdef JAVA6 , CommonDataSource //#endif JAVA6 { /** * Get new XAConnection connection, to be managed by a connection manager. */ public XAConnection getXAConnection() throws SQLException { // Comment out before public release: /* System.err.print("Executing " + getClass().getName() + ".getXAConnection()..."); */ // Use JDBCDriver directly so there is no need to regiser with DriverManager JDBCConnection connection = (JDBCConnection) JDBCDriver.getConnection(url, connectionProps); JDBCXAConnection xaConnection = new JDBCXAConnection(this, connection); return xaConnection; } /** * Gets a new XAConnection after validating the given username * and password. * * @param user String which must match the 'user' configured for this * JDBCXADataSource. * @param password String which must match the 'password' configured * for this JDBCXADataSource. * * @see #getXAConnection() */ public XAConnection getXAConnection(String user, String password) throws SQLException { if (user == null || password == null) { throw Util.nullArgument(); } if (user.equals(this.user) && password.equals(this.password)) { return getXAConnection(); } throw Util.sqlException(Error.error(ErrorCode.X_28000)); } /** * Retrieves the Reference of this object. * * @return The non-null javax.naming.Reference of this object. * @exception NamingException If a naming exception was encountered * while retrieving the reference. */ public Reference getReference() throws NamingException { String cname = "org.hsqldb.jdbc.JDBCDataSourceFactory"; Reference ref = new Reference(getClass().getName(), cname, null); ref.add(new StringRefAddr("database", getDatabase())); ref.add(new StringRefAddr("user", getUser())); ref.add(new StringRefAddr("password", password)); ref.add(new StringRefAddr("loginTimeout", Integer.toString(loginTimeout))); return ref; } // ------------------------ internal implementation ------------------------ private HashMap resources = new HashMap(); public void addResource(Xid xid, JDBCXAResource xaResource) { resources.put(xid, xaResource); } public JDBCXADataSource() throws SQLException { // } public JDBCXAResource removeResource(Xid xid) { return (JDBCXAResource) resources.remove(xid); } /** * Return the list of transactions currently in prepared or * heuristically completed states. * Need to find out what non-prepared states they are considering * heuristically completed. * * @see javax.transaction.xa.XAResource#recover(int) */ Xid[] getPreparedXids() { Iterator it = resources.keySet().iterator(); Xid curXid; HashSet preparedSet = new HashSet(); while (it.hasNext()) { curXid = (Xid) it.next(); if (((JDBCXAResource) resources.get(curXid)).state == JDBCXAResource.XA_STATE_PREPARED) { preparedSet.add(curXid); } } Xid[] array = new Xid[preparedSet.size()]; preparedSet.toArray(array); return array; } /** * This is needed so that XAResource.commit() and * XAResource.rollback() may be applied to the right Connection * (which is not necessarily that associated with that XAResource * object). * * @see javax.transaction.xa.XAResource#commit(Xid, boolean) * @see javax.transaction.xa.XAResource#rollback(Xid) */ JDBCXAResource getResource(Xid xid) { return (JDBCXAResource) resources.get(xid); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/pool/JDBCXAConnection.java0000644000175000017500000000663512007547356024452 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc.pool; import java.sql.Connection; import java.sql.SQLException; import javax.sql.XAConnection; import javax.transaction.xa.XAResource; import org.hsqldb.jdbc.JDBCConnection; // @(#)$Id: JDBCXAConnection.java 5026 2012-07-14 20:02:27Z fredt $ /** * Subclass of JDBCPooledConnection implements the XAConneciton interface. * For use by global transaction service managers.

* * Each instance has an JDBCXAResource inherits the superclass's two * JDBCConnection objects, one for internal access, and one for user access.

* * The getConnection() method returns a user connection and links this with * the JDBCXAResource. This puts the object in the inUse state. * When the user connection is closed, the object is put in the free state. * * @version 2.2.9 * @since HSQLDB 2.0 * @author Fred Toussi (fredt at users.sourceforge.net) * @see javax.sql.XAConnection */ public class JDBCXAConnection extends JDBCPooledConnection implements XAConnection { JDBCXAResource xaResource; public JDBCXAConnection(JDBCXADataSource dataSource, JDBCConnection connection) { super(connection); xaResource = new JDBCXAResource(dataSource, connection); } public XAResource getXAResource() throws SQLException { return xaResource; } /** * Returns a connection that can be used by the user application. * * @throws SQLException if a lease has already been given on this connection * @return Connection */ synchronized public Connection getConnection() throws SQLException { if (isInUse) { throw new SQLException("Connection in use"); } isInUse = true; return new JDBCXAConnectionWrapper(xaResource, this, connection); } public void close() throws SQLException { super.close(); // deal with xaResource } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/pool/JDBCPooledConnection.java0000644000175000017500000001433512007547356025360 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc.pool; import java.sql.Connection; import java.sql.SQLException; import javax.sql.ConnectionEvent; import javax.sql.ConnectionEventListener; import javax.sql.PooledConnection; //#ifdef JAVA6 import javax.sql.StatementEventListener; //#endif JAVA6 import org.hsqldb.jdbc.JDBCConnection; import org.hsqldb.jdbc.JDBCConnectionEventListener; import org.hsqldb.lib.OrderedHashSet; /** * An implementations of {@link javax.sql.PooledConnection PooledConnection} * for use by connection pooling software.

* The class maintains a lifetime connection to the database. The * getConnection() method establishes a lease on the lifetime connection * and returns a special JDBCConnection (userConnection) that is * valid until it is closed.

* * This class uses a dedicated HyperSQL method to guarantee each lease on the * connection starts with the original state of the connection.

* * The ConnectionEventLister objects that have been registered with this * PooledConnection are notified when each lease expires, or an unrecoverable * error occurs on the connection to the database.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since JDK 1.2, HSQLDB 2.0 */ public class JDBCPooledConnection implements PooledConnection, JDBCConnectionEventListener { synchronized public Connection getConnection() throws SQLException { if (isInUse) { throw new SQLException("Connection in use"); } isInUse = true; userConnection = new JDBCConnection(connection, this); return userConnection; } public void close() throws SQLException { if (connection != null) { connection.closeFully(); this.connection = null; } } public void addConnectionEventListener(ConnectionEventListener listener) { listeners.add(listener); } public void removeConnectionEventListener( ConnectionEventListener listener) { listeners.remove(listener); } //#ifdef JAVA6 public void addStatementEventListener(StatementEventListener listener) {} public void removeStatementEventListener( StatementEventListener listener) {} //#endif JAVA6 // ------------------------ internal implementation ------------------------ synchronized public void connectionClosed() { ConnectionEvent event = new ConnectionEvent(this); userConnection = null; reset(); for (int i = 0; i < listeners.size(); i++) { ConnectionEventListener connectionEventListener = (ConnectionEventListener) listeners.get(i); connectionEventListener.connectionClosed(event); } } synchronized public void connectionErrorOccured(SQLException e) { ConnectionEvent event = new ConnectionEvent(this, e); reset(); for (int i = 0; i < listeners.size(); i++) { ConnectionEventListener connectionEventListener = (ConnectionEventListener) listeners.get(i); connectionEventListener.connectionErrorOccurred(event); } } /** * Returns true if getConnection() has been called and a leas has been * given. */ synchronized public boolean isInUse() { return isInUse; } /** * Force close the userConnection, no close event is fired. */ synchronized public void reset() { if (userConnection != null) { // userConnection is already closed in normal use try { userConnection.close(); } catch (SQLException e) { // check connection problems } } try { connection.reset(); } catch (SQLException e) { // check connection problems } isInUse = false; } /** * Force close the userConnection, and connection, no close event is fired. */ synchronized public void release() { if (userConnection != null) { // userConnection is already closed in normal use try { userConnection.close(); } catch (SQLException e) { // check connection problems } } try { connection.close(); } catch (SQLException e) { // check connection problems } isInUse = false; } protected OrderedHashSet listeners = new OrderedHashSet(); protected JDBCConnection connection; protected JDBCConnection userConnection; protected boolean isInUse; public JDBCPooledConnection(JDBCConnection connection) { this.connection = connection; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/pool/JDBCXAConnectionWrapper.java0000644000175000017500000001605512007547356026010 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc.pool; import org.hsqldb.jdbc.JDBCConnection; import java.sql.SQLException; import java.sql.Savepoint; // @(#)$Id: JDBCXAConnectionWrapper.java 5026 2012-07-14 20:02:27Z fredt $ /** * This is a wrapper class for JDBCConnection objects (not java.sql.XAConnection * objects). * Purpose of this class is to intercept and handle XA-related operations * according to chapter 12 of the JDBC 3.0 specification, by returning this * wrapped JDBCConnection to end-users. * Global transaction services and XAResources will not use this wrapper. *

* The new implementation extends JDBCConnection. A new object is created * based on the session / session proxy of the JDBCXAConnection object in the * constructor. (fredt)

* * @version 2.2.9 * @since 2.0.0 * @author Blaine Simpson (blaine dot simpson at admc dot com) * @see org.hsqldb.jdbc.JDBCConnection */ public class JDBCXAConnectionWrapper extends JDBCConnection { /* * A critical question: One responsibility of this * class is to intercept invocations of commit(), rollback(), * savePoint methods, etc. But, what about if user issues the * corresponding SQL commands? What is the point to intercepting * Connection.commit() here if end-users can execute the SQL command * "COMMIT" and bypass interception? * Similarly, what about DDL commands that cause an explicit commit? * - blaine * If we want, we can stop various statement categories from running * during an XA transaction. May do so in the future - fredt */ /** * Interceptor method, because this method is prohibited within * any global transaction. * See section 1.2.4 of the JDBC 3.0 spec. */ public void setAutoCommit(boolean autoCommit) throws SQLException { validateNotWithinTransaction(); super.setAutoCommit(autoCommit); } /** * Interceptor method, because this method is prohibited within * any global transaction. * See section 1.2.4 of the JDBC 3.0 spec. */ public void commit() throws SQLException { validateNotWithinTransaction(); super.commit(); } /** * Interceptor method, because this method is prohibited within * any global transaction. * See section 1.2.4 of the JDBC 3.0 spec. */ public void rollback() throws SQLException { validateNotWithinTransaction(); super.rollback(); } /** * Interceptor method, because this method is prohibited within * any global transaction. * See section 1.2.4 of the JDBC 3.0 spec. */ public void rollback(Savepoint savepoint) throws SQLException { validateNotWithinTransaction(); super.rollback(savepoint); } /** * Interceptor method, because this method is prohibited within * any global transaction. * See section 1.2.4 of the JDBC 3.0 spec. */ public Savepoint setSavepoint() throws SQLException { validateNotWithinTransaction(); return super.setSavepoint(); } /** * Interceptor method, because this method is prohibited within * any global transaction. * See section 1.2.4 of the JDBC 3.0 spec. */ public Savepoint setSavepoint(String name) throws SQLException { validateNotWithinTransaction(); return super.setSavepoint(name); } /** * Interceptor method, because there may be XA implications to * calling the method within a global transaction. * See section 1.2.4 of the JDBC 3.0 spec.

* * HSQLDB does not allow changing the isolation level inside a transaction * of any kind.

*/ public void setTransactionIsolation(int level) throws SQLException { validateNotWithinTransaction(); super.setTransactionIsolation(level); } //---------------------- NON-INTERFACE METHODS ----------------------------- private JDBCXAResource xaResource; public JDBCXAConnectionWrapper(JDBCXAResource xaResource, JDBCXAConnection xaConnection, JDBCConnection databaseConnection) throws SQLException { // todo: Review JDBCXADataSource and this class. // Under current implementation, because we do not pass a // JDBCXAConnection instance to the constructor to pick // up the connectionClosed event listener callback, calling // close() on this wrapper connection does not reset the // physical connection or set the inUse flag to false until // the vending JDBCXAConnection itself is closed, which marks // the end of its useful life. // // In other words, due to this current implementation detail, // JDBCXADataSource cannot cooperate with a pooling implementation // to reuse physical connections. // fixed - the event listener works super(databaseConnection, xaConnection); xaResource.setConnection(this); this.xaResource = xaResource; } /** * Throws a SQLException if within a Global transaction. * * @throws SQLException if within a Global transaction. */ private void validateNotWithinTransaction() throws SQLException { if (xaResource.withinGlobalTransaction()) { throw new SQLException( "Method prohibited within a global transaction"); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/pool/JDBCPooledDataSource.java0000644000175000017500000000765012007547356025315 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc.pool; import java.io.Serializable; import java.sql.SQLException; import java.util.Properties; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.Referenceable; import javax.naming.StringRefAddr; import javax.sql.ConnectionPoolDataSource; import javax.sql.PooledConnection; //#ifdef JAVA6 import javax.sql.CommonDataSource; //#endif JAVA6 import org.hsqldb.jdbc.JDBCCommonDataSource; import org.hsqldb.jdbc.JDBCConnection; import org.hsqldb.jdbc.JDBCDriver; /** * A data source that implements {@link javax.sql.ConnectionPoolDataSource}.

* For use by connection pooling software, not by end users. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since JDK 1.2, HSQLDB 2.0 */ public class JDBCPooledDataSource extends JDBCCommonDataSource implements ConnectionPoolDataSource, Serializable, Referenceable //#ifdef JAVA6 , CommonDataSource //#endif JAVA6 { public PooledConnection getPooledConnection() throws SQLException { JDBCConnection connection = (JDBCConnection) JDBCDriver.getConnection(url, connectionProps); return new JDBCPooledConnection(connection); } public PooledConnection getPooledConnection(String user, String password) throws SQLException { Properties props = new Properties(); props.setProperty("user", user); props.setProperty("password", password); JDBCConnection connection = (JDBCConnection) JDBCDriver.getConnection(url, props); return new JDBCPooledConnection(connection); } /** * Retrieves the Reference of this object. * * @return The non-null javax.naming.Reference of this object. * @exception NamingException If a naming exception was encountered * while retrieving the reference. */ public Reference getReference() throws NamingException { String cname = "org.hsqldb.jdbc.JDBCDataSourceFactory"; Reference ref = new Reference(getClass().getName(), cname, null); ref.add(new StringRefAddr("database", getDatabase())); ref.add(new StringRefAddr("user", getUser())); ref.add(new StringRefAddr("password", password)); ref.add(new StringRefAddr("loginTimeout", Integer.toString(loginTimeout))); return ref; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/pool/JDBCXID.java0000644000175000017500000001624012007547356022537 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc.pool; import java.net.Inet4Address; import java.util.Arrays; import java.util.Random; import javax.transaction.xa.Xid; /** * Implementation of Xid for tests. * *

 * // Example usage:
 *
 * JDBCXADataSource ds = new JDBCXADataSource();
 *
 * ds.setUser(user);
 * ds.setPassword(password);
 * ds.setUrl(jdbcUrl);
 *
 * XAConnection xaCon = ds.getConnection();
 * Connection con = xaCon.getConnection();
 * Xid xid = JDBCXID.getUniqueXid((int)Thread.currentThread().getId());
 * XAResource xaRes = xaCon.getXAResource();
 *
 *  // Start the transaction.
 * System.out.println("Starting XA transaction with xid = " + xid.toString());
 *
 * xaRes.setTransactionTimeout(0);
 * xaRes.start(xid,XAResource.TMNOFLAGS);
 *
 * // Do work here ....
 *
 * // Commit the transaction.
 * xaRes.end(xid,XAResource.TMSUCCESS);
 * xaRes.commit(xid,true);
 *
 * // Cleanup.
 * con.close();
 * xaCon.close();
 * 
* * @author Fred Toussi (fredt@users dot sourceforge.net) * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @version 2.1 */ public class JDBCXID implements Xid { int formatID; byte[] txID; byte[] txBranch; // int hash; boolean hashComputed; public int getFormatId() { return formatID; } public byte[] getGlobalTransactionId() { return txID; } public byte[] getBranchQualifier() { return txBranch; } public JDBCXID(int formatID, byte[] txID, byte[] txBranch) { this.formatID = formatID; this.txID = txID; this.txBranch = txBranch; } public int hashCode() { if (!hashComputed) { hash = 7; hash = 83 * hash + this.formatID; hash = 83 * hash + Arrays.hashCode(this.txID); hash = 83 * hash + Arrays.hashCode(this.txBranch); hashComputed = true; } return hash; } public boolean equals(Object other) { if (other instanceof Xid) { Xid o = (Xid) other; return formatID == o.getFormatId() && Arrays.equals(txID, o.getGlobalTransactionId()) && Arrays.equals(txBranch, o.getBranchQualifier()); } return false; } // inherit doc public String toString() { StringBuffer sb = new StringBuffer(512); // sb.append("formatId=").append(getFormatId()); // sb.append(" globalTransactionId(").append(txID.length).append(")={0x"); for (int i = 0; i < txID.length; i++) { final int hexVal = txID[i] & 0xFF; if (hexVal < 0x10) { sb.append("0").append(Integer.toHexString(txID[i] & 0xFF)); } sb.append(Integer.toHexString(txID[i] & 0xFF)); } // sb.append("} branchQualifier(").append(txBranch.length).append("))={0x"); for (int i = 0; i < txBranch.length; i++) { final int hexVal = txBranch[i] & 0xFF; if (hexVal < 0x10) { sb.append("0"); } sb.append(Integer.toHexString(txBranch[i] & 0xFF)); } sb.append("}"); // return sb.toString(); } private static byte[] s_localIp = null; private static int s_txnSequenceNumber = 0; // private static final int UXID_FORMAT_ID = 0xFEED; private static int nextTxnSequenceNumber() { s_txnSequenceNumber++; return s_txnSequenceNumber; } private static byte[] getLocalIp() { if (null == s_localIp) { try { s_localIp = Inet4Address.getLocalHost().getAddress(); } catch (Exception ex) { s_localIp = new byte[]{0x7F, 0x00, 0x00, 0x01}; } } return s_localIp; } /** * Retrieves a randomly generated JDBCXID. * * The newly generated object is based on the local IP address, the given * threadId and a randomly generated number using the current time * in milliseconds as the random seed. * * Note that java.util.Random is used, not java.security.SecureRandom. * * @param threadId can be a real thread id or just some convenient * tracking value. * * @return a randomly generated JDBCXID */ public static Xid getUniqueXid(final int threadId) { final Random random = new Random(System.currentTimeMillis()); // int txnSequenceNumberValue = nextTxnSequenceNumber(); int threadIdValue = threadId; int randomValue = random.nextInt(); // byte[] globalTransactionId = new byte[MAXGTRIDSIZE]; byte[] branchQualifier = new byte[MAXBQUALSIZE]; byte[] localIp = getLocalIp(); System.arraycopy(localIp, 0, globalTransactionId, 0, 4); System.arraycopy(localIp, 0, branchQualifier, 0, 4); // Bytes 4 -> 7 - unique transaction id. // Bytes 8 ->11 - thread id. // Bytes 12->15 - random. for (int i = 0; i <= 3; i++) { globalTransactionId[i + 4] = (byte) (txnSequenceNumberValue % 0x100); branchQualifier[i + 4] = (byte) (txnSequenceNumberValue % 0x100); txnSequenceNumberValue >>= 8; globalTransactionId[i + 8] = (byte) (threadIdValue % 0x100); branchQualifier[i + 8] = (byte) (threadIdValue % 0x100); threadIdValue >>= 8; globalTransactionId[i + 12] = (byte) (randomValue % 0x100); branchQualifier[i + 12] = (byte) (randomValue % 0x100); randomValue >>= 8; } return new JDBCXID(UXID_FORMAT_ID, globalTransactionId, branchQualifier); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCBlobFile.java0000644000175000017500000010060012007547356022612 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.RandomAccessFile; import java.sql.Blob; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.CountdownInputStream; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.InOutUtil; import org.hsqldb.lib.KMPSearchAlgorithm; /** * *
*

HSQLDB-Specific Information:

* * Starting with 2.1, in addition to HSQLDB driver support for both client-side * in-memory and remote SQL CLOB data implementations, this class is provided * to expose efficient, relatively high-performance BLOB operations over client * accessible files.

* * Design Notes

* * Although it is possible to implement a transactional version of this class, * the present implementation directly propagates changes to the underlying * file such that changes become visible as soon as they are either * implicitly or explicitly flushed to disk. *

* *

* * @author boucherb@users * @version 2.1.1 * @since HSQLDB 2.1 */ public class JDBCBlobFile implements java.sql.Blob { /** * Returns the number of bytes in the BLOB value * designated by this Blob object. * @return length of the BLOB in bytes * @exception SQLException if there is an error accessing the * length of the BLOB * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public long length() throws SQLException { checkClosed(); try { return m_file.length(); } catch (Exception e) { throw Util.sqlException(e); } } /** * Retrieves all or part of the BLOB * value that this Blob object represents, as an array of * bytes. This byte array contains up to length * consecutive bytes starting at position pos. * * @param pos the ordinal position of the first byte in the * BLOB value to be extracted; the first byte is at * position 1 * @param length the number of consecutive bytes to be copied; the value * for length must be 0 or greater * @return a byte array containing up to length * consecutive bytes from the BLOB value designated * by this Blob object, starting with the * byte at position pos * @exception SQLException if there is an error accessing the * BLOB value; if pos is less than 1 or length is * less than 0 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setBytes * @since JDK 1.2 */ public byte[] getBytes(final long pos, final int length) throws SQLException { InputStream is = null; ByteArrayOutputStream baos = null; final int initialBufferSize = (int) Math.min(InOutUtil.DEFAULT_COPY_BUFFER_SIZE, length); try { is = getBinaryStream(pos, length); baos = new ByteArrayOutputStream(initialBufferSize); InOutUtil.copy(is, baos, length); } catch (SQLException ex) { throw ex; } catch (Exception ex) { throw Util.sqlException(ex); } finally { if (is != null) { try { is.close(); } catch (Exception ex) {} } } return baos.toByteArray(); } /** * Retrieves the BLOB value designated by this * Blob instance as a stream. * * @return a stream containing the BLOB data * @exception SQLException if there is an error accessing the * BLOB value * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setBinaryStream * @since JDK 1.2 */ public InputStream getBinaryStream() throws SQLException { return getBinaryStream(1, Long.MAX_VALUE); } /** * Retrieves the byte position at which the specified byte array * pattern begins within the BLOB * value that this Blob object represents. The * search for pattern begins at position * start. * * @param pattern the byte array for which to search * @param start the position at which to begin searching; the * first position is 1 * @return the position at which the pattern appears, else -1 * @exception SQLException if there is an error accessing the * BLOB or if start is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public long position(final byte[] pattern, final long start) throws SQLException { if (start < 1) { throw Util.outOfRangeArgument("start: " + start); } else if (pattern == null || pattern.length == 0 || start > length()) { return -1L; } InputStream is = null; try { is = getBinaryStream(start, Long.MAX_VALUE); final long matchOffset = KMPSearchAlgorithm.search(is, pattern, KMPSearchAlgorithm.computeTable(pattern)); return (matchOffset == -1) ? -1 : start + matchOffset; } catch (SQLException ex) { throw ex; } catch (Exception ex) { throw Util.sqlException(ex); } finally { if (is != null) { try { is.close(); } catch (Exception ex) {} } } } /** * Retrieves the byte position in the BLOB value * designated by this Blob object at which * pattern begins. The search begins at position * start. * * @param pattern the Blob object designating * the BLOB value for which to search * @param start the position in the BLOB value * at which to begin searching; the first position is 1 * @return the position at which the pattern begins, else -1 * @exception SQLException if there is an error accessing the * BLOB value or if start is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public long position(final Blob pattern, final long start) throws SQLException { long patternLength; if (start < 1) { throw Util.outOfRangeArgument("start: " + start); } else if ((patternLength = (pattern == null) ? 0 : pattern.length()) == 0 || start > length()) { return -1L; } else if (patternLength > Integer.MAX_VALUE) { throw Util.outOfRangeArgument("pattern.length(): " + patternLength); } byte[] bytePattern; if (pattern instanceof JDBCBlob) { bytePattern = ((JDBCBlob) pattern).data(); } else { bytePattern = pattern.getBytes(1L, (int) patternLength); } return position(bytePattern, start); } // -------------------------- JDBC 3.0 ----------------------------------- /** * Writes the given array of bytes to the BLOB value that * this Blob object represents, starting at position * pos, and returns the number of bytes written. * The array of bytes will overwrite the existing bytes * in the Blob object starting at the position * pos. If the end of the Blob value is reached * while writing the array of bytes, then the length of the Blob * value will be increased to accommodate the extra bytes. *

* Note: If the value specified for pos * is greater then the length+1 of the BLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * This operation affects only the content of the underlying file; it has no * effect upon a value stored in a database. To propagate the updated * Blob value to a database, it is required to supply the Blob instance to * an updating or inserting setXXX method of a Prepared or Callable * Statement, or to supply the Blob instance to an updateXXX method of an * updateable ResultSet.

* *

* * * @param pos the position in the BLOB object at which * to start writing; the first position is 1 * @param bytes the array of bytes to be written to the BLOB * value that this Blob object represents * @return the number of bytes written * @exception SQLException if there is an error accessing the * BLOB value or if pos is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getBytes * @since JDK 1.4 */ public int setBytes(final long pos, final byte[] bytes) throws SQLException { return setBytes(pos, bytes, 0, bytes == null ? 0 : bytes.length); } /** * Writes all or part of the given byte array to the * BLOB value that this Blob object represents * and returns the number of bytes written. * Writing starts at position pos in the BLOB * value; len bytes from the given byte array are written. * The array of bytes will overwrite the existing bytes * in the Blob object starting at the position * pos. If the end of the Blob value is reached * while writing the array of bytes, then the length of the Blob * value will be increased to accommodate the extra bytes. *

* Note: If the value specified for pos * is greater then the length+1 of the BLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * This operation affects only the content of the underlying file; it has no * effect upon a value stored in a database. To propagate the updated * Blob value to a database, it is required to supply the Blob instance to * an updating or inserting setXXX method of a Prepared or Callable * Statement, or to supply the Blob instance to an updateXXX method of an * updateable ResultSet.

* *

* * * @param pos the position in the BLOB object at which * to start writing; the first position is 1 * @param bytes the array of bytes to be written to this BLOB * object * @param offset the offset into the array bytes at which * to start reading the bytes to be set * @param len the number of bytes to be written to the BLOB * value from the array of bytes bytes * @return the number of bytes written * @exception SQLException if there is an error accessing the * BLOB value or if pos is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getBytes * @since JDK 1.4 */ public int setBytes(final long pos, final byte[] bytes, final int offset, final int len) throws SQLException { if (bytes == null) { throw Util.nullArgument("bytes"); } final OutputStream os = setBinaryStream(pos); try { os.write(bytes, offset, len); } catch (Exception ex) { throw Util.sqlException(ex); } finally { try { os.close(); } catch (Exception ex) {} } return len; } /** * Retrieves a stream that can be used to write to the BLOB * value that this Blob object represents. The stream begins * at position pos. * The bytes written to the stream will overwrite the existing bytes * in the Blob object starting at the position * pos. If the end of the Blob value is reached * while writing to the stream, then the length of the Blob * value will be increased to accommodate the extra bytes. *

* Note: If the value specified for pos * is greater then the length+1 of the BLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * Data written to the returned stream affects only the content of the * underlying file; it has no effect upon a value stored in a database. * To propagate the updated Blob value to a database, it is required to * supply the Blob instance to an updating or inserting setXXX method of a * Prepared or Callable Statement, or to supply the Blob instance to an * updateXXX method of an updateable ResultSet.

* *

* * * @param pos the position in the BLOB value at which * to start writing; the first position is 1 * @return a java.io.OutputStream object to which data can * be written * @exception SQLException if there is an error accessing the * BLOB value or if pos is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getBinaryStream * @since JDK 1.4 */ public OutputStream setBinaryStream(final long pos) throws SQLException { if (pos < 1) { throw Util.invalidArgument("pos: " + pos); } checkClosed(); createFile(); OutputStream adapter; try { adapter = new OutputStreamAdapter(m_file, pos - 1) { public void close() throws IOException { try { super.close(); } finally { m_streams.remove(this); } } }; } catch (Exception ex) { throw Util.sqlException(ex); } m_streams.add(adapter); final OutputStream result = new BufferedOutputStream(adapter); return result; } /** * Truncates the BLOB value that this Blob * object represents to be len bytes in length. *

* Note: If the value specified for pos * is greater then the length+1 of the BLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * This operation affects only the length of the underlying file; it has no * effect upon a value stored in a database. To propagate the truncated * Blob value to a database, it is required to supply the Blob instance to * an updating or inserting setXXX method of a Prepared or Callable * Statement, or to supply the Blob instance to an updateXXX method of an * updateable ResultSet.

* *

* * * @param len the length, in bytes, to which the BLOB value * that this Blob object represents should be truncated * @exception SQLException if there is an error accessing the * BLOB value or if len is less than 0 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4 */ public void truncate(long len) throws SQLException { if (len < 0) { throw Util.invalidArgument("len: " + len); } checkClosed(); RandomAccessFile randomAccessFile = null; try { randomAccessFile = new RandomAccessFile(m_file, "rw"); randomAccessFile.setLength(len); } catch (Exception ex) { throw Util.sqlException(ex); } finally { if (randomAccessFile != null) { try { randomAccessFile.close(); } catch (Exception ex) {} } } } /** * This method frees the Blob object and releases the resources that * it holds. The object is invalid once the free * method is called. *

* After free has been called, any attempt to invoke a * method other than free will result in a SQLException * being thrown. If free is called multiple times, the subsequent * calls to free are treated as a no-op. *

* * *

*

HSQLDB-Specific Information:

* * This operation closes any input and/or output streams obtained * via {@link #getBinaryStream()}, {@link #getBinaryStream(long, long)} or * {@link #setBinaryStream(long)}.

* * Additionally, if the property {@link #isDeleteOnFree()} is true, then * an attempt is made to delete the backing file. * *

* * * @throws SQLException if an error occurs releasing * the Blob's resources * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setDeleteOnFree(boolean) * @see #isDeleteOnFree() * @since JDK 1.6 */ public synchronized void free() throws SQLException { if (m_closed) { return; } m_closed = true; final List streams = new ArrayList(); streams.addAll(m_streams); m_streams = null; for (Iterator itr = streams.iterator(); itr.hasNext(); ) { final Object stream = itr.next(); if (stream instanceof InputStream) { try { ((InputStream) stream).close(); } catch (Exception ex) { // } } else if (stream instanceof OutputStream) { try { ((OutputStream) stream).close(); } catch (Exception ex) { // } } } if (m_deleteOnFree) { try { m_file.delete(); } catch (Exception e) {} } } /** * Returns an InputStream object that contains a partial Blob value, * starting with the byte specified by pos, which is length bytes in length. * * @param pos the offset to the first byte of the partial value to be retrieved. * The first byte in the Blob is at position 1 * @param length the length in bytes of the partial value to be retrieved * @return InputStream through which the partial Blob value can be read. * @throws SQLException if pos is less than 1 or if pos is greater than the number of bytes * in the Blob or if pos + length is greater than the number of bytes * in the Blob * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6 */ public InputStream getBinaryStream(final long pos, final long length) throws SQLException { if (pos < 1) { throw Util.outOfRangeArgument("pos: " + pos); } checkClosed(); InputStream result; try { result = new InputStreamAdapter(m_file, pos - 1, length) { public void close() throws IOException { try { super.close(); } finally { m_streams.remove(this); } } }; } catch (Exception ex) { throw Util.sqlException(ex); } m_streams.add(result); return result; } /** * Retrieves the canonical File object denoting the file that * backs this BLOB. * * @return the file that backs this BLOB. */ public File getFile() { return m_file; } /** * Retrieves whether an attempt to delete the backing file * is made in response to invocation of {@link #free()}. * * @return true if backing file deletion is attempted; otherwise false. */ public boolean isDeleteOnFree() { return m_deleteOnFree; } /** * Assigns whether an attempt to delete the backing file * is made in response to invocation of {@link #free()}. * * @param deleteOnFree the new value to assign */ public void setDeleteOnFree(boolean deleteOnFree) { m_deleteOnFree = deleteOnFree; } /** * Ensures this object is freed in response to finalization. */ protected void finalize() throws Throwable { try { super.finalize(); } finally { this.free(); } } //-------------------------------------------------------------------------- // Internal Implementation //-------------------------------------------------------------------------- public static final String TEMP_FILE_PREFIX = "hsql_jdbc_blob_file_"; public static final String TEMP_FILE_SUFFIX = ".tmp"; // private final File m_file; private boolean m_closed; private boolean m_deleteOnFree; private List m_streams = new ArrayList(); /** * Convenience constructor; equivalent to JDBCBlobFile(true); * * @throws SQLException If a file could not be created or if a security * manager exists and its {@link * java.lang.SecurityManager#checkWrite(java.lang.String)} * method does not allow a file to be created. */ public JDBCBlobFile() throws SQLException { this(true); } /** * Constructs a new instance backed by a File object created in response * to invoking File.createTempFile(TEMP_FILE_PREFIX,TEMP_FILE_SUFFIX)

* * @param deleteOnFree Assigns whether an attempt to delete the backing file * is to be made in response to invocation of {@link #free()}. * * @throws SQLException If a file could not be created or if a security * manager exists and its {@link * java.lang.SecurityManager#checkWrite(java.lang.String)} * method does not allow a file to be created. */ public JDBCBlobFile(boolean deleteOnFree) throws SQLException { m_deleteOnFree = deleteOnFree; try { m_file = File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_SUFFIX).getCanonicalFile(); } catch (Exception ex) { throw Util.sqlException(ex); } } /** * Convenience constructor; equivalent to JDBCBlobFile(file, false); * * @param file used to back this BLOB instance. * @throws SQLException If an I/O error occurs, which is possible because * the construction of the canonical pathname may require file system * queries; if a required system property value cannot be accessed, * or if a security manager exists and its {@link * java.lang.SecurityManager#checkRead} method denies * read access to the file */ public JDBCBlobFile(final File file) throws SQLException { this(file, false); } /** * Constructs a new instance backed by the given File object. * * @param file used to back this BLOB instance. * @param deleteOnFree Assigns whether an attempt to delete the backing file * is to be made in response to invocation of {@link #free()}. * @throws SQLException If an I/O error occurs, which is possible because * the construction of the canonical pathname may require file system * queries; if a required system property value cannot be accessed, * or if a security manager exists and its {@link * java.lang.SecurityManager#checkRead} method denies * read access to the file */ public JDBCBlobFile(final File file, boolean deleteOnFree) throws SQLException { m_deleteOnFree = deleteOnFree; try { m_file = file.getCanonicalFile(); } catch (Exception ex) { throw Util.sqlException(ex); } checkIsFile( /*checkExists*/false); } protected final void checkIsFile(boolean checkExists) throws SQLException { boolean exists = false; boolean isFile = false; try { exists = m_file.exists(); } catch (Exception ex) { throw Util.sqlException(ex); } if (exists) { try { isFile = m_file.isFile(); } catch (Exception ex) { throw Util.sqlException(ex); } } if (exists) { if (!isFile) { throw Util.invalidArgument("Is not a file: " + m_file); } } else if (checkExists) { throw Util.invalidArgument("Does not exist: " + m_file); } } private void checkClosed() throws SQLException { if (m_closed) { throw Util.sqlException(ErrorCode.X_07501); } } private void createFile() throws SQLException { try { if (!m_file.exists()) { FileUtil.getFileUtil().makeParentDirectories(m_file); m_file.createNewFile(); } } catch (Exception ex) { throw Util.sqlException(ex); } checkIsFile( /*checkExists*/true); } protected static class OutputStreamAdapter extends OutputStream { private final RandomAccessFile m_randomAccessFile; public OutputStreamAdapter(final File file, final long pos) throws FileNotFoundException, IOException { if (pos < 0) { throw new IllegalArgumentException("pos: " + pos); } m_randomAccessFile = new RandomAccessFile(file, "rw"); m_randomAccessFile.seek(pos); } public void write(int b) throws IOException { m_randomAccessFile.write(b); } public void write(byte b[]) throws IOException { m_randomAccessFile.write(b); } public void write(byte b[], int off, int len) throws IOException { m_randomAccessFile.write(b, off, len); } public void flush() throws IOException { m_randomAccessFile.getFD().sync(); } public void close() throws IOException { m_randomAccessFile.close(); } } static class InputStreamAdapter extends InputStream { private final CountdownInputStream m_countdownInputStream; InputStreamAdapter(final File file, final long pos, final long length) throws FileNotFoundException, IOException { if (file == null) { throw new NullPointerException("file"); } if (pos < 0) { throw new IllegalArgumentException("pos: " + pos); } if (length < 0) { throw new IllegalArgumentException("length: " + length); } final FileInputStream fis = new FileInputStream(file); if (pos > 0) { final long actualPos = fis.skip(pos); } final BufferedInputStream bis = new BufferedInputStream(fis); final CountdownInputStream cis = new CountdownInputStream(bis); cis.setCount(length); m_countdownInputStream = cis; } public int available() throws IOException { return m_countdownInputStream.available(); } public int read() throws IOException { return m_countdownInputStream.read(); } public int read(byte b[]) throws IOException { return m_countdownInputStream.read(b); } public int read(byte b[], int off, int len) throws IOException { return m_countdownInputStream.read(b, off, len); } public long skip(long n) throws IOException { return m_countdownInputStream.skip(n); } public void close() throws IOException { m_countdownInputStream.close(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCPreparedStatement.java0000644000175000017500000056467712007547356024617 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.Serializable; import java.io.StringWriter; import java.math.BigDecimal; import java.sql.Array; import java.sql.BatchUpdateException; import java.sql.Blob; import java.sql.Clob; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.Ref; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; //#ifdef JAVA4 import java.sql.ParameterMetaData; import java.util.ArrayList; //#endif JAVA4 //#ifdef JAVA6 import java.sql.NClob; import java.sql.RowId; import java.sql.SQLXML; //#endif JAVA6 import org.hsqldb.HsqlDateTime; import org.hsqldb.HsqlException; import org.hsqldb.SchemaObject; import org.hsqldb.SessionInterface; import org.hsqldb.StatementTypes; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.CharArrayWriter; import org.hsqldb.lib.CountdownInputStream; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.lib.StringConverter; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.result.ResultLob; import org.hsqldb.result.ResultMetaData; import org.hsqldb.result.ResultProperties; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobDataID; import org.hsqldb.types.BlobInputStream; import org.hsqldb.types.ClobDataID; import org.hsqldb.types.ClobInputStream; import org.hsqldb.types.JavaObjectData; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /* $Id: JDBCPreparedStatement.java 5025 2012-07-13 15:57:00Z fredt $ */ // changes by fredt // SimpleDateFormat objects moved out of methods to improve performance // this is safe because only one thread at a time should access a // PreparedStatement object until it has finished executing the statement // // fredt@users 20020215 - patch 517028 by peterhudson@users - method defined // minor changes by fredt // fredt@users 20020320 - patch 1.7.0 - JDBC 2 support and error trapping; // JDBC 2 methods can now be called from jdk 1.1.x // - see javadoc comments // fredt@users 20020414 - patch 517028 by peterhudson@users - setDate method defined // - setTime method defined // - setTimestamp method defined // changes by fredt - moved conversion to HsqlDateTime // fredt@users 20020429 - patch 1.7.0 - setCharacterStream method defined // // boucherb & 20020409 - extensive review and update of docs and behaviour // fredt@users - 20020505 to comply with previous and latest java.sql specification // // boucherb@users 20020509 - added "throws SQLException" to all methods where it // was missing here but specified in the java.sql.PreparedStatement and // java.sqlCallableStatement interfaces, updated generic documentation to // JDK 1.4, and added JDBC3 methods and docs // fredt@users 20020627 - patch 574234 for setCharacterStream by ohioedge@users // fredt@users 20030620 - patch 1.7.2 - rewritten to support real prepared statements // boucherb@users 20030801 - patch 1.7.2 - support for batch execution // boucherb@users 20030801 - patch 1.7.2 - support for getMetaData and getParameterMetadata // boucherb@users 20030801 - patch 1.7.2 - updated some setXXX methods, incl. setCharacterStream // boucherb@users 20030801 - patch 1.7.2 - setBlob method implemented // boucherb@users 200403/4 - doc 1.7.2 - javadoc updates toward 1.7.2 final // boucherb@users 200403/4 - patch 1.7.2 - eliminate eager buffer allocation from setXXXStream/Blob/Clob // boucherb@users 20051207 - patch 1.8.0.x initial JDBC 4.0 support work // fredt@users 20060215 - patch 1.8.0 - check for unset parameters // fredt@users 20061008 - patch 1.9.0 - partial rewrite with enhancements - separated from jdbcStatement // boucherb@users 20060424 - patch 1.8.x - Mustang Build 81 JDBC 4.0 support // boucherb@users 20060424 - doc 1.9.0 - Full synch up to Mustang Build 84 // Revision 1.19 2006/07/12 12:24:17 boucherb // patch 1.9.0 // - full synch up to Mustang b90 /** * * * An object that represents a precompiled SQL statement. *

A SQL statement is precompiled and stored in a * PreparedStatement object. This object can then be used to * efficiently execute this statement multiple times. * *

Note: The setter methods (setShort, setString, * and so on) for setting IN parameter values * must specify types that are compatible with the defined SQL type of * the input parameter. For instance, if the IN parameter has SQL type * INTEGER, then the method setInt should be used. * *

If arbitrary parameter type conversions are required, the method * setObject should be used with a target SQL type. *

* In the following example of setting a parameter, con represents * an active connection: *

 *   PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
 *                                     SET SALARY = ? WHERE ID = ?");
 *   pstmt.setBigDecimal(1, 153833.00)
 *   pstmt.setInt(2, 110592)
 * 
* * * * *
*

HSQLDB-Specific Information:

* * From version 2.0, the implementation meets the JDBC specification * requirment that any existing ResultSet is closed when execute() or * executeQuery() methods are called. *

* JDBCPreparedStatement objects are backed by * a true compiled parameteric representation. Hence, there are now significant * performance gains to be had by using a JDBCPreparedStatement object in * preference to a JDBCStatement object when a short-running SQL statement is * to be executed more than once.

* * When it can be otherwise avoided, it should be considered poor practice to * fully prepare (construct), parameterize, execute, fetch and close a * JDBCParameterMetaData object for each execution cycle. Indeed, * because the prepare and execute phases * both represent a round-trip to the engine, this practice is likely to be * noticably less performant for short-running statements (and * possibly even orders of magnitude less performant over network connections * for short-running statements) than the equivalent process using JDBCStatement * objects, albeit far more convenient, less error prone and certainly much * less resource-intensive, especially when large binary and character values * are involved, due to the optimized parameterization facility.

* * Instead, when developing an application that is not totally oriented toward * the execution of ad hoc SQL, it is recommended to expend some effort toward * identifing the SQL statements that are good candidates for regular reuse and * adapting the structure of the application accordingly. Often, this is done * by recording the text of candidate SQL statements in an application resource * object (which has the nice side-benefit of isolating and hiding differences * in SQL dialects across different drivers) and caching for possible reuse the * PreparedStatement objects derived from the recorded text.

* * Starting with 2.0, when built under a JDBC 4 environment, statement caching * can be transparently enabled or disabled on a statement-by-statement basis by * invoking setPoolable(true | false), respectively, upon Statement objects of * interest.

* * Multi thread use:

* * A PreparedStatement object is stateful and should not normally be shared * by multiple threads. If it has to be shared, the calls to set the * parameters, calls to add batch statements, the execute call and any * post-execute calls should be made within a block synchronized on the * PreparedStatement Object.

* * JRE 1.1.x Notes:

* * In general, JDBC 2 support requires Java 1.2 and above, and JDBC3 requires * Java 1.4 and above. In HSQLDB, support for methods introduced in different * versions of JDBC depends on the JDK version used for compiling and building * HSQLDB.

* * Since 1.7.0, all JDBC 2 methods can be called while executing under the * version 1.1.x * Java Runtime EnvironmentTM. * However, in addition to this technique requiring explicit casts to the * org.hsqldb.jdbc.* classes, some of these method calls require * int values that are defined only in the JDBC 2 or greater * version of the {@link java.sql.ResultSet ResultSet} interface. For this * reason these values are defined in {@link JDBCResultSet JDBCResultSet}.

* * In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the * JDBC2-only ResultSet values can be achieved by referring * to them in parameter specifications and return value comparisons, * respectively, as follows:

* *

 * JDBCResultSet.FETCH_FORWARD
 * JDBCResultSet.TYPE_FORWARD_ONLY
 * JDBCResultSet.TYPE_SCROLL_INSENSITIVE
 * JDBCResultSet.CONCUR_READ_ONLY
 * //etc.
 * 

* * However, please note that code written to use HSQLDB JDBC 2 features under * JDK 1.1.x will not be compatible for use with other JDBC 2 drivers. Please * also note that this feature is offered solely as a convenience to developers * who must work under JDK 1.1.x due to operating constraints, yet wish to * use some of the more advanced features available under the JDBC 2 * specification.

* * (fredt@users)
* (boucherb@users)

* *

* * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0 * @since 1.7.2 * @see JDBCConnection#prepareStatement * @see JDBCResultSet */ public class JDBCPreparedStatement extends JDBCStatementBase implements PreparedStatement { /** * * Executes the SQL query in this PreparedStatement object * and returns the ResultSet object generated by the query. * * * @return a ResultSet object that contains the data produced by the * query; never null * @exception SQLException if a database access error occurs, * this method is called on a closed PreparedStatement or the SQL * statement does not return a ResultSet object */ public synchronized ResultSet executeQuery() throws SQLException { if (statementRetType != StatementTypes.RETURN_RESULT) { checkStatementType(StatementTypes.RETURN_RESULT); } fetchResult(); return getResultSet(); } /** * * Executes the SQL statement in this PreparedStatement object, * (JDBC4 clarification:) * which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or * DELETE; or an SQL statement that returns nothing, * such as a DDL statement. * * * @return (JDBC4 clarification:) either (1) the row count for SQL Data Manipulation Language (DML) statements * or (2) 0 for SQL statements that return nothing * @exception SQLException if a database access error occurs, * this method is called on a closed PreparedStatement * or the SQL * statement returns a ResultSet object */ public synchronized int executeUpdate() throws SQLException { if (statementRetType != StatementTypes.RETURN_COUNT) { checkStatementType(StatementTypes.RETURN_COUNT); } fetchResult(); return resultIn.getUpdateCount(); } /** * * Sets the designated parameter to SQL NULL. * *

Note: You must specify the parameter's SQL type. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB currently ignores the sqlType argument. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param sqlType the SQL type code defined in java.sql.Types * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @exception SQLFeatureNotSupportedException if sqlType is * a ARRAY, BLOB, CLOB, * DATALINK, JAVA_OBJECT, NCHAR, * NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML * or STRUCT data type and the JDBC driver does not support * this data type */ public synchronized void setNull(int parameterIndex, int sqlType) throws SQLException { setParameter(parameterIndex, null); } /** * * Sets the designated parameter to the given Java boolean value. * The driver converts this * (JDBC4 Modified:) * to an SQL BIT or BOOLEAN value when it sends it to the database. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports BOOLEAN type for boolean values. This method can also * be used to set the value of a parameter of the SQL type BIT(1), which is * a bit string consisting of a 0 or 1. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setBoolean(int parameterIndex, boolean x) throws SQLException { Boolean b = x ? Boolean.TRUE : Boolean.FALSE; setParameter(parameterIndex, b); } /** * * Sets the designated parameter to the given Java byte value. * The driver converts this * to an SQL TINYINT value when it sends it to the database. * * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setByte(int parameterIndex, byte x) throws SQLException { setIntParameter(parameterIndex, x); } /** * * Sets the designated parameter to the given Java short value. * The driver converts this * to an SQL SMALLINT value when it sends it to the database. * * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setShort(int parameterIndex, short x) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } checkSetParameterIndex(parameterIndex); if (parameterTypes[parameterIndex - 1].typeCode == Types.SQL_SMALLINT) { parameterValues[--parameterIndex] = Integer.valueOf(x); parameterSet[parameterIndex] = Boolean.TRUE; return; } setIntParameter(parameterIndex, x); } /** * * Sets the designated parameter to the given Java int value. * The driver converts this * to an SQL INTEGER value when it sends it to the database. * * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setInt(int parameterIndex, int x) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } checkSetParameterIndex(parameterIndex); if (parameterTypes[parameterIndex - 1].typeCode == Types.SQL_INTEGER) { parameterValues[--parameterIndex] = Integer.valueOf(x); parameterSet[parameterIndex] = Boolean.TRUE; return; } setIntParameter(parameterIndex, x); } /** * * Sets the designated parameter to the given Java long value. * The driver converts this * to an SQL BIGINT value when it sends it to the database. * * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setLong(int parameterIndex, long x) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } checkSetParameterIndex(parameterIndex); if (parameterTypes[parameterIndex - 1].typeCode == Types.SQL_BIGINT) { parameterValues[--parameterIndex] = Long.valueOf(x); parameterSet[parameterIndex] = Boolean.TRUE; return; } setLongParameter(parameterIndex, x); } /** * * Sets the designated parameter to the given Java float value. * The driver converts this * (JDBC4 correction:) * to an SQL REAL value when it sends it to the database. * * * *
*

HSQLDB-Specific Information:

* * Since 1.7.1, HSQLDB handles Java positive/negative Infinity * and NaN float values consistent with the Java Language * Specification; these special values are now correctly stored * to and retrieved from the database. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setFloat(int parameterIndex, float x) throws SQLException { setDouble(parameterIndex, (double) x); } /** * * Sets the designated parameter to the given Java double value. * The driver converts this * to an SQL DOUBLE value when it sends it to the database. * * * *
*

HSQLDB-Specific Information:

* * Since 1.7.1, HSQLDB handles Java positive/negative Infinity * and NaN double values consistent with the Java Language * Specification; these special values are now correctly stored * to and retrieved from the database. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setDouble(int parameterIndex, double x) throws SQLException { Double d = new Double(x); setParameter(parameterIndex, d); } /** * * Sets the designated parameter to the given java.math.BigDecimal value. * The driver converts this to an SQL NUMERIC value when * it sends it to the database. * * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { setParameter(parameterIndex, x); } /** * * Sets the designated parameter to the given Java String value. * The driver converts this * to an SQL VARCHAR or LONGVARCHAR value * (depending on the argument's * size relative to the driver's limits on VARCHAR values) * when it sends it to the database. * * * *
*

HSQLDB-Specific Information:

* * Including 2.0, HSQLDB represents all XXXCHAR values internally as * java.lang.String objects; there is no appreciable difference between * CHAR, VARCHAR and LONGVARCHAR. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setString(int parameterIndex, String x) throws SQLException { setParameter(parameterIndex, x); } /** * * Sets the designated parameter to the given Java array of bytes. The driver converts * this to an SQL VARBINARY or LONGVARBINARY * (depending on the argument's size relative to the driver's limits on * VARBINARY values) when it sends it to the database. * * * *
*

HSQLDB-Specific Information:

* * Including 2.0, HSQLDB represents all XXXBINARY values the same way * internally; there is no appreciable difference between BINARY, * VARBINARY and LONGVARBINARY as far as JDBC is concerned. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setBytes(int parameterIndex, byte[] x) throws SQLException { setParameter(parameterIndex, x); } /** * * (JDBC4 clarification:) * Sets the designated parameter to the given java.sql.Date value * using the default time zone of the virtual machine that is running * the application. * The driver converts this * to an SQL DATE value when it sends it to the database. * *
*

HSQLDB-Specific Information:

* * When a setXXX method is used to set a parameter of type * TIMESTAMP WITH TIME ZONE or TIME WITH TIME ZONE the time zone of the * client application is used as time zone *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setDate(int parameterIndex, Date x) throws SQLException { setParameter(parameterIndex, x); } /** * * Sets the designated parameter to the given java.sql.Time value. * The driver converts this * to an SQL TIME value when it sends it to the database. * *
*

HSQLDB-Specific Information:

* * When a setXXX method is used to set a parameter of type * TIMESTAMP WITH TIME ZONE or TIME WITH TIME ZONE the time zone of the * client application is used as time zone *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setTime(int parameterIndex, Time x) throws SQLException { setParameter(parameterIndex, x); } /** * * Sets the designated parameter to the given java.sql.Timestamp value. * The driver * converts this to an SQL TIMESTAMP value when it sends it to the * database. * *
*

HSQLDB-Specific Information:

* * When a setXXX method is used to set a parameter of type * TIMESTAMP WITH TIME ZONE or TIME WITH TIME ZONE the time zone of the * client application is used as time zone.

* * When this method is used to set a parameter of type TIME or * TIME WITH TIME ZONE, then the nanosecond value of the Timestamp object * will be used if the TIME parameter accpets fractional seconds. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { setParameter(parameterIndex, x); } /** @todo 1.9.0 - implement streaming */ /** * * Sets the designated parameter to the given input stream, which will have * the specified number of bytes. * When a very large ASCII value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.InputStream. Data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from ASCII to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * *

*

HSQLDB-Specific Information:

* * From HSQLDB 2.0 this method uses the US-ASCII character encoding to convert bytes * from the stream into the characters of a String.

* This method does not use streaming to send the data, * whether the target is a CLOB or other binary object.

* * For long streams (larger than a few megabytes) with CLOB targets, * it is more efficient to use a version of setCharacterStream which takes * the a length parameter. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the Java input stream that contains the ASCII parameter value * @param length the number of bytes in the stream * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setAsciiStream(int parameterIndex, java.io.InputStream x, int length) throws SQLException { setAsciiStream(parameterIndex, x, (long) length); } /** * * Sets the designated parameter to the given input stream, which * will have the specified number of bytes. * (JDBC4 deleted:) * [A Unicode character has two bytes, with the first byte being the high * byte, and the second being the low byte.]

* * When a very large Unicode value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.InputStream object. The data will be read from the * stream as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from Unicode to the database char format. * * (JDBC4 added:) * The byte format of the Unicode stream must be a Java UTF-8, as defined in the * Java Virtual Machine Specification. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * * *

*

HSQLDB-Specific Information:

* * From 1.7.0 to 1.8.0.x, this method complies with behavior as defined by * the JDBC3 specification (the stream is treated as though it has UTF16 * encoding).

* * Starting with 2.0, this method behaves according to the JDBC4 * specification (the stream is treated as though it has UTF-8 * encoding, as defined in the Java Virtual Machine Specification) when * built under JDK 1.6+; otherwise, it behaves as defined by the JDBC3 * specification. Regardless, this method is deprecated: please use * setCharacterStream(...) instead. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x a java.io.InputStream object that contains the * Unicode parameter value * (JDBC4 deleted:) * [as two-byte Unicode characters] * @param length the number of bytes in the stream * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @deprecated * Sun does not include a reason, but presumably * this is because setCharacterStream is now prefered */ //#ifdef DEPRECATEDJDBC public synchronized void setUnicodeStream(int parameterIndex, java.io.InputStream x, int length) throws SQLException { checkSetParameterIndex(parameterIndex); String msg = null; final int ver = JDBCDatabaseMetaData.JDBC_MAJOR; if (x == null) { throw Util.nullArgument("x"); } // CHECKME: Is JDBC4 clarification of UNICODE stream format retroactive? if ((ver < 4) && (length % 2 != 0)) { msg = "Odd length argument for UTF16 encoded stream: " + length; throw Util.invalidArgument(msg); } String encoding = (ver < 4) ? "UTF16" : "UTF8"; StringWriter writer = new StringWriter(); try { CountdownInputStream cis = new CountdownInputStream(x); InputStreamReader reader = new InputStreamReader(cis, encoding); char[] buff = new char[1024]; int charsRead; cis.setCount(length); while (-1 != (charsRead = reader.read(buff))) { writer.write(buff, 0, charsRead); } } catch (IOException ex) { throw Util.sqlException(ErrorCode.SERVER_TRANSFER_CORRUPTED, ex.toString(), ex); } setParameter(parameterIndex, writer.toString()); } //#endif /** @todo 1.9.0 - implement streaming */ /** * * Sets the designated parameter to the given input stream, which will have * the specified number of bytes. * When a very large binary value is input to a LONGVARBINARY * parameter, it may be more practical to send it via a * java.io.InputStream object. The data will be read from the * stream as needed until end-of-file is reached. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * * *

*

HSQLDB-Specific Information:

* * Since 1.7.2, this method works according to the standard. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the java input stream which contains the binary parameter value * @param length the number of bytes in the stream * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void setBinaryStream(int parameterIndex, java.io.InputStream x, int length) throws SQLException { setBinaryStream(parameterIndex, x, (long) length); } /** * * Clears the current parameter values immediately. *

In general, parameter values remain in force for repeated use of a * statement. Setting a parameter value automatically clears its * previous value. However, in some cases it is useful to immediately * release the resources used by the current parameter values; this can * be done by calling the method clearParameters. * * * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement */ public synchronized void clearParameters() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } ArrayUtil.fillArray(parameterValues, null); ArrayUtil.fillArray(parameterSet, null); ArrayUtil.clearArray(ArrayUtil.CLASS_CODE_LONG, streamLengths, 0, streamLengths.length); } //---------------------------------------------------------------------- // Advanced features: /** *

Sets the value of the designated parameter with the given object. The second * argument must be an object type; for integral values, the * java.lang equivalent objects should be used. * * If the second argument is an InputStream then the stream must contain * the number of bytes specified by scaleOrLength. If the second argument is a * Reader then the reader must contain the number of characters specified * by scaleOrLength. If these conditions are not true the driver will generate a * SQLException when the prepared statement is executed. * *

The given Java object will be converted to the given targetSqlType * before being sent to the database. * * If the object has a custom mapping (is of a class implementing the * interface SQLData), * the JDBC driver should call the method SQLData.writeSQL to * write it to the SQL data stream. * If, on the other hand, the object is of a class implementing * Ref, Blob, Clob, NClob, * Struct, java.net.URL, * or Array, the driver should pass it to the database as a * value of the corresponding SQL type. * *

Note that this method may be used to pass database-specific * abstract data types. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the object containing the input parameter value * @param targetSqlType the SQL type (as defined in java.sql.Types) to be * sent to the database. The scale argument may further qualify this type. * @param scaleOrLength for java.sql.Types.DECIMAL * or java.sql.Types.NUMERIC types, * this is the number of digits after the decimal point. For * Java Object types InputStream and Reader, * this is the length * of the data in the stream or reader. For all other types, * this value will be ignored. * @exception SQLException if a database access error occurs, * this method is called on a closed PreparedStatement or * if the Java Object specified by x is an InputStream * or Reader object and the value of the scale parameter is less * than zero * @exception SQLFeatureNotSupportedException if targetSqlType is * a ARRAY, BLOB, CLOB, * DATALINK, JAVA_OBJECT, NCHAR, * NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML * or STRUCT data type and the JDBC driver does not support * this data type * @see java.sql.Types */ public synchronized void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException { if (x instanceof InputStream) { setBinaryStream(parameterIndex, (InputStream) x, scaleOrLength); } else if (x instanceof Reader) { setCharacterStream(parameterIndex, (Reader) x, scaleOrLength); } else { setObject(parameterIndex, x); } } /** * * Sets the value of the designated parameter with the given object. * This method is like the method setObject * above, except that it assumes a scale of zero. * * * *

*

HSQLDB-Specific Information:

* * Since 1.7.2, this method supports conversions listed in the * conversion table B-5 of the JDBC 3 specification. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the object containing the input parameter value * @param targetSqlType the SQL type (as defined in java.sql.Types) to be * sent to the database * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @exception SQLFeatureNotSupportedException if targetSqlType is * a ARRAY, BLOB, CLOB, * DATALINK, JAVA_OBJECT, NCHAR, * NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML * or STRUCT data type and the JDBC driver does not support * this data type * @see #setObject(int,Object) */ public synchronized void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { setObject(parameterIndex, x); } /** * *

Sets the value of the designated parameter using the given object. * The second parameter must be of type Object; therefore, the * java.lang equivalent objects should be used for built-in types. * *

The JDBC specification specifies a standard mapping from * Java Object types to SQL types. The given argument * will be converted to the corresponding SQL type before being * sent to the database. * *

Note that this method may be used to pass datatabase- * specific abstract data types, by using a driver-specific Java * type. * * If the object is of a class implementing the interface SQLData, * the JDBC driver should call the method SQLData.writeSQL * to write it to the SQL data stream. * If, on the other hand, the object is of a class implementing * Ref, Blob, Clob, (JDBC4 new:) [ NClob ], * Struct, java.net.URL, (JDBC4 new:) [ RowId, SQLXML ] * or Array, the driver should pass it to the database as a * value of the corresponding SQL type. *

* Note: Not all databases allow for a non-typed Null to be sent to * the backend. For maximum portability, the setNull or the * setObject(int parameterIndex, Object x, int sqlType) * method should be used * instead of setObject(int parameterIndex, Object x). *

* Note: This method throws an exception if there is an ambiguity, for example, if the * object is of a class implementing more than one of the interfaces named above. * * * *

*

HSQLDB-Specific Information:

* * Since 1.7.2, this method supports conversions listed in the conversion * table B-5 of the JDBC 3 specification. *

* * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the object containing the input parameter value * @exception SQLException if a database access error occurs, * this method is called on a closed PreparedStatement * or the type of the given object is ambiguous */ public synchronized void setObject(int parameterIndex, Object x) throws SQLException { setParameter(parameterIndex, x); } /** * * Executes the SQL statement in this PreparedStatement object, * which may be any kind of SQL statement. * Some prepared statements return multiple results; the execute * method handles these complex statements as well as the simpler * form of statements handled by the methods executeQuery * and executeUpdate. *

* The execute method returns a boolean to * indicate the form of the first result. You must call either the method * getResultSet or getUpdateCount * to retrieve the result; you must call getMoreResults to * move to any subsequent result(s). * * * *

*

HSQLDB-Specific Information:

* * If the statatement is a call to a PROCEDURE, it may return multiple * multiple fetchable results.

* *

* * @return true if the first result is a ResultSet * object; false if the first result is an update * count or there is no result * @exception SQLException if a database access error occurs, * this method is called on a closed PreparedStatement * or an argument is supplied to this method * @see JDBCStatement#execute * @see JDBCStatement#getResultSet * @see JDBCStatement#getUpdateCount * @see JDBCStatement#getMoreResults * */ public synchronized boolean execute() throws SQLException { fetchResult(); return statementRetType == StatementTypes.RETURN_RESULT; } //--------------------------JDBC 2.0----------------------------- /** * * Adds a set of parameters to this PreparedStatement * object's batch of commands. * * * *
*

HSQLDB-Specific Information:

* * Since 1.7.2, this feature is supported. *

* * * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @see JDBCStatement#addBatch * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized void addBatch() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } checkParametersSet(); if (!isBatch) { resultOut.setBatchedPreparedExecuteRequest(); isBatch = true; } try { performPreExecute(); } catch (HsqlException e) { throw Util.sqlException(e); } int len = parameterValues.length; Object[] batchParamValues = new Object[len]; System.arraycopy(parameterValues, 0, batchParamValues, 0, len); resultOut.addBatchedPreparedExecuteRequest(batchParamValues); } /** @todo 1.9.0 - implement streaming */ /** * * Sets the designated parameter to the given Reader * object, which is the given number of characters long. * When a very large UNICODE value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.Reader object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * * *

*

HSQLDB-Specific Information:

* * From HSQLDB 2.0 this method uses streaming to send data * when the target is a CLOB.

* HSQLDB represents CHARACTER and related SQL types as UTF16 Unicode * internally, so this method does not perform any conversion. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param reader the java.io.Reader object that contains the * Unicode data * @param length the number of characters in the stream * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized void setCharacterStream(int parameterIndex, java.io.Reader reader, int length) throws SQLException { setCharacterStream(parameterIndex, reader, (long) length); } /** * * Sets the designated parameter to the given * REF(<structured-type>) value. * The driver converts this to an SQL REF value when it * sends it to the database. * * * *
*

HSQLDB-Specific Information:

* * Including 2.0 HSQLDB does not support the SQL REF type. Calling this method * throws an exception. * *

* * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x an SQL REF value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public void setRef(int parameterIndex, Ref x) throws SQLException { throw Util.notSupported(); } /** * * Sets the designated parameter to the given java.sql.Blob object. * The driver converts this to an SQL BLOB value when it * sends it to the database. * * * *
*

HSQLDB-Specific Information:

* * For parameters of type Blob, setBlob works normally.

* * In addition since 1.7.2, setBlob is supported for BINARY and VARBINARY * parameters. In this context, the Blob object is * hard-limited to those of length less than or equal to Integer.MAX_VALUE. * In practice, soft limits such as available heap and maximum disk usage * per file (such as the transaction log) dictate a much smaller maximum * length.

* * For BINARY and VARBINARY parameter types setBlob(i,x) is roughly * equivalent (null and length handling not shown) to:

* *

     * setBinaryStream(i, x.getBinaryStream(), (int) x.length());
     * 
* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x a Blob object that maps an SQL BLOB value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized void setBlob(int parameterIndex, Blob x) throws SQLException { checkSetParameterIndex(parameterIndex); Type outType = parameterTypes[parameterIndex - 1]; switch (outType.typeCode) { case Types.SQL_BINARY : case Types.SQL_VARBINARY : setBlobForBinaryParameter(parameterIndex, x); return; case Types.SQL_BLOB : setBlobParameter(parameterIndex, x); break; default : throw Util.invalidArgument(); } } /** * Converts a blob to binary data for non-blob binary parameters. */ private void setBlobForBinaryParameter(int parameterIndex, Blob x) throws SQLException { if (x instanceof JDBCBlob) { setParameter(parameterIndex, ((JDBCBlob) x).data()); return; } else if (x == null) { setParameter(parameterIndex, null); return; } final long length = x.length(); if (length > Integer.MAX_VALUE) { String msg = "Maximum Blob input octet length exceeded: " + length; // NOI18N throw Util.sqlException(ErrorCode.JDBC_INPUTSTREAM_ERROR, msg); } try { java.io.InputStream in = x.getBinaryStream(); HsqlByteArrayOutputStream out = new HsqlByteArrayOutputStream(in, (int) length); setParameter(parameterIndex, out.toByteArray()); } catch (Throwable e) { throw Util.sqlException(ErrorCode.JDBC_INPUTSTREAM_ERROR, e.toString(), e); } } /** * * Sets the designated parameter to the given java.sql.Clob object. * The driver converts this to an SQL CLOB value when it * sends it to the database. * * * *
*

HSQLDB-Specific Information:

* * For parameters of type Clob, setClob works normally.

* * In addition since 1.7.2, setClob is supported for CHARACTER and VARCHAR * parameters. In this context, the Clob object is * hard-limited to those of length less than or equal to Integer.MAX_VALUE. * In practice, soft limits such as available heap and maximum disk usage * per file (such as the transaction log) dictate a much smaller maximum * length.

* * For CHARACTER and VARCHAR parameter types setClob(i,x) is roughly * equivalent (null and length handling not shown) to:

* *

     * setCharacterStream(i, x.getCharacterStream(), (int) x.length());
     * 
* * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x a Clob object that maps an SQL CLOB value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized void setClob(int parameterIndex, Clob x) throws SQLException { checkSetParameterIndex(parameterIndex); Type outType = parameterTypes[parameterIndex - 1]; switch (outType.typeCode) { case Types.SQL_CHAR : case Types.SQL_VARCHAR : setClobForStringParameter(parameterIndex, x); return; case Types.SQL_CLOB : setClobParameter(parameterIndex, x); return; default : throw Util.invalidArgument(); } } private void setClobForStringParameter(int parameterIndex, Clob x) throws SQLException { if (x instanceof JDBCClob) { setParameter(parameterIndex, ((JDBCClob) x).data()); return; } else if (x == null) { setParameter(parameterIndex, null); return; } final long length = x.length(); if (length > Integer.MAX_VALUE) { String msg = "Max Clob input character length exceeded: " + length; // NOI18N throw Util.sqlException(ErrorCode.JDBC_INPUTSTREAM_ERROR, msg); } try { java.io.Reader reader = x.getCharacterStream(); CharArrayWriter writer = new CharArrayWriter(reader, (int) length); setParameter(parameterIndex, writer.toString()); } catch (Throwable e) { throw Util.sqlException(ErrorCode.SERVER_TRANSFER_CORRUPTED, e.toString(), e); } } /** * * Sets the designated parameter to the given java.sql.Array object. * The driver converts this to an SQL ARRAY value when it * sends it to the database. * * * *
*

HSQLDB-Specific Information:

* * From version 2.0, HSQLDB supports the SQL ARRAY type. * *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x an Array object that maps an SQL ARRAY value * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized void setArray(int parameterIndex, Array x) throws SQLException { checkParameterIndex(parameterIndex); Type type = this.parameterMetaData.columnTypes[parameterIndex - 1]; if (!type.isArrayType()) { throw Util.sqlException(ErrorCode.X_42561); } if (x == null) { setParameter(parameterIndex, null); return; } Object[] data = null; if (x instanceof JDBCArray) { data = (Object[]) ((JDBCArray) x).getArrayInternal(); } else { Object object = x.getArray(); if (object instanceof Object[]) { Type baseType = type.collectionBaseType(); Object[] array = (Object[]) object; data = new Object[array.length]; for (int i = 0; i < data.length; i++) { data[i] = baseType.convertJavaToSQL(session, array[i]); } } else { // if foreign data is not Object[] throw Util.notSupported(); } } parameterValues[parameterIndex - 1] = data; parameterSet[parameterIndex - 1] = Boolean.TRUE; return; } /** * * Retrieves a ResultSetMetaData object that contains * information about the columns of the ResultSet object * that will be returned when this PreparedStatement object * is executed. *

* Because a PreparedStatement object is precompiled, it is * possible to know about the ResultSet object that it will * return without having to execute it. Consequently, it is possible * to invoke the method getMetaData on a * PreparedStatement object rather than waiting to execute * it and then invoking the ResultSet.getMetaData method * on the ResultSet object that is returned. *

* NOTE: Using this method may be expensive for some drivers due * to the lack of underlying DBMS support. * * * *

*

HSQLDB-Specific Information:

* * Since 1.7.2, this feature is supported and is inexpensive as * it is backed by underlying DBMS support. If the statement * generates an update count, then null is returned. *

* * @return the description of a ResultSet object's columns or * null if the driver cannot return a * ResultSetMetaData object * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized ResultSetMetaData getMetaData() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } if (statementRetType != StatementTypes.RETURN_RESULT) { return null; } if (resultSetMetaData == null) { boolean isUpdatable = ResultProperties.isUpdatable(rsProperties); boolean isInsertable = isUpdatable; if (isInsertable) { for (int i = 0; i < resultMetaData.colIndexes.length; i++) { if (resultMetaData.colIndexes[i] < 0) { isInsertable = false; break; } } } resultSetMetaData = new JDBCResultSetMetaData(resultMetaData, isUpdatable, isInsertable, connection); } return resultSetMetaData; } /** * * Sets the designated parameter to the given java.sql.Date value, * using the given Calendar object. The driver uses * the Calendar object to construct an SQL DATE value, * which the driver then sends to the database. With * a Calendar object, the driver can calculate the date * taking into account a custom timezone. If no * Calendar object is specified, the driver uses the default * timezone, which is that of the virtual machine running the application. * * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @param cal the Calendar object the driver will use * to construct the date * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { checkSetParameterIndex(parameterIndex); int i = parameterIndex - 1; if (x == null) { parameterValues[i] = null; parameterSet[i] = Boolean.TRUE; return; } Type outType = parameterTypes[i]; Calendar calendar = cal == null ? session.getCalendar() : cal; long millis = HsqlDateTime.convertMillisFromCalendar(calendar, x.getTime()); millis = HsqlDateTime.getNormalisedDate(millis); switch (outType.typeCode) { case Types.SQL_DATE : case Types.SQL_TIMESTAMP : parameterValues[i] = new TimestampData(millis / 1000); break; case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : int zoneOffset = HsqlDateTime.getZoneMillis(calendar, millis); parameterValues[i] = new TimestampData(millis / 1000, 0, zoneOffset / 1000); break; default : throw Util.sqlException(ErrorCode.X_42561); } parameterSet[i] = Boolean.TRUE; } /** * * Sets the designated parameter to the given java.sql.Time value, * using the given Calendar object. The driver uses * the Calendar object to construct an SQL TIME value, * which the driver then sends to the database. With * a Calendar object, the driver can calculate the time * taking into account a custom timezone. If no * Calendar object is specified, the driver uses the default * timezone, which is that of the virtual machine running the application. * *
*

HSQLDB-Specific Information:

* * When a setXXX method is used to set a parameter of type * TIMESTAMP WITH TIME ZONE or TIME WITH TIME ZONE the time zone (including * Daylight Saving Time) of the Calendar is used as time zone for the * value.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @param cal the Calendar object the driver will use * to construct the time * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { checkSetParameterIndex(parameterIndex); int i = parameterIndex - 1; if (x == null) { parameterValues[i] = null; parameterSet[i] = Boolean.TRUE; return; } Type outType = parameterTypes[i]; long millis = x.getTime(); int zoneOffset = 0; Calendar calendar = cal == null ? session.getCalendar() : cal; millis = HsqlDateTime.convertMillisFromCalendar(calendar, millis); millis = HsqlDateTime.convertToNormalisedTime(millis); switch (outType.typeCode) { case Types.SQL_TIME : break; case Types.SQL_TIME_WITH_TIME_ZONE : zoneOffset = HsqlDateTime.getZoneMillis(calendar, millis); break; default : throw Util.sqlException(ErrorCode.X_42561); } parameterValues[i] = new TimeData((int) (millis / 1000), 0, zoneOffset / 1000); parameterSet[i] = Boolean.TRUE; } /** * * Sets the designated parameter to the given java.sql.Timestamp value, * using the given Calendar object. The driver uses * the Calendar object to construct an SQL TIMESTAMP value, * which the driver then sends to the database. With a * Calendar object, the driver can calculate the timestamp * taking into account a custom timezone. If no * Calendar object is specified, the driver uses the default * timezone, which is that of the virtual machine running the application. * *
*

HSQLDB-Specific Information:

* * When a setXXX method is used to set a parameter of type * TIMESTAMP WITH TIME ZONE or TIME WITH TIME ZONE the time zone (including * Daylight Saving Time) of the Calendar is used as time zone.

* In this case, if the Calendar argument is null, then the default Calendar * for the clients JVM is used as the Calendar

* * When this method is used to set a parameter of type TIME or * TIME WITH TIME ZONE, then the nanosecond value of the Timestamp object * is used if the TIME parameter accepts fractional seconds.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @param cal the Calendar object the driver will use * to construct the timestamp * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { checkSetParameterIndex(parameterIndex); int i = parameterIndex - 1; if (x == null) { parameterValues[i] = null; parameterSet[i] = Boolean.TRUE; return; } Type outType = parameterTypes[i]; long millis = x.getTime(); int zoneOffset = 0; Calendar calendar = cal == null ? session.getCalendar() : cal; millis = HsqlDateTime.convertMillisFromCalendar(calendar, millis); switch (outType.typeCode) { case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : zoneOffset = HsqlDateTime.getZoneMillis(calendar, millis); // fall through case Types.SQL_TIMESTAMP : parameterValues[i] = new TimestampData(millis / 1000, x.getNanos(), zoneOffset / 1000); break; case Types.SQL_TIME : millis = HsqlDateTime.getNormalisedTime(millis); parameterValues[i] = new TimeData((int) (millis / 1000), x.getNanos(), 0); break; case Types.SQL_TIME_WITH_TIME_ZONE : zoneOffset = HsqlDateTime.getZoneMillis(calendar, millis); parameterValues[i] = new TimeData((int) (millis / 1000), x.getNanos(), zoneOffset / 1000); break; case Types.SQL_DATE : millis = HsqlDateTime.getNormalisedDate(millis); parameterValues[i] = new TimestampData(millis / 1000); break; default : throw Util.sqlException(ErrorCode.X_42561); } parameterSet[i] = Boolean.TRUE; } /** * * Sets the designated parameter to SQL NULL. * This version of the method setNull should * be used for user-defined types and REF type parameters. Examples * of user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and * named array types. * *

Note: To be portable, applications must give the * SQL type code and the fully-qualified SQL type name when specifying * a NULL user-defined or REF parameter. In the case of a user-defined type * the name is the type name of the parameter itself. For a REF * parameter, the name is the type name of the referenced type. If * a JDBC driver does not need the type code or type name information, * it may ignore it. * * Although it is intended for user-defined and Ref parameters, * this method may be used to set a null parameter of any JDBC type. * If the parameter does not have a user-defined or REF type, the given * typeName is ignored. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB simply ignores the sqlType and typeName arguments. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param sqlType a value from java.sql.Types * @param typeName the fully-qualified name of an SQL user-defined type; * ignored if the parameter is not a user-defined type or REF * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @exception SQLFeatureNotSupportedException if sqlType is * a ARRAY, BLOB, CLOB, * DATALINK, JAVA_OBJECT, NCHAR, * NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML * or STRUCT data type and the JDBC driver does not support * this data type or if the JDBC driver does not support this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException { setParameter(parameterIndex, null); } //------------------------- JDBC 2.0 - overriden methods ------------------- /** * * Submits a batch of commands to the database for execution and * if all commands execute successfully, returns an array of update counts. * The int elements of the array that is returned are ordered * to correspond to the commands in the batch, which are ordered * according to the order in which they were added to the batch. * The elements in the array returned by the method executeBatch * may be one of the following: *
    *
  1. A number greater than or equal to zero -- indicates that the * command was processed successfully and is an update count giving the * number of rows in the database that were affected by the command's * execution *
  2. A value of SUCCESS_NO_INFO -- indicates that the command was * processed successfully but that the number of rows affected is * unknown *

    * If one of the commands in a batch update fails to execute properly, * this method throws a BatchUpdateException, and a JDBC * driver may or may not continue to process the remaining commands in * the batch. However, the driver's behavior must be consistent with a * particular DBMS, either always continuing to process commands or never * continuing to process commands. If the driver continues processing * after a failure, the array returned by the method * BatchUpdateException.getUpdateCounts * will contain as many elements as there are commands in the batch, and * at least one of the elements will be the following: *

    *

  3. A value of EXECUTE_FAILED -- indicates that the command failed * to execute successfully and occurs only if a driver continues to * process commands after a command fails *
*

* A driver is not required to implement this method. * The possible implementations and return values have been modified in * the Java 2 SDK, Standard Edition, version 1.3 to * accommodate the option of continuing to proccess commands in a batch * update after a BatchUpdateException obejct has been thrown.

* * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 1.7.2, this feature is supported.

* * HSQLDB stops execution of commands in a batch when one of the commands * results in an exception. The size of the returned array equals the * number of commands that were executed successfully.

* * When the product is built under the JAVA1 target, an exception * is never thrown and it is the responsibility of the client software to * check the size of the returned update count array to determine if any * batch items failed. To build and run under the JAVA2 target, JDK/JRE * 1.3 or higher must be used. *

* * * @return an array of update counts containing one element for each * command in the batch. The elements of the array are ordered according * to the order in which commands were added to the batch. * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the * driver does not support batch statements. Throws {@link BatchUpdateException} * (a subclass of SQLException) if one of the commands sent to the * database fails to execute properly or attempts to return a result set. * * * @see #addBatch * @see java.sql.DatabaseMetaData#supportsBatchUpdates() * @since JDK 1.3 (JDK 1.1.x developers: read the overview for * JDBCStatement) */ public synchronized int[] executeBatch() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } checkStatementType(StatementTypes.RETURN_COUNT); if (!isBatch) { throw Util.sqlExceptionSQL(ErrorCode.X_07506); } generatedResult = null; int batchCount = resultOut.getNavigator().getSize(); resultIn = null; try { resultIn = session.execute(resultOut); } catch (HsqlException e) { throw Util.sqlException(e); } finally { performPostExecute(); resultOut.getNavigator().clear(); isBatch = false; } if (resultIn.mode == ResultConstants.ERROR) { throw Util.sqlException(resultIn); } RowSetNavigator navigator = resultIn.getNavigator(); int[] updateCounts = new int[navigator.getSize()]; for (int i = 0; i < updateCounts.length; i++) { Object[] data = (Object[]) navigator.getNext(); updateCounts[i] = ((Integer) data[0]).intValue(); } if (updateCounts.length != batchCount) { if (errorResult == null) { throw new BatchUpdateException(updateCounts); } else { errorResult.getMainString(); throw new BatchUpdateException(errorResult.getMainString(), errorResult.getSubString(), errorResult.getErrorCode(), updateCounts); } } return updateCounts; } /** * * Sets escape processing on or off.

* * * *

*

HSQLDB-Specific Information:

* * As per JDBC spec, calling this method has no effect. *

* * * @param enable true to enable escape processing; * false to disable it * @exception SQLException if a database access error occurs */ public void setEscapeProcessing(boolean enable) throws SQLException { checkClosed(); } /** * This method should always throw if called for a PreparedStatement or * CallableStatment. * * @param sql ignored * @throws SQLException always */ public void addBatch(String sql) throws SQLException { throw Util.notSupported(); } /** * This method should always throw if called for a PreparedStatement or * CallableStatment. * * @param sql ignored * @throws SQLException always * @return nothing */ public synchronized ResultSet executeQuery( String sql) throws SQLException { throw Util.notSupported(); } /** * This method should always throw if called for a PreparedStatement or * CallableStatment. * * @param sql ignored * @throws SQLException always * @return nothing */ public boolean execute(String sql) throws SQLException { throw Util.notSupported(); } /** * This method should always throw if called for a PreparedStatement or * CallableStatment. * * @param sql ignored * @throws SQLException always * @return nothing */ public int executeUpdate(String sql) throws SQLException { throw Util.notSupported(); } /** * Does the specialized work required to free this object's resources and * that of it's parent class.

* * @throws SQLException if a database access error occurs */ public synchronized void close() throws SQLException { if (isClosed()) { return; } closeResultData(); HsqlException he = null; try { // fredt - if this is called by Connection.close() then there's no // need to free the prepared statements on the server - it is done // by Connection.close() if (!connection.isClosed) { session.execute(Result.newFreeStmtRequest(statementID)); } } catch (HsqlException e) { he = e; } parameterValues = null; parameterSet = null; parameterTypes = null; parameterModes = null; resultMetaData = null; parameterMetaData = null; resultSetMetaData = null; pmd = null; connection = null; session = null; resultIn = null; resultOut = null; isClosed = true; if (he != null) { throw Util.sqlException(he); } } /** * Retrieves a String representation of this object.

* * The representation is of the form:

* * class-name@hash[sql=[char-sequence], parameters=[p1, ...pi, ...pn]]

* * p1, ...pi, ...pn are the String representations of the currently set * parameter values that will be used with the non-batch execution * methods.

* * @return a String representation of this object */ public String toString() { StringBuffer sb = new StringBuffer(); String sql; Object[] pv; sb.append(super.toString()); sql = this.sql; pv = parameterValues; if (sql == null || pv == null) { sb.append("[closed]"); return sb.toString(); } sb.append("[sql=[").append(sql).append("]"); if (pv.length > 0) { sb.append(", parameters=["); for (int i = 0; i < pv.length; i++) { sb.append('['); sb.append(pv[i]); sb.append("], "); } sb.setLength(sb.length() - 2); sb.append(']'); } sb.append(']'); return sb.toString(); } //------------------------- JDBC 3.0 ----------------------------------- /** * * Sets the designated parameter to the given java.net.URL value. * The driver converts this to an SQL DATALINK value * when it sends it to the database. * * * *

*

HSQLDB-Specific Information:

* * Including 2.0, HSQLDB does not support the DATALINK SQL type for which this * method is intended. Calling this method throws an exception. * *

* * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the java.net.URL object to be set * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.4, HSQL 1.7.0 */ //#ifdef JAVA4 public void setURL(int parameterIndex, java.net.URL x) throws SQLException { throw Util.notSupported(); } //#endif JAVA4 /** * * Retrieves the number, types and properties of this * PreparedStatement object's parameters. * * * *
*

HSQLDB-Specific Information:

* * Since 1.7.2, this feature is supported. *

* * * @return a ParameterMetaData object that contains information * about the number, types and properties for each * parameter marker of this PreparedStatement object * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @see java.sql.ParameterMetaData * @since JDK 1.4, HSQL 1.7.0 */ //#ifdef JAVA4 public synchronized ParameterMetaData getParameterMetaData() throws SQLException { checkClosed(); if (pmd == null) { pmd = new JDBCParameterMetaData(connection, parameterMetaData); } // NOTE: pmd is declared as Object to avoid yet another #ifdef. return (ParameterMetaData) pmd; } //#endif JAVA4 /** * Statement methods that must be overridden in this class and throw * an exception. */ //#ifdef JAVA4 public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { throw Util.notSupported(); } public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { throw Util.notSupported(); } public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { throw Util.notSupported(); } public boolean execute(String sql, int[] columnIndexes) throws SQLException { throw Util.notSupported(); } public int executeUpdate(String sql, String[] columnNames) throws SQLException { throw Util.notSupported(); } public boolean execute(String sql, String[] columnNames) throws SQLException { throw Util.notSupported(); } //#endif JAVA4 /** * * Moves to this Statement object's next result, deals with * any current ResultSet object(s) according to the instructions * specified by the given flag, and returns * true if the next result is a ResultSet object. * *

There are no more results when the following is true: *

     *     // stmt is a Statement object
     *     ((stmt.getMoreResults(current) == false) && (stmt.getUpdateCount() == -1))
     * 
* * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* * This is used with CallableStatement objects that return multiple * ResultSet objects. *

* * * @param current one of the following Statement * constants indicating what should happen to current * ResultSet objects obtained using the method * getResultSet: * Statement.CLOSE_CURRENT_RESULT, * Statement.KEEP_CURRENT_RESULT, or * Statement.CLOSE_ALL_RESULTS * @return true if the next result is a ResultSet * object; false if it is an update count or there are no * more results * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the argument * supplied is not one of the following: * Statement.CLOSE_CURRENT_RESULT, * Statement.KEEP_CURRENT_RESULT, or * Statement.CLOSE_ALL_RESULTS * @since JDK 1.4, HSQLDB 1.7 * @see #execute */ //#ifdef JAVA4 public synchronized boolean getMoreResults( int current) throws SQLException { return super.getMoreResults(current); } //#endif JAVA4 /** * * Retrieves any auto-generated keys created as a result of executing this * Statement object. If this Statement object did * not generate any keys, an empty ResultSet * object is returned. *

(JDBC4 clarification:) *

Note:If the columns which represent the auto-generated keys were not specified, * the JDBC driver implementation will determine the columns which best represent the auto-generated keys. * * * *

*

HSQLDB-Specific Information:

* * Starting with version 2.0, HSQLDB supports this feature with single-row and * multi-row insert, update and merge statements.

* * This method returns a result set only if * the executeUpdate methods that was used is one of the three methods that * have the extra parameter indicating return of generated keys

* * If the executeUpaged method did not specify the columns which represent * the auto-generated keys the IDENTITY column or GENERATED column(s) of the * table are returned.

* * The executeUpdate methods with column indexes or column names return the * post-insert or post-update values of the specified columns, whether the * columns are generated or not. This allows values that have been modified * by execution of triggers to be returned.

* * If column names or indexes provided by the user in the executeUpdate() * method calls do not correspond to table columns (incorrect names or * indexes larger than the coloum count), an empty result is returned. * *

* * * @return a ResultSet object containing the auto-generated key(s) * generated by the execution of this Statement object * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public synchronized ResultSet getGeneratedKeys() throws SQLException { return getGeneratedResultSet(); } //#endif JAVA4 /** * * Retrieves the result set holdability for ResultSet objects * generated by this Statement object. * * * *
*

HSQLDB-Specific Information:

* * Starting with 1.7.2, this method returns HOLD_CURSORS_OVER_COMMIT *

* * * @return either ResultSet.HOLD_CURSORS_OVER_COMMIT or * ResultSet.CLOSE_CURSORS_AT_COMMIT * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @since JDK 1.4, HSQLDB 1.7 */ //#ifdef JAVA4 public synchronized int getResultSetHoldability() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } return ResultProperties.getJDBCHoldability(rsProperties); } //#endif JAVA4 //------------------------- JDBC 4.0 ----------------------------------- /** * Retrieves whether this Statement object has been closed. A Statement is closed if the * method close has been called on it, or if it is automatically closed. * @return true if this Statement object is closed; false if it is still open * @throws SQLException if a database access error occurs * @since JDK 1.6, HSQLDB 2.0 */ public synchronized boolean isClosed() { return isClosed; } /** * Sets the designated parameter to the given java.sql.RowId object. The * driver converts this to a SQL ROWID value when it sends it * to the database * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @throws SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void setRowId(int parameterIndex, RowId x) throws SQLException { throw Util.notSupported(); } //#endif JAVA6 /** * Sets the designated paramter to the given String object. * The driver converts this to a SQL NCHAR or * NVARCHAR or LONGNVARCHAR value * (depending on the argument's * size relative to the driver's limits on NVARCHAR values) * when it sends it to the database. * * @param parameterIndex of the first parameter is 1, the second is 2, ... * @param value the parameter value * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur ; if a database access error occurs; or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.6, HSQLDB 2.0 */ public synchronized void setNString(int parameterIndex, String value) throws SQLException { setString(parameterIndex, value); } /** * Sets the designated parameter to a Reader object. The * Reader reads the data till end-of-file is reached. The * driver does the necessary conversion from Java character format to * the national character set in the database. * @param parameterIndex of the first parameter is 1, the second is 2, ... * @param value the parameter value * @param length the number of characters in the parameter data. * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur ; if a database access error occurs; or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.6, HSQLDB 2.0 */ public synchronized void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException { setCharacterStream(parameterIndex, value, length); } /** * Sets the designated parameter to a java.sql.NClob object. The driver converts this to a * SQL NCLOB value when it sends it to the database. * @param parameterIndex of the first parameter is 1, the second is 2, ... * @param value the parameter value * @throws SQLException if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur ; if a database access error occurs; or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setNClob(int parameterIndex, NClob value) throws SQLException { setClob(parameterIndex, value); } //#endif JAVA6 /** @todo 1.9.0 - implement streaming and remove length limits */ /** * Sets the designated parameter to a Reader object. The reader must contain the number * of characters specified by length otherwise a SQLException will be * generated when the PreparedStatement is executed. * This method differs from the setCharacterStream (int, Reader, int) method * because it informs the driver that the parameter value should be sent to * the server as a CLOB. When the setCharacterStream method is used, the * driver may have to do extra work to determine whether the parameter * data should be send to the server as a LONGVARCHAR or a CLOB * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @throws SQLException if a database access error occurs, this method is called on * a closed PreparedStatement, if parameterIndex does not correspond to a parameter * marker in the SQL statement, or if the length specified is less than zero. * * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.6, HSQLDB 2.0 */ public synchronized void setClob(int parameterIndex, Reader reader, long length) throws SQLException { setCharacterStream(parameterIndex, reader, length); } /** @todo 1.9.0 - implement streaming and remove length limits */ /** * Sets the designated parameter to a InputStream object. The inputstream must contain the number * of characters specified by length otherwise a SQLException will be * generated when the PreparedStatement is executed. * This method differs from the setBinaryStream (int, InputStream, int) * method because it informs the driver that the parameter value should be * sent to the server as a BLOB. When the setBinaryStream method is used, * the driver may have to do extra work to determine whether the parameter * data should be send to the server as a LONGVARBINARY or a BLOB * *
*

HSQLDB-Specific Information:

* * In HSQLDB 2.0, this method uses streaming to send the data when the * stream is assigned to a BLOB target. For other binary targets the * stream is read on the client side and a byte array is sent. *

* * * @param parameterIndex index of the first parameter is 1, * the second is 2, ... * @param inputStream An object that contains the data to set the parameter * value to. * @param length the number of bytes in the parameter data. * @throws SQLException if a database access error occurs, * this method is called on a closed PreparedStatement, * if parameterIndex does not correspond * to a parameter marker in the SQL statement, if the length specified * is less than zero or if the number of bytes in the inputstream does not match * the specfied length. * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * * @since JDK 1.6, HSQLDB 2.0 */ public synchronized void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException { setBinaryStream(parameterIndex, inputStream, length); } /** * Sets the designated parameter to a Reader object. The reader must contain the number * of characters specified by length otherwise a SQLException will be * generated when the PreparedStatement is executed. * This method differs from the setCharacterStream (int, Reader, int) method * because it informs the driver that the parameter value should be sent to * the server as a NCLOB. When the setCharacterStream method is used, the * driver may have to do extra work to determine whether the parameter * data should be send to the server as a LONGNVARCHAR or a NCLOB * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @throws SQLException if parameterIndex does not correspond to a parameter * marker in the SQL statement; if the length specified is less than zero; * if the driver does not support national character sets; * if the driver can detect that a data conversion * error could occur; if a database access error occurs or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * * @since JDK 1.6, HSQLDB 2.0 */ public synchronized void setNClob(int parameterIndex, Reader reader, long length) throws SQLException { setClob(parameterIndex, reader, length); } /** * Sets the designated parameter to the given java.sql.SQLXML object. * The driver converts this to an * SQL XML value when it sends it to the database. *

* * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @param xmlObject a SQLXML object that maps an SQL XML value * @throws SQLException if a database access error occurs, * this method is called on a closed PreparedStatement * or the java.xml.transform.Result, * Writer or OutputStream has not been closed for * the SQLXML object * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException { throw Util.notSupported(); } //#endif JAVA6 // --------------------------- Added: Mustang Build 86 ------------------------- /** @todo 1.9.0 - implement streaming and remove length limits */ /** * Sets the designated parameter to the given input stream, which will have * the specified number of bytes. * When a very large ASCII value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.InputStream. Data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from ASCII to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * *

*

HSQLDB-Specific Information:

* * From HSQLDB 2.0 this method uses the US-ASCII character encoding to convert bytes * from the stream into the characters of a String.

* This method does not use streaming to send the data, * whether the target is a CLOB or other binary object.

* * For long streams (larger than a few megabytes) with CLOB targets, * it is more efficient to use a version of setCharacterStream which takes * the a length parameter. *

* * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the Java input stream that contains the ASCII parameter value * @param length the number of bytes in the stream * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @since JDK 1.6 b86, HSQLDB 2.0 */ public synchronized void setAsciiStream(int parameterIndex, java.io.InputStream x, long length) throws SQLException { if (length < 0) { throw Util.sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "length: " + length); } setAscStream(parameterIndex, x, (long) length); } void setAscStream(int parameterIndex, java.io.InputStream x, long length) throws SQLException { if (length > Integer.MAX_VALUE) { Util.sqlException(ErrorCode.X_22001); } if (x == null) { throw Util.nullArgument("x"); } try { String s = StringConverter.inputStreamToString(x, "US-ASCII"); if (length >= 0 && s.length() > length) { s = s.substring(0, (int) length); } setParameter(parameterIndex, s); } catch (IOException e) { throw Util.sqlException(ErrorCode.JDBC_INPUTSTREAM_ERROR, null, e); } } /** * Sets the designated parameter to the given input stream, which will have * the specified number of bytes. * When a very large binary value is input to a LONGVARBINARY * parameter, it may be more practical to send it via a * java.io.InputStream object. The data will be read from the * stream as needed until end-of-file is reached. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * *

*

HSQLDB-Specific Information:

* * This method uses streaming to send the data when the * stream is assigned to a BLOB target. For other binary targets the * stream is read on the client side and a byte array is sent. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the java input stream which contains the binary parameter value * @param length the number of bytes in the stream * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @since JDK 1.6 b86, HSQLDB 2.0 */ public synchronized void setBinaryStream(int parameterIndex, java.io.InputStream x, long length) throws SQLException { if (length < 0) { throw Util.sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "length: " + length); } setBinStream(parameterIndex, x, length); } private void setBinStream(int parameterIndex, java.io.InputStream x, long length) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } if (parameterTypes[parameterIndex - 1].typeCode == Types.SQL_BLOB) { setBlobParameter(parameterIndex, x, length); return; } if (length > Integer.MAX_VALUE) { String msg = "Maximum Blob input length exceeded: " + length; throw Util.sqlException(ErrorCode.JDBC_INPUTSTREAM_ERROR, msg); } try { HsqlByteArrayOutputStream output; if (length < 0) { output = new HsqlByteArrayOutputStream(x); } else { output = new HsqlByteArrayOutputStream(x, (int) length); } setParameter(parameterIndex, output.toByteArray()); } catch (Throwable e) { throw Util.sqlException(ErrorCode.JDBC_INPUTSTREAM_ERROR, e.toString(), e); } } /** * Sets the designated parameter to the given Reader * object, which is the given number of characters long. * When a very large UNICODE value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.Reader object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * *

*

HSQLDB-Specific Information:

* * This method uses streaming to send data * when the target is a CLOB.

*

* * @param parameterIndex the first parameter is 1, the second is 2, ... * @param reader the java.io.Reader object that contains the * Unicode data * @param length the number of characters in the stream * @exception SQLException if a database access error occurs or * this method is called on a closed PreparedStatement * @since JDK 1.6 b86, HSQLDB 2.0 */ public synchronized void setCharacterStream(int parameterIndex, java.io.Reader reader, long length) throws SQLException { if (length < 0) { throw Util.sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "length: " + length); } setCharStream(parameterIndex, reader, length); } private void setCharStream(int parameterIndex, java.io.Reader reader, long length) throws SQLException { checkSetParameterIndex(parameterIndex); if (parameterTypes[parameterIndex - 1].typeCode == Types.SQL_CLOB) { setClobParameter(parameterIndex, reader, length); return; } if (length > Integer.MAX_VALUE) { String msg = "Maximum Clob input length exceeded: " + length; throw Util.sqlException(ErrorCode.JDBC_INPUTSTREAM_ERROR, msg); } try { CharArrayWriter writer; if (length < 0) { writer = new CharArrayWriter(reader); } else { writer = new CharArrayWriter(reader, (int) length); } setParameter(parameterIndex, writer.toString()); } catch (Throwable e) { throw Util.sqlException(ErrorCode.JDBC_INPUTSTREAM_ERROR, e.toString(), e); } } /** * Sets the designated parameter to the given input stream. * When a very large ASCII value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.InputStream. Data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from ASCII to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setAsciiStream which takes a length parameter. * * *

*

HSQLDB-Specific Information:

* * In HSQLDB 2.0, this method does not use streaming to send the data, * whether the target is a CLOB or other binary object. * * For long streams (larger than a few megabytes), it is more efficient to * use a version of setCharacterStream which takes the a length parameter. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the Java input stream that contains the ASCII parameter value * @exception SQLException if parameterIndex does not correspond to a parameter * marker in the SQL statement; if a database access error occurs or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ public void setAsciiStream(int parameterIndex, java.io.InputStream x) throws SQLException { setAscStream(parameterIndex, x, -1); } /** @todo 1.9.0 - implement streaming and remove length limits */ /** * Sets the designated parameter to the given input stream. * When a very large binary value is input to a LONGVARBINARY * parameter, it may be more practical to send it via a * java.io.InputStream object. The data will be read from the * stream as needed until end-of-file is reached. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setBinaryStream which takes a length parameter. * * *

* *
*

HSQLDB-Specific Information:

* * This method does not use streaming to send the data, * whether the target is a CLOB or other binary object.

* * For long streams (larger than a few megabytes) with CLOB targets, * it is more efficient to use a version of setCharacterStream which takes * the a length parameter. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the java input stream which contains the binary parameter value * @exception SQLException if parameterIndex does not correspond to a parameter * marker in the SQL statement; if a database access error occurs or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ public synchronized void setBinaryStream(int parameterIndex, java.io.InputStream x) throws SQLException { setBinStream(parameterIndex, x, -1); } /** @todo 1.9.0 - implement streaming and remove length limits */ /** * Sets the designated parameter to the given Reader * object. * When a very large UNICODE value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.Reader object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setCharacterStream which takes a length parameter. * * *

*

HSQLDB-Specific Information:

* * In HSQLDB 2.0, this method does not use streaming to send the data, * whether the target is a CLOB or other binary object. * * For long streams (larger than a few megabytes), it is more efficient to * use a version of setCharacterStream which takes the a length parameter. *

* * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param reader the java.io.Reader object that contains the * Unicode data * @exception SQLException if parameterIndex does not correspond to a parameter * marker in the SQL statement; if a database access error occurs or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ public void setCharacterStream(int parameterIndex, java.io.Reader reader) throws SQLException { setCharStream(parameterIndex, reader, -1); } /** @todo 1.9.0 - implement streaming and remove length limits */ /** * Sets the designated parameter to a Reader object. The * Reader reads the data till end-of-file is reached. The * driver does the necessary conversion from Java character format to * the national character set in the database. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setNCharacterStream which takes a length parameter. * * @param parameterIndex of the first parameter is 1, the second is 2, ... * @param value the parameter value * @throws SQLException if parameterIndex does not correspond to a parameter * marker in the SQL statement; if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; if a database access error occurs; or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException { setCharStream(parameterIndex, value, -1); } /** @todo 1.9.0 - implement streaming and remove length limits */ /** * Sets the designated parameter to a Reader object. * This method differs from the setCharacterStream (int, Reader) method * because it informs the driver that the parameter value should be sent to * the server as a CLOB. When the setCharacterStream method is used, the * driver may have to do extra work to determine whether the parameter * data should be sent to the server as a LONGVARCHAR or a CLOB * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setClob which takes a length parameter. * * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @param reader An object that contains the data to set the parameter value to. * @throws SQLException if parameterIndex does not correspond to a parameter * marker in the SQL statement; if a database access error occurs; this method is called on * a closed PreparedStatementor if parameterIndex does not correspond to a parameter * marker in the SQL statement * * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since 1.6 */ public void setClob(int parameterIndex, Reader reader) throws SQLException { setCharStream(parameterIndex, reader, -1); } /** @todo 1.9.0 - implement streaming and remove length limits */ /** * Sets the designated parameter to a InputStream object. * This method differs from the setBinaryStream (int, InputStream) * method because it informs the driver that the parameter value should be * sent to the server as a BLOB. When the setBinaryStream method is used, * the driver may have to do extra work to determine whether the parameter * data should be sent to the server as a LONGVARBINARY or a BLOB * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setBlob which takes a length parameter. * * @param parameterIndex index of the first parameter is 1, * the second is 2, ... * @param inputStream An object that contains the data to set the parameter * value to. * @throws SQLException if parameterIndex does not correspond to a parameter * marker in the SQL statement; if a database access error occurs; * this method is called on a closed PreparedStatement or * if parameterIndex does not correspond * to a parameter marker in the SQL statement, * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * * @since 1.6 */ public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException { setBinStream(parameterIndex, inputStream, -1); } /** @todo 1.9.0 - implement streaming and remove length limits */ /** * Sets the designated parameter to a Reader object. * This method differs from the setCharacterStream (int, Reader) method * because it informs the driver that the parameter value should be sent to * the server as a NCLOB. When the setCharacterStream method is used, the * driver may have to do extra work to determine whether the parameter * data should be sent to the server as a LONGNVARCHAR or a NCLOB *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setNClob which takes a length parameter. * * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @param reader An object that contains the data to set the parameter value to. * @throws SQLException if parameterIndex does not correspond to a parameter * marker in the SQL statement; * if the driver does not support national character sets; * if the driver can detect that a data conversion * error could occur; if a database access error occurs or * this method is called on a closed PreparedStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * * @since 1.6 */ public void setNClob(int parameterIndex, Reader reader) throws SQLException { setCharStream(parameterIndex, reader, -1); } /** * * Retrieves the maximum number of bytes that can be * returned for character and binary column values in a ResultSet * object produced by this Statement object. * This limit applies only to BINARY, VARBINARY, * LONGVARBINARY, CHAR, VARCHAR, * (JDBC4 new:) NCHAR, NVARCHAR, LONGNVARCHAR * and LONGVARCHAR columns. If the limit is exceeded, the * excess data is silently discarded. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB always returns zero, meaning there is no limit. *

* * * @return the current column size limit for columns storing character and * binary values; zero means there is no limit * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #setMaxFieldSize */ public synchronized int getMaxFieldSize() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } return 0; } /** * * (JDBC4 clarification:) Sets the limit for the maximum number of bytes in a ResultSet * Sets the limit for the maximum number of bytes that can be returned for * character and binary column values in a ResultSet * object produced by this Statement object. * * This limit applies * only to BINARY, VARBINARY, * LONGVARBINARY, CHAR, VARCHAR, * (JDBC4 new:) NCHAR, NVARCHAR, LONGNVARCHAR and * LONGVARCHAR fields. If the limit is exceeded, the excess data * is silently discarded. For maximum portability, use values * greater than 256. * * * *
*

HSQLDB-Specific Information:

* * To present, calls to this method are simply ignored; HSQLDB always * stores the full number of bytes when dealing with any of the field types * mentioned above. These types all have an absolute maximum element upper * bound determined by the Java array index limit * java.lang.Integer.MAX_VALUE. For XXXBINARY types, this translates to * Integer.MAX_VALUE bytes. For XXXCHAR types, this translates to * 2 * Integer.MAX_VALUE bytes (2 bytes / character).

* * In practice, field sizes are limited to values much smaller than the * absolute maximum element upper bound, in particular due to limits imposed * on the maximum available Java heap memory. *

* * * @param max the new column size limit in bytes; zero means there is no limit * @exception SQLException if a database access error occurs, * this method is called on a closed Statement * or the condition max >= 0 is not satisfied * @see #getMaxFieldSize */ public synchronized void setMaxFieldSize(int max) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } if (max < 0) { throw Util.outOfRangeArgument(); } } /** * * Retrieves the maximum number of rows that a * ResultSet object produced by this * Statement object can contain. If this limit is exceeded, * the excess rows are silently dropped. * * * @return the current maximum number of rows for a ResultSet * object produced by this Statement object; * zero means there is no limit * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #setMaxRows */ public synchronized int getMaxRows() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } return maxRows; } /** * * (JDBC4 clarification:) * Sets the limit for the maximum number of rows that any * ResultSet object generated by this Statement * object can contain to the given number. * If the limit is exceeded, the excess * rows are silently dropped. * * * @param max the new max rows limit; zero means there is no limit * @exception SQLException if a database access error occurs, * this method is called on a closed Statement * or the condition max >= 0 is not satisfied * @see #getMaxRows */ public synchronized void setMaxRows(int max) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } if (max < 0) { throw Util.outOfRangeArgument(); } maxRows = max; } /** * * Retrieves the number of seconds the driver will * wait for a Statement object to execute. * If the limit is exceeded, a * SQLException is thrown. * * * *
*

HSQLDB-Specific Information:

* * To present, HSQLDB always returns zero, meaning there * is no limit. *

* * * @return the current query timeout limit in seconds; zero means there is * no limit * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #setQueryTimeout */ public synchronized int getQueryTimeout() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } return 0; } /** * * Sets the number of seconds the driver will wait for a * Statement object to execute to the given number of seconds. * If the limit is exceeded, an SQLException is thrown. A JDBC * (JDBC4 clarification:) * driver must apply this limit to the execute, * executeQuery and executeUpdate methods. JDBC driver * implementations may also apply this limit to ResultSet methods * (consult your driver vendor documentation for details). * * * *
*

HSQLDB-Specific Information:

* * The maximum value is Short.MAX_VALUE. The minimum is 0, indicating no limit. * In 2.0, calls to this method are ignored; HSQLDB waits an * unlimited amount of time for statement execution * requests to return. *

* * * @param seconds the new query timeout limit in seconds; zero means * there is no limit * @exception SQLException if a database access error occurs, * this method is called on a closed Statement * or the condition seconds >= 0 is not satisfied * @see #getQueryTimeout */ public synchronized void setQueryTimeout(int seconds) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } if (seconds < 0 || seconds > Short.MAX_VALUE) { throw Util.outOfRangeArgument(); } queryTimeout = seconds; } /** * * Cancels this Statement object if both the DBMS and * driver support aborting an SQL statement. * This method can be used by one thread to cancel a statement that * is being executed by another thread. * * * *
*

HSQLDB-Specific Information:

* * Including 2.0, HSQLDB does not support aborting an SQL * statement; calls to this method are ignored. *

* * * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method */ public void cancel() throws SQLException { checkClosed(); } /** * * Retrieves the first warning reported by calls on this Statement object. * Subsequent Statement object warnings will be chained to this * SQLWarning object. * *

The warning chain is automatically cleared each time * a statement is (re)executed. This method may not be called on a closed * Statement object; doing so will cause an SQLException * to be thrown. * *

Note: If you are processing a ResultSet object, any * warnings associated with reads on that ResultSet object * will be chained on it rather than on the Statement * object that produced it. * * * *

*

HSQLDB-Specific Information:

* * From 1.9 HSQLDB, produces Statement warnings. *

* * * @return the first SQLWarning object or null * if there are no warnings * @exception SQLException if a database access error occurs or * this method is called on a closed Statement */ public synchronized SQLWarning getWarnings() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } return rootWarning; } /** * * Clears all the warnings reported on this Statement * object. After a call to this method, * the method getWarnings will return * null until a new warning is reported for this * Statement object. * * * *
*

HSQLDB-Specific Information:

* * Supported in HSQLDB 1.9. *

* * * @exception SQLException if a database access error occurs or * this method is called on a closed Statement */ public synchronized void clearWarnings() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } rootWarning = null; } /** @todo 1.9.0 - implement */ /** * * Sets the SQL cursor name to the given String, which * will be used by subsequent Statement object * execute methods. This name can then be * used in SQL positioned update or delete statements to identify the * current row in the ResultSet object generated by this * statement. If the database does not support positioned update/delete, * this method is a noop. To insure that a cursor has the proper isolation * level to support updates, the cursor's SELECT statement * should have the form SELECT FOR UPDATE. If * FOR UPDATE is not present, positioned updates may fail. * *

Note: By definition, the execution of positioned updates and * deletes must be done by a different Statement object than * the one that generated the ResultSet object being used for * positioning. Also, cursor names must be unique within a connection. * * * *

*

HSQLDB-Specific Information:

* * Including 2.0, HSQLDB does not support named cursors; * calls to this method are ignored. *

* * * @param name the new cursor name, which must be unique within * a connection * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method */ public void setCursorName(String name) throws SQLException { checkClosed(); } //----------------------- Multiple Results -------------------------- /** * * Retrieves the current result as a ResultSet object. * This method should be called only once per result. * * * *
*

HSQLDB-Specific Information:

* * Without an interceding call to executeXXX, each invocation of this * method will produce a new, initialized ResultSet instance referring to * the current result, if any. *

* * * @return the current result as a ResultSet object or * null if the result is an update count or there are no more results * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #execute */ public synchronized ResultSet getResultSet() throws SQLException { return super.getResultSet(); } /** * * Retrieves the current result as an update count; * if the result is a ResultSet object or there are no more results, -1 * is returned. This method should be called only once per result. * * * @return the current result as an update count; -1 if the current result is a * ResultSet object or there are no more results * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #execute */ public synchronized int getUpdateCount() throws SQLException { return super.getUpdateCount(); } /** * * Moves to this Statement object's next result, returns * true if it is a ResultSet object, and * implicitly closes any current ResultSet * object(s) obtained with the method getResultSet. * *

There are no more results when the following is true: *

     *     // stmt is a Statement object
     *     ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
     * 
* * * @return true if the next result is a ResultSet * object; false if it is an update count or there are * no more results * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @see #execute */ public synchronized boolean getMoreResults() throws SQLException { return getMoreResults(JDBCStatementBase.CLOSE_CURRENT_RESULT); } //--------------------------JDBC 2.0----------------------------- /** * * Gives the driver a hint as to the direction in which * rows will be processed in ResultSet * objects created using this Statement object. The * default value is ResultSet.FETCH_FORWARD. *

* Note that this method sets the default fetch direction for * result sets generated by this Statement object. * Each result set has its own methods for getting and setting * its own fetch direction. * * * *

*

HSQLDB-Specific Information:

* * Up to 1.8.0.x, HSQLDB supports only FETCH_FORWARD; * Setting any other value would throw an SQLException * stating that the operation is not supported.

* * Starting with 2.0, HSQLDB accepts any valid value. *

* * * @param direction the initial direction for processing rows * @exception SQLException if a database access error occurs, * this method is called on a closed Statement * or the given direction * is not one of ResultSet.FETCH_FORWARD, * ResultSet.FETCH_REVERSE, or ResultSet.FETCH_UNKNOWN * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) * @see #getFetchDirection */ public synchronized void setFetchDirection( int direction) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } if (direction != JDBCResultSet.FETCH_FORWARD && direction != JDBCResultSet.FETCH_REVERSE && direction != JDBCResultSet.FETCH_UNKNOWN) { throw Util.notSupported(); } fetchDirection = direction; } /** * * Retrieves the direction for fetching rows from * database tables that is the default for result sets * generated from this Statement object. * If this Statement object has not set * a fetch direction by calling the method setFetchDirection, * the return value is implementation-specific. * * * *
*

HSQLDB-Specific Information:

* * Up to 1.8.0.x, HSQLDB always returned FETCH_FORWARD. * * Starting with 2.0, HSQLDB returns FETCH_FORWARD by default, or * whatever value has been explicitly assigned by invoking * setFetchDirection. * . *

* * * @return the default fetch direction for result sets generated * from this Statement object * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) * @see #setFetchDirection */ public synchronized int getFetchDirection() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } return fetchDirection; } /** * * (JDBC4 clarification:) * Gives the JDBC driver a hint as to the number of rows that should * be fetched from the database when more rows are needed for * ResultSet objects genrated by this Statement. * If the value specified is zero, then the hint is ignored. * The default value is zero. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB uses the specified value as a hint, but may process more or fewer * rows than specified. *

* * * @param rows the number of rows to fetch * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the * (JDBC4 modified:) * condition rows >= 0 is not satisfied. * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) * @see #getFetchSize */ public synchronized void setFetchSize(int rows) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } if (rows < 0) { throw Util.outOfRangeArgument(); } fetchSize = rows; } /** * * Retrieves the number of result set rows that is the default * fetch size for ResultSet objects * generated from this Statement object. * If this Statement object has not set * a fetch size by calling the method setFetchSize, * the return value is implementation-specific. * * * *
* HSQLDB-Specific Information

* * HSQLDB returns 0 by default, or the fetch size specified by setFetchSize *

* * * @return the default fetch size for result sets generated * from this Statement object * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) * @see #setFetchSize */ public synchronized int getFetchSize() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } return fetchSize; } /** * * Retrieves the result set concurrency for ResultSet objects * generated by this Statement object. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports CONCUR_READ_ONLY and * CONCUR_READ_UPDATEBLE concurrency. *

* * * @return either ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) */ public synchronized int getResultSetConcurrency() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } return ResultProperties.getJDBCConcurrency(rsProperties); } /** * * Retrieves the result set type for ResultSet objects * generated by this Statement object. * * * *
*

HSQLDB-Specific Information:

* * HSQLDB 1.7.0 and later versions support TYPE_FORWARD_ONLY * and TYPE_SCROLL_INSENSITIVE. *

* * * @return one of ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) */ public synchronized int getResultSetType() throws SQLException { // fredt - omit checkClosed() in order to be able to handle the result of a // SHUTDOWN query if (isClosed || connection.isClosed) { checkClosed(); } return ResultProperties.getJDBCScrollability(rsProperties); } /** * * Empties this Statement object's current list of * SQL commands. *

* (JDBC4 clarification:)

* NOTE: Support of an ability to batch updates is optional. * * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 1.7.2, this feature is supported. *

* * * @exception SQLException if a database access error occurs, * this method is called on a closed Statement or the * driver does not support batch updates * @see #addBatch * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) */ public synchronized void clearBatch() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } if (isBatch) { resultOut.getNavigator().clear(); } } /** * * Retrieves the Connection object * that produced this Statement object. * * * @return the connection that produced this statement * @exception SQLException if a database access error occurs or * this method is called on a closed Statement * @since JDK 1.2 (JDK 1.1.x developers: read the overview * for JDBCStatement) */ public synchronized Connection getConnection() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } return connection; } //----------------------------- JDBC 4.0 ----------------------------------- // --------------------------- Added: Mustang Build 81 ------------------------- boolean poolable = true; /** * Requests that a Statement be pooled or not pooled. The value * specified is a hint to the statement pool implementation indicating * whether the application wants the statement to be pooled. It is up to * the statement pool manager as to whether the hint is used. *

* The poolable value of a statement is applicable to both internal * statement caches implemented by the driver and external statement caches * implemented by application servers and other applications. *

* By default, a Statement is not poolable when created, and * a PreparedStatement and CallableStatement * are poolable when created. *

* @param poolable requests that the statement be pooled if true and * that the statement not be pooled if false *

* @throws SQLException if this method is called on a closed * Statement *

* @since JDK 1.6 Build 81, HSQLDB 2.0 */ public synchronized void setPoolable( boolean poolable) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } this.poolable = poolable; } /** * Returns a value indicating whether the Statement * is poolable or not. *

* @return true if the Statement * is poolable; false otherwise * @throws SQLException if this method is called on a closed * Statement *

* @since JDK 1.6 Build 81, HSQLDB 2.0 *

* @see #setPoolable(boolean) setPoolable(boolean) */ public synchronized boolean isPoolable() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } return this.poolable; } // ------------------- java.sql.Wrapper implementation --------------------- /** * Returns an object that implements the given interface to allow access to * non-standard methods, or standard methods not exposed by the proxy. * * If the receiver implements the interface then the result is the receiver * or a proxy for the receiver. If the receiver is a wrapper * and the wrapped object implements the interface then the result is the * wrapped object or a proxy for the wrapped object. Otherwise return the * the result of calling unwrap recursively on the wrapped object * or a proxy for that result. If the receiver is not a * wrapper and does not implement the interface, then an SQLException is thrown. * * @param iface A Class defining an interface that the result must implement. * @return an object that implements the interface. May be a proxy for the actual implementing object. * @throws java.sql.SQLException If no object found that implements the interface * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 @SuppressWarnings("unchecked") public T unwrap(Class iface) throws java.sql.SQLException { if (isWrapperFor(iface)) { return (T) this; } throw Util.invalidArgument("iface: " + iface); } //#endif JAVA6 /** * Returns true if this either implements the interface argument or is directly or indirectly a wrapper * for an object that does. Returns false otherwise. If this implements the interface then return true, * else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped * object. If this does not implement the interface and is not a wrapper, return false. * This method should be implemented as a low-cost operation compared to unwrap so that * callers can use this method to avoid expensive unwrap calls that may fail. If this method * returns true then calling unwrap with the same argument should succeed. * * @param iface a Class defining an interface. * @return true if this implements the interface or directly or indirectly wraps an object that does. * @throws java.sql.SQLException if an error occurs while determining whether this is a wrapper * for an object with the given interface. * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public boolean isWrapperFor( java.lang.Class iface) throws java.sql.SQLException { return (iface != null && iface.isAssignableFrom(this.getClass())); } //#endif JAVA6 //-------------------- Internal Implementation ----------------------------- /** * Constructs a statement that produces results of the requested * type.

* * A prepared statement must be a single SQL statement.

* * @param c the Connection used execute this statement * @param sql the SQL statement this object represents * @param resultSetType the type of result this statement will produce (scrollability) * @param resultSetConcurrency (updatability) * @param resultSetHoldability (validity beyond commit) * @param generatedKeys internal mode of handling generated key reporting * @param generatedIndexes column indexes for generated keys * @param generatedNames column names for generated keys are given * @throws HsqlException if the statement is not accepted by the database * @throws SQLException if preprocessing by driver fails */ JDBCPreparedStatement(JDBCConnection c, String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability, int generatedKeys, int[] generatedIndexes, String[] generatedNames) throws HsqlException, SQLException { isResult = false; connection = c; connectionIncarnation = connection.incarnation; session = c.sessionProxy; sql = c.nativeSQL(sql); int[] keyIndexes = null; if (generatedIndexes != null) { keyIndexes = new int[generatedIndexes.length]; for (int i = 0; i < generatedIndexes.length; i++) { keyIndexes[i] = generatedIndexes[i] - 1; } } resultOut = Result.newPrepareStatementRequest(); int props = ResultProperties.getValueForJDBC(resultSetType, resultSetConcurrency, resultSetHoldability); resultOut.setPrepareOrExecuteProperties(sql, 0, 0, 0, queryTimeout, props, generatedKeys, generatedIndexes, generatedNames); Result in = session.execute(resultOut); if (in.mode == ResultConstants.ERROR) { throw Util.sqlException(in); } rootWarning = null; Result current = in; while (current.getChainedResult() != null) { current = current.getUnlinkChainedResult(); if (current.isWarning()) { SQLWarning w = Util.sqlWarning(current); if (rootWarning == null) { rootWarning = w; } else { rootWarning.setNextWarning(w); } } } connection.setWarnings(rootWarning); statementID = in.getStatementID(); statementRetType = in.getStatementType(); resultMetaData = in.metaData; parameterMetaData = in.parameterMetaData; parameterTypes = parameterMetaData.getParameterTypes(); parameterModes = parameterMetaData.paramModes; rsProperties = in.rsProperties; // int paramCount = parameterMetaData.getColumnCount(); parameterValues = new Object[paramCount]; parameterSet = new Boolean[paramCount]; streamLengths = new long[paramCount]; // // for (int i = 0; i < paramCount; i++) { if (parameterTypes[i].isLobType()) { hasLOBs = true; break; } } // resultOut = Result.newPreparedExecuteRequest(parameterTypes, statementID); resultOut.setStatement(in.getStatement()); // for toString() this.sql = sql; } /** * Constructor for updatable ResultSet */ JDBCPreparedStatement(JDBCConnection c, Result result) { isResult = true; connection = c; connectionIncarnation = connection.incarnation; session = c.sessionProxy; int paramCount = result.metaData.getExtendedColumnCount(); parameterMetaData = result.metaData; parameterTypes = result.metaData.columnTypes; parameterModes = new byte[paramCount]; parameterValues = new Object[paramCount]; parameterSet = new Boolean[paramCount]; streamLengths = new long[paramCount]; // for (int i = 0; i < paramCount; i++) { parameterModes[i] = SchemaObject.ParameterModes.PARAM_IN; if (parameterTypes[i].isLobType()) { hasLOBs = true; } } // resultOut = Result.newUpdateResultRequest(parameterTypes, result.getResultId()); } /** * Checks if execution does or does not generate a single row * update count, throwing if the argument, yes, does not match.

* * @param type type of statement regarding what it returns * something other than a single row update count. * @throws SQLException if the argument, yes, does not match */ protected void checkStatementType(int type) throws SQLException { if (type != statementRetType) { if (statementRetType == StatementTypes.RETURN_COUNT) { throw Util.sqlException(ErrorCode.X_07504); } else { throw Util.sqlException(ErrorCode.X_07503); } } } protected void checkParameterIndex(int i) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } if (i < 1 || i > parameterValues.length) { String msg = "parameter index out of range: " + i; throw Util.outOfRangeArgument(msg); } } /** * Checks if the specified parameter index value is valid in terms of * setting an IN or IN OUT parameter value.

* * @param i The parameter index to check * @throws SQLException if the specified parameter index is invalid */ protected void checkSetParameterIndex(int i) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } if (i < 1 || i > parameterValues.length) { String msg = "parameter index out of range: " + i; throw Util.outOfRangeArgument(msg); } if (parameterModes[i - 1] == SchemaObject.ParameterModes.PARAM_OUT) { String msg = "Not IN or INOUT mode for parameter: " + i; throw Util.invalidArgument(msg); } } /** * Checks if the specified parameter index value is valid in terms of * getting an OUT or INOUT parameter value.

* * @param i The parameter index to check * @throws SQLException if the specified parameter index is invalid */ protected void checkGetParameterIndex(int i) throws SQLException { String msg; if (isClosed || connection.isClosed) { checkClosed(); } if (i < 1 || i > parameterValues.length) { msg = "parameter index out of range: " + i; throw Util.outOfRangeArgument(msg); } int mode = parameterModes[i - 1]; switch (mode) { case SchemaObject.ParameterModes.PARAM_UNKNOWN : case SchemaObject.ParameterModes.PARAM_OUT : case SchemaObject.ParameterModes.PARAM_INOUT : break; case SchemaObject.ParameterModes.PARAM_IN : default : msg = "Not OUT or INOUT mode: " + mode + " for parameter: " + i; throw Util.invalidArgument(msg); } } /** * Called just before execution or adding to batch, this ensures all the * parameters have been set.

* * If a parameter has been set using a stream method, it should be set * again for the next reuse. When set using other methods, the parameter * setting is retained for the next use. * @throws SQLException */ private void checkParametersSet() throws SQLException { if (isResult) { return; } for (int i = 0; i < parameterSet.length; i++) { if (parameterModes[i] != SchemaObject.ParameterModes.PARAM_OUT) { if (parameterSet[i] == null) { throw Util.sqlException(ErrorCode.JDBC_PARAMETER_NOT_SET); } } } } /** * The internal parameter value setter always converts the parameter to * the Java type required for data transmission. * * @param i parameter index * @param o object * @throws SQLException if either argument is not acceptable. */ void setParameter(int i, Object o) throws SQLException { checkSetParameterIndex(i); i--; if (o == null) { parameterValues[i] = null; parameterSet[i] = Boolean.TRUE; return; } Type outType = parameterTypes[i]; switch (outType.typeCode) { case Types.OTHER : try { if (o instanceof Serializable) { o = new JavaObjectData((Serializable) o); break; } } catch (HsqlException e) { Util.throwError(e); } Util.throwError(Error.error(ErrorCode.X_42563)); case Types.SQL_BIT : case Types.SQL_BIT_VARYING : try { if (o instanceof Boolean) { o = outType.convertToDefaultType(session, o); break; } if (o instanceof Integer) { o = outType.convertToDefaultType(session, o); break; } if (o instanceof byte[]) { o = outType.convertToDefaultType(session, o); break; } if (o instanceof String) { o = outType.convertToDefaultType(session, o); break; } } catch (HsqlException e) { Util.throwError(e); } Util.throwError(Error.error(ErrorCode.X_42563)); // fall through case Types.SQL_BINARY : case Types.SQL_VARBINARY : if (o instanceof byte[]) { o = new BinaryData((byte[]) o, !connection.isNetConn); break; } try { if (o instanceof String) { o = outType.convertToDefaultType(session, o); break; } } catch (HsqlException e) { Util.throwError(e); } Util.throwError(Error.error(ErrorCode.X_42563)); break; case Types.SQL_ARRAY : if (o instanceof Array) { setArray(i + 1, (Array) o); return; } if (o instanceof ArrayList) { o = ((ArrayList) o).toArray(); } if (o instanceof Object[]) { Type baseType = outType.collectionBaseType(); Object[] array = (Object[]) o; Object[] data = new Object[array.length]; for (int j = 0; j < data.length; j++) { data[j] = baseType.convertJavaToSQL(session, array[j]); } o = data; break; } Util.throwError(Error.error(ErrorCode.X_42563)); case Types.SQL_BLOB : setBlobParameter(i + 1, o); return; case Types.SQL_CLOB : setClobParameter(i + 1, o); return; case Types.SQL_DATE : case Types.SQL_TIME_WITH_TIME_ZONE : case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : case Types.SQL_TIME : case Types.SQL_TIMESTAMP : { try { if (o instanceof String) { o = outType.convertToType(session, o, Type.SQL_VARCHAR); break; } o = outType.convertJavaToSQL(session, o); break; } catch (HsqlException e) { Util.throwError(e); } } case Types.TINYINT : case Types.SQL_SMALLINT : case Types.SQL_INTEGER : case Types.SQL_BIGINT : case Types.SQL_REAL : case Types.SQL_FLOAT : case Types.SQL_DOUBLE : case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : try { if (o instanceof String) { o = outType.convertToType(session, o, Type.SQL_VARCHAR); break; } else if (o instanceof Boolean) { boolean value = ((Boolean) o).booleanValue(); o = value ? Integer.valueOf(1) : Integer.valueOf(0); } o = outType.convertToDefaultType(session, o); break; } catch (HsqlException e) { Util.throwError(e); } case Types.SQL_VARCHAR : { if (o instanceof String) { break; } else { o = outType.convertToDefaultType(session, o); break; } } case Types.SQL_CHAR : if (outType.precision == 1) { if (o instanceof Character) { o = new String(new char[] { ((Character) o).charValue() }); break; } else if (o instanceof Boolean) { o = ((Boolean) o).booleanValue() ? "1" : "0"; break; } } // fall through default : try { o = outType.convertToDefaultType(session, o); break; } catch (HsqlException e) { Util.throwError(e); } } parameterValues[i] = o; parameterSet[i] = Boolean.TRUE; } /** * setParameterForClob * * @param i int * @param o Object * @throws SQLException */ void setClobParameter(int i, Object o) throws SQLException { setClobParameter(i, o, 0); } void setClobParameter(int i, Object o, long streamLength) throws SQLException { if (o instanceof JDBCClobClient) { JDBCClobClient clob = (JDBCClobClient) o; if (!clob.session.getDatabaseUniqueName().equals( session.getDatabaseUniqueName())) { streamLength = clob.length(); Reader is = clob.getCharacterStream(); parameterValues[i - 1] = is; streamLengths[i - 1] = streamLength; parameterSet[i - 1] = Boolean.FALSE; return; } parameterValues[i - 1] = o; parameterSet[i - 1] = Boolean.TRUE; return; } else if (o instanceof Clob) { parameterValues[i - 1] = o; parameterSet[i - 1] = Boolean.TRUE; return; } else if (o instanceof ClobInputStream) { ClobInputStream is = (ClobInputStream) o; if (is.session.getDatabaseUniqueName().equals( session.getDatabaseUniqueName())) { throw Util.sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "invalid Reader"); } parameterValues[i - 1] = o; streamLengths[i - 1] = streamLength; parameterSet[i - 1] = Boolean.FALSE; return; } else if (o instanceof Reader) { parameterValues[i - 1] = o; streamLengths[i - 1] = streamLength; parameterSet[i - 1] = Boolean.FALSE; return; } else if (o instanceof String) { JDBCClob clob = new JDBCClob((String) o); parameterValues[i - 1] = clob; parameterSet[i - 1] = false; return; } throw Util.invalidArgument(); } /** * setParameterForBlob * * @param i int * @param o Object */ void setBlobParameter(int i, Object o) throws SQLException { setBlobParameter(i, o, 0); } void setBlobParameter(int i, Object o, long streamLength) throws SQLException { if (o instanceof JDBCBlobClient) { JDBCBlobClient blob = (JDBCBlobClient) o; if (!blob.session.getDatabaseUniqueName().equals( session.getDatabaseUniqueName())) { streamLength = blob.length(); InputStream is = blob.getBinaryStream(); parameterValues[i - 1] = is; streamLengths[i - 1] = streamLength; parameterSet[i - 1] = Boolean.FALSE; return; } // in the same database parameterValues[i - 1] = o; parameterSet[i - 1] = Boolean.TRUE; return; } else if (o instanceof Blob) { parameterValues[i - 1] = o; parameterSet[i - 1] = Boolean.FALSE; return; } else if (o instanceof BlobInputStream) { BlobInputStream is = (BlobInputStream) o; if (is.session.getDatabaseUniqueName().equals( session.getDatabaseUniqueName())) { throw Util.sqlException(ErrorCode.JDBC_INVALID_ARGUMENT, "invalid Reader"); } // in the same database ? see if it blocks in parameterValues[i - 1] = o; streamLengths[i - 1] = streamLength; parameterSet[i - 1] = Boolean.FALSE; return; } else if (o instanceof InputStream) { parameterValues[i - 1] = o; streamLengths[i - 1] = streamLength; parameterSet[i - 1] = Boolean.FALSE; return; } else if (o instanceof byte[]) { JDBCBlob blob = new JDBCBlob((byte[]) o); parameterValues[i - 1] = blob; parameterSet[i - 1] = Boolean.TRUE; return; } throw Util.invalidArgument(); } /** * Used with int and narrower integral primitives * @param i parameter index * @param value object to set * @throws SQLException if either argument is not acceptable */ void setIntParameter(int i, int value) throws SQLException { checkSetParameterIndex(i); int outType = parameterTypes[i - 1].typeCode; switch (outType) { case Types.TINYINT : case Types.SQL_SMALLINT : case Types.SQL_INTEGER : { Object o = Integer.valueOf(value); parameterValues[i - 1] = o; parameterSet[i - 1] = Boolean.TRUE; break; } case Types.SQL_BIGINT : { Object o = Long.valueOf(value); parameterValues[i - 1] = o; parameterSet[i - 1] = Boolean.TRUE; break; } case Types.SQL_BINARY : case Types.SQL_VARBINARY : case Types.OTHER : throw Util.sqlException(Error.error(ErrorCode.X_42563)); default : setParameter(i, new Integer(value)); } } /** * Used with long and narrower integral primitives. Conversion to BINARY * or OTHER types will throw here and not passed to setParameter(). * * @param i parameter index * @param value object to set * @throws SQLException if either argument is not acceptable */ void setLongParameter(int i, long value) throws SQLException { checkSetParameterIndex(i); int outType = parameterTypes[i - 1].typeCode; switch (outType) { case Types.SQL_BIGINT : Object o = new Long(value); parameterValues[i - 1] = o; parameterSet[i - 1] = Boolean.TRUE; break; case Types.SQL_BINARY : case Types.SQL_VARBINARY : case Types.OTHER : throw Util.sqlException(Error.error(ErrorCode.X_42563)); default : setParameter(i, new Long(value)); } } private void performPreExecute() throws SQLException, HsqlException { if (!hasLOBs) { return; } for (int i = 0; i < parameterValues.length; i++) { Object value = parameterValues[i]; if (value == null) { continue; } if (parameterTypes[i].typeCode == Types.SQL_BLOB) { long id; BlobDataID blob = null; if (value instanceof JDBCBlobClient) { // check or fix id mismatch blob = ((JDBCBlobClient) value).blob; id = blob.getId(); } else if (value instanceof Blob) { long length = ((Blob) value).length(); blob = session.createBlob(length); id = blob.getId(); InputStream stream = ((Blob) value).getBinaryStream(); ResultLob resultLob = ResultLob.newLobCreateBlobRequest(session.getId(), id, stream, length); session.allocateResultLob(resultLob, null); resultOut.addLobResult(resultLob); } else if (value instanceof InputStream) { long length = streamLengths[i]; long createLength = length > 0 ? length : 0; blob = session.createBlob(createLength); id = blob.getId(); InputStream stream = (InputStream) value; ResultLob resultLob = ResultLob.newLobCreateBlobRequest(session.getId(), id, stream, length); session.allocateResultLob(resultLob, null); resultOut.addLobResult(resultLob); } else if (value instanceof BlobDataID) { blob = (BlobDataID) value; } parameterValues[i] = blob; } else if (parameterTypes[i].typeCode == Types.SQL_CLOB) { long id; ClobDataID clob = null; if (value instanceof JDBCClobClient) { // check or fix id mismatch clob = ((JDBCClobClient) value).clob; id = clob.getId(); } else if (value instanceof Clob) { long length = ((Clob) value).length(); Reader reader = ((Clob) value).getCharacterStream(); clob = session.createClob(length); id = clob.getId(); ResultLob resultLob = ResultLob.newLobCreateClobRequest(session.getId(), id, reader, length); session.allocateResultLob(resultLob, null); resultOut.addLobResult(resultLob); } else if (value instanceof Reader) { long length = streamLengths[i]; long createLength = length > 0 ? length : 0; clob = session.createClob(createLength); id = clob.getId(); Reader reader = (Reader) value; ResultLob resultLob = ResultLob.newLobCreateClobRequest(session.getId(), id, reader, length); session.allocateResultLob(resultLob, null); resultOut.addLobResult(resultLob); } else if (value instanceof ClobDataID) { clob = (ClobDataID) value; } parameterValues[i] = clob; } } } /** * Internal result producer for JDBCStatement (sqlExecDirect mode). *

* * @throws SQLException when a database access error occurs */ void fetchResult() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } closeResultData(); checkParametersSet(); if (isBatch) { throw Util.sqlExceptionSQL(ErrorCode.X_07505); } // if (isResult) { resultOut.setPreparedResultUpdateProperties(parameterValues); } else { resultOut.setPreparedExecuteProperties(parameterValues, maxRows, fetchSize, rsProperties); } try { performPreExecute(); resultIn = session.execute(resultOut); } catch (HsqlException e) { throw Util.sqlException(e); } finally { performPostExecute(); } if (resultIn.mode == ResultConstants.ERROR) { throw Util.sqlException(resultIn); } if (resultIn.isData()) { currentResultSet = new JDBCResultSet(connection, this, resultIn, resultIn.metaData); } else if (statementRetType == StatementTypes.RETURN_RESULT) { getMoreResults(); } } boolean isAnyParameterSet() { for (int i = 0; i < parameterValues.length; i++) { if (parameterSet[i] != null) { return true; } } return false; } /** * processes chained warnings and any generated columns result set */ void performPostExecute() throws SQLException { super.performPostExecute(); } /** The parameter values for the next non-batch execution. */ protected Object[] parameterValues; /** Flags for bound variables. */ protected Boolean[] parameterSet; /** The SQL types of the parameters. */ protected Type[] parameterTypes; /** The (IN, IN OUT, or OUT) modes of parameters */ protected byte[] parameterModes; /** Lengths for streams. */ protected long[] streamLengths; /** Has a stream on one or more CLOB / BLOB parameter value. */ protected boolean hasStreams; /** Has one or more CLOB / BLOB type parameters. */ protected boolean hasLOBs; /** Is in batch mode. */ protected boolean isBatch; /** Description of result set metadata. */ protected ResultMetaData resultMetaData; /** Description of parameter metadata. */ protected ResultMetaData parameterMetaData; /** This object's one and one ResultSetMetaData object. */ protected JDBCResultSetMetaData resultSetMetaData; // NOTE: pmd is declared as Object to avoid yet another #ifdef. /** This object's one and only ParameterMetaData object. */ protected Object pmd; /** The SQL character sequence that this object represents. */ protected String sql; /** ID of the statement. */ protected long statementID; /** Statement type - whether it generates a row update count or a result set. */ protected int statementRetType; /** Is part of a Result. */ protected final boolean isResult; /** The session attribute of the connection */ protected SessionInterface session; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCSavepoint.java0000644000175000017500000001060412007547356023110 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.sql.SQLException; import java.sql.Savepoint; /* $Id: JDBCSavepoint.java 4286 2011-05-28 14:43:11Z fredt $ */ // Revision 1.10 2006/07/12 12:38:22 boucherb // - full synch up to Mustang b90 /** * The representation of a savepoint, which is a point within * the current transaction that can be referenced from the * Connection.rollback method. When a transaction * is rolled back to a savepoint all changes made after that * savepoint are undone. *

* Savepoints can be either named or unnamed. Unnamed savepoints * are identified by an ID generated by the underlying data source. * * *

*

HSQLDB-Specific Information:

* * SQL 2003 standard does not support unnamed savepoints. However, this * feature is supported from version 2.0.

* * If the connection is autoCommit, setting savepoints has no effect as any * such savepoint is cleared upon the execution of the first transactional * statement.

* *

* * * * @author boucherb@users * @since JDK 1.4, HSQLDB 1.7.2 */ public class JDBCSavepoint implements Savepoint { int id; String name; JDBCConnection connection; JDBCSavepoint(String name, JDBCConnection conn) throws SQLException { if (name == null) { throw Util.nullArgument("name"); } if (conn == null) { throw Util.nullArgument("conn"); } this.name = name; this.id = -1; this.connection = conn; } JDBCSavepoint(JDBCConnection conn) throws SQLException { if (conn == null) { throw Util.nullArgument("conn"); } this.id = conn.getSavepointID(); this.name = "SYSTEM_SAVEPOINT_" + id; this.connection = conn; } /** * Retrieves the generated ID for the savepoint that this * Savepoint object represents. * @return the numeric ID of this savepoint * @exception SQLException if this is a named savepoint * @since 1.4 */ public int getSavepointId() throws SQLException { if (id != -1) { return id; } throw Util.notSupported(); } /** * Retrieves the name of the savepoint that this Savepoint * object represents. * * @return the name of this savepoint * @exception SQLException if this is an un-named savepoint * @since 1.4 */ public String getSavepointName() throws SQLException { if (id == -1) { return name; } throw Util.notSupported(); } public String toString() { return super.toString() + "[name=" + name + "]"; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCColumnMetaData.java0000644000175000017500000001175012007547356024001 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.lang.reflect.Field; // fredt@users - 1.9.0 rewritten as simple structure derived from JDBCResultSetMetaData /** * Provides a site for holding the ResultSetMetaData for individual ResultSet * columns. In 2.0 it is implemented as a simple data structure derived * from calls to JDBCResultSetMetaData methods. * purposes.

* * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0 * @since HSQLDB 1.7.2 */ public final class JDBCColumnMetaData { /** The column's table's catalog name. */ public String catalogName; /** * The fully-qualified name of the Java class whose instances are * manufactured if the method ResultSet.getObject is called to retrieve * a value from the column. */ public String columnClassName; /** The column's normal max width in chars. */ public int columnDisplaySize; /** The suggested column title for use in printouts and displays. */ public String columnLabel; /** The column's name. */ public String columnName; /** The column's SQL type. */ public int columnType; /** The column's value's number of decimal digits. */ public int precision; /** The column's value's number of digits to right of the decimal point. */ public int scale; /** The column's table's schema. */ public String schemaName; /** The column's table's name. */ public String tableName; /** Whether the value of the column are automatically numbered. */ public boolean isAutoIncrement; /** Whether the column's value's case matters. */ public boolean isCaseSensitive; /** Whether the values in the column are cash values. */ public boolean isCurrency; /** Whether a write on the column will definitely succeed. */ public boolean isDefinitelyWritable; /** The nullability of values in the column. */ public int isNullable; /** Whether the column's values are definitely not writable. */ public boolean isReadOnly; /** Whether the column's values can be used in a where clause. */ public boolean isSearchable; /** Whether values in the column are signed numbers. */ public boolean isSigned; /** Whether it is possible for a write on the column to succeed. */ public boolean isWritable; /** * Retrieves a String representation of this object. * * @return a Sring representation of this object */ public String toString() { try { return toStringImpl(); } catch (Exception e) { return super.toString() + "[" + e + "]"; } } /** * Provides the implementation of the toString() method. * * @return a Sring representation of this object */ private String toStringImpl() throws Exception { StringBuffer sb; Field[] fields; Field field; sb = new StringBuffer(); sb.append('['); fields = getClass().getFields(); int len = fields.length; for (int i = 0; i < len; i++) { field = fields[i]; sb.append(field.getName()); sb.append('='); sb.append(field.get(this)); if (i + 1 < len) { sb.append(','); sb.append(' '); } } sb.append(']'); return sb.toString(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCBlob.java0000644000175000017500000007776012007547356022036 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.OutputStream; import java.sql.Blob; import java.sql.SQLException; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.KMPSearchAlgorithm; import org.hsqldb.lib.java.JavaSystem; // boucherb@users 2004-04-xx - patch 1.7.2 - position and truncate methods // implemented; minor changes for moderate thread // safety and optimal performance // boucherb@users 2004-04-xx - doc 1.7.2 - javadocs updated; methods put in // correct (historical, interface declared) order // boucherb@users 2005-12-07 - patch 1.8.0.x - initial JDBC 4.0 support work // boucherb@users 2006-05-22 - doc 1.9.0 - full synch up to Mustang Build 84 // - patch 1.9.0 - setBinaryStream improvement // patch 1.9.0 // - fixed invalid reference to new BinaryStream(...) in getBinaryStream // // patch 1.9.0 - full synch up to Mustang b90 // - better bounds checking // - added support for clients to decide whether getBinaryStream // uses copy of internal byte buffer /** * The representation (mapping) in * the JavaTM programming * language of an SQL * BLOB value. An SQL BLOB is a built-in type * that stores a Binary Large Object as a column value in a row of * a database table. By default drivers implement Blob using * an SQL locator(BLOB), which means that a * Blob object contains a logical pointer to the * SQL BLOB data rather than the data itself. * A Blob object is valid for the duration of the * transaction in which is was created. * *

Methods in the interfaces {@link java.sql.ResultSet}, * {@link java.sql.CallableStatement}, and {@link java.sql.PreparedStatement}, such as * getBlob and setBlob allow a programmer to * access an SQL BLOB value. * The Blob interface provides methods for getting the * length of an SQL BLOB (Binary Large Object) value, * for materializing a BLOB value on the client, and for * determining the position of a pattern of bytes within a * BLOB value. In addition, this interface has methods for updating * a BLOB value. *

* All methods on the Blob interface must be fully implemented if the * JDBC driver supports the data type. * * *

*

HSQLDB-Specific Information:

* * Previous to 2.0, the HSQLDB driver did not implement Blob using an SQL * locator(BLOB). That is, an HSQLDB Blob object did not contain a logical * pointer to SQL BLOB data; rather it directly contained a representation of * the data (a byte array). As a result, an HSQLDB Blob object was itself * valid beyond the duration of the transaction in which is was created, * although it did not necessarily represent a corresponding value * on the database. Also, the interface methods for updating a BLOB value * were unsupported, with the exception of the truncate method, * in that it could be used to truncate the local value.

* * Starting with 2.0, the HSQLDB driver fully supports both local and remote * SQL BLOB data implementations, meaning that an HSQLDB Blob object may * contain a logical pointer to remote SQL BLOB data (see {@link JDBCBlobClient * JDBCBlobClient}) or it may directly contain a local representation of the * data (as implemented in this class). In particular, when the product is built * under JDK 1.6+ and the Blob instance is constructed as a result of calling * JDBCConnection.createBlob(), then the resulting Blob instance is initially * disconnected (is not bound to the transaction scope of the vending Connection * object), the data is contained directly and all interface methods for * updating the BLOB value are supported for local use until the first * invocation of free(); otherwise, an HSQLDB Blob's implementation is * determined at runtime by the driver, it is typically not valid beyond the * duration of the transaction in which is was created, and there no * standard way to query whether it represents a local or remote * value.

* *

* * * @author james house jhouse@part.net * @author boucherb@users * @version 2.0 * @since JDK 1.2, HSQLDB 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 */ public class JDBCBlob implements Blob { /** * Returns the number of bytes in the BLOB value * designated by this Blob object. * @return length of the BLOB in bytes * @exception SQLException if there is an error accessing the * length of the BLOB * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2, HSQLDB 1.7.2 */ public long length() throws SQLException { return getData().length; } /** * Retrieves all or part of the BLOB * value that this Blob object represents, as an array of * bytes. This byte array contains up to length * consecutive bytes starting at position pos. * * *
*

HSQLDB-Specific Information:

* * The official specification above is ambiguous in that it does not * precisely indicate the policy to be observed when * pos > this.length() - length. One policy would be to retrieve the * octets from pos to this.length(). Another would be to throw an * exception. HSQLDB observes the second policy. *

* * @param pos the ordinal position of the first byte in the * BLOB value to be extracted; the first byte is at * position 1 * @param length the number of consecutive bytes to be copied; JDBC 4.1[the value * for length must be 0 or greater] * @return a byte array containing up to length * consecutive bytes from the BLOB value designated * by this Blob object, starting with the * byte at position pos * @exception SQLException if there is an error accessing the * BLOB value; if pos is less than 1 or length is * less than 0 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setBytes * @since JDK 1.2, HSQLDB 1.7.2 */ public byte[] getBytes(long pos, final int length) throws SQLException { final byte[] data = getData(); final int dlen = data.length; if (pos < MIN_POS || pos > MIN_POS + dlen) { throw Util.outOfRangeArgument("pos: " + pos); } pos--; if (length < 0 || length > dlen - pos) { throw Util.outOfRangeArgument("length: " + length); } final byte[] result = new byte[length]; System.arraycopy(data, (int) pos, result, 0, length); return result; } /** * Retrieves the BLOB value designated by this * Blob instance as a stream. * * @return a stream containing the BLOB data * @exception SQLException if there is an error accessing the * BLOB value * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setBinaryStream * @since JDK 1.2, HSQLDB 1.7.2 */ public InputStream getBinaryStream() throws SQLException { return new ByteArrayInputStream(getData()); } /** * Retrieves the byte position at which the specified byte array * pattern begins within the BLOB * value that this Blob object represents. The * search for pattern begins at position * start. * * @param pattern the byte array for which to search * @param start the position at which to begin searching; the * first position is 1 * @return the position at which the pattern appears, else -1 * @exception SQLException if there is an error accessing the * BLOB or if start is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2, HSQLDB 1.7.2 */ public long position(final byte[] pattern, final long start) throws SQLException { final byte[] data = getData(); final int dlen = data.length; if (start < MIN_POS) { throw Util.outOfRangeArgument("start: " + start); } else if (start > dlen || pattern == null) { return -1L; } // by now, we know start <= Integer.MAX_VALUE; final int startIndex = (int) start - 1; final int plen = pattern.length; if (plen == 0 || startIndex > dlen - plen) { return -1L; } final int result = KMPSearchAlgorithm.search(data, pattern, KMPSearchAlgorithm.computeTable(pattern), startIndex); return (result == -1) ? -1 : result + 1; } /** * Retrieves the byte position in the BLOB value * designated by this Blob object at which * pattern begins. The search begins at position * start. * * @param pattern the Blob object designating * the BLOB value for which to search * @param start the position in the BLOB value * at which to begin searching; the first position is 1 * @return the position at which the pattern begins, else -1 * @exception SQLException if there is an error accessing the * BLOB value or if start is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2, HSQLDB 1.7.2 */ public long position(final Blob pattern, long start) throws SQLException { final byte[] data = getData(); final int dlen = data.length; if (start < MIN_POS) { throw Util.outOfRangeArgument("start: " + start); } else if (start > dlen || pattern == null) { return -1L; } // by now, we know start <= Integer.MAX_VALUE; final int startIndex = (int) start - 1; final long plen = pattern.length(); if (plen == 0 || startIndex > ((long) dlen) - plen) { return -1L; } // by now, we know plen <= Integer.MAX_VALUE final int iplen = (int) plen; byte[] bytePattern; if (pattern instanceof JDBCBlob) { bytePattern = ((JDBCBlob) pattern).data(); } else { bytePattern = pattern.getBytes(1L, iplen); } final int result = KMPSearchAlgorithm.search(data, bytePattern, KMPSearchAlgorithm.computeTable(bytePattern), startIndex); return (result == -1) ? -1 : result + 1; } // -------------------------- JDBC 3.0 ----------------------------------- /** * Writes the given array of bytes to the BLOB value that * this Blob object represents, starting at position * pos, and returns the number of bytes written. * The array of bytes will overwrite the existing bytes * in the Blob object starting at the position * pos. If the end of the Blob value is reached * while writing the array of bytes, then the length of the Blob * value will be increased to accommodate the extra bytes. *

* Note: If the value specified for pos * is greater then the length+1 of the BLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 2.0 this feature is supported.

* * When built under JDK 1.6+ and the Blob instance is constructed as a * result of calling JDBCConnection.createBlob(), this operation affects * only the client-side value; it has no effect upon a value stored in a * database because JDBCConnection.createBlob() constructs disconnected, * initially empty Blob instances. To propagate the Blob value to a database * in this case, it is required to supply the Blob instance to an updating * or inserting setXXX method of a Prepared or Callable Statement, or to * supply the Blob instance to an updateXXX method of an updateable * ResultSet.

* * Implementation Notes:

* * Starting with HSQLDB 2.1, JDBCBlob no longer utilizes volatile fields * and is effectively thread safe, but still uses local variable * snapshot isolation.

* * As such, the synchronization policy still does not strictly enforce * serialized read/write access to the underlying data

* * So, if an application may perform concurrent JDBCBlob modifications and * the integrity of the application depends on total order Blob modification * semantics, then such operations should be synchronized on an appropriate * monitor.

* *

* * * @param pos the position in the BLOB object at which * to start writing; the first position is 1 * @param bytes the array of bytes to be written to the BLOB * value that this Blob object represents * @return the number of bytes written * @exception SQLException if there is an error accessing the * BLOB value or if pos is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getBytes * @since JDK 1.4, HSQLDB 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 */ public int setBytes(long pos, byte[] bytes) throws SQLException { if (bytes == null) { throw Util.nullArgument("bytes"); } return (setBytes(pos, bytes, 0, bytes.length)); } /** * Writes all or part of the given byte array to the * BLOB value that this Blob object represents * and returns the number of bytes written. * Writing starts at position pos in the BLOB * value; len bytes from the given byte array are written. * The array of bytes will overwrite the existing bytes * in the Blob object starting at the position * pos. If the end of the Blob value is reached * while writing the array of bytes, then the length of the Blob * value will be increased to accommodate the extra bytes. *

* Note: If the value specified for pos * is greater then the length+1 of the BLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 2.0 this feature is supported.

* * When built under JDK 1.6+ and the Blob instance is constructed as a * result of calling JDBCConnection.createBlob(), this operation affects * only the client-side value; it has no effect upon a value stored in a * database because JDBCConnection.createBlob() constructs disconnected, * initially empty Blob instances. To propagate the Blob value to a database * in this case, it is required to supply the Blob instance to an updating * or inserting setXXX method of a Prepared or Callable Statement, or to * supply the Blob instance to an updateXXX method of an updateable * ResultSet.

* * Implementation Notes:

* * If the value specified for pos * is greater than the length of the BLOB value, then * the BLOB value is extended in length to accept the * written octets and the undefined region up to pos is * filled with (byte)0.

* * Starting with HSQLDB 2.1, JDBCBlob no longer utilizes volatile fields * and is effectively thread safe, but still uses local variable * snapshot isolation.

* * As such, the synchronization policy still does not strictly enforce * serialized read/write access to the underlying data

* * So, if an application may perform concurrent JDBCBlob modifications and * the integrity of the application depends on total order Blob modification * semantics, then such operations should be synchronized on an appropriate * monitor.

* *

* * * @param pos the position in the BLOB object at which * to start writing; the first position is 1 * @param bytes the array of bytes to be written to this BLOB * object * @param offset the offset into the array bytes at which * to start reading the bytes to be set * @param len the number of bytes to be written to the BLOB * value from the array of bytes bytes * @return the number of bytes written * @exception SQLException if there is an error accessing the * BLOB value or if pos is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getBytes * @since JDK 1.4, HSQLDB 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 */ public int setBytes(long pos, byte[] bytes, int offset, int len) throws SQLException { if (!m_createdByConnection) { /** @todo - better error message */ throw Util.notSupported(); } if (bytes == null) { throw Util.nullArgument("bytes"); } if (offset < 0 || offset > bytes.length) { throw Util.outOfRangeArgument("offset: " + offset); } if (len > bytes.length - offset) { throw Util.outOfRangeArgument("len: " + len); } if (pos < MIN_POS || pos > 1L + (Integer.MAX_VALUE - len)) { throw Util.outOfRangeArgument("pos: " + pos); } pos--; byte[] data = getData(); final int dlen = data.length; if ((pos + len) > dlen) { byte[] temp = new byte[(int) pos + len]; System.arraycopy(data, 0, temp, 0, dlen); data = temp; temp = null; } System.arraycopy(bytes, offset, data, (int) pos, len); // paranoia, in case somone free'd us during the array copies. checkClosed(); setData(data); return len; } /** * Retrieves a stream that can be used to write to the BLOB * value that this Blob object represents. The stream begins * at position pos. * The bytes written to the stream will overwrite the existing bytes * in the Blob object starting at the position * pos. If the end of the Blob value is reached * while writing to the stream, then the length of the Blob * value will be increased to accommodate the extra bytes. *

* Note: If the value specified for pos * is greater then the length+1 of the BLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 2.0 this feature is supported.

* * When built under JDK 1.6+ and the Blob instance is constructed as a * result of calling JDBCConnection.createBlob(), this operation affects * only the client-side value; it has no effect upon a value stored in a * database because JDBCConnection.createBlob() constructs disconnected, * initially empty Blob instances. To propagate the Blob value to a database * in this case, it is required to supply the Blob instance to an updating * or inserting setXXX method of a Prepared or Callable Statement, or to * supply the Blob instance to an updateXXX method of an updateable * ResultSet.

* * Implementation Notes:

* * The data written to the stream does not appear in this * Blob until the stream is closed

* * When the stream is closed, if the value specified for pos * is greater than the length of the BLOB value, then * the BLOB value is extended in length to accept the * written octets and the undefined region up to pos is * filled with (byte)0.

* * Starting with HSQLDB 2.1, JDBCBlob no longer utilizes volatile fields * and is effectively thread safe, but still uses local variable * snapshot isolation.

* * As such, the synchronization policy still does not strictly enforce * serialized read/write access to the underlying data

* * So, if an application may perform concurrent JDBCBlob modifications and * the integrity of the application depends on total order Blob modification * semantics, then such operations should be synchronized on an appropriate * monitor.

* *

* * * @param pos the position in the BLOB value at which * to start writing; the first position is 1 * @return a java.io.OutputStream object to which data can * be written * @exception SQLException if there is an error accessing the * BLOB value or if pos is less than 1 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getBinaryStream * @since JDK 1.4, HSQLDB 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 */ public OutputStream setBinaryStream(final long pos) throws SQLException { if (!m_createdByConnection) { /** @todo - Better error message */ throw Util.notSupported(); } if (pos < MIN_POS || pos > MAX_POS) { throw Util.outOfRangeArgument("pos: " + pos); } checkClosed(); return new java.io.ByteArrayOutputStream() { public synchronized void close() throws java.io.IOException { try { JDBCBlob.this.setBytes(pos, toByteArray()); } catch (SQLException se) { throw JavaSystem.toIOException(se); } finally { super.close(); } } }; } /** * Truncates the BLOB value that this Blob * object represents to be len bytes in length. *

* Note: If the value specified for pos * is greater then the length+1 of the BLOB value then the * behavior is undefined. Some JDBC drivers may throw a * SQLException while other drivers may support this * operation. * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 2.0 this feature is fully supported.

* * When built under JDK 1.6+ and the Blob instance is constructed as a * result of calling JDBCConnection.createBlob(), this operation affects * only the client-side value; it has no effect upon a value stored in a * database because JDBCConnection.createBlob() constructs disconnected, * initially empty Blob instances. To propagate the truncated Blob value to * a database in this case, it is required to supply the Blob instance to * an updating or inserting setXXX method of a Prepared or Callable * Statement, or to supply the Blob instance to an updateXXX method of an * updateable ResultSet.

* *

* * * @param len the length, in bytes, to which the BLOB value * that this Blob object represents should be truncated * @exception SQLException if there is an error accessing the * BLOB value or if len is less than 0 * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 */ public void truncate(final long len) throws SQLException { final byte[] data = getData(); if (len < 0 || len > data.length) { throw Util.outOfRangeArgument("len: " + len); } if (len == data.length) { return; } byte[] newData = new byte[(int) len]; System.arraycopy(data, 0, newData, 0, (int) len); checkClosed(); // limit possible race-condition with free() setData(newData); } //------------------------- JDBC 4.0 ----------------------------------- /** * This method frees the Blob object and releases the resources that * it holds. The object is invalid once the free * method is called. *

* After free has been called, any attempt to invoke a * method other than free will result in a SQLException * being thrown. If free is called multiple times, the subsequent * calls to free are treated as a no-op. *

* * @throws SQLException if an error occurs releasing * the Blob's resources * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ public synchronized void free() throws SQLException { m_closed = true; m_data = null; } /** * Returns an InputStream object that contains a partial Blob value, * starting with the byte specified by pos, which is length bytes in length. * * @param pos the offset to the first byte of the partial value to be retrieved. * The first byte in the Blob is at position 1 * @param length the length in bytes of the partial value to be retrieved * @return InputStream through which the partial Blob value can be read. * @throws SQLException if pos is less than 1 or if pos is greater than the number of bytes * in the Blob or if pos + length is greater than the number of bytes * in the Blob * * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ public InputStream getBinaryStream(long pos, long length) throws SQLException { final byte[] data = getData(); final int dlen = data.length; if (pos < MIN_POS || pos > dlen) { throw Util.outOfRangeArgument("pos: " + pos); } pos--; if (length < 0 || length > dlen - pos) { throw Util.outOfRangeArgument("length: " + length); } if (pos == 0 && length == dlen) { return new ByteArrayInputStream(data); } final byte[] result = new byte[(int) length]; System.arraycopy(data, (int) pos, result, 0, (int) length); return new ByteArrayInputStream(result); } // ---------------------- internal implementation -------------------------- public static final long MIN_POS = 1L; public static final long MAX_POS = 1L + (long) Integer.MAX_VALUE; private boolean m_closed; private byte[] m_data; private final boolean m_createdByConnection; /** * Constructs a new JDBCBlob instance wrapping the given octet sequence.

* * This constructor is used internally to retrieve result set values as * Blob objects, yet it must be public to allow access from other packages. * As such (in the interest of efficiency) this object maintains a reference * to the given octet sequence rather than making a copy; special care * should be taken by external clients never to use this constructor with a * byte array object that may later be modified externally. * * @param data the octet sequence representing the Blob value * @throws SQLException if the argument is null */ public JDBCBlob(final byte[] data) throws SQLException { if (data == null) { throw Util.nullArgument(); } m_data = data; m_createdByConnection = false; } protected JDBCBlob() { m_data = new byte[0]; m_createdByConnection = true; } protected synchronized void checkClosed() throws SQLException { if (m_closed) { throw Util.sqlException(ErrorCode.X_07501); } } protected byte[] data() throws SQLException { return getData(); } private synchronized byte[] getData() throws SQLException { checkClosed(); return m_data; } private synchronized void setData(byte[] data) throws SQLException { checkClosed(); m_data = data; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCCommonDataSource.java0000644000175000017500000002541612007547356024352 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.PrintWriter; import java.io.Serializable; import java.sql.SQLException; import java.util.Properties; //#ifdef JAVA6 import javax.sql.CommonDataSource; //#endif JAVA6 /** * Common base for DataSource implementations. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since JDK 1.2, HSQLDB 2.0 * @revised JDK 1.7, HSQLDB 2.0.1 */ //#ifdef JAVA6 public abstract class JDBCCommonDataSource implements CommonDataSource, Serializable { //#else /* public abstract class JDBCCommonDataSource implements Serializable { */ //#endif JAVA6 /** *

Retrieves the log writer for this DataSource * object. * *

The log writer is a character output stream to which all logging * and tracing messages for this data source will be * printed. This includes messages printed by the methods of this * object, messages printed by methods of other objects manufactured * by this object, and so on. Messages printed to a data source * specific log writer are not printed to the log writer associated * with the java.sql.DriverManager class. When a * DataSource object is * created, the log writer is initially null; in other words, the * default is for logging to be disabled. * * @return the log writer for this data source or null if * logging is disabled * @exception java.sql.SQLException if a database access error occurs * @see #setLogWriter * @since 1.4 */ public PrintWriter getLogWriter() throws SQLException { return logWriter; } /** *

Sets the log writer for this DataSource * object to the given java.io.PrintWriter object. * *

The log writer is a character output stream to which all logging * and tracing messages for this data source will be * printed. This includes messages printed by the methods of this * object, messages printed by methods of other objects manufactured * by this object, and so on. Messages printed to a data source- * specific log writer are not printed to the log writer associated * with the java.sql.DriverManager class. When a * DataSource object is created the log writer is * initially null; in other words, the default is for logging to be * disabled. * * @param out the new log writer; to disable logging, set to null * @exception SQLException if a database access error occurs * @see #getLogWriter * @since 1.4 */ public void setLogWriter(java.io.PrintWriter out) throws SQLException { logWriter = out; } /** *

Sets the maximum time in seconds that this data source will wait * while attempting to connect to a database. A value of zero * specifies that the timeout is the default system timeout * if there is one; otherwise, it specifies that there is no timeout. * When a DataSource object is created, the login timeout is * initially zero. * * @param seconds the data source login time limit * @exception SQLException if a database access error occurs. * @see #getLoginTimeout * @since 1.4 */ public void setLoginTimeout(int seconds) throws SQLException { loginTimeout = seconds; connectionProps.setProperty("loginTimeout", Integer.toString(loginTimeout)); } /** * Gets the maximum time in seconds that this data source can wait * while attempting to connect to a database. A value of zero * means that the timeout is the default system timeout * if there is one; otherwise, it means that there is no timeout. * When a DataSource object is created, the login timeout is * initially zero. * * @return the data source login time limit * @exception SQLException if a database access error occurs. * @see #setLoginTimeout * @since 1.4 */ public int getLoginTimeout() throws SQLException { return loginTimeout; } // ------------------------ custom public methods ------------------------ /** * Retrieves the description of the data source.

* * @return the description */ public String getDescription() { return description; } /** * Retrieves the name of the data source.

* * @return the description */ public String getDataSourceName() { return dataSourceName; } /** * Retrieves the network protocol of the data source.

* * @return the network protocol */ public String getNetworkProtocol() { return networkProtocol; } /** * Retrieves the server name attribute.

* * @return the server name attribute */ public String getServerName() { return serverName; } /** * Synonym for getUrl(). * * @return the jdbc database connection url attribute */ public String getDatabaseName() { return url; } /** * Synonym for getUrl(). * * @return the jdbc database connection url attribute */ public String getDatabase() { return url; } /** * Retrieves the jdbc database connection url attribute.

* * @return the jdbc database connection url attribute */ public String getUrl() { return url; } /** * Retrieves the user name for the connection.

* * @return the username for the connection */ public String getUser() { return user; } /** * Synonym for setUrl(String).

* * @param databaseName the new value for the attribute */ public void setDatabaseName(String databaseName) { this.url = databaseName; } /** * Synonym for setUrl(String).

* * @param database the new value for the attribute */ public void setDatabase(String database) { this.url = database; } /** * Sets the jdbc database URL.

* * @param url the new value of this object's jdbc database connection * url attribute */ public void setUrl(String url) { this.url = url; } /** * Sets the password for the user name. * * @param password the password */ public void setPassword(String password) { this.password = password; connectionProps.setProperty("password", password); } /** * Sets the user name. * * @param user the user id */ public void setUser(String user) { this.user = user; connectionProps.setProperty("user", user); } /** * Sets connection properties. If user / password / logginTimeout has been * set with one of the setXXX() methods it will be added to the Properties * object. * * @param props properties. If null, then existing properties will be * cleared/replaced. */ public void setProperties(Properties props) { connectionProps = (props == null) ? new Properties() : (Properties) props.clone(); if (user != null) { props.setProperty("user", user); } if (password != null) { props.setProperty("password", password); } if (loginTimeout != 0) { props.setProperty("loginTimeout", Integer.toString(loginTimeout)); } } //------------------------- JDBC 4.1 ----------------------------------- /** * Return the parent Logger of all the Loggers used by this data source. This * should be the Logger farthest from the root Logger that is * still an ancestor of all of the Loggers used by this data source. Configuring * this Logger will affect all of the log messages generated by the data source. * In the worst case, this may be the root Logger. * * @return the parent Logger for this data source * @throws SQLFeatureNotSupportedException if the data source does not use java.util.logging. * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ //#ifdef JAVA6 public java.util.logging.Logger getParentLogger() throws java.sql.SQLFeatureNotSupportedException { throw (java.sql.SQLFeatureNotSupportedException) Util.notSupported(); } //#endif // ------------------------ internal implementation ------------------------ protected Properties connectionProps = new Properties(); /** description of data source - informational */ protected String description = null; /** name of data source - informational */ protected String dataSourceName = null; /** name of server - informational */ protected String serverName = null; /** network protocol - informational */ protected String networkProtocol = null; /** login timeout */ protected int loginTimeout = 0; /** log writer */ protected transient PrintWriter logWriter; /** connection user */ protected String user = null; /** connection password */ protected String password = null; /** database URL */ protected String url = null; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCNClob.java0000644000175000017500000000705312007547356022141 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.sql.NClob; /** * The mapping in the JavaTM programming language * for the SQL NCLOB type. * An SQL NCLOB is a built-in type * that stores a Character Large Object using the National Character Set * as a column value in a row of a database table. *

The NClob interface extends the Clob interface * which provides provides methods for getting the * length of an SQL NCLOB value, * for materializing a NCLOB value on the client, and for * searching for a substring or NCLOB object within a * NCLOB value. A NClob object, just like a Clob object, is valid for the duration * of the transaction in which it was created. * Methods in the interfaces {@link java.sql.ResultSet}, * {@link java.sql.CallableStatement}, and {@link java.sql.PreparedStatement}, such as * getNClob and setNClob allow a programmer to * access an SQL NCLOB value. In addition, this interface * has methods for updating a NCLOB value. * * *

*

HSQLDB-Specific Information:

* * First, it should be noted that since HSQLDB represents all character data * internally as Java UNICODE (UTF16) String objects, there is not currently any * appreciable difference between the HSQLDB XXXCHAR types and the SQL 2003 * NXXXCHAR and NCLOB types.

* * See {@link org.hsqldb.jdbc.JDBCClob} for further information. * *

* * * @since JDK 1.6, HSQLDB 2.0 * @author boucherb@users * @see JDBCClob * @see JDBCClobClient */ public class JDBCNClob extends JDBCClob implements NClob { protected JDBCNClob() { super(); } public JDBCNClob(String data) throws java.sql.SQLException { super(data); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCPool.java0000644000175000017500000004547112007547356022063 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.Serializable; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.sql.Wrapper; import java.util.concurrent.atomic.AtomicIntegerArray; import java.util.Properties; import javax.sql.StatementEventListener; import javax.sql.StatementEvent; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.Referenceable; import javax.naming.StringRefAddr; import javax.sql.ConnectionEventListener; import javax.sql.ConnectionEvent; import javax.sql.DataSource; import javax.sql.PooledConnection; import org.hsqldb.jdbc.pool.JDBCPooledDataSource; import org.hsqldb.jdbc.pool.JDBCPooledConnection; /** * *
*

HSQLDB-Specific Information:

* * A connection pool for HyperSQL connections. This implementation of * {@link javax.sql.DataSource DataSource} is dedicated to HyperSQL and * guarantees all connection states are automatically reset when a connection * is reused.

* * The methods of the parent class, * {@link JDBCCommonDataSource} are used to specify the database URL, user, * password, and / or connection properties.

* *

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 2.2.9 */ @SuppressWarnings("serial") public class JDBCPool implements DataSource, Serializable, Referenceable, ConnectionEventListener, StatementEventListener, Wrapper { /** * Retrieves a new connection using the properties that have already been * set. * * @return a connection to the data source * @exception SQLException if a database access error occurs */ public Connection getConnection() throws SQLException { int retries = 300; if (source.loginTimeout != 0){ retries = source.loginTimeout * 10; } if (closed) { throw new SQLException("connection pool is closed"); } for (int count = 0; count < retries; count++) { for (int i = 0; i < states.length(); i++) { if (states.compareAndSet(i, RefState.available, RefState.allocated)) { return connections[i].getConnection(); } if (states.compareAndSet(i, RefState.empty, RefState.allocated)) { try { JDBCPooledConnection connection = (JDBCPooledConnection) source.getPooledConnection(); connection.addConnectionEventListener(this); connection.addStatementEventListener(this); connections[i] = connection; return connections[i].getConnection(); } catch (SQLException e) { states.set(i, RefState.empty); } } } try { Thread.sleep(100); } catch (InterruptedException e) {} } throw Util.invalidArgument(); } /** * Retrieves a new connection using the given username and password, * and the database url that has been set. No other properties are * used for the connection * * @param username the database user on whose behalf the connection is * being made * @param password the user's password * @return a connection to the data source * @exception SQLException if a database access error occurs */ public Connection getConnection(String username, String password) throws SQLException { return source.getPooledConnection(username, password).getConnection(); } // ------------------------- JDBC 4.0 ----------------------------------- // ------------------- java.sql.Wrapper implementation --------------------- /** * Returns an object that implements the given interface to allow access to * non-standard methods, or standard methods not exposed by the proxy. * * If the receiver implements the interface then the result is the receiver * or a proxy for the receiver. If the receiver is a wrapper * and the wrapped object implements the interface then the result is the * wrapped object or a proxy for the wrapped object. Otherwise return the * the result of calling unwrap recursively on the wrapped object * or a proxy for that result. If the receiver is not a * wrapper and does not implement the interface, then an SQLException is thrown. * * @param iface A Class defining an interface that the result must implement. * @return an object that implements the interface. May be a proxy for the actual implementing object. * @throws java.sql.SQLException If no object found that implements the interface * @since JDK 1.6, HSQLDB 2.0 */ @SuppressWarnings("unchecked") public T unwrap(java.lang.Class iface) throws java.sql.SQLException { if (isWrapperFor(iface)) { return (T) this; } throw Util.invalidArgument("iface: " + iface); } /** * Returns true if this either implements the interface argument or is directly or indirectly a wrapper * for an object that does. Returns false otherwise. If this implements the interface then return true, * else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped * object. If this does not implement the interface and is not a wrapper, return false. * This method should be implemented as a low-cost operation compared to unwrap so that * callers can use this method to avoid expensive unwrap calls that may fail. If this method * returns true then calling unwrap with the same argument should succeed. * * @param iface a Class defining an interface. * @return true if this implements the interface or directly or indirectly wraps an object that does. * @throws java.sql.SQLException if an error occurs while determining whether this is a wrapper * for an object with the given interface. * @since JDK 1.6, HSQLDB 2.0 */ public boolean isWrapperFor(java.lang.Class iface) throws java.sql.SQLException { return ((iface != null) && iface.isAssignableFrom(this.getClass())); } /** * Retrieves the Reference of this object. * * @return The non-null Reference of this object. * @exception NamingException If a naming exception was encountered * while retrieving the reference. */ public Reference getReference() throws NamingException { String cname = "org.hsqldb.jdbc.JDBCDataSourceFactory"; Reference ref = new Reference(getClass().getName(), cname, null); ref.add(new StringRefAddr("database", source.getDatabase())); ref.add(new StringRefAddr("user", source.getUser())); ref.add(new StringRefAddr("password", source.password)); ref.add(new StringRefAddr("loginTimeout", Integer.toString(source.loginTimeout))); ref.add(new StringRefAddr("poolSize", Integer.toString(connections.length))); return ref; } // ------------------------ event listener ------------------------ public void connectionClosed(ConnectionEvent event) { PooledConnection connection = (PooledConnection) event.getSource(); for (int i = 0; i < connections.length; i++) { if (connections[i] == connection) { states.set(i, RefState.available); break; } } } public void connectionErrorOccurred(ConnectionEvent event) { PooledConnection connection = (PooledConnection) event.getSource(); for (int i = 0; i < connections.length; i++) { if (connections[i] == connection) { states.set(i, RefState.allocated); connections[i] = null; states.set(i, RefState.empty); break; } } } public void statementClosed(StatementEvent event) {} public void statementErrorOccurred(StatementEvent event) {} // ------------------------ event listener ------------------------ /** *

Retrieves the log writer for this DataSource * object. * *

The log writer is a character output stream to which all logging * and tracing messages for this data source will be * printed. This includes messages printed by the methods of this * object, messages printed by methods of other objects manufactured * by this object, and so on. Messages printed to a data source * specific log writer are not printed to the log writer associated * with the java.sql.DriverManager class. When a * DataSource object is * created, the log writer is initially null; in other words, the * default is for logging to be disabled. * * @return the log writer for this data source or null if * logging is disabled * @exception java.sql.SQLException if a database access error occurs * @see #setLogWriter * @since 1.4 */ public PrintWriter getLogWriter() throws SQLException { return source.getLogWriter(); } /** *

Sets the log writer for this DataSource * object to the given java.io.PrintWriter object. * *

The log writer is a character output stream to which all logging * and tracing messages for this data source will be * printed. This includes messages printed by the methods of this * object, messages printed by methods of other objects manufactured * by this object, and so on. Messages printed to a data source- * specific log writer are not printed to the log writer associated * with the java.sql.DriverManager class. When a * DataSource object is created the log writer is * initially null; in other words, the default is for logging to be * disabled. * * @param out the new log writer; to disable logging, set to null * @exception SQLException if a database access error occurs * @see #getLogWriter * @since 1.4 */ public void setLogWriter(java.io.PrintWriter out) throws SQLException { source.setLogWriter(out); } /** *

Sets the maximum time in seconds that this data source will wait * while attempting to connect to a database. A value of zero * specifies that the timeout is the default system timeout * if there is one; otherwise, it specifies that there is no timeout. * When a DataSource object is created, the login timeout is * initially zero. * * @param seconds the data source login time limit * @exception SQLException if a database access error occurs. * @see #getLoginTimeout * @since 1.4 */ public void setLoginTimeout(int seconds) throws SQLException { source.setLoginTimeout(seconds); } /** * Gets the maximum time in seconds that this data source can wait * while attempting to connect to a database. A value of zero * means that the timeout is the default system timeout * if there is one; otherwise, it means that there is no timeout. * When a DataSource object is created, the login timeout is * initially zero. * * @return the data source login time limit * @exception SQLException if a database access error occurs. * @see #setLoginTimeout * @since 1.4 */ public int getLoginTimeout() throws SQLException { return source.getLoginTimeout(); } // ------------------------ custom public methods ------------------------ /** * Retrieves the description of the data source.

* * @return the description */ public String getDescription() { return "org.hsqldb.jdbc.JDBCPool max size " + connections.length; } /** * Retrieves the name of the data source.

* * @return the description */ public String getDataSourceName() { return "org.hsqldb.jdbc.JDBCPool"; } /** * Synonym for getUrl(). * * @return the jdbc database connection url attribute */ public String getDatabaseName() { return source.getUrl(); } /** * Synonym for getUrl(). * * @return the jdbc database connection url attribute */ public String getDatabase() { return source.getDatabase(); } /** * Retrieves the jdbc database connection url attribute.

* * @return the jdbc database connection url attribute */ public String getUrl() { return source.getUrl(); } /** * Retrieves the user name for the connection.

* * @return the username for the connection */ public String getUser() { return source.getUser(); } /** * Synonym for setUrl(String).

* * @param databaseName the new value for the attribute */ public void setDatabaseName(String databaseName) { source.setDatabaseName(databaseName); } /** * Synonym for setUrl(String).

* * @param database the new value for the attribute */ public void setDatabase(String database) { source.setDatabase(database); } /** * Sets the jdbc database URL.

* * @param url the new value of this object's jdbc database connection * url attribute */ public void setUrl(String url) { source.setUrl(url); } /** * Sets the password for the user name. * * @param password the password */ public void setPassword(String password) { source.setPassword(password); } /** * Sets the user name. * * @param user the user id */ public void setUser(String user) { source.setUser(user); } /** * Sets connection properties. If user / password / logginTimeout has been * set with one of the setXXX() methods it will be added to the Properties * object. * * @param props properties. If null, then existing properties will be * cleared/replaced. */ public void setProperties(Properties props) { source.setProperties(props); } //------------------------- JDBC 4.1 ----------------------------------- /** * Return the parent Logger of all the Loggers used by this data source. This * should be the Logger farthest from the root Logger that is * still an ancestor of all of the Loggers used by this data source. Configuring * this Logger will affect all of the log messages generated by the data source. * In the worst case, this may be the root Logger. * * @return the parent Logger for this data source * @throws SQLFeatureNotSupportedException if the data source does not use java.util.logging. * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.2.9 */ //#ifdef JAVA6 public java.util.logging.Logger getParentLogger() throws java.sql.SQLFeatureNotSupportedException { throw (java.sql.SQLFeatureNotSupportedException) Util.notSupported(); } // ------------------------ custom public methods ------------------------ /** * Creates a connection pool with the maximum size of 8. The database and * connection settings are made before the {@link #getConnection()} is called. */ public JDBCPool() { this(10); } /** * Creates a connection pool with the given maximum size. The database and * connection settings are made before the {@link #getConnection()} is called. * * @param size int maximum size of the pool */ public JDBCPool(int size) { source = new JDBCPooledDataSource(); connections = new JDBCPooledConnection[size]; states = new AtomicIntegerArray(size); } /** * Closes the pool immediately. Waits the given number of seconds before * closing all existing connections in the pool. * * @param wait int number of seconds to wait before closing the connections, maximum 60 seconds * @throws SQLException */ public void close(int wait) throws SQLException { if (wait <0 || wait > 60) { throw Util.outOfRangeArgument(); } if (closed) { return; } closed = true; try { Thread.sleep(1000 * wait); } catch (Throwable t) {} for (int i = 0; i < connections.length; i++) { if (connections[i] != null) { connections[i].release(); } } for (int i = 0; i < connections.length; i++) { connections[i] = null; } } // ------------------------ internal ------------------------ interface RefState { int empty = 0; int available = 1; int allocated = 2; } AtomicIntegerArray states; JDBCPooledConnection[] connections; JDBCPooledDataSource source; volatile boolean closed; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCSQLXML.java0000644000175000017500000035246312007547356022174 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.CharArrayReader; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.StringReader; import java.io.Writer; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.nio.charset.Charset; import java.sql.SQLException; import java.sql.SQLXML; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import javax.xml.bind.util.JAXBResult; import javax.xml.bind.util.JAXBSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stax.StAXResult; import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ClosableByteArrayOutputStream; import org.hsqldb.lib.StringConverter; import org.w3c.dom.DOMException; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.EntityReference; import org.w3c.dom.Node; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.w3c.dom.bootstrap.DOMImplementationRegistry; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; /* $Id: JDBCSQLXML.java 4319 2011-06-10 12:44:08Z fredt $ */ /** * * The mapping in the JavaTM programming language for the SQL XML type. * XML is a built-in type that stores an XML value * as a column value in a row of a database table. * By default drivers implement an SQLXML object as * a logical pointer to the XML data * rather than the data itself. * An SQLXML object is valid for the duration of the transaction in which it was created. *

* The SQLXML interface provides methods for accessing the XML value * as a String, a Reader or Writer, or as a Stream. The XML value * may also be accessed through a Source or set as a Result, which * are used with XML Parser APIs such as DOM, SAX, and StAX, as * well as with XSLT transforms and XPath evaluations. *

* Methods in the interfaces ResultSet, CallableStatement, and PreparedStatement, * such as getSQLXML allow a programmer to access an XML value. * In addition, this interface has methods for updating an XML value. *

* The XML value of the SQLXML instance may be obtained as a BinaryStream using *

 *   SQLXML sqlxml = resultSet.getSQLXML(column);
 *   InputStream binaryStream = sqlxml.getBinaryStream();
 * 
* For example, to parse an XML value with a DOM parser: *
 *   DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
 *   Document result = parser.parse(binaryStream);
 * 
* or to parse an XML value with a SAX parser to your handler: *
 *   SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
 *   parser.parse(binaryStream, myHandler);
 * 
* or to parse an XML value with a StAX parser: *
 *   XMLInputFactory factory = XMLInputFactory.newInstance();
 *   XMLStreamReader streamReader = factory.createXMLStreamReader(binaryStream);
 * 
*

* Because databases may use an optimized representation for the XML, * accessing the value through getSource() and * setResult() can lead to improved processing performance * without serializing to a stream representation and parsing the XML. *

* For example, to obtain a DOM Document Node: *

 *   DOMSource domSource = sqlxml.getSource(DOMSource.class);
 *   Document document = (Document) domSource.getNode();
 * 
* or to set the value to a DOM Document Node to myNode: *
 *   DOMResult domResult = sqlxml.setResult(DOMResult.class);
 *   domResult.setNode(myNode);
 * 
* or, to send SAX events to your handler: *
 *   SAXSource saxSource = sqlxml.getSource(SAXSource.class);
 *   XMLReader xmlReader = saxSource.getXMLReader();
 *   xmlReader.setContentHandler(myHandler);
 *   xmlReader.parse(saxSource.getInputSource());
 * 
* or, to set the result value from SAX events: *
 *   SAXResult saxResult = sqlxml.setResult(SAXResult.class);
 *   ContentHandler contentHandler = saxResult.getXMLReader().getContentHandler();
 *   contentHandler.startDocument();
 *   // set the XML elements and attributes into the result
 *   contentHandler.endDocument();
 * 
* or, to obtain StAX events: *
 *   StAXSource staxSource = sqlxml.getSource(StAXSource.class);
 *   XMLStreamReader streamReader = staxSource.getXMLStreamReader();
 * 
* or, to set the result value from StAX events: *
 *   StAXResult staxResult = sqlxml.getResult(StAXResult.class);
 *   XMLStreamWriter streamWriter = staxResult.getXMLStreamWriter();
 * 
* or, to perform XSLT transformations on the XML value using the XSLT in xsltFile * output to file resultFile: *
 *   File xsltFile = new File("a.xslt");
 *   File myFile = new File("result.xml");
 *   Transformer xslt = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltFile));
 *   Source source = sqlxml.getSource(null);
 *   Result result = new StreamResult(myFile);
 *   xslt.transform(source, result);
 * 
* or, to evaluate an XPath expression on the XML value: *
 *   XPath xpath = XPathFactory.newInstance().newXPath();
 *   DOMSource domSource = sqlxml.getSource(DOMSource.class);
 *   Document document = (Document) domSource.getNode();
 *   String expression = "/foo/@bar";
 *   String barValue = xpath.evaluate(expression, document);
 * 
* To set the XML value to be the result of an XSLT transform: *
 *   File sourceFile = new File("source.xml");
 *   Transformer xslt = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltFile));
 *   Source streamSource = new StreamSource(sourceFile);
 *   Result result = sqlxml.setResult(null);
 *   xslt.transform(streamSource, result);
 * 
* Any Source can be transformed to a Result using the identity transform * specified by calling newTransformer(): *
 *   Transformer identity = TransformerFactory.newInstance().newTransformer();
 *   Source source = sqlxml.getSource(null);
 *   File myFile = new File("result.xml");
 *   Result result = new StreamResult(myFile);
 *   identity.transform(source, result);
 * 
* To write the contents of a Source to standard output: *
 *   Transformer identity = TransformerFactory.newInstance().newTransformer();
 *   Source source = sqlxml.getSource(null);
 *   Result result = new StreamResult(System.out);
 *   identity.transform(source, result);
 * 
* To create a DOMSource from a DOMResult: *
 *    DOMSource domSource = new DOMSource(domResult.getNode());
 * 
*

* Incomplete or invalid XML values may cause an SQLException when * set or the exception may occur when execute() occurs. All streams * must be closed before execute() occurs or an SQLException will be thrown. *

* Reading and writing XML values to or from an SQLXML object can happen at most once. * The conceptual states of readable and not readable determine if one * of the reading APIs will return a value or throw an exception. * The conceptual states of writable and not writable determine if one * of the writing APIs will set a value or throw an exception. *

* The state moves from readable to not readable once free() or any of the * reading APIs are called: getBinaryStream(), getCharacterStream(), getSource(), and getString(). * Implementations may also change the state to not writable when this occurs. *

* The state moves from writable to not writeable once free() or any of the * writing APIs are called: setBinaryStream(), setCharacterStream(), setResult(), and setString(). * Implementations may also change the state to not readable when this occurs. *

* All methods on the SQLXML interface must be fully implemented if the * JDBC driver supports the data type. * * * *

*

HSQLDB-Specific Information:

* * Starting with HSQLDB 2.0, a rudimentary client-side SQLXML interface * implementation (this class) is supported for local use when the product is * built and run under JDK 1.6+ and the SQLXML instance is constructed as the * result of calling JDBCConnection.createSQLXML().

* * SQLXML instances retrieved in such a fashion are initially write-only, with * the lifecycle of read and write availability constrained in accordance with * the documentation of the interface methods.

* * When build and run under JDK 1.6+, it is also possible to retrieve read-only * SQLXML instances from JDBCResultSet.getSQLXML(...), given that the underlying * data can be converted to an XML Document Object Model (DOM).

* * However, at the time of this writing (2007-06-12) it is not yet possible to * store SQLXML objects directly into an HSQLDB database or to use them directly * for HSQLDB statement parameterization purposes. This is because the SQLXML * data type is not yet natively supported by the HSQLDB engine. Instead, a * JDBCSQLXML instance must first be read as a string, binary input stream, * character input stream and so on, which can then be used for such purposes.

* * Here is the current read/write availability lifecycle for JDBCSQLXML: * *

* * * * * * * * * * * * * * * * * * * * * * * * * *
* Origin * * Initially * * After 1st Write * * After 1st Read * * After 1st Free *
* org.hsqldb.jdbc.JDBCConnection.createSQLXML() * * Write-only * * Read-only * * Not readable or writable * * Not readable or writable *
* org.hsqldb.jdbc.JDBCResultSet.getSQLXML(...) * * Read-only * * N/A * * Not readable or writable * * Not readable or writable *
* * * * @author boucherb@users * @see javax.xml.parsers * @see javax.xml.stream * @see javax.xml.transform * @see javax.xml.xpath * @since JDK 1.6, HSQLDB 2.0 * @revised Mustang Build 79 */ public class JDBCSQLXML implements SQLXML { private static String domFeatures = "XML 3.0 Traversal +Events 2.0"; private static DOMImplementation domImplementation; private static DOMImplementationRegistry domImplementationRegistry; private static ThreadPoolExecutor executorService; private static Transformer identityTransformer; private static TransformerFactory transformerFactory; /** * Precomputed Charset to reduce octect to character sequence conversion * charset lookup overhead. */ private static final Charset utf8Charset; private static ArrayBlockingQueue workQueue; static { Charset charset = null; try { charset = Charset.forName("UTF8"); } catch (Exception e) { } utf8Charset = charset; } /** * When non-null, the SAX ContentHandler currently in use to build this * object's SQLXML value from a SAX event sequence. */ private SAX2DOMBuilder builder; /** * Whether this object is closed. When closed, no further reading * or writing is possible. */ private boolean closed; // ------------------------- Internal Implementation ----------------------- /** * This object's SQLXML value as a GZIPed byte array */ private volatile byte[] gzdata; /** * When non-null, the stream currently in use to read this object's * SQLXML value as an octet sequence. */ private InputStream inputStream; /** * When non-null, the stream currently in use to write this object's * SQLXML value from an octet sequence. */ private ClosableByteArrayOutputStream outputStream; /** * When non-null, the DOMResult currently in use to build this object's * SQLXML value. */ private DOMResult domResult; /** * This object's public id */ private String publicId; /** * Whether it is possible to read this object's SQLXML value. */ private boolean readable; /** * This object's system id */ private String systemId; /** * Whether it is possible to write this object's SQLXML value. */ private boolean writable; /** * Constructs a new, initially write-only JDBCSQLXML object.

*/ protected JDBCSQLXML() { setReadable(false); setWritable(true); } /** * Constructs a new read-only JDBCSQLXML object from the given octet * sequence.

* * @param bytes the octet sequence representing the SQLXML value * @throws SQLException if the argument does not represent a * valid SQLXML value */ protected JDBCSQLXML(byte[] bytes) throws SQLException { this(bytes, null); } /** * Constructs a new read-only JDBCSQLXML object from the given character * sequence.

* * @param chars the character sequence representing the SQLXML value * @throws SQLException if the argument does not represent a * valid SQLXML value */ protected JDBCSQLXML(char[] chars) throws SQLException { this(chars, 0, chars.length, null); } /** * Constructs a new JDBCSQLXML object from the given Document.

* * @param document the Document representing the SQLXML value * @throws java.sql.SQLException if the argument does not represent a * valid SQLXML value */ protected JDBCSQLXML(Document document) throws SQLException { this(new DOMSource(document)); } /** * Constructs a new read-only JDBCSQLXML object from the given octet * sequence.

* * Relative URI references will be resolved against the present working * directory reported by the Java virtual machine.

* * @param inputStream an octet stream representing an SQLXML value * @throws SQLException if the argument does not represent a * valid SQLXML value */ protected JDBCSQLXML(InputStream inputStream) throws SQLException { this(inputStream, null); } /** * Constructs a new read-only JDBCSQLXML object from the given character * sequence.

* * Relative URI references will be resolved against the present working * directory reported by the Java virtual machine.

* * Note:Normally, a byte stream should be used rather than a reader, * so that the XML parser can resolve character encoding specified by the * XML declaration. However, in many cases the encoding of the input stream * is already resolved, as in the case of reading XML from a StringReader. * * @param reader a character stream representing an SQLXML value * @throws SQLException if the argument does not represent a * valid SQLXML value */ protected JDBCSQLXML(Reader reader) throws SQLException { this(reader, null); } /** * Constructs a new read-only JDBCSQLXML object from the given Source * object.

* * @param source a Source representing an SQLXML value * @throws SQLException if the argument does not represent a * valid SQLXML value */ public JDBCSQLXML(Source source) throws SQLException { init(source); } /** * Constructs a new read-only JDBCSQLXML object from the given character * sequence.

* * Relative URI references will be resolved against the present working * directory reported by the Java virtual machine.

* * @param string a character sequence representing an SQLXML value * @throws SQLException if the argument does not represent a * valid SQLXML value */ protected JDBCSQLXML(String string) throws SQLException { this(new StreamSource(new StringReader(string))); } /** * Constructs a new read-only JDBCSQLXML object from the given octet * sequence.

* * @param bytes the octet sequence representing the SQLXML value * @param systemId must be a String that conforms to the URI syntax; * allows relative URIs to be processed. * @throws SQLException if the argument does not represent a * valid SQLXML value */ protected JDBCSQLXML(byte[] bytes, String systemId) throws SQLException { this(new StreamSource(new ByteArrayInputStream(bytes), systemId)); } protected JDBCSQLXML(char[] chars, String systemId) throws SQLException { this(chars, 0, chars.length, systemId); } /** * Constructs a new read-only JDBCSQLXML object from the given octet * sequence.

* * Relative URI references will be resolved against the given systemId.

* * @param inputStream an octet stream representing an SQLXML value * @param systemId a String that conforms to the URI syntax, indicating * the URI from which the XML data is being read, so that relative URI * references can be resolved * @throws SQLException if the argument does not represent a * valid SQLXML value */ protected JDBCSQLXML(InputStream inputStream, String systemId) throws SQLException { this(new StreamSource(inputStream, systemId)); } /** * Constructs a new read-only JDBCSQLXML object from the given character * sequence.

* * Relative URI references will be resolved against the given systemId.

* * Note:Normally, a byte stream should be used rather than a reader, * so that the XML parser can resolve character encoding specified by the * XML declaration. However, in many cases the encoding of the input stream * is already resolved, as in the case of reading XML from a StringReader. * * @param reader a character stream representing an SQLXML value; * @param systemId a String that conforms to the URI syntax, indicating * the URI from which the XML data is being read, so that relative URI * references can be resolved * @throws SQLException if the argument does not represent a * valid SQLXML value */ protected JDBCSQLXML(Reader reader, String systemId) throws SQLException { this(new StreamSource(reader, systemId)); } /** * Constructs a new read-only JDBCSQLXML object from the given character * sequence.

* * Relative URI references will be resolved against the given systemId.

* * @param string a character sequence representing an SQLXML value * @param systemId a String that conforms to the URI syntax, indicating * the URI from which the XML data is being read, so that relative URI * references can be resolved * @throws SQLException if the argument does not represent a * valid SQLXML value */ protected JDBCSQLXML(String string, String systemId) throws SQLException { this(new StreamSource(new StringReader(string), systemId)); } /** * Constructs a new read-only JDBCSQLXML object from the given gzipped octet * sequence.

* * @param bytes the gzipped octet sequence representing the SQLXML value * @param clone whether to clone the given gzipped octet sequence * @param systemId * @param publicId * @throws SQLException if the argument does not represent a * valid SQLXML value */ protected JDBCSQLXML(byte[] bytes, boolean clone, String systemId, String publicId) throws SQLException { this.setGZipData(clone ? bytes.clone() : bytes); this.systemId = systemId; this.publicId = publicId; } protected JDBCSQLXML(char[] chars, int offset, int length, String systemId) throws SQLException { this(new StreamSource(new CharArrayReader(chars, offset, length), systemId)); } /** * This method closes this object and releases the resources that it held. * The SQL XML object becomes invalid and neither readable or writeable * when this method is called. * * After free has been called, any attempt to invoke a * method other than free will result in a SQLException * being thrown. If free is called multiple times, the subsequent * calls to free are treated as a no-op. * @throws SQLException if there is an error freeing the XML value. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6 */ public void free() throws SQLException { close(); } /** * Retrieves the XML value designated by this SQLXML instance as a stream. * The bytes of the input stream are interpreted according to appendix F of the XML 1.0 specification. * The behavior of this method is the same as ResultSet.getBinaryStream() * when the designated column of the ResultSet has a type java.sql.Types of SQLXML. *

* The SQL XML object becomes not readable when this method is called and * may also become not writable depending on implementation. * * @return a stream containing the XML data. * @throws SQLException if there is an error processing the XML value. * An exception is thrown if the state is not readable. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6 */ public synchronized InputStream getBinaryStream() throws SQLException { checkClosed(); checkReadable(); InputStream rval = getBinaryStreamImpl(); setReadable(false); setWritable(false); return rval; } /** * Retrieves a stream that can be used to write the XML value that this SQLXML instance represents. * The stream begins at position 0. * The bytes of the stream are interpreted according to appendix F of the XML 1.0 specification * The behavior of this method is the same as ResultSet.updateBinaryStream() * when the designated column of the ResultSet has a type java.sql.Types of SQLXML. *

* The SQL XML object becomes not writeable when this method is called and * may also become not readable depending on implementation. * * @return a stream to which data can be written. * @throws SQLException if there is an error processing the XML value. * An exception is thrown if the state is not writable. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6 */ public synchronized OutputStream setBinaryStream() throws SQLException { checkClosed(); checkWritable(); OutputStream rval = setBinaryStreamImpl(); setWritable(false); setReadable(true); return rval; } /** * Retrieves the XML value designated by this SQLXML instance as a java.io.Reader object. * The format of this stream is defined by org.xml.sax.InputSource, * where the characters in the stream represent the unicode code points for * XML according to section 2 and appendix B of the XML 1.0 specification. * Although an encoding declaration other than unicode may be present, * the encoding of the stream is unicode. * The behavior of this method is the same as ResultSet.getCharacterStream() * when the designated column of the ResultSet has a type java.sql.Types of SQLXML. *

* The SQL XML object becomes not readable when this method is called and * may also become not writable depending on implementation. * * @return a stream containing the XML data. * @throws SQLException if there is an error processing the XML value. * The getCause() method of the exception may provide a more detailed exception, for example, * if the stream does not contain valid characters. * An exception is thrown if the state is not readable. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6 */ public synchronized Reader getCharacterStream() throws SQLException { checkClosed(); checkReadable(); Reader reader = getCharacterStreamImpl(); setReadable(false); setWritable(false); return reader; } /** * Retrieves a stream to be used to write the XML value that this SQLXML instance represents. * The format of this stream is defined by org.xml.sax.InputSource, * where the characters in the stream represent the unicode code points for * XML according to section 2 and appendix B of the XML 1.0 specification. * Although an encoding declaration other than unicode may be present, * the encoding of the stream is unicode. * The behavior of this method is the same as ResultSet.updateCharacterStream() * when the designated column of the ResultSet has a type java.sql.Types of SQLXML. *

* The SQL XML object becomes not writeable when this method is called and * may also become not readable depending on implementation. * * @return a stream to which data can be written. * @throws SQLException if there is an error processing the XML value. * The getCause() method of the exception may provide a more detailed exception, for example, * if the stream does not contain valid characters. * An exception is thrown if the state is not writable. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6 Build 79 */ public synchronized Writer setCharacterStream() throws SQLException { checkClosed(); checkWritable(); Writer writer = setCharacterStreamImpl(); setReadable(true); setWritable(false); return writer; } /** * Returns a string representation of the XML value designated by this SQLXML instance. * The format of this String is defined by org.xml.sax.InputSource, * where the characters in the stream represent the unicode code points for * XML according to section 2 and appendix B of the XML 1.0 specification. * Although an encoding declaration other than unicode may be present, * the encoding of the String is unicode. * The behavior of this method is the same as ResultSet.getString() * when the designated column of the ResultSet has a type java.sql.Types of SQLXML. *

* The SQL XML object becomes not readable when this method is called and * may also become not writable depending on implementation. * * @return a string representation of the XML value designated by this SQLXML instance. * @throws SQLException if there is an error processing the XML value. * The getCause() method of the exception may provide a more detailed exception, for example, * if the stream does not contain valid characters. * An exception is thrown if the state is not readable. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6 */ public synchronized String getString() throws SQLException { checkClosed(); checkReadable(); String value = getStringImpl(); setReadable(false); setWritable(false); return value; } /** * Sets the XML value designated by this SQLXML instance to the given String representation. * The format of this String is defined by org.xml.sax.InputSource, * where the characters in the stream represent the unicode code points for * XML according to section 2 and appendix B of the XML 1.0 specification. * Although an encoding declaration other than unicode may be present, * the encoding of the String is unicode. * The behavior of this method is the same as ResultSet.updateString() * when the designated column of the ResultSet has a type java.sql.Types of SQLXML. *

* The SQL XML object becomes not writeable when this method is called and * may also become not readable depending on implementation. * * @param value the XML value * @throws SQLException if there is an error processing the XML value. * The getCause() method of the exception may provide a more detailed exception, for example, * if the stream does not contain valid characters. * An exception is thrown if the state is not writable. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6 */ public synchronized void setString(String value) throws SQLException { if (value == null) { throw Util.nullArgument("value"); } checkWritable(); setStringImpl(value); setReadable(true); setWritable(false); } /** * Returns a Source for reading the XML value designated by this SQLXML instance. * Sources are used as inputs to XML parsers and XSLT transformers. *

* Sources for XML parsers will have namespace processing on by default. * The systemID of the Source is implementation dependent. *

* The SQL XML object becomes not readable when this method is called and * may also become not writable depending on implementation. *

* Note that SAX is a callback architecture, so a returned * SAXSource should then be set with a content handler that will * receive the SAX events from parsing. The content handler * will receive callbacks based on the contents of the XML. *

     *   SAXSource saxSource = sqlxml.getSource(SAXSource.class);
     *   XMLReader xmlReader = saxSource.getXMLReader();
     *   xmlReader.setContentHandler(myHandler);
     *   xmlReader.parse(saxSource.getInputSource());
     * 
* * @param sourceClass The class of the source, or null. * If the class is null, a vendor specifc Source implementation will be returned. * The following classes are supported at a minimum: *
     *   javax.xml.transform.dom.DOMSource - returns a DOMSource
     *   javax.xml.transform.sax.SAXSource - returns a SAXSource
     *   javax.xml.transform.stax.StAXSource - returns a StAXSource
     *   javax.xml.transform.stream.StreamSource - returns a StreamSource
     * 
* @return a Source for reading the XML value. * @throws SQLException if there is an error processing the XML value * or if this feature is not supported. * The getCause() method of the exception may provide a more detailed exception, for example, * if an XML parser exception occurs. * An exception is thrown if the state is not readable. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6 Build 79 */ @SuppressWarnings("unchecked") public synchronized T getSource( Class sourceClass) throws SQLException { checkClosed(); checkReadable(); final Source source = getSourceImpl(sourceClass); setReadable(false); setWritable(false); return (T) source; } /** * Returns a Result for setting the XML value designated by this SQLXML instance. *

* The systemID of the Result is implementation dependent. *

* The SQL XML object becomes not writeable when this method is called and * may also become not readable depending on implementation. *

* Note that SAX is a callback architecture and the returned * SAXResult has a content handler assigned that will receive the * SAX events based on the contents of the XML. Call the content * handler with the contents of the XML document to assign the values. *

     *   SAXResult saxResult = sqlxml.getResult(SAXResult.class);
     *   ContentHandler contentHandler = saxResult.getXMLReader().getContentHandler();
     *   contentHandler.startDocument();
     *   // set the XML elements and attributes into the result
     *   contentHandler.endDocument();
     * 
* * @param resultClass The class of the result, or null. * If resultClass is null, a vendor specific Result implementation will be returned. * The following classes are supported at a minimum: *
     *   javax.xml.transform.dom.DOMResult - returns a DOMResult
     *   javax.xml.transform.sax.SAXResult - returns a SAXResult
     *   javax.xml.transform.stax.StAXResult - returns a StAXResult
     *   javax.xml.transform.stream.StreamResult - returns a StreamResult
     * 
* @return Returns a Result for setting the XML value. * @throws SQLException if there is an error processing the XML value * or if this feature is not supported. * The getCause() method of the exception may provide a more detailed exception, for example, * if an XML parser exception occurs. * An exception is thrown if the state is not writable. * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6 Build 79 */ public synchronized T setResult( Class resultClass) throws SQLException { checkClosed(); checkWritable(); final T result = createResult(resultClass); setReadable(true); setWritable(false); return result; } /** * @return that may be used to perform processesing asynchronously. */ protected static ExecutorService getExecutorService() { if (JDBCSQLXML.executorService == null) { int corePoolSize = 1; int maximumPoolSize = 10; long keepAliveTime = 1; TimeUnit unit = TimeUnit.SECONDS; JDBCSQLXML.workQueue = new ArrayBlockingQueue(10); JDBCSQLXML.executorService = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); } return executorService; } /** * @return with which to obtain xml transformer instances. * @throws java.sql.SQLException when unable to obtain a factory instance. */ protected static TransformerFactory getTransformerFactory() throws SQLException { if (JDBCSQLXML.transformerFactory == null) { try { JDBCSQLXML.transformerFactory = TransformerFactory.newInstance(); } catch (TransformerFactoryConfigurationError ex) { throw Exceptions.transformFailed(ex); } } return JDBCSQLXML.transformerFactory; } /** * @return used to perform identity transforms * @throws java.sql.SQLException when unable to obtain the instance. */ protected static Transformer getIdentityTransformer() throws SQLException { if (JDBCSQLXML.identityTransformer == null) { try { JDBCSQLXML.identityTransformer = getTransformerFactory().newTransformer(); } catch (TransformerConfigurationException ex) { throw Exceptions.transformFailed(ex); } } return JDBCSQLXML.identityTransformer; } /** * @return with which to construct DOM implementation instances. * @throws java.sql.SQLException when unable to obtain a factory instance. */ protected static DOMImplementationRegistry getDOMImplementationRegistry() throws SQLException { if (domImplementationRegistry == null) { try { domImplementationRegistry = DOMImplementationRegistry.newInstance(); } catch (ClassCastException ex) { throw Exceptions.domInstantiation(ex); } catch (InstantiationException ex) { throw Exceptions.domInstantiation(ex); } catch (ClassNotFoundException ex) { throw Exceptions.domInstantiation(ex); } catch (IllegalAccessException ex) { throw Exceptions.domInstantiation(ex); } } return domImplementationRegistry; } /** * @return with which to create document instances. * @throws java.sql.SQLException when unable to obtain the DOM * implementation instance. */ protected static DOMImplementation getDOMImplementation() throws SQLException { if (domImplementation == null) { domImplementation = getDOMImplementationRegistry().getDOMImplementation( domFeatures); } if (domImplementation == null) { Exception ex = new RuntimeException("Not supported: " + domFeatures); throw Exceptions.domInstantiation(ex); } return domImplementation; } /** * @param namespaceURI of the document element to create or null. * @param qualifiedName of the document element to be created or null. * @param docType of document to be created or null. * When doctype is not null, its * Node.ownerDocument attribute is set to the document * being created. * @return with its document element. * If the NamespaceURI, qualifiedName, and * doctype are null, the returned * Document is empty with no document element. * @throws java.sql.SQLException wrapping any internal exception that occurs. * @see org.w3c.dom.DOMImplementation#createDocument(String,String,DocumentType) */ protected static Document createDocument(String namespaceURI, String qualifiedName, DocumentType docType) throws SQLException { try { return getDOMImplementation().createDocument(namespaceURI, qualifiedName, docType); } catch (DOMException ex) { throw Exceptions.domInstantiation(ex); } } /** * @return that is empty with no document element. * @throws java.sql.SQLException wrapping any internal exception that occurs. */ protected static Document createDocument() throws SQLException { return createDocument(null, null, null); } /** * Initializes this object's SQLXML value from the given Source * object.

* * @param source the Source representing the SQLXML value * @throws SQLException if the argument does not represent a * valid SQLXML value */ protected void init(Source source) throws SQLException { if (source == null) { throw Util.nullArgument("source"); } Transformer transformer = JDBCSQLXML.getIdentityTransformer(); StreamResult result = new StreamResult(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); GZIPOutputStream gzos; try { gzos = new GZIPOutputStream(baos); } catch (IOException ex) { throw Exceptions.transformFailed(ex); } result.setOutputStream(gzos); try { transformer.transform(source, result); } catch (TransformerException ex) { throw Exceptions.transformFailed(ex); } try { gzos.close(); } catch (IOException ex) { throw Exceptions.transformFailed(ex); } byte[] data = baos.toByteArray(); setGZipData(data); setReadable(true); setWritable(false); } /** * Assigns this object's SQLXML value from the designated gzipped array * of bytes. * * @param data the SQLXML value * @throws java.sql.SQLException if the argument does not represent a * valid SQLXML value */ protected void setGZipData(byte[] data) throws SQLException { if (data == null) { throw Util.nullArgument("data"); } this.gzdata = data; } /** * Directly retrieves this object's present SQLMXL value as a gzipped * array of bytes.

* * May be null, empty or invalid. * * @return this object's SQLMXL value as a gzipped byte array */ protected byte[] gZipData() { return this.gzdata; } /** * Retrieves this object's SQLXML value as a gzipped array of bytes, * possibly by terminating any in-progress write operations and converting * accumulated intermediate data. * * @throws java.sql.SQLException if an underlying I/O or transform * error occurs * @return this object's SQLXML value */ protected byte[] getGZipData() throws SQLException { byte[] bytes = gZipData(); if (bytes != null) { return bytes; } if (this.domResult != null) { DOMSource source = new DOMSource(domResult.getNode(), domResult.getSystemId()); OutputStream os = setBinaryStreamImpl(); StreamResult result = new StreamResult(os); try { JDBCSQLXML.identityTransformer.transform(source, result); } catch (TransformerException ex) { throw Exceptions.transformFailed(ex); } try { os.close(); } catch (IOException ex) { throw Exceptions.transformFailed(ex); } } if (this.outputStream == null) { throw Exceptions.notReadable("No Data."); } else if (!this.outputStream.isClosed()) { throw Exceptions.notReadable( "Stream used for writing must be closed but is still open."); } else if (this.outputStream.isFreed()) { throw Exceptions.notReadable( "Stream used for writing was freed and is no longer valid."); } try { setGZipData(this.outputStream.toByteArray()); return gZipData(); } catch (IOException ex) { throw Exceptions.notReadable(); } finally { this.freeOutputStream(); } } /** * closes this object and releases the resources that it holds. */ protected synchronized void close() { this.closed = true; setReadable(false); setWritable(false); freeOutputStream(); freeInputStream(); freeDomResult(); this.gzdata = null; } /** * Closes the input stream, if any, currently in use to read this object's * SQLXML value and nullifies the stream reference to make it elligible * for subsequent garbage collection. */ protected void freeInputStream() { if (this.inputStream != null) { try { this.inputStream.close(); } catch (IOException ex) { // ex.printStackTrace(); } finally { this.inputStream = null; } } } /** * Closes the output stream, if any, currently in use to write this object's * SQLXML value and nullifies the stream reference to make it elligible for * subsequent garbage collection. The stream's data buffer reference may * also be nullified, in order to make it elligible for garbage collection * immediately, just in case an external client still holds a reference to * the output stream. */ protected void freeOutputStream() { if (this.outputStream != null) { try { this.outputStream.free(); } catch (IOException ex) { // ex.printStackTrace(); } this.outputStream = null; } } /** * Checks whether this object is closed (has been freed). * * @throws java.sql.SQLException if this object is closed. */ protected synchronized void checkClosed() throws SQLException { if (this.closed) { throw Exceptions.inFreedState(); } } /** * Checks whether this object is readable. * * @throws java.sql.SQLException if this object is not readable. */ protected synchronized void checkReadable() throws SQLException { if (!this.isReadable()) { throw Exceptions.notReadable(); } } /** * Assigns this object's readability status. * * @param readable if true, then readable; else not readable */ protected synchronized void setReadable(boolean readable) { this.readable = readable; } /** * Checks whether this object is writable. * * @throws java.sql.SQLException if this object is not writable. */ protected synchronized void checkWritable() throws SQLException { if (!this.isWritable()) { throw Exceptions.notWritable(); } } /** * Assigns this object's writability status. * * @param writable if true, then writable; else not writable */ protected synchronized void setWritable(boolean writable) { this.writable = writable; } /** * Retrieves the object's readability status. * * @return if true, then readable; else not readable */ public synchronized boolean isReadable() { return this.readable; } /** * Retrieves the object's readability status. * * @return if true, then writable; else not writable */ public synchronized boolean isWritable() { return this.writable; } /** * Retrieves a stream representing the XML value designated by this * SQLXML instance.

* * @return a stream containing the XML data. * @throws SQLException if there is an error processing the XML value. */ protected InputStream getBinaryStreamImpl() throws SQLException { try { byte[] data = getGZipData(); ByteArrayInputStream bais = new ByteArrayInputStream(data); return new GZIPInputStream(bais); } catch (IOException ex) { throw Exceptions.transformFailed(ex); } } /** * Retrieves a reader representing the XML value designated by this * SQLXML instance.

* * @return a reader containing the XML data. * @throws SQLException if there is an error processing the XML value. */ protected Reader getCharacterStreamImpl() throws SQLException { return new InputStreamReader(getBinaryStreamImpl()); } /** * Retrieves a string representing the XML value designated by this * SQLXML instance.

* * @return a string containing the XML data. * @throws SQLException if there is an error processing the XML value. */ protected String getStringImpl() throws SQLException { try { return StringConverter.inputStreamToString(getBinaryStreamImpl(), "US-ASCII"); } catch (IOException ex) { throw Exceptions.transformFailed(ex); } } /** * Retrieves a stream to completely write the XML value this SQLXML * instance represents.

* * @return a stream to which the data can be written. * @throws SQLException if there is an error processing the XML value. */ protected OutputStream setBinaryStreamImpl() throws SQLException { this.outputStream = new ClosableByteArrayOutputStream(); try { return new GZIPOutputStream(this.outputStream); } catch (IOException ex) { this.outputStream = null; throw Exceptions.resultInstantiation(ex); } } /** * Retrieves a writer to completely write the XML value this SQLXML * instance represents.

* * @return a writer to which the data can be written. * @throws SQLException if there is an error processing the XML value. * The getCause() method of the exception may provide a more detailed exception, for example, * if the stream does not contain valid characters. * An exception is thrown if the state is not writable. * @since JDK 1.6 Build 79 */ protected Writer setCharacterStreamImpl() throws SQLException { return new OutputStreamWriter(setBinaryStreamImpl()); } /** * Sets the XML value designated by this SQLXML instance using the given * String representation.

* * @param value the XML value * @throws SQLException if there is an error processing the XML value. */ protected void setStringImpl(String value) throws SQLException { init(new StreamSource(new StringReader(value))); } /** * Returns a Source for reading the XML value designated by this SQLXML * instance.

* * @param sourceClass The class of the source, or null. If null, then a * DOMSource is returned. * @return a Source for reading the XML value. * @throws SQLException if there is an error processing the XML value * or if the given sourceClass is not supported. */ protected T getSourceImpl( Class sourceClass) throws SQLException { if (JAXBSource.class.isAssignableFrom(sourceClass)) { // Must go first presently, since JAXBSource extends SAXSource // (purely as an implmentation detail) and it's not possible // to instantiate a valid JAXBSource with a Zero-Args // constructor(or any subclass thereof, due to the finality of // its private marshaller and context object attrbutes) // FALL THROUGH... will throw an exception } else if (StreamSource.class.isAssignableFrom(sourceClass)) { return createStreamSource(sourceClass); } else if ((sourceClass == null) || DOMSource.class.isAssignableFrom(sourceClass)) { return createDOMSource(sourceClass); } else if (SAXSource.class.isAssignableFrom(sourceClass)) { return createSAXSource(sourceClass); } else if (StAXSource.class.isAssignableFrom(sourceClass)) { return createStAXSource(sourceClass); } throw Util.invalidArgument("sourceClass: " + sourceClass); } /** * Retrieves a new StreamSource for reading the XML value designated by this * SQLXML instance.

* * @param sourceClass The class of the source * @throws java.sql.SQLException if there is an error processing the XML * value or if the given sourceClass is not supported. * @return a new StreamSource for reading the XML value designated by this * SQLXML instance */ @SuppressWarnings("unchecked") protected T createStreamSource( Class sourceClass) throws SQLException { StreamSource source = null; try { source = (sourceClass == null) ? new StreamSource() : (StreamSource) sourceClass.newInstance(); } catch (SecurityException ex) { throw Exceptions.sourceInstantiation(ex); } catch (InstantiationException ex) { throw Exceptions.sourceInstantiation(ex); } catch (IllegalAccessException ex) { throw Exceptions.sourceInstantiation(ex); } catch (ClassCastException ex) { throw Exceptions.sourceInstantiation(ex); } Reader reader = getCharacterStreamImpl(); source.setReader(reader); return (T) source; } /** * Retrieves a new DOMSource for reading the XML value designated by this * SQLXML instance.

* * @param sourceClass The class of the source * @throws java.sql.SQLException if there is an error processing the XML * value or if the given sourceClass is not supported. * @return a new DOMSource for reading the XML value designated by this * SQLXML instance */ @SuppressWarnings("unchecked") protected T createDOMSource( Class sourceClass) throws SQLException { DOMSource source = null; try { source = (sourceClass == null) ? new DOMSource() : (DOMSource) sourceClass.newInstance(); } catch (SecurityException ex) { throw Exceptions.sourceInstantiation(ex); } catch (IllegalAccessException ex) { throw Exceptions.sourceInstantiation(ex); } catch (InstantiationException ex) { throw Exceptions.sourceInstantiation(ex); } catch (ClassCastException ex) { throw Exceptions.sourceInstantiation(ex); } Transformer transformer = JDBCSQLXML.getIdentityTransformer(); InputStream stream = this.getBinaryStreamImpl(); StreamSource streamSource = new StreamSource(); DOMResult result = new DOMResult(); streamSource.setInputStream(stream); try { transformer.transform(streamSource, result); } catch (TransformerException ex) { throw Exceptions.transformFailed(ex); } source.setNode(result.getNode()); source.setSystemId(result.getSystemId()); return (T) source; } /** * Retrieves a new SAXSource for reading the XML value designated by this * SQLXML instance.

* * @param sourceClass The class of the source * @throws java.sql.SQLException if there is an error processing the XML * value or if the given sourceClass is not supported. * @return a new SAXSource for reading the XML value designated by this * SQLXML instance */ @SuppressWarnings("unchecked") protected T createSAXSource( Class sourceClass) throws SQLException { SAXSource source = null; try { source = (sourceClass == null) ? new SAXSource() : (SAXSource) sourceClass.newInstance(); } catch (SecurityException ex) { throw Exceptions.sourceInstantiation(ex); } catch (InstantiationException ex) { throw Exceptions.sourceInstantiation(ex); } catch (IllegalAccessException ex) { throw Exceptions.sourceInstantiation(ex); } catch (ClassCastException ex) { throw Exceptions.sourceInstantiation(ex); } Reader reader = getCharacterStreamImpl(); InputSource inputSource = new InputSource(reader); source.setInputSource(inputSource); return (T) source; } /** * Retrieves a new StAXSource for reading the XML value designated by this * SQLXML instance.

* * @param sourceClass The class of the source * @throws java.sql.SQLException if there is an error processing the XML * value or if the given sourceClass is not supported. * @return a new StAXSource for reading the XML value designated by this * SQLXML instance */ @SuppressWarnings("unchecked") protected T createStAXSource( Class sourceClass) throws SQLException { StAXSource source = null; Constructor sourceCtor = null; Reader reader = null; XMLInputFactory factory = null; XMLEventReader eventReader = null; try { factory = XMLInputFactory.newInstance(); } catch (FactoryConfigurationError ex) { throw Exceptions.sourceInstantiation(ex); } try { sourceCtor = (sourceClass == null) ? StAXSource.class.getConstructor(XMLEventReader.class) : sourceClass.getConstructor(XMLEventReader.class); } catch (SecurityException ex) { throw Exceptions.sourceInstantiation(ex); } catch (NoSuchMethodException ex) { throw Exceptions.sourceInstantiation(ex); } reader = getCharacterStreamImpl(); try { eventReader = factory.createXMLEventReader(reader); } catch (XMLStreamException ex) { throw Exceptions.sourceInstantiation(ex); } try { source = (StAXSource) sourceCtor.newInstance(eventReader); } catch (SecurityException ex) { throw Exceptions.sourceInstantiation(ex); } catch (IllegalArgumentException ex) { throw Exceptions.sourceInstantiation(ex); } catch (IllegalAccessException ex) { throw Exceptions.sourceInstantiation(ex); } catch (InstantiationException ex) { throw Exceptions.sourceInstantiation(ex); } catch (InvocationTargetException ex) { throw Exceptions.sourceInstantiation(ex.getTargetException()); } catch (ClassCastException ex) { throw Exceptions.sourceInstantiation(ex); } return (T) source; } /** * Retrieves a new Result for setting the XML value designated by this * SQLXML instance. * * @param resultClass The class of the result, or null. * @throws java.sql.SQLException if there is an error processing the XML * value or the state is not writable * @return for setting the XML value designated by this SQLXML instance. */ protected T createResult( Class resultClass) throws SQLException { checkWritable(); setWritable(false); setReadable(true); if (JAXBResult.class.isAssignableFrom(resultClass)) { // Must go first presently, since JAXBResult extends SAXResult // (purely as an implmentation detail) and it's not possible // to instantiate a valid JAXBResult with a Zero-Args // constructor(or any subclass thereof, due to the finality of // its private UnmarshallerHandler) // FALL THROUGH... will throw an exception } else if ((resultClass == null) || StreamResult.class.isAssignableFrom(resultClass)) { return createStreamResult(resultClass); } else if (DOMResult.class.isAssignableFrom(resultClass)) { return createDOMResult(resultClass); } else if (SAXResult.class.isAssignableFrom(resultClass)) { return createSAXResult(resultClass); } else if (StAXResult.class.isAssignableFrom(resultClass)) { return createStAXResult(resultClass); } throw Util.invalidArgument("resultClass: " + resultClass); } /** * Retrieves a new StreamResult for setting the XML value designated by this * SQLXML instance. * * @param resultClass The class of the result, or null. * @throws java.sql.SQLException if there is an error processing the XML * value * @return for setting the XML value designated by this SQLXML instance. */ // @SuppressWarnings("unchecked") protected T createStreamResult( Class resultClass) throws SQLException { StreamResult result = null; try { result = (resultClass == null) ? new StreamResult() : (StreamResult) resultClass.newInstance(); } catch (SecurityException ex) { throw Exceptions.resultInstantiation(ex); } catch (InstantiationException ex) { throw Exceptions.resultInstantiation(ex); } catch (IllegalAccessException ex) { throw Exceptions.resultInstantiation(ex); } catch (ClassCastException ex) { throw Exceptions.resultInstantiation(ex); } OutputStream stream = setBinaryStreamImpl(); result.setOutputStream(stream); return (T) result; } /** * Retrieves a new DOMResult for setting the XML value designated by this * SQLXML instance. * * @param resultClass The class of the result, or null. * @throws java.sql.SQLException if there is an error processing the XML * value * @return for setting the XML value designated by this SQLXML instance. */ @SuppressWarnings("unchecked") protected T createDOMResult( Class resultClass) throws SQLException { try { T result = (resultClass == null) ? ((T) new DOMResult()) : resultClass.newInstance(); this.domResult = (DOMResult) result; return result; } catch (SecurityException ex) { throw Exceptions.resultInstantiation(ex); } catch (InstantiationException ex) { throw Exceptions.resultInstantiation(ex); } catch (IllegalAccessException ex) { throw Exceptions.resultInstantiation(ex); } catch (ClassCastException ex) { throw Exceptions.resultInstantiation(ex); } } /** * Retrieves a new SAXResult for setting the XML value designated by this * SQLXML instance. * * @param resultClass The class of the result, or null. * @throws java.sql.SQLException if there is an error processing the XML * value * @return for setting the XML value designated by this SQLXML instance. */ @SuppressWarnings("unchecked") protected T createSAXResult( Class resultClass) throws SQLException { SAXResult result = null; try { result = (resultClass == null) ? new SAXResult() : (SAXResult) resultClass.newInstance(); } catch (SecurityException ex) { throw Exceptions.resultInstantiation(ex); } catch (InstantiationException ex) { throw Exceptions.resultInstantiation(ex); } catch (IllegalAccessException ex) { throw Exceptions.resultInstantiation(ex); } catch (ClassCastException ex) { throw Exceptions.resultInstantiation(ex); } SAX2DOMBuilder handler = null; try { handler = new SAX2DOMBuilder(); } catch (ParserConfigurationException ex) { throw Exceptions.resultInstantiation(ex); } this.domResult = new DOMResult(); result.setHandler(handler); this.domResult.setNode(handler.getDocument()); return (T) result; } /** * Retrieves a new DOMResult for setting the XML value designated by this * SQLXML instance. * * @param resultClass The class of the result, or null. * @throws java.sql.SQLException if there is an error processing the XML * value * @return for setting the XML value designated by this SQLXML instance. */ @SuppressWarnings("unchecked") protected T createStAXResult( Class resultClass) throws SQLException { StAXResult result = null; try { this.domResult = new DOMResult((new SAX2DOMBuilder()).getDocument()); XMLOutputFactory factory = XMLOutputFactory.newInstance(); XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(this.domResult); if (resultClass == null || resultClass == StAXResult.class) { result = new StAXResult(xmlStreamWriter); } else { Constructor ctor = resultClass.getConstructor(XMLStreamWriter.class); result = (StAXResult) ctor.newInstance(xmlStreamWriter); } } catch (ParserConfigurationException ex) { throw Exceptions.resultInstantiation(ex); } catch (SecurityException ex) { throw Exceptions.resultInstantiation(ex); } catch (IllegalArgumentException ex) { throw Exceptions.resultInstantiation(ex); } catch (IllegalAccessException ex) { throw Exceptions.resultInstantiation(ex); } catch (InvocationTargetException ex) { throw Exceptions.resultInstantiation(ex.getTargetException()); } catch (FactoryConfigurationError ex) { throw Exceptions.resultInstantiation(ex); } catch (InstantiationException ex) { throw Exceptions.resultInstantiation(ex); } catch (NoSuchMethodException ex) { throw Exceptions.resultInstantiation(ex); } catch (XMLStreamException ex) { throw Exceptions.resultInstantiation(ex); } return (T) result; } protected void freeDomResult() { this.domResult = null; } /** * Basically just a namespace to isolate SQLXML exception generation */ protected static class Exceptions { /** * Construction Disabled. */ private Exceptions() { } /** * Retrieves a new SQLXML DOM instantiation exception. * * @param cause of the exception */ static SQLException domInstantiation(Throwable cause) { Exception ex = (cause instanceof Exception) ? (Exception) cause : new Exception(cause); return Util.sqlException(ErrorCode.GENERAL_ERROR, "SQLXML DOM instantiation failed: " + cause, ex); } /** * Retrieves a new SQLXML source instantiation exception. * * @param cause of the exception. * @return a new SQLXML source instantiation exception */ static SQLException sourceInstantiation(Throwable cause) { Exception ex = (cause instanceof Exception) ? (Exception) cause : new Exception(cause); return Util.sqlException(ErrorCode.GENERAL_ERROR, "SQLXML Source instantiation failed: " + cause, ex); } /** * Retrieves a new SQLXML result instantiation exception. * * @param cause of the exception. * @return a new SQLXML result instantiation exception */ static SQLException resultInstantiation(Throwable cause) { Exception ex = (cause instanceof Exception) ? (Exception) cause : new Exception(cause); return Util.sqlException(ErrorCode.GENERAL_ERROR, "SQLXML Result instantiation failed: " + cause, ex); } /** * Retrieves a new SQLXML parse failed exception. * * @param cause of the exception. * @return a new SQLXML parse failed exception */ static SQLException parseFailed(Throwable cause) { Exception ex = (cause instanceof Exception) ? (Exception) cause : new Exception(cause); return Util.sqlException(ErrorCode.GENERAL_ERROR, "parse failed: " + cause, ex); } /** * Retrieves a new SQLXML transform failed exception. * * @param cause of the exception. * @return a new SQLXML parse failed exception */ static SQLException transformFailed(Throwable cause) { Exception ex = (cause instanceof Exception) ? (Exception) cause : new Exception(cause); return Util.sqlException(ErrorCode.GENERAL_ERROR, "transform failed: " + cause, ex); } /** * Retrieves a new SQLXML not readable exception. * * @return a new SQLXML not readable exception */ static SQLException notReadable() { return Util.sqlException(ErrorCode.GENERAL_IO_ERROR, "SQLXML in not readable state"); } /** * Retrieves a new SQLXML not readable exception. * * @return a new SQLXML not readable exception */ static SQLException notReadable(String reason) { return Util.sqlException(ErrorCode.GENERAL_IO_ERROR, "SQLXML in not readable state: " + reason); } /** * Retrieves a new SQLXML not writable exception. * * @return a new SQLXML not writable exception */ static SQLException notWritable() { return Util.sqlException(ErrorCode.GENERAL_IO_ERROR, "SQLXML in not writable state"); } /** * Currently unused. * * @return never */ static SQLException directUpdateByLocatorNotSupported() { return Util.sqlException(ErrorCode.X_0A000, "SQLXML direct update by locator"); } /** * Retrieves a new SQLXML in freed state exception. * * @return a new SQLXML in freed state exception */ static SQLException inFreedState() { return Util.sqlException(ErrorCode.GENERAL_ERROR, "SQLXML in freed state"); } } // ------------------------------------------------------------------------- /** * Builds a DOM from SAX events. */ protected static class SAX2DOMBuilder implements ContentHandler, Closeable { /** * */ private boolean closed; /** * */ private Element currentElement; // --------------------- internal implementation ----------------------- /** * */ private Node currentNode; /** * */ private Document document; /** * */ private Locator locator; /** *

Creates a new instance of SAX2DOMBuilder, which creates * a new document. The document is available via * {@link #getDocument()}.

* @throws javax.xml.parsers.ParserConfigurationException */ public SAX2DOMBuilder() throws ParserConfigurationException { DocumentBuilderFactory documentBuilderFactory; DocumentBuilder documentBuilder; documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setValidating(false); documentBuilderFactory.setNamespaceAware(true); documentBuilder = documentBuilderFactory.newDocumentBuilder(); this.document = documentBuilder.newDocument(); this.currentNode = this.document; } /** * Receive an object for locating the origin of SAX document events. * *

SAX parsers are strongly encouraged (though not absolutely * required) to supply a locator: if it does so, it must supply * the locator to the application by invoking this method before * invoking any of the other methods in the ContentHandler * interface.

* *

The locator allows the application to determine the end * position of any document-related event, even if the parser is * not reporting an error. Typically, the application will * use this information for reporting its own errors (such as * character content that does not match an application's * business rules). The information returned by the locator * is probably not sufficient for use with a search engine.

* *

Note that the locator will return correct information only * during the invocation SAX event callbacks after * {@link #startDocument startDocument} returns and before * {@link #endDocument endDocument} is called. The * application should not attempt to use it at any other time.

* * @param locator an object that can return the location of * any SAX document event * @see org.xml.sax.Locator */ public void setDocumentLocator(Locator locator) { this.locator = locator; } /** * Retrieves the Locator.

* @return the Locator */ public Locator getDocumentLocator() { return this.locator; } /** * Receive notification of the beginning of a document. * *

The SAX parser will invoke this method only once, before any * other event callbacks (except for {@link #setDocumentLocator * setDocumentLocator}).

* * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception * @see #endDocument */ public void startDocument() throws SAXException { checkClosed(); } /** * Receive notification of the end of a document. * *

There is an apparent contradiction between the * documentation for this method and the documentation for {@link * org.xml.sax.ErrorHandler#fatalError}. Until this ambiguity is * resolved in a future major release, clients should make no * assumptions about whether endDocument() will or will not be * invoked when the parser has reported a fatalError() or thrown * an exception.

* *

The SAX parser will invoke this method only once, and it will * be the last method invoked during the parse. The parser shall * not invoke this method until it has either abandoned parsing * (because of an unrecoverable error) or reached the end of * input.

* * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception * @see #startDocument */ public void endDocument() throws SAXException { checkClosed(); close(); } /** * Begin the scope of a prefix-URI Namespace mapping. * *

The information from this event is not necessary for * normal Namespace processing: the SAX XML reader will * automatically replace prefixes for element and attribute * names when the http://xml.org/sax/features/namespaces * feature is true (the default).

* *

There are cases, however, when applications need to * use prefixes in character data or in attribute values, * where they cannot safely be expanded automatically; the * start/endPrefixMapping event supplies the information * to the application to expand prefixes in those contexts * itself, if necessary.

* *

Note that start/endPrefixMapping events are not * guaranteed to be properly nested relative to each other: * all startPrefixMapping events will occur immediately before the * corresponding {@link #startElement startElement} event, * and all {@link #endPrefixMapping endPrefixMapping} * events will occur immediately after the corresponding * {@link #endElement endElement} event, * but their order is not otherwise * guaranteed.

* *

There should never be start/endPrefixMapping events for the * "xml" prefix, since it is predeclared and immutable.

* * @param prefix the Namespace prefix being declared. * An empty string is used for the default element namespace, * which has no prefix. * @param uri the Namespace URI the prefix is mapped to * @throws org.xml.sax.SAXException the client may throw * an exception during processing * @see #endPrefixMapping * @see #startElement */ public void startPrefixMapping(String prefix, String uri) throws SAXException { checkClosed(); } /** * End the scope of a prefix-URI mapping. * *

See {@link #startPrefixMapping startPrefixMapping} for * details. These events will always occur immediately after the * corresponding {@link #endElement endElement} event, but the order of * {@link #endPrefixMapping endPrefixMapping} events is not otherwise * guaranteed.

* * @param prefix the prefix that was being mapped. * This is the empty string when a default mapping scope ends. * @throws org.xml.sax.SAXException the client may throw * an exception during processing * @see #startPrefixMapping * @see #endElement */ public void endPrefixMapping(String prefix) throws SAXException { checkClosed(); } /** * Receive notification of the beginning of an element. * *

The Parser will invoke this method at the beginning of every * element in the XML document; there will be a corresponding * {@link #endElement endElement} event for every startElement event * (even when the element is empty). All of the element's content will be * reported, in order, before the corresponding endElement * event.

* *

This event allows up to three name components for each * element:

* *
    *
  1. the Namespace URI;
  2. *
  3. the local name; and
  4. *
  5. the qualified (prefixed) name.
  6. *
* *

Any or all of these may be provided, depending on the * values of the http://xml.org/sax/features/namespaces * and the http://xml.org/sax/features/namespace-prefixes * properties:

* *
    *
  • the Namespace URI and local name are required when * the namespaces property is true (the default), and are * optional when the namespaces property is false (if one is * specified, both must be);
  • *
  • the qualified name is required when the namespace-prefixes property * is true, and is optional when the namespace-prefixes property * is false (the default).
  • *
* *

Note that the attribute list provided will contain only * attributes with explicit values (specified or defaulted): * #IMPLIED attributes will be omitted. The attribute list * will contain attributes used for Namespace declarations * (xmlns* attributes) only if the * http://xml.org/sax/features/namespace-prefixes * property is true (it is false by default, and support for a * true value is optional).

* *

Like {@link #characters characters()}, attribute values may have * characters that need more than one char value.

* * @param uri the Namespace URI, or the empty string if the * element has no Namespace URI or if Namespace * processing is not being performed * @param localName the local name (without prefix), or the * empty string if Namespace processing is not being * performed * @param qName the qualified name (with prefix), or the * empty string if qualified names are not available * @param atts the attributes attached to the element. If * there are no attributes, it shall be an empty * Attributes object. The value of this object after * startElement returns is undefined * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception * @see #endElement * @see org.xml.sax.Attributes * @see org.xml.sax.helpers.AttributesImpl */ public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { checkClosed(); Element element; if ((uri == null) || (uri.length() == 0)) { element = getDocument().createElement(qName); } else { element = getDocument().createElementNS(uri, qName); } if (atts != null) { for (int i = 0; i < atts.getLength(); i++) { String attrURI = atts.getURI(i); String attrQName = atts.getQName(i); String attrValue = atts.getValue(i); if ((attrURI == null) || (attrURI.length() == 0)) { element.setAttribute(attrQName, attrValue); } else { element.setAttributeNS(attrURI, attrQName, attrValue); } } } getCurrentNode().appendChild(element); setCurrentNode(element); if (getCurrentElement() == null) { setCurrentElement(element); } } /** * Receive notification of the end of an element. * *

The SAX parser will invoke this method at the end of every * element in the XML document; there will be a corresponding * {@link #startElement startElement} event for every endElement * event (even when the element is empty).

* *

For information on the names, see startElement.

* * @param uri the Namespace URI, or the empty string if the * element has no Namespace URI or if Namespace * processing is not being performed * @param localName the local name (without prefix), or the * empty string if Namespace processing is not being * performed * @param qName the qualified XML name (with prefix), or the * empty string if qualified names are not available * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception */ public void endElement(String uri, String localName, String qName) throws SAXException { checkClosed(); setCurrentNode(getCurrentNode().getParentNode()); } /** * Receive notification of character data. * *

The Parser will call this method to report each chunk of * character data. SAX parsers may return all contiguous character * data in a single chunk, or they may split it into several * chunks; however, all of the characters in any single event * must come from the same external entity so that the Locator * provides useful information.

* *

The application must not attempt to read from the array * outside of the specified range.

* *

Individual characters may consist of more than one Java * char value. There are two important cases where this * happens, because characters can't be represented in just sixteen bits. * In one case, characters are represented in a Surrogate Pair, * using two special Unicode values. Such characters are in the so-called * "Astral Planes", with a code point above U+FFFF. A second case involves * composite characters, such as a base character combining with one or * more accent characters.

* *

Your code should not assume that algorithms using * char-at-a-time idioms will be working in character * units; in some cases they will split characters. This is relevant * wherever XML permits arbitrary characters, such as attribute values, * processing instruction data, and comments as well as in data reported * from this method. It's also generally relevant whenever Java code * manipulates internationalized text; the issue isn't unique to XML.

* *

Note that some parsers will report whitespace in element * content using the {@link #ignorableWhitespace ignorableWhitespace} * method rather than this one (validating parsers must * do so).

* * @param ch the characters from the XML document * @param start the start position in the array * @param length the number of characters to read from the array * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception * @see #ignorableWhitespace * @see org.xml.sax.Locator */ public void characters(char[] ch, int start, int length) throws SAXException { checkClosed(); Node node = getCurrentNode().getLastChild(); String s = new String(ch, start, length); if ((node != null) && (node.getNodeType() == Node.TEXT_NODE)) { ((Text) node).appendData(s); } else { Text text = getDocument().createTextNode(s); getCurrentNode().appendChild(text); } } /** * Receive notification of ignorable whitespace in element content. * *

Validating Parsers must use this method to report each chunk * of whitespace in element content (see the W3C XML 1.0 * recommendation, section 2.10): non-validating parsers may also * use this method if they are capable of parsing and using * content models.

* *

SAX parsers may return all contiguous whitespace in a single * chunk, or they may split it into several chunks; however, all of * the characters in any single event must come from the same * external entity, so that the Locator provides useful * information.

* *

The application must not attempt to read from the array * outside of the specified range.

* * @param ch the characters from the XML document * @param start the start position in the array * @param length the number of characters to read from the array * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception * @see #characters */ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { characters(ch, start, length); } /** * Receive notification of a processing instruction. * *

The Parser will invoke this method once for each processing * instruction found: note that processing instructions may occur * before or after the main document element.

* *

A SAX parser must never report an XML declaration (XML 1.0, * section 2.8) or a text declaration (XML 1.0, section 4.3.1) * using this method.

* *

Like {@link #characters characters()}, processing instruction * data may have characters that need more than one char * value.

* * @param target the processing instruction target * @param data the processing instruction data, or null if * none was supplied. The data does not include any * whitespace separating it from the target * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception */ public void processingInstruction(String target, String data) throws SAXException { checkClosed(); ProcessingInstruction processingInstruction; processingInstruction = getDocument().createProcessingInstruction(target, data); getCurrentNode().appendChild(processingInstruction); } /** * Receive notification of a skipped entity. * This is not called for entity references within markup constructs * such as element start tags or markup declarations. (The XML * recommendation requires reporting skipped external entities. * SAX also reports internal entity expansion/non-expansion, except * within markup constructs.) * *

The Parser will invoke this method each time the entity is * skipped. Non-validating processors may skip entities if they * have not seen the declarations (because, for example, the * entity was declared in an external DTD subset). All processors * may skip external entities, depending on the values of the * http://xml.org/sax/features/external-general-entities * and the * http://xml.org/sax/features/external-parameter-entities * properties.

* * @param name the name of the skipped entity. If it is a * parameter entity, the name will begin with '%', and if * it is the external DTD subset, it will be the string * "[dtd]" * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception */ public void skippedEntity(String name) throws SAXException { checkClosed(); EntityReference entityReference = getDocument().createEntityReference(name); getCurrentNode().appendChild(entityReference); } /** * Closes this DOMBuilder. */ public void close() { this.closed = true; } /** * Frees the DOMBuilder. */ public void free() { close(); this.document = null; this.currentElement = null; this.currentNode = null; this.locator = null; } /** * Retrieves whether this DOMBuilder is closed. */ public boolean isClosed() { return this.closed; } /** * Checks whether this DOMBuilder is closed. * * @throws SAXException if this DOMBuilder is closed. */ protected void checkClosed() throws SAXException { if (isClosed()) { throw new SAXException("content handler is closed."); // NOI18N } } /** * Retrieves the document.

*/ public Document getDocument() { return this.document; } /** * Retreives the current element.

*/ protected Element getCurrentElement() { return this.currentElement; } /** * Assigns the current element. * @param element */ protected void setCurrentElement(Element element) { this.currentElement = element; } /** * Retrieves the current node.

*/ protected Node getCurrentNode() { return this.currentNode; } /** * Assigns the current node.

* @param node */ protected void setCurrentNode(Node node) { this.currentNode = node; } } /** * Writes to a {@link javax.xml.stream.XMLStreamWriter XMLStreamWriter} * from SAX events. */ public static class SAX2XMLStreamWriter implements ContentHandler, Closeable { /** * Namespace declarations for an upcoming element. */ private List namespaces = new ArrayList(); /** * Whether this object is closed. */ private boolean closed; /** * This object's SAX locator. */ private Locator locator; /** * XML stream writer where events are pushed. */ private XMLStreamWriter writer; /** * Constructs a new SAX2XMLStreamWriter that writes SAX events to the * designated XMLStreamWriter. * * @param writer the writer to which to write SAX events */ public SAX2XMLStreamWriter(XMLStreamWriter writer) { if (writer == null) { throw new NullPointerException("writer"); } this.writer = writer; } /** * Receive notification of the beginning of a document. * *

The SAX parser will invoke this method only once, before any * other event callbacks (except for {@link #setDocumentLocator * setDocumentLocator}).

* * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception * @see #endDocument */ public void startDocument() throws SAXException { checkClosed(); try { this.writer.writeStartDocument(); } catch (XMLStreamException e) { throw new SAXException(e); } } /** * Receive notification of the end of a document. * *

There is an apparent contradiction between the * documentation for this method and the documentation for {@link * org.xml.sax.ErrorHandler#fatalError}. Until this ambiguity is * resolved in a future major release, clients should make no * assumptions about whether endDocument() will or will not be * invoked when the parser has reported a fatalError() or thrown * an exception.

* *

The SAX parser will invoke this method only once, and it will * be the last method invoked during the parse. The parser shall * not invoke this method until it has either abandoned parsing * (because of an unrecoverable error) or reached the end of * input.

* * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception * @see #startDocument */ public void endDocument() throws SAXException { checkClosed(); try { this.writer.writeEndDocument(); this.writer.flush(); } catch (XMLStreamException e) { throw new SAXException(e); } } /** * Receive notification of character data. * *

The Parser will call this method to report each chunk of * character data. SAX parsers may return all contiguous character * data in a single chunk, or they may split it into several * chunks; however, all of the characters in any single event * must come from the same external entity so that the Locator * provides useful information.

* *

The application must not attempt to read from the array * outside of the specified range.

* *

Individual characters may consist of more than one Java * char value. There are two important cases where this * happens, because characters can't be represented in just sixteen bits. * In one case, characters are represented in a Surrogate Pair, * using two special Unicode values. Such characters are in the so-called * "Astral Planes", with a code point above U+FFFF. A second case involves * composite characters, such as a base character combining with one or * more accent characters.

* *

Your code should not assume that algorithms using * char-at-a-time idioms will be working in character * units; in some cases they will split characters. This is relevant * wherever XML permits arbitrary characters, such as attribute values, * processing instruction data, and comments as well as in data reported * from this method. It's also generally relevant whenever Java code * manipulates internationalized text; the issue isn't unique to XML.

* *

Note that some parsers will report whitespace in element * content using the {@link #ignorableWhitespace ignorableWhitespace} * method rather than this one (validating parsers must * do so).

* * @param ch the characters from the XML document * @param start the start position in the array * @param length the number of characters to read from the array * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception * @see #ignorableWhitespace * @see org.xml.sax.Locator */ public void characters(char[] ch, int start, int length) throws SAXException { checkClosed(); try { this.writer.writeCharacters(ch, start, length); } catch (XMLStreamException e) { throw new SAXException(e); } } /** * Receive notification of the beginning of an element. * *

The Parser will invoke this method at the beginning of every * element in the XML document; there will be a corresponding * {@link #endElement endElement} event for every startElement event * (even when the element is empty). All of the element's content will be * reported, in order, before the corresponding endElement * event.

* *

This event allows up to three name components for each * element:

* *
    *
  1. the Namespace URI;
  2. *
  3. the local name; and
  4. *
  5. the qualified (prefixed) name.
  6. *
* *

Any or all of these may be provided, depending on the * values of the http://xml.org/sax/features/namespaces * and the http://xml.org/sax/features/namespace-prefixes * properties:

* *
    *
  • the Namespace URI and local name are required when * the namespaces property is true (the default), and are * optional when the namespaces property is false (if one is * specified, both must be);
  • *
  • the qualified name is required when the namespace-prefixes property * is true, and is optional when the namespace-prefixes property * is false (the default).
  • *
* *

Note that the attribute list provided will contain only * attributes with explicit values (specified or defaulted): * #IMPLIED attributes will be omitted. The attribute list * will contain attributes used for Namespace declarations * (xmlns* attributes) only if the * http://xml.org/sax/features/namespace-prefixes * property is true (it is false by default, and support for a * true value is optional).

* *

Like {@link #characters characters()}, attribute values may have * characters that need more than one char value.

* * @param namespaceURI the Namespace URI, or the empty string if the * element has no Namespace URI or if Namespace * processing is not being performed * @param localName the local name (without prefix), or the * empty string if Namespace processing is not being * performed * @param qName the qualified name (with prefix), or the * empty string if qualified names are not available * @param atts the attributes attached to the element. If * there are no attributes, it shall be an empty * Attributes object. The value of this object after * startElement returns is undefined * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception * @see #endElement * @see org.xml.sax.Attributes * @see org.xml.sax.helpers.AttributesImpl */ public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { checkClosed(); try { int qi = qName.indexOf(':'); String prefix = (qi > 0) ? qName.substring(0, qi) : ""; this.writer.writeStartElement(prefix, localName, namespaceURI); int length = namespaces.size(); for (int i = 0; i < length; i++) { QualifiedName ns = namespaces.get(i); this.writer.writeNamespace(ns.prefix, ns.namespaceName); } namespaces.clear(); length = atts.getLength(); for (int i = 0; i < length; i++) { this.writer.writeAttribute(atts.getURI(i), atts.getLocalName(i), atts.getValue(i)); } } catch (XMLStreamException e) { throw new SAXException(e); } } /** * Receive notification of the end of an element. * *

The SAX parser will invoke this method at the end of every * element in the XML document; there will be a corresponding * {@link #startElement startElement} event for every endElement * event (even when the element is empty).

* *

For information on the names, see startElement.

* * @param namespaceURI the Namespace URI, or the empty string if the * element has no Namespace URI or if Namespace * processing is not being performed * @param localName the local name (without prefix), or the * empty string if Namespace processing is not being * performed * @param qName the qualified XML name (with prefix), or the * empty string if qualified names are not available * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception */ public void endElement(String namespaceURI, String localName, String qName) throws SAXException { checkClosed(); try { this.writer.writeEndElement(); } catch (XMLStreamException e) { throw new SAXException(e); } } /** * Begin the scope of a prefix-URI Namespace mapping. * *

The information from this event is not necessary for * normal Namespace processing: the SAX XML reader will * automatically replace prefixes for element and attribute * names when the http://xml.org/sax/features/namespaces * feature is true (the default).

* *

There are cases, however, when applications need to * use prefixes in character data or in attribute values, * where they cannot safely be expanded automatically; the * start/endPrefixMapping event supplies the information * to the application to expand prefixes in those contexts * itself, if necessary.

* *

Note that start/endPrefixMapping events are not * guaranteed to be properly nested relative to each other: * all startPrefixMapping events will occur immediately before the * corresponding {@link #startElement startElement} event, * and all {@link #endPrefixMapping endPrefixMapping} * events will occur immediately after the corresponding * {@link #endElement endElement} event, * but their order is not otherwise * guaranteed.

* *

There should never be start/endPrefixMapping events for the * "xml" prefix, since it is predeclared and immutable.

* * @param prefix the Namespace prefix being declared. * An empty string is used for the default element namespace, * which has no prefix. * @param uri the Namespace URI the prefix is mapped to * @throws org.xml.sax.SAXException the client may throw * an exception during processing * @see #endPrefixMapping * @see #startElement */ public void startPrefixMapping(String prefix, String uri) throws SAXException { checkClosed(); try { this.writer.setPrefix(prefix, uri); namespaces.add(new QualifiedName(prefix, uri)); } catch (XMLStreamException e) { throw new SAXException(e); } } /** * End the scope of a prefix-URI mapping. * *

See {@link #startPrefixMapping startPrefixMapping} for * details. These events will always occur immediately after the * corresponding {@link #endElement endElement} event, but the order of * {@link #endPrefixMapping endPrefixMapping} events is not otherwise * guaranteed.

* * @param prefix the prefix that was being mapped. * This is the empty string when a default mapping scope ends. * @throws org.xml.sax.SAXException the client may throw * an exception during processing * @see #startPrefixMapping * @see #endElement */ public void endPrefixMapping(String prefix) throws SAXException { checkClosed(); // } /** * Receive notification of ignorable whitespace in element content. * *

Validating Parsers must use this method to report each chunk * of whitespace in element content (see the W3C XML 1.0 * recommendation, section 2.10): non-validating parsers may also * use this method if they are capable of parsing and using * content models.

* *

SAX parsers may return all contiguous whitespace in a single * chunk, or they may split it into several chunks; however, all of * the characters in any single event must come from the same * external entity, so that the Locator provides useful * information.

* *

The application must not attempt to read from the array * outside of the specified range.

* * @param ch the characters from the XML document * @param start the start position in the array * @param length the number of characters to read from the array * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception * @see #characters */ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { characters(ch, start, length); } /** * Receive notification of a processing instruction. * *

The Parser will invoke this method once for each processing * instruction found: note that processing instructions may occur * before or after the main document element.

* *

A SAX parser must never report an XML declaration (XML 1.0, * section 2.8) or a text declaration (XML 1.0, section 4.3.1) * using this method.

* *

Like {@link #characters characters()}, processing instruction * data may have characters that need more than one char * value.

* * @param target the processing instruction target * @param data the processing instruction data, or null if * none was supplied. The data does not include any * whitespace separating it from the target * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception */ public void processingInstruction(String target, String data) throws SAXException { checkClosed(); try { this.writer.writeProcessingInstruction(target, data); } catch (XMLStreamException e) { throw new SAXException(e); } } /** * Receive an object for locating the origin of SAX document events. * *

SAX parsers are strongly encouraged (though not absolutely * required) to supply a locator: if it does so, it must supply * the locator to the application by invoking this method before * invoking any of the other methods in the ContentHandler * interface.

* *

The locator allows the application to determine the end * position of any document-related event, even if the parser is * not reporting an error. Typically, the application will * use this information for reporting its own errors (such as * character content that does not match an application's * business rules). The information returned by the locator * is probably not sufficient for use with a search engine.

* *

Note that the locator will return correct information only * during the invocation SAX event callbacks after * {@link #startDocument startDocument} returns and before * {@link #endDocument endDocument} is called. The * application should not attempt to use it at any other time.

* * @param locator an object that can return the location of * any SAX document event * @see org.xml.sax.Locator */ public void setDocumentLocator(Locator locator) { this.locator = locator; } /** * Retrieves the Locator.

* @return the Locator */ public Locator getDocumentLocator() { return this.locator; } /** * Receive notification of a skipped entity. * This is not called for entity references within markup constructs * such as element start tags or markup declarations. (The XML * recommendation requires reporting skipped external entities. * SAX also reports internal entity expansion/non-expansion, except * within markup constructs.) * *

The Parser will invoke this method each time the entity is * skipped. Non-validating processors may skip entities if they * have not seen the declarations (because, for example, the * entity was declared in an external DTD subset). All processors * may skip external entities, depending on the values of the * http://xml.org/sax/features/external-general-entities * and the * http://xml.org/sax/features/external-parameter-entities * properties.

* * @param name the name of the skipped entity. If it is a * parameter entity, the name will begin with '%', and if * it is the external DTD subset, it will be the string * "[dtd]" * @throws org.xml.sax.SAXException any SAX exception, possibly * wrapping another exception */ public void skippedEntity(String name) throws SAXException { checkClosed(); // } public void comment(char[] ch, int start, int length) throws SAXException { checkClosed(); try { this.writer.writeComment(new String(ch, start, length)); } catch (XMLStreamException e) { throw new SAXException(e); } } public XMLStreamWriter getWriter() { return this.writer; } protected List getNamespaces() { return this.namespaces; } /** * Closes this object. */ public void close() throws IOException { if (!this.closed) { this.closed = true; try { this.writer.close(); } catch (XMLStreamException e) { throw new IOException(e); } finally { this.writer = null; this.locator = null; this.namespaces = null; } } } /** * Retrieves whether this object is closed. */ public boolean isClosed() { return this.closed; } /** * Checks whether this object is closed. * * @throws SAXException if this DOMBuilder is closed. */ protected void checkClosed() throws SAXException { if (isClosed()) { throw new SAXException("content handler is closed."); // NOI18N } } // --------------------- internal implementation ----------------------- protected class QualifiedName { public final String namespaceName; public final String prefix; public QualifiedName(final String prefix, final String namespaceName) { this.prefix = prefix; this.namespaceName = namespaceName; } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCArrayBasic.java0000644000175000017500000005464112007547356023171 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.sql.Array; import java.sql.ResultSet; import java.sql.SQLException; import org.hsqldb.ColumnBase; import org.hsqldb.navigator.RowSetNavigatorClient; import org.hsqldb.result.Result; import org.hsqldb.result.ResultMetaData; import org.hsqldb.types.Type; /** * The mapping in the Java programming language for the SQL type * ARRAY. * By default, an Array value is a transaction-duration * reference to an SQL ARRAY value. By default, an Array * object is implemented using an SQL LOCATOR(array) internally, which * means that an Array object contains a logical pointer * to the data in the SQL ARRAY value rather * than containing the ARRAY value's data. *

* The Array interface provides methods for bringing an SQL * ARRAY value's data to the client as either an array or a * ResultSet object. * If the elements of the SQL ARRAY * are a UDT, they may be custom mapped. To create a custom mapping, * a programmer must do two things: *

    *
  • create a class that implements the {@link java.sql.SQLData} * interface for the UDT to be custom mapped. *
  • make an entry in a type map that contains *
      *
    • the fully-qualified SQL type name of the UDT *
    • the Class object for the class implementing * SQLData *
    *
*

* When a type map with an entry for * the base type is supplied to the methods getArray * and getResultSet, the mapping * it contains will be used to map the elements of the ARRAY value. * If no type map is supplied, which would typically be the case, * the connection's type map is used by default. * If the connection's type map or a type map supplied to a method has no entry * for the base type, the elements are mapped according to the standard mapping. *

* All methods on the Array interface must be fully implemented if the * JDBC driver supports the data type. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since JDK 1.2, HSQLDB 2.0.1 */ public class JDBCArrayBasic implements Array { /** * Retrieves the SQL type name of the elements in * the array designated by this Array object. * If the elements are a built-in type, it returns * the database-specific type name of the elements. * If the elements are a user-defined type (UDT), * this method returns the fully-qualified SQL type name. * * @return a String that is the database-specific * name for a built-in base type; or the fully-qualified SQL type * name for a base type that is a UDT * @exception SQLException if an error occurs while attempting * to access the type name * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public String getBaseTypeName() throws SQLException { checkClosed(); return elementType.getNameString(); } /** * Retrieves the JDBC type of the elements in the array designated * by this Array object. * * @return a constant from the class {@link java.sql.Types} that is * the type code for the elements in the array designated by this * Array object * @exception SQLException if an error occurs while attempting * to access the base type * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public int getBaseType() throws SQLException { checkClosed(); return elementType.getJDBCTypeCode(); } /** * * Retrieves the contents of the SQL ARRAY value designated * by this * Array object in the form of an array in the Java * programming language. This version of the method getArray * uses the type map associated with the connection for customizations of * the type mappings. *

* Note: When getArray is used to materialize * a base type that maps to a primitive data type, then it is * implementation-defined whether the array returned is an array of * that primitive data type or an array of Object. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB always returns an array of Object. * *

* * * @return an array in the Java programming language that contains * the ordered elements of the SQL ARRAY value * designated by this Array object * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Object getArray() { return data; } /** * * Retrieves the contents of the SQL ARRAY value designated by this * Array object. * This method uses * the specified map for type map customizations * unless the base type of the array does not match a user-defined * type in map, in which case it * uses the standard mapping. This version of the method * getArray uses either the given type map or the standard mapping; * it never uses the type map associated with the connection. *

* Note: When getArray is used to materialize * a base type that maps to a primitive data type, then it is * implementation-defined whether the array returned is an array of * that primitive data type or an array of Object. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB always returns an array of Object. * *

* * * @param map a java.util.Map object that contains mappings * of SQL type names to classes in the Java programming language * @return an array in the Java programming language that contains the ordered * elements of the SQL array designated by this object * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Object getArray(java.util.Map> map) throws SQLException { return getArray(); } /** * * Retrieves a slice of the SQL ARRAY * value designated by this Array object, beginning with the * specified index and containing up to count * successive elements of the SQL array. This method uses the type map * associated with the connection for customizations of the type mappings. *

* Note: When getArray is used to materialize * a base type that maps to a primitive data type, then it is * implementation-defined whether the array returned is an array of * that primitive data type or an array of Object. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB always returns an array of Object. * *

* * * @param index the array index of the first element to retrieve; * the first element is at index 1 * @param count the number of successive SQL array elements to retrieve * @return an array containing up to count consecutive elements * of the SQL array, beginning with element index * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Object getArray(long index, int count) throws SQLException { checkClosed(); if (!JDBCClobClient.isInLimits(data.length, index - 1, count)) { throw Util.outOfRangeArgument(); } Object[] slice = new Object[count]; for (int i = 0; i < count; i++) { slice[i] = data[(int) index + i - 1]; } return slice; } /** * * Retreives a slice of the SQL ARRAY value * designated by this Array object, beginning with the specified * index and containing up to count * successive elements of the SQL array. *

* This method uses * the specified map for type map customizations * unless the base type of the array does not match a user-defined * type in map, in which case it * uses the standard mapping. This version of the method * getArray uses either the given type map or the standard mapping; * it never uses the type map associated with the connection. *

* Note: When getArray is used to materialize * a base type that maps to a primitive data type, then it is * implementation-defined whether the array returned is an array of * that primitive data type or an array of Object. * * * *

*

HSQLDB-Specific Information:

* * HSQLDB always returns an array of Object. * *

* * * @param index the array index of the first element to retrieve; * the first element is at index 1 * @param count the number of successive SQL array elements to * retrieve * @param map a java.util.Map object * that contains SQL type names and the classes in * the Java programming language to which they are mapped * @return an array containing up to count * consecutive elements of the SQL ARRAY value designated by this * Array object, beginning with element * index * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public Object getArray(long index, int count, java.util.Map> map) throws SQLException { return getArray(index, count); } /** * Retrieves a result set that contains the elements of the SQL * ARRAY value * designated by this Array object. If appropriate, * the elements of the array are mapped using the connection's type * map; otherwise, the standard mapping is used. *

* The result set contains one row for each array element, with * two columns in each row. The second column stores the element * value; the first column stores the index into the array for * that element (with the first array element being at index 1). * The rows are in ascending order corresponding to * the order of the indices. * * @return a {@link ResultSet} object containing one row for each * of the elements in the array designated by this Array * object, with the rows in ascending order based on the indices. * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public ResultSet getResultSet() throws SQLException { checkClosed(); Result result = this.newColumnResult(0, data.length); return JDBCResultSet.newJDBCResultSet(result, result.metaData); } /** * Retrieves a result set that contains the elements of the SQL * ARRAY value designated by this Array object. * This method uses * the specified map for type map customizations * unless the base type of the array does not match a user-defined * type in map, in which case it * uses the standard mapping. This version of the method * getResultSet uses either the given type map or the standard mapping; * it never uses the type map associated with the connection. *

* The result set contains one row for each array element, with * two columns in each row. The second column stores the element * value; the first column stores the index into the array for * that element (with the first array element being at index 1). * The rows are in ascending order corresponding to * the order of the indices. * * @param map contains the mapping of SQL user-defined types to * classes in the Java programming language * @return a ResultSet object containing one row for each * of the elements in the array designated by this Array * object, with the rows in ascending order based on the indices. * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public ResultSet getResultSet(java.util.Map> map) throws SQLException { return getResultSet(); } /** * Retrieves a result set holding the elements of the subarray that * starts at index index and contains up to * count successive elements. This method uses * the connection's type map to map the elements of the array if * the map contains an entry for the base type. Otherwise, the * standard mapping is used. *

* The result set has one row for each element of the SQL array * designated by this object, with the first row containing the * element at index index. The result set has * up to count rows in ascending order based on the * indices. Each row has two columns: The second column stores * the element value; the first column stores the index into the * array for that element. * * @param index the array index of the first element to retrieve; * the first element is at index 1 * @param count the number of successive SQL array elements to retrieve * @return a ResultSet object containing up to * count consecutive elements of the SQL array * designated by this Array object, starting at * index index. * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public ResultSet getResultSet(long index, int count) throws SQLException { checkClosed(); Result result = this.newColumnResult(index - 1, count); return new JDBCResultSet(null, result, result.metaData); } /** * Retrieves a result set holding the elements of the subarray that * starts at index index and contains up to * count successive elements. * This method uses * the specified map for type map customizations * unless the base type of the array does not match a user-defined * type in map, in which case it * uses the standard mapping. This version of the method * getResultSet uses either the given type map or the standard mapping; * it never uses the type map associated with the connection. *

* The result set has one row for each element of the SQL array * designated by this object, with the first row containing the * element at index index. The result set has * up to count rows in ascending order based on the * indices. Each row has two columns: The second column stores * the element value; the first column stores the index into the * array for that element. * * @param index the array index of the first element to retrieve; * the first element is at index 1 * @param count the number of successive SQL array elements to retrieve * @param map the Map object that contains the mapping * of SQL type names to classes in the Java(tm) programming language * @return a ResultSet object containing up to * count consecutive elements of the SQL array * designated by this Array object, starting at * index index. * @exception SQLException if an error occurs while attempting to * access the array * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 */ public ResultSet getResultSet(long index, int count, java.util.Map> map) throws SQLException { return getResultSet(index, count); } /** * Returns a string representation in the form ARRAY[..., ...] */ public String toString() { if (arrayType == null) { arrayType = Type.getDefaultArrayType(elementType.typeCode); } return arrayType.convertToString(data); } /** * This method frees the Array object and releases the resources that * it holds. The object is invalid once the free * method is called. *

* After free has been called, any attempt to invoke a * method other than free will result in a SQLException * being thrown. If free is called multiple times, the subsequent * calls to free are treated as a no-op. *

* * @throws SQLException if an error occurs releasing * the Array's resources * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6 */ public void free() throws SQLException { // } //------------- Type arrayType; Type elementType; Object[] data; public JDBCArrayBasic(Object[] data, Type type) { this.data = data; this.elementType = type; } Object[] getArrayInternal() { return data; } private Result newColumnResult(long position, int count) throws SQLException { if (!JDBCClobClient.isInLimits(data.length, position, count)) { throw Util.outOfRangeArgument(); } Type[] types = new Type[2]; types[0] = Type.SQL_INTEGER; types[1] = elementType; ResultMetaData meta = ResultMetaData.newSimpleResultMetaData(types); meta.columnLabels = new String[] { "C1", "C2" }; meta.colIndexes = new int[] { -1, -1 }; meta.columns = new ColumnBase[2]; for (int i = 0; i < meta.columns.length; i++) { ColumnBase column = new ColumnBase("", "", "", ""); column.setType(types[i]); meta.columns[i] = column; } RowSetNavigatorClient navigator = new RowSetNavigatorClient(); for (int i = (int) position; i < position + count; i++) { Object[] rowData = new Object[2]; rowData[0] = Integer.valueOf(i + 1); rowData[1] = data[i]; navigator.add(rowData); } Result result = Result.newDataResult(meta); result.setNavigator(navigator); return result; } private void checkClosed() throws SQLException { } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbc/JDBCCallableStatement.java0000644000175000017500000060053012007547356024527 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.jdbc; import java.io.Reader; import java.io.InputStream; import java.io.StringReader; import java.math.BigDecimal; import java.sql.Array; import java.sql.Blob; import java.sql.CallableStatement; import java.sql.Clob; import java.sql.Date; import java.sql.Ref; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; import java.util.Map; //#ifdef JAVA6 import java.sql.NClob; import java.sql.RowId; import java.sql.SQLXML; //#endif JAVA6 import org.hsqldb.error.ErrorCode; import org.hsqldb.HsqlException; import org.hsqldb.HsqlDateTime; import org.hsqldb.SchemaObject; import org.hsqldb.error.Error; import org.hsqldb.lib.IntValueHashMap; import org.hsqldb.result.ResultConstants; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobDataID; import org.hsqldb.types.ClobDataID; import org.hsqldb.types.DateTimeType; import org.hsqldb.types.JavaObjectData; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /* $Id: JDBCCallableStatement.java 4395 2011-08-13 00:02:56Z fredt $ */ /** @todo fredt 1.9.0 - review wrt multiple result sets, named parameters etc. */ // boucherb@users patch 1.7.2 - CallableStatement impl removed // from JDBCParameterMetaData and moved here; sundry changes elsewhere to // comply // TODO: 1.7.2 Alpha N :: DONE // maybe implement set-by-parameter-name. We have an informal spec, // being "@p1" => 1, "@p2" => 2, etc. Problems: return value is "@p0" // and there is no support for registering the return value as an out // parameter. // TODO: 1.9.x :: DONE // engine and client-side mechanisms for adding, retrieving, // navigating (and perhaps controlling holdability of) multiple // results generated from a single execution. // boucherb@users 2004-03/04-xx - patch 1.7.2 - some minor code cleanup // - parameter map NPE correction // - embedded SQL/SQLCLI client usability // (parameter naming changed from @n to @pn) // boucherb@users 2004-04-xx - doc 1.7.2 - javadocs added/updated // boucherb@users 2005-12-07 - patch 1.8.0.x - initial JDBC 4.0 support work // boucherb@users 2006-05-22 - doc 1.9.0 - full synch up to Mustang Build 84 // Revision 1.14 2006/07/12 11:58:49 boucherb // - full synch up to Mustang b90 /** * * * The interface used to execute SQL stored procedures. The JDBC API * provides a stored procedure SQL escape syntax that allows stored procedures * to be called in a standard way for all RDBMSs. This escape syntax has one * form that includes a result parameter and one that does not. If used, the result * parameter must be registered as an OUT parameter. The other parameters * can be used for input, output or both. Parameters are referred to * sequentially, by number, with the first parameter being 1. *

(JDBC4 clarification:) *

 *   {?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
 *   {call <procedure-name>[(<arg1>,<arg2>, ...)]}
 * 
*

* IN parameter values are set using the set methods inherited from * {@link java.sql.PreparedStatement}. The type of all OUT parameters must be * registered prior to executing the stored procedure; their values * are retrieved after execution via the get methods provided here. *

* A CallableStatement can return one {@link java.sql.ResultSet} object or * multiple ResultSet objects. Multiple * ResultSet objects are handled using operations * inherited from {@link java.sql.Statement}. *

* For maximum portability, a call's ResultSet objects and * update counts should be processed prior to getting the values of output * parameters. *

* * * * *

*

HSQLDB-Specific Information:

* * As with many DBMS, HSQLDB support for stored procedures is not provided in * a completely standard fashion.

* * Beyond the XOpen/ODBC extended scalar functions, stored procedures are * typically supported in ways that vary greatly from one DBMS implementation * to the next. So, it is almost guaranteed that the code for a stored * procedure written under a specific DBMS product will not work without * at least some modification in the context of another vendor's product * or even across a single vendor's product lines. Moving stored procedures * from one DBMS product line to another almost invariably involves complex * porting issues and often may not be possible at all. Be warned.

* * One kind of HSQLDB stored procedures and functions is Java routines that map * directly onto the static methods of compiled Java classes found on the class * path of the engine at runtime. The CREATE PROCEDURE or CREATE FUNCTION * statements are used in SQL to support the Java methods.

* * The other kind of HSQLDB stored procedures is SQL routines that are created * as part of schemas. * * Overloaded methods are supported and resolved according to the type of * parameters. * * With procedures, OUT and IN OUT parameters * are also supported.

* * In addition, HSQLDB stored procedure call mechanism allows the * more general HSQLDB SQL expression evaluation mechanism. This * extension provides the ability to evaluate simple SQL expressions, possibly * containing Java method invocations.

* * With HSQLDB, executing a CALL statement that produces an opaque * (OTHER) or known scalar object reference has virtually the same effect as: * *

 * CREATE TABLE DUAL (dummy VARCHAR);
 * INSERT INTO DUAL VALUES(NULL);
 * SELECT <simple-expression> FROM DUAL;
 * 
* * HSQLDB functions can return a single result set. Procedures that * return one or more result sets. * * Here is a very simple example of an HSQLDB stored procedure generating a * user-defined result set: * *
 * package mypackage;
 *
 * import java.sql.ResultSet;
 * import java.sql.SQLException;
 *
 * class MyLibraryClass {
 *
 *      public static ResultSet mySp() throws SQLException {
 *          return ctx.getConnection().createStatement().executeQuery("select * from my_table");
 *      }
 * }
 *
 * 
* * (boucherb@users) *
* * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.7.2 * @revised JDK 1.6, HSQLDB 2.0 * @revised JDK 1.7, HSQLDB 2.0.1 * @see JDBCConnection#prepareCall * @see JDBCResultSet */ public class JDBCCallableStatement extends JDBCPreparedStatement implements CallableStatement { // ----------------------------------- JDBC 1 ---------------------------------- /** * * * Registers the OUT parameter in ordinal position * parameterIndex to the JDBC type * sqlType. All OUT parameters must be registered * before a stored procedure is executed. *

* The JDBC type specified by sqlType for an OUT * parameter determines the Java type that must be used * in the get method to read the value of that parameter. *

* If the JDBC type expected to be returned to this output parameter * is specific to this particular database, sqlType * should be java.sql.Types.OTHER. The method * {@link #getObject} retrieves the value. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature. This method can be called after a * PrepareCall method. HSQLDB has already determined which parameters are * OUT or INOUT parameters, therefore this method only checks and * throws an exception if the parameter is not of the correct form. * The data type argument is ignored

* * The get method to read the value of the parameter is * determined by the engine based on the data type of the parameter. * * Furthermore, HSQLDB supports multiple OUT and INOUT parameters for * stored procedures.

*

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @param sqlType the JDBC type code defined by java.sql.Types. * If the parameter is of JDBC type NUMERIC * or DECIMAL, the version of * registerOutParameter that accepts a scale value * should be used. * * @exception SQLException JDBC 4.1 [if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if sqlType is * a ARRAY, BLOB, CLOB, * DATALINK, JAVA_OBJECT, NCHAR, * NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML * or STRUCT data type and the JDBC driver does not support * this data type * @see java.sql.Types */ public synchronized void registerOutParameter(int parameterIndex, int sqlType) throws SQLException { checkGetParameterIndex(parameterIndex); if (parameterModes[--parameterIndex] == SchemaObject.ParameterModes.PARAM_IN) { throw Util.invalidArgument(); } } /** * * * Registers the parameter in ordinal position * parameterIndex to be of JDBC type * sqlType. (JDBC4 clarification:) All OUT parameters must be registered * before a stored procedure is executed. *

* The JDBC type specified by sqlType for an OUT * parameter determines the Java type that must be used * in the get method to read the value of that parameter. *

* This version of registerOutParameter should be * used when the parameter is of JDBC type NUMERIC * or DECIMAL. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @param sqlType the SQL type code defined by java.sql.Types. * @param scale the desired number of digits to the right of the * decimal point. It must be greater than or equal to zero. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if sqlType is * a ARRAY, BLOB, CLOB, * DATALINK, JAVA_OBJECT, NCHAR, * NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML * or STRUCT data type and the JDBC driver does not support * this data type * @see java.sql.Types */ public synchronized void registerOutParameter(int parameterIndex, int sqlType, int scale) throws SQLException { registerOutParameter(parameterIndex, sqlType); } /** * * * Retrieves whether the last OUT parameter read had the value of * SQL NULL. Note that this method should be called only after * calling a getter method; otherwise, there is no value to use in * determining whether it is null or not. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @return true if the last parameter read was SQL * NULL; false otherwise * @exception SQLException if a database access error occurs or * this method is called on a closed CallableStatement */ public synchronized boolean wasNull() throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } return wasNullValue; } /** * * * Retrieves the value of the designated JDBC CHAR, * VARCHAR, or LONGVARCHAR parameter as a * String in the Java programming language. *

* For the fixed-length type JDBC CHAR, * the String object * returned has exactly the same value the (JDBC4 clarification:) SQL * CHAR value had in the * database, including any padding added by the database. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value. If the value is SQL NULL, * the result * is null. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setString */ public synchronized String getString( int parameterIndex) throws SQLException { return (String) getColumnInType(parameterIndex, Type.SQL_VARCHAR); } /** * * * (JDBC4 modified:) * Retrieves the value of the designated JDBC BIT * or BOOLEAN parameter as a * boolean in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value. If the value is SQL NULL, * the result is false. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setBoolean */ public synchronized boolean getBoolean( int parameterIndex) throws SQLException { Object o = getColumnInType(parameterIndex, Type.SQL_BOOLEAN); return o == null ? false : ((Boolean) o).booleanValue(); } /** * * * Retrieves the value of the designated JDBC TINYINT parameter * as a byte in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value. If the value is SQL NULL, the result * is 0. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setByte */ public synchronized byte getByte(int parameterIndex) throws SQLException { Object o = getColumnInType(parameterIndex, Type.TINYINT); return o == null ? 0 : ((Number) o).byteValue(); } /** * * * Retrieves the value of the designated JDBC SMALLINT parameter * as a short in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value. If the value is SQL NULL, the result * is 0. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setShort */ public synchronized short getShort( int parameterIndex) throws SQLException { Object o = getColumnInType(parameterIndex, Type.SQL_SMALLINT); return o == null ? 0 : ((Number) o).shortValue(); } /** * * * Retrieves the value of the designated JDBC INTEGER parameter * as an int in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value. If the value is SQL NULL, the result * is 0. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setInt */ public synchronized int getInt(int parameterIndex) throws SQLException { Object o = getColumnInType(parameterIndex, Type.SQL_INTEGER); return o == null ? 0 : ((Number) o).intValue(); } /** * * * Retrieves the value of the designated JDBC BIGINT parameter * as a long in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value. If the value is SQL NULL, the result * is 0. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setLong */ public synchronized long getLong(int parameterIndex) throws SQLException { Object o = getColumnInType(parameterIndex, Type.SQL_BIGINT); return o == null ? 0 : ((Number) o).longValue(); } /** * * * Retrieves the value of the designated JDBC FLOAT parameter * as a float in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value. If the value is SQL NULL, the result * is 0. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setFloat */ public synchronized float getFloat( int parameterIndex) throws SQLException { Object o = getColumnInType(parameterIndex, Type.SQL_DOUBLE); return o == null ? (float) 0.0 : ((Number) o).floatValue(); } /** * * * Retrieves the value of the designated JDBC DOUBLE parameter as a double * in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value. If the value is SQL NULL, the result * is 0. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setDouble */ public synchronized double getDouble( int parameterIndex) throws SQLException { Object o = getColumnInType(parameterIndex, Type.SQL_DOUBLE); return o == null ? 0.0 : ((Number) o).doubleValue(); } /** * * * Retrieves the value of the designated JDBC NUMERIC parameter as a * java.math.BigDecimal object with scale digits to * the right of the decimal point. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @param scale the number of digits to the right of the decimal point * @return the parameter value. If the value is SQL NULL, the result * is null. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @deprecated use getBigDecimal(int parameterIndex) * or getBigDecimal(String parameterName) * @see #setBigDecimal */ //#ifdef DEPRECATEDJDBC public synchronized BigDecimal getBigDecimal(int parameterIndex, int scale) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } if (scale < 0) { throw Util.outOfRangeArgument(); } BigDecimal bd = getBigDecimal(parameterIndex); if (bd != null) { bd = bd.setScale(scale, BigDecimal.ROUND_DOWN); } return bd; } //#endif /** * * * Retrieves the value of the designated JDBC BINARY or * VARBINARY parameter as an array of byte * values in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value. If the value is SQL NULL, the result * is null. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setBytes */ public synchronized byte[] getBytes( int parameterIndex) throws SQLException { Object x = getColumnInType(parameterIndex, Type.SQL_VARBINARY); if (x == null) { return null; } return ((BinaryData) x).getBytes(); } /** * * * Retrieves the value of the designated JDBC DATE parameter as a * java.sql.Date object. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value. If the value is SQL NULL, the result * is null. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setDate */ public synchronized Date getDate(int parameterIndex) throws SQLException { TimestampData t = (TimestampData) getColumnInType(parameterIndex, Type.SQL_DATE); if (t == null) { return null; } return (Date) Type.SQL_DATE.convertSQLToJava(session, t); } /** * * * Retrieves the value of the designated JDBC TIME parameter as a * java.sql.Time object. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value. If the value is SQL NULL, the result * is null. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setTime */ public synchronized Time getTime(int parameterIndex) throws SQLException { TimeData t = (TimeData) getColumnInType(parameterIndex, Type.SQL_TIME); if (t == null) { return null; } return (Time) Type.SQL_TIME.convertSQLToJava(session, t); } /** * * * Retrieves the value of the designated JDBC TIMESTAMP * parameter as a java.sql.Timestamp object.

* * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value. If the value is SQL NULL, the result * is null. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setTimestamp */ public synchronized Timestamp getTimestamp( int parameterIndex) throws SQLException { TimestampData t = (TimestampData) getColumnInType(parameterIndex, Type.SQL_TIMESTAMP); if (t == null) { return null; } return (Timestamp) Type.SQL_TIMESTAMP.convertSQLToJava(session, t); } //---------------------------------------------------------------------- // Advanced features: /** * * * Retrieves the value of the designated parameter as an Object * in the Java programming language. If the value is an SQL NULL, * the driver returns a Java null. *

* This method returns a Java object whose type corresponds to the JDBC * type that was registered for this parameter using the method * registerOutParameter. By registering the target JDBC * type as java.sql.Types.OTHER, this method can be used * to read database-specific abstract data types. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return A java.lang.Object holding the OUT parameter value * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see java.sql.Types * @see #setObject */ public synchronized Object getObject( int parameterIndex) throws SQLException { checkGetParameterIndex(parameterIndex); Type sourceType = parameterTypes[parameterIndex - 1]; switch (sourceType.typeCode) { case Types.SQL_ARRAY : return getArray(parameterIndex); case Types.SQL_DATE : return getDate(parameterIndex); case Types.SQL_TIME : case Types.SQL_TIME_WITH_TIME_ZONE : return getTime(parameterIndex); case Types.SQL_TIMESTAMP : case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : return getTimestamp(parameterIndex); case Types.SQL_BINARY : case Types.SQL_VARBINARY : return getBytes(parameterIndex); case Types.SQL_BIT : { boolean b = getBoolean(parameterIndex); return wasNull() ? null : b ? Boolean.TRUE : Boolean.FALSE; } case Types.SQL_CLOB : return getClob(parameterIndex); case Types.SQL_BLOB : return getBlob(parameterIndex); case Types.OTHER : case Types.JAVA_OBJECT : { Object o = getColumnInType(parameterIndex, sourceType); if (o == null) { return null; } try { return ((JavaObjectData) o).getObject(); } catch (HsqlException e) { throw Util.sqlException(e); } } default : return getColumnInType(parameterIndex, sourceType); } } //--------------------------JDBC 2.0----------------------------- /** * * * Retrieves the value of the designated JDBC NUMERIC parameter as a * java.math.BigDecimal object with as many digits to the * right of the decimal point as the value contains. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value in full precision. If the value is * SQL NULL, the result is null. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setBigDecimal * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized BigDecimal getBigDecimal( int parameterIndex) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } Type targetType = parameterMetaData.columnTypes[parameterIndex - 1]; switch (targetType.typeCode) { case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : break; case Types.TINYINT : case Types.SQL_SMALLINT : case Types.SQL_INTEGER : case Types.SQL_BIGINT : targetType = Type.SQL_DECIMAL; break; case Types.SQL_DOUBLE : default : targetType = Type.SQL_DECIMAL_DEFAULT; break; } return (BigDecimal) getColumnInType(parameterIndex, targetType); } /** * * * Returns an object representing the value of OUT parameter * parameterIndex and uses map for the custom * mapping of the parameter value. *

* This method returns a Java object whose type corresponds to the * JDBC type that was registered for this parameter using the method * registerOutParameter. By registering the target * JDBC type as java.sql.Types.OTHER, this method can * be used to read database-specific abstract data types. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterIndex the first parameter is 1, the second is 2, and so on * @param map the mapping from SQL type names to Java classes * @return a java.lang.Object holding the OUT parameter value * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setObject * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ //#ifdef JAVA6 public Object getObject(int parameterIndex, Map> map) throws SQLException { checkGetParameterIndex(parameterIndex); throw Util.notSupported(); } //#else /* public Object getObject(int parameterIndex, Map map) throws SQLException { checkGetParameterIndex(parameterIndex); throw Util.notSupported(); } */ //#endif /** * * * Retrieves the value of the designated JDBC REF(<structured-type>) * parameter as a {@link java.sql.Ref} object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @return the parameter value as a Ref object in the * Java programming language. If the value was SQL NULL, the value * null is returned. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public Ref getRef(int parameterIndex) throws SQLException { checkGetParameterIndex(parameterIndex); throw Util.notSupported(); } /** * * * Retrieves the value of the designated JDBC BLOB parameter as a * {@link java.sql.Blob} object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, and so on * @return the parameter value as a Blob object in the * Java programming language. If the value was SQL NULL, the value * null is returned. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized Blob getBlob(int parameterIndex) throws SQLException { checkGetParameterIndex(parameterIndex); Type sourceType = parameterMetaData.columnTypes[parameterIndex - 1]; Object o = getColumnInType(parameterIndex, sourceType); if (o == null) { return null; } if (o instanceof BlobDataID) { return new JDBCBlobClient(session, (BlobDataID) o); } throw Util.sqlException(ErrorCode.X_42561); } /** * * * Retrieves the value of the designated JDBC CLOB parameter as a * java.sql.Clob object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, and * so on * @return the parameter value as a Clob object in the * Java programming language. If the value was SQL NULL, the * value null is returned. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized Clob getClob(int parameterIndex) throws SQLException { checkGetParameterIndex(parameterIndex); Type sourceType = parameterMetaData.columnTypes[parameterIndex - 1]; Object o = getColumnInType(parameterIndex, sourceType); if (o == null) { return null; } if (o instanceof ClobDataID) { return new JDBCClobClient(session, (ClobDataID) o); } throw Util.sqlException(ErrorCode.X_42561); } /** * * * Retrieves the value of the designated JDBC ARRAY parameter as an * {@link java.sql.Array} object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, and * so on * @return the parameter value as an Array object in * the Java programming language. If the value was SQL NULL, the * value null is returned. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public Array getArray(int parameterIndex) throws SQLException { checkGetParameterIndex(parameterIndex); Type type = parameterMetaData.columnTypes[parameterIndex - 1]; if (!type.isArrayType()) { throw Util.sqlException(ErrorCode.X_42561); } Object[] data = (Object[]) parameterValues[parameterIndex - 1]; if (data == null) { return null; } return new JDBCArray(data, type.collectionBaseType(), type, connection); } /** * * * Retrieves the value of the designated JDBC DATE parameter as a * java.sql.Date object, using * the given Calendar object * to construct the date. * With a Calendar object, the driver * can calculate the date taking into account a custom timezone and locale. * If no Calendar object is specified, the driver uses the * default timezone and locale. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @param cal the Calendar object the driver will use * to construct the date * @return the parameter value. If the value is SQL NULL, the result * is null. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setDate * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized Date getDate(int parameterIndex, Calendar cal) throws SQLException { TimestampData t = (TimestampData) getColumnInType(parameterIndex, Type.SQL_DATE); if (t == null) { return null; } long millis = t.getSeconds() * 1000; if (cal != null) { millis = HsqlDateTime.convertMillisToCalendar(cal, millis); } return new Date(millis); } /** * * * Retrieves the value of the designated JDBC TIME parameter as a * java.sql.Time object, using * the given Calendar object * to construct the time. * With a Calendar object, the driver * can calculate the time taking into account a custom timezone and locale. * If no Calendar object is specified, the driver uses the * default timezone and locale. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @param cal the Calendar object the driver will use * to construct the time * @return the parameter value; if the value is SQL NULL, the result * is null. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setTime * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized Time getTime(int parameterIndex, Calendar cal) throws SQLException { TimeData t = (TimeData) getColumnInType(parameterIndex, Type.SQL_TIME); if (t == null) { return null; } long millis = DateTimeType.normaliseTime(t.getSeconds()) * 1000; if (!parameterMetaData.columnTypes[--parameterIndex] .isDateTimeTypeWithZone()) { Calendar calendar = cal == null ? session.getCalendar() : cal; millis = HsqlDateTime.convertMillisToCalendar(calendar, millis); millis = HsqlDateTime.getNormalisedTime(millis); } return new Time(millis); } /** * * * Retrieves the value of the designated JDBC TIMESTAMP parameter as a * java.sql.Timestamp object, using * the given Calendar object to construct * the Timestamp object. * With a Calendar object, the driver * can calculate the timestamp taking into account a custom timezone and locale. * If no Calendar object is specified, the driver uses the * default timezone and locale. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2, * and so on * @param cal the Calendar object the driver will use * to construct the timestamp * @return the parameter value. If the value is SQL NULL, the result * is null. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @see #setTimestamp * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) */ public synchronized Timestamp getTimestamp(int parameterIndex, Calendar cal) throws SQLException { TimestampData t = (TimestampData) getColumnInType(parameterIndex, Type.SQL_TIMESTAMP); if (t == null) { return null; } long millis = t.getSeconds() * 1000; if (!parameterMetaData.columnTypes[--parameterIndex] .isDateTimeTypeWithZone()) { Calendar calendar = cal == null ? session.getCalendar() : cal; if (cal != null) { millis = HsqlDateTime.convertMillisToCalendar(calendar, millis); } } Timestamp ts = new Timestamp(millis); ts.setNanos(t.getNanos()); return ts; } /** * * * Registers the designated output parameter. * This version of * the method registerOutParameter * should be used for a user-defined or REF output parameter. Examples * of user-defined types include: STRUCT, DISTINCT, * JAVA_OBJECT, and named array types. *

* All OUT parameters must be registered * before a stored procedure is executed. *

For a user-defined parameter, the fully-qualified SQL * type name of the parameter should also be given, while a REF * parameter requires that the fully-qualified type name of the * referenced type be given. A JDBC driver that does not need the * type code and type name information may ignore it. To be portable, * however, applications should always provide these values for * user-defined and REF parameters. * * Although it is intended for user-defined and REF parameters, * this method may be used to register a parameter of any JDBC type. * If the parameter does not have a user-defined or REF type, the * typeName parameter is ignored. * *

Note: When reading the value of an out parameter, you * must use the getter method whose Java type corresponds to the * parameter's registered SQL type. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2,... * @param sqlType a value from {@link java.sql.Types} * @param typeName the fully-qualified name of an SQL structured type * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if sqlType is * a ARRAY, BLOB, CLOB, * DATALINK, JAVA_OBJECT, NCHAR, * NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML * or STRUCT data type and the JDBC driver does not support * this data type * @see java.sql.Types * @since JDK 1.2 (JDK 1.1.x developers: read the overview for * JDBCParameterMetaData) * */ public synchronized void registerOutParameter(int parameterIndex, int sqlType, String typeName) throws SQLException { registerOutParameter(parameterIndex, sqlType); } // ----------------------------------- JDBC 3.0---------------------------------- /** * * * Registers the OUT parameter named * parameterName to the JDBC type * sqlType. All OUT parameters must be registered * before a stored procedure is executed. *

* The JDBC type specified by sqlType for an OUT * parameter determines the Java type that must be used * in the get method to read the value of that parameter. *

* If the JDBC type expected to be returned to this output parameter * is specific to this particular database, sqlType * should be java.sql.Types.OTHER. The method * {@link #getObject} retrieves the value. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @param sqlType the JDBC type code defined by java.sql.Types. * If the parameter is of JDBC type NUMERIC * or DECIMAL, the version of * registerOutParameter that accepts a scale value * should be used. * @exception SQLException JDBC 41.[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if sqlType is * a ARRAY, BLOB, CLOB, * DATALINK, JAVA_OBJECT, NCHAR, * NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML * or STRUCT data type and the JDBC driver does not support * this data type or if the JDBC driver does not support * this method * @since JDK 1.4, HSQL 1.7.0 * @see java.sql.Types */ //#ifdef JAVA4 public synchronized void registerOutParameter(String parameterName, int sqlType) throws SQLException { registerOutParameter(findParameterIndex(parameterName), sqlType); } //#endif JAVA4 /** * * * Registers the parameter named * parameterName to be of JDBC type * sqlType. (JDBC4 clarification:) All OUT parameters must be registered * before a stored procedure is executed. *

* The JDBC type specified by sqlType for an OUT * parameter determines the Java type that must be used * in the get method to read the value of that parameter. *

* This version of registerOutParameter should be * used when the parameter is of JDBC type NUMERIC * or DECIMAL. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @param sqlType SQL type code defined by java.sql.Types. * @param scale the desired number of digits to the right of the * decimal point. It must be greater than or equal to zero. * @exception SQLException JDBC 41.[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if sqlType is * a ARRAY, BLOB, CLOB, * DATALINK, JAVA_OBJECT, NCHAR, * NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML * or STRUCT data type and the JDBC driver does not support * this data type or if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 * @see java.sql.Types */ //#ifdef JAVA4 public synchronized void registerOutParameter(String parameterName, int sqlType, int scale) throws SQLException { registerOutParameter(findParameterIndex(parameterName), sqlType); } //#endif JAVA4 /** * * * Registers the designated output parameter. This version of * the method registerOutParameter * should be used for a user-named or REF output parameter. Examples * of user-named types include: STRUCT, DISTINCT, JAVA_OBJECT, and * named array types. *

* (JDBC4 clarification:)

* All OUT parameters must be registered * before a stored procedure is executed. *

* For a user-named parameter the fully-qualified SQL * type name of the parameter should also be given, while a REF * parameter requires that the fully-qualified type name of the * referenced type be given. A JDBC driver that does not need the * type code and type name information may ignore it. To be portable, * however, applications should always provide these values for * user-named and REF parameters. * * Although it is intended for user-named and REF parameters, * this method may be used to register a parameter of any JDBC type. * If the parameter does not have a user-named or REF type, the * typeName parameter is ignored. * *

Note: When reading the value of an out parameter, you * must use the getXXX method whose Java type XXX corresponds to the * parameter's registered SQL type. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @param sqlType a value from {@link java.sql.Types} * @param typeName the fully-qualified name of an SQL structured type * @exception SQLException JDBC 41.[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if sqlType is * a ARRAY, BLOB, CLOB, * DATALINK, JAVA_OBJECT, NCHAR, * NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML * or STRUCT data type and the JDBC driver does not support * this data type or if the JDBC driver does not support * this method * @see java.sql.Types * @since JDK 1.4, HSQL 1.7.0 */ //#ifdef JAVA4 public synchronized void registerOutParameter(String parameterName, int sqlType, String typeName) throws SQLException { registerOutParameter(findParameterIndex(parameterName), sqlType); } //#endif JAVA4 /** * * * Retrieves the value of the designated JDBC DATALINK parameter as a * java.net.URL object. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterIndex the first parameter is 1, the second is 2,... * @return a java.net.URL object that represents the * JDBC DATALINK value used as the designated * parameter * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs, * this method is called on a closed CallableStatement, * or if the URL being returned is * not a valid URL on the Java platform * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setURL * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public java.net.URL getURL(int parameterIndex) throws SQLException { checkGetParameterIndex(parameterIndex); throw Util.notSupported(); } //#endif JAVA4 /** * * * Sets the designated parameter to the given java.net.URL object. * The driver converts this to an SQL DATALINK value when * it sends it to the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterName the name of the parameter * @param val the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs, * this method is called on a closed CallableStatement, * or if a URL is malformed * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getURL * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public void setURL(String parameterName, java.net.URL val) throws SQLException { setURL(findParameterIndex(parameterName), val); } //#endif JAVA4 /** * * * Sets the designated parameter to SQL NULL. * *

Note: You must specify the parameter's SQL type. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param sqlType the SQL type code defined in java.sql.Types * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setNull(String parameterName, int sqlType) throws SQLException { setNull(findParameterIndex(parameterName), sqlType); } //#endif JAVA4 /** * * * Sets the designated parameter to the given Java boolean value. * *

(JDBC4 clarification:)

* * The driver converts this * to an SQL BIT or BOOLEAN value when it sends it to the database. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @see #getBoolean * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getBoolean * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setBoolean(String parameterName, boolean x) throws SQLException { setBoolean(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given Java byte value. * The driver converts this * to an SQL TINYINT value when it sends it to the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getByte * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setByte(String parameterName, byte x) throws SQLException { setByte(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given Java short value. * The driver converts this * to an SQL SMALLINT value when it sends it to the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getShort * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setShort(String parameterName, short x) throws SQLException { setShort(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given Java int value. * The driver converts this * to an SQL INTEGER value when it sends it to the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getInt * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setInt(String parameterName, int x) throws SQLException { setInt(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given Java long value. * The driver converts this * to an SQL BIGINT value when it sends it to the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getLong * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setLong(String parameterName, long x) throws SQLException { setLong(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given Java float value. * The driver converts this * to an SQL FLOAT value when it sends it to the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getFloat * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setFloat(String parameterName, float x) throws SQLException { setFloat(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given Java double value. * The driver converts this * to an SQL DOUBLE value when it sends it to the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getDouble * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setDouble(String parameterName, double x) throws SQLException { setDouble(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given * java.math.BigDecimal value. * The driver converts this to an SQL NUMERIC value when * it sends it to the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getBigDecimal * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setBigDecimal(String parameterName, BigDecimal x) throws SQLException { setBigDecimal(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given Java String value. * The driver converts this * to an SQL VARCHAR or LONGVARCHAR value * (depending on the argument's * size relative to the driver's limits on VARCHAR values) * when it sends it to the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getString * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setString(String parameterName, String x) throws SQLException { setString(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given Java array of bytes. * The driver converts this to an SQL VARBINARY or * LONGVARBINARY (depending on the argument's size relative * to the driver's limits on VARBINARY values) when it sends * it to the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getBytes * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setBytes(String parameterName, byte[] x) throws SQLException { setBytes(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given java.sql.Date value * (JDBC4 clarification:)

* using the default time zone of the virtual machine that is running * the application. * The driver converts this * to an SQL DATE value when it sends it to the database. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getDate * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setDate(String parameterName, Date x) throws SQLException { setDate(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given java.sql.Time value. * The driver converts this * to an SQL TIME value when it sends it to the database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getTime * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setTime(String parameterName, Time x) throws SQLException { setTime(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given java.sql.Timestamp value. * The driver * converts this to an SQL TIMESTAMP value when it sends it to the * database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getTimestamp * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setTimestamp(String parameterName, Timestamp x) throws SQLException { setTimestamp(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given input stream, which will have * the specified number of bytes. * When a very large ASCII value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.InputStream. Data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from ASCII to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the Java input stream that contains the ASCII parameter value * @param length the number of bytes in the stream * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setAsciiStream(String parameterName, java.io.InputStream x, int length) throws SQLException { setAsciiStream(findParameterIndex(parameterName), x, length); } //#endif JAVA4 /** * * * Sets the designated parameter to the given input stream, which will have * the specified number of bytes. * When a very large binary value is input to a LONGVARBINARY * parameter, it may be more practical to send it via a * java.io.InputStream object. The data will be read from the stream * as needed until end-of-file is reached. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the java input stream which contains the binary parameter value * @param length the number of bytes in the stream * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setBinaryStream(String parameterName, java.io.InputStream x, int length) throws SQLException { setBinaryStream(findParameterIndex(parameterName), x, length); } //#endif JAVA4 /** * * * Sets the value of the designated parameter with the given object. The second * argument must be an object type; for integral values, the * java.lang equivalent objects should be used. * *

The given Java object will be converted to the given targetSqlType * before being sent to the database. * * If the object has a custom mapping (is of a class implementing the * interface SQLData), * the JDBC driver should call the method SQLData.writeSQL to write it * to the SQL data stream. * If, on the other hand, the object is of a class implementing * Ref, Blob, Clob, NClob, * Struct, java.net.URL, * or Array, the driver should pass it to the database as a * value of the corresponding SQL type. *

* Note that this method may be used to pass datatabase- * specific abstract data types. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the object containing the input parameter value * @param targetSqlType the SQL type (as defined in java.sql.Types) to be * sent to the database. The scale argument may further qualify this type. * @param scale for java.sql.Types.DECIMAL or java.sql.Types.NUMERIC types, * this is the number of digits after the decimal point. For all other * types, this value will be ignored. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if targetSqlType is * a ARRAY, BLOB, CLOB, * DATALINK, JAVA_OBJECT, NCHAR, * NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML * or STRUCT data type and the JDBC driver does not support * this data type * @see java.sql.Types * @see #getObject * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setObject(String parameterName, Object x, int targetSqlType, int scale) throws SQLException { setObject(findParameterIndex(parameterName), x, targetSqlType, scale); } //#endif JAVA4 /** * * * Sets the value of the designated parameter with the given object. * This method is like the method setObject * above, except that it assumes a scale of zero. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the object containing the input parameter value * @param targetSqlType the SQL type (as defined in java.sql.Types) to be * sent to the database * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if targetSqlType is * a ARRAY, BLOB, CLOB, * DATALINK, JAVA_OBJECT, NCHAR, * NCLOB, NVARCHAR, LONGNVARCHAR, * REF, ROWID, SQLXML * or STRUCT data type and the JDBC driver does not support * this data type * @see #getObject * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setObject(String parameterName, Object x, int targetSqlType) throws SQLException { setObject(findParameterIndex(parameterName), x, targetSqlType); } //#endif JAVA4 /** * * * Sets the value of the designated parameter with the given object. * The second parameter must be of type Object; therefore, the * java.lang equivalent objects should be used for built-in types. * *

The JDBC specification specifies a standard mapping from * Java Object types to SQL types. The given argument * will be converted to the corresponding SQL type before being * sent to the database. * *

Note that this method may be used to pass datatabase- * specific abstract data types, by using a driver-specific Java * type. * * If the object is of a class implementing the interface SQLData, * the JDBC driver should call the method SQLData.writeSQL * to write it to the SQL data stream. * If, on the other hand, the object is of a class implementing * Ref, Blob, Clob, NClob, * Struct, java.net.URL, * or Array, the driver should pass it to the database as a * value of the corresponding SQL type. *

* This method throws an exception if there is an ambiguity, for example, if the * object is of a class implementing more than one of the interfaces named above. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the object containing the input parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs, * this method is called on a closed CallableStatement or if the given * Object parameter is ambiguous * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getObject * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setObject(String parameterName, Object x) throws SQLException { setObject(findParameterIndex(parameterName), x); } //#endif JAVA4 /** * * * Sets the designated parameter to the given Reader * object, which is the given number of characters long. * When a very large UNICODE value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.Reader object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param reader the java.io.Reader object that * contains the UNICODE data used as the designated parameter * @param length the number of characters in the stream * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setCharacterStream(String parameterName, java.io.Reader reader, int length) throws SQLException { setCharacterStream(findParameterIndex(parameterName), reader, length); } //#endif JAVA4 /** * * * Sets the designated parameter to the given java.sql.Date value, * using the given Calendar object. The driver uses * the Calendar object to construct an SQL DATE value, * which the driver then sends to the database. With a * a Calendar object, the driver can calculate the date * taking into account a custom timezone. If no * Calendar object is specified, the driver uses the default * timezone, which is that of the virtual machine running the application. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @param cal the Calendar object the driver will use * to construct the date * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getDate * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setDate(String parameterName, Date x, Calendar cal) throws SQLException { setDate(findParameterIndex(parameterName), x, cal); } //#endif JAVA4 /** * * * Sets the designated parameter to the given java.sql.Time value, * using the given Calendar object. The driver uses * the Calendar object to construct an SQL TIME value, * which the driver then sends to the database. With a * a Calendar object, the driver can calculate the time * taking into account a custom timezone. If no * Calendar object is specified, the driver uses the default * timezone, which is that of the virtual machine running the application. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @param cal the Calendar object the driver will use * to construct the time * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getTime * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setTime(String parameterName, Time x, Calendar cal) throws SQLException { setTime(findParameterIndex(parameterName), x, cal); } //#endif JAVA4 /** * * * Sets the designated parameter to the given java.sql.Timestamp value, * using the given Calendar object. The driver uses * the Calendar object to construct an SQL TIMESTAMP value, * which the driver then sends to the database. With a * a Calendar object, the driver can calculate the timestamp * taking into account a custom timezone. If no * Calendar object is specified, the driver uses the default * timezone, which is that of the virtual machine running the application. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

*

* * * @param parameterName the name of the parameter * @param x the parameter value * @param cal the Calendar object the driver will use * to construct the timestamp * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #getTimestamp * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setTimestamp(String parameterName, Timestamp x, Calendar cal) throws SQLException { setTimestamp(findParameterIndex(parameterName), x, cal); } //#endif JAVA4 /** * * * Sets the designated parameter to SQL NULL. * This version of the method setNull should * be used for user-defined types and REF type parameters. Examples * of user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and * named array types. * *

Note: To be portable, applications must give the * SQL type code and the fully-qualified SQL type name when specifying * a NULL user-defined or REF parameter. In the case of a user-defined type * the name is the type name of the parameter itself. For a REF * parameter, the name is the type name of the referenced type. If * a JDBC driver does not need the type code or type name information, * it may ignore it. * * Although it is intended for user-defined and Ref parameters, * this method may be used to set a null parameter of any JDBC type. * If the parameter does not have a user-defined or REF type, the given * typeName is ignored. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @param sqlType a value from java.sql.Types * @param typeName the fully-qualified name of an SQL user-defined type; * ignored if the parameter is not a user-defined type or * SQL REF value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized void setNull(String parameterName, int sqlType, String typeName) throws SQLException { setNull(findParameterIndex(parameterName), sqlType, typeName); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC CHAR, VARCHAR, * or LONGVARCHAR parameter as a String in * the Java programming language. *

* For the fixed-length type JDBC CHAR, * the String object * returned has exactly the same value the (JDBC4 clarification:) SQL * CHAR value had in the * database, including any padding added by the database. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterName the name of the parameter * @return the parameter value. If the value is SQL NULL, the result * is null. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setString * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized String getString( String parameterName) throws SQLException { return getString(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * (JDBC4 modified:)

* Retrieves the value of a JDBC BIT or BOOLEAN * parameter as a * boolean in the Java programming language. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value. If the value is SQL NULL, the result * is false. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setBoolean * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized boolean getBoolean( String parameterName) throws SQLException { return getBoolean(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC TINYINT parameter as a byte * in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value. If the value is SQL NULL, the result * is 0. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setByte * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized byte getByte( String parameterName) throws SQLException { return getByte(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC SMALLINT parameter as a short * in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value. If the value is SQL NULL, the result * is 0. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setShort * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized short getShort( String parameterName) throws SQLException { return getShort(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC INTEGER parameter as an int * in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterName the name of the parameter * @return the parameter value. If the value is SQL NULL, * the result is 0. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setInt * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized int getInt(String parameterName) throws SQLException { return getInt(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC BIGINT parameter as a long * in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value. If the value is SQL NULL, * the result is 0. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setLong * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized long getLong( String parameterName) throws SQLException { return getLong(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC FLOAT parameter as a float * in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value. If the value is SQL NULL, * the result is 0. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setFloat * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized float getFloat( String parameterName) throws SQLException { return getFloat(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC DOUBLE parameter as a double * in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value. If the value is SQL NULL, * the result is 0. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setDouble * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized double getDouble( String parameterName) throws SQLException { return getDouble(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC BINARY or VARBINARY * parameter as an array of byte values in the Java * programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value. If the value is SQL NULL, the result is * null. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setBytes * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized byte[] getBytes( String parameterName) throws SQLException { return getBytes(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC DATE parameter as a * java.sql.Date object. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value. If the value is SQL NULL, the result * is null. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setDate * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized Date getDate( String parameterName) throws SQLException { return getDate(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC TIME parameter as a * java.sql.Time object. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value. If the value is SQL NULL, the result * is null. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setTime * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized Time getTime( String parameterName) throws SQLException { return getTime(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC TIMESTAMP parameter as a * java.sql.Timestamp object. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value. If the value is SQL NULL, the result * is null. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setTimestamp * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized Timestamp getTimestamp( String parameterName) throws SQLException { return getTimestamp(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a parameter as an Object in the Java * programming language. If the value is an SQL NULL, the * driver returns a Java null. *

* This method returns a Java object whose type corresponds to the JDBC * type that was registered for this parameter using the method * registerOutParameter. By registering the target JDBC * type as java.sql.Types.OTHER, this method can be used * to read database-specific abstract data types. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return A java.lang.Object holding the OUT parameter value. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see java.sql.Types * @see #setObject * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized Object getObject( String parameterName) throws SQLException { return getObject(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC NUMERIC parameter as a * java.math.BigDecimal object with as many digits to the * right of the decimal point as the value contains. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value in full precision. If the value is * SQL NULL, the result is null. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setBigDecimal * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized BigDecimal getBigDecimal( String parameterName) throws SQLException { return getBigDecimal(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Returns an object representing the value of OUT parameter * parameterName and uses map for the custom * mapping of the parameter value. *

* This method returns a Java object whose type corresponds to the * JDBC type that was registered for this parameter using the method * registerOutParameter. By registering the target * JDBC type as java.sql.Types.OTHER, this method can * be used to read database-specific abstract data types. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @param map the mapping from SQL type names to Java classes * @return a java.lang.Object holding the OUT parameter value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setObject * @since JDK 1.4, HSQLDB 1.7.0 */ /** @todo: how to use CodeSwitcher and +JAVA6 to specifiy Map> */ //#ifdef JAVA6 @SuppressWarnings("unchecked") //#endif JAVA6 //#ifdef JAVA4 public synchronized Object getObject(String parameterName, Map map) throws SQLException { return getObject(findParameterIndex(parameterName), map); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC REF(<structured-type>) * parameter as a {@link java.sql.Ref} object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value as a Ref object in the * Java programming language. If the value was SQL NULL, * the value null is returned. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized Ref getRef(String parameterName) throws SQLException { return getRef(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC BLOB parameter as a * {@link java.sql.Blob} object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value as a Blob object in the * Java programming language. If the value was SQL NULL, * the value null is returned. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized Blob getBlob( String parameterName) throws SQLException { return getBlob(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC CLOB parameter as a * {@link java.sql.Clob} object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value as a Clob object in the * Java programming language. If the value was SQL NULL, * the value null is returned. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized Clob getClob( String parameterName) throws SQLException { return getClob(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC ARRAY parameter as an * {@link java.sql.Array} object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value as an Array object in * Java programming language. If the value was SQL NULL, * the value null is returned. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized Array getArray( String parameterName) throws SQLException { return getArray(findParameterIndex(parameterName)); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC DATE parameter as a * java.sql.Date object, using * the given Calendar object * to construct the date. * With a Calendar object, the driver * can calculate the date taking into account a custom timezone and locale. * If no Calendar object is specified, the driver uses the * default timezone and locale. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @param cal the Calendar object the driver will use * to construct the date * @return the parameter value. If the value is SQL NULL, * the result is null. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setDate * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized Date getDate(String parameterName, Calendar cal) throws SQLException { return getDate(findParameterIndex(parameterName), cal); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC TIME parameter as a * java.sql.Time object, using * the given Calendar object * to construct the time. * With a Calendar object, the driver * can calculate the time taking into account a custom timezone and locale. * If no Calendar object is specified, the driver uses the * default timezone and locale. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @param cal the Calendar object the driver will use * to construct the time * @return the parameter value; if the value is SQL NULL, the result is * null. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setTime * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized Time getTime(String parameterName, Calendar cal) throws SQLException { return getTime(findParameterIndex(parameterName), cal); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC TIMESTAMP parameter as a * java.sql.Timestamp object, using * the given Calendar object to construct * the Timestamp object. * With a Calendar object, the driver * can calculate the timestamp taking into account a custom timezone and locale. * If no Calendar object is specified, the driver uses the * default timezone and locale. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * * @param parameterName the name of the parameter * @param cal the Calendar object the driver will use * to construct the timestamp * @return the parameter value. If the value is SQL NULL, the result is * null. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setTimestamp * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public synchronized Timestamp getTimestamp(String parameterName, Calendar cal) throws SQLException { return getTimestamp(findParameterIndex(parameterName), cal); } //#endif JAVA4 /** * * * Retrieves the value of a JDBC DATALINK parameter as a * java.net.URL object. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return the parameter value as a java.net.URL object in the * Java programming language. If the value was SQL NULL, the * value null is returned. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs, * this method is called on a closed CallableStatement, * or if there is a problem with the URL * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @see #setURL * @since JDK 1.4, HSQLDB 1.7.0 */ //#ifdef JAVA4 public java.net.URL getURL(String parameterName) throws SQLException { return getURL(findParameterIndex(parameterName)); } //#endif JAVA4 //------------------------- JDBC 4.0 ----------------------------------- /** * * * Retrieves the value of the designated JDBC ROWID parameter as a * java.sql.RowId object. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterIndex the first parameter is 1, the second is 2,... * @return a RowId object that represents the JDBC ROWID * value is used as the designated parameter. If the parameter contains * a SQL NULL, then a null value is returned. * @throws SQLException JDBC 4.1[ if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public RowId getRowId(int parameterIndex) throws SQLException { checkGetParameterIndex(parameterIndex); throw Util.notSupported(); } //#endif JAVA6 /** * * * Retrieves the value of the designated JDBC ROWID parameter as a * java.sql.RowId object. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return a RowId object that represents the JDBC ROWID * value is used as the designated parameter. If the parameter contains * a SQL NULL, then a null value is returned. * @throws SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized RowId getRowId( String parameterName) throws SQLException { return getRowId(findParameterIndex(parameterName)); } //#endif JAVA6 /** * * * Sets the designated parameter to the given java.sql.RowId object. The * driver converts this to a SQL ROWID when it sends it to the * database. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @param x the parameter value * @throws SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setRowId(String parameterName, RowId x) throws SQLException { super.setRowId(findParameterIndex(parameterName), x); } //#endif JAVA6 /** * Sets the designated parameter to the given String object. * The driver converts this to a SQL NCHAR or * NVARCHAR or LONGNVARCHAR * @param parameterName the name of the parameter to be set * @param value the parameter value * @throws SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setNString(String parameterName, String value) throws SQLException { super.setNString(findParameterIndex(parameterName), value); } //#endif JAVA6 /** * Sets the designated parameter to a Reader object. The * Reader reads the data till end-of-file is reached. The * driver does the necessary conversion from Java character format to * the national character set in the database. * @param parameterName the name of the parameter to be set * @param value the parameter value * @param length the number of characters in the parameter data. * @throws SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setNCharacterStream(String parameterName, Reader value, long length) throws SQLException { super.setNCharacterStream(findParameterIndex(parameterName), value, length); } //#endif JAVA6 /** * Sets the designated parameter to a java.sql.NClob object. The object * implements the java.sql.NClob interface. This NClob * object maps to a SQL NCLOB. * @param parameterName the name of the parameter to be set * @param value the parameter value * @throws SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setNClob(String parameterName, NClob value) throws SQLException { super.setNClob(findParameterIndex(parameterName), value); } //#endif JAVA6 /** * Sets the designated parameter to a Reader object. The reader must contain the number * of characters specified by length otherwise a SQLException will be * generated when the CallableStatement is executed. * This method differs from the setCharacterStream (int, Reader, int) method * because it informs the driver that the parameter value should be sent to * the server as a CLOB. When the setCharacterStream method is used, the * driver may have to do extra work to determine whether the parameter * data should be send to the server as a LONGVARCHAR or a CLOB * @param parameterName the name of the parameter to be set * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @throws SQLException if parameterName does not correspond to a named * parameter; if the length specified is less than zero; * a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setClob(String parameterName, Reader reader, long length) throws SQLException { super.setClob(findParameterIndex(parameterName), reader, length); } //#endif JAVA6 /** * Sets the designated parameter to a InputStream object. The inputstream must contain the number * of characters specified by length, otherwise a SQLException will be * generated when the CallableStatement is executed. * This method differs from the setBinaryStream (int, InputStream, int) * method because it informs the driver that the parameter value should be * sent to the server as a BLOB. When the setBinaryStream method is used, * the driver may have to do extra work to determine whether the parameter * data should be sent to the server as a LONGVARBINARY or a BLOB * * @param parameterName the name of the parameter to be set * the second is 2, ... * * @param inputStream An object that contains the data to set the parameter * value to. * @param length the number of bytes in the parameter data. * @throws SQLException if parameterName does not correspond to a named * parameter; if the length specified * is less than zero; if the number of bytes in the input stream does not match * the specified length; if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setBlob(String parameterName, InputStream inputStream, long length) throws SQLException { super.setBlob(findParameterIndex(parameterName), inputStream, length); } //#endif JAVA6 /** * Sets the designated parameter to a Reader object. The reader must contain the number * of characters specified by length otherwise a SQLException will be * generated when the CallableStatement is executed. * This method differs from the setCharacterStream (int, Reader, int) method * because it informs the driver that the parameter value should be sent to * the server as a NCLOB. When the setCharacterStream method is used, the * driver may have to do extra work to determine whether the parameter * data should be send to the server as a LONGNVARCHAR or a NCLOB * * @param parameterName the name of the parameter to be set * @param reader An object that contains the data to set the parameter value to. * @param length the number of characters in the parameter data. * @throws SQLException if parameterName does not correspond to a named * parameter; if the length specified is less than zero; * if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setNClob(String parameterName, Reader reader, long length) throws SQLException { super.setNClob(findParameterIndex(parameterName), reader, length); } //#endif JAVA6 /** * * * Retrieves the value of the designated JDBC NCLOB parameter as a * java.sql.NClob object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterIndex the first parameter is 1, the second is 2, and * so on * @return the parameter value as a NClob object in the * Java programming language. If the value was SQL NULL, the * value null is returned. * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public NClob getNClob(int parameterIndex) throws SQLException { checkGetParameterIndex(parameterIndex); throw Util.notSupported(); } //#endif JAVA6 /** * * * Retrieves the value of a JDBC NCLOB parameter as a * java.sql.NClob object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterName the name of the parameter * @return the parameter value as a NClob object in the * Java programming language. If the value was SQL NULL, * the value null is returned. * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized NClob getNClob( String parameterName) throws SQLException { return getNClob(findParameterIndex(parameterName)); } //#endif JAVA6 /** * Sets the designated parameter to the given java.sql.SQLXML object. The driver converts this to an * SQL XML value when it sends it to the database. * * @param parameterName the name of the parameter * @param xmlObject a SQLXML object that maps an SQL XML value * @throws SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs; * this method is called on a closed CallableStatement or * the java.xml.transform.Result, * Writer or OutputStream has not been closed for the SQLXML object * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setSQLXML(String parameterName, SQLXML xmlObject) throws SQLException { super.setSQLXML(findParameterIndex(parameterName), xmlObject); } //#endif JAVA6 /** * * * Retrieves the value of the designated SQL XML parameter as a * java.sql.SQLXML object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @return a SQLXML object that maps an SQL XML value * @throws SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public SQLXML getSQLXML(int parameterIndex) throws SQLException { checkGetParameterIndex(parameterIndex); throw Util.notSupported(); } //#endif JAVA6 /** * * * Retrieves the value of the designated SQL XML parameter as a * java.sql.SQLXML object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterName the name of the parameter * @return a SQLXML object that maps an SQL XML value * @throws SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized SQLXML getSQLXML( String parameterName) throws SQLException { return getSQLXML(findParameterIndex(parameterName)); } //#endif JAVA6 /** * * * Retrieves the value of the designated NCHAR, * NVARCHAR * or LONGNVARCHAR parameter as * a String in the Java programming language. *

* For the fixed-length type JDBC NCHAR, * the String object * returned has exactly the same value the SQL * NCHAR value had in the * database, including any padding added by the database. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterIndex index of the first parameter is 1, the second is 2, ... * @return a String object that maps an * NCHAR, NVARCHAR or LONGNVARCHAR value * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 * @see #setNString */ //#ifdef JAVA6 public String getNString(int parameterIndex) throws SQLException { checkGetParameterIndex(parameterIndex); throw Util.notSupported(); } //#endif JAVA6 /** * * * Retrieves the value of the designated NCHAR, * NVARCHAR * or LONGNVARCHAR parameter as * a String in the Java programming language. *

* For the fixed-length type JDBC NCHAR, * the String object * returned has exactly the same value the SQL * NCHAR value had in the * database, including any padding added by the database. * * * * *

*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterName the name of the parameter * @return a String object that maps an * NCHAR, NVARCHAR or LONGNVARCHAR value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 * @see #setNString */ //#ifdef JAVA6 public synchronized String getNString( String parameterName) throws SQLException { return getNString(findParameterIndex(parameterName)); } //#endif JAVA6 /** * * * Retrieves the value of the designated parameter as a * java.io.Reader object in the Java programming language. * It is intended for use when * accessing NCHAR,NVARCHAR * and LONGNVARCHAR parameters. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @return a java.io.Reader object that contains the parameter * value; if the value is SQL NULL, the value returned is * null in the Java programming language. * @param parameterIndex the first parameter is 1, the second is 2, ... * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] * if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public Reader getNCharacterStream(int parameterIndex) throws SQLException { checkGetParameterIndex(parameterIndex); throw Util.notSupported(); } //#endif JAVA6 /** * * * Retrieves the value of the designated parameter as a * java.io.Reader object in the Java programming language. * It is intended for use when * accessing NCHAR,NVARCHAR * and LONGNVARCHAR parameters. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @param parameterName the name of the parameter * @return a java.io.Reader object that contains the parameter * value; if the value is SQL NULL, the value returned is * null in the Java programming language * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized Reader getNCharacterStream( String parameterName) throws SQLException { return getNCharacterStream(findParameterIndex(parameterName)); } //#endif JAVA6 /** * * * Retrieves the value of the designated parameter as a * java.io.Reader object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB does not yet support this feature.

* * Calling this method always throws an SQLException. *

* * * @return a java.io.Reader object that contains the parameter * value; if the value is SQL NULL, the value returned is * null in the Java programming language. * @param parameterIndex the first parameter is 1, the second is 2, ... * @exception SQLException JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or * this method is called on a closed CallableStatement * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public Reader getCharacterStream(int parameterIndex) throws SQLException { checkGetParameterIndex(parameterIndex); Type sourceType = parameterMetaData.columnTypes[parameterIndex - 1]; Object o = getColumnInType(parameterIndex, sourceType); if (o == null) { return null; } if (o instanceof ClobDataID) { return ((ClobDataID) o).getCharacterStream(session); } else if (o instanceof Clob) { return ((Clob) o).getCharacterStream(); } else if (o instanceof String) { return new StringReader((String) o); } throw Util.sqlException(ErrorCode.X_42561); } //#endif JAVA6 /** * * * Retrieves the value of the designated parameter as a * java.io.Reader object in the Java programming language. * * * * *
*

HSQLDB-Specific Information:

* * HSQLDB supports this feature.

* *

* * * @param parameterName the name of the parameter * @return a java.io.Reader object that contains the parameter * value; if the value is SQL NULL, the value returned is * null in the Java programming language * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized Reader getCharacterStream( String parameterName) throws SQLException { return getCharacterStream(findParameterIndex(parameterName)); } //#endif JAVA6 /** * Sets the designated parameter to the given java.sql.Blob object. * The driver converts this to an SQL BLOB value when it * sends it to the database. * * @param parameterName the name of the parameter * @param x a Blob object that maps an SQL BLOB value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setBlob(String parameterName, Blob x) throws SQLException { super.setBlob(findParameterIndex(parameterName), x); } //#endif JAVA6 /** * Sets the designated parameter to the given java.sql.Clob object. * The driver converts this to an SQL CLOB value when it * sends it to the database. * * @param parameterName the name of the parameter * @param x a Clob object that maps an SQL CLOB value * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setClob(String parameterName, Clob x) throws SQLException { super.setClob(findParameterIndex(parameterName), x); } //#endif JAVA6 /** * Sets the designated parameter to the given input stream, which will have * the specified number of bytes. * When a very large ASCII value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.InputStream. Data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from ASCII to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * @param parameterName the name of the parameter * @param x the Java input stream that contains the ASCII parameter value * @param length the number of bytes in the stream * @exception SQLException if parameterName does not correspond to a named * parameter; if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setAsciiStream(String parameterName, java.io.InputStream x, long length) throws SQLException { if (length > Integer.MAX_VALUE) { String msg = "Maximum ASCII input octet length exceeded: " + length; // NOI18N throw Util.sqlException(ErrorCode.JDBC_INPUTSTREAM_ERROR, msg); } this.setAsciiStream(parameterName, x, (int) length); } //#endif JAVA6 /** * Sets the designated parameter to the given input stream, which will have * the specified number of bytes. * When a very large binary value is input to a LONGVARBINARY * parameter, it may be more practical to send it via a * java.io.InputStream object. The data will be read from the stream * as needed until end-of-file is reached. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * @param parameterName the name of the parameter * @param x the java input stream which contains the binary parameter value * @param length the number of bytes in the stream * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setBinaryStream(String parameterName, java.io.InputStream x, long length) throws SQLException { if (length > Integer.MAX_VALUE) { String msg = "Maximum Binary input octet length exceeded: " + length; // NOI18N throw Util.sqlException(ErrorCode.JDBC_INPUTSTREAM_ERROR, msg); } setBinaryStream(parameterName, x, (int) length); } //#endif JAVA6 /** * Sets the designated parameter to the given Reader * object, which is the given number of characters long. * When a very large UNICODE value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.Reader object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. * * @param parameterName the name of the parameter * @param reader the java.io.Reader object that * contains the UNICODE data used as the designated parameter * @param length the number of characters in the stream * @exception SQLException JDBC 4.1[if parameterName does not correspond to a named * parameter;] if a database access error occurs or * this method is called on a closed CallableStatement * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setCharacterStream(String parameterName, java.io.Reader reader, long length) throws SQLException { if (length > Integer.MAX_VALUE) { String msg = "Maximum character input length exceeded: " + length; // NOI18N throw Util.sqlException(ErrorCode.JDBC_INPUTSTREAM_ERROR, msg); } setCharacterStream(parameterName, reader, (int) length); } //#endif JAVA6 /** * Sets the designated parameter to the given input stream. * When a very large ASCII value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.InputStream. Data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from ASCII to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setAsciiStream which takes a length parameter. * * @param parameterName the name of the parameter * @param x the Java input stream that contains the ASCII parameter value * @exception SQLException if parameterName does not correspond to a named * parameter; if a database access error occurs or * this method is called on a closed CallableStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setAsciiStream(String parameterName, java.io.InputStream x) throws SQLException { super.setAsciiStream(findParameterIndex(parameterName), x); } //#endif JAVA6 /** * Sets the designated parameter to the given input stream. * When a very large binary value is input to a LONGVARBINARY * parameter, it may be more practical to send it via a * java.io.InputStream object. The data will be read from the * stream as needed until end-of-file is reached. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setBinaryStream which takes a length parameter. * * @param parameterName the name of the parameter * @param x the java input stream which contains the binary parameter value * @exception SQLException if parameterName does not correspond to a named * parameter; if a database access error occurs or * this method is called on a closed CallableStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * @since JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setBinaryStream(String parameterName, java.io.InputStream x) throws SQLException { super.setBinaryStream(findParameterIndex(parameterName), x); } //#endif JAVA6 /** * Sets the designated parameter to the given Reader * object. * When a very large UNICODE value is input to a LONGVARCHAR * parameter, it may be more practical to send it via a * java.io.Reader object. The data will be read from the stream * as needed until end-of-file is reached. The JDBC driver will * do any necessary conversion from UNICODE to the database char format. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setCharacterStream which takes a length parameter. * * @param parameterName the name of the parameter * @param reader the java.io.Reader object that contains the * Unicode data * @exception SQLException if parameterName does not correspond to a named * parameter; if a database access error occurs or * this method is called on a closed CallableStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setCharacterStream(String parameterName, java.io.Reader reader) throws SQLException { super.setCharacterStream(findParameterIndex(parameterName), reader); } //#endif JAVA6 /** * Sets the designated parameter to a Reader object. The * Reader reads the data till end-of-file is reached. The * driver does the necessary conversion from Java character format to * the national character set in the database. * *

Note: This stream object can either be a standard * Java stream object or your own subclass that implements the * standard interface. *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setNCharacterStream which takes a length parameter. * * @param parameterName the name of the parameter * @param value the parameter value * @throws SQLException if parameterName does not correspond to a named * parameter; if the driver does not support national * character sets; if the driver can detect that a data conversion * error could occur; if a database access error occurs; or * this method is called on a closed CallableStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setNCharacterStream(String parameterName, Reader value) throws SQLException { super.setNCharacterStream(findParameterIndex(parameterName), value); } //#endif JAVA6 /** * Sets the designated parameter to a Reader object. * This method differs from the setCharacterStream (int, Reader) method * because it informs the driver that the parameter value should be sent to * the server as a CLOB. When the setCharacterStream method is used, the * driver may have to do extra work to determine whether the parameter * data should be send to the server as a LONGVARCHAR or a CLOB * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setClob which takes a length parameter. * * @param parameterName the name of the parameter * @param reader An object that contains the data to set the parameter value to. * @throws SQLException if parameterName does not correspond to a named * parameter; if a database access error occurs or this method is called on * a closed CallableStatement * * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setClob(String parameterName, Reader reader) throws SQLException { super.setClob(findParameterIndex(parameterName), reader); } //#endif JAVA6 /** * Sets the designated parameter to a InputStream object. * This method differs from the setBinaryStream (int, InputStream) * method because it informs the driver that the parameter value should be * sent to the server as a BLOB. When the setBinaryStream method is used, * the driver may have to do extra work to determine whether the parameter * data should be send to the server as a LONGVARBINARY or a BLOB * *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setBlob which takes a length parameter. * * @param parameterName the name of the parameter * @param inputStream An object that contains the data to set the parameter * value to. * @throws SQLException if parameterName does not correspond to a named * parameter; if a database access error occurs or * this method is called on a closed CallableStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * * JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setBlob( String parameterName, InputStream inputStream) throws SQLException { super.setBlob(findParameterIndex(parameterName), inputStream); } //#endif JAVA6 /** * Sets the designated parameter to a Reader object. * This method differs from the setCharacterStream (int, Reader) method * because it informs the driver that the parameter value should be sent to * the server as a NCLOB. When the setCharacterStream method is used, the * driver may have to do extra work to determine whether the parameter * data should be send to the server as a LONGNVARCHAR or a NCLOB *

Note: Consult your JDBC driver documentation to determine if * it might be more efficient to use a version of * setNClob which takes a length parameter. * * @param parameterName the name of the parameter * @param reader An object that contains the data to set the parameter value to. * @throws SQLException if parameterName does not correspond to a named * parameter; if the driver does not support national character sets; * if the driver can detect that a data conversion * error could occur; if a database access error occurs or * this method is called on a closed CallableStatement * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method * * JDK 1.6, HSQLDB 2.0 */ //#ifdef JAVA6 public synchronized void setNClob(String parameterName, Reader reader) throws SQLException { super.setNClob(findParameterIndex(parameterName), reader); } //#endif JAVA6 //------------------------- JDBC 4.1 ----------------------------------- /** *

Returns an object representing the value of OUT parameter * {@code parameterIndex} and will convert from the * SQL type of the parameter to the requested Java data type, if the * conversion is supported. If the conversion is not * supported or null is specified for the type, a * SQLException is thrown. *

* At a minimum, an implementation must support the conversions defined in * Appendix B, Table B-3 and conversion of appropriate user defined SQL * types to a Java type which implements {@code SQLData}, or {@code Struct}. * Additional conversions may be supported and are vendor defined. * * @param parameterIndex the first parameter is 1, the second is 2, and so on * @param type Class representing the Java data type to convert the * designated parameter to. * @return an instance of {@code type} holding the OUT parameter value * @throws SQLException if conversion is not supported, type is null or * another error occurs. The getCause() method of the * exception may provide a more detailed exception, for example, if * a conversion error occurs * @throws SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ //#ifdef JAVA5 public T getObject(int parameterIndex, Class type) throws SQLException { return (T) this.getObject(parameterIndex); } //#endif /** *

Returns an object representing the value of OUT parameter * {@code parameterName} and will convert from the * SQL type of the parameter to the requested Java data type, if the * conversion is supported. If the conversion is not * supported or null is specified for the type, a * SQLException is thrown. *

* At a minimum, an implementation must support the conversions defined in * Appendix B, Table B-3 and conversion of appropriate user defined SQL * types to a Java type which implements {@code SQLData}, or {@code Struct}. * Additional conversions may be supported and are vendor defined. * * @param parameterName the name of the parameter * @param type Class representing the Java data type to convert * the designated parameter to. * @return an instance of {@code type} holding the OUT parameter * value * @throws SQLException if conversion is not supported, type is null or * another error occurs. The getCause() method of the * exception may provide a more detailed exception, for example, if * a conversion error occurs * @throws SQLFeatureNotSupportedException if the JDBC driver does not support * this method * @since JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1 */ //#ifdef JAVA5 public T getObject(String parameterName, Class type) throws SQLException { return getObject(this.findParameterIndex(parameterName), type); } //#endif // --------------------------- Internal Implementation ------------------------- /** parameter name => parameter index */ private IntValueHashMap parameterNameMap; private boolean wasNullValue; /** parameter index => registered OUT type */ // private IntKeyIntValueHashMap outRegistrationMap; /** * Constructs a new JDBCCallableStatement with the specified connection and * result type. * * @param c the connection on which this statement will execute * @param sql the SQL statement this object represents * @param resultSetType the type of result this statement will produce * @throws HsqlException if the statement is not accepted by the database * @throws SQLException if preprocessing by driver fails */ public JDBCCallableStatement( JDBCConnection c, String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws HsqlException, SQLException { super(c, sql, resultSetType, resultSetConcurrency, resultSetHoldability, ResultConstants.RETURN_NO_GENERATED_KEYS, null, null); String[] names; String name; // outRegistrationMap = new IntKeyIntValueHashMap(); parameterNameMap = new IntValueHashMap(); if (parameterMetaData != null) { names = parameterMetaData.columnLabels; for (int i = 0; i < names.length; i++) { name = names[i]; // PRE: should never happen in practice if (name == null || name.length() == 0) { continue; // throw? } parameterNameMap.put(name, i); } } } void fetchResult() throws SQLException { super.fetchResult(); if (resultIn.getType() == ResultConstants.CALL_RESPONSE) { Object[] data = resultIn.getParameterData(); for (int i = 0; i < parameterValues.length; i++) { parameterValues[i] = data[i]; } } } /** * Retrieves the parameter index corresponding to the given * parameter name.

* * @param parameterName to look up * @throws SQLException if not found * @return index for name */ int findParameterIndex(String parameterName) throws SQLException { if (isClosed || connection.isClosed) { checkClosed(); } int index = parameterNameMap.get(parameterName, -1); if (index >= 0) { return index + 1; } throw Util.sqlException(ErrorCode.JDBC_COLUMN_NOT_FOUND, parameterName); } /** * Does the specialized work required to free this object's resources and * that of it's parent classes.

* * @throws SQLException if a database access error occurs */ public synchronized void close() throws SQLException { if (isClosed()) { return; } // outRegistrationMap = null; parameterNameMap = null; super.close(); } /** * Checks if the parameter of the given index has been successfully * registered as an OUT parameter.

* * @param parameterIndex to check * @throws SQLException if not registered */ /* private void checkIsRegisteredParameterIndex(int parameterIndex) throws SQLException { int type; String msg; checkClosed(); type = outRegistrationMap.get(parameterIndex, Integer.MIN_VALUE); if (type == Integer.MIN_VALUE) { msg = "Parameter not registered: " + parameterIndex; //NOI18N throw Util.sqlException(ErrorCode.INVALID_JDBC_ARGUMENT, msg); } } */ /** * Internal value converter. Similar to its counterpart in JDBCResultSet

* * All trivially successful getXXX methods eventually go through this * method, converting if necessary from the source type to the * requested type.

* * Conversion to the JDBC representation, if different, is handled by the * calling methods. * * @param columnIndex of the column value for which to perform the * conversion * @param targetType the org.hsqldb.types.Type object for targetType * @return an Object of the requested targetType, representing the value of the * specified column * @throws SQLException when there is no rowData, the column index is * invalid, or the conversion cannot be performed */ private Object getColumnInType(int columnIndex, Type targetType) throws SQLException { checkGetParameterIndex(columnIndex); Type sourceType; Object value; sourceType = parameterTypes[--columnIndex]; value = parameterValues[columnIndex]; if (trackNull(value)) { return null; } if (sourceType.typeCode != targetType.typeCode) { try { value = targetType.convertToTypeJDBC(session, value, sourceType); } catch (HsqlException e) { String stringValue = (value instanceof Number || value instanceof String || value instanceof java.util.Date) ? value.toString() : "instance of " + value.getClass().getName(); String msg = "from SQL type " + sourceType.getNameString() + " to " + targetType.getJDBCClassName() + ", value: " + stringValue; HsqlException err = Error.error(ErrorCode.X_42561, msg); throw Util.sqlException(err, e); } } return value; } private boolean trackNull(Object o) { return (wasNullValue = (o == null)); } public void closeOnCompletion() throws SQLException { throw new UnsupportedOperationException("Not supported yet."); } public boolean isCloseOnCompletion() throws SQLException { throw new UnsupportedOperationException("Not supported yet."); } /** * * Executes the SQL query in this PreparedStatement object * and returns the ResultSet object generated by the query. * * *

*

HSQLDB-Specific Information:

* * HSQLDB supports this method for a call to a FUNCTION that returns a result. * For a PROCEDURE that returns one or more results, the first result is * returned.

* * If the FUNCTION or PROCEDURE does not return a ResultSet, an * SQLException if thrown. *

* * * @return a ResultSet object that contains the data produced by the * query; never null * @exception SQLException if a database access error occurs, * this method is called on a closed PreparedStatement or the SQL * statement does not return a ResultSet object */ public synchronized ResultSet executeQuery() throws SQLException { fetchResult(); ResultSet rs = getResultSet(); if (rs != null) { return rs; } if (getMoreResults()) { return getResultSet(); } throw Util.sqlException(ErrorCode.X_07504); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementDMQL.java0000644000175000017500000006027212007547376022245 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.HsqlNameManager.SimpleName; import org.hsqldb.ParserDQL.CompileContext; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArraySort; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.result.Result; import org.hsqldb.result.ResultMetaData; import org.hsqldb.rights.Grantee; import org.hsqldb.store.ValuePool; /** * Statement implementation for DML and base DQL statements. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.7.2 */ // fredt@users 20040404 - patch 1.7.2 - fixed type resolution for parameters // boucherb@users 200404xx - patch 1.7.2 - changed parameter naming scheme for SQLCI client usability/support // fredt@users 20050609 - 1.8.0 - fixed EXPLAIN PLAN by implementing describe(Session) // fredt@users - 1.9.0 - support for generated column reporting // fredt@users - 1.9.0 - support for multi-row inserts public abstract class StatementDMQL extends Statement { public static final String PCOL_PREFIX = "@p"; static final String RETURN_COLUMN_NAME = "@p0"; /** target table for INSERT_XXX, UPDATE and DELETE and MERGE */ Table targetTable; Table baseTable; /** column map of query expression */ int[] baseColumnMap; RangeVariable[] targetRangeVariables = RangeVariable.emptyArray; /** source table for MERGE */ Table sourceTable; /** condition expression for UPDATE, MERGE and DELETE */ Expression condition; /** for TRUNCATE variation of DELETE */ boolean restartIdentity; /** column map for INSERT operation direct or via MERGE */ int[] insertColumnMap = ValuePool.emptyIntArray; /** column map for UPDATE operation direct or via MERGE */ int[] updateColumnMap = ValuePool.emptyIntArray; int[] baseUpdateColumnMap = ValuePool.emptyIntArray; /** Column value Expressions for UPDATE and MERGE. */ Expression[] updateExpressions = Expression.emptyArray; /** Column value Expressions for MERGE */ Expression[][] multiColumnValues; /** INSERT_VALUES */ Expression insertExpression; /** * Flags indicating which columns' values will/will not be * explicitly set. */ boolean[] insertCheckColumns; boolean[] updateCheckColumns; /** * VIEW check */ Expression updatableTableCheck; RangeVariable checkRangeVariable; /** * Select to be evaluated when this is an INSERT_SELECT or * SELECT statement */ QueryExpression queryExpression; /** * Name of cursor */ SimpleName cursorName; /** * Parse-order array of Expression objects, all of type PARAMETER , * involved in some way in any INSERT_XXX, UPDATE, DELETE, SELECT or * CALL CompiledStatement */ ExpressionColumn[] parameters; /** * ResultMetaData for parameters */ ResultMetaData parameterMetaData; /** * Subqueries inverse usage depth order */ TableDerived[] subqueries = TableDerived.emptyArray; /** * Total number of RangeIterator objects used */ int rangeIteratorCount; /** * Database objects used */ NumberSequence[] sequences; Routine[] routines; RangeVariable[] rangeVariables; StatementDMQL(int type, int group, HsqlName schemaName) { super(type, group); this.schemaName = schemaName; this.isTransactionStatement = true; } void setBaseIndexColumnMap() { if (targetTable != baseTable) { baseColumnMap = targetTable.getBaseTableColumnMap(); } } public void setCursorName(SimpleName name) { cursorName = name; } public SimpleName getCursorName() { return cursorName; } public Result execute(Session session) { Result result; if (targetTable != null && session.isReadOnly() && !targetTable.isTemp()) { HsqlException e = Error.error(ErrorCode.X_25006); return Result.newErrorResult(e); } if (isExplain) { return getExplainResult(session); } try { if (subqueries.length > 0) { materializeSubQueries(session); } result = getResult(session); clearStructures(session); } catch (Throwable t) { clearStructures(session); result = Result.newErrorResult(t, null); result.getException().setStatementType(group, type); } return result; } private Result getExplainResult(Session session) { Result result = Result.newSingleColumnStringResult("OPERATION", describe(session)); OrderedHashSet set = getReferences(); result.navigator.add(new Object[]{ "Object References" }); for (int i = 0; i < set.size(); i++) { HsqlName name = (HsqlName) set.get(i); result.navigator.add(new Object[]{ name.getSchemaQualifiedStatementName() }); } result.navigator.add(new Object[]{ "Read Locks" }); for (int i = 0; i < readTableNames.length; i++) { HsqlName name = readTableNames[i]; result.navigator.add(new Object[]{ name.getSchemaQualifiedStatementName() }); } result.navigator.add(new Object[]{ "WriteLocks" }); for (int i = 0; i < writeTableNames.length; i++) { HsqlName name = writeTableNames[i]; result.navigator.add(new Object[]{ name.getSchemaQualifiedStatementName() }); } return result; } abstract Result getResult(Session session); abstract void collectTableNamesForRead(OrderedHashSet set); abstract void collectTableNamesForWrite(OrderedHashSet set); boolean[] getInsertOrUpdateColumnCheckList() { switch (type) { case StatementTypes.INSERT : return insertCheckColumns; case StatementTypes.UPDATE_WHERE : return updateCheckColumns; case StatementTypes.MERGE : boolean[] check = (boolean[]) ArrayUtil.duplicateArray(insertCheckColumns); ArrayUtil.orBooleanArray(updateCheckColumns, check); return check; } return null; } void materializeSubQueries(Session session) { HashSet subqueryPopFlags = new HashSet(); for (int i = 0; i < subqueries.length; i++) { TableDerived td = subqueries[i]; if (!subqueryPopFlags.add(td)) { continue; } if (!td.isCorrelated()) { td.materialise(session); } } } TableDerived[] getSubqueries(Session session) { OrderedHashSet subQueries = null; for (int i = 0; i < targetRangeVariables.length; i++) { if (targetRangeVariables[i] == null) { continue; } OrderedHashSet set = targetRangeVariables[i].getSubqueries(); subQueries = OrderedHashSet.addAll(subQueries, set); } for (int i = 0; i < updateExpressions.length; i++) { subQueries = updateExpressions[i].collectAllSubqueries(subQueries); } if (insertExpression != null) { subQueries = insertExpression.collectAllSubqueries(subQueries); } if (condition != null) { subQueries = condition.collectAllSubqueries(subQueries); } if (queryExpression != null) { OrderedHashSet set = queryExpression.getSubqueries(); subQueries = OrderedHashSet.addAll(subQueries, set); } if (updatableTableCheck != null) { OrderedHashSet set = updatableTableCheck.getSubqueries(); subQueries = OrderedHashSet.addAll(subQueries, set); } if (subQueries == null || subQueries.size() == 0) { return TableDerived.emptyArray; } TableDerived[] subQueryArray = new TableDerived[subQueries.size()]; subQueries.toArray(subQueryArray); ArraySort.sort(subQueryArray, 0, subQueryArray.length, subQueryArray[0]); return subQueryArray; } void setDatabseObjects(Session session, CompileContext compileContext) { parameters = compileContext.getParameters(); setParameterMetaData(); subqueries = getSubqueries(session); rangeIteratorCount = compileContext.getRangeVarCount(); rangeVariables = compileContext.getAllRangeVariables(); sequences = compileContext.getSequences(); routines = compileContext.getRoutines(); OrderedHashSet set = new OrderedHashSet(); collectTableNamesForWrite(set); if (set.size() > 0) { writeTableNames = new HsqlName[set.size()]; set.toArray(writeTableNames); set.clear(); } collectTableNamesForRead(set); set.removeAll(writeTableNames); if (set.size() > 0) { readTableNames = new HsqlName[set.size()]; set.toArray(readTableNames); } references = compileContext.getSchemaObjectNames(); if (targetTable != null) { references.add(targetTable.getName()); } } /** * Determines if the authorizations are adequate * to execute the compiled object. Completion requires the list of * all database objects in a compiled statement. */ void checkAccessRights(Session session) { if (targetTable != null && !targetTable.isTemp()) { if (!session.isProcessingScript) { targetTable.checkDataReadOnly(); } Grantee owner = targetTable.getOwner(); if (owner != null && owner.isSystem()) { if (!session.getUser().isSystem()) { throw Error.error(ErrorCode.X_42501, targetTable.getName().name); } } session.checkReadWrite(); } if (session.isAdmin()) { return; } for (int i = 0; i < sequences.length; i++) { session.getGrantee().checkAccess(sequences[i]); } for (int i = 0; i < routines.length; i++) { if (routines[i].isLibraryRoutine()) { continue; } session.getGrantee().checkAccess(routines[i]); } for (int i = 0; i < rangeVariables.length; i++) { RangeVariable range = rangeVariables[i]; if (range.rangeTable.getSchemaName() == SqlInvariants.SYSTEM_SCHEMA_HSQLNAME) { continue; } session.getGrantee().checkSelect(range.rangeTable, range.usedColumns); } switch (type) { case StatementTypes.CALL : { break; } case StatementTypes.INSERT : { session.getGrantee().checkInsert(targetTable, insertCheckColumns); break; } case StatementTypes.SELECT_CURSOR : break; case StatementTypes.DELETE_WHERE : { session.getGrantee().checkDelete(targetTable); break; } case StatementTypes.UPDATE_WHERE : { session.getGrantee().checkUpdate(targetTable, updateCheckColumns); break; } case StatementTypes.MERGE : { session.getGrantee().checkInsert(targetTable, insertCheckColumns); session.getGrantee().checkUpdate(targetTable, updateCheckColumns); break; } } } Result getWriteAccessResult(Session session) { try { if (targetTable != null && !targetTable.isTemp()) { session.checkReadWrite(); } } catch (HsqlException e) { return Result.newErrorResult(e); } return null; } /** * Returns the metadata, which is empty if the CompiledStatement does not * generate a Result. */ public ResultMetaData getResultMetaData() { switch (type) { case StatementTypes.DELETE_WHERE : case StatementTypes.INSERT : case StatementTypes.UPDATE_WHERE : case StatementTypes.MERGE : return ResultMetaData.emptyResultMetaData; default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementDMQL"); } } /** @todo 1.9.0 - build the metadata only once and reuse */ /** * Returns the metadata for the placeholder parameters. */ public ResultMetaData getParametersMetaData() { return parameterMetaData; } void setParameterMetaData() { int offset; int idx; boolean hasReturnValue; offset = 0; if (parameters.length == 0) { parameterMetaData = ResultMetaData.emptyParamMetaData; return; } // NO: Not yet // hasReturnValue = (type == CALL && !expression.isProcedureCall()); // // if (hasReturnValue) { // outlen++; // offset = 1; // } parameterMetaData = ResultMetaData.newParameterMetaData(parameters.length); // NO: Not yet // if (hasReturnValue) { // e = expression; // out.sName[0] = DIProcedureInfo.RETURN_COLUMN_NAME; // out.sClassName[0] = e.getValueClassName(); // out.colType[0] = e.getDataType(); // out.colSize[0] = e.getColumnSize(); // out.colScale[0] = e.getColumnScale(); // out.nullability[0] = e.nullability; // out.isIdentity[0] = false; // out.paramMode[0] = expression.PARAM_OUT; // } for (int i = 0; i < parameters.length; i++) { idx = i + offset; // always i + 1. We currently use the convention of @p0 to name the // return value OUT parameter parameterMetaData.columnLabels[idx] = StatementDMQL.PCOL_PREFIX + (i + 1); parameterMetaData.columnTypes[idx] = parameters[i].dataType; if (parameters[i].dataType == null) { throw Error.error(ErrorCode.X_42567); } byte parameterMode = SchemaObject.ParameterModes.PARAM_IN; if (parameters[i].column != null && parameters[i].column.getParameterMode() != SchemaObject.ParameterModes.PARAM_UNKNOWN) { parameterMode = parameters[i].column.getParameterMode(); } parameterMetaData.paramModes[idx] = parameterMode; parameterMetaData.paramNullable[idx] = parameters[i].column == null ? SchemaObject.Nullability.NULLABLE : parameters[i].column.getNullability(); } } /** * Retrieves a String representation of this object. */ public String describe(Session session) { try { return describeImpl(session); } catch (Throwable e) { e.printStackTrace(); return e.toString(); } } /** * Provides the toString() implementation. */ String describeImpl(Session session) throws Exception { StringBuffer sb; sb = new StringBuffer(); int blanks = 0; switch (type) { case StatementTypes.SELECT_CURSOR : { sb.append(queryExpression.describe(session, 0)); appendParms(sb).append('\n'); appendSubqueries(session, sb, 2); return sb.toString(); } case StatementTypes.INSERT : { if (queryExpression == null) { sb.append("INSERT VALUES"); sb.append('[').append('\n'); appendMultiColumns(sb, insertColumnMap).append('\n'); appendTable(sb).append('\n'); appendParms(sb).append('\n'); appendSubqueries(session, sb, 2).append(']'); return sb.toString(); } else { sb.append("INSERT SELECT"); sb.append('[').append('\n'); appendColumns(sb, insertColumnMap).append('\n'); appendTable(sb).append('\n'); sb.append(queryExpression.describe(session, blanks)).append('\n'); appendParms(sb).append('\n'); appendSubqueries(session, sb, 2).append(']'); return sb.toString(); } } case StatementTypes.UPDATE_WHERE : { sb.append("UPDATE"); sb.append('[').append('\n'); appendColumns(sb, updateColumnMap).append('\n'); appendTable(sb).append('\n'); appendCondition(session, sb); for (int i = 0; i < targetRangeVariables.length; i++) { sb.append(targetRangeVariables[i].describe(session, blanks)).append('\n'); } appendParms(sb).append('\n'); appendSubqueries(session, sb, 2).append(']'); return sb.toString(); } case StatementTypes.DELETE_WHERE : { sb.append("DELETE"); sb.append('[').append('\n'); appendTable(sb).append('\n'); appendCondition(session, sb); for (int i = 0; i < targetRangeVariables.length; i++) { sb.append(targetRangeVariables[i].describe(session, blanks)).append('\n'); } appendParms(sb).append('\n'); appendSubqueries(session, sb, 2).append(']'); return sb.toString(); } case StatementTypes.CALL : { sb.append("CALL"); sb.append('[').append(']'); return sb.toString(); } case StatementTypes.MERGE : { sb.append("MERGE"); sb.append('[').append('\n'); appendMultiColumns(sb, insertColumnMap).append('\n'); appendColumns(sb, updateColumnMap).append('\n'); appendTable(sb).append('\n'); appendCondition(session, sb); for (int i = 0; i < targetRangeVariables.length; i++) { sb.append(targetRangeVariables[i].describe(session, blanks)).append('\n'); } appendParms(sb).append('\n'); appendSubqueries(session, sb, 2).append(']'); return sb.toString(); } default : { return "UNKNOWN"; } } } private StringBuffer appendSubqueries(Session session, StringBuffer sb, int blanks) { sb.append("SUBQUERIES["); for (int i = 0; i < subqueries.length; i++) { sb.append("\n[level=").append(subqueries[i].depth).append('\n'); if (subqueries[i].queryExpression == null) { for (int j = 0; j < blanks; j++) { sb.append(' '); } sb.append("value expression"); } else { sb.append(subqueries[i].queryExpression.describe(session, blanks)); } sb.append("]"); } sb.append(']'); return sb; } private StringBuffer appendTable(StringBuffer sb) { sb.append("TABLE[").append(targetTable.getName().name).append(']'); return sb; } private StringBuffer appendSourceTable(StringBuffer sb) { sb.append("SOURCE TABLE[").append(sourceTable.getName().name).append( ']'); return sb; } private StringBuffer appendColumns(StringBuffer sb, int[] columnMap) { if (columnMap == null || updateExpressions.length == 0) { return sb; } sb.append("COLUMNS=["); for (int i = 0; i < columnMap.length; i++) { sb.append('\n').append(columnMap[i]).append(':').append( ' ').append( targetTable.getColumn(columnMap[i]).getNameString()); } for (int i = 0; i < updateExpressions.length; i++) { sb.append('[').append(updateExpressions[i]).append(']'); } sb.append(']'); return sb; } private StringBuffer appendMultiColumns(StringBuffer sb, int[] columnMap) { if (columnMap == null || multiColumnValues == null) { return sb; } sb.append("COLUMNS=["); for (int j = 0; j < multiColumnValues.length; j++) { for (int i = 0; i < columnMap.length; i++) { sb.append('\n').append(columnMap[i]).append(':').append( ' ').append( targetTable.getColumn(columnMap[i]).getName().name).append( '[').append(multiColumnValues[j][i]).append(']'); } } sb.append(']'); return sb; } private StringBuffer appendParms(StringBuffer sb) { sb.append("PARAMETERS=["); for (int i = 0; i < parameters.length; i++) { sb.append('\n').append('@').append(i).append('[').append( parameters[i].describe(null, 0)).append(']'); } sb.append(']'); return sb; } private StringBuffer appendCondition(Session session, StringBuffer sb) { return condition == null ? sb.append("CONDITION[]\n") : sb.append("CONDITION[").append( condition.describe(session, 0)).append( "]\n"); } public void resolve(Session session) {} public final boolean isCatalogLock() { return false; } public boolean isCatalogChange() { return false; } public void clearStructures(Session session) { session.sessionContext.clearStructures(this); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/RowActionBase.java0000644000175000017500000000714712007547376022325 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; /** * Represents a single insert / delete / rollback / commit action on a row. * * type = type of action * actionTimestamp = timestamp of end of SQL action; 0 if action not complete * commitTimestamp = timestamp of commit or rollback; 0 if not committed/rolledback * rolledBack = flag for rolled back actions * next = next action in linked list; * * timestamps are not in any order * * @author Fred Toussi (fredt@users dot sourceforge dot net) * @version 2.1.1 * @since 2.0.0 */ public class RowActionBase { public static final byte ACTION_NONE = 0; public static final byte ACTION_INSERT = 1; public static final byte ACTION_DELETE = 2; public static final byte ACTION_DELETE_FINAL = 3; public static final byte ACTION_INSERT_DELETE = 4; public static final byte ACTION_REF = 5; public static final byte ACTION_CHECK = 6; public static final byte ACTION_DEBUG = 7; // RowActionBase next; Session session; long actionTimestamp; long commitTimestamp; byte type; boolean deleteComplete; boolean rolledback; boolean prepared; int[] changeColumnMap; RowActionBase() {} /** * constructor, used for delete actions only */ RowActionBase(Session session, byte type) { this.session = session; this.type = type; actionTimestamp = session.actionTimestamp; } void setAsAction(RowActionBase action) { next = action.next; session = action.session; actionTimestamp = action.actionTimestamp; commitTimestamp = action.commitTimestamp; type = action.type; deleteComplete = action.deleteComplete; rolledback = action.rolledback; prepared = action.prepared; changeColumnMap = action.changeColumnMap; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/DatabaseManager.java0000644000175000017500000004007012007547352022606 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.util.Vector; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.HashMap; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.HsqlTimer; import org.hsqldb.lib.IntKeyHashMap; import org.hsqldb.lib.Iterator; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.server.Server; import org.hsqldb.server.ServerConstants; import org.hsqldb.store.ValuePool; /** * Handles initial attempts to connect to HSQLDB databases within the JVM * (or a classloader within the JVM). Opens the database if it is not open * or connects to it if it is already open. This allows the same database to * be used by different instances of Server and by direct connections.

* * Maintains a map of Server instances and notifies each server when its * database has shut down.

* * Maintains a reference to the timer used for file locks and logging.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.2 */ public class DatabaseManager { // Database and Server registry /** provides unique ID's for the Databases currently in registry */ private static int dbIDCounter; /** name to Database mapping for mem: databases */ static final HashMap memDatabaseMap = new HashMap(); /** File to Database mapping for file: databases */ static final HashMap fileDatabaseMap = new HashMap(); /** File to Database mapping for res: databases */ static final HashMap resDatabaseMap = new HashMap(); /** id number to Database for Databases currently in registry */ static final IntKeyHashMap databaseIDMap = new IntKeyHashMap(); /** * Returns a vector containing the URI (type + path) for all the databases. */ public static Vector getDatabaseURIs() { Vector v = new Vector(); synchronized (databaseIDMap) { Iterator it = databaseIDMap.values().iterator(); while (it.hasNext()) { Database db = (Database) it.next(); v.addElement(db.getURI()); } } return v; } /** * Closes all the databases using the given mode.

* * CLOSEMODE_IMMEDIATELY = 1; * CLOSEMODE_NORMAL = 2; * CLOSEMODE_COMPACT = 3; * CLOSEMODE_SCRIPT = 4; */ public static void closeDatabases(int mode) { synchronized (databaseIDMap) { Iterator it = databaseIDMap.values().iterator(); while (it.hasNext()) { Database db = (Database) it.next(); try { db.close(mode); } catch (HsqlException e) {} } } } /** * Used by server to open a new session */ public static Session newSession(int dbID, String user, String password, String zoneString, int timeZoneSeconds) { Database db = null; synchronized (databaseIDMap) { db = (Database) databaseIDMap.get(dbID); } if (db == null) { return null; } Session session = db.connect(user, password, zoneString, timeZoneSeconds); session.isNetwork = true; return session; } /** * Used by in-process connections and by Servlet */ public static Session newSession(String type, String path, String user, String password, HsqlProperties props, String zoneString, int timeZoneSeconds) { Database db = getDatabase(type, path, props); if (db == null) { return null; } return db.connect(user, password, zoneString, timeZoneSeconds); } /** * Returns an existing session. Used with repeat HTTP connections * belonging to the same JDBC Conenction / HSQL Session pair. */ public static Session getSession(int dbId, long sessionId) { Database db = null; synchronized (databaseIDMap) { db = (Database) databaseIDMap.get(dbId); } return db == null ? null : db.sessionManager.getSession(sessionId); } /** * Used by server to open or create a database */ public static int getDatabase(String type, String path, Server server, HsqlProperties props) { Database db = getDatabase(type, path, props); registerServer(server, db); return db.databaseID; } public static Database getDatabase(int id) { return (Database) databaseIDMap.get(id); } public static void shutdownDatabases(Server server, int shutdownMode) { Database[] dbArray; synchronized (serverMap) { HashSet databases = (HashSet) serverMap.get(server); dbArray = new Database[databases.size()]; databases.toArray(dbArray); } for (int i = 0; i < dbArray.length; i++) { dbArray[i].close(shutdownMode); } } /** * This has to be improved once a threading model is in place. * Current behaviour: * * Attempts to connect to different databases do not block. Two db's can * open simultaneously. * * Attempts to connect to a db while it is opening or closing will block * until the db is open or closed. At this point the db state is either * DATABASE_ONLINE (after db.open() has returned) which allows a new * connection to be made, or the state is DATABASE_SHUTDOWN which means * the db can be reopened for the new connection). * */ public static Database getDatabase(String type, String path, HsqlProperties props) { // If the (type, path) pair does not correspond to a registered // instance, then getDatabaseObject() returns a newly constructed // and registered Database instance. // The database state will be DATABASE_SHUTDOWN, // which means that the switch below will attempt to // open the database instance. Database db = getDatabaseObject(type, path, props); synchronized (db) { switch (db.getState()) { case Database.DATABASE_ONLINE : break; case Database.DATABASE_SHUTDOWN : // if the database was shutdown while this attempt // was waiting, add the database back to the registry if (lookupDatabaseObject(type, path) == null) { addDatabaseObject(type, path, db); } db.open(); break; // This state will currently not be reached as Database.Close() is // called while a lock is held on the database. // If we remove the lock from this method and a database is // being shutdown by a thread and in the meantime another thread // attempts to connect to the db. The threads could belong to // different server instances or be in-process. case Database.DATABASE_CLOSING : // this case will not be reached as the state is set and // cleared within the db.open() call above, which is called // from this synchronized block // it is here simply as a placeholder for future development case Database.DATABASE_OPENING : throw Error.error(ErrorCode.LOCK_FILE_ACQUISITION_FAILURE, ErrorCode.M_DatabaseManager_getDatabase); } } return db; } private static synchronized Database getDatabaseObject(String type, String path, HsqlProperties props) { Database db; String key = path; HashMap databaseMap; if (type == DatabaseURL.S_FILE) { databaseMap = fileDatabaseMap; key = filePathToKey(path); db = (Database) databaseMap.get(key); if (db == null) { if (databaseMap.size() > 0) { Iterator it = databaseMap.keySet().iterator(); while (it.hasNext()) { String current = (String) it.next(); if (key.equalsIgnoreCase(current)) { key = current; break; } } } } } else if (type == DatabaseURL.S_RES) { databaseMap = resDatabaseMap; } else if (type == DatabaseURL.S_MEM) { databaseMap = memDatabaseMap; } else { throw Error.runtimeError(ErrorCode.U_S0500, "DatabaseManager"); } db = (Database) databaseMap.get(key); if (db == null) { db = new Database(type, path, key, props); db.databaseID = dbIDCounter; synchronized (databaseIDMap) { databaseIDMap.put(dbIDCounter, db); dbIDCounter++; } databaseMap.put(key, db); } return db; } /** * Looks up database of a given type and path in the registry. Returns * null if there is none. */ public static synchronized Database lookupDatabaseObject(String type, String path) { Object key = path; HashMap databaseMap; if (type == DatabaseURL.S_FILE) { databaseMap = fileDatabaseMap; key = filePathToKey(path); } else if (type == DatabaseURL.S_RES) { databaseMap = resDatabaseMap; } else if (type == DatabaseURL.S_MEM) { databaseMap = memDatabaseMap; } else { throw (Error.runtimeError(ErrorCode.U_S0500, "DatabaseManager")); } return (Database) databaseMap.get(key); } /** * Adds a database to the registry. */ private static synchronized void addDatabaseObject(String type, String path, Database db) { Object key = path; HashMap databaseMap; if (type == DatabaseURL.S_FILE) { databaseMap = fileDatabaseMap; key = filePathToKey(path); } else if (type == DatabaseURL.S_RES) { databaseMap = resDatabaseMap; } else if (type == DatabaseURL.S_MEM) { databaseMap = memDatabaseMap; } else { throw Error.runtimeError(ErrorCode.U_S0500, "DatabaseManager"); } synchronized (databaseIDMap) { databaseIDMap.put(db.databaseID, db); } databaseMap.put(key, db); } /** * Removes the database from registry. */ static void removeDatabase(Database database) { int dbID = database.databaseID; String type = database.getType(); String path = database.getPath(); Object key = path; HashMap databaseMap; notifyServers(database); if (type == DatabaseURL.S_FILE) { databaseMap = fileDatabaseMap; key = filePathToKey(path); } else if (type == DatabaseURL.S_RES) { databaseMap = resDatabaseMap; } else if (type == DatabaseURL.S_MEM) { databaseMap = memDatabaseMap; } else { throw (Error.runtimeError(ErrorCode.U_S0500, "DatabaseManager")); } boolean isEmpty = false; synchronized (databaseIDMap) { databaseIDMap.remove(dbID); isEmpty = databaseIDMap.isEmpty(); } synchronized (databaseMap) { databaseMap.remove(key); } if (isEmpty) { ValuePool.resetPool(); } } /** * Maintains a map of servers to sets of databases. * Servers register each of their databases. * When a database is shutdown, all the servers accessing it are notified. * The database is then removed form the sets for all servers and the * servers that have no other database are removed from the map. */ static HashMap serverMap = new HashMap(); /** * Deregisters a server completely. */ public static void deRegisterServer(Server server) { synchronized (serverMap) { serverMap.remove(server); } } /** * Registers a server as serving a given database. */ private static void registerServer(Server server, Database db) { synchronized (serverMap) { if (!serverMap.containsKey(server)) { serverMap.put(server, new HashSet()); } HashSet databases = (HashSet) serverMap.get(server); databases.add(db); } } /** * Notifies all servers that serve the database that the database has been * shutdown. */ private static void notifyServers(Database db) { Server[] servers; synchronized (serverMap) { servers = new Server[serverMap.size()]; serverMap.keysToArray(servers); } for (int i = 0; i < servers.length; i++) { Server server = servers[i]; HashSet databases; boolean removed = false; synchronized (serverMap) { databases = (HashSet) serverMap.get(server); } if (databases != null) { synchronized (databases) { removed = databases.remove(db); } } if (removed) { server.notify(ServerConstants.SC_DATABASE_SHUTDOWN, db.databaseID); } } } static boolean isServerDB(Database db) { Iterator it = serverMap.keySet().iterator(); for (; it.hasNext(); ) { Server server = (Server) it.next(); HashSet databases = (HashSet) serverMap.get(server); if (databases.contains(db)) { return true; } } return false; } // Timer private static final HsqlTimer timer = new HsqlTimer(); public static HsqlTimer getTimer() { return timer; } // converts file path to database lookup key, converting any // thrown exception to an HsqlException in the process private static String filePathToKey(String path) { try { return FileUtil.getFileUtil().canonicalPath(path); } catch (Exception e) { return path; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementSchema.java0000644000175000017500000016353112007547416022705 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.navigator.RowIterator; import org.hsqldb.result.Result; import org.hsqldb.rights.Grantee; import org.hsqldb.rights.GranteeManager; import org.hsqldb.rights.Right; import org.hsqldb.store.ValuePool; import org.hsqldb.types.Charset; import org.hsqldb.types.Collation; import org.hsqldb.types.Type; /** * Implementation of Statement for DDL statements.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.1.1 * @since 1.9.0 */ public class StatementSchema extends Statement { int order; Object[] arguments = ValuePool.emptyObjectArray; boolean isSchemaDefinition; Token[] statementTokens; StatementSchema(int type, int group) { super(type, group); isTransactionStatement = true; } StatementSchema(String sql, int type) { this(sql, type, null, (HsqlName[]) null, null); } StatementSchema(String sql, int type, Object[] args) { this(sql, type, args, (HsqlName[]) null, null); } StatementSchema(String sql, int type, Object[] args, HsqlName[] readName, HsqlName[] writeName) { super(type); isTransactionStatement = true; this.sql = sql; if (args != null) { arguments = args; } if (readName != null) { readTableNames = readName; } if (writeName != null) { writeTableNames = writeName; } switch (type) { case StatementTypes.RENAME_OBJECT : group = StatementTypes.X_SQL_SCHEMA_MANIPULATION; break; case StatementTypes.ALTER_DOMAIN : case StatementTypes.ALTER_INDEX : case StatementTypes.ALTER_ROUTINE : case StatementTypes.ALTER_SEQUENCE : case StatementTypes.ALTER_TYPE : case StatementTypes.ALTER_TABLE : case StatementTypes.ALTER_TRANSFORM : case StatementTypes.ALTER_VIEW : group = StatementTypes.X_SQL_SCHEMA_MANIPULATION; break; case StatementTypes.DROP_ASSERTION : case StatementTypes.DROP_CHARACTER_SET : case StatementTypes.DROP_COLLATION : case StatementTypes.DROP_TYPE : case StatementTypes.DROP_DOMAIN : case StatementTypes.DROP_ROLE : case StatementTypes.DROP_USER : case StatementTypes.DROP_ROUTINE : case StatementTypes.DROP_SCHEMA : case StatementTypes.DROP_SEQUENCE : case StatementTypes.DROP_TABLE : case StatementTypes.DROP_TRANSFORM : case StatementTypes.DROP_TRANSLATION : case StatementTypes.DROP_TRIGGER : case StatementTypes.DROP_CAST : case StatementTypes.DROP_ORDERING : case StatementTypes.DROP_VIEW : case StatementTypes.DROP_INDEX : case StatementTypes.DROP_CONSTRAINT : case StatementTypes.DROP_COLUMN : group = StatementTypes.X_SQL_SCHEMA_MANIPULATION; break; case StatementTypes.GRANT : group = StatementTypes.X_SQL_SCHEMA_MANIPULATION; order = 10; break; case StatementTypes.GRANT_ROLE : group = StatementTypes.X_SQL_SCHEMA_MANIPULATION; order = 10; break; case StatementTypes.REVOKE : case StatementTypes.REVOKE_ROLE : group = StatementTypes.X_SQL_SCHEMA_MANIPULATION; break; case StatementTypes.CREATE_SCHEMA : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; break; case StatementTypes.CREATE_ROLE : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 1; break; case StatementTypes.CREATE_ROUTINE : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 7; break; case StatementTypes.CREATE_SEQUENCE : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 1; break; case StatementTypes.CREATE_TABLE : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 2; break; case StatementTypes.CREATE_TRANSFORM : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 1; break; case StatementTypes.CREATE_TRANSLATION : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 1; break; case StatementTypes.CREATE_TRIGGER : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 7; break; case StatementTypes.CREATE_CAST : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 2; break; case StatementTypes.CREATE_TYPE : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 1; break; case StatementTypes.CREATE_ORDERING : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 1; break; case StatementTypes.CREATE_VIEW : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 5; break; case StatementTypes.CREATE_USER : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 1; break; case StatementTypes.CREATE_ASSERTION : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 9; break; case StatementTypes.CREATE_CHARACTER_SET : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 1; break; case StatementTypes.CREATE_COLLATION : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 1; break; case StatementTypes.CREATE_DOMAIN : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 1; break; case StatementTypes.CREATE_ALIAS : group = StatementTypes.X_SQL_SCHEMA_DEFINITION; order = 8; break; case StatementTypes.CREATE_INDEX : group = StatementTypes.X_SQL_SCHEMA_MANIPULATION; order = 4; break; case StatementTypes.COMMENT : group = StatementTypes.X_SQL_SCHEMA_MANIPULATION; order = 11; break; case StatementTypes.CHECK : group = StatementTypes.X_SQL_SCHEMA_MANIPULATION; statementTokens = (Token[]) args[0]; break; case StatementTypes.LOG_SCHEMA_STATEMENT : group = StatementTypes.X_SQL_SCHEMA_MANIPULATION; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "StatemntSchema"); } } public Result execute(Session session) { Result result; try { result = getResult(session); } catch (Throwable t) { result = Result.newErrorResult(t, null); } if (result.isError()) { result.getException().setStatementType(group, type); return result; } session.database.schemaManager.setSchemaChangeTimestamp(); try { if (isLogged) { session.database.logger.writeOtherStatement(session, sql); } } catch (Throwable e) { return Result.newErrorResult(e, sql); } return result; } Result getResult(Session session) { SchemaManager schemaManager = session.database.schemaManager; if (this.isExplain) { return Result.newSingleColumnStringResult("OPERATION", describe(session)); } switch (type) { case StatementTypes.RENAME_OBJECT : { HsqlName name = (HsqlName) arguments[0]; HsqlName newName = (HsqlName) arguments[1]; SchemaObject object; if (name.type == SchemaObject.CATALOG) { try { session.checkAdmin(); session.checkDDLWrite(); name.rename(newName); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } else if (name.type == SchemaObject.SCHEMA) { /** * @todo 1.9.0 - review for schemas referenced in * external view or trigger definitions */ checkSchemaUpdateAuthorisation(session, name); schemaManager.checkSchemaNameCanChange(name); schemaManager.renameSchema(name, newName); break; } try { name.setSchemaIfNull(session.getCurrentSchemaHsqlName()); if (name.type == SchemaObject.COLUMN) { Table table = schemaManager.getUserTable(session, name.parent); int index = table.getColumnIndex(name.name); object = table.getColumn(index); } else { object = schemaManager.getSchemaObject(name); if (object == null) { throw Error.error(ErrorCode.X_42501, name.name); } name = object.getName(); } checkSchemaUpdateAuthorisation(session, name.schema); newName.setSchemaIfNull(name.schema); if (name.schema != newName.schema) { HsqlException e = Error.error(ErrorCode.X_42505); return Result.newErrorResult(e, sql); } newName.parent = name.parent; switch (object.getType()) { case SchemaObject.COLUMN : HsqlName parent = object.getName().parent; schemaManager.checkColumnIsReferenced( parent, object.getName()); Table table = schemaManager.getUserTable(session, parent); table.renameColumn((ColumnSchema) object, newName); break; default : schemaManager.renameSchemaObject(name, newName); } break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.ALTER_INDEX : { Table table = (Table) arguments[0]; int[] indexColumns = (int[]) arguments[1]; HsqlName name = (HsqlName) arguments[2]; Index index; try { index = (Index) session.database.schemaManager.getSchemaObject( name); TableWorks tableWorks = new TableWorks(session, table); tableWorks.alterIndex(index, indexColumns); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.ALTER_SEQUENCE : { try { NumberSequence sequence = (NumberSequence) arguments[0]; NumberSequence settings = (NumberSequence) arguments[1]; checkSchemaUpdateAuthorisation(session, sequence.getSchemaName()); sequence.reset(settings); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.ALTER_DOMAIN : try { int subType = ((Integer) arguments[0]).intValue(); Type domain = (Type) arguments[1]; switch (subType) { case StatementTypes.ADD_CONSTRAINT : { Constraint c = (Constraint) arguments[2]; session.database.schemaManager .checkSchemaObjectNotExists(c.getName()); domain.userTypeModifier.addConstraint(c); session.database.schemaManager.addSchemaObject(c); break; } case StatementTypes.ADD_DEFAULT : { Expression e = (Expression) arguments[2]; domain.userTypeModifier.setDefaultClause(e); break; } case StatementTypes.DROP_CONSTRAINT : { HsqlName name = (HsqlName) arguments[2]; session.database.schemaManager.removeSchemaObject( name); break; } case StatementTypes.DROP_DEFAULT : { domain.userTypeModifier.removeDefaultClause(); break; } } break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } case StatementTypes.ALTER_TABLE : try { int subType = ((Integer) arguments[0]).intValue(); Table table = (Table) arguments[1]; switch (subType) { case StatementTypes.ADD_CONSTRAINT : { Constraint c = (Constraint) arguments[2]; switch (c.getConstraintType()) { case SchemaObject.ConstraintTypes .PRIMARY_KEY : { TableWorks tableWorks = new TableWorks(session, table); tableWorks.addPrimaryKey(c); break; } case SchemaObject.ConstraintTypes.UNIQUE : { TableWorks tableWorks = new TableWorks(session, table); tableWorks.addUniqueConstraint(c); break; } case SchemaObject.ConstraintTypes .FOREIGN_KEY : { TableWorks tableWorks = new TableWorks(session, table); tableWorks.addForeignKey(c); break; } case SchemaObject.ConstraintTypes.CHECK : { TableWorks tableWorks = new TableWorks(session, table); tableWorks.addCheckConstraint(c); break; } } break; } case StatementTypes.ADD_COLUMN : { ColumnSchema column = (ColumnSchema) arguments[2]; int colIndex = ((Integer) arguments[3]).intValue(); HsqlArrayList list = (HsqlArrayList) arguments[4]; TableWorks tableWorks = new TableWorks(session, table); tableWorks.addColumn(column, colIndex, list); break; } case StatementTypes.ALTER_COLUMN_TYPE : { ColumnSchema column = (ColumnSchema) arguments[2]; Type type = (Type) arguments[3]; ColumnSchema newCol = column.duplicate(); newCol.setType(type); TableWorks tw = new TableWorks(session, table); tw.retypeColumn(column, newCol); break; } case StatementTypes.ALTER_COLUMN_TYPE_IDENTITY : { ColumnSchema column = (ColumnSchema) arguments[2]; Type type = (Type) arguments[3]; NumberSequence sequence = (NumberSequence) arguments[4]; ColumnSchema newCol = column.duplicate(); newCol.setType(type); newCol.setIdentity(sequence); TableWorks tw = new TableWorks(session, table); tw.retypeColumn(column, newCol); break; } case StatementTypes.ALTER_COLUMN_SEQUENCE : { ColumnSchema column = (ColumnSchema) arguments[2]; int columnIndex = ((Integer) arguments[3]).intValue(); NumberSequence sequence = (NumberSequence) arguments[4]; if (column.isIdentity()) { column.getIdentitySequence().reset(sequence); } else { column.setIdentity(sequence); table.setColumnTypeVars(columnIndex); } break; } case StatementTypes.ALTER_COLUMN_NULL : { ColumnSchema column = (ColumnSchema) arguments[2]; boolean nullable = ((Boolean) arguments[3]).booleanValue(); TableWorks tw = new TableWorks(session, table); tw.setColNullability(column, nullable); break; } case StatementTypes.ALTER_COLUMN_DEFAULT : { ColumnSchema column = (ColumnSchema) arguments[2]; int columnIndex = ((Integer) arguments[3]).intValue(); Expression e = (Expression) arguments[4]; TableWorks tw = new TableWorks(session, table); tw.setColDefaultExpression(columnIndex, e); break; } case StatementTypes.ALTER_COLUMN_DROP_DEFAULT : { ColumnSchema column = (ColumnSchema) arguments[2]; int columnIndex = ((Integer) arguments[3]).intValue(); TableWorks tw = new TableWorks(session, table); tw.setColDefaultExpression(columnIndex, null); table.setColumnTypeVars(columnIndex); break; } case StatementTypes.ALTER_COLUMN_DROP_GENERATED : { ColumnSchema column = (ColumnSchema) arguments[2]; int columnIndex = ((Integer) arguments[3]).intValue(); column.setIdentity(null); table.setColumnTypeVars(columnIndex); break; } } break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } case StatementTypes.ALTER_ROUTINE : { Routine routine = (Routine) arguments[0]; try { routine.resolveReferences(session); Routine oldRoutine = (Routine) schemaManager.getSchemaObject( routine.getSpecificName()); schemaManager.replaceReferences(oldRoutine, routine); oldRoutine.setAsAlteredRoutine(routine); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.ALTER_TYPE : case StatementTypes.ALTER_TRANSFORM : { throw Error.runtimeError(ErrorCode.U_S0500, "StatementSchema"); } case StatementTypes.ALTER_VIEW : { View view = (View) arguments[0]; try { checkSchemaUpdateAuthorisation(session, view.getSchemaName()); View oldView = (View) schemaManager.getSchemaObject(view.getName()); if (oldView == null) { throw Error.error(ErrorCode.X_42501, view.getName().name); } view.setName(oldView.getName()); view.compile(session, null); OrderedHashSet dependents = schemaManager.getReferencesTo(oldView.getName()); if (dependents.getCommonElementCount(view.getReferences()) > 0) { throw Error.error(ErrorCode.X_42502); } int i = schemaManager.getTableIndex(oldView); schemaManager.setTable(i, view); OrderedHashSet set = new OrderedHashSet(); set.add(view); try { schemaManager.recompileDependentObjects(set); } catch (HsqlException e) { schemaManager.setTable(i, oldView); schemaManager.recompileDependentObjects(set); } break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.DROP_COLUMN : { try { HsqlName name = (HsqlName) arguments[0]; int objectType = ((Integer) arguments[1]).intValue(); boolean cascade = ((Boolean) arguments[2]).booleanValue(); boolean ifExists = ((Boolean) arguments[3]).booleanValue(); Table table = schemaManager.getUserTable(session, name.parent); int colindex = table.getColumnIndex(name.name); if (table.getColumnCount() == 1) { throw Error.error(ErrorCode.X_42591); } checkSchemaUpdateAuthorisation(session, table.getSchemaName()); TableWorks tableWorks = new TableWorks(session, table); tableWorks.dropColumn(colindex, cascade); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.DROP_ASSERTION : case StatementTypes.DROP_CHARACTER_SET : case StatementTypes.DROP_COLLATION : case StatementTypes.DROP_TYPE : case StatementTypes.DROP_DOMAIN : case StatementTypes.DROP_ROLE : case StatementTypes.DROP_USER : case StatementTypes.DROP_ROUTINE : case StatementTypes.DROP_SCHEMA : case StatementTypes.DROP_SEQUENCE : case StatementTypes.DROP_TABLE : case StatementTypes.DROP_TRANSFORM : case StatementTypes.DROP_TRANSLATION : case StatementTypes.DROP_TRIGGER : case StatementTypes.DROP_CAST : case StatementTypes.DROP_ORDERING : case StatementTypes.DROP_VIEW : case StatementTypes.DROP_INDEX : case StatementTypes.DROP_CONSTRAINT : { try { HsqlName name = (HsqlName) arguments[0]; int objectType = ((Integer) arguments[1]).intValue(); boolean cascade = ((Boolean) arguments[2]).booleanValue(); boolean ifExists = ((Boolean) arguments[3]).booleanValue(); switch (type) { case StatementTypes.DROP_ROLE : case StatementTypes.DROP_USER : session.checkAdmin(); session.checkDDLWrite(); break; case StatementTypes.DROP_SCHEMA : checkSchemaUpdateAuthorisation(session, name); if (!schemaManager.schemaExists(name.name)) { if (ifExists) { return Result.updateZeroResult; } } break; default : if (name.schema == null) { name.schema = session.getCurrentSchemaHsqlName(); } else { if (!schemaManager.schemaExists( name.schema.name)) { if (ifExists) { return Result.updateZeroResult; } } } name.schema = schemaManager.getUserSchemaHsqlName( name.schema.name); checkSchemaUpdateAuthorisation(session, name.schema); SchemaObject object = schemaManager.getSchemaObject(name); if (object == null) { if (ifExists) { return Result.updateZeroResult; } throw Error.error(ErrorCode.X_42501, name.name); } if (name.type == SchemaObject.SPECIFIC_ROUTINE) { name = ((Routine) object).getSpecificName(); } else { name = object.getName(); } } if (!cascade) { schemaManager.checkObjectIsReferenced(name); } switch (type) { case StatementTypes.DROP_ROLE : dropRole(session, name, cascade); break; case StatementTypes.DROP_USER : dropUser(session, name, cascade); break; case StatementTypes.DROP_SCHEMA : dropSchema(session, name, cascade); break; case StatementTypes.DROP_ASSERTION : break; case StatementTypes.DROP_CHARACTER_SET : case StatementTypes.DROP_COLLATION : case StatementTypes.DROP_SEQUENCE : case StatementTypes.DROP_TRIGGER : dropObject(session, name, cascade); break; case StatementTypes.DROP_TYPE : dropType(session, name, cascade); break; case StatementTypes.DROP_DOMAIN : dropDomain(session, name, cascade); break; case StatementTypes.DROP_ROUTINE : dropRoutine(session, name, cascade); break; case StatementTypes.DROP_TABLE : case StatementTypes.DROP_VIEW : dropTable(session, name, cascade); break; case StatementTypes.DROP_TRANSFORM : case StatementTypes.DROP_TRANSLATION : case StatementTypes.DROP_CAST : case StatementTypes.DROP_ORDERING : break; case StatementTypes.DROP_INDEX : checkSchemaUpdateAuthorisation(session, name.schema); schemaManager.dropIndex(session, name); break; case StatementTypes.DROP_CONSTRAINT : checkSchemaUpdateAuthorisation(session, name.schema); schemaManager.dropConstraint(session, name, cascade); break; } break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.GRANT : case StatementTypes.REVOKE : { try { boolean grant = type == StatementTypes.GRANT; OrderedHashSet granteeList = (OrderedHashSet) arguments[0]; HsqlName name = (HsqlName) arguments[1]; this.setSchemaName(session, null, name); name = schemaManager.getSchemaObjectName(name.schema, name.name, name.type, true); SchemaObject schemaObject = schemaManager.getSchemaObject(name); Right right = (Right) arguments[2]; Grantee grantor = (Grantee) arguments[3]; boolean cascade = ((Boolean) arguments[4]).booleanValue(); boolean isGrantOption = ((Boolean) arguments[5]).booleanValue(); if (grantor == null) { grantor = isSchemaDefinition ? schemaName.owner : session.getGrantee(); } GranteeManager gm = session.database.granteeManager; switch (schemaObject.getType()) { case SchemaObject.CHARSET : break; case SchemaObject.VIEW : case SchemaObject.TABLE : { Table t = (Table) schemaObject; right.setColumns(t); if (t.getTableType() == TableBase.TEMP_TABLE && !right.isFull()) { return Result.newErrorResult( Error.error(ErrorCode.X_42595), sql); } } } if (grant) { gm.grant(granteeList, schemaObject, right, grantor, isGrantOption); } else { gm.revoke(granteeList, schemaObject, right, grantor, isGrantOption, cascade); } break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.GRANT_ROLE : case StatementTypes.REVOKE_ROLE : { try { boolean grant = type == StatementTypes.GRANT_ROLE; OrderedHashSet granteeList = (OrderedHashSet) arguments[0]; OrderedHashSet roleList = (OrderedHashSet) arguments[1]; Grantee grantor = (Grantee) arguments[2]; boolean cascade = ((Boolean) arguments[3]).booleanValue(); GranteeManager gm = session.database.granteeManager; gm.checkGranteeList(granteeList); for (int i = 0; i < granteeList.size(); i++) { String grantee = (String) granteeList.get(i); gm.checkRoleList(grantee, roleList, grantor, grant); } if (grant) { for (int i = 0; i < granteeList.size(); i++) { String grantee = (String) granteeList.get(i); for (int j = 0; j < roleList.size(); j++) { String roleName = (String) roleList.get(j); gm.grant(grantee, roleName, grantor); } } } else { for (int i = 0; i < granteeList.size(); i++) { String grantee = (String) granteeList.get(i); for (int j = 0; j < roleList.size(); j++) { gm.revoke(grantee, (String) roleList.get(j), grantor); } } } break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_ASSERTION : { return Result.updateZeroResult; } case StatementTypes.CREATE_CHARACTER_SET : { Charset charset = (Charset) arguments[0]; try { setOrCheckObjectName(session, null, charset.getName(), true); schemaManager.addSchemaObject(charset); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_COLLATION : { Collation collation = (Collation) arguments[0]; try { setOrCheckObjectName(session, null, collation.getName(), true); schemaManager.addSchemaObject(collation); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_ROLE : { try { session.checkAdmin(); session.checkDDLWrite(); HsqlName name = (HsqlName) arguments[0]; session.database.getGranteeManager().addRole(name); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_USER : { HsqlName name = (HsqlName) arguments[0]; String password = (String) arguments[1]; Grantee grantor = (Grantee) arguments[2]; boolean admin = ((Boolean) arguments[3]).booleanValue(); boolean isDigest = ((Boolean) arguments[4]).booleanValue(); try { session.checkAdmin(); session.checkDDLWrite(); session.database.getUserManager().createUser(name, password, isDigest); if (admin) { session.database.getGranteeManager().grant(name.name, SqlInvariants.DBA_ADMIN_ROLE_NAME, grantor); } break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_SCHEMA : { HsqlName name = (HsqlName) arguments[0]; Grantee owner = (Grantee) arguments[1]; try { session.checkDDLWrite(); if (schemaManager.schemaExists(name.name)) { if (session.isProcessingScript && SqlInvariants.PUBLIC_SCHEMA.equals( name.name)) {} else { throw Error.error(ErrorCode.X_42504, name.name); } } else { schemaManager.createSchema(name, owner); // always include authorization Schema schema = schemaManager.findSchema(name.name); this.sql = schema.getSQL(); if (session.isProcessingScript() && session.database.getProperties() .isVersion18()) { session.setCurrentSchemaHsqlName(schema.getName()); } } break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_ROUTINE : { Routine routine = (Routine) arguments[0]; try { routine.resolve(session); setOrCheckObjectName(session, null, routine.getName(), false); schemaManager.addSchemaObject(routine); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_ALIAS : { HsqlName name = (HsqlName) arguments[0]; Routine[] routines = (Routine[]) arguments[1]; try { session.checkAdmin(); session.checkDDLWrite(); if (name != null) { for (int i = 0; i < routines.length; i++) { routines[i].setName(name); schemaManager.addSchemaObject(routines[i]); } } break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_SEQUENCE : { NumberSequence sequence = (NumberSequence) arguments[0]; try { setOrCheckObjectName(session, null, sequence.getName(), true); schemaManager.addSchemaObject(sequence); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_DOMAIN : { Type type = (Type) arguments[0]; Constraint[] constraints = type.userTypeModifier.getConstraints(); try { setOrCheckObjectName(session, null, type.getName(), true); for (int i = 0; i < constraints.length; i++) { Constraint c = constraints[i]; setOrCheckObjectName(session, type.getName(), c.getName(), true); schemaManager.addSchemaObject(c); } schemaManager.addSchemaObject(type); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_TABLE : { Table table = (Table) arguments[0]; HsqlArrayList tempConstraints = (HsqlArrayList) arguments[1]; StatementDMQL statement = (StatementDMQL) arguments[2]; Boolean ifNotExists = (Boolean) arguments[3]; HsqlArrayList foreignConstraints = null; try { setOrCheckObjectName(session, null, table.getName(), true); } catch (HsqlException e) { if (ifNotExists != null && ifNotExists.booleanValue()) { return Result.updateZeroResult; } else { return Result.newErrorResult(e, sql); } } try { if (isSchemaDefinition) { foreignConstraints = new HsqlArrayList(); } if (tempConstraints.size() != 0) { table = ParserDDL.addTableConstraintDefinitions(session, table, tempConstraints, foreignConstraints, true); arguments[1] = foreignConstraints; } table.compile(session, null); schemaManager.addSchemaObject(table); if (statement != null) { Result result = statement.execute(session); table.insertIntoTable(session, result); } if (table.hasLobColumn) { RowIterator it = table.rowIterator(session); while (it.hasNext()) { Row row = it.getNextRow(); Object[] data = row.getData(); session.sessionData.adjustLobUsageCount(table, data, 1); } } return Result.updateZeroResult; } catch (HsqlException e) { schemaManager.removeExportedKeys(table); schemaManager.removeDependentObjects(table.getName()); return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_TRANSFORM : return Result.updateZeroResult; case StatementTypes.CREATE_TRANSLATION : return Result.updateZeroResult; case StatementTypes.CREATE_TRIGGER : { TriggerDef trigger = (TriggerDef) arguments[0]; HsqlName otherName = (HsqlName) arguments[1]; try { checkSchemaUpdateAuthorisation(session, trigger.getSchemaName()); schemaManager.checkSchemaObjectNotExists( trigger.getName()); if (otherName != null) { if (schemaManager.getSchemaObject(otherName) == null) { throw Error.error(ErrorCode.X_42501, otherName.name); } } trigger.table.addTrigger(trigger, otherName); schemaManager.addSchemaObject(trigger); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_CAST : return Result.updateZeroResult; case StatementTypes.CREATE_TYPE : { Type type = (Type) arguments[0]; try { setOrCheckObjectName(session, null, type.getName(), true); schemaManager.addSchemaObject(type); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_ORDERING : return Result.updateZeroResult; case StatementTypes.CREATE_VIEW : { View view = (View) arguments[0]; try { checkSchemaUpdateAuthorisation(session, view.getSchemaName()); schemaManager.checkSchemaObjectNotExists(view.getName()); view.compile(session, null); schemaManager.addSchemaObject(view); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.CREATE_INDEX : { Table table; HsqlName name; int[] indexColumns; boolean unique; table = (Table) arguments[0]; indexColumns = (int[]) arguments[1]; name = (HsqlName) arguments[2]; unique = ((Boolean) arguments[3]).booleanValue(); try { /* Index index = table.getIndexForColumns(indexColumns); if (index != null && ArrayUtil.areEqual(indexColumns, index.getColumns(), indexColumns.length, unique)) { if (index.isUnique() || !unique) { return; } } */ setOrCheckObjectName(session, table.getName(), name, true); TableWorks tableWorks = new TableWorks(session, table); tableWorks.addIndex(indexColumns, name, unique); break; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.COMMENT : { HsqlName name = (HsqlName) arguments[0]; String comment = (String) arguments[1]; switch (name.type) { case SchemaObject.COLUMN : { Table table = (Table) schemaManager.getSchemaObject( name.parent.name, name.parent.schema.name, SchemaObject.TABLE); if (!session.getGrantee().isFullyAccessibleByRole( table.getName())) { throw Error.error(ErrorCode.X_42501); } int index = table.getColumnIndex(name.name); if (index < 0) { throw Error.error(ErrorCode.X_42501); } ColumnSchema column = table.getColumn(index); column.getName().comment = comment; break; } case SchemaObject.ROUTINE : { RoutineSchema routine = (RoutineSchema) schemaManager.getSchemaObject( name.name, name.schema.name, SchemaObject.ROUTINE); if (!session.getGrantee().isFullyAccessibleByRole( routine.getName())) { throw Error.error(ErrorCode.X_42501); } routine.getName().comment = comment; break; } case SchemaObject.TABLE : { Table table = (Table) schemaManager.getSchemaObject(name.name, name.schema.name, SchemaObject.TABLE); if (!session.getGrantee().isFullyAccessibleByRole( table.getName())) { throw Error.error(ErrorCode.X_42501); } table.getName().comment = comment; break; } } break; } // for logging only case StatementTypes.LOG_SCHEMA_STATEMENT : break; default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementSchema"); } return Result.updateZeroResult; } private void dropType(Session session, HsqlName name, boolean cascade) { checkSchemaUpdateAuthorisation(session, name.schema); Type distinct = (Type) session.database.schemaManager.getSchemaObject(name); session.database.schemaManager.removeSchemaObject(name, cascade); distinct.userTypeModifier = null; } private static void dropDomain(Session session, HsqlName name, boolean cascade) { Type domain = (Type) session.database.schemaManager.getSchemaObject(name); OrderedHashSet set = session.database.schemaManager.getReferencesTo(domain.getName()); if (!cascade && set.size() > 0) { HsqlName objectName = (HsqlName) set.get(0); throw Error.error(ErrorCode.X_42502, objectName.getSchemaQualifiedStatementName()); } Constraint[] constraints = domain.userTypeModifier.getConstraints(); set = new OrderedHashSet(); for (int i = 0; i < constraints.length; i++) { set.add(constraints[i].getName()); } session.database.schemaManager.removeSchemaObjects(set); session.database.schemaManager.removeSchemaObject(domain.getName(), cascade); domain.userTypeModifier = null; } private static void dropRole(Session session, HsqlName name, boolean cascade) { Grantee role = session.database.getGranteeManager().getRole(name.name); if (!cascade && session.database.schemaManager.hasSchemas(role)) { HsqlArrayList list = session.database.schemaManager.getSchemas(role); Schema schema = (Schema) list.get(0); throw Error.error(ErrorCode.X_42502, schema.getName().statementName); } session.database.schemaManager.dropSchemas(session, role, cascade); session.database.getGranteeManager().dropRole(name.name); } private static void dropUser(Session session, HsqlName name, boolean cascade) { Grantee grantee = session.database.getUserManager().get(name.name); if (session.database.getSessionManager().isUserActive(name.name)) { throw Error.error(ErrorCode.X_42539); } if (!cascade && session.database.schemaManager.hasSchemas(grantee)) { HsqlArrayList list = session.database.schemaManager.getSchemas(grantee); Schema schema = (Schema) list.get(0); throw Error.error(ErrorCode.X_42502, schema.getName().statementName); } session.database.schemaManager.dropSchemas(session, grantee, cascade); session.database.getUserManager().dropUser(name.name); } private void dropSchema(Session session, HsqlName name, boolean cascade) { HsqlName schema = session.database.schemaManager.getUserSchemaHsqlName(name.name); checkSchemaUpdateAuthorisation(session, schema); session.database.schemaManager.dropSchema(session, name.name, cascade); } private void dropRoutine(Session session, HsqlName name, boolean cascade) { checkSchemaUpdateAuthorisation(session, name.schema); session.database.schemaManager.removeSchemaObject(name, cascade); } private void dropObject(Session session, HsqlName name, boolean cascade) { name = session.database.schemaManager.getSchemaObjectName(name.schema, name.name, name.type, true); session.database.schemaManager.removeSchemaObject(name, cascade); } private void dropTable(Session session, HsqlName name, boolean cascade) { Table table = session.database.schemaManager.findUserTable(session, name.name, name.schema.name); session.database.schemaManager.dropTableOrView(session, table, cascade); } static void checkSchemaUpdateAuthorisation(Session session, HsqlName schema) { if (session.isProcessingLog) { return; } if (SqlInvariants.isSystemSchemaName(schema.name)) { throw Error.error(ErrorCode.X_42503); } if (session.parser.isSchemaDefinition) { if (schema == session.getCurrentSchemaHsqlName()) { return; } Error.error(ErrorCode.X_42505, schema.name); } session.getGrantee().checkSchemaUpdateOrGrantRights(schema.name); session.checkDDLWrite(); } void setOrCheckObjectName(Session session, HsqlName parent, HsqlName name, boolean check) { if (name.schema == null) { name.schema = schemaName == null ? session.getCurrentSchemaHsqlName() : schemaName; } else { name.schema = session.getSchemaHsqlName(name.schema.name); if (name.schema == null) { throw Error.error(ErrorCode.X_42505); } if (isSchemaDefinition && schemaName != name.schema) { throw Error.error(ErrorCode.X_42505); } } name.parent = parent; if (!isSchemaDefinition) { checkSchemaUpdateAuthorisation(session, name.schema); } if (check) { session.database.schemaManager.checkSchemaObjectNotExists(name); } } void setSchemaName(Session session, HsqlName parent, HsqlName name) { if (name.schema == null) { name.schema = schemaName == null ? session.getCurrentSchemaHsqlName() : schemaName; } else { name.schema = session.getSchemaHsqlName(name.schema.name); if (name.schema == null) { throw Error.error(ErrorCode.X_42505); } if (isSchemaDefinition && schemaName != name.schema) { throw Error.error(ErrorCode.X_42505); } } } public boolean isAutoCommitStatement() { return true; } public String describe(Session session) { return sql; } public Object[] getArguments() { return arguments; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/RangeVariableJoined.java0000644000175000017500000002445112007547406023447 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.HsqlNameManager.SimpleName; import org.hsqldb.RangeVariable.RangeIteratorMain; import org.hsqldb.error.ErrorCode; import org.hsqldb.error.Error; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.HashSet; import org.hsqldb.index.Index; import org.hsqldb.store.ValuePool; import org.hsqldb.ParserDQL.CompileContext; /** * Metadata for range joined variables * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class RangeVariableJoined extends RangeVariable { RangeVariable[] rangeArray; public RangeVariableJoined(Table table, SimpleName alias, OrderedHashSet columnList, SimpleName[] columnNameList, CompileContext compileContext) { super(table, alias, columnList, columnNameList, compileContext); setParameters(); } private void setParameters() { QuerySpecification qs = (QuerySpecification) this.rangeTable.getQueryExpression(); this.rangeArray = qs.rangeVariables; for (int i = 0; i < rangeArray.length; i++) { if (rangeArray[i].isLeftJoin) { hasLeftJoin = true; } if (rangeArray[i].isRightJoin) { hasRightJoin = true; } if (rangeArray[i].isLateral) { hasLateral = true; } break; } } public RangeVariable[] getBaseRangeVariables() { return rangeArray; } public void setRangeTableVariables() { super.setRangeTableVariables(); } public RangeVariable duplicate() { RangeVariable r = null; try { r = (RangeVariable) super.clone(); } catch (CloneNotSupportedException ex) { throw Error.runtimeError(ErrorCode.U_S0500, "RangeVariable"); } r.resetConditions(); return r; } public void setJoinType(boolean isLeft, boolean isRight) { super.setJoinType(isLeft, isRight); } public void addNamedJoinColumns(OrderedHashSet columns) { super.addNamedJoinColumns(columns); } public void addColumn(int columnIndex) { super.addColumn(columnIndex); } public void addAllColumns() { super.addAllColumns(); } public void addNamedJoinColumnExpression(String name, Expression e) { super.addNamedJoinColumnExpression(name, e); } public ExpressionColumn getColumnExpression(String name) { return super.getColumnExpression(name); } public Table getTable() { return super.getTable(); } public boolean hasSingleIndexCondition() { return super.hasSingleIndexCondition(); } public boolean setDistinctColumnsOnIndex(int[] colMap) { return super.setDistinctColumnsOnIndex(colMap); } /** * Used for sort */ public Index getSortIndex() { return super.getSortIndex(); } /** * Used for sort */ public boolean setSortIndex(Index index, boolean reversed) { return super.setSortIndex(index, reversed); } public boolean reverseOrder() { return super.reverseOrder(); } public OrderedHashSet getColumnNames() { return super.getColumnNames(); } public OrderedHashSet getUniqueColumnNameSet() { return super.getUniqueColumnNameSet(); } public int findColumn(String schemaName, String tableName, String columnName) { if (tableAlias != null) { return super.findColumn(schemaName, tableName, columnName); } int count = 0; for (int i = 0; i < rangeArray.length; i++) { int colIndex = rangeArray[i].findColumn(schemaName, tableName, columnName); if (colIndex > -1) { return count + colIndex; } count += rangeArray[i].rangeTable.getColumnCount(); } return -1; } public SimpleName getColumnAlias(int i) { return super.getColumnAlias(i); } public boolean hasColumnAlias() { return super.hasColumnAlias(); } public SimpleName getTableAlias() { return super.getTableAlias(); } public RangeVariable getRangeForTableName(String name) { if (tableAlias != null) { return super.getRangeForTableName(name); } for (int i = 0; i < rangeArray.length; i++) { RangeVariable range = rangeArray[i].getRangeForTableName(name); if (range != null) { return range; } } return null; } /** * Add all columns to a list of expressions */ public void addTableColumns(HsqlArrayList exprList) { super.addTableColumns(exprList); } /** * Add all columns to a list of expressions */ public int addTableColumns(HsqlArrayList exprList, int position, HashSet exclude) { return super.addTableColumns(exprList, position, exclude); } public void addTableColumns(RangeVariable subRange, Expression expression, HashSet exclude) { int index = getFirstColumnIndex(subRange); addTableColumns(expression, index, subRange.rangeTable.getColumnCount(), exclude); } protected int getFirstColumnIndex(RangeVariable subRange) { int count = 0; for (int i = 0; i < rangeArray.length; i++) { int index = rangeArray[i].getFirstColumnIndex(subRange); if (index == -1) { count += rangeArray[i].rangeTable.getColumnCount(); } else { return count + index; } } return -1; } /** * Removes reference to Index to avoid possible memory leaks after alter * table or drop index */ public void setForCheckConstraint() { super.setForCheckConstraint(); } /** * used before condition processing */ public Expression getJoinCondition() { return super.getJoinCondition(); } public void addJoinCondition(Expression e) { super.addJoinCondition(e); } public void resetConditions() { super.resetConditions(); } public void replaceColumnReference(RangeVariable range, Expression[] list) {} public void replaceRangeVariables(RangeVariable[] ranges, RangeVariable[] newRanges) { super.replaceRangeVariables(ranges, newRanges); } public void resolveRangeTable(Session session, RangeGroup rangeGroup, RangeGroup[] rangeGroups) { super.resolveRangeTable(session, rangeGroup, rangeGroups); } /** * Retreives a String representation of this obejct.

* * The returned String describes this object's table, alias * access mode, index, join mode, Start, End and And conditions. * * @return a String representation of this object */ public String describe(Session session, int blanks) { RangeVariableConditions[] conditionsArray = joinConditions; StringBuffer sb; String b = ValuePool.spaceString.substring(0, blanks); sb = new StringBuffer(); String temp = "INNER"; if (isLeftJoin) { temp = "LEFT OUTER"; if (isRightJoin) { temp = "FULL"; } } else if (isRightJoin) { temp = "RIGHT OUTER"; } sb.append(b).append("join type=").append(temp).append("\n"); sb.append(b).append("table=").append(rangeTable.getName().name).append( "\n"); if (tableAlias != null) { sb.append(b).append("alias=").append(tableAlias.name).append("\n"); } boolean fullScan = !conditionsArray[0].hasIndexCondition(); sb.append(b).append("access=").append(fullScan ? "FULL SCAN" : "INDEX PRED").append( "\n"); for (int i = 0; i < conditionsArray.length; i++) { RangeVariableConditions conditions = this.joinConditions[i]; if (i > 0) { sb.append(b).append("OR condition = ["); } else { sb.append(b).append("condition = ["); } sb.append(conditions.describe(session, blanks + 2)); sb.append(b).append("]\n"); } return sb.toString(); } public RangeIteratorMain getIterator(Session session) { return super.getIterator(session); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ParserDQL.java0000644000175000017500000053523712007547374021426 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.HsqlNameManager.SimpleName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.HsqlList; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.LongDeque; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.OrderedIntKeyHashMap; import org.hsqldb.result.ResultConstants; import org.hsqldb.result.ResultProperties; import org.hsqldb.store.BitMap; import org.hsqldb.store.ValuePool; import org.hsqldb.types.ArrayType; import org.hsqldb.types.BlobType; import org.hsqldb.types.Charset; import org.hsqldb.types.ClobType; import org.hsqldb.types.Collation; import org.hsqldb.types.DTIType; import org.hsqldb.types.IntervalType; import org.hsqldb.types.NumberType; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Parser for DQL statements * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class ParserDQL extends ParserBase { protected Database database; protected Session session; protected final CompileContext compileContext; HsqlException lastError; /** * Constructs a new Parser object with the given context. * * @param session the connected context * @param t the token source from which to parse commands */ ParserDQL(Session session, Scanner t) { super(t); this.session = session; database = session.getDatabase(); compileContext = new CompileContext(session, this); } /** * Resets this parse context with the given SQL character sequence. * * @param sql a new SQL character sequence to replace the current one */ void reset(String sql) { reset(sql, 1); } void reset(String sql, int rangeVarIndex) { super.reset(sql); compileContext.reset(rangeVarIndex); lastError = null; } void checkIsSchemaObjectName() { if (database.sqlEnforceNames) { checkIsNonReservedIdentifier(); } else { checkIsNonCoreReservedIdentifier(); } if (database.sqlRegularNames) { checkIsIrregularCharInIdentifier(); } } Type readTypeDefinition(boolean allowCollation, boolean includeUserTypes) { int typeNumber = Integer.MIN_VALUE; boolean hasLength = false; boolean hasScale = false; boolean isCharacter = false; boolean readByteOrChar = false; checkIsIdentifier(); if (token.namePrefix == null) { typeNumber = Type.getTypeNr(token.tokenString); } if (database.sqlSyntaxOra && !session.isProcessingScript()) { if (typeNumber == Types.SQL_DATE) { read(); return Type.SQL_TIMESTAMP_NO_FRACTION; } } if (typeNumber == Integer.MIN_VALUE) { if (includeUserTypes) { checkIsSchemaObjectName(); String schemaName = session.getSchemaName(token.namePrefix); Type type = database.schemaManager.getDomainOrUDT(token.tokenString, schemaName, false); if (type != null) { getRecordedToken().setExpression(type); compileContext.addSchemaObject(type); read(); return type; } } if (token.namePrefix != null) { throw Error.error(ErrorCode.X_42509, token.tokenString); } if (database.sqlSyntaxOra) { switch (token.tokenType) { case Tokens.BINARY_DOUBLE : case Tokens.BINARY_FLOAT : read(); return Type.SQL_DOUBLE; case Tokens.LONG : read(); if (token.tokenType == Tokens.RAW) { read(); return Type.getType(Types.SQL_VARBINARY, null, null, BlobType.defaultBlobSize, 0); } else { return Type.getType(Types.SQL_VARCHAR, null, database.collation, ClobType.defaultClobSize, 0); } case Tokens.NUMBER : read(); if (token.tokenType == Tokens.OPENBRACKET) { read(); boolean isInt = false; int precision = readInteger(); int scale = 0; if (token.tokenType == Tokens.COMMA) { read(); scale = readInteger(); } else if (precision < 10) { isInt = true; } readThis(Tokens.CLOSEBRACKET); return isInt ? Type.SQL_INTEGER : Type.getType(Types.SQL_DECIMAL, null, null, precision, scale); } else { return Type.SQL_DOUBLE; } case Tokens.RAW : typeNumber = Types.SQL_VARBINARY; break; case Tokens.VARCHAR2 : case Tokens.NVARCHAR2 : typeNumber = Types.SQL_VARCHAR; readByteOrChar = true; break; } } if (database.sqlSyntaxMys || database.sqlSyntaxPgs) { switch (token.tokenType) { case Tokens.TEXT : typeNumber = Types.LONGVARCHAR; readByteOrChar = true; break; case Tokens.CITEXT : if (database.sqlSyntaxPgs) { typeNumber = Types.VARCHAR_IGNORECASE; } break; } } if (typeNumber == Integer.MIN_VALUE) { throw Error.error(ErrorCode.X_42509, token.tokenString); } } read(); switch (typeNumber) { case Types.SQL_CHAR : if (token.tokenType == Tokens.VARYING) { read(); typeNumber = Types.SQL_VARCHAR; } else if (token.tokenType == Tokens.LARGE) { read(); readThis(Tokens.OBJECT); typeNumber = Types.SQL_CLOB; } break; case Types.SQL_DOUBLE : if (token.tokenType == Tokens.PRECISION) { read(); } break; case Types.SQL_BINARY : if (token.tokenType == Tokens.VARYING) { read(); typeNumber = Types.SQL_VARBINARY; } else if (token.tokenType == Tokens.LARGE) { read(); readThis(Tokens.OBJECT); typeNumber = Types.SQL_BLOB; } break; case Types.SQL_BIT : if (token.tokenType == Tokens.VARYING) { read(); typeNumber = Types.SQL_BIT_VARYING; } break; case Types.SQL_INTERVAL : return readIntervalType(false); default : } long length = typeNumber == Types.SQL_TIMESTAMP ? DTIType.defaultTimestampFractionPrecision : 0; int scale = 0; if (Types.requiresPrecision(typeNumber) && token.tokenType != Tokens.OPENBRACKET && database.sqlEnforceSize && !session.isProcessingScript) { throw Error.error(ErrorCode.X_42599, Type.getDefaultType(typeNumber).getNameString()); } if (Types.acceptsPrecision(typeNumber)) { if (token.tokenType == Tokens.OPENBRACKET) { int multiplier = 1; read(); switch (token.tokenType) { case Tokens.X_VALUE : if (token.dataType.typeCode != Types.SQL_INTEGER && token.dataType.typeCode != Types.SQL_BIGINT) { throw unexpectedToken(); } break; case Tokens.X_LOB_SIZE : if (typeNumber == Types.SQL_BLOB || typeNumber == Types.SQL_CLOB) { switch (token.lobMultiplierType) { case Tokens.K : multiplier = 1024; break; case Tokens.M : multiplier = 1024 * 1024; break; case Tokens.G : multiplier = 1024 * 1024 * 1024; break; case Tokens.P : case Tokens.T : default : throw unexpectedToken(); } break; } else { throw unexpectedToken(token.getFullString()); } default : throw unexpectedToken(); } hasLength = true; length = ((Number) token.tokenValue).longValue(); if (length < 0 || (length == 0 && !Types.acceptsZeroPrecision(typeNumber))) { throw Error.error(ErrorCode.X_42592); } length *= multiplier; read(); if (typeNumber == Types.SQL_CHAR || typeNumber == Types.SQL_VARCHAR || typeNumber == Types.SQL_CLOB) { if (token.tokenType == Tokens.CHARACTERS) { read(); } else if (token.tokenType == Tokens.OCTETS) { read(); length /= 2; } } if (Types.acceptsScaleCreateParam(typeNumber) && token.tokenType == Tokens.COMMA) { read(); scale = readInteger(); if (scale < 0) { throw Error.error(ErrorCode.X_42592); } hasScale = true; } if (readByteOrChar) { if (!readIfThis(Tokens.CHAR)) { readIfThis(Tokens.BYTE); } } readThis(Tokens.CLOSEBRACKET); } else if (typeNumber == Types.SQL_BIT) { length = 1; } else if (typeNumber == Types.SQL_BLOB || typeNumber == Types.SQL_CLOB) { length = BlobType.defaultBlobSize; } else if (database.sqlEnforceSize) { // BIT is always BIT(1), regardless of sqlEnforceSize if (typeNumber == Types.SQL_CHAR || typeNumber == Types.SQL_BINARY) { length = 1; } } if (typeNumber == Types.SQL_TIMESTAMP || typeNumber == Types.SQL_TIME) { if (length > DTIType.maxFractionPrecision) { throw Error.error(ErrorCode.X_42592); } scale = (int) length; length = 0; if (token.tokenType == Tokens.WITH) { read(); readThis(Tokens.TIME); readThis(Tokens.ZONE); if (typeNumber == Types.SQL_TIMESTAMP) { typeNumber = Types.SQL_TIMESTAMP_WITH_TIME_ZONE; } else { typeNumber = Types.SQL_TIME_WITH_TIME_ZONE; } } else if (token.tokenType == Tokens.WITHOUT) { read(); readThis(Tokens.TIME); readThis(Tokens.ZONE); } } } switch (typeNumber) { case Types.LONGVARCHAR : { if (database.sqlLongvarIsLob) { typeNumber = Types.SQL_CLOB; } else { typeNumber = Types.SQL_VARCHAR; } if (!hasLength) { length = ClobType.defaultClobSize; } break; } case Types.LONGVARBINARY : { if (database.sqlLongvarIsLob) { typeNumber = Types.SQL_BLOB; } else { typeNumber = Types.SQL_VARBINARY; } if (!hasLength) { length = BlobType.defaultBlobSize; } break; } case Types.SQL_CHAR : if (database.sqlSyntaxDb2) { if (readIfThis(Tokens.FOR)) { readThis(Tokens.BIT); readThis(Tokens.DATA); typeNumber = Types.SQL_BINARY; break; } } case Types.SQL_CLOB : isCharacter = true; break; case Types.VARCHAR_IGNORECASE : if (!hasLength) { length = 32 * 1024; } isCharacter = true; break; case Types.SQL_VARCHAR : if (database.sqlSyntaxDb2) { if (readIfThis(Tokens.FOR)) { readThis(Tokens.BIT); readThis(Tokens.DATA); typeNumber = Types.SQL_VARBINARY; if (!hasLength) { length = 32 * 1024; } break; } } isCharacter = true; if (!hasLength) { length = 32 * 1024; } break; case Types.SQL_BINARY : break; case Types.SQL_VARBINARY : if (!hasLength) { length = 32 * 1024; } break; case Types.SQL_DECIMAL : case Types.SQL_NUMERIC : if (!hasLength && !hasScale && !database.sqlEnforceSize) { length = NumberType.defaultNumericPrecision; scale = NumberType.defaultNumericScale; } break; } if (session.ignoreCase && typeNumber == Types.SQL_VARCHAR) { typeNumber = Types.VARCHAR_IGNORECASE; } Collation collation = database.collation; Charset charset = null; if (isCharacter) { if (token.tokenType == Tokens.CHARACTER) { read(); readThis(Tokens.SET); checkIsSchemaObjectName(); String schemaName = session.getSchemaName(token.namePrefix); charset = (Charset) database.schemaManager.getSchemaObject( token.tokenString, schemaName, SchemaObject.CHARSET); read(); } if (token.tokenType == Tokens.COLLATE) { read(); checkIsSimpleName(); try { collation = Collation.getCollation(token.tokenString); } catch (HsqlException e) { String schemaName = session.getSchemaName(token.namePrefix); collation = (Collation) database.schemaManager.getSchemaObject( token.tokenString, schemaName, SchemaObject.COLLATION); } read(); } } Type typeObject = Type.getType(typeNumber, charset, collation, length, scale); if (token.tokenType == Tokens.ARRAY) { if (typeObject.isLobType()) { throw unexpectedToken(); } read(); int maxCardinality = ArrayType.defaultArrayCardinality; if (token.tokenType == Tokens.LEFTBRACKET) { read(); maxCardinality = readInteger(); if (scale < 0) { throw Error.error(ErrorCode.X_42592); } readThis(Tokens.RIGHTBRACKET); } typeObject = new ArrayType(typeObject, maxCardinality); } return typeObject; } void readSimpleColumnNames(OrderedHashSet columns, RangeVariable rangeVar, boolean withPrefix) { while (true) { ColumnSchema col = readSimpleColumnName(rangeVar, withPrefix); if (!columns.add(col.getName().name)) { throw Error.error(ErrorCode.X_42579, col.getName().name); } if (readIfThis(Tokens.COMMA)) { continue; } if (token.tokenType == Tokens.CLOSEBRACKET) { break; } throw unexpectedToken(); } } void readTargetSpecificationList(OrderedHashSet targets, RangeVariable[] rangeVars, LongDeque colIndexList) { while (true) { Expression target = XreadTargetSpecification(rangeVars, colIndexList); if (!targets.add(target)) { ColumnSchema col = target.getColumn(); throw Error.error(ErrorCode.X_42579, col.getName().name); } if (readIfThis(Tokens.COMMA)) { continue; } if (token.tokenType == Tokens.CLOSEBRACKET) { break; } if (token.tokenType == Tokens.FROM) { break; } throw unexpectedToken(); } } /** * Process a bracketed column list as used in the declaration of SQL * CONSTRAINTS and return an array containing the indexes of the columns * within the table. * * @param table table that contains the columns * @param ascOrDesc boolean * @return array of column indexes */ int[] readColumnList(Table table, boolean ascOrDesc) { OrderedHashSet set = readColumnNames(ascOrDesc); return table.getColumnIndexes(set); } void readSimpleColumnNames(OrderedHashSet columns, Table table, boolean withPrefix) { while (true) { ColumnSchema col = readSimpleColumnName(table, withPrefix); if (!columns.add(col.getName().name)) { throw Error.error(ErrorCode.X_42577, col.getName().name); } if (readIfThis(Tokens.COMMA)) { continue; } if (token.tokenType == Tokens.CLOSEBRACKET) { break; } throw unexpectedToken(); } } HsqlName[] readColumnNames(HsqlName tableName) { BitMap quotedFlags = new BitMap(32); OrderedHashSet set = readColumnNames(quotedFlags, false); HsqlName[] colList = new HsqlName[set.size()]; for (int i = 0; i < colList.length; i++) { String name = (String) set.get(i); boolean quoted = quotedFlags.isSet(i); colList[i] = database.nameManager.newHsqlName(tableName.schema, name, quoted, SchemaObject.COLUMN, tableName); } return colList; } OrderedHashSet readColumnNames(boolean readAscDesc) { return readColumnNames(null, readAscDesc); } OrderedHashSet readColumnNames(BitMap quotedFlags, boolean readAscDesc) { readThis(Tokens.OPENBRACKET); OrderedHashSet set = new OrderedHashSet(); readColumnNameList(set, quotedFlags, readAscDesc); readThis(Tokens.CLOSEBRACKET); return set; } void readColumnNameList(OrderedHashSet set, BitMap quotedFlags, boolean readAscDesc) { int i = 0; while (true) { if (session.isProcessingScript) { // for old scripts if (!isSimpleName()) { token.isDelimitedIdentifier = true; } } else { checkIsSimpleName(); } if (!set.add(token.tokenString)) { throw Error.error(ErrorCode.X_42577, token.tokenString); } if (quotedFlags != null && isDelimitedIdentifier()) { quotedFlags.set(i); } read(); i++; if (readAscDesc) { if (token.tokenType == Tokens.ASC || token.tokenType == Tokens.DESC) { read(); } } if (readIfThis(Tokens.COMMA)) { continue; } break; } } SimpleName[] readColumnNameList(OrderedHashSet set) { BitMap columnNameQuoted = new BitMap(32); readThis(Tokens.OPENBRACKET); readColumnNameList(set, columnNameQuoted, false); readThis(Tokens.CLOSEBRACKET); SimpleName[] columnNameList = new SimpleName[set.size()]; for (int i = 0; i < set.size(); i++) { SimpleName name = HsqlNameManager.getSimpleName((String) set.get(i), columnNameQuoted.isSet(i)); columnNameList[i] = name; } return columnNameList; } int XreadUnionType() { int unionType = QueryExpression.NOUNION; switch (token.tokenType) { case Tokens.UNION : read(); unionType = QueryExpression.UNION; if (token.tokenType == Tokens.ALL) { unionType = QueryExpression.UNION_ALL; read(); } else if (token.tokenType == Tokens.DISTINCT) { read(); } break; case Tokens.INTERSECT : read(); unionType = QueryExpression.INTERSECT; if (token.tokenType == Tokens.ALL) { unionType = QueryExpression.INTERSECT_ALL; read(); } else if (token.tokenType == Tokens.DISTINCT) { read(); } break; case Tokens.EXCEPT : case Tokens.MINUS_EXCEPT : read(); unionType = QueryExpression.EXCEPT; if (token.tokenType == Tokens.ALL) { unionType = QueryExpression.EXCEPT_ALL; read(); } else if (token.tokenType == Tokens.DISTINCT) { read(); } break; default : break; } return unionType; } void XreadUnionCorrespondingClause(QueryExpression queryExpression) { if (token.tokenType == Tokens.CORRESPONDING) { read(); queryExpression.setUnionCorresoponding(); if (token.tokenType == Tokens.BY) { read(); OrderedHashSet names = readColumnNames(false); queryExpression.setUnionCorrespondingColumns(names); } } } QueryExpression XreadQueryExpression() { if (token.tokenType == Tokens.WITH) { read(); boolean recursive = readIfThis(Tokens.RECURSIVE); compileContext.initSubqueryNames(); while (true) { checkIsSimpleName(); HsqlName[] nameList = null; HsqlName queryName = database.nameManager.newHsqlName(token.tokenString, isDelimitedIdentifier(), SchemaObject.SUBQUERY); queryName.schema = SqlInvariants.SYSTEM_SUBQUERY_HSQLNAME; read(); if (token.tokenType == Tokens.OPENBRACKET) { nameList = readColumnNames(queryName); } else if (recursive) { super.unexpectedTokenRequire(Tokens.T_OPENBRACKET); } readThis(Tokens.AS); readThis(Tokens.OPENBRACKET); TableDerived td;; td = XreadTableNamedSubqueryBody(queryName, nameList, recursive ? OpTypes.RECURSIVE_SUBQUERY : OpTypes.TABLE_SUBQUERY); readThis(Tokens.CLOSEBRACKET); if (token.tokenType == Tokens.CYCLE) { throw super.unsupportedFeature(); } if (recursive && token.tokenType == Tokens.CYCLE) { Table table = td; int[] cycleColumnList = readColumnList(table, false); HsqlName name; readThis(Tokens.SET); checkIsSimpleName(); name = database.nameManager.newColumnHsqlName( table.getName(), token.tokenString, token.isDelimitedIdentifier); ColumnSchema cycleMarkColumn = new ColumnSchema(name, null, true, false, null); if (table.getColumnIndex(name.name) != -1) { throw Error.error(ErrorCode.X_42578, token.tokenString); } read(); readThis(Tokens.TO); String cycleMarkValue = readQuotedString(); if (cycleMarkValue.length() != 1) { throw unexpectedToken(cycleMarkValue); } readThis(Tokens.DEFAULT); String noncycleMarkValue = readQuotedString(); if (noncycleMarkValue.length() != 1) { throw unexpectedToken(noncycleMarkValue); } if (cycleMarkValue.equals(noncycleMarkValue)) { throw unexpectedToken(cycleMarkValue); } readThis(Tokens.USING); checkIsSimpleName(); checkIsSimpleName(); name = database.nameManager.newColumnHsqlName( table.getName(), token.tokenString, token.isDelimitedIdentifier); if (table.getColumnIndex(name.name) != -1) { throw Error.error(ErrorCode.X_42578, token.tokenString); } read(); ColumnSchema pathColumn = new ColumnSchema(name, null, true, false, null); } compileContext.registerSubquery(queryName.name, td); if (token.tokenType == Tokens.COMMA) { read(); continue; } break; } } QueryExpression queryExpression = XreadQueryExpressionBody(); SortAndSlice sortAndSlice = XreadOrderByExpression(); if (queryExpression.sortAndSlice == null) { queryExpression.addSortAndSlice(sortAndSlice); } else { if (queryExpression.sortAndSlice.hasLimit()) { if (sortAndSlice.hasLimit()) { throw Error.error(ErrorCode.X_42549); } for (int i = 0; i < sortAndSlice.exprList.size(); i++) { Expression e = (Expression) sortAndSlice.exprList.get(i); queryExpression.sortAndSlice.addOrderExpression(e); } } else { queryExpression.addSortAndSlice(sortAndSlice); } } compileContext.unregisterSubqueries(); return queryExpression; } QueryExpression XreadQueryExpressionBody() { QueryExpression queryExpression = XreadQueryTerm(); while (true) { switch (token.tokenType) { case Tokens.UNION : case Tokens.EXCEPT : case Tokens.MINUS_EXCEPT : { queryExpression = XreadSetOperation(queryExpression); break; } default : { return queryExpression; } } } } QueryExpression XreadQueryTerm() { QueryExpression queryExpression = XreadQueryPrimary(); while (true) { if (token.tokenType == Tokens.INTERSECT) { queryExpression = XreadSetOperation(queryExpression); } else { return queryExpression; } } } private QueryExpression XreadSetOperation( QueryExpression queryExpression) { queryExpression = new QueryExpression(compileContext, queryExpression); int unionType = XreadUnionType(); XreadUnionCorrespondingClause(queryExpression); QueryExpression rightQueryExpression = XreadQueryTerm(); queryExpression.addUnion(rightQueryExpression, unionType); return queryExpression; } QueryExpression XreadQueryPrimary() { switch (token.tokenType) { case Tokens.TABLE : case Tokens.VALUES : case Tokens.SELECT : { QuerySpecification select = XreadSimpleTable(); return select; } case Tokens.OPENBRACKET : { read(); QueryExpression queryExpression = XreadQueryExpressionBody(); SortAndSlice sortAndSlice = XreadOrderByExpression(); readThis(Tokens.CLOSEBRACKET); if (queryExpression.sortAndSlice == null) { queryExpression.addSortAndSlice(sortAndSlice); } else { if (queryExpression.sortAndSlice.hasLimit()) { if (sortAndSlice.hasLimit()) { throw Error.error(ErrorCode.X_42549); } for (int i = 0; i < sortAndSlice.exprList.size(); i++) { Expression e = (Expression) sortAndSlice.exprList.get(i); queryExpression.sortAndSlice.addOrderExpression(e); } } else { queryExpression.addSortAndSlice(sortAndSlice); } } return queryExpression; } default : { throw unexpectedToken(); } } } QuerySpecification XreadSimpleTable() { QuerySpecification select; switch (token.tokenType) { case Tokens.TABLE : { read(); Table table = readTableName(); if (table.isView()) { table = ((View) table).newDerivedTable(session); } select = new QuerySpecification(session, table, compileContext, false); break; } case Tokens.VALUES : { read(); TableDerived td = XreadRowValueExpressionList(); select = new QuerySpecification(session, td, compileContext, true); break; } case Tokens.SELECT : { select = XreadQuerySpecification(); break; } default : { throw unexpectedToken(); } } return select; } QuerySpecification XreadQuerySpecification() { QuerySpecification select = XreadSelect(); if (!select.isValueList) { XreadTableExpression(select); } return select; } void XreadTableExpression(QuerySpecification select) { XreadFromClause(select); readWhereGroupHaving(select); } QuerySpecification XreadSelect() { QuerySpecification select = new QuerySpecification(compileContext); readThis(Tokens.SELECT); if (token.tokenType == Tokens.TOP || token.tokenType == Tokens.LIMIT) { SortAndSlice sortAndSlice = XreadTopOrLimit(); if (sortAndSlice != null) { select.addSortAndSlice(sortAndSlice); } } if (token.tokenType == Tokens.DISTINCT) { select.isDistinctSelect = true; read(); } else if (token.tokenType == Tokens.ALL) { read(); } while (true) { Expression e = XreadValueExpression(); if (token.tokenType == Tokens.AS) { read(); checkIsNonCoreReservedIdentifier(); } if (isNonCoreReservedIdentifier()) { e.setAlias(HsqlNameManager.getSimpleName(token.tokenString, isDelimitedIdentifier())); read(); } select.addSelectColumnExpression(e); if (token.tokenType == Tokens.FROM) { break; } if (token.tokenType == Tokens.INTO) { break; } if (readIfThis(Tokens.COMMA)) { continue; } if (token.tokenType == Tokens.CLOSEBRACKET || token.tokenType == Tokens.X_ENDPARSE) { if (database.sqlSyntaxMss || database.sqlSyntaxMys || database.sqlSyntaxPgs) { Expression[] exprList = new Expression[select.exprColumnList.size()]; select.exprColumnList.toArray(exprList); Expression valueList = new Expression(OpTypes.VALUELIST, exprList); for (int i = 0; i < valueList.nodes.length; i++) { if (valueList.nodes[i].opType != OpTypes.ROW) { valueList.nodes[i] = new Expression(OpTypes.ROW, new Expression[]{ valueList.nodes[i] }); } } compileContext.incrementDepth(); TableDerived td = prepareSubqueryTable(valueList, OpTypes.VALUELIST); select = new QuerySpecification(session, td, compileContext, true); compileContext.decrementDepth(); return select; } } throw unexpectedToken(); } return select; } void XreadFromClause(QuerySpecification select) { readThis(Tokens.FROM); while (true) { XreadTableReference(select); if (readIfThis(Tokens.COMMA)) { // set last range as boundary continue; } break; } } void XreadTableReference(QuerySpecification select) { boolean natural = false; RangeVariable range = readTableOrSubquery(); select.addRangeVariable(session, range); while (true) { int type; boolean left = false; boolean right = false; boolean end = false; type = token.tokenType; switch (token.tokenType) { case Tokens.NATURAL : if (natural) { throw unexpectedToken(); } read(); natural = true; continue; case Tokens.INNER : read(); readThis(Tokens.JOIN); break; case Tokens.CROSS : if (natural) { throw unexpectedToken(); } read(); readThis(Tokens.JOIN); break; case Tokens.UNION : if (natural) { throw unexpectedToken(); } int position = getPosition(); read(); if (token.tokenType == Tokens.JOIN) { read(); break; } else { rewind(position); end = true; break; } case Tokens.LEFT : read(); readIfThis(Tokens.OUTER); readThis(Tokens.JOIN); left = true; break; case Tokens.RIGHT : read(); readIfThis(Tokens.OUTER); readThis(Tokens.JOIN); right = true; break; case Tokens.FULL : read(); readIfThis(Tokens.OUTER); readThis(Tokens.JOIN); left = true; right = true; break; case Tokens.JOIN : read(); type = Tokens.INNER; break; case Tokens.COMMA : default : if (natural) { throw unexpectedToken(); } end = true; break; } if (end) { break; } range = readTableOrSubquery(); Expression condition = null; switch (type) { case Tokens.CROSS : select.addRangeVariable(session, range); break; case Tokens.UNION : condition = Expression.EXPR_FALSE; range.addJoinCondition(condition); range.setJoinType(true, true); select.addRangeVariable(session, range); break; case Tokens.LEFT : case Tokens.RIGHT : case Tokens.INNER : case Tokens.FULL : { range.setJoinType(left, right); if (natural) { OrderedHashSet columns = range.getUniqueColumnNameSet(); condition = select.getEquiJoinExpressions(columns, range, false); range.addJoinCondition(condition); select.addRangeVariable(session, range); } else if (token.tokenType == Tokens.USING) { read(); OrderedHashSet columns = new OrderedHashSet(); readThis(Tokens.OPENBRACKET); readSimpleColumnNames(columns, range, false); readThis(Tokens.CLOSEBRACKET); condition = select.getEquiJoinExpressions(columns, range, true); range.addJoinCondition(condition); select.addRangeVariable(session, range); } else if (token.tokenType == Tokens.ON) { read(); condition = XreadBooleanValueExpression(); range.addJoinCondition(condition); select.addRangeVariable(session, range); } else { throw unexpectedToken(); } break; } } natural = false; } } Expression getRowExpression(OrderedHashSet columnNames) { Expression[] elements = new Expression[columnNames.size()]; for (int i = 0; i < elements.length; i++) { String name = (String) columnNames.get(i); elements[i] = new ExpressionColumn(null, null, name); } return new Expression(OpTypes.ROW, elements); } void readWhereGroupHaving(QuerySpecification select) { // where if (token.tokenType == Tokens.WHERE) { read(); Expression e = XreadBooleanValueExpression(); select.addQueryCondition(e); } // group by if (token.tokenType == Tokens.GROUP) { read(); readThis(Tokens.BY); while (true) { Expression e = XreadValueExpression(); select.addGroupByColumnExpression(e); if (token.tokenType == Tokens.COMMA) { read(); continue; } break; } } // having if (token.tokenType == Tokens.HAVING) { read(); Expression e = XreadBooleanValueExpression(); select.addHavingExpression(e); } } SortAndSlice XreadOrderByExpression() { SortAndSlice sortAndSlice = null; if (token.tokenType == Tokens.ORDER) { read(); readThis(Tokens.BY); sortAndSlice = XreadOrderBy(); } if (token.tokenType == Tokens.LIMIT || token.tokenType == Tokens.FETCH || token.tokenType == Tokens.OFFSET) { if (sortAndSlice == null) { sortAndSlice = new SortAndSlice(); } XreadLimit(sortAndSlice); } return sortAndSlice == null ? SortAndSlice.noSort : sortAndSlice; } private SortAndSlice XreadTopOrLimit() { Expression e1 = null; Expression e2 = null; if (token.tokenType == Tokens.LIMIT) { int position = getPosition(); read(); e1 = XreadSimpleValueSpecificationOrNull(); if (e1 == null) { rewind(position); return null; } // optional comma readIfThis(Tokens.COMMA); e2 = XreadSimpleValueSpecificationOrNull(); if (e2 == null) { throw Error.error(ErrorCode.X_42563, ErrorCode.M_INVALID_LIMIT); } } else if (token.tokenType == Tokens.TOP) { int position = getPosition(); read(); e2 = XreadSimpleValueSpecificationOrNull(); if (e2 == null) { rewind(position); return null; } e1 = new ExpressionValue(ValuePool.INTEGER_0, Type.SQL_INTEGER); } boolean valid = true; if (e1.isUnresolvedParam()) { e1.setDataType(session, Type.SQL_INTEGER); } else if (e1.opType == OpTypes.VALUE) { valid = (e1.getDataType().typeCode == Types.SQL_INTEGER && ((Integer) e1.getValue(null)).intValue() >= 0); } else { throw Error.error(ErrorCode.X_42563, ErrorCode.M_INVALID_LIMIT); } if (e2.isUnresolvedParam()) { e2.setDataType(session, Type.SQL_INTEGER); } else if (e2.opType == OpTypes.VALUE) { valid &= (e2.getDataType().typeCode == Types.SQL_INTEGER && ((Integer) e2.getValue(null)).intValue() >= 0); } else { throw Error.error(ErrorCode.X_42563, ErrorCode.M_INVALID_LIMIT); } if (valid) { SortAndSlice sortAndSlice = new SortAndSlice(); sortAndSlice.addLimitCondition(new ExpressionOp(OpTypes.LIMIT, e1, e2)); return sortAndSlice; } throw Error.error(ErrorCode.X_42563, ErrorCode.M_INVALID_LIMIT); } private void XreadLimit(SortAndSlice sortAndSlice) { Expression e1 = null; Expression e2 = null; if (token.tokenType == Tokens.OFFSET) { read(); e1 = XreadSimpleValueSpecificationOrNull(); if (e1 == null) { throw Error.error(ErrorCode.X_42563, ErrorCode.M_INVALID_LIMIT); } if (token.tokenType == Tokens.ROW || token.tokenType == Tokens.ROWS) { read(); } } if (token.tokenType == Tokens.LIMIT) { read(); e2 = XreadSimpleValueSpecificationOrNull(); if (e2 == null) { throw Error.error(ErrorCode.X_42563, ErrorCode.M_INVALID_LIMIT); } if (e1 == null) { if (token.tokenType == Tokens.COMMA) { read(); e1 = e2; e2 = XreadSimpleValueSpecificationOrNull(); } else if (token.tokenType == Tokens.OFFSET) { read(); e1 = XreadSimpleValueSpecificationOrNull(); } } if (database.sqlSyntaxPgs || database.sqlSyntaxMys) { sortAndSlice.setZeroLimit(); } } else if (token.tokenType == Tokens.FETCH) { read(); if (token.tokenType == Tokens.FIRST || token.tokenType == Tokens.NEXT) { read(); } e2 = XreadSimpleValueSpecificationOrNull(); if (e2 == null) { e2 = new ExpressionValue(ValuePool.INTEGER_1, Type.SQL_INTEGER); } if (token.tokenType == Tokens.ROW || token.tokenType == Tokens.ROWS) { read(); } readThis(Tokens.ONLY); sortAndSlice.setStrictLimit(); } if (sortAndSlice.hasOrder() && token.tokenType == Tokens.USING) { read(); readThis(Tokens.INDEX); sortAndSlice.setUsingIndex(); } if (e1 == null) { e1 = new ExpressionValue(ValuePool.INTEGER_0, Type.SQL_INTEGER); } boolean valid = true; if (e1.isUnresolvedParam()) { e1.setDataType(session, Type.SQL_INTEGER); } if (e2 != null) { if (e2.isUnresolvedParam()) { e2.setDataType(session, Type.SQL_INTEGER); } } if (valid) { sortAndSlice.addLimitCondition(new ExpressionOp(OpTypes.LIMIT, e1, e2)); return; } throw Error.error(ErrorCode.X_42563, ErrorCode.M_INVALID_LIMIT); } private SortAndSlice XreadOrderBy() { SortAndSlice sortAndSlice = new SortAndSlice(); while (true) { Expression e = XreadValueExpression(); ExpressionOrderBy o = new ExpressionOrderBy(e); if (token.tokenType == Tokens.DESC) { o.setDescending(); read(); } else if (token.tokenType == Tokens.ASC) { read(); } if (!database.sqlNullsFirst) { o.setNullsLast(true); } if (token.tokenType == Tokens.NULLS) { read(); if (token.tokenType == Tokens.FIRST) { read(); o.setNullsLast(false); } else if (token.tokenType == Tokens.LAST) { read(); o.setNullsLast(true); } else { throw unexpectedToken(); } } sortAndSlice.addOrderExpression(o); if (token.tokenType == Tokens.COMMA) { read(); continue; } break; } return sortAndSlice; } protected RangeVariable readRangeVariableForDataChange(int operation) { Table table = readTableName(); SimpleName alias = null; if (operation != StatementTypes.TRUNCATE) { if (token.tokenType == Tokens.AS) { read(); checkIsNonCoreReservedIdentifier(); } if (isNonCoreReservedIdentifier()) { alias = HsqlNameManager.getSimpleName(token.tokenString, isDelimitedIdentifier()); read(); } } if (table.isView) { switch (operation) { case StatementTypes.MERGE : if (table.isTriggerUpdatable() && table.isTriggerInsertable()) { break; } if (table.isTriggerUpdatable() || table.isTriggerInsertable()) { // all or nothing } else if (table.isUpdatable() && table.isInsertable()) { break; } throw Error.error(ErrorCode.X_42545); case StatementTypes.UPDATE_WHERE : if (table.isTriggerUpdatable()) { break; } if (table.isUpdatable()) { break; } throw Error.error(ErrorCode.X_42545); case StatementTypes.DELETE_WHERE : if (table.isTriggerDeletable()) { break; } if (table.isUpdatable()) { break; } throw Error.error(ErrorCode.X_42545); case StatementTypes.INSERT : if (table.isTriggerInsertable()) { break; } if (table.isInsertable()) { break; } if (session.isProcessingScript) { break; } throw Error.error(ErrorCode.X_42545); case StatementTypes.TRUNCATE : throw Error.error(ErrorCode.X_42545); } table = ((View) table).newDerivedTable(session); } RangeVariable range = new RangeVariable(table, alias, null, null, compileContext); return range; } protected Table readNamedSubqueryOrNull() { if (!isSimpleName()) { return null; } TableDerived td = compileContext.getNamedSubQuery(token.tokenString); if (td == null) { return null; } read(); if (td.isRecompiled()) { td = td.newDerivedTable(session); } else { // after first use of named subqueries td.canRecompile = true; } return td; } /** * Creates a RangeVariable from the parse context.

*/ protected RangeVariable readTableOrSubquery() { Table table = null; SimpleName alias = null; SimpleName[] columnNameList = null; OrderedHashSet columnList = null; boolean joinedTable = false; boolean isLateral = false; switch (token.tokenType) { case Tokens.OPENBRACKET : { table = XreadTableSubqueryOrNull(false); if (table == null) { table = XreadJoinedTableAsSubqueryOrNull(); if (table == null) { table = XreadTableSubqueryOrNull(true); break; } joinedTable = true; } break; } case Tokens.UNNEST : { Expression e = XreadCollectionDerivedTable(OpTypes.TABLE_SUBQUERY); table = e.getTable(); isLateral = true; break; } case Tokens.LATERAL : { Expression e = XreadLateralDerivedTable(); table = e.getTable(); isLateral = true; break; } case Tokens.TABLE : { Expression e = XreadTableFunctionDerivedTable(); table = e.getTable(); break; } default : { table = readNamedSubqueryOrNull(); if (table == null) { table = readTableName(); } if (table.isView()) { table = ((View) table).newDerivedTable(session); } } } boolean hasAs = false; if (token.tokenType == Tokens.AS) { read(); checkIsNonCoreReservedIdentifier(); hasAs = true; } if (isNonCoreReservedIdentifier()) { boolean limit = token.tokenType == Tokens.LIMIT || token.tokenType == Tokens.OFFSET || token.tokenType == Tokens.FETCH; boolean minus = token.tokenType == Tokens.MINUS_EXCEPT; int position = getPosition(); alias = HsqlNameManager.getSimpleName(token.tokenString, isDelimitedIdentifier()); read(); if (token.tokenType == Tokens.OPENBRACKET) { columnList = new OrderedHashSet(); columnNameList = readColumnNameList(columnList); } else if (!hasAs && limit) { if (token.tokenType == Tokens.COLON || token.tokenType == Tokens.QUESTION || token.tokenType == Tokens.X_VALUE) { alias = null; rewind(position); } } else if (!hasAs && minus) { rewind(position); } } RangeVariable range; if (joinedTable) { range = new RangeVariableJoined(table, alias, columnList, columnNameList, compileContext); } else { range = new RangeVariable(table, alias, columnList, columnNameList, compileContext); } if (isLateral) { range.isLateral = true; } return range; } private Expression readAggregate() { int tokenT = token.tokenType; Expression e; read(); readThis(Tokens.OPENBRACKET); e = readAggregateExpression(tokenT); readThis(Tokens.CLOSEBRACKET); readFilterClause(e); return e; } private void readFilterClause(Expression e) { int position = getPosition(); if (token.tokenType == Tokens.FILTER) { read(); if (token.tokenType != Tokens.OPENBRACKET) { rewind(position); return; } readThis(Tokens.OPENBRACKET); readThis(Tokens.WHERE); Expression condition = XreadBooleanValueExpression(); e.setCondition(condition); readThis(Tokens.CLOSEBRACKET); } } private Expression readAggregateExpression(int tokenT) { int type = ParserDQL.getExpressionType(tokenT); boolean distinct = false; boolean all = false; SortAndSlice sort = null; String separator = null; if (token.tokenType == Tokens.DISTINCT) { distinct = true; read(); } else if (token.tokenType == Tokens.ALL) { all = true; read(); } int position = getPosition(); Expression e = XreadValueExpression(); switch (type) { case OpTypes.COUNT : if (e.getType() == OpTypes.MULTICOLUMN) { if (((ExpressionColumn) e).tableName != null) { throw unexpectedToken(); } if (all || distinct) { throw unexpectedToken(); } e.opType = OpTypes.ASTERISK; break; } else { if (token.tokenType == Tokens.COMMA) { rewind(position); e = XreadRowElementList(false); } break; } case OpTypes.STDDEV_POP : case OpTypes.STDDEV_SAMP : case OpTypes.VAR_POP : case OpTypes.VAR_SAMP : if (all || distinct) { throw unexpectedToken(all ? Tokens.T_ALL : Tokens.T_DISTINCT); } break; case OpTypes.ARRAY_AGG : case OpTypes.GROUP_CONCAT : { if (token.tokenType == Tokens.ORDER) { read(); readThis(Tokens.BY); sort = XreadOrderBy(); } if (type == OpTypes.GROUP_CONCAT) { if (token.tokenType == Tokens.SEPARATOR) { read(); super.checkIsValue(Types.SQL_CHAR); separator = (String) token.tokenValue; read(); } } return new ExpressionArrayAggregate(type, distinct, e, sort, separator); } case OpTypes.MEDIAN : { return new ExpressionArrayAggregate(type, distinct, e, sort, separator); } default : if (e.getType() == OpTypes.ASTERISK) { throw unexpectedToken(); } } Expression aggregateExp = new ExpressionAggregate(type, distinct, e); return aggregateExp; } //-------------------------------------- // returns null // := | Expression XreadValueSpecificationOrNull() { Expression e = null; boolean minus = false; switch (token.tokenType) { case Tokens.PLUS : read(); break; case Tokens.MINUS : read(); minus = true; break; } e = XreadUnsignedValueSpecificationOrNull(); if (e == null) { return null; } if (minus) { e = new ExpressionArithmetic(OpTypes.NEGATE, e); } return e; } // returns null // | Expression XreadUnsignedValueSpecificationOrNull() { Expression e; switch (token.tokenType) { case Tokens.TRUE : read(); return Expression.EXPR_TRUE; case Tokens.FALSE : read(); return Expression.EXPR_FALSE; case Tokens.DEFAULT : if (compileContext.contextuallyTypedExpression) { read(); e = new ExpressionColumn(OpTypes.DEFAULT); return e; } break; case Tokens.NULL : e = new ExpressionValue(null, null); read(); return e; case Tokens.X_VALUE : e = new ExpressionValue(token.tokenValue, token.dataType); read(); return e; case Tokens.X_DELIMITED_IDENTIFIER : case Tokens.X_IDENTIFIER : if (!token.isHostParameter) { return null; } return null; case Tokens.COLON : read(); if (token.tokenType == Tokens.X_DELIMITED_IDENTIFIER || token.tokenType == Tokens.X_IDENTIFIER) {} else { throw unexpectedToken(Tokens.T_COLON); } // fall through case Tokens.QUESTION : ExpressionColumn p = new ExpressionColumn(OpTypes.DYNAMIC_PARAM); compileContext.addParameter(p, getPosition()); read(); return p; case Tokens.COLLATION : return XreadCurrentCollationSpec(); case Tokens.VALUE : case Tokens.CURRENT_CATALOG : case Tokens.CURRENT_DEFAULT_TRANSFORM_GROUP : case Tokens.CURRENT_PATH : case Tokens.CURRENT_ROLE : case Tokens.CURRENT_SCHEMA : case Tokens.CURRENT_TRANSFORM_GROUP_FOR_TYPE : case Tokens.CURRENT_USER : case Tokens.SESSION_USER : case Tokens.SYSTEM_USER : case Tokens.USER : FunctionSQL function = FunctionSQL.newSQLFunction(token.tokenString, compileContext); if (function == null) { return null; } return readSQLFunction(function); // read SQL parameter reference } return null; } // | | Expression XreadSimpleValueSpecificationOrNull() { Expression e; switch (token.tokenType) { case Tokens.X_VALUE : e = new ExpressionValue(token.tokenValue, token.dataType); read(); return e; case Tokens.COLON : read(); if (token.tokenType == Tokens.X_DELIMITED_IDENTIFIER || token.tokenType == Tokens.X_IDENTIFIER) {} else { throw unexpectedToken(Tokens.T_COLON); } // fall through case Tokens.QUESTION : ExpressionColumn p = new ExpressionColumn(OpTypes.DYNAMIC_PARAM); compileContext.addParameter(p, getPosition()); read(); return p; case Tokens.X_IDENTIFIER : case Tokens.X_DELIMITED_IDENTIFIER : checkValidCatalogName(token.namePrePrePrefix); e = new ExpressionColumn(token.namePrePrefix, token.namePrefix, token.tokenString); read(); return e; default : return null; } } // combined and // exclusively called // needed for predicate Expression XreadAllTypesValueExpressionPrimary(boolean boole) { Expression e = null; switch (token.tokenType) { case Tokens.EXISTS : case Tokens.UNIQUE : if (boole) { return XreadPredicate(); } break; case Tokens.ROW : if (boole) { break; } read(); readThis(Tokens.OPENBRACKET); e = XreadRowElementList(true); readThis(Tokens.CLOSEBRACKET); break; default : e = XreadSimpleValueExpressionPrimary(); if (e != null) { e = XreadArrayElementReference(e); } } if (e == null) { boolean isRow = false; if (token.tokenType == Tokens.ROW) { read(); checkIsThis(Tokens.OPENBRACKET); isRow = true; } if (token.tokenType == Tokens.OPENBRACKET) { read(); // ignore isRow e = XreadRowElementList(true); readThis(Tokens.CLOSEBRACKET); } } if (boole && e != null) { e = XreadPredicateRightPart(e); } return e; } // doesn't return null // ::= // | Expression XreadValueExpressionPrimary() { Expression e; e = XreadSimpleValueExpressionPrimary(); if (e != null) { e = XreadArrayElementReference(e); return e; } if (token.tokenType == Tokens.OPENBRACKET) { read(); e = XreadValueExpression(); readThis(Tokens.CLOSEBRACKET); } else { return null; } return e; } // returns null // :== this // :== this | Expression XreadSimpleValueExpressionPrimary() { Expression e; e = XreadUnsignedValueSpecificationOrNull(); if (e != null) { return e; } int position = getPosition(); switch (token.tokenType) { case Tokens.OPENBRACKET : read(); int subqueryPosition = getPosition(); int brackets = readOpenBrackets(); switch (token.tokenType) { case Tokens.TABLE : case Tokens.VALUES : case Tokens.SELECT : TableDerived td = null; rewind(subqueryPosition); try { td = XreadSubqueryTableBody( OpTypes.SCALAR_SUBQUERY); readThis(Tokens.CLOSEBRACKET); } catch (HsqlException ex) { ex.setLevel(compileContext.subqueryDepth); if (lastError == null || lastError.getLevel() < ex.getLevel()) { lastError = ex; } rewind(position); return null; } if (td.queryExpression.isSingleColumn()) { e = new Expression(OpTypes.SCALAR_SUBQUERY, td); } else { e = new Expression(OpTypes.ROW_SUBQUERY, td); } if (readCloseBrackets(brackets) != brackets) { throw unexpectedToken(); } return e; default : rewind(position); return null; } case Tokens.ASTERISK : e = new ExpressionColumn(token.namePrePrefix, token.namePrefix); getRecordedToken().setExpression(e); read(); return e; case Tokens.LEAST : { e = readLeastExpressionOrNull(); if (e != null) { return e; } break; } case Tokens.GREATEST : { e = readGreatestExpressionOrNull(); if (e != null) { return e; } break; } case Tokens.DECODE : { e = readDecodeExpressionOrNull(); if (e != null) { return e; } break; } case Tokens.CONCAT_WORD : { e = readConcatExpressionOrNull(); if (e != null) { return e; } break; } case Tokens.CASEWHEN : { e = readCaseWhenExpressionOrNull(); if (e != null) { return e; } break; } case Tokens.CASE : return readCaseExpression(); case Tokens.NULLIF : return readNullIfExpression(); case Tokens.COALESCE : return readCoalesceExpression(); case Tokens.IFNULL : case Tokens.ISNULL : { e = readIfNullExpressionOrNull(); if (e != null) { return e; } break; } case Tokens.NVL2 : { e = readIfNull2ExpressionOrNull(); if (e != null) { return e; } break; } case Tokens.CAST : case Tokens.CONVERT : { e = readCastExpressionOrNull(); if (e != null) { return e; } break; } case Tokens.DATE : case Tokens.TIME : case Tokens.TIMESTAMP : case Tokens.INTERVAL : e = readDateTimeIntervalLiteral(session); if (e != null) { return e; } break; case Tokens.ARRAY : return readCollection(OpTypes.ARRAY); case Tokens.ANY : case Tokens.SOME : case Tokens.EVERY : case Tokens.COUNT : case Tokens.MAX : case Tokens.MIN : case Tokens.SUM : case Tokens.AVG : case Tokens.STDDEV_POP : case Tokens.STDDEV_SAMP : case Tokens.VAR_POP : case Tokens.VAR_SAMP : case Tokens.GROUP_CONCAT : case Tokens.ARRAY_AGG : case Tokens.MEDIAN : return readAggregate(); case Tokens.NEXT : { e = readSequenceExpressionOrNull(OpTypes.SEQUENCE); if (e != null) { return e; } break; } case Tokens.CURRENT : { e = readSequenceExpressionOrNull(OpTypes.SEQUENCE_CURRENT); if (e != null) { return e; } break; } case Tokens.CURRVAL : { if (database.sqlSyntaxPgs) { read(); readThis(Tokens.OPENBRACKET); String spec = readQuotedString(); Scanner scanner = session.getScanner(); scanner.reset(spec); scanner.scanNext(); String schemaName = session.getSchemaName(scanner.token.namePrefix); NumberSequence sequence = database.schemaManager.getSequence( scanner.token.tokenString, schemaName, true); e = new ExpressionColumn(sequence, OpTypes.SEQUENCE_CURRENT); readThis(Tokens.CLOSEBRACKET); return e; } break; } case Tokens.LASTVAL : { if (database.sqlSyntaxPgs) { read(); readThis(Tokens.OPENBRACKET); readThis(Tokens.CLOSEBRACKET); return FunctionCustom.newCustomFunction(Tokens.T_IDENTITY, Tokens.IDENTITY); } break; } case Tokens.NEXTVAL : { if (database.sqlSyntaxPgs) { return readNextvalFunction(); } break; } case Tokens.ROW_NUMBER : { read(); if (token.tokenType == Tokens.OPENBRACKET) { read(); readThis(Tokens.CLOSEBRACKET); readThis(Tokens.OVER); readThis(Tokens.OPENBRACKET); readThis(Tokens.CLOSEBRACKET); } else { rewind(position); break; } return new ExpressionColumn(OpTypes.ROWNUM); } case Tokens.ROWNUM : { read(); if (token.tokenType == Tokens.OPENBRACKET) { read(); if (token.tokenType == Tokens.CLOSEBRACKET) { read(); } else { rewind(position); break; } } else if (!database.sqlSyntaxOra && !database.sqlSyntaxDb2) { rewind(position); break; } return new ExpressionColumn(OpTypes.ROWNUM); } case Tokens.LEFT : case Tokens.RIGHT : // CLI function names break; case Tokens.TABLE : { read(); readThis(Tokens.OPENBRACKET); TableDerived td = XreadSubqueryTableBody(OpTypes.TABLE_SUBQUERY); readThis(Tokens.CLOSEBRACKET); return new Expression(OpTypes.TABLE_SUBQUERY, td); } default : if (isCoreReservedKey()) { throw unexpectedToken(); } } e = readColumnOrFunctionExpression(); if (e.isAggregate()) { readFilterClause(e); } return e; } Expression readNextvalFunction() { read(); readThis(Tokens.OPENBRACKET); String spec = readQuotedString(); Scanner scanner = session.getScanner(); scanner.reset(spec); scanner.scanNext(); String schemaName = session.getSchemaName(scanner.token.namePrefix); NumberSequence sequence = database.schemaManager.getSequence(scanner.token.tokenString, schemaName, true); Expression e = new ExpressionColumn(sequence, OpTypes.SEQUENCE); readThis(Tokens.CLOSEBRACKET); return e; } // OK - composite production - // Expression XreadAllTypesPrimary(boolean boole) { Expression e = null; switch (token.tokenType) { case Tokens.SUBSTRING : case Tokens.SUBSTRING_REGEX : case Tokens.LOWER : case Tokens.UPPER : case Tokens.TRANSLATE_REGEX : case Tokens.TRIM : case Tokens.OVERLAY : case Tokens.NORMALIZE : // case Tokens.POSITION : case Tokens.OCCURRENCES_REGEX : case Tokens.POSITION_REGEX : case Tokens.EXTRACT : case Tokens.CHAR_LENGTH : case Tokens.CHARACTER_LENGTH : case Tokens.OCTET_LENGTH : case Tokens.CARDINALITY : case Tokens.ABS : case Tokens.MOD : case Tokens.LN : case Tokens.EXP : case Tokens.POWER : case Tokens.SQRT : case Tokens.FLOOR : case Tokens.CEILING : case Tokens.CEIL : case Tokens.WIDTH_BUCKET : FunctionSQL function = FunctionSQL.newSQLFunction(token.tokenString, compileContext); if (function == null) { throw unsupportedFeature(); } e = readSQLFunction(function); if (e != null) { break; } default : e = XreadAllTypesValueExpressionPrimary(boole); } e = XreadModifier(e); return e; } Expression XreadModifier(Expression e) { switch (token.tokenType) { case Tokens.AT : { read(); Expression e1 = null; if (token.tokenType == Tokens.LOCAL) { read(); } else { readThis(Tokens.TIME); readThis(Tokens.ZONE); e1 = XreadValueExpressionPrimary(); switch (token.tokenType) { case Tokens.YEAR : case Tokens.MONTH : case Tokens.DAY : case Tokens.HOUR : case Tokens.MINUTE : case Tokens.SECOND : { IntervalType type = readIntervalType(false); if (e1.getType() == OpTypes.SUBTRACT) { e1.dataType = type; } else { e1 = new ExpressionOp(e1, type); } } } } e = new ExpressionOp(OpTypes.ZONE_MODIFIER, e, e1); break; } case Tokens.YEAR : case Tokens.MONTH : case Tokens.DAY : case Tokens.HOUR : case Tokens.MINUTE : case Tokens.SECOND : { IntervalType type = readIntervalType(true); if (e.getType() == OpTypes.SUBTRACT) { e.dataType = type; } else { e = new ExpressionOp(e, type); } break; } case Tokens.COLLATE : { read(); if (token.namePrefix == null) { Collation collation; try { collation = Collation.getCollation(token.tokenString); } catch (HsqlException ex) { collation = (Collation) database.schemaManager.getSchemaObject( session.getSchemaName(token.namePrefix), token.tokenString, SchemaObject.COLLATION); } e.setCollation(collation); read(); } } } return e; } Expression XreadValueExpressionWithContext() { Expression e; compileContext.contextuallyTypedExpression = true; e = XreadValueExpressionOrNull(); compileContext.contextuallyTypedExpression = false; return e; } Expression XreadValueExpressionOrNull() { Expression e = XreadAllTypesCommonValueExpression(true); if (e == null) { return null; } return e; } /** * ::= * * | * | * */ Expression XreadValueExpression() { Expression e = XreadAllTypesCommonValueExpression(true); if (token.tokenType == Tokens.LEFTBRACKET) { read(); Expression e1 = XreadNumericValueExpression(); readThis(Tokens.RIGHTBRACKET); e = new ExpressionAccessor(e, e1); } return e; } // union of Expression XreadRowOrCommonValueExpression() { return XreadAllTypesCommonValueExpression(false); } // union of // no and no Expression XreadAllTypesCommonValueExpression(boolean boole) { Expression e = XreadAllTypesTerm(boole); int type = 0; boolean end = false; while (true) { switch (token.tokenType) { case Tokens.PLUS : type = OpTypes.ADD; boole = false; break; case Tokens.MINUS : type = OpTypes.SUBTRACT; boole = false; break; case Tokens.CONCAT : type = OpTypes.CONCAT; boole = false; break; case Tokens.OR : if (boole) { type = OpTypes.OR; break; } // fall through default : end = true; break; } if (end) { break; } read(); Expression a = e; e = XreadAllTypesTerm(boole); e = boole ? (Expression) new ExpressionLogical(type, a, e) : new ExpressionArithmetic(type, a, e); } return e; } Expression XreadAllTypesTerm(boolean boole) { Expression e = XreadAllTypesFactor(boole); int type = 0; boolean end = false; while (true) { switch (token.tokenType) { case Tokens.ASTERISK : type = OpTypes.MULTIPLY; boole = false; break; case Tokens.DIVIDE : type = OpTypes.DIVIDE; boole = false; break; case Tokens.AND : if (boole) { type = OpTypes.AND; break; } // fall through default : end = true; break; } if (end) { break; } read(); Expression a = e; e = XreadAllTypesFactor(boole); if (e == null) { throw unexpectedToken(); } e = boole ? (Expression) new ExpressionLogical(type, a, e) : new ExpressionArithmetic(type, a, e); } return e; } Expression XreadAllTypesFactor(boolean boole) { Expression e; boolean minus = false; boolean not = false; boolean unknown = false; switch (token.tokenType) { case Tokens.PLUS : read(); boole = false; break; case Tokens.MINUS : read(); boole = false; minus = true; break; case Tokens.NOT : if (boole) { read(); not = true; } break; } e = XreadAllTypesPrimary(boole); if (boole && token.tokenType == Tokens.IS) { read(); if (token.tokenType == Tokens.NOT) { read(); not = !not; } if (token.tokenType == Tokens.TRUE) { read(); } else if (token.tokenType == Tokens.FALSE) { read(); not = !not; } else if (token.tokenType == Tokens.UNKNOWN) { read(); unknown = true; } else { throw unexpectedToken(); } } if (unknown) { e = new ExpressionLogical(OpTypes.IS_NULL, e); } else if (minus) { e = new ExpressionArithmetic(OpTypes.NEGATE, e); } else if (not) { e = new ExpressionLogical(OpTypes.NOT, e); } return e; } Expression XreadStringValueExpression() { return XreadCharacterValueExpression(); // XreadBinaryValueExpression(); } Expression XreadCharacterValueExpression() { Expression e = XreadCharacterPrimary(); SchemaObject collation = readCollateClauseOrNull(); while (token.tokenType == Tokens.CONCAT) { read(); Expression a = e; e = XreadCharacterPrimary(); collation = readCollateClauseOrNull(); e = new ExpressionArithmetic(OpTypes.CONCAT, a, e); } return e; } Expression XreadCharacterPrimary() { switch (token.tokenType) { case Tokens.SUBSTRING : // case Token.SUBSTRING_REGEX : case Tokens.LOWER : case Tokens.UPPER : // case Token.TRANSLATE_REGEX : case Tokens.TRIM : case Tokens.OVERLAY : // case Token.NORMALIZE : FunctionSQL function = FunctionSQL.newSQLFunction(token.tokenString, compileContext); Expression e = readSQLFunction(function); if (e != null) { return e; } default : } return XreadValueExpressionPrimary(); } Expression XreadNumericPrimary() { switch (token.tokenType) { case Tokens.POSITION : // case Token.OCCURRENCES_REGEX : // case Token.POSITION_REGEX : case Tokens.EXTRACT : case Tokens.CHAR_LENGTH : case Tokens.CHARACTER_LENGTH : case Tokens.OCTET_LENGTH : case Tokens.CARDINALITY : case Tokens.ABS : case Tokens.MOD : case Tokens.LN : case Tokens.EXP : case Tokens.POWER : case Tokens.SQRT : case Tokens.FLOOR : case Tokens.CEILING : case Tokens.CEIL : case Tokens.WIDTH_BUCKET : FunctionSQL function = FunctionSQL.newSQLFunction(token.tokenString, compileContext); if (function == null) { throw super.unexpectedToken(); } Expression e = readSQLFunction(function); if (e != null) { return e; } default : } return XreadValueExpressionPrimary(); } Expression XreadNumericValueExpression() { Expression e = XreadTerm(); while (true) { int type; if (token.tokenType == Tokens.PLUS) { type = OpTypes.ADD; } else if (token.tokenType == Tokens.MINUS) { type = OpTypes.SUBTRACT; } else { break; } read(); Expression a = e; e = XreadTerm(); e = new ExpressionArithmetic(type, a, e); } return e; } Expression XreadTerm() { Expression e = XreadFactor(); int type; while (true) { if (token.tokenType == Tokens.ASTERISK) { type = OpTypes.MULTIPLY; } else if (token.tokenType == Tokens.DIVIDE) { type = OpTypes.DIVIDE; } else { break; } read(); Expression a = e; e = XreadFactor(); if (e == null) { throw unexpectedToken(); } e = new ExpressionArithmetic(type, a, e); } return e; } Expression XreadFactor() { Expression e; boolean minus = false; if (token.tokenType == Tokens.PLUS) { read(); } else if (token.tokenType == Tokens.MINUS) { read(); minus = true; } e = XreadNumericPrimary(); if (e == null) { return null; } if (minus) { e = new ExpressionArithmetic(OpTypes.NEGATE, e); } return e; } Expression XreadDatetimeValueExpression() { Expression e = XreadDateTimeIntervalTerm(); while (true) { int type; if (token.tokenType == Tokens.PLUS) { type = OpTypes.ADD; } else if (token.tokenType == Tokens.MINUS) { type = OpTypes.SUBTRACT; } else { break; } read(); Expression a = e; e = XreadDateTimeIntervalTerm(); e = new ExpressionArithmetic(type, a, e); } return e; } Expression XreadIntervalValueExpression() { Expression e = XreadDateTimeIntervalTerm(); while (true) { int type; if (token.tokenType == Tokens.PLUS) { type = OpTypes.ADD; } else if (token.tokenType == Tokens.MINUS) { type = OpTypes.SUBTRACT; } else { break; } read(); Expression a = e; e = XreadDateTimeIntervalTerm(); e = new ExpressionArithmetic(type, a, e); } return e; } Expression XreadDateTimeIntervalTerm() { switch (token.tokenType) { case Tokens.CURRENT_DATE : case Tokens.CURRENT_TIME : case Tokens.CURRENT_TIMESTAMP : case Tokens.LOCALTIME : case Tokens.LOCALTIMESTAMP : // case Tokens.ABS : FunctionSQL function = FunctionSQL.newSQLFunction(token.tokenString, compileContext); if (function == null) { throw super.unexpectedToken(); } return readSQLFunction(function); default : } return XreadValueExpressionPrimary(); } // returns null Expression XreadDateTimeValueFunctionOrNull() { FunctionSQL function = null; switch (token.tokenType) { case Tokens.CURRENT_DATE : case Tokens.CURRENT_TIME : case Tokens.CURRENT_TIMESTAMP : case Tokens.LOCALTIME : case Tokens.LOCALTIMESTAMP : function = FunctionSQL.newSQLFunction(token.tokenString, compileContext); break; case Tokens.SYSTIMESTAMP : if (!database.sqlSyntaxOra) { return null; } case Tokens.NOW : case Tokens.TODAY : case Tokens.SYSDATE : function = FunctionCustom.newCustomFunction(token.tokenString, token.tokenType); break; default : return null; } if (function == null) { throw super.unexpectedToken(); } return readSQLFunction(function); } Expression XreadBooleanValueExpression() { try { Expression e = XreadBooleanTermOrNull(); if (e == null) { throw Error.error(ErrorCode.X_42568); } while (true) { int type; if (token.tokenType == Tokens.OR) { type = OpTypes.OR; } else { break; } read(); Expression a = e; e = XreadBooleanTermOrNull(); if (e == null) { throw Error.error(ErrorCode.X_42568); } e = new ExpressionLogical(type, a, e); } if (e == null) { throw Error.error(ErrorCode.X_42568); } return e; } catch (HsqlException ex) { ex.setLevel(compileContext.subqueryDepth); if (lastError != null && lastError.getLevel() >= ex.getLevel()) { ex = lastError; lastError = null; } throw ex; } } Expression XreadBooleanTermOrNull() { Expression e = XreadBooleanFactorOrNull(); if (e == null) { return null; } int type; while (true) { if (token.tokenType == Tokens.AND) { type = OpTypes.AND; } else { break; } read(); Expression a = e; e = XreadBooleanFactorOrNull(); if (e == null) { throw unexpectedToken(); } e = new ExpressionLogical(type, a, e); } return e; } Expression XreadBooleanFactorOrNull() { Expression e; boolean not = false; if (token.tokenType == Tokens.NOT) { read(); not = true; } e = XreadBooleanTestOrNull(); if (e == null) { return null; } if (not) { e = new ExpressionLogical(OpTypes.NOT, e); } return e; } Expression XreadBooleanTestOrNull() { boolean unknown = false; boolean isNot = false; Expression e = XreadBooleanPrimaryOrNull(); if (e == null) { return e; } if (token.tokenType == Tokens.IS) { read(); if (token.tokenType == Tokens.NOT) { read(); isNot = true; } if (token.tokenType == Tokens.TRUE) { read(); } else if (token.tokenType == Tokens.FALSE) { read(); isNot = !isNot; } else if (token.tokenType == Tokens.UNKNOWN) { read(); unknown = true; } else { throw unexpectedToken(); } } if (unknown) { e = new ExpressionLogical(OpTypes.IS_NULL, e); } if (isNot) { e = new ExpressionLogical(OpTypes.NOT, e); } return e; } // ::= | Expression XreadBooleanPrimaryOrNull() { Expression e = null; int position; switch (token.tokenType) { case Tokens.EXISTS : case Tokens.UNIQUE : return XreadPredicate(); case Tokens.ROW : read(); readThis(Tokens.OPENBRACKET); e = XreadRowElementList(true); readThis(Tokens.CLOSEBRACKET); break; default : position = getPosition(); try { e = XreadAllTypesCommonValueExpression(false); } catch (HsqlException ex) { ex.setLevel(compileContext.subqueryDepth); if (lastError == null || lastError.getLevel() < ex.getLevel()) { lastError = ex; } rewind(position); } } if (e == null && token.tokenType == Tokens.OPENBRACKET) { read(); position = getPosition(); try { e = XreadRowElementList(true); readThis(Tokens.CLOSEBRACKET); } catch (HsqlException ex) { ex.setLevel(compileContext.subqueryDepth); if (lastError == null || lastError.getLevel() < ex.getLevel()) { lastError = ex; } rewind(position); e = XreadBooleanValueExpression(); readThis(Tokens.CLOSEBRACKET); } } if (e != null) { e = XreadPredicateRightPart(e); } return e; } // similar to Expression XreadBooleanPredicand() { Expression e; if (token.tokenType == Tokens.OPENBRACKET) { read(); e = XreadBooleanValueExpression(); readThis(Tokens.CLOSEBRACKET); return e; } else { e = XreadSimpleValueExpressionPrimary(); if (e != null) { e = XreadArrayElementReference(e); } return e; } } Expression XreadPredicate() { switch (token.tokenType) { case Tokens.EXISTS : { read(); Expression s = XreadTableSubquery(OpTypes.EXISTS); return new ExpressionLogical(OpTypes.EXISTS, s); } case Tokens.UNIQUE : { read(); Expression s = XreadTableSubquery(OpTypes.UNIQUE); return new ExpressionLogical(OpTypes.UNIQUE, s); } default : { Expression a = XreadRowValuePredicand(); return XreadPredicateRightPart(a); } } } Expression XreadPredicateRightPart(final Expression l) { boolean hasNot = false; ExpressionLogical e = null; Expression r; int position = getPosition(); if (token.tokenType == Tokens.NOT) { read(); hasNot = true; } switch (token.tokenType) { case Tokens.IS : { if (hasNot) { throw unexpectedToken(); } read(); if (token.tokenType == Tokens.NOT) { hasNot = true; read(); } if (token.tokenType == Tokens.NULL) { read(); e = new ExpressionLogical(OpTypes.IS_NULL, l); break; } if (token.tokenType == Tokens.DISTINCT) { read(); readThis(Tokens.FROM); r = XreadRowValuePredicand(); e = new ExpressionLogical(OpTypes.NOT_DISTINCT, l, r); hasNot = !hasNot; break; } rewind(position); return l; } case Tokens.LIKE : { e = XreadLikePredicateRightPart(l); e.noOptimisation = isCheckOrTriggerCondition; break; } case Tokens.BETWEEN : { e = XreadBetweenPredicateRightPart(l); break; } case Tokens.IN : { e = XreadInPredicateRightPart(l); e.noOptimisation = isCheckOrTriggerCondition; break; } case Tokens.OVERLAPS : { if (hasNot) { throw unexpectedToken(); } e = XreadOverlapsPredicateRightPart(l); break; } case Tokens.EQUALS : case Tokens.GREATER_EQUALS : case Tokens.GREATER : case Tokens.LESS : case Tokens.LESS_EQUALS : case Tokens.NOT_EQUALS : { if (hasNot) { throw unexpectedToken(); } int type = getExpressionType(token.tokenType); read(); switch (token.tokenType) { case Tokens.ANY : case Tokens.SOME : case Tokens.ALL : e = XreadQuantifiedComparisonRightPart(type, l); break; default : { Expression row = XreadRowValuePredicand(); e = new ExpressionLogical(type, l, row); break; } } break; } case Tokens.MATCH : { e = XreadMatchPredicateRightPart(l); break; } default : { if (hasNot) { throw unexpectedToken(); } return l; } } if (hasNot) { e = new ExpressionLogical(OpTypes.NOT, e); } return e; } private ExpressionLogical XreadBetweenPredicateRightPart( final Expression a) { boolean symmetric = false; read(); if (token.tokenType == Tokens.ASYMMETRIC) { read(); } else if (token.tokenType == Tokens.SYMMETRIC) { symmetric = true; read(); } Expression left = XreadRowValuePredicand(); readThis(Tokens.AND); Expression right = XreadRowValuePredicand(); Expression l = new ExpressionLogical(OpTypes.GREATER_EQUAL, a, left); Expression r = new ExpressionLogical(OpTypes.SMALLER_EQUAL, a, right); ExpressionLogical leftToRight = new ExpressionLogical(OpTypes.AND, l, r); if (symmetric) { l = new ExpressionLogical(OpTypes.SMALLER_EQUAL, a, left); r = new ExpressionLogical(OpTypes.GREATER_EQUAL, a, right); Expression rightToLeft = new ExpressionLogical(OpTypes.AND, l, r); return new ExpressionLogical(OpTypes.OR, leftToRight, rightToLeft); } else { return leftToRight; } } private ExpressionLogical XreadQuantifiedComparisonRightPart(int exprType, Expression l) { int tokenT = token.tokenType; int exprSubType = 0; Expression e; switch (token.tokenType) { case Tokens.ANY : case Tokens.SOME : exprSubType = OpTypes.ANY_QUANTIFIED; break; case Tokens.ALL : exprSubType = OpTypes.ALL_QUANTIFIED; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ParserDQL"); } read(); readThis(Tokens.OPENBRACKET); int position = getPosition(); readOpenBrackets(); switch (token.tokenType) { case Tokens.WITH : case Tokens.TABLE : case Tokens.VALUES : case Tokens.SELECT : rewind(position); TableDerived td = XreadSubqueryTableBody(OpTypes.IN); e = new Expression(OpTypes.TABLE_SUBQUERY, td); readThis(Tokens.CLOSEBRACKET); break; default : rewind(position); e = readAggregateExpression(tokenT); readThis(Tokens.CLOSEBRACKET); readFilterClause(e); } ExpressionLogical r = new ExpressionLogical(exprType, l, e); r.setSubType(exprSubType); return r; } private ExpressionLogical XreadInPredicateRightPart(Expression l) { int degree = l.getDegree(); Expression e = null; read(); readThis(Tokens.OPENBRACKET); int position = getPosition(); int brackets = readOpenBrackets(); switch (token.tokenType) { case Tokens.UNNEST : e = XreadCollectionDerivedTable(OpTypes.IN); readThis(Tokens.CLOSEBRACKET); this.readCloseBrackets(brackets); break; case Tokens.WITH : case Tokens.TABLE : case Tokens.VALUES : case Tokens.SELECT : { rewind(position); TableDerived td = XreadSubqueryTableBody(OpTypes.IN); e = new Expression(OpTypes.TABLE_SUBQUERY, td); readThis(Tokens.CLOSEBRACKET); break; } default : { rewind(position); e = XreadInValueListConstructor(degree); readThis(Tokens.CLOSEBRACKET); break; } } ExpressionLogical r; if (isCheckOrTriggerCondition) { r = new ExpressionLogical(OpTypes.IN, l, e); } else { r = new ExpressionLogical(OpTypes.EQUAL, l, e); r.setSubType(OpTypes.ANY_QUANTIFIED); } return r; } Expression XreadInValueList(int degree) { HsqlArrayList list = new HsqlArrayList(); while (true) { Expression e = XreadValueExpression(); if (e.getType() != OpTypes.ROW) { e = new Expression(OpTypes.ROW, new Expression[]{ e }); } list.add(e); if (token.tokenType == Tokens.COMMA) { read(); continue; } break; } Expression[] array = new Expression[list.size()]; list.toArray(array); Expression e = new Expression(OpTypes.VALUELIST, array); for (int i = 0; i < array.length; i++) { if (array[i].getType() != OpTypes.ROW) { array[i] = new Expression(OpTypes.ROW, new Expression[]{ array[i] }); } Expression[] args = array[i].nodes; if (args.length != degree) { // SQL error message throw unexpectedToken(); } for (int j = 0; j < degree; j++) { if (args[j].getType() == OpTypes.ROW) { // SQL error message throw unexpectedToken(); } } } return e; } private ExpressionLogical XreadLikePredicateRightPart(Expression a) { read(); Expression b = XreadStringValueExpression(); Expression escape = null; if (token.tokenString.equals(Tokens.T_ESCAPE)) { read(); escape = XreadStringValueExpression(); } return new ExpressionLike(a, b, escape, this.isCheckOrTriggerCondition); } private ExpressionLogical XreadMatchPredicateRightPart(Expression a) { boolean isUnique = false; int matchType = OpTypes.MATCH_SIMPLE; read(); if (token.tokenType == Tokens.UNIQUE) { read(); isUnique = true; } if (token.tokenType == Tokens.SIMPLE) { read(); matchType = isUnique ? OpTypes.MATCH_UNIQUE_SIMPLE : OpTypes.MATCH_SIMPLE; } else if (token.tokenType == Tokens.PARTIAL) { read(); matchType = isUnique ? OpTypes.MATCH_UNIQUE_PARTIAL : OpTypes.MATCH_PARTIAL; } else if (token.tokenType == Tokens.FULL) { read(); matchType = isUnique ? OpTypes.MATCH_UNIQUE_FULL : OpTypes.MATCH_FULL; } int mode = isUnique ? OpTypes.TABLE_SUBQUERY : OpTypes.IN; Expression s = XreadTableSubquery(mode); return new ExpressionLogical(matchType, a, s); } private ExpressionLogical XreadOverlapsPredicateRightPart(Expression l) { if (l.getType() != OpTypes.ROW) { throw Error.error(ErrorCode.X_42564); } if (l.nodes.length != 2) { throw Error.error(ErrorCode.X_42564); } read(); if (token.tokenType != Tokens.OPENBRACKET) { throw unexpectedToken(); } Expression r = XreadRowValuePredicand(); if (r.nodes.length != 2) { throw Error.error(ErrorCode.X_42564); } return new ExpressionLogical(OpTypes.OVERLAPS, l, r); } Expression XreadRowValueExpression() { Expression e = XreadExplicitRowValueConstructorOrNull(); if (e != null) { return e; } return XreadRowValueSpecialCase(); } Expression XreadTableRowValueConstructor() { Expression e = XreadExplicitRowValueConstructorOrNull(); if (e != null) { return e; } return XreadRowValueSpecialCase(); } // union of | // | | // translated to // | | Expression XreadRowValuePredicand() { return XreadRowOrCommonValueExpression(); } Expression XreadRowValueSpecialCase() { Expression e = XreadSimpleValueExpressionPrimary(); if (e != null) { e = XreadArrayElementReference(e); } return e; } // // ISSUE - XreadCommonValueExpression and XreadBooleanValueExpression should merge Expression XreadRowValueConstructor() { Expression e; e = XreadExplicitRowValueConstructorOrNull(); if (e != null) { return e; } e = XreadRowOrCommonValueExpression(); if (e != null) { return e; } return XreadBooleanValueExpression(); } // returns null // must be called in conjusnction with -1) { column = rangeVars[i].getColumn(index); read(); break; } } if (column == null) { throw Error.error(ErrorCode.X_42501, token.tokenString); } colIndexList.add(index); if (token.tokenType == Tokens.LEFTBRACKET) { if (!column.getDataType().isArrayType()) { throw unexpectedToken(); } read(); Expression e = XreadNumericValueExpression(); if (e == null) { throw Error.error(ErrorCode.X_42501, token.tokenString); } e = new ExpressionAccessor(column.getAccessor(), e); readThis(Tokens.RIGHTBRACKET); return e; } return column.getAccessor(); } Expression XreadCollectionDerivedTable(int type) { boolean ordinality = false; int position = getPosition(); readThis(Tokens.UNNEST); readThis(Tokens.OPENBRACKET); compileContext.incrementDepth(); HsqlArrayList list = new HsqlArrayList(); while (true) { Expression e = XreadValueExpression(); list.add(e); if (token.tokenType == Tokens.COMMA) { read(); } else { break; } } Expression[] array = new Expression[list.size()]; list.toArray(array); readThis(Tokens.CLOSEBRACKET); if (token.tokenType == Tokens.WITH) { read(); readThis(Tokens.ORDINALITY); ordinality = true; } Expression e = new ExpressionTable(array, ordinality); TableDerived td = newSubQueryTable(e, type); td.setSQL(getLastPart(position)); compileContext.decrementDepth(); return e; } Expression XreadTableFunctionDerivedTable() { int position = getPosition(); readThis(Tokens.TABLE); readThis(Tokens.OPENBRACKET); compileContext.incrementDepth(); Expression e = this.XreadValueExpression(); if (e.getType() != OpTypes.FUNCTION && e.getType() != OpTypes.SQL_FUNCTION) { compileContext.decrementDepth(); throw this.unexpectedToken(Tokens.T_TABLE); } readThis(Tokens.CLOSEBRACKET); e = new ExpressionTable(new Expression[]{ e }, false); TableDerived td = newSubQueryTable(e, OpTypes.TABLE_SUBQUERY); td.setSQL(getLastPart(position)); compileContext.decrementDepth(); return e; } Expression XreadLateralDerivedTable() { readThis(Tokens.LATERAL); readThis(Tokens.OPENBRACKET); TableDerived td = XreadSubqueryTableBody(OpTypes.TABLE_SUBQUERY); readThis(Tokens.CLOSEBRACKET); return new Expression(OpTypes.TABLE_SUBQUERY, td); } Expression XreadArrayConstructor() { readThis(Tokens.OPENBRACKET); TableDerived td = XreadSubqueryTableBody(OpTypes.TABLE_SUBQUERY); readThis(Tokens.CLOSEBRACKET); return new Expression(OpTypes.ARRAY_SUBQUERY, td); } // Additional Common Elements SchemaObject readCollateClauseOrNull() { if (token.tokenType == Tokens.COLLATE) { read(); SchemaObject collation = database.schemaManager.getSchemaObject(token.namePrefix, token.tokenString, SchemaObject.COLLATION); return collation; } return null; } Expression XreadArrayElementReference(Expression e) { if (token.tokenType == Tokens.LEFTBRACKET) { read(); Expression e1 = XreadNumericValueExpression(); readThis(Tokens.RIGHTBRACKET); e = new ExpressionAccessor(e, e1); } return e; } Expression readRow() { Expression r = null; while (true) { Expression e = XreadValueExpressionWithContext(); if (r == null) { r = e; } else if (r.getType() == OpTypes.ROW) { if (e.getType() == OpTypes.ROW && r.nodes[0].getType() != OpTypes.ROW) { r = new Expression(OpTypes.ROW, new Expression[] { r, e }); } else { r.nodes = (Expression[]) ArrayUtil.resizeArray(r.nodes, r.nodes.length + 1); r.nodes[r.nodes.length - 1] = e; } } else { r = new Expression(OpTypes.ROW, new Expression[] { r, e }); } if (token.tokenType != Tokens.COMMA) { break; } read(); } return r; } Expression readCaseExpression() { Expression predicand = null; read(); if (token.tokenType != Tokens.WHEN) { predicand = XreadRowValuePredicand(); } return readCaseWhen(predicand); } /** * Reads part of a CASE .. WHEN expression */ private Expression readCaseWhen(final Expression l) { readThis(Tokens.WHEN); Expression condition = null; if (l == null) { condition = XreadBooleanValueExpression(); } else { while (true) { Expression newCondition = XreadPredicateRightPart(l); if (l == newCondition) { newCondition = new ExpressionLogical(l, XreadRowValuePredicand()); } if (condition == null) { condition = newCondition; } else { condition = new ExpressionLogical(OpTypes.OR, condition, newCondition); } if (token.tokenType == Tokens.COMMA) { read(); } else { break; } } } readThis(Tokens.THEN); Expression current = XreadValueExpression(); Expression elseExpr = null; if (token.tokenType == Tokens.WHEN) { elseExpr = readCaseWhen(l); } else if (token.tokenType == Tokens.ELSE) { read(); elseExpr = XreadValueExpression(); readThis(Tokens.END); readIfThis(Tokens.CASE); } else { elseExpr = new ExpressionValue((Object) null, Type.SQL_ALL_TYPES); readThis(Tokens.END); readIfThis(Tokens.CASE); } Expression alternatives = new ExpressionOp(OpTypes.ALTERNATIVE, current, elseExpr); Expression casewhen = new ExpressionOp(OpTypes.CASEWHEN, condition, alternatives); return casewhen; } /** * reads a CASEWHEN expression */ private Expression readCaseWhenExpressionOrNull() { Expression l = null; int position = getPosition(); read(); if (!readIfThis(Tokens.OPENBRACKET)) { rewind(position); return null; } l = XreadBooleanValueExpression(); readThis(Tokens.COMMA); Expression then = XreadValueExpression(); readThis(Tokens.COMMA); Expression thenelse = new ExpressionOp(OpTypes.ALTERNATIVE, then, XreadValueExpression()); l = new ExpressionOp(OpTypes.CASEWHEN, l, thenelse); readThis(Tokens.CLOSEBRACKET); return l; } /** * Reads a CAST or CONVERT expression */ private Expression readCastExpressionOrNull() { boolean isConvert = token.tokenType == Tokens.CONVERT; Expression e; Type typeObject; int position = getPosition(); read(); if (isConvert) { if (!readIfThis(Tokens.OPENBRACKET)) { rewind(position); return null; } if (database.sqlSyntaxMss) { typeObject = readTypeDefinition(false, true); readThis(Tokens.COMMA); e = this.XreadValueExpressionOrNull(); } else { e = this.XreadValueExpressionOrNull(); readThis(Tokens.COMMA); typeObject = Type.getTypeForJDBCConvertToken(token.tokenType); if (typeObject == null) { typeObject = readTypeDefinition(false, true); } else { read(); } } } else { readThis(Tokens.OPENBRACKET); e = this.XreadValueExpressionOrNull(); readThis(Tokens.AS); typeObject = readTypeDefinition(false, true); } if (e.isUnresolvedParam()) { e.setDataType(session, typeObject); } else { e = new ExpressionOp(e, typeObject); } readThis(Tokens.CLOSEBRACKET); return e; } /** * reads a Column or Function expression */ private Expression readColumnOrFunctionExpression() { String name = token.tokenString; boolean isSimpleQuoted = isDelimitedSimpleName(); String prefix = token.namePrefix; String prePrefix = token.namePrePrefix; String prePrePrefix = token.namePrePrePrefix; Token recordedToken = getRecordedToken(); checkIsIdentifier(); if (isUndelimitedSimpleName()) { int tokenType = token.tokenType; FunctionSQL function = FunctionCustom.newCustomFunction(token.tokenString, token.tokenType); if (function != null && tokenType == Tokens.SYSTIMESTAMP) { if (!database.sqlSyntaxOra) { function = null; } } if (function != null) { int pos = getPosition(); try { Expression e = readSQLFunction(function); if (e != null) { return e; } } catch (HsqlException ex) { ex.setLevel(compileContext.subqueryDepth); if (lastError == null || lastError.getLevel() < ex.getLevel()) { lastError = ex; } rewind(pos); } } else if (isReservedKey()) { function = FunctionSQL.newSQLFunction(name, compileContext); if (function != null) { Expression e = readSQLFunction(function); if (e != null) { return e; } } } } read(); if (token.tokenType != Tokens.OPENBRACKET) { checkValidCatalogName(prePrePrefix); Expression column = new ExpressionColumn(prePrefix, prefix, name); return column; } if (prePrePrefix != null) { throw Error.error(ErrorCode.X_42551, prePrePrefix); } checkValidCatalogName(prePrefix); prefix = session.getSchemaName(prefix); RoutineSchema routineSchema = (RoutineSchema) database.schemaManager.findSchemaObject(name, prefix, SchemaObject.FUNCTION); if (routineSchema == null && isSimpleQuoted) { HsqlName schema = database.schemaManager.getDefaultSchemaHsqlName(); routineSchema = (RoutineSchema) database.schemaManager.findSchemaObject(name, schema.name, SchemaObject.FUNCTION); if (routineSchema == null) { Routine.createRoutines(session, schema, name); routineSchema = (RoutineSchema) database.schemaManager.findSchemaObject( name, schema.name, SchemaObject.FUNCTION); } } if (routineSchema == null) { if (lastError != null) { throw lastError; } throw Error.error(ErrorCode.X_42501, name); } HsqlArrayList list = new HsqlArrayList(); readThis(Tokens.OPENBRACKET); if (token.tokenType == Tokens.CLOSEBRACKET) { read(); } else { while (true) { Expression e = XreadValueExpression(); list.add(e); if (token.tokenType == Tokens.COMMA) { read(); } else { readThis(Tokens.CLOSEBRACKET); break; } } } FunctionSQLInvoked function = new FunctionSQLInvoked(routineSchema); Expression[] arguments = new Expression[list.size()]; list.toArray(arguments); function.setArguments(arguments); compileContext.addFunctionCall(function); recordedToken.setExpression(routineSchema); return function; } Expression readCollection(int type) { read(); if (token.tokenType == Tokens.OPENBRACKET) { return XreadArrayConstructor(); } else { readThis(Tokens.LEFTBRACKET); HsqlArrayList list = new HsqlArrayList(); for (int i = 0; ; i++) { if (token.tokenType == Tokens.RIGHTBRACKET) { read(); break; } if (i > 0) { readThis(Tokens.COMMA); } Expression e = XreadValueExpressionOrNull(); list.add(e); } Expression[] array = new Expression[list.size()]; list.toArray(array); return new Expression(OpTypes.ARRAY, array); } } private Expression readDecodeExpressionOrNull() { int position = getPosition(); read(); if (!readIfThis(Tokens.OPENBRACKET)) { rewind(position); return null; } Expression casewhen = null; Expression alternative = null; Expression main = XreadValueExpression(); readThis(Tokens.COMMA); do { Expression v = XreadValueExpression(); if (token.tokenType == Tokens.COMMA) { readThis(Tokens.COMMA); } else { if (alternative == null) { throw unexpectedToken(); } alternative.setRightNode(v); break; } Expression l = new ExpressionLogical(OpTypes.NOT_DISTINCT, main, v); Expression r = XreadValueExpression(); Expression a = new ExpressionOp(OpTypes.ALTERNATIVE, r, null); Expression c = new ExpressionOp(OpTypes.CASEWHEN, l, a); if (casewhen == null) { casewhen = c; } else { alternative.setRightNode(c); } alternative = a; if (token.tokenType == Tokens.COMMA) { readThis(Tokens.COMMA); } else { alternative.setRightNode(new ExpressionValue(null, null));; break; } } while (true); readThis(Tokens.CLOSEBRACKET); return casewhen; } private Expression readConcatExpressionOrNull() { Expression root; Expression r; // turn into a concatenation int position = getPosition(); read(); if (!readIfThis(Tokens.OPENBRACKET)) { rewind(position); return null; } root = XreadValueExpression(); readThis(Tokens.COMMA); do { r = XreadValueExpression(); root = new ExpressionArithmetic(OpTypes.CONCAT, root, r); if (token.tokenType == Tokens.COMMA) { readThis(Tokens.COMMA); } else if (token.tokenType == Tokens.CLOSEBRACKET) { readThis(Tokens.CLOSEBRACKET); break; } } while (true); return root; } private Expression readLeastExpressionOrNull() { int position = getPosition(); read(); if (!readIfThis(Tokens.OPENBRACKET)) { rewind(position); return null; } Expression casewhen = null; do { casewhen = readValue(casewhen, OpTypes.SMALLER); if (token.tokenType == Tokens.COMMA) { readThis(Tokens.COMMA); } else { break; } } while (true); readThis(Tokens.CLOSEBRACKET); return casewhen; } private Expression readGreatestExpressionOrNull() { int position = getPosition(); read(); if (!readIfThis(Tokens.OPENBRACKET)) { rewind(position); return null; } Expression casewhen = null; do { casewhen = readValue(casewhen, OpTypes.GREATER); if (token.tokenType == Tokens.COMMA) { readThis(Tokens.COMMA); } else { break; } } while (true); readThis(Tokens.CLOSEBRACKET); return casewhen; } private Expression readValue(Expression e, int opType) { Expression r = XreadValueExpression(); if (e == null) { return r; } Expression l = new ExpressionLogical(opType, e, r); Expression a = new ExpressionOp(OpTypes.ALTERNATIVE, e, r); return new ExpressionOp(OpTypes.CASEWHEN, l, a); } /** * Reads a NULLIF expression */ private Expression readNullIfExpression() { read(); readThis(Tokens.OPENBRACKET); Expression c = XreadValueExpression(); readThis(Tokens.COMMA); Expression alternative = new ExpressionOp(OpTypes.ALTERNATIVE, new ExpressionValue((Object) null, (Type) null), c); c = new ExpressionLogical(c, XreadValueExpression()); c = new ExpressionOp(OpTypes.CASEWHEN, c, alternative); readThis(Tokens.CLOSEBRACKET); return c; } /** * Reads a ISNULL or ISNULL of NVL expression */ private Expression readIfNullExpressionOrNull() { int position = getPosition(); read(); if (!readIfThis(Tokens.OPENBRACKET)) { rewind(position); return null; } Expression c = XreadValueExpression(); readThis(Tokens.COMMA); Expression e = XreadValueExpression(); Expression condition = new ExpressionLogical(OpTypes.IS_NULL, c); Expression alternative = new ExpressionOp(OpTypes.ALTERNATIVE, e, c); c = new ExpressionOp(OpTypes.CASEWHEN, condition, alternative); c.setSubType(OpTypes.CAST); readThis(Tokens.CLOSEBRACKET); return c; } /** * Reads a NVL2 expression */ private Expression readIfNull2ExpressionOrNull() { int position = getPosition(); read(); if (!readIfThis(Tokens.OPENBRACKET)) { rewind(position); return null; } Expression c = XreadValueExpression(); readThis(Tokens.COMMA); Expression e1 = XreadValueExpression(); readThis(Tokens.COMMA); Expression e2 = XreadValueExpression(); Expression condition = new ExpressionLogical(OpTypes.IS_NULL, c); Expression alternative = new ExpressionOp(OpTypes.ALTERNATIVE, e2, e1); c = new ExpressionOp(OpTypes.CASEWHEN, condition, alternative); c.setSubType(OpTypes.CAST); readThis(Tokens.CLOSEBRACKET); return c; } /** * Reads a COALESE expression */ private Expression readCoalesceExpression() { Expression c = null; read(); readThis(Tokens.OPENBRACKET); Expression leaf = null; while (true) { Expression current = XreadValueExpression(); if (leaf != null && token.tokenType == Tokens.CLOSEBRACKET) { readThis(Tokens.CLOSEBRACKET); leaf.setLeftNode(current); break; } Expression condition = new ExpressionLogical(OpTypes.IS_NULL, current); Expression alternatives = new ExpressionOp(OpTypes.ALTERNATIVE, new ExpressionValue((Object) null, (Type) null), current); Expression casewhen = new ExpressionOp(OpTypes.CASEWHEN, condition, alternatives); if (c == null) { c = casewhen; } else { leaf.setLeftNode(casewhen); } leaf = alternatives; readThis(Tokens.COMMA); } return c; } Expression readSQLFunction(FunctionSQL function) { int position = getPosition(); read(); short[] parseList = function.parseList; if (parseList.length == 0) { return function; } HsqlArrayList exprList = new HsqlArrayList(); boolean isOpenBracket = token.tokenType == Tokens.OPENBRACKET; try { readExpression(exprList, parseList, 0, parseList.length, false); lastError = null; } catch (HsqlException e) { if (!isOpenBracket) { rewind(position); return null; } if (function.parseListAlt == null) { throw e; } rewind(position); read(); parseList = function.parseListAlt; exprList = new HsqlArrayList(); readExpression(exprList, parseList, 0, parseList.length, false); lastError = null; } Expression[] expr = new Expression[exprList.size()]; exprList.toArray(expr); function.setArguments(expr); return function.getFunctionExpression(); } void readExpression(HsqlArrayList exprList, short[] parseList, int start, int count, boolean isOption) { for (int i = start; i < start + count; i++) { int exprType = parseList[i]; switch (exprType) { case Tokens.QUESTION : { Expression e = null; e = XreadAllTypesCommonValueExpression(false); exprList.add(e); continue; } case Tokens.X_POS_INTEGER : { Expression e = null; Integer value = readIntegerObject(); if (value.intValue() < 0) { throw Error.error(ErrorCode.X_42592); } e = new ExpressionValue(value, Type.SQL_INTEGER); exprList.add(e); continue; } case Tokens.X_OPTION : { i++; int expressionCount = exprList.size(); int position = getPosition(); int elementCount = parseList[i++]; int initialExprIndex = exprList.size(); try { readExpression(exprList, parseList, i, elementCount, true); } catch (HsqlException ex) { ex.setLevel(compileContext.subqueryDepth); if (lastError == null || lastError.getLevel() < ex.getLevel()) { lastError = ex; } rewind(position); exprList.setSize(expressionCount); for (int j = i; j < i + elementCount; j++) { if (parseList[j] == Tokens.QUESTION || parseList[j] == Tokens.X_KEYSET || parseList[j] == Tokens.X_POS_INTEGER) { exprList.add(null); } } i += elementCount - 1; continue; } if (initialExprIndex == exprList.size()) { exprList.add(null); } i += elementCount - 1; continue; } case Tokens.X_REPEAT : { i++; int elementCount = parseList[i++]; int parseIndex = i; while (true) { int initialExprIndex = exprList.size(); readExpression(exprList, parseList, parseIndex, elementCount, true); if (exprList.size() == initialExprIndex) { break; } } i += elementCount - 1; continue; } case Tokens.X_KEYSET : { int elementCount = parseList[++i]; Expression e = null; if (ArrayUtil.find(parseList, token.tokenType, i + 1, elementCount) == -1) { if (!isOption) { throw unexpectedToken(); } } else { e = new ExpressionValue( ValuePool.getInt(token.tokenType), Type.SQL_INTEGER); read(); } exprList.add(e); i += elementCount; continue; } case Tokens.OPENBRACKET : case Tokens.CLOSEBRACKET : case Tokens.COMMA : default : if (token.tokenType != exprType) { throw unexpectedToken(); } read(); continue; } } } private Expression readSequenceExpressionOrNull(int opType) { int position = getPosition(); read(); if (token.tokenType != Tokens.VALUE) { rewind(position); return null; } readThis(Tokens.VALUE); readThis(Tokens.FOR); checkIsSchemaObjectName(); String schema = session.getSchemaName(token.namePrefix); NumberSequence sequence = database.schemaManager.getSequence(token.tokenString, schema, true); Token recordedToken = getRecordedToken(); read(); Expression e = new ExpressionColumn(sequence, opType); recordedToken.setExpression(sequence); compileContext.addSequence(sequence); return e; } SimpleName readSimpleName() { checkIsSimpleName(); SimpleName name = HsqlNameManager.getSimpleName(token.tokenString, isDelimitedIdentifier()); read(); return name; } HsqlName readNewSchemaName() { HsqlName name = readNewSchemaObjectName(SchemaObject.SCHEMA, false); SqlInvariants.checkSchemaNameNotSystem(name.name); return name; } HsqlName readNewSchemaObjectName(int type, boolean checkSchema) { checkIsSchemaObjectName(); HsqlName hsqlName = database.nameManager.newHsqlName(token.tokenString, isDelimitedIdentifier(), type); if (token.namePrefix != null) { switch (type) { case SchemaObject.LABEL : case SchemaObject.VARIABLE : case SchemaObject.GRANTEE : case SchemaObject.CATALOG : throw unexpectedToken(); case SchemaObject.CURSOR : { if (token.namePrePrefix == null && !token.isDelimitedPrefix && (Tokens.T_MODULE.equals(token.namePrefix))) { // local } else { throw unexpectedTokenRequire(Tokens.T_MODULE); } break; } case SchemaObject.SCHEMA : { checkValidCatalogName(token.namePrefix); if (token.namePrePrefix != null) { throw tooManyIdentifiers(); } break; } case SchemaObject.SERVER : case SchemaObject.WRAPPER : { checkValidCatalogName(token.namePrefix); if (token.namePrePrefix != null) { throw tooManyIdentifiers(); } break; } case SchemaObject.COLUMN : { if (token.namePrefix != null) { throw tooManyIdentifiers(); } break; } default : { checkValidCatalogName(token.namePrePrefix); HsqlName schemaName; if (checkSchema) { schemaName = session.getSchemaHsqlName(token.namePrefix); } else { schemaName = session.database.schemaManager.findSchemaHsqlName( token.namePrefix); if (schemaName == null) { schemaName = database.nameManager.newHsqlName( token.namePrefix, isDelimitedIdentifier(), SchemaObject.SCHEMA); } } hsqlName.setSchemaIfNull(schemaName); break; } } } read(); return hsqlName; } HsqlName readNewDependentSchemaObjectName(HsqlName parentName, int type) { HsqlName name = readNewSchemaObjectName(type, true); name.parent = parentName; name.setSchemaIfNull(parentName.schema); if (name.schema != null && parentName.schema != null && name.schema != parentName.schema) { throw Error.error(ErrorCode.X_42505, token.namePrefix); } return name; } HsqlName readSchemaName() { checkIsSchemaObjectName(); checkValidCatalogName(token.namePrefix); HsqlName schema = session.getSchemaHsqlName(token.tokenString); read(); return schema; } SchemaObject readSchemaObjectName(int type) { checkIsSchemaObjectName(); checkValidCatalogName(token.namePrePrefix); String schema = session.getSchemaName(token.namePrefix); SchemaObject object = database.schemaManager.getSchemaObject(token.tokenString, schema, type); read(); return object; } SchemaObject readSchemaObjectName(HsqlName schemaName, int type) { checkIsSchemaObjectName(); SchemaObject object = database.schemaManager.getSchemaObject(token.tokenString, schemaName.name, type); if (token.namePrefix != null) { if (!token.namePrefix.equals(schemaName.name)) { // todo - better error message throw Error.error(ErrorCode.X_42505, token.namePrefix); } if (token.namePrePrefix != null) { if (!token.namePrePrefix.equals( database.getCatalogName().name)) { // todo - better error message throw Error.error(ErrorCode.X_42505, token.namePrefix); } } } read(); return object; } Table readTableName() { checkIsIdentifier(); if (token.namePrePrefix != null) { checkValidCatalogName(token.namePrePrefix); } Table table = database.schemaManager.getTable(session, token.tokenString, token.namePrefix); getRecordedToken().setExpression(table); read(); return table; } ColumnSchema readSimpleColumnName(RangeVariable rangeVar, boolean withPrefix) { ColumnSchema column = null; checkIsIdentifier(); if (!withPrefix && token.namePrefix != null) { throw tooManyIdentifiers(); } int index = rangeVar.findColumn(token.namePrePrefix, token.namePrefix, token.tokenString); if (index == -1) { throw Error.error(ErrorCode.X_42501, token.tokenString); } column = rangeVar.getTable().getColumn(index); read(); return column; } ColumnSchema readSimpleColumnName(Table table, boolean withPrefix) { checkIsIdentifier(); if (withPrefix) { if (token.namePrefix != null && !table.getName().name.equals(token.namePrefix)) { throw Error.error(ErrorCode.X_42501, token.namePrefix); } } else if (token.namePrefix != null) { throw tooManyIdentifiers(); } int index = table.findColumn(token.tokenString); if (index == -1) { throw Error.error(ErrorCode.X_42501, token.tokenString); } ColumnSchema column = table.getColumn(index); read(); return column; } StatementQuery compileDeclareCursor(RangeGroup[] rangeGroups, boolean isRoutine) { int sensitivity = ResultConstants.SQL_ASENSITIVE; int scrollability = ResultConstants.SQL_NONSCROLLABLE; int holdability = ResultConstants.SQL_NONHOLDABLE; int returnability = ResultConstants.SQL_WITHOUT_RETURN; int position = super.getPosition(); readThis(Tokens.DECLARE); SimpleName cursorName = readSimpleName(); switch (token.tokenType) { case Tokens.SENSITIVE : read(); sensitivity = ResultConstants.SQL_SENSITIVE; break; case Tokens.INSENSITIVE : read(); sensitivity = ResultConstants.SQL_INSENSITIVE; break; case Tokens.ASENSITIVE : read(); break; } if (token.tokenType == Tokens.NO) { readThis(Tokens.SCROLL); } else { if (token.tokenType == Tokens.SCROLL) { read(); scrollability = ResultConstants.SQL_SCROLLABLE; } } if (token.tokenType != Tokens.CURSOR) { rewind(position); return null; } readThis(Tokens.CURSOR); for (int round = 0; round < 2; round++) { if (token.tokenType == Tokens.WITH) { read(); if (round == 0 && token.tokenType == Tokens.HOLD) { read(); holdability = ResultConstants.SQL_HOLDABLE; } else { readThis(Tokens.RETURN); round++; returnability = ResultConstants.SQL_WITH_RETURN; } } else if (token.tokenType == Tokens.WITHOUT) { read(); if (round == 0 && token.tokenType == Tokens.HOLD) { read(); } else { readThis(Tokens.RETURN); round++; } } } readThis(Tokens.FOR); int props = ResultProperties.getProperties(sensitivity, ResultConstants.SQL_UPDATABLE, scrollability, holdability, returnability); StatementQuery cs = compileCursorSpecification(rangeGroups, props, isRoutine); cs.setCursorName(cursorName); return cs; } /** * Retrieves a SELECT or other query expression Statement from this parse context. */ StatementQuery compileCursorSpecification(RangeGroup[] rangeGroups, int props, boolean isRoutine) { OrderedHashSet colNames = null; QueryExpression queryExpression = XreadQueryExpression(); if (token.tokenType == Tokens.FOR) { read(); if (token.tokenType == Tokens.READ || token.tokenType == Tokens.FETCH) { read(); readThis(Tokens.ONLY); props = ResultProperties.addUpdatable(props, false); } else { readThis(Tokens.UPDATE); props = ResultProperties.addUpdatable(props, true); if (token.tokenType == Tokens.OF) { readThis(Tokens.OF); colNames = new OrderedHashSet(); readColumnNameList(colNames, null, false); } } } if (ResultProperties.isUpdatable(props)) { queryExpression.isUpdatable = true; } queryExpression.setReturningResult(); queryExpression.resolve(session, rangeGroups, null); StatementQuery cs = isRoutine ? new StatementCursor(session, queryExpression, compileContext) : new StatementQuery(session, queryExpression, compileContext); return cs; } StatementDMQL compileShortCursorSpecification(int props) { QueryExpression select = XreadSimpleTable(); if (ResultProperties.isUpdatable(props)) { select.isUpdatable = true; } select.setReturningResult(); select.resolve(session); StatementDMQL cs = new StatementQuery(session, select, compileContext); return cs; } int readCloseBrackets(int limit) { int count = 0; while (count < limit && token.tokenType == Tokens.CLOSEBRACKET) { read(); count++; } return count; } int readOpenBrackets() { int count = 0; while (token.tokenType == Tokens.OPENBRACKET) { count++; read(); } return count; } void checkValidCatalogName(String name) { if (name != null && !name.equals(database.getCatalogName().name)) { throw Error.error(ErrorCode.X_42501, name); } } void rewind(int position) { super.rewind(position); compileContext.rewind(position); } public static final class CompileContext { final Session session; final ParserBase parser; // private int subqueryDepth; private int maxSubqueryDepth; private HsqlArrayList namedSubqueries; // private OrderedIntKeyHashMap parameters = new OrderedIntKeyHashMap(); private HsqlArrayList usedSequences = new HsqlArrayList(8, true); private HsqlArrayList usedRoutines = new HsqlArrayList(8, true); private HsqlArrayList rangeVariables = new HsqlArrayList(8, true); private HsqlArrayList usedObjects = new HsqlArrayList(8, true); Type currentDomain; boolean contextuallyTypedExpression; Routine callProcedure; // private RangeGroup[] outerRangeGroups; // private int rangeVarIndex = 0; public CompileContext(Session session, ParserBase parser) { this.session = session; this.parser = parser; reset(); } public void reset() { reset(1); } public void reset(int n) { rangeVarIndex = n; rangeVariables.clear(); subqueryDepth = 0; maxSubqueryDepth = 0; parameters.clear(); usedSequences.clear(); usedRoutines.clear(); callProcedure = null; usedObjects.clear(); outerRangeGroups = RangeGroup.emptyArray; // currentDomain = null; contextuallyTypedExpression = false; } public int getDepth() { return subqueryDepth; } public int getMaxDepth() { return maxSubqueryDepth; } public void incrementDepth() { subqueryDepth++; maxSubqueryDepth = subqueryDepth; } public void decrementDepth() { subqueryDepth--; } public void rewind(int position) { for (int i = rangeVariables.size() - 1; i >= 0; i--) { RangeVariable range = (RangeVariable) rangeVariables.get(i); if (range.parsePosition > position) { rangeVariables.remove(i); } } Iterator it = parameters.keySet().iterator(); while (it.hasNext()) { int pos = it.nextInt(); if (pos >= position) { it.remove(); } } } public void registerRangeVariable(RangeVariable range) { range.parsePosition = parser == null ? 0 : parser.getPosition(); range.rangePosition = getNextRangeVarIndex(); range.level = subqueryDepth; rangeVariables.add(range); } public void setNextRangeVarIndex(int n) { rangeVarIndex = n; } public int getNextRangeVarIndex() { return rangeVarIndex++; } public int getRangeVarCount() { return rangeVarIndex; } public RangeVariable[] getAllRangeVariables() { RangeVariable[] array = new RangeVariable[rangeVariables.size()]; rangeVariables.toArray(array); return array; } public RangeGroup[] getOuterRanges() { return outerRangeGroups; } public void setOuterRanges(RangeGroup[] rangeGroups) { outerRangeGroups = rangeGroups; } public NumberSequence[] getSequences() { if (usedSequences.size() == 0) { return NumberSequence.emptyArray; } NumberSequence[] array = new NumberSequence[usedSequences.size()]; usedSequences.toArray(array); return array; } public Routine[] getRoutines() { if (callProcedure == null && usedRoutines.size() == 0) { return Routine.emptyArray; } OrderedHashSet set = new OrderedHashSet(); for (int i = 0; i < usedRoutines.size(); i++) { FunctionSQLInvoked function = (FunctionSQLInvoked) usedRoutines.get(i); set.add(function.routine); } if (callProcedure != null) { set.add(callProcedure); } Routine[] array = new Routine[set.size()]; set.toArray(array); return array; } private void initSubqueryNames() { if (namedSubqueries == null) { namedSubqueries = new HsqlArrayList(); } if (namedSubqueries.size() <= subqueryDepth) { namedSubqueries.setSize(subqueryDepth + 1); } HashMappedList set = (HashMappedList) namedSubqueries.get(subqueryDepth); if (set == null) { set = new HashMappedList(); namedSubqueries.set(subqueryDepth, set); } else { set.clear(); } } private void registerSubquery(String name, TableDerived td) { HashMappedList set = (HashMappedList) namedSubqueries.get(subqueryDepth); boolean added = set.add(name, td); if (!added) { throw Error.error(ErrorCode.X_42504); } } private void unregisterSubqueries() { if (namedSubqueries == null) { return; } for (int i = subqueryDepth; i < namedSubqueries.size(); i++) { namedSubqueries.set(i, null); } } private TableDerived getNamedSubQuery(String name) { if (namedSubqueries == null) { return null; } for (int i = subqueryDepth; i >= 0; i--) { if (namedSubqueries.size() <= i) { continue; } HashMappedList set = (HashMappedList) namedSubqueries.get(i); if (set == null) { continue; } TableDerived td = (TableDerived) set.get(name); if (td != null) { return td; } } return null; } private void addParameter(ExpressionColumn e, int position) { e.parameterIndex = parameters.size(); parameters.put(position, e); } private void addSchemaObject(SchemaObject object) { usedObjects.add(object); } private void addSequence(SchemaObject object) { usedSequences.add(object); } void addFunctionCall(FunctionSQLInvoked function) { usedRoutines.add(function); } void addProcedureCall(Routine procedure) { callProcedure = procedure; } ExpressionColumn[] getParameters() { if (parameters.size() == 0) { return ExpressionColumn.emptyArray; } ExpressionColumn[] result = new ExpressionColumn[parameters.size()]; parameters.valuesToArray(result); parameters.clear(); return result; } void clearParameters() { parameters.clear(); } public OrderedHashSet getSchemaObjectNames() { OrderedHashSet set = new OrderedHashSet(); for (int i = 0; i < usedSequences.size(); i++) { SchemaObject object = (SchemaObject) usedSequences.get(i); set.add(object.getName()); } for (int i = 0; i < usedObjects.size(); i++) { SchemaObject object = (SchemaObject) usedObjects.get(i); set.add(object.getName()); } for (int i = 0; i < rangeVariables.size(); i++) { RangeVariable range = (RangeVariable) rangeVariables.get(i); HsqlName name = range.rangeTable.getName(); if (name.schema != SqlInvariants.SYSTEM_SCHEMA_HSQLNAME) { set.add(range.rangeTable.getName()); set.addAll(range.getColumnNames()); } else if (name.type == SchemaObject.TRANSITION) { set.addAll(range.getColumnNames()); } } Routine[] routines = getRoutines(); for (int i = 0; i < routines.length; i++) { set.add(routines[i].getSpecificName()); } return set; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Table.java0000644000175000017500000024651612007547406020653 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.RangeVariable.RangeIteratorBase; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.index.Index.IndexUse; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.OrderedIntHashSet; import org.hsqldb.lib.Set; import org.hsqldb.lib.StringUtil; import org.hsqldb.navigator.RowIterator; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.navigator.RowSetNavigatorDataChange; import org.hsqldb.persist.CachedObject; import org.hsqldb.persist.PersistentStore; import org.hsqldb.result.Result; import org.hsqldb.rights.Grantee; import org.hsqldb.store.ValuePool; import org.hsqldb.types.BinaryData; import org.hsqldb.types.CharacterType; import org.hsqldb.types.Collation; import org.hsqldb.types.Type; /** * Holds the data structures and methods for creation of a named database table. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.6.1 */ public class Table extends TableBase implements SchemaObject { public static final Table[] emptyArray = new Table[]{}; // main properties protected HsqlName tableName; protected long changeTimestamp; // public HashMappedList columnList; // columns in table int identityColumn; // -1 means no such column NumberSequence identitySequence; // next value of identity column // ----------------------------------------------------------------------- Constraint[] constraintList; // constrainst for the table Constraint[] fkConstraints; // Constraint[] fkMainConstraints; Constraint[] checkConstraints; TriggerDef[] triggerList; TriggerDef[][] triggerLists; // array of trigger lists Expression[] colDefaults; // expressions of DEFAULT values private boolean hasDefaultValues; // shortcut for above boolean[] colGenerated; // generated columns private boolean hasGeneratedValues; // shortcut for above boolean[] colRefFK; // foreign key columns boolean[] colMainFK; // columns referenced by foreign key boolean hasReferentialAction; // has set null, set default or cascade boolean isDropped; // has been dropped private boolean hasDomainColumns; // shortcut private boolean hasNotNullColumns; // shortcut protected int[] defaultColumnMap; // holding 0,1,2,3,... RangeVariable[] defaultRanges; // public Table(Database database, HsqlName name, int type) { this.database = database; tableName = name; persistenceId = database.persistentStoreCollection.getNextId(); switch (type) { case CHANGE_SET_TABLE : persistenceScope = SCOPE_STATEMENT; isSessionBased = true; break; case SYSTEM_SUBQUERY : persistenceScope = SCOPE_STATEMENT; isSessionBased = true; break; case INFO_SCHEMA_TABLE : isSessionBased = true; // fall through case SYSTEM_TABLE : persistenceScope = SCOPE_FULL; isSchemaBased = true; break; case CACHED_TABLE : if (database.logger.isFileDatabase()) { persistenceScope = SCOPE_FULL; isSchemaBased = true; isCached = true; isLogged = !database.isFilesReadOnly(); break; } type = MEMORY_TABLE; // fall through case MEMORY_TABLE : persistenceScope = SCOPE_FULL; isSchemaBased = true; isLogged = !database.isFilesReadOnly(); break; case TEMP_TABLE : persistenceScope = SCOPE_TRANSACTION; isTemp = true; isSchemaBased = true; isSessionBased = true; break; case TEMP_TEXT_TABLE : persistenceScope = SCOPE_SESSION; if (!database.logger.isFileDatabase()) { throw Error.error(ErrorCode.DATABASE_IS_MEMORY_ONLY); } isSchemaBased = true; isSessionBased = true; isTemp = true; isText = true; isReadOnly = true; break; case TEXT_TABLE : persistenceScope = SCOPE_FULL; if (!database.logger.isFileDatabase()) { if (!database.logger.isAllowedFullPath()) { throw Error.error(ErrorCode.DATABASE_IS_MEMORY_ONLY); } isReadOnly = true; } isSchemaBased = true; isText = true; break; case VIEW_TABLE : persistenceScope = SCOPE_STATEMENT; isSchemaBased = true; isSessionBased = true; isView = true; break; case RESULT_TABLE : persistenceScope = SCOPE_SESSION; isSessionBased = true; break; case TableBase.FUNCTION_TABLE : persistenceScope = SCOPE_STATEMENT; isSessionBased = true; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "Table"); } // type may have changed above for CACHED tables tableType = type; primaryKeyCols = null; primaryKeyTypes = null; identityColumn = -1; columnList = new HashMappedList(); indexList = Index.emptyArray; constraintList = Constraint.emptyArray; fkConstraints = Constraint.emptyArray; fkMainConstraints = Constraint.emptyArray; checkConstraints = Constraint.emptyArray; triggerList = TriggerDef.emptyArray; triggerLists = new TriggerDef[TriggerDef.NUM_TRIGS][]; for (int i = 0; i < TriggerDef.NUM_TRIGS; i++) { triggerLists[i] = TriggerDef.emptyArray; } if (database.isFilesReadOnly() && isFileBased()) { this.isReadOnly = true; } if (!isSessionBased) { createDefaultStore(); } } /** trigger transition table */ public Table(Table table, HsqlName name) { persistenceScope = SCOPE_STATEMENT; name.schema = SqlInvariants.SYSTEM_SCHEMA_HSQLNAME; this.tableName = name; this.database = table.database; this.tableType = RESULT_TABLE; this.columnList = table.columnList; this.columnCount = table.columnCount; this.indexList = Index.emptyArray; this.constraintList = Constraint.emptyArray; createPrimaryKey(); } public void createDefaultStore() { store = database.logger.newStore(null, database.persistentStoreCollection, this); } public int getType() { return SchemaObject.TABLE; } /** * Returns the HsqlName object fo the table */ public final HsqlName getName() { return tableName; } /** * Returns the catalog name or null, depending on a database property. */ public HsqlName getCatalogName() { return database.getCatalogName(); } /** * Returns the schema name. */ public HsqlName getSchemaName() { return tableName.schema; } public Grantee getOwner() { return tableName.schema.owner; } public OrderedHashSet getReferences() { OrderedHashSet set = new OrderedHashSet(); if (identitySequence != null && identitySequence.getName() != null) { set.add(identitySequence.getName()); } return set; } public RangeVariable[] getDefaultRanges() { if (defaultRanges == null) { defaultRanges = new RangeVariable[]{ new RangeVariable(this, 0) }; } return defaultRanges; } public OrderedHashSet getReferencesForDependents() { OrderedHashSet set = new OrderedHashSet(); for (int i = 0; i < colTypes.length; i++) { ColumnSchema column = getColumn(i); OrderedHashSet refs = column.getReferences(); if (refs != null && !refs.isEmpty()) { set.add(column.getName()); } } for (int i = 0; i < fkConstraints.length; i++) { if (fkConstraints[i].getMainTableName() != this.getName()) { set.add(fkConstraints[i].getName()); } } for (int i = 0; i < triggerList.length; i++) { set.add(triggerList[i].getName()); } return set; } public OrderedHashSet getComponents() { OrderedHashSet set = new OrderedHashSet(); set.addAll(constraintList); set.addAll(triggerList); for (int i = 0; i < indexList.length; i++) { if (!indexList[i].isConstraint()) { set.add(indexList[i]); } } return set; } public void compile(Session session, SchemaObject parentObject) { for (int i = 0; i < columnCount; i++) { ColumnSchema column = getColumn(i); column.compile(session, this); } } public String getSQL() { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_CREATE).append(' '); if (isTemp()) { sb.append(Tokens.T_GLOBAL).append(' '); sb.append(Tokens.T_TEMPORARY).append(' '); } else if (isText()) { sb.append(Tokens.T_TEXT).append(' '); } else if (isCached()) { sb.append(Tokens.T_CACHED).append(' '); } else { sb.append(Tokens.T_MEMORY).append(' '); } sb.append(Tokens.T_TABLE).append(' '); sb.append(getName().getSchemaQualifiedStatementName()); sb.append('('); int[] pk = getPrimaryKey(); Constraint pkConst = getPrimaryConstraint(); for (int j = 0; j < columnCount; j++) { ColumnSchema column = getColumn(j); String colname = column.getName().statementName; Type type = column.getDataType(); if (j > 0) { sb.append(','); } sb.append(colname); sb.append(' '); sb.append(type.getTypeDefinition()); if (type.isCharacterType()) { Collation collation = ((CharacterType) type).getCollation(); if (collation.isObjectCollation()) { sb.append(' ').append(Tokens.T_COLLATE).append(' '); sb.append(collation.getName().statementName); } } String defaultString = column.getDefaultSQL(); if (defaultString != null) { sb.append(' ').append(Tokens.T_DEFAULT).append(' '); sb.append(defaultString); } if (column.isIdentity()) { sb.append(' ').append( column.getIdentitySequence().getSQLColumnDefinition()); } if (column.isGenerated()) { sb.append(' ').append(Tokens.T_GENERATED).append(' '); sb.append(Tokens.T_ALWAYS).append(' ').append( Tokens.T_AS).append(Tokens.T_OPENBRACKET); sb.append(column.getGeneratingExpression().getSQL()); sb.append(Tokens.T_CLOSEBRACKET); } if (!column.isNullable()) { Constraint c = getNotNullConstraintForColumn(j); if (c != null && !c.getName().isReservedName()) { sb.append(' ').append(Tokens.T_CONSTRAINT).append( ' ').append(c.getName().statementName); } sb.append(' ').append(Tokens.T_NOT).append(' ').append( Tokens.T_NULL); } if (pk.length == 1 && j == pk[0] && pkConst.getName().isReservedName()) { sb.append(' ').append(Tokens.T_PRIMARY).append(' ').append( Tokens.T_KEY); } } Constraint[] constraintList = getConstraints(); for (int j = 0, vSize = constraintList.length; j < vSize; j++) { Constraint c = constraintList[j]; if (!c.isForward) { String d = c.getSQL(); if (d.length() > 0) { sb.append(','); sb.append(d); } } } sb.append(')'); if (onCommitPreserve()) { sb.append(' ').append(Tokens.T_ON).append(' '); sb.append(Tokens.T_COMMIT).append(' ').append(Tokens.T_PRESERVE); sb.append(' ').append(Tokens.T_ROWS); } return sb.toString(); } public long getChangeTimestamp() { return changeTimestamp; } public final void setName(HsqlName name) { tableName = name; } String[] getSQL(OrderedHashSet resolved, OrderedHashSet unresolved) { for (int i = 0; i < constraintList.length; i++) { Constraint c = constraintList[i]; if (c.isForward) { unresolved.add(c); } else if (c.getConstraintType() == SchemaObject.ConstraintTypes .UNIQUE || c.getConstraintType() == SchemaObject .ConstraintTypes.PRIMARY_KEY) { resolved.add(c.getName()); } } HsqlArrayList list = new HsqlArrayList(); list.add(getSQL()); if (!isTemp && !isText && identitySequence != null && identitySequence.getName() == null) { list.add(NumberSequence.getRestartSQL(this)); } for (int i = 0; i < indexList.length; i++) { if (!indexList[i].isConstraint() && indexList[i].getColumnCount() > 0) { list.add(indexList[i].getSQL()); } } String[] array = new String[list.size()]; list.toArray(array); return array; } public String getSQLForReadOnly() { if (isReadOnly) { StringBuffer sb = new StringBuffer(64); sb.append(Tokens.T_SET).append(' ').append(Tokens.T_TABLE).append( ' '); sb.append(getName().getSchemaQualifiedStatementName()); sb.append(' ').append(Tokens.T_READ).append(' '); sb.append(Tokens.T_ONLY); return sb.toString(); } else { return null; } } public String[] getSQLForTextSource(boolean withHeader) { // readonly for TEXT tables only if (isText()) { HsqlArrayList list = new HsqlArrayList(); if (isReadOnly) { list.add(getSQLForReadOnly()); } // data source String dataSource = ((TextTable) this).getDataSourceDDL(); if (dataSource != null) { list.add(dataSource); } // header String header = ((TextTable) this).getDataSourceHeader(); if (withHeader && header != null && !isReadOnly) { list.add(header); } String[] array = new String[list.size()]; list.toArray(array); return array; } else { return null; } } public String getSQLForClustered() { if (!isCached() && !isText()) { return null; } Index index = getClusteredIndex(); if (index == null) { return null; } String colList = getColumnListSQL(index.getColumns(), index.getColumnCount()); StringBuffer sb = new StringBuffer(64); sb.append(Tokens.T_SET).append(' ').append(Tokens.T_TABLE).append(' '); sb.append(getName().getSchemaQualifiedStatementName()); sb.append(' ').append(Tokens.T_CLUSTERED).append(' '); sb.append(Tokens.T_ON).append(' ').append(colList); return sb.toString(); } public String[] getTriggerSQL() { String[] array = new String[triggerList.length]; for (int i = 0; i < triggerList.length; i++) { if (!triggerList[i].isSystem()) { array[i] = triggerList[i].getSQL(); } } return array; } public String getIndexRootsSQL(long[] roots) { StringBuffer sb = new StringBuffer(128); sb.append(Tokens.T_SET).append(' ').append(Tokens.T_TABLE).append(' '); sb.append(getName().getSchemaQualifiedStatementName()); sb.append(' ').append(Tokens.T_INDEX).append(' ').append('\''); sb.append(StringUtil.getList(roots, " ", "")); sb.append('\''); return sb.toString(); } public String getColumnListSQL(int[] col, int len) { StringBuffer sb = new StringBuffer(); sb.append('('); for (int i = 0; i < len; i++) { sb.append(getColumn(col[i]).getName().statementName); if (i < len - 1) { sb.append(','); } } sb.append(')'); return sb.toString(); } public String getColumnListWithTypeSQL() { StringBuffer sb = new StringBuffer(); sb.append('('); for (int j = 0; j < columnCount; j++) { ColumnSchema column = getColumn(j); String colname = column.getName().statementName; Type type = column.getDataType(); if (j > 0) { sb.append(','); } sb.append(colname); sb.append(' '); sb.append(type.getTypeDefinition()); } sb.append(')'); return sb.toString(); } public boolean isConnected() { return true; } /** * compares two full table rows based on a set of columns * * @param a a full row * @param b a full row * @param cols array of column indexes to compare * @param coltypes array of column types for the full row * * @return comparison result, -1,0,+1 */ public static int compareRows(Session session, Object[] a, Object[] b, int[] cols, Type[] coltypes) { int fieldcount = cols.length; for (int j = 0; j < fieldcount; j++) { int i = coltypes[cols[j]].compare(session, a[cols[j]], b[cols[j]]); if (i != 0) { return i; } } return 0; } /** * Used to create row id's */ public int getId() { return tableName.hashCode(); } public final boolean isSchemaBaseTable() { switch (tableType) { case TableBase.MEMORY_TABLE : case TableBase.CACHED_TABLE : case TableBase.TEXT_TABLE : return true; default : return false; } } public final boolean isWithDataSource() { return isWithDataSource; } public final boolean isText() { return isText; } public final boolean isTemp() { return isTemp; } public final boolean isReadOnly() { return isReadOnly; } public final boolean isView() { return isView; } public boolean isQueryBased() { return false; } public boolean isCached() { return isCached; } public boolean isDataReadOnly() { return isReadOnly; } public boolean isDropped() { return isDropped; } /** * returns false if the table has to be recreated in order to add / drop * indexes. Only CACHED tables return false. */ final boolean isIndexingMutable() { return !isIndexCached(); } /** * Returns true if table is CACHED */ boolean isIndexCached() { return isCached; } /** * Used by INSERT, DELETE, UPDATE operations */ void checkDataReadOnly() { if (isReadOnly) { throw Error.error(ErrorCode.DATA_IS_READONLY); } } // ---------------------------------------------------------------------------- // akede@users - 1.7.2 patch Files readonly public void setDataReadOnly(boolean value) { // Changing the Read-Only mode for the table is only allowed if the // the database can realize it. if (!value) { if (database.isFilesReadOnly() && isFileBased()) { throw Error.error(ErrorCode.DATA_IS_READONLY); } else if (database.getType() == DatabaseURL.S_MEM && isText) { throw Error.error(ErrorCode.DATA_IS_READONLY); } } isReadOnly = value; } /** * Text or Cached Tables are normally file based */ public boolean isFileBased() { return isCached || isText; } /** * Adds a constraint. */ public void addConstraint(Constraint c) { int index = c.getConstraintType() == SchemaObject.ConstraintTypes.PRIMARY_KEY ? 0 : constraintList .length; constraintList = (Constraint[]) ArrayUtil.toAdjustedArray(constraintList, c, index, 1); updateConstraintLists(); } void updateConstraintLists() { int fkCount = 0; int mainCount = 0; int checkCount = 0; hasReferentialAction = false; for (int i = 0; i < constraintList.length; i++) { switch (constraintList[i].getConstraintType()) { case SchemaObject.ConstraintTypes.FOREIGN_KEY : fkCount++; break; case SchemaObject.ConstraintTypes.MAIN : mainCount++; break; case SchemaObject.ConstraintTypes.CHECK : if (constraintList[i].isNotNull()) { break; } checkCount++; break; } } fkConstraints = fkCount == 0 ? Constraint.emptyArray : new Constraint[fkCount]; fkCount = 0; fkMainConstraints = mainCount == 0 ? Constraint.emptyArray : new Constraint[mainCount]; mainCount = 0; checkConstraints = checkCount == 0 ? Constraint.emptyArray : new Constraint[checkCount]; checkCount = 0; colRefFK = new boolean[columnCount]; colMainFK = new boolean[columnCount]; for (int i = 0; i < constraintList.length; i++) { switch (constraintList[i].getConstraintType()) { case SchemaObject.ConstraintTypes.FOREIGN_KEY : fkConstraints[fkCount] = constraintList[i]; ArrayUtil.intIndexesToBooleanArray( constraintList[i].getRefColumns(), colRefFK); fkCount++; break; case SchemaObject.ConstraintTypes.MAIN : fkMainConstraints[mainCount] = constraintList[i]; ArrayUtil.intIndexesToBooleanArray( constraintList[i].getMainColumns(), colMainFK); if (constraintList[i].hasTriggeredAction()) { hasReferentialAction = true; } mainCount++; break; case SchemaObject.ConstraintTypes.CHECK : if (constraintList[i].isNotNull()) { break; } checkConstraints[checkCount] = constraintList[i]; checkCount++; break; } } } void verifyConstraintsIntegrity() { for (int i = 0; i < constraintList.length; i++) { Constraint c = constraintList[i]; if (c.getConstraintType() == SchemaObject.ConstraintTypes .FOREIGN_KEY || c.getConstraintType() == SchemaObject .ConstraintTypes.MAIN) { if (c.getMain() != database.schemaManager.findUserTable(null, c.getMain().getName().name, c.getMain().getName().schema.name)) { throw Error.runtimeError(ErrorCode.U_S0500, "FK mismatch : " + c.getName().name); } if (c.getRef() != database.schemaManager.findUserTable(null, c.getRef().getName().name, c.getRef().getName().schema.name)) { throw Error.runtimeError(ErrorCode.U_S0500, "FK mismatch : " + c.getName().name); } } } } /** * Returns the list of constraints. */ public Constraint[] getConstraints() { return constraintList; } /** * Returns the list of FK constraints. */ public Constraint[] getFKConstraints() { return fkConstraints; } /** * Returns the primary constraint. */ public Constraint getPrimaryConstraint() { return primaryKeyCols.length == 0 ? null : constraintList[0]; } /** columnMap is null for deletes */ void collectFKReadLocks(int[] columnMap, OrderedHashSet set) { for (int i = 0; i < fkMainConstraints.length; i++) { Constraint constraint = fkMainConstraints[i]; Table ref = constraint.getRef(); int[] mainColumns = constraint.getMainColumns(); if (ref == this) { continue; } if (columnMap == null) { if (constraint.core.hasDeleteAction) { int[] cols = constraint.core.deleteAction == SchemaObject.ReferentialAction.CASCADE ? null : constraint .getRefColumns(); if (set.add(ref.getName())) { ref.collectFKReadLocks(cols, set); } } } else if (ArrayUtil.haveCommonElement(columnMap, mainColumns)) { if (set.add(ref.getName())) { ref.collectFKReadLocks(constraint.getRefColumns(), set); } } } } /** columnMap is null for deletes */ void collectFKWriteLocks(int[] columnMap, OrderedHashSet set) { for (int i = 0; i < fkMainConstraints.length; i++) { Constraint constraint = fkMainConstraints[i]; Table ref = constraint.getRef(); int[] mainColumns = constraint.getMainColumns(); if (ref == this) { continue; } if (columnMap == null) { if (constraint.core.hasDeleteAction) { int[] cols = constraint.core.deleteAction == SchemaObject.ReferentialAction.CASCADE ? null : constraint .getRefColumns(); if (set.add(ref.getName())) { ref.collectFKWriteLocks(cols, set); } } } else if (ArrayUtil.haveCommonElement(columnMap, mainColumns)) { if (constraint.core.hasUpdateAction) { if (set.add(ref.getName())) { ref.collectFKWriteLocks(constraint.getRefColumns(), set); } } } } } Constraint getNotNullConstraintForColumn(int colIndex) { for (int i = 0, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.isNotNull() && c.notNullColumnIndex == colIndex) { return c; } } return null; } /** * Returns the UNIQUE or PK constraint with the given column signature. */ Constraint getUniqueConstraintForColumns(int[] cols) { for (int i = 0, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.isUniqueWithColumns(cols)) { return c; } } return null; } /** * Returns any foreign key constraint equivalent to the column sets */ Constraint getFKConstraintForColumns(Table tableMain, int[] mainCols, int[] refCols) { for (int i = 0, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.isEquivalent(tableMain, mainCols, this, refCols)) { return c; } } return null; } /** * Returns any unique Constraint using this index * * @param index */ public Constraint getUniqueOrPKConstraintForIndex(Index index) { for (int i = 0, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.getMainIndex() == index && (c .getConstraintType() == SchemaObject.ConstraintTypes .UNIQUE || c.getConstraintType() == SchemaObject .ConstraintTypes.PRIMARY_KEY)) { return c; } } return null; } /** * Returns the next constraint of a given type * * @param from * @param type */ int getNextConstraintIndex(int from, int type) { for (int i = from, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.getConstraintType() == type) { return i; } } return -1; } /** * Performs the table level checks and adds a column to the table at the * DDL level. Only used at table creation, not at alter column. */ public void addColumn(ColumnSchema column) { String name = column.getName().name; if (findColumn(name) >= 0) { throw Error.error(ErrorCode.X_42504, name); } if (column.isIdentity()) { if (identityColumn != -1) { throw Error.error(ErrorCode.X_42525, name); } identityColumn = columnCount; identitySequence = column.getIdentitySequence(); } addColumnNoCheck(column); } public void addColumnNoCheck(ColumnSchema column) { if (primaryKeyCols != null) { throw Error.runtimeError(ErrorCode.U_S0500, "Table"); } columnList.add(column.getName().name, column); columnCount++; } public boolean hasGeneratedColumn() { return hasGeneratedValues; } public boolean hasLobColumn() { return hasLobColumn; } public boolean hasIdentityColumn() { return identityColumn != -1; } public long getNextIdentity() { return identitySequence.peek(); } /** * Match two valid, equal length, columns arrays for type of columns * * @param col column array from this Table * @param other the other Table object * @param othercol column array from the other Table */ void checkColumnsMatch(int[] col, Table other, int[] othercol) { for (int i = 0; i < col.length; i++) { Type type = colTypes[col[i]]; Type otherType = other.colTypes[othercol[i]]; if (type.typeComparisonGroup != otherType.typeComparisonGroup) { throw Error.error(ErrorCode.X_42562); } } } void checkColumnsMatch(ColumnSchema column, int colIndex) { Type type = colTypes[colIndex]; Type otherType = column.getDataType(); if (type.typeComparisonGroup != otherType.typeComparisonGroup) { throw Error.error(ErrorCode.X_42562); } } /** * For removal or addition of columns, constraints and indexes * * Does not work in this form for FK's as Constraint.ConstraintCore * is not transfered to a referencing or referenced table */ Table moveDefinition(Session session, int newType, ColumnSchema column, Constraint constraint, Index index, int colIndex, int adjust, OrderedHashSet dropConstraints, OrderedHashSet dropIndexes) { boolean newPK = false; if (constraint != null && constraint.constType == SchemaObject.ConstraintTypes.PRIMARY_KEY) { newPK = true; } Table tn; if (isText) { tn = new TextTable(database, tableName, newType); ((TextTable) tn).dataSource = ((TextTable) this).dataSource; ((TextTable) tn).isReversed = ((TextTable) this).isReversed; ((TextTable) tn).isConnected = ((TextTable) this).isConnected; } else { tn = new Table(database, tableName, newType); } if (tableType == TEMP_TABLE) { tn.persistenceScope = persistenceScope; } for (int i = 0; i < columnCount; i++) { ColumnSchema col = (ColumnSchema) columnList.get(i); if (i == colIndex) { if (column != null) { tn.addColumn(column); } if (adjust <= 0) { continue; } } tn.addColumn(col); } if (columnCount == colIndex) { tn.addColumn(column); } int[] pkCols = null; if (hasPrimaryKey() && !dropConstraints.contains( getPrimaryConstraint().getName())) { pkCols = primaryKeyCols; pkCols = ArrayUtil.toAdjustedColumnArray(pkCols, colIndex, adjust); } else if (newPK) { pkCols = constraint.getMainColumns(); } tn.createPrimaryKey(getIndex(0).getName(), pkCols, false); for (int i = 1; i < indexList.length; i++) { Index idx = indexList[i]; if (dropIndexes.contains(idx.getName())) { continue; } int[] colarr = ArrayUtil.toAdjustedColumnArray(idx.getColumns(), colIndex, adjust); Index newIdx = tn.createIndexStructure(idx.getName(), colarr, idx.getColumnDesc(), null, idx.isUnique(), idx.isConstraint(), idx.isForward()); newIdx.setClustered(idx.isClustered()); tn.addIndex(newIdx); } if (index != null) { tn.addIndex(index); } HsqlArrayList newList = new HsqlArrayList(); if (newPK) { constraint.core.mainIndex = tn.indexList[0]; constraint.core.mainTable = tn; constraint.core.mainTableName = tn.tableName; newList.add(constraint); } for (int i = 0; i < constraintList.length; i++) { Constraint c = constraintList[i]; if (dropConstraints.contains(c.getName())) { continue; } c = c.duplicate(); c.updateTable(session, this, tn, colIndex, adjust); newList.add(c); } if (!newPK && constraint != null) { constraint.updateTable(session, this, tn, -1, 0); newList.add(constraint); } tn.constraintList = new Constraint[newList.size()]; newList.toArray(tn.constraintList); tn.updateConstraintLists(); tn.setBestRowIdentifiers(); tn.triggerList = triggerList; tn.triggerLists = triggerLists; for (int i = 0; i < tn.constraintList.length; i++) { tn.constraintList[i].compile(session, tn); } for (int i = 0; i < tn.columnCount; i++) { tn.getColumn(i).compile(session, tn); } return tn; } /** * Used for drop / retype column. */ void checkColumnInCheckConstraint(int colIndex) { for (int i = 0, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.constType == SchemaObject.ConstraintTypes.CHECK && !c.isNotNull() && c.hasColumn(colIndex)) { HsqlName name = c.getName(); throw Error.error(ErrorCode.X_42502, name.getSchemaQualifiedStatementName()); } } } /** * Used for retype column. Checks whether column is in an FK or is * referenced by a FK * @param colIndex index */ void checkColumnInFKConstraint(int colIndex) { for (int i = 0, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.hasColumn(colIndex) && (c.getConstraintType() == SchemaObject .ConstraintTypes.MAIN || c .getConstraintType() == SchemaObject.ConstraintTypes .FOREIGN_KEY)) { HsqlName name = c.getName(); throw Error.error(ErrorCode.X_42533, name.getSchemaQualifiedStatementName()); } } } /** * Returns list of constraints dependent only on one column */ OrderedHashSet getDependentConstraints(int colIndex) { OrderedHashSet set = new OrderedHashSet(); for (int i = 0, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.hasColumnOnly(colIndex)) { set.add(c); } } return set; } /** * Returns list of constraints dependent on more than one column */ OrderedHashSet getContainingConstraints(int colIndex) { OrderedHashSet set = new OrderedHashSet(); for (int i = 0, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.hasColumnPlus(colIndex)) { set.add(c); } } return set; } OrderedHashSet getContainingIndexNames(int colIndex) { OrderedHashSet set = new OrderedHashSet(); for (int i = 0, size = indexList.length; i < size; i++) { Index index = indexList[i]; if (ArrayUtil.find(index.getColumns(), colIndex) != -1) { set.add(index.getName()); } } return set; } /** * Returns list of MAIN constraints dependent on this PK or UNIQUE constraint */ OrderedHashSet getDependentConstraints(Constraint constraint) { OrderedHashSet set = new OrderedHashSet(); for (int i = 0, size = fkMainConstraints.length; i < size; i++) { Constraint c = fkMainConstraints[i]; if (c.core.uniqueName == constraint.getName()) { set.add(c); } } return set; } public OrderedHashSet getDependentExternalConstraints() { OrderedHashSet set = new OrderedHashSet(); for (int i = 0, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.getConstraintType() == SchemaObject.ConstraintTypes.MAIN || c.getConstraintType() == SchemaObject.ConstraintTypes.FOREIGN_KEY) { if (c.core.mainTable != c.core.refTable) { set.add(c); } } } return set; } public OrderedHashSet getUniquePKConstraintNames() { OrderedHashSet set = new OrderedHashSet(); for (int i = 0, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.constType == SchemaObject.ConstraintTypes.UNIQUE || c.constType == SchemaObject.ConstraintTypes.PRIMARY_KEY) { set.add(c.getName()); } } return set; } /** * Used for column defaults and nullability. Checks whether column is in an * FK with a given referential action type. * * @param colIndex index of column * @param actionType referential action of the FK */ void checkColumnInFKConstraint(int colIndex, int actionType) { for (int i = 0, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.getConstraintType() == SchemaObject.ConstraintTypes .FOREIGN_KEY && c .hasColumn(colIndex) && (actionType == c .getUpdateAction() || actionType == c .getDeleteAction())) { HsqlName name = c.getName(); throw Error.error(ErrorCode.X_42533, name.getSchemaQualifiedStatementName()); } } } /** * Returns the identity column index. */ int getIdentityColumnIndex() { return identityColumn; } /** * Returns the index of given column name or throws if not found */ public int getColumnIndex(String name) { int i = findColumn(name); if (i == -1) { throw Error.error(ErrorCode.X_42501, name); } return i; } /** * Returns the index of given column name or -1 if not found. */ public int findColumn(String name) { int index = columnList.getIndex(name); return index; } /** * sets the flag for the presence of any default expression */ void resetDefaultsFlag() { hasDefaultValues = false; for (int i = 0; i < colDefaults.length; i++) { hasDefaultValues |= colDefaults[i] != null; } hasGeneratedValues = false; for (int i = 0; i < colGenerated.length; i++) { hasGeneratedValues |= colGenerated[i]; } hasNotNullColumns = false; for (int i = 0; i < colNotNull.length; i++) { hasNotNullColumns |= colNotNull[i]; } } public int[] getBestRowIdentifiers() { return bestRowIdentifierCols; } public boolean isBestRowIdentifiersStrict() { return bestRowIdentifierStrict; } public Index getClusteredIndex() { for (int i = 0; i < indexList.length; i++) { if (indexList[i].isClustered()) { return indexList[i]; } } return null; } /** * Finds an existing index for a column */ synchronized Index getIndexForColumn(Session session, int col) { int i = bestIndexForColumn[col]; if (i > -1) { return indexList[i]; } switch (tableType) { // case TableBase.MEMORY_TABLE : case TableBase.FUNCTION_TABLE : case TableBase.SYSTEM_SUBQUERY : case TableBase.INFO_SCHEMA_TABLE : case TableBase.VIEW_TABLE : case TableBase.TEMP_TABLE : { Index index = createIndexForColumns(session, new int[]{ col }); return index; } } return null; } boolean isIndexed(int colIndex) { return bestIndexForColumn[colIndex] != -1; } int[] getUniqueNotNullColumnGroup(boolean[] usedColumns) { for (int i = 0, count = constraintList.length; i < count; i++) { Constraint constraint = constraintList[i]; if (constraint.constType == SchemaObject.ConstraintTypes.UNIQUE) { int[] indexCols = constraint.getMainColumns(); if (ArrayUtil.areAllIntIndexesInBooleanArray( indexCols, colNotNull) && ArrayUtil .areAllIntIndexesInBooleanArray( indexCols, usedColumns)) { return indexCols; } } else if (constraint.constType == SchemaObject.ConstraintTypes.PRIMARY_KEY) { int[] indexCols = constraint.getMainColumns(); if (ArrayUtil.areAllIntIndexesInBooleanArray(indexCols, usedColumns)) { return indexCols; } } } return null; } boolean areColumnsNotNull(int[] indexes) { return ArrayUtil.areAllIntIndexesInBooleanArray(indexes, colNotNull); } /** * Shortcut for creating default PK's. */ public void createPrimaryKey() { createPrimaryKey(null, ValuePool.emptyIntArray, false); } /** * Creates a single or multi-column primary key and index. sets the * colTypes array. Finalises the creation of the table. (fredt@users) */ public void createPrimaryKey(HsqlName indexName, int[] columns, boolean columnsNotNull) { if (primaryKeyCols != null) { throw Error.runtimeError(ErrorCode.U_S0500, "Table"); } if (columns == null) { columns = ValuePool.emptyIntArray; } for (int i = 0; i < columns.length; i++) { getColumn(columns[i]).setPrimaryKey(true); } primaryKeyCols = columns; setColumnStructures(); primaryKeyTypes = new Type[primaryKeyCols.length]; ArrayUtil.projectRow(colTypes, primaryKeyCols, primaryKeyTypes); primaryKeyColsSequence = new int[primaryKeyCols.length]; ArrayUtil.fillSequence(primaryKeyColsSequence); HsqlName name = indexName; if (name == null) { name = database.nameManager.newAutoName("IDX", getSchemaName(), getName(), SchemaObject.INDEX); } createPrimaryIndex(primaryKeyCols, primaryKeyTypes, name); setBestRowIdentifiers(); } public void createPrimaryKeyConstraint(HsqlName indexName, int[] columns, boolean columnsNotNull) { createPrimaryKey(indexName, columns, columnsNotNull); Constraint c = new Constraint(indexName, this, getPrimaryIndex(), SchemaObject.ConstraintTypes.PRIMARY_KEY); this.addConstraint(c); } void setColumnStructures() { if (colTypes == null) { colTypes = new Type[columnCount]; } colDefaults = new Expression[columnCount]; colNotNull = new boolean[columnCount]; colGenerated = new boolean[columnCount]; defaultColumnMap = new int[columnCount]; hasDomainColumns = false; for (int i = 0; i < columnCount; i++) { setColumnTypeVars(i); } resetDefaultsFlag(); } void setColumnTypeVars(int i) { ColumnSchema column = getColumn(i); Type dataType = column.getDataType(); if (dataType.isDomainType()) { hasDomainColumns = true; } if (dataType.isLobType()) { hasLobColumn = true; } colTypes[i] = dataType; colNotNull[i] = column.isPrimaryKey() || !column.isNullable(); defaultColumnMap[i] = i; if (column.isIdentity()) { identitySequence = column.getIdentitySequence(); identityColumn = i; } else if (identityColumn == i) { identityColumn = -1; } colDefaults[i] = column.getDefaultExpression(); colGenerated[i] = column.isGenerated(); resetDefaultsFlag(); } /** * Returns direct mapping array. */ int[] getColumnMap() { return defaultColumnMap; } /** * Returns empty mapping array. */ int[] getNewColumnMap() { return new int[columnCount]; } boolean[] getColumnCheckList(int[] columnIndexes) { boolean[] columnCheckList = new boolean[columnCount]; for (int i = 0; i < columnIndexes.length; i++) { int index = columnIndexes[i]; if (index > -1) { columnCheckList[index] = true; } } return columnCheckList; } int[] getColumnIndexes(String[] list) { int[] cols = new int[list.length]; for (int i = 0; i < cols.length; i++) { cols[i] = getColumnIndex(list[i]); } return cols; } int[] getColumnIndexes(OrderedHashSet set) { int[] cols = new int[set.size()]; for (int i = 0; i < cols.length; i++) { cols[i] = getColumnIndex((String) set.get(i)); if (cols[i] == -1) { throw Error.error(ErrorCode.X_42501, (String) set.get(i)); } } return cols; } int[] getColumnIndexes(HashMappedList list) { int[] cols = new int[list.size()]; for (int i = 0; i < cols.length; i++) { cols[i] = ((Integer) list.get(i)).intValue(); } return cols; } /** * Returns the Column object at the given index */ public ColumnSchema getColumn(int i) { return (ColumnSchema) columnList.get(i); } public OrderedHashSet getColumnNameSet(int[] columnIndexes) { OrderedHashSet set = new OrderedHashSet(); for (int i = 0; i < columnIndexes.length; i++) { set.add(((ColumnSchema) columnList.get(i)).getName()); } return set; } public OrderedHashSet getColumnNameSet(boolean[] columnCheckList) { OrderedHashSet set = new OrderedHashSet(); for (int i = 0; i < columnCheckList.length; i++) { if (columnCheckList[i]) { set.add(columnList.get(i)); } } return set; } public void getColumnNames(boolean[] columnCheckList, Set set) { for (int i = 0; i < columnCheckList.length; i++) { if (columnCheckList[i]) { set.add(((ColumnSchema) columnList.get(i)).getName()); } } } public OrderedHashSet getColumnNameSet() { OrderedHashSet set = new OrderedHashSet(); for (int i = 0; i < columnCount; i++) { set.add(((ColumnSchema) columnList.get(i)).getName()); } return set; } /** * Returns array for a new row with SQL DEFAULT value for each column n * where exists[n] is false. This provides default values only where * required and avoids evaluating these values where they will be * overwritten. */ Object[] getNewRowData(Session session) { Object[] data = new Object[columnCount]; int i; if (hasDefaultValues) { for (i = 0; i < columnCount; i++) { Expression def = colDefaults[i]; if (def != null) { data[i] = def.getValue(session, colTypes[i]); } } } return data; } boolean hasTrigger(int trigVecIndex) { return triggerLists[trigVecIndex].length != 0; } /** * Adds a trigger. */ void addTrigger(TriggerDef td, HsqlName otherName) { int index = triggerList.length; if (otherName != null) { int pos = getTriggerIndex(otherName.name); if (pos != -1) { index = pos + 1; } } triggerList = (TriggerDef[]) ArrayUtil.toAdjustedArray(triggerList, td, index, 1); TriggerDef[] list = triggerLists[td.triggerType]; index = list.length; if (otherName != null) { for (int i = 0; i < list.length; i++) { TriggerDef trigger = list[i]; if (trigger.getName().name.equals(otherName.name)) { index = i + 1; break; } } } list = (TriggerDef[]) ArrayUtil.toAdjustedArray(list, td, index, 1); triggerLists[td.triggerType] = list; } /** * Returns a trigger. */ TriggerDef getTrigger(String name) { for (int i = triggerList.length - 1; i >= 0; i--) { if (triggerList[i].getName().name.equals(name)) { return triggerList[i]; } } return null; } public int getTriggerIndex(String name) { for (int i = 0; i < triggerList.length; i++) { if (triggerList[i].getName().name.equals(name)) { return i; } } return -1; } /** * Drops a trigger. */ void removeTrigger(TriggerDef trigger) { TriggerDef td = null; for (int i = 0; i < triggerList.length; i++) { td = triggerList[i]; if (td.getName().name.equals(trigger.getName().name)) { td.terminate(); triggerList = (TriggerDef[]) ArrayUtil.toAdjustedArray(triggerList, null, i, -1); break; } } if (td == null) { return; } int index = td.triggerType; // look in each trigger in list for (int j = 0; j < triggerLists[index].length; j++) { td = triggerLists[index][j]; if (td.getName().name.equals(trigger.getName().name)) { triggerLists[index] = (TriggerDef[]) ArrayUtil.toAdjustedArray( triggerLists[index], null, j, -1); break; } } } /** * Used when dropping all triggers. */ void releaseTriggers() { // look in each trigger list of each type of trigger for (int i = 0; i < TriggerDef.NUM_TRIGS; i++) { for (int j = 0; j < triggerLists[i].length; j++) { triggerLists[i][j].terminate(); } triggerLists[i] = TriggerDef.emptyArray; } triggerList = TriggerDef.emptyArray; } /** * Returns the index of the Index object of the given name or -1 if not found. */ int getIndexIndex(String indexName) { Index[] indexes = indexList; for (int i = 0; i < indexes.length; i++) { if (indexName.equals(indexes[i].getName().name)) { return i; } } // no such index return -1; } /** * Returns the Index object of the given name or null if not found. */ Index getIndex(String indexName) { Index[] indexes = indexList; int i = getIndexIndex(indexName); return i == -1 ? null : indexes[i]; } /** * Return the position of the constraint within the list */ int getConstraintIndex(String constraintName) { for (int i = 0, size = constraintList.length; i < size; i++) { if (constraintList[i].getName().name.equals(constraintName)) { return i; } } return -1; } /** * return the named constriant */ public Constraint getConstraint(String constraintName) { int i = getConstraintIndex(constraintName); return (i < 0) ? null : constraintList[i]; } /** * Returns any unique Constraint using this index * * @param index * @return */ public Constraint getUniqueConstraintForIndex(Index index) { for (int i = 0, size = constraintList.length; i < size; i++) { Constraint c = constraintList[i]; if (c.getMainIndex() == index) { if (c.getConstraintType() == SchemaObject.ConstraintTypes .PRIMARY_KEY || c.getConstraintType() == SchemaObject .ConstraintTypes.UNIQUE) { return c; } } } return null; } /** * remove a named constraint */ void removeConstraint(String name) { int index = getConstraintIndex(name); if (index != -1) { removeConstraint(index); } } void removeConstraint(int index) { constraintList = (Constraint[]) ArrayUtil.toAdjustedArray(constraintList, null, index, -1); updateConstraintLists(); } void renameColumn(ColumnSchema column, String newName, boolean isquoted) { String oldname = column.getName().name; int i = getColumnIndex(oldname); columnList.setKey(i, newName); column.getName().rename(newName, isquoted); } void renameColumn(ColumnSchema column, HsqlName newName) { String oldname = column.getName().name; int i = getColumnIndex(oldname); if (findColumn(newName.name) != -1) { throw Error.error(ErrorCode.X_42504); } columnList.setKey(i, newName.name); column.getName().rename(newName); } public TriggerDef[] getTriggers() { return triggerList; } public boolean isWritable() { return !isReadOnly && !database.databaseReadOnly && !(database.isFilesReadOnly() && (isCached || isText)); } public boolean isInsertable() { return isWritable(); } public boolean isUpdatable() { return isWritable(); } public boolean isTriggerInsertable() { return false; } public boolean isTriggerUpdatable() { return false; } public boolean isTriggerDeletable() { return false; } public int[] getUpdatableColumns() { return defaultColumnMap; } public Table getBaseTable() { return this; } public int[] getBaseTableColumnMap() { return defaultColumnMap; } /** * Used to create an index automatically for system and temp tables. * Used for internal operation tables with null Session param. */ Index createIndexForColumns(Session session, int[] columns) { Index index = null; HsqlName indexName = database.nameManager.newAutoName("IDX_T", getSchemaName(), getName(), SchemaObject.INDEX); try { index = createAndAddIndexStructure(indexName, columns, null, null, false, false, false); } catch (Throwable t) { return null; } switch (tableType) { case TableBase.INFO_SCHEMA_TABLE : case TableBase.TEMP_TABLE : { // session may be an unregisterd sys session session.sessionData.persistentStoreCollection.registerIndex( this); break; } case TableBase.SYSTEM_SUBQUERY : case TableBase.SYSTEM_TABLE : } return index; } void fireTriggers(Session session, int trigVecIndex, RowSetNavigatorDataChange rowSet) { if (!database.isReferentialIntegrity()) { return; } TriggerDef[] trigVec = triggerLists[trigVecIndex]; for (int i = 0, size = trigVec.length; i < size; i++) { TriggerDef td = trigVec[i]; boolean sqlTrigger = td instanceof TriggerDefSQL; if (td.hasOldTable()) { // } td.pushPair(session, null, null); } } void fireTriggers(Session session, int trigVecIndex, RowSetNavigator rowSet) { if (!database.isReferentialIntegrity()) { return; } TriggerDef[] trigVec = triggerLists[trigVecIndex]; for (int i = 0, size = trigVec.length; i < size; i++) { TriggerDef td = trigVec[i]; boolean sqlTrigger = td instanceof TriggerDefSQL; if (td.hasOldTable()) { // } td.pushPair(session, null, null); } } /** * Fires all row-level triggers of the given set (trigger type) * */ void fireTriggers(Session session, int trigVecIndex, Object[] oldData, Object[] newData, int[] cols) { if (!database.isReferentialIntegrity()) { return; } TriggerDef[] trigVec = triggerLists[trigVecIndex]; for (int i = 0, size = trigVec.length; i < size; i++) { TriggerDef td = trigVec[i]; boolean sqlTrigger = td instanceof TriggerDefSQL; if (cols != null && td.getUpdateColumnIndexes() != null && !ArrayUtil.haveCommonElement( td.getUpdateColumnIndexes(), cols)) { continue; } if (td.isForEachRow()) { switch (td.triggerType) { case Trigger.INSERT_BEFORE_ROW : break; case Trigger.INSERT_AFTER_ROW : if (!sqlTrigger) { newData = (Object[]) ArrayUtil.duplicateArray(newData); } break; case Trigger.UPDATE_AFTER_ROW : if (!sqlTrigger) { oldData = (Object[]) ArrayUtil.duplicateArray(oldData); newData = (Object[]) ArrayUtil.duplicateArray(newData); } break; case Trigger.UPDATE_BEFORE_ROW : case Trigger.DELETE_BEFORE_ROW : case Trigger.DELETE_AFTER_ROW : if (!sqlTrigger) { oldData = (Object[]) ArrayUtil.duplicateArray(oldData); } break; } td.pushPair(session, oldData, newData); } else { td.pushPair(session, null, null); } } } /** * Enforce max field sizes according to SQL column definition. * SQL92 13.8 */ public void enforceRowConstraints(Session session, Object[] data) { for (int i = 0; i < columnCount; i++) { Type type = colTypes[i]; ColumnSchema column; if (hasDomainColumns && type.isDomainType()) { Constraint[] constraints = type.userTypeModifier.getConstraints(); column = getColumn(i); for (int j = 0; j < constraints.length; j++) { constraints[j].checkCheckConstraint(session, this, column, (Object) data[i]); } } if (colNotNull[i] && data[i] == null) { String constraintName; Constraint c = getNotNullConstraintForColumn(i); if (c == null) { if (ArrayUtil.find(this.primaryKeyCols, i) > -1) { c = this.getPrimaryConstraint(); } } constraintName = c == null ? "" : c.getName().name; column = getColumn(i); String[] info = new String[] { constraintName, tableName.statementName, column.getName().statementName }; throw Error.error(null, ErrorCode.X_23502, ErrorCode.COLUMN_CONSTRAINT, info); } } } public void enforceTypeLimits(Session session, Object[] data) { for (int i = 0; i < columnCount; i++) { data[i] = colTypes[i].convertToTypeLimits(session, data[i]); } } int indexTypeForColumn(Session session, int col) { int i = bestIndexForColumn[col]; if (i > -1) { return indexList[i].isUnique() && indexList[i].getColumnCount() == 1 ? Index.INDEX_UNIQUE : Index .INDEX_NON_UNIQUE; } switch (tableType) { // case TableBase.MEMORY_TABLE : case TableBase.FUNCTION_TABLE : case TableBase.SYSTEM_SUBQUERY : case TableBase.INFO_SCHEMA_TABLE : case TableBase.VIEW_TABLE : case TableBase.TEMP_TABLE : { return Index.INDEX_NON_UNIQUE; } } return Index.INDEX_NONE; } /** * Finds an existing index for a column group */ synchronized Index getIndexForColumns(Session session, int[] cols) { int i = bestIndexForColumn[cols[0]]; if (i > -1) { return indexList[i]; } switch (tableType) { // case TableBase.MEMORY_TABLE : case TableBase.FUNCTION_TABLE : case TableBase.SYSTEM_SUBQUERY : case TableBase.INFO_SCHEMA_TABLE : case TableBase.VIEW_TABLE : case TableBase.TEMP_TABLE : { Index index = createIndexForColumns(session, cols); return index; } } return null; } /** * Finds an existing index for a full column group */ Index getFullIndexForColumns(int[] cols) { for (int i = 0; i < indexList.length; i++) { if (ArrayUtil.haveEqualArrays(indexList[i].getColumns(), cols, cols.length)) { return indexList[i]; } } return null; } /** * Finds an existing index for a column set or create one for temporary * tables. * * synchronized required for shared INFORMATION_SCHEMA etc. tables */ synchronized IndexUse[] getIndexForColumns(Session session, OrderedIntHashSet set, int opType, boolean ordered) { IndexUse[] indexUse = Index.emptyUseArray; if (set.isEmpty()) { return Index.emptyUseArray; } for (int i = 0, count = indexList.length; i < count; i++) { Index currentIndex = getIndex(i); int[] indexcols = currentIndex.getColumns(); int matchCount = ordered ? set.getOrderedStartMatchCount(indexcols) : set.getStartMatchCount(indexcols); if (matchCount == 0) { continue; } if (matchCount == set.size()) { return currentIndex.asArray(); } if (matchCount == currentIndex.getColumnCount()) { if (currentIndex.isUnique()) { return currentIndex.asArray(); } } if (indexUse.length == 0 && matchCount == currentIndex.getColumnCount()) { indexUse = currentIndex.asArray(); } else { IndexUse[] newList = new IndexUse[indexUse.length + 1]; ArrayUtil.copyArray(indexUse, newList, indexUse.length); newList[newList.length - 1] = new IndexUse(currentIndex, matchCount); indexUse = newList; } } // index is not full; switch (tableType) { case TableBase.FUNCTION_TABLE : case TableBase.SYSTEM_SUBQUERY : case TableBase.INFO_SCHEMA_TABLE : case TableBase.VIEW_TABLE : case TableBase.TEMP_TABLE : { Index selected = createIndexForColumns(session, set.toArray()); if (selected != null) { indexUse = selected.asArray(); } } } return indexUse; } /** * Return the list of file pointers to root nodes for this table's * indexes. */ public final long[] getIndexRootsArray() { PersistentStore store = database.persistentStoreCollection.getStore(this); long[] roots = new long[indexList.length * 2 + 1]; int i = 0; for (int index = 0; index < indexList.length; index++) { CachedObject accessor = store.getAccessor(indexList[index]); roots[i++] = accessor == null ? -1 : accessor.getPos(); } for (int index = 0; index < indexList.length; index++) { roots[i++] = indexList[index].sizeUnique(store); } roots[i] = indexList[0].size(null, store); return roots; } /** * Sets the index roots of a cached/text table to specified file * pointers. If a * file pointer is -1 then the particular index root is null. A null index * root signifies an empty table. Accordingly, all index roots should be * null or all should be a valid file pointer/reference. */ public void setIndexRoots(long[] roots) { if (!isCached) { throw Error.error(ErrorCode.X_42501, tableName.name); } PersistentStore store = database.persistentStoreCollection.getStore(this); int i = 0; for (int index = 0; index < indexList.length; index++) { store.setAccessor(indexList[index], roots[i++]); } long size = roots[indexList.length * 2]; for (int index = 0; index < indexList.length; index++) { store.setElementCount(indexList[index], size, roots[i++]); } } /** * Sets the index roots. */ void setIndexRoots(Session session, String s) { if (!isCached) { throw Error.error(ErrorCode.X_42501, tableName.name); } ParserDQL p = new ParserDQL(session, new Scanner(s)); long[] roots = new long[getIndexCount() * 2 + 1]; p.read(); int i = 0; for (int index = 0; index < getIndexCount(); index++) { long v = p.readBigint(); roots[i++] = v; } try { for (int index = 0; index < getIndexCount() + 1; index++) { long v = p.readBigint(); roots[i++] = v; } } catch (Exception e) { for (i = getIndexCount(); i < roots.length; i++) { roots[i] = -1; } } setIndexRoots(roots); } /** * Mid level method for inserting single rows. Performs constraint checks and * fires row level triggers. */ Row insertSingleRow(Session session, PersistentStore store, Object[] data, int[] changedCols) { if (identityColumn != -1) { setIdentityColumn(session, data); } if (hasGeneratedValues) { setGeneratedColumns(session, data); } if (hasDomainColumns || hasNotNullColumns) { enforceRowConstraints(session, data); } if (isView) { // may have domain column return null; } Row row = (Row) store.getNewCachedObject(session, data, true); session.addInsertAction(this, store, row, changedCols); return row; } /** * Multi-row insert method. Used for CREATE TABLE AS ... queries. */ void insertIntoTable(Session session, Result result) { PersistentStore store = getRowStore(session); RowSetNavigator nav = result.initialiseNavigator(); while (nav.hasNext()) { Object[] data = (Object[]) nav.getNext(); Object[] newData = (Object[]) ArrayUtil.resizeArrayIfDifferent(data, columnCount); insertData(session, store, newData); } } /** * */ public void insertNoCheckFromLog(Session session, Object[] data) { systemUpdateIdentityValue(data); PersistentStore store = getRowStore(session); Row row = (Row) store.getNewCachedObject(session, data, true); session.addInsertAction(this, store, row, null); } /** * Used for system table inserts. No checks. No identity * columns. */ public int insertSys(Session session, PersistentStore store, Result ins) { RowSetNavigator nav = ins.getNavigator(); int count = 0; while (nav.hasNext()) { insertSys(session, store, (Object[]) nav.getNext()); count++; } return count; } /** * Used for subquery inserts. No checks. No identity * columns. */ void insertResult(Session session, PersistentStore store, Result ins) { RowSetNavigator nav = ins.initialiseNavigator(); while (nav.hasNext()) { Object[] data = (Object[]) nav.getNext(); Object[] newData = (Object[]) ArrayUtil.resizeArrayIfDifferent(data, columnCount); insertData(session, store, newData); } } /** * Not for general use. * Used by ScriptReader to unconditionally insert a row into * the table when the .script file is read. */ public void insertFromScript(Session session, PersistentStore store, Object[] data) { systemUpdateIdentityValue(data); if (session.database.getProperties().isVersion18()) { for (int i = 0; i < columnCount; i++) { if (data[i] != null) { int length; if (colTypes[i].isCharacterType() || colTypes[i].isBinaryType()) { if (data[i] instanceof String) { length = ((String) data[i]).length(); } else if (data[i] instanceof BinaryData) { length = (int) ((BinaryData) data[i]).length(session); } else { throw Error.runtimeError(ErrorCode.X_07000, "Table"); } if (length > colTypes[i].precision) { length = ((length / 10) + 1) * 10; colTypes[i] = Type.getType(colTypes[i].typeCode, colTypes[i].getCharacterSet(), colTypes[i].getCollation(), length, 0); ColumnSchema column = getColumn(i); column.setType(colTypes[i]); } } } } } insertData(session, store, data); } /** * For system operations outside transaction constrol */ public void insertData(Session session, PersistentStore store, Object[] data) { Row row = (Row) store.getNewCachedObject(session, data, false); store.indexRow(session, row); } /** * Used by the system tables only */ public void insertSys(Session session, PersistentStore store, Object[] data) { Row row = (Row) store.getNewCachedObject(session, data, false); store.indexRow(session, row); } /** * If there is an identity column in the table, sets * the value and/or adjusts the identiy value for the table. */ protected void setIdentityColumn(Session session, Object[] data) { if (identityColumn != -1) { Number id = (Number) data[identityColumn]; if (identitySequence.getName() == null) { if (id == null) { id = (Number) identitySequence.getValueObject(); data[identityColumn] = id; } else { identitySequence.userUpdate(id.longValue()); } } else { if (id == null) { id = (Number) session.sessionData.getSequenceValue( identitySequence); data[identityColumn] = id; } } if (session != null) { session.setLastIdentity(id); } } } public void setGeneratedColumns(Session session, Object[] data) { if (hasGeneratedValues) { for (int i = 0; i < colGenerated.length; i++) { if (colGenerated[i]) { Expression e = getColumn(i).getGeneratingExpression(); RangeIteratorBase range = session.sessionContext.getCheckIterator( getDefaultRanges()[0]); range.currentData = data; data[i] = e.getValue(session, colTypes[i]); } } } } public void systemSetIdentityColumn(Session session, Object[] data) { if (identityColumn != -1) { Number id = (Number) data[identityColumn]; if (id == null) { id = (Number) identitySequence.getValueObject(); data[identityColumn] = id; } else { identitySequence.userUpdate(id.longValue()); } } } /** * If there is an identity column in the table, sets * the max identity value. */ protected void systemUpdateIdentityValue(Object[] data) { if (identityColumn != -1) { Number id = (Number) data[identityColumn]; if (id != null) { identitySequence.systemUpdate(id.longValue()); } } } /** * For log statements. Find a single row to delete. */ public Row getDeleteRowFromLog(Session session, Object[] data) { Row row = null; PersistentStore store = getRowStore(session); if (hasPrimaryKey()) { RowIterator it = getPrimaryIndex().findFirstRow(session, store, data, primaryKeyColsSequence); row = it.getNextRow(); it.release(); } else if (bestIndex == null) { RowIterator it = rowIterator(session); while (true) { row = it.getNextRow(); if (row == null) { break; } if (Table.compareRows( session, row.getData(), data, defaultColumnMap, colTypes) == 0) { break; } } it.release(); } else { RowIterator it = bestIndex.findFirstRow(session, store, data); while (true) { row = it.getNextRow(); if (row == null) { break; } Object[] rowdata = row.getData(); // reached end of range if (bestIndex.compareRowNonUnique( session, rowdata, data, bestIndex.getColumns()) != 0) { row = null; break; } if (Table.compareRows( session, rowdata, data, defaultColumnMap, colTypes) == 0) { break; } } it.release(); } return row; } public RowIterator rowIteratorClustered(Session session) { PersistentStore store = getRowStore(session); Index index = getClusteredIndex(); if (index == null) { index = getPrimaryIndex(); } return index.firstRow(session, store); } public RowIterator rowIteratorClustered(PersistentStore store) { Index index = getClusteredIndex(); if (index == null) { index = getPrimaryIndex(); } return index.firstRow(store); } public void clearAllData(Session session) { super.clearAllData(session); if (identitySequence != null) { identitySequence.reset(); } } public void clearAllData(PersistentStore store) { super.clearAllData(store); if (identitySequence != null) { identitySequence.reset(); } } /** * Path used for all stores */ public PersistentStore getRowStore(Session session) { if (store != null) { return store; } if (isSessionBased) { return session.sessionData.persistentStoreCollection.getStore( this); } return database.persistentStoreCollection.getStore(this); } public void setDataTimestamp(long timestamp) { dataTimestamp = timestamp; } public QueryExpression getQueryExpression() { return null; } public Expression getDataExpression() { return null; } public void prepareTable() {} public void materialise(Session session) {} public void materialiseCorrelated(Session session) {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/0000755000175000017500000000000012007570424020430 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/Cache.java0000644000175000017500000002726112007547412022307 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.lib.ArraySort; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.ObjectComparator; import org.hsqldb.lib.StopWatch; import org.hsqldb.store.BaseHashMap; /** * New implementation of row caching for CACHED tables.

* * Manages memory for the cache map and its contents based on least recently * used clearup.

* Also provides services for selecting rows to be saved and passing them * to DataFileCache.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.8.0 */ public class Cache extends BaseHashMap { final DataFileCache dataFileCache; private int capacity; // number of Rows private long bytesCapacity; // number of bytes private final CachedObjectComparator rowComparator; private final BaseHashMap.BaseHashIterator objectIterator; // private CachedObject[] rowTable; long cacheBytesLength; // for testing StopWatch saveAllTimer = new StopWatch(false); StopWatch sortTimer = new StopWatch(false); int saveRowCount = 0; Cache(DataFileCache dfc) { super(dfc.capacity(), BaseHashMap.objectKeyOrValue, BaseHashMap.noKeyOrValue, true); maxCapacity = dfc.capacity(); dataFileCache = dfc; capacity = dfc.capacity(); bytesCapacity = dfc.bytesCapacity(); rowComparator = new CachedObjectComparator(); rowTable = new CachedObject[capacity]; cacheBytesLength = 0; objectIterator = new BaseHashIterator(true); comparator = rowComparator; } /** * Structural initialisations take place here. This allows the Cache to * be resized while the database is in operation. */ void resize(int capacity, long bytesCapacity) {} long getTotalCachedBlockSize() { return cacheBytesLength; } /** * Returns a row if in memory cache. */ public synchronized CachedObject get(long pos) { if (accessCount > ACCESS_MAX) { updateAccessCounts(); resetAccessCount(); updateObjectAccessCounts(); } int lookup = getObjectLookup(pos); if (lookup == -1) { return null; } accessTable[lookup] = ++accessCount; CachedObject object = (CachedObject) objectKeyTable[lookup]; return object; } /** * Adds a row to the cache. */ synchronized void put(long key, CachedObject row) { int storageSize = row.getStorageSize(); if (size() >= capacity || storageSize + cacheBytesLength > bytesCapacity) { cleanUp(); if (size() >= capacity) { forceCleanUp(); } } if (accessCount > ACCESS_MAX) { updateAccessCounts(); resetAccessCount(); updateObjectAccessCounts(); } super.addOrRemoveObject(row, row.getPos(), false); row.setInMemory(true); cacheBytesLength += storageSize; } /** * Removes an object from memory cache. Does not release the file storage. */ synchronized CachedObject release(long pos) { CachedObject r = (CachedObject) super.addOrRemoveObject(null, pos, true); if (r == null) { return null; } cacheBytesLength -= r.getStorageSize(); r.setInMemory(false); return r; } /** * Replace a row in the cache. */ synchronized void replace(long key, CachedObject row) { int lookup = super.getLookup(key); objectKeyTable[lookup] = row; } private void updateAccessCounts() { CachedObject r; int count; for (int i = 0; i < objectKeyTable.length; i++) { r = (CachedObject) objectKeyTable[i]; if (r != null) { count = r.getAccessCount(); if (count > accessTable[i]) { accessTable[i] = count; } } } } private void updateObjectAccessCounts() { CachedObject r; int count; for (int i = 0; i < objectKeyTable.length; i++) { r = (CachedObject) objectKeyTable[i]; if (r != null) { count = accessTable[i]; r.updateAccessCount(count); } } } /** * Reduces the number of rows held in this Cache object.

* * Cleanup is done by checking the accessCount of the Rows and removing * the rows with the lowest access count. * * Index operations require that up to 5 recently accessed rows remain * in the cache. * */ private synchronized void cleanUp() { updateAccessCounts(); int removeCount = size() / 2; int accessTarget = getAccessCountCeiling(removeCount, removeCount / 8); int savecount = 0; objectIterator.reset(); for (; objectIterator.hasNext(); ) { CachedObject row = (CachedObject) objectIterator.next(); int currentAccessCount = objectIterator.getAccessCount(); boolean newRow = row.isNew() && row.getStorageSize() >= DataFileCache.initIOBufferSize; boolean oldRow = currentAccessCount <= accessTarget; if (oldRow || newRow) { synchronized (row) { if (row.isKeepInMemory()) { objectIterator.setAccessCount(accessTarget + 1); } else { if (row.hasChanged()) { rowTable[savecount++] = row; } if (oldRow) { row.setInMemory(false); objectIterator.remove(); cacheBytesLength -= row.getStorageSize(); removeCount--; } } } } if (savecount == rowTable.length) { saveRows(savecount); savecount = 0; } } super.setAccessCountFloor(accessTarget); saveRows(savecount); } synchronized void forceCleanUp() { objectIterator.reset(); for (; objectIterator.hasNext(); ) { CachedObject row = (CachedObject) objectIterator.next(); synchronized (row) { if (!row.hasChanged() && !row.isKeepInMemory()) { row.setInMemory(false); objectIterator.remove(); cacheBytesLength -= row.getStorageSize(); } } } } private synchronized void saveRows(int count) { if (count == 0) { return; } long startTime = saveAllTimer.elapsedTime(); rowComparator.setType(CachedObjectComparator.COMPARE_POSITION); sortTimer.zero(); sortTimer.start(); ArraySort.sort(rowTable, 0, count, rowComparator); sortTimer.stop(); saveAllTimer.start(); dataFileCache.saveRows(rowTable, 0, count); saveRowCount += count; saveAllTimer.stop(); logSaveRowsEvent(count, startTime); } /** * Writes out all modified cached Rows. */ synchronized void saveAll() { int savecount = 0; objectIterator.reset(); for (; objectIterator.hasNext(); ) { if (savecount == rowTable.length) { saveRows(savecount); savecount = 0; } CachedObject r = (CachedObject) objectIterator.next(); if (r.hasChanged()) { rowTable[savecount] = r; savecount++; } } saveRows(savecount); } void logSynchEvent() { dataFileCache.logDetailEvent("cache sync"); } void logSaveRowsEvent(int saveCount, long startTime) { StringBuffer sb = new StringBuffer(); sb.append("cache save rows [count,time] totals "); sb.append(saveRowCount); sb.append(',').append(saveAllTimer.elapsedTime()).append(' '); sb.append("operation ").append(saveCount).append(','); sb.append(saveAllTimer.elapsedTime() - startTime).append(' '); // sb.append("txts "); sb.append(dataFileCache.database.txManager.getGlobalChangeTimestamp()); // dataFileCache.logDetailEvent(sb.toString()); } /** * clears out the memory cache */ synchronized public void clear() { super.clear(); cacheBytesLength = 0; } public Iterator getIterator() { objectIterator.reset(); return objectIterator; } static final class CachedObjectComparator implements ObjectComparator { static final int COMPARE_LAST_ACCESS = 0; static final int COMPARE_POSITION = 1; static final int COMPARE_SIZE = 2; private int compareType = COMPARE_POSITION; CachedObjectComparator() {} void setType(int type) { compareType = type; } public int compare(Object a, Object b) { long diff; switch (compareType) { case COMPARE_POSITION : diff = ((CachedObject) a).getPos() - ((CachedObject) b).getPos(); break; case COMPARE_SIZE : diff = ((CachedObject) a).getStorageSize() - ((CachedObject) b).getStorageSize(); break; default : return 0; } return diff == 0 ? 0 : diff > 0 ? 1 : -1; } public int hashCode(Object o) { return o.hashCode(); } public long longKey(Object o) { return ((CachedObject) o).getPos(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/CachedObject.java0000644000175000017500000000474012007547414023601 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.lib.LongLookup; import org.hsqldb.rowio.RowOutputInterface; /** * Interface for an object stored in the memory cache. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.8.0 */ public interface CachedObject { CachedObject[] emptyArray = new CachedObject[]{}; boolean isMemory(); void updateAccessCount(int count); int getAccessCount(); void setStorageSize(int size); int getStorageSize(); long getPos(); void setPos(long pos); boolean isNew(); boolean hasChanged(); boolean isKeepInMemory(); boolean keepInMemory(boolean keep); boolean isInMemory(); void setInMemory(boolean in); void restore(); void destroy(); int getRealSize(RowOutputInterface out); void write(RowOutputInterface out); void write(RowOutputInterface out, LongLookup lookup); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/LobStoreRAFile.java0000644000175000017500000001172112007547414024054 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.Database; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.9.0 */ public class LobStoreRAFile implements LobStore { final int lobBlockSize; RandomAccessInterface file; Database database; public LobStoreRAFile(Database database, int lobBlockSize) { this.lobBlockSize = lobBlockSize; this.database = database; try { String name = database.getPath() + ".lobs"; boolean exists = database.logger.getFileAccess().isStreamElement(name); if (exists) { openFile(); } } catch (Throwable t) { throw Error.error(ErrorCode.DATA_FILE_ERROR, t); } } private void openFile() { try { String name = database.getPath() + ".lobs"; boolean readonly = database.isFilesReadOnly(); if (database.logger.isStoredFileAccess()) { file = ScaledRAFile.newScaledRAFile( database, name, readonly, ScaledRAFile.DATA_FILE_STORED); } else { file = new ScaledRAFileSimple(database, name, readonly ? "r" : "rws"); } } catch (Throwable t) { throw Error.error(ErrorCode.DATA_FILE_ERROR, t); } } public byte[] getBlockBytes(int blockAddress, int blockCount) { if (file == null) { throw Error.error(ErrorCode.FILE_IO_ERROR); } try { long address = (long) blockAddress * lobBlockSize; int count = blockCount * lobBlockSize; byte[] dataBytes = new byte[count]; file.seek(address); file.read(dataBytes, 0, count); return dataBytes; } catch (Throwable t) { throw Error.error(ErrorCode.DATA_FILE_ERROR, t); } } public void setBlockBytes(byte[] dataBytes, int blockAddress, int blockCount) { if (file == null) { openFile(); } try { long address = (long) blockAddress * lobBlockSize; int count = blockCount * lobBlockSize; file.seek(address); file.write(dataBytes, 0, count); } catch (Throwable t) { throw Error.error(ErrorCode.DATA_FILE_ERROR, t); } } public void setBlockBytes(byte[] dataBytes, long position, int offset, int length) { if (length == 0) { return; } if (file == null) { openFile(); } try { file.seek(position); file.write(dataBytes, offset, length); } catch (Throwable t) { throw Error.error(ErrorCode.DATA_FILE_ERROR, t); } } public int getBlockSize() { return lobBlockSize; } public void close() { try { if (file != null) { file.synch(); file.close(); } } catch (Throwable t) { throw Error.error(ErrorCode.DATA_FILE_ERROR, t); } } public void synch() { if (file != null) { file.synch(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/Logger.java0000644000175000017500000021773612007547414022535 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.Constructor; import java.text.SimpleDateFormat; import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger; import org.hsqldb.Database; import org.hsqldb.DatabaseURL; import org.hsqldb.HsqlException; import org.hsqldb.HsqlNameManager; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.NumberSequence; import org.hsqldb.Row; import org.hsqldb.Session; import org.hsqldb.SessionInterface; import org.hsqldb.SqlInvariants; import org.hsqldb.Statement; import org.hsqldb.Table; import org.hsqldb.TableBase; import org.hsqldb.Tokens; import org.hsqldb.TransactionManager; import org.hsqldb.TransactionManagerMV2PL; import org.hsqldb.TransactionManagerMVCC; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.index.IndexAVL; import org.hsqldb.index.IndexAVLMemory; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.FileAccess; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.FrameworkLogger; import org.hsqldb.lib.HashMap; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.InputStreamInterface; import org.hsqldb.lib.InputStreamWrapper; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.SimpleLog; import org.hsqldb.lib.StringUtil; import org.hsqldb.lib.tar.DbBackup; import org.hsqldb.lib.tar.TarMalformatException; import org.hsqldb.scriptio.ScriptWriterBase; import org.hsqldb.scriptio.ScriptWriterText; import org.hsqldb.types.RowType; import org.hsqldb.types.Type; // boucherb@users 20030510 - patch 1.7.2 - added cooperative file locking /** * The public interface of persistence and logging classes.

* * Implements a storage manager wrapper that provides a consistent, * always available interface to storage management for the Database * class, despite the fact not all Database objects actually use file * storage.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.0 */ public class Logger { public SimpleLog appLog; public SimpleLog sqlLog; // FrameworkLogger fwLogger; FrameworkLogger sqlLogger; // private Database database; public boolean checkpointRequired; public boolean checkpointDue; public boolean checkpointDisabled; private boolean logsStatements; // false indicates Log is being opened private boolean loggingEnabled; private boolean syncFile = false; // boolean propIsFileDatabase; boolean propFilesReadOnly; boolean propDatabaseReadOnly; boolean propIncrementBackup; boolean propNioDataFile; long propNioMaxSize = 256 * 1024 * 1024L; int propMaxFreeBlocks = 512; int propCacheMaxRows; int propCacheMaxSize; int propCacheDefragLimit; int propDataFileScale; String propTextSourceDefault = ""; boolean propTextAllowFullPath; int propWriteDelay; int propLogSize; boolean propLogData = true; int propEventLogLevel; int propSqlLogLevel; int propGC; int propTxMode = TransactionManager.LOCKS; boolean propRefIntegrity = true; int propLobBlockSize = 32 * 1024; int propScriptFormat = 0; boolean propLargeData; // Log log; private LockFile lockFile; private Crypto crypto; boolean cryptLobs; public FileAccess fileAccess; public boolean isStoredFileAccess; public boolean isNewStoredFileAccess; String tempDirectoryPath; // private HashMap textCacheList = new HashMap(); // public boolean isNewDatabase; // public boolean isSingleFile; // AtomicInteger backupState = new AtomicInteger(); static final int stateNormal = 0; static final int stateBackup = 1; static final int stateCheckpoint = 2; // public static final String oldFileExtension = ".old"; public static final String newFileExtension = ".new"; public static final String appLogFileExtension = ".app.log"; public static final String sqlLogFileExtension = ".sql.log"; public static final String logFileExtension = ".log"; public static final String scriptFileExtension = ".script"; public static final String propertiesFileExtension = ".properties"; public static final String dataFileExtension = ".data"; public static final String backupFileExtension = ".backup"; public static final String lobsFileExtension = ".lobs"; public static final String lockFileExtension = ".lck"; public Logger(Database database) { this.database = database; } /** * Opens the specified Database object's database files and starts up * the logging process.

* * If the specified Database object is a new database, its database * files are first created. * * @param db the Database * @throws HsqlException if there is a problem, such as the case when * the specified files are in use by another process */ public void openPersistence() { // oj@openoffice.org - changed to file access api String fileaccess_class_name = (String) database.getURLProperties().getProperty( HsqlDatabaseProperties.url_fileaccess_class_name); String storage_class_name = (String) database.getURLProperties().getProperty( HsqlDatabaseProperties.url_storage_class_name); boolean hasFileProps = false; boolean hasScript = false; if (fileaccess_class_name != null) { String storagekey = database.getURLProperties().getProperty( HsqlDatabaseProperties.url_storage_key); try { Class fileAccessClass = null; Class storageClass = null; try { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); fileAccessClass = classLoader.loadClass(fileaccess_class_name); storageClass = classLoader.loadClass(storage_class_name); } catch (ClassNotFoundException e) { fileAccessClass = Class.forName(fileaccess_class_name); storageClass = Class.forName(storage_class_name); } if (storageClass.isAssignableFrom( RandomAccessInterface.class)) { isNewStoredFileAccess = true; } Constructor constructor = fileAccessClass.getConstructor(new Class[]{ Object.class }); fileAccess = (FileAccess) constructor.newInstance(new Object[]{ storagekey }); isStoredFileAccess = true; } catch (java.lang.ClassNotFoundException e) { System.out.println("ClassNotFoundException"); } catch (java.lang.InstantiationException e) { System.out.println("InstantiationException"); } catch (java.lang.IllegalAccessException e) { System.out.println("IllegalAccessException"); } catch (Exception e) { System.out.println("Exception"); } } else { fileAccess = FileUtil.getFileAccess(database.isFilesInJar()); } propIsFileDatabase = DatabaseURL.isFileBasedDatabaseType(database.getType()); database.databaseProperties = new HsqlDatabaseProperties(database); propTextAllowFullPath = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.textdb_allow_full_path); if (propIsFileDatabase) { hasFileProps = database.databaseProperties.load(); hasScript = fileAccess.isStreamElement(database.getPath() + scriptFileExtension); boolean exists; if (database.databaseProperties.isVersion18()) { exists = hasFileProps; database.databaseProperties.setProperty( HsqlDatabaseProperties.hsqldb_inc_backup, false); } else { exists = hasScript; if (!exists) { exists = fileAccess.isStreamElement(database.getPath() + scriptFileExtension + Logger.newFileExtension); if (exists) { database.databaseProperties.setDBModified( HsqlDatabaseProperties.FILES_MODIFIED_NEW); } } } isNewDatabase = !exists; } else { isNewDatabase = true; } if (isNewDatabase) { String name = newUniqueName(); database.setUniqueName(name); boolean checkExists = database.isFilesInJar(); checkExists |= (database.urlProperties .isPropertyTrue(HsqlDatabaseProperties .url_ifexists) || !database.urlProperties .isPropertyTrue(HsqlDatabaseProperties .url_create, true)); if (checkExists) { throw Error.error(ErrorCode.DATABASE_NOT_EXISTS, database.getPath()); } database.databaseProperties.setURLProperties( database.urlProperties); } else { if (!hasFileProps) { database.databaseProperties.setDBModified( HsqlDatabaseProperties.FILES_MODIFIED); } // properties that also apply to existing database only if they exist if (database.urlProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_files_readonly)) { database.databaseProperties.setProperty( HsqlDatabaseProperties.hsqldb_files_readonly, true); } if (database.urlProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_readonly)) { database.databaseProperties.setProperty( HsqlDatabaseProperties.hsqldb_readonly, true); } // hsqldb.lock_file=false is applied if (!database.urlProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_lock_file, true)) { database.databaseProperties.setProperty( HsqlDatabaseProperties.hsqldb_lock_file, false); } int value = database.urlProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_applog, -1); if (value >= 0) { database.databaseProperties.setProperty( HsqlDatabaseProperties.hsqldb_applog, value); } value = database.urlProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_sqllog, -1); if (value >= 0) { database.databaseProperties.setProperty( HsqlDatabaseProperties.hsqldb_sqllog, value); } value = database.urlProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_cache_free_count, -1); if (value >= 0) { database.databaseProperties.setProperty( HsqlDatabaseProperties.hsqldb_cache_free_count, ArrayUtil.getTwoPowerFloor(value)); } } setVariables(); String appLogPath = null; String sqlLogPath = null; if (propIsFileDatabase && !database.isFilesReadOnly()) { appLogPath = database.getPath() + appLogFileExtension; sqlLogPath = database.getPath() + sqlLogFileExtension; } appLog = new SimpleLog(appLogPath, propEventLogLevel, false); sqlLog = new SimpleLog(sqlLogPath, propSqlLogLevel, true); database.setReferentialIntegrity(propRefIntegrity); if (!isFileDatabase()) { return; } checkpointRequired = false; logsStatements = false; boolean useLock = database.getProperties().isPropertyTrue( HsqlDatabaseProperties.hsqldb_lock_file); if (useLock && !database.isFilesReadOnly()) { acquireLock(database.getPath()); } boolean version18 = database.databaseProperties.isVersion18(); if (version18) { database.setUniqueName(newUniqueName()); if (!hasScript) { database.schemaManager.createPublicSchema(); } } log = new Log(database); log.open(); logsStatements = true; loggingEnabled = propLogData && !database.isFilesReadOnly(); if (version18) { HsqlName name = database.schemaManager.findSchemaHsqlName( SqlInvariants.PUBLIC_SCHEMA); if (name != null) { database.schemaManager.setDefaultSchemaHsqlName(name); } checkpoint(false); } if (database.getUniqueName() == null) { database.setUniqueName(newUniqueName()); } } private void setVariables() { String cryptKey = database.urlProperties.getProperty( HsqlDatabaseProperties.url_crypt_key); if (cryptKey != null) { String cryptType = database.urlProperties.getProperty( HsqlDatabaseProperties.url_crypt_type); String cryptProvider = database.urlProperties.getProperty( HsqlDatabaseProperties.url_crypt_provider); crypto = new Crypto(cryptKey, cryptType, cryptProvider); cryptLobs = database.urlProperties.isPropertyTrue( HsqlDatabaseProperties.url_crypt_lobs, true); } if (database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_readonly)) { database.setReadOnly(); } if (database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_files_readonly)) { database.setFilesReadOnly(); } // handle invalid paths as well as access issues if (!database.isFilesReadOnly()) { if (database.getType() == DatabaseURL.S_MEM || isStoredFileAccess) { tempDirectoryPath = database.getProperties().getStringProperty( HsqlDatabaseProperties.hsqldb_temp_directory); } else { tempDirectoryPath = database.getPath() + ".tmp"; } if (tempDirectoryPath != null) { tempDirectoryPath = FileUtil.makeDirectories(tempDirectoryPath); } } propScriptFormat = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_script_format); boolean version18 = database.databaseProperties.isVersion18(); propMaxFreeBlocks = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_cache_free_count); propMaxFreeBlocks = ArrayUtil.getTwoPowerFloor(propMaxFreeBlocks); if (database.urlProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_large_data, false)) { propLargeData = true; } if (!database.urlProperties.isPropertyTrue( HsqlDatabaseProperties.sql_pad_space, true)) { database.collation.setPadding(false); } if (version18 && isStoredFileAccess) { database.collation.setPadding(false); } if (!isNewDatabase && !version18) { return; } if (tempDirectoryPath != null) { int rows = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_result_max_memory_rows); database.setResultMaxMemoryRows(rows); } String tableType = database.databaseProperties.getStringProperty( HsqlDatabaseProperties.hsqldb_default_table_type); if ("CACHED".equalsIgnoreCase(tableType)) { database.schemaManager.setDefaultTableType(TableBase.CACHED_TABLE); } String txMode = database.databaseProperties.getStringProperty( HsqlDatabaseProperties.hsqldb_tx); if (Tokens.T_MVCC.equalsIgnoreCase(txMode)) { propTxMode = TransactionManager.MVCC; } else if (Tokens.T_MVLOCKS.equalsIgnoreCase(txMode)) { propTxMode = TransactionManager.MVLOCKS; } else if (Tokens.T_LOCKS.equalsIgnoreCase(txMode)) { propTxMode = TransactionManager.LOCKS; } switch (propTxMode) { case TransactionManager.LOCKS : break; case TransactionManager.MVLOCKS : database.txManager = new TransactionManagerMV2PL(database); break; case TransactionManager.MVCC : database.txManager = new TransactionManagerMVCC(database); break; } String txLevel = database.databaseProperties.getStringProperty( HsqlDatabaseProperties.hsqldb_tx_level); if (Tokens.T_SERIALIZABLE.equalsIgnoreCase(txLevel)) { database.defaultIsolationLevel = SessionInterface.TX_SERIALIZABLE; } else { database.defaultIsolationLevel = SessionInterface.TX_READ_COMMITTED; } database.txConflictRollback = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_tx_conflict_rollback); database.sqlEnforceNames = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_enforce_names); database.sqlRegularNames = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_regular_names); database.sqlEnforceRefs = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_enforce_refs); database.sqlEnforceSize = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_enforce_size); database.sqlEnforceTypes = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_enforce_types); database.sqlEnforceTDCD = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_enforce_tdcd); database.sqlEnforceTDCU = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_enforce_tdcu); database.sqlTranslateTTI = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.jdbc_translate_tti_types); database.sqlConcatNulls = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_concat_nulls); database.sqlNullsFirst = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_nulls_first); database.sqlUniqueNulls = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_unique_nulls); database.sqlConvertTruncate = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_convert_trunc); database.sqlAvgScale = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.sql_avg_scale); database.sqlDoubleNaN = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_double_nan); database.sqlLongvarIsLob = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_longvar_is_lob); database.sqlSyntaxDb2 = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_syntax_db2); database.sqlSyntaxMss = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_syntax_mss); database.sqlSyntaxMys = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_syntax_mys); database.sqlSyntaxOra = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_syntax_ora); database.sqlSyntaxPgs = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_syntax_pgs); if (database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_compare_in_locale)) { database.collation.setCollationAsLocale(); } propEventLogLevel = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_applog); propSqlLogLevel = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_sqllog); propFilesReadOnly = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_files_readonly); propDatabaseReadOnly = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_readonly); propIncrementBackup = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_inc_backup); propNioDataFile = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_nio_data_file); propNioMaxSize = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_nio_max_size) * 1024 * 1024L; propCacheMaxRows = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_cache_rows); propCacheMaxSize = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_cache_size) * 1024; setLobFileScaleNoCheck( database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_lob_file_scale)); setDataFileScaleNoCheck( database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_cache_file_scale)); propCacheDefragLimit = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_defrag_limit); propWriteDelay = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_write_delay_millis); if (!database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_write_delay)) { propWriteDelay = 0; } propLogSize = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.hsqldb_log_size); propLogData = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.hsqldb_log_data); propGC = database.databaseProperties.getIntegerProperty( HsqlDatabaseProperties.runtime_gc_interval); propRefIntegrity = database.databaseProperties.isPropertyTrue( HsqlDatabaseProperties.sql_ref_integrity); } // fredt@users 20020130 - patch 495484 by boucherb@users /** * Shuts down the logging process using the specified mode.

* * @param closemode The mode in which to shut down the logging * process *

    *
  1. closemode -1 performs SHUTDOWN IMMEDIATELY, equivalent * to a poweroff or crash. *
  2. closemode 0 performs a normal SHUTDOWN that * checkpoints the database normally. *
  3. closemode 1 performs a shutdown compact that scripts * out the contents of any CACHED tables to the log then * deletes the existing *.data file that contains the data * for all CACHED table before the normal checkpoint process * which in turn creates a new, compact *.data file. *
  4. closemode 2 performs a SHUTDOWN SCRIPT. *
* * @return true if closed with no problems or false if a problem was * encountered. */ public boolean closePersistence(int closemode) { if (log == null) { closeAllTextCaches(false); return true; } log.synchLog(); database.lobManager.synch(); database.lobManager.deleteUnusedLobs(); try { switch (closemode) { case Database.CLOSEMODE_IMMEDIATELY : log.shutdown(); break; case Database.CLOSEMODE_NORMAL : log.close(false); break; case Database.CLOSEMODE_COMPACT : case Database.CLOSEMODE_SCRIPT : log.close(true); break; } database.persistentStoreCollection.release(); } catch (Throwable e) { database.logger.logSevereEvent("error closing log", e); log = null; return false; } database.logger.logInfoEvent("Database closed"); log = null; appLog.close(); logsStatements = false; loggingEnabled = false; return true; } String newUniqueName() { String name = StringUtil.toPaddedString( Long.toHexString(System.currentTimeMillis()), 16, '0', false); name = "HSQLDB" + name.substring(6).toUpperCase(Locale.ENGLISH); return name; } /* * Must return correct mode prior to initialisation * @return true if this object encapsulates a non-null Log instance, * else false */ public boolean isLogged() { return propIsFileDatabase && !database.isFilesReadOnly(); } public boolean isAllowedFullPath() { return this.propTextAllowFullPath; } /** * All usage of FrameworkLogger should call this method before using an * instance. * * It ensures and requires that no logging should take place before a new * database unique name has been created for a new database or read from the * .script file for an old database.

* * An instance is returned when: * - database unique name has been created * - FrameworkLogger would use log4j * * Otherwise null is returned. * * This tactic avoids usage of file-based jdk logging for the time being. * */ private void getEventLogger() { if (fwLogger != null) { return; } String name = database.getUniqueName(); if (name == null) { // The database unique name is set up at different times // depending on upgraded / exiting / new databases. // Therefore FrameworkLogger is not used until the unique // name is known. return; } fwLogger = FrameworkLogger.getLog(SimpleLog.logTypeNameEngine, "hsqldb.db." + database.getUniqueName()); /* sqlLogger = FrameworkLogger.getLog(SimpleLog.logTypeNameEngine, "hsqldb.sql." + database.getUniqueName()); */ } public void setEventLogLevel(int level, boolean logSql) { if (level < SimpleLog.LOG_NONE || level > SimpleLog.LOG_DETAIL) { throw Error.error(ErrorCode.X_42556); } if (logSql) { propSqlLogLevel = level; sqlLog.setLevel(level); } else { propEventLogLevel = level; appLog.setLevel(level); } } public void logSevereEvent(String message, Throwable t) { getEventLogger(); if (fwLogger != null) { fwLogger.severe(message, t); } if (appLog != null) { if (t == null) { appLog.logContext(SimpleLog.LOG_ERROR, message); } else { appLog.logContext(t, message, SimpleLog.LOG_ERROR); } } } public void logWarningEvent(String message, Throwable t) { getEventLogger(); if (fwLogger != null) { fwLogger.warning(message, t); } appLog.logContext(t, message, SimpleLog.LOG_ERROR); } public void logInfoEvent(String message) { getEventLogger(); if (fwLogger != null) { fwLogger.info(message); } appLog.logContext(SimpleLog.LOG_NORMAL, message); } public void logDetailEvent(String message) { getEventLogger(); if (fwLogger != null) { fwLogger.finest(message); } if (appLog != null) { appLog.logContext(SimpleLog.LOG_DETAIL, message); } } public void logStatementEvent(Session session, Statement statement, Object[] paramValues, int level) { if (sqlLog != null && level <= propSqlLogLevel) { String sessionId = Long.toString(session.getId()); String sql = statement.getSQL(); String values = ""; if (sql.length() > 256) { sql = sql.substring(0, 256); } if (paramValues != null && paramValues.length > 0) { values = RowType.convertToSQLString( paramValues, statement.getParametersMetaData().getParameterTypes(), 32); } sqlLog.logContext(level, sessionId, sql, values); } } public int getSqlEventLogLevel() { return propSqlLogLevel; } /** * Returns the Cache object or null if one doesn't exist. */ private DataFileCache getCache() { if (log == null) { return null; } else { return log.getCache(); } } /** * Returns true if Cache object exists. */ private boolean hasCache() { if (log == null) { return false; } else { return log.hasCache(); } } /** * Records a Log entry for the specified SQL statement, on behalf of * the specified Session object. */ public synchronized void writeOtherStatement(Session session, String statement) { if (loggingEnabled) { log.writeOtherStatement(session, statement); } } /** * Used exclusively by PersistentStore objects */ public synchronized void writeInsertStatement(Session session, Row row, Table table) { if (loggingEnabled) { log.writeInsertStatement(session, row, table); } } /** * Used exclusively by PersistentStore objects */ public synchronized void writeDeleteStatement(Session session, Table t, Object[] row) { if (loggingEnabled) { log.writeDeleteStatement(session, t, row); } } /** * Used at transaction commit */ public synchronized void writeSequenceStatement(Session session, NumberSequence s) { if (loggingEnabled) { log.writeSequenceStatement(session, s); } } /** * Used at transaction commit */ public synchronized void writeCommitStatement(Session session) { if (loggingEnabled) { log.writeCommitStatement(session); } } public synchronized void synchLog() { if (loggingEnabled) { log.synchLog(); } } /** * Checkpoints the database.

* * The most important effect of calling this method is to cause the * log file to be rewritten in the most efficient form to * reflect the current state of the database, i.e. only the DDL and * insert DML required to recreate the database in its present state. * Other house-keeping duties are performed w.r.t. other database * files, in order to ensure as much as possible the ACID properites * of the database. * * @throws HsqlException if there is a problem checkpointing the * database */ public synchronized void checkpoint(boolean mode) { if (!backupState.compareAndSet(stateNormal, stateCheckpoint)) { throw Error.error(ErrorCode.ACCESS_IS_DENIED); } try { checkpointInternal(mode); } finally { backupState.set(stateNormal); } } void checkpointInternal(boolean mode) { if (logsStatements) { database.logger.logInfoEvent("Checkpoint start"); log.checkpoint(mode); database.sessionManager.resetLoggedSchemas(); database.logger.logInfoEvent("Checkpoint end"); } else if (!isFileDatabase()) { database.lobManager.deleteUnusedLobs(); } checkpointRequired = false; checkpointDue = false; } /** * Sets the maximum size to which the log file can grow * before being automatically checkpointed. * * @param megas size in MB */ public synchronized void setLogSize(int megas) { propLogSize = megas; if (log != null) { log.setLogSize(propLogSize); } } /** * Sets logging on or off. * * @param megas size in MB */ public synchronized void setLogData(boolean mode) { propLogData = mode; loggingEnabled = propLogData && !database.isFilesReadOnly(); loggingEnabled &= logsStatements; } /** * Sets the type of script file, currently 0 for text (default) * 3 for compressed * * @param i The type */ public synchronized void setScriptType(int format) { if (format == propScriptFormat) { return; } propScriptFormat = format; checkpointRequired = true; } /** * Sets the log write delay mode to number of seconds. By default * executed commands written to the log are committed fully at most * 1 second after they are executed. This improves performance for * applications that execute a large number * of short running statements in a short period of time, but risks * failing to log some possibly large number of statements in the * event of a crash. A small value improves recovery. * A value of 0 will severly slow down logging when autocommit is on, * or many short transactions are committed. * * @param delay in milliseconds */ public synchronized void setWriteDelay(int delay) { propWriteDelay = delay; if (log != null) { syncFile = (delay == 0); log.setWriteDelay(delay); } } public Crypto getCrypto() { return crypto; } public int getWriteDelay() { return propWriteDelay; } public int getLogSize() { return propLogSize; } public int getLobBlockSize() { return propLobBlockSize; } public synchronized void setIncrementBackup(boolean val) { if (val == propIncrementBackup) { return; } if (log != null) { log.setIncrementBackup(val); if (log.hasCache()) { checkpointRequired = true; } } propIncrementBackup = val; } public void setCacheMaxRows(int value) { propCacheMaxRows = value; } public int getCacheRowsDefault() { return propCacheMaxRows; } public void setCacheSize(int value) { propCacheMaxSize = value * 1024; } public int getCacheSize() { return propCacheMaxSize; } public void setDataFileScale(int value) { if (propDataFileScale == value) { return; } checkPower(value, 10); if (value < 8 && value != 1) { throw Error.error(ErrorCode.X_42556); } if (hasCache()) { throw Error.error(ErrorCode.DATA_FILE_IN_USE); } propDataFileScale = value; } public void setDataFileScaleNoCheck(int value) { checkPower(value, 10); if (value < 8 && value != 1) { throw Error.error(ErrorCode.X_42556); } propDataFileScale = value; } public int getDataFileScale() { return propDataFileScale; } public int getDataFileFactor() { return propLargeData ? 128 : 1; } public void setLobFileScale(int value) { if (propLobBlockSize == value * 1024) { return; } checkPower(value, 5); if (database.lobManager.getLobCount() > 0) { throw Error.error(ErrorCode.DATA_FILE_IN_USE); } propLobBlockSize = value * 1024; database.lobManager.close(); database.lobManager.open(); } public void setLobFileScaleNoCheck(int value) { checkPower(value, 5); propLobBlockSize = value * 1024; } public int getLobFileScale() { return propLobBlockSize / 1024; } public void setDefagLimit(int value) { propCacheDefragLimit = value; } public int getDefragLimit() { return propCacheDefragLimit; } public void setDefaultTextTableProperties(String source, HsqlProperties props) { props.setProperty(HsqlDatabaseProperties.url_check_props, true); database.getProperties().setURLProperties(props); this.propTextSourceDefault = source; } public void setNioDataFile(boolean value) { propNioDataFile = value; } public void setNioMaxSize(int value) { if (value < 8) { throw Error.error(ErrorCode.X_42556); } if (!ArrayUtil.isTwoPower(value, 10)) { if (value < 1024 || value % 512 != 0) { throw Error.error(ErrorCode.X_42556); } } propNioMaxSize = value * 1024L * 1024L; } public FileAccess getFileAccess() { return fileAccess; } public boolean isStoredFileAccess() { return isStoredFileAccess; } public boolean isNewStoredFileAccess() { return isNewStoredFileAccess; } public boolean isFileDatabase() { return propIsFileDatabase; } public String getTempDirectoryPath() { return tempDirectoryPath; } static void checkPower(int n, int max) { if (!ArrayUtil.isTwoPower(n, max)) { throw Error.error(ErrorCode.X_42556); } } public synchronized void setCheckpointRequired() { checkpointRequired = true; } public synchronized boolean needsCheckpointReset() { if (checkpointRequired && !checkpointDue && !checkpointDisabled) { checkpointDue = true; checkpointRequired = false; return true; } return false; } public boolean hasLockFile() { return lockFile != null; } public void acquireLock(String path) { if (lockFile != null) { return; } lockFile = LockFile.newLockFileLock(path); } public void releaseLock() { try { if (lockFile != null) { lockFile.tryRelease(); } } catch (Exception e) {} lockFile = null; } public PersistentStore newStore(Session session, PersistentStoreCollection collection, TableBase table) { switch (table.getTableType()) { case TableBase.CACHED_TABLE : DataFileCache cache = getCache(); if (cache == null) { break; } return new RowStoreAVLDisk(collection, cache, (Table) table); case TableBase.FUNCTION_TABLE : case TableBase.MEMORY_TABLE : case TableBase.SYSTEM_TABLE : return new RowStoreAVLMemory(collection, (Table) table); case TableBase.TEXT_TABLE : return new RowStoreAVLDiskData(collection, (Table) table); case TableBase.INFO_SCHEMA_TABLE : return new RowStoreAVLHybridExtended(session, collection, table, false); case TableBase.TEMP_TABLE : return new RowStoreAVLHybridExtended(session, collection, table, true); case TableBase.CHANGE_SET_TABLE : return new RowStoreDataChange(session, collection, table); case TableBase.RESULT_TABLE : case TableBase.SYSTEM_SUBQUERY : case TableBase.VIEW_TABLE : case TableBase.TRANSITION_TABLE : if (session == null) { return null; } return new RowStoreAVLHybrid(session, collection, table, true); } throw Error.runtimeError(ErrorCode.U_S0500, "Logger"); } public Index newIndex(HsqlName name, long id, TableBase table, int[] columns, boolean[] descending, boolean[] nullsLast, Type[] colTypes, boolean pk, boolean unique, boolean constraint, boolean forward) { switch (table.getTableType()) { case TableBase.INFO_SCHEMA_TABLE : case TableBase.SYSTEM_TABLE : case TableBase.MEMORY_TABLE : return new IndexAVLMemory(name, id, table, columns, descending, nullsLast, colTypes, pk, unique, constraint, forward); case TableBase.CACHED_TABLE : case TableBase.CHANGE_SET_TABLE : case TableBase.FUNCTION_TABLE : case TableBase.TEXT_TABLE : case TableBase.TEMP_TABLE : case TableBase.RESULT_TABLE : case TableBase.SYSTEM_SUBQUERY : case TableBase.VIEW_TABLE : case TableBase.TRANSITION_TABLE : return new IndexAVL(name, id, table, columns, descending, nullsLast, colTypes, pk, unique, constraint, forward); } throw Error.runtimeError(ErrorCode.U_S0500, "Logger"); } public Index newIndex(Table table, Index index, int[] columns) { boolean[] modeFlags = new boolean[columns.length]; Type[] colTypes = new Type[columns.length]; ArrayUtil.projectRow(table.getColumnTypes(), columns, colTypes); return newIndex(index.getName(), index.getPersistenceId(), table, columns, modeFlags, modeFlags, colTypes, false, false, false, false); } public String getValueStringForProperty(String name) { String value = ""; if (HsqlDatabaseProperties.hsqldb_tx.equals(name)) { switch (database.txManager.getTransactionControl()) { case TransactionManager.MVCC : value = Tokens.T_MVCC.toLowerCase(); break; case TransactionManager.MVLOCKS : value = Tokens.T_MVLOCKS.toLowerCase(); break; case TransactionManager.LOCKS : value = Tokens.T_LOCKS.toLowerCase(); break; } return value; } if (HsqlDatabaseProperties.hsqldb_tx_level.equals(name)) { switch (database.defaultIsolationLevel) { case SessionInterface.TX_READ_COMMITTED : value = new StringBuffer(Tokens.T_READ).append(' ').append( Tokens.T_COMMITTED).toString().toLowerCase(); break; case SessionInterface.TX_SERIALIZABLE : value = Tokens.T_SERIALIZABLE.toLowerCase(); break; } return value; } if (HsqlDatabaseProperties.hsqldb_applog.equals(name)) { return String.valueOf(appLog.getLevel()); } if (HsqlDatabaseProperties.hsqldb_lob_file_scale.equals(name)) { return String.valueOf(propLobBlockSize); } if (HsqlDatabaseProperties.hsqldb_cache_file_scale.equals(name)) { return String.valueOf(propDataFileScale); } if (HsqlDatabaseProperties.hsqldb_cache_free_count.equals(name)) { return String.valueOf(this.propMaxFreeBlocks); } if (HsqlDatabaseProperties.hsqldb_cache_rows.equals(name)) { return String.valueOf(this.propCacheMaxRows); } if (HsqlDatabaseProperties.hsqldb_cache_size.equals(name)) { String.valueOf(this.propCacheMaxSize); } if (HsqlDatabaseProperties.hsqldb_default_table_type.equals(name)) { return database.schemaManager.getDefaultTableType() == TableBase.CACHED_TABLE ? "cached" : "memory"; } if (HsqlDatabaseProperties.hsqldb_defrag_limit.equals(name)) { return String.valueOf(this.propCacheDefragLimit); } if (HsqlDatabaseProperties.hsqldb_files_readonly.equals(name)) { return database.databaseProperties.getPropertyString( HsqlDatabaseProperties.hsqldb_files_readonly); } if (HsqlDatabaseProperties.hsqldb_lock_file.equals(name)) { return database.databaseProperties.getPropertyString( HsqlDatabaseProperties.hsqldb_lock_file); } if (HsqlDatabaseProperties.hsqldb_log_data.equals(name)) { return String.valueOf(this.propLogData); } if (HsqlDatabaseProperties.hsqldb_log_size.equals(name)) { return String.valueOf(this.propLogSize); } if (HsqlDatabaseProperties.hsqldb_nio_data_file.equals(name)) { return String.valueOf(this.propNioDataFile); } if (HsqlDatabaseProperties.hsqldb_nio_max_size.equals(name)) { return String.valueOf(this.propNioMaxSize); } if (HsqlDatabaseProperties.hsqldb_script_format.equals(name)) { return ScriptWriterBase.LIST_SCRIPT_FORMATS[0].toLowerCase(); } if (HsqlDatabaseProperties.hsqldb_temp_directory.equals(name)) { return null; } if (HsqlDatabaseProperties.hsqldb_result_max_memory_rows.equals( name)) { return String.valueOf(database.getResultMaxMemoryRows()); } if (HsqlDatabaseProperties.hsqldb_write_delay.equals(name)) { return String.valueOf(this.propWriteDelay != 0); } if (HsqlDatabaseProperties.hsqldb_write_delay_millis.equals(name)) { return String.valueOf(this.propWriteDelay); } if (HsqlDatabaseProperties.sql_ref_integrity.equals(name)) { return database.isReferentialIntegrity() ? "true" : "false"; } if (HsqlDatabaseProperties.sql_compare_in_locale.equals(name)) { return null; } if (HsqlDatabaseProperties.sql_enforce_size.equals(name)) { return String.valueOf(database.sqlEnforceSize); } if (HsqlDatabaseProperties.sql_enforce_refs.equals(name)) { return String.valueOf(database.sqlEnforceRefs); } if (HsqlDatabaseProperties.sql_enforce_names.equals(name)) { return String.valueOf(database.sqlEnforceNames); } if (HsqlDatabaseProperties.sql_regular_names.equals(name)) { return String.valueOf(database.sqlRegularNames); } if (HsqlDatabaseProperties.sql_enforce_types.equals(name)) { return String.valueOf(database.sqlEnforceTypes); } if (HsqlDatabaseProperties.jdbc_translate_tti_types.equals(name)) { return String.valueOf(database.sqlTranslateTTI); } if (HsqlDatabaseProperties.sql_longvar_is_lob.equals(name)) { return String.valueOf(database.sqlLongvarIsLob); } /* if (HsqlDatabaseProperties.sql_identity_is_pk.equals(name)) { return null; } if (HsqlDatabaseProperties.textdb_cache_scale.equals(name)) { return null; } if (HsqlDatabaseProperties.textdb_cache_size_scale.equals(name)) { return null; } if (HsqlDatabaseProperties.textdb_all_quoted.equals(name)) { return null; } if (HsqlDatabaseProperties.textdb_allow_full_path.equals(name)) { return null; } if (HsqlDatabaseProperties.textdb_encoding.equals(name)) { return null; } if (HsqlDatabaseProperties.textdb_ignore_first.equals(name)) { return null; } if (HsqlDatabaseProperties.textdb_quoted.equals(name)) { return null; } if (HsqlDatabaseProperties.textdb_fs.equals(name)) { return null; } if (HsqlDatabaseProperties.textdb_vs.equals(name)) { return null; } if (HsqlDatabaseProperties.textdb_lvs.equals(name)) { return null; } */ return null; } public String[] getPropertiesSQL(boolean indexRoots) { HsqlArrayList list = new HsqlArrayList(); StringBuffer sb = new StringBuffer(); sb.append("SET DATABASE ").append(Tokens.T_UNIQUE).append(' '); sb.append(Tokens.T_NAME).append(' ').append(database.getUniqueName()); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_GC).append(' '); sb.append(propGC); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_DEFAULT).append(' '); sb.append(Tokens.T_RESULT).append(' ').append(Tokens.T_MEMORY); sb.append(' ').append(Tokens.T_ROWS).append(' '); sb.append(database.getResultMaxMemoryRows()); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_EVENT).append(' '); sb.append(Tokens.T_LOG).append(' ').append(Tokens.T_LEVEL); sb.append(' ').append(propEventLogLevel); list.add(sb.toString()); sb.setLength(0); if (propSqlLogLevel != SimpleLog.LOG_NONE) { sb.append("SET DATABASE ").append(Tokens.T_EVENT).append(' '); sb.append(Tokens.T_LOG).append(' ').append(Tokens.T_SQL); sb.append(' ').append(Tokens.T_LEVEL); sb.append(' ').append(propEventLogLevel); list.add(sb.toString()); sb.setLength(0); } sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_NAMES).append(' '); sb.append(database.sqlEnforceNames ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_REGULAR).append(' '); sb.append(Tokens.T_NAMES).append(' '); sb.append(database.sqlRegularNames ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_REFERENCES).append(' '); sb.append(database.sqlEnforceRefs ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_SIZE).append(' '); sb.append(database.sqlEnforceSize ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_TYPES).append(' '); sb.append(database.sqlEnforceTypes ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_TDC).append(' '); sb.append(Tokens.T_DELETE).append(' '); sb.append(database.sqlEnforceTDCD ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_TDC).append(' '); sb.append(Tokens.T_UPDATE).append(' '); sb.append(database.sqlEnforceTDCU ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_TRANSLATE).append(' ').append(Tokens.T_TTI); sb.append(' ').append(Tokens.T_TYPES).append(' '); sb.append(database.sqlTranslateTTI ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_CONCAT_WORD).append(' '); sb.append(Tokens.T_NULLS).append(' '); sb.append(database.sqlConcatNulls ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_NULLS).append(' '); sb.append(Tokens.T_FIRST).append(' '); sb.append(database.sqlUniqueNulls ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_UNIQUE).append(' '); sb.append(Tokens.T_NULLS).append(' '); sb.append(database.sqlUniqueNulls ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_CONVERT).append(' '); sb.append(Tokens.T_TRUNCATE).append(' '); sb.append(database.sqlConvertTruncate ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_AVG).append(' '); sb.append(Tokens.T_SCALE).append(' '); sb.append(database.sqlAvgScale); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_DOUBLE).append(' '); sb.append(Tokens.T_NAN).append(' '); sb.append(database.sqlDoubleNaN ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_LONGVAR).append(' '); sb.append(Tokens.T_IS).append(' '); sb.append(Tokens.T_LOB).append(' '); sb.append(database.sqlLongvarIsLob ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); if (database.sqlSyntaxDb2) { sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_SYNTAX).append(' '); sb.append(Tokens.T_DB2).append(' '); sb.append(database.sqlSyntaxOra ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); } if (database.sqlSyntaxMss) { sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_SYNTAX).append(' '); sb.append(Tokens.T_MSS).append(' '); sb.append(database.sqlSyntaxMss ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); } if (database.sqlSyntaxMys) { sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_SYNTAX).append(' '); sb.append(Tokens.T_MYS).append(' '); sb.append(database.sqlSyntaxMys ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); } if (database.sqlSyntaxOra) { sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_SYNTAX).append(' '); sb.append(Tokens.T_ORA).append(' '); sb.append(database.sqlSyntaxOra ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); } if (database.sqlSyntaxPgs) { sb.append("SET DATABASE ").append(Tokens.T_SQL).append(' '); sb.append(Tokens.T_SYNTAX).append(' '); sb.append(Tokens.T_PGS).append(' '); sb.append(database.sqlSyntaxPgs ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); } sb.append("SET DATABASE ").append(Tokens.T_TRANSACTION); sb.append(' ').append(Tokens.T_CONTROL).append(' '); switch (database.txManager.getTransactionControl()) { case TransactionManager.MVCC : sb.append(Tokens.T_MVCC); break; case TransactionManager.MVLOCKS : sb.append(Tokens.T_MVLOCKS); break; case TransactionManager.LOCKS : sb.append(Tokens.T_LOCKS); break; } list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_DEFAULT).append(' '); sb.append(Tokens.T_ISOLATION).append(' ').append(Tokens.T_LEVEL); sb.append(' '); switch (database.defaultIsolationLevel) { case SessionInterface.TX_READ_COMMITTED : sb.append(Tokens.T_READ).append(' ').append( Tokens.T_COMMITTED); break; case SessionInterface.TX_SERIALIZABLE : sb.append(Tokens.T_SERIALIZABLE); break; } list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_TRANSACTION); sb.append(' ').append(Tokens.T_ROLLBACK).append(' '); sb.append(Tokens.T_ON).append(' '); sb.append(Tokens.T_CONFLICT).append(' '); sb.append(database.txConflictRollback ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET DATABASE ").append(Tokens.T_TEXT).append(' '); sb.append(Tokens.T_TABLE).append(' ').append(Tokens.T_DEFAULTS); sb.append(' ').append('\''); sb.append(propTextSourceDefault).append('\''); list.add(sb.toString()); sb.setLength(0); if (database.schemaManager.getDefaultTableType() == TableBase.CACHED_TABLE) { list.add("SET DATABASE DEFAULT TABLE TYPE CACHED"); } int delay = propWriteDelay; boolean millis = delay > 0 && delay < 1000; if (millis) { if (delay < 20) { delay = 20; } } else { delay /= 1000; } sb.setLength(0); sb.append("SET FILES ").append(Tokens.T_WRITE).append(' '); sb.append(Tokens.T_DELAY).append(' ').append(delay); if (millis) { sb.append(' ').append(Tokens.T_MILLIS); } list.add(sb.toString()); sb.setLength(0); sb.append("SET FILES ").append(Tokens.T_BACKUP); sb.append(' ').append(Tokens.T_INCREMENT).append(' '); sb.append(propIncrementBackup ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET FILES ").append(Tokens.T_CACHE); sb.append(' ').append(Tokens.T_SIZE).append(' '); sb.append(propCacheMaxSize / 1024); list.add(sb.toString()); sb.setLength(0); sb.append("SET FILES ").append(Tokens.T_CACHE); sb.append(' ').append(Tokens.T_ROWS).append(' '); sb.append(propCacheMaxRows); list.add(sb.toString()); { int fileScale = propDataFileScale; if (!indexRoots && fileScale < 32) { fileScale = 32; } sb.setLength(0); sb.append("SET FILES ").append(Tokens.T_SCALE); sb.append(' ').append(fileScale); list.add(sb.toString()); sb.setLength(0); } sb.append("SET FILES ").append(Tokens.T_LOB).append(' ').append( Tokens.T_SCALE); sb.append(' ').append(getLobFileScale()); list.add(sb.toString()); sb.setLength(0); sb.append("SET FILES ").append(Tokens.T_DEFRAG); sb.append(' ').append(propCacheDefragLimit); list.add(sb.toString()); sb.setLength(0); sb.append("SET FILES ").append(Tokens.T_NIO); sb.append(' ').append(propNioDataFile ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET FILES ").append(Tokens.T_NIO).append(' ').append( Tokens.T_SIZE); sb.append(' ').append(propNioMaxSize / (1024 * 1024)); list.add(sb.toString()); sb.setLength(0); sb.append("SET FILES ").append(Tokens.T_LOG).append(' '); sb.append(propLogData ? Tokens.T_TRUE : Tokens.T_FALSE); list.add(sb.toString()); sb.setLength(0); sb.append("SET FILES ").append(Tokens.T_LOG).append(' '); sb.append(Tokens.T_SIZE).append(' ').append(propLogSize); list.add(sb.toString()); sb.setLength(0); /* if (propTempDirectoryPath != null) { sb.append("SET FILES ").append(Tokens.T_TEMP).append(' '); sb.append(Tokens.T_PATH).append(' '); sb.append(propTempDirectoryPath); list.add(sb.toString()); sb.setLength(0); } */ String[] array = new String[list.size()]; list.toArray(array); return array; } public void backup(String destPath, boolean script, boolean blocking, boolean compressed) { if (!backupState.compareAndSet(stateNormal, stateBackup)) { throw Error.error(ErrorCode.BACKUP_ERROR, "BACKUP IN PROGRESS"); } try { backupInternal(destPath, script, blocking, compressed); } finally { backupState.set(stateNormal); } } private SimpleDateFormat backupFileFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); private Character runtimeFileDelim = new Character(System.getProperty("file.separator").charAt(0)); DbBackup backup; void backupInternal(String destPath, boolean script, boolean blocking, boolean compressed) { String scriptName = null; String dbPath = database.getPath(); /* If want to add db Id also, will need to pass either Database * instead of dbPath, or pass dbPath + Id from StatementCommand. */ String instanceName = new File(dbPath).getName(); char lastChar = destPath.charAt(destPath.length() - 1); boolean generateName = (lastChar == '/' || lastChar == runtimeFileDelim.charValue()); String defaultCompressionSuffix = compressed ? ".tar.gz" : ".tar"; File archiveFile = generateName ? (new File(destPath.substring(0, destPath.length() - 1), instanceName + '-' + backupFileFormat.format(new java.util.Date()) + defaultCompressionSuffix)) : (new File(destPath)); boolean nameImpliesCompress = archiveFile.getName().endsWith(".tar.gz") || archiveFile.getName().endsWith(".tgz"); if ((!nameImpliesCompress) && !archiveFile.getName().endsWith(".tar")) { throw Error.error(null, ErrorCode.UNSUPPORTED_FILENAME_SUFFIX, 0, new String[] { archiveFile.getName(), ".tar, .tar.gz, .tgz" }); } if (compressed != nameImpliesCompress) { throw Error.error(null, ErrorCode.COMPRESSION_SUFFIX_MISMATCH, 0, new Object[] { new Boolean(compressed), archiveFile.getName() }); } if (blocking) { log.checkpointClose(); } try { database.logger.logInfoEvent("Initiating backup of instance '" + instanceName + "'"); // By default, DbBackup will throw if archiveFile (or // corresponding work file) already exist. That's just what we // want here. if (script) { String path = getTempDirectoryPath(); if (path == null) { return; } path = path + "/" + new File(database.getPath()).getName(); scriptName = path + scriptFileExtension; ScriptWriterText dsw = new ScriptWriterText(database, scriptName, true, true, true); dsw.writeAll(); dsw.close(); backup = new DbBackup(archiveFile, path, true); backup.write(); } else { backup = new DbBackup(archiveFile, dbPath); backup.setAbortUponModify(false); if (!blocking) { InputStreamWrapper isw; File file = null; if (hasCache()) { DataFileCache dataFileCache = getCache(); RAShadowFile shadowFile = dataFileCache.getShadowFile(); if (shadowFile == null) { backup.setFileIgnore(dataFileExtension); } else { file = new File(dataFileCache.dataFileName); isw = new InputStreamWrapper( new FileInputStream(file)); isw.setSizeLimit( dataFileCache.fileStartFreePosition); backup.setStream(dataFileExtension, isw); InputStreamInterface isi = shadowFile.getInputStream(); backup.setStream(backupFileExtension, isi); } } // log file = new File(log.getLogFileName()); long fileLength = file.length(); isw = new InputStreamWrapper(new FileInputStream(file)); isw.setSizeLimit(fileLength); backup.setStream(logFileExtension, isw); } backup.write(); } database.logger.logInfoEvent("Successfully backed up instance '" + instanceName + "' to '" + destPath + "'"); } catch (IOException ioe) { throw Error.error(ErrorCode.FILE_IO_ERROR, ioe.toString()); } catch (TarMalformatException tme) { throw Error.error(ErrorCode.FILE_IO_ERROR, tme.toString()); } finally { if (scriptName != null) { FileUtil.getFileUtil().delete(scriptName); } if (blocking) { log.checkpointReopen(); } } } /** * Returns a secure path or null for a user-defined path when * hsqldb.allow_full_path is false. Returns the path otherwise. * */ public String getSecurePath(String path) { if (database.getType() == DatabaseURL.S_RES) { return path; } if (path.indexOf("..") != -1) { if (database.logger.propTextAllowFullPath) { return FileUtil.getFileUtil().canonicalOrAbsolutePath(path); } else { return null; } } String fullPath = new File(new File(database.getPath() + ".properties").getAbsolutePath()).getParent(); if (fullPath != null) { path = fullPath + File.separator + path; } return path; } // fredt@users 20020221 - patch 513005 by sqlbob@users (RMP) - text tables /** * Opens the TextCache object. */ public DataFileCache openTextFilePersistence(Table table, String source, boolean readOnlyData, boolean reversed) { closeTextCache(table); source = getSecurePath(source); if (source == null) { throw (Error.error(ErrorCode.ACCESS_IS_DENIED, source)); } TextCache c = new TextCache(table, source); c.open(readOnlyData || database.isFilesReadOnly()); textCacheList.put(table.getName(), c); return c; } /** * Closes the TextCache object. */ public void closeTextCache(Table table) { TextCache c = (TextCache) textCacheList.remove(table.getName()); if (c != null) { try { c.close(true); } catch (HsqlException e) {} } } void closeAllTextCaches(boolean script) { Iterator it = textCacheList.values().iterator(); while (it.hasNext()) { TextCache textCache = ((TextCache) it.next()); // use textCache.table to cover both cache and table readonly if (script && !textCache.table.isDataReadOnly()) { textCache.purge(); } else { textCache.close(true); } } } boolean isAnyTextCacheModified() { Iterator it = textCacheList.values().iterator(); while (it.hasNext()) { if (((TextCache) it.next()).isModified()) { return true; } } return false; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/ScaledRAFileNIO.java0000644000175000017500000003675212007547414024077 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.IOException; import java.io.RandomAccessFile; import java.io.FileDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel.MapMode; import org.hsqldb.Database; /** * NIO version of ScaledRAFile. This class is used only for storing a CACHED * TABLE .data file and cannot be used for TEXT TABLE source files. * * Once the maximum data file size allowed for NIO is reached, an ordinary * ScaledRAFile is used for data access. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.8.0.5 */ final class ScaledRAFileNIO implements RandomAccessInterface { private final Database database; private final boolean readOnly; private final long maxLength; private long fileLength; private RandomAccessFile file; private FileDescriptor fileDescriptor; private MappedByteBuffer buffer; private long bufferPosition; private int bufferLength; private long currentPosition; private FileChannel channel; private boolean buffersModified; // private MappedByteBuffer buffers[] = new MappedByteBuffer[]{}; // private static final String JVM_ERROR = "JVM threw unsupported Exception"; // static final int largeBufferScale = 24; static final int largeBufferSize = 1 << largeBufferScale; static final long largeBufferMask = 0xffffffffffffffffl << largeBufferScale; ScaledRAFileNIO(Database database, String name, boolean readOnly, long requiredLength, long maxLength) throws Throwable { this.database = database; this.maxLength = maxLength; java.io.File tempFile = new java.io.File(name); if (readOnly) { requiredLength = tempFile.length(); } else { if (tempFile.length() > requiredLength) { requiredLength = tempFile.length(); } requiredLength = ScaledRAFile.getBinaryNormalisedCeiling(requiredLength, largeBufferScale); } file = new RandomAccessFile(name, readOnly ? "r" : "rw"); this.readOnly = readOnly; this.channel = file.getChannel(); this.fileDescriptor = file.getFD(); if (ensureLength(requiredLength)) { buffer = buffers[0]; bufferLength = buffer.limit(); bufferPosition = 0; currentPosition = 0; } else { close(); IOException io = new IOException("NIO buffer allocation failed"); throw io; } } public long length() throws IOException { try { return file.length(); } catch (IOException e) { database.logger.logWarningEvent("nio", e); throw e; } catch (Throwable e) { database.logger.logWarningEvent(JVM_ERROR, e); IOException io = new IOException(e.toString()); try { io.initCause(e); } catch (Throwable e1) {} throw io; } } public void seek(long newPos) throws IOException { try { positionBufferSeek(newPos); buffer.position((int) (newPos - bufferPosition)); } catch (IllegalArgumentException e) { database.logger.logWarningEvent("nio", e); IOException io = new IOException(e.toString()); try { io.initCause(e); } catch (Throwable e1) {} throw io; } catch (Throwable e) { database.logger.logWarningEvent(JVM_ERROR, e); IOException io = new IOException(e.toString()); try { io.initCause(e); } catch (Throwable e1) {} throw io; } } public long getFilePointer() throws IOException { try { return currentPosition; } catch (Throwable e) { database.logger.logWarningEvent(JVM_ERROR, e); IOException io = new IOException(e.toString()); try { io.initCause(e); } catch (Throwable e1) {} throw io; } } public int read() throws IOException { try { int value = buffer.get(); positionBufferMove(1); return value; } catch (Throwable e) { database.logger.logWarningEvent(JVM_ERROR, e); IOException io = new IOException(e.toString()); try { io.initCause(e); } catch (Throwable e1) {} throw io; } } public void read(byte[] b, int offset, int length) throws IOException { try { while (true) { long transferLength = bufferPosition + bufferLength - currentPosition; if (transferLength > length) { transferLength = length; } buffer.get(b, offset, (int) transferLength); positionBufferMove((int) transferLength); length -= transferLength; offset += transferLength; if (length == 0) { break; } } } catch (Throwable e) { database.logger.logWarningEvent(JVM_ERROR, e); IOException io = new IOException(e.toString()); try { io.initCause(e); } catch (Throwable e1) {} throw io; } } public int readInt() throws IOException { try { int value = buffer.getInt(); positionBufferMove(4); return value; } catch (Throwable e) { database.logger.logWarningEvent(JVM_ERROR, e); IOException io = new IOException(e.toString()); try { io.initCause(e); } catch (Throwable e1) {} throw io; } } public long readLong() throws IOException { try { long value = buffer.getLong(); positionBufferMove(8); return value; } catch (Throwable e) { database.logger.logWarningEvent(JVM_ERROR, e); IOException io = new IOException(e.toString()); try { io.initCause(e); } catch (Throwable e1) {} throw io; } } public void write(byte[] b, int offset, int length) throws IOException { try { buffersModified = true; while (true) { long transferLength = bufferPosition + bufferLength - currentPosition; if (transferLength > length) { transferLength = length; } buffer.put(b, offset, (int) transferLength); positionBufferMove((int) transferLength); length -= transferLength; offset += transferLength; if (length == 0) { break; } } } catch (Throwable e) { database.logger.logWarningEvent(JVM_ERROR, e); IOException io = new IOException(e.toString()); try { io.initCause(e); } catch (Throwable e1) {} throw io; } } public void writeInt(int i) throws IOException { try { buffersModified = true; buffer.putInt(i); positionBufferMove(4); } catch (Throwable e) { database.logger.logWarningEvent(JVM_ERROR, e); IOException io = new IOException(e.toString()); try { io.initCause(e); } catch (Throwable e1) {} throw io; } } public void writeLong(long i) throws IOException { try { buffersModified = true; buffer.putLong(i); positionBufferMove(8); } catch (Throwable e) { database.logger.logWarningEvent(JVM_ERROR, e); IOException io = new IOException(e.toString()); try { io.initCause(e); } catch (Throwable e1) {} throw io; } } public void close() throws IOException { try { database.logger.logDetailEvent("NIO file close, size: " + fileLength); buffer = null; channel = null; for (int i = 0; i < buffers.length; i++) { unmap(buffers[i]); buffers[i] = null; } file.close(); // System.gc(); } catch (Throwable e) { database.logger.logWarningEvent("NIO buffer close error " + JVM_ERROR + " ", e); IOException io = new IOException(e.toString()); try { io.initCause(e); } catch (Throwable e1) {} throw io; } } public boolean isReadOnly() { return readOnly; } public boolean ensureLength(long newLength) { if (newLength > maxLength) { return false; } while (newLength > fileLength) { if (!enlargeFile(newLength)) { return false; } } return true; } private boolean enlargeFile(long newFileLength) { try { long newBufferLength = newFileLength; if (!readOnly) { newBufferLength = largeBufferSize; } MapMode mapMode = readOnly ? FileChannel.MapMode.READ_ONLY : FileChannel.MapMode.READ_WRITE; if (!readOnly && file.length() < fileLength + newBufferLength) { file.seek(fileLength + newBufferLength - 1); file.writeByte(0); } MappedByteBuffer[] newBuffers = new MappedByteBuffer[buffers.length + 1]; MappedByteBuffer newBuffer = channel.map(mapMode, fileLength, newBufferLength); System.arraycopy(buffers, 0, newBuffers, 0, buffers.length); newBuffers[buffers.length] = newBuffer; buffers = newBuffers; fileLength += newBufferLength; database.logger.logDetailEvent("NIO buffer instance, file size " + fileLength); } catch (Throwable e) { database.logger.logDetailEvent( "NOI buffer allocate failed, file size " + newFileLength); return false; } return true; } public boolean setLength(long newLength) { if (newLength > fileLength) { return enlargeFile(newLength); } else { try { seek(0); } catch (Throwable t) { // } return true; } } public Database getDatabase() { return null; } public void synch() { boolean error = false; for (int i = 0; i < buffers.length; i++) { try { buffers[i].force(); } catch (Throwable t) { database.logger.logSevereEvent("NIO buffer force error " + JVM_ERROR + " ", t); error = true; } } if (error) { for (int i = 0; i < buffers.length; i++) { try { buffers[i].force(); } catch (Throwable t) { database.logger.logSevereEvent("NIO buffer force error " + JVM_ERROR + " ", t); } } } try { fileDescriptor.sync(); buffersModified = false; } catch (Throwable t) { database.logger.logSevereEvent("NIO RA file sync error " + JVM_ERROR + " ", t); } } private void positionBufferSeek(long offset) { if (offset < bufferPosition || offset >= bufferPosition + bufferLength) { setCurrentBuffer(offset); } buffer.position((int) (offset - bufferPosition)); currentPosition = offset; } private void positionBufferMove(int relOffset) { long offset = currentPosition + relOffset; if (offset >= bufferPosition + bufferLength) { setCurrentBuffer(offset); } buffer.position((int) (offset - bufferPosition)); currentPosition = offset; } private void setCurrentBuffer(long offset) { int bufferIndex = (int) (offset >> largeBufferScale); buffer = buffers[bufferIndex]; bufferPosition = offset &= largeBufferMask; } /** * Non-essential unmap method - see http://bugs.sun.com/view_bug.do?bug_id=4724038 * reported by joel_turkel at users.sourceforge.net */ private void unmap(MappedByteBuffer buffer) throws IOException { if (buffer == null) { return; } try { Method cleanerMethod = buffer.getClass().getMethod("cleaner"); cleanerMethod.setAccessible(true); Object cleaner = cleanerMethod.invoke(buffer); Method clearMethod = cleaner.getClass().getMethod("clean"); clearMethod.invoke(cleaner); } catch (InvocationTargetException e) {} catch (NoSuchMethodException e) { // Means we're not dealing with a Sun JVM? } catch (Throwable e) {} } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/LobStoreInJar.java0000644000175000017500000001135012007547414023753 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.DataInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import org.hsqldb.Database; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.9.0 */ public class LobStoreInJar implements LobStore { final int lobBlockSize; Database database; DataInputStream file; final String fileName; // long realPosition; public LobStoreInJar(Database database, int lobBlockSize) { this.lobBlockSize = lobBlockSize; this.database = database; try { fileName = database.getPath() + ".lobs"; } catch (Throwable t) { throw Error.error(ErrorCode.DATA_FILE_ERROR, t); } } public byte[] getBlockBytes(int blockAddress, int blockCount) { if (file == null) { throw Error.error(ErrorCode.FILE_IO_ERROR); } try { long address = (long) blockAddress * lobBlockSize; int count = blockCount * lobBlockSize; byte[] dataBytes = new byte[count]; fileSeek(address); file.readFully(dataBytes, 0, count); realPosition = address + count; return dataBytes; } catch (Throwable t) { throw Error.error(ErrorCode.DATA_FILE_ERROR, t); } } public void setBlockBytes(byte[] dataBytes, int blockAddress, int blockCount) {} public void setBlockBytes(byte[] dataBytes, long position, int offset, int length) {} public int getBlockSize() { return lobBlockSize; } public void close() { try { if (file != null) { file.close(); } } catch (Throwable t) { throw Error.error(ErrorCode.DATA_FILE_ERROR, t); } } private void resetStream() throws IOException { if (file != null) { file.close(); } InputStream fis = null; try { fis = getClass().getResourceAsStream(fileName); if (fis == null) { ClassLoader cl = Thread.currentThread().getContextClassLoader(); if (cl != null) { fis = cl.getResourceAsStream(fileName); } } } catch (Throwable t) { // } finally { if (fis == null) { throw new FileNotFoundException(fileName); } } file = new DataInputStream(fis); realPosition = 0; } private void fileSeek(long position) throws IOException { if (file == null) { resetStream(); } long skipPosition = realPosition; if (position < skipPosition) { resetStream(); skipPosition = 0; } while (position > skipPosition) { skipPosition += file.skip(position - skipPosition); } realPosition = position; } public void synch() {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/PersistentStore.java0000644000175000017500000001101712007547414024453 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.Row; import org.hsqldb.Session; import org.hsqldb.TableBase; import org.hsqldb.index.Index; import org.hsqldb.navigator.RowIterator; import org.hsqldb.rowio.RowInputInterface; /** * Interface for a store for CachedObject objects. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public interface PersistentStore { int INT_STORE_SIZE = 4; int LONG_STORE_SIZE = 8; PersistentStore[] emptyArray = new PersistentStore[]{}; TableBase getTable(); long getTimestamp(); void setTimestamp(long timestamp); boolean isMemory(); void setMemory(boolean mode); int getAccessCount(); void set(CachedObject object); /** get object */ CachedObject get(long key); /** get object with keep, ensuring future gets will return the same instance of the object */ CachedObject get(long key, boolean keep); CachedObject get(CachedObject object, boolean keep); int getStorageSize(long key); /** add new object */ void add(CachedObject object); CachedObject get(RowInputInterface in); CachedObject get(CachedObject object, RowInputInterface in); CachedObject getNewInstance(int size); CachedObject getNewCachedObject(Session session, Object object, boolean tx); /** remove the persisted image but not the cached copy */ void removePersistence(long i); void removeAll(); /** remove both persisted and cached copies */ void remove(long i); /** remove the cached copies */ void release(long i); /** commit persisted image */ void commitPersistence(CachedObject object); // void delete(Session session, Row row); void indexRow(Session session, Row row); void commitRow(Session session, Row row, int changeAction, int txModel); void rollbackRow(Session session, Row row, int changeAction, int txModel); // void indexRows(Session session); RowIterator rowIterator(); // DataFileCache getCache(); void setCache(DataFileCache cache); void release(); PersistentStore getAccessorStore(Index index); CachedObject getAccessor(Index key); void setAccessor(Index key, CachedObject accessor); void setAccessor(Index key, long accessor); public double searchCost(Session session, Index idx, int count, int opType); long elementCount(); long elementCount(Session session); long elementCountUnique(Index index); void setElementCount(Index key, long size, long uniqueSize); boolean hasNull(int pos); void resetAccessorKeys(Index[] keys); Index[] getAccessorKeys(); void moveData(Session session, PersistentStore other, int colindex, int adjust); void reindex(Session session, Index index); void setReadOnly(boolean readonly); void writeLock(); void writeUnlock(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/ScaledRAFileInJar.java0000644000175000017500000001637612007547412024453 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.DataInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import org.hsqldb.Database; import org.hsqldb.lib.HsqlByteArrayInputStream; /** * This class is a random access wrapper around a DataInputStream object and * enables access to cached tables when a database is included in a jar. * * A proof-of-concept prototype was first contributed by winfriedthom@users. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.8.0 */ final class ScaledRAFileInJar implements RandomAccessInterface { DataInputStream file; final String fileName; long fileLength; boolean bufferDirty = true; byte[] buffer = new byte[4096]; HsqlByteArrayInputStream ba = new HsqlByteArrayInputStream(buffer); long bufferOffset; // long seekPosition; long realPosition; ScaledRAFileInJar(String name) throws FileNotFoundException, IOException { fileName = name; fileLength = getLength(); resetStream(); } public long length() throws IOException { return fileLength; } /** * Some JVM's do not allow seek beyond end of file, so zeros are written * first in that case. Reported by bohgammer@users in Open Disucssion * Forum. */ public void seek(long position) throws IOException { seekPosition = position; } public long getFilePointer() throws IOException { return seekPosition; } private void readIntoBuffer() throws IOException { long filePos = seekPosition; bufferDirty = false; long subOffset = filePos % buffer.length; long readLength = fileLength - (filePos - subOffset); if (readLength <= 0) { throw new IOException("read beyond end of file"); } if (readLength > buffer.length) { readLength = buffer.length; } fileSeek(filePos - subOffset); file.readFully(buffer, 0, (int) readLength); bufferOffset = filePos - subOffset; realPosition = bufferOffset + readLength; } public int read() throws IOException { if (seekPosition >= fileLength) { return -1; } if (bufferDirty || seekPosition < bufferOffset || seekPosition >= bufferOffset + buffer.length) { readIntoBuffer(); } ba.reset(); ba.skip(seekPosition - bufferOffset); int val = ba.read(); seekPosition++; return val; } public long readLong() throws IOException { long hi = readInt(); long lo = readInt(); return (hi << 32) + (lo & 0xffffffffL); } public int readInt() throws IOException { if (bufferDirty || seekPosition < bufferOffset || seekPosition >= bufferOffset + buffer.length) { readIntoBuffer(); } ba.reset(); ba.skip(seekPosition - bufferOffset); int val = ba.readInt(); seekPosition += 4; return val; } public void read(byte[] b, int offset, int length) throws IOException { if (bufferDirty || seekPosition < bufferOffset || seekPosition >= bufferOffset + buffer.length) { readIntoBuffer(); } ba.reset(); ba.skip(seekPosition - bufferOffset); int bytesRead = ba.read(b, offset, length); seekPosition += bytesRead; if (bytesRead < length) { if (seekPosition != realPosition) { fileSeek(seekPosition); } file.readFully(b, offset + bytesRead, length - bytesRead); seekPosition += (length - bytesRead); realPosition = seekPosition; } } public void write(byte[] b, int off, int len) throws IOException {} public void writeInt(int i) throws IOException {} public void writeLong(long i) throws IOException {} public void close() throws IOException { file.close(); } public boolean isReadOnly() { return true; } private long getLength() throws IOException { int count = 0; resetStream(); while (true) { if (file.read() < 0) { break; } count++; } return count; } private void resetStream() throws IOException { if (file != null) { file.close(); } InputStream fis = null; try { fis = getClass().getResourceAsStream(fileName); if (fis == null) { ClassLoader cl = Thread.currentThread().getContextClassLoader(); if (cl != null) { fis = cl.getResourceAsStream(fileName); } } } catch (Throwable t) { // } finally { if (fis == null) { throw new FileNotFoundException(fileName); } } file = new DataInputStream(fis); } private void fileSeek(long position) throws IOException { long skipPosition = realPosition; if (position < skipPosition) { resetStream(); skipPosition = 0; } while (position > skipPosition) { skipPosition += file.skip(position - skipPosition); } } public boolean ensureLength(long newLong) { return true; } public boolean setLength(long newLength) { return false; } public Database getDatabase() { return null; } public void synch() {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/TextFileSettings.java0000644000175000017500000002276212007547414024554 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.Database; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; /** * Parser and container for text table settings. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 2.2.6 */ public class TextFileSettings { //state of Cache public static final String NL = System.getProperty("line.separator"); public String fs; public String vs; public String lvs; public String stringEncoding; public boolean isQuoted; public boolean isAllQuoted; public boolean ignoreFirst; // Database database; String dataFileName; int maxCacheRows; int maxCacheBytes; // static final byte[] BYTES_LINE_SEP = NL.getBytes(); static final char DOUBLE_QUOTE_CHAR = '\"'; static final char BACKSLASH_CHAR = '\\'; static final char LF_CHAR = '\n'; static final char CR_CHAR = '\r'; /** * The source string for a cached table is evaluated and the parameters * are used to open the source file.

* * Settings are used in this order: (1) settings specified in the * source string for the table (2) global database settings in * *.properties file (3) program defaults */ TextFileSettings(Database database, String fileSettingsString) { this.database = database; HsqlProperties tableprops = HsqlProperties.delimitedArgPairsToProps(fileSettingsString, "=", ";", "textdb"); HsqlDatabaseProperties dbProps = database.getProperties(); //-- Get file name switch (tableprops.errorCodes.length) { case 0 : this.dataFileName = null; case 1 : // source file name is the only key without a value this.dataFileName = tableprops.errorKeys[0].trim(); break; default : throw Error.error(ErrorCode.X_S0502); } //-- Get separators: from database properties, then from table properties fs = dbProps.getStringProperty(HsqlDatabaseProperties.textdb_fs); fs = tableprops.getProperty(HsqlDatabaseProperties.textdb_fs, fs); vs = dbProps.getStringProperty(HsqlDatabaseProperties.textdb_vs); vs = tableprops.getProperty(HsqlDatabaseProperties.textdb_vs, vs); lvs = dbProps.getStringProperty(HsqlDatabaseProperties.textdb_lvs); lvs = tableprops.getProperty(HsqlDatabaseProperties.textdb_lvs, lvs); if (vs == null) { vs = fs; } if (lvs == null) { lvs = fs; } fs = translateSep(fs); vs = translateSep(vs); lvs = translateSep(lvs); if (fs.length() == 0 || vs.length() == 0 || lvs.length() == 0) { throw Error.error(ErrorCode.X_S0503); } //-- Get booleans ignoreFirst = dbProps.isPropertyTrue(HsqlDatabaseProperties.textdb_ignore_first); ignoreFirst = tableprops.isPropertyTrue( HsqlDatabaseProperties.textdb_ignore_first, ignoreFirst); isQuoted = dbProps.isPropertyTrue(HsqlDatabaseProperties.textdb_quoted); isQuoted = tableprops.isPropertyTrue(HsqlDatabaseProperties.textdb_quoted, isQuoted); isAllQuoted = dbProps.isPropertyTrue(HsqlDatabaseProperties.textdb_all_quoted); isAllQuoted = tableprops.isPropertyTrue(HsqlDatabaseProperties.textdb_all_quoted, isAllQuoted); stringEncoding = dbProps.getStringProperty(HsqlDatabaseProperties.textdb_encoding); stringEncoding = tableprops.getProperty(HsqlDatabaseProperties.textdb_encoding, stringEncoding); //-- get size and scale int cacheScale = dbProps.getIntegerProperty( HsqlDatabaseProperties.textdb_cache_scale); cacheScale = tableprops.getIntegerProperty( HsqlDatabaseProperties.textdb_cache_scale, cacheScale); int cacheSizeScale = dbProps.getIntegerProperty( HsqlDatabaseProperties.textdb_cache_size_scale); cacheSizeScale = tableprops.getIntegerProperty( HsqlDatabaseProperties.textdb_cache_size_scale, cacheSizeScale); // maxCacheRows = (1 << cacheScale) * 3; maxCacheRows = dbProps.getIntegerProperty( HsqlDatabaseProperties.textdb_cache_rows, maxCacheRows); maxCacheRows = tableprops.getIntegerProperty( HsqlDatabaseProperties.textdb_cache_rows, maxCacheRows); maxCacheBytes = ((1 << cacheSizeScale) * maxCacheRows) / 1024; if (maxCacheBytes < 4) { maxCacheBytes = 4; } maxCacheBytes = dbProps.getIntegerProperty( HsqlDatabaseProperties.textdb_cache_size, (int) maxCacheBytes); maxCacheBytes = tableprops.getIntegerProperty( HsqlDatabaseProperties.textdb_cache_size, (int) maxCacheBytes); maxCacheBytes *= 1024; } String getFileName() { return dataFileName; } int getMaxCacheRows() { return maxCacheRows; } int getMaxCacheBytes() { return maxCacheBytes; } private static String translateSep(String sep) { return translateSep(sep, false); } /** * Translates the escaped characters in a separator string and returns * the non-escaped string. */ private static String translateSep(String sep, boolean isProperty) { if (sep == null) { return null; } int next = sep.indexOf(BACKSLASH_CHAR); if (next != -1) { int start = 0; char[] sepArray = sep.toCharArray(); char ch = 0; int len = sep.length(); StringBuffer sb = new StringBuffer(len); do { sb.append(sepArray, start, next - start); start = ++next; if (next >= len) { sb.append(BACKSLASH_CHAR); break; } if (!isProperty) { ch = sepArray[next]; } if (ch == 'n') { sb.append(LF_CHAR); start++; } else if (ch == 'r') { sb.append(CR_CHAR); start++; } else if (ch == 't') { sb.append('\t'); start++; } else if (ch == BACKSLASH_CHAR) { sb.append(BACKSLASH_CHAR); start++; } else if (ch == 'u') { start++; sb.append( (char) Integer.parseInt( sep.substring(start, start + 4), 16)); start += 4; } else if (sep.startsWith("semi", next)) { sb.append(';'); start += 4; } else if (sep.startsWith("space", next)) { sb.append(' '); start += 5; } else if (sep.startsWith("quote", next)) { sb.append(DOUBLE_QUOTE_CHAR); start += 5; } else if (sep.startsWith("apos", next)) { sb.append('\''); start += 4; } else { sb.append(BACKSLASH_CHAR); sb.append(sepArray[next]); start++; } } while ((next = sep.indexOf(BACKSLASH_CHAR, start)) != -1); sb.append(sepArray, start, len - start); sep = sb.toString(); } return sep; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/ScaledRAFileHybrid.java0000644000175000017500000001325212007547414024661 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.IOException; import org.hsqldb.Database; /** * Mixe NIO / non-NIO version of ScaledRAFile. * This class is used only for storing a CACHED * TABLE .data file and cannot be used for TEXT TABLE source files. * * Due to various issues with java.nio classes, this class will use a mapped * channel of fixed size. After reaching this size, the file and channel are * closed and a new one opened, up to the maximum size. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 */ public final class ScaledRAFileHybrid implements RandomAccessInterface { final Database database; final String fileName; final boolean isReadOnly; boolean preNio; boolean isNio; long initialMaxLength = ScaledRAFileNIO.largeBufferSize / 2; RandomAccessInterface store; public ScaledRAFileHybrid(Database database, String name, boolean readOnly) throws IOException { this.database = database; this.fileName = name; this.isReadOnly = readOnly; long fileLength; java.io.File fi = new java.io.File(name); fileLength = fi.length(); newStore(fileLength); } public long length() throws IOException { return store.length(); } public void seek(long position) throws IOException { store.seek(position); } public long getFilePointer() throws IOException { return store.getFilePointer(); } public int read() throws IOException { return store.read(); } public void read(byte[] b, int offset, int length) throws IOException { store.read(b, offset, length); } public void write(byte[] b, int offset, int length) throws IOException { store.write(b, offset, length); } public int readInt() throws IOException { return store.readInt(); } public void writeInt(int i) throws IOException { store.writeInt(i); } public long readLong() throws IOException { return store.readLong(); } public void writeLong(long i) throws IOException { store.writeLong(i); } public void close() throws IOException { store.close(); } public boolean isReadOnly() { return store.isReadOnly(); } public boolean ensureLength(long newLength) { if (newLength <= initialMaxLength) { return store.ensureLength(newLength); } else if (preNio) { try { newStore(newLength); } catch (IOException e) {} } if (store.ensureLength(newLength)) { return true; } else if (isNio) { try { newStore(newLength); } catch (IOException e) {} } return store.ensureLength(newLength); } public boolean setLength(long newLength) { return store.setLength(newLength); } public Database getDatabase() { return null; } public void synch() { store.synch(); } void newStore(long requiredPosition) throws IOException { long currentPosition = 0; if (store == null) { preNio = requiredPosition <= database.logger.propNioMaxSize; } else { currentPosition = store.getFilePointer(); store.synch(); store.close(); } if (preNio && initialMaxLength <= requiredPosition) { try { store = new ScaledRAFileNIO(database, fileName, isReadOnly, requiredPosition, database.logger.propNioMaxSize); store.seek(currentPosition); preNio = false; isNio = true; return; } catch (Throwable e) { preNio = false; // log event } } isNio = false; store = new ScaledRAFile(database, fileName, isReadOnly, true, false); store.seek(currentPosition); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/ScaledRAFileSimple.java0000644000175000017500000000773212007547414024677 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import org.hsqldb.Database; /** * This class is a simple wrapper for a random access file such as used * for backup and lobs. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ final class ScaledRAFileSimple implements RandomAccessInterface { final RandomAccessFile file; final boolean readOnly; final Database database; ScaledRAFileSimple(Database database, String name, String openMode) throws FileNotFoundException, IOException { this.file = new RandomAccessFile(name, openMode); this.database = database; readOnly = openMode.equals("r"); } public long length() throws IOException { return file.length(); } public void seek(long position) throws IOException { file.seek(position); } public long getFilePointer() throws IOException { return file.getFilePointer(); } public int read() throws IOException { return file.read(); } public long readLong() throws IOException { return file.readLong(); } public int readInt() throws IOException { return file.readInt(); } public void read(byte[] b, int offset, int length) throws IOException { file.readFully(b, offset, length); } public void write(byte[] b, int off, int len) throws IOException { file.write(b, off, len); } public void writeInt(int i) throws IOException { file.writeInt(i); } public void writeLong(long i) throws IOException { file.writeLong(i); } public void close() throws IOException { file.close(); } public boolean isReadOnly() { return readOnly; } public boolean ensureLength(long newLong) { return true; } public boolean setLength(long newLength) { try { file.setLength(newLength); return true; } catch (Throwable t) { return false; } } public Database getDatabase() { return null; } public void synch() { try { file.getFD().sync(); } catch (IOException e) { database.logger.logSevereEvent("RA file sync error ", e); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/TextCache.java0000644000175000017500000003545012007547414023155 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.IOException; import java.io.UnsupportedEncodingException; import org.hsqldb.Database; import org.hsqldb.DatabaseURL; import org.hsqldb.HsqlException; import org.hsqldb.Table; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.lib.LongKeyHashMap; import org.hsqldb.rowio.RowInputText; import org.hsqldb.rowio.RowInputTextQuoted; import org.hsqldb.rowio.RowOutputText; import org.hsqldb.rowio.RowOutputTextQuoted; import org.hsqldb.scriptio.ScriptWriterText; // Ito Kazumitsu 20030328 - patch 1.7.2 - character encoding support // Dimitri Maziuk - patch for NL in string support // sqlbob@users - updated for 1.8.0 to allow new-lines in fields // fredt@users - updated for 1.8.0 to allow correct behaviour with transactions /** * Acts as a buffer manager for a single TEXT table and its Row data.

* * Handles read/write operations on the table's text format data file using a * compatible pair of org.hsqldb.rowio input/output class instances. * * * fredt - This used to write rows as soon as they are inserted * but now this is subject to transaction management. * A memory buffer contains the rows not yet committed. * Refactored for version 2.2.6. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.0 */ public class TextCache extends DataFileCache { // TextFileSettings textFileSettings; //state of Cache protected String header; protected Table table; private LongKeyHashMap uncommittedCache; HsqlByteArrayOutputStream buffer = new HsqlByteArrayOutputStream(128); // /** * The source string for a cached table is evaluated and the parameters * are used to open the source file.

* * Settings are used in this order: (1) settings specified in the * source string for the table (2) global database settings in * *.properties file (3) program defaults */ TextCache(Table table, String name) { super(table.database, name); this.table = table; uncommittedCache = new LongKeyHashMap(); } protected void initParams(Database database, String fileSettingsString) { this.database = database; fa = FileUtil.getFileUtil(); textFileSettings = new TextFileSettings(database, fileSettingsString); dataFileName = textFileSettings.getFileName(); if (dataFileName == null) { throw Error.error(ErrorCode.X_S0501); } dataFileName = ((FileUtil) fa).canonicalOrAbsolutePath(dataFileName); maxCacheRows = textFileSettings.getMaxCacheRows(); maxCacheBytes = textFileSettings.getMaxCacheBytes(); //-- Get size and scale maxDataFileSize = Integer.MAX_VALUE; cachedRowPadding = 1; dataFileScale = 1; } protected void initBuffers() { if (textFileSettings.isQuoted || textFileSettings.isAllQuoted) { rowIn = new RowInputTextQuoted(textFileSettings.fs, textFileSettings.vs, textFileSettings.lvs, textFileSettings.isAllQuoted); rowOut = new RowOutputTextQuoted(textFileSettings.fs, textFileSettings.vs, textFileSettings.lvs, textFileSettings.isAllQuoted, textFileSettings.stringEncoding); } else { rowIn = new RowInputText(textFileSettings.fs, textFileSettings.vs, textFileSettings.lvs, false); rowOut = new RowOutputText(textFileSettings.fs, textFileSettings.vs, textFileSettings.lvs, false, textFileSettings.stringEncoding); } } /** * Opens a data source file. */ public void open(boolean readonly) { fileFreePosition = 0; try { int type = database.getType() == DatabaseURL.S_RES ? ScaledRAFile.DATA_FILE_JAR : ScaledRAFile.DATA_FILE_TEXT; dataFile = ScaledRAFile.newScaledRAFile(database, dataFileName, readonly, type); fileFreePosition = dataFile.length(); if (fileFreePosition > Integer.MAX_VALUE) { throw Error.error(ErrorCode.DATA_FILE_IS_FULL); } initBuffers(); freeBlocks = new DataFileBlockManager(0, dataFileScale, 0, 0); } catch (Throwable t) { throw Error.error(t, ErrorCode.FILE_IO_ERROR, ErrorCode.M_TextCache_openning_file_error, new Object[] { t.toString(), dataFileName }); } cacheReadonly = readonly; } void reopen() { open(cacheReadonly); } /** * Writes newly created rows to disk. In the current implentation, * such rows have already been saved, so this method just removes a * source file that has no rows. */ public void close(boolean write) { if (dataFile == null) { return; } writeLock.lock(); try { cache.saveAll(); boolean empty = (dataFile.length() <= TextFileSettings.NL.length()); dataFile.synch(); dataFile.close(); dataFile = null; if (empty && !cacheReadonly) { FileUtil.getFileUtil().delete(dataFileName); } uncommittedCache.clear(); } catch (Throwable t) { throw Error.error(t, ErrorCode.FILE_IO_ERROR, ErrorCode.M_TextCache_closing_file_error, new Object[] { t.toString(), dataFileName }); } finally { writeLock.unlock(); } } /** * Closes the source file and deletes it if it is not read-only. */ void purge() { writeLock.lock(); try { uncommittedCache.clear(); if (cacheReadonly) { close(false); } else { if (dataFile != null) { dataFile.close(); dataFile = null; } FileUtil.getFileUtil().delete(dataFileName); } } catch (Throwable t) { throw Error.error(t, ErrorCode.FILE_IO_ERROR, ErrorCode.M_TextCache_purging_file_error, new Object[] { t.toString(), dataFileName }); } finally { writeLock.unlock(); } } /** * Does not extend the end of file. */ long setFilePos(CachedObject r) { int rowSize = r.getStorageSize(); long newFreePosition = fileFreePosition + rowSize; if (newFreePosition > maxDataFileSize) { database.logger.logSevereEvent("data file reached maximum size " + this.dataFileName, null); throw Error.error(ErrorCode.DATA_FILE_IS_FULL); } long i = fileFreePosition; r.setPos(i); clearRowImage(r); fileFreePosition = newFreePosition; return i; } /** * */ public void remove(long pos, PersistentStore store) { writeLock.lock(); try { CachedObject row = (CachedObject) uncommittedCache.remove(pos); if (row != null) { return; } row = cache.release(pos); } finally { writeLock.unlock(); } } public void removePersistence(CachedObject row) { writeLock.lock(); try { clearRowImage(row); } finally { writeLock.unlock(); } } private void clearRowImage(CachedObject row) { try { int length = row.getStorageSize() - ScriptWriterText.BYTES_LINE_SEP.length; rowOut.reset(); HsqlByteArrayOutputStream out = rowOut.getOutputStream(); out.fill(' ', length); out.write(ScriptWriterText.BYTES_LINE_SEP); dataFile.seek(row.getPos()); dataFile.write(out.getBuffer(), 0, out.size()); } catch (IOException e) { throw Error.runtimeError(ErrorCode.U_S0500, e.getMessage()); } } public void addInit(CachedObject object) { writeLock.lock(); try { cache.put(object.getPos(), object); } finally { writeLock.unlock(); } } public void add(CachedObject object) { writeLock.lock(); try { setFilePos(object); uncommittedCache.put(object.getPos(), object); } finally { writeLock.unlock(); } } /** cannot use isInMemory() for text cached object */ public CachedObject get(CachedObject object, PersistentStore store, boolean keep) { if (object == null) { return null; } writeLock.lock(); try { CachedObject existing = cache.get(object.getPos()); if (existing != null) { return object; } try { buffer.reset(object.getStorageSize()); dataFile.seek(object.getPos()); dataFile.read(buffer.getBuffer(), 0, object.getStorageSize()); buffer.setSize(object.getStorageSize()); String rowString = buffer.toString(textFileSettings.stringEncoding); ((RowInputText) rowIn).setSource(rowString, object.getPos(), buffer.size()); store.get(object, rowIn); cache.put(object.getPos(), object); return object; } catch (IOException err) { database.logger.logSevereEvent(dataFileName + " getFromFile problem " + object.getPos(), err); cache.forceCleanUp(); System.gc(); return object; } } finally { writeLock.unlock(); } } public CachedObject get(long i, PersistentStore store, boolean keep) { throw Error.runtimeError(ErrorCode.U_S0500, "TextCache"); } protected void saveRows(CachedObject[] rows, int offset, int count) { // no-op } /** * The row is always in uncommittedCache. * Saves the row as normal and removes it */ public void saveRow(CachedObject row) { writeLock.lock(); try { setFileModified(); saveRowNoLock(row); uncommittedCache.remove(row.getPos()); cache.put(row.getPos(), row); } catch (Throwable e) { database.logger.logSevereEvent("saveRow failed", e); throw Error.error(ErrorCode.DATA_FILE_ERROR, e); } finally { writeLock.unlock(); } } public String getHeader() { return header; } public void setHeaderInitialise(String header) { this.header = header; } public void setHeader(String header) { if (textFileSettings.ignoreFirst && fileFreePosition == 0) { try { writeHeader(header); this.header = header; } catch (HsqlException e) { throw new HsqlException( e, Error.getMessage(ErrorCode.GENERAL_IO_ERROR), ErrorCode.GENERAL_IO_ERROR); } return; } throw Error.error(ErrorCode.TEXT_TABLE_HEADER); } private void writeHeader(String header) { try { byte[] buf = null; String firstLine = header + TextFileSettings.NL; try { buf = firstLine.getBytes(textFileSettings.stringEncoding); } catch (UnsupportedEncodingException e) { buf = firstLine.getBytes(); } dataFile.seek(0); dataFile.write(buf, 0, buf.length); fileFreePosition = buf.length; } catch (IOException e) { throw Error.error(ErrorCode.TEXT_FILE_IO, e); } } public int getLineNumber() { return ((RowInputText) rowIn).getLineNumber(); } public TextFileSettings getTextFileSettings() { return textFileSettings; } public boolean isIgnoreFirstLine() { return textFileSettings.ignoreFirst; } protected void setFileModified() { fileModified = true; } public TextFileReader getTextFileReader() { return new TextFileReader(dataFile, textFileSettings, rowIn, cacheReadonly); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/PersistentStoreCollectionDatabase.java0000644000175000017500000000614712007547414030124 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.TableBase; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.LongKeyHashMap; public class PersistentStoreCollectionDatabase implements PersistentStoreCollection { private long persistentStoreIdSequence; private final LongKeyHashMap rowStoreMap = new LongKeyHashMap(); public void setStore(Object key, PersistentStore store) { long persistenceId = ((TableBase) key).getPersistenceId(); if (store == null) { rowStoreMap.remove(persistenceId); } else { rowStoreMap.put(persistenceId, store); } } public PersistentStore getStore(Object key) { long persistenceId = ((TableBase) key).getPersistenceId(); PersistentStore store = (PersistentStore) rowStoreMap.get(persistenceId); return store; } public void releaseStore(TableBase table) { PersistentStore store = (PersistentStore) rowStoreMap.get(table.getPersistenceId()); if (store != null) { store.release(); rowStoreMap.remove(table.getPersistenceId()); } } public long getNextId() { return persistentStoreIdSequence++; } public void release() { if (rowStoreMap.isEmpty()) { return; } Iterator it = rowStoreMap.values().iterator(); while (it.hasNext()) { PersistentStore store = (PersistentStore) it.next(); store.release(); } rowStoreMap.clear(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/RAShadowFile.java0000644000175000017500000002367012007547412023554 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import org.hsqldb.Database; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.lib.InputStreamInterface; import org.hsqldb.lib.java.JavaSystem; import org.hsqldb.store.BitMap; /* * Wrapper for random access file for incremental backup of the .data file. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class RAShadowFile { final Database database; final String pathName; final RandomAccessInterface source; RandomAccessInterface dest; final int pageSize; final long maxSize; final BitMap bitMap; boolean zeroPageSet; long savedLength; long synchLength; byte[] buffer; HsqlByteArrayOutputStream byteArrayOutputStream; RAShadowFile(Database database, RandomAccessInterface source, String pathName, long maxSize, int pageSize) { this.database = database; this.pathName = pathName; this.source = source; this.pageSize = pageSize; this.maxSize = maxSize; int bitSize = (int) (maxSize / pageSize); if (maxSize % pageSize != 0) { bitSize++; } bitMap = new BitMap(bitSize); buffer = new byte[pageSize + 12]; byteArrayOutputStream = new HsqlByteArrayOutputStream(buffer); } void copy(long fileOffset, int size) throws IOException { // always copy the first page if (!zeroPageSet) { copy(0); bitMap.set(0); zeroPageSet = true; } if (fileOffset >= maxSize) { return; } long endOffset = fileOffset + size; int startPageOffset = (int) (fileOffset / pageSize); int endPageOffset = (int) (endOffset / pageSize); if (endOffset % pageSize == 0) { endPageOffset--; } for (; startPageOffset <= endPageOffset; startPageOffset++) { copy(startPageOffset); } } private void copy(int pageOffset) throws IOException { if (bitMap.set(pageOffset) == 1) { return; } long position = (long) pageOffset * pageSize; int readSize = pageSize; if (maxSize - position < pageSize) { readSize = (int) (maxSize - position); } if (dest == null) { open(); } long writePos = dest.length(); try { byteArrayOutputStream.reset(); if (readSize < pageSize) { byteArrayOutputStream.fill(0, buffer.length); byteArrayOutputStream.reset(); } byteArrayOutputStream.writeInt(pageSize); byteArrayOutputStream.writeLong(position); source.seek(position); source.read(buffer, 12, readSize); dest.seek(writePos); dest.write(buffer, 0, buffer.length); savedLength = writePos + buffer.length; } catch (Throwable t) { bitMap.unset(pageOffset); dest.seek(0); dest.setLength(writePos); close(); database.logger.logWarningEvent("pos" + position + " " + readSize, t); throw JavaSystem.toIOException(t); } finally {} } private void open() throws IOException { if (database.logger.isStoredFileAccess()) { dest = ScaledRAFile.newScaledRAFile(database, pathName, false, ScaledRAFile.DATA_FILE_STORED); } else { dest = new ScaledRAFileSimple(database, pathName, "rws"); } } /** * Called externally after a series of copy() calls. * Called internally after a restore or when error in writing */ void close() throws IOException { if (dest != null) { dest.synch(); dest.close(); dest = null; } } public void synch() { if (dest != null) { synchLength = savedLength; dest.synch(); } } public long getSavedLength() { return savedLength; } public InputStreamInterface getInputStream() { return new InputStreamShadow(); } private static RandomAccessInterface getStorage(Database database, String pathName, String openMode) throws IOException { if (database.logger.isStoredFileAccess()) { return ScaledRAFile.newScaledRAFile(database, pathName, openMode.equals("r"), ScaledRAFile.DATA_FILE_STORED); } else { return new ScaledRAFileSimple(database, pathName, openMode); } } /** todo - take account of incomplete addition of block due to lack of disk */ // buggy database files had size == position == 0 at the end public static void restoreFile(Database database, String sourceName, String destName) throws IOException { RandomAccessInterface source = getStorage(database, sourceName, "r"); RandomAccessInterface dest = getStorage(database, destName, "rw"); while (source.getFilePointer() != source.length()) { int size = source.readInt(); long position = source.readLong(); byte[] buffer = new byte[size]; source.read(buffer, 0, buffer.length); dest.seek(position); dest.write(buffer, 0, buffer.length); } source.close(); dest.synch(); dest.close(); } class InputStreamShadow implements InputStreamInterface { FileInputStream is; long limitSize = 0; long fetchedSize = 0; boolean initialised = false; public int read() throws IOException { if (!initialised) { initialise(); } if (fetchedSize == limitSize) { return -1; } int byteread = is.read(); if (byteread < 0) { throw new IOException("backup file not complete " + fetchedSize + " " + limitSize); } fetchedSize++; return byteread; } public int read(byte bytes[]) throws IOException { return read(bytes, 0, bytes.length); } public int read(byte bytes[], int offset, int length) throws IOException { if (!initialised) { initialise(); } if (fetchedSize == limitSize) { return -1; } if (limitSize >= 0 && limitSize - fetchedSize < length) { length = (int) (limitSize - fetchedSize); } int count = is.read(bytes, offset, length); if (count < 0) { throw new IOException("backup file not complete " + fetchedSize + " " + limitSize); } fetchedSize += count; return count; } public long skip(long count) throws IOException { return 0; } public int available() throws IOException { return 0; } public void close() throws IOException { if (is != null) { is.close(); } } public void setSizeLimit(long count) { limitSize = count; } public long getSizeLimit() { if (!initialised) { initialise(); } return limitSize; } private void initialise() { limitSize = synchLength; database.logger.logDetailEvent("shadow file size for backup: " + limitSize); if (limitSize > 0) { try { is = new FileInputStream(pathName); } catch (FileNotFoundException e) {} } initialised = true; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/RowStoreDataChange.java0000644000175000017500000000545112007547414024767 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.IOException; import org.hsqldb.HsqlException; import org.hsqldb.Row; import org.hsqldb.RowDiskDataChange; import org.hsqldb.Session; import org.hsqldb.TableBase; import org.hsqldb.rowio.RowInputInterface; /* * Implementation of PersistentStore for data change lists. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.3.0 * @since 2.2.7 */ public class RowStoreDataChange extends RowStoreAVLHybrid { public RowStoreDataChange(Session session, PersistentStoreCollection manager, TableBase table) { super(session, manager, table, true); super.changeToDiskTable(session); } public CachedObject getNewCachedObject(Session session, Object object, boolean tx) { Row row = new RowDiskDataChange(table, (Object[]) object, this, null); add(row); return row; } public CachedObject get(RowInputInterface in) { try { return new RowDiskDataChange(session, table, in); } catch (HsqlException e) { return null; } catch (IOException e1) { return null; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/PersistentStoreCollection.java0000644000175000017500000000340212007547414026466 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; public interface PersistentStoreCollection { PersistentStore getStore(Object key); void setStore(Object key, PersistentStore store); void release(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/LockFile.java0000644000175000017500000027622312007547414023002 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.DataInputStream; import java.io.EOFException; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import org.hsqldb.DatabaseManager; import org.hsqldb.HsqlDateTime; import org.hsqldb.HsqlException; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.HsqlTimer; import org.hsqldb.lib.StringConverter; /** * Base cooperative file locking implementation and LockFile * factory.

* *


* * Provides a facility for cooperative file locking across process boundaries * and isolated in-process class loader contexts.

* * * * The only purely in-process global discovery alternative known to the author * is to reflect upon objects found while traversing up the Java runtime thread * hierarchy. However, this method is often subject to Java security * restrictions whose collective purpose is essentially dissimilar to that of * restrictions in effect relative to cooperative file locking requirements, * making it a generally unacceptable option in this context.

* *


* * Here is the way this class presently operates:

* *

    *
  1. A file with a commonly agreed-upon path is used to implement * cooperative locking semantics regarding another set of files with * commonly agreed-upon paths.

    * *

  2. In particular, a background thread periodically writes a timestamp * value, which acts as a heartbeat that indicates to others whether a * cooperative lock condition is currently held.

    * *

  3. In addition, a magic value is written so that it is possible to * distinguish with a reasonably high degree of accuracy between the * existence of a lock file and some other type of file.

    * *

  4. The generic rules used to aquire a cooperative lock condition are * as follows:

    * *

      *
    1. If a lock condition is already held by this object, do nothing and * signify that the lock attempt was successful, else...

      * *

    2. Poll the underlying file, using a configured maximum number of * retries and a configured interval between the end of a failed * poll and the beginning of the next.

      * *

    3. For each poll:

      * *

        * *
      1. Attempt to atomically create the underlying file if and only * if it does not yet exist, exit the polling loop immediately * indicating success if the attempt succeeds, else fast fail * the current poll if a security exeption is thrown in response * to the attempt, else...

        * *

      2. Test if the underlying file exists, fast failing the current * poll if it is impossible to determine (i.e. if a security * exeption is thrown).

        * *

      3. If the file does not exist, exit the polling loop immediately * indicating success.

        * * This can occur only under pre-JDK 1.2 runtimes; or when the * underlying platform does not correctly support {@link * java.io.File#createNewFile()}; or when the underlying file is * deleted within a very short time after i.), above (typically * on the order of microseconds).

        * * If the underlying platform employs a kernel-enforced mandatory * file locking blanket policy for open files (e.g. Windows * tm), then this is likely a non-issue. And if * this case makes possible a race condition with another * LockFile object (because the test for existence and * subsequent file creation is not atomic relative to all other * file system actions), it is still very unlikely that * so unfortunate a timing will occur as to allow simultaneous * lock conditions to be established. Finally, if some * non-LockFile entity deleted the file, then there are * much worse things to worry about, in particular that the files * this object is supposed to protect are in reality subject to * arbitrary external modification and deletion.

        * *

      4. Test the file's length, fast failing the current poll if the * length cannot be determined or it is not the expected * value.

        * *

      5. Open a stream to read the file's MAGIC and heartbeat * timestamp values, fast failing the current poll if the stream * cannot be opened.

        * *

      6. Test the file's MAGIC value, failing the current poll * if the value cannot be read or it is not the expected * value.

        * *

      7. Test the file's heartbeat timestamp value, fast failing the * current poll if it cannot be read or it is less than a * commonly agreed-upon value into the past (or future, to * overcome a caveat observed by a patch contributor).

        *

      *
    4. If the polling phase exits with a failure indication, then one or * more of the following cases must have been true at every poll * iteration:

      * *

        *
      • The file had the wrong length or MAGIC value (was * not an HSQLDB lock file). * *
      • The file was deleted externally after a poll's initial * test for existence and recreated at some point before * the next poll's initial test for existence. * *
      • An incompatible OS-enforced security restriction was in * effect. * *
      • An incompatible Java-enforced security restriction was * in effect. * *
      • The target file system media was effectively inaccessible. *
      • A cooperative lock condition was held by some other * LockFile. * *
      • A kernel-enforced manditory or advisory file lock was held. *

      * * In this case, signify failure indicating the last encountered * reason, else...

      * *

    5. Open the file for reading and writing, write the magic value and * an initial heartbeat timestamp, schedule a periodic heartbeat * timestamp writer task and signify success.

      *

    *
  5. The generic rules used to release a cooperative lock condition are:

    *

      *
    1. If a lock condition is not currently held, do nothing and signify * success, else...

      * *

    2. A lock condition is currently held by this object, so try to * release it.

      * * By default, releasing the lock condition consists of closing and * nullifying any objects that have a file descriptor open on the * lock file, cancelling the periodic heartbeat timestamp writer * task and deleting the lock file. If the release occurs without * raising an exception, signify success, else signify that the * release attempt might have failed.

      *

    *

* *


* * Additionally, {@link #doOptionalLockActions() doOptionalLockActions()} and * {@link #doOptionalReleaseActions() doOptionalReleaseActions()} are invoked * during lock and release attempts, respectively. This enables integration of * extended lock and release strategies based on subclassing. Subclass * availability is automatically detected and exposed by the factory method * {@link #newLockFile newLockFile()}.

* * In particular, if {@link #USE_NIO_FILELOCK_PROPERTY} is true and the required * classes are available at static initialization, then newLockFile() * produces {@link org.hsqldb.persist.NIOLockFile NIOLockFile} instances.

* * When NIOLockFile instances are produced, then it is possible that * true kernel-enforced advisory or manditory file locking is used to protect * the underlying lock file from inadvertent modification (and possibly even * from deletion, including deletion by the system superuser). * * Otherwise, newLockFile() produces vanilla LockFile * instances, which exhibit just the elementary cooperative locking behavior on * platforms that do not, by default, implement kernel-enforced manditory * locking for open files.

* * At this point, it must be noted that not every target platform upon which * Java can run actually provides true kernel-enforced manditory (or even * advisory) file locking. Indeed, even when a target platform does * provide such locking guarantees for local file systems, it may not be able * to do so for network file systems, or it may only be able to do so safely * (or at all) with certain restrictions. Further, external system configuration * may be a prerequisite to enable manditory locking on systems that support it * but employ advisory locking by default.

* * In recognition of these facts, the official Java NIO package specification * explicitly states basically the same information. What is unfortunate, * however, is that no capabilities API is yet provided as part of the package. * What is even more unfortunate is that without something like a capabilities * API, it is impossible for an implementation to indicate or clients to * distiguish between simple lack of platform support and cases involving * immature Java runtimes that do not fully or correctly implement all NIO * features (and hence may throw exceptions at unexpected times or in places * where the API specification indicates none can be thrown).

* * It is for the preceding reasons that, as of HSQLDB 1.8.0.3, * FileLock's use of Java NIO has been made a purely optional feature. * Previous to HSQLDB 1.8.0.3, if NIO was detected available, used to create a * FileLock and failed, then the enclosing cooperative lock attempt * failed also, despite the fact that a vanilla locking approach could * succeed.

* * Polling Configuration:

* * Although the {@link #HEARTBEAT_INTERVAL} and default polling values may * seem quite conservative, they are the result of ongoing research into * generally reasonable concerns regarding normal timing and resource * availability fluctuations experienced frequently under most, if not all * operating systems.

* * Regardless, flexibility is almost always a good thing, so this class is * designed to allow polling interval and retry count values to be configured * at run-time.

* * At present, this can be done at any time by setting the system properties * whose names are {@link #POLL_RETRIES_PROPERTY} and {@link * #POLL_INTERVAL_PROPERTY}.

* * Some consideration has also been given to modifying the polling scheme so * that run-time configuration of the HEARTBEAT_INTERVAL is possible. For now, * however, this option has been rejected due to the relative complexity of * guaranteeing acceptably safe, deterministic behaviour. On the other hand, * if it can be guaranteed that certain site invariants hold (in particular, * that only one version of the hsqldb jar will ever be used to open database * instances at the site) and it is desirable or required to experiment with * a lower interval, then it is recommended for now simply to recompile the * jar using a different value in the static field assignment. Note that great * care should be taken to avoid assigning too low a value, or else it may * become possible that even very short-lived timing and resource availability * fluctuations will cause incorrect operation of this class.

* * NIO Configuration:

* * Starting with 1.8.0.3, NIO-enhanced file lock attempts are turned off by * default. The general reasons for this are discussed above. Anyone interested * in the reading the detailed research notes should refer to the overview of * {@link NIOLockFile}. If, after reviewing the notes and the capabilities of * the intended target platform, one should still wish to enable NIO-enhanced * file lock attempts, it can be done by setting the system property {@link * #USE_NIO_FILELOCK_PROPERTY} true at JVM startup (for example, by using a * command-line -D<property-name>=true directive). Be aware that * the system property value is read only once, in the static initializer block * for this class.

* * Design Notes:

* * First, it should be noted that no thread synchronization occurs in * this class. Primarily, this is because the standard entry point, * {@link #newLockFileLock(String)}, is always called from within a block * synchronized upon an HSQLDB Database instance. If this class is to be used * elsewhere and it could be accessed concurrently, then access should be * synchronized on an appropriate monitor. That said, certain members of this * class have been declared volatile to minimize possibility of inconsistent * views under concurrent read-only access.

* * Second, to the limit of the author's present understanding, the * implementation details of this class represent a good comprimse under varying * and generally uncontrollable JVM, OS and hardware platform * limitations/capabilites, as well as under usability considerations and * external security or operating constraints that may need to be imposed.

* * Alternate approaches that have been considered and rejected for now * include:

* *

    *
  • Socket-based locks (with/without broadcast protocol) *
  • Pure NIO locking *
  • Simple lock file (no heartbeat or polling) *
  • JNI and native configuration alternatives *
* * Of course, discussions involving and patches implementing improvements * or better alternatives are always welcome.

* * As a final note and sign post for developers starting to work with * Java NIO:

* * A separate NIOLockFile descendent exists specifically * because it was determined though experimenatation that * java.nio.channels.FileLock does not always exhibit the correct * or desired behaviour under reflective method invocation. That is, it was * discovered that under some operating system/JVM combinations, after calling * FileLock.release() via a reflective method invocation, the lock is * not released properly, deletion of the lock file is not possible even from * the owning object (this) and it is impossible for other LockFile * instances, other in-process objects or other processes to successfully obtain * a lock condition on the lock file, despite the fact that the * FileLock object reports that its lock is invalid (was released * successfully). Frustratingly, this condition appears to persist until full * exit of the process hosting the JVM in which the FileLock.tryLock() * method was reflectively invoked.

* * To solve this, the original LockFile class was split in two and * instead of reflective method invocation, subclass instantiation is now * performed at the level of the newLockFile() factory method. * Similarly, the HSQLDB ANT build script now detects the presence or abscence * of JDK 1.4+ features such as java.nio and only attempts to build and deploy * NIOLockFile to the hsqldb.jar if such features are reported * present.

* * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @version 1.8.1.2 * @since 1.7.2 */ public class LockFile { /** * Arbitary period, in milliseconds, at which heartbeat timestamps are * written to this object's lock file.

* * This value was selected to be very conservative, just in case timing * jitters are experienced on the order introduced by brief network * partitions, accidentally removed media and transient high load * CPU bursts. */ public static final long HEARTBEAT_INTERVAL = 10000; /** * {@link #HEARTBEAT_INTERVAL} + 100.

* * Interval used by {@link #checkHeartbeat(boolean) checkHeartbeat} to * test whether the timestamp in the underlying lock file is live or stale. * Padding added in the hope of reducing potential timing jitter issues * under the polling scheme introduced in 1.8.0.3 */ public static final long HEARTBEAT_INTERVAL_PADDED = 10100; /** * Value written at the beginning of an HSQLDB lock file to distinguish it * from other file types.

* * The value is the octet sequence: {0x48, 0x53, 0x51, 0x4c, 0x4c, 0x4f, * 0x43, 0x4b}, which is the ASCII sequence {'H', 'S', 'Q', 'L', 'L', 'O', * 'C', 'K'}.

* * Design Note:

* * "HSQLLOCK".getBytes() is no longer used because it is dependent on the * underlying platform's default character set. */ protected static final byte[] MAGIC = { 0x48, 0x53, 0x51, 0x4c, 0x4c, 0x4f, 0x43, 0x4b }; /** * Size, in bytes, of the region at the beginning of a lock file that is * actually used to record lock information.

* * Value is currently MAGIC.length + sizeof(long) = (8 + 8) = 16 */ public static final int USED_REGION = 16; /** * Number of retries used by default in {@link #pollHeartbeat() * pollHeartbeat}. */ public static final int POLL_RETRIES_DEFAULT = 10; /** * System property that can be used to override the default number of * heartbeat poll retries. */ public static final String POLL_RETRIES_PROPERTY = "hsqldb.lockfile.poll.retries"; /** * System property that can be used to override the default number of * milliseconds between each heartbeat poll retry. */ public static final String POLL_INTERVAL_PROPERTY = "hsqldb.lockfile.poll.interval"; /** Whether java.nio file locking is attempted by default. */ public static final boolean USE_NIO_FILELOCK_DEFAULT = false; /** * System property that can be used to control whether nio file locking is * attempted. */ public static final String USE_NIO_FILELOCK_PROPERTY = "hsqldb.lockfile.nio.filelock"; /** * Statically computed indication of java.nio.channels.FileLock * runtime availability.

* * Design Note:

* * Computed in a static initializer block. Will be false if * USE_NIO_FILELOCK_PROPERTY is false at static * initialization, regardless of actual availability. */ public static final boolean NIO_FILELOCK_AVAILABLE; /** * Statically computed reference to the NIOLockFile class.

* * Design Note:

* * Computed in a static initializer block. Will be null if * USE_NIO_FILELOCK_PROPERTY is false at static * initialization, regardless of actual availability. */ public static final Class NIO_LOCKFILE_CLASS; /** * The timed scheduler with which to register this object's * heartbeat task. */ protected static final HsqlTimer timer = DatabaseManager.getTimer(); // This static initializer comes last, since it references a subclass // // That is, it is best practice to ensure the static fields of this class // are all initialized before referecing a subclass whose static // field initializtion may in turn reference static fields in this class. static { synchronized (LockFile.class) { boolean use = USE_NIO_FILELOCK_DEFAULT; try { use = "true".equalsIgnoreCase( System.getProperty(USE_NIO_FILELOCK_PROPERTY, use ? "true" : "false")); } catch (Exception e) {} boolean avail = false; Class clazz = null; if (use) { try { Class.forName("java.nio.channels.FileLock"); clazz = Class.forName("org.hsqldb.persist.NIOLockFile"); avail = true; } catch (Exception e) {} } NIO_FILELOCK_AVAILABLE = avail; NIO_LOCKFILE_CLASS = clazz; } } /** * Canonical reference to this object's lock file.

* * Design Note:

* * Should really be final, but finality makes reflective construction * and adherence to desirable LockFile factory method event * sequence more complicated. */ protected File file; /** * Cached value of the lock file's canonical path * * Design Note:

* * Should really be final, but finality makes reflective construction * and adherence to desirable LockFile factory method event * sequence much more complicated. */ private String cpath; /** * A RandomAccessFile constructed from this object's canonical file * reference.

* * This RandomAccessFile is used to periodically write out the * heartbeat timestamp to this object's lock file. */ protected volatile RandomAccessFile raf; /** Indicates presence or absence of the cooperative lock condition. */ protected volatile boolean locked; /** Opaque reference to this object's heatbeat task. */ private volatile Object timerTask; /** * Retrieves a new NIOLockFile, or null if not available * under the current runtime environment. * * @return a new NIOLockFile, or null if not available * under the current runtime environment */ private static final LockFile newNIOLockFile() { if (NIO_FILELOCK_AVAILABLE && NIO_LOCKFILE_CLASS != null) { try { return (LockFile) NIO_LOCKFILE_CLASS.newInstance(); } catch (Exception e) { // e.printStackTrace() } } return null; } /** * To allow subclassing without exposing a public constructor. */ protected LockFile() {} /** * Retrieves a LockFile instance, initialized with a File * object whose path is the canonical form of the one specified by the * given path argument.

* * The resulting LockFile instance does not yet hold a lock * condition on the file with the given path, nor does it guarantee that the * file pre-exists or is created. * * However, upon successful execution, it is guaranteed that all required * parent directories have been created and that the underlying platform has * verified the specified path is legal on the file system of the underlying * storage partition. * * @return a LockFile instance initialized with a File * object whose path is the one specified by the given path * argument. * @param path the path of the File object with which the retrieved * LockFile object is to be initialized * @throws FileCanonicalizationException if an I/O error occurs upon * canonicalization of the given path, which is possible because * it may be illegal on the runtime file system or because * construction of the canonical path name may require native file * system queries * @throws FileSecurityException if a required system property value cannot * be accessed, or if a security manager exists and its {@link * java.lang.SecurityManager#checkRead} method denies read * access to the file; or if its {@link * java.lang.SecurityManager#checkRead(java.lang.String)} * method does not permit verification of the existence of all * necessary parent directories; or if the {@link * java.lang.SecurityManager#checkWrite(java.lang.String)} * method does not permit all necessary parent directories to be * created */ public static final LockFile newLockFile(final String path) throws FileCanonicalizationException, FileSecurityException { LockFile lockFile = newNIOLockFile(); if (lockFile == null) { lockFile = new LockFile(); } lockFile.setPath(path); return lockFile; } /** * {@link org.hsqldb.persist.Logger#acquireLock(java.lang.String)} * delegate.

* * Retrieves a new LockFile object holding a cooperative lock * condition upon the file with the given path, appended with the * extension '.lck'.

* * @param path of the lock file, to which will be appended '.lck' * @throws org.hsqldb.HsqlException if the lock condition cannot * be obtained for any reason. * @return a new LockFile object holding a cooperative lock * condition upon the file with the given path, appended with the * extension '.lck' */ public static final LockFile newLockFileLock(final String path) throws HsqlException { LockFile lockFile = null; try { lockFile = LockFile.newLockFile(path + ".lck"); } catch (LockFile.BaseException e) { throw Error.error(ErrorCode.LOCK_FILE_ACQUISITION_FAILURE, e.getMessage()); } boolean locked = false; try { locked = lockFile.tryLock(); } catch (LockFile.BaseException e) { throw Error.error(ErrorCode.LOCK_FILE_ACQUISITION_FAILURE, e.getMessage()); } // Paranoia mode: In theory, this case can't happen, given the way // tryLock now works; by all current understanding of the involved API // contracts, an exception will always be thrown instead by the code // above. if (!locked) { throw Error.error(ErrorCode.LOCK_FILE_ACQUISITION_FAILURE, lockFile.toString()); } return lockFile; } /** * Checks whether the underlying file is an HSQLDB lock file and, if so, * whether its heartbeat timestamp is live (is, as far as can be known, * presumably in use by another LockFile instance) or stale.

* * The check conforms to the following rules:

* *

    *
  1. If the parameter withCreateNewFile is true, {@link * java.io.File#createNewFile()} is available and its invocation * upon this object's file object indicates the underlying * file was atomically created if and only if it did not yet exist, * then return immediately (we have won the race to establish * a lock file).

    * *

  2. Test again if the file exists, returning immediately if it does not * (there's no file and hence no heartbeat to check).

    * * An immediate return can occur here only under pre-JDK 1.2 runtimes; * or when the underlying platform does not correctly support * File.createNewFile(); or when the underlying file is deleted * within a very short time after i.), above (typically on the order of * microseconds).

    * * If the underlying platform employs a kernel-enforced mandatory file * locking blanket policy for open files (e.g. Windowstm * ), then this is likely a non-issue. And if this case makes * possible a race condition with another LockFile object * (because the test for existence yeilds false and subsequent file * creation is not atomic relative to all other file system actions), it * is still very unlikely that so unfortunate a timing will * occur as to allow simultaneous lock conditions to be established. * Finally, if some non-LockFile entity deleted the file, then * there are much worse things to worry about, in particular that the * files this object is supposed to protect are in reality subject to * arbitrary external modification and deletion by some uncooperative * process.

    * *

  3. If a Java security exception is thrown while testing for existence, * it is rethrown as a FileSecurityException. * *
  4. Read the file's length. * *
  5. If a Java security exception is thrown reading length, it is rethrown * as a FileSecurityException (it is possible somebody * concurrently refreshed the system Policy in the interim). * *
  6. If the file does not have the expected length, a * WrongLengthException is thrown (we're trying to check * something that is not an HSQLDB lock file). * *
  7. Open an input steam to read the file's MAGIC and heartbeat * timestamp values. * *
  8. If a file not found exception is thrown above, it is rethrown as an * UnexpectedFileNotFoundException (we've already tested for * existence). * *
  9. If a Java security exception is thrown above, it is rethrown as a * FileSecurityException (it is possible somebody * concurrently refreshed the system Policy in the interim). * *
  10. Read the MAGIC value. * *
  11. If an end of file exepction is thrown above, it is rethrown as an * UnexpectedEndOfFileException (we've already tested the * length... did someone truncate the file in the interim?). * *
  12. If an I/O exception is thrown, it is rethrown as an * UnexpectedFileIOException (we've already tested for * existence, length and successfully opened a stream...did someone, * for example, force unmount or physically remove the underlying device * in the interim?) * *
  13. If the value read in does not match the expected MAGIC value, * a WrongMagicException is thrown (we're trying to check * something that is not an HSQLDB lock file). * *
  14. Read the heartbeat timestamp. * *
  15. If a Java security exception is thrown above, it is rethrown as a * FileSecurityException (it is possible somebody * concurrently refreshed the system Policy in the interim). * *
  16. If an end of file exection is thrown above, it is rethrown as an * UnexpectedEndOfFileException (we've already tested the * length... did someone truncate the file in the interim?). * *
  17. If an I/O exception is thrown, it is rethrown as an * UnexpectedFileIOException (we've already tested for * existence, length and successfully opened a stream...did someone, * for example, force unmount or physically remove the underlying device * in the interim?) * *
  18. If the timestamp read in is less than or equal to * {@link #HEARTBEAT_INTERVAL_PADDED} milliseconds into the past or * future, then a LockHeldExternallyException is thrown. * *
  19. Otherwise, this method simply returns. *
* * @param withCreateNewFile if true, attempt to employ * File.createNewFile() as part of the check so as to * eliminate potential race conditions when establising a new * lock file * @throws FileSecurityException if the check fails due to a Java * security permission check failure * @throws LockHeldExternallyException if it is determined that the * file's heartbeat timestamp is less than * HEARTBEAT_INTERVAL_PADDED into the past (or future) * @throws UnexpectedEndOfFileException if an EOFExceoption is * thrown while reading either the magic or heartbeat timestamp values * @throws UnexpectedFileIOException if an IOException other than * EOFException is thrown while reading either the magic or * heartbeat timestamp values * @throws UnexpectedFileNotFoundException if a * FileNotFoundException is thrown while attempting to open a * stream to read the underlying file's magic and heartbeat timestamp * values * @throws WrongLengthException if it is determined that the length * of the file does not equal {@link #USED_REGION} * @throws WrongMagicException if it is determined that the file's * content does not start with {@link #MAGIC}. */ private final void checkHeartbeat(boolean withCreateNewFile) throws LockFile.FileSecurityException, LockFile.LockHeldExternallyException, LockFile.UnexpectedEndOfFileException, LockFile.UnexpectedFileIOException, LockFile.UnexpectedFileNotFoundException, LockFile.WrongLengthException, LockFile.WrongMagicException { long now; long lastHeartbeat; long length = 0; //#ifdef JAVA2FULL try { if (withCreateNewFile) { try { if (file.createNewFile()) { return; } } catch (IOException ioe) {} } if (!file.exists()) { return; } length = file.length(); } catch (SecurityException se) { throw new FileSecurityException(this, "checkHeartbeat", se); } //#else /* if (!file.exists()) { if (withCreateNewFile) { openRAF(); closeRAF(); } return; } length = file.length(); */ //#endif JAVA2 if (length != USED_REGION) { if (length == 0) { file.delete(); return; } throw new WrongLengthException(this, "checkHeartbeat", length); } // Compute the current wall clock time *first* to reduce possibility // of unwanted time dilation effects introduced, for example, // by intervening thread or process context switches under CPU // bursts. // // Example: // // Say currentTimeMillis is actually somewhere in (-0.5 and 0.5] // and another LockFile concurrently writes a 0-valued heartbeat // timestamp. // // Then, if readHeartbeat comes first here, happens to 'win the race // condition' (reads the previous heartbeat: -10,000) and an intervening // switch causes greater than ~0.5 millisecond elapsed time to // be experienced between readHeartbeat and currentTimeMillis, then // currentTimeMillis will be computed as n (n > 0), and (now - // lastHearbeat) will be HEARTBEAT_INTERVAL + n, instead of // HEARTBEAT_INTERVAL. // // Now, let n be greater than (HEARTBEAT_INTERVAL_PADDED - // HEARTBEAT_INTERVAL). // // Then the check will succeed, although it should fail. // // On the other hand, if currentTimeMillis is computed first, the // worst than can happen is a false positive indication that // the read heartbeat timestamp value was written by a live LockFile // instance. // now = System.currentTimeMillis(); lastHeartbeat = readHeartbeat(); // Using padded interval to further reduce corner case effects, // now that heartbeat polling is in effect. // // Basically, it is absolutely essential to fail when a lock really is // still held elsewhere, so it is OK to fail on corner cases where // the last written heartbeat is very close to HEARTBEAT_INTERVAL // in the past and it is possible that timing jitters make it uncertain // whether the lock really is still held. if (Math.abs(now - lastHeartbeat) <= (HEARTBEAT_INTERVAL_PADDED)) { throw new LockHeldExternallyException(this, "checkHeartbeat", now, lastHeartbeat); } } /** * Closes this object's {@link #raf RandomAccessFile}.

* * As a side-effect, the associated FileChannel object, if any, * is closed as well. * * @throws UnexpectedFileIOException if an IOException is thrown */ private final void closeRAF() throws LockFile.UnexpectedFileIOException { if (raf != null) { try { raf.close(); } catch (IOException ex) { throw new UnexpectedFileIOException(this, "closeRAF", ex); } finally { raf = null; } } } /** * Provides any optional locking actions for the {@link #tryLock() * tryLock()} template method.

* * Descendents are free to provide additional functionality here, * using the following rules:

* * PRE:

* * This method is called only from tryLock() and it is called if * and only if tryLock() successfully invokes * pollHeartbeat() and openRAF() first.

* * From this, it can be inferred that upon entry:

* *

    *
  1. locked == false. *
  2. raf is a non-null instance that can be used to get a * FileChannel instance, if desired. *
  3. the underlying file either did not exist before invoking * openRAF() or it was a valid but stale HSQLDB lock file * because it: * *
      *
    1. did exist, *
    2. was readable on USED_REGION, *
    3. had the expected length and MAGIC value and *
    4. had a stale heartbeat timestamp value. *
    *

* * Further, it can be assumed that this object's heatbeat task is definitely * cancelled and/or has never been scheduled at this point, so whatever * timestamp is recorded in the lock file, if it did pre-exist, was written * by a different LockFile instance or as the result of a previous, * successful tryLock() invocation upon this LockFile * instance.

* * Finally, it is important that this method does not rethrow any exceptions * it encounters as unchecked exceptions to the calling context.

* * POST:

* * This method should return false if optional locking work is not * performed or if it fails, else true.

* * In general, if optional locking work fails, then any resources * acquired in the process should be freed before this method returns. * In this way, the surrounding implementation can take advantage of a * false return value to avoid calling {@link * #doOptionalReleaseActions() doOptionalReleaseActions()} as part of the * {@link #tryRelease() tryRelease()} method.

* * Note:

* * The default implementation does nothing and always returns * false.

* * @return true if optional lock actions are performed and they * succeed, else false */ protected boolean doOptionalLockActions() { return false; } /** * Provides any optional release actions for the {@link #tryRelease() * tryRelease()} template method.

* * PRE:

* * It is important that this method does not rethrow any exceptions * it encounters as unchecked exceptions to the calling context.

* * POST:

* * In general, false should be returned if optional locking work * is not performed or if it fails, else true. However, the return * value is currenly treated as purely informative.

* * Note:

* * The default implementation does nothing and always returns false.

* * @return true if optional release actions are performed and they * succeed, else false */ protected boolean doOptionalReleaseActions() { return false; } /** * Initializes this object with a File object whose path has the * canonical form of the given path argument.

* * PRE:

* *

    *
  1. This method is called once and only once per * Lockfile instance. * *
  2. It is always the first method called after * LockFile construction * *
  3. The supplied path argument is never * null. *
* * @param path the abstract path representing the file this object is to * use as its lock file * @throws FileCanonicalizationException if an I/O error occurs upon * canonicalization of the given path, which is possible because * the given path may be illegal on the runtime file system or * because construction of the canonical pathname may require * native file system queries * @throws FileSecurityException if a required system property value cannot * be accessed, or if a Java security manager exists and its * {@link java.lang.SecurityManager#checkRead} method denies * read access to the file; or if its {@link * java.lang.SecurityManager#checkRead(java.lang.String)} * method does not permit verification of the existence of * all necessary parent directories; or if * its {@link * java.lang.SecurityManager#checkWrite(java.lang.String)} * method does not permit all necessary parent directories to be * created */ private final void setPath(String path) throws LockFile.FileCanonicalizationException, LockFile.FileSecurityException { // Should at least be absolutized for reporting purposes, just in case // a security or canonicalization exception gets thrown. path = FileUtil.getFileUtil().canonicalOrAbsolutePath(path); this.file = new File(path); try { FileUtil.getFileUtil().makeParentDirectories(this.file); } catch (SecurityException ex) { throw new FileSecurityException(this, "setPath", ex); } try { this.file = FileUtil.getFileUtil().canonicalFile(path); } catch (SecurityException ex) { throw new FileSecurityException(this, "setPath", ex); } catch (IOException ex) { throw new FileCanonicalizationException(this, "setPath", ex); } this.cpath = this.file.getPath(); } /** * Opens (constructs) this object's {@link #raf RandomAccessFile}.

* * @throws UnexpectedFileNotFoundException if a * FileNotFoundException is thrown in reponse to * constructing the RandomAccessFile object. * @throws FileSecurityException if a required system property value cannot * be accessed, or if a Java security manager exists and its * {@link java.lang.SecurityManager#checkRead} method * denies read access to the file; or if its {@link * java.lang.SecurityManager#checkWrite(java.lang.String)} * method denies write access to the file */ private final void openRAF() throws LockFile.UnexpectedFileNotFoundException, LockFile.FileSecurityException, LockFile.UnexpectedFileIOException { try { raf = new RandomAccessFile(file, "rw"); } catch (SecurityException ex) { throw new FileSecurityException(this, "openRAF", ex); } catch (FileNotFoundException ex) { throw new UnexpectedFileNotFoundException(this, "openRAF", ex); } catch (IOException ex) { throw new UnexpectedFileIOException(this, "openRAF", ex); } } /** * Checks whether the given DataInputStream contains the * {@link #MAGIC} value. * * @param dis the stream to check * @throws FileSecurityException if a required system property value cannot * be accessed, or if a Java security manager exists and its * {@link java.lang.SecurityManager#checkRead} method * denies read access to the file * @throws UnexpectedEndOfFileException if an EOFException is * thrown while reading the DataInputStream * @throws UnexpectedFileIOException if an IOException other than * EOFException is thrown while reading the * DataInputStream * @throws WrongMagicException if a value other than MAGIC is read * from the DataInputStream */ private final void checkMagic(final DataInputStream dis) throws LockFile.FileSecurityException, LockFile.UnexpectedEndOfFileException, LockFile.UnexpectedFileIOException, LockFile.WrongMagicException { boolean success = true; final byte[] magic = new byte[MAGIC.length]; try { for (int i = 0; i < MAGIC.length; i++) { magic[i] = dis.readByte(); if (MAGIC[i] != magic[i]) { success = false; } } } catch (SecurityException ex) { throw new FileSecurityException(this, "checkMagic", ex); } catch (EOFException ex) { throw new UnexpectedEndOfFileException(this, "checkMagic", ex); } catch (IOException ex) { throw new UnexpectedFileIOException(this, "checkMagic", ex); } if (!success) { throw new WrongMagicException(this, "checkMagic", magic); } } /** * Retrieves the last written hearbeat timestamp from this object's lock * file. If this object's lock file does not exist, then Long.MIN_VALUE * (the earliest time representable as a long in Java) is * returned immediately.

* * @return the hearbeat timestamp read from this object's lock file, * as a long value or, if this object's lock * file does not exist, Long.MIN_VALUE, the earliest time * representable as a long in Java. * @throws FileSecurityException if a required system property value cannot * be accessed, or if a Java security manager exists and its * {@link java.lang.SecurityManager#checkRead} method * denies read access to the file * @throws UnexpectedEndOfFileException if an EOFException is * thrown while attempting to read the target file's MAGIC * or heartbeat timestamp value * @throws UnexpectedFileNotFoundException if, after successfully testing * for existence, the target file is not found a moment later while * attempting to read its MAGIC and heartbeat timestamp * values * @throws UnexpectedFileIOException if any other input stream error occurs * @throws WrongMagicException if the lock file does not start with the * the {@link #MAGIC} value */ private final long readHeartbeat() throws LockFile.FileSecurityException, LockFile.UnexpectedFileNotFoundException, LockFile.UnexpectedEndOfFileException, LockFile.UnexpectedFileIOException, LockFile.WrongMagicException { FileInputStream fis = null; DataInputStream dis = null; try { if (!file.exists()) { return Long.MIN_VALUE; } fis = new FileInputStream(file); dis = new DataInputStream(fis); checkMagic(dis); return dis.readLong(); } catch (SecurityException ex) { throw new FileSecurityException(this, "readHeartbeat", ex); } catch (FileNotFoundException ex) { throw new UnexpectedFileNotFoundException(this, "readHeartbeat", ex); } catch (EOFException ex) { throw new UnexpectedEndOfFileException(this, "readHeartbeat", ex); } catch (IOException ex) { throw new UnexpectedFileIOException(this, "readHeartbeat", ex); } finally { if (fis != null) { try { fis.close(); } catch (IOException ioe) { // ioe.printStackTrace(); } } } } /** * Schedules the lock heartbeat task. */ private final void startHeartbeat() { if (timerTask == null || HsqlTimer.isCancelled(timerTask)) { Runnable runner = new HeartbeatRunner(); timerTask = timer.schedulePeriodicallyAfter(0, HEARTBEAT_INTERVAL, runner, true); } } /** * Cancels the lock heartbeat task. */ private final void stopHeartbeat() { if (timerTask != null && !HsqlTimer.isCancelled(timerTask)) { HsqlTimer.cancel(timerTask); timerTask = null; } } /** * Writes the {@link #MAGIC} value to this object's lock file that * distiguishes it as an HSQLDB lock file.

* * @throws FileSecurityException possibly never (seek and write are native * methods whose JavaDoc entries do not actually specify throwing * SecurityException). However, it is conceivable that these * native methods may, in turn, access Java methods that do * throw SecurityException. In this case, a * SecurityException might be thrown if a required system * property value cannot be accessed, or if a security manager exists * and its {@link * java.lang.SecurityManager#checkWrite(java.io.FileDescriptor)} * method denies write access to the file * @throws UnexpectedEndOfFileException if an end of file exception is * thrown while attempting to write the MAGIC value to the * target file (typically, this cannot happen, but the case is * included to distiguish it from the general IOException * case). * @throws UnexpectedFileIOException if any other I/O error occurs while * attepting to write the MAGIC value to the target file. */ private final void writeMagic() throws LockFile.FileSecurityException, LockFile.UnexpectedEndOfFileException, LockFile.UnexpectedFileIOException { try { raf.seek(0); raf.write(MAGIC); } catch (SecurityException ex) { throw new FileSecurityException(this, "writeMagic", ex); } catch (EOFException ex) { throw new UnexpectedEndOfFileException(this, "writeMagic", ex); } catch (IOException ex) { throw new UnexpectedFileIOException(this, "writeMagic", ex); } } /** * Writes the current hearbeat timestamp value to this object's lock * file.

* * @throws FileSecurityException possibly never (seek and write are native * methods whose JavaDoc entries do not actually specifiy throwing * SecurityException). However, it is conceivable that these * native methods may, in turn, access Java methods that do throw * SecurityException. In this case, a * SecurityException might be thrown if a required system * property value cannot be accessed, or if a security manager exists * and its {@link * java.lang.SecurityManager#checkWrite(java.io.FileDescriptor)} * method denies write access to the file * @throws UnexpectedEndOfFileException if an end of file exception is * thrown while attepting to write the heartbeat timestamp value to * the target file (typically, this cannot happen, but the case is * included to distiguish it from the general IOException case). * @throws UnexpectedFileIOException if the current heartbeat timestamp * value cannot be written due to an underlying I/O error */ private final void writeHeartbeat() throws LockFile.FileSecurityException, LockFile.UnexpectedEndOfFileException, LockFile.UnexpectedFileIOException { try { raf.seek(MAGIC.length); raf.writeLong(System.currentTimeMillis()); } catch (SecurityException ex) { throw new FileSecurityException(this, "writeHeartbeat", ex); } catch (EOFException ex) { throw new UnexpectedEndOfFileException(this, "writeHeartbeat", ex); } catch (IOException ex) { throw new UnexpectedFileIOException(this, "writeHeartbeat", ex); } } /** * Tests whether some other object is "equal to" this one.

* * An object is considered equal to a LockFile object if and * only if it is not null, it is an instance of LockFile and * either it is the identical instance or it has the same lock file. More * formally, is is considered equal if and only if it is not null, it is an * instance of LockFile, and the expression:

* *

     * this == other ||
     * this.file == null ? other.file == null : this.file.equals(other.file);
     * 
* * yeilds true.

* * Note that file must be a canonical reference to correctly * satisfy this contract.

* * @param obj the reference object with which to compare. * @return true if this object is equal to the obj * argument; false otherwise. * @see #hashCode */ public final boolean equals(final Object obj) { if (this == obj) { return true; } else if (obj instanceof LockFile) { LockFile other = (LockFile) obj; return (this.file == null) ? other.file == null : this.file.equals(other.file); } return false; } /** * Retrieves the canonical path of this object's lock file, as a * String object.

* * @return the canonical path of this object's lock file. */ public final String getCanonicalPath() { return cpath; } /** * Retrieves the hash code value for this object.

* * The value is zero if file is null, else the * hashCode of file. That is, two LockFile * objects have the same hashCode value if they refer to the * same lock file.

* * Note that file must be a canonical reference to correctly * satisfy this contract.

* * @return a hash code value for this object. * @see #equals(java.lang.Object) */ public final int hashCode() { return file == null ? 0 : file.hashCode(); } /** * Retrieves whether this object has successfully obtained and is still * holding (has not yet released) a cooperative lock condition on its * lock file.

* * Note:

* * Due to platform-independence retrictions placed on a JVM, it is quite * possible to successfully acquire a lock condition and yet for the * condition to become invalid while still held.

* * For instance, under JVMs with no java.nio package or under * operating systems that do not apply mandatory file locking (espcially * mandatory locking that precludes deletion), it is quite possible for * another process or even an uncooperative bit of code running in the same * JVM to overwrite or delete the target lock file while this object holds * a lock condition.

* * Because of this, the isValid() method is provided in the public * interface in order to allow clients to detect at least a subset of such * situations.

* * @return true if this object has successfully obtained and is * still holding (has not yet released) a lock condition, else * false * @see #isValid */ public final boolean isLocked() { return locked; } /** * Retrieves whether there is potentially already a cooperative lock, * operating system lock or some other situation preventing a cooperative * lock condition from being aquired using the specified path. * * @param path the path to test * @return true if there is currently something preventing the * acquisition of a cooperative lock condition using the specified * path, else false */ public static final boolean isLocked(final String path) { boolean locked = true; try { LockFile lockFile = LockFile.newLockFile(path); lockFile.checkHeartbeat(false); locked = false; } catch (Exception e) {} return locked; } /** * Retrieves whether this object holds a valid lock condition on its * lock file.

* * More formally, this method retrieves true if and only if:

* *

     * isLocked() && file != null && file.exists() && raf != null
     * 
* * @return true if this object holds a valid lock condition on its * lock file; else false * @throws SecurityException if a required system property value cannot * be accessed, or if a Java security manager exists and its * checkRead method denies read access to the lock file; */ public boolean isValid() { return isLocked() && file != null && file.exists() && raf != null; } /** * Retrieves a String representation of this object.

* * The String is of the form:

* *

     * super.toString() +
     * "[file=" + getCanonicalPath() +
     * ", exists=" + file.exists() +
     * ", locked=" + isLocked() +
     * ", valid=" + isValid() +
     * ", " + toStringImpl() +
     * "]";
     * 
* * * @return a String representation of this object. * @see #toStringImpl * @throws SecurityException if a required system property value cannot * be accessed, or if a security manager exists and its {@link * java.lang.SecurityManager#checkRead} method denies * read access to the lock file; */ public String toString() { return new StringBuffer(super.toString()).append("[file =").append( cpath).append(", exists=").append(file.exists()).append( ", locked=").append(isLocked()).append(", valid=").append( isValid()).append(", ").append(toStringImpl()).append( "]").toString(); } /** * Retrieves an implementation-specific tail value for the * toString() method.

* * The default implementation returns the empty string. * * @return an implementation-specific tail value for the toString() * method * @see #toString */ protected String toStringImpl() { return ""; } /** * Retrieves the number of times checkHeartbeat may fail before * pollHeartbeat fails as a consequence.

* * The value is obtained in the following manner:

* *

    *
  1. retries is assigned POLL_RETRIES_DEFAULT. * *
  2. retries is assigned Integer.getInteger(POLL_RETRIES_PROPERTY, * retries) inside a try-catch block to silently ignore any security * exception. * *
  3. If retries is less than one (1), retries is assigned one (1). *
* * @return the number of times checkHeartbeat may fail before * pollHeartbeat fails as a consequence. */ public int getPollHeartbeatRetries() { int retries = POLL_RETRIES_DEFAULT; try { retries = Integer.getInteger( HsqlDatabaseProperties.system_lockfile_poll_retries_property, retries).intValue(); } catch (Exception e) {} if (retries < 1) { retries = 1; } return retries; } /** * Retrieves the interval, in milliseconds, that pollHeartbeat * waits between failed invocations of checkHeartbeat. * * The value is obtained in the following manner:

* *

    *
  1. interval is assigned 10 + (HEARTBEAT_INTERVAL_PADDED * getPollHeartbeatRetries()) * *
  2. interval is assigned Long.getLong(POLL_INTERVAL_PROPERTY, * interval), inside a try-catch block, to silently ignore any security * exception. * *
  3. If interval is less than or equal to zero (0), interval is reassigned * 10 + (HEARTBEAT_INTERVAL_PADDED / getPollHeartbeatRetries()) *
* * @return the interval, in milliseconds, that pollHeartbeat * waits between failed invocations of checkHeartbeat */ public long getPollHeartbeatInterval() { int retries = getPollHeartbeatRetries(); long interval = 10 + (HEARTBEAT_INTERVAL_PADDED / retries); try { interval = Long.getLong(POLL_INTERVAL_PROPERTY, interval).longValue(); } catch (Exception e) {} if (interval <= 0) { interval = 10 + (HEARTBEAT_INTERVAL_PADDED / retries); } return interval; } /** * Polls the underlying lock file to determine if a lock condition * exists.

* * Specifically, polls {@link #checkHeartbeat(boolean) checkHeartbeat} at * the configured interval until the check passes, the current poll interval * wait state is interrupted or the configured number of poll retries is * reached.

* * The last exception thrown by checkHeartbeat is re-thrown if no * check passes.

* * @throws FileSecurityException if the Java security system denied read * to the target file * @throws LockHeldExternallyException if the target file's heartbeat * timestamp indicated that a lock condition was held by another * LockFile. * @throws UnexpectedFileNotFoundException if the target file became * unavailable between a test for existence and an attempt to read * the MAGIC or heartbeat timestamp value. * @throws UnexpectedEndOfFileException if an EOFException was * raised while trying to read the MAGIC or heartbeat * timestamp value of the target file * @throws UnexpectedFileIOException if an EOFException other than * EOFException was raised while trying to read the * MAGIC or heartbeat timestamp value of the target file * @throws WrongLengthException if the target file did not have the * expected length * @throws WrongMagicException if the target file did not begin with the * expected MAGIC value */ private final void pollHeartbeat() throws LockFile.FileSecurityException, LockFile.LockHeldExternallyException, LockFile.UnexpectedFileNotFoundException, LockFile.UnexpectedEndOfFileException, LockFile.UnexpectedFileIOException, LockFile.WrongLengthException, LockFile.WrongMagicException { boolean success = false; int retries = getPollHeartbeatRetries(); long interval = getPollHeartbeatInterval(); LockFile.BaseException reason = null; for (int i = retries; i > 0; i--) { try { checkHeartbeat(true); // withCreateNewFile == true success = true; break; } catch (LockFile.BaseException ex) { reason = ex; } // We get here if and only if success == false and reason != null, // so its OK to 'break' try { Thread.sleep(interval); } catch (InterruptedException ex) { break; } } /** * @todo: * Do not want to specify just BaseException in the throws clause. * Is this really the cleanest way? */ if (!success) { if (reason instanceof FileSecurityException) { throw (FileSecurityException) reason; } else if (reason instanceof LockHeldExternallyException) { throw (LockHeldExternallyException) reason; } else if (reason instanceof UnexpectedFileNotFoundException) { throw (UnexpectedFileNotFoundException) reason; } else if (reason instanceof UnexpectedEndOfFileException) { throw (UnexpectedEndOfFileException) reason; } else if (reason instanceof UnexpectedFileIOException) { throw (UnexpectedFileIOException) reason; } else if (reason instanceof WrongLengthException) { throw (WrongLengthException) reason; } else if (reason instanceof WrongMagicException) { throw (WrongMagicException) reason; } } } /** * Attempts to obtain a cooperative lock condition upon this object's lock * file.

* * @return true if this object already holds a lock or the lock was * obtained successfully, else false * @throws FileSecurityException if the lock condition could not be * obtained due to a Java security permission violation * @throws LockHeldExternallyException if the lock condition could not * be obtained because the target file's heartbeat timestamp indicated * that a lock condition was held by another LockFile. * @throws UnexpectedFileNotFoundException if the lock condition could not * be obtained because the target file became unavailable between a * successful test for existence and an attempt to read its * MAGIC or heartbeat timestamp value. * @throws UnexpectedEndOfFileException if the lock condition could not be * obtained because EOFException was raised while trying to * read the MAGIC or heartbeat timestamp value of the target * file * @throws UnexpectedFileIOException if the lock condition could not be * obtained due to an IOException other than * EOFException * @throws WrongLengthException if the lock condition could not be obtained * because the target file was the wrong length * @throws WrongMagicException if the lock condition could not be obtained * because the target file had the wrong MAGIC value * @return true if and only if a lock condition is obtained; * false otherwise. In general, an exception will * always be thrown if a lock condition cannot be obtained for * any reason */ public final boolean tryLock() throws LockFile.FileSecurityException, LockFile.LockHeldExternallyException, LockFile.UnexpectedFileNotFoundException, LockFile.UnexpectedEndOfFileException, LockFile.UnexpectedFileIOException, LockFile.WrongLengthException, LockFile.WrongMagicException { if (this.locked) { return true; } try { pollHeartbeat(); openRAF(); // Must come *after* openRAF to comply with the // doOptionalLockActions() PRE: assertion contract. // // In an ideal world, it would be possible from Java to open // a file handle and obtain at least one associated NIO FileLock in // one kernel-enforced atomic operation. However, we can't even // guarantee that NIO is available. // // Note: // The NIOLockFile version of this operation is 'self cleaning'... // if it fails for some reason, then it does a 'best effort' to // eagerly release and nullify its FileLock object before // returning. doOptionalLockActions(); // Inlined the following to reduce potential for timing issues // such as initial timer thread startup induced delay of first // pulse. // // In general, what we'll get is two initial pulses in rapid // sucession: one here and one an instant later as a result of // startHeartbeat (which is OK... no harm, and it's one-shot // behaviour, not repeated on every writeHeartbeat) // // Unfortunately, we may occasionally encounter astronomic (at least // in computer time) delays between invocation of startHeartbeat // and the time at which effort is actually expended toward writing // the initial MAGIC and heartbeat timestamp values. // // Another good reason to inline the first writeHeartbeat is to // provide a last line of defence against inter-process as well // as inter-thread race conditions. That is, exceptions thrown in // HeartbeatRunner.run() do yet get propagated anywhere useful. // // Of course, if we are operating under a fully-featured and correct // NIO implementation, the concerns described above are really // non-issues... at this point, we will have (at least in theory) a // valid OS-enforced file lock. // // But in an ideal world (with or without NIO), any pulse failure in // HeartbeatRunner.run() would flag the database Logger that a // database lock condition violation has occured, preventing further // ad-hoc operation of the database. // // The problem is, if a lock condition has been violated that is // being used by a database instance, what mechanism can be used to // safely checkpoint, backup and/or shut down that instance? For // all we know, the violation indicates that another instance is now // happily writing to the other database files... // // A prudent course of action to take under detection of a // cooperative lock condition violation in the heartbeatRunner task // would be to perform a 'SCRIPT ' to some pre-ordained 'safe' // backup location using a globally unique file name and then do a // 'SHUTDOWN IMMEDIATELY' in one database-scope atomic context (e.g. // a single JDBC statement execution). // // However, by the time a lock condition violation has been detected, // the data cache file (and log/script) may already be quite // corrupted, meaning the resulting script may be totally inaccurate // or worse. // // Bottom line: // // Regardless of this inlining measure, if a lock violation occurs // after startHeartbeat, it's almost certain there's much worse in // store... writeMagic(); writeHeartbeat(); FileUtil.getFileUtil().deleteOnExit(file); this.locked = true; startHeartbeat(); } finally { if (!locked) { // No harm in this... // // If this LockFile is an NIOLockFile instance and // doOptionalLockActions() failed above, then a 'best // effort' optional release was already perfomed and // this will be a no-op. // // On the other hand, if doOptionalLockActions() succeeded, best // to undo them here right away, since the core locking work // failed. // // In practice, however, it is very unlikely for the core // locking work to fail if this LockFile is an NIOLockFile // instance and doOptionalLockActions() succeeded, except // under JVM implementations whose NIO package is broken in // a very specific way. // // Other possibilities include unfortunate timing of events // under certain network file system or removable media // configurations, device umounts, physical removal of storage // media, Java security or file system security policy // updates, etc. doOptionalReleaseActions(); try { closeRAF(); } catch (Exception ex) { // It's too late to do anything useful with this exception. // // we've already/ failed and will let the caller know the // reason via the exception thrown in the try block. // // ex.printStackTrace(); } } } return this.locked; } /** * Attempts to release any cooperative lock condition this object * may hold upon its lock file.

* * * @return true if this object does not currently hold a * lock condition or the lock is released completely (including * successful file deletion), else false. * @throws FileSecurityException if a SecurityException is raised * in the process of releasing the lock condition * @throws UnexpectedFileIOException if an IoException is raised in the * process of releasing the lock condition */ public final boolean tryRelease() throws LockFile.FileSecurityException, LockFile.UnexpectedFileIOException { boolean released = !locked; if (released) { return true; } stopHeartbeat(); doOptionalReleaseActions(); UnexpectedFileIOException closeRAFReason = null; FileSecurityException securityReason = null; try { try { closeRAF(); } catch (UnexpectedFileIOException ex) { closeRAFReason = ex; } try { // Hack Alert: // // Even without the presence of concurrent locking attempts, // the delete or exists invocations below occasionally return // false otherwise, perhaps due to a race condition with the // heartbeat timestamp writer task or some nio file lock release // timing issue? // // TODO: // // determine if this is an external constraint or if we can // solve it instead by waiting for any in-progress // writeHeartbeat operation to conclude. Thread.sleep(100); } catch (Exception ex) { // ex.printStackTrace(); } try { released = file.delete(); // Perhaps excessive... // // Another Lockfile may recreate the file an instant after it is // deleted above (if it it deleted successfully, that is) // released = !file.exists(); } catch (SecurityException ex) { securityReason = new FileSecurityException(this, "tryRelease", ex); } } finally { // Regardless of whether all release work succeeds, it is important // to indicate that, from the perspective of this instance, a lock // condition is no longer held. // // However, in a world of concurrent execution, we do not want to // to expose this fact extenally until *after* all release work has // been at least attempted. this.locked = false; } if (closeRAFReason != null) { throw closeRAFReason; } else if (securityReason != null) { throw securityReason; } return released; } /** * Attempts to release this object's cooperative lock condition.

* * @throws Throwable if this object encounters an unhandled exception * while trying to release the cooperative lock condition */ protected final void finalize() throws Throwable { this.tryRelease(); } /** * For internal use only.

* * This Runnable class provides the implementation for the timed task * that periodically writes out a heartbeat timestamp to the lock file.

*/ private final class HeartbeatRunner implements Runnable { public void run() { try { LockFile.this.writeHeartbeat(); } catch (Throwable t) { Error.printSystemOut(t.toString()); } } } /** * Base exception class for lock condition specific exceptions.

* */ public abstract static class BaseException extends Exception { private final LockFile lockFile; private final String inMethod; /** * Constructs a new LockFile.BaseException.

* * @param lockFile the underlying LockFile object * @param inMethod the name of the method in which the exception * was originally thrown (may be passed up serveral levels) */ public BaseException(final LockFile lockFile, final String inMethod) { super(); if (lockFile == null) { throw new NullPointerException("lockFile"); } if (inMethod == null) { throw new NullPointerException("inMethod"); } this.lockFile = lockFile; this.inMethod = inMethod; } /** * Subclass-specific override.

* * @return representation of lockFile and * inMethod, as String object */ public String getMessage() { // override return "lockFile: " + lockFile + " method: " + inMethod; } /** * Getter for inMethod property.

* * @return name of method in which exception originally occured */ public String getInMethod() { return this.inMethod; } /** * Getter for lockFile property.

* * @return the underlying LockFile object */ public LockFile getLockFile() { return this.lockFile; } } /** * Thrown when canonicalization of a LockFile object's target * file path fails.

* * This is possible because the given path may be illegal on the runtime * file system or because construction of the canonical pathname may require * filesystem queries. */ public static final class FileCanonicalizationException extends BaseException { private final IOException reason; /** * Constructs a new FileCanonicalizationException.

* * @param lockFile the underlying LockFile object * @param inMethod the name of the method in which the exception * was originally thrown (may be passed up serveral levels) * @param reason the exception thrown during canonicalization */ public FileCanonicalizationException(final LockFile lockFile, final String inMethod, final IOException reason) { super(lockFile, inMethod); this.reason = reason; } /** * Retrieves the underlying IOException.

* * @return Value of property reason. */ public IOException getReason() { return this.reason; } /** * Subclass-specific override.

* * @return representation of lockFile, inMethod and * reason, as a String object */ public String getMessage() { // override return super.getMessage() + " reason: " + reason; } } /** * Thrown when access to a LockFile object's target file raises a * Java SecurityEception.

* * This can occur if a required system property value cannot be accessed, or * if a security manager exists and its {@link * java.lang.SecurityManager#checkRead} method denies read access to a * file; or if its {@link * java.lang.SecurityManager#checkRead(java.lang.String)} * method does not permit verification of the existence of all necessary * parent directories; or if its {@link * java.lang.SecurityManager#checkWrite(java.lang.String)} * method does not permit all necessary parent directories to be * created.

* */ public static final class FileSecurityException extends BaseException { private final SecurityException reason; /** * Constructs a new FileSecurityException.

* * @param lockFile the underlying LockFile object * @param inMethod the name of the method in which the exception * was originally thrown (may be passed up serveral levels) * @param reason the underlying Java security exception */ public FileSecurityException(final LockFile lockFile, final String inMethod, final SecurityException reason) { super(lockFile, inMethod); this.reason = reason; } /** * Retrieves the underlying SecurityException.

* * @return Value of property reason. */ public SecurityException getReason() { return this.reason; } /** * Subclass-specific override. * * @return representation of lockFile, inMethod and reason, as * a String object */ public String getMessage() { // override return super.getMessage() + " reason: " + reason; } } /** * Thrown when an externally held lock condition prevents lock * aquisition.

* * Specifically, this exception is thrown when polling fails because the * lock file's heartbeat timestamp value indicates that another LockFile * object still holds the lock condition.

* */ public static final class LockHeldExternallyException extends BaseException { private final long read; private final long heartbeat; /** * Constructs a new LockHeldExternallyException.

* * @param lockFile the underlying LockFile object * @param inMethod the name of the method in which the exception * was originally thrown (may be passed up serveral levels) * @param read the time, in milliseconds since 1970-01-01, at which * the heartbeat timestamp value was read from the lock file * @param heartbeat the heartbeat timestamp value, in milliseconds * since 1970-01-01, that was read from the lock file. */ public LockHeldExternallyException(final LockFile lockFile, final String inMethod, final long read, final long heartbeat) { super(lockFile, inMethod); this.read = read; this.heartbeat = heartbeat; } /** * Getter for the heartbeat attribute.

* * @return the heartbeat timestamp value, in milliseconds since * 1970-01-01, that was read from the lock file. */ public long getHeartbeat() { return this.heartbeat; } /** * Getter for the read attribute.

* * @return the time, in milliseconds since 1970-01-01, that * the heartbeat timestamp value was read from the lock file. */ public long getRead() { return this.read; } /** * Subclass-specific override.

* * @return representation of lockFile, inMethod, * read and heartbeat, as a String * object */ public String getMessage() { // override return super.getMessage() + " read: " + HsqlDateTime.getTimestampString(this.read) + " heartbeat - read: " + (this.heartbeat - this.read) + " ms."; } } /** * Thrown when access to a LockFile object's target file raises an * unexpected EOFException. */ public static final class UnexpectedEndOfFileException extends BaseException { private final EOFException reason; /** * Constructs a new UnexpectedEndOfFileException.

* * @param lockFile the underlying LockFile object * @param inMethod the name of the method in which the exception * was originally thrown (may be passed up serveral levels) * @param reason the underlying exception */ public UnexpectedEndOfFileException(final LockFile lockFile, final String inMethod, final EOFException reason) { super(lockFile, inMethod); this.reason = reason; } /** * Retrieves the underlying EOFException.

* * @return Value of property reason. */ public EOFException getReason() { return this.reason; } /** * Subclass-specific override.

* * @return representation of lockFile, inMethod and * reason, as a String object */ public String getMessage() { // override return super.getMessage() + " reason: " + reason; } } /** * Thrown when access to a LockFile object's target file raises an * unexpected IOException other than EOFException. */ public static final class UnexpectedFileIOException extends BaseException { private final IOException reason; /** * Constructs a new UnexpectedFileIOException. * * @param lockFile the underlying LockFile object * @param inMethod the name of the method in which the exception * was originally thrown (may be passed up serveral levels) * @param reason the underlying exception */ public UnexpectedFileIOException(final LockFile lockFile, final String inMethod, final IOException reason) { super(lockFile, inMethod); this.reason = reason; } /** * Retrieves the underlying IOException. * * @return Value of property reason. */ public IOException getReason() { return this.reason; } /** * Subclass-specific override. * * @return representation of lockFile, inMethod and * reason, as a String object */ public String getMessage() { // override return super.getMessage() + " reason: " + reason; } } /** * Thrown when access to a LockFile object's target file raises an * unexpected FileNotFoundException. */ public static final class UnexpectedFileNotFoundException extends BaseException { private final FileNotFoundException reason; /** * Constructs a new UnexpectedFileNotFoundException.

* * @param lockFile the underlying LockFile object * @param inMethod the name of the method in which the exception * was originally thrown (may be passed up serveral levels) * @param reason the underlying exception */ public UnexpectedFileNotFoundException( final LockFile lockFile, final String inMethod, final FileNotFoundException reason) { super(lockFile, inMethod); this.reason = reason; } /** * Retrieves the underlying FileNotFoundException. * * @return Value of property reason. */ public FileNotFoundException getReason() { return this.reason; } /** * Subclass-specific override. * * @return representation of lockFile, inMethod and reason, as * a String object */ public String getMessage() { // override return super.getMessage() + " reason: " + reason; } } /** * Thrown when it is detected that a LockFile object's target file does not * have the expected length. */ public static final class WrongLengthException extends BaseException { private final long length; /** * Constructs a new WrongLengthException. * * @param lockFile the underlying LockFile object * @param inMethod the name of the method in which the exception * was originally thrown (may be passed up serveral levels) * @param length the actual length reported by the file system */ public WrongLengthException(final LockFile lockFile, final String inMethod, final long length) { super(lockFile, inMethod); this.length = length; } /** * Retreives the actual length reported by the file system. * * @return the actual length reported by the file system */ public long getLength() { return this.length; } /** * Subclass-specific override. * * @return representation of lockFile, inMethod and length, as * a String object */ public String getMessage() { // override return super.getMessage() + " length: " + length; } } /** * Thrown when it is detected that a LockFile object's target file does not * start with the expected MAGIC value. */ public static final class WrongMagicException extends BaseException { private final byte[] magic; /** * Constructs a new WrongMagicException. * * @param lockFile the underlying LockFile object * @param inMethod the name of the method in which the exception * was originally thrown (may be passed up serveral levels) * @param magic the actual magic value read from the file */ public WrongMagicException(final LockFile lockFile, final String inMethod, final byte[] magic) { super(lockFile, inMethod); this.magic = magic; } /** * Subclass-specific override. * * @return representation of inMethod, file and magic, * as a String object */ public String getMessage() { // override String message = super.getMessage() + " magic: "; message = message + ((magic == null) ? "null" : "'" + StringConverter.byteArrayToHexString(magic) + "'"); return message; } /** * Retrieves a copy of the actual MAGIC value read from the * file.

* * @return a copy of the actual MAGIC value read from the file */ public byte[] getMagic() { return (magic == null) ? null : (byte[]) this.magic.clone(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/DataFileDefrag.java0000644000175000017500000002642212007547414024066 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.IOException; import org.hsqldb.Database; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.TableBase; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.DoubleIntIndex; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.StopWatch; import org.hsqldb.navigator.RowIterator; import org.hsqldb.rowio.RowOutputInterface; import org.hsqldb.store.BitMap; // oj@openoffice.org - changed to file access api /** * Routine to defrag the *.data file. * * This method iterates over the primary index of a table to find the * disk position for each row and stores it, together with the new position * in an array. * * A second pass over the primary index writes each row to the new disk * image after translating the old pointers to the new. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 */ final class DataFileDefrag { RandomAccessInterface randomAccessOut; long fileOffset; StopWatch stopw = new StopWatch(); String dataFileName; long[][] rootsList; Database database; DataFileCache dataCache; int scale; DoubleIntIndex pointerLookup; DataFileDefrag(Database db, DataFileCache cache, String dataFileName) { this.database = db; this.dataCache = cache; this.scale = cache.dataFileScale; this.dataFileName = dataFileName; } void process() { Throwable error = null; database.logger.logDetailEvent("Defrag process begins"); HsqlArrayList allTables = database.schemaManager.getAllTables(true); rootsList = new long[allTables.size()][]; long maxSize = 0; for (int i = 0, tSize = allTables.size(); i < tSize; i++) { Table table = (Table) allTables.get(i); if (table.getTableType() == TableBase.CACHED_TABLE) { PersistentStore store = database.persistentStoreCollection.getStore(table); long size = store.elementCount(); if (size > maxSize) { maxSize = size; } } } if (maxSize > Integer.MAX_VALUE / 2) { throw Error.error(ErrorCode.X_2200T); } try { pointerLookup = new DoubleIntIndex((int) maxSize, false); // write out the end of file position if (database.logger.isStoredFileAccess()) { randomAccessOut = ScaledRAFile.newScaledRAFile(database, dataFileName + Logger.newFileExtension, false, ScaledRAFile.DATA_FILE_STORED); } else { randomAccessOut = new ScaledRAFileSimple(database, dataFileName + Logger.newFileExtension, "rw"); } randomAccessOut.write(new byte[dataCache.initialFreePos], 0, dataCache.initialFreePos); fileOffset = dataCache.initialFreePos; for (int i = 0, tSize = allTables.size(); i < tSize; i++) { Table t = (Table) allTables.get(i); if (t.getTableType() == TableBase.CACHED_TABLE) { long[] rootsArray = writeTableToDataFile(t); rootsList[i] = rootsArray; randomAccessOut.synch(); } else { rootsList[i] = null; } database.logger.logDetailEvent("table complete " + t.getName().name); } randomAccessOut.seek(DataFileCache.LONG_FREE_POS_POS); randomAccessOut.writeLong(fileOffset); // set shadowed flag; int flags = 0; if (database.logger.propIncrementBackup) { flags = BitMap.set(flags, DataFileCache.FLAG_ISSHADOWED); } flags = BitMap.set(flags, DataFileCache.FLAG_190); flags = BitMap.set(flags, DataFileCache.FLAG_ISSAVED); randomAccessOut.seek(DataFileCache.FLAGS_POS); randomAccessOut.writeInt(flags); randomAccessOut.synch(); randomAccessOut.close(); randomAccessOut = null; for (int i = 0, size = rootsList.length; i < size; i++) { long[] roots = rootsList[i]; if (roots != null) { database.logger.logDetailEvent( "roots: " + org.hsqldb.lib.StringUtil.getList(roots, ",", "")); } } } catch (IOException e) { error = e; throw Error.error(ErrorCode.FILE_IO_ERROR, e); } catch (OutOfMemoryError e) { error = e; throw Error.error(ErrorCode.OUT_OF_MEMORY, e); } catch (Throwable t) { error = t; throw Error.error(ErrorCode.GENERAL_ERROR, t); } finally { try { if (randomAccessOut != null) { randomAccessOut.close(); } } catch (Throwable t) {} if (error instanceof OutOfMemoryError) { database.logger.logInfoEvent( "defrag failed - out of memory - required: " + maxSize * 8); } if (error == null) { database.logger.logDetailEvent("Defrag transfer complete: " + stopw.elapsedTime()); } else { database.logger.logSevereEvent("defrag failed ", error); database.logger.getFileAccess().removeElement(dataFileName + Logger.newFileExtension); } } } /** * called from outside after the complete end of defrag */ void updateTableIndexRoots() { HsqlArrayList allTables = database.schemaManager.getAllTables(true); for (int i = 0, size = allTables.size(); i < size; i++) { Table t = (Table) allTables.get(i); if (t.getTableType() == TableBase.CACHED_TABLE) { long[] rootsArray = rootsList[i]; t.setIndexRoots(rootsArray); } } } long[] writeTableToDataFile(Table table) throws IOException { Session session = database.getSessionManager().getSysSession(); PersistentStore store = table.getRowStore(session); RowOutputInterface rowOut = dataCache.rowOut.duplicate(); long[] rootsArray = table.getIndexRootsArray(); long pos = fileOffset; long count = 0; pointerLookup.removeAll(); pointerLookup.setKeysSearchTarget(); database.logger.logDetailEvent("lookup begins " + table.getName().name + " " + stopw.elapsedTime()); // all rows RowIterator it = table.rowIteratorClustered(store); for (; it.hasNext(); count++) { CachedObject row = it.getNextRow(); pointerLookup.addUnsorted((int) row.getPos(), (int) (pos / scale)); if (count != 0 && count % 100000 == 0) { database.logger.logDetailEvent("pointer pair for row " + count + " " + row.getPos() + " " + pos); } pos += row.getStorageSize(); } database.logger.logDetailEvent("table read " + table.getName().name + " " + stopw.elapsedTime()); count = 0; it = table.rowIteratorClustered(store); for (; it.hasNext(); count++) { CachedObject row = it.getNextRow(); rowOut.reset(); row.write(rowOut, pointerLookup); randomAccessOut.write(rowOut.getOutputStream().getBuffer(), 0, rowOut.size()); fileOffset += row.getStorageSize(); if (count != 0 && count % 100000 == 0) { database.logger.logDetailEvent("rows count " + count + " " + stopw.elapsedTime()); } } for (int i = 0; i < table.getIndexCount(); i++) { if (rootsArray[i] == -1) { continue; } int lookupIndex = pointerLookup.findFirstEqualKeyIndex((int) rootsArray[i]); if (lookupIndex == -1) { throw Error.error(ErrorCode.DATA_FILE_ERROR); } rootsArray[i] = pointerLookup.getValue(lookupIndex); } database.logger.logDetailEvent("table written " + table.getName().name); return rootsArray; } public long[][] getIndexRoots() { return rootsList; } static boolean checkAllTables(Database database) { Session session = database.getSessionManager().getSysSession(); HsqlArrayList allTables = database.schemaManager.getAllTables(true); for (int i = 0, tSize = allTables.size(); i < tSize; i++) { Table t = (Table) allTables.get(i); int count = 0; if (t.getTableType() == TableBase.CACHED_TABLE) { RowIterator it = t.rowIterator(session); for (; it.hasNext(); count++) { CachedObject row = it.getNextRow(); } System.out.println("table " + t.getName().name + " " + count); } } return true; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/ScaledRAStorageWrapper.java0000644000175000017500000000663012007547412025605 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.FileNotFoundException; import java.io.IOException; import org.hsqldb.Database; import org.hsqldb.lib.Storage; /** * This class is a wrapper for org.hsqldb.lib.Storage objects used by * OpenOffice.org. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 2.2.9 */ final class ScaledRAStorageWrapper implements RandomAccessInterface { final Storage file; ScaledRAStorageWrapper(Storage virtualFile) throws FileNotFoundException, IOException { this.file = virtualFile; } public long length() throws IOException { return file.length(); } public void seek(long position) throws IOException { file.seek(position); } public long getFilePointer() throws IOException { return file.getFilePointer(); } public int read() throws IOException { return file.read(); } public long readLong() throws IOException { return file.readLong(); } public int readInt() throws IOException { return file.readInt(); } public void read(byte[] b, int offset, int length) throws IOException { file.read(b, offset, length); } public void write(byte[] b, int off, int len) throws IOException { file.write(b, off, len); } public void writeInt(int i) throws IOException { file.writeInt(i); } public void writeLong(long i) throws IOException { file.writeLong(i); } public void close() throws IOException { file.close(); } public boolean isReadOnly() { return file.isReadOnly(); } public boolean ensureLength(long newLong) { return true; } public boolean setLength(long newLength) { return false; } public void synch() { // } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/RowStoreAVLMemory.java0000644000175000017500000001454512007547414024627 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.Database; import org.hsqldb.Row; import org.hsqldb.RowAVL; import org.hsqldb.RowAction; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.TransactionManager; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.rowio.RowInputInterface; /* * Implementation of PersistentStore for MEMORY tables. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class RowStoreAVLMemory extends RowStoreAVL implements PersistentStore { Database database; int rowIdSequence = 0; public RowStoreAVLMemory(PersistentStoreCollection manager, Table table) { this.database = table.database; this.manager = manager; this.table = table; this.indexList = table.getIndexList(); this.accessorList = new CachedObject[indexList.length]; manager.setStore(table, this); } public boolean isMemory() { return true; } public int getAccessCount() { return 0; } public void set(CachedObject object) {} public CachedObject get(long i) { throw Error.runtimeError(ErrorCode.U_S0500, "RowStoreAVMemory"); } public CachedObject get(long i, boolean keep) { throw Error.runtimeError(ErrorCode.U_S0500, "RowStoreAVLMemory"); } public CachedObject get(CachedObject object, boolean keep) { return object; } public int getStorageSize(long i) { return 0; } public void add(CachedObject object) {} public CachedObject get(RowInputInterface in) { return null; } public CachedObject getNewInstance(int size) { return null; } public CachedObject getNewCachedObject(Session session, Object object, boolean tx) { int id; synchronized (this) { id = rowIdSequence++; } Row row = new RowAVL(table, (Object[]) object, id, this); if (tx) { RowAction action = new RowAction(session, table, RowAction.ACTION_INSERT, row, null); row.rowAction = action; } return row; } public void removeAll() { destroy(); elementCount = 0; ArrayUtil.fillArray(accessorList, null); } public void remove(long i) {} public void removePersistence(long i) {} public void release(long i) {} public void commitPersistence(CachedObject row) {} public void commitRow(Session session, Row row, int changeAction, int txModel) { Object[] data = row.getData(); switch (changeAction) { case RowAction.ACTION_DELETE : database.logger.writeDeleteStatement(session, (Table) table, data); break; case RowAction.ACTION_INSERT : database.logger.writeInsertStatement(session, row, (Table) table); break; case RowAction.ACTION_INSERT_DELETE : // INSERT + DELETE break; case RowAction.ACTION_DELETE_FINAL : delete(session, row); break; } } public void rollbackRow(Session session, Row row, int changeAction, int txModel) { switch (changeAction) { case RowAction.ACTION_DELETE : if (txModel == TransactionManager.LOCKS) { ((RowAVL) row).setNewNodes(this); indexRow(session, row); } break; case RowAction.ACTION_INSERT : if (txModel == TransactionManager.LOCKS) { delete(session, row); remove(row.getPos()); } break; case RowAction.ACTION_INSERT_DELETE : // INSERT + DELETE if (txModel == TransactionManager.LOCKS) { remove(row.getPos()); } break; } } // public DataFileCache getCache() { return null; } public void setCache(DataFileCache cache) {} public void release() { destroy(); setTimestamp(0); ArrayUtil.fillArray(accessorList, null); elementCount = 0; } public void setAccessor(Index key, CachedObject accessor) { Index index = (Index) key; accessorList[index.getPosition()] = accessor; } public void setAccessor(Index key, long accessor) {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/RowStoreAVLHybridExtended.java0000644000175000017500000001113012007547412026242 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.Row; import org.hsqldb.RowAVL; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.TableBase; import org.hsqldb.index.Index; import org.hsqldb.index.NodeAVL; import org.hsqldb.navigator.RowIterator; /* * Implementation of PersistentStore for information schema and temp tables. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 2.0.1 */ public class RowStoreAVLHybridExtended extends RowStoreAVLHybrid { public RowStoreAVLHybridExtended(Session session, PersistentStoreCollection manager, TableBase table, boolean diskBased) { super(session, manager, table, diskBased); } public CachedObject getNewCachedObject(Session session, Object object, boolean tx) { if (indexList != table.getIndexList()) { resetAccessorKeys(table.getIndexList()); } return super.getNewCachedObject(session, object, tx); } public void indexRow(Session session, Row row) { NodeAVL node = ((RowAVL) row).getNode(0); int count = 0; while (node != null) { count++; node = node.nNext; } if (count != indexList.length) { resetAccessorKeys(table.getIndexList()); ((RowAVL) row).setNewNodes(this); } super.indexRow(session, row); } /** * Row might have changed from memory to disk or indexes added */ public void delete(Session session, Row row) { row = ((Table) table).getDeleteRowFromLog(session, row.getData()); super.delete(session, row); } public CachedObject getAccessor(Index key) { int position = key.getPosition(); if (position >= accessorList.length || indexList[position] != key) { resetAccessorKeys(table.getIndexList()); return getAccessor(key); } return accessorList[position]; } public synchronized void resetAccessorKeys(Index[] keys) { if (indexList.length == 0 || accessorList[0] == null) { indexList = keys; accessorList = new CachedObject[indexList.length]; return; } if (isCached) { resetAccessorKeysForCached(); return; } super.resetAccessorKeys(keys); } private void resetAccessorKeysForCached() { RowStoreAVLHybrid tempStore = new RowStoreAVLHybridExtended(session, manager, table, true); tempStore.changeToDiskTable(session); RowIterator iterator = table.rowIterator(this); while (iterator.hasNext()) { Row row = iterator.getNextRow(); Row newRow = (Row) tempStore.getNewCachedObject(session, row.getData(), false); tempStore.indexRow(session, newRow); } indexList = tempStore.indexList; accessorList = tempStore.accessorList; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/RowStoreAVLHybrid.java0000644000175000017500000002604712007547414024600 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.IOException; import org.hsqldb.HsqlException; import org.hsqldb.Row; import org.hsqldb.RowAVL; import org.hsqldb.RowAVLDisk; import org.hsqldb.RowAction; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.TableBase; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.index.IndexAVL; import org.hsqldb.index.NodeAVL; import org.hsqldb.index.NodeAVLDisk; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.navigator.RowIterator; import org.hsqldb.rowio.RowInputInterface; /* * Implementation of PersistentStore for result sets. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class RowStoreAVLHybrid extends RowStoreAVL implements PersistentStore { DataFileCacheSession cache; private int maxMemoryRowCount; private boolean useDisk; boolean isCached; int rowIdSequence = 0; public RowStoreAVLHybrid(Session session, PersistentStoreCollection manager, TableBase table, boolean diskBased) { this.session = session; this.manager = manager; this.table = table; this.maxMemoryRowCount = session.getResultMemoryRowCount(); this.useDisk = diskBased; if (maxMemoryRowCount == 0) { this.useDisk = false; } if (table.getTableType() == TableBase.RESULT_TABLE) { setTimestamp(session.getActionTimestamp()); } // test code to force use of cache /* if (diskBased) { this.maxMemoryRowCount = 0; this.useDisk = true; } */ // resetAccessorKeys(table.getIndexList()); manager.setStore(table, this); nullsList = new boolean[table.getColumnCount()]; } public boolean isMemory() { return !isCached; } public void setMemory(boolean mode) { useDisk = !mode; } public synchronized int getAccessCount() { return isCached ? cache.getAccessCount() : 0; } public void set(CachedObject object) {} public CachedObject get(long i) { try { if (isCached) { return cache.get(i, this, false); } else { throw Error.runtimeError(ErrorCode.U_S0500, "RowStoreAVLHybrid"); } } catch (HsqlException e) { return null; } } public CachedObject get(long i, boolean keep) { try { if (isCached) { return cache.get(i, this, keep); } else { throw Error.runtimeError(ErrorCode.U_S0500, "RowStoreAVLHybrid"); } } catch (HsqlException e) { return null; } } public CachedObject get(CachedObject object, boolean keep) { try { if (isCached) { return cache.get(object, this, keep); } else { return object; } } catch (HsqlException e) { return null; } } public int getStorageSize(long i) { try { if (isCached) { return cache.get(i, this, false).getStorageSize(); } else { return 0; } } catch (HsqlException e) { return 0; } } public void add(CachedObject object) { if (isCached) { int size = object.getRealSize(cache.rowOut); size += indexList.length * NodeAVLDisk.SIZE_IN_BYTE; size = cache.rowOut.getStorageSize(size); object.setStorageSize(size); cache.add(object); } Object[] data = ((Row) object).getData(); for (int i = 0; i < nullsList.length; i++) { if (data[i] == null) { nullsList[i] = true; } } } public CachedObject get(RowInputInterface in) { try { if (isCached) { return new RowAVLDisk(table, in); } } catch (HsqlException e) { return null; } catch (IOException e1) { return null; } return null; } public CachedObject getNewInstance(int size) { return null; } public CachedObject getNewCachedObject(Session session, Object object, boolean tx) { if (!isCached) { if (useDisk && elementCount >= maxMemoryRowCount) { changeToDiskTable(session); } } if (isCached) { Row row = new RowAVLDisk(table, (Object[]) object, this); add(row); if (tx) { RowAction.addInsertAction(session, (Table) table, row); } return row; } else { int id = rowIdSequence++; Row row = new RowAVL(table, (Object[]) object, id, this); add(row); if (tx) { RowAction action = new RowAction(session, table, RowAction.ACTION_INSERT, row, null); row.rowAction = action; } return row; } } public void removeAll() { if (!isCached) { destroy(); } elementCount = 0; ArrayUtil.fillArray(accessorList, null); for (int i = 0; i < nullsList.length; i++) { nullsList[i] = false; } } public void remove(long i) { if (isCached) { cache.remove(i, this); } } public void removePersistence(long i) {} public void release(long i) { if (isCached) { cache.release(i); } } public void commitPersistence(CachedObject row) {} public void commitRow(Session session, Row row, int changeAction, int txModel) { switch (changeAction) { case RowAction.ACTION_DELETE : remove(row.getPos()); break; case RowAction.ACTION_INSERT : break; case RowAction.ACTION_INSERT_DELETE : // INSERT + DELEETE remove(row.getPos()); break; case RowAction.ACTION_DELETE_FINAL : delete(session, row); break; } } public void rollbackRow(Session session, Row row, int changeAction, int txModel) { switch (changeAction) { case RowAction.ACTION_DELETE : row = (Row) get(row, true); ((RowAVL) row).setNewNodes(this); row.keepInMemory(false); indexRow(session, row); break; case RowAction.ACTION_INSERT : delete(session, row); remove(row.getPos()); break; case RowAction.ACTION_INSERT_DELETE : // INSERT + DELEETE remove(row.getPos()); break; } } // public DataFileCache getCache() { return cache; } public void setCache(DataFileCache cache) { throw Error.runtimeError(ErrorCode.U_S0500, "RowStoreAVLHybrid"); } public void release() { if (!isCached) { destroy(); } ArrayUtil.fillArray(accessorList, null); if (isCached) { cache.adjustStoreCount(-1); cache = null; isCached = false; } manager.setStore(table, null); elementCount = 0; } public void delete(Session session, Row row) { super.delete(session, row); } public void setAccessor(Index key, CachedObject accessor) { Index index = (Index) key; accessorList[index.getPosition()] = accessor; } public void setAccessor(Index key, long accessor) {} public synchronized void resetAccessorKeys(Index[] keys) { if (indexList.length == 0 || accessorList[0] == null) { indexList = keys; accessorList = new CachedObject[indexList.length]; return; } if (isCached) { throw Error.runtimeError(ErrorCode.U_S0500, "RowStoreAVLHybrid"); } super.resetAccessorKeys(keys); } public boolean hasNull(int pos) { return nullsList[pos]; } public final void changeToDiskTable(Session session) { cache = ((PersistentStoreCollectionSession) manager).getResultCache(); if (cache != null) { IndexAVL idx = (IndexAVL) indexList[0]; NodeAVL root = (NodeAVL) accessorList[0]; RowIterator iterator = table.rowIterator(this); ArrayUtil.fillArray(accessorList, null); elementCount = 0; isCached = true; cache.adjustStoreCount(1); while (iterator.hasNext()) { Row row = iterator.getNextRow(); Row newRow = (Row) getNewCachedObject(session, row.getData(), false); indexRow(session, newRow); } idx.unlinkNodes(root); } maxMemoryRowCount = Integer.MAX_VALUE; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/ScriptRunner.java0000644000175000017500000002567312007547414023751 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.EOFException; import java.io.InputStream; import org.hsqldb.ColumnSchema; import org.hsqldb.Database; import org.hsqldb.HsqlException; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.Row; import org.hsqldb.Session; import org.hsqldb.Statement; import org.hsqldb.StatementDML; import org.hsqldb.StatementSchema; import org.hsqldb.StatementTypes; import org.hsqldb.Table; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.IntKeyHashMap; import org.hsqldb.lib.StopWatch; import org.hsqldb.result.Result; import org.hsqldb.scriptio.ScriptReaderBase; import org.hsqldb.scriptio.ScriptReaderDecode; import org.hsqldb.scriptio.ScriptReaderText; import org.hsqldb.store.ValuePool; import org.hsqldb.types.Type; /** * Restores the state of a Database instance from an SQL log file.

* * If there is an error, processing stops at that line and the message is * logged to the application log. If memory runs out, an exception is thrown. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.7.2 */ public class ScriptRunner { public static void runScript(Database database, InputStream inputStream) { Crypto crypto = database.logger.getCrypto(); ScriptReaderBase scr; if (crypto == null) { scr = new ScriptReaderText(database, inputStream); } else { try { scr = new ScriptReaderDecode(database, inputStream, crypto, true); } catch (Throwable e) { database.logger.logSevereEvent("opening log file", e); return; } } runScript(database, scr); } /** * This is used to read the *.log file and manage any necessary * transaction rollback. */ public static void runScript(Database database, String logFilename) { Crypto crypto = database.logger.getCrypto(); ScriptReaderBase scr; try { if (crypto == null) { scr = new ScriptReaderText(database, logFilename, false); } else { scr = new ScriptReaderDecode(database, logFilename, crypto, true); } } catch (Throwable e) { // catch out-of-memory errors and terminate if (e instanceof EOFException) { // end of file - normal end } else { // stop processing on bad script line database.logger.logSevereEvent("opening log file", e); } return; } runScript(database, scr); } private static void runScript(Database database, ScriptReaderBase scr) { IntKeyHashMap sessionMap = new IntKeyHashMap(); Session current = null; int currentId = 0; String statement; int statementType; Statement dummy = new StatementDML(StatementTypes.UPDATE_CURSOR, StatementTypes.X_SQL_DATA_CHANGE, null); String databaseFile = database.getPath(); boolean fullReplay = database.getURLProperties().isPropertyTrue( HsqlDatabaseProperties.hsqldb_full_log_replay); dummy.setCompileTimestamp(Long.MAX_VALUE); database.setReferentialIntegrity(false); try { StopWatch sw = new StopWatch(); while (scr.readLoggedStatement(current)) { int sessionId = scr.getSessionNumber(); if (current == null || currentId != sessionId) { currentId = sessionId; current = (Session) sessionMap.get(currentId); if (current == null) { current = database.getSessionManager().newSessionForLog( database); sessionMap.put(currentId, current); } } if (current.isClosed()) { sessionMap.remove(currentId); continue; } Result result = null; statementType = scr.getStatementType(); switch (statementType) { case ScriptReaderBase.ANY_STATEMENT : statement = scr.getLoggedStatement(); Statement cs; try { cs = current.compileStatement(statement); if (database.getProperties().isVersion18()) { // convert BIT columns in .log to BOOLEAN if (cs.getType() == StatementTypes.CREATE_TABLE) { Table table = (Table) ((StatementSchema) cs) .getArguments()[0]; for (int i = 0; i < table.getColumnCount(); i++) { ColumnSchema column = table.getColumn(i); if (column.getDataType().isBitType()) { column.setType(Type.SQL_BOOLEAN); } } } } result = current.executeCompiledStatement(cs, ValuePool.emptyObjectArray); } catch (Throwable e) { result = Result.newErrorResult(e); } if (result != null && result.isError()) { if (result.getException() != null) { throw result.getException(); } throw Error.error(result); } break; case ScriptReaderBase.COMMIT_STATEMENT : current.commit(false); break; case ScriptReaderBase.INSERT_STATEMENT : { current.sessionContext.currentStatement = dummy; current.beginAction(dummy); Object[] data = scr.getData(); scr.getCurrentTable().insertNoCheckFromLog(current, data); current.endAction(Result.updateOneResult); break; } case ScriptReaderBase.DELETE_STATEMENT : { current.sessionContext.currentStatement = dummy; current.beginAction(dummy); Table table = scr.getCurrentTable(); Object[] data = scr.getData(); Row row = table.getDeleteRowFromLog(current, data); if (row != null) { current.addDeleteAction(table, row, null); } current.endAction(Result.updateOneResult); break; } case ScriptReaderBase.SET_SCHEMA_STATEMENT : { HsqlName name = database.schemaManager.findSchemaHsqlName( scr.getCurrentSchema()); current.setCurrentSchemaHsqlName(name); break; } case ScriptReaderBase.SESSION_ID : { break; } } if (current.isClosed()) { sessionMap.remove(currentId); } } } catch (HsqlException e) { // stop processing on bad log line String error = "statement error processing log " + databaseFile + "line: " + scr.getLineNumber(); database.logger.logSevereEvent(error, e); if (fullReplay) { throw Error.error(e, ErrorCode.ERROR_IN_SCRIPT_FILE, error); } } catch (OutOfMemoryError e) { String error = "out of memory processing log" + databaseFile + " line: " + scr.getLineNumber(); // catch out-of-memory errors and terminate database.logger.logSevereEvent(error, e); throw Error.error(ErrorCode.OUT_OF_MEMORY); } catch (Throwable e) { // stop processing on bad script line String error = "statement error processing log " + databaseFile + "line: " + scr.getLineNumber(); database.logger.logSevereEvent(error, e); if (fullReplay) { throw Error.error(e, ErrorCode.ERROR_IN_SCRIPT_FILE, error); } } finally { if (scr != null) { scr.close(); } database.getSessionManager().closeAllSessions(); database.setReferentialIntegrity(true); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/LobManager.java0000644000175000017500000014517112007547412023314 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.hsqldb.Database; import org.hsqldb.DatabaseURL; import org.hsqldb.HsqlException; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.Session; import org.hsqldb.Statement; import org.hsqldb.Table; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.LineGroupReader; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.result.Result; import org.hsqldb.result.ResultLob; import org.hsqldb.result.ResultMetaData; import org.hsqldb.store.ValuePool; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobData; import org.hsqldb.types.BlobDataID; import org.hsqldb.types.ClobData; import org.hsqldb.types.ClobDataID; import org.hsqldb.types.Collation; import org.hsqldb.types.Types; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class LobManager { static final String resourceFileName = "/org/hsqldb/resources/lob-schema.sql"; static final String[] starters = new String[]{ "/*" }; // Database database; LobStore lobStore; Session sysLobSession; volatile boolean storeModified; byte[] byteBuffer; // // int lobBlockSize; int totalBlockLimitCount = Integer.MAX_VALUE; // Statement getLob; Statement getLobPart; Statement deleteLobCall; Statement deleteLobPartCall; Statement divideLobPartCall; Statement createLob; Statement createLobPartCall; Statement updateLobLength; Statement updateLobUsage; Statement getNextLobId; Statement deleteUnusedLobs; Statement getLobCount; // boolean usageCountChanged; // ReadWriteLock lock = new ReentrantReadWriteLock(); Lock writeLock = lock.writeLock(); // LOBS columns private interface LOBS { int BLOCK_ADDR = 0; int BLOCK_COUNT = 1; int BLOCK_OFFSET = 2; int LOB_ID = 3; } private interface LOB_IDS { int LOB_ID = 0; int LOB_LENGTH = 1; int LOB_USAGE_COUNT = 2; int LOB_TYPE = 3; } private interface GET_LOB_PART { int LOB_ID = 0; int BLOCK_OFFSET = 1; int BLOCK_LIMIT = 2; } private interface DIVIDE_BLOCK { int BLOCK_OFFSET = 0; int LOB_ID = 1; } private interface DELETE_BLOCKS { int LOB_ID = 0; int BLOCK_OFFSET = 1; int BLOCK_LIMIT = 2; int TX_ID = 3; } private interface ALLOC_BLOCKS { int BLOCK_COUNT = 0; int BLOCK_OFFSET = 1; int LOB_ID = 2; } private interface UPDATE_USAGE { int BLOCK_COUNT = 0; int LOB_ID = 1; } private interface UPDATE_LENGTH { int LOB_LENGTH = 0; int LOB_ID = 1; } //BLOCK_ADDR INT, BLOCK_COUNT INT, TX_ID BIGINT private static final String initialiseBlocksSQL = "INSERT INTO SYSTEM_LOBS.BLOCKS VALUES(?,?,?)"; private static final String getLobSQL = "SELECT * FROM SYSTEM_LOBS.LOB_IDS WHERE LOB_ID = ?"; private static final String getLobPartSQL = "SELECT * FROM SYSTEM_LOBS.LOBS WHERE LOB_ID = ? AND BLOCK_OFFSET + BLOCK_COUNT > ? AND BLOCK_OFFSET < ? ORDER BY BLOCK_OFFSET"; private static final String deleteLobPartCallSQL = "CALL SYSTEM_LOBS.DELETE_BLOCKS(?,?,?,?)"; private static final String createLobSQL = "INSERT INTO SYSTEM_LOBS.LOB_IDS VALUES(?, ?, ?, ?)"; private static final String updateLobLengthSQL = "UPDATE SYSTEM_LOBS.LOB_IDS SET LOB_LENGTH = ? WHERE LOB_ID = ?"; private static final String createLobPartCallSQL = "CALL SYSTEM_LOBS.ALLOC_BLOCKS(?, ?, ?)"; private static final String divideLobPartCallSQL = "CALL SYSTEM_LOBS.DIVIDE_BLOCK(?, ?)"; private static final String getSpanningBlockSQL = "SELECT * FROM SYSTEM_LOBS.LOBS WHERE LOB_ID = ? AND ? > BLOCK_OFFSET AND ? < BLOCK_OFFSET + BLOCK_COUNT"; private static final String updateLobUsageSQL = "UPDATE SYSTEM_LOBS.LOB_IDS SET LOB_USAGE_COUNT = (CASE LOB_USAGE_COUNT WHEN 2147483647 THEN 0 ELSE LOB_USAGE_COUNT END) + ? WHERE LOB_ID = ?"; private static final String getNextLobIdSQL = "VALUES NEXT VALUE FOR SYSTEM_LOBS.LOB_ID"; private static final String deleteLobCallSQL = "CALL SYSTEM_LOBS.DELETE_LOB(?, ?)"; private static final String deleteUnusedCallSQL = "CALL SYSTEM_LOBS.DELETE_UNUSED_LOBS(?)"; private static final String getLobCountSQL = "SELECT COUNT(*) FROM SYSTEM_LOBS.LOB_IDS"; public LobManager(Database database) { this.database = database; } public void lock() { writeLock.lock(); } public void unlock() { writeLock.unlock(); } public void createSchema() { sysLobSession = database.sessionManager.getSysLobSession(); InputStream fis = (InputStream) AccessController.doPrivileged( new PrivilegedAction() { public InputStream run() { return getClass().getResourceAsStream(resourceFileName); } }); InputStreamReader reader = null; try { reader = new InputStreamReader(fis, "ISO-8859-1"); } catch (Exception e) {} LineNumberReader lineReader = new LineNumberReader(reader); LineGroupReader lg = new LineGroupReader(lineReader, starters); HashMappedList map = lg.getAsMap(); lg.close(); String sql = (String) map.get("/*lob_schema_definition*/"); Statement statement = sysLobSession.compileStatement(sql); Result result = statement.execute(sysLobSession); if (result.isError()) { throw result.getException(); } HsqlName name = database.schemaManager.getSchemaHsqlName("SYSTEM_LOBS"); Table table = database.schemaManager.getTable(sysLobSession, "BLOCKS", "SYSTEM_LOBS"); compileStatements(); } public void compileStatements() { writeLock.lock(); try { getLob = sysLobSession.compileStatement(getLobSQL); getLobPart = sysLobSession.compileStatement(getLobPartSQL); createLob = sysLobSession.compileStatement(createLobSQL); createLobPartCall = sysLobSession.compileStatement(createLobPartCallSQL); divideLobPartCall = sysLobSession.compileStatement(divideLobPartCallSQL); deleteLobCall = sysLobSession.compileStatement(deleteLobCallSQL); deleteLobPartCall = sysLobSession.compileStatement(deleteLobPartCallSQL); updateLobLength = sysLobSession.compileStatement(updateLobLengthSQL); updateLobUsage = sysLobSession.compileStatement(updateLobUsageSQL); getNextLobId = sysLobSession.compileStatement(getNextLobIdSQL); deleteUnusedLobs = sysLobSession.compileStatement(deleteUnusedCallSQL); getLobCount = sysLobSession.compileStatement(getLobCountSQL); } finally { writeLock.unlock(); } } public void initialiseLobSpace() { Statement statement = sysLobSession.compileStatement(initialiseBlocksSQL); Object[] params = new Object[3]; params[0] = ValuePool.INTEGER_0; params[1] = ValuePool.getInt(totalBlockLimitCount); params[2] = ValuePool.getLong(0); sysLobSession.executeCompiledStatement(statement, params); } public void open() { lobBlockSize = database.logger.getLobBlockSize(); if (database.getType() == DatabaseURL.S_RES) { lobStore = new LobStoreInJar(database, lobBlockSize); } else if (database.getType() == DatabaseURL.S_FILE) { lobStore = new LobStoreRAFile(database, lobBlockSize); byteBuffer = new byte[lobBlockSize]; } else { lobStore = new LobStoreMem(lobBlockSize); byteBuffer = new byte[lobBlockSize]; } } public void close() { lobStore.close(); lobStore = null; } public LobStore getLobStore() { if (lobStore == null) { open(); } return lobStore; } // private long getNewLobID() { Result result = getNextLobId.execute(sysLobSession); if (result.isError()) { return 0; } RowSetNavigator navigator = result.getNavigator(); boolean next = navigator.next(); if (!next) { navigator.release(); return 0; } Object[] data = navigator.getCurrent(); return ((Long) data[0]).longValue(); } private Object[] getLobHeader(long lobID) { ResultMetaData meta = getLob.getParametersMetaData(); Object params[] = new Object[meta.getColumnCount()]; params[0] = ValuePool.getLong(lobID); sysLobSession.sessionContext.pushDynamicArguments(params); Result result = getLob.execute(sysLobSession); sysLobSession.sessionContext.pop(); if (result.isError()) { return null; } RowSetNavigator navigator = result.getNavigator(); boolean next = navigator.next(); if (!next) { navigator.release(); return null; } Object[] data = navigator.getCurrent(); return data; } public BlobData getBlob(long lobID) { writeLock.lock(); try { Object[] data = getLobHeader(lobID); if (data == null) { return null; } BlobData blob = new BlobDataID(lobID); return blob; } finally { writeLock.unlock(); } } public ClobData getClob(long lobID) { writeLock.lock(); try { Object[] data = getLobHeader(lobID); if (data == null) { return null; } ClobData clob = new ClobDataID(lobID); return clob; } finally { writeLock.unlock(); } } public long createBlob(Session session, long length) { writeLock.lock(); try { long lobID = getNewLobID(); ResultMetaData meta = createLob.getParametersMetaData(); Object params[] = new Object[meta.getColumnCount()]; params[LOB_IDS.LOB_ID] = ValuePool.getLong(lobID); params[LOB_IDS.LOB_LENGTH] = ValuePool.getLong(length); params[LOB_IDS.LOB_USAGE_COUNT] = ValuePool.INTEGER_0; params[LOB_IDS.LOB_TYPE] = ValuePool.getInt(Types.SQL_BLOB); Result result = sysLobSession.executeCompiledStatement(createLob, params); usageCountChanged = true; return lobID; } finally { writeLock.unlock(); } } public long createClob(Session session, long length) { writeLock.lock(); try { long lobID = getNewLobID(); ResultMetaData meta = createLob.getParametersMetaData(); Object params[] = new Object[meta.getColumnCount()]; params[LOB_IDS.LOB_ID] = ValuePool.getLong(lobID); params[LOB_IDS.LOB_LENGTH] = ValuePool.getLong(length); params[LOB_IDS.LOB_USAGE_COUNT] = ValuePool.INTEGER_0; params[LOB_IDS.LOB_TYPE] = ValuePool.getInt(Types.SQL_CLOB); Result result = sysLobSession.executeCompiledStatement(createLob, params); usageCountChanged = true; return lobID; } finally { writeLock.unlock(); } } public Result deleteLob(long lobID) { writeLock.lock(); try { ResultMetaData meta = deleteLobCall.getParametersMetaData(); Object params[] = new Object[meta.getColumnCount()]; params[0] = ValuePool.getLong(lobID); params[1] = ValuePool.getLong(0); Result result = sysLobSession.executeCompiledStatement(deleteLobCall, params); usageCountChanged = true; return result; } finally { writeLock.unlock(); } } public Result deleteUnusedLobs() { writeLock.lock(); try { if (!usageCountChanged) { return Result.updateZeroResult; } Session[] sessions = database.sessionManager.getAllSessions(); long firstLobID = Long.MAX_VALUE; for (int i = 0; i < sessions.length; i++) { if (sessions[i].isClosed()) { continue; } long sessionLobID = sessions[i].sessionData.getFirstLobID(); if (sessionLobID != 0 && sessionLobID < firstLobID) { firstLobID = sessionLobID; } } Object params[] = new Object[1]; params[0] = new Long(firstLobID); Result result = sysLobSession.executeCompiledStatement(deleteUnusedLobs, params); usageCountChanged = false; return result; } finally { writeLock.unlock(); } } public Result getLength(long lobID) { writeLock.lock(); try { Object[] data = getLobHeader(lobID); if (data == null) { throw Error.error(ErrorCode.X_0F502); } long length = ((Long) data[LOB_IDS.LOB_LENGTH]).longValue(); int type = ((Integer) data[LOB_IDS.LOB_TYPE]).intValue(); return ResultLob.newLobSetResponse(lobID, length); } catch (HsqlException e) { return Result.newErrorResult(e); } finally { writeLock.unlock(); } } public int compare(BlobData a, byte[] b) { writeLock.lock(); try { Object[] data = getLobHeader(a.getId()); long aLength = ((Long) data[LOB_IDS.LOB_LENGTH]).longValue(); int[][] aAddresses = getBlockAddresses(a.getId(), 0, Integer.MAX_VALUE); int aIndex = 0; int bOffset = 0; int aOffset = 0; if (aLength == 0) { return b.length == 0 ? 0 : -1; } if (b.length == 0) { return 1; } while (true) { int aBlockOffset = aAddresses[aIndex][LOBS.BLOCK_ADDR] + aOffset; byte[] aBytes = getLobStore().getBlockBytes(aBlockOffset, 1); for (int i = 0; i < aBytes.length; i++) { if (bOffset + i >= b.length) { if (aLength == b.length) { return 0; } return 1; } if (aBytes[i] == b[bOffset + i]) { continue; } return (((int) aBytes[i]) & 0xff) > (((int) b[bOffset + i]) & 0xff) ? 1 : -1; } aOffset++; bOffset += lobBlockSize; if (aOffset == aAddresses[aIndex][LOBS.BLOCK_COUNT]) { aOffset = 0; aIndex++; } if (aIndex == aAddresses.length) { break; } if (bOffset >= b.length) { break; } } if (aLength == b.length) { return 0; } return aLength > b.length ? 1 : -1; } finally { writeLock.unlock(); } } public int compare(BlobData a, BlobData b) { if (a.getId() == b.getId()) { return 0; } writeLock.lock(); try { return compareBytes(a.getId(), b.getId()); } finally { writeLock.unlock(); } } // todo - implement as compareText() public int compare(Collation collation, ClobData a, String b) { writeLock.lock(); try { Object[] data = getLobHeader(a.getId()); long aLength = ((Long) data[LOB_IDS.LOB_LENGTH]).longValue(); int[][] aAddresses = getBlockAddresses(a.getId(), 0, Integer.MAX_VALUE); int aIndex = 0; int bOffset = 0; int aOffset = 0; if (aLength == 0) { return b.length() == 0 ? 0 : -1; } if (b.length() == 0) { return 1; } while (true) { int aBlockOffset = aAddresses[aIndex][LOBS.BLOCK_ADDR] + aOffset; byte[] aBytes = getLobStore().getBlockBytes(aBlockOffset, 1); long aLimit = aLength - ((long) aAddresses[aIndex][LOBS.BLOCK_OFFSET] + aOffset) * lobBlockSize / 2; if (aLimit > lobBlockSize / 2) { aLimit = lobBlockSize / 2; } String aString = new String(ArrayUtil.byteArrayToChars(aBytes), 0, (int) aLimit); int bLimit = b.length() - bOffset; if (bLimit > lobBlockSize / 2) { bLimit = lobBlockSize / 2; } String bString = b.substring(bOffset, bOffset + bLimit); int diff = collation.compare(aString, bString); if (diff != 0) { return diff; } aOffset++; bOffset += lobBlockSize / 2; if (aOffset == aAddresses[aIndex][LOBS.BLOCK_COUNT]) { aOffset = 0; aIndex++; } if (aIndex == aAddresses.length) { break; } if (bOffset >= b.length()) { break; } } if (aLength == b.length()) { return 0; } return aLength > b.length() ? 1 : -1; } finally { writeLock.unlock(); } } public int compare(Collation collation, ClobData a, ClobData b) { if (a.getId() == b.getId()) { return 0; } return compareText(collation, a.getId(), b.getId()); } private int compareBytes(long aID, long bID) { Object[] data = getLobHeader(aID); long aLength = ((Long) data[LOB_IDS.LOB_LENGTH]).longValue(); data = getLobHeader(bID); long bLength = ((Long) data[LOB_IDS.LOB_LENGTH]).longValue(); int[][] aAddresses = getBlockAddresses(aID, 0, Integer.MAX_VALUE); int[][] bAddresses = getBlockAddresses(bID, 0, Integer.MAX_VALUE); int aIndex = 0; int bIndex = 0; int aOffset = 0; int bOffset = 0; if (aLength == 0) { return bLength == 0 ? 0 : -1; } if (bLength == 0) { return 1; } while (true) { int aBlockOffset = aAddresses[aIndex][LOBS.BLOCK_ADDR] + aOffset; int bBlockOffset = bAddresses[bIndex][LOBS.BLOCK_ADDR] + bOffset; byte[] aBytes = getLobStore().getBlockBytes(aBlockOffset, 1); byte[] bBytes = getLobStore().getBlockBytes(bBlockOffset, 1); for (int i = 0; i < aBytes.length; i++) { if (aBytes[i] == bBytes[i]) { continue; } return (((int) aBytes[i]) & 0xff) > (((int) bBytes[i]) & 0xff) ? 1 : -1; } aOffset++; bOffset++; if (aOffset == aAddresses[aIndex][LOBS.BLOCK_COUNT]) { aOffset = 0; aIndex++; } if (bOffset == bAddresses[bIndex][LOBS.BLOCK_COUNT]) { bOffset = 0; bIndex++; } if (aIndex == aAddresses.length) { break; } if (bIndex == bAddresses.length) { break; } } if (aLength == bLength) { return 0; } return aLength > bLength ? 1 : -1; } /** @todo - word-separator and end block zero issues */ private int compareText(Collation collation, long aID, long bID) { Object[] data = getLobHeader(aID); long aLength = ((Long) data[LOB_IDS.LOB_LENGTH]).longValue(); data = getLobHeader(bID); long bLength = ((Long) data[LOB_IDS.LOB_LENGTH]).longValue(); int[][] aAddresses = getBlockAddresses(aID, 0, Integer.MAX_VALUE); int[][] bAddresses = getBlockAddresses(bID, 0, Integer.MAX_VALUE); int aIndex = 0; int bIndex = 0; int aOffset = 0; int bOffset = 0; if (aLength == 0) { return bLength == 0 ? 0 : -1; } if (bLength == 0) { return 1; } while (true) { int aBlockOffset = aAddresses[aIndex][LOBS.BLOCK_ADDR] + aOffset; int bBlockOffset = bAddresses[bIndex][LOBS.BLOCK_ADDR] + bOffset; byte[] aBytes = getLobStore().getBlockBytes(aBlockOffset, 1); byte[] bBytes = getLobStore().getBlockBytes(bBlockOffset, 1); long aLimit = aLength - ((long) aAddresses[aIndex][LOBS.BLOCK_OFFSET] + aOffset) * lobBlockSize / 2; if (aLimit > lobBlockSize / 2) { aLimit = lobBlockSize / 2; } long bLimit = bLength - ((long) bAddresses[bIndex][LOBS.BLOCK_OFFSET] + bOffset) * lobBlockSize / 2; if (bLimit > lobBlockSize / 2) { bLimit = lobBlockSize / 2; } String aString = new String(ArrayUtil.byteArrayToChars(aBytes), 0, (int) aLimit); String bString = new String(ArrayUtil.byteArrayToChars(bBytes), 0, (int) bLimit); int diff = collation.compare(aString, bString); if (diff != 0) { return diff; } aOffset++; bOffset++; if (aOffset == aAddresses[aIndex][LOBS.BLOCK_COUNT]) { aOffset = 0; aIndex++; } if (bOffset == bAddresses[bIndex][LOBS.BLOCK_COUNT]) { bOffset = 0; bIndex++; } if (aIndex == aAddresses.length) { break; } if (bIndex == bAddresses.length) { break; } } if (aLength == bLength) { return 0; } return aLength > bLength ? 1 : -1; } /** * Used for SUBSTRING */ public Result getLob(long lobID, long offset, long length) { if (offset == 0) { return createDuplicateLob(lobID, length, false); } throw Error.runtimeError(ErrorCode.U_S0500, "LobManager"); } public Result createDuplicateLob(long lobID) { Result result = getLength(lobID); if (result.isError()) { return result; } return createDuplicateLob(lobID, ((ResultLob) result).getBlockLength(), true); } public Result createDuplicateLob(long lobID, long newLength, boolean duplicate) { writeLock.lock(); try { Object[] data = getLobHeader(lobID); if (data == null) { return Result.newErrorResult(Error.error(ErrorCode.X_0F502)); } long length = ((Long) data[LOB_IDS.LOB_LENGTH]).longValue(); if (!duplicate && length <= newLength) { return ResultLob.newLobCreateBlobResponse(lobID); } long newLobID = getNewLobID(); Object params[] = new Object[data.length]; params[LOB_IDS.LOB_ID] = ValuePool.getLong(newLobID); params[1] = data[1]; params[2] = data[2]; params[3] = data[3]; Result result = sysLobSession.executeCompiledStatement(createLob, params); if (result.isError()) { return result; } usageCountChanged = true; if (newLength == 0) { return ResultLob.newLobSetResponse(newLobID, newLength); } long byteLength = newLength; int lobType = ((Integer) data[LOB_IDS.LOB_TYPE]).intValue(); if (lobType == Types.SQL_CLOB) { byteLength *= 2; } int newBlockCount = (int) (byteLength / lobBlockSize); if (byteLength % lobBlockSize != 0) { newBlockCount++; } createBlockAddresses(newLobID, 0, newBlockCount); // copy the contents int[][] sourceBlocks = getBlockAddresses(lobID, 0, Integer.MAX_VALUE); int[][] targetBlocks = getBlockAddresses(newLobID, 0, Integer.MAX_VALUE); try { copyBlockSet(sourceBlocks, targetBlocks); } catch (HsqlException e) { return Result.newErrorResult(e); } // clear the end block unused space int endOffset = (int) (byteLength % lobBlockSize); if (endOffset != 0) { int[] block = targetBlocks[targetBlocks.length - 1]; int blockOffset = block[LOBS.BLOCK_ADDR] + block[LOBS.BLOCK_COUNT] - 1; byte[] bytes = getLobStore().getBlockBytes(blockOffset, 1); ArrayUtil.fillArray(bytes, endOffset, (byte) 0); getLobStore().setBlockBytes(bytes, blockOffset, 1); } return ResultLob.newLobSetResponse(newLobID, newLength); } finally { writeLock.unlock(); } } // todo - currently returns whole length public Result getTruncateLength(long lobID) { writeLock.lock(); try { Object[] data = getLobHeader(lobID); if (data == null) { throw Error.error(ErrorCode.X_0F502); } long length = ((Long) data[LOB_IDS.LOB_LENGTH]).longValue(); int type = ((Integer) data[LOB_IDS.LOB_TYPE]).intValue(); return ResultLob.newLobSetResponse(lobID, length); } finally { writeLock.unlock(); } } private void copyBlockSet(int[][] source, int[][] target) { int sourceIndex = 0; int targetIndex = 0; int sourceOffset = 0; int targetOffset = 0; while (true) { byte[] bytes = getLobStore().getBlockBytes( source[sourceIndex][LOBS.BLOCK_ADDR] + sourceOffset, 1); getLobStore().setBlockBytes(bytes, target[targetIndex][LOBS.BLOCK_ADDR] + targetOffset, 1); sourceOffset++; targetOffset++; if (sourceOffset == source[sourceIndex][LOBS.BLOCK_COUNT]) { sourceOffset = 0; sourceIndex++; } if (targetOffset == target[targetIndex][LOBS.BLOCK_COUNT]) { targetOffset = 0; targetIndex++; } if (sourceIndex == source.length) { break; } if (targetIndex == target.length) { break; } } storeModified = true; } public Result getChars(long lobID, long offset, int length) { Result result = getBytes(lobID, offset * 2, length * 2); if (result.isError()) { return result; } byte[] bytes = ((ResultLob) result).getByteArray(); char[] chars = ArrayUtil.byteArrayToChars(bytes); return ResultLob.newLobGetCharsResponse(lobID, offset, chars); } public Result getBytes(long lobID, long offset, int length) { writeLock.lock(); try { int blockOffset = (int) (offset / lobBlockSize); int byteBlockOffset = (int) (offset % lobBlockSize); int blockLimit = (int) ((offset + length) / lobBlockSize); int byteLimitOffset = (int) ((offset + length) % lobBlockSize); if (byteLimitOffset == 0) { byteLimitOffset = lobBlockSize; } else { blockLimit++; } if (length == 0) { return ResultLob.newLobGetBytesResponse(lobID, offset, BinaryData.zeroLengthBytes); } int dataBytesPosition = 0; byte[] dataBytes = new byte[length]; int[][] blockAddresses = getBlockAddresses(lobID, blockOffset, blockLimit); if (blockAddresses.length == 0) { return Result.newErrorResult(Error.error(ErrorCode.X_0F502)); } // int i = 0; int blockCount = blockAddresses[i][LOBS.BLOCK_COUNT] + blockAddresses[i][LOBS.BLOCK_OFFSET] - blockOffset; if (blockAddresses[i][LOBS.BLOCK_COUNT] + blockAddresses[i][LOBS.BLOCK_OFFSET] > blockLimit) { blockCount -= (blockAddresses[i][LOBS.BLOCK_COUNT] + blockAddresses[i][LOBS.BLOCK_OFFSET] - blockLimit); } byte[] bytes; try { bytes = getLobStore().getBlockBytes( blockAddresses[i][LOBS.BLOCK_ADDR] - blockAddresses[i][LOBS.BLOCK_OFFSET] + blockOffset, blockCount); } catch (HsqlException e) { return Result.newErrorResult(e); } int subLength = lobBlockSize * blockCount - byteBlockOffset; if (subLength > length) { subLength = length; } System.arraycopy(bytes, byteBlockOffset, dataBytes, dataBytesPosition, subLength); dataBytesPosition += subLength; i++; for (; i < blockAddresses.length && dataBytesPosition < length; i++) { blockCount = blockAddresses[i][LOBS.BLOCK_COUNT]; if (blockAddresses[i][LOBS.BLOCK_COUNT] + blockAddresses[i][LOBS.BLOCK_OFFSET] > blockLimit) { blockCount -= (blockAddresses[i][LOBS.BLOCK_COUNT] + blockAddresses[i][LOBS.BLOCK_OFFSET] - blockLimit); } try { bytes = getLobStore().getBlockBytes( blockAddresses[i][LOBS.BLOCK_ADDR], blockCount); } catch (HsqlException e) { return Result.newErrorResult(e); } subLength = lobBlockSize * blockCount; if (subLength > length - dataBytesPosition) { subLength = length - dataBytesPosition; } System.arraycopy(bytes, 0, dataBytes, dataBytesPosition, subLength); dataBytesPosition += subLength; } return ResultLob.newLobGetBytesResponse(lobID, offset, dataBytes); } finally { writeLock.unlock(); } } private Result setBytesBA(long lobID, long offset, byte[] dataBytes, int dataLength) { if (dataLength == 0) { return ResultLob.newLobSetResponse(lobID, 0); } writeLock.lock(); try { boolean newBlocks = false; int blockOffset = (int) (offset / lobBlockSize); int byteBlockOffset = (int) (offset % lobBlockSize); int blockLimit = (int) ((offset + dataLength) / lobBlockSize); int byteLimitOffset = (int) ((offset + dataLength) % lobBlockSize); if (byteLimitOffset == 0) { byteLimitOffset = lobBlockSize; } else { blockLimit++; } int[][] blockAddresses = getBlockAddresses(lobID, blockOffset, blockLimit); int existingLimit = blockOffset; if (blockAddresses.length > 0) { existingLimit = blockAddresses[blockAddresses.length - 1][LOBS.BLOCK_OFFSET] + blockAddresses[blockAddresses.length - 1][LOBS.BLOCK_COUNT]; } if (existingLimit < blockLimit) { createBlockAddresses(lobID, existingLimit, blockLimit - existingLimit); blockAddresses = getBlockAddresses(lobID, blockOffset, blockLimit); newBlocks = true; } int currentDataOffset = 0; int currentDataLength = dataLength; try { for (int i = 0; i < blockAddresses.length; i++) { long currentBlockOffset = (long) blockAddresses[i][LOBS.BLOCK_OFFSET] * lobBlockSize; long currentBlockLength = (long) blockAddresses[i][LOBS.BLOCK_COUNT] * lobBlockSize;; long currentBlockPosition = (long) blockAddresses[i][LOBS.BLOCK_ADDR] * lobBlockSize; int padding = 0; if (offset > currentBlockOffset) { currentBlockLength -= (offset - currentBlockOffset); currentBlockPosition += (offset - currentBlockOffset); } if (currentDataLength < currentBlockLength) { if (newBlocks) { padding = (int) ((currentBlockLength - currentDataLength) % lobBlockSize); } currentBlockLength = currentDataLength; } getLobStore().setBlockBytes(dataBytes, currentBlockPosition, currentDataOffset, (int) currentBlockLength); if (padding != 0) { ArrayUtil.fillArray(byteBuffer, 0, (byte) 0); getLobStore().setBlockBytes(byteBuffer, currentBlockPosition + currentBlockLength, 0, padding); } currentDataOffset += currentBlockLength; currentDataLength -= currentBlockLength; } } catch (HsqlException e) { return Result.newErrorResult(e); } storeModified = true; return ResultLob.newLobSetResponse(lobID, 0); } finally { writeLock.unlock(); } } private Result setBytesIS(long lobID, InputStream inputStream, long length, boolean adjustLength) { long writeLength = 0; int blockLimit = (int) (length / lobBlockSize); int byteLimitOffset = (int) (length % lobBlockSize); if (byteLimitOffset == 0) { byteLimitOffset = lobBlockSize; } else { blockLimit++; } createBlockAddresses(lobID, 0, blockLimit); int[][] blockAddresses = getBlockAddresses(lobID, 0, blockLimit); for (int i = 0; i < blockAddresses.length; i++) { for (int j = 0; j < blockAddresses[i][LOBS.BLOCK_COUNT]; j++) { int localLength = lobBlockSize; ArrayUtil.fillArray(byteBuffer, 0, (byte) 0); if (i == blockAddresses.length - 1 && j == blockAddresses[i][LOBS.BLOCK_COUNT] - 1) { localLength = byteLimitOffset; } try { int count = 0; while (localLength > 0) { int read = inputStream.read(byteBuffer, count, localLength); if (read == -1) { if (adjustLength) { read = localLength; } else { return Result.newErrorResult( new EOFException()); } } else { writeLength += read; } localLength -= read; count += read; } // read more } catch (IOException e) { // deallocate return Result.newErrorResult(e); } try { getLobStore().setBlockBytes( byteBuffer, blockAddresses[i][LOBS.BLOCK_ADDR] + j, 1); } catch (HsqlException e) { return Result.newErrorResult(e); } } } storeModified = true; return ResultLob.newLobSetResponse(lobID, writeLength); } public Result setBytes(long lobID, long offset, byte[] dataBytes, int dataLength) { if (dataLength == 0) { return ResultLob.newLobSetResponse(lobID, 0); } writeLock.lock(); try { Object[] data = getLobHeader(lobID); if (data == null) { return Result.newErrorResult(Error.error(ErrorCode.X_0F502)); } long length = ((Long) data[LOB_IDS.LOB_LENGTH]).longValue(); Result result = setBytesBA(lobID, offset, dataBytes, dataLength); if (result.isError()) { return result; } if (offset + dataLength > length) { length = offset + dataLength; result = setLength(lobID, length); if (result.isError()) { return result; } } return ResultLob.newLobSetResponse(lobID, length); } finally { writeLock.unlock(); } } public Result setBytesForNewBlob(long lobID, InputStream inputStream, long length) { if (length == 0) { return ResultLob.newLobSetResponse(lobID, 0); } writeLock.lock(); try { Result result = setBytesIS(lobID, inputStream, length, false); return result; } finally { writeLock.unlock(); } } public Result setChars(long lobID, long offset, char[] chars) { if (chars.length == 0) { return ResultLob.newLobSetResponse(lobID, 0); } writeLock.lock(); try { Object[] data = getLobHeader(lobID); if (data == null) { return Result.newErrorResult(Error.error(ErrorCode.X_0F502)); } long length = ((Long) data[LOB_IDS.LOB_LENGTH]).longValue(); byte[] bytes = ArrayUtil.charArrayToBytes(chars); Result result = setBytesBA(lobID, offset * 2, bytes, chars.length * 2); if (result.isError()) { return result; } if (offset + chars.length > length) { length = offset + chars.length; result = setLength(lobID, length); if (result.isError()) { return result; } } return ResultLob.newLobSetResponse(lobID, length); } finally { writeLock.unlock(); } } public Result setCharsForNewClob(long lobID, InputStream inputStream, long length, boolean adjustLength) { if (length == 0) { return ResultLob.newLobSetResponse(lobID, 0); } writeLock.lock(); try { Result result = setBytesIS(lobID, inputStream, length * 2, adjustLength); if (result.isError()) { return result; } long newLength = ((ResultLob) result).getBlockLength(); if (newLength < length) { Result trunc = truncate(lobID, newLength); } return result; } finally { writeLock.unlock(); } } public Result truncate(long lobID, long offset) { writeLock.lock(); try { Object[] data = getLobHeader(lobID); if (data == null) { return Result.newErrorResult(Error.error(ErrorCode.X_0F502)); } long length = ((Long) data[LOB_IDS.LOB_LENGTH]).longValue(); long byteLength = offset; if (((Integer) data[LOB_IDS.LOB_TYPE]).intValue() == Types.SQL_CLOB) { byteLength *= 2; } int blockOffset = (int) ((byteLength + lobBlockSize - 1) / lobBlockSize); ResultMetaData meta = deleteLobPartCall.getParametersMetaData(); Object params[] = new Object[meta.getColumnCount()]; params[DELETE_BLOCKS.LOB_ID] = ValuePool.getLong(lobID); params[DELETE_BLOCKS.BLOCK_OFFSET] = new Integer(blockOffset); params[DELETE_BLOCKS.BLOCK_LIMIT] = ValuePool.INTEGER_MAX; params[DELETE_BLOCKS.TX_ID] = ValuePool.getLong(sysLobSession.getTransactionTimestamp()); Result result = sysLobSession.executeCompiledStatement(deleteLobPartCall, params); setLength(lobID, offset); return ResultLob.newLobTruncateResponse(lobID, offset); } finally { writeLock.unlock(); } } private Result setLength(long lobID, long length) { ResultMetaData meta = updateLobLength.getParametersMetaData(); Object params[] = new Object[meta.getColumnCount()]; params[UPDATE_LENGTH.LOB_LENGTH] = ValuePool.getLong(length); params[UPDATE_LENGTH.LOB_ID] = ValuePool.getLong(lobID); Result result = sysLobSession.executeCompiledStatement(updateLobLength, params); return result; } /** * Executes in user session. No synchronization */ public Result adjustUsageCount(Session session, long lobID, int delta) { ResultMetaData meta = updateLobUsage.getParametersMetaData(); Object params[] = new Object[meta.getColumnCount()]; params[UPDATE_USAGE.BLOCK_COUNT] = ValuePool.getInt(delta); params[UPDATE_USAGE.LOB_ID] = ValuePool.getLong(lobID); session.sessionContext.pushDynamicArguments(params); Result result = updateLobUsage.execute(session); session.sessionContext.pop(); return result; } private int[][] getBlockAddresses(long lobID, int offset, int limit) { ResultMetaData meta = getLobPart.getParametersMetaData(); Object params[] = new Object[meta.getColumnCount()]; params[GET_LOB_PART.LOB_ID] = ValuePool.getLong(lobID); params[GET_LOB_PART.BLOCK_OFFSET] = ValuePool.getInt(offset); params[GET_LOB_PART.BLOCK_LIMIT] = ValuePool.getInt(limit); sysLobSession.sessionContext.pushDynamicArguments(params); Result result = getLobPart.execute(sysLobSession); sysLobSession.sessionContext.pop(); RowSetNavigator navigator = result.getNavigator(); int size = navigator.getSize(); int[][] blocks = new int[size][3]; for (int i = 0; i < size; i++) { navigator.absolute(i); Object[] data = navigator.getCurrent(); blocks[i][LOBS.BLOCK_ADDR] = ((Integer) data[LOBS.BLOCK_ADDR]).intValue(); blocks[i][LOBS.BLOCK_COUNT] = ((Integer) data[LOBS.BLOCK_COUNT]).intValue(); blocks[i][LOBS.BLOCK_OFFSET] = ((Integer) data[LOBS.BLOCK_OFFSET]).intValue(); } navigator.release(); return blocks; } private void deleteBlockAddresses(long lobID, int offset, int limit) { ResultMetaData meta = deleteLobPartCall.getParametersMetaData(); Object params[] = new Object[meta.getColumnCount()]; params[DELETE_BLOCKS.LOB_ID] = ValuePool.getLong(lobID); params[DELETE_BLOCKS.BLOCK_OFFSET] = ValuePool.getInt(offset); params[DELETE_BLOCKS.BLOCK_LIMIT] = ValuePool.getInt(limit); params[DELETE_BLOCKS.TX_ID] = ValuePool.getLong(sysLobSession.getTransactionTimestamp()); Result result = sysLobSession.executeCompiledStatement(deleteLobPartCall, params); } private void divideBlockAddresses(long lobID, int offset) { ResultMetaData meta = divideLobPartCall.getParametersMetaData(); Object params[] = new Object[meta.getColumnCount()]; params[DIVIDE_BLOCK.BLOCK_OFFSET] = ValuePool.getInt(offset); params[DIVIDE_BLOCK.LOB_ID] = ValuePool.getLong(lobID); Result result = sysLobSession.executeCompiledStatement(divideLobPartCall, params); } private void createBlockAddresses(long lobID, int offset, int count) { ResultMetaData meta = createLobPartCall.getParametersMetaData(); Object params[] = new Object[meta.getColumnCount()]; params[ALLOC_BLOCKS.BLOCK_COUNT] = ValuePool.getInt(count); params[ALLOC_BLOCKS.BLOCK_OFFSET] = ValuePool.getInt(offset); params[ALLOC_BLOCKS.LOB_ID] = ValuePool.getLong(lobID); Result result = sysLobSession.executeCompiledStatement(createLobPartCall, params); } private int getBlockAddress(int[][] blockAddresses, int blockOffset) { for (int i = 0; i < blockAddresses.length; i++) { if (blockAddresses[i][LOBS.BLOCK_OFFSET] + blockAddresses[i][LOBS.BLOCK_COUNT] > blockOffset) { return blockAddresses[i][LOBS.BLOCK_ADDR] - blockAddresses[i][LOBS.BLOCK_OFFSET] + blockOffset; } } return -1; } public int getLobCount() { writeLock.lock(); try { sysLobSession.sessionContext.pushDynamicArguments(new Object[]{}); Result result = getLobCount.execute(sysLobSession); sysLobSession.sessionContext.pop(); RowSetNavigator navigator = result.getNavigator(); boolean next = navigator.next(); if (!next) { navigator.release(); return 0; } Object[] data = navigator.getCurrent(); return ((Number) data[0]).intValue(); } finally { writeLock.unlock(); } } public void synch() { if (storeModified) { if (lobStore != null) { writeLock.lock(); try { lobStore.synch(); storeModified = false; } finally { writeLock.unlock(); } } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/Crypto.java0000644000175000017500000001736712007547414022574 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.CipherOutputStream; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.ShortBufferException; import javax.crypto.spec.SecretKeySpec; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.StringConverter; public class Crypto { SecretKeySpec key; Cipher outCipher; Cipher inCipher; Cipher inStreamCipher; Cipher outStreamCipher; public Crypto(String keyString, String cipherName, String provider) { try { byte[] encodedKey = StringConverter.hexStringToByteArray(keyString); key = new SecretKeySpec(encodedKey, cipherName); outCipher = provider == null ? Cipher.getInstance(cipherName) : Cipher.getInstance(cipherName, provider); outCipher.init(Cipher.ENCRYPT_MODE, key); outStreamCipher = provider == null ? Cipher.getInstance(cipherName) : Cipher.getInstance(cipherName, provider); outStreamCipher.init(Cipher.ENCRYPT_MODE, key); inCipher = provider == null ? Cipher.getInstance(cipherName) : Cipher.getInstance(cipherName, provider); inCipher.init(Cipher.DECRYPT_MODE, key); inStreamCipher = provider == null ? Cipher.getInstance(cipherName) : Cipher.getInstance(cipherName, provider); inStreamCipher.init(Cipher.DECRYPT_MODE, key); return; } catch (NoSuchPaddingException e) { throw Error.error(ErrorCode.X_S0531, e); } catch (NoSuchAlgorithmException e) { throw Error.error(ErrorCode.X_S0531, e); } catch (InvalidKeyException e) { throw Error.error(ErrorCode.X_S0531, e); } catch (NoSuchProviderException e) { throw Error.error(ErrorCode.X_S0531, e); } catch (IOException e) { throw Error.error(ErrorCode.X_S0531, e); } } public synchronized InputStream getInputStream(InputStream in) { if (inCipher == null) { return in; } try { inStreamCipher.init(Cipher.DECRYPT_MODE, key); return new CipherInputStream(in, inStreamCipher); } catch (java.security.InvalidKeyException e) { throw Error.error(ErrorCode.X_S0531, e); } } public synchronized OutputStream getOutputStream(OutputStream out) { if (outCipher == null) { return out; } try { outStreamCipher.init(Cipher.ENCRYPT_MODE, key); return new CipherOutputStream(out, outStreamCipher); } catch (java.security.InvalidKeyException e) { throw Error.error(ErrorCode.X_S0531, e); } } public synchronized int decode(byte[] source, int sourceOffset, int length, byte[] dest, int destOffset) { if (inCipher == null) { return length; } try { inCipher.init(Cipher.DECRYPT_MODE, key); return inCipher.doFinal(source, sourceOffset, length, dest, destOffset); } catch (java.security.InvalidKeyException e) { throw Error.error(ErrorCode.X_S0531, e); } catch (BadPaddingException e) { throw Error.error(ErrorCode.X_S0531, e); } catch (IllegalBlockSizeException e) { throw Error.error(ErrorCode.X_S0531, e); } catch (ShortBufferException e) { throw Error.error(ErrorCode.X_S0531, e); } } public synchronized int encode(byte[] source, int sourceOffset, int length, byte[] dest, int destOffset) { if (outCipher == null) { return length; } try { outCipher.init(Cipher.ENCRYPT_MODE, key); return outCipher.doFinal(source, sourceOffset, length, dest, destOffset); } catch (java.security.InvalidKeyException e) { throw Error.error(ErrorCode.X_S0531, e); } catch (BadPaddingException e) { throw Error.error(ErrorCode.X_S0531, e); } catch (IllegalBlockSizeException e) { throw Error.error(ErrorCode.X_S0531, e); } catch (ShortBufferException e) { throw Error.error(ErrorCode.X_S0531, e); } } public static byte[] getNewKey(String cipherName, String provider) { try { KeyGenerator generator = provider == null ? KeyGenerator.getInstance(cipherName) : KeyGenerator.getInstance(cipherName, provider); SecretKey key = generator.generateKey(); byte[] raw = key.getEncoded(); return raw; } catch (java.security.NoSuchAlgorithmException e) { throw Error.error(ErrorCode.X_S0531, e); } catch (NoSuchProviderException e) { throw Error.error(ErrorCode.X_S0531, e); } } public synchronized int getEncodedSize(int size) { try { return outCipher.getOutputSize(size); } catch (IllegalStateException ex) { try { outCipher.init(Cipher.ENCRYPT_MODE, key); return outCipher.getOutputSize(size); } catch (java.security.InvalidKeyException e) { throw Error.error(ErrorCode.X_S0531, e); } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/PersistentStoreCollectionSession.java0000644000175000017500000002600412007547414030035 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.HsqlException; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.TableBase; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HsqlDeque; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.LongKeyHashMap; import org.hsqldb.store.ValuePool; /** * Collection of PersistenceStore itmes currently used by a session. * An item is retrieved based on key returned by * TableBase.getPersistenceId(). * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class PersistentStoreCollectionSession implements PersistentStoreCollection { private final Session session; private final LongKeyHashMap rowStoreMapSession = new LongKeyHashMap(); private LongKeyHashMap rowStoreMapTransaction = new LongKeyHashMap(); private LongKeyHashMap rowStoreMapStatement = new LongKeyHashMap(); private HsqlDeque rowStoreListStatement; public PersistentStoreCollectionSession(Session session) { this.session = session; } public void setStore(Object key, PersistentStore store) { TableBase table = (TableBase) key; switch (table.persistenceScope) { case TableBase.SCOPE_STATEMENT : if (store == null) { rowStoreMapStatement.remove(table.getPersistenceId()); } else { rowStoreMapStatement.put(table.getPersistenceId(), store); } break; // SYSTEM_TABLE + INFO_SCHEMA_TABLE case TableBase.SCOPE_FULL : case TableBase.SCOPE_TRANSACTION : if (store == null) { rowStoreMapTransaction.remove(table.getPersistenceId()); } else { rowStoreMapTransaction.put(table.getPersistenceId(), store); } break; case TableBase.SCOPE_SESSION : if (store == null) { rowStoreMapSession.remove(table.getPersistenceId()); } else { rowStoreMapSession.put(table.getPersistenceId(), store); } break; default : throw Error.runtimeError(ErrorCode.U_S0500, "PersistentStoreCollectionSession"); } } public PersistentStore getViewStore(long persistenceId) { return (PersistentStore) rowStoreMapStatement.get(persistenceId); } public PersistentStore getStore(Object key) { try { TableBase table = (TableBase) key; PersistentStore store; switch (table.persistenceScope) { case TableBase.SCOPE_STATEMENT : store = (PersistentStore) rowStoreMapStatement.get( table.getPersistenceId()); if (store == null) { store = session.database.logger.newStore(session, this, table); } return store; // SYSTEM_TABLE + INFO_SCHEMA_TABLE case TableBase.SCOPE_FULL : case TableBase.SCOPE_TRANSACTION : store = (PersistentStore) rowStoreMapTransaction.get( table.getPersistenceId()); if (store == null) { store = session.database.logger.newStore(session, this, table); } if (table.getTableType() == TableBase.INFO_SCHEMA_TABLE) { session.database.dbInfo.setStore(session, (Table) table, store); } return store; case TableBase.SCOPE_SESSION : store = (PersistentStore) rowStoreMapSession.get( table.getPersistenceId()); if (store == null) { store = session.database.logger.newStore(session, this, table); } return store; } } catch (HsqlException e) {} throw Error.runtimeError(ErrorCode.U_S0500, "PersistentStoreCollectionSession"); } public void clearAllTables() { clearSessionTables(); clearTransactionTables(); clearStatementTables(); closeResultCache(); } public void clearResultTables(long actionTimestamp) { if (rowStoreMapSession.isEmpty()) { return; } Iterator it = rowStoreMapSession.values().iterator(); while (it.hasNext()) { PersistentStore store = (PersistentStore) it.next(); if (store.getTimestamp() == actionTimestamp) { store.release(); it.remove(); } } } public void clearSessionTables() { if (rowStoreMapSession.isEmpty()) { return; } Iterator it = rowStoreMapSession.values().iterator(); while (it.hasNext()) { PersistentStore store = (PersistentStore) it.next(); store.release(); } rowStoreMapSession.clear(); } public void clearTransactionTables() { if (rowStoreMapTransaction.isEmpty()) { return; } Iterator it = rowStoreMapTransaction.values().iterator(); while (it.hasNext()) { PersistentStore store = (PersistentStore) it.next(); store.release(); } rowStoreMapTransaction.clear(); } public void clearStatementTables() { if (rowStoreMapStatement.isEmpty()) { return; } Iterator it = rowStoreMapStatement.values().iterator(); while (it.hasNext()) { PersistentStore store = (PersistentStore) it.next(); store.release(); } rowStoreMapStatement.clear(); } public void registerIndex(Table table) { PersistentStore store = findStore(table); if (store == null) { return; } store.resetAccessorKeys(table.getIndexList()); } public PersistentStore findStore(Table table) { PersistentStore store = null; switch (table.persistenceScope) { case TableBase.SCOPE_STATEMENT : store = (PersistentStore) rowStoreMapStatement.get( table.getPersistenceId()); break; // SYSTEM_TABLE + INFO_SCHEMA_TABLE case TableBase.SCOPE_FULL : case TableBase.SCOPE_TRANSACTION : store = (PersistentStore) rowStoreMapTransaction.get( table.getPersistenceId()); break; case TableBase.SCOPE_SESSION : store = (PersistentStore) rowStoreMapSession.get( table.getPersistenceId()); break; } return store; } public void moveData(Table oldTable, Table newTable, int colIndex, int adjust) { PersistentStore oldStore = findStore(oldTable); if (oldStore == null) { return; } PersistentStore newStore = getStore(newTable); try { newStore.moveData(session, oldStore, colIndex, adjust); } catch (HsqlException e) { newStore.release(); setStore(newTable, null); throw e; } setStore(oldTable, null); } public void push() { if (rowStoreListStatement == null) { rowStoreListStatement = new HsqlDeque(); } if (rowStoreMapStatement.isEmpty()) { rowStoreListStatement.add(ValuePool.emptyObjectArray); return; } Object[] array = rowStoreMapStatement.toArray(); rowStoreListStatement.add(array); rowStoreMapStatement.clear(); } public void pop() { Object[] array = (Object[]) rowStoreListStatement.removeLast(); clearStatementTables(); for (int i = 0; i < array.length; i++) { PersistentStore store = (PersistentStore) array[i]; rowStoreMapStatement.put(store.getTable().getPersistenceId(), store); } } DataFileCacheSession resultCache; public DataFileCacheSession getResultCache() { if (resultCache == null) { String path = session.database.logger.getTempDirectoryPath(); if (path == null) { return null; } try { resultCache = new DataFileCacheSession(session.database, path + "/session_" + Long.toString(session.getId())); resultCache.open(false); } catch (Throwable t) { return null; } } return resultCache; } public void closeResultCache() { if (resultCache != null) { try { resultCache.close(false); resultCache.deleteFile(); } catch (HsqlException e) {} resultCache = null; } } public void release() { clearAllTables(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/TextFileReader.java0000644000175000017500000002201612007547412024144 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.IOException; import java.io.UnsupportedEncodingException; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowInputText; /** * Reader for text files. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 2.2.7 */ public class TextFileReader { private RandomAccessInterface dataFile; private RowInputInterface rowIn; private TextFileSettings textFileSettings; private String header; private boolean isReadOnly; private HsqlByteArrayOutputStream buffer; TextFileReader(RandomAccessInterface dataFile, TextFileSettings textFileSettings, RowInputInterface rowIn, boolean isReadOnly) { this.dataFile = dataFile; this.textFileSettings = textFileSettings; this.rowIn = rowIn; this.isReadOnly = isReadOnly; this.buffer = new HsqlByteArrayOutputStream(128); } public RowInputInterface readObject(int pos) { boolean hasQuote = false; boolean complete = false; boolean wasCR = false; boolean wasNormal = false; buffer.reset(); pos = findNextUsedLinePos(pos); if (pos == -1) { return null; } try { dataFile.seek(pos); while (!complete) { int c = dataFile.read(); wasNormal = false; if (c == -1) { if (buffer.size() == 0) { return null; } complete = true; if (wasCR) { break; } if (!isReadOnly) { dataFile.write(TextFileSettings.BYTES_LINE_SEP, 0, TextFileSettings.BYTES_LINE_SEP.length); buffer.write(TextFileSettings.BYTES_LINE_SEP); } break; } switch (c) { case TextFileSettings.DOUBLE_QUOTE_CHAR : wasNormal = true; complete = wasCR; wasCR = false; if (textFileSettings.isQuoted) { hasQuote = !hasQuote; } break; case TextFileSettings.CR_CHAR : wasCR = !hasQuote; break; case TextFileSettings.LF_CHAR : complete = !hasQuote; break; default : wasNormal = true; complete = wasCR; wasCR = false; } buffer.write(c); } if (complete) { if (wasNormal) { buffer.setPosition(buffer.size() - 1); } String rowString; try { rowString = buffer.toString(textFileSettings.stringEncoding); } catch (UnsupportedEncodingException e) { rowString = buffer.toString(); } ((RowInputText) rowIn).setSource(rowString, pos, buffer.size()); return rowIn; } return null; } catch (IOException e) { throw Error.error(ErrorCode.TEXT_FILE_IO, e); } } public int readHeaderLine() { boolean complete = false; boolean wasCR = false; boolean wasNormal = false; buffer.reset(); try { dataFile.seek(0); } catch (IOException e) { throw Error.error(ErrorCode.TEXT_FILE_IO, e); } while (!complete) { wasNormal = false; int c; try { c = dataFile.read(); if (c == -1) { if (buffer.size() == 0) { return 0; } complete = true; if (!isReadOnly) { dataFile.write(TextFileSettings.BYTES_LINE_SEP, 0, TextFileSettings.BYTES_LINE_SEP.length); buffer.write(TextFileSettings.BYTES_LINE_SEP); } break; } } catch (IOException e) { throw Error.error(ErrorCode.TEXT_FILE); } switch (c) { case TextFileSettings.CR_CHAR : wasCR = true; break; case TextFileSettings.LF_CHAR : complete = true; break; default : wasNormal = true; complete = wasCR; wasCR = false; } if (wasCR || complete) { continue; } buffer.write(c); } if (wasNormal) { buffer.setPosition(buffer.size() - 1); } try { header = buffer.toString(textFileSettings.stringEncoding); } catch (UnsupportedEncodingException e) { header = buffer.toString(); } return buffer.size(); } // fredt - new method /** * Searches from file pointer, pos, and finds the beginning of the first * line that contains any non-space character. Increments the row counter * when a blank line is skipped. * * If none found return -1 */ private int findNextUsedLinePos(int pos) { try { int firstPos = pos; int currentPos = pos; boolean wasCR = false; dataFile.seek(pos); while (true) { int c = dataFile.read(); currentPos++; switch (c) { case TextFileSettings.CR_CHAR : wasCR = true; break; case TextFileSettings.LF_CHAR : wasCR = false; ((RowInputText) rowIn).skippedLine(); firstPos = currentPos; break; case ' ' : if (wasCR) { wasCR = false; ((RowInputText) rowIn).skippedLine(); } break; case -1 : return -1; default : if (wasCR) { wasCR = false; ((RowInputText) rowIn).skippedLine(); } return firstPos; } } } catch (IOException e) { throw Error.error(ErrorCode.TEXT_FILE_IO, e); } } public String getHeaderLine() { return header; } public int getLineNumber() { return ((RowInputText) rowIn).getLineNumber(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/Log.java0000644000175000017500000005733312007547414022032 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.File; import java.io.IOException; import org.hsqldb.Database; import org.hsqldb.HsqlException; import org.hsqldb.HsqlNameManager; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.NumberSequence; import org.hsqldb.Row; import org.hsqldb.Session; import org.hsqldb.SqlInvariants; import org.hsqldb.Table; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.FileAccess; import org.hsqldb.lib.FileArchiver; import org.hsqldb.scriptio.ScriptReaderBase; import org.hsqldb.scriptio.ScriptReaderDecode; import org.hsqldb.scriptio.ScriptReaderText; import org.hsqldb.scriptio.ScriptWriterBase; import org.hsqldb.scriptio.ScriptWriterEncode; import org.hsqldb.scriptio.ScriptWriterText; /** * This class is responsible for managing some of the database files. * An HSQLDB database consists of * a .properties file, a .script file (contains an SQL script), * a .data file (contains data of cached tables) a .backup file * a .log file and a .lobs file.

* * When using TEXT tables, a data source for each table is also present.

* * Notes on OpenOffice.org integration. * * A Storage API is used when HSQLDB is integrated into OpenOffice.org. All * file operations on the 4 main files are performed by OOo, which integrates * the contents of these files into its database file. The script format is * always TEXT in this case. * * Class has the same name as a class in Hypersonic SQL, but has been * completely rewritten since HSQLDB 1.8.0 and earlier. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @author Bob Preston (sqlbob@users dot sourceforge.net) - text table support * @version 2.2.9 * @since 1.8.0 */ public class Log { private HsqlDatabaseProperties properties; private String fileName; private Database database; private FileAccess fa; ScriptWriterBase dbLogWriter; private String scriptFileName; private String logFileName; private boolean filesReadOnly; private long maxLogSize; private int writeDelay; private DataFileCache cache; Log(Database db) { database = db; fa = db.logger.getFileAccess(); fileName = db.getPath(); properties = db.getProperties(); } void initParams() { maxLogSize = database.logger.propLogSize * 1024L * 1024; writeDelay = database.logger.propWriteDelay; filesReadOnly = database.isFilesReadOnly(); scriptFileName = fileName + Logger.scriptFileExtension; logFileName = fileName + Logger.logFileExtension; } /** * When opening a database, the hsqldb.compatible_version property is * used to determine if this version of the engine is equal to or greater * than the earliest version of the engine capable of opening that * database.

*/ void open() { initParams(); int state = properties.getDBModified(); switch (state) { case HsqlDatabaseProperties.FILES_NEW : break; case HsqlDatabaseProperties.FILES_MODIFIED : deleteNewAndOldFiles(); deleteOldTempFiles(); if (properties.isVersion18()) { if (fa.isStreamElement(scriptFileName)) { processScript(); } else { database.schemaManager.createPublicSchema(); } HsqlName name = database.schemaManager.findSchemaHsqlName( SqlInvariants.PUBLIC_SCHEMA); if (name != null) { database.schemaManager.setDefaultSchemaHsqlName(name); } } else { processScript(); } processLog(); checkpoint(); break; case HsqlDatabaseProperties.FILES_MODIFIED_NEW : renameNewDataFile(); renameNewBackup(); renameNewScript(); deleteLog(); properties.setDBModified( HsqlDatabaseProperties.FILES_NOT_MODIFIED); // continue as non-modified files // fall through case HsqlDatabaseProperties.FILES_NOT_MODIFIED : /** * if startup is after a SHUTDOWN SCRIPT and there are CACHED * or TEXT tables, perform a checkpoint so that the .script * file no longer contains CACHED or TEXT table rows. */ processScript(); if (!filesReadOnly && isAnyCacheModified()) { properties.setDBModified( HsqlDatabaseProperties.FILES_MODIFIED); checkpoint(); } break; } if (!filesReadOnly) { openLog(); properties.setDBModified(HsqlDatabaseProperties.FILES_MODIFIED); } } /** * Close all the database files. If script argument is true, no .data * or .backup file will remain and the .script file will contain all the * data of the cached tables as well as memory tables. * * This is not used for filesReadOnly databases which use shutdown. */ void close(boolean script) { closeLog(); deleteOldDataFiles(); deleteOldTempFiles(); deleteTempFileDirectory(); writeScript(script); database.logger.closeAllTextCaches(script); if (cache != null) { cache.close(true); } // set this one last to save the props properties.setProperty(HsqlDatabaseProperties.hsqldb_script_format, database.logger.propScriptFormat); properties.setDBModified(HsqlDatabaseProperties.FILES_MODIFIED_NEW); deleteLog(); if (cache != null) { if (script) { cache.deleteFile(); cache.deleteBackup(); } else { cache.backupFile(false); cache.renameBackupFile(); } } renameNewScript(); properties.setDBModified(HsqlDatabaseProperties.FILES_NOT_MODIFIED); } /** * Fast counterpart to close(). Does not perform a checkpoint or a backup * of the .data file. */ void shutdown() { if (cache != null) { cache.close(false); } database.logger.closeAllTextCaches(false); closeLog(); } /** * Deletes the leftovers from any previous unfinished operations. */ void deleteNewAndOldFiles() { deleteOldDataFiles(); fa.removeElement(fileName + Logger.dataFileExtension + Logger.newFileExtension); fa.removeElement(fileName + Logger.backupFileExtension + Logger.newFileExtension); fa.removeElement(scriptFileName + Logger.newFileExtension); } void deleteBackup() { fa.removeElement(fileName + Logger.backupFileExtension); } void deleteData() { fa.removeElement(fileName + Logger.dataFileExtension); } void backupData() throws IOException { if (database.logger.propIncrementBackup) { fa.removeElement(fileName + Logger.backupFileExtension); return; } if (fa.isStreamElement(fileName + Logger.dataFileExtension)) { FileArchiver.archive( fileName + Logger.dataFileExtension, fileName + Logger.backupFileExtension + Logger.newFileExtension, database.logger.getFileAccess(), FileArchiver.COMPRESSION_ZIP); } } void renameNewDataFile() { if (fa.isStreamElement(fileName + Logger.dataFileExtension + Logger.newFileExtension)) { fa.renameElement(fileName + Logger.dataFileExtension + Logger.newFileExtension, fileName + Logger.dataFileExtension); } } void renameNewBackup() { // required for inc backup fa.removeElement(fileName + Logger.backupFileExtension); if (fa.isStreamElement(fileName + Logger.backupFileExtension + Logger.newFileExtension)) { fa.renameElement(fileName + Logger.backupFileExtension + Logger.newFileExtension, fileName + Logger.backupFileExtension); } } void renameNewScript() { if (fa.isStreamElement(scriptFileName + Logger.newFileExtension)) { fa.renameElement(scriptFileName + Logger.newFileExtension, scriptFileName); } } void deleteNewScript() { fa.removeElement(scriptFileName + Logger.newFileExtension); } void deleteNewBackup() { fa.removeElement(fileName + Logger.backupFileExtension + Logger.newFileExtension); } void deleteLog() { fa.removeElement(logFileName); } /** * Checks all the caches and returns true if the modified flag is set for any */ boolean isAnyCacheModified() { if (cache != null && cache.isModified()) { return true; } return database.logger.isAnyTextCacheModified(); } void checkpoint() { if (filesReadOnly) { return; } boolean result = checkpointClose(); if (result) { checkpointReopen(); } else { database.logger.logSevereEvent( "checkpoint failed - see previous error", null); } } /** * Performs checkpoint including pre and post operations. Returns to the * same state as before the checkpoint. */ void checkpoint(boolean defrag) { if (filesReadOnly) { return; } if (cache == null) { defrag = false; } else if (forceDefrag()) { defrag = true; } if (defrag) { try { defrag(); database.sessionManager.resetLoggedSchemas(); return; } catch (Throwable e) { database.logger.logSevereEvent("defrag failed", e); // do normal checkpoint } } checkpoint(); } /** * Performs checkpoint including pre and post operations. Returns to the * same state as before the checkpoint. */ boolean checkpointClose() { if (filesReadOnly) { return true; } database.logger.logInfoEvent("checkpointClose start"); synchLog(); database.lobManager.synch(); database.lobManager.deleteUnusedLobs(); deleteOldDataFiles(); try { writeScript(false); } catch (Throwable e) { deleteNewScript(); database.logger.logSevereEvent("checkpoint failed - recovered", e); return false; } try { if (cache != null) { cache.commitChanges(); cache.backupFile(false); } } catch (Throwable ee) { // backup failed perhaps due to lack of disk space deleteNewScript(); deleteNewBackup(); try { if (!cache.isFileOpen()) { cache.open(false); } } catch (Throwable e1) {} database.logger.logSevereEvent("checkpoint failed - recovered", ee); return false; } closeLog(); properties.setProperty(HsqlDatabaseProperties.hsqldb_script_format, database.logger.propScriptFormat); properties.setDBModified(HsqlDatabaseProperties.FILES_MODIFIED_NEW); deleteLog(); renameNewScript(); renameNewBackup(); try { properties.setDBModified( HsqlDatabaseProperties.FILES_NOT_MODIFIED); } catch (Throwable e) {} database.logger.logInfoEvent("checkpointClose end"); return true; } boolean checkpointReopen() { if (filesReadOnly) { return true; } database.sessionManager.resetLoggedSchemas(); try { if (cache != null) { cache.openShadowFile(); } if (dbLogWriter != null) { openLog(); } properties.setDBModified(HsqlDatabaseProperties.FILES_MODIFIED); } catch (Throwable e) { return false; } return true; } /** * Writes out all the rows to a new file without fragmentation. */ public void defrag() { if (cache.fileFreePosition == cache.initialFreePos) { return; } database.logger.logInfoEvent("defrag start"); try { // test /* DataFileDefrag.checkAllTables(database); */ // synchLog(); database.lobManager.synch(); deleteOldDataFiles(); DataFileDefrag dfd = cache.defrag(); } catch (HsqlException e) { throw e; } catch (Throwable e) { database.logger.logSevereEvent("defrag failure", e); throw Error.error(ErrorCode.DATA_FILE_ERROR, e); } // test /* DataFileDefrag.checkAllTables(database); */ // database.logger.logInfoEvent("defrag end"); } /** * Returns true if lost space is above the threshold percentage */ boolean forceDefrag() { long limit = database.logger.propCacheDefragLimit * cache.getFileFreePos() / 100; long lostSize = cache.freeBlocks.getLostBlocksSize(); return limit > 0 && lostSize > limit; } /** * */ boolean hasCache() { return cache != null; } /** * Responsible for creating the data file cache instance. */ DataFileCache getCache() { if (cache == null) { cache = new DataFileCache(database, fileName); cache.open(filesReadOnly); } return cache; } void setLogSize(int megas) { maxLogSize = megas * 1024L * 1024; } /** * Write delay specifies the frequency of FileDescriptor.sync() calls. */ int getWriteDelay() { return writeDelay; } void setWriteDelay(int delay) { writeDelay = delay; if (dbLogWriter != null && dbLogWriter.getWriteDelay() != delay) { dbLogWriter.forceSync(); dbLogWriter.stop(); dbLogWriter.setWriteDelay(delay); dbLogWriter.start(); } } public void setIncrementBackup(boolean val) { if (cache != null) { cache.setIncrementBackup(val); } } /** * Various writeXXX() methods are used for logging statements. */ void writeOtherStatement(Session session, String s) { try { dbLogWriter.writeOtherStatement(session, s); } catch (IOException e) { throw Error.error(ErrorCode.FILE_IO_ERROR, logFileName); } if (maxLogSize > 0 && dbLogWriter.size() > maxLogSize) { database.logger.setCheckpointRequired(); } } void writeInsertStatement(Session session, Row row, Table t) { try { dbLogWriter.writeInsertStatement(session, row, t); } catch (IOException e) { throw Error.error(ErrorCode.FILE_IO_ERROR, logFileName); } if (maxLogSize > 0 && dbLogWriter.size() > maxLogSize) { database.logger.setCheckpointRequired(); } } void writeDeleteStatement(Session session, Table t, Object[] row) { try { dbLogWriter.writeDeleteStatement(session, t, row); } catch (IOException e) { throw Error.error(ErrorCode.FILE_IO_ERROR, logFileName); } if (maxLogSize > 0 && dbLogWriter.size() > maxLogSize) { database.logger.setCheckpointRequired(); } } void writeSequenceStatement(Session session, NumberSequence s) { try { dbLogWriter.writeSequenceStatement(session, s); } catch (IOException e) { throw Error.error(ErrorCode.FILE_IO_ERROR, logFileName); } if (maxLogSize > 0 && dbLogWriter.size() > maxLogSize) { database.logger.setCheckpointRequired(); } } void writeCommitStatement(Session session) { try { dbLogWriter.writeCommitStatement(session); } catch (IOException e) { throw Error.error(ErrorCode.FILE_IO_ERROR, logFileName); } if (maxLogSize > 0 && dbLogWriter.size() > maxLogSize) { database.logger.setCheckpointRequired(); } } void synchLog() { if (dbLogWriter != null) { dbLogWriter.forceSync(); } } /** * Wrappers for openning-starting / stoping-closing the log file and * writer. */ void openLog() { if (filesReadOnly) { return; } Crypto crypto = database.logger.getCrypto(); try { if (crypto == null) { dbLogWriter = new ScriptWriterText(database, logFileName, false, false, false); } else { dbLogWriter = new ScriptWriterEncode(database, logFileName, crypto); } dbLogWriter.setWriteDelay(writeDelay); dbLogWriter.start(); } catch (Throwable e) { throw Error.error(ErrorCode.FILE_IO_ERROR, logFileName); } } synchronized void closeLog() { if (dbLogWriter != null) { database.logger.logDetailEvent("log close size: " + dbLogWriter.size()); dbLogWriter.close(); } } /** * Write the .script file as .script.new. */ void writeScript(boolean full) { deleteNewScript(); ScriptWriterBase scw; Crypto crypto = database.logger.getCrypto(); if (crypto == null) { boolean compressed = database.logger.propScriptFormat == 3; scw = new ScriptWriterText(database, scriptFileName + Logger.newFileExtension, full, compressed); } else { scw = new ScriptWriterEncode(database, scriptFileName + Logger.newFileExtension, full, crypto); } scw.writeAll(); scw.close(); scw = null; } /** * Performs all the commands in the .script file. */ private void processScript() { ScriptReaderBase scr = null; try { Crypto crypto = database.logger.getCrypto(); if (crypto == null) { boolean compressed = database.logger.propScriptFormat == 3; scr = new ScriptReaderText(database, scriptFileName, compressed); } else { scr = new ScriptReaderDecode(database, scriptFileName, crypto, false); } Session session = database.sessionManager.getSysSessionForScript(database); scr.readAll(session); scr.close(); } catch (Throwable e) { if (scr != null) { scr.close(); if (cache != null) { cache.close(false); } database.logger.closeAllTextCaches(false); } database.logger.logWarningEvent("Script processing failure", e); if (e instanceof HsqlException) { throw (HsqlException) e; } else if (e instanceof IOException) { throw Error.error(ErrorCode.FILE_IO_ERROR, e); } else if (e instanceof OutOfMemoryError) { throw Error.error(ErrorCode.OUT_OF_MEMORY); } else { throw Error.error(ErrorCode.GENERAL_ERROR, e); } } } /** * Performs all the commands in the .log file. */ private void processLog() { if (fa.isStreamElement(logFileName)) { ScriptRunner.runScript(database, logFileName); } } void deleteOldDataFiles() { if (database.logger.isStoredFileAccess()) { return; } try { File file = new File(database.getCanonicalPath()); File[] list = file.getParentFile().listFiles(); if (list == null) { return; } for (int i = 0; i < list.length; i++) { if (list[i].getName().startsWith(file.getName()) && list[i].getName().endsWith( Logger.oldFileExtension)) { list[i].delete(); } } } catch (Throwable t) {} } void deleteOldTempFiles() { try { if (database.logger.tempDirectoryPath == null) { return; } File file = new File(database.logger.tempDirectoryPath); File[] list = file.listFiles(); if (list == null) { return; } for (int i = 0; i < list.length; i++) { list[i].delete(); } } catch (Throwable t) {} } void deleteTempFileDirectory() { try { if (database.logger.tempDirectoryPath == null) { return; } File file = new File(database.logger.tempDirectoryPath); file.delete(); } catch (Throwable t) {} } String getLogFileName() { return logFileName; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/LobStoreMem.java0000644000175000017500000001252612007547414023474 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.lib.HsqlArrayList; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.9.0 */ public class LobStoreMem implements LobStore { final int lobBlockSize; int blocksInLargeBlock = 128; int largeBlockSize; HsqlArrayList byteStoreList; public LobStoreMem(int lobBlockSize) { this.lobBlockSize = lobBlockSize; largeBlockSize = lobBlockSize * blocksInLargeBlock; byteStoreList = new HsqlArrayList(); } public byte[] getBlockBytes(int blockAddress, int blockCount) { byte[] dataBytes = new byte[blockCount * lobBlockSize]; int dataBlockOffset = 0; while (blockCount > 0) { int largeBlockIndex = blockAddress / blocksInLargeBlock; byte[] largeBlock = (byte[]) byteStoreList.get(largeBlockIndex); int blockOffset = blockAddress % blocksInLargeBlock; int currentBlockCount = blockCount; if ((blockOffset + currentBlockCount) > blocksInLargeBlock) { currentBlockCount = blocksInLargeBlock - blockOffset; } System.arraycopy(largeBlock, blockOffset * lobBlockSize, dataBytes, dataBlockOffset * lobBlockSize, currentBlockCount * lobBlockSize); blockAddress += currentBlockCount; dataBlockOffset += currentBlockCount; blockCount -= currentBlockCount; } return dataBytes; } public void setBlockBytes(byte[] dataBytes, int blockAddress, int blockCount) { int dataBlockOffset = 0; while (blockCount > 0) { int largeBlockIndex = blockAddress / blocksInLargeBlock; if (largeBlockIndex >= byteStoreList.size()) { byteStoreList.add(new byte[largeBlockSize]); } byte[] largeBlock = (byte[]) byteStoreList.get(largeBlockIndex); int blockOffset = blockAddress % blocksInLargeBlock; int currentBlockCount = blockCount; if ((blockOffset + currentBlockCount) > blocksInLargeBlock) { currentBlockCount = blocksInLargeBlock - blockOffset; } System.arraycopy(dataBytes, dataBlockOffset * lobBlockSize, largeBlock, blockOffset * lobBlockSize, currentBlockCount * lobBlockSize); blockAddress += currentBlockCount; dataBlockOffset += currentBlockCount; blockCount -= currentBlockCount; } } public void setBlockBytes(byte[] dataBytes, long position, int offset, int length) { while (length > 0) { int largeBlockIndex = (int) (position / largeBlockSize); if (largeBlockIndex >= byteStoreList.size()) { byteStoreList.add(new byte[largeBlockSize]); } byte[] largeBlock = (byte[]) byteStoreList.get(largeBlockIndex); int offsetInLargeBlock = (int) (position % largeBlockSize); int currentLength = length; if ((offsetInLargeBlock + currentLength) > largeBlockSize) { currentLength = largeBlockSize - offsetInLargeBlock; } System.arraycopy(dataBytes, offset, largeBlock, offsetInLargeBlock, currentLength); position += currentLength; offset += currentLength; length -= currentLength; } } public int getBlockSize() { return lobBlockSize; } public void close() { byteStoreList.clear(); } public void synch() {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/ScaledRAFile.java0000644000175000017500000003571412007547414023526 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.EOFException; import java.io.FileDescriptor; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.lang.reflect.Constructor; import org.hsqldb.Database; import org.hsqldb.lib.HsqlByteArrayInputStream; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.lib.Storage; /** * This class is a wrapper for a random access file such as that used for * CACHED table storage. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 */ final class ScaledRAFile implements RandomAccessInterface { static final int DATA_FILE_RAF = 0; static final int DATA_FILE_NIO = 1; static final int DATA_FILE_JAR = 2; static final int DATA_FILE_STORED = 3; static final int DATA_FILE_SINGLE = 4; static final int DATA_FILE_TEXT = 5; // static final int bufferScale = 12; static final int bufferSize = 1 << bufferScale; static final long bufferMask = 0xffffffffffffffffl << bufferScale; // final Database database; final RandomAccessFile file; final FileDescriptor fileDescriptor; private final boolean readOnly; final String fileName; final byte[] buffer; final HsqlByteArrayInputStream ba; final byte[] valueBuffer; final HsqlByteArrayOutputStream vbao; final HsqlByteArrayInputStream vbai; long bufferOffset; long fileLength; final boolean extendLength; // long seekPosition; int cacheHit; /** * seekPosition is the position in seek() calls or after reading or writing * realPosition is the file position */ static RandomAccessInterface newScaledRAFile(Database database, String name, boolean readonly, int type) throws FileNotFoundException, IOException { if (type == DATA_FILE_STORED) { try { String cname = database.getURLProperties().getProperty( HsqlDatabaseProperties.url_storage_class_name); String skey = database.getURLProperties().getProperty( HsqlDatabaseProperties.url_storage_key); Class storageClass; try { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); storageClass = classLoader.loadClass(cname); } catch (ClassNotFoundException e) { storageClass = Class.forName(cname); } Constructor constructor = storageClass.getConstructor(new Class[] { String.class, Boolean.class, Object.class }); Object accessor = constructor.newInstance(new Object[] { name, new Boolean(readonly), skey }); if (accessor instanceof RandomAccessInterface) { return (RandomAccessInterface) accessor; } else if (accessor instanceof org.hsqldb.lib.Storage) { return new ScaledRAStorageWrapper((Storage) accessor); } else { throw new IOException(); } } catch (ClassNotFoundException e) { throw new IOException(); } catch (NoSuchMethodException e) { throw new IOException(); } catch (InstantiationException e) { throw new IOException(); } catch (IllegalAccessException e) { throw new IOException(); } catch (java.lang.reflect.InvocationTargetException e) { throw new IOException(); } } if (type == DATA_FILE_JAR) { return new ScaledRAFileInJar(name); } else if (type == DATA_FILE_TEXT) { ScaledRAFile ra = new ScaledRAFile(database, name, readonly, false, true); return ra; } else if (type == DATA_FILE_RAF) { return new ScaledRAFile(database, name, readonly, true, false); } else { java.io.File fi = new java.io.File(name); long length = fi.length(); if (length > database.logger.propNioMaxSize) { return new ScaledRAFile(database, name, readonly, true, false); } try { Class.forName("java.nio.MappedByteBuffer"); return new ScaledRAFileHybrid(database, name, readonly); } catch (Exception e) { return new ScaledRAFile(database, name, readonly, true, false); } } } ScaledRAFile(Database database, String name, boolean readonly, boolean extendLengthToBlock, boolean commitOnChange) throws FileNotFoundException, IOException { this.database = database; this.fileName = name; this.readOnly = readonly; this.extendLength = extendLengthToBlock; String accessMode = readonly ? "r" : commitOnChange ? "rws" : "rw"; this.file = new RandomAccessFile(name, accessMode); buffer = new byte[bufferSize]; ba = new HsqlByteArrayInputStream(buffer); valueBuffer = new byte[8]; vbao = new HsqlByteArrayOutputStream(valueBuffer); vbai = new HsqlByteArrayInputStream(valueBuffer); fileDescriptor = file.getFD(); fileLength = length(); readIntoBuffer(); } public long length() throws IOException { return file.length(); } public void seek(long position) throws IOException { if (readOnly && fileLength < position) { throw new IOException("read beyond end of file"); } seekPosition = position; } public long getFilePointer() throws IOException { return seekPosition; } private void readIntoBuffer() throws IOException { long filePos = seekPosition & bufferMask; long readLength = fileLength - filePos; if (readLength > buffer.length) { readLength = buffer.length; } if (readLength < 0) { throw new IOException("read beyond end of file"); } try { file.seek(filePos); file.readFully(buffer, 0, (int) readLength); bufferOffset = filePos; } catch (IOException e) { resetPointer(); database.logger.logWarningEvent(" " + filePos + " " + readLength, e); throw e; } } public int read() throws IOException { try { if (seekPosition >= fileLength) { return -1; } if (seekPosition < bufferOffset || seekPosition >= bufferOffset + buffer.length) { readIntoBuffer(); } else { cacheHit++; } int val = buffer[(int) (seekPosition - bufferOffset)] & 0xff; seekPosition++; return val; } catch (IOException e) { resetPointer(); database.logger.logWarningEvent("read failed", e); throw e; } } public long readLong() throws IOException { vbai.reset(); read(valueBuffer, 0, 8); return vbai.readLong(); } public int readInt() throws IOException { vbai.reset(); read(valueBuffer, 0, 4); return vbai.readInt(); } public void read(byte[] b, int offset, int length) throws IOException { try { if (seekPosition + length > fileLength) { throw new EOFException(); } if (length > buffer.length && (seekPosition < bufferOffset || seekPosition >= bufferOffset + buffer.length)) { file.seek(seekPosition); file.readFully(b, offset, length); seekPosition += length; return; } if (seekPosition < bufferOffset || seekPosition >= bufferOffset + buffer.length) { readIntoBuffer(); } else { cacheHit++; } ba.reset(); if (seekPosition - bufferOffset != ba.skip(seekPosition - bufferOffset)) { throw new EOFException(); } int bytesRead = ba.read(b, offset, length); seekPosition += bytesRead; if (bytesRead < length) { file.seek(seekPosition); file.readFully(b, offset + bytesRead, length - bytesRead); seekPosition += (length - bytesRead); } } catch (IOException e) { resetPointer(); database.logger.logWarningEvent("failed to read a byte array", e); throw e; } } public void write(byte[] b, int off, int length) throws IOException { try { file.seek(seekPosition); if (seekPosition < bufferOffset + buffer.length && seekPosition + length > bufferOffset) { writeToBuffer(b, off, length); } file.write(b, off, length); seekPosition += length; if (!extendLength && fileLength < seekPosition) { fileLength = seekPosition; } } catch (IOException e) { resetPointer(); database.logger.logWarningEvent("failed to write a byte array", e); throw e; } } public void writeInt(int i) throws IOException { vbao.reset(); vbao.writeInt(i); write(valueBuffer, 0, 4); } public void writeLong(long i) throws IOException { vbao.reset(); vbao.writeLong(i); write(valueBuffer, 0, 8); } public void close() throws IOException { file.close(); } public boolean isReadOnly() { return readOnly; } public boolean ensureLength(long newLength) { if (newLength <= fileLength) { return true; } try { extendLength(newLength); } catch (IOException e) { return false; } return true; } public boolean setLength(long newLength) { try { file.setLength(newLength); file.seek(0); fileLength = file.length(); seekPosition = 0; readIntoBuffer(); return true; } catch (Throwable t) { return false; } } public void synch() { try { fileDescriptor.sync(); } catch (IOException e) { database.logger.logSevereEvent("RA file sync error ", e); } } private void writeToBuffer(byte[] b, int off, int len) throws IOException { int copyLength = len; int copyOffset = off; int bufferPos = (int) (seekPosition - bufferOffset); if (bufferPos < 0) { copyOffset -= bufferPos; copyLength += bufferPos; bufferPos = 0; } int maxLength = (int) (bufferOffset + buffer.length - seekPosition); if (maxLength < copyLength) { copyLength = maxLength; } System.arraycopy(b, copyOffset, buffer, bufferPos, copyLength); } private long getExtendLength(long position) { if (!extendLength) { return position; } int scaleUp; if (position < 256 * 1024) { scaleUp = 2; } else if (position < 1024 * 1024) { scaleUp = 6; } else if (position < 32 * 1024 * 1024) { scaleUp = 8; } else { scaleUp = 12; } position = getBinaryNormalisedCeiling(position, bufferScale + scaleUp); return position; } /** * Some old JVM's do not allow seek beyond end of file, so zeros must be written * first in that case. Reported by bohgammer@users in Open Disucssion * Forum. */ private void extendLength(long position) throws IOException { long newSize = getExtendLength(position); if (newSize > fileLength) { try { file.seek(newSize - 1); file.write(0); fileLength = newSize; } catch (IOException e) { database.logger.logWarningEvent("data file enlarge failed ", e); throw e; } } } private void resetPointer() { try { seekPosition = 0; fileLength = length(); readIntoBuffer(); } catch (Throwable e) {} } /** * uses 2**scale form and returns a multipe of this that is larger or equal to value */ static long getBinaryNormalisedCeiling(long value, int scale) { long mask = 0xffffffffffffffffl << scale; long newSize = value & mask; if (newSize != value) { newSize += 1 << scale; } return newSize; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/DataFileCacheSession.java0000644000175000017500000001121712007547412025237 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.Database; import org.hsqldb.RowAVLDisk; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.Iterator; /** * A file-based row store for temporary CACHED table persistence.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class DataFileCacheSession extends DataFileCache { public DataFileCacheSession(Database db, String baseFileName) { super(db, baseFileName); logEvents = false; } /** * Initial external parameters are set here. The size if fixed. */ protected void initParams(Database database, String baseFileName) { this.dataFileName = baseFileName + ".data.tmp"; this.database = database; fa = FileUtil.getFileUtil(); dataFileScale = 64; cachedRowPadding = dataFileScale; initialFreePos = dataFileScale; maxCacheRows = 2048; maxCacheBytes = maxCacheRows * 1024; maxDataFileSize = (long) Integer.MAX_VALUE * dataFileScale; dataFile = null; } /** * Opens the *.data file for this cache. */ public void open(boolean readonly) { try { dataFile = new ScaledRAFile(database, dataFileName, false, false, false); fileFreePosition = initialFreePos; initBuffers(); freeBlocks = new DataFileBlockManager(0, dataFileScale, 0, 0); } catch (Throwable t) { database.logger.logWarningEvent("Failed to open Session RA file", t); close(false); throw Error.error(t, ErrorCode.FILE_IO_ERROR, ErrorCode.M_DataFileCache_open, new Object[] { t.toString(), dataFileName }); } } /** * Parameter write is always false. The backing file is simply closed and * deleted. */ public void close(boolean write) { writeLock.lock(); try { clear(); if (dataFile != null) { dataFile.close(); dataFile = null; fa.removeElement(dataFileName); } } catch (Throwable t) { database.logger.logWarningEvent("Failed to close Session RA file", t); throw Error.error(t, ErrorCode.FILE_IO_ERROR, ErrorCode.M_DataFileCache_close, new Object[] { t.toString(), dataFileName }); } finally { writeLock.unlock(); } } protected void clear() { Iterator it = cache.getIterator(); while (it.hasNext()) { RowAVLDisk row = (RowAVLDisk) it.next(); row.setInMemory(false); row.destroy(); } cache.clear(); fileStartFreePosition = fileFreePosition = initialFreePos; initBuffers(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/HsqlProperties.java0000644000175000017500000004224112007547414024265 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.util.Properties; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.FileAccess; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.HashMap; import org.hsqldb.lib.java.JavaSystem; import org.hsqldb.store.ValuePool; /** * Wrapper for java.util.Properties to limit values to Specific types and * allow saving and loading.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.0 */ public class HsqlProperties { // public static final int ANY_ERROR = 0; public static final int NO_VALUE_FOR_KEY = 1; protected String fileName; protected String fileExtension = ""; protected Properties stringProps; protected int[] errorCodes = ValuePool.emptyIntArray; protected String[] errorKeys = ValuePool.emptyStringArray; protected boolean resource = false; protected FileAccess fa; protected HashMap metaData; public HsqlProperties() { stringProps = new Properties(); fileName = null; } public HsqlProperties(String fileName) { this(fileName, ".properties"); } public HsqlProperties(String fileName, String fileExtension) { stringProps = new Properties(); this.fileName = fileName; this.fileExtension = fileExtension; fa = FileUtil.getFileUtil(); } public HsqlProperties(HashMap meta, String fileName, FileAccess accessor, boolean b) { stringProps = new Properties(); this.fileName = fileName; this.fileExtension = ".properties"; fa = accessor; metaData = meta; } public HsqlProperties(Properties props) { stringProps = props; } public void setFileName(String name) { fileName = name; } public String setProperty(String key, int value) { return setProperty(key, Integer.toString(value)); } public String setProperty(String key, boolean value) { return setProperty(key, String.valueOf(value)); } public String setProperty(String key, String value) { return (String) stringProps.put(key, value); } public String setPropertyIfNotExists(String key, String value) { value = getProperty(key, value); return setProperty(key, value); } public Properties getProperties() { return stringProps; } public String getProperty(String key) { return stringProps.getProperty(key); } public String getProperty(String key, String defaultValue) { return stringProps.getProperty(key, defaultValue); } public int getIntegerProperty(String key, int defaultValue) { return getIntegerProperty(stringProps, key, defaultValue); } public static int getIntegerProperty(Properties props, String key, int defaultValue) { String prop = props.getProperty(key); try { if (prop != null) { prop = prop.trim(); defaultValue = Integer.parseInt(prop); } } catch (NumberFormatException e) {} return defaultValue; } public boolean isPropertyTrue(String key) { return isPropertyTrue(key, false); } public boolean isPropertyTrue(String key, boolean defaultValue) { String value = stringProps.getProperty(key); if (value == null) { return defaultValue; } value = value.trim(); return value.toLowerCase().equals("true"); } public void removeProperty(String key) { stringProps.remove(key); } public void addProperties(Properties props) { if (props == null) { return; } Enumeration keys = props.propertyNames(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); String value = props.getProperty(key); this.stringProps.put(key, value); } } public void addProperties(HsqlProperties props) { if (props == null) { return; } addProperties(props.stringProps); } // oj@openoffice.org public boolean propertiesFileExists() { if (fileName == null) { return false; } String propFilename = fileName + fileExtension; return fa.isStreamElement(propFilename); } public boolean load() throws Exception { if (fileName == null || fileName.length() == 0) { throw new FileNotFoundException( Error.getMessage(ErrorCode.M_HsqlProperties_load)); } if (!propertiesFileExists()) { return false; } InputStream fis = null; String propsFilename = fileName + fileExtension; // oj@openoffice.org try { fis = fa.openInputStreamElement(propsFilename); stringProps.load(fis); } finally { if (fis != null) { fis.close(); } } return true; } /** * Saves the properties. */ public void save() throws Exception { if (fileName == null || fileName.length() == 0) { throw new java.io.FileNotFoundException( Error.getMessage(ErrorCode.M_HsqlProperties_load)); } String filestring = fileName + fileExtension; save(filestring); } /** * Saves the properties using JDK2 method if present, otherwise JDK1. */ public void save(String fileString) throws Exception { // oj@openoffice.org fa.createParentDirs(fileString); OutputStream fos = fa.openOutputStreamElement(fileString); FileAccess.FileSync outDescriptor = fa.getFileSync(fos); JavaSystem.saveProperties( stringProps, HsqlDatabaseProperties.PRODUCT_NAME + " " + HsqlDatabaseProperties.THIS_FULL_VERSION, fos); fos.flush(); outDescriptor.sync(); fos.close(); outDescriptor = null; fos = null; return; } /** * Adds the error code and the key to the list of errors. This list * is populated during construction or addition of elements and is used * outside this class to act upon the errors. */ protected void addError(int code, String key) { errorCodes = (int[]) ArrayUtil.resizeArray(errorCodes, errorCodes.length + 1); errorKeys = (String[]) ArrayUtil.resizeArray(errorKeys, errorKeys.length + 1); errorCodes[errorCodes.length - 1] = code; errorKeys[errorKeys.length - 1] = key; } /** * Creates and populates an HsqlProperties Object from the arguments * array of a Main method. Properties are in the form of "-key value" * pairs. Each key is prefixed with the type argument and a dot before * being inserted into the properties Object.

* * "--help" is treated as a key with no value and not inserted. */ public static HsqlProperties argArrayToProps(String[] arg, String type) { HsqlProperties props = new HsqlProperties(); for (int i = 0; i < arg.length; i++) { String p = arg[i]; if (p.equals("--help") || p.equals("-help")) { props.addError(NO_VALUE_FOR_KEY, p.substring(1)); } else if (p.startsWith("--")) { String value = i + 1 < arg.length ? arg[i + 1] : ""; props.setProperty(type + "." + p.substring(2), value); i++; } else if (p.charAt(0) == '-') { String value = i + 1 < arg.length ? arg[i + 1] : ""; props.setProperty(type + "." + p.substring(1), value); i++; } } return props; } /** * Creates and populates a new HsqlProperties Object using a string * such as "key1=value1;key2=value2".

* * The string that represents the = sign above is specified as pairsep * and the one that represents the semicolon is specified as delimiter, * allowing any string to be used for either.

* * Leading / trailing spaces around the keys and values are discarded.

* * The string is parsed by (1) subdividing into segments by delimiter * (2) subdividing each segment in two by finding the first instance of * the pairsep (3) trimming each pair of segments from step 2 and * inserting into the properties object.

* * Each key is prefixed with the type argument and a dot before being * inserted.

* * Any key without a value is added to the list of errors. */ public static HsqlProperties delimitedArgPairsToProps(String s, String pairsep, String dlimiter, String type) { HsqlProperties props = new HsqlProperties(); int currentpair = 0; while (true) { int nextpair = s.indexOf(dlimiter, currentpair); if (nextpair == -1) { nextpair = s.length(); } // find value within the segment int valindex = s.substring(0, nextpair).indexOf(pairsep, currentpair); if (valindex == -1) { props.addError(NO_VALUE_FOR_KEY, s.substring(currentpair, nextpair).trim()); } else { String key = s.substring(currentpair, valindex).trim(); String value = s.substring(valindex + pairsep.length(), nextpair).trim(); if (type != null) { key = type + "." + key; } props.setProperty(key, value); } if (nextpair == s.length()) { break; } currentpair = nextpair + dlimiter.length(); } return props; } public Enumeration propertyNames() { return stringProps.propertyNames(); } public boolean isEmpty() { return stringProps.isEmpty(); } public String[] getErrorKeys() { return errorKeys; } public void validate() {} // column number mappings public static final int indexName = 0; public static final int indexType = 1; public static final int indexClass = 2; public static final int indexIsRange = 3; public static final int indexDefaultValue = 4; public static final int indexRangeLow = 5; public static final int indexRangeHigh = 6; public static final int indexValues = 7; public static final int indexLimit = 9; public static Object[] getMeta(String name, int type, String defaultValue) { Object[] row = new Object[indexLimit]; row[indexName] = name; row[indexType] = ValuePool.getInt(type); row[indexClass] = "String"; row[indexDefaultValue] = defaultValue; return row; } public static Object[] getMeta(String name, int type, boolean defaultValue) { Object[] row = new Object[indexLimit]; row[indexName] = name; row[indexType] = ValuePool.getInt(type); row[indexClass] = "Boolean"; row[indexDefaultValue] = defaultValue ? Boolean.TRUE : Boolean.FALSE; return row; } public static Object[] getMeta(String name, int type, int defaultValue, int[] values) { Object[] row = new Object[indexLimit]; row[indexName] = name; row[indexType] = ValuePool.getInt(type); row[indexClass] = "Integer"; row[indexDefaultValue] = ValuePool.getInt(defaultValue); row[indexValues] = values; return row; } public static Object[] getMeta(String name, int type, int defaultValue, int rangeLow, int rangeHigh) { Object[] row = new Object[indexLimit]; row[indexName] = name; row[indexType] = ValuePool.getInt(type); row[indexClass] = "Integer"; row[indexDefaultValue] = ValuePool.getInt(defaultValue); row[indexIsRange] = Boolean.TRUE; row[indexRangeLow] = ValuePool.getInt(rangeLow); row[indexRangeHigh] = ValuePool.getInt(rangeHigh); return row; } /** * Perfoms any range checking for property and return an error message */ public static String validateProperty(String key, String value, Object[] meta) { if (meta[indexClass].equals("Boolean")) { value = value.toLowerCase(); if (value.equals("true") || value.equals("false")) { return null; } return "invalid boolean value for property: " + key; } if (meta[indexClass].equals("String")) { return null; } if (meta[indexClass].equals("Integer")) { int number = Integer.parseInt(value); if (Boolean.TRUE.equals(meta[indexIsRange])) { int low = ((Integer) meta[indexRangeLow]).intValue(); int high = ((Integer) meta[indexRangeHigh]).intValue(); if (number < low || high < number) { return "value outside range for property: " + key; } } if (meta[indexValues] != null) { int[] values = (int[]) meta[indexValues]; if (ArrayUtil.find(values, number) == -1) { return "value not supported for property: " + key; } } return null; } return null; } public boolean validateProperty(String name, int number) { Object[] meta = (Object[]) metaData.get(name); if (meta == null) { return false; } if (meta[indexClass].equals("Integer")) { if (Boolean.TRUE.equals(meta[indexIsRange])) { int low = ((Integer) meta[indexRangeLow]).intValue(); int high = ((Integer) meta[indexRangeHigh]).intValue(); if (number < low || high < number) { return false; } } if (meta[indexValues] != null) { int[] values = (int[]) meta[indexValues]; if (ArrayUtil.find(values, number) == -1) { return false; } } return true; } return false; } public String toString() { StringBuffer sb; sb = new StringBuffer(); sb.append('['); int len = stringProps.size(); Enumeration en = stringProps.propertyNames(); for (int i = 0; i < len; i++) { String key = (String) en.nextElement(); sb.append(key); sb.append('='); sb.append(stringProps.get(key)); if (i + 1 < len) { sb.append(','); sb.append(' '); } sb.append(']'); } return sb.toString(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/RowStoreAVLDiskData.java0000644000175000017500000001555112007547414025041 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.IOException; import org.hsqldb.HsqlException; import org.hsqldb.Row; import org.hsqldb.RowAVL; import org.hsqldb.RowAVLDiskData; import org.hsqldb.RowAction; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.TransactionManager; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.rowio.RowInputInterface; /* * Implementation of PersistentStore for TEXT tables. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class RowStoreAVLDiskData extends RowStoreAVLDisk { public RowStoreAVLDiskData(PersistentStoreCollection manager, Table table) { super(manager, null, table); } public CachedObject get(CachedObject object, boolean keep) { object = cache.get(object, this, keep); return object; } public void add(CachedObject object) { writeLock(); try { int size = object.getRealSize(cache.rowOut); object.setStorageSize(size); cache.add(object); } finally { writeUnlock(); } } public CachedObject get(RowInputInterface in) { try { RowAVLDiskData row = new RowAVLDiskData(this, table, in); row.setPos(in.getPos()); row.setStorageSize(in.getSize()); row.setChanged(false); ((TextCache) cache).addInit(row); return row; } catch (IOException e) { throw Error.error(ErrorCode.TEXT_FILE_IO, e); } } public CachedObject get(CachedObject object, RowInputInterface in) { try { ((RowAVLDiskData) object).getRowData(table, in); return object; } catch (IOException e) { throw Error.error(ErrorCode.TEXT_FILE_IO, e); } } public CachedObject getNewCachedObject(Session session, Object object, boolean tx) { Row row = new RowAVLDiskData(this, table, (Object[]) object); add(row); if (tx) { RowAction.addInsertAction(session, table, row); } return row; } public void indexRow(Session session, Row row) { super.indexRow(session, row); } public void set(CachedObject object) {} public void removeAll() { destroy(); elementCount = 0; ArrayUtil.fillArray(accessorList, null); } public void remove(long i) { cache.remove(i, this); } public void removePersistence(Row row) { cache.removePersistence(row); } public void release(long i) { cache.release(i); } public CachedObject getAccessor(Index key) { int position = key.getPosition(); if (position >= accessorList.length) { throw Error.runtimeError(ErrorCode.U_S0500, "RowStoreAVL"); } return accessorList[position]; } public void commitPersistence(CachedObject row) { try { cache.saveRow(row); } catch (HsqlException e1) {} } public void commitRow(Session session, Row row, int changeAction, int txModel) { switch (changeAction) { case RowAction.ACTION_DELETE : removePersistence(row); break; case RowAction.ACTION_INSERT : commitPersistence(row); break; case RowAction.ACTION_INSERT_DELETE : // INSERT + DELETE if (txModel == TransactionManager.LOCKS) { remove(row.getPos()); } else { delete(session, row); remove(row.getPos()); } break; case RowAction.ACTION_DELETE_FINAL : if (txModel != TransactionManager.LOCKS) { delete(session, row); remove(row.getPos()); } break; } } public void rollbackRow(Session session, Row row, int changeAction, int txModel) { switch (changeAction) { case RowAction.ACTION_DELETE : if (txModel == TransactionManager.LOCKS) { ((RowAVL) row).setNewNodes(this); indexRow(session, row); } break; case RowAction.ACTION_INSERT : if (txModel == TransactionManager.LOCKS) { delete(session, row); remove(row.getPos()); } else {} break; case RowAction.ACTION_INSERT_DELETE : // INSERT + DELETE if (txModel == TransactionManager.LOCKS) { remove(row.getPos()); } else { delete(session, row); remove(row.getPos()); } break; } } /** * Does not adjust usage count */ public void release() { destroy(); ArrayUtil.fillArray(accessorList, null); table.database.logger.closeTextCache((Table) table); cache = null; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/RandomAccessInterface.java0000644000175000017500000000461612007547414025470 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.IOException; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 2.0.0 */ public interface RandomAccessInterface { long length() throws IOException; void seek(long position) throws IOException; long getFilePointer() throws IOException; int read() throws IOException; void read(byte[] b, int offset, int length) throws IOException; void write(byte[] b, int offset, int length) throws IOException; int readInt() throws IOException; void writeInt(int i) throws IOException; long readLong() throws IOException; void writeLong(long i) throws IOException; void close() throws IOException; boolean isReadOnly(); void synch(); boolean ensureLength(long newLong); boolean setLength(long newLength); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/DataFileCache.java0000644000175000017500000011225612007547414023702 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.IOException; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.hsqldb.Database; import org.hsqldb.HsqlException; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.FileAccess; import org.hsqldb.lib.FileArchiver; import org.hsqldb.lib.FileUtil; import org.hsqldb.rowio.RowInputBinary180; import org.hsqldb.rowio.RowInputBinaryDecode; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputBinary180; import org.hsqldb.rowio.RowOutputBinaryEncode; import org.hsqldb.rowio.RowOutputInterface; import org.hsqldb.store.BitMap; /** * Acts as a manager for CACHED table persistence.

* * This contains the top level functionality. Provides file management services * and access.

* * Rewritten for 1.8.0 and 2.x * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 */ public class DataFileCache { protected FileAccess fa; // flags public static final int FLAG_ISSHADOWED = 1; public static final int FLAG_ISSAVED = 2; public static final int FLAG_ROWINFO = 3; public static final int FLAG_190 = 4; public static final int FLAG_HX = 5; // file format fields static final int LONG_EMPTY_SIZE = 4; // empty space size static final int LONG_FREE_POS_POS = 12; // where iFreePos is saved static final int LONG_EMPTY_INDEX_POS = 20; // empty space index static final int FLAGS_POS = 28; static final int MIN_INITIAL_FREE_POS = 32; // DataFileBlockManager freeBlocks; static final int initIOBufferSize = 4096; // protected String dataFileName; protected String backupFileName; protected Database database; protected boolean logEvents = true; // this flag is used externally to determine if a backup is required protected boolean fileModified; protected boolean cacheModified; protected int dataFileScale; // post opening constant fields protected boolean cacheReadonly; // protected int cachedRowPadding; protected int initialFreePos; protected long fileStartFreePosition; protected boolean hasRowInfo = false; protected int storeCount; // reusable input / output streams protected RowInputInterface rowIn; public RowOutputInterface rowOut; // public long maxDataFileSize; // boolean is180; // protected RandomAccessInterface dataFile; protected volatile long fileFreePosition; protected int maxCacheRows; // number of Rows protected long maxCacheBytes; // number of bytes protected Cache cache; // private RAShadowFile shadowFile; // ReadWriteLock lock = new ReentrantReadWriteLock(); Lock readLock = lock.readLock(); Lock writeLock = lock.writeLock(); public DataFileCache(Database db, String baseFileName) { initParams(db, baseFileName); cache = new Cache(this); } /** * initial external parameters are set here. */ protected void initParams(Database database, String baseFileName) { this.dataFileName = baseFileName + Logger.dataFileExtension; this.backupFileName = baseFileName + Logger.backupFileExtension; this.database = database; fa = database.logger.getFileAccess(); dataFileScale = database.logger.getDataFileScale(); cachedRowPadding = 8; if (dataFileScale > 8) { cachedRowPadding = dataFileScale; } initialFreePos = MIN_INITIAL_FREE_POS; if (initialFreePos < dataFileScale) { initialFreePos = dataFileScale; } cacheReadonly = database.logger.propFilesReadOnly; maxCacheRows = database.logger.propCacheMaxRows; maxCacheBytes = database.logger.propCacheMaxSize; maxDataFileSize = (long) Integer.MAX_VALUE * dataFileScale * database.logger.getDataFileFactor(); dataFile = null; shadowFile = null; } /** * Opens the *.data file for this cache, setting the variables that * allow access to the particular database version of the *.data file. */ public void open(boolean readonly) { if (database.logger.isStoredFileAccess()) { openStoredFileAccess(readonly); return; } fileFreePosition = initialFreePos; logInfoEvent("dataFileCache open start"); try { boolean isNio = database.logger.propNioDataFile; int fileType; if (database.isFilesInJar()) { fileType = ScaledRAFile.DATA_FILE_JAR; } else if (isNio) { fileType = ScaledRAFile.DATA_FILE_NIO; } else { fileType = ScaledRAFile.DATA_FILE_RAF; } if (readonly || database.isFilesInJar()) { dataFile = ScaledRAFile.newScaledRAFile(database, dataFileName, readonly, fileType); dataFile.seek(FLAGS_POS); int flags = dataFile.readInt(); is180 = !BitMap.isSet(flags, FLAG_190); if (BitMap.isSet(flags, FLAG_HX)) { throw Error.error(ErrorCode.WRONG_DATABASE_FILE_VERSION); } dataFile.seek(LONG_FREE_POS_POS); fileFreePosition = dataFile.readLong(); initBuffers(); return; } long freesize = 0; boolean preexists = fa.isStreamElement(dataFileName); boolean isIncremental = database.logger.propIncrementBackup; boolean isSaved = false; if (preexists) { dataFile = new ScaledRAFileSimple(database, dataFileName, "r"); long length = dataFile.length(); boolean wrongVersion = false; if (length > initialFreePos) { dataFile.seek(FLAGS_POS); int flags = dataFile.readInt(); isSaved = BitMap.isSet(flags, FLAG_ISSAVED); isIncremental = BitMap.isSet(flags, FLAG_ISSHADOWED); is180 = !BitMap.isSet(flags, FLAG_190); if (BitMap.isSet(flags, FLAG_HX)) { wrongVersion = true; } } dataFile.close(); if (length > maxDataFileSize) { throw Error.error(ErrorCode.WRONG_DATABASE_FILE_VERSION, "requires large database support"); } if (wrongVersion) { throw Error.error(ErrorCode.WRONG_DATABASE_FILE_VERSION); } if (isSaved && isIncremental) { boolean existsBackup = fa.isStreamElement(backupFileName); if (existsBackup) { isSaved = false; } } } if (isSaved) { if (isIncremental) { deleteBackup(); } else { boolean existsBackup = fa.isStreamElement(backupFileName); if (!existsBackup) { backupFile(false); } } } else { if (isIncremental) { preexists = restoreBackupIncremental(); } else { preexists = restoreBackup(); } } dataFile = ScaledRAFile.newScaledRAFile(database, dataFileName, readonly, fileType); if (preexists) { dataFile.seek(FLAGS_POS); int flags = dataFile.readInt(); is180 = !BitMap.isSet(flags, FLAG_190); dataFile.seek(LONG_EMPTY_SIZE); freesize = dataFile.readLong(); dataFile.seek(LONG_FREE_POS_POS); fileFreePosition = dataFile.readLong(); fileStartFreePosition = fileFreePosition; openShadowFile(); } else { initNewFile(); } initBuffers(); fileModified = false; cacheModified = false; freeBlocks = new DataFileBlockManager(database.logger.propMaxFreeBlocks, dataFileScale, 0, freesize); logInfoEvent("dataFileCache open end"); } catch (Throwable t) { logSevereEvent("dataFileCache open failed", t); close(false); throw Error.error(t, ErrorCode.FILE_IO_ERROR, ErrorCode.M_DataFileCache_open, new Object[] { t.toString(), dataFileName }); } } void openStoredFileAccess(boolean readonly) { fileFreePosition = initialFreePos; logInfoEvent("dataFileCache open start"); try { int fileType = ScaledRAFile.DATA_FILE_STORED; if (readonly) { dataFile = ScaledRAFile.newScaledRAFile(database, dataFileName, readonly, fileType); dataFile.seek(FLAGS_POS); int flags = dataFile.readInt(); is180 = !BitMap.isSet(flags, FLAG_190); dataFile.seek(LONG_FREE_POS_POS); fileFreePosition = dataFile.readLong(); initBuffers(); return; } long freesize = 0; boolean preexists = fa.isStreamElement(dataFileName); boolean isIncremental = database.logger.propIncrementBackup; boolean restore = database.getProperties().getDBModified() == HsqlDatabaseProperties.FILES_MODIFIED; if (preexists && restore) { if (isIncremental) { preexists = restoreBackupIncremental(); } else { preexists = restoreBackup(); } } dataFile = ScaledRAFile.newScaledRAFile(database, dataFileName, readonly, fileType); if (preexists) { dataFile.seek(LONG_EMPTY_SIZE); freesize = dataFile.readLong(); dataFile.seek(LONG_FREE_POS_POS); fileFreePosition = dataFile.readLong(); fileStartFreePosition = fileFreePosition; dataFile.seek(FLAGS_POS); int flags = dataFile.readInt(); is180 = !BitMap.isSet(flags, FLAG_190); openShadowFile(); } else { initNewFile(); } initBuffers(); fileModified = false; cacheModified = false; freeBlocks = new DataFileBlockManager(database.logger.propMaxFreeBlocks, dataFileScale, 0, freesize); logInfoEvent("dataFileCache open end"); } catch (Throwable t) { logSevereEvent("dataFileCache open failed", t); close(false); throw Error.error(t, ErrorCode.FILE_IO_ERROR, ErrorCode.M_DataFileCache_open, new Object[] { t.toString(), dataFileName }); } } void initNewFile() throws IOException { fileFreePosition = initialFreePos; fileStartFreePosition = initialFreePos; dataFile.seek(LONG_FREE_POS_POS); dataFile.writeLong(fileFreePosition); // set shadowed flag; int flags = 0; if (database.logger.propIncrementBackup) { flags = BitMap.set(flags, FLAG_ISSHADOWED); } flags = BitMap.set(flags, FLAG_ISSAVED); flags = BitMap.set(flags, FLAG_190); dataFile.seek(FLAGS_POS); dataFile.writeInt(flags); dataFile.synch(); is180 = false; } void openShadowFile() { if (database.logger.propIncrementBackup && fileFreePosition != initialFreePos) { shadowFile = new RAShadowFile(database, dataFile, backupFileName, fileFreePosition, 1 << 14); } } void setIncrementBackup(boolean value) { writeLock.lock(); try { dataFile.seek(FLAGS_POS); int flags = dataFile.readInt(); if (value) { flags = BitMap.set(flags, FLAG_ISSHADOWED); } else { flags = BitMap.unset(flags, FLAG_ISSHADOWED); } dataFile.seek(FLAGS_POS); dataFile.writeInt(flags); dataFile.synch(); fileModified = true; } catch (Throwable t) { logSevereEvent("backupFile failed", t); } finally { writeLock.unlock(); } } /** * Restores a compressed backup or the .data file. */ private boolean restoreBackup() { // in case data file cannot be deleted, reset it deleteFile(); try { FileAccess fa = database.logger.getFileAccess(); if (fa.isStreamElement(backupFileName)) { FileArchiver.unarchive(backupFileName, dataFileName, fa, FileArchiver.COMPRESSION_ZIP); return true; } return false; } catch (Throwable t) { throw Error.error(t, ErrorCode.FILE_IO_ERROR, ErrorCode.M_Message_Pair, new Object[] { t.toString(), backupFileName }); } } /** * Restores in from an incremental backup */ private boolean restoreBackupIncremental() { try { if (fa.isStreamElement(backupFileName)) { RAShadowFile.restoreFile(database, backupFileName, dataFileName); deleteBackup(); return true; } return false; } catch (IOException e) { throw Error.error(ErrorCode.FILE_IO_ERROR, e); } } /** * Parameter write indicates either an orderly close, or a fast close * without backup. * * When false, just closes the file. * * When true, writes out all cached rows that have been modified and the * free position pointer for the *.data file and then closes the file. */ public void close(boolean write) { writeLock.lock(); try { if (dataFile == null) { return; } if (write) { commitChanges(); } else { if (shadowFile != null) { shadowFile.close(); shadowFile = null; } } dataFile.close(); logDetailEvent("dataFileCache file close"); dataFile = null; if (!write) { return; } boolean empty = fileFreePosition == initialFreePos; if (empty) { deleteFile(); deleteBackup(); } } catch (HsqlException e) { throw e; } catch (Throwable t) { logSevereEvent("dataFileCache close failed", t); throw Error.error(t, ErrorCode.FILE_IO_ERROR, ErrorCode.M_DataFileCache_close, new Object[] { t.toString(), dataFileName }); } finally { writeLock.unlock(); } } protected void clear() { writeLock.lock(); try { cache.clear(); } finally { writeLock.unlock(); } } public void adjustStoreCount(int adjust) { writeLock.lock(); try { storeCount += adjust; if (storeCount == 0) { clear(); } } finally { writeLock.unlock(); } } /** * Commits all the changes to the file */ public void commitChanges() { writeLock.lock(); try { if (cacheReadonly) { return; } logInfoEvent("dataFileCache commit start"); cache.saveAll(); if (fileModified || freeBlocks.isModified()) { // set empty dataFile.seek(LONG_EMPTY_SIZE); dataFile.writeLong(freeBlocks.getLostBlocksSize()); // set end dataFile.seek(LONG_FREE_POS_POS); dataFile.writeLong(fileFreePosition); // set saved flag; dataFile.seek(FLAGS_POS); int flags = dataFile.readInt(); flags = BitMap.set(flags, FLAG_ISSAVED); dataFile.seek(FLAGS_POS); dataFile.writeInt(flags); } dataFile.synch(); cache.logSynchEvent(); fileModified = false; cacheModified = false; fileStartFreePosition = fileFreePosition; if (shadowFile != null) { shadowFile.close(); shadowFile = null; } logDetailEvent("dataFileCache commit end"); } catch (Throwable t) { logSevereEvent("dataFileCache commit failed", t); throw Error.error(t, ErrorCode.FILE_IO_ERROR, ErrorCode.M_DataFileCache_close, new Object[] { t.toString(), dataFileName }); } finally { writeLock.unlock(); } } protected void initBuffers() { if (rowOut == null) { if (is180) { rowOut = new RowOutputBinary180(initIOBufferSize, cachedRowPadding); } else { rowOut = new RowOutputBinaryEncode(database.logger.getCrypto(), initIOBufferSize, cachedRowPadding); } } if (rowIn == null) { if (is180) { rowIn = new RowInputBinary180(new byte[initIOBufferSize]); } else { rowIn = new RowInputBinaryDecode(database.logger.getCrypto(), new byte[initIOBufferSize]); } } } DataFileDefrag defrag() { writeLock.lock(); try { cache.saveAll(); DataFileDefrag dfd = new DataFileDefrag(database, this, dataFileName); dfd.process(); close(true); cache.clear(); if (!database.logger.propIncrementBackup) { backupFile(true); } database.schemaManager.setTempIndexRoots(dfd.getIndexRoots()); try { database.logger.log.writeScript(false); } finally { database.schemaManager.setTempIndexRoots(null); } database.getProperties().setProperty( HsqlDatabaseProperties.hsqldb_script_format, database.logger.propScriptFormat); database.getProperties().setDBModified( HsqlDatabaseProperties.FILES_MODIFIED_NEW); database.logger.log.closeLog(); database.logger.log.deleteLog(); database.logger.log.renameNewScript(); renameBackupFile(); renameDataFile(); database.getProperties().setDBModified( HsqlDatabaseProperties.FILES_NOT_MODIFIED); open(false); database.schemaManager.setIndexRoots(dfd.getIndexRoots()); if (database.logger.log.dbLogWriter != null) { database.logger.log.openLog(); } database.getProperties().setDBModified( HsqlDatabaseProperties.FILES_MODIFIED); return dfd; } finally { writeLock.unlock(); } } /** * Used when a row is deleted as a result of some DML or DDL statement. * Removes the row from the cache data structures. * Adds the file space for the row to the list of free positions. */ public void remove(long i, PersistentStore store) { writeLock.lock(); try { CachedObject r = release(i); if (r != null) { int size = r.getStorageSize(); freeBlocks.add(i, size); } } finally { writeLock.unlock(); } } public void removePersistence(CachedObject object) {} /** * Allocates file space for the row.

* * Free space is requested from the block manager if it exists. * Otherwise the file is grown to accommodate it. */ long setFilePos(CachedObject r) { int rowSize = r.getStorageSize(); long i = freeBlocks.get(rowSize); long newFreePosition; if (i == -1) { i = fileFreePosition / dataFileScale; newFreePosition = fileFreePosition + rowSize; if (newFreePosition > maxDataFileSize) { logSevereEvent("data file reached maximum size " + this.dataFileName, null); throw Error.error(ErrorCode.DATA_FILE_IS_FULL); } boolean result = dataFile.ensureLength(newFreePosition); if (!result) { logSevereEvent("data file cannot be enlarged - disk spacee " + this.dataFileName, null); throw Error.error(ErrorCode.DATA_FILE_IS_FULL); } fileFreePosition = newFreePosition; } r.setPos(i); return i; } public void add(CachedObject object) { writeLock.lock(); try { cacheModified = true; long i = setFilePos(object); cache.put(i, object); if (object.getStorageSize() > initIOBufferSize) { rowOut.reset(object.getStorageSize()); } } finally { writeLock.unlock(); } } public int getStorageSize(long i) { readLock.lock(); try { CachedObject value = cache.get(i); if (value != null) { return value.getStorageSize(); } } finally { readLock.unlock(); } return readSize(i); } public void replace(CachedObject object) { writeLock.lock(); try { long pos = object.getPos(); cache.replace(pos, object); } finally { writeLock.unlock(); } } public CachedObject get(CachedObject object, PersistentStore store, boolean keep) { readLock.lock(); long pos; try { if (object.isInMemory()) { if (keep) { object.keepInMemory(true); } return object; } pos = object.getPos(); if (pos < 0) { return null; } object = cache.get(pos); if (object != null) { if (keep) { object.keepInMemory(true); } return object; } } finally { readLock.unlock(); } return getFromFile(pos, store, keep); } public CachedObject get(long pos, PersistentStore store, boolean keep) { CachedObject object; if (pos < 0) { return null; } readLock.lock(); try { object = cache.get(pos); if (object != null) { if (keep) { object.keepInMemory(true); } return object; } } finally { readLock.unlock(); } return getFromFile(pos, store, keep); } private CachedObject getFromFile(long pos, PersistentStore store, boolean keep) { CachedObject object = null; writeLock.lock(); try { object = cache.get(pos); if (object != null) { if (keep) { object.keepInMemory(true); } return object; } for (int j = 0; j < 2; j++) { try { RowInputInterface rowInput = readObject(pos); if (rowInput == null) { return null; } object = store.get(rowInput); break; } catch (OutOfMemoryError err) { cache.forceCleanUp(); System.gc(); logSevereEvent(dataFileName + " getFromFile out of mem " + pos, err); if (j > 0) { throw err; } } } // for text tables with empty rows at the beginning, // pos may move forward in readObject pos = object.getPos(); cache.put(pos, object); if (keep) { object.keepInMemory(true); } store.set(object); return object; } catch (HsqlException e) { logSevereEvent(dataFileName + " getFromFile " + pos, e); throw e; } finally { writeLock.unlock(); } } RowInputInterface getRaw(int i) { writeLock.lock(); try { return readObject(i); } finally { writeLock.unlock(); } } protected int readSize(long pos) { writeLock.lock(); try { dataFile.seek((long) pos * dataFileScale); return dataFile.readInt(); } catch (IOException e) { logSevereEvent("readSize", e, pos); throw Error.error(ErrorCode.DATA_FILE_ERROR, e); } finally { writeLock.unlock(); } } protected RowInputInterface readObject(long pos) { try { dataFile.seek((long) pos * dataFileScale); int size = dataFile.readInt(); rowIn.resetRow(pos, size); dataFile.read(rowIn.getBuffer(), 4, size - 4); return rowIn; } catch (IOException e) { logSevereEvent("readObject", e, pos); throw Error.error(ErrorCode.DATA_FILE_ERROR, e); } } public CachedObject release(long pos) { writeLock.lock(); try { return cache.release(pos); } finally { writeLock.unlock(); } } protected void saveRows(CachedObject[] rows, int offset, int count) { if (count == 0) { return; } try { copyShadow(rows, offset, count); setFileModified(); for (int i = offset; i < offset + count; i++) { CachedObject r = rows[i]; saveRowNoLock(r); rows[i] = null; } } catch (HsqlException e) { throw e; } catch (Throwable e) { throw Error.error(ErrorCode.DATA_FILE_ERROR, e); } finally { initBuffers(); } } /** * Writes out the specified Row. Will write only the Nodes or both Nodes * and table row data depending on what is not already persisted to disk. */ public void saveRow(CachedObject row) { writeLock.lock(); try { copyShadow(row); setFileModified(); saveRowNoLock(row); } catch (Throwable e) { logSevereEvent("saveRow", e, row.getPos()); throw Error.error(ErrorCode.DATA_FILE_ERROR, e); } finally { writeLock.unlock(); } } protected void saveRowNoLock(CachedObject row) { try { rowOut.reset(); row.write(rowOut); dataFile.seek((long) row.getPos() * dataFileScale); dataFile.write(rowOut.getOutputStream().getBuffer(), 0, rowOut.getOutputStream().size()); } catch (IOException e) { logSevereEvent("saveRowNoLock", e, row.getPos()); throw Error.error(ErrorCode.DATA_FILE_ERROR, e); } } protected void copyShadow(CachedObject[] rows, int offset, int count) throws IOException { if (shadowFile != null) { long time = cache.saveAllTimer.elapsedTime(); for (int i = offset; i < offset + count; i++) { CachedObject row = rows[i]; long seekpos = (long) row.getPos() * dataFileScale; shadowFile.copy(seekpos, row.getStorageSize()); } shadowFile.synch(); time = cache.saveAllTimer.elapsedTime() - time; logDetailEvent("shadow copy [time, size] " + time + " " + shadowFile.getSavedLength()); } } protected void copyShadow(CachedObject row) throws IOException { if (shadowFile != null) { long seekpos = (long) row.getPos() * dataFileScale; shadowFile.copy(seekpos, row.getStorageSize()); shadowFile.synch(); } } /** * Saves the *.data file as compressed *.backup. * * @throws HsqlException */ void backupFile(boolean newFile) { writeLock.lock(); try { if (database.logger.propIncrementBackup) { if (fa.isStreamElement(backupFileName)) { deleteBackup(); } return; } if (fa.isStreamElement(dataFileName)) { String filename = newFile ? dataFileName + Logger.newFileExtension : dataFileName; FileArchiver.archive(filename, backupFileName + Logger.newFileExtension, database.logger.getFileAccess(), FileArchiver.COMPRESSION_ZIP); } } catch (IOException e) { logSevereEvent("backupFile failed", e); throw Error.error(ErrorCode.DATA_FILE_ERROR, e); } finally { writeLock.unlock(); } } void renameBackupFile() { writeLock.lock(); try { if (database.logger.propIncrementBackup) { deleteBackup(); return; } if (fa.isStreamElement(backupFileName + Logger.newFileExtension)) { deleteBackup(); fa.renameElement(backupFileName + Logger.newFileExtension, backupFileName); } } finally { writeLock.unlock(); } } /** * Renames the *.data.new file. * * @throws HsqlException */ void renameDataFile() { writeLock.lock(); try { if (fa.isStreamElement(dataFileName + Logger.newFileExtension)) { deleteFile(); fa.renameElement(dataFileName + Logger.newFileExtension, dataFileName); } } finally { writeLock.unlock(); } } void deleteFile() { writeLock.lock(); try { // first attemp to delete fa.removeElement(dataFileName); // OOo related code if (database.logger.isStoredFileAccess()) { return; } // OOo end if (fa.isStreamElement(dataFileName)) { this.database.logger.log.deleteOldDataFiles(); fa.removeElement(dataFileName); if (fa.isStreamElement(dataFileName)) { String discardName = FileUtil.newDiscardFileName(dataFileName); fa.renameElement(dataFileName, discardName); } } } finally { writeLock.unlock(); } } void deleteBackup() { writeLock.lock(); try { if (fa.isStreamElement(backupFileName)) { fa.removeElement(backupFileName); } } finally { writeLock.unlock(); } } public int capacity() { return maxCacheRows; } public long bytesCapacity() { return maxCacheBytes; } public long getTotalCachedBlockSize() { return cache.getTotalCachedBlockSize(); } public int getFreeBlockCount() { return freeBlocks.size(); } public int getTotalFreeBlockSize() { return 0; } public long getFileFreePos() { return fileFreePosition; } public int getCachedObjectCount() { return cache.size(); } public int getAccessCount() { return cache.incrementAccessCount(); } public String getFileName() { return dataFileName; } public boolean hasRowInfo() { return hasRowInfo; } public boolean isFileModified() { return fileModified; } public boolean isModified() { return cacheModified; } public boolean isFileOpen() { return dataFile != null; } protected void setFileModified() { writeLock.lock(); try { if (!fileModified) { // unset saved flag; long start = cache.saveAllTimer.elapsedTime(); cache.saveAllTimer.start(); dataFile.seek(FLAGS_POS); int flags = dataFile.readInt(); flags = BitMap.unset(flags, FLAG_ISSAVED); dataFile.seek(FLAGS_POS); dataFile.writeInt(flags); dataFile.synch(); cache.saveAllTimer.stop(); logDetailEvent("flags set " + cache.saveAllTimer.elapsedTime()); fileModified = true; } } catch (Throwable t) {} finally { writeLock.unlock(); } } public int getFlags() { try { dataFile.seek(FLAGS_POS); int flags = dataFile.readInt(); return flags; } catch (Throwable t) {} return 0; } public boolean isDataReadOnly() { return this.cacheReadonly; } public RAShadowFile getShadowFile() { return shadowFile; } private void logSevereEvent(String message, Throwable t, long position) { if (logEvents) { StringBuffer sb = new StringBuffer(message); sb.append(' ').append(position); message = sb.toString(); database.logger.logSevereEvent(message, t); } } private void logSevereEvent(String message, Throwable t) { if (logEvents) { database.logger.logSevereEvent(message, t); } } public void logInfoEvent(String message) { if (logEvents) { database.logger.logInfoEvent(message); } } public void logDetailEvent(String message) { if (logEvents) { database.logger.logDetailEvent(message); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/LobStore.java0000644000175000017500000000402612007547414023031 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.9.0 */ public interface LobStore { byte[] getBlockBytes(int blockAddress, int blockCount); void setBlockBytes(byte[] dataBytes, int blockAddress, int blockCount); void setBlockBytes(byte[] dataBytes, long position, int offset, int length); int getBlockSize(); void close(); public void synch(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/RowStoreAVLDisk.java0000644000175000017500000002262312007547412024243 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.io.IOException; import org.hsqldb.HsqlException; import org.hsqldb.Row; import org.hsqldb.RowAVL; import org.hsqldb.RowAVLDisk; import org.hsqldb.RowAVLDiskLarge; import org.hsqldb.RowAction; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.TransactionManager; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.index.NodeAVL; import org.hsqldb.index.NodeAVLDisk; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputInterface; /* * Implementation of PersistentStore for CACHED tables. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class RowStoreAVLDisk extends RowStoreAVL { DataFileCache cache; RowOutputInterface rowOut; boolean largeData; public RowStoreAVLDisk(PersistentStoreCollection manager, DataFileCache cache, Table table) { this.database = table.database; this.manager = manager; this.table = table; this.indexList = table.getIndexList(); this.accessorList = new CachedObject[indexList.length]; this.cache = cache; if (cache != null) { rowOut = cache.rowOut.duplicate(); cache.adjustStoreCount(1); } manager.setStore(table, this); largeData = database.logger.getDataFileFactor() > 1; } public boolean isMemory() { return false; } public int getAccessCount() { return cache.getAccessCount(); } public void set(CachedObject object) { Row row = ((Row) object); database.txManager.setTransactionInfo(row); } public CachedObject get(long key) { CachedObject object = cache.get(key, this, false); return object; } public CachedObject get(long key, boolean keep) { CachedObject object = cache.get(key, this, keep); return object; } public CachedObject get(CachedObject object, boolean keep) { object = cache.get(object, this, keep); return object; } public int getStorageSize(long i) { return cache.get(i, this, false).getStorageSize(); } public void add(CachedObject object) { int size = object.getRealSize(rowOut); size += indexList.length * NodeAVLDisk.SIZE_IN_BYTE; size = rowOut.getStorageSize(size); object.setStorageSize(size); cache.add(object); } public CachedObject get(RowInputInterface in) { try { if (largeData) { return new RowAVLDiskLarge(table, in); } else { return new RowAVLDisk(table, in); } } catch (IOException e) { throw Error.error(ErrorCode.DATA_FILE_ERROR, e); } } public CachedObject getNewInstance(int size) { return null; } public CachedObject getNewCachedObject(Session session, Object object, boolean tx) { Row row; if (largeData) { row = new RowAVLDiskLarge(table, (Object[]) object, this); } else { row = new RowAVLDisk(table, (Object[]) object, this); } add(row); if (tx) { RowAction action = new RowAction(session, table, RowAction.ACTION_INSERT, row, null); row.rowAction = action; } return row; } public void indexRow(Session session, Row row) { try { super.indexRow(session, row); } catch (HsqlException e) { database.txManager.removeTransactionInfo(row); throw e; } } public void removeAll() { elementCount = 0; ArrayUtil.fillArray(accessorList, null); } public void remove(long i) { cache.remove(i, this); } public void removePersistence(long i) {} public void release(long i) { cache.release(i); } public void commitPersistence(CachedObject row) {} public void commitRow(Session session, Row row, int changeAction, int txModel) { Object[] data = row.getData(); switch (changeAction) { case RowAction.ACTION_DELETE : database.logger.writeDeleteStatement(session, (Table) table, data); if (txModel == TransactionManager.LOCKS) { remove(row.getPos()); } break; case RowAction.ACTION_INSERT : database.logger.writeInsertStatement(session, row, (Table) table); break; case RowAction.ACTION_INSERT_DELETE : // INSERT + DELETE if (txModel == TransactionManager.LOCKS) { remove(row.getPos()); } break; case RowAction.ACTION_DELETE_FINAL : delete(session, row); // remove info after delete database.txManager.removeTransactionInfo(row); remove(row.getPos()); break; } } public void rollbackRow(Session session, Row row, int changeAction, int txModel) { switch (changeAction) { case RowAction.ACTION_DELETE : if (txModel == TransactionManager.LOCKS) { row = (Row) get(row, true); ((RowAVL) row).setNewNodes(this); row.keepInMemory(false); indexRow(session, row); } break; case RowAction.ACTION_INSERT : if (txModel == TransactionManager.LOCKS) { delete(session, row); remove(row.getPos()); } break; case RowAction.ACTION_INSERT_DELETE : // INSERT + DELETE if (txModel == TransactionManager.LOCKS) { remove(row.getPos()); } break; } } // public DataFileCache getCache() { return cache; } public void setCache(DataFileCache cache) { this.cache = cache; } public void release() { ArrayUtil.fillArray(accessorList, null); cache.adjustStoreCount(-1); cache = null; elementCount = 0; } public CachedObject getAccessor(Index key) { NodeAVL node = (NodeAVL) accessorList[key.getPosition()]; if (node == null) { return null; } return node; } public void setAccessor(Index key, CachedObject accessor) { Index index = (Index) key; accessorList[index.getPosition()] = accessor; } public void setAccessor(Index key, long accessor) { CachedObject object = get(accessor, false); if (object != null) { NodeAVL node = ((RowAVL) object).getNode(key.getPosition()); object = node; } setAccessor(key, object); } public void resetAccessorKeys(Index[] keys) { if (indexList.length == 0 || accessorList[0] == null) { indexList = keys; accessorList = new CachedObject[indexList.length]; return; } throw Error.runtimeError(ErrorCode.U_S0500, "RowStoreAVLDisk"); } public void setReadOnly(boolean readOnly) { // called on insert or delete errors } public void writeLock() { cache.writeLock.lock(); } public void writeUnlock() { cache.writeLock.unlock(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/RowStoreAVL.java0000644000175000017500000004217212007547414023433 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.ColumnSchema; import org.hsqldb.Database; import org.hsqldb.HsqlException; import org.hsqldb.OpTypes; import org.hsqldb.Row; import org.hsqldb.RowAVL; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.TableBase; import org.hsqldb.TransactionManager; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.index.IndexAVL; import org.hsqldb.index.NodeAVL; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.navigator.RowIterator; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.types.Type; /* * Base implementation of PersistentStore for different table types. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public abstract class RowStoreAVL implements PersistentStore { Session session; Database database; PersistentStoreCollection manager; Index[] indexList = Index.emptyArray; CachedObject[] accessorList = CachedObject.emptyArray; TableBase table; long baseElementCount; long elementCount; boolean[] nullsList; double[][] searchCost; boolean isSchemaStore; // for result tables // for INFORMATION SCHEMA tables private long timestamp; // PersistentStore[] subStores = PersistentStore.emptyArray; public TableBase getTable() { return table; } public long getTimestamp() { return timestamp; } public void setTimestamp(long timestamp) { this.timestamp = timestamp; } public abstract boolean isMemory(); public void setMemory(boolean mode) {} public abstract int getAccessCount(); public abstract void set(CachedObject object); public abstract CachedObject get(long key, boolean keep); public abstract CachedObject get(CachedObject object, boolean keep); public abstract int getStorageSize(long key); public abstract void add(CachedObject object); public abstract CachedObject get(RowInputInterface in); public CachedObject get(CachedObject object, RowInputInterface in) { return object; } public abstract CachedObject getNewInstance(int size); public abstract CachedObject getNewCachedObject(Session session, Object object, boolean tx); public abstract void removePersistence(long i); public abstract void removeAll(); public abstract void remove(long i); public abstract void release(long i); public abstract void commitPersistence(CachedObject object); public abstract DataFileCache getCache(); public abstract void setCache(DataFileCache cache); public abstract void release(); public PersistentStore getAccessorStore(Index index) { return null; } public CachedObject getAccessor(Index key) { int position = key.getPosition(); if (position >= accessorList.length) { throw Error.runtimeError(ErrorCode.U_S0500, "RowStoreAVL"); } return accessorList[position]; } /** * Basic delete with no logging or referential checks. */ public void delete(Session session, Row row) { row = (Row) get(row, false); for (int i = 0; i < indexList.length; i++) { indexList[i].delete(session, this, row); } for (int i = 0; i < subStores.length; i++) { subStores[i].delete(session, row); } row.delete(this); elementCount--; if (elementCount > 16 * 1024 && elementCount < baseElementCount / 2) { baseElementCount = elementCount; searchCost = null; } } public void indexRow(Session session, Row row) { int i = 0; try { for (; i < indexList.length; i++) { indexList[i].insert(session, this, row); } int j = 0; try { for (j = 0; j < subStores.length; j++) { subStores[j].indexRow(session, row); } } catch (HsqlException e) { // unique index violation - rollback insert int count = j; j = 0; for (; j < count; j++) { subStores[j].delete(session, row); } throw e; } elementCount++; if (elementCount > 16 * 1024 && elementCount > baseElementCount * 2) { baseElementCount = elementCount; searchCost = null; } } catch (HsqlException e) { int count = i; i = 0; // unique index violation - rollback insert for (; i < count; i++) { indexList[i].delete(session, this, row); } remove(row.getPos()); throw e; } } // public final void indexRows(Session session) { for (int i = 1; i < indexList.length; i++) { setAccessor(indexList[i], null); } RowIterator it = rowIterator(); while (it.hasNext()) { Row row = it.getNextRow(); ((RowAVL) row).clearNonPrimaryNodes(); for (int i = 1; i < indexList.length; i++) { indexList[i].insert(session, this, row); } } } public final RowIterator rowIterator() { Index index = indexList[0]; for (int i = 0; i < indexList.length; i++) { if (indexList[i].isClustered()) { index = indexList[i]; break; } } return index.firstRow(this); } public abstract void setAccessor(Index key, CachedObject accessor); public abstract void setAccessor(Index key, long accessor); public void resetAccessorKeys(Index[] keys) { Index[] oldIndexList = indexList; searchCost = null; if (indexList.length == 0 || accessorList[0] == null) { indexList = keys; accessorList = new CachedObject[indexList.length]; return; } // method might be called twice if (indexList == keys) { return; } CachedObject[] oldAccessors = accessorList; int limit = indexList.length; int diff = keys.length - indexList.length; int position = 0; if (diff < -1) { throw Error.runtimeError(ErrorCode.U_S0500, "RowStoreAV"); } else if (diff == -1) { limit = keys.length; } else if (diff == 0) { throw Error.runtimeError(ErrorCode.U_S0500, "RowStoreAV"); } else if (diff == 1) { ; } else { for (; position < limit; position++) { if (indexList[position] != keys[position]) { break; } } Index[] tempKeys = (Index[]) ArrayUtil.toAdjustedArray(indexList, null, position, 1); tempKeys[position] = keys[position]; resetAccessorKeys(tempKeys); resetAccessorKeys(keys); return; } for (; position < limit; position++) { if (indexList[position] != keys[position]) { break; } } accessorList = (CachedObject[]) ArrayUtil.toAdjustedArray(accessorList, null, position, diff); indexList = keys; try { if (diff > 0) { insertIndexNodes(indexList[0], indexList[position]); } else { dropIndexFromRows(indexList[0], oldIndexList[position]); } } catch (HsqlException e) { accessorList = oldAccessors; indexList = oldIndexList; throw e; } } public Index[] getAccessorKeys() { return indexList; } public synchronized double searchCost(Session session, Index index, int count, int opType) { if (opType != OpTypes.EQUAL) { return elementCount / 2; } if (index.isUnique() && count == index.getColumnCount()) { return 1; } int position = index.getPosition(); if (searchCost == null || searchCost.length <= position) { searchCost = new double[indexList.length][]; } if (searchCost[position] == null) { searchCost[index.getPosition()] = indexList[index.getPosition()].searchCost(session, this); } return searchCost[index.getPosition()][count - 1]; } public long elementCount() { Index index = this.indexList[0]; if (elementCount < 0) { elementCount = ((IndexAVL) index).getNodeCount(session, this); } return elementCount; } public long elementCount(Session session) { Index index = this.indexList[0]; if (elementCount < 0) { elementCount = ((IndexAVL) index).getNodeCount(session, this); } if (session != null) { int txControl = session.database.txManager.getTransactionControl(); if (txControl != TransactionManager.LOCKS) { switch (table.getTableType()) { case TableBase.MEMORY_TABLE : case TableBase.CACHED_TABLE : case TableBase.TEXT_TABLE : return ((IndexAVL) index).getNodeCount(session, this); default : } } } return elementCount; } public long elementCountUnique(Index index) { return 0; } public void setElementCount(Index key, long size, long uniqueSize) { elementCount = size; } public boolean hasNull(int pos) { return false; } /** * Moves the data from an old store to new after changes to table * The colindex argument is the index of the column that was * added or removed. The adjust argument is {-1 | 0 | +1} */ public final void moveData(Session session, PersistentStore other, int colindex, int adjust) { Type oldtype = null; Type newtype = null; Object colvalue = null; if (adjust >= 0 && colindex != -1) { ColumnSchema column = ((Table) table).getColumn(colindex); colvalue = column.getDefaultValue(session); newtype = ((Table) table).getColumnTypes()[colindex]; } if (adjust <= 0 && colindex != -1) { oldtype = ((Table) other.getTable()).getColumnTypes()[colindex]; } try { Table table = (Table) this.table; RowIterator it = other.rowIterator(); while (it.hasNext()) { Row row = it.getNextRow(); Object[] olddata = row.getData(); Object[] data = table.getEmptyRowData(); Object oldvalue = null; if (adjust == 0 && colindex != -1) { oldvalue = olddata[colindex]; colvalue = newtype.convertToType(session, oldvalue, oldtype); } ArrayUtil.copyAdjustArray(olddata, data, colvalue, colindex, adjust); table.systemSetIdentityColumn(session, data); if (table.hasGeneratedColumn()) { ((Table) table).setGeneratedColumns(session, data); } table.enforceTypeLimits(session, data); table.enforceRowConstraints(session, data); // get object without RowAction Row newrow = (Row) getNewCachedObject(session, data, false); indexRow(session, newrow); } if (table.isTemp()) { return; } if (oldtype != null && oldtype.isLobType()) { it = other.rowIterator(); while (it.hasNext()) { Row row = it.getNextRow(); Object[] olddata = row.getData(); Object oldvalue = olddata[colindex]; if (oldvalue != null) { session.sessionData.adjustLobUsageCount(oldvalue, -1); } } } if (newtype != null && newtype.isLobType()) { it = rowIterator(); while (it.hasNext()) { Row row = it.getNextRow(); Object[] data = row.getData(); Object value = data[colindex]; if (value != null) { session.sessionData.adjustLobUsageCount(value, +1); } } } } catch (java.lang.OutOfMemoryError e) { throw Error.error(ErrorCode.OUT_OF_MEMORY); } } public void reindex(Session session, Index index) { setAccessor(index, null); RowIterator it = table.rowIterator(this); while (it.hasNext()) { RowAVL row = (RowAVL) it.getNextRow(); row.getNode(index.getPosition()).delete(); index.insert(session, this, row); } } public void setReadOnly(boolean readOnly) {} public void writeLock() {} public void writeUnlock() {} void dropIndexFromRows(Index primaryIndex, Index oldIndex) { RowIterator it = primaryIndex.firstRow(this); int position = oldIndex.getPosition() - 1; while (it.hasNext()) { Row row = it.getNextRow(); int i = position - 1; NodeAVL backnode = ((RowAVL) row).getNode(0); while (i-- > 0) { backnode = backnode.nNext; } backnode.nNext = backnode.nNext.nNext; } } boolean insertIndexNodes(Index primaryIndex, Index newIndex) { int position = newIndex.getPosition(); RowIterator it = primaryIndex.firstRow(this); int rowCount = 0; HsqlException error = null; try { while (it.hasNext()) { Row row = it.getNextRow(); ((RowAVL) row).insertNode(position); // count before inserting rowCount++; newIndex.insert(session, this, row); } return true; } catch (java.lang.OutOfMemoryError e) { error = Error.error(ErrorCode.OUT_OF_MEMORY); } catch (HsqlException e) { error = e; } // backtrack on error // rowCount rows have been modified it = primaryIndex.firstRow(this); for (int i = 0; i < rowCount; i++) { Row row = it.getNextRow(); NodeAVL backnode = ((RowAVL) row).getNode(0); int j = position; while (--j > 0) { backnode = backnode.nNext; } backnode.nNext = backnode.nNext.nNext; } throw error; } /** * Used with memory indexes */ void destroy() { if (indexList.length == 0) { return; } IndexAVL idx = (IndexAVL) indexList[0]; NodeAVL root = (NodeAVL) accessorList[0]; idx.unlinkNodes(root); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/DataFileBlockManager.java0000644000175000017500000001135412007547414025221 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import org.hsqldb.lib.DoubleIntIndex; /** * Maintains a list of free file blocks with fixed capacity.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.8.0 */ public class DataFileBlockManager { private DoubleIntIndex lookup; private final int capacity; private int midSize; private final int scale; private final int reuseMin; private long releaseCount; private long requestCount; private long requestSize; // reporting vars long lostFreeBlockSize; boolean isModified; /** * */ public DataFileBlockManager(int capacity, int scale, int reuseMin, long lostSize) { lookup = new DoubleIntIndex(capacity, true); lookup.setValuesSearchTarget(); this.capacity = capacity; this.scale = scale; this.reuseMin = reuseMin; this.lostFreeBlockSize = lostSize; this.midSize = 128; // arbitrary initial value } /** */ void add(long pos, int rowSize) { isModified = true; if (capacity == 0 || rowSize < reuseMin) { lostFreeBlockSize += rowSize; return; } releaseCount++; // if (lookup.size() == capacity) { resetList(); } if (pos < Integer.MAX_VALUE) { lookup.add((int) pos, rowSize); } } /** * Returns the position of a free block or 0. */ int get(int rowSize) { if (capacity == 0 || rowSize < reuseMin) { return -1; } int index = lookup.findFirstGreaterEqualKeyIndex(rowSize); if (index == -1) { return -1; } // statistics for successful requests only - to be used later for midSize requestCount++; requestSize += rowSize; int length = lookup.getValue(index); int difference = length - rowSize; int key = lookup.getKey(index); lookup.remove(index); if (difference >= midSize) { int pos = key + (rowSize / scale); lookup.add(pos, difference); } else { lostFreeBlockSize += difference; } return key; } int size() { return lookup.size(); } long getLostBlocksSize() { return lostFreeBlockSize; } boolean isModified() { return isModified; } void clear() { removeBlocks(lookup.size()); } private void resetList() { if (requestCount != 0) { midSize = (int) (requestSize / requestCount); } int first = lookup.findFirstGreaterEqualSlotIndex(midSize); if (first < lookup.size() / 4) { first = lookup.size() / 4; } removeBlocks(first); } private void removeBlocks(int blocks) { for (int i = 0; i < blocks; i++) { lostFreeBlockSize += lookup.getValue(i); } lookup.removeRange(0, blocks); } private void checkIntegrity() throws NullPointerException {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/persist/HsqlDatabaseProperties.java0000644000175000017500000011077612007547412025721 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.persist; import java.util.Enumeration; import org.hsqldb.Database; import org.hsqldb.DatabaseURL; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HashMap; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.Set; import org.hsqldb.lib.StringUtil; /** * Manages a .properties file for a database. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.0 */ public class HsqlDatabaseProperties extends HsqlProperties { private static final String hsqldb_method_class_names = "hsqldb.method_class_names"; private static HashSet accessibleJavaMethodNames; private static boolean allowFullPath; static { try { String prop = System.getProperty(hsqldb_method_class_names); if (prop != null) { accessibleJavaMethodNames = new HashSet(); String[] names = StringUtil.split(prop, ";"); for (int i = 0; i < names.length; i++) { accessibleJavaMethodNames.add(names[i]); } } prop = System.getProperty(hsqldb_method_class_names); if (prop != null) { if (Boolean.valueOf(prop)) { allowFullPath = true; } } } catch (Exception e) {} } /** * If the system property "hsqldb.method_class_names" is not set, then * static methods of all available Java classes can be accessed as functions * in HSQLDB. If the property is set, then only the list of semicolon * seperated method names becomes accessible. An empty property value means * no class is accessible.

* * A property value that ends with .* is treated as a wild card and allows * access to all classe or method names formed by substitution of the * asterisk.

* * All methods of java.lang.Math are always accessible. */ public static boolean supportsJavaMethod(String name) { if (accessibleJavaMethodNames == null) { return true; } if (name.startsWith("java.lang.Math.")) { return true; } if (accessibleJavaMethodNames.contains(name)) { return true; } Iterator it = accessibleJavaMethodNames.iterator(); while (it.hasNext()) { String className = (String) it.next(); int limit = className.lastIndexOf(".*"); if (limit < 1) { continue; } if (name.startsWith(className.substring(0, limit + 1))) { return true; } } return false; } // accessibility public static final int SYSTEM_PROPERTY = 0; public static final int FILE_PROPERTY = 1; public static final int SQL_PROPERTY = 2; // db files modified public static final int FILES_NOT_MODIFIED = 0; public static final int FILES_MODIFIED = 1; public static final int FILES_MODIFIED_NEW = 2; public static final int FILES_NEW = 3; private static final String MODIFIED_NO = "no"; private static final String MODIFIED_YES = "yes"; private static final String MODIFIED_YES_NEW = "yes-new-files"; private static final String MODIFIED_NO_NEW = "no-new-files"; // allowed property metadata private static final HashMap dbMeta = new HashMap(67); private static final HashMap textMeta = new HashMap(17); // versions public static final String VERSION_STRING_1_8_0 = "1.8.0"; public static final String THIS_VERSION = "2.2.9"; public static final String THIS_FULL_VERSION = "2.2.9"; public static final String THIS_CACHE_VERSION = "2.0.0"; public static final String PRODUCT_NAME = "HSQL Database Engine"; public static final int MAJOR = 2, MINOR = 2, REVISION = 9; /** * system properties supported by HSQLDB */ public static final String system_lockfile_poll_retries_property = "hsqldb.lockfile_poll_retries"; public static final String system_max_char_or_varchar_display_size = "hsqldb.max_char_or_varchar_display_size"; // public static final String hsqldb_inc_backup = "hsqldb.inc_backup"; // public static final String hsqldb_version = "version"; public static final String hsqldb_readonly = "readonly"; private static final String hsqldb_modified = "modified"; // public static final String hsqldb_cache_version = "hsqldb.cache_version"; // public static final String runtime_gc_interval = "runtime.gc_interval"; // public static final String url_ifexists = "ifexists"; public static final String url_create = "create"; public static final String url_default_schema = "default_schema"; public static final String url_check_props = "check_props"; public static final String url_get_column_name = "get_column_name"; // public static final String url_storage_class_name = "storage_class_name"; public static final String url_fileaccess_class_name = "fileaccess_class_name"; public static final String url_storage_key = "storage_key"; public static final String url_shutdown = "shutdown"; // public static final String url_crypt_key = "crypt_key"; public static final String url_crypt_type = "crypt_type"; public static final String url_crypt_provider = "crypt_provider"; public static final String url_crypt_lobs = "crypt_lobs"; // public static final String hsqldb_tx = "hsqldb.tx"; public static final String hsqldb_tx_level = "hsqldb.tx_level"; public static final String hsqldb_tx_conflict_rollback = "hsqldb.tx_conflict_rollback"; public static final String hsqldb_applog = "hsqldb.applog"; public static final String hsqldb_sqllog = "hsqldb.sqllog"; public static final String hsqldb_lob_file_scale = "hsqldb.lob_file_scale"; public static final String hsqldb_cache_file_scale = "hsqldb.cache_file_scale"; public static final String hsqldb_cache_free_count = "hsqldb.cache_free_count"; public static final String hsqldb_cache_rows = "hsqldb.cache_rows"; public static final String hsqldb_cache_size = "hsqldb.cache_size"; public static final String hsqldb_default_table_type = "hsqldb.default_table_type"; public static final String hsqldb_defrag_limit = "hsqldb.defrag_limit"; public static final String hsqldb_files_readonly = "files_readonly"; public static final String hsqldb_lock_file = "hsqldb.lock_file"; public static final String hsqldb_log_data = "hsqldb.log_data"; public static final String hsqldb_log_size = "hsqldb.log_size"; public static final String hsqldb_nio_data_file = "hsqldb.nio_data_file"; public static final String hsqldb_nio_max_size = "hsqldb.nio_max_size"; public static final String hsqldb_script_format = "hsqldb.script_format"; public static final String hsqldb_temp_directory = "hsqldb.temp_directory"; public static final String hsqldb_result_max_memory_rows = "hsqldb.result_max_memory_rows"; public static final String hsqldb_write_delay = "hsqldb.write_delay"; public static final String hsqldb_write_delay_millis = "hsqldb.write_delay_millis"; public static final String hsqldb_full_log_replay = "hsqldb.full_log_replay"; public static final String hsqldb_large_data = "hsqldb.large_data"; // public static final String sql_ref_integrity = "sql.ref_integrity"; public static final String sql_compare_in_locale = "sql.compare_in_locale"; public static final String sql_enforce_size = "sql.enforce_size"; public static final String sql_enforce_strict_size = "sql.enforce_strict_size"; // synonym for sql_enforce_size public static final String sql_enforce_refs = "sql.enforce_refs"; public static final String sql_enforce_names = "sql.enforce_names"; public static final String sql_regular_names = "sql.regular_names"; public static final String sql_enforce_types = "sql.enforce_types"; public static final String sql_enforce_tdcd = "sql.enforce_tdc_delete"; public static final String sql_enforce_tdcu = "sql.enforce_tdc_update"; public static final String sql_concat_nulls = "sql.concat_nulls"; public static final String sql_nulls_first = "sql.nulls_first"; public static final String sql_unique_nulls = "sql.unique_nulls"; public static final String sql_convert_trunc = "sql.convert_trunc"; public static final String sql_avg_scale = "sql.avg_scale"; public static final String sql_double_nan = "sql.double_nan"; public static final String sql_syntax_db2 = "sql.syntax_db2"; public static final String sql_syntax_mss = "sql.syntax_mss"; public static final String sql_syntax_mys = "sql.syntax_mys"; public static final String sql_syntax_ora = "sql.syntax_ora"; public static final String sql_syntax_pgs = "sql.syntax_pgs"; public static final String jdbc_translate_tti_types = "jdbc.translate_tti_types"; public static final String sql_identity_is_pk = "sql.identity_is_pk"; public static final String sql_longvar_is_lob = "sql.longvar_is_lob"; public static final String sql_pad_space = "sql.pad_space"; // public static final String textdb_cache_scale = "textdb.cache_scale"; public static final String textdb_cache_size_scale = "textdb.cache_size_scale"; public static final String textdb_cache_rows = "textdb.cache_rows"; public static final String textdb_cache_size = "textdb.cache_size"; public static final String textdb_all_quoted = "textdb.all_quoted"; public static final String textdb_allow_full_path = "textdb.allow_full_path"; public static final String textdb_encoding = "textdb.encoding"; public static final String textdb_ignore_first = "textdb.ignore_first"; public static final String textdb_quoted = "textdb.quoted"; public static final String textdb_fs = "textdb.fs"; public static final String textdb_vs = "textdb.vs"; public static final String textdb_lvs = "textdb.lvs"; static { // text table defaults textMeta.put(textdb_allow_full_path, HsqlProperties.getMeta(textdb_allow_full_path, SYSTEM_PROPERTY, allowFullPath)); textMeta.put(textdb_quoted, HsqlProperties.getMeta(textdb_quoted, SQL_PROPERTY, true)); textMeta.put(textdb_all_quoted, HsqlProperties.getMeta(textdb_all_quoted, SQL_PROPERTY, false)); textMeta.put(textdb_ignore_first, HsqlProperties.getMeta(textdb_ignore_first, SQL_PROPERTY, false)); textMeta.put(textdb_fs, HsqlProperties.getMeta(textdb_fs, SQL_PROPERTY, ",")); textMeta.put(textdb_vs, HsqlProperties.getMeta(textdb_vs, SQL_PROPERTY, null)); textMeta.put(textdb_lvs, HsqlProperties.getMeta(textdb_lvs, SQL_PROPERTY, null)); textMeta.put(textdb_encoding, HsqlProperties.getMeta(textdb_encoding, SQL_PROPERTY, "ISO-8859-1")); textMeta.put(textdb_cache_scale, HsqlProperties.getMeta(textdb_cache_scale, SQL_PROPERTY, 10, 8, 16)); textMeta.put(textdb_cache_size_scale, HsqlProperties.getMeta(textdb_cache_size_scale, SQL_PROPERTY, 10, 6, 20)); textMeta.put(textdb_cache_rows, HsqlProperties.getMeta(textdb_cache_rows, SQL_PROPERTY, 1000, 100, 1000000)); textMeta.put(textdb_cache_size, HsqlProperties.getMeta(textdb_cache_size, SQL_PROPERTY, 100, 10, 1000000)); dbMeta.putAll(textMeta); // string defaults for protected props dbMeta.put(hsqldb_version, HsqlProperties.getMeta(hsqldb_version, FILE_PROPERTY, null)); dbMeta.put(hsqldb_modified, HsqlProperties.getMeta(hsqldb_modified, FILE_PROPERTY, null)); dbMeta.put(hsqldb_cache_version, HsqlProperties.getMeta(hsqldb_cache_version, FILE_PROPERTY, null)); // boolean defaults for protected props dbMeta.put(hsqldb_readonly, HsqlProperties.getMeta(hsqldb_readonly, FILE_PROPERTY, false)); dbMeta.put(hsqldb_files_readonly, HsqlProperties.getMeta(hsqldb_files_readonly, FILE_PROPERTY, false)); // string defaults for user defined props dbMeta.put(hsqldb_tx, HsqlProperties.getMeta(hsqldb_tx, SQL_PROPERTY, "LOCKS")); dbMeta.put(hsqldb_tx_level, HsqlProperties.getMeta(hsqldb_tx_level, SQL_PROPERTY, "READ_COMMITTED")); dbMeta.put(hsqldb_temp_directory, HsqlProperties.getMeta(hsqldb_temp_directory, SQL_PROPERTY, null)); dbMeta.put(hsqldb_default_table_type, HsqlProperties.getMeta(hsqldb_default_table_type, SQL_PROPERTY, "MEMORY")); // boolean defaults for user defined props dbMeta.put(hsqldb_tx_conflict_rollback, HsqlProperties.getMeta(hsqldb_tx_conflict_rollback, SQL_PROPERTY, true)); dbMeta.put(jdbc_translate_tti_types, HsqlProperties.getMeta(jdbc_translate_tti_types, SQL_PROPERTY, true)); dbMeta.put(hsqldb_inc_backup, HsqlProperties.getMeta(hsqldb_inc_backup, SQL_PROPERTY, true)); dbMeta.put(hsqldb_lock_file, HsqlProperties.getMeta(hsqldb_lock_file, SQL_PROPERTY, true)); dbMeta.put(hsqldb_log_data, HsqlProperties.getMeta(hsqldb_log_data, SQL_PROPERTY, true)); dbMeta.put(hsqldb_nio_data_file, HsqlProperties.getMeta(hsqldb_nio_data_file, SQL_PROPERTY, true)); dbMeta.put(hsqldb_full_log_replay, HsqlProperties.getMeta(hsqldb_full_log_replay, SQL_PROPERTY, false)); dbMeta.put(sql_ref_integrity, HsqlProperties.getMeta(sql_ref_integrity, SQL_PROPERTY, true)); // SQL reserved words not allowed as some identifiers dbMeta.put(sql_enforce_names, HsqlProperties.getMeta(sql_enforce_names, SQL_PROPERTY, false)); dbMeta.put(sql_regular_names, HsqlProperties.getMeta(sql_regular_names, SQL_PROPERTY, true)); dbMeta.put(sql_enforce_refs, HsqlProperties.getMeta(sql_enforce_refs, SQL_PROPERTY, false)); // char padding to size and exception if data is too long dbMeta.put(sql_enforce_size, HsqlProperties.getMeta(sql_enforce_size, SQL_PROPERTY, true)); dbMeta.put(sql_enforce_types, HsqlProperties.getMeta(sql_enforce_types, SQL_PROPERTY, false)); dbMeta.put(sql_enforce_tdcd, HsqlProperties.getMeta(sql_enforce_tdcd, SQL_PROPERTY, true)); dbMeta.put(sql_enforce_tdcu, HsqlProperties.getMeta(sql_enforce_tdcu, SQL_PROPERTY, true)); dbMeta.put(sql_concat_nulls, HsqlProperties.getMeta(sql_concat_nulls, SQL_PROPERTY, true)); dbMeta.put(sql_nulls_first, HsqlProperties.getMeta(sql_nulls_first, SQL_PROPERTY, true)); dbMeta.put(sql_unique_nulls, HsqlProperties.getMeta(sql_unique_nulls, SQL_PROPERTY, true)); dbMeta.put(sql_convert_trunc, HsqlProperties.getMeta(sql_convert_trunc, SQL_PROPERTY, true)); dbMeta.put(sql_avg_scale, HsqlProperties.getMeta(sql_avg_scale, SQL_PROPERTY, 0, 0, 10)); dbMeta.put(sql_double_nan, HsqlProperties.getMeta(sql_double_nan, SQL_PROPERTY, true)); dbMeta.put(sql_syntax_db2, HsqlProperties.getMeta(sql_syntax_db2, SQL_PROPERTY, false)); dbMeta.put(sql_syntax_mss, HsqlProperties.getMeta(sql_syntax_mss, SQL_PROPERTY, false)); dbMeta.put(sql_syntax_mys, HsqlProperties.getMeta(sql_syntax_mys, SQL_PROPERTY, false)); dbMeta.put(sql_syntax_ora, HsqlProperties.getMeta(sql_syntax_ora, SQL_PROPERTY, false)); dbMeta.put(sql_syntax_pgs, HsqlProperties.getMeta(sql_syntax_pgs, SQL_PROPERTY, false)); dbMeta.put(sql_compare_in_locale, HsqlProperties.getMeta(sql_compare_in_locale, SQL_PROPERTY, false)); dbMeta.put(sql_identity_is_pk, HsqlProperties.getMeta(sql_identity_is_pk, SQL_PROPERTY, false)); dbMeta.put(sql_longvar_is_lob, HsqlProperties.getMeta(sql_longvar_is_lob, SQL_PROPERTY, false)); dbMeta.put(hsqldb_write_delay, HsqlProperties.getMeta(hsqldb_write_delay, SQL_PROPERTY, true)); dbMeta.put(hsqldb_write_delay_millis, HsqlProperties.getMeta(hsqldb_write_delay_millis, SQL_PROPERTY, 500, 0, 10000)); // integral defaults for user-defined props - sets dbMeta.put(hsqldb_applog, HsqlProperties.getMeta(hsqldb_applog, SQL_PROPERTY, 0, 0, 3)); dbMeta.put(hsqldb_sqllog, HsqlProperties.getMeta(hsqldb_sqllog, SQL_PROPERTY, 0, 0, 3)); dbMeta.put(hsqldb_script_format, HsqlProperties.getMeta(hsqldb_script_format, SQL_PROPERTY, 0, new int[] { 0, 1, 3 })); dbMeta.put(hsqldb_lob_file_scale, HsqlProperties.getMeta(hsqldb_lob_file_scale, SQL_PROPERTY, 32, new int[] { 1, 2, 4, 8, 16, 32 })); // this property is normally 8 - or 1 for old databases from early versions dbMeta.put(hsqldb_cache_file_scale, HsqlProperties.getMeta(hsqldb_cache_file_scale, SQL_PROPERTY, 32, new int[] { 1, 8, 16, 32, 64, 128, 256, 512, 1024 })); // integral defaults for user defined props - ranges dbMeta.put(hsqldb_log_size, HsqlProperties.getMeta(hsqldb_log_size, SQL_PROPERTY, 50, 0, 4 * 1024)); dbMeta.put(hsqldb_defrag_limit, HsqlProperties.getMeta(hsqldb_defrag_limit, SQL_PROPERTY, 0, 0, 100)); dbMeta.put(runtime_gc_interval, HsqlProperties.getMeta(runtime_gc_interval, SQL_PROPERTY, 0, 0, 1000000)); dbMeta.put(hsqldb_cache_size, HsqlProperties.getMeta(hsqldb_cache_size, SQL_PROPERTY, 10000, 100, 4 * 1024 * 1024)); dbMeta.put(hsqldb_cache_rows, HsqlProperties.getMeta(hsqldb_cache_rows, SQL_PROPERTY, 50000, 100, 4 * 1024 * 1024)); dbMeta.put(hsqldb_cache_free_count, HsqlProperties.getMeta(hsqldb_cache_free_count, SQL_PROPERTY, 512, 0, 4096)); dbMeta.put(hsqldb_result_max_memory_rows, HsqlProperties.getMeta(hsqldb_result_max_memory_rows, SQL_PROPERTY, 0, 0, 4 * 1024 * 1024)); dbMeta.put(hsqldb_nio_max_size, HsqlProperties.getMeta(hsqldb_nio_max_size, SQL_PROPERTY, 256, 64, 262144)); } private Database database; public HsqlDatabaseProperties(Database db) { super(dbMeta, db.getPath(), db.logger.getFileAccess(), db.isFilesInJar()); database = db; setNewDatabaseProperties(); } void setNewDatabaseProperties() { // version of a new database setProperty(hsqldb_version, THIS_VERSION); setProperty(hsqldb_modified, MODIFIED_NO_NEW); // OOo related code if (database.logger.isStoredFileAccess()) { setProperty(hsqldb_cache_rows, 25000); setProperty(hsqldb_cache_size, 6000); setProperty(hsqldb_log_size, 10); setProperty(sql_enforce_size, true); setProperty(hsqldb_nio_data_file, false); setProperty(hsqldb_lock_file, true); setProperty(hsqldb_default_table_type, "cached"); setProperty(jdbc_translate_tti_types, true); } // OOo end } /** * Creates file with defaults if it didn't exist. * Returns false if file already existed. */ public boolean load() { boolean exists; if (!DatabaseURL.isFileBasedDatabaseType(database.getType())) { return true; } try { exists = super.load(); } catch (Throwable t) { throw Error.error(t, ErrorCode.FILE_IO_ERROR, ErrorCode.M_LOAD_SAVE_PROPERTIES, new Object[] { t.toString(), fileName }); } if (!exists) { return false; } filterLoadedProperties(); String version = getStringProperty(hsqldb_version); int check = version.substring(0, 5).compareTo(VERSION_STRING_1_8_0); // do not open early version databases if (check < 0) { throw Error.error(ErrorCode.WRONG_DATABASE_FILE_VERSION); } // do not open databases of 1.8 versions if script format is not compatible if (check == 0) { if (getIntegerProperty(hsqldb_script_format) != 0) { throw Error.error(ErrorCode.WRONG_DATABASE_FILE_VERSION); } } check = version.substring(0, 2).compareTo(THIS_VERSION); // do not open if the database belongs to a later (future) version (3.x) if (check > 0) { throw Error.error(ErrorCode.WRONG_DATABASE_FILE_VERSION); } return true; } public void save() { if (!DatabaseURL.isFileBasedDatabaseType(database.getType()) || database.isFilesReadOnly() || database.isFilesInJar()) { return; } try { HsqlProperties props = new HsqlProperties(dbMeta, database.getPath(), database.logger.getFileAccess(), false); if (getIntegerProperty(hsqldb_script_format) == 3) { props.setProperty(hsqldb_script_format, 3); } props.setProperty(hsqldb_version, THIS_VERSION); if (database.logger.isStoredFileAccess()) { if (!database.logger.isNewStoredFileAccess()) { // when jar is used with embedded databases in AOO 3.4 and recent(2012) LO this // line can be uncommented to circumvent hard-coded check in OOo code in // drivers/hsqldb/HDriver.cxx // props.setProperty(hsqldb_version, VERSION_STRING_1_8_0); } } props.setProperty(hsqldb_modified, getProperty(hsqldb_modified)); props.save(fileName + ".properties" + ".new"); fa.renameElement(fileName + ".properties" + ".new", fileName + ".properties"); } catch (Throwable t) { database.logger.logSevereEvent("save failed", t); throw Error.error(t, ErrorCode.FILE_IO_ERROR, ErrorCode.M_LOAD_SAVE_PROPERTIES, new Object[] { t.toString(), fileName }); } } void filterLoadedProperties() { String val = stringProps.getProperty(sql_enforce_strict_size); if (val != null) { stringProps.setProperty(sql_enforce_size, val); } Enumeration en = stringProps.propertyNames(); while (en.hasMoreElements()) { String key = (String) en.nextElement(); boolean accept = dbMeta.containsKey(key); if (!accept) { stringProps.remove(key); } } } /** * overload file database properties with any passed on URL line * do not store password etc */ public void setURLProperties(HsqlProperties p) { boolean strict = false; if (p == null) { return; } String val = p.getProperty(sql_enforce_strict_size); if (val != null) { p.setProperty(sql_enforce_size, val); p.removeProperty(sql_enforce_strict_size); } strict = p.isPropertyTrue(url_check_props, false); for (Enumeration e = p.propertyNames(); e.hasMoreElements(); ) { String propertyName = (String) e.nextElement(); String propertyValue = p.getProperty(propertyName); boolean valid = false; boolean validVal = false; String error = null; Object[] meta = (Object[]) dbMeta.get(propertyName); if (meta != null && ((Integer) meta[HsqlProperties.indexType]).intValue() == SQL_PROPERTY) { valid = true; error = HsqlProperties.validateProperty(propertyName, propertyValue, meta); validVal = error == null; } if (propertyName.startsWith("sql.") || propertyName.startsWith("hsqldb.") || propertyName.startsWith("textdb.")) { if (strict && !valid) { throw Error.error(ErrorCode.X_42555, propertyName); } if (strict && !validVal) { throw Error.error(ErrorCode.X_42556, propertyName); } } } for (Enumeration e = p.propertyNames(); e.hasMoreElements(); ) { String propertyName = (String) e.nextElement(); Object[] meta = (Object[]) dbMeta.get(propertyName); if (meta != null && ((Integer) meta[HsqlProperties.indexType]).intValue() == SQL_PROPERTY) { setDatabaseProperty(propertyName, p.getProperty(propertyName)); } } } public Set getUserDefinedPropertyData() { Set set = new HashSet(); Iterator it = dbMeta.values().iterator(); while (it.hasNext()) { Object[] row = (Object[]) it.next(); if (((Integer) row[HsqlProperties.indexType]).intValue() == SQL_PROPERTY) { set.add(row); } } return set; } public boolean isUserDefinedProperty(String key) { Object[] row = (Object[]) dbMeta.get(key); return row != null && ((Integer) row[HsqlProperties.indexType]).intValue() == SQL_PROPERTY; } public boolean isBoolean(String key) { Object[] row = (Object[]) dbMeta.get(key); return row != null && row[HsqlProperties.indexClass].equals("Boolean") && ((Integer) row[HsqlProperties.indexType]).intValue() == SQL_PROPERTY; } public boolean isIntegral(String key) { Object[] row = (Object[]) dbMeta.get(key); return row != null && row[HsqlProperties.indexClass].equals("Integer") && ((Integer) row[HsqlProperties.indexType]).intValue() == SQL_PROPERTY; } public boolean isString(String key) { Object[] row = (Object[]) dbMeta.get(key); return row != null && row[HsqlProperties.indexClass].equals("String") && ((Integer) row[HsqlProperties.indexType]).intValue() == SQL_PROPERTY; } public boolean setDatabaseProperty(String key, String value) { Object[] meta = (Object[]) dbMeta.get(key); String error = HsqlProperties.validateProperty(key, value, meta); if (error != null) { return false; } stringProps.put(key, value); return true; } public int getDefaultWriteDelay() { // OOo related code if (database.logger.isStoredFileAccess()) { return 2000; } // OOo end return 500; } //--------------------- // new properties to review / persist public static final int NO_MESSAGE = 1; public int getErrorLevel() { return NO_MESSAGE; } public boolean divisionByZero() { return false; } //------------------------ public void setDBModified(int mode) { String value; switch (mode) { case FILES_NOT_MODIFIED : value = MODIFIED_NO; break; case FILES_MODIFIED : value = MODIFIED_YES; break; case FILES_MODIFIED_NEW : value = MODIFIED_YES_NEW; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "HsqlDatabaseProperties"); } stringProps.put(hsqldb_modified, value); save(); } public int getDBModified() { String value = getStringProperty(hsqldb_modified); if (MODIFIED_YES.equals(value)) { return FILES_MODIFIED; } else if (MODIFIED_YES_NEW.equals(value)) { return FILES_MODIFIED_NEW; } else if (MODIFIED_NO_NEW.equals(value)) { return FILES_NEW; } return FILES_NOT_MODIFIED; } //----------------------- public String getProperty(String key) { Object[] metaData = (Object[]) dbMeta.get(key); if (metaData == null) { throw Error.error(ErrorCode.X_42555, key); } return stringProps.getProperty(key); } /** for all types of property apart from system props */ public String getPropertyString(String key) { Object[] metaData = (Object[]) dbMeta.get(key); if (metaData == null) { throw Error.error(ErrorCode.X_42555, key); } String prop = stringProps.getProperty(key); boolean isSystem = ((Integer) metaData[HsqlProperties.indexType]).intValue() == SYSTEM_PROPERTY; if (prop == null && isSystem) { try { prop = System.getProperty(key); } catch (SecurityException e) {} } if (prop == null) { Object value = metaData[HsqlProperties.indexDefaultValue]; if (value == null) { return null; } return String.valueOf(value); } return prop; } public boolean isPropertyTrue(String key) { Boolean value; Object[] metaData = (Object[]) dbMeta.get(key); if (metaData == null) { throw Error.error(ErrorCode.X_42555, key); } value = (Boolean) metaData[HsqlProperties.indexDefaultValue]; String prop = null; boolean isSystem = ((Integer) metaData[HsqlProperties.indexType]).intValue() == SYSTEM_PROPERTY; if (isSystem) { try { prop = System.getProperty(key); } catch (SecurityException e) {} } else { prop = stringProps.getProperty(key); } if (prop != null) { value = Boolean.valueOf(prop); } return value.booleanValue(); } public String getStringProperty(String key) { String value; Object[] metaData = (Object[]) dbMeta.get(key); if (metaData == null) { throw Error.error(ErrorCode.X_42555, key); } value = (String) metaData[HsqlProperties.indexDefaultValue]; String prop = stringProps.getProperty(key); if (prop != null) { value = prop; } return value; } public int getIntegerProperty(String key) { int value; Object[] metaData = (Object[]) dbMeta.get(key); if (metaData == null) { throw Error.error(ErrorCode.X_42555, key); } value = ((Integer) metaData[HsqlProperties.indexDefaultValue]).intValue(); String prop = stringProps.getProperty(key); if (prop != null) { try { value = Integer.parseInt(prop); } catch (NumberFormatException e) {} } return value; } public static Iterator getPropertiesMetaIterator() { return dbMeta.values().iterator(); } public String getClientPropertiesAsString() { if (isPropertyTrue(jdbc_translate_tti_types)) { StringBuffer sb = new StringBuffer(jdbc_translate_tti_types); sb.append('=').append(true); return sb.toString(); } return ""; } public boolean isVersion18() { String version = getProperty(HsqlDatabaseProperties.hsqldb_cache_version, THIS_VERSION); return version.substring(0, 4).equals("1.7."); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/HsqlDateTime.java0000644000175000017500000006444712007547376022157 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.StringUtil; import org.hsqldb.types.DTIType; import org.hsqldb.types.Types; /** * collection of static methods to convert Date and Timestamp strings * into corresponding Java objects and perform other Calendar related * operation.

* * Was reviewed for 1.7.2 resulting in centralising all DATETIME related * operstions.

* * From version 2.0.0, HSQLDB supports TIME ZONE with datetime types. The * values are stored internally as UTC seconds from 1970, regardless of the * time zone of the JVM, and converted as and when required, to the local * timezone. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.0 */ public class HsqlDateTime { /** * A reusable static value for today's date. Should only be accessed * by getToday() */ private static Locale defaultLocale = Locale.UK; private static long currentDateMillis; public static final Calendar tempCalDefault = new GregorianCalendar(); public static final Calendar tempCalGMT = new GregorianCalendar(TimeZone.getTimeZone("GMT"), defaultLocale); private static final Date tempDate = new Date(0); private static final String sdfdPattern = "yyyy-MM-dd"; static SimpleDateFormat sdfd = new SimpleDateFormat(sdfdPattern); private static final String sdftPattern = "HH:mm:ss"; static SimpleDateFormat sdft = new SimpleDateFormat(sdftPattern); private static final String sdftsPattern = "yyyy-MM-dd HH:mm:ss"; static SimpleDateFormat sdfts = new SimpleDateFormat(sdftsPattern); private static final String sdftsSysPattern = "yyyy-MM-dd HH:mm:ss.SSS"; static SimpleDateFormat sdftsSys = new SimpleDateFormat(sdftsSysPattern); static { tempCalGMT.setLenient(false); sdfd.setCalendar(new GregorianCalendar(TimeZone.getTimeZone("GMT"), defaultLocale)); sdfd.setLenient(false); sdft.setCalendar(new GregorianCalendar(TimeZone.getTimeZone("GMT"), defaultLocale)); sdft.setLenient(false); sdfts.setCalendar(new GregorianCalendar(TimeZone.getTimeZone("GMT"), defaultLocale)); sdfts.setLenient(false); } static { currentDateMillis = getNormalisedDate(System.currentTimeMillis()); } public static long getDateSeconds(String s) { try { synchronized (sdfd) { java.util.Date d = sdfd.parse(s); return d.getTime() / 1000; } } catch (Exception e) { throw Error.error(ErrorCode.X_22007); } } public static String getDateString(long seconds) { synchronized (sdfd) { sysDate.setTime(seconds * 1000); return sdfd.format(sysDate); } } public static long getTimestampSeconds(String s) { try { synchronized (sdfts) { java.util.Date d = sdfts.parse(s); return d.getTime() / 1000; } } catch (Exception e) { throw Error.error(ErrorCode.X_22007); } } public static void getTimestampString(StringBuffer sb, long seconds, int nanos, int scale) { synchronized (sdfts) { tempDate.setTime(seconds * 1000); sb.append(sdfts.format(tempDate)); if (scale > 0) { sb.append('.'); sb.append(StringUtil.toZeroPaddedString(nanos, 9, scale)); } } } public static String getTimestampString(long millis) { synchronized (sdfts) { sysDate.setTime(millis); return sdfts.format(sysDate); } } public static synchronized long getCurrentDateMillis(long millis) { if (millis - currentDateMillis >= 24 * 3600 * 1000) { currentDateMillis = getNormalisedDate(millis); } return currentDateMillis; } private static java.util.Date sysDate = new java.util.Date(); public static String getSystemTimeString() { synchronized (sdftsSys) { sysDate.setTime(System.currentTimeMillis()); return sdftsSys.format(sysDate); } } private static void resetToDate(Calendar cal) { cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); } private static void resetToTime(Calendar cal) { cal.set(Calendar.YEAR, 1970); cal.set(Calendar.MONTH, 0); cal.set(Calendar.DATE, 1); cal.set(Calendar.MILLISECOND, 0); } public static long convertMillisToCalendar(Calendar calendar, long millis) { calendar.clear(); synchronized (tempCalGMT) { synchronized (calendar) { tempCalGMT.setTimeInMillis(millis); calendar.set(tempCalGMT.get(Calendar.YEAR), tempCalGMT.get(Calendar.MONTH), tempCalGMT.get(Calendar.DAY_OF_MONTH), tempCalGMT.get(Calendar.HOUR_OF_DAY), tempCalGMT.get(Calendar.MINUTE), tempCalGMT.get(Calendar.SECOND)); return calendar.getTimeInMillis(); } } } public static long convertMillisFromCalendar(Calendar calendar, long millis) { synchronized (tempCalGMT) { synchronized (calendar) { tempCalGMT.clear(); calendar.setTimeInMillis(millis); tempCalGMT.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND)); return tempCalGMT.getTimeInMillis(); } } } /** * Sets the time in the given Calendar using the given milliseconds value; wrapper method to * allow use of more efficient JDK1.4 method on JDK1.4 (was protected in earlier versions). * * @param cal the Calendar * @param millis the time value in milliseconds */ public static void setTimeInMillis(Calendar cal, long millis) { //#ifdef JAVA4 // Use method directly cal.setTimeInMillis(millis); //#else /* // Have to go indirect synchronized (tempDate) { tempDate.setTime(millis); cal.setTime(tempDate); } */ //#endif JAVA4 } /** * Gets the time from the given Calendar as a milliseconds value; wrapper method to * allow use of more efficient JDK1.4 method on JDK1.4 (was protected in earlier versions). * * @param cal the Calendar * @return the time value in milliseconds */ public static long getTimeInMillis(Calendar cal) { //#ifdef JAVA4 // Use method directly return cal.getTimeInMillis(); //#else /* // Have to go indirect return cal.getTime().getTime(); */ //#endif JAVA4 } public static long convertToNormalisedTime(long t) { return convertToNormalisedTime(t, tempCalGMT); } public static long convertToNormalisedTime(long t, Calendar cal) { synchronized (cal) { setTimeInMillis(cal, t); resetToDate(cal); long t1 = getTimeInMillis(cal); return t - t1; } } public static long convertToNormalisedDate(long t, Calendar cal) { synchronized (cal) { setTimeInMillis(cal, t); resetToDate(cal); return getTimeInMillis(cal); } } public static long getNormalisedTime(long t) { Calendar cal = tempCalGMT; synchronized (cal) { setTimeInMillis(cal, t); resetToTime(cal); return getTimeInMillis(cal); } } public static long getNormalisedTime(Calendar cal, long t) { synchronized (cal) { setTimeInMillis(cal, t); resetToTime(cal); return getTimeInMillis(cal); } } public static long getNormalisedDate(long d) { synchronized (tempCalGMT) { setTimeInMillis(tempCalGMT, d); resetToDate(tempCalGMT); return getTimeInMillis(tempCalGMT); } } public static long getNormalisedDate(Calendar cal, long d) { synchronized (cal) { setTimeInMillis(cal, d); resetToDate(cal); return getTimeInMillis(cal); } } public static int getZoneSeconds(Calendar cal) { return (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) / 1000; } public static int getZoneMillis(Calendar cal, long millis) { //#ifdef JAVA4 // get zone for the specific date return cal.getTimeZone().getOffset(millis); //#else /* // get zone for the specific date setTimeInMillis(cal, millis); return (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET) ); */ //#endif JAVA4 } /** * Returns the indicated part of the given millisecond date object. * @param m the millisecond time value from which to extract the indicated part * @param part an integer code corresponding to the desired date part * @return the indicated part of the given java.util.Date object */ public static int getDateTimePart(long m, int part) { synchronized (tempCalGMT) { tempCalGMT.setTimeInMillis(m); return tempCalGMT.get(part); } } /** * truncates millisecond date object */ public static long getTruncatedPart(long m, int part) { synchronized (tempCalGMT) { tempCalGMT.setTimeInMillis(m); switch (part) { case DTIType.WEEK_OF_YEAR : { int year = tempCalGMT.get(Calendar.YEAR); int week = tempCalGMT.get(Calendar.WEEK_OF_YEAR); tempCalGMT.clear(); tempCalGMT.set(Calendar.YEAR, year); tempCalGMT.set(Calendar.WEEK_OF_YEAR, week); break; } default : { zeroFromPart(tempCalGMT, part); break; } } return tempCalGMT.getTimeInMillis(); } } /** * rounded millisecond date object */ public static long getRoundedPart(long m, int part) { synchronized (tempCalGMT) { tempCalGMT.setTimeInMillis(m); switch (part) { case Types.SQL_INTERVAL_YEAR : if (tempCalGMT.get(Calendar.MONTH) > 6) { tempCalGMT.add(Calendar.YEAR, 1); } break; case Types.SQL_INTERVAL_MONTH : if (tempCalGMT.get(Calendar.DAY_OF_MONTH) > 15) { tempCalGMT.add(Calendar.MONTH, 1); } break; case Types.SQL_INTERVAL_DAY : if (tempCalGMT.get(Calendar.HOUR_OF_DAY) > 11) { tempCalGMT.add(Calendar.DAY_OF_MONTH, 1); } break; case Types.SQL_INTERVAL_HOUR : if (tempCalGMT.get(Calendar.MINUTE) > 29) { tempCalGMT.add(Calendar.HOUR_OF_DAY, 1); } break; case Types.SQL_INTERVAL_MINUTE : if (tempCalGMT.get(Calendar.SECOND) > 29) { tempCalGMT.add(Calendar.MINUTE, 1); } break; case Types.SQL_INTERVAL_SECOND : if (tempCalGMT.get(Calendar.MILLISECOND) > 499) { tempCalGMT.add(Calendar.SECOND, 1); } break; case DTIType.WEEK_OF_YEAR : { int year = tempCalGMT.get(Calendar.YEAR); int week = tempCalGMT.get(Calendar.WEEK_OF_YEAR); int day = tempCalGMT.get(Calendar.DAY_OF_WEEK); if (day > 3) { week++; } tempCalGMT.clear(); tempCalGMT.set(Calendar.YEAR, year); tempCalGMT.set(Calendar.WEEK_OF_YEAR, week); return tempCalGMT.getTimeInMillis(); } } zeroFromPart(tempCalGMT, part); return tempCalGMT.getTimeInMillis(); } } static void zeroFromPart(Calendar cal, int part) { switch (part) { case Types.SQL_INTERVAL_YEAR : cal.set(Calendar.MONTH, 0); case Types.SQL_INTERVAL_MONTH : cal.set(Calendar.DAY_OF_MONTH, 1); case Types.SQL_INTERVAL_DAY : cal.set(Calendar.HOUR_OF_DAY, 0); case Types.SQL_INTERVAL_HOUR : cal.set(Calendar.MINUTE, 0); case Types.SQL_INTERVAL_MINUTE : cal.set(Calendar.SECOND, 0); case Types.SQL_INTERVAL_SECOND : cal.set(Calendar.MILLISECOND, 0); } } //J- private static final char[][] dateTokens = { { 'R', 'R', 'R', 'R' }, { 'I', 'Y', 'Y', 'Y' }, { 'Y', 'Y', 'Y', 'Y' }, { 'I', 'Y' }, { 'Y', 'Y' }, { 'B', 'C' }, { 'B', '.', 'C', '.' }, { 'A', 'D' }, { 'A', '.', 'D', '.' }, { 'M', 'O', 'N' }, { 'M', 'O', 'N', 'T', 'H' }, { 'M', 'M' }, { 'D', 'A', 'Y' }, { 'D', 'Y' }, { 'W', 'W' }, { 'I', 'W' }, { 'D', 'D' }, { 'D', 'D', 'D' }, { 'W' }, { 'H', 'H', '2', '4' }, { 'H', 'H', '1', '2' }, { 'H', 'H' }, { 'M', 'I' }, { 'S', 'S' }, { 'A', 'M' }, { 'P', 'M' }, { 'A', '.', 'M', '.' }, { 'P', '.', 'M', '.' }, { 'F', 'F' } }; private static final String[] javaDateTokens = { "yyyy", "'*IYYY'", "yyyy", "'*IY'", "yy", "G", "G", "G", "G", "MMM", "MMMMM", "MM", "EEEE", "EE", "'*WW'", "w", "dd", "D", "'*W'", "HH", "KK", "KK", "mm", "ss", "aaa", "aaa", "aaa", "aaa", "S" }; private static final int[] sqlIntervalCodes = { -1, -1, Types.SQL_INTERVAL_YEAR, -1, Types.SQL_INTERVAL_YEAR, -1, -1, -1, -1, Types.SQL_INTERVAL_MONTH, Types.SQL_INTERVAL_MONTH, Types.SQL_INTERVAL_MONTH, -1, -1, DTIType.WEEK_OF_YEAR, -1, Types.SQL_INTERVAL_DAY, Types.SQL_INTERVAL_DAY, -1, Types.SQL_INTERVAL_HOUR, -1, Types.SQL_INTERVAL_HOUR, Types.SQL_INTERVAL_MINUTE, Types.SQL_INTERVAL_SECOND, -1,-1,-1,-1, -1 }; //J+ /** Indicates end-of-input */ private static final char e = 0xffff; public static Date toDate(String string, String pattern, SimpleDateFormat format) { Date date; String javaPattern = HsqlDateTime.toJavaDatePattern(pattern); int matchIndex = javaPattern.indexOf("*IY"); if (matchIndex >= 0) { throw Error.error(ErrorCode.X_22511); } matchIndex = javaPattern.indexOf("*WW"); if (matchIndex >= 0) { throw Error.error(ErrorCode.X_22511); } matchIndex = javaPattern.indexOf("*W"); if (matchIndex >= 0) { throw Error.error(ErrorCode.X_22511); } try { format.applyPattern(javaPattern); date = format.parse(string); } catch (Exception e) { throw Error.error(ErrorCode.X_22007, e.toString()); } return date; } public static String toFormattedDate(Date date, String pattern, SimpleDateFormat format) { String javaPattern = HsqlDateTime.toJavaDatePattern(pattern); try { format.applyPattern(javaPattern); } catch (Exception e) { throw Error.error(ErrorCode.X_22511); } String result = format.format(date); int matchIndex = result.indexOf("*IY"); if (matchIndex >= 0) { Calendar cal = format.getCalendar(); int matchLength = 3; int temp = result.indexOf("*IYYY"); if (temp >= 0) { matchLength = 5; matchIndex = temp; } int year = cal.get(Calendar.YEAR); int weekOfYear = cal.get(Calendar.WEEK_OF_YEAR); if (weekOfYear == 1 && cal.get(Calendar.DAY_OF_YEAR) > 360) { year++; } String yearString = String.valueOf(year); if (matchLength == 3) { yearString = yearString.substring(yearString.length() - 2); } StringBuilder sb = new StringBuilder(result); sb.replace(matchIndex, matchIndex + matchLength, yearString); result = sb.toString(); } matchIndex = result.indexOf("*WW"); if (matchIndex >= 0) { Calendar cal = format.getCalendar(); int matchLength = 3; int dayOfYear = cal.get(Calendar.DAY_OF_YEAR); int weekOfYear = ((dayOfYear - 1) / 7) + 1; StringBuilder sb = new StringBuilder(result); sb.replace(matchIndex, matchIndex + matchLength, String.valueOf(weekOfYear)); result = sb.toString(); } matchIndex = result.indexOf("*W"); if (matchIndex >= 0) { Calendar cal = format.getCalendar(); int matchLength = 2; int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH); int weekOfMonth = ((dayOfMonth - 1) / 7) + 1; StringBuilder sb = new StringBuilder(result); sb.replace(matchIndex, matchIndex + matchLength, String.valueOf(weekOfMonth)); result = sb.toString(); } return result; } /** * Converts the given format into a pattern accepted by java.text.SimpleDataFormat * * @param format */ public static String toJavaDatePattern(String format) { int len = format.length(); char ch; StringBuffer sb = new StringBuffer(len); Tokenizer tokenizer = new Tokenizer(); for (int i = 0; i <= len; i++) { ch = (i == len) ? e : format.charAt(i); if (tokenizer.isInQuotes()) { if (tokenizer.isQuoteChar(ch)) { ch = '\''; } else if (ch == '\'') { // double the single quote sb.append(ch); } sb.append(ch); continue; } if (!tokenizer.next(ch, i)) { if (tokenizer.consumed) { int index = tokenizer.getLastMatch(); sb.append(javaDateTokens[index]); i = tokenizer.matchOffset; } else { if (tokenizer.isQuoteChar(ch)) { ch = '\''; sb.append(ch); } else if (tokenizer.isLiteral(ch)) { sb.append(ch); } else if (ch == e) { // } else { throw Error.error(ErrorCode.X_22007, format.substring(i)); } } tokenizer.reset(); } } if (tokenizer.isInQuotes()) { throw Error.error(ErrorCode.X_22007); } String javaPattern = sb.toString(); return javaPattern; } public static int toStandardIntervalPart(String format) { int len = format.length(); char ch; Tokenizer tokenizer = new Tokenizer(); for (int i = 0; i <= len; i++) { ch = (i == len) ? e : format.charAt(i); if (!tokenizer.next(ch, i)) { int index = tokenizer.getLastMatch(); if (index >= 0) { return sqlIntervalCodes[index]; } return -1; } } return -1; } /** * This class can match 64 tokens at maximum. */ static class Tokenizer { private int lastMatched; private int matchOffset; private int offset; private long state; private boolean consumed; private boolean isInQuotes; private boolean matched; // private final char quoteChar; private final char[] literalChars; private static char[] defaultLiterals = new char[] { ' ', ',', '-', '.', '/', ':', ';' }; char[][] tokens; public Tokenizer() { this.quoteChar = '\"'; this.literalChars = defaultLiterals; tokens = dateTokens; reset(); } /** * Resets for next reuse. * */ public void reset() { lastMatched = -1; offset = -1; state = 0; consumed = false; matched = false; } /** * Returns the length of a token to match. */ public int length() { return offset; } /** * Returns an index of the last matched token. */ public int getLastMatch() { return lastMatched; } /** * Indicates whether the last character has been consumed by the matcher. */ public boolean isConsumed() { return consumed; } /** * Indicates whether the last character has been consumed by the matcher. */ public boolean wasMatched() { return matched; } /** * Indicates if tokenizing a quoted string */ public boolean isInQuotes() { return isInQuotes; } /** * returns true if character is the quote char and sets state */ public boolean isQuoteChar(char ch) { if (quoteChar == ch) { isInQuotes = !isInQuotes; return true; } return false; } /** * Returns true if ch is in the list of literals */ public boolean isLiteral(char ch) { return ArrayUtil.isInSortedArray(ch, literalChars); } /** * Checks whether the specified bit is not set. * * @param bit */ private boolean isZeroBit(int bit) { return (state & (1L << bit)) == 0; } /** * Sets the specified bit. * @param bit */ private void setBit(int bit) { state |= (1L << bit); } /** * Matches the specified character against tokens. * * @param ch * @param tokens */ public boolean next(char ch, int position) { int index = ++offset; int len = offset + 1; int left = 0; matched = false; for (int i = tokens.length; --i >= 0; ) { if (isZeroBit(i)) { if (tokens[i][index] == ch) { if (tokens[i].length == len) { setBit(i); lastMatched = i; consumed = true; matched = true; matchOffset = position; } else { ++left; } } else { setBit(i); } } } return left > 0; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementManager.java0000644000175000017500000003027512007547362023055 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.lib.IntKeyHashMap; import org.hsqldb.lib.LongKeyHashMap; import org.hsqldb.lib.LongKeyIntValueHashMap; import org.hsqldb.lib.LongValueHashMap; import org.hsqldb.result.Result; /** * This class manages the reuse of Statement objects for prepared * statements for a Session instance.

* * A compiled statement is registered by a session to be managed. Once * registered, it is linked with one or more sessions.

* * The sql statement text distinguishes different compiled statements and acts * as lookup key when a session initially looks for an existing instance of * the compiled sql statement.

* * Once a session is linked with a statement, it uses the uniqe compiled * statement id for the sql statement to access the statement.

* * Changes to database structure via DDL statements, will result in all * registered Statement objects to become invalidated. This is done by * comparing the schema change and compile timestamps. When a session * subsequently attempts to use an invalidated Statement via its id, it will * reinstantiate the Statement using its sql statement still held by this class.

* * This class keeps count of the number of time each registered compiled * statement is linked to a session. It unregisters a compiled statement when * no session remains linked to it.

* * Modified by fredt@users from the original by boucherb@users to simplify, * support multiple identical prepared statements per session, and avoid * memory leaks. Modified further to support schemas. Changed implementation * in 1.9 as a session object

* * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * * @version 2.2.6 * @since 1.7.2 */ public final class StatementManager { /** * The Database for which this object is managing * CompiledStatement objects. */ private Database database; /** Map: Schema id (int) => {Map: SQL String => Compiled Statement id (long)} */ private IntKeyHashMap schemaMap; /** Map: Compiled statment id (int) => CompiledStatement object. */ private LongKeyHashMap csidMap; /** Map: Compiled statment id (int) => number of uses of the statement */ private LongKeyIntValueHashMap useMap; /** * Monotonically increasing counter used to assign unique ids to compiled * statements. */ private long next_cs_id; /** * Constructs a new instance of CompiledStatementManager. * * @param database the Database instance for which this object is to * manage compiled statement objects. */ StatementManager(Database database) { this.database = database; schemaMap = new IntKeyHashMap(); csidMap = new LongKeyHashMap(); useMap = new LongKeyIntValueHashMap(); next_cs_id = 0; } /** * Clears all internal data structures, removing any references to compiled statements. */ synchronized void reset() { schemaMap.clear(); csidMap.clear(); useMap.clear(); next_cs_id = 0; } /** * Retrieves the next compiled statement identifier in the sequence. * * @return the next compiled statement identifier in the sequence. */ private long nextID() { next_cs_id++; return next_cs_id; } /** * Retrieves the registered compiled statement identifier associated with * the specified SQL String, or a value less than zero, if no such * statement has been registered. * * @param schema the schema id * @param sql the SQL String * @return the compiled statement identifier associated with the * specified SQL String */ private long getStatementID(HsqlName schema, String sql) { LongValueHashMap sqlMap = (LongValueHashMap) schemaMap.get(schema.hashCode()); if (sqlMap == null) { return -1; } return sqlMap.get(sql, -1); } /** * Returns an existing CompiledStatement object with the given * statement identifier. Returns null if the CompiledStatement object * has been invalidated and cannot be recompiled * * @param session the session * @param csid the identifier of the requested CompiledStatement object * @return the requested CompiledStatement object */ public synchronized Statement getStatement(Session session, long csid) { Statement cs = (Statement) csidMap.get(csid); if (cs == null) { return null; } if (cs.getCompileTimestamp() < database.schemaManager.getSchemaChangeTimestamp()) { cs = recompileStatement(session, cs); if (cs == null) { freeStatement(csid); return null; } csidMap.put(csid, cs); } return cs; } /** * Recompiles a statement */ public synchronized Statement getStatement(Session session, Statement statement) { long csid = statement.getID(); Statement cs = (Statement) csidMap.get(csid); if (cs != null) { return getStatement(session, csid); } if (statement.getCompileTimestamp() < database.schemaManager.getSchemaChangeTimestamp()) { cs = recompileStatement(session, statement); if (cs == null) { freeStatement(csid); return null; } } return cs; } private Statement recompileStatement(Session session, Statement cs) { HsqlName oldSchema = session.getCurrentSchemaHsqlName(); Statement newStatement; // revalidate with the original schema try { HsqlName schema = cs.getSchemaName(); int props = cs.getCursorPropertiesRequest(); if (schema != null) { // checks the old schema exists session.setSchema(schema.name); } boolean setGenerated = cs.generatedResultMetaData() != null; newStatement = session.compileStatement(cs.getSQL(), props); newStatement.setCursorPropertiesRequest(props); if (!cs.getResultMetaData().areTypesCompatible( newStatement.getResultMetaData())) { return null; } if (!cs.getParametersMetaData().areTypesCompatible( newStatement.getParametersMetaData())) { return null; } newStatement.setCompileTimestamp( database.txManager.getGlobalChangeTimestamp()); if (setGenerated) { StatementDML si = (StatementDML) cs; newStatement.setGeneratedColumnInfo(si.generatedType, si.generatedInputMetaData); } } catch (Throwable t) { return null; } finally { session.setCurrentSchemaHsqlName(oldSchema); } return newStatement; } /** * Registers a compiled statement to be managed. * * The only caller should be a Session that is attempting to prepare * a statement for the first time or process a statement that has been * invalidated due to DDL changes. * * @param csid existing id or negative if the statement is not yet managed * @param cs The CompiledStatement to add * @return The compiled statement id assigned to the CompiledStatement * object */ private long registerStatement(long csid, Statement cs) { if (csid < 0) { csid = nextID(); int schemaid = cs.getSchemaName().hashCode(); LongValueHashMap sqlMap = (LongValueHashMap) schemaMap.get(schemaid); if (sqlMap == null) { sqlMap = new LongValueHashMap(); schemaMap.put(schemaid, sqlMap); } sqlMap.put(cs.getSQL(), csid); } cs.setID(csid); cs.setCompileTimestamp(database.txManager.getGlobalChangeTimestamp()); csidMap.put(csid, cs); return csid; } /** * Removes one (or all) of the links between a session and a compiled * statement. If the statement is not linked with any other session, it is * removed from management. * * @param csid the compiled statment identifier * @param sessionID the session identifier * @param freeAll if true, remove all links to the session */ synchronized void freeStatement(long csid) { if (csid == -1) { // statement was never added return; } int useCount = useMap.get(csid, 1); if (useCount > 1) { useMap.put(csid, useCount - 1); return; } Statement cs = (Statement) csidMap.remove(csid); if (cs != null) { int schemaid = cs.getSchemaName().hashCode(); LongValueHashMap sqlMap = (LongValueHashMap) schemaMap.get(schemaid); String sql = (String) cs.getSQL(); sqlMap.remove(sql); } useMap.remove(csid); } /** * Compiles an SQL statement and returns a CompiledStatement Object * * @param session the session * @throws Throwable * @return CompiledStatement */ synchronized Statement compile(Session session, Result cmd) throws Throwable { int props = cmd.getExecuteProperties(); Statement cs = null; String sql = cmd.getMainString(); long csid = getStatementID(session.currentSchema, sql); if (csid >= 0) { cs = (Statement) csidMap.get(csid); if (cs != null) { if (cs.getCursorPropertiesRequest() != props) { cs = null; csid = -1; } // generated result props still overwrite earlier version } } if (cs == null || !cs.isValid() || cs.getCompileTimestamp() < database.schemaManager.getSchemaChangeTimestamp()) { cs = session.compileStatement(sql, props); cs.setCursorPropertiesRequest(props); csid = registerStatement(csid, cs); } int useCount = useMap.get(csid, 0) + 1; useMap.put(csid, useCount); cs.setGeneratedColumnInfo(cmd.getGeneratedResultType(), cmd.getGeneratedResultMetaData()); return cs; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementResultUpdate.java0000644000175000017500000001717312007547412024122 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.navigator.RowSetNavigatorData; import org.hsqldb.navigator.RowSetNavigatorDataChange; import org.hsqldb.persist.PersistentStore; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.types.Type; /** * Implementation of Statement for updating result rows.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public class StatementResultUpdate extends StatementDML { int actionType; Type[] types; Result result; StatementResultUpdate() { super(); writeTableNames = new HsqlName[1]; setCompileTimestamp(Long.MAX_VALUE); } public String describe(Session session) { return ""; } public Result execute(Session session) { Result result; try { result = getResult(session); clearStructures(session); } catch (Throwable t) { clearStructures(session); result = Result.newErrorResult(t, null); } return result; } Result getResult(Session session) { checkAccessRights(session); Object[] args = session.sessionContext.dynamicArguments; Row row; PersistentStore store = baseTable.getRowStore(session); switch (actionType) { case ResultConstants.UPDATE_CURSOR : { row = getRow(session, args); /** * @todo - in 2PL mode isDeleted() always returns false. * While write lock prevents delete by other transactions, * same-transaction deletes are not caught */ if (row == null || row.isDeleted(session, store)) { throw Error.error(ErrorCode.X_24521); } RowSetNavigatorDataChange list = session.sessionContext.getRowSetDataChange(); Object[] data = (Object[]) ArrayUtil.duplicateArray(row.getData()); boolean[] columnCheck = baseTable.getNewColumnCheckList(); for (int i = 0; i < baseColumnMap.length; i++) { if (types[i] == Type.SQL_ALL_TYPES) { continue; } data[baseColumnMap[i]] = args[i]; columnCheck[baseColumnMap[i]] = true; } int[] colMap = ArrayUtil.booleanArrayToIntIndexes(columnCheck); list.addRow(session, row, data, baseTable.getColumnTypes(), colMap); list.endMainDataSet(); update(session, baseTable, list, null); break; } case ResultConstants.DELETE_CURSOR : { row = getRow(session, args); if (row == null || row.isDeleted(session, store)) { throw Error.error(ErrorCode.X_24521); } RowSetNavigatorDataChange list = session.sessionContext.getRowSetDataChange(); list.addRow(row); list.endMainDataSet(); delete(session, baseTable, list); break; } case ResultConstants.INSERT_CURSOR : { Object[] data = baseTable.getNewRowData(session); for (int i = 0; i < data.length; i++) { data[baseColumnMap[i]] = args[i]; } return insertSingleRow(session, store, data); } } return Result.updateOneResult; } Row getRow(Session session, Object[] args) { int rowIdIndex = result.metaData.getColumnCount(); Long rowId = (Long) args[rowIdIndex]; PersistentStore store = baseTable.getRowStore(session); Row row = null; if (rowIdIndex + 2 == result.metaData.getExtendedColumnCount()) { Object[] data = ((RowSetNavigatorData) result.getNavigator()).getData( rowId.longValue()); if (data != null) { row = (Row) data[rowIdIndex + 1]; } } else { int id = (int) rowId.longValue(); row = (Row) store.get(id, false); } this.result = null; return row; } void setRowActionProperties(Result result, int action, Table table, Type[] types, int[] columnMap) { this.result = result; this.actionType = action; this.baseTable = table; this.types = types; this.baseColumnMap = columnMap; this.writeTableNames[0] = table.getName(); } void checkAccessRights(Session session) { switch (type) { case StatementTypes.CALL : { break; } case StatementTypes.INSERT : { session.getGrantee().checkInsert(targetTable, insertCheckColumns); break; } case StatementTypes.SELECT_CURSOR : break; case StatementTypes.DELETE_WHERE : { session.getGrantee().checkDelete(targetTable); break; } case StatementTypes.UPDATE_WHERE : { session.getGrantee().checkUpdate(targetTable, updateCheckColumns); break; } case StatementTypes.MERGE : { session.getGrantee().checkInsert(targetTable, insertCheckColumns); session.getGrantee().checkUpdate(targetTable, updateCheckColumns); break; } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/OpTypes.java0000644000175000017500000001146512007547362021221 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; public interface OpTypes { int NONE = 0, VALUE = 1, // constant value COLUMN = 2, // references COALESCE = 3, DEFAULT = 4, SIMPLE_COLUMN = 5, VARIABLE = 6, PARAMETER = 7, DYNAMIC_PARAM = 8, TRANSITION_VARIABLE = 9, DIAGNOSTICS_VARIABLE = 10, ASTERISK = 11, SEQUENCE = 12, SEQUENCE_CURRENT = 13, ROWNUM = 14, ARRAY = 19, MULTISET = 20, SCALAR_SUBQUERY = 21, // query based row or table ROW_SUBQUERY = 22, TABLE_SUBQUERY = 23, RECURSIVE_SUBQUERY = 24, ROW = 25, // rows VALUELIST = 26, FUNCTION = 27, SQL_FUNCTION = 28, ROUTINE_FUNCTION = 29, TABLE = 30, NEGATE = 31, // arithmetic operations ADD = 32, SUBTRACT = 33, MULTIPLY = 34, DIVIDE = 35, CONCAT = 36, // concatenation LIKE_ARG = 37, CASEWHEN_COALESCE = 38, EQUAL = 41, // logical - comparison GREATER_EQUAL = 42, GREATER = 43, SMALLER = 44, SMALLER_EQUAL = 45, NOT_EQUAL = 46, IS_NULL = 47, NOT = 48, // logical operations AND = 49, OR = 50, ALL_QUANTIFIED = 51, // logical - quantified comparison ANY_QUANTIFIED = 52, LIKE = 53, // logical - predicates IN = 54, EXISTS = 55, OVERLAPS = 56, UNIQUE = 57, NOT_DISTINCT = 58, MATCH_SIMPLE = 59, MATCH_PARTIAL = 60, MATCH_FULL = 61, MATCH_UNIQUE_SIMPLE = 62, MATCH_UNIQUE_PARTIAL = 63, MATCH_UNIQUE_FULL = 64, CONTAINS = 65, COUNT = 71, // aggregate functions SUM = 72, MIN = 73, MAX = 74, AVG = 75, EVERY = 76, SOME = 77, STDDEV_POP = 78, STDDEV_SAMP = 79, VAR_POP = 80, VAR_SAMP = 81, ARRAY_AGG = 82, GROUP_CONCAT = 83, PREFIX = 84, MEDIAN = 85, CAST = 91, // other operations ZONE_MODIFIER = 92, CASEWHEN = 93, ORDER_BY = 94, LIMIT = 95, ALTERNATIVE = 96, MULTICOLUMN = 97, USER_AGGREGATE = 98, ARRAY_ACCESS = 99, ARRAY_SUBQUERY = 100 ; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Constraint.java0000644000175000017500000007606412007547360021746 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.RangeVariable.RangeIteratorBase; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.navigator.RowIterator; import org.hsqldb.persist.PersistentStore; import org.hsqldb.result.Result; import org.hsqldb.rights.Grantee; import org.hsqldb.types.Type; /** * Implementation of a table constraint with references to the indexes used * by the constraint.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.6.0 */ public final class Constraint implements SchemaObject { ConstraintCore core; private HsqlName name; int constType; boolean isForward; // Expression check; private boolean isNotNull; int notNullColumnIndex; RangeVariable rangeVariable; // for temp constraints only OrderedHashSet mainColSet; OrderedHashSet refColSet; // public static final Constraint[] emptyArray = new Constraint[]{}; private Constraint() {} /** * Constructor declaration for PK and UNIQUE */ public Constraint(HsqlName name, Table t, Index index, int type) { this.name = name; constType = type; core = new ConstraintCore(); core.mainTable = t; core.mainIndex = index; core.mainCols = index.getColumns(); for (int i = 0; i < core.mainCols.length; i++) { Type dataType = t.getColumn(core.mainCols[i]).getDataType(); if (dataType.isLobType()) { throw Error.error(ErrorCode.X_42534); } } } public Constraint(HsqlName name, Table table, int[] cols, int type) { this.name = name; constType = type; core = new ConstraintCore(); core.mainTable = table; core.mainCols = cols; } /** * Constructor for main constraints (foreign key references in PK table) */ public Constraint(HsqlName name, Constraint fkconstraint) { this.name = name; constType = SchemaObject.ConstraintTypes.MAIN; core = fkconstraint.core; } /** * General constructor for foreign key constraints. * * @param name name of constraint * @param refCols list of referencing columns * @param mainTableName referenced table * @param mainCols list of referenced columns * @param type constraint type * @param deleteAction triggered action on delete * @param updateAction triggered action on update * */ public Constraint(HsqlName name, HsqlName refTableName, OrderedHashSet refCols, HsqlName mainTableName, OrderedHashSet mainCols, int type, int deleteAction, int updateAction, int matchType) { this.name = name; constType = type; mainColSet = mainCols; refColSet = refCols; core = new ConstraintCore(); core.refTableName = refTableName; core.mainTableName = mainTableName; core.deleteAction = deleteAction; core.updateAction = updateAction; core.matchType = matchType; switch (core.deleteAction) { case SchemaObject.ReferentialAction.CASCADE : case SchemaObject.ReferentialAction.SET_DEFAULT : case SchemaObject.ReferentialAction.SET_NULL : core.hasDeleteAction = true; } switch (core.updateAction) { case SchemaObject.ReferentialAction.CASCADE : case SchemaObject.ReferentialAction.SET_DEFAULT : case SchemaObject.ReferentialAction.SET_NULL : core.hasUpdateAction = true; } } public Constraint(HsqlName name, OrderedHashSet mainCols, int type) { this.name = name; constType = type; mainColSet = mainCols; core = new ConstraintCore(); } public Constraint(HsqlName uniqueName, HsqlName mainName, HsqlName refName, Table mainTable, Table refTable, int[] mainCols, int[] refCols, Index mainIndex, Index refIndex, int deleteAction, int updateAction) throws HsqlException { this.name = refName; constType = SchemaObject.ConstraintTypes.FOREIGN_KEY; core = new ConstraintCore(); core.uniqueName = uniqueName; core.mainName = mainName; core.refName = refName; core.mainTable = mainTable; core.refTable = refTable; core.mainCols = mainCols; core.refCols = refCols; core.mainIndex = mainIndex; core.refIndex = refIndex; core.deleteAction = deleteAction; core.updateAction = updateAction; } Constraint duplicate() { Constraint copy = new Constraint(); copy.core = core.duplicate(); copy.name = name; copy.constType = constType; copy.isForward = isForward; // copy.check = check; copy.isNotNull = isNotNull; copy.notNullColumnIndex = notNullColumnIndex; copy.rangeVariable = rangeVariable; return copy; } void setColumnsIndexes(Table table) { if (constType == SchemaObject.ConstraintTypes.FOREIGN_KEY) { if (mainColSet == null) { core.mainCols = core.mainTable.getPrimaryKey(); if (core.mainCols == null) { throw Error.error(ErrorCode.X_42581); } } else if (core.mainCols == null) { core.mainCols = core.mainTable.getColumnIndexes(mainColSet); } if (core.refCols == null) { core.refCols = table.getColumnIndexes(refColSet); } for (int i = 0; i < core.refCols.length; i++) { Type dataType = table.getColumn(core.refCols[i]).getDataType(); if (dataType.isLobType()) { throw Error.error(ErrorCode.X_42534); } } } else if (mainColSet != null) { core.mainCols = table.getColumnIndexes(mainColSet); for (int i = 0; i < core.mainCols.length; i++) { Type dataType = table.getColumn(core.mainCols[i]).getDataType(); if (dataType.isLobType()) { throw Error.error(ErrorCode.X_42534); } } } } public int getType() { return SchemaObject.CONSTRAINT; } /** * Returns the HsqlName. */ public HsqlName getName() { return name; } public HsqlName getCatalogName() { return name.schema.schema; } public HsqlName getSchemaName() { return name.schema; } public Grantee getOwner() { return name.schema.owner; } public OrderedHashSet getReferences() { switch (constType) { case SchemaObject.ConstraintTypes.CHECK : OrderedHashSet refs = new OrderedHashSet(); check.collectObjectNames(refs); for (int j = refs.size() - 1; j >= 0; j--) { HsqlName name = (HsqlName) refs.get(j); if (name.type == SchemaObject.COLUMN || name.type == SchemaObject.TABLE) { refs.remove(j); } } return refs; case SchemaObject.ConstraintTypes.FOREIGN_KEY : OrderedHashSet set = new OrderedHashSet(); set.add(core.uniqueName); return set; } return new OrderedHashSet(); } public OrderedHashSet getComponents() { return null; } public void compile(Session session, SchemaObject parentObject) {} public String getSQL() { StringBuffer sb = new StringBuffer(); switch (getConstraintType()) { case SchemaObject.ConstraintTypes.PRIMARY_KEY : if (getMainColumns().length > 1 || (getMainColumns().length == 1 && !getName().isReservedName())) { if (!getName().isReservedName()) { sb.append(Tokens.T_CONSTRAINT).append(' '); sb.append(getName().statementName).append(' '); } sb.append(Tokens.T_PRIMARY).append(' ').append( Tokens.T_KEY); sb.append( getMain().getColumnListSQL( getMainColumns(), getMainColumns().length)); } break; case SchemaObject.ConstraintTypes.UNIQUE : if (!getName().isReservedName()) { sb.append(Tokens.T_CONSTRAINT).append(' '); sb.append(getName().statementName); sb.append(' '); } sb.append(Tokens.T_UNIQUE); int[] col = getMainColumns(); sb.append(getMain().getColumnListSQL(col, col.length)); break; case SchemaObject.ConstraintTypes.FOREIGN_KEY : if (isForward) { sb.append(Tokens.T_ALTER).append(' ').append( Tokens.T_TABLE).append(' '); sb.append( getRef().getName().getSchemaQualifiedStatementName()); sb.append(' ').append(Tokens.T_ADD).append(' '); getFKStatement(sb); } else { getFKStatement(sb); } break; case SchemaObject.ConstraintTypes.CHECK : if (isNotNull()) { break; } if (!getName().isReservedName()) { sb.append(Tokens.T_CONSTRAINT).append(' '); sb.append(getName().statementName).append(' '); } sb.append(Tokens.T_CHECK).append('('); sb.append(check.getSQL()); sb.append(')'); // should not throw as it is already tested OK break; } return sb.toString(); } public long getChangeTimestamp() { return 0; } /** * Generates the foreign key declaration for a given Constraint object. */ private void getFKStatement(StringBuffer sb) { if (!getName().isReservedName()) { sb.append(Tokens.T_CONSTRAINT).append(' '); sb.append(getName().statementName); sb.append(' '); } sb.append(Tokens.T_FOREIGN).append(' ').append(Tokens.T_KEY); int[] col = getRefColumns(); sb.append(getRef().getColumnListSQL(col, col.length)); sb.append(' ').append(Tokens.T_REFERENCES).append(' '); sb.append(getMain().getName().getSchemaQualifiedStatementName()); col = getMainColumns(); sb.append(getMain().getColumnListSQL(col, col.length)); if (getDeleteAction() != SchemaObject.ReferentialAction.NO_ACTION) { sb.append(' ').append(Tokens.T_ON).append(' ').append( Tokens.T_DELETE).append(' '); sb.append(getDeleteActionString()); } if (getUpdateAction() != SchemaObject.ReferentialAction.NO_ACTION) { sb.append(' ').append(Tokens.T_ON).append(' ').append( Tokens.T_UPDATE).append(' '); sb.append(getUpdateActionString()); } } public HsqlName getMainTableName() { return core.mainTableName; } public HsqlName getMainName() { return core.mainName; } public HsqlName getRefName() { return core.refName; } public HsqlName getUniqueName() { return core.uniqueName; } /** * Returns the type of constraint */ public int getConstraintType() { return constType; } /** * Returns the main table */ public Table getMain() { return core.mainTable; } /** * Returns the main index */ Index getMainIndex() { return core.mainIndex; } /** * Returns the reference table */ public Table getRef() { return core.refTable; } /** * Returns the reference index */ Index getRefIndex() { return core.refIndex; } /** * Returns the foreign key action rule. */ private static String getActionString(int action) { switch (action) { case SchemaObject.ReferentialAction.RESTRICT : return Tokens.T_RESTRICT; case SchemaObject.ReferentialAction.CASCADE : return Tokens.T_CASCADE; case SchemaObject.ReferentialAction.SET_DEFAULT : return Tokens.T_SET + ' ' + Tokens.T_DEFAULT; case SchemaObject.ReferentialAction.SET_NULL : return Tokens.T_SET + ' ' + Tokens.T_NULL; default : return Tokens.T_NO + ' ' + Tokens.T_ACTION; } } /** * The ON DELETE triggered action of (foreign key) constraint */ public int getDeleteAction() { return core.deleteAction; } public String getDeleteActionString() { return getActionString(core.deleteAction); } /** * The ON UPDATE triggered action of (foreign key) constraint */ public int getUpdateAction() { return core.updateAction; } public String getUpdateActionString() { return getActionString(core.updateAction); } public boolean hasTriggeredAction() { if (constType == SchemaObject.ConstraintTypes.FOREIGN_KEY) { switch (core.deleteAction) { case SchemaObject.ReferentialAction.CASCADE : case SchemaObject.ReferentialAction.SET_DEFAULT : case SchemaObject.ReferentialAction.SET_NULL : return true; } switch (core.updateAction) { case SchemaObject.ReferentialAction.CASCADE : case SchemaObject.ReferentialAction.SET_DEFAULT : case SchemaObject.ReferentialAction.SET_NULL : return true; } } return false; } public int getDeferability() { return SchemaObject.Deferable.NOT_DEFERRABLE; } /** * Returns the main table column index array */ public int[] getMainColumns() { return core.mainCols; } /** * Returns the reference table column index array */ public int[] getRefColumns() { return core.refCols; } /** * Returns the SQL for the expression in CHECK clause */ public String getCheckSQL() { return check.getSQL(); } /** * Returns true if the expression in CHECK is a simple IS NOT NULL */ public boolean isNotNull() { return isNotNull; } boolean hasColumnOnly(int colIndex) { switch (constType) { case SchemaObject.ConstraintTypes.CHECK : return rangeVariable.usedColumns[colIndex] && ArrayUtil .countTrueElements(rangeVariable.usedColumns) == 1; case SchemaObject.ConstraintTypes.PRIMARY_KEY : case SchemaObject.ConstraintTypes.UNIQUE : return core.mainCols.length == 1 && core.mainCols[0] == colIndex; case SchemaObject.ConstraintTypes.MAIN : return core.mainCols.length == 1 && core.mainCols[0] == colIndex && core.mainTable == core.refTable; case SchemaObject.ConstraintTypes.FOREIGN_KEY : return core.refCols.length == 1 && core.refCols[0] == colIndex && core.mainTable == core.refTable; default : throw Error.runtimeError(ErrorCode.U_S0500, "Constraint"); } } boolean hasColumnPlus(int colIndex) { switch (constType) { case SchemaObject.ConstraintTypes.CHECK : return rangeVariable.usedColumns[colIndex] && ArrayUtil .countTrueElements(rangeVariable.usedColumns) > 1; case SchemaObject.ConstraintTypes.PRIMARY_KEY : case SchemaObject.ConstraintTypes.UNIQUE : return core.mainCols.length != 1 && ArrayUtil.find(core.mainCols, colIndex) != -1; case SchemaObject.ConstraintTypes.MAIN : return ArrayUtil.find(core.mainCols, colIndex) != -1 && (core.mainCols.length != 1 || core.mainTable != core.refTable); case SchemaObject.ConstraintTypes.FOREIGN_KEY : return ArrayUtil.find(core.refCols, colIndex) != -1 && (core.mainCols.length != 1 || core.mainTable != core.refTable); default : throw Error.runtimeError(ErrorCode.U_S0500, "Constraint"); } } boolean hasColumn(int colIndex) { switch (constType) { case SchemaObject.ConstraintTypes.CHECK : return rangeVariable.usedColumns[colIndex]; case SchemaObject.ConstraintTypes.PRIMARY_KEY : case SchemaObject.ConstraintTypes.UNIQUE : case SchemaObject.ConstraintTypes.MAIN : return ArrayUtil.find(core.mainCols, colIndex) != -1; case SchemaObject.ConstraintTypes.FOREIGN_KEY : return ArrayUtil.find(core.refCols, colIndex) != -1; default : throw Error.runtimeError(ErrorCode.U_S0500, "Constraint"); } } /** * Compares this with another constraint column set. This is used only for * UNIQUE constraints. */ boolean isUniqueWithColumns(int[] cols) { switch (constType) { case SchemaObject.ConstraintTypes.PRIMARY_KEY : case SchemaObject.ConstraintTypes.UNIQUE : if (core.mainCols.length == cols.length) { return ArrayUtil.haveEqualSets(core.mainCols, cols, cols.length); } } return false; } /** * Compares this with another constraint column set. This implementation * only checks FOREIGN KEY constraints. */ boolean isEquivalent(Table mainTable, int[] mainCols, Table refTable, int[] refCols) { switch (constType) { case SchemaObject.ConstraintTypes.MAIN : case SchemaObject.ConstraintTypes.FOREIGN_KEY : if (mainTable != core.mainTable || refTable != core.refTable) { return false; } if (core.mainCols.length == mainCols.length && core.refCols.length == refCols.length) { return ArrayUtil.areEqualSets(core.mainCols, mainCols) && ArrayUtil.areEqualSets(core.refCols, refCols); } } return false; } /** * Used to update constrains to reflect structural changes in a table. Prior * checks must ensure that this method does not throw. * * @param session Session * @param oldTable reference to the old version of the table * @param newTable referenct to the new version of the table * @param colIndex index at which table column is added or removed * @param adjust -1, 0, +1 to indicate if column is added or removed * @ */ void updateTable(Session session, Table oldTable, Table newTable, int colIndex, int adjust) { if (oldTable == core.mainTable) { core.mainTable = newTable; if (core.mainIndex != null) { core.mainIndex = core.mainTable.getIndex(core.mainIndex.getName().name); core.mainCols = ArrayUtil.toAdjustedColumnArray(core.mainCols, colIndex, adjust); core.mainIndex.setTable(newTable); } } if (oldTable == core.refTable) { core.refTable = newTable; if (core.refIndex != null) { core.refIndex = core.refTable.getIndex(core.refIndex.getName().name); core.refCols = ArrayUtil.toAdjustedColumnArray(core.refCols, colIndex, adjust); core.refIndex.setTable(newTable); } } // CHECK if (constType == SchemaObject.ConstraintTypes.CHECK) { recompile(session, newTable); } } /** * Checks for foreign key or check constraint violation when * inserting a row into the child table. */ void checkInsert(Session session, Table table, Object[] data, boolean isNew) { switch (constType) { case SchemaObject.ConstraintTypes.CHECK : if (!isNotNull) { checkCheckConstraint(session, table, data); } return; case SchemaObject.ConstraintTypes.FOREIGN_KEY : PersistentStore store = core.mainTable.getRowStore(session); if (ArrayUtil.hasNull(data, core.refCols)) { if (core.matchType == OpTypes.MATCH_SIMPLE) { return; } if (core.refCols.length == 1) { return; } if (ArrayUtil.hasAllNull(data, core.refCols)) { return; } // core.matchType == OpTypes.MATCH_FULL } else if (core.mainIndex.existsParent(session, store, data, core.refCols)) { return; } throw getException(data); } } /* * Tests a row against this CHECK constraint. */ void checkCheckConstraint(Session session, Table table, Object[] data) { /* if (session.compiledStatementExecutor.rangeIterators[1] == null) { session.compiledStatementExecutor.rangeIterators[1] = rangeVariable.getIterator(session); } */ RangeIteratorBase it = session.sessionContext.getCheckIterator(rangeVariable); it.currentData = data; boolean nomatch = Boolean.FALSE.equals(check.getValue(session)); it.currentData = null; if (nomatch) { String[] info = new String[] { name.name, table.getName().name }; throw Error.error(null, ErrorCode.X_23513, ErrorCode.CONSTRAINT, info); } } void checkCheckConstraint(Session session, Table table, ColumnSchema column, Object data) { session.sessionData.currentValue = data; boolean nomatch = Boolean.FALSE.equals(check.getValue(session)); session.sessionData.currentValue = null; if (nomatch) { String[] info = new String[] { name.statementName, table == null ? "" : table.getName().statementName, column == null ? "" : column.getName().statementName, }; throw Error.error(null, ErrorCode.X_23513, ErrorCode.COLUMN_CONSTRAINT, info); } } public HsqlException getException(Object[] data) { switch (this.constType) { case SchemaObject.ConstraintTypes.CHECK : { String[] info = new String[]{ name.statementName }; return Error.error(null, ErrorCode.X_23513, ErrorCode.CONSTRAINT, info); } case SchemaObject.ConstraintTypes.FOREIGN_KEY : { StringBuffer sb = new StringBuffer(); for (int i = 0; i < core.refCols.length; i++) { Object o = data[core.refCols[i]]; sb.append(core.refTable.getColumnTypes()[core.refCols[i]] .convertToString(o)); sb.append(','); } String[] info = new String[] { name.statementName, core.refTable.getName().statementName, sb.toString() }; return Error.error(null, ErrorCode.X_23503, ErrorCode.CONSTRAINT, info); } case SchemaObject.ConstraintTypes.PRIMARY_KEY : case SchemaObject.ConstraintTypes.UNIQUE : { StringBuffer sb = new StringBuffer(); for (int i = 0; i < core.mainCols.length; i++) { Object o = data[core.mainCols[i]]; sb.append(core.mainTable.colTypes[core.mainCols[i]] .convertToString(o)); sb.append(','); } return Error.error(null, ErrorCode.X_23505, ErrorCode.CONSTRAINT, new String[] { name.statementName, core.mainTable.getName().statementName, sb.toString() }); } default : throw Error.runtimeError(ErrorCode.U_S0500, "Constraint"); } } // fredt@users 20020225 - patch 1.7.0 - cascading deletes /** * New method to find any referencing row for a foreign key (finds row in * child table). If ON DELETE CASCADE is specified for this constraint, then * the method finds the first row among the rows of the table ordered by the * index and doesn't throw. Without ON DELETE CASCADE, the method attempts * to finds any row that exists. If no * row is found, null is returned. (fredt@users) * * @param session Session * @param row array of objects for a database row * @param delete should we allow 'ON DELETE CASCADE' or 'ON UPDATE CASCADE' * @return iterator * @ */ RowIterator findFkRef(Session session, Object[] row) { if (row == null || ArrayUtil.hasNull(row, core.mainCols)) { return core.refIndex.emptyIterator(); } PersistentStore store = core.refTable.getRowStore(session); return core.refIndex.findFirstRow(session, store, row, core.mainCols); } /** * Check used before creating a new foreign key cosntraint, this method * checks all rows of a table to ensure they all have a corresponding * row in the main table. */ void checkReferencedRows(Session session, Table table) { RowIterator it = table.rowIterator(session); while (true) { Row row = it.getNextRow(); if (row == null) { break; } Object[] rowData = row.getData(); checkInsert(session, table, rowData, false); } } public Expression getCheckExpression() { return check; } public OrderedHashSet getCheckColumnExpressions() { OrderedHashSet set = new OrderedHashSet(); check.collectAllExpressions(set, Expression.columnExpressionSet, Expression.emptyExpressionSet); return set; } void recompile(Session session, Table newTable) { String ddl = check.getSQL(); Scanner scanner = new Scanner(ddl); ParserDQL parser = new ParserDQL(session, scanner); parser.compileContext.reset(0); parser.read(); parser.isCheckOrTriggerCondition = true; Expression condition = parser.XreadBooleanValueExpression(); check = condition; // this workaround is here to stop LIKE optimisation (for proper scripting) QuerySpecification s = Expression.getCheckSelect(session, newTable, check); rangeVariable = s.rangeVariables[0]; rangeVariable.setForCheckConstraint(); } void prepareCheckConstraint(Session session, Table table, boolean checkValues) { // to ensure no subselects etc. are in condition check.checkValidCheckConstraint(); if (table == null) { check.resolveTypes(session, null); } else { QuerySpecification s = Expression.getCheckSelect(session, table, check); Result r = s.getResult(session, 1); if (r.getNavigator().getSize() != 0) { String[] info = new String[] { name.statementName, table.getName().statementName }; throw Error.error(null, ErrorCode.X_23513, ErrorCode.CONSTRAINT, info); } rangeVariable = s.rangeVariables[0]; // removes reference to the Index object in range variable rangeVariable.setForCheckConstraint(); } if (check.getType() == OpTypes.NOT && check.getLeftNode().getType() == OpTypes.IS_NULL && check.getLeftNode().getLeftNode().getType() == OpTypes.COLUMN) { notNullColumnIndex = check.getLeftNode().getLeftNode().getColumnIndex(); isNotNull = true; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TableBase.java0000644000175000017500000004124012007547356021435 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.navigator.RowIterator; import org.hsqldb.persist.PersistentStore; import org.hsqldb.types.Type; /** * The base of all HSQLDB table implementations. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.7.2 */ public class TableBase { // types of table public static final int INFO_SCHEMA_TABLE = 1; public static final int SYSTEM_SUBQUERY = 2; public static final int TEMP_TABLE = 3; public static final int MEMORY_TABLE = 4; public static final int CACHED_TABLE = 5; public static final int TEMP_TEXT_TABLE = 6; public static final int TEXT_TABLE = 7; public static final int VIEW_TABLE = 8; public static final int RESULT_TABLE = 9; public static final int TRANSITION_TABLE = 10; public static final int FUNCTION_TABLE = 11; public static final int SYSTEM_TABLE = 12; public static final int CHANGE_SET_TABLE = 13; // public static final int SCOPE_STATEMENT = 21; public static final int SCOPE_TRANSACTION = 22; public static final int SCOPE_SESSION = 23; public static final int SCOPE_FULL = 24; // public PersistentStore store; public int persistenceScope; public long persistenceId; // columns in table int[] primaryKeyCols; // column numbers for primary key Type[] primaryKeyTypes; int[] primaryKeyColsSequence; // {0,1,2,...} // // Index[] indexList; // first index is the primary key index public Database database; int[] bestRowIdentifierCols; // column set for best index boolean bestRowIdentifierStrict; // true if it has no nullable column int[] bestIndexForColumn; // index of the 'best' index for each column Index bestIndex; // the best index overall - null if there is no user-defined index Index fullIndex; // index on all columns boolean[] colNotNull; // nullability Type[] colTypes; // types of columns protected int columnCount; // int tableType; protected boolean isReadOnly; protected boolean isTemp; protected boolean isCached; protected boolean isText; boolean isView; protected boolean isWithDataSource; public boolean isSessionBased; protected boolean isSchemaBased; protected boolean isLogged; private boolean isTransactional = true; boolean hasLobColumn; long dataTimestamp; // TableBase() {} // public TableBase(Session session, Database database, int scope, int type, Type[] colTypes) { tableType = type; persistenceScope = scope; isSessionBased = true; persistenceId = database.persistentStoreCollection.getNextId(); this.database = database; this.colTypes = colTypes; columnCount = colTypes.length; primaryKeyCols = new int[]{}; primaryKeyTypes = new Type[]{}; indexList = new Index[0]; createPrimaryIndex(primaryKeyCols, primaryKeyTypes, null); } public TableBase duplicate() { TableBase copy = new TableBase(); copy.tableType = tableType; copy.persistenceScope = persistenceScope; copy.isSessionBased = isSessionBased; copy.persistenceId = database.persistentStoreCollection.getNextId(); copy.database = database; copy.colTypes = colTypes; copy.columnCount = columnCount; copy.primaryKeyCols = primaryKeyCols; copy.primaryKeyTypes = primaryKeyTypes; copy.indexList = indexList; return copy; } public final int getTableType() { return tableType; } public long getPersistenceId() { return persistenceId; } int getId() { return 0; } public final boolean onCommitPreserve() { return persistenceScope == TableBase.SCOPE_SESSION; } public final RowIterator rowIterator(Session session) { PersistentStore store = getRowStore(session); return getPrimaryIndex().firstRow(session, store); } public final RowIterator rowIterator(PersistentStore store) { return getPrimaryIndex().firstRow(store); } public final int getIndexCount() { return indexList.length; } public final Index getPrimaryIndex() { return indexList.length > 0 ? indexList[0] : null; } public final Type[] getPrimaryKeyTypes() { return primaryKeyTypes; } public final boolean hasPrimaryKey() { return !(primaryKeyCols.length == 0); } public final int[] getPrimaryKey() { return primaryKeyCols; } /** * Returns an array of Type indicating the SQL type of the columns */ public final Type[] getColumnTypes() { return colTypes; } /** * Returns an index on all the columns */ public Index getFullIndex() { return fullIndex; } /** * Returns the Index object at the given index */ public final Index getIndex(int i) { return indexList[i]; } /** * Returns the indexes */ public final Index[] getIndexList() { return indexList; } /** * Returns empty boolean array. */ public final boolean[] getNewColumnCheckList() { return new boolean[getColumnCount()]; } /** * Returns the count of all visible columns. */ public int getColumnCount() { return columnCount; } /** * Returns the count of all columns. */ public final int getDataColumnCount() { return colTypes.length; } public boolean isTransactional() { return isTransactional; } public void setTransactional(boolean value) { isTransactional = value; } /** * This method is called whenever there is a change to table structure and * serves two porposes: (a) to reset the best set of columns that identify * the rows of the table (b) to reset the best index that can be used * to find rows of the table given a column value. * * (a) gives most weight to a primary key index, followed by a unique * address with the lowest count of nullable columns. Otherwise there is * no best row identifier. * * (b) finds for each column an index with a corresponding first column. * It uses any type of visible index and accepts the one with the largest * column count. * * bestIndex is the user defined, primary key, the first unique index, or * the first non-unique index. NULL if there is no user-defined index. * */ public final void setBestRowIdentifiers() { int[] briCols = null; int briColsCount = 0; boolean isStrict = false; int nNullCount = 0; // ignore if called prior to completion of primary key construction if (colNotNull == null) { return; } bestIndex = null; bestIndexForColumn = new int[colTypes.length]; ArrayUtil.fillArray(bestIndexForColumn, -1); for (int i = 0; i < indexList.length; i++) { Index index = indexList[i]; int[] cols = index.getColumns(); int colsCount = index.getColumnCount(); if (colsCount == 0) { continue; } if (i == 0) { isStrict = true; } if (bestIndexForColumn[cols[0]] == -1) { bestIndexForColumn[cols[0]] = i; } else { Index existing = indexList[bestIndexForColumn[cols[0]]]; if (colsCount > existing.getColumns().length) { bestIndexForColumn[cols[0]] = i; } } if (!index.isUnique()) { if (bestIndex == null) { bestIndex = index; } continue; } int nnullc = 0; for (int j = 0; j < colsCount; j++) { if (colNotNull[cols[j]]) { nnullc++; } } if (bestIndex != null) { bestIndex = index; } if (nnullc == colsCount) { if (briCols == null || briColsCount != nNullCount || colsCount < briColsCount) { // nothing found before || // found but has null columns || // found but has more columns than this index briCols = cols; briColsCount = colsCount; nNullCount = colsCount; isStrict = true; } continue; } else if (isStrict) { continue; } else if (briCols == null || colsCount < briColsCount || nnullc > nNullCount) { // nothing found before || // found but has more columns than this index|| // found but has fewer not null columns than this index briCols = cols; briColsCount = colsCount; nNullCount = nnullc; } } if (briCols == null || briColsCount == briCols.length) { bestRowIdentifierCols = briCols; } else { bestRowIdentifierCols = ArrayUtil.arraySlice(briCols, 0, briColsCount); } bestRowIdentifierStrict = isStrict; if (indexList[0].getColumnCount() > 0) { bestIndex = indexList[0]; } } public final void createPrimaryIndex(int[] pkcols, Type[] pktypes, HsqlName name) { long id = database.persistentStoreCollection.getNextId(); Index newIndex = database.logger.newIndex(name, id, this, pkcols, null, null, pktypes, true, pkcols.length > 0, pkcols.length > 0, false); try { addIndex(newIndex); } catch (HsqlException e) {} } public final Index createAndAddIndexStructure(HsqlName name, int[] columns, boolean[] descending, boolean[] nullsLast, boolean unique, boolean constraint, boolean forward) { Index newindex = createIndexStructure(name, columns, descending, nullsLast, unique, constraint, forward); addIndex(newindex); return newindex; } final Index createIndexStructure(HsqlName name, int[] columns, boolean[] descending, boolean[] nullsLast, boolean unique, boolean constraint, boolean forward) { if (primaryKeyCols == null) { throw Error.runtimeError(ErrorCode.U_S0500, "createIndex"); } int s = columns.length; int[] cols = new int[s]; Type[] types = new Type[s]; for (int j = 0; j < s; j++) { cols[j] = columns[j]; types[j] = colTypes[cols[j]]; } long id = database.persistentStoreCollection.getNextId(); Index newIndex = database.logger.newIndex(name, id, this, cols, descending, nullsLast, types, false, unique, constraint, forward); return newIndex; } /** * Performs Table structure modification and changes to the index nodes * to remove a given index from a MEMORY or TEXT table. Not for PK index. * */ public void dropIndex(int todrop) { indexList = (Index[]) ArrayUtil.toAdjustedArray(indexList, null, todrop, -1); for (int i = 0; i < indexList.length; i++) { indexList[i].setPosition(i); } setBestRowIdentifiers(); if (store != null) { store.resetAccessorKeys(indexList); } } final void addIndex(Index index) { int i = 0; for (; i < indexList.length; i++) { Index current = indexList[i]; int order = index.getIndexOrderValue() - current.getIndexOrderValue(); if (order < 0) { break; } } indexList = (Index[]) ArrayUtil.toAdjustedArray(indexList, index, i, 1); for (i = 0; i < indexList.length; i++) { indexList[i].setPosition(i); } if (store != null) { try { store.resetAccessorKeys(indexList); } catch (HsqlException e) { indexList = (Index[]) ArrayUtil.toAdjustedArray(indexList, null, index.getPosition(), -1); for (i = 0; i < indexList.length; i++) { indexList[i].setPosition(i); } throw e; } } setBestRowIdentifiers(); } final void removeIndex(int position) { setBestRowIdentifiers(); } public final void setIndexes(Index[] indexes) { this.indexList = indexes; } public final Object[] getEmptyRowData() { return new Object[getDataColumnCount()]; } /** * Create new memory-resident index. For MEMORY and TEXT tables. */ public final Index createIndex(Session session, HsqlName name, int[] columns, boolean[] descending, boolean[] nullsLast, boolean unique, boolean constraint, boolean forward) { Index newIndex = createAndAddIndexStructure(name, columns, descending, nullsLast, unique, constraint, forward); return newIndex; } public void clearAllData(Session session) { PersistentStore store = getRowStore(session); store.removeAll(); } public void clearAllData(PersistentStore store) { store.removeAll(); } /** * @todo - this is wrong, as it returns true when table has no rows, * but not where it has rows that are not visible by session * Returns true if the table has any rows at all. */ public final boolean isEmpty(Session session) { if (getIndexCount() == 0) { return true; } PersistentStore store = getRowStore(session); return getIndex(0).isEmpty(store); } public PersistentStore getRowStore(Session session) { return store == null ? session.sessionData.persistentStoreCollection.getStore(this) : store; } public void setDataTimestamp(long timestamp) { // no op } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ClientConnectionHTTP.java0000644000175000017500000001366212007547420023550 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import org.hsqldb.lib.DataOutputStream; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.result.Result; /** * HTTP protocol session proxy implementation. Uses the updated HSQLDB HTTP sub * protocol. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 */ public class ClientConnectionHTTP extends ClientConnection { static final String ENCODING = "ISO-8859-1"; static final int IDLENGTH = 12; // length of int + long for db and session // IDs private HttpURLConnection httpConnection = null; public ClientConnectionHTTP(String host, int port, String path, String database, boolean isTLS, String user, String password, int timeZoneSeconds) { super(host, port, path, database, isTLS, user, password, timeZoneSeconds); } // Empty since HTTP has an empty handshake() method. execute() will open connection // when it needs to protected void initConnection(String host, int port, boolean isTLS) {} /** * This just opens (a new or re-uses a connection) Keep-Alive. * * Contrary to before, the dataOutput and dataInput are not connected to the * connection's Output- and Input-Streams here, because when connecting to * the input stream here, somehow rules out writing to the output stream. */ protected void openConnection(String host, int port, boolean isTLS) { try { URL url = null; String s = ""; if (!path.endsWith("/")) { s = "/"; } s = "http://" + host + ":" + port + path + s + database; if (isTLS) { url = new URL("https://" + host + ":" + port + path + s + database); // PROTECT/servlet/hsqldb } else { url = new URL(s); // PROTECT/servlet/hsqldb } httpConnection = (HttpURLConnection) url.openConnection(); httpConnection.setDefaultUseCaches(false); } catch (IOException e) { e.printStackTrace(System.out); } } protected void closeConnection() { //httpConnection.disconnect(); } // In Keep-Alive scenario, this is empty public synchronized Result execute(Result r) { openConnection(host, port, isTLS); Result result = super.execute(r); closeConnection(); return result; } protected void write(Result r) throws IOException, HsqlException { HsqlByteArrayOutputStream memStream = new HsqlByteArrayOutputStream(); DataOutputStream tempOutput = new DataOutputStream(memStream); r.write(this, tempOutput, rowOut); httpConnection.setRequestMethod("POST"); httpConnection.setDoOutput(true); httpConnection.setUseCaches(false); //httpConnection.setRequestProperty("Accept-Encoding", "gzip"); httpConnection.setRequestProperty("Content-Type", "application/octet-stream"); httpConnection.setRequestProperty("Content-Length", String.valueOf(IDLENGTH + memStream.size())); dataOutput = new DataOutputStream(httpConnection.getOutputStream()); dataOutput.writeInt(r.getDatabaseId()); dataOutput.writeLong(r.getSessionId()); memStream.writeTo(dataOutput); dataOutput.flush(); } protected Result read() throws IOException, HsqlException { dataInput = new DataInputStream( new BufferedInputStream(httpConnection.getInputStream())); rowOut.reset(); Result result = Result.newResult(dataInput, rowIn); result.readAdditionalResults(this, dataInput, rowIn); dataInput.close(); // Added to ensure connection is returned to Java // engine for transparent re-use of Keep-alive // connections (Aart) return result; } protected void handshake() throws IOException { // We depend on the HTTP wrappings to assure end-to-end handshaking } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/SchemaObjectSet.java0000644000175000017500000004143312007547352022616 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HashMap; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.store.ValuePool; /** * Collection of SQL schema objects of a specific type in a schema * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public class SchemaObjectSet { HashMap map; int type; SchemaObjectSet(int type) { this.type = type; switch (type) { case SchemaObject.VIEW : case SchemaObject.TABLE : case SchemaObject.SEQUENCE : case SchemaObject.CHARSET : case SchemaObject.DOMAIN : case SchemaObject.TYPE : case SchemaObject.COLLATION : case SchemaObject.PROCEDURE : case SchemaObject.FUNCTION : case SchemaObject.SPECIFIC_ROUTINE : case SchemaObject.ASSERTION : case SchemaObject.TRIGGER : map = new HashMappedList(); break; case SchemaObject.COLUMN : case SchemaObject.CONSTRAINT : case SchemaObject.INDEX : map = new HashMap(); break; } } HsqlName getName(String name) { switch (type) { case SchemaObject.VIEW : case SchemaObject.TABLE : case SchemaObject.SEQUENCE : case SchemaObject.CHARSET : case SchemaObject.DOMAIN : case SchemaObject.TYPE : case SchemaObject.COLLATION : case SchemaObject.PROCEDURE : case SchemaObject.SPECIFIC_ROUTINE : case SchemaObject.FUNCTION : case SchemaObject.ASSERTION : case SchemaObject.TRIGGER : SchemaObject object = ((SchemaObject) map.get(name)); return object == null ? null : object.getName(); case SchemaObject.COLUMN : case SchemaObject.CONSTRAINT : case SchemaObject.INDEX : { return (HsqlName) map.get(name); } default : return (HsqlName) map.get(name); } } public SchemaObject getObject(String name) { switch (type) { case SchemaObject.VIEW : case SchemaObject.TABLE : case SchemaObject.SEQUENCE : case SchemaObject.CHARSET : case SchemaObject.DOMAIN : case SchemaObject.TYPE : case SchemaObject.COLLATION : case SchemaObject.PROCEDURE : case SchemaObject.SPECIFIC_ROUTINE : case SchemaObject.FUNCTION : case SchemaObject.ASSERTION : case SchemaObject.TRIGGER : case SchemaObject.COLUMN : return (SchemaObject) map.get(name); default : throw Error.runtimeError(ErrorCode.U_S0500, "SchemaObjectSet"); } } public boolean contains(String name) { return map.containsKey(name); } void checkAdd(HsqlName name) { if (map.containsKey(name.name)) { int code = getAddErrorCode(name.type); throw Error.error(code, name.name); } } boolean isEmpty() { return map.isEmpty(); } void checkExists(String name) { if (!map.containsKey(name)) { int code = getGetErrorCode(type); throw Error.error(code, name); } } public void add(SchemaObject object) { HsqlName name = object.getName(); if (type == SchemaObject.SPECIFIC_ROUTINE) { name = ((Routine) object).getSpecificName(); } if (map.containsKey(name.name)) { int code = getAddErrorCode(name.type); throw Error.error(code, name.name); } Object value = object; switch (name.type) { case SchemaObject.CONSTRAINT : case SchemaObject.INDEX : value = name; } map.put(name.name, value); } void remove(String name) { map.remove(name); } void removeParent(HsqlName parent) { Iterator it = map.values().iterator(); while (it.hasNext()) { if (type == SchemaObject.TRIGGER || type == SchemaObject.SPECIFIC_ROUTINE) { SchemaObject object = (SchemaObject) it.next(); if (object.getName().parent == parent) { it.remove(); } } else { HsqlName name = (HsqlName) it.next(); if (name.parent == parent) { it.remove(); } } } } void rename(HsqlName name, HsqlName newName) { if (map.containsKey(newName.name)) { int code = getAddErrorCode(name.type); throw Error.error(code, newName.name); } switch (newName.type) { case SchemaObject.VIEW : case SchemaObject.TABLE : case SchemaObject.SEQUENCE : case SchemaObject.CHARSET : case SchemaObject.COLLATION : case SchemaObject.PROCEDURE : case SchemaObject.FUNCTION : case SchemaObject.DOMAIN : case SchemaObject.TYPE : case SchemaObject.ASSERTION : case SchemaObject.TRIGGER : { int i = ((HashMappedList) map).getIndex(name.name); if (i == -1) { int code = getGetErrorCode(name.type); throw Error.error(code, name.name); } SchemaObject object = (SchemaObject) ((HashMappedList) map).get(i); object.getName().rename(newName); ((HashMappedList) map).setKey(i, name.name); break; } case SchemaObject.COLUMN : case SchemaObject.CONSTRAINT : case SchemaObject.INDEX : { map.remove(name.name); name.rename(newName); map.put(name.name, name); break; } } } static int getAddErrorCode(int type) { int code; switch (type) { case SchemaObject.VIEW : case SchemaObject.TABLE : case SchemaObject.COLUMN : case SchemaObject.SEQUENCE : case SchemaObject.CHARSET : case SchemaObject.DOMAIN : case SchemaObject.TYPE : case SchemaObject.COLLATION : case SchemaObject.PROCEDURE : case SchemaObject.FUNCTION : case SchemaObject.SPECIFIC_ROUTINE : case SchemaObject.CONSTRAINT : case SchemaObject.ASSERTION : case SchemaObject.INDEX : case SchemaObject.TRIGGER : code = ErrorCode.X_42504; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "SchemaObjectSet"); } return code; } static int getGetErrorCode(int type) { int code; switch (type) { case SchemaObject.VIEW : case SchemaObject.TABLE : case SchemaObject.COLUMN : case SchemaObject.SEQUENCE : case SchemaObject.CHARSET : case SchemaObject.DOMAIN : case SchemaObject.TYPE : case SchemaObject.CONSTRAINT : case SchemaObject.COLLATION : case SchemaObject.PROCEDURE : case SchemaObject.FUNCTION : case SchemaObject.SPECIFIC_ROUTINE : case SchemaObject.ASSERTION : case SchemaObject.INDEX : case SchemaObject.TRIGGER : code = ErrorCode.X_42501; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "SchemaObjectSet"); } return code; } public static String getName(int type) { switch (type) { case SchemaObject.VIEW : return Tokens.T_VIEW; case SchemaObject.COLUMN : return Tokens.T_COLUMN; case SchemaObject.TABLE : return Tokens.T_TABLE; case SchemaObject.SEQUENCE : return Tokens.T_SEQUENCE; case SchemaObject.CHARSET : return Tokens.T_CHARACTER + ' ' + Tokens.T_SET; case SchemaObject.DOMAIN : return Tokens.T_DOMAIN; case SchemaObject.TYPE : return Tokens.T_TYPE; case SchemaObject.CONSTRAINT : return Tokens.T_CONSTRAINT; case SchemaObject.COLLATION : return Tokens.T_COLLATION; case SchemaObject.PROCEDURE : return Tokens.T_PROCEDURE; case SchemaObject.FUNCTION : return Tokens.T_FUNCTION; case SchemaObject.ASSERTION : return Tokens.T_ASSERTION; case SchemaObject.INDEX : return Tokens.T_INDEX; case SchemaObject.TRIGGER : return Tokens.T_TRIGGER; default : throw Error.runtimeError(ErrorCode.U_S0500, "SchemaObjectSet"); } } String[] getSQL(OrderedHashSet resolved, OrderedHashSet unresolved) { HsqlArrayList list = new HsqlArrayList(); if (!(map instanceof HashMappedList)) { return null; } if (map.isEmpty()) { return ValuePool.emptyStringArray; } Iterator it = map.values().iterator(); if (type == SchemaObject.FUNCTION || type == SchemaObject.PROCEDURE) { OrderedHashSet set = new OrderedHashSet(); while (it.hasNext()) { RoutineSchema routineSchema = (RoutineSchema) it.next(); for (int i = 0; i < routineSchema.routines.length; i++) { Routine routine = routineSchema.routines[i]; if (routine.dataImpact == Routine.NO_SQL || routine.dataImpact == Routine.CONTAINS_SQL) {} else { set.add(routine); } } } it = set.iterator(); } addAllSQL(resolved, unresolved, list, it, null); String[] array = new String[list.size()]; list.toArray(array); return array; } static void addAllSQL(OrderedHashSet resolved, OrderedHashSet unresolved, HsqlArrayList list, Iterator it, OrderedHashSet newResolved) { while (it.hasNext()) { SchemaObject object = (SchemaObject) it.next(); OrderedHashSet references = object.getReferences(); boolean isResolved = true; for (int j = 0; j < references.size(); j++) { HsqlName name = (HsqlName) references.get(j); if (SqlInvariants.isSchemaNameSystem(name)) { continue; } switch (name.type) { case SchemaObject.TABLE : if (!resolved.contains(name)) { isResolved = false; } break; case SchemaObject.COLUMN : { if (object.getType() == SchemaObject.TABLE) { int index = ((Table) object).findColumn(name.name); ColumnSchema column = ((Table) object).getColumn(index); if (!isChildObjectResolved(column, resolved)) { isResolved = false; } break; } if (!resolved.contains(name.parent)) { isResolved = false; } break; } case SchemaObject.CONSTRAINT : { if (name.parent == object.getName()) { Constraint constraint = ((Table) object).getConstraint(name.name); if (constraint.getConstraintType() == SchemaObject.ConstraintTypes.CHECK) { if (!isChildObjectResolved(constraint, resolved)) { isResolved = false; } } } // only UNIQUE constraint referenced by FK in table break; } case SchemaObject.CHARSET : if (name.schema == null) { continue; } case SchemaObject.TYPE : case SchemaObject.DOMAIN : case SchemaObject.FUNCTION : case SchemaObject.PROCEDURE : case SchemaObject.SPECIFIC_ROUTINE : if (!resolved.contains(name)) { isResolved = false; } default : } } if (!isResolved) { unresolved.add(object); continue; } HsqlName name; if (object.getType() == SchemaObject.FUNCTION || object.getType() == SchemaObject.PROCEDURE) { name = ((Routine) object).getSpecificName(); } else { name = object.getName(); } resolved.add(name); if (newResolved != null) { newResolved.add(object); } if (object.getType() == SchemaObject.TABLE) { list.addAll(((Table) object).getSQL(resolved, unresolved)); } else { switch (object.getType()) { case SchemaObject.FUNCTION : case SchemaObject.PROCEDURE : if (((Routine) object).isRecursive) { list.add(((Routine) object).getSQLDeclaration()); list.add(((Routine) object).getSQLAlter()); break; } default : list.add(object.getSQL()); } } } } static boolean isChildObjectResolved(SchemaObject object, OrderedHashSet resolved) { OrderedHashSet refs = object.getReferences(); for (int i = 0; i < refs.size(); i++) { HsqlName name = (HsqlName) refs.get(i); if (SqlInvariants.isSchemaNameSystem(name)) { continue; } if (!resolved.contains(name)) { return false; } } return true; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/FunctionSQL.java0000644000175000017500000022570512007547352021766 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.ParserDQL.CompileContext; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.IntValueHashMap; import org.hsqldb.lib.OrderedIntHashSet; import org.hsqldb.store.ValuePool; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BinaryType; import org.hsqldb.types.BlobData; import org.hsqldb.types.CharacterType; import org.hsqldb.types.DTIType; import org.hsqldb.types.DateTimeType; import org.hsqldb.types.IntervalType; import org.hsqldb.types.NumberType; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Implementation of SQL standard function calls * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.1.1 * @since 1.9.0 */ public class FunctionSQL extends Expression { protected static final int FUNC_POSITION_CHAR = 1; // numeric private static final int FUNC_POSITION_BINARY = 2; private static final int FUNC_OCCURENCES_REGEX = 3; private static final int FUNC_POSITION_REGEX = 4; protected static final int FUNC_EXTRACT = 5; protected static final int FUNC_BIT_LENGTH = 6; protected static final int FUNC_CHAR_LENGTH = 7; protected static final int FUNC_OCTET_LENGTH = 8; private static final int FUNC_CARDINALITY = 9; private static final int FUNC_MAX_CARDINALITY = 10; private static final int FUNC_TRIM_ARRAY = 11; private static final int FUNC_ABS = 12; private static final int FUNC_MOD = 13; protected static final int FUNC_LN = 14; private static final int FUNC_EXP = 15; private static final int FUNC_POWER = 16; private static final int FUNC_SQRT = 17; private static final int FUNC_FLOOR = 20; private static final int FUNC_CEILING = 21; private static final int FUNC_WIDTH_BUCKET = 22; protected static final int FUNC_SUBSTRING_CHAR = 23; // string private static final int FUNC_SUBSTRING_REG_EXPR = 24; private static final int FUNC_SUBSTRING_REGEX = 25; protected static final int FUNC_FOLD_LOWER = 26; protected static final int FUNC_FOLD_UPPER = 27; private static final int FUNC_TRANSCODING = 28; private static final int FUNC_TRANSLITERATION = 29; private static final int FUNC_REGEX_TRANSLITERATION = 30; protected static final int FUNC_TRIM_CHAR = 31; static final int FUNC_OVERLAY_CHAR = 32; private static final int FUNC_CHAR_NORMALIZE = 33; private static final int FUNC_SUBSTRING_BINARY = 40; private static final int FUNC_TRIM_BINARY = 41; private static final int FUNC_OVERLAY_BINARY = 42; protected static final int FUNC_CURRENT_DATE = 43; // datetime protected static final int FUNC_CURRENT_TIME = 44; protected static final int FUNC_CURRENT_TIMESTAMP = 50; protected static final int FUNC_LOCALTIME = 51; protected static final int FUNC_LOCALTIMESTAMP = 52; private static final int FUNC_CURRENT_CATALOG = 53; // general private static final int FUNC_CURRENT_DEFAULT_TRANSFORM_GROUP = 54; private static final int FUNC_CURRENT_PATH = 55; private static final int FUNC_CURRENT_ROLE = 56; private static final int FUNC_CURRENT_SCHEMA = 57; private static final int FUNC_CURRENT_TRANSFORM_GROUP_FOR_TYPE = 58; private static final int FUNC_CURRENT_USER = 59; private static final int FUNC_SESSION_USER = 60; private static final int FUNC_SYSTEM_USER = 61; protected static final int FUNC_USER = 62; private static final int FUNC_VALUE = 63; // static final short[] noParamList = new short[]{}; static final short[] emptyParamList = new short[] { Tokens.OPENBRACKET, Tokens.CLOSEBRACKET }; static final short[] optionalNoParamList = new short[] { Tokens.X_OPTION, 2, Tokens.OPENBRACKET, Tokens.CLOSEBRACKET }; static final short[] optionalSingleParamList = new short[] { Tokens.OPENBRACKET, Tokens.X_OPTION, 1, Tokens.QUESTION, Tokens.CLOSEBRACKET }; static final short[] singleParamList = new short[] { Tokens.OPENBRACKET, Tokens.QUESTION, Tokens.CLOSEBRACKET }; static final short[] optionalIntegerParamList = new short[] { Tokens.X_OPTION, 3, Tokens.OPENBRACKET, Tokens.X_POS_INTEGER, Tokens.CLOSEBRACKET }; static final short[] doubleParamList = new short[] { Tokens.OPENBRACKET, Tokens.QUESTION, Tokens.COMMA, Tokens.QUESTION, Tokens.CLOSEBRACKET }; static final short[] tripleParamList = new short[] { Tokens.OPENBRACKET, Tokens.QUESTION, Tokens.COMMA, Tokens.QUESTION, Tokens.COMMA, Tokens.QUESTION, Tokens.CLOSEBRACKET }; static final short[] quadParamList = new short[] { Tokens.OPENBRACKET, Tokens.QUESTION, Tokens.COMMA, Tokens.QUESTION, Tokens.COMMA, Tokens.QUESTION, Tokens.COMMA, Tokens.QUESTION, Tokens.CLOSEBRACKET }; // static IntValueHashMap valueFuncMap = new IntValueHashMap(); static IntValueHashMap regularFuncMap = new IntValueHashMap(); static OrderedIntHashSet nonDeterministicFuncSet = new OrderedIntHashSet(); static { regularFuncMap.put(Tokens.T_POSITION, FUNC_POSITION_CHAR); /* regularFuncMap.put(Token.T_OCCURENCES_REGEX, FUNC_OCCURENCES_REGEX); */ regularFuncMap.put(Tokens.T_POSITION_REGEX, FUNC_POSITION_REGEX); regularFuncMap.put(Tokens.T_EXTRACT, FUNC_EXTRACT); regularFuncMap.put(Tokens.T_BIT_LENGTH, FUNC_BIT_LENGTH); regularFuncMap.put(Tokens.T_CHAR_LENGTH, FUNC_CHAR_LENGTH); regularFuncMap.put(Tokens.T_CHARACTER_LENGTH, FUNC_CHAR_LENGTH); regularFuncMap.put(Tokens.T_OCTET_LENGTH, FUNC_OCTET_LENGTH); regularFuncMap.put(Tokens.T_CARDINALITY, FUNC_CARDINALITY); regularFuncMap.put(Tokens.T_MAX_CARDINALITY, FUNC_MAX_CARDINALITY); regularFuncMap.put(Tokens.T_TRIM_ARRAY, FUNC_TRIM_ARRAY); regularFuncMap.put(Tokens.T_ABS, FUNC_ABS); regularFuncMap.put(Tokens.T_MOD, FUNC_MOD); regularFuncMap.put(Tokens.T_LN, FUNC_LN); regularFuncMap.put(Tokens.T_EXP, FUNC_EXP); regularFuncMap.put(Tokens.T_POWER, FUNC_POWER); regularFuncMap.put(Tokens.T_SQRT, FUNC_SQRT); regularFuncMap.put(Tokens.T_FLOOR, FUNC_FLOOR); regularFuncMap.put(Tokens.T_CEILING, FUNC_CEILING); regularFuncMap.put(Tokens.T_CEIL, FUNC_CEILING); regularFuncMap.put(Tokens.T_WIDTH_BUCKET, FUNC_WIDTH_BUCKET); regularFuncMap.put(Tokens.T_SUBSTRING, FUNC_SUBSTRING_CHAR); /* regularFuncMap.put(Token.T_SUBSTRING_REG_EXPR, FUNC_SUBSTRING_REG_EXPR); */ regularFuncMap.put(Tokens.T_SUBSTRING_REGEX, FUNC_SUBSTRING_REGEX); regularFuncMap.put(Tokens.T_LOWER, FUNC_FOLD_LOWER); regularFuncMap.put(Tokens.T_UPPER, FUNC_FOLD_UPPER); /* regularFuncMap.put(Token.T_TRANSCODING, FUNC_TRANSCODING); regularFuncMap.put(Token.T_TRANSLITERATION, FUNC_TRANSLITERATION); regularFuncMap.put(Token.T_TRASLATION, FUNC_REGEX_TRANSLITERATION); */ regularFuncMap.put(Tokens.T_TRIM, FUNC_TRIM_CHAR); regularFuncMap.put(Tokens.T_OVERLAY, FUNC_OVERLAY_CHAR); /* regularFuncMap.put(Token.T_NORMALIZE, FUNC_CHAR_NORMALIZE); */ regularFuncMap.put(Tokens.T_TRIM, FUNC_TRIM_BINARY); } static { valueFuncMap.put(Tokens.T_CURRENT_DATE, FUNC_CURRENT_DATE); valueFuncMap.put(Tokens.T_CURRENT_TIME, FUNC_CURRENT_TIME); valueFuncMap.put(Tokens.T_CURRENT_TIMESTAMP, FUNC_CURRENT_TIMESTAMP); valueFuncMap.put(Tokens.T_LOCALTIME, FUNC_LOCALTIME); valueFuncMap.put(Tokens.T_LOCALTIMESTAMP, FUNC_LOCALTIMESTAMP); valueFuncMap.put(Tokens.T_CURRENT_CATALOG, FUNC_CURRENT_CATALOG); /* valueFuncMap.put(Token.T_CURRENT_DEFAULT_TRANSFORM_GROUP, FUNC_CURRENT_DEFAULT_TRANSFORM_GROUP); */ valueFuncMap.put(Tokens.T_CURRENT_PATH, FUNC_CURRENT_PATH); valueFuncMap.put(Tokens.T_CURRENT_ROLE, FUNC_CURRENT_ROLE); valueFuncMap.put(Tokens.T_CURRENT_SCHEMA, FUNC_CURRENT_SCHEMA); /* valueFuncMap.put(Token.T_CURRENT_TRANSFORM_GROUP_FOR_TYPE, FUNC_CURRENT_TRANSFORM_GROUP_FOR_TYPE); */ valueFuncMap.put(Tokens.T_CURRENT_USER, FUNC_CURRENT_USER); valueFuncMap.put(Tokens.T_SESSION_USER, FUNC_SESSION_USER); valueFuncMap.put(Tokens.T_SYSTEM_USER, FUNC_SYSTEM_USER); valueFuncMap.put(Tokens.T_USER, FUNC_USER); valueFuncMap.put(Tokens.T_VALUE, FUNC_VALUE); // nonDeterministicFuncSet.addAll(valueFuncMap.values()); } // int funcType; boolean isDeterministic; String name; short[] parseList; short[] parseListAlt; boolean isSQLValueFunction; public static FunctionSQL newSQLFunction(String token, CompileContext context) { int id = regularFuncMap.get(token, -1); boolean isValueFunction = false; if (id == -1) { id = valueFuncMap.get(token, -1); isValueFunction = true; } if (id == -1) { return null; } FunctionSQL function = new FunctionSQL(id); if (id == FUNC_VALUE) { if (context.currentDomain == null) { return null; } function.dataType = context.currentDomain; } else { function.isSQLValueFunction = isValueFunction; } return function; } protected FunctionSQL() { super(OpTypes.SQL_FUNCTION); nodes = Expression.emptyArray; } protected FunctionSQL(int id) { this(); this.funcType = id; isDeterministic = !nonDeterministicFuncSet.contains(id); switch (id) { case FUNC_POSITION_CHAR : case FUNC_POSITION_BINARY : name = Tokens.T_POSITION; parseList = new short[] { Tokens.OPENBRACKET, Tokens.QUESTION, Tokens.IN, Tokens.QUESTION, Tokens.X_OPTION, 5, Tokens.USING, Tokens.X_KEYSET, 2, Tokens.CHARACTERS, Tokens.OCTETS, Tokens.CLOSEBRACKET }; break; case FUNC_OCCURENCES_REGEX : case FUNC_POSITION_REGEX : break; case FUNC_EXTRACT : name = Tokens.T_EXTRACT; parseList = new short[] { Tokens.OPENBRACKET, Tokens.X_KEYSET, 17, Tokens.YEAR, Tokens.MONTH, Tokens.DAY, Tokens.HOUR, Tokens.MINUTE, Tokens.SECOND, Tokens.DAY_OF_WEEK, Tokens.WEEK_OF_YEAR, Tokens.QUARTER, Tokens.DAY_OF_YEAR, Tokens.DAY_OF_MONTH, Tokens.WEEK_OF_YEAR, Tokens.DAY_NAME, Tokens.MONTH_NAME, Tokens.SECONDS_MIDNIGHT, Tokens.TIMEZONE_HOUR, Tokens.TIMEZONE_MINUTE, Tokens.FROM, Tokens.QUESTION, Tokens.CLOSEBRACKET }; break; case FUNC_CHAR_LENGTH : name = Tokens.T_CHAR_LENGTH; parseList = new short[] { Tokens.OPENBRACKET, Tokens.QUESTION, Tokens.X_OPTION, 5, Tokens.USING, Tokens.X_KEYSET, 2, Tokens.CHARACTERS, Tokens.OCTETS, Tokens.CLOSEBRACKET }; break; case FUNC_BIT_LENGTH : name = Tokens.T_BIT_LENGTH; parseList = singleParamList; break; case FUNC_OCTET_LENGTH : name = Tokens.T_OCTET_LENGTH; parseList = singleParamList; break; case FUNC_CARDINALITY : name = Tokens.T_CARDINALITY; parseList = singleParamList; break; case FUNC_MAX_CARDINALITY : name = Tokens.T_MAX_CARDINALITY; parseList = singleParamList; break; case FUNC_TRIM_ARRAY : name = Tokens.T_TRIM_ARRAY; parseList = doubleParamList; break; case FUNC_ABS : name = Tokens.T_ABS; parseList = singleParamList; break; case FUNC_MOD : name = Tokens.T_MOD; parseList = doubleParamList; break; case FUNC_LN : name = Tokens.T_LN; parseList = singleParamList; break; case FUNC_EXP : name = Tokens.T_EXP; parseList = singleParamList; break; case FUNC_POWER : name = Tokens.T_POWER; parseList = doubleParamList; break; case FUNC_SQRT : name = Tokens.T_SQRT; parseList = singleParamList; break; case FUNC_FLOOR : name = Tokens.T_FLOOR; parseList = singleParamList; break; case FUNC_CEILING : name = Tokens.T_CEILING; parseList = singleParamList; break; case FUNC_WIDTH_BUCKET : name = Tokens.T_WIDTH_BUCKET; parseList = quadParamList; break; case FUNC_SUBSTRING_CHAR : case FUNC_SUBSTRING_BINARY : name = Tokens.T_SUBSTRING; parseList = new short[] { Tokens.OPENBRACKET, Tokens.QUESTION, Tokens.FROM, Tokens.QUESTION, Tokens.X_OPTION, 2, Tokens.FOR, Tokens.QUESTION, Tokens.X_OPTION, 5, Tokens.USING, Tokens.X_KEYSET, 2, Tokens.CHARACTERS, Tokens.OCTETS, Tokens.CLOSEBRACKET }; parseListAlt = new short[] { Tokens.OPENBRACKET, Tokens.QUESTION, Tokens.COMMA, Tokens.QUESTION, Tokens.X_OPTION, 2, Tokens.COMMA, Tokens.QUESTION, Tokens.CLOSEBRACKET }; break; /* case FUNCTION_SUBSTRING_REG_EXPR : break; case FUNCTION_SUBSTRING_REGEX : break; */ case FUNC_FOLD_LOWER : name = Tokens.T_LOWER; parseList = singleParamList; break; case FUNC_FOLD_UPPER : name = Tokens.T_UPPER; parseList = singleParamList; break; /* case FUNCTION_TRANSCODING : break; case FUNCTION_TRANSLITERATION : break; case FUNCTION_REGEX_TRANSLITERATION : break; */ case FUNC_TRIM_CHAR : case FUNC_TRIM_BINARY : name = Tokens.T_TRIM; parseList = new short[] { Tokens.OPENBRACKET, Tokens.X_OPTION, 11, // Tokens.X_OPTION, 5, // Tokens.X_KEYSET, 3, Tokens.LEADING, Tokens.TRAILING, Tokens.BOTH, // Tokens.X_OPTION, 1, Tokens.QUESTION, // Tokens.FROM, Tokens.QUESTION, Tokens.CLOSEBRACKET }; break; /* case FUNCTION_CHAR_NORMALIZE : break; */ case FUNC_OVERLAY_CHAR : case FUNC_OVERLAY_BINARY : name = Tokens.T_OVERLAY; parseList = new short[] { Tokens.OPENBRACKET, Tokens.QUESTION, Tokens.PLACING, Tokens.QUESTION, Tokens.FROM, Tokens.QUESTION, Tokens.X_OPTION, 2, Tokens.FOR, Tokens.QUESTION, Tokens.X_OPTION, 2, Tokens.USING, Tokens.CHARACTERS, Tokens.CLOSEBRACKET }; break; case FUNC_CURRENT_CATALOG : name = Tokens.T_CURRENT_CATALOG; parseList = noParamList; break; /* case FUNC_CURRENT_DEFAULT_TRANSFORM_GROUP : break; case FUNC_CURRENT_PATH : break; */ case FUNC_CURRENT_ROLE : name = Tokens.T_CURRENT_ROLE; parseList = noParamList; break; case FUNC_CURRENT_SCHEMA : name = Tokens.T_CURRENT_SCHEMA; parseList = noParamList; break; /* case FUNC_CURRENT_TRANSFORM_GROUP_FOR_TYPE : break; */ case FUNC_CURRENT_USER : name = Tokens.T_CURRENT_USER; parseList = noParamList; break; case FUNC_SESSION_USER : name = Tokens.T_SESSION_USER; parseList = noParamList; break; case FUNC_SYSTEM_USER : name = Tokens.T_SYSTEM_USER; parseList = noParamList; break; case FUNC_USER : name = Tokens.T_USER; parseList = optionalNoParamList; break; case FUNC_VALUE : name = Tokens.T_VALUE; parseList = noParamList; break; case FUNC_CURRENT_DATE : name = Tokens.T_CURRENT_DATE; parseList = noParamList; break; case FUNC_CURRENT_TIME : name = Tokens.T_CURRENT_TIME; parseList = optionalIntegerParamList; break; case FUNC_CURRENT_TIMESTAMP : name = Tokens.T_CURRENT_TIMESTAMP; parseList = optionalIntegerParamList; break; case FUNC_LOCALTIME : name = Tokens.T_LOCALTIME; parseList = optionalIntegerParamList; break; case FUNC_LOCALTIMESTAMP : name = Tokens.T_LOCALTIMESTAMP; parseList = optionalIntegerParamList; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "FunctionSQL"); } } public void setArguments(Expression[] newNodes) { this.nodes = newNodes; } public Expression getFunctionExpression() { return this; } /** * Evaluates and returns this Function in the context of the session.

*/ public Object getValue(Session session) { Object[] data = new Object[nodes.length]; for (int i = 0; i < nodes.length; i++) { Expression e = nodes[i]; if (e != null) { data[i] = e.getValue(session, e.dataType); } } return getValue(session, data); } Object getValue(Session session, Object[] data) { switch (funcType) { case FUNC_POSITION_CHAR : { if (data[0] == null || data[1] == null) { return null; } long offset = 0; if (nodes.length > 3 && nodes[3] != null) { Object value = nodes[3].getValue(session); offset = ((Number) value).longValue() - 1; if (offset < 0) { offset = 0; } } long result = ((CharacterType) nodes[1].dataType).position( session, data[1], data[0], nodes[0].dataType, offset) + 1; if (nodes[2] != null && ((Number) nodes[2].valueData).intValue() == Tokens.OCTETS) { result *= 2; } return ValuePool.getLong(result); } case FUNC_POSITION_BINARY : { if (data[0] == null || data[1] == null) { return null; } long result = ((BinaryType) nodes[1].dataType).position( session, (BlobData) data[1], (BlobData) data[0], nodes[0].dataType, 0) + 1; if (nodes[2] != null && ((Number) nodes[2].valueData).intValue() == Tokens.OCTETS) { result *= 2; } return ValuePool.getLong(result); } /* case FUNC_OCCURENCES_REGEX : case FUNC_POSITION_REGEX : */ case FUNC_EXTRACT : { if (data[1] == null) { return null; } int part = ((Number) nodes[0].valueData).intValue(); part = DTIType.getFieldNameTypeForToken(part); switch (part) { case Types.SQL_INTERVAL_SECOND : { return ((DTIType) nodes[1].dataType).getSecondPart( data[1]); } case DTIType.MONTH_NAME : case DTIType.DAY_NAME : { return ((DateTimeType) nodes[1].dataType) .getPartString(session, data[1], part); } default : { int value = ((DTIType) nodes[1].dataType).getPart(session, data[1], part); return ValuePool.getInt(value); } } } case FUNC_CHAR_LENGTH : { if (data[0] == null) { return null; } long result = ((CharacterType) nodes[0].dataType).size(session, data[0]); return ValuePool.getLong(result); } case FUNC_BIT_LENGTH : { if (data[0] == null) { return null; } long result; if (nodes[0].dataType.isBinaryType()) { result = ((BlobData) data[0]).bitLength(session); } else { result = 16 * ((CharacterType) nodes[0].dataType).size(session, data[0]); } return ValuePool.getLong(result); } case FUNC_OCTET_LENGTH : { if (data[0] == null) { return null; } long result; if (nodes[0].dataType.isBinaryType()) { result = ((BlobData) data[0]).length(session); } else { result = 2 * ((CharacterType) nodes[0].dataType).size(session, data[0]); } return ValuePool.getLong(result); } case FUNC_CARDINALITY : { if (data[0] == null) { return null; } int result = nodes[0].dataType.cardinality(session, data[0]); return ValuePool.getInt(result); } case FUNC_MAX_CARDINALITY : { if (data[0] == null) { return null; } int result = nodes[0].dataType.arrayLimitCardinality(); return ValuePool.getInt(result); } case FUNC_TRIM_ARRAY : { if (data[0] == null) { return null; } if (data[1] == null) { return null; } Object[] array = (Object[]) data[0]; int length = ((Number) data[1]).intValue(); if (length < 0 || length > array.length) { throw Error.error(ErrorCode.X_2202E); } Object[] newArray = new Object[array.length - length]; System.arraycopy(array, 0, newArray, 0, newArray.length); return newArray; } case FUNC_ABS : { if (data[0] == null) { return null; } return dataType.absolute(data[0]); } case FUNC_MOD : { if (data[0] == null || data[1] == null) { return null; } // result type is the same as nodes[1] Object value = ((NumberType) nodes[0].dataType).modulo(data[0], data[1], nodes[0].dataType); return dataType.convertToType(session, value, nodes[0].dataType); } case FUNC_LN : { if (data[0] == null) { return null; } double d = ((Number) data[0]).doubleValue(); if (d <= 0) { throw Error.error(ErrorCode.X_2201E); } d = Math.log(d); return ValuePool.getDouble(Double.doubleToLongBits(d)); } case FUNC_EXP : { if (data[0] == null) { return null; } double val = Math.exp(((Number) data[0]).doubleValue()); return ValuePool.getDouble(Double.doubleToLongBits(val)); } case FUNC_POWER : { if (data[0] == null || data[1] == null) { return null; } double base = ((Number) data[0]).doubleValue(); double exponent = ((Number) data[1]).doubleValue(); double val; if (base == 0) { if (exponent < 0) { throw Error.error(ErrorCode.X_2201F); } else if (exponent == 0) { val = 1; } else { val = 0; } } else { val = Math.pow(base, exponent); } return ValuePool.getDouble(Double.doubleToLongBits(val)); } case FUNC_SQRT : { if (data[0] == null) { return null; } double val = Math.sqrt(((Number) data[0]).doubleValue()); return ValuePool.getDouble(Double.doubleToLongBits(val)); } case FUNC_FLOOR : { if (data[0] == null) { return null; } return ((NumberType) dataType).floor(data[0]); } case FUNC_CEILING : { if (data[0] == null) { return null; } return ((NumberType) dataType).ceiling(data[0]); } case FUNC_WIDTH_BUCKET : { for (int i = 0; i < data.length; i++) { if (data[i] == null) { return null; } } if (((NumberType) nodes[3].dataType).isNegative(data[3])) { throw Error.error(ErrorCode.X_2201G); } int compare = nodes[1].dataType.compare(session, data[1], data[2]); Type subType; Object temp; Object temp2; if (nodes[0].dataType.isNumberType()) { subType = nodes[0].dataType; } else { subType = nodes[0].dataType.getCombinedType(session, nodes[0].dataType, OpTypes.SUBTRACT); } switch (compare) { case 0 : throw Error.error(ErrorCode.X_2201G); case -1 : { if (nodes[0].dataType.compare( session, data[0], data[1]) < 0) { return ValuePool.INTEGER_0; } if (nodes[0].dataType.compare( session, data[0], data[2]) >= 0) { return dataType.add(data[3], ValuePool.INTEGER_1, Type.SQL_INTEGER); } temp = subType.subtract(data[0], data[1], nodes[0].dataType); temp2 = subType.subtract(data[2], data[1], nodes[0].dataType); break; } case 1 : { if (nodes[0].dataType.compare( session, data[0], data[1]) > 0) { return ValuePool.INTEGER_0; } if (nodes[0].dataType.compare( session, data[0], data[2]) <= 0) { return dataType.add(data[3], ValuePool.INTEGER_1, Type.SQL_INTEGER); } temp = subType.subtract(data[1], data[0], nodes[0].dataType); temp2 = subType.subtract(data[1], data[2], nodes[0].dataType); break; } default : throw Error.runtimeError(ErrorCode.U_S0500, ""); } Type opType; if (subType.typeCode == Types.SQL_DOUBLE) { opType = subType; } else { opType = IntervalType.factorType; temp = opType.convertToType(session, temp, subType); temp2 = opType.convertToType(session, temp2, subType); } temp = opType.multiply(temp, data[3]); temp = opType.divide(session, temp, temp2); temp = dataType.convertToDefaultType(session, temp); return dataType.add(temp, ValuePool.INTEGER_1, Type.SQL_INTEGER); } case FUNC_SUBSTRING_CHAR : { if (data[0] == null || data[1] == null) { return null; } Object value; value = Type.SQL_BIGINT.convertToType(session, data[1], nodes[1].dataType); long offset = ((Number) value).longValue() - 1; long length = 0; if (nodes[2] != null) { if (data[2] == null) { return null; } value = Type.SQL_BIGINT.convertToType(session, data[2], nodes[2].dataType); length = ((Number) value).longValue(); } if (nodes.length > 3 && nodes[3] != null && ((Number) nodes[2].valueData).intValue() == Tokens.OCTETS) { // not clear what the rules on USING OCTECTS are with UTF } return ((CharacterType) dataType).substring(session, data[0], offset, length, nodes[2] != null, false); } /* case FUNCTION_SUBSTRING_REG_EXPR : break; case FUNCTION_SUBSTRING_REGEX : break; */ case FUNC_FOLD_LOWER : if (data[0] == null) { return null; } return ((CharacterType) dataType).lower(session, data[0]); case FUNC_FOLD_UPPER : if (data[0] == null) { return null; } return ((CharacterType) dataType).upper(session, data[0]); /* case FUNCTION_TRANSCODING : break; case FUNCTION_TRANSLITERATION : break; case FUNCTION_REGEX_TRANSLITERATION : break; */ case FUNC_TRIM_CHAR : { if (data[1] == null || data[2] == null) { return null; } boolean leading = false; boolean trailing = false; switch (((Number) nodes[0].valueData).intValue()) { case Tokens.BOTH : leading = trailing = true; break; case Tokens.LEADING : leading = true; break; case Tokens.TRAILING : trailing = true; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "FunctionSQL"); } String string = (String) data[1]; if (string.length() != 1) { throw Error.error(ErrorCode.X_22027); } int character = string.charAt(0); return ((CharacterType) dataType).trim(session, data[2], character, leading, trailing); } case FUNC_OVERLAY_CHAR : { if (data[0] == null || data[1] == null || data[2] == null) { return null; } Object value; value = Type.SQL_BIGINT.convertToType(session, data[2], nodes[2].dataType); long offset = ((Number) value).longValue() - 1; long length = 0; if (nodes[3] != null) { if (data[3] == null) { return null; } value = Type.SQL_BIGINT.convertToType(session, data[3], nodes[3].dataType); length = ((Number) value).longValue(); } return ((CharacterType) dataType).overlay(null, data[0], data[1], offset, length, nodes[3] != null); } /* case FUNCTION_CHAR_NORMALIZE : break; */ case FUNC_SUBSTRING_BINARY : { if (data[0] == null || data[1] == null) { return null; } Object value; value = Type.SQL_BIGINT.convertToType(session, data[1], nodes[1].dataType); long offset = ((Number) value).longValue() - 1; long length = 0; if (nodes[2] != null) { if (data[2] == null) { return null; } value = Type.SQL_BIGINT.convertToType(session, data[2], nodes[2].dataType); length = ((Number) value).intValue(); } return ((BinaryType) dataType).substring(session, (BlobData) data[0], offset, length, nodes[2] != null); } case FUNC_TRIM_BINARY : { if (data[1] == null || data[2] == null) { return null; } boolean leading = false; boolean trailing = false; int spec = ((Number) nodes[0].valueData).intValue(); switch (spec) { case Tokens.BOTH : leading = trailing = true; break; case Tokens.LEADING : leading = true; break; case Tokens.TRAILING : trailing = true; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "FunctionSQL"); } BlobData string = (BlobData) data[1]; if (string.length(session) != 1) { throw Error.error(ErrorCode.X_22027); } byte[] bytes = string.getBytes(); return ((BinaryType) dataType).trim(session, (BlobData) data[2], bytes[0], leading, trailing); } case FUNC_OVERLAY_BINARY : { if (data[0] == null || data[1] == null || data[2] == null) { return null; } Object value; value = Type.SQL_BIGINT.convertToType(session, data[2], nodes[2].dataType); long offset = ((Number) value).longValue() - 1; long length = 0; if (nodes[3] != null) { if (data[3] == null) { return null; } value = Type.SQL_BIGINT.convertToType(session, data[3], nodes[3].dataType); length = ((Number) value).longValue(); } return ((BinaryType) dataType).overlay(session, (BlobData) data[0], (BlobData) data[1], offset, length, nodes[3] != null); } case FUNC_CURRENT_CATALOG : return session.database.getCatalogName().name; /* case FUNC_CURRENT_DEFAULT_TRANSFORM_GROUP : case FUNC_CURRENT_PATH : */ case FUNC_CURRENT_ROLE : return session.getRole() == null ? null : session.getRole().getName() .getNameString(); case FUNC_CURRENT_SCHEMA : return session.getCurrentSchemaHsqlName().name; /* case FUNC_CURRENT_TRANSFORM_GROUP_FOR_TYPE : */ case FUNC_CURRENT_USER : return session.getUser().getName().getNameString(); case FUNC_SESSION_USER : return session.getUser().getName().getNameString(); case FUNC_SYSTEM_USER : return session.getUser().getName().getNameString(); case FUNC_USER : return session.getUser().getName().getNameString(); case FUNC_VALUE : return session.sessionData.currentValue; case FUNC_CURRENT_DATE : return session.getCurrentDate(); case FUNC_CURRENT_TIME : return dataType.convertToTypeLimits( session, session.getCurrentTime(true)); case FUNC_CURRENT_TIMESTAMP : return dataType.convertToTypeLimits( session, session.getCurrentTimestamp(true)); case FUNC_LOCALTIME : return dataType.convertToTypeLimits( session, session.getCurrentTime(false)); case FUNC_LOCALTIMESTAMP : return dataType.convertToTypeLimits( session, session.getCurrentTimestamp(false)); default : throw Error.runtimeError(ErrorCode.U_S0500, "FunctionSQL"); } } public void resolveTypes(Session session, Expression parent) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { nodes[i].resolveTypes(session, this); } } switch (funcType) { case FUNC_POSITION_CHAR : case FUNC_POSITION_BINARY : { if (nodes[0].dataType == null) { if (nodes[1].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (nodes[1].dataType.typeCode == Types.SQL_CLOB || nodes[1].dataType.isBinaryType()) { nodes[0].dataType = nodes[1].dataType; } else { nodes[0].dataType = Type.SQL_VARCHAR; } } if (nodes[1].dataType == null) { if (nodes[0].dataType.typeCode == Types.SQL_CLOB || nodes[0].dataType.isBinaryType()) { nodes[1].dataType = nodes[0].dataType; } else { nodes[1].dataType = Type.SQL_VARCHAR; } } if (nodes[0].dataType.isCharacterType() && nodes[1].dataType.isCharacterType()) { funcType = FUNC_POSITION_CHAR; } else if (nodes[0].dataType.isBinaryType() && nodes[1].dataType.isBinaryType()) { if (nodes[0].dataType.isBitType() || nodes[1].dataType.isBitType()) { throw Error.error(ErrorCode.X_42563); } funcType = FUNC_POSITION_BINARY; } else { throw Error.error(ErrorCode.X_42563); } if (nodes.length > 3 && nodes[3] != null) { if (nodes[3].isDynamicParam()) { nodes[3].dataType = Type.SQL_BIGINT; } if (!nodes[3].dataType.isNumberType()) { throw Error.error(ErrorCode.X_42563); } } dataType = Type.SQL_BIGINT; break; } /* case FUNC_OCCURENCES_REGEX : case FUNC_POSITION_REGEX : */ case FUNC_EXTRACT : { if (nodes[1].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (!nodes[1].dataType.isDateTimeType() && !nodes[1].dataType.isIntervalType()) { throw Error.error(ErrorCode.X_42563); } int part = ((Number) nodes[0].valueData).intValue(); DTIType type = (DTIType) nodes[1].dataType; part = DTIType.getFieldNameTypeForToken(part); dataType = type.getExtractType(part); break; } case FUNC_BIT_LENGTH : { if (nodes[0].dataType == null) { nodes[0].dataType = Type.SQL_BIT_VARYING_MAX_LENGTH; } if (!nodes[0].dataType.isCharacterType() && !nodes[0].dataType.isBinaryType()) { throw Error.error(ErrorCode.X_42563); } dataType = Type.SQL_BIGINT; break; } case FUNC_CHAR_LENGTH : if (nodes[0].dataType == null) { nodes[0].dataType = Type.SQL_VARCHAR; } if (!nodes[0].dataType.isCharacterType()) { throw Error.error(ErrorCode.X_42563); } // fall through case FUNC_OCTET_LENGTH : { if (nodes[0].dataType == null) { nodes[0].dataType = Type.SQL_VARCHAR; } if (!nodes[0].dataType.isCharacterType() && !nodes[0].dataType.isBinaryType()) { throw Error.error(ErrorCode.X_42563); } dataType = Type.SQL_BIGINT; break; } case FUNC_CARDINALITY : { if (nodes[0].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (!nodes[0].dataType.isArrayType()) { throw Error.error(ErrorCode.X_42563); } dataType = Type.SQL_INTEGER; break; } case FUNC_MAX_CARDINALITY : { if (nodes[0].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (!nodes[0].dataType.isArrayType()) { throw Error.error(ErrorCode.X_42563); } dataType = Type.SQL_INTEGER; break; } case FUNC_TRIM_ARRAY : { if (nodes[0].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (!nodes[0].dataType.isArrayType()) { throw Error.error(ErrorCode.X_42563); } if (nodes[1].dataType == null) { nodes[1].dataType = Type.SQL_INTEGER; } if (!nodes[1].dataType.isIntegralType()) { throw Error.error(ErrorCode.X_42563); } dataType = nodes[0].dataType; break; } case FUNC_MOD : { if (nodes[0].dataType == null) { nodes[0].dataType = nodes[1].dataType; } if (nodes[1].dataType == null) { nodes[1].dataType = nodes[0].dataType; } if (nodes[0].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (!nodes[0].dataType.isNumberType() || !nodes[1].dataType.isNumberType()) { throw Error.error(ErrorCode.X_42563); } nodes[0].dataType = ((NumberType) nodes[0].dataType).getIntegralType(); nodes[1].dataType = ((NumberType) nodes[1].dataType).getIntegralType(); dataType = nodes[1].dataType; break; } case FUNC_POWER : { if (nodes[0].dataType == null) { nodes[0].dataType = nodes[1].dataType; } if (nodes[1].dataType == null) { nodes[1].dataType = nodes[0].dataType; } if (nodes[0].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (!nodes[0].dataType.isNumberType() || !nodes[1].dataType.isNumberType()) { throw Error.error(ErrorCode.X_42563); } nodes[0].dataType = Type.SQL_DOUBLE; nodes[1].dataType = Type.SQL_DOUBLE; dataType = Type.SQL_DOUBLE; break; } case FUNC_LN : case FUNC_EXP : case FUNC_SQRT : { if (nodes[0].dataType == null) { nodes[0].dataType = Type.SQL_DOUBLE; } if (!nodes[0].dataType.isNumberType()) { throw Error.error(ErrorCode.X_42563); } nodes[0].dataType = Type.SQL_DOUBLE; dataType = Type.SQL_DOUBLE; break; } case FUNC_ABS : if (nodes[0].dataType != null && nodes[0].dataType.isIntervalType()) { dataType = nodes[0].dataType; break; } // fall through case FUNC_FLOOR : case FUNC_CEILING : { if (nodes[0].dataType == null) { nodes[0].dataType = Type.SQL_DOUBLE; } if (!nodes[0].dataType.isNumberType()) { throw Error.error(ErrorCode.X_42563); } dataType = nodes[0].dataType; if (dataType.typeCode == Types.SQL_DECIMAL || dataType.typeCode == Types.SQL_NUMERIC) { if (dataType.scale > 0) { dataType = NumberType.getNumberType(dataType.typeCode, dataType.precision + 1, 0); } } break; } case FUNC_WIDTH_BUCKET : { nodes[0].dataType = Type.getAggregateType(nodes[0].dataType, nodes[1].dataType); nodes[0].dataType = Type.getAggregateType(nodes[0].dataType, nodes[2].dataType); if (nodes[0].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (!nodes[0].dataType.isNumberType() && !nodes[0].dataType.isDateTimeType()) { throw Error.error(ErrorCode.X_42563); } nodes[1].dataType = nodes[0].dataType; nodes[2].dataType = nodes[0].dataType; if (nodes[3].dataType == null) { nodes[3].dataType = Type.SQL_INTEGER; } if (!nodes[3].dataType.isIntegralType()) { throw Error.error(ErrorCode.X_42563); } dataType = nodes[3].dataType; break; } case FUNC_SUBSTRING_CHAR : case FUNC_SUBSTRING_BINARY : { if (nodes[0].dataType == null) { // in 20.6 parameter not allowed as type cannot be determined as binary or char // throw Error.error(ErrorCode.X_42567); nodes[0].dataType = Type.SQL_VARCHAR_DEFAULT; } if (nodes[1].dataType == null) { nodes[1].dataType = Type.SQL_NUMERIC; } if (!nodes[1].dataType.isNumberType()) { throw Error.error(ErrorCode.X_42563); } if (nodes[2] != null) { if (nodes[2].dataType == null) { nodes[2].dataType = Type.SQL_NUMERIC; } if (!nodes[2].dataType.isNumberType()) { throw Error.error(ErrorCode.X_42563); } nodes[2].dataType = ((NumberType) nodes[2].dataType).getIntegralType(); } dataType = nodes[0].dataType; if (dataType.isCharacterType()) { funcType = FUNC_SUBSTRING_CHAR; if (dataType.typeCode == Types.SQL_CHAR) { dataType = CharacterType.getCharacterType( Types.SQL_VARCHAR, dataType.precision, dataType.getCollation()); } } else if (dataType.isBinaryType()) { funcType = FUNC_SUBSTRING_BINARY; } else { throw Error.error(ErrorCode.X_42563); } if (nodes.length > 3 && nodes[3] != null) { // always boolean constant if defined } break; } /* case FUNCTION_SUBSTRING_REG_EXPR : break; case FUNCTION_SUBSTRING_REGEX : break; */ case FUNC_FOLD_LOWER : case FUNC_FOLD_UPPER : if (nodes[0].dataType == null) { nodes[0].dataType = Type.SQL_VARCHAR_DEFAULT; } dataType = nodes[0].dataType; if (!dataType.isCharacterType()) { throw Error.error(ErrorCode.X_42563); } break; /* case FUNCTION_TRANSCODING : break; case FUNCTION_TRANSLITERATION : break; case FUNCTION_REGEX_TRANSLITERATION : break; */ case FUNC_TRIM_CHAR : case FUNC_TRIM_BINARY : if (nodes[0] == null) { nodes[0] = new ExpressionValue(ValuePool.getInt(Tokens.BOTH), Type.SQL_INTEGER); } if (nodes[2].dataType == null) { nodes[2].dataType = Type.SQL_VARCHAR_DEFAULT; } dataType = nodes[2].dataType; if (dataType.isCharacterType()) { funcType = FUNC_TRIM_CHAR; if (dataType.typeCode == Types.SQL_CHAR) { dataType = CharacterType.getCharacterType( Types.SQL_VARCHAR, dataType.precision, dataType.getCollation()); } if (nodes[1] == null) { nodes[1] = new ExpressionValue(" ", Type.SQL_CHAR); } } else if (dataType.isBinaryType()) { funcType = FUNC_TRIM_BINARY; if (nodes[1] == null) { nodes[1] = new ExpressionValue( new BinaryData(new byte[]{ 0 }, false), Type.SQL_BINARY); } } else { throw Error.error(ErrorCode.X_42563); } break; case FUNC_OVERLAY_CHAR : case FUNC_OVERLAY_BINARY : { if (nodes[0].dataType == null) { if (nodes[1].dataType == null) { nodes[0].dataType = nodes[1].dataType = Type.SQL_VARCHAR_DEFAULT; // throw Error.error(ErrorCode.X_42567); } if (nodes[1].dataType.typeCode == Types.SQL_CLOB || nodes[1].dataType.isBinaryType()) { nodes[0].dataType = nodes[1].dataType; } else { nodes[0].dataType = Type.SQL_VARCHAR_DEFAULT; } } if (nodes[1].dataType == null) { if (nodes[0].dataType.typeCode == Types.SQL_CLOB || nodes[0].dataType.isBinaryType()) { nodes[1].dataType = nodes[0].dataType; } else { nodes[1].dataType = Type.SQL_VARCHAR_DEFAULT; } } if (nodes[0].dataType.isCharacterType() && nodes[1].dataType.isCharacterType()) { funcType = FUNC_OVERLAY_CHAR; if (nodes[0].dataType.typeCode == Types.SQL_CLOB || nodes[1].dataType.typeCode == Types.SQL_CLOB) { dataType = CharacterType .getCharacterType(Types.SQL_CLOB, nodes[0].dataType.precision + nodes[1].dataType .precision, nodes[0] .dataType .getCollation()); } else { dataType = CharacterType .getCharacterType(Types.SQL_VARCHAR, nodes[0].dataType.precision + nodes[1].dataType .precision, nodes[0] .dataType .getCollation()); } } else if (nodes[0].dataType.isBinaryType() && nodes[1].dataType.isBinaryType()) { funcType = FUNC_OVERLAY_BINARY; if (nodes[0].dataType.typeCode == Types.SQL_BLOB || nodes[1].dataType.typeCode == Types.SQL_BLOB) { dataType = BinaryType.getBinaryType( Types.SQL_BLOB, nodes[0].dataType.precision + nodes[1].dataType.precision); } else { dataType = BinaryType.getBinaryType( Types.SQL_VARBINARY, nodes[0].dataType.precision + nodes[1].dataType.precision); } } else { throw Error.error(ErrorCode.X_42563); } if (nodes[2].dataType == null) { nodes[2].dataType = Type.SQL_NUMERIC; } if (!nodes[2].dataType.isNumberType()) { throw Error.error(ErrorCode.X_42563); } nodes[2].dataType = ((NumberType) nodes[2].dataType).getIntegralType(); if (nodes[3] != null) { if (nodes[3].dataType == null) { nodes[3].dataType = Type.SQL_NUMERIC; } if (!nodes[3].dataType.isNumberType()) { throw Error.error(ErrorCode.X_42563); } nodes[3].dataType = ((NumberType) nodes[3].dataType).getIntegralType(); } break; } /* case FUNCTION_CHAR_NORMALIZE : break; */ case FUNC_CURRENT_CATALOG : case FUNC_CURRENT_DEFAULT_TRANSFORM_GROUP : case FUNC_CURRENT_PATH : case FUNC_CURRENT_ROLE : case FUNC_CURRENT_SCHEMA : case FUNC_CURRENT_TRANSFORM_GROUP_FOR_TYPE : case FUNC_CURRENT_USER : case FUNC_SESSION_USER : case FUNC_SYSTEM_USER : case FUNC_USER : dataType = TypeInvariants.SQL_IDENTIFIER; break; case FUNC_VALUE : break; case FUNC_CURRENT_DATE : dataType = CharacterType.SQL_DATE; break; case FUNC_CURRENT_TIME : { int precision = DateTimeType.defaultTimeFractionPrecision; if (nodes[0] != null) { precision = ((Integer) nodes[0].valueData).intValue(); } dataType = DateTimeType.getDateTimeType(Types.SQL_TIME_WITH_TIME_ZONE, precision); break; } case FUNC_CURRENT_TIMESTAMP : { int precision = DateTimeType.defaultTimestampFractionPrecision; if (nodes.length > 0 && nodes[0] != null) { precision = ((Integer) nodes[0].valueData).intValue(); } dataType = DateTimeType.getDateTimeType( Types.SQL_TIMESTAMP_WITH_TIME_ZONE, precision); break; } case FUNC_LOCALTIME : { int precision = DateTimeType.defaultTimeFractionPrecision; if (nodes.length > 0 && nodes[0] != null) { precision = ((Integer) nodes[0].valueData).intValue(); } dataType = DateTimeType.getDateTimeType(Types.SQL_TIME, precision); break; } case FUNC_LOCALTIMESTAMP : { int precision = DateTimeType.defaultTimestampFractionPrecision; if (nodes.length > 0 && nodes[0] != null) { precision = ((Integer) nodes[0].valueData).intValue(); } dataType = DateTimeType.getDateTimeType(Types.SQL_TIMESTAMP, precision); break; } default : throw Error.runtimeError(ErrorCode.U_S0500, "FunctionSQL"); } } public String getSQL() { StringBuffer sb = new StringBuffer(); switch (funcType) { case FUNC_POSITION_CHAR : case FUNC_POSITION_BINARY : { sb.append(Tokens.T_POSITION).append('(') // .append(nodes[0].getSQL()).append(' ') // .append(Tokens.T_IN).append(' ') // .append(nodes[1].getSQL()); if (nodes[2] != null && Boolean.TRUE.equals(nodes[2].valueData)) { sb.append(' ').append(Tokens.T_USING).append(' ').append( Tokens.T_OCTETS); } sb.append(')'); break; } case FUNC_OCCURENCES_REGEX : break; case FUNC_POSITION_REGEX : break; case FUNC_EXTRACT : { int type = ((Integer) nodes[0].valueData).intValue(); type = DTIType.getFieldNameTypeForToken(type); String token = DTIType.getFieldNameTokenForType(type); sb.append(Tokens.T_EXTRACT).append('(').append(token) // .append(' ').append(Tokens.T_FROM).append(' ') // .append(nodes[1].getSQL()).append(')'); break; } case FUNC_CHAR_LENGTH : { sb.append(Tokens.T_CHAR_LENGTH).append('(') // .append(nodes[0].getSQL()).append(')'); break; } case FUNC_BIT_LENGTH : { sb.append(Tokens.T_BIT_LENGTH).append('(') // .append(nodes[0].getSQL()).append(')'); break; } case FUNC_OCTET_LENGTH : { sb.append(Tokens.T_OCTET_LENGTH).append('(') // .append(nodes[0].getSQL()).append(')'); break; } case FUNC_CARDINALITY : { sb.append(Tokens.T_CARDINALITY).append('(') // .append(nodes[0].getSQL()).append(')'); break; } case FUNC_MAX_CARDINALITY : { sb.append(Tokens.T_MAX_CARDINALITY).append('(') // .append(nodes[0].getSQL()).append(')'); break; } case FUNC_TRIM_ARRAY : { sb.append(Tokens.T_TRIM_ARRAY).append('(') // .append(nodes[0].getSQL()).append(',') // .append(nodes[1].getSQL()).append(')'); // break; } case FUNC_ABS : { sb.append(Tokens.T_ABS).append('(') // .append(nodes[0].getSQL()).append(')'); break; } case FUNC_MOD : { sb.append(Tokens.T_MOD).append('(') // .append(nodes[0].getSQL()).append(',') // .append(nodes[1].getSQL()).append(')'); break; } case FUNC_LN : { sb.append(Tokens.T_LN).append('(') // .append(nodes[0].getSQL()).append(')'); break; } case FUNC_EXP : { sb.append(Tokens.T_EXP).append('(') // .append(nodes[0].getSQL()).append(')'); break; } case FUNC_POWER : { sb.append(Tokens.T_POWER).append('(') // .append(nodes[0].getSQL()).append(',') // .append(nodes[1].getSQL()).append(')'); break; } case FUNC_SQRT : { sb.append(Tokens.T_SQRT).append('(') // .append(nodes[0].getSQL()).append(')'); break; } case FUNC_FLOOR : { sb.append(Tokens.T_FLOOR).append('(') // .append(nodes[0].getSQL()).append(')'); break; } case FUNC_CEILING : { sb.append(Tokens.T_CEILING).append('(') // .append(nodes[0].getSQL()).append(')'); break; } case FUNC_WIDTH_BUCKET : { sb.append(Tokens.T_WIDTH_BUCKET).append('(') // .append(nodes[0].getSQL()).append(',') // .append(nodes[1].getSQL()).append(',') // .append(nodes[2].getSQL()).append(',') // .append(nodes[3].getSQL()).append(')'); break; } case FUNC_SUBSTRING_CHAR : case FUNC_SUBSTRING_BINARY : sb.append(Tokens.T_SUBSTRING).append('(') // .append(nodes[0].getSQL()).append(' ') // .append(Tokens.T_FROM).append(' ') // .append(nodes[1].getSQL()); if (nodes[2] != null) { sb.append(' ').append(Tokens.T_FOR).append(' ') // .append(nodes[2].getSQL()); } if (nodes.length > 3 && nodes[3] != null) { if (Boolean.TRUE.equals(nodes[3].valueData)) { sb.append(' ').append(Tokens.T_USING).append( ' ').append(Tokens.T_OCTETS); } } sb.append(')'); break; /* case FUNCTION_SUBSTRING_REGEX : break; */ case FUNC_FOLD_LOWER : sb.append(Tokens.T_LOWER).append('(').append( nodes[0].getSQL()).append(')'); break; case FUNC_FOLD_UPPER : sb.append(Tokens.T_UPPER).append('(').append( nodes[0].getSQL()).append(')'); break; /* case FUNCTION_TRANSCODING : break; case FUNCTION_TRANSLITERATION : break; case FUNCTION_REGEX_TRANSLITERATION : break; */ case FUNC_OVERLAY_CHAR : case FUNC_OVERLAY_BINARY : sb.append(Tokens.T_OVERLAY).append('(') // .append(nodes[0].getSQL()).append(' ') // .append(Tokens.T_PLACING).append(' ') // .append(nodes[1].getSQL()).append(' ') // .append(Tokens.T_FROM).append(' ') // .append(nodes[2].getSQL()); if (nodes[3] != null) { sb.append(' ').append(Tokens.T_FOR).append(' ').append( nodes[3].getSQL()); } if (nodes[4] != null) { if (Boolean.TRUE.equals(nodes[4].valueData)) { sb.append(' ').append(Tokens.T_USING).append( ' ').append(Tokens.T_OCTETS); } } sb.append(')'); break; /* case FUNCTION_NORMALIZE : break; */ case FUNC_TRIM_CHAR : case FUNC_TRIM_BINARY : String spec = null; switch (((Number) nodes[0].valueData).intValue()) { case Tokens.BOTH : spec = Tokens.T_BOTH; break; case Tokens.LEADING : spec = Tokens.T_LEADING; break; case Tokens.TRAILING : spec = Tokens.T_TRAILING; break; } sb.append(Tokens.T_TRIM).append('(') // .append(spec).append(' ') // .append(nodes[1].getSQL()).append(' ') // .append(Tokens.T_FROM).append(' ') // .append(nodes[2].getSQL()).append(')'); break; case FUNC_CURRENT_CATALOG : case FUNC_CURRENT_DEFAULT_TRANSFORM_GROUP : case FUNC_CURRENT_PATH : case FUNC_CURRENT_ROLE : case FUNC_CURRENT_SCHEMA : case FUNC_CURRENT_TRANSFORM_GROUP_FOR_TYPE : case FUNC_CURRENT_USER : case FUNC_SESSION_USER : case FUNC_SYSTEM_USER : case FUNC_USER : case FUNC_CURRENT_DATE : case FUNC_VALUE : return name; case FUNC_LOCALTIME : case FUNC_CURRENT_TIME : { int precision = DateTimeType.defaultTimeFractionPrecision; if (nodes.length > 0 && nodes[0] != null) { precision = ((Number) nodes[0].valueData).intValue(); } if (precision == DateTimeType.defaultTimeFractionPrecision) { return name; } sb.append(name).append(Tokens.T_OPENBRACKET).append(precision); sb.append(Tokens.T_CLOSEBRACKET); return sb.toString(); } case FUNC_LOCALTIMESTAMP : case FUNC_CURRENT_TIMESTAMP : { int precision = DateTimeType.defaultTimestampFractionPrecision; if (nodes.length > 0 && nodes[0] != null) { precision = ((Number) nodes[0].valueData).intValue(); } if (precision == DateTimeType.defaultTimestampFractionPrecision) { return name; } sb.append(name).append(Tokens.T_OPENBRACKET).append(precision); sb.append(Tokens.T_CLOSEBRACKET); return sb.toString(); } default : throw Error.runtimeError(ErrorCode.U_S0500, "FunctionSQL"); } return sb.toString(); } public boolean equals(Expression other) { if (other instanceof FunctionSQL && funcType == ((FunctionSQL) other).funcType) { return super.equals(other); } return false; } public int hashCode() { return opType + funcType; } /** * Returns a String representation of this object.

*/ public String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } sb.append("FUNCTION ").append("=[\n"); sb.append(name).append("("); for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } sb.append("[").append(nodes[i].describe(session, blanks)).append("]"); } sb.append(") returns ").append(dataType.getNameString()); sb.append("]\n"); return sb.toString(); } public boolean isDeterministic() { return isDeterministic; } public boolean isValueFunction() { return isSQLValueFunction; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Like.java0000644000175000017500000003155712007547376020513 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.lib.StringUtil; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobData; import org.hsqldb.types.CharacterType; import org.hsqldb.types.ClobData; import org.hsqldb.types.LobData; import org.hsqldb.types.Type; /** * Reusable object for processing LIKE queries. * * Enhanced in successive versions of HSQLDB. * * @author Thomas Mueller (Hypersonic SQL Group) * @version 2.0.1 * @since Hypersonic SQL */ // boucherb@users 20030930 - patch 1.7.2 - optimize into joins if possible // fredt@users 20031006 - patch 1.7.2 - reuse Like objects for all rows // fredt@users 1.9.0 - LIKE for binary strings // fredt@users 1.9.0 - CompareAt() changes for performance suggested by Gary Frost class Like implements Cloneable { private static final BinaryData maxByteValue = new BinaryData(new byte[]{ -128 }, false); private char[] cLike; private int[] wildCardType; private int iLen; private boolean isIgnoreCase; private int iFirstWildCard; private boolean isNull; int escapeChar; boolean hasCollation; static final int UNDERSCORE_CHAR = 1; static final int PERCENT_CHAR = 2; boolean isVariable = true; boolean isBinary = false; Type dataType; Like() {} void setParams(boolean collation) { hasCollation = collation; } void setIgnoreCase(boolean flag) { isIgnoreCase = flag; } private Object getStartsWith() { if (iLen == 0) { return isBinary ? (Object) BinaryData.zeroLengthBinary : ""; } StringBuffer sb = null; HsqlByteArrayOutputStream os = null; if (isBinary) { os = new HsqlByteArrayOutputStream(); } else { sb = new StringBuffer(); } int i = 0; for (; i < iLen && wildCardType[i] == 0; i++) { if (isBinary) { os.writeByte(cLike[i]); } else { sb.append(cLike[i]); } } if (i == 0) { return null; } return isBinary ? (Object) new BinaryData(os.toByteArray(), false) : sb.toString(); } Boolean compare(Session session, Object o) { if (o == null) { return null; } if (isNull) { return null; } int length = getLength(session, o); if (isIgnoreCase) { o = ((CharacterType) dataType).upper(session, o); } if (o instanceof ClobData) { o = ((ClobData) o).getChars(session, 0, (int) ((ClobData) o).length(session)); } return compareAt(o, 0, 0, iLen, length, cLike, wildCardType) ? Boolean.TRUE : Boolean.FALSE; } char getChar(Object o, int i) { char c; if (isBinary) { c = (char) ((BlobData) o).getBytes()[i]; } else { if (o instanceof char[]) { c = ((char[]) o)[i]; } else { c = ((String) o).charAt(i); } } return c; } int getLength(SessionInterface session, Object o) { int l; if (o instanceof LobData) { l = (int) ((LobData) o).length(session); } else { l = ((String) o).length(); } return l; } private boolean compareAt(Object o, int i, int j, int iLen, int jLen, char cLike[], int[] wildCardType) { for (; i < iLen; i++) { switch (wildCardType[i]) { case 0 : // general character if ((j >= jLen) || (cLike[i] != getChar(o, j++))) { return false; } break; case UNDERSCORE_CHAR : // underscore: do not test this character if (j++ >= jLen) { return false; } break; case PERCENT_CHAR : // percent: none or any character(s) if (++i >= iLen) { return true; } while (j < jLen) { if ((cLike[i] == getChar(o, j)) && compareAt(o, i, j, iLen, jLen, cLike, wildCardType)) { return true; } j++; } return false; } } if (j != jLen) { return false; } return true; } void setPattern(Session session, Object pattern, Object escape, boolean hasEscape) { isNull = pattern == null; if (!hasEscape) { escapeChar = -1; } else { if (escape == null) { isNull = true; return; } else { int length = getLength(session, escape); if (length != 1) { if (isBinary) { throw Error.error(ErrorCode.X_2200D); } else { throw Error.error(ErrorCode.X_22019); } } escapeChar = getChar(escape, 0); } } if (isNull) { return; } if (isIgnoreCase) { pattern = (String) ((CharacterType) dataType).upper(null, pattern); } iLen = 0; iFirstWildCard = -1; int l = getLength(session, pattern); cLike = new char[l]; wildCardType = new int[l]; boolean bEscaping = false, bPercent = false; for (int i = 0; i < l; i++) { char c = getChar(pattern, i); if (!bEscaping) { if (escapeChar == c) { bEscaping = true; continue; } else if (c == '_') { wildCardType[iLen] = UNDERSCORE_CHAR; if (iFirstWildCard == -1) { iFirstWildCard = iLen; } } else if (c == '%') { if (bPercent) { continue; } bPercent = true; wildCardType[iLen] = PERCENT_CHAR; if (iFirstWildCard == -1) { iFirstWildCard = iLen; } } else { bPercent = false; } } else { if (c == escapeChar || c == '_' || c == '%') { bPercent = false; bEscaping = false; } else { throw Error.error(ErrorCode.X_22025); } } cLike[iLen++] = c; } if (bEscaping) { throw Error.error(ErrorCode.X_22025); } for (int i = 0; i < iLen - 1; i++) { if ((wildCardType[i] == PERCENT_CHAR) && (wildCardType[i + 1] == UNDERSCORE_CHAR)) { wildCardType[i] = UNDERSCORE_CHAR; wildCardType[i + 1] = PERCENT_CHAR; } } } boolean isEquivalentToUnknownPredicate() { return !isVariable && isNull; } boolean isEquivalentToEqualsPredicate() { return !isVariable && iFirstWildCard == -1; } boolean isEquivalentToNotNullPredicate() { if (isVariable || isNull || iFirstWildCard == -1) { return false; } for (int i = 0; i < wildCardType.length; i++) { if (wildCardType[i] != PERCENT_CHAR) { return false; } } return true; } int getFirstWildCardIndex() { return iFirstWildCard; } Object getRangeLow() { return getStartsWith(); } Object getRangeHigh(Session session) { Object o = getStartsWith(); if (o == null) { return null; } if (isBinary) { return new BinaryData(session, (BinaryData) o, maxByteValue); } else { return dataType.concat(session, o, "\uffff"); } } public String describe(Session session) { StringBuffer sb = new StringBuffer(); sb.append(super.toString()).append("[\n"); sb.append("escapeChar=").append(escapeChar).append('\n'); sb.append("isNull=").append(isNull).append('\n'); // sb.append("optimised=").append(optimised).append('\n'); sb.append("isIgnoreCase=").append(isIgnoreCase).append('\n'); sb.append("iLen=").append(iLen).append('\n'); sb.append("iFirstWildCard=").append(iFirstWildCard).append('\n'); sb.append("cLike="); sb.append(StringUtil.arrayToString(cLike)); sb.append('\n'); sb.append("wildCardType="); sb.append(StringUtil.arrayToString(wildCardType)); sb.append(']'); return sb.toString(); } public Like duplicate() { try { return (Like) super.clone(); } catch (CloneNotSupportedException ex) { throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/RowAction.java0000644000175000017500000006574712007547352021536 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.persist.PersistentStore; /** * Represents the chain of insert / delete / rollback / commit actions on a row. * * @author Fred Toussi (fredt@users dot sourceforge dot net) * @version 2.2.9 * @since 2.0.0 */ public class RowAction extends RowActionBase { // final TableBase table; final PersistentStore store; Row memoryRow; long rowId; boolean isMemory; RowAction updatedAction; public static RowAction addInsertAction(Session session, TableBase table, Row row) { RowAction action = new RowAction(session, table, ACTION_INSERT, row, null); row.rowAction = action; return action; } public static RowAction addDeleteAction(Session session, TableBase table, Row row, int[] colMap) { RowAction action = row.rowAction; if (action == null) { action = new RowAction(session, table, ACTION_DELETE, row, colMap); row.rowAction = action; return action; } return action.addDeleteAction(session, colMap); } public static boolean addRefAction(Session session, Row row, int[] colMap) { RowAction action = row.rowAction; if (action == null) { action = new RowAction(session, row.getTable(), ACTION_REF, row, colMap); row.rowAction = action; return true; } return action.addRefAction(session, colMap); } public RowAction(Session session, TableBase table, byte type, Row row, int[] colMap) { this.session = session; this.type = type; this.actionTimestamp = session.actionTimestamp; this.table = table; this.store = table.getRowStore(session); this.isMemory = row.isMemory(); this.memoryRow = row; this.rowId = row.getPos(); this.changeColumnMap = colMap; } private RowAction(RowAction other) { this.session = other.session; this.type = other.type; this.actionTimestamp = other.actionTimestamp; this.table = other.table; this.store = other.store; this.isMemory = other.isMemory; this.memoryRow = other.memoryRow; this.rowId = other.rowId; this.changeColumnMap = other.changeColumnMap; } synchronized public int getType() { return type; } synchronized RowAction addDeleteAction(Session session, int[] colMap) { if (type == ACTION_NONE) { setAsAction(session, ACTION_DELETE); changeColumnMap = colMap; } else { RowActionBase action = this; while (true) { if (action.rolledback) { if (action.next == null) { break; } action = action.next; continue; } switch (action.type) { case ACTION_INSERT : { if (action.commitTimestamp == 0 && session != action.session) { throw Error.runtimeError(ErrorCode.U_S0500, "RowAction"); } break; } case ACTION_DELETE_FINAL : case ACTION_DELETE : { if (session != action.session) { if (action.commitTimestamp == 0) { if (!session.tempSet.isEmpty()) { session.tempSet.clear(); } session.tempSet.add(action); } return null; } break; } case ACTION_REF : { if (session != action.session && action.commitTimestamp == 0) { if (colMap == null || ArrayUtil.haveCommonElement( colMap, action.changeColumnMap)) { if (!session.tempSet.isEmpty()) { session.tempSet.clear(); } session.tempSet.add(action); return null; } } break; } } if (action.next == null) { break; } action = action.next; } RowActionBase newAction = new RowActionBase(session, ACTION_DELETE); newAction.changeColumnMap = colMap; action.next = newAction; } return this; } synchronized boolean addRefAction(Session session, int[] colMap) { if (type == ACTION_NONE) { setAsAction(session, ACTION_REF); changeColumnMap = colMap; return true; } RowActionBase action = this; do { if (session == action.session) { if (action.type == ACTION_REF && action.changeColumnMap == colMap && action.commitTimestamp == 0) { return false; } if (action.type == ACTION_INSERT) { if (action.commitTimestamp == 0) { return false; } } } else { if (action.type == ACTION_DELETE && action.commitTimestamp == 0) { if (action.changeColumnMap == null || ArrayUtil.haveCommonElement( colMap, action.changeColumnMap)) { if (!session.tempSet.isEmpty()) { session.tempSet.clear(); } session.tempSet.add(action); return false; } } } if (action.next == null) { break; } action = action.next; } while (true); RowActionBase newAction = new RowActionBase(session, ACTION_REF); newAction.changeColumnMap = colMap; action.next = newAction; return true; } public boolean checkDeleteActions() { return false; } public synchronized RowAction duplicate(Row newRow) { RowAction action = new RowAction(session, table, type, newRow, changeColumnMap); return action; } synchronized void setAsAction(Session session, byte type) { this.session = session; this.type = type; actionTimestamp = session.actionTimestamp; changeColumnMap = null; } synchronized void setAsAction(RowActionBase action) { super.setAsAction(action); } public void setAsNoOp() { // memoryRow = null; session = null; actionTimestamp = 0; commitTimestamp = 0; rolledback = false; deleteComplete = false; changeColumnMap = null; prepared = false; type = ACTION_NONE; next = null; } private void setAsDeleteFinal(long timestamp) { actionTimestamp = 0; commitTimestamp = timestamp; rolledback = false; deleteComplete = false; prepared = false; changeColumnMap = null; type = ACTION_DELETE_FINAL; next = null; } /** for two-phased pre-commit */ synchronized void prepareCommit(Session session) { RowActionBase action = this; do { if (action.session == session && action.commitTimestamp == 0) { action.prepared = true; } action = action.next; } while (action != null); } synchronized int commit(Session session) { RowActionBase action = this; int actiontype = ACTION_NONE; do { if (action.session == session && action.commitTimestamp == 0) { action.commitTimestamp = session.actionTimestamp; action.prepared = false; if (action.type == ACTION_INSERT) { actiontype = action.type; } else if (action.type == ACTION_DELETE) { if (actiontype == ACTION_INSERT) { // ACTION_INSERT + ACTION_DELETE actiontype = ACTION_INSERT_DELETE; } else { actiontype = action.type; } } } action = action.next; } while (action != null); return actiontype; } public boolean isDeleted() { RowActionBase action = this; do { if (action.commitTimestamp != 0) { if (action.type == ACTION_DELETE || action.type == ACTION_DELETE_FINAL) { return true; } } action = action.next; } while (action != null); return false; } /** * returns type of commit performed on timestamp. ACTION_NONE if none. * assumes rolled-back actions have already been merged */ synchronized int getCommitTypeOn(long timestamp) { RowActionBase action = this; int actionType = ACTION_NONE; do { if (action.commitTimestamp == timestamp) { if (action.type == ACTION_INSERT) { actionType = action.type; } else if (action.type == ACTION_DELETE) { if (actionType == ACTION_INSERT) { // ACTION_INSERT + ACTION_DELETE actionType = ACTION_INSERT_DELETE; } else { actionType = action.type; } } } action = action.next; } while (action != null); return actionType; } /** * returns false if another committed session has altered the same row */ synchronized boolean canCommit(Session session, OrderedHashSet set) { RowActionBase action; long timestamp = session.transactionTimestamp; long commitTimestamp = 0; final boolean readCommitted = session.isolationLevel == SessionInterface.TX_READ_COMMITTED; boolean hasDelete = false; action = this; if (readCommitted) { do { if (action.session == session && action.type == ACTION_DELETE) { // for READ_COMMITTED, use action timestamp for later conflicts if (action.commitTimestamp == 0) { timestamp = action.actionTimestamp; } } action = action.next; } while (action != null); action = this; } do { if (action.session == session) { if (action.type == ACTION_DELETE) { hasDelete = true; } } else { if (action.rolledback || action.type != ACTION_DELETE) { action = action.next; continue; } if (action.prepared) { return false; } if (action.commitTimestamp == 0) { set.add(action); } else if (action.commitTimestamp > commitTimestamp) { commitTimestamp = action.commitTimestamp; } } action = action.next; } while (action != null); if (!hasDelete) { return true; } return commitTimestamp < timestamp; } synchronized void complete(Session session) { RowActionBase action; action = this; do { if (action.session == session) { if (action.actionTimestamp == 0) { action.actionTimestamp = session.actionTimestamp; } } action = action.next; } while (action != null); } /** * returns false if cannot complete * when READ COMMITTED, false result always means repeat action and adds * to set parameter the sessions to wait on (may be no wait) */ synchronized boolean complete(Session session, OrderedHashSet set) { RowActionBase action; boolean readCommitted = session.isolationLevel == SessionInterface.TX_READ_COMMITTED; boolean result = true; action = this; do { if (action.rolledback || action.type == ACTION_NONE) { action = action.next; continue; } if (action.session == session) { // } else { if (action.prepared) { set.add(action.session); return false; } if (readCommitted) { if (action.commitTimestamp > session.actionTimestamp) { // 2.0 -- investigate // can redo - if deletes // can redo - if dup, but will likely fail at retry // can redo - if ref, but will likely fail at retry set.add(session); result = false; } else if (action.commitTimestamp == 0) { set.add(action.session); result = false; } } else if (action.commitTimestamp > session.transactionTimestamp) { return false; } } action = action.next; } while (action != null); return result; } synchronized int getActionType(long timestamp) { int actionType = ACTION_NONE; RowActionBase action = this; do { if (action.actionTimestamp == timestamp) { if (action.type == ACTION_DELETE) { if (actionType == ACTION_INSERT) { actionType = ACTION_INSERT_DELETE; } else { actionType = action.type; } } else if (action.type == ACTION_INSERT) { actionType = action.type; } } action = action.next; } while (action != null); return actionType; } public synchronized long getPos() { return rowId; } synchronized void setPos(long pos) { rowId = pos; } private int getRollbackType(Session session) { int actionType = ACTION_NONE; RowActionBase action = this; do { if (action.session == session && action.rolledback) { if (action.type == ACTION_DELETE) { if (actionType == ACTION_INSERT) { actionType = ACTION_INSERT_DELETE; } else { actionType = action.type; } } else if (action.type == ACTION_INSERT) { actionType = action.type; } } action = action.next; } while (action != null); return actionType; } /** * Rollback actions for a session including and after the given timestamp */ synchronized void rollback(Session session, long timestamp) { RowActionBase action = this; do { if (action.session == session && action.commitTimestamp == 0) { if (action.actionTimestamp >= timestamp) { action.commitTimestamp = session.actionTimestamp; action.rolledback = true; action.prepared = false; } } action = action.next; } while (action != null); } /** * merge rolled back actions */ synchronized int mergeRollback(Session session, long timestamp, Row row) { RowActionBase action = this; RowActionBase head = null; RowActionBase tail = null; int rollbackAction = getRollbackType(session); do { if (action.session == session && action.rolledback) { if (tail != null) { tail.next = null; } } else { if (head == null) { head = tail = action; } else { tail.next = action; tail = action; } } action = action.next; } while (action != null); if (head == null) { switch (rollbackAction) { case ACTION_INSERT : case ACTION_INSERT_DELETE : setAsDeleteFinal(timestamp); break; case ACTION_DELETE : case ACTION_NONE : default : setAsNoOp(); break; } } else { if (head != this) { setAsAction(head); } } return rollbackAction; } /** * merge session actions committed on given timestamp. * * may be called more than once on same action * */ synchronized void mergeToTimestamp(long timestamp) { RowActionBase action = this; RowActionBase head = null; RowActionBase tail = null; int commitType = getCommitTypeOn(timestamp); if (type == ACTION_DELETE_FINAL || type == ACTION_NONE) { return; } if (commitType == ACTION_DELETE || commitType == ACTION_INSERT_DELETE) { setAsDeleteFinal(timestamp); return; } do { boolean expired = false;; if (action.commitTimestamp != 0) { if (action.commitTimestamp <= timestamp) { expired = true; } else if (action.type == ACTION_REF) { expired = true; } } if (expired) { if (tail != null) { tail.next = null; } } else { if (head == null) { head = tail = action; } else { tail.next = action; tail = action; } } action = action.next; } while (action != null); if (head == null) { switch (commitType) { case ACTION_DELETE : case ACTION_INSERT_DELETE : setAsDeleteFinal(timestamp); break; case ACTION_NONE : case ACTION_INSERT : default : setAsNoOp(); break; } } else if (head != this) { setAsAction(head); } mergeExpiredRefActions(); } synchronized boolean canRead(Session session, int mode) { long threshold; int actionType = ACTION_NONE; if (type == ACTION_DELETE_FINAL) { return false; } if (type == ACTION_NONE) { return true; } RowActionBase action = this; if (session == null) { threshold = Long.MAX_VALUE; } else { switch (session.isolationLevel) { case SessionInterface.TX_READ_UNCOMMITTED : threshold = Long.MAX_VALUE; break; case SessionInterface.TX_READ_COMMITTED : threshold = session.actionTimestamp; break; case SessionInterface.TX_REPEATABLE_READ : case SessionInterface.TX_SERIALIZABLE : default : threshold = session.transactionTimestamp; break; } } do { if (action.type == ACTION_REF) { action = action.next; continue; } if (action.rolledback) { if (action.type == ACTION_INSERT) { actionType = ACTION_DELETE; } action = action.next; continue; } if (session == action.session) { if (action.type == ACTION_DELETE) { actionType = action.type; } else if (action.type == ACTION_INSERT) { actionType = action.type; } action = action.next; continue; } else if (action.commitTimestamp == 0) { if (action.type == ACTION_NONE) { throw Error.runtimeError(ErrorCode.U_S0500, "RowAction"); } else if (action.type == ACTION_INSERT) { if (mode == TransactionManager.ACTION_READ) { actionType = action.ACTION_DELETE; } else if (mode == TransactionManager.ACTION_DUP) { actionType = ACTION_INSERT; session.tempSet.clear(); session.tempSet.add(action); } else if (mode == TransactionManager.ACTION_REF) { actionType = ACTION_DELETE; } break; } else if (action.type == ACTION_DELETE) { if (mode == TransactionManager.ACTION_DUP) { // } else if (mode == TransactionManager.ACTION_REF) { actionType = ACTION_DELETE; } } action = action.next; continue; } else if (action.commitTimestamp < threshold) { if (action.type == ACTION_DELETE) { actionType = ACTION_DELETE; } else if (action.type == ACTION_INSERT) { actionType = ACTION_INSERT; } } else { if (action.type == ACTION_INSERT) { if (mode == TransactionManager.ACTION_READ) { actionType = action.ACTION_DELETE; } else if (mode == TransactionManager.ACTION_DUP) { actionType = ACTION_INSERT; session.tempSet.clear(); session.tempSet.add(action); } else if (mode == TransactionManager.ACTION_REF) { actionType = ACTION_DELETE; } } } action = action.next; continue; } while (action != null); if (actionType == ACTION_NONE || actionType == ACTION_INSERT) { return true; } return false; } public boolean hasCurrentRefAction() { RowActionBase action = this; do { if (action.type == ACTION_REF && action.commitTimestamp == 0) { return true; } action = action.next; } while (action != null); return false; } /** eliminate all expired updatedAction in chain */ private RowAction mergeExpiredRefActions() { if (updatedAction != null) { updatedAction = updatedAction.mergeExpiredRefActions(); } if (hasCurrentRefAction()) { return this; } return updatedAction; } public synchronized String describe(Session session) { StringBuilder sb = new StringBuilder(); RowActionBase action = this; do { if (action == this) { sb.append(this.rowId).append(' '); } sb.append(action.session.getId()).append(' '); sb.append(action.type).append(' ').append(action.actionTimestamp); sb.append(' ').append(action.commitTimestamp); if (action.commitTimestamp != 0) { if (action.rolledback) { sb.append('r'); } else { sb.append('c'); } } sb.append(" - "); action = action.next; } while (action != null); return sb.toString(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TextTable.java0000644000175000017500000002551112007547420021502 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.StringConverter; import org.hsqldb.persist.PersistentStore; import org.hsqldb.persist.TextCache; import org.hsqldb.persist.TextFileReader; import org.hsqldb.rowio.RowInputInterface; /** * Subclass of Table to handle TEXT data source.

* * Extends Table to provide the notion of an SQL base table object whose * data is read from and written to a text format data file. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @version 2.2.7 */ public class TextTable extends org.hsqldb.Table { String dataSource = ""; boolean isReversed = false; boolean isConnected = false; // TextCache cache; /** * Constructs a new TextTable from the given arguments. * * @param db the owning database * @param name the table's HsqlName * @param type code (normal or temp text table) */ TextTable(Database db, HsqlNameManager.HsqlName name, int type) { super(db, name, type); isWithDataSource = true; } public boolean isConnected() { return isConnected; } /** * connects to the data source */ public void connect(Session session) { connect(session, isReadOnly); } /** * connects to the data source */ private void connect(Session session, boolean withReadOnlyData) { // Open new cache: if ((dataSource.length() == 0) || isConnected) { // nothing to do return; } PersistentStore store = database.persistentStoreCollection.getStore(this); this.store = store; TextCache cache = null; TextFileReader reader = null; try { cache = (TextCache) database.logger.openTextFilePersistence(this, dataSource, withReadOnlyData, isReversed); store.setCache(cache); reader = cache.getTextFileReader(); // read and insert all the rows from the source file Row row = null; int nextpos = 0; if (cache.isIgnoreFirstLine()) { nextpos += reader.readHeaderLine(); cache.setHeaderInitialise(reader.getHeaderLine()); } while (true) { RowInputInterface rowIn = reader.readObject(nextpos); if (rowIn == null) { break; } row = (Row) store.get(rowIn); if (row == null) { break; } Object[] data = row.getData(); nextpos = (int) row.getPos() + row.getStorageSize(); systemUpdateIdentityValue(data); enforceRowConstraints(session, data); store.indexRow(session, row); } } catch (Throwable t) { int linenumber = reader == null ? 0 : reader.getLineNumber(); clearAllData(session); if (cache != null) { database.logger.closeTextCache(this); store.release(); } // everything is in order here. // At this point table should either have a valid (old) data // source and cache or have an empty source and null cache. throw Error.error(t, ErrorCode.TEXT_FILE, 0, new Object[] { new Integer(linenumber), t.toString() }); } isConnected = true; isReadOnly = withReadOnlyData; } /** * disconnects from the data source */ public void disconnect() { this.store = null; PersistentStore store = database.persistentStoreCollection.getStore(this); store.release(); isConnected = false; } /** * This method does some of the work involved with managing the creation * and openning of the cache, the rest is done in Log.java and * TextCache.java. * * Better clarification of the role of the methods is needed. */ private void openCache(Session session, String dataSourceNew, boolean isReversedNew, boolean isReadOnlyNew) { String dataSourceOld = dataSource; boolean isReversedOld = isReversed; boolean isReadOnlyOld = isReadOnly; if (dataSourceNew == null) { dataSourceNew = ""; } disconnect(); dataSource = dataSourceNew; isReversed = (isReversedNew && dataSource.length() > 0); try { connect(session, isReadOnlyNew); } catch (HsqlException e) { dataSource = dataSourceOld; isReversed = isReversedOld; connect(session, isReadOnlyOld); throw e; } } /** * High level command to assign a data source to the table definition. * Reassigns only if the data source or direction has changed. */ protected void setDataSource(Session session, String dataSourceNew, boolean isReversedNew, boolean createFile) { if (getTableType() == Table.TEMP_TEXT_TABLE) { ; } else { session.getGrantee().checkSchemaUpdateOrGrantRights( getSchemaName().name); } dataSourceNew = dataSourceNew.trim(); //-- Open if descending, direction changed, file changed, or not connected currently if (isReversedNew || (isReversedNew != isReversed) || !dataSource.equals(dataSourceNew) || !isConnected) { openCache(session, dataSourceNew, isReversedNew, isReadOnly); } if (isReversed) { isReadOnly = true; } } public String getDataSource() { return dataSource; } public boolean isDescDataSource() { return isReversed; } public void setHeader(String header) { PersistentStore store = database.persistentStoreCollection.getStore(this); TextCache cache = (TextCache) store.getCache(); if (cache != null && cache.isIgnoreFirstLine()) { cache.setHeader(header); return; } throw Error.error(ErrorCode.TEXT_TABLE_HEADER); } public String getHeader() { PersistentStore store = database.persistentStoreCollection.getStore(this); TextCache cache = (TextCache) store.getCache(); String header = cache == null ? null : cache.getHeader(); return header == null ? null : StringConverter.toQuotedString(header, '\'', true); } /** * Used by INSERT, DELETE, UPDATE operations. This class will return * a more appropriate message when there is no data source. */ void checkDataReadOnly() { if (dataSource.length() == 0) { throw Error.error(ErrorCode.TEXT_TABLE_UNKNOWN_DATA_SOURCE); } if (isReadOnly) { throw Error.error(ErrorCode.DATA_IS_READONLY); } } public boolean isDataReadOnly() { return !isConnected() || super.isDataReadOnly() || store.getCache().isDataReadOnly(); } public void setDataReadOnly(boolean value) { if (!value) { if (isReversed) { throw Error.error(ErrorCode.DATA_IS_READONLY); } if (database.isFilesReadOnly()) { throw Error.error(ErrorCode.DATABASE_IS_READONLY); } if (isConnected()) { store.getCache().close(true); store.getCache().open(value); } } isReadOnly = value; } boolean isIndexCached() { return false; } void setIndexRoots(String s) { // do nothing } String getDataSourceDDL() { String dataSource = getDataSource(); if (dataSource == null) { return null; } StringBuffer sb = new StringBuffer(128); sb.append(Tokens.T_SET).append(' ').append(Tokens.T_TABLE).append(' '); sb.append(getName().getSchemaQualifiedStatementName()); sb.append(' ').append(Tokens.T_SOURCE).append(' ').append('\''); sb.append(dataSource); sb.append('\''); return sb.toString(); } /** * Generates the SET TABLE SOURCE HEADER statement for a * text table; */ String getDataSourceHeader() { String header = getHeader(); if (header == null) { return null; } StringBuffer sb = new StringBuffer(128); sb.append(Tokens.T_SET).append(' ').append(Tokens.T_TABLE).append(' '); sb.append(getName().getSchemaQualifiedStatementName()); sb.append(' ').append(Tokens.T_SOURCE).append(' '); sb.append(Tokens.T_HEADER).append(' '); sb.append(header); return sb.toString(); } /** * Adds commitPersistence() call */ public void insertData(Session session, PersistentStore store, Object[] data) { Row row = (Row) store.getNewCachedObject(session, data, false); store.indexRow(session, row); store.commitPersistence(row); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/navigator/0000755000175000017500000000000012007570424020731 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/navigator/RowIterator.java0000644000175000017500000000366312007547352024071 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.navigator; import org.hsqldb.Row; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public interface RowIterator { Row getNextRow(); Object[] getNext(); boolean hasNext(); void remove(); boolean setRowColumns(boolean[] columns); void release(); long getRowId(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/navigator/RowSetNavigatorDataChangeMemory.java0000644000175000017500000001435612007547352030000 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.navigator; import java.io.IOException; import org.hsqldb.Row; import org.hsqldb.Session; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.OrderedLongKeyHashMap; import org.hsqldb.result.ResultMetaData; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputInterface; import org.hsqldb.types.Type; /* * All-in-memory implementation of RowSetNavigator for delete and update * operations. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public class RowSetNavigatorDataChangeMemory implements RowSetNavigatorDataChange { public static RowSetNavigatorDataChangeMemory emptyRowSet = new RowSetNavigatorDataChangeMemory(null); int size; int currentPos = -1; OrderedLongKeyHashMap list; Session session; public RowSetNavigatorDataChangeMemory(Session session) { this.session = session; list = new OrderedLongKeyHashMap(64, true); } public void release() { beforeFirst(); list.clear(); size = 0; } public int getSize() { return size; } public int getRowPosition() { return currentPos; } public boolean next() { if (currentPos < size - 1) { currentPos++; return true; } currentPos = size - 1; return false; } public boolean beforeFirst() { currentPos = -1; return true; } public Row getCurrentRow() { return (Row) list.getValueByIndex(currentPos); } public Object[] getCurrentChangedData() { return (Object[]) list.getSecondValueByIndex(currentPos); } public int[] getCurrentChangedColumns() { return (int[]) list.getThirdValueByIndex(currentPos); } // reading and writing public void write(RowOutputInterface out, ResultMetaData meta) throws IOException {} public void read(RowInputInterface in, ResultMetaData meta) throws IOException {} public void endMainDataSet() {} public boolean addRow(Row row) { int lookup = list.getLookup(row.getId()); if (lookup == -1) { list.put(row.getId(), row, null); size++; return true; } else { if (list.getSecondValueByIndex(lookup) != null) { if (session.database.sqlEnforceTDCD) { throw Error.error(ErrorCode.X_27000); } list.setSecondValueByIndex(lookup, null); list.setThirdValueByIndex(lookup, null); return true; } return false; } } public Object[] addRow(Session session, Row row, Object[] data, Type[] types, int[] columnMap) { long rowId = row.getId(); int lookup = list.getLookup(rowId); if (lookup == -1) { list.put(rowId, row, data); list.setThirdValueByIndex(size, columnMap); size++; return data; } else { Object[] rowData = ((Row) list.getFirstByLookup(lookup)).getData(); Object[] currentData = (Object[]) list.getSecondValueByIndex(lookup); if (currentData == null) { if (session.database.sqlEnforceTDCD) { throw Error.error(ErrorCode.X_27000); } else { return null; } } for (int i = 0; i < columnMap.length; i++) { int j = columnMap[i]; if (types[j].compare(session, data[j], currentData[j]) != 0) { if (types[j].compare(session, rowData[j], currentData[j]) != 0) { if (session.database.sqlEnforceTDCU) { throw Error.error(ErrorCode.X_27000); } } else { currentData[j] = data[j]; } } } int[] currentMap = (int[]) list.getThirdValueByIndex(lookup); currentMap = ArrayUtil.union(currentMap, columnMap); list.setThirdValueByIndex(lookup, currentMap); return currentData; } } public boolean containsDeletedRow(Row row) { int lookup = list.getLookup(row.getId()); if (lookup == -1) { return false; } Object[] currentData = (Object[]) list.getSecondValueByIndex(lookup); return currentData == null; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/navigator/RowSetNavigator.java0000644000175000017500000001672612007547352024712 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.navigator; import java.io.IOException; import org.hsqldb.Row; import org.hsqldb.SessionInterface; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.result.ResultMetaData; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputInterface; /** * Encapsulates navigation functionality for lists of objects. The base class * provides positional navigation and checking, while the subclasses provide * object retreival. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public abstract class RowSetNavigator implements RangeIterator { public RowSetNavigator() {} SessionInterface session; long id; int size; int mode; boolean isIterator; int currentPos = -1; int rangePosition; /** * Sets the id; */ public void setId(long id) { this.id = id; } /** * Returns the id */ public long getId() { return id; } /** * Returns the current row object. Type of object is implementation defined. */ public abstract Object[] getCurrent(); public Object getCurrent(int i) { Object[] current = getCurrent(); if (current == null) { return null; } return current[i]; } public void setCurrent(Object[] data) {} public long getRowid() { return 0; } public Object getRowidObject() { return null; } public abstract Row getCurrentRow(); /** * Add data to the end */ public abstract void add(Object[] data); /** * Add row to the end */ public abstract boolean addRow(Row row); /** * Remove current row */ public abstract void remove(); /** * Reset to initial state */ public void reset() { currentPos = -1; } /** * Clear the contents */ public abstract void clear(); /** * Remove any resourses and invalidate */ public abstract void release(); public void setSession(SessionInterface session) { this.session = session; } public SessionInterface getSession() { return session; } public int getSize() { return size; } public boolean isEmpty() { return size == 0; } public Object[] getNext() { return next() ? getCurrent() : null; } public boolean next() { if (hasNext()) { currentPos++; return true; } else if (size != 0) { currentPos = size; } return false; } public boolean hasNext() { return currentPos < size - 1; } public Row getNextRow() { throw Error.runtimeError(ErrorCode.U_S0500, "RowSetNavigator"); } public boolean setRowColumns(boolean[] columns) { throw Error.runtimeError(ErrorCode.U_S0500, "RowSetNavigator"); } public long getRowId() { throw Error.runtimeError(ErrorCode.U_S0500, "RowSetNavigator"); } public boolean beforeFirst() { reset(); currentPos = -1; return true; } public boolean afterLast() { if (size == 0) { return false; } reset(); currentPos = size; return true; } public boolean first() { beforeFirst(); return next(); } public boolean last() { if (size == 0) { return false; } if (isAfterLast()) { beforeFirst(); } while (hasNext()) { next(); } return true; } public int getRowNumber() { return currentPos; } /** * Uses similar semantics to java.sql.ResultSet except this is 0 based. * When position is 0 or positive, it is from the start; when negative, * it is from end */ public boolean absolute(int position) { if (position < 0) { position += size; } if (position < 0) { beforeFirst(); return false; } if (position >= size) { afterLast(); return false; } if (size == 0) { return false; } if (position < currentPos) { beforeFirst(); } // go to the tagget row; while (position > currentPos) { next(); } return true; } public boolean relative(int rows) { int position = currentPos + rows; if (position < 0) { beforeFirst(); return false; } return absolute(position); } public boolean previous() { return relative(-1); } public boolean isFirst() { return size > 0 && currentPos == 0; } public boolean isLast() { return size > 0 && currentPos == size - 1; } public boolean isBeforeFirst() { return size > 0 && currentPos == -1; } public boolean isAfterLast() { return size > 0 && currentPos == size; } public void writeSimple(RowOutputInterface out, ResultMetaData meta) throws IOException { throw Error.runtimeError(ErrorCode.U_S0500, "RowSetNavigator"); } public void readSimple(RowInputInterface in, ResultMetaData meta) throws IOException { throw Error.runtimeError(ErrorCode.U_S0500, "RowSetNavigator"); } public abstract void write(RowOutputInterface out, ResultMetaData meta) throws IOException; public abstract void read(RowInputInterface in, ResultMetaData meta) throws IOException; public boolean isMemory() { return true; } public int getRangePosition() { return rangePosition; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/navigator/RowSetNavigatorData.java0000644000175000017500000004065412007547352025501 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.navigator; import java.io.IOException; import java.util.Comparator; import java.util.TreeMap; import org.hsqldb.QueryExpression; import org.hsqldb.QuerySpecification; import org.hsqldb.Row; import org.hsqldb.Session; import org.hsqldb.SortAndSlice; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.ArraySort; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.LongKeyHashMap; import org.hsqldb.result.ResultMetaData; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputInterface; /** * Implementation of RowSetNavigator for result sets. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public class RowSetNavigatorData extends RowSetNavigator implements Comparator { public static final Object[][] emptyTable = new Object[0][]; // int currentOffset; int baseBlockSize; // Object[][] table = emptyTable; // final Session session; QueryExpression queryExpression; int visibleColumnCount; boolean isSimpleAggregate; Object[] simpleAggregateData; // // private Index mainIndex; // TreeMap rowMap; LongKeyHashMap idMap; RowSetNavigatorData(Session session) { this.session = session; } public RowSetNavigatorData(Session session, QuerySpecification select) { this.session = session; this.queryExpression = select; this.rangePosition = select.resultRangePosition; visibleColumnCount = select.getColumnCount(); isSimpleAggregate = select.isAggregated && !select.isGrouped; if (select.isGrouped) { mainIndex = select.groupIndex; rowMap = new TreeMap(this); } if (select.idIndex != null) { idMap = new LongKeyHashMap(); } } public RowSetNavigatorData(Session session, QueryExpression queryExpression) { this.session = session; this.queryExpression = queryExpression; visibleColumnCount = queryExpression.getColumnCount(); } public RowSetNavigatorData(Session session, RowSetNavigator navigator) { this.session = session; setCapacity(navigator.size); while (navigator.hasNext()) { add(navigator.getNext()); } } public void sortFull(Session session) { mainIndex = queryExpression.fullIndex; ArraySort.sort(table, 0, size, this); reset(); } public void sortOrder(Session session) { if (queryExpression.orderIndex != null) { mainIndex = queryExpression.orderIndex; ArraySort.sort(table, 0, size, this); } reset(); } public void sortOrderUnion(Session session, SortAndSlice sortAndSlice) { if (sortAndSlice.index != null) { mainIndex = sortAndSlice.index; ArraySort.sort(table, 0, size, this); reset(); } } public void add(Object[] data) { ensureCapacity(); table[size] = data; size++; if (rowMap != null) { rowMap.put(data, data); } if (idMap != null) { Long id = (Long) data[visibleColumnCount]; idMap.put(id.longValue(), data); } } public boolean addRow(Row row) { throw Error.runtimeError(ErrorCode.U_S0500, "RowSetNavigatorClient"); } public void update(Object[] oldData, Object[] newData) { // noop } void addAdjusted(Object[] data, int[] columnMap) { data = projectData(data, columnMap); add(data); } void insertAdjusted(Object[] data, int[] columnMap) { projectData(data, columnMap); insert(data); } Object[] projectData(Object[] data, int[] columnMap) { if (columnMap == null) { data = (Object[]) ArrayUtil.resizeArrayIfDifferent(data, visibleColumnCount); } else { Object[] newData = new Object[visibleColumnCount]; ArrayUtil.projectRow(data, columnMap, newData); data = newData; } return data; } /** * for union only */ void insert(Object[] data) { ensureCapacity(); System.arraycopy(table, currentPos, table, currentPos + 1, size - currentPos); table[currentPos] = data; size++; } public void release() { this.table = emptyTable; this.size = 0; reset(); } public void clear() { this.table = emptyTable; this.size = 0; reset(); } public boolean absolute(int position) { return super.absolute(position); } public Object[] getCurrent() { if (currentPos < 0 || currentPos >= size) { return null; } if (currentPos == currentOffset + table.length) { getBlock(currentOffset + table.length); } return table[currentPos - currentOffset]; } public Row getCurrentRow() { throw Error.runtimeError(ErrorCode.U_S0500, "RowSetNavigatorClient"); } public Object[] getNextRowData() { return next() ? getCurrent() : null; } public boolean next() { return super.next(); } public void remove() { System.arraycopy(table, currentPos + 1, table, currentPos, size - currentPos - 1); table[size - 1] = null; currentPos--; size--; } public void reset() { super.reset(); } public boolean isMemory() { return true; } public void read(RowInputInterface in, ResultMetaData meta) throws IOException {} public void write(RowOutputInterface out, ResultMetaData meta) throws IOException { reset(); out.writeLong(id); out.writeInt(size); out.writeInt(0); // offset out.writeInt(size); while (hasNext()) { Object[] data = getNext(); out.writeData(meta.getExtendedColumnCount(), meta.columnTypes, data, null, null); } reset(); } public Object[] getData(long rowId) { return (Object[]) idMap.get(rowId); } public void copy(RowIterator other, int[] rightColumnIndexes) { while (other.hasNext()) { Object[] currentData = other.getNext(); addAdjusted(currentData, rightColumnIndexes); } } public void union(Session session, RowSetNavigatorData other) { Object[] currentData; removeDuplicates(session); other.removeDuplicates(session); mainIndex = queryExpression.fullIndex; while (other.hasNext()) { currentData = other.getNext(); int position = ArraySort.searchFirst(table, 0, size, currentData, this); if (position < 0) { position = -position - 1; currentPos = position; insert(currentData); } } reset(); } public void unionAll(Session session, RowSetNavigatorData other) { other.reset(); while (other.hasNext()) { Object[] currentData = other.getNext(); add(currentData); } reset(); } public void intersect(Session session, RowSetNavigatorData other) { removeDuplicates(session); other.sortFull(session); while (hasNext()) { Object[] currentData = getNext(); boolean hasRow = other.containsRow(currentData); if (!hasRow) { remove(); } } reset(); } public void intersectAll(Session session, RowSetNavigatorData other) { Object[] compareData = null; RowIterator it; Object[] otherData = null; sortFull(session); other.sortFull(session); it = queryExpression.fullIndex.emptyIterator(); while (hasNext()) { Object[] currentData = getNext(); boolean newGroup = compareData == null || queryExpression.fullIndex.compareRowNonUnique( session, currentData, compareData, visibleColumnCount) != 0; if (newGroup) { compareData = currentData; it = other.findFirstRow(currentData); } otherData = it.getNext(); if (otherData != null && queryExpression.fullIndex.compareRowNonUnique( session, currentData, otherData, visibleColumnCount) == 0) { continue; } remove(); } reset(); } public void except(Session session, RowSetNavigatorData other) { removeDuplicates(session); other.sortFull(session); while (hasNext()) { Object[] currentData = getNext(); boolean hasRow = other.containsRow(currentData); if (hasRow) { remove(); } } reset(); } public void exceptAll(Session session, RowSetNavigatorData other) { Object[] compareData = null; RowIterator it; Object[] otherData = null; sortFull(session); other.sortFull(session); it = queryExpression.fullIndex.emptyIterator(); while (hasNext()) { Object[] currentData = getNext(); boolean newGroup = compareData == null || queryExpression.fullIndex.compareRowNonUnique( session, currentData, compareData, queryExpression.fullIndex.getColumnCount()) != 0; if (newGroup) { compareData = currentData; it = other.findFirstRow(currentData); } otherData = it.getNext(); if (otherData != null && queryExpression.fullIndex.compareRowNonUnique( session, currentData, otherData, queryExpression.fullIndex.getColumnCount()) == 0) { remove(); } } reset(); } public boolean hasUniqueNotNullRows(Session session) { sortFull(session); reset(); Object[] lastRowData = null; while (hasNext()) { Object[] currentData = getNext(); if (hasNull(currentData)) { continue; } if (lastRowData != null && queryExpression.fullIndex.compareRow( session, lastRowData, currentData) == 0) { return false; } else { lastRowData = currentData; } } return true; } public void removeDuplicates(Session session) { sortFull(session); reset(); int lastRowPos = -1; Object[] lastRowData = null; while (hasNext()) { Object[] currentData = getNext(); if (lastRowData == null) { lastRowPos = currentPos; lastRowData = currentData; continue; } if (queryExpression.fullIndex.compareRow( session, lastRowData, currentData) != 0) { lastRowPos++; lastRowData = currentData; table[lastRowPos] = currentData; } } super.size = lastRowPos + 1; reset(); } public void trim(int limitstart, int limitcount) { if (size == 0) { return; } if (limitstart >= size) { clear(); return; } if (limitstart != 0) { reset(); for (int i = 0; i < limitstart; i++) { next(); remove(); } } if (limitcount >= size) { return; } reset(); for (int i = 0; i < limitcount; i++) { next(); } while (hasNext()) { next(); remove(); } reset(); } boolean hasNull(Object[] data) { for (int i = 0; i < visibleColumnCount; i++) { if (data[i] == null) { return true; } } return false; } /** * Special case for isSimpleAggregate cannot use index lookup. */ public Object[] getGroupData(Object[] data) { if (isSimpleAggregate) { if (simpleAggregateData == null) { simpleAggregateData = data; return null; } return simpleAggregateData; } return (Object[]) rowMap.get(data); } boolean containsRow(Object[] data) { int position = ArraySort.searchFirst(table, 0, size, data, this); return position >= 0; } RowIterator findFirstRow(Object[] data) { int position = ArraySort.searchFirst(table, 0, size, data, this); if (position < 0) { position = size; } else { position--; } return new DataIterator(position); } /** * baseBlockSize remains unchanged. */ void getBlock(int offset) { // no op for no blocks } private void setCapacity(int newSize) { if (size > table.length) { table = new Object[newSize][]; } } private void ensureCapacity() { if (size == table.length) { int newSize = size == 0 ? 4 : size * 2; Object[][] newTable = new Object[newSize][]; System.arraycopy(table, 0, newTable, 0, size); table = newTable; } } void implement() { throw Error.error(ErrorCode.U_S0500, "RSND"); } class DataIterator implements RowIterator { int pos; DataIterator(int position) { pos = position; } public Row getNextRow() { return null; } public Object[] getNext() { if (hasNext()) { pos++; return table[pos]; } return null; } public boolean hasNext() { return pos < size - 1; } public void remove() {} public boolean setRowColumns(boolean[] columns) { return false; } public void release() {} public long getRowId() { return 0L; } } public int compare(Object a, Object b) { return mainIndex.compareRow(session, (Object[]) a, (Object[]) b); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/navigator/RowSetNavigatorClient.java0000644000175000017500000001630712007547352026044 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.navigator; import java.io.IOException; import org.hsqldb.HsqlException; import org.hsqldb.Row; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.result.ResultMetaData; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputInterface; /* * All-in-memory implementation of RowSetNavigator for client side, or for * transferring a slice of the result to the client or server using a subset of * a server-side row set. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public class RowSetNavigatorClient extends RowSetNavigator { public static final Object[][] emptyTable = new Object[0][]; // int currentOffset; int baseBlockSize; // Object[][] table; // public RowSetNavigatorClient() { table = emptyTable; } public RowSetNavigatorClient(int blockSize) { table = new Object[blockSize][]; } public RowSetNavigatorClient(RowSetNavigator source, int offset, int blockSize) { this.size = source.size; this.baseBlockSize = blockSize; this.currentOffset = offset; table = new Object[blockSize][]; source.absolute(offset); for (int count = 0; count < blockSize; count++) { table[count] = source.getCurrent(); source.next(); } source.beforeFirst(); } /** * For communication of small resuls such as BATCHEXECRESPONSE */ public void setData(Object[][] table) { this.table = table; this.size = table.length; } public void setData(int index, Object[] data) { table[index] = data; } public Object[] getData(int index) { return table[index]; } /** * Returns the current row object. Type of object is implementation defined. */ public Object[] getCurrent() { if (currentPos < 0 || currentPos >= size) { return null; } if (currentPos == currentOffset + table.length) { getBlock(currentOffset + table.length); } return table[currentPos - currentOffset]; } public Row getCurrentRow() { throw Error.runtimeError(ErrorCode.U_S0500, "RowSetNavigatorClient"); } public void remove() { throw Error.runtimeError(ErrorCode.U_S0500, "RowSetNavigatorClient"); } public void add(Object[] data) { ensureCapacity(); table[size] = data; size++; } public boolean addRow(Row row) { throw Error.runtimeError(ErrorCode.U_S0500, "RowSetNavigatorClient"); } public void clear() { setData(emptyTable); reset(); } public void release() { setData(emptyTable); reset(); } public boolean absolute(int position) { if (position < 0) { position += size; } if (position < 0) { beforeFirst(); return false; } if (position >= size) { afterLast(); return false; } if (size == 0) { return false; } currentPos = position; return true; } public void readSimple(RowInputInterface in, ResultMetaData meta) throws IOException { size = in.readInt(); if (table.length < size) { table = new Object[size][]; } for (int i = 0; i < size; i++) { table[i] = in.readData(meta.columnTypes); } } public void writeSimple(RowOutputInterface out, ResultMetaData meta) throws IOException { out.writeInt(size); for (int i = 0; i < size; i++) { Object[] data = table[i]; out.writeData(meta.getColumnCount(), meta.columnTypes, data, null, null); } } public void read(RowInputInterface in, ResultMetaData meta) throws IOException { id = in.readLong(); size = in.readInt(); currentOffset = in.readInt(); baseBlockSize = in.readInt(); if (table.length < baseBlockSize) { table = new Object[baseBlockSize][]; } for (int i = 0; i < baseBlockSize; i++) { table[i] = in.readData(meta.columnTypes); } } public void write(RowOutputInterface out, ResultMetaData meta) throws HsqlException, IOException { int limit = size - currentOffset; if (limit > table.length) { limit = table.length; } out.writeLong(id); out.writeInt(size); out.writeInt(currentOffset); out.writeInt(limit); for (int i = 0; i < limit; i++) { Object[] data = table[i]; out.writeData(meta.getColumnCount(), meta.columnTypes, data, null, null); } } /** * baseBlockSize remains unchanged. */ void getBlock(int offset) { try { RowSetNavigatorClient source = session.getRows(id, offset, baseBlockSize); table = source.table; currentOffset = source.currentOffset; } catch (HsqlException e) {} } private void ensureCapacity() { if (size == table.length) { int newSize = size == 0 ? 4 : size * 2; Object[][] newTable = new Object[newSize][]; System.arraycopy(table, 0, newTable, 0, size); table = newTable; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/navigator/RowSetNavigatorDataTable.java0000644000175000017500000003747712007547352026462 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.navigator; import java.io.IOException; import org.hsqldb.HsqlException; import org.hsqldb.OpTypes; import org.hsqldb.QueryExpression; import org.hsqldb.QuerySpecification; import org.hsqldb.Row; import org.hsqldb.Session; import org.hsqldb.SortAndSlice; import org.hsqldb.TableBase; import org.hsqldb.index.Index; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.persist.PersistentStore; import org.hsqldb.result.ResultMetaData; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputInterface; /** * Implementation of RowSetNavigator using a table as the data store. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class RowSetNavigatorDataTable extends RowSetNavigatorData { final Session session; public TableBase table; public PersistentStore store; RowIterator iterator; Row currentRow; int maxMemoryRowCount; boolean isClosed; int visibleColumnCount; boolean isAggregate; boolean isSimpleAggregate; Object[] simpleAggregateData; Object[] tempRowData; // boolean reindexTable; // private Index mainIndex; private Index fullIndex; private Index orderIndex; private Index groupIndex; private Index idIndex; public RowSetNavigatorDataTable(Session session, QuerySpecification select) { super(session); this.session = session; this.rangePosition = select.resultRangePosition; maxMemoryRowCount = session.getResultMemoryRowCount(); visibleColumnCount = select.indexLimitVisible; table = select.resultTable.duplicate(); table.store = store = session.sessionData.getNewResultRowStore(table, !select.isAggregated); isAggregate = select.isAggregated; isSimpleAggregate = select.isAggregated && !select.isGrouped; reindexTable = select.isGrouped; mainIndex = select.mainIndex; fullIndex = select.fullIndex; orderIndex = select.orderIndex; groupIndex = select.groupIndex; idIndex = select.idIndex; tempRowData = new Object[1]; } public RowSetNavigatorDataTable(Session session, QuerySpecification select, RowSetNavigatorData navigator) { this(session, (QuerySpecification) select); navigator.reset(); while (navigator.hasNext()) { add(navigator.getNext()); } } public RowSetNavigatorDataTable(Session session, QueryExpression queryExpression) { super(session); this.session = session; maxMemoryRowCount = session.getResultMemoryRowCount(); table = queryExpression.resultTable.duplicate(); visibleColumnCount = table.getColumnCount(); table.store = store = session.sessionData.getNewResultRowStore(table, true); mainIndex = queryExpression.mainIndex; fullIndex = queryExpression.fullIndex; } public RowSetNavigatorDataTable(Session session, TableBase table) { super(session); this.session = session; maxMemoryRowCount = session.getResultMemoryRowCount(); this.table = table; visibleColumnCount = table.getColumnCount(); store = table.getRowStore(session); mainIndex = table.getPrimaryIndex(); fullIndex = table.getFullIndex(); this.size = (int) mainIndex.size(session, store); reset(); } public void sortFull(Session session) { if (reindexTable) { store.indexRows(session); } mainIndex = fullIndex; reset(); } public void sortOrder(Session session) { if (orderIndex != null) { if (reindexTable) { store.indexRows(session); } mainIndex = orderIndex; reset(); } } public void sortOrderUnion(Session session, SortAndSlice sortAndSlice) { if (sortAndSlice.index != null) { mainIndex = sortAndSlice.index; reset(); } } public void add(Object[] data) { try { Row row = (Row) store.getNewCachedObject(session, data, false); store.indexRow(session, row); size++; } catch (HsqlException e) {} } void addAdjusted(Object[] data, int[] columnMap) { try { if (columnMap == null) { data = (Object[]) ArrayUtil.resizeArrayIfDifferent(data, visibleColumnCount); } else { Object[] newData = new Object[visibleColumnCount]; ArrayUtil.projectRow(data, columnMap, newData); data = newData; } add(data); } catch (HsqlException e) {} } public void update(Object[] oldData, Object[] newData) { if (isSimpleAggregate) { return; } RowIterator it = groupIndex.findFirstRow(session, store, oldData); if (it.hasNext()) { Row row = it.getNextRow(); it.remove(); it.release(); size--; add(newData); } } public boolean absolute(int position) { return super.absolute(position); } public Object[] getCurrent() { return currentRow.getData(); } public Row getCurrentRow() { return currentRow; } public boolean next() { boolean result = super.next(); currentRow = iterator.getNextRow(); return result; } public void remove() { if (currentRow != null) { iterator.remove(); currentRow = null; currentPos--; size--; } } public void reset() { super.reset(); iterator = mainIndex.firstRow(store); } public void release() { if (isClosed) { return; } iterator.release(); store.release(); isClosed = true; } public void clear() { table.clearAllData(store); size = 0; reset(); } public boolean isMemory() { return store.isMemory(); } public void read(RowInputInterface in, ResultMetaData meta) throws IOException {} public void write(RowOutputInterface out, ResultMetaData meta) throws IOException { reset(); out.writeLong(id); out.writeInt(size); out.writeInt(0); // offset out.writeInt(size); while (hasNext()) { Object[] data = getNext(); out.writeData(meta.getExtendedColumnCount(), meta.columnTypes, data, null, null); } reset(); } public Object[] getData(Long rowId) { tempRowData[0] = rowId; RowIterator it = idIndex.findFirstRow(session, store, tempRowData, idIndex.getDefaultColumnMap()); return it.getNext(); } public void copy(RowSetNavigatorData other, int[] rightColumnIndexes) { while (other.hasNext()) { Object[] currentData = other.getNext(); addAdjusted(currentData, rightColumnIndexes); } other.release(); } public void union(Session session, RowSetNavigatorData other) { Object[] currentData; int colCount = table.getColumnTypes().length; removeDuplicates(session); other.reset(); while (other.hasNext()) { currentData = other.getNext(); RowIterator it = findFirstRow(currentData); if (!it.hasNext()) { currentData = (Object[]) ArrayUtil.resizeArrayIfDifferent(currentData, colCount); add(currentData); } } other.release(); } public void intersect(Session session, RowSetNavigatorData other) { removeDuplicates(session); other.sortFull(session); while (hasNext()) { Object[] currentData = getNext(); boolean hasRow = other.containsRow(currentData); if (!hasRow) { remove(); } } other.release(); } public void intersectAll(Session session, RowSetNavigatorData other) { Object[] compareData = null; RowIterator it; Row otherRow = null; Object[] otherData = null; sortFull(session); reset(); other.sortFull(session); it = fullIndex.emptyIterator(); while (hasNext()) { Object[] currentData = getNext(); boolean newGroup = compareData == null || fullIndex.compareRowNonUnique( session, currentData, compareData, fullIndex.getColumnCount()) != 0; if (newGroup) { compareData = currentData; it = other.findFirstRow(currentData); } otherRow = it.getNextRow(); otherData = otherRow == null ? null : otherRow.getData(); if (otherData != null && fullIndex.compareRowNonUnique( session, currentData, otherData, fullIndex.getColumnCount()) == 0) { continue; } remove(); } other.release(); } public void except(Session session, RowSetNavigatorData other) { removeDuplicates(session); other.sortFull(session); while (hasNext()) { Object[] currentData = getNext(); boolean hasRow = other.containsRow(currentData); if (hasRow) { remove(); } } other.release(); } public void exceptAll(Session session, RowSetNavigatorData other) { Object[] compareData = null; RowIterator it; Row otherRow = null; Object[] otherData = null; sortFull(session); reset(); other.sortFull(session); it = fullIndex.emptyIterator(); while (hasNext()) { Object[] currentData = getNext(); boolean newGroup = compareData == null || fullIndex.compareRowNonUnique( session, currentData, compareData, fullIndex.getColumnCount()) != 0; if (newGroup) { compareData = currentData; it = other.findFirstRow(currentData); } otherRow = it.getNextRow(); otherData = otherRow == null ? null : otherRow.getData(); if (otherData != null && fullIndex.compareRowNonUnique( session, currentData, otherData, fullIndex.getColumnCount()) == 0) { remove(); } } other.release(); } public boolean hasUniqueNotNullRows(Session session) { sortFull(session); reset(); Object[] lastRowData = null; while (hasNext()) { Object[] currentData = getNext(); if (hasNull(currentData)) { continue; } if (lastRowData != null && fullIndex.compareRow(session, lastRowData, currentData) == 0) { return false; } else { lastRowData = currentData; } } return true; } public void removeDuplicates(Session session) { sortFull(session); reset(); Object[] lastRowData = null; while (next()) { Object[] currentData = getCurrent(); if (lastRowData != null && fullIndex.compareRow(session, lastRowData, currentData) == 0) { remove(); } else { lastRowData = currentData; } } reset(); } public void trim(int limitstart, int limitcount) { if (size == 0) { return; } if (limitstart >= size) { clear(); return; } if (limitstart != 0) { reset(); for (int i = 0; i < limitstart; i++) { next(); remove(); } } if (limitcount == 0 || limitcount >= size) { return; } reset(); for (int i = 0; i < limitcount; i++) { next(); } while (hasNext()) { next(); remove(); } } boolean hasNull(Object[] data) { for (int i = 0; i < visibleColumnCount; i++) { if (data[i] == null) { return true; } } return false; } /** * Special case for isSimpleAggregate cannot use index lookup. */ public Object[] getGroupData(Object[] data) { if (isSimpleAggregate) { if (simpleAggregateData == null) { simpleAggregateData = data; return null; } return simpleAggregateData; } RowIterator it = groupIndex.findFirstRow(session, store, data); if (it.hasNext()) { Row row = it.getNextRow(); if (isAggregate) { row.setChanged(true); } return row.getData(); } return null; } boolean containsRow(Object[] data) { RowIterator it = mainIndex.findFirstRow(session, store, data); boolean result = it.hasNext(); it.release(); return result; } RowIterator findFirstRow(Object[] data) { return mainIndex.findFirstRow(session, store, data); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/navigator/RangeIterator.java0000644000175000017500000000403712007547352024352 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.navigator; import org.hsqldb.Row; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public interface RangeIterator extends RowIterator { boolean isBeforeFirst(); boolean next(); Row getCurrentRow(); Object[] getCurrent(); Object getCurrent(int i); void setCurrent(Object[] data); Object getRowidObject(); void remove(); void reset(); int getRangePosition(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/navigator/RowSetNavigatorDataChange.java0000644000175000017500000000530312007547352026577 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.navigator; import java.io.IOException; import org.hsqldb.Row; import org.hsqldb.Session; import org.hsqldb.result.ResultMetaData; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputInterface; import org.hsqldb.types.Type; /* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 2.2.7 */ public interface RowSetNavigatorDataChange { public void release(); public int getSize(); public int getRowPosition(); public boolean next(); public boolean beforeFirst(); public Row getCurrentRow(); public Object[] getCurrentChangedData(); public int[] getCurrentChangedColumns(); public void write(RowOutputInterface out, ResultMetaData meta) throws IOException; public void read(RowInputInterface in, ResultMetaData meta) throws IOException; public void endMainDataSet(); public boolean addRow(Row row); public Object[] addRow(Session session, Row row, Object[] data, Type[] types, int[] columnMap); public boolean containsDeletedRow(Row row); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ExpressionAggregate.java0000644000175000017500000002313112007547362023555 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayListIdentity; import org.hsqldb.lib.HsqlList; import org.hsqldb.store.ValuePool; import org.hsqldb.types.ArrayType; import org.hsqldb.types.RowType; /** * Implementation of aggregate operations * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class ExpressionAggregate extends Expression { boolean isDistinctAggregate; ArrayType arrayType; ExpressionAggregate(int type, boolean distinct, Expression e) { super(type); nodes = new Expression[BINARY]; isDistinctAggregate = distinct; nodes[LEFT] = e; nodes[RIGHT] = Expression.EXPR_TRUE; } boolean isSelfAggregate() { return true; } public String getSQL() { StringBuffer sb = new StringBuffer(64); String left = getContextSQL(nodes.length > 0 ? nodes[LEFT] : null); switch (opType) { case OpTypes.COUNT : sb.append(' ').append(Tokens.T_COUNT).append('('); break; case OpTypes.SUM : sb.append(' ').append(Tokens.T_SUM).append('('); sb.append(left).append(')'); break; case OpTypes.MIN : sb.append(' ').append(Tokens.T_MIN).append('('); sb.append(left).append(')'); break; case OpTypes.MAX : sb.append(' ').append(Tokens.T_MAX).append('('); sb.append(left).append(')'); break; case OpTypes.AVG : sb.append(' ').append(Tokens.T_AVG).append('('); sb.append(left).append(')'); break; case OpTypes.EVERY : sb.append(' ').append(Tokens.T_EVERY).append('('); sb.append(left).append(')'); break; case OpTypes.SOME : sb.append(' ').append(Tokens.T_SOME).append('('); sb.append(left).append(')'); break; case OpTypes.STDDEV_POP : sb.append(' ').append(Tokens.T_STDDEV_POP).append('('); sb.append(left).append(')'); break; case OpTypes.STDDEV_SAMP : sb.append(' ').append(Tokens.T_STDDEV_SAMP).append('('); sb.append(left).append(')'); break; case OpTypes.VAR_POP : sb.append(' ').append(Tokens.T_VAR_POP).append('('); sb.append(left).append(')'); break; case OpTypes.VAR_SAMP : sb.append(' ').append(Tokens.T_VAR_SAMP).append('('); sb.append(left).append(')'); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionAggregate"); } return sb.toString(); } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(64); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } switch (opType) { case OpTypes.COUNT : sb.append(Tokens.T_COUNT).append(' '); break; case OpTypes.SUM : sb.append(Tokens.T_SUM).append(' '); break; case OpTypes.MIN : sb.append(Tokens.T_MIN).append(' '); break; case OpTypes.MAX : sb.append(Tokens.T_MAX).append(' '); break; case OpTypes.AVG : sb.append(Tokens.T_AVG).append(' '); break; case OpTypes.EVERY : sb.append(Tokens.T_EVERY).append(' '); break; case OpTypes.SOME : sb.append(Tokens.T_SOME).append(' '); break; case OpTypes.STDDEV_POP : sb.append(Tokens.T_STDDEV_POP).append(' '); break; case OpTypes.STDDEV_SAMP : sb.append(Tokens.T_STDDEV_SAMP).append(' '); break; case OpTypes.VAR_POP : sb.append(Tokens.T_VAR_POP).append(' '); break; case OpTypes.VAR_SAMP : sb.append(Tokens.T_VAR_SAMP).append(' '); break; } if (getLeftNode() != null) { sb.append(" arg=["); sb.append(nodes[LEFT].describe(session, blanks + 1)); sb.append(']'); } return sb.toString(); } public HsqlList resolveColumnReferences(Session session, RangeGroup rangeGroup, int rangeCount, RangeGroup[] rangeGroups, HsqlList unresolvedSet, boolean acceptsSequences) { HsqlList conditionSet = nodes[RIGHT].resolveColumnReferences(session, rangeGroup, rangeCount, rangeGroups, null, false); if (conditionSet != null) { ExpressionColumn.checkColumnsResolved(conditionSet); } if (unresolvedSet == null) { unresolvedSet = new ArrayListIdentity(); } unresolvedSet.add(this); return unresolvedSet; } public void resolveTypes(Session session, Expression parent) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { nodes[i].resolveTypes(session, this); } } if (nodes[LEFT].getDegree() > 1) { nodes[LEFT].dataType = new RowType(nodes[LEFT].nodeDataTypes); } if (nodes[LEFT].isUnresolvedParam()) { throw Error.error(ErrorCode.X_42567); } if (isDistinctAggregate) { if (nodes[LEFT].dataType.isLobType()) { throw Error.error(ErrorCode.X_42534); } if (nodes[LEFT].dataType.isCharacterType()) { arrayType = new ArrayType(nodes[LEFT].dataType, Integer.MAX_VALUE); } } dataType = SetFunction.getType(session, opType, nodes[LEFT].dataType); nodes[RIGHT].resolveTypes(session, null); } public boolean equals(Expression other) { if (!(other instanceof ExpressionAggregate)) { return false; } ExpressionAggregate o = (ExpressionAggregate) other; if (isDistinctAggregate == o.isDistinctAggregate) { return super.equals(other); } return false; } public Object updateAggregatingValue(Session session, Object currValue) { if (!nodes[RIGHT].testCondition(session)) { return currValue; } if (currValue == null) { currValue = new SetFunction(session, opType, nodes[LEFT].dataType, dataType, isDistinctAggregate, arrayType); } Object newValue = nodes[LEFT].opType == OpTypes.ASTERISK ? ValuePool.INTEGER_1 : nodes[LEFT].getValue(session); ((SetFunction) currValue).add(session, newValue); return currValue; } /** * Get the result of a SetFunction or an ordinary value * * @param currValue instance of set function or value * @param session context * @return object */ public Object getAggregatedValue(Session session, Object currValue) { if (currValue == null) { return opType == OpTypes.COUNT ? ValuePool.INTEGER_0 : null; } return ((SetFunction) currValue).getValue(session); } public Expression getCondition() { return nodes[RIGHT]; } public boolean hasCondition() { return nodes[RIGHT] != Expression.EXPR_TRUE; } public void setCondition(Expression e) { nodes[RIGHT] = e; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Tokens.java0000644000175000017500000043057412007547362021067 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.lib.IntKeyHashMap; import org.hsqldb.lib.IntValueHashMap; import org.hsqldb.lib.OrderedIntHashSet; /** * Defines and enumerates reserved and non-reserved SQL keywords.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 */ public class Tokens { // // SQL 200n reserved words full set static final String T_ABS = "ABS"; public static final String T_ALL = "ALL"; static final String T_ALLOCATE = "ALLOCATE"; public static final String T_ALTER = "ALTER"; static final String T_AND = "AND"; public static final String T_ANY = "ANY"; static final String T_ARE = "ARE"; public static final String T_ARRAY = "ARRAY"; public static final String T_ARRAY_AGG = "ARRAY_AGG"; public static final String T_AS = "AS"; static final String T_ASENSITIVE = "ASENSITIVE"; static final String T_ASYMMETRIC = "ASYMMETRIC"; static final String T_AT = "AT"; static final String T_ATOMIC = "ATOMIC"; public static final String T_AUTHORIZATION = "AUTHORIZATION"; public static final String T_AVG = "AVG"; static final String T_BEGIN = "BEGIN"; static final String T_BETWEEN = "BETWEEN"; public static final String T_BIGINT = "BIGINT"; public static final String T_BINARY = "BINARY"; static final String T_BIT_LENGTH = "BIT_LENGTH"; public static final String T_BLOB = "BLOB"; public static final String T_BOOLEAN = "BOOLEAN"; static final String T_BOTH = "BOTH"; static final String T_BY = "BY"; public static final String T_CALL = "CALL"; static final String T_CALLED = "CALLED"; static final String T_CARDINALITY = "CARDINALITY"; public static final String T_CASCADED = "CASCADED"; static final String T_CASE = "CASE"; static final String T_CAST = "CAST"; static final String T_CEIL = "CEIL"; static final String T_CEILING = "CEILING"; public static final String T_CHAR = "CHAR"; static final String T_CHAR_LENGTH = "CHAR_LENGTH"; public static final String T_CHARACTER = "CHARACTER"; static final String T_CHARACTER_LENGTH = "CHARACTER_LENGTH"; public static final String T_CHECK = "CHECK"; public static final String T_CLOB = "CLOB"; static final String T_CLOSE = "CLOSE"; static final String T_COALESCE = "COALESCE"; public static final String T_COLLATE = "COLLATE"; static final String T_COLLECT = "COLLECT"; static final String T_COLUMN = "COLUMN"; public static final String T_COMMIT = "COMMIT"; static final String T_CONDITION = "CONDIITON"; public static final String T_CONNECT = "CONNECT"; public static final String T_CONSTRAINT = "CONSTRAINT"; public static final String T_CONVERT = "CONVERT"; static final String T_CORR = "CORR"; static final String T_CORRESPONDING = "CORRESPONDING"; static final String T_COUNT = "COUNT"; static final String T_COVAR_POP = "COVAR_POP"; static final String T_COVAR_SAMP = "COVAR_SAMP"; public static final String T_CREATE = "CREATE"; static final String T_CROSS = "CROSS"; static final String T_CUBE = "CUBE"; static final String T_CUME_DIST = "CUME_DIST"; static final String T_CURRENT = "CURRENT"; static final String T_CURRENT_CATALOG = "CURRENT_CATALOG"; static final String T_CURRENT_DATE = "CURRENT_DATE"; static final String T_CURRENT_DEFAULT_TRANSFORM_GROUP = "CURRENT_DEFAULT_TRANSFORM_GROUP"; static final String T_CURRENT_PATH = "CURRENT_PATH"; static final String T_CURRENT_ROLE = "CURRENT_ROLE"; static final String T_CURRENT_SCHEMA = "CURRENT_SCHEMA"; static final String T_CURRENT_TIME = "CURRENT_TIME"; static final String T_CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP"; static final String T_CURRENT_TRANSFORM_GROUP_FOR_TYPE = "CURRENT_TRANSFORM_GROUP_FOR_TYPE"; static final String T_CURRENT_USER = "CURRENT_USER"; static final String T_CURSOR = "CURSOR"; static final String T_CYCLE = "CYCLE"; public static final String T_DATE = "DATE"; public static final String T_DAY = "DAY"; static final String T_DEALLOCATE = "DEALLOCATE"; public static final String T_DEC = "DEC"; public static final String T_DECIMAL = "DECIMAL"; static final String T_DECLARE = "DECLARE"; public static final String T_DEFAULT = "DEFAULT"; public static final String T_DELETE = "DELETE"; static final String T_DENSE_RANK = "DENSE_RANK"; static final String T_DEREF = "DEREF"; static final String T_DESCRIBE = "DESCRIBE"; static final String T_DETERMINISTIC = "DETERMINISTIC"; static final String T_DISCONNECT = "DISCONNECT"; static final String T_DISTINCT = "DISTINCT"; public static final String T_DO = "DO"; public static final String T_DOUBLE = "DOUBLE"; static final String T_DROP = "DROP"; static final String T_DYNAMIC = "DYNAMIC"; static final String T_EACH = "EACH"; static final String T_ELEMENT = "ELEMENT"; static final String T_ELSE = "ELSE"; static final String T_ELSEIF = "ELSEIF"; static final String T_END = "END"; static final String T_END_EXEC = "END_EXEC"; static final String T_ESCAPE = "ESCAPE"; static final String T_EVERY = "EVERY"; static final String T_EXCEPT = "EXCEPT"; static final String T_EXEC = "EXEC"; public static final String T_EXECUTE = "EXECUTE"; static final String T_EXISTS = "EXISTS"; static final String T_EXP = "EXP"; public static final String T_EXTERNAL = "EXTERNAL"; static final String T_EXTRACT = "EXTRACT"; public static final String T_FALSE = "FALSE"; static final String T_FETCH = "FETCH"; static final String T_FILTER = "FILTER"; static final String T_FIRST_VALUE = "FIRST_VALUE"; public static final String T_FLOAT = "FLOAT"; static final String T_FLOOR = "FLOOR"; public static final String T_FOR = "FOR"; public static final String T_FOREIGN = "FOREIGN"; static final String T_FREE = "FREE"; public static final String T_FROM = "FROM"; static final String T_FULL = "FULL"; public static final String T_FUNCTION = "FUNCTION"; static final String T_FUSION = "FUSION"; public static final String T_GET = "GET"; static final String T_GLOBAL = "GLOBAL"; public static final String T_GRANT = "GRANT"; static final String T_GROUP = "GROUP"; static final String T_GROUPING = "GROUPING"; static final String T_HANDLER = "HANDLER"; static final String T_HAVING = "HAVING"; static final String T_HOLD = "HOLD"; public static final String T_HOUR = "HOUR"; static final String T_IDENTITY = "IDENTITY"; static final String T_IF = "IF"; static final String T_IMPORT = "IMPORT"; static final String T_IN = "IN"; static final String T_INDICATOR = "INDICATOR"; static final String T_INNER = "INNER"; static final String T_INOUT = "INOUT"; static final String T_INSENSITIVE = "INSENSITIVE"; public static final String T_INSERT = "INSERT"; public static final String T_INT = "INT"; public static final String T_INTEGER = "INTEGER"; static final String T_INTERSECT = "INTERSECT"; static final String T_INTERSECTION = "INTERSECTION"; public static final String T_INTERVAL = "INTERVAL"; static final String T_INTO = "INTO"; static final String T_ITERATE = "ITERATE"; public static final String T_IS = "IS"; static final String T_JAR = "JAR"; // SQL/JRT static final String T_JOIN = "JOIN"; static final String T_LAG = "LAG"; public static final String T_LANGUAGE = "LANGUAGE"; static final String T_LARGE = "LARGE"; static final String T_LAST_VALUE = "LAST_VALUE"; static final String T_LATERAL = "LATERAL"; static final String T_LEAD = "LEAD"; static final String T_LEADING = "LEADING"; static final String T_LEAVE = "LEAVE"; static final String T_LEFT = "LEFT"; static final String T_LIKE = "LIKE"; static final String T_LIKE_REGX = "LIKE_REGX"; static final String T_LN = "LN"; public static final String T_LOCAL = "LOCAL"; static final String T_LOCALTIME = "LOCALTIME"; static final String T_LOCALTIMESTAMP = "LOCALTIMESTAMP"; public static final String T_LOOP = "LOOP"; static final String T_LOWER = "LOWER"; static final String T_MATCH = "MATCH"; static final String T_MAX = "MAX"; static final String T_MAX_CARDINALITY = "MAX_CARDINALITY"; static final String T_MEMBER = "MEMBER"; static final String T_MERGE = "MERGE"; static final String T_METHOD = "METHOD"; static final String T_MIN = "MIN"; public static final String T_MINUTE = "MINUTE"; static final String T_MOD = "MOD"; static final String T_MODIFIES = "MODIFIES"; static final String T_MODULE = "MODULE"; public static final String T_MONTH = "MONTH"; public static final String T_MULTISET = "MULTISET"; static final String T_NATIONAL = "NATIONAL"; static final String T_NATURAL = "NATURAL"; static final String T_NCHAR = "NCHAR"; static final String T_NCLOB = "NCLOB"; static final String T_NEW = "NEW"; public static final String T_NO = "NO"; public static final String T_NONE = "NONE"; static final String T_NORMALIZE = "NORMALIZE"; static final String T_NOT = "NOT"; static final String T_NTH_VALUE = "NTH_VALUE"; static final String T_NTILE = "NTILE"; public static final String T_NULL = "NULL"; public static final String T_NULLIF = "NULLIF"; public static final String T_NUMERIC = "NUMERIC"; static final String T_OCCURRENCES_REGEX = "OCCURRENCES_REGEX"; static final String T_OCTET_LENGTH = "OCTET_LENGTH"; static final String T_OF = "OF"; static final String T_OFFSET = "OFFSET"; static final String T_OLD = "OLD"; public static final String T_ON = "ON"; public static final String T_ONLY = "ONLY"; static final String T_OPEN = "OPEN"; static final String T_OR = "OR"; static final String T_ORDER = "ORDER"; static final String T_OUT = "OUT"; static final String T_OUTER = "OUTER"; static final String T_OVER = "OVER"; static final String T_OVERLAPS = "OVERLAPS"; static final String T_OVERLAY = "OVERLAY"; static final String T_PARAMETER = "PARAMETER"; static final String T_PARTITION = "PARTITION"; static final String T_PERCENT_RANK = "PERCENT_RANK"; static final String T_PERCENTILE_CONT = "PERCENTILE_CONT"; static final String T_PERCENTILE_DISC = "PERCENTILE_DISC"; static final String T_POSITION = "POSITION"; static final String T_POSITION_REGEX = "POSITION_REGEX"; static final String T_POWER = "POWER"; static final String T_PRECISION = "PRECISION"; static final String T_PREPARE = "PREPARE"; static final String T_PRIMARY = "PRIMARY"; public static final String T_PROCEDURE = "PROCEDURE"; static final String T_RANGE = "RANGE"; static final String T_RANK = "RANK"; static final String T_READS = "READS"; public static final String T_REAL = "REAL"; static final String T_RECURSIVE = "RECURSIVE"; static final String T_REF = "REF"; public static final String T_REFERENCES = "REFERENCES"; static final String T_REFERENCING = "REFERENCING"; static final String T_REGR_AVGX = "REGR_AVGX"; static final String T_REGR_AVGY = "REGR_AVGY"; static final String T_REGR_COUNT = "REGR_COUNT"; static final String T_REGR_INTERCEPT = "REGR_INTERCEPT"; static final String T_REGR_R2 = "REGR_R2"; static final String T_REGR_SLOPE = "REGR_SLOPE"; static final String T_REGR_SXX = "REGR_SXX"; static final String T_REGR_SXY = "REGR_SXY"; static final String T_REGR_SYY = "REGR_SYY"; static final String T_RELEASE = "RELEASE"; static final String T_REPEAT = "REPEAT"; static final String T_RESIGNAL = "RESIGNAL"; public static final String T_RESULT = "RESULT"; static final String T_RETURN = "RETURN"; static final String T_RETURNS = "RETURNS"; static final String T_REVOKE = "REVOKE"; static final String T_RIGHT = "RIGHT"; public static final String T_ROLLBACK = "ROLLBACK"; static final String T_ROLLUP = "ROLLUP"; public static final String T_ROW = "ROW"; static final String T_ROW_NUMBER = "ROW_NUMBER"; public static final String T_ROWS = "ROWS"; static final String T_SAVEPOINT = "SAVEPOINT"; static final String T_SCOPE = "SCOPE"; static final String T_SCROLL = "SCROLL"; static final String T_SEARCH = "SEARCH"; public static final String T_SECOND = "SECOND"; public static final String T_SELECT = "SELECT"; static final String T_SENSITIVE = "SENSITIVE"; static final String T_SESSION_USER = "SESSION_USER"; public static final String T_SET = "SET"; static final String T_SIGNAL = "SIGNAL"; static final String T_SIMILAR = "SIMILAR"; public static final String T_SMALLINT = "SMALLINT"; static final String T_SOME = "SOME"; public static final String T_SPECIFIC = "SPECIFIC"; static final String T_SPECIFICTYPE = "SPECIFICTYPE"; public static final String T_SQL = "SQL"; static final String T_SQLEXCEPTION = "SQLEXCEPTION"; static final String T_SQLSTATE = "SQLSTATE"; static final String T_SQLWARNING = "SQLWARNING"; static final String T_SQRT = "SQRT"; static final String T_START = "START"; static final String T_STATIC = "STATIC"; static final String T_STDDEV_POP = "STDDEV_POP"; static final String T_STDDEV_SAMP = "STDDEV_SAMP"; static final String T_SUBMULTISET = "SUBMULTISET"; static final String T_SUBSTRING = "SUBSTRING"; static final String T_SUBSTRING_REGEX = "SUBSTRING_REGEX"; static final String T_SUM = "SUM"; static final String T_SYMMETRIC = "SYMMETRIC"; static final String T_SYSTEM = "SYSTEM"; static final String T_SYSTEM_USER = "SYSTEM_USER"; public static final String T_TABLE = "TABLE"; static final String T_TABLESAMPLE = "TABLESAMPLE"; static final String T_THEN = "THEN"; public static final String T_TIME = "TIME"; public static final String T_TIMESTAMP = "TIMESTAMP"; public static final String T_TIMEZONE_HOUR = "TIMEZONE_HOUR"; public static final String T_TIMEZONE_MINUTE = "TIMEZONE_MINUTE"; public static final String T_TO = "TO"; static final String T_TRAILING = "TRAILING"; public static final String T_TRANSLATE = "TRANSLATE"; static final String T_TRANSLATE_REGEX = "TRANSLATE_REGEX"; static final String T_TRANSLATION = "TRANSLATION"; static final String T_TREAT = "TREAT"; public static final String T_TRIGGER = "TRIGGER"; static final String T_TRIM = "TRIM"; static final String T_TRIM_ARRAY = "TRIM_ARRAY"; public static final String T_TRUE = "TRUE"; public static final String T_TRUNCATE = "TRUNCATE"; static final String T_UESCAPE = "UESCAPE"; static final String T_UNION = "UNION"; public static final String T_UNIQUE = "UNIQUE"; public static final String T_UNKNOWN = "UNKNOWN"; static final String T_UNNEST = "UNNEST"; static final String T_UNTIL = "UNTIL"; public static final String T_UPDATE = "UPDATE"; static final String T_UPPER = "UPPER"; public static final String T_USER = "USER"; static final String T_USING = "USING"; static final String T_VALUE = "VALUE"; static final String T_VALUES = "VALUES"; static final String T_VAR_POP = "VAR_POP"; static final String T_VAR_SAMP = "VAR_SAMP"; public static final String T_VARBINARY = "VARBINARY"; public static final String T_VARCHAR = "VARCHAR"; static final String T_VARYING = "VARYING"; static final String T_WHEN = "WHEN"; static final String T_WHENEVER = "WHENEVER"; static final String T_WHERE = "WHERE"; public static final String T_WHILE = "WHILE"; static final String T_WIDTH_BUCKET = "WIDTH_BUCKET"; static final String T_WINDOW = "WINDOW"; public static final String T_WITH = "WITH"; static final String T_WITHIN = "WITHIN"; static final String T_WITHOUT = "WITHOUT"; public static final String T_YEAR = "YEAR"; // ops static final String T_ASTERISK = "*"; public static final String T_COMMA = ","; static final String T_CIRCUMFLEX = "^"; static final String T_CLOSEBRACKET = ")"; static final String T_COLON = ":"; static final String T_CONCAT = "||"; public static final String T_DIVIDE = "/"; static final String T_EQUALS = "="; static final String T_GREATER = ">"; static final String T_GREATER_EQUALS = ">="; public static final String T_LEFTBRACKET = "["; static final String T_LESS = "<"; static final String T_LESS_EQUALS = "<="; static final String T_PERCENT = "%"; static final String T_PLUS = "+"; static final String T_MINUS = "-"; static final String T_NOT_EQUALS = "<>"; static final String T_NOT_EQUALS_ALT = "!="; static final String T_OPENBRACKET = "("; static final String T_QUESTION = "?"; public static final String T_RIGHTBRACKET = "]"; static final String T_SEMICOLON = ";"; static final String T_DOUBLE_COLON = "::"; // SQL:200n non-reserved word list static final String T_A = "A"; static final String T_ABSOLUTE = "ABSOLUTE"; static final String T_ACTION = "ACTION"; static final String T_ADA = "ADA"; static final String T_ADD = "ADD"; static final String T_ADMIN = "ADMIN"; static final String T_AFTER = "AFTER"; static final String T_ALWAYS = "ALWAYS"; static final String T_ASC = "ASC"; static final String T_ASSERTION = "ASSERTION"; static final String T_ASSIGNMENT = "ASSIGNMENT"; static final String T_ATTRIBUTE = "ATTRIBUTE"; static final String T_ATTRIBUTES = "ATTRIBUTES"; static final String T_BEFORE = "BEFORE"; static final String T_BERNOULLI = "BERNOULLI"; public static final String T_BIT = "BIT"; static final String T_BITLENGTH = "BITLENGTH"; static final String T_BREADTH = "BREADTH"; static final String T_C = "C"; static final String T_CASCADE = "CASCADE"; public static final String T_CATALOG = "CATALOG"; public static final String T_CATALOG_NAME = "CATALOG_NAME"; static final String T_CHAIN = "CHAIN"; static final String T_CHARACTER_SET_CATALOG = "CHARACTER_SET_CATALOG"; static final String T_CHARACTER_SET_NAME = "CHARACTER_SET_NAME"; static final String T_CHARACTER_SET_SCHEMA = "CHARACTER_SET_SCHEMA"; static final String T_CHARACTERISTICS = "CHARACTERISTICS"; static final String T_CHARACTERS = "CHARACTERS"; static final String T_CLASS_ORIGIN = "CLASS_ORIGIN"; static final String T_COBOL = "COBOL"; public static final String T_COLLATION = "COLLATION"; static final String T_COLLATION_CATALOG = "COLLATION_CATALOG"; static final String T_COLLATION_NAME = "COLLATION_NAME"; static final String T_COLLATION_SCHEMA = "COLLATION_SCHEMA"; static final String T_COLUMN_NAME = "COLUMN_NAME"; static final String T_COMMAND_FUNCTION = "COMMAND_FUNCTION"; static final String T_COMMAND_FUNCTION_CODE = "COMMAND_FUNCTION_CODE"; public static final String T_COMMITTED = "COMMITTED"; static final String T_COMPARABLE = "COMPARABLE"; // SQL/JRT static final String T_CONDITION_IDENTIFIER = "CONDIITON_IDENTIFIER"; static final String T_CONDITION_NUMBER = "CONDITION_NUMBER"; static final String T_CONNECTION_NAME = "CONNECTION_NAME"; static final String T_CONSTRAINT_CATALOG = "CONSTRAINT_CATALOG"; static final String T_CONSTRAINT_NAME = "CONSTRAINT_NAME"; static final String T_CONSTRAINT_SCHEMA = "CONSTRAINT_SCHEMA"; static final String T_CONSTRAINTS = "CONSTRAINTS"; static final String T_CONSTRUCTOR = "CONSTRUCTOR"; static final String T_CONTAINS = "CONTAINS"; static final String T_CONTINUE = "CONTINUE"; static final String T_CURRENT_COLLATION = "CURRENT_COLLATION"; static final String T_CURSOR_NAME = "CURSOR_NAME"; public static final String T_DATA = "DATA"; static final String T_DATETIME_INTERVAL_CODE = "DATETIME_INTERVAL_CODE"; static final String T_DATETIME_INTERVAL_PRECISION = "DATETIME_INTERVAL_PRECISION"; public static final String T_DEFAULTS = "DEFAULTS"; static final String T_DEFERRABLE = "DEFERRABLE"; static final String T_DEFERRED = "DEFERRED"; static final String T_DEFINED = "DEFINED"; static final String T_DEFINER = "DEFINER"; static final String T_DEGREE = "DEGREE"; static final String T_DEPTH = "DEPTH"; static final String T_DERIVED = "DERIVED"; static final String T_DESC = "DESC"; static final String T_DESCRIPTOR = "DESCRIPTOR"; static final String T_DIAGNOSTICS = "DIAGNOSTICS"; static final String T_DISPATCH = "DISPATCH"; public static final String T_DOMAIN = "DOMAIN"; static final String T_DYNAMIC_FUNCTION = "DYNAMIC_FUNCTION"; static final String T_DYNAMIC_FUNCTION_CODE = "DYNAMIC_FUNCTION_CODE"; static final String T_EXCEPTION = "EXCEPTION"; static final String T_EXCLUDE = "EXCLUDE"; static final String T_EXCLUDING = "EXCLUDING"; static final String T_EXIT = "EXIT"; static final String T_FINAL = "FINAL"; public static final String T_FIRST = "FIRST"; static final String T_FOLLOWING = "FOLLOWING"; static final String T_FORTRAN = "FORTRAN"; static final String T_FOUND = "FOUND"; public static final String T_G_FACTOR = "G"; static final String T_GENERATED = "GENERATED"; static final String T_GENERAL = "GENERAL"; static final String T_GO = "GO"; static final String T_GOTO = "GOTO"; static final String T_GRANTED = "GRANTED"; static final String T_HIERARCHY = "HIERARCHY"; static final String T_IMPLEMENTATION = "IMPLEMENTATION"; static final String T_INCLUDING = "INCLUDING"; public static final String T_INCREMENT = "INCREMENT"; static final String T_INITIALLY = "INITIALLY"; static final String T_INPUT = "INPUT"; static final String T_INSTANCE = "INSTANCE"; static final String T_INSTANTIABLE = "INSTANTIABLE"; static final String T_INSTEAD = "INSTEAD"; static final String T_INTERFACE = "INTERFACE"; // SQL/JRT static final String T_INVOKER = "INVOKER"; public static final String T_ISOLATION = "ISOLATION"; public static final String T_JAVA = "JAVA"; // SQL/JRT public static final String T_K_FACTOR = "K"; static final String T_KEY = "KEY"; static final String T_KEY_MEMBER = "KEY_MEMBER"; static final String T_KEY_TYPE = "KEY_TYPE"; static final String T_LAST = "LAST"; static final String T_LENGTH = "LENGTH"; public static final String T_LEVEL = "LEVEL"; public static final String T_LIBRARY = "LIBRARY"; static final String T_LOCATOR = "LOCATOR"; public static final String T_M_FACTOR = "M"; static final String T_MAP = "MAP"; static final String T_MATCHED = "MATCHED"; static final String T_MAXVALUE = "MAXVALUE"; static final String T_MESSAGE_LENGTH = "MESSAGE_LENGTH"; static final String T_MESSAGE_OCTET_LENGTH = "MESSAGE_OCTET_LENGTH"; static final String T_MESSAGE_TEXT = "MESSAGE_TEXT"; static final String T_MINVALUE = "MINVALUE"; static final String T_MORE = "MORE"; static final String T_MUMPS = "MUMPS"; public static final String T_NAME = "NAME"; public static final String T_NAMES = "NAMES"; static final String T_NESTING = "NESTING"; static final String T_NEXT = "NEXT"; static final String T_NORMALIZED = "NORMALIZED"; static final String T_NULLABLE = "NULLABLE"; public static final String T_NULLS = "NULLS"; static final String T_NUMBER = "NUMBER"; public static final String T_OBJECT = "OBJECT"; static final String T_OCTETS = "OCTETS"; static final String T_OPTION = "OPTION"; static final String T_OPTIONS = "OPTIONS"; static final String T_ORDERING = "ORDERING"; static final String T_ORDINALITY = "ORDINALITY"; static final String T_OTHERS = "OTHERS"; public static final String T_OVERRIDING = "OVERRIDING"; public static final String T_P_FACTOR = "P"; public static final String T_PAD = "PAD"; static final String T_PARAMETER_MODE = "PARAMETER_MODE"; static final String T_PARAMETER_NAME = "PARAMETER_NAME"; static final String T_PARAMETER_ORDINAL_POSITION = "PARAMETER_ORDINAL_POSITION"; static final String T_PARAMETER_SPECIFIC_CATALOG = "PARAMETER_SPECIFIC_CATALOG"; static final String T_PARAMETER_SPEC_NAME = "PARAMETER_SPECIFIC_NAME"; static final String T_PARAMETER_SPEC_SCHEMA = "PARAMETER_SPECIFIC_SCHEMA"; static final String T_PARTIAL = "PARTIAL"; static final String T_PASCAL = "PASCAL"; public static final String T_PATH = "PATH"; static final String T_PLACING = "PLACING"; static final String T_PLI = "PLI"; static final String T_PRECEDING = "PRECEDING"; static final String T_PRESERVE = "PRESERVE"; static final String T_PRIOR = "PRIOR"; static final String T_PRIVILEGES = "PRIVILEGES"; public static final String T_PUBLIC = "PUBLIC"; public static final String T_READ = "READ"; static final String T_RELATIVE = "RELATIVE"; static final String T_REPEATABLE = "REPEATABLE"; static final String T_RESTART = "RESTART"; static final String T_RESET = "RESET"; static final String T_RETURNED_CARDINALITY = "RETURNED_CARDINALITY"; static final String T_RETURNED_LENGTH = "RETURNED_LENGTH"; static final String T_RETURNED_OCTET_LENGTH = "RETURNED_OCTET_LENGTH"; static final String T_RETURNED_SQLSTATE = "RETURNED_SQLSTATE"; public static final String T_ROLE = "ROLE"; public static final String T_ROUTINE = "ROUTINE"; static final String T_ROUTINE_CATALOG = "ROUTINE_CATALOG"; static final String T_ROUTINE_NAME = "ROUTINE_NAME"; static final String T_ROUTINE_SCHEMA = "ROUTINE_SCHEMA"; static final String T_ROW_COUNT = "ROW_COUNT"; public static final String T_SCALE = "SCALE"; public static final String T_SCHEMA = "SCHEMA"; static final String T_SCHEMA_NAME = "SCHEMA_NAME"; static final String T_SCOPE_CATALOG = "SCOPE_CATALOG"; static final String T_SCOPE_NAME = "SCOPE_NAME"; static final String T_SCOPE_SCHEMA = "SCOPE_SCHEMA"; static final String T_SECTION = "SECTION"; static final String T_SECURITY = "SECURITY"; static final String T_SELF = "SELF"; public static final String T_SEQUENCE = "SEQUENCE"; static final String T_SERIAL = "SERIAL"; public static final String T_SERIALIZABLE = "SERIALIZABLE"; public static final String T_SERVER = "SERVER"; static final String T_SERVER_NAME = "SERVER_NAME"; public static final String T_SESSION = "SESSION"; static final String T_SETS = "SETS"; static final String T_SIMPLE = "SIMPLE"; public static final String T_SIZE = "SIZE"; static final String T_SOURCE = "SOURCE"; public static final String T_SPACE = "SPACE"; static final String T_SPECIFIC_NAME = "SPECIFIC_NAME"; static final String T_SQLDATA = "SQLDATA"; // SQL/JRT static final String T_STACKED = "STACKED"; static final String T_STATE = "STATE"; static final String T_STATEMENT = "STATEMENT"; static final String T_STRUCTURE = "STRUCTURE"; static final String T_STYLE = "STYLE"; static final String T_SUBCLASS_ORIGIN = "SUBCLASS_ORIGIN"; public static final String T_T_FACTOR = "T"; static final String T_TABLE_NAME = "TABLE_NAME"; static final String T_TEMPORARY = "TEMPORARY"; static final String T_TIES = "TIES"; static final String T_TOP_LEVEL_COUNT = "TOP_LEVEL_COUNT"; public static final String T_TRANSACTION = "TRANSACTION"; static final String T_TRANSACTS_COMMITTED = "TRANSACTIONS_COMMITTED"; static final String T_TRANSACTS_ROLLED_BACK = "TRANSACTIONS_ROLLED_BACK"; static final String T_TRANSACTION_ACTIVE = "TRANSACTION_ACTIVE"; static final String T_TRANSFORM = "TRANSFORM"; static final String T_TRANSFORMS = "TRANSFORMS"; static final String T_TRIGGER_CATALOG = "TRIGGER_CATALOG"; static final String T_TRIGGER_NAME = "TRIGGER_NAME"; static final String T_TRIGGER_SCHEMA = "TRIGGER_SCHEMA"; public static final String T_TYPE = "TYPE"; static final String T_UNBOUNDED = "UNBOUNDED"; static final String T_UNCOMMITTED = "UNCOMMITTED"; static final String T_UNDER = "UNDER"; static final String T_UNDO = "UNDO"; static final String T_UNNAMED = "UNNAMED"; public static final String T_USAGE = "USAGE"; static final String T_USER_DEFINED_TYPE_CATALOG = "USER_DEFINED_TYPE_CATALOG"; static final String T_USER_DEFINED_TYPE_CODE = "USER_DEFINED_TYPE_CODE"; static final String T_USER_DEFINED_TYPE_NAME = "USER_DEFINED_TYPE_NAME"; static final String T_USER_DEFINED_TYPE_SCHEMA = "USER_DEFINED_TYPE_SCHEMA"; static final String T_VIEW = "VIEW"; static final String T_WORK = "WORK"; public static final String T_WRAPPER = "WRAPPER"; public static final String T_WRITE = "WRITE"; public static final String T_ZONE = "ZONE"; // other tokens static final String T_ALIAS = "ALIAS"; static final String T_AGGREGATE = "AGGREGATE"; public static final String T_AUTHENTICATION = "AUTHENTICATION"; static final String T_AUTO_INCREMENT = "AUTO_INCREMENT"; static final String T_AUTOCOMMIT = "AUTOCOMMIT"; public static final String T_BACKUP = "BACKUP"; static final String T_BIGSERIAL = "BIGSERIAL"; static final String T_BINARY_DOUBLE = "BINARY_DOUBLE"; static final String T_BINARY_FLOAT = "BINARY_FLOAT"; static final String T_BODY = "BODY"; static final String T_BYTE = "BYTE"; public static final String T_CACHE = "CACHE"; static final String T_CACHED = "CACHED"; static final String T_CASEWHEN = "CASEWHEN"; static final String T_CHECKPOINT = "CHECKPOINT"; static final String T_CITEXT = "CITEXT"; static final String T_CLASS = "CLASS"; static final String T_CLUSTERED = "CLUSTERED"; static final String T_COMMENT = "COMMENT"; static final String T_COMPACT = "COMPACT"; public static final String T_COMPRESSED = "COMPRESSED"; public static final String T_CONFLICT = "CONFLICT"; public static final String T_CONTROL = "CONTROL"; static final String T_CURDATE = "CURDATE"; static final String T_CURRVAL = "CURRVAL"; static final String T_CURTIME = "CURTIME"; public static final String T_DATABASE = "DATABASE"; public static final String T_DATETIME = "DATETIME"; public static final String T_DB2 = "DB2"; public static final String T_DEADLOCK = "DEADLOCK"; public static final String T_DEFRAG = "DEFRAG"; public static final String T_DELAY = "DELAY"; public static final String T_DIGEST = "DIGEST"; static final String T_DUAL = "DUAL"; static final String T_EXPLAIN = "EXPLAIN"; public static final String T_EVENT = "EVENT"; static final String T_FILE = "FILE"; public static final String T_FILES = "FILES"; static final String T_FOLD = "FOLD"; static final String T_FORMAT = "FORMAT"; static final String T_GROUP_CONCAT = "GROUP_CONCAT"; static final String T_HEADER = "HEADER"; static final String T_IFNULL = "IFNULL"; static final String T_IGNORECASE = "IGNORECASE"; static final String T_IMMEDIATELY = "IMMEDIATELY"; public static final String T_INDEX = "INDEX"; public static final String T_INITIAL = "INITIAL"; public static final String T_INTEGRITY = "INTEGRITY"; static final String T_IS_AUTOCOMMIT = "IS_AUTOCOMMIT"; static final String T_IS_READONLY_DATABASE = "IS_READONLY_DATABASE"; static final String T_IS_READONLY_DATABASE_FILES = "IS_READONLY_DATABASE_FILES"; static final String T_IS_READONLY_SESSION = "IS_READONLY_SESSION"; static final String T_ISNULL = "ISNULL"; static final String T_LASTVAL = "LASTVAL"; static final String T_LIMIT = "LIMIT"; public static final String T_LOB = "LOB"; public static final String T_LOCK = "LOCK"; public static final String T_LOCKS = "LOCKS"; public static final String T_LONG = "LONG"; public static final String T_LONGVAR = "LONGVAR"; public static final String T_LONGVARBINARY = "LONGVARBINARY"; public static final String T_LONGVARCHAR = "LONGVARCHAR"; static final String T_MAXROWS = "MAXROWS"; static final String T_MEDIAN = "MEDIAN"; public static final String T_MEMORY = "MEMORY"; public static final String T_MILLIS = "MILLIS"; static final String T_MINUS_EXCEPT = "MINUS"; public static final String T_MSS = "MSS"; public static final String T_MVCC = "MVCC"; public static final String T_MVLOCKS = "MVLOCKS"; public static final String T_MYS = "MYS"; public static final String T_NAN = "NAN"; static final String T_NEXTVAL = "NEXTVAL"; public static final String T_NIO = "NIO"; static final String T_NOWAIT = "NOWAIT"; public static final String T_NVARCHAR = "NVARCHAR"; public static final String T_NVARCHAR2 = "NVARCHAR2"; static final String T_NVL = "NVL"; static final String T_NVL2 = "NVL2"; static final String T_OCTETLENGTH = "OCTETLENGTH"; static final String T_OFF = "OFF"; public static final String T_OTHER = "OTHER"; public static final String T_ORA = "ORA"; public static final String T_PASSWORD = "PASSWORD"; static final String T_PLAN = "PLAN"; public static final String T_PGS = "PGS"; static final String T_PROPERTY = "PROPERTY"; static final String T_QUEUE = "QUEUE"; static final String T_RAW = "RAW"; static final String T_READONLY = "READONLY"; static final String T_REFERENTIAL = "REFERENTIAL"; public static final String T_REGULAR = "REGULAR"; static final String T_RENAME = "RENAME"; static final String T_RESTRICT = "RESTRICT"; static final String T_ROWNUM = "ROWNUM"; static final String T_SCRIPT = "SCRIPT"; static final String T_SEPARATOR = "SEPARATOR"; static final String T_BLOCKING = "BLOCKING"; static final String T_SHUTDOWN = "SHUTDOWN"; static final String T_SQL_TSI_DAY = "SQL_TSI_DAY"; static final String T_SQL_TSI_FRAC_SECOND = "SQL_TSI_FRAC_SECOND"; static final String T_SQL_TSI_MILLI_SECOND = "SQL_TSI_MILLI_SECOND"; static final String T_SQL_TSI_HOUR = "SQL_TSI_HOUR"; static final String T_SQL_TSI_MINUTE = "SQL_TSI_MINUTE"; static final String T_SQL_TSI_MONTH = "SQL_TSI_MONTH"; static final String T_SQL_TSI_QUARTER = "SQL_TSI_QUARTER"; static final String T_SQL_TSI_SECOND = "SQL_TSI_SECOND"; static final String T_SQL_TSI_WEEK = "SQL_TSI_WEEK"; static final String T_SQL_TSI_YEAR = "SQL_TSI_YEAR"; static final String T_SQL_BIGINT = "SQL_BIGINT"; static final String T_SQL_BINARY = "SQL_BINARY"; static final String T_SQL_BIT = "SQL_BIT"; static final String T_SQL_BLOB = "SQL_BLOB"; static final String T_SQL_BOOLEAN = "SQL_BOOLEAN"; static final String T_SQL_CHAR = "SQL_CHAR"; static final String T_SQL_CLOB = "SQL_CLOB"; static final String T_SQL_DATE = "SQL_DATE"; static final String T_SQL_DECIMAL = "SQL_DECIMAL"; static final String T_SQL_DATALINK = "SQL_DATALINK"; static final String T_SQL_DOUBLE = "SQL_DOUBLE"; static final String T_SQL_FLOAT = "SQL_FLOAT"; static final String T_SQL_INTEGER = "SQL_INTEGER"; static final String T_SQL_LONGVARBINARY = "SQL_LONGVARBINARY"; static final String T_SQL_LONGNVARCHAR = "SQL_LONGNVARCHAR"; static final String T_SQL_LONGVARCHAR = "SQL_LONGVARCHAR"; static final String T_SQL_NCHAR = "SQL_NCHAR"; static final String T_SQL_NCLOB = "SQL_NCLOB"; static final String T_SQL_NUMERIC = "SQL_NUMERIC"; static final String T_SQL_NVARCHAR = "SQL_NVARCHAR"; static final String T_SQL_REAL = "SQL_REAL"; static final String T_SQL_ROWID = "SQL_ROWID"; static final String T_SQL_SQLXML = "SQL_SQLXML"; static final String T_SQL_SMALLINT = "SQL_SMALLINT"; static final String T_SQL_TIME = "SQL_TIME"; static final String T_SQL_TIMESTAMP = "SQL_TIMESTAMP"; static final String T_SQL_TINYINT = "SQL_TINYINT"; static final String T_SQL_VARBINARY = "SQL_VARBINARY"; static final String T_SQL_VARCHAR = "SQL_VARCHAR"; public static final String T_SYNTAX = "SYNTAX"; public static final String T_TDC = "TDC"; public static final String T_TEMP = "TEMP"; public static final String T_TEXT = "TEXT"; static final String T_TIMESTAMPADD = "TIMESTAMPADD"; static final String T_TIMESTAMPDIFF = "TIMESTAMPDIFF"; public static final String T_TINYINT = "TINYINT"; static final String T_TOP = "TOP"; public static final String T_TTI = "TTI"; public static final String T_TYPES = "TYPES"; public static final String T_VARCHAR_IGNORECASE = "VARCHAR_IGNORECASE"; public static final String T_VARCHAR2 = "VARCHAR2"; public static final String T_UTF16 = "UTF16"; static final String T_WRITE_DELAY = "WRITE_DELAY"; public static final String T_YES = "YES"; // public static final String T_DAY_NAME = "DAY_NAME"; public static final String T_MONTH_NAME = "MONTH_NAME"; public static final String T_QUARTER = "QUARTER"; public static final String T_DAY_OF_WEEK = "DAY_OF_WEEK"; public static final String T_DAY_OF_MONTH = "DAY_OF_MONTH"; public static final String T_DAY_OF_YEAR = "DAY_OF_YEAR"; public static final String T_WEEK_OF_YEAR = "WEEK_OF_YEAR"; static final String T_DAYNAME = "DAYNAME"; static final String T_MONTHNAME = "MONTHNAME"; static final String T_DAYOFMONTH = "DAYOFMONTH"; static final String T_DAYOFWEEK = "DAYOFWEEK"; static final String T_DAYOFYEAR = "DAYOFYEAR"; static final String T_WEEK = "WEEK"; static final String T_DAYS = "DAYS"; // static final String T_ACOS = "ACOS"; static final String T_ACTION_ID = "ACTION_ID"; static final String T_ARRAY_SORT = "ARRAY_SORT"; static final String T_ASCII = "ASCII"; static final String T_ASIN = "ASIN"; static final String T_ATAN = "ATAN"; static final String T_ATAN2 = "ATAN2"; static final String T_BITAND = "BITAND"; static final String T_BITANDNOT = "BITANDNOT"; static final String T_BITNOT = "BITNOT"; static final String T_BITOR = "BITOR"; static final String T_BITXOR = "BITXOR"; public static final String T_CONCAT_WORD = "CONCAT"; static final String T_CHR = "CHR"; static final String T_COS = "COS"; static final String T_COT = "COT"; static final String T_CRYPT_KEY = "CRYPT_KEY"; static final String T_DATABASE_NAME = "DATABASE_NAME"; static final String T_DATE_ADD = "DATE_ADD"; static final String T_DATE_SUB = "DATE_SUB"; static final String T_DATEADD = "DATEADD"; static final String T_DATEDIFF = "DATEDIFF"; static final String T_DECODE = "DECODE"; static final String T_DEGREES = "DEGREES"; static final String T_DIFFERENCE = "DIFFERENCE"; static final String T_DMOD = "DMOD"; public static final String T_GC = "GC"; static final String T_GREATEST = "GREATEST"; static final String T_HEXTORAW = "HEXTORAW"; static final String T_LCASE = "LCASE"; static final String T_LEAST = "LEAST"; static final String T_LOAD_FILE = "LOAD_FILE"; static final String T_LOCATE = "LOCATE"; public static final String T_LOG = "LOG"; static final String T_LOG10 = "LOG10"; static final String T_LPAD = "LPAD"; static final String T_LTRIM = "LTRIM"; static final String T_NOW = "NOW"; static final String T_PI = "PI"; static final String T_POSITION_ARRAY = "POSITION_ARRAY"; static final String T_RADIANS = "RADIANS"; static final String T_RAND = "RAND"; static final String T_RAWTOHEX = "RAWTOHEX"; static final String T_REGEXP_MATCHES = "REGEXP_MATCHES"; static final String T_REGEXP_SUBSTRING = "REGEXP_SUBSTRING"; static final String T_REGEXP_SUBSTRING_ARRAY = "REGEXP_SUBSTRING_ARRAY"; static final String T_REPLACE = "REPLACE"; static final String T_REVERSE = "REVERSE"; static final String T_ROUND = "ROUND"; static final String T_ROUNDMAGIC = "ROUNDMAGIC"; static final String T_RPAD = "RPAD"; static final String T_RTRIM = "RTRIM"; public static final String T_SECONDS_MIDNIGHT = "SECONDS_SINCE_MIDNIGHT"; static final String T_SIGN = "SIGN"; static final String T_SIN = "SIN"; static final String T_SORT_ARRAY = "SORT_ARRAY"; static final String T_SOUNDEX = "SOUNDEX"; static final String T_SUBSTR = "SUBSTR"; static final String T_SYSDATE = "SYSDATE"; static final String T_SYSTIMESTAMP = "SYSTIMESTAMP"; static final String T_TAN = "TAN"; static final String T_TO_CHAR = "TO_CHAR"; static final String T_TO_DATE = "TO_DATE"; static final String T_TO_NUMBER = "TO_NUMBER"; static final String T_TO_TIMESTAMP = "TO_TIMESTAMP"; static final String T_TRANSACTION_SIZE = "TRANSACTION_SIZE"; static final String T_TRANSACTION_ID = "TRANSACTION_ID"; static final String T_TRUNC = "TRUNC"; static final String T_TODAY = "TODAY"; static final String T_UCASE = "UCASE"; static final String T_UUID = "UUID"; static final String T_UNIX_TIMESTAMP = "UNIX_TIMESTAMP"; // static final String T_ISOLATION_LEVEL = "ISOLATION_LEVEL"; static final String T_SESSION_ISOLATION_LEVEL = "SESSION_ISOLATION_LEVEL"; static final String T_DATABASE_ISOLATION_LEVEL = "DATABASE_ISOLATION_LEVEL"; static final String T_TRANSACTION_CONTROL = "TRANSACTION_CONTROL"; static final String T_TIMEZONE = "TIMEZONE"; static final String T_SESSION_TIMEZONE = "SESSION_TIMEZONE"; static final String T_DATABASE_TIMEZONE = "DATABASE_TIMEZONE"; static final String T_DATABASE_VERSION = "DATABASE_VERSION"; static final String T_SESSION_ID = "SESSION_ID"; static final String T_LOB_ID = "LOB_ID"; static final String T_SEQUENCE_ARRAY = "SEQUENCE_ARRAY"; // //SQL 200n Standard reserved keywords - full set public static final int ABS = 1; public static final int ALL = 2; public static final int ALLOCATE = 3; public static final int ALTER = 4; public static final int AND = 5; public static final int ANY = 6; public static final int ARE = 7; public static final int ARRAY = 8; public static final int ARRAY_AGG = 9; public static final int AS = 10; public static final int ASENSITIVE = 11; public static final int ASYMMETRIC = 12; public static final int AT = 13; public static final int ATOMIC = 14; public static final int AUTHORIZATION = 15; public static final int AVG = 16; public static final int BEGIN = 17; public static final int BETWEEN = 18; public static final int BIGINT = 19; public static final int BINARY = 20; public static final int BLOB = 21; public static final int BOOLEAN = 22; public static final int BOTH = 23; public static final int BY = 24; public static final int CALL = 25; public static final int CALLED = 26; public static final int CARDINALITY = 27; public static final int CASCADED = 28; public static final int CASE = 29; public static final int CAST = 30; public static final int CEIL = 31; public static final int CEILING = 32; public static final int CHAR = 33; public static final int CHAR_LENGTH = 34; public static final int CHARACTER = 35; public static final int CHARACTER_LENGTH = 36; public static final int CHECK = 37; public static final int CLOB = 38; public static final int CLOSE = 39; public static final int COALESCE = 40; public static final int COLLATE = 41; public static final int COLLECT = 42; public static final int COLUMN = 43; public static final int COMMIT = 44; public static final int COMPARABLE = 45; public static final int CONDITION = 46; public static final int CONNECT = 47; public static final int CONSTRAINT = 48; public static final int CONVERT = 49; public static final int CORR = 50; public static final int CORRESPONDING = 51; public static final int COUNT = 52; public static final int COVAR_POP = 53; public static final int COVAR_SAMP = 54; public static final int CREATE = 55; public static final int CROSS = 56; public static final int CUBE = 57; public static final int CUME_DIST = 58; public static final int CURRENT = 59; public static final int CURRENT_CATALOG = 60; public static final int CURRENT_DATE = 61; public static final int CURRENT_DEFAULT_TRANSFORM_GROUP = 62; public static final int CURRENT_PATH = 63; public static final int CURRENT_ROLE = 64; public static final int CURRENT_SCHEMA = 65; public static final int CURRENT_TIME = 66; public static final int CURRENT_TIMESTAMP = 67; public static final int CURRENT_TRANSFORM_GROUP_FOR_TYPE = 68; public static final int CURRENT_USER = 69; public static final int CURSOR = 70; public static final int CYCLE = 71; public static final int DATE = 72; public static final int DAY = 73; public static final int DEALLOCATE = 74; public static final int DEC = 75; public static final int DECIMAL = 76; public static final int DECLARE = 77; public static final int DEFAULT = 78; public static final int DELETE = 79; public static final int DENSE_RANK = 80; public static final int DEREF = 81; public static final int DESCRIBE = 82; public static final int DETERMINISTIC = 83; public static final int DISCONNECT = 84; public static final int DISTINCT = 85; public static final int DO = 86; public static final int DOUBLE = 87; public static final int DROP = 88; public static final int DYNAMIC = 89; public static final int EACH = 90; public static final int ELEMENT = 91; public static final int ELSE = 92; public static final int ELSEIF = 93; public static final int END = 94; public static final int END_EXEC = 95; public static final int ESCAPE = 96; public static final int EVERY = 97; public static final int EXCEPT = 98; public static final int EXEC = 99; public static final int EXECUTE = 100; public static final int EXISTS = 101; public static final int EXIT = 102; public static final int EXP = 103; public static final int EXTERNAL = 104; public static final int EXTRACT = 105; public static final int FALSE = 106; public static final int FETCH = 107; public static final int FILTER = 108; public static final int FIRST_VALUE = 109; public static final int FLOAT = 110; public static final int FLOOR = 111; public static final int FOR = 112; public static final int FOREIGN = 113; public static final int FREE = 114; public static final int FROM = 115; public static final int FULL = 116; public static final int FUNCTION = 117; public static final int FUSION = 118; public static final int GET = 119; public static final int GLOBAL = 120; public static final int GRANT = 121; public static final int GROUP = 122; public static final int GROUPING = 123; public static final int HANDLER = 124; public static final int HAVING = 125; public static final int HOLD = 126; public static final int HOUR = 127; public static final int IDENTITY = 128; public static final int IMPORT = 129; public static final int IN = 130; public static final int INDICATOR = 131; public static final int INNER = 132; public static final int INOUT = 133; public static final int INSENSITIVE = 134; public static final int INSERT = 135; public static final int INT = 136; public static final int INTEGER = 137; public static final int INTERSECT = 138; public static final int INTERSECTION = 139; public static final int INTERVAL = 140; public static final int INTO = 141; public static final int IS = 142; public static final int ITERATE = 143; public static final int JOIN = 144; public static final int LAG = 145; public static final int LANGUAGE = 146; public static final int LARGE = 147; public static final int LAST_VALUE = 148; public static final int LATERAL = 149; public static final int LEAD = 150; public static final int LEADING = 151; public static final int LEAVE = 152; public static final int LEFT = 153; public static final int LIKE = 154; public static final int LIKE_REGEX = 155; public static final int LN = 156; public static final int LOCAL = 157; public static final int LOCALTIME = 158; public static final int LOCALTIMESTAMP = 159; public static final int LOOP = 160; public static final int LOWER = 161; public static final int MATCH = 162; public static final int MAX = 163; public static final int MAX_CARDINALITY = 164; public static final int MEMBER = 165; public static final int MERGE = 166; public static final int METHOD = 167; public static final int MIN = 168; public static final int MINUTE = 169; public static final int MOD = 170; public static final int MODIFIES = 171; public static final int MODULE = 172; public static final int MONTH = 173; public static final int MULTISET = 174; public static final int NATIONAL = 175; public static final int NATURAL = 176; public static final int NCHAR = 177; public static final int NCLOB = 178; public static final int NEW = 179; public static final int NO = 180; public static final int NONE = 181; public static final int NORMALIZE = 182; public static final int NOT = 183; public static final int NTH_VALUE = 184; public static final int NTILE = 185; public static final int NULL = 186; public static final int NULLIF = 187; public static final int NUMERIC = 188; public static final int OCCURRENCES_REGEX = 189; public static final int OCTET_LENGTH = 190; public static final int OF = 191; public static final int OFFSET = 192; public static final int OLD = 193; public static final int ON = 194; public static final int ONLY = 195; public static final int OPEN = 196; public static final int OR = 197; public static final int ORDER = 198; public static final int OUT = 199; public static final int OUTER = 200; public static final int OVER = 201; public static final int OVERLAPS = 202; public static final int OVERLAY = 203; public static final int PARAMETER = 204; public static final int PARTITION = 205; public static final int PERCENT_RANK = 206; public static final int PERCENTILE_CONT = 207; public static final int PERCENTILE_DISC = 208; public static final int POSITION = 209; public static final int POSITION_REGEX = 210; public static final int POWER = 211; public static final int PRECISION = 212; public static final int PREPARE = 213; public static final int PRIMARY = 214; public static final int PROCEDURE = 215; public static final int RANGE = 216; public static final int RANK = 217; public static final int READS = 218; public static final int REAL = 219; public static final int RECURSIVE = 220; public static final int REF = 221; public static final int REFERENCES = 222; public static final int REFERENCING = 223; public static final int REGR_AVGX = 224; public static final int REGR_AVGY = 225; public static final int REGR_COUNT = 226; public static final int REGR_INTERCEPT = 227; public static final int REGR_R2 = 228; public static final int REGR_SLOPE = 229; public static final int REGR_SXX = 230; public static final int REGR_SXY = 231; public static final int REGR_SYY = 232; public static final int RELEASE = 233; public static final int REPEAT = 234; public static final int RESIGNAL = 235; public static final int RESULT = 236; public static final int RETURN = 237; public static final int RETURNS = 238; public static final int REVOKE = 239; public static final int RIGHT = 240; public static final int ROLLBACK = 241; public static final int ROLLUP = 242; public static final int ROW = 243; public static final int ROW_NUMBER = 244; public static final int ROWS = 245; public static final int SAVEPOINT = 246; public static final int SCOPE = 247; public static final int SCROLL = 248; public static final int SEARCH = 249; public static final int SECOND = 250; public static final int SELECT = 251; public static final int SENSITIVE = 252; public static final int SESSION_USER = 253; public static final int SET = 254; public static final int SIGNAL = 255; public static final int SIMILAR = 256; public static final int SMALLINT = 257; public static final int SOME = 258; public static final int SPECIFIC = 259; public static final int SPECIFICTYPE = 260; public static final int SQL = 261; public static final int SQLEXCEPTION = 262; public static final int SQLSTATE = 263; public static final int SQLWARNING = 264; public static final int SQRT = 265; public static final int STACKED = 266; public static final int START = 267; public static final int STATIC = 268; public static final int STDDEV_POP = 269; public static final int STDDEV_SAMP = 270; public static final int SUBMULTISET = 271; public static final int SUBSTRING = 272; public static final int SUBSTRING_REGEX = 273; public static final int SUM = 274; public static final int SYMMETRIC = 275; public static final int SYSTEM = 276; public static final int SYSTEM_USER = 277; public static final int TABLE = 278; public static final int TABLESAMPLE = 279; public static final int THEN = 280; public static final int TIME = 281; public static final int TIMESTAMP = 282; public static final int TIMEZONE_HOUR = 283; public static final int TIMEZONE_MINUTE = 284; public static final int TO = 285; public static final int TRAILING = 286; public static final int TRANSLATE = 287; public static final int TRANSLATE_REGEX = 288; public static final int TRANSLATION = 289; public static final int TREAT = 290; public static final int TRIGGER = 291; public static final int TRIM = 292; public static final int TRIM_ARRAY = 293; public static final int TRUE = 294; public static final int TRUNCATE = 295; public static final int UESCAPE = 296; public static final int UNDO = 297; public static final int UNION = 298; public static final int UNIQUE = 299; public static final int UNKNOWN = 300; public static final int UNNEST = 301; public static final int UNTIL = 302; public static final int UPDATE = 303; public static final int UPPER = 304; public static final int USER = 305; public static final int USING = 306; public static final int VALUE = 307; public static final int VALUES = 308; public static final int VAR_POP = 309; public static final int VAR_SAMP = 310; public static final int VARBINARY = 311; public static final int VARCHAR = 312; public static final int VARYING = 313; public static final int WHEN = 314; public static final int WHENEVER = 315; public static final int WHERE = 316; public static final int WIDTH_BUCKET = 317; public static final int WINDOW = 318; public static final int WITH = 319; public static final int WITHIN = 320; public static final int WITHOUT = 321; public static final int WHILE = 322; public static final int YEAR = 323; // //SQL 200n Standard non-reserved keywords - full set public static final int A = 330; public static final int ABSOLUTE = 331; public static final int ACTION = 332; public static final int ADA = 333; public static final int ADD = 334; public static final int ADMIN = 335; public static final int AFTER = 336; public static final int ALWAYS = 337; public static final int ASC = 338; public static final int ASSERTION = 339; public static final int ASSIGNMENT = 340; public static final int ATTRIBUTE = 341; public static final int ATTRIBUTES = 342; public static final int BEFORE = 343; public static final int BERNOULLI = 344; public static final int BREADTH = 345; public static final int C = 346; public static final int CASCADE = 347; public static final int CATALOG = 348; public static final int CATALOG_NAME = 349; public static final int CHAIN = 350; public static final int CHARACTER_SET_CATALOG = 351; public static final int CHARACTER_SET_NAME = 352; public static final int CHARACTER_SET_SCHEMA = 353; public static final int CHARACTERISTICS = 354; public static final int CHARACTERS = 355; public static final int CLASS_ORIGIN = 356; public static final int COBOL = 357; public static final int COLLATION = 358; public static final int COLLATION_CATALOG = 359; public static final int COLLATION_NAME = 360; public static final int COLLATION_SCHEMA = 361; public static final int COLUMN_NAME = 362; public static final int COMMAND_FUNCTION = 363; public static final int COMMAND_FUNCTION_CODE = 364; public static final int COMMITTED = 365; public static final int CONDITION_IDENTIFIER = 366; public static final int CONDITION_NUMBER = 367; public static final int CONNECTION = 368; public static final int CONNECTION_NAME = 369; public static final int CONSTRAINT_CATALOG = 370; public static final int CONSTRAINT_NAME = 371; public static final int CONSTRAINT_SCHEMA = 372; public static final int CONSTRAINTS = 373; public static final int CONSTRUCTOR = 374; public static final int CONTAINS = 375; public static final int CONTINUE = 376; public static final int CURSOR_NAME = 377; public static final int DATA = 378; public static final int DATETIME_INTERVAL_CODE = 379; public static final int DATETIME_INTERVAL_PRECISION = 380; public static final int DEFAULTS = 381; public static final int DEFERRABLE = 382; public static final int DEFERRED = 383; public static final int DEFINED = 384; public static final int DEFINER = 385; public static final int DEGREE = 386; public static final int DEPTH = 387; public static final int DERIVED = 388; public static final int DESC = 389; public static final int DESCRIPTOR = 390; public static final int DIAGNOSTICS = 391; public static final int DISPATCH = 392; public static final int DOMAIN = 393; public static final int DYNAMIC_FUNCTION = 394; public static final int DYNAMIC_FUNCTION_CODE = 395; public static final int EQUALS = 396; public static final int EXCEPTION = 397; public static final int EXCLUDE = 398; public static final int EXCLUDING = 399; public static final int FINAL = 400; public static final int FIRST = 401; public static final int FOLLOWING = 402; public static final int FORTRAN = 403; public static final int FOUND = 404; public static final int G = 405; public static final int GENERAL = 406; public static final int GENERATED = 407; public static final int GO = 408; public static final int GOTO = 409; public static final int GRANTED = 410; public static final int HIERARCHY = 411; public static final int IF = 412; public static final int IGNORE = 413; public static final int IMMEDIATE = 414; public static final int IMPLEMENTATION = 415; public static final int INCLUDING = 416; public static final int INCREMENT = 417; public static final int INITIALLY = 418; public static final int INPUT = 419; public static final int INSTANCE = 420; public static final int INSTANTIABLE = 421; public static final int INSTEAD = 422; public static final int INVOKER = 423; public static final int ISOLATION = 424; public static final int JAVA = 425; public static final int K = 426; public static final int KEY = 427; public static final int KEY_MEMBER = 428; public static final int KEY_TYPE = 429; public static final int LAST = 430; public static final int LENGTH = 431; public static final int LEVEL = 432; public static final int LIBRARY = 433; public static final int LOCATOR = 434; public static final int M = 435; public static final int MAP = 436; public static final int MATCHED = 437; public static final int MAXVALUE = 438; public static final int MESSAGE_LENGTH = 439; public static final int MESSAGE_OCTET_LENGTH = 440; public static final int MESSAGE_TEXT = 441; public static final int MINVALUE = 442; public static final int MORE = 443; public static final int MUMPS = 444; public static final int NAME = 445; public static final int NAMES = 446; public static final int NESTING = 447; public static final int NEXT = 448; public static final int NORMALIZED = 449; public static final int NULLABLE = 450; public static final int NULLS = 451; public static final int NUMBER = 452; public static final int OBJECT = 453; public static final int OCTETS = 454; public static final int OPTION = 455; public static final int OPTIONS = 456; public static final int ORDERING = 457; public static final int ORDINALITY = 458; public static final int OTHERS = 459; public static final int OUTPUT = 460; public static final int OVERRIDING = 461; public static final int P = 462; public static final int PAD = 463; public static final int PARAMETER_MODE = 464; public static final int PARAMETER_NAME = 465; public static final int PARAMETER_ORDINAL_POSITION = 466; public static final int PARAMETER_SPECIFIC_CATALOG = 467; public static final int PARAMETER_SPECIFIC_NAME = 468; public static final int PARAMETER_SPECIFIC_SCHEMA = 469; public static final int PARTIAL = 470; public static final int PASCAL = 471; public static final int PATH = 472; public static final int PLACING = 473; public static final int PLI = 474; public static final int PRECEDING = 475; public static final int PRESERVE = 476; public static final int PRIOR = 477; public static final int PRIVILEGES = 478; public static final int PUBLIC = 479; public static final int READ = 480; public static final int RELATIVE = 481; public static final int REPEATABLE = 482; public static final int RESPECT = 483; public static final int RESTART = 484; public static final int RESTRICT = 485; public static final int RETURNED_CARDINALITY = 486; public static final int RETURNED_LENGTH = 487; public static final int RETURNED_OCTET_LENGTH = 488; public static final int RETURNED_SQLSTATE = 489; public static final int ROLE = 490; public static final int ROUTINE = 491; public static final int ROUTINE_CATALOG = 492; public static final int ROUTINE_NAME = 493; public static final int ROUTINE_SCHEMA = 494; public static final int ROW_COUNT = 495; public static final int SCALE = 496; public static final int SCHEMA = 497; public static final int SCHEMA_NAME = 498; public static final int SCOPE_CATALOG = 499; public static final int SCOPE_NAME = 500; public static final int SCOPE_SCHEMA = 501; public static final int SECTION = 502; public static final int SECURITY = 503; public static final int SELF = 504; public static final int SEQUENCE = 505; public static final int SERIALIZABLE = 506; public static final int SERVER_NAME = 507; public static final int SESSION = 508; public static final int SERVER = 509; public static final int SETS = 510; public static final int SIMPLE = 511; public static final int SIZE = 512; public static final int SOURCE = 513; public static final int SPACE = 514; public static final int SPECIFIC_NAME = 515; public static final int STATE = 516; public static final int STATEMENT = 517; public static final int STRUCTURE = 518; public static final int STYLE = 519; public static final int SUBCLASS_ORIGIN = 520; public static final int T = 521; public static final int TABLE_NAME = 522; public static final int TEMPORARY = 523; public static final int TIES = 524; public static final int TOP_LEVEL_COUNT = 525; public static final int TRANSACTION = 526; public static final int TRANSACTION_ACTIVE = 527; public static final int TRANSACTIONS_COMMITTED = 528; public static final int TRANSACTIONS_ROLLED_BACK = 529; public static final int TRANSFORM = 530; public static final int TRANSFORMS = 531; public static final int TRIGGER_CATALOG = 532; public static final int TRIGGER_NAME = 533; public static final int TRIGGER_SCHEMA = 534; public static final int TYPE = 535; public static final int UNBOUNDED = 536; public static final int UNCOMMITTED = 537; public static final int UNDER = 538; public static final int UNNAMED = 539; public static final int USAGE = 540; public static final int USER_DEFINED_TYPE_CATALOG = 541; public static final int USER_DEFINED_TYPE_CODE = 542; public static final int USER_DEFINED_TYPE_NAME = 543; public static final int USER_DEFINED_TYPE_SCHEMA = 544; public static final int VIEW = 545; public static final int WORK = 546; public static final int WRITE = 547; public static final int WRAPPER = 548; public static final int ZONE = 549; // other token values used as switch cases static final int ALIAS = 558; static final int AGGREGATE = 559; static final int AUTOCOMMIT = 560; static final int AUTHENTICATION = 561; static final int BACKUP = 562; static final int BINARY_FLOAT = 563; static final int BINARY_DOUBLE = 564; static final int BIT = 565; static final int BLOCKING = 566; static final int BODY = 567; static final int BYTE = 568; static final int CACHE = 569; static final int CACHED = 570; static final int CASEWHEN = 571; static final int CHECKPOINT = 572; static final int CITEXT = 573; static final int CLASS = 574; static final int CLUSTERED = 575; static final int COMMENT = 576; static final int COMPACT = 577; static final int COMPRESSED = 578; static final int CONFLICT = 579; static final int CONTROL = 580; static final int CURRVAL = 581; static final int DATABASE = 582; static final int DEADLOCK = 583; static final int DEFRAG = 584; static final int DELAY = 585; static final int DIGEST = 586; static final int EVENT = 587; static final int EXPLAIN = 588; static final int FILE = 589; static final int FILES = 590; static final int FORMAT = 591; static final int GC = 592; static final int HEADER = 593; static final int IGNORECASE = 594; static final int IMMEDIATELY = 595; static final int INTEGRITY = 596; static final int INDEX = 597; static final int INITIAL = 598; static final int LASTVAL = 599; static final int LIMIT = 600; static final int LOCK = 601; static final int LOCKS = 602; static final int LONG = 603; static final int LONGVAR = 604; static final int MAXROWS = 605; static final int MEDIAN = 606; static final int MEMORY = 607; static final int MILLIS = 608; static final int MINUS_EXCEPT = 609; static final int NAN = 610; static final int NEXTVAL = 611; static final int NVARCHAR2 = 612; static final int NVL2 = 613; static final int OFF = 614; static final int PASSWORD = 615; static final int PLAN = 616; static final int PROPERTY = 617; static final int RAW = 618; static final int READONLY = 619; static final int REFERENTIAL = 620; static final int REGULAR = 621; static final int RENAME = 622; static final int RESET = 623; static final int ROWNUM = 624; static final int SCRIPT = 625; static final int SEPARATOR = 626; static final int SHUTDOWN = 627; static final int SYNTAX = 628; static final int TDC = 629; static final int TEMP = 630; static final int TEXT = 631; static final int TTI = 632; static final int TYPES = 633; static final int VARCHAR2 = 634; static final int WRITE_DELAY = 635; // static final int ACOS = 640; static final int ACTION_ID = 641; static final int ARRAY_SORT = 642; static final int ASCII = 643; static final int ASIN = 644; static final int ATAN = 645; static final int ATAN2 = 646; static final int BIT_LENGTH = 647; static final int BITAND = 648; static final int BITANDNOT = 649; static final int BITLENGTH = 650; static final int BITNOT = 651; static final int BITOR = 652; static final int BITXOR = 653; static final int CHR = 654; static final int CONCAT_WORD = 655; static final int COS = 656; static final int COT = 657; static final int CRYPT_KEY = 658; static final int CURDATE = 659; static final int CURTIME = 660; static final int DATABASE_ISOLATION_LEVEL = 661; static final int DATABASE_NAME = 662; static final int DATABASE_TIMEZONE = 663; static final int DATABASE_VERSION = 664; static final int DATE_ADD = 665; static final int DATE_SUB = 666; static final int DATEADD = 667; static final int DATEDIFF = 668; public static final int DAY_NAME = 669; public static final int DAY_OF_MONTH = 670; public static final int DAY_OF_WEEK = 671; public static final int DAY_OF_YEAR = 672; static final int DAYNAME = 673; static final int DAYOFMONTH = 674; static final int DAYOFWEEK = 675; static final int DAYOFYEAR = 676; static final int DAYS = 677; static final int DECODE = 678; static final int DEGREES = 679; static final int DIFFERENCE = 680; static final int DMOD = 681; static final int HEXTORAW = 682; static final int GREATEST = 683; static final int GROUP_CONCAT = 684; static final int IFNULL = 685; static final int IS_AUTOCOMMIT = 686; static final int IS_READONLY_DATABASE = 687; static final int IS_READONLY_DATABASE_FILES = 688; static final int IS_READONLY_SESSION = 689; static final int ISOLATION_LEVEL = 690; static final int ISNULL = 691; static final int LCASE = 692; static final int LEAST = 693; static final int LOAD_FILE = 694; static final int LOCATE = 695; static final int LOB = 696; static final int LOG = 697; static final int LOG10 = 698; static final int LPAD = 699; static final int LTRIM = 700; static final int LOB_ID = 701; public static final int MONTH_NAME = 702; static final int MONTHNAME = 703; static final int MVCC = 704; static final int MVLOCKS = 705; static final int NIO = 706; static final int NOW = 707; static final int OCTETLENGTH = 708; static final int PI = 709; static final int POSITION_ARRAY = 710; public static final int QUARTER = 711; static final int RADIANS = 712; static final int RAND = 713; static final int RAWTOHEX = 714; static final int REGEXP_MATCHES = 715; static final int REGEXP_SUBSTRING = 716; static final int REGEXP_SUBSTRING_ARRAY = 717; static final int REPLACE = 718; static final int REVERSE = 719; static final int ROUND = 720; static final int ROUNDMAGIC = 721; static final int RTRIM = 722; static final int RPAD = 723; public static final int SECONDS_MIDNIGHT = 724; static final int SEQUENCE_ARRAY = 725; static final int SESSION_ID = 726; static final int SESSION_ISOLATION_LEVEL = 727; static final int SESSION_TIMEZONE = 728; static final int SIGN = 729; static final int SIN = 730; static final int SORT_ARRAY = 731; static final int SOUNDEX = 732; static final int SPACE_WORD = 733; static final int SUBSTR = 734; static final int SYSDATE = 735; static final int SYSTIMESTAMP = 736; static final int TAN = 737; static final int TIMESTAMPADD = 738; static final int TIMESTAMPDIFF = 739; static final int TIMEZONE = 740; static final int TO_CHAR = 741; static final int TO_DATE = 742; static final int TO_NUMBER = 743; static final int TO_TIMESTAMP = 744; static final int TODAY = 755; static final int TOP = 756; static final int TRANSACTION_CONTROL = 757; static final int TRANSACTION_ID = 758; static final int TRANSACTION_SIZE = 759; static final int TRUNC = 760; static final int UCASE = 761; static final int UNIX_TIMESTAMP = 762; static final int UUID = 763; static final int WEEK = 764; public static final int WEEK_OF_YEAR = 765; // static final int ASTERISK = 771; static final int CLOSEBRACKET = 772; static final int COLON = 773; static final int COMMA = 774; static final int CONCAT = 775; static final int DIVIDE = 776; static final int DOUBLE_COLON_OP = 777; static final int DOUBLE_PERIOD_OP = 778; static final int GREATER = 779; static final int GREATER_EQUALS = 780; static final int LEFTBRACKET = 781; static final int LESS = 782; static final int LESS_EQUALS = 783; public static final int MINUS = 784; static final int NOT_EQUALS = 785; static final int OPENBRACKET = 786; static final int PLUS = 787; static final int QUESTION = 788; static final int RIGHT_ARROW_OP = 789; static final int RIGHTBRACKET = 790; static final int SEMICOLON = 791; // public static final int SQL_BIGINT = 801; public static final int SQL_BINARY = 802; public static final int SQL_BIT = 803; public static final int SQL_BLOB = 804; public static final int SQL_BOOLEAN = 805; public static final int SQL_CHAR = 806; public static final int SQL_CLOB = 807; public static final int SQL_DATE = 808; public static final int SQL_DECIMAL = 809; public static final int SQL_DATALINK = 810; public static final int SQL_DOUBLE = 811; public static final int SQL_FLOAT = 812; public static final int SQL_INTEGER = 813; public static final int SQL_LONGVARBINARY = 814; public static final int SQL_LONGNVARCHAR = 815; public static final int SQL_LONGVARCHAR = 816; public static final int SQL_NCHAR = 817; public static final int SQL_NCLOB = 818; public static final int SQL_NUMERIC = 819; public static final int SQL_NVARCHAR = 820; public static final int SQL_REAL = 821; public static final int SQL_ROWID = 822; public static final int SQL_SQLXML = 823; public static final int SQL_SMALLINT = 824; public static final int SQL_TIME = 825; public static final int SQL_TIMESTAMP = 826; public static final int SQL_TINYINT = 827; public static final int SQL_VARBINARY = 828; public static final int SQL_VARCHAR = 829; // static final int SQL_TSI_FRAC_SECOND = 831; static final int SQL_TSI_MILLI_SECOND = 832; static final int SQL_TSI_SECOND = 833; static final int SQL_TSI_MINUTE = 834; static final int SQL_TSI_HOUR = 835; static final int SQL_TSI_DAY = 836; static final int SQL_TSI_WEEK = 837; static final int SQL_TSI_MONTH = 838; static final int SQL_TSI_QUARTER = 839; static final int SQL_TSI_YEAR = 840; // static final int X_KEYSET = 841; static final int X_OPTION = 842; static final int X_REPEAT = 843; static final int X_POS_INTEGER = 844; // public static final int X_VALUE = 845; public static final int X_IDENTIFIER = 846; public static final int X_DELIMITED_IDENTIFIER = 847; public static final int X_ENDPARSE = 848; public static final int X_STARTPARSE = 849; public static final int X_REMARK = 850; public static final int X_NULL = 851; public static final int X_LOB_SIZE = 852; public static final int X_MALFORMED_STRING = 853; public static final int X_MALFORMED_NUMERIC = 854; public static final int X_MALFORMED_BIT_STRING = 855; public static final int X_MALFORMED_BINARY_STRING = 856; public static final int X_MALFORMED_UNICODE_STRING = 857; public static final int X_MALFORMED_COMMENT = 858; public static final int X_MALFORMED_IDENTIFIER = 859; public static final int X_MALFORMED_UNICODE_ESCAPE = 860; // public static final int X_UNKNOWN_TOKEN = -1; private static final IntValueHashMap reservedKeys = new IntValueHashMap(351); static { reservedKeys.put(Tokens.T_ABS, ABS); reservedKeys.put(Tokens.T_AGGREGATE, AGGREGATE); reservedKeys.put(Tokens.T_ALL, ALL); reservedKeys.put(Tokens.T_ALLOCATE, ALLOCATE); reservedKeys.put(Tokens.T_ALTER, ALTER); reservedKeys.put(Tokens.T_AND, AND); reservedKeys.put(Tokens.T_ANY, ANY); reservedKeys.put(Tokens.T_ARE, ARE); reservedKeys.put(Tokens.T_ARRAY, ARRAY); reservedKeys.put(Tokens.T_ARRAY_AGG, ARRAY_AGG); reservedKeys.put(Tokens.T_AS, AS); reservedKeys.put(Tokens.T_ASENSITIVE, ASENSITIVE); reservedKeys.put(Tokens.T_ASYMMETRIC, ASYMMETRIC); reservedKeys.put(Tokens.T_AT, AT); reservedKeys.put(Tokens.T_ATOMIC, ATOMIC); reservedKeys.put(Tokens.T_AUTHORIZATION, AUTHORIZATION); reservedKeys.put(Tokens.T_AVG, AVG); reservedKeys.put(Tokens.T_BEGIN, BEGIN); reservedKeys.put(Tokens.T_BETWEEN, BETWEEN); reservedKeys.put(Tokens.T_BIGINT, BIGINT); reservedKeys.put(Tokens.T_BINARY, BINARY); reservedKeys.put(Tokens.T_BIT_LENGTH, BIT_LENGTH); reservedKeys.put(Tokens.T_BLOB, BLOB); reservedKeys.put(Tokens.T_BOOLEAN, BOOLEAN); reservedKeys.put(Tokens.T_BOTH, BOTH); reservedKeys.put(Tokens.T_BY, BY); reservedKeys.put(Tokens.T_CALL, CALL); reservedKeys.put(Tokens.T_CALLED, CALLED); reservedKeys.put(Tokens.T_CARDINALITY, CARDINALITY); reservedKeys.put(Tokens.T_CASCADED, CASCADED); reservedKeys.put(Tokens.T_CASE, CASE); reservedKeys.put(Tokens.T_CAST, CAST); reservedKeys.put(Tokens.T_CEIL, CEIL); reservedKeys.put(Tokens.T_CEILING, CEILING); reservedKeys.put(Tokens.T_CHAR, CHAR); reservedKeys.put(Tokens.T_CHAR_LENGTH, CHAR_LENGTH); reservedKeys.put(Tokens.T_CHARACTER, CHARACTER); reservedKeys.put(Tokens.T_CHARACTER_LENGTH, CHARACTER_LENGTH); reservedKeys.put(Tokens.T_CHECK, CHECK); reservedKeys.put(Tokens.T_CLOB, CLOB); reservedKeys.put(Tokens.T_CLOSE, CLOSE); reservedKeys.put(Tokens.T_COALESCE, COALESCE); reservedKeys.put(Tokens.T_COLLATE, COLLATE); reservedKeys.put(Tokens.T_COLLECT, COLLECT); reservedKeys.put(Tokens.T_COLUMN, COLUMN); reservedKeys.put(Tokens.T_COMMIT, COMMIT); reservedKeys.put(Tokens.T_COMPARABLE, COMPARABLE); reservedKeys.put(Tokens.T_CONDITION, CONDITION); reservedKeys.put(Tokens.T_CONNECT, CONNECT); reservedKeys.put(Tokens.T_CONSTRAINT, CONSTRAINT); reservedKeys.put(Tokens.T_CONVERT, CONVERT); reservedKeys.put(Tokens.T_CORR, CORR); reservedKeys.put(Tokens.T_CORRESPONDING, CORRESPONDING); reservedKeys.put(Tokens.T_COUNT, COUNT); reservedKeys.put(Tokens.T_COVAR_POP, COVAR_POP); reservedKeys.put(Tokens.T_COVAR_SAMP, COVAR_SAMP); reservedKeys.put(Tokens.T_CREATE, CREATE); reservedKeys.put(Tokens.T_CROSS, CROSS); reservedKeys.put(Tokens.T_CUBE, CUBE); reservedKeys.put(Tokens.T_CUME_DIST, CUME_DIST); reservedKeys.put(Tokens.T_CURRENT, CURRENT); reservedKeys.put(Tokens.T_CURRENT_CATALOG, CURRENT_CATALOG); reservedKeys.put(Tokens.T_CURRENT_DATE, CURRENT_DATE); reservedKeys.put(Tokens.T_CURRENT_DEFAULT_TRANSFORM_GROUP, CURRENT_DEFAULT_TRANSFORM_GROUP); reservedKeys.put(Tokens.T_CURRENT_PATH, CURRENT_PATH); reservedKeys.put(Tokens.T_CURRENT_ROLE, CURRENT_ROLE); reservedKeys.put(Tokens.T_CURRENT_SCHEMA, CURRENT_SCHEMA); reservedKeys.put(Tokens.T_CURRENT_TIME, CURRENT_TIME); reservedKeys.put(Tokens.T_CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); reservedKeys.put(Tokens.T_DO, DO); reservedKeys.put(Tokens.T_CURRENT_TRANSFORM_GROUP_FOR_TYPE, CURRENT_TRANSFORM_GROUP_FOR_TYPE); reservedKeys.put(Tokens.T_CURRENT_USER, CURRENT_USER); reservedKeys.put(Tokens.T_CURSOR, CURSOR); reservedKeys.put(Tokens.T_CYCLE, CYCLE); reservedKeys.put(Tokens.T_DATE, DATE); reservedKeys.put(Tokens.T_DAY, DAY); reservedKeys.put(Tokens.T_DEALLOCATE, DEALLOCATE); reservedKeys.put(Tokens.T_DEC, DEC); reservedKeys.put(Tokens.T_DECIMAL, DECIMAL); reservedKeys.put(Tokens.T_DECLARE, DECLARE); reservedKeys.put(Tokens.T_DEFAULT, DEFAULT); reservedKeys.put(Tokens.T_DELETE, DELETE); reservedKeys.put(Tokens.T_DENSE_RANK, DENSE_RANK); reservedKeys.put(Tokens.T_DEREF, DEREF); reservedKeys.put(Tokens.T_DESCRIBE, DESCRIBE); reservedKeys.put(Tokens.T_DETERMINISTIC, DETERMINISTIC); reservedKeys.put(Tokens.T_DISCONNECT, DISCONNECT); reservedKeys.put(Tokens.T_DISTINCT, DISTINCT); reservedKeys.put(Tokens.T_DOUBLE, DOUBLE); reservedKeys.put(Tokens.T_DROP, DROP); reservedKeys.put(Tokens.T_DYNAMIC, DYNAMIC); reservedKeys.put(Tokens.T_EACH, EACH); reservedKeys.put(Tokens.T_ELEMENT, ELEMENT); reservedKeys.put(Tokens.T_ELSE, ELSE); reservedKeys.put(Tokens.T_ELSEIF, ELSEIF); reservedKeys.put(Tokens.T_END, END); reservedKeys.put(Tokens.T_END_EXEC, END_EXEC); reservedKeys.put(Tokens.T_ESCAPE, ESCAPE); reservedKeys.put(Tokens.T_EVERY, EVERY); reservedKeys.put(Tokens.T_EXCEPT, EXCEPT); reservedKeys.put(Tokens.T_EXEC, EXEC); reservedKeys.put(Tokens.T_EXECUTE, EXECUTE); reservedKeys.put(Tokens.T_EXISTS, EXISTS); reservedKeys.put(Tokens.T_EXIT, EXIT); reservedKeys.put(Tokens.T_EXP, EXP); reservedKeys.put(Tokens.T_EXTERNAL, EXTERNAL); reservedKeys.put(Tokens.T_EXTRACT, EXTRACT); reservedKeys.put(Tokens.T_FALSE, FALSE); reservedKeys.put(Tokens.T_FETCH, FETCH); reservedKeys.put(Tokens.T_FILTER, FILTER); reservedKeys.put(Tokens.T_FIRST_VALUE, FIRST_VALUE); reservedKeys.put(Tokens.T_FLOAT, FLOAT); reservedKeys.put(Tokens.T_FLOOR, FLOOR); reservedKeys.put(Tokens.T_FOR, FOR); reservedKeys.put(Tokens.T_FOREIGN, FOREIGN); reservedKeys.put(Tokens.T_FREE, FREE); reservedKeys.put(Tokens.T_FROM, FROM); reservedKeys.put(Tokens.T_FULL, FULL); reservedKeys.put(Tokens.T_FUNCTION, FUNCTION); reservedKeys.put(Tokens.T_FUSION, FUSION); reservedKeys.put(Tokens.T_GET, GET); reservedKeys.put(Tokens.T_GLOBAL, GLOBAL); reservedKeys.put(Tokens.T_GRANT, GRANT); reservedKeys.put(Tokens.T_GROUP, GROUP); reservedKeys.put(Tokens.T_GROUPING, GROUPING); reservedKeys.put(Tokens.T_HANDLER, HANDLER); reservedKeys.put(Tokens.T_HAVING, HAVING); reservedKeys.put(Tokens.T_HOLD, HOLD); reservedKeys.put(Tokens.T_HOUR, HOUR); reservedKeys.put(Tokens.T_IDENTITY, IDENTITY); reservedKeys.put(Tokens.T_IF, IF); reservedKeys.put(Tokens.T_IMPORT, IMPORT); reservedKeys.put(Tokens.T_IN, IN); reservedKeys.put(Tokens.T_INDICATOR, INDICATOR); reservedKeys.put(Tokens.T_INNER, INNER); reservedKeys.put(Tokens.T_INOUT, INOUT); reservedKeys.put(Tokens.T_INSENSITIVE, INSENSITIVE); reservedKeys.put(Tokens.T_INSERT, INSERT); reservedKeys.put(Tokens.T_INT, INT); reservedKeys.put(Tokens.T_INTEGER, INTEGER); reservedKeys.put(Tokens.T_INTERSECT, INTERSECT); reservedKeys.put(Tokens.T_INTERSECTION, INTERSECTION); reservedKeys.put(Tokens.T_INTERVAL, INTERVAL); reservedKeys.put(Tokens.T_INTO, INTO); reservedKeys.put(Tokens.T_IS, IS); reservedKeys.put(Tokens.T_ITERATE, ITERATE); reservedKeys.put(Tokens.T_JOIN, JOIN); reservedKeys.put(Tokens.T_LAG, LAG); reservedKeys.put(Tokens.T_LANGUAGE, LANGUAGE); reservedKeys.put(Tokens.T_LARGE, LARGE); reservedKeys.put(Tokens.T_LAST_VALUE, LAST_VALUE); reservedKeys.put(Tokens.T_LATERAL, LATERAL); reservedKeys.put(Tokens.T_LEAD, LEAD); reservedKeys.put(Tokens.T_LEADING, LEADING); reservedKeys.put(Tokens.T_LEAVE, LEAVE); reservedKeys.put(Tokens.T_LEFT, LEFT); reservedKeys.put(Tokens.T_LIKE, LIKE); reservedKeys.put(Tokens.T_LIKE_REGX, LIKE_REGEX); reservedKeys.put(Tokens.T_LN, LN); reservedKeys.put(Tokens.T_LOCAL, LOCAL); reservedKeys.put(Tokens.T_LOCALTIME, LOCALTIME); reservedKeys.put(Tokens.T_LOCALTIMESTAMP, LOCALTIMESTAMP); reservedKeys.put(Tokens.T_LOOP, LOOP); reservedKeys.put(Tokens.T_LOWER, LOWER); reservedKeys.put(Tokens.T_MATCH, MATCH); reservedKeys.put(Tokens.T_MAX, MAX); reservedKeys.put(Tokens.T_MAX_CARDINALITY, MAX_CARDINALITY); reservedKeys.put(Tokens.T_MEMBER, MEMBER); reservedKeys.put(Tokens.T_MERGE, MERGE); reservedKeys.put(Tokens.T_METHOD, METHOD); reservedKeys.put(Tokens.T_MIN, MIN); reservedKeys.put(Tokens.T_MINUTE, MINUTE); reservedKeys.put(Tokens.T_MOD, MOD); reservedKeys.put(Tokens.T_MODIFIES, MODIFIES); reservedKeys.put(Tokens.T_MODULE, MODULE); reservedKeys.put(Tokens.T_MONTH, MONTH); reservedKeys.put(Tokens.T_MULTISET, MULTISET); reservedKeys.put(Tokens.T_NATIONAL, NATIONAL); reservedKeys.put(Tokens.T_NATURAL, NATURAL); reservedKeys.put(Tokens.T_NCHAR, NCHAR); reservedKeys.put(Tokens.T_NCLOB, NCLOB); reservedKeys.put(Tokens.T_NEW, NEW); reservedKeys.put(Tokens.T_NO, NO); reservedKeys.put(Tokens.T_NONE, NONE); reservedKeys.put(Tokens.T_NORMALIZE, NORMALIZE); reservedKeys.put(Tokens.T_NOT, NOT); reservedKeys.put(Tokens.T_NTH_VALUE, NTH_VALUE); reservedKeys.put(Tokens.T_NTILE, NTILE); reservedKeys.put(Tokens.T_NULL, NULL); reservedKeys.put(Tokens.T_NULLIF, NULLIF); reservedKeys.put(Tokens.T_NUMERIC, NUMERIC); reservedKeys.put(Tokens.T_OCCURRENCES_REGEX, OCCURRENCES_REGEX); reservedKeys.put(Tokens.T_OCTET_LENGTH, OCTET_LENGTH); reservedKeys.put(Tokens.T_OF, OF); reservedKeys.put(Tokens.T_OFFSET, OFFSET); reservedKeys.put(Tokens.T_OLD, OLD); reservedKeys.put(Tokens.T_ON, ON); reservedKeys.put(Tokens.T_ONLY, ONLY); reservedKeys.put(Tokens.T_OPEN, OPEN); reservedKeys.put(Tokens.T_OR, OR); reservedKeys.put(Tokens.T_ORDER, ORDER); reservedKeys.put(Tokens.T_OUT, OUT); reservedKeys.put(Tokens.T_OUTER, OUTER); reservedKeys.put(Tokens.T_OVER, OVER); reservedKeys.put(Tokens.T_OVERLAPS, OVERLAPS); reservedKeys.put(Tokens.T_OVERLAY, OVERLAY); reservedKeys.put(Tokens.T_PARAMETER, PARAMETER); reservedKeys.put(Tokens.T_PARTITION, PARTITION); reservedKeys.put(Tokens.T_PERCENT_RANK, PERCENT_RANK); reservedKeys.put(Tokens.T_PERCENTILE_CONT, PERCENTILE_CONT); reservedKeys.put(Tokens.T_PERCENTILE_DISC, PERCENTILE_DISC); reservedKeys.put(Tokens.T_POSITION, POSITION); reservedKeys.put(Tokens.T_POSITION_REGEX, POSITION_REGEX); reservedKeys.put(Tokens.T_POWER, POWER); reservedKeys.put(Tokens.T_PRECISION, PRECISION); reservedKeys.put(Tokens.T_PREPARE, PREPARE); reservedKeys.put(Tokens.T_PRIMARY, PRIMARY); reservedKeys.put(Tokens.T_PROCEDURE, PROCEDURE); reservedKeys.put(Tokens.T_RANGE, RANGE); reservedKeys.put(Tokens.T_RANK, RANK); reservedKeys.put(Tokens.T_READS, READS); reservedKeys.put(Tokens.T_REAL, REAL); reservedKeys.put(Tokens.T_RECURSIVE, RECURSIVE); reservedKeys.put(Tokens.T_REF, REF); reservedKeys.put(Tokens.T_REFERENCES, REFERENCES); reservedKeys.put(Tokens.T_REFERENCING, REFERENCING); reservedKeys.put(Tokens.T_REGR_AVGX, REGR_AVGX); reservedKeys.put(Tokens.T_REGR_AVGY, REGR_AVGY); reservedKeys.put(Tokens.T_REGR_COUNT, REGR_COUNT); reservedKeys.put(Tokens.T_REGR_INTERCEPT, REGR_INTERCEPT); reservedKeys.put(Tokens.T_REGR_R2, REGR_R2); reservedKeys.put(Tokens.T_REGR_SLOPE, REGR_SLOPE); reservedKeys.put(Tokens.T_REGR_SXX, REGR_SXX); reservedKeys.put(Tokens.T_REGR_SXY, REGR_SXY); reservedKeys.put(Tokens.T_REGR_SYY, REGR_SYY); reservedKeys.put(Tokens.T_RELEASE, RELEASE); reservedKeys.put(Tokens.T_REPEAT, REPEAT); reservedKeys.put(Tokens.T_RESIGNAL, RESIGNAL); reservedKeys.put(Tokens.T_RETURN, RETURN); reservedKeys.put(Tokens.T_RETURNS, RETURNS); reservedKeys.put(Tokens.T_REVOKE, REVOKE); reservedKeys.put(Tokens.T_RIGHT, RIGHT); reservedKeys.put(Tokens.T_ROLLBACK, ROLLBACK); reservedKeys.put(Tokens.T_ROLLUP, ROLLUP); reservedKeys.put(Tokens.T_ROW, ROW); reservedKeys.put(Tokens.T_ROW_NUMBER, ROW_NUMBER); reservedKeys.put(Tokens.T_ROWS, ROWS); reservedKeys.put(Tokens.T_SAVEPOINT, SAVEPOINT); reservedKeys.put(Tokens.T_SCOPE, SCOPE); reservedKeys.put(Tokens.T_SCROLL, SCROLL); reservedKeys.put(Tokens.T_SEARCH, SEARCH); reservedKeys.put(Tokens.T_SECOND, SECOND); reservedKeys.put(Tokens.T_SELECT, SELECT); reservedKeys.put(Tokens.T_SENSITIVE, SENSITIVE); reservedKeys.put(Tokens.T_SESSION_USER, SESSION_USER); reservedKeys.put(Tokens.T_SET, SET); reservedKeys.put(Tokens.T_SIGNAL, SIGNAL); reservedKeys.put(Tokens.T_SIMILAR, SIMILAR); reservedKeys.put(Tokens.T_SMALLINT, SMALLINT); reservedKeys.put(Tokens.T_SOME, SOME); reservedKeys.put(Tokens.T_SPECIFIC, SPECIFIC); reservedKeys.put(Tokens.T_SPECIFICTYPE, SPECIFICTYPE); reservedKeys.put(Tokens.T_SQL, SQL); reservedKeys.put(Tokens.T_SQLEXCEPTION, SQLEXCEPTION); reservedKeys.put(Tokens.T_SQLSTATE, SQLSTATE); reservedKeys.put(Tokens.T_SQLWARNING, SQLWARNING); reservedKeys.put(Tokens.T_SQRT, SQRT); reservedKeys.put(Tokens.T_STACKED, STACKED); reservedKeys.put(Tokens.T_START, START); reservedKeys.put(Tokens.T_STATIC, STATIC); reservedKeys.put(Tokens.T_STDDEV_POP, STDDEV_POP); reservedKeys.put(Tokens.T_STDDEV_SAMP, STDDEV_SAMP); reservedKeys.put(Tokens.T_SUBMULTISET, SUBMULTISET); reservedKeys.put(Tokens.T_SUBSTRING, SUBSTRING); reservedKeys.put(Tokens.T_SUBSTRING_REGEX, SUBSTRING_REGEX); reservedKeys.put(Tokens.T_SUM, SUM); reservedKeys.put(Tokens.T_SYMMETRIC, SYMMETRIC); reservedKeys.put(Tokens.T_SYSTEM, SYSTEM); reservedKeys.put(Tokens.T_SYSTEM_USER, SYSTEM_USER); reservedKeys.put(Tokens.T_TABLE, TABLE); reservedKeys.put(Tokens.T_TABLESAMPLE, TABLESAMPLE); reservedKeys.put(Tokens.T_THEN, THEN); reservedKeys.put(Tokens.T_TIME, TIME); reservedKeys.put(Tokens.T_TIMESTAMP, TIMESTAMP); reservedKeys.put(Tokens.T_TIMEZONE_HOUR, TIMEZONE_HOUR); reservedKeys.put(Tokens.T_TIMEZONE_MINUTE, TIMEZONE_MINUTE); reservedKeys.put(Tokens.T_TO, TO); reservedKeys.put(Tokens.T_TRAILING, TRAILING); reservedKeys.put(Tokens.T_TRANSLATE, TRANSLATE); reservedKeys.put(Tokens.T_TRANSLATE_REGEX, TRANSLATE_REGEX); reservedKeys.put(Tokens.T_TRANSLATION, TRANSLATION); reservedKeys.put(Tokens.T_TREAT, TREAT); reservedKeys.put(Tokens.T_TRIGGER, TRIGGER); reservedKeys.put(Tokens.T_TRIM, TRIM); reservedKeys.put(Tokens.T_TRIM_ARRAY, TRIM_ARRAY); reservedKeys.put(Tokens.T_TRUE, TRUE); reservedKeys.put(Tokens.T_TRUNCATE, TRUNCATE); reservedKeys.put(Tokens.T_UESCAPE, UESCAPE); reservedKeys.put(Tokens.T_UNDO, UNDO); reservedKeys.put(Tokens.T_UNION, UNION); reservedKeys.put(Tokens.T_UNIQUE, UNIQUE); reservedKeys.put(Tokens.T_UNKNOWN, UNKNOWN); reservedKeys.put(Tokens.T_UNNEST, UNNEST); reservedKeys.put(Tokens.T_UNTIL, UNTIL); reservedKeys.put(Tokens.T_UPDATE, UPDATE); reservedKeys.put(Tokens.T_UPPER, UPPER); reservedKeys.put(Tokens.T_USER, USER); reservedKeys.put(Tokens.T_USING, USING); reservedKeys.put(Tokens.T_VALUE, VALUE); reservedKeys.put(Tokens.T_VALUES, VALUES); reservedKeys.put(Tokens.T_VAR_POP, VAR_POP); reservedKeys.put(Tokens.T_VAR_SAMP, VAR_SAMP); reservedKeys.put(Tokens.T_VARBINARY, VARBINARY); reservedKeys.put(Tokens.T_VARCHAR, VARCHAR); reservedKeys.put(Tokens.T_VARYING, VARYING); reservedKeys.put(Tokens.T_WHEN, WHEN); reservedKeys.put(Tokens.T_WHENEVER, WHENEVER); reservedKeys.put(Tokens.T_WHERE, WHERE); reservedKeys.put(Tokens.T_WIDTH_BUCKET, WIDTH_BUCKET); reservedKeys.put(Tokens.T_WINDOW, WINDOW); reservedKeys.put(Tokens.T_WITH, WITH); reservedKeys.put(Tokens.T_WITHIN, WITHIN); reservedKeys.put(Tokens.T_WITHOUT, WITHOUT); reservedKeys.put(Tokens.T_WHILE, WHILE); reservedKeys.put(Tokens.T_YEAR, YEAR); } private static final IntValueHashMap commandSet = new IntValueHashMap(299); static { commandSet.put(T_ACTION, ACTION); commandSet.put(T_ADD, ADD); commandSet.put(T_ADMIN, ADMIN); commandSet.put(T_AFTER, AFTER); commandSet.put(T_ALIAS, ALIAS); commandSet.put(T_ALWAYS, ALWAYS); commandSet.put(T_ASC, ASC); commandSet.put(T_AUTHENTICATION, AUTHENTICATION); commandSet.put(T_AUTOCOMMIT, AUTOCOMMIT); commandSet.put(T_BACKUP, BACKUP); commandSet.put(T_BEFORE, BEFORE); commandSet.put(T_BINARY_DOUBLE, BINARY_DOUBLE); commandSet.put(T_BINARY_FLOAT, BINARY_FLOAT); commandSet.put(T_BIT, BIT); commandSet.put(T_BYTE, BYTE); commandSet.put(T_BLOCKING, BLOCKING); commandSet.put(T_BODY, BODY); commandSet.put(T_CACHE, CACHE); commandSet.put(T_CACHED, CACHED); commandSet.put(T_CASCADE, CASCADE); commandSet.put(T_CATALOG, CATALOG); commandSet.put(T_CHARACTERISTICS, CHARACTERISTICS); commandSet.put(T_CHARACTERS, CHARACTERS); commandSet.put(T_CHECKPOINT, CHECKPOINT); commandSet.put(T_CITEXT, CITEXT); commandSet.put(T_CRYPT_KEY, CRYPT_KEY); commandSet.put(T_CLASS, CLASS); commandSet.put(T_CLUSTERED, CLUSTERED); commandSet.put(T_COLLATE, COLLATE); commandSet.put(T_COLLATION, COLLATION); commandSet.put(T_COMMENT, COMMENT); commandSet.put(T_COMMITTED, COMMITTED); commandSet.put(T_COMPACT, COMPACT); commandSet.put(T_COMPRESSED, COMPRESSED); commandSet.put(T_CONDITION_IDENTIFIER, Tokens.CONDITION_IDENTIFIER); commandSet.put(T_CONFLICT, CONFLICT); commandSet.put(T_CONTAINS, CONTAINS); commandSet.put(T_CONTINUE, CONTINUE); commandSet.put(T_CONTROL, CONTROL); commandSet.put(T_CURDATE, CURDATE); commandSet.put(T_CURRVAL, CURRVAL); commandSet.put(T_CURTIME, CURTIME); commandSet.put(T_DATA, DATA); commandSet.put(T_DATABASE, DATABASE); commandSet.put(T_DEADLOCK, DEADLOCK); commandSet.put(T_DEFAULTS, DEFAULTS); commandSet.put(T_DEFRAG, DEFRAG); commandSet.put(T_DELAY, DELAY); commandSet.put(T_DESC, DESC); commandSet.put(T_DIAGNOSTICS, DIAGNOSTICS); commandSet.put(T_DIGEST, DIGEST); commandSet.put(T_DOMAIN, DOMAIN); commandSet.put(T_EVENT, EVENT); commandSet.put(T_EXCLUDING, EXCLUDING); commandSet.put(T_EXPLAIN, EXPLAIN); commandSet.put(T_FILE, FILE); commandSet.put(T_FILES, FILES); commandSet.put(T_FINAL, FINAL); commandSet.put(T_FIRST, FIRST); commandSet.put(T_FORMAT, FORMAT); commandSet.put(T_FOUND, FOUND); commandSet.put(T_G_FACTOR, G); commandSet.put(T_GC, GC); commandSet.put(T_GENERATED, GENERATED); commandSet.put(T_GRANTED, GRANTED); commandSet.put(T_GROUP_CONCAT, GROUP_CONCAT); commandSet.put(T_HEADER, HEADER); commandSet.put(T_IF, Tokens.IF); commandSet.put(T_IGNORECASE, IGNORECASE); commandSet.put(T_IMMEDIATELY, IMMEDIATELY); commandSet.put(T_INCLUDING, INCLUDING); commandSet.put(T_INCREMENT, INCREMENT); commandSet.put(T_INDEX, INDEX); commandSet.put(T_INITIAL, INITIAL); commandSet.put(T_INPUT, INPUT); commandSet.put(T_INSTEAD, INSTEAD); commandSet.put(T_INTEGRITY, INTEGRITY); commandSet.put(T_IS_AUTOCOMMIT, IS_AUTOCOMMIT); commandSet.put(T_ISOLATION, ISOLATION); commandSet.put(T_IS_READONLY_DATABASE, IS_READONLY_DATABASE); commandSet.put(T_IS_READONLY_DATABASE_FILES, IS_READONLY_DATABASE_FILES); commandSet.put(T_IS_READONLY_SESSION, IS_READONLY_SESSION); commandSet.put(T_JAVA, JAVA); commandSet.put(T_K_FACTOR, K); commandSet.put(T_KEY, KEY); commandSet.put(T_LAST, LAST); commandSet.put(T_LASTVAL, LASTVAL); commandSet.put(T_LENGTH, LENGTH); commandSet.put(T_LEVEL, LEVEL); commandSet.put(T_LIBRARY, LIBRARY); commandSet.put(T_LIMIT, LIMIT); commandSet.put(T_LOB, LOB); commandSet.put(T_LOCK, LOCK); commandSet.put(T_LOCKS, LOCKS); commandSet.put(T_LONG, LONG); commandSet.put(T_LONGVAR, LONGVAR); commandSet.put(T_M_FACTOR, M); commandSet.put(T_MATCHED, MATCHED); commandSet.put(T_MAXROWS, MAXROWS); commandSet.put(T_MAXVALUE, MAXVALUE); commandSet.put(T_MEDIAN, MEDIAN); commandSet.put(T_MEMORY, MEMORY); commandSet.put(T_MESSAGE_TEXT, MESSAGE_TEXT); commandSet.put(T_MILLIS, MILLIS); commandSet.put(T_MINUS_EXCEPT, MINUS_EXCEPT); commandSet.put(T_MINVALUE, MINVALUE); commandSet.put(T_MORE, MORE); commandSet.put(T_MVCC, MVCC); commandSet.put(T_MVLOCKS, MVLOCKS); commandSet.put(T_NAME, NAME); commandSet.put(T_NEXT, NEXT); commandSet.put(T_NEXTVAL, NEXTVAL); commandSet.put(T_NAN, NAN); commandSet.put(T_NIO, NIO); commandSet.put(T_NOW, NOW); commandSet.put(T_NULLS, NULLS); commandSet.put(T_NUMBER, NUMBER); commandSet.put(T_NVARCHAR2, NVARCHAR2); commandSet.put(T_NVL2, NVL2); commandSet.put(T_OBJECT, OBJECT); commandSet.put(T_OCTETS, OCTETS); commandSet.put(T_OFF, OFF); commandSet.put(T_OPTION, OPTION); commandSet.put(T_ORDINALITY, ORDINALITY); commandSet.put(T_OVERRIDING, OVERRIDING); commandSet.put(T_P_FACTOR, P); commandSet.put(T_PAD, PAD); commandSet.put(T_PARTIAL, PARTIAL); commandSet.put(T_PASSWORD, PASSWORD); commandSet.put(T_PLACING, PLACING); commandSet.put(T_PLAN, PLAN); commandSet.put(T_PRESERVE, PRESERVE); commandSet.put(T_PRIVILEGES, PRIVILEGES); commandSet.put(T_PROPERTY, PROPERTY); commandSet.put(T_RAW, RAW); commandSet.put(T_READ, READ); commandSet.put(T_READONLY, READONLY); commandSet.put(T_REFERENTIAL, REFERENTIAL); commandSet.put(T_REGULAR, REGULAR); commandSet.put(T_RENAME, RENAME); commandSet.put(T_REPEATABLE, REPEATABLE); commandSet.put(T_RESET, RESET); commandSet.put(T_RESTART, RESTART); commandSet.put(T_RESTRICT, RESTRICT); commandSet.put(T_RESULT, RESULT); commandSet.put(T_ROLE, ROLE); commandSet.put(T_ROUTINE, ROUTINE); commandSet.put(T_ROW_COUNT, ROW_COUNT); commandSet.put(T_ROWNUM, ROWNUM); commandSet.put(T_SCALE, SCALE); commandSet.put(T_SCHEMA, SCHEMA); commandSet.put(T_SCRIPT, SCRIPT); commandSet.put(T_SEQUENCE, SEQUENCE); commandSet.put(T_SEPARATOR, SEPARATOR); commandSet.put(T_SERIALIZABLE, SERIALIZABLE); commandSet.put(T_SERVER, SERVER); commandSet.put(T_SESSION, SESSION); commandSet.put(T_SETS, SETS); commandSet.put(T_SHUTDOWN, SHUTDOWN); commandSet.put(T_SIMPLE, SIMPLE); commandSet.put(T_SIZE, SIZE); commandSet.put(T_SOURCE, SOURCE); commandSet.put(T_SQL_BIGINT, SQL_BIGINT); commandSet.put(T_SQL_BINARY, SQL_BINARY); commandSet.put(T_SQL_BIT, SQL_BIT); commandSet.put(T_SQL_BLOB, SQL_BLOB); commandSet.put(T_SQL_BOOLEAN, SQL_BOOLEAN); commandSet.put(T_SQL_CHAR, SQL_CHAR); commandSet.put(T_SQL_CLOB, SQL_CLOB); commandSet.put(T_SQL_DATALINK, SQL_DATALINK); commandSet.put(T_SQL_DATE, SQL_DATE); commandSet.put(T_SQL_DECIMAL, SQL_DECIMAL); commandSet.put(T_SQL_DOUBLE, SQL_DOUBLE); commandSet.put(T_SQL_FLOAT, SQL_FLOAT); commandSet.put(T_SQL_INTEGER, SQL_INTEGER); commandSet.put(T_SQL_LONGNVARCHAR, SQL_LONGNVARCHAR); commandSet.put(T_SQL_LONGVARBINARY, SQL_LONGVARBINARY); commandSet.put(T_SQL_LONGVARCHAR, SQL_LONGVARCHAR); commandSet.put(T_SQL_NCHAR, SQL_NCHAR); commandSet.put(T_SQL_NCLOB, SQL_NCLOB); commandSet.put(T_SQL_NUMERIC, SQL_NUMERIC); commandSet.put(T_SQL_NVARCHAR, SQL_NVARCHAR); commandSet.put(T_SQL_REAL, SQL_REAL); commandSet.put(T_SQL_ROWID, SQL_ROWID); commandSet.put(T_SQL_SMALLINT, SQL_SMALLINT); commandSet.put(T_SQL_SQLXML, SQL_SQLXML); commandSet.put(T_SQL_TIME, SQL_TIME); commandSet.put(T_SQL_TIMESTAMP, SQL_TIMESTAMP); commandSet.put(T_SQL_TINYINT, SQL_TINYINT); commandSet.put(T_SQL_VARBINARY, SQL_VARBINARY); commandSet.put(T_SQL_VARCHAR, SQL_VARCHAR); commandSet.put(T_SQL_TSI_DAY, SQL_TSI_DAY); commandSet.put(T_SQL_TSI_FRAC_SECOND, SQL_TSI_FRAC_SECOND); commandSet.put(T_SQL_TSI_MILLI_SECOND, SQL_TSI_MILLI_SECOND); commandSet.put(T_SQL_TSI_HOUR, SQL_TSI_HOUR); commandSet.put(T_SQL_TSI_MINUTE, SQL_TSI_MINUTE); commandSet.put(T_SQL_TSI_MONTH, SQL_TSI_MONTH); commandSet.put(T_SQL_TSI_QUARTER, SQL_TSI_QUARTER); commandSet.put(T_SQL_TSI_SECOND, SQL_TSI_SECOND); commandSet.put(T_SQL_TSI_WEEK, SQL_TSI_WEEK); commandSet.put(T_SQL_TSI_YEAR, SQL_TSI_YEAR); commandSet.put(T_STATEMENT, STATEMENT); commandSet.put(T_STYLE, STYLE); commandSet.put(T_SYNTAX, SYNTAX); commandSet.put(T_T_FACTOR, T); commandSet.put(T_TDC, TDC); commandSet.put(T_TEMP, TEMP); commandSet.put(T_TEMPORARY, TEMPORARY); commandSet.put(T_TEXT, TEXT); commandSet.put(T_TYPES, TYPES); commandSet.put(T_TIMESTAMPADD, TIMESTAMPADD); commandSet.put(T_TIMESTAMPDIFF, TIMESTAMPDIFF); commandSet.put(T_TOP, TOP); commandSet.put(T_TRANSACTION, TRANSACTION); commandSet.put(T_TRANSACTION_ACTIVE, TRANSACTION_ACTIVE); commandSet.put(T_TRANSACTS_COMMITTED, TRANSACTIONS_COMMITTED); commandSet.put(T_TRANSACTS_ROLLED_BACK, TRANSACTIONS_ROLLED_BACK); commandSet.put(T_TTI, TTI); commandSet.put(T_TYPE, TYPE); commandSet.put(T_UNCOMMITTED, UNCOMMITTED); commandSet.put(T_USAGE, USAGE); commandSet.put(T_VIEW, VIEW); commandSet.put(T_VARCHAR2, VARCHAR2); commandSet.put(T_WORK, WORK); commandSet.put(T_WRAPPER, WRAPPER); commandSet.put(T_WRITE, WRITE); commandSet.put(T_WRITE_DELAY, WRITE_DELAY); commandSet.put(T_ZONE, ZONE); // commandSet.put(T_ACOS, ACOS); commandSet.put(T_ACTION_ID, ACTION_ID); commandSet.put(T_ARRAY_SORT, ARRAY_SORT); commandSet.put(T_ASCII, ASCII); commandSet.put(T_ASIN, ASIN); commandSet.put(T_ATAN, ATAN); commandSet.put(T_ATAN2, ATAN2); commandSet.put(T_BITAND, BITAND); commandSet.put(T_BITANDNOT, BITANDNOT); commandSet.put(T_BITLENGTH, BITLENGTH); commandSet.put(T_BITNOT, BITNOT); commandSet.put(T_BITOR, BITOR); commandSet.put(T_BITXOR, BITXOR); commandSet.put(T_CASEWHEN, Tokens.CASEWHEN); commandSet.put(T_CONCAT_WORD, CONCAT_WORD); commandSet.put(T_CHR, CHR); commandSet.put(T_COS, COS); commandSet.put(T_COT, COT); commandSet.put(T_DATABASE_NAME, DATABASE_NAME); commandSet.put(T_DATE_ADD, DATE_ADD); commandSet.put(T_DATE_SUB, DATE_SUB); commandSet.put(T_DATEADD, DATEADD); commandSet.put(T_DATEDIFF, DATEDIFF); commandSet.put(T_DAY_NAME, DAY_NAME); commandSet.put(T_DAY_OF_MONTH, DAY_OF_MONTH); commandSet.put(T_DAY_OF_WEEK, DAY_OF_WEEK); commandSet.put(T_DAY_OF_YEAR, DAY_OF_YEAR); commandSet.put(T_DAYNAME, DAYNAME); commandSet.put(T_DAYOFMONTH, DAYOFMONTH); commandSet.put(T_DAYOFWEEK, DAYOFWEEK); commandSet.put(T_DAYOFYEAR, DAYOFYEAR); commandSet.put(T_DAYS, DAYS); commandSet.put(T_DECODE, DECODE); commandSet.put(T_DEGREES, DEGREES); commandSet.put(T_DIFFERENCE, DIFFERENCE); commandSet.put(T_DMOD, DMOD); commandSet.put(T_GREATEST, GREATEST); commandSet.put(T_HEXTORAW, HEXTORAW); commandSet.put(T_IFNULL, Tokens.IFNULL); commandSet.put(T_ISNULL, Tokens.ISNULL); commandSet.put(T_LCASE, LCASE); commandSet.put(T_LEAST, LEAST); commandSet.put(T_LOAD_FILE, LOAD_FILE); commandSet.put(T_LOCATE, LOCATE); commandSet.put(T_LOG, LOG); commandSet.put(T_LOG10, LOG10); commandSet.put(T_LPAD, LPAD); commandSet.put(T_LTRIM, LTRIM); commandSet.put(T_MONTH_NAME, MONTH_NAME); commandSet.put(T_MONTHNAME, MONTHNAME); commandSet.put(T_NAMES, Tokens.NAMES); commandSet.put(T_NVL, Tokens.IFNULL); commandSet.put(T_OCTETLENGTH, OCTETLENGTH); commandSet.put(T_PI, PI); commandSet.put(T_POSITION_ARRAY, POSITION_ARRAY); commandSet.put(T_QUARTER, QUARTER); commandSet.put(T_RADIANS, RADIANS); commandSet.put(T_RAND, RAND); commandSet.put(T_RAWTOHEX, RAWTOHEX); commandSet.put(T_REGEXP_MATCHES, REGEXP_MATCHES); commandSet.put(T_REGEXP_SUBSTRING, REGEXP_SUBSTRING); commandSet.put(T_REGEXP_SUBSTRING_ARRAY, REGEXP_SUBSTRING_ARRAY); commandSet.put(T_REPLACE, REPLACE); commandSet.put(T_REVERSE, REVERSE); commandSet.put(T_ROUND, ROUND); commandSet.put(T_ROUNDMAGIC, ROUNDMAGIC); commandSet.put(T_RPAD, RPAD); commandSet.put(T_RTRIM, RTRIM); commandSet.put(T_SECONDS_MIDNIGHT, SECONDS_MIDNIGHT); commandSet.put(T_SESSION_ID, SESSION_ID); commandSet.put(T_SIGN, SIGN); commandSet.put(T_SIN, SIN); commandSet.put(T_SORT_ARRAY, SORT_ARRAY); commandSet.put(T_SOUNDEX, SOUNDEX); commandSet.put(T_SPACE, SPACE); commandSet.put(T_SUBSTR, SUBSTR); commandSet.put(T_SYSDATE, SYSDATE); commandSet.put(T_SYSTIMESTAMP, SYSTIMESTAMP); commandSet.put(T_TAN, TAN); commandSet.put(T_TO_CHAR, TO_CHAR); commandSet.put(T_TO_DATE, TO_DATE); commandSet.put(T_TO_NUMBER, TO_NUMBER); commandSet.put(T_TO_TIMESTAMP, TO_TIMESTAMP); commandSet.put(T_TODAY, TODAY); commandSet.put(T_TRUNC, TRUNC); commandSet.put(T_UCASE, UCASE); commandSet.put(T_TRANSACTION_ID, TRANSACTION_ID); commandSet.put(T_TRANSACTION_SIZE, TRANSACTION_SIZE); commandSet.put(T_UUID, UUID); commandSet.put(T_UNIX_TIMESTAMP, UNIX_TIMESTAMP); commandSet.put(T_WEEK, WEEK); commandSet.put(T_WEEK_OF_YEAR, WEEK_OF_YEAR); // commandSet.put(T_ISOLATION_LEVEL, ISOLATION_LEVEL); commandSet.put(T_SESSION_ISOLATION_LEVEL, SESSION_ISOLATION_LEVEL); commandSet.put(T_DATABASE_ISOLATION_LEVEL, DATABASE_ISOLATION_LEVEL); commandSet.put(T_TRANSACTION_CONTROL, TRANSACTION_CONTROL); commandSet.put(T_TIMEZONE, TIMEZONE); commandSet.put(T_SESSION_TIMEZONE, SESSION_TIMEZONE); commandSet.put(T_DATABASE_TIMEZONE, DATABASE_TIMEZONE); commandSet.put(T_DATABASE_VERSION, DATABASE_VERSION); commandSet.put(T_LOB_ID, LOB_ID); commandSet.put(T_SEQUENCE_ARRAY, SEQUENCE_ARRAY); // commandSet.put(T_ASTERISK, Tokens.ASTERISK); commandSet.put(T_CLOSEBRACKET, CLOSEBRACKET); commandSet.put(T_COLON, Tokens.COLON); commandSet.put(T_COMMA, Tokens.COMMA); commandSet.put(T_CONCAT, Tokens.CONCAT); commandSet.put(T_DIVIDE, Tokens.DIVIDE); commandSet.put(T_EQUALS, Tokens.EQUALS); commandSet.put(T_GREATER, Tokens.GREATER); commandSet.put(T_GREATER_EQUALS, Tokens.GREATER_EQUALS); commandSet.put(T_LEFTBRACKET, LEFTBRACKET); commandSet.put(T_LESS, Tokens.LESS); commandSet.put(T_LESS_EQUALS, Tokens.LESS_EQUALS); commandSet.put(T_MINUS, Tokens.MINUS); commandSet.put(T_NOT_EQUALS, Tokens.NOT_EQUALS); commandSet.put(T_NOT_EQUALS_ALT, Tokens.NOT_EQUALS); commandSet.put(T_OPENBRACKET, OPENBRACKET); commandSet.put(T_PLUS, Tokens.PLUS); commandSet.put(T_QUESTION, Tokens.QUESTION); commandSet.put(T_RIGHTBRACKET, RIGHTBRACKET); commandSet.put(T_SEMICOLON, SEMICOLON); } static int get(String token) { int type = reservedKeys.get(token, -1); if (type == -1) { return commandSet.get(token, -1); } return type; } public static boolean isCoreKeyword(int token) { return coreReservedWords.contains(token); } public static boolean isKeyword(String token) { return reservedKeys.containsKey(token); } public static int getKeywordID(String token, int defaultValue) { return reservedKeys.get(token, defaultValue); } public static int getNonKeywordID(String token, int defaultValue) { return commandSet.get(token, defaultValue); } public static String getKeyword(int token) { String key = (String) reservedKeys.getKey(token); if (key != null) { return key; } key = (String) commandSet.getKey(token); return key; } private static final OrderedIntHashSet coreReservedWords; static { // minimal set of identifier not allowed as table / column / alias names // these are in effect interpreted as reserved words used by HSQLDB coreReservedWords = new OrderedIntHashSet(128); short[] keyword = { AS, AND, ALL, ANY, AT, AVG, BY, BETWEEN, BOTH, CALL, CASE, CAST, CORRESPONDING, CONVERT, COUNT, COALESCE, CREATE, CROSS, DEFAULT, DISTINCT, DO, DROP, ELSE, EVERY, EXISTS, EXCEPT, FOR, FROM, FULL, GRANT, GROUP, HAVING, INTO, IS, IN, INTERSECT, JOIN, INNER, LEFT, LEADING, LIKE, MAX, MIN, NATURAL, NULLIF, NOT, ON, ORDER, OR, OUTER, PRIMARY, REFERENCES, RIGHT, SELECT, SET, SOME, STDDEV_POP, STDDEV_SAMP, SUM, TABLE, THEN, TO, TRAILING, TRIGGER, UNION, UNIQUE, USING, VALUES, VAR_POP, VAR_SAMP, WHEN, WHERE, WITH, }; for (int i = 0; i < keyword.length; i++) { coreReservedWords.add(keyword[i]); } } public static final short[] SQL_INTERVAL_FIELD_CODES = new short[] { Tokens.YEAR, Tokens.MONTH, Tokens.DAY, Tokens.HOUR, Tokens.MINUTE, Tokens.SECOND }; public static final String[] SQL_INTERVAL_FIELD_NAMES = new String[] { Tokens.T_YEAR, Tokens.T_MONTH, Tokens.T_DAY, Tokens.T_HOUR, Tokens.T_MINUTE, Tokens.T_SECOND }; private static final IntKeyHashMap sqlTSILookup = new IntKeyHashMap(10); static { sqlTSILookup.put(SQL_TSI_DAY, T_SQL_TSI_DAY); sqlTSILookup.put(SQL_TSI_FRAC_SECOND, T_SQL_TSI_FRAC_SECOND); sqlTSILookup.put(SQL_TSI_MILLI_SECOND, T_SQL_TSI_MILLI_SECOND); sqlTSILookup.put(SQL_TSI_HOUR, T_SQL_TSI_HOUR); sqlTSILookup.put(SQL_TSI_MINUTE, T_SQL_TSI_MINUTE); sqlTSILookup.put(SQL_TSI_MONTH, T_SQL_TSI_MONTH); sqlTSILookup.put(SQL_TSI_QUARTER, T_SQL_TSI_QUARTER); sqlTSILookup.put(SQL_TSI_SECOND, T_SQL_TSI_SECOND); sqlTSILookup.put(SQL_TSI_WEEK, T_SQL_TSI_WEEK); sqlTSILookup.put(SQL_TSI_YEAR, T_SQL_TSI_YEAR); } public static String getSQLTSIString(int token) { return (String) sqlTSILookup.get(token); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Server.java0000644000175000017500000000322112007547362021053 0ustar renerene/* Copyright (c) 2001-2010, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; public class Server extends org.hsqldb.server.Server { } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TriggerDef.java0000644000175000017500000005201412007547364021635 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HsqlDeque; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.StringConverter; import org.hsqldb.rights.Grantee; // peterhudson@users 20020130 - patch 478657 by peterhudson - triggers support // fredt@users 20020130 - patch 1.7.0 by fredt // added new class as jdk 1.1 does not allow use of LinkedList // fredt@users 20030727 - signature and other alterations // fredt@users 20040430 - changes by mattshaw@users to allow termination of the // trigger thread - // fredt@users - updated for v. 2.x /** * Represents an HSQLDB Trigger definition.

* * Provides services regarding HSQLDB Trigger execution and metadata.

* * Development of the trigger implementation sponsored by Logicscope * Realisations Ltd * * @author Peter Hudson (peterhudson@users dot sourceforge.net) * @version 2.0.1 * @since hsqldb 1.61 */ public class TriggerDef implements Runnable, SchemaObject { static final int OLD_ROW = 0; static final int NEW_ROW = 1; static final int RANGE_COUNT = 2; static final int OLD_TABLE = 2; static final int NEW_TABLE = 3; static final int BEFORE = 4; static final int AFTER = 5; static final int INSTEAD = 6; // static final int NUM_TRIGGER_OPS = 3; // {ins,del,upd} static final int NUM_TRIGS = NUM_TRIGGER_OPS * 3; // {b}{fer}, {a},{fer, fes} // static final TriggerDef[] emptyArray = new TriggerDef[]{}; Table[] transitions; RangeVariable[] rangeVars; Expression condition; boolean hasTransitionTables; boolean hasTransitionRanges; String conditionSQL; Routine routine; int[] updateColumns; // other variables private HsqlName name; long changeTimestamp; int actionTiming; int operationType; boolean isSystem; boolean forEachRow; boolean nowait; // block or overwrite if queue full int maxRowsQueued; // max size of queue of pending triggers Table table; Trigger trigger; String triggerClassName; int triggerType; Thread thread; //protected boolean busy; // firing trigger in progress protected HsqlDeque pendingQueue; // row triggers pending protected int rowsQueued; // rows in pendingQueue protected boolean valid = true; // parsing valid protected volatile boolean keepGoing = true; TriggerDef() {} /** * Constructs a new TriggerDef object to represent an HSQLDB trigger * declared in an SQL CREATE TRIGGER statement. * * Changes in 1.7.2 allow the queue size to be specified as 0. A zero * queue size causes the Trigger.fire() code to run in the main thread of * execution (fully inside the enclosing transaction). Otherwise, the code * is run in the Trigger's own thread. * (fredt@users) * * @param name The trigger object's HsqlName * @param when whether the trigger fires * before, after or instead of the triggering event * @param operation the triggering operation; * currently insert, update, or delete * @param forEach indicates whether the trigger is fired for each row * (true) or statement (false) * @param table the Table object upon which the indicated operation * fires the trigger * @param triggerClassName the fully qualified named of the class implementing * the org.hsqldb.Trigger (trigger body) interface * @param noWait do not wait for available space on the pending queue; if * the pending queue does not have fewer than nQueueSize queued items, * then overwrite the current tail instead * @param queueSize the length to which the pending queue may grow before * further additions are either blocked or overwrite the tail entry, * as determined by noWait */ public TriggerDef(HsqlNameManager.HsqlName name, int when, int operation, boolean forEach, Table table, Table[] transitions, RangeVariable[] rangeVars, Expression condition, String conditionSQL, int[] updateColumns, String triggerClassName, boolean noWait, int queueSize) { this(name, when, operation, forEach, table, transitions, rangeVars, condition, conditionSQL, updateColumns); this.triggerClassName = triggerClassName; this.nowait = noWait; this.maxRowsQueued = queueSize; rowsQueued = 0; pendingQueue = new HsqlDeque(); Class cl = null; try { cl = Class.forName(triggerClassName, true, Thread.currentThread().getContextClassLoader()); } catch (Throwable t1) { try { cl = Class.forName(triggerClassName); } catch (Throwable t) {} } if (cl == null) { valid = false; trigger = new DefaultTrigger(); } else { try { // dynamically instantiate it trigger = (Trigger) cl.newInstance(); } catch (Throwable t1) { valid = false; trigger = new DefaultTrigger(); } } } public TriggerDef(HsqlNameManager.HsqlName name, int when, int operation, boolean forEachRow, Table table, Table[] transitions, RangeVariable[] rangeVars, Expression condition, String conditionSQL, int[] updateColumns) { this.name = name; this.actionTiming = when; this.operationType = operation; this.forEachRow = forEachRow; this.table = table; this.transitions = transitions; this.rangeVars = rangeVars; this.condition = condition == null ? Expression.EXPR_TRUE : condition; this.updateColumns = updateColumns; this.conditionSQL = conditionSQL; hasTransitionRanges = rangeVars[OLD_ROW] != null || rangeVars[NEW_ROW] != null; hasTransitionTables = transitions[OLD_TABLE] != null || transitions[NEW_TABLE] != null; setUpIndexesAndTypes(); } public boolean isValid() { return valid; } public int getType() { return SchemaObject.TRIGGER; } public HsqlName getName() { return name; } public HsqlName getCatalogName() { return name.schema.schema; } public HsqlName getSchemaName() { return name.schema; } public Grantee getOwner() { return name.schema.owner; } public OrderedHashSet getReferences() { return new OrderedHashSet(); } public OrderedHashSet getComponents() { return null; } public void compile(Session session, SchemaObject parentObject) {} /** * Retrieves the SQL character sequence required to (re)create the * trigger, as a StringBuffer * * @return the SQL character sequence required to (re)create the * trigger */ public String getSQL() { StringBuffer sb = getSQLMain(); if (maxRowsQueued != 0) { sb.append(Tokens.T_QUEUE).append(' '); sb.append(maxRowsQueued).append(' '); if (nowait) { sb.append(Tokens.T_NOWAIT).append(' '); } } sb.append(Tokens.T_CALL).append(' '); sb.append(StringConverter.toQuotedString(triggerClassName, '"', false)); return sb.toString(); } public long getChangeTimestamp() { return changeTimestamp; } public StringBuffer getSQLMain() { StringBuffer sb = new StringBuffer(256); sb.append(Tokens.T_CREATE).append(' '); sb.append(Tokens.T_TRIGGER).append(' '); sb.append(name.getSchemaQualifiedStatementName()).append(' '); sb.append(getActionTimingString()).append(' '); sb.append(getEventTypeString()).append(' '); if (updateColumns != null) { sb.append(Tokens.T_OF).append(' '); for (int i = 0; i < updateColumns.length; i++) { if (i != 0) { sb.append(','); } HsqlName name = table.getColumn(updateColumns[i]).getName(); sb.append(name.statementName); } sb.append(' '); } sb.append(Tokens.T_ON).append(' '); sb.append(table.getName().getSchemaQualifiedStatementName()); sb.append(' '); if (hasTransitionRanges || hasTransitionTables) { sb.append(Tokens.T_REFERENCING).append(' '); if (rangeVars[OLD_ROW] != null) { sb.append(Tokens.T_OLD).append(' ').append(Tokens.T_ROW); sb.append(' ').append(Tokens.T_AS).append(' '); sb.append( rangeVars[OLD_ROW].getTableAlias().getStatementName()); sb.append(' '); } if (rangeVars[NEW_ROW] != null) { sb.append(Tokens.T_NEW).append(' ').append(Tokens.T_ROW); sb.append(' ').append(Tokens.T_AS).append(' '); sb.append( rangeVars[NEW_ROW].getTableAlias().getStatementName()); sb.append(' '); } if (transitions[OLD_TABLE] != null) { sb.append(Tokens.T_OLD).append(' ').append(Tokens.T_TABLE); sb.append(' ').append(Tokens.T_AS).append(' '); sb.append(transitions[OLD_TABLE].getName().statementName); sb.append(' '); } if (transitions[NEW_TABLE] != null) { sb.append(Tokens.T_OLD).append(' ').append(Tokens.T_TABLE); sb.append(' ').append(Tokens.T_AS).append(' '); sb.append(transitions[NEW_TABLE].getName().statementName); sb.append(' '); } } if (forEachRow) { sb.append(Tokens.T_FOR).append(' '); sb.append(Tokens.T_EACH).append(' '); sb.append(Tokens.T_ROW).append(' '); } if (condition != Expression.EXPR_TRUE) { sb.append(Tokens.T_WHEN).append(' '); sb.append(Tokens.T_OPENBRACKET).append(conditionSQL); sb.append(Tokens.T_CLOSEBRACKET).append(' '); } return sb; } public String getClassName() { return trigger.getClass().getName(); } public String getActionTimingString() { switch (this.actionTiming) { case TriggerDef.BEFORE : return Tokens.T_BEFORE; case TriggerDef.AFTER : return Tokens.T_AFTER; case TriggerDef.INSTEAD : return Tokens.T_INSTEAD + ' ' + Tokens.T_OF; default : throw Error.runtimeError(ErrorCode.U_S0500, "TriggerDef"); } } public String getEventTypeString() { switch (this.operationType) { case StatementTypes.INSERT : return Tokens.T_INSERT; case StatementTypes.DELETE_WHERE : return Tokens.T_DELETE; case StatementTypes.UPDATE_WHERE : return Tokens.T_UPDATE; default : throw Error.runtimeError(ErrorCode.U_S0500, "TriggerDef"); } } public boolean isSystem() { return isSystem; } public boolean isForEachRow() { return forEachRow; } public String getConditionSQL() { return conditionSQL; } public String getProcedureSQL() { return routine == null ? null : routine.getSQLBodyDefinition(); } public int[] getUpdateColumnIndexes() { return updateColumns; } public boolean hasOldTable() { return false; } public boolean hasNewTable() { return false; } public String getOldTransitionRowName() { return rangeVars[OLD_ROW] == null ? null : rangeVars[OLD_ROW].getTableAlias() .name; } public String getNewTransitionRowName() { return rangeVars[NEW_ROW] == null ? null : rangeVars[NEW_ROW].getTableAlias() .name; } public String getOldTransitionTableName() { return transitions[OLD_TABLE] == null ? null : transitions[OLD_TABLE] .getName().name; } public String getNewTransitionTableName() { return transitions[NEW_TABLE] == null ? null : transitions[NEW_TABLE] .getName().name; } /** * Given the SQL creating the trigger, set up the index to the * HsqlArrayList[] and the associated GRANT type */ void setUpIndexesAndTypes() { triggerType = 0; switch (operationType) { case StatementTypes.INSERT : triggerType = Trigger.INSERT_AFTER; break; case StatementTypes.DELETE_WHERE : triggerType = Trigger.DELETE_AFTER; break; case StatementTypes.UPDATE_WHERE : triggerType = Trigger.UPDATE_AFTER; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "TriggerDef"); } if (forEachRow) { triggerType += NUM_TRIGGER_OPS; } if (actionTiming == TriggerDef.BEFORE || actionTiming == TriggerDef.INSTEAD) { triggerType += NUM_TRIGGER_OPS; } } /** * Return the type code for operation tokens */ static int getOperationType(int token) { switch (token) { case Tokens.INSERT : return StatementTypes.INSERT; case Tokens.DELETE : return StatementTypes.DELETE_WHERE; case Tokens.UPDATE : return StatementTypes.UPDATE_WHERE; default : throw Error.runtimeError(ErrorCode.U_S0500, "TriggerDef"); } } static int getTiming(int token) { switch (token) { case Tokens.BEFORE : return TriggerDef.BEFORE; case Tokens.AFTER : return TriggerDef.AFTER; case Tokens.INSTEAD : return TriggerDef.INSTEAD; default : throw Error.runtimeError(ErrorCode.U_S0500, "TriggerDef"); } } public int getStatementType() { return operationType; } /** * run method declaration

* * the trigger JSP is run in its own thread here. Its job is simply to * wait until it is told by the main thread that it should fire the * trigger. */ public void run() { while (keepGoing) { TriggerData triggerData = popPair(); if (triggerData != null) { if (triggerData.username != null) { trigger.fire(this.triggerType, name.name, table.getName().name, triggerData.oldRow, triggerData.newRow); } } } try { thread.setContextClassLoader(null); } catch (Throwable t) {} } /** * start the thread if this is threaded */ public synchronized void start() { if (maxRowsQueued != 0) { thread = new Thread(this); thread.start(); } } /** * signal the thread to stop */ public synchronized void terminate() { keepGoing = false; notify(); } /** * pop2 method declaration

* * The consumer (trigger) thread waits for an event to be queued

* * Note: This push/pop pairing assumes a single producer thread * and a single consumer thread _only_. * * @return Description of the Return Value */ synchronized TriggerData popPair() { if (rowsQueued == 0) { try { wait(); // this releases the lock monitor } catch (InterruptedException e) { /* ignore and resume */ } } rowsQueued--; notify(); // notify push's wait if (pendingQueue.size() == 0) { return null; } else { return (TriggerData) pendingQueue.removeFirst(); } } /** * The main thread tells the trigger thread to fire by this call. * If this Trigger is not threaded then the fire method is caled * immediately and executed by the main thread. Otherwise, the row * data objects are added to the queue to be used by the Trigger thread. * * @param row1 * @param row2 */ synchronized void pushPair(Session session, Object[] row1, Object[] row2) { if (maxRowsQueued == 0) { session.getInternalConnection(); try { trigger.fire(triggerType, name.name, table.getName().name, row1, row2); } finally { session.releaseInternalConnection(); } return; } if (rowsQueued >= maxRowsQueued) { if (nowait) { pendingQueue.removeLast(); // overwrite last } else { try { wait(); } catch (InterruptedException e) { /* ignore and resume */ } rowsQueued++; } } else { rowsQueued++; } pendingQueue.add(new TriggerData(session, row1, row2)); notify(); // notify pop's wait } public boolean isBusy() { return rowsQueued != 0; } public Table getTable() { return table; } public String getActionOrientationString() { return forEachRow ? Tokens.T_ROW : Tokens.T_STATEMENT; } /** * Class to store the data used to fire a trigger. The username attribute * is not used but it allows developers to change the signature of the * fire method of the Trigger class and pass the user name to the Trigger. */ static class TriggerData { public Object[] oldRow; public Object[] newRow; public String username; public TriggerData(Session session, Object[] oldRow, Object[] newRow) { this.oldRow = oldRow; this.newRow = newRow; this.username = session.getUsername(); } } static class DefaultTrigger implements org.hsqldb.Trigger { public void fire(int i, String name, String table, Object[] row1, Object[] row2) { // do nothing } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TriggerDefSQL.java0000644000175000017500000000771212007547362022220 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.store.ValuePool; import org.hsqldb.result.Result; /** * Implementation of SQL TRIGGER objects.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public class TriggerDefSQL extends TriggerDef { OrderedHashSet references; public TriggerDefSQL(HsqlNameManager.HsqlName name, int when, int operation, boolean forEachRow, Table table, Table[] transitions, RangeVariable[] rangeVars, Expression condition, String conditionSQL, int[] updateColumns, Routine routine) { super(name, when, operation, forEachRow, table, transitions, rangeVars, condition, conditionSQL, updateColumns); this.routine = routine; this.references = routine.getReferences(); } public OrderedHashSet getReferences() { return routine.getReferences(); } public OrderedHashSet getComponents() { return null; } public void compile(Session session, SchemaObject parentObject) {} public String getClassName() { return null; } public boolean hasOldTable() { return transitions[OLD_TABLE] != null; } public boolean hasNewTable() { return transitions[NEW_TABLE] != null; } synchronized void pushPair(Session session, Object[] oldData, Object[] newData) { Result result = Result.updateZeroResult; session.sessionContext.push(); if (rangeVars[OLD_ROW] != null || rangeVars[NEW_ROW] != null) { session.sessionContext.triggerArguments = new Object[][] { oldData, newData }; } if (condition.testCondition(session)) { int variableCount = routine.getVariableCount(); session.sessionContext.routineVariables = new Object[variableCount]; result = routine.statement.execute(session); } session.sessionContext.pop(); if (result.isError()) { throw result.getException(); } } public String getSQL() { StringBuffer sb = getSQLMain(); sb.append(routine.statement.getSQL()); return sb.toString(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/RangeGroup.java0000644000175000017500000000602312007547376021666 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; public interface RangeGroup { public static final RangeGroup emptyGroup = new RangeGroupEmpty(); public static final RangeGroup[] emptyArray = new RangeGroup[]{ emptyGroup }; RangeVariable[] getRangeVariables(); void setCorrelated(); public static class RangeGroupSimple implements RangeGroup { RangeVariable[] ranges; RangeGroup baseGroup; TableDerived table; public RangeGroupSimple(TableDerived table) { ranges = RangeVariable.emptyArray; this.table = table; } public RangeGroupSimple(RangeVariable[] ranges, RangeGroup baseGroup) { this.ranges = ranges; this.baseGroup = baseGroup; } public RangeGroupSimple(RangeVariable[] ranges) { this.ranges = ranges; } public RangeVariable[] getRangeVariables() { return ranges; } public void setCorrelated() { if (baseGroup != null) { baseGroup.setCorrelated(); } if (table != null) { table.setCorrelated(); } } } public static class RangeGroupEmpty implements RangeGroup { RangeGroupEmpty() { // } public RangeVariable[] getRangeVariables() { return RangeVariable.emptyArray; } public void setCorrelated() { // } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Database.java0000644000175000017500000005755312007547412021326 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.dbinfo.DatabaseInformation; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.FrameworkLogger; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.HsqlTimer; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.persist.LobManager; import org.hsqldb.persist.Logger; import org.hsqldb.persist.PersistentStoreCollectionDatabase; import org.hsqldb.result.Result; import org.hsqldb.rights.GranteeManager; import org.hsqldb.rights.User; import org.hsqldb.rights.UserManager; import org.hsqldb.store.ValuePool; import org.hsqldb.types.Collation; // incorporates following contributions // boucherb@users - javadoc comments // Ocke Jansen (oj@openoffice dot org) - file access api /** * Database is the root class for HSQL Database Engine database.

* * It holds the data structures that form an HSQLDB database instance. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class Database { int databaseID; String databaseUniqueName; String databaseType; private final String canonicalPath; public HsqlProperties urlProperties; private final String path; public Collation collation; public DatabaseInformation dbInfo; /** indicates the state of the database */ private volatile int dbState; public Logger logger; /** true means that all tables are readonly. */ boolean databaseReadOnly; /** * true means that all CACHED and TEXT tables are readonly. * MEMORY tables are updatable but updates are not persisted. */ private boolean filesReadOnly; /** true means filesReadOnly */ private boolean filesInJar; /** * Defaults are used in version upgrades, but overridden by * databaseProperties or URL properties for new databases. */ public boolean sqlEnforceTypes = false; public boolean sqlEnforceRefs = false; public boolean sqlEnforceSize = true; public boolean sqlEnforceNames = false; public boolean sqlRegularNames = true; public boolean sqlEnforceTDCD = true; public boolean sqlEnforceTDCU = true; public boolean sqlTranslateTTI = true; public boolean sqlConcatNulls = true; public boolean sqlUniqueNulls = true; public boolean sqlNullsFirst = true; public boolean sqlConvertTruncate = true; public int sqlAvgScale = 0; public boolean sqlDoubleNaN = true; public boolean sqlLongvarIsLob = false; public boolean sqlSyntaxDb2 = false; public boolean sqlSyntaxMss = false; public boolean sqlSyntaxMys = false; public boolean sqlSyntaxOra = false; public boolean sqlSyntaxPgs = false; private boolean isReferentialIntegrity = true; public HsqlDatabaseProperties databaseProperties; private final boolean shutdownOnNoConnection; int resultMaxMemoryRows; // schema invarient objects public UserManager userManager; public GranteeManager granteeManager; public HsqlNameManager nameManager; // session related objects public SessionManager sessionManager; public TransactionManager txManager; public int defaultIsolationLevel = SessionInterface.TX_READ_COMMITTED; public boolean txConflictRollback = true; // schema objects public SchemaManager schemaManager; // public PersistentStoreCollectionDatabase persistentStoreCollection; // public LobManager lobManager; // public CheckpointRunner checkpointRunner; // public static final int DATABASE_ONLINE = 1; public static final int DATABASE_OPENING = 2; public static final int DATABASE_CLOSING = 3; public static final int DATABASE_SHUTDOWN = 4; public static final int CLOSEMODE_IMMEDIATELY = 1; public static final int CLOSEMODE_NORMAL = 2; public static final int CLOSEMODE_COMPACT = 3; public static final int CLOSEMODE_SCRIPT = 4; /** * Constructs a new Database object. * * @param type is the type of the database: "mem:", "file:", "res:" * @param path is the given path to the database files * @param canonicalPath is the canonical path * @param props property overrides placed on the connect URL * @exception HsqlException if the specified name and path * combination is illegal or unavailable, or the database files the * name and path resolves to are in use by another process */ Database(String type, String path, String canonicalPath, HsqlProperties props) { setState(Database.DATABASE_SHUTDOWN); this.databaseType = type; this.path = path; this.canonicalPath = canonicalPath; this.urlProperties = props; if (databaseType == DatabaseURL.S_RES) { filesInJar = true; filesReadOnly = true; } logger = new Logger(this); shutdownOnNoConnection = urlProperties.isPropertyTrue(HsqlDatabaseProperties.url_shutdown); lobManager = new LobManager(this); } /** * Opens this database. The database should be opened after construction. */ synchronized void open() { if (!isShutdown()) { return; } reopen(); } /** * Opens this database. The database should be opened after construction. * or reopened by the close(int closemode) method during a * "shutdown compact". Closes the log if there is an error. */ void reopen() { boolean isNew = false; setState(DATABASE_OPENING); try { nameManager = new HsqlNameManager(this); granteeManager = new GranteeManager(this); userManager = new UserManager(this); schemaManager = new SchemaManager(this); persistentStoreCollection = new PersistentStoreCollectionDatabase(); isReferentialIntegrity = true; sessionManager = new SessionManager(this); collation = collation.newDatabaseInstance(); dbInfo = DatabaseInformation.newDatabaseInformation(this); txManager = new TransactionManager2PL(this); lobManager.createSchema(); sessionManager.getSysLobSession().setSchema( SqlInvariants.LOBS_SCHEMA); schemaManager.setSchemaChangeTimestamp(); schemaManager.createSystemTables(); // completed metadata logger.openPersistence(); isNew = logger.isNewDatabase; if (isNew) { String username = urlProperties.getProperty("user", "SA"); String password = urlProperties.getProperty("password", ""); userManager.createFirstUser(username, password); schemaManager.createPublicSchema(); lobManager.initialiseLobSpace(); logger.checkpoint(false); } lobManager.open(); dbInfo.setWithContent(true); checkpointRunner = new CheckpointRunner(); } catch (Throwable e) { logger.closePersistence(Database.CLOSEMODE_IMMEDIATELY); logger.releaseLock(); setState(DATABASE_SHUTDOWN); clearStructures(); DatabaseManager.removeDatabase(this); if (!(e instanceof HsqlException)) { e = Error.error(ErrorCode.GENERAL_ERROR, e); } logger.logSevereEvent("could not reopen database", e); throw (HsqlException) e; } setState(DATABASE_ONLINE); } /** * Clears the data structuress, making them elligible for garbage collection. */ void clearStructures() { if (schemaManager != null) { schemaManager.release(); } if (checkpointRunner != null) { checkpointRunner.stop(); } granteeManager = null; userManager = null; nameManager = null; schemaManager = null; sessionManager = null; dbInfo = null; checkpointRunner = null; } /** * Returns the database ID. */ public int getDatabaseID() { return this.databaseID; } /** * Returns a unique String identifier for the database. */ public String getUniqueName() { return databaseUniqueName; } public void setUniqueName(String name) { databaseUniqueName = name; } /** * Returns the type of the database: "mem", "file", "res" */ public String getType() { return databaseType; } /** * Returns the path of the database */ public String getPath() { return path; } public HsqlName getCatalogName() { return nameManager.getCatalogName(); } /** * Returns the database properties. */ public HsqlDatabaseProperties getProperties() { return databaseProperties; } /** * Returns the SessionManager for the database. */ public SessionManager getSessionManager() { return sessionManager; } public boolean isReadOnly() { return databaseReadOnly; } /** * Returns true if database has been shut down, false otherwise */ boolean isShutdown() { return dbState == DATABASE_SHUTDOWN; } /** * Constructs a new Session that operates within (is connected to) the * context of this Database object.

* * If successful, the new Session object initially operates on behalf of * the user specified by the supplied user name. * * Throws if username or password is invalid. */ synchronized Session connect(String username, String password, String zoneString, int timeZoneSeconds) { if (username.equalsIgnoreCase("SA")) { username = "SA"; } User user = userManager.getUser(username, password); Session session = sessionManager.newSession(this, user, databaseReadOnly, true, zoneString, timeZoneSeconds); return session; } /** * Puts this Database object in global read-only mode. After * this call, all existing and future sessions are limited to read-only * transactions. Any following attempts to update the state of the * database will result in throwing an HsqlException. */ public void setReadOnly() { databaseReadOnly = true; filesReadOnly = true; } /** * After this call all CACHED and TEXT tables will be set to read-only * mode. Changes to MEMORY tables will NOT * be stored or updated in the script file. This mode is intended for * use with read-only media where data should not be persisted. */ public void setFilesReadOnly() { filesReadOnly = true; } /** * Is this in filesReadOnly mode? */ public boolean isFilesReadOnly() { return filesReadOnly; } /** * Is this in filesInJar mode? */ public boolean isFilesInJar() { return filesInJar; } /** * Returns the UserManager for this Database. */ public UserManager getUserManager() { return userManager; } /** * Returns the GranteeManager for this Database. */ public GranteeManager getGranteeManager() { return granteeManager; } /** * Sets the isReferentialIntegrity attribute. */ public void setReferentialIntegrity(boolean ref) { isReferentialIntegrity = ref; } /** * Is referential integrity currently enforced? */ public boolean isReferentialIntegrity() { return isReferentialIntegrity; } public int getResultMaxMemoryRows() { return resultMaxMemoryRows; } public void setResultMaxMemoryRows(int size) { resultMaxMemoryRows = size; } public void setStrictNames(boolean mode) { sqlEnforceNames = mode; } public void setRegularNames(boolean mode) { sqlRegularNames = mode; nameManager.setSqlRegularNames(mode); } public void setStrictColumnSize(boolean mode) { sqlEnforceSize = mode; } public void setStrictReferences(boolean mode) { sqlEnforceRefs = mode; } public void setStrictTypes(boolean mode) { sqlEnforceTypes = mode; } public void setStrictTDCD(boolean mode) { sqlEnforceTDCD = mode; } public void setStrictTDCU(boolean mode) { sqlEnforceTDCU = mode; } public void setTranslateTTI(boolean mode) { sqlTranslateTTI = mode; } public void setNullsFirst(boolean mode) { sqlNullsFirst = mode; } public void setConcatNulls(boolean mode) { sqlConcatNulls = mode; } public void setUniqueNulls(boolean mode) { sqlUniqueNulls = mode; } public void setConvertTrunc(boolean mode) { sqlConvertTruncate = mode; } public void setDoubleNaN(boolean mode) { sqlDoubleNaN = mode; } public void setAvgScale(int scale) { sqlAvgScale = scale; } public void setLongVarIsLob(boolean mode) { sqlLongvarIsLob = mode; } public void setSyntaxDb2(boolean mode) { sqlSyntaxDb2 = mode; } public void setSyntaxMss(boolean mode) { sqlSyntaxMss = mode; } public void setSyntaxMys(boolean mode) { sqlSyntaxMys = mode; } public void setSyntaxOra(boolean mode) { sqlSyntaxOra = mode; } public void setSyntaxPgs(boolean mode) { sqlSyntaxPgs = mode; } /** * Called by the garbage collector on this Databases object when garbage * collection determines that there are no more references to it. */ protected void finalize() { if (getState() != DATABASE_ONLINE) { return; } try { close(CLOSEMODE_IMMEDIATELY); } catch (HsqlException e) { // it's too late now } } void closeIfLast() { if (sessionManager.isEmpty() && dbState == this.DATABASE_ONLINE) { if (shutdownOnNoConnection) { try { close(CLOSEMODE_NORMAL); } catch (HsqlException e) {} } else { logger.synchLog(); } } } /** * Closes this Database using the specified mode.

* *

    *
  1. closemode -1 performs SHUTDOWN IMMEDIATELY, equivalent * to a poweroff or crash. * *
  2. closemode 0 performs a normal SHUTDOWN that * checkpoints the database normally. * *
  3. closemode 1 performs a shutdown compact that scripts * out the contents of any CACHED tables to the log then * deletes the existing *.data file that contains the data * for all CACHED table before the normal checkpoint process * which in turn creates a new, compact *.data file. *
*/ public void close(int closemode) { HsqlException he = null; // multiple simultaneous close synchronized (this) { if (getState() != DATABASE_ONLINE) { return; } setState(DATABASE_CLOSING); } sessionManager.closeAllSessions(); if (filesReadOnly) { closemode = CLOSEMODE_IMMEDIATELY; } /** * @todo fredt - impact of possible error conditions in closing the log * should be investigated for the CLOSEMODE_COMPACT mode */ logger.closePersistence(closemode); lobManager.close(); sessionManager.close(); try { if (closemode == CLOSEMODE_COMPACT) { clearStructures(); reopen(); setState(DATABASE_CLOSING); logger.closePersistence(CLOSEMODE_NORMAL); lobManager.close(); } } catch (Throwable t) { if (t instanceof HsqlException) { he = (HsqlException) t; } else { he = Error.error(ErrorCode.GENERAL_ERROR, t); } } lobManager = null; logger.releaseLock(); setState(DATABASE_SHUTDOWN); clearStructures(); // fredt - this could change to avoid removing a db from the // DatabaseManager repository if there are pending getDatabase() // calls DatabaseManager.removeDatabase(this); // todo - when hsqldb.sql. logging is supported, add another call FrameworkLogger.clearLoggers("hsqldb.db." + getUniqueName()); if (he != null) { throw he; } } private void setState(int state) { dbState = state; } int getState() { return dbState; } String getStateString() { int state = getState(); switch (state) { case DATABASE_CLOSING : return "DATABASE_CLOSING"; case DATABASE_ONLINE : return "DATABASE_ONLINE"; case DATABASE_OPENING : return "DATABASE_OPENING"; case DATABASE_SHUTDOWN : return "DATABASE_SHUTDOWN"; default : return "UNKNOWN"; } } public String[] getSettingsSQL() { HsqlArrayList list = new HsqlArrayList(); StringBuffer sb = new StringBuffer(); if (!getCatalogName().name.equals( HsqlNameManager.DEFAULT_CATALOG_NAME)) { String name = getCatalogName().statementName; sb.append("ALTER CATALOG PUBLIC RENAME TO ").append(name); list.add(sb.toString()); sb.setLength(0); } if (!collation.isDefaultCollation()) { list.add(collation.getDatabaseCollationSQL()); } HashMappedList lobTables = schemaManager.getTables(SqlInvariants.LOBS_SCHEMA); for (int i = 0; i < lobTables.size(); i++) { Table table = (Table) lobTables.get(i); if (table.isCached()) { sb.append(Tokens.T_SET).append(' ').append(Tokens.T_TABLE); sb.append(' '); sb.append(table.getName().getSchemaQualifiedStatementName()); sb.append(' ').append(Tokens.T_TYPE).append(' '); sb.append(Tokens.T_CACHED); list.add(sb.toString()); sb.setLength(0); } } String[] array = new String[list.size()]; list.toArray(array); return array; } /** * Returns the schema and authorisation statements for the database. */ public Result getScript(boolean indexRoots) { Result r = Result.newSingleColumnResult("COMMAND"); // properties String[] list = logger.getPropertiesSQL(indexRoots); addRows(r, list); list = getSettingsSQL(); addRows(r, list); list = getGranteeManager().getSQL(); addRows(r, list); // schemas and schema objects such as tables, sequences, etc. list = schemaManager.getSQLArray(); addRows(r, list); // optional comments on tables etc. list = schemaManager.getCommentsArray(); addRows(r, list); // index roots if (indexRoots) { list = schemaManager.getIndexRootsSQL(); addRows(r, list); } // text headers - readonly - clustered list = schemaManager.getTablePropsSQL(!indexRoots); addRows(r, list); // password complexity list = getUserManager().getAuthenticationSQL(); addRows(r, list); // user session start schema names list = getUserManager().getInitialSchemaSQL(); addRows(r, list); // grantee rights list = getGranteeManager().getRightstSQL(); addRows(r, list); return r; } private static void addRows(Result r, String[] sql) { if (sql == null) { return; } for (int i = 0; i < sql.length; i++) { String[] s = new String[1]; s[0] = sql[i]; r.initialiseNavigator().add(s); } } public String getURI() { return databaseType + canonicalPath; } public String getCanonicalPath() { return canonicalPath; } public HsqlProperties getURLProperties() { return urlProperties; } class CheckpointRunner implements Runnable { private volatile boolean waiting; private Object timerTask; public void run() { try { Session sysSession = sessionManager.newSysSession(); Statement checkpoint = ParserCommand.getAutoCheckpointStatement(Database.this); sysSession.executeCompiledStatement( checkpoint, ValuePool.emptyObjectArray); sysSession.commit(false); sysSession.close(); waiting = false; } catch (Exception e) { // ignore exceptions // may be InterruptedException or IOException } } public void start() { if (!logger.isLogged()) { return; } synchronized (this) { if (waiting) { return; } waiting = true; } timerTask = DatabaseManager.getTimer().scheduleAfter(0, this); } public void stop() { HsqlTimer.cancel(timerTask); timerTask = null; waiting = false; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/RowDiskDataChange.java0000644000175000017500000001263312007547356023101 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.io.IOException; import org.hsqldb.persist.PersistentStore; import org.hsqldb.rowio.RowInputBinary; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputBinary; import org.hsqldb.rowio.RowOutputInterface; import org.hsqldb.types.ArrayType; import org.hsqldb.types.Type; /** * @author Fred Toussi (fredt@users dot sourceforge dot net) * @version 2.3.0 * @since 2.2.7 */ public class RowDiskDataChange extends RowAVLDisk { public final static int COL_POS_ROW_NUM = 0; public final static int COL_POS_ROW_ID = 1; public final static int COL_POS_TABLE_ID = 2; public final static int COL_POS_SCHEMA_NAME = 3; public final static int COL_POS_TABLE_NAME = 4; public final static int COL_POS_IS_UPDATE = 5; // final static Type[] arrayType = new Type[]{ new ArrayType(Type.SQL_INTEGER, Integer.MAX_VALUE) }; Table targetTable; Object[] updateData; int[] updateColMap; /** * Constructor for new Rows. Variable hasDataChanged is set to true in * order to indicate the data needs saving. * * @param t table * @param o row data */ public RowDiskDataChange(TableBase t, Object[] data, PersistentStore store, Table targetTable) { super(t, data, store); this.targetTable = targetTable; } /** * Constructor when read from the disk into the Cache. * * @param t table * @param in data source * @throws IOException */ public RowDiskDataChange(Session session, TableBase t, RowInputInterface in) throws IOException { super(t, in); targetTable = t.database.schemaManager.getTable(session, (String) rowData[COL_POS_TABLE_NAME], (String) rowData[COL_POS_SCHEMA_NAME]); if ((Boolean) rowData[COL_POS_IS_UPDATE]) { updateData = in.readData(targetTable.colTypes); RowInputBinary bin = (RowInputBinary) in; if (bin.readNull()) { updateColMap = null; } else { updateColMap = bin.readIntArray(); } } else { updateData = null; updateColMap = null; } } public void write(RowOutputInterface out) { writeNodes(out); if (hasDataChanged) { out.writeData(this, table.colTypes); if (updateData != null) { Type[] targetTypes = targetTable.colTypes; out.writeData(targetTypes.length, targetTypes, updateData, null, null); RowOutputBinary bout = (RowOutputBinary) out; if (updateColMap == null) { bout.writeNull(Type.SQL_ARRAY_ALL_TYPES); } else { bout.writeArray(updateColMap); } } out.writeEnd(); hasDataChanged = false; } } public Object[] getUpdateData() { return updateData; } public int[] getUpdateColumnMap() { return updateColMap; } public void setTargetTable(Table table) { targetTable = table; } public void setUpdateData(Object[] data) { updateData = data; } public void setUpdateColumnMap(int[] colMap) { updateColMap = colMap; } public int getRealSize(RowOutputInterface out) { RowOutputBinary bout = (RowOutputBinary) out; int size = out.getSize(this); if (updateData != null) { size += bout.getSize(updateData, targetTable.getColumnCount(), targetTable.getColumnTypes()); if (updateColMap != null) { size += bout.getSize(updateColMap); } } return size; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementTypes.java0000644000175000017500000003065012007547406022603 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; /* * Codes based on SQL Standards for different types of statement. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public interface StatementTypes { int ALLOCATE_CURSOR = 1; int ALLOCATE_DESCRIPTOR = 2; int ALTER_DOMAIN = 3; int ALTER_ROUTINE = 17; int ALTER_SEQUENCE = 134; int ALTER_TYPE = 60; int ALTER_TABLE = 4; int ALTER_TRANSFORM = 127; int CREATE_ASSERTION = 6; int CALL = 7; int CREATE_CHARACTER_SET = 8; int CLOSE_CURSOR = 9; int CREATE_COLLATION = 10; int COMMIT_WORK = 11; int CONNECT = 13; int DEALLOCATE_DESCRIPTOR = 15; int DEALLOCATE_PREPARE = 16; int DELETE_CURSOR = 18; int DELETE_WHERE = 19; int DESCRIBE = 20; int SELECT_DIRECT_SINGLE = 21; // identifier is SELECT int DISCONNECT = 22; int CREATE_DOMAIN = 23; int DROP_ASSERTION = 24; int DROP_CHARACTER_SET = 25; int DROP_COLLATION = 26; int DROP_TYPE = 35; int DROP_DOMAIN = 27; int DROP_ROLE = 29; int DROP_ROUTINE = 30; int DROP_SCHEMA = 31; int DROP_SEQUENCE = 135; int DROP_TABLE = 32; int DROP_TRANSFORM = 116; int DROP_TRANSLATION = 33; int DROP_TRIGGER = 34; int DROP_CAST = 78; int DROP_ORDERING = 115; int DROP_VIEW = 36; int DYNAMIC_CLOSE = 37; int DYNAMIC_DELETE_CURSOR = 38; int DYNAMIC_FETCH = 39; int DYNAMIC_OPEN = 40; int SELECT_CURSOR = 85; int SELECT_SINGLE_DYNAMIC = 41; // identifier is SELECT int DYNAMIC_UPDATE_CURSOR = 42; int EXECUTE_IMMEDIATE = 43; int EXECUTE = 44; int FETCH = 45; int FREE_LOCATOR = 98; int GET_DESCRIPTOR = 47; int HOLD_LOCATOR = 99; int GRANT = 48; int GRANT_ROLE = 49; int INSERT = 50; int MERGE = 128; int OPEN = 53; int PREPARABLE_DYNAMIC_DELETE_CURSOR = 54; int PREPARABLE_DYNAMIC_UPDATE_CURSOR = 55; int PREPARE = 56; int RELEASE_SAVEPOINT = 57; int RETURN = 58; int REVOKE = 59; int REVOKE_ROLE = 129; int CREATE_ROLE = 61; int ROLLBACK_WORK = 62; int SAVEPOINT = 63; int CREATE_SCHEMA = 64; int CREATE_ROUTINE = 14; int SELECT_SINGLE = 65; // identifier is SELECT int CREATE_SEQUENCE = 133; int SET_CATALOG = 66; int SET_CONNECTION = 67; int SET_CONSTRAINT = 68; int SET_DESCRIPTOR = 70; int SET_TIME_ZONE = 71; int SET_NAMES = 72; int SET_PATH = 69; int SET_ROLE = 73; int SET_SCHEMA = 74; int SET_SESSION_AUTHORIZATION = 76; int SET_SESSION_CHARACTERISTICS = 109; int SET_COLLATION = 136; int SET_TRANSFORM_GROUP = 118; int SET_TRANSACTION = 75; int START_TRANSACTION = 111; int CREATE_TABLE = 77; int CREATE_TRANSFORM = 117; int CREATE_TRANSLATION = 79; int CREATE_TRIGGER = 80; int UPDATE_CURSOR = 81; int UPDATE_WHERE = 82; int CREATE_CAST = 52; int CREATE_TYPE = 83; int CREATE_ORDERING = 114; int CREATE_VIEW = 84; int ASSIGNMENT = 5; // PSM int CASE = 86; int BEGIN_END = 12; int DROP_MODULE = 28; int FOR = 46; int IF = 88; int ITERATE = 102; int LEAVE = 89; int LOOP = 90; int RESIGNAL = 91; int REPEAT = 95; int SIGNAL = 92; int CREATE_MODULE = 51; int WHILE = 97; // int ALTER_FOREIGN_TABLE = 104; int ALTER_USER_MAPPING = 123; int DROP_FOREIGN_DATA_WRAPPER = 121; int DROP_SERVER = 110; int DROP_FOREIGN_TABLE = 105; int DROP_ROUTINE_MAPPING = 131; int DROP_USER_MAPPING = 124; int CREATE_FOREIGN_DATA_WRAPPER = 119; int CREATE_SERVER = 107; int CREATE_FOREIGN_TABLE = 103; int IMPORT_FOREIGN_SCHEMA = 125; int CREATE_ROUTINE_MAPPING = 132; int SET_PASSTHROUGH = 126; int CREATE_USER_MAPPING = 122; // hsqldb database int DATABASE_BACKUP = 1001; int DATABASE_CHECKPOINT = 1002; int DATABASE_SHUTDOWN = 1003; int DATABASE_SCRIPT = 1004; int ALTER_SESSION = 1005; // hsqldb database settings int SET_DATABASE_FILES_BACKUP_INCREMENT = 1011; int SET_DATABASE_FILES_CACHE_ROWS = 1012; int SET_DATABASE_FILES_CACHE_SIZE = 1013; int SET_DATABASE_FILES_DEFRAG = 1014; int SET_DATABASE_FILES_EVENT_LOG = 1015; int SET_DATABASE_FILES_LOBS_SCALE = 1016; int SET_DATABASE_FILES_UNUSED_TYPE_SETTING = 1017; int SET_DATABASE_FILES_LOG = 1018; int SET_DATABASE_FILES_LOG_SIZE = 1019; int SET_DATABASE_FILES_NIO = 1020; int SET_DATABASE_FILES_READ_ONLY = 1021; int SET_DATABASE_FILES_READ_ONLY_FILES = 1022; int SET_DATABASE_FILES_SCALE = 1023; int SET_DATABASE_FILES_SCRIPT_FORMAT = 1024; int SET_DATABASE_FILES_TEMP_PATH = 1025; int SET_DATABASE_FILES_WRITE_DELAY = 1026; int SET_DATABASE_DEFAULT_INITIAL_SCHEMA = 1031; int SET_DATABASE_DEFAULT_TABLE_TYPE = 1032; int SET_DATABASE_AUTHENTICATION = 1033; int SET_DATABASE_GC = 1034; int SET_DATABASE_PROPERTY = 1035; int SET_DATABASE_PASSWORD_CHECK = 1036; int SET_DATABASE_READ_ONLY = 1037; int SET_DATABASE_READ_ONLY_FILES = 1039; int SET_DATABASE_RESULT_MEMORY_ROWS = 1040; int SET_DATABASE_SQL_COLLATION = 1041; int SET_SESSION_SQL_IGNORECASE = 1042; int SET_DATABASE_SQL_REFERENTIAL_INTEGRITY = 1046; int SET_DATABASE_SQL = 1047; int SET_DATABASE_TEXT_SOURCE = 1048; int SET_DATABASE_TRANSACTION_CONTROL = 1049; int SET_DATABASE_DEFAULT_ISOLATION_LEVEL = 1050; int SET_DATABASE_TRANSACTION_CONFLICT = 1051; int SET_DATABASE_UNIQUE_NAME = 1052; // hsqldb user settings int SET_USER_LOCAL = 1060; int SET_USER_INITIAL_SCHEMA = 1061; int SET_USER_PASSWORD = 1062; // hsqldb session int TRANSACTION_LOCK_TABLE = 1063; int SET_SESSION_AUTOCOMMIT = 1064; int SET_SESSION_RESULT_MAX_ROWS = 1065; int SET_SESSION_RESULT_MEMORY_ROWS = 1066; int ROLLBACK_SAVEPOINT = 1067; int DECLARE_SESSION_TABLE = 1068; // hsqldb schema int ALTER_INDEX = 1069; int ALTER_VIEW = 1070; int COMMENT = 1071; int CREATE_ALIAS = 1072; int CREATE_INDEX = 1073; int CREATE_USER = 1074; int DECLARE_VARIABLE = 1075; int DROP_COLUMN = 1076; int DROP_INDEX = 1077; int DROP_CONSTRAINT = 1078; int DROP_USER = 1079; int DROP_DEFAULT = 1080; int ADD_COLUMN = 1081; int ADD_CONSTRAINT = 1082; int ADD_DEFAULT = 1083; int ALTER_COLUMN_TYPE = 1084; int ALTER_COLUMN_SEQUENCE = 1085; int ALTER_COLUMN_NULL = 1086; int ALTER_COLUMN_DEFAULT = 1087; int ALTER_COLUMN_DROP_DEFAULT = 1088; int ALTER_COLUMN_DROP_GENERATED = 1089; int ALTER_COLUMN_TYPE_IDENTITY = 1090; // int EXPLAIN_PLAN = 1191; int RENAME_OBJECT = 1192; int SET_TABLE_INDEX = 1193; int SET_TABLE_READONLY = 1194; int SET_TABLE_SOURCE = 1195; int SET_TABLE_SOURCE_HEADER = 1196; int SET_TABLE_TYPE = 1197; int SET_TABLE_CLUSTERED = 1198; int LOG_SCHEMA_STATEMENT = 1199; // hsqldb sql implementation int CONDITION = 1201; // element of IF int HANDLER = 1202; int DDL = 1203; int CHECK = 1204; int TRUNCATE = 1205; // hsqldb groups int X_SQL_SCHEMA_DEFINITION = 2001; int X_SQL_SCHEMA_MANIPULATION = 2002; int X_SQL_DATA = 2003; int X_SQL_DATA_CHANGE = 2004; int X_SQL_TRANSACTION = 2005; int X_SQL_CONNECTION = 2006; int X_SQL_CONTROL = 2007; int X_SQL_SESSION = 2008; int X_SQL_DIAGNOSTICS = 2009; int X_SQL_DYNAMIC = 2010; int X_HSQLDB_SESSION = 2011; int X_HSQLDB_SCHEMA_MANIPULATION = 2012; int X_HSQLDB_SETTING = 2013; int X_HSQLDB_DATABASE_OPERATION = 2014; int X_HSQLDB_TRANSACTION = 2015; int X_DYNAMIC = 2016; // Expected types of Result returned for an SQL statement int RETURN_ANY = 0; int RETURN_COUNT = 1; int RETURN_RESULT = 2; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TransactionManagerMV2PL.java0000644000175000017500000003537712007547376024174 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HsqlDeque; import org.hsqldb.lib.LongDeque; import org.hsqldb.lib.LongKeyHashMap; import org.hsqldb.persist.CachedObject; import org.hsqldb.persist.PersistentStore; /** * Manages rows involved in transactions * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 2.0.0 */ public class TransactionManagerMV2PL extends TransactionManagerCommon implements TransactionManager { // functional unit - merged committed transactions HsqlDeque committedTransactions = new HsqlDeque(); LongDeque committedTransactionTimestamps = new LongDeque(); public TransactionManagerMV2PL(Database db) { database = db; lobSession = database.sessionManager.getSysLobSession(); rowActionMap = new LongKeyHashMap(10000); txModel = MVLOCKS; catalogNameList = new HsqlName[]{ database.getCatalogName() }; } public long getGlobalChangeTimestamp() { return globalChangeTimestamp.get(); } public boolean isMVRows() { return true; } public boolean isMVCC() { return false; } public int getTransactionControl() { return MVLOCKS; } public void setTransactionControl(Session session, int mode) { super.setTransactionControl(session, mode); } public void completeActions(Session session) { endActionTPL(session); } public boolean prepareCommitActions(Session session) { Object[] list = session.rowActionList.getArray(); int limit = session.rowActionList.size(); writeLock.lock(); try { session.actionTimestamp = nextChangeTimestamp(); for (int i = 0; i < limit; i++) { RowAction action = (RowAction) list[i]; action.prepareCommit(session); } return true; } finally { writeLock.unlock(); } } public boolean commitTransaction(Session session) { if (session.abortTransaction) { return false; } int limit = session.rowActionList.size(); Object[] list = session.rowActionList.getArray(); writeLock.lock(); try { // new actionTimestamp used for commitTimestamp session.actionTimestamp = nextChangeTimestamp(); session.transactionEndTimestamp = session.actionTimestamp; endTransaction(session); for (int i = 0; i < limit; i++) { RowAction action = (RowAction) list[i]; action.commit(session); } persistCommit(session, list, limit); int newLimit = session.rowActionList.size(); if (newLimit > limit) { list = session.rowActionList.getArray(); mergeTransaction(session, list, limit, newLimit, session.actionTimestamp); finaliseRows(session, list, limit, newLimit, true); session.rowActionList.setSize(limit); } // session.actionTimestamp is the committed tx timestamp if (getFirstLiveTransactionTimestamp() > session.actionTimestamp || session == lobSession) { mergeTransaction(session, list, 0, limit, session.actionTimestamp); finaliseRows(session, list, 0, limit, true); } else { list = session.rowActionList.toArray(); addToCommittedQueue(session, list); } endTransactionTPL(session); } finally { writeLock.unlock(); } session.tempSet.clear(); return true; } public void rollback(Session session) { writeLock.lock(); try { session.abortTransaction = false; session.actionTimestamp = nextChangeTimestamp(); session.transactionEndTimestamp = session.actionTimestamp; rollbackPartial(session, 0, session.transactionTimestamp); endTransaction(session); endTransactionTPL(session); } finally { writeLock.unlock(); } } public void rollbackSavepoint(Session session, int index) { long timestamp = session.sessionContext.savepointTimestamps.get(index); Integer oi = (Integer) session.sessionContext.savepoints.get(index); int start = oi.intValue(); while (session.sessionContext.savepoints.size() > index + 1) { session.sessionContext.savepoints.remove( session.sessionContext.savepoints.size() - 1); session.sessionContext.savepointTimestamps.removeLast(); } rollbackPartial(session, start, timestamp); } public void rollbackAction(Session session) { rollbackPartial(session, session.actionIndex, session.actionTimestamp); endActionTPL(session); } /** * rollback the row actions from start index in list and * the given timestamp */ void rollbackPartial(Session session, int start, long timestamp) { Object[] list = session.rowActionList.getArray(); int limit = session.rowActionList.size(); if (start == limit) { return; } for (int i = start; i < limit; i++) { RowAction action = (RowAction) list[i]; if (action == null) { /* System.out.println("null insert action " + session + " " + session.actionTimestamp); */ throw Error.runtimeError(ErrorCode.GENERAL_ERROR, "null rollback action "); } action.rollback(session, timestamp); } // rolled back transactions can always be merged as they have never been // seen by other sessions mergeRolledBackTransaction(session, timestamp, list, start, limit); finaliseRows(session, list, start, limit, false); session.rowActionList.setSize(start); } public RowAction addDeleteAction(Session session, Table table, Row row, int[] colMap) { RowAction action; boolean newAction; synchronized (row) { newAction = row.rowAction == null; action = RowAction.addDeleteAction(session, table, row, colMap); } session.rowActionList.add(action); if (newAction && table.tableType == TableBase.CACHED_TABLE) { rowActionMap.put(action.getPos(), action); } return action; } public void addInsertAction(Session session, Table table, PersistentStore store, Row row, int[] changedColumns) { RowAction action = row.rowAction; if (action == null) { /* System.out.println("null insert action " + session + " " + session.actionTimestamp); */ throw Error.runtimeError(ErrorCode.GENERAL_ERROR, "null insert action "); } if (table.tableType == TableBase.CACHED_TABLE) { rowActionMap.put(action.getPos(), action); } store.indexRow(session, row); session.rowActionList.add(action); } // functional unit - accessibility of rows public boolean canRead(Session session, Row row, int mode, int[] colMap) { RowAction action = row.rowAction; if (action == null) { return true; } return action.canRead(session, TransactionManager.ACTION_READ); } public boolean canRead(Session session, long id, int mode) { RowAction action = (RowAction) rowActionMap.get(id); return action == null ? true : action.canRead(session, TransactionManager.ACTION_READ); } /** * add transaction info to a row just loaded from the cache. called only * for CACHED tables */ public void setTransactionInfo(CachedObject object) { if (object.isMemory()) { return; } Row row = (Row) object; RowAction rowact = (RowAction) rowActionMap.get(row.position); row.rowAction = rowact; } /** * remove the transaction info */ public void removeTransactionInfo(CachedObject object) { if (object.isMemory()) { return; } rowActionMap.remove(object.getPos()); } /** * add a list of actions to the end of queue */ void addToCommittedQueue(Session session, Object[] list) { synchronized (committedTransactionTimestamps) { // add the txList according to commit timestamp committedTransactions.addLast(list); // get session commit timestamp committedTransactionTimestamps.addLast(session.actionTimestamp); /* debug 190 if (committedTransactions.size() > 64) { System.out.println("******* excessive transaction queue"); } // debug 190 */ } } /** * expire all committed transactions that are no longer in scope */ void mergeExpiredTransactions(Session session) { long timestamp = getFirstLiveTransactionTimestamp(); while (true) { long commitTimestamp = 0; Object[] actions = null; synchronized (committedTransactionTimestamps) { if (committedTransactionTimestamps.isEmpty()) { break; } commitTimestamp = committedTransactionTimestamps.getFirst(); if (commitTimestamp < timestamp) { committedTransactionTimestamps.removeFirst(); actions = (Object[]) committedTransactions.removeFirst(); } else { break; } } mergeTransaction(session, actions, 0, actions.length, commitTimestamp); finaliseRows(session, actions, 0, actions.length, true); } } public void beginTransaction(Session session) { writeLock.lock(); try { if (!session.isTransaction) { session.actionTimestamp = nextChangeTimestamp(); session.transactionTimestamp = session.actionTimestamp; session.isTransaction = true; transactionCount++; liveTransactionTimestamps.addLast( session.transactionTimestamp); } } finally { writeLock.unlock(); } } /** * add session to the end of queue when a transaction starts * (depending on isolation mode) */ public void beginAction(Session session, Statement cs) { if (session.hasLocks(cs)) { return; } writeLock.lock(); try { if (cs.getCompileTimestamp() < database.schemaManager.getSchemaChangeTimestamp()) { cs = session.statementManager.getStatement(session, cs); session.sessionContext.currentStatement = cs; if (cs == null) { return; } } boolean canProceed = setWaitedSessionsTPL(session, cs); if (canProceed) { if (session.tempSet.isEmpty()) { lockTablesTPL(session, cs); // we don't set other sessions that would now be waiting for this one too } else { setWaitingSessionTPL(session); } } else { session.abortTransaction = true; } } finally { writeLock.unlock(); } } /** * add session to the end of queue when a transaction starts * (depending on isolation mode) */ public void beginActionResume(Session session) { writeLock.lock(); try { session.actionTimestamp = nextChangeTimestamp(); if (!session.isTransaction) { session.transactionTimestamp = session.actionTimestamp; session.isTransaction = true; liveTransactionTimestamps.addLast(session.actionTimestamp); transactionCount++; } } finally { writeLock.unlock(); } } /** * remove session from queue when a transaction ends * and expire any committed transactions * that are no longer required. remove transactions ended before the first * timestamp in liveTransactionsSession queue */ void endTransaction(Session session) { long timestamp = session.transactionTimestamp; session.isTransaction = false; int index = liveTransactionTimestamps.indexOf(timestamp); if (index >= 0) { transactionCount--; liveTransactionTimestamps.remove(index); mergeExpiredTransactions(session); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/SchemaManager.java0000644000175000017500000024362212007547406022312 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.MultiValueHashMap; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.StringConverter; import org.hsqldb.lib.WrapperIterator; import org.hsqldb.navigator.RowIterator; import org.hsqldb.rights.Grantee; import org.hsqldb.types.Collation; import org.hsqldb.types.Type; /** * Manages all SCHEMA related database objects * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.8.0 */ public class SchemaManager { Database database; HsqlName defaultSchemaHsqlName; HashMappedList schemaMap = new HashMappedList(); MultiValueHashMap referenceMap = new MultiValueHashMap(); int defaultTableType = TableBase.MEMORY_TABLE; long schemaChangeTimestamp; HsqlName[] catalogNameArray; // ReadWriteLock lock = new ReentrantReadWriteLock(); Lock readLock = lock.readLock(); Lock writeLock = lock.writeLock(); // Table dualTable; public Table dataChangeTable; public SchemaManager(Database database) { this.database = database; defaultSchemaHsqlName = SqlInvariants.INFORMATION_SCHEMA_HSQLNAME; catalogNameArray = new HsqlName[]{ database.getCatalogName() }; Schema schema = new Schema(SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, SqlInvariants.INFORMATION_SCHEMA_HSQLNAME.owner); schemaMap.put(schema.getName().name, schema); try { schema.typeLookup.add(TypeInvariants.CARDINAL_NUMBER); schema.typeLookup.add(TypeInvariants.YES_OR_NO); schema.typeLookup.add(TypeInvariants.CHARACTER_DATA); schema.typeLookup.add(TypeInvariants.SQL_IDENTIFIER); schema.typeLookup.add(TypeInvariants.TIME_STAMP); schema.charsetLookup.add(TypeInvariants.SQL_TEXT); schema.charsetLookup.add(TypeInvariants.SQL_IDENTIFIER_CHARSET); schema.charsetLookup.add(TypeInvariants.SQL_CHARACTER); schema.collationLookup.add(Collation.getDefaultInstance()); } catch (HsqlException e) {} } public void setSchemaChangeTimestamp() { schemaChangeTimestamp = database.txManager.getGlobalChangeTimestamp(); } public long getSchemaChangeTimestamp() { return schemaChangeTimestamp; } // pre-defined public HsqlName getSQLJSchemaHsqlName() { return SqlInvariants.SQLJ_SCHEMA_HSQLNAME; } // SCHEMA management public void createPublicSchema() { writeLock.lock(); try { HsqlName name = database.nameManager.newHsqlName(null, SqlInvariants.PUBLIC_SCHEMA, SchemaObject.SCHEMA); Schema schema = new Schema(name, database.getGranteeManager().getDBARole()); defaultSchemaHsqlName = schema.getName(); schemaMap.put(schema.getName().name, schema); } finally { writeLock.unlock(); } } /** * Creates a schema belonging to the given grantee. */ public void createSchema(HsqlName name, Grantee owner) { writeLock.lock(); try { SqlInvariants.checkSchemaNameNotSystem(name.name); Schema schema = new Schema(name, owner); schemaMap.add(name.name, schema); } finally { writeLock.unlock(); } } public void dropSchema(Session session, String name, boolean cascade) { writeLock.lock(); try { Schema schema = (Schema) schemaMap.get(name); if (schema == null) { throw Error.error(ErrorCode.X_42501, name); } if (SqlInvariants.isLobsSchemaName(name)) { throw Error.error(ErrorCode.X_42503, name); } if (!cascade && !schema.isEmpty()) { throw Error.error(ErrorCode.X_2B000); } OrderedHashSet externalReferences = new OrderedHashSet(); getCascadingReferencesToSchema(schema.getName(), externalReferences); removeSchemaObjects(externalReferences); Iterator tableIterator = schema.schemaObjectIterator(SchemaObject.TABLE); while (tableIterator.hasNext()) { Table table = ((Table) tableIterator.next()); Constraint[] list = table.getFKConstraints(); for (int i = 0; i < list.length; i++) { Constraint constraint = list[i]; if (constraint.getMain().getSchemaName() != schema.getName()) { constraint.getMain().removeConstraint( constraint.getMainName().name); removeReferencesFrom(constraint); } } removeTable(session, table); } Iterator sequenceIterator = schema.schemaObjectIterator(SchemaObject.SEQUENCE); while (sequenceIterator.hasNext()) { NumberSequence sequence = ((NumberSequence) sequenceIterator.next()); database.getGranteeManager().removeDbObject( sequence.getName()); } schema.release(); schemaMap.remove(name); if (defaultSchemaHsqlName.name.equals(name)) { HsqlName hsqlName = database.nameManager.newHsqlName(name, false, SchemaObject.SCHEMA); schema = new Schema(hsqlName, database.getGranteeManager().getDBARole()); defaultSchemaHsqlName = schema.getName(); schemaMap.put(schema.getName().name, schema); } // these are called last and in this particular order database.getUserManager().removeSchemaReference(name); database.getSessionManager().removeSchemaReference(schema); } finally { writeLock.unlock(); } } public void renameSchema(HsqlName name, HsqlName newName) { writeLock.lock(); try { Schema schema = (Schema) schemaMap.get(name.name); Schema exists = (Schema) schemaMap.get(newName.name); if (schema == null) { throw Error.error(ErrorCode.X_42501, name.name); } if (exists != null) { throw Error.error(ErrorCode.X_42504, newName.name); } SqlInvariants.checkSchemaNameNotSystem(name.name); SqlInvariants.checkSchemaNameNotSystem(newName.name); int index = schemaMap.getIndex(name.name); schema.getName().rename(newName); schemaMap.set(index, newName.name, schema); } finally { writeLock.unlock(); } } public void release() { writeLock.lock(); try { Iterator it = schemaMap.values().iterator(); while (it.hasNext()) { Schema schema = (Schema) it.next(); schema.release(); } } finally { writeLock.unlock(); } } public String[] getSchemaNamesArray() { readLock.lock(); try { String[] array = new String[schemaMap.size()]; schemaMap.toKeysArray(array); return array; } finally { readLock.unlock(); } } public Schema[] getAllSchemas() { readLock.lock(); try { Schema[] objects = new Schema[schemaMap.size()]; schemaMap.toValuesArray(objects); return objects; } finally { readLock.unlock(); } } public HsqlName getUserSchemaHsqlName(String name) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(name); if (schema == null) { throw Error.error(ErrorCode.X_3F000, name); } if (schema.getName() == SqlInvariants.INFORMATION_SCHEMA_HSQLNAME) { throw Error.error(ErrorCode.X_3F000, name); } return schema.getName(); } finally { readLock.unlock(); } } public Grantee toSchemaOwner(String name) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(name); return schema == null ? null : schema.getOwner(); } finally { readLock.unlock(); } } public HsqlName getDefaultSchemaHsqlName() { return defaultSchemaHsqlName; } public void setDefaultSchemaHsqlName(HsqlName name) { defaultSchemaHsqlName = name; } public boolean schemaExists(String name) { readLock.lock(); try { return schemaMap.containsKey(name); } finally { readLock.unlock(); } } public HsqlName findSchemaHsqlName(String name) { readLock.lock(); try { Schema schema = ((Schema) schemaMap.get(name)); if (schema == null) { return null; } return schema.getName(); } finally { readLock.unlock(); } } /** * If schemaName is null, return the default schema name, else return * the HsqlName object for the schema. If schemaName does not exist, * throw. */ public HsqlName getSchemaHsqlName(String name) { if (name == null) { return defaultSchemaHsqlName; } readLock.lock(); try { Schema schema = ((Schema) schemaMap.get(name)); if (schema == null) { throw Error.error(ErrorCode.X_3F000, name); } return schema.getName(); } finally { readLock.unlock(); } } /** * Same as above, but return string */ public String getSchemaName(String name) { return getSchemaHsqlName(name).name; } public Schema findSchema(String name) { readLock.lock(); try { return ((Schema) schemaMap.get(name)); } finally { readLock.unlock(); } } /** * drop all schemas with the given authorisation */ public void dropSchemas(Session session, Grantee grantee, boolean cascade) { writeLock.lock(); try { HsqlArrayList list = getSchemas(grantee); Iterator it = list.iterator(); while (it.hasNext()) { Schema schema = (Schema) it.next(); dropSchema(session, schema.getName().name, cascade); } } finally { writeLock.unlock(); } } public HsqlArrayList getSchemas(Grantee grantee) { readLock.lock(); try { HsqlArrayList list = new HsqlArrayList(); Iterator it = schemaMap.values().iterator(); while (it.hasNext()) { Schema schema = (Schema) it.next(); if (grantee.equals(schema.getOwner())) { list.add(schema); } } return list; } finally { readLock.unlock(); } } public boolean hasSchemas(Grantee grantee) { readLock.lock(); try { Iterator it = schemaMap.values().iterator(); while (it.hasNext()) { Schema schema = (Schema) it.next(); if (grantee.equals(schema.getOwner())) { return true; } } return false; } finally { readLock.unlock(); } } /** * Returns an HsqlArrayList containing references to all non-system * tables and views. This includes all tables and views registered with * this Database. */ public HsqlArrayList getAllTables(boolean withLobTables) { readLock.lock(); try { HsqlArrayList alltables = new HsqlArrayList(); String[] schemas = getSchemaNamesArray(); for (int i = 0; i < schemas.length; i++) { String name = schemas[i]; if (!withLobTables && SqlInvariants.isLobsSchemaName(name)) { continue; } if (SqlInvariants.isSystemSchemaName(name)) { continue; } HashMappedList current = getTables(name); alltables.addAll(current.values()); } return alltables; } finally { readLock.unlock(); } } public HashMappedList getTables(String schema) { readLock.lock(); try { Schema temp = (Schema) schemaMap.get(schema); return temp.tableList; } finally { readLock.unlock(); } } public HsqlName[] getCatalogNameArray() { return catalogNameArray; } public HsqlName[] getCatalogAndBaseTableNames() { readLock.lock(); try { OrderedHashSet names = new OrderedHashSet(); HsqlArrayList tables = getAllTables(false); for (int i = 0; i < tables.size(); i++) { Table table = (Table) tables.get(i); if (!table.isTemp()) { names.add(table.getName()); } } names.add(database.getCatalogName()); HsqlName[] array = new HsqlName[names.size()]; names.toArray(array); return array; } finally { readLock.unlock(); } } public HsqlName[] getCatalogAndBaseTableNames(HsqlName name) { readLock.lock(); if (name == null) { return catalogNameArray; } try { switch (name.type) { case SchemaObject.SCHEMA : { if (findSchemaHsqlName(name.name) == null) { return catalogNameArray; } OrderedHashSet names = new OrderedHashSet(); names.add(database.getCatalogName()); HashMappedList list = getTables(name.name); for (int i = 0; i < list.size(); i++) { names.add(((SchemaObject) list.get(i)).getName()); } HsqlName[] array = new HsqlName[names.size()]; names.toArray(array); return array; } case SchemaObject.GRANTEE : { return catalogNameArray; } case SchemaObject.INDEX : case SchemaObject.CONSTRAINT : findSchemaObject(name.name, name.schema.name, name.type); } SchemaObject object = findSchemaObject(name.name, name.schema.name, name.type); if (object == null) { return catalogNameArray; } HsqlName parent = object.getName().parent; OrderedHashSet references = getReferencesTo(object.getName()); OrderedHashSet names = new OrderedHashSet(); names.add(database.getCatalogName()); if (parent != null) { SchemaObject parentObject = findSchemaObject(parent.name, parent.schema.name, parent.type); if (parentObject != null && parentObject.getName().type == SchemaObject.TABLE) { names.add(parentObject.getName()); } } if (object.getName().type == SchemaObject.TABLE) { names.add(object.getName()); } for (int i = 0; i < references.size(); i++) { HsqlName reference = (HsqlName) references.get(i); if (reference.type == SchemaObject.TABLE) { Table table = findUserTable(null, reference.name, reference.schema.name); if (table != null && !table.isTemp()) { names.add(reference); } } } HsqlName[] array = new HsqlName[names.size()]; names.toArray(array); return array; } finally { readLock.unlock(); } } private SchemaObjectSet getSchemaObjectSet(Schema schema, int type) { readLock.lock(); try { SchemaObjectSet set = null; switch (type) { case SchemaObject.SEQUENCE : set = schema.sequenceLookup; break; case SchemaObject.TABLE : case SchemaObject.VIEW : set = schema.tableLookup; break; case SchemaObject.CHARSET : set = schema.charsetLookup; break; case SchemaObject.COLLATION : set = schema.collationLookup; break; case SchemaObject.PROCEDURE : set = schema.procedureLookup; break; case SchemaObject.FUNCTION : set = schema.functionLookup; break; case SchemaObject.DOMAIN : case SchemaObject.TYPE : set = schema.typeLookup; break; case SchemaObject.INDEX : set = schema.indexLookup; break; case SchemaObject.CONSTRAINT : set = schema.constraintLookup; break; case SchemaObject.TRIGGER : set = schema.triggerLookup; break; case SchemaObject.SPECIFIC_ROUTINE : set = schema.specificRoutineLookup; } return set; } finally { readLock.unlock(); } } public void checkSchemaObjectNotExists(HsqlName name) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(name.schema.name); SchemaObjectSet set = getSchemaObjectSet(schema, name.type); set.checkAdd(name); } finally { readLock.unlock(); } } /** * Returns the specified user-defined table or view visible within the * context of the specified Session, or any system table of the given * name. It excludes any temp tables created in other Sessions. * Throws if the table does not exist in the context. */ public Table getTable(Session session, String name, String schema) { readLock.lock(); try { Table t = null; if (Tokens.T_MODULE.equals(schema) || Tokens.T_SESSION.equals(schema)) { t = findSessionTable(session, name); if (t == null) { throw Error.error(ErrorCode.X_42501, name); } return t; } if (schema == null) { if (session.database.sqlSyntaxOra || session.database.sqlSyntaxDb2) { if (Tokens.T_DUAL.equals(name)) { return dualTable; } } t = findSessionTable(session, name); } if (t == null) { schema = session.getSchemaName(schema); t = findUserTable(session, name, schema); } if (t == null) { if (SqlInvariants.INFORMATION_SCHEMA.equals(schema) && database.dbInfo != null) { t = database.dbInfo.getSystemTable(session, name); } } if (t == null) { throw Error.error(ErrorCode.X_42501, name); } return t; } finally { readLock.unlock(); } } public Table getUserTable(Session session, HsqlName name) { return getUserTable(session, name.name, name.schema.name); } /** * Returns the specified user-defined table or view visible within the * context of the specified Session. It excludes system tables and * any temp tables created in different Sessions. * Throws if the table does not exist in the context. */ public Table getUserTable(Session session, String name, String schema) { Table t = findUserTable(session, name, schema); if (t == null) { String longName = schema == null ? name : schema + '.' + name; throw Error.error(ErrorCode.X_42501, longName); } return t; } /** * Returns the specified user-defined table or view visible within the * context of the specified schema. It excludes system tables. * Returns null if the table does not exist in the context. */ public Table findUserTable(Session session, String name, String schemaName) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(schemaName); if (schema == null) { return null; } int i = schema.tableList.getIndex(name); if (i == -1) { return null; } return (Table) schema.tableList.get(i); } finally { readLock.unlock(); } } /** * Returns the specified session context table. * Returns null if the table does not exist in the context. */ public Table findSessionTable(Session session, String name) { return session.sessionContext.findSessionTable(name); } /** * Drops the specified user-defined view or table from this Database object. * *

The process of dropping a table or view includes: *

    *
  1. checking that the specified Session's currently connected User has * the right to perform this operation and refusing to proceed if not by * throwing. *
  2. checking for referential constraints that conflict with this * operation and refusing to proceed if they exist by throwing.
  3. *
  4. removing the specified Table from this Database object. *
  5. removing any exported foreign keys Constraint objects held by any * tables referenced by the table to be dropped. This is especially * important so that the dropped Table ceases to be referenced, eventually * allowing its full garbage collection. *
  6. *
* *

* * @param session the connected context in which to perform this operation * @param table if true and if the Table to drop does not exist, fail * silently, else throw * @param cascade true if the name argument refers to a View */ public void dropTableOrView(Session session, Table table, boolean cascade) { writeLock.lock(); try { if (table.isView()) { dropView(table, cascade); } else { dropTable(session, table, cascade); } } finally { writeLock.unlock(); } } private void dropView(Table table, boolean cascade) { Schema schema = (Schema) schemaMap.get(table.getSchemaName().name); removeSchemaObject(table.getName(), cascade); schema.triggerLookup.removeParent(table.getName()); } private void dropTable(Session session, Table table, boolean cascade) { Schema schema = (Schema) schemaMap.get(table.getSchemaName().name); int dropIndex = schema.tableList.getIndex(table.getName().name); OrderedHashSet externalConstraints = table.getDependentExternalConstraints(); OrderedHashSet externalReferences = new OrderedHashSet(); getCascadingReferencesTo(table.getName(), externalReferences); if (!cascade) { for (int i = 0; i < externalConstraints.size(); i++) { Constraint c = (Constraint) externalConstraints.get(i); HsqlName refname = c.getRefName(); if (c.getConstraintType() == SchemaObject.ConstraintTypes.MAIN) { throw Error.error( ErrorCode.X_42533, refname.getSchemaQualifiedStatementName()); } } if (!externalReferences.isEmpty()) { int i = 0; for (; i < externalReferences.size(); i++) { HsqlName name = (HsqlName) externalReferences.get(i); if (name.parent == table.getName()) { continue; } throw Error.error(ErrorCode.X_42502, name.getSchemaQualifiedStatementName()); } } } OrderedHashSet tableSet = new OrderedHashSet(); OrderedHashSet constraintNameSet = new OrderedHashSet(); OrderedHashSet indexNameSet = new OrderedHashSet(); for (int i = 0; i < externalConstraints.size(); i++) { Constraint c = (Constraint) externalConstraints.get(i); Table t = c.getMain(); if (t != table) { tableSet.add(t); } t = c.getRef(); if (t != table) { tableSet.add(t); } constraintNameSet.add(c.getMainName()); constraintNameSet.add(c.getRefName()); indexNameSet.add(c.getRefIndex().getName()); } OrderedHashSet uniqueConstraintNames = table.getUniquePKConstraintNames(); TableWorks tw = new TableWorks(session, table); tableSet = tw.makeNewTables(tableSet, constraintNameSet, indexNameSet); tw.setNewTablesInSchema(tableSet); tw.updateConstraints(tableSet, constraintNameSet); removeSchemaObjects(externalReferences); removeTableDependentReferences(table); // removeReferencesTo(uniqueConstraintNames); removeReferencesTo(table.getName()); removeReferencesFrom(table); schema.tableList.remove(dropIndex); schema.indexLookup.removeParent(table.getName()); schema.constraintLookup.removeParent(table.getName()); schema.triggerLookup.removeParent(table.getName()); removeTable(session, table); recompileDependentObjects(tableSet); } private void removeTable(Session session, Table table) { database.getGranteeManager().removeDbObject(table.getName()); table.releaseTriggers(); if (table.hasLobColumn()) { RowIterator it = table.rowIterator(session); while (it.hasNext()) { Row row = it.getNextRow(); Object[] data = row.getData(); session.sessionData.adjustLobUsageCount(table, data, -1); } } database.persistentStoreCollection.releaseStore(table); } public void setTable(int index, Table table) { writeLock.lock(); try { Schema schema = (Schema) schemaMap.get(table.getSchemaName().name); schema.tableList.set(index, table.getName().name, table); } finally { writeLock.unlock(); } } /** * Returns index of a table or view in the HashMappedList that * contains the table objects for this Database. * * @param table the Table object * @return the index of the specified table or view, or -1 if not found */ public int getTableIndex(Table table) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(table.getSchemaName().name); if (schema == null) { return -1; } HsqlName name = table.getName(); return schema.tableList.getIndex(name.name); } finally { readLock.unlock(); } } public void recompileDependentObjects(OrderedHashSet tableSet) { writeLock.lock(); try { OrderedHashSet set = new OrderedHashSet(); for (int i = 0; i < tableSet.size(); i++) { Table table = (Table) tableSet.get(i); set.addAll(getReferencesTo(table.getName())); } Session session = database.sessionManager.getSysSession(); for (int i = 0; i < set.size(); i++) { HsqlName name = (HsqlName) set.get(i); switch (name.type) { case SchemaObject.VIEW : case SchemaObject.CONSTRAINT : case SchemaObject.ASSERTION : case SchemaObject.ROUTINE : case SchemaObject.PROCEDURE : case SchemaObject.FUNCTION : case SchemaObject.SPECIFIC_ROUTINE : SchemaObject object = getSchemaObject(name); object.compile(session, null); break; } } if (Error.TRACE) { HsqlArrayList list = getAllTables(false); for (int i = 0; i < list.size(); i++) { Table t = (Table) list.get(i); t.verifyConstraintsIntegrity(); } } } finally { writeLock.unlock(); } } /** * After addition or removal of columns and indexes all views that * reference the table should be recompiled. */ public void recompileDependentObjects(Table table) { writeLock.lock(); try { OrderedHashSet set = new OrderedHashSet(); getCascadingReferencesTo(table.getName(), set); Session session = database.sessionManager.getSysSession(); for (int i = 0; i < set.size(); i++) { HsqlName name = (HsqlName) set.get(i); switch (name.type) { case SchemaObject.VIEW : case SchemaObject.CONSTRAINT : case SchemaObject.ASSERTION : case SchemaObject.ROUTINE : case SchemaObject.PROCEDURE : case SchemaObject.FUNCTION : case SchemaObject.SPECIFIC_ROUTINE : SchemaObject object = getSchemaObject(name); object.compile(session, null); break; } } if (Error.TRACE) { HsqlArrayList list = getAllTables(false); for (int i = 0; i < list.size(); i++) { Table t = (Table) list.get(i); t.verifyConstraintsIntegrity(); } } } finally { writeLock.unlock(); } } public NumberSequence getSequence(String name, String schemaName, boolean raise) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(schemaName); if (schema != null) { NumberSequence object = (NumberSequence) schema.sequenceList.get(name); if (object != null) { return object; } } if (raise) { throw Error.error(ErrorCode.X_42501, name); } return null; } finally { readLock.unlock(); } } public Type getUserDefinedType(String name, String schemaName, boolean raise) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(schemaName); if (schema != null) { SchemaObject object = schema.typeLookup.getObject(name); if (object != null) { return (Type) object; } } if (raise) { throw Error.error(ErrorCode.X_42501, name); } return null; } finally { readLock.unlock(); } } public Type getDomainOrUDT(String name, String schemaName, boolean raise) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(schemaName); if (schema != null) { SchemaObject object = schema.typeLookup.getObject(name); if (object != null) { return (Type) object; } } if (raise) { throw Error.error(ErrorCode.X_42501, name); } return null; } finally { readLock.unlock(); } } public Type getDomain(String name, String schemaName, boolean raise) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(schemaName); if (schema != null) { SchemaObject object = schema.typeLookup.getObject(name); if (object != null && ((Type) object).isDomainType()) { return (Type) object; } } if (raise) { throw Error.error(ErrorCode.X_42501, name); } return null; } finally { readLock.unlock(); } } public Type getDistinctType(String name, String schemaName, boolean raise) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(schemaName); if (schema != null) { SchemaObject object = schema.typeLookup.getObject(name); if (object != null && ((Type) object).isDistinctType()) { return (Type) object; } } if (raise) { throw Error.error(ErrorCode.X_42501, name); } return null; } finally { readLock.unlock(); } } public SchemaObject getSchemaObject(String name, String schemaName, int type) { readLock.lock(); try { SchemaObject object = findSchemaObject(name, schemaName, type); if (object == null) { throw Error.error(SchemaObjectSet.getGetErrorCode(type), name); } return object; } finally { readLock.unlock(); } } public SchemaObject findSchemaObject(String name, String schemaName, int type) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(schemaName); if (schema == null) { return null; } SchemaObjectSet set = null; HsqlName objectName; Table table; switch (type) { case SchemaObject.SEQUENCE : return schema.sequenceLookup.getObject(name); case SchemaObject.TABLE : case SchemaObject.VIEW : return schema.tableLookup.getObject(name); case SchemaObject.CHARSET : if (name.equals("SQL_IDENTIFIER")) { return TypeInvariants.SQL_IDENTIFIER_CHARSET; } if (name.equals("SQL_TEXT")) { return TypeInvariants.SQL_TEXT; } if (name.equals("LATIN1")) { return TypeInvariants.LATIN1; } if (name.equals("ASCII_GRAPHIC")) { return TypeInvariants.ASCII_GRAPHIC; } return schema.charsetLookup.getObject(name); case SchemaObject.COLLATION : return schema.collationLookup.getObject(name); case SchemaObject.PROCEDURE : return schema.procedureLookup.getObject(name); case SchemaObject.FUNCTION : return schema.functionLookup.getObject(name); case SchemaObject.ROUTINE : { SchemaObject object = schema.procedureLookup.getObject(name); if (object == null) { object = schema.functionLookup.getObject(name); } return object; } case SchemaObject.SPECIFIC_ROUTINE : return schema.specificRoutineLookup.getObject(name); case SchemaObject.DOMAIN : case SchemaObject.TYPE : return schema.typeLookup.getObject(name); case SchemaObject.INDEX : set = schema.indexLookup; objectName = set.getName(name); if (objectName == null) { return null; } table = (Table) schema.tableList.get(objectName.parent.name); return table.getIndex(name); case SchemaObject.CONSTRAINT : set = schema.constraintLookup; objectName = set.getName(name); if (objectName == null) { return null; } table = (Table) schema.tableList.get(objectName.parent.name); if (table == null) { return null; } return table.getConstraint(name); case SchemaObject.TRIGGER : set = schema.indexLookup; objectName = set.getName(name); if (objectName == null) { return null; } table = (Table) schema.tableList.get(objectName.parent.name); return table.getTrigger(name); default : throw Error.runtimeError(ErrorCode.U_S0500, "SchemaManager"); } } finally { readLock.unlock(); } } // INDEX management /** * Returns the table that has an index with the given name and schema. */ Table findUserTableForIndex(Session session, String name, String schemaName) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(schemaName); HsqlName indexName = schema.indexLookup.getName(name); if (indexName == null) { return null; } return findUserTable(session, indexName.parent.name, schemaName); } finally { readLock.unlock(); } } /** * Drops the index with the specified name. */ void dropIndex(Session session, HsqlName name) { writeLock.lock(); try { Table t = getTable(session, name.parent.name, name.parent.schema.name); TableWorks tw = new TableWorks(session, t); tw.dropIndex(name.name); } finally { writeLock.unlock(); } } /** * Drops the index with the specified name. */ void dropConstraint(Session session, HsqlName name, boolean cascade) { writeLock.lock(); try { Table t = getTable(session, name.parent.name, name.parent.schema.name); TableWorks tw = new TableWorks(session, t); tw.dropConstraint(name.name, cascade); } finally { writeLock.unlock(); } } void removeDependentObjects(HsqlName name) { writeLock.lock(); try { Schema schema = (Schema) schemaMap.get(name.schema.name); schema.indexLookup.removeParent(name); schema.constraintLookup.removeParent(name); schema.triggerLookup.removeParent(name); } finally { writeLock.unlock(); } } /** * Removes any foreign key Constraint objects (exported keys) held by any * tables referenced by the specified table.

* * This method is called as the last step of a successful call to * dropTable() in order to ensure that the dropped Table ceases to be * referenced when enforcing referential integrity. * * @param toDrop The table to which other tables may be holding keys. * This is a table that is in the process of being dropped. */ void removeExportedKeys(Table toDrop) { writeLock.lock(); try { // toDrop.schema may be null because it is not registerd Schema schema = (Schema) schemaMap.get(toDrop.getSchemaName().name); for (int i = 0; i < schema.tableList.size(); i++) { Table table = (Table) schema.tableList.get(i); Constraint[] constraints = table.getConstraints(); for (int j = constraints.length - 1; j >= 0; j--) { Table refTable = constraints[j].getRef(); if (toDrop == refTable) { table.removeConstraint(j); } } } } finally { writeLock.unlock(); } } public Iterator databaseObjectIterator(String schemaName, int type) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(schemaName); return schema.schemaObjectIterator(type); } finally { readLock.unlock(); } } public Iterator databaseObjectIterator(int type) { readLock.lock(); try { Iterator it = schemaMap.values().iterator(); Iterator objects = new WrapperIterator(); while (it.hasNext()) { int targetType = type; if (type == SchemaObject.ROUTINE) { targetType = SchemaObject.FUNCTION; } Schema temp = (Schema) it.next(); SchemaObjectSet set = temp.getObjectSet(targetType); Object[] values; if (set.map.size() != 0) { values = new Object[set.map.size()]; set.map.valuesToArray(values); objects = new WrapperIterator(objects, new WrapperIterator(values)); } if (type == SchemaObject.ROUTINE) { set = temp.getObjectSet(SchemaObject.PROCEDURE); if (set.map.size() != 0) { values = new Object[set.map.size()]; set.map.valuesToArray(values); objects = new WrapperIterator(objects, new WrapperIterator(values)); } } } return objects; } finally { readLock.unlock(); } } // references private void addReferencesFrom(SchemaObject object) { OrderedHashSet set = object.getReferences(); HsqlName name = object.getName(); if (set == null) { return; } for (int i = 0; i < set.size(); i++) { HsqlName referenced = (HsqlName) set.get(i); if (object instanceof Routine) { name = ((Routine) object).getSpecificName(); } referenceMap.put(referenced, name); } } private void removeReferencesTo(OrderedHashSet set) { for (int i = 0; i < set.size(); i++) { HsqlName referenced = (HsqlName) set.get(i); referenceMap.remove(referenced); } } private void removeReferencesTo(HsqlName referenced) { referenceMap.remove(referenced); } private void removeReferencesFrom(SchemaObject object) { HsqlName name = object.getName(); OrderedHashSet set = object.getReferences(); if (set == null) { return; } for (int i = 0; i < set.size(); i++) { HsqlName referenced = (HsqlName) set.get(i); if (object instanceof Routine) { name = ((Routine) object).getSpecificName(); } referenceMap.remove(referenced, name); } } private void removeTableDependentReferences(Table table) { OrderedHashSet mainSet = table.getReferencesForDependents(); if (mainSet == null) { return; } for (int i = 0; i < mainSet.size(); i++) { HsqlName name = (HsqlName) mainSet.get(i); SchemaObject object = null; switch (name.type) { case SchemaObject.CONSTRAINT : object = table.getConstraint(name.name); break; case SchemaObject.TRIGGER : object = table.getTrigger(name.name); break; case SchemaObject.COLUMN : object = table.getColumn(table.getColumnIndex(name.name)); break; } removeReferencesFrom(object); } } public OrderedHashSet getReferencesTo(HsqlName object) { readLock.lock(); try { OrderedHashSet set = new OrderedHashSet(); Iterator it = referenceMap.get(object); while (it.hasNext()) { HsqlName name = (HsqlName) it.next(); set.add(name); } return set; } finally { readLock.unlock(); } } public OrderedHashSet getReferencesTo(HsqlName table, HsqlName column) { readLock.lock(); try { OrderedHashSet set = new OrderedHashSet(); Iterator it = referenceMap.get(table); while (it.hasNext()) { HsqlName name = (HsqlName) it.next(); SchemaObject object = getSchemaObject(name); OrderedHashSet references = object.getReferences(); if (references.contains(column)) { set.add(name); } } return set; } finally { readLock.unlock(); } } private boolean isReferenced(HsqlName object) { writeLock.lock(); try { return referenceMap.containsKey(object); } finally { writeLock.unlock(); } } // public void getCascadingReferencesTo(HsqlName object, OrderedHashSet set) { readLock.lock(); try { OrderedHashSet newSet = new OrderedHashSet(); Iterator it = referenceMap.get(object); while (it.hasNext()) { HsqlName name = (HsqlName) it.next(); boolean added = set.add(name); if (added) { newSet.add(name); } } for (int i = 0; i < newSet.size(); i++) { HsqlName name = (HsqlName) newSet.get(i); getCascadingReferencesTo(name, set); } } finally { readLock.unlock(); } } public void getCascadingReferencesToSchema(HsqlName schema, OrderedHashSet set) { Iterator mainIterator = referenceMap.keySet().iterator(); while (mainIterator.hasNext()) { HsqlName name = (HsqlName) mainIterator.next(); if (name.schema != schema) { continue; } getCascadingReferencesTo(name, set); } for (int i = set.size() - 1; i >= 0; i--) { HsqlName name = (HsqlName) set.get(i); if (name.schema == schema) { set.remove(i); } } } public MultiValueHashMap getReferencesToSchema(String schemaName) { MultiValueHashMap map = new MultiValueHashMap(); Iterator mainIterator = referenceMap.keySet().iterator(); while (mainIterator.hasNext()) { HsqlName name = (HsqlName) mainIterator.next(); if (!name.schema.name.equals(schemaName)) { continue; } Iterator it = referenceMap.get(name); while (it.hasNext()) { map.put(name, it.next()); } } return map; } // public HsqlName getSchemaObjectName(HsqlName schemaName, String name, int type, boolean raise) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(schemaName.name); SchemaObjectSet set = null; if (schema == null) { if (raise) { throw Error.error(SchemaObjectSet.getGetErrorCode(type)); } else { return null; } } if (type == SchemaObject.ROUTINE) { set = schema.functionLookup; SchemaObject object = schema.functionLookup.getObject(name); if (object == null) { set = schema.procedureLookup; object = schema.procedureLookup.getObject(name); } } else { set = getSchemaObjectSet(schema, type); } if (raise) { set.checkExists(name); } return set.getName(name); } finally { readLock.unlock(); } } public SchemaObject getSchemaObject(HsqlName name) { readLock.lock(); try { Schema schema = (Schema) schemaMap.get(name.schema.name); if (schema == null) { return null; } switch (name.type) { case SchemaObject.SEQUENCE : return (SchemaObject) schema.sequenceList.get(name.name); case SchemaObject.TABLE : case SchemaObject.VIEW : return (SchemaObject) schema.tableList.get(name.name); case SchemaObject.CHARSET : return schema.charsetLookup.getObject(name.name); case SchemaObject.COLLATION : return schema.collationLookup.getObject(name.name); case SchemaObject.PROCEDURE : return schema.procedureLookup.getObject(name.name); case SchemaObject.FUNCTION : return schema.functionLookup.getObject(name.name); case RoutineSchema.SPECIFIC_ROUTINE : return schema.specificRoutineLookup.getObject(name.name); case RoutineSchema.ROUTINE : SchemaObject object = schema.functionLookup.getObject(name.name); if (object == null) { object = schema.procedureLookup.getObject(name.name); } return object; case SchemaObject.DOMAIN : case SchemaObject.TYPE : return schema.typeLookup.getObject(name.name); case SchemaObject.TRIGGER : { name = schema.triggerLookup.getName(name.name); if (name == null) { return null; } HsqlName tableName = name.parent; Table table = (Table) schema.tableList.get(tableName.name); return table.getTrigger(name.name); } case SchemaObject.CONSTRAINT : { name = schema.constraintLookup.getName(name.name); if (name == null) { return null; } HsqlName tableName = name.parent; Table table = (Table) schema.tableList.get(tableName.name); return table.getConstraint(name.name); } case SchemaObject.ASSERTION : return null; case SchemaObject.INDEX : name = schema.indexLookup.getName(name.name); if (name == null) { return null; } HsqlName tableName = name.parent; Table table = (Table) schema.tableList.get(tableName.name); return table.getIndex(name.name); } return null; } finally { readLock.unlock(); } } public void checkColumnIsReferenced(HsqlName tableName, HsqlName name) { OrderedHashSet set = getReferencesTo(tableName, name); if (!set.isEmpty()) { HsqlName objectName = (HsqlName) set.get(0); throw Error.error(ErrorCode.X_42502, objectName.getSchemaQualifiedStatementName()); } } public void checkObjectIsReferenced(HsqlName name) { OrderedHashSet set = getReferencesTo(name); HsqlName refName = null; for (int i = 0; i < set.size(); i++) { refName = (HsqlName) set.get(i); // except columns of same table if (refName.parent != name) { break; } refName = null; } if (refName == null) { return; } int errorCode = ErrorCode.X_42502; if (refName.type == SchemaObject.ConstraintTypes.FOREIGN_KEY) { errorCode = ErrorCode.X_42533; } throw Error.error(errorCode, refName.getSchemaQualifiedStatementName()); } public void checkSchemaNameCanChange(HsqlName name) { readLock.lock(); try { Iterator it = referenceMap.values().iterator(); HsqlName refName = null; mainLoop: while (it.hasNext()) { refName = (HsqlName) it.next(); switch (refName.type) { case SchemaObject.VIEW : case SchemaObject.ROUTINE : case SchemaObject.FUNCTION : case SchemaObject.PROCEDURE : case SchemaObject.TRIGGER : case SchemaObject.SPECIFIC_ROUTINE : if (refName.schema == name) { break mainLoop; } break; default : break; } refName = null; } if (refName == null) { return; } throw Error.error(ErrorCode.X_42502, refName.getSchemaQualifiedStatementName()); } finally { readLock.unlock(); } } public void addSchemaObject(SchemaObject object) { writeLock.lock(); try { HsqlName name = object.getName(); Schema schema = (Schema) schemaMap.get(name.schema.name); SchemaObjectSet set = getSchemaObjectSet(schema, name.type); switch (name.type) { case SchemaObject.PROCEDURE : case SchemaObject.FUNCTION : { RoutineSchema routine = (RoutineSchema) set.getObject(name.name); if (routine == null) { routine = new RoutineSchema(name.type, name); routine.addSpecificRoutine(database, (Routine) object); set.checkAdd(name); SchemaObjectSet specificSet = getSchemaObjectSet(schema, SchemaObject.SPECIFIC_ROUTINE); specificSet.checkAdd( ((Routine) object).getSpecificName()); set.add(routine); specificSet.add(object); } else { SchemaObjectSet specificSet = getSchemaObjectSet(schema, SchemaObject.SPECIFIC_ROUTINE); HsqlName specificName = ((Routine) object).getSpecificName(); if (specificName != null) { specificSet.checkAdd(specificName); } routine.addSpecificRoutine(database, (Routine) object); specificSet.add(object); } addReferencesFrom(object); return; } case SchemaObject.TABLE : { OrderedHashSet refs = ((Table) object).getReferencesForDependents(); for (int i = 0; i < refs.size(); i++) { HsqlName ref = (HsqlName) refs.get(i); switch (ref.type) { case SchemaObject.COLUMN : { int index = ((Table) object).findColumn(ref.name); ColumnSchema column = ((Table) object).getColumn(index); addSchemaObject(column); break; } } } break; } case SchemaObject.COLUMN : { OrderedHashSet refs = object.getReferences(); if (refs == null || refs.isEmpty()) { return; } break; } } if (set != null) { set.add(object); } addReferencesFrom(object); } finally { writeLock.unlock(); } } public void removeSchemaObject(HsqlName name, boolean cascade) { writeLock.lock(); try { OrderedHashSet objectSet = new OrderedHashSet(); switch (name.type) { case SchemaObject.ROUTINE : case SchemaObject.PROCEDURE : case SchemaObject.FUNCTION : { RoutineSchema routine = (RoutineSchema) getSchemaObject(name); if (routine != null) { Routine[] specifics = routine.getSpecificRoutines(); for (int i = 0; i < specifics.length; i++) { getCascadingReferencesTo( specifics[i].getSpecificName(), objectSet); } } } break; case SchemaObject.SEQUENCE : case SchemaObject.TABLE : case SchemaObject.VIEW : case SchemaObject.TYPE : case SchemaObject.CHARSET : case SchemaObject.COLLATION : case SchemaObject.SPECIFIC_ROUTINE : getCascadingReferencesTo(name, objectSet); break; case SchemaObject.DOMAIN : OrderedHashSet set = getReferencesTo(name); Iterator it = set.iterator(); while (it.hasNext()) { HsqlName ref = (HsqlName) it.next(); if (ref.type == SchemaObject.COLUMN) { it.remove(); } } if (!set.isEmpty()) { HsqlName objectName = (HsqlName) set.get(0); throw Error.error( ErrorCode.X_42502, objectName.getSchemaQualifiedStatementName()); } break; } if (objectSet.isEmpty()) { removeSchemaObject(name); return; } if (!cascade) { HsqlName objectName = (HsqlName) objectSet.get(0); throw Error.error( ErrorCode.X_42502, objectName.getSchemaQualifiedStatementName()); } objectSet.add(name); removeSchemaObjects(objectSet); } finally { writeLock.unlock(); } } public void removeSchemaObjects(OrderedHashSet set) { writeLock.lock(); try { for (int i = 0; i < set.size(); i++) { HsqlName name = (HsqlName) set.get(i); removeSchemaObject(name); } } finally { writeLock.unlock(); } } public void removeSchemaObject(HsqlName name) { writeLock.lock(); try { Schema schema = (Schema) schemaMap.get(name.schema.name); SchemaObject object = null; SchemaObjectSet set = null; switch (name.type) { case SchemaObject.SEQUENCE : set = schema.sequenceLookup; object = set.getObject(name.name); break; case SchemaObject.TABLE : case SchemaObject.VIEW : { set = schema.tableLookup; object = set.getObject(name.name); break; } case SchemaObject.COLUMN : { Table table = (Table) getSchemaObject(name.parent); if (table != null) { object = table.getColumn(table.getColumnIndex(name.name)); } break; } case SchemaObject.CHARSET : set = schema.charsetLookup; object = set.getObject(name.name); break; case SchemaObject.COLLATION : set = schema.collationLookup; object = set.getObject(name.name); break; case SchemaObject.PROCEDURE : { set = schema.procedureLookup; RoutineSchema routine = (RoutineSchema) set.getObject(name.name); object = routine; Routine[] specifics = routine.getSpecificRoutines(); for (int i = 0; i < specifics.length; i++) { removeSchemaObject(specifics[i].getSpecificName()); } break; } case SchemaObject.FUNCTION : { set = schema.functionLookup; RoutineSchema routine = (RoutineSchema) set.getObject(name.name); object = routine; Routine[] specifics = routine.getSpecificRoutines(); for (int i = 0; i < specifics.length; i++) { removeSchemaObject(specifics[i].getSpecificName()); } break; } case SchemaObject.SPECIFIC_ROUTINE : { set = schema.specificRoutineLookup; Routine routine = (Routine) set.getObject(name.name); object = routine; routine.routineSchema.removeSpecificRoutine(routine); if (routine.routineSchema.getSpecificRoutines().length == 0) { removeSchemaObject(routine.getName()); } break; } case SchemaObject.DOMAIN : case SchemaObject.TYPE : set = schema.typeLookup; object = set.getObject(name.name); break; case SchemaObject.INDEX : set = schema.indexLookup; break; case SchemaObject.CONSTRAINT : { set = schema.constraintLookup; if (name.parent.type == SchemaObject.TABLE) { Table table = (Table) schema.tableList.get(name.parent.name); object = table.getConstraint(name.name); table.removeConstraint(name.name); } else if (name.parent.type == SchemaObject.DOMAIN) { Type type = (Type) schema.typeLookup.getObject( name.parent.name); object = type.userTypeModifier.getConstraint(name.name); type.userTypeModifier.removeConstraint(name.name); } break; } case SchemaObject.TRIGGER : { set = schema.triggerLookup; Table table = (Table) schema.tableList.get(name.parent.name); object = table.getTrigger(name.name); if (object != null) { table.removeTrigger((TriggerDef) object); } break; } default : throw Error.runtimeError(ErrorCode.U_S0500, "SchemaManager"); } if (object != null) { database.getGranteeManager().removeDbObject(name); removeReferencesFrom(object); } if (set != null) { set.remove(name.name); } removeReferencesTo(name); } finally { writeLock.unlock(); } } public void renameSchemaObject(HsqlName name, HsqlName newName) { writeLock.lock(); try { if (name.schema != newName.schema) { throw Error.error(ErrorCode.X_42505, newName.schema.name); } checkObjectIsReferenced(name); Schema schema = (Schema) schemaMap.get(name.schema.name); SchemaObjectSet set = getSchemaObjectSet(schema, name.type); set.rename(name, newName); } finally { writeLock.unlock(); } } public void replaceReferences(SchemaObject oldObject, SchemaObject newObject) { writeLock.lock(); try { removeReferencesFrom(oldObject); addReferencesFrom(newObject); } finally { writeLock.unlock(); } } public String[] getSQLArray() { readLock.lock(); try { OrderedHashSet resolved = new OrderedHashSet(); OrderedHashSet unresolved = new OrderedHashSet(); HsqlArrayList list = new HsqlArrayList(); Iterator schemas = schemaMap.values().iterator(); schemas = schemaMap.values().iterator(); while (schemas.hasNext()) { Schema schema = (Schema) schemas.next(); if (SqlInvariants.isSystemSchemaName(schema.getName().name)) { continue; } if (SqlInvariants.isLobsSchemaName(schema.getName().name)) { continue; } list.add(schema.getSQL()); schema.addSimpleObjects(unresolved); } while (true) { Iterator it = unresolved.iterator(); if (!it.hasNext()) { break; } OrderedHashSet newResolved = new OrderedHashSet(); SchemaObjectSet.addAllSQL(resolved, unresolved, list, it, newResolved); unresolved.removeAll(newResolved); if (newResolved.size() == 0) { break; } } schemas = schemaMap.values().iterator(); while (schemas.hasNext()) { Schema schema = (Schema) schemas.next(); if (SqlInvariants.isLobsSchemaName(schema.getName().name)) { continue; } if (SqlInvariants.isSystemSchemaName(schema.getName().name)) { continue; } list.addAll(schema.getSQLArray(resolved, unresolved)); } while (true) { Iterator it = unresolved.iterator(); if (!it.hasNext()) { break; } OrderedHashSet newResolved = new OrderedHashSet(); SchemaObjectSet.addAllSQL(resolved, unresolved, list, it, newResolved); unresolved.removeAll(newResolved); if (newResolved.size() == 0) { break; } } Iterator it = unresolved.iterator(); while (it.hasNext()) { SchemaObject object = (SchemaObject) it.next(); if (object instanceof Routine) { list.add(((Routine) object).getSQLDeclaration()); } } it = unresolved.iterator(); while (it.hasNext()) { SchemaObject object = (SchemaObject) it.next(); if (object instanceof Routine) { list.add(((Routine) object).getSQLAlter()); } else { list.add(object.getSQL()); } } schemas = schemaMap.values().iterator(); while (schemas.hasNext()) { Schema schema = (Schema) schemas.next(); if (SqlInvariants.isLobsSchemaName(schema.getName().name)) { continue; } if (SqlInvariants.isSystemSchemaName(schema.getName().name)) { continue; } String[] t = schema.getTriggerSQL(); if (t.length > 0) { list.add(Schema.getSetSchemaSQL(schema.getName())); list.addAll(t); } } schemas = schemaMap.values().iterator(); while (schemas.hasNext()) { Schema schema = (Schema) schemas.next(); list.addAll(schema.getSequenceRestartSQL()); } if (defaultSchemaHsqlName != null) { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_SET).append(' ').append(Tokens.T_DATABASE); sb.append(' ').append(Tokens.T_DEFAULT).append(' '); sb.append(Tokens.T_INITIAL).append(' ').append( Tokens.T_SCHEMA); sb.append(' ').append(defaultSchemaHsqlName.statementName); list.add(sb.toString()); } String[] array = new String[list.size()]; list.toArray(array); return array; } finally { readLock.unlock(); } } public String[] getTablePropsSQL(boolean withHeader) { readLock.lock(); try { HsqlArrayList tableList = getAllTables(false); HsqlArrayList list = new HsqlArrayList(); for (int i = 0; i < tableList.size(); i++) { Table t = (Table) tableList.get(i); if (t.isText()) { String[] ddl = t.getSQLForTextSource(withHeader); list.addAll(ddl); } String ddl = t.getSQLForReadOnly(); if (ddl != null) { list.add(ddl); } if (t.isCached()) { ddl = t.getSQLForClustered(); if (ddl != null) { list.add(ddl); } } } String[] array = new String[list.size()]; list.toArray(array); return array; } finally { readLock.unlock(); } } public String[] getIndexRootsSQL() { readLock.lock(); try { Session sysSession = database.sessionManager.getSysSession(); long[][] rootsArray = getIndexRoots(sysSession); HsqlArrayList tableList = getAllTables(true); HsqlArrayList list = new HsqlArrayList(); for (int i = 0; i < rootsArray.length; i++) { Table t = (Table) tableList.get(i); if (rootsArray[i] != null && rootsArray[i].length > 0 && rootsArray[i][0] != -1) { String ddl = ((Table) tableList.get(i)).getIndexRootsSQL( rootsArray[i]); list.add(ddl); } } String[] array = new String[list.size()]; list.toArray(array); return array; } finally { readLock.unlock(); } } public String[] getCommentsArray() { readLock.lock(); try { HsqlArrayList tableList = getAllTables(false); HsqlArrayList list = new HsqlArrayList(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < tableList.size(); i++) { Table table = (Table) tableList.get(i); if (table.getTableType() == Table.INFO_SCHEMA_TABLE) { continue; } int colCount = table.getColumnCount(); for (int j = 0; j < colCount; j++) { ColumnSchema column = table.getColumn(j); if (column.getName().comment == null) { continue; } sb.setLength(0); sb.append(Tokens.T_COMMENT).append(' ').append( Tokens.T_ON); sb.append(' ').append(Tokens.T_COLUMN).append(' '); sb.append( table.getName().getSchemaQualifiedStatementName()); sb.append('.').append(column.getName().statementName); sb.append(' ').append(Tokens.T_IS).append(' '); sb.append( StringConverter.toQuotedString( column.getName().comment, '\'', true)); list.add(sb.toString()); } if (table.getName().comment == null) { continue; } sb.setLength(0); sb.append(Tokens.T_COMMENT).append(' ').append(Tokens.T_ON); sb.append(' ').append(Tokens.T_TABLE).append(' '); sb.append(table.getName().getSchemaQualifiedStatementName()); sb.append(' ').append(Tokens.T_IS).append(' '); sb.append( StringConverter.toQuotedString( table.getName().comment, '\'', true)); list.add(sb.toString()); } Iterator it = databaseObjectIterator(SchemaObject.ROUTINE); while (it.hasNext()) { SchemaObject object = (SchemaObject) it.next(); if (object.getName().comment == null) { continue; } sb.setLength(0); sb.append(Tokens.T_COMMENT).append(' ').append(Tokens.T_ON); sb.append(' ').append(Tokens.T_ROUTINE).append(' '); sb.append(object.getName().getSchemaQualifiedStatementName()); sb.append(' ').append(Tokens.T_IS).append(' '); sb.append( StringConverter.toQuotedString( object.getName().comment, '\'', true)); list.add(sb.toString()); } String[] array = new String[list.size()]; list.toArray(array); return array; } finally { readLock.unlock(); } } long[][] tempIndexRoots; public void setTempIndexRoots(long[][] roots) { tempIndexRoots = roots; } public long[][] getIndexRoots(Session session) { readLock.lock(); try { if (tempIndexRoots != null) { long[][] roots = tempIndexRoots; tempIndexRoots = null; return roots; } HsqlArrayList allTables = getAllTables(true); HsqlArrayList list = new HsqlArrayList(); for (int i = 0, size = allTables.size(); i < size; i++) { Table t = (Table) allTables.get(i); if (t.getTableType() == TableBase.CACHED_TABLE) { long[] roots = t.getIndexRootsArray(); list.add(roots); } else { list.add(null); } } long[][] array = new long[list.size()][]; list.toArray(array); return array; } finally { readLock.unlock(); } } /** * called after the completion of defrag */ public void setIndexRoots(long[][] roots) { readLock.lock(); try { HsqlArrayList allTables = database.schemaManager.getAllTables(true); for (int i = 0, size = allTables.size(); i < size; i++) { Table t = (Table) allTables.get(i); if (t.getTableType() == TableBase.CACHED_TABLE) { long[] rootsArray = roots[i]; if (roots != null) { t.setIndexRoots(rootsArray); } } } } finally { readLock.unlock(); } } public void setDefaultTableType(int type) { defaultTableType = type; } public int getDefaultTableType() { return defaultTableType; } public void createSystemTables() { dualTable = TableUtil.newSingleColumnTable(database, SqlInvariants.DUAL_TABLE_HSQLNAME, TableBase.SYSTEM_TABLE, SqlInvariants.DUAL_COLUMN_HSQLNAME, Type.SQL_VARCHAR); dualTable.insertSys(database.sessionManager.getSysSession(), dualTable.getRowStore(null), new Object[]{ "X" }); dualTable.setDataReadOnly(true); Type[] columnTypes = new Type[] { Type.SQL_BIGINT, Type.SQL_BIGINT, Type.SQL_BIGINT, TypeInvariants.SQL_IDENTIFIER, TypeInvariants.SQL_IDENTIFIER, Type.SQL_BOOLEAN }; HsqlName tableName = database.nameManager.getSubqueryTableName(); HashMappedList columnList = new HashMappedList(); for (int i = 0; i < columnTypes.length; i++) { HsqlName name = database.nameManager.getAutoColumnName(i + 1); ColumnSchema column = new ColumnSchema(name, columnTypes[i], true, false, null); columnList.add(name.name, column); } dataChangeTable = new TableDerived(database, tableName, TableBase.CHANGE_SET_TABLE, columnTypes, columnList, new int[]{ 0 }); dataChangeTable.createIndexForColumns(null, new int[]{ 1 }); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ExpressionTable.java0000644000175000017500000001743612007547352022730 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.navigator.RowSetNavigatorData; import org.hsqldb.persist.PersistentStore; import org.hsqldb.result.Result; import org.hsqldb.store.ValuePool; import org.hsqldb.types.RowType; import org.hsqldb.types.Type; /** * Implementation of table conversion. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.1.0 * @since 2.0.0 */ public class ExpressionTable extends Expression { boolean isTable; boolean ordinality = false; /** * Creates an UNNEST ARRAY or MULTISET expression */ ExpressionTable(Expression[] e, boolean ordinality) { super(OpTypes.TABLE); nodes = e; this.ordinality = ordinality; } public String getSQL() { if (isTable) { return Tokens.T_TABLE; } else { return Tokens.T_UNNEST; } } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(64); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } if (isTable) { sb.append(Tokens.T_TABLE).append(' '); } else { sb.append(Tokens.T_UNNEST).append(' '); } sb.append(nodes[LEFT].describe(session, blanks)); return sb.toString(); } public void resolveTypes(Session session, Expression parent) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { nodes[i].resolveTypes(session, this); } } if (nodes.length == 1) { if (nodes[LEFT].dataType.isRowType()) { if (ordinality) { throw Error.error(ErrorCode.X_42581, Tokens.T_ORDINALITY); } nodeDataTypes = ((RowType) nodes[LEFT].dataType).getTypesArray(); table.prepareTable(); table.columnList = ((FunctionSQLInvoked) nodes[LEFT]).routine.getTable() .columnList; isTable = true; return; } } for (int i = 0; i < nodes.length; i++) { if (!nodes[i].dataType.isArrayType()) { throw Error.error(ErrorCode.X_42563, Tokens.T_UNNEST); } } int columnCount = ordinality ? nodes.length + 1 : nodes.length; nodeDataTypes = new Type[columnCount]; for (int i = 0; i < nodes.length; i++) { nodeDataTypes[i] = nodes[i].dataType.collectionBaseType(); if (nodeDataTypes[i] == null || nodeDataTypes[i] == Type.SQL_ALL_TYPES) { throw Error.error(ErrorCode.X_42567, Tokens.T_UNNEST); } } if (ordinality) { nodeDataTypes[nodes.length] = Type.SQL_INTEGER; } table.prepareTable(); } public Result getResult(Session session) { switch (opType) { case OpTypes.TABLE : { RowSetNavigatorData navigator = table.getNavigator(session); Result result = Result.newResult(navigator); result.metaData = table.queryExpression.getMetaData(); return result; } default : { throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionTable"); } } } public Object[] getRowValue(Session session) { switch (opType) { case OpTypes.TABLE : { return table.queryExpression.getValues(session); } default : throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } } Object getValue(Session session, Type type) { switch (opType) { case OpTypes.TABLE : { materialise(session); Object[] value = table.getValues(session); if (value.length == 1) { return ((Object[]) value)[0]; } return value; } default : throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } } public Object getValue(Session session) { return valueData; } void insertValuesIntoSubqueryTable(Session session, PersistentStore store) { if (isTable) { insertTableValues(session, store); } else { insertArrayValues(session, store); } } private void insertTableValues(Session session, PersistentStore store) { Result result = nodes[LEFT].getResult(session); RowSetNavigator nav = result.navigator; int size = nav.getSize(); while (nav.hasNext()) { Object[] data = nav.getNext(); Row row = (Row) store.getNewCachedObject(session, data, false); try { store.indexRow(session, row); } catch (HsqlException e) {} } } private void insertArrayValues(Session session, PersistentStore store) { Object[][] array = new Object[nodes.length][]; for (int i = 0; i < array.length; i++) { Object[] data = (Object[]) nodes[i].getValue(session); if (data == null) { data = ValuePool.emptyObjectArray; } array[i] = data; } for (int i = 0; ; i++) { boolean isRow = false; Object[] data = new Object[nodeDataTypes.length]; for (int arrayIndex = 0; arrayIndex < array.length; arrayIndex++) { if (i < array[arrayIndex].length) { data[arrayIndex] = array[arrayIndex][i]; isRow = true; } } if (!isRow) { break; } if (ordinality) { data[nodes.length] = ValuePool.getInt(i + 1); } Row row = (Row) store.getNewCachedObject(session, data, false); store.indexRow(session, row); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ColumnSchema.java0000644000175000017500000002642112007547362022172 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.RangeGroup.RangeGroupSimple; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.rights.Grantee; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Implementation of SQL table column metadata.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public final class ColumnSchema extends ColumnBase implements SchemaObject { public static final ColumnSchema[] emptyArray = new ColumnSchema[]{}; // private HsqlName columnName; private boolean isPrimaryKey; private Expression defaultExpression; private Expression generatingExpression; private NumberSequence sequence; private OrderedHashSet references; private OrderedHashSet generatedColumnReferences; private Expression accessor; /** * Creates a column defined in DDL statement. */ public ColumnSchema(HsqlName name, Type type, boolean isNullable, boolean isPrimaryKey, Expression defaultExpression) { columnName = name; nullability = isNullable ? SchemaObject.Nullability.NULLABLE : SchemaObject.Nullability.NO_NULLS; this.dataType = type; this.isPrimaryKey = isPrimaryKey; this.defaultExpression = defaultExpression; setReferences(); } public int getType() { return columnName.type; } public HsqlName getName() { return columnName; } public String getNameString() { return columnName.name; } public String getTableNameString() { return columnName.parent == null ? null : columnName.parent.name; } public HsqlName getSchemaName() { return columnName.schema; } public String getSchemaNameString() { return columnName.schema == null ? null : columnName.schema.name; } public HsqlName getCatalogName() { return columnName.schema == null ? null : columnName.schema.schema; } public String getCatalogNameString() { return columnName.schema == null ? null : columnName.schema.schema == null ? null : columnName.schema.schema.name; } public Grantee getOwner() { return columnName.schema == null ? null : columnName.schema.owner; } public OrderedHashSet getReferences() { return references; } public OrderedHashSet getComponents() { return null; } public void compile(Session session, SchemaObject table) { if (generatingExpression == null) { return; } generatingExpression.resetColumnReferences(); generatingExpression.resolveCheckOrGenExpression(session, new RangeGroupSimple(((Table) table).getDefaultRanges()), false); if (dataType.typeComparisonGroup != generatingExpression.getDataType().typeComparisonGroup) { throw Error.error(ErrorCode.X_42561); } setReferences(); } public String getSQL() { StringBuffer sb = new StringBuffer(); switch (parameterMode) { case SchemaObject.ParameterModes.PARAM_IN : sb.append(Tokens.T_IN).append(' '); break; case SchemaObject.ParameterModes.PARAM_OUT : sb.append(Tokens.T_OUT).append(' '); break; case SchemaObject.ParameterModes.PARAM_INOUT : sb.append(Tokens.T_INOUT).append(' '); break; } if (columnName != null) { sb.append(columnName.statementName); sb.append(' '); } sb.append(dataType.getTypeDefinition()); return sb.toString(); } public long getChangeTimestamp() { return 0; } public void setType(Type type) { this.dataType = type; setReferences(); } public void setName(HsqlName name) { this.columnName = name; } void setIdentity(NumberSequence sequence) { this.sequence = sequence; isIdentity = sequence != null; } void setType(ColumnSchema other) { nullability = other.nullability; dataType = other.dataType; } public NumberSequence getIdentitySequence() { return sequence; } /** * Is column nullable. * * @return boolean */ public boolean isNullable() { boolean isNullable = super.isNullable(); if (isNullable) { if (dataType.isDomainType()) { return dataType.userTypeModifier.isNullable(); } } return isNullable; } public byte getNullability() { return isPrimaryKey ? SchemaObject.Nullability.NO_NULLS : super.getNullability(); } public boolean isGenerated() { return generatingExpression != null; } public boolean hasDefault() { return getDefaultExpression() != null; } /** * Is column writeable or always generated * * @return boolean */ public boolean isWriteable() { return !isGenerated(); } public void setWriteable(boolean value) { throw Error.runtimeError(ErrorCode.U_S0500, "ColumnSchema"); } public boolean isSearchable() { return Types.isSearchable(dataType.typeCode); } /** * Is this single column primary key of the table. * * @return boolean */ public boolean isPrimaryKey() { return isPrimaryKey; } /** * Set primary key. * */ void setPrimaryKey(boolean value) { isPrimaryKey = value; } /** * Returns default value in the session context. */ public Object getDefaultValue(Session session) { return defaultExpression == null ? null : defaultExpression.getValue(session, dataType); } /** * Returns generated value in the session context. */ public Object getGeneratedValue(Session session) { return generatingExpression == null ? null : generatingExpression.getValue( session, dataType); } /** * Returns SQL for default value. */ public String getDefaultSQL() { String ddl = null; ddl = defaultExpression == null ? null : defaultExpression.getSQL(); return ddl; } /** * Returns default expression for the column. */ Expression getDefaultExpression() { if (defaultExpression == null) { if (dataType.isDomainType()) { return dataType.userTypeModifier.getDefaultClause(); } return null; } else { return defaultExpression; } } void setDefaultExpression(Expression expr) { defaultExpression = expr; } /** * Returns generated expression for the column. */ public Expression getGeneratingExpression() { return generatingExpression; } void setGeneratingExpression(Expression expr) { generatingExpression = expr; } public ColumnSchema duplicate() { ColumnSchema copy = new ColumnSchema(columnName, dataType, true, isPrimaryKey, defaultExpression); copy.setNullability(this.nullability); copy.setGeneratingExpression(generatingExpression); copy.setIdentity(sequence); return copy; } public Expression getAccessor() { if (accessor == null) { accessor = new ExpressionColumnAccessor(this); } return accessor; } public OrderedHashSet getGeneratedColumnReferences() { return generatedColumnReferences; } private void setReferences() { if (references != null) { references.clear(); } if (generatedColumnReferences != null) { generatedColumnReferences.clear(); } if (dataType.isDomainType() || dataType.isDistinctType()) { HsqlName name = ((SchemaObject) dataType).getName(); if (references == null) { references = new OrderedHashSet(); } references.add(name); } if (generatingExpression != null) { OrderedHashSet set = new OrderedHashSet(); generatingExpression.collectObjectNames(set); Iterator it = set.iterator(); while (it.hasNext()) { HsqlName name = (HsqlName) it.next(); if (name.type == SchemaObject.COLUMN || name.type == SchemaObject.TABLE) { if (name.type == SchemaObject.COLUMN) { if (generatedColumnReferences == null) { generatedColumnReferences = new OrderedHashSet(); } generatedColumnReferences.add(name); } } else { if (references == null) { references = new OrderedHashSet(); } references.add(name); } } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementSet.java0000644000175000017500000003230012007547414022223 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.ParserDQL.CompileContext; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArraySort; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.result.Result; import org.hsqldb.store.ValuePool; import org.hsqldb.types.Type; /** * Implementation of Statement for PSM and trigger assignment. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class StatementSet extends StatementDMQL { Expression expression; // Expression[] targets; int[] variableIndexes; Type[] sourceTypes; // final int operationType; public static final int TRIGGER_SET = 1; public static final int SELECT_INTO = 2; public static final int VARIABLE_SET = 3; /** * Trigger SET statement. */ StatementSet(Session session, Expression[] targets, Table table, RangeVariable rangeVars[], int[] indexes, Expression[] colExpressions, CompileContext compileContext) { super(StatementTypes.ASSIGNMENT, StatementTypes.X_SQL_DATA_CHANGE, session.getCurrentSchemaHsqlName()); this.operationType = TRIGGER_SET; this.targets = targets; this.targetTable = table; this.baseTable = targetTable.getBaseTable(); this.updateColumnMap = indexes; this.updateExpressions = colExpressions; this.updateCheckColumns = targetTable.getColumnCheckList(indexes); this.targetRangeVariables = rangeVars; isTransactionStatement = false; setDatabseObjects(session, compileContext); checkAccessRights(session); } /** * PSM and session variable SET */ StatementSet(Session session, Expression[] targets, Expression e, int[] indexes, CompileContext compileContext) { super(StatementTypes.ASSIGNMENT, StatementTypes.X_SQL_CONTROL, null); this.operationType = VARIABLE_SET; this.targets = targets; this.expression = e; variableIndexes = indexes; sourceTypes = expression.getNodeDataTypes(); isTransactionStatement = false; setDatabseObjects(session, compileContext); checkAccessRights(session); } /** * Single row SELECT INTO */ StatementSet(Session session, Expression[] targets, QueryExpression query, int[] indexes, CompileContext compileContext) { super(StatementTypes.ASSIGNMENT, StatementTypes.X_SQL_CONTROL, null); this.operationType = SELECT_INTO; this.queryExpression = query; this.targets = targets; variableIndexes = indexes; sourceTypes = query.getColumnTypes(); isTransactionStatement = false; setDatabseObjects(session, compileContext); checkAccessRights(session); } TableDerived[] getSubqueries(Session session) { OrderedHashSet subQueries = null; if (expression != null) { subQueries = expression.collectAllSubqueries(subQueries); } if (subQueries == null || subQueries.size() == 0) { return TableDerived.emptyArray; } TableDerived[] subQueryArray = new TableDerived[subQueries.size()]; subQueries.toArray(subQueryArray); ArraySort.sort(subQueryArray, 0, subQueryArray.length, subQueryArray[0]); for (int i = 0; i < subqueries.length; i++) { subQueryArray[i].prepareTable(); } return subQueryArray; } Result getResult(Session session) { Result result = null; switch (operationType) { case StatementSet.TRIGGER_SET : result = executeTriggerSetStatement(session); break; case StatementSet.SELECT_INTO : { Object[] values = queryExpression.getSingleRowValues(session); if (values == null) { session.addWarning(HsqlException.noDataCondition); result = Result.updateZeroResult; break; } for (int i = 0; i < values.length; i++) { values[i] = targets[i].getColumn().getDataType().convertToType( session, values[i], sourceTypes[i]); } result = executeAssignment(session, values); break; } case StatementSet.VARIABLE_SET : { Object[] values = getExpressionValues(session); if (values == null) { result = Result.updateZeroResult; break; } for (int i = 0; i < values.length; i++) { Type targetType; if (targets[i].getType() == OpTypes.ARRAY_ACCESS) { targetType = targets[i].getLeftNode().getColumn().getDataType() .collectionBaseType(); } else { targetType = targets[i].getColumn().getDataType(); } values[i] = targetType.convertToType(session, values[i], sourceTypes[i]); } result = executeAssignment(session, values); break; } default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementSet"); } return result; } public void resolve(Session session) { references = new OrderedHashSet(); switch (operationType) { case StatementSet.TRIGGER_SET : for (int i = 0; i < updateExpressions.length; i++) { updateExpressions[i].collectObjectNames(references); } break; case StatementSet.SELECT_INTO : case StatementSet.VARIABLE_SET : { if (expression != null) { expression.collectObjectNames(references); } if (queryExpression != null) { queryExpression.collectObjectNames(references); } break; } default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementSet"); } } public String getSQL() { StringBuffer sb = new StringBuffer(); switch (operationType) { case StatementSet.TRIGGER_SET : return sql; case StatementSet.VARIABLE_SET : { /** @todo - cover row assignment */ sb.append(Tokens.T_SET).append(' '); sb.append(targets[0].getColumn().getName().statementName); sb.append(' ').append('=').append(' ').append( expression.getSQL()); break; } } return sb.toString(); } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } sb.append(Tokens.T_STATEMENT); return sb.toString(); } public Result execute(Session session) { Result result; try { if (subqueries.length > 0) { materializeSubQueries(session); } result = getResult(session); } catch (Throwable t) { result = Result.newErrorResult(t, null); } if (result.isError()) { result.getException().setStatementType(group, type); } return result; } public String describe(Session session) { return ""; } Result executeTriggerSetStatement(Session session) { Table table = targetTable; int[] colMap = updateColumnMap; // column map Expression[] colExpressions = updateExpressions; Type[] colTypes = table.getColumnTypes(); int index = targetRangeVariables[TriggerDef.NEW_ROW].rangePosition; Object[] oldData = session.sessionContext.triggerArguments[index]; Object[] data = StatementDML.getUpdatedData(session, targets, table, colMap, colExpressions, colTypes, oldData); ArrayUtil.copyArray(data, oldData, data.length); return Result.updateOneResult; } // this fk references -> other : other read lock void collectTableNamesForRead(OrderedHashSet set) { for (int i = 0; i < rangeVariables.length; i++) { Table rangeTable = rangeVariables[i].rangeTable; HsqlName name = rangeTable.getName(); if (rangeTable.isReadOnly() || rangeTable.isTemp()) { continue; } if (name.schema == SqlInvariants.SYSTEM_SCHEMA_HSQLNAME) { continue; } set.add(name); } for (int i = 0; i < subqueries.length; i++) { if (subqueries[i].queryExpression != null) { subqueries[i].queryExpression.getBaseTableNames(set); } } for (int i = 0; i < routines.length; i++) { set.addAll(routines[i].getTableNamesForRead()); } } void collectTableNamesForWrite(OrderedHashSet set) {} public void checkIsNotColumnTarget() { for (int i = 0; i < targets.length; i++) { ColumnSchema col = targets[i].getColumn(); if (col.getType() == SchemaObject.COLUMN) { throw Error.error(ErrorCode.X_0U000, col.getName().statementName); } } } Object[] getExpressionValues(Session session) { Object[] values; if (expression.getType() == OpTypes.ROW) { values = expression.getRowValue(session); } else if (expression.getType() == OpTypes.ROW_SUBQUERY) { values = expression.table.queryExpression.getSingleRowValues( session); if (values == null) { // todo - verify semantics return null; } } else { values = new Object[1]; values[0] = expression.getValue(session); } return values; } Result executeAssignment(Session session, Object[] values) { for (int j = 0; j < values.length; j++) { Object[] data = ValuePool.emptyObjectArray; switch (targets[j].getColumn().getType()) { case SchemaObject.PARAMETER : data = session.sessionContext.routineArguments; break; case SchemaObject.VARIABLE : data = session.sessionContext.routineVariables; break; case SchemaObject.COLUMN : data = session.sessionContext .triggerArguments[TriggerDef.NEW_ROW]; break; } int colIndex = variableIndexes[j]; if (targets[j].getType() == OpTypes.ARRAY_ACCESS) { data[colIndex] = ((ExpressionAccessor) targets[j]).getUpdatedArray(session, (Object[]) data[colIndex], values[j], true); } else { data[colIndex] = values[j]; } } return Result.updateZeroResult; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ParserRoutine.java0000644000175000017500000020134512007547362022416 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.RangeGroup.RangeGroupSimple; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.LongDeque; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.OrderedIntHashSet; import org.hsqldb.result.ResultProperties; import org.hsqldb.types.ArrayType; import org.hsqldb.types.BinaryData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Parser for SQL stored procedures and functions - PSM * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class ParserRoutine extends ParserDML { ParserRoutine(Session session, Scanner t) { super(session, t); } /** * Reads a DEFAULT clause expression. */ /* for datetime, the default must have the same fields */ Expression readDefaultClause(Type dataType) { Expression e = null; boolean minus = false; if (token.tokenType == Tokens.NULL) { read(); return new ExpressionValue(null, dataType); } if (dataType.isDateTimeType() || dataType.isIntervalType()) { switch (token.tokenType) { case Tokens.DATE : case Tokens.TIME : case Tokens.TIMESTAMP : case Tokens.INTERVAL : { e = readDateTimeIntervalLiteral(session); if (e.dataType.typeCode != dataType.typeCode) { // error message throw unexpectedToken(); } Object defaultValue = e.getValue(session, dataType); return new ExpressionValue(defaultValue, dataType); } case Tokens.X_VALUE : break; default : e = XreadDateTimeValueFunctionOrNull(); if (e == null) { break; } e = XreadModifier(e); break; } } else if (dataType.isNumberType()) { if (token.tokenType == Tokens.MINUS) { read(); minus = true; } else { if (database.sqlSyntaxPgs && token.tokenType == Tokens.NEXTVAL) { return readNextvalFunction(); } } } else if (dataType.isCharacterType()) { switch (token.tokenType) { case Tokens.USER : case Tokens.CURRENT_USER : case Tokens.CURRENT_ROLE : case Tokens.SESSION_USER : case Tokens.SYSTEM_USER : case Tokens.CURRENT_CATALOG : case Tokens.CURRENT_SCHEMA : case Tokens.CURRENT_PATH : FunctionSQL function = FunctionSQL.newSQLFunction(token.tokenString, compileContext); e = readSQLFunction(function); break; default : } } else if (dataType.isBooleanType()) { switch (token.tokenType) { case Tokens.TRUE : read(); return Expression.EXPR_TRUE; case Tokens.FALSE : read(); return Expression.EXPR_FALSE; } } else if (dataType.isBitType()) { switch (token.tokenType) { case Tokens.TRUE : read(); return new ExpressionValue(BinaryData.singleBitOne, dataType); case Tokens.FALSE : read(); return new ExpressionValue(BinaryData.singleBitZero, dataType); } } else if (dataType.isArrayType()) { e = readCollection(OpTypes.ARRAY); if (e.nodes.length > 0) { throw Error.error(ErrorCode.X_42562); } e.dataType = dataType; return e; } if (e != null) { e.resolveTypes(session, null); if (dataType.typeComparisonGroup != e.getDataType().typeComparisonGroup) { throw Error.error(ErrorCode.X_42562); } return e; } boolean inParens = false; if (database.sqlSyntaxMss && token.tokenType == Tokens.OPENBRACKET) { read(); inParens = true; } if (token.tokenType == Tokens.X_VALUE) { Object value = token.tokenValue; Type valueType = token.dataType; Type convertType = dataType; if (dataType.typeCode == Types.SQL_CLOB) { convertType = Type.getType(Types.SQL_VARCHAR, null, database.collation, dataType.precision, 0); } else if (dataType.typeCode == Types.SQL_BLOB) { convertType = Type.getType(Types.SQL_VARBINARY, null, null, dataType.precision, 0); } value = convertType.convertToType(session, value, valueType); read(); if (minus) { value = dataType.negate(value); } if (inParens) { readThis(Tokens.CLOSEBRACKET); } return new ExpressionValue(value, convertType); } else { if (database.sqlSyntaxDb2) { Object value = null; switch (dataType.typeComparisonGroup) { case Types.SQL_VARCHAR : value = ""; break; case Types.SQL_VARBINARY : value = BinaryData.zeroLengthBinary; break; case Types.SQL_NUMERIC : value = Integer.valueOf(0); break; case Types.SQL_BOOLEAN : value = Boolean.FALSE; break; case Types.SQL_CLOB : value = ""; return new ExpressionValue(value, Type.SQL_VARCHAR_DEFAULT); case Types.SQL_BLOB : value = BinaryData.zeroLengthBinary; return new ExpressionValue(value, Type.SQL_VARBINARY_DEFAULT); case Types.TIME : { FunctionSQL function = FunctionSQL.newSQLFunction(Tokens.T_CURRENT_TIME, compileContext); function.resolveTypes(session, null); return function; } case Types.DATE : { FunctionSQL function = FunctionSQL.newSQLFunction(Tokens.T_CURRENT_DATE, compileContext); function.resolveTypes(session, null); return function; } case Types.TIMESTAMP : { FunctionSQL function = FunctionSQL.newSQLFunction( Tokens.T_CURRENT_TIMESTAMP, compileContext); function.resolveTypes(session, null); return function; } } value = dataType.convertToDefaultType(session, value); return new ExpressionValue(value, dataType); } throw unexpectedToken(); } } Statement compileOpenCursorStatement(StatementCompound context) { readThis(Tokens.OPEN); checkIsSimpleName(); String tokenString = token.tokenString; read(); for (int i = 0; i < context.cursors.length; i++) { if (context.cursors[i].getCursorName().name.equals(tokenString)) { return context.cursors[i]; } } throw Error.error(ErrorCode.X_34000); } Statement compileSelectSingleRowStatement(RangeGroup[] rangeGroups) { OrderedHashSet variableNames = new OrderedHashSet(); Type[] targetTypes; LongDeque colIndexList = new LongDeque(); QuerySpecification select; compileContext.setOuterRanges(rangeGroups); select = XreadSelect(); readThis(Tokens.INTO); RangeVariable[] ranges = rangeGroups[0].getRangeVariables(); readTargetSpecificationList(variableNames, ranges, colIndexList); XreadTableExpression(select); select.setReturningResult(); int[] columnMap = new int[colIndexList.size()]; colIndexList.toArray(columnMap); Expression[] variables = new Expression[variableNames.size()]; variableNames.toArray(variables); targetTypes = new Type[variables.length]; for (int i = 0; i < variables.length; i++) { if (variables[i].getColumn().getParameterMode() == SchemaObject.ParameterModes.PARAM_IN) { // todo - use more specific error message throw Error.error(ErrorCode.X_0U000); } targetTypes[i] = variables[i].getDataType(); } select.setReturningResult(); select.resolve(session, rangeGroups, targetTypes); if (select.getColumnCount() != variables.length) { throw Error.error(ErrorCode.X_42564, Tokens.T_INTO); } Statement statement = new StatementSet(session, variables, select, columnMap, compileContext); return statement; } /** * Creates GET DIAGNOSTICS. */ Statement compileGetStatement(RangeVariable[] rangeVars) { read(); readThis(Tokens.DIAGNOSTICS); OrderedHashSet targetSet = new OrderedHashSet(); HsqlArrayList exprList = new HsqlArrayList(); LongDeque colIndexList = new LongDeque(); RangeGroup[] rangeGroups = new RangeGroup[]{ new RangeGroupSimple(rangeVars) }; readGetClauseList(rangeVars, targetSet, colIndexList, exprList); if (exprList.size() > 1) { throw Error.error(ErrorCode.X_42602); } Expression expression = (Expression) exprList.get(0); if (expression.getDegree() != targetSet.size()) { throw Error.error(ErrorCode.X_42546, Tokens.T_SET); } int[] columnMap = new int[colIndexList.size()]; colIndexList.toArray(columnMap); Expression[] targets = new Expression[targetSet.size()]; targetSet.toArray(targets); for (int i = 0; i < targets.length; i++) { resolveOuterReferencesAndTypes(rangeGroups, targets[i]); } resolveOuterReferencesAndTypes(rangeGroups, expression); for (int i = 0; i < targets.length; i++) { if (targets[i].getColumn().getParameterMode() == SchemaObject.ParameterModes.PARAM_IN) { // todo - use more specific error message throw Error.error(ErrorCode.X_0U000); } if (!targets[i].getDataType().canBeAssignedFrom( expression.getNodeDataType(i))) { throw Error.error(ErrorCode.X_42561); } } StatementSet cs = new StatementSet(session, targets, expression, columnMap, compileContext); return cs; } /** * Creates SET Statement for PSM or session variables from this parse context. */ StatementSet compileSetStatement(RangeVariable[] rangeVars) { read(); OrderedHashSet targetSet = new OrderedHashSet(); HsqlArrayList exprList = new HsqlArrayList(); LongDeque colIndexList = new LongDeque(); readSetClauseList(rangeVars, targetSet, colIndexList, exprList); if (exprList.size() > 1) { throw Error.error(ErrorCode.X_42602); } Expression expression = (Expression) exprList.get(0); if (expression.getDegree() != targetSet.size()) { throw Error.error(ErrorCode.X_42546, Tokens.T_SET); } int[] columnMap = new int[colIndexList.size()]; colIndexList.toArray(columnMap); Expression[] targets = new Expression[targetSet.size()]; targetSet.toArray(targets); for (int i = 0; i < targets.length; i++) { this.resolveOuterReferencesAndTypes(rangeVars, targets[i]); } resolveOuterReferencesAndTypes(rangeVars, expression); for (int i = 0; i < targets.length; i++) { ColumnSchema col = targets[i].getColumn(); if (col.getParameterMode() == SchemaObject.ParameterModes.PARAM_IN) { // todo - use more specific error message throw Error.error(ErrorCode.X_0U000, col.getName().statementName); } if (!targets[i].getDataType().canBeAssignedFrom( expression.getNodeDataType(i))) { throw Error.error(ErrorCode.X_42561); } } StatementSet cs = new StatementSet(session, targets, expression, columnMap, compileContext); return cs; } /** * Creates SET Statement for a trigger row from this parse context. */ StatementDMQL compileTriggerSetStatement(Table table, RangeGroup[] rangeGroups) { read(); Expression[] updateExpressions; int[] columnMap; OrderedHashSet targetSet = new OrderedHashSet(); HsqlArrayList exprList = new HsqlArrayList(); RangeVariable[] targetRangeVars = new RangeVariable[]{ rangeGroups[0].getRangeVariables()[TriggerDef.NEW_ROW] }; LongDeque colIndexList = new LongDeque(); readSetClauseList(targetRangeVars, targetSet, colIndexList, exprList); columnMap = new int[colIndexList.size()]; colIndexList.toArray(columnMap); Expression[] targets = new Expression[targetSet.size()]; targetSet.toArray(targets); for (int i = 0; i < targets.length; i++) { resolveOuterReferencesAndTypes(RangeGroup.emptyArray, targets[i]); } updateExpressions = new Expression[exprList.size()]; exprList.toArray(updateExpressions); resolveUpdateExpressions(table, RangeGroup.emptyGroup, columnMap, updateExpressions, rangeGroups); StatementDMQL cs = new StatementSet(session, targets, table, rangeGroups[0].getRangeVariables(), columnMap, updateExpressions, compileContext); return cs; } StatementSchema compileAlterSpecificRoutine() { boolean restrict = false; readThis(Tokens.SPECIFIC); readThis(Tokens.ROUTINE); Routine routine = (Routine) readSchemaObjectName(SchemaObject.SPECIFIC_ROUTINE); routine = routine.duplicate(); readRoutineCharacteristics(routine); restrict = readIfThis(Tokens.RESTRICT); if (restrict) { OrderedHashSet set = database.schemaManager.getReferencesTo( routine.getSpecificName()); if (!set.isEmpty()) { throw Error.error(ErrorCode.X_42502); } } if (token.tokenType == Tokens.BODY) { read(); } else if (token.tokenType == Tokens.NAME) { read(); } readRoutineBody(routine); routine.resetAlteredRoutineSettings(); routine.resolve(session); Object[] args = new Object[]{ routine }; String sql = getLastPart(); StatementSchema cs = new StatementSchema(sql, StatementTypes.ALTER_ROUTINE, args, null, database.schemaManager.getCatalogNameArray()); return cs; } // SQL-invoked routine StatementSchema compileCreateProcedureOrFunction(boolean orReplace) { int routineType; boolean isAggregate = false; if (token.tokenType == Tokens.AGGREGATE) { isAggregate = true; read(); if (token.tokenType == Tokens.PROCEDURE) { throw super.unexpectedToken(); } } routineType = token.tokenType == Tokens.PROCEDURE ? SchemaObject.PROCEDURE : SchemaObject.FUNCTION; HsqlName name; read(); name = readNewSchemaObjectName(routineType, true); name.setSchemaIfNull(session.getCurrentSchemaHsqlName()); Routine routine = new Routine(routineType); routine.setName(name); routine.setAggregate(isAggregate); readThis(Tokens.OPENBRACKET); if (token.tokenType == Tokens.CLOSEBRACKET) { read(); } else { while (true) { ColumnSchema newcolumn = readRoutineParameter(routine, true); routine.addParameter(newcolumn); if (token.tokenType == Tokens.COMMA) { read(); } else { readThis(Tokens.CLOSEBRACKET); break; } } } if (routineType != SchemaObject.PROCEDURE) { readThis(Tokens.RETURNS); if (token.tokenType == Tokens.TABLE) { read(); TableDerived table = new TableDerived(database, SqlInvariants.MODULE_HSQLNAME, TableBase.FUNCTION_TABLE); readTableDefinition(routine, table); routine.setReturnTable(table); } else { Type type = readTypeDefinition(false, true); routine.setReturnType(type); } } readRoutineCharacteristics(routine); readRoutineBody(routine); Object[] args = new Object[]{ routine }; String sql = getLastPart(); StatementSchema cs = new StatementSchema(sql, StatementTypes.CREATE_ROUTINE, args, null, database.schemaManager.getCatalogNameArray()); return cs; } Routine readCreatePasswordCheckFunction() { Routine routine = new Routine(SchemaObject.FUNCTION); if (token.tokenType == Tokens.NONE) { read(); return null; } else if (token.tokenType == Tokens.EXTERNAL) { routine.setLanguage(Routine.LANGUAGE_JAVA); routine.setDataImpact(Routine.NO_SQL); } else { routine.setLanguage(Routine.LANGUAGE_SQL); routine.setDataImpact(Routine.CONTAINS_SQL); } HsqlName hsqlName = database.nameManager.newHsqlName(Tokens.T_PASSWORD, false, SchemaObject.FUNCTION); hsqlName.setSchemaIfNull(SqlInvariants.SYSTEM_SCHEMA_HSQLNAME); routine.setName(hsqlName); hsqlName = database.nameManager.newHsqlName(Tokens.T_PASSWORD, false, SchemaObject.PARAMETER); ColumnSchema column = new ColumnSchema(hsqlName, Type.SQL_VARCHAR, false, false, null); routine.addParameter(column); routine.setReturnType(Type.SQL_BOOLEAN); readRoutineBody(routine); routine.resolve(session); return routine; } Routine readCreateDatabaseAuthenticationFunction() { Routine routine = new Routine(SchemaObject.FUNCTION); if (token.tokenType == Tokens.NONE) { read(); return null; } checkIsThis(Tokens.EXTERNAL); routine.setLanguage(Routine.LANGUAGE_JAVA); routine.setDataImpact(Routine.NO_SQL); routine.setName( database.nameManager.newHsqlName( Tokens.T_AUTHENTICATION, false, SchemaObject.FUNCTION)); for (int i = 0; i < 3; i++) { ColumnSchema column = new ColumnSchema(null, Type.SQL_VARCHAR, false, false, null); routine.addParameter(column); } routine.setReturnType( new ArrayType( Type.SQL_VARCHAR_DEFAULT, ArrayType.defaultArrayCardinality)); readRoutineBody(routine); routine.resolve(session); return routine; } private void readTableDefinition(Routine routine, Table table) throws HsqlException { readThis(Tokens.OPENBRACKET); for (int i = 0; ; i++) { ColumnSchema newcolumn = readRoutineParameter(routine, false); if (newcolumn.getName() == null) { throw super.unexpectedToken(); } table.addColumn(newcolumn); if (token.tokenType == Tokens.COMMA) { read(); } else { readThis(Tokens.CLOSEBRACKET); break; } } table.createPrimaryKey(); } private void readRoutineCharacteristics(Routine routine) { OrderedIntHashSet set = new OrderedIntHashSet(); boolean end = false; while (!end) { switch (token.tokenType) { case Tokens.LANGUAGE : { if (!set.add(Tokens.LANGUAGE)) { throw unexpectedToken(); } read(); if (token.tokenType == Tokens.JAVA) { read(); routine.setLanguage(Routine.LANGUAGE_JAVA); } else if (token.tokenType == Tokens.SQL) { read(); routine.setLanguage(Routine.LANGUAGE_SQL); } else { throw unexpectedToken(); } break; } case Tokens.PARAMETER : { if (!set.add(Tokens.PARAMETER)) { throw unexpectedToken(); } read(); readThis(Tokens.STYLE); if (token.tokenType == Tokens.JAVA) { read(); routine.setParameterStyle(Routine.PARAM_STYLE_JAVA); } else { readThis(Tokens.SQL); routine.setParameterStyle(Routine.PARAM_STYLE_SQL); } break; } case Tokens.SPECIFIC : { if (!set.add(Tokens.SPECIFIC)) { throw unexpectedToken(); } read(); HsqlName name = readNewSchemaObjectName(SchemaObject.SPECIFIC_ROUTINE, false); routine.setSpecificName(name); break; } case Tokens.DETERMINISTIC : { if (!set.add(Tokens.DETERMINISTIC)) { throw unexpectedToken(); } read(); routine.setDeterministic(true); break; } case Tokens.NOT : { if (!set.add(Tokens.DETERMINISTIC)) { throw unexpectedToken(); } read(); readThis(Tokens.DETERMINISTIC); routine.setDeterministic(false); break; } case Tokens.MODIFIES : { if (!set.add(Tokens.SQL)) { throw unexpectedToken(); } if (routine.getType() == SchemaObject.FUNCTION) { throw unexpectedToken(); } read(); readThis(Tokens.SQL); readThis(Tokens.DATA); routine.setDataImpact(Routine.MODIFIES_SQL); break; } case Tokens.NO : { if (!set.add(Tokens.SQL)) { throw unexpectedToken(); } read(); readThis(Tokens.SQL); routine.setDataImpact(Routine.NO_SQL); break; } case Tokens.READS : { if (!set.add(Tokens.SQL)) { throw unexpectedToken(); } read(); readThis(Tokens.SQL); readThis(Tokens.DATA); routine.setDataImpact(Routine.READS_SQL); break; } case Tokens.CONTAINS : { if (!set.add(Tokens.SQL)) { throw unexpectedToken(); } read(); readThis(Tokens.SQL); routine.setDataImpact(Routine.CONTAINS_SQL); break; } case Tokens.RETURNS : { if (!set.add(Tokens.NULL) || routine.isProcedure()) { throw unexpectedToken(); } if (routine.isAggregate()) { throw Error.error(ErrorCode.X_42604, token.tokenString); } read(); readThis(Tokens.NULL); readThis(Tokens.ON); readThis(Tokens.NULL); readThis(Tokens.INPUT); routine.setNullInputOutput(true); break; } case Tokens.CALLED : { if (!set.add(Tokens.NULL) || routine.isProcedure()) { throw unexpectedToken(); } read(); readThis(Tokens.ON); readThis(Tokens.NULL); readThis(Tokens.INPUT); routine.setNullInputOutput(false); break; } case Tokens.DYNAMIC : { if (!set.add(Tokens.RESULT) || routine.isFunction()) { throw unexpectedToken(); } read(); readThis(Tokens.RESULT); readThis(Tokens.SETS); int results = readInteger(); if (results < 0 || results > 16) { throw Error.error(ErrorCode.X_42604, String.valueOf(results)); } routine.setMaxDynamicResults(results); break; } case Tokens.NEW : { if (routine.getType() == SchemaObject.FUNCTION || !set.add(Tokens.SAVEPOINT)) { throw unexpectedToken(); } read(); readThis(Tokens.SAVEPOINT); readThis(Tokens.LEVEL); routine.setNewSavepointLevel(true); break; } case Tokens.OLD : { if (routine.getType() == SchemaObject.FUNCTION || !set.add(Tokens.SAVEPOINT)) { throw unexpectedToken(); } read(); readThis(Tokens.SAVEPOINT); readThis(Tokens.LEVEL); routine.setNewSavepointLevel(false); throw super.unsupportedFeature(Tokens.T_OLD); // break; } default : end = true; break; } } } void readRoutineBody(Routine routine) { if (token.tokenType == Tokens.EXTERNAL) { if (routine.getLanguage() != Routine.LANGUAGE_JAVA) { throw unexpectedToken(); } read(); readThis(Tokens.NAME); checkIsValue(Types.SQL_CHAR); routine.setMethodURL((String) token.tokenValue); read(); if (token.tokenType == Tokens.PARAMETER) { read(); readThis(Tokens.STYLE); readThis(Tokens.JAVA); } } else { startRecording(); Statement statement = compileSQLProcedureStatementOrNull(routine, null); if (statement == null) { throw unexpectedToken(); } Token[] tokenisedStatement = getRecordedStatement(); String sql = Token.getSQL(tokenisedStatement); statement.setSQL(sql); routine.setProcedure(statement); } } /* ::= | SET (,,,) = (,,,) or SET a = b */ private Object[] readLocalDeclarationList(Routine routine, StatementCompound context) { HsqlArrayList list = new HsqlArrayList(); final int table = 0; final int variableOrCondition = 1; final int cursor = 2; final int handler = 3; int objectType = table; RangeGroup[] rangeGroups = new RangeGroup[1]; rangeGroups[0] = context == null ? routine : context; compileContext.setOuterRanges(rangeGroups); while (token.tokenType == Tokens.DECLARE) { Object var = null; if (objectType == table) { var = readLocalTableVariableDeclarationOrNull(routine); if (var == null) { objectType = variableOrCondition; } else { list.add(var); readThis(Tokens.SEMICOLON); } } else if (objectType == variableOrCondition) { var = readLocalVariableDeclarationOrNull(); if (var == null) { objectType = cursor; } else { list.addAll((Object[]) var); } } else if (objectType == cursor) { var = compileDeclareCursor(rangeGroups, true); if (var == null) { objectType = handler; } else { list.add(var); readThis(Tokens.SEMICOLON); } } else if (objectType == handler) { var = compileLocalHandlerDeclaration(routine, context); list.add(var); } } Object[] declarations = new Object[list.size()]; list.toArray(declarations); return declarations; } Table readLocalTableVariableDeclarationOrNull(Routine routine) { int position = super.getPosition(); readThis(Tokens.DECLARE); if (token.tokenType == Tokens.TABLE) { read(); HsqlName name = super.readNewSchemaObjectName(SchemaObject.TABLE, false); name.schema = SqlInvariants.MODULE_HSQLNAME; Table table = new Table(database, name, TableBase.FUNCTION_TABLE); readTableDefinition(routine, table); return table; } else { rewind(position); return null; } } ColumnSchema[] readLocalVariableDeclarationOrNull() { int position = super.getPosition(); Type type; HsqlName[] names = HsqlName.emptyArray; try { readThis(Tokens.DECLARE); if (isReservedKey()) { rewind(position); return null; } while (true) { names = (HsqlName[]) ArrayUtil.resizeArray(names, names.length + 1); names[names.length - 1] = super.readNewSchemaObjectName(SchemaObject.VARIABLE, false); if (token.tokenType == Tokens.COMMA) { read(); } else { break; } } type = readTypeDefinition(false, true); } catch (HsqlException e) { // may be cursor rewind(position); return null; } Expression def = null; if (token.tokenType == Tokens.DEFAULT) { read(); def = readDefaultClause(type); } ColumnSchema[] variable = new ColumnSchema[names.length]; for (int i = 0; i < names.length; i++) { variable[i] = new ColumnSchema(names[i], type, true, false, def); variable[i].setParameterMode( SchemaObject.ParameterModes.PARAM_INOUT); } readThis(Tokens.SEMICOLON); return variable; } private StatementHandler compileLocalHandlerDeclaration(Routine routine, StatementCompound context) { int handlerType; readThis(Tokens.DECLARE); switch (token.tokenType) { case Tokens.CONTINUE : read(); handlerType = StatementHandler.CONTINUE; break; case Tokens.EXIT : read(); handlerType = StatementHandler.EXIT; break; case Tokens.UNDO : read(); handlerType = StatementHandler.UNDO; break; default : throw unexpectedToken(); } readThis(Tokens.HANDLER); readThis(Tokens.FOR); StatementHandler handler = new StatementHandler(handlerType); boolean end = false; boolean start = true; while (!end) { int conditionType = StatementHandler.NONE; switch (token.tokenType) { case Tokens.COMMA : if (start) { throw unexpectedToken(); } read(); start = true; break; case Tokens.SQLSTATE : conditionType = StatementHandler.SQL_STATE; // fall through case Tokens.SQLEXCEPTION : if (conditionType == StatementHandler.NONE) { conditionType = StatementHandler.SQL_EXCEPTION; } // fall through case Tokens.SQLWARNING : if (conditionType == StatementHandler.NONE) { conditionType = StatementHandler.SQL_WARNING; } // fall through case Tokens.NOT : if (conditionType == StatementHandler.NONE) { conditionType = StatementHandler.SQL_NOT_FOUND; } if (!start) { throw unexpectedToken(); } start = false; read(); if (conditionType == StatementHandler.SQL_NOT_FOUND) { readThis(Tokens.FOUND); } else if (conditionType == StatementHandler.SQL_STATE) { String sqlState = parseSQLStateValue(); handler.addConditionState(sqlState); break; } handler.addConditionType(conditionType); break; default : if (start) { throw unexpectedToken(); } end = true; break; } } if (token.tokenType == Tokens.SEMICOLON) { read(); } else { Statement e = compileSQLProcedureStatementOrNull(routine, context); if (e == null) { throw unexpectedToken(); } readThis(Tokens.SEMICOLON); handler.addStatement(e); } return handler; } String parseSQLStateValue() { readIfThis(Tokens.VALUE); checkIsValue(Types.SQL_CHAR); String sqlState = token.tokenString; if (token.tokenString.length() != 5) { throw Error.error(ErrorCode.X_42607); } read(); return sqlState; } private Statement compileCompoundStatement(Routine routine, StatementCompound context, HsqlName label) { final boolean atomic = true; readThis(Tokens.BEGIN); readThis(Tokens.ATOMIC); StatementCompound statement = new StatementCompound(StatementTypes.BEGIN_END, label); statement.setAtomic(atomic); statement.setRoot(routine); statement.setParent(context); Object[] declarations = readLocalDeclarationList(routine, context); statement.setLocalDeclarations(declarations); session.sessionContext.pushRoutineTables(statement.scopeTables); try { Statement[] statements = compileSQLProcedureStatementList(routine, statement); statement.setStatements(statements); } finally { session.sessionContext.popRoutineTables(); } readThis(Tokens.END); if (isSimpleName() && !isReservedKey()) { if (label == null) { throw unexpectedToken(); } if (!label.name.equals(token.tokenString)) { throw Error.error(ErrorCode.X_42508, token.tokenString); } read(); } return statement; } private Statement[] compileSQLProcedureStatementList(Routine routine, StatementCompound context) { Statement e; HsqlArrayList list = new HsqlArrayList(); while (true) { e = compileSQLProcedureStatementOrNull(routine, context); if (e == null) { break; } readThis(Tokens.SEMICOLON); list.add(e); } if (list.size() == 0) { throw unexpectedToken(); } Statement[] statements = new Statement[list.size()]; list.toArray(statements); return statements; } Statement compileSQLProcedureStatementOrNull(Routine routine, StatementCompound context) { Statement cs = null; HsqlName label = null; RangeGroup rangeGroup = context == null ? routine : context; RangeVariable[] rangeVariables = rangeGroup.getRangeVariables(); RangeGroup[] rangeGroups = new RangeGroup[]{ rangeGroup }; if (!routine.isTrigger() && isSimpleName() && !isReservedKey()) { label = readNewSchemaObjectName(SchemaObject.LABEL, false); // todo - improved error message if (token.tokenType != Tokens.COLON) { throw unexpectedToken(label.getNameString()); } readThis(Tokens.COLON); } compileContext.reset(); HsqlName oldSchema = session.getCurrentSchemaHsqlName(); session.setCurrentSchemaHsqlName(routine.getSchemaName()); try { switch (token.tokenType) { // data case Tokens.OPEN : { if (routine.dataImpact == Routine.CONTAINS_SQL) { throw Error.error(ErrorCode.X_42602, routine.getDataImpactString()); } if (label != null) { throw unexpectedToken(); } cs = compileOpenCursorStatement(context); break; } case Tokens.SELECT : { if (label != null) { throw unexpectedToken(); } cs = compileSelectSingleRowStatement(rangeGroups); break; } // data change case Tokens.INSERT : if (label != null) { throw unexpectedToken(); } cs = compileInsertStatement(rangeGroups); break; case Tokens.UPDATE : if (label != null) { throw unexpectedToken(); } cs = compileUpdateStatement(rangeGroups); break; case Tokens.DELETE : if (label != null) { throw unexpectedToken(); } cs = compileDeleteStatement(rangeGroups); break; case Tokens.TRUNCATE : if (label != null) { throw unexpectedToken(); } cs = compileTruncateStatement(); break; case Tokens.MERGE : if (label != null) { throw unexpectedToken(); } cs = compileMergeStatement(rangeGroups); break; case Tokens.SET : if (label != null) { throw unexpectedToken(); } if (routine.isTrigger()) { if (routine.triggerType == TriggerDef.BEFORE && routine.triggerOperation != StatementTypes.DELETE_WHERE) { int position = super.getPosition(); try { cs = compileTriggerSetStatement( routine.triggerTable, rangeGroups); break; } catch (HsqlException e) { rewind(position); cs = compileSetStatement(rangeVariables); } } else { cs = compileSetStatement(rangeVariables); } ((StatementSet) cs).checkIsNotColumnTarget(); } else { cs = compileSetStatement(rangeVariables); } break; case Tokens.GET : if (label != null) { throw unexpectedToken(); } cs = this.compileGetStatement(rangeVariables); break; // control case Tokens.CALL : { if (label != null) { throw unexpectedToken(); } cs = compileCallStatement(rangeGroups, true); Routine proc = ((StatementProcedure) cs).procedure; if (proc != null) { switch (routine.dataImpact) { case Routine.CONTAINS_SQL : { if (proc.dataImpact == Routine.READS_SQL || proc.dataImpact == Routine.MODIFIES_SQL) { throw Error.error( ErrorCode.X_42602, routine.getDataImpactString()); } break; } case Routine.READS_SQL : { if (proc.dataImpact == Routine.MODIFIES_SQL) { throw Error.error( ErrorCode.X_42602, routine.getDataImpactString()); } break; } } } break; } case Tokens.RETURN : { if (routine.isTrigger() || label != null) { throw unexpectedToken(); } read(); cs = compileReturnValue(routine, context); break; } case Tokens.BEGIN : { cs = compileCompoundStatement(routine, context, label); break; } case Tokens.WHILE : { if (routine.isTrigger()) { throw unexpectedToken(); } cs = compileWhile(routine, context, label); break; } case Tokens.REPEAT : { cs = compileRepeat(routine, context, label); break; } case Tokens.LOOP : { cs = compileLoop(routine, context, label); break; } case Tokens.FOR : { cs = compileFor(routine, context, label); break; } case Tokens.ITERATE : { if (label != null) { throw unexpectedToken(); } cs = compileIterate(); break; } case Tokens.LEAVE : { if (label != null) { throw unexpectedToken(); } cs = compileLeave(routine, context); break; } case Tokens.IF : { cs = compileIf(routine, context); break; } case Tokens.CASE : { cs = compileCase(routine, context); break; } case Tokens.SIGNAL : { cs = compileSignal(routine, context, label); break; } case Tokens.RESIGNAL : { cs = compileResignal(routine, context, label); break; } default : return null; } cs.setRoot(routine); cs.setParent(context); return cs; } finally { session.setCurrentSchemaHsqlName(oldSchema); } } private Statement compileReturnValue(Routine routine, StatementCompound context) { RangeGroup[] rangeGroups = new RangeGroup[1]; rangeGroups[0] = context == null ? routine : context; compileContext.setOuterRanges(rangeGroups); Expression e = XreadValueExpressionOrNull(); if (e == null) { checkIsValue(); if (token.tokenValue == null) { e = new ExpressionValue(null, null); } } resolveOuterReferencesAndTypes(routine, context, e); if (routine.isProcedure()) { throw Error.error(ErrorCode.X_42602); } return new StatementExpression(session, compileContext, StatementTypes.RETURN, e); } private Statement compileIterate() { readThis(Tokens.ITERATE); HsqlName label = readNewSchemaObjectName(SchemaObject.LABEL, false); return new StatementSimple(StatementTypes.ITERATE, label); } private Statement compileLeave(Routine routine, StatementCompound context) { readThis(Tokens.LEAVE); HsqlName label = readNewSchemaObjectName(SchemaObject.LABEL, false); return new StatementSimple(StatementTypes.LEAVE, label); } private Statement compileWhile(Routine routine, StatementCompound context, HsqlName label) { readThis(Tokens.WHILE); Expression e = XreadBooleanValueExpression(); resolveOuterReferencesAndTypes(routine, context, e); StatementExpression condition = new StatementExpression(session, compileContext, StatementTypes.CONDITION, e); readThis(Tokens.DO); Statement[] statements = compileSQLProcedureStatementList(routine, context); readThis(Tokens.END); readThis(Tokens.WHILE); if (isSimpleName() && !isReservedKey()) { if (label == null) { throw unexpectedToken(); } if (!label.name.equals(token.tokenString)) { throw Error.error(ErrorCode.X_42508, token.tokenString); } read(); } StatementCompound statement = new StatementCompound(StatementTypes.WHILE, label); statement.setStatements(statements); statement.setCondition(condition); return statement; } private Statement compileRepeat(Routine routine, StatementCompound context, HsqlName label) { readThis(Tokens.REPEAT); Statement[] statements = compileSQLProcedureStatementList(routine, context); readThis(Tokens.UNTIL); Expression e = XreadBooleanValueExpression(); resolveOuterReferencesAndTypes(routine, context, e); StatementExpression condition = new StatementExpression(session, compileContext, StatementTypes.CONDITION, e); readThis(Tokens.END); readThis(Tokens.REPEAT); if (isSimpleName() && !isReservedKey()) { if (label == null) { throw unexpectedToken(); } if (!label.name.equals(token.tokenString)) { throw Error.error(ErrorCode.X_42508, token.tokenString); } read(); } StatementCompound statement = new StatementCompound(StatementTypes.REPEAT, label); statement.setStatements(statements); statement.setCondition(condition); return statement; } private Statement compileLoop(Routine routine, StatementCompound context, HsqlName label) { readThis(Tokens.LOOP); Statement[] statements = compileSQLProcedureStatementList(routine, context); readThis(Tokens.END); readThis(Tokens.LOOP); if (isSimpleName() && !isReservedKey()) { if (label == null) { throw unexpectedToken(); } if (!label.name.equals(token.tokenString)) { throw Error.error(ErrorCode.X_42508, token.tokenString); } read(); } StatementCompound result = new StatementCompound(StatementTypes.LOOP, label); result.setStatements(statements); return result; } private Statement compileFor(Routine routine, StatementCompound context, HsqlName label) { RangeGroup[] rangeGroups = new RangeGroup[1]; rangeGroups[0] = context == null ? routine : context; compileContext.setOuterRanges(rangeGroups); readThis(Tokens.FOR); StatementQuery cursorStatement = compileCursorSpecification(rangeGroups, ResultProperties.defaultPropsValue, false); readThis(Tokens.DO); StatementCompound forStatement = new StatementCompound(StatementTypes.FOR, label); forStatement.setAtomic(true); forStatement.setRoot(routine); forStatement.setParent(context); forStatement.setLoopStatement(cursorStatement); Statement[] statements = compileSQLProcedureStatementList(routine, forStatement); readThis(Tokens.END); readThis(Tokens.FOR); if (isSimpleName() && !isReservedKey()) { if (label == null) { throw unexpectedToken(); } if (!label.name.equals(token.tokenString)) { throw Error.error(ErrorCode.X_42508, token.tokenString); } read(); } forStatement.setStatements(statements); return forStatement; } private Statement compileIf(Routine routine, StatementCompound context) { HsqlArrayList list = new HsqlArrayList(); readThis(Tokens.IF); Expression e = XreadBooleanValueExpression(); resolveOuterReferencesAndTypes(routine, context, e); Statement statement = new StatementExpression(session, compileContext, StatementTypes.CONDITION, e); list.add(statement); readThis(Tokens.THEN); Statement[] statements = compileSQLProcedureStatementList(routine, context); for (int i = 0; i < statements.length; i++) { list.add(statements[i]); } while (token.tokenType == Tokens.ELSEIF) { read(); e = XreadBooleanValueExpression(); resolveOuterReferencesAndTypes(routine, context, e); statement = new StatementExpression(session, compileContext, StatementTypes.CONDITION, e); list.add(statement); readThis(Tokens.THEN); statements = compileSQLProcedureStatementList(routine, context); for (int i = 0; i < statements.length; i++) { list.add(statements[i]); } } if (token.tokenType == Tokens.ELSE) { read(); e = Expression.EXPR_TRUE; statement = new StatementExpression(session, compileContext, StatementTypes.CONDITION, e); list.add(statement); statements = compileSQLProcedureStatementList(routine, context); for (int i = 0; i < statements.length; i++) { list.add(statements[i]); } } readThis(Tokens.END); readThis(Tokens.IF); statements = new Statement[list.size()]; list.toArray(statements); StatementCompound result = new StatementCompound(StatementTypes.IF, null); result.setStatements(statements); return result; } private Statement compileCase(Routine routine, StatementCompound context) { HsqlArrayList list = new HsqlArrayList(); Expression condition = null; Statement statement; Statement[] statements; readThis(Tokens.CASE); if (token.tokenType == Tokens.WHEN) { list = readCaseWhen(routine, context); } else { list = readSimpleCaseWhen(routine, context); } if (token.tokenType == Tokens.ELSE) { read(); condition = Expression.EXPR_TRUE; statement = new StatementExpression(session, compileContext, StatementTypes.CONDITION, condition); list.add(statement); statements = compileSQLProcedureStatementList(routine, context); for (int i = 0; i < statements.length; i++) { list.add(statements[i]); } } readThis(Tokens.END); readThis(Tokens.CASE); statements = new Statement[list.size()]; list.toArray(statements); StatementCompound result = new StatementCompound(StatementTypes.IF, null); result.setStatements(statements); return result; } private HsqlArrayList readSimpleCaseWhen(Routine routine, StatementCompound context) { HsqlArrayList list = new HsqlArrayList(); Expression condition = null; Statement statement; Statement[] statements; Expression predicand = XreadRowValuePredicand(); do { readThis(Tokens.WHEN); do { Expression newCondition = XreadPredicateRightPart(predicand); if (predicand == newCondition) { newCondition = new ExpressionLogical(predicand, XreadRowValuePredicand()); } resolveOuterReferencesAndTypes(routine, context, newCondition); if (condition == null) { condition = newCondition; } else { condition = new ExpressionLogical(OpTypes.OR, condition, newCondition); } if (token.tokenType == Tokens.COMMA) { read(); } else { break; } } while (true); statement = new StatementExpression(session, compileContext, StatementTypes.CONDITION, condition); list.add(statement); readThis(Tokens.THEN); statements = compileSQLProcedureStatementList(routine, context); for (int i = 0; i < statements.length; i++) { list.add(statements[i]); } if (token.tokenType != Tokens.WHEN) { break; } } while (true); return list; } private HsqlArrayList readCaseWhen(Routine routine, StatementCompound context) { HsqlArrayList list = new HsqlArrayList(); Expression condition = null; Statement statement; Statement[] statements; do { readThis(Tokens.WHEN); condition = XreadBooleanValueExpression(); resolveOuterReferencesAndTypes(routine, context, condition); statement = new StatementExpression(session, compileContext, StatementTypes.CONDITION, condition); list.add(statement); readThis(Tokens.THEN); statements = compileSQLProcedureStatementList(routine, context); for (int i = 0; i < statements.length; i++) { list.add(statements[i]); } if (token.tokenType != Tokens.WHEN) { break; } } while (true); return list; } private Statement compileSignal(Routine routine, StatementCompound context, HsqlName label) { String sqlState; String message = null; readThis(Tokens.SIGNAL); readThis(Tokens.SQLSTATE); sqlState = parseSQLStateValue(); if (readIfThis(Tokens.SET)) { readThis(Tokens.MESSAGE_TEXT); readThis(Tokens.EQUALS); message = readQuotedString(); } StatementSimple cs = new StatementSimple(StatementTypes.SIGNAL, sqlState, message); return cs; } private Statement compileResignal(Routine routine, StatementCompound context, HsqlName label) { String sqlState = null; String message = null; readThis(Tokens.RESIGNAL); if (readIfThis(Tokens.SQLSTATE)) { sqlState = parseSQLStateValue(); if (readIfThis(Tokens.SET)) { readThis(Tokens.MESSAGE_TEXT); readThis(Tokens.EQUALS); message = readQuotedString(); } } StatementSimple cs = new StatementSimple(StatementTypes.RESIGNAL, sqlState, message); return cs; } private ColumnSchema readRoutineParameter(Routine routine, boolean isParam) { HsqlName hsqlName = null; byte parameterMode = SchemaObject.ParameterModes.PARAM_IN; if (isParam) { switch (token.tokenType) { case Tokens.IN : read(); break; case Tokens.OUT : if (routine.getType() != SchemaObject.PROCEDURE) { throw unexpectedToken(); } read(); parameterMode = SchemaObject.ParameterModes.PARAM_OUT; break; case Tokens.INOUT : if (routine.getType() != SchemaObject.PROCEDURE) { if (!routine.isAggregate()) { throw unexpectedToken(); } } read(); parameterMode = SchemaObject.ParameterModes.PARAM_INOUT; break; default : } } if (!isReservedKey()) { hsqlName = readNewDependentSchemaObjectName(routine.getName(), SchemaObject.PARAMETER); } Type typeObject = readTypeDefinition(false, true); ColumnSchema column = new ColumnSchema(hsqlName, typeObject, true, false, null); if (isParam) { column.setParameterMode(parameterMode); } return column; } void resolveOuterReferencesAndTypes(Routine routine, StatementCompound context, Expression e) { RangeGroup rangeGroup = context == null ? routine : context; resolveOuterReferencesAndTypes(new RangeGroup[]{ rangeGroup }, e); } void resolveOuterReferencesAndTypes(RangeVariable[] rangeVars, Expression e) { RangeGroup rangeGroup = new RangeGroupSimple(rangeVars); resolveOuterReferencesAndTypes(new RangeGroup[]{ rangeGroup }, e); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/0000755000175000017500000000000012007570424020076 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowInputTextLog.java0000644000175000017500000003364312007547364024057 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.io.IOException; import java.math.BigDecimal; import java.util.Calendar; import java.util.GregorianCalendar; import org.hsqldb.HsqlDateTime; import org.hsqldb.HsqlException; import org.hsqldb.Scanner; import org.hsqldb.Tokens; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.scriptio.ScriptReaderBase; import org.hsqldb.store.ValuePool; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobData; import org.hsqldb.types.BlobDataID; import org.hsqldb.types.ClobData; import org.hsqldb.types.ClobDataID; import org.hsqldb.types.DateTimeType; import org.hsqldb.types.IntervalMonthData; import org.hsqldb.types.IntervalSecondData; import org.hsqldb.types.IntervalType; import org.hsqldb.types.JavaObjectData; import org.hsqldb.types.NumberType; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; /** * Class for reading the data for a database row from the script file. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.3 */ public class RowInputTextLog extends RowInputBase implements RowInputInterface { Scanner scanner; String tableName = null; String schemaName = null; int statementType; Object value; boolean version18; boolean noSeparators; Calendar tempCalDefault = new GregorianCalendar(); public RowInputTextLog() { super(new byte[0]); scanner = new Scanner(); } public RowInputTextLog(boolean version18) { super(new byte[0]); scanner = new Scanner(); this.version18 = version18; } public void setSource(String text) { scanner.reset(text); statementType = ScriptReaderBase.ANY_STATEMENT; scanner.scanNext(); String s = scanner.getString(); if (s.equals(Tokens.T_INSERT)) { statementType = ScriptReaderBase.INSERT_STATEMENT; scanner.scanNext(); scanner.scanNext(); tableName = scanner.getString(); scanner.scanNext(); } else if (s.equals(Tokens.T_DELETE)) { statementType = ScriptReaderBase.DELETE_STATEMENT; scanner.scanNext(); scanner.scanNext(); tableName = scanner.getString(); } else if (s.equals(Tokens.T_COMMIT)) { statementType = ScriptReaderBase.COMMIT_STATEMENT; } else if (s.equals(Tokens.T_SET)) { scanner.scanNext(); if (Tokens.T_SCHEMA.equals(scanner.getString())) { scanner.scanNext(); schemaName = scanner.getString(); statementType = ScriptReaderBase.SET_SCHEMA_STATEMENT; } } } public int getStatementType() { return statementType; } public String getTableName() { return tableName; } public String getSchemaName() { return schemaName; } protected void readField() { readFieldPrefix(); scanner.scanNext(); value = scanner.getValue(); } protected void readNumberField(Type type) { readFieldPrefix(); scanner.scanNext(); boolean minus = scanner.getTokenType() == Tokens.MINUS; if (minus) { scanner.scanNext(); } value = scanner.getValue(); if (minus) { try { value = ((NumberType) scanner.getDataType()).negate(value); } catch (HsqlException e) {} } } protected void readFieldPrefix() { if (!noSeparators) { scanner.scanNext(); if (statementType == ScriptReaderBase.DELETE_STATEMENT) { scanner.scanNext(); scanner.scanNext(); } } } public String readString() throws IOException { readField(); return (String) value; } public short readShort() throws IOException { throw Error.runtimeError(ErrorCode.U_S0500, ""); } public int readInt() throws IOException { throw Error.runtimeError(ErrorCode.U_S0500, ""); } public long readLong() throws IOException { throw Error.runtimeError(ErrorCode.U_S0500, ""); } public int readType() throws IOException { return 0; } protected boolean readNull() { // Return null on each column read instead. return false; } protected String readChar(Type type) throws IOException { readField(); return (String) value; } protected Integer readSmallint() throws IOException { readNumberField(Type.SQL_SMALLINT); return (Integer) value; } protected Integer readInteger() throws IOException { readNumberField(Type.SQL_INTEGER); if (value instanceof Long) { value = Type.SQL_INTEGER.convertToDefaultType(null, value); } return (Integer) value; } protected Long readBigint() throws IOException { readNumberField(Type.SQL_BIGINT); if (value == null) { return null; } if (value instanceof BigDecimal) { return (Long) Type.SQL_BIGINT.convertToDefaultType(null, value); } return ValuePool.getLong(((Number) value).longValue()); } protected Double readReal() throws IOException { readNumberField(Type.SQL_DOUBLE); if (value == null) { return null; } if (scanner.scanSpecialIdentifier(Tokens.T_DIVIDE)) { scanner.scanNext(); Object divisor = scanner.getValue(); double i = ((Number) divisor).doubleValue(); if (i == 0) { if (((Number) value).doubleValue() == 1E0) { i = Double.NEGATIVE_INFINITY; } else if (((Number) value).doubleValue() == -1E0) { i = Double.POSITIVE_INFINITY; } else if (((Number) value).doubleValue() == 0E0) { i = Double.NaN; } else { throw Error.error(ErrorCode.X_42584); } } else { throw Error.error(ErrorCode.X_42584); } value = Double.valueOf(i); } return (Double) value; } protected BigDecimal readDecimal(Type type) throws IOException { readNumberField(type); if (value == null) { return null; } BigDecimal bd = (BigDecimal) type.convertToDefaultType(null, value); return (BigDecimal) type.convertToTypeLimits(null, bd); } protected TimeData readTime(Type type) throws IOException { readField(); if (value == null) { return null; } if (version18) { java.sql.Time dateTime = java.sql.Time.valueOf((String) value); long millis = HsqlDateTime.convertMillisFromCalendar(tempCalDefault, dateTime.getTime()); millis = HsqlDateTime.getNormalisedTime(millis); return new TimeData((int) millis / 1000, 0, 0); } return scanner.newTime((String) value); } protected TimestampData readDate(Type type) throws IOException { readField(); if (value == null) { return null; } if (version18) { java.sql.Date dateTime = java.sql.Date.valueOf((String) value); long millis = HsqlDateTime.convertMillisFromCalendar(tempCalDefault, dateTime.getTime()); millis = HsqlDateTime.getNormalisedDate(millis); return new TimestampData(millis / 1000); } return scanner.newDate((String) value); } protected TimestampData readTimestamp(Type type) throws IOException { readField(); if (value == null) { return null; } if (version18) { java.sql.Timestamp dateTime = java.sql.Timestamp.valueOf((String) value); long millis = HsqlDateTime.convertMillisFromCalendar(tempCalDefault, dateTime.getTime()); int nanos = dateTime.getNanos(); nanos = ((DateTimeType) type).normaliseFraction(nanos, type.scale); return new TimestampData(millis / 1000, nanos, 0); } return scanner.newTimestamp((String) value); } protected IntervalMonthData readYearMonthInterval(Type type) throws IOException { readField(); if (value == null) { return null; } return (IntervalMonthData) scanner.newInterval((String) value, (IntervalType) type); } protected IntervalSecondData readDaySecondInterval(Type type) throws IOException { readField(); if (value == null) { return null; } return (IntervalSecondData) scanner.newInterval((String) value, (IntervalType) type); } protected Boolean readBoole() throws IOException { readFieldPrefix(); scanner.scanNext(); String token = scanner.getString(); value = null; if (token.equalsIgnoreCase(Tokens.T_TRUE)) { value = Boolean.TRUE; } else if (token.equalsIgnoreCase(Tokens.T_FALSE)) { value = Boolean.FALSE; } return (Boolean) value; } protected Object readOther() throws IOException { readFieldPrefix(); if (scanner.scanNull()) { return null; } scanner.scanBinaryStringWithQuote(); if (scanner.getTokenType() == Tokens.X_MALFORMED_BINARY_STRING) { throw Error.error(ErrorCode.X_42587); } value = scanner.getValue(); return new JavaObjectData(((BinaryData) value).getBytes()); } protected BinaryData readBit() throws IOException { readFieldPrefix(); if (scanner.scanNull()) { return null; } scanner.scanBitStringWithQuote(); if (scanner.getTokenType() == Tokens.X_MALFORMED_BIT_STRING) { throw Error.error(ErrorCode.X_42587); } value = scanner.getValue(); return (BinaryData) value; } protected BinaryData readBinary() throws IOException { readFieldPrefix(); if (scanner.scanNull()) { return null; } scanner.scanBinaryStringWithQuote(); if (scanner.getTokenType() == Tokens.X_MALFORMED_BINARY_STRING) { throw Error.error(ErrorCode.X_42587); } value = scanner.getValue(); return (BinaryData) value; } protected ClobData readClob() throws IOException { readNumberField(Type.SQL_BIGINT); if (value == null) { return null; } long id = ((Number) value).longValue(); return new ClobDataID(id); } protected BlobData readBlob() throws IOException { readNumberField(Type.SQL_BIGINT); if (value == null) { return null; } long id = ((Number) value).longValue(); return new BlobDataID(id); } protected Object[] readArray(Type type) throws IOException { type = type.collectionBaseType(); readFieldPrefix(); scanner.scanNext(); String token = scanner.getString(); value = null; if (token.equalsIgnoreCase(Tokens.T_NULL)) { return null; } else if (!token.equalsIgnoreCase(Tokens.T_ARRAY)) { throw Error.error(ErrorCode.X_42584); } scanner.scanNext(); token = scanner.getString(); if (!token.equalsIgnoreCase(Tokens.T_LEFTBRACKET)) { throw Error.error(ErrorCode.X_42584); } HsqlArrayList list = new HsqlArrayList(); noSeparators = true; for (int i = 0; ; i++) { if (scanner.scanSpecialIdentifier(Tokens.T_RIGHTBRACKET)) { break; } if (i > 0) { if (!scanner.scanSpecialIdentifier(Tokens.T_COMMA)) { throw Error.error(ErrorCode.X_42584); } } Object value = readData(type); list.add(value); } noSeparators = false; Object[] data = new Object[list.size()]; list.toArray(data); return data; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowOutputText.java0000644000175000017500000002367612007547364023623 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import org.hsqldb.Row; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.StringConverter; import org.hsqldb.persist.TextFileSettings; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobData; import org.hsqldb.types.ClobData; import org.hsqldb.types.IntervalMonthData; import org.hsqldb.types.IntervalSecondData; import org.hsqldb.types.JavaObjectData; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Class for writing the data for a database row in text table format. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.0 */ public class RowOutputText extends RowOutputBase { protected String fieldSep; protected String varSep; protected String longvarSep; private boolean fieldSepEnd; private boolean varSepEnd; private boolean longvarSepEnd; private String nextSep = ""; private boolean nextSepEnd; protected boolean allQuoted; private String encoding; public RowOutputText(String fieldSep, String varSep, String longvarSep, boolean allQuoted, String encoding) { super(); initTextDatabaseRowOutput(fieldSep, varSep, longvarSep, allQuoted, encoding); } private void initTextDatabaseRowOutput(String fieldSep, String varSep, String longvarSep, boolean allQuoted, String encoding) { //-- Newline indicates that field should match to end of line. if (fieldSep.endsWith("\n")) { fieldSepEnd = true; fieldSep = fieldSep.substring(0, fieldSep.length() - 1); } if (varSep.endsWith("\n")) { varSepEnd = true; varSep = varSep.substring(0, varSep.length() - 1); } if (longvarSep.endsWith("\n")) { longvarSepEnd = true; longvarSep = longvarSep.substring(0, longvarSep.length() - 1); } this.fieldSep = fieldSep; this.varSep = varSep; this.longvarSep = longvarSep; this.allQuoted = allQuoted; this.encoding = encoding; } public void writeEnd() { // terminate at the end of row if (nextSepEnd) { writeBytes(nextSep); } writeBytes(TextFileSettings.NL); } public void writeSize(int size) { // initialise at the start of row nextSep = ""; nextSepEnd = false; } public void writeType(int type) { //--do Nothing } public void writeString(String s) { s = checkConvertString(s, fieldSep); // error if (s == null) { return; } // writeBytes(s); byte[] bytes = getBytes(s); write(bytes, 0, bytes.length); nextSep = fieldSep; nextSepEnd = fieldSepEnd; } protected void writeVarString(String s) { s = checkConvertString(s, varSep); if (s == null) { return; } // writeBytes(s); byte[] bytes = getBytes(s); write(bytes, 0, bytes.length); nextSep = varSep; nextSepEnd = varSepEnd; } protected void writeLongVarString(String s) { s = checkConvertString(s, longvarSep); if (s == null) { return; } // writeBytes(s); byte[] bytes = getBytes(s); write(bytes, 0, bytes.length); nextSep = longvarSep; nextSepEnd = longvarSepEnd; } protected String checkConvertString(String s, String sep) { if (s.indexOf('\n') != -1 || s.indexOf('\r') != -1) { throw new IllegalArgumentException( Error.getMessage(ErrorCode.TEXT_STRING_HAS_NEWLINE)); } else if (s.indexOf(sep) != -1) { return null; } return s; } private byte[] getBytes(String s) { byte[] bytes = null; try { bytes = s.getBytes(encoding); } catch (UnsupportedEncodingException e) { bytes = s.getBytes(); } return bytes; } protected void writeByteArray(byte[] b) { ensureRoom(b.length * 2); StringConverter.writeHexBytes(this.getBuffer(), count, b); count += b.length * 2; } public void writeShort(int i) { writeInt(i); } public void writeInt(int i) { writeBytes(Integer.toString(i)); nextSep = fieldSep; nextSepEnd = fieldSepEnd; } public void writeIntData(int i, int position) { throw Error.runtimeError(ErrorCode.U_S0500, "RowOutputText"); } public void writeLong(long i) { throw Error.runtimeError(ErrorCode.U_S0500, "RowOutputText"); } // fredt@users - comment - methods used for writing each SQL type protected void writeFieldType(Type type) { writeBytes(nextSep); switch (type.typeCode) { case Types.SQL_VARCHAR : case Types.VARCHAR_IGNORECASE : nextSep = varSep; nextSepEnd = varSepEnd; break; default : nextSep = fieldSep; nextSepEnd = fieldSepEnd; break; } } protected void writeNull(Type type) { writeFieldType(type); } protected void writeChar(String s, Type t) { switch (t.typeCode) { case Types.SQL_CHAR : writeString(s); return; case Types.SQL_VARCHAR : case Types.VARCHAR_IGNORECASE : writeVarString(s); return; default : writeLongVarString(s); return; } } protected void writeSmallint(Number o) { writeString(o.toString()); } protected void writeInteger(Number o) { writeString(o.toString()); } protected void writeBigint(Number o) { writeString(o.toString()); } protected void writeReal(Double o) { writeString(o.toString()); } protected void writeDecimal(BigDecimal o, Type type) { writeString(type.convertToString(o)); } protected void writeBoolean(Boolean o) { writeString(o.toString()); } protected void writeDate(TimestampData o, Type type) { writeString(type.convertToString(o)); } protected void writeTime(TimeData o, Type type) { writeString(type.convertToString(o)); } protected void writeTimestamp(TimestampData o, Type type) { writeString(type.convertToString(o)); } protected void writeYearMonthInterval(IntervalMonthData o, Type type) { this.writeBytes(type.convertToString(o)); } protected void writeDaySecondInterval(IntervalSecondData o, Type type) { this.writeBytes(type.convertToString(o)); } protected void writeOther(JavaObjectData o) { byte[] ba = o.getBytes(); writeByteArray(ba); } protected void writeBit(BinaryData o) { String s = StringConverter.byteArrayToBitString(o.getBytes(), (int) o.bitLength(null)); writeString(s); } protected void writeBinary(BinaryData o) { writeByteArray(o.getBytes()); } protected void writeClob(ClobData o, Type type) { writeString(Long.toString(o.getId())); } protected void writeBlob(BlobData o, Type type) { writeString(Long.toString(o.getId())); } protected void writeArray(Object[] o, Type type) { throw Error.runtimeError(ErrorCode.U_S0500, "RowOutputText"); } public int getSize(Row row) { reset(); try { writeSize(0); writeData(row, row.getTable().getColumnTypes()); writeEnd(); } catch (Exception e) { reset(); // throw Error.error(ErrorCode.FILE_IO_ERROR, e.toString()); } int rowsize = size(); reset(); return rowsize; } public int getStorageSize(int size) { return size; } public RowOutputInterface duplicate() { throw Error.runtimeError(ErrorCode.U_S0500, "RowOutputText"); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowOutputTextLog.java0000644000175000017500000001755312007547362024260 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import org.hsqldb.Row; import org.hsqldb.Tokens; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.StringConverter; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobData; import org.hsqldb.types.ClobData; import org.hsqldb.types.IntervalMonthData; import org.hsqldb.types.IntervalSecondData; import org.hsqldb.types.JavaObjectData; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @since 2.0.0 * @version 1.7.2 */ public class RowOutputTextLog extends RowOutputBase { static byte[] BYTES_NULL; static byte[] BYTES_TRUE; static byte[] BYTES_FALSE; static byte[] BYTES_AND; static byte[] BYTES_IS; static byte[] BYTES_ARRAY; static { try { BYTES_NULL = Tokens.T_NULL.getBytes("ISO-8859-1"); BYTES_TRUE = Tokens.T_TRUE.getBytes("ISO-8859-1"); BYTES_FALSE = Tokens.T_FALSE.getBytes("ISO-8859-1"); BYTES_AND = " AND ".getBytes("ISO-8859-1"); BYTES_IS = " IS ".getBytes("ISO-8859-1"); BYTES_ARRAY = " ARRAY[".getBytes("ISO-8859-1"); } catch (UnsupportedEncodingException e) { Error.runtimeError(ErrorCode.U_S0500, "RowOutputTextLog"); } } public static final int MODE_DELETE = 1; public static final int MODE_INSERT = 0; private boolean isWritten; private int logMode; private boolean noSeparators; public void setMode(int mode) { logMode = mode; } protected void writeFieldPrefix() { if (!noSeparators) { if (logMode == MODE_DELETE && isWritten) { write(BYTES_AND); } } } protected void writeChar(String s, Type t) { write('\''); StringConverter.stringToUnicodeBytes(this, s, true); write('\''); } protected void writeReal(Double o) { writeBytes(Type.SQL_DOUBLE.convertToSQLString(o)); } protected void writeSmallint(Number o) { this.writeBytes(o.toString()); } public void writeEnd() {} protected void writeBit(BinaryData o) { ensureRoom((int) (o.length(null) * 8 + 2)); write('\''); String s = StringConverter.byteArrayToBitString(o.getBytes(), (int) o.bitLength(null)); writeBytes(s); write('\''); } protected void writeBinary(BinaryData o) { ensureRoom((int) (o.length(null) * 2 + 2)); write('\''); StringConverter.writeHexBytes(getBuffer(), count, o.getBytes()); count += (o.length(null) * 2); write('\''); } protected void writeClob(ClobData o, Type type) { writeBytes(Long.toString(o.getId())); } protected void writeBlob(BlobData o, Type type) { writeBytes(Long.toString(o.getId())); } protected void writeArray(Object[] o, Type type) { type = type.collectionBaseType(); noSeparators = true; write(BYTES_ARRAY); for (int i = 0; i < o.length; i++) { if (i > 0) { write(','); } writeData(type, o[i]); } write(']'); noSeparators = false; } public void writeType(int type) {} public void writeSize(int size) {} public int getSize(Row row) { return 0; } public int getStorageSize(int size) { return size; } protected void writeInteger(Number o) { this.writeBytes(o.toString()); } protected void writeBigint(Number o) { this.writeBytes(o.toString()); } //fredt@users - patch 1108647 by nkowalcz@users (NataliaK) fix for IS NULL protected void writeNull(Type type) { if (!noSeparators) { if (logMode == MODE_DELETE) { write(BYTES_IS); } else if (isWritten) { write(','); } isWritten = true; } write(BYTES_NULL); } protected void writeOther(JavaObjectData o) { ensureRoom(o.getBytesLength() * 2 + 2); write('\''); StringConverter.writeHexBytes(getBuffer(), count, o.getBytes()); count += o.getBytesLength() * 2; write('\''); } public void writeString(String value) { StringConverter.stringToUnicodeBytes(this, value, false); } protected void writeBoolean(Boolean o) { write(o.booleanValue() ? BYTES_TRUE : BYTES_FALSE); } protected void writeDecimal(BigDecimal o, Type type) { writeBytes(type.convertToSQLString(o)); } protected void writeFieldType(Type type) { if (!noSeparators) { if (logMode == MODE_DELETE) { write('='); } else if (isWritten) { write(','); } isWritten = true; } } public void writeLong(long value) { this.writeBytes(Long.toString(value)); } public void writeIntData(int i, int position) {} protected void writeTime(TimeData o, Type type) { write('\''); writeBytes(type.convertToString(o)); write('\''); } protected void writeDate(TimestampData o, Type type) { write('\''); writeBytes(type.convertToString(o)); write('\''); } protected void writeTimestamp(TimestampData o, Type type) { write('\''); writeBytes(type.convertToString(o)); write('\''); } protected void writeYearMonthInterval(IntervalMonthData o, Type type) { write('\''); writeBytes(type.convertToString(o)); write('\''); } protected void writeDaySecondInterval(IntervalSecondData o, Type type) { write('\''); writeBytes(type.convertToString(o)); write('\''); } public void writeShort(int i) { writeBytes(Integer.toString(i)); } public void writeInt(int i) { writeBytes(Integer.toString(i)); } public void reset() { super.reset(); isWritten = false; } public RowOutputInterface duplicate() { throw Error.runtimeError(ErrorCode.U_S0500, "RowOutputText"); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowOutputBase.java0000644000175000017500000002312212007547364023533 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.math.BigDecimal; import org.hsqldb.ColumnSchema; import org.hsqldb.Row; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobData; import org.hsqldb.types.ClobData; import org.hsqldb.types.IntervalMonthData; import org.hsqldb.types.IntervalSecondData; import org.hsqldb.types.JavaObjectData; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Base class for writing the data for a database row in different formats. * Defines the methods that are independent of storage format and declares * the format-dependent methods that subclasses should define. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.0 */ abstract class RowOutputBase extends HsqlByteArrayOutputStream implements RowOutputInterface { public static final int CACHED_ROW_160 = 0; public static final int CACHED_ROW_170 = 1; // the last column in a table is an ID that should not be written to file protected boolean skipSystemId = false; /** * Constructor used for persistent storage of a Table row * * @exception IOException when an IO error is encountered */ public RowOutputBase() { super(); } /** * Constructor used for result sets * * @exception IOException when an IO error is encountered */ public RowOutputBase(int initialSize) { super(initialSize); } /** * Constructor used for network transmission of result sets * * @exception IOException when an IO error is encountered */ public RowOutputBase(byte[] buffer) { super(buffer); } // fredt@users - comment - methods for writing Result column type, name and data size public abstract void writeEnd(); public abstract void writeSize(int size); public abstract void writeType(int type); public abstract void writeIntData(int i, int position); public abstract void writeString(String s); // fredt@users - comment - methods used for writing each SQL type protected void writeFieldPrefix() {} protected abstract void writeFieldType(Type type); protected abstract void writeNull(Type type); protected abstract void writeChar(String s, Type t); protected abstract void writeSmallint(Number o); protected abstract void writeInteger(Number o); protected abstract void writeBigint(Number o); protected abstract void writeReal(Double o); protected abstract void writeDecimal(BigDecimal o, Type type); protected abstract void writeBoolean(Boolean o); protected abstract void writeDate(TimestampData o, Type type); protected abstract void writeTime(TimeData o, Type type); protected abstract void writeTimestamp(TimestampData o, Type type); protected abstract void writeYearMonthInterval(IntervalMonthData o, Type type); protected abstract void writeDaySecondInterval(IntervalSecondData o, Type type); protected abstract void writeOther(JavaObjectData o); protected abstract void writeBit(BinaryData o); protected abstract void writeBinary(BinaryData o); protected abstract void writeClob(ClobData o, Type type); protected abstract void writeBlob(BlobData o, Type type); protected abstract void writeArray(Object[] o, Type type); /** * This method is called to write data for a table row. */ public void writeData(Row row, Type[] types) { writeData(types.length, types, row.getData(), null, null); } /** * This method is called directly to write data for a delete statement. */ public void writeData(int l, Type[] types, Object[] data, HashMappedList cols, int[] primaryKeys) { boolean hasPK = primaryKeys != null && primaryKeys.length != 0; int limit = hasPK ? primaryKeys.length : l; for (int i = 0; i < limit; i++) { int j = hasPK ? primaryKeys[i] : i; Object o = data[j]; Type t = types[j]; if (cols != null) { ColumnSchema col = (ColumnSchema) cols.get(j); writeFieldPrefix(); writeString(col.getName().statementName); } writeData(t, o); } } public void writeData(Type t, Object o) { if (o == null) { writeNull(t); return; } writeFieldType(t); switch (t.typeCode) { case Types.SQL_ALL_TYPES : break; case Types.SQL_CHAR : case Types.SQL_VARCHAR : case Types.VARCHAR_IGNORECASE : writeChar((String) o, t); break; case Types.TINYINT : case Types.SQL_SMALLINT : writeSmallint((Number) o); break; case Types.SQL_INTEGER : writeInteger((Number) o); break; case Types.SQL_BIGINT : writeBigint((Number) o); break; case Types.SQL_REAL : case Types.SQL_FLOAT : case Types.SQL_DOUBLE : writeReal((Double) o); break; case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : writeDecimal((BigDecimal) o, t); break; case Types.SQL_BOOLEAN : writeBoolean((Boolean) o); break; case Types.SQL_DATE : writeDate((TimestampData) o, t); break; case Types.SQL_TIME : case Types.SQL_TIME_WITH_TIME_ZONE : writeTime((TimeData) o, t); break; case Types.SQL_TIMESTAMP : case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : writeTimestamp((TimestampData) o, t); break; case Types.SQL_INTERVAL_YEAR : case Types.SQL_INTERVAL_YEAR_TO_MONTH : case Types.SQL_INTERVAL_MONTH : writeYearMonthInterval((IntervalMonthData) o, t); break; case Types.SQL_INTERVAL_DAY : case Types.SQL_INTERVAL_DAY_TO_HOUR : case Types.SQL_INTERVAL_DAY_TO_MINUTE : case Types.SQL_INTERVAL_DAY_TO_SECOND : case Types.SQL_INTERVAL_HOUR : case Types.SQL_INTERVAL_HOUR_TO_MINUTE : case Types.SQL_INTERVAL_HOUR_TO_SECOND : case Types.SQL_INTERVAL_MINUTE : case Types.SQL_INTERVAL_MINUTE_TO_SECOND : case Types.SQL_INTERVAL_SECOND : writeDaySecondInterval((IntervalSecondData) o, t); break; case Types.OTHER : writeOther((JavaObjectData) o); break; case Types.SQL_BLOB : writeBlob((BlobData) o, t); break; case Types.SQL_CLOB : writeClob((ClobData) o, t); break; case Types.SQL_ARRAY : writeArray((Object[]) o, t); break; case Types.SQL_BINARY : case Types.SQL_VARBINARY : writeBinary((BinaryData) o); break; case Types.SQL_BIT : case Types.SQL_BIT_VARYING : writeBit((BinaryData) o); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "RowOutputBase - " + t.getNameString()); } } // returns the underlying HsqlByteArrayOutputStream public HsqlByteArrayOutputStream getOutputStream() { return this; } public abstract RowOutputInterface duplicate(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowOutputInterface.java0000644000175000017500000000601412007547364024562 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import org.hsqldb.Row; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.types.Type; /** * Public interface for writing the data for a database row. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.0 */ public interface RowOutputInterface extends Cloneable { void writeEnd(); void writeSize(int size); void writeType(int type); void writeString(String value); void writeByte(int i); void writeShort(int i); void writeInt(int i); void writeIntData(int i, int position); void writeLong(long i); void writeData(Row row, Type[] types); void writeData(int l, Type[] types, Object[] data, HashMappedList cols, int[] primarykeys); // independent of the this object, calls only a static method int getSize(Row row); int getStorageSize(int size); // returns the underlying HsqlByteArrayOutputStream HsqlByteArrayOutputStream getOutputStream(); byte[] getBuffer(); // resets the byte[] buffer, ready for processing new row void reset(); // performs reset() and ensures byte[] buffer is at least newSize void reset(int newSize); // sets the byte[] buffer void reset(byte[] mainBuffer); // returns the current size int size(); public RowOutputInterface duplicate(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowInputBinary180.java0000644000175000017500000000665312007547364024147 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.io.IOException; import java.util.Calendar; import java.util.GregorianCalendar; import org.hsqldb.HsqlDateTime; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class RowInputBinary180 extends RowInputBinary { Calendar tempCalDefault = new GregorianCalendar(); public RowInputBinary180(byte[] buf) { super(buf); } protected TimeData readTime(Type type) throws IOException { if (type.typeCode == Types.SQL_TIME) { long millis = readLong(); millis = HsqlDateTime.convertMillisFromCalendar( tempCalDefault, millis); millis = HsqlDateTime.getNormalisedTime(millis); return new TimeData((int) (millis / 1000), 0, 0); } else { return new TimeData(readInt(), readInt(), readInt()); } } protected TimestampData readDate(Type type) throws IOException { long millis = readLong(); millis = HsqlDateTime.convertMillisFromCalendar(tempCalDefault, millis); millis = HsqlDateTime.getNormalisedDate(millis); return new TimestampData(millis / 1000); } protected TimestampData readTimestamp(Type type) throws IOException { if (type.typeCode == Types.SQL_TIMESTAMP) { long millis = readLong(); int nanos = readInt(); millis = HsqlDateTime.convertMillisFromCalendar(tempCalDefault, millis); return new TimestampData(millis / 1000, nanos); } else { return new TimestampData(readLong(), readInt(), readInt()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowInputText.java0000644000175000017500000003135312007547364023411 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.io.IOException; import java.math.BigDecimal; import org.hsqldb.Scanner; import org.hsqldb.Tokens; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.store.ValuePool; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobData; import org.hsqldb.types.BlobDataID; import org.hsqldb.types.ClobData; import org.hsqldb.types.ClobDataID; import org.hsqldb.types.IntervalMonthData; import org.hsqldb.types.IntervalSecondData; import org.hsqldb.types.IntervalType; import org.hsqldb.types.JavaObjectData; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Class for reading the data for a database row in text table format. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.0 */ public class RowInputText extends RowInputBase implements RowInputInterface { // text table specific private String fieldSep; private String varSep; private String longvarSep; private int fieldSepLen; private int varSepLen; private int longvarSepLen; private boolean fieldSepEnd; private boolean varSepEnd; private boolean longvarSepEnd; private int textLen; protected String text; protected int line; protected int field; protected int next = 0; protected boolean allQuoted; protected Scanner scanner; // private int maxPooledStringLength = ValuePool.getMaxStringLength(); /** * fredt@users - comment - in future may use a custom subclasse of * InputStream to read the data. */ public RowInputText(String fieldSep, String varSep, String longvarSep, boolean allQuoted) { super(new byte[0]); scanner = new Scanner(); //-- Newline indicates that field should match to end of line. if (fieldSep.endsWith("\n")) { fieldSepEnd = true; fieldSep = fieldSep.substring(0, fieldSep.length() - 1); } if (varSep.endsWith("\n")) { varSepEnd = true; varSep = varSep.substring(0, varSep.length() - 1); } if (longvarSep.endsWith("\n")) { longvarSepEnd = true; longvarSep = longvarSep.substring(0, longvarSep.length() - 1); } this.allQuoted = allQuoted; this.fieldSep = fieldSep; this.varSep = varSep; this.longvarSep = longvarSep; fieldSepLen = fieldSep.length(); varSepLen = varSep.length(); longvarSepLen = longvarSep.length(); } public void setSource(String text, long pos, int byteSize) { size = byteSize; this.text = text; textLen = text.length(); filePos = pos; next = 0; line++; field = 0; } protected String getField(String sep, int sepLen, boolean isEnd) throws IOException { String s = null; try { int start = next; field++; if (isEnd) { if ((next >= textLen) && (sepLen > 0)) { throw Error.error(ErrorCode.TEXT_SOURCE_NO_END_SEPARATOR); } else if (text.endsWith(sep)) { next = textLen - sepLen; } else { throw Error.error(ErrorCode.TEXT_SOURCE_NO_END_SEPARATOR); } } else { next = text.indexOf(sep, start); if (next == -1) { next = textLen; } } if (start > next) { start = next; } s = text.substring(start, next); next += sepLen; s = s.trim(); if (s.length() == 0) { s = null; } } catch (Exception e) { Object[] messages = new Object[] { new Integer(field), e.toString() }; throw new IOException( Error.getMessage( ErrorCode.M_TEXT_SOURCE_FIELD_ERROR, 0, messages)); } return s; } public String readString() throws IOException { return getField(fieldSep, fieldSepLen, fieldSepEnd); } private String readVarString() throws IOException { return getField(varSep, varSepLen, varSepEnd); } /** * Obsoleted in 1.9.0 */ private String readLongVarString() throws IOException { return getField(longvarSep, longvarSepLen, longvarSepEnd); } public short readShort() throws IOException { return (short) readInt(); } public int readInt() throws IOException { String s = readString(); if (s == null) { return 0; } s = s.trim(); if (s.length() == 0) { return 0; } return Integer.parseInt(s); } public long readLong() throws IOException { throw Error.runtimeError(ErrorCode.U_S0500, "RowInputText"); } public int readType() throws IOException { return 0; } protected boolean readNull() { // Return null on each column read instead. return false; } protected String readChar(Type type) throws IOException { String s = null;; switch (type.typeCode) { case Types.SQL_CHAR : s = readString(); break; case Types.SQL_VARCHAR : case Types.VARCHAR_IGNORECASE : s = readVarString(); break; default : s = readLongVarString(); break; } if (s == null) { return null; } if (s.length() > this.maxPooledStringLength) { return new String(s); } else { return ValuePool.getString(s); } } protected Integer readSmallint() throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } return ValuePool.getInt(Integer.parseInt(s)); } protected Integer readInteger() throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } return ValuePool.getInt(Integer.parseInt(s)); } protected Long readBigint() throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } return ValuePool.getLong(Long.parseLong(s)); } protected Double readReal() throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } return Double.valueOf(s); } protected BigDecimal readDecimal(Type type) throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } return new BigDecimal(s); } protected TimeData readTime(Type type) throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } return scanner.newTime(s); } protected TimestampData readDate(Type type) throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } return scanner.newDate(s); } protected TimestampData readTimestamp(Type type) throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } return scanner.newTimestamp(s); } protected IntervalMonthData readYearMonthInterval(Type type) throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } return (IntervalMonthData) scanner.newInterval(s, (IntervalType) type); } protected IntervalSecondData readDaySecondInterval(Type type) throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } return (IntervalSecondData) scanner.newInterval(s, (IntervalType) type); } protected Boolean readBoole() throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } return s.equalsIgnoreCase(Tokens.T_TRUE) ? Boolean.TRUE : Boolean.FALSE; } protected Object readOther() throws IOException { String s = readString(); if (s == null) { return null; } BinaryData data = scanner.convertToBinary(s); if (data.length(null) == 0) { return null; } return new JavaObjectData(data.getBytes()); } protected BinaryData readBit() throws IOException { String s = readString(); if (s == null) { return null; } BinaryData data = scanner.convertToBit(s); return data; } protected BinaryData readBinary() throws IOException { String s = readString(); if (s == null) { return null; } BinaryData data = scanner.convertToBinary(s); return data; } protected ClobData readClob() throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } long id = Long.parseLong(s); return new ClobDataID(id); } protected BlobData readBlob() throws IOException { String s = readString(); if (s == null) { return null; } s = s.trim(); if (s.length() == 0) { return null; } long id = Long.parseLong(s); return new BlobDataID(id); } protected Object[] readArray(Type type) { throw Error.runtimeError(ErrorCode.U_S0500, "RowInputText"); } public int getLineNumber() { return line; } public void skippedLine() { line++; } public void reset() { text = ""; textLen = 0; filePos = 0; next = 0; field = 0; line = 0; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowInputBinaryDecode.java0000644000175000017500000000443712007547362025016 0ustar renerene/* Copyright (c) 2001-2009, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.io.IOException; import org.hsqldb.persist.Crypto; import org.hsqldb.types.Type; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.9.0 */ public class RowInputBinaryDecode extends RowInputBinary { final Crypto crypto; public RowInputBinaryDecode(Crypto crypto, byte[] buf) { super(buf); this.crypto = crypto; } public Object[] readData(Type[] colTypes) throws IOException { if (crypto != null) { int start = pos; int size = readInt(); crypto.decode(buffer, pos, size, buffer, start); pos = start; } return super.readData(colTypes); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowInputTextQuoted.java0000644000175000017500000001203112007547364024563 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.io.IOException; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; /** * Fields in the source file need not be quoted. Methods in this class unquote * the fields if they are quoted and handle quote character doubling in this * case. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.0 */ public class RowInputTextQuoted extends RowInputText { private static final int NORMAL_FIELD = 0; private static final int NEED_END_QUOTE = 1; private static final int FOUND_QUOTE = 2; private char[] qtext; public RowInputTextQuoted(String fieldSep, String varSep, String longvarSep, boolean allQuoted) { super(fieldSep, varSep, longvarSep, allQuoted); } public void setSource(String text, long pos, int byteSize) { super.setSource(text, pos, byteSize); qtext = text.toCharArray(); } protected String getField(String sep, int sepLen, boolean isEnd) throws IOException { //fredt - now the only supported behaviour is emptyIsNull String s = null; if (next >= qtext.length || qtext[next] != '\"') { return super.getField(sep, sepLen, isEnd); } try { field++; StringBuffer sb = new StringBuffer(); boolean done = false; int state = NORMAL_FIELD; int end = -1; if (!isEnd) { end = text.indexOf(sep, next); } for (; next < qtext.length; next++) { switch (state) { case NORMAL_FIELD : default : if (next == end) { next += sepLen; done = true; } else if (qtext[next] == '\"') { //-- Beginning of field state = NEED_END_QUOTE; } else { sb.append(qtext[next]); } break; case NEED_END_QUOTE : if (qtext[next] == '\"') { state = FOUND_QUOTE; } else { sb.append(qtext[next]); } break; case FOUND_QUOTE : if (qtext[next] == '\"') { //-- Escaped quote sb.append(qtext[next]); state = NEED_END_QUOTE; } else { next += sepLen - 1; state = NORMAL_FIELD; if (!isEnd) { next++; done = true; } } break; } if (done) { break; } } s = sb.toString(); } catch (Exception e) { Object[] messages = new Object[] { new Integer(field), e.toString() }; throw new IOException( Error.getMessage( ErrorCode.M_TEXT_SOURCE_FIELD_ERROR, 0, messages)); } return s; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowInputInterface.java0000644000175000017500000000451712007547364024367 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.io.IOException; import org.hsqldb.types.Type; /** * Public interface for reading the data for a database row. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.0 */ public interface RowInputInterface { long getPos(); int getSize(); int readType() throws IOException; String readString() throws IOException; byte readByte() throws IOException; short readShort() throws IOException; int readInt() throws IOException; long readLong() throws IOException; Object[] readData(Type[] colTypes) throws IOException; void resetRow(long filePos, int size) throws IOException; byte[] getBuffer(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowOutputBinary.java0000644000175000017500000003050312007547364024106 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.math.BigDecimal; import java.math.BigInteger; import org.hsqldb.Row; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.StringConverter; import org.hsqldb.lib.java.JavaSystem; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobData; import org.hsqldb.types.ClobData; import org.hsqldb.types.IntervalMonthData; import org.hsqldb.types.IntervalSecondData; import org.hsqldb.types.JavaObjectData; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Provides methods for writing the data for a row to a * byte array. The new format of data consists of mainly binary values * and is not compatible with v.1.6.x databases. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.7.0 */ public class RowOutputBinary extends RowOutputBase { public static final int INT_STORE_SIZE = 4; int storageSize; final int scale; // 2 to power n where n >= 0 final int mask; public RowOutputBinary(int initialSize, int scale) { super(initialSize); this.scale = scale; this.mask = ~(scale - 1); } /** * Constructor used for network transmission of result sets * * @param buffer byte[] */ public RowOutputBinary(byte[] buffer) { super(buffer); scale = 1; this.mask = ~(scale - 1); } // fredt@users - comment - methods for writing column type, name and data size public void writeIntData(int i, int position) { int temp = count; count = position; writeInt(i); if (count < temp) { count = temp; } } public void writeData(Row row, Type[] types) { super.writeData(row, types); } public void writeEnd() { if (count > storageSize) { Error.runtimeError(ErrorCode.U_S0500, "RowOutputBinary"); } for (; count < storageSize; ) { this.write(0); } } public void writeSize(int size) { storageSize = size; writeInt(size); } public void writeType(int type) { writeShort(type); } public void writeString(String s) { int temp = count; writeInt(0); if (s != null && s.length() != 0) { StringConverter.stringToUTFBytes(s, this); writeIntData(count - temp - INT_STORE_SIZE, temp); } } /** * Calculate the size of byte array required to store a row. * * @param row - a database row * @return size of byte array * @exception HsqlException When data is inconsistent */ public int getSize(Row row) { Object[] data = row.getData(); Type[] types = row.getTable().getColumnTypes(); int cols = row.getTable().getDataColumnCount(); return INT_STORE_SIZE + getSize(data, cols, types); } public int getStorageSize(int size) { return (size + scale - 1) & mask; } public void writeFieldType(Type type) { write(1); } public void writeNull(Type type) { write(0); } protected void writeChar(String s, Type t) { writeString(s); } protected void writeSmallint(Number o) { writeShort(o.intValue()); } protected void writeInteger(Number o) { writeInt(o.intValue()); } protected void writeBigint(Number o) { writeLong(o.longValue()); } protected void writeReal(Double o) { writeLong(Double.doubleToLongBits((o.doubleValue()))); } protected void writeDecimal(BigDecimal o, Type type) { int scale = o.scale(); BigInteger bigint = JavaSystem.unscaledValue(o); byte[] bytearr = bigint.toByteArray(); writeByteArray(bytearr); writeInt(scale); } protected void writeBoolean(Boolean o) { write(o.booleanValue() ? 1 : 0); } protected void writeDate(TimestampData o, Type type) { writeLong(o.getSeconds()); } protected void writeTime(TimeData o, Type type) { writeInt(o.getSeconds()); writeInt(o.getNanos()); if (type.typeCode == Types.SQL_TIME_WITH_TIME_ZONE) { writeInt(o.getZone()); } } protected void writeTimestamp(TimestampData o, Type type) { writeLong(o.getSeconds()); writeInt(o.getNanos()); if (type.typeCode == Types.SQL_TIMESTAMP_WITH_TIME_ZONE) { writeInt(o.getZone()); } } protected void writeYearMonthInterval(IntervalMonthData o, Type type) { writeLong(o.units); } protected void writeDaySecondInterval(IntervalSecondData o, Type type) { writeLong(o.getSeconds()); writeInt(o.getNanos()); } protected void writeOther(JavaObjectData o) { writeByteArray(o.getBytes()); } protected void writeBit(BinaryData o) { writeInt((int) o.bitLength(null)); write(o.getBytes(), 0, o.getBytes().length); } protected void writeBinary(BinaryData o) { writeByteArray(o.getBytes()); } protected void writeClob(ClobData o, Type type) { writeLong(o.getId()); } protected void writeBlob(BlobData o, Type type) { writeLong(o.getId()); } protected void writeArray(Object[] o, Type type) { type = type.collectionBaseType(); writeInt(o.length); for (int i = 0; i < o.length; i++) { writeData(type, o[i]); } } public void writeArray(int[] o) { writeInt(o.length); for (int i = 0; i < o.length; i++) { write(1); writeInt(o[i]); } } // fredt@users - comment - helper and conversion methods public void writeByteArray(byte[] b) { writeInt(b.length); write(b, 0, b.length); } // fredt@users - comment - helper and conversion methods public void writeCharArray(char[] c) { writeInt(c.length); write(c, 0, c.length); } public int getSize(int[] array) { return 4 + array.length * 5; } /** * Calculate the size of byte array required to store a row. * * @param data - the row data * @param l - number of data[] elements to include in calculation * @param types - array of java.sql.Types values * @return size of byte array */ public int getSize(Object[] data, int l, Type[] types) { int s = 0; for (int i = 0; i < l; i++) { Object o = data[i]; s += getSize(o, types[i]); } return s; } private int getSize(Object o, Type type) { int s = 1; // type or null if (o == null) { return s; } switch (type.typeCode) { case Types.SQL_ALL_TYPES : break; case Types.SQL_CHAR : case Types.SQL_VARCHAR : case Types.VARCHAR_IGNORECASE : s += INT_STORE_SIZE; s += StringConverter.getUTFSize((String) o); break; case Types.TINYINT : case Types.SQL_SMALLINT : s += 2; break; case Types.SQL_INTEGER : s += 4; break; case Types.SQL_BIGINT : case Types.SQL_REAL : case Types.SQL_FLOAT : case Types.SQL_DOUBLE : s += 8; break; case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : s += 8; BigDecimal bigdecimal = (BigDecimal) o; BigInteger bigint = JavaSystem.unscaledValue(bigdecimal); s += bigint.toByteArray().length; break; case Types.SQL_BOOLEAN : s += 1; break; case Types.SQL_DATE : s += 8; break; case Types.SQL_TIME : s += 8; break; case Types.SQL_TIME_WITH_TIME_ZONE : s += 12; break; case Types.SQL_TIMESTAMP : s += 12; break; case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : s += 16; break; case Types.SQL_INTERVAL_YEAR : case Types.SQL_INTERVAL_YEAR_TO_MONTH : case Types.SQL_INTERVAL_MONTH : s += 8; break; case Types.SQL_INTERVAL_DAY : case Types.SQL_INTERVAL_DAY_TO_HOUR : case Types.SQL_INTERVAL_DAY_TO_MINUTE : case Types.SQL_INTERVAL_DAY_TO_SECOND : case Types.SQL_INTERVAL_HOUR : case Types.SQL_INTERVAL_HOUR_TO_MINUTE : case Types.SQL_INTERVAL_HOUR_TO_SECOND : case Types.SQL_INTERVAL_MINUTE : case Types.SQL_INTERVAL_MINUTE_TO_SECOND : case Types.SQL_INTERVAL_SECOND : s += 12; break; case Types.SQL_BINARY : case Types.SQL_VARBINARY : s += INT_STORE_SIZE; s += ((BinaryData) o).length(null); break; case Types.SQL_BIT : case Types.SQL_BIT_VARYING : s += INT_STORE_SIZE; s += ((BinaryData) o).length(null); break; case Types.SQL_CLOB : case Types.SQL_BLOB : s += 8; break; case Types.SQL_ARRAY : { s += 4; Object[] array = (Object[]) o; type = type.collectionBaseType(); for (int i = 0; i < array.length; i++) { s += getSize(array[i], type); } break; } case Types.OTHER : JavaObjectData jo = (JavaObjectData) o; s += INT_STORE_SIZE; s += jo.getBytesLength(); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "RowOutputBinary"); } return s; } /** * @param extra amount of extra space */ public void ensureRoom(int extra) { super.ensureRoom(extra); } public void reset() { super.reset(); storageSize = 0; } public void reset(int newSize) { super.reset(newSize); storageSize = 0; } public void reset(byte[] buffer) { super.reset(buffer); storageSize = 0; } public RowOutputInterface duplicate() { return new RowOutputBinary(128, this.scale); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowInputBinary.java0000644000175000017500000002041412007547364023705 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.io.EOFException; import java.io.IOException; import java.math.BigDecimal; import java.math.BigInteger; import org.hsqldb.lib.StringConverter; import org.hsqldb.store.ValuePool; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobData; import org.hsqldb.types.BlobDataID; import org.hsqldb.types.ClobData; import org.hsqldb.types.ClobDataID; import org.hsqldb.types.IntervalMonthData; import org.hsqldb.types.IntervalSecondData; import org.hsqldb.types.IntervalType; import org.hsqldb.types.JavaObjectData; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Provides methods for reading the data for a row from a * byte array. The format of data is that used for storage of cached * tables by v.1.6.x databases, apart from strings. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.0 */ public class RowInputBinary extends RowInputBase implements org.hsqldb.rowio.RowInputInterface { private RowOutputBinary out; public RowInputBinary(byte[] buf) { super(buf); } /** * uses the byte[] buffer from out. At each reset, the buffer is set * to the current one for out. */ public RowInputBinary(RowOutputBinary out) { super(out.getBuffer()); this.out = out; } public int readType() throws IOException { return readShort(); } public String readString() throws IOException { int length = readInt(); String s = StringConverter.readUTF(buffer, pos, length); s = ValuePool.getString(s); pos += length; return s; } public boolean readNull() throws IOException { int b = readByte(); return b == 0 ? true : false; } protected String readChar(Type type) throws IOException { return readString(); } protected Integer readSmallint() throws IOException { return ValuePool.getInt(readShort()); } protected Integer readInteger() throws IOException { return ValuePool.getInt(readInt()); } protected Long readBigint() throws IOException { return ValuePool.getLong(readLong()); } protected Double readReal() throws IOException { return ValuePool.getDouble(readLong()); } protected BigDecimal readDecimal(Type type) throws IOException { byte[] bytes = readByteArray(); int scale = readInt(); BigInteger bigint = new BigInteger(bytes); return ValuePool.getBigDecimal(new BigDecimal(bigint, scale)); } protected Boolean readBoole() throws IOException { return readBoolean() ? Boolean.TRUE : Boolean.FALSE; } protected TimeData readTime(Type type) throws IOException { if (type.typeCode == Types.SQL_TIME) { return new TimeData(readInt(), readInt(), 0); } else { return new TimeData(readInt(), readInt(), readInt()); } } protected TimestampData readDate(Type type) throws IOException { long date = readLong(); return new TimestampData(date); } protected TimestampData readTimestamp(Type type) throws IOException { if (type.typeCode == Types.SQL_TIMESTAMP) { return new TimestampData(readLong(), readInt()); } else { return new TimestampData(readLong(), readInt(), readInt()); } } protected IntervalMonthData readYearMonthInterval(Type type) throws IOException { long months = readLong(); return new IntervalMonthData(months, (IntervalType) type); } protected IntervalSecondData readDaySecondInterval(Type type) throws IOException { long seconds = readLong(); int nanos = readInt(); return new IntervalSecondData(seconds, nanos, (IntervalType) type); } protected Object readOther() throws IOException { return new JavaObjectData(readByteArray()); } protected BinaryData readBit() throws IOException { int length = readInt(); byte[] b = new byte[(length + 7) / 8]; readFully(b); return BinaryData.getBitData(b, length); } protected BinaryData readBinary() throws IOException { return new BinaryData(readByteArray(), false); } protected ClobData readClob() throws IOException { long id = super.readLong(); return new ClobDataID(id); } protected BlobData readBlob() throws IOException { long id = super.readLong(); return new BlobDataID(id); } protected Object[] readArray(Type type) throws IOException { type = type.collectionBaseType(); int size = readInt(); Object[] data = new Object[size]; for (int i = 0; i < size; i++) { data[i] = readData(type); } return data; } /** * Nulls in array are treated as 0 */ public int[] readIntArray() throws IOException { int size = readInt(); int[] data = new int[size]; for (int i = 0; i < size; i++) { if (!readNull()) { data[i] = readInt(); } } return data; } public Object[] readData(Type[] colTypes) throws IOException { return super.readData(colTypes); } // helper methods public byte[] readByteArray() throws IOException { byte[] b = new byte[readInt()]; readFully(b); return b; } public char[] readCharArray() throws IOException { char[] c = new char[readInt()]; if (count - pos < c.length) { pos = count; throw new EOFException(); } for (int i = 0; i < c.length; i++) { int ch1 = buffer[pos++] & 0xff; int ch2 = buffer[pos++] & 0xff; c[i] = (char) ((ch1 << 8) + (ch2)); } return c; } /** * Used to reset the row, ready for Result data to be written into the * byte[] buffer by an external routine. * */ public void resetRow(int rowsize) { if (out != null) { out.reset(rowsize); buffer = out.getBuffer(); } super.reset(); } /** * Used to reset the row, ready for a new db row to be written into the * byte[] buffer by an external routine. * */ public void resetRow(long filepos, int rowsize) throws IOException { if (out != null) { out.reset(rowsize); buffer = out.getBuffer(); } super.resetRow(filepos, rowsize); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowOutputBinaryEncode.java0000644000175000017500000000635412007547364025233 0ustar renerene/* Copyright (c) 2001-2010, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import org.hsqldb.Row; import org.hsqldb.persist.Crypto; import org.hsqldb.types.Type; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public class RowOutputBinaryEncode extends RowOutputBinary { final Crypto crypto; public RowOutputBinaryEncode(Crypto crypto, int initialSize, int scale) { super(initialSize, scale); this.crypto = crypto; } public void writeData(Row row, Type[] types) { if (crypto == null) { super.writeData(row, types); } else { int start = count; ensureRoom(row.getStorageSize()); writeInt(0); super.writeData(row, types); int origLength = count - start - INT_STORE_SIZE; int newLength = crypto.encode(buffer, start + INT_STORE_SIZE, origLength, buffer, start + INT_STORE_SIZE); writeIntData(newLength, start); count = start + INT_STORE_SIZE + newLength; } } /** * Calculate the size of byte array required to store a row. * * @param row - a database row * @return size of byte array * @exception HsqlException When data is inconsistent */ public int getSize(Row row) { int size = super.getSize(row); if (crypto != null) { size = crypto.getEncodedSize(size - INT_STORE_SIZE) + INT_STORE_SIZE * 2; } return size; } public RowOutputInterface duplicate() { return new RowOutputBinaryEncode(crypto, 128, this.scale); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowOutputBinary180.java0000644000175000017500000000635512007547364024347 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.util.Calendar; import java.util.GregorianCalendar; import org.hsqldb.HsqlDateTime; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class RowOutputBinary180 extends RowOutputBinary { Calendar tempCalDefault = new GregorianCalendar(); public RowOutputBinary180(int initialSize, int scale) { super(initialSize, scale); } protected void writeDate(TimestampData o, Type type) { long millis = o.getSeconds() * 1000L; millis = HsqlDateTime.convertMillisToCalendar(tempCalDefault, millis); writeLong(millis); } protected void writeTime(TimeData o, Type type) { if (type.typeCode == Types.SQL_TIME) { long millis = o.getSeconds() * 1000L; millis = HsqlDateTime.convertMillisToCalendar(tempCalDefault, millis); writeLong(millis); } else { writeInt(o.getSeconds()); writeInt(o.getNanos()); writeInt(o.getZone()); } } protected void writeTimestamp(TimestampData o, Type type) { if (type.typeCode == Types.SQL_TIMESTAMP) { long millis = o.getSeconds() * 1000L; millis = HsqlDateTime.convertMillisToCalendar(tempCalDefault, millis); writeLong(millis); writeInt(o.getNanos()); } else { writeLong(o.getSeconds()); writeInt(o.getNanos()); writeInt(o.getZone()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowInputBase.java0000644000175000017500000002230012007547364023327 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import java.io.IOException; import java.math.BigDecimal; import org.hsqldb.HsqlException; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HsqlByteArrayInputStream; import org.hsqldb.types.BinaryData; import org.hsqldb.types.BlobData; import org.hsqldb.types.ClobData; import org.hsqldb.types.IntervalMonthData; import org.hsqldb.types.IntervalSecondData; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Base class for reading the data for a database row in different formats. * Defines the methods that are independent of storage format and declares * the format-dependent methods that subclasses should define. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.0 */ abstract class RowInputBase extends HsqlByteArrayInputStream { static final int NO_POS = -1; // fredt - initialisation may be unnecessary as it's done in resetRow() protected long filePos = NO_POS; protected int size; RowInputBase() { this(new byte[4]); } /** * Constructor takes a complete row */ RowInputBase(byte[] buf) { super(buf); size = buf.length; } public long getPos() { if (filePos == NO_POS) { // Trace.printSystemOut(Trace.DatabaseRowInput_getPos); } return filePos; } public int getSize() { return size; } // fredt@users - comment - methods used for node and type data public abstract int readType() throws IOException; public abstract String readString() throws IOException; // fredt@users - comment - methods used for SQL types protected abstract boolean readNull() throws IOException; protected abstract String readChar(Type type) throws IOException; protected abstract Integer readSmallint() throws IOException; protected abstract Integer readInteger() throws IOException; protected abstract Long readBigint() throws IOException; protected abstract Double readReal() throws IOException; protected abstract BigDecimal readDecimal(Type type) throws IOException; protected abstract Boolean readBoole() throws IOException; protected abstract TimeData readTime(Type type) throws IOException; protected abstract TimestampData readDate(Type type) throws IOException; protected abstract TimestampData readTimestamp(Type type) throws IOException; protected abstract IntervalMonthData readYearMonthInterval(Type type) throws IOException; protected abstract IntervalSecondData readDaySecondInterval(Type type) throws IOException; protected abstract Object readOther() throws IOException; protected abstract BinaryData readBinary() throws IOException, HsqlException; protected abstract BinaryData readBit() throws IOException; protected abstract ClobData readClob() throws IOException; protected abstract BlobData readBlob() throws IOException; protected abstract Object[] readArray(Type type) throws IOException; /** * reads row data from a stream using the JDBC types in colTypes * * @param colTypes * @throws IOException */ public Object[] readData(Type[] colTypes) throws IOException { int l = colTypes.length; Object[] data = new Object[l]; for (int i = 0; i < l; i++) { Type type = colTypes[i]; data[i] = readData(type); } return data; } public Object readData(Type type) throws IOException { Object o = null; if (readNull()) { return null; } switch (type.typeCode) { case Types.SQL_ALL_TYPES : break; case Types.SQL_CHAR : case Types.SQL_VARCHAR : case Types.VARCHAR_IGNORECASE : o = readChar(type); break; case Types.TINYINT : case Types.SQL_SMALLINT : o = readSmallint(); break; case Types.SQL_INTEGER : o = readInteger(); break; case Types.SQL_BIGINT : o = readBigint(); break; case Types.SQL_REAL : case Types.SQL_FLOAT : case Types.SQL_DOUBLE : o = readReal(); break; case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : o = readDecimal(type); break; case Types.SQL_DATE : o = readDate(type); break; case Types.SQL_TIME : case Types.SQL_TIME_WITH_TIME_ZONE : o = readTime(type); break; case Types.SQL_TIMESTAMP : case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : o = readTimestamp(type); break; case Types.SQL_INTERVAL_YEAR : case Types.SQL_INTERVAL_YEAR_TO_MONTH : case Types.SQL_INTERVAL_MONTH : o = readYearMonthInterval(type); break; case Types.SQL_INTERVAL_DAY : case Types.SQL_INTERVAL_DAY_TO_HOUR : case Types.SQL_INTERVAL_DAY_TO_MINUTE : case Types.SQL_INTERVAL_DAY_TO_SECOND : case Types.SQL_INTERVAL_HOUR : case Types.SQL_INTERVAL_HOUR_TO_MINUTE : case Types.SQL_INTERVAL_HOUR_TO_SECOND : case Types.SQL_INTERVAL_MINUTE : case Types.SQL_INTERVAL_MINUTE_TO_SECOND : case Types.SQL_INTERVAL_SECOND : o = readDaySecondInterval(type); break; case Types.SQL_BOOLEAN : o = readBoole(); break; case Types.OTHER : o = readOther(); break; case Types.SQL_CLOB : o = readClob(); break; case Types.SQL_BLOB : o = readBlob(); break; case Types.SQL_ARRAY : o = readArray(type); break; case Types.SQL_BINARY : case Types.SQL_VARBINARY : o = readBinary(); break; case Types.SQL_BIT : case Types.SQL_BIT_VARYING : o = readBit(); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "RowInputBase - " + type.getNameString()); } return o; } /** * Used to reset the row, ready for a new row to be written into the * byte[] buffer by an external routine. * */ public void resetRow(long filepos, int rowsize) throws IOException { mark = 0; reset(); if (buffer.length < rowsize) { buffer = new byte[rowsize]; } filePos = filepos; size = count = rowsize; pos = 4; buffer[0] = (byte) ((rowsize >>> 24) & 0xFF); buffer[1] = (byte) ((rowsize >>> 16) & 0xFF); buffer[2] = (byte) ((rowsize >>> 8) & 0xFF); buffer[3] = (byte) ((rowsize >>> 0) & 0xFF); } public byte[] getBuffer() { return buffer; } public int skipBytes(int n) throws IOException { throw Error.runtimeError(ErrorCode.U_S0500, "RowInputBase"); } public String readLine() throws IOException { throw Error.runtimeError(ErrorCode.U_S0500, "RowInputBase"); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rowio/RowOutputTextQuoted.java0000644000175000017500000000536312007547364024776 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rowio; import org.hsqldb.lib.StringConverter; /** * This class quotes strings only if they contain the quote character or * the separator for the field. The quote character is doubled. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.0 */ public class RowOutputTextQuoted extends RowOutputText { public RowOutputTextQuoted(String fieldSep, String varSep, String longvarSep, boolean allQuoted, String encoding) { super(fieldSep, varSep, longvarSep, allQuoted, encoding); } protected String checkConvertString(String s, String sep) { if (allQuoted || s.length() == 0 || s.indexOf('\"') != -1 || (sep.length() > 0 && s.indexOf(sep) != -1) || hasUnprintable(s)) { s = StringConverter.toQuotedString(s, '\"', true); } return s; } private static boolean hasUnprintable(String s) { for (int i = 0, len = s.length(); i < len; i++) { if (Character.isISOControl(s.charAt(i))) { return true; } } return false; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/HsqlNameManager.java0000644000175000017500000004226112007547412022613 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.lib.StringConverter; import org.hsqldb.rights.Grantee; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; /** * Provides Name Management for SQL objects.

* * This class now includes the HsqlName class introduced in 1.7.1 and improves * auto-naming with multiple databases in the engine.

* * Methods check user defined names and issue system generated names * for SQL objects.

* * This class does not deal with the type of the SQL object for which it * is used.

* * Some names beginning with SYS_ are reserved for system generated names. * These are defined in isReserveName(String name) and created by the * makeAutoName(String type) factory method

* * sysNumber is used to generate system-generated names. It is * set to the largest integer encountered in names that use the * SYS_xxxxxxx_INTEGER format. As the DDL is processed before any ALTER * command, any new system generated name will have a larger integer suffix * than all the existing names. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 */ public final class HsqlNameManager { public static final String DEFAULT_CATALOG_NAME = "PUBLIC"; private static final HsqlNameManager staticManager = new HsqlNameManager(); static { staticManager.serialNumber = Integer.MIN_VALUE; } private static final HsqlName[] autoColumnNames = new HsqlName[32]; private static final String[] autoNoNameColumnNames = new String[32]; static { for (int i = 0; i < autoColumnNames.length; i++) { autoColumnNames[i] = new HsqlName(staticManager, "C" + (i + 1), 0, false); autoNoNameColumnNames[i] = String.valueOf(i); } } private int serialNumber = 1; // 0 is reserved in lookups private int sysNumber = 10000; // avoid name clash in older scripts private HsqlName catalogName; private boolean sqlRegularNames; HsqlName subqueryTableName; public HsqlNameManager() { sqlRegularNames = true; } public HsqlNameManager(Database database) { catalogName = new HsqlName(this, DEFAULT_CATALOG_NAME, SchemaObject.CATALOG, false); sqlRegularNames = database.sqlRegularNames; subqueryTableName = new HsqlName(this, SqlInvariants.SYSTEM_SUBQUERY, false, SchemaObject.TABLE); subqueryTableName.schema = SqlInvariants.SYSTEM_SCHEMA_HSQLNAME; } public HsqlName getCatalogName() { return catalogName; } public void setSqlRegularNames(boolean value) { sqlRegularNames = value; } public static HsqlName newSystemObjectName(String name, int type) { return new HsqlName(staticManager, name, type, false); } public static HsqlName newInfoSchemaColumnName(String name, HsqlName table) { HsqlName hsqlName = new HsqlName(staticManager, name, false, SchemaObject.COLUMN); hsqlName.schema = SqlInvariants.INFORMATION_SCHEMA_HSQLNAME; hsqlName.parent = table; return hsqlName; } public static HsqlName newInfoSchemaTableName(String name) { HsqlName hsqlName = new HsqlName(staticManager, name, SchemaObject.TABLE, false); hsqlName.schema = SqlInvariants.INFORMATION_SCHEMA_HSQLNAME; return hsqlName; } public static HsqlName newInfoSchemaObjectName(String name, boolean isQuoted, int type) { HsqlName hsqlName = new HsqlName(staticManager, name, type, isQuoted); hsqlName.schema = SqlInvariants.INFORMATION_SCHEMA_HSQLNAME; return hsqlName; } public HsqlName newHsqlName(HsqlName schema, String name, int type) { HsqlName hsqlName = new HsqlName(this, name, type, false); hsqlName.schema = schema; return hsqlName; } // public HsqlName newHsqlName(String name, boolean isquoted, int type) { return new HsqlName(this, name, isquoted, type); } public HsqlName newHsqlName(HsqlName schema, String name, boolean isquoted, int type) { HsqlName hsqlName = new HsqlName(this, name, isquoted, type); hsqlName.schema = schema; return hsqlName; } public HsqlName newHsqlName(HsqlName schema, String name, boolean isquoted, int type, HsqlName parent) { HsqlName hsqlName = new HsqlName(this, name, isquoted, type); hsqlName.schema = schema; hsqlName.parent = parent; return hsqlName; } public HsqlName newColumnSchemaHsqlName(HsqlName table, SimpleName name) { return newColumnHsqlName(table, name.name, name.isNameQuoted); } public HsqlName newColumnHsqlName(HsqlName table, String name, boolean isquoted) { HsqlName hsqlName = new HsqlName(this, name, isquoted, SchemaObject.COLUMN); hsqlName.schema = table.schema; hsqlName.parent = table; return hsqlName; } /** * Same name string but different objects and serial number */ public HsqlName getSubqueryTableName() { return subqueryTableName; } /** * Auto names are used for autogenerated indexes or anonymous constraints. */ public HsqlName newAutoName(String prefix, HsqlName schema, HsqlName parent, int type) { HsqlName name = newAutoName(prefix, (String) null, schema, parent, type); return name; } public HsqlName newSpecificRoutineName(HsqlName name) { StringBuffer sb = new StringBuffer(); sb.append(name.name).append('_').append(++sysNumber); HsqlName hsqlName = new HsqlName(this, sb.toString(), SchemaObject.SPECIFIC_ROUTINE, name.isNameQuoted); hsqlName.parent = name; hsqlName.schema = name.schema; return hsqlName; } /** * Column index i is 0 based, returns 1 based numbered column. */ public static HsqlName getAutoColumnName(int i) { if (i < autoColumnNames.length) { return autoColumnNames[i]; } return new HsqlName(staticManager, "C_" + (i + 1), 0, false); } /** * Column index i is 0 based, returns 1 based numbered column. */ public static String getAutoColumnNameString(int i) { if (i < autoColumnNames.length) { return autoColumnNames[i].name; } return "C" + (i + 1); } public static String getAutoNoNameColumnString(int i) { if (i < autoColumnNames.length) { return autoNoNameColumnNames[i]; } return String.valueOf(i); } public static String getAutoSavepointNameString(long i, int j) { StringBuffer sb = new StringBuffer("S"); sb.append(i).append('_').append(j); return sb.toString(); } /** * Auto names are used for autogenerated indexes or anonymous constraints. */ public HsqlName newAutoName(String prefix, String namepart, HsqlName schema, HsqlName parent, int type) { StringBuffer sb = new StringBuffer(); if (prefix != null) { if (prefix.length() != 0) { sb.append("SYS_"); sb.append(prefix); sb.append('_'); if (namepart != null) { sb.append(namepart); sb.append('_'); } sb.append(++sysNumber); } } else { sb.append(namepart); } HsqlName name = new HsqlName(this, sb.toString(), type, false); name.schema = schema; name.parent = parent; return name; } void resetNumbering() { sysNumber = 0; serialNumber = 0; } public static SimpleName getSimpleName(String name, boolean isNameQuoted) { return new SimpleName(name, isNameQuoted); } public static class SimpleName { public String name; public boolean isNameQuoted; private SimpleName() {} private SimpleName(String name, boolean isNameQuoted) { this.name = new String(name); this.isNameQuoted = isNameQuoted; } public int hashCode() { return name.hashCode(); } public boolean equals(Object other) { if (other instanceof SimpleName) { return ((SimpleName) other).isNameQuoted == isNameQuoted && ((SimpleName) other).name.equals(name); } return false; } public String getStatementName() { return isNameQuoted ? StringConverter.toQuotedString(name, '"', true) : name; } public String getNameString() { return name; } } public static final class HsqlName extends SimpleName { static HsqlName[] emptyArray = new HsqlName[]{}; // HsqlNameManager manager; public String statementName; public String comment; public HsqlName schema; public HsqlName parent; public Grantee owner; public final int type; private final int hashCode; private HsqlName(HsqlNameManager man, int type) { manager = man; this.type = type; hashCode = manager.serialNumber++; } private HsqlName(HsqlNameManager man, String name, boolean isquoted, int type) { this(man, type); rename(name, isquoted); } /** for auto names and system-defined names */ private HsqlName(HsqlNameManager man, String name, int type, boolean isQuoted) { this(man, type); this.name = name; this.statementName = name; this.isNameQuoted = isQuoted; if (isNameQuoted) { statementName = StringConverter.toQuotedString(name, '"', true); } } public String getStatementName() { return statementName; } public String getSchemaQualifiedStatementName() { switch (type) { case SchemaObject.PARAMETER : case SchemaObject.VARIABLE : { return statementName; } case SchemaObject.COLUMN : { if (parent == null || SqlInvariants.SYSTEM_SUBQUERY.equals( parent.name)) { return statementName; } StringBuffer sb = new StringBuffer(); if (schema != null) { sb.append(schema.getStatementName()); sb.append('.'); } sb.append(parent.getStatementName()); sb.append('.'); sb.append(statementName); return sb.toString(); } } if (schema == null) { return statementName; } StringBuffer sb = new StringBuffer(); if (schema != null) { sb.append(schema.getStatementName()); sb.append('.'); } sb.append(statementName); return sb.toString(); } public void rename(HsqlName name) { rename(name.name, name.isNameQuoted); } public void rename(String name, boolean isquoted) { if (manager.sqlRegularNames && name.length() > 128) { throw Error.error(ErrorCode.X_42501, name); } // get rid of the excess this.name = new String(name); this.statementName = this.name; this.isNameQuoted = isquoted; if (isNameQuoted) { statementName = StringConverter.toQuotedString(name, '"', true); } if (name.startsWith("SYS_")) { int length = name.lastIndexOf('_') + 1; try { int temp = Integer.parseInt(name.substring(length)); if (temp > manager.sysNumber) { manager.sysNumber = temp; } } catch (NumberFormatException e) {} } } void rename(String prefix, String name, boolean isquoted) { StringBuffer sbname = new StringBuffer(prefix); sbname.append('_'); sbname.append(name); rename(sbname.toString(), isquoted); } public void setSchemaIfNull(HsqlName schema) { if (this.schema == null) { this.schema = schema; } } public boolean equals(Object other) { if (other instanceof HsqlName) { return hashCode == ((HsqlName) other).hashCode; } return false; } /** * hash code for this object is its unique serial number. */ public int hashCode() { return hashCode; } /** * "SYS_IDX_" is used for auto-indexes on referring FK columns or * unique constraints. * "SYS_PK_" is for the primary key constraints * "SYS_CT_" is for unique and check constraints * "SYS_REF_" is for FK constraints in referenced tables * "SYS_FK_" is for FK constraints in referencing tables * */ static final String[] sysPrefixes = new String[] { "SYS_IDX_", "SYS_PK_", "SYS_REF_", "SYS_CT_", "SYS_FK_", }; static int sysPrefixLength(String name) { for (int i = 0; i < sysPrefixes.length; i++) { if (name.startsWith(sysPrefixes[i])) { return sysPrefixes[i].length(); } } return 0; } static boolean isReservedName(String name) { return sysPrefixLength(name) > 0; } boolean isReservedName() { return isReservedName(name); } public String toString() { return getClass().getName() + super.hashCode() + "[this.hashCode()=" + this.hashCode + ", name=" + name + ", name.hashCode()=" + name.hashCode() + ", isNameQuoted=" + isNameQuoted + "]"; } public int compareTo(Object o) { return hashCode - o.hashCode(); } /** * Returns true if the identifier consists of all uppercase letters * digits and underscore, beginning with a letter and is not in the * keyword list. */ static boolean isRegularIdentifier(String name) { for (int i = 0, length = name.length(); i < length; i++) { int c = name.charAt(i); if (c >= 'A' && c <= 'Z') { continue; } else if (c == '_' && i > 0) { continue; } else if (c >= '0' && c <= '9') { continue; } return false; } return !Tokens.isKeyword(name); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TableWorks.java0000644000175000017500000013102412007547362021665 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.navigator.RowIterator; import org.hsqldb.persist.PersistentStore; import org.hsqldb.rights.Grantee; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * The methods in this class perform alterations to the structure of an * existing table which may result in a new Table object * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.0 */ public class TableWorks { OrderedHashSet emptySet = new OrderedHashSet(); private Database database; private Table table; private Session session; public TableWorks(Session session, Table table) { this.database = table.database; this.table = table; this.session = session; } public Table getTable() { return table; } void checkCreateForeignKey(Constraint c) { boolean check = c.core.updateAction == SchemaObject.ReferentialAction .SET_DEFAULT || c.core.updateAction == SchemaObject .ReferentialAction.SET_NULL || c.core .updateAction == SchemaObject.ReferentialAction.CASCADE || c .core.deleteAction == SchemaObject.ReferentialAction .SET_DEFAULT || c.core.deleteAction == SchemaObject .ReferentialAction.SET_NULL; if (check) { for (int i = 0; i < c.core.refCols.length; i++) { ColumnSchema col = table.getColumn(c.core.refCols[i]); if (col.isGenerated()) { throw Error.error(ErrorCode.X_42524, col.getNameString()); } } } if (c.core.mainName == table.getName()) { if (ArrayUtil.haveCommonElement(c.core.refCols, c.core.mainCols)) { throw Error.error(ErrorCode.X_42527); } } // column defaults check = c.core.updateAction == SchemaObject.ReferentialAction.SET_DEFAULT || c.core.deleteAction == SchemaObject.ReferentialAction.SET_DEFAULT; if (check) { for (int i = 0; i < c.core.refCols.length; i++) { ColumnSchema col = table.getColumn(c.core.refCols[i]); Expression defExpr = col.getDefaultExpression(); if (defExpr == null) { String columnName = col.getName().statementName; throw Error.error(ErrorCode.X_42521, columnName); } } } check = c.core.updateAction == SchemaObject.ReferentialAction.SET_NULL || c.core.deleteAction == SchemaObject.ReferentialAction.SET_NULL; if (check && !session.isProcessingScript) { for (int i = 0; i < c.core.refCols.length; i++) { ColumnSchema col = table.getColumn(c.core.refCols[i]); if (!col.isNullable()) { String columnName = col.getName().statementName; throw Error.error(ErrorCode.X_42520, columnName); } } } database.schemaManager.checkSchemaObjectNotExists(c.getName()); // duplicate name check for a new table if (table.getConstraint(c.getName().name) != null) { throw Error.error(ErrorCode.X_42504, c.getName().statementName); } // existing FK check if (table.getFKConstraintForColumns( c.core.mainTable, c.core.mainCols, c.core.refCols) != null) { throw Error.error(ErrorCode.X_42528, c.getName().statementName); } if (c.core.mainTable.isTemp() != table.isTemp()) { throw Error.error(ErrorCode.X_42524, c.getName().statementName); } Constraint unique = c.core.mainTable.getUniqueConstraintForColumns(c.core.mainCols); if (unique == null) { throw Error.error(ErrorCode.X_42529, c.getMain().getName().statementName); } // check after UNIQUE check c.core.mainTable.checkColumnsMatch(c.core.mainCols, table, c.core.refCols); ArrayUtil.reorderMaps(unique.getMainColumns(), c.getMainColumns(), c.getRefColumns()); boolean[] checkList = c.core.mainTable.getColumnCheckList(c.core.mainCols); Grantee grantee = session.getGrantee(); grantee.checkReferences(c.core.mainTable, checkList); } /** * Creates a foreign key on an existing table. Foreign keys are enforced by * indexes on both the referencing (child) and referenced (main) tables. * *

Since version 1.7.2, a unique constraint on the referenced columns * must exist. The non-unique index on the referencing table is now always * created whether or not a PK or unique constraint index on the columns * exist. Foriegn keys on temp tables can reference other temp tables with * the same rules above. Foreign keys on permanent tables cannot reference * temp tables. Duplicate foreign keys are now disallowed. * * @param c the constraint object */ void addForeignKey(Constraint c) { checkModifyTable(); checkCreateForeignKey(c); Constraint uniqueConstraint = c.core.mainTable.getUniqueConstraintForColumns(c.core.mainCols); Index mainIndex = uniqueConstraint.getMainIndex(); uniqueConstraint.checkReferencedRows(session, table); boolean isForward = false; if (c.core.mainTable.getSchemaName() == table.getSchemaName()) { int offset = database.schemaManager.getTableIndex(table); if (offset != -1 && offset < database.schemaManager.getTableIndex( c.core.mainTable)) { isForward = true; } } else { isForward = true; } HsqlName indexName = database.nameManager.newAutoName("IDX", table.getSchemaName(), table.getName(), SchemaObject.INDEX); Index refIndex = table.createIndexStructure(indexName, c.core.refCols, null, null, false, true, isForward); HsqlName mainName = database.nameManager.newAutoName("REF", c.getName().name, table.getSchemaName(), table.getName(), SchemaObject.INDEX); c.core.uniqueName = uniqueConstraint.getName(); c.core.mainName = mainName; c.core.mainIndex = mainIndex; c.core.refTable = table; c.core.refName = c.getName(); c.core.refIndex = refIndex; c.isForward = isForward; Table tn = table.moveDefinition(session, table.tableType, null, c, refIndex, -1, 0, emptySet, emptySet); moveData(table, tn, -1, 0); database.schemaManager.addSchemaObject(c); setNewTableInSchema(tn); Table mainTable = database.schemaManager.getTable(session, c.core.mainTable.getName().name, c.core.mainTable.getSchemaName().name); mainTable.addConstraint(new Constraint(mainName, c)); updateConstraints(tn, emptySet); database.schemaManager.recompileDependentObjects(tn); table = tn; } /** * Checks if the attributes of the Column argument, c, are compatible with * the operation of adding such a Column to the Table argument, table. * * @param col the Column to add to the Table, t */ void checkAddColumn(ColumnSchema col) { checkModifyTable(); if (table.isText() && !table.isEmpty(session)) { throw Error.error(ErrorCode.X_S0521); } if (table.findColumn(col.getName().name) != -1) { throw Error.error(ErrorCode.X_42504); } if (col.isPrimaryKey() && table.hasPrimaryKey()) { throw Error.error(ErrorCode.X_42530); } if (col.isIdentity() && table.hasIdentityColumn()) { throw Error.error(ErrorCode.X_42525); } if (!table.isEmpty(session) && !col.hasDefault() && (!col.isNullable() || col.isPrimaryKey()) && !col.isIdentity()) { throw Error.error(ErrorCode.X_42531); } } void addColumn(ColumnSchema column, int colIndex, HsqlArrayList constraints) { Index index = null; Constraint mainConstraint = null; boolean addFK = false; boolean addUnique = false; boolean addCheck = false; checkAddColumn(column); Constraint c = (Constraint) constraints.get(0); if (c.getConstraintType() == SchemaObject.ConstraintTypes.PRIMARY_KEY) { if (column.getDataType().isLobType()) { throw Error.error(ErrorCode.X_42534); } c.core.mainCols = new int[]{ colIndex }; database.schemaManager.checkSchemaObjectNotExists(c.getName()); if (table.hasPrimaryKey()) { throw Error.error(ErrorCode.X_42530); } addUnique = true; } else { c = null; } Table tn = table.moveDefinition(session, table.tableType, column, c, null, colIndex, 1, emptySet, emptySet); for (int i = 1; i < constraints.size(); i++) { c = (Constraint) constraints.get(i); switch (c.constType) { case SchemaObject.ConstraintTypes.UNIQUE : { if (addUnique) { throw Error.error(ErrorCode.X_42522); } if (column.getDataType().isLobType()) { throw Error.error(ErrorCode.X_42534); } addUnique = true; c.core.mainCols = new int[]{ colIndex }; database.schemaManager.checkSchemaObjectNotExists( c.getName()); HsqlName indexName = database.nameManager.newAutoName("IDX", c.getName().name, table.getSchemaName(), table.getName(), SchemaObject.INDEX); // create an autonamed index index = tn.createAndAddIndexStructure(indexName, c.getMainColumns(), null, null, true, true, false); c.core.mainTable = tn; c.core.mainIndex = index; tn.addConstraint(c); break; } case SchemaObject.ConstraintTypes.FOREIGN_KEY : { if (addFK) { throw Error.error(ErrorCode.X_42528); } addFK = true; c.core.refCols = new int[]{ colIndex }; c.core.mainTable = database.schemaManager.getUserTable(session, c.getMainTableName()); c.core.refTable = tn; c.core.refName = c.getName(); boolean isSelf = table == c.core.mainTable; if (isSelf) { c.core.mainTable = tn; } c.setColumnsIndexes(tn); checkCreateForeignKey(c); Constraint uniqueConstraint = c.core.mainTable.getUniqueConstraintForColumns( c.core.mainCols); boolean isForward = c.core.mainTable.getSchemaName() != table.getSchemaName(); int offset = database.schemaManager.getTableIndex(table); if (!isSelf && offset < database.schemaManager.getTableIndex( c.core.mainTable)) { isForward = true; } HsqlName indexName = database.nameManager.newAutoName("IDX", c.getName().name, table.getSchemaName(), table.getName(), SchemaObject.INDEX); index = tn.createAndAddIndexStructure(indexName, c.getRefColumns(), null, null, false, true, isForward); c.core.uniqueName = uniqueConstraint.getName(); c.core.mainName = database.nameManager.newAutoName("REF", c.core.refName.name, table.getSchemaName(), table.getName(), SchemaObject.INDEX); c.core.mainIndex = uniqueConstraint.getMainIndex(); c.core.refIndex = index; c.isForward = isForward; tn.addConstraint(c); mainConstraint = new Constraint(c.core.mainName, c); break; } case SchemaObject.ConstraintTypes.CHECK : if (addCheck) { throw Error.error(ErrorCode.X_42528); } addCheck = true; c.prepareCheckConstraint(session, tn, false); tn.addConstraint(c); if (c.isNotNull()) { column.setNullable(false); tn.setColumnTypeVars(colIndex); if (!table.isEmpty(session) && !column.hasDefault()) { throw Error.error(ErrorCode.X_42531); } } break; } } column.compile(session, tn); moveData(table, tn, colIndex, 1); if (mainConstraint != null) { mainConstraint.getMain().addConstraint(mainConstraint); } registerConstraintNames(constraints); setNewTableInSchema(tn); updateConstraints(tn, emptySet); database.schemaManager.addSchemaObject(column); database.schemaManager.recompileDependentObjects(tn); tn.compile(session, null); table = tn; } void updateConstraints(OrderedHashSet tableSet, OrderedHashSet dropConstraints) { for (int i = 0; i < tableSet.size(); i++) { Table t = (Table) tableSet.get(i); updateConstraints(t, dropConstraints); } } void updateConstraints(Table t, OrderedHashSet dropConstraints) { for (int i = t.constraintList.length - 1; i >= 0; i--) { Constraint c = t.constraintList[i]; if (dropConstraints.contains(c.getName())) { t.removeConstraint(i); continue; } if (c.getConstraintType() == SchemaObject.ConstraintTypes.FOREIGN_KEY) { Table refT = database.schemaManager.getUserTable(session, c.core.refTable.getName()); c.core.refTable = refT; Table mainT = database.schemaManager.getUserTable(session, c.core.mainTable.getName()); Constraint mainC = mainT.getConstraint(c.getMainName().name); mainC.core = c.core; } else if (c.getConstraintType() == SchemaObject.ConstraintTypes.MAIN) { Table mainT = database.schemaManager.getUserTable(session, c.core.mainTable.getName()); c.core.mainTable = mainT; Table refT = database.schemaManager.getUserTable(session, c.core.refTable.getName()); Constraint refC = refT.getConstraint(c.getRefName().name); refC.core = c.core; } } } OrderedHashSet makeNewTables(OrderedHashSet tableSet, OrderedHashSet dropConstraintSet, OrderedHashSet dropIndexSet) { OrderedHashSet newSet = new OrderedHashSet(); for (int i = 0; i < tableSet.size(); i++) { Table t = (Table) tableSet.get(i); TableWorks tw = new TableWorks(session, t); tw.makeNewTable(dropConstraintSet, dropIndexSet); newSet.add(tw.getTable()); } return newSet; } /** * Drops constriants and their indexes in table. Uses set of names. */ void makeNewTable(OrderedHashSet dropConstraintSet, OrderedHashSet dropIndexSet) { Table tn = table.moveDefinition(session, table.tableType, null, null, null, -1, 0, dropConstraintSet, dropIndexSet); if (tn.indexList.length == table.indexList.length) { database.persistentStoreCollection.releaseStore(tn); return; } moveData(table, tn, -1, 0); table = tn; } void alterIndex(Index index, int[] cols) { Index newIndex = database.logger.newIndex(table, index, cols); int position = index.getPosition(); PersistentStore store = database.persistentStoreCollection.getStore(table); Index[] indexes = store.getAccessorKeys(); newIndex.setPosition(position); table.getIndexList()[position] = newIndex; table.setBestRowIdentifiers(); indexes[position] = newIndex; store.reindex(session, newIndex); } /** * Because of the way indexes and column data are held in memory and on * disk, it is necessary to recreate the table when an index is added to a * non-empty cached table. * *

With empty tables, Index objects are simply added * *

With MEOMRY and TEXT tables, a new index is built up and nodes for * earch row are interlinked (fredt@users) * * @param col int[] * @param name HsqlName * @param unique boolean * @return new index */ Index addIndex(int[] col, HsqlName name, boolean unique) { Index newindex; checkModifyTable(); if (table.isEmpty(session) || table.isIndexingMutable()) { newindex = table.createIndex(session, name, col, null, null, unique, false, false); } else { newindex = table.createIndexStructure(name, col, null, null, unique, false, false); Table tn = table.moveDefinition(session, table.tableType, null, null, newindex, -1, 0, emptySet, emptySet); moveData(table, tn, -1, 0); table = tn; setNewTableInSchema(table); updateConstraints(table, emptySet); } database.schemaManager.addSchemaObject(newindex); database.schemaManager.recompileDependentObjects(table); return newindex; } void addPrimaryKey(Constraint constraint) { checkModifyTable(); if (table.hasPrimaryKey()) { throw Error.error(ErrorCode.X_42532); } database.schemaManager.checkSchemaObjectNotExists( constraint.getName()); Table tn = table.moveDefinition(session, table.tableType, null, constraint, null, -1, 0, emptySet, emptySet); moveData(table, tn, -1, 0); table = tn; database.schemaManager.addSchemaObject(constraint); setNewTableInSchema(table); updateConstraints(table, emptySet); database.schemaManager.recompileDependentObjects(table); } /** * A unique constraint relies on a unique indexe on the table. It can cover * a single column or multiple columns. * *

All unique constraint names are generated by Database.java as unique * within the database. Duplicate constraints (more than one unique * constriant on the same set of columns) are not allowed. (fredt@users) * * @param cols int[] * @param name HsqlName */ void addUniqueConstraint(int[] cols, HsqlName name) { checkModifyTable(); database.schemaManager.checkSchemaObjectNotExists(name); if (table.getUniqueConstraintForColumns(cols) != null) { throw Error.error(ErrorCode.X_42522); } // create an autonamed index HsqlName indexname = database.nameManager.newAutoName("IDX", name.name, table.getSchemaName(), table.getName(), SchemaObject.INDEX); Index index = table.createIndexStructure(indexname, cols, null, null, true, true, false); Constraint constraint = new Constraint(name, table, index, SchemaObject.ConstraintTypes.UNIQUE); Table tn = table.moveDefinition(session, table.tableType, null, constraint, index, -1, 0, emptySet, emptySet); moveData(table, tn, -1, 0); table = tn; database.schemaManager.addSchemaObject(constraint); setNewTableInSchema(table); updateConstraints(table, emptySet); database.schemaManager.recompileDependentObjects(table); } void addUniqueConstraint(Constraint constraint) { checkModifyTable(); database.schemaManager.checkSchemaObjectNotExists( constraint.getName()); if (table.getUniqueConstraintForColumns(constraint.getMainColumns()) != null) { throw Error.error(ErrorCode.X_42522); } Table tn = table.moveDefinition(session, table.tableType, null, constraint, constraint.getMainIndex(), -1, 0, emptySet, emptySet); moveData(table, tn, -1, 0); table = tn; database.schemaManager.addSchemaObject(constraint); setNewTableInSchema(table); updateConstraints(table, emptySet); database.schemaManager.recompileDependentObjects(table); } void addCheckConstraint(Constraint c) { checkModifyTable(); database.schemaManager.checkSchemaObjectNotExists(c.getName()); c.prepareCheckConstraint(session, table, true); table.addConstraint(c); if (c.isNotNull()) { ColumnSchema column = table.getColumn(c.notNullColumnIndex); column.setNullable(false); table.setColumnTypeVars(c.notNullColumnIndex); } database.schemaManager.addSchemaObject(c); } /** * Because of the way indexes and column data are held in memory and on * disk, it is necessary to recreate the table when an index is added to or * removed from a non-empty table. * *

Originally, this method would break existing foreign keys as the * table order in the DB was changed. The new table is now linked in place * of the old table (fredt@users) * * @param indexName String */ void dropIndex(String indexName) { Index index; checkModifyTable(); index = table.getIndex(indexName); if (table.isIndexingMutable()) { table.dropIndex(index.getPosition()); } else { OrderedHashSet indexSet = new OrderedHashSet(); indexSet.add(table.getIndex(indexName).getName()); Table tn = table.moveDefinition(session, table.tableType, null, null, null, -1, 0, emptySet, indexSet); moveData(table, tn, -1, 0); setNewTableInSchema(tn); updateConstraints(tn, emptySet); table = tn; } if (!index.isConstraint()) { database.schemaManager.removeSchemaObject(index.getName()); } database.schemaManager.recompileDependentObjects(table); } void dropColumn(int colIndex, boolean cascade) { OrderedHashSet constraintNameSet = new OrderedHashSet(); OrderedHashSet dependentConstraints = table.getDependentConstraints(colIndex); OrderedHashSet cascadingConstraints = table.getContainingConstraints(colIndex); OrderedHashSet indexNameSet = table.getContainingIndexNames(colIndex); ColumnSchema column = table.getColumn(colIndex); HsqlName columnName = column.getName(); OrderedHashSet referencingObjects = database.schemaManager.getReferencesTo(table.getName(), columnName); checkModifyTable(); if (!cascade) { if (!cascadingConstraints.isEmpty()) { Constraint c = (Constraint) cascadingConstraints.get(0); HsqlName name = c.getName(); throw Error.error(ErrorCode.X_42536, name.getSchemaQualifiedStatementName()); } if (!referencingObjects.isEmpty()) { mainLoop: for (int i = 0; i < referencingObjects.size(); i++) { HsqlName name = (HsqlName) referencingObjects.get(i); if (name == columnName) { continue; } for (int j = 0; j < dependentConstraints.size(); j++) { Constraint c = (Constraint) dependentConstraints.get(j);; if (c.getName() == name) { continue mainLoop; } } throw Error.error(ErrorCode.X_42536, name.getSchemaQualifiedStatementName()); } } } dependentConstraints.addAll(cascadingConstraints); cascadingConstraints.clear(); OrderedHashSet tableSet = new OrderedHashSet(); for (int i = 0; i < dependentConstraints.size(); i++) { Constraint c = (Constraint) dependentConstraints.get(i); if (c.constType == SchemaObject.ConstraintTypes.FOREIGN_KEY) { tableSet.add(c.getMain()); constraintNameSet.add(c.getMainName()); constraintNameSet.add(c.getRefName()); indexNameSet.add(c.getRefIndex().getName()); } if (c.constType == SchemaObject.ConstraintTypes.MAIN) { tableSet.add(c.getRef()); constraintNameSet.add(c.getMainName()); constraintNameSet.add(c.getRefName()); indexNameSet.add(c.getRefIndex().getName()); } constraintNameSet.add(c.getName()); } tableSet = makeNewTables(tableSet, constraintNameSet, indexNameSet); Table tn = table.moveDefinition(session, table.tableType, null, null, null, colIndex, -1, constraintNameSet, indexNameSet); moveData(table, tn, colIndex, -1); database.schemaManager.removeSchemaObjects(referencingObjects); database.schemaManager.removeSchemaObjects(constraintNameSet); database.schemaManager.removeSchemaObject(columnName); setNewTableInSchema(tn); setNewTablesInSchema(tableSet); updateConstraints(tn, emptySet); updateConstraints(tableSet, constraintNameSet); database.schemaManager.recompileDependentObjects(tableSet); database.schemaManager.recompileDependentObjects(tn); tn.compile(session, null); table = tn; } void registerConstraintNames(HsqlArrayList constraints) { for (int i = 0; i < constraints.size(); i++) { Constraint c = (Constraint) constraints.get(i); switch (c.constType) { case SchemaObject.ConstraintTypes.PRIMARY_KEY : case SchemaObject.ConstraintTypes.UNIQUE : case SchemaObject.ConstraintTypes.CHECK : database.schemaManager.addSchemaObject(c); } } } void dropConstraint(String name, boolean cascade) { Constraint constraint = table.getConstraint(name); if (constraint == null) { throw Error.error(ErrorCode.X_42501, name); } switch (constraint.getConstraintType()) { case SchemaObject.ConstraintTypes.MAIN : throw Error.error(ErrorCode.X_28502); case SchemaObject.ConstraintTypes.PRIMARY_KEY : case SchemaObject.ConstraintTypes.UNIQUE : { checkModifyTable(); OrderedHashSet dependentConstraints = table.getDependentConstraints(constraint); // throw if unique constraint is referenced by foreign key if (!cascade && !dependentConstraints.isEmpty()) { Constraint c = (Constraint) dependentConstraints.get(0); throw Error.error( ErrorCode.X_42533, c.getName().getSchemaQualifiedStatementName()); } OrderedHashSet tableSet = new OrderedHashSet(); OrderedHashSet constraintNameSet = new OrderedHashSet(); OrderedHashSet indexNameSet = new OrderedHashSet(); for (int i = 0; i < dependentConstraints.size(); i++) { Constraint c = (Constraint) dependentConstraints.get(i); Table t = c.getMain(); if (t != table) { tableSet.add(t); } t = c.getRef(); if (t != table) { tableSet.add(t); } constraintNameSet.add(c.getMainName()); constraintNameSet.add(c.getRefName()); indexNameSet.add(c.getRefIndex().getName()); } constraintNameSet.add(constraint.getName()); if (constraint.getConstraintType() == SchemaObject.ConstraintTypes.UNIQUE) { indexNameSet.add(constraint.getMainIndex().getName()); } Table tn = table.moveDefinition(session, table.tableType, null, null, null, -1, 0, constraintNameSet, indexNameSet); moveData(table, tn, -1, 0); tableSet = makeNewTables(tableSet, constraintNameSet, indexNameSet); if (constraint.getConstraintType() == SchemaObject.ConstraintTypes.PRIMARY_KEY) { int[] cols = constraint.getMainColumns(); for (int i = 0; i < cols.length; i++) { // todo - check if table arrays relect the not-null correctly tn.getColumn(cols[i]).setPrimaryKey(false); tn.setColumnTypeVars(cols[i]); } } // database.schemaManager.removeSchemaObjects(constraintNameSet); setNewTableInSchema(tn); setNewTablesInSchema(tableSet); updateConstraints(tn, emptySet); updateConstraints(tableSet, constraintNameSet); database.schemaManager.recompileDependentObjects(tableSet); database.schemaManager.recompileDependentObjects(tn); table = tn; // handle cascadingConstraints and cascadingTables break; } case SchemaObject.ConstraintTypes.FOREIGN_KEY : { checkModifyTable(); OrderedHashSet constraints = new OrderedHashSet(); Table mainTable = constraint.getMain(); HsqlName mainName = constraint.getMainName(); constraints.add(mainName); constraints.add(constraint.getRefName()); OrderedHashSet indexes = new OrderedHashSet(); indexes.add(constraint.getRefIndex().getName()); Table tn = table.moveDefinition(session, table.tableType, null, null, null, -1, 0, constraints, indexes); moveData(table, tn, -1, 0); // database.schemaManager.removeSchemaObject( constraint.getName()); setNewTableInSchema(tn); // if constraint references same table, nothing changes mainTable.removeConstraint(mainName.name); updateConstraints(tn, emptySet); database.schemaManager.recompileDependentObjects(table); table = tn; break; } case SchemaObject.ConstraintTypes.CHECK : database.schemaManager.removeSchemaObject( constraint.getName()); if (constraint.isNotNull()) { ColumnSchema column = table.getColumn(constraint.notNullColumnIndex); column.setNullable(false); table.setColumnTypeVars(constraint.notNullColumnIndex); } break; } } /** * Allows changing the type only. * * @param oldCol Column * @param newCol Column */ void retypeColumn(ColumnSchema oldCol, ColumnSchema newCol) { Type oldType = oldCol.getDataType(); Type newType = newCol.getDataType(); checkModifyTable(); if (oldType.equals(newType) && oldCol.getIdentitySequence() == newCol.getIdentitySequence()) { return; } if (!table.isEmpty(session) && oldType.typeCode != newType.typeCode) { boolean allowed = newCol.getDataType().canConvertFrom(oldCol.getDataType()); switch (oldType.typeCode) { case Types.OTHER : case Types.JAVA_OBJECT : allowed = false; break; } if (!allowed) { throw Error.error(ErrorCode.X_42561); } } int colIndex = table.getColumnIndex(oldCol.getName().name); // 0 if only metadata change is required ; 1 if only check is required ; -1 if data conversion is required int checkData = newType.canMoveFrom(oldType); if (checkData == 0) { if (newCol.isIdentity()) { if (!(oldCol.isIdentity() || !oldCol.isNullable() || oldCol.isPrimaryKey())) { checkData = 1; } } } if (checkData == 1) { checkConvertColDataType(oldCol, newCol); checkData = 0; } if (checkData == 0) { // size of some types may be increased // default expressions can change // identity can be added or removed oldCol.setType(newCol); oldCol.setDefaultExpression(newCol.getDefaultExpression()); oldCol.setIdentity(newCol.getIdentitySequence()); table.setColumnTypeVars(colIndex); table.resetDefaultsFlag(); return; } database.schemaManager.checkColumnIsReferenced(table.getName(), table.getColumn(colIndex).getName()); table.checkColumnInCheckConstraint(colIndex); table.checkColumnInFKConstraint(colIndex); checkConvertColDataType(oldCol, newCol); retypeColumn(newCol, colIndex); } /** * * @param oldCol Column * @param newCol Column */ void checkConvertColDataType(ColumnSchema oldCol, ColumnSchema newCol) { int colIndex = table.getColumnIndex(oldCol.getName().name); RowIterator it = table.rowIterator(session); while (it.hasNext()) { Row row = it.getNextRow(); Object o = row.getData()[colIndex]; if (!newCol.isNullable() && o == null) { throw Error.error(ErrorCode.X_23502); } newCol.getDataType().convertToType(session, o, oldCol.getDataType()); } } /** * * @param column Column * @param colIndex int */ private void retypeColumn(ColumnSchema column, int colIndex) { Table tn = table.moveDefinition(session, table.tableType, column, null, null, colIndex, 0, emptySet, emptySet); moveData(table, tn, colIndex, 0); setNewTableInSchema(tn); updateConstraints(tn, emptySet); database.schemaManager.recompileDependentObjects(table); table = tn; } /** * performs the work for changing the nullability of a column * * @param column Column * @param nullable boolean */ void setColNullability(ColumnSchema column, boolean nullable) { Constraint c = null; int colIndex = table.getColumnIndex(column.getName().name); if (column.isNullable() == nullable) { return; } if (nullable) { if (column.isPrimaryKey()) { throw Error.error(ErrorCode.X_42526); } table.checkColumnInFKConstraint( colIndex, SchemaObject.ReferentialAction.SET_NULL); removeColumnNotNullConstraints(colIndex); } else { HsqlName constName = database.nameManager.newAutoName("CT", table.getSchemaName(), table.getName(), SchemaObject.CONSTRAINT); c = new Constraint(constName, null, SchemaObject.ConstraintTypes.CHECK); c.check = new ExpressionLogical(column); c.prepareCheckConstraint(session, table, true); column.setNullable(false); table.addConstraint(c); table.setColumnTypeVars(colIndex); database.schemaManager.addSchemaObject(c); } } /** * performs the work for changing the default value of a column * * @param colIndex int * @param def Expression */ void setColDefaultExpression(int colIndex, Expression def) { if (def == null) { table.checkColumnInFKConstraint( colIndex, SchemaObject.ReferentialAction.SET_DEFAULT); } ColumnSchema column = table.getColumn(colIndex); column.setDefaultExpression(def); table.setColumnTypeVars(colIndex); } /** * Changes the type of a table * * @param session Session * @param newType int * @return boolean */ public boolean setTableType(Session session, int newType) { int currentType = table.getTableType(); if (currentType == newType) { return false; } switch (newType) { case TableBase.CACHED_TABLE : break; case TableBase.MEMORY_TABLE : break; default : return false; } Table tn; try { tn = table.moveDefinition(session, newType, null, null, null, -1, 0, emptySet, emptySet); moveData(table, tn, -1, 0); } catch (HsqlException e) { return false; } setNewTableInSchema(tn); updateConstraints(tn, emptySet); table = tn; database.schemaManager.recompileDependentObjects(table); return true; } void setNewTablesInSchema(OrderedHashSet tableSet) { for (int i = 0; i < tableSet.size(); i++) { Table t = (Table) tableSet.get(i); setNewTableInSchema(t); } } void setNewTableInSchema(Table newTable) { int i = database.schemaManager.getTableIndex(newTable); if (i != -1) { database.schemaManager.setTable(i, newTable); } } void removeColumnNotNullConstraints(int colIndex) { for (int i = table.constraintList.length - 1; i >= 0; i--) { Constraint c = table.constraintList[i]; if (c.isNotNull()) { if (c.notNullColumnIndex == colIndex) { database.schemaManager.removeSchemaObject(c.getName()); } } } ColumnSchema column = table.getColumn(colIndex); column.setNullable(true); table.setColumnTypeVars(colIndex); } private void checkModifyTable() { if (session.getUser().isSystem()) { return; } if (session.isProcessingScript) { return; } if (database.isFilesReadOnly() || table.isReadOnly()) { throw Error.error(ErrorCode.DATA_IS_READONLY); } if (table.isText() && table.isConnected()) { throw Error.error(ErrorCode.X_S0521); } } void moveData(Table oldTable, Table newTable, int colIndex, int adjust) { int tableType = oldTable.getTableType(); if (tableType == Table.TEMP_TABLE) { Session sessions[] = database.sessionManager.getAllSessions(); for (int i = 0; i < sessions.length; i++) { sessions[i].sessionData.persistentStoreCollection.moveData( oldTable, newTable, colIndex, adjust); } } else { PersistentStore oldStore = database.persistentStoreCollection.getStore(oldTable); PersistentStore newStore = database.persistentStoreCollection.getStore(newTable); try { newStore.moveData(session, oldStore, colIndex, adjust); } catch (HsqlException e) { newStore.release(); database.persistentStoreCollection.setStore(newTable, null); throw e; } database.persistentStoreCollection.releaseStore(oldTable); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ExpressionArrayAggregate.java0000644000175000017500000003012412007547376024561 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayListIdentity; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.HsqlList; import org.hsqldb.types.ArrayType; import org.hsqldb.types.NumberType; import org.hsqldb.types.RowType; import org.hsqldb.types.Type; /** * Implementation of array aggregate operations * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 2.0.1 */ public class ExpressionArrayAggregate extends Expression { boolean isDistinctAggregate; SortAndSlice sort; String separator = ","; ArrayType arrayDataType; Type exprType; Expression condition = Expression.EXPR_TRUE; ExpressionArrayAggregate(int type, boolean distinct, Expression e, SortAndSlice sort, String separator) { super(type); this.isDistinctAggregate = distinct; this.sort = sort; if (separator != null) { this.separator = separator; } if (type == OpTypes.MEDIAN) { nodes = new Expression[]{ e }; return; } if (sort == null) { nodes = new Expression[]{ e }; } else { HsqlArrayList list = sort.getExpressionList(); nodes = new Expression[list.size() + 1]; list.toArray(nodes); nodes[list.size()] = e; sort.prepare(1); } } boolean isSelfAggregate() { return true; } public String getSQL() { StringBuffer sb = new StringBuffer(64); String left = getContextSQL(nodes.length > 0 ? nodes[LEFT] : null); switch (opType) { case OpTypes.ARRAY_AGG : sb.append(' ').append(Tokens.T_ARRAY_AGG).append('('); sb.append(left).append(')'); break; case OpTypes.GROUP_CONCAT : sb.append(' ').append(Tokens.T_GROUP_CONCAT).append('('); sb.append(left).append(')'); break; case OpTypes.MEDIAN : sb.append(' ').append(Tokens.T_MEDIAN).append('('); sb.append(left).append(')'); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionAggregate"); } return sb.toString(); } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(64); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } switch (opType) { case OpTypes.ARRAY_AGG : sb.append(Tokens.T_ARRAY_AGG).append(' '); break; case OpTypes.GROUP_CONCAT : sb.append(Tokens.T_GROUP_CONCAT).append(' '); break; case OpTypes.MEDIAN : sb.append(Tokens.T_MEDIAN).append(' '); break; } if (getLeftNode() != null) { sb.append(" arg=["); sb.append(nodes[LEFT].describe(session, blanks + 1)); sb.append(']'); } return sb.toString(); } public HsqlList resolveColumnReferences(Session session, RangeGroup rangeGroup, int rangeCount, RangeGroup[] rangeGroups, HsqlList unresolvedSet, boolean acceptsSequences) { HsqlList conditionSet = condition.resolveColumnReferences(session, rangeGroup, rangeCount, rangeGroups, null, false); if (conditionSet != null) { ExpressionColumn.checkColumnsResolved(conditionSet); } if (unresolvedSet == null) { unresolvedSet = new ArrayListIdentity(); } unresolvedSet.add(this); return unresolvedSet; } public void resolveTypes(Session session, Expression parent) { nodeDataTypes = new Type[nodes.length]; for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { nodes[i].resolveTypes(session, this); if (nodes[i].isUnresolvedParam()) { throw Error.error(ErrorCode.X_42567); } if (nodes[i].dataType == null) { throw Error.error(ErrorCode.X_42567); } nodeDataTypes[i] = nodes[i].dataType; } } exprType = nodes[nodes.length - 1].dataType; if (exprType.isLobType()) { throw Error.error(ErrorCode.X_42534); } if (exprType.isArrayType()) { throw Error.error(ErrorCode.X_42534); } Type rowDataType = new RowType(nodeDataTypes); switch (opType) { case OpTypes.ARRAY_AGG : arrayDataType = new ArrayType(rowDataType, ArrayType.defaultArrayCardinality); dataType = new ArrayType(exprType, ArrayType.defaultArrayCardinality); break; case OpTypes.GROUP_CONCAT : arrayDataType = new ArrayType(rowDataType, ArrayType.defaultArrayCardinality); dataType = Type.SQL_VARCHAR_DEFAULT; break; case OpTypes.MEDIAN : arrayDataType = new ArrayType(nodeDataTypes[0], ArrayType.defaultArrayCardinality); dataType = SetFunction.getType(session, OpTypes.MEDIAN, exprType); if (!exprType.isNumberType()) { throw Error.error(ErrorCode.X_42563); } break; } condition.resolveTypes(session, null); } public boolean equals(Expression other) { if (!(other instanceof ExpressionArrayAggregate)) { return false; } ExpressionArrayAggregate o = (ExpressionArrayAggregate) other; if (opType == other.opType && exprSubType == other.exprSubType && isDistinctAggregate == o.isDistinctAggregate && separator.equals(o.separator) && condition.equals(o.condition)) { return super.equals(other); } return false; } public Object updateAggregatingValue(Session session, Object currValue) { if (!condition.testCondition(session)) { return currValue; } Object currentVal = null; switch (opType) { case OpTypes.ARRAY_AGG : case OpTypes.GROUP_CONCAT : Object[] row = new Object[nodes.length]; for (int i = 0; i < nodes.length; i++) { row[i] = nodes[i].getValue(session); } if (opType == OpTypes.GROUP_CONCAT && row[row.length - 1] == null) { return currValue; } currentVal = row; break; case OpTypes.MEDIAN : currentVal = nodes[0].getValue(session); break; } HsqlArrayList list = (HsqlArrayList) currValue; if (list == null) { list = new HsqlArrayList(); } list.add(currentVal); return list; } public Object getAggregatedValue(Session session, Object currValue) { if (currValue == null) { return null; } HsqlArrayList list = (HsqlArrayList) currValue; Object[] array = list.toArray(); if (isDistinctAggregate) { SortAndSlice exprSort = new SortAndSlice(); exprSort.prepareSingleColumn(nodes.length - 1); arrayDataType.sort(session, array, exprSort); int size = arrayDataType.deDuplicate(session, array, exprSort); array = (Object[]) ArrayUtil.resizeArrayIfDifferent(array, size); } if (sort != null) { arrayDataType.sort(session, array, sort); } switch (opType) { case OpTypes.ARRAY_AGG : { Object[] resultArray = new Object[array.length]; for (int i = 0; i < list.size(); i++) { Object[] row = (Object[]) array[i]; resultArray[i] = row[row.length - 1]; } return resultArray; } case OpTypes.GROUP_CONCAT : { StringBuffer sb = new StringBuffer(16 * list.size()); for (int i = 0; i < array.length; i++) { if (i > 0) { sb.append(separator); } Object[] row = (Object[]) array[i]; String value = exprType.convertToString(row[row.length - 1]); sb.append(value); } return sb.toString(); } case OpTypes.MEDIAN : { SortAndSlice exprSort = new SortAndSlice(); exprSort.prepareSingleColumn(1); arrayDataType.sort(session, array, exprSort); boolean even = array.length % 2 == 0; if (even) { Object val1 = array[(array.length / 2) - 1]; Object val2 = array[array.length / 2]; Object val3 = ((NumberType) dataType).add(val1, val2, dataType); return ((NumberType) dataType).divide(session, val3, Integer.valueOf(2)); } else { return dataType.convertToType(session, array[array.length / 2], exprType); } } } return null; } public Expression getCondition() { return condition; } public boolean hasCondition() { return condition != null && condition != Expression.EXPR_TRUE; } public void setCondition(Expression e) { condition = e; } public Expression duplicate() { ExpressionArrayAggregate e = (ExpressionArrayAggregate) super.duplicate(); if (condition != null) { e.condition = condition.duplicate(); } return e; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/jdbcDriver.java0000644000175000017500000000322712007547362021671 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; public class jdbcDriver extends org.hsqldb.jdbc.JDBCDriver { } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/result/0000755000175000017500000000000012007570424020255 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/result/ResultMetaData.java0000644000175000017500000004004512007547374024012 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.result; import java.io.IOException; import org.hsqldb.ColumnBase; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.rowio.RowInputBinary; import org.hsqldb.rowio.RowOutputInterface; import org.hsqldb.types.ArrayType; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Metadata for a result set. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.1.1 * @since 1.8.0 */ public final class ResultMetaData { public static final int RESULT_METADATA = 1; public static final int SIMPLE_RESULT_METADATA = 2; public static final int UPDATE_RESULT_METADATA = 3; public static final int PARAM_METADATA = 4; public static final int GENERATED_INDEX_METADATA = 5; public static final int GENERATED_NAME_METADATA = 6; // private int type; // values overriding table column public String[] columnLabels; public Type[] columnTypes; private int columnCount; private int extendedColumnCount; public static final ResultMetaData emptyResultMetaData = newResultMetaData(0); public static final ResultMetaData emptyParamMetaData = newParameterMetaData(0); // column indexes for mapping or for generated columns public int[] colIndexes; // columns for data columns public ColumnBase[] columns; // param mode and nullability for parameter metadata public byte[] paramModes; public byte[] paramNullable; // private ResultMetaData(int type) { this.type = type; } public static ResultMetaData newUpdateResultMetaData(Type[] types) { ResultMetaData md = new ResultMetaData(UPDATE_RESULT_METADATA); md.columnTypes = new Type[types.length]; md.columnCount = types.length; md.extendedColumnCount = types.length; ArrayUtil.copyArray(types, md.columnTypes, types.length); return md; } public static ResultMetaData newSimpleResultMetaData(Type[] types) { ResultMetaData md = new ResultMetaData(SIMPLE_RESULT_METADATA); md.columnTypes = types; md.columnCount = types.length; md.extendedColumnCount = types.length; return md; } public static ResultMetaData newResultMetaData(int colCount) { Type[] types = new Type[colCount]; return newResultMetaData(types, null, colCount, colCount); } public static ResultMetaData newSingleColumnMetaData(String colName) { ResultMetaData md = ResultMetaData.newResultMetaData(1); md.columns[0] = new ColumnBase(null, null, null, colName); md.columns[0].setType(Type.SQL_VARCHAR_DEFAULT); md.prepareData(); return md; } public static ResultMetaData newResultMetaData(Type[] types, int[] baseColumnIndexes, int colCount, int extColCount) { ResultMetaData md = new ResultMetaData(RESULT_METADATA); md.columnLabels = new String[colCount]; md.columns = new ColumnBase[colCount]; md.columnTypes = types; md.colIndexes = baseColumnIndexes; md.columnCount = colCount; md.extendedColumnCount = extColCount; return md; } public static ResultMetaData newParameterMetaData(int colCount) { ResultMetaData md = new ResultMetaData(PARAM_METADATA); md.columnTypes = new Type[colCount]; md.columnLabels = new String[colCount]; md.paramModes = new byte[colCount]; md.paramNullable = new byte[colCount]; md.columnCount = colCount; md.extendedColumnCount = colCount; return md; } public static ResultMetaData newGeneratedColumnsMetaData( int[] columnIndexes, String[] columnNames) { if (columnIndexes != null) { ResultMetaData md = new ResultMetaData(GENERATED_INDEX_METADATA); md.columnCount = columnIndexes.length; md.extendedColumnCount = columnIndexes.length; md.colIndexes = new int[columnIndexes.length]; for (int i = 0; i < columnIndexes.length; i++) { md.colIndexes[i] = columnIndexes[i] - 1; } return md; } else if (columnNames != null) { ResultMetaData md = new ResultMetaData(GENERATED_NAME_METADATA); md.columnLabels = new String[columnNames.length]; md.columnCount = columnNames.length; md.extendedColumnCount = columnNames.length; md.columnLabels = columnNames; return md; } else { return null; } } public void prepareData() { if (columns != null) { for (int i = 0; i < columnCount; i++) { if (columnTypes[i] == null) { columnTypes[i] = columns[i].getDataType(); } } } } public int getColumnCount() { return columnCount; } public int getExtendedColumnCount() { return extendedColumnCount; } public void resetExtendedColumnCount() { extendedColumnCount = columnCount; } public Type[] getParameterTypes() { return columnTypes; } public String[] getGeneratedColumnNames() { return columnLabels; } public int[] getGeneratedColumnIndexes() { return colIndexes; } public boolean isTableColumn(int i) { String colName = columns[i].getNameString(); String tableName = columns[i].getTableNameString(); return tableName != null && tableName.length() > 0 && colName != null && colName.length() > 0; } private static void decodeTableColumnAttrs(int in, ColumnBase column) { column.setNullability((byte) (in & 0x00000003)); column.setIdentity((in & 0x00000004) != 0); column.setWriteable((in & 0x00000008) != 0); column.setSearchable((in & 0x00000010) != 0); } private static int encodeTableColumnAttrs(ColumnBase column) { int out = column.getNullability(); // always between 0x00 and 0x02 if (column.isIdentity()) { out |= 0x00000004; } if (column.isWriteable()) { out |= 0x00000008; } if (column.isSearchable()) { out |= 0x00000010; } return out; } private void decodeParamColumnAttrs(int in, int columnIndex) { paramNullable[columnIndex] = (byte) (in & 0x00000003); paramModes[columnIndex] = (byte) ((in >> 4) & 0x0000000f); } private int encodeParamColumnAttrs(int columnIndex) { int out = paramModes[columnIndex] << 4; out |= paramNullable[columnIndex]; return out; } ResultMetaData(RowInputBinary in) throws IOException { type = in.readInt(); columnCount = in.readInt(); switch (type) { case UPDATE_RESULT_METADATA : case SIMPLE_RESULT_METADATA : { columnTypes = new Type[columnCount]; for (int i = 0; i < columnCount; i++) { columnTypes[i] = readDataTypeSimple(in); } return; } case GENERATED_INDEX_METADATA : { colIndexes = new int[columnCount]; for (int i = 0; i < columnCount; i++) { colIndexes[i] = in.readInt(); } return; } case GENERATED_NAME_METADATA : { columnLabels = new String[columnCount]; for (int i = 0; i < columnCount; i++) { columnLabels[i] = in.readString(); } return; } case PARAM_METADATA : { columnTypes = new Type[columnCount]; columnLabels = new String[columnCount]; paramModes = new byte[columnCount]; paramNullable = new byte[columnCount]; for (int i = 0; i < columnCount; i++) { columnTypes[i] = readDataType(in); columnLabels[i] = in.readString(); decodeParamColumnAttrs(in.readByte(), i); } return; } case RESULT_METADATA : { extendedColumnCount = in.readInt(); columnTypes = new Type[extendedColumnCount]; columnLabels = new String[columnCount]; columns = new ColumnBase[columnCount]; if (columnCount != extendedColumnCount) { colIndexes = new int[columnCount]; } for (int i = 0; i < extendedColumnCount; i++) { Type type = readDataType(in); columnTypes[i] = type; } for (int i = 0; i < columnCount; i++) { columnLabels[i] = in.readString(); String catalog = in.readString(); String schema = in.readString(); String table = in.readString(); String name = in.readString(); ColumnBase column = new ColumnBase(catalog, schema, table, name); column.setType(columnTypes[i]); decodeTableColumnAttrs(in.readByte(), column); columns[i] = column; } if (columnCount != extendedColumnCount) { for (int i = 0; i < columnCount; i++) { colIndexes[i] = in.readInt(); } } return; } default : { throw Error.runtimeError(ErrorCode.U_S0500, "ResultMetaData"); } } } Type readDataTypeSimple(RowInputBinary in) throws IOException { int typeCode = in.readType(); boolean isArray = typeCode == Types.SQL_ARRAY; if (isArray) { typeCode = in.readType(); return Type.getDefaultArrayType(typeCode); } return Type.getDefaultType(typeCode); } Type readDataType(RowInputBinary in) throws IOException { int typeCode = in.readType(); boolean isArray = typeCode == Types.SQL_ARRAY; if (isArray) { typeCode = in.readType(); } long size = in.readLong(); int scale = in.readInt(); Type type = Type.getType(typeCode, Type.SQL_VARCHAR.getCharacterSet(), Type.SQL_VARCHAR.getCollation(), size, scale); if (isArray) { type = new ArrayType(type, ArrayType.defaultArrayCardinality); } return type; } void writeDataType(RowOutputInterface out, Type type) { out.writeType(type.typeCode); if (type.isArrayType()) { out.writeType(type.collectionBaseType().typeCode); } out.writeLong(type.precision); out.writeInt(type.scale); } void writeDataTypeCodes(RowOutputInterface out, Type type) { out.writeType(type.typeCode); if (type.isArrayType()) { out.writeType(type.collectionBaseType().typeCode); } } void write(RowOutputInterface out) throws IOException { out.writeInt(type); out.writeInt(columnCount); switch (type) { case UPDATE_RESULT_METADATA : case SIMPLE_RESULT_METADATA : { for (int i = 0; i < columnCount; i++) { writeDataTypeCodes(out, columnTypes[i]); } return; } case GENERATED_INDEX_METADATA : { for (int i = 0; i < columnCount; i++) { out.writeInt(colIndexes[i]); } return; } case GENERATED_NAME_METADATA : { for (int i = 0; i < columnCount; i++) { out.writeString(columnLabels[i]); } return; } case PARAM_METADATA : for (int i = 0; i < columnCount; i++) { writeDataType(out, columnTypes[i]); out.writeString(columnLabels[i]); out.writeByte(encodeParamColumnAttrs(i)); } return; case RESULT_METADATA : { out.writeInt(extendedColumnCount); for (int i = 0; i < extendedColumnCount; i++) { if (columnTypes[i] == null) { ColumnBase column = columns[i]; columnTypes[i] = column.getDataType(); } writeDataType(out, columnTypes[i]); } for (int i = 0; i < columnCount; i++) { ColumnBase column = columns[i]; out.writeString(columnLabels[i]); out.writeString(column.getCatalogNameString()); out.writeString(column.getSchemaNameString()); out.writeString(column.getTableNameString()); out.writeString(column.getNameString()); out.writeByte(encodeTableColumnAttrs(column)); } if (columnCount != extendedColumnCount) { for (int i = 0; i < colIndexes.length; i++) { out.writeInt(colIndexes[i]); } } return; } default : { throw Error.runtimeError(ErrorCode.U_S0500, "ResultMetaData"); } } } public ResultMetaData getNewMetaData(int[] columnMap) { ResultMetaData newMeta = newResultMetaData(columnMap.length); ArrayUtil.projectRow(columnLabels, columnMap, newMeta.columnLabels); ArrayUtil.projectRow(columnTypes, columnMap, newMeta.columnTypes); ArrayUtil.projectRow(columns, columnMap, newMeta.columns); return newMeta; } public boolean areTypesCompatible(ResultMetaData newMeta) { if (columnCount != newMeta.columnCount) { return false; } for (int i = 0; i < columnCount; i++) { if (!columnTypes[i].canConvertFrom(newMeta.columnTypes[i])) { return false; } } return true; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/result/Result.java0000644000175000017500000013706612007547374022423 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.result; import java.io.DataInput; import java.io.DataInputStream; import java.io.IOException; import java.io.LineNumberReader; import java.io.StringReader; import org.hsqldb.ColumnBase; import org.hsqldb.Database; import org.hsqldb.HsqlException; import org.hsqldb.Session; import org.hsqldb.SessionInterface; import org.hsqldb.SqlInvariants; import org.hsqldb.Statement; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.DataOutputStream; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.navigator.RowSetNavigatorClient; import org.hsqldb.rowio.RowInputBinary; import org.hsqldb.rowio.RowOutputInterface; import org.hsqldb.store.ValuePool; import org.hsqldb.types.Type; /** * The primary unit of communication between Connection, Server and Session * objects. * * An HSQLDB Result object encapsulates all requests (such as to alter or * query session settings, to allocate and execute statements, etc.) and all * responses (such as exception indications, update counts, result sets and * result set metadata). It also implements the HSQL wire protocol for * comunicating all such requests and responses across the network. * Uses a navigator for data. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.1.1 * @since 1.9.0 */ public class Result { public static final ResultMetaData sessionAttributesMetaData = ResultMetaData.newResultMetaData(SessionInterface.INFO_LIMIT); static { // required for correct initialisation of static variables SqlInvariants.isSystemSchemaName("SYSTEM"); for (int i = 0; i < Session.INFO_LIMIT; i++) { sessionAttributesMetaData.columns[i] = new ColumnBase(null, null, null, null); } sessionAttributesMetaData.columns[Session.INFO_ID].setType( Type.SQL_INTEGER); sessionAttributesMetaData.columns[Session.INFO_INTEGER].setType( Type.SQL_INTEGER); sessionAttributesMetaData.columns[Session.INFO_BOOLEAN].setType( Type.SQL_BOOLEAN); sessionAttributesMetaData.columns[Session.INFO_VARCHAR].setType( Type.SQL_VARCHAR); sessionAttributesMetaData.prepareData(); } private static final ResultMetaData emptyMeta = ResultMetaData.newResultMetaData(0); public static final Result emptyGeneratedResult = Result.newDataResult(emptyMeta); public static final Result updateZeroResult = newUpdateCountResult(0); public static final Result updateOneResult = newUpdateCountResult(1); // type of result public byte mode; // database ID int databaseID; // session ID long sessionID; // result id private long id; // database name for new connection private String databaseName; // user / password for new connection // error strings in error results private String mainString; private String subString; private String zoneString; // vendor error code int errorCode; // the exception if this is an error private HsqlException exception; // prepared statement id long statementID; // statement type based on whether it returns an update count or a result set // type of session info requested int statementReturnType; // max rows (out) // update count (in) // fetch part result count (in) // time zone seconds (connect) public int updateCount; // fetch size (in) private int fetchSize; // secondary result private Result chainedResult; // private int lobCount; ResultLob lobResults; /** A Result object's metadata */ public ResultMetaData metaData; /** Additional meta data for parameters used in PREPARE_ACK results */ public ResultMetaData parameterMetaData; /** Additional meta data for required generated columns */ public ResultMetaData generatedMetaData; // public int rsProperties; // public int queryTimeout; // int generateKeys; // simple value for PSM, or parameter array public Object valueData; // public Statement statement; Result(int mode) { this.mode = (byte) mode; } public Result(int mode, int count) { this.mode = (byte) mode; updateCount = count; } public static Result newResult(RowSetNavigator nav) { Result result = new Result(ResultConstants.DATA); result.navigator = nav; return result; } public static Result newResult(int type) { RowSetNavigator navigator = null; Result result = null; switch (type) { case ResultConstants.CALL_RESPONSE : case ResultConstants.EXECUTE : case ResultConstants.UPDATE_RESULT : break; case ResultConstants.BATCHEXECUTE : case ResultConstants.BATCHEXECDIRECT : navigator = new RowSetNavigatorClient(4); break; case ResultConstants.SETSESSIONATTR : case ResultConstants.PARAM_METADATA : navigator = new RowSetNavigatorClient(1); break; case ResultConstants.BATCHEXECRESPONSE : navigator = new RowSetNavigatorClient(4); break; case ResultConstants.DATA : case ResultConstants.DATAHEAD : case ResultConstants.DATAROWS : case ResultConstants.GENERATED : break; case ResultConstants.LARGE_OBJECT_OP : throw Error.runtimeError(ErrorCode.U_S0500, "Result"); default : } result = new Result(type); result.navigator = navigator; return result; } public static Result newResult(DataInput dataInput, RowInputBinary in) throws IOException, HsqlException { return newResult(null, dataInput.readByte(), dataInput, in); } public static Result newResult(Session session, int mode, DataInput dataInput, RowInputBinary in) throws IOException, HsqlException { try { if (mode == ResultConstants.LARGE_OBJECT_OP) { return ResultLob.newLob(dataInput, false); } Result result = newResult(session, dataInput, in, mode); return result; } catch (IOException e) { throw Error.error(ErrorCode.X_08000); } } public void readAdditionalResults(SessionInterface session, DataInputStream inputStream, RowInputBinary in) throws IOException, HsqlException { Result currentResult = this; setSession(session); while (true) { int addedResultMode = inputStream.readByte(); if (addedResultMode == ResultConstants.NONE) { return; } currentResult = newResult(null, inputStream, in, addedResultMode); addChainedResult(currentResult); } } public void readLobResults(SessionInterface session, DataInputStream inputStream, RowInputBinary in) throws IOException, HsqlException { Result currentResult = this; boolean hasLob = false; setSession(session); while (true) { int addedResultMode = inputStream.readByte(); if (addedResultMode == ResultConstants.LARGE_OBJECT_OP) { ResultLob resultLob = ResultLob.newLob(inputStream, false); if (session instanceof Session) { ((Session) session).allocateResultLob(resultLob, inputStream); } else { currentResult.addLobResult(resultLob); } hasLob = true; continue; } else if (addedResultMode == ResultConstants.NONE) { break; } else { throw Error.runtimeError(ErrorCode.U_S0500, "Result"); } } if (hasLob) { ((Session) session).registerResultLobs(currentResult); } } private static Result newResult(Session session, DataInput dataInput, RowInputBinary in, int mode) throws IOException, HsqlException { Result result = newResult(mode); int length = dataInput.readInt(); in.resetRow(0, length); byte[] byteArray = in.getBuffer(); final int offset = 4; dataInput.readFully(byteArray, offset, length - offset); switch (mode) { case ResultConstants.GETSESSIONATTR : result.statementReturnType = in.readByte(); break; case ResultConstants.DISCONNECT : case ResultConstants.RESETSESSION : case ResultConstants.STARTTRAN : break; case ResultConstants.PREPARE : result.setStatementType(in.readByte()); result.mainString = in.readString(); result.rsProperties = in.readByte(); result.generateKeys = in.readByte(); if (result.generateKeys == ResultConstants .RETURN_GENERATED_KEYS_COL_NAMES || result .generateKeys == ResultConstants .RETURN_GENERATED_KEYS_COL_INDEXES) { result.generatedMetaData = new ResultMetaData(in); } break; case ResultConstants.CLOSE_RESULT : result.id = in.readLong(); break; case ResultConstants.FREESTMT : result.statementID = in.readLong(); break; case ResultConstants.EXECDIRECT : result.updateCount = in.readInt(); result.fetchSize = in.readInt(); result.statementReturnType = in.readByte(); result.mainString = in.readString(); result.rsProperties = in.readByte(); result.queryTimeout = in.readShort(); result.generateKeys = in.readByte(); if (result.generateKeys == ResultConstants .RETURN_GENERATED_KEYS_COL_NAMES || result .generateKeys == ResultConstants .RETURN_GENERATED_KEYS_COL_INDEXES) { result.generatedMetaData = new ResultMetaData(in); } break; case ResultConstants.CONNECT : result.databaseName = in.readString(); result.mainString = in.readString(); result.subString = in.readString(); result.zoneString = in.readString(); result.updateCount = in.readInt(); break; case ResultConstants.ERROR : case ResultConstants.WARNING : result.mainString = in.readString(); result.subString = in.readString(); result.errorCode = in.readInt(); break; case ResultConstants.CONNECTACKNOWLEDGE : result.databaseID = in.readInt(); result.sessionID = in.readLong(); result.databaseName = in.readString(); result.mainString = in.readString(); break; case ResultConstants.UPDATECOUNT : result.updateCount = in.readInt(); break; case ResultConstants.ENDTRAN : { int type = in.readInt(); result.setActionType(type); // endtran type switch (type) { case ResultConstants.TX_SAVEPOINT_NAME_RELEASE : case ResultConstants.TX_SAVEPOINT_NAME_ROLLBACK : result.mainString = in.readString(); // savepoint name break; case ResultConstants.TX_COMMIT : case ResultConstants.TX_ROLLBACK : case ResultConstants.TX_COMMIT_AND_CHAIN : case ResultConstants.TX_ROLLBACK_AND_CHAIN : break; default : throw Error.runtimeError(ErrorCode.U_S0500, "Result"); } break; } case ResultConstants.SETCONNECTATTR : { int type = in.readInt(); // attr type result.setConnectionAttrType(type); switch (type) { case ResultConstants.SQL_ATTR_SAVEPOINT_NAME : result.mainString = in.readString(); // savepoint name break; // case ResultConstants.SQL_ATTR_AUTO_IPD : // - always true // default: throw - case never happens default : throw Error.runtimeError(ErrorCode.U_S0500, "Result"); } break; } case ResultConstants.PREPARE_ACK : result.statementReturnType = in.readByte(); result.statementID = in.readLong(); result.rsProperties = in.readByte(); result.metaData = new ResultMetaData(in); result.parameterMetaData = new ResultMetaData(in); break; case ResultConstants.CALL_RESPONSE : result.updateCount = in.readInt(); result.fetchSize = in.readInt(); result.statementID = in.readLong(); result.statementReturnType = in.readByte(); result.rsProperties = in.readByte(); result.metaData = new ResultMetaData(in); result.valueData = readSimple(in, result.metaData); break; case ResultConstants.EXECUTE : result.updateCount = in.readInt(); result.fetchSize = in.readInt(); result.statementID = in.readLong(); result.rsProperties = in.readByte(); result.queryTimeout = in.readShort(); Statement statement = session.statementManager.getStatement(session, result.statementID); if (statement == null) { // invalid statement result.mode = ResultConstants.EXECUTE_INVALID; result.valueData = ValuePool.emptyObjectArray; break; } result.statement = statement; result.metaData = result.statement.getParametersMetaData(); result.valueData = readSimple(in, result.metaData); break; case ResultConstants.UPDATE_RESULT : { result.id = in.readLong(); int type = in.readInt(); result.setActionType(type); result.metaData = new ResultMetaData(in); result.valueData = readSimple(in, result.metaData); break; } case ResultConstants.BATCHEXECRESPONSE : case ResultConstants.BATCHEXECUTE : case ResultConstants.BATCHEXECDIRECT : case ResultConstants.SETSESSIONATTR : { result.updateCount = in.readInt(); result.fetchSize = in.readInt(); result.statementID = in.readLong(); result.queryTimeout = in.readShort(); result.metaData = new ResultMetaData(in); result.navigator.readSimple(in, result.metaData); break; } case ResultConstants.PARAM_METADATA : { result.metaData = new ResultMetaData(in); result.navigator.read(in, result.metaData); break; } case ResultConstants.REQUESTDATA : { result.id = in.readLong(); result.updateCount = in.readInt(); result.fetchSize = in.readInt(); break; } case ResultConstants.DATAHEAD : case ResultConstants.DATA : case ResultConstants.GENERATED : { result.id = in.readLong(); result.updateCount = in.readInt(); result.fetchSize = in.readInt(); result.rsProperties = in.readByte(); result.metaData = new ResultMetaData(in); result.navigator = new RowSetNavigatorClient(); result.navigator.read(in, result.metaData); break; } case ResultConstants.DATAROWS : { result.metaData = new ResultMetaData(in); result.navigator = new RowSetNavigatorClient(); result.navigator.read(in, result.metaData); break; } default : throw Error.runtimeError(ErrorCode.U_S0500, "Result"); } return result; } /** * For interval PSM return values */ public static Result newPSMResult(int type, String label, Object value) { Result result = newResult(ResultConstants.VALUE); result.errorCode = type; result.mainString = label; result.valueData = value; return result; } /** * For interval PSM return values */ public static Result newPSMResult(Object value) { Result result = newResult(ResultConstants.VALUE); result.valueData = value; return result; } /** * For SQLPREPARE * For parparation of SQL parepared statements. */ public static Result newPrepareStatementRequest() { return newResult(ResultConstants.PREPARE); } /** * For SQLEXECUTE * For execution of SQL prepared statements. * The parameters are set afterwards as the Result is reused */ public static Result newPreparedExecuteRequest(Type[] types, long statementId) { Result result = newResult(ResultConstants.EXECUTE); result.metaData = ResultMetaData.newSimpleResultMetaData(types); result.statementID = statementId; result.valueData = ValuePool.emptyObjectArray; return result; } /** * For CALL_RESPONSE * For execution of SQL callable statements. */ public static Result newCallResponse(Type[] types, long statementId, Object[] values) { Result result = newResult(ResultConstants.CALL_RESPONSE); result.metaData = ResultMetaData.newSimpleResultMetaData(types); result.statementID = statementId; result.valueData = values; return result; } /** * For UPDATE_RESULT * The parameters are set afterwards as the Result is reused */ public static Result newUpdateResultRequest(Type[] types, long id) { Result result = newResult(ResultConstants.UPDATE_RESULT); result.metaData = ResultMetaData.newUpdateResultMetaData(types); result.id = id; result.valueData = new Object[]{}; return result; } /** * For UPDATE_RESULT results * The parameters are set by this method as the Result is reused */ public void setPreparedResultUpdateProperties(Object[] parameterValues) { valueData = parameterValues; } /** * For SQLEXECUTE results * The parameters are set by this method as the Result is reused */ public void setPreparedExecuteProperties(Object[] parameterValues, int maxRows, int fetchSize, int resultProps) { mode = ResultConstants.EXECUTE; valueData = parameterValues; updateCount = maxRows; this.fetchSize = fetchSize; this.rsProperties = resultProps; } /** * For BATCHEXECUTE */ public void setBatchedPreparedExecuteRequest() { mode = ResultConstants.BATCHEXECUTE; if (navigator == null) { navigator = new RowSetNavigatorClient(4); } else { navigator.clear(); } updateCount = 0; this.fetchSize = 0; } public void addBatchedPreparedExecuteRequest(Object[] parameterValues) { ((RowSetNavigatorClient) navigator).add(parameterValues); } /** * For BATCHEXECDIRECT */ public static Result newBatchedExecuteRequest() { Type[] types = new Type[]{ Type.SQL_VARCHAR }; Result result = newResult(ResultConstants.BATCHEXECDIRECT); result.metaData = ResultMetaData.newSimpleResultMetaData(types); return result; } /** * For BATCHEXERESPONSE for a BATCHEXECUTE or BATCHEXECDIRECT */ public static Result newBatchedExecuteResponse(int[] updateCounts, Result generatedResult, Result e) { Result result = newResult(ResultConstants.BATCHEXECRESPONSE); result.addChainedResult(generatedResult); result.addChainedResult(e); Type[] types = new Type[]{ Type.SQL_INTEGER }; result.metaData = ResultMetaData.newSimpleResultMetaData(types); Object[][] table = new Object[updateCounts.length][]; for (int i = 0; i < updateCounts.length; i++) { table[i] = new Object[]{ ValuePool.getInt(updateCounts[i]) }; } ((RowSetNavigatorClient) result.navigator).setData(table); return result; } public static Result newResetSessionRequest() { Result result = newResult(ResultConstants.RESETSESSION); return result; } public static Result newConnectionAttemptRequest(String user, String password, String database, String zoneString, int timeZoneSeconds) { Result result = newResult(ResultConstants.CONNECT); result.mainString = user; result.subString = password; result.zoneString = zoneString; result.databaseName = database; result.updateCount = timeZoneSeconds; return result; } public static Result newConnectionAcknowledgeResponse(Database database, long sessionID, int databaseID) { Result result = newResult(ResultConstants.CONNECTACKNOWLEDGE); result.sessionID = sessionID; result.databaseID = databaseID; result.databaseName = database.getUniqueName(); result.mainString = database.getProperties().getClientPropertiesAsString(); return result; } public static Result newUpdateZeroResult() { return new Result(ResultConstants.UPDATECOUNT, 0); } public static Result newUpdateCountResult(int count) { return new Result(ResultConstants.UPDATECOUNT, count); } public static Result newUpdateCountResult(ResultMetaData meta, int count) { Result result = newResult(ResultConstants.UPDATECOUNT); Result dataResult = newGeneratedDataResult(meta); result.updateCount = count; result.addChainedResult(dataResult); return result; } public static Result newSingleColumnResult(ResultMetaData meta) { Result result = newResult(ResultConstants.DATA); result.metaData = meta; result.navigator = new RowSetNavigatorClient(); return result; } public static Result newSingleColumnResult(String colName) { Result result = newResult(ResultConstants.DATA); result.metaData = ResultMetaData.newSingleColumnMetaData(colName); result.navigator = new RowSetNavigatorClient(8); return result; } public static Result newSingleColumnStringResult(String colName, String contents) { Result result = Result.newSingleColumnResult(colName); LineNumberReader lnr = new LineNumberReader(new StringReader(contents)); while (true) { String line = null; try { line = lnr.readLine(); } catch (Exception e) {} if (line == null) { break; } result.getNavigator().add(new Object[]{ line }); } return result; } public static Result newPrepareResponse(Statement statement) { Result r = newResult(ResultConstants.PREPARE_ACK); r.statement = statement; r.statementID = statement.getID(); int csType = statement.getType(); r.statementReturnType = statement.getStatementReturnType(); r.metaData = statement.getResultMetaData(); r.parameterMetaData = statement.getParametersMetaData(); return r; } public static Result newFreeStmtRequest(long statementID) { Result r = newResult(ResultConstants.FREESTMT); r.statementID = statementID; return r; } /** * For direct execution of SQL statements. The statement and other * parameters are set afterwards as the Result is reused */ public static Result newExecuteDirectRequest() { return newResult(ResultConstants.EXECDIRECT); } /** * For both EXECDIRECT and PREPARE */ public void setPrepareOrExecuteProperties(String sql, int maxRows, int fetchSize, int statementReturnType, int timeout, int resultSetProperties, int keyMode, int[] generatedIndexes, String[] generatedNames) { mainString = sql; updateCount = maxRows; this.fetchSize = fetchSize; this.statementReturnType = statementReturnType; this.queryTimeout = timeout; rsProperties = resultSetProperties; generateKeys = keyMode; generatedMetaData = ResultMetaData.newGeneratedColumnsMetaData(generatedIndexes, generatedNames); } public static Result newSetSavepointRequest(String name) { Result result; result = newResult(ResultConstants.SETCONNECTATTR); result.setConnectionAttrType(ResultConstants.SQL_ATTR_SAVEPOINT_NAME); result.setMainString(name); return result; } public static Result newRequestDataResult(long id, int offset, int count) { Result result = newResult(ResultConstants.REQUESTDATA); result.id = id; result.updateCount = offset; result.fetchSize = count; return result; } public static Result newDataResult(ResultMetaData md) { Result result = newResult(ResultConstants.DATA); result.navigator = new RowSetNavigatorClient(); result.metaData = md; return result; } public static Result newGeneratedDataResult(ResultMetaData md) { Result result = newResult(ResultConstants.GENERATED); result.navigator = new RowSetNavigatorClient(); result.metaData = md; return result; } /** * initially, only used for updatability */ public int getExecuteProperties() { return rsProperties; } public static Result newDataHeadResult(SessionInterface session, Result source, int offset, int count) { if (offset + count > source.navigator.getSize()) { count = source.navigator.getSize() - offset; } Result result = newResult(ResultConstants.DATAHEAD); result.metaData = source.metaData; result.navigator = new RowSetNavigatorClient(source.navigator, offset, count); result.navigator.setId(source.navigator.getId()); result.setSession(session); result.rsProperties = source.rsProperties; result.fetchSize = source.fetchSize; return result; } public static Result newDataRowsResult(Result source, int offset, int count) { if (offset + count > source.navigator.getSize()) { count = source.navigator.getSize() - offset; } Result result = newResult(ResultConstants.DATAROWS); result.id = source.id; result.metaData = source.metaData; result.navigator = new RowSetNavigatorClient(source.navigator, offset, count); return result; } public static Result newDataRowsResult(RowSetNavigator navigator) { Result result = newResult(ResultConstants.DATAROWS); result.navigator = navigator; return result; } /** * Result structure used for set/get session attributes */ public static Result newSessionAttributesResult() { Result result = newResult(ResultConstants.DATA); result.navigator = new RowSetNavigatorClient(1); result.metaData = sessionAttributesMetaData; result.navigator.add(new Object[SessionInterface.INFO_LIMIT]); return result; } public static Result newWarningResult(HsqlException w) { Result result = newResult(ResultConstants.WARNING); result.mainString = w.getMessage(); result.subString = w.getSQLState(); result.errorCode = w.getErrorCode(); return result; } public static Result newErrorResult(Throwable t) { return newErrorResult(t, null); } /** @todo 1.9.0 fredt - move the messages to Error.java */ public static Result newErrorResult(Throwable t, String statement) { Result result = newResult(ResultConstants.ERROR); if (t instanceof HsqlException) { result.exception = (HsqlException) t; result.mainString = result.exception.getMessage(); result.subString = result.exception.getSQLState(); if (statement != null) { result.mainString += " in statement [" + statement + "]"; } result.errorCode = result.exception.getErrorCode(); } else if (t instanceof OutOfMemoryError) { // gc() at this point may clear the memory allocated so far /** @todo 1.9.0 - review if it's better to gc higher up the stack */ System.gc(); result.exception = Error.error(ErrorCode.OUT_OF_MEMORY, t); result.mainString = result.exception.getMessage(); result.subString = result.exception.getSQLState(); result.errorCode = result.exception.getErrorCode(); } else { result.exception = Error.error(ErrorCode.GENERAL_ERROR, t); result.mainString = result.exception.getMessage() + " " + t.toString(); result.subString = result.exception.getSQLState(); result.errorCode = result.exception.getErrorCode(); if (statement != null) { result.mainString += " in statement [" + statement + "]"; } } return result; } public void write(SessionInterface session, DataOutputStream dataOut, RowOutputInterface rowOut) throws IOException, HsqlException { rowOut.reset(); rowOut.writeByte(mode); int startPos = rowOut.size(); rowOut.writeSize(0); switch (mode) { case ResultConstants.GETSESSIONATTR : rowOut.writeByte(statementReturnType); break; case ResultConstants.DISCONNECT : case ResultConstants.RESETSESSION : case ResultConstants.STARTTRAN : break; case ResultConstants.PREPARE : rowOut.writeByte(statementReturnType); rowOut.writeString(mainString); rowOut.writeByte(rsProperties); rowOut.writeByte(generateKeys); if (generateKeys == ResultConstants .RETURN_GENERATED_KEYS_COL_NAMES || generateKeys == ResultConstants .RETURN_GENERATED_KEYS_COL_INDEXES) { generatedMetaData.write(rowOut); } break; case ResultConstants.FREESTMT : rowOut.writeLong(statementID); break; case ResultConstants.CLOSE_RESULT : rowOut.writeLong(id); break; case ResultConstants.EXECDIRECT : rowOut.writeInt(updateCount); rowOut.writeInt(fetchSize); rowOut.writeByte(statementReturnType); rowOut.writeString(mainString); rowOut.writeByte(rsProperties); rowOut.writeShort(queryTimeout); rowOut.writeByte(generateKeys); if (generateKeys == ResultConstants .RETURN_GENERATED_KEYS_COL_NAMES || generateKeys == ResultConstants .RETURN_GENERATED_KEYS_COL_INDEXES) { generatedMetaData.write(rowOut); } break; case ResultConstants.CONNECT : rowOut.writeString(databaseName); rowOut.writeString(mainString); rowOut.writeString(subString); rowOut.writeString(zoneString); rowOut.writeInt(updateCount); break; case ResultConstants.ERROR : case ResultConstants.WARNING : rowOut.writeString(mainString); rowOut.writeString(subString); rowOut.writeInt(errorCode); break; case ResultConstants.CONNECTACKNOWLEDGE : rowOut.writeInt(databaseID); rowOut.writeLong(sessionID); rowOut.writeString(databaseName); rowOut.writeString(mainString); break; case ResultConstants.UPDATECOUNT : rowOut.writeInt(updateCount); break; case ResultConstants.ENDTRAN : { int type = getActionType(); rowOut.writeInt(type); // endtran type switch (type) { case ResultConstants.TX_SAVEPOINT_NAME_RELEASE : case ResultConstants.TX_SAVEPOINT_NAME_ROLLBACK : rowOut.writeString(mainString); // savepoint name break; case ResultConstants.TX_COMMIT : case ResultConstants.TX_ROLLBACK : case ResultConstants.TX_COMMIT_AND_CHAIN : case ResultConstants.TX_ROLLBACK_AND_CHAIN : break; default : throw Error.runtimeError(ErrorCode.U_S0500, "Result"); } break; } case ResultConstants.PREPARE_ACK : rowOut.writeByte(statementReturnType); rowOut.writeLong(statementID); rowOut.writeByte(rsProperties); metaData.write(rowOut); parameterMetaData.write(rowOut); break; case ResultConstants.CALL_RESPONSE : rowOut.writeInt(updateCount); rowOut.writeInt(fetchSize); rowOut.writeLong(statementID); rowOut.writeByte(statementReturnType); rowOut.writeByte(rsProperties); metaData.write(rowOut); writeSimple(rowOut, metaData, (Object[]) valueData); break; case ResultConstants.EXECUTE : rowOut.writeInt(updateCount); rowOut.writeInt(fetchSize); rowOut.writeLong(statementID); rowOut.writeByte(rsProperties); rowOut.writeShort(queryTimeout); writeSimple(rowOut, metaData, (Object[]) valueData); break; case ResultConstants.UPDATE_RESULT : rowOut.writeLong(id); rowOut.writeInt(getActionType()); metaData.write(rowOut); writeSimple(rowOut, metaData, (Object[]) valueData); break; case ResultConstants.BATCHEXECRESPONSE : case ResultConstants.BATCHEXECUTE : case ResultConstants.BATCHEXECDIRECT : case ResultConstants.SETSESSIONATTR : { rowOut.writeInt(updateCount); rowOut.writeInt(fetchSize); rowOut.writeLong(statementID); rowOut.writeShort(queryTimeout); metaData.write(rowOut); navigator.writeSimple(rowOut, metaData); break; } case ResultConstants.PARAM_METADATA : { metaData.write(rowOut); navigator.write(rowOut, metaData); break; } case ResultConstants.SETCONNECTATTR : { int type = getConnectionAttrType(); rowOut.writeInt(type); // attr type / updateCount switch (type) { case ResultConstants.SQL_ATTR_SAVEPOINT_NAME : rowOut.writeString(mainString); // savepoint name break; // case ResultConstants.SQL_ATTR_AUTO_IPD // always true // default: // throw, but case never happens default : throw Error.runtimeError(ErrorCode.U_S0500, "Result"); } break; } case ResultConstants.REQUESTDATA : { rowOut.writeLong(id); rowOut.writeInt(updateCount); rowOut.writeInt(fetchSize); break; } case ResultConstants.DATAROWS : metaData.write(rowOut); navigator.write(rowOut, metaData); break; case ResultConstants.DATAHEAD : case ResultConstants.DATA : case ResultConstants.GENERATED : rowOut.writeLong(id); rowOut.writeInt(updateCount); rowOut.writeInt(fetchSize); rowOut.writeByte(rsProperties); metaData.write(rowOut); navigator.write(rowOut, metaData); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "Result"); } rowOut.writeIntData(rowOut.size() - startPos, startPos); dataOut.write(rowOut.getOutputStream().getBuffer(), 0, rowOut.size()); int count = getLobCount(); Result current = this; for (int i = 0; i < count; i++) { ResultLob lob = current.lobResults; lob.writeBody(session, dataOut); current = current.lobResults; } if (chainedResult == null) { dataOut.writeByte(ResultConstants.NONE); } else { chainedResult.write(session, dataOut, rowOut); } dataOut.flush(); } public int getType() { return mode; } public boolean isData() { return mode == ResultConstants.DATA || mode == ResultConstants.DATAHEAD; } public boolean isError() { return mode == ResultConstants.ERROR; } public boolean isWarning() { return mode == ResultConstants.WARNING; } public boolean isUpdateCount() { return mode == ResultConstants.UPDATECOUNT; } public boolean isSimpleValue() { return mode == ResultConstants.VALUE; } public boolean hasGeneratedKeys() { return mode == ResultConstants.UPDATECOUNT && chainedResult != null; } public HsqlException getException() { return exception; } public long getStatementID() { return statementID; } public void setStatementID(long statementId) { this.statementID = statementId; } public String getMainString() { return mainString; } public void setMainString(String sql) { this.mainString = sql; } public String getSubString() { return subString; } public String getZoneString() { return zoneString; } public int getErrorCode() { return errorCode; } public Object getValueObject() { return valueData; } public void setValueObject(Object value) { valueData = value; } public Statement getStatement() { return statement; } public void setStatement(Statement statement) { this.statement = statement; } public String getDatabaseName() { return databaseName; } public void setMaxRows(int count) { updateCount = count; } public int getFetchSize() { return this.fetchSize; } public void setFetchSize(int count) { fetchSize = count; } public int getUpdateCount() { return updateCount; } public int getConnectionAttrType() { return updateCount; } public void setConnectionAttrType(int type) { updateCount = type; } public int getActionType() { return updateCount; } public void setActionType(int type) { updateCount = type; } public long getSessionId() { return sessionID; } public void setSessionId(long id) { sessionID = id; } public void setSession(SessionInterface session) { if (navigator != null) { navigator.setSession(session); } } public int getDatabaseId() { return databaseID; } public void setDatabaseId(int id) { databaseID = id; } public long getResultId() { return id; } public void setResultId(long id) { this.id = id; if (navigator != null) { navigator.setId(id); } } public void setUpdateCount(int count) { updateCount = count; } public void setAsTransactionEndRequest(int subType, String savepoint) { mode = ResultConstants.ENDTRAN; updateCount = subType; mainString = savepoint == null ? "" : savepoint; } public Object[] getSingleRowData() { Object[] data = (Object[]) initialiseNavigator().getNext(); data = (Object[]) ArrayUtil.resizeArrayIfDifferent(data, metaData.getColumnCount()); return data; } public Object[] getParameterData() { return (Object[]) valueData; } public Object[] getSessionAttributes() { return (Object[]) initialiseNavigator().getNext(); } public void setResultType(int type) { mode = (byte) type; } public void setStatementType(int type) { statementReturnType = type; } public int getStatementType() { return statementReturnType; } public int getGeneratedResultType() { return generateKeys; } public ResultMetaData getGeneratedResultMetaData() { return generatedMetaData; } public Result getChainedResult() { return chainedResult; } public Result getUnlinkChainedResult() { Result result = chainedResult; chainedResult = null; return result; } public void addChainedResult(Result result) { Result current = this; while (current.chainedResult != null) { current = current.chainedResult; } current.chainedResult = result; } public void addWarnings(HsqlException[] warnings) { for (int i = 0; i < warnings.length; i++) { Result warning = newWarningResult(warnings[i]); addChainedResult(warning); } } public int getLobCount() { return lobCount; } public ResultLob getLOBResult() { return lobResults; } public void addLobResult(ResultLob result) { Result current = this; while (current.lobResults != null) { current = current.lobResults; } current.lobResults = result; lobCount++; } public void clearLobResults() { lobResults = null; lobCount = 0; } private static Object[] readSimple(RowInputBinary in, ResultMetaData meta) throws IOException { int size = in.readInt(); return in.readData(meta.columnTypes); } private static void writeSimple(RowOutputInterface out, ResultMetaData meta, Object[] data) throws IOException { out.writeInt(1); out.writeData(meta.getColumnCount(), meta.columnTypes, data, null, null); } //----------- Navigation public RowSetNavigator navigator; public RowSetNavigator getNavigator() { return navigator; } public void setNavigator(RowSetNavigator navigator) { this.navigator = navigator; } public RowSetNavigator initialiseNavigator() { switch (mode) { case ResultConstants.BATCHEXECUTE : case ResultConstants.BATCHEXECDIRECT : case ResultConstants.BATCHEXECRESPONSE : case ResultConstants.SETSESSIONATTR : case ResultConstants.PARAM_METADATA : navigator.beforeFirst(); return navigator; case ResultConstants.DATA : case ResultConstants.DATAHEAD : case ResultConstants.GENERATED : navigator.reset(); return navigator; default : throw Error.runtimeError(ErrorCode.U_S0500, "Result"); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/result/ResultLob.java0000644000175000017500000005326412007547374023055 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.result; import java.io.DataInput; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import org.hsqldb.SessionInterface; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.DataOutputStream; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.rowio.RowOutputInterface; /** * Sub-class of Result for communicating Blob and Clob operations.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public final class ResultLob extends Result { public static interface LobResultTypes { int REQUEST_GET_BYTES = 1; int REQUEST_SET_BYTES = 2; int REQUEST_GET_CHARS = 3; int REQUEST_SET_CHARS = 4; int REQUEST_GET_BYTE_PATTERN_POSITION = 5; int REQUEST_GET_CHAR_PATTERN_POSITION = 6; int REQUEST_CREATE_BYTES = 7; int REQUEST_CREATE_CHARS = 8; int REQUEST_TRUNCATE = 9; int REQUEST_GET_LENGTH = 10; int REQUEST_GET_LOB = 11; int REQUEST_DUPLICATE_LOB = 12; // non-network int REQUEST_GET_TRUNCATE_LENGTH = 13; // int RESPONSE_GET_BYTES = 21; int RESPONSE_SET = 22; int RESPONSE_GET_CHARS = 23; int RESPONSE_GET_BYTE_PATTERN_POSITION = 25; int RESPONSE_GET_CHAR_PATTERN_POSITION = 26; int RESPONSE_CREATE_BYTES = 27; int RESPONSE_CREATE_CHARS = 28; int RESPONSE_TRUNCATE = 29; } long lobID; int subType; long blockOffset; long blockLength; byte[] byteBlock; char[] charBlock; Reader reader; InputStream stream; private ResultLob() { super(ResultConstants.LARGE_OBJECT_OP); } public static ResultLob newLobGetLengthRequest(long id) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_GET_LENGTH; result.lobID = id; return result; } public static ResultLob newLobGetBytesRequest(long id, long offset, int length) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_GET_BYTES; result.lobID = id; result.blockOffset = offset; result.blockLength = length; return result; } public static ResultLob newLobGetCharsRequest(long id, long offset, int length) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_GET_CHARS; result.lobID = id; result.blockOffset = offset; result.blockLength = length; return result; } public static ResultLob newLobSetBytesRequest(long id, long offset, byte block[]) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_SET_BYTES; result.lobID = id; result.blockOffset = offset; result.byteBlock = block; result.blockLength = block.length; return result; } public static ResultLob newLobSetCharsRequest(long id, long offset, char[] chars) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_SET_CHARS; result.lobID = id; result.blockOffset = offset; result.charBlock = chars; result.blockLength = chars.length; return result; } public static ResultLob newLobTruncateRequest(long id, long offset) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_TRUNCATE; result.lobID = id; result.blockOffset = offset; return result; } public static ResultLob newLobGetBytesResponse(long id, long offset, byte block[]) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.RESPONSE_GET_BYTES; result.lobID = id; result.blockOffset = offset; result.byteBlock = block; result.blockLength = block.length; return result; } public static ResultLob newLobGetCharsResponse(long id, long offset, char[] chars) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.RESPONSE_GET_CHARS; result.lobID = id; result.blockOffset = offset; result.charBlock = chars; result.blockLength = chars.length; return result; } public static ResultLob newLobSetResponse(long id, long length) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.RESPONSE_SET; result.lobID = id; result.blockLength = length; return result; } public static ResultLob newLobGetBytePatternPositionRequest(long id, byte[] pattern, long offset) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_GET_BYTE_PATTERN_POSITION; result.lobID = id; result.blockOffset = offset; result.byteBlock = pattern; result.blockLength = pattern.length; return result; } public static ResultLob newLobGetBytePatternPositionRequest(long id, long otherId, long offset) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_GET_BYTE_PATTERN_POSITION; result.lobID = id; result.blockOffset = offset; return result; } public static ResultLob newLobGetCharPatternPositionRequest(long id, char[] pattern, long offset) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_GET_CHAR_PATTERN_POSITION; result.lobID = id; result.blockOffset = offset; result.charBlock = pattern; result.blockLength = pattern.length; return result; } public static ResultLob newLobGetCharPatternPositionRequest(long id, long otherId, long offset) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_GET_CHAR_PATTERN_POSITION; result.lobID = id; result.blockOffset = offset; result.blockLength = otherId; return result; } public static ResultLob newLobCreateBlobRequest(long sessionID, long lobID, InputStream stream, long length) { ResultLob result = new ResultLob(); result.lobID = lobID; result.subType = LobResultTypes.REQUEST_CREATE_BYTES; result.blockLength = length; result.stream = stream; return result; } public static ResultLob newLobCreateClobRequest(long sessionID, long lobID, Reader reader, long length) { ResultLob result = new ResultLob(); result.lobID = lobID; result.subType = LobResultTypes.REQUEST_CREATE_CHARS; result.blockLength = length; result.reader = reader; return result; } public static ResultLob newLobGetTruncateLength(long id) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_GET_TRUNCATE_LENGTH; result.lobID = id; return result; } public static ResultLob newLobCreateBlobResponse(long id) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.RESPONSE_CREATE_BYTES; result.lobID = id; return result; } public static ResultLob newLobCreateClobResponse(long id) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.RESPONSE_CREATE_CHARS; result.lobID = id; return result; } public static ResultLob newLobTruncateResponse(long id, long length) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.RESPONSE_TRUNCATE; result.lobID = id; result.blockLength = length; return result; } public static ResultLob newLobGetRequest(long id, long offset, long length) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_GET_LOB; result.lobID = id; result.blockOffset = offset; result.blockLength = length; return result; } public static ResultLob newLobDuplicateRequest(long id) { ResultLob result = new ResultLob(); result.subType = LobResultTypes.REQUEST_DUPLICATE_LOB; result.lobID = id; return result; } public static ResultLob newLob(DataInput dataInput, boolean readTerminate) throws IOException { ResultLob result = new ResultLob(); result.databaseID = dataInput.readInt(); result.sessionID = dataInput.readLong(); result.lobID = dataInput.readLong(); result.subType = dataInput.readInt(); switch (result.subType) { case LobResultTypes.REQUEST_CREATE_BYTES : case LobResultTypes.REQUEST_CREATE_CHARS : result.blockOffset = dataInput.readLong(); result.blockLength = dataInput.readLong(); break; case LobResultTypes.REQUEST_GET_LOB : case LobResultTypes.REQUEST_DUPLICATE_LOB : // case LobResultTypes.REQUEST_GET_BYTES : case LobResultTypes.REQUEST_GET_CHARS : result.blockOffset = dataInput.readLong(); result.blockLength = dataInput.readLong(); break; case LobResultTypes.REQUEST_SET_BYTES : case LobResultTypes.REQUEST_GET_BYTE_PATTERN_POSITION : result.blockOffset = dataInput.readLong(); result.blockLength = dataInput.readLong(); result.byteBlock = new byte[(int) result.blockLength]; dataInput.readFully(result.byteBlock); break; case LobResultTypes.REQUEST_SET_CHARS : case LobResultTypes.REQUEST_GET_CHAR_PATTERN_POSITION : result.blockOffset = dataInput.readLong(); result.blockLength = dataInput.readLong(); result.charBlock = new char[(int) result.blockLength]; for (int i = 0; i < result.charBlock.length; i++) { result.charBlock[i] = dataInput.readChar(); } break; case LobResultTypes.REQUEST_GET_LENGTH : case LobResultTypes.REQUEST_TRUNCATE : result.blockOffset = dataInput.readLong(); break; case LobResultTypes.RESPONSE_GET_BYTES : result.blockOffset = dataInput.readLong(); result.blockLength = dataInput.readLong(); result.byteBlock = new byte[(int) result.blockLength]; dataInput.readFully(result.byteBlock); break; case LobResultTypes.RESPONSE_GET_CHARS : result.blockOffset = dataInput.readLong(); result.blockLength = dataInput.readLong(); result.charBlock = new char[(int) result.blockLength]; for (int i = 0; i < result.charBlock.length; i++) { result.charBlock[i] = dataInput.readChar(); } break; case LobResultTypes.RESPONSE_SET : case LobResultTypes.RESPONSE_CREATE_BYTES : case LobResultTypes.RESPONSE_CREATE_CHARS : case LobResultTypes.RESPONSE_TRUNCATE : result.blockLength = dataInput.readLong(); break; case LobResultTypes.RESPONSE_GET_BYTE_PATTERN_POSITION : case LobResultTypes.RESPONSE_GET_CHAR_PATTERN_POSITION : result.blockOffset = dataInput.readLong(); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ResultLob"); } if (readTerminate) { dataInput.readByte(); } return result; } public void write(SessionInterface session, DataOutputStream dataOut, RowOutputInterface rowOut) throws IOException { writeBody(session, dataOut); dataOut.writeByte(ResultConstants.NONE); dataOut.flush(); } public void writeBody(SessionInterface session, DataOutputStream dataOut) throws IOException { switch (subType) { case LobResultTypes.REQUEST_CREATE_BYTES : if (blockLength >= 0) { writeCreate(session, dataOut); return; } writeCreateByteSegments(session, dataOut); return; case LobResultTypes.REQUEST_CREATE_CHARS : { if (blockLength >= 0) { writeCreate(session, dataOut); return; } writeCreateCharSegments(session, dataOut); return; } } dataOut.writeByte(mode); dataOut.writeInt(databaseID); dataOut.writeLong(sessionID); dataOut.writeLong(lobID); dataOut.writeInt(subType); switch (subType) { case LobResultTypes.REQUEST_SET_BYTES : case LobResultTypes.REQUEST_GET_BYTE_PATTERN_POSITION : dataOut.writeLong(blockOffset); dataOut.writeLong(blockLength); dataOut.write(byteBlock); break; case LobResultTypes.REQUEST_SET_CHARS : case LobResultTypes.REQUEST_GET_CHAR_PATTERN_POSITION : dataOut.writeLong(blockOffset); dataOut.writeLong(blockLength); dataOut.writeChars(charBlock); break; case LobResultTypes.REQUEST_GET_LOB : case LobResultTypes.REQUEST_DUPLICATE_LOB : // case LobResultTypes.REQUEST_GET_BYTES : case LobResultTypes.REQUEST_GET_CHARS : dataOut.writeLong(blockOffset); dataOut.writeLong(blockLength); break; case LobResultTypes.REQUEST_GET_LENGTH : case LobResultTypes.REQUEST_TRUNCATE : dataOut.writeLong(blockOffset); break; case LobResultTypes.RESPONSE_GET_BYTES : dataOut.writeLong(blockOffset); dataOut.writeLong(blockLength); dataOut.write(byteBlock); break; case LobResultTypes.RESPONSE_GET_CHARS : dataOut.writeLong(blockOffset); dataOut.writeLong(blockLength); dataOut.writeChars(charBlock); break; case LobResultTypes.RESPONSE_SET : case LobResultTypes.RESPONSE_CREATE_BYTES : case LobResultTypes.RESPONSE_CREATE_CHARS : case LobResultTypes.RESPONSE_TRUNCATE : dataOut.writeLong(blockLength); break; case LobResultTypes.RESPONSE_GET_BYTE_PATTERN_POSITION : case LobResultTypes.RESPONSE_GET_CHAR_PATTERN_POSITION : dataOut.writeLong(blockOffset); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ResultLob"); } } private void writeCreate(SessionInterface session, DataOutputStream dataOut) throws IOException { dataOut.writeByte(mode); dataOut.writeInt(databaseID); dataOut.writeLong(sessionID); dataOut.writeLong(lobID); dataOut.writeInt(subType); dataOut.writeLong(blockOffset); dataOut.writeLong(blockLength); switch (subType) { case LobResultTypes.REQUEST_CREATE_BYTES : dataOut.write(stream, blockLength); break; case LobResultTypes.REQUEST_CREATE_CHARS : dataOut.write(reader, blockLength); break; } } private void writeCreateByteSegments(SessionInterface session, DataOutputStream dataOut) throws IOException { // int bufferLength = session.getStreamBlockSize(); long currentOffset = blockOffset; dataOut.writeByte(mode); dataOut.writeInt(databaseID); dataOut.writeLong(sessionID); dataOut.writeLong(lobID); dataOut.writeInt(subType); HsqlByteArrayOutputStream byteArrayOS = new HsqlByteArrayOutputStream(bufferLength); byteArrayOS.reset(); byteArrayOS.write(stream, bufferLength); dataOut.writeLong(currentOffset); dataOut.writeLong(byteArrayOS.size()); dataOut.write(byteArrayOS.getBuffer(), 0, byteArrayOS.size()); currentOffset += byteArrayOS.size(); if (byteArrayOS.size() < bufferLength) { return; } // while (true) { byteArrayOS.reset(); byteArrayOS.write(stream, bufferLength); if (byteArrayOS.size() == 0) { break; } // dataOut.writeByte(mode); dataOut.writeInt(databaseID); dataOut.writeLong(sessionID); dataOut.writeLong(lobID); dataOut.writeInt(LobResultTypes.REQUEST_SET_BYTES); dataOut.writeLong(currentOffset); dataOut.writeLong(byteArrayOS.size()); dataOut.write(byteArrayOS.getBuffer(), 0, byteArrayOS.size()); currentOffset += byteArrayOS.size(); if (byteArrayOS.size() < bufferLength) { break; } } } private void writeCreateCharSegments(SessionInterface session, DataOutputStream dataOut) throws IOException { // int bufferLength = session.getStreamBlockSize(); long currentOffset = blockOffset; dataOut.writeByte(mode); dataOut.writeInt(databaseID); dataOut.writeLong(sessionID); dataOut.writeLong(lobID); dataOut.writeInt(subType); HsqlByteArrayOutputStream byteArrayOS = new HsqlByteArrayOutputStream(bufferLength); byteArrayOS.reset(); byteArrayOS.write(reader, bufferLength / 2); // dataOut.writeLong(currentOffset); dataOut.writeLong(byteArrayOS.size() / 2); dataOut.write(byteArrayOS.getBuffer(), 0, byteArrayOS.size()); currentOffset += byteArrayOS.size() / 2; if (byteArrayOS.size() < bufferLength) { return; } // while (true) { byteArrayOS.reset(); byteArrayOS.write(reader, bufferLength / 2); if (byteArrayOS.size() == 0) { break; } // dataOut.writeByte(mode); dataOut.writeInt(databaseID); dataOut.writeLong(sessionID); dataOut.writeLong(lobID); dataOut.writeInt(LobResultTypes.REQUEST_SET_CHARS); dataOut.writeLong(currentOffset); dataOut.writeLong(byteArrayOS.size() / 2); dataOut.write(byteArrayOS.getBuffer(), 0, byteArrayOS.size()); currentOffset += byteArrayOS.size() / 2; if (byteArrayOS.size() < bufferLength) { break; } } } public long getLobID() { return lobID; } public int getSubType() { return subType; } public long getOffset() { return blockOffset; } public long getBlockLength() { return blockLength; } public byte[] getByteArray() { return byteBlock; } public char[] getCharArray() { return charBlock; } public InputStream getInputStream() { return stream; } public Reader getReader() { return reader; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/result/ResultConstants.java0000644000175000017500000005610512007547374024312 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.result; import org.hsqldb.StatementTypes; /** * An enumeration of the request and response mode values used to communicate * between the client and the engine when sending Result objects back * and forth. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @since 2.1.1 * @version 1.7.2 */ // fredt@users - the constants from the SQL standards are used freely where a // similar function is performed. The Result objects do not necessarily contain // the same information as stated in SQL standard for CLI. public interface ResultConstants { /** The offset at which HSQLDB API Result mode values start. */ int HSQL_API_BASE = 0; /** * Not a result */ int NONE = HSQL_API_BASE + 0; /** * Indicates that the Result object encapsulates an update * count response. */ int UPDATECOUNT = HSQL_API_BASE + 1; /** * Indicates that the Result object encapsualtes an * error response. */ int ERROR = HSQL_API_BASE + 2; /** * Indicates that the Result object encapsulates a result * set response containing data. */ int DATA = HSQL_API_BASE + 3; /** * Indicates that the Result object encapsulates a response * that communicates the acknowlegement of newly allocated * Statement object in the form of its statementID * and metadata */ int PREPARE_ACK = HSQL_API_BASE + 4; /** * Indicates that the Result object encapsulates a result * set for setting session attributes. */ int SETSESSIONATTR = HSQL_API_BASE + 6; /** * Indicates that the Result object encapsulates a request * to get session attributes. */ int GETSESSIONATTR = HSQL_API_BASE + 7; /** * Indicates that the Result object encapsulates a batch of statements */ int BATCHEXECDIRECT = HSQL_API_BASE + 8; /** * Indicates that the Result object encapsulates a batch of prepared * statement parameter values */ int BATCHEXECUTE = HSQL_API_BASE + 9; /** * Indicates that the Result object encapsulates a request to start a new * internal session for the connection */ int RESETSESSION = HSQL_API_BASE + 10; /** * Indicates that the Result object encapsulates a response to a connection * attempt that was successful */ int CONNECTACKNOWLEDGE = HSQL_API_BASE + 11; /** * Indicates that the Result object encapsulates a request to prepare * to commit as the first phase of a two-phase commit */ int PREPARECOMMIT = HSQL_API_BASE + 12; /** * Indicates that the Result object encapsulates a request to return * some rows of data */ int REQUESTDATA = HSQL_API_BASE + 13; /** * Indicates that the Result object encapsulates a set of data rows * without metadata */ int DATAROWS = HSQL_API_BASE + 14; /** * Indicates that the Result object encapsulates a set of data rows * with metadata */ int DATAHEAD = HSQL_API_BASE + 15; /** * Indicates that the Result object encapsulates a set of update counts * for a batch execution */ int BATCHEXECRESPONSE = HSQL_API_BASE + 16; /** * Only for metadata, indicates that the metadata is for the parameters. */ int PARAM_METADATA = HSQL_API_BASE + 17; /** * Common result type for all large object operations */ int LARGE_OBJECT_OP = HSQL_API_BASE + 18; /** * Warning */ int WARNING = HSQL_API_BASE + 19; /** * generated data */ int GENERATED = HSQL_API_BASE + 20; /** * attempt to execute invalid statement */ int EXECUTE_INVALID = HSQL_API_BASE + 21; /** * Indicates that Result encapsulates a request to establish a connection. */ int CONNECT = HSQL_API_BASE + 31; /** * Indicates that Result encapsulates a request to terminate an * established connection. */ int DISCONNECT = HSQL_API_BASE + 32; /** * Indicates that Result encapsulates a request to terminate an * SQL-transaction. */ int ENDTRAN = HSQL_API_BASE + 33; /** * Indicates that Result encapsulates a request to execute a statement * directly. */ int EXECDIRECT = HSQL_API_BASE + 34; /** * Indicates that Result encapsulates a request to execute a prepared * statement. */ int EXECUTE = HSQL_API_BASE + 35; /** * Indicates that Result encapsulates a request to deallocate an * SQL-statement. */ int FREESTMT = HSQL_API_BASE + 36; /** * Indicates that Result encapsulates a request to prepare a statement. */ int PREPARE = HSQL_API_BASE + 37; /** * Indicates that Result encapsulates a request to set the value of an * SQL-connection attribute. */ int SETCONNECTATTR = HSQL_API_BASE + 38; /** * Indicates that Result encapsulates a request to explicitly start an * SQL-transaction and set its characteristics. */ int STARTTRAN = HSQL_API_BASE + 39; /** * Indicates that the Result encapsulates a request to close a result set */ int CLOSE_RESULT = HSQL_API_BASE + 40; /** * Indicates that the Result encapsulates a request to update or insert into a result set */ int UPDATE_RESULT = HSQL_API_BASE + 41; /** * Indicates that the Result encapsulates a simple value for internal use */ int VALUE = HSQL_API_BASE + 42; /** * Indicates that the Result encapsulates a response to a procedure call via CallableStatement */ int CALL_RESPONSE = HSQL_API_BASE + 43; /** * Indicates that the Result encapsulates a data change set */ int CHANGE_SET = HSQL_API_BASE + 44; /** * Constants above this limit are handled as non-HSQLDB results */ int MODE_UPPER_LIMIT = HSQL_API_BASE + 48; // /** The offset at which the standard SQL API Result mode values start. */ // int SQL_API_BASE = 0x00010000; // // /** // * Indicates that Result encapsulates a request to allocate an // * SQL-connection and assign a handle to it. // */ // int SQLALLOCCONNECT = SQL_API_BASE + 1; // /** // * Indicates that Result encapsulates a request to allocate an // * SQL-environment and assign a handle to it. // */ // int SQLALLOCENV = SQL_API_BASE + 2; // // /** // * Indicates that Result encapsulates a request to allocate a resource // * and assign a handle to it. // */ // int SQLALLOCHANDLE = SQL_API_BASE + 1001; // // /** // * Indicates that Result encapsulates a request to allocate an // * SQL-statement and assign a handle to it. // */ // int SQLALLOCSTMT = SQL_API_BASE + 3; // // /** // * Indicates that Result encapsulates a request to describe a target // * specification or array of target specifications. // */ // int SQLBINDCOL = SQL_API_BASE + 4; // // /** // * Indicates that Result encapsulates a request to describe a // * dynamic parameter specification and its value. // */ // int SQLBINDPARAMETER = SQL_API_BASE + 72; // // /** // * Indicates that Result encapsulates a request to cancel execution of // * a CLI routine. // */ // int SQLCANCEL = SQL_API_BASE + 5; // // /** Indicates that Result encapsulates a request to close a cursor. */ // int SQLCLOSECURSOR = SQL_API_BASE + 1003; // // /** // * Indicates that Result encapsulates a request to get a // * column attribute. // */ // int SQLCOLATTRIBUTE = SQL_API_BASE + 6; // // /** // * Indicates that Result encapsulates a request to return a result set that // * contains a list of the privileges held on the columns whose names adhere // * to the requested pattern or patterns within a single specified table // * stored in the Information Schema of the connected data source. // */ // int SQLCOLUMNPRIVILEGES = SQL_API_BASE + 56; // // /** // * Indicates that Result encapsulates a request to, based on the specified // * selection criteria, return a result set that contains information about // * columns of tables stored in the information schemas of the connected // * data source. // */ // int SQLCOLUMNS = SQL_API_BASE + 40; // // // /** // * Indicates that Result encapsulates a request to establish a connection. // */ // int SQLCONNECT = SQL_API_BASE + 7; // // /** // * Indicates that Result encapsulates a request to copy a CLI descriptor. // */ // int SQLCOPYDESC = SQL_API_BASE + 1004; // // /** // * Indicates that Result encapsulates a request to get server name(s) that // * the application can connect to, along with description information, // * if available. // */ // int SQLDATASOURCES = SQL_API_BASE + 57; // // /** // * Indicates that Result encapsulates a request to get column attributes. // */ // int SQLDESCRIBECOL = SQL_API_BASE + 8; // // // /** // * Indicates that Result encapsulates a request to terminate an // * established connection. // */ // int SQLDISCONNECT = SQL_API_BASE + 9; // // /** // * Indicates that Result encapsulates a request to terminate an // * SQL-transaction. // */ // int SQLENDTRAN = SQL_API_BASE + 1005; // // /** // * Indicates that Result encapsulates a request to return diagnostic // * information. // */ // int SQLERROR = SQL_API_BASE + 10; // // /** // * Indicates that Result encapsulates a request to execute a statement // * directly. // */ // int SQLEXECDIRECT = SQL_API_BASE + 11; // // /** // * Indicates that Result encapsulates a request to execute a prepared // * statement. // */ // int SQLEXECUTE = SQL_API_BASE + 12; // // /** // * Indicates that Result encapsulates a request to fetch the next row of // * a cursor. // */ // // int SQLFETCH = SQL_API_BASE + 13; // // /** // * Indicates that Result encapsulates a request to position a cursor on // * the specified row and retrieve values from that row. // */ // int SQLFETCHSCROLL = SQL_API_BASE + 1021; // /** // * Indicates that Result encapsulates a request to return a result set // * that contains information about foreign keys either in or referencing // * a single specified table stored in the Information Schema of the // * connected data source. // */ // int SQLFOREIGNKEYS = SQL_API_BASE + 60; // // /** // * Indicates that Result encapsulates a request to deallocate an // * SQL-connection. // */ // int SQLFREECONNECT = SQL_API_BASE + 14; // // /** // * Indicates that Result encapsulates a request to deallocate an // * SQL-environment. // */ // int SQLFREEENV = SQL_API_BASE + 15; // // /** // * Indicates that Result encapsulates a request to free a resource. // */ // int SQLFREEHANDLE = SQL_API_BASE + 1006; // // /** // * Indicates that Result encapsulates a request to deallocate an // * SQL-statement. // */ // int SQLFREESTMT = SQL_API_BASE + 16; // // /** // * Indicates that Result encapsulates a request to get the value of an // * SQL-connection attribute. // */ // int SQLGETCONNECTATTR = SQL_API_BASE + 1007; // // /** // * Indicates that Result encapsulates a request to get a cursor name. // */ // int SQLGETCURSORNAME = SQL_API_BASE + 17; // // /** // * Indicates that Result encapsulates a request to retrieve a column value. // */ // int SQLGETDATA = SQL_API_BASE + 43; // // /** // * Indicates that Result encapsulates a request to get a field from a CLI // * descriptor area. // */ // int SQLGETDESCFIELD = SQL_API_BASE + 1008; // // /** // * Indicates that Result encapsulates a request to get commonly-used // * fields from a CLI descriptor area. // */ // int SQLGETDESCREC = SQL_API_BASE + 1009; // // /** // * Indicates that Result encapsulates a request to get information from a // * CLI diagnostics area. // */ // int SQLGETDIAGFIELD = SQL_API_BASE + 1010; // // /** Indicates that Result encapsulates a request to get commonly-used // * information from a CLI diagnostics area. // */ // int SQLGETDIAGREC = SQL_API_BASE + 1011; // // /** // * Indicates that Result encapsulates a request to get the value of an // * SQL-environment attribute. // */ // int SQLGETENVATTR = SQL_API_BASE + 1012; // // /** // * Indicates that Result encapsulates a request to get information // * about features supported by the CLI implementation. // */ // int SQLGETFEATUREINFO = SQL_API_BASE + 1027; // // /** // * Indicates that Result encapsulates a request to determine whether a CLI // * routine is supported. // */ // int SQLGETFUNCTIONS = SQL_API_BASE + 44; // // /** // * Indicates that Result encapsulates a request to get information about // * the implementation. // */ // int SQLGETINFO = SQL_API_BASE + 45; // // /** // * Indicates that Result encapsulates a request to retrieve the length of // * the character or octet string value represented by a Large Object // * locator. // */ // int SQLGETLENGTH = SQL_API_BASE + 1022; // // /** // * Indicates that Result encapsulates a request to retrieve the value of a // * dynamic output parameter. // */ // int SQLGETPARAMDATA = SQL_API_BASE + 1025; // // /** // * Indicates that Result encapsulates a request to retrieve the starting // * position of a string value within another string value, where the second // * string value is represented by a Large Object locator. // */ // int SQLGETPOSITION = SQL_API_BASE + 1023; // // // /** // * Indicates that Result encapsulates a request to get information about // * general value specifications supported by the implementation. // */ // int SQLGETSESSIONINFO = SQL_API_BASE + 1028; // /** // * Indicates that Result encapsulates a request to get the value of an // * SQL-statement attribute. // */ // int SQLGETSTMTATTR = SQL_API_BASE + 1014; // // /** // * Indicates that Result encapsulates a request to either retrieve a // * portion of a character or octet string value that is represented by // * a Large Object locator or create a Large Object value at the server // * and retrieve a Large Object locator for that value. // */ // int SQLGETSUBSTRING = SQL_API_BASE + 1024; // // /** // * Indicates that Result encapsulates a request to get information about // * one or all of the predefined data types supported by the implementation. // */ // int SQLGETTYPEINFO = SQL_API_BASE + 47; // // /** // * Indicates that Result encapsulates a request to determine whether there // * are more result sets available on a statement handle and, if there are, // * initialize processing for those result sets. // */ // int SQLMORERESULTS = SQL_API_BASE + 61; // // /** // * Indicates that Result encapsulates a request to determine whether there // * are more result sets available on a statement handle and, if there are, // * initialize processing for the next result set on a separate statement // * handle. // */ // int SQLNEXTRESULT = SQL_API_BASE + 73; // /** // * Indicates that Result encapsulates a request to get the number of // * result columns of a prepared or executed statement. // */ // int SQLNUMRESULTCOLS = SQL_API_BASE + 18; // /** // * Indicates that Result encapsulates a request to process a deferred // * parameter value. For example, a streamed or locator identified // * parameter. // */ // int SQLPARAMDATA = SQL_API_BASE + 48; // // /** // * Indicates that Result encapsulates a request to prepare a statement. // */ // int SQLPREPARE = SQL_API_BASE + 19; // // /** // * Indicates that Result encapsulates a request to return a result set that // * contains a list of the column names that comprise the primary key for a // * single specified table stored in the information schemas of the // * connected data source. // */ // int SQLPRIMARYKEYS = SQL_API_BASE + 65; // // /** // * Indicates that Result encapsulates a request to provide a deferred // * parameter value. For example, a streamed or locator-identified // * parameter. // */ // int SQLPUTDATA = SQL_API_BASE + 49; // // /** // * Indicates that Result encapsulates a request to get the row count of an // * executed statement. // */ // int SQLROWCOUNT = SQL_API_BASE + 20; // // /** // * Indicates that Result encapsulates a request to set the value of an // * SQL-connection attribute. // */ // int SQLSETCONNECTATTR = SQL_API_BASE + 1016; // // // /** Indicates that Result encapsulates a request to set a cursor name. */ // int SQLSETCURSORNAME = SQL_API_BASE + 21; // // /** // * Indicates that Result encapsulates a request to set a field in a CLI // * descriptor area. // */ // int SQLSETDESCFIELD = SQL_API_BASE + 1017; // // /** // * Indicates that Result encapsulates a request to set commonly-used // * fields in a CLI descriptor area. // */ // int SQLSETDESCREC = SQL_API_BASE + 1018; // // // /** // * Indicates that Result encapsulates a request to set the value of an // * SQL-environment attribute. // */ // int SQLSETENVATTR = SQL_API_BASE + 1019; // /** Indicates that Result encapsulates a request to set the value of an // * SQL-statement attribute. // */ // int SQLSETSTMTATTR = SQL_API_BASE + 1020; // // /** // * Indicates that Result encapsulates a request to return a result set that // * contains a list of columns the combined values of which can uniquely // * identify any row within a single specified table described by the // * Information Schemas of the connected data source. // */ // int SQLSPECIALCOLUMNS = SQL_API_BASE + 52; // // // /** // * Indicates that Result encapsulates a request to explicitly start an // * SQL-transaction and set its characteristics. // */ // int SQLSTARTTRAN = SQL_API_BASE + 74; // // /** // * Indicates that Result encapsulates a request to return a result set that // * contains a list of the privileges held on the tables whose names adhere // * to the requested pattern(s) within tables described by the Information // * Schemas of the connected data source. // */ // int SQLTABLES = SQL_API_BASE + 54; // // /** // * Indicates that Result encapsulates a request to, based on the specified // * selection criteria, return a result set that contains information about // * tables described by the Information Schema of the connected data source. // */ // int SQLTABLEPRIVILEGES = SQL_API_BASE + 70; /* Codes for transaction termination: COMMIT 0 ROLLBACK 1 SAVEPOINT NAME ROLLBACK 2 SAVEPOINT NAME RELEASE 4 COMMIT AND CHAIN 6 ROLLBACK AND CHAIN 7 Implementation-defined termination type <0 */ int TX_COMMIT = 0; int TX_ROLLBACK = 1; int TX_SAVEPOINT_NAME_ROLLBACK = 2; int TX_SAVEPOINT_NAME_RELEASE = 4; int TX_COMMIT_AND_CHAIN = 6; int TX_ROLLBACK_AND_CHAIN = 7; /* StatementType codes duplicated for cursor operations */ int UPDATE_CURSOR = StatementTypes.UPDATE_CURSOR; int DELETE_CURSOR = StatementTypes.DELETE_CURSOR; int INSERT_CURSOR = StatementTypes.INSERT; /* Environment attributes */ //#define SQL_ATTR_OUTPUT_NTS 10001 /* Connection attributes */ //#define SQL_ATTR_AUTO_IPD 10001 //#define SQL_ATTR_SAVEPOINT_NAME 10027 int SQL_ATTR_SAVEPOINT_NAME = 10027; // Batched execution constants: /** batch item failed */ int EXECUTE_FAILED = -3; /** * Batch item succeeded but does not generate an update count, * for example a call having no return value */ int SUCCESS_NO_INFO = -2; /* SQL standard properties The operational sensitivity property (either SENSITIVE, INSENSITIVE, or ASENSITIVE). The operational scrollability property (either SCROLL or NO SCROLL). The operational holdability property (either WITH HOLD or WITHOUT HOLD). The operational returnability property (either WITH RETURN or WITHOUT RETURN). */ int SQL_ASENSITIVE = 0; int SQL_INSENSITIVE = 1; int SQL_SENSITIVE = 2; int SQL_NONSCROLLABLE = 0; int SQL_SCROLLABLE = 1; int SQL_NONHOLDABLE = 0; int SQL_HOLDABLE = 1; // int SQL_WITHOUT_RETURN = 0; int SQL_WITH_RETURN = 1; int SQL_NOT_UPDATABLE = 0; int SQL_UPDATABLE = 1; // data result properties - matching java.sql.ResultSet constants int TYPE_FORWARD_ONLY = 1003; int TYPE_SCROLL_INSENSITIVE = 1004; int TYPE_SCROLL_SENSITIVE = 1005; // int CONCUR_READ_ONLY = 1007; int CONCUR_UPDATABLE = 1008; // int HOLD_CURSORS_OVER_COMMIT = 1; int CLOSE_CURSORS_AT_COMMIT = 2; /** Constants indicating generated key return behaviour */ int RETURN_GENERATED_KEYS = 1; // matching java.sql.Statement constant int RETURN_NO_GENERATED_KEYS = 2; // matching java.sql.Statement constant int RETURN_GENERATED_KEYS_COL_NAMES = 11; // constant in HSQLDB only int RETURN_GENERATED_KEYS_COL_INDEXES = 21; // constant in HSQLDB only } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/result/ResultProperties.java0000644000175000017500000001327212007547374024470 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.result; /* * Execute properties for SELECT statements. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class ResultProperties { // static final int idx_returnable = 0; static final int idx_holdable = 1; static final int idx_scrollable = 2; static final int idx_updatable = 3; static final int idx_sensitive = 4; static final int idx_isheld = 5; // public static final int defaultPropsValue = 0; public static final int updatablePropsValue = 1 << idx_updatable; // uses SQL constants - no JDBC public static int getProperties(int sensitive, int updatable, int scrollable, int holdable, int returnable) { int combined = (sensitive << idx_sensitive) | (updatable << idx_updatable) | (scrollable << idx_scrollable) | (holdable << idx_holdable) | (returnable << idx_returnable); return combined; } public static int getJDBCHoldability(int props) { return isHoldable(props) ? ResultConstants.HOLD_CURSORS_OVER_COMMIT : ResultConstants.CLOSE_CURSORS_AT_COMMIT; } public static int getJDBCConcurrency(int props) { return isReadOnly(props) ? ResultConstants.CONCUR_READ_ONLY : ResultConstants.CONCUR_UPDATABLE; } public static int getJDBCScrollability(int props) { return isScrollable(props) ? ResultConstants.TYPE_SCROLL_INSENSITIVE : ResultConstants.TYPE_FORWARD_ONLY; } public static int getValueForJDBC(int type, int concurrency, int holdability) { int scrollable = type == ResultConstants.TYPE_FORWARD_ONLY ? 0 : 1; int updatable = concurrency == ResultConstants.CONCUR_UPDATABLE ? 1 : 0; int holdable = holdability == ResultConstants.HOLD_CURSORS_OVER_COMMIT ? 1 : 0; int prop = (updatable << idx_updatable) | (scrollable << idx_scrollable) | (holdable << idx_holdable); return prop; } public static boolean isUpdatable(int props) { return (props & (1 << idx_updatable)) == 0 ? false : true; } public static boolean isScrollable(int props) { return (props & (1 << idx_scrollable)) == 0 ? false : true; } public static boolean isHoldable(int props) { return (props & (1 << idx_holdable)) == 0 ? false : true; } public static boolean isSensitive(int props) { return (props & (1 << idx_sensitive)) == 0 ? false : true; } public static boolean isReadOnly(int props) { return (props & (1 << idx_updatable)) == 0 ? true : false; } public static boolean isHeld(int props) { return (props & (1 << idx_isheld)) == 0 ? false : true; } public static int addUpdatable(int props, boolean flag) { return flag ? props | ((1) << idx_updatable) : props & (~(1 << idx_updatable)); } public static int addHoldable(int props, boolean flag) { return flag ? props | ((1) << idx_holdable) : props & (~(1 << idx_holdable)); } public static int addScrollable(int props, boolean flag) { return flag ? props | ((1) << idx_scrollable) : props & (~(1 << idx_scrollable)); } public static int addIsHeld(int props, boolean flag) { return flag ? props | ((1) << idx_isheld) : props & (~(1 << idx_isheld)); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/RangeVariable.java0000644000175000017500000016566112007547412022324 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.SimpleName; import org.hsqldb.ParserDQL.CompileContext; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HashMap; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.HsqlList; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.OrderedIntHashSet; import org.hsqldb.lib.OrderedLongHashSet; import org.hsqldb.navigator.RangeIterator; import org.hsqldb.navigator.RowIterator; import org.hsqldb.persist.PersistentStore; import org.hsqldb.store.ValuePool; import org.hsqldb.types.Type; /** * Metadata for range variables, including conditions. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class RangeVariable implements Cloneable { static final RangeVariable[] emptyArray = new RangeVariable[]{}; // public static final int TABLE_RANGE = 1; public static final int TRANSITION_RANGE = 2; public static final int PARAMETER_RANGE = 3; public static final int VARIALBE_RANGE = 4; // Table rangeTable; final SimpleName tableAlias; private OrderedHashSet columnAliases; private SimpleName[] columnAliasNames; private OrderedHashSet columnNames; OrderedHashSet namedJoinColumns; HashMap namedJoinColumnExpressions; private Object[] emptyData; boolean[] columnsInGroupBy; boolean hasKeyedColumnInGroupBy; boolean[] usedColumns; boolean[] updatedColumns; // RangeVariableConditions[] joinConditions; RangeVariableConditions[] whereConditions; int subRangeCount; // non-index conditions Expression joinCondition; // boolean isLateral; boolean isLeftJoin; // table joined with LEFT / FULL OUTER JOIN boolean isRightJoin; // table joined with RIGHT / FULL OUTER JOIN boolean isBoundary; // boolean hasLateral; boolean hasLeftJoin; boolean hasRightJoin; // int level; // int indexDistinctCount; // int rangePositionInJoin; // int rangePosition; // int parsePosition; // for variable and parameter lists HashMappedList variables; // variable, parameter, table int rangeType; // boolean isGenerated; public RangeVariable(HashMappedList variables, SimpleName rangeName, boolean isVariable, int rangeType) { this.variables = variables; this.rangeType = rangeType; rangeTable = null; tableAlias = rangeName; emptyData = null; columnsInGroupBy = null; usedColumns = null; joinConditions = new RangeVariableConditions[]{ new RangeVariableConditions(this, true) }; whereConditions = new RangeVariableConditions[]{ new RangeVariableConditions(this, false) }; switch (rangeType) { case TRANSITION_RANGE : case PARAMETER_RANGE : case VARIALBE_RANGE : break; default : throw Error.runtimeError(ErrorCode.U_S0500, "RangeVariable"); } } public RangeVariable(Table table, SimpleName alias, OrderedHashSet columnList, SimpleName[] columnNameList, CompileContext compileContext) { rangeType = TABLE_RANGE; rangeTable = table; tableAlias = alias; columnAliases = columnList; columnAliasNames = columnNameList; joinConditions = new RangeVariableConditions[]{ new RangeVariableConditions(this, true) }; whereConditions = new RangeVariableConditions[]{ new RangeVariableConditions(this, false) }; compileContext.registerRangeVariable(this); if (rangeTable.getColumnCount() != 0) { setRangeTableVariables(); } } public RangeVariable(Table table, int position) { rangeType = TABLE_RANGE; rangeTable = table; tableAlias = null; emptyData = rangeTable.getEmptyRowData(); columnsInGroupBy = rangeTable.getNewColumnCheckList(); usedColumns = rangeTable.getNewColumnCheckList(); rangePosition = position; joinConditions = new RangeVariableConditions[]{ new RangeVariableConditions(this, true) }; whereConditions = new RangeVariableConditions[]{ new RangeVariableConditions(this, false) }; } public void setRangeTableVariables() { if (columnAliasNames != null && rangeTable.getColumnCount() != columnAliasNames.length) { throw Error.error(ErrorCode.X_42593); } emptyData = rangeTable.getEmptyRowData(); columnsInGroupBy = rangeTable.getNewColumnCheckList(); usedColumns = rangeTable.getNewColumnCheckList(); joinConditions[0].rangeIndex = rangeTable.getPrimaryIndex(); whereConditions[0].rangeIndex = rangeTable.getPrimaryIndex(); } public RangeVariable duplicate() { RangeVariable r = null; try { r = (RangeVariable) super.clone(); } catch (CloneNotSupportedException ex) { throw Error.runtimeError(ErrorCode.U_S0500, "RangeVariable"); } r.resetConditions(); return r; } public void setJoinType(boolean isLeft, boolean isRight) { isLeftJoin = isLeft; isRightJoin = isRight; if (isRightJoin) { whereConditions[0].rangeIndex = rangeTable.getPrimaryIndex(); } } public void addNamedJoinColumns(OrderedHashSet columns) { namedJoinColumns = columns; } public void addColumn(int columnIndex) { if (usedColumns != null) { usedColumns[columnIndex] = true; } } public void addAllColumns() { if (usedColumns != null) { ArrayUtil.fillArray(usedColumns, true); } } public void addNamedJoinColumnExpression(String name, Expression e) { if (namedJoinColumnExpressions == null) { namedJoinColumnExpressions = new HashMap(); } namedJoinColumnExpressions.put(name, e); } public ExpressionColumn getColumnExpression(String name) { return namedJoinColumnExpressions == null ? null : (ExpressionColumn) namedJoinColumnExpressions .get(name); } public Table getTable() { return rangeTable; } public boolean hasAnyIndexCondition() { for (int i = 0; i < joinConditions.length; i++) { if (joinConditions[0].indexedColumnCount > 0) { return true; } } for (int i = 0; i < whereConditions.length; i++) { if (whereConditions[0].indexedColumnCount > 0) { return true; } } return false; } public boolean hasSingleIndexCondition() { return joinConditions.length == 1 && joinConditions[0].indexedColumnCount > 0; } public boolean setDistinctColumnsOnIndex(int[] colMap) { if (joinConditions.length != 1) { return false; } int[] indexColMap = joinConditions[0].rangeIndex.getColumns(); if (colMap.length != ArrayUtil.countTrueElements(usedColumns)) { return false; } if (colMap.length == 1 && colMap[0] == indexColMap[0]) { indexDistinctCount = 1; return true; } return false; } /** * Used for sort */ public Index getSortIndex() { if (joinConditions.length == 1) { return joinConditions[0].rangeIndex; } else { return null; } } /** * Used for sort */ public boolean setSortIndex(Index index, boolean reversed) { if (joinConditions.length == 1) { if (joinConditions[0].indexedColumnCount == 0) { joinConditions[0].rangeIndex = index; joinConditions[0].reversed = reversed; return true; } } return false; } public boolean reverseOrder() { joinConditions[0].reverseIndexCondition(); return true; } public OrderedHashSet getColumnNames() { if (columnNames == null) { columnNames = new OrderedHashSet(); rangeTable.getColumnNames(this.usedColumns, columnNames); } return columnNames; } public OrderedHashSet getUniqueColumnNameSet() { OrderedHashSet set = new OrderedHashSet(); if (columnAliases != null) { set.addAll(columnAliases); return set; } for (int i = 0; i < rangeTable.columnList.size(); i++) { String name = rangeTable.getColumn(i).getName().name; boolean added = set.add(name); if (!added) { throw Error.error(ErrorCode.X_42578, name); } } return set; } public int findColumn(String schemaName, String tableName, String columnName) { if (resolvesSchemaAndTableName(schemaName, tableName)) { return findColumn(columnName); } return -1; } /** * Retruns index for column * * @param columnName name of column * @return int index or -1 if not found */ private int findColumn(String columnName) { if (namedJoinColumnExpressions != null && namedJoinColumnExpressions.containsKey(columnName)) { return -1; } if (variables != null) { return variables.getIndex(columnName); } else if (columnAliases != null) { return columnAliases.getIndex(columnName); } else { return rangeTable.findColumn(columnName); } } public ColumnSchema getColumn(int i) { if (variables == null) { return rangeTable.getColumn(i); } else { return (ColumnSchema) variables.get(i); } } public SimpleName getColumnAlias(int i) { if (columnAliases == null) { return rangeTable.getColumn(i).getName(); } else { return columnAliasNames[i]; } } public boolean hasColumnAlias() { return columnAliases != null; } public boolean hasTableAlias() { return tableAlias != null; } public SimpleName getTableAlias() { return tableAlias == null ? rangeTable.getName() : tableAlias; } public RangeVariable getRangeForTableName(String name) { if (resolvesTableName(name)) { return this; } return null; } private boolean resolvesSchemaAndTableName(String schemaName, String tableName) { return resolvesSchemaName(schemaName) && resolvesTableName(tableName); } private boolean resolvesTableName(String name) { if (name == null) { return true; } if (variables != null) { if (tableAlias != null) { return name.equals(tableAlias.name); } return false; } if (tableAlias == null) { if (name.equals(rangeTable.getName().name)) { return true; } } else if (name.equals(tableAlias.name)) { return true; } return false; } private boolean resolvesSchemaName(String name) { if (name == null) { return true; } if (variables != null) { return false; } if (tableAlias != null) { return false; } return name.equals(rangeTable.getSchemaName().name); } /** * Add all columns to a list of expressions */ public void addTableColumns(HsqlArrayList exprList) { if (namedJoinColumns != null) { int count = exprList.size(); int position = 0; for (int i = 0; i < count; i++) { Expression e = (Expression) exprList.get(i); String columnName = e.getColumnName(); if (namedJoinColumns.contains(columnName)) { if (position != i) { exprList.remove(i); exprList.add(position, e); } e = getColumnExpression(columnName); exprList.set(position, e); position++; } } } addTableColumns(exprList, exprList.size(), namedJoinColumns); } /** * Add all columns to a list of expressions */ public int addTableColumns(HsqlArrayList exprList, int position, HashSet exclude) { Table table = getTable(); int count = table.getColumnCount(); for (int i = 0; i < count; i++) { ColumnSchema column = table.getColumn(i); String columnName = columnAliases == null ? column.getName().name : (String) columnAliases .get(i); if (exclude != null && exclude.contains(columnName)) { continue; } Expression e = new ExpressionColumn(this, i); exprList.add(position++, e); } return position; } public void addTableColumns(RangeVariable subRange, Expression expression, HashSet exclude) { if (subRange == this) { Table table = getTable(); int count = table.getColumnCount(); addTableColumns(expression, 0, count, exclude); } } protected int getFirstColumnIndex(RangeVariable subRange) { if (subRange == this) { return 0; } return -1; } protected void addTableColumns(Expression expression, int start, int count, HashSet exclude) { Table table = getTable(); HsqlArrayList list = new HsqlArrayList(); for (int i = start; i < start + count; i++) { ColumnSchema column = table.getColumn(i); String columnName = columnAliases == null ? column.getName().name : (String) columnAliases .get(i); if (exclude != null && exclude.contains(columnName)) { continue; } Expression e = new ExpressionColumn(this, i); list.add(e); } Expression[] nodes = new Expression[list.size()]; list.toArray(nodes); expression.nodes = nodes; } /** * Removes reference to Index to avoid possible memory leaks after alter * table or drop index */ public void setForCheckConstraint() { joinConditions[0].rangeIndex = null; rangePosition = 0; } /** * used before condition processing */ public Expression getJoinCondition() { return joinCondition; } public void addJoinCondition(Expression e) { joinCondition = ExpressionLogical.andExpressions(joinCondition, e); } public void resetConditions() { Index index = joinConditions[0].rangeIndex; joinConditions = new RangeVariableConditions[]{ new RangeVariableConditions(this, true) }; joinConditions[0].rangeIndex = index; whereConditions = new RangeVariableConditions[]{ new RangeVariableConditions(this, false) }; } public OrderedHashSet getSubqueries() { OrderedHashSet set = null; if (joinCondition != null) { set = joinCondition.collectAllSubqueries(set); } if (rangeTable instanceof TableDerived) { QueryExpression queryExpression = ((TableDerived) rangeTable).getQueryExpression(); if (queryExpression == null) { Expression dataExpression = ((TableDerived) rangeTable).getDataExpression(); if (dataExpression != null) { if (set == null) { set = new OrderedHashSet(); } OrderedHashSet.addAll(set, dataExpression.getSubqueries()); } } else { OrderedHashSet temp = queryExpression.getSubqueries(); set = OrderedHashSet.addAll(set, temp); set = OrderedHashSet.add(set, rangeTable); } } return set; } public OrderedHashSet collectAllExpressions(OrderedHashSet set, OrderedIntHashSet typeSet, OrderedIntHashSet stopAtTypeSet) { if (joinCondition != null) { set = joinCondition.collectAllExpressions(set, typeSet, stopAtTypeSet); } QueryExpression queryExpression = rangeTable.getQueryExpression(); Expression dataExpression = rangeTable.getDataExpression(); if (queryExpression != null) { set = queryExpression.collectAllExpressions(set, typeSet, stopAtTypeSet); } if (dataExpression != null) { set = dataExpression.collectAllExpressions(set, typeSet, stopAtTypeSet); } return set; } public void replaceColumnReferences(RangeVariable range, Expression[] list) { QueryExpression queryExpression = rangeTable.getQueryExpression(); Expression dataExpression = rangeTable.getDataExpression(); if (dataExpression != null) { dataExpression = dataExpression.replaceColumnReferences(range, list); } if (queryExpression != null) { queryExpression.replaceColumnReferences(range, list); } if (joinCondition != null) { joinCondition = joinCondition.replaceColumnReferences(range, list); } for (int i = 0; i < joinConditions.length; i++) { joinConditions[i].replaceColumnReferences(range, list); } for (int i = 0; i < whereConditions.length; i++) { whereConditions[i].replaceColumnReferences(range, list); } } public void replaceRangeVariables(RangeVariable[] ranges, RangeVariable[] newRanges) { if (joinCondition != null) { joinCondition.replaceRangeVariables(ranges, newRanges); } } public void resolveRangeTable(Session session, RangeGroup rangeGroup, RangeGroup[] rangeGroups) { Table table = rangeTable; QueryExpression queryExpression = rangeTable.getQueryExpression(); Expression dataExpression = rangeTable.getDataExpression(); if (queryExpression == null && dataExpression == null) { return; } rangeGroups = (RangeGroup[]) ArrayUtil.toAdjustedArray(rangeGroups, rangeGroup, rangeGroups.length, 1); if (dataExpression != null) { HsqlList unresolved = dataExpression.resolveColumnReferences(session, RangeGroup.emptyGroup, rangeGroups, null); unresolved = Expression.resolveColumnSet(session, RangeVariable.emptyArray, RangeGroup.emptyArray, unresolved); ExpressionColumn.checkColumnsResolved(unresolved); dataExpression.resolveTypes(session, null); setRangeTableVariables(); } if (queryExpression != null) { queryExpression.resolveReferences(session, rangeGroups); HsqlList unresolved = queryExpression.getUnresolvedExpressions(); unresolved = Expression.resolveColumnSet(session, RangeVariable.emptyArray, RangeGroup.emptyArray, unresolved); ExpressionColumn.checkColumnsResolved(unresolved); queryExpression.resolveTypesPartOne(session); queryExpression.resolveTypesPartTwo(session); rangeTable.prepareTable(); setRangeTableVariables(); } } void resolveRangeTableTypes(Session session, RangeVariable[] ranges) { QueryExpression queryExpression = rangeTable.getQueryExpression(); if (queryExpression != null) { if (queryExpression instanceof QuerySpecification) { QuerySpecification qs = (QuerySpecification) queryExpression; if (qs.isGrouped || qs.isAggregated || qs.isOrderSensitive) { // } else { moveConditionsToInner(session, ranges); } } queryExpression.resolveTypesPartThree(session); } } void moveConditionsToInner(Session session, RangeVariable[] ranges) { Expression[] colExpr; int exclude = ArrayUtil.find(ranges, this); HsqlArrayList conditionsList = new HsqlArrayList(); Expression condition = null; if (isRightJoin) { if (whereConditions.length > 1) { return; } addConditionsToList(conditionsList, whereConditions[0].indexCond); if (whereConditions[0].indexCond != null && whereConditions[0].indexCond[0] != whereConditions[0].indexEndCond[0]) { addConditionsToList(conditionsList, whereConditions[0].indexEndCond); } RangeVariableResolver.decomposeAndConditions(session, whereConditions[0].nonIndexCondition, conditionsList); } else { if (joinConditions.length > 1 || whereConditions.length > 1) { return; } addConditionsToList(conditionsList, joinConditions[0].indexCond); if (joinConditions[0].indexCond != null && joinConditions[0].indexCond[0] != joinConditions[0].indexEndCond[0]) { addConditionsToList(conditionsList, joinConditions[0].indexEndCond); } addConditionsToList(conditionsList, whereConditions[0].indexCond); addConditionsToList(conditionsList, whereConditions[0].indexEndCond); RangeVariableResolver.decomposeAndConditions(session, joinConditions[0].nonIndexCondition, conditionsList); RangeVariableResolver.decomposeAndConditions(session, whereConditions[0].nonIndexCondition, conditionsList); } for (int i = conditionsList.size() - 1; i >= 0; i--) { Expression e = (Expression) conditionsList.get(i); if (e == null || e == ExpressionLogical.EXPR_TRUE || e.hasReference(ranges, exclude)) { conditionsList.remove(i); continue; } } if (conditionsList.size() == 0) { if (rangeTable.isView()) { ((TableDerived) rangeTable).resetToView(); } return; } QueryExpression queryExpression = rangeTable.getQueryExpression(); colExpr = ((QuerySpecification) queryExpression).exprColumns; for (int i = 0; i < conditionsList.size(); i++) { Expression e = (Expression) conditionsList.get(i); if (!e.hasReference(ranges, exclude)) { e = e.duplicate(); e = e.replaceColumnReferences(this, colExpr); if (e.collectAllSubqueries(null) != null) { return; } condition = ExpressionLogical.andExpressions(condition, e); } } queryExpression.addExtraConditions(condition); } private static void addConditionsToList(HsqlArrayList list, Expression[] array) { if (array == null) { return; } for (int i = 0; i < array.length; i++) { if (array[i] != null) { if (array[i].isSingleColumnCondition || array[i].isSingleColumnNull || array[i].isSingleColumnNotNull) { list.add(array[i]); } } } } /** * Retreives a String representation of this obejct.

* * The returned String describes this object's table, alias * access mode, index, join mode, Start, End and And conditions. * * @return a String representation of this object */ public String describe(Session session, int blanks) { StringBuffer sb; StringBuffer b = new StringBuffer(blanks); for (int i = 0; i < blanks; i++) { b.append(' '); } sb = new StringBuffer(); String temp = "INNER"; if (isLeftJoin) { temp = "LEFT OUTER"; if (isRightJoin) { temp = "FULL"; } } else if (isRightJoin) { temp = "RIGHT OUTER"; } sb.append(b).append("join type=").append(temp).append("\n"); sb.append(b).append("table=").append(rangeTable.getName().name).append( "\n"); if (tableAlias != null) { sb.append(b).append("alias=").append(tableAlias.name).append("\n"); } RangeVariableConditions[] conditions = joinConditions; if (whereConditions[0].hasIndexCondition()) { conditions = whereConditions; } sb.append(b).append("cardinality="); sb.append(conditions[0].rangeIndex.size(session, rangeTable.getRowStore(session))).append("\n"); boolean fullScan = !conditions[0].hasIndexCondition(); sb.append(b); if (conditions == whereConditions) { if (joinConditions[0].nonIndexCondition != null) { sb.append("join condition = ["); sb.append(joinConditions[0].nonIndexCondition.describe(session, blanks)); sb.append(b).append("]\n"); sb.append(b); } } sb.append("access=").append(fullScan ? "FULL SCAN" : "INDEX PRED").append("\n"); for (int i = 0; i < conditions.length; i++) { if (i > 0) { sb.append(b).append("OR condition = ["); } else { sb.append(b); if (conditions == whereConditions) { sb.append("where condition = ["); } else { sb.append("join condition = ["); } } sb.append(conditions[i].describe(session, blanks + 2)); sb.append(b).append("]\n"); } if (conditions == joinConditions) { sb.append(b); if (whereConditions[0].nonIndexCondition != null) { sb.append("where condition = ["); sb.append( whereConditions[0].nonIndexCondition.describe( session, blanks)); sb.append(b).append("]\n"); sb.append(b); } } return sb.toString(); } public RangeIteratorMain getIterator(Session session) { RangeIteratorMain it; if (this.isRightJoin) { it = new RangeIteratorRight(session, this, null); } else { it = new RangeIteratorMain(session, this); } session.sessionContext.setRangeIterator(it); return it; } public static RangeIterator getIterator(Session session, RangeVariable[] rangeVars) { if (rangeVars.length == 1) { return rangeVars[0].getIterator(session); } RangeIteratorMain[] iterators = new RangeIteratorMain[rangeVars.length]; for (int i = 0; i < rangeVars.length; i++) { iterators[i] = rangeVars[i].getIterator(session); } return new RangeIteratorJoined(iterators); } public static class RangeIteratorBase implements RangeIterator { Session session; int rangePosition; RowIterator it; PersistentStore store; Object[] currentData; Row currentRow; boolean isBeforeFirst; RangeVariable rangeVar; private RangeIteratorBase() {} public boolean isBeforeFirst() { return isBeforeFirst; } public boolean next() { if (isBeforeFirst) { isBeforeFirst = false; } else { if (it == null) { return false; } } currentRow = it.getNextRow(); if (currentRow == null) { return false; } else { currentData = currentRow.getData(); return true; } } public Row getCurrentRow() { return currentRow; } public Object[] getCurrent() { return currentData; } public Object getCurrent(int i) { return currentData == null ? null : currentData[i]; } public void setCurrent(Object[] data) { currentData = data; } public long getRowId() { return currentRow == null ? 0 : ((long) rangeVar.rangeTable.getId() << 32) + ((long) currentRow.getPos()); } public Object getRowidObject() { return currentRow == null ? null : ValuePool.getLong(getRowId()); } public void remove() {} public void reset() { if (it != null) { it.release(); } it = null; currentRow = null; isBeforeFirst = true; } public int getRangePosition() { return rangePosition; } public Row getNextRow() { throw Error.runtimeError(ErrorCode.U_S0500, "RangeVariable"); } public boolean hasNext() { throw Error.runtimeError(ErrorCode.U_S0500, "RangeVariable"); } public Object[] getNext() { throw Error.runtimeError(ErrorCode.U_S0500, "RangeVariable"); } public boolean setRowColumns(boolean[] columns) { throw Error.runtimeError(ErrorCode.U_S0500, "RangeVariable"); } public void release() { if (it != null) { it.release(); } } } public static class RangeIteratorMain extends RangeIteratorBase { boolean hasLeftOuterRow; boolean isFullIterator; RangeVariableConditions[] conditions; RangeVariableConditions[] whereConditions; RangeVariableConditions[] joinConditions; int condIndex = 0; // OrderedLongHashSet lookup; // Object[] currentJoinData = null; RangeIteratorMain() { super(); } private RangeIteratorMain(Session session, RangeVariable rangeVar) { this.rangePosition = rangeVar.rangePosition; this.store = rangeVar.rangeTable.getRowStore(session); this.session = session; this.rangeVar = rangeVar; currentData = rangeVar.emptyData; isBeforeFirst = true; whereConditions = rangeVar.whereConditions; joinConditions = rangeVar.joinConditions; if (rangeVar.isRightJoin) { lookup = new OrderedLongHashSet(); } conditions = rangeVar.joinConditions; if (rangeVar.whereConditions[0].hasIndexCondition()) { conditions = rangeVar.whereConditions; } } public boolean isBeforeFirst() { return isBeforeFirst; } public boolean next() { while (condIndex < conditions.length) { if (isBeforeFirst) { isBeforeFirst = false; initialiseIterator(); } boolean result = findNext(); if (result) { return true; } reset(); condIndex++; } condIndex = 0; return false; } public void remove() {} public void reset() { if (it != null) { it.release(); } it = null; currentData = rangeVar.emptyData; currentRow = null; isBeforeFirst = true; } public int getRangePosition() { return rangeVar.rangePosition; } /** */ protected void initialiseIterator() { if (condIndex == 0) { hasLeftOuterRow = rangeVar.isLeftJoin; } if (conditions[condIndex].isFalse) { it = conditions[condIndex].rangeIndex.emptyIterator(); return; } rangeVar.rangeTable.materialiseCorrelated(session); if (conditions[condIndex].indexCond == null) { if (conditions[condIndex].reversed) { it = conditions[condIndex].rangeIndex.lastRow(session, store); } else { it = conditions[condIndex].rangeIndex.firstRow(session, store); } } else { getFirstRow(); if (!conditions[condIndex].isJoin) { hasLeftOuterRow = false; } } } private void getFirstRow() { if (currentJoinData == null || currentJoinData.length < conditions[condIndex].indexedColumnCount) { currentJoinData = new Object[conditions[condIndex].indexedColumnCount]; } for (int i = 0; i < conditions[condIndex].indexedColumnCount; i++) { int range = 0; int opType = i == conditions[condIndex].indexedColumnCount - 1 ? conditions[condIndex].opType : conditions[condIndex].indexCond[i].getType(); if (opType == OpTypes.IS_NULL || opType == OpTypes.NOT || opType == OpTypes.MAX) { currentJoinData[i] = null; continue; } Type valueType = conditions[condIndex].indexCond[i].getRightNode() .getDataType(); Object value = conditions[condIndex].indexCond[i].getRightNode().getValue( session); Type targetType = conditions[condIndex].indexCond[i].getLeftNode() .getDataType(); if (targetType != valueType) { range = targetType.compareToTypeRange(value); if (range == 0) { if (targetType.typeComparisonGroup != valueType.typeComparisonGroup) { value = targetType.convertToType(session, value, valueType); } } } if (i == 0) { int exprType = conditions[condIndex].indexCond[0].getType(); if (range < 0) { switch (exprType) { case OpTypes.GREATER_EQUAL : case OpTypes.GREATER : value = null; break; default : it = conditions[condIndex].rangeIndex .emptyIterator(); return; } } else if (range > 0) { switch (exprType) { case OpTypes.NOT : value = null; break; default : it = conditions[condIndex].rangeIndex .emptyIterator(); return; } } } currentJoinData[i] = value; } it = conditions[condIndex].rangeIndex.findFirstRow(session, store, currentJoinData, conditions[condIndex].indexedColumnCount, rangeVar.indexDistinctCount, conditions[condIndex].opType, conditions[condIndex].reversed, null); } /** * Advances to the next available value.

* * @return true if a next value is available upon exit */ private boolean findNext() { boolean result = false; while (true) { currentRow = it.getNextRow(); if (currentRow == null) { break; } currentData = currentRow.getData(); if (conditions[condIndex].terminalCondition != null && !conditions[condIndex].terminalCondition .testCondition(session)) { break; } if (conditions[condIndex].indexEndCondition != null && !conditions[condIndex].indexEndCondition .testCondition(session)) { if (!conditions[condIndex].isJoin) { hasLeftOuterRow = false; } break; } if (joinConditions[condIndex].nonIndexCondition != null && !joinConditions[condIndex].nonIndexCondition .testCondition(session)) { continue; } if (whereConditions[condIndex].nonIndexCondition != null && !whereConditions[condIndex].nonIndexCondition .testCondition(session)) { hasLeftOuterRow = false; addFoundRow(); continue; } Expression e = conditions[condIndex].excludeConditions; if (e != null && e.testCondition(session)) { continue; } addFoundRow(); hasLeftOuterRow = false; return true; } it.release(); currentRow = null; currentData = rangeVar.emptyData; if (hasLeftOuterRow && condIndex == conditions.length - 1) { result = (whereConditions[condIndex].nonIndexCondition == null || whereConditions[condIndex].nonIndexCondition .testCondition(session)); hasLeftOuterRow = false; } return result; } private void addFoundRow() { if (rangeVar.isRightJoin) { lookup.add(currentRow.getPos()); } } } public static class RangeIteratorRight extends RangeIteratorMain { private RangeIteratorRight(Session session, RangeVariable rangeVar, RangeIteratorMain main) { super(session, rangeVar); isFullIterator = true; } boolean isOnRightOuterRows; public void setOnOuterRows() { conditions = rangeVar.whereConditions; isOnRightOuterRows = true; hasLeftOuterRow = false; condIndex = 0; initialiseIterator(); } public boolean next() { if (isOnRightOuterRows) { if (it == null) { return false; } return findNextRight(); } else { return super.next(); } } private boolean findNextRight() { boolean result = false; while (true) { currentRow = it.getNextRow(); if (currentRow == null) { break; } currentData = currentRow.getData(); if (conditions[condIndex].indexEndCondition != null && !conditions[condIndex].indexEndCondition .testCondition(session)) { break; } if (conditions[condIndex].nonIndexCondition != null && !conditions[condIndex].nonIndexCondition .testCondition(session)) { continue; } if (!lookupAndTest()) { continue; } result = true; break; } if (result) { return true; } it.release(); currentRow = null; currentData = rangeVar.emptyData; return result; } private boolean lookupAndTest() { boolean result = !lookup.contains(currentRow.getPos()); if (result) { currentData = currentRow.getData(); if (conditions[condIndex].nonIndexCondition != null && !conditions[condIndex].nonIndexCondition .testCondition(session)) { result = false; } } return result; } } public static class RangeIteratorJoined extends RangeIteratorBase { RangeIteratorMain[] rangeIterators; int currentIndex = 0; public RangeIteratorJoined(RangeIteratorMain[] rangeIterators) { this.rangeIterators = rangeIterators; isBeforeFirst = true; } public boolean isBeforeFirst() { return isBeforeFirst; } public boolean next() { while (currentIndex >= 0) { RangeIteratorMain it = rangeIterators[currentIndex]; if (it.next()) { if (currentIndex < rangeIterators.length - 1) { currentIndex++; continue; } currentRow = rangeIterators[currentIndex].currentRow; currentData = currentRow.getData(); return true; } else { it.reset(); currentIndex--; continue; } } currentData = rangeIterators[rangeIterators.length - 1].rangeVar.emptyData; currentRow = null; for (int i = 0; i < rangeIterators.length; i++) { rangeIterators[i].reset(); } return false; } public void remove() {} public void release() { if (it != null) { it.release(); } for (int i = 0; i < rangeIterators.length; i++) { rangeIterators[i].reset(); } } public void reset() { super.reset(); for (int i = 0; i < rangeIterators.length; i++) { rangeIterators[i].reset(); } } public int getRangePosition() { return 0; } } public static class RangeVariableConditions { final RangeVariable rangeVar; Expression[] indexCond; Expression[] indexEndCond; int[] opTypes; int[] opTypesEnd; Expression indexEndCondition; int indexedColumnCount; Index rangeIndex; final boolean isJoin; Expression excludeConditions; Expression nonIndexCondition; Expression terminalCondition; int opType; int opTypeEnd; boolean isFalse; boolean reversed; boolean hasIndex; RangeVariableConditions(RangeVariable rangeVar, boolean isJoin) { this.rangeVar = rangeVar; this.isJoin = isJoin; } RangeVariableConditions(RangeVariableConditions base) { this.rangeVar = base.rangeVar; this.isJoin = base.isJoin; nonIndexCondition = base.nonIndexCondition; } boolean hasIndexCondition() { return indexedColumnCount > 0; } boolean hasIndex() { return hasIndex; } void addCondition(Expression e) { if (e == null) { return; } if (e instanceof ExpressionLogical) { if (((ExpressionLogical) e).isTerminal) { terminalCondition = e; } } nonIndexCondition = ExpressionLogical.andExpressions(nonIndexCondition, e); if (Expression.EXPR_FALSE.equals(nonIndexCondition)) { isFalse = true; } if (rangeIndex == null || rangeIndex.getColumnCount() == 0) { return; } if (indexedColumnCount == 0) { return; } if (e.getIndexableExpression(rangeVar) == null) { return; } int colIndex = e.getLeftNode().getColumnIndex(); int[] indexCols = rangeIndex.getColumns(); switch (e.getType()) { case OpTypes.GREATER : case OpTypes.GREATER_EQUAL : { // replaces existing condition if (opType == OpTypes.NOT) { if (indexCols[indexedColumnCount - 1] == colIndex) { nonIndexCondition = ExpressionLogical.andExpressions( nonIndexCondition, indexCond[indexedColumnCount - 1]); indexCond[indexedColumnCount - 1] = e; opType = e.opType; opTypes[indexedColumnCount - 1] = e.opType; if (e.exprSubType == OpTypes.LIKE && indexedColumnCount == 1) { indexEndCond[indexedColumnCount - 1] = ExpressionLogical.andExpressions( indexEndCond[indexedColumnCount - 1], e.nodes[2]); } } } else { addToIndexConditions(e); } break; } case OpTypes.SMALLER : case OpTypes.SMALLER_EQUAL : { if (opType == OpTypes.GREATER || opType == OpTypes.GREATER_EQUAL || opType == OpTypes.NOT) { if (opTypeEnd != OpTypes.MAX) { break; } if (indexCols[indexedColumnCount - 1] == colIndex) { indexEndCond[indexedColumnCount - 1] = e; indexEndCondition = ExpressionLogical.andExpressions( indexEndCondition, e); opTypeEnd = e.opType; opTypesEnd[indexedColumnCount - 1] = e.opType; } } else { addToIndexEndConditions(e); } break; } default : } } private boolean addToIndexConditions(Expression e) { if (opType == OpTypes.EQUAL || opType == OpTypes.IS_NULL) { if (indexedColumnCount < rangeIndex.getColumnCount()) { if (rangeIndex.getColumns()[indexedColumnCount] == e.getLeftNode().getColumnIndex()) { indexCond[indexedColumnCount] = e; opType = e.opType; opTypes[indexedColumnCount] = e.opType; opTypeEnd = OpTypes.MAX; opTypesEnd[indexedColumnCount] = OpTypes.MAX; indexedColumnCount++; return true; } } } return false; } private boolean addToIndexEndConditions(Expression e) { if (opType == OpTypes.EQUAL || opType == OpTypes.IS_NULL) { if (indexedColumnCount < rangeIndex.getColumnCount()) { if (rangeIndex.getColumns()[indexedColumnCount] == e.getLeftNode().getColumnIndex()) { Expression condition = ExpressionLogical.newNotNullCondition( e.getLeftNode()); indexCond[indexedColumnCount] = condition; indexEndCond[indexedColumnCount] = e; indexEndCondition = ExpressionLogical.andExpressions(indexEndCondition, e); opType = OpTypes.NOT; opTypes[indexedColumnCount] = OpTypes.NOT; opTypeEnd = e.opType; opTypesEnd[indexedColumnCount] = e.opType; indexedColumnCount++; return true; } } } return false; } /** * * @param exprList list of expressions * @param index Index to use * @param colCount number of columns searched */ public void addIndexCondition(Expression[] exprList, Index index, int colCount) { int indexColCount = index.getColumnCount(); rangeIndex = index; indexCond = new Expression[indexColCount]; indexEndCond = new Expression[indexColCount]; opTypes = new int[indexColCount]; opTypesEnd = new int[indexColCount]; opType = exprList[0].opType; opTypes[0] = exprList[0].opType; switch (opType) { case OpTypes.NOT : indexCond = exprList; opTypeEnd = OpTypes.MAX; opTypesEnd[0] = OpTypes.MAX; break; case OpTypes.GREATER : case OpTypes.GREATER_EQUAL : indexCond = exprList; if (exprList[0].exprSubType == OpTypes.LIKE) { indexEndCond[0] = indexEndCondition = exprList[0].nodes[2]; } opTypeEnd = OpTypes.MAX; opTypesEnd[0] = OpTypes.MAX; break; case OpTypes.SMALLER : case OpTypes.SMALLER_EQUAL : { Expression e = exprList[0].getLeftNode(); e = new ExpressionLogical(OpTypes.IS_NULL, e); e = new ExpressionLogical(OpTypes.NOT, e); indexCond[0] = e; indexEndCond[0] = indexEndCondition = exprList[0]; opTypeEnd = opType; opTypesEnd[0] = opType; opType = OpTypes.NOT; opTypes[0] = OpTypes.NOT; break; } case OpTypes.IS_NULL : case OpTypes.EQUAL : { indexCond = exprList; for (int i = 0; i < colCount; i++) { Expression e = exprList[i]; indexEndCond[i] = e; indexEndCondition = ExpressionLogical.andExpressions(indexEndCondition, e); opType = e.opType; opTypes[0] = e.opType; } opTypeEnd = opType; break; } default : Error.runtimeError(ErrorCode.U_S0500, "RangeVariable"); } indexedColumnCount = colCount; hasIndex = true; } public void reverseIndexCondition() { if (opType == OpTypes.EQUAL || opType == OpTypes.IS_NULL) { return; } indexEndCondition = null; for (int i = 0; i < indexedColumnCount; i++) { Expression e = indexCond[i]; indexCond[i] = indexEndCond[i]; indexEndCond[i] = e; indexEndCondition = ExpressionLogical.andExpressions(indexEndCondition, e); } opType = opTypeEnd; reversed = true; } String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(); StringBuffer b = new StringBuffer(blanks); for (int i = 0; i < blanks; i++) { b.append(' '); } sb.append("index=").append(rangeIndex.getName().name).append("\n"); if (hasIndexCondition()) { if (indexedColumnCount > 0) { sb.append(b).append("start conditions=["); for (int j = 0; j < indexedColumnCount; j++) { if (indexCond != null && indexCond[j] != null) { sb.append(indexCond[j].describe(session, blanks)); } } sb.append("]\n"); } if (indexEndCondition != null) { String temp = indexEndCondition.describe(session, blanks); sb.append(b).append("end condition=[").append(temp).append( "]\n"); } } if (nonIndexCondition != null) { String temp = nonIndexCondition.describe(session, blanks); sb.append(b).append("other condition=[").append(temp).append( "]\n"); } return sb.toString(); } public void replaceColumnReferences(RangeVariable range, Expression[] list) { if (indexCond != null) { for (int i = 0; i < indexCond.length; i++) { if (indexCond[i] != null) { indexCond[i] = indexCond[i].replaceColumnReferences(range, list); } } } if (indexEndCond != null) { for (int i = 0; i < indexEndCond.length; i++) { if (indexEndCond[i] != null) { indexEndCond[i] = indexEndCond[i].replaceColumnReferences(range, list); } } } if (indexEndCondition != null) { indexEndCondition = indexEndCondition.replaceColumnReferences(range, list); } if (excludeConditions != null) { excludeConditions = excludeConditions.replaceColumnReferences(range, list); } if (nonIndexCondition != null) { nonIndexCondition = nonIndexCondition.replaceColumnReferences(range, list); } if (terminalCondition != null) { terminalCondition = terminalCondition.replaceColumnReferences(range, list); } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Trigger.java0000644000175000017500000001106512007547362021215 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; // fredt@users 20030727 - signature altered to support update triggers /* Contents of row1[] and row2[] in each type of trigger. AFTER INSERT - row1[] contains single String object = "Statement-level". AFTER UPDATE - row1[] contains single String object = "Statement-level". AFTER DELETE - row1[] contains single String object = "Statement-level". BEFORE INSERT FOR EACH ROW - row2[] contains data about to be inserted and this can be modified within the trigger such that modified data gets written to the database. AFTER INSERT FOR EACH ROW - row2[] contains data just inserted into the table. BEFORE UPDATE FOR EACH ROW - row1[] contains currently stored data and not the data that is about to be updated. - row2[] contains the data that is about to be updated. AFTER UPDATE FOR EACH ROW - row1[] contains old stored data. - row2[] contains the new data. BEFORE DELETE FOR EACH ROW - row1[] contains row data about to be deleted. AFTER DELETE FOR EACH ROW - row1[] contains row data that has been deleted. List compiled by Andrew Knight (quozzbat@users) */ /** * The interface an HSQLDB TRIGGER must implement. The user-supplied class that * implements this must have a default constructor. * * @author Peter Hudson (peterhudson@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.0 */ public interface Trigger { // type of trigger int INSERT_AFTER = 0; int DELETE_AFTER = 1; int UPDATE_AFTER = 2; int INSERT_AFTER_ROW = 3; int DELETE_AFTER_ROW = 4; int UPDATE_AFTER_ROW = 5; int INSERT_BEFORE_ROW = 6; int DELETE_BEFORE_ROW = 7; int UPDATE_BEFORE_ROW = 8; /** * The method invoked upon each triggered action. * *

type contains the integer index id for trigger type, e.g. * TriggerDef.INSERT_AFTER * *

For all triggers defined as default FOR EACH STATEMENT both * oldRow and newRow are null. * *

For triggers defined as FOR EACH ROW, the following will apply: * *

When UPDATE triggers are fired, oldRow contains the existing values * of the table row and newRow contains the new values. * *

For INSERT triggers, oldRow is null and newRow contains the table row * to be inserted. For DELETE triggers, newRow is null and oldRow contains * the table row to be deleted. * *

For error conditions, users can construct an HsqlException using one * of the static methods of org.hsqldb.error.Error with a predefined * SQL State from org.hsqldb.error.ErrorCode. * * @param type the type as one of the int values defined in the interface * @param trigName the name of the trigger * @param tabName the name of the table upon which the triggered action is * occuring * @param oldRow the old row * @param newRow the new row * @throws HsqlException */ void fire(int type, String trigName, String tabName, Object[] oldRow, Object[] newRow) throws HsqlException; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ParserDDL.java0000644000175000017500000047112212007547414021374 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.lang.reflect.Method; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.HsqlNameManager.SimpleName; import org.hsqldb.RangeGroup.RangeGroupSimple; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.HsqlList; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.OrderedIntHashSet; import org.hsqldb.rights.Grantee; import org.hsqldb.rights.GranteeManager; import org.hsqldb.rights.Right; import org.hsqldb.rights.User; import org.hsqldb.store.ValuePool; import org.hsqldb.types.Charset; import org.hsqldb.types.Collation; import org.hsqldb.types.Type; import org.hsqldb.types.UserTypeModifier; /** * Parser for DDL statements * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class ParserDDL extends ParserRoutine { static final int[] schemaCommands = new int[] { Tokens.CREATE, Tokens.GRANT }; static final short[] startStatementTokens = new short[] { Tokens.CREATE, Tokens.GRANT, Tokens.ALTER, Tokens.DROP }; static final short[] startStatementTokensSchema = new short[] { Tokens.CREATE, Tokens.GRANT, }; ParserDDL(Session session, Scanner scanner) { super(session, scanner); } void reset(String sql) { super.reset(sql); } StatementSchema compileCreate() { int tableType = TableBase.MEMORY_TABLE; boolean isTable = false; boolean isOrReplace = false; read(); switch (token.tokenType) { case Tokens.GLOBAL : read(); readThis(Tokens.TEMPORARY); readIfThis(Tokens.MEMORY); readThis(Tokens.TABLE); isTable = true; tableType = TableBase.TEMP_TABLE; break; case Tokens.TEMP : read(); readThis(Tokens.TABLE); isTable = true; tableType = TableBase.TEMP_TABLE; break; case Tokens.TEMPORARY : read(); readThis(Tokens.TABLE); isTable = true; tableType = TableBase.TEMP_TABLE; break; case Tokens.MEMORY : read(); readThis(Tokens.TABLE); isTable = true; break; case Tokens.CACHED : read(); readThis(Tokens.TABLE); isTable = true; tableType = TableBase.CACHED_TABLE; break; case Tokens.TEXT : read(); readThis(Tokens.TABLE); isTable = true; tableType = TableBase.TEXT_TABLE; break; case Tokens.TABLE : read(); isTable = true; tableType = database.schemaManager.getDefaultTableType(); break; case Tokens.OR : if (database.sqlSyntaxOra) { read(); readThis(Tokens.REPLACE); switch (token.tokenType) { case Tokens.FUNCTION : case Tokens.PROCEDURE : case Tokens.TRIGGER : case Tokens.TYPE : case Tokens.VIEW : break; default : throw unexpectedToken(Tokens.T_OR); } isOrReplace = true; } default : } if (isTable) { return compileCreateTable(tableType); } switch (token.tokenType) { // other objects case Tokens.ALIAS : return compileCreateAlias(); case Tokens.SEQUENCE : return compileCreateSequence(); case Tokens.SCHEMA : return compileCreateSchema(); case Tokens.TRIGGER : return compileCreateTrigger(isOrReplace); case Tokens.USER : return compileCreateUser(); case Tokens.ROLE : return compileCreateRole(); case Tokens.VIEW : return compileCreateView(false, isOrReplace); case Tokens.DOMAIN : return compileCreateDomain(); case Tokens.TYPE : return compileCreateType(isOrReplace); case Tokens.CHARACTER : return compileCreateCharacterSet(); case Tokens.COLLATION : return compileCreateCollation(); // index case Tokens.UNIQUE : read(); checkIsThis(Tokens.INDEX); return compileCreateIndex(true); case Tokens.INDEX : return compileCreateIndex(false); case Tokens.AGGREGATE : case Tokens.FUNCTION : case Tokens.PROCEDURE : return compileCreateProcedureOrFunction(isOrReplace); default : { throw unexpectedToken(); } } } Statement compileAlter() { read(); switch (token.tokenType) { case Tokens.INDEX : { read(); HsqlName name = readNewSchemaObjectName(SchemaObject.INDEX, true); name.setSchemaIfNull(session.getCurrentSchemaHsqlName()); if (token.tokenType == Tokens.RENAME) { read(); readThis(Tokens.TO); return compileRenameObject(name, SchemaObject.INDEX); } readThis(Tokens.AS); Index index = (Index) database.schemaManager.getSchemaObject(name); if (index == null) { throw Error.error(ErrorCode.X_42501); } Table table = (Table) database.schemaManager.getSchemaObject( index.getName().parent); int[] indexColumns = readColumnList(table, true); String sql = getLastPart(); Object[] args = new Object[] { table, indexColumns, index.getName() }; HsqlName[] writeLockNames = new HsqlName[] { database.getCatalogName(), table.getName() }; return new StatementSchema(sql, StatementTypes.ALTER_INDEX, args, null, writeLockNames); } case Tokens.SCHEMA : { read(); HsqlName name = readSchemaName(); readThis(Tokens.RENAME); readThis(Tokens.TO); return compileRenameObject(name, SchemaObject.SCHEMA); } case Tokens.CATALOG : { read(); checkIsSimpleName(); String name = token.tokenString; checkValidCatalogName(name); read(); readThis(Tokens.RENAME); readThis(Tokens.TO); return compileRenameObject(database.getCatalogName(), SchemaObject.CATALOG); } case Tokens.SEQUENCE : { return compileAlterSequence(); } case Tokens.TABLE : { return compileAlterTable(); } case Tokens.USER : { return compileAlterUser(); } case Tokens.DOMAIN : { return compileAlterDomain(); } case Tokens.VIEW : { return compileCreateView(true, false); } case Tokens.SESSION : { return compileAlterSession(); } case Tokens.SPECIFIC : { return compileAlterSpecificRoutine(); } case Tokens.ROUTINE : { return compileAlterRoutine(); } default : { throw unexpectedToken(); } } } Statement compileAlterRoutine() { readThis(Tokens.ROUTINE); RoutineSchema routine = (RoutineSchema) readSchemaObjectName(SchemaObject.ROUTINE); readThis(Tokens.RENAME); readThis(Tokens.TO); return compileRenameObject(routine.getName(), routine.getName().type); } Statement compileDrop() { int objectTokenType; int objectType; int statementType; boolean canCascade = false; boolean cascade = false; boolean useIfExists = false; boolean ifExists = false; SchemaObject object; HsqlName[] writeLockNames; read(); objectTokenType = this.token.tokenType; switch (objectTokenType) { case Tokens.INDEX : { read(); statementType = StatementTypes.DROP_INDEX; objectType = SchemaObject.INDEX; useIfExists = true; break; } case Tokens.ASSERTION : { read(); statementType = StatementTypes.DROP_ASSERTION; objectType = SchemaObject.ASSERTION; canCascade = true; break; } case Tokens.SPECIFIC : { read(); switch (token.tokenType) { case Tokens.ROUTINE : case Tokens.PROCEDURE : case Tokens.FUNCTION : read(); break; default : throw unexpectedToken(); } statementType = StatementTypes.DROP_ROUTINE; objectType = SchemaObject.SPECIFIC_ROUTINE; canCascade = true; useIfExists = true; break; } case Tokens.PROCEDURE : { read(); statementType = StatementTypes.DROP_ROUTINE; objectType = SchemaObject.PROCEDURE; canCascade = true; useIfExists = true; break; } case Tokens.FUNCTION : { read(); statementType = StatementTypes.DROP_ROUTINE; objectType = SchemaObject.FUNCTION; canCascade = true; useIfExists = true; break; } case Tokens.SCHEMA : { read(); statementType = StatementTypes.DROP_SCHEMA; objectType = SchemaObject.SCHEMA; canCascade = true; useIfExists = true; break; } case Tokens.SEQUENCE : { read(); statementType = StatementTypes.DROP_SEQUENCE; objectType = SchemaObject.SEQUENCE; canCascade = true; useIfExists = true; break; } case Tokens.TRIGGER : { read(); statementType = StatementTypes.DROP_TRIGGER; objectType = SchemaObject.TRIGGER; canCascade = false; useIfExists = true; break; } case Tokens.USER : { read(); statementType = StatementTypes.DROP_USER; objectType = SchemaObject.GRANTEE; canCascade = true; break; } case Tokens.ROLE : { read(); statementType = StatementTypes.DROP_ROLE; objectType = SchemaObject.GRANTEE; canCascade = true; break; } case Tokens.DOMAIN : read(); statementType = StatementTypes.DROP_DOMAIN; objectType = SchemaObject.DOMAIN; canCascade = true; useIfExists = true; break; case Tokens.TYPE : read(); statementType = StatementTypes.DROP_TYPE; objectType = SchemaObject.TYPE; canCascade = true; useIfExists = true; break; case Tokens.CHARACTER : read(); readThis(Tokens.SET); statementType = StatementTypes.DROP_CHARACTER_SET; objectType = SchemaObject.CHARSET; canCascade = false; useIfExists = true; break; case Tokens.COLLATION : read(); statementType = StatementTypes.DROP_COLLATION; objectType = SchemaObject.COLLATION; canCascade = false; useIfExists = true; break; case Tokens.VIEW : read(); statementType = StatementTypes.DROP_VIEW; objectType = SchemaObject.VIEW; canCascade = true; useIfExists = true; break; case Tokens.TABLE : read(); statementType = StatementTypes.DROP_TABLE; objectType = SchemaObject.TABLE; canCascade = true; useIfExists = true; break; default : throw unexpectedToken(); } if (useIfExists && token.tokenType == Tokens.IF) { int position = getPosition(); read(); if (token.tokenType == Tokens.EXISTS) { read(); ifExists = true; } else { rewind(position); } } checkIsIdentifier(); HsqlName name = null; switch (objectTokenType) { case Tokens.USER : { checkIsSimpleName(); checkDatabaseUpdateAuthorisation(); object = database.getUserManager().get(token.tokenString); read(); break; } case Tokens.ROLE : { checkIsSimpleName(); checkDatabaseUpdateAuthorisation(); object = database.getGranteeManager().getRole(token.tokenString); read(); break; } case Tokens.SCHEMA : { name = readNewSchemaName(); object = database.schemaManager.findSchema(name.name); break; } case Tokens.TABLE : { boolean isModule = token.namePrePrefix == null && (Tokens.T_MODULE.equals(token.namePrefix) || Tokens.T_SESSION.equals(token.namePrefix)); if (isModule) { name = readNewSchemaObjectName(objectType, false); Object[] args = new Object[] { name, Boolean.valueOf(ifExists) }; return new StatementSession(StatementTypes.DROP_TABLE, args); } } // fall through default : name = readNewSchemaObjectName(objectType, false); name.setSchemaIfNull(session.getCurrentSchemaHsqlName()); object = database.schemaManager.findSchemaObject(name.name, name.schema.name, name.type); } if (!ifExists && useIfExists && token.tokenType == Tokens.IF) { read(); readThis(Tokens.EXISTS); ifExists = true; } if (canCascade) { if (token.tokenType == Tokens.CASCADE) { cascade = true; read(); } else if (token.tokenType == Tokens.RESTRICT) { read(); } } if (object == null) { writeLockNames = database.schemaManager.getCatalogNameArray(); } else { name = object.getName(); writeLockNames = database.schemaManager.getCatalogAndBaseTableNames(name); } String sql = getLastPart(); Object[] args = new Object[] { name, new Integer(objectType), Boolean.valueOf(cascade), Boolean.valueOf(ifExists) }; Statement cs = new StatementSchema(sql, statementType, args, null, writeLockNames); return cs; } Statement compileAlterTable() { read(); String tableName = token.tokenString; HsqlName schema = session.getSchemaHsqlName(token.namePrefix); checkSchemaUpdateAuthorisation(schema); Table t = database.schemaManager.getUserTable(session, tableName, schema.name); read(); switch (token.tokenType) { case Tokens.RENAME : { read(); readThis(Tokens.TO); return compileRenameObject(t.getName(), SchemaObject.TABLE); } case Tokens.ADD : { read(); HsqlName cname = null; if (token.tokenType == Tokens.CONSTRAINT) { read(); cname = readNewDependentSchemaObjectName(t.getName(), SchemaObject.CONSTRAINT); } switch (token.tokenType) { case Tokens.FOREIGN : read(); readThis(Tokens.KEY); return compileAlterTableAddForeignKeyConstraint(t, cname); case Tokens.UNIQUE : read(); return compileAlterTableAddUniqueConstraint(t, cname); case Tokens.CHECK : read(); return compileAlterTableAddCheckConstraint(t, cname); case Tokens.PRIMARY : read(); readThis(Tokens.KEY); return compileAlterTableAddPrimaryKey(t, cname); case Tokens.COLUMN : if (cname != null) { throw unexpectedToken(); } read(); checkIsSimpleName(); return compileAlterTableAddColumn(t); default : if (cname != null) { throw unexpectedToken(); } checkIsSimpleName(); return compileAlterTableAddColumn(t); } } case Tokens.DROP : { read(); switch (token.tokenType) { case Tokens.PRIMARY : { boolean cascade = false; read(); readThis(Tokens.KEY); return compileAlterTableDropPrimaryKey(t); } case Tokens.CONSTRAINT : { read(); return compileAlterTableDropConstraint(t); } case Tokens.COLUMN : read(); // fall through default : { checkIsSimpleName(); String name = token.tokenString; boolean cascade = false; read(); if (token.tokenType == Tokens.RESTRICT) { read(); } else if (token.tokenType == Tokens.CASCADE) { read(); cascade = true; } return compileAlterTableDropColumn(t, name, cascade); } } } case Tokens.ALTER : { read(); if (token.tokenType == Tokens.COLUMN) { read(); } int columnIndex = t.getColumnIndex(token.tokenString); ColumnSchema column = t.getColumn(columnIndex); read(); return compileAlterColumn(t, column, columnIndex); } default : { throw unexpectedToken(); } } } private Statement compileAlterTableDropConstraint(Table table) { boolean cascade = false; SchemaObject object = readSchemaObjectName(table.getSchemaName(), SchemaObject.CONSTRAINT); if (token.tokenType == Tokens.RESTRICT) { read(); } else if (token.tokenType == Tokens.CASCADE) { read(); cascade = true; } String sql = getLastPart(); Object[] args = new Object[] { object.getName(), ValuePool.getInt(SchemaObject.CONSTRAINT), Boolean.valueOf(cascade), Boolean.valueOf(false) }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( table.getName()); HsqlName mainTableName = ((Constraint) object).getMainTableName(); if (mainTableName != null && mainTableName != table.getName()) { writeLockNames = (HsqlName[]) ArrayUtil.toAdjustedArray(writeLockNames, mainTableName, writeLockNames.length, 1); } Statement cs = new StatementSchema(sql, StatementTypes.DROP_CONSTRAINT, args, null, writeLockNames); return cs; } private Statement compileAlterTableDropPrimaryKey(Table table) { boolean cascade = false; if (token.tokenType == Tokens.RESTRICT) { read(); } else if (token.tokenType == Tokens.CASCADE) { read(); cascade = true; } if (!table.hasPrimaryKey()) { throw Error.error(ErrorCode.X_42501); } String sql = getLastPart(); SchemaObject object = table.getPrimaryConstraint(); Object[] args = new Object[] { object.getName(), ValuePool.getInt(SchemaObject.CONSTRAINT), Boolean.valueOf(cascade), Boolean.valueOf(false) }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( table.getName()); Statement cs = new StatementSchema(sql, StatementTypes.DROP_CONSTRAINT, args, null, writeLockNames); return cs; } StatementSession compileDeclareLocalTableOrNull() { int position = super.getPosition(); try { readThis(Tokens.DECLARE); readThis(Tokens.LOCAL); readThis(Tokens.TEMPORARY); readThis(Tokens.TABLE); } catch (HsqlException e) { lastError = e; // may be cursor rewind(position); return null; } if (token.namePrePrefix == null && (token.namePrefix == null || Tokens.T_MODULE.equals(token.namePrefix) || Tokens.T_SESSION.equals(token.namePrefix))) { // valid name } else { throw unexpectedToken(); } HsqlName name = readNewSchemaObjectName(SchemaObject.TABLE, false); name.schema = SqlInvariants.MODULE_HSQLNAME; Table table = new Table(database, name, TableBase.TEMP_TABLE); StatementSchema cs = compileCreateTableBody(table, false); HsqlArrayList constraints = (HsqlArrayList) cs.arguments[1]; for (int i = 0; i < constraints.size(); i++) { Constraint c = (Constraint) constraints.get(i); if (c.getConstraintType() == SchemaObject.ConstraintTypes.FOREIGN_KEY) { throw unexpectedToken(Tokens.T_FOREIGN); } } StatementSession ss = new StatementSession(StatementTypes.DECLARE_SESSION_TABLE, cs.arguments); return ss; } StatementSchema compileCreateTable(int type) { boolean ifNot = false; if (token.tokenType == Tokens.IF) { int position = getPosition(); read(); if (token.tokenType == Tokens.NOT) { read(); readThis(Tokens.EXISTS); ifNot = true; } else { rewind(position); } } HsqlName name = readNewSchemaObjectName(SchemaObject.TABLE, false); name.setSchemaIfNull(session.getCurrentSchemaHsqlName()); Table table; switch (type) { case TableBase.TEMP_TEXT_TABLE : case TableBase.TEXT_TABLE : { table = new TextTable(database, name, type); break; } default : { table = new Table(database, name, type); } } return compileCreateTableBody(table, ifNot); } StatementSchema compileCreateTableBody(Table table, boolean ifNot) { HsqlArrayList tempConstraints = new HsqlArrayList(); if (token.tokenType == Tokens.AS) { return readTableAsSubqueryDefinition(table); } int position = getPosition(); readThis(Tokens.OPENBRACKET); { Constraint c = new Constraint(null, null, SchemaObject.ConstraintTypes.TEMP); tempConstraints.add(c); } boolean start = true; boolean startPart = true; boolean end = false; while (!end) { switch (token.tokenType) { case Tokens.LIKE : { ColumnSchema[] likeColumns = readLikeTable(table); for (int i = 0; i < likeColumns.length; i++) { table.addColumn(likeColumns[i]); } start = false; startPart = false; break; } case Tokens.CONSTRAINT : case Tokens.PRIMARY : case Tokens.FOREIGN : case Tokens.UNIQUE : case Tokens.CHECK : if (!startPart) { throw unexpectedToken(); } readConstraint(table, tempConstraints); start = false; startPart = false; break; case Tokens.COMMA : if (startPart) { throw unexpectedToken(); } read(); startPart = true; break; case Tokens.CLOSEBRACKET : read(); end = true; break; default : if (!startPart) { throw unexpectedToken(); } checkIsSchemaObjectName(); HsqlName hsqlName = database.nameManager.newColumnHsqlName(table.getName(), token.tokenString, isDelimitedIdentifier()); read(); ColumnSchema newcolumn = readColumnDefinitionOrNull(table, hsqlName, tempConstraints); if (newcolumn == null) { if (start) { rewind(position); return readTableAsSubqueryDefinition(table); } else { throw Error.error(ErrorCode.X_42000); } } table.addColumn(newcolumn); start = false; startPart = false; } } if (token.tokenType == Tokens.ON) { if (!table.isTemp()) { throw unexpectedToken(); } read(); readThis(Tokens.COMMIT); if (token.tokenType == Tokens.DELETE) {} else if (token.tokenType == Tokens.PRESERVE) { table.persistenceScope = TableBase.SCOPE_SESSION; } read(); readThis(Tokens.ROWS); } OrderedHashSet names = new OrderedHashSet(); names.add(database.getCatalogName()); for (int i = 0; i < tempConstraints.size(); i++) { Constraint c = (Constraint) tempConstraints.get(i); HsqlName name = c.getMainTableName(); if (name != null) { Table t = database.schemaManager.findUserTable(null, name.name, name.schema.name); if (t != null && !t.isTemp()) { names.add(table.getName()); } } } String sql = getLastPart(); Object[] args = new Object[] { table, tempConstraints, null, Boolean.valueOf(ifNot) }; HsqlName[] writeLockNames = new HsqlName[names.size()]; names.toArray(writeLockNames); return new StatementSchema(sql, StatementTypes.CREATE_TABLE, args, null, writeLockNames); } private ColumnSchema[] readLikeTable(Table table) { read(); boolean generated = false; boolean identity = false; boolean defaults = false; Table likeTable = readTableName(); OrderedIntHashSet set = new OrderedIntHashSet(); while (true) { boolean including = token.tokenType == Tokens.INCLUDING; if (!including && token.tokenType != Tokens.EXCLUDING) { break; } read(); switch (token.tokenType) { case Tokens.GENERATED : if (!set.add(token.tokenType)) { throw unexpectedToken(); } generated = including; break; case Tokens.IDENTITY : if (!set.add(token.tokenType)) { throw unexpectedToken(); } identity = including; break; case Tokens.DEFAULTS : if (!set.add(token.tokenType)) { throw unexpectedToken(); } defaults = including; break; default : throw unexpectedToken(); } read(); } ColumnSchema[] columnList = new ColumnSchema[likeTable.getColumnCount()]; for (int i = 0; i < columnList.length; i++) { ColumnSchema column = likeTable.getColumn(i).duplicate(); HsqlName name = database.nameManager.newColumnSchemaHsqlName(table.getName(), column.getName()); column.setName(name); column.setNullable(true); column.setPrimaryKey(false); if (identity) { if (column.isIdentity()) { column.setIdentity( column.getIdentitySequence().duplicate()); } } else { column.setIdentity(null); } if (!defaults) { column.setDefaultExpression(null); } if (!generated) { column.setGeneratingExpression(null); } columnList[i] = column; } return columnList; } StatementSchema readTableAsSubqueryDefinition(Table table) { HsqlName[] readName = null; boolean withData = true; HsqlName[] columnNames = null; Statement statement = null; if (token.tokenType == Tokens.OPENBRACKET) { columnNames = readColumnNames(table.getName()); } readThis(Tokens.AS); readThis(Tokens.OPENBRACKET); QueryExpression queryExpression = XreadQueryExpression(); queryExpression.setReturningResult(); queryExpression.resolve(session); readThis(Tokens.CLOSEBRACKET); readThis(Tokens.WITH); if (token.tokenType == Tokens.NO) { read(); withData = false; } else if (table.getTableType() == TableBase.TEXT_TABLE) { throw unexpectedTokenRequire(Tokens.T_NO); } readThis(Tokens.DATA); if (token.tokenType == Tokens.ON) { if (!table.isTemp()) { throw unexpectedToken(); } read(); readThis(Tokens.COMMIT); if (token.tokenType == Tokens.DELETE) {} else if (token.tokenType == Tokens.PRESERVE) { table.persistenceScope = TableBase.SCOPE_SESSION; } read(); readThis(Tokens.ROWS); } if (columnNames == null) { columnNames = queryExpression.getResultColumnNames(); } else { if (columnNames.length != queryExpression.getColumnCount()) { throw Error.error(ErrorCode.X_42593); } } TableUtil.setColumnsInSchemaTable(table, columnNames, queryExpression.getColumnTypes()); table.createPrimaryKey(); if (table.isTemp() && table.hasLobColumn()) { throw Error.error(ErrorCode.X_42534); } if (withData) { statement = new StatementQuery(session, queryExpression, compileContext); readName = statement.getTableNamesForRead(); } Object[] args = new Object[] { table, new HsqlArrayList(), statement, Boolean.FALSE }; String sql = getLastPart(); HsqlName[] writeLockNames = database.schemaManager.catalogNameArray; StatementSchema st = new StatementSchema(sql, StatementTypes.CREATE_TABLE, args, readName, writeLockNames); return st; } /** * Adds a list of temp constraints to a new table */ static Table addTableConstraintDefinitions(Session session, Table table, HsqlArrayList tempConstraints, HsqlArrayList constraintList, boolean addToSchema) { Constraint c = (Constraint) tempConstraints.get(0); String namePart = c.getName() == null ? null : c.getName().name; HsqlName indexName = session.database.nameManager.newAutoName("IDX", namePart, table.getSchemaName(), table.getName(), SchemaObject.INDEX); c.setColumnsIndexes(table); table.createPrimaryKey(indexName, c.core.mainCols, true); if (c.core.mainCols != null) { Constraint newconstraint = new Constraint(c.getName(), table, table.getPrimaryIndex(), SchemaObject.ConstraintTypes.PRIMARY_KEY); table.addConstraint(newconstraint); if (addToSchema) { session.database.schemaManager.addSchemaObject(newconstraint); } } for (int i = 1; i < tempConstraints.size(); i++) { c = (Constraint) tempConstraints.get(i); switch (c.constType) { case SchemaObject.ConstraintTypes.UNIQUE : { c.setColumnsIndexes(table); if (table.getUniqueConstraintForColumns(c.core.mainCols) != null) { throw Error.error(ErrorCode.X_42522); } // create an autonamed index indexName = session.database.nameManager.newAutoName("IDX", c.getName().name, table.getSchemaName(), table.getName(), SchemaObject.INDEX); Index index = table.createAndAddIndexStructure(indexName, c.core.mainCols, null, null, true, true, false); Constraint newconstraint = new Constraint(c.getName(), table, index, SchemaObject.ConstraintTypes.UNIQUE); table.addConstraint(newconstraint); if (addToSchema) { session.database.schemaManager.addSchemaObject( newconstraint); } break; } case SchemaObject.ConstraintTypes.FOREIGN_KEY : { addForeignKey(session, table, c, constraintList); break; } case SchemaObject.ConstraintTypes.CHECK : { try { c.prepareCheckConstraint(session, table, false); } catch (HsqlException e) { if (session.isProcessingScript()) { break; } throw e; } table.addConstraint(c); if (c.isNotNull()) { ColumnSchema column = table.getColumn(c.notNullColumnIndex); column.setNullable(false); table.setColumnTypeVars(c.notNullColumnIndex); } if (addToSchema) { session.database.schemaManager.addSchemaObject(c); } break; } } } return table; } static void addForeignKey(Session session, Table table, Constraint c, HsqlArrayList constraintList) { HsqlName mainTableName = c.getMainTableName(); if (mainTableName == table.getName()) { c.core.mainTable = table; } else { Table mainTable = session.database.schemaManager.findUserTable(session, mainTableName.name, mainTableName.schema.name); if (mainTable == null) { if (constraintList == null) { throw Error.error(ErrorCode.X_42501, mainTableName.name); } constraintList.add(c); return; } c.core.mainTable = mainTable; } c.setColumnsIndexes(table); TableWorks tableWorks = new TableWorks(session, table); tableWorks.checkCreateForeignKey(c); Constraint uniqueConstraint = c.core.mainTable.getUniqueConstraintForColumns(c.core.mainCols); if (uniqueConstraint == null) { throw Error.error(ErrorCode.X_42523); } Index mainIndex = uniqueConstraint.getMainIndex(); boolean isForward = c.core.mainTable.getSchemaName() != table.getSchemaName(); int offset = session.database.schemaManager.getTableIndex(table); if (offset != -1 && offset < session.database.schemaManager.getTableIndex( c.core.mainTable)) { isForward = true; } HsqlName refIndexName = session.database.nameManager.newAutoName("IDX", table.getSchemaName(), table.getName(), SchemaObject.INDEX); Index index = table.createAndAddIndexStructure(refIndexName, c.core.refCols, null, null, false, true, isForward); HsqlName mainName = session.database.nameManager.newAutoName("REF", c.getName().name, table.getSchemaName(), table.getName(), SchemaObject.INDEX); c.core.uniqueName = uniqueConstraint.getName(); c.core.mainName = mainName; c.core.mainIndex = mainIndex; c.core.refTable = table; c.core.refName = c.getName(); c.core.refIndex = index; c.isForward = isForward; table.addConstraint(c); c.core.mainTable.addConstraint(new Constraint(mainName, c)); session.database.schemaManager.addSchemaObject(c); } private Constraint readFKReferences(Table refTable, HsqlName constraintName, OrderedHashSet refColSet) { HsqlName mainTableName; OrderedHashSet mainColSet = null; readThis(Tokens.REFERENCES); HsqlName schema; if (token.namePrefix == null) { schema = refTable.getSchemaName(); } else { schema = database.schemaManager.getSchemaHsqlName(token.namePrefix); } if (refTable.getSchemaName() == schema && refTable.getName().name.equals(token.tokenString)) { mainTableName = refTable.getName(); read(); } else { mainTableName = readFKTableName(schema); } if (token.tokenType == Tokens.OPENBRACKET) { mainColSet = readColumnNames(false); } int matchType = OpTypes.MATCH_SIMPLE; if (token.tokenType == Tokens.MATCH) { read(); switch (token.tokenType) { case Tokens.SIMPLE : read(); break; case Tokens.PARTIAL : throw super.unsupportedFeature(); case Tokens.FULL : read(); matchType = OpTypes.MATCH_FULL; break; default : throw unexpectedToken(); } } // -- In a while loop we parse a maximium of two // -- "ON" statements following the foreign key // -- definition this can be // -- ON [UPDATE|DELETE] [NO ACTION|RESTRICT|CASCADE|SET [NULL|DEFAULT]] int deleteAction = SchemaObject.ReferentialAction.NO_ACTION; int updateAction = SchemaObject.ReferentialAction.NO_ACTION; OrderedIntHashSet set = new OrderedIntHashSet(); while (token.tokenType == Tokens.ON) { read(); if (!set.add(token.tokenType)) { throw unexpectedToken(); } if (token.tokenType == Tokens.DELETE) { read(); if (token.tokenType == Tokens.SET) { read(); switch (token.tokenType) { case Tokens.DEFAULT : { read(); deleteAction = SchemaObject.ReferentialAction.SET_DEFAULT; break; } case Tokens.NULL : read(); deleteAction = SchemaObject.ReferentialAction.SET_NULL; break; default : throw unexpectedToken(); } } else if (token.tokenType == Tokens.CASCADE) { read(); deleteAction = SchemaObject.ReferentialAction.CASCADE; } else if (token.tokenType == Tokens.RESTRICT) { read(); } else { readThis(Tokens.NO); readThis(Tokens.ACTION); } } else if (token.tokenType == Tokens.UPDATE) { read(); if (token.tokenType == Tokens.SET) { read(); switch (token.tokenType) { case Tokens.DEFAULT : { read(); updateAction = SchemaObject.ReferentialAction.SET_DEFAULT; break; } case Tokens.NULL : read(); updateAction = SchemaObject.ReferentialAction.SET_NULL; break; default : throw unexpectedToken(); } } else if (token.tokenType == Tokens.CASCADE) { read(); updateAction = SchemaObject.ReferentialAction.CASCADE; } else if (token.tokenType == Tokens.RESTRICT) { read(); } else { readThis(Tokens.NO); readThis(Tokens.ACTION); } } else { throw unexpectedToken(); } } if (constraintName == null) { constraintName = database.nameManager.newAutoName("FK", refTable.getSchemaName(), refTable.getName(), SchemaObject.CONSTRAINT); } return new Constraint(constraintName, refTable.getName(), refColSet, mainTableName, mainColSet, SchemaObject.ConstraintTypes.FOREIGN_KEY, deleteAction, updateAction, matchType); } private HsqlName readFKTableName(HsqlName schema) { HsqlName name; checkIsSchemaObjectName(); Table table = database.schemaManager.findUserTable(session, token.tokenString, schema.name); if (table == null) { name = database.nameManager.newHsqlName(schema, token.tokenString, isDelimitedIdentifier(), SchemaObject.TABLE); } else { name = table.getName(); } read(); return name; } StatementSchema compileCreateView(boolean alter, boolean orReplace) { read(); HsqlName name = readNewSchemaObjectName(SchemaObject.VIEW, true); name.setSchemaIfNull(session.getCurrentSchemaHsqlName()); checkSchemaUpdateAuthorisation(name.schema); HsqlName[] colList = null; if (token.tokenType == Tokens.OPENBRACKET) { try { colList = readColumnNames(name); } catch (HsqlException e) { if (session.isProcessingScript() && database.getProperties().isVersion18()) { while (token.tokenType != Tokens.AS) { read(); } } else { throw e; } } } readThis(Tokens.AS); startRecording(); int position = getPosition(); QueryExpression queryExpression; try { queryExpression = XreadQueryExpression(); } catch (HsqlException e) { queryExpression = XreadJoinedTableAsView(); } Token[] tokenisedStatement = getRecordedStatement(); int check = SchemaObject.ViewCheckModes.CHECK_NONE; if (token.tokenType == Tokens.WITH) { read(); check = SchemaObject.ViewCheckModes.CHECK_CASCADE; if (readIfThis(Tokens.LOCAL)) { check = SchemaObject.ViewCheckModes.CHECK_LOCAL; } else { readIfThis(Tokens.CASCADED); } readThis(Tokens.CHECK); readThis(Tokens.OPTION); } View view = new View(database, name, colList, check); queryExpression.setView(view); queryExpression.resolve(session); view.setStatement(Token.getSQL(tokenisedStatement)); StatementQuery s = new StatementQuery(session, queryExpression, compileContext); String fullSQL = getLastPart(); Object[] args = new Object[]{ view }; int type = alter ? StatementTypes.ALTER_VIEW : StatementTypes.CREATE_VIEW; HsqlName[] writeLockNames = database.schemaManager.catalogNameArray; return new StatementSchema(fullSQL, type, args, s.readTableNames, writeLockNames); } StatementSchema compileCreateSequence() { read(); /* CREATE SEQUENCE [AS {INTEGER | BIGINT}] [START WITH ] [INCREMENT BY ] */ HsqlName name = readNewSchemaObjectName(SchemaObject.SEQUENCE, false); NumberSequence sequence = new NumberSequence(name, Type.SQL_INTEGER); readSequenceOptions(sequence, true, false, false); String sql = getLastPart(); Object[] args = new Object[]{ sequence }; HsqlName[] writeLockNames = database.schemaManager.catalogNameArray; return new StatementSchema(sql, StatementTypes.CREATE_SEQUENCE, args, null, writeLockNames); } StatementSchema compileCreateDomain() { UserTypeModifier userTypeModifier = null; HsqlName name; read(); name = readNewSchemaObjectName(SchemaObject.DOMAIN, false); readIfThis(Tokens.AS); Type type = readTypeDefinition(false, false).duplicate(); Expression defaultClause = null; if (readIfThis(Tokens.DEFAULT)) { defaultClause = readDefaultClause(type); } userTypeModifier = new UserTypeModifier(name, SchemaObject.DOMAIN, type); userTypeModifier.setDefaultClause(defaultClause); type.userTypeModifier = userTypeModifier; HsqlArrayList tempConstraints = new HsqlArrayList(); compileContext.currentDomain = type; while (true) { boolean end = false; switch (token.tokenType) { case Tokens.CONSTRAINT : case Tokens.CHECK : readConstraint(type, tempConstraints); break; default : end = true; break; } if (end) { break; } } compileContext.currentDomain = null; for (int i = 0; i < tempConstraints.size(); i++) { Constraint c = (Constraint) tempConstraints.get(i); c.prepareCheckConstraint(session, null, false); userTypeModifier.addConstraint(c); } String sql = getLastPart(); Object[] args = new Object[]{ type }; HsqlName[] writeLockNames = database.schemaManager.catalogNameArray; return new StatementSchema(sql, StatementTypes.CREATE_DOMAIN, args, null, writeLockNames); } StatementSchema compileCreateType(boolean orReplace) { read(); HsqlName name = readNewSchemaObjectName(SchemaObject.TYPE, false); readThis(Tokens.AS); Type type = readTypeDefinition(false, false).duplicate(); readIfThis(Tokens.FINAL); UserTypeModifier userTypeModifier = new UserTypeModifier(name, SchemaObject.TYPE, type); type.userTypeModifier = userTypeModifier; String sql = getLastPart(); Object[] args = new Object[]{ type }; HsqlName[] writeLockNames = database.schemaManager.catalogNameArray; return new StatementSchema(sql, StatementTypes.CREATE_TYPE, args, null, writeLockNames); } StatementSchema compileCreateCharacterSet() { read(); readThis(Tokens.SET); HsqlName name = readNewSchemaObjectName(SchemaObject.CHARSET, false); readIfThis(Tokens.AS); readThis(Tokens.GET); String schema = session.getSchemaName(token.namePrefix); Charset source = (Charset) database.schemaManager.getSchemaObject(token.tokenString, schema, SchemaObject.CHARSET); read(); if (token.tokenType == Tokens.COLLATION) { read(); readThis(Tokens.FROM); readThis(Tokens.DEFAULT); } Charset charset = new Charset(name); charset.base = source.getName(); String sql = getLastPart(); Object[] args = new Object[]{ charset }; HsqlName[] writeLockNames = database.schemaManager.catalogNameArray; return new StatementSchema(sql, StatementTypes.CREATE_CHARACTER_SET, args, null, writeLockNames); } StatementSchema compileCreateCollation() { read(); HsqlName name = readNewSchemaObjectName(SchemaObject.COLLATION, false); name.setSchemaIfNull(session.getCurrentSchemaHsqlName()); readThis(Tokens.FOR); HsqlName charsetName = readNewSchemaObjectName(SchemaObject.CHARSET, false); charsetName.setSchemaIfNull(session.getCurrentSchemaHsqlName()); readThis(Tokens.FROM); HsqlName sourceName = readNewSchemaObjectName(SchemaObject.COLLATION, false); sourceName.setSchemaIfNull(session.getCurrentSchemaHsqlName()); Boolean padSpace = null; if (readIfThis(Tokens.NO)) { readThis(Tokens.PAD); padSpace = Boolean.FALSE; } else if (readIfThis(Tokens.PAD)) { readThis(Tokens.SPACE); padSpace = Boolean.TRUE; } Charset charset = (Charset) database.schemaManager.getSchemaObject(charsetName); if (charset == null) { throw Error.error(ErrorCode.X_42501, charsetName.getSchemaQualifiedStatementName()); } Collation source; try { source = Collation.getCollation(sourceName.name); } catch (HsqlException e) { source = (Collation) database.schemaManager.getSchemaObject(sourceName); } if (source == null) { throw Error.error(ErrorCode.X_42501, sourceName.getSchemaQualifiedStatementName()); } Collation collation = new Collation(name, source, charset, padSpace); String sql = getLastPart(); Object[] args = new Object[]{ collation }; HsqlName[] writeLockNames = database.schemaManager.catalogNameArray; return new StatementSchema(sql, StatementTypes.CREATE_COLLATION, args, null, writeLockNames); } StatementSchema compileCreateAlias() { HsqlName name = null; Routine[] routines = null; String alias; String methodFQN = null; if (!session.isProcessingScript()) { throw super.unsupportedFeature(); } read(); try { alias = token.tokenString; read(); readThis(Tokens.FOR); methodFQN = token.tokenString; read(); } catch (HsqlException e) { alias = null; } if (alias != null) { HsqlName schema = database.schemaManager.getDefaultSchemaHsqlName(); name = database.nameManager.newHsqlName(schema, alias, SchemaObject.FUNCTION); Method[] methods = Routine.getMethods(methodFQN); routines = Routine.newRoutines(session, methods); } String sql = getLastPart(); Object[] args = new Object[] { name, routines }; HsqlName[] writeLockNames = database.schemaManager.catalogNameArray; return new StatementSchema(sql, StatementTypes.CREATE_ALIAS, args, null, writeLockNames); } StatementSchema compileCreateTrigger(boolean orReplace) { Table table; Boolean isForEachRow = null; boolean isNowait = false; boolean hasQueueSize = false; int queueSize = 0; int beforeOrAfterType; int operationType; String className; TriggerDef td; HsqlName name; HsqlName otherName = null; OrderedHashSet columns = null; int[] updateColumnIndexes = null; read(); name = readNewSchemaObjectName(SchemaObject.TRIGGER, true); switch (token.tokenType) { case Tokens.INSTEAD : beforeOrAfterType = TriggerDef.getTiming(Tokens.INSTEAD); read(); readThis(Tokens.OF); break; case Tokens.BEFORE : case Tokens.AFTER : beforeOrAfterType = TriggerDef.getTiming(token.tokenType); read(); break; default : throw unexpectedToken(); } switch (token.tokenType) { case Tokens.INSERT : case Tokens.DELETE : operationType = TriggerDef.getOperationType(token.tokenType); read(); break; case Tokens.UPDATE : operationType = TriggerDef.getOperationType(token.tokenType); read(); if (token.tokenType == Tokens.OF && beforeOrAfterType != TriggerDef.INSTEAD) { read(); columns = new OrderedHashSet(); readColumnNameList(columns, null, false); } break; default : throw unexpectedToken(); } readThis(Tokens.ON); table = readTableName(); if (token.tokenType == Tokens.BEFORE) { read(); checkIsSimpleName(); otherName = readNewSchemaObjectName(SchemaObject.TRIGGER, true); } name.setSchemaIfNull(table.getSchemaName()); checkSchemaUpdateAuthorisation(name.schema); if (beforeOrAfterType == TriggerDef.INSTEAD) { if (!table.isView() || ((View) table).getCheckOption() == SchemaObject.ViewCheckModes.CHECK_CASCADE) { throw Error.error(ErrorCode.X_42538, name.schema.name); } } else { if (table.isView()) { throw Error.error(ErrorCode.X_42538, name.schema.name); } } if (name.schema != table.getSchemaName()) { throw Error.error(ErrorCode.X_42505, name.schema.name); } name.parent = table.getName(); database.schemaManager.checkSchemaObjectNotExists(name); if (columns != null) { updateColumnIndexes = table.getColumnIndexes(columns); for (int i = 0; i < updateColumnIndexes.length; i++) { if (updateColumnIndexes[i] == -1) { throw Error.error(ErrorCode.X_42544, (String) columns.get(i)); } } } Expression condition = null; String oldTableName = null; String newTableName = null; SimpleName oldRowName = null; SimpleName newRowName = null; Table[] transitions = new Table[4]; RangeVariable[] rangeVars = new RangeVariable[4]; String conditionSQL = null; RangeGroup[] rangeGroups = new RangeGroup[]{ new RangeGroup.RangeGroupSimple(rangeVars) }; if (token.tokenType == Tokens.REFERENCING) { read(); if (token.tokenType != Tokens.OLD && token.tokenType != Tokens.NEW) { throw unexpectedToken(); } while (true) { if (token.tokenType == Tokens.OLD) { if (operationType == StatementTypes.INSERT) { throw unexpectedToken(); } read(); if (token.tokenType == Tokens.TABLE) { if (Boolean.TRUE.equals(isForEachRow) || oldTableName != null || beforeOrAfterType == TriggerDef.BEFORE) { throw unexpectedToken(); } read(); readIfThis(Tokens.AS); checkIsSimpleName(); read(); oldTableName = token.tokenString; String n = oldTableName; if (n.equals(newTableName) || n.equals(oldRowName) || n.equals(newRowName)) { throw unexpectedToken(); } isForEachRow = Boolean.FALSE; HsqlName hsqlName = database.nameManager.newHsqlName( table.getSchemaName(), n, isDelimitedIdentifier(), SchemaObject.TRANSITION); Table transition = new Table(table, hsqlName); RangeVariable range = new RangeVariable(transition, null, null, null, compileContext); transitions[TriggerDef.OLD_TABLE] = transition; rangeVars[TriggerDef.OLD_TABLE] = range; } else { if (Boolean.FALSE.equals(isForEachRow) || oldRowName != null) { throw unexpectedToken(); } readIfThis(Tokens.ROW); readIfThis(Tokens.AS); checkIsSimpleName(); oldRowName = HsqlNameManager.getSimpleName( token.tokenString, token.isDelimitedIdentifier); read(); String n = oldRowName.name; if (n.equals(newTableName) || n.equals(oldTableName) || n.equals(newRowName)) { throw unexpectedToken(); } isForEachRow = Boolean.TRUE; RangeVariable range = new RangeVariable(table.columnList, oldRowName, false, RangeVariable.TRANSITION_RANGE); range.rangePosition = TriggerDef.OLD_ROW; transitions[TriggerDef.OLD_ROW] = null; rangeVars[TriggerDef.OLD_ROW] = range; } } else if (token.tokenType == Tokens.NEW) { if (operationType == StatementTypes.DELETE_WHERE) { throw unexpectedToken(); } read(); if (token.tokenType == Tokens.TABLE) { if (Boolean.TRUE.equals(isForEachRow) || newTableName != null || beforeOrAfterType == TriggerDef.BEFORE) { throw unexpectedToken(); } read(); readIfThis(Tokens.AS); checkIsSimpleName(); newTableName = token.tokenString; read(); isForEachRow = Boolean.FALSE; String n = newTableName; if (n.equals(oldTableName) || n.equals(oldRowName) || n.equals(newRowName)) { throw unexpectedToken(); } HsqlName hsqlName = database.nameManager.newHsqlName( table.getSchemaName(), n, isDelimitedIdentifier(), SchemaObject.TRANSITION); Table transition = new Table(table, hsqlName); RangeVariable range = new RangeVariable(transition, null, null, null, compileContext); transitions[TriggerDef.NEW_TABLE] = transition; rangeVars[TriggerDef.NEW_TABLE] = range; } else { if (Boolean.FALSE.equals(isForEachRow) || newRowName != null) { throw unexpectedToken(); } readIfThis(Tokens.ROW); readIfThis(Tokens.AS); checkIsSimpleName(); newRowName = HsqlNameManager.getSimpleName( token.tokenString, token.isDelimitedIdentifier); read(); String n = newRowName.name; if (n.equals(oldTableName) || n.equals(newTableName) || n.equals(oldRowName)) { throw unexpectedToken(); } isForEachRow = Boolean.TRUE; RangeVariable range = new RangeVariable(table.columnList, newRowName, false, RangeVariable.TRANSITION_RANGE); range.rangePosition = TriggerDef.NEW_ROW; transitions[TriggerDef.NEW_ROW] = null; rangeVars[TriggerDef.NEW_ROW] = range; } } else { break; } } } if (Boolean.TRUE.equals(isForEachRow) && token.tokenType != Tokens.FOR) { throw unexpectedTokenRequire(Tokens.T_FOR); } if (token.tokenType == Tokens.FOR) { read(); readThis(Tokens.EACH); if (token.tokenType == Tokens.ROW) { if (Boolean.FALSE.equals(isForEachRow)) { throw unexpectedToken(); } isForEachRow = Boolean.TRUE; } else if (token.tokenType == Tokens.STATEMENT) { if (Boolean.TRUE.equals(isForEachRow) || beforeOrAfterType == TriggerDef.BEFORE) { throw unexpectedToken(); } isForEachRow = Boolean.FALSE; } else { throw unexpectedToken(); } read(); } // if (rangeVars[TriggerDef.OLD_TABLE] != null) {} if (rangeVars[TriggerDef.NEW_TABLE] != null) {} // if (Tokens.T_QUEUE.equals(token.tokenString)) { read(); queueSize = readInteger(); hasQueueSize = true; } if (Tokens.T_NOWAIT.equals(token.tokenString)) { read(); isNowait = true; } if (token.tokenType == Tokens.WHEN && beforeOrAfterType != TriggerDef.INSTEAD) { read(); readThis(Tokens.OPENBRACKET); int position = getPosition(); isCheckOrTriggerCondition = true; condition = XreadBooleanValueExpression(); conditionSQL = getLastPart(position); isCheckOrTriggerCondition = false; readThis(Tokens.CLOSEBRACKET); HsqlList unresolved = condition.resolveColumnReferences(session, new RangeGroupSimple(rangeVars), rangeGroups, null); ExpressionColumn.checkColumnsResolved(unresolved); condition.resolveTypes(session, null); if (condition.getDataType() != Type.SQL_BOOLEAN) { throw Error.error(ErrorCode.X_42568); } } if (isForEachRow == null) { isForEachRow = Boolean.FALSE; } if (token.tokenType == Tokens.CALL) { int position = getPosition(); try { read(); checkIsSimpleName(); checkIsDelimitedIdentifier(); className = token.tokenString; read(); if (token.tokenType == Tokens.OPENBRACKET) { throw unexpectedToken(); } td = new TriggerDef(name, beforeOrAfterType, operationType, isForEachRow.booleanValue(), table, transitions, rangeVars, condition, conditionSQL, updateColumnIndexes, className, isNowait, queueSize); String sql = getLastPart(); Object[] args = new Object[] { td, otherName }; HsqlName[] writeLockNames = new HsqlName[] { database.getCatalogName(), table.getName() }; return new StatementSchema(sql, StatementTypes.CREATE_TRIGGER, args, null, writeLockNames); } catch (HsqlException e) { rewind(position); } } // if (hasQueueSize) { throw unexpectedToken(Tokens.T_QUEUE); } if (isNowait) { throw unexpectedToken(Tokens.T_NOWAIT); } Routine routine = compileTriggerRoutine(table, rangeVars, beforeOrAfterType, operationType); td = new TriggerDefSQL(name, beforeOrAfterType, operationType, isForEachRow.booleanValue(), table, transitions, rangeVars, condition, conditionSQL, updateColumnIndexes, routine); String sql = getLastPart(); Object[] args = new Object[] { td, otherName }; return new StatementSchema(sql, StatementTypes.CREATE_TRIGGER, args, null, new HsqlName[] { database.getCatalogName(), table.getName() }); } Routine compileTriggerRoutine(Table table, RangeVariable[] ranges, int beforeOrAfter, int operation) { int impact = (beforeOrAfter == TriggerDef.BEFORE) ? Routine.READS_SQL : Routine .MODIFIES_SQL; Routine routine = new Routine(table, ranges, impact, beforeOrAfter, operation); startRecording(); StatementCompound parent = new StatementCompound(StatementTypes.BEGIN_END, null); parent.rangeVariables = ranges; Statement statement = compileSQLProcedureStatementOrNull(routine, null); if (statement == null) { throw unexpectedToken(); } Token[] tokenisedStatement = getRecordedStatement(); String sql = Token.getSQL(tokenisedStatement); statement.setSQL(sql); routine.setProcedure(statement); routine.resolve(session); return routine; } /** * Responsible for handling the creation of table columns during the process * of executing CREATE TABLE or ADD COLUMN etc. statements. * * @param table this table * @param hsqlName column name * @param constraintList list of constraints * @return a Column object with indicated attributes */ ColumnSchema readColumnDefinitionOrNull(Table table, HsqlName hsqlName, HsqlArrayList constraintList) { boolean isGenerated = false; boolean isIdentity = false; boolean isPKIdentity = false; boolean generatedAlways = false; Expression generateExpr = null; boolean isNullable = true; Expression defaultExpr = null; Type typeObject = null; NumberSequence sequence = null; switch (token.tokenType) { case Tokens.GENERATED : { read(); readThis(Tokens.ALWAYS); isGenerated = true; generatedAlways = true; // not yet throw unexpectedToken(Tokens.T_GENERATED); } case Tokens.IDENTITY : { read(); isIdentity = true; isPKIdentity = true; typeObject = Type.SQL_INTEGER; sequence = new NumberSequence(null, 0, 1, typeObject); break; } case Tokens.COMMA : { return null; } case Tokens.CLOSEBRACKET : { return null; } default : { if (token.isUndelimitedIdentifier) { if (Tokens.T_SERIAL.equals(token.tokenString)) { if (database.sqlSyntaxMys) { read(); isIdentity = true; isPKIdentity = true; typeObject = Type.SQL_BIGINT; sequence = new NumberSequence(null, 1, 1, typeObject); break; } else if (database.sqlSyntaxPgs) { read(); isIdentity = true; typeObject = Type.SQL_INTEGER; sequence = new NumberSequence(null, 1, 1, typeObject); break; } } else if (Tokens.T_BIGSERIAL.equals(token.tokenString)) { if (database.sqlSyntaxPgs) { read(); isIdentity = true; isPKIdentity = true; typeObject = Type.SQL_BIGINT; sequence = new NumberSequence(null, 1, 1, typeObject); break; } } } typeObject = readTypeDefinition(true, true); } } if (!isGenerated && !isIdentity) { if (database.sqlSyntaxMys) { switch (token.tokenType) { case Tokens.NULL : read(); break; case Tokens.NOT : read(); readThis(Tokens.NULL); isNullable = false; break; default : } } switch (token.tokenType) { case Tokens.WITH : { if (database.sqlSyntaxDb2) { read(); } else { throw unexpectedToken(); } } // fall through case Tokens.DEFAULT : { read(); defaultExpr = readDefaultClause(typeObject); if (defaultExpr.opType == OpTypes.SEQUENCE) { if (database.sqlSyntaxPgs) { sequence = ((ExpressionColumn) defaultExpr).sequence; defaultExpr = null; isIdentity = true; } } break; } case Tokens.GENERATED : { read(); if (token.tokenType == Tokens.BY) { read(); readThis(Tokens.DEFAULT); } else { readThis(Tokens.ALWAYS); generatedAlways = true; } readThis(Tokens.AS); if (token.tokenType == Tokens.IDENTITY) { read(); sequence = new NumberSequence(null, typeObject); sequence.setAlways(generatedAlways); if (token.tokenType == Tokens.OPENBRACKET) { read(); readSequenceOptions(sequence, false, false, true); readThis(Tokens.CLOSEBRACKET); } isIdentity = true; } else if (token.tokenType == Tokens.OPENBRACKET) { if (!generatedAlways) { throw super.unexpectedTokenRequire( Tokens.T_IDENTITY); } isGenerated = true; } else if (token.tokenType == Tokens.SEQUENCE) { if (generatedAlways) { throw unexpectedToken(); } read(); if (token.namePrefix != null) { if (!token.namePrefix.equals( table.getSchemaName().name)) { throw super.unexpectedToken(token.namePrefix); } } sequence = database.schemaManager.getSequence( token.tokenString, table.getSchemaName().name, true); isIdentity = true; read(); } break; } case Tokens.IDENTITY : { read(); isIdentity = true; isPKIdentity = true; sequence = new NumberSequence(null, 0, 1, typeObject); } break; } } if (isGenerated) { readThis(Tokens.OPENBRACKET); generateExpr = XreadValueExpression(); readThis(Tokens.CLOSEBRACKET); } if (!isGenerated && !isIdentity) { if (database.sqlSyntaxMys) { if (token.isUndelimitedIdentifier && Tokens.T_AUTO_INCREMENT.equals(token.tokenString)) { read(); isIdentity = true; sequence = new NumberSequence(null, 0, 1, typeObject); } } } ColumnSchema column = new ColumnSchema(hsqlName, typeObject, isNullable, false, defaultExpr); column.setGeneratingExpression(generateExpr); readColumnConstraints(table, column, constraintList); if (token.tokenType == Tokens.IDENTITY && !isIdentity) { read(); isIdentity = true; isPKIdentity = true; sequence = new NumberSequence(null, 0, 1, typeObject); } if (isIdentity) { column.setIdentity(sequence); } if (isPKIdentity && !column.isPrimaryKey()) { OrderedHashSet set = new OrderedHashSet(); set.add(column.getName().name); HsqlName constName = database.nameManager.newAutoName("PK", table.getSchemaName(), table.getName(), SchemaObject.CONSTRAINT); Constraint c = new Constraint(constName, set, SchemaObject.ConstraintTypes.PRIMARY_KEY); constraintList.set(0, c); column.setPrimaryKey(true); } if (database.sqlSyntaxPgs && token.tokenType == Tokens.DEFAULT && column.getDefaultExpression() == null && column.getIdentitySequence() == null) { read(); defaultExpr = readDefaultClause(typeObject); if (defaultExpr.opType == OpTypes.SEQUENCE) { sequence = ((ExpressionColumn) defaultExpr).sequence; defaultExpr = null; } column.setDefaultExpression(defaultExpr); column.setIdentity(sequence); } return column; } /** * A comma after START WITH is accepted for 1.8.x compatibility */ private void readSequenceOptions(NumberSequence sequence, boolean withType, boolean isAlter, boolean allowComma) { OrderedIntHashSet set = new OrderedIntHashSet(); while (true) { boolean end = false; if (set.contains(token.tokenType)) { throw unexpectedToken(); } switch (token.tokenType) { case Tokens.AS : { if (withType) { set.add(token.tokenType); read(); Type type = readTypeDefinition(false, true); sequence.setDefaults(sequence.getName(), type); break; } throw unexpectedToken(); } case Tokens.START : { set.add(token.tokenType); read(); readThis(Tokens.WITH); long value = readBigint(); sequence.setStartValueNoCheck(value); if (allowComma) { readIfThis(Tokens.COMMA); } break; } case Tokens.RESTART : { if (!isAlter) { end = true; break; } set.add(token.tokenType); read(); if (readIfThis(Tokens.WITH)) { long value = readBigint(); sequence.setCurrentValueNoCheck(value); } else { sequence.setStartValueDefault(); } break; } case Tokens.INCREMENT : { set.add(token.tokenType); read(); readThis(Tokens.BY); long value = readBigint(); sequence.setIncrement(value); break; } case Tokens.NO : { read(); if (set.contains(token.tokenType)) { throw unexpectedToken(); } if (token.tokenType == Tokens.MAXVALUE) { sequence.setDefaultMaxValue(); } else if (token.tokenType == Tokens.MINVALUE) { sequence.setDefaultMinValue(); } else if (token.tokenType == Tokens.CYCLE) { sequence.setCycle(false); } else { throw unexpectedToken(); } set.add(token.tokenType); read(); break; } case Tokens.MAXVALUE : { set.add(token.tokenType); read(); long value = readBigint(); sequence.setMaxValueNoCheck(value); break; } case Tokens.MINVALUE : { set.add(token.tokenType); read(); long value = readBigint(); sequence.setMinValueNoCheck(value); break; } case Tokens.CYCLE : { set.add(token.tokenType); read(); sequence.setCycle(true); break; } default : if (database.sqlSyntaxOra && isSimpleName()) { if (token.tokenString.equals("NOCACHE") || token.tokenString.equals("NOCYCLE") || token.tokenString.equals("NOMAXVALUE") || token.tokenString.equals("NOMINVALUE") || token.tokenString.equals("NOORDER") || token.tokenString.equals("ORDER")) { read(); break; } if (token.tokenString.equals("CACHE")) { read(); readBigint(); break; } } end = true; break; } if (end) { break; } } sequence.checkValues(); } /** * Reads and adds a table constraint definition to the list * * @param schemaObject table or domain * @param constraintList list of constraints */ private void readConstraint(SchemaObject schemaObject, HsqlArrayList constraintList) { HsqlName constName = null; if (token.tokenType == Tokens.CONSTRAINT) { read(); constName = readNewDependentSchemaObjectName(schemaObject.getName(), SchemaObject.CONSTRAINT); } switch (token.tokenType) { case Tokens.PRIMARY : { if (schemaObject.getName().type != SchemaObject.TABLE) { throw this.unexpectedTokenRequire(Tokens.T_CHECK); } read(); readThis(Tokens.KEY); Constraint mainConst; mainConst = (Constraint) constraintList.get(0); if (mainConst.constType == SchemaObject.ConstraintTypes.PRIMARY_KEY) { throw Error.error(ErrorCode.X_42532); } if (constName == null) { constName = database.nameManager.newAutoName("PK", schemaObject.getSchemaName(), schemaObject.getName(), SchemaObject.CONSTRAINT); } OrderedHashSet set = readColumnNames(false); Constraint c = new Constraint(constName, set, SchemaObject.ConstraintTypes.PRIMARY_KEY); constraintList.set(0, c); break; } case Tokens.UNIQUE : { if (schemaObject.getName().type != SchemaObject.TABLE) { throw this.unexpectedTokenRequire(Tokens.T_CHECK); } read(); OrderedHashSet set = readColumnNames(false); if (constName == null) { constName = database.nameManager.newAutoName("CT", schemaObject.getSchemaName(), schemaObject.getName(), SchemaObject.CONSTRAINT); } Constraint c = new Constraint(constName, set, SchemaObject.ConstraintTypes.UNIQUE); constraintList.add(c); break; } case Tokens.FOREIGN : { if (schemaObject.getName().type != SchemaObject.TABLE) { throw this.unexpectedTokenRequire(Tokens.T_CHECK); } read(); readThis(Tokens.KEY); OrderedHashSet set = readColumnNames(false); Constraint c = readFKReferences((Table) schemaObject, constName, set); constraintList.add(c); break; } case Tokens.CHECK : { read(); if (constName == null) { constName = database.nameManager.newAutoName("CT", schemaObject.getSchemaName(), schemaObject.getName(), SchemaObject.CONSTRAINT); } Constraint c = new Constraint(constName, null, SchemaObject.ConstraintTypes.CHECK); readCheckConstraintCondition(c); constraintList.add(c); break; } default : { if (constName != null) { throw super.unexpectedToken(); } } } } /** * Reads column constraints */ void readColumnConstraints(Table table, ColumnSchema column, HsqlArrayList constraintList) { boolean end = false; boolean hasNotNullConstraint = false; boolean hasNullNoiseWord = false; boolean hasPrimaryKey = false; while (true) { HsqlName constName = null; if (token.tokenType == Tokens.CONSTRAINT) { read(); constName = readNewDependentSchemaObjectName(table.getName(), SchemaObject.CONSTRAINT); } switch (token.tokenType) { case Tokens.PRIMARY : { if (hasNullNoiseWord || hasPrimaryKey) { throw unexpectedToken(); } read(); readThis(Tokens.KEY); Constraint existingConst = (Constraint) constraintList.get(0); if (existingConst.constType == SchemaObject.ConstraintTypes.PRIMARY_KEY) { throw Error.error(ErrorCode.X_42532); } OrderedHashSet set = new OrderedHashSet(); set.add(column.getName().name); if (constName == null) { constName = database.nameManager.newAutoName("PK", table.getSchemaName(), table.getName(), SchemaObject.CONSTRAINT); } Constraint c = new Constraint( constName, set, SchemaObject.ConstraintTypes.PRIMARY_KEY); constraintList.set(0, c); column.setPrimaryKey(true); hasPrimaryKey = true; break; } case Tokens.UNIQUE : { read(); OrderedHashSet set = new OrderedHashSet(); set.add(column.getName().name); if (constName == null) { constName = database.nameManager.newAutoName("CT", table.getSchemaName(), table.getName(), SchemaObject.CONSTRAINT); } Constraint c = new Constraint(constName, set, SchemaObject.ConstraintTypes.UNIQUE); constraintList.add(c); break; } case Tokens.FOREIGN : { read(); readThis(Tokens.KEY); } // fall through case Tokens.REFERENCES : { OrderedHashSet set = new OrderedHashSet(); set.add(column.getName().name); Constraint c = readFKReferences(table, constName, set); constraintList.add(c); break; } case Tokens.CHECK : { read(); if (constName == null) { constName = database.nameManager.newAutoName("CT", table.getSchemaName(), table.getName(), SchemaObject.CONSTRAINT); } Constraint c = new Constraint(constName, null, SchemaObject.ConstraintTypes.CHECK); readCheckConstraintCondition(c); OrderedHashSet set = c.getCheckColumnExpressions(); for (int i = 0; i < set.size(); i++) { ExpressionColumn e = (ExpressionColumn) set.get(i); if (column.getName().name.equals(e.getColumnName())) { if (e.getSchemaName() != null && e.getSchemaName() != table.getSchemaName().name) { throw Error.error(ErrorCode.X_42505); } } else { throw Error.error(ErrorCode.X_42501); } } constraintList.add(c); break; } case Tokens.NOT : { if (hasNotNullConstraint || hasNullNoiseWord) { throw unexpectedToken(); } read(); readThis(Tokens.NULL); if (constName == null) { constName = database.nameManager.newAutoName("CT", table.getSchemaName(), table.getName(), SchemaObject.CONSTRAINT); } Constraint c = new Constraint(constName, null, SchemaObject.ConstraintTypes.CHECK); c.check = new ExpressionLogical(column); constraintList.add(c); hasNotNullConstraint = true; break; } case Tokens.NULL : { if (hasNotNullConstraint || hasNullNoiseWord || hasPrimaryKey) { throw unexpectedToken(); } if (constName != null) { throw unexpectedToken(); } read(); hasNullNoiseWord = true; break; } default : end = true; break; } if (end) { break; } } } /** * Responsible for handling check constraints section of CREATE TABLE ... * * @param c check constraint */ void readCheckConstraintCondition(Constraint c) { readThis(Tokens.OPENBRACKET); startRecording(); isCheckOrTriggerCondition = true; Expression condition = XreadBooleanValueExpression(); isCheckOrTriggerCondition = false; Token[] tokens = getRecordedStatement(); readThis(Tokens.CLOSEBRACKET); c.check = condition; } StatementSchema compileCreateIndex(boolean unique) { Table table; HsqlName indexHsqlName; String[] qualifiers = null; HsqlArrayList list = new HsqlArrayList(); read(); indexHsqlName = readNewSchemaObjectName(SchemaObject.INDEX, true); while (token.tokenType != Tokens.ON) { checkIsIdentifier(); list.add(token.tokenString); read(); } qualifiers = new String[list.size()]; list.toArray(qualifiers); readThis(Tokens.ON); table = readTableName(); HsqlName tableSchema = table.getSchemaName(); indexHsqlName.setSchemaIfNull(tableSchema); indexHsqlName.parent = table.getName(); if (indexHsqlName.schema != tableSchema) { throw Error.error(ErrorCode.X_42505); } indexHsqlName.schema = table.getSchemaName(); int[] indexColumns = readColumnList(table, true); String sql = getLastPart(); Object[] args = new Object[] { table, indexColumns, indexHsqlName, Boolean.valueOf(unique), qualifiers }; return new StatementSchema(sql, StatementTypes.CREATE_INDEX, args, null, new HsqlName[] { database.getCatalogName(), table.getName() }); } StatementSchema compileCreateSchema() { HsqlName schemaName = null; String authorisation = null; HsqlName characterSetName = null; read(); if (token.tokenType != Tokens.AUTHORIZATION) { schemaName = readNewSchemaName(); } if (token.tokenType == Tokens.AUTHORIZATION) { read(); checkIsSimpleName(); authorisation = token.tokenString; read(); if (schemaName == null) { Grantee owner = database.getGranteeManager().get(authorisation); if (owner == null) { throw Error.error(ErrorCode.X_28501, authorisation); } schemaName = database.nameManager.newHsqlName(owner.getName().name, isDelimitedIdentifier(), SchemaObject.SCHEMA); SqlInvariants.checkSchemaNameNotSystem(token.tokenString); } } if (SqlInvariants.PUBLIC_ROLE_NAME.equals(authorisation)) { throw Error.error(ErrorCode.X_28502, authorisation); } Grantee owner = authorisation == null ? session.getGrantee() : database.getGranteeManager() .get(authorisation); if (owner == null) { throw Error.error(ErrorCode.X_28501, authorisation); } if (!session.getGrantee().isSchemaCreator()) { throw Error.error(ErrorCode.X_0L501, session.getGrantee().getName().getNameString()); } if (owner instanceof User && ((User) owner).isExternalOnly) { throw Error.error(ErrorCode.X_0L000, session.getGrantee().getName().getNameString()); } if (database.schemaManager.schemaExists(schemaName.name)) { throw Error.error(ErrorCode.X_42504, schemaName.name); } if (schemaName.name.equals(SqlInvariants.LOBS_SCHEMA)) { schemaName = SqlInvariants.LOBS_SCHEMA_HSQLNAME; owner = schemaName.owner; } if (readIfThis(Tokens.DEFAULT)) { readThis(Tokens.CHARACTER); readThis(Tokens.SET); characterSetName = this.readNewSchemaObjectName(SchemaObject.CHARSET, false); } String sql = getLastPart(); Object[] args = new Object[] { schemaName, owner }; HsqlName[] writeLockNames = database.schemaManager.catalogNameArray; StatementSchema cs = new StatementSchema(sql, StatementTypes.CREATE_SCHEMA, args, null, writeLockNames); cs.setSchemaHsqlName(schemaName); HsqlArrayList list = new HsqlArrayList(); list.add(cs); getCompiledStatementBody(list); StatementSchema[] array = new StatementSchema[list.size()]; list.toArray(array); boolean swapped; do { swapped = false; for (int i = 0; i < array.length - 1; i++) { if (array[i].order > array[i + 1].order) { StatementSchema temp = array[i + 1]; array[i + 1] = array[i]; array[i] = temp; swapped = true; } } } while (swapped); return new StatementSchemaDefinition(array); } void getCompiledStatementBody(HsqlList list) { int position; String sql; int statementType; for (boolean end = false; !end; ) { StatementSchema cs = null; position = getPosition(); switch (token.tokenType) { case Tokens.CREATE : read(); switch (token.tokenType) { // not in schema definition case Tokens.SCHEMA : case Tokens.USER : case Tokens.UNIQUE : throw unexpectedToken(); case Tokens.INDEX : statementType = StatementTypes.CREATE_INDEX; sql = getStatement(position, startStatementTokensSchema); cs = new StatementSchema(sql, statementType); break; case Tokens.SEQUENCE : cs = compileCreateSequence(); cs.sql = getLastPart(position); break; case Tokens.ROLE : cs = compileCreateRole(); cs.sql = getLastPart(position); break; case Tokens.DOMAIN : statementType = StatementTypes.CREATE_DOMAIN; sql = getStatement(position, startStatementTokensSchema); cs = new StatementSchema(sql, statementType); break; case Tokens.TYPE : cs = compileCreateType(false); cs.sql = getLastPart(position); break; case Tokens.CHARACTER : cs = compileCreateCharacterSet(); cs.sql = getLastPart(position); break; // no supported case Tokens.ASSERTION : throw unexpectedToken(); case Tokens.TABLE : case Tokens.MEMORY : case Tokens.CACHED : case Tokens.TEMP : case Tokens.GLOBAL : case Tokens.TEMPORARY : case Tokens.TEXT : statementType = StatementTypes.CREATE_TABLE; sql = getStatement(position, startStatementTokensSchema); cs = new StatementSchema(sql, statementType); break; case Tokens.TRIGGER : statementType = StatementTypes.CREATE_TRIGGER; sql = getStatement(position, startStatementTokensSchema); cs = new StatementSchema(sql, statementType); break; case Tokens.VIEW : statementType = StatementTypes.CREATE_VIEW; sql = getStatement(position, startStatementTokensSchema); cs = new StatementSchema(sql, statementType); break; case Tokens.FUNCTION : statementType = StatementTypes.CREATE_ROUTINE; sql = getStatementForRoutine( position, startStatementTokensSchema); cs = new StatementSchema(sql, statementType); break; case Tokens.PROCEDURE : statementType = StatementTypes.CREATE_ROUTINE; sql = getStatementForRoutine( position, startStatementTokensSchema); cs = new StatementSchema(sql, statementType); break; default : throw unexpectedToken(); } break; case Tokens.GRANT : cs = compileGrantOrRevoke(); cs.sql = getLastPart(position); break; case Tokens.SEMICOLON : read(); end = true; break; case Tokens.X_ENDPARSE : end = true; break; default : throw unexpectedToken(); } if (cs != null) { cs.isSchemaDefinition = true; list.add(cs); } } } StatementSchema compileCreateRole() { read(); HsqlName name = readNewUserIdentifier(); String sql = getLastPart(); Object[] args = new Object[]{ name }; HsqlName[] writeLockNames = database.schemaManager.catalogNameArray; return new StatementSchema(sql, StatementTypes.CREATE_ROLE, args, null, writeLockNames); } StatementSchema compileCreateUser() { HsqlName name; String password; Boolean admin = Boolean.FALSE; Boolean isDigest = Boolean.FALSE; Grantee grantor = session.getGrantee(); read(); name = readNewUserIdentifier(); readThis(Tokens.PASSWORD); if (readIfThis(Tokens.DIGEST)) { isDigest = Boolean.TRUE; } password = readPassword(); if (token.tokenType == Tokens.ADMIN) { read(); admin = Boolean.TRUE; } checkDatabaseUpdateAuthorisation(); String sql = getLastPart(); Object[] args = new Object[] { name, password, grantor, admin, isDigest }; HsqlName[] writeLockNames = database.schemaManager.catalogNameArray; return new StatementSchema(sql, StatementTypes.CREATE_USER, args, null, writeLockNames); } HsqlName readNewUserIdentifier() { checkIsSimpleName(); String tokenS = token.tokenString; boolean isQuoted = isDelimitedIdentifier(); if (tokenS.equalsIgnoreCase("SA")) { tokenS = "SA"; isQuoted = false; } HsqlName name = database.nameManager.newHsqlName(tokenS, isQuoted, SchemaObject.GRANTEE); read(); return name; } String readPassword() { String tokenS = token.tokenString; if (isUndelimitedSimpleName() || isDelimitedSimpleName()) { read(); } else { readQuotedString(); } return tokenS; } Statement compileRenameObject(HsqlName name, int type) { HsqlName newName = readNewSchemaObjectName(type, true); String sql = getLastPart(); switch (type) { case SchemaObject.CATALOG : break; case SchemaObject.SCHEMA : checkSchemaUpdateAuthorisation(session, name); break; default : name.setSchemaIfNull(session.getCurrentSchemaHsqlName()); checkSchemaUpdateAuthorisation(session, name.schema); } Object[] args = new Object[] { name, newName }; HsqlName[] writeLockNames = database.schemaManager.getCatalogNameArray(); return new StatementSchema(sql, StatementTypes.RENAME_OBJECT, args, null, writeLockNames); } Statement compileAlterTableAddUniqueConstraint(Table table, HsqlName name) { if (name == null) { name = database.nameManager.newAutoName("CT", table.getSchemaName(), table.getName(), SchemaObject.CONSTRAINT); } int[] cols = this.readColumnList(table, false); HsqlName indexname = database.nameManager.newAutoName("IDX", name.name, table.getSchemaName(), table.getName(), SchemaObject.INDEX); Index index = table.createIndexStructure(indexname, cols, null, null, true, true, false); Constraint c = new Constraint(name, table, index, SchemaObject.ConstraintTypes.UNIQUE); String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ADD_CONSTRAINT, table, c }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( table.getName()); return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } Statement compileAlterTableAddForeignKeyConstraint(Table table, HsqlName name) { if (name == null) { name = database.nameManager.newAutoName("FK", table.getSchemaName(), table.getName(), SchemaObject.CONSTRAINT); } OrderedHashSet set = readColumnNames(false); Constraint c = readFKReferences(table, name, set); HsqlName mainTableName = c.getMainTableName(); c.core.mainTable = database.schemaManager.getTable(session, mainTableName.name, mainTableName.schema.name); c.setColumnsIndexes(table); String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ADD_CONSTRAINT, table, c }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( table.getName()); if (mainTableName != null && mainTableName != table.getName()) { writeLockNames = (HsqlName[]) ArrayUtil.toAdjustedArray(writeLockNames, mainTableName, writeLockNames.length, 1); } return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } Statement compileAlterTableAddCheckConstraint(Table table, HsqlName name) { Constraint check; if (name == null) { name = database.nameManager.newAutoName("CT", table.getSchemaName(), table.getName(), SchemaObject.CONSTRAINT); } check = new Constraint(name, null, SchemaObject.ConstraintTypes.CHECK); readCheckConstraintCondition(check); String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ADD_CONSTRAINT, table, check }; HsqlName[] writeLockNames = new HsqlName[] { database.getCatalogName(), table.getName() }; return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } Statement compileAlterTableAddColumn(Table table) { int colIndex = table.getColumnCount(); HsqlArrayList list = new HsqlArrayList(); Constraint constraint = new Constraint(null, null, SchemaObject.ConstraintTypes.TEMP); list.add(constraint); checkIsSchemaObjectName(); HsqlName hsqlName = database.nameManager.newColumnHsqlName(table.getName(), token.tokenString, isDelimitedIdentifier()); read(); ColumnSchema column = readColumnDefinitionOrNull(table, hsqlName, list); if (column == null) { throw Error.error(ErrorCode.X_42000); } if (token.tokenType == Tokens.BEFORE) { read(); colIndex = table.getColumnIndex(token.tokenString); read(); } String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ADD_COLUMN, table, column, new Integer(colIndex), list }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( table.getName()); return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } Statement compileAlterTableAddPrimaryKey(Table table, HsqlName name) { if (name == null) { name = session.database.nameManager.newAutoName("PK", table.getSchemaName(), table.getName(), SchemaObject.CONSTRAINT); } OrderedHashSet set = readColumnNames(false); Constraint constraint = new Constraint(name, set, SchemaObject.ConstraintTypes.PRIMARY_KEY); constraint.setColumnsIndexes(table); String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ADD_CONSTRAINT, table, constraint }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( table.getName()); return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } Statement compileAlterTableDropColumn(Table table, String colName, boolean cascade) { int colindex = table.getColumnIndex(colName); if (table.getColumnCount() == 1) { throw Error.error(ErrorCode.X_42591); } String sql = getLastPart(); Object[] args = new Object[] { table.getColumn(colindex).getName(), ValuePool.getInt(SchemaObject.COLUMN), Boolean.valueOf(cascade), Boolean.valueOf(false) }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( table.getName()); return new StatementSchema(sql, StatementTypes.DROP_COLUMN, args, null, writeLockNames); } Statement compileAlterColumn(Table table, ColumnSchema column, int columnIndex) { HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( table.getName()); int position = getPosition(); switch (token.tokenType) { case Tokens.RENAME : { read(); readThis(Tokens.TO); return compileAlterColumnRename(table, column); } case Tokens.DROP : { read(); if (token.tokenType == Tokens.DEFAULT) { read(); String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ALTER_COLUMN_DROP_DEFAULT, table, column, columnIndex }; return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } else if (token.tokenType == Tokens.GENERATED) { read(); String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ALTER_COLUMN_DROP_GENERATED, table, column, columnIndex }; return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } else { throw unexpectedToken(); } } case Tokens.SET : { read(); switch (token.tokenType) { case Tokens.DATA : { read(); readThis(Tokens.TYPE); return compileAlterColumnDataType(table, column); } case Tokens.DEFAULT : { read(); //ALTER TABLE .. ALTER COLUMN .. SET DEFAULT Type type = column.getDataType(); Expression expr = readDefaultClause(type); String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ALTER_COLUMN_DEFAULT, table, column, columnIndex, expr }; return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } case Tokens.NOT : { //ALTER TABLE .. ALTER COLUMN .. SET NOT NULL read(); readThis(Tokens.NULL); return compileAlterColumnSetNullability(table, column, false); } case Tokens.NULL : { read(); return compileAlterColumnSetNullability(table, column, true); } case Tokens.GENERATED : { return compileAlterColumnAddSequence(table, column, columnIndex); } default : rewind(position); read(); break; } } case Tokens.GENERATED : return compileAlterColumnAddSequence(table, column, columnIndex); // fall through default : } if (token.tokenType == Tokens.SET || token.tokenType == Tokens.RESTART) { if (!column.isIdentity()) { throw Error.error(ErrorCode.X_42535); } return compileAlterColumnSequenceOptions(table, column, columnIndex); } else { return compileAlterColumnDataTypeIdentity(table, column); } } /** * Allows changes to type of column or addition / removal of an IDENTITY generator. * IDENTITY is removed if it does not appear in new column definition * Constraint definitions are not allowed */ private Statement compileAlterColumnDataTypeIdentity(Table table, ColumnSchema column) { if (column.isGenerated()) { throw Error.error(ErrorCode.X_42561); } NumberSequence sequence = column.getIdentitySequence(); Type type = column.getDataType(); if (token.tokenType == Tokens.IDENTITY) { read(); if (!type.isIntegralType()) { throw Error.error(ErrorCode.X_42561); } if (sequence == null) { sequence = new NumberSequence(null, type); } } else { type = readTypeDefinition(false, true); switch (token.tokenType) { case Tokens.IDENTITY : { if (!type.isIntegralType()) { throw Error.error(ErrorCode.X_42561); } read(); if (sequence == null) { sequence = new NumberSequence(null, type); } break; } case Tokens.GENERATED : { sequence = readSequence(column); break; } default : sequence = null; } } String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ALTER_COLUMN_TYPE_IDENTITY, table, column, type, sequence }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( table.getName()); return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } private Statement compileAlterColumnDataType(Table table, ColumnSchema column) { if (column.isGenerated()) { throw Error.error(ErrorCode.X_42561); } Type type = readTypeDefinition(false, true); if (column.isIdentity()) { if (!type.isIntegralType()) { throw Error.error(ErrorCode.X_42561); } } String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ALTER_COLUMN_TYPE, table, column, type }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( table.getName()); return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } private Statement compileAlterColumnSetNullability(Table table, ColumnSchema column, boolean b) { String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ALTER_COLUMN_NULL, table, column, b }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( table.getName()); return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } Statement compileAlterSequence() { read(); HsqlName schema = session.getSchemaHsqlName(token.namePrefix); NumberSequence sequence = database.schemaManager.getSequence(token.tokenString, schema.name, true); read(); if (token.tokenType == Tokens.RENAME) { read(); readThis(Tokens.TO); return compileRenameObject(sequence.getName(), SchemaObject.SEQUENCE); } checkSchemaUpdateAuthorisation(session, sequence.getName().schema); NumberSequence copy = sequence.duplicate(); readSequenceOptions(copy, false, true, false); String sql = getLastPart(); Object[] args = new Object[] { sequence, copy }; HsqlName[] writeLockNames = database.schemaManager.getCatalogNameArray(); return new StatementSchema(sql, StatementTypes.ALTER_SEQUENCE, args, null, writeLockNames); } StatementSchema compileAlterColumnAddSequence(Table table, ColumnSchema column, int colIndex) { if (!column.getDataType().isIntegralType()) { throw Error.error(ErrorCode.X_42525); } if (column.isIdentity()) { throw Error.error(ErrorCode.X_42525); } NumberSequence sequence = readSequence(column); String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ALTER_COLUMN_SEQUENCE, table, column, colIndex, sequence }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( table.getName()); return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } NumberSequence readSequence(ColumnSchema column) { readThis(Tokens.GENERATED); NumberSequence sequence; sequence = new NumberSequence(null, column.getDataType()); boolean generatedAlways = false; if (token.tokenType == Tokens.BY) { read(); readThis(Tokens.DEFAULT); } else { readThis(Tokens.ALWAYS); generatedAlways = true; } readThis(Tokens.AS); readThis(Tokens.IDENTITY); sequence.setAlways(generatedAlways); if (token.tokenType == Tokens.OPENBRACKET) { read(); readSequenceOptions(sequence, false, false, false); readThis(Tokens.CLOSEBRACKET); } sequence.checkValues(); return sequence; } StatementSchema compileAlterColumnSequenceOptions(Table table, ColumnSchema column, int columnIndex) { OrderedIntHashSet set = new OrderedIntHashSet(); NumberSequence sequence = column.getIdentitySequence().duplicate(); while (true) { boolean end = false; switch (token.tokenType) { case Tokens.RESTART : { if (!set.add(token.tokenType)) { throw unexpectedToken(); } read(); if (readIfThis(Tokens.WITH)) { long value = readBigint(); sequence.setCurrentValueNoCheck(value); } else { sequence.reset(); } break; } case Tokens.SET : read(); switch (token.tokenType) { case Tokens.INCREMENT : { if (!set.add(token.tokenType)) { throw unexpectedToken(); } read(); readThis(Tokens.BY); long value = readBigint(); sequence.setIncrement(value); break; } case Tokens.NO : read(); if (token.tokenType == Tokens.MAXVALUE) { sequence.setDefaultMaxValue(); } else if (token.tokenType == Tokens.MINVALUE) { sequence.setDefaultMinValue(); } else if (token.tokenType == Tokens.CYCLE) { sequence.setCycle(false); } else { throw unexpectedToken(); } if (!set.add(token.tokenType)) { throw unexpectedToken(); } read(); break; case Tokens.MAXVALUE : { if (!set.add(token.tokenType)) { throw unexpectedToken(); } read(); long value = readBigint(); sequence.setMaxValueNoCheck(value); break; } case Tokens.MINVALUE : { if (!set.add(token.tokenType)) { throw unexpectedToken(); } read(); long value = readBigint(); sequence.setMinValueNoCheck(value); break; } case Tokens.CYCLE : if (!set.add(token.tokenType)) { throw unexpectedToken(); } read(); sequence.setCycle(true); break; default : throw super.unexpectedToken(); } break; default : end = true; break; } if (end) { break; } } sequence.checkValues(); // column.getIdentitySequence().reset(sequence); String sql = getLastPart(); Object[] args = new Object[] { StatementTypes.ALTER_COLUMN_SEQUENCE, table, column, columnIndex, sequence }; HsqlName[] writeLockNames = new HsqlName[] { database.getCatalogName(), table.getName() }; return new StatementSchema(sql, StatementTypes.ALTER_TABLE, args, null, writeLockNames); } /** * Responsible for handling tail of ALTER COLUMN ... RENAME ... */ private Statement compileAlterColumnRename(Table table, ColumnSchema column) { checkIsSimpleName(); HsqlName name = readNewSchemaObjectName(SchemaObject.COLUMN, true); if (table.findColumn(name.name) > -1) { throw Error.error(ErrorCode.X_42504, name.name); } database.schemaManager.checkColumnIsReferenced(table.getName(), column.getName()); String sql = getLastPart(); Object[] args = new Object[] { column.getName(), name }; HsqlName[] writeLockNames = new HsqlName[] { database.getCatalogName(), table.getName() }; return new StatementSchema(sql, StatementTypes.RENAME_OBJECT, args, null, writeLockNames); } Statement compileAlterSchemaRename() { HsqlName name = readSchemaName(); checkSchemaUpdateAuthorisation(name); readThis(Tokens.RENAME); readThis(Tokens.TO); HsqlName newName = readNewSchemaName(); String sql = getLastPart(); Object[] args = new Object[] { name, newName }; HsqlName[] writeLockNames = database.schemaManager.getCatalogNameArray(); return new StatementSchema(sql, StatementTypes.RENAME_OBJECT, args, null, writeLockNames); } Statement compileAlterUser() { read(); String password; User userObject; HsqlName userName = readNewUserIdentifier(); userObject = database.getUserManager().get(userName.name); if (userName.name.equals(Tokens.T_PUBLIC)) { throw Error.error(ErrorCode.X_42503); } readThis(Tokens.SET); switch (token.tokenType) { case Tokens.LOCAL : { read(); Boolean mode = processTrueOrFalseObject(); Object[] args = new Object[] { userObject, mode }; return new StatementCommand(StatementTypes.SET_USER_LOCAL, args); } case Tokens.PASSWORD : { read(); boolean isDigest = false; if (readIfThis(Tokens.DIGEST)) { isDigest = Boolean.TRUE; } password = readPassword(); Object[] args = new Object[] { userObject, password, isDigest }; Statement cs = new StatementCommand(StatementTypes.SET_USER_PASSWORD, args); String sql = userObject.getSetPasswordDigestSQL(); cs.setSQL(sql); return cs; } case Tokens.INITIAL : { read(); readThis(Tokens.SCHEMA); HsqlName schemaName; if (token.tokenType == Tokens.DEFAULT) { schemaName = null; } else { schemaName = database.schemaManager.getSchemaHsqlName( token.tokenString); } read(); Object[] args = new Object[] { userObject, schemaName }; return new StatementCommand( StatementTypes.SET_USER_INITIAL_SCHEMA, args); } default : { throw unexpectedToken(); } } } Statement compileAlterDomain() { read(); HsqlName schema = session.getSchemaHsqlName(token.namePrefix); checkSchemaUpdateAuthorisation(schema); Type domain = database.schemaManager.getDomain(token.tokenString, schema.name, true); read(); switch (token.tokenType) { case Tokens.RENAME : { read(); readThis(Tokens.TO); return compileRenameObject(domain.getName(), SchemaObject.DOMAIN); } case Tokens.DROP : { read(); if (token.tokenType == Tokens.DEFAULT) { read(); String sql = this.getLastPart(); Object[] args = new Object[] { StatementTypes.DROP_DEFAULT, domain }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( domain.getName()); return new StatementSchema(sql, StatementTypes.ALTER_DOMAIN, args, null, writeLockNames); } else if (token.tokenType == Tokens.CONSTRAINT) { read(); checkIsSchemaObjectName(); HsqlName name = database.schemaManager.getSchemaObjectName( domain.getSchemaName(), token.tokenString, SchemaObject.CONSTRAINT, true); read(); String sql = this.getLastPart(); Object[] args = new Object[] { StatementTypes.DROP_CONSTRAINT, domain, name }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( domain.getName()); return new StatementSchema(sql, StatementTypes.ALTER_DOMAIN, args, null, writeLockNames); } else { throw unexpectedToken(); } } case Tokens.SET : { read(); readThis(Tokens.DEFAULT); Expression e = readDefaultClause(domain); String sql = this.getLastPart(); Object[] args = new Object[] { StatementTypes.ADD_DEFAULT, domain, e }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( domain.getName()); return new StatementSchema(sql, StatementTypes.ALTER_DOMAIN, args, null, writeLockNames); } case Tokens.ADD : { read(); if (token.tokenType == Tokens.CONSTRAINT || token.tokenType == Tokens.CHECK) { HsqlArrayList tempConstraints = new HsqlArrayList(); compileContext.currentDomain = domain; readConstraint(domain, tempConstraints); compileContext.currentDomain = null; Constraint c = (Constraint) tempConstraints.get(0); String sql = this.getLastPart(); Object[] args = new Object[] { StatementTypes.ADD_CONSTRAINT, domain, c }; HsqlName[] writeLockNames = database.schemaManager.getCatalogAndBaseTableNames( domain.getName()); return new StatementSchema(sql, StatementTypes.ALTER_DOMAIN, args, null, writeLockNames); } } } throw unexpectedToken(); } private boolean isGrantToken() { switch (token.tokenType) { case Tokens.ALL : case Tokens.INSERT : case Tokens.UPDATE : case Tokens.SELECT : case Tokens.DELETE : case Tokens.USAGE : case Tokens.EXECUTE : case Tokens.REFERENCES : return true; default : return false; } } StatementSchema compileGrantOrRevoke() { boolean grant = token.tokenType == Tokens.GRANT; read(); if (isGrantToken() || (!grant && (token.tokenType == Tokens.GRANT || token.tokenType == Tokens.HIERARCHY))) { return compileRightGrantOrRevoke(grant); } else { return compileRoleGrantOrRevoke(grant); } } private StatementSchema compileRightGrantOrRevoke(boolean grant) { OrderedHashSet granteeList = new OrderedHashSet(); Grantee grantor = null; Right right = null; // SchemaObject schemaObject; HsqlName objectName = null; boolean isTable = false; boolean isUsage = false; boolean isExec = false; boolean isAll = false; boolean isGrantOption = false; boolean cascade = false; if (!grant) { if (token.tokenType == Tokens.GRANT) { read(); readThis(Tokens.OPTION); readThis(Tokens.FOR); isGrantOption = true; } else if (token.tokenType == Tokens.HIERARCHY) { throw unsupportedFeature(); /* read(); readThis(Token.OPTION); readThis(Token.FOR); */ } } // ALL means all the rights the grantor can grant if (token.tokenType == Tokens.ALL) { read(); if (token.tokenType == Tokens.PRIVILEGES) { read(); } right = Right.fullRights; isAll = true; } else { right = new Right(); boolean loop = true; while (loop) { checkIsNotQuoted(); int rightType = GranteeManager.getCheckSingleRight(token.tokenString); int grantType = token.tokenType; OrderedHashSet columnSet = null; read(); switch (grantType) { case Tokens.REFERENCES : case Tokens.SELECT : case Tokens.INSERT : case Tokens.UPDATE : if (token.tokenType == Tokens.OPENBRACKET) { columnSet = readColumnNames(false); } // fall through case Tokens.TRIGGER : if (right == null) { right = new Right(); } right.set(rightType, columnSet); isTable = true; break; case Tokens.DELETE : if (right == null) { right = new Right(); } right.set(rightType, null); isTable = true; break; case Tokens.USAGE : if (isTable) { throw unexpectedToken(); } right = Right.fullRights; isUsage = true; loop = false; continue; case Tokens.EXECUTE : if (isTable) { throw unexpectedToken(); } right = Right.fullRights; isExec = true; loop = false; continue; } if (token.tokenType == Tokens.COMMA) { read(); continue; } break; } } readThis(Tokens.ON); int objectType = 0; switch (token.tokenType) { case Tokens.CLASS : if (!isExec && !isAll) { throw unexpectedToken(); } read(); if (!isSimpleName() || !isDelimitedIdentifier()) { throw Error.error(ErrorCode.X_42569); } objectType = SchemaObject.FUNCTION; objectName = readNewSchemaObjectName(SchemaObject.FUNCTION, false); break; case Tokens.SPECIFIC : { if (!isExec && !isAll) { throw unexpectedToken(); } read(); switch (token.tokenType) { case Tokens.ROUTINE : case Tokens.PROCEDURE : case Tokens.FUNCTION : read(); break; default : throw unexpectedToken(); } objectType = SchemaObject.SPECIFIC_ROUTINE; break; } case Tokens.FUNCTION : if (!isExec && !isAll) { throw unexpectedToken(); } read(); objectType = SchemaObject.FUNCTION; break; case Tokens.PROCEDURE : if (!isExec && !isAll) { throw unexpectedToken(); } read(); objectType = SchemaObject.PROCEDURE; break; case Tokens.ROUTINE : if (!isExec && !isAll) { throw unexpectedToken(); } read(); objectType = SchemaObject.ROUTINE; break; case Tokens.TYPE : if (!isUsage && !isAll) { throw unexpectedToken(); } read(); objectType = SchemaObject.TYPE; break; case Tokens.DOMAIN : if (!isUsage && !isAll) { throw unexpectedToken(); } read(); objectType = SchemaObject.DOMAIN; break; case Tokens.SEQUENCE : if (!isUsage && !isAll) { throw unexpectedToken(); } read(); objectType = SchemaObject.SEQUENCE; break; case Tokens.CHARACTER : if (!isUsage && !isAll) { throw unexpectedToken(); } read(); readThis(Tokens.SET); objectType = SchemaObject.CHARSET; break; case Tokens.TABLE : default : if (!isTable && !isAll) { throw unexpectedToken(); } readIfThis(Tokens.TABLE); objectType = SchemaObject.TABLE; } objectName = readNewSchemaObjectName(objectType, false); if (grant) { readThis(Tokens.TO); } else { readThis(Tokens.FROM); } while (true) { checkIsSimpleName(); granteeList.add(token.tokenString); read(); if (token.tokenType == Tokens.COMMA) { read(); } else { break; } } if (grant) { if (token.tokenType == Tokens.WITH) { read(); readThis(Tokens.GRANT); readThis(Tokens.OPTION); isGrantOption = true; } /** @todo - implement */ if (token.tokenType == Tokens.GRANTED) { read(); readThis(Tokens.BY); if (token.tokenType == Tokens.CURRENT_USER) { read(); // } else { readThis(Tokens.CURRENT_ROLE); if (session.getRole() == null) { throw Error.error(ErrorCode.X_0P000); } grantor = session.getRole(); } } } else { if (token.tokenType == Tokens.CASCADE) { cascade = true; read(); } else { readThis(Tokens.RESTRICT); } } String sql = getLastPart(); int type = grant ? StatementTypes.GRANT : StatementTypes.REVOKE; Object[] args = new Object[] { granteeList, objectName, right, grantor, Boolean.valueOf(cascade), Boolean.valueOf(isGrantOption) }; HsqlName[] writeLockNames = database.schemaManager.getCatalogNameArray(); StatementSchema cs = new StatementSchema(sql, type, args, null, writeLockNames); return cs; } private StatementSchema compileRoleGrantOrRevoke(boolean grant) { Grantee grantor = session.getGrantee(); OrderedHashSet roleList = new OrderedHashSet(); OrderedHashSet granteeList = new OrderedHashSet(); boolean cascade = false; if (!grant && token.tokenType == Tokens.ADMIN) { throw unsupportedFeature(); /* read(); readThis(Token.OPTION); readThis(Token.FOR); */ } while (true) { checkIsSimpleName(); roleList.add(token.tokenString); read(); if (token.tokenType == Tokens.COMMA) { read(); continue; } break; } if (grant) { readThis(Tokens.TO); } else { readThis(Tokens.FROM); } while (true) { checkIsSimpleName(); granteeList.add(token.tokenString); read(); if (token.tokenType == Tokens.COMMA) { read(); } else { break; } } if (grant) { if (token.tokenType == Tokens.WITH) { throw unsupportedFeature(); /* read(); readThis(Token.ADMIN); readThis(Token.OPTION); */ } } if (token.tokenType == Tokens.GRANTED) { read(); readThis(Tokens.BY); if (token.tokenType == Tokens.CURRENT_USER) { read(); // } else { readThis(Tokens.CURRENT_ROLE); if (session.getRole() == null) { throw Error.error(ErrorCode.X_0P000); } grantor = session.getRole(); } } if (!grant) { if (token.tokenType == Tokens.CASCADE) { cascade = true; read(); } else { readThis(Tokens.RESTRICT); } } String sql = getLastPart(); int type = grant ? StatementTypes.GRANT_ROLE : StatementTypes.REVOKE_ROLE; Object[] args = new Object[] { granteeList, roleList, grantor, Boolean.valueOf(cascade) }; HsqlName[] writeLockNames = database.schemaManager.getCatalogNameArray(); StatementSchema cs = new StatementSchema(sql, type, args, null, writeLockNames); return cs; } void checkSchemaUpdateAuthorisation(HsqlName schema) { if (session.isProcessingLog) { return; } SqlInvariants.checkSchemaNameNotSystem(schema.name); if (isSchemaDefinition) { if (schema != session.getCurrentSchemaHsqlName()) { throw Error.error(ErrorCode.X_42505); } } else { session.getGrantee().checkSchemaUpdateOrGrantRights(schema.name); } session.checkDDLWrite(); } void checkDatabaseUpdateAuthorisation() { session.checkAdmin(); session.checkDDLWrite(); } StatementSchema compileComment() { HsqlName name; int type; readThis(Tokens.COMMENT); readThis(Tokens.ON); switch (token.tokenType) { case Tokens.ROUTINE : case Tokens.TABLE : { type = token.tokenType == Tokens.ROUTINE ? SchemaObject.ROUTINE : SchemaObject.TABLE; read(); checkIsSchemaObjectName(); name = database.nameManager.newHsqlName(token.tokenString, token.isDelimitedIdentifier, type); if (token.namePrefix == null) { name.schema = session.getCurrentSchemaHsqlName(); } else { name.schema = database.nameManager.newHsqlName( token.namePrefix, token.isDelimitedPrefix, SchemaObject.SCHEMA); } read(); break; } case Tokens.COLUMN : { read(); checkIsSchemaObjectName(); name = database.nameManager.newHsqlName(token.tokenString, token.isDelimitedIdentifier, SchemaObject.COLUMN); if (token.namePrefix == null) { throw Error.error(ErrorCode.X_42501); } name.parent = database.nameManager.newHsqlName(token.namePrefix, token.isDelimitedPrefix, SchemaObject.TABLE); if (token.namePrePrefix == null) { name.parent.schema = session.getCurrentSchemaHsqlName(); } else { name.parent.schema = database.nameManager.newHsqlName( token.namePrePrefix, token.isDelimitedPrePrefix, SchemaObject.TABLE); } read(); break; } default : throw unexpectedToken(); } readThis(Tokens.IS); String comment = readQuotedString(); Object[] arguments = new Object[] { name, comment }; return new StatementSchema(null, StatementTypes.COMMENT, arguments); } Statement compileAlterSession() { read(); session.checkAdmin(); if (token.tokenType == Tokens.RESET) { read(); int action = token.tokenType; switch (token.tokenType) { case Tokens.ALL : read(); break; case Tokens.RESULT : read(); readThis(Tokens.SETS); break; case Tokens.TABLE : read(); readThis(Tokens.DATA); break; default : throw unexpectedTokenRequire(Tokens.T_ALL + ',' + Tokens.T_RESULT + ',' + Tokens.T_TABLE); } Object[] args = new Object[] { Long.valueOf(session.getId()), Integer.valueOf(action) }; return new StatementCommand(StatementTypes.ALTER_SESSION, args); } long sessionID = readBigint(); Session targetSession = database.sessionManager.getSession(sessionID); if (targetSession == null) { throw Error.error(ErrorCode.X_2E000); } int action = token.tokenType; switch (token.tokenType) { case Tokens.CLOSE : read(); break; case Tokens.RELEASE : read(); break; default : throw unexpectedToken(); } Object[] args = new Object[] { Long.valueOf(sessionID), Integer.valueOf(action) }; return new StatementCommand(StatementTypes.ALTER_SESSION, args); } /** * Retrieves boolean value corresponding to the next token. * * @return true if next token is "TRUE"; false if next token is "FALSE" * @throws HsqlException if the next token is neither "TRUE" or "FALSE" */ boolean processTrueOrFalse() { if (token.namePrefix != null) { throw unexpectedToken(); } if (token.tokenType == Tokens.TRUE) { read(); return true; } else if (token.tokenType == Tokens.FALSE) { read(); return false; } else { throw unexpectedToken(); } } Boolean processTrueOrFalseObject() { return Boolean.valueOf(processTrueOrFalse()); } void checkSchemaUpdateAuthorisation(Session session, HsqlName schema) { if (session.isProcessingLog) { return; } if (SqlInvariants.isSystemSchemaName(schema.name)) { throw Error.error(ErrorCode.X_42503); } if (session.parser.isSchemaDefinition) { if (schema == session.getCurrentSchemaHsqlName()) { return; } Error.error(ErrorCode.X_42505, schema.name); } session.getGrantee().checkSchemaUpdateOrGrantRights(schema.name); session.checkDDLWrite(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/View.java0000644000175000017500000002066412007547362020531 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.OrderedHashSet; // fredt@users 20020420 - patch523880 by leptipre@users - VIEW support - modified // fredt@users 20031227 - remimplementated as compiled query /** * Represents an SQL VIEW based on a query expression * * @author leptipre@users * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.0 */ public class View extends TableDerived { private String statement; // private HsqlName[] columnNames; /** * Names of SCHEMA objects referenced in VIEW */ private OrderedHashSet schemaObjectNames; /** * check option */ private int checkOption; // private Table baseTable; // boolean isTriggerInsertable; boolean isTriggerUpdatable; boolean isTriggerDeletable; View(Database db, HsqlName name, HsqlName[] columnNames, int check) { super(db, name, TableBase.VIEW_TABLE); this.columnNames = columnNames; this.checkOption = check; } public int getType() { return SchemaObject.VIEW; } public OrderedHashSet getReferences() { return schemaObjectNames; } public OrderedHashSet getComponents() { return null; } /** * Compiles the query expression and sets up the columns. */ public void compile(Session session, SchemaObject parentObject) { ParserDQL p = new ParserDQL(session, new Scanner(statement)); p.read(); TableDerived viewSubQueryTable = p.XreadViewSubqueryTable(this, true); queryExpression = viewSubQueryTable.queryExpression; if (getColumnCount() == 0) { if (columnNames == null) { columnNames = viewSubQueryTable.queryExpression.getResultColumnNames(); } if (columnNames.length != viewSubQueryTable.queryExpression.getColumnCount()) { throw Error.error(ErrorCode.X_42593, getName().statementName); } TableUtil.setColumnsInSchemaTable( this, columnNames, queryExpression.getColumnTypes()); } // schemaObjectNames = p.compileContext.getSchemaObjectNames(); canRecompile = true; baseTable = queryExpression.getBaseTable(); if (baseTable == null) { return; } switch (checkOption) { case SchemaObject.ViewCheckModes.CHECK_NONE : case SchemaObject.ViewCheckModes.CHECK_LOCAL : case SchemaObject.ViewCheckModes.CHECK_CASCADE : break; default : throw Error.runtimeError(ErrorCode.U_S0500, "View"); } } public String getSQL() { StringBuffer sb = new StringBuffer(128); sb.append(Tokens.T_CREATE).append(' ').append(Tokens.T_VIEW); sb.append(' '); sb.append(getName().getSchemaQualifiedStatementName()).append(' '); sb.append('('); int count = getColumnCount(); for (int j = 0; j < count; j++) { sb.append(getColumn(j).getName().statementName); if (j < count - 1) { sb.append(','); } } sb.append(')').append(' ').append(Tokens.T_AS).append(' '); sb.append(getStatement()); return sb.toString(); } public int[] getUpdatableColumns() { return queryExpression.getBaseTableColumnMap(); } public boolean isTriggerInsertable() { return isTriggerInsertable; } public boolean isTriggerUpdatable() { return isTriggerUpdatable; } public boolean isTriggerDeletable() { return isTriggerDeletable; } public boolean isInsertable() { return isTriggerInsertable ? false : super.isInsertable(); } public boolean isUpdatable() { return isTriggerUpdatable ? false : super.isUpdatable(); } void addTrigger(TriggerDef td, HsqlName otherName) { switch (td.operationType) { case StatementTypes.INSERT : if (isTriggerInsertable) { throw Error.error(ErrorCode.X_42538); } isTriggerInsertable = true; break; case StatementTypes.DELETE_WHERE : if (isTriggerDeletable) { throw Error.error(ErrorCode.X_42538); } isTriggerDeletable = true; break; case StatementTypes.UPDATE_WHERE : if (isTriggerUpdatable) { throw Error.error(ErrorCode.X_42538); } isTriggerUpdatable = true; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "View"); } super.addTrigger(td, otherName); } void removeTrigger(TriggerDef td) { switch (td.operationType) { case StatementTypes.INSERT : isTriggerInsertable = false; break; case StatementTypes.DELETE_WHERE : isTriggerDeletable = false; break; case StatementTypes.UPDATE_WHERE : isTriggerUpdatable = false; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "View"); } super.removeTrigger(td); } /** * Overridden to disable SET TABLE READONLY DDL for View objects. */ public void setDataReadOnly(boolean value) { throw Error.error(ErrorCode.X_28000); } public int getCheckOption() { return checkOption; } /** * Returns the query expression for the view. */ public String getStatement() { return statement; } public void setStatement(String sql) { statement = sql; } public TableDerived newDerivedTable(Session session) { TableDerived td; if (isRecompiled()) { ParserDQL p = new ParserDQL(session, new Scanner(statement)); p.reset(statement, session.parser.compileContext.getRangeVarCount()); p.read(); td = p.XreadViewSubqueryTable(this, false); session.parser.compileContext.setNextRangeVarIndex( p.compileContext.getRangeVarCount());; } else { td = new TableDerived(database, tableName, TableBase.VIEW_TABLE, queryExpression, null, OpTypes.NONE, 1); td.columnList = columnList; td.columnCount = columnList.size(); td.createPrimaryKey(); td.triggerList = triggerList; td.triggerLists = triggerLists; } return td; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/0000755000175000017500000000000012007570424017505 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HsqlByteArrayInputStream.java0000644000175000017500000001517412007547400025304 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.DataInput; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; /** * This class is a replacement for both java.io.ByteArrayInputStream * (without synchronization) and java.io.DataInputStream * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public class HsqlByteArrayInputStream extends InputStream implements DataInput { protected byte[] buffer; protected int pos; protected int mark = 0; protected int count; public HsqlByteArrayInputStream(byte[] buf) { this.buffer = buf; this.pos = 0; this.count = buf.length; } public HsqlByteArrayInputStream(byte[] buf, int offset, int length) { this.buffer = buf; this.pos = offset; this.count = Math.min(offset + length, buf.length); this.mark = offset; } // methods that implement java.io.DataInput public final void readFully(byte[] b) throws IOException { readFully(b, 0, b.length); } public final void readFully(byte[] b, int off, int len) throws IOException { if (len < 0) { throw new IndexOutOfBoundsException(); } int n = 0; while (n < len) { int count = read(b, off + n, len - n); if (count < 0) { throw new EOFException(); } n += count; } } public final boolean readBoolean() throws IOException { int ch = read(); if (ch < 0) { throw new EOFException(); } return (ch != 0); } public final byte readByte() throws IOException { int ch = read(); if (ch < 0) { throw new EOFException(); } return (byte) ch; } public final int readUnsignedByte() throws IOException { int ch = read(); if (ch < 0) { throw new EOFException(); } return ch; } public short readShort() throws IOException { if (count - pos < 2) { pos = count; throw new EOFException(); } int ch1 = buffer[pos++] & 0xff; int ch2 = buffer[pos++] & 0xff; return (short) ((ch1 << 8) + (ch2)); } public final int readUnsignedShort() throws IOException { int ch1 = read(); int ch2 = read(); if ((ch1 | ch2) < 0) { throw new EOFException(); } return (ch1 << 8) + (ch2); } public final char readChar() throws IOException { int ch1 = read(); int ch2 = read(); if ((ch1 | ch2) < 0) { throw new EOFException(); } return (char) ((ch1 << 8) + (ch2)); } public int readInt() throws IOException { if (count - pos < 4) { pos = count; throw new EOFException(); } int ch1 = buffer[pos++] & 0xff; int ch2 = buffer[pos++] & 0xff; int ch3 = buffer[pos++] & 0xff; int ch4 = buffer[pos++] & 0xff; return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4)); } public long readLong() throws IOException { return (((long) readInt()) << 32) + (((long) readInt()) & 0xffffffffL); } public final float readFloat() throws IOException { return Float.intBitsToFloat(readInt()); } public final double readDouble() throws IOException { return Double.longBitsToDouble(readLong()); } public int skipBytes(int n) throws IOException { return (int) skip(n); } public String readLine() throws IOException { /** @todo: this will probably be useful */ throw new java.lang.RuntimeException("not implemented."); } public String readUTF() throws IOException { int bytecount = readUnsignedShort(); if (pos + bytecount >= count) { throw new EOFException(); } String result = StringConverter.readUTF(buffer, pos, bytecount); pos += bytecount; return result; } // methods that extend java.io.InputStream public int read() { return (pos < count) ? (buffer[pos++] & 0xff) : -1; } public int read(byte[] b, int off, int len) { if (pos >= count) { return -1; } if (pos + len > count) { len = count - pos; } if (len <= 0) { return 0; } System.arraycopy(buffer, pos, b, off, len); pos += len; return len; } public long skip(long n) { if (pos + n > count) { n = count - pos; } if (n < 0) { return 0; } pos += n; return n; } public int available() { return count - pos; } public boolean markSupported() { return true; } public void mark(int readAheadLimit) { mark = pos; } public void reset() { pos = mark; } public void close() throws IOException {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/IntLookup.java0000644000175000017500000000360412007547400022275 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.8.0 */ public interface IntLookup { int add(int key, int value); int lookup(int key) throws NoSuchElementException; int lookup(int key, int def); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/FileUtil.java0000644000175000017500000004230412007547402022070 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.Random; import org.hsqldb.lib.java.JavaSystem; /** * A collection of file management methods.

* Also provides the default FileAccess implementation * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @author Ocke Janssen oj@openoffice.org * @version 2.1.1 * @since 1.7.2 */ public class FileUtil implements FileAccess { private static FileUtil fileUtil = new FileUtil(); private static FileAccessRes fileAccessRes = new FileAccessRes(); /** Creates a new instance of FileUtil */ FileUtil() {} public static FileUtil getFileUtil() { return fileUtil; } public static FileAccess getFileAccess(boolean isResource) { return isResource ? (FileAccess) fileAccessRes : (FileAccess) fileUtil; } public boolean isStreamElement(java.lang.String elementName) { return (new File(elementName)).exists(); } public InputStream openInputStreamElement(java.lang.String streamName) throws java.io.IOException { try { return new FileInputStream(new File(streamName)); } catch (Throwable e) { throw JavaSystem.toIOException(e); } } public void createParentDirs(String filename) { makeParentDirectories(new File(filename)); } public void removeElement(String filename) { if (isStreamElement(filename)) { delete(filename); } } public void renameElement(java.lang.String oldName, java.lang.String newName) { renameWithOverwrite(oldName, newName); } public java.io.OutputStream openOutputStreamElement( java.lang.String streamName) throws java.io.IOException { return new FileOutputStream(new File(streamName)); } // end of FileAccess implementation // a new File("...")'s path is not canonicalized, only resolved // and normalized (e.g. redundant separator chars removed), // so as of JDK 1.4.2, this is a valid test for case insensitivity, // at least when it is assumed that we are dealing with a configuration // that only needs to consider the host platform's native file system, // even if, unlike for File.getCanonicalPath(), (new File("a")).exists() or // (new File("A")).exits(), regardless of the hosting system's // file path case sensitivity policy. public final boolean fsIsIgnoreCase = (new File("A")).equals(new File("a")); // posix separator normalized to File.separator? // CHECKME: is this true for every file system under Java? public final boolean fsNormalizesPosixSeparator = (new File("/")).getPath().endsWith(File.separator); // for JDK 1.1 createTempFile final Random random = new Random(System.currentTimeMillis()); /** * Delete the named file */ public boolean delete(String filename) { return (new File(filename)).delete(); } /** * Requests, in a JDK 1.1 compliant way, that the file or directory denoted * by the given abstract pathname be deleted when the virtual machine * terminates.

* * Deletion will be attempted only for JDK 1.2 and greater runtime * environments and only upon normal termination of the virtual * machine, as defined by the Java Language Specification.

* * Once deletion has been sucessfully requested, it is not possible to * cancel the request. This method should therefore be used with care.

* * @param f the abstract pathname of the file be deleted when the virtual * machine terminates */ public void deleteOnExit(File f) { JavaSystem.deleteOnExit(f); } /** * Return true or false based on whether the named file exists. */ public boolean exists(String filename) { return (new File(filename)).exists(); } public boolean exists(String fileName, boolean resource, Class cla) { if (fileName == null || fileName.length() == 0) { return false; } return resource ? null != cla.getResource(fileName) : FileUtil.getFileUtil().exists(fileName); } /** * Rename the file with oldname to newname. If a file with newname already * exists, it is deleted before the renaming operation proceeds. * * If a file with oldname does not exist, no file will exist after the * operation. */ private boolean renameWithOverwrite(String oldname, String newname) { File file = new File(oldname); delete(newname); boolean renamed = file.renameTo(new File(newname)); if (renamed) { return true; } System.gc(); delete(newname); if (exists(newname)) { new File(newname).renameTo(new File(newDiscardFileName(newname))); } return file.renameTo(new File(newname)); } /** * Retrieves the absolute path, given some path specification. * * @param path the path for which to retrieve the absolute path * @return the absolute path */ public String absolutePath(String path) { return (new File(path)).getAbsolutePath(); } /** * Retrieves the canonical file for the given file, in a * JDK 1.1 complaint way. * * @param f the File for which to retrieve the absolute File * @return the canonical File */ public File canonicalFile(File f) throws IOException { return new File(f.getCanonicalPath()); } /** * Retrieves the canonical file for the given path, in a * JDK 1.1 complaint way. * * @param path the path for which to retrieve the canonical File * @return the canonical File */ public File canonicalFile(String path) throws IOException { return new File(new File(path).getCanonicalPath()); } /** * Retrieves the canonical path for the given File, in a * JDK 1.1 complaint way. * * @param f the File for which to retrieve the canonical path * @return the canonical path */ public String canonicalPath(File f) throws IOException { return f.getCanonicalPath(); } /** * Retrieves the canonical path for the given path, in a * JDK 1.1 complaint way. * * @param path the path for which to retrieve the canonical path * @return the canonical path */ public String canonicalPath(String path) throws IOException { return new File(path).getCanonicalPath(); } /** * Retrieves the canonical path for the given path, or the absolute * path if attemting to retrieve the canonical path fails. * * @param path the path for which to retrieve the canonical or * absolute path * @return the canonical or absolute path */ public String canonicalOrAbsolutePath(String path) { try { return canonicalPath(path); } catch (Exception e) { return absolutePath(path); } } public void makeParentDirectories(File f) { String parent = f.getParent(); if (parent != null) { new File(parent).mkdirs(); } else { // workaround for jdk 1.1 bug (returns null when there is a parent) parent = f.getPath(); int index = parent.lastIndexOf('/'); if (index > 0) { parent = parent.substring(0, index); new File(parent).mkdirs(); } } } public static String makeDirectories(String path) { try { File file = new File(path); file.mkdirs(); return file.getCanonicalPath(); } catch (IOException e) { return null; } } public FileAccess.FileSync getFileSync(java.io.OutputStream os) throws java.io.IOException { return new FileSync((FileOutputStream) os); } public static class FileSync implements FileAccess.FileSync { FileDescriptor outDescriptor; FileSync(FileOutputStream os) throws IOException { outDescriptor = os.getFD(); } public void sync() throws IOException { outDescriptor.sync(); } } public static class FileAccessRes implements FileAccess { public boolean isStreamElement(String fileName) { URL url = null; try { url = getClass().getResource(fileName); if (url == null) { ClassLoader cl = Thread.currentThread().getContextClassLoader(); if (cl != null) { url = cl.getResource(fileName); } } } catch (Throwable t) { // } return url != null; } public InputStream openInputStreamElement(final String fileName) throws IOException { InputStream fis = null; try { fis = getClass().getResourceAsStream(fileName); if (fis == null) { ClassLoader cl = Thread.currentThread().getContextClassLoader(); if (cl != null) { fis = cl.getResourceAsStream(fileName); } } } catch (Throwable t) { // } finally { if (fis == null) { throw new FileNotFoundException(fileName); } } return fis; } public void createParentDirs(java.lang.String filename) {} public void removeElement(java.lang.String filename) {} public void renameElement(java.lang.String oldName, java.lang.String newName) {} public java.io.OutputStream openOutputStreamElement(String streamName) throws IOException { throw new IOException(); } public FileAccess.FileSync getFileSync(OutputStream os) throws IOException { throw new IOException(); } } /** * Utility method for user applications. Attempts to delete all the files * for the database as listed by the getDatabaseFileList() method. If any * of the current, main database files cannot be deleted, it is renamed * by adding a suffixe containting a hexadecimal timestamp portion and * the ".old" extension. Also deletes the ".tmp" directory. * * @param path full path or name of database (without a file extension) * @return currently always true */ public static boolean deleteOrRenameDatabaseFiles(String path) { DatabaseFilenameFilter filter = new DatabaseFilenameFilter(path); File[] fileList = filter.getExistingFileListInDirectory(); for (int i = 0; i < fileList.length; i++) { fileList[i].delete(); } File tempDir = new File(filter.canonicalFile.getPath() + ".tmp"); if (tempDir.isDirectory()) { File[] tempList = tempDir.listFiles(); for (int i = 0; i < tempList.length; i++) { tempList[i].delete(); } tempDir.delete(); } fileList = filter.getExistingMainFileSetList(); if (fileList.length == 0) { return true; } System.gc(); for (int i = 0; i < fileList.length; i++) { fileList[i].delete(); } fileList = filter.getExistingMainFileSetList(); for (int i = 0; i < fileList.length; i++) { fileList[i].renameTo( new File(newDiscardFileName(fileList[i].getPath()))); } return true; } /** * Utility method for user applications. Returns a list of files that * currently exist for a database. The list includes current database files * as well as ".new", and ".old" versions of the files. * * @param path full path or name of database (without a file extension) */ public static File[] getDatabaseFileList(String path) { DatabaseFilenameFilter filter = new DatabaseFilenameFilter(path); return filter.getExistingFileListInDirectory(); } public static String newDiscardFileName(String filename) { String timestamp = StringUtil.toPaddedString( Integer.toHexString((int) System.currentTimeMillis()), 8, '0', true); String discardName = filename + "." + timestamp + ".old"; return discardName; } static class DatabaseFilenameFilter implements FilenameFilter { String[] suffixes = new String[] { ".backup", ".properties", ".script", ".data", ".log", ".lck", ".lobs", ".sql.log", ".app.log" }; private String dbName; private File parent; private File canonicalFile; DatabaseFilenameFilter(String dbName) { this.dbName = dbName; canonicalFile = new File(dbName); try { canonicalFile = canonicalFile.getCanonicalFile(); } catch (Exception e) {} parent = canonicalFile.getParentFile(); } public File[] getCompleteMainFileSetList() { File[] fileList = new File[suffixes.length]; for (int i = 0; i < suffixes.length; i++) { fileList[i] = new File(canonicalFile.getPath() + suffixes[i]); } return fileList; } public File[] getExistingMainFileSetList() { File[] fileList = getCompleteMainFileSetList(); HsqlArrayList list = new HsqlArrayList(); for (int i = 0; i < fileList.length; i++) { if (fileList[i].exists()) { list.add(fileList[i]); } } fileList = new File[list.size()]; list.toArray(fileList); return fileList; } public File[] getExistingFileListInDirectory() { File[] list = parent.listFiles(this); return list == null ? new File[]{} : list; } /** * Accepts all main files as well as ".new" and ".old" versions. */ public boolean accept(File dir, String name) { if (parent.equals(dir) && name.indexOf(dbName) == 0) { String suffix = name.substring(dbName.length()); for (int i = 0; i < suffixes.length; i++) { if (suffix.equals(suffixes[i])) { return true; } if (suffix.startsWith(suffixes[i])) { if (suffix.length() == suffixes[i].length()) { return true; } if (name.endsWith(".new")) { if (suffix.length() == suffixes[i].length() + 4) { return true; } } else if (name.endsWith(".old")) { if (suffix.length() == suffixes[i].length() + 9 + 4) { return true; } } } } } return false; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/MD5.java0000644000175000017500000001641512007547400020742 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * Provides a static utility interface to an MD5 digest algorithm * obtained through the java.security.MessageDigest spi.

* * Database end-users may wish to access the services of this class * to provide, for instance, application user lookup tables with * one-way password encryption. For example:

* *

 * -- DDL
 * CREATE TABLE USERS(UID INTEGER IDENTITY, UNAME VARCHAR, UPASS VARCHAR, UNIQUE(UNAME))
 * CREATE FUNCTION MD5(VARCHAR(100)) RETURNS VARCHAR(16) LANGUAGE JAVA EXTERNAL NAME "org.hsqldb.lib.MD5.encode"
 *
 * -- DML & DQL
 * INSERT INTO USERS(UNAME, UPASS) VALUES('joe', MD5('passwd'))
 * UPDATE USERS SET UPASS = MD5('newpasswd') WHERE UNAME = 'joe' AND UPASS = MD5('oldpasswd')
 * SELECT UID FROM USERS WHERE UNAME = 'joe' AND UPASS = MD5('logonpasswd')
 * 
* * NOTE:

* * Although it is possible that a particular JVM / application installation may * encounter NoSuchAlgorithmException when attempting to get a jce MD5 message * digest generator, the likelyhood is very small for almost all JDK/JRE 1.1 * and later JVM implementations, as the Sun java.security package has come, * by default, with a jce MD5 message digest generator since JDK 1.1 was * released. The HSLQLDB project could have provided an MD5 implementation to * guarantee presence, but this class is much more lightweight and still allows * clients to install / use custom implementations through the * java.security.MessageDigest spi, for instance if there is no service * provided by default under the target JVM of choice or if a client has * developed / provides, say, a faster MD5 message digest implementation. * In short, this class is a convenience that allows HSQLDB SQL Function and * Stored Procedure style access to any underlying MD5 message digest algorithm * obtained via the java.security.MessageDigest spi * * @author boucherb@users.sourceforge.net * @version 2.0.1 * @since 1.9.0 */ public final class MD5 { /** * The jce MD5 message digest generator. */ private static MessageDigest md5; /** * Retrieves a hexidecimal character sequence representing the MD5 * digest of the specified character sequence, using the specified * encoding to first convert the character sequence into a byte sequence. * If the specified encoding is null, then ISO-8859-1 is assumed * * @param string the string to encode. * @param encoding the encoding used to convert the string into the * byte sequence to submit for MD5 digest * @return a hexidecimal character sequence representing the MD5 * digest of the specified string * @throws HsqlUnsupportedOperationException if an MD5 digest * algorithm is not available through the * java.security.MessageDigest spi or the requested * encoding is not available */ public static final String encode(String string, String encoding) throws RuntimeException { return StringConverter.byteArrayToHexString(digest(string, encoding)); } /** * Retrieves a hexidecimal character sequence representing the MD5 * digest of the specified character sequence, using the ISO-8859-1 * encoding * * @param string the string to encode. * @return a hexidecimal character sequence representing the MD5 * digest of the specified string * @throws HsqlUnsupportedOperationException if an MD5 digest * algorithm is not available through the * java.security.MessageDigest spi */ public static final String digest(String string) throws RuntimeException { return encode(string, "ISO-8859-1"); } /** * Retrieves a byte sequence representing the MD5 digest of the * specified character sequence, using the specified encoding to * first convert the character sequence into a byte sequence. * If the specified encoding is null, then ISO-8859-1 is * assumed. * * @param string the string to digest. * @param encoding the character encoding. * @return the digest as an array of 16 bytes. * @throws HsqlUnsupportedOperationException if an MD5 digest * algorithm is not available through the * java.security.MessageDigest spi or the requested * encoding is not available */ public static final byte[] digest(String string, String encoding) throws RuntimeException { byte[] data; if (encoding == null) { encoding = "ISO-8859-1"; } try { data = string.getBytes(encoding); } catch (UnsupportedEncodingException x) { throw new RuntimeException(x.toString()); } return digest(data); } /** * Retrieves a byte sequence representing the MD5 digest of the * specified byte sequence. * * @param data the data to digest. * @return the MD5 digest as an array of 16 bytes. * @throws HsqlUnsupportedOperationException if an MD5 digest * algorithm is not available through the * java.security.MessageDigest spi */ public static final byte[] digest(byte[] data) throws RuntimeException { synchronized (MD5.class) { if (md5 == null) { try { md5 = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e.toString()); } } return md5.digest(data); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/OrderedLongKeyHashMap.java0000644000175000017500000001442412007547400024472 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import org.hsqldb.store.BaseHashMap; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public class OrderedLongKeyHashMap extends BaseHashMap { Set keySet; Collection values; public OrderedLongKeyHashMap() { this(8); } public OrderedLongKeyHashMap(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.longKeyOrValue, BaseHashMap.objectKeyOrValue, false); isList = true; } public OrderedLongKeyHashMap(int initialCapacity, boolean hasThirdValue) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.longKeyOrValue, BaseHashMap.objectKeyOrValue, false); objectKeyTable = new Object[objectValueTable.length]; isTwoObjectValue = true; isList = true; if (hasThirdValue) { objectValueTable2 = new Object[objectValueTable.length]; } minimizeOnEmpty = true; } public Object get(long key) { int lookup = getLookup(key); if (lookup != -1) { return objectValueTable[lookup]; } return null; } public Object getValueByIndex(int index) { return objectValueTable[index]; } public Object getSecondValueByIndex(int index) { return objectKeyTable[index]; } public Object getThirdValueByIndex(int index) { return objectValueTable2[index]; } public Object setSecondValueByIndex(int index, Object value) { Object oldValue = objectKeyTable[index]; objectKeyTable[index] = value; return oldValue; } public Object setThirdValueByIndex(int index, Object value) { Object oldValue = objectValueTable2[index]; objectValueTable2[index] = value; return oldValue; } public Object put(long key, Object value) { return super.addOrRemove(key, value, null, false); } public boolean containsValue(Object value) { return super.containsValue(value); } public Object remove(long key) { return super.addOrRemove(key, null, null, false); } public boolean containsKey(long key) { return super.containsKey(key); } /* methods for two object lookups */ public Object put(long key, Object valueOne, Object valueTwo) { return super.addOrRemove(key, valueOne, valueTwo, false); } public int getLookup(long key) { return super.getLookup(key); } public Object getFirstByLookup(int lookup) { if (lookup == -1) { return null; } return objectValueTable[lookup]; } public Set keySet() { if (keySet == null) { keySet = new KeySet(); } return keySet; } public Collection values() { if (values == null) { values = new Values(); } return values; } class KeySet implements Set { public Iterator iterator() { return OrderedLongKeyHashMap.this.new BaseHashIterator(true); } public int size() { return OrderedLongKeyHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public Object get(Object key) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { OrderedLongKeyHashMap.this.clear(); } } class Values implements Collection { public Iterator iterator() { return OrderedLongKeyHashMap.this.new BaseHashIterator(false); } public int size() { return OrderedLongKeyHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { OrderedLongKeyHashMap.this.clear(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HsqlThreadFactory.java0000644000175000017500000000754212007547402023747 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; /** * The default HSQLDB thread factory implementation. This factory can be * used to wrap other thread factories using the setImpl method, but, by * default simply produces new, vanilla thread objects constructed with * the supplied runnable object. * * @author boucherb@users * @version 1.7.2 * @since 1.7.2 */ class HsqlThreadFactory implements ThreadFactory { /** * The factory implementation. Typically, this will be the * HsqlThreadFactory object itself. */ protected ThreadFactory factory; /** * Constructs a new HsqlThreadFactory that uses itself as the factory * implementation. */ public HsqlThreadFactory() { this(null); } /** * Constructs a new HsqlThreadFactory whose retrieved threads come from the * specified ThreadFactory object or from this factory implementation, if' * the specified implementation is null. * * @param f the factory implementation this factory uses */ public HsqlThreadFactory(ThreadFactory f) { setImpl(f); } /** * Retreives a thread instance for running the specified Runnable * @param r The runnable that the retrieved thread handles * @return the requested thread inatance */ public Thread newThread(Runnable r) { return factory == this ? new Thread(r) : factory.newThread(r); } /** * Sets the factory implementation that this factory will use to * produce threads. If the specified argument, f, is null, then * this factory uses itself as the implementation. * * @param f the factory implementation that this factory will use * to produce threads * @return the previously installed factory implementation */ public synchronized ThreadFactory setImpl(ThreadFactory f) { ThreadFactory old; old = factory; factory = (f == null) ? this : f; return old; } /** * Retrieves the factory implementation that this factory is using * to produce threads. * * @return the factory implementation that this factory is using to produce * threads. */ public synchronized ThreadFactory getImpl() { return factory; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/0000755000175000017500000000000012007570424020273 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/PIFData.java0000644000175000017500000000760612007547402022357 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib.tar; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Pax Interchange Format object constituted from an Input Stream. *

* Right now, the only Pax property that we support directly is "size". *

*/ public class PIFData extends HashMap { static final long serialVersionUID = 3086795680582315773L; private static Pattern pifRecordPattern = Pattern.compile("\\d+ +([^=]+)=(.*)"); /** * N.b. this is nothing to do with HashMap.size() or Map.size(). * This returns the value of the Pax "size" property. */ public Long getSize() { return sizeObject; } private Long sizeObject = null; public PIFData(InputStream stream) throws TarMalformatException, IOException { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(stream, "UTF-8")); String s, k, v; Matcher m; int lineNum = 0; /* * Pax spec does not allow for blank lines, ignored white space, * nor comments of any type, in the file. */ while ((s = br.readLine()) != null) { lineNum++; m = pifRecordPattern.matcher(s); if (!m.matches()) { throw new TarMalformatException( RB.pif_malformat.getString(lineNum, s)); } k = m.group(1); v = m.group(2); if (v == null || v.length() < 1) { remove(k); } else { put(k, v); } } } finally { try { stream.close(); } finally { br = null; // Encourage buffer GC } } String sizeString = get("size"); if (sizeString != null) { try { sizeObject = Long.valueOf(sizeString); } catch (NumberFormatException nfe) { throw new TarMalformatException( RB.pif_malformat_size.getString(sizeString)); } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/TarMalformatException.java0000644000175000017500000000336712007547402025417 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib.tar; @SuppressWarnings("serial") public class TarMalformatException extends Exception { public TarMalformatException(String s) { super(s); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/rb_de.properties0000644000175000017500000001405712007547402023473 0ustar renerene# $Id: rb_de.properties 3375 2009-12-18 23:27:07Z unsaved $ # Default Locale String resources for TarGenerator. # IMPORTANT: Make sure to use ISO-8859-1 encoding for any extended characters, # both in this file (actually any .properties file) and all referenced text # files. # GENERAL .properties SYNTAX: # White space AT END OF LINES IS SIGNIFICANT # White space at beginning of lines is not # \ at very end of line makes the following line a continuation line (with # no implied newline in the value. # (Combined with the previous 2 rules, this means that white space before # this \ is significant, and whitespace at beginning of continutation lines # is not). # \n does not work as an escape. Use unicode \u000a for line breaks instead. # This file is loaded by RefCapablePropertyResourceBundle, so if any # property here has no value set, the value MUST be set in a file # located at targenerator/PROPERTYNAME.text # Property keys MAY NOT CONTAIN UNDERSCORE. Underscores in Enum constants # will automatically be transated to dots. # These tell RefCapablePropertyResourceBundle to look for text files: DbBackup.syntax= TarGenerator.syntax= TarReader.syntax= listing.format= # Traditional inline .properties values: DbBackup.syntaxerr=Syntax-Fehler. Geben Sie für Hilfe folgendes ein:\u000a \ java -cp pfad/zur/hsqldb.jar %{1} pad.block.write=Fülle das Archive mit %{1} Null-Blöcken auf. cleanup.rmfail=Fehler beim Löschen eines wahrscheinlich beschädigten Archives: %{1} unsupported.entry.present=\u000aDas Archive beinhaltet nicht unterstützte Typen von Einträgen.\u000a\ Wir unterstützen nur folgende Typen ' ', '0', 'x' (Eintragstyp wird in der ersten Spalte angezeigt). bpr.write=Schreibe %{1} Blöcke pro Datensatz. stream.buffer.report=Puffere %{1} Bytes aus dem Eingabestrom im Arbeitsspeicher. write.queue.report=%{1} Elemente zum Schreiben in der Warteschlange... file.missing=Benötigte Datei wird vermisst: %{1} modified.property='geänderte' DB-Einstellung ist '%{1}' file.disappeared='%{1}' verschwunden seit dem Start des Backup. file.changed='%{1}' verändert seit dem Start des Backup. file.appeared='%{1}' neue seit dem Start des Backup. pif.malformat=Zeile %{1} der PIF-Daten ist fehlerhaft:\u000a%{2} pif.malformat.size=PIF-Daten beinhalten einen fehlerhaften 'size'-Wert: %{1} zero.write=Das schreiben eines Datensatzes mit leerem Schlüssel (Key) oder Wert (value) wird verweigert. pif.toobig=Die Gesamtlänge von Schlüssel und Wert überschreitet das unterstützte Maximum von %{1} read.denied=Der Benutzer hat keine ausreichenden Rechte zum Lesen der Datei: %{1} compression.unknown=Unerwartetes Kompressionsverfahren: %{1} insufficient.read=Erwartete %{1} Bytes zum Lesen, konnte aber nur %{2} einlesen decompression.ranout=Dekomprimierte Bytes sind ausgegangen, nach dem dem Lesen von %{1} aus %{2} Bytes. move.work.file=Versucht jemand anderes in dieselbe Datei zu schreiben? \ Wenn nicht, löschen Sie bitte die Datei, bei der die Arbeit unterbrochen wurde: %{1} cant.overwrite=Sie haben keine Rechte zum Überschreiben von '%{1}' cant.write.dir=Sie haben keine Rechte um in das Verzeichnis '%{1}' zu schreiben. no.parent.dir=Kein übergeordnetes Verzeichnis '%{1}' bad.block.write.len=Angegebener Block ist %{1} Bytes lang, statt 512 illegal.block.boundary=Die Länge %{1} der aktuellen Datei ist kein genaues Vielfaches eines 512-Byte-Block. workfile.delete.fail=Fehler beim Löschen der Arbeitsdatei '%{1}' unsupported.ext=Erzeuge nur %{1} Dateien mit den Erweiterungen \ '.tar', '.tgz.', or '.tar.gz': %{2} dest.exists=Zieldatei existiert bereits: %{1} parent.not.dir=Der übergeordnete Knotenpunkt der angegebenen Datei ist kein Verzeichnis: %{1} cant.write.parent=Das übergeordnete Verzeichnis der angegebenen Datei ist nicht beschreibbar: {1} parent.create.fail=Fehler beim Erstellen des übergeordneten Verzeichnises für die TAR-Datei: %{1} tar.field.toobig=Eingabe zu lang für das Feld %{1}: %{2} missing.supp.path=Pfad wird benötigt, wenn dieser bei der Datei nicht angegeben wurde. nonfile.entry=Diese Methode erzeugt absichtlich TAR-Einträge nur für Dateien. read.lt.1=Es macht keinen Sinn einen Eintrag zu erzeugen, für weniger als einen Byte. data.changed=Scheint das sich die Eingabedaten geändert haben. Eingabedaten bestanden aus %{1} Bytes, \ geschrieben wurden aber Daten mit %{2} Bytes. unexpected.header.key=Unerwarteter Kopfschlüssel (Header key): %{1} tarreader.syntaxerr=Geben Sie 'java -cp pfad/zur/hsqldb.jar %{1}' ein für die Hilfe unsupported.mode=Entschuldigung, dieser Modus wird noch nicht unterstützt: %{1} dir.x.conflict=Der Schalter '--directory=' macht nur in Verbindung mit dem 'x'-Modus Sinn pif.unknown.datasize=PIF-Datengröße ist unbekannt. pif.data.toobig=PIF-Daten überschreiben die maximal unterstützte Größe %{1} > %{2} data.size.unknown=Datengröße unbekannt extraction.exists=Entpackte Dateien existieren bereits: %{1} extraction.exists.notfile=Der Knotenpunkt (Node) existert bereits, er ist aber keine Datei: %{1} extraction.parent.not.dir=Der übergeordnete Knotenpunkt (Parent node) des entpackten Pfades ist kein Verzeichnis: %{1} extraction.parent.not.writable=Das übergeordnete Verzeichnis des entpackten Pfades ist nicht beschreibbar: %{1} extraction.parent.mkfail=Fehler beim erzeugen des übergeordneten Verzeichnises für die entpackten Dateien: %{1} write.count.mismatch=Versuchte %{1} Bytes nach '%{2}' zu schreiben, konnte aber nur %{3} schreiben header.field.missing=Vorgeschriebenes Feld '%{1}' fehlt im TAR-Kopfzeileneintrag (tar entry header). checksum.mismatch=Beschädigter TAR-Kopfzeileneintrag (tar entry header). Erwartete Prüfsumme %{1}, \ berechnete ist aber %{2} create.only.normal=Zu diesem Zeitpunkt unterstützen wir nur die Erzeugung normaler Dateien \ aus TAR-Einträgen bad.header.value=Falscher Wert im Kopfzeilenfeld %{1} bad.numeric.header.value=Falscher Wert im Kopfzeilenfeld %{1}: %{2}.\u000a\ Kopfzeilenfeld kann 'binary number extension' verwenden, welche wir aber nicht unterstützen \ \u000aVerwenden Sie das Pax-Interchange-Format anstellen von sehr großen Dateien. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/PIFGenerator.java0000644000175000017500000001410412007547402023423 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib.tar; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.util.Date; /** * Encapsulates Pax Interchange Format key/value pairs. */ public class PIFGenerator extends ByteArrayOutputStream { OutputStreamWriter writer; String name; int fakePid; // Only used by contructors char typeFlag; public String getName() { return name; } protected PIFGenerator() { try { writer = new OutputStreamWriter(this, "UTF-8"); } catch (UnsupportedEncodingException uee) { throw new RuntimeException( "Serious problem. JVM can't encode UTF-8", uee); } fakePid = (int) (new Date().getTime() % 100000L); // Java doesn't have access to PIDs, as PIF wants in the "name" field, // so we emulate one in a way that is easy for us. } /** * Construct a PIFGenerator object for a 'g' record. * * @param sequenceNum Index starts at 1 in each Tar file */ public PIFGenerator(int sequenceNum) { this(); if (sequenceNum < 1) { // No need to localize. Would be caught at dev-time. throw new IllegalArgumentException("Sequence numbers start at 1"); } typeFlag = 'g'; name = System.getProperty("java.io.tmpdir") + "/GlobalHead." + fakePid + '.' + sequenceNum; } /** * Construct a PIFGenerator object for a 'x' record. * * @param file Target file of the x record. */ public PIFGenerator(File file) { this(); typeFlag = 'x'; String parentPath = (file.getParentFile() == null) ? "." : file.getParentFile() .getPath(); name = parentPath + "/PaxHeaders." + fakePid + '/' + file.getName(); } /** * Convenience wrapper for addRecord(String, String). * N.b. this writes values exactly as either "true" or "false". * * @see #addRecord(String, String) * @see Boolean#toString(boolean) */ public void addRecord(String key, boolean b) throws TarMalformatException, IOException { addRecord(key, Boolean.toString(b)); } /** * Convenience wrapper for addRecord(String, String). * * @see #addRecord(String, String) */ public void addRecord(String key, int i) throws TarMalformatException, IOException { addRecord(key, Integer.toString(i)); } /** * Convenience wrapper for addRecord(String, String). * * @see #addRecord(String, String) */ public void addRecord(String key, long l) throws TarMalformatException, IOException { addRecord(key, Long.toString(l)); } /** * I guess the "initial length" field is supposed to be in units of * characters, not bytes? */ public void addRecord(String key, String value) throws TarMalformatException, IOException { if (key == null || value == null || key.length() < 1 || value.length() < 1) { throw new TarMalformatException(RB.zero_write.getString()); } int lenWithoutIlen = key.length() + value.length() + 3; // "Ilen" means Initial Length field. +3 = SPACE + = + \n int lenW = 0; // lenW = Length With initial-length-field if (lenWithoutIlen < 8) { lenW = lenWithoutIlen + 1; // Takes just 1 char to report total } else if (lenWithoutIlen < 97) { lenW = lenWithoutIlen + 2; // Takes 2 chars to report this total } else if (lenWithoutIlen < 996) { lenW = lenWithoutIlen + 3; // Takes 3... } else if (lenWithoutIlen < 9995) { lenW = lenWithoutIlen + 4; // ditto } else if (lenWithoutIlen < 99994) { lenW = lenWithoutIlen + 5; } else { throw new TarMalformatException(RB.pif_toobig.getString(99991)); } writer.write(Integer.toString(lenW)); writer.write(' '); writer.write(key); writer.write('='); writer.write(value); writer.write('\n'); writer.flush(); // Does this do anything with a BAOS? } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/TarFileOutputStream.java0000644000175000017500000003051612007547400025064 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib.tar; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.zip.GZIPOutputStream; /** * Note that this class is not a java.io.FileOutputStream, * because our goal is to greatly restrict the public methods of * FileOutputStream, yet we must use public methods of the underlying * FileOutputStream internally. Can't accomplish these goals in Java if we * subclass. *

* This class is ignorant about Tar header fields, attributes and such. * It is concerned with reading and writing blocks of data in conformance with * Tar formatting, in a way convenient to those who want to write the header * and data blocks. *

* Users write file data by means of populating the provided, public byte array, * then calling the single write(int) method to write a portion of that array. * This design purposefully goes with efficiency, simplicity, and performance * over Java convention, which would not use public fields. *

* At this time, we do not support appending. That would greatly decrease the * generality and simplicity of the our design, since appending is trivial * without compression and very difficult with compression. *

* Users must finish tar file creation by using the finish() method. * Just like a normal OutputStream, if processing is aborted for any reason, * the close() method must be used to free up system resources. *

* SECURITY NOTE * Due to pitiful lack of support for file security in Java before version 1.6, * this class will only explicitly set permissions if it is compiled for Java * 1.6. If it was not, and if your tar entries contain private data in files * with 0400 or similar, be aware that that file can be pretty much be * extracted by anybody with access to the tar file. *

* * @see #finish * @see #close */ public class TarFileOutputStream { public interface Compression { public static final int NO_COMPRESSION = 0; public static final int GZIP_COMPRESSION = 1; public static final int DEFAULT_COMPRESSION = NO_COMPRESSION; public static final int DEFAULT_BLOCKS_PER_RECORD = 20; } public static boolean debug = Boolean.getBoolean("DEBUG"); protected int blocksPerRecord; protected long bytesWritten = 0; private OutputStream writeStream; private File targetFile; private File writeFile; /* This is not a "Writer", but the byte "Stream" that we write() to. */ public byte[] writeBuffer; /* We purposefully provide no public getter or setter for writeBuffer. * No getter because the whole point of this class is that the byte * array is a direct, optimally efficient byte array. No setter because * the inside implementation of this class is intimately dependent upon * the nature of the write buffer. */ public static final byte[] ZERO_BLOCK = new byte[512]; /** * Convenience wrapper to use default blocksPerRecord and compressionType. * * @see #TarFileOutputStream(File, int, int) */ public TarFileOutputStream(File targetFile) throws IOException { this(targetFile, Compression.DEFAULT_COMPRESSION); } /** * Convenience wrapper to use default blocksPerRecord. * * @see #TarFileOutputStream(File, int, int) */ public TarFileOutputStream(File targetFile, int compressionType) throws IOException { this(targetFile, compressionType, TarFileOutputStream.Compression.DEFAULT_BLOCKS_PER_RECORD); } /** * This class does no validation or enforcement of file naming conventions. * If desired, the caller should enforce extensions like "tar" and * "tar.gz" (and that they match the specified compression type). * * It also overwrites files without warning (just like FileOutputStream). */ public TarFileOutputStream(File targetFile, int compressionType, int blocksPerRecord) throws IOException { this.blocksPerRecord = blocksPerRecord; this.targetFile = targetFile; writeFile = new File(targetFile.getParentFile(), targetFile.getName() + "-partial"); if (this.writeFile.exists()) { throw new IOException( RB.move_work_file.getString(writeFile.getAbsolutePath())); } if (targetFile.exists() && !targetFile.canWrite()) { throw new IOException( RB.cant_overwrite.getString(targetFile.getAbsolutePath())); } File parentDir = targetFile.getAbsoluteFile().getParentFile(); if (parentDir.exists() && parentDir.isDirectory()) { if (!parentDir.canWrite()) { throw new IOException(RB.cant_write_dir.getString( parentDir.getAbsolutePath())); } } else { throw new IOException( RB.no_parent_dir.getString(parentDir.getAbsolutePath())); } writeBuffer = new byte[blocksPerRecord * 512]; switch (compressionType) { case TarFileOutputStream.Compression.NO_COMPRESSION : writeStream = new FileOutputStream(writeFile); break; case TarFileOutputStream.Compression.GZIP_COMPRESSION : writeStream = new GZIPOutputStream(new FileOutputStream(writeFile), writeBuffer.length); break; default : throw new IllegalArgumentException( RB.compression_unknown.getString(compressionType)); } //#ifdef JAVA6 writeFile.setExecutable(false, true); writeFile.setExecutable(false, false); writeFile.setReadable(false, false); writeFile.setReadable(true, true); writeFile.setWritable(false, false); writeFile.setWritable(true, true); //#endif // We restrict permissions to the file owner before writing // anything, in case we will be writing anything private into this // file. } /** * This class and subclasses should write to the underlying writeStream * ONLY WITH THIS METHOD. * That way we can be confident that bytesWritten will always be accurate. */ public void write(byte[] byteArray, int byteCount) throws IOException { writeStream.write(byteArray, 0, byteCount); bytesWritten += byteCount; } /** * The normal way to write file data (as opposed to header data or padding) * using this class. */ public void write(int byteCount) throws IOException { write(writeBuffer, byteCount); } /** * Write a user-specified 512-byte block. * * For efficiency, write(int) should be used when writing file body content. * * @see #write(int) */ public void writeBlock(byte[] block) throws IOException { if (block.length != 512) { throw new IllegalArgumentException( RB.bad_block_write_len.getString(block.length)); } write(block, block.length); } /** * Writes the specified quantity of zero'd blocks. */ public void writePadBlocks(int blockCount) throws IOException { for (int i = 0; i < blockCount; i++) { write(ZERO_BLOCK, ZERO_BLOCK.length); } } /** * Writes a single zero'd block. */ public void writePadBlock() throws IOException { writePadBlocks(1); } public int bytesLeftInBlock() { int modulus = (int) (bytesWritten % 512L); if (modulus == 0) { return 0; } return 512 - modulus; } /** * @throws IllegalStateException if end of file not on a block boundary. */ public void assertAtBlockBoundary() { if (bytesLeftInBlock() != 0) { throw new IllegalArgumentException( RB.illegal_block_boundary.getString( Long.toString(bytesWritten))); } } /** * Rounds out the current block to the next block bondary. * If we are currently at a block boundary, nothing is done. */ public void padCurrentBlock() throws IOException { int padBytes = bytesLeftInBlock(); if (padBytes == 0) { return; } write(ZERO_BLOCK, padBytes); // REMOVE THIS DEV-ASSERTION: assertAtBlockBoundary(); } /** * Implements java.io.Flushable. * * @see java.io.Flushable */ public void flush() throws IOException { writeStream.flush(); } /** * Implements java.io.Closeable. *

* IMPORTANT: This method deletes the work file after * closing it! * * @see java.io.Closeable */ public void close() throws IOException { if (writeStream == null) { return; } try { writeStream.close(); if (!writeFile.delete()) { throw new IOException( RB.workfile_delete_fail.getString( writeFile.getAbsolutePath())); } } finally { writeStream = null; // Encourage buffer GC } } public long getBytesWritten() { return bytesWritten; } /** * (Only) when this method returns successfully, the generated file will be * a valid tar file. * * This method always performs a close, so you never need to call the close * if your code makes it to this method. * (You do need to call close if processing is aborted before calling * finish()). * * @see #close */ public void finish() throws IOException { try { long finalBlock = bytesWritten / 512 + 2; if (finalBlock % blocksPerRecord != 0) { // Round up total archive size to a blocksPerRecord multiple finalBlock = (finalBlock / blocksPerRecord + 1) * blocksPerRecord; } int finalPadBlocks = (int) (finalBlock - bytesWritten / 512L); if (TarFileOutputStream.debug) { System.out.println( RB.pad_block_write.getString(finalPadBlocks)); } writePadBlocks(finalPadBlocks); } catch (IOException ioe) { try { close(); } catch (IOException ne) { // Too difficult to report every single error. // More important that the user know about the original Exc. } throw ioe; } writeStream.close(); writeFile.renameTo(targetFile); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/TarGenerator.java0000644000175000017500000006466412007547402023553 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib.tar; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import org.hsqldb.lib.InputStreamInterface; import org.hsqldb.lib.InputStreamWrapper; import org.hsqldb.lib.StringUtil; /** * Generates a tar archive from specified Files and InputStreams. * Modified by fredt for hot backup * @version 2.2.9 * @since 2.0.0 * * @author Blaine Simpson (blaine dot simpson at admc dot com) */ public class TarGenerator { /** * Creates specified tar file to contain specified files, or stdin, * using default blocks-per-record and replacing tar file if it already * exists. */ public static void main(String[] sa) throws IOException, TarMalformatException { if (sa.length < 1) { System.out.println( RB.TarGenerator_syntax.getString(DbBackup.class.getName())); System.exit(0); } TarGenerator generator = new TarGenerator(new File(sa[0]), true, null); if (sa.length == 1) { generator.queueEntry("stdin", System.in, 10240); } else { for (int i = 1; i < sa.length; i++) { generator.queueEntry(new File(sa[i])); } } generator.write(); } protected TarFileOutputStream archive; protected List entryQueue = new ArrayList(); protected long paxThreshold = 0100000000000L; // in bytes. Value here exactly = 8GB. /** * When data file is this size or greater, in bytes, a * Pix Interchange Format 'x' record will be created and used for the file * entry. *

* Limitation * At this time, PAX is only implemented for entries added as Files, * not entries added as Stream. *

*/ public void setPaxThreshold(long paxThreshold) { this.paxThreshold = paxThreshold; } /** * @see #setPaxThreshold(long) */ public long getPaxThreshold() { return paxThreshold; } /** * Compression is determined directly by the suffix of the file name in * the specified path. * * @param inFile Absolute or relative (from user.dir) File for * tar file to be created. getName() Suffix must * indicate tar file and may indicate a compression * method. * @param overWrite True to replace an existing file of same path. * @param blocksPerRecord Null will use default tar value. */ public TarGenerator(File inFile, boolean overWrite, Integer blocksPerRecord) throws IOException { File archiveFile = inFile.getAbsoluteFile(); // Do this so we can be sure .getParent*() is non-null. (Also allows // us to use .getPath() instead of very long .getAbsolutePath() for // error messages. int compression = TarFileOutputStream.Compression.NO_COMPRESSION; if (archiveFile.getName().endsWith(".tgz") || archiveFile.getName().endsWith(".tar.gz")) { compression = TarFileOutputStream.Compression.GZIP_COMPRESSION; } else if (archiveFile.getName().endsWith(".tar")) { // purposefully do nothing } else { throw new IllegalArgumentException( RB.unsupported_ext.getString( getClass().getName(), archiveFile.getPath())); } if (archiveFile.exists()) { if (!overWrite) { throw new IOException( RB.dest_exists.getString(archiveFile.getPath())); } } else { File parentDir = archiveFile.getParentFile(); // parentDir will be absolute, since archiveFile is absolute. if (parentDir.exists()) { if (!parentDir.isDirectory()) { throw new IOException( RB.parent_not_dir.getString(parentDir.getPath())); } if (!parentDir.canWrite()) { throw new IOException( RB.cant_write_parent.getString(parentDir.getPath())); } } else { if (!parentDir.mkdirs()) { throw new IOException( RB.parent_create_fail.getString(parentDir.getPath())); } } } archive = (blocksPerRecord == null) ? new TarFileOutputStream(archiveFile, compression) : new TarFileOutputStream(archiveFile, compression, blocksPerRecord.intValue()); if ((blocksPerRecord != null) && TarFileOutputStream.debug) { System.out.println( RB.bpr_write.getString(blocksPerRecord.intValue())); } } public void queueEntry(File file) throws FileNotFoundException, TarMalformatException { queueEntry(null, file); } public void queueEntry(String entryPath, File file) throws FileNotFoundException, TarMalformatException { entryQueue.add(new TarEntrySupplicant(entryPath, file, archive, paxThreshold)); } public void queueEntry(String entryPath, InputStreamInterface is) throws FileNotFoundException, TarMalformatException { entryQueue.add(new TarEntrySupplicant(entryPath, is, archive, paxThreshold)); } /** * This method does not support Pax Interchange Format, nor data sizes * greater than 2G. *

* This limitation may or may not be eliminated in the future. *

*/ public void queueEntry(String entryPath, InputStream inStream, int maxBytes) throws IOException, TarMalformatException { entryQueue.add(new TarEntrySupplicant(entryPath, inStream, maxBytes, '0', archive)); } /** * This method does release all of the streams, even if there is a failure. */ public void write() throws IOException, TarMalformatException { if (TarFileOutputStream.debug) { System.out.println( RB.write_queue_report.getString(entryQueue.size())); } TarEntrySupplicant entry; try { for (int i = 0; i < entryQueue.size(); i++) { System.err.print(Integer.toString(i + 1) + " / " + entryQueue.size() + ' '); entry = entryQueue.get(i); System.err.print(entry.getPath() + "... "); entry.write(); archive.assertAtBlockBoundary(); System.err.println(); } archive.finish(); } catch (IOException ioe) { System.err.println(); // Exception should cause a report try { // Just release resources from any Entry's input, which may be // left open. for (TarEntrySupplicant sup : entryQueue) { sup.close(); } archive.close(); } catch (IOException ne) { // Too difficult to report every single error. // More important that the user know about the original Exc. } throw ioe; } } /** * Slots for supplicant files and input streams to be added to a Tar * archive. * * @author Blaine Simpson (blaine dot simpson at admc dot com) */ static protected class TarEntrySupplicant { static protected byte[] HEADER_TEMPLATE = TarFileOutputStream.ZERO_BLOCK.clone(); static Character swapOutDelim = null; final protected static byte[] ustarBytes = { 'u', 's', 't', 'a', 'r' }; static { char c = System.getProperty("file.separator").charAt(0); if (c != '/') { swapOutDelim = new Character(c); } try { writeField(TarHeaderField.uid, 0L, HEADER_TEMPLATE); writeField(TarHeaderField.gid, 0L, HEADER_TEMPLATE); } catch (TarMalformatException tme) { // This would definitely get caught in Dev env. throw new RuntimeException(tme); } // Setting uid and gid to 0 = root. // Misleading, yes. Anything better we can do? No. int magicStart = TarHeaderField.magic.getStart(); for (int i = 0; i < ustarBytes.length; i++) { // UStar magic field HEADER_TEMPLATE[magicStart + i] = ustarBytes[i]; } HEADER_TEMPLATE[263] = '0'; HEADER_TEMPLATE[264] = '0'; // UStar version field, version = 00 // This is the field that Gnu Tar desecrates. } static protected void writeField(TarHeaderField field, String newValue, byte[] target) throws TarMalformatException { int start = field.getStart(); int stop = field.getStop(); byte[] ba; try { ba = newValue.getBytes("ISO-8859-1"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } if (ba.length > stop - start) { throw new TarMalformatException( RB.tar_field_toobig.getString(field.toString(), newValue)); } for (int i = 0; i < ba.length; i++) { target[start + i] = ba[i]; } } static protected void clearField(TarHeaderField field, byte[] target) { int start = field.getStart(); int stop = field.getStop(); for (int i = start; i < stop; i++) { target[i] = 0; } } static protected void writeField(TarHeaderField field, long newValue, byte[] target) throws TarMalformatException { TarEntrySupplicant.writeField( field, TarEntrySupplicant.prePaddedOctalString( newValue, field.getStop() - field.getStart()), target); } public static String prePaddedOctalString(long val, int width) { return StringUtil.toPaddedString(Long.toOctalString(val), width, '0', false); } protected byte[] rawHeader = HEADER_TEMPLATE.clone(); protected String fileMode = DEFAULT_FILE_MODES; // Following fields are always initialized by constructors. protected InputStreamInterface inputStream; protected String path; protected long modTime; protected TarFileOutputStream tarStream; protected long dataSize; // In bytes protected boolean paxSized = false; protected final long paxThreshold; // (paxSized = true) tells the target entry to NOT set the size header field, // to ensure that no tar client accidentally extracts only // a portion of the file data. // If the client can't read the correct size from the PIF data, // we want the client to report that so the user can get a better // tar client! // Size will only be written to entry's header if paxSized is false. public String getPath() { return path; } public long getDataSize() { return dataSize; } /* * Internal constructor that validates the entry's path. */ protected TarEntrySupplicant(String path, char typeFlag, TarFileOutputStream tarStream, long paxThreshold) throws TarMalformatException { this.paxThreshold = paxThreshold; if (path == null) { throw new IllegalArgumentException( RB.missing_supp_path.getString()); } this.path = (swapOutDelim == null) ? path : path.replace(swapOutDelim.charValue(), '/'); this.tarStream = tarStream; writeField(TarHeaderField.typeflag, typeFlag); if ((typeFlag == '\0') || (typeFlag == ' ')) { writeField(TarHeaderField.uname, System.getProperty("user.name"), HEADER_TEMPLATE); writeField(TarHeaderField.gname, "root", HEADER_TEMPLATE); // Setting UNAME and GNAME at the instance level instead of the // static template, because record types 'x' and 'g' do not set // these fields. // POSIX UStar compliance requires that we set "gname" field. // It's impossible for use to determine the correct value from // Java. We punt with "root" because (a) it's the only group // name // we know should exist on every UNIX system, and (b) every tar // client gracefully handles it when extractor user does not // have privs for the specified group. } } /** * This creates a 'x' entry for a 0/\0 entry. */ public TarEntrySupplicant makeXentry() throws IOException, TarMalformatException { PIFGenerator pif = new PIFGenerator(new File(path)); pif.addRecord("size", dataSize); /* * Really bad to make pseudo-stream just to get a byte array out * of it, but it would be a very poor use of development time to * re-design this class because the comparative time wasted at * runtime will be negligable compared to storing the data entries. */ return new TarEntrySupplicant( pif.getName(), new ByteArrayInputStream(pif.toByteArray()), pif.size(), 'x', tarStream); } /** * After instantiating a TarEntrySupplicant, the user must either invoke * write() or close(), to release system resources on the input * File/Stream. */ public TarEntrySupplicant(String path, File file, TarFileOutputStream tarStream, long paxThreshold) throws FileNotFoundException, TarMalformatException { // Must use an expression-embedded ternary here to satisfy compiler // that this() call be first statement in constructor. this(((path == null) ? file.getPath() : path), '0', tarStream, paxThreshold); // Difficult call for '0'. binary 0 and character '0' both mean // regular file. Binary 0 pre-UStar is probably more portable, // but we are writing a valid UStar header, and I doubt anybody's // tar implementation would choke on this since there is no // outcry of UStar archives failing to work with older tars. if (!file.isFile()) { throw new IllegalArgumentException( RB.nonfile_entry.getString()); } if (!file.canRead()) { throw new IllegalArgumentException( RB.read_denied.getString(file.getAbsolutePath())); } modTime = file.lastModified() / 1000L; fileMode = TarEntrySupplicant.getLameMode(file); dataSize = file.length(); inputStream = new InputStreamWrapper(new FileInputStream(file)); } public TarEntrySupplicant(String path, InputStreamInterface is, TarFileOutputStream tarStream, long paxThreshold) throws FileNotFoundException, TarMalformatException { // Must use an expression-embedded ternary here to satisfy compiler // that this() call be first statement in constructor. this(path, '0', tarStream, paxThreshold); // Difficult call for '0'. binary 0 and character '0' both mean // regular file. Binary 0 pre-UStar is probably more portable, // but we are writing a valid UStar header, and I doubt anybody's // tar implementation would choke on this since there is no // outcry of UStar archives failing to work with older tars. modTime = System.currentTimeMillis() / 1000L; fileMode = DEFAULT_FILE_MODES; inputStream = is; } /** * After instantiating a TarEntrySupplicant, the user must either invoke * write() or close(), to release system resources on the input * File/Stream. *

* WARNING: * Do not use this method unless the quantity of available RAM is * sufficient to accommodate the specified maxBytes all at one time. * This constructor loads all input from the specified InputStream into * RAM before anything is written to disk. *

* * @param maxBytes This method will fail if more than maxBytes bytes * are supplied on the specified InputStream. * As the type of this parameter enforces, the max * size you can request is 2GB. */ public TarEntrySupplicant(String path, InputStream origStream, int maxBytes, char typeFlag, TarFileOutputStream tarStream) throws IOException, TarMalformatException { /* * If you modify this, make sure to not intermix reading/writing of * the PipedInputStream and the PipedOutputStream, or you could * cause dead-lock. Everything is safe if you close the * PipedOutputStream before reading the PipedInputStream. */ this(path, typeFlag, tarStream, 0100000000000L); if (maxBytes < 1) { throw new IllegalArgumentException(RB.read_lt_1.getString()); } int i; PipedOutputStream outPipe = new PipedOutputStream(); /* * This constructor not available until Java 1.6: * inputStream = new PipedInputStream(outPipe, maxBytes); */ try { inputStream = new InputStreamWrapper(new PipedInputStream(outPipe)); while ((i = origStream.read(tarStream.writeBuffer, 0, tarStream.writeBuffer.length)) > 0) { outPipe.write(tarStream.writeBuffer, 0, i); } outPipe.flush(); // Do any good on a pipe? dataSize = inputStream.available(); if (TarFileOutputStream.debug) { System.out.println( RB.stream_buffer_report.getString( Long.toString(dataSize))); } } catch (IOException ioe) { close(); throw ioe; } finally { try { outPipe.close(); } finally { outPipe = null; // Encourage buffer GC } } modTime = new java.util.Date().getTime() / 1000L; } public void close() throws IOException { if (inputStream == null) { return; } try { inputStream.close(); } finally { inputStream = null; // Encourage buffer GC } } protected long headerChecksum() { long sum = 0; for (int i = 0; i < rawHeader.length; i++) { boolean isInRange = ((i >= TarHeaderField.checksum.getStart()) && (i < TarHeaderField.checksum.getStop())); sum += isInRange ? 32 : (255 & rawHeader[i]); // We ignore current contents of the checksum field so that // this method will continue to work right, even if we later // recycle the header or RE-calculate a header. } return sum; } protected void clearField(TarHeaderField field) { TarEntrySupplicant.clearField(field, rawHeader); } protected void writeField(TarHeaderField field, String newValue) throws TarMalformatException { TarEntrySupplicant.writeField(field, newValue, rawHeader); } protected void writeField(TarHeaderField field, long newValue) throws TarMalformatException { TarEntrySupplicant.writeField(field, newValue, rawHeader); } protected void writeField(TarHeaderField field, char c) throws TarMalformatException { TarEntrySupplicant.writeField(field, Character.toString(c), rawHeader); } /** * Writes entire entry to this object's tarStream. * * This method is guaranteed to close the supplicant's input stream. */ public void write() throws IOException, TarMalformatException { int i; try { // normal file streams will return -1 as size limit // getSizeLimit() is called just before writing the entry long sizeLimit = inputStream.getSizeLimit(); // special stream with explicit zero limit is not written if (sizeLimit == 0) { return; } // special stream if (sizeLimit > 0) { dataSize = sizeLimit; } if (dataSize >= paxThreshold) { paxSized = true; makeXentry().write(); System.err.print("x... "); } writeField(TarHeaderField.name, path); // TODO: If path.length() > 99, then write a PIF entry with // the file path. // Don't waste time using the PREFIX header field. writeField(TarHeaderField.mode, fileMode); if (!paxSized) { writeField(TarHeaderField.size, dataSize); } writeField(TarHeaderField.mtime, modTime); writeField( TarHeaderField.checksum, TarEntrySupplicant.prePaddedOctalString( headerChecksum(), 6) + "\0 "); // Silly, but that's what the base header spec calls for. tarStream.writeBlock(rawHeader); long dataStart = tarStream.getBytesWritten(); while ((i = inputStream.read(tarStream.writeBuffer)) > 0) { tarStream.write(i); } if (dataStart + dataSize != tarStream.getBytesWritten()) { throw new IOException( RB.data_changed.getString( Long.toString(dataSize), Long.toString( tarStream.getBytesWritten() - dataStart))); } tarStream.padCurrentBlock(); } finally { close(); } } /** * This method is so-named because it only sets the owner privileges, * not any "group" or "other" privileges. *

* This is because of Java limitation. * Incredibly, with Java 1.6, the API gives you the power to set * privileges for "other" (last nibble in file Mode), but no ability * to detect the same. *

*/ static protected String getLameMode(File file) { int umod = 0; //#ifdef JAVA6 if (file.canExecute()) { umod = 1; } //#endif if (file.canWrite()) { umod += 2; } if (file.canRead()) { umod += 4; } return "0" + umod + "00"; // Conservative since Java gives us no way to determine group or // other privileges on a file, and this file may contain passwords. } public static final String DEFAULT_FILE_MODES = "600"; // Be conservative, because these files contain passwords } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/rb.properties0000644000175000017500000001232612007547402023020 0ustar renerene# $Id: rb.properties 3375 2009-12-18 23:27:07Z unsaved $ # Default Locale String resources for TarGenerator. # IMPORTANT: Make sure to use ISO-8859-1 encoding for any extended characters, # both in this file (actually any .properties file) and all referenced text # files. # GENERAL .properties SYNTAX: # White space AT END OF LINES IS SIGNIFICANT # White space at beginning of lines is not # \ at very end of line makes the following line a continuation line (with # no implied newline in the value. # (Combined with the previous 2 rules, this means that white space before # this \ is significant, and whitespace at beginning of continutation lines # is not). # \n does not work as an escape. Use unicode \u000a for line breaks instead. # This file is loaded by RefCapablePropertyResourceBundle, so if any # property here has no value set, the value MUST be set in a file # located at targenerator/PROPERTYNAME.text # Property keys MAY NOT CONTAIN UNDERSCORE. Underscores in Enum constants # will automatically be transated to dots. # These tell RefCapablePropertyResourceBundle to look for text files: DbBackup.syntax= TarGenerator.syntax= TarReader.syntax= listing.format= # Traditional inline .properties values: DbBackup.syntaxerr=Syntax error. Run the following for help:\u000a \ java -cp path/to/hsqldb.jar %{1} pad.block.write=Padding archive with %{1} zero blocks cleanup.rmfail=Failed to remove possibly corrupt archive: %{1} unsupported.entry.present=\u000aArchive contains unsupported entry type(s).\u000a\ We only support types ' ', '0', 'x' (entry type is shown in first column). bpr.write=Will write at %{1} blocks-per-record stream.buffer.report=Buffered %{1} bytes from given InputStream into RAM write.queue.report=%{1} supplicants queued for writing... file.missing=Required file is missing: %{1} modified.property='modified' DB property is '%{1}' file.disappeared='%{1}' disappeared after backup started file.changed='%{1}' changed after backup started file.appeared='%{1}' appeared after backup started pif.malformat=Line %{1} of PIF Data is malformatted:\u000a%{2} pif.malformat.size=PIF Data contains malformatted 'size' value: %{1} zero.write=Refusing to write record with zero-length key or value pif.toobig=Total key + val lengths exceeds our total supported max of %{1} read.denied=User does not have privileges to read file: %{1} compression.unknown=Unexpected compression type: %{1} insufficient.read=Expected to read %{1} bytes, but could only read %{2} decompression.ranout=Ran out of decompressed bytes after reading %{1} out of %{2} move.work.file=Is somebody else writing to the same file? \ If not, remove aborted work file: %{1} cant.overwrite=You do not have privileges to overwrite '%{1}' cant.write.dir=You do not have privileges to write in directory '%{1}' no.parent.dir=No parent directory '%{1}' bad.block.write.len=Specified block is %{1} bytes long instead of 512 illegal.block.boundary=Current file length %{1} is not an even 512-byte-block multiple workfile.delete.fail=Failed to delete work file '%{1}' unsupported.ext=%{1} only generates files with extensions \ '.tar', '.tgz.', or '.tar.gz': %{2} dest.exists=Destination file already exists: %{1} parent.not.dir=Parent node of specified file is not a directory: %{1} cant.write.parent=Parent directory of specified file is not writable: {1} parent.create.fail=Failed to create parent directory for tar file: %{1} tar.field.toobig=Input too long for field %{1}: %{2} missing.supp.path=Path required if existing component file not specified nonfile.entry=This method intentionally creates TarEntries only for files read.lt.1=Does not make sense to make an entry for < 1 byte data.changed=Seems that the input data changed. Input data was %{1} bytes, \ but we wrote %{2} bytes of data unexpected.header.key=Unexpected Header key: %{1} tarreader.syntaxerr=Run 'java -cp path/to/hsqldb.jar %{1}' for help unsupported.mode=Sorry, mode not supported yet: %{1} dir.x.conflict=The '--directory=' switch only makes sense with 'x' mode pif.unknown.datasize=PIF Data size unknown pif.data.toobig=PIF Data exceeds max supported size. %{1} > %{2} data.size.unknown=Data size unknown extraction.exists=Extracted file already exists: %{1} extraction.exists.notfile=Node already exist but is not a file: %{1} extraction.parent.not.dir=Parent node of extracted path is not a directory: %{1} extraction.parent.not.writable=Parent directory of extracted path is not \ writable: %{1} extraction.parent.mkfail=Failed to create parent directory for extracted \ file: %{1} write.count.mismatch=Attempted to write %{1} bytes to '%{2}', but only wrote %{3} header.field.missing=Required field '%{1}' missing in tar entry header. checksum.mismatch=Corrupted tar entry header. Expected checksum %{1}, \ but calculated %{2} create.only.normal=At this time, we only support creation of normal files \ from Tar entries bad.header.value=Bad value in header for field %{1} bad.numeric.header.value=Bad value in header for field %{1}: %{2}.\u000a\ Header field could use 'binary number extension', which we don't \ support.\u000aUse Pax Interchange Format instead for huge files. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/rb/0000755000175000017500000000000012007570422020674 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/rb/listing.format_de.text0000644000175000017500000000021412007547402025211 0ustar renereneANZEIGE FORMAT: Änderungszeit__ tu Modus Dateigröße_ Besitzer___ Dateipfad t = Tar entry type u = '*' für UStar-kompatible entry hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/rb/TarReader.syntax_de.text0000644000175000017500000000060612007547402025454 0ustar renereneSYNTAX: java -cp Pfad/zur/hsqldb.jar %{1} {t|x} \ [--directory=Pfad] Pfad/zur/Datei/tar[.gz] [regex1...] wobei t: Anzeigen einer Tabelle mit den Einträgen (wie "tar -t...") x: Entpacken-Modus (wie "tar -x...") Pfad: Basisverzeichnis zum Entpacken der relativen Archiveinträge regex*: Muster, welche die darauf passenden Einträge auflistet oder entpackt hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/rb/TarGenerator.syntax_de.text0000644000175000017500000000034412007547402026177 0ustar renereneSYNTAX: java -cp %{1} neu.tar [Dateieintrag1...] Wenn keine Dateien angegeben wurden, dann wird von stdin gelesen um einen Eintrag mit dem Namen 'stdin' zu speichern. Bei letzteren ist die Eingabegröße auf 10240 Bytes begrenzt. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/rb/TarGenerator.syntax.text0000644000175000017500000000027512007547402025532 0ustar renereneSYNTAX: java -cp %{1} new.tar [entryFile1...] If no entryFiles are specified, stdin will be read to write an entry with name 'stdin'. In this latter case, input is limited to 10240 bytes. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/rb/listing.format.text0000644000175000017500000000021112007547402024536 0ustar renereneLISTING FORMAT: modification_time__ tu mode file_size_ owner___ filepath t = Tar entry type u = '*' for UStar-compliant entry hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/rb/TarReader.syntax.text0000644000175000017500000000051612007547402025004 0ustar renereneSYNTAX: java -cp path/to/hsqldb.jar %{1} {t|x} \ [--directory=path] file/path/tar[.gz] [regex1...] where t: Table-of-content mode (like "tar -t...") x: Extract mode (like "tar -x...") path: Base extraction directory for relative entries regex*: Pattern(s) which narrow entries listed or extracted hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/rb/DbBackup.syntax_de.text0000644000175000017500000000132312007547402025253 0ustar renereneSYNTAX: java -cp Pfad/zur/hsqldb.jar %{1} (um diese Meldung anzuzeigen) ODER java -cp Pfad/zur/hsqldb.jar %{1} --save \ [--overwrite] tar/Pfad.tar DB-Wurzel-Pfad ODER java -cp Pfad/zur/hsqldb.jar %{1} --list \ tar/Pfad.tar [regex1...] ODER java -cp path/to/hsqldb.jar %{1} --extract \ [--overwrite] Datei/Pfad.tar[.gz] DB/Verz. [regex1...] (entpackt die enthaltenen Dateien in die angegebene DB/das angegebene Verzeichnis). Bitte beachten: #N.b. the db/base/path includes file base name, like in JDBC URLs, whereas #db/dir is a proper 'directory'. Der DB-Wurzel-Pfad beinhaltet auch das Wurzelverzeichnis der Datei, wie bei JDBC-URLs, wo das DB/Verz. eine normales Verzeichnis ist. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/rb/DbBackup.syntax.text0000644000175000017500000000100412007547402024577 0ustar renereneSYNTAX: java -cp path/to/hsqldb.jar %{1} (to display this message) OR java -cp path/to/hsqldb.jar %{1} --save \ [--overwrite] tar/path.tar db/base/path OR java -cp path/to/hsqldb.jar %{1} --list \ tar/path.tar [regex1...] OR java -cp path/to/hsqldb.jar %{1} --extract \ [--overwrite] file/path.tar[.gz] db/dir [regex1...] (extracts entry files to the specified db/dir). N.b. the db/base/path includes file base name, like in JDBC URLs, whereas db/dir is a proper 'directory'. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/TarReader.java0000644000175000017500000006620112007547402023014 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib.tar; import org.hsqldb.lib.StringUtil; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.text.SimpleDateFormat; import java.util.regex.Pattern; /** * Reads a Tar file for reporting or extraction. * N.b. this is not a Reader in the java.io.Reader sense, * but in the sense of differentiating tar x and * tar t from tar c. *

* SECURITY NOTE * Due to pitiful lack of support for file security in Java before version 1.6, * this class will only explicitly set permissions if it is compiled for Java * 1.6. If it was not, and if your tar entries contain private data in files * with 0400 or similar, be aware that they will be extracted with privs such * that they can be ready by anybody. *

* * @author Blaine Simpson (blaine dot simpson at admc dot com) */ public class TarReader { public static final int LIST_MODE = 0; /** * EXTRACT_MODE refuses to overwrite existing files. */ public static final int EXTRACT_MODE = 1; /** * OVERWRITE_MODE is just EXTRACT_MODE where we will silently overwrite * existing files upon extraction. */ public static final int OVERWRITE_MODE = 2; /** * Reads a specified tar file or stdin in order to either list or extract * the file tar entries, depending on the first argument being "t" or "x", * using default read buffer blocks. */ public static void main(String[] sa) throws IOException, TarMalformatException { if (sa.length < 1) { System.out.println( RB.TarReader_syntax.getString(TarReader.class.getName())); System.out.println(RB.listing_format.getString()); System.exit(0); } File exDir = (sa.length > 1 && sa[1].startsWith("--directory=")) ? (new File(sa[1].substring("--directory=".length()))) : null; int firstPatInd = (exDir == null) ? 2 : 3; if (sa.length < firstPatInd || ((!sa[0].equals("t")) && !sa[0].equals("x"))) { throw new IllegalArgumentException( RB.tarreader_syntaxerr.getString(TarReader.class.getName())); } String[] patternStrings = null; if (sa.length > firstPatInd) { patternStrings = new String[sa.length - firstPatInd]; for (int i = firstPatInd; i < sa.length; i++) { patternStrings[i - firstPatInd] = sa[i]; } } if (sa[0].equals("t") && exDir != null) { throw new IllegalArgumentException(RB.dir_x_conflict.getString()); } int dirIndex = (exDir == null) ? 1 : 2; int tarReaderMode = sa[0].equals("t") ? LIST_MODE : EXTRACT_MODE; new TarReader(new File(sa[dirIndex]), tarReaderMode, patternStrings, null, exDir).read(); } protected TarFileInputStream archive; protected Pattern[] patterns = null; protected int mode; protected File extractBaseDir; // null means current directory // Not used for Absolute path entries // This path is always absolutized /** * Compression is determined directly by the suffix of the file name in * the specified path. * * @param inFile Absolute or relative (from user.dir) path to * tar file to be read. Suffix may indicate * a compression method. * @param mode Whether to list, extract-without-overwrite, or * extract-with-overwrite. * @param patternStrings * List of regular expressions to match against tar entry * names. If null, all entries will be listed or * extracted. If non-null, then only entries with names * which match will be extracted or listed. * @param readBufferBlocks Null will use default tar value. * @param inDir Directory that RELATIVE entries will be extracted * relative to. Defaults to current directory (user.dir). * Only used for extract modes and relative file entries. * @throws IllegalArgumentException if any given pattern is an invalid * regular expression. Don't have to worry about this if * you call with null 'patterns' param. * @see Pattern */ public TarReader(File inFile, int mode, String[] patternStrings, Integer readBufferBlocks, File inDir) throws IOException { this.mode = mode; File archiveFile = inFile.getAbsoluteFile(); extractBaseDir = (inDir == null) ? null : inDir.getAbsoluteFile(); int compression = TarFileOutputStream.Compression.NO_COMPRESSION; if (archiveFile.getName().endsWith(".tgz") || archiveFile.getName().endsWith(".gz")) { compression = TarFileOutputStream.Compression.GZIP_COMPRESSION; } if (patternStrings != null) { patterns = new Pattern[patternStrings.length]; for (int i = 0; i < patternStrings.length; i++) { patterns[i] = Pattern.compile(patternStrings[i]); } } // Don't check for archive file existence here. We can depend upon the // TarFileInputStream to check that. archive = (readBufferBlocks == null) ? new TarFileInputStream(archiveFile, compression) : new TarFileInputStream(archiveFile, compression, readBufferBlocks.intValue()); } public void read() throws IOException, TarMalformatException { TarEntryHeader header; boolean anyUnsupporteds = false; boolean matched; Long paxSize = null; String paxString = null; try { EACH_HEADER: while (archive.readNextHeaderBlock()) { header = new TarEntryHeader(archive.readBuffer); char entryType = header.getEntryType(); if (entryType == 'x') { /* Since we don't know the name of the target file yet, * we must load the size from all pax headers. * If the target file is not thereafter excluded via * patterns, we will need this size for the listing or to * extract the data. */ paxSize = getPifData(header).getSize(); paxString = header.toString(); continue; } if (paxSize != null) { // Ignore "size" field in the entry header because PIF // setting overrides. header.setDataSize(paxSize.longValue()); paxSize = null; } if (patterns != null) { matched = false; for (int i = 0; i < patterns.length; i++) { if (patterns[i].matcher(header.getPath()).matches()) { matched = true; break; } } if (!matched) { paxString = null; skipFileData(header); continue EACH_HEADER; } } if (entryType != '\0' && entryType != '0' && entryType != 'x') { anyUnsupporteds = true; } switch (mode) { case LIST_MODE : if (paxString != null) { System.out.println(paxString); } System.out.println(header.toString()); skipFileData(header); break; case EXTRACT_MODE : case OVERWRITE_MODE : if (paxString != null) { System.out.println(paxString); } /* Display entry summary before successful extraction. * Both "tar" and "rsync" display the name of the * currently extracting file, and we do the same. * Thefore the currently "shown" name is still being * extracted. */ System.out.println(header.toString()); // Instance variable mode will be used to differentiate // behavior inside of extractFile(). if (entryType == '\0' || entryType == '0' || entryType == 'x') { extractFile(header); } else { skipFileData(header); } break; default : throw new IllegalArgumentException( RB.unsupported_mode.getString(mode)); } paxString = null; } if (anyUnsupporteds) { System.out.println(RB.unsupported_entry_present.getString()); } } catch (IOException ioe) { archive.close(); throw ioe; } } protected PIFData getPifData(TarEntryHeader header) throws IOException, TarMalformatException { /* * If you modify this, make sure to not intermix reading/writing of * the PipedInputStream and the PipedOutputStream, or you could * cause dead-lock. Everything is safe if you close the * PipedOutputStream before reading the PipedInputStream. */ long dataSize = header.getDataSize(); if (dataSize < 1) { throw new TarMalformatException( RB.pif_unknown_datasize.getString()); } if (dataSize > Integer.MAX_VALUE) { throw new TarMalformatException(RB.pif_data_toobig.getString( Long.toString(dataSize), Integer.MAX_VALUE)); } int readNow; int readBlocks = (int) (dataSize / 512L); int modulus = (int) (dataSize % 512L); // Couldn't care less about the entry "name" field. PipedInputStream inPipe = null; PipedOutputStream outPipe = new PipedOutputStream(); /* This constructor not available until Java 1.6: new PipedInputStream(outPipe, (int) dataSize); */ try { inPipe = new PipedInputStream(outPipe); while (readBlocks > 0) { readNow = (readBlocks > archive.getReadBufferBlocks()) ? archive.getReadBufferBlocks() : readBlocks; archive.readBlocks(readNow); readBlocks -= readNow; outPipe.write(archive.readBuffer, 0, readNow * 512); } if (modulus != 0) { archive.readBlock(); outPipe.write(archive.readBuffer, 0, modulus); } outPipe.flush(); // Do any good on a pipe? } catch (IOException ioe) { if (inPipe != null) { inPipe.close(); } throw ioe; } finally { try { outPipe.close(); } finally { outPipe = null; // Encourage buffer GC } } return new PIFData(inPipe); } protected void extractFile(TarEntryHeader header) throws IOException, TarMalformatException { if (header.getDataSize() < 1) { throw new TarMalformatException(RB.data_size_unknown.getString()); } int readNow; int readBlocks = (int) (header.getDataSize() / 512L); int modulus = (int) (header.getDataSize() % 512L); File newFile = header.generateFile(); if (!newFile.isAbsolute()) { newFile = (extractBaseDir == null) ? newFile.getAbsoluteFile() : new File(extractBaseDir, newFile.getPath()); } // newFile is definitively Absolutized at this point File parentDir = newFile.getParentFile(); if (newFile.exists()) { if (mode != TarReader.OVERWRITE_MODE) { throw new IOException( RB.extraction_exists.getString(newFile.getAbsolutePath())); } if (!newFile.isFile()) { throw new IOException( RB.extraction_exists_notfile.getString( newFile.getAbsolutePath())); } // Better to let FileOutputStream creation zero it than to // to newFile.delete(). } if (parentDir.exists()) { if (!parentDir.isDirectory()) { throw new IOException( RB.extraction_parent_not_dir.getString( parentDir.getAbsolutePath())); } if (!parentDir.canWrite()) { throw new IOException( RB.extraction_parent_not_writable.getString( parentDir.getAbsolutePath())); } } else { if (!parentDir.mkdirs()) { throw new IOException( RB.extraction_parent_mkfail.getString( parentDir.getAbsolutePath())); } } int fileMode = header.getFileMode(); FileOutputStream outStream = new FileOutputStream(newFile); try { //#ifdef JAVA6 // Don't know exactly why I am still able to write to the file // after removing read and write privs from myself, but it does // work. newFile.setExecutable(false, false); newFile.setReadable(false, false); newFile.setWritable(false, false); newFile.setExecutable(((fileMode & 0100) != 0), true); newFile.setReadable((fileMode & 0400) != 0, true); newFile.setWritable((fileMode & 0200) != 0, true); //#endif while (readBlocks > 0) { readNow = (readBlocks > archive.getReadBufferBlocks()) ? archive.getReadBufferBlocks() : readBlocks; archive.readBlocks(readNow); readBlocks -= readNow; outStream.write(archive.readBuffer, 0, readNow * 512); } if (modulus != 0) { archive.readBlock(); outStream.write(archive.readBuffer, 0, modulus); } outStream.flush(); } finally { try { outStream.close(); } finally { outStream = null; // Encourage buffer GC } } newFile.setLastModified(header.getModTime() * 1000); if (newFile.length() != header.getDataSize()) { throw new IOException(RB.write_count_mismatch.getString( Long.toString(header.getDataSize()), newFile.getAbsolutePath(), Long.toString(newFile.length()))); } } protected void skipFileData(TarEntryHeader header) throws IOException, TarMalformatException { /* * Some entry types which we don't support have 0 data size. * If we just return here, the entry will just be skipped./ */ if (header.getDataSize() == 0) { return; } if (header.getDataSize() < 0) { throw new TarMalformatException(RB.data_size_unknown.getString()); } int skipNow; int oddBlocks = (header.getDataSize() % 512L == 0L) ? 0 : 1; int skipBlocks = (int) (header.getDataSize() / 512L) + oddBlocks; while (skipBlocks > 0) { skipNow = (skipBlocks > archive.getReadBufferBlocks()) ? archive.getReadBufferBlocks() : skipBlocks; archive.readBlocks(skipNow); skipBlocks -= skipNow; } } /** * A Tar entry header constituted from a header block in a tar file. * * @author Blaine Simpson (blaine dot simpson at admc dot com) */ @SuppressWarnings("serial") static protected class TarEntryHeader { static protected class MissingField extends Exception { private TarHeaderField field; public MissingField(TarHeaderField field) { this.field = field; } public String getMessage() { return RB.header_field_missing.getString(field.toString()); } } protected SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); /** * @param rawHeader May be longer than 512 bytes, but the first 512 * bytes MUST COMPRISE a raw tar entry header. */ public TarEntryHeader(byte[] rawHeader) throws TarMalformatException { this.rawHeader = rawHeader; Long expectedCheckSum = readInteger(TarHeaderField.checksum); try { if (expectedCheckSum == null) { throw new MissingField(TarHeaderField.checksum); } long calculatedCheckSum = headerChecksum(); if (expectedCheckSum.longValue() != calculatedCheckSum) { throw new TarMalformatException( RB.checksum_mismatch.getString( expectedCheckSum.toString(), Long.toString(calculatedCheckSum))); } path = readString(TarHeaderField.name); if (path == null) { throw new MissingField(TarHeaderField.name); } Long longObject = readInteger(TarHeaderField.mode); if (longObject == null) { throw new MissingField(TarHeaderField.mode); } fileMode = (int) longObject.longValue(); longObject = readInteger(TarHeaderField.size); if (longObject != null) { dataSize = longObject.longValue(); } longObject = readInteger(TarHeaderField.mtime); if (longObject == null) { throw new MissingField(TarHeaderField.mtime); } modTime = longObject.longValue(); } catch (MissingField mf) { throw new TarMalformatException(mf.getMessage()); } entryType = readChar(TarHeaderField.typeflag); ownerName = readString(TarHeaderField.uname); String pathPrefix = readString(TarHeaderField.prefix); if (pathPrefix != null) { path = pathPrefix + '/' + path; } // We're not loading the "gname" field, since there is nothing at // all that Java can do with it. ustar = isUstar(); } protected byte[] rawHeader; /* CRITICALLY IMPORTANT: TO NOT USE rawHeader.length OR DEPEND ON * THE LENGTH OF the rawHeader ARRAY! Use only the first 512 bytes! */ protected String path; protected int fileMode; protected long dataSize = -1; // In bytes protected long modTime; protected char entryType; protected String ownerName; protected boolean ustar; /** * @return a new Absolutized File object generated from this * TarEntryHeader. */ public File generateFile() { if (entryType != '\0' && entryType != '0') { throw new IllegalStateException( RB.create_only_normal.getString()); } // Unfortunately, it does no good to set modification times or // privileges here, since those settings have no effect on our // new file until after is created by the FileOutputStream // constructor. return new File(path); } public char getEntryType() { return entryType; } public String getPath() { return path; } /** * Setter is needed in order to override header size setting for Pax. */ public void setDataSize(long dataSize) { this.dataSize = dataSize; } public long getDataSize() { return dataSize; } public long getModTime() { return modTime; } public int getFileMode() { return fileMode; } /** * Choosing not to report fields that we don't write (e.g. "gname"), * but which would certainly be useful for a general Java tar client * implementation. * This design decision is subject to change. */ public String toString() { StringBuffer sb = new StringBuffer(sdf.format(new Long(modTime * 1000L)) + ' '); sb.append((entryType == '\0') ? ' ' : entryType); sb.append(ustar ? '*' : ' '); sb.append( " " + StringUtil.toPaddedString( Integer.toOctalString(fileMode), 4, ' ', false) + ' ' + StringUtil.toPaddedString( Long.toString(dataSize), 11, ' ', false) + " "); sb.append(StringUtil.toPaddedString(((ownerName == null) ? "-" : ownerName), 8, ' ', true)); sb.append(" " + path); return sb.toString(); } /** * Is this any UStar variant */ public boolean isUstar() throws TarMalformatException { String magicString = readString(TarHeaderField.magic); return magicString != null && magicString.startsWith("ustar"); } /** * @return index based at 0 == from */ public static int indexOf(byte[] ba, byte val, int from, int to) { for (int i = from; i < to; i++) { if (ba[i] == val) { return i - from; } } return -1; } protected char readChar(TarHeaderField field) throws TarMalformatException { /* Depends on readString(int) contract that it will never return * a 0-length String */ String s = readString(field); return (s == null) ? '\0' : s.charAt(0); } /** * @return null or String with length() > 0. */ protected String readString(TarHeaderField field) throws TarMalformatException { int start = field.getStart(); int stop = field.getStop(); int termIndex = TarEntryHeader.indexOf(rawHeader, (byte) 0, start, stop); switch (termIndex) { case 0 : return null; case -1 : termIndex = stop - start; break; } try { return new String(rawHeader, start, termIndex); } catch (Throwable t) { // Java API does not specify behavior if decoding fails. throw new TarMalformatException( RB.bad_header_value.getString(field.toString())); } } /** * Integer as in positive whole number, which does not imply Java * types of int or Integer. */ protected Long readInteger(TarHeaderField field) throws TarMalformatException { String s = readString(field); if (s == null) { return null; } try { return Long.valueOf(s, 8); } catch (NumberFormatException nfe) { throw new TarMalformatException( RB.bad_numeric_header_value.getString( field.toString(), nfe.toString())); } } protected long headerChecksum() { long sum = 0; for (int i = 0; i < 512; i++) { boolean isInRange = (i >= TarHeaderField.checksum.getStart() && i < TarHeaderField.checksum.getStop()); // We ignore current contents of the checksum field so that // this method will continue to work right, even if we later // recycle the header or RE-calculate a header. sum += isInRange ? 32 : (255 & rawHeader[i]); } return sum; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/TarHeaderField.java0000644000175000017500000001156212007547400023744 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib.tar; /** * Purely static structure defining our interface to the Tar Entry Header. * * The fields controlled here are fields for the individual tar file entries * in an archive. There is no such thing as a Header Field at the top archive * level. *

* We use header field names as they are specified in the FreeBSD man page for * tar in section 5 (Solaris and Linux have no such page in section 5). * Where we use a constant, the constant name is just the FreeBSD field name * capitalized. * Since a single field is known as either "linkflag" or "typeflag", we are * going with the UStar name typeflag for this field. *

* We purposefully define no variable for this list of fields, since * we DO NOT WANT TO access or change these values, due to application * goals or JVM limitations:

    *
  • gid *
  • uid *
  • linkname *
  • magic (UStar ID), *
  • magic version *
  • group name *
  • device major num *
  • device minor num *
* Our application has no use for these, or Java has no ability to * work with them. *

* This class will be very elegant when refactored as an enum with enumMap(s) * and using generics with auto-boxing instead of the ugly and non-validating * casts. *

* * @author Blaine Simpson (blaine dot simpson at admc dot com) */ @SuppressWarnings("boxing") public enum TarHeaderField { // 1 PAST last position (in normal Java substring fashion). /* Note that (with one exception), there is always 1 byte * between a numeric field stop and the next start. This is * because null byte must occupy the intervening position. * This is not true for non-numeric fields (which includes the * link-indicator/type-flag field, which is used as a code, * and is not necessarily numeric with UStar format). * * As a consequence, there may be NO DELIMITER after * non-numerics, which may occupy the entire field segment. * * Arg. man page for "pax" says that both original and ustar * headers must be <= 100 chars. INCLUDING the trailing \0 * character. ??? GNU tar certainly does not honor this. */ name(0, 100), mode(100, 107), uid(108, 115), gid(116, 123), size(124, 135), mtime(136, 147), // (File.lastModified()|*.getTime())/1000 checksum(148, 156),// "Queer terminator" in original code. ??? // Pax UStore does not follow spec and delimits this // field like any other numeric, skipping the space byte. typeflag(156, 157), // 1-byte CODE // With current version, we are never doing anything with this // field. In future, we will support x and/or g type here. // N.b. Gnu Tar does not honor this Stop. // The remaining are from UStar format: magic(257, 263), uname(265, 296), gname(297, 328), prefix(345, 399), ; private TarHeaderField(int start, int stop) { this.start = start; this.stop = stop; } private int start, stop; // The getters below throw RuntimExceptions instead of // TarMalformatExceptions because these errors indicate a dev problem, // not some problem with a Header, or generating or reading a Header. public int getStart() { return start; } public int getStop() { return stop; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/TarFileInputStream.java0000644000175000017500000002640712007547400024667 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib.tar; import java.io.EOFException; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.zip.GZIPInputStream; /** * Note that this class is not a java.io.FileInputStream, * because our goal is to greatly restrict the public methods of * FileInputStream, yet we must use public methods of the underlying * FileInputStream internally. Can't accomplish these goals in Java if we * subclass. *

* This class is ignorant about Tar header fields, attributes and such. * It is concerned with reading and writing blocks of data in conformance with * Tar formatting, in a way convenient to those who want to get the header and * data blocks. *

* Asymmetric to the Tar file writing side, the bufferBlocks setting here is * used only for to adjust read buffer size (for file data reads), so the user * can compromise between available memory and performance. Small buffer sizes * will always work, but will incur more reads; on the other hand, buffer sizes * larger than the largest component file is just a waste of memory. *

* We assume the responsibility to manage the setting because the decision * should be based on available RAM more than anything else (therefore, we can't * set a good value automatically). *

* As alluded to above, headers are read in separate reads, regardless of the * readBufferBlocks setting. readBufferBlocks is used for reading * file data. *

* I have purposefully not implemented skip(), because, though I haven't tested * it, I believe our readBlock() and readBlocks() methods are at least as fast, * since we use the larges read buffer within limits the user has set. *

*/ public class TarFileInputStream { /* Would love to use a RandomAccessFile, but RandomAccessFiles do not play * nicely with InputStreams or filters, and it just would not work with * compressed input. */ protected long bytesRead = 0; // Pronounced as past tense of "to read", not the other forms of "read". // I.e., the homonym of "red". private InputStream readStream; /* This is not a "Reader", but the byte "Stream" that we read() from. */ protected byte[] readBuffer; protected int readBufferBlocks; protected int compressionType; /** * Convenience wrapper to use default readBufferBlocks and compressionType. * * @see #TarFileInputStream(File, int, int) */ public TarFileInputStream(File sourceFile) throws IOException { this(sourceFile, TarFileOutputStream.Compression.DEFAULT_COMPRESSION); } /** * Convenience wrapper to use default readBufferBlocks. * * @see #TarFileInputStream(File, int, int) */ public TarFileInputStream(File sourceFile, int compressionType) throws IOException { this(sourceFile, compressionType, TarFileOutputStream.Compression.DEFAULT_BLOCKS_PER_RECORD); } public int getReadBufferBlocks() { return readBufferBlocks; } /** * This class does no validation or enforcement of file naming conventions. * If desired, the caller should enforce extensions like "tar" and * "tar.gz" (and that they match the specified compression type). *

* This object will automatically release its I/O resources when you get * false back from a readNextHeaderBlock() call. * If you abort before then, you must call the close() method like for a * normal InputStream. *

* * @see #close() * @see #readNextHeaderBlock() */ public TarFileInputStream(File sourceFile, int compressionType, int readBufferBlocks) throws IOException { if (!sourceFile.isFile()) { throw new FileNotFoundException(sourceFile.getAbsolutePath()); } if (!sourceFile.canRead()) { throw new IOException( RB.read_denied.getString(sourceFile.getAbsolutePath())); } this.readBufferBlocks = readBufferBlocks; this.compressionType = compressionType; readBuffer = new byte[readBufferBlocks * 512]; switch (compressionType) { case TarFileOutputStream.Compression.NO_COMPRESSION : readStream = new FileInputStream(sourceFile); break; case TarFileOutputStream.Compression.GZIP_COMPRESSION : readStream = new GZIPInputStream(new FileInputStream(sourceFile), readBuffer.length); break; default : throw new IllegalArgumentException( RB.compression_unknown.getString(compressionType)); } } /** * readBlocks(int) is the method that USERS of this class should use to * read file data from the tar file. * This method reads from the tar file and writes to the readBuffer array. *

* This class and subclasses should read from the underlying readStream * ONLY WITH THIS METHOD. * That way we can be confident that bytesRead will always be accurate. *

* This method is different from a typical Java byte array read command * in that when reading tar files

    *
  1. we always know ahead-of-time how many bytes we should read, and *
  2. we always want to read quantities of bytes in multiples of 512. *
*

* * @param blocks How many 512 blocks to read. * @throws IOException for an I/O error on the underlying InputStream * @throws TarMalformatException if no I/O error occurred, but we failed to * read the exact number of bytes requested. */ public void readBlocks(int blocks) throws IOException, TarMalformatException { /* int for blocks should support sizes up to about 1T, according to * my off-the-cuff calculations */ if (compressionType != TarFileOutputStream.Compression.NO_COMPRESSION) { readCompressedBlocks(blocks); return; } int i = readStream.read(readBuffer, 0, blocks * 512); bytesRead += i; if (i != blocks * 512) { throw new TarMalformatException( RB.insufficient_read.getString(blocks * 512, i)); } } /** * Work-around for the problem that compressed InputReaders don't fill * the read buffer before returning. * * Has visibility 'protected' so that subclasses may override with * different algorithms, or use different algorithms for different * compression stream. */ protected void readCompressedBlocks(int blocks) throws IOException { int bytesSoFar = 0; int requiredBytes = 512 * blocks; // This method works with individual bytes! int i; while (bytesSoFar < requiredBytes) { i = readStream.read(readBuffer, bytesSoFar, requiredBytes - bytesSoFar); if (i < 0) { throw new EOFException(RB.decompression_ranout.getString( bytesSoFar, requiredBytes)); } bytesRead += i; bytesSoFar += i; } } /** * readBlock() and readNextHeaderBlock are the methods that USERS of this * class should use to read header blocks from the tar file. *

* readBlock() should be used when you know that the current block should * contain what you want. * E.g. you know that the very first block of a tar file should contain * a Tar Entry header block. *

* * @see #readNextHeaderBlock */ public void readBlock() throws IOException, TarMalformatException { readBlocks(1); } /** * readBlock() and readNextHeaderBlock are the methods that USERS of this * class should use to read header blocks from the tar file. *

* readNextHeaderBlock continues working through the Tar File from the * current point until it finds a block with a non-0 first byte. *

* * @return True if a header block was read and place at beginning of the * readBuffer array. False if EOF was encountered without finding * any blocks with first byte != 0. If false is returned, we have * automatically closed the this TarFileInputStream too. * @see #readBlock */ public boolean readNextHeaderBlock() throws IOException, TarMalformatException { // We read a-byte-at-a-time because there should only be 2 empty blocks // between each Tar Entry. try { while (readStream.available() > 0) { readBlock(); if (readBuffer[0] != 0) { return true; } } } catch (EOFException ee) { /* This is a work-around. * Sun Java's inputStream.available() works like crap. * Reach this point when performing a read of a GZip stream when * .available == 1, which according to API Spec, should not happen. * We treat this condition exactly as if readStream.available is 0, * which it should be. */ } close(); return false; } /** * Implements java.io.Closeable. * * @see java.io.Closeable */ public void close() throws IOException { if (readStream == null) { return; } try { readStream.close(); } finally { readStream = null; // Encourage buffer GC } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/RB.java0000644000175000017500000001350012007547400021436 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib.tar; import org.hsqldb.lib.ValidatingResourceBundle; import org.hsqldb.lib.RefCapableRBInterface; /* $Id: RB.java 4141 2011-03-14 01:35:49Z fredt $ */ /** * Resource Bundle for Tar classes *

* Purpose of this class is to wrap a RefCapablePropertyResourceBundle to * reliably detect any possible use of a missing property key as soon as * this class is clinitted. * The reason for this is to allow us developers to detect all such errors * before end-users ever use this class. *

* IMPORTANT: To add a new ResourceBundle element, add two new lines, one * like

 *    public static final int NEWKEYID = keyCounter++;
 * 
and one line
 *      new Integer(KEY2), "key2",
 * 
* Both should be inserted right after all of the other lines of the same type. * NEWKEYID is obviously a new constant which you will use in calling code * like RB.NEWKEYID. *

*/ public enum RB implements RefCapableRBInterface { DbBackup_syntax, DbBackup_syntaxerr, TarGenerator_syntax, pad_block_write, cleanup_rmfail, TarReader_syntax, unsupported_entry_present, bpr_write, stream_buffer_report, write_queue_report, file_missing, modified_property, file_disappeared, file_changed, file_appeared, pif_malformat, pif_malformat_size, zero_write, pif_toobig, read_denied, compression_unknown, insufficient_read, decompression_ranout, move_work_file, cant_overwrite, cant_write_dir, no_parent_dir, bad_block_write_len, illegal_block_boundary, workfile_delete_fail, unsupported_ext, dest_exists, parent_not_dir, cant_write_parent, parent_create_fail, tar_field_toobig, missing_supp_path, nonfile_entry, read_lt_1, data_changed, unexpected_header_key, tarreader_syntaxerr, unsupported_mode, dir_x_conflict, pif_unknown_datasize, pif_data_toobig, data_size_unknown, extraction_exists, extraction_exists_notfile, extraction_parent_not_dir, extraction_parent_not_writable, extraction_parent_mkfail, write_count_mismatch, header_field_missing, checksum_mismatch, create_only_normal, bad_header_value, bad_numeric_header_value, listing_format, ; private static ValidatingResourceBundle vrb = new ValidatingResourceBundle( RB.class.getPackage().getName() + ".rb", RB.class); static { vrb.setMissingPosValueBehavior( ValidatingResourceBundle.NOOP_BEHAVIOR); vrb.setMissingPropertyBehavior( ValidatingResourceBundle.NOOP_BEHAVIOR); } public String getString() { return vrb.getString(this); } public String toString() { return ValidatingResourceBundle.resourceKeyFor(this); } public String getExpandedString() { return vrb.getExpandedString(this); } public String getExpandedString(String... strings) { return vrb.getExpandedString(this, strings); } public String getString(String... strings) { return vrb.getString(this, strings); } public String getString(int i1) { return vrb.getString(this, i1); } public String getString(int i1, int i2) { return vrb.getString(this, i1, i2); } public String getString(int i1, int i2, int i3) { return vrb.getString(this, i1, i2, i3); } public String getString(int i1, String s2) { return vrb.getString(this, i1, s2); } public String getString(String s1, int i2) { return vrb.getString(this, s1, i2); } public String getString(int i1, int i2, String s3) { return vrb.getString(this, i1, i2, s3); } public String getString(int i1, String s2, int i3) { return vrb.getString(this, i1, s2, i3); } public String getString(String s1, int i2, int i3) { return vrb.getString(this, s1, i2, i3); } public String getString(int i1, String s2, String s3) { return vrb.getString(this, i1, s3, s3); } public String getString(String s1, String s2, int i3) { return vrb.getString(this, s1, s2, i3); } public String getString(String s1, int i2, String s3) { return vrb.getString(this, s1, i2, s3); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/package.html0000644000175000017500000000047712007547402022564 0ustar renerene Contains the DbBackup class, for backing up HyperSQL databases, and support classes for handling files in tar and pax format. See the database backup section of the HyperSQL User Guide hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/tar/DbBackup.java0000644000175000017500000004336712007547402022626 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib.tar; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; import org.hsqldb.lib.InputStreamInterface; /** * Works with tar archives containing HSQLDB database instance backups. * Viz, creating, examining, or extracting these archives. *

* This class provides OO Tar backup-creation control. * The extraction and listing features are implemented only in static fashion * in the Main method, which provides a consistent interface for all three * features from the command-line. *

* For tar creation, the default behavior is to fail if the target archive * exists, and to abort if any database change is detected. * Use the JavaBean setters to changes this behavior. * See the main(String[]) method for details about command-line usage. *

* * @see * The database backup section of the HyperSQL User Guide * @see #main(String[]) * @see #setOverWrite(boolean) * @see #setAbortUponModify(boolean) * @author Blaine Simpson (blaine dot simpson at admc dot com) * @version 2.2.9 * @since 2.0.0 */ public class DbBackup { /** * Command line invocation to create, examine, or extract HSQLDB database * backup tar archives. *

* This class stores tar entries as relative files without specifying * parent directories, in what is commonly referred to as tar bomb * format. * The set of files is small, with known extensions, and the potential * inconvenience of messing up the user's current directory is more than * compensated by making it easier for the user to restore to a new * database URL location at a peer level to the original. *

* Automatically calculates buffer sizes based on the largest component * file (for "save" mode) or tar file size (for other modes). *

* Run

     *     java -cp path/to/hsqldb.jar org.hsqldb.lib.tar.DbBackup
     * 
for syntax help. *

*/ public static void main(String[] sa) throws IOException, TarMalformatException { try { if (sa.length < 1) { System.out.println( RB.DbBackup_syntax.getString(DbBackup.class.getName())); System.out.println(); System.out.println(RB.listing_format.getString()); System.exit(0); } if (sa[0].equals("--save")) { boolean overWrite = sa.length > 1 && sa[1].equals("--overwrite"); if (sa.length != (overWrite ? 4 : 3)) { throw new IllegalArgumentException(); } DbBackup backup = new DbBackup(new File(sa[sa.length - 2]), sa[sa.length - 1]); backup.setOverWrite(overWrite); backup.write(); } else if (sa[0].equals("--list")) { if (sa.length < 2) { throw new IllegalArgumentException(); } String[] patternStrings = null; if (sa.length > 2) { patternStrings = new String[sa.length - 2]; for (int i = 2; i < sa.length; i++) { patternStrings[i - 2] = sa[i]; } } new TarReader(new File(sa[1]), TarReader .LIST_MODE, patternStrings, new Integer(DbBackup .generateBufferBlockValue(new File(sa[1]))), null) .read(); } else if (sa[0].equals("--extract")) { boolean overWrite = sa.length > 1 && sa[1].equals("--overwrite"); int firstPatInd = overWrite ? 4 : 3; if (sa.length < firstPatInd) { throw new IllegalArgumentException(); } String[] patternStrings = null; if (sa.length > firstPatInd) { patternStrings = new String[sa.length - firstPatInd]; for (int i = firstPatInd; i < sa.length; i++) { patternStrings[i - firstPatInd] = sa[i]; } } File tarFile = new File(sa[overWrite ? 2 : 1]); int tarReaderMode = overWrite ? TarReader.OVERWRITE_MODE : TarReader.EXTRACT_MODE; new TarReader( tarFile, tarReaderMode, patternStrings, new Integer(DbBackup.generateBufferBlockValue(tarFile)), new File(sa[firstPatInd - 1])).read(); } else { throw new IllegalArgumentException(); } } catch (IllegalArgumentException iae) { System.out.println( RB.DbBackup_syntaxerr.getString(DbBackup.class.getName())); System.exit(2); } } protected File dbDir; protected File archiveFile; protected String instanceName; protected boolean overWrite = false; // Defaults no NO OVERWRITE protected boolean abortUponModify = true; // Defaults to ABORT-UPON-MODIFY File[] componentFiles; InputStreamInterface[] componentStreams; boolean[] existList; boolean[] ignoreList; /** * Instantiate a DbBackup instance for creating a Database Instance backup. * * Much validation is deferred until the write() method, to prevent * problems with files changing between the constructor and the write call. */ public DbBackup(File archiveFile, String dbPath) { this.archiveFile = archiveFile; File dbPathFile = new File(dbPath); dbDir = dbPathFile.getAbsoluteFile().getParentFile(); instanceName = dbPathFile.getName(); componentFiles = new File[] { new File(dbDir, instanceName + ".properties"), new File(dbDir, instanceName + ".script"), new File(dbDir, instanceName + ".data"), new File(dbDir, instanceName + ".backup"), new File(dbDir, instanceName + ".log"), new File(dbDir, instanceName + ".lobs") }; componentStreams = new InputStreamInterface[componentFiles.length]; existList = new boolean[componentFiles.length]; ignoreList = new boolean[componentFiles.length]; } /** * Used for SCRIPT backup */ public DbBackup(File archiveFile, String dbPath, boolean script) { this.archiveFile = archiveFile; File dbPathFile = new File(dbPath); dbDir = dbPathFile.getAbsoluteFile().getParentFile(); instanceName = dbPathFile.getName(); componentFiles = new File[]{ new File(dbDir, instanceName + ".script"), }; componentStreams = new InputStreamInterface[componentFiles.length]; existList = new boolean[componentFiles.length]; abortUponModify = false; } /** * Overrides file with stream. */ public void setStream(String fileExtension, InputStreamInterface is) { for (int i = 0; i < componentFiles.length; i++) { if (componentFiles[i].getName().endsWith(fileExtension)) { componentStreams[i] = is; break; } } } public void setFileIgnore(String fileExtension) { for (int i = 0; i < componentFiles.length; i++) { if (componentFiles[i].getName().endsWith(fileExtension)) { ignoreList[i] = true; break; } } } /** * Defaults to false. * * If false, then attempts to write a tar file that already exist will * abort. */ public void setOverWrite(boolean overWrite) { this.overWrite = overWrite; } /** * Defaults to true. * * If true, then the write() method will validate that the database is * closed, and it will verify that no DB file changes between when we * start writing the tar, and when we finish. */ public void setAbortUponModify(boolean abortUponModify) { this.abortUponModify = abortUponModify; } public boolean getOverWrite() { return overWrite; } public boolean getAbortUponModify() { return abortUponModify; } /** * This method always backs up the .properties and .script files. * It will back up all of .backup, .data, and .log which exist. * * If abortUponModify is set, no tar file will be created, and this * method will throw. * * @throws IOException for any of many possible I/O problems * @throws IllegalStateException only if abortUponModify is set, and * database is open or is modified. */ public void write() throws IOException, TarMalformatException { long startTime = new java.util.Date().getTime(); checkEssentialFiles(); TarGenerator generator = new TarGenerator(archiveFile, overWrite, new Integer(DbBackup.generateBufferBlockValue(componentFiles))); for (int i = 0; i < componentFiles.length; i++) { boolean exists = componentStreams[i] != null || componentFiles[i].exists(); if (!exists) { continue; // We've already verified that required files exist, therefore // there is no error condition here. } if (ignoreList[i]) { continue; } if (componentStreams[i] == null) { generator.queueEntry(componentFiles[i].getName(), componentFiles[i]); existList[i] = true; } else { generator.queueEntry(componentFiles[i].getName(), componentStreams[i]); } } generator.write(); checkFilesNotChanged(startTime); } void checkEssentialFiles() throws FileNotFoundException, IllegalStateException { if (!componentFiles[0].getName().endsWith(".properties")) { return; } for (int i = 0; i < 2; i++) { boolean exists = componentStreams[i] != null || componentFiles[i].exists(); if (!exists) { // First 2 files are REQUIRED throw new FileNotFoundException( RB.file_missing.getString( componentFiles[i].getAbsolutePath())); } } if (!abortUponModify) { return; } Properties p = new Properties(); FileInputStream fis = null; try { File propertiesFile = componentFiles[0]; fis = new FileInputStream(propertiesFile); p.load(fis); } catch (IOException io) {} finally { try { if (fis != null) { fis.close(); } } catch (IOException io) {} finally { fis = null; // Encourage buffer GC } } String modifiedString = p.getProperty("modified"); if (modifiedString != null && (modifiedString.equalsIgnoreCase("yes") || modifiedString.equalsIgnoreCase("true"))) { throw new IllegalStateException( RB.modified_property.getString(modifiedString)); } } void checkFilesNotChanged(long startTime) throws FileNotFoundException { // abortUponModify is used with offline invocation only if (!abortUponModify) { return; } try { for (int i = 0; i < componentFiles.length; i++) { if (componentFiles[i].exists()) { if (!existList[i]) { throw new FileNotFoundException( RB.file_disappeared.getString( componentFiles[i].getAbsolutePath())); } if (componentFiles[i].lastModified() > startTime) { throw new FileNotFoundException( RB.file_changed.getString( componentFiles[i].getAbsolutePath())); } } else if (existList[i]) { throw new FileNotFoundException( RB.file_appeared.getString( componentFiles[i].getAbsolutePath())); } } } catch (IllegalStateException ise) { if (!archiveFile.delete()) { System.out.println( RB.cleanup_rmfail.getString( archiveFile.getAbsolutePath())); // Be-it-known. This method can write to stderr if // abortUponModify is true. } throw ise; } } /** * @todo - Supply a version of my MemTest program which people can run * one time when the server can be starved of RAM, and save the available * RAM quantity to a text file. We can then really crank up the buffer * size to make transfers really efficient. */ /** * Return a 512-block buffer size suggestion, based on the size of what * needs to be read or written, and default and typical JVM constraints. *

* Algorithm details: *

* Minimum system I want support is a J2SE system with 256M physical * RAM. This system can hold a 61 MB byte array (real 1024^2 M). * (61MB with Java 1.6, 62MB with Java 1.4). * This decreases to just 60 MB with (pre-production, non-optimized) * HSQLDB v. 1.9 on Java 1.6. * Allow the user 40 MB of for data (this only corresponds to a much * smaller quantity of real data due to the huge overhead of Java and * database structures). * This allows 20 MB for us to use. User can easily use more than this * by raising JVM settings and/or getting more PRAM or VRAM. * Therefore, ceiling = 20MB = 20 MB / .5 Kb = 40 k blocks *

* We make the conservative simplification that each data file contains * just one huge data entry component. This is a good estimation, since in * most cases, the contents of the single largest file will be many orders * of magnitude larger than the other files and the single block entry * headers. *

* We aim for reading or writing these biggest file with 10 reads/writes. * In the case of READING Gzip files, there will actually be many more * reads than this, but that's the price you pay for smaller file size. *

* * @param files Null array elements are permitted. They will just be * skipped by the algorithm. */ static protected int generateBufferBlockValue(File[] files) { long maxFileSize = 0; for (int i = 0; i < files.length; i++) { if (files[i] == null) { continue; } if (files[i].length() > maxFileSize) { maxFileSize = files[i].length(); } } int idealBlocks = (int) (maxFileSize / (10L * 512L)); // I.e., 1/10 of the file, in units of 512 byte blocks. // It's fine that operations will truncate down instead of round. if (idealBlocks < 1) { return 1; } if (idealBlocks > 40 * 1024) { return 40 * 1024; } return idealBlocks; } /** * Convenience wrapper for generateBufferBlockValue(File[]). * * @see #generateBufferBlockValue(File[]) */ static protected int generateBufferBlockValue(File file) { return generateBufferBlockValue(new File[]{ file }); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/LongLookup.java0000644000175000017500000000344612007547400022446 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; public interface LongLookup { int add(long key, long value); long lookup(long key) throws NoSuchElementException; long lookup(long key, long def); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/InOutUtil.java0000644000175000017500000002061312007547400022244 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Serializable; import java.io.Writer; /** * Input / Output utility * * @author Fred Toussi (fredt@users dot sourceforge.net) * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @version 2.1 * @revised 1.8.0 * @since 1.7.2 */ public final class InOutUtil { /** * Implementation only supports unix line-end format and is suitable for * processing HTTP and other network protocol communications. Reads and writes * a line of data. Returns the number of bytes read/written. */ public static int readLine(InputStream in, OutputStream out) throws IOException { int count = 0; for (;;) { int b = in.read(); if (b == -1) { break; } count++; out.write(b); if (b == '\n') { break; } } return count; } /** * Retrieves the serialized form of the specified Object * as an array of bytes. * * @param s the Object to serialize * @return a static byte array representing the passed Object */ public static byte[] serialize(Serializable s) throws IOException { HsqlByteArrayOutputStream bo = new HsqlByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(bo); os.writeObject(s); return bo.toByteArray(); } /** * Deserializes the specified byte array to an * Object instance. * * @return the Object resulting from deserializing the specified array of bytes * @param ba the byte array to deserialize to an Object */ public static Serializable deserialize(byte[] ba) throws IOException, ClassNotFoundException { HsqlByteArrayInputStream bi = new HsqlByteArrayInputStream(ba); ObjectInputStream is = new ObjectInputStream(bi); return (Serializable) is.readObject(); } public static final int DEFAULT_COPY_BUFFER_SIZE = 8192; public static final long DEFAULT_COPY_AMOUNT = Long.MAX_VALUE; /** * @see #copy(java.io.InputStream, java.io.OutputStream, long, int) */ public static long copy( final InputStream inputStream, final OutputStream outputStream) throws IOException { return copy(inputStream, outputStream, DEFAULT_COPY_AMOUNT, DEFAULT_COPY_BUFFER_SIZE); } /** * @see #copy(java.io.InputStream, java.io.OutputStream, long, int) */ public static long copy( final InputStream inputStream, final OutputStream outputStream, final long amount) throws IOException { return copy(inputStream, outputStream, amount, DEFAULT_COPY_BUFFER_SIZE); } /** * the specified amount from the given input stream to the * given output stream, using a buffer of the given size. * * @param inputStream from which to source bytes * @param outputStream to which to sink bytes * @param amount max # of bytes to transfer. * @param bufferSize to use internally * @return the number of bytes actually transfered. * @throws IOException if any, thrown by either of the given stream objects */ public static long copy( final InputStream inputStream, final OutputStream outputStream, final long amount, final int bufferSize) throws IOException { // int maxBytesToRead = (int) Math.min((long) bufferSize, amount); // final byte[] buffer = new byte[maxBytesToRead]; // long bytesCopied = 0; int bytesRead; while ((bytesCopied < amount) && -1 != (bytesRead = inputStream.read(buffer, 0, maxBytesToRead))) { // outputStream.write(buffer, 0, bytesRead); if (bytesRead > Long.MAX_VALUE - bytesCopied) { // edge case... // extremely unlikely but included for 'correctness' bytesCopied = Long.MAX_VALUE; } else { bytesCopied += bytesRead; } if (bytesCopied >= amount) { return bytesCopied; } maxBytesToRead = (int) Math.min((long) bufferSize, amount - bytesCopied); } return bytesCopied; } /** * @see #copy(java.io.Reader, java.io.Writer, long, int) */ public static long copy( final Reader reader, final Writer writer) throws IOException { return copy(reader, writer, DEFAULT_COPY_AMOUNT, DEFAULT_COPY_BUFFER_SIZE); } /** * @see #copy(java.io.Reader, java.io.Writer, long, int) */ public static long copy( final Reader reader, final Writer writer, final long amount) throws IOException { return copy(reader, writer, amount, DEFAULT_COPY_BUFFER_SIZE); } /** * the specified amount from the given input stream to the * given output stream, using a buffer of the given size. * * @param inputStream from which to source characters * @param outputStream to which to sink characters * @param amount max # of characters to transfer. * @param bufferSize to use internally * @return the number of characters actually transfered. * @throws IOException if any, thrown by either of the given stream objects */ public static long copy( final Reader reader, final Writer writer, final long amount, final int bufferSize) throws IOException { // int maxCharsToRead = (int) Math.min((long) bufferSize, amount); // final char[] buffer = new char[maxCharsToRead]; // long charsCopied = 0; int charsRead; while ((charsCopied < amount) && -1 != (charsRead = reader.read(buffer, 0, maxCharsToRead))) { // writer.write(buffer, 0, charsRead); if (charsRead > Long.MAX_VALUE - charsCopied) { // edge case... // extremely unlikely but included for 'correctness' charsCopied = Long.MAX_VALUE; } else { charsCopied += charsRead; } if (charsCopied >= amount) { return charsCopied; } maxCharsToRead = (int) Math.min((long) bufferSize, amount - charsCopied); } return charsCopied; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/LineGroupReader.java0000644000175000017500000001464712007547400023411 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.LineNumberReader; import org.hsqldb.store.ValuePool; /** * Uses a LineNumberReader and returns multiple consecutive lines which conform * to the specified group demarcation characteristics. Any IOException * thrown while reading from the reader is handled internally. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.9.0 */ public class LineGroupReader { private static final String[] defaultContinuations = new String[] { " ", "*" }; private static final String[] defaultIgnoredStarts = new String[]{ "--" }; static final String LS = System.getProperty("line.separator", "\n"); // LineNumberReader reader; String nextStartLine = null; int startLineNumber = 0; int nextStartLineNumber = 0; // final String[] sectionContinuations; final String[] sectionStarts; final String[] ignoredStarts; /** * Default constructor for TestUtil usage. * Sections start at lines beginning with any non-space character. * SQL comment lines are ignored. */ public LineGroupReader(LineNumberReader reader) { this.sectionContinuations = defaultContinuations; this.sectionStarts = ValuePool.emptyStringArray; this.ignoredStarts = defaultIgnoredStarts; this.reader = reader; try { getSection(); } catch (Exception e) {} } /** * Constructor for sections starting with specified strings. */ public LineGroupReader(LineNumberReader reader, String[] sectionStarts) { this.sectionStarts = sectionStarts; this.sectionContinuations = ValuePool.emptyStringArray; this.ignoredStarts = ValuePool.emptyStringArray; this.reader = reader; try { getSection(); } catch (Exception e) {} } public HsqlArrayList getSection() { String line; HsqlArrayList list = new HsqlArrayList(); if (nextStartLine != null) { list.add(nextStartLine); startLineNumber = nextStartLineNumber; } while (true) { boolean newSection = false; line = null; try { line = reader.readLine(); } catch (Exception e) {} if (line == null) { nextStartLine = null; return list; } line = line.substring( 0, org.hsqldb.lib.StringUtil.rightTrimSize(line)); //if the line is blank or a comment, then ignore it if (line.length() == 0 || isIgnoredLine(line)) { continue; } if (isNewSectionLine(line)) { newSection = true; } if (newSection) { nextStartLine = line; nextStartLineNumber = reader.getLineNumber(); return list; } list.add(line); } } /** * Returns a map/list which contains the first line of each line group * as key and the rest of the lines as a String value. */ public HashMappedList getAsMap() { HashMappedList map = new HashMappedList(); while (true) { HsqlArrayList list = getSection(); if (list.size() < 1) { break; } String key = (String) list.get(0); String value = LineGroupReader.convertToString(list, 1); map.put(key, value); } return map; } private boolean isNewSectionLine(String line) { if (sectionStarts.length == 0) { for (int i = 0; i < sectionContinuations.length; i++) { if (line.startsWith(sectionContinuations[i])) { return false; } } return true; } else { for (int i = 0; i < sectionStarts.length; i++) { if (line.startsWith(sectionStarts[i])) { return true; } } return false; } } private boolean isIgnoredLine(String line) { for (int i = 0; i < ignoredStarts.length; i++) { if (line.startsWith(ignoredStarts[i])) { return true; } } return false; } public int getStartLineNumber() { return startLineNumber; } public void close() { try { reader.close(); } catch (Exception e) {} } public static String convertToString(HsqlArrayList list, int offset) { StringBuffer sb = new StringBuffer(); for (int i = offset; i < list.size(); i++) { sb.append(list.get(i)).append(LS); } return sb.toString(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/BaseList.java0000644000175000017500000001167312007547400022064 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; /** * Abstract base for Lists * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.0 */ abstract class BaseList { protected int elementCount; abstract Object get(int index); abstract Object remove(int index); abstract boolean add(Object o); abstract int size(); public boolean contains(Object o) { return indexOf(o) == -1 ? false : true; } public boolean remove(Object o) { int i = indexOf(o); if (i == -1) { return false; } remove(i); return true; } public int indexOf(Object o) { for (int i = 0, size = size(); i < size; i++) { Object current = get(i); if (current == null) { if (o == null) { return i; } } else if (current.equals(o)) { return i; } } return -1; } public boolean addAll(Collection other) { boolean result = false; Iterator it = other.iterator(); while (it.hasNext()) { result = true; add(it.next()); } return result; } public boolean addAll(Object[] array) { boolean result = false; for (int i = 0; i < array.length; i++) { result = true; add(array[i]); } return result; } public boolean isEmpty() { return elementCount == 0; } /** Returns a string representation */ public String toString() { StringBuffer sb = new StringBuffer(32 + elementCount * 3); sb.append("List : size="); sb.append(elementCount); sb.append(' '); sb.append('{'); Iterator it = iterator(); while (it.hasNext()) { sb.append(it.next()); if (it.hasNext()) { sb.append(','); sb.append(' '); } } sb.append('}'); return sb.toString(); } public Iterator iterator() { return new BaseListIterator(); } private class BaseListIterator implements Iterator { int counter = 0; boolean removed; public boolean hasNext() { return counter < elementCount; } public Object next() { if (counter < elementCount) { removed = false; Object returnValue = get(counter); counter++; return returnValue; } throw new NoSuchElementException(); } public int nextInt() { throw new NoSuchElementException(); } public long nextLong() { throw new NoSuchElementException(); } public void remove() { if (removed) { throw new NoSuchElementException("Iterator"); } removed = true; if (counter != 0) { BaseList.this.remove(counter - 1); counter--; // above can throw, so decrement if successful return; } throw new NoSuchElementException(); } public void setValue(Object value) { throw new NoSuchElementException(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/ClosableByteArrayOutputStream.java0000644000175000017500000003430212007547400026314 0ustar renerene/* Copyright (c) 2001-2009, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; /* $Id: ClosableByteArrayOutputStream.java 2946 2009-03-22 17:44:48Z fredt $ */ /** * @todo - finer-grained synchronization to reduce average * potential monitor contention */ /** * Provides true Closable semantics ordinarily missing in a * {@link java.io.ByteArrayOutputStream}.

* * Accumulates output in a byte array that automatically grows as needed.

* * Data is retrieved using toByteArray(), * toByteArrayInputStream(), toString() and * toString(encoding).

* * {@link #close() Closing} a ClosableByteArrayOutputStream prevents * further write operations, but all other operations may succeed until after * the first invocation of {@link #free() free()}.

* * Freeing a ClosableByteArrayOutputStream closes the stream and * releases the internal buffer, preventing successful invocation of all * operations, with the exception of size(), close(), * isClosed(), free() and isFreed().

* * This class is especially useful when an accumulating output stream must be * handed off to an extenal client under contract that the stream should * exhibit true Closable behaviour in response both to internally tracked * events and to client invocation of the OutputStream.close() method. * * @author boucherb@users * @version 1.9.0 * @since 1.9.0 */ public class ClosableByteArrayOutputStream extends OutputStream { /** * Data buffer. */ protected byte[] buf; /** * # of valid bytes in buffer. */ protected int count; /** * Whether this stream is closed. */ protected boolean closed; /** * Whether this stream is freed. */ protected boolean freed; /** * Creates a new output stream.

* * The buffer capacity is initially 32 bytes, though its size increases * if necessary. */ public ClosableByteArrayOutputStream() { this(32); } /** * Creates a new output stream with a buffer capacity of the specified * size, in bytes. * * @param size the initial size. * @exception IllegalArgumentException if size is negative. */ public ClosableByteArrayOutputStream(int size) throws IllegalArgumentException { if (size < 0) { throw new IllegalArgumentException("Negative initial size: " + size); // NOI18N } buf = new byte[size]; } /** * Writes the specified single byte. * * @param b the single byte to be written. * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this output stream has been {@link #close() closed}. */ public synchronized void write(int b) throws IOException { checkClosed(); int newcount = count + 1; if (newcount > buf.length) { buf = copyOf(buf, Math.max(buf.length << 1, newcount)); } buf[count] = (byte) b; count = newcount; } /** * Writes the specified portion of the designated octet sequence.

* * @param b the data. * @param off the start offset in the data. * @param len the number of bytes to write. * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this output stream has been {@link #close() closed}. */ public synchronized void write(byte b[], int off, int len) throws IOException { checkClosed(); if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0)) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return; } int newcount = count + len; if (newcount > buf.length) { buf = copyOf(buf, Math.max(buf.length << 1, newcount)); } System.arraycopy(b, off, buf, count, len); count = newcount; } /** * By default, does nothing.

* * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this output stream has been {@link #close() closed}. */ public void flush() throws IOException { checkClosed(); } /** * Writes the complete contents of this stream's accumulated data to the * specified output stream.

* * The operation occurs as if by calling out.write(buf, 0, count). * * @param out the output stream to which to write the data. * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this output stream has been {@link #free() freed}. */ public synchronized void writeTo(OutputStream out) throws IOException { checkFreed(); out.write(buf, 0, count); } /** * Returns the current capacity of this stream's data buffer. * * @return the length of the internal data array * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this output stream has been {@link #free() freed}. */ public synchronized int capacity() throws IOException { checkFreed(); return buf.length; } /** * Resets the count field of this output stream to zero, so that * all currently accumulated data is effectively discarded.

* * Further write operations will reuse the allocated buffer space.

* * @see #count * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this output stream has been {@link #close() closed}. */ public synchronized void reset() throws IOException { checkClosed(); count = 0; } /** * Attempts to reduce this stream's capacity to its current size.

* * If the data buffer is larger than necessary to hold its current sequence * of bytes, then it may be resized to become more space efficient. * Calling this method may, but is not required to, affect the value * returned by a subsequent call to the {@link #capacity()} method.

* * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this output stream has been {@link #free() freed}. */ public synchronized void trimToSize() throws IOException { checkFreed(); if (buf.length > count) { buf = copyOf(buf, count); } } /** * Retrieves a copy of this stream's accumated data, as a byte array. * * @return a copy of this stream's accumated data, as a byte array. * @see #size() * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this output stream has been {@link #free() freed}. */ public synchronized byte[] toByteArray() throws IOException { checkFreed(); return copyOf(buf, count); } /** * Returns the current size of this stream's accumated data. * * @return the value of the count field, which is the number * of valid bytes in this output stream. * @see #count * @throws java.io.IOException never */ public synchronized int size() throws IOException { return count; } /** * Sets the size of this stream's accumulated data.

* * @param newSize the new size * @throws ArrayIndexOutOfBoundsException if new size is negative */ public synchronized void setSize(int newSize) { if (newSize < 0) { throw new ArrayIndexOutOfBoundsException(newSize); } else if (newSize > buf.length) { buf = copyOf(buf, Math.max(buf.length << 1, newSize)); } count = newSize; } /** * Performs an effecient (zero-copy) conversion of the data accumulated in * this output stream to an input stream.

* * To ensure the future integrity of the resulting input stream, {@link * #free() free} is invoked upon this output stream as a side-effect. * * @return an input stream representing this output stream's accumulated * data * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this output stream has been {@link #free() freed}. */ public synchronized ByteArrayInputStream toByteArrayInputStream() throws IOException { checkFreed(); ByteArrayInputStream inputStream = new ByteArrayInputStream(buf, 0, count); free(); return inputStream; } /** * Converts this stream's accumuated data into a string, translating bytes * into characters according to the platform's default character encoding. * * @return String translated from this stream's accumuated data. * @throws RuntimeException may be thrown if this output stream has been * {@link #free() freed}. */ public synchronized String toString() { try { checkFreed(); } catch (IOException ex) { throw new RuntimeException(ex.toString()); } return new String(buf, 0, count); } /** * Converts this stream's accumuated data into a string, translating bytes * into characters according to the specified character encoding. * * @return String translated from the buffer's contents. * @param enc a character-encoding name. * @throws java.io.IOException may be thrown if this output stream has been * {@link #free() freed}. * @throws UnsupportedEncodingException If the named encoding is not * supported. */ public synchronized String toString(String enc) throws IOException, UnsupportedEncodingException { checkFreed(); return new String(buf, 0, count, enc); } /** * Closes this object for further writing.

* * Other operations may continue to succeed until after the first invocation * of {@link #free() free()}.

* * @throws java.io.IOException if an I/O error occurs (default: never) */ public synchronized void close() throws IOException { closed = true; } /** * Retrieves whether this stream is closed.

* @return true if this stream is closed, else false */ public synchronized boolean isClosed() { return closed; } /** * Closes this object and releases the underlying buffer for * garbage collection.

* * @throws java.io.IOException if an I/O error occurs while closing * this stream (default: never). */ public synchronized void free() throws IOException { closed = true; freed = true; buf = null; count = 0; } /** * Retrieves whether this stream is freed.

* * @return true if this stream is freed; else false. */ public synchronized boolean isFreed() { return freed; } /** * Tests whether this stream is closed.

* * @throws java.io.IOException if this stream is closed. */ protected synchronized void checkClosed() throws IOException { if (closed) { throw new IOException("stream is closed."); // NOI18N } } /** * Tests whether this stream is freed.

* * @throws java.io.IOException if this stream is freed. */ protected synchronized void checkFreed() throws IOException { if (freed) { throw new IOException("stream buffer is freed."); // NOI18N } } /** * Retrieves a copy of original with the given * newLength.

* * @param original the object to copy * @param newLength the length of the copy * @return copy of original with the given newLength */ protected byte[] copyOf(byte[] original, int newLength) { byte[] copy = new byte[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HashMappedList.java0000644000175000017500000001373212007547402023224 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; /** * Implementation of an Map which maintains the user-defined order of the keys. * Key/value pairs can be accessed by index or by key. Iterators return the * keys or values in the index order. * * This class does not store null keys. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public class HashMappedList extends HashMap { public HashMappedList() { this(8); } public HashMappedList(int initialCapacity) throws IllegalArgumentException { super(initialCapacity); isList = true; } public Object get(int index) throws IndexOutOfBoundsException { checkRange(index); return objectValueTable[index]; } public Object remove(Object key) { int lookup = getLookup(key, key.hashCode()); if (lookup < 0) { return null; } Object returnValue = super.remove(key); removeRow(lookup); return returnValue; } public Object remove(int index) throws IndexOutOfBoundsException { checkRange(index); return remove(objectKeyTable[index]); } public boolean add(Object key, Object value) { int lookup = getLookup(key, key.hashCode()); if (lookup >= 0) { return false; } super.put(key, value); return true; } public Object put(Object key, Object value) { return super.put(key, value); } public Object set(int index, Object value) throws IndexOutOfBoundsException { checkRange(index); Object returnValue = objectKeyTable[index]; objectKeyTable[index] = value; return returnValue; } public boolean insert(int index, Object key, Object value) throws IndexOutOfBoundsException { if (index < 0 || index > size()) { throw new IndexOutOfBoundsException(); } int lookup = getLookup(key, key.hashCode()); if (lookup >= 0) { return false; } if (index == size()) { return add(key, value); } HashMappedList hm = new HashMappedList(size()); for (int i = index; i < size(); i++) { hm.add(getKey(i), get(i)); } for (int i = size() - 1; i >= index; i--) { remove(i); } for (int i = 0; i < hm.size(); i++) { add(hm.getKey(i), hm.get(i)); } return true; } public boolean set(int index, Object key, Object value) throws IndexOutOfBoundsException { checkRange(index); if (keySet().contains(key) && getIndex(key) != index) { return false; } super.remove(objectKeyTable[index]); super.put(key, value); return true; } public boolean setKey(int index, Object key) throws IndexOutOfBoundsException { checkRange(index); Object value = objectValueTable[index]; return set(index, key, value); } public boolean setValue(int index, Object value) throws IndexOutOfBoundsException { boolean result; Object existing = objectValueTable[index]; if (value == null) { result = value != existing; } else { result = !value.equals(existing); } objectValueTable[index] = value; return result; } public Object getKey(int index) throws IndexOutOfBoundsException { checkRange(index); return objectKeyTable[index]; } public int getIndex(Object key) { return getLookup(key, key.hashCode()); } public Object[] toValuesArray(Object[] a) { int size = size(); if (a == null || a.length < size) { a = new Object[size]; } for (int i = 0; i < size; i++) { a[i] = super.objectValueTable[i]; } return a; } public Object[] toKeysArray(Object[] a) { int size = size(); if (a == null || a.length < size) { a = new Object[size]; } for (int i = 0; i < size; i++) { a[i] = super.objectKeyTable[i]; } return a; } private void checkRange(int i) { if (i < 0 || i >= size()) { throw new IndexOutOfBoundsException(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/OrderedHashSet.java0000644000175000017500000001234712007547400023221 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; /** * Implementation of an ordered Set which maintains the inserted order of * elements and allows access by index. Iterators return the * elements in the index order. * * This class does not store null elements. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class OrderedHashSet extends HashSet implements HsqlList, Set { public OrderedHashSet() { super(8); isList = true; } public boolean remove(Object key) { return super.removeObject(key, true) != null; } public Object remove(int index) throws IndexOutOfBoundsException { checkRange(index); return super.removeObject(objectKeyTable[index], true); } public boolean insert(int index, Object key) throws IndexOutOfBoundsException { if (index < 0 || index > size()) { throw new IndexOutOfBoundsException(); } if (contains(key)) { return false; } if (index == size()) { return add(key); } Object[] array = new Object[size()]; toArray(array); super.clear(); for (int i = 0; i < index; i++) { add(array[i]); } add(key); for (int i = index; i < array.length; i++) { add(array[i]); } return true; } public Object set(int index, Object key) throws IndexOutOfBoundsException { throw new IndexOutOfBoundsException(); } public void add(int index, Object key) throws IndexOutOfBoundsException { throw new IndexOutOfBoundsException(); } public Object get(int index) throws IndexOutOfBoundsException { checkRange(index); return objectKeyTable[index]; } public void toArray(Object[] array) { System.arraycopy(super.objectKeyTable, 0, array, 0, array.length); } public int getIndex(Object key) { return getLookup(key, key.hashCode()); } public int getLargestIndex(OrderedHashSet other) { int max = -1; for (int i = 0, size = other.size(); i < size; i++) { int index = getIndex(other.get(i)); if (index > max) { max = index; } } return max; } public int getSmallestIndex(OrderedHashSet other) { int min = -1; for (int i = 0, size = other.size(); i < size; i++) { int index = getIndex(other.get(i)); if (index != -1) { if (min == -1 || index < min) { min = index; } } } return min; } public int getCommonElementCount(Set other) { int count = 0; for (int i = 0, size = size(); i < size; i++) { if (other.contains(objectKeyTable[i])) { count++; } } return count; } public static OrderedHashSet addAll(OrderedHashSet first, OrderedHashSet second) { if (second == null) { return first; } if (first == null) { first = new OrderedHashSet(); } first.addAll(second); return first; } public static OrderedHashSet add(OrderedHashSet first, Object value) { if (value == null) { return first; } if (first == null) { first = new OrderedHashSet(); } first.add(value); return first; } private void checkRange(int i) { if (i < 0 || i >= size()) { throw new IndexOutOfBoundsException(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/ArrayCounter.java0000644000175000017500000001316212007547400022767 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; /** * Collection of routines for counting the distribution of the values * in an int[] array. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.7.2 * @since 1.7.2 */ public class ArrayCounter { /** * Returns an int[] array of length segments containing the distribution * count of the elements in unsorted int[] array with values between min * and max (range). Values outside the min-max range are ignored

* * A usage example is determining the count of people of each age group * in a large int[] array containing the age of each person. Called with * (array, 16,0,79), it will return an int[16] with the first element * the count of people aged 0-4, the second element the count of those * aged 5-9, and so on. People above the age of 79 are excluded. If the * range is not a multiple of segments, the last segment will be cover a * smaller sub-range than the rest. * */ public static int[] countSegments(int[] array, int elements, int segments, int start, int limit) { int[] counts = new int[segments]; long interval = calcInterval(segments, start, limit); int index = 0; int element = 0; if (interval <= 0) { return counts; } for (int i = 0; i < elements; i++) { element = array[i]; if (element < start || element >= limit) { continue; } index = (int) ((element - start) / interval); counts[index]++; } return counts; } /** * With an unsorted int[] array and with target a positive integer in the * range (1,array.length), finds the value in the range (start,limit) of the * largest element (rank) where the count of all smaller elements in that * range is less than or equals target. Parameter margin indicates the * margin of error in target

* * In statistics, this can be used to calculate a median or quadrile value. * A usage example applied to an array of age values is to determine * the maximum age of a given number of people. With the example array * given in countSegments, rank(array, c, 6000, 18, 65, 0) will return an age * value between 18-64 (inclusive) and the count of all people aged between * 18 and the returned value(exclusive) will be less than or equal 6000. * */ public static int rank(int[] array, int elements, int target, int start, int limit, int margin) { final int segments = 256; int elementCount = 0; int currentLimit = limit; for (;;) { long interval = calcInterval(segments, start, currentLimit); int[] counts = countSegments(array, elements, segments, start, currentLimit); for (int i = 0; i < counts.length; i++) { if (elementCount + counts[i] < target) { elementCount += counts[i]; start += interval; } else { break; } } if (elementCount + margin >= target) { return start; } if (interval <= 1) { return start; } currentLimit = start + interval < limit ? (int) (start + interval) : limit; } } /** * Helper method to calculate the span of the sub-interval. Simply returns * the cieling of ((limit - start) / segments) and accounts for invalid * start and limit combinations. */ static long calcInterval(int segments, int start, int limit) { long range = limit - start; if (range < 0) { return 0; } int partSegment = (range % segments) == 0 ? 0 : 1; return (range / segments) + partSegment; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/ReaderInputStream.java0000644000175000017500000000467412007547402023761 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.IOException; import java.io.InputStream; import java.io.Reader; /** * This class is an part implementation of DataInput. It wraps a Reader object. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.9.0 */ public class ReaderInputStream extends InputStream { protected Reader reader; protected long pos; int lastChar = -1; public ReaderInputStream(Reader reader) { this.reader = reader; this.pos = 0; } public int read() throws IOException { if (lastChar >= 0) { int val = lastChar & 0xff; lastChar = -1; pos++; return val; } lastChar = reader.read(); if (lastChar < 0) { return lastChar; } pos++; return lastChar >> 8; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HsqlByteArrayOutputStream.java0000644000175000017500000002243112007547400025477 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.DataOutput; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.UTFDataFormatException; import java.io.UnsupportedEncodingException; /** * This class is a replacement for both java.io.ByteArrayOuputStream * (without synchronization) and java.io.DataOutputStream * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.0 */ public class HsqlByteArrayOutputStream extends java.io.OutputStream implements DataOutput { protected byte[] buffer; protected int count; public HsqlByteArrayOutputStream() { this(128); } public HsqlByteArrayOutputStream(int size) { if (size < 128) { size = 128; } buffer = new byte[size]; } public HsqlByteArrayOutputStream(byte[] buffer) { this.buffer = buffer; } /** * Constructor from an InputStream limits size to the length argument. * Throws if the actual length of the InputStream is smaller than * length value. */ public HsqlByteArrayOutputStream(InputStream input, int length) throws IOException { buffer = new byte[length]; int used = write(input, length); if (used != length) { throw new EOFException(); } } public HsqlByteArrayOutputStream(InputStream input) throws IOException { buffer = new byte[128]; for (;;) { int read = input.read(buffer, count, buffer.length - count); if (read == -1) { break; } count += read; if (count == buffer.length) { ensureRoom(128); } } } // methods that implement dataOutput public void writeShort(int v) { ensureRoom(2); buffer[count++] = (byte) (v >>> 8); buffer[count++] = (byte) v; } public void writeInt(int v) { if (count + 4 > buffer.length) { ensureRoom(4); } buffer[count++] = (byte) (v >>> 24); buffer[count++] = (byte) (v >>> 16); buffer[count++] = (byte) (v >>> 8); buffer[count++] = (byte) v; } public void writeLong(long v) { writeInt((int) (v >>> 32)); writeInt((int) v); } public final void writeBytes(String s) { int len = s.length(); ensureRoom(len); for (int i = 0; i < len; i++) { buffer[count++] = (byte) s.charAt(i); } } public final void writeFloat(float v) { writeInt(Float.floatToIntBits(v)); } public final void writeDouble(double v) { writeLong(Double.doubleToLongBits(v)); } public void writeBoolean(boolean v) { ensureRoom(1); buffer[count++] = (byte) (v ? 1 : 0); } public void writeByte(int v) { ensureRoom(1); buffer[count++] = (byte) (v); } public void writeChar(int v) { ensureRoom(2); buffer[count++] = (byte) (v >>> 8); buffer[count++] = (byte) v; } public void writeChars(String s) { int len = s.length(); ensureRoom(len * 2); for (int i = 0; i < len; i++) { int v = s.charAt(i); buffer[count++] = (byte) (v >>> 8); buffer[count++] = (byte) v; } } public void writeUTF(String str) throws IOException { int len = str.length(); if (len > 0xffff) { throw new UTFDataFormatException(); } ensureRoom(len * 3 + 2); // int initpos = count; count += 2; StringConverter.stringToUTFBytes(str, this); int bytecount = count - initpos - 2; if (bytecount > 0xffff) { count = initpos; throw new UTFDataFormatException(); } buffer[initpos++] = (byte) (bytecount >>> 8); buffer[initpos] = (byte) bytecount; } /** * does nothing */ public void flush() throws java.io.IOException {} // methods that extend java.io.OutputStream public void write(int b) { ensureRoom(1); buffer[count++] = (byte) b; } public void write(byte[] b) { write(b, 0, b.length); } public void write(byte[] b, int off, int len) { ensureRoom(len); System.arraycopy(b, off, buffer, count, len); count += len; } public String toString() { return new String(buffer, 0, count); } public void close() throws IOException {} // additional public methods not in similar java.util classes public void writeNoCheck(int b) { buffer[count++] = (byte) b; } public void writeChars(char[] charArray) { int len = charArray.length; ensureRoom(len * 2); for (int i = 0; i < len; i++) { int v = charArray[i]; buffer[count++] = (byte) (v >>> 8); buffer[count++] = (byte) v; } } public int write(InputStream input, int countLimit) throws IOException { int left = countLimit; ensureRoom(countLimit); while (left > 0) { int read = input.read(buffer, count, left); if (read == -1) { break; } left -= read; count += read; } return countLimit - left; } public int write(Reader input, int countLimit) throws IOException { int left = countLimit; ensureRoom(countLimit * 2); while (left > 0) { int c = input.read(); if (c == -1) { break; } writeChar(c); left--; } return countLimit - left; } public void writeTo(OutputStream out) throws IOException { out.write(buffer, 0, count); } public void reset() { count = 0; } public byte[] toByteArray() { byte[] newbuf = new byte[count]; System.arraycopy(buffer, 0, newbuf, 0, count); return newbuf; } public int size() { return count; } public void setPosition(int newPos) { if (newPos > buffer.length) { throw new ArrayIndexOutOfBoundsException(); } count = newPos; } public String toString(String enc) throws UnsupportedEncodingException { return new String(buffer, 0, count, enc); } public void write(char[] c, int off, int len) { ensureRoom(len * 2); for (int i = off; i < len; i++) { int v = c[i]; buffer[count++] = (byte) (v >>> 8); buffer[count++] = (byte) v; } } public void fill(int b, int len) { ensureRoom(len); for (int i = 0; i < len; i++) { buffer[count++] = (byte) b; } } public byte[] getBuffer() { return this.buffer; } public void ensureRoom(int extra) { int newcount = count + extra; int newsize = buffer.length; if (newcount > newsize) { while (newcount > newsize) { newsize *= 2; } byte[] newbuf = new byte[newsize]; System.arraycopy(buffer, 0, newbuf, 0, count); buffer = newbuf; } } public void reset(int newSize) { count = 0; if (newSize > buffer.length) { buffer = new byte[newSize]; } } public void reset(byte[] buffer) { count = 0; this.buffer = buffer; } public void setSize(int size) { if (size > buffer.length) { reset(size); } count = size; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/java/0000755000175000017500000000000012007570424020426 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/java/JavaSystem.java0000644000175000017500000001352612007547400023364 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib.java; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.DriverManager; import java.util.Properties; import java.text.Collator; import java.io.RandomAccessFile; /** * Handles the differences between JDK 1.1.x and 1.2.x and above * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 */ public class JavaSystem { // variables to track rough count on object creation, to use in gc public static int gcFrequency; public static int memoryRecords; // Garbage Collection public static void gc() { if ((gcFrequency > 0) && (memoryRecords > gcFrequency)) { memoryRecords = 0; System.gc(); } } public static IOException toIOException(Throwable t) { if (t instanceof IOException) { return (IOException) t; } //#ifdef JAVA6 return new IOException(t); //#else /* return new IOException(t.getMessage()); */ //#endif JAVA6 } static final BigDecimal BD_1 = BigDecimal.valueOf(1L); static final BigDecimal MBD_1 = BigDecimal.valueOf(-1L); public static int precision(BigDecimal o) { if (o == null) { return 0; } //#ifdef JAVA6 int precision; if (o.compareTo(BD_1) < 0 && o.compareTo(MBD_1) > 0) { precision = o.scale(); } else { precision = o.precision(); } return precision; //#else /* if (o.compareTo(BD_1) < 0 && o.compareTo(MBD_1) > 0) { return o.scale(); } BigInteger big = o.unscaledValue(); int sign = big.signum() == -1 ? 1 : 0; return big.toString().length() - sign; */ //#endif JAVA6 } public static String toString(BigDecimal o) { if (o == null) { return null; } //#ifdef JAVA6 return o.toPlainString(); //#else /* return o.toString(); */ //#endif JAVA6 } public static int compareIngnoreCase(String a, String b) { //#ifdef JAVA2FULL return a.compareToIgnoreCase(b); //#else /* return a.toUpperCase().compareTo(b.toUpperCase()); */ //#endif JAVA2 } public static double parseDouble(String s) { //#ifdef JAVA2FULL return Double.parseDouble(s); //#else /* return new Double(s).doubleValue(); */ //#endif JAVA2 } public static BigInteger unscaledValue(BigDecimal o) { //#ifdef JAVA2FULL return o.unscaledValue(); //#else /* int scale = o.scale(); return o.movePointRight(scale).toBigInteger(); */ //#endif } public static void setLogToSystem(boolean value) { //#ifdef JAVA2FULL try { PrintWriter newPrintWriter = (value) ? new PrintWriter(System.out) : null; DriverManager.setLogWriter(newPrintWriter); } catch (Exception e) {} //#else /* try { PrintStream newOutStream = (value) ? System.out : null; DriverManager.setLogStream(newOutStream); } catch (Exception e){} */ //#endif } public static void deleteOnExit(File f) { //#ifdef JAVA2FULL f.deleteOnExit(); //#endif } public static void saveProperties(Properties props, String name, OutputStream os) throws IOException { //#ifdef JAVA2FULL props.store(os, name); //#else /* props.save(os, name); */ //#endif } public static void runFinalizers() { //#ifdef JAVA2FULL System.runFinalizersOnExit(true); //#endif } public static boolean createNewFile(File file) { //#ifdef JAVA2FULL try { return file.createNewFile(); } catch (IOException e) {} return false; //#else /* return true; */ //#endif } public static void setRAFileLength(RandomAccessFile raFile, long length) throws IOException { //#ifdef JAVA2FULL raFile.setLength(length); //#endif } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/StringComparator.java0000644000175000017500000000412012007547402023643 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.Comparator; public class StringComparator implements Comparator { /* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.9.0 */ public int compare(Object a, Object b) { // handle nulls if (a == b) { return 0; } if (a == null) { return -1; } if (b == null) { return 1; } return ((String) a).compareTo((String) b); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/Storage.java0000644000175000017500000000464612007547400021764 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.IOException; /** * An interface that is used by OpenOffice.org. New versions should use the * org.hsqldb.persist.RandomAccessInterface instead * * @author Ocke Janssen oj@openoffice.org * @version 1.8.0 * @since 1.8.0 */ public interface Storage { long length() throws IOException; void seek(long position) throws IOException; long getFilePointer() throws IOException; int read() throws IOException; void read(byte[] b, int offset, int length) throws IOException; void write(byte[] b, int offset, int length) throws IOException; int readInt() throws IOException; void writeInt(int i) throws IOException; long readLong() throws IOException; void writeLong(long i) throws IOException; void close() throws IOException; boolean isReadOnly(); boolean wasNio(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/LongKeyLongValueHashMap.java0000644000175000017500000001233212007547400024776 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; import org.hsqldb.store.BaseHashMap; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public class LongKeyLongValueHashMap extends BaseHashMap { private Set keySet; private Collection values; public LongKeyLongValueHashMap() { this(8); } public LongKeyLongValueHashMap(boolean minimize) { this(8); minimizeOnEmpty = minimize; } public LongKeyLongValueHashMap(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.longKeyOrValue, BaseHashMap.longKeyOrValue, false); } public long get(long key) throws NoSuchElementException { int lookup = getLookup(key); if (lookup != -1) { return longValueTable[lookup]; } throw new NoSuchElementException(); } public long get(long key, long defaultValue) { int lookup = getLookup(key); if (lookup != -1) { return longValueTable[lookup]; } return defaultValue; } public boolean get(long key, long[] value) { int lookup = getLookup(key); if (lookup != -1) { value[0] = longValueTable[lookup]; return true; } return false; } public boolean put(long key, long value) { int oldSize = size(); super.addOrRemove(key, value, null, null, false); return oldSize != size(); } public boolean remove(long key) { int oldSize = size(); super.addOrRemove(key, 0, null, null, true); return oldSize != size(); } public Set keySet() { if (keySet == null) { keySet = new KeySet(); } return keySet; } public Collection values() { if (values == null) { values = new Values(); } return values; } class KeySet implements Set { public Iterator iterator() { return LongKeyLongValueHashMap.this.new BaseHashIterator(true); } public int size() { return LongKeyLongValueHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public Object get(Object key) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { LongKeyLongValueHashMap.this.clear(); } } class Values implements Collection { public Iterator iterator() { return LongKeyLongValueHashMap.this.new BaseHashIterator(false); } public int size() { return LongKeyLongValueHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { LongKeyLongValueHashMap.this.clear(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/ValidatingResourceBundle.java0000644000175000017500000003012012007547400025266 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.Set; import java.util.HashSet; import java.util.Enumeration; /* $Id: ValidatingResourceBundle.java 4141 2011-03-14 01:35:49Z fredt $ */ /** * Purpose of this class is to wrap a RefCapablePropertyResourceBundle to * reliably detect any possible use of a missing property key as soon as * this class is clinitted. * The reason for this is to allow us developers to detect all such errors * before end-users ever use this class. * * See SqltoolRB for an example implementation of this abstract class. */ public class ValidatingResourceBundle { protected boolean validated = false; protected Class> enumType; public static final int THROW_BEHAVIOR = RefCapablePropertyResourceBundle.THROW_BEHAVIOR; public static final int EMPTYSTRING_BEHAVIOR = RefCapablePropertyResourceBundle.EMPTYSTRING_BEHAVIOR; public static final int NOOP_BEHAVIOR = RefCapablePropertyResourceBundle.NOOP_BEHAVIOR; /* Three constants above are only so caller doesn't need to know * details of RefCapablePropertyResourceBundle (and they won't need * to code that God-awfully-long class name). */ protected RefCapablePropertyResourceBundle wrappedRCPRB; public static String resourceKeyFor(Enum enumKey) { return enumKey.name().replace('_', '.'); } public ValidatingResourceBundle( String baseName, Class> enumType) { this.enumType = enumType; try { wrappedRCPRB = RefCapablePropertyResourceBundle.getBundle(baseName, enumType.getClassLoader()); validate(); } catch (RuntimeException re) { System.err.println("Failed to initialize resource bundle: " + re); // Make extra sure that the source of this fatal startup condition // is not hidden. throw re; } } // The following methods are a passthru wrappers for the wrapped RCPRB. /** @see RefCapablePropertyResourceBundle#getString(String) */ public String getString(Enum key) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return wrappedRCPRB.getString(key.toString()); } /** @see RefCapablePropertyResourceBundle#getString(String, String[], int) */ public String getString(Enum key, String... strings) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return wrappedRCPRB.getString( key.toString(), strings, missingPosValueBehavior); } /** @see RefCapablePropertyResourceBundle#getExpandedString(String, int) */ public String getExpandedString(Enum key) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return wrappedRCPRB.getExpandedString(key.toString(), missingPropertyBehavior); } /** @see RefCapablePropertyResourceBundle#getExpandedString(String, String[], int, int) */ public String getExpandedString(Enum key, String... strings) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return wrappedRCPRB.getExpandedString(key.toString(), strings, missingPropertyBehavior, missingPosValueBehavior); } private int missingPropertyBehavior = THROW_BEHAVIOR; private int missingPosValueBehavior = THROW_BEHAVIOR; /** * Set behavior for get*String*() method when a referred-to * System Property is not set. Set to one of *

    *
  • RefCapablePropertyResourceBundle.THROW_BEHAVIOR *
  • RefCapablePropertyResourceBundle.EMPTYSTRING_BEHAVIOR *
  • RefCapablePropertyResourceBundle.NOOP_BEHAVIOR *
* The first value is the default. */ public void setMissingPropertyBehavior(int missingPropertyBehavior) { this.missingPropertyBehavior = missingPropertyBehavior; } /** * Set behavior for get*String(String, String[]) method when a * positional index (like %{4}) is used but no subs value was given for * that index. Set to one of *
    *
  • RefCapablePropertyResourceBundle.THROW_BEHAVIOR *
  • RefCapablePropertyResourceBundle.EMPTYSTRING_BEHAVIOR *
  • RefCapablePropertyResourceBundle.NOOP_BEHAVIOR *
* The first value is the default. */ public void setMissingPosValueBehavior(int missingPosValueBehavior) { this.missingPosValueBehavior = missingPosValueBehavior; } public int getMissingPropertyBehavior() { return missingPropertyBehavior; } public int getMissingPosValueBehavior() { return missingPosValueBehavior; } public void validate() { String val; if (validated) return; validated = true; Set resKeysFromEls = new HashSet(); for (Enum e : enumType.getEnumConstants()) resKeysFromEls.add(e.toString()); Enumeration allKeys = wrappedRCPRB.getKeys(); while (allKeys.hasMoreElements()) { // We can't test positional parameters, but we can verify that // referenced files exist by reading the values. // Pretty inefficient, but this can be optimized when I have time. val = allKeys.nextElement(); wrappedRCPRB.getString(val); // because it throws if missing? // Keep no reference to the returned String resKeysFromEls.remove(val); } if (resKeysFromEls.size() > 0) throw new RuntimeException( "Resource Bundle pre-validation failed. " + "Missing property with key: " + resKeysFromEls); } /* Convenience wrappers follow for getString(int, String[]) for up to * 3 int and/or String positionals or any number of just String positions */ public String getString(Enum key, int i1) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return getString(key, new String[] {Integer.toString(i1)}); } public String getString(Enum key, int i1, int i2) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return getString(key, new String[] { Integer.toString(i1), Integer.toString(i2) }); } public String getString(Enum key, int i1, int i2, int i3) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return getString(key, new String[] { Integer.toString(i1), Integer.toString(i2), Integer.toString(i3) }); } public String getString(Enum key, int i1, String s2) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return getString(key, new String[] { Integer.toString(i1), s2 }); } public String getString(Enum key, String s1, int i2) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return getString(key, new String[] { s1, Integer.toString(i2) }); } public String getString(Enum key, int i1, int i2, String s3) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return getString(key, new String[] { Integer.toString(i1), Integer.toString(i2), s3 }); } public String getString(Enum key, int i1, String s2, int i3) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return getString(key, new String[] { Integer.toString(i1), s2, Integer.toString(i3) }); } public String getString(Enum key, String s1, int i2, int i3) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return getString(key, new String[] { s1, Integer.toString(i2), Integer.toString(i3) }); } public String getString(Enum key, int i1, String s2, String s3) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return getString(key, new String[] { Integer.toString(i1), s2, s3 }); } public String getString(Enum key, String s1, String s2, int i3) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return getString(key, new String[] { s1, s2, Integer.toString(i3) }); } public String getString(Enum key, String s1, int i2, String s3) { if (!enumType.isInstance(key)) throw new IllegalArgumentException( "Key is a " + key.getClass().getName() + ",not a " + enumType.getName() + ": " + key); return getString(key, new String[] { s1, Integer.toString(i2), s3 }); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/SimpleLog.java0000644000175000017500000001431612007547402022250 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; import org.hsqldb.HsqlDateTime; /** * Simple log for recording abnormal events in persistence

* Log levels, LOG_NONE, LOG_ERROR, and LOG_NORMAL are currently supported.

* LOG_ERROR corresponds to property value 1 and logs main database events plus * any major errors encountered in operation. * LOG_NORMAL corresponds to property value 2 and logs additional normal events * and minor errors. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.8.0 */ public class SimpleLog { public static final int LOG_NONE = 0; public static final int LOG_ERROR = 1; public static final int LOG_NORMAL = 2; public static final int LOG_DETAIL = 3; // public static final String logTypeNameEngine = "ENGINE"; public static final String[] appLogTypeNames = { "", "ERROR ", "NORMAL", "DETAIL" }; public static final String[] sqlLogTypeNames = { "", "BASIC ", "NORMAL", "DETAIL" }; // private PrintWriter writer; private int level; private boolean isSystem; private boolean isSQL; String[] logTypeNames; private String filePath; private StringBuffer sb; public SimpleLog(String path, int level, boolean isSQL) { this.isSystem = path == null; this.filePath = path; this.isSQL = isSQL; logTypeNames = isSQL ? sqlLogTypeNames : appLogTypeNames; sb = new StringBuffer(256); setLevel(level); } private void setupWriter() { if (level == LOG_NONE) { close(); return; } if (writer == null) { if (isSystem) { writer = new PrintWriter(System.out); } else { File file = new File(filePath); setupLog(file); } } } private void setupLog(File file) { try { FileUtil.getFileUtil().makeParentDirectories(file); writer = new PrintWriter(new FileWriter(file, true), true); } catch (Exception e) { isSystem = true; writer = new PrintWriter(System.out); } } public int getLevel() { return level; } public void setLevel(int level) { this.level = level; setupWriter(); } public PrintWriter getPrintWriter() { return writer; } public synchronized void logContext(int atLevel, String message) { if (level < atLevel) { return; } sb.append(HsqlDateTime.getSystemTimeString()).append(' '); sb.append(logTypeNames[atLevel]).append(' ').append(message); writer.println(sb.toString()); sb.setLength(0); } public synchronized void logContext(int atLevel, String prefix, String message, String suffix) { if (level < atLevel) { return; } sb.append(HsqlDateTime.getSystemTimeString()).append(' '); sb.append(logTypeNames[atLevel]).append(' ').append(prefix); sb.append(' ').append(message).append(' ').append(suffix); writer.println(sb.toString()); sb.setLength(0); } public synchronized void logContext(Throwable t, String message, int atLevel) { if (level == LOG_NONE) { return; } if (writer == null) { return; } sb.append(HsqlDateTime.getSystemTimeString()).append(' '); sb.append(logTypeNames[atLevel]).append(' ').append(message); //#ifdef JAVA4 Throwable temp = new Throwable(); StackTraceElement[] elements = temp.getStackTrace(); if (elements.length > 1) { sb.append(' '); sb.append(elements[1].getClassName()).append('.'); sb.append(elements[1].getMethodName()); } elements = t.getStackTrace(); if (elements.length > 0) { sb.append(' '); sb.append(elements[0].getClassName()).append('.'); sb.append(' ').append(elements[0].getMethodName()); } //#endif JAVA4 sb.append(' ').append(t.toString()); writer.println(sb.toString()); sb.setLength(0); } public void flush() { if (writer != null) { writer.flush(); } } public void close() { if (writer != null && !isSystem) { writer.flush(); writer.close(); } writer = null; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/IntValueHashMap.java0000644000175000017500000001474312007547402023352 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; import org.hsqldb.store.BaseHashMap; /** * This class does not store null keys. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public class IntValueHashMap extends BaseHashMap { Set keySet; private Collection values; public IntValueHashMap() { this(8); } public IntValueHashMap(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.objectKeyOrValue, BaseHashMap.intKeyOrValue, false); } public int get(Object key) throws NoSuchElementException { if (key == null) { throw new NoSuchElementException(); } int hash = key.hashCode(); int lookup = getLookup(key, hash); if (lookup != -1) { return intValueTable[lookup]; } throw new NoSuchElementException(); } public int get(Object key, int defaultValue) { if (key == null) { throw new NoSuchElementException(); } int hash = key.hashCode(); int lookup = getLookup(key, hash); if (lookup != -1) { return intValueTable[lookup]; } return defaultValue; } public boolean get(Object key, int[] value) { if (key == null) { throw new NoSuchElementException(); } int hash = key.hashCode(); int lookup = getLookup(key, hash); if (lookup != -1) { value[0] = intValueTable[lookup]; return true; } return false; } public Object getKey(int value) { BaseHashIterator it = new BaseHashIterator(false); while (it.hasNext()) { int i = it.nextInt(); if (i == value) { return objectKeyTable[it.getLookup()]; } } return null; } public boolean put(Object key, int value) { if (key == null) { throw new NoSuchElementException(); } int oldSize = size(); super.addOrRemove(0, value, key, null, false); return oldSize != size(); } public boolean remove(Object key) { int oldSize = size(); super.addOrRemove(0, 0, key, null, true); return oldSize != size(); } public boolean containsKey(Object key) { return super.containsKey(key); } public boolean containsValue(int value) { throw new RuntimeException(); } public Set keySet() { if (keySet == null) { keySet = new KeySet(); } return keySet; } public Collection values() { if (values == null) { values = new Values(); } return values; } class KeySet implements Set { public Iterator iterator() { return IntValueHashMap.this.new BaseHashIterator(true); } public int size() { return IntValueHashMap.this.size(); } public boolean contains(Object o) { return containsKey(o); } public Object get(Object key) { int lookup = IntValueHashMap.this.getLookup(key, key.hashCode()); if (lookup < 0) { return null; } else { return IntValueHashMap.this.objectKeyTable[lookup]; } } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { int oldSize = size(); IntValueHashMap.this.remove(o); return size() != oldSize; } public boolean isEmpty() { return size() == 0; } public void clear() { IntValueHashMap.this.clear(); } } class Values implements Collection { public Iterator iterator() { return IntValueHashMap.this.new BaseHashIterator(false); } public int size() { return IntValueHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { IntValueHashMap.this.clear(); } } public void putAll(IntValueHashMap t) { Iterator it = t.keySet().iterator(); while (it.hasNext()) { Object key = it.next(); put(key, t.get(key)); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/RefCapablePropertyResourceBundle.java0000644000175000017500000005051112007547402026745 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.PropertyResourceBundle; import java.util.Map; import java.util.HashMap; import java.util.Locale; import java.util.ResourceBundle; import java.util.MissingResourceException; import java.util.Enumeration; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.io.InputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; /* $Id: RefCapablePropertyResourceBundle.java 4141 2011-03-14 01:35:49Z fredt $ */ /** * Just like PropertyResourceBundle, except keys mapped to nothing in the * properties file will load the final String value from a text file. * * The use case is where one wants to use a ResourceBundle for Strings, * but some of the Strings are long-- too long to maintain in a Java * .properties file. * By using this class, you can put each such long String in its own * separate file, yet all keys mapped to (non-empty) values in the * .properties file will behave just like regular PropertyResourceBundle * properties. * In this documentation, I call these values read in atomically from * other files referenced values, because the values are not directly * in the .properties file, but are "referenced" in the .properties file * by virtue of the empty value for the key. * * You use this class in the same way as you would traditionally use * ResourceBundle: *

 *  import org.hsqldb.util..RefCapablePropertyResourceBundle;
 *  ...
 *      RefCapablePropertyResourceBundle bundle =
 *              RefCapablePropertyResourceBundle.getBundle("subdir.xyz");
 *      System.out.println("Value for '1' = (" + bundle.getString("1") + ')');
 * 
* * Just like PropertyResourceBundle, the .properties file and the * referenced files are read in from the classpath by a class loader, * according to the normal ResourceBundle rules. * To eliminate the need to prohibit the use of any strings in the .properties * values, and to enforce consistency, you must use the following rules * to when putting your referenced files into place. *

* REFERENCED FILE DIRECTORY is a directory named with the base name of the * properties file, and in the same parent directory. So, the referenced * file directory /a/b/c/greentea is used to hold all reference * files for properties files /a/b/c/greentea_en_us.properties, * /a/b/c/greentea_de.properties, * /a/b/c/greentea.properties, etc. * (BTW, according to ResourceBundle rules, this resource should be looked * up with name "a.b.c.greentea", not "/a/b/c..." or "a/b/c"). * REFERENCED FILES themselves all have the base name of the property key, * with locale appendages exactly as the referring properties files * has, plus the suffix .text. *

* So, if we have the following line in * /a/b/c/greentea_de.properties: *

 *     1: eins
 * 
* then you must have a reference text file * /a/b/c/greentea/1_de.properties: *

* In reference text files, * sequences of "\r", "\n" and "\r\n" are all translated to the line * delimiter for your platform (System property line.separator). * If one of those sequences exists at the very end of the file, it will be * eliminated (so, if you really want getString() to end with a line delimiter, * end your file with two of them). * (The file itself is never modified-- I'm talking about the value returned * by getString(String)). *

* To prevent throwing at runtime due to unset variables, use a wrapper class * like SqltoolRB (use SqltoolRB.java as a template). * To prevent throwing at runtime due to unset System Properties, or * insufficient parameters passed to getString(String, String[]), set the * behavior values appropriately. *

* Just like all Properties files, referenced files must use ISO-8859-1 * encoding, with unicode escapes for characters outside of ISO-8859-1 * character set. But, unlike Properties files, \ does not need to be * escaped for normal usage. *

* The getString() methods with more than one parameter substitute for * "positional" parameters of the form "%{1}". * The getExpandedString() methods substitute for System Property names * of the form "${1}". * In both cases, you can interpose :+ and a string between the variable * name and the closing }. This works just like the Bourne shell * ${x:+y} feature. If "x" is set, then "y" is returned, and "y" may * contain references to the original variable without the curly braces. * In this file, I refer to the y text as the "conditional string". * One example of each type: *

 *     Out val = (${condlSysProp:+Prop condlSysProp is set to $condlSysProp.})
 *     Out val = (%{2:+Pos Var #2 is set to %2.})
 * OUTPUT if neither are set:
 *     Out val = ()
 *     Out val = ()
 * OUTPUT if condlSysProp=alpha and condlPLvar=beta:
 *     Out val = (Prop condlSysProp is set to alpha.)
 *     Out val = (Pos Var #2 is set to beta.)
 * 
* This feature has the following limitations. *
    *
  • The conditional string may only contain the primary variable. *
  • Inner instances of the primary variable may not use curly braces, * and therefore the variable name must end at a word boundary. *
* The conditional string may span newlines, and it is often very useful * to do so. * * @see java.util.PropertyResourceBundle * @see java.util.ResourceBundle * @author Blaine Simpson (blaine dot simpson at admc dot com) */ public class RefCapablePropertyResourceBundle { private PropertyResourceBundle wrappedBundle; private String baseName; private String language, country, variant; static private Map allBundles = new HashMap(); public static String LS = System.getProperty("line.separator"); private Pattern sysPropVarPattern = Pattern.compile( "(?s)\\Q${\\E([^}]+?)(?:\\Q:+\\E([^}]+))?\\Q}"); private Pattern posPattern = Pattern.compile( "(?s)\\Q%{\\E(\\d)(?:\\Q:+\\E([^}]+))?\\Q}"); private ClassLoader loader; // Needed to load referenced files public static final int THROW_BEHAVIOR = 0; public static final int EMPTYSTRING_BEHAVIOR = 1; public static final int NOOP_BEHAVIOR = 2; public Enumeration getKeys() { return wrappedBundle.getKeys(); } private RefCapablePropertyResourceBundle(String baseName, PropertyResourceBundle wrappedBundle, ClassLoader loader) { this.baseName = baseName; this.wrappedBundle = wrappedBundle; Locale locale = wrappedBundle.getLocale(); this.loader = loader; language = locale.getLanguage(); country = locale.getCountry(); variant = locale.getVariant(); if (language.length() < 1) language = null; if (country.length() < 1) country = null; if (variant.length() < 1) variant = null; } /** * Same as getString(), but expands System Variables specified in * property values like ${sysvarname}. */ public String getExpandedString(String key, int behavior) { String s = getString(key); Matcher matcher = sysPropVarPattern.matcher(s); int previousEnd = 0; StringBuffer sb = new StringBuffer(); String varName, varValue; String condlVal; // Conditional : value while (matcher.find()) { varName = matcher.group(1); condlVal = ((matcher.groupCount() > 1) ? matcher.group(2) : null); varValue = System.getProperty(varName); if (condlVal != null) { // Replace varValue (the value to be substituted), with // the post-:+ portion of the expression. varValue = ((varValue == null) ? "" : condlVal.replaceAll("\\Q$" + varName + "\\E\\b", Matcher.quoteReplacement(varValue))); } if (varValue == null) switch (behavior) { case THROW_BEHAVIOR: throw new RuntimeException( "No Sys Property set for variable '" + varName + "' in property value (" + s + ")."); case EMPTYSTRING_BEHAVIOR: varValue = ""; break; case NOOP_BEHAVIOR: break; default: throw new RuntimeException( "Undefined value for behavior: " + behavior); } sb.append(s.substring(previousEnd, matcher.start()) + ((varValue == null) ? matcher.group() : varValue)); previousEnd = matcher.end(); } return (previousEnd < 1) ? s : (sb.toString() + s.substring(previousEnd)); } /** * Replaces positional substitution patterns of the form %{\d} with * corresponding element of the given subs array. * Note that %{\d} numbers are 1-based, so we lok for subs[x-1]. */ public String posSubst(String s, String[] subs, int behavior) { Matcher matcher = posPattern.matcher(s); int previousEnd = 0; StringBuffer sb = new StringBuffer(); String varValue; int varIndex; String condlVal; // Conditional : value while (matcher.find()) { varIndex = Integer.parseInt(matcher.group(1)) - 1; condlVal = ((matcher.groupCount() > 1) ? matcher.group(2) : null); varValue = ((varIndex < subs.length) ? subs[varIndex] : null); if (condlVal != null) { // Replace varValue (the value to be substituted), with // the post-:+ portion of the expression. varValue = ((varValue == null) ? "" : condlVal.replaceAll("\\Q%" + (varIndex+1) + "\\E\\b", Matcher.quoteReplacement(varValue))); } // System.err.println("Behavior: " + behavior); if (varValue == null) switch (behavior) { case THROW_BEHAVIOR: throw new RuntimeException( Integer.toString(subs.length) + " positional values given, but property string " + "contains (" + matcher.group() + ")."); case EMPTYSTRING_BEHAVIOR: varValue = ""; break; case NOOP_BEHAVIOR: break; default: throw new RuntimeException( "Undefined value for behavior: " + behavior); } sb.append(s.substring(previousEnd, matcher.start()) + ((varValue == null) ? matcher.group() : varValue)); previousEnd = matcher.end(); } return (previousEnd < 1) ? s : (sb.toString() + s.substring(previousEnd)); } public String getExpandedString(String key, String[] subs, int missingPropertyBehavior, int missingPosValueBehavior) { return posSubst(getExpandedString(key, missingPropertyBehavior), subs, missingPosValueBehavior); } public String getString(String key, String[] subs, int behavior) { return posSubst(getString(key), subs, behavior); } /** * Just identifies this RefCapablePropertyResourceBundle instance. */ public String toString() { return baseName + " for " + language + " / " + country + " / " + variant; } /** * Returns value defined in this RefCapablePropertyResourceBundle's * .properties file, unless that value is empty. * If the value in the .properties file is empty, then this returns * the entire contents of the referenced text file. * * @see ResourceBundle#getString(String) */ public String getString(String key) { String value = wrappedBundle.getString(key); if (value.length() < 1) { value = getStringFromFile(key); // For conciseness and sanity, get rid of all \r's so that \n // will definitively be our line breaks. if (value.indexOf('\r') > -1) value = value.replaceAll("\\Q\r\n", "\n") .replaceAll("\\Q\r", "\n"); if (value.length() > 0 && value.charAt(value.length() - 1) == '\n') value = value.substring(0, value.length() - 1); } return RefCapablePropertyResourceBundle.toNativeLs(value); } /** * @param inString Input string with \n definitively indicating desired * position for line separators. * @return If platform's line-separator is \n, then just returns inString. * Otherwise returns a copy of inString, with all \n's * transformed to the platform's line separators. */ public static String toNativeLs(String inString) { return LS.equals("\n") ? inString : inString.replaceAll("\\Q\n", LS); } /** * Use like java.util.ResourceBundle.getBundle(String). * * ClassLoader is required for our getBundles()s, since it is impossible * to get the "caller's" ClassLoader without using JNI (i.e., with pure * Java). * * @see ResourceBundle#getBundle(String) */ public static RefCapablePropertyResourceBundle getBundle(String baseName, ClassLoader loader) { return getRef(baseName, ResourceBundle.getBundle(baseName, Locale.getDefault(), loader), loader); } /** * Use exactly like java.util.ResourceBundle.get(String, Locale, ClassLoader). * * @see ResourceBundle#getBundle(String, Locale, ClassLoader) */ public static RefCapablePropertyResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader) { return getRef(baseName, ResourceBundle.getBundle(baseName, locale, loader), loader); } /** * Return a ref to a new or existing RefCapablePropertyResourceBundle, * or throw a MissingResourceException. */ static private RefCapablePropertyResourceBundle getRef(String baseName, ResourceBundle rb, ClassLoader loader) { if (!(rb instanceof PropertyResourceBundle)) throw new MissingResourceException( "Found a Resource Bundle, but it is a " + rb.getClass().getName(), PropertyResourceBundle.class.getName(), null); if (allBundles.containsKey(rb)) return allBundles.get(rb); RefCapablePropertyResourceBundle newPRAFP = new RefCapablePropertyResourceBundle(baseName, (PropertyResourceBundle) rb, loader); allBundles.put(rb, newPRAFP); return newPRAFP; } /** * Recursive */ private InputStream getMostSpecificStream( String key, String l, String c, String v) { final String filePath = baseName.replace('.', '/') + '/' + key + ((l == null) ? "" : ("_" + l)) + ((c == null) ? "" : ("_" + c)) + ((v == null) ? "" : ("_" + v)) + ".text"; // System.err.println("Seeking " + filePath); InputStream is = (InputStream) AccessController.doPrivileged( new PrivilegedAction() { public InputStream run() { return loader.getResourceAsStream(filePath); } }); // N.b. If were using Class.getRes... instead of ClassLoader.getRes... // we would need to prefix the path with "/". return (is == null && l != null) ? getMostSpecificStream(key, ((c == null) ? null : l), ((v == null) ? null : c), null) : is; } private String getStringFromFile(String key) { byte[] ba = null; int bytesread = 0; int retval; InputStream inputStream = getMostSpecificStream(key, language, country, variant); if (inputStream == null) throw new MissingResourceException( "Key '" + key + "' is present in .properties file with no value, yet " + "text file resource is missing", RefCapablePropertyResourceBundle.class.getName(), key); try { try { ba = new byte[inputStream.available()]; } catch (RuntimeException re) { throw new MissingResourceException( "Resource is too big to read in '" + key + "' value in one " + "gulp.\nPlease run the program with more RAM " + "(try Java -Xm* switches).: " + re, RefCapablePropertyResourceBundle.class.getName(), key); } catch (IOException ioe) { throw new MissingResourceException( "Failed to read in value for key '" + key + "': " + ioe, RefCapablePropertyResourceBundle.class.getName(), key); } try { while (bytesread < ba.length && (retval = inputStream.read( ba, bytesread, ba.length - bytesread)) > 0) { bytesread += retval; } } catch (IOException ioe) { throw new MissingResourceException( "Failed to read in value for '" + key + "': " + ioe, RefCapablePropertyResourceBundle.class.getName(), key); } } finally { try { inputStream.close(); } catch (IOException ioe) { System.err.println("Failed to close input stream: " + ioe); } } if (bytesread != ba.length) { throw new MissingResourceException( "Didn't read all bytes. Read in " + bytesread + " bytes out of " + ba.length + " bytes for key '" + key + "'", RefCapablePropertyResourceBundle.class.getName(), key); } try { return new String(ba, "ISO-8859-1"); } catch (UnsupportedEncodingException uee) { throw new RuntimeException(uee); } catch (RuntimeException re) { throw new MissingResourceException( "Value for key '" + key + "' too big to convert to String. " + "Please run the program with more RAM " + "(try Java -Xm* switches).: " + re, RefCapablePropertyResourceBundle.class.getName(), key); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/OrderedIntKeyHashMap.java0000644000175000017500000001201112007547400024313 0ustar renerene/* Copyright (c) 2001-2010, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import org.hsqldb.store.BaseHashMap; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.0 * @since 2.0.0 */ public class OrderedIntKeyHashMap extends BaseHashMap { Set keySet; Collection values; public OrderedIntKeyHashMap() { this(8); } public OrderedIntKeyHashMap(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.intKeyOrValue, BaseHashMap.objectKeyOrValue, false); isList = true; } public Object get(int key) { int lookup = getLookup(key); if (lookup != -1) { return objectValueTable[lookup]; } return null; } public Object put(int key, Object value) { return super.addOrRemove(key, value, null, false); } public boolean containsValue(Object value) { return super.containsValue(value); } public Object remove(int key) { int lookup = getLookup(key, key); if (lookup < 0) { return null; } Object returnValue = super.addOrRemove(key, null, null, true); removeRow(lookup); return returnValue; } public boolean containsKey(int key) { return super.containsKey(key); } public void valuesToArray(Object[] array) { Iterator it = values().iterator(); int i = 0; while (it.hasNext()) { array[i] = it.next(); i++; } } public Set keySet() { if (keySet == null) { keySet = new KeySet(); } return keySet; } public Collection values() { if (values == null) { values = new Values(); } return values; } class KeySet implements Set { public Iterator iterator() { return OrderedIntKeyHashMap.this.new BaseHashIterator(true); } public int size() { return OrderedIntKeyHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public Object get(Object key) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { OrderedIntKeyHashMap.this.clear(); } } class Values implements Collection { public Iterator iterator() { return OrderedIntKeyHashMap.this.new BaseHashIterator(false); } public int size() { return OrderedIntKeyHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { OrderedIntKeyHashMap.this.clear(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/LongKeyHashMap.java0000644000175000017500000001461312007547400023165 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.hsqldb.store.BaseHashMap; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class LongKeyHashMap extends BaseHashMap { Set keySet; Collection values; // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true); ReentrantReadWriteLock.ReadLock readLock = lock.readLock(); ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock(); public LongKeyHashMap() { this(16); } public LongKeyHashMap(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.longKeyOrValue, BaseHashMap.objectKeyOrValue, false); } public Lock getWriteLock() { return writeLock; } public Object get(long key) { readLock.lock(); try { int lookup = getLookup(key); if (lookup != -1) { return objectValueTable[lookup]; } return null; } finally { readLock.unlock(); } } public Object put(long key, Object value) { writeLock.lock(); try { return super.addOrRemove(key, 0, null, value, false); } finally { writeLock.unlock(); } } public boolean containsValue(Object value) { readLock.lock(); try { return super.containsValue(value); } finally { readLock.unlock(); } } public Object remove(long key) { writeLock.lock(); try { return super.addOrRemove(key, 0, null, null, true); } finally { writeLock.unlock(); } } public boolean containsKey(long key) { readLock.lock(); try { return super.containsKey(key); } finally { readLock.unlock(); } } public void clear() { writeLock.lock(); try { super.clear(); } finally { writeLock.unlock(); } } public Object[] toArray() { readLock.lock(); try { Object[] array = new Object[size()]; int i = 0; Iterator it = LongKeyHashMap.this.new BaseHashIterator(false); while (it.hasNext()) { array[i++] = it.next(); } return array; } finally { readLock.unlock(); } } public int getOrderedMatchCount(int[] array) { int i = 0; try { readLock.lock(); for (; i < array.length; i++) { if (!super.containsKey(array[i])) { break; } } } finally { readLock.unlock(); } return i; } public Set keySet() { if (keySet == null) { keySet = new KeySet(); } return keySet; } public Collection values() { if (values == null) { values = new Values(); } return values; } class KeySet implements Set { public Iterator iterator() { return LongKeyHashMap.this.new BaseHashIterator(true); } public int size() { return LongKeyHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public Object get(Object key) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { LongKeyHashMap.this.clear(); } } class Values implements Collection { public Iterator iterator() { return LongKeyHashMap.this.new BaseHashIterator(false); } public int size() { return LongKeyHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { LongKeyHashMap.this.clear(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HashSet.java0000644000175000017500000001225112007547400021706 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import org.hsqldb.store.BaseHashMap; /** * This class does not store null keys. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 */ public class HashSet extends BaseHashMap implements Set { public HashSet() { this(8); } public HashSet(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.objectKeyOrValue, BaseHashMap.noKeyOrValue, false); } public void setComparator(ObjectComparator comparator) { super.setComparator(comparator); } public boolean contains(Object key) { return super.containsKey(key); } public boolean containsAll(Collection col) { Iterator it = col.iterator(); while (it.hasNext()) { if (contains(it.next())) { continue; } return false; } return true; } public Object get(Object key) { int lookup = getLookup(key, key.hashCode()); if (lookup < 0) { return null; } else { return objectKeyTable[lookup]; } } /** returns true if added */ public boolean add(Object key) { int oldSize = size(); super.addOrRemove(0, 0, key, null, false); return oldSize != size(); } /** returns true if any added */ public boolean addAll(Collection c) { boolean changed = false; Iterator it = c.iterator(); while (it.hasNext()) { changed |= add(it.next()); } return changed; } /** returns true if any added */ public boolean addAll(Object[] keys) { boolean changed = false; for (int i = 0; i < keys.length; i++) { changed |= add(keys[i]); } return changed; } /** returns true if any added */ public boolean addAll(Object[] keys, int start, int limit) { boolean changed = false; for (int i = start; i < keys.length && i < limit; i++) { changed |= add(keys[i]); } return changed; } /** returns true if removed */ public boolean remove(Object key) { return super.removeObject(key, false) != null; } /** returns true if all were removed */ public boolean removeAll(Collection c) { Iterator it = c.iterator(); boolean result = true; while (it.hasNext()) { result &= remove(it.next()); } return result; } /** returns true if all were removed */ public boolean removeAll(Object[] keys) { boolean result = true; for (int i = 0; i < keys.length; i++) { result &= remove(keys[i]); } return result; } public void toArray(Object[] a) { Iterator it = iterator(); for (int i = 0; it.hasNext(); i++) { a[i] = it.next(); } } public Object[] toArray() { Object[] array = new Object[size()]; toArray(array); return array; } public Iterator iterator() { return new BaseHashIterator(true); } /** * Returns a String like "[Drei, zwei, Eins]", exactly like * java.util.HashSet. */ public String toString() { Iterator it = iterator(); StringBuffer sb = new StringBuffer(); while (it.hasNext()) { if (sb.length() > 0) { sb.append(", "); } else { sb.append('['); } sb.append(it.next()); } return sb.toString() + ']'; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/KMPSearchAlgorithm.java0000644000175000017500000004177712007547400024012 0ustar renerene/* Copyright (c) 2001-2010, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.IOException; import java.io.InputStream; import java.io.Reader; /** * Implements the Knuth–Morris–Pratt string search algorithm for searching * streams or arrays of octets or characters.

* * This algorithm is a good choice for searching large, forward-only access * streams for repeated search using pre-processed small to medium sized * patterns.

* * This is because in addition to the facts that it: * *

    *
  • does not require pre-processing the searched data (only the pattern) *
  • scans strictly left-to-right *
  • does not need to perform back tracking *
  • does not need to employ reverse scan order *
  • does not need to perform effectively random access lookups against * the searched data or pattern *
* * it also has: * *
    *
  • a very simple, highly predictable behavior *
  • an O(n) complexity once the a search pattern is preprocessed *
  • an O(m) complexity for preprocessing search patterns *
  • a worst case performance characteristic of only 2n *
  • a typical performance characteristic that is deemed to be * 2-3 times better than the naive search algorithm employed by * {@link String.indexOf(java.lang.String,int)}. *
* * Note that the Boyer–Moore algorithm is generally considered to be the better * practical, all-round exact sub-string search algorithm, but due to its * reverse pattern scan order, performance considerations dictate that it * requires more space and that is somewhat more complex to implement * efficiently for searching forward-only access streams.

* * In particular, its higher average performance is biased toward larger * search patterns, due to its ability to skip ahead further and with fewer * tests under reverse pattern scan. But when searching forward-only access * streams, overall performance considerations require the use a circular buffer * of the same size as the search pattern to hold data from the searched stream * as it is being compared in reverse order to the search pattern. Hence, * Boyer–Moore requires at minimum twice the memory required by Knuth–Morris–Pratt * to search for the same pattern and that factor has the greatest impact * precisely on the same class of patterns (larger) for which it is most * outperforms Knuth–Morris–Pratt. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @version 2.1 * @since 2.1 * @see Knuth–Morris–Pratt algorithm */ public class KMPSearchAlgorithm { /** * Searches the given octet stream for the given octet pattern * returning the zero-based offset from the initial stream position * at which the first match is detected.

* * Note that the signature includes a slot for the table so that * searches for a pattern can be performed multiple times without * incurring the overhead of computing the table each time. * * @param inputStream in which to search * @param pattern for which to search * @param table computed from the pattern that optimizes the search. * If null, automatically computed. * @return zero-based offset of first match; -1 if no match found. * @throws IOException when an error occurs accessing the input stream. */ public static long search(final InputStream inputStream, final byte[] pattern, int[] table) throws IOException { if (inputStream == null || pattern == null || pattern.length == 0) { return -1; } // final int patternLength = pattern.length; // long streamIndex = -1; int currentByte; if (patternLength == 1) { final int byteToFind = pattern[0]; while (-1 != (currentByte = inputStream.read())) { streamIndex++; if (currentByte == byteToFind) { return streamIndex; } } return -1; } int patternIndex = 0; if (table == null) { table = computeTable(pattern); } while (-1 != (currentByte = inputStream.read())) { streamIndex++; if (currentByte == pattern[patternIndex]) { patternIndex++; } else if (patternIndex > 0) { patternIndex = table[patternIndex]; patternIndex++; } if (patternIndex == patternLength) { return streamIndex - (patternLength - 1); } } return -1; } /** * Searches the given character stream for the given character pattern * returning the zero-based offset from the initial stream position * at which the first match is detected.

* * Note that the signature includes a slot for the table so that * searches for a pattern can be performed multiple times without * incurring the overhead of computing the table each time. * * @param reader in which to search * @param pattern for which to search * @param table computed from the pattern that optimizes the search * If null, automatically computed. * @return zero-based offset of first match; -1 if no match found. * @throws IOException when an error occurs accessing the input stream. */ public static long search(final Reader reader, final char[] pattern, int[] table) throws IOException { if (reader == null || pattern == null || pattern.length == 0) { return -1; } // final int patternLength = pattern.length; // long streamIndex = -1; int currentCharacter; if (patternLength == 1) { final int characterToFind = pattern[0]; while (-1 != (currentCharacter = reader.read())) { streamIndex++; if (currentCharacter == characterToFind) { return streamIndex; } } return -1; } int patternIndex = 0; if (table == null) { table = computeTable(pattern); } while (-1 != (currentCharacter = reader.read())) { streamIndex++; if (currentCharacter == pattern[patternIndex]) { patternIndex++; } else if (patternIndex > 0) { patternIndex = table[patternIndex]; patternIndex++; } if (patternIndex == patternLength) { return streamIndex - (patternLength - 1); } } return -1; } /** * Searches the given octet string for the given octet pattern * returning the zero-based offset from given start position * at which the first match is detected.

* * Note that the signature includes a slot for the table so that * searches for a pattern can be performed multiple times without * incurring the overhead of computing the table each time. * * @param source array in which to search * @param pattern to be matched * @param table computed from the pattern that optimizes the search * If null, automatically computed. * @param start position in source at which to start the search * @return */ public static int search(final byte[] source, final byte[] pattern, int[] table, final int start) { if (source == null || pattern == null || pattern.length == 0) { return -1; } // final int sourceLength = source.length; final int patternLength = pattern.length; // int sourceIndex = start; if (patternLength == 1) { final int byteToFind = pattern[0]; for (; sourceIndex < sourceLength; sourceIndex++) { if (source[sourceIndex] == byteToFind) { return sourceIndex; } } return -1; } // int matchStart = start; int patternIndex = 0; // if (table == null) { table = computeTable(pattern); } // while ((sourceIndex < sourceLength) && (patternIndex < patternLength)) { if (source[sourceIndex] == pattern[patternIndex]) { patternIndex++; } else { final int tableVaue = table[patternIndex]; matchStart += (patternIndex - tableVaue); if (patternIndex > 0) { patternIndex = tableVaue; } patternIndex++; } sourceIndex = (matchStart + patternIndex); } if (patternIndex == patternLength) { return matchStart; } else { return -1; } } /** * Searches the given character array for the given character pattern * returning the zero-based offset from given start position * at which the first match is detected. * * @param source array in which to search * @param pattern to be matched * @param table computed from the pattern that optimizes the search * If null, automatically computed. * @param start position in source at which to start the search * @return */ public static int search(final char[] source, final char[] pattern, int[] table, final int start) { if (source == null || pattern == null || pattern.length == 0) { return -1; } final int sourceLength = source.length; final int patternLength = pattern.length; int sourceIndex = start; if (patternLength == 1) { final int characterToFind = pattern[0]; for (; sourceIndex < sourceLength; sourceIndex++) { if (source[sourceIndex] == characterToFind) { return sourceIndex; } } return -1; } // int matchStart = start; int patternIndex = 0; // if (table == null) { table = computeTable(pattern); } // while ((sourceIndex < sourceLength) && (patternIndex < patternLength)) { if (source[sourceIndex] == pattern[patternIndex]) { patternIndex++; } else { final int tableValue = table[patternIndex]; matchStart += (patternIndex - tableValue); if (patternIndex > 0) { patternIndex = tableValue; } patternIndex++; } sourceIndex = (matchStart + patternIndex); } if (patternIndex == patternLength) { return matchStart; } else { return -1; } } /** * Searches the given String object for the given character pattern * returning the zero-based offset from given start position * at which the first match is detected. * * @param source array to be searched * @param pattern to be matched * @param table computed from the pattern that optimizes the search * @param start position in source at which to start the search * @return */ public static int search(final String source, final String pattern, int[] table, final int start) { if (source == null || pattern == null || pattern.length() == 0) { return -1; } final int patternLength = pattern.length(); // if (patternLength == 1) { return source.indexOf(pattern, start); } // final int sourceLength = source.length(); // int matchStart = start; int sourceIndex = start; int patternIndex = 0; // if (table == null) { table = computeTable(pattern); } // while ((sourceIndex < sourceLength) && (patternIndex < patternLength)) { if (source.charAt(sourceIndex) == pattern.charAt(patternIndex)) { patternIndex++; } else { final int tableValue = table[patternIndex]; matchStart += (patternIndex - tableValue); if (patternIndex > 0) { patternIndex = tableValue; } patternIndex++; } sourceIndex = matchStart + patternIndex; } if (patternIndex == patternLength) { return matchStart; } else { return -1; } } /** * computes the table used to optimize octet pattern search * * @param pattern for which to compute the table. * @return the table computed from the octet pattern. */ public static int[] computeTable(final byte[] pattern) { if (pattern == null) { throw new IllegalArgumentException("Pattern must not be null."); } else if (pattern.length < 2) { throw new IllegalArgumentException("Pattern length must be > 1."); } // final int[] table = new int[pattern.length]; int i = 2; int j = 0; // table[0] = -1; table[1] = 0; // while (i < pattern.length) { if (pattern[i - 1] == pattern[j]) { table[i] = j + 1; j++; i++; } else if (j > 0) { j = table[j]; } else { table[i] = 0; i++; j = 0; } } // return table; } public static int[] computeTable(final char[] pattern) { if (pattern == null) { throw new IllegalArgumentException("Pattern must not be null."); } else if (pattern.length < 2) { throw new IllegalArgumentException("Pattern length must be > 1."); } int[] table = new int[pattern.length]; int i = 2; int j = 0; table[0] = -1; table[1] = 0; while (i < pattern.length) { if (pattern[i - 1] == pattern[j]) { table[i] = j + 1; j++; i++; } else if (j > 0) { j = table[j]; } else { table[i] = 0; i++; j = 0; } } return table; } public static int[] computeTable(final String pattern) { if (pattern == null) { throw new IllegalArgumentException("Pattern must not be null."); } else if (pattern.length() < 2) { throw new IllegalArgumentException("Pattern length must be > 1."); } final int patternLength = pattern.length(); // int[] table = new int[patternLength]; int i = 2; int j = 0; table[0] = -1; table[1] = 0; while (i < patternLength) { if (pattern.charAt(i - 1) == pattern.charAt(j)) { table[i] = j + 1; j++; i++; } else if (j > 0) { j = table[j]; } else { table[i] = 0; i++; j = 0; } } return table; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/IntKeyIntValueHashMap.java0000644000175000017500000001210412007547400024461 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; import org.hsqldb.store.BaseHashMap; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public class IntKeyIntValueHashMap extends BaseHashMap { private Set keySet; private Collection values; public IntKeyIntValueHashMap() { this(8); } public IntKeyIntValueHashMap(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.intKeyOrValue, BaseHashMap.intKeyOrValue, false); } public int get(int key) throws NoSuchElementException { int lookup = getLookup(key); if (lookup != -1) { return intValueTable[lookup]; } throw new NoSuchElementException(); } public int get(int key, int defaultValue) { int lookup = getLookup(key); if (lookup != -1) { return intValueTable[lookup]; } return defaultValue; } public boolean get(int key, int[] value) { int lookup = getLookup(key); if (lookup != -1) { value[0] = intValueTable[lookup]; return true; } return false; } public boolean put(int key, int value) { int oldSize = size(); super.addOrRemove(key, value, null, null, false); return oldSize != size(); } public boolean remove(int key) { int oldSize = size(); super.addOrRemove(key, 0, null, null, true); return oldSize != size(); } public Set keySet() { if (keySet == null) { keySet = new KeySet(); } return keySet; } public Collection values() { if (values == null) { values = new Values(); } return values; } class KeySet implements Set { public Iterator iterator() { return IntKeyIntValueHashMap.this.new BaseHashIterator(true); } public int size() { return IntKeyIntValueHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public Object get(Object key) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { IntKeyIntValueHashMap.this.clear(); } } class Values implements Collection { public Iterator iterator() { return IntKeyIntValueHashMap.this.new BaseHashIterator(false); } public int size() { return IntKeyIntValueHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { IntKeyIntValueHashMap.this.clear(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/FileAccess.java0000644000175000017500000000510012007547400022343 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.InputStream; import java.io.OutputStream; /** * Interface for abstraction of file access. * * @author Ocke Janssen oj@openoffice.org * @version 1.9.0 * @since 1.8.0 */ public interface FileAccess { int ELEMENT_READ = 1; int ELEMENT_SEEKABLEREAD = 3; int ELEMENT_WRITE = 4; int ELEMENT_READWRITE = 7; int ELEMENT_TRUNCATE = 8; InputStream openInputStreamElement(java.lang.String streamName) throws java.io.IOException; OutputStream openOutputStreamElement(java.lang.String streamName) throws java.io.IOException; boolean isStreamElement(java.lang.String elementName); void createParentDirs(java.lang.String filename); void removeElement(java.lang.String filename); void renameElement(java.lang.String oldName, java.lang.String newName); public interface FileSync { void sync() throws java.io.IOException; } FileSync getFileSync(OutputStream os) throws java.io.IOException; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/StopWatch.java0000644000175000017500000001352612007547400022271 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; /** * Provides the programatic analog of a physical stop watch.

* * The watch can be started, stopped and zeroed and can be queried for * elapsed running time. The watch accumulates elapsed time over starts * and stops such that only the time actually spent running is recorded. * If the watch is zeroed, then the accumulated time is discarded and * the watch starts again with zero acumulated time.

* * @author boucherb@users * @version 1.7.2 * @since 1.7.2 */ public class StopWatch { /** * The last time this object made the transition * from stopped to running state, as reported * by System.currentTimeMillis(). */ private long startTime; private long lastStart; /** * The accumulated running time of this object since * it was last zeroed. */ private long total; /** Flags if this object is started or stopped. */ boolean running = false; /** Creates, zeros, and starts a new StopWatch */ public StopWatch() { this(true); } /** Creates, zeros, and starts a new StopWatch */ public StopWatch(boolean start) { if (start) { start(); } } /** * Retrieves the accumulated time this object has spent running since * it was last zeroed. * @return the accumulated time this object has spent running since * it was last zeroed. */ public long elapsedTime() { if (running) { return total + System.currentTimeMillis() - startTime; } else { return total; } } /** * Retrieves the accumulated time this object has spent running since * it was last started. * @return the accumulated time this object has spent running since * it was last started. */ public long currentElapsedTime() { if (running) { return System.currentTimeMillis() - startTime; } else { return 0; } } /** Zeros accumulated running time and restarts this object. */ public void zero() { total = 0; start(); } /** * Ensures that this object is in the running state. If this object is not * running, then the call has the effect of setting the startTime * attribute to the current value of System.currentTimeMillis() and setting * the running attribute to true. */ public void start() { startTime = System.currentTimeMillis(); running = true; } /** * Ensures that this object is in the stopped state. If this object is * in the running state, then this has the effect of adding to the * total attribute the elapsed time since the last transition * from stopped to running state and sets the running attribute * to false. If this object is not in the running state, this call has no * effect. */ public void stop() { if (running) { total += System.currentTimeMillis() - startTime; running = false; } } public void mark() { stop(); start(); } /** * Retrieves prefix + " in " + elapsedTime() + " ms." * @param prefix The string to use as a prefix * @return prefix + " in " + elapsedTime() + " ms." */ public String elapsedTimeToMessage(String prefix) { return prefix + " in " + elapsedTime() + " ms."; } /** * Retrieves prefix + " in " + elapsedTime() + " ms." * @param prefix The string to use as a prefix * @return prefix + " in " + elapsedTime() + " ms." */ public String currentElapsedTimeToMessage(String prefix) { return prefix + " in " + currentElapsedTime() + " ms."; } /** * Retrieves the internal state of this object, as a String. * * The retreived value is: * *

     *    super.toString() +
     *    "[running=" +
     *    running +
     *    ", startTime=" +
     *    startTime +
     *    ", total=" +
     *    total + "]";
     * 
* @return the state of this object, as a String */ public String toString() { return super.toString() + "[running=" + running + ", startTime=" + startTime + ", total=" + total + "]"; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/Collection.java0000644000175000017500000000424312007547400022444 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.7.2 * @since 1.7.2 */ public interface Collection { int size(); boolean isEmpty(); boolean contains(Object o); Iterator iterator(); /* Object[] toArray(); Object[] toArray(Object a[]); */ boolean add(Object o); boolean remove(Object o); boolean addAll(Collection c); /* boolean containsAll(Collection c); boolean removeAll(Collection c); boolean retainAll(Collection c); */ void clear(); /* boolean equals(Object o); */ int hashCode(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/AppendableException.java0000644000175000017500000000614212007547400024263 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.ArrayList; import java.util.List; /** * Allows additional messages to be appended. * * It often makes for better (and more efficient) design to add context * details to an exception at intermediate points in the thread. * This class makes it easy and efficient to catch and rethrow for that purpose. */ public class AppendableException extends Exception { static final long serialVersionUID = -1002629580611098803L; public static String LS = System.getProperty("line.separator"); public List appendages = null; public String getMessage() { String message = super.getMessage(); if (appendages == null) { return message; } StringBuffer sb = new StringBuffer(); if (message != null) { sb.append(message); } for (String appendage : appendages) { if (sb.length() > 0) { sb.append(LS); } sb.append(appendage); } return sb.toString(); } public void appendMessage(String s) { if (appendages == null) { appendages = new ArrayList(); } appendages.add(s); } public AppendableException() { // Intentionally empty } public AppendableException(String s) { super(s); } public AppendableException(Throwable cause) { super(cause); } public AppendableException(String string, Throwable cause) { super(string, cause); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HsqlDeque.java0000644000175000017500000002101012007547400022233 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; // fredt@users 20020130 - patch 1.7.0 by fredt - new class /** * jdk 1.1 compatible minimal implementation of a list object suitable for * stack, queue and deque usage patterns backed by an Object[]. * The memory footprint of the HsqlDeque doubles when it gets full * but does not shrink when it gets empty. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.0 */ public class HsqlDeque extends BaseList implements HsqlList { private Object[] list; private int firstindex = 0; // index of first list element private int endindex = 0; // index of last list element + 1 // can grow to fill list // if elementCount == 0 then firstindex == endindex private static final int DEFAULT_INITIAL_CAPACITY = 10; public HsqlDeque() { list = new Object[DEFAULT_INITIAL_CAPACITY]; } public int size() { return elementCount; } public boolean isEmpty() { return elementCount == 0; } public Object getFirst() throws NoSuchElementException { if (elementCount == 0) { throw new NoSuchElementException(); } return list[firstindex]; } public Object getLast() throws NoSuchElementException { if (elementCount == 0) { throw new NoSuchElementException(); } return list[endindex - 1]; } public Object get(int i) throws IndexOutOfBoundsException { int index = getInternalIndex(i); return list[index]; } public void add(int i, Object o) throws IndexOutOfBoundsException { if (i == elementCount) { add(o); return; } resetCapacity(); int index = getInternalIndex(i); if (index < endindex && endindex < list.length) { System.arraycopy(list, index, list, index + 1, endindex - index); endindex++; } else { System.arraycopy(list, firstindex, list, firstindex - 1, index - firstindex); firstindex--; index--; } list[index] = o; elementCount++; } public Object set(int i, Object o) throws IndexOutOfBoundsException { int index = getInternalIndex(i); Object result = list[index]; list[index] = o; return result; } public Object removeFirst() throws NoSuchElementException { if (elementCount == 0) { throw new NoSuchElementException(); } Object o = list[firstindex]; list[firstindex] = null; firstindex++; elementCount--; if (elementCount == 0) { firstindex = endindex = 0; } else if (firstindex == list.length) { firstindex = 0; } return o; } public Object removeLast() throws NoSuchElementException { if (elementCount == 0) { throw new NoSuchElementException(); } endindex--; Object o = list[endindex]; list[endindex] = null; elementCount--; if (elementCount == 0) { firstindex = endindex = 0; } else if (endindex == 0) { endindex = list.length; } return o; } /* public Object remove(int i){ return get(i); } public void add(int i, Object o) { } */ public boolean add(Object o) { resetCapacity(); if (endindex == list.length) { endindex = 0; } list[endindex] = o; elementCount++; endindex++; return true; } public boolean addLast(Object o) { return add(o); } public boolean addFirst(Object o) { resetCapacity(); firstindex--; if (firstindex < 0) { firstindex = list.length - 1; if (endindex == 0) { endindex = list.length; } } list[firstindex] = o; elementCount++; return true; } public void clear() { if (elementCount == 0) { return; } firstindex = endindex = elementCount = 0; for (int i = 0; i < list.length; i++) { list[i] = null; } } public int indexOf(Object value) { for (int i = 0; i < elementCount; i++) { int index = firstindex + i; if (index >= list.length) { index -= list.length; } if (list[index] == value) { return i; } if (value != null && value.equals(list[index])) { return i; } } return -1; } public Object remove(int index) { int target = getInternalIndex(index); Object value = list[target]; if (target == firstindex) { list[firstindex] = null; firstindex++; if (firstindex == list.length) { firstindex = 0; } } else if (target > firstindex) { System.arraycopy(list, firstindex, list, firstindex + 1, target - firstindex); list[firstindex] = null; firstindex++; if (firstindex == list.length) { firstindex = 0; } } else { System.arraycopy(list, target + 1, list, target, endindex - target - 1); endindex--; list[endindex] = null; if (endindex == 0) { endindex = list.length; } } elementCount--; if (elementCount == 0) { firstindex = endindex = 0; } return value; } private int getInternalIndex(int i) throws IndexOutOfBoundsException { if (i < 0 || i >= elementCount) { throw new IndexOutOfBoundsException(); } int index = firstindex + i; if (index >= list.length) { index -= list.length; } return index; } private void resetCapacity() { if (elementCount < list.length) { return; } Object[] newList = new Object[list.length * 2]; System.arraycopy(list, firstindex, newList, firstindex, list.length - firstindex); if (endindex <= firstindex) { System.arraycopy(list, 0, newList, list.length, endindex); endindex = list.length + endindex; } list = newList; } public void toArray(Object[] array) { int tempCount = list.length - firstindex; if (tempCount > elementCount) { tempCount = elementCount; } System.arraycopy(list, firstindex, array, 0, tempCount); if (endindex <= firstindex) { System.arraycopy(list, 0, array, tempCount, endindex); endindex = list.length + endindex; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/Iterator.java0000644000175000017500000000401212007547400022134 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public interface Iterator { boolean hasNext(); Object next() throws NoSuchElementException; int nextInt() throws NoSuchElementException; long nextLong() throws NoSuchElementException; void remove() throws NoSuchElementException; void setValue(Object value); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/ArraySort.java0000644000175000017500000001351312007547400022277 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.Comparator; /** * FastQSorts the [l,r] partition (inclusive) of the specfied array of * Rows, using the comparator.

* * Searches an ordered array.

* * @author Tony Lai (tony_lai@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public class ArraySort { /** * Returns the index of the lowest element == the given search target, * or -1 * @return index or (- insert pos -1) if not found */ public static int searchFirst(Object[] array, int start, int limit, Object value, Comparator c) { int low = start; int high = limit; int mid = start; int compare = 0; int found = limit; while (low < high) { mid = (low + high) / 2; compare = c.compare(value, array[mid]); if (compare < 0) { high = mid; } else if (compare > 0) { low = mid + 1; } else { high = mid; found = mid; } } return found == limit ? -low - 1 : found; } public static int deDuplicate(Object[] array, int start, int limit, Comparator comparator) { int baseIndex = start; int currentIndex = start + 1; if (array.length == 0) { return 0; } for (; currentIndex < limit; currentIndex++) { int compare = comparator.compare(array[baseIndex], array[currentIndex]); if (compare == 0) { continue; } baseIndex++; array[baseIndex] = array[currentIndex]; } return baseIndex + 1; } public static void sort(Object[] array, int start, int limit, Comparator comparator) { if (start + 1 >= limit) { return; } quickSort(array, comparator, start, limit - 1); insertionSort(array, comparator, start, limit - 1); } static void quickSort(Object[] array, Comparator comparator, int l, int r) { int M = 16; int i; int j; int v; if ((r - l) > M) { i = (r + l) / 2; if (comparator.compare(array[i], array[l]) < 0) { swap(array, l, i); // Tri-Median Methode! } if (comparator.compare(array[r], array[l]) < 0) { swap(array, l, r); } if (comparator.compare(array[r], array[i]) < 0) { swap(array, i, r); } j = r - 1; swap(array, i, j); i = l; v = j; for (;;) { while (comparator.compare(array[++i], array[v]) < 0) {} while (comparator.compare(array[v], array[--j]) < 0) {} if (j < i) { break; } swap(array, i, j); } swap(array, i, r - 1); quickSort(array, comparator, l, j); quickSort(array, comparator, i + 1, r); } } public static void insertionSort(Object[] array, Comparator comparator, int lo0, int hi0) { int i; int j; for (i = lo0 + 1; i <= hi0; i++) { j = i; while ((j > lo0) && comparator.compare(array[i], array[j - 1]) < 0) { j--; } if (i != j) { moveAndInsertRow(array, i, j); } } } private static void swap(Object[] array, int i1, int i2) { Object val = array[i1]; array[i1] = array[i2]; array[i2] = val; } private static void moveAndInsertRow(Object[] array, int i, int j) { Object val = array[i]; moveRows(array, j, j + 1, i - j); array[j] = val; } private static void moveRows(Object[] array, int fromIndex, int toIndex, int rows) { System.arraycopy(array, fromIndex, array, toIndex, rows); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/IntKeyLongValueHashMap.java0000644000175000017500000000610512007547400024632 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; import org.hsqldb.store.BaseHashMap; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public class IntKeyLongValueHashMap extends BaseHashMap { public IntKeyLongValueHashMap() { this(8); } public IntKeyLongValueHashMap(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.intKeyOrValue, BaseHashMap.longKeyOrValue, false); } public long get(int key) throws NoSuchElementException { int lookup = getLookup(key); if (lookup != -1) { return longValueTable[lookup]; } throw new NoSuchElementException(); } public long get(int key, int defaultValue) { int lookup = getLookup(key); if (lookup != -1) { return longValueTable[lookup]; } return defaultValue; } public boolean get(int key, long[] value) { int lookup = getLookup(key); if (lookup != -1) { value[0] = longValueTable[lookup]; return true; } return false; } public boolean put(int key, int value) { int oldSize = size(); super.addOrRemove(key, value, null, null, false); return oldSize != size(); } public boolean remove(int key) { int oldSize = size(); super.addOrRemove(key, 0, null, null, true); return oldSize != size(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/StringInputStream.java0000644000175000017500000000506112007547400024012 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.IOException; import java.io.InputStream; /** * minimal InputStream subclass to fetch bytes form a String * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.7.0 */ public class StringInputStream extends InputStream { protected int strOffset = 0; protected int charOffset = 0; protected int available; protected String str; public StringInputStream(String s) { str = s; available = s.length() * 2; } public int read() throws java.io.IOException { if (available == 0) { return -1; } available--; char c = str.charAt(strOffset); if (charOffset == 0) { charOffset = 1; return (c & 0x0000ff00) >> 8; } else { charOffset = 0; strOffset++; return c & 0x000000ff; } } public int available() throws IOException { return available; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HsqlTimer.java0000644000175000017500000010045312007547402022263 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.Comparator; import java.util.Date; /** * Facility to schedule tasks for future execution in a background thread.

* * Tasks may be scheduled for one-time execution or for repeated execution at * regular intervals, using either fixed rate or fixed delay policy.

* * This class is a JDK 1.1 compatible implementation required by HSQLDB both * because the java.util.Timer class is available only in JDK 1.3+ and because * java.util.Timer starves least recently added tasks under high load and * fixed rate scheduling, especially when the average actual task duration is * greater than the average requested task periodicity.

* * An additional (minor) advantage over java.util.Timer is that this class does * not retain a live background thread during periods when the task queue is * empty. * @author boucherb@users * @version 1.9.0 * @since 1.7.2 */ public final class HsqlTimer implements Comparator, ThreadFactory { /** The priority queue for the scheduled tasks. */ protected final TaskQueue taskQueue = new TaskQueue(16, (Comparator) this); /** The inner runnable that executes tasks in the background thread. */ protected final TaskRunner taskRunner = new TaskRunner(); /** The background thread. */ protected Thread taskRunnerThread; /** The factory that procduces the background threads. */ protected final ThreadFactory threadFactory; /** * Whether this timer should disallow all further processing. * * Once set true, stays true forever. */ protected volatile boolean isShutdown; /** * Constructs a new HsqlTimer using the default thread factory * implementation. */ public HsqlTimer() { this(null); } /** * Constructs a new HsqlTimer. * * Uses the specified thread factory implementation. * * @param threadFactory the ThreadFactory used to produce this timer's * background threads. If null, the default implementation supplied * by this class will be used. */ public HsqlTimer(final ThreadFactory threadFactory) { this.threadFactory = (threadFactory == null) ? this : threadFactory; } /** * Required to back the priority queue for scheduled tasks. * * @param a the first Task * @param b the second Task * @return 0 if equal, < 0 if a < b, > 0 if a > b */ public int compare(final Object a, final Object b) { final long awhen = ((Task) (a)).getNextScheduled(); final long bwhen = ((Task) (b)).getNextScheduled(); return (awhen < bwhen) ? -1 : (awhen == bwhen) ? 0 : 1; } /** * Default ThreadFactory implementation.

* * Contructs a new Thread from the designated runnable, sets its * name to "HSQLDB Timer @" + Integer.toHexString(hashCode()), * and sets it as a daemon thread.

* * @param runnable used to construct the new Thread. * @return a new Thread constructed from the designated runnable. */ public Thread newThread(final Runnable runnable) { final Thread thread = new Thread(runnable); thread.setName("HSQLDB Timer @" + Integer.toHexString(hashCode())); thread.setDaemon(true); return thread; } /** * Retrieves the background execution thread.

* * null is returned if there is no such thread.

* * @return the current background thread (may be null) */ public synchronized Thread getThread() { return this.taskRunnerThread; } /** * (Re)starts background processing of the task queue. * * @throws IllegalStateException if this timer is shut down. * @see #shutdown() * @see #shutdownImmediately() */ public synchronized void restart() throws IllegalStateException { if (this.isShutdown) { throw new IllegalStateException("isShutdown==true"); } else if (this.taskRunnerThread == null) { this.taskRunnerThread = this.threadFactory.newThread(this.taskRunner); this.taskRunnerThread.start(); } else { this.taskQueue.unpark(); } } /** * Causes the specified Runnable to be executed once in the background * after the specified delay. * * @param delay in milliseconds * @param runnable the Runnable to execute. * @return opaque reference to the internal task * @throws IllegalArgumentException if runnable is null */ public Object scheduleAfter(final long delay, final Runnable runnable) throws IllegalArgumentException { if (runnable == null) { throw new IllegalArgumentException("runnable == null"); } return this.addTask(now() + delay, runnable, 0, false); } /** * Causes the specified Runnable to be executed once in the background * at the specified time. * * @param date time at which to execute the specified Runnable * @param runnable the Runnable to execute. * @return opaque reference to the internal task * @throws IllegalArgumentException if date or runnable is null */ public Object scheduleAt(final Date date, final Runnable runnable) throws IllegalArgumentException { if (date == null) { throw new IllegalArgumentException("date == null"); } else if (runnable == null) { throw new IllegalArgumentException("runnable == null"); } return this.addTask(date.getTime(), runnable, 0, false); } /** * Causes the specified Runnable to be executed periodically in the * background, starting at the specified time. * * @return opaque reference to the internal task * @param period the cycle period * @param relative if true, fixed rate sheduling else fixed delay scheduling * @param date time at which to execute the specified Runnable * @param runnable the Runnable to execute * @throws IllegalArgumentException if date or runnable is null, or * period is <= 0 */ public Object schedulePeriodicallyAt(final Date date, final long period, final Runnable runnable, final boolean relative) throws IllegalArgumentException { if (date == null) { throw new IllegalArgumentException("date == null"); } else if (period <= 0) { throw new IllegalArgumentException("period <= 0"); } else if (runnable == null) { throw new IllegalArgumentException("runnable == null"); } return addTask(date.getTime(), runnable, period, relative); } /** * Causes the specified Runnable to be executed periodically in the * background, starting after the specified delay. * * @return opaque reference to the internal task * @param period the cycle period * @param relative if true, fixed rate sheduling else fixed delay scheduling * @param delay in milliseconds * @param runnable the Runnable to execute. * @throws IllegalArgumentException if runnable is null or period is <= 0 */ public Object schedulePeriodicallyAfter(final long delay, final long period, final Runnable runnable, final boolean relative) throws IllegalArgumentException { if (period <= 0) { throw new IllegalArgumentException("period <= 0"); } else if (runnable == null) { throw new IllegalArgumentException("runnable == null"); } return addTask(now() + delay, runnable, period, relative); } /** * Shuts down this timer after the current task (if any) completes.

* * After this call, the timer has permanently entered the shutdown state; * attempting to schedule any new task or directly restart this timer will * result in an IllegalStateException.

* */ public synchronized void shutdown() { if (!this.isShutdown) { this.isShutdown = true; this.taskQueue.cancelAllTasks(); } } /** for compatiblity with previous version */ public synchronized void shutDown() { shutdown(); } /** * Shuts down this timer immediately, interrupting the wait state associated * with the current head of the task queue or the wait state internal to * the currently executing task, if any such state is currently in effect. * * After this call, the timer has permanently entered the shutdown state; * attempting to schedule any new task or directly restart this timer will * result in an IllegalStateException.

* * Note: If the integrity of work performed by a scheduled task * may be adversely affected by an unplanned interruption, it is the * responsibility of the task's implementation to deal correctly with the * possibility that this method is called while such work is in progress, * for instance by catching the InterruptedException, completing the work, * and then rethrowing the exception. */ public synchronized void shutdownImmediately() { if (!this.isShutdown) { final Thread runner = this.taskRunnerThread; this.isShutdown = true; if (runner != null && runner.isAlive()) { runner.interrupt(); } this.taskQueue.cancelAllTasks(); } } /** * Causes the task referenced by the supplied argument to be cancelled. * If the referenced task is currently executing, it will continue until * finished but will not be rescheduled. * * @param task a task reference */ public static void cancel(final Object task) { if (task instanceof Task) { ((Task) task).cancel(); } } /** * Retrieves whether the specified argument references a cancelled task. * * @param task a task reference * @return true if referenced task is cancelled */ public static boolean isCancelled(final Object task) { return (task instanceof Task) ? ((Task) task).isCancelled() : true; } /** * Retrieves whether the specified argument references a task scheduled * periodically using fixed rate scheduling. * * @param task a task reference * @return true if the task is scheduled at a fixed rate */ public static boolean isFixedRate(final Object task) { if (task instanceof Task) { final Task ltask = (Task) task; return (ltask.relative && ltask.period > 0); } else { return false; } } /** * Retrieves whether the specified argument references a task scheduled * periodically using fixed delay scheduling. * * @param task a task reference * @return true if the reference is scheduled using a fixed delay */ public static boolean isFixedDelay(final Object task) { if (task instanceof Task) { final Task ltask = (Task) task; return (!ltask.relative && ltask.period > 0); } else { return false; } } /** * Retrieves whether the specified argument references a task scheduled * for periodic execution. * * @param task a task reference * @return true if the task is scheduled for periodic execution */ public static boolean isPeriodic(final Object task) { return (task instanceof Task) ? (((Task) task).period > 0) : false; } /** * Retrieves the last time the referenced task was executed, as a * Date object. If the task has never been executed, null is returned. * * @param task a task reference * @return the last time the referenced task was executed; null if never */ public static Date getLastScheduled(Object task) { if (task instanceof Task) { final Task ltask = (Task) task; final long last = ltask.getLastScheduled(); return (last == 0) ? null : new Date(last); } else { return null; } } /** * Sets the periodicity of the designated task to a new value.

* * If the designated task is cancelled or the new period is identical to the * task's current period, then this invocation has essentially no effect * and the submitted object is returned.

* * Otherwise, if the new period is greater than the designated task's * current period, then a simple assignment occurs and the submittted * object is returned.

* * If neither case holds, then the designated task is cancelled and a new, * equivalent task with the new period is scheduled for immediate first * execution and returned to the caller.

* * @return a task reference, as per the rules stated above. * @param task the task whose periodicity is to be set * @param period the new period */ public static Object setPeriod(final Object task, final long period) { return (task instanceof Task) ? ((Task) task).setPeriod(period) : task; } /** * Retrieves the next time the referenced task is due to be executed, as a * Date object. If the referenced task is cancelled, null is returned. * * @param task a task reference * @return the next time the referenced task is due to be executed */ public static Date getNextScheduled(Object task) { if (task instanceof Task) { final Task ltask = (Task) task; final long next = ltask.isCancelled() ? 0 : ltask.getNextScheduled(); return next == 0 ? null : new Date(next); } else { return null; } } /** * Adds to the task queue a new Task object encapsulating the supplied * Runnable and scheduling arguments. * * @param first the time of the task's first execution * @param runnable the Runnable to execute * @param period the task's periodicity * @param relative if true, use fixed rate else use fixed delay scheduling * @return an opaque reference to the internal task */ protected Task addTask(final long first, final Runnable runnable, final long period, boolean relative) { if (this.isShutdown) { throw new IllegalStateException("shutdown"); } final Task task = new Task(first, runnable, period, relative); // sychronized this.taskQueue.addTask(task); // sychronized this.restart(); return task; } /** Sets the background thread to null. */ protected synchronized void clearThread() { //#ifdef JAVA2FULL try { taskRunnerThread.setContextClassLoader(null); } catch (Throwable t) {} //#endif JAVA2FULL taskRunnerThread = null; } /** * Retrieves the next task to execute, or null if this timer is shutdown, * the current thread is interrupted, or there are no queued tasks. * * @return the next task to execute, or null */ protected Task nextTask() { try { while (!this.isShutdown || Thread.interrupted()) { long now; long next; long wait; Task task; // synchronized to ensure removeTask // applies only to the peeked task, // when the computed wait <= 0 synchronized (this.taskQueue) { task = this.taskQueue.peekTask(); if (task == null) { // queue is empty break; } now = System.currentTimeMillis(); next = task.next; wait = (next - now); if (wait > 0) { // release ownership of taskQueue monitor and await // notification of task addition or cancellation, // at most until the time when the peeked task is // next supposed to execute this.taskQueue.park(wait); continue; // to top of loop } else { this.taskQueue.removeTask(); } } long period = task.period; if (period > 0) { // repeated task if (task.relative) { // using fixed rate shceduling final long late = (now - next); if (late > period) { // ensure that really late tasks don't // completely saturate the head of the // task queue period = 0; /** @todo : is -1, -2 ... fairer? */ } else if (late > 0) { // compensate for scheduling overruns period -= late; } } task.updateSchedule(now, now + period); this.taskQueue.addTask(task); } return task; } } catch (InterruptedException e) { //e.printStackTrace(); } return null; } /** * stats var */ static int nowCount = 0; /** * Convenience method replacing the longer incantation: * System.currentTimeMillis() * * @return System.currentTimeMillis() */ static long now() { nowCount++; return System.currentTimeMillis(); } /** * The Runnable that the background thread uses to execute * scheduled tasks.

* * Note: Outer class could simply implement Runnable, * but using an inner class protects the public run method * from potential abuse. */ protected class TaskRunner implements Runnable { /** * Runs the next available task in the background thread.

* * When there are no available tasks, the background * thread dies and its instance field is cleared until * tasks once again become available. */ public void run() { try { do { final Task task = HsqlTimer.this.nextTask(); if (task == null) { break; } // PROBLEM: If the runnable throws an exception other // than InterruptedException (which likely stems // naturally from calling shutdownImmediately() // or getThread().interrupt()), this will still // cause the loop to exit, which is to say that // task scheduling will stop until a new task is // added or the timer is restarted directly, even // though there may still be uncancelled tasks // left on the queue. // // TODO: Clarify and establish a contract regarding // the difference between InterruptedException, // RuntimeException and other things, like // UndeclaredThrowableException. // // SOL'N: At present, we simply require each runnable to // understand its part of the implicit contract, // which is to deal with exceptions internally // (not throw them up to the timer), with the // possible exception of InterruptedException. // // If the integrity of work performed by the // runnable may be adversely affected by an // unplanned interruption, the runnable should // deal with this directly, for instance by // catching the InterruptedException, ensuring // that some integrity preserving state is // attained, and then rethrowing the exception. task.runnable.run(); } while (true); } finally { HsqlTimer.this.clearThread(); } } } /** * Encapsulates a Runnable and its scheduling attributes. * * Essentially, a wrapper class used to schedule a Runnable object * for execution by the enclosing HsqlTimer's TaskRunner in a * background thread. */ protected class Task { /** What to run. */ Runnable runnable; /** The periodic interval, or 0 if one-shot. */ long period; /** The time this task was last executed, or 0 if never. */ long last; /** The next time this task is scheduled to execute. */ long next; /** * Whether to silently remove this task instead of running it, * the next time (if ever) it makes its way to the head of the * timer queue. */ boolean cancelled = false; /** Serializes concurrent access to the cancelled field. */ private Object cancel_mutex = new Object(); /** * Scheduling policy flag.

* * When true, scheduling is fixed rate (as opposed to fixed delay), * and schedule updates are calculated relative to when the task was * was last run rather than a fixed delay starting from the current * wall-clock time provided by System.currentTimeMillis().

* * This helps normalize scheduling for tasks that must attempt to * maintain a fixed rate of execution. */ final boolean relative; /** * Constructs a new Task object encapulating the specified Runnable * and scheduling arguments. * * @param first the first time to execute * @param runnable the Runnable to execute * @param period the periodicity of execution * @param relative if true, use fixed rate scheduling else fixed delay */ Task(final long first, final Runnable runnable, final long period, final boolean relative) { this.next = first; this.runnable = runnable; this.period = period; this.relative = relative; } // fixed reported race condition /** Sets this task's cancelled flag true and signals its taskQueue. */ void cancel() { boolean signalCancelled = false; synchronized (cancel_mutex) { if (!cancelled) { cancelled = signalCancelled = true; } } if (signalCancelled) { HsqlTimer.this.taskQueue.signalTaskCancelled(this); } } /** * Retrieves whether this task is cancelled. * * @return true if cancelled, else false */ boolean isCancelled() { synchronized (cancel_mutex) { return cancelled; } } /** * Retrieves the instant in time just before this task was * last executed by the background thread. A value of zero * indicates that this task has never been executed. * * @return the last time this task was executed or zero if never */ synchronized long getLastScheduled() { return last; } /** * Retrieves the time at which this task is next scheduled for * execution. * * @return the time at which this task is next scheduled for * execution */ synchronized long getNextScheduled() { return next; } /** * Updates the last and next scheduled execution times. * * @param last when this task was last executed * @param next when this task is to be next executed */ synchronized void updateSchedule(final long last, final long next) { this.last = last; this.next = next; } /** * Sets the new periodicity of this task in milliseconds.

* * If this task is cancelled or the new period is identical to the * current period, then this invocation has essentailly no effect * and this object is returned.

* * Otherwise, if the new period is greater than the current period, then * a simple field assignment occurs and this object is returned.

* * If none of the previous cases hold, then this task is cancelled and * a new, equivalent task with the new period is scheduled for * immediate first execution and returned to the caller.

* * @param newPeriod the new period * @return a task reference, as per the rules stated above. */ synchronized Object setPeriod(final long newPeriod) { if (this.period == newPeriod || this.isCancelled()) { return this; } else if (newPeriod > this.period) { this.period = newPeriod; return this; } else { this.cancel(); return HsqlTimer.this.addTask(now(), this.runnable, newPeriod, this.relative); } } } /** * Heap-based priority queue. * * Provides extensions to facilitate and simplify implementing * timer functionality. */ protected static class TaskQueue extends HsqlArrayHeap { /** * Constructs a new TaskQueue with the specified initial capacity and * ObjectComparator. * * @param capacity the initial capacity of the queue * @param oc The ObjectComparator this queue uses to maintain its * Heap invariant. */ TaskQueue(final int capacity, final Comparator oc) { super(capacity, oc); } /** * Type-safe add method.

* * Can be used to inject debugging or accounting behaviour.

* * @param task the task to add */ void addTask(final Task task) { // System.out.println("task added: " + task); super.add(task); } /** * Atomically removes all tasks in this queue and then and cancels * them. */ void cancelAllTasks() { Object[] oldHeap; int oldCount; synchronized (this) { oldHeap = this.heap; oldCount = this.count; // 1 instead of 0 to avoid unintended aoob exceptions this.heap = new Object[1]; this.count = 0; } for (int i = 0; i < oldCount; i++) { ((Task) oldHeap[i]).cancelled = true; } } /** * Causes the calling thread to wait until another thread invokes * {@link #unpark() unpark} or the specified amount of time has * elapsed. * * Implements the sync & wait(n) half of this queue's availability * condition.

* * @param timeout the maximum time to wait in milliseconds. * @throws java.lang.InterruptedException if another thread has * interrupted the current thread. The interrupted status of * the current thread is cleared when this exception is thrown. */ synchronized void park(final long timeout) throws InterruptedException { this.wait(timeout); } /** * Retrieves the head of this queue, without removing it.

* * This method has the side-effect of removing tasks from the * head of this queue until a non-cancelled task is encountered * or this queue is empty.

* * If this queue is initially empty or is emptied in the process * of finding the earliest scheduled non-cancelled task, * then null is returned.

* * @return the earliest scheduled non-cancelled task, or null if no such * task exists */ synchronized Task peekTask() { while (super.heap[0] != null && ((Task) super.heap[0]).isCancelled()) { super.remove(); } return (Task) super.heap[0]; } /** * Informs this queue that the given task is supposedly cancelled.

* * If the indicated task is identical to the current head of * this queue, then it is removed and this queue is * {@link #unpark() unparked}.

* * The cancelled status of the given task is not verified; it is * assumed that the caller is well-behaved (always passes a * non-null reference to a cancelled task). * * @param task a supposedly cancelled task */ synchronized void signalTaskCancelled(Task task) { // We only care about the case where HsqlTimer.nextTask // might be parked momentarily on this task. if (task == super.heap[0]) { super.remove(); this.notify(); } } /** * Type-safe remove method.

* * Removes the head task from this queue.

* * Can be used to inject debugging or accounting behaviour.

* * @return this queue's head task or null if no such task exists */ Task removeTask() { // System.out.println("removing task..."); return (Task) super.remove(); } /** * Wakes up a single thread (if any) that is waiting on this queue's * {@link #park(long) park} method. * * Implements the sync & notify half of this queue's availability * condition. */ synchronized void unpark() { this.notify(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/ArrayListIdentity.java0000644000175000017500000000355612007547400024003 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; public class ArrayListIdentity extends HsqlArrayList implements HsqlList { public int indexOf(Object o) { for (int i = 0; i < elementCount; i++) { if (elementData[i] == o) { return i; } } return -1; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/ArrayUtil.java0000644000175000017500000012646512007547400022300 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.lang.reflect.Array; /** * Collection of static methods for operations on arrays * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.7.2 */ public class ArrayUtil { public static final int CLASS_CODE_BYTE = 'B'; public static final int CLASS_CODE_CHAR = 'C'; public static final int CLASS_CODE_DOUBLE = 'D'; public static final int CLASS_CODE_FLOAT = 'F'; public static final int CLASS_CODE_INT = 'I'; public static final int CLASS_CODE_LONG = 'J'; public static final int CLASS_CODE_OBJECT = 'L'; public static final int CLASS_CODE_SHORT = 'S'; public static final int CLASS_CODE_BOOLEAN = 'Z'; private static IntValueHashMap classCodeMap = new IntValueHashMap(); static { classCodeMap.put(byte.class, ArrayUtil.CLASS_CODE_BYTE); classCodeMap.put(char.class, ArrayUtil.CLASS_CODE_SHORT); classCodeMap.put(short.class, ArrayUtil.CLASS_CODE_SHORT); classCodeMap.put(int.class, ArrayUtil.CLASS_CODE_INT); classCodeMap.put(long.class, ArrayUtil.CLASS_CODE_LONG); classCodeMap.put(float.class, ArrayUtil.CLASS_CODE_FLOAT); classCodeMap.put(double.class, ArrayUtil.CLASS_CODE_DOUBLE); classCodeMap.put(boolean.class, ArrayUtil.CLASS_CODE_BOOLEAN); classCodeMap.put(Object.class, ArrayUtil.CLASS_CODE_OBJECT); } /** * Returns a distinct int code for each primitive type and for all Object types. */ static int getClassCode(Class cla) { if (!cla.isPrimitive()) { return ArrayUtil.CLASS_CODE_OBJECT; } return classCodeMap.get(cla, -1); } /** * Clears an area of the given array of the given type. */ public static void clearArray(int type, Object data, int from, int to) { switch (type) { case ArrayUtil.CLASS_CODE_BYTE : { byte[] array = (byte[]) data; while (--to >= from) { array[to] = 0; } return; } case ArrayUtil.CLASS_CODE_CHAR : { byte[] array = (byte[]) data; while (--to >= from) { array[to] = 0; } return; } case ArrayUtil.CLASS_CODE_SHORT : { short[] array = (short[]) data; while (--to >= from) { array[to] = 0; } return; } case ArrayUtil.CLASS_CODE_INT : { int[] array = (int[]) data; while (--to >= from) { array[to] = 0; } return; } case ArrayUtil.CLASS_CODE_LONG : { long[] array = (long[]) data; while (--to >= from) { array[to] = 0; } return; } case ArrayUtil.CLASS_CODE_FLOAT : { float[] array = (float[]) data; while (--to >= from) { array[to] = 0; } return; } case ArrayUtil.CLASS_CODE_DOUBLE : { double[] array = (double[]) data; while (--to >= from) { array[to] = 0; } return; } case ArrayUtil.CLASS_CODE_BOOLEAN : { boolean[] array = (boolean[]) data; while (--to >= from) { array[to] = false; } return; } default : { Object[] array = (Object[]) data; while (--to >= from) { array[to] = null; } return; } } } /** * Moves the contents of an array to allow both addition and removal of * elements. Used arguments must be in range. * * @param type class type of the array * @param array the array * @param usedElements count of elements of array in use * @param index point at which to add or remove elements * @param count number of elements to add or remove */ public static void adjustArray(int type, Object array, int usedElements, int index, int count) { if (index >= usedElements) { return; } int newCount = usedElements + count; int source; int target; int size; if (count >= 0) { source = index; target = index + count; size = usedElements - index; } else { source = index - count; target = index; size = usedElements - index + count; } if (size > 0) { System.arraycopy(array, source, array, target, size); } if (count < 0) { clearArray(type, array, newCount, usedElements); } } /** * Basic sort for small arrays of int. */ public static void sortArray(int[] array) { boolean swapped; do { swapped = false; for (int i = 0; i < array.length - 1; i++) { if (array[i] > array[i + 1]) { int temp = array[i + 1]; array[i + 1] = array[i]; array[i] = temp; swapped = true; } } } while (swapped); } /** * Basic find for small arrays of Object. */ public static int find(Object[] array, Object object) { for (int i = 0; i < array.length; i++) { if (array[i] == object) { // hadles both nulls return i; } if (object != null && object.equals(array[i])) { return i; } } return -1; } /** * Basic find for small arrays of int. */ public static int find(int[] array, int value) { for (int i = 0; i < array.length; i++) { if (array[i] == value) { return i; } } return -1; } public static int find(short[] array, int value) { for (int i = 0; i < array.length; i++) { if (array[i] == value) { return i; } } return -1; } public static int find(short[] array, int value, int offset, int count) { for (int i = offset; i < offset + count; i++) { if (array[i] == value) { return i; } } return -1; } /** * Finds the first element of the array that is not equal to the given value. */ public static int findNot(int[] array, int value) { for (int i = 0; i < array.length; i++) { if (array[i] != value) { return i; } } return -1; } /** * Returns true if arra and arrb contain the same set of integers, not * necessarily in the same order. This implies the arrays are of the same * length. */ public static boolean areEqualSets(int[] arra, int[] arrb) { return arra.length == arrb.length && ArrayUtil.haveEqualSets(arra, arrb, arra.length); } /** * For full == true returns true if arra and arrb are identical (have the * same length and contain the same integers in the same sequence). * * For full == false returns the result * of haveEqualArrays(arra,arrb,count) * * For full == true, the array lengths must be the same as count * */ public static boolean areEqual(int[] arra, int[] arrb, int count, boolean full) { if (ArrayUtil.haveEqualArrays(arra, arrb, count)) { if (full) { return arra.length == arrb.length && count == arra.length; } return true; } return false; } /** * Returns true if the first count elements of arra and arrb are identical * sets of integers (not necessarily in the same order). * */ public static boolean haveEqualSets(int[] arra, int[] arrb, int count) { if (ArrayUtil.haveEqualArrays(arra, arrb, count)) { return true; } if (count > arra.length || count > arrb.length) { return false; } if (count == 1) { return arra[0] == arrb[0]; } int[] tempa = (int[]) resizeArray(arra, count); int[] tempb = (int[]) resizeArray(arrb, count); sortArray(tempa); sortArray(tempb); for (int j = 0; j < count; j++) { if (tempa[j] != tempb[j]) { return false; } } return true; } /** * Returns true if the first count elements of arra and arrb are identical * subarrays of integers * */ public static boolean haveEqualArrays(int[] arra, int[] arrb, int count) { if (count > arra.length || count > arrb.length) { return false; } for (int j = 0; j < count; j++) { if (arra[j] != arrb[j]) { return false; } } return true; } /** * Returns true if the first count elements of arra and arrb are identical * subarrays of Objects * */ public static boolean haveEqualArrays(Object[] arra, Object[] arrb, int count) { if (count > arra.length || count > arrb.length) { return false; } for (int j = 0; j < count; j++) { if (arra[j] != arrb[j]) { if (arra[j] == null || !arra[j].equals(arrb[j])) { return false; } } } return true; } /** * Returns true if arra and arrb share any element.

* * Used for checks for any overlap between two arrays of column indexes. */ public static boolean haveCommonElement(int[] arra, int[] arrb) { for (int i = 0; i < arra.length; i++) { int c = arra[i]; for (int j = 0; j < arrb.length; j++) { if (c == arrb[j]) { return true; } } } return false; } /** * Returns an int[] containing elements shared between the two arrays * arra and arrb. The arrays contain sets (no value is repeated). * * Used to find the overlap between two arrays of column indexes. * Ordering of the result arrays will be the same as in array * a. The method assumes that each index is only listed * once in the two input arrays. *

* e.g. *

* * * * * * * *
The arrays
int []arra={2,11,5,8}
int []arrb={20,8,10,11,28,12}
will result in:
int []arrc={11,8}
* * @param arra int[]; first column indexes * @param arrb int[]; second column indexes * @return int[] common indexes or null if there is no overlap. */ public static int[] commonElements(int[] arra, int[] arrb) { int[] c = null; int n = countCommonElements(arra, arrb); if (n > 0) { c = new int[n]; int k = 0; for (int i = 0; i < arra.length; i++) { for (int j = 0; j < arrb.length; j++) { if (arra[i] == arrb[j]) { c[k++] = arra[i]; } } } } return c; } /** * Returns the number of elements shared between the two arrays containing * sets.

* * Return the number of elements shared by two column index arrays. * This method assumes that each of these arrays contains a set (each * element index is listed only once in each index array). Otherwise the * returned number will NOT represent the number of unique column indexes * shared by both index array. * * @param arra int[]; first array of column indexes. * * @param arrb int[]; second array of column indexes * * @return int; number of elements shared by a and b */ public static int countCommonElements(int[] arra, int[] arrb) { int k = 0; for (int i = 0; i < arra.length; i++) { for (int j = 0; j < arrb.length; j++) { if (arra[i] == arrb[j]) { k++; break; } } } return k; } public static int countCommonElements(Object[] arra, int alen, Object[] arrb) { int k = 0; for (int i = 0; i < alen; i++) { for (int j = 0; j < arrb.length; j++) { if (arra[i] == arrb[j]) { k++; break; } } } return k; } /** * Returns the count of elements in arra from position start that are * sequentially equal to the elements of arrb. */ public static int countSameElements(byte[] arra, int start, byte[] arrb) { int k = 0; int limit = arra.length - start; if (limit > arrb.length) { limit = arrb.length; } for (int i = 0; i < limit; i++) { if (arra[i + start] == arrb[i]) { k++; } else { break; } } return k; } /** * Returns the count of elements in arra from position start that are * sequentially equal to the elements of arrb. */ public static int countSameElements(char[] arra, int start, char[] arrb) { int k = 0; int limit = arra.length - start; if (limit > arrb.length) { limit = arrb.length; } for (int i = 0; i < limit; i++) { if (arra[i + start] == arrb[i]) { k++; } else { break; } } return k; } /** * Returns an array that contains all the elements of the two arrays. */ public static int[] union(int[] arra, int[] arrb) { int newSize = arra.length + arrb.length - ArrayUtil.countCommonElements(arra, arrb); if (newSize > arra.length && newSize > arrb.length) { int[] arrn = (int[]) ArrayUtil.resizeArray(arrb, newSize); int pos = arrb.length; mainloop: for (int i = 0; i < arra.length; i++) { for (int j = 0; j < arrb.length; j++) { if (arra[i] == arrb[j]) { continue mainloop; } } arrn[pos++] = arra[i]; } return arrn; } return arra.length > arrb.length ? arra : arrb; } /** * Returns the index of the first occurence of arrb in arra. Or -1 if not found. */ public static int find(byte[] arra, int start, int limit, byte[] arrb) { int k = start; limit = limit - arrb.length + 1; int value = arrb[0]; for (; k < limit; k++) { if (arra[k] == value) { if (arrb.length == 1) { return k; } if (containsAt(arra, k, arrb)) { return k; } } } return -1; } /** * Returns an index into arra (or -1) where the character is not in the * charset byte array. */ public static int findNotIn(byte[] arra, int start, int limit, byte[] charset) { int k = 0; for (; k < limit; k++) { for (int i = 0; i < charset.length; i++) { if (arra[k] == charset[i]) { continue; } } return k; } return -1; } /** * Returns an index into arra (or -1) where the character is in the * byteSet byte array. */ public static int findIn(byte[] arra, int start, int limit, byte[] byteSet) { int k = 0; for (; k < limit; k++) { for (int i = 0; i < byteSet.length; i++) { if (arra[k] == byteSet[i]) { return k; } } } return -1; } /** * Returns the index of b or c in arra. Or -1 if not found. */ public static int find(byte[] arra, int start, int limit, int b, int c) { int k = 0; for (; k < limit; k++) { if (arra[k] == b || arra[k] == c) { return k; } } return -1; } /** * Set elements of arrb true if their indexes appear in arrb. */ public static int[] booleanArrayToIntIndexes(boolean[] arrb) { int count = 0; for (int i = 0; i < arrb.length; i++) { if (arrb[i]) { count++; } } int[] intarr = new int[count]; count = 0; for (int i = 0; i < arrb.length; i++) { if (arrb[i]) { intarr[count++] = i; } } return intarr; } /** * Set elements of arrb true if their indexes appear in arrb. */ public static void intIndexesToBooleanArray(int[] arra, boolean[] arrb) { for (int i = 0; i < arra.length; i++) { if (arra[i] < arrb.length) { arrb[arra[i]] = true; } } } /** * Return array of indexes of boolean elements that are true. */ public static int countStartIntIndexesInBooleanArray(int[] arra, boolean[] arrb) { int k = 0; for (int i = 0; i < arra.length; i++) { if (arrb[arra[i]]) { k++; } else { break; } } return k; } public static void orBooleanArray(boolean[] source, boolean[] dest) { for (int i = 0; i < dest.length; i++) { dest[i] |= source[i]; } } public static boolean areAllIntIndexesInBooleanArray(int[] arra, boolean[] arrb) { for (int i = 0; i < arra.length; i++) { if (arrb[arra[i]]) { continue; } return false; } return true; } public static boolean isAnyIntIndexInBooleanArray(int[] arra, boolean[] arrb) { for (int i = 0; i < arra.length; i++) { if (arrb[arra[i]]) { return true; } } return false; } /** * Return true if for each true element in arrb, the corresponding * element in arra is true */ public static boolean containsAllTrueElements(boolean[] arra, boolean[] arrb) { for (int i = 0; i < arra.length; i++) { if (arrb[i] && !arra[i]) { return false; } } return true; } /** * Return count of true elements in array */ public static int countTrueElements(boolean[] arra) { int count = 0; for (int i = 0; i < arra.length; i++) { if (arra[i]) { count++; } } return count; } /** * Determines if the array has a null column for any of the positions given * in the rowColMap array. */ public static boolean hasNull(Object[] array, int[] columnMap) { int count = columnMap.length; for (int i = 0; i < count; i++) { if (array[columnMap[i]] == null) { return true; } } return false; } public static boolean hasAllNull(Object[] array, int[] columnMap) { int count = columnMap.length; for (int i = 0; i < count; i++) { if (array[columnMap[i]] != null) { return false; } } return true; } /** * Returns true if arra from position start contains all elements of arrb * in sequential order. */ public static boolean containsAt(byte[] arra, int start, byte[] arrb) { return countSameElements(arra, start, arrb) == arrb.length; } /** * Returns the count of elements in arra from position start that are * among the elements of arrb. Stops at any element not in arrb. */ public static int countStartElementsAt(byte[] arra, int start, byte[] arrb) { int k = 0; mainloop: for (int i = start; i < arra.length; i++) { for (int j = 0; j < arrb.length; j++) { if (arra[i] == arrb[j]) { k++; continue mainloop; } } break; } return k; } /** * Returns true if arra from position start contains all elements of arrb * in sequential order. */ public static boolean containsAt(char[] arra, int start, char[] arrb) { return countSameElements(arra, start, arrb) == arrb.length; } /** * Returns the count of elements in arra from position start that are not * among the elements of arrb. * */ public static int countNonStartElementsAt(byte[] arra, int start, byte[] arrb) { int k = 0; mainloop: for (int i = start; i < arra.length; i++) { for (int j = 0; j < arrb.length; j++) { if (arra[i] == arrb[j]) { break mainloop; } } k++; } return k; } /** * Byte arrays source and dest each begin at an offset in the common space. * If there is an overlap between dest and the first length elements of * the source, the overlapping elements are copied to dest. Returns count * of copied bytes. */ public static int copyBytes(long sourceOffset, byte[] source, int sourceOff, int length, long destOffset, byte[] dest) { if (sourceOffset + sourceOff >= destOffset + dest.length || sourceOffset + sourceOff + length <= destOffset) { return 0; } long sourceIndex = destOffset - sourceOffset; long destIndex = 0; int sourceLimit = sourceOff + length; if (sourceIndex > 0) { if (sourceIndex < sourceOff) { sourceIndex = sourceOff; } } else { destIndex = -sourceIndex + sourceOff; sourceIndex = sourceOff; } length = sourceLimit - (int) sourceIndex; if (length > dest.length - destIndex) { length = dest.length - (int) destIndex; } System.arraycopy(source, (int) sourceIndex, dest, (int) destIndex, length); return length; } /** * Copy the source to dest, returning dest or an enlarged array of result is * larger than dest. */ public static byte[] copyBytes(byte[] source, byte[] dest, int destOffset) { if (source.length + destOffset > dest.length) { byte[] newDest = new byte[source.length + destOffset]; System.arraycopy(dest, 0, newDest, 0, dest.length); dest = newDest; } System.arraycopy(source, 0, dest, destOffset, source.length); return dest; } /** * Convenience wrapper for System.arraycopy(). */ public static void copyArray(Object source, Object dest, int count) { System.arraycopy(source, 0, dest, 0, count); } public static void copyMoveSegment(Object source, Object dest, int size, int index, int segmentSize, int destIndex) { boolean forward = index < destIndex; int sliceSize = forward ? index : destIndex; System.arraycopy(source, 0, dest, 0, sliceSize); sliceSize = forward ? size - destIndex - segmentSize : size - index - segmentSize; int sliceIndex = forward ? destIndex + segmentSize : index + segmentSize; System.arraycopy(source, sliceIndex, dest, sliceIndex, sliceSize); System.arraycopy(source, index, dest, destIndex, segmentSize); sliceSize = Math.abs(index - destIndex); sliceIndex = forward ? index + segmentSize : destIndex; int targetSliceIndex = forward ? index : destIndex + segmentSize; System.arraycopy(source, sliceIndex, dest, targetSliceIndex, sliceSize); } /** * Returns a range of elements of source from start to end of the array. */ public static int[] arraySlice(int[] source, int start, int count) { int[] slice = new int[count]; System.arraycopy(source, start, slice, 0, count); return slice; } /** * Fills part of the array with a value. */ public static void fillArray(char[] array, int offset, char value) { int to = array.length; while (--to >= offset) { array[to] = value; } } /** * Fills part of the array with a value. */ public static void fillArray(byte[] array, int offset, byte value) { int to = array.length; while (--to >= offset) { array[to] = value; } } /** * Fills the array with a value. */ public static void fillArray(Object[] array, Object value) { int to = array.length; while (--to >= 0) { array[to] = value; } } /** * Fills the int array with a value */ public static void fillArray(int[] array, int value) { int to = array.length; while (--to >= 0) { array[to] = value; } } /** * Fills the double array with a value */ public static void fillArray(double[] array, double value) { int to = array.length; while (--to >= 0) { array[to] = value; } } /** * Fills the int array with a value */ public static void fillArray(boolean[] array, boolean value) { int to = array.length; while (--to >= 0) { array[to] = value; } } /** * Returns a duplicates of an array. */ public static Object duplicateArray(Object source) { int size = Array.getLength(source); Object newarray = Array.newInstance(source.getClass().getComponentType(), size); System.arraycopy(source, 0, newarray, 0, size); return newarray; } /** * Returns the given array if newsize is the same as existing. * Returns a new array of given size, containing as many elements of * the original array as it can hold. */ public static Object resizeArrayIfDifferent(Object source, int newsize) { int oldsize = Array.getLength(source); if (oldsize == newsize) { return source; } Object newarray = Array.newInstance(source.getClass().getComponentType(), newsize); if (oldsize < newsize) { newsize = oldsize; } System.arraycopy(source, 0, newarray, 0, newsize); return newarray; } /** * Returns a new array of given size, containing as many elements of * the original array as it can hold. N.B. Always returns a new array * even if newsize parameter is the same as the old size. */ public static Object resizeArray(Object source, int newsize) { Object newarray = Array.newInstance(source.getClass().getComponentType(), newsize); int oldsize = Array.getLength(source); if (oldsize < newsize) { newsize = oldsize; } System.arraycopy(source, 0, newarray, 0, newsize); return newarray; } /** * Returns an array containing the elements of parameter source, with one * element removed or added. Parameter adjust {-1, +1} indicates the * operation. Parameter colindex indicates the position at which an element * is removed or added. Parameter addition is an Object to add when * adjust is +1. */ public static Object toAdjustedArray(Object source, Object addition, int colindex, int adjust) { int newsize = Array.getLength(source) + adjust; Object newarray = Array.newInstance(source.getClass().getComponentType(), newsize); copyAdjustArray(source, newarray, addition, colindex, adjust); return newarray; } /** * Copies elements of source to dest. If adjust is -1 the element at * colindex is not copied. If adjust is +1 that element is filled with * the Object addition. All the rest of the elements in source are * shifted left or right accordingly when they are copied. If adjust is 0 * the addition is copied over the element at colindex. * * No checks are perfomed on array sizes and an exception is thrown * if they are not consistent with the other arguments. */ public static void copyAdjustArray(Object source, Object dest, Object addition, int colindex, int adjust) { int length = Array.getLength(source); if (colindex < 0) { System.arraycopy(source, 0, dest, 0, length); return; } System.arraycopy(source, 0, dest, 0, colindex); if (adjust == 0) { int endcount = length - colindex - 1; Array.set(dest, colindex, addition); if (endcount > 0) { System.arraycopy(source, colindex + 1, dest, colindex + 1, endcount); } } else if (adjust < 0) { int endcount = length - colindex - 1; if (endcount > 0) { System.arraycopy(source, colindex + 1, dest, colindex, endcount); } } else { int endcount = length - colindex; Array.set(dest, colindex, addition); if (endcount > 0) { System.arraycopy(source, colindex, dest, colindex + 1, endcount); } } } /** * Returns a new array with the elements in collar adjusted to reflect * changes at colindex.

* * Each element in collarr represents an index into another array * otherarr.

* * colindex is the index at which an element is added or removed. * Each element in the result array represents the new, * adjusted index.

* * For each element of collarr that represents an index equal to * colindex and adjust is -1, the result will not contain that element * and will be shorter than collar by one element. * * @param colarr the source array * @param colindex index at which to perform adjustement * @param adjust +1, 0 or -1 * @return new, adjusted array */ public static int[] toAdjustedColumnArray(int[] colarr, int colindex, int adjust) { if (colarr == null) { return null; } if (colindex < 0) { return colarr; } int[] intarr = new int[colarr.length]; int j = 0; for (int i = 0; i < colarr.length; i++) { if (colarr[i] > colindex) { intarr[j] = colarr[i] + adjust; j++; } else if (colarr[i] == colindex) { if (adjust < 0) { // skip an element from colarr } else { intarr[j] = colarr[i] + adjust; j++; } } else { intarr[j] = colarr[i]; j++; } } if (colarr.length != j) { int[] newarr = new int[j]; copyArray(intarr, newarr, j); return newarr; } return intarr; } /** * Copies some elements of row into newRow by using columnMap as * the list of indexes into row.

* * columnMap and newRow are of equal length and are normally * shorter than row.

* * @param row the source array * @param columnMap the list of indexes into row * @param newRow the destination array */ public static void projectRow(Object[] row, int[] columnMap, Object[] newRow) { for (int i = 0; i < columnMap.length; i++) { newRow[i] = row[columnMap[i]]; } } public static void projectRow(int[] row, int[] columnMap, int[] newRow) { for (int i = 0; i < columnMap.length; i++) { newRow[i] = row[columnMap[i]]; } } /** * As above but copies in reverse direction.

* * @param row the target array * @param columnMap the list of indexes into row * @param newRow the source array */ public static void projectRowReverse(Object[] row, int[] columnMap, Object[] newRow) { for (int i = 0; i < columnMap.length; i++) { row[columnMap[i]] = newRow[i]; } } /* public static void copyColumnValues(int[] row, int[] colindex, int[] colobject) { for (int i = 0; i < colindex.length; i++) { colobject[i] = row[colindex[i]]; } } public static void copyColumnValues(boolean[] row, int[] colindex, boolean[] colobject) { for (int i = 0; i < colindex.length; i++) { colobject[i] = row[colindex[i]]; } } public static void copyColumnValues(byte[] row, int[] colindex, byte[] colobject) { for (int i = 0; i < colindex.length; i++) { colobject[i] = row[colindex[i]]; } } */ public static void projectMap(int[] mainMap, int[] subMap, int[] newSubMap) { for (int i = 0; i < subMap.length; i++) { for (int j = 0; j < mainMap.length; j++) { if (subMap[i] == mainMap[j]) { newSubMap[i] = j; break; } } } } public static void reorderMaps(int[] mainMap, int[] firstMap, int[] secondMap) { for (int i = 0; i < mainMap.length; i++) { for (int j = i; j < firstMap.length; j++) { if (mainMap[i] == firstMap[j]) { int temp = firstMap[i]; firstMap[i] = firstMap[j]; firstMap[j] = temp; temp = secondMap[i]; secondMap[i] = secondMap[j]; secondMap[j] = temp; break; } } } } public static void fillSequence(int[] colindex) { for (int i = 0; i < colindex.length; i++) { colindex[i] = i; } } public static char[] byteArrayToChars(byte[] bytes) { char[] chars = new char[bytes.length / 2]; for (int i = 0, j = 0; j < chars.length; i += 2, j++) { chars[j] = (char) ((bytes[i] << 8) + (bytes[i + 1] & 0xff)); } return chars; } public static byte[] charArrayToBytes(char[] chars) { byte[] bytes = new byte[chars.length * 2]; for (int i = 0, j = 0; j < chars.length; i += 2, j++) { int c = chars[j]; bytes[i] = (byte) (c >> 8); bytes[i + 1] = (byte) c; } return bytes; } /** * Returns true if char agrument is in array. */ public static boolean isInSortedArray(char ch, char[] array) { if (array.length == 0 || ch < array[0] || ch > array[array.length - 1]) { return false; } int low = 0; int high = array.length; int mid = 0; while (low < high) { mid = (low + high) / 2; if (ch < array[mid]) { high = mid; } else if (ch > array[mid]) { low = mid + 1; } else { return true; } } return false; } /** * returns true if arra contains all elements of arrb * * @param arra Object[] * @param arrb Object[] * @return boolean */ public static boolean containsAll(Object[] arra, Object[] arrb) { mainLoop: for (int i = 0; i < arrb.length; i++) { for (int j = 0; j < arra.length; j++) { if (arrb[i] == arra[j] || arrb[i].equals(arra[j])) { continue mainLoop; } } return false; } return true; } /** * returns true if arra contains any element of arrb * * @param arra Object[] * @param arrb Object[] * @return boolean */ public static boolean containsAny(Object[] arra, Object[] arrb) { mainLoop: for (int i = 0; i < arrb.length; i++) { for (int j = 0; j < arra.length; j++) { if (arrb[i] == arra[j] || arrb[i].equals(arra[j])) { return true; } } } return false; } /** * returns true if arra contains all elements of arrb * * @param arra int[] * @param arrb int[] * @return boolean */ public static boolean containsAll(int[] arra, int[] arrb) { mainLoop: for (int i = 0; i < arrb.length; i++) { for (int j = 0; j < arra.length; j++) { if (arrb[i] == arra[j]) { continue mainLoop; } } return false; } return true; } /** * returns true if arra contains all elements of arrb at its start * * @param arra int[] * @param arrb int[] * @return boolean */ public static boolean containsAllAtStart(int[] arra, int[] arrb) { if (arrb.length > arra.length) { return false; } mainLoop: for (int i = 0; i < arra.length; i++) { if (i == arrb.length) { return true; } for (int j = 0; j < arrb.length; j++) { if (arra[i] == arrb[j]) { continue mainLoop; } } return false; } return true; } /** * converts two longs to a byte[] * * @param hi long * @param lo long * @return byte[] */ public static byte[] toByteArray(long hi, long lo) { byte[] bytes = new byte[16]; int count = 0; int v; while (count < 16) { if (count == 0) { v = (int) hi >>> 32; } else if (count == 4) { v = (int) hi; } else if (count == 8) { v = (int) lo >>> 32; } else { v = (int) lo; } bytes[count++] = (byte) (v >>> 24); bytes[count++] = (byte) (v >>> 16); bytes[count++] = (byte) (v >>> 8); bytes[count++] = (byte) v; } return bytes; } /** * Compares two arrays. Returns -1, 0, +1. If one array is shorther and * all the elements are equal to the other's elements, -1 is returned. */ public static int compare(byte[] a, byte[] b) { int length = a.length; if (length > b.length) { length = b.length; } for (int i = 0; i < length; i++) { if (a[i] == b[i]) { continue; } return a[i] < b[i] ? -1 : 1; } if (a.length == b.length) { return 0; } return a.length < b.length ? -1 : 1; } /** * uses 2**scale form and returns a multipe of this that is larger or equal to value */ public static long getBinaryNormalisedCeiling(long value, int scale) { long mask = 0xffffffffffffffffl << scale; long newSize = value & mask; if (newSize != value) { newSize += 1 << scale; } return newSize; } /** * returns true if log2 n is in the range (0, max) */ public static boolean isTwoPower(int n, int max) { for (int i = 0; i <= max; i++) { if ((n & 1) != 0) { return n == 1; } n >>= 1; } return false; } /** * returns the largest value that is 0 or a power of 2 and is smaller or equal to n */ public static int getTwoPowerFloor(int n) { int shift = 0; if (n == 0) { return 0; } for (int i = 0; i < 32; i++) { if ((n & 1) != 0) { shift = i; } n >>= 1; } return 1 << shift; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/IntKeyHashMapConcurrent.java0000644000175000017500000001365612007547400025071 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import org.hsqldb.store.BaseHashMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.9.0 */ public class IntKeyHashMapConcurrent extends BaseHashMap { Set keySet; Collection values; // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true); ReentrantReadWriteLock.ReadLock readLock = lock.readLock(); ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock(); public IntKeyHashMapConcurrent() { this(8); } public IntKeyHashMapConcurrent(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.intKeyOrValue, BaseHashMap.objectKeyOrValue, false); } public Lock getWriteLock() { return writeLock; } public Object get(int key) { try { readLock.lock(); int lookup = getLookup(key); if (lookup != -1) { return objectValueTable[lookup]; } return null; } finally { readLock.unlock(); } } public Object put(int key, Object value) { try { writeLock.lock(); return super.addOrRemove(key, 0, null, value, false); } finally { writeLock.unlock(); } } public boolean containsValue(Object value) { try { readLock.lock(); return super.containsValue(value); } finally { readLock.unlock(); } } public Object remove(int key) { try { writeLock.lock(); return super.addOrRemove(key, 0, null, null, true); } finally { writeLock.unlock(); } } public boolean containsKey(int key) { try { readLock.lock(); return super.containsKey(key); } finally { readLock.unlock(); } } public int getOrderedMatchCount(int[] array) { int i = 0; try { readLock.lock(); for (; i < array.length; i++) { if (!super.containsKey(array[i])) { break; } } return i; } finally { readLock.unlock(); } } public Set keySet() { if (keySet == null) { keySet = new KeySet(); } return keySet; } public Collection values() { if (values == null) { values = new Values(); } return values; } class KeySet implements Set { public Iterator iterator() { return IntKeyHashMapConcurrent.this.new BaseHashIterator(true); } public int size() { return IntKeyHashMapConcurrent.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public Object get(Object key) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { IntKeyHashMapConcurrent.this.clear(); } } class Values implements Collection { public Iterator iterator() { return IntKeyHashMapConcurrent.this.new BaseHashIterator(false); } public int size() { return IntKeyHashMapConcurrent.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { IntKeyHashMapConcurrent.this.clear(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/ThreadFactory.java0000644000175000017500000000334512007547376023126 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; /** * * @author boucherb@users * @version 1.7.2 * @since 1.7.2 */ public interface ThreadFactory { Thread newThread(Runnable r); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/LineReader.java0000644000175000017500000000763712007547400022375 0ustar renerene/* Copyright (c) 2001-2010, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; /** * A converter for InputStream to return String objects using the given * charset for conversion. The readLine() method returns the next string * excluding carriage-return and line-feed characters. No other character is * excluded. A carriage-return followed by a line-feed is treated as a single * end-of-line marker. Otherwise, each carriage-return or line-feed is treated * as an end-of_line marker. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 2.0.1 */ public class LineReader { boolean finished = false; boolean wasCR = false; boolean wasEOL = false; HsqlByteArrayOutputStream baOS = new HsqlByteArrayOutputStream(1024); // final InputStream stream; final Charset charset; final String charsetName; public LineReader(InputStream stream, String charsetName) { this.stream = stream; this.charsetName = charsetName; this.charset = Charset.forName(charsetName); } public String readLine() throws IOException { if (finished) { return null; } while (true) { int c = stream.read(); if (c == -1) { finished = true; if (baOS.size() == 0) { return null; } break; } switch (c) { case '\r' : { wasCR = true;; break; } case '\n' : { if (wasCR) { wasCR = false; continue; } else { break; } } default : { baOS.write(c); wasCR = false; continue; } } break; } // can use charset with JDK 1.6 String string = new String(baOS.getBuffer(), 0, baOS.size(), charsetName); baOS.reset(); return string; } public void close() throws IOException { stream.close(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/package.html0000644000175000017500000000011712007547400021763 0ustar renerene Shared classes used by other HyperSQL classes. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/InputStreamWrapper.java0000644000175000017500000000712312007547400024165 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.IOException; import java.io.InputStream; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 2.2.8 */ public class InputStreamWrapper implements InputStreamInterface { InputStream is; long limitSize = -1; long fetchedSize = 0; public InputStreamWrapper(InputStream is) { this.is = is; } public int read() throws IOException { if (fetchedSize == limitSize) { return -1; } int byteread = is.read(); if (byteread < 0) { if (limitSize == -1) { return -1; } else { throw new IOException("stream not reached the end" + fetchedSize + " " + limitSize); } } fetchedSize++; return byteread; } public int read(byte bytes[]) throws IOException { return read(bytes, 0, bytes.length); } public int read(byte bytes[], int offset, int length) throws IOException { if (fetchedSize == limitSize) { return -1; } if (limitSize >= 0 && limitSize - fetchedSize < length) { length = (int) (limitSize - fetchedSize); } int count = is.read(bytes, offset, length); if (count < 0) { if (limitSize == -1) { return -1; } else { throw new IOException("stream not reached the end" + fetchedSize + " " + limitSize); } } fetchedSize += count; return count; } public long skip(long count) throws IOException { return is.skip(count); } public int available() throws IOException { return is.available(); } public void close() throws IOException { is.close(); } public void setSizeLimit(long count) { limitSize = count; } public long getSizeLimit() { return limitSize; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/CountUpDownLatch.java0000644000175000017500000000531412007547400023552 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.concurrent.CountDownLatch; /** * Wrapper for CountDownLatch to allow counting up.

* * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public class CountUpDownLatch { volatile CountDownLatch latch; volatile int count; public CountUpDownLatch() { latch = new CountDownLatch(1); } public void await() throws InterruptedException { if (count == 0) { return; } latch.await(); } public void countDown() { count--; if (count == 0) { latch.countDown(); } } public long getCount() { return count; } public void countUp() { if (latch.getCount() == 0) { latch = new CountDownLatch(1); } count++; } public void setCount(int count) { if (count == 0) { if (latch.getCount() != 0) { latch.countDown(); } } else if (latch.getCount() == 0) { latch = new CountDownLatch(1); } this.count = count; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HashMap.java0000644000175000017500000001266612007547402021704 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import org.hsqldb.store.BaseHashMap; /** * This class does not store null keys. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public class HashMap extends BaseHashMap { Set keySet; Collection values; public HashMap() { this(8); } public HashMap(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.objectKeyOrValue, BaseHashMap.objectKeyOrValue, false); } public Object get(Object key) { int hash = key.hashCode(); int lookup = getLookup(key, hash); if (lookup != -1) { return objectValueTable[lookup]; } return null; } public Object put(Object key, Object value) { return super.addOrRemove(0, 0, key, value, false); } public Object remove(Object key) { return super.removeObject(key, false); } public boolean containsKey(Object key) { return super.containsKey(key); } public boolean containsValue(Object value) { return super.containsValue(value); } public void putAll(HashMap t) { Iterator it = t.keySet().iterator(); while (it.hasNext()) { Object key = it.next(); put(key, t.get(key)); } } public void valuesToArray(Object[] array) { Iterator it = values().iterator(); int i = 0; while (it.hasNext()) { array[i] = it.next(); i++; } } public void keysToArray(Object[] array) { Iterator it = keySet().iterator(); int i = 0; while (it.hasNext()) { array[i] = it.next(); i++; } } public Set keySet() { if (keySet == null) { keySet = new KeySet(); } return keySet; } public Collection values() { if (values == null) { values = new Values(); } return values; } class KeySet implements Set { public Iterator iterator() { return HashMap.this.new BaseHashIterator(true); } public int size() { return HashMap.this.size(); } public boolean contains(Object o) { return containsKey(o); } public Object get(Object key) { int lookup = HashMap.this.getLookup(key, key.hashCode()); if (lookup < 0) { return null; } else { return HashMap.this.objectKeyTable[lookup]; } } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { int oldSize = size(); HashMap.this.remove(o); return size() != oldSize; } public boolean isEmpty() { return size() == 0; } public void clear() { HashMap.this.clear(); } } class Values implements Collection { public Iterator iterator() { return HashMap.this.new BaseHashIterator(false); } public int size() { return HashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { HashMap.this.clear(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/StringConverter.java0000644000175000017500000005671612007547400023523 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.lib; import java.io.IOException; import java.io.InputStream; import java.io.UTFDataFormatException; import org.hsqldb.store.BitMap; /** * Collection of static methods for converting strings between different * formats and to and from byte arrays.

* * Includes some methods based on Hypersonic code as indicated. * * @author Thomas Mueller (Hypersonic SQL Group) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.2 */ public class StringConverter { private static final byte[] HEXBYTES = { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }; private static int getNibble(int value) { if (value >= '0' && value <= '9') { return value - '0'; } if (value >= 'a' && value <= 'f') { return 10 + value - 'a'; } if (value >= 'A' && value <= 'F') { return 10 + value - 'A'; } return -1; } /** * Converts a hexadecimal string into a byte array * * * @param s hexadecimal string * * @return byte array for the hex string * @throws IOException */ public static byte[] hexStringToByteArray(String s) throws IOException { int l = s.length(); byte[] data = new byte[l / 2 + (l % 2)]; int n, b = 0; boolean high = true; int i = 0; for (int j = 0; j < l; j++) { char c = s.charAt(j); if (c == ' ') { continue; } n = getNibble(c); if (n == -1) { throw new IOException( "hexadecimal string contains non hex character"); //NOI18N } if (high) { b = (n & 0xf) << 4; high = false; } else { b += (n & 0xf); high = true; data[i++] = (byte) b; } } if (!high) { throw new IOException( "hexadecimal string with odd number of characters"); //NOI18N } if (i < data.length) { data = (byte[]) ArrayUtil.resizeArray(data, i); } return data; } /** * Compacts a bit string into a BitMap * * * @param s bit string * * @return byte array for the hex string * @throws IOException */ public static BitMap sqlBitStringToBitMap(String s) throws IOException { int l = s.length(); int n; int bitIndex = 0; BitMap map = new BitMap(l); for (int j = 0; j < l; j++) { char c = s.charAt(j); if (c == ' ') { continue; } n = getNibble(c); if (n != 0 && n != 1) { throw new IOException( "hexadecimal string contains non hex character"); //NOI18N } if (n == 1) { map.set(bitIndex); } bitIndex++; } map.setSize(bitIndex); return map; } /** * Converts a byte array into a hexadecimal string * * * @param b byte array * * @return hex string */ public static String byteArrayToHexString(byte[] b) { int len = b.length; char[] s = new char[len * 2]; for (int i = 0, j = 0; i < len; i++) { int c = ((int) b[i]) & 0xff; s[j++] = (char) HEXBYTES[c >> 4 & 0xf]; s[j++] = (char) HEXBYTES[c & 0xf]; } return new String(s); } /** * Converts a byte array into an SQL hexadecimal string * * * @param b byte array * * @return hex string */ public static String byteArrayToSQLHexString(byte[] b) { int len = b.length; char[] s = new char[len * 2 + 3]; s[0] = 'X'; s[1] = '\''; int j = 2; for (int i = 0; i < len; i++) { int c = ((int) b[i]) & 0xff; s[j++] = (char) HEXBYTES[c >> 4 & 0xf]; s[j++] = (char) HEXBYTES[c & 0xf]; } s[j] = '\''; return new String(s); } /** * Converts a byte array into a bit string * * * @param bytes byte array * @param bitCount number of bits * @return hex string */ public static String byteArrayToBitString(byte[] bytes, int bitCount) { char[] s = new char[bitCount]; for (int j = 0; j < bitCount; j++) { byte b = bytes[j / 8]; s[j] = BitMap.isSet(b, j % 8) ? '1' : '0'; } return new String(s); } /** * Converts a byte array into an SQL binary string * * * @param bytes byte array * @param bitCount number of bits * @return hex string */ public static String byteArrayToSQLBitString(byte[] bytes, int bitCount) { char[] s = new char[bitCount + 3]; s[0] = 'B'; s[1] = '\''; int pos = 2; for (int j = 0; j < bitCount; j++) { byte b = bytes[j / 8]; s[pos++] = BitMap.isSet(b, j % 8) ? '1' : '0'; } s[pos] = '\''; return new String(s); } /** * Converts a byte array into hexadecimal characters which are written as * ASCII to the given output stream. * * @param o output array * @param from offset into output array * @param b input array */ public static void writeHexBytes(byte[] o, int from, byte[] b) { int len = b.length; for (int i = 0; i < len; i++) { int c = ((int) b[i]) & 0xff; o[from++] = HEXBYTES[c >> 4 & 0xf]; o[from++] = HEXBYTES[c & 0xf]; } } public static String byteArrayToString(byte[] b, String charset) { try { return (charset == null) ? new String(b) : new String(b, charset); } catch (Exception e) {} return null; } /** * Hsqldb specific encoding used only for log files. The SQL statements that * need to be written to the log file (input) are Java Unicode strings. * input is converted into a 7bit escaped ASCII string (output)with the * following transformations. All characters outside the 0x20-7f range are * converted to a escape sequence and added to output. If a backslash * character is immdediately followed by 'u', the backslash character is * converted to escape sequence and added to output. All the remaining * characters in input are added to output without conversion. The escape * sequence is backslash, letter u, xxxx, where xxxx is the hex * representation of the character code. (fredt@users)

* * Method based on Hypersonic Code * * @param b output stream to wite to * @param s Java string * @param doubleSingleQuotes boolean */ public static void stringToUnicodeBytes(HsqlByteArrayOutputStream b, String s, boolean doubleSingleQuotes) { if (s == null) { return; } final int len = s.length(); char[] chars; int extras = 0; if (len == 0) { return; } chars = s.toCharArray(); b.ensureRoom(len * 2 + 5); for (int i = 0; i < len; i++) { char c = chars[i]; if (c == '\\') { if ((i < len - 1) && (chars[i + 1] == 'u')) { b.writeNoCheck(c); // encode the \ as unicode, so 'u' is ignored b.writeNoCheck('u'); b.writeNoCheck('0'); b.writeNoCheck('0'); b.writeNoCheck('5'); b.writeNoCheck('c'); extras += 5; } else { b.write(c); } } else if ((c >= 0x0020) && (c <= 0x007f)) { b.writeNoCheck(c); // this is 99% if (c == '\'' && doubleSingleQuotes) { b.writeNoCheck(c); extras++; } } else { b.writeNoCheck('\\'); b.writeNoCheck('u'); b.writeNoCheck(HEXBYTES[(c >> 12) & 0xf]); b.writeNoCheck(HEXBYTES[(c >> 8) & 0xf]); b.writeNoCheck(HEXBYTES[(c >> 4) & 0xf]); b.writeNoCheck(HEXBYTES[c & 0xf]); extras += 5; } if (extras > len) { b.ensureRoom(len + extras + 5); extras = 0; } } } // fredt@users 20020522 - fix for 557510 - backslash bug // this legacy bug resulted from forward reading the input when a backslash // was present and manifested itself when a backslash was followed // immdediately by a character outside the 0x20-7f range in a database field. /** * Hsqldb specific decoding used only for log files. This method converts * the 7 bit escaped ASCII strings in a log file back into Java Unicode * strings. See stringToUnicodeBytes() above.

* * Method based on Hypersonic Code * * @param s encoded ASCII string in byte array * @return Java string */ public static String unicodeStringToString(String s) { if ((s == null) || (s.indexOf("\\u") == -1)) { return s; } int len = s.length(); char[] b = new char[len]; int j = 0; for (int i = 0; i < len; i++) { char c = s.charAt(i); if (c == '\\' && i < len - 5) { char c1 = s.charAt(i + 1); if (c1 == 'u') { i++; // 4 characters read should always return 0-15 int k = getNibble(s.charAt(++i)) << 12; k += getNibble(s.charAt(++i)) << 8; k += getNibble(s.charAt(++i)) << 4; k += getNibble(s.charAt(++i)); b[j++] = (char) k; } else { b[j++] = c; } } else { b[j++] = c; } } return new String(b, 0, j); } public static String readUTF(byte[] bytearr, int offset, int length) throws IOException { char[] buf = new char[length]; return readUTF(bytearr, offset, length, buf); } public static String readUTF(byte[] bytearr, int offset, int length, char[] buf) throws IOException { int bcount = 0; int c, char2, char3; int count = 0; while (count < length) { c = (int) bytearr[offset + count]; if (bcount == buf.length) { buf = (char[]) ArrayUtil.resizeArray(buf, length); } if (c > 0) { /* 0xxxxxxx*/ count++; buf[bcount++] = (char) c; continue; } c &= 0xff; switch (c >> 4) { case 12 : case 13 : /* 110x xxxx 10xx xxxx*/ count += 2; if (count > length) { throw new UTFDataFormatException(); } char2 = (int) bytearr[offset + count - 1]; if ((char2 & 0xC0) != 0x80) { throw new UTFDataFormatException(); } buf[bcount++] = (char) (((c & 0x1F) << 6) | (char2 & 0x3F)); break; case 14 : /* 1110 xxxx 10xx xxxx 10xx xxxx */ count += 3; if (count > length) { throw new UTFDataFormatException(); } char2 = (int) bytearr[offset + count - 2]; char3 = (int) bytearr[offset + count - 1]; if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80)) { throw new UTFDataFormatException(); } buf[bcount++] = (char) (((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0)); break; default : /* 10xx xxxx, 1111 xxxx */ throw new UTFDataFormatException(); } } // The number of chars produced may be less than length return new String(buf, 0, bcount); } /** * Writes a string to the specified DataOutput using UTF-8 encoding in a * machine-independent manner. *

* @param str a string to be written. * @param out destination to write to * @return The number of bytes written out. */ public static int stringToUTFBytes(String str, HsqlByteArrayOutputStream out) { int strlen = str.length(); int c, count = 0; if (out.count + strlen + 8 > out.buffer.length) { out.ensureRoom(strlen + 8); } char[] arr = str.toCharArray(); for (int i = 0; i < strlen; i++) { c = arr[i]; if (c >= 0x0001 && c <= 0x007F) { out.buffer[out.count++] = (byte) c; count++; } else if (c > 0x07FF) { out.buffer[out.count++] = (byte) (0xE0 | ((c >> 12) & 0x0F)); out.buffer[out.count++] = (byte) (0x80 | ((c >> 6) & 0x3F)); out.buffer[out.count++] = (byte) (0x80 | ((c >> 0) & 0x3F)); count += 3; } else { out.buffer[out.count++] = (byte) (0xC0 | ((c >> 6) & 0x1F)); out.buffer[out.count++] = (byte) (0x80 | ((c >> 0) & 0x3F)); count += 2; } if (out.count + 8 > out.buffer.length) { out.ensureRoom(strlen - i + 8); } } return count; } public static int getUTFSize(String s) { int len = (s == null) ? 0 : s.length(); int l = 0; for (int i = 0; i < len; i++) { int c = s.charAt(i); if ((c >= 0x0001) && (c <= 0x007F)) { l++; } else if (c > 0x07FF) { l += 3; } else { l += 2; } } return l; } /** * Using an output stream, returns a String from an InputStream. * * @param is InputStream to read from * @param encoding character encoding of the string * @throws IOException * @return a Java string */ public static String inputStreamToString(InputStream is, String encoding) throws IOException { HsqlByteArrayOutputStream baOS = new HsqlByteArrayOutputStream(1024); while (true) { int c = is.read(); if (c == -1) { break; } baOS.write(c); } return new String(baOS.getBuffer(), 0, baOS.size(), encoding); } // fredt@users 20020130 - patch 497872 by Nitin Chauhan - use byte[] of exact size /** * Returns the quoted version of the string using the quotechar argument. * doublequote argument indicates whether each instance of quotechar inside * the string is doubled.

* * null string argument returns null. If the caller needs the literal * "NULL" it should created it itself

* * @param s Java string * @param quoteChar character used for quoting * @param extraQuote true if quoteChar itself should be repeated * @return String */ public static String toQuotedString(String s, char quoteChar, boolean extraQuote) { if (s == null) { return null; } int count = extraQuote ? count(s, quoteChar) : 0; int len = s.length(); char[] b = new char[2 + count + len]; int i = 0; int j = 0; b[j++] = quoteChar; for (; i < len; i++) { char c = s.charAt(i); b[j++] = c; if (extraQuote && c == quoteChar) { b[j++] = c; } } b[j] = quoteChar; return new String(b); } /** * Counts Character c in String s * * @param s Java string * @param c character to count * @return int count */ static int count(final String s, final char c) { int pos = 0; int count = 0; if (s != null) { while ((pos = s.indexOf(c, pos)) > -1) { count++; pos++; } } return count; } /** * Converts the string to an HTML representation in the ASCII character set. * * The string is treated as an SQL statement. * * @param b the byte array * @return UUID string form */ public static void stringToHtmlBytes(HsqlByteArrayOutputStream b, String s) { if (s == null) { return; } final int len = s.length(); char[] chars; if (len == 0) { return; } chars = s.toCharArray(); b.ensureRoom(len); for (int i = 0; i < len; i++) { char c = chars[i]; if (c > 0x007f || c == '"' || c == '&' || c == '<' || c == '>') { int codePoint = Character.codePointAt(chars, i); if (Character.charCount(codePoint) == 2) { i++; } b.ensureRoom(16); b.writeNoCheck('&'); b.writeNoCheck('#'); b.writeBytes(String.valueOf(codePoint)); b.writeNoCheck(';'); } else if (c < 0x0020 ) { b.writeNoCheck(' '); } else { b.writeNoCheck(c); } } } /** * Returns a string representation in UUID form from a binary string. * * UUID string is composed of 8-4-4-4-12 hexadecimal characters. * * @param b the byte array * @return UUID string form */ public static String toStringUUID(byte[] b) { char[] chars = new char[36]; int hexIndex; if (b == null) { return null; } if (b.length != 16) { throw new NumberFormatException(); } for (int i = 0, j = 0; i < b.length; ) { hexIndex = (b[i] & 0xf0) >> 4; chars[j++] = (char) HEXBYTES[hexIndex]; hexIndex = b[i] & 0xf; chars[j++] = (char) HEXBYTES[hexIndex]; i++; if (i >= 4 && i <= 10 && (i % 2) == 0) { chars[j++] = '-'; } } return new String(chars); } /** * Returns a byte[] representation in UUID form from a UUID string. * * @param s the UUID string * @return byte array */ public static byte[] toBinaryUUID(String s) { byte[] bytes = new byte[16]; if (s == null) { return null; } if (s.length() != 36) { throw new NumberFormatException(); } for (int i = 0, j = 0; i < bytes.length; ) { char c = s.charAt(j++); int high = getNibble(c); c = s.charAt(j++); bytes[i] = (byte) ((high << 4) + getNibble(c)); i++; if (i >= 4 && i <= 10 && (i % 2) == 0) { c = s.charAt(j++); if (c != '-') {} } } return bytes; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/CharArrayWriter.java0000644000175000017500000001102512007547400023416 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.IOException; import java.io.Reader; import java.io.EOFException; /** * A writer for char strings. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public class CharArrayWriter { protected char[] buffer; protected int count; public CharArrayWriter(int size) { this.buffer = new char[size]; } public CharArrayWriter(char[] buffer) { this.buffer = buffer; } public CharArrayWriter(Reader reader, int length) throws IOException { buffer = new char[length]; for (int left = length; left > 0; ) { int read = reader.read(buffer, count, left); if (read == -1) { if (left > 0) { reader.close(); throw new EOFException(); } break; } left -= read; count += read; } } public CharArrayWriter(Reader reader) throws IOException { buffer = new char[128]; for (;;) { int read = reader.read(buffer, count, buffer.length - count); if (read == -1) { break; } count += read; if (count == buffer.length) { ensureRoom(count * 2); } } } public void write(int c) { if (count == buffer.length) { ensureRoom(count + 1); } buffer[count++] = (char) c; } public int write(Reader reader, int length) throws IOException { int left = length; while (left > 0) { int read = reader.read(buffer, count, left); if (read == -1) { break; } left -= read; count += read; } return length - left; } void ensureRoom(int size) { if (size <= buffer.length) { return; } int newSize = buffer.length; while (newSize < size) { newSize *= 2; } char[] newBuffer = new char[newSize]; System.arraycopy(buffer, 0, newBuffer, 0, count); buffer = newBuffer; } public void write(String str, int off, int len) { ensureRoom(count + len); str.getChars(off, off + len, buffer, count); count += len; } public void reset() { count = 0; } public void reset(char[] buffer) { count = 0; this.buffer = buffer; } public char[] toCharArray() { char[] newBuffer = new char[count]; System.arraycopy(buffer, 0, newBuffer, 0, count); return (char[]) newBuffer; } public char[] getBuffer() { return buffer; } public int size() { return count; } /** * Converts input data to a string. * @return the string. */ public String toString() { return new String(buffer, 0, count); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/ReadWriteLockDummy.java0000644000175000017500000000467712007547400024077 0ustar renerene/* Copyright (c) 2001-2010, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; public class ReadWriteLockDummy implements ReadWriteLock { public Lock readLock() { return new LockDummy(); } public Lock writeLock() { return new LockDummy(); } public static class LockDummy implements Lock { public void lock() {} public void lockInterruptibly() throws InterruptedException {} public boolean tryLock() { return false; } public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { return false; } public void unlock() {} public Condition newCondition() { return null; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/LongDeque.java0000644000175000017500000001732012007547400022234 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; /** * A deque of long value. Implementation based on HsqlDeque class. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.9.0 */ public class LongDeque { private long[] list; private int firstindex = 0; // index of first list element private int endindex = 0; // index of last list element + 1 protected int elementCount; // can grow to fill list // if elementCount == 0 then firstindex == endindex private static final int DEFAULT_INITIAL_CAPACITY = 10; public LongDeque() { list = new long[DEFAULT_INITIAL_CAPACITY]; } public int size() { return elementCount; } public boolean isEmpty() { return elementCount == 0; } public long getFirst() throws NoSuchElementException { if (elementCount == 0) { throw new NoSuchElementException(); } return list[firstindex]; } public long getLast() throws NoSuchElementException { if (elementCount == 0) { throw new NoSuchElementException(); } return list[endindex - 1]; } public long get(int i) throws IndexOutOfBoundsException { int index = getInternalIndex(i); return list[index]; } public long removeFirst() throws NoSuchElementException { if (elementCount == 0) { throw new NoSuchElementException(); } long value = list[firstindex]; list[firstindex] = 0; firstindex++; elementCount--; if (elementCount == 0) { firstindex = endindex = 0; } else if (firstindex == list.length) { firstindex = 0; } return value; } public long removeLast() throws NoSuchElementException { if (elementCount == 0) { throw new NoSuchElementException(); } endindex--; long value = list[endindex]; list[endindex] = 0; elementCount--; if (elementCount == 0) { firstindex = endindex = 0; } else if (endindex == 0) { endindex = list.length; } return value; } public boolean add(long value) { resetCapacity(); if (endindex == list.length) { endindex = 0; } list[endindex] = value; elementCount++; endindex++; return true; } public boolean addLast(long value) { return add(value); } public boolean addFirst(long value) { resetCapacity(); firstindex--; if (firstindex < 0) { firstindex = list.length - 1; if (endindex == 0) { endindex = list.length; } } list[firstindex] = value; elementCount++; return true; } public int addAll(LongDeque deque) { int count = 0; for (int i = 0; i < deque.size(); i++) { add(deque.get(i)); count++; } return count; } public void clear() { if (elementCount == 0) { return; } firstindex = endindex = elementCount = 0; for (int i = 0; i < list.length; i++) { list[i] = 0; } } public void zeroSize() { firstindex = endindex = elementCount = 0; } public int indexOf(long value) { for (int i = 0; i < elementCount; i++) { int index = firstindex + i; if (index >= list.length) { index -= list.length; } if (list[index] == value) { return i; } } return -1; } public long remove(final int index) { int target = getInternalIndex(index); long value = list[target]; if (target == firstindex) { list[firstindex] = 0; firstindex++; if (firstindex == list.length) { firstindex = 0; } } else if (target > firstindex) { System.arraycopy(list, firstindex, list, firstindex + 1, target - firstindex); list[firstindex] = 0; firstindex++; if (firstindex == list.length) { firstindex = 0; } } else { System.arraycopy(list, target + 1, list, target, endindex - target - 1); endindex--; list[endindex] = 0; if (endindex == 0) { endindex = list.length; } } elementCount--; if (elementCount == 0) { firstindex = endindex = 0; } return value; } public boolean contains(long value) { for (int i = 0; i < elementCount; i++) { int index = firstindex + i; if (index >= list.length) { index -= list.length; } if (list[index] == value) { return true; } } return false; } public void toArray(int[] array) { for (int i = 0; i < elementCount; i++) { array[i] = (int) get(i); } } public void toArray(long[] array) { for (int i = 0; i < elementCount; i++) { array[i] = get(i); } } private int getInternalIndex(int i) throws IndexOutOfBoundsException { if (i < 0 || i >= elementCount) { throw new IndexOutOfBoundsException(); } int index = firstindex + i; if (index >= list.length) { index -= list.length; } return index; } private void resetCapacity() { if (elementCount < list.length) { return; } long[] newList = new long[list.length * 2]; System.arraycopy(list, firstindex, newList, firstindex, list.length - firstindex); if (endindex <= firstindex) { System.arraycopy(list, 0, newList, list.length, endindex); endindex = list.length + endindex; } list = newList; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/FrameworkLogger.java0000644000175000017500000005401012007547400023443 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.Enumeration; import java.util.logging.Level; import java.util.logging.ConsoleHandler; import java.util.logging.Logger; import java.util.logging.LogManager; import java.util.Map; import java.io.File; import java.io.FileInputStream; import java.util.Properties; import java.io.IOException; import java.util.HashMap; import java.util.Set; import java.util.HashSet; import java.lang.reflect.Method; /** * A logging framework wrapper that supports java.util.logging and log4j. *

* Logger hierarchies are stored at the Class level. * Log4j will be used if the Log4j system (not necessarily config files) are * found in the runtime classpath. * Otherwise, java.util.logging will be used. *

* This is pretty safe because for use cases where multiple hierarchies * are desired, classloader hierarchies will effectively isolate multiple * class-level Logger hierarchies. *

* Sad as it is, the java.util.logging facility lacks the most basic * developer-side and configuration-side capabilities. * Besides having a non-scalable discovery system, the designers didn't * comprehend the need for a level between WARNING and SEVERE! * Since we don't want to require log4j in Classpath, we have to live * with these constraints. *

* As with all the popular logging frameworks, if you want to capture a * stack trace, you must use the two-parameters logging methods. * I.e., you must also pass a String, or only toString() from your * throwable will be captured. *

* Usage example:

 * private static FrameworkLogger logger =
 *        FrameworkLogger.getLog(SqlTool.class);
 * ...
 *   logger.finer("Doing something log-worthy");
 * 
* *

* The system level property hsqldb.reconfig_logging=false is * required to avoid configuration of java.util.logging. Otherwise * configuration takes place.

* * @author Blaine Simpson (blaine dot simpson at admc dot com) * @version 2.2.8 * @since 1.9.0 */ public class FrameworkLogger { /* * FrameworkLogger coders: It would be convenient to be able to log * states and such at debug level in this class. * I tentatively think that using a logger instance early in the static * lifecycle is too risky, possibly using the underlying plumbing before * the application has had a chance to customize, and perhaps before * classloaders have been re-prioritized, etc. * Could be that it all works out ok, but make sure you consider all * situations before logging with FrameworkLogger instances here. * This is one reason why there are a couple uses of System.err below. */ /** * Utility method for integrators. * Returns a string representation of the active Logger instance keys. *

* Not named similar to 'toString' to avoid ambiguity with instance method * toString. *

*/ public static String report() { return new StringBuilder().append(loggerInstances.size()).append( " logger instances: ").append( loggerInstances.keySet()).toString(); } static private Map loggerInstances = new HashMap(); static private Map jdkToLog4jLevels = new HashMap(); static private Method log4jGetLogger; static private Method log4jLogMethod; private Object log4jLogger; private Logger jdkLogger; // No need for more than one static, since we have only one console static private boolean noopMode; // If true, then logging calls do nothing static { try { reconfigure(); } catch (java.lang.SecurityException e) {} } /** * Frees Logger(s), if any, with the specified category, or that begins with * the specified prefix + dot. *

* Note that as of today, this depends on the underlying logging framework * implementation to release the underlying Logger instances. * JUL in Sun's JVM uses weak references, so that should be fine. * Log4j as of today seems to use strong references (and no API hooks to * free anything), so this method will probably have little benefit for * Log4j. *

*/ public static synchronized void clearLoggers(String prefixToZap) { Set targetKeys = new HashSet(); java.util.Iterator it = loggerInstances.keySet().iterator(); String k; String dottedPrefix = prefixToZap + '.'; while (it.hasNext()) { k = (String) it.next(); if (k.equals(prefixToZap) || k.startsWith(dottedPrefix)) { targetKeys.add(k); } } loggerInstances.keySet().removeAll(targetKeys); } static void reconfigure() { noopMode = false; Class log4jLoggerClass = null; loggerInstances.clear(); log4jLoggerClass = null; log4jGetLogger = null; log4jLogMethod = null; try { log4jLoggerClass = Class.forName("org.apache.log4j.Logger"); } catch (Exception e) { // The class will only load successfully if Log4j thinks it is // in usable state. // Intentionally empty. } // Try log4j first so we can fall back to JUL if anything goes wrong. if (log4jLoggerClass != null) { try { if (jdkToLog4jLevels.size() < 1) { Method log4jToLevel = Class.forName( "org.apache.log4j.Level").getMethod( "toLevel", new Class[]{ String.class }); jdkToLog4jLevels.put(Level.ALL, log4jToLevel.invoke(null, new Object[]{ "ALL" })); jdkToLog4jLevels.put(Level.FINER, log4jToLevel.invoke(null, new Object[]{ "DEBUG" })); jdkToLog4jLevels.put(Level.WARNING, log4jToLevel.invoke(null, new Object[]{ "ERROR" })); jdkToLog4jLevels.put(Level.SEVERE, log4jToLevel.invoke(null, new Object[]{ "FATAL" })); jdkToLog4jLevels.put(Level.INFO, log4jToLevel.invoke(null, new Object[]{ "INFO" })); jdkToLog4jLevels.put(Level.OFF, log4jToLevel.invoke(null, new Object[]{ "OFF" })); jdkToLog4jLevels.put(Level.FINEST, log4jToLevel.invoke(null, new Object[]{ "TRACE" })); jdkToLog4jLevels.put(Level.WARNING, log4jToLevel.invoke(null, new Object[]{ "WARN" })); } log4jLogMethod = log4jLoggerClass.getMethod("log", new Class[] { String.class, Class.forName("org.apache.log4j.Priority"), Object.class, Throwable.class }); log4jGetLogger = log4jLoggerClass.getMethod("getLogger", new Class[]{ String.class }); // This last object is what we toggle on to generate either // Log4j or Jdk Logger objects (to wrap). return; // Success for Log4j } catch (Exception e) { // This is an unexpected problem, because our Log4j try block will // only be attempted if Log4j itself initialized (even if it // successfully initialized with warnings due to bad config). try { System.err.println( " failure " + "instantiating configured Log4j system: " + e); // It's possible we don't have write access to System.err. } catch (Throwable t) { // Intentionally empty. We tried our best to report problem, // but don't want to throw and prevent JUL from working. } } } log4jLoggerClass = null; log4jLogMethod = null; log4jGetLogger = null; String propVal = System.getProperty("hsqldb.reconfig_logging"); if (propVal != null && propVal.equalsIgnoreCase("false")) { return; } try { LogManager lm = LogManager.getLogManager(); if (isDefaultJdkConfig()) { lm.reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setFormatter( new BasicTextJdkLogFormatter(false)); consoleHandler.setLevel(Level.INFO); lm.readConfiguration( FrameworkLogger.class.getResourceAsStream( "/org/hsqldb/resources/jdklogging-default.properties")); Logger cmdlineLogger = Logger.getLogger("org.hsqldb.cmdline"); cmdlineLogger.addHandler(consoleHandler); cmdlineLogger.setUseParentHandlers(false); } else { // Do not intervene. Use JDK logging exactly as configured // by user. lm.readConfiguration(); // The only bad thing about doing this is that if the app // has programmatically changed the logging config after // starting the program but before using FrameworkLogger, // we will clobber those customizations. // Set sys srop 'hsqldb.reconfig_logging' to false to // prevent this. } } catch (Exception e) { noopMode = true; System.err.println( " failure initializing JDK logging system. " + "Continuing without Application logging."); e.printStackTrace(); } } /** * User may not use the constructor. */ private FrameworkLogger(String s) { if (!noopMode) { if (log4jGetLogger == null) { jdkLogger = Logger.getLogger(s); } else { try { log4jLogger = log4jGetLogger.invoke(null, new Object[]{ s }); } catch (Exception e) { throw new RuntimeException( "Failed to instantiate Log4j Logger", e); } } } loggerInstances.put(s, this); } /** * User's entry-point into this logging system. *

* You normally want to work with static (class-level) pointers to * logger instances, for performance efficiency. * See the class-level JavaDoc for a usage example. * * @see FrameworkLogger */ public static FrameworkLogger getLog(Class c) { return getLog(c.getName()); } /** * This method just defers to the getLog(Class) method unless default * (no local configuration) JDK logging is being used; * In that case, this method assures that the returned logger has an * associated FileHander using the supplied String identifier. */ public static FrameworkLogger getLog(Class c, String contextId) { return (contextId == null) ? getLog(c) : getLog(contextId + '.' + c.getName()); } /** * This method just defers to the getLog(String) method unless default * (no local configuration) JDK logging is being used; * In that case, this method assures that the returned logger has an * associated FileHander using the supplied String identifier. */ public static FrameworkLogger getLog(String baseId, String contextId) { return (contextId == null) ? getLog(baseId) : getLog(contextId + '.' + baseId); } /** * Alternative entry-point into this logging system, for cases where * you want to share a single logger instance among multiple classes, * or you want to use multiple logger instances from a single class. * * @see #getLog(Class) */ public static FrameworkLogger getLog(String s) { if (loggerInstances.containsKey(s)) { return (FrameworkLogger) loggerInstances.get(s); } return new FrameworkLogger(s); } /** * Just like FrameworkLogger.log(Level, String), * but also logs a stack trace. * * @param level java.util.logging.Level level to filter and log at * @param message Message to be logged * @param t Throwable whose stack trace will be logged. * @see #log(Level, String) * @see Logger#log(Level, String) * @see Level */ public void log(Level level, String message, Throwable t) { privlog(level, message, t, 2, FrameworkLogger.class); } /** * The "priv" prefix is historical. * This is for special usage when you need to modify the reported call * stack. * If you don't know that you want to do this, then you should not use * this method. */ public void privlog(Level level, String message, Throwable t, int revertMethods, Class skipClass) { if (noopMode) { return; } if (log4jLogger == null) { StackTraceElement elements[] = new Throwable().getStackTrace(); String c = elements[revertMethods].getClassName(); String m = elements[revertMethods].getMethodName(); if (t == null) { jdkLogger.logp(level, c, m, message); } else { jdkLogger.logp(level, c, m, message, t); } } else { try { log4jLogMethod.invoke(log4jLogger, new Object[] { skipClass.getName(), jdkToLog4jLevels.get(level), message, t }); } catch (Exception e) { throw new RuntimeException( "Logging failed when attempting to log: " + message, e); } } } public void enduserlog(Level level, String message) { /* This method is SqlTool-specific, which is where this class began at. * Need to move this back there, but it needs access to the logging * structures private to this class. Thinking... */ if (noopMode) { return; } if (log4jLogger == null) { String c = FrameworkLogger.class.getName(); String m = "\\l"; jdkLogger.logp(level, c, m, message); } else { try { log4jLogMethod.invoke(log4jLogger, new Object[] { FrameworkLogger.class.getName(), jdkToLog4jLevels.get(level), message, null }); // Test where SqlFile correct here. } catch (Exception e) { throw new RuntimeException( "Logging failed when attempting to log: " + message, e); } } } // Wrappers /** * @param level java.util.logging.Level level to filter and log at * @param message Message to be logged * @see Logger#log(Level, String) * @see Level */ public void log(Level level, String message) { privlog(level, message, null, 2, FrameworkLogger.class); } /** * @param message Message to be logged * @see Logger#finer(String) */ public void finer(String message) { privlog(Level.FINER, message, null, 2, FrameworkLogger.class); } /** * @param message Message to be logged * @see Logger#warning(String) */ public void warning(String message) { privlog(Level.WARNING, message, null, 2, FrameworkLogger.class); } /** * @param message Message to be logged * @see Logger#severe(String) */ public void severe(String message) { privlog(Level.SEVERE, message, null, 2, FrameworkLogger.class); } /** * @param message Message to be logged * @see Logger#info(String) */ public void info(String message) { privlog(Level.INFO, message, null, 2, FrameworkLogger.class); } /** * @param message Message to be logged * @see Logger#finest(String) */ public void finest(String message) { privlog(Level.FINEST, message, null, 2, FrameworkLogger.class); } /** * This is just a wrapper for FrameworkLogger.warning(), because * java.util.logging lacks a method for this critical purpose. * * @param message Message to be logged * @see #warning(String) */ public void error(String message) { privlog(Level.WARNING, message, null, 2, FrameworkLogger.class); } /** * Just like FrameworkLogger.finer(String), but also logs a stack trace. * * @param t Throwable whose stack trace will be logged. * @see #finer(String) */ public void finer(String message, Throwable t) { privlog(Level.FINER, message, t, 2, FrameworkLogger.class); } /** * Just like FrameworkLogger.warning(String), but also logs a stack trace. * * @param t Throwable whose stack trace will be logged. * @see #warning(String) */ public void warning(String message, Throwable t) { privlog(Level.WARNING, message, t, 2, FrameworkLogger.class); } /** * Just like FrameworkLogger.severe(String), but also logs a stack trace. * * @param t Throwable whose stack trace will be logged. * @see #severe(String) */ public void severe(String message, Throwable t) { privlog(Level.SEVERE, message, t, 2, FrameworkLogger.class); } /** * Just like FrameworkLogger.info(String), but also logs a stack trace. * * @param t Throwable whose stack trace will be logged. * @see #info(String) */ public void info(String message, Throwable t) { privlog(Level.INFO, message, t, 2, FrameworkLogger.class); } /** * Just like FrameworkLogger.finest(String), but also logs a stack trace. * * @param t Throwable whose stack trace will be logged. * @see #finest(String) */ public void finest(String message, Throwable t) { privlog(Level.FINEST, message, t, 2, FrameworkLogger.class); } /** * Just like FrameworkLogger.error(String), but also logs a stack trace. * * @param t Throwable whose stack trace will be logged. * @see #error(String) */ public void error(String message, Throwable t) { privlog(Level.WARNING, message, t, 2, FrameworkLogger.class); } /** * Whether this JVM is configured with java.util.logging defaults. * * If the JRE-provided config file is not in the expected place, then * we return false. */ public static boolean isDefaultJdkConfig() { File globalCfgFile = new File(System.getProperty("java.home"), "lib/logging.properties"); if (!globalCfgFile.isFile()) { return false; } FileInputStream fis = null; LogManager lm = LogManager.getLogManager(); try { fis = new FileInputStream(globalCfgFile); Properties defaultProps = new Properties(); defaultProps.load(fis); Enumeration names = defaultProps.propertyNames(); int i = 0; String name; String liveVal; while (names.hasMoreElements()) { i++; name = (String) names.nextElement(); liveVal = lm.getProperty(name); if (liveVal == null) { return false; } if (!lm.getProperty(name).equals(liveVal)) { return false; } } return true; } catch (IOException ioe) { return false; } finally { if (fis != null) { try { fis.close(); } catch (IOException ioe) { // Intentional no-op } } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HsqlArrayHeap.java0000644000175000017500000002131412007547400023053 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.Comparator; /** * An HsqlHeap implementation backed by an array of objects and an * {@link ObjectComparator ObjectComparator}. This implementation * is non-blocking, dynamically resizing and thread-safe. * * @author boucherb@users * @version 1.9.0 * @since 1.7.2 */ public class HsqlArrayHeap implements HsqlHeap { // --------------------------------- members ----------------------------------- protected Comparator oc; protected int count; protected Object[] heap; // ------------------------------ constructors --------------------------------- /** * Creates a new HsqlArrayHeap with the given initial capacity, using * the specified ObjectComparator to maintain the heap invariant. * * @exception IllegalArgumentException if capacity less or equal to zero * or comparator is null */ public HsqlArrayHeap(int capacity, Comparator comparator) throws IllegalArgumentException { if (capacity <= 0) { throw new IllegalArgumentException("" + capacity); } if (comparator == null) { throw new IllegalArgumentException("null comparator"); } heap = new Object[capacity]; oc = comparator; } // /** Copy constructor (optional) */ // public HsqlArrayHeap(HsqlArrayHeap other) { // count = other.count; // oc = other.oc; // heap = new Object[count]; // System.arraycopy(other.heap,0, heap, 0, count); // } // -------------------------- interface Implementation ------------------------- public synchronized void clear() { for (int i = 0; i < count; ++i) { heap[i] = null; } count = 0; } public synchronized void add(Object o) throws IllegalArgumentException, RuntimeException { int ci; // current index int pi; // parent index if (o == null) { throw new IllegalArgumentException("null element"); } if (isFull()) { throw new RuntimeException("full"); } if (count >= heap.length) { increaseCapacity(); } ci = count; count++; do { if (ci <= 0) { break; } pi = (ci - 1) >> 1; try { if (oc.compare(o, heap[pi]) >= 0) { break; } } catch (Exception e) { throw new IllegalArgumentException(e.toString()); } heap[ci] = heap[pi]; ci = pi; } while (true); heap[ci] = o; } public synchronized boolean isEmpty() { return count == 0; } public synchronized boolean isFull() { // almost impossible for this to happen return count == Integer.MAX_VALUE; } public synchronized Object peek() { return heap[0]; } public synchronized Object remove() { int ci; // current index int li; // left index int ri; // right index int chi; // child index Object co; Object ro; if (count == 0) { return null; } ci = 0; ro = heap[ci]; count--; if (count == 0) { heap[0] = null; return ro; } co = heap[count]; heap[count] = null; do { li = (ci << 1) + 1; if (li >= count) { break; } ri = (ci << 1) + 2; chi = (ri >= count || oc.compare(heap[li], heap[ri]) < 0) ? li : ri; if (oc.compare(co, heap[chi]) <= 0) { break; } heap[ci] = heap[chi]; ci = chi; } while (true); heap[ci] = co; return ro; } public synchronized int size() { return count; } // ------------- standard object and collection methods (optional) ------------- // public synchronized Object clone() throws CloneNotSupportedException { // return new HsqlArrayHeap(this); // } // // public synchronized java.util.Enumeration elements() { // // Object[] elements; // // elements = new Object[count]; // // System.arraycopy(heap, 0, elements, 0, count); // // return new HsqlEnumeration(elements); // } // // public synchronized boolean equals(Object o) { // // HsqlArrayHeap other; // HsqlArrayHeap thiscopy; // HsqlArrayHeap othercopy; // // if (this == o) { // return true; // } // // if (!(o instanceof HsqlArrayHeap)) { // return false; // } // // other = (HsqlArrayHeap) o; // // if (count != other.size()) { // return false; // } // // // this is a bit "iffy"... non-equal comparators _might_ still // // be _equivalent_ under current element content... // // if (!oc.equals(other.oc)) { // return false; // } // // thiscopy = new HsqlArrayHeap(this); // othercopy = new HsqlArrayHeap(other); // // while(!thiscopy.isEmpty()) { // if (!thiscopy.remove().equals(othercopy.remove())) { // return false; // } // } // // return true; // } // // public synchronized Object[] toArray(Object a[]) { // // if (a == null) { // a = new Object[count]; // } else if ( a.length < count) { // a = (Object[]) java.lang.reflect.Array.newInstance( // a.getClass().getComponentType(), count); // } // // System.arraycopy(heap, 0, a, 0, count); // // for (int i = count; i < a.length; i++) { // a[i] = null; // } // // return a; // } // public synchronized String toString() { StringBuffer sb = new StringBuffer(); sb.append(super.toString()); sb.append(" : size="); sb.append(count); sb.append(' '); sb.append('['); for (int i = 0; i < count; i++) { sb.append(heap[i]); if (i + 1 < count) { sb.append(','); sb.append(' '); } } sb.append(']'); return sb.toString(); } // // public void trim() { // // Object[] oldheap; // // oldheap = heap; // // heap = new Object[count == 0 ? 16 : count]; // // System.arraycopy(oldheap, 0, heap, 0, count); // } // -------------------- internal implementation methods ------------------------ private void increaseCapacity() { Object[] oldheap; // no handling of boundary conditions. // In the highly unlikely event of a rollover, // in theory, an exception will be thrown (negative array index in // array allocation?) oldheap = heap; // as per java collections, v.s. JDK 1.1 java util. heap = new Object[3 * heap.length / 2 + 1]; System.arraycopy(oldheap, 0, heap, 0, count); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HsqlList.java0000644000175000017500000000415412007547400022115 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; /** * This should be used as the datatype for parameters and instance variables * instead of HsqlArrayList or HsqlLinkedList to allow interchangable use of the * two. * * @author dnordahl@users * @version 1.7.2 * @since 1.7.2 */ public interface HsqlList extends Collection { void add(int index, Object element); boolean add(Object element); Object get(int index); Object remove(int index); Object set(int index, Object element); boolean isEmpty(); int size(); Iterator iterator(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HsqlTaskQueue.java0000644000175000017500000001134112007547400023105 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; /** * Provides very simple queued execution of Runnable objects in a background * thread. The underlying queue is an HsqlDeque instance, an array-based * circular queue implementation with automatic capacity expansion. * * @author boucherb@users * @version 2.0.1 * @since 1.7.2 */ public class HsqlTaskQueue { /** The thread used to process commands */ protected Thread taskRunnerThread; /** Special queue element to signal termination */ protected static final Runnable SHUTDOWNTASK = new Runnable() { public void run() {} }; /** * true if thread should shut down after processing current task. * * Once set true, stays true forever */ protected volatile boolean isShutdown; public synchronized Thread getTaskRunnerThread() { return taskRunnerThread; } protected synchronized void clearThread() { try { taskRunnerThread.setContextClassLoader(null); } catch (Throwable t) {} taskRunnerThread = null; } protected final HsqlDeque queue = new HsqlDeque(); protected class TaskRunner implements Runnable { public void run() { Runnable task; try { while (!isShutdown) { synchronized (queue) { task = (Runnable) queue.getFirst(); } if (task == SHUTDOWNTASK) { isShutdown = true; synchronized (queue) { queue.clear(); } break; } else if (task != null) { task.run(); task = null; } else { break; } } } finally { clearThread(); } } } protected final TaskRunner taskRunner = new TaskRunner(); public HsqlTaskQueue() {} public boolean isShutdown() { return isShutdown; } public synchronized void restart() { if (taskRunnerThread == null && !isShutdown) { taskRunnerThread = new Thread(taskRunner); taskRunnerThread.start(); } } public void execute(Runnable command) throws RuntimeException { if (!isShutdown) { synchronized (queue) { queue.addLast(command); } restart(); } } public synchronized void shutdownAfterQueued() { if (!isShutdown) { synchronized (queue) { queue.addLast(SHUTDOWNTASK); } } } public synchronized void shutdownAfterCurrent() { isShutdown = true; synchronized (queue) { queue.clear(); queue.addLast(SHUTDOWNTASK); } } public synchronized void shutdownImmediately() { isShutdown = true; if (taskRunnerThread != null) { taskRunnerThread.interrupt(); } synchronized (queue) { queue.clear(); queue.addLast(SHUTDOWNTASK); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/OrderedIntHashSet.java0000644000175000017500000000776612007547400023705 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import org.hsqldb.store.BaseHashMap; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.9.0 */ public class OrderedIntHashSet extends BaseHashMap { public OrderedIntHashSet() { this(8); } public OrderedIntHashSet(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.intKeyOrValue, BaseHashMap.noKeyOrValue, false); isList = true; } public boolean contains(int key) { return super.containsKey(key); } public boolean add(int key) { int oldSize = size(); super.addOrRemove(key, 0, null, null, false); return oldSize != size(); } public boolean remove(int key) { int oldSize = size(); super.addOrRemove(key, 0, null, null, true); boolean result = oldSize != size(); if (result) { int[] array = toArray(); super.clear(); for (int i = 0; i < array.length; i++) { add(array[i]); } } return result; } public int get(int index) { checkRange(index); return intKeyTable[index]; } public int getIndex(int value) { return getLookup(value); } public int getStartMatchCount(int[] array) { int i = 0; for (; i < array.length; i++) { if (!super.containsKey(array[i])) { break; } } return i; } public int getOrderedStartMatchCount(int[] array) { int i = 0; for (; i < array.length; i++) { if (i >= size() || get(i) != array[i]) { break; } } return i; } public boolean addAll(Collection col) { int oldSize = size(); Iterator it = col.iterator(); while (it.hasNext()) { add(it.nextInt()); } return oldSize != size(); } public int[] toArray() { int lookup = -1; int[] array = new int[size()]; for (int i = 0; i < array.length; i++) { lookup = super.nextLookup(lookup); int value = intKeyTable[lookup]; array[i] = value; } return array; } private void checkRange(int i) { if (i < 0 || i >= size()) { throw new IndexOutOfBoundsException(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/CountdownInputStream.java0000644000175000017500000001011212007547402024517 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.IOException; import java.io.InputStream; // fredt@users - 1.9.0 corrected read(byte[], int, int) /** * Counts down from a specified value the number of bytes actually read * from the wrapped InputStream.

* * Returns minus one (-1) early from readXXX methods if the count * down reaches zero (0) before the end of the wrapped InputStream * is encountered.

* * This class is especially useful when a fixed number of bytes is to be read * from an InputStream that is in turn to be used as the source for an * {@link java.io.InputStreamReader InputStreamReader}. * * @author boucherb@users * @version 2.1.1 * @since 1.9.0 */ public final class CountdownInputStream extends InputStream { private long m_count; private InputStream m_input; public CountdownInputStream(final InputStream is) { m_input = is; } public int read() throws IOException { if (m_count <= 0) { return -1; } final int b = m_input.read(); if (b >= 0) { m_count--; } return b; } public int read(final byte[] buf) throws IOException { if (buf == null) { throw new NullPointerException(); } if (m_count <= 0) { return -1; } int len = buf.length; if (len > m_count) { len = (int) m_count; } final int r = m_input.read(buf, 0, len); if (r > 0) { m_count -= r; } return r; } public int read(final byte[] buf, final int off, int len) throws IOException { if (buf == null) { throw new NullPointerException(); } if (m_count <= 0) { return -1; } if (len > m_count) { len = (int) m_count; } final int r = m_input.read(buf, off, len); if (r > 0) { m_count -= r; } return r; } public void close() throws IOException { m_input.close(); } public int available() throws IOException { return Math.min(m_input.available(), (int) Math.min(Integer.MAX_VALUE, m_count)); } public long skip(long count) throws IOException { return (count <= 0) ? 0 : m_input.skip(Math.min(m_count, count)); } public long getCount() { return m_count; } public void setCount(long count) { m_count = count; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/BasicTextJdkLogFormatter.java0000644000175000017500000000626712007547400025226 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.StringWriter; import java.io.PrintWriter; import java.util.logging.Formatter; import java.util.logging.LogRecord; import java.text.SimpleDateFormat; import java.util.Date; /** * An implementation of java.util.logging.Formatter very close to * SimpleFormatter. * * The features here are optional timestamping, sortable numeric time stamp * text, and no indication of invoking source code location (logger ID, * class name, method name, etc.). * * @see Formatter * @see SimpleFormatter * @author Blaine Simpson (blaine dot simpson at admc dot com) */ public class BasicTextJdkLogFormatter extends Formatter { protected boolean withTime = true; public static String LS = System.getProperty("line.separator"); protected SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); public BasicTextJdkLogFormatter(boolean withTime) { this.withTime = withTime; } public BasicTextJdkLogFormatter() { // Intentionally empty } public String format(LogRecord record) { StringBuilder sb = new StringBuilder(); if (withTime) { sb.append(sdf.format(new Date(record.getMillis())) + " "); } sb.append(record.getLevel() + " " + formatMessage(record)); if (record.getThrown() != null) { StringWriter sw = new StringWriter(); record.getThrown().printStackTrace(new PrintWriter(sw)); sb.append(LS + sw); } return sb.toString() + LS; // This uses platform-specific line-separator, the same as // SimpleLogger does. } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HsqlArrayList.java0000644000175000017500000002627412007547400023123 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.lang.reflect.Array; import java.util.Comparator; // fredt@users - 1.8.0, 1.9.0 - enhancements /** * Intended as an asynchronous alternative to Vector. Use HsqlLinkedList * instead if it's better suited. * * @author dnordahl@users * @version 1.9.0 * @since 1.7.0 */ public class HsqlArrayList extends BaseList implements HsqlList { //fredt@users /* private static Reporter reporter = new Reporter(); private static class Reporter { private static int initCounter = 0; private static int updateCounter = 0; Reporter() { try { System.runFinalizersOnExit(true); } catch (SecurityException e) {} } protected void finalize() { System.out.println("HsqlArrayList init count: " + initCounter); System.out.println("HsqlArrayList update count: " + updateCounter); } } */ private static final int DEFAULT_INITIAL_CAPACITY = 8; private static final float DEFAULT_RESIZE_FACTOR = 2.0f; Object[] elementData; Object[] reserveElementData; private boolean minimizeOnClear; public HsqlArrayList(Object[] data, int count) { elementData = data; elementCount = count; } /** Creates a new instance of HsqlArrayList */ public HsqlArrayList() { // reporter.initCounter++; elementData = new Object[DEFAULT_INITIAL_CAPACITY]; } /** * Creates a new instance of HsqlArrayList that minimizes the size when * empty */ public HsqlArrayList(int initialCapacity, boolean minimize) { // reporter.initCounter++; if (initialCapacity < DEFAULT_INITIAL_CAPACITY) { initialCapacity = DEFAULT_INITIAL_CAPACITY; } elementData = new Object[initialCapacity]; minimizeOnClear = minimize; } /** Creates a new instance with the given initial capacity */ public HsqlArrayList(int initialCapacity) { // reporter.initCounter++; if (initialCapacity < 0) { throw new NegativeArraySizeException( "Invalid initial capacity given"); } if (initialCapacity < DEFAULT_INITIAL_CAPACITY) { initialCapacity = DEFAULT_INITIAL_CAPACITY; } elementData = new Object[initialCapacity]; } /** Inserts an element at the given index */ public void add(int index, Object element) { // reporter.updateCounter++; if (index > elementCount) { throw new IndexOutOfBoundsException("Index out of bounds: " + index + ">" + elementCount); } if (index < 0) { throw new IndexOutOfBoundsException("Index out of bounds: " + index + " < 0"); } if (elementCount >= elementData.length) { increaseCapacity(); } for (int i = elementCount; i > index; i--) { elementData[i] = elementData[i - 1]; } elementData[index] = element; elementCount++; } /** Appends an element to the end of the list */ public boolean add(Object element) { // reporter.updateCounter++; if (elementCount >= elementData.length) { increaseCapacity(); } elementData[elementCount] = element; elementCount++; return true; } /** Gets the element at given position */ public Object get(int index) { if (index >= elementCount) { throw new IndexOutOfBoundsException("Index out of bounds: " + index + " >= " + elementCount); } if (index < 0) { throw new IndexOutOfBoundsException("Index out of bounds: " + index + " < 0"); } return elementData[index]; } /** returns the index of given object or -1 if not found */ public int indexOf(Object o) { if (o == null) { for (int i = 0; i < elementCount; i++) { if (elementData[i] == null) { return i; } } return -1; } for (int i = 0; i < elementCount; i++) { if (o.equals(elementData[i])) { return i; } } return -1; } /** Removes and returns the element at given position */ public Object remove(int index) { if (index >= elementCount) { throw new IndexOutOfBoundsException("Index out of bounds: " + index + " >= " + elementCount); } if (index < 0) { throw new IndexOutOfBoundsException("Index out of bounds: " + index + " < 0"); } Object removedObj = elementData[index]; for (int i = index; i < elementCount - 1; i++) { elementData[i] = elementData[i + 1]; } elementCount--; elementData[elementCount] = null; if (elementCount == 0) { clear(); } return removedObj; } /** Replaces the element at given position */ public Object set(int index, Object element) { if (index >= elementCount) { throw new IndexOutOfBoundsException("Index out of bounds: " + index + " >= " + elementCount); } if (index < 0) { throw new IndexOutOfBoundsException("Index out of bounds: " + index + " < 0"); } Object replacedObj = elementData[index]; elementData[index] = element; return replacedObj; } /** Returns the number of elements in the array list */ public final int size() { return elementCount; } private void increaseCapacity() { int baseSize = elementData.length == 0 ? 1 : elementData.length; baseSize = (int) (baseSize * DEFAULT_RESIZE_FACTOR); resize(baseSize); } private void resize(int baseSize) { if (baseSize == elementData.length) { return; } Object[] newArray = (Object[]) Array.newInstance( elementData.getClass().getComponentType(), baseSize); int count = elementData.length > newArray.length ? newArray.length : elementData.length; System.arraycopy(elementData, 0, newArray, 0, count); if (minimizeOnClear && reserveElementData == null) { ArrayUtil.clearArray(ArrayUtil.CLASS_CODE_OBJECT, elementData, 0, elementData.length); reserveElementData = elementData; } elementData = newArray; } /** Trims the array to be the same size as the number of elements. */ public void trim() { // 0 size array is possible resize(elementCount); } // fredt@users public void clear() { if (minimizeOnClear && reserveElementData != null) { elementData = reserveElementData; reserveElementData = null; elementCount = 0; return; } for (int i = 0; i < elementCount; i++) { elementData[i] = null; } elementCount = 0; } /** * Increase or reduce the size, setting discarded or added elements to null. */ public void setSize(int newSize) { if (newSize == 0) { clear(); return; } if (newSize <= elementCount) { for (int i = newSize; i < elementCount; i++) { elementData[i] = null; } elementCount = newSize; return; } for (; newSize > elementData.length; ) { increaseCapacity(); } elementCount = newSize; } // fredt@users public Object[] toArray() { Object[] newArray = (Object[]) Array.newInstance( elementData.getClass().getComponentType(), elementCount); System.arraycopy(elementData, 0, newArray, 0, elementCount); return newArray; } public Object[] toArray(int start, int limit) { Object[] newArray = (Object[]) Array.newInstance( elementData.getClass().getComponentType(), limit - start); System.arraycopy(elementData, start, newArray, 0, limit - start); return newArray; } /** * Copies all elements of the list to a[]. It is assumed a[] is of the * correct type. If a[] is too small, a new array or the same type is * returned. If a[] is larger, only the list elements are copied and no * other change is made to the array. * Differs from the implementation in java.util.ArrayList in the second * aspect. */ public Object toArray(Object a) { if (Array.getLength(a) < elementCount) { a = Array.newInstance(a.getClass().getComponentType(), elementCount); } System.arraycopy(elementData, 0, a, 0, elementCount); return a; } public void sort(Comparator c) { if (elementCount < 2) { return; } ArraySort.sort(elementData, 0, elementCount, c); } public Object[] getArray() { return elementData; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/HsqlHeap.java0000644000175000017500000000721112007547400022054 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; /** * Provides the base HSQLDB interface for Heap ADT implementations.

* * In this context, a Heap is simply a collection-like ADT that allows addition * of elements and provides a way to remove the least element, given some * implementation-dependent strategy for imposing an order over its * elements.

* * Typically, an HsqlHeap will be implemented as a tree-like structure that * recursively guarantees a Heap Invariant, such that all nodes below * the root are greater than the root, given some comparison stragegy.

* This in turn provides the basis for an efficient implementation of ADTs such * PriorityQueue, since Heap operations using the typical implementation are, * in theory, guaranteed to be O(log n). * * @author boucherb@users * @version 1.7.2 * @since 1.7.2 */ public interface HsqlHeap { /** * Removes all of the elements from this Heap. */ void clear(); /** * Retrieves whether this Heap is empty. */ boolean isEmpty(); /** * Retrieves whether this Heap is full. */ boolean isFull(); /** * Adds the specified element to this Heap. * * @param o The element to add * @throws IllegalArgumentException if the implementation does * not accept elements of the supplied type (optional) * throws RuntimeException if the implementation * dictates that this Heap is not currently accepting additions * or that this Heap is currently full (optional) */ void add(Object o) throws IllegalArgumentException, RuntimeException; /** * Retrieves the least element from this Heap, without removing it. * * @return the least element from this Heap */ Object peek(); /** * Retrieves the least element from this Heap, removing it in the process. * * @return the least element from this Heap */ Object remove(); /** * Retrieves the number of elements currently in this Heap. * * @return the number of elements currently in this Heap */ int size(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/WrapperIterator.java0000644000175000017500000001330212007547402023501 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; /** * An Iterator that returns the elements of a specified array, or other * iterators etc. The collection of objects returned depends on the * constructor used.

* * Based on similar Enumerator code by boucherb@users * * @author fred@users * @version 1.9.0 * @since HSQLDB 1.7.2 */ public class WrapperIterator implements Iterator { private static final Object[] emptyelements = new Object[0]; private Object[] elements; private int i; // chained iterators private boolean chained; private Iterator it1; private Iterator it2; /** return only not null elements */ private boolean notNull; /** * Constructor for an empty iterator.

*/ public WrapperIterator() { this.elements = emptyelements; } /** * Constructor for all elements of the specified array.

* * @param elements the array of objects to enumerate */ public WrapperIterator(Object[] elements) { this.elements = elements; } /** * Constructor for not-null elements of specified array.

* * @param elements the array of objects to iterate */ public WrapperIterator(Object[] elements, boolean notNull) { this.elements = elements; this.notNull = notNull; } /** * Constructor for a singleton object iterator * * @param element the single object to iterate */ public WrapperIterator(Object element) { this.elements = new Object[]{ element }; } /** * Constructor for a chained iterator that returns the elements of the two * specified iterators. */ public WrapperIterator(Iterator it1, Iterator it2) { this.it1 = it1; this.it2 = it2; chained = true; } /** * Tests if this iterator contains more elements.

* * @return true if this iterator contains more elements; * false otherwise. */ public boolean hasNext() { // for chained iterators if (chained) { if (it1 == null) { if (it2 == null) { return false; } if (it2.hasNext()) { return true; } it2 = null; return false; } else { if (it1.hasNext()) { return true; } it1 = null; return hasNext(); } } // for other interators if (elements == null) { return false; } for (; notNull && i < elements.length && elements[i] == null; i++) {} if (i < elements.length) { return true; } else { // release elements for garbage collection elements = null; return false; } } /** * Returns the next element. * * @return the next element * @throws NoSuchElementException if there is no next element */ public Object next() { // for chained iterators if (chained) { if (it1 == null) { if (it2 == null) { throw new NoSuchElementException(); } if (it2.hasNext()) { return it2.next(); } it2 = null; next(); } else { if (it1.hasNext()) { return it1.next(); } it1 = null; next(); } } // for other itertors if (hasNext()) { return elements[i++]; } throw new NoSuchElementException(); } public int nextInt() { throw new NoSuchElementException(); } public long nextLong() { throw new NoSuchElementException(); } public void remove() { throw new NoSuchElementException(); } public void setValue(Object value) { throw new NoSuchElementException(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/OrderedLongHashSet.java0000644000175000017500000001001012007547400024022 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import org.hsqldb.store.BaseHashMap; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public class OrderedLongHashSet extends BaseHashMap { public OrderedLongHashSet() { this(8); } public OrderedLongHashSet(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.longKeyOrValue, BaseHashMap.noKeyOrValue, false); isList = true; } public boolean contains(long key) { return super.containsKey(key); } public boolean add(long key) { int oldSize = size(); super.addOrRemove(key, 0, null, null, false); return oldSize != size(); } public boolean remove(long key) { int oldSize = size(); super.addOrRemove(key, 0, null, null, true); boolean result = oldSize != size(); if (result) { long[] array = toArray(); super.clear(); for (int i = 0; i < array.length; i++) { add(array[i]); } } return result; } public long get(int index) { checkRange(index); return longKeyTable[index]; } public int getIndex(long value) { return getLookup(value); } public int getStartMatchCount(long[] array) { int i = 0; for (; i < array.length; i++) { if (!super.containsKey(array[i])) { break; } } return i; } public int getOrderedStartMatchCount(long[] array) { int i = 0; for (; i < array.length; i++) { if (i >= size() || get(i) != array[i]) { break; } } return i; } public boolean addAll(Collection col) { int oldSize = size(); Iterator it = col.iterator(); while (it.hasNext()) { add(it.nextLong()); } return oldSize != size(); } public long[] toArray() { int lookup = -1; long[] array = new long[size()]; for (int i = 0; i < array.length; i++) { lookup = super.nextLookup(lookup); long value = intKeyTable[lookup]; array[i] = value; } return array; } private void checkRange(int i) { if (i < 0 || i >= size()) { throw new IndexOutOfBoundsException(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/LongValueHashMap.java0000644000175000017500000001270312007547402023511 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; import org.hsqldb.store.BaseHashMap; /** * This class does not store null keys. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.9.0 */ public class LongValueHashMap extends BaseHashMap { Set keySet; public LongValueHashMap() { this(8); } public LongValueHashMap(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.objectKeyOrValue, BaseHashMap.longKeyOrValue, false); } public long get(Object key) throws NoSuchElementException { if (key == null) { throw new NoSuchElementException(); } int hash = key.hashCode(); int lookup = getLookup(key, hash); if (lookup != -1) { return longValueTable[lookup]; } throw new NoSuchElementException(); } public long get(Object key, int defaultValue) { if (key == null) { throw new NoSuchElementException(); } int hash = key.hashCode(); int lookup = getLookup(key, hash); if (lookup != -1) { return longValueTable[lookup]; } return defaultValue; } public boolean get(Object key, long[] value) { if (key == null) { throw new NoSuchElementException(); } int hash = key.hashCode(); int lookup = getLookup(key, hash); if (lookup != -1) { value[0] = longValueTable[lookup]; return true; } return false; } public Object getKey(long value) { BaseHashIterator it = new BaseHashIterator(false); while (it.hasNext()) { long i = it.nextLong(); if (i == value) { return objectKeyTable[it.getLookup()]; } } return null; } public boolean put(Object key, long value) { if (key == null) { throw new NoSuchElementException(); } int oldSize = size(); super.addOrRemove(0, value, key, null, false); return oldSize != size(); } public boolean remove(Object key) { int oldSize = size(); super.addOrRemove(0, 0, key, null, true); return oldSize != size(); } public boolean containsKey(Object key) { return super.containsKey(key); } public Set keySet() { if (keySet == null) { keySet = new KeySet(); } return keySet; } class KeySet implements Set { public Iterator iterator() { return LongValueHashMap.this.new BaseHashIterator(true); } public int size() { return LongValueHashMap.this.size(); } public boolean contains(Object o) { return containsKey(o); } public Object get(Object key) { int lookup = LongValueHashMap.this.getLookup(key, key.hashCode()); if (lookup < 0) { return null; } else { return LongValueHashMap.this.objectKeyTable[lookup]; } } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { int oldSize = size(); LongValueHashMap.this.remove(o); return size() != oldSize; } public boolean isEmpty() { return size() == 0; } public void clear() { LongValueHashMap.this.clear(); } } public void putAll(LongValueHashMap t) { Iterator it = t.keySet().iterator(); while (it.hasNext()) { Object key = it.next(); put(key, t.get(key)); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/StringUtil.java0000644000175000017500000002763312007547400022465 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.lang.reflect.Array; /** Provides a collection of convenience methods for processing and * creating objects with String value components. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.7.0 */ public class StringUtil { /** * If necessary, adds zeros to the beginning of a value so that the total * length matches the given precision, otherwise trims the right digits. * Then if maxSize is smaller than precision, trims the right digits to * maxSize. Negative values are treated as positive */ public static String toZeroPaddedString(long value, int precision, int maxSize) { StringBuffer sb = new StringBuffer(); if (value < 0) { value = -value; } String s = Long.toString(value); if (s.length() > precision) { s = s.substring(precision); } for (int i = s.length(); i < precision; i++) { sb.append('0'); } sb.append(s); if (maxSize < precision) { sb.setLength(maxSize); } return sb.toString(); } public static String toPaddedString(String source, int length, char pad, boolean trailing) { int len = source.length(); if (len >= length) { return source; } StringBuffer sb = new StringBuffer(length); if (trailing) { sb.append(source); } for (int i = len; i < length; i++) { sb.append(pad); } if (!trailing) { sb.append(source); } return sb.toString(); } public static String toPaddedString(String source, int length, String pad, boolean trailing) { int len = source.length(); if (len == length) { return source; } if (len > length) { if (trailing) { return source.substring(0, length); } else { return source.substring(len - length, len); } } StringBuffer sb = new StringBuffer(length); int padLength = source.length(); int partLength = (length - padLength) % pad.length(); if (trailing) { sb.append(source); sb.append(pad.substring(pad.length() - partLength, pad.length())); } for (; padLength + pad.length() <= length; padLength += pad.length()) { sb.append(pad); } if (!trailing) { sb.append(pad.substring(0, partLength)); sb.append(source); } return sb.toString(); } /** * Returns a string with non alphanumeric chars converted to the * substitute character. A digit first character is also converted. * By sqlbob@users * @param source string to convert * @param substitute character to use * @return converted string */ public static String toLowerSubset(String source, char substitute) { int len = source.length(); StringBuffer sb = new StringBuffer(len); char ch; for (int i = 0; i < len; i++) { ch = source.charAt(i); if (!Character.isLetterOrDigit(ch)) { sb.append(substitute); } else if ((i == 0) && Character.isDigit(ch)) { sb.append(substitute); } else { sb.append(Character.toLowerCase(ch)); } } return sb.toString(); } /** * Builds a bracketed CSV list from the array * @param array an array of Objects * @return string */ public static String arrayToString(Object array) { int len = Array.getLength(array); int last = len - 1; StringBuffer sb = new StringBuffer(2 * (len + 1)); sb.append('{'); for (int i = 0; i < len; i++) { sb.append(Array.get(array, i)); if (i != last) { sb.append(','); } } sb.append('}'); return sb.toString(); } /** * Builds a CSV list from the specified String[], separator string and * quote string.

* *

    *
  • All arguments are assumed to be non-null. *
  • Separates each list element with the value of the * separator argument. *
  • Prepends and appends each element with the value of the * quote argument. *
  • No attempt is made to escape the quote character sequence if it is * found internal to a list element. *
      * @return a CSV list * @param separator the String to use as the list element separator * @param quote the String with which to quote the list elements * @param s array of String objects */ public static String getList(String[] s, String separator, String quote) { int len = s.length; StringBuffer sb = new StringBuffer(len * 16); for (int i = 0; i < len; i++) { sb.append(quote); sb.append(s[i]); sb.append(quote); if (i + 1 < len) { sb.append(separator); } } return sb.toString(); } /** * Builds a CSV list from the specified int[], separator * String and quote String.

      * *

        *
      • All arguments are assumed to be non-null. *
      • Separates each list element with the value of the * separator argument. *
      • Prepends and appends each element with the value of the * quote argument. *
          * @return a CSV list * @param s the array of int values * @param separator the String to use as the separator * @param quote the String with which to quote the list elements */ public static String getList(int[] s, String separator, String quote) { int len = s.length; StringBuffer sb = new StringBuffer(len * 8); for (int i = 0; i < len; i++) { sb.append(quote); sb.append(s[i]); sb.append(quote); if (i + 1 < len) { sb.append(separator); } } return sb.toString(); } public static String getList(long[] s, String separator, String quote) { int len = s.length; StringBuffer sb = new StringBuffer(len * 8); for (int i = 0; i < len; i++) { sb.append(quote); sb.append(s[i]); sb.append(quote); if (i + 1 < len) { sb.append(separator); } } return sb.toString(); } /** * Builds a CSV list from the specified String[][], separator string and * quote string.

          * *

            *
          • All arguments are assumed to be non-null. *
          • Uses only the first element in each subarray. *
          • Separates each list element with the value of the * separator argument. *
          • Prepends and appends each element with the value of the * quote argument. *
          • No attempt is made to escape the quote character sequence if it is * found internal to a list element. *
              * @return a CSV list * @param separator the String to use as the list element separator * @param quote the String with which to quote the list elements * @param s the array of String array objects */ public static String getList(String[][] s, String separator, String quote) { int len = s.length; StringBuffer sb = new StringBuffer(len * 16); for (int i = 0; i < len; i++) { sb.append(quote); sb.append(s[i][0]); sb.append(quote); if (i + 1 < len) { sb.append(separator); } } return sb.toString(); } /** * Checks if text is empty (characters <= space) * @return boolean true if text is null or empty, false otherwise * @param s java.lang.String */ public static boolean isEmpty(String s) { int i = s == null ? 0 : s.length(); while (i > 0) { if (s.charAt(--i) > ' ') { return false; } } return true; } /** * Returns the size of substring that does not contain any trailing spaces * @param s the string * @return trimmed size */ public static int rightTrimSize(String s) { int i = s.length(); while (i > 0) { i--; if (s.charAt(i) != ' ') { return i + 1; } } return 0; } /** * Skips any spaces at or after start and returns the index of first * non-space character; * @param s the string * @param start index to start * @return index of first non-space */ public static int skipSpaces(String s, int start) { int limit = s.length(); int i = start; for (; i < limit; i++) { if (s.charAt(i) != ' ') { break; } } return i; } /** * Splits the string into an array, using the separator. If separator is * not found in the string, the whole string is returned in the array. * * @param s the string * @param separator the separator * @return array of strings */ public static String[] split(String s, String separator) { HsqlArrayList list = new HsqlArrayList(); int currindex = 0; for (boolean more = true; more; ) { int nextindex = s.indexOf(separator, currindex); if (nextindex == -1) { nextindex = s.length(); more = false; } list.add(s.substring(currindex, nextindex)); currindex = nextindex + separator.length(); } return (String[]) list.toArray(new String[list.size()]); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/ObjectComparator.java0000644000175000017500000000335112007547402023610 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.Comparator; public interface ObjectComparator extends Comparator { int hashCode(Object a); long longKey(Object a); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/MultiValueHashMap.java0000644000175000017500000001241512007547400023702 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import org.hsqldb.store.BaseHashMap; /** * Stores multiple values per key * This class does not store null keys. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.9.0 */ public class MultiValueHashMap extends BaseHashMap { Set keySet; Collection values; Iterator valueIterator; public MultiValueHashMap() { this(8); } public MultiValueHashMap(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.objectKeyOrValue, BaseHashMap.objectKeyOrValue, false); super.multiValueTable = new boolean[super.objectValueTable.length]; } public Iterator get(Object key) { int hash = key.hashCode(); return super.getValuesIterator(key, hash); } public Object put(Object key, Object value) { return super.addOrRemoveMultiVal(0, 0, key, value, false, false); } public Object remove(Object key) { return super.addOrRemoveMultiVal(0, 0, key, null, true, false); } public Object remove(Object key, Object value) { return super.addOrRemoveMultiVal(0, 0, key, value, false, true); } public boolean containsKey(Object key) { return super.containsKey(key); } public boolean containsValue(Object value) { return super.containsValue(value); } public int valueCount(Object key) { int hash = key.hashCode(); return super.valueCount(key, hash); } public void putAll(HashMap t) { Iterator it = t.keySet.iterator(); while (it.hasNext()) { Object key = it.next(); put(key, t.get(key)); } } public Set keySet() { if (keySet == null) { keySet = new KeySet(); } return keySet; } public Collection values() { if (values == null) { values = new Values(); } return values; } class KeySet implements Set { public Iterator iterator() { return MultiValueHashMap.this.new MultiValueKeyIterator(); } public int size() { return MultiValueHashMap.this.size(); } public boolean contains(Object o) { return containsKey(o); } public Object get(Object key) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { int oldSize = size(); MultiValueHashMap.this.remove(o); return size() != oldSize; } public boolean isEmpty() { return size() == 0; } public void clear() { MultiValueHashMap.this.clear(); } } class Values implements Collection { public Iterator iterator() { return MultiValueHashMap.this.new BaseHashIterator(false); } public int size() { return MultiValueHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { MultiValueHashMap.this.clear(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/DataOutputStream.java0000644000175000017500000001043512007547402023621 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; /** * A wrapper for OutputStream * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public class DataOutputStream extends java.io.BufferedOutputStream { byte[] tempBuffer = new byte[8]; public DataOutputStream(OutputStream stream) { super(stream, 8); } public final void writeByte(int v) throws IOException { write(v); } public final void writeInt(int v) throws IOException { int count = 0; tempBuffer[count++] = (byte) (v >>> 24); tempBuffer[count++] = (byte) (v >>> 16); tempBuffer[count++] = (byte) (v >>> 8); tempBuffer[count++] = (byte) v; write(tempBuffer, 0, count); } public final void writeLong(long v) throws IOException { writeInt((int) (v >>> 32)); writeInt((int) v); } public void writeChar(int v) throws IOException { int count = 0; tempBuffer[count++] = (byte) (v >>> 8); tempBuffer[count++] = (byte) v; write(tempBuffer, 0, count); } public void writeChars(String s) throws IOException { int len = s.length(); for (int i = 0; i < len; i++) { int v = s.charAt(i); int count = 0; tempBuffer[count++] = (byte) (v >>> 8); tempBuffer[count++] = (byte) v; write(tempBuffer, 0, count); } } public void writeChars(char[] c) throws IOException { writeChars(c, c.length); } public void writeChars(char[] c, int length) throws IOException { for (int i = 0; i < length; i++) { int v = c[i]; int count = 0; tempBuffer[count++] = (byte) (v >>> 8); tempBuffer[count++] = (byte) v; write(tempBuffer, 0, count); } } public long write(Reader reader, long length) throws IOException { InputStream inputStream = new ReaderInputStream(reader); return write(inputStream, length * 2) / 2; } public long write(InputStream inputStream, long length) throws IOException { byte[] data = new byte[1024]; long totalCount = 0; while (true) { long count = length - totalCount; if (count > data.length ) { count = data.length; } count = inputStream.read(data, 0, (int) count); if (count < 1) { break; } write(data, 0, (int) count); totalCount += count; } return totalCount; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/DoubleIntIndex.java0000644000175000017500000004643612007547402023242 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; /** * Maintains an ordered integer->integer lookup table, consisting of two * columns, one for keys, the other for values. * * The table is sorted on either the key or value column, depending on the calls to * setKeysSearchTarget() or setValuesSearchTarget(). By default, the table is * sorted on values.

              * * findXXX() methods return the array index into the list * pair containing a matching key or value, or or -1 if not found.

              * * Sorting methods originally contributed by Tony Lai (tony_lai@users dot sourceforge.net). * Non-recursive implementation of fast quicksort added by Sergio Bossa sbtourist@users dot sourceforge.net) * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.8.0 */ public class DoubleIntIndex implements IntLookup, LongLookup { private int count = 0; private int capacity; private boolean sorted = true; private boolean sortOnValues = true; private boolean hasChanged; private final boolean fixedSize; private int[] keys; private int[] values; // private int targetSearchValue; public DoubleIntIndex(int capacity, boolean fixedSize) { this.capacity = capacity; keys = new int[capacity]; values = new int[capacity]; this.fixedSize = fixedSize; hasChanged = true; } public synchronized int getKey(int i) { if (i < 0 || i >= count) { throw new IndexOutOfBoundsException(); } return keys[i]; } public synchronized int getValue(int i) { if (i < 0 || i >= count) { throw new IndexOutOfBoundsException(); } return values[i]; } /** * Modifies an existing pair. * @param i the index * @param key the key */ public synchronized void setKey(int i, int key) { if (i < 0 || i >= count) { throw new IndexOutOfBoundsException(); } if (!sortOnValues) { sorted = false; } keys[i] = key; } /** * Modifies an existing pair. * @param i the index * @param value the value */ public synchronized void setValue(int i, int value) { if (i < 0 || i >= count) { throw new IndexOutOfBoundsException(); } if (sortOnValues) { sorted = false; } values[i] = value; } public synchronized int size() { return count; } public synchronized int capacity() { return capacity; } /** * Adds a pair into the table. * * @param key the key * @param value the value * @return true or false depending on success */ public synchronized boolean addUnsorted(int key, int value) { if (count == capacity) { if (fixedSize) { return false; } else { doubleCapacity(); } } if (sorted && count != 0) { if (sortOnValues) { if (value < values[count - 1]) { sorted = false; } } else { if (key < keys[count - 1]) { sorted = false; } } } hasChanged = true; keys[count] = key; values[count] = value; count++; return true; } /** * Adds a key, value pair into the table with the guarantee that the key * is equal or larger than the largest existing key. This prevents a sort * from taking place on next call to find() * * @param key the key * @param value the value * @return true or false depending on success */ public synchronized boolean addSorted(int key, int value) { if (count == capacity) { if (fixedSize) { return false; } else { doubleCapacity(); } } if (count != 0) { if (sortOnValues) { if (value < values[count - 1]) { return false; } } else { if (key < keys[count - 1]) { return false; } } } hasChanged = true; keys[count] = key; values[count] = value; count++; return true; } /** * Adds a pair, ensuring no duplicate key xor value already exists in the * current search target column. * @param key the key * @param value the value * @return true or false depending on success */ public synchronized boolean addUnique(int key, int value) { if (count == capacity) { if (fixedSize) { return false; } else { doubleCapacity(); } } if (!sorted) { fastQuickSort(); } targetSearchValue = sortOnValues ? value : key; int i = binaryEmptySlotSearch(); if (i == -1) { return false; } hasChanged = true; if (count != i) { moveRows(i, i + 1, count - i); } keys[i] = key; values[i] = value; count++; return true; } public int add(long key, long value) { if (key > Integer.MAX_VALUE || key < Integer.MIN_VALUE) { throw new java.lang.IllegalArgumentException(); } if (value > Integer.MAX_VALUE || value < Integer.MIN_VALUE) { throw new java.lang.IllegalArgumentException(); } return add((int) key, (int) value); } /** * Adds a pair, maintaining sorted order * current search target column. * @param key the key * @param value the value * @return index of added key or -1 if key exists */ public synchronized int add(int key, int value) { if (count == capacity) { if (fixedSize) { return -1; } else { doubleCapacity(); } } if (!sorted) { fastQuickSort(); } targetSearchValue = sortOnValues ? value : key; int i = binarySlotSearch(); if (i == -1) { return i; } hasChanged = true; if (count != i) { moveRows(i, i + 1, count - i); } keys[i] = key; values[i] = value; count++; return i; } public long lookup(long key) throws NoSuchElementException { if (key > Integer.MAX_VALUE || key < Integer.MIN_VALUE) { throw new NoSuchElementException(); } return lookup((int) key); } public int lookup(int key) throws NoSuchElementException { if (sortOnValues) { sorted = false; sortOnValues = false; } int i = findFirstEqualKeyIndex(key); if (i == -1) { throw new NoSuchElementException(); } return getValue(i); } public long lookup(long key, long def) { if (key > Integer.MAX_VALUE || key < Integer.MIN_VALUE) { return def; } if (sortOnValues) { sorted = false; sortOnValues = false; } int i = findFirstEqualKeyIndex((int) key); if (i == -1) { return def; } return getValue(i); } public int lookup(int key, int def) { if (sortOnValues) { sorted = false; sortOnValues = false; } int i = findFirstEqualKeyIndex(key); if (i == -1) { return def; } return getValue(i); } public int lookupFirstGreaterEqual(int key) throws NoSuchElementException { if (sortOnValues) { sorted = false; sortOnValues = false; } int i = findFirstGreaterEqualKeyIndex(key); if (i == -1) { throw new NoSuchElementException(); } return getValue(i); } public synchronized void setValuesSearchTarget() { if (!sortOnValues) { sorted = false; } sortOnValues = true; } public synchronized void setKeysSearchTarget() { if (sortOnValues) { sorted = false; } sortOnValues = false; } /** * @param value the value * @return the index */ public synchronized int findFirstGreaterEqualKeyIndex(int value) { int index = findFirstGreaterEqualSlotIndex(value); return index == count ? -1 : index; } /** * @param value the value * @return the index */ public synchronized int findFirstEqualKeyIndex(int value) { if (!sorted) { fastQuickSort(); } targetSearchValue = value; return binaryFirstSearch(); } /** * This method is similar to findFirstGreaterEqualKeyIndex(int) but * returns the index of the empty row past the end of the array if * the search value is larger than all the values / keys in the searched * column. * @param value the value * @return the index */ public synchronized int findFirstGreaterEqualSlotIndex(int value) { if (!sorted) { fastQuickSort(); } targetSearchValue = value; return binarySlotSearch(); } /** * Returns the index of the lowest element == the given search target, * or -1 * @return index or -1 if not found */ private int binaryFirstSearch() { int low = 0; int high = count; int mid = 0; int compare = 0; int found = count; while (low < high) { mid = (low + high) / 2; compare = compare(mid); if (compare < 0) { high = mid; } else if (compare > 0) { low = mid + 1; } else { high = mid; found = mid; } } return found == count ? -1 : found; } /** * Returns the index of the lowest element > the given search target * @return the index */ private int binaryGreaterSearch() { int low = 0; int high = count; int mid = 0; int compare = 0; while (low < high) { mid = (low + high) / 2; compare = compare(mid); if (compare < 0) { high = mid; } else { low = mid + 1; } } return low == count ? -1 : low; } /** * Returns the index of the lowest element >= the given search target, * or count * @return the index */ private int binarySlotSearch() { int low = 0; int high = count; int mid = 0; int compare = 0; while (low < high) { mid = (low + high) / 2; compare = compare(mid); if (compare <= 0) { high = mid; } else { low = mid + 1; } } return low; } /** * Returns the index of the lowest element > the given search target * or count or -1 if target is found * @return the index */ private int binaryEmptySlotSearch() { int low = 0; int high = count; int mid = 0; int compare = 0; while (low < high) { mid = (low + high) / 2; compare = compare(mid); if (compare < 0) { high = mid; } else if (compare > 0) { low = mid + 1; } else { return -1; } } return low; } public synchronized void sort() { fastQuickSort(); } /** * fast quicksort using a stack on the heap to reduce stack use */ private synchronized void fastQuickSort() { DoubleIntIndex indices = new DoubleIntIndex(32, false); int threshold = 16; indices.push(0, count - 1); while (indices.size() > 0) { int start = indices.peekKey(); int end = indices.peekValue(); indices.pop(); if (end - start >= threshold) { int pivot = partition(start, end, start + ((end - start) / 2)); indices.push(start, pivot - 1); indices.push(pivot + 1, end); } else { insertionSort(start, end); } } sorted = true; } private int partition(int start, int end, int pivot) { int store = start; swap(pivot, end); for (int i = start; i <= end - 1; i++) { if (lessThan(i, end)) { swap(i, store); store++; } } swap(store, end); return store; } /** * fast quicksort with recursive quicksort implementation */ private synchronized void fastQuickSortRecursive() { quickSort(0, count - 1); insertionSort(0, count - 1); sorted = true; } private void quickSort(int l, int r) { int M = 16; int i; int j; int v; if ((r - l) > M) { i = (r + l) / 2; if (lessThan(i, l)) { swap(l, i); // Tri-Median Methode! } if (lessThan(r, l)) { swap(l, r); } if (lessThan(r, i)) { swap(i, r); } j = r - 1; swap(i, j); i = l; v = j; for (;;) { while (lessThan(++i, v)) {} while (lessThan(v, --j)) {} if (j < i) { break; } swap(i, j); } swap(i, r - 1); quickSort(l, j); quickSort(i + 1, r); } } private void insertionSort(int lo0, int hi0) { int i; int j; for (i = lo0 + 1; i <= hi0; i++) { j = i; while ((j > lo0) && lessThan(i, j - 1)) { j--; } if (i != j) { moveAndInsertRow(i, j); } } } protected void moveAndInsertRow(int i, int j) { int col1 = keys[i]; int col2 = values[i]; moveRows(j, j + 1, i - j); keys[j] = col1; values[j] = col2; } protected void swap(int i1, int i2) { int col1 = keys[i1]; int col2 = values[i1]; keys[i1] = keys[i2]; values[i1] = values[i2]; keys[i2] = col1; values[i2] = col2; } /** * Check if targeted column value in the row indexed i is less than the * search target object. * @param i the index * @return -1, 0 or +1 */ protected int compare(int i) { if (sortOnValues) { if (targetSearchValue > values[i]) { return 1; } else if (targetSearchValue < values[i]) { return -1; } } else { if (targetSearchValue > keys[i]) { return 1; } else if (targetSearchValue < keys[i]) { return -1; } } return 0; } /** * Check if row indexed i is less than row indexed j * @param i the first index * @param j the second index * @return true or false */ protected boolean lessThan(int i, int j) { if (sortOnValues) { if (values[i] < values[j]) { return true; } } else { if (keys[i] < keys[j]) { return true; } } return false; } protected void moveRows(int fromIndex, int toIndex, int rows) { System.arraycopy(keys, fromIndex, keys, toIndex, rows); System.arraycopy(values, fromIndex, values, toIndex, rows); } protected void doubleCapacity() { keys = (int[]) ArrayUtil.resizeArray(keys, capacity * 2); values = (int[]) ArrayUtil.resizeArray(values, capacity * 2); capacity *= 2; } public void removeRange(int start, int limit) { moveRows(limit, start, count - limit); count -= (limit - start); } public void removeAll() { hasChanged = true; ArrayUtil.clearArray(ArrayUtil.CLASS_CODE_INT, keys, 0, count); ArrayUtil.clearArray(ArrayUtil.CLASS_CODE_INT, values, 0, count); count = 0; } public final synchronized void remove(int position) { hasChanged = true; moveRows(position + 1, position, count - position - 1); count--; keys[count] = 0; values[count] = 0; } /** * peek the key at top of stack * @return int key */ private int peekKey() { return getKey(count - 1); } /** * peek the value at top of stack * @return int value */ private int peekValue() { return getValue(count - 1); } /** * pop the pair at top of stack * @return boolean if there was an element */ private boolean pop() { if (count > 0) { count--; return true; } return false; } /** * push key, value pair * @return boolean true if susseful */ private boolean push(int key, int value) { return addUnsorted(key, value); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/InputStreamInterface.java0000644000175000017500000000445312007547400024450 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.IOException; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.3.0 * @since 2.3.0 */ public interface InputStreamInterface { public int read() throws IOException; public int read(byte bytes[]) throws IOException; public int read(byte bytes[], int offset, int length) throws IOException; public long skip(long count) throws IOException; public int available() throws IOException; public void close() throws IOException; public void setSizeLimit(long count); /** * Invariant. Number of characters in stream, including any already read. * @return -1 if no explicit limit otherwise the limit */ public long getSizeLimit(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/RefCapableRBInterface.java0000644000175000017500000000456112007547400024405 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; public interface RefCapableRBInterface { public String getString(); public String getString(String... strings); public String getExpandedString(); public String getExpandedString(String... strings); public String getString(int i1); public String getString(int i1, int i2); public String getString(int i1, int i2, int i3); public String getString(int i1, String s2); public String getString(String s1, int i2); public String getString(int i1, int i2, String s3); public String getString(int i1, String s2, int i3); public String getString(String s1, int i2, int i3); public String getString(int i1, String s2, String s3); public String getString(String s1, String s2, int i3); public String getString(String s1, int i2, String s3); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/Set.java0000644000175000017500000000447112007547400021107 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.7.2 * @since 1.7.2 */ public interface Set extends Collection { int size(); boolean isEmpty(); boolean contains(Object o); Iterator iterator(); /* Object[] toArray(); void toArray(Object a[]); */ boolean add(Object o); /** * This method returns the Object that is already in the set and is * equal to the argument o. */ Object get(Object o); boolean remove(Object o); /* boolean containsAll(Collection c); boolean addAll(Collection c); boolean retainAll(Collection c); boolean removeAll(Collection c); */ void clear(); boolean equals(Object o); int hashCode(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/RCData.java0000644000175000017500000004227612007547402021461 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.net.MalformedURLException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; import java.util.StringTokenizer; /* $Id: RCData.java 4254 2011-05-15 02:24:14Z unsaved $ */ /** * Manages all the details we need to connect up to JDBC database(s), * in a declarative way. *

              * The file src/org/hsqldb/sample/SqlFileEmbedder.java * in the HSQLDB distribution provides an example of how to use RCData for your * own programs. *

              * * @see * The RC File section of the HyperSQL Utilities Guide * @see org.hsqldb.sample.SqlFileEmbedder * @author Blaine Simpson (blaine dot simpson at admc dot com) */ public class RCData { public static final String DEFAULT_JDBC_DRIVER = "org.hsqldb.jdbc.JDBCDriver"; private String defaultJdbcDriverName = DEFAULT_JDBC_DRIVER; public void setDefaultJdbcDriver(String defaultJdbcDriverName) { this.defaultJdbcDriverName = defaultJdbcDriverName; } public String getDefaultJdbcDriverName() { return defaultJdbcDriverName; } /** * DISABLED DUE TO SECURITY CONCERNS. * Just for testing and debugging. * * N.b. this echoes passwords! public void report() { System.err.println("urlid: " + id + ", url: " + url + ", username: " + username + ", password: " + password); } */ /** * Creates a RCDataObject by looking up the given key in the * given authentication file. * * @param dbKey Key to look up in the file. * If null, then will echo all urlids in the file to stdout. * (A rather ill-conceived design). * @param file File containing the authentication information. */ public RCData(File file, String dbKey) throws Exception { if (file == null) { throw new IllegalArgumentException("RC file name not specified"); } if (!file.canRead()) { throw new IOException("Please set up authentication file '" + file + "'"); } // System.err.println("Using RC file '" + file + "'"); StringTokenizer tokenizer = null; boolean thisone = false; String s; String keyword, value; int linenum = 0; BufferedReader br = new BufferedReader(new FileReader(file)); try { while ((s = br.readLine()) != null) { ++linenum; s = s.trim(); if (s.length() == 0) { continue; } if (s.charAt(0) == '#') { continue; } tokenizer = new StringTokenizer(s); if (tokenizer.countTokens() == 1) { keyword = tokenizer.nextToken(); value = ""; } else if (tokenizer.countTokens() > 1) { keyword = tokenizer.nextToken(); value = tokenizer.nextToken("").trim(); } else { try { br.close(); } catch (IOException e) { // Can only report on so many errors at one time } throw new Exception("Corrupt line " + linenum + " in '" + file + "': " + s); } if (dbKey == null) { if (keyword.equals("urlid")) { System.out.println(value); } continue; } if (keyword.equals("urlid")) { if (value.equals(dbKey)) { if (id == null) { id = dbKey; thisone = true; } else { try { br.close(); } catch (IOException e) { // Can only report on so many errors at one time } throw new Exception("Key '" + dbKey + " redefined at" + " line " + linenum + " in '" + file); } } else { thisone = false; } continue; } if (thisone) { if (keyword.equals("url")) { url = value; } else if (keyword.equals("username")) { username = value; } else if (keyword.equals("driver")) { driver = value; } else if (keyword.equals("charset")) { charset = value; } else if (keyword.equals("truststore")) { truststore = value; } else if (keyword.equals("password")) { password = value; } else if (keyword.equals("transiso")) { ti = value; } else if (keyword.equals("libpath")) { libpath = value; } else { try { br.close(); } catch (IOException e) { // Can only report on so many errors at one time } throw new Exception("Bad line " + linenum + " in '" + file + "': " + s); } } } } finally { try { br.close(); } catch (IOException ioe) { // Can only report on so many errors at one time } br = null; // Encourage GC } if (dbKey == null) { return; } if (url == null) { throw new Exception("url not set " + "for '" + dbKey + "' in file '" + file + "'"); } if (libpath != null) { throw new IllegalArgumentException( "Sorry, 'libpath' not supported yet"); } } /** * Convenience constructor for backward compatibility. * * @see #RCData(String,String,String,String,String,String,String,String) */ public RCData(String id, String url, String username, String password, String driver, String charset, String truststore) throws Exception { this(id, url, username, password, driver, charset, truststore, null); } /** * Wrapper for unset Transaction Isolation. */ public RCData(String id, String url, String username, String password, String driver, String charset, String truststore, String libpath) throws Exception { this(id, url, username, password, driver, charset, truststore, libpath, null); } /** * Creates a new RCData object. * *

              * The parameters driver, charset, truststore, and libpath are optional. * Setting these parameters to NULL will set them to their * default values. *

              * * @param id The identifier for these connection settings * @param url The URL of the database to connect to * @param username The username to log in as * @param password The password of the username * @param driver The JDBC driver to use * @param charset The character set to use * @param truststore The trust store to use * @param libpath The JDBC library to add to CLASSPATH * @throws Exception if the a non-optional parameter is set to NULL */ public RCData(String id, String url, String username, String password, String driver, String charset, String truststore, String libpath, String ti) throws Exception { this.id = id; this.url = url; this.username = username; this.password = password; this.ti = ti; this.driver = driver; this.charset = charset; this.truststore = truststore; this.libpath = libpath; if (libpath != null) { throw new IllegalArgumentException( "Sorry, 'libpath' not supported yet"); } if (id == null || url == null) { throw new Exception("id or url was not set"); } } /* Purposefully not using JavaBean paradigm so that these fields can * be used as a traditional, public DO */ public String id; public String url; public String username; public String password; public String ti; public String driver; public String charset; public String truststore; public String libpath; /** * Gets a JDBC Connection using the data of this RCData object. * * @return New JDBC Connection */ public Connection getConnection() throws ClassNotFoundException, SQLException, MalformedURLException { return getConnection(null, null); } /** * Gets a JDBC Connection using the data of this RCData object with * specified override elements * * @return New JDBC Connection */ public Connection getConnection(String curDriverIn, String curTrustStoreIn) throws ClassNotFoundException, MalformedURLException, SQLException { // Local vars to satisfy compiler warnings String curDriver = null; String curTrustStore = null; Properties sysProps = System.getProperties(); if (curDriverIn == null) { // If explicit driver not specified curDriver = ((driver == null) ? DEFAULT_JDBC_DRIVER : driver); } else { curDriver = expandSysPropVars(curDriverIn); } if (curTrustStoreIn == null) { if (truststore != null) { curTrustStore = expandSysPropVars(truststore); } } else { curTrustStore = expandSysPropVars(curTrustStoreIn); } if (curTrustStore == null) { sysProps.remove("javax.net.ssl.trustStore"); } else { sysProps.put("javax.net.ssl.trustStore", curTrustStore); } String urlString = null; try { urlString = expandSysPropVars(url); } catch (IllegalArgumentException iae) { throw new MalformedURLException(iae.toString() + " for URL '" + url + "'"); } String userString = null; if (username != null) try { userString = expandSysPropVars(username); } catch (IllegalArgumentException iae) { throw new MalformedURLException(iae.toString() + " for user name '" + username + "'"); } String passwordString = null; if (password != null) try { passwordString = expandSysPropVars(password); } catch (IllegalArgumentException iae) { throw new MalformedURLException(iae.toString() + " for password"); } Class.forName(curDriver); // This is not necessary for jdbc:odbc or if class loaded by a // service resource file. Consider checking for that. Connection c = (userString == null) ? DriverManager.getConnection(urlString) : DriverManager.getConnection(urlString, userString, passwordString); if (ti != null) RCData.setTI(c, ti); // Would like to verify the setting made by checking // c.getTransactionIsolation(). Unfortunately, the spec allows for // databases to substitute levels according to some rules, and it's // impossible to know what to expect since custom levels are permitted. // Debug: // System.err.println("TI set to " + ti + "\nPOST: " // + SqlTool.tiToString(c.getTransactionIsolation())); return c; } /** * Returns a copy of the given String with System property names in the * format ${system.property} replaced by the corresponding Java * System Properties. */ public static String expandSysPropVars(String inString) { String outString = new String(inString); int varOffset, varEnd; String varVal, varName; while (true) { // Recursive substitution for ${x} variables. varOffset = outString.indexOf("${"); if (varOffset < 0) { break; } varEnd = outString.indexOf('}', varOffset + 2); if (varEnd < 0) { break; } varName = outString.substring(varOffset + 2, varEnd); if (varName.length() < 1) { throw new IllegalArgumentException("Bad variable setting"); } varVal = System.getProperty(varName); if (varVal == null) { throw new IllegalArgumentException( "No Java system property with name '" + varName + "'"); } outString = outString.substring(0, varOffset) + varVal + outString.substring(varEnd + 1); } return outString; } /** * Set Transaction Isolation level on the specified JDBC Connection */ public static void setTI(Connection c, String tiString) throws SQLException { int i = -1; if (tiString.equals("TRANSACTION_READ_UNCOMMITTED")) i = Connection.TRANSACTION_READ_UNCOMMITTED; if (tiString.equals("TRANSACTION_READ_COMMITTED")) i = Connection.TRANSACTION_READ_COMMITTED; if (tiString.equals("TRANSACTION_REPEATABLE_READ")) i = Connection.TRANSACTION_REPEATABLE_READ; if (tiString.equals("TRANSACTION_SERIALIZABLE")) i = Connection.TRANSACTION_SERIALIZABLE; if (tiString.equals("TRANSACTION_NONE")) i = Connection.TRANSACTION_NONE; if (i < 0) { throw new SQLException( "Trans. isol. value not supported by " + RCData.class.getName() + ": " + tiString); } c.setTransactionIsolation(i); } /** * Return a String representation for the given numerical * java.sql.Connection Transaction level. *

              * Database implementations are free to provide their own transaction * isolation levels, so you can't depend upon this method to much. *

              * Returns null, since DB implementations are free to provide */ public static String tiToString(int ti) { switch (ti) { case Connection.TRANSACTION_READ_UNCOMMITTED: return "TRANSACTION_READ_UNCOMMITTED"; case Connection.TRANSACTION_READ_COMMITTED: return "TRANSACTION_READ_COMMITTED"; case Connection.TRANSACTION_REPEATABLE_READ: return "TRANSACTION_REPEATABLE_READ"; case Connection.TRANSACTION_SERIALIZABLE: return "TRANSACTION_SERIALIZABLE"; case Connection.TRANSACTION_NONE: return "TRANSACTION_NONE"; } return "Custom Transaction Isolation numerical value: " + ti; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/ClosableCharArrayWriter.java0000644000175000017500000003434412007547400025074 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.CharArrayReader; import java.io.CharArrayWriter; import java.io.IOException; import java.io.Writer; /** * @todo - finer-grained synchronization to reduce average * potential monitor contention */ /** * Provides Closable semantics ordinarily missing in a * {@link java.io.CharArrayWriter}.

              * * Accumulates output in a character array that automatically grows as needed.

              * * Data is retrieved using toCharArray(), toCharArrayReader() * and toString().

              * * {@link #close() Closing} a ClosableCharArrayWriter prevents * further write operations, but all other operations will succeed until after * the first invocation of {@link #free() free()}.

              * * Freeing a ClosableCharArrayWriter closes the writer and * releases its internal buffer, preventing successful invocation of all * operations, with the exception of size(), close(), * isClosed(), free() and isFreed().

              * * This class is especially useful when an accumulating writer must be * handed off to an extenal client under contract that the writer should * exhibit true Closable behaviour, both in response to internally tracked * events and to client invocation of the Writer.close() method. * * @author boucherb@users * @version 1.8.x * @since 1.8.x */ public class ClosableCharArrayWriter extends Writer { /** * Data buffer. */ protected char[] buf; /** * # of valid characters in buffer. */ protected int count; /** * Whether this writer is closed. */ protected boolean closed; /** * Whether this writer is freed. */ protected boolean freed; /** * Creates a new writer.

              * * The buffer capacity is initially 32 characters, although its size * automatically increases when necessary. */ public ClosableCharArrayWriter() { this(32); } /** * Creates a new writer with a buffer capacity of the specified * size, in characters. * * @param size the initial size. * @exception IllegalArgumentException if size is negative. */ public ClosableCharArrayWriter(int size) throws IllegalArgumentException { if (size < 0) { throw new IllegalArgumentException("Negative initial size: " + size); // NOI18N } buf = new char[size]; } /** * Writes the specified single character. * * @param c the single character to be written. * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this writer has been {@link #close() closed}. */ public synchronized void write(int c) throws IOException { checkClosed(); int newcount = count + 1; if (newcount > buf.length) { buf = copyOf(buf, Math.max(buf.length << 1, newcount)); } buf[count] = (char) c; count = newcount; } /** * Writes the designated portion of the designated character array

              . * * @param c the source character sequence. * @param off the start offset in the source character sequence. * @param len the number of characters to write. * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this writer has been {@link #close() closed}. */ public synchronized void write(char c[], int off, int len) throws IOException { checkClosed(); if ((off < 0) || (off > c.length) || (len < 0) || ((off + len) > c.length) || ((off + len) < 0)) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return; } int newcount = count + len; if (newcount > buf.length) { buf = copyOf(buf, Math.max(buf.length << 1, newcount)); } System.arraycopy(c, off, buf, count, len); count = newcount; } /** * Efficiently writes the designated portion of the designated string.

              * * The operation occurs as if by calling * str.getChars(off, off + len, buf, count).

              * * @param str the string from which to write * @param off the start offset in the string. * @param len the number of characters to write. * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this writer has been {@link #close() closed}. */ public synchronized void write(String str, int off, int len) throws IOException { checkClosed(); int strlen = str.length(); if ((off < 0) || (off > strlen) || (len < 0) || ((off + len) > strlen) || ((off + len) < 0)) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return; } int newcount = count + len; if (newcount > buf.length) { buf = copyOf(buf, Math.max(buf.length << 1, newcount)); } str.getChars(off, off + len, buf, count); count = newcount; } /** * By default, does nothing.

              * * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this writer has been {@link #close() closed}. */ public void flush() throws IOException { checkClosed(); } /** * Writes the complete contents of this writer's buffered data to the * specified writer.

              * * The operation occurs as if by calling out.write(buf, 0, count). * * @param out the writer to which to write the data. * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this writer has been {@link #free() freed}. */ public synchronized void writeTo(Writer out) throws IOException { checkFreed(); if (count > 0) { out.write(buf, 0, count); } } /** * Returns the current capacity of this writer's data buffer. * * @return the current capacity (the length of the internal * data array) * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this writer has been {@link #free() freed}. */ public synchronized int capacity() throws IOException { checkFreed(); return buf.length; } /** * Resets the count field of this writer to zero, so that all * currently accumulated output is effectively discarded. Further write * operations will reuse the allocated buffer space. * * @see #count * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this output stream has been {@link #close() closed}. */ public synchronized void reset() throws IOException { checkClosed(); count = 0; } /** * Attempts to reduce this writer's buffer capacity to its current size.

              * * If the buffer is larger than necessary to hold its current sequence of * characters, then it may be resized to become more space efficient. * Calling this method may, but is not required to, affect the value * returned by a subsequent call to the {@link #capacity()} method. */ public synchronized void trimToSize() throws IOException { checkFreed(); if (buf.length > count) { buf = copyOf(buf, count); } } /** * Creates a newly allocated character array. Its size is the current * size of this writer and the valid contents of the buffer * have been copied into it. * * @return the current contents of this writer, as a character array. * @see #size() * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this writer has been {@link #free() freed}. */ public synchronized char[] toCharArray() throws IOException { checkFreed(); return copyOf(buf, count); } /** * Returns the current size of this writer's accumulated character data. * * @return the value of the count field, which is the number * of valid characters accumulated in this writer. * @see #count * @throws java.io.IOException never */ public synchronized int size() throws IOException { return count; } /** * Sets the size of this writer's accumulated character data.

              * * @param newSize the new size of this writer's accumulated data * @throws ArrayIndexOutOfBoundsException if new size is negative */ public synchronized void setSize(int newSize) { if (newSize < 0) { throw new ArrayIndexOutOfBoundsException(newSize); } else if (newSize > buf.length) { buf = copyOf(buf, Math.max(buf.length << 1, newSize)); } count = newSize; } /** * Performs an effecient (zero-copy) conversion of the character data * accumulated in this writer to a reader.

              * * To ensure the integrity of the resulting reader, {@link #free() * free} is invoked upon this writer as a side-effect. * * @return a reader representing this writer's accumulated * character data * @throws java.io.IOException if an I/O error occurs. * In particular, an IOException may be thrown * if this writer has been {@link #free() freed}. */ public synchronized CharArrayReader toCharArrayReader() throws IOException { checkFreed(); CharArrayReader reader = new CharArrayReader(buf, 0, count); //System.out.println("toCharArrayReader::buf.length: " + buf.length); free(); return reader; } /** * Converts this writer's accumulated data into a string. * * @return String constructed from this writer's accumulated data * @throws RuntimeException may be thrown if this writer has been * {@link #free() freed}. */ public synchronized String toString() { try { checkFreed(); } catch (IOException ex) { throw new RuntimeException(ex.toString()); } return new String(buf, 0, count); } /** * Closes this object for further writing.

              * * Other operations may continue to succeed until after the first invocation * of {@link #free() free()}.

              * * @throws java.io.IOException if an I/O error occurs (default: never) */ public synchronized void close() throws IOException { closed = true; } /** * @return true if this writer is closed, else false */ public synchronized boolean isClosed() { return closed; } /** * Closes this object and releases the underlying buffer for * garbage collection.

              * * @throws java.io.IOException if an I/O error occurs while closing * this writer (default: never). */ public synchronized void free() throws IOException { closed = true; freed = true; buf = null; count = 0; } /** * @return true if this writer is freed; else false. */ public synchronized boolean isFreed() { return freed; } /** * @throws java.io.IOException if this writer is closed. */ protected synchronized void checkClosed() throws IOException { if (closed) { throw new IOException("writer is closed."); // NOI18N } } /** * @throws java.io.IOException if this writer is freed. */ protected synchronized void checkFreed() throws IOException { if (freed) { throw new IOException("write buffer is freed."); // NOI18N } } /** * Retrieves a copy of original with the given * newLength.

              * * @param original the object to copy * @param newLength the length of the copy * @return copy of original with the given newLength */ protected char[] copyOf(char[] original, int newLength) { char[] copy = new char[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/LongKeyIntValueHashMap.java0000644000175000017500000001243012007547400024630 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.util.NoSuchElementException; import org.hsqldb.store.BaseHashMap; /** * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public class LongKeyIntValueHashMap extends BaseHashMap { private Set keySet; private Collection values; public LongKeyIntValueHashMap() { this(8); } public LongKeyIntValueHashMap(boolean minimize) { this(8); minimizeOnEmpty = minimize; } public LongKeyIntValueHashMap(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.longKeyOrValue, BaseHashMap.intKeyOrValue, false); } public int get(long key) throws NoSuchElementException { int lookup = getLookup(key); if (lookup != -1) { return intValueTable[lookup]; } throw new NoSuchElementException(); } public int get(long key, int defaultValue) { int lookup = getLookup(key); if (lookup != -1) { return intValueTable[lookup]; } return defaultValue; } public boolean get(long key, int[] value) { int lookup = getLookup(key); if (lookup != -1) { value[0] = intValueTable[lookup]; return true; } return false; } public int getLookup(long key) { return super.getLookup(key); } public boolean put(long key, int value) { int oldSize = size(); super.addOrRemove(key, value, null, null, false); return oldSize != size(); } public boolean remove(long key) { int oldSize = size(); super.addOrRemove(key, 0, null, null, true); return oldSize != size(); } public Set keySet() { if (keySet == null) { keySet = new KeySet(); } return keySet; } public Collection values() { if (values == null) { values = new Values(); } return values; } class KeySet implements Set { public Iterator iterator() { return LongKeyIntValueHashMap.this.new BaseHashIterator(true); } public int size() { return LongKeyIntValueHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public Object get(Object key) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { LongKeyIntValueHashMap.this.clear(); } } class Values implements Collection { public Iterator iterator() { return LongKeyIntValueHashMap.this.new BaseHashIterator(false); } public int size() { return LongKeyIntValueHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { LongKeyIntValueHashMap.this.clear(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/FileArchiver.java0000644000175000017500000001760212007547400022717 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; import org.hsqldb.lib.java.JavaSystem; /** * Creates a direct, compressed or decompressed copy of a file. * * @author Blaine Simpson (blaine dot simpson at admc dot com) * @version 1.9.0 * @since 1.9.0 */ public class FileArchiver { public static final int COMPRESSION_NONE = 0; public static final int COMPRESSION_ZIP = 1; public static final int COMPRESSION_GZIP = 2; private static final int COPY_BLOCK_SIZE = 1 << 16; /* public static void compressFile(String infilename, String outfilename, FileAccess storage) throws IOException { FileArchiver.archive(infilename, outfilename, storage, COMPRESSION_ZIP); } public static void decompressFile(String infilename, String outfilename, FileAccess storage) throws IOException { FileArchiver.unarchive( infilename, outfilename, storage, COMPRESSION_ZIP); } public static void copyFile(String infilename, String outfilename, FileAccess storage) throws IOException { FileArchiver.archive( infilename, outfilename, storage, COMPRESSION_NONE); } public static void restoreFile(String infilename, String outfilename, FileAccess storage) throws IOException { FileArchiver.unarchive( infilename, outfilename, storage, COMPRESSION_NONE); } */ public static void archive(String infilename, String outfilename, FileAccess storage, int compressionType) throws IOException { InputStream in = null; OutputStream f = null; OutputStream fOut = null; DeflaterOutputStream deflater = null; boolean completed = false; // if there is no file if (!storage.isStreamElement(infilename)) { return; } try { byte[] b = new byte[COPY_BLOCK_SIZE]; in = storage.openInputStreamElement(infilename); f = storage.openOutputStreamElement(outfilename); fOut = f; switch (compressionType) { case COMPRESSION_ZIP : f = deflater = new DeflaterOutputStream(f, new Deflater(Deflater.BEST_SPEED), b.length); break; case COMPRESSION_GZIP : f = deflater = new GZIPOutputStream(f, b.length); break; case COMPRESSION_NONE : break; default : throw new RuntimeException("FileArchiver" + compressionType); } while (true) { int l = in.read(b, 0, b.length); if (l == -1) { break; } f.write(b, 0, l); } completed = true; } catch (Throwable e) { throw JavaSystem.toIOException(e); } finally { try { if (in != null) { in.close(); } if (f != null) { if (deflater != null) { deflater.finish(); } if (fOut instanceof FileOutputStream) { storage.getFileSync(fOut).sync(); } f.close(); } if (!completed && storage.isStreamElement(outfilename)) { storage.removeElement(outfilename); } } catch (Throwable e) { throw JavaSystem.toIOException(e); } } } public static void unarchive(String infilename, String outfilename, FileAccess storage, int compressionType) throws IOException { InputStream f = null; OutputStream outstream = null; boolean completed = false; try { if (!storage.isStreamElement(infilename)) { return; } storage.removeElement(outfilename); byte[] b = new byte[COPY_BLOCK_SIZE]; f = storage.openInputStreamElement(infilename); switch (compressionType) { case COMPRESSION_ZIP : f = new InflaterInputStream(f, new Inflater()); break; case COMPRESSION_GZIP : f = new GZIPInputStream(f, b.length); break; case COMPRESSION_NONE : break; default : throw new RuntimeException("FileArchiver: " + compressionType); } outstream = storage.openOutputStreamElement(outfilename); while (true) { int l = f.read(b, 0, b.length); if (l == -1) { break; } outstream.write(b, 0, l); } completed = true; } catch (Throwable e) { throw JavaSystem.toIOException(e); } finally { try { if (f != null) { f.close(); } if (outstream != null) { outstream.flush(); if (outstream instanceof FileOutputStream) { storage.getFileSync(outstream).sync(); } outstream.close(); } if (!completed && storage.isStreamElement(outfilename)) { storage.removeElement(outfilename); } } catch (Throwable e) { throw JavaSystem.toIOException(e); } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/lib/IntKeyHashMap.java0000644000175000017500000001137412007547400023021 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.lib; import org.hsqldb.store.BaseHashMap; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public class IntKeyHashMap extends BaseHashMap { Set keySet; Collection values; public IntKeyHashMap() { this(8); } public IntKeyHashMap(int initialCapacity) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.intKeyOrValue, BaseHashMap.objectKeyOrValue, false); } public Object get(int key) { int lookup = getLookup(key); if (lookup != -1) { return objectValueTable[lookup]; } return null; } public Object put(int key, Object value) { return super.addOrRemove(key, value, null, false); } public boolean containsValue(Object value) { return super.containsValue(value); } public Object remove(int key) { return super.addOrRemove(key, null, null, true); } public boolean containsKey(int key) { return super.containsKey(key); } public void valuesToArray(Object[] array) { Iterator it = values().iterator(); int i = 0; while (it.hasNext()) { array[i] = it.next(); i++; } } public Set keySet() { if (keySet == null) { keySet = new KeySet(); } return keySet; } public Collection values() { if (values == null) { values = new Values(); } return values; } class KeySet implements Set { public Iterator iterator() { return IntKeyHashMap.this.new BaseHashIterator(true); } public int size() { return IntKeyHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public Object get(Object key) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { IntKeyHashMap.this.clear(); } } class Values implements Collection { public Iterator iterator() { return IntKeyHashMap.this.new BaseHashIterator(false); } public int size() { return IntKeyHashMap.this.size(); } public boolean contains(Object o) { throw new RuntimeException(); } public boolean add(Object value) { throw new RuntimeException(); } public boolean addAll(Collection c) { throw new RuntimeException(); } public boolean remove(Object o) { throw new RuntimeException(); } public boolean isEmpty() { return size() == 0; } public void clear() { IntKeyHashMap.this.clear(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TypeInvariants.java0000644000175000017500000001476712007547414022604 0ustar renerene/* Copyright (c) 2001-2010, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.types.Charset; import org.hsqldb.types.Type; import org.hsqldb.types.DateTimeType; import org.hsqldb.types.Types; import org.hsqldb.types.UserTypeModifier; import org.hsqldb.types.NumberType; import org.hsqldb.types.CharacterType; import org.hsqldb.HsqlNameManager.HsqlName; public class TypeInvariants { public static final Charset SQL_TEXT; public static final Charset SQL_IDENTIFIER_CHARSET; public static final Charset SQL_CHARACTER; public static final Charset ASCII_GRAPHIC; // == GRAPHIC_IRV public static final Charset GRAPHIC_IRV; public static final Charset ASCII_FULL; // == ISO8BIT public static final Charset ISO8BIT; public static final Charset LATIN1; public static final Charset UTF32; public static final Charset UTF16; public static final Charset UTF8; static { HsqlName name; name = HsqlNameManager.newInfoSchemaObjectName("SQL_TEXT", false, SchemaObject.CHARSET); SQL_TEXT = new Charset(name); // name = HsqlNameManager.newInfoSchemaObjectName("SQL_IDENTIFIER", false, SchemaObject.CHARSET); SQL_IDENTIFIER_CHARSET = new Charset(name); // name = HsqlNameManager.newInfoSchemaObjectName("SQL_CHARACTER", false, SchemaObject.CHARSET); SQL_CHARACTER = new Charset(name); // name = HsqlNameManager.newInfoSchemaObjectName("LATIN1", false, SchemaObject.CHARSET); LATIN1 = new Charset(name); // name = HsqlNameManager.newInfoSchemaObjectName("ASCII_GRAPHIC", false, SchemaObject.CHARSET); ASCII_GRAPHIC = new Charset(name); // name = HsqlNameManager.newInfoSchemaObjectName("GRAPHIC_IRV", false, SchemaObject.CHARSET); GRAPHIC_IRV = new Charset(name); // name = HsqlNameManager.newInfoSchemaObjectName("ASCII_FULL", false, SchemaObject.CHARSET); ASCII_FULL = new Charset(name); // name = HsqlNameManager.newInfoSchemaObjectName("ISO8BIT", false, SchemaObject.CHARSET); ISO8BIT = new Charset(name); // name = HsqlNameManager.newInfoSchemaObjectName("UTF32", false, SchemaObject.CHARSET); UTF32 = new Charset(name); // name = HsqlNameManager.newInfoSchemaObjectName("UTF16", false, SchemaObject.CHARSET); UTF16 = new Charset(name); // name = HsqlNameManager.newInfoSchemaObjectName("UTF8", false, SchemaObject.CHARSET); UTF8 = new Charset(name); /* * Foundattion 4.2.1 * Character sets defined by standards or by SQL-implementations reside * in the Information Schema (named INFORMATION_SCHEMA) in each catalog, * as do collations defined by standards and collations, * transliterations, and transcodings defined by SQL implementations. */ } public static final Type CARDINAL_NUMBER; public static final Type YES_OR_NO; public static final Type CHARACTER_DATA; public static final Type SQL_IDENTIFIER; public static final Type TIME_STAMP; public static final Type SQL_VARCHAR; static { HsqlName name; name = HsqlNameManager.newInfoSchemaObjectName("CARDINAL_NUMBER", false, SchemaObject.DOMAIN); CARDINAL_NUMBER = new NumberType(Types.SQL_BIGINT, 0, 0); CARDINAL_NUMBER.userTypeModifier = new UserTypeModifier(name, SchemaObject.DOMAIN, CARDINAL_NUMBER); // name = HsqlNameManager.newInfoSchemaObjectName("YES_OR_NO", false, SchemaObject.DOMAIN); YES_OR_NO = new CharacterType(Types.SQL_VARCHAR, 3); YES_OR_NO.userTypeModifier = new UserTypeModifier(name, SchemaObject.DOMAIN, YES_OR_NO); // name = HsqlNameManager.newInfoSchemaObjectName("CHARACTER_DATA", false, SchemaObject.DOMAIN); CHARACTER_DATA = new CharacterType(Types.SQL_VARCHAR, (1 << 16)); CHARACTER_DATA.userTypeModifier = new UserTypeModifier(name, SchemaObject.DOMAIN, CHARACTER_DATA); // name = HsqlNameManager.newInfoSchemaObjectName("SQL_IDENTIFIER", false, SchemaObject.DOMAIN); SQL_IDENTIFIER = new CharacterType(Types.SQL_VARCHAR, 128); SQL_IDENTIFIER.userTypeModifier = new UserTypeModifier(name, SchemaObject.DOMAIN, SQL_IDENTIFIER); // name = HsqlNameManager.newInfoSchemaObjectName("TIME_STAMP", false, SchemaObject.DOMAIN); TIME_STAMP = new DateTimeType(Types.SQL_TIMESTAMP, Types.SQL_TIMESTAMP, 6); TIME_STAMP.userTypeModifier = new UserTypeModifier(name, SchemaObject.DOMAIN, TIME_STAMP); // SQL_VARCHAR = Type.SQL_VARCHAR; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementInsert.java0000644000175000017500000001710512007547362022744 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.ParserDQL.CompileContext; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.navigator.RowSetNavigatorClient; import org.hsqldb.persist.PersistentStore; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.types.Type; /** * Implementation of Statement for INSERT statements.

              * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.9.0 */ public class StatementInsert extends StatementDML { int overrideUserValue = -1; /** * Instantiate this as an INSERT_VALUES statement. */ StatementInsert(Session session, Table targetTable, int[] columnMap, Expression insertExpression, boolean[] checkColumns, CompileContext compileContext) { super(StatementTypes.INSERT, StatementTypes.X_SQL_DATA_CHANGE, session.getCurrentSchemaHsqlName()); this.targetTable = targetTable; this.baseTable = targetTable.isTriggerInsertable() ? targetTable : targetTable .getBaseTable(); this.insertColumnMap = columnMap; this.insertCheckColumns = checkColumns; this.insertExpression = insertExpression; setupChecks(); setDatabseObjects(session, compileContext); checkAccessRights(session); isSimpleInsert = insertExpression != null && insertExpression.nodes.length == 1 && updatableTableCheck == null; } /** * Instantiate this as an INSERT_SELECT statement. */ StatementInsert(Session session, Table targetTable, int[] columnMap, boolean[] checkColumns, QueryExpression queryExpression, CompileContext compileContext, int override) { super(StatementTypes.INSERT, StatementTypes.X_SQL_DATA_CHANGE, session.getCurrentSchemaHsqlName()); this.targetTable = targetTable; this.baseTable = targetTable.isTriggerInsertable() ? targetTable : targetTable .getBaseTable(); this.insertColumnMap = columnMap; this.insertCheckColumns = checkColumns; this.queryExpression = queryExpression; this.overrideUserValue = override; setupChecks(); setDatabseObjects(session, compileContext); checkAccessRights(session); } /** * Executes an INSERT_SELECT or INSERT_VALUESstatement. It is assumed that * the argument is of the correct type. * * @return the result of executing the statement */ Result getResult(Session session) { Result resultOut = null; RowSetNavigator generatedNavigator = null; PersistentStore store = baseTable.getRowStore(session); int count; if (generatedIndexes != null) { resultOut = Result.newUpdateCountResult(generatedResultMetaData, 0); generatedNavigator = resultOut.getChainedResult().getNavigator(); } if (isSimpleInsert) { Type[] colTypes = baseTable.getColumnTypes(); Object[] data = getInsertData(session, colTypes, insertExpression.nodes[0].nodes); return insertSingleRow(session, store, data); } RowSetNavigator newDataNavigator = queryExpression == null ? getInsertValuesNavigator(session) : getInsertSelectNavigator(session); count = newDataNavigator.getSize(); if (count > 0) { insertRowSet(session, generatedNavigator, newDataNavigator); } if (baseTable.triggerLists[Trigger.INSERT_AFTER].length > 0) { baseTable.fireTriggers(session, Trigger.INSERT_AFTER, newDataNavigator); } if (resultOut == null) { resultOut = new Result(ResultConstants.UPDATECOUNT, count); } else { resultOut.setUpdateCount(count); } if (count == 0) { session.addWarning(HsqlException.noDataCondition); } return resultOut; } RowSetNavigator getInsertSelectNavigator(Session session) { Type[] colTypes = baseTable.getColumnTypes(); int[] columnMap = insertColumnMap; // Result result = queryExpression.getResult(session, 0); RowSetNavigator nav = result.initialiseNavigator(); Type[] sourceTypes = result.metaData.columnTypes; RowSetNavigatorClient newData = new RowSetNavigatorClient(2); while (nav.hasNext()) { Object[] data = baseTable.getNewRowData(session); Object[] sourceData = (Object[]) nav.getNext(); for (int i = 0; i < columnMap.length; i++) { int j = columnMap[i]; if (j == this.overrideUserValue) { continue; } Type sourceType = sourceTypes[i]; data[j] = colTypes[j].convertToType(session, sourceData[i], sourceType); } newData.add(data); } return newData; } RowSetNavigator getInsertValuesNavigator(Session session) { Type[] colTypes = baseTable.getColumnTypes(); // Expression[] list = insertExpression.nodes; RowSetNavigatorClient newData = new RowSetNavigatorClient(list.length); for (int j = 0; j < list.length; j++) { Expression[] rowArgs = list[j].nodes; Object[] data = getInsertData(session, colTypes, rowArgs); newData.add(data); } return newData; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/index/0000755000175000017500000000000012007570422020044 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/index/Index.java0000644000175000017500000002002012007547416021757 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.index; import org.hsqldb.Row; import org.hsqldb.SchemaObject; import org.hsqldb.Session; import org.hsqldb.TableBase; import org.hsqldb.navigator.RowIterator; import org.hsqldb.persist.PersistentStore; import org.hsqldb.types.Type; /** * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public interface Index extends SchemaObject { int INDEX_NONE = 0; int INDEX_NON_UNIQUE = 1; int INDEX_UNIQUE = 2; // double minimumSelectivity = 16; double cachedFactor = 8; int probeDepth = 4; // Index[] emptyArray = new Index[]{}; IndexUse[] emptyUseArray = new IndexUse[]{}; IndexUse[] asArray(); RowIterator emptyIterator(); public int getPosition(); public void setPosition(int position); public long getPersistenceId(); /** * Returns the count of visible columns used */ public int getColumnCount(); /** * Is this a UNIQUE index? */ public boolean isUnique(); /** * Does this index belong to a constraint? */ public boolean isConstraint(); /** * Returns the array containing column indexes for index */ public int[] getColumns(); /** * Returns the array containing column indexes for index */ public Type[] getColumnTypes(); /** * Returns the count of visible columns used */ public boolean[] getColumnDesc(); /** * Returns the array containing 0, 1, .. column indexes */ public int[] getDefaultColumnMap(); /** * Returns a value indicating the order of different types of index in * the list of indexes for a table. The position of the groups of Indexes * in the list in ascending order is as follows: * * primary key index * unique constraint indexes * autogenerated foreign key indexes for FK's that reference this table or * tables created before this table * user created indexes (CREATE INDEX) * autogenerated foreign key indexes for FK's that reference tables created * after this table * * Among a group of indexes, the order is based on the order of creation * of the index. * * @return ordinal value */ public int getIndexOrderValue(); public boolean isForward(); public void setTable(TableBase table); public void setClustered(boolean clustered); public boolean isClustered(); /** * Returns the node count. */ public long size(Session session, PersistentStore store); public long sizeUnique(PersistentStore store); public double[] searchCost(Session session, PersistentStore store); public boolean isEmpty(PersistentStore store); public void checkIndex(PersistentStore store); /** * Insert a node into the index */ public void insert(Session session, PersistentStore store, Row row); public void delete(Session session, PersistentStore store, Row row); public boolean existsParent(Session session, PersistentStore store, Object[] rowdata, int[] rowColMap); /** * Return the first node equal to the indexdata object. The rowdata has * the same column mapping as this index. * * @param session session object * @param store store object * @param coldata array containing index column data * @param match count of columns to match * @return iterator */ public RowIterator findFirstRow(Session session, PersistentStore store, Object[] rowdata, int matchCount, int distinctCount, int compareType, boolean reversed, boolean[] map); /** * Return the first node equal to the rowdata object. * The rowdata has the same column mapping as this table. * * @param session session object * @param store store object * @param rowdata array containing table row data * @return iterator */ public RowIterator findFirstRow(Session session, PersistentStore store, Object[] rowdata); /** * Return the first node equal to the rowdata object. * The rowdata has the column mapping privided in rowColMap. * * @param session session object * @param store store object * @param rowdata array containing table row data * @return iterator */ public RowIterator findFirstRow(Session session, PersistentStore store, Object[] rowdata, int[] rowColMap); /** * Finds the first node where the data is not null. * * @return iterator */ public RowIterator findFirstRowNotNull(Session session, PersistentStore store); public RowIterator firstRow(PersistentStore store); /** * Returns the row for the first node of the index * * @return Iterator for first row */ public RowIterator firstRow(Session session, PersistentStore store); /** * Returns the row for the last node of the index * * @return last row */ public RowIterator lastRow(Session session, PersistentStore store); /** * Compares two table rows based on the columns of this index. The rowColMap * parameter specifies which columns of the other table are to be compared * with the colIndex columns of this index. The rowColMap can cover all * or only some columns of this index. * * @param a row from another table * @param rowColMap column indexes in the other table * @param b a full row in this table * * @return comparison result, -1,0,+1 */ public int compareRowNonUnique(Session session, Object[] a, Object[] b, int[] rowColMap); public int compareRowNonUnique(Session session, Object[] a, Object[] b, int[] rowColMap, int fieldCount); /** * As above but use the index column data */ public int compareRowNonUnique(Session session, Object[] a, Object[] b, int fieldcount); public int compareRow(Session session, Object[] a, Object[] b); public static class IndexUse { public Index index; public int columnCount; public IndexUse(Index index, int columnCount) { this.index = index; this.columnCount = columnCount; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/index/NodeAVLDiskLarge.java0000644000175000017500000003337212007547416023744 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.index; import java.io.IOException; import org.hsqldb.Row; import org.hsqldb.RowAVLDisk; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.LongLookup; import org.hsqldb.persist.PersistentStore; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputInterface; /** * Subclass of NodeAVL for huge databases. * @author Fred Toussi (fredt@users dot sourceforge dot net) * @version 2.2.9 * @since 2.2.9 */ public class NodeAVLDiskLarge extends NodeAVL { final RowAVLDisk row; // private long iLeft = NO_POS; private long iRight = NO_POS; private long iParent = NO_POS; private int iId; // id of Index object for this Node public static final int SIZE_IN_BYTE = 4 * 4; public NodeAVLDiskLarge(RowAVLDisk r, RowInputInterface in, int id) throws IOException { int ext; row = r; iId = id; ext = in.readInt(); iBalance = (byte) ext; iLeft = in.readInt() & 0xffffffffL; iRight = in.readInt() & 0xffffffffL; iParent = in.readInt() & 0xffffffffL; if (ext > 0xff) { iParent |= (((long) ext << 8) & 0xff00000000L); iLeft |= (((long) ext << 16) & 0xff00000000L); iRight |= (((long) ext << 24) & 0xff00000000L); } if (iLeft == 0) { iLeft = NO_POS; } if (iRight == 0) { iRight = NO_POS; } if (iParent == 0) { iParent = NO_POS; } } public NodeAVLDiskLarge(RowAVLDisk r, int id) { row = r; iId = id; } public void delete() { iLeft = NO_POS; iRight = NO_POS; iParent = NO_POS; nLeft = null; nRight = null; nParent = null; iBalance = 0; row.setNodesChanged(); } public boolean isInMemory() { return row.isInMemory(); } public boolean isMemory() { return false; } public long getPos() { return row.getPos(); } public Row getRow(PersistentStore store) { if (!row.isInMemory()) { return (RowAVLDisk) store.get(this.row, false); } else { row.updateAccessCount(store.getAccessCount()); } return row; } public Object[] getData(PersistentStore store) { return row.getData(); } private NodeAVLDiskLarge findNode(PersistentStore store, long pos) { NodeAVLDiskLarge ret = null; RowAVLDisk r = (RowAVLDisk) store.get(pos, false); if (r != null) { ret = (NodeAVLDiskLarge) r.getNode(iId); } return ret; } boolean isLeft(NodeAVL n) { if (n == null) { return iLeft == NO_POS; } return iLeft == n.getPos(); } boolean isRight(NodeAVL n) { if (n == null) { return iRight == NO_POS; } return iRight == n.getPos(); } NodeAVL getLeft(PersistentStore store) { NodeAVLDiskLarge node = this; RowAVLDisk row = this.row; if (!row.isInMemory()) { row = (RowAVLDisk) store.get(this.row, false); node = (NodeAVLDiskLarge) row.getNode(iId); } if (node.iLeft == NO_POS) { return null; } if (node.nLeft == null || !node.nLeft.isInMemory()) { node.nLeft = findNode(store, node.iLeft); node.nLeft.nParent = node; } return node.nLeft; } NodeAVL getRight(PersistentStore store) { NodeAVLDiskLarge node = this; RowAVLDisk row = this.row; if (!row.isInMemory()) { row = (RowAVLDisk) store.get(this.row, false); node = (NodeAVLDiskLarge) row.getNode(iId); } if (node.iRight == NO_POS) { return null; } if (node.nRight == null || !node.nRight.isInMemory()) { node.nRight = findNode(store, node.iRight); node.nRight.nParent = node; } return node.nRight; } NodeAVL getParent(PersistentStore store) { NodeAVLDiskLarge node = this; RowAVLDisk row = this.row; if (!row.isInMemory()) { row = (RowAVLDisk) store.get(this.row, false); node = (NodeAVLDiskLarge) row.getNode(iId); } if (node.iParent == NO_POS) { return null; } if (node.nParent == null || !node.nParent.isInMemory()) { node.nParent = findNode(store, iParent); } return node.nParent; } public int getBalance(PersistentStore store) { NodeAVLDiskLarge node = this; RowAVLDisk row = this.row; if (!row.isInMemory()) { row = (RowAVLDisk) store.get(this.row, false); node = (NodeAVLDiskLarge) row.getNode(iId); } return node.iBalance; } boolean isRoot(PersistentStore store) { NodeAVLDiskLarge node = this; RowAVLDisk row = this.row; if (!row.isInMemory()) { row = (RowAVLDisk) store.get(this.row, false); node = (NodeAVLDiskLarge) row.getNode(iId); } return node.iParent == NO_POS; } boolean isFromLeft(PersistentStore store) { NodeAVLDiskLarge node = this; RowAVLDisk row = this.row; if (!row.isInMemory()) { row = (RowAVLDisk) store.get(this.row, false); node = (NodeAVLDiskLarge) row.getNode(iId); } if (node.iParent == NO_POS) { return true; } if (node.nParent == null || !node.nParent.isInMemory()) { node.nParent = findNode(store, iParent); } return row.getPos() == ((NodeAVLDiskLarge) node.nParent).iLeft; } public NodeAVL child(PersistentStore store, boolean isleft) { return isleft ? getLeft(store) : getRight(store); } NodeAVL setParent(PersistentStore store, NodeAVL n) { NodeAVLDiskLarge node = this; RowAVLDisk row = this.row; if (!row.keepInMemory(true)) { row = (RowAVLDisk) store.get(this.row, true); node = (NodeAVLDiskLarge) row.getNode(iId); } if (!row.isInMemory()) { row.keepInMemory(false); throw Error.runtimeError(ErrorCode.U_S0500, "NodeAVLDisk"); } row.setNodesChanged(); node.iParent = n == null ? NO_POS : n.getPos(); if (n != null && !n.isInMemory()) { n = findNode(store, n.getPos()); } node.nParent = (NodeAVLDiskLarge) n; row.keepInMemory(false); return node; } public NodeAVL setBalance(PersistentStore store, int b) { NodeAVLDiskLarge node = this; RowAVLDisk row = this.row; if (!row.keepInMemory(true)) { row = (RowAVLDisk) store.get(this.row, true); node = (NodeAVLDiskLarge) row.getNode(iId); } if (!row.isInMemory()) { throw Error.runtimeError(ErrorCode.U_S0500, "NodeAVLDisk"); } row.setNodesChanged(); node.iBalance = b; row.keepInMemory(false); return node; } NodeAVL setLeft(PersistentStore store, NodeAVL n) { NodeAVLDiskLarge node = this; RowAVLDisk row = this.row; if (!row.keepInMemory(true)) { row = (RowAVLDisk) store.get(this.row, true); node = (NodeAVLDiskLarge) row.getNode(iId); } if (!row.isInMemory()) { throw Error.runtimeError(ErrorCode.U_S0500, "NodeAVLDisk"); } row.setNodesChanged(); node.iLeft = n == null ? NO_POS : n.getPos(); if (n != null && !n.isInMemory()) { n = findNode(store, n.getPos()); } node.nLeft = (NodeAVLDiskLarge) n; row.keepInMemory(false); return node; } NodeAVL setRight(PersistentStore store, NodeAVL n) { NodeAVLDiskLarge node = this; RowAVLDisk row = this.row; if (!row.keepInMemory(true)) { row = (RowAVLDisk) store.get(this.row, true); node = (NodeAVLDiskLarge) row.getNode(iId); } if (!row.isInMemory()) { throw Error.runtimeError(ErrorCode.U_S0500, "NodeAVLDisk"); } row.setNodesChanged(); node.iRight = n == null ? NO_POS : n.getPos(); if (n != null && !n.isInMemory()) { n = findNode(store, n.getPos()); } node.nRight = (NodeAVLDiskLarge) n; row.keepInMemory(false); return node; } public NodeAVL set(PersistentStore store, boolean isLeft, NodeAVL n) { NodeAVL x; if (isLeft) { x = setLeft(store, n); } else { x = setRight(store, n); } if (n != null) { n.setParent(store, this); } return x; } public void replace(PersistentStore store, Index index, NodeAVL n) { NodeAVLDiskLarge node = this; RowAVLDisk row = this.row; if (!row.keepInMemory(true)) { row = (RowAVLDisk) store.get(this.row, true); node = (NodeAVLDiskLarge) row.getNode(iId); } if (node.iParent == NO_POS) { if (n != null) { n = n.setParent(store, null); } store.setAccessor(index, n); } else { boolean isFromLeft = node.isFromLeft(store); node.getParent(store).set(store, isFromLeft, n); } row.keepInMemory(false); } boolean equals(NodeAVL n) { if (n instanceof NodeAVLDiskLarge) { return this == n || row.getPos() == ((NodeAVLDiskLarge) n).getPos(); } return false; } public int getRealSize(RowOutputInterface out) { return NodeAVLDiskLarge.SIZE_IN_BYTE; } public void setInMemory(boolean in) { if (!in) { if (nLeft != null) { nLeft.nParent = null; } if (nRight != null) { nRight.nParent = null; } if (nParent != null) { if (row.getPos() == ((NodeAVLDiskLarge) nParent).iLeft) { nParent.nLeft = null; } else { nParent.nRight = null; } } nLeft = nRight = nParent = null; } } public void write(RowOutputInterface out) { write(out, null); } public void write(RowOutputInterface out, LongLookup lookup) { long leftTemp = getTranslatePointer(iLeft, lookup); long rightTemp = getTranslatePointer(iRight, lookup); long parentTemp = getTranslatePointer(iParent, lookup); int ext = 0; ext |= (int) ((parentTemp & 0xff00000000L) >> 8); ext |= (int) ((leftTemp & 0xff00000000L) >> 16); ext |= (int) ((rightTemp & 0xff00000000L) >> 24); if (ext == 0) { ext = iBalance; } else { ext |= (iBalance & 0xff); } out.writeInt(ext); out.writeInt((int) leftTemp); out.writeInt((int) rightTemp); out.writeInt((int) parentTemp); } private static long getTranslatePointer(long pointer, LongLookup lookup) { long newPointer = 0; if (pointer != NodeAVL.NO_POS) { if (lookup == null) { newPointer = pointer; } else { newPointer = lookup.lookup(pointer); } } return newPointer; } public void restore() {} public void destroy() {} public void updateAccessCount(int count) {} public int getAccessCount() { return 0; } public void setStorageSize(int size) {} public int getStorageSize() { return 0; } public void setPos(long pos) {} public boolean hasChanged() { return false; } public boolean isKeepInMemory() { return false; } public boolean keepInMemory(boolean keep) { return false; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/index/IndexAVLMemory.java0000644000175000017500000004126312007547416023527 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2010, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.index; import org.hsqldb.Constraint; import org.hsqldb.HsqlNameManager; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.Row; import org.hsqldb.RowAVL; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.TableBase; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.persist.PersistentStore; import org.hsqldb.types.Type; /** * Implementation of an AVL for memory tables.

              * * New class derived from Hypersonic SQL code and enhanced in HSQLDB.

              * * @author Thomas Mueller (Hypersonic SQL Group) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since Hypersonic SQL */ public class IndexAVLMemory extends IndexAVL { /** * Constructor declaration * * @param name HsqlName of the index * @param id persistnece id * @param table table of the index * @param columns array of column indexes * @param descending boolean[] * @param nullsLast boolean[] * @param colTypes array of column types * @param pk if index is for a primary key * @param unique is this a unique index * @param constraint does this index belonging to a constraint * @param forward is this an auto-index for an FK that refers to a table * defined after this table */ public IndexAVLMemory(HsqlName name, long id, TableBase table, int[] columns, boolean[] descending, boolean[] nullsLast, Type[] colTypes, boolean pk, boolean unique, boolean constraint, boolean forward) { super(name, id, table, columns, descending, nullsLast, colTypes, pk, unique, constraint, forward); } public void checkIndex(PersistentStore store) { readLock.lock(); try { NodeAVL p = getAccessor(store); NodeAVL f = null; while (p != null) { f = p; checkNodes(store, p); p = p.nLeft; } p = f; while (f != null) { checkNodes(store, f); f = next(store, f); } } finally { readLock.unlock(); } } void checkNodes(PersistentStore store, NodeAVL p) { NodeAVL l = p.nLeft; NodeAVL r = p.nRight; if (l != null && l.getBalance(store) == -2) { System.out.print("broken index - deleted"); } if (r != null && r.getBalance(store) == -2) { System.out.print("broken index -deleted"); } if (l != null && !p.equals(l.getParent(store))) { System.out.print("broken index - no parent"); } if (r != null && !p.equals(r.getParent(store))) { System.out.print("broken index - no parent"); } } /** * Insert a node into the index */ public void insert(Session session, PersistentStore store, Row row) { NodeAVL n; NodeAVL x; boolean isleft = true; int compare = -1; final Object[] rowData = row.getData(); boolean compareRowId = !isUnique || hasNulls(session, rowData); boolean compareSimple = isSimple; writeLock.lock(); try { n = getAccessor(store); x = n; if (n == null) { store.setAccessor(this, ((RowAVL) row).getNode(position)); return; } while (true) { Row currentRow = n.row; compare = 0; if (compareSimple) { compare = colTypes[0].compare(session, rowData[colIndex[0]], currentRow.getData()[colIndex[0]]); if (compare == 0 && compareRowId) { compare = compareRowForInsertOrDelete(session, row, currentRow, compareRowId, 1); } } else { compare = compareRowForInsertOrDelete(session, row, currentRow, compareRowId, 0); } // after the first match and check, all compares are with row id if (compare == 0 && session != null && !compareRowId && session.database.txManager.isMVRows()) { if (!isEqualReadable(session, store, n)) { compareRowId = true; compare = compareRowForInsertOrDelete(session, row, currentRow, compareRowId, colIndex.length); } } if (compare == 0) { if (isConstraint) { Constraint c = ((Table) table).getUniqueConstraintForIndex(this); throw c.getException(row.getData()); } else { throw Error.error(ErrorCode.X_23505, name.statementName); } } isleft = compare < 0; x = n; n = isleft ? x.nLeft : x.nRight; if (n == null) { break; } } x = x.set(store, isleft, ((RowAVL) row).getNode(position)); balance(store, x, isleft); } finally { writeLock.unlock(); } } void delete(PersistentStore store, NodeAVL x) { if (x == null) { return; } NodeAVL n; writeLock.lock(); try { if (x.nLeft == null) { n = x.nRight; } else if (x.nRight == null) { n = x.nLeft; } else { NodeAVL d = x; x = x.nLeft; while (true) { NodeAVL temp = x.nRight; if (temp == null) { break; } x = temp; } // x will be replaced with n later n = x.nLeft; // swap d and x int b = x.iBalance; x.iBalance = d.iBalance; d.iBalance = b; // set x.parent NodeAVL xp = x.nParent; NodeAVL dp = d.nParent; if (d.isRoot(store)) { store.setAccessor(this, x); } x.nParent = dp; if (dp != null) { if (dp.nRight == d) { dp.nRight = x; } else { dp.nLeft = x; } } // relink d.parent, x.left, x.right if (d == xp) { d.nParent = x; if (d.nLeft == x) { x.nLeft = d; NodeAVL dr = d.nRight; x.nRight = dr; } else { x.nRight = d; NodeAVL dl = d.nLeft; x.nLeft = dl; } } else { d.nParent = xp; xp.nRight = d; NodeAVL dl = d.nLeft; NodeAVL dr = d.nRight; x.nLeft = dl; x.nRight = dr; } x.nRight.nParent = x; x.nLeft.nParent = x; // set d.left, d.right d.nLeft = n; if (n != null) { n.nParent = d; } d.nRight = null; x = d; } boolean isleft = x.isFromLeft(store); x.replace(store, this, n); n = x.nParent; x.delete(); while (n != null) { x = n; int sign = isleft ? 1 : -1; switch (x.iBalance * sign) { case -1 : x.iBalance = 0; break; case 0 : x.iBalance = sign; return; case 1 : NodeAVL r = x.child(store, !isleft); int b = r.iBalance; if (b * sign >= 0) { x.replace(store, this, r); NodeAVL child = r.child(store, isleft); x.set(store, !isleft, child); r.set(store, isleft, x); if (b == 0) { x.iBalance = sign; r.iBalance = -sign; return; } x.iBalance = 0; r.iBalance = 0; x = r; } else { NodeAVL l = r.child(store, isleft); x.replace(store, this, l); b = l.iBalance; r.set(store, isleft, l.child(store, !isleft)); l.set(store, !isleft, r); x.set(store, !isleft, l.child(store, isleft)); l.set(store, isleft, x); x.iBalance = (b == sign) ? -sign : 0; r.iBalance = (b == -sign) ? sign : 0; l.iBalance = 0; x = l; } } isleft = x.isFromLeft(store); n = x.nParent; } } finally { writeLock.unlock(); } } NodeAVL next(PersistentStore store, NodeAVL x) { NodeAVL r = x.nRight; if (r != null) { x = r; NodeAVL l = x.nLeft; while (l != null) { x = l; l = x.nLeft; } return x; } NodeAVL ch = x; x = x.nParent; while (x != null && ch == x.nRight) { ch = x; x = x.nParent; } return x; } NodeAVL last(PersistentStore store, NodeAVL x) { if (x == null) { return null; } NodeAVL left = x.nLeft; if (left != null) { x = left; NodeAVL right = x.nRight; while (right != null) { x = right; right = x.nRight; } return x; } NodeAVL ch = x; x = x.nParent; while (x != null && ch.equals(x.nLeft)) { ch = x; x = x.nParent; } return x; } /** * Balances part of the tree after an alteration to the index. */ void balance(PersistentStore store, NodeAVL x, boolean isleft) { while (true) { int sign = isleft ? 1 : -1; switch (x.iBalance * sign) { case 1 : x.iBalance = 0; return; case 0 : x.iBalance = -sign; break; case -1 : NodeAVL l = isleft ? x.nLeft : x.nRight; if (l.iBalance == -sign) { x.replace(store, this, l); x.set(store, isleft, l.child(store, !isleft)); l.set(store, !isleft, x); x.iBalance = 0; l.iBalance = 0; } else { NodeAVL r = !isleft ? l.nLeft : l.nRight; x.replace(store, this, r); l.set(store, !isleft, r.child(store, isleft)); r.set(store, isleft, l); x.set(store, isleft, r.child(store, !isleft)); r.set(store, !isleft, x); int rb = r.iBalance; x.iBalance = (rb == -sign) ? sign : 0; l.iBalance = (rb == sign) ? -sign : 0; r.iBalance = 0; } return; } if (x.nParent == null) { return; } isleft = x.nParent == null || x == x.nParent.nLeft; x = x.nParent; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/index/IndexAVL.java0000644000175000017500000016305112007547416022336 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.index; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.hsqldb.Constraint; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.OpTypes; import org.hsqldb.Row; import org.hsqldb.RowAVL; import org.hsqldb.SchemaObject; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.TableBase; import org.hsqldb.Tokens; import org.hsqldb.TransactionManager; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.ReadWriteLockDummy; import org.hsqldb.navigator.RowIterator; import org.hsqldb.persist.PersistentStore; import org.hsqldb.rights.Grantee; import org.hsqldb.types.Type; // fredt@users 20020221 - patch 513005 by sqlbob@users - corrections // fredt@users - patch 1.8.0 - reworked the interface and comparison methods // fredt@users - patch 1.8.0 - improved reliability for cached indexes // fredt@users - patch 1.9.0 - iterators and concurrency // fredt@users - patch 2.0.0 - enhanced selection and iterators /** * Implementation of an AVL tree with parent pointers in nodes. Subclasses * of Node implement the tree node objects for memory or disk storage. An * Index has a root Node that is linked with other nodes using Java Object * references or file pointers, depending on Node implementation.

              * An Index object also holds information on table columns (in the form of int * indexes) that are covered by it.

              * * New class derived from Hypersonic SQL code and enhanced in HSQLDB.

              * * @author Thomas Mueller (Hypersonic SQL Group) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since Hypersonic SQL */ public class IndexAVL implements Index { private static final IndexRowIterator emptyIterator = new IndexRowIterator(null, (PersistentStore) null, null, null, 0, false, false); // fields private final long persistenceId; protected final HsqlName name; private final boolean[] colCheck; final int[] colIndex; private final int[] defaultColMap; final Type[] colTypes; private final boolean[] colDesc; private final boolean[] nullsLast; final boolean isSimpleOrder; final boolean isSimple; protected final boolean isPK; // PK with or without columns protected final boolean isUnique; // DDL uniqueness protected final boolean isConstraint; private final boolean isForward; private boolean isClustered; protected TableBase table; int position; private IndexUse[] asArray; // Object[] nullData; // ReadWriteLock lock; Lock readLock; Lock writeLock; /** * Constructor declaration * * @param name HsqlName of the index * @param id persistnece id * @param table table of the index * @param columns array of column indexes * @param descending boolean[] * @param nullsLast boolean[] * @param colTypes array of column types * @param pk if index is for a primary key * @param unique is this a unique index * @param constraint does this index belonging to a constraint * @param forward is this an auto-index for an FK that refers to a table * defined after this table */ public IndexAVL(HsqlName name, long id, TableBase table, int[] columns, boolean[] descending, boolean[] nullsLast, Type[] colTypes, boolean pk, boolean unique, boolean constraint, boolean forward) { this.persistenceId = id; this.name = name; this.colIndex = columns; this.colTypes = colTypes; this.colDesc = descending == null ? new boolean[columns.length] : descending; this.nullsLast = nullsLast == null ? new boolean[columns.length] : nullsLast; this.isPK = pk; this.isUnique = unique; this.isConstraint = constraint; this.isForward = forward; this.table = table; this.colCheck = table.getNewColumnCheckList(); this.asArray = new IndexUse[]{ new IndexUse(this, colIndex.length) }; ArrayUtil.intIndexesToBooleanArray(colIndex, colCheck); this.defaultColMap = new int[columns.length]; ArrayUtil.fillSequence(defaultColMap); boolean simpleOrder = colIndex.length > 0; for (int i = 0; i < colDesc.length; i++) { if (this.colDesc[i] || this.nullsLast[i]) { simpleOrder = false; } } isSimpleOrder = simpleOrder; isSimple = isSimpleOrder && colIndex.length == 1; nullData = new Object[colIndex.length]; // switch (table.getTableType()) { case TableBase.MEMORY_TABLE : case TableBase.CACHED_TABLE : case TableBase.TEXT_TABLE : lock = new ReentrantReadWriteLock(); break; default : lock = new ReadWriteLockDummy(); break; } readLock = lock.readLock(); writeLock = lock.writeLock(); } // SchemaObject implementation public int getType() { return SchemaObject.INDEX; } public HsqlName getName() { return name; } public HsqlName getCatalogName() { return name.schema.schema; } public HsqlName getSchemaName() { return name.schema; } public Grantee getOwner() { return name.schema.owner; } public OrderedHashSet getReferences() { return new OrderedHashSet(); } public OrderedHashSet getComponents() { return null; } public void compile(Session session, SchemaObject parentObject) {} public String getSQL() { StringBuffer sb = new StringBuffer(); sb = new StringBuffer(64); sb.append(Tokens.T_CREATE).append(' '); if (isUnique()) { sb.append(Tokens.T_UNIQUE).append(' '); } sb.append(Tokens.T_INDEX).append(' '); sb.append(getName().statementName); sb.append(' ').append(Tokens.T_ON).append(' '); sb.append(((Table) table).getName().getSchemaQualifiedStatementName()); sb.append(((Table) table).getColumnListSQL(colIndex, colIndex.length)); return sb.toString(); } public long getChangeTimestamp() { return 0; } // IndexInterface public IndexUse[] asArray() { return asArray; } public RowIterator emptyIterator() { return emptyIterator; } public int getPosition() { return position; } public void setPosition(int position) { this.position = position; } public long getPersistenceId() { return persistenceId; } /** * Returns the count of visible columns used */ public int getColumnCount() { return colIndex.length; } /** * Is this a UNIQUE index? */ public boolean isUnique() { return isUnique; } /** * Does this index belong to a constraint? */ public boolean isConstraint() { return isConstraint; } /** * Returns the array containing column indexes for index */ public int[] getColumns() { return colIndex; } /** * Returns the array containing column indexes for index */ public Type[] getColumnTypes() { return colTypes; } public boolean[] getColumnDesc() { return colDesc; } public int[] getDefaultColumnMap() { return this.defaultColMap; } /** * Returns a value indicating the order of different types of index in * the list of indexes for a table. The position of the groups of Indexes * in the list in ascending order is as follows: * * primary key index * unique constraint indexes * autogenerated foreign key indexes for FK's that reference this table or * tables created before this table * user created indexes (CREATE INDEX) * autogenerated foreign key indexes for FK's that reference tables created * after this table * * Among a group of indexes, the order is based on the order of creation * of the index. * * @return ordinal value */ public int getIndexOrderValue() { if (isPK) { return 0; } if (isConstraint) { return isForward ? 4 : isUnique ? 0 : 1; } else { return 2; } } public boolean isForward() { return isForward; } public void setTable(TableBase table) { this.table = table; } public void setClustered(boolean clustered) { isClustered = clustered; } public boolean isClustered() { return isClustered; } /** * Returns the node count. */ public long size(Session session, PersistentStore store) { readLock.lock(); try { return store.elementCount(session); } finally { readLock.unlock(); } } public long sizeUnique(PersistentStore store) { readLock.lock(); try { return store.elementCountUnique(this); } finally { readLock.unlock(); } } public double[] searchCost(Session session, PersistentStore store) { boolean probeDeeper = false; int counter = 1; double[] changes = new double[colIndex.length]; int depth = 0; int[] depths = new int[1]; readLock.lock(); try { NodeAVL node = getAccessor(store); NodeAVL temp = node; if (node == null) { return new double[colIndex.length]; } while (true) { node = temp; temp = node.getLeft(store); if (temp == null) { break; } if (depth == Index.probeDepth) { probeDeeper = true; break; } depth++; } while (true) { temp = next(store, node, depth, probeDepth, depths); depth = depths[0]; if (temp == null) { break; } compareRowForChange(session, node.getData(store), temp.getData(store), changes); node = temp; counter++; } if (probeDeeper) { double[] factors = new double[colIndex.length]; int extras = probeFactor(session, store, factors, true) + probeFactor(session, store, factors, false); for (int i = 0; i < colIndex.length; i++) { factors[i] /= 2; for (int j = 0; j < factors[i]; j++) { changes[i] *= 2; } } } long rowCount = store.elementCount(); for (int i = 0; i < colIndex.length; i++) { if (changes[i] == 0) { changes[i] = 1; } changes[i] = rowCount / changes[i]; if (changes[i] < 2) { changes[i] = 2; } } /* StringBuffer s = new StringBuffer(); s.append("count " + rowCount + " columns " + colIndex.length + " selectivity " + changes[0]); System.out.println(s); */ return changes; } finally { readLock.unlock(); } } int probeFactor(Session session, PersistentStore store, double[] changes, boolean left) { int depth = 0; NodeAVL x = getAccessor(store); NodeAVL n = x; if (x == null) { return 0; } while (n != null) { x = n; n = left ? x.getLeft(store) : x.getRight(store); depth++; if (depth > probeDepth && n != null) { compareRowForChange(session, x.getData(store), n.getData(store), changes); } } return depth - probeDepth; } public int getNodeCount(Session session, PersistentStore store) { int count = 0; readLock.lock(); try { RowIterator it = firstRow(session, store); while (it.hasNext()) { it.getNextRow(); count++; } return count; } finally { readLock.unlock(); } } public boolean isEmpty(PersistentStore store) { readLock.lock(); try { return getAccessor(store) == null; } finally { readLock.unlock(); } } /** * Removes all links between memory nodes */ public void unlinkNodes(NodeAVL primaryRoot) { writeLock.lock(); try { NodeAVL x = primaryRoot; NodeAVL l = x; while (l != null) { x = l; l = x.getLeft(null); } while (x != null) { NodeAVL n = nextUnlink(x); x = n; } } finally { writeLock.unlock(); } } private NodeAVL nextUnlink(NodeAVL x) { NodeAVL temp = x.getRight(null); if (temp != null) { x = temp; temp = x.getLeft(null); while (temp != null) { x = temp; temp = x.getLeft(null); } return x; } temp = x; x = x.getParent(null); while (x != null && x.isRight(temp)) { x.nRight = null; temp.getRow(null).destroy(); temp.delete(); // temp = x; x = x.getParent(null); } if (x != null) { x.nLeft = null; } temp.getRow(null).destroy(); temp.delete(); return x; } public void checkIndex(PersistentStore store) { readLock.lock(); try { NodeAVL p = getAccessor(store); NodeAVL f = null; while (p != null) { f = p; checkNodes(store, p); p = p.getLeft(store); } p = f; while (f != null) { checkNodes(store, f); f = next(store, f); } } finally { readLock.unlock(); } } void checkNodes(PersistentStore store, NodeAVL p) { NodeAVL l = p.getLeft(store); NodeAVL r = p.getRight(store); if (l != null && l.getBalance(store) == -2) { System.out.print("broken index - deleted"); } if (r != null && r.getBalance(store) == -2) { System.out.print("broken index -deleted"); } if (l != null && !p.equals(l.getParent(store))) { System.out.print("broken index - no parent"); } if (r != null && !p.equals(r.getParent(store))) { System.out.print("broken index - no parent"); } } /** * Compares two table rows based on the columns of this index. The rowColMap * parameter specifies which columns of the other table are to be compared * with the colIndex columns of this index. The rowColMap can cover all or * only some columns of this index. * * @param session Session * @param a row from another table * @param rowColMap column indexes in the other table * @param b a full row in this table * @return comparison result, -1,0,+1 */ public int compareRowNonUnique(Session session, Object[] a, Object[] b, int[] rowColMap) { int fieldcount = rowColMap.length; for (int j = 0; j < fieldcount; j++) { int i = colTypes[j].compare(session, a[colIndex[j]], b[rowColMap[j]]); if (i != 0) { return i; } } return 0; } public int compareRowNonUnique(Session session, Object[] a, Object[] b, int[] rowColMap, int fieldCount) { for (int j = 0; j < fieldCount; j++) { int i = colTypes[j].compare(session, a[colIndex[j]], b[rowColMap[j]]); if (i != 0) { return i; } } return 0; } /** * As above but use the index column data */ public int compareRowNonUnique(Session session, Object[] a, Object[] b, int fieldCount) { for (int j = 0; j < fieldCount; j++) { int i = colTypes[j].compare(session, a[colIndex[j]], b[colIndex[j]]); if (i != 0) { return i; } } return 0; } public void compareRowForChange(Session session, Object[] a, Object[] b, double[] changes) { for (int j = 0; j < colIndex.length; j++) { boolean lastDiff = false; int i = colTypes[j].compare(session, a[colIndex[j]], b[colIndex[j]]); if (lastDiff || i != 0) { changes[j]++; lastDiff = true; } } } public int compareRow(Session session, Object[] a, Object[] b) { for (int j = 0; j < colIndex.length; j++) { int i = colTypes[j].compare(session, a[colIndex[j]], b[colIndex[j]]); if (i != 0) { if (isSimpleOrder) { return i; } boolean nulls = a[colIndex[j]] == null || b[colIndex[j]] == null; if (colDesc[j] && !nulls) { i = -i; } if (nullsLast[j] && nulls) { i = -i; } return i; } } return 0; } /** * Compare two rows of the table for inserting rows into unique indexes * Supports descending columns. * * @param session Session * @param newRow data * @param existingRow data * @param useRowId boolean * @param start int * @return comparison result, -1,0,+1 */ int compareRowForInsertOrDelete(Session session, Row newRow, Row existingRow, boolean useRowId, int start) { Object[] a = newRow.getData(); Object[] b = existingRow.getData(); for (int j = start; j < colIndex.length; j++) { int i = colTypes[j].compare(session, a[colIndex[j]], b[colIndex[j]]); if (i != 0) { if (isSimpleOrder) { return i; } boolean nulls = a[colIndex[j]] == null || b[colIndex[j]] == null; if (colDesc[j] && !nulls) { i = -i; } if (nullsLast[j] && nulls) { i = -i; } return i; } } if (useRowId) { long diff = newRow.getPos() - existingRow.getPos(); return diff == 0L ? 0 : diff > 0L ? 1 : -1; } return 0; } int compareObject(Session session, Object[] a, Object[] b, int[] rowColMap, int position) { return colTypes[position].compare(session, a[colIndex[position]], b[rowColMap[position]]); } boolean hasNulls(Session session, Object[] rowData) { if (colIndex.length == 1) { return rowData[colIndex[0]] == null; } boolean normal = session == null ? true : session.database.sqlUniqueNulls; for (int j = 0; j < colIndex.length; j++) { if (rowData[colIndex[j]] == null) { if (normal) { return true; } } else { if (!normal) { return false; } } } return !normal; } /** * Insert a node into the index */ public void insert(Session session, PersistentStore store, Row row) { NodeAVL n; NodeAVL x; boolean isleft = true; int compare = -1; boolean compareRowId = !isUnique || hasNulls(session, row.getData()); writeLock.lock(); store.writeLock(); try { n = getAccessor(store); x = n; if (n == null) { store.setAccessor(this, ((RowAVL) row).getNode(position)); return; } while (true) { Row currentRow = n.getRow(store); compare = compareRowForInsertOrDelete(session, row, currentRow, compareRowId, 0); // after the first match and check, all compares are with row id if (compare == 0 && session != null && !compareRowId && session.database.txManager.isMVRows()) { if (!isEqualReadable(session, store, n)) { compareRowId = true; compare = compareRowForInsertOrDelete(session, row, currentRow, compareRowId, colIndex.length); } } if (compare == 0) { Constraint c = null; if (isConstraint) { c = ((Table) table).getUniqueConstraintForIndex(this); } if (c == null) { throw Error.error(ErrorCode.X_23505, name.statementName); } else { throw c.getException(row.getData()); } } isleft = compare < 0; x = n; n = x.child(store, isleft); if (n == null) { break; } } x = x.set(store, isleft, ((RowAVL) row).getNode(position)); balance(store, x, isleft); } catch (RuntimeException e) { throw e; } finally { store.writeUnlock(); writeLock.unlock(); } } public void delete(Session session, PersistentStore store, Row row) { if (!row.isInMemory()) { row = (Row) store.get(row, false); } NodeAVL node = ((RowAVL) row).getNode(position); if (node != null) { delete(store, node); } } void delete(PersistentStore store, NodeAVL x) { if (x == null) { return; } NodeAVL n; writeLock.lock(); store.writeLock(); try { if (x.getLeft(store) == null) { n = x.getRight(store); } else if (x.getRight(store) == null) { n = x.getLeft(store); } else { NodeAVL d = x; x = x.getLeft(store); while (true) { NodeAVL temp = x.getRight(store); if (temp == null) { break; } x = temp; } // x will be replaced with n later n = x.getLeft(store); // swap d and x int b = x.getBalance(store); x = x.setBalance(store, d.getBalance(store)); d = d.setBalance(store, b); // set x.parent NodeAVL xp = x.getParent(store); NodeAVL dp = d.getParent(store); if (d.isRoot(store)) { store.setAccessor(this, x); } x = x.setParent(store, dp); if (dp != null) { if (dp.isRight(d)) { dp = dp.setRight(store, x); } else { dp = dp.setLeft(store, x); } } // relink d.parent, x.left, x.right if (d.equals(xp)) { d = d.setParent(store, x); if (d.isLeft(x)) { x = x.setLeft(store, d); NodeAVL dr = d.getRight(store); x = x.setRight(store, dr); } else { x = x.setRight(store, d); NodeAVL dl = d.getLeft(store); x = x.setLeft(store, dl); } } else { d = d.setParent(store, xp); xp = xp.setRight(store, d); NodeAVL dl = d.getLeft(store); NodeAVL dr = d.getRight(store); x = x.setLeft(store, dl); x = x.setRight(store, dr); } x.getRight(store).setParent(store, x); x.getLeft(store).setParent(store, x); // set d.left, d.right d = d.setLeft(store, n); if (n != null) { n = n.setParent(store, d); } d = d.setRight(store, null); x = d; } boolean isleft = x.isFromLeft(store); x.replace(store, this, n); n = x.getParent(store); x.delete(); while (n != null) { x = n; int sign = isleft ? 1 : -1; switch (x.getBalance(store) * sign) { case -1 : x = x.setBalance(store, 0); break; case 0 : x = x.setBalance(store, sign); return; case 1 : NodeAVL r = x.child(store, !isleft); int b = r.getBalance(store); if (b * sign >= 0) { x.replace(store, this, r); NodeAVL child = r.child(store, isleft); x = x.set(store, !isleft, child); r = r.set(store, isleft, x); if (b == 0) { x = x.setBalance(store, sign); r = r.setBalance(store, -sign); return; } x = x.setBalance(store, 0); r = r.setBalance(store, 0); x = r; } else { NodeAVL l = r.child(store, isleft); x.replace(store, this, l); b = l.getBalance(store); r = r.set(store, isleft, l.child(store, !isleft)); l = l.set(store, !isleft, r); x = x.set(store, !isleft, l.child(store, isleft)); l = l.set(store, isleft, x); x = x.setBalance(store, (b == sign) ? -sign : 0); r = r.setBalance(store, (b == -sign) ? sign : 0); l = l.setBalance(store, 0); x = l; } } isleft = x.isFromLeft(store); n = x.getParent(store); } } catch (RuntimeException e) { throw e; } finally { store.writeUnlock(); writeLock.unlock(); } } public boolean existsParent(Session session, PersistentStore store, Object[] rowdata, int[] rowColMap) { NodeAVL node = findNode(session, store, rowdata, rowColMap, rowColMap.length, OpTypes.EQUAL, TransactionManager.ACTION_REF, false); return node != null; } /** * Return the first node equal to the indexdata object. The rowdata has the * same column mapping as this index. * * @param session session object * @param store store object * @param rowdata array containing index column data * @param matchCount count of columns to match * @param compareType int * @param reversed boolean * @param map boolean[] * @return iterator */ public RowIterator findFirstRow(Session session, PersistentStore store, Object[] rowdata, int matchCount, int distinctCount, int compareType, boolean reversed, boolean[] map) { if (compareType == OpTypes.MAX) { return lastRow(session, store); } NodeAVL node = findNode(session, store, rowdata, defaultColMap, matchCount, compareType, TransactionManager.ACTION_READ, reversed); if (node == null) { return emptyIterator; } return new IndexRowIterator(session, store, this, node, distinctCount, false, reversed); } /** * Return the first node equal to the rowdata object. * The rowdata has the same column mapping as this table. * * @param session session object * @param store store object * @param rowdata array containing table row data * @return iterator */ public RowIterator findFirstRow(Session session, PersistentStore store, Object[] rowdata) { NodeAVL node = findNode(session, store, rowdata, colIndex, colIndex.length, OpTypes.EQUAL, TransactionManager.ACTION_READ, false); if (node == null) { return emptyIterator; } return new IndexRowIterator(session, store, this, node, 0, false, false); } /** * Return the first node equal to the rowdata object. The rowdata has the * column mapping provided in rowColMap. * * @param session session object * @param store store object * @param rowdata array containing table row data * @param rowColMap int[] * @return iterator */ public RowIterator findFirstRow(Session session, PersistentStore store, Object[] rowdata, int[] rowColMap) { NodeAVL node = findNode(session, store, rowdata, rowColMap, rowColMap.length, OpTypes.EQUAL, TransactionManager.ACTION_READ, false); if (node == null) { return emptyIterator; } return new IndexRowIterator(session, store, this, node, 0, false, false); } /** * Finds the first node where the data is not null. * * @return iterator */ public RowIterator findFirstRowNotNull(Session session, PersistentStore store) { NodeAVL node = findNode(session, store, nullData, this.defaultColMap, 1, OpTypes.NOT, TransactionManager.ACTION_READ, false); if (node == null) { return emptyIterator; } return new IndexRowIterator(session, store, this, node, 0, false, false); } /** * Returns the row for the first node of the index * * @return Iterator for first row */ public RowIterator firstRow(Session session, PersistentStore store) { readLock.lock(); try { NodeAVL x = getAccessor(store); NodeAVL l = x; while (l != null) { x = l; l = x.getLeft(store); } while (session != null && x != null) { Row row = x.getRow(store); if (session.database.txManager.canRead( session, row, TransactionManager.ACTION_READ, null)) { break; } x = next(store, x); } if (x == null) { return emptyIterator; } return new IndexRowIterator(session, store, this, x, 0, false, false); } finally { readLock.unlock(); } } public RowIterator firstRow(PersistentStore store) { readLock.lock(); try { NodeAVL x = getAccessor(store); NodeAVL l = x; while (l != null) { x = l; l = x.getLeft(store); } if (x == null) { return emptyIterator; } return new IndexRowIterator(null, store, this, x, 0, false, false); } finally { readLock.unlock(); } } /** * Returns the row for the last node of the index * * @return last row */ public RowIterator lastRow(Session session, PersistentStore store) { readLock.lock(); try { NodeAVL x = getAccessor(store); NodeAVL l = x; while (l != null) { x = l; l = x.getRight(store); } while (session != null && x != null) { Row row = x.getRow(store); if (session.database.txManager.canRead( session, row, TransactionManager.ACTION_READ, null)) { break; } x = last(store, x); } if (x == null) { return emptyIterator; } return new IndexRowIterator(session, store, this, x, 0, false, true); } finally { readLock.unlock(); } } /** * Returns the node after the given one */ NodeAVL next(Session session, PersistentStore store, NodeAVL x, int distinctCount) { if (x == null) { return null; } while (true) { if (distinctCount == 0) { x = next(store, x); } else { Object[] baseData = x.getData(store); return findNode(session, store, baseData, colIndex, distinctCount, OpTypes.GREATER, TransactionManager.ACTION_READ, false); } if (x == null) { return x; } if (session == null) { return x; } Row row = x.getRow(store); if (session.database.txManager.canRead( session, row, TransactionManager.ACTION_READ, null)) { return x; } } } NodeAVL last(Session session, PersistentStore store, NodeAVL x, int distinctCount) { if (x == null) { return null; } while (true) { if (distinctCount == 0) { x = last(store, x); } else { Object[] baseData = x.getData(store); return findNode(session, store, baseData, colIndex, distinctCount, OpTypes.SMALLER, TransactionManager.ACTION_READ, false); } if (x == null) { return x; } if (session == null) { return x; } Row row = x.getRow(store); if (session.database.txManager.canRead( session, row, TransactionManager.ACTION_READ, null)) { return x; } } } NodeAVL next(PersistentStore store, NodeAVL x) { NodeAVL temp = x.getRight(store); if (temp != null) { x = temp; temp = x.getLeft(store); while (temp != null) { x = temp; temp = x.getLeft(store); } return x; } temp = x; x = x.getParent(store); while (x != null && x.isRight(temp)) { temp = x; x = x.getParent(store); } return x; } NodeAVL next(PersistentStore store, NodeAVL x, int depth, int maxDepth, int[] depths) { NodeAVL temp = depth == maxDepth ? null : x.getRight(store); if (temp != null) { depth++; x = temp; temp = depth == maxDepth ? null : x.getLeft(store); while (temp != null) { depth++; x = temp; if (depth == maxDepth) { temp = null; } else { temp = x.getLeft(store); } } depths[0] = depth; return x; } temp = x; x = x.getParent(store); depth--; while (x != null && x.isRight(temp)) { temp = x; x = x.getParent(store); depth--; } depths[0] = depth; return x; } NodeAVL last(PersistentStore store, NodeAVL x) { if (x == null) { return null; } NodeAVL temp = x.getLeft(store); if (temp != null) { x = temp; temp = x.getRight(store); while (temp != null) { x = temp; temp = x.getRight(store); } return x; } temp = x; x = x.getParent(store); while (x != null && x.isLeft(temp)) { temp = x; x = x.getParent(store); } return x; } boolean isEqualReadable(Session session, PersistentStore store, NodeAVL node) { NodeAVL c = node; Object[] data; Object[] nodeData; Row row; row = node.getRow(store); session.database.txManager.setTransactionInfo(row); if (session.database.txManager.canRead(session, row, TransactionManager.ACTION_DUP, null)) { return true; } data = node.getData(store); while (true) { c = last(store, c); if (c == null) { break; } nodeData = c.getData(store); if (compareRow(session, data, nodeData) == 0) { row = c.getRow(store); session.database.txManager.setTransactionInfo(row); if (session.database.txManager.canRead( session, row, TransactionManager.ACTION_DUP, null)) { return true; } continue; } break; } while (true) { c = next(session, store, node, 0); if (c == null) { break; } nodeData = c.getData(store); if (compareRow(session, data, nodeData) == 0) { row = c.getRow(store); session.database.txManager.setTransactionInfo(row); if (session.database.txManager.canRead( session, row, TransactionManager.ACTION_DUP, null)) { return true; } continue; } break; } return false; } /** * Finds a match with a row from a different table * * @param session Session * @param store PersistentStore * @param rowdata array containing data for the index columns * @param rowColMap map of the data to columns * @param fieldCount int * @param compareType int * @param readMode int * @return matching node or null */ NodeAVL findNode(Session session, PersistentStore store, Object[] rowdata, int[] rowColMap, int fieldCount, int compareType, int readMode, boolean reversed) { readLock.lock(); try { NodeAVL x = getAccessor(store); NodeAVL n = null; NodeAVL result = null; Row currentRow = null; if (compareType != OpTypes.EQUAL && compareType != OpTypes.IS_NULL) { fieldCount--; } while (x != null) { currentRow = x.getRow(store); int i = 0; if (fieldCount > 0) { i = compareRowNonUnique(session, currentRow.getData(), rowdata, rowColMap, fieldCount); } if (i == 0) { switch (compareType) { case OpTypes.IS_NULL : case OpTypes.EQUAL : { result = x; n = x.getLeft(store); break; } case OpTypes.NOT : case OpTypes.GREATER : { i = compareObject(session, currentRow.getData(), rowdata, rowColMap, fieldCount); if (i <= 0) { n = x.getRight(store); } else { result = x; n = x.getLeft(store); } break; } case OpTypes.GREATER_EQUAL : { i = compareObject(session, currentRow.getData(), rowdata, rowColMap, fieldCount); if (i < 0) { n = x.getRight(store); } else { result = x; n = x.getLeft(store); } break; } case OpTypes.SMALLER : { i = compareObject(session, currentRow.getData(), rowdata, rowColMap, fieldCount); if (i < 0) { result = x; n = x.getRight(store); } else { n = x.getLeft(store); } break; } case OpTypes.SMALLER_EQUAL : { i = compareObject(session, currentRow.getData(), rowdata, rowColMap, fieldCount); if (i <= 0) { result = x; n = x.getRight(store); } else { n = x.getLeft(store); } break; } default : Error.runtimeError(ErrorCode.U_S0500, "Index"); } } else if (i < 0) { n = x.getRight(store); } else if (i > 0) { n = x.getLeft(store); } if (n == null) { break; } x = n; } // MVCC 190 if (session == null) { return result; } while (result != null) { currentRow = result.getRow(store); if (session.database.txManager.canRead(session, currentRow, readMode, colIndex)) { break; } result = reversed ? last(store, result) : next(store, result); if (result == null) { break; } currentRow = result.getRow(store); if (fieldCount > 0 && compareRowNonUnique( session, currentRow.getData(), rowdata, rowColMap, fieldCount) != 0) { result = null; break; } } return result; } finally { readLock.unlock(); } } /** * Finds a match with a value * * @param session Session * @param store PersistentStore * @param data value data for the index columns * @param compareType int * @param readMode int * @return matching node or null */ NodeAVL findNode(Session session, PersistentStore store, Object data, int compareType, int readMode) { readLock.lock(); try { NodeAVL x = getAccessor(store); NodeAVL n = null; NodeAVL result = null; Row currentRow = null; while (x != null) { currentRow = x.getRow(store); int i = colTypes[0].compare(session, data, currentRow.getData()[colIndex[0]]); switch (compareType) { case OpTypes.IS_NULL : case OpTypes.EQUAL : { if (i == 0) { result = x; n = x.getLeft(store); break; } else if (i > 0) { n = x.getRight(store); } else if (i < 0) { n = x.getLeft(store); } break; } case OpTypes.NOT : case OpTypes.GREATER : { if (i >= 0) { n = x.getRight(store); } else { result = x; n = x.getLeft(store); } break; } case OpTypes.GREATER_EQUAL : { if (i > 0) { n = x.getRight(store); } else { result = x; n = x.getLeft(store); } break; } default : Error.runtimeError(ErrorCode.U_S0500, "Index"); } if (n == null) { break; } x = n; } // MVCC 190 if (session == null) { return result; } while (result != null) { currentRow = result.getRow(store); if (session.database.txManager.canRead(session, currentRow, readMode, colIndex)) { break; } result = next(store, result); if (compareType == OpTypes.EQUAL) { if (colTypes[0].compare( session, data, currentRow.getData()[colIndex[0]]) != 0) { result = null; break; } } } return result; } finally { readLock.unlock(); } } /** * Balances part of the tree after an alteration to the index. */ void balance(PersistentStore store, NodeAVL x, boolean isleft) { while (true) { int sign = isleft ? 1 : -1; switch (x.getBalance(store) * sign) { case 1 : x = x.setBalance(store, 0); return; case 0 : x = x.setBalance(store, -sign); break; case -1 : NodeAVL l = x.child(store, isleft); if (l.getBalance(store) == -sign) { x.replace(store, this, l); x = x.set(store, isleft, l.child(store, !isleft)); l = l.set(store, !isleft, x); x = x.setBalance(store, 0); l = l.setBalance(store, 0); } else { NodeAVL r = l.child(store, !isleft); x.replace(store, this, r); l = l.set(store, !isleft, r.child(store, isleft)); r = r.set(store, isleft, l); x = x.set(store, isleft, r.child(store, !isleft)); r = r.set(store, !isleft, x); int rb = r.getBalance(store); x = x.setBalance(store, (rb == -sign) ? sign : 0); l = l.setBalance(store, (rb == sign) ? -sign : 0); r = r.setBalance(store, 0); } return; } if (x.isRoot(store)) { return; } isleft = x.isFromLeft(store); x = x.getParent(store); } } NodeAVL getAccessor(PersistentStore store) { NodeAVL node = (NodeAVL) store.getAccessor(this); return node; } IndexRowIterator getIterator(Session session, PersistentStore store, NodeAVL x, boolean single, boolean reversed) { if (x == null) { return emptyIterator; } else { IndexRowIterator it = new IndexRowIterator(session, store, this, x, 0, single, reversed); return it; } } public static final class IndexRowIterator implements RowIterator { final Session session; final PersistentStore store; final IndexAVL index; NodeAVL nextnode; Row lastrow; int distinctCount; boolean single; boolean reversed; /** * When session == null, rows from all sessions are returned */ public IndexRowIterator(Session session, PersistentStore store, IndexAVL index, NodeAVL node, int distinctCount, boolean single, boolean reversed) { this.session = session; this.store = store; this.index = index; this.distinctCount = distinctCount; this.single = single; this.reversed = reversed; if (index == null) { return; } nextnode = node; } public boolean hasNext() { return nextnode != null; } public Row getNextRow() { if (nextnode == null) { release(); return null; } NodeAVL lastnode = nextnode; if (single) { nextnode = null; } else { index.readLock.lock(); store.writeLock(); try { if (reversed) { nextnode = index.last(session, store, nextnode, distinctCount); } else { nextnode = index.next(session, store, nextnode, distinctCount); } } finally { store.writeUnlock(); index.readLock.unlock(); } } lastrow = lastnode.getRow(store); return lastrow; } public Object[] getNext() { Row row = getNextRow(); return row == null ? null : row.getData(); } public void remove() { store.delete(session, lastrow); store.remove(lastrow.getPos()); } public void release() {} public boolean setRowColumns(boolean[] columns) { return false; } public long getRowId() { return nextnode.getPos(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/index/NodeAVLDisk.java0000644000175000017500000003607612007547416022775 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.index; import java.io.IOException; import org.hsqldb.Row; import org.hsqldb.RowAVLDisk; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.LongLookup; import org.hsqldb.persist.PersistentStore; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputInterface; // fredt@users 20020221 - patch 513005 by sqlbob@users (RMP) // fredt@users 20020920 - path 1.7.1 - refactoring to cut mamory footprint // fredt@users 20021205 - path 1.7.2 - enhancements /** * Cached table Node implementation.

              * Only integral references to left, right and parent nodes in the AVL tree * are held and used as pointers data.

              * * iId is a reference to the Index object that contains this node.
              * This fields can be eliminated in the future, by changing the * method signatures to take a Index parameter from Index.java (fredt@users) * * New class derived from Hypersonic SQL code and enhanced in HSQLDB.

              * * @author Fred Toussi (fredt@users dot sourceforge dot net) * @author Thomas Mueller (Hypersonic SQL Group) * @version 2.2.9 * @since Hypersonic SQL */ public class NodeAVLDisk extends NodeAVL { final RowAVLDisk row; // private int iLeft = NO_POS; private int iRight = NO_POS; private int iParent = NO_POS; private int iId; // id of Index object for this Node public static final int SIZE_IN_BYTE = 4 * 4; public NodeAVLDisk(RowAVLDisk r, RowInputInterface in, int id) throws IOException { row = r; iId = id; iBalance = in.readInt(); iLeft = in.readInt(); iRight = in.readInt(); iParent = in.readInt(); if (iLeft <= 0) { iLeft = NO_POS; } if (iRight <= 0) { iRight = NO_POS; } if (iParent <= 0) { iParent = NO_POS; } } public NodeAVLDisk(RowAVLDisk r, int id) { row = r; iId = id; } public void delete() { iLeft = NO_POS; iRight = NO_POS; iParent = NO_POS; nLeft = null; nRight = null; nParent = null; iBalance = 0; row.setNodesChanged(); } public boolean isInMemory() { return row.isInMemory(); } public boolean isMemory() { return false; } public long getPos() { return row.getPos(); } public Row getRow(PersistentStore store) { if (!row.isInMemory()) { return (RowAVLDisk) store.get(this.row, false); } else { row.updateAccessCount(store.getAccessCount()); } return row; } public Object[] getData(PersistentStore store) { return row.getData(); } private NodeAVLDisk findNode(PersistentStore store, int pos) { NodeAVLDisk ret = null; RowAVLDisk r = (RowAVLDisk) store.get(pos, false); if (r != null) { ret = (NodeAVLDisk) r.getNode(iId); } return ret; } boolean isLeft(NodeAVL n) { if (n == null) { return iLeft == NO_POS; } return iLeft == n.getPos(); } boolean isRight(NodeAVL n) { if (n == null) { return iRight == NO_POS; } return iRight == n.getPos(); } NodeAVL getLeft(PersistentStore store) { NodeAVLDisk node = this; RowAVLDisk row = this.row; if (!row.isInMemory()) { row = (RowAVLDisk) store.get(this.row, false); node = (NodeAVLDisk) row.getNode(iId); } if (node.iLeft == NO_POS) { return null; } if (node.nLeft == null || !node.nLeft.isInMemory()) { node.nLeft = findNode(store, node.iLeft); node.nLeft.nParent = node; } return node.nLeft; } NodeAVL getRight(PersistentStore store) { NodeAVLDisk node = this; RowAVLDisk row = this.row; if (!row.isInMemory()) { row = (RowAVLDisk) store.get(this.row, false); node = (NodeAVLDisk) row.getNode(iId); } if (node.iRight == NO_POS) { return null; } if (node.nRight == null || !node.nRight.isInMemory()) { node.nRight = findNode(store, node.iRight); node.nRight.nParent = node; } return node.nRight; } NodeAVL getParent(PersistentStore store) { NodeAVLDisk node = this; RowAVLDisk row = this.row; if (!row.isInMemory()) { row = (RowAVLDisk) store.get(this.row, false); node = (NodeAVLDisk) row.getNode(iId); } if (node.iParent == NO_POS) { return null; } if (node.nParent == null || !node.nParent.isInMemory()) { node.nParent = findNode(store, iParent); } return node.nParent; } public int getBalance(PersistentStore store) { NodeAVLDisk node = this; RowAVLDisk row = this.row; if (!row.isInMemory()) { row = (RowAVLDisk) store.get(this.row, false); node = (NodeAVLDisk) row.getNode(iId); } return node.iBalance; } boolean isRoot(PersistentStore store) { NodeAVLDisk node = this; RowAVLDisk row = this.row; if (!row.isInMemory()) { row = (RowAVLDisk) store.get(this.row, false); node = (NodeAVLDisk) row.getNode(iId); } return node.iParent == NO_POS; } boolean isFromLeft(PersistentStore store) { NodeAVLDisk node = this; RowAVLDisk row = this.row; if (!row.isInMemory()) { row = (RowAVLDisk) store.get(this.row, false); node = (NodeAVLDisk) row.getNode(iId); } if (node.iParent == NO_POS) { return true; } if (node.nParent == null || !node.nParent.isInMemory()) { node.nParent = findNode(store, iParent); } return row.getPos() == ((NodeAVLDisk) node.nParent).iLeft; } public NodeAVL child(PersistentStore store, boolean isleft) { return isleft ? getLeft(store) : getRight(store); } NodeAVL setParent(PersistentStore store, NodeAVL n) { NodeAVLDisk node = this; RowAVLDisk row = this.row; if (!row.keepInMemory(true)) { row = (RowAVLDisk) store.get(this.row, true); node = (NodeAVLDisk) row.getNode(iId); } if (!row.isInMemory()) { row.keepInMemory(false); throw Error.runtimeError(ErrorCode.U_S0500, "NodeAVLDisk"); } row.setNodesChanged(); node.iParent = n == null ? NO_POS : (int) n.getPos(); node.nParent = (NodeAVLDisk) n; row.keepInMemory(false); return node; } public NodeAVL setBalance(PersistentStore store, int b) { NodeAVLDisk node = this; RowAVLDisk row = this.row; if (!row.keepInMemory(true)) { row = (RowAVLDisk) store.get(this.row, true); node = (NodeAVLDisk) row.getNode(iId); } if (!row.isInMemory()) { throw Error.runtimeError(ErrorCode.U_S0500, "NodeAVLDisk"); } row.setNodesChanged(); node.iBalance = b; row.keepInMemory(false); return node; } NodeAVL setLeft(PersistentStore store, NodeAVL n) { NodeAVLDisk node = this; RowAVLDisk row = this.row; if (!row.keepInMemory(true)) { row = (RowAVLDisk) store.get(this.row, true); node = (NodeAVLDisk) row.getNode(iId); } if (!row.isInMemory()) { throw Error.runtimeError(ErrorCode.U_S0500, "NodeAVLDisk"); } row.setNodesChanged(); node.iLeft = n == null ? NO_POS : (int) n.getPos(); node.nLeft = (NodeAVLDisk) n; row.keepInMemory(false); return node; } NodeAVL setRight(PersistentStore store, NodeAVL n) { NodeAVLDisk node = this; RowAVLDisk row = this.row; if (!row.keepInMemory(true)) { row = (RowAVLDisk) store.get(this.row, true); node = (NodeAVLDisk) row.getNode(iId); } if (!row.isInMemory()) { throw Error.runtimeError(ErrorCode.U_S0500, "NodeAVLDisk"); } row.setNodesChanged(); node.iRight = n == null ? NO_POS : (int) n.getPos(); node.nRight = (NodeAVLDisk) n; row.keepInMemory(false); return node; } public NodeAVL set(PersistentStore store, boolean isLeft, NodeAVL n) { NodeAVL x; if (isLeft) { x = setLeft(store, n); } else { x = setRight(store, n); } if (n != null) { n.setParent(store, this); } return x; } public void replace(PersistentStore store, Index index, NodeAVL n) { if (iParent == NO_POS) { if (n != null) { n = n.setParent(store, null); } store.setAccessor(index, n); } else { boolean isFromLeft = isFromLeft(store); getParent(store).set(store, isFromLeft, n); } } boolean equals(NodeAVL n) { if (n instanceof NodeAVLDisk) { return this == n || (getPos() == ((NodeAVLDisk) n).getPos()); } return false; } public int getRealSize(RowOutputInterface out) { return NodeAVLDisk.SIZE_IN_BYTE; } public void setInMemory(boolean in) { if (!in) { if (nLeft != null) { nLeft.nParent = null; } if (nRight != null) { nRight.nParent = null; } if (nParent != null) { if (row.getPos() == ((NodeAVLDisk) nParent).iLeft) { nParent.nLeft = null; } else { nParent.nRight = null; } } nLeft = nRight = nParent = null; } } public void write(RowOutputInterface out) { out.writeInt(iBalance); out.writeInt((iLeft == NO_POS) ? 0 : iLeft); out.writeInt((iRight == NO_POS) ? 0 : iRight); out.writeInt((iParent == NO_POS) ? 0 : iParent); } public void write(RowOutputInterface out, LongLookup lookup) { out.writeInt(iBalance); out.writeInt(getTranslatePointer(iLeft, lookup)); out.writeInt(getTranslatePointer(iRight, lookup)); out.writeInt(getTranslatePointer(iParent, lookup)); } private static int getTranslatePointer(int pointer, LongLookup lookup) { int newPointer = 0; if (pointer != NodeAVL.NO_POS) { if (lookup == null) { newPointer = pointer; } else { newPointer = (int) lookup.lookup(pointer); } } return newPointer; } public void restore() {} public void destroy() {} public void updateAccessCount(int count) {} public int getAccessCount() { return 0; } public void setStorageSize(int size) {} public int getStorageSize() { return 0; } public void setPos(long pos) {} public boolean isNew() { return false; } public boolean hasChanged() { return false; } public boolean isKeepInMemory() { return false; } public boolean keepInMemory(boolean keep) { return false; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/index/NodeAVL.java0000644000175000017500000001770012007547416022153 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.index; import org.hsqldb.Row; import org.hsqldb.RowAVLDisk; import org.hsqldb.lib.LongLookup; import org.hsqldb.persist.CachedObject; import org.hsqldb.persist.PersistentStore; import org.hsqldb.rowio.RowOutputInterface; // fredt@users 20020221 - patch 513005 by sqlbob@users (RMP) // fredt@users 20020920 - path 1.7.1 - refactoring to cut mamory footprint // fredt@users 20021205 - path 1.7.2 - enhancements // fredt@users 20021215 - doc 1.7.2 - javadoc comments /** * The parent for all AVL node implementations. Subclasses of Node vary * in the way they hold * references to other Nodes in the AVL tree, or to their Row data.
              * * nNext links the Node objects belonging to different indexes for each * table row. It is used solely by Row to locate the node belonging to a * particular index.
              * * New class derived from Hypersonic SQL code and enhanced in HSQLDB.

              * * @author Thomas Mueller (Hypersonic SQL Group) * @version 1.9.0 * @since Hypersonic SQL */ public class NodeAVL implements CachedObject { static final int NO_POS = RowAVLDisk.NO_POS; public int iBalance; public NodeAVL nNext; // node of next index (nNext==null || nNext.iId=iId+1) // protected NodeAVL nLeft; protected NodeAVL nRight; protected NodeAVL nParent; protected final Row row; NodeAVL() { row = null; } public NodeAVL(Row r) { row = r; } public void delete() { iBalance = 0; nLeft = nRight = nParent = null; } NodeAVL getLeft(PersistentStore store) { return nLeft; } NodeAVL setLeft(PersistentStore persistentStore, NodeAVL n) { nLeft = n; return this; } public int getBalance(PersistentStore store) { return iBalance; } boolean isLeft(NodeAVL node) { return nLeft == node; } boolean isRight(NodeAVL node) { return nRight == node; } NodeAVL getRight(PersistentStore persistentStore) { return nRight; } NodeAVL setRight(PersistentStore persistentStore, NodeAVL n) { nRight = n; return this; } NodeAVL getParent(PersistentStore store) { return nParent; } boolean isRoot(PersistentStore store) { return nParent == null; } NodeAVL setParent(PersistentStore persistentStore, NodeAVL n) { nParent = n; return this; } public NodeAVL setBalance(PersistentStore store, int b) { iBalance = b; return this; } boolean isFromLeft(PersistentStore store) { if (nParent == null) { return true; } return this == nParent.nLeft; } public NodeAVL child(PersistentStore store, boolean isleft) { return isleft ? getLeft(store) : getRight(store); } public NodeAVL set(PersistentStore store, boolean isLeft, NodeAVL n) { if (isLeft) { nLeft = n; } else { nRight = n; } if (n != null) { n.nParent = this; } return this; } public void replace(PersistentStore store, Index index, NodeAVL n) { if (nParent == null) { if (n != null) { n = n.setParent(store, null); } store.setAccessor(index, n); } else { nParent.set(store, isFromLeft(store), n); } } boolean equals(NodeAVL n) { return n == this; } public void setInMemory(boolean in) {} public void write(RowOutputInterface out) {} public void write(RowOutputInterface out, LongLookup lookup) {} public long getPos() { return 0; } protected Row getRow(PersistentStore store) { return row; } protected Object[] getData(PersistentStore store) { return row.getData(); } public void updateAccessCount(int count) {} public int getAccessCount() { return 0; } public void setStorageSize(int size) {} public int getStorageSize() { return 0; } public void setPos(long pos) {} public boolean isNew() { return false; } public boolean hasChanged() { return false; } public boolean isKeepInMemory() { return false; } ; public boolean keepInMemory(boolean keep) { return true; } public boolean isInMemory() { return false; } public void restore() {} public void destroy() {} public int getRealSize(RowOutputInterface out) { return 0; } public boolean isMemory() { return true; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/RangeVariableResolver.java0000644000175000017500000013755312007547416024051 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.ParserDQL.CompileContext; import org.hsqldb.RangeVariable.RangeVariableConditions; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.index.Index.IndexUse; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HashMap; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.HsqlList; import org.hsqldb.lib.IntKeyIntValueHashMap; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.MultiValueHashMap; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.OrderedIntHashSet; import org.hsqldb.persist.PersistentStore; /** * Determines how JOIN and WHERE expressions are used in query * processing and which indexes are used for table access. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class RangeVariableResolver { Session session; QuerySpecification select; RangeVariable[] rangeVariables; Expression conditions; OrderedHashSet rangeVarSet = new OrderedHashSet(); CompileContext compileContext; SortAndSlice sortAndSlice = SortAndSlice.noSort; // HsqlArrayList[] tempJoinExpressions; HsqlArrayList[] joinExpressions; HsqlArrayList[] whereExpressions; HsqlArrayList queryConditions = new HsqlArrayList(); // Expression[] inExpressions; boolean[] inInJoin; int inExpressionCount = 0; boolean expandInExpression = true; // int firstLeftJoinIndex; int firstRightJoinIndex; int lastRightJoinIndex; int firstLateralJoinIndex; int firstOuterJoinIndex; int lastOuterJoinIndex; // OrderedIntHashSet colIndexSetEqual = new OrderedIntHashSet(); IntKeyIntValueHashMap colIndexSetOther = new IntKeyIntValueHashMap(); OrderedHashSet tempSet = new OrderedHashSet(); HashMap tempMap = new HashMap(); MultiValueHashMap tempMultiMap = new MultiValueHashMap(); RangeVariableResolver(QuerySpecification select) { this.select = select; this.rangeVariables = select.rangeVariables; this.conditions = select.queryCondition; this.compileContext = select.compileContext; this.sortAndSlice = select.sortAndSlice; // this.expandInExpression = select.checkQueryCondition == null; initialise(); } RangeVariableResolver(RangeVariable[] rangeVariables, Expression conditions, CompileContext compileContext) { this.rangeVariables = rangeVariables; this.conditions = conditions; this.compileContext = compileContext; initialise(); } private void initialise() { firstLeftJoinIndex = rangeVariables.length; firstRightJoinIndex = rangeVariables.length; firstLateralJoinIndex = rangeVariables.length; firstOuterJoinIndex = rangeVariables.length; inExpressions = new Expression[rangeVariables.length]; inInJoin = new boolean[rangeVariables.length]; tempJoinExpressions = new HsqlArrayList[rangeVariables.length]; for (int i = 0; i < rangeVariables.length; i++) { tempJoinExpressions[i] = new HsqlArrayList(); } joinExpressions = new HsqlArrayList[rangeVariables.length]; for (int i = 0; i < rangeVariables.length; i++) { joinExpressions[i] = new HsqlArrayList(); } whereExpressions = new HsqlArrayList[rangeVariables.length]; for (int i = 0; i < rangeVariables.length; i++) { whereExpressions[i] = new HsqlArrayList(); } } void processConditions(Session session) { this.session = session; decomposeAndConditions(session, conditions, queryConditions); for (int i = 0; i < rangeVariables.length; i++) { rangeVarSet.add(rangeVariables[i]); if (rangeVariables[i].joinCondition == null) { continue; } decomposeAndConditions(session, rangeVariables[i].joinCondition, tempJoinExpressions[i]); } for (int j = 0; j < queryConditions.size(); j++) { Expression e = (Expression) queryConditions.get(j); if (e == ExpressionLogical.EXPR_TRUE) { continue; } if (e.isSingleColumnEqual || e.isColumnCondition) { RangeVariable range = e.getLeftNode().getRangeVariable(); if (e.getLeftNode().opType == OpTypes.COLUMN && range != null) { int index = rangeVarSet.getIndex(range); if (index > 0) { rangeVariables[index].isLeftJoin = false; rangeVariables[index - 1].isRightJoin = false; } } range = e.getRightNode().getRangeVariable(); if (e.getRightNode().opType == OpTypes.COLUMN && range != null) { int index = rangeVarSet.getIndex(range); if (index > 0) { rangeVariables[index].isLeftJoin = false; rangeVariables[index - 1].isRightJoin = false; } } } } for (int i = 0; i < rangeVariables.length; i++) { RangeVariable range = rangeVariables[i]; boolean isOuter = false; if (range.isLeftJoin) { if (firstLeftJoinIndex == rangeVariables.length) { firstLeftJoinIndex = i; } isOuter = true; } if (range.isRightJoin) { if (firstRightJoinIndex == rangeVariables.length) { firstRightJoinIndex = i; } lastRightJoinIndex = i; isOuter = true; } if (range.isLateral) { if (firstLateralJoinIndex == rangeVariables.length) { firstLateralJoinIndex = i; } isOuter = true; } if (isOuter) { if (firstOuterJoinIndex == rangeVariables.length) { firstOuterJoinIndex = i; } lastOuterJoinIndex = i; } } expandConditions(); conditions = null; reorder(); assignToLists(); assignToRangeVariables(); // rangePositionInJoin and the two bounds are used only together, regardless of any IN ranges added if (select != null) { select.startInnerRange = 0; select.endInnerRange = rangeVariables.length; if (firstRightJoinIndex < rangeVariables.length) { select.startInnerRange = firstRightJoinIndex; } if (firstLeftJoinIndex < rangeVariables.length) { select.endInnerRange = firstLeftJoinIndex; } } for (int i = 0; i < rangeVariables.length; i++) { rangeVariables[i].rangePositionInJoin = i; } if (expandInExpression && inExpressionCount != 0) { setInConditionsAsTables(); } } /** * Divides AND and OR conditions and assigns */ static Expression decomposeAndConditions(Session session, Expression e, HsqlList conditions) { if (e == null) { return Expression.EXPR_TRUE; } Expression arg1 = e.getLeftNode(); Expression arg2 = e.getRightNode(); int type = e.getType(); if (type == OpTypes.AND) { arg1 = decomposeAndConditions(session, arg1, conditions); arg2 = decomposeAndConditions(session, arg2, conditions); if (arg1 == Expression.EXPR_TRUE) { return arg2; } if (arg2 == Expression.EXPR_TRUE) { return arg1; } e.setLeftNode(arg1); e.setRightNode(arg2); return e; } else if (type == OpTypes.EQUAL) { if (arg1.getType() == OpTypes.ROW && arg2.getType() == OpTypes.ROW) { for (int i = 0; i < arg1.nodes.length; i++) { Expression part = new ExpressionLogical(arg1.nodes[i], arg2.nodes[i]); part.resolveTypes(session, null); conditions.add(part); } return Expression.EXPR_TRUE; } } if (e != Expression.EXPR_TRUE) { conditions.add(e); } return Expression.EXPR_TRUE; } /** * Divides AND and OR conditions and assigns */ static Expression decomposeOrConditions(Expression e, HsqlList conditions) { if (e == null) { return Expression.EXPR_FALSE; } Expression arg1 = e.getLeftNode(); Expression arg2 = e.getRightNode(); int type = e.getType(); if (type == OpTypes.OR) { arg1 = decomposeOrConditions(arg1, conditions); arg2 = decomposeOrConditions(arg2, conditions); if (arg1 == Expression.EXPR_FALSE) { return arg2; } if (arg2 == Expression.EXPR_FALSE) { return arg1; } e = new ExpressionLogical(OpTypes.OR, arg1, arg2); return e; } if (e != Expression.EXPR_FALSE) { conditions.add(e); } return Expression.EXPR_FALSE; } void expandConditions() { HsqlArrayList[] array = tempJoinExpressions; if (firstRightJoinIndex == rangeVariables.length) { moveConditions(tempJoinExpressions, 0, firstOuterJoinIndex, queryConditions, -1); } if (firstOuterJoinIndex < 2) { return; } for (int i = 0; i < firstOuterJoinIndex; i++) { moveConditions(tempJoinExpressions, 0, firstOuterJoinIndex, tempJoinExpressions[i], i); } if (firstOuterJoinIndex < 3) { return; } for (int i = 0; i < firstOuterJoinIndex; i++) { HsqlArrayList list = array[i]; tempMultiMap.clear(); tempSet.clear(); tempMap.clear(); boolean hasValEqual = false; boolean hasColEqual = false; boolean hasChain = false; for (int j = 0; j < list.size(); j++) { Expression e = (Expression) list.get(j); if (e == ExpressionLogical.EXPR_TRUE) { continue; } if (e.isSingleColumnEqual) { hasValEqual = true; if (e.getLeftNode().opType == OpTypes.COLUMN) { tempMap.put(e.getLeftNode().getColumn(), e.getRightNode()); } else if (e.getRightNode().opType == OpTypes.COLUMN) { tempMap.put(e.getRightNode().getColumn(), e.getLeftNode()); } continue; } if (!e.isColumnEqual) { continue; } if (e.getLeftNode().getRangeVariable() == e.getRightNode().getRangeVariable()) { continue; } if (e.getLeftNode().getRangeVariable() == null || e.getRightNode().getRangeVariable() == null) { continue; } int idx = rangeVarSet.getIndex(e.getLeftNode().getRangeVariable()); if (idx < 0) { e.isSingleColumnEqual = true; e.isSingleColumnCondition = true; tempMap.put(e.getRightNode().getColumn(), e.getLeftNode()); continue; } if (idx >= firstOuterJoinIndex) { continue; } idx = rangeVarSet.getIndex( e.getRightNode().getRangeVariable()); if (idx < 0) { e.isSingleColumnEqual = true; e.isSingleColumnCondition = true; tempMap.put(e.getRightNode().getColumn(), e.getLeftNode()); continue; } if (idx >= firstOuterJoinIndex) { continue; } hasColEqual = true; if (e.getLeftNode().getRangeVariable() == rangeVariables[i]) { ColumnSchema column = e.getLeftNode().getColumn(); tempMultiMap.put(column, e.getRightNode()); if (tempMultiMap.valueCount(column) > 1) { hasChain = true; } } else if (e.getRightNode().getRangeVariable() == rangeVariables[i]) { ColumnSchema column = e.getRightNode().getColumn(); tempMultiMap.put(column, e.getLeftNode()); if (tempMultiMap.valueCount(column) > 1) { hasChain = true; } } } if (hasChain) { Iterator keyIt = tempMultiMap.keySet().iterator(); while (keyIt.hasNext()) { Object key = keyIt.next(); Iterator it = tempMultiMap.get(key); tempSet.clear(); while (it.hasNext()) { tempSet.add(it.next()); } while (tempSet.size() > 1) { Expression e1 = (Expression) tempSet.remove(tempSet.size() - 1); for (int j = 0; j < tempSet.size(); j++) { Expression e2 = (Expression) tempSet.get(j); closeJoinChain(array, e1, e2); } } } } if (hasColEqual && hasValEqual) { Iterator keyIt = tempMultiMap.keySet().iterator(); while (keyIt.hasNext()) { Object key = keyIt.next(); Expression e1 = (Expression) tempMap.get(key); if (e1 != null) { Iterator it = tempMultiMap.get(key); while (it.hasNext()) { Expression e2 = (Expression) it.next(); Expression e = new ExpressionLogical(e1, e2); int index = rangeVarSet.getIndex(e2.getRangeVariable()); array[index].add(e); } } } } } } void moveConditions(HsqlList[] lists, int rangeStart, int rangeLimit, HsqlList list, int listIndex) { for (int j = 0; j < list.size(); j++) { Expression e = (Expression) list.get(j); tempSet.clear(); e.collectRangeVariables(rangeVariables, tempSet); int index = rangeVarSet.getSmallestIndex(tempSet); if (index < rangeStart) { continue; } index = rangeVarSet.getLargestIndex(tempSet); if (index >= rangeLimit) { continue; } if (index != listIndex) { list.remove(j); lists[index].add(e); j--; } } } void closeJoinChain(HsqlList[] array, Expression e1, Expression e2) { int idx1 = rangeVarSet.getIndex(e1.getRangeVariable()); int idx2 = rangeVarSet.getIndex(e2.getRangeVariable()); int index = idx1 > idx2 ? idx1 : idx2; if (idx1 == -1 || idx2 == -1) { return; } Expression e = new ExpressionLogical(e1, e2); for (int i = 0; i < array[index].size(); i++) { if (e.equals(array[index].get(i))) { return; } } array[index].add(e); } /** * if a tiny table is in the middle of the range list, then this will have no * effect on joins. therefore the larger tables should be put first, avoiding * multiple lookups * * the index selectivity should also account for the size, and account for * disk seek, which means finding a unique value in large tables takes a lot * more time than scanning a table with 10 rows. * * */ void reorder() { if (rangeVariables.length == 1 || firstRightJoinIndex != rangeVariables.length) { return; } if (firstLeftJoinIndex == 1) { return; } if (firstLateralJoinIndex != rangeVariables.length) { return; } if (sortAndSlice.usingIndex && sortAndSlice.primaryTableIndex != null) { return; } HsqlArrayList joins = new HsqlArrayList(); HsqlArrayList starts = new HsqlArrayList(); for (int i = 0; i < firstLeftJoinIndex; i++) { HsqlArrayList tempJoins = tempJoinExpressions[i]; for (int j = 0; j < tempJoins.size(); j++) { Expression e = (Expression) tempJoins.get(j); if (e.isColumnEqual) { joins.add(e); } else if (e.isSingleColumnCondition) { starts.add(e); } } } reorderRanges(starts, joins); } void reorderRanges(HsqlArrayList starts, HsqlArrayList joins) { if (starts.size() == 0) { return; } int position = -1; RangeVariable range = null; double cost = 1024; for (int i = 0; i < firstLeftJoinIndex; i++) { Table table = rangeVariables[i].rangeTable; if (table instanceof TableDerived) { continue; } collectIndexableColumns(rangeVariables[i], starts); IndexUse[] indexes = table.getIndexForColumns(session, colIndexSetEqual, OpTypes.EQUAL, false); Index index = null; for (int j = 0; j < indexes.length; j++) { index = indexes[j].index; PersistentStore store = table.getRowStore(session); double currentCost = store.searchCost(session, index, indexes[j].columnCount, OpTypes.EQUAL); if (currentCost < cost) { cost = currentCost; position = i; } } if (index == null) { Iterator it = colIndexSetOther.keySet().iterator(); while (it.hasNext()) { int colIndex = it.nextInt(); index = table.getIndexForColumn(session, colIndex); if (index != null) { cost = table.getRowStore(session).elementCount() / 2; if (colIndexSetOther.get(colIndex, 0) > 1) { cost /= 2; } break; } } } if (index == null) { continue; } if (i == 0) { position = 0; break; } } if (position < 0) { return; } if (position == 0 && firstLeftJoinIndex == 2) { return; } RangeVariable[] newRanges = new RangeVariable[rangeVariables.length]; ArrayUtil.copyArray(rangeVariables, newRanges, rangeVariables.length); range = newRanges[position]; newRanges[position] = newRanges[0]; newRanges[0] = range; position = 1; for (; position < firstLeftJoinIndex; position++) { boolean found = false; for (int i = 0; i < joins.size(); i++) { Expression e = (Expression) joins.get(i); if (e == null) { continue; } int newPosition = getJoinedRangePosition(e, position, newRanges); if (newPosition >= position) { range = newRanges[position]; newRanges[position] = newRanges[newPosition]; newRanges[newPosition] = range; joins.set(i, null); found = true; break; } } if (found) { continue; } for (int i = 0; i < starts.size(); i++) { Table table = newRanges[i].rangeTable; collectIndexableColumns(newRanges[i], starts); IndexUse[] indexes = table.getIndexForColumns(session, colIndexSetEqual, OpTypes.EQUAL, false); if (indexes.length > 0) { found = true; break; } } if (!found) { break; } } if (position != firstLeftJoinIndex) { return; } ArrayUtil.copyArray(newRanges, rangeVariables, rangeVariables.length); joins.clear(); for (int i = 0; i < firstLeftJoinIndex; i++) { HsqlArrayList tempJoins = tempJoinExpressions[i]; joins.addAll(tempJoins); tempJoins.clear(); } tempJoinExpressions[firstLeftJoinIndex - 1].addAll(joins); rangeVarSet.clear(); for (int i = 0; i < rangeVariables.length; i++) { rangeVarSet.add(rangeVariables[i]); } } int getJoinedRangePosition(Expression e, int position, RangeVariable[] currentRanges) { int found = -1; RangeVariable[] ranges = e.getJoinRangeVariables(currentRanges); for (int i = 0; i < ranges.length; i++) { for (int j = 0; j < currentRanges.length; j++) { if (ranges[i] == currentRanges[j]) { if (j >= position) { if (found > 0) { return -1; } else { found = j; } } } } } return found; } /** * Assigns the conditions to separate lists */ void assignToLists() { int lastOuterIndex = -1; for (int i = 0; i < rangeVariables.length; i++) { if (rangeVariables[i].isLeftJoin) { lastOuterIndex = i; } if (rangeVariables[i].isRightJoin) { lastOuterIndex = i; } if (lastOuterIndex == i) { joinExpressions[i].addAll(tempJoinExpressions[i]); } else { int start = lastOuterIndex + 1; for (int j = 0; j < tempJoinExpressions[i].size(); j++) { Expression e = (Expression) tempJoinExpressions[i].get(j); assignToJoinLists(e, joinExpressions, start); } } } for (int i = 0; i < queryConditions.size(); i++) { assignToJoinLists((Expression) queryConditions.get(i), whereExpressions, lastRightJoinIndex); } } /** * Assigns a single condition to the relevant list of conditions * * Parameter first indicates the first range variable to which condition * can be assigned */ void assignToJoinLists(Expression e, HsqlList[] expressionLists, int first) { if (e == null) { return; } tempSet.clear(); e.collectRangeVariables(rangeVariables, tempSet); int index = rangeVarSet.getLargestIndex(tempSet); if (index == -1) { index = 0; } if (index < first) { index = first; } if (e instanceof ExpressionLogical) { if (((ExpressionLogical) e).isTerminal) { index = expressionLists.length - 1; } } expressionLists[index].add(e); } /** * Assigns conditions to range variables and converts suitable IN conditions * to table lookup. */ void assignToRangeVariables() { for (int i = 0; i < rangeVariables.length; i++) { boolean hasIndex = false; RangeVariableConditions conditions; if (i < firstLeftJoinIndex && firstRightJoinIndex == rangeVariables.length) { conditions = rangeVariables[i].joinConditions[0]; joinExpressions[i].addAll(whereExpressions[i]); assignToRangeVariable(rangeVariables[i], conditions, i, joinExpressions[i]); assignToRangeVariable(conditions, joinExpressions[i]); } else { conditions = rangeVariables[i].joinConditions[0]; assignToRangeVariable(rangeVariables[i], conditions, i, joinExpressions[i]); conditions = rangeVariables[i].joinConditions[0]; if (conditions.hasIndex()) { hasIndex = true; } assignToRangeVariable(conditions, joinExpressions[i]); conditions = rangeVariables[i].whereConditions[0]; for (int j = i + 1; j < rangeVariables.length; j++) { if (rangeVariables[j].isRightJoin) { assignToRangeVariable( rangeVariables[j].whereConditions[0], whereExpressions[i]); } } if (!hasIndex) { assignToRangeVariable(rangeVariables[i], conditions, i, whereExpressions[i]); } assignToRangeVariable(conditions, whereExpressions[i]); } } } void assignToRangeVariable(RangeVariableConditions conditions, HsqlList exprList) { for (int j = 0, size = exprList.size(); j < size; j++) { Expression e = (Expression) exprList.get(j); conditions.addCondition(e); } } private void collectIndexableColumns(RangeVariable range, HsqlList exprList) { colIndexSetEqual.clear(); colIndexSetOther.clear(); for (int j = 0, size = exprList.size(); j < size; j++) { Expression e = (Expression) exprList.get(j); if (!e.isSingleColumnCondition) { continue; } int idx; if (e.getLeftNode().getRangeVariable() == range) { idx = e.getLeftNode().getColumnIndex(); } else if (e.getRightNode().getRangeVariable() == range) { idx = e.getRightNode().getColumnIndex(); } else { continue; } if (e.isSingleColumnEqual) { colIndexSetEqual.add(idx); } else { int count = colIndexSetOther.get(idx, 0); colIndexSetOther.put(idx, count + 1); } } } /** * Assigns a set of conditions to a range variable. */ void assignToRangeVariable(RangeVariable rangeVar, RangeVariableConditions conditions, int rangeVarIndex, HsqlList exprList) { if (exprList.isEmpty()) { return; } setIndexConditions(conditions, exprList, rangeVarIndex, true); } private void setIndexConditions(RangeVariableConditions conditions, HsqlList exprList, int rangeVarIndex, boolean includeOr) { boolean hasIndex; colIndexSetEqual.clear(); colIndexSetOther.clear(); for (int j = 0, size = exprList.size(); j < size; j++) { Expression e = (Expression) exprList.get(j); if (e == null) { continue; } if (!e.isIndexable(conditions.rangeVar)) { continue; } int type = e.getType(); switch (type) { case OpTypes.OR : { continue; } case OpTypes.COLUMN : { continue; } case OpTypes.EQUAL : { if (e.exprSubType == OpTypes.ANY_QUANTIFIED || e.exprSubType == OpTypes.ALL_QUANTIFIED) { continue; } if (e.getLeftNode().getRangeVariable() != conditions.rangeVar) { continue; } int colIndex = e.getLeftNode().getColumnIndex(); colIndexSetEqual.add(colIndex); break; } case OpTypes.IS_NULL : { if (e.getLeftNode().getRangeVariable() != conditions.rangeVar) { continue; } if (conditions.rangeVar.isLeftJoin) { continue; } int colIndex = e.getLeftNode().getColumnIndex(); colIndexSetEqual.add(colIndex); break; } case OpTypes.NOT : { if (e.getLeftNode().getLeftNode().getRangeVariable() != conditions.rangeVar) { continue; } if (conditions.rangeVar.isLeftJoin) { continue; } int colIndex = e.getLeftNode().getLeftNode().getColumnIndex(); int count = colIndexSetOther.get(colIndex, 0); colIndexSetOther.put(colIndex, count + 1); break; } case OpTypes.SMALLER : case OpTypes.SMALLER_EQUAL : case OpTypes.GREATER : case OpTypes.GREATER_EQUAL : { if (e.getLeftNode().getRangeVariable() != conditions.rangeVar) { continue; } int colIndex = e.getLeftNode().getColumnIndex(); int count = colIndexSetOther.get(colIndex, 0); colIndexSetOther.put(colIndex, count + 1); break; } default : { Error.runtimeError(ErrorCode.U_S0500, "RangeVariableResolver"); } } } setEqualityConditions(conditions, exprList, rangeVarIndex); hasIndex = conditions.hasIndex(); if (!hasIndex) { setNonEqualityConditions(conditions, exprList, rangeVarIndex); } if (rangeVarIndex == 0 && sortAndSlice.usingIndex) { hasIndex = true; } else { hasIndex = conditions.hasIndex(); } boolean isOR = false; if (!hasIndex && includeOr) { for (int j = 0, size = exprList.size(); j < size; j++) { Expression e = (Expression) exprList.get(j); if (e == null) { continue; } if (e.getType() == OpTypes.OR) { hasIndex = ((ExpressionLogical) e).isIndexable( conditions.rangeVar); if (hasIndex) { hasIndex = setOrConditions(conditions, (ExpressionLogical) e, rangeVarIndex); } if (hasIndex) { exprList.set(j, null); isOR = true; break; } } else if (e.getType() == OpTypes.EQUAL && e.exprSubType == OpTypes.ANY_QUANTIFIED) { if (rangeVarIndex >= firstLeftJoinIndex || firstRightJoinIndex != rangeVariables.length) { continue; } if (e.getRightNode().isCorrelated()) { continue; } OrderedIntHashSet set = new OrderedIntHashSet(); ((ExpressionLogical) e).addLeftColumnsForAllAny( conditions.rangeVar, set); IndexUse[] indexes = conditions.rangeVar.rangeTable.getIndexForColumns( session, set, OpTypes.EQUAL, false); // code to disable IN optimisation // index = null; if (indexes.length != 0 && inExpressions[rangeVarIndex] == null) { inExpressions[rangeVarIndex] = e; inInJoin[rangeVarIndex] = conditions.isJoin; inExpressionCount++; exprList.set(j, null); break; } } } } for (int i = 0, size = exprList.size(); i < size; i++) { Expression e = (Expression) exprList.get(i); if (e == null) { continue; } if (isOR) { for (int j = 0; j < conditions.rangeVar.joinConditions.length; j++) { if (conditions.isJoin) { conditions.rangeVar.joinConditions[j] .nonIndexCondition = ExpressionLogical .andExpressions(e, conditions.rangeVar .joinConditions[j].nonIndexCondition); } else { conditions.rangeVar.whereConditions[j] .nonIndexCondition = ExpressionLogical .andExpressions(e, conditions.rangeVar .whereConditions[j].nonIndexCondition); } } } else { conditions.addCondition(e); } } } private boolean setOrConditions(RangeVariableConditions conditions, ExpressionLogical orExpression, int rangeVarIndex) { HsqlArrayList orExprList = new HsqlArrayList(); decomposeOrConditions(orExpression, orExprList); RangeVariableConditions[] conditionsArray = new RangeVariableConditions[orExprList.size()]; for (int i = 0; i < orExprList.size(); i++) { HsqlArrayList exprList = new HsqlArrayList(); Expression e = (Expression) orExprList.get(i); decomposeAndConditions(session, e, exprList); RangeVariableConditions c = new RangeVariableConditions(conditions); setIndexConditions(c, exprList, rangeVarIndex, false); conditionsArray[i] = c; if (!c.hasIndex()) { // deep OR return false; } } Expression exclude = null; for (int i = 0; i < conditionsArray.length; i++) { RangeVariableConditions c = conditionsArray[i]; conditionsArray[i].excludeConditions = exclude; if (i == conditionsArray.length - 1) { break; } Expression e = null; if (c.indexCond != null) { for (int k = 0; k < c.indexedColumnCount; k++) { e = ExpressionLogical.andExpressions(e, c.indexCond[k]); } } e = ExpressionLogical.andExpressions(e, c.indexEndCondition); e = ExpressionLogical.andExpressions(e, c.nonIndexCondition); exclude = ExpressionLogical.orExpressions(e, exclude); } if (exclude != null) { // return false; } if (conditions.isJoin) { conditions.rangeVar.joinConditions = conditionsArray; conditionsArray = new RangeVariableConditions[orExprList.size()]; ArrayUtil.fillArray(conditionsArray, conditions.rangeVar.whereConditions[0]); conditions.rangeVar.whereConditions = conditionsArray; } else { conditions.rangeVar.whereConditions = conditionsArray; conditionsArray = new RangeVariableConditions[orExprList.size()]; ArrayUtil.fillArray(conditionsArray, conditions.rangeVar.joinConditions[0]); conditions.rangeVar.joinConditions = conditionsArray; } return true; } private void setEqualityConditions(RangeVariableConditions conditions, HsqlList exprList, int rangeVarIndex) { Index index = null; if (rangeVarIndex == 0 && sortAndSlice.usingIndex) { index = sortAndSlice.primaryTableIndex; if (index != null) { conditions.rangeIndex = index; } } if (index == null) { IndexUse[] indexes = conditions.rangeVar.rangeTable.getIndexForColumns(session, colIndexSetEqual, OpTypes.EQUAL, false); if (indexes.length == 0) { return; } index = indexes[0].index; double cost = Double.MAX_VALUE; if (indexes.length > 1) { for (int i = 0; i < indexes.length; i++) { PersistentStore store = conditions.rangeVar.rangeTable.getRowStore(session); double currentCost = store.searchCost(session, indexes[i].index, indexes[i].columnCount, OpTypes.EQUAL); if (currentCost < cost) { cost = currentCost; index = indexes[i].index; } } } } int[] cols = index.getColumns(); int colCount = cols.length; Expression[] firstRowExpressions = new Expression[cols.length]; for (int j = 0; j < exprList.size(); j++) { Expression e = (Expression) exprList.get(j); if (e == null) { continue; } int type = e.getType(); if (type == OpTypes.EQUAL || type == OpTypes.IS_NULL) { if (e.getLeftNode().getRangeVariable() != conditions.rangeVar) { continue; } if (!e.isIndexable(conditions.rangeVar)) { continue; } int offset = ArrayUtil.find(cols, e.getLeftNode().getColumnIndex()); if (offset != -1 && firstRowExpressions[offset] == null) { firstRowExpressions[offset] = e; exprList.set(j, null); continue; } } } boolean hasNull = false; for (int i = 0; i < firstRowExpressions.length; i++) { Expression e = firstRowExpressions[i]; if (e == null) { if (colCount == cols.length) { colCount = i; } hasNull = true; continue; } if (hasNull) { exprList.add(e); firstRowExpressions[i] = null; } } if (colCount > 0) { conditions.addIndexCondition(firstRowExpressions, index, colCount); } } private void setNonEqualityConditions(RangeVariableConditions conditions, HsqlList exprList, int rangeVarIndex) { if (colIndexSetOther.isEmpty()) { return; } int currentCount = 0; Index index = null; Iterator it; if (rangeVarIndex == 0 && sortAndSlice.usingIndex) { index = sortAndSlice.primaryTableIndex; } if (index == null) { it = colIndexSetOther.keySet().iterator(); while (it.hasNext()) { int colIndex = it.nextInt(); int colCount = colIndexSetOther.get(colIndex, 0); if (colCount > currentCount) { Index currentIndex = conditions.rangeVar.rangeTable.getIndexForColumn( session, colIndex); if (currentIndex != null) { index = currentIndex; currentCount = colCount; } } } } if (index == null) { return; } int[] cols = index.getColumns(); for (int j = 0; j < exprList.size(); j++) { Expression e = (Expression) exprList.get(j); if (e == null) { continue; } boolean isIndexed = false; switch (e.getType()) { case OpTypes.NOT : { if (e.getLeftNode().getType() == OpTypes.IS_NULL && cols[0] == e.getLeftNode().getLeftNode() .getColumnIndex()) { isIndexed = true; } break; } case OpTypes.SMALLER : case OpTypes.SMALLER_EQUAL : case OpTypes.GREATER : case OpTypes.GREATER_EQUAL : { if (cols[0] == e.getLeftNode().getColumnIndex()) { if (e.getRightNode() != null && !e.getRightNode().isCorrelated()) { isIndexed = true; } } break; } } if (isIndexed) { Expression[] firstRowExpressions = new Expression[index.getColumnCount()]; firstRowExpressions[0] = e; conditions.addIndexCondition(firstRowExpressions, index, 1); exprList.set(j, null); break; } } } /** * Converts an IN conditions into a JOIN */ void setInConditionsAsTables() { for (int i = rangeVariables.length - 1; i >= 0; i--) { RangeVariable rangeVar = rangeVariables[i]; ExpressionLogical in = (ExpressionLogical) inExpressions[i]; if (in != null) { OrderedIntHashSet set = new OrderedIntHashSet(); in.addLeftColumnsForAllAny(rangeVar, set); IndexUse[] indexes = rangeVar.rangeTable.getIndexForColumns(session, set, OpTypes.EQUAL, false); Index index = indexes[0].index; int indexedColCount = 0; for (int j = 0; j < index.getColumnCount(); j++) { if (set.contains(index.getColumns()[j])) { indexedColCount++; } else { break; } } RangeVariable newRangeVar = new RangeVariable(in.getRightNode().getTable(), null, null, null, compileContext); newRangeVar.isGenerated = true; RangeVariable[] newList = new RangeVariable[rangeVariables.length + 1]; ArrayUtil.copyAdjustArray(rangeVariables, newList, newRangeVar, i, 1); rangeVariables = newList; // make two columns as arg Expression[] exprList = new Expression[index.getColumnCount()]; for (int j = 0; j < indexedColCount; j++) { int leftIndex = index.getColumns()[j]; int rightIndex = set.getIndex(leftIndex); Expression e = new ExpressionLogical(rangeVar, leftIndex, newRangeVar, rightIndex); exprList[j] = e; } boolean isOuter = rangeVariables[i].isLeftJoin || rangeVariables[i].isRightJoin; RangeVariableConditions conditions = !inInJoin[i] && isOuter ? rangeVar.whereConditions[0] : rangeVar.joinConditions[0]; conditions.addIndexCondition(exprList, index, indexedColCount); for (int j = 0; j < set.size(); j++) { int leftIndex = set.get(j); int rightIndex = j; Expression e = new ExpressionLogical(rangeVar, leftIndex, newRangeVar, rightIndex); conditions.addCondition(e); } } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ParserDML.java0000644000175000017500000012741012007547370021404 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.RangeGroup.RangeGroupSimple; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.HsqlList; import org.hsqldb.lib.LongDeque; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.types.Type; /** * Parser for DML statements * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class ParserDML extends ParserDQL { ParserDML(Session session, Scanner t) { super(session, t); } /** * Retrieves an INSERT Statement from this parse context. */ StatementDMQL compileInsertStatement(RangeGroup[] rangeGroups) { read(); readThis(Tokens.INTO); boolean[] columnCheckList; int[] columnMap; int colCount; Table table; RangeVariable range; boolean overridingUser = false; boolean overridingSystem = false; boolean assignsToIdentity = false; range = readRangeVariableForDataChange(StatementTypes.INSERT); range.resolveRangeTableTypes(session, RangeVariable.emptyArray); table = range.getTable(); columnCheckList = null; columnMap = table.getColumnMap(); colCount = table.getColumnCount(); int position = getPosition(); Table baseTable = table.isTriggerInsertable() ? table : table.getBaseTable(); switch (token.tokenType) { case Tokens.DEFAULT : { read(); readThis(Tokens.VALUES); Expression insertExpression = new Expression(OpTypes.ROW, new Expression[]{}); insertExpression = new Expression(OpTypes.VALUELIST, new Expression[]{ insertExpression }); columnCheckList = table.getNewColumnCheckList(); for (int i = 0; i < table.colDefaults.length; i++) { if (table.colDefaults[i] == null && table.identityColumn != i) { if (!table.getColumn(i).isGenerated()) { throw Error.error(ErrorCode.X_42544); } } } StatementDMQL cs = new StatementInsert(session, table, columnMap, insertExpression, columnCheckList, compileContext); return cs; } case Tokens.OPENBRACKET : { int brackets = readOpenBrackets(); if (brackets == 1) { boolean isQuery = false; switch (token.tokenType) { case Tokens.WITH : case Tokens.SELECT : case Tokens.TABLE : { rewind(position); isQuery = true; break; } default : } if (isQuery) { break; } OrderedHashSet columnNames = new OrderedHashSet(); boolean withPrefix = database.sqlSyntaxOra; readSimpleColumnNames(columnNames, range, withPrefix); readThis(Tokens.CLOSEBRACKET); colCount = columnNames.size(); columnMap = table.getColumnIndexes(columnNames); if (token.tokenType != Tokens.VALUES && token.tokenType != Tokens.OVERRIDING) { break; } // fall through } else { rewind(position); break; } } // fall through case Tokens.OVERRIDING : { if (token.tokenType == Tokens.OVERRIDING) { read(); if (token.tokenType == Tokens.USER) { read(); overridingUser = true; } else if (token.tokenType == Tokens.SYSTEM) { read(); overridingSystem = true; } else { unexpectedToken(); } readThis(Tokens.VALUE); if (token.tokenType != Tokens.VALUES) { break; } } } // fall through case Tokens.VALUES : { read(); columnCheckList = table.getColumnCheckList(columnMap); Expression insertExpressions = XreadContextuallyTypedTable(colCount); HsqlList unresolved = insertExpressions.resolveColumnReferences(session, RangeGroup.emptyGroup, rangeGroups, null); ExpressionColumn.checkColumnsResolved(unresolved); insertExpressions.resolveTypes(session, null); setParameterTypes(insertExpressions, table, columnMap); if (table != baseTable) { int[] baseColumnMap = table.getBaseTableColumnMap(); int[] newColumnMap = new int[columnMap.length]; ArrayUtil.projectRow(baseColumnMap, columnMap, newColumnMap); columnMap = newColumnMap; } Expression[] rowList = insertExpressions.nodes; for (int j = 0; j < rowList.length; j++) { Expression[] rowArgs = rowList[j].nodes; for (int i = 0; i < rowArgs.length; i++) { Expression e = rowArgs[i]; ColumnSchema column = baseTable.getColumn(columnMap[i]); if (column.isIdentity()) { assignsToIdentity = true; if (e.getType() != OpTypes.DEFAULT) { if (baseTable.identitySequence.isAlways()) { if (!overridingUser && !overridingSystem) { throw Error.error(ErrorCode.X_42543); } } if (overridingUser) { rowArgs[i] = new ExpressionColumn(OpTypes.DEFAULT); } } } else if (column.hasDefault()) {} else if (column.isGenerated()) { if (e.getType() != OpTypes.DEFAULT) { throw Error.error(ErrorCode.X_42541); } } else { if (e.getType() == OpTypes.DEFAULT) { throw Error.error(ErrorCode.X_42544); } } if (e.isUnresolvedParam()) { e.setAttributesAsColumn(column, true); } } } if (!assignsToIdentity && (overridingUser || overridingSystem)) { unexpectedTokenRequire(Tokens.T_OVERRIDING); } StatementDMQL cs = new StatementInsert(session, table, columnMap, insertExpressions, columnCheckList, compileContext); return cs; } case Tokens.WITH : case Tokens.SELECT : case Tokens.TABLE : { break; } default : { throw unexpectedToken(); } } columnCheckList = table.getColumnCheckList(columnMap); if (baseTable != null && table != baseTable) { int[] baseColumnMap = table.getBaseTableColumnMap(); int[] newColumnMap = new int[columnMap.length]; ArrayUtil.projectRow(baseColumnMap, columnMap, newColumnMap); columnMap = newColumnMap; } int enforcedDefaultIndex = baseTable.getIdentityColumnIndex(); int overrideIndex = -1; if (enforcedDefaultIndex != -1 && ArrayUtil.find(columnMap, enforcedDefaultIndex) > -1) { if (baseTable.identitySequence.isAlways()) { if (!overridingUser && !overridingSystem) { throw Error.error(ErrorCode.X_42543); } } if (overridingUser) { overrideIndex = enforcedDefaultIndex; } } else if (overridingUser || overridingSystem) { unexpectedTokenRequire(Tokens.T_OVERRIDING); } Type[] types = new Type[columnMap.length]; ArrayUtil.projectRow(baseTable.getColumnTypes(), columnMap, types); compileContext.setOuterRanges(rangeGroups); QueryExpression queryExpression = XreadQueryExpression(); queryExpression.setReturningResult(); queryExpression.resolve(session, rangeGroups, types); if (colCount != queryExpression.getColumnCount()) { throw Error.error(ErrorCode.X_42546); } StatementDMQL cs = new StatementInsert(session, table, columnMap, columnCheckList, queryExpression, compileContext, overrideIndex); return cs; } private static void setParameterTypes(Expression tableExpression, Table table, int[] columnMap) { for (int i = 0; i < tableExpression.nodes.length; i++) { Expression[] list = tableExpression.nodes[i].nodes; for (int j = 0; j < list.length; j++) { if (list[j].isUnresolvedParam()) { list[j].setAttributesAsColumn( table.getColumn(columnMap[j]), true); } } } } Statement compileTruncateStatement() { boolean isTable = false; boolean withCommit = false; boolean noCheck = false; boolean restartIdentity = false; HsqlName objectName = null; RangeVariable[] rangeVariables = null; Table table = null; HsqlName[] writeTableNames = null; readThis(Tokens.TRUNCATE); if (token.tokenType == Tokens.TABLE) { readThis(Tokens.TABLE); rangeVariables = new RangeVariable[]{ readRangeVariableForDataChange(StatementTypes.TRUNCATE) }; table = rangeVariables[0].getTable(); objectName = table.getName(); isTable = true; } else { readThis(Tokens.SCHEMA); objectName = readSchemaName(); } switch (token.tokenType) { case Tokens.CONTINUE : { read(); readThis(Tokens.IDENTITY); break; } case Tokens.RESTART : { read(); readThis(Tokens.IDENTITY); restartIdentity = true; break; } } if (!isTable) { checkIsThis(Tokens.AND); } if (readIfThis(Tokens.AND)) { readThis(Tokens.COMMIT); withCommit = true; if (readIfThis(Tokens.NO)) { readThis(Tokens.CHECK); noCheck = true; } } if (isTable) { writeTableNames = new HsqlName[]{ table.getName() }; } else { writeTableNames = session.database.schemaManager.getCatalogAndBaseTableNames(); } if (withCommit) { Object[] args = new Object[] { objectName, restartIdentity, noCheck }; return new StatementCommand(StatementTypes.TRUNCATE, args, null, writeTableNames); } Statement cs = new StatementDML(session, table, rangeVariables, compileContext, restartIdentity, StatementTypes.TRUNCATE); return cs; } /** * Creates a DELETE-type Statement from this parse context. */ Statement compileDeleteStatement(RangeGroup[] rangeGroups) { Expression condition = null; boolean restartIdentity = false; readThis(Tokens.DELETE); readThis(Tokens.FROM); RangeVariable[] rangeVariables = null; Table table = null; rangeVariables = new RangeVariable[]{ readRangeVariableForDataChange(StatementTypes.DELETE_WHERE) }; table = rangeVariables[0].getTable(); compileContext.setOuterRanges(rangeGroups); if (token.tokenType == Tokens.WHERE) { read(); condition = XreadBooleanValueExpression(); RangeGroup rangeGroup = new RangeGroupSimple(rangeVariables); HsqlList unresolved = condition.resolveColumnReferences(session, rangeGroup, rangeGroups, null); ExpressionColumn.checkColumnsResolved(unresolved); condition.resolveTypes(session, null); if (condition.isUnresolvedParam()) { condition.dataType = Type.SQL_BOOLEAN; } if (condition.getDataType() != Type.SQL_BOOLEAN) { throw Error.error(ErrorCode.X_42568); } } Table baseTable = table.isTriggerDeletable() ? table : table.getBaseTable(); if (table != baseTable) { QuerySpecification baseSelect = ((TableDerived) table).getQueryExpression().getMainSelect(); RangeVariable[] newRangeVariables = (RangeVariable[]) ArrayUtil.duplicateArray( baseSelect.rangeVariables); newRangeVariables[0] = baseSelect.rangeVariables[0].duplicate(); Expression[] newBaseExprColumns = new Expression[baseSelect.indexLimitData]; for (int i = 0; i < baseSelect.indexLimitData; i++) { Expression e = baseSelect.exprColumns[i].duplicate(); newBaseExprColumns[i] = e; e.replaceRangeVariables(baseSelect.rangeVariables, newRangeVariables); } Expression baseQueryCondition = baseSelect.queryCondition; if (baseQueryCondition != null) { baseQueryCondition = baseQueryCondition.duplicate(); baseQueryCondition.replaceRangeVariables(rangeVariables, newRangeVariables); } if (condition != null) { condition = condition.replaceColumnReferences(rangeVariables[0], newBaseExprColumns); } rangeVariables = newRangeVariables; condition = ExpressionLogical.andExpressions(baseQueryCondition, condition); } if (condition != null) { rangeVariables[0].addJoinCondition(condition); RangeVariableResolver resolver = new RangeVariableResolver(rangeVariables, null, compileContext); resolver.processConditions(session); rangeVariables = resolver.rangeVariables; } for (int i = 0; i < rangeVariables.length; i++) { rangeVariables[i].resolveRangeTableTypes(session, RangeVariable.emptyArray); } Statement cs = new StatementDML(session, table, rangeVariables, compileContext, restartIdentity, StatementTypes.DELETE_WHERE); return cs; } /** * Creates an UPDATE-type Statement from this parse context. */ StatementDMQL compileUpdateStatement(RangeGroup[] rangeGroups) { read(); Expression[] updateExpressions; int[] columnMap; boolean[] columnCheckList; OrderedHashSet targetSet = new OrderedHashSet(); LongDeque colIndexList = new LongDeque(); HsqlArrayList exprList = new HsqlArrayList(); RangeVariable[] rangeVariables = { readRangeVariableForDataChange(StatementTypes.UPDATE_WHERE) }; RangeGroup rangeGroup = new RangeGroupSimple(rangeVariables); Table table = rangeVariables[0].rangeTable; Table baseTable = table.isTriggerUpdatable() ? table : table.getBaseTable(); readThis(Tokens.SET); readSetClauseList(rangeVariables, targetSet, colIndexList, exprList); columnMap = new int[colIndexList.size()]; colIndexList.toArray(columnMap); Expression[] targets = new Expression[targetSet.size()]; targetSet.toArray(targets); for (int i = 0; i < targets.length; i++) { this.resolveOuterReferencesAndTypes(rangeGroups, targets[i]); } columnCheckList = table.getColumnCheckList(columnMap); updateExpressions = new Expression[exprList.size()]; exprList.toArray(updateExpressions); Expression condition = null; if (token.tokenType == Tokens.WHERE) { read(); condition = XreadBooleanValueExpression(); HsqlList unresolved = condition.resolveColumnReferences(session, rangeGroup, rangeGroups, null); ExpressionColumn.checkColumnsResolved(unresolved); condition.resolveTypes(session, null); if (condition.isUnresolvedParam()) { condition.dataType = Type.SQL_BOOLEAN; } if (condition.getDataType() != Type.SQL_BOOLEAN) { throw Error.error(ErrorCode.X_42568); } } resolveUpdateExpressions(table, rangeGroup, columnMap, updateExpressions, rangeGroups); if (table != baseTable) { QuerySpecification baseSelect = ((TableDerived) table).getQueryExpression().getMainSelect(); RangeVariable[] newRangeVariables = (RangeVariable[]) ArrayUtil.duplicateArray( baseSelect.rangeVariables); newRangeVariables[0] = baseSelect.rangeVariables[0].duplicate(); Expression[] newBaseExprColumns = new Expression[baseSelect.indexLimitData]; for (int i = 0; i < baseSelect.indexLimitData; i++) { Expression e = baseSelect.exprColumns[i].duplicate(); newBaseExprColumns[i] = e; e.replaceRangeVariables(baseSelect.rangeVariables, newRangeVariables); } Expression baseQueryCondition = baseSelect.queryCondition; if (baseQueryCondition != null) { baseQueryCondition = baseQueryCondition.duplicate(); baseQueryCondition.replaceRangeVariables(rangeVariables, newRangeVariables); } if (condition != null) { condition = condition.replaceColumnReferences(rangeVariables[0], newBaseExprColumns); } for (int i = 0; i < updateExpressions.length; i++) { updateExpressions[i] = updateExpressions[i].replaceColumnReferences( rangeVariables[0], newBaseExprColumns); } rangeVariables = newRangeVariables; condition = ExpressionLogical.andExpressions(baseQueryCondition, condition); } if (condition != null) { rangeVariables[0].addJoinCondition(condition); RangeVariableResolver resolver = new RangeVariableResolver(rangeVariables, null, compileContext); resolver.processConditions(session); rangeVariables = resolver.rangeVariables; } for (int i = 0; i < rangeVariables.length; i++) { rangeVariables[i].resolveRangeTableTypes(session, RangeVariable.emptyArray); } if (table != baseTable) { int[] baseColumnMap = table.getBaseTableColumnMap(); int[] newColumnMap = new int[columnMap.length]; ArrayUtil.projectRow(baseColumnMap, columnMap, newColumnMap); columnMap = newColumnMap; for (int i = 0; i < columnMap.length; i++) { if (baseTable.colGenerated[columnMap[i]]) { throw Error.error(ErrorCode.X_42513); } } } StatementDMQL cs = new StatementDML(session, targets, table, rangeVariables, columnMap, updateExpressions, columnCheckList, compileContext); return cs; } void resolveUpdateExpressions(Table targetTable, RangeGroup rangeGroup, int[] columnMap, Expression[] colExpressions, RangeGroup[] rangeGroups) { HsqlList unresolved = null; int enforcedDefaultIndex = -1; if (targetTable.hasIdentityColumn() && targetTable.identitySequence.isAlways()) { enforcedDefaultIndex = targetTable.getIdentityColumnIndex(); } for (int i = 0, ix = 0; i < columnMap.length; ix++) { Expression expr = colExpressions[ix]; Expression e; // no generated column can be updated if (targetTable.colGenerated[columnMap[i]]) { throw Error.error(ErrorCode.X_42513); } if (expr.getType() == OpTypes.ROW) { Expression[] elements = expr.nodes; for (int j = 0; j < elements.length; j++, i++) { e = elements[j]; if (enforcedDefaultIndex == columnMap[i]) { if (e.getType() != OpTypes.DEFAULT) { throw Error.error(ErrorCode.X_42541); } } if (e.isUnresolvedParam()) { e.setAttributesAsColumn( targetTable.getColumn(columnMap[i]), true); } else if (e.getType() == OpTypes.DEFAULT) { if (targetTable.colDefaults[columnMap[i]] == null && targetTable.identityColumn != columnMap[i]) { throw Error.error(ErrorCode.X_42544); } } else { unresolved = expr.resolveColumnReferences(session, rangeGroup, rangeGroups, null); ExpressionColumn.checkColumnsResolved(unresolved); unresolved = null; e.resolveTypes(session, null); } } } else if (expr.getType() == OpTypes.ROW_SUBQUERY) { unresolved = expr.resolveColumnReferences(session, rangeGroup, rangeGroups, null); ExpressionColumn.checkColumnsResolved(unresolved); expr.resolveTypes(session, null); int count = expr.table.queryExpression.getColumnCount(); for (int j = 0; j < count; j++, i++) { if (enforcedDefaultIndex == columnMap[i]) { throw Error.error(ErrorCode.X_42541); } } } else { e = expr; if (enforcedDefaultIndex == columnMap[i]) { if (e.getType() != OpTypes.DEFAULT) { throw Error.error(ErrorCode.X_42541); } } if (e.isUnresolvedParam()) { e.setAttributesAsColumn( targetTable.getColumn(columnMap[i]), true); } else if (e.getType() == OpTypes.DEFAULT) { if (targetTable.colDefaults[columnMap[i]] == null && targetTable.identityColumn != columnMap[i]) { throw Error.error(ErrorCode.X_42544); } } else { unresolved = expr.resolveColumnReferences(session, rangeGroup, rangeGroups, null); ExpressionColumn.checkColumnsResolved(unresolved); e.resolveTypes(session, null); } i++; } } } void readSetClauseList(RangeVariable[] rangeVars, OrderedHashSet targets, LongDeque colIndexList, HsqlArrayList expressions) { while (true) { int degree; if (token.tokenType == Tokens.OPENBRACKET) { read(); int oldCount = targets.size(); readTargetSpecificationList(targets, rangeVars, colIndexList); degree = targets.size() - oldCount; readThis(Tokens.CLOSEBRACKET); } else { Expression target = XreadTargetSpecification(rangeVars, colIndexList); if (!targets.add(target)) { ColumnSchema col = target.getColumn(); throw Error.error(ErrorCode.X_42579, col.getName().name); } degree = 1; } readThis(Tokens.EQUALS); int position = getPosition(); int brackets = readOpenBrackets(); if (token.tokenType == Tokens.SELECT) { rewind(position); TableDerived td = XreadSubqueryTableBody(OpTypes.ROW_SUBQUERY); if (degree != td.queryExpression.getColumnCount()) { throw Error.error(ErrorCode.X_42546); } Expression e = new Expression(OpTypes.ROW_SUBQUERY, td); expressions.add(e); if (token.tokenType == Tokens.COMMA) { read(); continue; } break; } if (brackets > 0) { rewind(position); } if (degree > 1) { readThis(Tokens.OPENBRACKET); Expression e = readRow(); readThis(Tokens.CLOSEBRACKET); int rowDegree = e.getType() == OpTypes.ROW ? e.nodes.length : 1; if (degree != rowDegree) { throw Error.error(ErrorCode.X_42546); } expressions.add(e); } else { Expression e = XreadValueExpressionWithContext(); expressions.add(e); } if (token.tokenType == Tokens.COMMA) { read(); continue; } break; } } void readGetClauseList(RangeVariable[] rangeVars, OrderedHashSet targets, LongDeque colIndexList, HsqlArrayList expressions) { while (true) { Expression target = XreadTargetSpecification(rangeVars, colIndexList); if (!targets.add(target)) { ColumnSchema col = target.getColumn(); throw Error.error(ErrorCode.X_42579, col.getName().name); } readThis(Tokens.EQUALS); switch (token.tokenType) { case Tokens.ROW_COUNT : case Tokens.MORE : int columnIndex = ExpressionColumn.diagnosticsList.getIndex( token.tokenString); Expression e = new ExpressionColumn(OpTypes.DIAGNOSTICS_VARIABLE, columnIndex); expressions.add(e); read(); break; } if (token.tokenType == Tokens.COMMA) { read(); continue; } break; } } /** * Retrieves a MERGE Statement from this parse context. */ StatementDMQL compileMergeStatement(RangeGroup[] rangeGroups) { boolean[] insertColumnCheckList; int[] insertColumnMap = null; int[] updateColumnMap = null; int[] baseUpdateColumnMap; Table table; RangeVariable targetRange; RangeVariable sourceRange; Expression mergeCondition; Expression[] targets = null; HsqlArrayList updateList = new HsqlArrayList(); Expression[] updateExpressions = Expression.emptyArray; HsqlArrayList insertList = new HsqlArrayList(); Expression insertExpression = null; read(); readThis(Tokens.INTO); targetRange = readRangeVariableForDataChange(StatementTypes.MERGE); table = targetRange.rangeTable; readThis(Tokens.USING); compileContext.setOuterRanges(rangeGroups); sourceRange = readTableOrSubquery(); RangeVariable[] targetRanges = new RangeVariable[]{ targetRange }; sourceRange.resolveRangeTable(session, new RangeGroupSimple(targetRanges), rangeGroups);; sourceRange.resolveRangeTableTypes(session, targetRanges); compileContext.setOuterRanges(RangeGroup.emptyArray); // parse ON search conditions readThis(Tokens.ON); mergeCondition = XreadBooleanValueExpression(); RangeVariable[] fullRangeVars = new RangeVariable[] { sourceRange, targetRange }; RangeVariable[] sourceRangeVars = new RangeVariable[]{ sourceRange }; RangeVariable[] targetRangeVars = new RangeVariable[]{ targetRange }; RangeGroup fullRangeGroup = new RangeGroupSimple(fullRangeVars); RangeGroup sourceRangeGroup = new RangeGroupSimple(sourceRangeVars); // parse WHEN clause(s) and convert lists to arrays insertColumnMap = table.getColumnMap(); insertColumnCheckList = table.getNewColumnCheckList(); OrderedHashSet updateTargetSet = new OrderedHashSet(); OrderedHashSet insertColNames = new OrderedHashSet(); LongDeque updateColIndexList = new LongDeque(); readMergeWhen(updateColIndexList, insertColNames, updateTargetSet, insertList, updateList, targetRangeVars, sourceRange); if (insertList.size() > 0) { int colCount = insertColNames.size(); if (colCount != 0) { insertColumnMap = table.getColumnIndexes(insertColNames); insertColumnCheckList = table.getColumnCheckList(insertColumnMap); } insertExpression = (Expression) insertList.get(0); setParameterTypes(insertExpression, table, insertColumnMap); } if (updateList.size() > 0) { targets = new Expression[updateTargetSet.size()]; updateTargetSet.toArray(targets); for (int i = 0; i < targets.length; i++) { this.resolveOuterReferencesAndTypes(rangeGroups, targets[i]); } updateExpressions = new Expression[updateList.size()]; updateList.toArray(updateExpressions); updateColumnMap = new int[updateColIndexList.size()]; updateColIndexList.toArray(updateColumnMap); } if (updateExpressions.length != 0) { Table baseTable = table.isTriggerUpdatable() ? table : table.getBaseTable(); baseUpdateColumnMap = updateColumnMap; if (table != baseTable) { baseUpdateColumnMap = new int[updateColumnMap.length]; ArrayUtil.projectRow(table.getBaseTableColumnMap(), updateColumnMap, baseUpdateColumnMap); } resolveUpdateExpressions(table, fullRangeGroup, updateColumnMap, updateExpressions, rangeGroups); } HsqlList unresolved = null; unresolved = mergeCondition.resolveColumnReferences(session, fullRangeGroup, rangeGroups, null); ExpressionColumn.checkColumnsResolved(unresolved); mergeCondition.resolveTypes(session, null); if (mergeCondition.isUnresolvedParam()) { mergeCondition.dataType = Type.SQL_BOOLEAN; } if (mergeCondition.getDataType() != Type.SQL_BOOLEAN) { throw Error.error(ErrorCode.X_42568); } fullRangeVars[1].addJoinCondition(mergeCondition); RangeVariableResolver resolver = new RangeVariableResolver(fullRangeVars, null, compileContext); resolver.processConditions(session); fullRangeVars = resolver.rangeVariables; for (int i = 0; i < fullRangeVars.length; i++) { fullRangeVars[i].resolveRangeTableTypes(session, RangeVariable.emptyArray); } if (insertExpression != null) { unresolved = insertExpression.resolveColumnReferences(session, sourceRangeGroup, RangeGroup.emptyArray, null); unresolved = Expression.resolveColumnSet(session, RangeVariable.emptyArray, rangeGroups, unresolved); ExpressionColumn.checkColumnsResolved(unresolved); insertExpression.resolveTypes(session, null); } StatementDMQL cs = new StatementDML(session, targets, fullRangeVars, insertColumnMap, updateColumnMap, insertColumnCheckList, mergeCondition, insertExpression, updateExpressions, compileContext); return cs; } /** * Parses a WHEN clause from a MERGE statement. This can be either a * WHEN MATCHED or WHEN NOT MATCHED clause, or both, and the appropriate * values will be updated. * * If the var that is to hold the data is not null, then we already * encountered this type of clause, which is only allowed once, and at least * one is required. */ private void readMergeWhen(LongDeque updateColIndexList, OrderedHashSet insertColumnNames, OrderedHashSet updateTargetSet, HsqlArrayList insertExpressions, HsqlArrayList updateExpressions, RangeVariable[] targetRangeVars, RangeVariable sourceRangeVar) { Table table = targetRangeVars[0].rangeTable; int columnCount = table.getColumnCount(); readThis(Tokens.WHEN); if (token.tokenType == Tokens.MATCHED) { if (updateExpressions.size() != 0) { throw Error.error(ErrorCode.X_42547); } read(); readThis(Tokens.THEN); readThis(Tokens.UPDATE); readThis(Tokens.SET); readSetClauseList(targetRangeVars, updateTargetSet, updateColIndexList, updateExpressions); } else if (token.tokenType == Tokens.NOT) { if (insertExpressions.size() != 0) { throw Error.error(ErrorCode.X_42548); } read(); readThis(Tokens.MATCHED); readThis(Tokens.THEN); readThis(Tokens.INSERT); // parse INSERT statement // optional column list int brackets = readOpenBrackets(); if (brackets == 1) { boolean withPrefix = database.sqlSyntaxOra; readSimpleColumnNames(insertColumnNames, targetRangeVars[0], withPrefix); columnCount = insertColumnNames.size(); readThis(Tokens.CLOSEBRACKET); brackets = 0; } readThis(Tokens.VALUES); Expression e = XreadContextuallyTypedTable(columnCount); if (e.nodes.length != 1) { throw Error.error(ErrorCode.X_21000); } insertExpressions.add(e); } else { throw unexpectedToken(); } if (token.tokenType == Tokens.WHEN) { readMergeWhen(updateColIndexList, insertColumnNames, updateTargetSet, insertExpressions, updateExpressions, targetRangeVars, sourceRangeVar); } } /** * Retrieves a CALL Statement from this parse context. */ // to do call argument name and type resolution StatementDMQL compileCallStatement(RangeGroup[] rangeGroups, boolean isStrictlyProcedure) { read(); if (isIdentifier()) { checkValidCatalogName(token.namePrePrefix); RoutineSchema routineSchema = (RoutineSchema) database.schemaManager.findSchemaObject( token.tokenString, session.getSchemaName(token.namePrefix), SchemaObject.PROCEDURE); if (routineSchema != null) { read(); HsqlArrayList list = new HsqlArrayList(); readThis(Tokens.OPENBRACKET); if (token.tokenType == Tokens.CLOSEBRACKET) { read(); } else { while (true) { Expression e = XreadValueExpression(); list.add(e); if (token.tokenType == Tokens.COMMA) { read(); } else { readThis(Tokens.CLOSEBRACKET); break; } } } Expression[] arguments = new Expression[list.size()]; list.toArray(arguments); Routine routine = routineSchema.getSpecificRoutine(arguments.length); compileContext.addProcedureCall(routine); HsqlList unresolved = null; for (int i = 0; i < arguments.length; i++) { Expression e = arguments[i]; if (e.isUnresolvedParam()) { e.setAttributesAsColumn( routine.getParameter(i), routine.getParameter(i).isWriteable()); } else { int paramMode = routine.getParameter(i).getParameterMode(); unresolved = arguments[i].resolveColumnReferences(session, RangeGroup.emptyGroup, rangeGroups, unresolved); if (paramMode != SchemaObject.ParameterModes.PARAM_IN) { if (e.getType() != OpTypes.VARIABLE) { throw Error.error(ErrorCode.X_42603); } } } } ExpressionColumn.checkColumnsResolved(unresolved); for (int i = 0; i < arguments.length; i++) { arguments[i].resolveTypes(session, null); if (!routine.getParameter( i).getDataType().canBeAssignedFrom( arguments[i].getDataType())) { throw Error.error(ErrorCode.X_42561); } } StatementDMQL cs = new StatementProcedure(session, routine, arguments, compileContext); return cs; } } if (isStrictlyProcedure) { throw Error.error(ErrorCode.X_42501, token.tokenString); } Expression expression = this.XreadValueExpression(); HsqlList unresolved = expression.resolveColumnReferences(session, RangeGroup.emptyGroup, rangeGroups, null); ExpressionColumn.checkColumnsResolved(unresolved); expression.resolveTypes(session, null); StatementDMQL cs = new StatementProcedure(session, expression, compileContext); return cs; } void resolveOuterReferencesAndTypes(RangeGroup[] rangeGroups, Expression e) { HsqlList unresolved = e.resolveColumnReferences(session, RangeGroup.emptyGroup, 0, rangeGroups, null, false); ExpressionColumn.checkColumnsResolved(unresolved); e.resolveTypes(session, null); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/0000755000175000017500000000000012007570424017714 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/DatabaseManager.java0000644000175000017500000012044412007547372023571 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.applet.Applet; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.Vector; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.Dimension; import java.awt.FileDialog; import java.awt.Font; import java.awt.Frame; import java.awt.Image; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.MenuShortcut; import java.awt.Panel; import java.awt.TextArea; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.image.MemoryImageSource; import org.hsqldb.lib.RCData; import org.hsqldb.lib.java.JavaSystem; // sqlbob@users 20020401 - patch 1.7.0 by sqlbob (RMP) - enhancements // sqlbob@users 20020401 - patch 537501 by ulrivo - command line arguments // sqlbob@users 20020407 - patch 1.7.0 - reengineering // nickferguson@users 20021005 - patch 1.7.1 - enhancements /* * unsaved@users 20050426 - Switched default switch method from "-switch" to * "--switch" because "-switch" usage is ambiguous as used here. Single * switches should be reserved for single-letter switches which can be mixed * like * "-u -r -l" = "-url". -blaine */ /** * AWT Tool for manageing a JDBC database.

              *

               *             Usage: java DatabaseManagerSwing [--options]
               *             where options include:
               *              --driver   jdbc driver class
               *              --url           jdbc url
               *              --user          username used for connection
               *              --password  password for this user
               *              --urlid        get connection info from RC file
               *              --rcfile        use instead of default (with urlid)
               *              --dir           default directory
               *              --script        reads from script file
               *
              * * Originally in HypersonicSQL. Extended in various versions of HSQLDB. * * @author Thomas Mueller (Hypersonic SQL Group) * @version 2.2.1 * @since Hypersonic SQL */ public class DatabaseManager extends Applet implements ActionListener, WindowListener, KeyListener { static final String NL = System.getProperty("line.separator"); static final int iMaxRecent = 24; private static boolean TT_AVAILABLE = false; //#ifdef JAVA2FULL static { try { Class.forName(DatabaseManager.class.getPackage().getName() + ".Transfer"); TT_AVAILABLE = true; } catch (Throwable t) {} } //#endif private static final String HELP_TEXT = "See the forums, mailing lists, and HSQLDB User Guide\n" + "at http://hsqldb.org.\n\n" + "Please paste the following version identifier with any\n" + "problem reports or help requests: $Revision: 4818 $" + (TT_AVAILABLE ? "" : ("\n\nTransferTool classes are not in CLASSPATH.\n" + "To enable the Tools menu, add 'transfer.jar' to your class path.")); ; private static final String ABOUT_TEXT = "$Revision: 4818 $ of DatabaseManager\n\n" + "Copyright (c) 1995-2000, The Hypersonic SQL Group.\n" + "Copyright (c) 2001-2011, The HSQL Development Group.\n" + "http://hsqldb.org (User Guide available at this site).\n\n\n" + "You may use and redistribute according to the HSQLDB\n" + "license documented in the source code and at the web\n" + "site above." // + (TT_AVAILABLE ? "\n\nTransferTool options are available." : ""); Connection cConn; DatabaseMetaData dMeta; Statement sStatement; Menu mRecent; String[] sRecent; int iRecent; TextArea txtCommand; Button butExecute; Button butClear; Tree tTree; Panel pResult; long lTime; int iResult; // 0: grid; 1: text Grid gResult; TextArea txtResult; boolean bHelp; Frame fMain; Image imgEmpty; static boolean bMustExit; String ifHuge = ""; // (ulrivo): variables set by arguments from the commandline static String defDriver = "org.hsqldb.jdbcDriver"; static String defURL = "jdbc:hsqldb:mem:."; static String defUser = "SA"; static String defPassword = ""; static String defScript; static String defDirectory; public void connect(Connection c) { if (c == null) { return; } if (cConn != null) { try { cConn.close(); } catch (SQLException e) {} } cConn = c; try { dMeta = cConn.getMetaData(); sStatement = cConn.createStatement(); refreshTree(); } catch (SQLException e) { e.printStackTrace(); } } public void init() { DatabaseManager m = new DatabaseManager(); m.main(); try { m.connect(ConnectionDialog.createConnection(defDriver, defURL, defUser, defPassword)); m.insertTestData(); m.refreshTree(); } catch (Exception e) { e.printStackTrace(); } } public static void threadedDBM() { System.getProperties().put("sun.java2d.noddraw", "true"); String urlid = null; String rcFile = null; boolean autoConnect = false; boolean urlidConnect = false; bMustExit = false; DatabaseManager m = new DatabaseManager(); m.main(); Connection c = null; try { c = ConnectionDialog.createConnection(m.fMain, "Connect"); } catch (Exception e) { e.printStackTrace(); } if (c == null) { return; } m.connect(c); } /** * Run with --help switch for usage instructions. * * @throws IllegalArgumentException for the obvious reason */ public static void main(String[] arg) { System.getProperties().put("sun.java2d.noddraw", "true"); // (ulrivo): read all arguments from the command line String currentArg; String lowerArg; String urlid = null; String rcFile = null; boolean autoConnect = false; boolean urlidConnect = false; bMustExit = true; for (int i = 0; i < arg.length; i++) { currentArg = arg[i]; lowerArg = arg[i].toLowerCase(); if (lowerArg.startsWith("--")) { lowerArg = lowerArg.substring(1); } if (lowerArg.equals("-noexit") || lowerArg.equals("-help")) { // } else if (i == arg.length - 1) { throw new IllegalArgumentException("No value for argument " + currentArg); } i++; if (lowerArg.equals("-driver")) { defDriver = arg[i]; autoConnect = true; } else if (lowerArg.equals("-url")) { defURL = arg[i]; autoConnect = true; } else if (lowerArg.equals("-user")) { defUser = arg[i]; autoConnect = true; } else if (lowerArg.equals("-password")) { defPassword = arg[i]; autoConnect = true; } else if (lowerArg.equals("-urlid")) { urlid = arg[i]; urlidConnect = true; } else if (lowerArg.equals("-rcfile")) { rcFile = arg[i]; urlidConnect = true; } else if (lowerArg.equals("-dir")) { defDirectory = arg[i]; } else if (lowerArg.equals("-script")) { defScript = arg[i]; } else if (lowerArg.equals("-noexit")) { bMustExit = false; i--; } else if (lowerArg.equals("-help")) { showUsage(); return; } else { /* Syntax ERRORS should either throw or exit with non-0 status. * In our case, it may be unsafe to exit, so we throw. * (I.e. should provide easy way for caller to programmatically * determine that there was an invocation problem). */ throw new IllegalArgumentException( "invalid argrument " + currentArg + " try: java... " + DatabaseManagerSwing.class.getName() + " --help"); // No reason to localize, since the main syntax message is // not localized. } } DatabaseManager m = new DatabaseManager(); m.main(); Connection c = null; try { if (autoConnect && urlidConnect) { throw new IllegalArgumentException( "You may not specify both (urlid) AND (url/user/password)."); } if (autoConnect) { c = ConnectionDialog.createConnection(defDriver, defURL, defUser, defPassword); } else if (urlidConnect) { if (urlid == null) { throw new IllegalArgumentException( "You must specify an 'urlid' to use an RC file"); } autoConnect = true; if (rcFile == null) { rcFile = System.getProperty("user.home") + "/dbmanager.rc"; } c = new RCData(new File(rcFile), urlid).getConnection(null, System.getProperty("javax.net.ssl.trustStore")); } else { c = ConnectionDialog.createConnection(m.fMain, "Connect"); } } catch (Exception e) { e.printStackTrace(); } if (c == null) { return; } m.connect(c); } private static void showUsage() { System.out.println( "Usage: java DatabaseManager [--options]\n" + "where options include:\n" + " --help show this message\n" + " --driver jdbc driver class\n" + " --url jdbc url\n" + " --user username used for connection\n" + " --password password for this user\n" + " --urlid use url/user/password/driver in rc file\n" + " --rcfile (defaults to 'dbmanager.rc' in home dir)\n" + " --dir default directory\n" + " --script reads from script file\n" + " --noexit do not call system.exit()"); } void insertTestData() { try { DatabaseManagerCommon.createTestTables(sStatement); refreshTree(); txtCommand.setText( DatabaseManagerCommon.createTestData(sStatement)); refreshTree(); for (int i = 0; i < DatabaseManagerCommon.testDataSql.length; i++) { addToRecent(DatabaseManagerCommon.testDataSql[i]); } execute(); } catch (SQLException e) { e.printStackTrace(); } } public void main() { fMain = new Frame("HSQL Database Manager"); imgEmpty = createImage(new MemoryImageSource(2, 2, new int[4 * 4], 2, 2)); fMain.setIconImage(imgEmpty); fMain.addWindowListener(this); MenuBar bar = new MenuBar(); // used shortcuts: CERGTSIUDOLM String[] fitems = { "-Connect...", "--", "-Open Script...", "-Save Script...", "-Save Result...", "-Save Result csv...", "--", "-Exit" }; addMenu(bar, "File", fitems); String[] vitems = { "RRefresh Tree", "--", "GResults in Grid", "TResults in Text", "--", "1Shrink Tree", "2Enlarge Tree", "3Shrink Command", "4Enlarge Command" }; addMenu(bar, "View", vitems); String[] sitems = { "SSELECT", "IINSERT", "UUPDATE", "DDELETE", "--", "-CREATE TABLE", "-DROP TABLE", "-CREATE INDEX", "-DROP INDEX", "--", "-CHECKPOINT", "-SCRIPT", "-SET", "-SHUTDOWN", "--", "-Test Script" }; addMenu(bar, "Command", sitems); Menu recent = new Menu("Recent"); mRecent = new Menu("Recent"); bar.add(mRecent); String[] soptions = { "-AutoCommit on", "-AutoCommit off", "OCommit", "LRollback", "--", "-Disable MaxRows", "-Set MaxRows to 100", "--", "-Logging on", "-Logging off", "--", "-Insert test data" }; addMenu(bar, "Options", soptions); String[] stools = { "-Dump", "-Restore", "-Transfer" }; addMenu(bar, "Tools", stools); Menu hMenu = new Menu("Help"); MenuItem aItem = new MenuItem("About"); aItem.setShortcut(new MenuShortcut('A')); aItem.addActionListener(this); hMenu.add(aItem); MenuItem hItem = new MenuItem("Help"); hItem.setShortcut(new MenuShortcut('H')); hItem.addActionListener(this); hMenu.add(hItem); //bar.add(hMenu); // Command above disabled only until a help display bug is fixed. fMain.setMenuBar(bar); fMain.setSize(640, 480); fMain.add("Center", this); initGUI(); sRecent = new String[iMaxRecent]; Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); Dimension size = fMain.getSize(); // (ulrivo): full size on screen with less than 640 width if (d.width >= 640) { fMain.setLocation((d.width - size.width) / 2, (d.height - size.height) / 2); } else { fMain.setLocation(0, 0); fMain.setSize(d); } fMain.show(); // (ulrivo): load query from command line if (defScript != null) { if (defDirectory != null) { defScript = defDirectory + File.separator + defScript; } txtCommand.setText(DatabaseManagerCommon.readFile(defScript)); } txtCommand.requestFocus(); } void addMenu(MenuBar b, String name, String[] items) { /* It's a very poor design to encapsulate menu creation this way. * Can't customize the menus this way (e.g. shortcut keys, * mnemonics, disabling, etc. */ Menu menu = new Menu(name); if (name.equals("Tools") && !TT_AVAILABLE) { // Terrible place to do this. Forced to due to method design. menu.setEnabled(false); } addMenuItems(menu, items); b.add(menu); } void addMenuItems(Menu f, String[] m) { for (int i = 0; i < m.length; i++) { MenuItem item = new MenuItem(m[i].substring(1)); char c = m[i].charAt(0); if (c != '-') { item.setShortcut(new MenuShortcut(c)); } item.addActionListener(this); f.add(item); } } public void keyPressed(KeyEvent k) {} public void keyReleased(KeyEvent k) {} public void keyTyped(KeyEvent k) { if (k.getKeyChar() == '\n' && k.isControlDown()) { k.consume(); execute(); } } public void actionPerformed(ActionEvent ev) { String s = ev.getActionCommand(); if (s == null) { if (ev.getSource() instanceof MenuItem) { MenuItem i; s = ((MenuItem) ev.getSource()).getLabel(); } } if (s == null) {} else if (s.equals("Execute")) { execute(); } else if (s.equals("Clear")) { clear(); } else if (s.equals("Exit")) { windowClosing(null); } else if (s.equals("Transfer")) { Transfer.work(null); } else if (s.equals("Dump")) { Transfer.work(new String[]{ "-d" }); } else if (s.equals("Restore")) { Transfer.work(new String[]{ "-r" }); refreshTree(); } else if (s.equals("Logging on")) { JavaSystem.setLogToSystem(true); } else if (s.equals("Logging off")) { JavaSystem.setLogToSystem(false); } else if (s.equals("Help")) { showHelp(new String[] { "", HELP_TEXT }); } else if (s.equals("About")) { showHelp(new String[] { "", ABOUT_TEXT }); } else if (s.equals("Refresh Tree")) { refreshTree(); } else if (s.startsWith("#")) { int i = Integer.parseInt(s.substring(1)); txtCommand.setText(sRecent[i]); } else if (s.equals("Connect...")) { connect(ConnectionDialog.createConnection(fMain, "Connect")); refreshTree(); } else if (s.equals("Results in Grid")) { iResult = 0; pResult.removeAll(); pResult.add("Center", gResult); pResult.doLayout(); } else if (s.equals("Open Script...")) { FileDialog f = new FileDialog(fMain, "Open Script", FileDialog.LOAD); // (ulrivo): set default directory if set from command line if (defDirectory != null) { f.setDirectory(defDirectory); } f.show(); String file = f.getFile(); if (file != null) { StringBuffer buf = new StringBuffer(); ifHuge = DatabaseManagerCommon.readFile(f.getDirectory() + file); if (4096 <= ifHuge.length()) { buf.append( "This huge file cannot be edited.\n Please execute or clear\n"); txtCommand.setText(buf.toString()); } else { txtCommand.setText(ifHuge); } } } else if (s.equals("Save Script...")) { FileDialog f = new FileDialog(fMain, "Save Script", FileDialog.SAVE); // (ulrivo): set default directory if set from command line if (defDirectory != null) { f.setDirectory(defDirectory); } f.show(); String file = f.getFile(); if (file != null) { DatabaseManagerCommon.writeFile(f.getDirectory() + file, txtCommand.getText()); } } else if (s.equals("Save Result csv...")) { FileDialog f = new FileDialog(fMain, "Save Result CSV", FileDialog.SAVE); // (ulrivo): set default directory if set from command line if (defDirectory != null) { f.setDirectory(defDirectory); } f.show(); String dir = f.getDirectory(); String file = f.getFile(); if (dir != null) { file = dir + "/" + file; } if (file != null) { showResultInText(); saveAsCsv(file); } } else if (s.equals("Save Result...")) { FileDialog f = new FileDialog(fMain, "Save Result", FileDialog.SAVE); // (ulrivo): set default directory if set from command line if (defDirectory != null) { f.setDirectory(defDirectory); } f.show(); String file = f.getFile(); if (file != null) { showResultInText(); DatabaseManagerCommon.writeFile(f.getDirectory() + file, txtResult.getText()); } } else if (s.equals("Results in Text")) { iResult = 1; pResult.removeAll(); pResult.add("Center", txtResult); pResult.doLayout(); showResultInText(); } else if (s.equals("AutoCommit on")) { try { cConn.setAutoCommit(true); } catch (SQLException e) {} } else if (s.equals("AutoCommit off")) { try { cConn.setAutoCommit(false); } catch (SQLException e) {} } else if (s.equals("Enlarge Tree")) { Dimension d = tTree.getMinimumSize(); d.width += 20; tTree.setMinimumSize(d); fMain.pack(); } else if (s.equals("Shrink Tree")) { Dimension d = tTree.getMinimumSize(); d.width -= 20; if (d.width >= 0) { tTree.setMinimumSize(d); } fMain.pack(); } else if (s.equals("Enlarge Command")) { txtCommand.setRows(txtCommand.getRows() + 1); fMain.pack(); } else if (s.equals("Shrink Command")) { int i = txtCommand.getRows() - 1; txtCommand.setRows(i < 1 ? 1 : i); fMain.pack(); } else if (s.equals("Commit")) { try { cConn.commit(); } catch (SQLException e) {} } else if (s.equals("Insert test data")) { insertTestData(); } else if (s.equals("Rollback")) { try { cConn.rollback(); } catch (SQLException e) {} } else if (s.equals("Disable MaxRows")) { try { sStatement.setMaxRows(0); } catch (SQLException e) {} } else if (s.equals("Set MaxRows to 100")) { try { sStatement.setMaxRows(100); } catch (SQLException e) {} } else if (s.equals("SELECT")) { showHelp(DatabaseManagerCommon.selectHelp); } else if (s.equals("INSERT")) { showHelp(DatabaseManagerCommon.insertHelp); } else if (s.equals("UPDATE")) { showHelp(DatabaseManagerCommon.updateHelp); } else if (s.equals("DELETE")) { showHelp(DatabaseManagerCommon.deleteHelp); } else if (s.equals("CREATE TABLE")) { showHelp(DatabaseManagerCommon.createTableHelp); } else if (s.equals("DROP TABLE")) { showHelp(DatabaseManagerCommon.dropTableHelp); } else if (s.equals("CREATE INDEX")) { showHelp(DatabaseManagerCommon.createIndexHelp); } else if (s.equals("DROP INDEX")) { showHelp(DatabaseManagerCommon.dropIndexHelp); } else if (s.equals("CHECKPOINT")) { showHelp(DatabaseManagerCommon.checkpointHelp); } else if (s.equals("SCRIPT")) { showHelp(DatabaseManagerCommon.scriptHelp); } else if (s.equals("SHUTDOWN")) { showHelp(DatabaseManagerCommon.shutdownHelp); } else if (s.equals("SET")) { showHelp(DatabaseManagerCommon.setHelp); } else if (s.equals("Test Script")) { showHelp(DatabaseManagerCommon.testHelp); } } void showHelp(String[] help) { txtCommand.setText(help[0]); txtResult.setText(help[1]); bHelp = true; pResult.removeAll(); pResult.add("Center", txtResult); pResult.doLayout(); txtCommand.requestFocus(); txtCommand.setCaretPosition(help[0].length()); } public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowClosing(WindowEvent ev) { try { if (cConn != null) { cConn.close(); } } catch (Exception e) {} fMain.dispose(); if (bMustExit) { System.exit(0); } } public void windowDeiconified(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowOpened(WindowEvent e) {} /** * Clear SQL Statements. */ void clear() { ifHuge = ""; txtCommand.setText(ifHuge); } /** * Adjust this method for large strings...ie multi megabtypes. */ void execute() { String sCmd = null; if (4096 <= ifHuge.length()) { sCmd = ifHuge; } else { sCmd = txtCommand.getText(); } if (sCmd.startsWith("-->>>TEST<<<--")) { testPerformance(); return; } String[] g = new String[1]; lTime = System.currentTimeMillis(); try { if (sStatement == null) { return; } sStatement.execute(sCmd); lTime = System.currentTimeMillis() - lTime; int r = sStatement.getUpdateCount(); if (r == -1) { ResultSet rs = sStatement.getResultSet(); try { formatResultSet(rs); } catch (Throwable t) { g[0] = "Error displaying the ResultSet"; gResult.setHead(g); String s = t.getMessage(); g[0] = s; gResult.addRow(g); } } else { g[0] = "update count"; gResult.setHead(g); g[0] = String.valueOf(r); gResult.addRow(g); } addToRecent(txtCommand.getText()); } catch (SQLException e) { lTime = System.currentTimeMillis() - lTime; g[0] = "SQL Error"; gResult.setHead(g); String s = e.getMessage(); s += " / Error Code: " + e.getErrorCode(); s += " / State: " + e.getSQLState(); g[0] = s; gResult.addRow(g); } updateResult(); System.gc(); } void updateResult() { if (iResult == 0) { // in case 'help' has removed the grid if (bHelp) { pResult.removeAll(); pResult.add("Center", gResult); pResult.doLayout(); bHelp = false; } gResult.update(); gResult.repaint(); } else { showResultInText(); } txtCommand.selectAll(); txtCommand.requestFocus(); } void formatResultSet(ResultSet r) { if (r == null) { String[] g = new String[1]; g[0] = "Result"; gResult.setHead(g); g[0] = "(empty)"; gResult.addRow(g); return; } try { ResultSetMetaData m = r.getMetaData(); int col = m.getColumnCount(); String[] h = new String[col]; for (int i = 1; i <= col; i++) { h[i - 1] = m.getColumnLabel(i); } gResult.setHead(h); while (r.next()) { for (int i = 1; i <= col; i++) { try { h[i - 1] = r.getString(i); if (r.wasNull()) { h[i - 1] = "(null)"; } } catch (SQLException e) { h[i - 1] = "(binary data)"; } } gResult.addRow(h); } r.close(); } catch (SQLException e) {} } void testPerformance() { String all = txtCommand.getText(); StringBuffer b = new StringBuffer(); long total = 0; for (int i = 0; i < all.length(); i++) { char c = all.charAt(i); if (c != '\n') { b.append(c); } } all = b.toString(); String[] g = new String[4]; g[0] = "ms"; g[1] = "count"; g[2] = "sql"; g[3] = "error"; gResult.setHead(g); int max = 1; lTime = System.currentTimeMillis() - lTime; while (!all.equals("")) { int i = all.indexOf(';'); String sql; if (i != -1) { sql = all.substring(0, i); all = all.substring(i + 1); } else { sql = all; all = ""; } if (sql.startsWith("--#")) { max = Integer.parseInt(sql.substring(3)); continue; } else if (sql.startsWith("--")) { continue; } g[2] = sql; long l = 0; try { l = DatabaseManagerCommon.testStatement(sStatement, sql, max); total += l; g[0] = String.valueOf(l); g[1] = String.valueOf(max); g[3] = ""; } catch (SQLException e) { g[0] = g[1] = "n/a"; g[3] = e.toString(); } gResult.addRow(g); System.out.println(l + " ms : " + sql); } g[0] = "" + total; g[1] = "total"; g[2] = ""; gResult.addRow(g); lTime = System.currentTimeMillis() - lTime; updateResult(); } void saveAsCsv(String filename) { try { File file = new File(filename); CSVWriter writer = new CSVWriter(file, null); String[] col = gResult.getHead(); int width = col.length; Vector data = gResult.getData(); String[] row; int height = data.size(); writer.writeHeader(col); for (int i = 0; i < height; i++) { row = (String[]) data.elementAt(i); String[] myRow = new String[row.length]; for (int j = 0; j < row.length; j++) { String r = row[j]; if (r.equals("(null)")) { // null is formatted as (null) r = ""; } myRow[j] = r; } writer.writeData(myRow); } writer.close(); } catch (IOException e) { throw new RuntimeException("IOError: " + e.getMessage()); } } void showResultInText() { String[] col = gResult.getHead(); int width = col.length; int[] size = new int[width]; Vector data = gResult.getData(); String[] row; int height = data.size(); for (int i = 0; i < width; i++) { size[i] = col[i].length(); } for (int i = 0; i < height; i++) { row = (String[]) data.elementAt(i); for (int j = 0; j < width; j++) { int l = row[j].length(); if (l > size[j]) { size[j] = l; } } } StringBuffer b = new StringBuffer(); for (int i = 0; i < width; i++) { b.append(col[i]); for (int l = col[i].length(); l <= size[i]; l++) { b.append(' '); } } b.append(NL); for (int i = 0; i < width; i++) { for (int l = 0; l < size[i]; l++) { b.append('-'); } b.append(' '); } b.append(NL); for (int i = 0; i < height; i++) { row = (String[]) data.elementAt(i); for (int j = 0; j < width; j++) { b.append(row[j]); for (int l = row[j].length(); l <= size[j]; l++) { b.append(' '); } } b.append(NL); } b.append(NL + height + " row(s) in " + lTime + " ms"); txtResult.setText(b.toString()); } private void addToRecent(String s) { for (int i = 0; i < iMaxRecent; i++) { if (s.equals(sRecent[i])) { return; } } if (sRecent[iRecent] != null) { mRecent.remove(iRecent); } sRecent[iRecent] = s; if (s.length() > 43) { s = s.substring(0, 40) + "..."; } MenuItem item = new MenuItem(s); item.setActionCommand("#" + iRecent); item.addActionListener(this); mRecent.insert(item, iRecent); iRecent = (iRecent + 1) % iMaxRecent; } private void initGUI() { Panel pQuery = new Panel(); Panel pCommand = new Panel(); pResult = new Panel(); pQuery.setLayout(new BorderLayout()); pCommand.setLayout(new BorderLayout()); pResult.setLayout(new BorderLayout()); Font fFont = new Font("Dialog", Font.PLAIN, 12); txtCommand = new TextArea(5, 40); txtCommand.addKeyListener(this); txtResult = new TextArea(20, 40); txtCommand.setFont(fFont); txtResult.setFont(new Font("Courier", Font.PLAIN, 12)); butExecute = new Button("Execute"); butClear = new Button("Clear"); butExecute.addActionListener(this); butClear.addActionListener(this); pCommand.add("East", butExecute); pCommand.add("West", butClear); pCommand.add("Center", txtCommand); gResult = new Grid(); setLayout(new BorderLayout()); pResult.add("Center", gResult); pQuery.add("North", pCommand); pQuery.add("Center", pResult); fMain.add("Center", pQuery); tTree = new Tree(); // (ulrivo): screen with less than 640 width Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); if (d.width >= 640) { tTree.setMinimumSize(new Dimension(200, 100)); } else { tTree.setMinimumSize(new Dimension(80, 100)); } gResult.setMinimumSize(new Dimension(200, 300)); fMain.add("West", tTree); doLayout(); fMain.pack(); } protected void refreshTree() { boolean wasAutoCommit = false; tTree.removeAll(); try { wasAutoCommit = cConn.getAutoCommit(); cConn.setAutoCommit(false); int color_table = Color.yellow.getRGB(); int color_column = Color.orange.getRGB(); int color_index = Color.red.getRGB(); tTree.addRow("", dMeta.getURL(), "-", 0); String[] usertables = { "TABLE", "GLOBAL TEMPORARY", "VIEW" }; // fredt@users Schema support Vector schemas = new Vector(); Vector tables = new Vector(); // sqlbob@users Added remarks. Vector remarks = new Vector(); ResultSet result = dMeta.getTables(null, null, null, usertables); try { while (result.next()) { schemas.addElement(result.getString(2)); tables.addElement(result.getString(3)); remarks.addElement(result.getString(5)); } } finally { result.close(); } for (int i = 0; i < tables.size(); i++) { String name = (String) tables.elementAt(i); String schema = (String) schemas.elementAt(i); String key = "tab-" + name + "-"; tTree.addRow(key, name, "+", color_table); // sqlbob@users Added remarks. String remark = (String) remarks.elementAt(i); if ((schema != null) && !schema.trim().equals("")) { tTree.addRow(key + "s", "schema: " + schema); } if ((remark != null) && !remark.trim().equals("")) { tTree.addRow(key + "r", " " + remark); } ResultSet col = dMeta.getColumns(null, schema, name, null); try { while (col.next()) { String c = col.getString(4); String k1 = key + "col-" + c + "-"; tTree.addRow(k1, c, "+", color_column); String type = col.getString(6); tTree.addRow(k1 + "t", "Type: " + type); boolean nullable = col.getInt(11) != DatabaseMetaData.columnNoNulls; tTree.addRow(k1 + "n", "Nullable: " + nullable); } } finally { col.close(); } tTree.addRow(key + "ind", "Indices", "+", 0); ResultSet ind = dMeta.getIndexInfo(null, schema, name, false, false); String oldiname = null; try { while (ind.next()) { boolean nonunique = ind.getBoolean(4); String iname = ind.getString(6); String k2 = key + "ind-" + iname + "-"; if ((oldiname == null || !oldiname.equals(iname))) { tTree.addRow(k2, iname, "+", color_index); tTree.addRow(k2 + "u", "Unique: " + !nonunique); oldiname = iname; } String c = ind.getString(9); tTree.addRow(k2 + "c-" + c + "-", c); } } finally { ind.close(); } } tTree.addRow("p", "Properties", "+", 0); tTree.addRow("pu", "User: " + dMeta.getUserName()); tTree.addRow("pr", "ReadOnly: " + cConn.isReadOnly()); tTree.addRow("pa", "AutoCommit: " + cConn.getAutoCommit()); tTree.addRow("pd", "Driver: " + dMeta.getDriverName()); tTree.addRow("pp", "Product: " + dMeta.getDatabaseProductName()); tTree.addRow("pv", "Version: " + dMeta.getDatabaseProductVersion()); } catch (SQLException e) { tTree.addRow("", "Error getting metadata:", "-", 0); tTree.addRow("-", e.getMessage()); tTree.addRow("-", e.getSQLState()); } finally { try { cConn.setAutoCommit(wasAutoCommit); } catch (SQLException e) {} } tTree.update(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/Traceable.java0000644000175000017500000000343712007547374022460 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; // sqlbob@users 20020407 - patch 1.7.0 - reengineering /** * * @version 1.7.0 */ interface Traceable { boolean TRACE = Boolean.getBoolean("hsqldb.util.trace"); void trace(String s); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/Clear.png0000644000175000017500000000500112007547374021454 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ ‰PNG  IHDRVÎŽWbKGDÿÿÿ ½§“ pHYs  šœtIMEÕÍ2÷RIDATxÚu“Koe†ŸÏŒïvð%¾4µÓB‚Ò Ñ @ÝÀªJlÙ²b?à R©±a üŠJ­‚RADZ‰”Ä6 iâÛxÆwÇã™ñ ‹Œ#JáHßâ;Òû|ï9ß9φäS©Ô§™Læýp8Œa躎¦i?L&“Ï€CÀú·hyàM`iyiñÕ›7o¼õλï1ŸNÓë÷ØÙÙæûï¾å¤Z{P*®;À]@ÿ'¨|ñùíOÞðùÄ„ã¸LL—­V ¿_âêÕ—q?!››¿’J=‡aÚÚ­¯ï5€(Š®­}üÁõ믗_\!KSot¸¿ñGGG<Þ}Liÿr¹ËË«,-]d>?åóó/mm=’ò¹"‰D˲YXˆ0? \¾T¤Z=¦ß× e?ét\EQp]÷¼* À¶mê?ý?Í¥ÅE\×Ae,;ÇÒ ™L† m$I&K1T*?Ð´Ž ÎAñxü¯f³Ú­”Î?ÇCrÙ2ÙŽãâL§LÌ1§£>m]åà L¹\BU[´´öhžƒz½Þ£;wî7}¢nåÊŸè26úœŽ†L&º?*†1FUUôv—Ó‘?®©TŽÀo>ï×ÚšÖ¹aOíâîn Ëšb™&ÝžŽe™h­šÞæä¸Á^鄟7P­ÕÙß?(_¦ä?L`zíÚšÍëÜ»÷#?F?X,F½^ö§ˆ¢@<% 17Ÿé†ç¥Í"Q(DY]]!“ɳ½½M*•¤ÓQiµt‚A…FCGå©u˜?D@?$Á`”H$J6›#™L …ÅyÄï?ƒP(ðHôŽÏÆÂA  ‘Í&)r$.\˜'™Œ#I>dYB–åY?ý€(z®â€ à8ÎlÐΖQàöH²è]r@в,„ÿT>›3M àiý¢ç$ ¨åò–eaš&¶=Åq\ræÐq\/çÒljªg 'À—ëë¿(?†þŠ$ÉÇqi6똦I»Ý¢ÛööQ¹÷äIýwàfÞ“~ÏUxx;ŸÏ 0)) { Name = sSchema + "."; } Name += formatIdentifier(t); return Name; } int convertFromType(int type) { return (type); } int convertToType(int type) { return (type); } Hashtable getSupportedTypes() { Hashtable hTypes = new Hashtable(); if (db != null) { try { ResultSet result = db.meta.getTypeInfo(); while (result.next()) { Integer intobj = new Integer(result.getShort(2)); if (hTypes.get(intobj) == null) { try { int typeNumber = result.getShort(2); hTypes.put(intobj, JDBCT.toString(typeNumber)); } catch (Exception e) {} } } result.close(); } catch (SQLException e) {} } if (hTypes.isEmpty()) { hTypes = JDBCT.getHashtable(); } return hTypes; } String fixupColumnDefRead(TransferTable t, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { return (columnType); } String fixupColumnDefWrite(TransferTable t, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { return (columnType); } boolean needTransferTransaction() { return (false); } Object convertColumnValue(Object value, int column, int type) { if (value == null) { return value; } try { if (value instanceof Clob) { return ((Clob) value).getSubString( 1, (int) ((Clob) value).length()); } else if (value instanceof Blob) { return ((Blob) value).getBytes( 1, (int) ((Blob) value).length()); } } catch (SQLException e) { return null; } return (value); } void beginDataTransfer() {} void endDataTransfer() {} String fixupColumnDefRead(String aTableName, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { return columnType; } String fixupColumnDefWrite(String aTableName, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { return columnType; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/TransferSQLText.java0000644000175000017500000007107712007547372023612 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.sql.SQLException; import java.util.Enumeration; import java.util.Hashtable; import java.util.NoSuchElementException; import java.util.StringTokenizer; import java.util.Vector; /** * @author Nicolas BAZIN, INGENICO * @version 1.7.0 */ class TransferSQLText extends DataAccessPoint { String sFileName = null; BufferedWriter WTextWrite = null; BufferedReader WTextRead = null; protected boolean StructureAlreadyParsed = false; Hashtable DbStmts = null; protected JDBCTypes JDBCT = null; TransferSQLText(String _FileName, Traceable t) throws DataAccessPointException { super(t); sFileName = _FileName; JDBCT = new JDBCTypes(); if (sFileName == null) { throw new DataAccessPointException("File name not initialized"); } } boolean execute(String statement) throws DataAccessPointException { if (WTextWrite == null) { try { WTextWrite = new BufferedWriter(new FileWriter(sFileName)); } catch (IOException e) { throw new DataAccessPointException(e.getMessage()); } } try { WTextWrite.write(statement + "\n"); WTextWrite.flush(); } catch (IOException e) { throw new DataAccessPointException(e.getMessage()); } return true; } void putData(String statement, TransferResultSet r, int iMaxRows) throws DataAccessPointException { int i = 0; if (r == null) { return; } if (WTextWrite == null) { try { WTextWrite = new BufferedWriter(new FileWriter(sFileName)); } catch (IOException e) { throw new DataAccessPointException(e.getMessage()); } } try { while (r.next()) { if (i == 0) { WTextWrite.write(statement + "\n"); WTextWrite.flush(); } transferRow(r); if (iMaxRows != 0 && i == iMaxRows) { break; } i++; if (iMaxRows != 0 || i % 100 == 0) { tracer.trace("Transfered " + i + " rows"); } } } catch (Exception e) { throw new DataAccessPointException(e.getMessage()); } finally { try { if (i > 0) { WTextWrite.write("\tNumber of Rows=" + i + "\n\n"); WTextWrite.flush(); } } catch (IOException e) { throw new DataAccessPointException(e.getMessage()); } } } void close() throws DataAccessPointException { if (WTextWrite != null) { try { WTextWrite.flush(); WTextWrite.close(); } catch (IOException e) {} } } /** * Method declaration * * * @param type * @param r * @param p * * @throws SQLException */ private void transferRow(TransferResultSet r) throws Exception { String sLast = ""; int len = r.getColumnCount(); if (WTextWrite == null) { try { WTextWrite = new BufferedWriter(new FileWriter(sFileName)); } catch (IOException e) { throw new DataAccessPointException(e.getMessage()); } } for (int i = 0; i < len; i++) { int t = r.getColumnType(i + 1); sLast = "column=" + r.getColumnName(i + 1) + " datatype=" + (String) helper.getSupportedTypes().get(new Integer(t)); Object o = r.getObject(i + 1); if (o == null) { sLast += " value="; } else { o = helper.convertColumnValue(o, i + 1, t); sLast += " value=\'" + o.toString() + "\'"; } WTextWrite.write("\t" + sLast + "\n"); WTextWrite.flush(); } WTextWrite.write("\n"); WTextWrite.flush(); sLast = ""; } class ColumnDef { String columnName; String columnType; String options; int start; int len; public ColumnDef() { columnName = ""; columnType = ""; options = ""; start = 0; len = 0; } } ColumnDef getColumnDef(String ColumnsDesc, int curPos) { int nextPos = 0; ColumnDef columnDef = new TransferSQLText.ColumnDef(); columnDef.start = curPos; if ((ColumnsDesc == null) || (ColumnsDesc.length() == 0) || (curPos >= ColumnsDesc.length())) { return new TransferSQLText.ColumnDef(); } String stbuff = ColumnsDesc.substring(curPos); try { int i = 0; for (; i < stbuff.length(); i++) { int c = stbuff.charAt(i); if (c == ',' || c == ' ' || c == ')' || c == ';') { continue; } else { break; } } if (i == stbuff.length()) { return new TransferSQLText.ColumnDef(); } columnDef.len += i; stbuff = stbuff.substring(i); while (stbuff.charAt(nextPos) != ' ') { nextPos++; } columnDef.columnName = stbuff.substring(0, nextPos); stbuff = stbuff.substring(nextPos); columnDef.len += nextPos; nextPos = 0; if (!columnDef.columnName.toUpperCase().equals("CONSTRAINT")) { i = 0; for (; i < stbuff.length() && stbuff.charAt(i) == ' '; i++) {} stbuff = stbuff.substring(i); columnDef.len += i; while ((stbuff.charAt(nextPos) != '(') && (stbuff.charAt(nextPos) != ',') && (stbuff.charAt(nextPos) != ')') && (stbuff.charAt(nextPos) != ';') && (stbuff.charAt(nextPos) != ' ')) { nextPos++; } columnDef.columnType = stbuff.substring(0, nextPos).toUpperCase(); stbuff = stbuff.substring(nextPos); columnDef.len += nextPos; nextPos = 0; } while ((stbuff.charAt(nextPos) != ',') && (stbuff.charAt(nextPos) != ';') && (nextPos < stbuff.length()) && (stbuff.charAt(nextPos) != ')')) { if (stbuff.charAt(nextPos) == '(') { while (stbuff.charAt(nextPos) != ')') { nextPos++; } } nextPos++; } columnDef.options = stbuff.substring(0, nextPos); columnDef.len += nextPos; } catch (Exception e) { columnDef = new TransferSQLText.ColumnDef(); } return columnDef; } String translateTypes(String CreateLine, TransferTable TTable, DataAccessPoint Dest) throws DataAccessPointException { String translatedLine = ""; JDBCTypes JDBCT = new JDBCTypes(); int currentPos = 0; String columnName = ""; String columnType = ""; int colnum = 0; ColumnDef cDef; currentPos = CreateLine.indexOf('(') + 1; translatedLine = CreateLine.substring(0, currentPos); do { cDef = getColumnDef(CreateLine, currentPos); if (cDef.len == 0) { break; } columnName = cDef.columnName; columnType = cDef.columnType; if (columnName.toUpperCase().indexOf("CONSTRAINT") >= 0) { translatedLine += CreateLine.substring(currentPos, currentPos + cDef.len) + ","; currentPos += cDef.len + 1; colnum++; continue; } columnName = Dest.helper.formatIdentifier(columnName) + " "; try { Integer inttype = new Integer( Dest.helper.convertToType(JDBCT.toInt(columnType))); columnType = (String) TTable.hTypes.get(inttype); } catch (Exception JDBCtypeEx) {} if (cDef.options != null) { columnType += cDef.options; } try { columnType = Dest.helper.fixupColumnDefWrite(TTable, null, columnType, null, colnum); } catch (SQLException SQLe) { return CreateLine; } translatedLine += columnName + " " + columnType + ","; currentPos += cDef.len + 1; colnum++; } while (true); return translatedLine.substring(0, translatedLine.length() - 1) + ");"; } void parseFileForTables() throws DataAccessPointException { StringTokenizer Tokenizer; if (WTextRead == null) { try { WTextRead = new BufferedReader(new FileReader(sFileName)); } catch (IOException e) { throw new DataAccessPointException(e.getMessage()); } } String currentLine = ""; String Token = ""; String name = ""; TransferTable relatedTable = null; try { while ((currentLine = WTextRead.readLine()) != null) { currentLine = currentLine.trim() + ";"; Tokenizer = new StringTokenizer(currentLine); try { Token = Tokenizer.nextToken(); } catch (NoSuchElementException NSE) { continue; } if (Token == null) { continue; } if (!Token.toUpperCase().equals("CREATE")) { continue; } Token = Tokenizer.nextToken().toUpperCase(); if (Token.equals("TABLE") || Token.equals("VIEW")) { try { name = Tokenizer.nextToken(" (;"); relatedTable = new TransferTable(this, name, "", Token, tracer); relatedTable.Stmts.bCreate = false; relatedTable.Stmts.bDelete = false; relatedTable.Stmts.bDrop = false; relatedTable.Stmts.bCreateIndex = false; relatedTable.Stmts.bDropIndex = false; relatedTable.Stmts.bInsert = false; relatedTable.Stmts.bAlter = false; DbStmts.put(relatedTable.Stmts.sSourceTable, relatedTable); } catch (NoSuchElementException NSE) { continue; } } } } catch (Exception IOe) { throw new DataAccessPointException(IOe.getMessage()); } } void parseFileForTheRest(TransferTable TTable, DataAccessPoint Dest) throws DataAccessPointException { StringTokenizer Tokenizer; StructureAlreadyParsed = true; if (WTextRead == null) { try { WTextRead = new BufferedReader(new FileReader(sFileName)); } catch (IOException e) { throw new DataAccessPointException(e.getMessage()); } } String currentLine = ""; String Token = ""; String name = ""; TransferTable relatedTable = null; try { while ((currentLine = WTextRead.readLine()) != null) { currentLine = currentLine.trim() + ";"; Tokenizer = new StringTokenizer(currentLine); try { Token = Tokenizer.nextToken(); } catch (NoSuchElementException NSE) { continue; } if (Token == null) { continue; } if (Token.toUpperCase().equals("INSERT")) { try { if (!Tokenizer.nextToken().toUpperCase().equals( "INTO")) { throw new DataAccessPointException( "Error in INSERT statement: no INTO found"); } Token = Tokenizer.nextToken(); if ((relatedTable = (TransferTable) DbStmts.get(Token)) != null) { relatedTable.Stmts.bDelete = true; relatedTable.Stmts.bInsert = true; relatedTable.Stmts.sDestInsert = currentLine; relatedTable.Stmts.sDestDelete = "DELETE FROM " + relatedTable.Stmts.sSourceTable + ";"; } continue; } catch (NoSuchElementException NSE) { continue; } } else if (Token.toUpperCase().equals("ALTER")) { try { if (!Tokenizer.nextToken().toUpperCase().equals( "TABLE")) { continue; } name = Tokenizer.nextToken(); Token = Tokenizer.nextToken().toUpperCase(); if (!Token.equals("ADD")) { continue; } do { Token = Tokenizer.nextToken().toUpperCase(); } while (!Token.equals("CONSTRAINT")); if ((relatedTable = (TransferTable) DbStmts.get(name)) != null) { if (relatedTable.Stmts.sDestAlter == null) { relatedTable.Stmts.sDestAlter = ""; } relatedTable.Stmts.bAlter = true; relatedTable.Stmts.sDestAlter += currentLine; } else { throw new DataAccessPointException( "table not found"); } Token = Tokenizer.nextToken(); if (relatedTable.Stmts.sDestDrop == null) { relatedTable.Stmts.sDestDrop = ""; } relatedTable.Stmts.bDrop = true; relatedTable.Stmts.sDestDrop = "ALTER TABLE " + name + " DROP CONSTRAINT " + Token + ";" + relatedTable.Stmts.sDestDrop; continue; } catch (NoSuchElementException NSE) { continue; } } else if (!Token.toUpperCase().equals("CREATE")) { continue; } Token = Tokenizer.nextToken().toUpperCase(); if (Token.equals("TABLE") || Token.equals("VIEW")) { try { name = Tokenizer.nextToken(" (;"); if (!DbStmts.containsKey(name)) { throw new DataAccessPointException( "error: index is created before the table"); } relatedTable = (TransferTable) DbStmts.get(name); relatedTable.Stmts.bCreate = true; relatedTable.Stmts.bDrop = true; // relatedTable.Stmts.sDestCreate = currentLine; relatedTable.Stmts.sDestCreate = translateTypes(currentLine, TTable, Dest); relatedTable.Stmts.sDestDrop = "DROP " + relatedTable.Stmts.sType + " " + name + ";"; DbStmts.put(relatedTable.Stmts.sSourceTable, relatedTable); } catch (NoSuchElementException NSE) { continue; } } if (Token.equals("INDEX") || Token.equals("UNIQUE")) { try { while ((Token = Tokenizer.nextToken()).toUpperCase().equals( "INDEX")) { ; } String IndexdropCommand = "DROP INDEX " + Token + " ;"; while ((Token = Tokenizer.nextToken( " (")).toUpperCase().equals("ON")) { ; } name = Token; if (!DbStmts.containsKey(Token)) { throw new DataAccessPointException( "error: index is created before the table"); } relatedTable = (TransferTable) DbStmts.get(Token); if (relatedTable.Stmts.sDestCreateIndex == null) { relatedTable.Stmts.sDestCreateIndex = ""; } if (relatedTable.Stmts.sDestDropIndex == null) { relatedTable.Stmts.sDestDropIndex = ""; } relatedTable.Stmts.bCreateIndex = true; relatedTable.Stmts.bDropIndex = true; relatedTable.Stmts.sDestCreateIndex += currentLine; relatedTable.Stmts.sDestDropIndex += IndexdropCommand; } catch (NoSuchElementException NSE) { continue; } } } } catch (IOException IOe) { throw new DataAccessPointException(IOe.getMessage()); } } Vector getTables(String sCatalog, String[] sSchemas) throws DataAccessPointException { Vector AllTables = new Vector(); if (DbStmts == null) { DbStmts = new Hashtable(); } if (WTextRead != null) { try { WTextRead.close(); WTextRead = null; } catch (IOException e) {} } this.parseFileForTables(); StructureAlreadyParsed = false; Enumeration e = DbStmts.elements(); while (e.hasMoreElements()) { AllTables.addElement(e.nextElement()); } return AllTables; } void getTableStructure(TransferTable TTable, DataAccessPoint Dest) throws DataAccessPointException { if (!StructureAlreadyParsed) { if (WTextRead != null) { try { WTextRead.close(); WTextRead = null; } catch (IOException e) {} } this.parseFileForTheRest(TTable, Dest); } } TransferResultSet getData(String statement) throws DataAccessPointException { StringTokenizer Tokenizer; String tableName = ""; try { Tokenizer = new StringTokenizer(statement); while (!Tokenizer.nextToken().toUpperCase().equals("FROM")) { ; } tableName = Tokenizer.nextToken(" ;"); } catch (NoSuchElementException NSE) { throw new DataAccessPointException( "Table name not found in statement: " + statement); } if (WTextRead != null) { try { WTextRead.close(); WTextRead = null; } catch (IOException e) {} } return (this.parseFileForData(tableName)); } TransferResultSet parseFileForData(String tableName) throws DataAccessPointException { TransferResultSet trsData = new TransferResultSet(); StringTokenizer Tokenizer; if (WTextRead == null) { try { WTextRead = new BufferedReader(new FileReader(sFileName)); } catch (IOException e) { throw new DataAccessPointException(e.getMessage()); } } String currentLine = ""; String Token; try { while ((currentLine = WTextRead.readLine()) != null) { currentLine = currentLine.trim() + ";"; Tokenizer = new StringTokenizer(currentLine); try { Token = Tokenizer.nextToken(); } catch (NoSuchElementException NSE) { continue; } if (Token == null) { continue; } if (!Token.toUpperCase().equals("INSERT")) { continue; } try { if (!Tokenizer.nextToken().toUpperCase().equals("INTO")) { throw new DataAccessPointException( "Error in INSERT statement: no INTO found"); } Token = Tokenizer.nextToken(); if (!Token.equals(tableName)) { continue; } int iParsedRows = 0; Vector vColumnNames = new Vector(); Vector vColumnValues = new Vector(); Vector vColumnTypes = new Vector(); while ((currentLine = WTextRead.readLine()) != null) { currentLine = currentLine.trim(); boolean newLine = (currentLine.length() == 0); if (newLine) { int iColumnNb = 0; iParsedRows++; iColumnNb = vColumnNames.size(); String[] Names = new String[iColumnNb + 1]; int[] Types = new int[iColumnNb + 1]; Object[] Values = new Object[iColumnNb + 1]; for (int Idx = 0; Idx < iColumnNb; Idx++) { Names[Idx + 1] = (String) vColumnNames.elementAt(Idx); Types[Idx + 1] = ((Integer) vColumnTypes.elementAt( Idx)).intValue(); Values[Idx + 1] = vColumnValues.elementAt(Idx); } try { trsData.addRow(Names, Types, Values, iColumnNb); } catch (Exception e) { throw new DataAccessPointException( e.getMessage()); } iColumnNb = 0; vColumnNames.removeAllElements(); vColumnValues.removeAllElements(); vColumnTypes.removeAllElements(); continue; } Tokenizer = new StringTokenizer(currentLine); Token = Tokenizer.nextToken("="); if (Token.equals("Number of Rows")) { int iNbRows = Integer.parseInt(Tokenizer.nextToken()); if (iNbRows != iParsedRows) { throw new DataAccessPointException( "Number of parsed rows (" + iParsedRows + ") is different from the expected (" + iNbRows + ")"); } return trsData; } if (Token.equals("column")) { Token = Tokenizer.nextToken(" ="); vColumnNames.addElement(Token); } Token = Tokenizer.nextToken(" ="); if (Token.equals("datatype")) { int iType; Token = Tokenizer.nextToken(" ="); try { iType = JDBCT.toInt(Token.toUpperCase()); } catch (Exception e) { throw new DataAccessPointException( "Unknown type: " + Token); } vColumnTypes.addElement(new Integer(iType)); } Token = Tokenizer.nextToken(" ="); if (Token.equals("value")) { int iStart = currentLine.indexOf("value=") + 6; String sValue = currentLine.substring(iStart).trim(); if (sValue.indexOf("") >= 0) { vColumnValues.addElement(null); } else { int i = sValue.indexOf('\'') + 1; String sbToken = sValue.substring(i); i = sbToken.lastIndexOf('\''); sbToken = sbToken.substring(0, i); Token = sbToken; vColumnValues.addElement(Token); } } } } catch (IndexOutOfBoundsException IOBe) { continue; } } } catch (IOException IOe) { throw new DataAccessPointException(IOe.getMessage()); } return trsData; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/Bold.gif0000644000175000017500000000200012007547372021261 0ustar renereneGIF89a瀀€€€€€€€ÀÀÀÀÜÀ¦ÊðÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%þܹ–sPÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿþþÜܹ¹––ssPPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿþܹ–sPÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿþþÜܹ¹––ssPPÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%þܹ–sPãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%þþÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&ÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ùÿ,Ýÿ H° AwèÉ[ÈpaÝQÄÈöÁ´kOºsÇR^×iãYM'¯:µ7©ºÓ+ôÞÒvGö\:تÀzðÚéÔ+€u m¬Ø2fÂÿîõm Y :v?‹¥ÇÞÚy<ãÒ›ÍcÑ®ìä=tÍ›wλƒ;hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/OracleTransferHelper.java0000644000175000017500000001425112007547374024644 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; // brian.porter@siteforce.de 20020703 - make sure date is loaded in the required format // Stephan Frind 20040508 - improvements /** * Conversions from Oracle databases * * @author Nichola Bazin * @version 1.7.0 */ class OracleTransferHelper extends TransferHelper { private final int ORACLE = 0; private final int HSQLDB = 1; String[][] Funcs = { { "now()", "\'now\'" } }; OracleTransferHelper() { super(); System.out.println("simple init of OracleTransferHelper"); } OracleTransferHelper(TransferDb database, Traceable t, String q) { super(database, t, q); } void set(TransferDb database, Traceable t, String q) { super.set(database, t, q); // set the Dateformat for our connection String dateFormatStmnt = "ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'"; System.out.println("dateFormatStmnt: " + dateFormatStmnt); try { tracer.trace("Executing " + dateFormatStmnt); database.execute(dateFormatStmnt); } catch (Exception e) { tracer.trace("Ignoring error " + e.getMessage()); System.out.println("Ignoring error " + e.getMessage()); } } String fixupColumnDefRead(TransferTable t, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { return fixupColumnDefRead(t.Stmts.sDestTable, meta, columnType, columnDesc, columnIndex); } String fixupColumnDefWrite(TransferTable t, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { if (columnType.equals("SERIAL")) { String SeqName = new String("_" + columnDesc.getString(4) + "_seq"); int spaceleft = 31 - SeqName.length(); if (t.Stmts.sDestTable.length() > spaceleft) { SeqName = t.Stmts.sDestTable.substring(0, spaceleft) + SeqName; } else { SeqName = t.Stmts.sDestTable + SeqName; } String DropSequence = "DROP SEQUENCE " + SeqName + ";"; t.Stmts.sDestDrop += DropSequence; } for (int Idx = 0; Idx < Funcs.length; Idx++) { String HSQLDB_func = Funcs[Idx][HSQLDB]; int iStartPos = columnType.indexOf(HSQLDB_func); if (iStartPos >= 0) { String NewColumnType = columnType.substring(0, iStartPos); NewColumnType += Funcs[Idx][ORACLE]; NewColumnType += columnType.substring(iStartPos + HSQLDB_func.length()); columnType = NewColumnType; } } return (columnType); } void beginDataTransfer() { try { db.setAutoCommit(false); } catch (Exception e) {} } void endDataTransfer() { try { db.commit(); } catch (Exception e) {} } String fixupColumnDefRead(String aTableName, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { String SeqName = new String("_" + columnDesc.getString(4) + "_seq"); int spaceleft = 31 - SeqName.length(); if (aTableName.length() > spaceleft) { SeqName = aTableName.substring(0, spaceleft) + SeqName; } else { SeqName = aTableName + SeqName; } String CompareString = "nextval(\'\"" + SeqName + "\"\'"; if (columnType.indexOf(CompareString) >= 0) { // We just found a increment columnType = "SERIAL"; } for (int Idx = 0; Idx < Funcs.length; Idx++) { String ORACLE_func = Funcs[Idx][ORACLE]; int iStartPos = columnType.indexOf(ORACLE_func); if (iStartPos >= 0) { String NewColumnType = columnType.substring(0, iStartPos); NewColumnType += Funcs[Idx][HSQLDB]; NewColumnType += columnType.substring(iStartPos + ORACLE_func.length()); columnType = NewColumnType; } } return (columnType); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/McKoiTransferHelper.java0000644000175000017500000000573512007547372024446 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; /** * Helper class for conversion from a different databases * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @version 1.7.0 */ class McKoiTransferHelper extends TransferHelper { McKoiTransferHelper() { super(); } String fixupColumnDefRead(TransferTable t, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { String CompareString = "UNIQUEKEY(\'" + t.Stmts.sDestTable + "\'"; if (columnType.indexOf(CompareString) > 0) { // We just found a increment columnType = "SERIAL"; } return (columnType); } public McKoiTransferHelper(TransferDb database, Traceable t, String q) { super(database, t, q); } String fixupColumnDefWrite(TransferTable t, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { if (columnType.equals("SERIAL")) { columnType = "INTEGER DEFAULT UNIQUEKEY (\'" + t.Stmts.sSourceTable + "\')"; } return (columnType); } boolean needTransferTransaction() { return (true); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/Transfer.java0000644000175000017500000011306212007547372022354 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.util; import java.applet.Applet; import java.util.Enumeration; import java.util.Vector; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Checkbox; import java.awt.Component; import java.awt.Dimension; import java.awt.FileDialog; import java.awt.Font; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Image; import java.awt.ItemSelectable; import java.awt.Label; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.Panel; import java.awt.SystemColor; import java.awt.TextField; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.image.MemoryImageSource; // fredt@users 20011220 - patch 481239 by xponsard@users - enhancements // enhancements to support saving and loading of transfer settings, // transfer of blobs, and catalog and schema names in source db // changes by fredt to allow saving and loading of transfer settings // fredt@users 20020215 - patch 516309 by Nicolas Bazin - enhancements // sqlbob@users 20020401 - patch 1.7.0 - reengineering // nicolas BAZIN 20020430 - add Catalog selection, correct a bug preventing table // edition, change double quotes to simple quotes for default values of CHAR type // lonbinder@users 20030426 - correct bug in prefs load/save // fredt@users 20040508 - patch 1.7.2 - bug fixes /** * Utility program (or applet) for transferring tables between different * databases via JDBC. Understands HSQLDB database particularly well. * * @author Thomas Mueller (Hypersonic SQL Group) * @version 1.7.2 * @since Hypersonic SQL */ public class Transfer extends Applet implements WindowListener, ActionListener, ItemListener, Traceable { Frame fMain; Image imgEmpty; DataAccessPoint sourceDb; DataAccessPoint targetDb; TransferTable tCurrent; int iMaxRows; int iSelectionStep; Vector tTable; java.awt.List lTable; String[] sSourceSchemas; String sSourceCatalog, sDestSchema, sDestCatalog; TextField tSourceTable, tDestTable, tDestDropIndex, tDestCreateIndex; TextField tDestDrop, tDestCreate, tDestDelete, tDestAlter; TextField tSourceSelect, tDestInsert; Checkbox cTransfer, cDrop, cCreate, cDelete, cInsert, cAlter; Checkbox cCreateIndex, cDropIndex; Checkbox cFKForced, cIdxForced; Button bStart, bContinue; TextField tMessage; int iTransferMode; static boolean bMustExit; int CurrentTransfer, CurrentAlter; static final int SELECT_SOURCE_CATALOG = 1; static final int SELECT_SOURCE_SCHEMA = 2; static final int SELECT_DEST_CATALOG = 3; static final int SELECT_DEST_SCHEMA = 4; static final int SELECT_SOURCE_TABLES = 5; static final int TRFM_TRANSFER = 1; static final int TRFM_DUMP = 2; static final int TRFM_RESTORE = 3; /** * Method declaration * * * @param s */ public void trace(String s) { if ((s != null) &&!s.equals("")) { tMessage.setText(s); if (TRACE) { System.out.println(s); } } } public void init() { Transfer m = new Transfer(); m._main(null); } /** * @throws IllegalArgumentException for the obvious reason */ public static void work(String[] arg) { Transfer m = new Transfer(); m._main(arg); } /** * Run with --help arg for syntax help. * * @throws IllegalArgumentException for the obvious reason */ public static void main(String[] arg) { System.getProperties().put("sun.java2d.noddraw", "true"); bMustExit = true; try { work(arg); } catch (IllegalArgumentException iae) { throw new IllegalArgumentException( "Try: java "+ Transfer.class.getName() + " --help"); } } private boolean CatalogToSelect() { Vector result = null; try { lTable.removeAll(); if (iSelectionStep == Transfer.SELECT_SOURCE_CATALOG) { result = sourceDb.getCatalog(); } else if (iSelectionStep == Transfer.SELECT_DEST_CATALOG) { result = targetDb.getCatalog(); } else { exit(); } if (result.size() > 1) { lTable.setMultipleMode(true); if (iSelectionStep == Transfer.SELECT_SOURCE_CATALOG) { bStart.setLabel("Select Catalog: Source"); } else { bStart.setLabel("Select Catalog: Destination"); } bStart.invalidate(); bStart.setEnabled(true); for (Enumeration e = result.elements(); e.hasMoreElements(); ) { lTable.add(e.nextElement().toString()); } lTable.repaint(); trace("Select correct Catalog"); } else { if (result.size() == 1) { if (iSelectionStep == Transfer.SELECT_SOURCE_CATALOG) { sSourceCatalog = (String) result.firstElement(); sSourceSchemas = null; } else { sDestCatalog = (String) result.firstElement(); sDestSchema = null; } } else { if (iSelectionStep == Transfer.SELECT_SOURCE_CATALOG) { sSourceCatalog = null; sSourceSchemas = null; } else { sDestCatalog = null; sDestSchema = null; } } if ((iSelectionStep == Transfer.SELECT_DEST_CATALOG) && (sDestCatalog != null)) { try { targetDb.setCatalog(sDestCatalog); } catch (Exception ex) { trace("Catalog " + sSourceCatalog + " could not be selected in the target database"); sSourceCatalog = null; } } iSelectionStep++; ProcessNextStep(); return false; } } catch (Exception exp) { lTable.removeAll(); trace("Exception reading catalog: " + exp); exp.printStackTrace(); } return (lTable.getItemCount() > 0); } private boolean SchemaToSelect() { Vector result = null; try { lTable.removeAll(); if (iSelectionStep == Transfer.SELECT_SOURCE_SCHEMA) { result = sourceDb.getSchemas(); } else if (iSelectionStep == Transfer.SELECT_DEST_SCHEMA) { result = targetDb.getSchemas(); } else { exit(); } if (result.size() > 1) { lTable.setMultipleMode(true); if (iSelectionStep == Transfer.SELECT_SOURCE_SCHEMA) { bStart.setLabel("Select Schema: Source"); } else { bStart.setLabel("Select Schema: Destination"); } bStart.invalidate(); bStart.setEnabled(true); for (Enumeration e = result.elements(); e.hasMoreElements(); ) { lTable.add(e.nextElement().toString()); } lTable.repaint(); trace("Select correct Schema or load Settings file"); } else { if (result.size() == 1) { if (iSelectionStep == Transfer.SELECT_SOURCE_SCHEMA) { sSourceSchemas = new String[1]; sSourceSchemas[0] = (String) result.firstElement(); } else { sDestSchema = (String) result.firstElement(); } } else { if (iSelectionStep == Transfer.SELECT_SOURCE_SCHEMA) { sSourceSchemas = null; } else { sDestSchema = null; } } if (iTransferMode == TRFM_DUMP) { iSelectionStep = Transfer.SELECT_SOURCE_TABLES; } else { iSelectionStep++; } ProcessNextStep(); return false; } } catch (Exception exp) { lTable.removeAll(); trace("Exception reading schemas: " + exp); exp.printStackTrace(); } return (lTable.getItemCount() > 0); } static private final String SYNTAX_MSG = "java " + Transfer.class.getName() + " [--help|--dump|--restore]"; /** * @throws IllegalArgumentException for the obvious reason */ void _main(String[] arg) { /* ** What function is asked from the transfer tool? */ iTransferMode = TRFM_TRANSFER; if (arg != null) { if (arg.length != 1) { throw new IllegalArgumentException(); } if ((arg[0].toLowerCase().equals("-r")) || (arg[0].toLowerCase().equals("--restore"))) { iTransferMode = TRFM_RESTORE; } else if ((arg[0].toLowerCase().equals("-d")) || (arg[0].toLowerCase().equals("--dump"))) { iTransferMode = TRFM_DUMP; } else if ((arg[0].toLowerCase().equals("-h")) || (arg[0].toLowerCase().equals("--help"))) { System.out.println(Transfer.SYNTAX_MSG); return; } else { throw new IllegalArgumentException(); } } fMain = new Frame("HSQL Transfer Tool"); imgEmpty = createImage(new MemoryImageSource(2, 2, new int[4 * 4], 2, 2)); fMain.setIconImage(imgEmpty); fMain.addWindowListener(this); fMain.setSize(640, 480); fMain.add("Center", this); MenuBar bar = new MenuBar(); String[] extras = { "Insert 10 rows only", "Insert 1000 rows only", "Insert all rows", "-", "Load Settings...", "Save Settings...", "-", "Exit" }; Menu menu = new Menu("Options"); addMenuItems(menu, extras); bar.add(menu); fMain.setMenuBar(bar); initGUI(); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); Dimension size = fMain.getSize(); // (ulrivo): full size on screen with less than 640 width if (d.width >= 640) { fMain.setLocation((d.width - size.width) / 2, (d.height - size.height) / 2); } else { fMain.setLocation(0, 0); fMain.setSize(d); } fMain.setVisible(true); CurrentTransfer = CurrentAlter = 0; try { if ((iTransferMode == TRFM_DUMP) || (iTransferMode == TRFM_TRANSFER)) { sourceDb = new TransferDb( ConnectionDialog.createConnection( fMain, "Source Database"), this); if (!sourceDb.isConnected()) { exit(); return; } } else { FileDialog f = new FileDialog(fMain, "Restore FileName", FileDialog.LOAD); f.show(); String sFileName = f.getFile(); String Path = f.getDirectory(); if ((sFileName == null) || (sFileName.equals(""))) { exit(); return; } else { sourceDb = new TransferSQLText(Path + sFileName, this); } } if ((iTransferMode == TRFM_RESTORE) || (iTransferMode == TRFM_TRANSFER)) { targetDb = new TransferDb( ConnectionDialog.createConnection( fMain, "Target Database"), this); if (!targetDb.isConnected()) { exit(); return; } } else { FileDialog f = new FileDialog(fMain, "Dump FileName", FileDialog.SAVE); f.show(); String sFileName = f.getFile(); String Path = f.getDirectory(); if ((sFileName == null) || (sFileName.equals(""))) { exit(); return; } else { targetDb = new TransferSQLText(Path + sFileName, this); } } } catch (Exception e) { exit(); e.printStackTrace(); return; } if ((iTransferMode == TRFM_DUMP) || (iTransferMode == TRFM_TRANSFER)) { iSelectionStep = SELECT_SOURCE_CATALOG; sSourceCatalog = null; } else { iSelectionStep = SELECT_DEST_CATALOG; sDestCatalog = null; } ProcessNextStep(); fMain.show(); return; } private void RefreshMainDisplay() { lTable.removeAll(); lTable.repaint(); try { tTable = sourceDb.getTables(sSourceCatalog, sSourceSchemas); for (int i = 0; i < tTable.size(); i++) { TransferTable t = (TransferTable) tTable.elementAt(i); t.setDest(sDestSchema, targetDb); t.extractTableStructure(sourceDb, targetDb); lTable.add(t.Stmts.sSourceTable); lTable.select(i); displayTable(t); } bStart.setEnabled(true); if (iTransferMode == TRFM_TRANSFER) { trace("Edit definitions and press [Start Transfer]"); } else if (iTransferMode == TRFM_DUMP) { trace("Edit definitions and press [Start Dump]"); } } catch (Exception e) { trace("Exception reading source tables: " + e); e.printStackTrace(); } fMain.show(); } /** * Method declaration * * * @param f * @param m */ private void addMenuItems(Menu f, String[] m) { for (int i = 0; i < m.length; i++) { if (m[i].equals("-")) { f.addSeparator(); } else { MenuItem item = new MenuItem(m[i]); item.addActionListener(this); f.add(item); } } } /** * Method declaration * * * @param e */ public void itemStateChanged(ItemEvent e) { ItemSelectable item = e.getItemSelectable(); if (item == lTable) { if (iSelectionStep == SELECT_SOURCE_TABLES) { String table = lTable.getSelectedItem(); int selected = ((Integer) e.getItem()).intValue(); for (int i = 0; i < tTable.size(); i++) { TransferTable t = (TransferTable) tTable.elementAt(i); if (t == null) { continue; } if (i == selected) { saveTable(); displayTable(t); updateEnabled(true); } } } } else { // it must be a checkbox saveTable(); updateEnabled(true); } } /** * Method declaration * */ private void saveTable() { if (tCurrent == null) { return; } TransferTable t = tCurrent; t.Stmts.sSourceTable = tSourceTable.getText(); t.Stmts.sDestTable = tDestTable.getText(); t.Stmts.sDestDrop = tDestDrop.getText(); t.Stmts.sDestCreateIndex = tDestCreateIndex.getText(); t.Stmts.sDestDropIndex = tDestDropIndex.getText(); t.Stmts.sDestCreate = tDestCreate.getText(); t.Stmts.sDestDelete = tDestDelete.getText(); t.Stmts.sSourceSelect = tSourceSelect.getText(); t.Stmts.sDestInsert = tDestInsert.getText(); t.Stmts.sDestAlter = tDestAlter.getText(); // t.Stmts.bTransfer = cTransfer.getState(); t.Stmts.bDrop = cDrop.getState(); t.Stmts.bCreate = cCreate.getState(); t.Stmts.bDelete = cDelete.getState(); t.Stmts.bInsert = cInsert.getState(); t.Stmts.bAlter = cAlter.getState(); t.Stmts.bCreateIndex = cCreateIndex.getState(); t.Stmts.bDropIndex = cDropIndex.getState(); if (!t.Stmts.bTransfer) { t.Stmts.bInsert = false; cInsert.setState(false); } boolean reparsetable = ((t.Stmts.bFKForced != cFKForced.getState()) || (t.Stmts.bIdxForced != cIdxForced.getState())); t.Stmts.bFKForced = cFKForced.getState(); t.Stmts.bIdxForced = cIdxForced.getState(); if (reparsetable) { try { sourceDb.getTableStructure(t, targetDb); } catch (Exception e) { trace("Exception reading source tables: " + e); e.printStackTrace(); } } } /** * Method declaration * * * @param t */ private void displayTable(TransferTable t) { tCurrent = t; if (t == null) { return; } tSourceTable.setText(t.Stmts.sSourceTable); tDestTable.setText(t.Stmts.sDestTable); tDestDrop.setText(t.Stmts.sDestDrop); tDestCreateIndex.setText(t.Stmts.sDestCreateIndex); tDestDropIndex.setText(t.Stmts.sDestDropIndex); tDestCreate.setText(t.Stmts.sDestCreate); tDestDelete.setText(t.Stmts.sDestDelete); tSourceSelect.setText(t.Stmts.sSourceSelect); tDestInsert.setText(t.Stmts.sDestInsert); tDestAlter.setText(t.Stmts.sDestAlter); cTransfer.setState(t.Stmts.bTransfer); cDrop.setState(t.Stmts.bDrop); cCreate.setState(t.Stmts.bCreate); cDropIndex.setState(t.Stmts.bDropIndex); cCreateIndex.setState(t.Stmts.bCreateIndex); cDelete.setState(t.Stmts.bDelete); cInsert.setState(t.Stmts.bInsert); cAlter.setState(t.Stmts.bAlter); cFKForced.setState(t.Stmts.bFKForced); cIdxForced.setState(t.Stmts.bIdxForced); } /** * Method declaration * * * @param and */ private void updateEnabled(boolean and) { boolean b = cTransfer.getState(); tDestTable.setEnabled(and && b); tDestDrop.setEnabled(and && b && cDrop.getState()); tDestCreate.setEnabled(and && b && cCreate.getState()); tDestDelete.setEnabled(and && b && cDelete.getState()); tDestCreateIndex.setEnabled(and && b && cCreateIndex.getState()); tDestDropIndex.setEnabled(and && b && cDropIndex.getState()); tSourceSelect.setEnabled(and && b); tDestInsert.setEnabled(and && b && cInsert.getState()); tDestAlter.setEnabled(and && b && cAlter.getState()); cDrop.setEnabled(and && b); cCreate.setEnabled(and && b); cDelete.setEnabled(and && b); cCreateIndex.setEnabled(and && b); cDropIndex.setEnabled(and && b); cInsert.setEnabled(and && b); cAlter.setEnabled(and && b); cFKForced.setEnabled(cAlter.getState()); cIdxForced.setEnabled(cCreateIndex.getState()); bStart.setEnabled(and); if (iTransferMode == TRFM_TRANSFER) { bContinue.setEnabled(and); } } /** * Method ProcessNextStep */ private void ProcessNextStep() { switch (iSelectionStep) { case SELECT_SOURCE_CATALOG : case SELECT_DEST_CATALOG : if (CatalogToSelect()) { fMain.show(); return; } break; case SELECT_DEST_SCHEMA : case SELECT_SOURCE_SCHEMA : if (SchemaToSelect()) { fMain.show(); return; } break; case SELECT_SOURCE_TABLES : if (iTransferMode == TRFM_TRANSFER) { bStart.setLabel("Start Transfer"); } else if (iTransferMode == TRFM_DUMP) { bStart.setLabel("Start Dump"); } else if (iTransferMode == TRFM_RESTORE) { bStart.setLabel("Start Restore"); } bStart.invalidate(); bStart.setEnabled(false); lTable.setMultipleMode(false); RefreshMainDisplay(); break; default : break; } } /** * Method declaration * * * @param ev */ public void actionPerformed(ActionEvent ev) { if (ev.getSource() instanceof TextField) { saveTable(); return; } String s = ev.getActionCommand(); MenuItem i = new MenuItem(); if (s == null) { if (ev.getSource() instanceof MenuItem) { i = (MenuItem) ev.getSource(); s = i.getLabel(); } } if (s == null) {} if (s.equals("Start Transfer") || s.equals("ReStart Transfer")) { bStart.setLabel("ReStart Transfer"); bStart.invalidate(); CurrentTransfer = 0; CurrentAlter = 0; transfer(); } else if (s.equals("Continue Transfer")) { transfer(); } else if (s.equals("Start Dump") || s.equals("Start Restore")) { CurrentTransfer = 0; CurrentAlter = 0; transfer(); } else if (s.equals("Quit")) { exit(); } else if (s.indexOf("Select Schema") >= 0) { String[] selection = lTable.getSelectedItems(); if ((selection == null) || (selection.length == 0)) { return; } if (iSelectionStep == Transfer.SELECT_SOURCE_SCHEMA) { sSourceSchemas = selection; } else { sDestSchema = selection[0]; } if (iTransferMode == TRFM_DUMP) { iSelectionStep = Transfer.SELECT_SOURCE_TABLES; } else { iSelectionStep++; } ProcessNextStep(); } else if (s.indexOf("Select Catalog") >= 0) { String selection = lTable.getSelectedItem(); if ((selection == null) || (selection.equals(""))) { return; } if (iSelectionStep == Transfer.SELECT_SOURCE_CATALOG) { sSourceCatalog = selection; sSourceSchemas = null; } else { sDestCatalog = selection; sDestSchema = null; try { targetDb.setCatalog(sDestCatalog); } catch (Exception ex) { trace("Catalog " + sDestCatalog + " could not be selected in the target database"); sDestCatalog = null; } } iSelectionStep++; ProcessNextStep(); } else if (s.equals("Insert 10 rows only")) { iMaxRows = 10; } else if (s.equals("Insert 1000 rows only")) { iMaxRows = 1000; } else if (s.equals("Insert all rows")) { iMaxRows = 0; } else if (s.equals("Load Settings...")) { FileDialog f = new FileDialog(fMain, "Load Settings", FileDialog.LOAD); f.show(); String file = f.getDirectory() + f.getFile(); if (file != null) { LoadPrefs(file); displayTable(tCurrent); } } else if (s.equals("Save Settings...")) { FileDialog f = new FileDialog(fMain, "Save Settings", FileDialog.SAVE); f.show(); String file = f.getDirectory() + f.getFile(); if (file != null) { SavePrefs(file); } } else if (s.equals("Exit")) { windowClosing(null); } } /** * Method declaration * * * @param e */ public void windowActivated(WindowEvent e) {} /** * Method declaration * * * @param e */ public void windowDeactivated(WindowEvent e) {} /** * Method declaration * * * @param e */ public void windowClosed(WindowEvent e) {} private void cleanup() { try { if (sourceDb != null) { sourceDb.close(); } if (targetDb != null) { targetDb.close(); } } catch (Exception e) {} } /** * Method declaration * * * @param ev */ public void windowClosing(WindowEvent ev) { fMain.dispose(); if (bMustExit) { System.exit(0); } } /** * Method declaration * * * @param e */ public void windowDeiconified(WindowEvent e) {} /** * Method declaration * * * @param e */ public void windowIconified(WindowEvent e) {} /** * Method declaration * * * @param e */ public void windowOpened(WindowEvent e) {} /** * Method declaration * */ private void initGUI() { Font fFont = new Font("Dialog", Font.PLAIN, 12); setLayout(new BorderLayout()); Panel p = new Panel(); p.setBackground(SystemColor.control); p.setLayout(new GridLayout(16, 1)); tSourceTable = new TextField(); tSourceTable.setEnabled(false); tDestTable = new TextField(); tDestTable.addActionListener(this); tDestDrop = new TextField(); tDestDrop.addActionListener(this); tDestCreate = new TextField(); tDestCreate.addActionListener(this); tDestDelete = new TextField(); tDestDelete.addActionListener(this); tDestCreateIndex = new TextField(); tDestCreateIndex.addActionListener(this); tDestDropIndex = new TextField(); tDestDropIndex.addActionListener(this); tSourceSelect = new TextField(); tSourceSelect.addActionListener(this); tDestInsert = new TextField(); tDestInsert.addActionListener(this); tDestAlter = new TextField(); tDestAlter.addActionListener(this); cTransfer = new Checkbox("Transfer to destination table", true); cTransfer.addItemListener(this); cDrop = new Checkbox("Drop destination table (ignore error)", true); cDrop.addItemListener(this); cCreate = new Checkbox("Create destination table", true); cCreate.addItemListener(this); cDropIndex = new Checkbox("Drop destination index (ignore error)", true); cDropIndex.addItemListener(this); cIdxForced = new Checkbox("force Idx_ prefix for indexes names", false); cIdxForced.addItemListener(this); cCreateIndex = new Checkbox("Create destination index", true); cCreateIndex.addItemListener(this); cDelete = new Checkbox("Delete rows in destination table", true); cDelete.addItemListener(this); cInsert = new Checkbox("Insert into destination", true); cInsert.addItemListener(this); cFKForced = new Checkbox("force FK_ prefix for foreign key names", false); cFKForced.addItemListener(this); cAlter = new Checkbox("Alter destination table", true); cAlter.addItemListener(this); p.add(createLabel("Source table")); p.add(tSourceTable); p.add(cTransfer); p.add(tDestTable); p.add(cDrop); p.add(tDestDrop); p.add(cCreate); p.add(tDestCreate); p.add(cDropIndex); p.add(tDestDropIndex); p.add(cCreateIndex); p.add(tDestCreateIndex); p.add(cDelete); p.add(tDestDelete); p.add(cAlter); p.add(tDestAlter); p.add(createLabel("Select source records")); p.add(tSourceSelect); p.add(cInsert); p.add(tDestInsert); p.add(createLabel("")); p.add(createLabel("")); p.add(cIdxForced); p.add(cFKForced); p.add(createLabel("")); p.add(createLabel("")); if (iTransferMode == TRFM_TRANSFER) { bStart = new Button("Start Transfer"); bContinue = new Button("Continue Transfer"); bContinue.setEnabled(false); } else if (iTransferMode == Transfer.TRFM_DUMP) { bStart = new Button("Start Dump"); } else if (iTransferMode == Transfer.TRFM_RESTORE) { bStart = new Button("Start Restore"); } bStart.addActionListener(this); p.add(bStart); if (iTransferMode == TRFM_TRANSFER) { bContinue.addActionListener(this); p.add(bContinue); } bStart.setEnabled(false); fMain.add("Center", createBorderPanel(p)); lTable = new java.awt.List(10); lTable.addItemListener(this); fMain.add("West", createBorderPanel(lTable)); tMessage = new TextField(); Panel pMessage = createBorderPanel(tMessage); fMain.add("South", pMessage); } /** * Method declaration * * * @param center */ private Panel createBorderPanel(Component center) { Panel p = new Panel(); p.setBackground(SystemColor.control); p.setLayout(new BorderLayout()); p.add("Center", center); p.add("South", createLabel("")); p.add("East", createLabel("")); p.add("West", createLabel("")); p.setBackground(SystemColor.control); return p; } /** * Method declaration * * * @param s */ private Label createLabel(String s) { Label l = new Label(s); l.setBackground(SystemColor.control); return l; } private void SavePrefs(String f) { saveTable(); TransferCommon.savePrefs(f, sourceDb, targetDb, this, tTable); } private void LoadPrefs(String f) { TransferTable t; trace("Parsing Settings file"); bStart.setEnabled(false); if (iTransferMode == TRFM_TRANSFER) { bContinue.setEnabled(false); } tTable = TransferCommon.loadPrefs(f, sourceDb, targetDb, this); iSelectionStep = SELECT_SOURCE_TABLES; lTable.removeAll(); for (int i = 0; i < tTable.size(); i++) { t = (TransferTable) tTable.elementAt(i); lTable.add(t.Stmts.sSourceTable); } t = (TransferTable) tTable.elementAt(0); displayTable(t); lTable.select(0); updateEnabled(true); lTable.invalidate(); if (iTransferMode == TRFM_TRANSFER) { bStart.setLabel("Start Transfer"); trace("Edit definitions and press [Start Transfer]"); } else if (iTransferMode == TRFM_DUMP) { bStart.setLabel("Start Dump"); trace("Edit definitions and press [Start Dump]"); } else if (iTransferMode == TRFM_RESTORE) { bStart.setLabel("Start Restore"); trace("Edit definitions and press [Start Restore]"); } bStart.invalidate(); if (iTransferMode == TRFM_TRANSFER) { bContinue.setEnabled(false); } } /** * Method declaration * */ private void transfer() { saveTable(); updateEnabled(false); trace("Start Transfer"); int TransferIndex = CurrentTransfer; int AlterIndex = CurrentAlter; TransferTable t = null; long startTime, stopTime; startTime = System.currentTimeMillis(); try { for (int i = TransferIndex; i < tTable.size(); i++) { CurrentTransfer = i; t = (TransferTable) tTable.elementAt(i); lTable.select(i); displayTable(t); t.transferStructure(); t.transferData(iMaxRows); } for (int i = AlterIndex; i < tTable.size(); i++) { CurrentAlter = i; t = (TransferTable) tTable.elementAt(i); lTable.select(i); displayTable(t); t.transferAlter(); } stopTime = System.currentTimeMillis(); trace("Transfer finished successfully in: " + (stopTime - startTime) / 1000.00 + " sec"); if (iTransferMode == TRFM_TRANSFER) { bContinue.setLabel("Quit"); bContinue.setEnabled(true); bContinue.invalidate(); } else { bStart.setLabel("Quit"); bStart.setEnabled(true); bStart.invalidate(); } } catch (Exception e) { String last = tMessage.getText(); trace("Transfer stopped - " + last + " / / Error: " + e.toString()); e.printStackTrace(); } if (iTransferMode == TRFM_TRANSFER) { bContinue.setEnabled((CurrentAlter < tTable.size())); } updateEnabled(true); System.gc(); } protected void exit() { cleanup(); fMain.dispose(); if (bMustExit) { System.exit(0); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/SqlServerTransferHelper.java0000644000175000017500000001010612007547374025360 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.sql.Types; // sqlbob@users 20020325 - patch 1.7.0 - reengineering /** * Conversions from SQLServer7 databases * * @version 1.7.0 */ class SqlServerTransferHelper extends TransferHelper { private boolean firstTinyintRow; private boolean firstSmallintRow; SqlServerTransferHelper() { super(); } SqlServerTransferHelper(TransferDb database, Traceable t, String q) { super(database, t, q); } String formatTableName(String t) { if (t == null) { return t; } if (t.equals("")) { return t; } if (t.indexOf(' ') != -1) { return ("[" + t + "]"); } else { return (formatIdentifier(t)); } } int convertFromType(int type) { // MS SQL 7 specific problems (Northwind database) if (type == 11) { tracer.trace("Converted DATETIME (type 11) to TIMESTAMP"); type = Types.TIMESTAMP; } else if (type == -9) { tracer.trace("Converted NVARCHAR (type -9) to VARCHAR"); type = Types.VARCHAR; } else if (type == -8) { tracer.trace("Converted NCHAR (type -8) to VARCHAR"); type = Types.VARCHAR; } else if (type == -10) { tracer.trace("Converted NTEXT (type -10) to VARCHAR"); type = Types.VARCHAR; } else if (type == -1) { tracer.trace("Converted LONGTEXT (type -1) to LONGVARCHAR"); type = Types.LONGVARCHAR; } return (type); } void beginTransfer() { firstSmallintRow = true; firstTinyintRow = true; } Object convertColumnValue(Object value, int column, int type) { // solves a problem for MS SQL 7 if ((type == Types.SMALLINT) && (value instanceof Integer)) { if (firstSmallintRow) { firstSmallintRow = false; tracer.trace("SMALLINT: Converted column " + column + " Integer to Short"); } value = new Short((short) ((Integer) value).intValue()); } else if ((type == Types.TINYINT) && (value instanceof Integer)) { if (firstTinyintRow) { firstTinyintRow = false; tracer.trace("TINYINT: Converted column " + column + " Integer to Byte"); } value = new Byte((byte) ((Integer) value).intValue()); } return (value); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/FontDialogSwing.java0000644000175000017500000003047112007547372023630 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GraphicsEnvironment; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JColorChooser; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; // weconsultants@users 20041109 - original swing port // weconsultants@users 20050215 - version 1.8.0 - Update: Compatbilty fix for JDK 1.3 // - Replaced: Objects JSpinner spinnerFontSizes and SpinnerNumberModel spinnerModelSizes // for JComboBox fontSizesComboBox and String fontSizes[]; public class FontDialogSwing extends JDialog { private static boolean isRunning = false; private static final String BACKGROUND = "Background"; private static String defaultFont = "Dialog"; private static final String FOREGROUND = "Foreground"; private static JButton bgColorButton; private static JCheckBox ckbbold; private static JButton closeButton; private static JButton fgColorButton; private static JComboBox fontsComboBox; // weconsultants@users 20050215 - Added for Compatbilty fix for JDK 1.3 private static JComboBox fontSizesComboBox; private static final String[] fontSizes = { "8", "9", "10", "11", "12", "13", "14", "16", "18", "24", "36" }; // weconsultants@users 20050215 - Commented out for Compatbilty fix for JDK 1.3 // private static JSpinner spinnerFontSizes; // private static SpinnerNumberModel spinnerModelSizes; private static DatabaseManagerSwing fOwner; private static JFrame frame = new JFrame("DataBaseManagerSwing Font Selection Dialog"); private static JCheckBox ckbitalic; /** * Create and display FontDialogSwing Dialog. * */ public static void creatFontDialog(DatabaseManagerSwing owner) { if (isRunning) { frame.setVisible(true); } else { CommonSwing.setSwingLAF(frame, CommonSwing.Native); fOwner = owner; frame.setIconImage(CommonSwing.getIcon("Frame")); isRunning = true; frame.setSize(600, 100); CommonSwing.setFramePositon(frame); ckbitalic = new JCheckBox( new ImageIcon(CommonSwing.getIcon("ItalicFont"))); ckbitalic.putClientProperty("is3DEnabled", Boolean.TRUE); ckbitalic.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setStyle(); } }); ckbbold = new JCheckBox(new ImageIcon(CommonSwing.getIcon("BoldFont"))); ckbbold.putClientProperty("is3DEnabled", Boolean.TRUE); ckbbold.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setStyle(); } }); fgColorButton = new JButton( "Foreground", new ImageIcon(CommonSwing.getIcon("ColorSelection"))); fgColorButton.putClientProperty("is3DEnabled", Boolean.TRUE); fgColorButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setColor(FOREGROUND); } }); bgColorButton = new JButton( "Background", new ImageIcon(CommonSwing.getIcon("ColorSelection"))); bgColorButton.putClientProperty("is3DEnabled", Boolean.TRUE); bgColorButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setColor(BACKGROUND); } }); closeButton = new JButton("Close", new ImageIcon(CommonSwing.getIcon("Close"))); closeButton.putClientProperty("is3DEnabled", Boolean.TRUE); closeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { frame.setVisible(false); } }); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); String[] fontNames = ge.getAvailableFontFamilyNames(); Dimension fontsComboBoxDimension = new Dimension(160, 25); fontsComboBox = new JComboBox(fontNames); fontsComboBox.putClientProperty("is3DEnabled", Boolean.TRUE); fontsComboBox.setMaximumSize(fontsComboBoxDimension); fontsComboBox.setPreferredSize(fontsComboBoxDimension); fontsComboBox.setMaximumSize(fontsComboBoxDimension); fontsComboBox.setEditable(false); fontsComboBox.setSelectedItem(defaultFont); fontsComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setFont(); } }); // weconsultants@users 20050215 - Added for Compatbilty fix for JDK 1.3 fontSizesComboBox = new JComboBox(fontSizes); Dimension spinnerDimension = new Dimension(45, 25); fontSizesComboBox.putClientProperty("is3DEnabled", Boolean.TRUE); fontSizesComboBox.setMinimumSize(spinnerDimension); fontSizesComboBox.setPreferredSize(spinnerDimension); fontSizesComboBox.setMaximumSize(spinnerDimension); fontSizesComboBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent evt) { if (evt.getStateChange() == ItemEvent.SELECTED) { setFontSize((String) evt.getItem()); } } }); // weconsultants@users 20050215 - Commented out for Compatbilty fix for JDK 1.3 // Dimension spinnerDimension = new Dimension(50, 25); // spinnerFontSizes = new JSpinner(); // spinnerFontSizes.putClientProperty("is3DEnabled", Boolean.TRUE); // spinnerFontSizes.setMinimumSize(spinnerDimension); // spinnerFontSizes.setPreferredSize(spinnerDimension); // spinnerFontSizes.setMaximumSize(spinnerDimension); // spinnerModelSizes = new SpinnerNumberModel(12, 8, 72, 1); // spinnerFontSizes.setModel(spinnerModelSizes); // spinnerFontSizes.addChangeListener(new ChangeListener() { // public void stateChanged(ChangeEvent e) { // setFontSize(); // } // }); Container contentPane = frame.getContentPane(); contentPane.setLayout(new FlowLayout()); contentPane.add(fontsComboBox); // weconsultants@users 20050215 - Commented out for Compatbilty fix for 1.3 // contentPane.add(spinnerFontSizes); // weconsultants@users 20050215 - Added for Compatbilty fix for 1.3 contentPane.add(fontSizesComboBox); contentPane.add(ckbbold); contentPane.add(ckbitalic); contentPane.add(fgColorButton); contentPane.add(bgColorButton); contentPane.add(closeButton); frame.pack(); frame.setVisible(false); } } public static void setFont() { Font txtResultFont = fOwner.txtResult.getFont(); fOwner.txtResult.setFont( new Font( fontsComboBox.getSelectedItem().toString(), txtResultFont.getStyle(), txtResultFont.getSize())); Font txtCommandFont = fOwner.txtResult.getFont(); fOwner.txtCommand.setFont( new Font( fontsComboBox.getSelectedItem().toString(), txtCommandFont.getStyle(), txtCommandFont.getSize())); Font txtTreeFont = fOwner.txtResult.getFont(); fOwner.tTree.setFont( new Font( fontsComboBox.getSelectedItem().toString(), txtTreeFont.getStyle(), txtTreeFont.getSize())); } /** * Displays a color chooser and Sets the selected color. */ public static void setFontSize(String inFontSize) { // weconsultants@users 20050215 - Changed for Compatbilty fix for JDK 1.3 // Convert Strng to float for deriveFont() call Float stageFloat = new Float(inFontSize); float fontSize = stageFloat.floatValue(); Font fonttTree = fOwner.tTree.getFont().deriveFont(fontSize); fOwner.tTree.setFont(fonttTree); Font fontTxtCommand = fOwner.txtCommand.getFont().deriveFont(fontSize); fOwner.txtCommand.setFont(fontTxtCommand); Font fontTxtResult = fOwner.txtResult.getFont().deriveFont(fontSize); fOwner.txtResult.setFont(fontTxtResult); } /** * Changes the style (Bold, Italic ) of the selected text by checking the * style buttons */ public static void setStyle() { int style = Font.PLAIN; if (ckbbold.isSelected()) { style |= Font.BOLD; } if (ckbitalic.isSelected()) { style |= Font.ITALIC; } fOwner.tTree.setFont(fOwner.txtCommand.getFont().deriveFont(style)); fOwner.txtCommand.setFont( fOwner.txtCommand.getFont().deriveFont(style)); fOwner.txtResult.setFont( fOwner.txtResult.getFont().deriveFont(style)); } public static void setColor(String inTarget) { if (inTarget.equals(BACKGROUND)) { Color backgroundColor = JColorChooser.showDialog(null, "DataBaseManagerSwing Choose Background Color", fOwner.txtResult.getBackground()); if (backgroundColor != null) { bgColorButton.setBackground(backgroundColor); fOwner.txtCommand.setBackground(backgroundColor); fOwner.txtResult.setBackground(backgroundColor); } } else { Color foregroundColor = JColorChooser.showDialog(null, "DataBaseManagerSwing Choose Foreground Color", fOwner.txtResult.getForeground()); if (foregroundColor != null) { fgColorButton.setBackground(foregroundColor); fOwner.txtCommand.setForeground(foregroundColor); fOwner.txtResult.setForeground(foregroundColor); } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/Colors.png0000644000175000017500000000454712007547372021703 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ ‰PNG  IHDRàw=øóIDATxÚµÖKhœUðß$“Éäáä¡©6iM ­qQˆÖØJ A! ‚©6Ôn*®”Š"*T„,‹­fº³FD¥P‹ÍÂ-(>j)mB£!Ö´?ÌÄ™\ù&™¤3cƒô¹÷{ÜsÏùÎ9ÿ{îÇFl•²UEÏóÿû úZ“Í[›jßžŒ§:ëâ³·Ö¿¹¯£±‰FW‡í-µ;^¹£%œØÞÎ<°>œî[†{ÚÂÞö†шêU‡¨¯5Ù||:ó×±ûÖꪯ¹fþ›KYƒßMÚß™ºûís3¿!…mʺ—ɇ×?Ûz[IåÐÛ\k¸§ÍÕüü´ ^J®œ?ØÅl~ïšÚêŠ!ìI%|5?y7#YJ_9U›S‰º›â•ó—ŠWù=?K 92»îÕÄLý3_™…ó?Áµ3¨+ǨqÛ•">tKb É.ÌàÞů "?Ø?-¤?)§Œ˜ô…u^ðŽ‹È¾Â¥?-Ä¿åeê7ú|[£X¬Xäiî?ÊÐÒ›þÙ gr9¾ÆaTð¡/1‹|Ñê}?¤/óÚÁCkª¼µ¹H'Þë_ôäSŽJ/ÍOà9t¹Çk~‰¨[À“CŒòËú¦†ÞÂØŽÎ~ÂX CkØj‚RíÁ£F±>ÊKaÃ=ö^c`YÏá|iÅ…vNÐ-‹»?ªZbS®m?mо8”G~¶HÝ"Z}ŸáBåÅ‹CyŒ£ÛjQ¼“ºŽðSåÅŸ.åñ1î5†lD×Bžè`wàx™üÔm F:‚eâ?" ØãñBŠm'ØóðÂ!28˜ LFÏO½j¿!ƒ‚C‚S‚\t=)Þú ,Š­(õ¼´‘˸º“+Mœž£÷$ÙaŽŒcÊ‹’2žuÅNÚt›Ó뤜÷}dç£l¤W§ê¨®´D²9JV—0?¿#Ù&´–‘™.±“—y?ªc2ºÏ!õ\Q«$3ÿ_‡þõò7æG`5øÒ[8p?üHwIEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/DataAccessPoint.java0000644000175000017500000001015212007547372023571 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.io.Serializable; import java.util.Vector; /** * Database Transfer Tool * @author Nicolas BAZIN, INGENICO * @version 1.7.0 */ class DataAccessPoint implements Serializable { Traceable tracer; TransferHelper helper; String databaseToConvert; public DataAccessPoint() { tracer = null; helper = HelperFactory.getHelper(""); databaseToConvert = ""; } public DataAccessPoint(Traceable t) { tracer = t; helper = HelperFactory.getHelper(""); helper.set(null, t, "\'"); databaseToConvert = ""; } boolean isConnected() { return false; } boolean getAutoCommit() throws DataAccessPointException { return false; } void commit() throws DataAccessPointException {} void rollback() throws DataAccessPointException {} void setAutoCommit(boolean flag) throws DataAccessPointException {} boolean execute(String statement) throws DataAccessPointException { return false; } TransferResultSet getData(String statement) throws DataAccessPointException { return null; } void putData(String statement, TransferResultSet r, int iMaxRows) throws DataAccessPointException {} Vector getSchemas() throws DataAccessPointException { return new Vector(); } Vector getCatalog() throws DataAccessPointException { return new Vector(); } void setCatalog(String sCatalog) throws DataAccessPointException {} Vector getTables(String sCatalog, String[] sSchemas) throws DataAccessPointException { return new Vector(); } void getTableStructure(TransferTable SQLCommands, DataAccessPoint Dest) throws DataAccessPointException { throw new DataAccessPointException("Nothing to Parse"); } void close() throws DataAccessPointException {} void beginDataTransfer() throws DataAccessPointException { try { helper.beginDataTransfer(); } catch (Exception e) { throw new DataAccessPointException(e.getMessage()); } } void endDataTransfer() throws DataAccessPointException { try { helper.endDataTransfer(); } catch (Exception e) { throw new DataAccessPointException(e.getMessage()); } } /** * @return Returns the helper. */ public TransferHelper getHelper() { return helper; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/CSVWriter.java0000644000175000017500000001060012007547372022412 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; /** * helper class to write table data to a csv-file (comma separated values). * the first line in file is a list of fieldnames, all following lines * are data lines. * a descptiontion of file format can be found on: http://www.wotsit.org/ * usage: create a object using the constructor. call writeHeader * for writing the filename header then add data with writeData. * at the end close() closes the file. * *@author jeberle@users */ public class CSVWriter { private String newline = System.getProperty("line.separator"); private OutputStreamWriter writer = null; private int nbrCols = 0; private int nbrRows = 0; /** * constructor. * creates a csv file for writing data to it * @param file the file to write data to * @param encoding encoding to use or null (=defualt) */ public CSVWriter(File file, String encoding) throws IOException { if (encoding == null) { encoding = System.getProperty("file.encoding"); } FileOutputStream fout = new FileOutputStream(file); writer = new OutputStreamWriter(fout, encoding); } /** * writes the csv header (fieldnames). should be called after * construction one time. * @param header String[] with fieldnames */ public void writeHeader(String[] header) throws IOException { this.nbrCols = header.length; doWriteData(header); } /** * writes a data-record to the file. note that data[] must have * same number of elements as the header had. * * @param data data to write to csv-file */ public void writeData(String[] data) throws IOException { doWriteData(data); } /** * closes the csv file. */ public void close() throws IOException { this.writer.close(); } private void doWriteData(String[] values) throws IOException { for (int i = 0; i < values.length; i++) { if (i > 0) { this.writer.write(";"); } if (values[i] != null) { this.writer.write("\""); this.writer.write(this.toCsvValue(values[i])); this.writer.write("\""); } } this.writer.write(newline); this.nbrRows++; } private String toCsvValue(String str) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); sb.append(c); switch (c) { case '"' : sb.append('"'); break; } } return sb.toString(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/DatabaseManagerCommon.java0000644000175000017500000003512512007547374024745 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.util; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.sql.SQLException; import java.sql.Statement; import java.util.Random; // sqlbob@users 20020401 - patch 1.7.0 by sqlbob (RMP) - enhancements // sqlbob@users 20020407 - patch 1.7.0 - reengineering // nickferguson@users 20021005 - patch 1.7.1 - enhancements // fredt@users 20021012 - patch 1.7.1 - changes to test database DDL // weconsultants@users 20041116 - patch 1.8.0 - in 'TestHelp' added 'IF EXISTS for both DROPS. // Now catching the execption that was never caught before. /** * Common code in Swing and AWT versions of DatabaseManager * * New class based on Hypersonic original * * @author Thomas Mueller (Hypersonic SQL Group) * @author Bob Preston (sqlbob@users dot sourceforge.net) * @version 1.8.0 * @since 1.7.0 */ class DatabaseManagerCommon { private static Random rRandom = new Random(100); static String[] selectHelp = { "SELECT * FROM ", "SELECT [LIMIT n m] [DISTINCT] \n" + "{ selectExpression | table.* | * } [, ... ] \n" + "[INTO [CACHED|TEMP|TEXT] newTable] \n" + "FROM tableList \n" + "[WHERE Expression] \n" + "[ORDER BY selectExpression [{ASC | DESC}] [, ...] ] \n" + "[GROUP BY Expression [, ...] ] \n" // + "[UNION [ALL] selectStatement]" }; static String[] insertHelp = { "INSERT INTO ", "INSERT INTO table [ (column [,...] ) ] \n" + "{ VALUES(Expression [,...]) [,...] | SelectStatement }" }; static String[] updateHelp = { "UPDATE ", "UPDATE table SET column = Expression [, ...] \n" + "[WHERE Expression]" }; static String[] deleteHelp = { "DELETE FROM ", "DELETE FROM table [WHERE Expression]" }; static String[] createTableHelp = { "CREATE TABLE ", "CREATE [TEMP] [CACHED|MEMORY|TEXT] TABLE name \n" + "( columnDefinition [, ...] ) \n\n" + "columnDefinition: \n" + "column DataType [ [NOT] NULL] [PRIMARY KEY] \n" + "DataType: \n" + "{ INTEGER | DOUBLE | VARCHAR | DATE | TIME |... }" }; static String[] dropTableHelp = { "DROP TABLE ", "DROP TABLE table" }; static String[] createIndexHelp = { "CREATE INDEX ", "CREATE [UNIQUE] INDEX index ON \n" + "table (column [, ...])" }; static String[] dropIndexHelp = { "DROP INDEX ", "DROP INDEX table.index" }; static String[] checkpointHelp = { "CHECKPOINT", "(HSQLDB SQL only)" }; static String[] scriptHelp = { "SCRIPT", "SCRIPT ['file']\n\n" + "(HSQLDB SQL only)" }; static String[] shutdownHelp = { "SHUTDOWN", "SHUTDOWN [COMPACT|IMMEDIATELY|SCRIPT]\n\n" + "(HSQLDB SQL only)" }; static String[] setHelp = { "SET ", "SET AUTOCOMMIT { TRUE | FALSE }\n" + "SET DATABASE COLLATION \"\"\n" + "SET FILES CHECKPOINT DEFRAG \n" + "SET DATABASE INITIAL SCHEMA \n" // + "SET FILES LOG SIZE \n" // + "SET MAXROWS maxrows\n" // + "SET PASSWORD \n" // + "SET FILES READ { ONLY | WRITE }\n" + "SET SCHEMA \n" + "SET TABLE READ { ONLY | WRITE }\n" + "SET TABLE SOURCE { ON | OFF }\n" + "SET TABLE SOURCE \"\" [DESC]\n" + "\n\n" // + "(HSQLDB SQL only)" }; static String[] testHelp = { "-->>>TEST<<<-- ;\n" + "--#1000;\n" + "DROP TABLE Test IF EXISTS;\n" + "CREATE TABLE Test(\n" + " Id INTEGER PRIMARY KEY,\n" + " FirstName VARCHAR(20),\n" + " Name VARCHAR(50),\n" + " ZIP INTEGER) ;\n" + "INSERT INTO Test \n" + " VALUES(#,'Julia','Peterson-Clancy',#) ;\n" + "UPDATE Test SET Name='Hans' WHERE Id=# ;\n" + "SELECT * FROM Test WHERE Id=# ;\n" + "DELETE FROM Test WHERE Id=# ;\n" + "DROP TABLE Test IF EXISTS;", "This test script is parsed by the DatabaseManager\n" + "It may be changed manually. Rules:\n" + "- it must start with -->>>TEST<<<--.\n" + "- each line must end with ';' (no spaces after)\n" + "- lines starting with -- are comments\n" + "- lines starting with --# means set new count\n" }; static String[] testDataSql = { "SELECT * FROM Product", // "SELECT * FROM Invoice", // "SELECT * FROM Item", "SELECT * FROM Customer a INNER JOIN Invoice i ON a.ID=i.CustomerID", "SELECT * FROM Customer a LEFT OUTER JOIN Invoice i ON a.ID=i.CustomerID", "SELECT * FROM Invoice d INNER JOIN Item i ON d.ID=i.InvoiceID", "SELECT * FROM Customer WHERE Street LIKE '1%' ORDER BY Lastname", "SELECT a.id, a.firstname, a.lastname, count(i.Total) \"COUNT\", " + "COALESCE(sum(i.Total), 0) \"TOTAL\", COALESCE(AVG(i.Total),0) \"AVG\" FROM Customer a " + "LEFT OUTER JOIN Invoice i ON a.ID=i.CustomerID GROUP BY a.id, a.firstname, a.lastname" }; static String random(String[] s) { return s[random(s.length)]; } static int random(int i) { i = rRandom.nextInt() % i; return i < 0 ? -i : i; } static void createTestTables(Statement sStatement) { String[] demo = { "DROP TABLE Item IF EXISTS;", "DROP TABLE Invoice IF EXISTS;", "DROP TABLE Product IF EXISTS;", "DROP TABLE Customer IF EXISTS;", "CREATE TABLE Customer(ID INTEGER PRIMARY KEY,FirstName VARCHAR(20)," + "LastName VARCHAR(20),Street VARCHAR(20),City VARCHAR(20));", "CREATE TABLE Product(ID INTEGER PRIMARY KEY,Name VARCHAR(20)," + "Price DECIMAL(10,2));", "CREATE TABLE Invoice(ID INTEGER PRIMARY KEY,CustomerID INTEGER," + "Total DECIMAL(10,2), FOREIGN KEY (CustomerId) " + "REFERENCES Customer(ID) ON DELETE CASCADE);", "CREATE TABLE Item(InvoiceID INTEGER,Item INTEGER," + "ProductID INTEGER,Quantity INTEGER,Cost DECIMAL(10,2)," + "PRIMARY KEY(InvoiceID,Item), " + "FOREIGN KEY (InvoiceId) REFERENCES " + "Invoice (ID) ON DELETE CASCADE, FOREIGN KEY (ProductId) " + "REFERENCES Product(ID) ON DELETE CASCADE);" }; for (int i = 0; i < demo.length; i++) { // drop table may fail try { sStatement.execute(demo[i]); } catch (SQLException e) { ; } } } static String createTestData(Statement sStatement) throws SQLException { String[] name = { "White", "Karsen", "Smith", "Ringer", "May", "King", "Fuller", "Miller", "Ott", "Sommer", "Schneider", "Steel", "Peterson", "Heiniger", "Clancy" }; String[] firstname = { "Mary", "James", "Anne", "George", "Sylvia", "Robert", "Janet", "Michael", "Andrew", "Bill", "Susanne", "Laura", "Bob", "Julia", "John" }; String[] street = { "Upland Pl.", "College Av.", "- 20th Ave.", "Seventh Av." }; String[] city = { "New York", "Dallas", "Boston", "Chicago", "Seattle", "San Francisco", "Berne", "Oslo", "Paris", "Lyon", "Palo Alto", "Olten" }; String[] product = { "Iron", "Ice Tea", "Clock", "Chair", "Telephone", "Shoe" }; int max = 50; for (int i = 0; i < max; i++) { sStatement.execute("INSERT INTO Customer VALUES(" + i + ",'" + random(firstname) + "','" + random(name) + "','" + random(554) + " " + random(street) + "','" + random(city) + "')"); sStatement.execute("INSERT INTO Product VALUES(" + i + ",'" + random(product) + " " + random(product) + "'," + (20 + 2 * random(120)) + ")"); } for (int i = 0; i < max; i++) { sStatement.execute("INSERT INTO Invoice VALUES(" + i + "," + random(max) + ",0.0)"); for (int j = random(20) + 2; j >= 0; j--) { sStatement.execute("INSERT INTO Item VALUES(" + i + "," + j + "," + random(max) + "," + (1 + random(24)) + ",1.5)"); } } sStatement.execute("UPDATE Product SET Price=ROUND(Price*.1,2)"); sStatement.execute( "UPDATE Item SET Cost=Cost*" + "(SELECT Price FROM Product prod WHERE ProductID=prod.ID)"); sStatement.execute( "UPDATE Invoice SET Total=(SELECT SUM(Cost*" + "Quantity) FROM Item WHERE InvoiceID=Invoice.ID)"); return ("SELECT * FROM Customer"); } /** * Redid this file to remove sizing requirements and to make it faster * Speeded it up 10 fold. * * @param file */ static String readFile(String file) { try { FileReader reader = new FileReader(file); BufferedReader read = new BufferedReader(reader); StringBuffer b = new StringBuffer(); String s = null; int count = 0; while ((s = read.readLine()) != null) { count++; b.append(s); b.append('\n'); } read.close(); reader.close(); return b.toString(); } catch (IOException e) { return e.toString(); } } static void writeFile(String file, String text) { try { FileWriter write = new FileWriter(file); write.write(text.toCharArray()); write.close(); } catch (IOException e) { e.printStackTrace(); } } /** * @throws SQLException */ static long testStatement(Statement sStatement, String sql, int max) throws SQLException { long start = System.currentTimeMillis(); if (sql.indexOf('#') == -1) { max = 1; } for (int i = 0; i < max; i++) { String s = sql; while (true) { int j = s.indexOf("#r#"); if (j == -1) { break; } s = s.substring(0, j) + ((int) (Math.random() * i)) + s.substring(j + 3); } while (true) { int j = s.indexOf('#'); if (j == -1) { break; } s = s.substring(0, j) + i + s.substring(j + 1); } sStatement.execute(s); } return (System.currentTimeMillis() - start); } private DatabaseManagerCommon() {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/Close.png0000644000175000017500000000350512007547372021500 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ ‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ  O¸á•IDATxœí’Á €0 EèÑ9DWqÇp'ðàуx\ÁâA…XÅ‚ÍEèƒÒ6¡ÿ‡&‰„’xò°ËC®r`|H=#Ð%0«¸{æyï¥8ÄDÅÄYÁÔJLŸÏ» nÕTVâp¯¼°¯”ðdm¢›,ì£iÚƒ–kÅ®¡?•ø‰þ²Ï£Ú)ƒ§¿vG7ù3<ûªEJIEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/Hourglass.gif0000644000175000017500000000173312007547374022366 0ustar renereneGIF89aç3f™Ìÿ3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿÿ3ÿfÿ™ÿÌÿÿ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌffÿf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌffÌ™fÌÌfÌÿfÿfÿ3fÿffÿ™fÿÌfÿÿ™™3™f™™™Ì™ÿ™3™33™3f™3™™3Ì™3ÿ™f™f3™ff™f™™fÌ™fÿ™™™™3™™f™™™™™Ì™™ÿ™Ì™Ì3™Ìf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™ÿf™ÿ™™ÿÌ™ÿÿÌÌ3ÌfÌ™ÌÌÌÿÌ3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3ÌffÌf™ÌfÌÌfÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3ÌÿfÌÿ™ÌÿÌÌÿÿÿÿ3ÿfÿ™ÿÌÿÿÿ3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3ÿffÿf™ÿfÌÿfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿÿÿ3ÿÿfÿÿ™ÿÿÌÿÿÿ (((555CCCPPP]]]kkkxxx†††“““¡¡¡®®®»»»ÉÉÉÖÖÖäääÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ùÿ,¸ÿý+® ÁƒË €Ã‡!‚S8QΜ‰ÚÈq#<(ŒHòáÄ…’[¹2\¸o R\øOå5rÓP‘{“&Írܾ]›–¹oÜfúüÀ7¢Ó>·ôgÓ§¨@†SZµ&€œ=»úlˆ UX±¯F…¹íUrCN ôÜkxÒMÚUeº¡YÓÁ·4%œP³>)pdI’ŒËYĨ±#G©">ŽÈ˜!ÂÏ2;hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/MainInvoker.java0000644000175000017500000001305312007547374023013 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; /** * Invokes the static main(String[]) method from each class specified. * * This class will System.exit() if any invocation fails. * * @author Blaine Simpson (blaine dot simpson at admc dot com) * @since HSQLDB 1.8.0 * @version $Revision: 4141 $, $Date: 2011-03-14 01:35:49 +0000 (Mon, 14 Mar 2011) $ */ public class MainInvoker { /* * This class currently consists of just a static utility. * It may or may not make sense to make this into a class with real * instances that can keep track of status of stuff invoked by it. */ private static String[] emptyStringArray = new String[0]; private static void syntaxFailure() { System.err.println(SYNTAX_MSG); System.exit(2); } /** * Invokes the static main(String[]) method from each specified class. * This method will System.exit() if any invocation fails. * * Note that multiple class invocations are delimited by empty-string * parameters. How the user supplies these empty strings is determined * entirely by the caller's environment. From Windows this can * generally be accomplished with double-quotes like "". From all * popular UNIX shells, this can be accomplished with single or * double-quotes: '' or "". * * @param sa Run java org.hsqldb.util.MainInvoker --help for syntax help */ public static void main(String[] sa) { if (sa.length > 0 && sa[0].equals("--help")) { System.err.println(SYNTAX_MSG); System.exit(0); } ArrayList outList = new ArrayList(); int curInArg = -1; try { while (++curInArg < sa.length) { if (sa[curInArg].length() < 1) { if (outList.size() < 1) { syntaxFailure(); } invoke((String) outList.remove(0), (String[]) outList.toArray(emptyStringArray)); outList.clear(); } else { outList.add(sa[curInArg]); } } if (outList.size() < 1) { syntaxFailure(); } invoke((String) outList.remove(0), (String[]) outList.toArray(emptyStringArray)); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } public static String LS = System.getProperty("line.separator"); private static String SYNTAX_MSG = " java org.hsqldb.util.MainInvoker " + "[package1.Class1 [arg1a arg1b...] \"\"]... \\\n" + " packageX.ClassX [argXa argXb...]\n" + "OR\n" + " java org.hsqldb.util.MainInvoker --help\n\n" + "Note that you can only invoke classes in 'named' (non-default) " + "packages. Delimit multiple classes with empty strings."; static { if (!LS.equals("\n")) { SYNTAX_MSG = SYNTAX_MSG.replaceAll("\n", LS); } } /** * Invokes the static main(String[]) method from each specified class. */ public static void invoke(String className, String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { Class c; Method method; Class[] stringArrayCA = { emptyStringArray.getClass() }; Object[] objectArray = { (args == null) ? emptyStringArray : args }; c = Class.forName(className); method = c.getMethod("main", stringArrayCA); method.invoke(null, objectArray); //System.err.println(c.getName() + ".main() invoked"); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/0000755000175000017500000000000012007570424022442 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/Option.java0000644000175000017500000000724512007547372024573 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; /* $Id: Option.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Static methods and constants to decode preprocessor options. * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ public class Option { public static final int DEFAULT = 0; // No options set public static final int BACKUP = 1<<0; // Backup source files? public static final int FILTER = 1<<1; // Remove directive lines? public static final int INDENT = 1<<2; // indent directive lines? public static final int TEST_ONLY = 1<<3; // process only; don't save public static final int VERBOSE = 1<<4; // log detailed info private Option(){/*Construction Disabled*/} public static boolean isDefault(int options) { return options == DEFAULT; } public static int setDefault(int options, boolean _default) { return (_default) ? DEFAULT : options; } public static boolean isBackup(int options) { return ((options & BACKUP) != 0); } public static int setBackup(int options, boolean backup) { return (backup) ? (options | BACKUP) : (options & ~BACKUP); } public static boolean isFilter(int options) { return ((options & FILTER) != 0); } public static int setFilter(int options, boolean filter) { return (filter) ? (options | FILTER) : (options & ~FILTER); } public static boolean isIndent(int options) { return ((options & INDENT) != 0); } public static int setIndent(int options, boolean indent) { return (indent) ? (options | INDENT) : (options & ~INDENT); } public static boolean isTestOnly(int options) { return ((options & TEST_ONLY) != 0); } public static int setTestOnly(int options, boolean testOnly) { return (testOnly) ? (options | TEST_ONLY) : (options & ~TEST_ONLY); } public static boolean isVerbose(int options) { return ((options & VERBOSE) != 0); } public static int setVerbose(int options, boolean verbose) { return (verbose) ? (options | VERBOSE) : (options & ~VERBOSE); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/PreprocessorException.java0000644000175000017500000000364512007547372027670 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; /* $Id: PreprocessorException.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Thrown when preprocessing fails. * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ public class PreprocessorException extends Exception { public PreprocessorException(String message) { super(message); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/Token.java0000644000175000017500000000661212007547372024400 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; /* $Id: Token.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Static methods and constants to decode directive tokens. * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ final class Token { static final int EOI = -1; static final int UNKNOWN = 0; static final int IDENT = 1; static final int NUMBER = 2; static final int STRING = 3; static final int AND = '&'; static final int OR = '|'; static final int XOR = '^'; static final int NOT = '!'; static final int GT = '>'; static final int GTE = '>' + '='; static final int LT = '<'; static final int LTE = '<' + '='; static final int ASSIGN = '='; static final int EQ = '=' + '='; static final int LPAREN = '('; static final int RPAREN = ')'; static boolean isAssignmentOperator(final int type) { return (type == ASSIGN); } static boolean isComparisonOperator(final int type) { switch(type) { case EQ : case LT : case GT : case LTE : case GTE : { return true; } default : { return false; } } } static boolean isLogicalOperator(final int type) { switch(type) { case AND : case OR : case XOR : case NOT : { return true; } default : { return false; } } } static boolean isValue(final int type) { switch (type) { case IDENT : case STRING : case NUMBER : { return true; } default : { return false; } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/BasicResolver.java0000644000175000017500000000544112007547372026062 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; import java.io.File; import java.io.IOException; /* $Id: BasicResolver.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Resolves paths using a parent directory; does not resolve properties. * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ class BasicResolver implements IResolver { File parentDir; public BasicResolver(File parentDir) { this.parentDir = parentDir; } public String resolveProperties(String expression) { return expression; } public File resolveFile(String path) { File file = new File(path); if (parentDir != null && !file.isAbsolute()) { try { path = this.parentDir.getCanonicalPath() + File.separatorChar + path; file = new File(path); } catch (IOException ex) { path = this.parentDir.getAbsolutePath() + File.separatorChar + path; file = new File(path); } } try { return file.getCanonicalFile(); } catch (Exception e) { return file.getAbsoluteFile(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/AntResolver.java0000644000175000017500000000440612007547372025563 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; import java.io.File; import org.apache.tools.ant.Project; /* $Id: AntResolver.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Resolves properties and paths using an ANT Project. * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ class AntResolver implements IResolver { private Project project; /** Creates a new instance of AntResolver */ public AntResolver(Project project) { this.project = project; } public String resolveProperties(String expression) { return this.project.replaceProperties(expression); } public File resolveFile(String path) { return this.project.resolveFile(path); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/LineType.java0000644000175000017500000001022112007547372025040 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; import java.lang.reflect.Field; import java.util.Hashtable; import java.util.Locale; /* $Id: LineType.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Static methods and constants to decode preprocessor line types. * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ class LineType { // static final int UNKNOWN = 0; static final int DEF = 1; static final int DEFINE = 1; static final int ELIF = 2; static final int ELIFDEF = 3; static final int ELIFNDEF = 4; static final int ELSE = 5; static final int ENDIF = 6; static final int ENDINCLUDE = 7; static final int HIDDEN = 8; static final int IF = 9; static final int IFDEF = 10; static final int IFNDEF = 11; static final int INCLUDE = 12; static final int UNDEF = 13; static final int UNDEFINE = 13; static final int VISIBLE = 14; // private static Hashtable directives; private static String[] labels; static synchronized String[] labels() { if (labels == null) { init(); } return labels; } static synchronized Hashtable directives() { if (directives == null) { init(); } return directives; } private static void init() { directives = new Hashtable(); labels = new String[17]; Field[] fields = LineType.class.getDeclaredFields(); for (int i = 0, j = 0; i < fields.length; i++) { Field field = fields[i]; if (field.getType().equals(Integer.TYPE)) { String label = field.getName(); try { int value = field.getInt(null); labels[value] = label; switch(value) { case VISIBLE : case HIDDEN : { // ignore break; } default : { String key = Line.DIRECTIVE_PREFIX + label.toLowerCase(Locale.ENGLISH); directives.put(key, new Integer(value)); break; } } } catch (IllegalArgumentException ex) { // ex.printStackTrace(); } catch (IllegalAccessException ex) { // ex.printStackTrace(); } } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/PreprocessorAntTask.java0000644000175000017500000001712212007547372027272 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; import java.io.File; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.taskdefs.MatchingTask; /* $Id: PreprocessorAntTask.java 751 2009-01-11 21:49:27Z unsaved $ */ /** * Provides a facility for invoking the Preprocessor from ANT.

              * * Example ANT target:

              * *

               * 
               *
               *     
               *
               *     
               *     
               *
               * 
               * 
              * * Task attributes : * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
              namedescription
              srcdir (required)string - directory under which input files are located
              targetdir (required)string - directory under which output files are to be written
              altext (optional)string - alternate extension to use for output file names.
              * If needed, leading dot should be provided
              backup (optional - default: false)boolean - whether to back up pre-existing target files.
              * When true, pre-existing target files are preserved by renaming with * postfix "~"
              encoding (optional)string - the encoding with which to read and write file content.
              * If specified, must be a valid Java encoding identifier, such as "UTF8".
              * When unspecified, the default Java platformn encoding is used.
              filter (optional - default: false)boolean - whether to exclude directive lines from output.
              indent (optional - default: false)boolean - whether to indent directive lines in output.
              symbols (optional)string - CSV list of preprocessor symbols to predefine.
              * When specified, each list element must be of the form:
              * IDENT (ASSIGN? (STRING | NUMBER | IDENT) )?
              * Not that forward assignments are illegal.
              * See {@link Preprocessor Preprocessor} for details
              testonly (optional - default: false)boolean - whether to omit writing output files.
              verbose (optional - default: false)boolean - whether to log detailed information.
              * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ public class PreprocessorAntTask extends MatchingTask { private String ifExpr; private String unlessExpr; private File sourceDir; private File targetDir; private String defines; private String altExt; private String encoding; private int options = Option.INDENT; public void init() { super.init(); } public void setSrcdir(final File value) { sourceDir = value; } public void setTargetdir(final File value) { targetDir = value; } public void setSymbols(final String value) { defines = value; } public void setVerbose(final boolean verbose) { options = Option.setVerbose(options, verbose); } public void setBackup(final boolean backup) { options = Option.setBackup(options, backup); } public void setIndent(final boolean indent) { options = Option.setIndent(options, indent); } public void setTestonly(final boolean testOnly) { options = Option.setTestOnly(options, testOnly); } public void setFilter(final boolean filter) { options = Option.setFilter(options, filter); } public void setAltext(final String ext) { this.altExt = ext; } public void setEncoding(final String encoding) { this.encoding = encoding; } public void setIf(final String expr) { this.ifExpr = expr; } public void setUnless(final String expr) { this.unlessExpr = expr; } public boolean isActive() { return (this.ifExpr == null || getProject().getProperty(this.ifExpr) != null || this.unlessExpr == null || getProject().getProperty(this.unlessExpr) == null); } public void execute() throws BuildException { if (!isActive()) { return; } checkTargetDir(); this.sourceDir = getProject().resolveFile("" + this.sourceDir); IResolver resolver = new AntResolver(getProject()); String[] files = getFiles(); log("Preprocessing " + files.length + " file(s)"); try { Preprocessor.preprocessBatch(this.sourceDir, this.targetDir, files, this.altExt, this.encoding, this.options, this.defines, resolver); } catch (Exception ex) { ex.printStackTrace(); throw new BuildException("Preprocessing failed: " + ex, ex); } } private String[] getFiles() { return getDirectoryScanner(sourceDir).getIncludedFiles(); } private void checkTargetDir() throws BuildException { if (targetDir == null) { throw new BuildException("Target directory required."); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/Tokenizer.java0000644000175000017500000001554512007547372025277 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; /* $Id: Tokenizer.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Simple preprocessor directive tokenizer. * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ final class Tokenizer { private final String command; private final int commandLength; private int tokenType; private int startIndex; private int currentIndex; Tokenizer(final String cmd) { this.command = cmd + " "; this.commandLength = command.length(); this.startIndex = 0; this.currentIndex = 0; this.tokenType = Token.UNKNOWN; } void skipBlanks() { final String cmd = this.command; final int len = this.commandLength; top: while (currentIndex < len) { switch(cmd.charAt(currentIndex)) { case ' ' : case '\t' : { currentIndex++; continue top; } } break; } } int next() throws PreprocessorException { skipBlanks(); startIndex = currentIndex; final String cmd = this.command; final int len = this.commandLength; if (currentIndex >= len) { tokenType = Token.EOI; return tokenType; } char ch = cmd.charAt(currentIndex); if (Character.isJavaIdentifierStart(ch)) { tokenType = Token.IDENT; currentIndex++; while (currentIndex < len && Character.isJavaIdentifierPart(cmd.charAt(currentIndex))) { currentIndex++; } return tokenType; } else if (Character.isDigit(ch)) { tokenType = Token.NUMBER; currentIndex++; while(currentIndex < len && Character.isDigit(cmd.charAt(currentIndex))) { currentIndex++; } if (currentIndex < len && cmd.charAt(currentIndex) == '.') { currentIndex++; } while(currentIndex < len && Character.isDigit(cmd.charAt(currentIndex))) { currentIndex++; } return tokenType; } else if (ch == '"') { tokenType = Token.STRING; currentIndex++; int pos = cmd.indexOf('"', currentIndex); if (pos == -1) { throw new PreprocessorException("Unclosed string literal: " + cmd.substring(startIndex)); //NOI18N } currentIndex = pos + 1; return tokenType; } switch(ch) { case Token.LPAREN : case Token.RPAREN : case Token.XOR : case Token.NOT : { currentIndex++; return (tokenType = ch); } case Token.ASSIGN : { currentIndex++; if(currentIndex < len && cmd.charAt(currentIndex) == Token.ASSIGN) { currentIndex++; tokenType = Token.EQ; } else { tokenType = Token.ASSIGN; } return tokenType; } case Token.LT : { currentIndex++; if (currentIndex < len && cmd.charAt(currentIndex) == Token.ASSIGN) { currentIndex++; tokenType = Token.LTE; } else { tokenType = Token.LT; } return tokenType; } case Token.GT : { currentIndex++; if (currentIndex < len && cmd.charAt(currentIndex) == Token.ASSIGN) { currentIndex++; tokenType = Token.GTE; } else { tokenType = Token.GT; } return tokenType; } case Token.AND : case Token.OR : { currentIndex++; if (currentIndex < len && cmd.charAt(currentIndex) == ch) { currentIndex++; } return (tokenType = ch); } default : { throw new PreprocessorException("Syntax error: " + cmd.substring(currentIndex)); //NOI18N } } } int getTokenType() { return tokenType; } boolean isToken(final int type) { return (this.tokenType == type); } String getIdent() { return isToken(Token.EOI) ? null : this.command.substring(startIndex, currentIndex); } Number getNumber() { return (isToken(Token.EOI)) ? null : new Double(Double.parseDouble(this.command. substring(startIndex, currentIndex))); } String getString() { return isToken(Token.EOI) ? null : this.command.substring(startIndex + 1, currentIndex - 1); } int getStartIndex() { return this.startIndex; } int currentIndex() { return this.currentIndex; } String getSource() { return this.command; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/Preprocessor.java0000644000175000017500000006014712007547372026011 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Stack; /* $Id: Preprocessor.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Simple text document preprocessor.

              * * Aims specifically at transforming the HSQLDB codebase to one of a small * number of specific build targets, while keeping complexity and external * dependencies to a minimum, yet providing an environment that is * sufficiently powerful to solve most easily imaginable preprocessing * scenarios. * * Supports the following (case-sensitive) directives:

              * *

                *
              • //#def[ine] IDENT (ASSIGN? (STRING | NUMBER | IDENT) )? *
              • //#elif BOOLEXPR *
              • //#elifdef IDENT *
              • //#elifndef IDENT *
              • //#else *
              • //#endif *
              • //#endinclude *
              • //#if BOOLEXPR *
              • //#ifdef IDENT *
              • //#ifndef IDENT *
              • //#include FILEPATH *
              • //#undef[ine] IDENT *
              * * where BOOLEXPR is: * *
               * ( IDENT
               * | IDENT ( EQ |  LT | LTE | GT | GTE ) VALUE
               * | BOOLEXPR { OR | XOR | AND } BOOLEXPR
               * | NOT BOOLEXPR
               * | LPAREN BOOLEXPR RPAREN )
               *
              * * and VALUE is : * *
               * ( STRING
               * | NUMBER
               * | IDENT )
               * 
              * * and lexographic elements are : * *
               * ASSIGN     : '='
               * EQ         : '=='
               * LT         : '<'
               * LTE        : '<='
               * GT         : '>'
               * GTE        : '>='
               * OR         : ('|' | '||')
               * XOR        : '^'
               * AND        : ('&' | '&&')
               * NOT        : '!'
               * DQUOTE     : '"'
               * LPAREN     : '('
               * RPAREN     : ')'
               * DOT        : '.'
               * DIGIT      : ['0'..'9']
               * EOL        : ('\n' | '\r' | '\n\r')
               * SPACE      : (' ' | '\t')
               * NON_DQUOTE : { ANY_UNICODE_CHARACTER_EXCEPT_DQUOTE_OR_EOL } -- see the unicode spec
               * NON_SPACE  : { ANY_UNICODE_CHARACTER_EXCEPT_SPACE_OR_EOL }  -- see the unicode spec
               * WS         : { JAVA_WS } -- see java.lang.Character
               * NON_WS     : { ANY_UNICODE_CHARACTER_EXCEPT_WS_OR_EOL }
               * STRING     : DQUOTE NON_DQUOTE* DQUOTE
               * NUMBER     : DIGIT+ (DOT DIGIT*)?
               * IDENT      : JAVA_IDENT_START JAVA_IDENT_PART*              -- see java.lang.Character
               * FILEPATH   : NON_SPACE (ANY_UNICODE_CHARACTER* NON_WS)?     -- i.e. trailing SPACE elements are ignored
               * 
              * * The lexographic definitions above use the BNF conventions : * *
               * '?' -> zero or one
               * '*' -> zero or more
               * '+' -> one or more
               * 
              * * Directives may be arbitrarily indented; there is an option (INDENT) to set * or unset directive indentation on output. There is also an option (FILTER) * to remove directive lines from output. See {@link Option Option} for other * preprocessor options.

              * * '//#ifxxx' directives may be nested to arbitrary depth, * may be chained with an arbitrary number of '//#elifxxx' directives, * may be optionally followed by a single '//#else' directive, and * must be terminated by a single '//#endif' directive.

              * * Each '//#include' directive must be terminated by an '//#endinclude' * directive; lines between '//#include' and '//#endinclude' are replaced * by the content retrieved from the specified FILEPATH.

              * * Included files are preprocessed in a nested scope that inherits the * defined symbols of the including scope. Directive lines in included files * are always excluded from output.

              * * Design Notes

              * * There are many better/more sophisticated preprocessors/templating * engines out there. FreeMaker and Velocity come to mind immediately. * Another--the NetBeans MIDP preprocessor--was the direct inspiration for * this class.

              * * Other options were rejected because the work of creating this class appeared * to be less than dealing with the complexity and dependency issues of hooking * up to external libraries. * * The NetBeans preprocessor, in particular, was rejected because it was * not immediately evident how to invoke it independently from the IDE, * how to make it available to non-MIDP projects from within the IDE or how to * isolate the correct OpenIDE jars to allow stand-alone operation.

              * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ public class Preprocessor { // ========================================================================= // ------------------------------- Public API ------------------------------ // ========================================================================= /** * Preprocesses the specified list of files.

              * * @param sourceDir under which input files are located * @param targetDir under which output files are to be written * @param fileNames to be preprocessed * @param altExt to use for output file names * @param encoding with which to write output files * @param options used to control preprocessing * @param defines CSV list of symbol definition expressions * @param resolver with which to perform property and path expansions * @throws PreprocessorException if an error occurs while loading, * preprocessing or saving the result of preprocessing one of the * specified input files */ public static void preprocessBatch(File sourceDir, File targetDir, String[] fileNames, String altExt, String encoding, int options, String defines, IResolver resolver) throws PreprocessorException { for (int i = 0; i < fileNames.length; i++) { String fileName = fileNames[i]; try { preprocessFile(sourceDir, targetDir, fileName, altExt, encoding, options, defines, resolver); } catch (PreprocessorException ppe) { if (!Option.isVerbose(options)) { log(fileName + " ... not modified, " + ppe.getMessage()); } throw ppe; } } } /** * Preprocesses a single file.

              * * @param sourceDir under which the input file is located * @param targetDir under which the output file is to be written * @param fileName to be preprocessed * @param altExt to use for output file name * @param encoding with which to write output file * @param options used to control preprocessing * @param defines CSV list of symbol definition expressions * @param resolver with which to perform property and path expansions * @throws PreprocessorException if an error occurs while loading, * preprocessing or saving the result of preprocessing the * specified input file */ public static void preprocessFile(File sourceDir, File targetDir, String fileName, String altExt, String encoding, int options, String defines, IResolver resolver) throws PreprocessorException { String sourcePath = translatePath(sourceDir, fileName, null); String targetPath = translatePath(targetDir, fileName, altExt); File targetFile = new File(targetPath); File backupFile = new File(targetPath + "~"); boolean sameDir = sourceDir.equals(targetDir); boolean sameExt = (altExt == null); boolean verbose = Option.isVerbose(options); boolean testOnly = Option.isTestOnly(options); boolean backup = Option.isBackup(options); Preprocessor preprocessor = new Preprocessor(sourcePath, encoding, options, resolver, defines); if (verbose) { log("Reading \"" + sourcePath + "\""); } preprocessor.loadDocument(); boolean modified = preprocessor.preprocess(); boolean rewrite = modified || !sameDir || !sameExt; if (!rewrite) { if (verbose) { log(fileName + " ... not modified"); } return; } else if (verbose) { log(fileName + " ... modified"); } if (testOnly) { return; } try { targetFile.getParentFile().mkdirs(); } catch (Exception e) { throw new PreprocessorException("mkdirs failed \"" + targetFile + "\": " + e); // NOI18N } backupFile.delete(); if (targetFile.exists() && !targetFile.renameTo(backupFile)) { throw new PreprocessorException("Rename failed: \"" + targetFile + "\" => \"" + backupFile +"\"" ); // NOI18N } if (verbose) { log("Writing \"" + targetPath + "\""); } preprocessor.saveDocument(targetPath); if (!backup) { backupFile.delete(); } } // ========================================================================= // ----------------------------- Implementation ---------------------------- // ========================================================================= // Fields // static static final int CONDITION_NONE = 0; static final int CONDITION_ARMED = 1; static final int CONDITION_IN_TRUE = 2; static final int CONDITION_TRIGGERED = 3; // optimization - zero new object burn rate for statePush() static final Integer[] STATES = new Integer[] { new Integer(CONDITION_NONE), new Integer(CONDITION_ARMED), new Integer(CONDITION_IN_TRUE), new Integer(CONDITION_TRIGGERED) }; // instance private String documentPath; private String encoding; private int options; private IResolver resolver; private Document document; private Defines defines; private Stack stack; private int state; // Constructors private Preprocessor(String documentPath, String encoding, int options, IResolver resolver, String predefined) throws PreprocessorException { if (resolver == null) { File parentDir = new File(documentPath).getParentFile(); this.resolver = new BasicResolver(parentDir); } else { this.resolver = resolver; } if (predefined == null || predefined.trim().length() == 0) { this.defines = new Defines(); } else { predefined = this.resolver.resolveProperties(predefined); this.defines = new Defines(predefined); } this.documentPath = documentPath; this.encoding = encoding; this.options = options; this.document = new Document(); this.stack = new Stack(); this.state = CONDITION_NONE; } private Preprocessor(Preprocessor other, Document include) { this.document = include; this.encoding = other.encoding; this.stack = new Stack(); this.state = CONDITION_NONE; this.options = other.options; this.documentPath = other.documentPath; this.resolver = other.resolver; this.defines = other.defines; } // Main entry point private boolean preprocess() throws PreprocessorException { this.stack.clear(); this.state = CONDITION_NONE; // optimization - eliminates a full document copy and a full document // equality test for files with no preprocessor // directives if (!this.document.contains(Line.DIRECTIVE_PREFIX)) { return false; } Document originalDocument = new Document(this.document); preprocessImpl(); if (this.state != CONDITION_NONE) { throw new PreprocessorException("Missing final #endif"); // NOI18N } if (Option.isFilter(options)) { // Cleanup all directives. for (int i = this.document.size() - 1; i >= 0; i--) { Line line = resolveLine(this.document.getSourceLine(i)); if (!line.isType(LineType.VISIBLE)) { this.document.deleteSourceLine(i); } } } return (!this.document.equals(originalDocument)); } private void preprocessImpl() throws PreprocessorException { int includeCount = 0; int lineCount = 0; while (lineCount < this.document.size()) { try { Line line = resolveLine(this.document.getSourceLine(lineCount)); switch(line.getType()) { case LineType.INCLUDE : { lineCount = processInclude(lineCount, line); break; } case LineType.VISIBLE : case LineType.HIDDEN : { this.document.setSourceLine(lineCount, toSourceLine(line)); if (Option.isVerbose(options)) { log((isHidingLines() ? "Commented: " : "Uncommented: ") + line); } lineCount++; break; } default : { processDirective(line); lineCount++; } } } catch (PreprocessorException ex) { throw new PreprocessorException(ex.getMessage() + " at line " + (lineCount + 1) + " in \"" + this.documentPath + "\""); // NOI18N } } } // -------------------------- Line-level Handlers -------------------------- private void processIf(boolean condition) { statePush(); this.state = isHidingLines() ? CONDITION_TRIGGERED : (condition) ? CONDITION_IN_TRUE : CONDITION_ARMED; } private void processElseIf(boolean condition) throws PreprocessorException { switch(state) { case CONDITION_NONE : { throw new PreprocessorException("Unexpected #elif"); // NOI18N } case CONDITION_ARMED : { if (condition) { this.state = CONDITION_IN_TRUE; } break; } case CONDITION_IN_TRUE : { this.state = CONDITION_TRIGGERED; break; } } } private void processElse() throws PreprocessorException { switch(state) { case CONDITION_NONE : { throw new PreprocessorException("Unexpected #else"); // NOI18N } case CONDITION_ARMED : { this.state = CONDITION_IN_TRUE; break; } case CONDITION_IN_TRUE : { this.state = CONDITION_TRIGGERED; break; } } } private void processEndIf() throws PreprocessorException { if (state == CONDITION_NONE) { throw new PreprocessorException("Unexpected #endif"); // NOI18N } else { statePop(); } } private void processDirective(Line line) throws PreprocessorException { switch(line.getType()) { case LineType.DEFINE : { if (!isHidingLines()) { this.defines.defineSingle(line.getArguments()); } break; } case LineType.UNDEFINE : { if (!isHidingLines()) { this.defines.undefine(line.getArguments()); } break; } case LineType.IF : { processIf(this.defines.evaluate(line.getArguments())); break; } case LineType.IFDEF : { processIf(this.defines.isDefined(line.getArguments())); break; } case LineType.IFNDEF : { processIf(!this.defines.isDefined(line.getArguments())); break; } case LineType.ELIF : { processElseIf(this.defines.evaluate(line.getArguments())); break; } case LineType.ELIFDEF : { processElseIf(this.defines.isDefined(line.getArguments())); break; } case LineType.ELIFNDEF : { processElseIf(!this.defines.isDefined(line.getArguments())); break; } case LineType.ELSE : { processElse(); break; } case LineType.ENDIF : { processEndIf(); break; } default : { throw new PreprocessorException("Unhandled line type: " + line); // NOI18N } } } private int processInclude(int lineCount, Line line) throws PreprocessorException { String path = resolvePath(line.getArguments()); boolean hidden = isHidingLines(); lineCount++; while (lineCount < this.document.size()) { line = resolveLine(this.document.getSourceLine(lineCount)); if (line.isType(LineType.ENDINCLUDE)) { break; } this.document.deleteSourceLine(lineCount); } if (!line.isType(LineType.ENDINCLUDE)) { throw new PreprocessorException("Missing #endinclude"); // NOI18N } if (!hidden) { Document include = loadInclude(path); Preprocessor preprocessor = new Preprocessor(this, include); preprocessor.preprocess(); int count = include.size(); for (int i = 0; i < count; i++) { String sourceLine = include.getSourceLine(i); if (resolveLine(sourceLine).isType(LineType.VISIBLE)) { this.document.insertSourceLine(lineCount++, sourceLine); } } } lineCount++; return lineCount; } // -------------------------- Preprocessor State --------------------------- private boolean isHidingLines() { switch(state) { case CONDITION_ARMED : case CONDITION_TRIGGERED: { return true; } default : { return false; } } } private void statePush() { this.stack.push(STATES[this.state]); } private void statePop() { this.state = ((Integer) stack.pop()).intValue(); } // ------------------------------ Resolution ------------------------------- private Line resolveLine(String line) throws PreprocessorException { return new Line(this.resolver.resolveProperties(line)); } private String resolvePath(String path) { if (path == null) { throw new IllegalArgumentException("path: null"); } String value = this.resolver.resolveProperties(path); File file = this.resolver.resolveFile(value); try { return file.getCanonicalPath(); } catch (IOException ex) { return file.getAbsolutePath(); } } // ------------------------------ Conversion ------------------------------- private String toSourceLine(Line line) { return (isHidingLines()) ? Option.isIndent(this.options) ? line.indent + Line.HIDE_DIRECTIVE + line.text : Line.HIDE_DIRECTIVE + line.indent + line.text : line.indent + line.text; } private File toCanonicalOrAbsoluteFile(String path) { File file = new File(path); if (!file.isAbsolute()) { path = (new File(this.documentPath)).getParent() + File.separatorChar + path; file = new File(path); } try { return file.getCanonicalFile(); } catch (Exception e) { return file.getAbsoluteFile(); } } // ------------------------------ Translation ------------------------------ private static String translatePath(File dir, String fileName, String ext) { return new StringBuffer(dir.getPath()).append(File.separatorChar). append(translateFileExtension(fileName,ext)).toString(); } private static String translateFileExtension(String fileName, String ext) { if (ext != null) { int pos = fileName.lastIndexOf('.'); fileName = (pos < 0) ? fileName + ext : fileName.substring(0, pos) + ext; } return fileName; } // ---------------------------------- I/O ---------------------------------- private Document loadInclude(String path) throws PreprocessorException { Document include = new Document(); File file = toCanonicalOrAbsoluteFile(path); try { return include.load(file, this.encoding); } catch (UnsupportedEncodingException uee) { throw new PreprocessorException("Unsupported encoding \"" + this.encoding + "\" loading include \"" + file + "\""); // NOI18N } catch (IOException ioe) { throw new PreprocessorException("Unable to load include \"" + file + "\": " + ioe); // NOI18N } } private void loadDocument() throws PreprocessorException { try { this.document.load(this.documentPath, this.encoding); } catch (UnsupportedEncodingException uee) { throw new PreprocessorException("Unsupported encoding \"" + this.encoding + "\" reading file \"" + this.documentPath + "\""); // NOI18N } catch (IOException ioe) { throw new PreprocessorException("Unable to read file \"" + this.documentPath + "\": " + ioe); // NOI18N } } private void saveDocument(Object target) throws PreprocessorException { try { if (this.document.size() > 0) { this.document.save(target, this.encoding); } } catch (UnsupportedEncodingException uee) { throw new PreprocessorException("Unsupported encoding \"" + this.encoding + "\" writing \"" + target + "\""); // NOI18N } catch (IOException ioe) { throw new PreprocessorException("Unable to write to \"" + target + "\": " + ioe); // NOI18N } } private static void log(Object toLog) { System.out.println(toLog); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/Document.java0000644000175000017500000002130712007547372025074 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.util.Vector; /* $Id: Document.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Simple line-oriented text document ADT. * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ class Document { Vector lines = new Vector(); Document() {} Document(Document source) { this.appendDocument(source); } Document addSouceLine(String line) { if (line == null) { throw new IllegalArgumentException("line: null"); } this.lines.addElement(line); return this; } Document appendDocument(Document doc) { if (doc != null) { int count = doc.size(); Vector src = doc.lines; Vector dst = this.lines; for (int i = 0; i < count; i++) { dst.addElement(src.elementAt(i)); } } return this; } Document clear() { this.lines.removeAllElements(); return this; } boolean contains(String pattern) { Vector lines = this.lines; int size = lines.size(); for (int i = 0; i < size; i++) { if (((String)lines.elementAt(i)).indexOf(pattern) >= 0) { return true; } } return false; } Document deleteSourceLine(int index) { this.lines.removeElementAt(index); return this; } public boolean equals(Object o) { if (this == o) { return true; } else if (o instanceof Document) { Document other = (Document) o; Vector v1 = this.lines; Vector v2 = other.lines; if (v1.size() != v2.size()) { return false; } for (int i = v1.size() - 1; i >= 0; i--) { if (v1.elementAt(i).equals(v2.elementAt(i))) { continue; } else { return false; } } return true; } else { return false; } } String getSourceLine(int index) { return (String) this.lines.elementAt(index); } Document insertSourceLine(int index, String line) { if (line == null) { throw new IllegalArgumentException("line: null"); } this.lines.insertElementAt(line, index); return this; } Document replaceWith(Document source) { return this.clear().appendDocument(source); } Document setSourceLine(int index, String line) { if (line == null) { throw new IllegalArgumentException("null"); } this.lines.setElementAt(line, index); return this; } int size() { return this.lines.size(); } // ------------------------ I/O convenience methods ---------------------------- Document load(Object source, String encoding) throws IOException, UnsupportedEncodingException{ BufferedReader reader = null; boolean close = false; if (source instanceof InputStream) { InputStream is = (InputStream) source; InputStreamReader isr = isEncoding(encoding) ? new InputStreamReader(is, encoding) : new InputStreamReader(is); reader = new BufferedReader(isr); } else if (source instanceof File) { InputStream is = new FileInputStream((File) source); InputStreamReader isr = isEncoding(encoding) ? new InputStreamReader(is, encoding) : new InputStreamReader(is); close = true; reader = new BufferedReader(isr); } else if (source instanceof String) { InputStream is = new FileInputStream((String) source); InputStreamReader isr = isEncoding(encoding) ? new InputStreamReader(is, encoding) : new InputStreamReader(is); close = true; reader = new BufferedReader(isr); } else if (source instanceof BufferedReader) { reader = (BufferedReader) source; } else if (source instanceof Reader) { reader = new BufferedReader((Reader) source); } else { throw new IOException("unhandled load source: " + source); // NOI18N } clear(); String line; Vector lines = this.lines; try { while(null != (line = reader.readLine())) { lines.addElement(line); } } finally { if (close) { try { reader.close(); } catch (IOException ex) {} } } return this; } Document save(Object target, String encoding) throws IOException { BufferedWriter writer = null; boolean close = false; if (target instanceof OutputStream) { OutputStream os = (OutputStream) target; OutputStreamWriter osr = isEncoding(encoding) ? new OutputStreamWriter(os, encoding) : new OutputStreamWriter(os); writer = new BufferedWriter(osr); } else if (target instanceof File) { OutputStream os = new FileOutputStream((File) target); OutputStreamWriter osr = isEncoding(encoding) ? new OutputStreamWriter(os, encoding) : new OutputStreamWriter(os); close = true; writer = new BufferedWriter(osr); } else if (target instanceof String) { OutputStream os = new FileOutputStream((String) target); OutputStreamWriter osr = isEncoding(encoding) ? new OutputStreamWriter(os, encoding) : new OutputStreamWriter(os); close = true; writer = new BufferedWriter(osr); } else if (target instanceof BufferedWriter) { writer = (BufferedWriter) target; } else if (target instanceof Writer) { writer = new BufferedWriter(writer); } else { throw new IOException("unhandled save target: " + target); // NOI18N } Vector lines = this.lines; int count = lines.size(); try { for (int i = 0; i < count; i++) { writer.write((String)lines.elementAt(i)); writer.newLine(); } writer.flush(); } finally { if (close) { try { writer.close(); } catch (IOException ex) {} } } return this; } static boolean isEncoding(String enc) { return enc != null && enc.trim().length() > 0; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/Defines.java0000644000175000017500000001425412007547372024676 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; import java.util.Hashtable; /* $Id: Defines.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Simple preprocessor symbol table. * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ class Defines { private Hashtable symbols = new Hashtable(); public Defines() {} public Defines(String csvExpressions) throws PreprocessorException { defineCSV(csvExpressions); } public void clear() { this.symbols.clear(); } public void defineCSV(String csvExpressions) throws PreprocessorException { if (csvExpressions != null) { csvExpressions = csvExpressions + ','; int start = 0; int len = csvExpressions.length(); while (start < len) { int end = csvExpressions.indexOf(',', start); String expr = csvExpressions.substring(start, end).trim(); if (expr.length() > 0) { defineSingle(expr); } start = end + 1; } } } public void defineSingle(String expression) throws PreprocessorException { Tokenizer tokenizer = new Tokenizer(expression); tokenizer.next(); if (!tokenizer.isToken(Token.IDENT)) { throw new PreprocessorException("IDENT token required at position: " + tokenizer.getStartIndex() + " in [" + expression + "]"); // NOI18N } String ident = tokenizer.getIdent(); int tokenType = tokenizer.next(); switch(tokenType) { case Token.EOI : { this.symbols.put(ident, ident); return; } case Token.ASSIGN : { tokenType = tokenizer.next(); break; } default : { break; } } switch(tokenType) { case Token.NUMBER : { Number number = tokenizer.getNumber(); this.symbols.put(ident, number); break; } case Token.STRING : { String string = tokenizer.getString(); this.symbols.put(ident, string); break; } case Token.IDENT : { String rhsIdent = tokenizer.getIdent(); if (!isDefined(rhsIdent)) { throw new PreprocessorException("Right hand side" + "IDENT token [" + rhsIdent + "] at position: " + tokenizer.getStartIndex() + " is undefined in [" + expression + "]"); // NOI18N } Object value = this.symbols.get(rhsIdent); symbols.put(ident, value); break; } default : { throw new PreprocessorException("Right hand side NUMBER," + "STRING or IDENT token required at position: " + + tokenizer.getStartIndex() + " in [" + expression + "]"); // NOI18N } } tokenizer.next(); if (!tokenizer.isToken(Token.EOI)) { throw new PreprocessorException("Illegal trailing " + "characters at position: " + tokenizer.getStartIndex() + " in [" + expression + "]"); // NOI18N } return; } public void undefine(String symbol) { this.symbols.remove(symbol); } public boolean isDefined(String symbol) { return this.symbols.containsKey(symbol); } public Object getDefintion(String symbol) { return this.symbols.get(symbol); } public boolean evaluate(String expression) throws PreprocessorException { Tokenizer tokenizer = new Tokenizer(expression); tokenizer.next(); Parser parser = new Parser(this, tokenizer); boolean result = parser.parseExpression(); if (!tokenizer.isToken(Token.EOI)) { throw new PreprocessorException("Illegal trailing " + "characters at position: " + tokenizer.getStartIndex() + " in [" + expression + "]"); // NOI18N } return result; } public String toString() { return super.toString() + this.symbols.toString(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/IResolver.java0000644000175000017500000000431312007547372025226 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; import java.io.File; /* $Id: IResolver.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Property and file path resolution contract.

              * * Implementations are free to ignore expansion directives and simply * pass through expressions and paths unchanged.

              * * If an implementation does process expansion directives, recognized forms * should at least include the ubiquitous ${...} shell expansion form. * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ public interface IResolver { public String resolveProperties(String expression); public File resolveFile(String path); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/Line.java0000644000175000017500000001232212007547372024202 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; /* $Id: Line.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Preprocessor's view of a line in a text document. * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ class Line { static final String DIRECTIVE_PREFIX = "//#"; static final String SPACE_CHARS = " \t"; static final int DIRECTIVE_PREFIX_LENGTH = DIRECTIVE_PREFIX.length(); static final int DIRECTIVE_PREFIX_LENGTH_PLUS_ONE = DIRECTIVE_PREFIX_LENGTH + 1; static final String HIDE_DIRECTIVE = DIRECTIVE_PREFIX + ' '; int type; String sourceText; String indent; String text; String arguments; static int indexOfNonTabOrSpace(String line) { int pos = 0; int len = line.length(); while (pos < len) { char ch = line.charAt(pos); if ((ch == ' ') || (ch == '\t')) { pos++; continue; } break; } return pos; } static int indexOfTabOrSpace(String s, int fromIndex) { int spos = s.indexOf(' ', fromIndex); int tpos = s.indexOf('\t', fromIndex); return (((tpos != -1) && (tpos < spos)) || (spos == -1)) ? tpos : spos; } Line(String line) throws PreprocessorException { setSourceText(line); } void setSourceText(String line) throws PreprocessorException { this.sourceText = line; int pos = indexOfNonTabOrSpace(line); this.indent = line.substring(0, pos); line = line.substring(pos); if (!line.startsWith(DIRECTIVE_PREFIX)) { this.text = line; this.arguments = null; this.type = LineType.VISIBLE; } else if (line.length() == DIRECTIVE_PREFIX_LENGTH){ this.text = ""; this.arguments = null; this.type = LineType.HIDDEN; } else if (SPACE_CHARS.indexOf(line. charAt(DIRECTIVE_PREFIX_LENGTH)) != -1) { this.text = line.substring(DIRECTIVE_PREFIX_LENGTH_PLUS_ONE); this.arguments = null; this.type = LineType.HIDDEN; } else { pos = indexOfTabOrSpace(line, DIRECTIVE_PREFIX_LENGTH_PLUS_ONE); if (pos == -1) { this.text = line; this.arguments = null; } else { this.text = line.substring(0, pos); this.arguments = line.substring(pos + 1).trim(); } Integer oType = (Integer) LineType.directives().get(text); if (oType == null) { throw new PreprocessorException("Unknown directive [" + text + "] in [" + line + "]"); // NOI18N } this.type = oType.intValue(); } } String getArguments() throws PreprocessorException { if (arguments == null || arguments.length() == 0) { throw new PreprocessorException("["+ text + "]: has no argument(s)"); // NOI18N } return arguments; } String getSourceText() { return sourceText; } String getIndent() { return indent; } String getText() { return text; } int getType() { return type; } boolean isType(int lineType) { return (this.type == lineType); } public String toString() { return LineType.labels()[this.type] + "(" + this.type + "): indent [" + this.indent + "] text [" + this.text + ((this.arguments == null) ? "]" : ("] args [" + this.arguments + "]")) ; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/preprocessor/Parser.java0000644000175000017500000002146112007547372024553 0ustar renerene/* Copyright (c) 2001-2007, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util.preprocessor; /* $Id: Parser.java 610 2008-12-22 15:54:18Z unsaved $ */ /** * Simple preprocessor directive parser.

              * * @author boucherb@users * @version 1.8.1 * @since 1.8.1 */ class Parser { Defines defines; Tokenizer tokenizer; Parser(Defines defines, Tokenizer tokenizer) { this.defines = defines; this.tokenizer = tokenizer; } boolean parseExpression() throws PreprocessorException { boolean result = parseTerm(); while (true) { switch(this.tokenizer.getTokenType()) { case Token.OR : { this.tokenizer.next(); result = result | parseTerm(); break; } case Token.XOR : { this.tokenizer.next(); result = result ^ parseTerm(); break; } default : { return result; } } } } boolean parseTerm() throws PreprocessorException { boolean result = parseFactor(); while (this.tokenizer.isToken(Token.AND)) { this.tokenizer.next(); result = result & parseFactor(); } return result; } boolean parseFactor() throws PreprocessorException { boolean result; switch(this.tokenizer.getTokenType()) { case Token.IDENT : { String ident = this.tokenizer.getIdent(); int type = this.tokenizer.next(); if ((type == Token.EOI) || (type == Token.RPAREN) || Token.isLogicalOperator(type)) { result = this.defines.isDefined(ident); } else if (Token.isComparisonOperator(type)) { result = parseComparison(ident, type); } else { throw new PreprocessorException("Logical or comparison " + "operator token required at position " + this.tokenizer.getStartIndex() + " in [" + this.tokenizer.getSource() + "]"); // NOI18N } break; } case Token.NOT :{ this.tokenizer.next(); result = !parseFactor(); break; } case Token.LPAREN : { this.tokenizer.next(); result = parseExpression(); if (!this.tokenizer.isToken(Token.RPAREN)) { throw new PreprocessorException("RPAREN token required at " + "position " + this.tokenizer.getStartIndex() + " in [" + this.tokenizer.getSource() + "]"); // NOI18N } this.tokenizer.next(); break; } default : { throw new PreprocessorException("IDENT, NOT or LPAREN " + "token required at position " + this.tokenizer.getStartIndex() + " in [" + this.tokenizer.getSource() + "]"); // NOI18N } } return result; } boolean parseComparison(String ident, int opType) throws PreprocessorException { // checkIsComparisonOperator(opType); boolean result; Object lhs = this.defines.getDefintion(ident); int pos = this.tokenizer.getStartIndex(); Object rhs = parseValue(); if (lhs == null) { throw new PreprocessorException("IDENT " + ident + " is not defined at position" + pos + "in [" + this.tokenizer.getSource() + "]"); // NOI18N } switch(opType) { case Token.EQ :{ result = (compare(lhs, rhs) == 0); break; } case Token.LT : { result = (compare(lhs, rhs) < 0); break; } case Token.LTE : { result = (compare(lhs, rhs) <= 0); break; } case Token.GT : { result = (compare(lhs, rhs) > 0); break; } case Token.GTE : { result = (compare(lhs, rhs) >= 0); break; } default : { // Stupid compiler trick. // Can't actually happen because this case will cause an // exception to be thrown in method parseFactor (or in // method checkIsComparisonOperator when uncommented) throw new PreprocessorException("Internal error"); // NOI18N } } this.tokenizer.next(); return result; } // void checkIsComparisonOperator(int opType) throws PreprocessorException { // if (!Token.isComparisonOperator(opType)) { // throw new PreprocessorException("Comparison " // + "operator token required at position " // + tokenizer.getBeginIndex() // + " in [" // + tokenizer.getSource() // + "]"); // NOI18N // } // } static int compare(Object o1, Object o2) { // nulls are basically 'illegal' so yes: // we want to throw NPE here if o1 or o2 is null if (o1 instanceof Comparable) { return (o1.getClass().isAssignableFrom(o2.getClass())) ? ((Comparable)o1).compareTo(o2) : String.valueOf(o1).compareTo(String.valueOf(o2)); } else { return o1.toString().compareTo(o2.toString()); } } Object parseValue() throws PreprocessorException { Object value; switch(this.tokenizer.next()) { case Token.IDENT : { String ident = this.tokenizer.getIdent(); value = this.defines.getDefintion(ident); if (value == null) { throw new PreprocessorException("IDENT " + ident + " is not defined at position" + this.tokenizer.getStartIndex() + "in [" + this.tokenizer.getSource() + "]"); // NOI18N } break; } case Token.STRING : { value = this.tokenizer.getString(); break; } case Token.NUMBER : { value = this.tokenizer.getNumber(); break; } default :{ throw new PreprocessorException("IDENT, STRING" + "or NUMBER token required at position " + this.tokenizer.getStartIndex() + " in: [" + this.tokenizer.getSource() + "]"); // NOI18N } } return value; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/RedCircle.gif0000644000175000017500000000164012007547374022250 0ustar renereneGIF89a÷OGOOVO„„„º²ºÚúúú!$úŒú²úÿÿÿ!ùÿ,@}ÿ H€À€  À‡˜`À?@±bl8±äÇ G–ôRd€‰8F<01@A†gšD˜r@ðT(Ò'P¡(Sfœ‘%JƒÈ”è!Ι«x‰•j›—65ÙRäR²I‰ÞD˜ö_@;hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/hsqldb.gif0000644000175000017500000000054112007547372021666 0ustar renereneGIF89a-/¢™ÌÌfÌÌf™Ì3f™3ff33f!ùÿ,-/ÿhºÌ50ÊIë(-+"ºÿ`(vƒÖp ®lëªainÝkß(›(]¦÷+²H¼.dÌ DàÈø= ÑÖt„{fWÛ°Mø……Å®]9w>§i)W{W•Öô9ë¢Ônmnvu~"?h„`\FSU‰RLMl†…’“#–G†“‹1ƒr˜Ÿ”:¢—€7"œf¤ ¬‘¯¦³©ª£§Šž¹T´$¨²¸¾ÆA𠫱ˊÇ¿Á¶·}ÁÕÖÊϺ͊ÞÜáSKáâרß/U.Ò¡çh…»¼ày„ïðíô÷ΉçÄé)0 º{Ì4×O büä©ÈW§`6vaöùÙ3(&¡ŠpœVJÊH’%e­°è1¥¿,}š¡Í rêÜ9¡@;hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/TransferCommon.java0000644000175000017500000001417412007547374023533 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.util; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Vector; // sqlbob@users 20020407 - patch 1.7.0 - reengineering /** * Common code in Swing and AWT versions of Tranfer * New class based on Hypersonic code * @author Thomas Mueller (Hypersonic SQL Group) * @version 1.7.2 * @since Hypersonic SQL */ class TransferCommon { static void savePrefs(String f, DataAccessPoint sourceDb, DataAccessPoint targetDb, Traceable tracer, Vector tTable) { TransferTable t; try { FileOutputStream fos = new FileOutputStream(f); ObjectOutputStream oos = new ObjectOutputStream(fos); for (int i = 0; i < tTable.size(); i++) { t = (TransferTable) tTable.elementAt(i); t.sourceDb = null; t.destDb = null; t.tracer = null; } oos.writeObject(tTable); for (int i = 0; i < tTable.size(); i++) { t = (TransferTable) tTable.elementAt(i); t.tracer = tracer; t.sourceDb = (TransferDb) sourceDb; t.destDb = targetDb; } } catch (IOException e) { System.out.println("pb in SavePrefs : " + e.toString()); e.printStackTrace(); } } static Vector loadPrefs(String f, DataAccessPoint sourceDb, DataAccessPoint targetDb, Traceable tracer) { TransferTable t; Vector tTable = null; ObjectInputStream ois = null; try { FileInputStream fis = new FileInputStream(f); ois = new ObjectInputStream(fis); tTable = (Vector) ois.readObject(); for (int i = 0; i < tTable.size(); i++) { t = (TransferTable) tTable.elementAt(i); t.tracer = tracer; t.sourceDb = (TransferDb) sourceDb; t.destDb = targetDb; } } catch (ClassNotFoundException e) { System.out.println("class not found pb in LoadPrefs : " + e.toString()); tTable = new Vector(); } catch (IOException e) { System.out.println("IO pb in LoadPrefs : actionPerformed" + e.toString()); tTable = new Vector(); } finally { if (ois != null) { try { ois.close(); } catch (IOException ioe) {} } } return (tTable); } private TransferCommon() {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/ConnectionDialogSwing.java0000644000175000017500000003245112007547374025023 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Hashtable; import java.util.Iterator; import java.util.Vector; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; // sqlbob@users 20020325 - patch 1.7.0 - enhancements // sqlbob@users 20020407 - patch 1.7.0 - reengineering // weconsultants@users 20041109 - patch 1.8.0 - enhancements: // Added CommonSwing.errorMessage() to handle error messages // for errors so eliminated the mError JLable field and Status HorizontalBox. // Changed dispose on cancel to exit. If "Dup", "Restore" or Transer" needed ust // Press Conform toprogramming standards // Added spaces to "OK" button to make same size buttons // Added ":" to all labels as in databaseManager.java // Added: Added code from DatabaseManager to store connection settings /** * Opens a connection to a database * * @author dmarshall@users * @version 1.7.2 * @since 1.7.0 */ class ConnectionDialogSwing extends JDialog implements ActionListener, ItemListener { /** * Comment for serialVersionUID */ private static final long serialVersionUID = 1L; private Connection mConnection; private JTextField mName, mDriver, mURL, mUser; private JPasswordField mPassword; private String[][] connTypes; private Hashtable settings; private JButton okCancel, clear; private JComboBox mSettingName = new JComboBox(loadRecentConnectionSettings()); private static ConnectionSetting currentConnectionSetting = null; public static void setConnectionSetting( ConnectionSetting connectionSetting) { currentConnectionSetting = connectionSetting; } public static Connection createConnection(String driver, String url, String user, String password) throws Exception { Class.forName(driver).newInstance(); return DriverManager.getConnection(url, user, password); } ConnectionDialogSwing(JFrame owner, String title) { super(owner, title, true); } private void create() { Box main = Box.createHorizontalBox(); Box labels = Box.createVerticalBox(); Box controls = Box.createVerticalBox(); Box buttons = Box.createHorizontalBox(); Box whole = Box.createVerticalBox(); // (weconsultants@users) New code Box extra = Box.createHorizontalBox(); main.add(Box.createHorizontalStrut(10)); main.add(Box.createHorizontalGlue()); main.add(labels); main.add(Box.createHorizontalStrut(10)); main.add(Box.createHorizontalGlue()); main.add(controls); main.add(Box.createHorizontalStrut(10)); main.add(Box.createVerticalGlue()); main.add(extra); main.add(Box.createVerticalGlue()); whole.add(Box.createVerticalGlue()); whole.add(Box.createVerticalStrut(10)); whole.add(main); whole.add(Box.createVerticalGlue()); whole.add(Box.createVerticalStrut(10)); whole.add(buttons); whole.add(Box.createVerticalGlue()); whole.add(Box.createVerticalStrut(10)); whole.add(Box.createVerticalGlue()); labels.add(createLabel("Recent Setting:")); labels.add(Box.createVerticalGlue()); labels.add(createLabel("Setting Name:")); labels.add(Box.createVerticalGlue()); labels.add(createLabel("Type:")); labels.add(Box.createVerticalGlue()); labels.add(createLabel("Driver:")); labels.add(Box.createVerticalGlue()); labels.add(createLabel("URL:")); labels.add(Box.createVerticalGlue()); labels.add(createLabel("User:")); labels.add(Box.createVerticalGlue()); labels.add(createLabel("Password:")); labels.add(Box.createVerticalGlue()); labels.add(Box.createVerticalStrut(10)); controls.add(Box.createVerticalGlue()); // (weconsultants@users) New code mSettingName.setActionCommand("Select Setting"); mSettingName.addActionListener(this); controls.add(mSettingName); controls.add(Box.createHorizontalGlue()); // (weconsultants@users) New code mName = new JTextField(); mName.addActionListener(this); controls.add(mName); // (weconsultants@users) New code clear = new JButton("Clear Names"); clear.setActionCommand("Clear"); clear.addActionListener(this); buttons.add(clear); buttons.add(Box.createHorizontalGlue()); buttons.add(Box.createHorizontalStrut(10)); JComboBox types = new JComboBox(); connTypes = ConnectionDialogCommon.getTypes(); for (int i = 0; i < connTypes.length; i++) { types.addItem(connTypes[i][0]); } types.addItemListener(this); controls.add(types); controls.add(Box.createVerticalGlue()); mDriver = new JTextField(connTypes[0][1]); mDriver.addActionListener(this); controls.add(mDriver); mURL = new JTextField(connTypes[0][2]); mURL.addActionListener(this); controls.add(mURL); controls.add(Box.createVerticalGlue()); mUser = new JTextField("SA"); mUser.addActionListener(this); controls.add(mUser); controls.add(Box.createVerticalGlue()); mPassword = new JPasswordField(""); mPassword.addActionListener(this); controls.add(mPassword); controls.add(Box.createVerticalGlue()); controls.add(Box.createVerticalStrut(10)); // The button bar buttons.add(Box.createHorizontalGlue()); buttons.add(Box.createHorizontalStrut(10)); okCancel = new JButton(" Ok "); okCancel.setActionCommand("ConnectOk"); okCancel.addActionListener(this); buttons.add(okCancel); getRootPane().setDefaultButton(okCancel); buttons.add(Box.createHorizontalGlue()); buttons.add(Box.createHorizontalStrut(20)); okCancel = new JButton(" Cancel "); okCancel.setActionCommand("ConnectCancel"); okCancel.addActionListener(this); buttons.add(okCancel); buttons.add(Box.createHorizontalGlue()); buttons.add(Box.createHorizontalStrut(10)); JPanel jPanel = new JPanel(); jPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); jPanel.add("Center", whole); getContentPane().add("Center", jPanel); doLayout(); pack(); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); Dimension size = getSize(); if (currentConnectionSetting != null) { mName.setText(currentConnectionSetting.getName()); mDriver.setText(currentConnectionSetting.getDriver()); mURL.setText(currentConnectionSetting.getUrl()); mUser.setText(currentConnectionSetting.getUser()); mPassword.setText(currentConnectionSetting.getPassword()); } // (ulrivo): full size on screen with less than 640 width if (d.width >= 640) { setLocation((d.width - size.width) / 2, (d.height - size.height) / 2); } else { setLocation(0, 0); setSize(d); } setVisible(true); } public static Connection createConnection(JFrame owner, String title) { ConnectionDialogSwing dialog = new ConnectionDialogSwing(owner, title); // Added: (weconsultants@users) Default LAF of Native try { // UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); SwingUtilities.updateComponentTreeUI(dialog); } catch (Exception e) { CommonSwing.errorMessage(e); } dialog.create(); return dialog.mConnection; } private static JLabel createLabel(String s) { JLabel l = new JLabel(s); return l; } // (weconsultants@users) New code public Vector loadRecentConnectionSettings() { Vector passSettings = new Vector(); settings = new Hashtable(); try { settings = ConnectionDialogCommon.loadRecentConnectionSettings(); Iterator it = settings.values().iterator(); passSettings.add(ConnectionDialogCommon.emptySettingName); while (it.hasNext()) { passSettings.add(((ConnectionSetting) it.next()).getName()); } } catch (java.io.IOException ioe) { CommonSwing.errorMessage(ioe); } return (passSettings); } public void actionPerformed(ActionEvent ev) { String s = ev.getActionCommand(); if (s.equals("ConnectOk") || (ev.getSource() instanceof JTextField)) { try { if (mURL.getText().indexOf('\u00AB') >= 0) { throw new Exception("please specify db path"); } mConnection = createConnection(mDriver.getText(), mURL.getText(), mUser.getText(), new String(mPassword.getPassword())); // (weconsultants@users) New code if (mName.getText() != null && mName.getText().trim().length() != 0) { ConnectionSetting newSetting = new ConnectionSetting( mName.getText(), mDriver.getText(), mURL.getText(), mUser.getText(), new String(mPassword.getPassword())); ConnectionDialogCommon.addToRecentConnectionSettings( settings, newSetting); } dispose(); } catch (SQLException e) { mConnection = null; CommonSwing.errorMessage(e, true); } catch (Exception e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } // (weconsultants@users) New code } else if (s.equals("Select Setting")) { String s2 = (String) mSettingName.getSelectedItem(); ConnectionSetting setting = (ConnectionSetting) settings.get(s2); if (setting != null) { mName.setText(setting.getName()); mDriver.setText(setting.getDriver()); mURL.setText(setting.getUrl()); mUser.setText(setting.getUser()); mPassword.setText(setting.getPassword()); } } else if (s.equals("ConnectCancel")) { dispose(); // (weconsultants@users) New code } else if (s.equals("Clear")) { ConnectionDialogCommon.deleteRecentConnectionSettings(); settings = new Hashtable(); mSettingName.removeAllItems(); mSettingName.addItem(ConnectionDialogCommon.emptySettingName); mName.setText(null); } } public void itemStateChanged(ItemEvent e) { String s = (String) e.getItem(); for (int i = 0; i < connTypes.length; i++) { if (s.equals(connTypes[i][0])) { mDriver.setText(connTypes[i][1]); mURL.setText(connTypes[i][2]); } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/Grid.java0000644000175000017500000003507312007547372021462 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.util; import java.util.Vector; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Event; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Image; import java.awt.Panel; import java.awt.Scrollbar; import java.awt.SystemColor; // sqlbob@users 20020401 - patch 1.7.0 by sqlbob (RMP) - enhancements /** * * @author Thomas Mueller (Hypersonic SQL Group) * @version 1.8.0 * @since Hypersonic SQL */ class Grid extends Panel { // drawing private Dimension dMinimum; // boucherb@users changed access for databasemanager2 protected Font fFont; // -------------------------------------------------- private FontMetrics fMetrics; private Graphics gImage; private Image iImage; // height / width private int iWidth, iHeight; private int iRowHeight, iFirstRow; private int iGridWidth, iGridHeight; private int iX, iY; // data // boucherb@users changed access for databasemanager2 protected String[] sColHead = new String[0]; protected Vector vData = new Vector(); // -------------------------------------------------- private int[] iColWidth; private int iColCount; // boucherb@users changed access for databasemanager2 protected int iRowCount; // -------------------------------------------------- // scrolling private Scrollbar sbHoriz, sbVert; private int iSbWidth, iSbHeight; private boolean bDrag; private int iXDrag, iColDrag; /** * Constructor declaration * */ public Grid() { super(); fFont = new Font("Dialog", Font.PLAIN, 12); setLayout(null); sbHoriz = new Scrollbar(Scrollbar.HORIZONTAL); add(sbHoriz); sbVert = new Scrollbar(Scrollbar.VERTICAL); add(sbVert); } /** * Method declaration */ String[] getHead() { return sColHead; } /** * Method declaration */ Vector getData() { return vData; } /** * Method declaration * * * @param d */ public void setMinimumSize(Dimension d) { dMinimum = d; } /** * Method declaration * * * @param x * @param y * @param w * @param h */ public void setBounds(int x, int y, int w, int h) { // fredt@users 20011210 - patch 450412 by elise@users super.setBounds(x, y, w, h); iSbHeight = sbHoriz.getPreferredSize().height; iSbWidth = sbVert.getPreferredSize().width; iHeight = h - iSbHeight; iWidth = w - iSbWidth; sbHoriz.setBounds(0, iHeight, iWidth, iSbHeight); sbVert.setBounds(iWidth, 0, iSbWidth, iHeight); adjustScroll(); iImage = null; repaint(); } /** * Method declaration * * * @param head */ public void setHead(String[] head) { iColCount = head.length; sColHead = new String[iColCount]; iColWidth = new int[iColCount]; for (int i = 0; i < iColCount; i++) { sColHead[i] = head[i]; iColWidth[i] = 100; } iRowCount = 0; iRowHeight = 0; vData = new Vector(); } /** * Method declaration * * * @param data */ public void addRow(String[] data) { if (data.length != iColCount) { return; } String[] row = new String[iColCount]; for (int i = 0; i < iColCount; i++) { row[i] = data[i]; if (row[i] == null) { row[i] = "(null)"; } } vData.addElement(row); iRowCount++; } /** * Method declaration * */ public void update() { adjustScroll(); repaint(); } /** * Method declaration * */ void adjustScroll() { if (iRowHeight == 0) { return; } int w = 0; for (int i = 0; i < iColCount; i++) { w += iColWidth[i]; } iGridWidth = w; iGridHeight = iRowHeight * (iRowCount + 1); sbHoriz.setValues(iX, iWidth, 0, iGridWidth); int v = iY / iRowHeight, h = iHeight / iRowHeight; sbVert.setValues(v, h, 0, iRowCount + 1); iX = sbHoriz.getValue(); iY = iRowHeight * sbVert.getValue(); } /** * Method declaration * * * @param e */ // fredt@users 20020130 - comment by fredt // to remove this deprecated method we need to rewrite the Grid class as a // ScrollPane component // sqlbob: I believe that changing to the JDK1.1 event handler // would require browsers to use the Java plugin. public boolean handleEvent(Event e) { switch (e.id) { case Event.SCROLL_LINE_UP : case Event.SCROLL_LINE_DOWN : case Event.SCROLL_PAGE_UP : case Event.SCROLL_PAGE_DOWN : case Event.SCROLL_ABSOLUTE : iX = sbHoriz.getValue(); iY = iRowHeight * sbVert.getValue(); repaint(); return true; } return super.handleEvent(e); } /** * Method declaration * * * @param g */ public void paint(Graphics g) { if (g == null) { return; } if (sColHead.length == 0) { super.paint(g); return; } if (iWidth <= 0 || iHeight <= 0) { return; } g.setColor(SystemColor.control); g.fillRect(iWidth, iHeight, iSbWidth, iSbHeight); if (iImage == null) { iImage = createImage(iWidth, iHeight); gImage = iImage.getGraphics(); gImage.setFont(fFont); if (fMetrics == null) { fMetrics = gImage.getFontMetrics(); } } if (iRowHeight == 0) { iRowHeight = getMaxHeight(fMetrics); for (int i = 0; i < iColCount; i++) { calcAutoWidth(i); } adjustScroll(); } gImage.setColor(Color.white); gImage.fillRect(0, 0, iWidth, iHeight); gImage.setColor(Color.darkGray); gImage.drawLine(0, iRowHeight, iWidth, iRowHeight); int x = -iX; for (int i = 0; i < iColCount; i++) { int w = iColWidth[i]; gImage.setColor(SystemColor.control); gImage.fillRect(x + 1, 0, w - 2, iRowHeight); gImage.setColor(Color.black); gImage.drawString(sColHead[i], x + 2, iRowHeight - 5); gImage.setColor(Color.darkGray); gImage.drawLine(x + w - 1, 0, x + w - 1, iRowHeight - 1); gImage.setColor(Color.white); gImage.drawLine(x + w, 0, x + w, iRowHeight - 1); x += w; } gImage.setColor(SystemColor.control); gImage.fillRect(0, 0, 1, iRowHeight); gImage.fillRect(x + 1, 0, iWidth - x, iRowHeight); gImage.drawLine(0, 0, 0, iRowHeight - 1); int y = iRowHeight + 1 - iY; int j = 0; while (y < iRowHeight + 1) { j++; y += iRowHeight; } iFirstRow = j; y = iRowHeight + 1; for (; y < iHeight && j < iRowCount; j++, y += iRowHeight) { x = -iX; for (int i = 0; i < iColCount; i++) { int w = iColWidth[i]; Color b = Color.white, t = Color.black; gImage.setColor(b); gImage.fillRect(x, y, w - 1, iRowHeight - 1); gImage.setColor(t); gImage.drawString(getDisplay(i, j), x + 2, y + iRowHeight - 5); gImage.setColor(Color.lightGray); gImage.drawLine(x + w - 1, y, x + w - 1, y + iRowHeight - 1); gImage.drawLine(x, y + iRowHeight - 1, x + w - 1, y + iRowHeight - 1); x += w; } gImage.setColor(Color.white); gImage.fillRect(x, y, iWidth - x, iRowHeight - 1); } g.drawImage(iImage, 0, 0, this); } /** * Method declaration * * * @param g */ public void update(Graphics g) { paint(g); } /** * Method declaration * * * @param e * @param x * @param y */ public boolean mouseMove(Event e, int x, int y) { if (y <= iRowHeight) { int xb = x; x += iX - iGridWidth; int i = iColCount - 1; for (; i >= 0; i--) { if (x > -7 && x < 7) { break; } x += iColWidth[i]; } if (i >= 0) { if (!bDrag) { setCursor(new Cursor(Cursor.E_RESIZE_CURSOR)); bDrag = true; iXDrag = xb - iColWidth[i]; iColDrag = i; } return true; } } return mouseExit(e, x, y); } /** * Method declaration * * * @param e * @param x * @param y */ public boolean mouseDrag(Event e, int x, int y) { if (bDrag && x < iWidth) { int w = x - iXDrag; if (w < 0) { w = 0; } iColWidth[iColDrag] = w; adjustScroll(); repaint(); } return true; } /** * Method declaration * * * @param e * @param x * @param y */ public boolean mouseExit(Event e, int x, int y) { if (bDrag) { setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); bDrag = false; } return true; } /** * Method declaration */ public Dimension preferredSize() { return dMinimum; } /** * Method declaration */ public Dimension getPreferredSize() { return dMinimum; } /** * Method declaration */ public Dimension getMinimumSize() { return dMinimum; } /** * Method declaration */ public Dimension minimumSize() { return dMinimum; } /** * Method declaration * * * @param i */ private void calcAutoWidth(int i) { int w = 10; w = Math.max(w, fMetrics.stringWidth(sColHead[i])); for (int j = 0; j < iRowCount; j++) { String[] s = (String[]) (vData.elementAt(j)); w = Math.max(w, fMetrics.stringWidth(s[i])); } iColWidth[i] = w + 6; } /** * Method declaration * * * @param x * @param y */ private String getDisplay(int x, int y) { return (((String[]) (vData.elementAt(y)))[x]); } /** * Method declaration * * * @param x * @param y */ private String get(int x, int y) { return (((String[]) (vData.elementAt(y)))[x]); } /** * Method declaration * * * @param f */ private static int getMaxHeight(FontMetrics f) { return f.getHeight() + 4; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/GridSwing.java0000644000175000017500000001567412007547374022501 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.util.Vector; import java.awt.Component; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; // sqlbob@users 20020401 - patch 1.7.0 by sqlbob (RMP) - enhancements // deccles@users 20040412 - patch 933671 - various bug fixes /** Simple table model to represent a grid of tuples. * * @author dmarshall@users * @version 1.7.2 * @since 1.7.0 */ class GridSwing extends AbstractTableModel { JTable jtable = null; Object[] headers; Vector rows; /** * Default constructor. */ public GridSwing() { super(); headers = new Object[0]; // initially empty rows = new Vector(); // initially empty } /** * Get the name for the specified column. */ public String getColumnName(int i) { return headers[i].toString(); } public Class getColumnClass(int i) { if (rows.size() > 0) { Object o = getValueAt(0, i); if (o != null) { if ((o instanceof java.sql.Timestamp) || (o instanceof java.sql.Time)) { // This is a workaround for JTable's lack of a default // renderer that displays times. // Without this workaround, Timestamps (and similar // classes) will be displayed as dates without times, // since JTable will match these classes to their // java.util.Date superclass. return Object.class; // renderer will draw .toString(). } return o.getClass(); } } return super.getColumnClass(i); } /** * Get the number of columns. */ public int getColumnCount() { return headers.length; } /** * Get the number of rows currently in the table. */ public int getRowCount() { return rows.size(); } /** * Get the current column headings. */ public Object[] getHead() { return headers; } /** * Get the current table data. * Each row is represented as a String[] * with a single non-null value in the 0-relative * column position. *

              The first row is at offset 0, the nth row at offset n etc. */ public Vector getData() { return rows; } /** * Get the object at the specified cell location. */ public Object getValueAt(int row, int col) { if (row >= rows.size()) { return null; } Object[] colArray = (Object[]) rows.elementAt(row); if (col >= colArray.length) { return null; } return colArray[col]; } /** * Set the name of the column headings. */ public void setHead(Object[] h) { headers = new Object[h.length]; // System.arraycopy(h, 0, headers, 0, h.length); for (int i = 0; i < h.length; i++) { headers[i] = h[i]; } } /** * Append a tuple to the end of the table. */ public void addRow(Object[] r) { Object[] row = new Object[r.length]; // System.arraycopy(r, 0, row, 0, r.length); for (int i = 0; i < r.length; i++) { row[i] = r[i]; if (row[i] == null) { // row[i] = "(null)"; } } rows.addElement(row); } /** * Remove data from all cells in the table (without * affecting the current headings). */ public void clear() { rows.removeAllElements(); } public void setJTable(JTable table) { jtable = table; } public void fireTableChanged(TableModelEvent e) { super.fireTableChanged(e); autoSizeTableColumns(jtable); } public static void autoSizeTableColumns(JTable table) { TableModel model = table.getModel(); TableColumn column = null; Component comp = null; int headerWidth = 0; int maxCellWidth = Integer.MIN_VALUE; int cellWidth = 0; TableCellRenderer headerRenderer = table.getTableHeader().getDefaultRenderer(); for (int i = 0; i < table.getColumnCount(); i++) { column = table.getColumnModel().getColumn(i); comp = headerRenderer.getTableCellRendererComponent(table, column.getHeaderValue(), false, false, 0, 0); headerWidth = comp.getPreferredSize().width + 10; maxCellWidth = Integer.MIN_VALUE; for (int j = 0; j < Math.min(model.getRowCount(), 30); j++) { TableCellRenderer r = table.getCellRenderer(j, i); comp = r.getTableCellRendererComponent(table, model.getValueAt(j, i), false, false, j, i); cellWidth = comp.getPreferredSize().width; if (cellWidth >= maxCellWidth) { maxCellWidth = cellWidth; } } column.setPreferredWidth(Math.max(headerWidth, maxCellWidth) + 10); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/GreenCircle.gif0000644000175000017500000000164512007547372022601 0ustar renereneGIF89a÷t$™/¾ÚOOEOOXO„†„ºµºúúúÚúÿÿÿ!ùÿ,@‚ÿ ˆÁ < À€‡ À 0€@ÄŠ ÌØpâD"’ @åÈ, xŒ8€b‚ 9ÒÉZËf·±”pÙ%ŠdG;hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/JDBCTypes.java0000644000175000017500000001563012007547372022321 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.util.Hashtable; /** * Base class for conversion from a different databases * * @author Nicolas BAZIN * @version 1.7.0 */ class JDBCTypes { public static final int JAVA_OBJECT = 2000; public static final int DISTINCT = 2001; public static final int STRUCT = 2002; public static final int ARRAY = 2003; public static final int BLOB = 2004; public static final int CLOB = 2005; public static final int REF = 2006; private Hashtable hStringJDBCtypes; private Hashtable hIntJDBCtypes; JDBCTypes() { hStringJDBCtypes = new Hashtable(); hIntJDBCtypes = new Hashtable(); hStringJDBCtypes.put(new Integer(ARRAY), "ARRAY"); hStringJDBCtypes.put(new Integer(BLOB), "BLOB"); hStringJDBCtypes.put(new Integer(CLOB), "CLOB"); hStringJDBCtypes.put(new Integer(DISTINCT), "DISTINCT"); hStringJDBCtypes.put(new Integer(JAVA_OBJECT), "JAVA_OBJECT"); hStringJDBCtypes.put(new Integer(REF), "REF"); hStringJDBCtypes.put(new Integer(STRUCT), "STRUCT"); // hStringJDBCtypes.put(new Integer(java.sql.Types.BIGINT), "BIGINT"); hStringJDBCtypes.put(new Integer(java.sql.Types.BINARY), "BINARY"); hStringJDBCtypes.put(new Integer(java.sql.Types.BIT), "BIT"); hStringJDBCtypes.put(new Integer(java.sql.Types.CHAR), "CHAR"); hStringJDBCtypes.put(new Integer(java.sql.Types.DATE), "DATE"); hStringJDBCtypes.put(new Integer(java.sql.Types.DECIMAL), "DECIMAL"); hStringJDBCtypes.put(new Integer(java.sql.Types.DOUBLE), "DOUBLE"); hStringJDBCtypes.put(new Integer(java.sql.Types.FLOAT), "FLOAT"); hStringJDBCtypes.put(new Integer(java.sql.Types.INTEGER), "INTEGER"); hStringJDBCtypes.put(new Integer(java.sql.Types.LONGVARBINARY), "LONGVARBINARY"); hStringJDBCtypes.put(new Integer(java.sql.Types.LONGVARCHAR), "LONGVARCHAR"); hStringJDBCtypes.put(new Integer(java.sql.Types.NULL), "NULL"); hStringJDBCtypes.put(new Integer(java.sql.Types.NUMERIC), "NUMERIC"); hStringJDBCtypes.put(new Integer(java.sql.Types.OTHER), "OTHER"); hStringJDBCtypes.put(new Integer(java.sql.Types.REAL), "REAL"); hStringJDBCtypes.put(new Integer(java.sql.Types.SMALLINT), "SMALLINT"); hStringJDBCtypes.put(new Integer(java.sql.Types.TIME), "TIME"); hStringJDBCtypes.put(new Integer(java.sql.Types.TIMESTAMP), "TIMESTAMP"); hStringJDBCtypes.put(new Integer(java.sql.Types.TINYINT), "TINYINT"); hStringJDBCtypes.put(new Integer(java.sql.Types.VARBINARY), "VARBINARY"); hStringJDBCtypes.put(new Integer(java.sql.Types.VARCHAR), "VARCHAR"); hStringJDBCtypes.put(new Integer(java.sql.Types.BOOLEAN), "BOOLEAN"); // hIntJDBCtypes.put("ARRAY", new Integer(ARRAY)); hIntJDBCtypes.put("BLOB", new Integer(BLOB)); hIntJDBCtypes.put("CLOB", new Integer(CLOB)); hIntJDBCtypes.put("DISTINCT", new Integer(DISTINCT)); hIntJDBCtypes.put("JAVA_OBJECT", new Integer(JAVA_OBJECT)); hIntJDBCtypes.put("REF", new Integer(REF)); hIntJDBCtypes.put("STRUCT", new Integer(STRUCT)); // hIntJDBCtypes.put("BIGINT", new Integer(java.sql.Types.BIGINT)); hIntJDBCtypes.put("BINARY", new Integer(java.sql.Types.BINARY)); hIntJDBCtypes.put("BIT", new Integer(java.sql.Types.BIT)); hIntJDBCtypes.put("CHAR", new Integer(java.sql.Types.CHAR)); hIntJDBCtypes.put("DATE", new Integer(java.sql.Types.DATE)); hIntJDBCtypes.put("DECIMAL", new Integer(java.sql.Types.DECIMAL)); hIntJDBCtypes.put("DOUBLE", new Integer(java.sql.Types.DOUBLE)); hIntJDBCtypes.put("FLOAT", new Integer(java.sql.Types.FLOAT)); hIntJDBCtypes.put("INTEGER", new Integer(java.sql.Types.INTEGER)); hIntJDBCtypes.put("LONGVARBINARY", new Integer(java.sql.Types.LONGVARBINARY)); hIntJDBCtypes.put("LONGVARCHAR", new Integer(java.sql.Types.LONGVARCHAR)); hIntJDBCtypes.put("NULL", new Integer(java.sql.Types.NULL)); hIntJDBCtypes.put("NUMERIC", new Integer(java.sql.Types.NUMERIC)); hIntJDBCtypes.put("OTHER", new Integer(java.sql.Types.OTHER)); hIntJDBCtypes.put("REAL", new Integer(java.sql.Types.REAL)); hIntJDBCtypes.put("SMALLINT", new Integer(java.sql.Types.SMALLINT)); hIntJDBCtypes.put("TIME", new Integer(java.sql.Types.TIME)); hIntJDBCtypes.put("TIMESTAMP", new Integer(java.sql.Types.TIMESTAMP)); hIntJDBCtypes.put("TINYINT", new Integer(java.sql.Types.TINYINT)); hIntJDBCtypes.put("VARBINARY", new Integer(java.sql.Types.VARBINARY)); hIntJDBCtypes.put("VARCHAR", new Integer(java.sql.Types.VARCHAR)); hIntJDBCtypes.put("BOOLEAN", new Integer(java.sql.Types.BOOLEAN)); } public Hashtable getHashtable() { return hStringJDBCtypes; } public String toString(int type) { return (String) hStringJDBCtypes.get(new Integer(type)); } public int toInt(String type) throws Exception { Integer tempInteger = (Integer) hIntJDBCtypes.get(type); return tempInteger.intValue(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/PostgresTransferHelper.java0000644000175000017500000001277212007547374025253 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Types; // fredt@users 20020215 - patch 516309 by Nicolas Bazin - transfer PostgresSQL // sqlbob@users 20020325 - patch 1.7.0 - reengineering /** * Conversions from PostgresSQL databases * * @author Nichola Bazin * @version 1.7.0 */ class PostgresTransferHelper extends TransferHelper { private final int PostgreSQL = 0; private final int HSQLDB = 1; String[][] Funcs = { { "now()", "\'now\'" } }; PostgresTransferHelper() { super(); } PostgresTransferHelper(TransferDb database, Traceable t, String q) { super(database, t, q); } int convertToType(int type) { if (type == Types.DECIMAL) { type = Types.NUMERIC; tracer.trace("Converted DECIMAL to NUMERIC"); } return (type); } String fixupColumnDefRead(TransferTable t, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { String SeqName = new String("_" + columnDesc.getString(4) + "_seq"); int spaceleft = 31 - SeqName.length(); if (t.Stmts.sDestTable.length() > spaceleft) { SeqName = t.Stmts.sDestTable.substring(0, spaceleft) + SeqName; } else { SeqName = t.Stmts.sDestTable + SeqName; } String CompareString = "nextval(\'\"" + SeqName + "\"\'"; if (columnType.indexOf(CompareString) >= 0) { // We just found a increment columnType = "SERIAL"; } for (int Idx = 0; Idx < Funcs.length; Idx++) { String PostgreSQL_func = Funcs[Idx][PostgreSQL]; int iStartPos = columnType.indexOf(PostgreSQL_func); if (iStartPos >= 0) { String NewColumnType = columnType.substring(0, iStartPos); NewColumnType += Funcs[Idx][HSQLDB]; NewColumnType += columnType.substring(iStartPos + PostgreSQL_func.length()); columnType = NewColumnType; } } return (columnType); } String fixupColumnDefWrite(TransferTable t, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { if (columnType.equals("SERIAL")) { String SeqName = new String("_" + columnDesc.getString(4) + "_seq"); int spaceleft = 31 - SeqName.length(); if (t.Stmts.sDestTable.length() > spaceleft) { SeqName = t.Stmts.sDestTable.substring(0, spaceleft) + SeqName; } else { SeqName = t.Stmts.sDestTable + SeqName; } String DropSequence = "DROP SEQUENCE " + SeqName + ";"; t.Stmts.sDestDrop += DropSequence; } for (int Idx = 0; Idx < Funcs.length; Idx++) { String HSQLDB_func = Funcs[Idx][HSQLDB]; int iStartPos = columnType.indexOf(HSQLDB_func); if (iStartPos >= 0) { String NewColumnType = columnType.substring(0, iStartPos); NewColumnType += Funcs[Idx][PostgreSQL]; NewColumnType += columnType.substring(iStartPos + HSQLDB_func.length()); columnType = NewColumnType; } } return (columnType); } void beginDataTransfer() { try { db.setAutoCommit(false); } catch (Exception e) {} } void endDataTransfer() { try { db.commit(); db.execute("VACUUM ANALYZE"); } catch (Exception e) {} } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/Italic.gif0000644000175000017500000000170412007547374021622 0ustar renereneGIF89a瀀€€€€€€€ÀÀÀÀÜÀ¦ÊðÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%þܹ–sPÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿþþÜܹ¹––ssPPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿþܹ–sPÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿþþÜܹ¹––ssPPÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%þܹ–sPãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%þþÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&ÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ùÿ,¡ÿ H° Aƒè¨G¯!½z  ħÀŽã –WÑÄs;¼çg@;hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/SQLStatements.java0000644000175000017500000001021312007547372023271 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.util; import java.io.Serializable; /** * container for set of SQL statements * * New class based on Hypersonic SQL code. * * @version 1.7.1 * @since 1.7.1 */ class SQLStatements implements Serializable { String sSchema, sType; String sDatabaseToConvert; String sSourceTable, sDestTable; String sDestDrop, sDestCreate, sDestInsert, sDestDelete; String sDestDropIndex, sDestCreateIndex, sDestAlter, sSourceSelect; boolean bTransfer = true; boolean bCreate = true; boolean bDelete = true; boolean bDrop = true; boolean bCreateIndex = true; boolean bDropIndex = true; boolean bInsert = true; boolean bAlter = true; boolean bFKForced = false; boolean bIdxForced = false; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/TransferResultSet.java0000644000175000017500000001200312007547372024220 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Vector; /** * Helper class for transferring a result set * * @author Nicolas BAZIN * @version 1.7.0 */ class TransferResultSet { Vector vRows = null; int iRowIdx; int iMaxRowIdx; int iColumnCount; String[] sColumnNames = null; int[] iColumnTypes = null; TransferResultSet(ResultSet r) { iRowIdx = 0; iMaxRowIdx = 0; iColumnCount = 0; vRows = new Vector(); try { while (r.next()) { if (sColumnNames == null) { iColumnCount = r.getMetaData().getColumnCount(); sColumnNames = new String[iColumnCount + 1]; iColumnTypes = new int[iColumnCount + 1]; for (int Idx = 0; Idx < iColumnCount; Idx++) { sColumnNames[Idx + 1] = r.getMetaData().getColumnName(Idx + 1); iColumnTypes[Idx + 1] = r.getMetaData().getColumnType(Idx + 1); } vRows.addElement(null); } iMaxRowIdx++; Object[] Values = new Object[iColumnCount + 1]; for (int Idx = 0; Idx < iColumnCount; Idx++) { Values[Idx + 1] = r.getObject(Idx + 1); } vRows.addElement(Values); } } catch (SQLException SQLE) { iRowIdx = 0; iMaxRowIdx = 0; iColumnCount = 0; vRows = new Vector(); } } TransferResultSet() { iRowIdx = 0; iMaxRowIdx = 0; iColumnCount = 0; vRows = new Vector(); } void addRow(String[] Name, int[] type, Object[] Values, int nbColumns) throws Exception { if ((Name.length != type.length) || (Name.length != Values.length) || (Name.length != (nbColumns + 1))) { throw new Exception("Size of parameter incoherent"); } if (sColumnNames == null) { iColumnCount = nbColumns; sColumnNames = Name; iColumnTypes = type; vRows.addElement(null); } if ((iMaxRowIdx > 0) && (this.getColumnCount() != nbColumns)) { throw new Exception("Wrong number of columns: " + this.getColumnCount() + " column is expected"); } iMaxRowIdx++; vRows.addElement(Values); } boolean next() { iRowIdx++; return ((iRowIdx <= iMaxRowIdx) && (iMaxRowIdx > 0)); } String getColumnName(int columnIdx) { if ((iMaxRowIdx <= 0) || (iMaxRowIdx < iRowIdx)) { return null; } return sColumnNames[columnIdx]; } int getColumnCount() { if ((iMaxRowIdx <= 0) || (iMaxRowIdx < iRowIdx)) { return 0; } return iColumnCount; } int getColumnType(int columnIdx) { if ((iMaxRowIdx <= 0) || (iMaxRowIdx < iRowIdx)) { return 0; } return iColumnTypes[columnIdx]; } Object getObject(int columnIdx) { if ((iMaxRowIdx <= 0) || (iMaxRowIdx < iRowIdx)) { return null; } return ((Object[]) vRows.elementAt(iRowIdx))[columnIdx]; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/HelperFactory.java0000644000175000017500000000537212007547372023343 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; /** * @author Nicolas BAZIN, INGENICO * @version 1.7.0 */ // brian.porter@siteforce.de 20020703 - added reference to OracleTransferHelper class HelperFactory { HelperFactory() {} // TransferHelper factory static TransferHelper getHelper(String productLowerName) { TransferHelper f = null; if (productLowerName.indexOf("hsql database") != -1) { f = new HsqldbTransferHelper(); } else if (productLowerName.indexOf("postgresql") != -1) { f = new PostgresTransferHelper(); } else if (productLowerName.indexOf("mckoi") != -1) { f = new McKoiTransferHelper(); } else if (productLowerName.indexOf("informix") != -1) { f = new InformixTransferHelper(); } else if (productLowerName.indexOf("oracle") != -1) { System.out.println("using the Oracle helper"); f = new OracleTransferHelper(); } else if (productLowerName.equals("access") || (productLowerName.indexOf("microsoft") != -1)) { f = new SqlServerTransferHelper(); } else { f = new TransferHelper(); } return (f); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/run_exc_running.gif0000644000175000017500000000013612007547372023614 0ustar renereneGIF89a‘¿¿¿ŸŸŸÿÿÿ!ù,/”©«Üƒ¨Meå»<@âiΈIŸhk¾‹#XØg×›nM²ca4 ¤;hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/DatabaseManagerSwing.java0000644000175000017500000031456212007547374024611 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.security.AccessControlException; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.Driver; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.Locale; import java.util.Properties; import java.util.Vector; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Event; import java.awt.Font; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButtonMenuItem; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JToolBar; import javax.swing.JTree; import javax.swing.KeyStroke; import javax.swing.RootPaneContainer; import javax.swing.SwingUtilities; import javax.swing.table.TableModel; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import org.hsqldb.lib.RCData; import org.hsqldb.lib.java.JavaSystem; //dmarshall@users - 20020101 - original swing port of DatabaseManager //sqlbob@users 20020401 - patch 537501 by ulrivo - commandline arguments //sqlbob@users 20020407 - patch 1.7.0 - reengineering and enhancements //nickferguson@users 20021005 - patch 1.7.1 - enhancements //deccles@users 2004 - 2008 - bug fixes and enhancements //weconsultants@users 20041109 - version 1.8.0 - reengineering and enhancements: // Added: Goodies 'Look and Feel'. // Added: a Font Changer(Font Type\Style). // Added: a Color Changer (foreground\bckground). // Added: RowCounts for each JTree table nodes. // Added: OneTouchExpandable attribute to JSplitPanes. // Moved: setFramePositon code to a CommonSwing.setFramePositon() Method. // Added: call to new method to handle exception processing (CommonSwing.errorMessage()); // Added: Added a new pane added at the bottom of the Frame. (Status Icon and StatusLine). // Added: 2 Methods (setStatusMessage()), one overrides the other. One to change the ruung status // another to allow a message to be posted without changing the Status Icon if needed. // Added: Added a customCursor for the current wait cursor // Added: Ability to switch the current LAF while runing (Native,Java or Motif) //unsaved@users 2005xxxx - improvements and bug fixes /** * Swing Tool for managing a JDBC database.

              *

               *             Usage: java DatabaseManagerSwing [--options]
               *             where options include:
               *              --driver   jdbc driver class
               *              --url           jdbc url
               *              --user          username used for connection
               *              --password  password for this user
               *              --dir           default directory
               *              --script        reads from script file
               *              --urlid        get connection info from RC file
               *              --rcfile        use instead of default (with urlid)
               *              --noexit              Don't exit JVM
               * 
              * * Note that the sys-table switch will not work for Oracle, because Oracle * does not categorize their system tables correctly in the JDBC Metadata. * * @author dmarshall@users * @author Bob Preston (sqlbob@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.0 */ public class DatabaseManagerSwing extends JApplet implements ActionListener, WindowListener, KeyListener, MouseListener { /* * This is down here because it is an implementation note, not a * Javadoc comment! * Tue Apr 26 16:38:54 EDT 2005 * Switched default switch method from "-switch" to "--switch" because * "-switch" usage is ambiguous as used here. Single switches should * be reserved for single-letter switches which can be mixed like * "-u -r -l" = "-url". -blaine */ private static String homedir = null; private boolean isOracle = false; // Need some workarounds for Oracle static { try { Class c = Class.forName("sun.security.action.GetPropertyAction"); Constructor constructor = c.getConstructor(new Class[]{ String.class }); java.security.PrivilegedAction a = (java.security.PrivilegedAction) constructor.newInstance( new Object[]{ "user.home" }); homedir = (String) java.security.AccessController.doPrivileged(a); } catch (IllegalAccessException e) { System.err.println( "Failed to get home directory.\n" + "Therefore not retrieving/storing user preferences.\n(" + e.getMessage() + ')'); } catch (NoSuchMethodException e) { System.err.println( "Failed to get home directory.\n" + "Therefore not retrieving/storing user preferences.\n(" + e.getMessage() + ')'); } catch (ClassNotFoundException e) { System.err.println( "Failed to get home directory.\n" + "Therefore not retrieving/storing user preferences.\n(" + e.getMessage() + ')'); } catch (InstantiationException e) { System.err.println( "Failed to get home directory.\n" + "Therefore not retrieving/storing user preferences.\n(" + e.getMessage() + ')'); } catch (InvocationTargetException e) { System.err.println( "Failed to get home directory.\n" + "Therefore not retrieving/storing user preferences.\n(" + e.getMessage() + ')'); } catch (AccessControlException e) { System.err.println( "Failed to get home directory.\n" + "Therefore not retrieving/storing user preferences.\n(" + e.getMessage() + ')'); } } ArrayList localActionList = new ArrayList(); private JFrame jframe = null; private static final String DEFAULT_RCFILE = homedir + "/dbmanager.rc"; private static boolean TT_AVAILABLE = false; static { try { Class.forName(DatabaseManagerSwing.class.getPackage().getName() + ".Transfer"); TT_AVAILABLE = true; } catch (Throwable t) { //System.err.println("Failed to get " //+ DatabaseManagerSwing.class.getPackage().getName() //+ ".Transfer: " + t); // Enable this print statement for debugging class access problems. } } private static final String HELP_TEXT = "See the HSQLDB Utilities Guide, forums and mailing lists \n" + "at http://hsqldb.org.\n\n" + "Please paste the following version identifier with any\n" + "problem reports or help requests: $Revision: 4201 $" + (TT_AVAILABLE ? "" : ("\n\nTransferTool classes are not in CLASSPATH.\n" + "To enable the Tools menu, add 'transfer.jar' " + "to your class path.")); ; private static final String ABOUT_TEXT = "$Revision: 4201 $ of DatabaseManagerSwing\n\n" + "Copyright (c) 2001-2010, The HSQL Development Group.\n" + "http://hsqldb.org (Utilities Guide available at this site).\n\n\n" + "You may use and redistribute according to the HSQLDB\n" + "license documented in the source code and at the web\n" + "site above." + (TT_AVAILABLE ? "\n\nTransferTool options are available." : ""); static final String NL = System.getProperty("line.separator"); static final String NULL_STR = "[null]"; static int iMaxRecent = 24; Connection cConn; Connection rowConn; // holds the connetion for getting table row counts DatabaseMetaData dMeta; Statement sStatement; JMenu mRecent; String[] sRecent; int iRecent; JTextArea txtCommand; JScrollPane txtCommandScroll; JButton butExecute; JTree tTree; JScrollPane tScrollPane; DefaultTreeModel treeModel; TableModel tableModel; DefaultMutableTreeNode rootNode; JPanel pResult; long lTime; GridSwing gResult; /** * I think this is used to store model info whether we're using Grid * output or not (this object is queried for data to display for * text output mode). * If so, the presentation-independent model part should be moved * to an appropriately-named class instead of storing pure data in * a Swing-specific class. */ JTable gResultTable; JScrollPane gScrollPane; JTextArea txtResult; JScrollPane txtResultScroll; JSplitPane nsSplitPane; // Contains query over results JSplitPane ewSplitPane; // Contains tree beside nsSplitPane boolean bHelp; RootPaneContainer fMain; static boolean bMustExit; /** Value of this variable only retained if huge input script read in. */ String sqlScriptBuffer = null; JToolBar jtoolbar; private boolean showSchemas = true; private boolean showTooltips = true; private boolean autoRefresh = true; private boolean gridFormat = true; // Added: (weconsultants@users) static DatabaseManagerSwing refForFontDialogSwing; boolean displayRowCounts = false; boolean showSys = false; boolean showIndexDetails = true; String currentLAF = null; JPanel pStatus; static JButton iReadyStatus; JRadioButtonMenuItem rbAllSchemas = new JRadioButtonMenuItem("*"); JMenuItem mitemAbout = new JMenuItem("About", 'A'); JMenuItem mitemHelp = new JMenuItem("Help", 'H'); JMenuItem mitemUpdateSchemas = new JMenuItem("Update Schemas"); JCheckBoxMenuItem boxAutoCommit = new JCheckBoxMenuItem(AUTOCOMMIT_BOX_TEXT); JCheckBoxMenuItem boxLogging = new JCheckBoxMenuItem(LOGGING_BOX_TEXT); JCheckBoxMenuItem boxShowSchemas = new JCheckBoxMenuItem(SHOWSCHEMAS_BOX_TEXT); JCheckBoxMenuItem boxAutoRefresh = new JCheckBoxMenuItem(AUTOREFRESH_BOX_TEXT); JCheckBoxMenuItem boxTooltips = new JCheckBoxMenuItem(SHOWTIPS_BOX_TEXT); JCheckBoxMenuItem boxRowCounts = new JCheckBoxMenuItem(ROWCOUNTS_BOX_TEXT); JCheckBoxMenuItem boxShowGrid = new JCheckBoxMenuItem(GRID_BOX_TEXT); JCheckBoxMenuItem boxShowSys = new JCheckBoxMenuItem(SHOWSYS_BOX_TEXT); // Consider adding GTK and Plaf L&Fs. JRadioButtonMenuItem rbNativeLF = new JRadioButtonMenuItem("Native Look & Feel"); JRadioButtonMenuItem rbJavaLF = new JRadioButtonMenuItem("Java Look & Feel"); JRadioButtonMenuItem rbMotifLF = new JRadioButtonMenuItem("Motif Look & Feel"); JLabel jStatusLine; static String READY_STATUS = "Ready"; private static final String AUTOCOMMIT_BOX_TEXT = "Autocommit mode"; private static final String LOGGING_BOX_TEXT = "Logging mode"; private static final String SHOWSCHEMAS_BOX_TEXT = "Show schemas"; private static final String AUTOREFRESH_BOX_TEXT = "Auto-refresh tree"; private static final String SHOWTIPS_BOX_TEXT = "Show Tooltips"; private static final String ROWCOUNTS_BOX_TEXT = "Show row counts"; private static final String SHOWSYS_BOX_TEXT = "Show system tables"; private static final String GRID_BOX_TEXT = "Show results in Grid (a.o.t. Text)"; // variables to hold the default cursors for these top level swing objects // so we can restore them when we exit our thread Cursor fMainCursor; Cursor txtCommandCursor; Cursor txtResultCursor; HashMap tipMap = new HashMap(); private JMenu mnuSchemas = new JMenu("Schemas"); /** * Wait Cursor */ // Changed: (weconsultants@users): commonted out the, out of the box, cursor to use a custom cursor private final Cursor waitCursor = new Cursor(Cursor.WAIT_CURSOR); //getToolkit().createCustomCursor(CommonSwing.getIcon("SystemCursor"), // new Point(4, 4), "HourGlass cursor"); // (ulrivo): variables set by arguments from the commandline static String defDriver = "org.hsqldb.jdbcDriver"; static String defURL = "jdbc:hsqldb:mem:."; static String defUser = "SA"; static String defPassword = ""; static String defScript; static String defDirectory; private String schemaFilter = null; public DatabaseManagerSwing() { jframe = new JFrame("HSQLDB DatabaseManager"); fMain = jframe; } ; public DatabaseManagerSwing(JFrame frameIn) { jframe = frameIn; fMain = jframe; } ; public void init() { javax.swing.AbstractButton btn; fMain = this; main(); for (int i = 0; i < localActionList.size(); i++) { btn = (javax.swing.AbstractButton) localActionList.get(i); btn.setEnabled(false); } Connection c = null; boolean auto = false; if (getParameter("jdbcDriver") != null) { auto = true; defDriver = getParameter("jdbcDriver"); } if (getParameter("jdbcUrl") != null) { auto = true; defURL = getParameter("jdbcUrl"); } if (getParameter("jdbcUser") != null) { auto = true; defUser = getParameter("jdbcUser"); } if (getParameter("jdbcPassword") != null) { auto = true; defPassword = getParameter("jdbcPassword"); } try { setWaiting("Initializing"); //insertTestData(); //updateAutoCommitBox(); c = (auto ? ConnectionDialogSwing.createConnection(defDriver, defURL, defUser, defPassword) : ConnectionDialogSwing.createConnection(jframe, "Connect")); } catch (Exception e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } finally { setWaiting(null); } if (c != null) { connect(c); } if (getParameter("loadSampleData") != null && getParameter("loadSampleData").equals("true")) { insertTestData(); try { Thread.sleep(1000); } catch (InterruptedException ie) {} ; // I don't know why, but the tree refresh below sometimes // doesn't show all tables unless I put this delay here. refreshTree(); } if (getParameter("schemaFilter") != null) { schemaFilter = getParameter("schemaFilter"); } } /** * Run with --help switch for usage instructions. * * @throws IllegalArgumentException for the obvious reason */ public static void main(String[] arg) { System.getProperties().put("sun.java2d.noddraw", "true"); // (ulrivo): read all arguments from the command line String currentArg; String lowerArg; String urlid = null; String rcFile = null; boolean autoConnect = false; boolean urlidConnect = false; bMustExit = true; for (int i = 0; i < arg.length; i++) { currentArg = arg[i]; lowerArg = arg[i].toLowerCase(); if (lowerArg.startsWith("--")) { lowerArg = lowerArg.substring(1); } if (lowerArg.equals("-noexit") || lowerArg.equals("-help")) { // } else if (i == arg.length - 1) { throw new IllegalArgumentException("No value for argument " + currentArg); } i++; if (lowerArg.equals("-driver")) { defDriver = arg[i]; autoConnect = true; } else if (lowerArg.equals("-url")) { defURL = arg[i]; autoConnect = true; } else if (lowerArg.equals("-user")) { defUser = arg[i]; autoConnect = true; } else if (lowerArg.equals("-password")) { defPassword = arg[i]; autoConnect = true; } else if (lowerArg.equals("-urlid")) { urlid = arg[i]; urlidConnect = true; } else if (lowerArg.equals("-rcfile")) { rcFile = arg[i]; urlidConnect = true; } else if (lowerArg.equals("-dir")) { defDirectory = arg[i]; } else if (lowerArg.equals("-script")) { defScript = arg[i]; } else if (lowerArg.equals("-noexit")) { bMustExit = false; i--; } else if (lowerArg.equals("-help")) { showUsage(); return; } else { /* Syntax ERRORS should either throw or exit with non-0 status. * In our case, it may be unsafe to exit, so we throw. * (I.e. should provide easy way for caller to programmatically * determine that there was an invocation problem). */ throw new IllegalArgumentException( "invalid argrument " + currentArg + " try: java... " + DatabaseManagerSwing.class.getName() + " --help"); // No reason to localize, since the main syntax message is // not localized. } } DatabaseManagerSwing m = new DatabaseManagerSwing(new JFrame("HSQL Database Manager")); // Added: (weconsultants@users): Need databaseManagerSwing for later Reference refForFontDialogSwing = m; m.main(); Connection c = null; m.setWaiting("Initializing"); try { if (autoConnect && urlidConnect) { throw new IllegalArgumentException( "You may not specify both (urlid) AND (url/user/password)."); } if (autoConnect) { c = ConnectionDialogSwing.createConnection(defDriver, defURL, defUser, defPassword); } else if (urlidConnect) { if (urlid == null) { throw new IllegalArgumentException( "You must specify an 'urlid' to use an RC file"); } autoConnect = true; String rcfilepath = (rcFile == null) ? DEFAULT_RCFILE : rcFile; RCData rcdata = new RCData(new File(rcfilepath), urlid); c = rcdata.getConnection( null, System.getProperty("javax.net.ssl.trustStore")); } else { c = ConnectionDialogSwing.createConnection(m.jframe, "Connect"); } } catch (Exception e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } finally { m.setWaiting(null); } if (c != null) { m.connect(c); } // Added: (weconsultants@users): For preloadng FontDialogSwing FontDialogSwing.creatFontDialog(refForFontDialogSwing); m.start(); } /** * This stuff is all quick, except for the refreshTree(). * This unit can be kicked off in main Gui thread. The refreshTree * will be backgrounded and this method will return. */ public void connect(Connection c) { schemaFilter = null; if (c == null) { return; } if (cConn != null) { try { cConn.close(); } catch (SQLException e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } } cConn = c; // Added: (weconsultants@users) Need to barrow to get the table rowcounts rowConn = c; try { dMeta = cConn.getMetaData(); isOracle = (dMeta.getDatabaseProductName().indexOf("Oracle") >= 0); sStatement = cConn.createStatement(); updateAutoCommitBox(); // Workaround for EXTREME SLOWNESS getting this info from O. showIndexDetails = !isOracle; Driver driver = DriverManager.getDriver(dMeta.getURL()); ConnectionSetting newSetting = new ConnectionSetting( dMeta.getDatabaseProductName(), driver.getClass().getName(), dMeta.getURL(), dMeta.getUserName().replaceAll("@localhost", ""), ""); Hashtable settings = ConnectionDialogCommon.loadRecentConnectionSettings(); ConnectionDialogCommon.addToRecentConnectionSettings(settings, newSetting); ConnectionDialogSwing.setConnectionSetting(newSetting); refreshTree(); clearResultPanel(); if (fMain instanceof JApplet) { getAppletContext().showStatus( "JDBC Connection established to a " + dMeta.getDatabaseProductName() + " v. " + dMeta.getDatabaseProductVersion() + " database as '" + dMeta.getUserName() + "'."); } } catch (SQLException e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } catch (IOException e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } catch (Exception e) { CommonSwing.errorMessage(e); } } private static void showUsage() { System.out.println( "Usage: java DatabaseManagerSwing [--options]\n" + "where options include:\n" + " --help show this message\n" + " --driver jdbc driver class\n" + " --url jdbc url\n" + " --user username used for connection\n" + " --password password for this user\n" + " --urlid use url/user/password/driver in rc file\n" + " --rcfile (defaults to 'dbmanager.rc' in home dir)\n" + " --dir default directory\n" + " --script reads from script file\n" + " --noexit do not call system.exit()"); } private void insertTestData() { try { DatabaseManagerCommon.createTestTables(sStatement); txtCommand.setText( DatabaseManagerCommon.createTestData(sStatement)); for (int i = 0; i < DatabaseManagerCommon.testDataSql.length; i++) { addToRecent(DatabaseManagerCommon.testDataSql[i]); } executeCurrentSQL(); } catch (SQLException e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } } public void setMustExit(boolean b) { this.bMustExit = b; } private DBMPrefs prefs = null; public void main() { JMenu jmenu; JMenuItem mitem; try { prefs = new DBMPrefs(fMain instanceof JApplet); } catch (Exception e) { /* System.err.println( "Failed to load preferences. Proceeding with defaults:\n"); */ } if (prefs == null) { setLF(CommonSwing.Native); } else { autoRefresh = prefs.autoRefresh; displayRowCounts = prefs.showRowCounts; showSys = prefs.showSysTables; showSchemas = prefs.showSchemas; gridFormat = prefs.resultGrid; showTooltips = prefs.showTooltips; setLF(prefs.laf); } // (ulrivo): An actual icon. N.b., this adds some tips to the tip map fMain.getContentPane().add(createToolBar(), "North"); if (fMain instanceof java.awt.Frame) { ((java.awt.Frame) fMain).setIconImage( CommonSwing.getIcon("Frame")); } if (fMain instanceof java.awt.Window) { ((java.awt.Window) fMain).addWindowListener(this); } JMenuBar bar = new JMenuBar(); // used shortcuts: CERGTSIUDOLM String[] fitems = { "-Connect...", "--", "OOpen Script...", "-Save Script...", "-Save Result...", "--", "-Exit" }; jmenu = addMenu(bar, "File", fitems); // All actions after Connect and the divider are local. for (int i = 2; i < jmenu.getItemCount(); i++) { mitem = jmenu.getItem(i); if (mitem != null) { localActionList.add(mitem); } } Object[] vitems = { "RRefresh Tree", boxAutoRefresh, "--", boxRowCounts, boxShowSys, boxShowSchemas, boxShowGrid }; addMenu(bar, "View", vitems); String[] sitems = { "SSELECT", "IINSERT", "UUPDATE", "DDELETE", "EEXECUTE", "---", "-CREATE TABLE", "-DROP TABLE", "-CREATE INDEX", "-DROP INDEX", "--", "CCOMMIT*", "LROLLBACK*", "-CHECKPOINT*", "-SCRIPT", "-SET", "-SHUTDOWN", "--", "-Test Script" }; addMenu(bar, "Command", sitems); mRecent = new JMenu("Recent"); mRecent.setMnemonic(KeyEvent.VK_R); bar.add(mRecent); ButtonGroup lfGroup = new ButtonGroup(); lfGroup.add(rbNativeLF); lfGroup.add(rbJavaLF); lfGroup.add(rbMotifLF); boxShowSchemas.setSelected(showSchemas); boxShowGrid.setSelected(gridFormat); boxTooltips.setSelected(showTooltips); boxShowGrid.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, Event.CTRL_MASK)); boxAutoRefresh.setSelected(autoRefresh); boxRowCounts.setSelected(displayRowCounts); boxShowSys.setSelected(showSys); rbNativeLF.setActionCommand("LFMODE:" + CommonSwing.Native); rbJavaLF.setActionCommand("LFMODE:" + CommonSwing.Java); rbMotifLF.setActionCommand("LFMODE:" + CommonSwing.Motif); tipMap.put(mitemUpdateSchemas, "Refresh the schema list in this menu"); tipMap.put(rbAllSchemas, "Display items in all schemas"); tipMap.put(mitemAbout, "Display product information"); tipMap.put(mitemHelp, "Display advice for obtaining help"); tipMap.put(boxAutoRefresh, "Refresh tree (and schema list) automatically" + "when YOU modify database objects"); tipMap.put(boxShowSchemas, "Display object names in tree-like schemaname.basename"); tipMap.put(rbNativeLF, "Set Look and Feel to Native for your platform"); tipMap.put(rbJavaLF, "Set Look and Feel to Java"); tipMap.put(rbMotifLF, "Set Look and Feel to Motif"); boxTooltips.setToolTipText("Display tooltips (hover text), like this"); tipMap.put(boxAutoCommit, "Shows current Auto-commit mode. Click to change"); tipMap.put( boxLogging, "Shows current JDBC DriverManager logging mode. Click to change"); tipMap.put(boxShowSys, "Show system tables in table tree to the left"); tipMap.put(boxShowGrid, "Show query results in grid (in text if off)"); tipMap.put(boxRowCounts, "Show row counts with table names in tree"); boxAutoRefresh.setMnemonic(KeyEvent.VK_C); boxShowSchemas.setMnemonic(KeyEvent.VK_Y); boxAutoCommit.setMnemonic(KeyEvent.VK_A); boxShowSys.setMnemonic(KeyEvent.VK_Y); boxShowGrid.setMnemonic(KeyEvent.VK_G); boxRowCounts.setMnemonic(KeyEvent.VK_C); boxLogging.setMnemonic(KeyEvent.VK_L); rbAllSchemas.setMnemonic(KeyEvent.VK_ASTERISK); rbNativeLF.setMnemonic(KeyEvent.VK_N); rbJavaLF.setMnemonic(KeyEvent.VK_J); rbMotifLF.setMnemonic(KeyEvent.VK_M); mitemUpdateSchemas.setMnemonic(KeyEvent.VK_U); Object[] soptions = { // Added: (weconsultants@users) New menu options rbNativeLF, rbJavaLF, rbMotifLF, "--", "-Set Fonts", "--", boxAutoCommit, "--", "-Disable MaxRows", "-Set MaxRows to 100", "--", boxLogging, "--", "-Insert test data" }; addMenu(bar, "Options", soptions); String[] stools = { "-Dump", "-Restore", "-Transfer" }; jmenu = addMenu(bar, "Tools", stools); jmenu.setEnabled(TT_AVAILABLE); localActionList.add(jmenu); for (int i = 0; i < jmenu.getItemCount(); i++) { mitem = jmenu.getItem(i); if (mitem != null) { localActionList.add(mitem); } } mnuSchemas.setMnemonic(KeyEvent.VK_S); bar.add(mnuSchemas); JMenu mnuHelp = new JMenu("Help"); mnuHelp.setMnemonic(KeyEvent.VK_H); mnuHelp.add(mitemAbout); mnuHelp.add(mitemHelp); mnuHelp.add(boxTooltips); rbAllSchemas.addActionListener(schemaListListener); // May be illegal: mitemUpdateSchemas.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionevent) { updateSchemaList(); } }); mitemHelp.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionevent) { JOptionPane.showMessageDialog(fMain.getContentPane(), HELP_TEXT, "HELP", JOptionPane.INFORMATION_MESSAGE); } }); mitemAbout.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionevent) { JOptionPane.showMessageDialog(fMain.getContentPane(), ABOUT_TEXT, "About", JOptionPane.INFORMATION_MESSAGE); } }); boxTooltips.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionevent) { showTooltips = boxTooltips.isSelected(); resetTooltips(); } }); bar.add(mnuHelp); if (fMain instanceof JApplet) { ((JApplet) fMain).setJMenuBar(bar); } else if (fMain instanceof JFrame) { ((JFrame) fMain).setJMenuBar(bar); } initGUI(); sRecent = new String[iMaxRecent]; // Modified: (weconsultants@users)Mode code to CommonSwing for general use if (!(fMain instanceof JApplet)) { CommonSwing.setFramePositon((JFrame) fMain); } // Modified: (weconsultants@users) Changed from deprecated show() ((Component) fMain).setVisible(true); // (ulrivo): load query from command line if (defScript != null) { if (defDirectory != null) { defScript = defDirectory + File.separator + defScript; } // if insert stmet is thousands of records...skip showing it // as text. Too huge. sqlScriptBuffer = DatabaseManagerCommon.readFile(defScript); if (4096 <= sqlScriptBuffer.length()) { int eoThirdLine = sqlScriptBuffer.indexOf('\n'); if (eoThirdLine > 0) { eoThirdLine = sqlScriptBuffer.indexOf('\n', eoThirdLine + 1); } if (eoThirdLine > 0) { eoThirdLine = sqlScriptBuffer.indexOf('\n', eoThirdLine + 1); } if (eoThirdLine < 1) { eoThirdLine = 100; } txtCommand.setText( "............... Script File loaded: " + defScript + " ..................... \n" + "............... Click Execute or Clear " + "...................\n" + sqlScriptBuffer.substring(0, eoThirdLine + 1) + "..........................................." + "..............................\n" + "............................................." + "............................\n"); txtCommand.setEnabled(false); } else { txtCommand.setText(sqlScriptBuffer); sqlScriptBuffer = null; txtCommand.setEnabled(true); } } // This must be done AFTER all tip texts are put into the map resetTooltips(); txtCommand.requestFocus(); } private JMenu addMenu(JMenuBar b, String name, Object[] items) { JMenu menu = new JMenu(name); menu.setMnemonic(name.charAt(0)); addMenuItems(menu, items); b.add(menu); return menu; } private void addMenuItems(JMenu f, Object[] m) { /* * This method needs to be completely written or just * obliterated and we'll use the Menu objects directly. * Problem is, passing in Strings for menu elements makes it * extremely difficult to use non-text menu items (an important * part of a good Gui), hot-keys, mnemonic keys, tooltips. * Note the "trick" required here to set hot-keys. */ Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); for (int i = 0; i < m.length; i++) { if (m[i].equals("--")) { f.addSeparator(); } else if (m[i].equals("---")) { // (ulrivo): full size on screen with less than 640 width if (d.width >= 640) { f.addSeparator(); } else { return; } } else { JMenuItem item; if (m[i] instanceof JMenuItem) { item = (JMenuItem) m[i]; } else if (m[i] instanceof String) { item = new JMenuItem(((String) m[i]).substring(1)); char c = ((String) m[i]).charAt(0); if (c != '-') { KeyStroke key = KeyStroke.getKeyStroke(c, Event.CTRL_MASK); item.setAccelerator(key); } } else { throw new RuntimeException( "Unexpected element for menu item creation: " + m[i].getClass().getName()); } item.addActionListener(this); f.add(item); } } } public void keyPressed(KeyEvent k) {} public void keyReleased(KeyEvent k) {} public void keyTyped(KeyEvent k) { if (k.getKeyChar() == '\n' && k.isControlDown()) { k.consume(); executeCurrentSQL(); } } Thread dummyThread = new Thread("dummy"); public void actionPerformed(ActionEvent ev) { String s = ev.getActionCommand(); if (s == null) { if (ev.getSource() instanceof JMenuItem) { s = ((JMenuItem) ev.getSource()).getText(); } } if (s == null) {} else if (s.equals("Exit")) { windowClosing(null); } else if (s.equals("Transfer")) { Transfer.work(null); } else if (s.equals("Dump")) { Transfer.work(new String[]{ "-d" }); } else if (s.equals("Restore")) { JOptionPane.showMessageDialog( fMain.getContentPane(), "Use Ctrl-R or the View menu to\n" + "update nav. tree after Restoration", "Suggestion", JOptionPane.INFORMATION_MESSAGE); // Regardless of whether autoRefresh is on, half of // Restore runs asynchronously, so we could only // update the tree from within the Transfer class. Transfer.work(new String[]{ "-r" }); // Would be better to put the modal suggestion here, after the // user selects the import file, but that messes up the z // layering of the 3 windows already displayed. } else if (s.equals(LOGGING_BOX_TEXT)) { JavaSystem.setLogToSystem(boxLogging.isSelected()); } else if (s.equals(AUTOREFRESH_BOX_TEXT)) { autoRefresh = boxAutoRefresh.isSelected(); refreshTree(); } else if (s.equals("Refresh Tree")) { refreshTree(); } else if (s.startsWith("#")) { int i = Integer.parseInt(s.substring(1)); txtCommand.setText(sRecent[i]); } else if (s.equals("Connect...")) { Connection newCon = null; try { setWaiting("Connecting"); newCon = ConnectionDialogSwing.createConnection(jframe, "Connect"); } finally { setWaiting(null); } connect(newCon); } else if (s.equals(GRID_BOX_TEXT)) { gridFormat = boxShowGrid.isSelected(); displayResults(); } else if (s.equals("Open Script...")) { JFileChooser f = new JFileChooser("."); f.setDialogTitle("Open Script..."); // (ulrivo): set default directory if set from command line if (defDirectory != null) { f.setCurrentDirectory(new File(defDirectory)); } int option = f.showOpenDialog((Component) fMain); if (option == JFileChooser.APPROVE_OPTION) { File file = f.getSelectedFile(); if (file != null) { sqlScriptBuffer = DatabaseManagerCommon.readFile(file.getAbsolutePath()); if (4096 <= sqlScriptBuffer.length()) { int eoThirdLine = sqlScriptBuffer.indexOf('\n'); if (eoThirdLine > 0) { eoThirdLine = sqlScriptBuffer.indexOf('\n', eoThirdLine + 1); } if (eoThirdLine > 0) { eoThirdLine = sqlScriptBuffer.indexOf('\n', eoThirdLine + 1); } if (eoThirdLine < 1) { eoThirdLine = 100; } txtCommand.setText( "............... Script File loaded: " + file + " ..................... \n" + "............... Click Execute or Clear " + "...................\n" + sqlScriptBuffer.substring(0, eoThirdLine + 1) + "........................................." + "................................\n" + "..........................................." + "..............................\n"); txtCommand.setEnabled(false); } else { txtCommand.setText(sqlScriptBuffer); sqlScriptBuffer = null; txtCommand.setEnabled(true); } } } } else if (s.equals("Save Script...")) { JFileChooser f = new JFileChooser("."); f.setDialogTitle("Save Script"); // (ulrivo): set default directory if set from command line if (defDirectory != null) { f.setCurrentDirectory(new File(defDirectory)); } int option = f.showSaveDialog((Component) fMain); if (option == JFileChooser.APPROVE_OPTION) { File file = f.getSelectedFile(); if (file != null) { DatabaseManagerCommon.writeFile(file.getAbsolutePath(), txtCommand.getText()); } } } else if (s.equals("Save Result...")) { JFileChooser f = new JFileChooser("."); f.setDialogTitle("Save Result..."); // (ulrivo): set default directory if set from command line if (defDirectory != null) { f.setCurrentDirectory(new File(defDirectory)); } int option = f.showSaveDialog((Component) fMain); if (option == JFileChooser.APPROVE_OPTION) { File file = f.getSelectedFile(); if (file != null) { showResultInText(); DatabaseManagerCommon.writeFile(file.getAbsolutePath(), txtResult.getText()); } } } else if (s.equals(SHOWSYS_BOX_TEXT)) { showSys = boxShowSys.isSelected(); refreshTree(); } else if (s.equals(ROWCOUNTS_BOX_TEXT)) { displayRowCounts = boxRowCounts.isSelected(); refreshTree(); } else if (s.startsWith("LFMODE:")) { setLF(s.substring("LFMODE:".length())); } else if (s.equals("Set Fonts")) { // Added: (weconsultants@users) FontDialogSwing.creatFontDialog(refForFontDialogSwing); } else if (s.equals(AUTOCOMMIT_BOX_TEXT)) { try { cConn.setAutoCommit(boxAutoCommit.isSelected()); } catch (SQLException e) { boxAutoCommit.setSelected(!boxAutoCommit.isSelected()); // Added: (weconsultants@users) CommonSwing.errorMessage(e); } } else if (s.equals("COMMIT*")) { try { cConn.commit(); showHelp(new String[] { "", "COMMIT executed" }); } catch (SQLException e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } } else if (s.equals("Insert test data")) { insertTestData(); refreshTree(); } else if (s.equals("ROLLBACK*")) { try { cConn.rollback(); showHelp(new String[] { "", "ROLLBACK executed" }); } catch (SQLException e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } } else if (s.equals("Disable MaxRows")) { try { sStatement.setMaxRows(0); } catch (SQLException e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } } else if (s.equals("Set MaxRows to 100")) { try { sStatement.setMaxRows(100); } catch (SQLException e) { CommonSwing.errorMessage(e); } } else if (s.equals("SELECT")) { showHelp(DatabaseManagerCommon.selectHelp); } else if (s.equals("INSERT")) { showHelp(DatabaseManagerCommon.insertHelp); } else if (s.equals("UPDATE")) { showHelp(DatabaseManagerCommon.updateHelp); } else if (s.equals("DELETE")) { showHelp(DatabaseManagerCommon.deleteHelp); } else if (s.equals("EXECUTE")) { executeCurrentSQL(); } else if (s.equals("CREATE TABLE")) { showHelp(DatabaseManagerCommon.createTableHelp); } else if (s.equals("DROP TABLE")) { showHelp(DatabaseManagerCommon.dropTableHelp); } else if (s.equals("CREATE INDEX")) { showHelp(DatabaseManagerCommon.createIndexHelp); } else if (s.equals("DROP INDEX")) { showHelp(DatabaseManagerCommon.dropIndexHelp); } else if (s.equals("CHECKPOINT*")) { try { cConn.createStatement().executeUpdate("CHECKPOINT"); showHelp(new String[] { "", "CHECKPOINT executed" }); } catch (SQLException e) { CommonSwing.errorMessage(e); } } else if (s.equals("SCRIPT")) { showHelp(DatabaseManagerCommon.scriptHelp); } else if (s.equals("SHUTDOWN")) { showHelp(DatabaseManagerCommon.shutdownHelp); } else if (s.equals("SET")) { showHelp(DatabaseManagerCommon.setHelp); } else if (s.equals("Test Script")) { showHelp(DatabaseManagerCommon.testHelp); } else if (s.equals(SHOWSCHEMAS_BOX_TEXT)) { showSchemas = boxShowSchemas.isSelected(); refreshTree(); } else { throw new RuntimeException("Unexpected action triggered: " + s); } } private void displayResults() { if (gridFormat) { setResultsInGrid(); } else { setResultsInText(); } } private void setResultsInGrid() { pResult.removeAll(); pResult.add(gScrollPane, BorderLayout.CENTER); pResult.doLayout(); gResult.fireTableChanged(null); pResult.repaint(); } private void setResultsInText() { pResult.removeAll(); pResult.add(txtResultScroll, BorderLayout.CENTER); pResult.doLayout(); showResultInText(); pResult.repaint(); } private void showHelp(String[] help) { txtCommand.setText(help[0]); bHelp = true; pResult.removeAll(); pResult.add(txtResultScroll, BorderLayout.CENTER); pResult.doLayout(); txtResult.setText(help[1]); pResult.repaint(); txtCommand.requestFocus(); txtCommand.setCaretPosition(help[0].length()); } public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent ev) { stop(); try { if (cConn != null) { cConn.close(); } if (prefs != null) { prefs.autoRefresh = autoRefresh; prefs.showRowCounts = displayRowCounts; prefs.showSysTables = showSys; prefs.showSchemas = showSchemas; prefs.resultGrid = gridFormat; prefs.showTooltips = showTooltips; prefs.laf = currentLAF; prefs.store(); } } catch (Exception e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } if (fMain instanceof java.awt.Window) { ((java.awt.Window) fMain).dispose(); } if (bMustExit) { System.exit(0); } } private void clear() { sqlScriptBuffer = null; txtCommand.setText(""); txtCommand.setEnabled(true); } private String busyText = null; private void backgroundIt(Runnable r, String description) { if (busyText != null) { Toolkit.getDefaultToolkit().beep(); return; } // set Waiting mode here. Inverse op must be called by final() // in the Thread.run() of every background thread. setWaiting(description); SwingUtilities.invokeLater(r); } private void clearResultPanel() { gResult.setHead(new Object[0]); gResult.clear(); if (gridFormat) { gResult.fireTableChanged(null); } else { showResultInText(); } } public void setWaiting(String description) { busyText = description; if (busyText == null) { // restore the cursors we saved if (fMain instanceof java.awt.Frame) { ((java.awt.Frame) fMain).setCursor(fMainCursor); } else { ((Component) fMain).setCursor(fMainCursor); } txtCommand.setCursor(txtCommandCursor); txtResult.setCursor(txtResultCursor); /** @todo: Enable actionButtons */ } else { // save the old cursors if (fMainCursor == null) { fMainCursor = ((fMain instanceof java.awt.Frame) ? (((java.awt.Frame) fMain).getCursor()) : (((Component) fMain).getCursor())); txtCommandCursor = txtCommand.getCursor(); txtResultCursor = txtResult.getCursor(); } // set the cursors to the wait cursor if (fMain instanceof java.awt.Frame) { ((java.awt.Frame) fMain).setCursor(waitCursor); } else { ((Component) fMain).setCursor(waitCursor); } txtCommand.setCursor(waitCursor); txtResult.setCursor(waitCursor); /** @todo: Disable actionButtons */ } setStatusLine(busyText, ((busyText == null) ? gResult.getRowCount() : 0)); } private Runnable enableButtonRunnable = new Runnable() { public void run() { jbuttonClear.setEnabled(true); jbuttonExecute.setEnabled(true); } }; private Runnable disableButtonRunnable = new Runnable() { public void run() { jbuttonClear.setEnabled(false); jbuttonExecute.setEnabled(false); } }; private Thread buttonUpdaterThread = null; private static final int BUTTON_CHECK_PERIOD = 500; private Runnable buttonUpdater = new Runnable() { public void run() { boolean havesql; while (true) { try { Thread.sleep(BUTTON_CHECK_PERIOD); } catch (InterruptedException ie) {} if (buttonUpdaterThread == null) { // Pointer to me return; } havesql = (txtCommand.getText().length() > 0); if (jbuttonClear.isEnabled() != havesql) { SwingUtilities.invokeLater(havesql ? enableButtonRunnable : disableButtonRunnable); } } } }; private JButton jbuttonClear; private JButton jbuttonExecute; public void start() { if (buttonUpdaterThread == null) { buttonUpdaterThread = new Thread(buttonUpdater); } buttonUpdaterThread.start(); } public void stop() { System.err.println("Stopping"); Thread t = buttonUpdaterThread; if (t != null) { t.setContextClassLoader(null); } buttonUpdaterThread = null; } private Runnable treeRefreshRunnable = new Runnable() { public void run() { try { directRefreshTree(); } catch (RuntimeException re) { CommonSwing.errorMessage(re); throw re; } finally { setWaiting(null); } } }; /** * Schedules to run in a Gui-safe thread */ protected void executeCurrentSQL() { if (txtCommand.getText().length() < 1) { CommonSwing.errorMessage("No SQL to execute"); return; } backgroundIt(new StatementExecRunnable(), "Executing SQL"); } protected class StatementExecRunnable implements Runnable { public void run() { gResult.clear(); try { if (txtCommand.getText().startsWith("-->>>TEST<<<--")) { testPerformance(); } else { executeSQL(); } updateResult(); displayResults(); updateAutoCommitBox(); // System.gc(); } catch (RuntimeException re) { CommonSwing.errorMessage(re); throw re; } finally { setWaiting(null); } } } ; private void executeSQL() { String[] g = new String[1]; String sql = null; try { lTime = System.currentTimeMillis(); sql = ((sqlScriptBuffer == null ? txtCommand.getText() : sqlScriptBuffer)); sStatement.execute(sql); int r = sStatement.getUpdateCount(); if (r == -1) { ResultSet rs = sStatement.getResultSet(); try { formatResultSet(rs); } catch (Throwable t) { g[0] = "Error displaying the ResultSet"; gResult.setHead(g); String s = t.getMessage(); g[0] = s; gResult.addRow(g); } } else { g[0] = "update count"; gResult.setHead(g); g[0] = "" + r; gResult.addRow(g); } lTime = System.currentTimeMillis() - lTime; if (sqlScriptBuffer == null) { addToRecent(sql); txtCommand.setEnabled(true); // clear() does this otherwise } else { clear(); } } catch (SQLException e) { lTime = System.currentTimeMillis() - lTime; g[0] = "SQL Error"; gResult.setHead(g); String s = e.getMessage(); s += " / Error Code: " + e.getErrorCode(); s += " / State: " + e.getSQLState(); g[0] = s; gResult.addRow(g); // Added: (weconsultants@users) CommonSwing.errorMessage(e); return; } if (autoRefresh) { // We're already running in a "busy" thread. Just update the // status text. setStatusLine("Refreshing object tree", 0); String upper = sql.toUpperCase(Locale.ENGLISH); // This test can be very liberal. Too liberal will just do // some extra refreshes. Too conservative will display // obsolete info. if (upper.indexOf("ALTER") > -1 || upper.indexOf("DROP") > -1 || upper.indexOf("CREATE") > -1) { directRefreshTree(); } } } /** * Could somebody explain what the purpose of this method is? * Contrary to the method name, it looks like it displays * results only if gridFormat is off (seems like it does * nothing otherwise, except for clearing help text and moving focus). */ private void updateResult() { if (gridFormat) { // in case 'help' has removed the grid if (bHelp) { pResult.removeAll(); pResult.add(gScrollPane, BorderLayout.CENTER); pResult.doLayout(); gResult.fireTableChanged(null); pResult.repaint(); bHelp = false; } } else { showResultInText(); } txtCommand.selectAll(); txtCommand.requestFocus(); } /** * We let Swing handle displaying nulls (which it generally does by * printing nothing for them), except for the case of database * VARCHARs, because this is the only class where there is any * ambiguity about whether there is a null stored or not. */ private void formatResultSet(ResultSet r) { if (r == null) { String[] g = new String[1]; g[0] = "Result"; gResult.setHead(g); g[0] = "(empty)"; gResult.addRow(g); return; } try { ResultSetMetaData m = r.getMetaData(); int col = m.getColumnCount(); Object[] h = new Object[col]; boolean[] isVarChar = new boolean[col]; for (int i = 1; i <= col; i++) { h[i - 1] = m.getColumnLabel(i); isVarChar[i - 1] = (m.getColumnType(i) == java.sql.Types.VARCHAR); } gResult.setHead(h); while (r.next()) { for (int i = 1; i <= col; i++) { try { h[i - 1] = r.getObject(i); if (r.wasNull()) { h[i - 1] = (isVarChar[i - 1] ? NULL_STR : null); } } catch (SQLException e) {} } gResult.addRow(h); } r.close(); } catch (SQLException e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } } private void testPerformance() { String all = txtCommand.getText(); StringBuffer b = new StringBuffer(); long total = 0; for (int i = 0; i < all.length(); i++) { char c = all.charAt(i); if (c != '\n') { b.append(c); } } all = b.toString(); String[] g = new String[4]; g[0] = "ms"; g[1] = "count"; g[2] = "sql"; g[3] = "error"; gResult.setHead(g); int max = 1; lTime = System.currentTimeMillis() - lTime; while (!all.equals("")) { int i = all.indexOf(';'); String sql; if (i != -1) { sql = all.substring(0, i); all = all.substring(i + 1); } else { sql = all; all = ""; } if (sql.startsWith("--#")) { max = Integer.parseInt(sql.substring(3)); continue; } else if (sql.startsWith("--")) { continue; } g[2] = sql; long l = 0; try { l = DatabaseManagerCommon.testStatement(sStatement, sql, max); total += l; g[0] = "" + l; g[1] = "" + max; g[3] = ""; } catch (SQLException e) { g[0] = g[1] = "n/a"; g[3] = e.toString(); // Added: (weconsultants@users) CommonSwing.errorMessage(e); } gResult.addRow(g); System.out.println(l + " ms : " + sql); } g[0] = "" + total; g[1] = "total"; g[2] = ""; gResult.addRow(g); lTime = System.currentTimeMillis() - lTime; } private void showResultInText() { Object[] col = gResult.getHead(); int width = col.length; int[] size = new int[width]; Vector data = gResult.getData(); Object[] row; int height = data.size(); for (int i = 0; i < width; i++) { size[i] = col[i].toString().length(); } for (int i = 0; i < height; i++) { row = (Object[]) data.elementAt(i); for (int j = 0; j < width; j++) { String item = ((row[j] == null) ? "" : row[j].toString()); int l = item.length(); if (l > size[j]) { size[j] = l; } } } StringBuffer b = new StringBuffer(); for (int i = 0; i < width; i++) { b.append(col[i]); for (int l = col[i].toString().length(); l <= size[i]; l++) { b.append(' '); } } b.append(NL); for (int i = 0; i < width; i++) { for (int l = 0; l < size[i]; l++) { b.append('-'); } b.append(' '); } b.append(NL); for (int i = 0; i < height; i++) { row = (Object[]) data.elementAt(i); for (int j = 0; j < width; j++) { String item = ((row[j] == null) ? "" : row[j].toString()); b.append(item); for (int l = item.length(); l <= size[j]; l++) { b.append(' '); } } b.append(NL); } // b.append(NL + height + " row(s) in " + lTime + " ms"); // There is no reason why this report should be text-output-specific. // Moving it to bottom of the setWaiting method (where the report // gets written to the status line). // I'm only doing the rowcount now. Add the time report there if // you are so inclined. txtResult.setText(b.toString()); } private void addToRecent(String s) { for (int i = 0; i < iMaxRecent; i++) { if (s.equals(sRecent[i])) { return; } } if (sRecent[iRecent] != null) { mRecent.remove(iRecent); } sRecent[iRecent] = s; if (s.length() > 43) { s = s.substring(0, 40) + "..."; } JMenuItem item = new JMenuItem(s); item.setActionCommand("#" + iRecent); item.addActionListener(this); mRecent.insert(item, iRecent); iRecent = (iRecent + 1) % iMaxRecent; } // empty implementations for mouse listener. We're only using // mouseReleased public final void mouseClicked(final MouseEvent mouseEvent) {} public final void mouseEntered(final MouseEvent mouseEvent) {} public final void mouseExited(final MouseEvent mouseEvent) {} // Check for handlePopup in both mousePressed and mouseReleased. According to // MouseEvent javadocs it's necessary for cross platform compatibility. // We keep a record of the last alreadyHandled mouseEvent so we don't do it twice. private MouseEvent alreadyHandled = null; // mousePressed calls handlePopup, which creates the context-sensitive // helper menu. public final void mousePressed(final MouseEvent e) { if (alreadyHandled == e) { return; } handlePopup(e); alreadyHandled = e; } // mouseReleased calls handlePopup, which creates the context-sensitive // helper menu. public final void mouseReleased(final MouseEvent e) { if (alreadyHandled == e) { return; } handlePopup(e); alreadyHandled = e; } // based on the table or column right-clicked on, create some helper // actions for common sql statements public final void handlePopup(MouseEvent e) { //System.out.println("Handle popup"); // if this is not a mouse action for popups then do nothing and return if (!e.isPopupTrigger()) { return; } // make sure the source of this mouse event was from the tree Object source = e.getSource(); if (!(source instanceof JTree)) { return; } JTree tree = (JTree) source; TreePath treePath = tree.getPathForLocation(e.getX(), e.getY()); // if we couldn't find a tree path that corresponds to the // right-click, then return if (treePath == null) { return; } // create the popup and menus JPopupMenu popup = new JPopupMenu(); JMenuItem menuItem; String menus[] = new String[] { "Select", "Delete", "Update", "Insert" }; // loop throught the menus we want to create, making a PopupListener // for each one for (int i = 0; i < menus.length; i++) { PopupListener popupListener = new PopupListener(menus[i], treePath); String title = popupListener.toString(); if (title == null) { return; } // Some of the menu names can be quite long (especially insert). // If it's too long, abbreviate it if (title.length() > 40) { title = title.substring(0, 40) + "..."; } menuItem = new JMenuItem(title); menuItem.addActionListener(popupListener); popup.add(menuItem); } popup.show(e.getComponent(), e.getX(), e.getY()); } // handles the creation of the command when a popup is triggered private class PopupListener implements ActionListener { // used to identify depth while right clicking in tree. public static final int DEPTH_URL = 1; public static final int DEPTH_TABLE = 2; public static final int DEPTH_COLUMN = 3; String command; TreePath treePath; TreePath tablePath; TreePath columnPath; String table = null; String column = null; PopupListener(String command, TreePath treePath) { super(); this.command = command; this.treePath = treePath; } // when the popup is triggered, create a command string and set it in // the txtCommand buffer public void actionPerformed(ActionEvent ae) { txtCommand.setText(getCommandString()); } // text to display when added to a menu public String toString() { return getCommandString(); } // public String getCommandString() { int treeDepth = treePath.getPathCount(); // if we are at TABLE depth, set tablePath and table for use later if (treeDepth == DEPTH_URL) { return ""; } if (treeDepth == DEPTH_TABLE) { tablePath = treePath; table = treePath.getPathComponent(DEPTH_TABLE - 1).toString(); } // if we are at TABLE depth, set columnPath, column, tablePath and // table for use later if (treeDepth == DEPTH_COLUMN) { tablePath = treePath.getParentPath(); table = treePath.getPathComponent(DEPTH_TABLE - 1).toString(); columnPath = treePath; column = treePath.getPathComponent(DEPTH_COLUMN - 1).toString(); } // handle command "SELECT". Use table and column if set. if (command.toUpperCase().equals("SELECT")) { String result = "SELECT * FROM " + quoteTableName(table); if (column != null) { DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) treePath .getLastPathComponent(); String childName = null; boolean isChar; if (childNode.getChildCount() > 0) { childName = childNode.getFirstChild().toString(); isChar = childName.indexOf("CHAR") >= 0; result += " WHERE " + quoteObjectName(column); if (isChar) { result += " LIKE \'%%\'"; } else { result += " = "; } } } return result; } // handle command "UPDATE". Use table and column if set. else if (command.toUpperCase().equals("UPDATE")) { String result = "UPDATE " + quoteTableName(table) + " SET "; if (column != null) { result += quoteObjectName(column) + " = "; } return result; } // handle command "DELETE". Use table and column if set. else if (command.toUpperCase().equals("DELETE")) { String result = "DELETE FROM " + quoteTableName(table); if (column != null) { DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) treePath .getLastPathComponent(); String childName = null; boolean isChar; if (childNode.getChildCount() > 0) { childName = childNode.getFirstChild().toString(); isChar = childName.indexOf("CHAR") >= 0; result += " WHERE " + quoteObjectName(column); if (isChar) { result += " LIKE \'%%\'"; } else { result += " = "; } } } return result; } // handle command "INSERT". Use table and column if set. else if (command.toUpperCase().equals("INSERT")) { TreeNode tableNode; Enumeration enumer; String columns = ""; String values = " "; String comma = ""; String quote = ""; // build a string that includes all the columns that need to // be added, with a parenthesied list of commas, suitable for // inserting values into. if (tablePath == null) { return null; } tableNode = (TreeNode) tablePath.getLastPathComponent(); enumer = tableNode.children(); while (enumer.hasMoreElements()) { Object o = enumer.nextElement(); if (o.toString().equals("Indices")) { continue; } DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) o; String childName = null; if (childNode.getChildCount() == 0) { continue; } else { childName = childNode.getFirstChild().toString(); } // If our first child (type) is some sort of char, use '' // in the string. Makes is more obvious to the user when // they need to use a string if (childName.indexOf("CHAR") >= 0) { quote = "\'\'"; } else { quote = ""; } columns += comma + quoteObjectName(o.toString()); values += comma + quote; comma = ", "; } return "INSERT INTO " + quoteTableName(table) + "\n( " + columns + " )\nVALUES (" + values + ")"; } else { return "Got here in error " + command + ". Should never happen"; } } } /** * Perform a limited check (inconclusive) and quote object name if required. * Gives wrong result if a quoted name contains a dot. */ private String quoteTableName(String name) { int dot = name.indexOf("."); if (dot < 0) { int bracket = name.indexOf(" ("); if (bracket >= 0) { name = name.substring(0, bracket); } return quoteObjectName(name); } String partOne = name.substring(0, dot); String partTwo = name.substring(dot + 1); int bracket = partTwo.indexOf(" ("); if (bracket >= 0) { partTwo = partTwo.substring(0, bracket); } return quoteObjectName(partOne) + '.' + quoteObjectName(partTwo); } /** * perform a limited check (inconclusive) and quote object name if required */ private String quoteObjectName(String name) { /* if (name.toUpperCase().equals(name) && name.indexOf(' ') < 0) { return name; } */ return "\"" + name + "\""; } private void initGUI() { JPanel pCommand = new JPanel(); pResult = new JPanel(); nsSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, pCommand, pResult); // Added: (weconsultants@users) nsSplitPane.setOneTouchExpandable(true); pCommand.setLayout(new BorderLayout()); pResult.setLayout(new BorderLayout()); Font fFont = new Font("Dialog", Font.PLAIN, 12); txtCommand = new JTextArea(7, 40); txtCommand.setMargin(new Insets(5, 5, 5, 5)); txtCommand.addKeyListener(this); txtCommandScroll = new JScrollPane(txtCommand); txtResult = new JTextArea(25, 40); txtResult.setMargin(new Insets(5, 5, 5, 5)); txtResultScroll = new JScrollPane(txtResult); txtCommand.setFont(fFont); txtResult.setFont(new Font("Courier", Font.PLAIN, 12)); pCommand.add(txtCommandScroll, BorderLayout.CENTER); gResult = new GridSwing(); TableSorter sorter = new TableSorter(gResult); tableModel = sorter; gResultTable = new JTable(sorter); sorter.setTableHeader(gResultTable.getTableHeader()); gScrollPane = new JScrollPane(gResultTable); gResultTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); gResult.setJTable(gResultTable); //getContentPane().setLayout(new BorderLayout()); pResult.add(gScrollPane, BorderLayout.CENTER); // Set up the tree rootNode = new DefaultMutableTreeNode("Connection"); treeModel = new DefaultTreeModel(rootNode); tTree = new JTree(treeModel); tScrollPane = new JScrollPane(tTree); // System.out.println("Adding mouse listener"); tTree.addMouseListener(this); tScrollPane.setPreferredSize(new Dimension(200, 400)); tScrollPane.setMinimumSize(new Dimension(70, 100)); txtCommandScroll.setPreferredSize(new Dimension(560, 100)); txtCommandScroll.setMinimumSize(new Dimension(180, 100)); gScrollPane.setPreferredSize(new Dimension(460, 300)); ewSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tScrollPane, nsSplitPane); // Added: (weconsultants@users) ewSplitPane.setOneTouchExpandable(true); fMain.getContentPane().add(ewSplitPane, BorderLayout.CENTER); // Added: (weconsultants@users) jStatusLine = new JLabel(); iReadyStatus = new JButton(new ImageIcon(CommonSwing.getIcon("StatusReady"))); iReadyStatus.setSelectedIcon( new ImageIcon(CommonSwing.getIcon("StatusRunning"))); pStatus = new JPanel(); pStatus.setLayout(new BorderLayout()); pStatus.add(iReadyStatus, BorderLayout.WEST); pStatus.add(jStatusLine, BorderLayout.CENTER); fMain.getContentPane().add(pStatus, "South"); doLayout(); if (fMain instanceof java.awt.Window) { ((java.awt.Window) fMain).pack(); } else { ((Container) fMain).validate(); } } /* Simple tree node factory method - set's parent and user object. */ private DefaultMutableTreeNode makeNode(Object userObject, MutableTreeNode parent) { DefaultMutableTreeNode node = new DefaultMutableTreeNode(userObject); if (parent != null) { treeModel.insertNodeInto(node, parent, parent.getChildCount()); } return node; } private static final String[] usertables = { "TABLE", "GLOBAL TEMPORARY", "VIEW", "SYSTEM TABLE" }; private static final String[] nonSystables = { "TABLE", "GLOBAL TEMPORARY", "VIEW" }; private static final HashSet oracleSysUsers = new HashSet(); private static final String[] oracleSysSchemas = { "SYS", "SYSTEM", "OUTLN", "DBSNMP", "OUTLN", "MDSYS", "ORDSYS", "ORDPLUGINS", "CTXSYS", "DSSYS", "PERFSTAT", "WKPROXY", "WKSYS", "WMSYS", "XDB", "ANONYMOUS", "ODM", "ODM_MTR", "OLAPSYS", "TRACESVR", "REPADMIN" }; static { for (int i = 0; i < oracleSysSchemas.length; i++) { oracleSysUsers.add(oracleSysSchemas[i]); } } /** * Schedules to run in a Gui-safe thread */ protected void refreshTree() { backgroundIt(treeRefreshRunnable, "Refreshing object tree"); } /** * Clear all existing nodes from the tree model and rebuild from scratch. * * This method executes in current thread */ protected void directRefreshTree() { int[] rowCounts; DefaultMutableTreeNode propertiesNode; // Added: (weconsultants@users) Moved tableNode here for visibiity nd new DECFM DefaultMutableTreeNode tableNode; DecimalFormat DECFMT = new DecimalFormat(" ( ####,###,####,##0 )"); // First clear the existing tree by simply enumerating // over the root node's children and removing them one by one. while (treeModel.getChildCount(rootNode) > 0) { DefaultMutableTreeNode child = (DefaultMutableTreeNode) treeModel.getChild(rootNode, 0); treeModel.removeNodeFromParent(child); child.removeAllChildren(); child.removeFromParent(); } treeModel.nodeStructureChanged(rootNode); treeModel.reload(); tScrollPane.repaint(); ResultSet result = null; // Now rebuild the tree below its root try { // Start by naming the root node from its URL: rootNode.setUserObject(dMeta.getURL()); // get metadata about user tables by building a vector of table names result = dMeta.getTables(null, null, null, (showSys ? usertables : nonSystables)); Vector tables = new Vector(); Vector schemas = new Vector(); // sqlbob@users Added remarks. Vector remarks = new Vector(); String schema; while (result.next()) { schema = result.getString(2); if ((!showSys) && isOracle && oracleSysUsers.contains(schema)) { continue; } if (schemaFilter == null || schema.equals(schemaFilter)) { schemas.addElement(schema); tables.addElement(result.getString(3)); remarks.addElement(result.getString(5)); continue; } } result.close(); result = null; // Added: (weconsultants@users) // Sort not to go into production. Have to sync with 'remarks Vector' for DBMS that has it // Collections.sort(tables); // Added: (weconsultants@users) - Add rowCounts if needed. rowCounts = new int[tables.size()]; try { rowCounts = getRowCounts(tables, schemas); } catch (Exception e) { // Added: (weconsultants@users) CommonSwing.errorMessage(e); } ResultSet col; // For each table, build a tree node with interesting info for (int i = 0; i < tables.size(); i++) { col = null; String name; try { name = (String) tables.elementAt(i); if (isOracle && name.startsWith("BIN$")) { continue; // Oracle Recyle Bin tables. // Contains metacharacters which screw up metadata // queries below. } schema = (String) schemas.elementAt(i); String schemaname = ""; if (schema != null && showSchemas) { schemaname = schema + '.'; } String rowcount = displayRowCounts ? (" " + DECFMT.format(rowCounts[i])) : ""; String displayedName = schemaname + name + rowcount; // weconsul@ptd.net Add rowCounts if needed. tableNode = makeNode(displayedName, rootNode); col = dMeta.getColumns(null, schema, name, null); if ((schema != null) && !schema.trim().equals("")) { makeNode(schema, tableNode); } // sqlbob@users Added remarks. String remark = (String) remarks.elementAt(i); if ((remark != null) && !remark.trim().equals("")) { makeNode(remark, tableNode); } // This block is very slow for some Oracle tables. // With a child for each column containing pertinent attributes while (col.next()) { String c = col.getString(4); DefaultMutableTreeNode columnNode = makeNode(c, tableNode); String type = col.getString(6); makeNode("Type: " + type, columnNode); boolean nullable = col.getInt(11) != DatabaseMetaData.columnNoNulls; makeNode("Nullable: " + nullable, columnNode); } } finally { if (col != null) { try { col.close(); } catch (SQLException se) {} } } DefaultMutableTreeNode indexesNode = makeNode("Indices", tableNode); if (showIndexDetails) { ResultSet ind = null; try { ind = dMeta.getIndexInfo(null, schema, name, false, false); String oldiname = null; DefaultMutableTreeNode indexNode = null; // A child node to contain each index - and its attributes while (ind.next()) { boolean nonunique = ind.getBoolean(4); String iname = ind.getString(6); if ((oldiname == null || !oldiname.equals(iname))) { indexNode = makeNode(iname, indexesNode); makeNode("Unique: " + !nonunique, indexNode); oldiname = iname; } // And the ordered column list for index components makeNode(ind.getString(9), indexNode); } } catch (SQLException se) { // Workaround for Oracle if (se.getMessage() == null || ((!se.getMessage() .startsWith("ORA-25191:")) && (!se.getMessage() .startsWith("ORA-01702:")) && !se.getMessage() .startsWith("ORA-01031:"))) { throw se; } } finally { if (ind != null) { ind.close(); ind = null; } } } } // Finally - a little additional metadata on this connection propertiesNode = makeNode("Properties", rootNode); makeNode("User: " + dMeta.getUserName(), propertiesNode); makeNode("ReadOnly: " + cConn.isReadOnly(), propertiesNode); makeNode("AutoCommit: " + cConn.getAutoCommit(), propertiesNode); makeNode("Driver: " + dMeta.getDriverName(), propertiesNode); makeNode("Product: " + dMeta.getDatabaseProductName(), propertiesNode); makeNode("Version: " + dMeta.getDatabaseProductVersion(), propertiesNode); } catch (SQLException se) { propertiesNode = makeNode("Error getting metadata:", rootNode); makeNode(se.getMessage(), propertiesNode); makeNode(se.getSQLState(), propertiesNode); CommonSwing.errorMessage(se); } finally { if (result != null) { try { result.close(); } catch (SQLException se) {} } } treeModel.nodeStructureChanged(rootNode); treeModel.reload(); tScrollPane.repaint(); // We want the Schema List to always be in sync with the displayed tree updateSchemaList(); } // Added: (weconsultants@users) Sets up\changes the running status icon void setStatusLine(String busyBaseString, int rowCount) { iReadyStatus.setSelected(busyBaseString != null); if (busyBaseString == null) { String additionalMsg = ""; if (schemaFilter != null) { additionalMsg = " / Tree showing objects in schema '" + schemaFilter + "'"; } if (rowCount > 1) { additionalMsg += " / " + rowCount + " rows retrieved"; } jStatusLine.setText(" " + READY_STATUS + additionalMsg); } else { jStatusLine.setText(" " + busyBaseString + "..."); } } // Added: (weconsultants@users) Needed to aggragate counts per table in jTree protected int[] getRowCounts(Vector inTable, Vector inSchema) throws Exception { if (!displayRowCounts) { return (null); } String rowCountSelect = "SELECT COUNT(*) FROM "; int[] counts; String name; counts = new int[inTable.size()]; try { Statement select = rowConn.createStatement(); for (int i = 0; i < inTable.size(); i++) { try { String schemaPart = (String) inSchema.elementAt(i); schemaPart = schemaPart == null ? "" : ("\"" + schemaPart + "\".\""); name = schemaPart + (String) inTable.elementAt(i) + "\""; ResultSet resultSet = select.executeQuery(rowCountSelect + name); while (resultSet.next()) { counts[i] = resultSet.getInt(1); } } catch (Exception e) { System.err.println("Unable to get row count for table " + inSchema.elementAt(i) + '.' + inTable.elementAt(i) + ". Using value '0': " + e); } } } catch (Exception e) { CommonSwing.errorMessage(e); } return (counts); } protected JToolBar createToolBar() { // Build jtoolbar and jtoolbar Buttons JToolBar jtoolbar = new JToolBar(); jtoolbar.putClientProperty("JToolBar.isRollover", Boolean.TRUE); // I'm dropping "Statement" from "Execute SQL Statement", etc., // because it may or may not be "one statement", but it is SQL. // Build jbuttonClear Buttons - blaine jbuttonClear = new JButton("Clear SQL", new ImageIcon(CommonSwing.getIcon("Clear"))); jbuttonClear.putClientProperty("is3DEnabled", Boolean.TRUE); tipMap.put(jbuttonClear, "Clear SQL"); jbuttonClear.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionevent) { if (sqlScriptBuffer == null && txtCommand.getText().length() < 1) { CommonSwing.errorMessage("No SQL to clear"); return; } clear(); } }); jbuttonExecute = new JButton("Execute SQL", new ImageIcon(CommonSwing.getIcon("Execute"))); tipMap.put(jbuttonExecute, "Execute SQL"); jbuttonExecute.putClientProperty("is3DEnabled", Boolean.TRUE); jbuttonExecute.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionevent) { executeCurrentSQL(); } }); jtoolbar.addSeparator(); jtoolbar.add(jbuttonClear); jtoolbar.addSeparator(); jtoolbar.add(jbuttonExecute); jtoolbar.addSeparator(); jbuttonClear.setAlignmentY(0.5F); jbuttonClear.setAlignmentX(0.5F); jbuttonExecute.setAlignmentY(0.5F); jbuttonExecute.setAlignmentX(0.5F); return jtoolbar; } void updateAutoCommitBox() { try { boxAutoCommit.setSelected(cConn.getAutoCommit()); } catch (SQLException se) { CommonSwing.errorMessage(se); } } private void setLF(String newLAF) { if (currentLAF != null && currentLAF == newLAF) { // No change return; } if (pResult != null && gridFormat) { pResult.removeAll(); } CommonSwing.setSwingLAF((Component) fMain, newLAF); if (pResult != null && gridFormat) { setResultsInGrid(); } currentLAF = newLAF; if (currentLAF.equals(CommonSwing.Native)) { rbNativeLF.setSelected(true); } else if (currentLAF.equals(CommonSwing.Java)) { rbJavaLF.setSelected(true); } else if (currentLAF.equals(CommonSwing.Motif)) { rbMotifLF.setSelected(true); } } void resetTooltips() { Iterator it = tipMap.keySet().iterator(); JComponent component; while (it.hasNext()) { component = (JComponent) it.next(); component.setToolTipText(showTooltips ? ((String) tipMap.get(component)) : (String) null); } } private void updateSchemaList() { ButtonGroup group = new ButtonGroup(); ArrayList list = new ArrayList(); ResultSet result = null; try { result = dMeta.getSchemas(); if (result == null) { throw new SQLException("Failed to get metadata from database"); } while (result.next()) { list.add(result.getString(1)); } } catch (SQLException se) { CommonSwing.errorMessage(se); } finally { if (result != null) { try { result.close(); } catch (SQLException se) {} } } mnuSchemas.removeAll(); rbAllSchemas.setSelected(schemaFilter == null); group.add(rbAllSchemas); mnuSchemas.add(rbAllSchemas); String s; JRadioButtonMenuItem radioButton; for (int i = 0; i < list.size(); i++) { s = (String) list.get(i); radioButton = new JRadioButtonMenuItem(s); group.add(radioButton); mnuSchemas.add(radioButton); radioButton.setSelected(schemaFilter != null && schemaFilter.equals(s)); radioButton.addActionListener(schemaListListener); radioButton.setEnabled(list.size() > 1); } mnuSchemas.addSeparator(); mnuSchemas.add(mitemUpdateSchemas); } ActionListener schemaListListener = (new ActionListener() { public void actionPerformed(ActionEvent actionevent) { schemaFilter = actionevent.getActionCommand(); if (schemaFilter.equals("*")) { schemaFilter = null; } refreshTree(); } }); /** * Persisted User Preferences for DatabaseManagerSwing. * * These are settings for items in the View and Options pulldown menus, * plus Help/Show Tooltips. */ public class DBMPrefs { public File prefsFile = null; /** * The constructor guarantees that this will be null for Applet, * non-null if using a local preferences file */ // Set defaults from Data boolean autoRefresh = true; boolean showRowCounts = false; boolean showSysTables = false; boolean showSchemas = true; boolean resultGrid = true; String laf = CommonSwing.Native; // Somebody with more time can store the font settings. IMO, that // menu item shouldn't even be there if the settings aren't persisted. boolean showTooltips = true; public DBMPrefs(boolean isApplet) throws IOException { if (isApplet) {} else { if (homedir == null) { throw new IOException( "Skipping preferences since do not know home dir"); } prefsFile = new File(homedir, "dbmprefs.properties"); } load(); } public void load() throws IOException { String tmpString; if (prefsFile == null) { // LOAD PREFERENCES FROM APPLET PARAMS tmpString = getParameter("autoRefresh"); if (tmpString != null) { autoRefresh = Boolean.valueOf(tmpString).booleanValue(); } tmpString = getParameter("showRowCounts"); if (tmpString != null) { showRowCounts = Boolean.valueOf(tmpString).booleanValue(); } tmpString = getParameter("showSysTables"); if (tmpString != null) { showSysTables = Boolean.valueOf(tmpString).booleanValue(); } tmpString = getParameter("showSchemas"); if (tmpString != null) { showSchemas = Boolean.valueOf(tmpString).booleanValue(); } tmpString = getParameter("resultGrid"); if (tmpString != null) { resultGrid = Boolean.valueOf(tmpString).booleanValue(); } tmpString = getParameter("laf"); laf = ((tmpString == null) ? CommonSwing.Native : tmpString); tmpString = getParameter("showTooltips"); if (tmpString != null) { showTooltips = Boolean.valueOf(tmpString).booleanValue(); } } else { // LOAD PREFERENCES FROM LOCAL PREFERENCES FILE if (!prefsFile.exists()) { throw new IOException("No such file: " + prefsFile); } Properties props = new Properties(); try { FileInputStream fis = new FileInputStream(prefsFile); props.load(fis); fis.close(); } catch (IOException ioe) { throw new IOException("Failed to read preferences file '" + prefsFile + "': " + ioe.getMessage()); } tmpString = props.getProperty("autoRefresh"); if (tmpString != null) { autoRefresh = Boolean.valueOf(tmpString).booleanValue(); } tmpString = props.getProperty("showRowCounts"); if (tmpString != null) { showRowCounts = Boolean.valueOf(tmpString).booleanValue(); } tmpString = props.getProperty("showSysTables"); if (tmpString != null) { showSysTables = Boolean.valueOf(tmpString).booleanValue(); } tmpString = props.getProperty("showSchemas"); if (tmpString != null) { showSchemas = Boolean.valueOf(tmpString).booleanValue(); } tmpString = props.getProperty("resultGrid"); if (tmpString != null) { resultGrid = Boolean.valueOf(tmpString).booleanValue(); } tmpString = props.getProperty("laf"); laf = ((tmpString == null) ? CommonSwing.Native : tmpString); tmpString = props.getProperty("showTooltips"); if (tmpString != null) { showTooltips = Boolean.valueOf(tmpString).booleanValue(); } } } public void store() { if (prefsFile == null) { // Can't persist Applet settings. return; } Properties props = new Properties(); // Boolean.toString(boolean) was new with Java 1.4, so don't use that. props.setProperty("autoRefresh", (autoRefresh ? tString : fString)); props.setProperty("showRowCounts", (showRowCounts ? tString : fString)); props.setProperty("showSysTables", (showSysTables ? tString : fString)); props.setProperty("showSchemas", (showSchemas ? tString : fString)); props.setProperty("resultGrid", (resultGrid ? tString : fString)); props.setProperty("laf", laf); props.setProperty("showTooltips", (showTooltips ? tString : fString)); try { FileOutputStream fos = new FileOutputStream(prefsFile); props.store(fos, "DatabaseManagerSwing user preferences"); fos.flush(); fos.close(); } catch (IOException ioe) { throw new RuntimeException( "Failed to prepare preferences file '" + prefsFile + "': " + ioe.getMessage()); } } } private static final String tString = Boolean.TRUE.toString(); private static final String fString = Boolean.FALSE.toString(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/CodeSwitcher.java0000644000175000017500000004103012007547374023150 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.util; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.LineNumberReader; import java.util.Vector; // fredt@users 20020315 - patch 1.7.0 - minor fixes // changed line separator to System based value // moved the Profile class to org.hsqldb.test package // fredt@users 20021020 - patch 1.7.1 - formatting fix // avoid moving blank lines which would be interpreted as code change by CVS // fredt@users 20021118 - patch 1.7.2 - no-change, no-save fix // if the file contents do not change, do not save a new version of file // fredt@users 20040322 - removed unused profiling code // fredt@users 20080315 - added ifndef switch /** * Modifies the source code to support different JDK or profile settings.

              *

               * Usage: java CodeSwitcher paths|{--pathlist=listfile} [{+|-}label...] [+][-]
               * If no labels are specified then all used
               * labels in the source code are shown.
               * Use +MODE to switch on the things labeld MODE
               * Use -MODE to switch off the things labeld MODE
               * Path: Any number of path or files may be
               * specified. Use . for the current directory
               * (including sub-directories).
               * Example: java CodeSwitcher +JAVA2 .
               * This example switches on code labeled JAVA2
               * in all *.java files in the current directory
               * and all subdirectories.
               * java CodeSwitcher + .
               * Adds test code to the code.
               * java CodeSwitcher - .
               * Removes test code from the code
               * 
              * * @author Thomas Mueller (Hypersonic SQL Group) * @version 1.7.0 * @since Hypersonic SQL */ public class CodeSwitcher { private static final String ls = System.getProperty("line.separator", "\n"); private Vector vList; private Vector vSwitchOn; private Vector vSwitchOff; private Vector vSwitches; private static final int MAX_LINELENGTH = 82; /** * Method declaration * * * @param a */ public static void main(String[] a) { CodeSwitcher s = new CodeSwitcher(); if (a.length == 0) { showUsage(); return; } File listFile = null; File baseDir = null; for (int i = 0; i < a.length; i++) { String p = a[i]; if (p.startsWith("+")) { s.vSwitchOn.addElement(p.substring(1)); } else if (p.startsWith("--basedir=")) { baseDir = new File(p.substring("--basedir=".length())); } else if (p.startsWith("--pathlist=")) { listFile = new File(p.substring("--pathlist=".length())); } else if (p.startsWith("-")) { s.vSwitchOff.addElement(p.substring(1)); } else { s.addDir(p); } } if (baseDir != null) { if (listFile == null) { System.err.println( "--basedir= setting ignored, since only used for list files"); } else { if (!baseDir.isDirectory()) { System.err.println("Skipping listfile since basedir '" + baseDir.getAbsolutePath() + "' is not a directory"); listFile = null; } } } if (listFile != null) { try { BufferedReader br = new BufferedReader(new FileReader(listFile)); String st, p; int hashIndex; File f; while ((st = br.readLine()) != null) { hashIndex = st.indexOf('#'); p = ((hashIndex > -1) ? st.substring(0, hashIndex) : st).trim(); if (p.length() < 1) { continue; } f = (baseDir == null) ? (new File(p)) : (new File(baseDir, p)); if (f.isFile()) { s.addDir(f); } else { System.err.println("Skipping non-file '" + p.trim() + "'"); } } } catch (Exception e) { System.err.println("Failed to read pathlist file '" + listFile.getAbsolutePath() + "'"); } } if (s.size() < 1) { printError("No path specified, or no specified paths qualify"); showUsage(); } s.process(); if (s.vSwitchOff.size() == 0 && s.vSwitchOn.size() == 0) { s.printSwitches(); } } public int size() { return (vList == null) ? 0 : vList.size(); } /** * Method declaration * */ static void showUsage() { System.out.print("Usage: java CodeSwitcher paths|{--pathlist=listfile} " + "[{+|-}label...] [+][-]\n" + "If no labels are specified then all used\n" + "labels in the source code are shown.\n" + "Use +MODE to switch on the things labeld MODE\n" + "Use -MODE to switch off the things labeld MODE\n" + "Path: Any number of path or files may be\n" + "specified. Use . for the current directory\n" + "(including sub-directories).\n" + "Example: java CodeSwitcher +JAVA2 .\n" + "This example switches on code labeled JAVA2\n" + "in all *.java files in the current directory\n" + "and all subdirectories.\n"); } /** * Constructor declaration * */ CodeSwitcher() { vList = new Vector(); vSwitchOn = new Vector(); vSwitchOff = new Vector(); vSwitches = new Vector(); } /** * Method declaration * */ void process() { int len = vList.size(); for (int i = 0; i < len; i++) { System.out.print("."); String file = (String) vList.elementAt(i); if (!processFile(file)) { System.out.println("in file " + file + " !"); } } System.out.println(""); } /** * Method declaration * */ void printSwitches() { System.out.println("Used labels:"); for (int i = 0; i < vSwitches.size(); i++) { System.out.println((String) (vSwitches.elementAt(i))); } } /** * Wrapper * * @param path */ void addDir(String path) { addDir(new File(path)); } void addDir(File f) { if (f.isFile() && f.getName().endsWith(".java")) { vList.addElement(f.getPath()); } else if (f.isDirectory()) { File[] list = f.listFiles(); for (int i = 0; i < list.length; i++) { addDir(list[i]); } } } /** * Method declaration * * * @param name */ boolean processFile(String name) { File f = new File(name); File fnew = new File(name + ".new"); int state = 0; // 0=normal 1=inside_if 2=inside_else boolean switchoff = false; boolean working = false; try { Vector v = getFileLines(f); Vector v1 = new Vector(v.size()); for (int i = 0; i < v.size(); i++) { v1.addElement(v.elementAt(i)); } for (int i = 0; i < v.size(); i++) { String line = (String) v.elementAt(i); if (line == null) { break; } if (working) { if (line.equals("/*") || line.equals("*/")) { v.removeElementAt(i--); continue; } } if (line.startsWith("//#")) { if (line.startsWith("//#ifdef ")) { if (state != 0) { printError("'#ifdef' not allowed inside '#ifdef'"); return false; } state = 1; String s = line.substring(9); if (vSwitchOn.indexOf(s) != -1) { working = true; switchoff = false; } else if (vSwitchOff.indexOf(s) != -1) { working = true; v.insertElementAt("/*", ++i); switchoff = true; } if (vSwitches.indexOf(s) == -1) { vSwitches.addElement(s); } } else if (line.startsWith("//#ifndef ")) { if (state != 0) { printError( "'#ifndef' not allowed inside '#ifdef'"); return false; } state = 1; String s = line.substring(10); if (vSwitchOff.indexOf(s) != -1) { working = true; switchoff = false; } else if (vSwitchOn.indexOf(s) != -1) { working = true; v.insertElementAt("/*", ++i); switchoff = true; } if (vSwitches.indexOf(s) == -1) { vSwitches.addElement(s); } } else if (line.startsWith("//#else")) { if (state != 1) { printError("'#else' without '#ifdef'"); return false; } state = 2; if (!working) {} else if (switchoff) { if (v.elementAt(i - 1).equals("")) { v.insertElementAt("*/", i - 1); i++; } else { v.insertElementAt("*/", i++); } switchoff = false; } else { v.insertElementAt("/*", ++i); switchoff = true; } } else if (line.startsWith("//#endif")) { if (state == 0) { printError("'#endif' without '#ifdef'"); return false; } state = 0; if (working && switchoff) { if (v.elementAt(i - 1).equals("")) { v.insertElementAt("*/", i - 1); i++; } else { v.insertElementAt("*/", i++); } } working = false; } else {} } } if (state != 0) { printError("'#endif' missing"); return false; } boolean filechanged = false; for (int i = 0; i < v.size(); i++) { if (!v1.elementAt(i).equals(v.elementAt(i))) { filechanged = true; break; } } if (!filechanged) { return true; } writeFileLines(v, fnew); File fbak = new File(name + ".bak"); fbak.delete(); f.renameTo(fbak); File fcopy = new File(name); fnew.renameTo(fcopy); fbak.delete(); return true; } catch (Exception e) { printError(e.toString()); return false; } } static Vector getFileLines(File f) throws IOException { LineNumberReader read = new LineNumberReader(new FileReader(f)); Vector v = new Vector(); for (;;) { String line = read.readLine(); if (line == null) { break; } v.addElement(line); } read.close(); return v; } static void writeFileLines(Vector v, File f) throws IOException { FileWriter write = new FileWriter(f); for (int i = 0; i < v.size(); i++) { write.write((String) v.elementAt(i)); write.write(ls); } write.flush(); write.close(); } /** * Method declaration * * * @param error */ static void printError(String error) { System.out.println(""); System.out.println("ERROR: " + error); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/TableSorter.java0000644000175000017500000004443712007547374023031 0ustar renerenepackage org.hsqldb.util; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; /** * TableSorter is a decorator for TableModels; adding sorting * functionality to a supplied TableModel. TableSorter does * not store or copy the data in its TableModel; instead it maintains * a map from the row indexes of the view to the row indexes of the * model. As requests are made of the sorter (like getValueAt(row, col)) * they are passed to the underlying model after the row numbers * have been translated via the internal mapping array. This way, * the TableSorter appears to hold another copy of the table * with the rows in a different order. *

              * TableSorter registers itself as a listener to the underlying model, * just as the JTable itself would. Events recieved from the model * are examined, sometimes manipulated (typically widened), and then * passed on to the TableSorter's listeners (typically the JTable). * If a change to the model has invalidated the order of TableSorter's * rows, a note of this is made and the sorter will resort the * rows the next time a value is requested. *

              * When the tableHeader property is set, either by using the * setTableHeader() method or the two argument constructor, the * table header may be used as a complete UI for TableSorter. * The default renderer of the tableHeader is decorated with a renderer * that indicates the sorting status of each column. In addition, * a mouse listener is installed with the following behavior: *

                *
              • * Mouse-click: Clears the sorting status of all other columns * and advances the sorting status of that column through three * values: {NOT_SORTED, ASCENDING, DESCENDING} (then back to * NOT_SORTED again). *
              • * SHIFT-mouse-click: Clears the sorting status of all other columns * and cycles the sorting status of the column through the same * three values, in the opposite order: {NOT_SORTED, DESCENDING, ASCENDING}. *
              • * CONTROL-mouse-click and CONTROL-SHIFT-mouse-click: as above except * that the changes to the column do not cancel the statuses of columns * that are already sorting - giving a way to initiate a compound * sort. *
              *

              * This is a long overdue rewrite of a class of the same name that * first appeared in the swing table demos in 1997. * * @author Philip Milne * @author Brendon McLean * @author Dan van Enckevort * @author Parwinder Sekhon * @version 2.0 02/27/04 */ public class TableSorter extends AbstractTableModel { protected TableModel tableModel; public static final int DESCENDING = -1; public static final int NOT_SORTED = 0; public static final int ASCENDING = 1; private static Directive EMPTY_DIRECTIVE = new Directive(-1, NOT_SORTED); public static final Comparator COMPARABLE_COMPARATOR = new Comparator() { public int compare(Object o1, Object o2) { if (o1 == o2) { return 0; } if (o1 == null) { if (o2 == null) { return 0; } return -1; } if (o2 == null) { return 1; } return ((Comparable) o1).compareTo(o2); } }; public static final Comparator LEXICAL_COMPARATOR = new Comparator() { public int compare(Object o1, Object o2) { return o1.toString().compareTo(o2.toString()); } }; private Row[] viewToModel; private int[] modelToView; private JTableHeader tableHeader; private MouseListener mouseListener; private TableModelListener tableModelListener; private Map columnComparators = new HashMap(); private List sortingColumns = new ArrayList(); public TableSorter() { this.mouseListener = new MouseHandler(); this.tableModelListener = new TableModelHandler(); } public TableSorter(TableModel tableModel) { this(); setTableModel(tableModel); } public TableSorter(TableModel tableModel, JTableHeader tableHeader) { this(); setTableHeader(tableHeader); setTableModel(tableModel); } private void clearSortingState() { viewToModel = null; modelToView = null; } public TableModel getTableModel() { return tableModel; } public void setTableModel(TableModel tableModel) { if (this.tableModel != null) { this.tableModel.removeTableModelListener(tableModelListener); } this.tableModel = tableModel; if (this.tableModel != null) { this.tableModel.addTableModelListener(tableModelListener); } clearSortingState(); fireTableStructureChanged(); } public JTableHeader getTableHeader() { return tableHeader; } public void setTableHeader(JTableHeader tableHeader) { if (this.tableHeader != null) { this.tableHeader.removeMouseListener(mouseListener); TableCellRenderer defaultRenderer = this.tableHeader.getDefaultRenderer(); if (defaultRenderer instanceof SortableHeaderRenderer) { this.tableHeader.setDefaultRenderer( ((SortableHeaderRenderer) defaultRenderer) .tableCellRenderer); } } this.tableHeader = tableHeader; if (this.tableHeader != null) { this.tableHeader.addMouseListener(mouseListener); this.tableHeader.setDefaultRenderer( new SortableHeaderRenderer( this.tableHeader.getDefaultRenderer())); } } public boolean isSorting() { return sortingColumns.size() != 0; } private Directive getDirective(int column) { for (int i = 0; i < sortingColumns.size(); i++) { Directive directive = (Directive) sortingColumns.get(i); if (directive.column == column) { return directive; } } return EMPTY_DIRECTIVE; } public int getSortingStatus(int column) { return getDirective(column).direction; } private void sortingStatusChanged() { clearSortingState(); fireTableDataChanged(); if (tableHeader != null) { tableHeader.repaint(); } } public void setSortingStatus(int column, int status) { Directive directive = getDirective(column); if (directive != EMPTY_DIRECTIVE) { sortingColumns.remove(directive); } if (status != NOT_SORTED) { sortingColumns.add(new Directive(column, status)); } sortingStatusChanged(); } protected Icon getHeaderRendererIcon(int column, int size) { Directive directive = getDirective(column); if (directive == EMPTY_DIRECTIVE) { return null; } return new Arrow(directive.direction == DESCENDING, size, sortingColumns.indexOf(directive)); } private void cancelSorting() { sortingColumns.clear(); sortingStatusChanged(); } public void setColumnComparator(Class type, Comparator comparator) { if (comparator == null) { columnComparators.remove(type); } else { columnComparators.put(type, comparator); } } protected Comparator getComparator(int column) { Class columnType = tableModel.getColumnClass(column); Comparator comparator = (Comparator) columnComparators.get(columnType); if (comparator != null) { return comparator; } if (Comparable.class.isAssignableFrom(columnType)) { return COMPARABLE_COMPARATOR; } return LEXICAL_COMPARATOR; } private Row[] getViewToModel() { if (viewToModel == null) { int tableModelRowCount = tableModel.getRowCount(); viewToModel = new Row[tableModelRowCount]; for (int row = 0; row < tableModelRowCount; row++) { viewToModel[row] = new Row(row); } if (isSorting()) { Arrays.sort(viewToModel); } } return viewToModel; } public int modelIndex(int viewIndex) { return getViewToModel()[viewIndex].modelIndex; } private int[] getModelToView() { if (modelToView == null) { int n = getViewToModel().length; modelToView = new int[n]; for (int i = 0; i < n; i++) { modelToView[modelIndex(i)] = i; } } return modelToView; } // TableModel interface methods public int getRowCount() { return (tableModel == null) ? 0 : tableModel.getRowCount(); } public int getColumnCount() { return (tableModel == null) ? 0 : tableModel.getColumnCount(); } public String getColumnName(int column) { return tableModel.getColumnName(column); } public Class getColumnClass(int column) { return tableModel.getColumnClass(column); } public boolean isCellEditable(int row, int column) { return tableModel.isCellEditable(modelIndex(row), column); } public Object getValueAt(int row, int column) { return tableModel.getValueAt(modelIndex(row), column); } public void setValueAt(Object aValue, int row, int column) { tableModel.setValueAt(aValue, modelIndex(row), column); } // Helper classes private class Row implements Comparable { private int modelIndex; public Row(int index) { this.modelIndex = index; } public int compareTo(Object o) { int row1 = modelIndex; int row2 = ((Row) o).modelIndex; for (Iterator it = sortingColumns.iterator(); it.hasNext(); ) { Directive directive = (Directive) it.next(); int column = directive.column; Object o1 = tableModel.getValueAt(row1, column); Object o2 = tableModel.getValueAt(row2, column); int comparison = 0; // Define null less than everything, except null. if (o1 == null && o2 == null) { comparison = 0; } else if (o1 == null) { comparison = -1; } else if (o2 == null) { comparison = 1; } else { comparison = getComparator(column).compare(o1, o2); } if (comparison != 0) { return directive.direction == DESCENDING ? -comparison : comparison; } } return 0; } } private class TableModelHandler implements TableModelListener { public void tableChanged(TableModelEvent e) { // If we're not sorting by anything, just pass the event along. if (!isSorting()) { clearSortingState(); fireTableChanged(e); return; } // If the table structure has changed, cancel the sorting; the // sorting columns may have been either moved or deleted from // the model. if (e == null || e.getFirstRow() == TableModelEvent.HEADER_ROW) { cancelSorting(); fireTableChanged(e); return; } // We can map a cell event through to the view without widening // when the following conditions apply: // // a) all the changes are on one row (e.getFirstRow() == e.getLastRow()) and, // b) all the changes are in one column (column != TableModelEvent.ALL_COLUMNS) and, // c) we are not sorting on that column (getSortingStatus(column) == NOT_SORTED) and, // d) a reverse lookup will not trigger a sort (modelToView != null) // // Note: INSERT and DELETE events fail this test as they have column == ALL_COLUMNS. // // The last check, for (modelToView != null) is to see if modelToView // is already allocated. If we don't do this check; sorting can become // a performance bottleneck for applications where cells // change rapidly in different parts of the table. If cells // change alternately in the sorting column and then outside of // it this class can end up re-sorting on alternate cell updates - // which can be a performance problem for large tables. The last // clause avoids this problem. int column = e.getColumn(); if (e.getFirstRow() == e.getLastRow() && column != TableModelEvent.ALL_COLUMNS && getSortingStatus(column) == NOT_SORTED && modelToView != null) { int viewIndex = getModelToView()[e.getFirstRow()]; fireTableChanged(new TableModelEvent(TableSorter.this, viewIndex, viewIndex, column, e.getType())); return; } // Something has happened to the data that may have invalidated the row order. clearSortingState(); fireTableDataChanged(); return; } } private class MouseHandler extends MouseAdapter { public void mouseClicked(MouseEvent e) { JTableHeader h = (JTableHeader) e.getSource(); TableColumnModel columnModel = h.getColumnModel(); int viewColumn = columnModel.getColumnIndexAtX(e.getX()); int column = columnModel.getColumn(viewColumn).getModelIndex(); if (column != -1) { int status = getSortingStatus(column); if (!e.isControlDown()) { cancelSorting(); } // Cycle the sorting states through {NOT_SORTED, ASCENDING, DESCENDING} or // {NOT_SORTED, DESCENDING, ASCENDING} depending on whether shift is pressed. status = status + (e.isShiftDown() ? -1 : 1); status = (status + 4) % 3 - 1; // signed mod, returning {-1, 0, 1} setSortingStatus(column, status); } } } private static class Arrow implements Icon { private boolean descending; private int size; private int priority; public Arrow(boolean descending, int size, int priority) { this.descending = descending; this.size = size; this.priority = priority; } public void paintIcon(Component c, Graphics g, int x, int y) { Color color = c == null ? Color.gray : c.getBackground(); // In a compound sort, make each succesive triangle 20% // smaller than the previous one. int dx = (int) (size / 2 * Math.pow(0.8, priority)); int dy = descending ? dx : -dx; // Align icon (roughly) with font baseline. y = y + 5 * size / 6 + (descending ? -dy : 0); int shift = descending ? 1 : -1; g.translate(x, y); // Right diagonal. g.setColor(color.darker()); g.drawLine(dx / 2, dy, 0, 0); g.drawLine(dx / 2, dy + shift, 0, shift); // Left diagonal. g.setColor(color.brighter()); g.drawLine(dx / 2, dy, dx, 0); g.drawLine(dx / 2, dy + shift, dx, shift); // Horizontal line. if (descending) { g.setColor(color.darker().darker()); } else { g.setColor(color.brighter().brighter()); } g.drawLine(dx, 0, 0, 0); g.setColor(color); g.translate(-x, -y); } public int getIconWidth() { return size; } public int getIconHeight() { return size; } } private class SortableHeaderRenderer implements TableCellRenderer { private TableCellRenderer tableCellRenderer; public SortableHeaderRenderer(TableCellRenderer tableCellRenderer) { this.tableCellRenderer = tableCellRenderer; } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = tableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (c instanceof JLabel) { JLabel l = (JLabel) c; l.setHorizontalTextPosition(JLabel.LEFT); int modelColumn = table.convertColumnIndexToModel(column); l.setIcon(getHeaderRendererIcon(modelColumn, l.getFont().getSize())); } return c; } } private static class Directive { private int column; private int direction; public Directive(int column, int direction) { this.column = column; this.direction = direction; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/Tree.java0000644000175000017500000003245012007547372021470 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.util; import java.util.Vector; import java.awt.Color; import java.awt.Dimension; import java.awt.Event; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Image; import java.awt.Panel; import java.awt.Scrollbar; import java.awt.SystemColor; import java.awt.Toolkit; /** * * @author Thomas Mueller (Hypersonic SQL Group) * @version 1.7.0 * @since Hypersonic SQL */ class Tree extends Panel { // static private static Font fFont; private static FontMetrics fMetrics; private static int iRowHeight; private static int iIndentWidth; private int iMaxTextLength; // drawing private Dimension dMinimum; private Graphics gImage; private Image iImage; // height / width private int iWidth, iHeight; private int iFirstRow; private int iTreeWidth, iTreeHeight; private int iX, iY; // data private Vector vData; private int iRowCount; // scrolling private Scrollbar sbHoriz, sbVert; private int iSbWidth, iSbHeight; static { fFont = new Font("Dialog", Font.PLAIN, 12); fMetrics = Toolkit.getDefaultToolkit().getFontMetrics(fFont); iRowHeight = getMaxHeight(fMetrics); iIndentWidth = 12; } /** * Constructor declaration * */ Tree() { super(); vData = new Vector(); setLayout(null); sbHoriz = new Scrollbar(Scrollbar.HORIZONTAL); add(sbHoriz); sbVert = new Scrollbar(Scrollbar.VERTICAL); add(sbVert); } /** * Method declaration * * * @param d */ public void setMinimumSize(Dimension d) { dMinimum = d; } /** * Method declaration * * * @param x * @param y * @param w * @param h */ // fredt@users 20011210 - patch 450412 by elise@users // with additional replacement of deprecated methods public void setBounds(int x, int y, int w, int h) { super.setBounds(x, y, w, h); iSbHeight = sbHoriz.getPreferredSize().height; iSbWidth = sbVert.getPreferredSize().width; iHeight = h - iSbHeight; iWidth = w - iSbWidth; sbHoriz.setBounds(0, iHeight, iWidth, iSbHeight); sbVert.setBounds(iWidth, 0, iSbWidth, iHeight); adjustScroll(); iImage = null; repaint(); } /** * Method declaration * */ public void removeAll() { vData = new Vector(); iRowCount = 0; adjustScroll(); iMaxTextLength = 10; repaint(); } /** * Method declaration * * * @param key * @param value * @param state * @param color */ public void addRow(String key, String value, String state, int color) { String[] row = new String[4]; if (value == null) { value = ""; } row[0] = key; row[1] = value; row[2] = state; // null / "-" / "+" row[3] = String.valueOf(color); vData.addElement(row); int len = fMetrics.stringWidth(value); if (len > iMaxTextLength) { iMaxTextLength = len; } iRowCount++; } /** * Method declaration * * * @param key * @param value */ public void addRow(String key, String value) { addRow(key, value, null, 0); } /** * Method declaration * */ public void update() { adjustScroll(); repaint(); } /** * Method declaration * */ void adjustScroll() { iTreeHeight = iRowHeight * (iRowCount + 1); // correct would be iMaxTextLength + iMaxIndent*iIndentWidth iTreeWidth = iMaxTextLength * 2; sbHoriz.setValues(iX, iWidth, 0, iTreeWidth); int v = iY / iRowHeight, h = iHeight / iRowHeight; sbVert.setValues(v, h, 0, iRowCount + 1); iX = sbHoriz.getValue(); iY = iRowHeight * sbVert.getValue(); } /** * Method declaration * * * @param e */ // fredt@users 20020130 - comment by fredt // to remove this deprecated method we need to rewrite the Tree class as a // ScrollPane component public boolean handleEvent(Event e) { switch (e.id) { case Event.SCROLL_LINE_UP : case Event.SCROLL_LINE_DOWN : case Event.SCROLL_PAGE_UP : case Event.SCROLL_PAGE_DOWN : case Event.SCROLL_ABSOLUTE : iX = sbHoriz.getValue(); iY = iRowHeight * sbVert.getValue(); repaint(); return true; } return super.handleEvent(e); } /** * Method declaration * * * @param g */ public void paint(Graphics g) { if (g == null || iWidth <= 0 || iHeight <= 0) { return; } g.setColor(SystemColor.control); g.fillRect(iWidth, iHeight, iSbWidth, iSbHeight); if (iImage == null) { iImage = createImage(iWidth, iHeight); gImage = iImage.getGraphics(); gImage.setFont(fFont); } gImage.setColor(Color.white); gImage.fillRect(0, 0, iWidth, iHeight); int[] lasty = new int[100]; String[] root = new String[100]; root[0] = ""; int currentindent = 0; int y = iRowHeight; y -= iY; boolean closed = false; for (int i = 0; i < iRowCount; i++) { String[] s = (String[]) vData.elementAt(i); String key = s[0]; String data = s[1]; String folder = s[2]; int ci = currentindent; for (; ci > 0; ci--) { if (key.startsWith(root[ci])) { break; } } if (root[ci].length() < key.length()) { ci++; } if (closed && ci > currentindent) { continue; } closed = folder != null && folder.equals("+"); root[ci] = key; int x = iIndentWidth * ci - iX; gImage.setColor(Color.lightGray); gImage.drawLine(x, y, x + iIndentWidth, y); gImage.drawLine(x, y, x, lasty[ci]); lasty[ci + 1] = y; int py = y + iRowHeight / 3; int px = x + iIndentWidth * 2; if (folder != null) { lasty[ci + 1] += 4; int rgb = Integer.parseInt(s[3]); gImage.setColor(rgb == 0 ? Color.white : new Color(rgb)); gImage.fillRect(x + iIndentWidth - 3, y - 3, 7, 7); gImage.setColor(Color.black); gImage.drawRect(x + iIndentWidth - 4, y - 4, 8, 8); gImage.drawLine(x + iIndentWidth - 2, y, x + iIndentWidth + 2, y); if (folder.equals("+")) { gImage.drawLine(x + iIndentWidth, y - 2, x + iIndentWidth, y + 2); } } else { px -= iIndentWidth; } gImage.setColor(Color.black); gImage.drawString(data, px, py); currentindent = ci; y += iRowHeight; } g.drawImage(iImage, 0, 0, this); } /** * Method declaration * * * @param g */ public void update(Graphics g) { paint(g); } /** * Method declaration */ public Dimension preferredSize() { return dMinimum; } /** * Method declaration */ public Dimension getPreferredSize() { return dMinimum; } /** * Method declaration */ public Dimension getMinimumSize() { return dMinimum; } /** * Method declaration */ public Dimension minimumSize() { return dMinimum; } /** * Method declaration * * * @param e * @param x * @param y */ public boolean mouseDown(Event e, int x, int y) { if (iRowHeight == 0 || x > iWidth || y > iHeight) { return true; } y += iRowHeight / 2; String[] root = new String[100]; root[0] = ""; int currentindent = 0; int cy = iRowHeight; boolean closed = false; int i = 0; y += iY; for (; i < iRowCount; i++) { String[] s = (String[]) vData.elementAt(i); String key = s[0]; String folder = s[2]; int ci = currentindent; for (; ci > 0; ci--) { if (key.startsWith(root[ci])) { break; } } if (root[ci].length() < key.length()) { ci++; } if (closed && ci > currentindent) { continue; } if (cy <= y && cy + iRowHeight > y) { break; } root[ci] = key; closed = folder != null && folder.equals("+"); currentindent = ci; cy += iRowHeight; } if (i >= 0 && i < iRowCount) { String[] s = (String[]) vData.elementAt(i); String folder = s[2]; if (folder != null && folder.equals("+")) { folder = "-"; } else if (folder != null && folder.equals("-")) { folder = "+"; } s[2] = folder; vData.setElementAt(s, i); repaint(); } return true; } /** * Method declaration * * * @param f */ private static int getMaxHeight(FontMetrics f) { return f.getHeight() + 2; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/problems.gif0000644000175000017500000000040212007547374022232 0ustar renereneGIF89aÄÿÿ_¿¿Ÿßß¿ÿß?ß¿?ÿß_¿Ÿ?Ÿ?ÿ?úZ:ø88ß??¿??˜88??üߟŸÿ¿¿¿ŸŸÿÿÿÿÿÿ!ù,`Œ‚!Œh*NalkI™ò¼åæ,Z  p9!¯Àû%+¥Bq00H †dBã‡AÁX(YšáÀf_DbÒ¬dåÇ#2y ï1 sƒ€,e pg ‰ pphv@   B)(“u#©ª«¬!;hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/hsqldbtab.gif0000644000175000017500000000013412007547374022355 0ustar renereneGIF89a ™ÌÌfÌÌf™Ì3f™3ff33fÿÿÿ, )hjÓ^ È †’"çj°Þ °MY¸‚)ˆ«¨bXÈnA:ŸÝRnáüB;hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/TransferDb.java0000644000175000017500000007601512007547374022632 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import java.util.Vector; // fredt@users 20020215 - patch 516309 by Nicolas Bazin - enhancements // sqlbob@users 20020401 - patch 1.7.0 - reengineering // nicolas BAZIN 20020430 - add support of Catalog and mckoi db helper // Stephan Frind 20040508 - speed improvements /** * Conversions between different databases * * @version 1.7.0 */ class TransferDb extends DataAccessPoint { Connection conn; DatabaseMetaData meta; protected Statement srcStatement = null; TransferDb(Connection c, Traceable t) throws DataAccessPointException { super(t); conn = c; if (c != null) { String productLowerName; try { meta = c.getMetaData(); databaseToConvert = c.getCatalog(); productLowerName = meta.getDatabaseProductName(); if (productLowerName == null) { productLowerName = ""; } else { productLowerName = productLowerName.toLowerCase(); } helper = HelperFactory.getHelper(productLowerName); helper.set(this, t, meta.getIdentifierQuoteString()); } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } } } boolean isConnected() { return (conn != null); } boolean getAutoCommit() throws DataAccessPointException { boolean result = false; try { result = conn.getAutoCommit(); } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } return result; } void commit() throws DataAccessPointException { if (srcStatement != null) { try { srcStatement.close(); } catch (SQLException e) {} srcStatement = null; } try { conn.commit(); } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } } void rollback() throws DataAccessPointException { if (srcStatement != null) { try { srcStatement.close(); } catch (SQLException e) {} srcStatement = null; } try { conn.rollback(); } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } } void setAutoCommit(boolean flag) throws DataAccessPointException { try { conn.setAutoCommit(flag); } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } } boolean execute(String statement) throws DataAccessPointException { boolean result = false; Statement stmt = null; try { stmt = conn.createStatement(); result = stmt.execute(statement); } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } finally { if (stmt != null) { try { stmt.close(); } catch (SQLException e) {} } } return result; } TransferResultSet getData(String statement) throws DataAccessPointException { ResultSet rsData = null; try { if (srcStatement != null) { srcStatement.close(); } srcStatement = conn.createStatement(); rsData = srcStatement.executeQuery(statement); } catch (SQLException e) { try { srcStatement.close(); } catch (Exception e1) {} srcStatement = null; rsData = null; throw new DataAccessPointException(e.toString()); } return new TransferResultSet(rsData); } void putData(String statement, TransferResultSet r, int iMaxRows) throws DataAccessPointException { if ((statement == null) || statement.equals("") || (r == null)) { return; } PreparedStatement destPrep = null; try { destPrep = conn.prepareStatement(statement); int i = 0; int tmpLength; int len = r.getColumnCount(); int[] tmpTypes = null; while (r.next()) { if (tmpTypes == null) { tmpTypes = new int[len + 1]; for (int j = 1; j <= len; j++) { tmpTypes[j] = r.getColumnType(j); } } transferRow(r, destPrep, len, tmpTypes); if (iMaxRows != 0 && i == iMaxRows) { break; } i++; if (iMaxRows != 0 || i % 100 == 0) { tracer.trace("Transfered " + i + " rows"); } } } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } finally { if (destPrep != null) { try { destPrep.close(); } catch (SQLException e) {} } } } /* private void transferRow(TransferResultSet r, PreparedStatement p) throws DataAccessPointException, SQLException { // TODO // what is this never used variable for? // looks like missing debug flags because constructing these strings consumes a lot // of time String sLast = ""; if (p != null) { p.clearParameters(); } int len = r.getColumnCount(); for (int i = 0; i < len; i++) { int t = r.getColumnType(i + 1); sLast = "column=" + r.getColumnName(i + 1) + " datatype=" + (String) helper.getSupportedTypes().get(new Integer(t)); Object o = r.getObject(i + 1); if (o == null) { if (p != null) { p.setNull(i + 1, t); } sLast += " value="; } else { o = helper.convertColumnValue(o, i + 1, t); p.setObject(i + 1, o); sLast += " value=\'" + o.toString() + "\'"; } } if (p != null) { p.execute(); } sLast = ""; } */ Vector getSchemas() throws DataAccessPointException { Vector ret = new Vector(); ResultSet result = null; try { result = meta.getSchemas(); } catch (SQLException e) { result = null; } try { if (result != null) { while (result.next()) { ret.addElement(result.getString(1)); } result.close(); } } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } return (ret); } Vector getCatalog() throws DataAccessPointException { Vector ret = new Vector(); ResultSet result = null; if (databaseToConvert != null && databaseToConvert.length() > 0) { ret.addElement(databaseToConvert); return (ret); } try { result = meta.getCatalogs(); } catch (SQLException e) { result = null; } try { if (result != null) { while (result.next()) { ret.addElement(result.getString(1)); } result.close(); } } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } return (ret); } void setCatalog(String sCatalog) throws DataAccessPointException { if (sCatalog != null && sCatalog.length() > 0) { try { conn.setCatalog(sCatalog); } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } } } Vector getTables(String sCatalog, String[] sSchemas) throws DataAccessPointException { Vector tTable = new Vector(); ResultSet result = null; tracer.trace("Reading source tables"); int nbloops = 1; if (sSchemas != null) { nbloops = sSchemas.length; } try { // variations return null or emtpy result sets with informix JDBC driver 2.2 for (int SchemaIdx = 0; SchemaIdx < nbloops; SchemaIdx++) { if (sSchemas != null && sSchemas[SchemaIdx] != null) { result = meta.getTables(sCatalog, sSchemas[SchemaIdx], null, null); } else { try { result = meta.getTables(sCatalog, "", null, null); } catch (SQLException e) { result = meta.getTables(sCatalog, null, null, null); } } while (result.next()) { String name = result.getString(3); String type = result.getString(4); String schema = ""; if (sSchemas != null && sSchemas[SchemaIdx] != null) { schema = sSchemas[SchemaIdx]; } /* ** we ignore the following table types: ** "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY" ** "ALIAS", "SYNONYM" */ if ((type.compareTo("TABLE") == 0) || (type.compareTo("VIEW") == 0)) { TransferTable t = new TransferTable(this, name, schema, type, tracer); tTable.addElement(t); } else { tracer.trace("Found table of type :" + type + " - this type is ignored"); } } } } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } finally { if (result != null) { try { result.close(); } catch (SQLException e) {} } } return (tTable); } void getTableStructure(TransferTable TTable, DataAccessPoint Dest) throws DataAccessPointException { String create = "CREATE " + TTable.Stmts.sType + " " + Dest.helper.formatName(TTable.Stmts.sDestTable); String insert = ""; ResultSet ImportedKeys = null; boolean importedkeys = false; String alterCreate = new String(""); String alterDrop = new String(""); String ConstraintName = new String(""); String RefTableName = new String(""); String foreignKeyName = new String(""); String columnName = new String(""); Dest.helper.setSchema(TTable.Stmts.sSchema); TTable.Stmts.sDestDrop = "DROP " + TTable.Stmts.sType + " " + Dest.helper.formatName(TTable.Stmts.sDestTable) + ";"; if (TTable.Stmts.sType.compareTo("TABLE") == 0) { TTable.Stmts.sDestDelete = "DELETE FROM " + Dest.helper.formatName(TTable.Stmts.sDestTable) + ";"; create += "("; } else if (TTable.Stmts.sType.compareTo("VIEW") == 0) { TTable.Stmts.bDelete = false; TTable.Stmts.sDestDelete = ""; create += " AS SELECT "; } if (TTable.Stmts.sType.compareTo("TABLE") == 0) { insert = "INSERT INTO " + Dest.helper.formatName(TTable.Stmts.sDestTable) + " VALUES("; } else if (TTable.Stmts.sType.compareTo("VIEW") == 0) { TTable.Stmts.bInsert = false; insert = ""; } if (TTable.Stmts.sType.compareTo("VIEW") == 0) { /* ** Don't know how to retrieve the underlying select so we leave here. ** The user will have to edit the rest of the create statement. */ TTable.Stmts.bTransfer = false; TTable.Stmts.bCreate = true; TTable.Stmts.bDelete = false; TTable.Stmts.bDrop = true; TTable.Stmts.bCreateIndex = false; TTable.Stmts.bDropIndex = false; TTable.Stmts.bInsert = false; TTable.Stmts.bAlter = false; return; } ImportedKeys = null; try { ImportedKeys = meta.getImportedKeys(TTable.Stmts.sDatabaseToConvert, TTable.Stmts.sSchema, TTable.Stmts.sSourceTable); } catch (SQLException e) { ImportedKeys = null; } try { if (ImportedKeys != null) { while (ImportedKeys.next()) { importedkeys = true; if (!ImportedKeys.getString(12).equals(ConstraintName)) { if (!ConstraintName.equals("")) { alterCreate += Dest.helper .formatIdentifier(columnName .substring(0, columnName .length() - 1)) + ") REFERENCES " + Dest.helper .formatName(RefTableName); if (foreignKeyName.length() > 0) { alterCreate += " (" + Dest.helper.formatIdentifier( foreignKeyName.substring( 0, foreignKeyName.length() - 1)) + ")"; } alterCreate += ";"; alterDrop = alterDrop.substring(0, alterDrop.length() - 1) + ";"; foreignKeyName = ""; columnName = ""; } RefTableName = ImportedKeys.getString(3); ConstraintName = ImportedKeys.getString(12); alterCreate += "ALTER TABLE " + Dest.helper.formatName(TTable.Stmts.sDestTable) + " ADD CONSTRAINT "; if ((TTable.Stmts.bFKForced) && (!ConstraintName.startsWith("FK_"))) { alterCreate += Dest.helper.formatIdentifier( "FK_" + ConstraintName) + " "; } else { alterCreate += Dest.helper.formatIdentifier(ConstraintName) + " "; } alterCreate += "FOREIGN KEY ("; alterDrop += "ALTER TABLE " + Dest.helper.formatName(TTable.Stmts.sDestTable) + " DROP CONSTRAINT "; if ((TTable.Stmts.bFKForced) && (!ConstraintName.startsWith("FK_"))) { alterDrop += Dest.helper.formatIdentifier( "FK_" + ConstraintName) + " "; } else { alterDrop += Dest.helper.formatIdentifier(ConstraintName) + " "; } } columnName += ImportedKeys.getString(8) + ","; foreignKeyName += ImportedKeys.getString(4) + ","; } ImportedKeys.close(); } if (importedkeys) { alterCreate += columnName.substring(0, columnName.length() - 1) + ") REFERENCES " + Dest.helper.formatName(RefTableName); if (foreignKeyName.length() > 0) { alterCreate += " (" + Dest.helper.formatIdentifier( foreignKeyName.substring( 0, foreignKeyName.length() - 1)) + ")"; } alterCreate += ";"; alterDrop = alterDrop.substring(0, alterDrop.length() - 1) + ";"; TTable.Stmts.sDestDrop = alterDrop + TTable.Stmts.sDestDrop; } } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } boolean primarykeys = false; String PrimaryKeysConstraint = ""; ResultSet PrimaryKeys = null; try { PrimaryKeys = meta.getPrimaryKeys(TTable.Stmts.sDatabaseToConvert, TTable.Stmts.sSchema, TTable.Stmts.sSourceTable); } catch (SQLException e) { PrimaryKeys = null; } try { if (PrimaryKeys != null) { while (PrimaryKeys.next()) { if (primarykeys) { PrimaryKeysConstraint += ", "; } else { if (PrimaryKeys.getString(6) != null) { PrimaryKeysConstraint = " CONSTRAINT " + Dest.helper.formatIdentifier( PrimaryKeys.getString(6)); } PrimaryKeysConstraint += " PRIMARY KEY ("; } PrimaryKeysConstraint += Dest.helper.formatIdentifier(PrimaryKeys.getString(4)); primarykeys = true; } PrimaryKeys.close(); if (primarykeys) { PrimaryKeysConstraint += ") "; } } } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } boolean indices = false; ResultSet Indices = null; String IndiceName = new String(""); String CreateIndex = new String(""); String DropIndex = new String(""); try { Indices = meta.getIndexInfo(TTable.Stmts.sDatabaseToConvert, TTable.Stmts.sSchema, TTable.Stmts.sSourceTable, false, false); } catch (SQLException e) { Indices = null; } try { if (Indices != null) { while (Indices.next()) { String tmpIndexName = null; try { tmpIndexName = Indices.getString(6); } catch (SQLException e) { tmpIndexName = null; } if (tmpIndexName == null) { continue; } if (!tmpIndexName.equals(IndiceName)) { if (!IndiceName.equals("")) { CreateIndex = CreateIndex.substring( 0, CreateIndex.length() - 1) + ");"; DropIndex += ";"; } IndiceName = tmpIndexName; DropIndex += "DROP INDEX "; if ((TTable.Stmts.bIdxForced) && (!IndiceName.startsWith("Idx_"))) { DropIndex += Dest.helper.formatIdentifier("Idx_" + IndiceName); } else { DropIndex += Dest.helper.formatIdentifier(IndiceName); } CreateIndex += "CREATE "; if (!Indices.getBoolean(4)) { CreateIndex += "UNIQUE "; } CreateIndex += "INDEX "; if ((TTable.Stmts.bIdxForced) && (!IndiceName.startsWith("Idx_"))) { CreateIndex += Dest.helper.formatIdentifier("Idx_" + IndiceName); } else { CreateIndex += Dest.helper.formatIdentifier(IndiceName); } CreateIndex += " ON " + Dest.helper.formatName(TTable.Stmts.sDestTable) + "("; } CreateIndex += Dest.helper.formatIdentifier(Indices.getString(9)) + ","; indices = true; } Indices.close(); if (indices) { CreateIndex = CreateIndex.substring(0, CreateIndex.length() - 1) + ");"; DropIndex += ";"; } } } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } Vector v = new Vector(); tracer.trace("Reading source columns for table " + TTable.Stmts.sSourceTable); ResultSet col = null; int colnum = 1; Statement stmt = null; ResultSet select_rs = null; ResultSetMetaData select_rsmdata = null; try { stmt = conn.createStatement(); select_rs = stmt.executeQuery(TTable.Stmts.sSourceSelect + " WHERE 1 = 2"); select_rsmdata = select_rs.getMetaData(); col = meta.getColumns(TTable.Stmts.sDatabaseToConvert, TTable.Stmts.sSchema, TTable.Stmts.sSourceTable, null); } catch (SQLException eSchema) { // fredt - second try with null schema if (TTable.Stmts.sSchema.equals("")) { try { col = meta.getColumns(TTable.Stmts.sDatabaseToConvert, null, TTable.Stmts.sSourceTable, null); } catch (SQLException eSchema1) { eSchema1.printStackTrace(); } } } try { while (col.next()) { String name = Dest.helper.formatIdentifier(col.getString(4)); int type = col.getShort(5); String source = col.getString(6); int column_size = col.getInt(7); String DefaultVal = col.getString(13); boolean rsmdata_NoNulls = (select_rsmdata.isNullable(colnum) == java.sql.DatabaseMetaData.columnNoNulls); boolean rsmdata_isAutoIncrement = false; try { rsmdata_isAutoIncrement = select_rsmdata.isAutoIncrement(colnum); } catch (SQLException e) { rsmdata_isAutoIncrement = false; } int rsmdata_precision = select_rsmdata.getPrecision(colnum); int rsmdata_scale = select_rsmdata.getScale(colnum); type = helper.convertFromType(type); type = Dest.helper.convertToType(type); Integer inttype = new Integer(type); String datatype = (String) TTable.hTypes.get(inttype); if (datatype == null) { datatype = source; tracer.trace("No mapping for type: " + name + " type: " + type + " source: " + source); } if (type == Types.NUMERIC || type == Types.DECIMAL) { datatype += "(" + Integer.toString(rsmdata_precision); if (rsmdata_scale > 0) { datatype += "," + Integer.toString(rsmdata_scale); } datatype += ")"; } else if (type == Types.CHAR || type == Types.VARCHAR || type == Types.BINARY || type == Types.VARBINARY) { datatype += "(" + Integer.toString(column_size) + ")"; } else if (rsmdata_isAutoIncrement) { datatype = "SERIAL"; } if (DefaultVal != null) { if (type == Types.CHAR || type == Types.VARCHAR || type == Types.LONGVARCHAR || type == Types.BINARY || type == Types.DATE || type == Types.TIME || type == Types.TIMESTAMP) { if (!DefaultVal.startsWith("'")) { // DefaultVal = "\'" + DefaultVal + "\'"; } } datatype += " DEFAULT " + DefaultVal; } if (rsmdata_NoNulls) { datatype += " NOT NULL "; } v.addElement(inttype); datatype = helper.fixupColumnDefRead(TTable, select_rsmdata, datatype, col, colnum); datatype = Dest.helper.fixupColumnDefWrite(TTable, select_rsmdata, datatype, col, colnum); create += name + " " + datatype + ","; insert += "?,"; colnum++; } select_rs.close(); stmt.close(); col.close(); } catch (SQLException e) { throw new DataAccessPointException(e.toString()); } if (primarykeys) { create += PrimaryKeysConstraint + ","; } TTable.Stmts.sDestCreate = create.substring(0, create.length() - 1) + ")"; TTable.Stmts.sDestInsert = insert.substring(0, insert.length() - 1) + ")"; if (importedkeys) { TTable.Stmts.bAlter = true; TTable.Stmts.sDestAlter = alterCreate; } else { TTable.Stmts.bAlter = false; } if (indices) { TTable.Stmts.bCreateIndex = true; TTable.Stmts.bDropIndex = true; TTable.Stmts.sDestCreateIndex = CreateIndex; TTable.Stmts.sDestDropIndex = DropIndex; } else { TTable.Stmts.bCreateIndex = false; TTable.Stmts.bDropIndex = false; } //iColumnType = new int[v.size()]; //for (int j = 0; j < v.size(); j++) { // iColumnType[j] = ((Integer) v.elementAt(j)).intValue(); //} } void close() throws DataAccessPointException { if (srcStatement != null) { try { srcStatement.close(); } catch (SQLException e) {} srcStatement = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) {} conn = null; } } /** * Method declaration * * * @param type * @param r * @param p * * @throws SQLException */ private void transferRow(TransferResultSet r, PreparedStatement p, int len, int[] types) throws DataAccessPointException, SQLException { for (int i = 1; i <= len; i++) { int t = types[i]; Object o = r.getObject(i); if (o == null) { if (p != null) { p.setNull(i, t); } } else { o = helper.convertColumnValue(o, i, t); p.setObject(i, o); } } if (p != null) { p.execute(); } } /** * @return Returns the meta. */ public DatabaseMetaData getMeta() { return meta; } /** * @return Returns the conn. */ public Connection getConn() { return conn; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/CommonSwing.java0000644000175000017500000002432412007547372023032 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.awt.Dimension; import java.awt.Image; import java.awt.Toolkit; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; // sqlbob@users 20020407 - patch 1.7.0 - reengineering // weconsultants@users 20041109 - patch 1.8.0 - enhancements: // Added Methods: setSwingLAF(), LookAndFeelInfo(), setFramePositon() // errorMessage(String errorMessage), // errorMessage(Exception exceptionMsg, // Added: Ability to switch the current LAF while runing (Native,Java or Motif) /** * Common code in the Swing versions of DatabaseManager and Tranfer * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @version 1.7.2 * @since 1.7.0 */ class CommonSwing { protected static String messagerHeader = "Database Manager Swing Error"; protected static String Native = "Native"; protected static String Java = "Java"; protected static String Motif = "Motif"; protected static String plaf = "plaf"; protected static String GTK = "GTK"; // (ulrivo): An actual Image. static Image getIcon(String target) { if (target.equalsIgnoreCase("SystemCursor")) { return (new ImageIcon( CommonSwing.class.getResource("Hourglass.gif")).getImage()); } else if (target.equalsIgnoreCase("Frame")) { return (new ImageIcon( CommonSwing.class.getResource("hsqldb.gif")).getImage()); } else if (target.equalsIgnoreCase("Execute")) { return (new ImageIcon( CommonSwing.class.getResource("run_exc.gif")).getImage()); } else if (target.equalsIgnoreCase("StatusRunning")) { return (new ImageIcon( CommonSwing.class.getResource("RedCircle.gif")).getImage()); } else if (target.equalsIgnoreCase("StatusReady")) { return (new ImageIcon( CommonSwing.class.getResource("GreenCircle.gif")).getImage()); } else if (target.equalsIgnoreCase("Clear")) { return (new ImageIcon( CommonSwing.class.getResource("Clear.png")).getImage()); } else if (target.equalsIgnoreCase("Problem")) { return (new ImageIcon( CommonSwing.class.getResource("problems.gif")).getImage()); } else if (target.equalsIgnoreCase("BoldFont")) { return (new ImageIcon( CommonSwing.class.getResource("Bold.gif")).getImage()); } else if (target.equalsIgnoreCase("ItalicFont")) { return (new ImageIcon( CommonSwing.class.getResource("Italic.gif")).getImage()); } else if (target.equalsIgnoreCase("ColorSelection")) { return (new ImageIcon( CommonSwing.class.getResource("Colors.png")).getImage()); } else if (target.equalsIgnoreCase("Close")) { return (new ImageIcon( CommonSwing.class.getResource("Close.png")).getImage()); } else { return (null); } } // (weconsultants@users: Callable errorMessage method protected static void errorMessage(String errorMessage) { /** * Display Jpanel Error messages any text Errors. Overloads * errorMessage(Exception exceptionMsg) */ Object[] options = { "OK" }; JOptionPane.showOptionDialog(null, errorMessage, messagerHeader, JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); // DatabaseManagerSwing.StatusMessage(READY_STATUS); } public static void errorMessage(Exception exceptionMsg) { errorMessage(exceptionMsg, false); } // (weconsultants@users: Callable errorMessage method public static void errorMessage(Exception exceptionMsg, boolean quiet) { /** * Display Jpanel Error messages any SQL Errors. Overloads * errorMessage(String e) */ Object[] options = { "OK", }; JOptionPane.showOptionDialog(null, exceptionMsg, messagerHeader, JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, options, options[0]); if (!quiet) { exceptionMsg.printStackTrace(); } // DatabaseManagerSwing.StatusMessage(READY_STATUS); } // (weconsultants@users: Callable setFramePositon method static void setFramePositon(JFrame inTargetFrame) { Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); Dimension size = inTargetFrame.getSize(); // (ulrivo): full size on screen with less than 640 width if (d.width >= 640) { inTargetFrame.setLocation((d.width - size.width) / 2, (d.height - size.height) / 2); } else { inTargetFrame.setLocation(0, 0); inTargetFrame.setSize(d); } } // (weconsultants@users: Commented out, Not need now. Was not being called anyway.. Could delete? // static void setDefaultColor() { // // Color hsqlBlue = new Color(102, 153, 204); // Color hsqlGreen = new Color(153, 204, 204); // UIDefaults d = UIManager.getLookAndFeelDefaults(); // // d.put("MenuBar.background", SystemColor.control); // d.put("Menu.background", SystemColor.control); // d.put("Menu.selectionBackground", hsqlBlue); // d.put("MenuItem.background", SystemColor.menu); // d.put("MenuItem.selectionBackground", hsqlBlue); // d.put("Separator.foreground", SystemColor.controlDkShadow); // d.put("Button.background", SystemColor.control); // d.put("CheckBox.background", SystemColor.control); // d.put("Label.background", SystemColor.control); // d.put("Label.foreground", Color.black); // d.put("Panel.background", SystemColor.control); // d.put("PasswordField.selectionBackground", hsqlGreen); // d.put("PasswordField.background", SystemColor.white); // d.put("TextArea.selectionBackground", hsqlGreen); // d.put("TextField.background", SystemColor.white); // d.put("TextField.selectionBackground", hsqlGreen); // d.put("TextField.background", SystemColor.white); // d.put("ScrollBar.background", SystemColor.controlHighlight); // d.put("ScrollBar.foreground", SystemColor.control); // d.put("ScrollBar.track", SystemColor.controlHighlight); // d.put("ScrollBar.trackHighlight", SystemColor.controlDkShadow); // d.put("ScrollBar.thumb", SystemColor.control); // d.put("ScrollBar.thumbHighlight", SystemColor.controlHighlight); // d.put("ScrollBar.thumbDarkShadow", SystemColor.controlDkShadow); // d.put("ScrollBar.thumbLightShadow", SystemColor.controlShadow); // d.put("ComboBox.background", SystemColor.control); // d.put("ComboBox.selectionBackground", hsqlBlue); // d.put("Table.background", SystemColor.white); // d.put("Table.selectionBackground", hsqlBlue); // d.put("TableHeader.background", SystemColor.control); // // // This doesn't seem to work. // d.put("SplitPane.background", SystemColor.control); // d.put("Tree.selectionBackground", hsqlBlue); // d.put("List.selectionBackground", hsqlBlue); // } // (weconsultants@users: Callable setSwingLAF method for changing LAF static void setSwingLAF(java.awt.Component comp, String targetTheme) { try { if (targetTheme.equalsIgnoreCase(Native)) { UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName()); } else if (targetTheme.equalsIgnoreCase(Java)) { UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName()); } else if (targetTheme.equalsIgnoreCase(Motif)) { UIManager.setLookAndFeel( "com.sun.java.swing.plaf.motif.MotifLookAndFeel"); } // if (targetTheme.equalsIgnoreCase(plaf)){ // UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); // } // // if (targetTheme.equalsIgnoreCase(GTK)){ // UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); // } SwingUtilities.updateComponentTreeUI(comp); if (comp instanceof java.awt.Frame) { ((java.awt.Frame) comp).pack(); } } catch (Exception e) { errorMessage(e); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/ConnectionSetting.java0000644000175000017500000000565612007547374024240 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; /** * ConnectionSetting represents the various parameters of a data source * connection. * * @author lonbinder@users */ public class ConnectionSetting implements java.io.Serializable { private String name, driver, url, user, pw; String getName() { return name; } String getDriver() { return driver; } String getUrl() { return url; } String getUser() { return user; } String getPassword() { return pw; } // Constructors private ConnectionSetting() {} ; ConnectionSetting(String name, String driver, String url, String user, String pw) { this.name = name; this.driver = driver; this.url = url; this.user = user; this.pw = pw; } public boolean equals(Object obj) { if (!(obj instanceof ConnectionSetting)) { return false; } ConnectionSetting other = (ConnectionSetting) obj; if (getName() == other.getName()) { return true; } if (getName() == null) { return false; } return getName().trim().equals(other.getName().trim()); } public int hashCode() { return getName() == null ? 0 : getName().trim().hashCode(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/NoWay.gif0000644000175000017500000000205512007547374021452 0ustar renereneGIF89a ÷€€€€€€€€€ÀÀÀÀÜÀ¦Êðÿ!!ÆÆÆÖÖÞÞççï÷!!ÿ!!ÿ))ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ!ùú, þõ H° ÁƒFXÈ@‡J”è¢Á0jÌ8ñÁƒŠ1fœ0r$CA&$É’¤J} Q¦|ØrÂË‚2gœP'Éž7 ¢lð!ÏžV:Ðcƒ7.MŠtÄOd95)K¦±>}és©>¯_:…J+Ȫ.Õfm›–n]ƒb€l•$Æ bÙ ä»Óäͬ‚aÞ-¸1ÂËÀ ÆE8Q%d‚ m*”øQd•ž\`íÍÐ D9ö`LÇUçlW5騳ãô¸újN°žsÝÍxX¬N…EÞÙ¢>¢Og‹ÕxÁÒˆ³C`ý wíÜ [äN^¼ùóèÍ;hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/HsqldbTransferHelper.java0000644000175000017500000000760612007547372024660 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Types; // sqlbob@users 20020325 - patch 1.7.0 - reengineering /** * Conversions to / from Hsqldb * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @version 1.7.0 */ class HsqldbTransferHelper extends TransferHelper { public HsqldbTransferHelper() { super(); } public HsqldbTransferHelper(TransferDb database, Traceable t, String q) { super(database, t, q); } int convertFromType(int type) { if (type == 100) { type = Types.VARCHAR; tracer.trace("Converted HSQLDB VARCHAR_IGNORECASE to VARCHAR"); } return (type); } String fixupColumnDefRead(TransferTable t, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { String CompareString = "INTEGER IDENTITY"; if (columnType.indexOf(CompareString) >= 0) { // We just found a increment columnType = "SERIAL"; } return (columnType); } String fixupColumnDefWrite(TransferTable t, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { if (columnType.indexOf("SERIAL") >= 0) { columnType = "INTEGER GENERATED BY DEFAULT AS IDENTITY"; } return (columnType); } String fixupColumnDefRead(String aTableName, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { return fixupColumnDefRead((TransferTable) null, meta, columnType, columnDesc, columnIndex); } String fixupColumnDefWrite(String aTableName, ResultSetMetaData meta, String columnType, ResultSet columnDesc, int columnIndex) throws SQLException { return fixupColumnDefWrite((TransferTable) null, meta, columnType, columnDesc, columnIndex); } String formatName(String t) { return formatIdentifier(t); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/ConnectionDialogCommon.java0000644000175000017500000002607612007547374025172 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.io.EOFException; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Constructor; import java.util.Enumeration; import java.util.Hashtable; import org.hsqldb.lib.java.JavaSystem; // sqlbob@users 20020407 - patch 1.7.0 - reengineering // fredt@users - 20040508 - modified patch by lonbinder@users for saving settings // weconsultants@users - 20041114 - patch 1.8.0 - Added MySQL Connector/J jbcDriver and granulated imports /** * Common code in the Swing and AWT versions of ConnectionDialog * * New class based on Hypersonic original * * @author Thomas Mueller (Hypersonic SQL Group) * @version 1.7.2 * @since 1.7.0 */ class ConnectionDialogCommon { private static String[][] connTypes; private static final String[][] sJDBCTypes = { { "HSQL Database Engine In-Memory", "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:." }, { "HSQL Database Engine Standalone", "org.hsqldb.jdbcDriver", "jdbc:hsqldb:file:\u00ABdatabase/path?\u00BB" }, { "HSQL Database Engine Server", "org.hsqldb.jdbcDriver", "jdbc:hsqldb:hsql://localhost/" }, { "HSQL Database Engine WebServer", "org.hsqldb.jdbcDriver", "jdbc:hsqldb:http://\u00ABhostname/?\u00BB" }, { "JDBC-ODBC Bridge from Sun", "sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:\u00ABdatabase?\u00BB" }, { "Cloudscape RMI", "RmiJdbc.RJDriver", "jdbc:rmi://\u00ABhost?\u00BB:1099/jdbc:cloudscape:" + "\u00ABdatabase?\u00BB;create=true" }, { "IBM DB2", "COM.ibm.db2.jdbc.app.DB2Driver", "jdbc:db2:\u00ABdatabase?\u00BB" }, { "IBM DB2 (thin)", "COM.ibm.db2.jdbc.net.DB2Driver", "jdbc:db2://\u00ABhost?\u00BB:6789/\u00ABdatabase?\u00BB" }, { "Informix", "com.informix.jdbc.IfxDriver", "jdbc:informix-sqli://\u00ABhost?\u00BB:1533/\u00ABdatabase?\u00BB:" + "INFORMIXSERVER=\u00ABserver?\u00BB" }, { "InstantDb", "jdbc.idbDriver", "jdbc:idb:\u00ABdatabase?\u00BB.prp" }, { "MySQL Connector/J", "com.mysql.jdbc.Driver", "jdbc:mysql://\u00ABhost?\u00BB/\u00ABdatabase?\u00BB" }, { "MM.MySQL", "org.gjt.mm.mysql.Driver", "jdbc:mysql://\u00ABhost?\u00BB/\u00ABdatabase?\u00BB" }, { "Oracle", "oracle.jdbc.driver.OracleDriver", "jdbc:oracle:oci8:@\u00ABdatabase?\u00BB" }, { "Oracle (thin)", "oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@\u00ABhost?\u00BB:1521:\u00ABdatabase?\u00BB" }, { "PointBase", "com.pointbase.jdbc.jdbcUniversalDriver", "jdbc:pointbase://\u00ABhost?\u00BB/\u00ABdatabase?\u00BB" }, { "PostgreSQL", "org.postgresql.Driver", "jdbc:postgresql://\u00ABhost?\u00BB/\u00ABdatabase?\u00BB" }, { "PostgreSQL v6.5", "postgresql.Driver", "jdbc:postgresql://\u00ABhost?\u00BB/\u00ABdatabase?\u00BB" } }; static String[][] getTypes() { return sJDBCTypes; /* if (connTypes == null) { // Pluggable connection types: Vector plugTypes = new Vector(); try { plugTypes = (Vector) Class.forName( System.getProperty( "org.hsqldb.util.ConnectionTypeClass")).newInstance(); } catch (Exception e) { ; } connTypes = new String[(plugTypes.size() / 3) + sJDBCTypes.length][3]; int i = 0; for (int j = 0; j < plugTypes.size(); i++) { connTypes[i] = new String[3]; connTypes[i][0] = plugTypes.elementAt(j++).toString(); connTypes[i][1] = plugTypes.elementAt(j++).toString(); connTypes[i][2] = plugTypes.elementAt(j++).toString(); } for (int j = 0; j < sJDBCTypes.length; i++, j++) { connTypes[i] = new String[3]; connTypes[i][0] = sJDBCTypes[j][0]; connTypes[i][1] = sJDBCTypes[j][1]; connTypes[i][2] = sJDBCTypes[j][2]; } } return (connTypes); */ } private static final String fileName = "hsqlprefs.dat"; private static File recentSettings = null; static synchronized Hashtable loadRecentConnectionSettings() throws IOException { Hashtable list = new Hashtable(); try { if (recentSettings == null) { setHomeDir(); if (homedir == null) { return list; } recentSettings = new File(homedir, fileName); if (!recentSettings.exists()) { JavaSystem.createNewFile(recentSettings); return list; } } } catch (Throwable e) { return list; } FileInputStream in = null; ObjectInputStream objStream = null; try { in = new FileInputStream(recentSettings); objStream = new ObjectInputStream(in); list.clear(); while (true) { ConnectionSetting setting = (ConnectionSetting) objStream.readObject(); if (!emptySettingName.equals(setting.getName())) { list.put(setting.getName(), setting); } } } catch (EOFException eof) { // reached end of file -- this is not clean but it works } catch (ClassNotFoundException cnfe) { throw (IOException) new IOException("Unrecognized class type " + cnfe.getMessage()); } catch (ClassCastException cce) { throw (IOException) new IOException("Unrecognized class type " + cce.getMessage()); } catch (Throwable t) {} finally { if (objStream != null) { objStream.close(); } if (in != null) { in.close(); } } return list; } static String emptySettingName = "Recent settings..."; /** * Adds the new settings name if it does not nexist, or overwrites the old one. */ static void addToRecentConnectionSettings(Hashtable settings, ConnectionSetting newSetting) throws IOException { settings.put(newSetting.getName(), newSetting); ConnectionDialogCommon.storeRecentConnectionSettings(settings); } /** * Here's a non-secure method of storing recent connection settings. * * @param settings ConnectionSetting[] * @throw IOException if something goes wrong while writing */ private static void storeRecentConnectionSettings(Hashtable settings) { try { if (recentSettings == null) { setHomeDir(); if (homedir == null) { return; } recentSettings = new File(homedir, fileName); if (!recentSettings.exists()) { // recentSettings.createNewFile(); } } if (settings == null || settings.size() == 0) { return; } // setup a stream to a physical file on the filesystem FileOutputStream out = new FileOutputStream(recentSettings); ObjectOutputStream objStream = new ObjectOutputStream(out); Enumeration en = settings.elements(); while (en.hasMoreElements()) { objStream.writeObject(en.nextElement()); } objStream.flush(); objStream.close(); out.close(); } catch (Throwable t) {} } /** * Removes the recent connection settings file store. */ static void deleteRecentConnectionSettings() { try { if (recentSettings == null) { setHomeDir(); if (homedir == null) { return; } recentSettings = new File(homedir, fileName); } if (!recentSettings.exists()) { recentSettings = null; return; } recentSettings.delete(); recentSettings = null; } catch (Throwable t) {} } private static String homedir = null; public static void setHomeDir() { //#ifdef JAVA2FULL if (homedir == null) { try { Class c = Class.forName("sun.security.action.GetPropertyAction"); Constructor constructor = c.getConstructor(new Class[]{ String.class }); java.security.PrivilegedAction a = (java.security.PrivilegedAction) constructor.newInstance( new Object[]{ "user.home" }); homedir = (String) java.security.AccessController.doPrivileged(a); } catch (Exception e) { System.err.println( "No access to home directory. Continuing without..."); } } //#endif } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/InformixTransferHelper.java0000644000175000017500000000627112007547372025233 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.sql.Types; // fredt@users 20020215 - patch 516309 by Nicolas Bazin - transfer Informix // sqlbob@users 20020325 - patch 1.7.0 - reengineering /** * Conversions from Informix databases * * @author Nichola Bazin * @version 1.7.0 */ class InformixTransferHelper extends TransferHelper { public InformixTransferHelper() { super(); } public InformixTransferHelper(TransferDb database, Traceable t, String q) { super(database, t, q); } void setSchema(String _Schema) { sSchema = "\"" + _Schema + "\""; } int convertFromType(int type) { //Correct a bug in Informix JDBC driver that maps: // DATETIME YEAR TO FRACTION to TIME and // DATETIME HOUR TO SECOND to TIMESTAMP if (type == Types.TIMESTAMP) { type = Types.TIME; tracer.trace("Converted INFORMIX TIMESTAMP to TIME"); } else if (type == Types.TIME) { type = Types.TIMESTAMP; tracer.trace("Converted INFORMIX TIME to TIMESTAMP"); } return (type); } int convertToType(int type) { //Correct a bug in Informix JDBC driver that maps: // DATETIME YEAR TO FRACTION to TIME and // DATETIME HOUR TO SECOND to TIMESTAMP if (type == Types.TIMESTAMP) { type = Types.TIME; tracer.trace("Converted TIMESTAMP to INFORMIX TIME"); } else if (type == Types.TIME) { type = Types.TIMESTAMP; tracer.trace("Converted TIME to INFORMIX TIMESTAMP"); } return (type); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/TransferTable.java0000644000175000017500000004110612007547374023325 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.util; import java.io.Serializable; import java.sql.SQLException; import java.util.Hashtable; // fredt@users 20011220 - patch 481239 by xponsard@users - enhancements // enhancements to support saving and loading of transfer settings, // transfer of blobs, and catalog and schema names in source db // changes by fredt to allow saving and loading of transfer settings // fredt@users 20020215 - patch 516309 by Nicolas Bazin - enhancements // sqlbob@users 20020325 - patch 1.7.0 - reengineering // fredt@users 20040508 - patch 1.7.2 - bug fixes /** * Transfers data from one database to another * * @author Thomas Mueller (Hypersonic SQL Group) * @version 1.7.2 * @since Hypersonic SQL */ class TransferTable implements Serializable { Hashtable hTypes; DataAccessPoint sourceDb; DataAccessPoint destDb; SQLStatements Stmts = null; Traceable tracer; TransferTable(DataAccessPoint src, String name, String schema, String type, Traceable t) { Stmts = new SQLStatements(); sourceDb = src; Stmts.sSchema = ""; if (schema != null && schema.length() > 0) { Stmts.sSchema = schema; } Stmts.sType = type; Stmts.sDatabaseToConvert = src.databaseToConvert; Stmts.sSourceTable = Stmts.sDestTable = name; tracer = t; if (Stmts.sType.compareTo("TABLE") == 0) { Stmts.sSourceSelect = "SELECT * FROM " + src.helper.formatName(Stmts.sSourceTable); } else if (Stmts.sType.compareTo("VIEW") == 0) { Stmts.sSourceSelect = ""; } } void setDest(String _Schema, DataAccessPoint dest) throws Exception { destDb = dest; dest.helper.setSchema(_Schema); } /** * extractTableStructure * * @param Source * @param Destination * @throws Exception */ void extractTableStructure(DataAccessPoint Source, DataAccessPoint Destination) throws Exception { initTypes(); Source.getTableStructure(this, Destination); } /** * @throws SQLException */ void transferStructure() throws Exception { String Statement = new String(""); if (destDb.helper.needTransferTransaction()) { try { destDb.setAutoCommit(false); } catch (Exception e) {} } if (Stmts.bTransfer == false) { tracer.trace("Table " + Stmts.sSourceTable + " not transfered"); return; } tracer.trace("Table " + Stmts.sSourceTable + ": start transfer"); try { if (Stmts.bDropIndex) { if (Stmts.sDestDropIndex.charAt(Stmts.sDestDropIndex.length() - 1) != ';') { Stmts.sDestDropIndex += ";"; } int lastsemicolon = 0; int nextsemicolon = Stmts.sDestDropIndex.indexOf(';'); while (nextsemicolon > lastsemicolon) { Statement = Stmts.sDestDropIndex.substring(lastsemicolon, nextsemicolon); while (Statement.charAt(Statement.length() - 1) == ';') { Statement = Statement.substring(0, Statement.length() - 1); } try { tracer.trace("Executing " + Statement); destDb.execute(Statement); } catch (Exception e) { tracer.trace("Ignoring error " + e.getMessage()); } lastsemicolon = nextsemicolon + 1; nextsemicolon = lastsemicolon + Stmts.sDestDropIndex.substring( lastsemicolon).indexOf(';'); } } if (Stmts.bDelete) { if (Stmts.sDestDelete.charAt(Stmts.sDestDelete.length() - 1) != ';') { Stmts.sDestDelete += ";"; } int lastsemicolon = 0; int nextsemicolon = Stmts.sDestDelete.indexOf(';'); while (nextsemicolon > lastsemicolon) { Statement = Stmts.sDestDelete.substring(lastsemicolon, nextsemicolon); while (Statement.charAt(Statement.length() - 1) == ';') { Statement = Statement.substring(0, Statement.length() - 1); } try { tracer.trace("Executing " + Statement); destDb.execute(Statement); } catch (Exception e) { tracer.trace("Ignoring error " + e.getMessage()); } lastsemicolon = nextsemicolon + 1; nextsemicolon = lastsemicolon + Stmts.sDestDelete.substring( lastsemicolon).indexOf(';'); } } if (Stmts.bDrop) { if (Stmts.sDestDrop.charAt(Stmts.sDestDrop.length() - 1) != ';') { Stmts.sDestDrop += ";"; } int lastsemicolon = 0; int nextsemicolon = Stmts.sDestDrop.indexOf(';'); while (nextsemicolon > lastsemicolon) { Statement = Stmts.sDestDrop.substring(lastsemicolon, nextsemicolon); while (Statement.charAt(Statement.length() - 1) == ';') { Statement = Statement.substring(0, Statement.length() - 1); } try { tracer.trace("Executing " + Statement); destDb.execute(Statement); } catch (Exception e) { tracer.trace("Ignoring error " + e.getMessage()); } lastsemicolon = nextsemicolon + 1; nextsemicolon = lastsemicolon + Stmts.sDestDrop.substring( lastsemicolon).indexOf(';'); } } if (Stmts.bCreate) { if (Stmts.sDestCreate.charAt(Stmts.sDestCreate.length() - 1) != ';') { Stmts.sDestCreate += ";"; } int lastsemicolon = 0; int nextsemicolon = Stmts.sDestCreate.indexOf(';'); while (nextsemicolon > lastsemicolon) { Statement = Stmts.sDestCreate.substring(lastsemicolon, nextsemicolon); while (Statement.charAt(Statement.length() - 1) == ';') { Statement = Statement.substring(0, Statement.length() - 1); } tracer.trace("Executing " + Statement); destDb.execute(Statement); lastsemicolon = nextsemicolon + 1; nextsemicolon = lastsemicolon + Stmts.sDestCreate.substring( lastsemicolon).indexOf(';'); } } } catch (Exception e) { try { if (!destDb.getAutoCommit()) { destDb.rollback(); } } catch (Exception e1) {} throw (e); } if (!destDb.getAutoCommit()) { destDb.commit(); try { destDb.setAutoCommit(true); } catch (Exception e) {} } } void transferData(int iMaxRows) throws Exception, SQLException { if (destDb.helper.needTransferTransaction()) { try { destDb.setAutoCommit(false); } catch (Exception e) {} } try { if (Stmts.bInsert) { if (destDb.helper.needTransferTransaction()) { try { destDb.setAutoCommit(false); } catch (Exception e) {} } tracer.trace("Executing " + Stmts.sSourceSelect); TransferResultSet r = sourceDb.getData(Stmts.sSourceSelect); tracer.trace("Start transfering data..."); destDb.beginDataTransfer(); tracer.trace("Executing " + Stmts.sDestInsert); destDb.putData(Stmts.sDestInsert, r, iMaxRows); destDb.endDataTransfer(); tracer.trace("Finished"); if (!destDb.getAutoCommit()) { destDb.commit(); try { destDb.setAutoCommit(true); } catch (Exception e) {} } } } catch (Exception e) { try { if (!destDb.getAutoCommit()) { destDb.rollback(); } } catch (Exception e1) {} throw (e); } if (!destDb.getAutoCommit()) { destDb.commit(); try { destDb.setAutoCommit(true); } catch (Exception e) {} } } void transferAlter() throws Exception { String Statement = new String(""); if (destDb.helper.needTransferTransaction()) { try { destDb.setAutoCommit(false); } catch (Exception e) {} } if (Stmts.bTransfer == false) { tracer.trace("Table " + Stmts.sSourceTable + " not transfered"); return; } tracer.trace("Table " + Stmts.sSourceTable + ": start alter"); try { if (Stmts.bCreateIndex) { if (Stmts.sDestCreateIndex.charAt( Stmts.sDestCreateIndex.length() - 1) != ';') { Stmts.sDestCreateIndex += ";"; } int lastsemicolon = 0; int nextsemicolon = Stmts.sDestCreateIndex.indexOf(';'); while (nextsemicolon > lastsemicolon) { Statement = Stmts.sDestCreateIndex.substring(lastsemicolon, nextsemicolon); while (Statement.charAt(Statement.length() - 1) == ';') { Statement = Statement.substring(0, Statement.length() - 1); } try { tracer.trace("Executing " + Stmts.sDestCreateIndex); destDb.execute(Statement); } catch (Exception e) { tracer.trace("Ignoring error " + e.getMessage()); } lastsemicolon = nextsemicolon + 1; nextsemicolon = lastsemicolon + Stmts.sDestCreateIndex.substring( lastsemicolon).indexOf(';'); } } if (Stmts.bAlter) { if (Stmts.sDestAlter.charAt(Stmts.sDestAlter.length() - 1) != ';') { Stmts.sDestAlter += ";"; } int lastsemicolon = 0; int nextsemicolon = Stmts.sDestAlter.indexOf(';'); while (nextsemicolon > lastsemicolon) { Statement = Stmts.sDestAlter.substring(lastsemicolon, nextsemicolon); while (Statement.charAt(Statement.length() - 1) == ';') { Statement = Statement.substring(0, Statement.length() - 1); } try { tracer.trace("Executing " + Statement); destDb.execute(Statement); } catch (Exception e) { tracer.trace("Ignoring error " + e.getMessage()); } lastsemicolon = nextsemicolon + 1; nextsemicolon = lastsemicolon + Stmts.sDestAlter.substring( lastsemicolon).indexOf(';'); } } } catch (Exception e) { try { if (!destDb.getAutoCommit()) { destDb.rollback(); } } catch (Exception e1) {} throw (e); } if (!destDb.getAutoCommit()) { destDb.commit(); try { destDb.setAutoCommit(true); } catch (Exception e) {} } } private void initTypes() throws SQLException { if (hTypes != null) { return; } hTypes = destDb.helper.getSupportedTypes(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/util/ConnectionDialog.java0000644000175000017500000002523012007547372024006 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.util; import java.sql.Connection; import java.sql.DriverManager; import java.util.Enumeration; import java.util.Hashtable; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Choice; import java.awt.Component; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Label; import java.awt.Panel; import java.awt.SystemColor; import java.awt.TextField; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; // sqlbob@users 20020325 - patch 1.7.0 - enhancements // sqlbob@users 20020407 - patch 1.7.0 - reengineering // fredt@users - 20040508 - modified patch by lonbinder@users for saving settings /** * Opens a connection to a database * * @author Thomas Mueller (Hypersonic SQL Group) * @version 1.7.2 * @since Hypersonic SQL */ class ConnectionDialog extends Dialog implements ActionListener, ItemListener { protected Connection mConnection; protected TextField mName, mDriver, mURL, mUser, mPassword; protected Label mError; private String[][] connTypes; private Hashtable settings; private Choice types, recent; /** * @throws Exception */ public static Connection createConnection(String driver, String url, String user, String password) throws Exception { Class.forName(driver).newInstance(); return DriverManager.getConnection(url, user, password); } /** * Constructor declaration * * * @param owner * @param title */ ConnectionDialog(Frame owner, String title) { super(owner, title, true); } private void create() { Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); setLayout(new BorderLayout()); Panel p = new Panel(new BorderLayout()); Panel pLabel; Panel pText; Panel pButton; Panel pClearButton; // (ulrivo): full size on screen with less than 640 width if (d.width >= 640) { pLabel = new Panel(new GridLayout(8, 1, 10, 10)); pText = new Panel(new GridLayout(8, 1, 10, 10)); pButton = new Panel(new GridLayout(1, 2, 10, 10)); pClearButton = new Panel(new GridLayout(8, 1, 10, 10)); } else { pLabel = new Panel(new GridLayout(8, 1)); pText = new Panel(new GridLayout(8, 1)); pButton = new Panel(new GridLayout(1, 2)); pClearButton = new Panel(new GridLayout(8, 1)); } p.add("West", pLabel); p.add("Center", pText); p.add("South", pButton); p.add("North", createLabel("")); p.add("East", pClearButton); p.setBackground(SystemColor.control); pText.setBackground(SystemColor.control); pLabel.setBackground(SystemColor.control); pButton.setBackground(SystemColor.control); pLabel.add(createLabel("Recent:")); recent = new Choice(); try { settings = ConnectionDialogCommon.loadRecentConnectionSettings(); } catch (java.io.IOException ioe) { ioe.printStackTrace(); } recent.add(ConnectionDialogCommon.emptySettingName); Enumeration en = settings.elements(); while (en.hasMoreElements()) { recent.add(((ConnectionSetting) en.nextElement()).getName()); } recent.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { String s = (String) e.getItem(); ConnectionSetting setting = (ConnectionSetting) settings.get(s); if (setting != null) { mName.setText(setting.getName()); mDriver.setText(setting.getDriver()); mURL.setText(setting.getUrl()); mUser.setText(setting.getUser()); mPassword.setText(setting.getPassword()); } } }); pText.add(recent); Button b; b = new Button("Clr"); b.setActionCommand("Clear"); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ConnectionDialogCommon.deleteRecentConnectionSettings(); settings = new Hashtable(); recent.removeAll(); recent.add(ConnectionDialogCommon.emptySettingName); mName.setText(null); } }); pClearButton.add(b); pLabel.add(createLabel("Setting Name:")); mName = new TextField(""); pText.add(mName); pLabel.add(createLabel("Type:")); types = new Choice(); connTypes = ConnectionDialogCommon.getTypes(); for (int i = 0; i < connTypes.length; i++) { types.add(connTypes[i][0]); } types.addItemListener(this); pText.add(types); pLabel.add(createLabel("Driver:")); mDriver = new TextField(connTypes[0][1]); pText.add(mDriver); pLabel.add(createLabel("URL:")); mURL = new TextField(connTypes[0][2]); mURL.addActionListener(this); pText.add(mURL); pLabel.add(createLabel("User:")); mUser = new TextField("SA"); mUser.addActionListener(this); pText.add(mUser); pLabel.add(createLabel("Password:")); mPassword = new TextField(""); mPassword.addActionListener(this); mPassword.setEchoChar('*'); pText.add(mPassword); b = new Button("Ok"); b.setActionCommand("ConnectOk"); b.addActionListener(this); pButton.add(b); b = new Button("Cancel"); b.setActionCommand("ConnectCancel"); b.addActionListener(this); pButton.add(b); add("East", createLabel("")); add("West", createLabel("")); mError = new Label(""); Panel pMessage = createBorderPanel(mError); add("South", pMessage); add("North", createLabel("")); add("Center", p); doLayout(); pack(); Dimension size = getSize(); // (ulrivo): full size on screen with less than 640 width if (d.width >= 640) { setLocation((d.width - size.width) / 2, (d.height - size.height) / 2); } else { setLocation(0, 0); setSize(d); } show(); } public static Connection createConnection(Frame owner, String title) { ConnectionDialog dialog = new ConnectionDialog(owner, title); dialog.create(); return dialog.mConnection; } protected static Label createLabel(String s) { Label l = new Label(s); l.setBackground(SystemColor.control); return l; } protected static Panel createBorderPanel(Component center) { Panel p = new Panel(); p.setBackground(SystemColor.control); p.setLayout(new BorderLayout()); p.add("Center", center); p.add("North", createLabel("")); p.add("South", createLabel("")); p.add("East", createLabel("")); p.add("West", createLabel("")); p.setBackground(SystemColor.control); return p; } public void actionPerformed(ActionEvent ev) { String s = ev.getActionCommand(); if (s.equals("ConnectOk") || (ev.getSource() instanceof TextField)) { try { if (mURL.getText().indexOf('\u00AB') >= 0) { throw new Exception("please specify db path"); } mConnection = createConnection(mDriver.getText(), mURL.getText(), mUser.getText(), mPassword.getText()); if (mName.getText() != null && mName.getText().trim().length() != 0) { ConnectionSetting newSetting = new ConnectionSetting(mName.getText(), mDriver.getText(), mURL.getText(), mUser.getText(), mPassword.getText()); ConnectionDialogCommon.addToRecentConnectionSettings( settings, newSetting); } dispose(); } catch (java.io.IOException ioe) { dispose(); } catch (Exception e) { e.printStackTrace(); mError.setText(e.toString()); } } else if (s.equals("ConnectCancel")) { dispose(); } } public void itemStateChanged(ItemEvent e) { String s = (String) e.getItem(); for (int i = 0; i < connTypes.length; i++) { if (s.equals(connTypes[i][0])) { mDriver.setText(connTypes[i][1]); mURL.setText(connTypes[i][2]); } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/RowAVLDiskData.java0000644000175000017500000001505312007547414022330 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.io.IOException; import org.hsqldb.index.NodeAVL; import org.hsqldb.persist.PersistentStore; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputInterface; // fredt@users 20021205 - path 1.7.2 - enhancements // fredt@users 20021215 - doc 1.7.2 - javadoc comments /** * Implementation of rows for tables with memory resident indexes and * disk-based data, such as TEXT tables. * * @author Bob Preston (sqlbob@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @version 1.7.0 */ public class RowAVLDiskData extends RowAVL { PersistentStore store; int accessCount; boolean hasDataChanged; int storageSize; /** * Constructor for new rows. */ public RowAVLDiskData(PersistentStore store, TableBase t, Object[] o) { super(t, o); setNewNodes(store); this.store = store; hasDataChanged = true; } /** * Constructor when read from the disk into the Cache. The link with * the Nodes is made separetly. */ public RowAVLDiskData(PersistentStore store, TableBase t, RowInputInterface in) throws IOException { super(t, (Object[]) null); setNewNodes(store); position = in.getPos(); storageSize = in.getSize(); rowData = in.readData(table.getColumnTypes()); hasDataChanged = false; this.store = store; } public void getRowData(TableBase t, RowInputInterface in) throws IOException { rowData = in.readData(t.getColumnTypes()); } public void setData(Object[] data) { this.rowData = data; } public Object[] getData() { Object[] data = rowData; if (data == null) { store.writeLock(); try { store.get(this, false); data = rowData; if (data == null) { store.get(this, false); data = rowData; } } finally { store.writeUnlock(); } } else { accessCount++; } return data; } /** * Used when data is read from the disk into the Cache the first time. * New Nodes are created which are then indexed. */ public void setNewNodes(PersistentStore store) { int index = store.getAccessorKeys().length; nPrimaryNode = new NodeAVL(this); NodeAVL n = nPrimaryNode; for (int i = 1; i < index; i++) { n.nNext = new NodeAVL(this); n = n.nNext; } } public NodeAVL insertNode(int index) { NodeAVL backnode = getNode(index - 1); NodeAVL newnode = new NodeAVL(this); newnode.nNext = backnode.nNext; backnode.nNext = newnode; return newnode; } /** * Used when data is re-read from the disk into the Cache. The Row is * already indexed so it is linked with the Node in the primary index. * the Nodes is made separetly. */ void setPrimaryNode(NodeAVL primary) { nPrimaryNode = primary; } public int getRealSize(RowOutputInterface out) { return out.getSize(this); } /** * Writes the data to disk. Unlike CachedRow, hasChanged is never set * to true when changes are made to the Nodes. (Nodes are in-memory). * The only time this is used is when a new Row is added to the Caches. */ public void write(RowOutputInterface out) { out.writeSize(storageSize); out.writeData(this, table.colTypes); out.writeEnd(); hasDataChanged = false; } public synchronized void setChanged(boolean changed) { hasDataChanged = changed; } public boolean isNew() { return false; } public boolean hasChanged() { return hasDataChanged; } public void updateAccessCount(int count) { accessCount = count; } public int getAccessCount() { return accessCount; } public int getStorageSize() { return storageSize; } public void setStorageSize(int size) { storageSize = size; } /** * Sets the file position for the row and registers the row with * the table. * * @param pos position in data file */ public void setPos(long pos) { position = pos; } public boolean isMemory() { return true; } /** used by Index, nodes are always in memory */ public boolean isInMemory() { return rowData != null; } public boolean isKeepInMemory() { return false; } public boolean keepInMemory(boolean keep) { return true; } /** required to purge cache */ public void setInMemory(boolean in) { if (!in) { rowData = null; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/store/0000755000175000017500000000000012007570424020073 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/store/ReusableObjectCache.java0000644000175000017500000000427312007547362024566 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.store; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HashSet; public class ReusableObjectCache { public ReusableObjectCache() { try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } public static HashMappedList getHashMappedList() { return new HashMappedList(); } public static void putHashMappedList(HashMappedList object) {} public static HashSet getHashSet() { return new HashSet(); } public static void putHashSet(HashSet object) {} private void jbInit() throws Exception {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/store/BaseHashMap.java0000644000175000017500000013760012007547362023066 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.store; import java.util.NoSuchElementException; import org.hsqldb.lib.ArrayCounter; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.ObjectComparator; /** * Base class for hash tables or sets. The exact type of the structure is * defined by the constructor. Each instance has at least a keyTable array * and a HashIndex instance for looking up the keys into this table. Instances * that are maps also have a valueTable the same size as the keyTable. * * Special getOrAddXXX() methods are used for object maps in some subclasses. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 */ public class BaseHashMap { /* data store: keys: {array of primitive | array of object} values: {none | array of primitive | array of object} same size as keys objects support : hashCode(), equals() implemented types of keyTable: {objectKeyTable: variable size Object[] array for keys | intKeyTable: variable size int[] for keys | longKeyTable: variable size long[] for keys } implemented types of valueTable: {objectValueTable: variable size Object[] array for values | intValueTable: variable size int[] for values | longValueTable: variable size long[] for values} valueTable does not exist for sets or for object pools hash index: hashTable: fixed size int[] array for hash lookup into keyTable linkTable: pointer to the next key ; size equal or larger than hashTable but equal to the valueTable access count table: {none | variable size int[] array for access count} same size as xxxKeyTable */ // boolean isIntKey; boolean isLongKey; boolean isObjectKey; boolean isNoValue; boolean isIntValue; boolean isLongValue; boolean isObjectValue; protected boolean isTwoObjectValue; protected boolean isList; // private ValuesIterator valuesIterator; // protected HashIndex hashIndex; // protected int[] intKeyTable; protected Object[] objectKeyTable; protected long[] longKeyTable; // protected int[] intValueTable; protected Object[] objectValueTable; protected long[] longValueTable; // protected int accessMin; protected int accessCount; protected int[] accessTable; protected boolean[] multiValueTable; protected Object[] objectValueTable2; // final float loadFactor; final int initialCapacity; int threshold; protected int maxCapacity; protected int purgePolicy = NO_PURGE; protected boolean minimizeOnEmpty; protected ObjectComparator comparator; // boolean hasZeroKey; int zeroKeyIndex = -1; // keyOrValueTypes protected static final int noKeyOrValue = 0; protected static final int intKeyOrValue = 1; protected static final int longKeyOrValue = 2; protected static final int objectKeyOrValue = 3; // purgePolicy protected static final int NO_PURGE = 0; protected static final int PURGE_ALL = 1; protected static final int PURGE_HALF = 2; protected static final int PURGE_QUARTER = 3; // public static final int ACCESS_MAX = Integer.MAX_VALUE - (1 << 20); protected BaseHashMap(int initialCapacity, int keyType, int valueType, boolean hasAccessCount) throws IllegalArgumentException { if (initialCapacity <= 0) { throw new IllegalArgumentException(); } if (initialCapacity < 3) { initialCapacity = 3; } this.loadFactor = 1; // can use any value if necessary this.initialCapacity = initialCapacity; threshold = initialCapacity; int hashtablesize = (int) (initialCapacity * loadFactor); if (hashtablesize < 3) { hashtablesize = 3; } hashIndex = new HashIndex(hashtablesize, initialCapacity, true); int arraySize = threshold; if (keyType == BaseHashMap.intKeyOrValue) { isIntKey = true; intKeyTable = new int[arraySize]; } else if (keyType == BaseHashMap.objectKeyOrValue) { isObjectKey = true; objectKeyTable = new Object[arraySize]; } else { isLongKey = true; longKeyTable = new long[arraySize]; } if (valueType == BaseHashMap.intKeyOrValue) { isIntValue = true; intValueTable = new int[arraySize]; } else if (valueType == BaseHashMap.objectKeyOrValue) { isObjectValue = true; objectValueTable = new Object[arraySize]; } else if (valueType == BaseHashMap.longKeyOrValue) { isLongValue = true; longValueTable = new long[arraySize]; } else { isNoValue = true; } if (hasAccessCount) { accessTable = new int[arraySize]; } } protected int getLookup(Object key, int hash) { int lookup = hashIndex.getLookup(hash); Object tempKey; for (; lookup >= 0; lookup = hashIndex.getNextLookup(lookup)) { tempKey = objectKeyTable[lookup]; if (key.equals(tempKey)) { break; } } return lookup; } protected int getLookup(int key) { int lookup = hashIndex.getLookup(key); int tempKey; for (; lookup >= 0; lookup = hashIndex.linkTable[lookup]) { tempKey = intKeyTable[lookup]; if (key == tempKey) { break; } } return lookup; } protected int getLookup(long key) { int lookup = hashIndex.getLookup((int) key); long tempKey; for (; lookup >= 0; lookup = hashIndex.getNextLookup(lookup)) { tempKey = longKeyTable[lookup]; if (key == tempKey) { break; } } return lookup; } protected int getObjectLookup(long key) { int lookup = hashIndex.getLookup((int) key); long tempKey; for (; lookup >= 0; lookup = hashIndex.getNextLookup(lookup)) { tempKey = comparator.longKey(objectKeyTable[lookup]); if (tempKey == key) { break; } } return lookup; } protected Iterator getValuesIterator(Object key, int hash) { int lookup = getLookup(key, hash); if (valuesIterator == null) { valuesIterator = new ValuesIterator(); } valuesIterator.reset(key, lookup); return valuesIterator; } protected int valueCount(Object key, int hash) { int lookup = getLookup(key, hash); if (lookup == -1) { return 0; } int count = 1; while (true) { lookup = BaseHashMap.this.hashIndex.getNextLookup(lookup); if (lookup == -1) { break; } if (BaseHashMap.this.objectKeyTable[lookup].equals(key)) { count++; } } return count; } /** * generic method for adding or removing keys */ protected Object addOrRemove(long longKey, long longValue, Object objectKey, Object objectValue, boolean remove) { int hash = (int) longKey; if (isObjectKey) { if (objectKey == null) { return null; } if (comparator == null) { hash = objectKey.hashCode(); } else { hash = comparator.hashCode(objectKey); } } int index = hashIndex.getHashIndex(hash); int lookup = hashIndex.hashTable[index]; int lastLookup = -1; Object returnValue = null; for (; lookup >= 0; lastLookup = lookup, lookup = hashIndex.getNextLookup(lookup)) { if (isObjectKey) { if (comparator == null) { if (objectKeyTable[lookup].equals(objectKey)) { break; } } else { if (comparator.compare(objectKeyTable[lookup], objectKey) == 0) { break; } } } else if (isIntKey) { if (longKey == intKeyTable[lookup]) { break; } } else if (isLongKey) { if (longKey == longKeyTable[lookup]) { break; } } } if (lookup >= 0) { if (remove) { if (isObjectKey) { objectKeyTable[lookup] = null; } else { if (longKey == 0) { hasZeroKey = false; zeroKeyIndex = -1; } if (isIntKey) { intKeyTable[lookup] = 0; } else { longKeyTable[lookup] = 0; } } if (isObjectValue) { returnValue = objectValueTable[lookup]; objectValueTable[lookup] = null; } else if (isIntValue) { intValueTable[lookup] = 0; } else if (isLongValue) { longValueTable[lookup] = 0; } hashIndex.unlinkNode(index, lastLookup, lookup); if (accessTable != null) { accessTable[lookup] = 0; } if (minimizeOnEmpty && hashIndex.elementCount == 0) { rehash(initialCapacity); } return returnValue; } if (isObjectValue) { returnValue = objectValueTable[lookup]; objectValueTable[lookup] = objectValue; } else if (isIntValue) { intValueTable[lookup] = (int) longValue; } else if (isLongValue) { longValueTable[lookup] = longValue; } if (accessTable != null) { accessTable[lookup] = ++accessCount; } return returnValue; } // not found if (remove) { return null; } if (hashIndex.elementCount >= threshold) { if (reset()) { return addOrRemove(longKey, longValue, objectKey, objectValue, remove); } else { throw new NoSuchElementException("BaseHashMap"); } } lookup = hashIndex.linkNode(index, lastLookup); // type dependent block if (isObjectKey) { objectKeyTable[lookup] = objectKey; } else if (isIntKey) { intKeyTable[lookup] = (int) longKey; if (longKey == 0) { hasZeroKey = true; zeroKeyIndex = lookup; } } else if (isLongKey) { longKeyTable[lookup] = longKey; if (longKey == 0) { hasZeroKey = true; zeroKeyIndex = lookup; } } if (isObjectValue) { objectValueTable[lookup] = objectValue; } else if (isIntValue) { intValueTable[lookup] = (int) longValue; } else if (isLongValue) { longValueTable[lookup] = longValue; } // if (accessTable != null) { accessTable[lookup] = ++accessCount; } return returnValue; } /** * generic method for adding or removing key / values in multi-value * maps */ protected Object addOrRemoveMultiVal(long longKey, long longValue, Object objectKey, Object objectValue, boolean removeKey, boolean removeValue) { int hash = (int) longKey; if (isObjectKey) { if (objectKey == null) { return null; } if (comparator == null) { hash = objectKey.hashCode(); } else { hash = comparator.hashCode(objectKey); } } int index = hashIndex.getHashIndex(hash); int lookup = hashIndex.hashTable[index]; int lastLookup = -1; Object returnValue = null; boolean multiValue = false; for (; lookup >= 0; lastLookup = lookup, lookup = hashIndex.getNextLookup(lookup)) { if (isObjectKey) { if (comparator == null) { if (objectKeyTable[lookup].equals(objectKey)) {} else { continue; } } else { if (comparator.compare(objectKeyTable[lookup], objectKey) == 0) {} else { continue; } } if (removeKey) { while (true) { objectKeyTable[lookup] = null; returnValue = objectValueTable[lookup]; objectValueTable[lookup] = null; hashIndex.unlinkNode(index, lastLookup, lookup); multiValueTable[lookup] = false; lookup = hashIndex.hashTable[index]; if (lookup < 0 || !objectKeyTable[lookup].equals(objectKey)) { return returnValue; } } } else { if (objectValueTable[lookup].equals(objectValue)) { if (removeValue) { objectKeyTable[lookup] = null; returnValue = objectValueTable[lookup]; objectValueTable[lookup] = null; hashIndex.unlinkNode(index, lastLookup, lookup); multiValueTable[lookup] = false; lookup = lastLookup; return returnValue; } else { return objectValueTable[lookup]; } } } multiValue = true; } else if (isIntKey) { if (longKey == intKeyTable[lookup]) { if (removeKey) { while (true) { if (longKey == 0) { hasZeroKey = false; zeroKeyIndex = -1; } intKeyTable[lookup] = 0; intValueTable[lookup] = 0; hashIndex.unlinkNode(index, lastLookup, lookup); multiValueTable[lookup] = false; lookup = hashIndex.hashTable[index]; if (lookup < 0 || longKey != intKeyTable[lookup]) { return null; } } } else { if (intValueTable[lookup] == longValue) { return null; } } multiValue = true; } } else if (isLongKey) { if (longKey == longKeyTable[lookup]) { if (removeKey) { while (true) { if (longKey == 0) { hasZeroKey = false; zeroKeyIndex = -1; } longKeyTable[lookup] = 0; longValueTable[lookup] = 0; hashIndex.unlinkNode(index, lastLookup, lookup); multiValueTable[lookup] = false; lookup = hashIndex.hashTable[index]; if (lookup < 0 || longKey != longKeyTable[lookup]) { return null; } } } else { if (intValueTable[lookup] == longValue) { return null; } } multiValue = true; } } } if (removeKey || removeValue) { return returnValue; } if (hashIndex.elementCount >= threshold) { if (reset()) { return addOrRemoveMultiVal(longKey, longValue, objectKey, objectValue, removeKey, removeValue); } else { throw new NoSuchElementException("BaseHashMap"); } } lookup = hashIndex.linkNode(index, lastLookup); // type dependent block if (isObjectKey) { objectKeyTable[lookup] = objectKey; } else if (isIntKey) { intKeyTable[lookup] = (int) longKey; if (longKey == 0) { hasZeroKey = true; zeroKeyIndex = lookup; } } else if (isLongKey) { longKeyTable[lookup] = longKey; if (longKey == 0) { hasZeroKey = true; zeroKeyIndex = lookup; } } if (isObjectValue) { objectValueTable[lookup] = objectValue; } else if (isIntValue) { intValueTable[lookup] = (int) longValue; } else if (isLongValue) { longValueTable[lookup] = longValue; } if (multiValue) { multiValueTable[lookup] = true; } // if (accessTable != null) { accessTable[lookup] = ++accessCount; } return returnValue; } /** * type-specific method for adding or removing keys in long or int->Object maps */ protected Object addOrRemove(long longKey, Object objectValue, Object objectValueTwo, boolean remove) { int hash = (int) longKey; int index = hashIndex.getHashIndex(hash); int lookup = hashIndex.hashTable[index]; int lastLookup = -1; Object returnValue = null; for (; lookup >= 0; lastLookup = lookup, lookup = hashIndex.getNextLookup(lookup)) { if (isIntKey) { if (longKey == intKeyTable[lookup]) { break; } } else { if (longKey == longKeyTable[lookup]) { break; } } } if (lookup >= 0) { if (remove) { if (longKey == 0) { hasZeroKey = false; zeroKeyIndex = -1; } if (isIntKey) { intKeyTable[lookup] = 0; } else { longKeyTable[lookup] = 0; } returnValue = objectValueTable[lookup]; objectValueTable[lookup] = null; hashIndex.unlinkNode(index, lastLookup, lookup); if (isTwoObjectValue) { objectKeyTable[lookup] = null; } if (accessTable != null) { accessTable[lookup] = 0; } return returnValue; } if (isObjectValue) { returnValue = objectValueTable[lookup]; objectValueTable[lookup] = objectValue; } if (isTwoObjectValue) { objectKeyTable[lookup] = objectValueTwo; } if (accessTable != null) { accessTable[lookup] = ++accessCount; } return returnValue; } // not found if (remove) { return returnValue; } if (hashIndex.elementCount >= threshold) { if (reset()) { return addOrRemove(longKey, objectValue, objectValueTwo, remove); } else { return null; } } lookup = hashIndex.linkNode(index, lastLookup); if (isIntKey) { intKeyTable[lookup] = (int) longKey; } else { longKeyTable[lookup] = longKey; } if (longKey == 0) { hasZeroKey = true; zeroKeyIndex = lookup; } objectValueTable[lookup] = objectValue; if (isTwoObjectValue) { objectKeyTable[lookup] = objectValueTwo; } if (accessTable != null) { accessTable[lookup] = ++accessCount; } return returnValue; } /** * type specific method for Object sets or Object->Object maps */ protected Object removeObject(Object objectKey, boolean removeRow) { if (objectKey == null) { return null; } int hash = objectKey.hashCode(); int index = hashIndex.getHashIndex(hash); int lookup = hashIndex.hashTable[index]; int lastLookup = -1; Object returnValue = null; for (; lookup >= 0; lastLookup = lookup, lookup = hashIndex.getNextLookup(lookup)) { if (objectKeyTable[lookup].equals(objectKey)) { returnValue = objectKeyTable[lookup]; objectKeyTable[lookup] = null; hashIndex.unlinkNode(index, lastLookup, lookup); if (isObjectValue) { returnValue = objectValueTable[lookup]; objectValueTable[lookup] = null; } if (removeRow) { removeRow(lookup); } return returnValue; } } // not found return returnValue; } /** * For object sets using long key attribute of object for equality and * hash */ protected Object addOrRemoveObject(Object object, long longKey, boolean remove) { int hash = (int) longKey; int index = hashIndex.getHashIndex(hash); int lookup = hashIndex.getLookup(hash); int lastLookup = -1; Object returnValue = null; for (; lookup >= 0; lastLookup = lookup, lookup = hashIndex.getNextLookup(lookup)) { returnValue = objectKeyTable[lookup]; if (comparator.longKey(returnValue) == longKey) { break; } } if (lookup >= 0) { if (remove) { objectKeyTable[lookup] = null; hashIndex.unlinkNode(index, lastLookup, lookup); if (accessTable != null) { accessTable[lookup] = 0; } if (minimizeOnEmpty && hashIndex.elementCount == 0) { rehash(initialCapacity); } } else { objectKeyTable[lookup] = object; if (accessTable != null) { accessTable[lookup] = ++accessCount; } } return returnValue; } else if (remove) { return null; } if (hashIndex.elementCount >= threshold) { if (reset()) { return addOrRemoveObject(object, longKey, remove); } else { throw new NoSuchElementException("BaseHashMap"); } } lookup = hashIndex.linkNode(index, lastLookup); objectKeyTable[lookup] = object; if (accessTable != null) { accessTable[lookup] = ++accessCount; } return returnValue; } protected boolean reset() { if (maxCapacity == 0 || maxCapacity > threshold) { rehash(hashIndex.linkTable.length * 2); return true; } else if (purgePolicy == PURGE_ALL) { clear(); return true; } else if (purgePolicy == PURGE_QUARTER) { clear(threshold / 4, threshold >> 8); return true; } else if (purgePolicy == PURGE_HALF) { clear(threshold / 2, threshold >> 8); return true; } else if (purgePolicy == NO_PURGE) { return false; } return false; } /** * rehash uses existing key and element arrays. key / value pairs are * put back into the arrays from the top, removing any gaps. any redundant * key / value pairs duplicated at the end of the array are then cleared. * * newCapacity must be larger or equal to existing number of elements. */ protected void rehash(int newCapacity) { int limitLookup = hashIndex.newNodePointer; boolean oldZeroKey = hasZeroKey; int oldZeroKeyIndex = zeroKeyIndex; if (newCapacity < hashIndex.elementCount) { return; } hashIndex.reset((int) (newCapacity * loadFactor), newCapacity); if (multiValueTable != null) { int counter = multiValueTable.length; while (--counter >= 0) { multiValueTable[counter] = false; } } hasZeroKey = false; zeroKeyIndex = -1; threshold = newCapacity; for (int lookup = -1; (lookup = nextLookup(lookup, limitLookup, oldZeroKey, oldZeroKeyIndex)) < limitLookup; ) { long longKey = 0; long longValue = 0; Object objectKey = null; Object objectValue = null; if (isObjectKey) { objectKey = objectKeyTable[lookup]; } else if (isIntKey) { longKey = intKeyTable[lookup]; } else { longKey = longKeyTable[lookup]; } if (isObjectValue) { objectValue = objectValueTable[lookup]; } else if (isIntValue) { longValue = intValueTable[lookup]; } else if (isLongValue) { longValue = longValueTable[lookup]; } if (multiValueTable == null) { addOrRemove(longKey, longValue, objectKey, objectValue, false); } else { addOrRemoveMultiVal(longKey, longValue, objectKey, objectValue, false, false); } if (accessTable != null) { accessTable[hashIndex.elementCount - 1] = accessTable[lookup]; } } resizeElementArrays(hashIndex.newNodePointer, newCapacity); } /** * resize the arrays contianing the key / value data */ private void resizeElementArrays(int dataLength, int newLength) { Object temp; int usedLength = newLength > dataLength ? dataLength : newLength; if (isIntKey) { temp = intKeyTable; intKeyTable = new int[newLength]; System.arraycopy(temp, 0, intKeyTable, 0, usedLength); } if (isIntValue) { temp = intValueTable; intValueTable = new int[newLength]; System.arraycopy(temp, 0, intValueTable, 0, usedLength); } if (isLongKey) { temp = longKeyTable; longKeyTable = new long[newLength]; System.arraycopy(temp, 0, longKeyTable, 0, usedLength); } if (isLongValue) { temp = longValueTable; longValueTable = new long[newLength]; System.arraycopy(temp, 0, longValueTable, 0, usedLength); } if (objectKeyTable != null) { temp = objectKeyTable; objectKeyTable = new Object[newLength]; System.arraycopy(temp, 0, objectKeyTable, 0, usedLength); } if (isObjectValue) { temp = objectValueTable; objectValueTable = new Object[newLength]; System.arraycopy(temp, 0, objectValueTable, 0, usedLength); } if (objectValueTable2 != null) { temp = objectValueTable2; objectValueTable2 = new Object[newLength]; System.arraycopy(temp, 0, objectValueTable2, 0, usedLength); } if (accessTable != null) { temp = accessTable; accessTable = new int[newLength]; System.arraycopy(temp, 0, accessTable, 0, usedLength); } if (multiValueTable != null) { temp = multiValueTable; multiValueTable = new boolean[newLength]; System.arraycopy(temp, 0, multiValueTable, 0, usedLength); } } /** * clear all the key / value data in a range. */ private void clearElementArrays(final int from, final int to) { if (isIntKey) { int counter = to; while (--counter >= from) { intKeyTable[counter] = 0; } } else if (isLongKey) { int counter = to; while (--counter >= from) { longKeyTable[counter] = 0; } } else if (isObjectKey || objectKeyTable != null) { int counter = to; while (--counter >= from) { objectKeyTable[counter] = null; } } if (isIntValue) { int counter = to; while (--counter >= from) { intValueTable[counter] = 0; } } else if (isLongValue) { int counter = to; while (--counter >= from) { longValueTable[counter] = 0; } } else if (isObjectValue) { int counter = to; while (--counter >= from) { objectValueTable[counter] = null; } } if (accessTable != null) { int counter = to; while (--counter >= from) { accessTable[counter] = 0; } } if (multiValueTable != null) { int counter = to; while (--counter >= from) { multiValueTable[counter] = false; } } } /** * move the elements after a removed key / value pair to fill the gap */ void removeFromElementArrays(int lookup) { // this is newNodePointer post-removal int lastPointer = hashIndex.newNodePointer; if (isIntKey) { Object array = intKeyTable; System.arraycopy(array, lookup + 1, array, lookup, lastPointer - lookup); intKeyTable[lastPointer] = 0; } if (isLongKey) { Object array = longKeyTable; System.arraycopy(array, lookup + 1, array, lookup, lastPointer - lookup); longKeyTable[lastPointer] = 0; } if (isObjectKey || objectKeyTable != null) { Object array = objectKeyTable; System.arraycopy(array, lookup + 1, array, lookup, lastPointer - lookup); objectKeyTable[lastPointer] = null; } if (isIntValue) { Object array = intValueTable; System.arraycopy(array, lookup + 1, array, lookup, lastPointer - lookup); intValueTable[lastPointer] = 0; } if (isLongValue) { Object array = longValueTable; System.arraycopy(array, lookup + 1, array, lookup, lastPointer - lookup); longValueTable[lastPointer] = 0; } if (isObjectValue) { Object array = objectValueTable; System.arraycopy(array, lookup + 1, array, lookup, lastPointer - lookup); objectValueTable[lastPointer] = null; } } /** * find the next lookup in the key/value tables with an entry * allows the use of old limit and zero int key attributes */ int nextLookup(int lookup, int limitLookup, boolean hasZeroKey, int zeroKeyIndex) { for (++lookup; lookup < limitLookup; lookup++) { if (isObjectKey) { if (objectKeyTable[lookup] != null) { return lookup; } } else if (isIntKey) { if (intKeyTable[lookup] != 0) { return lookup; } else if (hasZeroKey && lookup == zeroKeyIndex) { return lookup; } } else { if (longKeyTable[lookup] != 0) { return lookup; } else if (hasZeroKey && lookup == zeroKeyIndex) { return lookup; } } } return lookup; } /** * find the next lookup in the key/value tables with an entry * uses current limits and zero integer key state */ protected int nextLookup(int lookup) { for (++lookup; lookup < hashIndex.newNodePointer; lookup++) { if (isObjectKey) { if (objectKeyTable[lookup] != null) { return lookup; } } else if (isIntKey) { if (intKeyTable[lookup] != 0) { return lookup; } else if (hasZeroKey && lookup == zeroKeyIndex) { return lookup; } } else { if (longKeyTable[lookup] != 0) { return lookup; } else if (hasZeroKey && lookup == zeroKeyIndex) { return lookup; } } } return -1; } /** * row must already been freed of key / element */ protected void removeRow(int lookup) { hashIndex.removeEmptyNode(lookup); removeFromElementArrays(lookup); } /** * Clear the map completely. */ public void clear() { if (hashIndex.modified) { accessCount = 0; accessMin = accessCount; hasZeroKey = false; zeroKeyIndex = -1; clearElementArrays(0, hashIndex.linkTable.length); hashIndex.clear(); if (minimizeOnEmpty) { rehash(initialCapacity); } } } /** * Return the max accessCount value for count elements with the lowest * access count. Always return at least accessMin + 1 */ public int getAccessCountCeiling(int count, int margin) { return ArrayCounter.rank(accessTable, hashIndex.newNodePointer, count, accessMin + 1, accessCount, margin); } /** * This is called after all elements below count accessCount have been * removed */ public void setAccessCountFloor(int count) { accessMin = count; } public int incrementAccessCount() { return ++accessCount; } /** * Clear approximately count elements from the map, starting with * those with low accessTable ranking. * * Only for maps with Object key table */ protected void clear(int count, int margin) { if (margin < 64) { margin = 64; } int maxlookup = hashIndex.newNodePointer; int accessBase = getAccessCountCeiling(count, margin); for (int lookup = 0; lookup < maxlookup; lookup++) { Object o = objectKeyTable[lookup]; if (o != null && accessTable[lookup] < accessBase) { removeObject(o, false); } } accessMin = accessBase; } protected void resetAccessCount() { if (accessCount < ACCESS_MAX) { return; } if (accessMin < Integer.MAX_VALUE - (1 << 24)) { accessMin = Integer.MAX_VALUE - (1 << 24); } int i = accessTable.length; while (--i >= 0) { if (accessTable[i] <= accessMin) { accessTable[i] = 0; } else { accessTable[i] -= accessMin; } } accessCount -= accessMin; accessMin = 0; } public int capacity() { return hashIndex.linkTable.length; } public int size() { return hashIndex.elementCount; } public boolean isEmpty() { return hashIndex.elementCount == 0; } protected void setComparator(ObjectComparator comparator) { this.comparator = comparator; } protected boolean containsKey(Object key) { if (key == null) { return false; } if (hashIndex.elementCount == 0) { return false; } int lookup = getLookup(key, key.hashCode()); return lookup == -1 ? false : true; } protected boolean containsKey(int key) { if (hashIndex.elementCount == 0) { return false; } int lookup = getLookup(key); return lookup == -1 ? false : true; } protected boolean containsKey(long key) { if (hashIndex.elementCount == 0) { return false; } int lookup = getLookup(key); return lookup == -1 ? false : true; } protected boolean containsValue(Object value) { int lookup = 0; if (hashIndex.elementCount == 0) { return false; } if (value == null) { for (; lookup < hashIndex.newNodePointer; lookup++) { if (objectValueTable[lookup] == null) { if (isObjectKey) { if (objectKeyTable[lookup] != null) { return true; } } else if (isIntKey) { if (intKeyTable[lookup] != 0) { return true; } else if (hasZeroKey && lookup == zeroKeyIndex) { return true; } } else { if (longKeyTable[lookup] != 0) { return true; } else if (hasZeroKey && lookup == zeroKeyIndex) { return true; } } } } } else { for (; lookup < hashIndex.newNodePointer; lookup++) { if (value.equals(objectValueTable[lookup])) { return true; } } } return false; } /** * Currently only for object maps */ protected class ValuesIterator implements org.hsqldb.lib.Iterator { int lookup = -1; Object key; private void reset(Object key, int lookup) { this.key = key; this.lookup = lookup; } public boolean hasNext() { return lookup != -1; } public Object next() throws NoSuchElementException { if (lookup == -1) { return null; } Object value = BaseHashMap.this.objectValueTable[lookup]; while (true) { lookup = BaseHashMap.this.hashIndex.getNextLookup(lookup); if (lookup == -1 || BaseHashMap.this.objectKeyTable[lookup].equals( key)) { break; } } return value; } public int nextInt() throws NoSuchElementException { throw new NoSuchElementException("Hash Iterator"); } public long nextLong() throws NoSuchElementException { throw new NoSuchElementException("Hash Iterator"); } public void remove() throws NoSuchElementException { throw new NoSuchElementException("Hash Iterator"); } public void setValue(Object value) { throw new NoSuchElementException("Hash Iterator"); } } protected class MultiValueKeyIterator implements Iterator { boolean keys; int lookup = -1; int counter; boolean removed; public MultiValueKeyIterator() { toNextLookup(); } private void toNextLookup() { while (true) { lookup = nextLookup(lookup); if (lookup == -1 || !multiValueTable[lookup]) { break; } } } public boolean hasNext() { return lookup != -1; } public Object next() throws NoSuchElementException { Object value = objectKeyTable[lookup]; toNextLookup(); return value; } public int nextInt() throws NoSuchElementException { throw new NoSuchElementException("Hash Iterator"); } public long nextLong() throws NoSuchElementException { throw new NoSuchElementException("Hash Iterator"); } public void remove() throws NoSuchElementException { throw new NoSuchElementException("Hash Iterator"); } public void setValue(Object value) { throw new NoSuchElementException("Hash Iterator"); } } /** * Iterator returns Object, int or long and is used both for keys and * values */ protected class BaseHashIterator implements Iterator { boolean keys; int lookup = -1; int counter; boolean removed; /** * default is iterator for values */ public BaseHashIterator() {} public BaseHashIterator(boolean keys) { this.keys = keys; } public void reset() { this.lookup = -1; this.counter = 0; this.removed = false; } public boolean hasNext() { return counter < hashIndex.elementCount; } public Object next() throws NoSuchElementException { if ((keys && !isObjectKey) || (!keys && !isObjectValue)) { throw new NoSuchElementException("Hash Iterator"); } removed = false; if (hasNext()) { counter++; lookup = nextLookup(lookup); if (keys) { return objectKeyTable[lookup]; } else { return objectValueTable[lookup]; } } throw new NoSuchElementException("Hash Iterator"); } public int nextInt() throws NoSuchElementException { if ((keys && !isIntKey) || (!keys && !isIntValue)) { throw new NoSuchElementException("Hash Iterator"); } removed = false; if (hasNext()) { counter++; lookup = nextLookup(lookup); if (keys) { return intKeyTable[lookup]; } else { return intValueTable[lookup]; } } throw new NoSuchElementException("Hash Iterator"); } public long nextLong() throws NoSuchElementException { if ((!isLongKey || !keys)) { throw new NoSuchElementException("Hash Iterator"); } removed = false; if (hasNext()) { counter++; lookup = nextLookup(lookup); if (keys) { return longKeyTable[lookup]; } else { return longValueTable[lookup]; } } throw new NoSuchElementException("Hash Iterator"); } public void remove() throws NoSuchElementException { if (removed) { throw new NoSuchElementException("Hash Iterator"); } counter--; removed = true; if (BaseHashMap.this.isObjectKey) { if (multiValueTable == null) { addOrRemove(0, 0, objectKeyTable[lookup], null, true); } else { if (keys) { addOrRemoveMultiVal(0, 0, objectKeyTable[lookup], null, true, false); } else { addOrRemoveMultiVal(0, 0, objectKeyTable[lookup], objectValueTable[lookup], false, true); } } } else if (isIntKey) { addOrRemove(intKeyTable[lookup], 0, null, null, true); } else { addOrRemove(longKeyTable[lookup], 0, null, null, true); } if (isList) { removeRow(lookup); lookup--; } } public void setValue(Object value) { if (keys) { throw new NoSuchElementException(); } objectValueTable[lookup] = value; } public int getAccessCount() { if (removed || accessTable == null) { throw new NoSuchElementException(); } return accessTable[lookup]; } public void setAccessCount(int count) { if (removed || accessTable == null) { throw new NoSuchElementException(); } accessTable[lookup] = count; } public int getLookup() { return lookup; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/store/BitMap.java0000644000175000017500000003301112007547362022115 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.store; /** * Implementation of a bit map of any size, together with static methods to * manipulate int, byte and byte[] values as bit maps. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.8.0 */ public class BitMap { int defaultCapacity; int capacity; int[] map; int limitPos; public BitMap(int initialCapacity) { int words = initialCapacity / 32; if (initialCapacity % 32 != 0) { words++; } defaultCapacity = capacity = words * 32; map = new int[words]; limitPos = 0; } public int size() { return limitPos; } public void setSize(int size) { limitPos = size; } /** * Resets to blank with original capacity */ public void reset() { map = new int[defaultCapacity / 32]; capacity = defaultCapacity; limitPos = 0; } /** * Sets pos and returns old value */ public int set(int pos) { while (pos >= capacity) { doubleCapacity(); } if (pos >= limitPos) { limitPos = pos + 1; } int windex = pos >> 5; int mask = 0x80000000 >>> (pos & 0x1F); int word = map[windex]; int result = (word & mask) == 0 ? 0 : 1; map[windex] = (word | mask); return result; } /** * Unsets pos and returns old value */ public int unset(int pos) { while (pos >= capacity) { doubleCapacity(); } if (pos >= limitPos) { limitPos = pos + 1; return 0; } int windex = pos >> 5; int mask = 0x80000000 >>> (pos & 0x1F); int word = map[windex]; int result = (word & mask) == 0 ? 0 : 1; mask = ~mask; map[windex] = (word & mask); return result; } public int get(int pos) { while (pos >= capacity) { doubleCapacity(); } if (pos >= limitPos) { limitPos = pos + 1; return 0; } int windex = pos >> 5; int mask = 0x80000000 >>> (pos & 0x1F); int word = map[windex]; return (word & mask) == 0 ? 0 : 1; } public boolean isSet(int pos) { return get(pos) == 1; } public byte[] getBytes() { byte[] buf = new byte[(limitPos + 7) / 8]; if (buf.length == 0) { return buf; } for (int i = 0; ; ) { int v = map[i / 4]; buf[i++] = (byte) (v >>> 24); if (i == buf.length) { break; } buf[i++] = (byte) (v >>> 16); if (i == buf.length) { break; } buf[i++] = (byte) (v >>> 8); if (i == buf.length) { break; } buf[i++] = (byte) v; if (i == buf.length) { break; } } return buf; } private void doubleCapacity() { int[] newmap = new int[map.length * 2]; capacity *= 2; System.arraycopy(map, 0, newmap, 0, map.length); map = newmap; } /** * copy the byte value into the map at given position (0, 24) */ public static int setByte(int map, byte value, int pos) { int intValue = (value & 0xff) << (24 - pos); int mask = 0xff000000 >>> pos; mask = ~mask; map &= mask; return (map | intValue); } public static int set(int map, int pos) { int mask = 0x80000000 >>> pos; return (map | mask); } public static byte set(byte map, int pos) { int mask = 0x00000080 >>> pos; return (byte) (map | mask); } public static int unset(int map, int pos) { int mask = 0x80000000 >>> pos; mask = ~mask; return (map & mask); } public static boolean isSet(int map, int pos) { int mask = 0x80000000 >>> pos; return (map & mask) == 0 ? false : true; } public static boolean isSet(byte map, int pos) { int mask = 0x00000080 >>> pos; return (map & mask) == 0 ? false : true; } public static boolean isSet(byte[] map, int pos) { int mask = 0x00000080 >>> (pos & 0x07);; int index = pos / 8; if (index >= map.length) { return false; } byte b = map[index]; return (b & mask) == 0 ? false : true; } public static void unset(byte[] map, int pos) { int mask = 0x00000080 >>> (pos & 0x07); mask = ~mask; int index = pos / 8; if (index >= map.length) { return; } byte b = map[index]; map[index] = (byte) (b & mask); } public static void set(byte[] map, int pos) { int mask = 0x00000080 >>> (pos & 0x07); int index = pos / 8; if (index >= map.length) { return; } byte b = map[index]; map[index] = (byte) (b | mask); } /** * AND count bits from source with map contents starting at pos */ public static void and(byte[] map, int pos, byte source, int count) { int shift = pos & 0x07; int mask = (source & 0xff) >>> shift; int innermask = 0xff >> shift; int index = pos / 8; if (count < 8) { innermask = innermask >>> (8 - count); innermask = innermask << (8 - count); } mask &= innermask; innermask = ~innermask; if (index >= map.length) { return; } byte b = map[index]; map[index] = (byte) (b & innermask); b = (byte) (b & mask); map[index] = (byte) (map[index] | b); if (shift == 0) { return; } shift = 8 - shift; if (count > shift) { mask = ((source & 0xff) << 8) >>> shift; innermask = 0xff00 >>> shift; innermask = ~innermask; b = map[index + 1]; map[index + 1] = (byte) (b & innermask); b = (byte) (b & mask); map[index + 1] = (byte) (map[index + 1] | b); } } /** * OR count bits from source with map contents starting at pos */ public static void or(byte[] map, int pos, byte source, int count) { int shift = pos & 0x07; int mask = (source & 0xff) >>> shift; int index = pos / 8; if (index >= map.length) { return; } byte b = (byte) (map[index] | mask); map[index] = b; if (shift == 0) { return; } shift = 8 - shift; if (count > shift) { mask = ((source & 0xff) << 8) >>> shift; b = (byte) (map[index + 1] | mask); map[index + 1] = b; } } /** * overlay count bits from source on map contents starting at pos */ public static void overlay(byte[] map, int pos, byte source, int count) { int shift = pos & 0x07; int mask = (source & 0xff) >>> shift; int innermask = 0xff >> shift; int index = pos / 8; if (count < 8) { innermask = innermask >>> (8 - count); innermask = innermask << (8 - count); } mask &= innermask; innermask = ~innermask; if (index >= map.length) { return; } byte b = map[index]; b = (byte) (b & innermask); map[index] = (byte) (b | mask); if (shift == 0) { return; } shift = 8 - shift; if (count > shift) { mask = ((source & 0xff) << 8) >>> shift; innermask = 0xff00 >>> shift; innermask = ~innermask; b = map[index + 1]; b = (byte) (b & innermask); map[index + 1] = (byte) (b | mask); } } public static int compare(byte[] a, byte[] b) { int shortLength = a.length > b.length ? b.length : a.length; for (int i = 0; i < shortLength; i++) { if (a[i] == b[i]) { continue; } return (((int) a[i]) & 0xff) > (((int) b[i]) & 0xff) ? 1 : -1; } if (a.length == b.length) { return 0; } return a.length > b.length ? 1 : -1; } public static byte[] and(byte[] a, byte[] b) { int length = a.length > b.length ? a.length : b.length; int shortLength = a.length > b.length ? b.length : a.length; byte[] map = new byte[length]; for (int i = 0; i < shortLength; i++) { map[i] = (byte) (a[i] & b[i]); } return map; } public static byte[] or(byte[] a, byte[] b) { int length = a.length > b.length ? a.length : b.length; int shortLength = a.length > b.length ? b.length : a.length; byte[] map = new byte[length]; if (length != shortLength) { byte[] source = a.length > b.length ? a : b; System.arraycopy(source, shortLength, map, shortLength, length - shortLength); } for (int i = 0; i < shortLength; i++) { map[i] = (byte) (a[i] | b[i]); } return map; } public static byte[] xor(byte[] a, byte[] b) { int length = a.length > b.length ? a.length : b.length; int shortLength = a.length > b.length ? b.length : a.length; byte[] map = new byte[length]; if (length != shortLength) { byte[] source = a.length > b.length ? a : b; System.arraycopy(source, shortLength, map, shortLength, length - shortLength); } for (int i = 0; i < shortLength; i++) { map[i] = (byte) (a[i] ^ b[i]); } return map; } public static byte[] not(byte[] a) { byte[] map = new byte[a.length]; for (int i = 0; i < a.length; i++) { map[i] = (byte) ~a[i]; } return map; } public static boolean hasAnyBitSet(byte[] map) { for (int i = 0; i < map.length; i++) { if (map[i] != 0) { return true; } } return false; } public static byte[] leftShift(byte[] map, int shiftBits) { byte[] newMap = new byte[map.length]; int shiftBytes = shiftBits / 8; if (shiftBytes >= map.length) { return newMap; } shiftBits = shiftBits % 8; if (shiftBits == 0) { for (int i = 0, j = shiftBytes; j < map.length; i++, j++) { newMap[i] = map[j]; } } else { for (int i = 0, j = shiftBytes; j < map.length; i++, j++) { int shifted = (map[j] & 0xff) << shiftBits; newMap[i] = (byte) shifted; if (i > 0) { newMap[i - 1] |= (byte) (shifted >>> 8); } } } return newMap; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/store/ValuePoolHashMap.java0000644000175000017500000003062312007547362024117 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.store; import org.hsqldb.types.TimestampData; /* * implementation notes: * * NB: As of this version this class cannot be used for mixed object types * It is relativly easy to support this by adding an 'instanceof' test inside * each getOrAddXxxx method before casting the Set values to the target type * for comparison purposes. * * superclass is used as an Object Set * getOrAddXxxx methods are implemented directly for speed * the superclass infrastructure is otherwise used */ /** * Subclass of BaseHashMap for maintaining a pool of objects. Supports a * range of java.lang.* objects. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 * */ public class ValuePoolHashMap extends BaseHashMap { public ValuePoolHashMap(int initialCapacity, int maxCapacity, int purgePolicy) throws IllegalArgumentException { super(initialCapacity, BaseHashMap.objectKeyOrValue, BaseHashMap.noKeyOrValue, true); this.maxCapacity = maxCapacity; this.purgePolicy = purgePolicy; } /** * In rare circumstances resetCapacity may not succeed, in which case * capacity remains unchanged but purge policy is set to newPolicy */ public void resetCapacity(int newCapacity, int newPolicy) throws IllegalArgumentException { if (newCapacity != 0 && hashIndex.elementCount > newCapacity) { int surplus = hashIndex.elementCount - newCapacity; surplus += (surplus >> 5); if (surplus > hashIndex.elementCount) { surplus = hashIndex.elementCount; } clear(surplus, (surplus >> 6)); } if (newCapacity != 0 && newCapacity < threshold) { rehash(newCapacity); if (newCapacity < hashIndex.elementCount) { newCapacity = maxCapacity; } } this.maxCapacity = newCapacity; this.purgePolicy = newPolicy; } protected Integer getOrAddInteger(int intKey) { Integer testValue; int index = hashIndex.getHashIndex(intKey); int lookup = hashIndex.hashTable[index]; int lastLookup = -1; for (; lookup >= 0; lastLookup = lookup, lookup = hashIndex.getNextLookup(lookup)) { testValue = (Integer) objectKeyTable[lookup]; if (testValue.intValue() == intKey) { if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } } if (hashIndex.elementCount >= threshold) { reset(); return getOrAddInteger(intKey); } lookup = hashIndex.linkNode(index, lastLookup); testValue = new Integer(intKey); objectKeyTable[lookup] = testValue; if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } protected Long getOrAddLong(long longKey) { Long testValue; int index = hashIndex.getHashIndex((int) (longKey ^ (longKey >>> 32))); int lookup = hashIndex.hashTable[index]; int lastLookup = -1; for (; lookup >= 0; lastLookup = lookup, lookup = hashIndex.getNextLookup(lookup)) { testValue = (Long) objectKeyTable[lookup]; if (testValue.longValue() == longKey) { if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } } if (hashIndex.elementCount >= threshold) { reset(); return getOrAddLong(longKey); } lookup = hashIndex.linkNode(index, lastLookup); testValue = new Long(longKey); objectKeyTable[lookup] = testValue; if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } /** * This is dissimilar to normal hash map get() methods. The key Object * should have an equals(String) method which should return true if the * key.toString().equals(String) is true. Also the key.hashCode() method * must return the same value as key.toString.hashCode().

              * * The above is always true when the key is a String. But it means it is * possible to submit special keys that fulfill the contract. For example * a wrapper around a byte[] can be submitted as key to retrieve either * a new String, which is the result of the toString() method of the * wrapper, or return an existing String which would be equal to the result * of toString(). * * @param key String or other Object with compatible equals(String) * and hashCode(). * @return String from map or a new String */ protected String getOrAddString(Object key) { String testValue; int index = hashIndex.getHashIndex(key.hashCode()); int lookup = hashIndex.hashTable[index]; int lastLookup = -1; for (; lookup >= 0; lastLookup = lookup, lookup = hashIndex.getNextLookup(lookup)) { testValue = (String) objectKeyTable[lookup]; if (key.equals(testValue)) { if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } } if (hashIndex.elementCount >= threshold) { reset(); return getOrAddString(key); } testValue = key.toString(); lookup = hashIndex.linkNode(index, lastLookup); objectKeyTable[lookup] = testValue; if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } protected String getOrAddSubString(String key, int from, int limit) { // to improve key = key.substring(from, limit); String testValue; int index = hashIndex.getHashIndex(key.hashCode()); int lookup = hashIndex.hashTable[index]; int lastLookup = -1; for (; lookup >= 0; lastLookup = lookup, lookup = hashIndex.getNextLookup(lookup)) { testValue = (String) objectKeyTable[lookup]; if (key.equals(testValue)) { if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } } if (hashIndex.elementCount >= threshold) { reset(); return getOrAddString(key); } testValue = new String(key.toCharArray()); lookup = hashIndex.linkNode(index, lastLookup); objectKeyTable[lookup] = testValue; if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } protected TimestampData getOrAddDate(long longKey) { TimestampData testValue; int hash = (int) longKey ^ (int) (longKey >>> 32); int index = hashIndex.getHashIndex(hash); int lookup = hashIndex.hashTable[index]; int lastLookup = -1; for (; lookup >= 0; lastLookup = lookup, lookup = hashIndex.getNextLookup(lookup)) { testValue = (TimestampData) objectKeyTable[lookup]; if (testValue.getSeconds() == longKey) { if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } } if (hashIndex.elementCount >= threshold) { reset(); return getOrAddDate(longKey); } lookup = hashIndex.linkNode(index, lastLookup); testValue = new TimestampData(longKey); objectKeyTable[lookup] = testValue; if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } protected Double getOrAddDouble(long longKey) { Double testValue; int index = hashIndex.getHashIndex((int) (longKey ^ (longKey >>> 32))); int lookup = hashIndex.hashTable[index]; int lastLookup = -1; for (; lookup >= 0; lastLookup = lookup, lookup = hashIndex.getNextLookup(lookup)) { testValue = (Double) objectKeyTable[lookup]; if (Double.doubleToLongBits(testValue.doubleValue()) == longKey) { if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } } if (hashIndex.elementCount >= threshold) { reset(); return getOrAddDouble(longKey); } lookup = hashIndex.linkNode(index, lastLookup); testValue = new Double(Double.longBitsToDouble(longKey)); objectKeyTable[lookup] = testValue; if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } protected Object getOrAddObject(Object key) { Object testValue; int index = hashIndex.getHashIndex(key.hashCode()); int lookup = hashIndex.hashTable[index]; int lastLookup = -1; for (; lookup >= 0; lastLookup = lookup, lookup = hashIndex.getNextLookup(lookup)) { testValue = objectKeyTable[lookup]; if (testValue.equals(key)) { if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return testValue; } } if (hashIndex.elementCount >= threshold) { reset(); return getOrAddObject(key); } lookup = hashIndex.linkNode(index, lastLookup); objectKeyTable[lookup] = key; if (accessCount > ACCESS_MAX) { resetAccessCount(); } accessTable[lookup] = accessCount++; return key; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/store/HashIndex.java0000644000175000017500000001730512007547362022624 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.store; /** * A chained bucket hash index implementation. * * hashTable and linkTable are arrays of signed integral types. This * implementation uses int as the type but short or byte can be used for * smaller index sizes (cardinality). * * hashTable[index] contains the pointer to the first node with * (index == hash modulo hashTable.length) or -1 if there is no corresponding * node. linkTable[{0,newNodePointer}] (the range between 0 and newNodePointer) * contains either the pointer to the next node or -1 if there is no * such node. reclaimedNodeIndex contains a pointer to an element * of linkTable which is the first element in the list of reclaimed nodes * (nodes no longer in index) or -1 if there is no such node. * * elemenet at and above linkTable[newNodePointer] have never been used * as a node and their contents is not significant. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 */ public class HashIndex { int[] hashTable; int[] linkTable; int newNodePointer; int elementCount; int reclaimedNodePointer = -1; boolean fixedSize; boolean modified; public HashIndex(int hashTableSize, int capacity, boolean fixedSize) { if (capacity < hashTableSize) { capacity = hashTableSize; } reset(hashTableSize, capacity); this.fixedSize = fixedSize; } /** * Reset the structure with a new size as empty. * * @param hashTableSize * @param capacity */ public void reset(int hashTableSize, int capacity) { int[] newHT = new int[hashTableSize]; int[] newLT = new int[capacity]; // allocate memory before assigning hashTable = newHT; linkTable = newLT; resetTables(); } public void resetTables() { int to = hashTable.length; int[] intArray = hashTable; while (--to >= 0) { intArray[to] = -1; } newNodePointer = 0; elementCount = 0; reclaimedNodePointer = -1; modified = false; } /** * Reset the index as empty. */ public void clear() { int to = linkTable.length; int[] intArray = linkTable; while (--to >= 0) { intArray[to] = 0; } resetTables(); } /** * @param hash */ public int getHashIndex(int hash) { return (hash & 0x7fffffff) % hashTable.length; } /** * Return the array index for a hash. * * @param hash the hash value used for indexing * @return either -1 or the first node for this hash value */ public int getLookup(int hash) { if (elementCount == 0) { return -1; } int index = (hash & 0x7fffffff) % hashTable.length; return hashTable[index]; } /** * This looks from a given node, so the parameter is always > -1. * * @param lookup A valid node to look from * @return either -1 or the next node from this node */ public int getNextLookup(int lookup) { return linkTable[lookup]; } /** * Link a new node to the end of the linked for a hash index. * * @param index an index into hashTable * @param lastLookup either -1 or the node to which the new node will be linked * @return the new node */ public int linkNode(int index, int lastLookup) { // get the first reclaimed slot int lookup = reclaimedNodePointer; if (lookup == -1) { lookup = newNodePointer++; } else { // reset the first reclaimed slot reclaimedNodePointer = linkTable[lookup]; } // link the node if (lastLookup == -1) { hashTable[index] = lookup; } else { linkTable[lastLookup] = lookup; } linkTable[lookup] = -1; elementCount++; modified = true; return lookup; } /** * Unlink a node from a linked list and link into the reclaimed list. * * @param index an index into hashTable * @param lastLookup either -1 or the node to which the target node is linked * @param lookup the node to remove */ public void unlinkNode(int index, int lastLookup, int lookup) { // unlink the node if (lastLookup == -1) { hashTable[index] = linkTable[lookup]; } else { linkTable[lastLookup] = linkTable[lookup]; } // add to reclaimed list linkTable[lookup] = reclaimedNodePointer; reclaimedNodePointer = lookup; elementCount--; } /** * Remove a node that has already been unlinked. This is not required * for index operations. It is used only when the row needs to be removed * from the data structures that store the actual indexed data and the * nodes need to be contiguous. * * @param lookup the node to remove * @return true if node found in unlinked state */ public boolean removeEmptyNode(int lookup) { boolean found = false; int lastLookup = -1; for (int i = reclaimedNodePointer; i >= 0; lastLookup = i, i = linkTable[i]) { if (i == lookup) { if (lastLookup == -1) { reclaimedNodePointer = linkTable[lookup]; } else { linkTable[lastLookup] = linkTable[lookup]; } found = true; break; } } if (!found) { return false; } for (int i = 0; i < newNodePointer; i++) { if (linkTable[i] > lookup) { linkTable[i]--; } } System.arraycopy(linkTable, lookup + 1, linkTable, lookup, newNodePointer - lookup - 1); linkTable[newNodePointer - 1] = 0; newNodePointer--; for (int i = 0; i < hashTable.length; i++) { if (hashTable[i] > lookup) { hashTable[i]--; } } return true; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/store/ValuePool.java0000644000175000017500000001532612007547362022660 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.store; import java.math.BigDecimal; /** * Supports pooling of Integer, Long, Double, BigDecimal, String and Date * Java Objects. Leads to reduction in memory use when an Object is used more * then twice in the database. * * getXXX methods are used for retrival of values. If a value is not in * the pool, it is added to the pool and returned. When the pool gets * full, half the contents that have been accessed less recently are purged. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public class ValuePool { // static ValuePoolHashMap intPool; static ValuePoolHashMap longPool; static ValuePoolHashMap doublePool; static ValuePoolHashMap bigdecimalPool; static ValuePoolHashMap stringPool; static final int SPACE_STRING_SIZE = 64; static final int DEFAULT_VALUE_POOL_SIZE = 4096; static final int[] defaultPoolLookupSize = new int[] { DEFAULT_VALUE_POOL_SIZE, DEFAULT_VALUE_POOL_SIZE, DEFAULT_VALUE_POOL_SIZE, DEFAULT_VALUE_POOL_SIZE, DEFAULT_VALUE_POOL_SIZE }; static final int POOLS_COUNT = defaultPoolLookupSize.length; static final int defaultSizeFactor = 2; static final int defaultMaxStringLength = 16; // static ValuePoolHashMap[] poolList; // static int maxStringLength; // static { initPool(); } public static final Integer INTEGER_0 = ValuePool.getInt(0); public static final Integer INTEGER_1 = ValuePool.getInt(1); public static final Integer INTEGER_2 = ValuePool.getInt(2); public static final Integer INTEGER_MAX = ValuePool.getInt(Integer.MAX_VALUE); public static final BigDecimal BIG_DECIMAL_0 = ValuePool.getBigDecimal(new BigDecimal(0.0)); public static final BigDecimal BIG_DECIMAL_1 = ValuePool.getBigDecimal(new BigDecimal(1.0)); // public static final String[] emptyStringArray = new String[]{}; public static final Object[] emptyObjectArray = new Object[]{}; public static final int[] emptyIntArray = new int[]{}; public static String spaceString; // private static void initPool() { int[] sizeArray = defaultPoolLookupSize; int sizeFactor = defaultSizeFactor; synchronized (ValuePool.class) { maxStringLength = defaultMaxStringLength; poolList = new ValuePoolHashMap[POOLS_COUNT]; for (int i = 0; i < POOLS_COUNT; i++) { int size = sizeArray[i]; poolList[i] = new ValuePoolHashMap(size, size * sizeFactor, BaseHashMap.PURGE_HALF); } intPool = poolList[0]; longPool = poolList[1]; doublePool = poolList[2]; bigdecimalPool = poolList[3]; stringPool = poolList[4]; char[] c = new char[SPACE_STRING_SIZE]; for (int i = 0; i < SPACE_STRING_SIZE; i++) { c[i] = ' '; } spaceString = new String(c); } } public static int getMaxStringLength() { return maxStringLength; } public static void resetPool(int[] sizeArray, int sizeFactor) { synchronized (ValuePool.class) { for (int i = 0; i < POOLS_COUNT; i++) { poolList[i].clear(); poolList[i].resetCapacity(sizeArray[i] * sizeFactor, BaseHashMap.PURGE_HALF); } } } public static void resetPool() { synchronized (ValuePool.class) { resetPool(defaultPoolLookupSize, defaultSizeFactor); } } public static void clearPool() { synchronized (ValuePool.class) { for (int i = 0; i < POOLS_COUNT; i++) { poolList[i].clear(); } } } public static Integer getInt(int val) { synchronized (intPool) { return intPool.getOrAddInteger(val); } } public static Long getLong(long val) { synchronized (longPool) { return longPool.getOrAddLong(val); } } public static Double getDouble(long val) { synchronized (doublePool) { return doublePool.getOrAddDouble(val); } } public static String getString(String val) { if (val == null || val.length() > maxStringLength) { return val; } synchronized (stringPool) { return stringPool.getOrAddString(val); } } public static String getSubString(String val, int start, int limit) { synchronized (stringPool) { return stringPool.getOrAddString(val.substring(start, limit)); } } public static BigDecimal getBigDecimal(BigDecimal val) { if (val == null) { return val; } synchronized (bigdecimalPool) { return (BigDecimal) bigdecimalPool.getOrAddObject(val); } } public static Boolean getBoolean(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/0000755000175000017500000000000012007570424020245 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/HsqlSocketFactorySecure.java0000644000175000017500000003251312007547404025675 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.security.Principal; import java.security.Provider; import java.security.PublicKey; import java.security.Security; import javax.net.ssl.HandshakeCompletedEvent; import javax.net.ssl.HandshakeCompletedListener; import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import javax.security.cert.X509Certificate; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.StringConverter; /** * The default secure socket factory implementation. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Blaine Simpson (blaine dot simpson at admc dot com) * * @version 1.7.2 * @since 1.7.2 */ public final class HsqlSocketFactorySecure extends HsqlSocketFactory implements HandshakeCompletedListener { // --------------------------------- members ----------------------------------- /** The underlying socket factory implementation. */ protected Object socketFactory; /** The underlying server socket factory implementation. */ protected Object serverSocketFactory; /** * Monitor object to guard against conncurrent modification * of the underlying socket factory implementation member. */ protected final Object socket_factory_mutex = new Object(); /** * Monitor object to guard against concurrent modification of * the underlying server socket factory implementation member. */ protected final Object server_socket_factory_mutex = new Object(); // ------------------------------ constructors --------------------------------- /** * External construction disabled. New factory instances are retreived * through the newHsqlSocketFactory method instead. */ protected HsqlSocketFactorySecure() throws Exception { super(); Provider p; String cls; if (Security.getProvider("SunJSSE") == null) { try { p = (Provider) Class.forName( "com.sun.net.ssl.internal.ssl.Provider").newInstance(); Security.addProvider(p); } catch (Exception e) {} } } // ----------------------------- subclass overrides ---------------------------- public void configureSocket(Socket socket) { SSLSocket s; super.configureSocket(socket); s = (SSLSocket) socket; s.addHandshakeCompletedListener(this); } /** * Creates a secure server socket bound to the specified port. * The socket is configured with the socket options * given to this factory. * * @return the secure ServerSocket * @param port the port to which to bind the secure ServerSocket * @throws Exception if a network or security provider error occurs */ public ServerSocket createServerSocket(int port) throws Exception { SSLServerSocket ss; ss = (SSLServerSocket) getServerSocketFactoryImpl() .createServerSocket(port); if (Error.TRACESYSTEMOUT) { Error.printSystemOut("[" + this + "]: createServerSocket()"); Error.printSystemOut("capabilities for " + ss + ":"); Error.printSystemOut("----------------------------"); dump("supported cipher suites", ss.getSupportedCipherSuites()); dump("enabled cipher suites", ss.getEnabledCipherSuites()); } return ss; } /** * Creates a secure server socket bound to the specified port. * The socket is configured with the socket options * given to this factory. * * @return the secure ServerSocket * @param port the port to which to bind the secure ServerSocket * @throws Exception if a network or security provider error occurs */ public ServerSocket createServerSocket(int port, String address) throws Exception { SSLServerSocket ss; InetAddress addr; addr = InetAddress.getByName(address); ss = (SSLServerSocket) getServerSocketFactoryImpl() .createServerSocket(port, 128, addr); if (Error.TRACESYSTEMOUT) { Error.printSystemOut("[" + this + "]: createServerSocket()"); Error.printSystemOut("capabilities for " + ss + ":"); Error.printSystemOut("----------------------------"); dump("supported cipher suites", ss.getSupportedCipherSuites()); dump("enabled cipher suites", ss.getEnabledCipherSuites()); } return ss; } private static void dump(String title, String[] as) { Error.printSystemOut(title); Error.printSystemOut("----------------------------"); for (int i = 0; i < as.length; i++) { Error.printSystemOut(String.valueOf(as[i])); } Error.printSystemOut("----------------------------"); } /** * Creates a secure Socket and connects it to the specified remote host * at the specified remote port. This socket is configured using the * socket options established for this factory. * * @return the socket * @param host the server host * @param port the server port * @throws Exception if a network or security provider error occurs */ public Socket createSocket(String host, int port) throws Exception { SSLSocket socket; socket = (SSLSocket) getSocketFactoryImpl().createSocket(host, port); socket.addHandshakeCompletedListener(this); socket.startHandshake(); // unsaved@users // For https protocol, the protocol handler should do this verification // (Sun's implementation does), but if we do not use the Protocol // handler (which is only available in Java >= 1.4), then we need to do // the verification: hostname == cert CN // // boucherb@users 20030503: // CHEKME/TODO: // // Stricter verify? Either require SunJSSE (assume its trust manager properly // verifies whole chain), or implement our own TrustManager layer? // // What about v1/v3 and signing checks (re: man-in-the-middle attack), // CRL check, basic constraints? notBefore? notAfter? // // Reference: http://www.securitytracker.com/alerts/2002/Aug/1005030.html // // That is, we can't guarantee that installed/prefered provider trust manager // implementations verify the whole chain properly and there are still // v1 certs out there (i.e. have no basic constraints, etc.), meaning that // we should check for and reject any intermediate certs that are not v3+ // (cannot be checked for basic constraints). Only root and intermediate // certs found in the trust store should be allowed to be v1 (since we must // be trusing them for them to be there). All other intermediate signers, // however, should be required to be v3+, otherwise anybody with any kind // of cert issued somehow via a trust chain from the root can pose as an // intermediate signing CA and hence leave things open to man-in-the-middle // style attack. Also, we should really check CRLs, just in case // it turns out that trust chain has been breached and thus issuer has revoked // on some cert(s). Of course, this really begs the question, as it is not // guaranteed that all CAs in trust store have valid, working CRL URL // // So what to do? // // Maybe best to leave this all up to DBA? verify(host, socket.getSession()); return socket; } /** * Retrieves whether this factory produces secure sockets. * * @return true iff this factory creates secure sockets */ public boolean isSecure() { return true; } // ----------------------- internal implementation ----------------------------- /** * Retrieves the underlying javax.net.ssl.SSLServerSocketFactory. * * @throws Exception if there is a problem retrieving the * underlying factory * @return the underlying javax.net.ssl.SSLServerSocketFactory */ protected SSLServerSocketFactory getServerSocketFactoryImpl() throws Exception { Object factory; synchronized (server_socket_factory_mutex) { factory = serverSocketFactory; if (factory == null) { factory = SSLServerSocketFactory.getDefault(); serverSocketFactory = factory; } } return (SSLServerSocketFactory) factory; } /** * Retrieves the underlying javax.net.ssl.SSLSocketFactory. * * @throws Exception if there is a problem retrieving the * underlying factory * @return the underlying javax.net.ssl.SSLSocketFactory */ protected SSLSocketFactory getSocketFactoryImpl() throws Exception { Object factory; synchronized (socket_factory_mutex) { factory = socketFactory; if (factory == null) { factory = SSLSocketFactory.getDefault(); socketFactory = factory; } } return (SSLSocketFactory) factory; } /** * Verifyies the certificate chain presented by the server to which * a secure Socket has just connected. Specifically, the provided host * name is checked against the Common Name of the server certificate; * additional checks may or may not be performed. * * @param host the requested host name * @param session SSLSession used on the connection to host * @throws Exception if the certificate chain cannot be verified */ protected void verify(String host, SSLSession session) throws Exception { X509Certificate[] chain; X509Certificate certificate; Principal principal; PublicKey publicKey; String DN; String CN; int start; int end; String emsg; chain = session.getPeerCertificateChain(); certificate = chain[0]; principal = certificate.getSubjectDN(); DN = String.valueOf(principal); start = DN.indexOf("CN="); if (start < 0) { throw new UnknownHostException( Error.getMessage(ErrorCode.M_SERVER_SECURE_VERIFY_1)); } start += 3; end = DN.indexOf(',', start); CN = DN.substring(start, (end > -1) ? end : DN.length()); if (CN.length() < 1) { throw new UnknownHostException( Error.getMessage(ErrorCode.M_SERVER_SECURE_VERIFY_2)); } if (!CN.equalsIgnoreCase(host)) { // TLS_HOSTNAME_MISMATCH throw new UnknownHostException( Error.getMessage( ErrorCode.M_SERVER_SECURE_VERIFY_3, 0, new Object[] { CN, host })); } } public void handshakeCompleted(HandshakeCompletedEvent evt) { SSLSession session; String sessionId; SSLSocket socket; if (Error.TRACESYSTEMOUT) { socket = evt.getSocket(); session = evt.getSession(); Error.printSystemOut("SSL handshake completed:"); Error.printSystemOut( "------------------------------------------------"); Error.printSystemOut("socket: : " + socket); Error.printSystemOut("cipher suite : " + session.getCipherSuite()); sessionId = StringConverter.byteArrayToHexString(session.getId()); Error.printSystemOut("session id : " + sessionId); Error.printSystemOut( "------------------------------------------------"); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/OdbcPacketOutputStream.java0000644000175000017500000001142112007547404025505 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; /** * Atomic transmission packet from HyperSQL server to ODBC client. * * Sample usage * * outPacket = OdbcPacketOutputStream.newOdbcPacketOutputStream(); * ... * // For each packet you need to transmit: * outPacket.reset(); * outPacket.write(this); * outPacket.write(that); * outPacket.xmit('X', hsqlDataOutputStream); * */ class OdbcPacketOutputStream extends DataOutputStream { private ByteArrayOutputStream byteArrayOutputStream; private ByteArrayOutputStream stringWriterOS = new ByteArrayOutputStream(); private DataOutputStream stringWriterDos = new DataOutputStream(stringWriterOS); private int packetStart = 0; // Stream's "written" at start of packet. public int getSize() { return written - packetStart; } /** * Wrapper method to write a null-terminated String. */ synchronized void write(String s) throws IOException { write(s, true); } synchronized void write(String s, boolean nullTerm) throws IOException { stringWriterDos.writeUTF(s); write(stringWriterOS.toByteArray(), 2, stringWriterOS.size() - 2); stringWriterOS.reset(); if (nullTerm) { writeByte(0); } } synchronized void writeSized(String s) throws IOException { stringWriterDos.writeUTF(s); byte[] ba = stringWriterOS.toByteArray(); stringWriterOS.reset(); writeInt(ba.length - 2); write(ba, 2, ba.length - 2); } synchronized void reset() throws IOException { byteArrayOutputStream.reset(); packetStart = written; writeInt(-1); // length placeholder } static OdbcPacketOutputStream newOdbcPacketOutputStream() throws IOException { return new OdbcPacketOutputStream(new ByteArrayOutputStream()); } protected OdbcPacketOutputStream( ByteArrayOutputStream byteArrayOutputStream) throws IOException { super(byteArrayOutputStream); this.byteArrayOutputStream = byteArrayOutputStream; reset(); } /** * @return packet size (which does not count the type byte). */ synchronized int xmit( char packetType, org.hsqldb.lib.DataOutputStream destinationStream) throws IOException { byte[] ba = byteArrayOutputStream.toByteArray(); ba[0] = (byte) (ba.length >> 24); ba[1] = (byte) (ba.length >> 16); ba[2] = (byte) (ba.length >> 8); ba[3] = (byte) ba.length; reset(); destinationStream.writeByte(packetType); destinationStream.write(ba); destinationStream.flush(); return ba.length; } synchronized public void close() throws IOException { super.close(); stringWriterDos.close(); } /** * The behavior here is purposefully different from * java.io.DataOutputStream.writeChar(int), which writes 2 bytes. * * We are supporting only 1-byte characters, or don't care about the * high bits. */ synchronized public void writeByteChar(char c) throws IOException { writeByte(c); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/PgType.java0000644000175000017500000005361612007547404022335 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * $Id: PgType.java 4141 2011-03-14 01:35:49Z fredt $ */ package org.hsqldb.server; import java.sql.SQLException; import org.hsqldb.HsqlException; import org.hsqldb.Session; import org.hsqldb.jdbc.Util; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Postgres types. * * @author Blaine Simpson (blaine dot simpson at admc dot com) * @since 1.9.0 */ public class PgType { private int oid; private int typeWidth = -1; private int lpConstraint = -1; // Length or Precision private Type hType; public int getOid() { return oid; } public int getTypeWidth() { return typeWidth; } public int getLPConstraint() { return lpConstraint; } /** * Convenience wrapper for PgType constructor, when there is no * type width, length, or precision setting for the type. * * @see #PgType(Type, int, Integer, Integer) */ protected PgType(Type hType, int oid) { this(hType, oid, null, null); } /** * Convenience wrapper for PgType constructor, when there is no * length or precision setting for the type. * * @see #PgType(Type, int, Integer, Integer) */ protected PgType(Type hType, int oid, int typeWidth) { this(hType, oid, new Integer(typeWidth), null); } /** * Convenience wrapper for PgType constructor, when there is no fixed * width for the type. * * @param dummy Normally pass null. This is a dummy parameter just to make * a unique method signature. If non-null, will be treated * exactly the same as the typeWidthObject from the 3-param * constructor. * @see #PgType(Type, int, Integer, Integer) */ protected PgType(Type hType, int oid, Integer dummy, long lpConstraint) throws RecoverableOdbcFailure { this(hType, oid, dummy, new Integer((int) lpConstraint)); if (lpConstraint < 0) { throw new RecoverableOdbcFailure( "Length/Precision value is below minimum value of 0"); } if (lpConstraint > Integer.MAX_VALUE) { throw new RecoverableOdbcFailure( "Length/Precision value is above maximum value of " + Integer.MAX_VALUE); } } /** * @param hType HyperSQL data type * @param oid Numeric Object ID for the driver-side type. * @param typeWidthObject Fixed width for the type * @param lpConstraintObject Either length or Precision setting for this * instance of the type. * IMPORTANT! for all types with positive * lpConstraint other than Timestamps and Times, * add an extra 4 to satisy crazy driver protocol. */ protected PgType(Type hType, int oid, Integer typeWidthObject, Integer lpConstraintObject) { this.hType = hType; this.oid = oid; this.typeWidth = (typeWidthObject == null) ? -1 : typeWidthObject.intValue(); this.lpConstraint = (lpConstraintObject == null) ? -1 : lpConstraintObject.intValue(); } public static PgType getPgType(Type hType, boolean directColumn) throws RecoverableOdbcFailure { switch (hType.typeCode) { case Types.TINYINT: return tinyIntSingleton; case Types.SQL_SMALLINT: return int2singleton; case Types.SQL_INTEGER: return int4singleton; case Types.SQL_BIGINT: return int8singleton; case Types.SQL_NUMERIC: case Types.SQL_DECIMAL: return new PgType(hType, TYPE_NUMERIC, null, (hType.precision << 16) + hType.scale + 4); case Types.SQL_FLOAT: // TODO: // Improve the driver to make use of the Float precision // return new PgType(hType, TYPE_FLOAT8, null, hType.precision); case Types.SQL_DOUBLE: case Types.SQL_REAL: return doubleSingleton; case Types.BOOLEAN: return boolSingleton; case Types.SQL_CHAR: // = CHARACTER if (directColumn) { return new PgType(hType, TYPE_BPCHAR, null, hType.precision + 4); } return unknownSingleton; // constant value case Types.SQL_VARCHAR: // = CHARACTER VARYING = LONGVARCHAR case Types.VARCHAR_IGNORECASE: // Don't know if possible here if (hType.precision < 0) { throw new RecoverableOdbcFailure ( "Length/Precision value is below minimum value of 0"); } if (hType.precision > Integer.MAX_VALUE) { throw new RecoverableOdbcFailure ( "Length/Precision value is above maximum value of " + Integer.MAX_VALUE); } return (hType.precision != 0 && directColumn) ? new PgType(hType, TYPE_VARCHAR, null, hType.precision + 4) : textSingleton; // Return TEXT type for both unlimited VARCHARs, and for // Non-direct-table-col results. case Types.SQL_CLOB: // = CHARACTER LARGE OBJECT throw new RecoverableOdbcFailure ( "Driver doesn't support type 'CLOB' yet"); case Types.SQL_BLOB: // = BINARY LARGE OBJECT return new PgType(hType, TYPE_BLOB, null, hType.precision); case Types.SQL_BINARY: case Types.SQL_VARBINARY: // = BINARY VARYING return new PgType(hType, TYPE_BYTEA, null, hType.precision); // Note that we are returning SQL_BINARY data as if they were // variable. I don't think the unnecessary variability will // have any side-effects. // No reason to differentiate here, since the client's // atttypm parameter is where we would communicate the length // in both cases. case Types.OTHER: throw new RecoverableOdbcFailure ( "Driver doesn't support type 'OTHER' yet"); case Types.SQL_BIT: return bitSingleton; case Types.SQL_BIT_VARYING: return bitVaryingSingleton; // I have no idea why length contstaint spec is not needed for // BIT_VARYING. case Types.SQL_DATE: return dateSingleton; // 4 bytes case Types.SQL_TIME : return new PgType(hType, TYPE_TIME, new Integer(8), hType.precision); case Types.SQL_TIME_WITH_TIME_ZONE : return new PgType(hType, TYPE_TIME_WITH_TMZONE, new Integer(12), hType.precision); case Types.SQL_TIMESTAMP : return new PgType(hType, TYPE_TIMESTAMP_NO_TMZONE, new Integer(8), hType.precision); case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : return new PgType(hType, TYPE_TIMESTAMP, new Integer(8), hType.precision); // Postgresql is returning type DATETIME for this case. // It should return TYPE_TIMESTAMP, no? /* ********************************************************* * For INTERVALs, we get the more specific type here, not just * SQL_INTERVAL. case Types.SQL_INTERVAL: * * The reason no precisions are passed to the ODBC client is that I * have so far been unsuccessful at figuring out exactly how the * driver wants the atttypmod formatted. See doc/odbc.txt for * notes about this. */ case Types.SQL_INTERVAL_YEAR: case Types.SQL_INTERVAL_YEAR_TO_MONTH: case Types.SQL_INTERVAL_MONTH: // Need to test these, since the driver Interval type is // intended for second-resolution only, not month resolution. throw new RecoverableOdbcFailure ( "Driver doesn't support month-resolution 'INTERVAL's yet"); case Types.SQL_INTERVAL_DAY: case Types.SQL_INTERVAL_DAY_TO_HOUR: case Types.SQL_INTERVAL_DAY_TO_MINUTE: case Types.SQL_INTERVAL_HOUR: case Types.SQL_INTERVAL_HOUR_TO_MINUTE: case Types.SQL_INTERVAL_MINUTE: // Our server uses the type to distinguish the resolution here. // The driver expects these types to be distinguished in the // value itself, like "99 days". // Therefore, these types are incompatible until driver is // enhanced. throw new RecoverableOdbcFailure ( "Driver doesn't support non-second-resolution 'INTERVAL's " + "yet"); case Types.SQL_INTERVAL_DAY_TO_SECOND: PgType.ignoredConstraintWarning(hType); return daySecIntervalSingleton; case Types.SQL_INTERVAL_HOUR_TO_SECOND: PgType.ignoredConstraintWarning(hType); return hourSecIntervalSingleton; case Types.SQL_INTERVAL_MINUTE_TO_SECOND: PgType.ignoredConstraintWarning(hType); return minSecIntervalSingleton; case Types.SQL_INTERVAL_SECOND: PgType.ignoredConstraintWarning(hType); return secIntervalSingleton; default: throw new RecoverableOdbcFailure ( "Unsupported type: " + hType.getNameString()); } } /** * This method copied from JDBCPreparedStatement.java. * * The internal parameter value setter always converts the parameter to * the Java type required for data transmission. *

              * This method will not be called for binary types. Binary values are * just loaded directly into the Object parameter array. *

              * * @throws SQLException if either argument is not acceptable. */ public Object getParameter(String inString, Session session) throws SQLException, RecoverableOdbcFailure { if (inString == null) { return null; } Object o = inString; switch (hType.typeCode) { case Types.SQL_BOOLEAN : if (inString.length() == 1) switch (inString.charAt(0)) { case 'T': case 't': case 'Y': case 'y': case '1': return Boolean.TRUE; default: return Boolean.FALSE; } return Boolean.valueOf(inString); case Types.SQL_BINARY : case Types.SQL_VARBINARY : case Types.SQL_BLOB : throw new RecoverableOdbcFailure( "This data type should be transmitted to server in binary " + "format: " + hType.getNameString()); case Types.OTHER : case Types.SQL_CLOB : throw new RecoverableOdbcFailure( "Type not supported yet: " + hType.getNameString()); /* case Types.OTHER : try { if (o instanceof Serializable) { o = new JavaObjectData((Serializable) o); break; } } catch (HsqlException e) { PgType.throwError(e); } PgType.throwError(Error.error(ErrorCode.X_42565)); break; case Types.SQL_BLOB : //setBlobParameter(i, o); //break; case Types.SQL_CLOB : //setClobParameter(i, o); //break; */ case Types.SQL_DATE : case Types.SQL_TIME_WITH_TIME_ZONE : case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : case Types.SQL_TIME : case Types.SQL_TIMESTAMP : { try { o = hType.convertToType(session, o, Type.SQL_VARCHAR); } catch (HsqlException e) { PgType.throwError(e); } break; } case Types.TINYINT : case Types.SQL_SMALLINT : case Types.SQL_INTEGER : case Types.SQL_BIGINT : case Types.SQL_REAL : case Types.SQL_FLOAT : case Types.SQL_DOUBLE : case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : try { o = hType.convertToType(session, o, Type.SQL_VARCHAR); } catch (HsqlException e) { PgType.throwError(e); } break; default : /* throw new RecoverableOdbcFailure( "Parameter value is of unexpected type: " + hType.getNameString()); */ try { o = hType.convertToDefaultType(session, o); // Supposed to handle String -> SQL_BIT. Not working. } catch (HsqlException e) { PgType.throwError(e); } break; } return o; } public String valueString(Object datum) { String dataString = hType.convertToString(datum); switch (hType.typeCode) { case Types.SQL_BOOLEAN : return String.valueOf(((Boolean) datum).booleanValue() ? 't' : 'f'); // Default would probably work fine, since the Driver looks at // only the first byte, but this why send an extra 3 or 4 bytes // with every data, plus there could be some dependency upon // single-character in the driver code somewhere. case Types.SQL_VARBINARY : case Types.SQL_BINARY : dataString = OdbcUtil.hexCharsToOctalOctets(dataString); break; } return dataString; } /* * The followign settings are a Java port of pgtypes.h */ public static final int TYPE_BOOL = 16; public static final int TYPE_BYTEA = 17; public static final int TYPE_CHAR = 18; public static final int TYPE_NAME = 19; public static final int TYPE_INT8 = 20; public static final int TYPE_INT2 = 21; public static final int TYPE_INT2VECTOR = 22; public static final int TYPE_INT4 = 23; public static final int TYPE_REGPROC = 24; public static final int TYPE_TEXT = 25; public static final int TYPE_OID = 26; public static final int TYPE_TID = 27; public static final int TYPE_XID = 28; public static final int TYPE_CID = 29; public static final int TYPE_OIDVECTOR = 30; public static final int TYPE_SET = 32; public static final int TYPE_XML = 142; public static final int TYPE_XMLARRAY = 143; public static final int TYPE_CHAR2 = 409; public static final int TYPE_CHAR4 = 410; public static final int TYPE_CHAR8 = 411; public static final int TYPE_POINT = 600; public static final int TYPE_LSEG = 601; public static final int TYPE_PATH = 602; public static final int TYPE_BOX = 603; public static final int TYPE_POLYGON = 604; public static final int TYPE_FILENAME = 605; public static final int TYPE_CIDR = 650; public static final int TYPE_FLOAT4 = 700; public static final int TYPE_FLOAT8 = 701; public static final int TYPE_ABSTIME = 702; public static final int TYPE_RELTIME = 703; public static final int TYPE_TINTERVAL = 704; public static final int TYPE_UNKNOWN = 705; public static final int TYPE_MONEY = 790; public static final int TYPE_OIDINT2 = 810; public static final int TYPE_MACADDR = 829; public static final int TYPE_INET = 869; public static final int TYPE_OIDINT4 = 910; public static final int TYPE_OIDNAME = 911; public static final int TYPE_TEXTARRAY = 1009; public static final int TYPE_BPCHARARRAY = 1014; public static final int TYPE_VARCHARARRAY = 1015; public static final int TYPE_BPCHAR = 1042; public static final int TYPE_VARCHAR = 1043; public static final int TYPE_DATE = 1082; public static final int TYPE_TIME = 1083; public static final int TYPE_TIMESTAMP_NO_TMZONE = 1114; /* since 7.2 */ public static final int TYPE_DATETIME = 1184; public static final int TYPE_TIME_WITH_TMZONE = 1266; /* since 7.1 */ public static final int TYPE_TIMESTAMP = 1296; /* deprecated since 7.0 */ public static final int TYPE_NUMERIC = 1700; public static final int TYPE_RECORD = 2249; public static final int TYPE_VOID = 2278; public static final int TYPE_UUID = 2950; // Numbering new HyperSQL-only client-side types beginning with 9999 and // getting lower, to reduce chance of conflict with future PostreSQL types. public static final int TYPE_BLOB = 9998; public static final int TYPE_TINYINT = 9999; // Apparenly new additions, from Postgresql server file pg_type.h: public static final int TYPE_BIT = 1560; // Also defined is _bit. No idea what that is about public static final int TYPE_VARBIT = 1562; // Also defined is _varbit. No idea what that is about /* Following stuff is to support code copied from * JDBCPreparedStatement.java. */ static final void throwError(HsqlException e) throws SQLException { //#ifdef JAVA6 throw Util.sqlException(e.getMessage(), e.getSQLState(), e.getErrorCode(), e); //#else /* throw new SQLException(e.getMessage(), e.getSQLState(), e.getErrorCode()); */ //#endif JAVA6 } static protected final PgType tinyIntSingleton = new PgType(Type.TINYINT, TYPE_TINYINT, 1); static protected final PgType int2singleton = new PgType(Type.SQL_SMALLINT, TYPE_INT2, 2); static protected final PgType int4singleton = new PgType(Type.SQL_INTEGER, TYPE_INT4, 4); static protected final PgType int8singleton = new PgType(Type.SQL_BIGINT, TYPE_INT8, 8); static protected final PgType doubleSingleton = new PgType(Type.SQL_DOUBLE, TYPE_FLOAT8, 8); static protected final PgType boolSingleton = new PgType(Type.SQL_BOOLEAN, TYPE_BOOL, 1); static protected final PgType textSingleton = new PgType(Type.SQL_VARCHAR, TYPE_TEXT); static protected final PgType dateSingleton = new PgType(Type.SQL_DATE, TYPE_DATE, 4); static protected final PgType unknownSingleton = new PgType(Type.SQL_CHAR_DEFAULT, TYPE_UNKNOWN, -2); static protected final PgType bitSingleton = new PgType(Type.SQL_BIT, TYPE_BIT); static protected final PgType bitVaryingSingleton = new PgType(Type.SQL_BIT_VARYING, TYPE_VARBIT); static protected final PgType daySecIntervalSingleton = new PgType(Type.SQL_INTERVAL_DAY_TO_SECOND, TYPE_TINTERVAL, 16); static protected final PgType hourSecIntervalSingleton = new PgType(Type.SQL_INTERVAL_HOUR_TO_SECOND, TYPE_TINTERVAL, 16); static protected final PgType minSecIntervalSingleton = new PgType(Type.SQL_INTERVAL_MINUTE_TO_SECOND, TYPE_TINTERVAL, 16); static protected final PgType secIntervalSingleton = new PgType(Type.SQL_INTERVAL_SECOND, TYPE_TINTERVAL, 16); static private void ignoredConstraintWarning(Type hsqldbType) { if (hsqldbType.precision == 0 && hsqldbType.scale == 0) { return; } // TODO: Use logging system! /* System.err.println( "WARNING: Not passing INTERVAL precision setting " + "or second precision setting to ODBC client"); */ } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/HsqlSocketRequestHandler.java0000644000175000017500000000364212007547404026046 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.net.Socket; /** * Interface HsqlSocketRequestHandler * * @author paul-h@users * @version 1.70 * @since 1.7.0 * @see Server */ // fredt@users - patch 461556 by paul-h@users public interface HsqlSocketRequestHandler { void handleConnection(Socket socket); void signalCloseAllServerConnections(); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/RecoverableOdbcFailure.java0000644000175000017500000000621712007547404025451 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import org.hsqldb.result.Result; class RecoverableOdbcFailure extends Exception { private String clientMessage = null; private String sqlStateCode = null; private Result errorResult = null; public String getSqlStateCode() { return sqlStateCode; } public Result getErrorResult() { return errorResult; } public RecoverableOdbcFailure(Result errorResult) { this.errorResult = errorResult; } /** * This constructor purposefully means that both server-side and * client-side message will be set to the specified message. */ public RecoverableOdbcFailure(String m) { super(m); clientMessage = m; } /** * This constructor purposefully means that both server-side and * client-side message will be set to the specified message. *

              * Note: The parameters DO NOT SPECIFY server-side and client-side * messages. Use the 3-parameter constructor for that. *

              * * @see #RecoverableOdbcFailure(String, String, String) */ public RecoverableOdbcFailure(String m, String sqlStateCode) { this(m); this.sqlStateCode = sqlStateCode; } /** * Set any parameter to null to skip the specified reporting. */ public RecoverableOdbcFailure( String ourMessage, String clientMessage, String sqlStateCode) { super(ourMessage); this.clientMessage = clientMessage; this.sqlStateCode = sqlStateCode; } public String getClientMessage() { return clientMessage; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/Servlet.java0000644000175000017500000003317712007547404022551 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.server; import java.io.DataInputStream; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.hsqldb.DatabaseManager; import org.hsqldb.DatabaseURL; import org.hsqldb.HsqlException; import org.hsqldb.Session; import org.hsqldb.lib.DataOutputStream; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.rowio.RowInputBinary; import org.hsqldb.rowio.RowOutputBinary; // fredt@users 20020130 - patch 475586 by wreissen@users // fredt@users 20020328 - patch 1.7.0 by fredt - error trapping // fredt@users 20030630 - patch 1.7.2 - new protocol, persistent sessions // fredt@users 20041112 - patch by Willian Crick - use web_inf directory /** * Servlet can act as an interface between the client and the database for the * the client / server mode of HSQL Database Engine. It uses the HTTP protocol * for communication. This class is not required if the included HSQLDB * Weberver is used on the server host. But if the host is running a J2EE * application server or a servlet container such as Tomcat, the Servlet class * can be hosted on this server / container to serve external requests from * external hosts.

              * The remote applet / application should * use the normal JDBC interfaces to connect to the URL of this servlet. An * example URL is: *

               * jdbc:hsqldb:http://myhost.com:8080/servlet/org.hsqldb.server.Servlet
               * 
              * The database path/name is taken from the servlet engine property: *
               * hsqldb.server.database
               * 
              *

              * If the database is deployed in the WEB-INF directory of the servlet container, * the property: *

               *  hsqldb.server.use_web-inf_path
               * 
              * should be set "true" in the web.xml file of the servlet container. * In this case, the database path should begin with a "/". * * JDBC connections via the HTTP protocol are persistent * in the JDBC sense. The JDBC Connection that is established can support * transactions spanning several Statement calls and real PreparedStatement * calls are supported. This class has been rewritten to support the new * features.

              * (fredt@users)

              * * Extensively rewritten for HSQLDB. * * @author Thomas Mueller (Hypersonic SQL Group) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since Hypersonic SQL */ public class Servlet extends javax.servlet.http.HttpServlet { private static final int BUFFER_SIZE = 256; private String dbType; private String dbPath; private String errorStr; private RowOutputBinary rowOut; private RowInputBinary rowIn; private int iQueries; public void init(ServletConfig config) { try { super.init(config); rowOut = new RowOutputBinary(BUFFER_SIZE, 1); rowIn = new RowInputBinary(rowOut); } catch (ServletException e) { log(e.toString()); } String dbStr = getInitParameter("hsqldb.server.database"); if (dbStr == null) { dbStr = "."; } // begin WEB-INF patch */ String useWebInfStr = getInitParameter("hsqldb.server.use_web-inf_path"); if (!dbStr.equals(".") && "true".equalsIgnoreCase(useWebInfStr)) { dbStr = getServletContext().getRealPath("/") + "WEB-INF/" + dbStr; } // end WEB-INF patch HsqlProperties dbURL = DatabaseURL.parseURL(dbStr, false, false); log("Database filename = " + dbStr); if (dbURL == null) { errorStr = "Bad Database name"; } else { dbPath = dbURL.getProperty("database"); dbType = dbURL.getProperty("connection_type"); try { DatabaseManager.getDatabase(dbType, dbPath, dbURL); } catch (HsqlException e) { errorStr = e.getMessage(); } } if (errorStr == null) { log("Initialization completed."); } else { log("Database could not be initialised."); log(errorStr); } } private static long lModified = 0; protected long getLastModified(HttpServletRequest req) { // this is made so that the cache of the http server is not used // maybe there is some other way return lModified++; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String query = request.getQueryString(); if ((query == null) || (query.length() == 0)) { response.setContentType("text/html"); // fredt@users 20020130 - patch 1.7.0 by fredt // to avoid caching on the browser response.setHeader("Pragma", "no-cache"); PrintWriter out = response.getWriter(); out.println( "HSQL Database Engine Servlet"); out.println("

              HSQL Database Engine Servlet

              "); out.println("The servlet is running.

              "); if (errorStr == null) { out.println("The database is also running.

              "); out.println("Database name: " + dbType + dbPath + "

              "); out.println("Queries processed: " + iQueries + "

              "); } else { out.println("

              The database is not running!

              "); out.println("The error message is:

              "); out.println(errorStr); } out.println(""); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { synchronized (this) { DataInputStream inStream = null; DataOutputStream dataOut = null; try { // fredt@users - the servlet container, Resin does not return all // the bytes with one call to input.read(b,0,len) when len > 8192 // bytes, the loop in the Result.read() method handles this inStream = new DataInputStream(request.getInputStream()); int databaseID = inStream.readInt(); long sessionID = inStream.readLong(); int mode = inStream.readByte(); Session session = DatabaseManager.getSession(databaseID, sessionID); Result resultIn = Result.newResult(session, mode, inStream, rowIn); resultIn.setDatabaseId(databaseID); resultIn.setSessionId(sessionID); Result resultOut; int type = resultIn.getType(); if (type == ResultConstants.CONNECT) { try { session = DatabaseManager.newSession( dbType, dbPath, resultIn.getMainString(), resultIn.getSubString(), new HsqlProperties(), resultIn.getZoneString(), resultIn.getUpdateCount()); resultIn.readAdditionalResults(null, inStream, rowIn); resultOut = Result.newConnectionAcknowledgeResponse( session.getDatabase(), session.getId(), session.getDatabase().getDatabaseID()); } catch (HsqlException e) { resultOut = Result.newErrorResult(e); } } else if (type == ResultConstants.DISCONNECT || type == ResultConstants.RESETSESSION) { // Upon DISCONNECT 6 bytes are read by the ClientConnectionHTTP": mode (1 byte), a length (int), and an 'additional results (1 byte) response.setHeader("Cache-Control", "no-cache"); // DB-traffic should not be cached by proxy's response.setContentType("application/octet-stream"); response.setContentLength(6); // Only acquire output-stream after headers are set dataOut = new DataOutputStream(response.getOutputStream()); dataOut.writeByte(ResultConstants.DISCONNECT); // Mode dataOut.writeInt(4); //Length Int of first result is always read! Minvalue is 4: It is the number of bytes of the current result (it includes the length of this Int itself) dataOut.writeByte(ResultConstants.NONE); // No Additional results dataOut.close(); return; } else { int dbId = resultIn.getDatabaseId(); long sessionId = resultIn.getSessionId(); session = DatabaseManager.getSession(dbId, sessionId); resultIn.readLobResults(session, inStream, rowIn); resultOut = session.execute(resultIn); } HsqlByteArrayOutputStream memStream = new HsqlByteArrayOutputStream(); DataOutputStream tempOutput = new DataOutputStream(memStream); resultOut.write(session, tempOutput, rowOut); response.setHeader("Cache-Control", "no-cache"); // DB-traffic should not be cached by proxy's response.setContentType("application/octet-stream"); response.setContentLength(memStream.size()); // Only acquire output-stream after headers are set dataOut = new DataOutputStream(response.getOutputStream()); memStream.writeTo(dataOut); iQueries++; } catch (HsqlException e) {} finally { if (dataOut != null) { dataOut.close(); } if (inStream != null) { inStream.close(); } } } // Trace.printSystemOut("Queries processed: "+iQueries+" \n"); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/Server.java0000644000175000017500000023534112007547404022370 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.util.Enumeration; import java.util.StringTokenizer; import org.hsqldb.DatabaseManager; import org.hsqldb.DatabaseURL; import org.hsqldb.HsqlDateTime; import org.hsqldb.HsqlException; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.IntKeyHashMap; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.StopWatch; import org.hsqldb.lib.StringUtil; import org.hsqldb.lib.java.JavaSystem; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.resources.BundleHandler; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; // fredt@users 20020215 - patch 1.7.0 // methods reorganised to use new HsqlProperties class // fredt@users 20020424 - patch 1.7.0 - shutdown without exit // see the comments in ServerConnection.java // unsaved@users 20021113 - patch 1.7.2 - SSL support // boucherb@users 20030510-14 - 1.7.2 - SSL support moved to factory interface // boucherb@users 20030510-14 - 1.7.2 - service control, JavaBean API // fredt@users 20030916 - 1.7.2 - review, simplification and multiple DB's // fredt@users 20040320 - 1.7.2 - review and correction // fredt@users 20050225 - 1.8.0 - minor corrections // fredt@users 20051231 - 1.8.1 - support for remote opening of databases // fredt@users 20080531 - 1.8.1 - removed synchronized from print methods // unnecessary and could cause deadlock /** * The HSQLDB HSQL protocol network database server.

              * * A Server object acts as a network database server and is one way of using * the client-server mode of HSQLDB Database Engine. Instances of this * class handle native HSQL protocol connections exclusively, allowing database * queries to be performed efficienly across the network. Server's direct * descendent, WebServer, handles HTTP protocol connections exclusively, * allowing HSQL protocol to be tunneled over HTTP to avoid sandbox and * firewall issues, albeit less efficiently.

              * * There are a number of ways to configure and start a Server instance.

              * * When started from the command line or programatically via the main(String[]) * method, configuration occurs in three phases, with later phases overriding * properties set by previous phases: * *

                *
              1. Upon construction, a Server object is assigned a set of default * properties.

                * *

              2. If it exists, properties are loaded from a file named * 'server.properties' in the present working directory.

                * *

              3. The command line arguments (alternatively, the String[] passed to * main()) are parsed and used to further configure the Server's * properties.

                * *

              * * From the command line, the options are as follows:

              *

               * +-----------------+-------------+----------+------------------------------+
               * |    OPTION       |    TYPE     | DEFAULT  |         DESCRIPTION          |
               * +-----------------+-------------+----------+------------------------------|
               * | --help          |             |          | prints this message          |
               * | --address       | name|number | any      | server inet address          |
               * | --port          | number      | 9001/544 | port at which server listens |
               * | --database.i    | [type]spec  | 0=test   | path of database i           |
               * | --dbname.i      | alias       |          | url alias for database i     |
               * | --silent        | true|false  | true     | false => display all queries |
               * | --trace         | true|false  | false    | display JDBC trace messages  |
               * | --tls           | true|false  | false    | TLS/SSL (secure) sockets     |
               * | --no_system_exit| true|false  | false    | do not issue System.exit()   |
               * | --remote_open   | true|false  | false    | can open databases remotely  |
               * | --props         | filepath    |          | file path of properties file |
               * +-----------------+-------------+----------+------------------------------+
               * 
              * * The database.i and dbname.i options need further * explanation: * *
                *
              • Multiple databases can be served by each instance of the Server. * The value of i is currently limited to the range 0..9, * allowing up to 10 different databases. Any number is this range * can be used.

                * *

              • The value assigned to database.i is interpreted using the * format '[type]spec', where the optional type component * is one of 'file:', 'res:' or 'mem:' and the * spec component is interpreted in the context of the * type component.

                * * If omitted, the type component is taken to be * 'file:'.

                * * A full description of how * '[type]spec' values are interpreted appears in the overview for * {@link org.hsqldb.jdbc.JDBCConnection JDBCConnection}.

                * *

              • The value assigned to dbname.i is taken to be the key used to * look up the desired database instance and thus corresponds to the * <alias> component of the HSQLDB HSQL protocol database * connection url: * 'jdbc:hsqldb:hsql[s]://host[port][/<alias>]'.

                * *

              • The value of database.0 is special. If dbname.0 * is not specified, then this defaults to an empty string and * a connection is made to database.0 path when * the <alias> component of an HSQLDB HSQL protocol database * connection url is omitted. If a database key/value pair is * found in the properties when the main method is called, this * pair is supersedes the database.0 setting

                * * This behaviour allows the previous * database connection url format to work with essentially unchanged * semantics.

                * *

              • When the remote_open property is true, a connection attempt * to an unopened database results in the database being opened. The URL * for connection should include the property filepath to specify the path. * 'jdbc:hsqldb:hsql[s]://host[port]/<alias>;filepath=hsqldb:file:<database path>'. * the given alias and filepath value will be associated together. The * database user and password to start this connection must be valid. * If this form of connection is used again, after the database has been * opened, the filepath property is ignored.

                * *

              • Once an alias such as "mydb" has been associated with a path, it cannot * be reassigned to a different path.

                * *

              • If a database is closed with the SHUTDOWN command, its * alias is removed. It is then possible to connect to this database again * with a different (or the same) alias.

                * *

              • If the same database is connected to via two different * aliases, and then one of the is closed with the SHUTDOWN command, the * other is also closed.

                *

              * * From the 'server.properties' file, options can be set similarly, using a * slightly different format.

              * * Here is an example 'server.properties' file: * *

               * server.port=9001
               * server.database.0=test
               * server.dbname.0=...
               * ...
               * server.database.n=...
               * server.dbname.n=...
               * server.silent=true
               * 
              * * Starting with 1.7.2, Server has been refactored to become a simple JavaBean * with non-blocking start() and stop() service methods. It is possible to * configure a Server instance through the JavaBean API as well, but this * part of the public interface is still under review and will not be finalized * or documented fully until the final 1.7.2 release.

              * * Note:

              * * The 'no_system_exit' property is of particular interest.

              * * If a Server instance is to run embedded in, say, an application server, * such as when the JDBCDataSource or HsqlServerFactory classes are used, it * is typically necessary to avoid calling System.exit() when the Server * instance shuts down.

              * * By default, 'no_system_exit' is set:

              * *

                *
              1. true when a Server is started directly from the start() * method.

                * *

              2. false when a Server is started from the main(String[]) * method. *

              * * These values are natural to their context because the first case allows * the JVM to exit by default on Server shutdown when a Server instance is * started from a command line environment, whereas the second case prevents * a typically unwanted JVM exit on Server shutdown when a Server intance * is started as part of a larger framework.

              * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 * * @jmx.mbean * description="HSQLDB Server" * extends="org.hsqldb.mx.mbean.RegistrationSupportBaseMBean" * * @jboss.xmbean */ public class Server implements HsqlSocketRequestHandler { // protected static final int serverBundleHandle = BundleHandler.getBundleHandle("org_hsqldb_Server_messages", null); // ServerProperties serverProperties; // HashSet serverConnSet; // As of HSQLDB 1.9.0, the following arrays are used starting from 0. // The indexes do not correspond to the user-specified indexes. protected String[] dbAlias; protected String[] dbType; protected String[] dbPath; protected HsqlProperties[] dbProps; protected int[] dbID; protected long[] dbActionSequence; // set of aliases HashSet aliasSet = new HashSet(); // Currently unused protected int maxConnections; volatile long actionSequence; // protected String serverId; protected int serverProtocol; protected ThreadGroup serverConnectionThreadGroup; protected HsqlSocketFactory socketFactory; protected ServerSocket socket; // private Thread serverThread; private Throwable serverError; private volatile int serverState; private volatile boolean isSilent; protected volatile boolean isRemoteOpen; protected boolean isDaemon; private PrintWriter logWriter; private PrintWriter errWriter; private ServerAcl acl = null; // null means no access tests private volatile boolean isShuttingDown; // /** * A specialized Thread inner class in which the run() method of this * server executes. */ private class ServerThread extends Thread { /** * Constructs a new thread in which to execute the run method * of this server. * * @param name The thread name */ ServerThread(String name) { super(name); setName(name + '@' + Integer.toString(Server.this.hashCode(), 16)); } /** * Executes the run() method of this server */ public void run() { Server.this.run(); printWithThread("ServerThread.run() exited"); } } /** * Returns thread object for "HSQLDB Server" thread */ public Thread getServerThread() { return serverThread; } /** * Creates a new Server instance handling HSQL protocol connections. */ public Server() { this(ServerConstants.SC_PROTOCOL_HSQL); } /** * Creates a new Server instance handling the specified connection * protocol.

              * * For example, the no-args WebServer constructor invokes this constructor * with ServerConstants.SC_PROTOCOL_HTTP, while the Server() no args * contructor invokes this constructor with * ServerConstants.SC_PROTOCOL_HSQL.

              * * @param protocol the ServerConstants code indicating which * connection protocol to handle */ protected Server(int protocol) { init(protocol); } /** * Checks if this Server object is or is not running and throws if the * current state does not match the specified value. * * @param running if true, ensure the server is running, else ensure the * server is not running * @throws HsqlException if the supplied value does not match the * current running status */ public void checkRunning(boolean running) { int state; boolean error; printWithThread("checkRunning(" + running + ") entered"); state = getState(); error = (running && state != ServerConstants.SERVER_STATE_ONLINE) || (!running && state != ServerConstants.SERVER_STATE_SHUTDOWN); if (error) { String msg = "server is " + (running ? "not " : "") + "running"; throw Error.error(ErrorCode.GENERAL_ERROR, msg); } printWithThread("checkRunning(" + running + ") exited"); } /** * Closes all connections to this Server. * * @jmx.managed-operation * impact="ACTION" * description="Closes all open connections" */ public synchronized void signalCloseAllServerConnections() { Iterator it; ServerConnection[] array; printWithThread("signalCloseAllServerConnections() entered"); synchronized (serverConnSet) { // snapshot array = new ServerConnection[serverConnSet.size()]; serverConnSet.toArray(array); } for (int i = 0; i < array.length; i++) { ServerConnection sc = array[i]; printWithThread("Closing " + sc); // also removes all but one connection from serverConnSet sc.signalClose(); } printWithThread("signalCloseAllServerConnections() exited"); } protected void finalize() throws Throwable { if (serverThread != null) { releaseServerSocket(); } } /** * Retrieves, in string form, this server's host address. * * @return this server's host address * * @jmx.managed-attribute * access="read-write" * description="Host InetAddress" */ public String getAddress() { return socket == null ? serverProperties.getProperty(ServerProperties.sc_key_address) : socket.getInetAddress().getHostAddress(); } /** * Retrieves the url alias (network name) of the i'th database * that this Server hosts. * * @param index the index of the url alias upon which to report * @param asconfigured if true, report the configured value, else * the live value * @return the url alias component of the i'th database * that this Server hosts, or null if no such name exists. * * @jmx.managed-operation * impact="INFO" * description="url alias component of the i'th hosted Database" * * @jmx.managed-operation-parameter * name="index" * type="int" * position="0" * description="This Server's index for the hosted Database" * * @jmx.managed-operation-parameter * name="asconfigured" * type="boolean" * position="1" * description="if true, the configured value, else the live value" */ public String getDatabaseName(int index, boolean asconfigured) { if (asconfigured) { return serverProperties.getProperty(ServerProperties.sc_key_dbname + "." + index); } else if (getState() == ServerConstants.SERVER_STATE_ONLINE) { return (dbAlias == null || index < 0 || index >= dbAlias.length) ? null : dbAlias[index]; } else { return null; } } /** * Retrieves the HSQLDB path descriptor (uri) of the i'th * Database that this Server hosts. * * @param index the index of the uri upon which to report * @param asconfigured if true, report the configured value, else * the live value * @return the HSQLDB database path descriptor of the i'th database * that this Server hosts, or null if no such path descriptor * exists * * @jmx.managed-operation * impact="INFO" * description="For i'th hosted database" * * @jmx.managed-operation-parameter * name="index" * type="int" * position="0" * description="This Server's index for the hosted Database" * * @jmx.managed-operation-parameter * name="asconfigured" * type="boolean" * position="1" * description="if true, the configured value, else the live value" */ public String getDatabasePath(int index, boolean asconfigured) { if (asconfigured) { return serverProperties.getProperty( ServerProperties.sc_key_database + "." + index); } else if (getState() == ServerConstants.SERVER_STATE_ONLINE) { return (dbPath == null || index < 0 || index >= dbPath.length) ? null : dbPath[index]; } else { return null; } } public String getDatabaseType(int index) { return (dbType == null || index < 0 || index >= dbType.length) ? null : dbType[index]; } /** * Retrieves the name of the web page served when no page is specified. * This attribute is relevant only when server protocol is HTTP(S). * * @return the name of the web page served when no page is specified * * @jmx.managed-attribute * access="read-write" * description="Used when server protocol is HTTP(S)" */ public String getDefaultWebPage() { return "[IGNORED]"; } /** * Retrieves a String object describing the command line and * properties options for this Server. * * @return the command line and properties options help for this Server */ public String getHelpString() { return BundleHandler.getString(serverBundleHandle, "server.help"); } /** * Retrieves the PrintWriter to which server errors are printed. * * @return the PrintWriter to which server errors are printed. */ public PrintWriter getErrWriter() { return errWriter; } /** * Retrieves the PrintWriter to which server messages are printed. * * @return the PrintWriter to which server messages are printed. */ public PrintWriter getLogWriter() { return logWriter; } /** * Retrieves this server's host port. * * @return this server's host port * * @jmx.managed-attribute * access="read-write" * description="At which ServerSocket listens for connections" */ public int getPort() { return serverProperties.getIntegerProperty( ServerProperties.sc_key_port, ServerConfiguration.getDefaultPort(serverProtocol, isTls())); } /** * Retrieves this server's product name.

              * * Typically, this will be something like: "HSQLDB xxx server". * * @return the product name of this server * * @jmx.managed-attribute * access="read-only" * description="Of Server" */ public String getProductName() { return "HSQLDB server"; } /** * Retrieves the server's product version, as a String.

              * * Typically, this will be something like: "1.x.x" or "2.x.x" and so on. * * @return the product version of the server * * @jmx.managed-attribute * access="read-only" * description="Of Server" */ public String getProductVersion() { return HsqlDatabaseProperties.THIS_VERSION; } /** * Retrieves a string respresentaion of the network protocol * this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'. * * @return string respresentation of this server's protocol * * @jmx.managed-attribute * access="read-only" * description="Used to handle connections" */ public String getProtocol() { return isTls() ? "HSQLS" : "HSQL"; } /** * Retrieves a Throwable indicating the last server error, if any.

              * * @return a Throwable indicating the last server error * * @jmx.managed-attribute * access="read-only" * description="Indicating last exception state" */ public Throwable getServerError() { return serverError; } /** * Retrieves a String identifying this Server object. * * @return a String identifying this Server object * * @jmx.managed-attribute * access="read-only" * description="Identifying Server" */ public String getServerId() { return serverId; } /** * Retrieves current state of this server in numerically coded form.

              * * Typically, this will be one of:

              * *

                *
              1. ServerProperties.SERVER_STATE_ONLINE (1) *
              2. ServerProperties.SERVER_STATE_OPENING (4) *
              3. ServerProperties.SERVER_STATE_CLOSING (8) *
              4. ServerProperties.SERVER_STATE_SHUTDOWN (16) *
              * * @return this server's state code. * * @jmx.managed-attribute * access="read-only" * description="1:ONLINE 4:OPENING 8:CLOSING, 16:SHUTDOWN" */ public int getState() { return serverState; } /** * Retrieves a character sequence describing this server's current state, * including the message of the last exception, if there is one and it * is still in context. * * @return this server's state represented as a character sequence. * * @jmx.managed-attribute * access="read-only" * description="State as string" */ public String getStateDescriptor() { String state; Throwable t = getServerError(); switch (serverState) { case ServerConstants.SERVER_STATE_SHUTDOWN : state = "SHUTDOWN"; break; case ServerConstants.SERVER_STATE_OPENING : state = "OPENING"; break; case ServerConstants.SERVER_STATE_CLOSING : state = "CLOSING"; break; case ServerConstants.SERVER_STATE_ONLINE : state = "ONLINE"; break; default : state = "UNKNOWN"; break; } return state; } /** * Retrieves the root context (directory) from which web content * is served. This property is relevant only when the server * protocol is HTTP(S). Although unlikely, it may be that in the future * other contexts, such as jar urls may be supported, so that pages can * be served from the contents of a jar or from the JVM class path. * * @return the root context (directory) from which web content is served * * @jmx.managed-attribute * access="read-write" * description="Context (directory)" */ public String getWebRoot() { return "[IGNORED]"; } /** * Assigns the specified socket to a new conection handler and * starts the handler in a new Thread. * * @param s the socket to connect */ public void handleConnection(Socket s) { Thread t; Runnable r; String ctn; printWithThread("handleConnection(" + s + ") entered"); if (!allowConnection(s)) { try { s.close(); } catch (Exception e) {} printWithThread("allowConnection(): connection refused"); printWithThread("handleConnection() exited"); return; } // Maybe set up socket options, SSL // Session tracing/callbacks, etc. if (socketFactory != null) { socketFactory.configureSocket(s); } if (serverProtocol == ServerConstants.SC_PROTOCOL_HSQL) { r = new ServerConnection(s, this); ctn = ((ServerConnection) r).getConnectionThreadName(); } else { r = new WebServerConnection(s, (WebServer) this); ctn = ((WebServerConnection) r).getConnectionThreadName(); } t = new Thread(serverConnectionThreadGroup, r, ctn); t.start(); printWithThread("handleConnection() exited"); } /** * Retrieves whether this server calls System.exit() when shutdown. * * @return true if this server does not call System.exit() * * @jmx.managed-attribute * access="read-write" * description="When Shutdown" */ public boolean isNoSystemExit() { return serverProperties.isPropertyTrue( ServerProperties.sc_key_no_system_exit); } /** * Retrieves whether this server restarts on shutdown. * * @return true this server restarts on shutdown * * @jmx.managed-attribute * access="read-write" * description="Automatically?" */ public boolean isRestartOnShutdown() { return serverProperties.isPropertyTrue( ServerProperties.sc_key_autorestart_server); } /** * Retrieves whether silent mode operation was requested in * the server properties. * * @return if true, silent mode was requested, else trace messages * are to be printed * * @jmx.managed-attribute * access="read-write" * description="No trace messages?" */ public boolean isSilent() { return isSilent; } /** * Retrieves whether the use of secure sockets was requested in the * server properties. * * @return if true, secure sockets are requested, else not * * @jmx.managed-attribute * access="read-write" * description="Use TLS/SSL sockets?" */ public boolean isTls() { return serverProperties.isPropertyTrue(ServerProperties.sc_key_tls); } /** * Retrieves whether JDBC trace messages are to go to System.out or the * DriverManger PrintStream/PrintWriter, if any. * * @return true if tracing is on (JDBC trace messages to system out) * * @jmx.managed-attribute * access="read-write" * description="JDBC trace messages to System.out?" */ public boolean isTrace() { return serverProperties.isPropertyTrue(ServerProperties.sc_key_trace); } /** * Attempts to put properties from the file * with the specified path. The file * extension '.properties' is implicit and should not * be included in the path specification. * * @param path the path of the desired properties file, without the * '.properties' file extension * @throws HsqlException if this server is running * @return true if the indicated file was read sucessfully, else false * * @jmx.managed-operation * impact="ACTION" * description="Reads in properties" * * @jmx.managed-operation-parameter * name="path" * type="java.lang.String" * position="0" * description="(optional) returns false if path is empty" */ public boolean putPropertiesFromFile(String path) { return putPropertiesFromFile(path, ".properties"); } /** * Attempts to put properties from the file with given extension. * * @param path the path of the desired properties file. * @param extension extension to add to parth * @throws HsqlException if this server is running * @return true if the indicated file was read sucessfully, else false * */ public boolean putPropertiesFromFile(String path, String extension) { if (getState() != ServerConstants.SERVER_STATE_SHUTDOWN) { throw Error.error(ErrorCode.GENERAL_ERROR, "server properties"); } path = FileUtil.getFileUtil().canonicalOrAbsolutePath(path); ServerProperties p = ServerConfiguration.getPropertiesFromFile( ServerConstants.SC_PROTOCOL_HSQL, path, extension); if (p == null || p.isEmpty()) { return false; } printWithThread("putPropertiesFromFile(): [" + path + ".properties]"); try { setProperties(p); } catch (Exception e) { throw Error.error(e, ErrorCode.GENERAL_ERROR, ErrorCode.M_Message_Pair, new String[]{ "Failed to set properties" }); } return true; } /** * Puts properties from the supplied string argument. The relevant * key value pairs are the same as those for the (web)server.properties * file format, except that the 'server.' prefix should not be specified. * * @param s semicolon-delimited key=value pair string, * e.g. silent=false;port=8080;... * @throws HsqlException if this server is running * * @jmx.managed-operation * impact="ACTION" * description="'server.' key prefix automatically supplied" * * @jmx.managed-operation-parameter * name="s" * type="java.lang.String" * position="0" * description="semicolon-delimited key=value pairs" */ public void putPropertiesFromString(String s) { if (getState() != ServerConstants.SERVER_STATE_SHUTDOWN) { throw Error.error(ErrorCode.GENERAL_ERROR); } if (StringUtil.isEmpty(s)) { return; } printWithThread("putPropertiesFromString(): [" + s + "]"); HsqlProperties p = HsqlProperties.delimitedArgPairsToProps(s, "=", ";", ServerProperties.sc_key_prefix); try { setProperties(p); } catch (Exception e) { throw Error.error(e, ErrorCode.GENERAL_ERROR, ErrorCode.M_Message_Pair, new String[]{ "Failed to set properties" }); } } /** * Sets the InetAddress with which this server's ServerSocket will be * constructed. A null or empty string or the special value "0.0.0.0" * can be used to bypass explicit selection, causing the ServerSocket * to be constructed without specifying an InetAddress. * * @param address A string representing the desired InetAddress as would * be retrieved by InetAddres.getByName(), or a null or empty string * or "0.0.0.0" to signify that the server socket should be constructed * using the signature that does not specify the InetAddress. * @throws HsqlException if this server is running * * @jmx.managed-attribute */ public void setAddress(String address) { checkRunning(false); if (org.hsqldb.lib.StringUtil.isEmpty(address)) { address = ServerConstants.SC_DEFAULT_ADDRESS; } printWithThread("setAddress(" + address + ")"); serverProperties.setProperty(ServerProperties.sc_key_address, address); } /** * Sets the external name (url alias) of the i'th hosted database. * * @param name external name (url alias) of the i'th HSQLDB database * instance this server is to host. * @throws HsqlException if this server is running * * @jmx.managed-operation * impact="ACTION" * description="Sets the url alias by which is known the i'th hosted Database" * * @jmx.managed-operation-parameter * name="index" * type="int" * position="0" * description="This Server's index for the hosted Database" * * @jmx.managed-operation-parameter * name="name" * type="java.lang.String" * position="1" * description="url alias component for the hosted Database" */ public void setDatabaseName(int index, String name) { checkRunning(false); printWithThread("setDatabaseName(" + index + "," + name + ")"); serverProperties.setProperty(ServerProperties.sc_key_dbname + "." + index, name); } /** * Sets the path of the hosted database. The path always starts with the * catalog type. Examples of the path include: "file:mydir/mydb", * "mem:mymemdb", "res:org/mydomain/mydbs/settingsdb". * * @param path The path of the i'th HSQLDB database instance this server * is to host. * * @jmx.managed-operation * impact="ACTION" * description="Sets the database uri path for the i'th hosted Database" * * @jmx.managed-operation-parameter * name="index" * type="int" * position="0" * description="This Server's index for the hosted Database" * * @jmx.managed-operation-parameter * name="path" * type="java.lang.String" * position="1" * description="database uri path of the hosted Database" */ public void setDatabasePath(int index, String path) { checkRunning(false); printWithThread("setDatabasePath(" + index + "," + path + ")"); serverProperties.setProperty(ServerProperties.sc_key_database + "." + index, path); } /** * Sets the name of the web page served when no page is specified. * * @param file the name of the web page served when no page is specified * * @jmx.managed-attribute */ public void setDefaultWebPage(String file) { checkRunning(false); printWithThread("setDefaultWebPage(" + file + ")"); if (serverProtocol != ServerConstants.SC_PROTOCOL_HTTP) { return; } serverProperties.setProperty(ServerProperties.sc_key_web_default_page, file); } /** * Sets the server listen port. * * @param port the port at which this server listens * * @jmx.managed-attribute */ public void setPort(int port) { checkRunning(false); printWithThread("setPort(" + port + ")"); serverProperties.setProperty(ServerProperties.sc_key_port, port); } /** * Sets the PrintWriter to which server errors are logged.

              * * Setting this attribute to null disables server error logging * * @param pw the PrintWriter to which server messages are logged */ public void setErrWriter(PrintWriter pw) { errWriter = pw; } /** * Sets the PrintWriter to which server messages are logged.

              * * Setting this attribute to null disables server message logging * * @param pw the PrintWriter to which server messages are logged */ public void setLogWriter(PrintWriter pw) { logWriter = pw; } /** * Sets whether this server calls System.exit() when shutdown. * * @param noExit if true, System.exit() will not be called. * * @jmx.managed-attribute */ public void setNoSystemExit(boolean noExit) { printWithThread("setNoSystemExit(" + noExit + ")"); serverProperties.setProperty(ServerProperties.sc_key_no_system_exit, noExit); } /** * Sets whether this server restarts on shutdown. * * @param restart if true, this server restarts on shutdown * * @jmx.managed-attribute */ public void setRestartOnShutdown(boolean restart) { printWithThread("setRestartOnShutdown(" + restart + ")"); serverProperties.setProperty( ServerProperties.sc_key_autorestart_server, restart); } /** * Sets silent mode operation * * @param silent if true, then silent mode, else trace messages * are to be printed * * @jmx.managed-attribute */ public void setSilent(boolean silent) { printWithThread("setSilent(" + silent + ")"); serverProperties.setProperty(ServerProperties.sc_key_silent, silent); isSilent = silent; } /** * Sets whether to use secure sockets * * @param tls true for secure sockets, else false * @throws HsqlException if this server is running * * @jmx.managed-attribute */ public void setTls(boolean tls) { checkRunning(false); printWithThread("setTls(" + tls + ")"); serverProperties.setProperty(ServerProperties.sc_key_tls, tls); } /** * Sets whether trace messages go to System.out or the * DriverManger PrintStream/PrintWriter, if any. * * @param trace if true, route JDBC trace messages to System.out * * @jmx.managed-attribute */ public void setTrace(boolean trace) { printWithThread("setTrace(" + trace + ")"); serverProperties.setProperty(ServerProperties.sc_key_trace, trace); JavaSystem.setLogToSystem(trace); } /** * Sets whether server thread is a daemon. Used before starting. * The default is false. * * @param daemon if true, start the thread as a daemon thread * * @jmx.managed-attribute */ public void setDaemon(boolean daemon) { checkRunning(false); printWithThread("setDaemon(" + daemon + ")"); serverProperties.setProperty(ServerProperties.sc_key_daemon, daemon); } /** * Sets the path of the root directory from which web content is served. * * @param root the root (context) directory from which web content * is served * * @jmx.managed-attribute */ public void setWebRoot(String root) { checkRunning(false); root = (new File(root)).getAbsolutePath(); printWithThread("setWebRoot(" + root + ")"); if (serverProtocol != ServerConstants.SC_PROTOCOL_HTTP) { return; } serverProperties.setProperty(ServerProperties.sc_key_web_root, root); } /** * Sets server properties using the specified properties object * * @param props The object containing properties to set * @throws ServerAcl.AclFormatException * ACL list was requested but problem loading ACL. * @throws IOException * ACL list was requested but I/O problem loading ACL. */ public void setProperties(HsqlProperties props) throws IOException, ServerAcl.AclFormatException { checkRunning(false); if (props != null) { props.validate(); String[] errors = props.getErrorKeys(); if (errors.length > 0) { throw Error.error(ErrorCode.SERVER_NO_DATABASE, errors[0]); } serverProperties.addProperties(props); } maxConnections = serverProperties.getIntegerProperty( ServerProperties.sc_key_max_connections, 16); JavaSystem.setLogToSystem(isTrace()); isSilent = serverProperties.isPropertyTrue(ServerProperties.sc_key_silent); isRemoteOpen = serverProperties.isPropertyTrue( ServerProperties.sc_key_remote_open_db); isDaemon = serverProperties.isPropertyTrue(ServerProperties.sc_key_daemon); String aclFilepath = serverProperties.getProperty(ServerProperties.sc_key_acl); if (aclFilepath != null) { acl = new ServerAcl(new File(aclFilepath));; if (logWriter != null && !isSilent) { acl.setPrintWriter(logWriter); } } } /** * Starts this server synchronously.

              * * This method waits for current state to change from * SERVER_STATE_OPENNING. In order to discover the success or failure * of this operation, server state must be polled or a subclass of Server * must be used that overrides the setState method to provide state * change notification. * * @return the server state noted at entry to this method * * @jmx.managed-operation * impact="ACTION_INFO" * description="Invokes asynchronous startup sequence; returns previous state" */ public int start() { printWithThread("start() entered"); int previousState = getState(); if (serverThread != null) { printWithThread("start(): serverThread != null; no action taken"); return previousState; } setState(ServerConstants.SERVER_STATE_OPENING); serverThread = new ServerThread("HSQLDB Server "); if (isDaemon) { serverThread.setDaemon(true); } serverThread.start(); // call synchronized getState() to become owner of the Server Object's monitor while (getState() == ServerConstants.SERVER_STATE_OPENING) { try { Thread.sleep(100); } catch (InterruptedException e) {} } printWithThread("start() exiting"); return previousState; } /** * Stops this server asynchronously.

              * * This method returns immediately, regardless of current state. In order * to discover the success or failure of this operation, server state must * be polled or a subclass of Server must be used that overrides the * setState method to provide state change notification. * * @return the server state noted at entry to this method * * @jmx.managed-operation * impact="ACTION_INFO" * description="Invokes asynchronous shutdown sequence; returns previous state" */ public int stop() { printWithThread("stop() entered"); int previousState = getState(); if (serverThread == null) { printWithThread("stop() serverThread is null; no action taken"); return previousState; } releaseServerSocket(); printWithThread("stop() exiting"); return previousState; } /** * Retrieves whether the specified socket should be allowed * to make a connection. * * @param socket the socket to test. */ protected boolean allowConnection(Socket socket) { if (isShuttingDown) { return false; } return (acl == null) ? true : acl.permitAccess( socket.getInetAddress().getAddress()); } /** * Initializes this server, setting the accepted connection protocol. * * @param protocol typically either SC_PROTOCOL_HTTP or SC_PROTOCOL_HSQL */ protected void init(int protocol) { // PRE: This method is only called from the constructor serverState = ServerConstants.SERVER_STATE_SHUTDOWN; serverConnSet = new HashSet(); serverId = toString(); serverId = serverId.substring(serverId.lastIndexOf('.') + 1); serverProtocol = protocol; serverProperties = ServerConfiguration.newDefaultProperties(protocol); logWriter = new PrintWriter(System.out); errWriter = new PrintWriter(System.err); JavaSystem.setLogToSystem(isTrace()); } /** * Sets the server state value. * * @param state the new value */ protected synchronized void setState(int state) { serverState = state; } /** * This is called from org.hsqldb.DatabaseManager when a database is * shutdown. This shuts the server down if it is the last database * * @param action a code indicating what has happend */ public final void notify(int action, int id) { printWithThread("notifiy(" + action + "," + id + ") entered"); if (action != ServerConstants.SC_DATABASE_SHUTDOWN) { return; } releaseDatabase(id); boolean shutdown = true; for (int i = 0; i < dbID.length; i++) { if (dbAlias[i] != null) { shutdown = false; } } if (!isRemoteOpen && shutdown) { stop(); } } /** * This releases the resources used for a database. * Is called with id 0 multiple times for non-existent databases */ final synchronized void releaseDatabase(int id) { Iterator it; boolean found = false; ServerConnection[] array; printWithThread("releaseDatabase(" + id + ") entered"); // check all slots as a database may be opened by multiple aliases for (int i = 0; i < dbID.length; i++) { if (dbID[i] == id && dbAlias[i] != null) { dbID[i] = 0; dbActionSequence[i] = 0; dbAlias[i] = null; dbPath[i] = null; dbType[i] = null; dbProps[i] = null; } } synchronized (serverConnSet) { array = new ServerConnection[serverConnSet.size()]; serverConnSet.toArray(array); } for (int i = 0; i < array.length; i++) { ServerConnection sc = array[i]; if (sc.dbID == id) { sc.signalClose(); } } printWithThread("releaseDatabase(" + id + ") exiting"); } /** * Prints the specified message, s, formatted to identify that the print * operation is against this server instance. * * @param msg The message to print */ protected void print(String msg) { PrintWriter writer = logWriter; if (writer != null) { writer.println("[" + serverId + "]: " + msg); writer.flush(); } } /** * Prints value from server's resource bundle, formatted to * identify that the print operation is against this server instance. * Value may be localized according to the default JVM locale * * @param key the resource key */ final void printResource(String key) { String resource; StringTokenizer st; if (serverBundleHandle < 0) { return; } resource = BundleHandler.getString(serverBundleHandle, key); if (resource == null) { return; } st = new StringTokenizer(resource, "\n\r"); while (st.hasMoreTokens()) { print(st.nextToken()); } } /** * Prints the stack trace of the Throwable, t, to this Server object's * errWriter.

              * * @param t the Throwable whose stack trace is to be printed */ protected void printStackTrace(Throwable t) { if (errWriter != null) { t.printStackTrace(errWriter); errWriter.flush(); } } /** * Prints the specified message, s, prepended with a timestamp representing * the current date and time, formatted to identify that the print * operation is against this server instance. * * @param msg the message to print */ final void printWithTimestamp(String msg) { print(HsqlDateTime.getSystemTimeString() + " " + msg); } /** * Prints a message formatted similarly to print(String), additionally * identifying the current (calling) thread. Replaces old method * trace(String msg). * * @param msg the message to print */ protected void printWithThread(String msg) { if (!isSilent()) { print("[" + Thread.currentThread() + "]: " + msg); } } /** * Prints an error message to this Server object's errWriter. * The message is formatted similarly to print(String), * additionally identifying the current (calling) thread. * * @param msg the message to print */ protected void printError(String msg) { PrintWriter writer = errWriter; if (writer != null) { writer.print("[" + serverId + "]: "); writer.print("[" + Thread.currentThread() + "]: "); writer.println(msg); writer.flush(); } } /** * Prints a description of the request encapsulated by the * Result argument, r. * * Printing occurs iff isSilent() is false.

              * * The message is formatted similarly to print(String), additionally * indicating the connection identifier.

              * * For Server instances, cid is typically the value assigned to each * ServerConnection object that is unique amongst all such identifiers * in each distinct JVM session / class loader * context.

              * * For WebServer instances, a single logical connection actually spawns * a new physical WebServerConnection object for each request, so the * cid is typically the underlying session id, since that does not * change for the duration of the logical connection. * * @param cid the connection identifier * @param r the request whose description is to be printed */ final void printRequest(int cid, Result r) { if (isSilent()) { return; } StringBuffer sb = new StringBuffer(); sb.append(cid); sb.append(':'); switch (r.getType()) { case ResultConstants.PREPARE : { sb.append("SQLCLI:SQLPREPARE "); sb.append(r.getMainString()); break; } case ResultConstants.EXECDIRECT : { sb.append(r.getMainString()); break; } case ResultConstants.EXECUTE_INVALID : case ResultConstants.EXECUTE : { sb.append("SQLCLI:SQLEXECUTE:"); sb.append(r.getStatementID()); /** * @todo 1.9.0 - fredt - fix this without appendStringValueOf - use type to convert to string */ /* if (r.getSize() == 1) { sb.append('\n'); StringUtil.appendStringValueOf(r.getParameterData(), sb, true); } */ break; } case ResultConstants.BATCHEXECUTE : sb.append("SQLCLI:SQLEXECUTE:"); sb.append("BATCHMODE:"); sb.append(r.getStatementID()); break; case ResultConstants.UPDATE_RESULT : { sb.append("SQLCLI:RESULTUPDATE:"); sb.append(r.getStatementID()); break; } case ResultConstants.FREESTMT : { sb.append("SQLCLI:SQLFREESTMT:"); sb.append(r.getStatementID()); break; } case ResultConstants.GETSESSIONATTR : { sb.append("HSQLCLI:GETSESSIONATTR"); break; } case ResultConstants.SETSESSIONATTR : { sb.append("HSQLCLI:SETSESSIONATTR:"); break; } case ResultConstants.ENDTRAN : { sb.append("SQLCLI:SQLENDTRAN:"); switch (r.getActionType()) { case ResultConstants.TX_COMMIT : sb.append("COMMIT"); break; case ResultConstants.TX_ROLLBACK : sb.append("ROLLBACK"); break; case ResultConstants.TX_SAVEPOINT_NAME_RELEASE : sb.append("SAVEPOINT_NAME_RELEASE "); sb.append(r.getMainString()); break; case ResultConstants.TX_SAVEPOINT_NAME_ROLLBACK : sb.append("SAVEPOINT_NAME_ROLLBACK "); sb.append(r.getMainString()); break; default : sb.append(r.getActionType()); } break; } case ResultConstants.STARTTRAN : { sb.append("SQLCLI:SQLSTARTTRAN"); break; } case ResultConstants.DISCONNECT : { sb.append("SQLCLI:SQLDISCONNECT"); break; } case ResultConstants.SETCONNECTATTR : { sb.append("SQLCLI:SQLSETCONNECTATTR:"); switch (r.getConnectionAttrType()) { case ResultConstants.SQL_ATTR_SAVEPOINT_NAME : { sb.append("SQL_ATTR_SAVEPOINT_NAME "); sb.append(r.getMainString()); break; } default : { sb.append(r.getConnectionAttrType()); } } break; } case ResultConstants.CLOSE_RESULT : { sb.append("HQLCLI:CLOSE_RESULT:RESULT_ID "); sb.append(r.getResultId()); break; } case ResultConstants.REQUESTDATA : { sb.append("HQLCLI:REQUESTDATA:RESULT_ID "); sb.append(r.getResultId()); sb.append(" ROWOFFSET "); sb.append(r.getUpdateCount()); sb.append(" ROWCOUNT "); sb.append(r.getFetchSize()); break; } default : { sb.append("SQLCLI:MODE:"); sb.append(r.getType()); break; } } print(sb.toString()); } /** * return database ID */ synchronized final int getDBIndex(String aliasPath) { int semipos = aliasPath.indexOf(';'); String alias = aliasPath; String filepath = null; if (semipos != -1) { alias = aliasPath.substring(0, semipos); filepath = aliasPath.substring(semipos + 1); } int dbIndex = ArrayUtil.find(dbAlias, alias); if (dbIndex == -1) { if (filepath == null) { HsqlException e = Error.error(ErrorCode.GENERAL_ERROR, "database alias does not exist"); printError("database alias=" + alias + " does not exist"); setServerError(e); throw e; } else { return openDatabase(alias, filepath); } } else { return dbIndex; } } /** * Open and return database index */ final int openDatabase(String alias, String datapath) { if (!isRemoteOpen) { HsqlException e = Error.error(ErrorCode.GENERAL_ERROR, "remote open not allowed"); printError("Remote database open not allowed"); setServerError(e); throw e; } int i = getFirstEmptyDatabaseIndex(); if (i < -1) { i = closeOldestDatabase(); if (i < -1) { HsqlException e = Error.error(ErrorCode.GENERAL_ERROR, "limit of open databases reached"); printError("limit of open databases reached"); setServerError(e); throw e; } } HsqlProperties newprops = DatabaseURL.parseURL(datapath, false, false); if (newprops == null) { HsqlException e = Error.error(ErrorCode.GENERAL_ERROR, "invalid database path"); printError("invalid database path"); setServerError(e); throw e; } String path = newprops.getProperty(DatabaseURL.url_database); String type = newprops.getProperty(DatabaseURL.url_connection_type); try { int dbid = DatabaseManager.getDatabase(type, path, this, newprops); dbID[i] = dbid; dbActionSequence[i] = actionSequence; dbAlias[i] = alias; dbPath[i] = path; dbType[i] = type; dbProps[i] = newprops; return i; } catch (HsqlException e) { printError("Database [index=" + i + ", db=" + dbType[i] + dbPath[i] + ", alias=" + dbAlias[i] + "] did not open: " + e.toString()); setServerError(e); throw e; } } final int getFirstEmptyDatabaseIndex() { for (int i = 0; i < dbAlias.length; i++) { if (dbAlias[i] == null) { return i; } } return -1; } /** * Opens this server's database instances. This method returns true If * at least one database goes online, otherwise it returns false. * * If openning any of the databases is attempted and an exception is * thrown, the server error is set to this exception. */ final boolean openDatabases() { printWithThread("openDatabases() entered"); boolean success = false; setDBInfoArrays(); for (int i = 0; i < dbAlias.length; i++) { if (dbAlias[i] == null) { continue; } printWithThread("Opening database: [" + dbType[i] + dbPath[i] + "]"); StopWatch sw = new StopWatch(); int id; try { id = DatabaseManager.getDatabase(dbType[i], dbPath[i], this, dbProps[i]); dbID[i] = id; success = true; } catch (HsqlException e) { printError("Database [index=" + i + ", db=" + dbType[i] + dbPath[i] + ", alias=" + dbAlias[i] + "] did not open: " + e.toString()); setServerError(e); dbAlias[i] = null; dbPath[i] = null; dbType[i] = null; dbProps[i] = null; continue; } sw.stop(); String msg = "Database [index=" + i + ", id=" + id + ", db=" + dbType[i] + dbPath[i] + ", alias=" + dbAlias[i] + "] opened sucessfully"; print(sw.elapsedTimeToMessage(msg)); } printWithThread("openDatabases() exiting"); if (isRemoteOpen) { success = true; } if (!success && getServerError() == null) { // database alias / path list is empty or without full info for any DB setServerError(Error.error(ErrorCode.SERVER_NO_DATABASE)); } return success; } /** * Initialises the database attributes lists from the server properties object. */ private void setDBInfoArrays() { IntKeyHashMap dbNumberMap = getDBNameArray(); int maxDatabases = dbNumberMap.size(); if (serverProperties.isPropertyTrue( ServerProperties.sc_key_remote_open_db)) { int max = serverProperties.getIntegerProperty( ServerProperties.sc_key_max_databases, ServerConstants.SC_DEFAULT_MAX_DATABASES); if (maxDatabases < max) { maxDatabases = max; } } dbAlias = new String[maxDatabases]; dbPath = new String[dbAlias.length]; dbType = new String[dbAlias.length]; dbID = new int[dbAlias.length]; dbActionSequence = new long[dbAlias.length]; dbProps = new HsqlProperties[dbAlias.length]; Iterator it = dbNumberMap.keySet().iterator(); for (int i = 0; it.hasNext(); ) { int dbNumber = it.nextInt(); String path = getDatabasePath(dbNumber, true); if (path == null) { printWithThread("missing database path: " + dbNumberMap.get(dbNumber)); continue; } HsqlProperties dbURL = DatabaseURL.parseURL(path, false, false); if (dbURL == null) { printWithThread("malformed database path: " + path); continue; } dbAlias[i] = (String) dbNumberMap.get(dbNumber); dbPath[i] = dbURL.getProperty("database"); dbType[i] = dbURL.getProperty("connection_type"); dbProps[i] = dbURL; i++; } } /** * Returns a map of n values from server.dbname.n values to database names * from the properties object. */ private IntKeyHashMap getDBNameArray() { final String prefix = ServerProperties.sc_key_dbname + "."; final int prefixLen = prefix.length(); IntKeyHashMap idToAliasMap = new IntKeyHashMap(); Enumeration en = serverProperties.propertyNames(); for (; en.hasMoreElements(); ) { String key = (String) en.nextElement(); if (!key.startsWith(prefix)) { continue; } int dbNumber; try { dbNumber = Integer.parseInt(key.substring(prefixLen)); } catch (NumberFormatException e1) { printWithThread("maformed database enumerator: " + key); continue; } String alias = serverProperties.getProperty(key).toLowerCase(); if (!aliasSet.add(alias)) { printWithThread("duplicate alias: " + alias); } Object existing = idToAliasMap.put(dbNumber, alias); if (existing != null) { printWithThread("duplicate database enumerator: " + key); } } return idToAliasMap; } /** * Constructs and installs a new ServerSocket instance for this server. * * @throws Exception if it is not possible to construct and install * a new ServerSocket */ private void openServerSocket() throws Exception { String address; int port; String[] candidateAddrs; String emsg; StopWatch sw; printWithThread("openServerSocket() entered"); if (isTls()) { printWithThread("Requesting TLS/SSL-encrypted JDBC"); } sw = new StopWatch(); socketFactory = HsqlSocketFactory.getInstance(isTls()); address = getAddress(); port = getPort(); if (org.hsqldb.lib.StringUtil.isEmpty(address) || ServerConstants.SC_DEFAULT_ADDRESS.equalsIgnoreCase( address.trim())) { socket = socketFactory.createServerSocket(port); } else { try { socket = socketFactory.createServerSocket(port, address); } catch (UnknownHostException e) { candidateAddrs = ServerConfiguration.listLocalInetAddressNames(); int messageID; Object[] messageParameters; if (candidateAddrs.length > 0) { messageID = ErrorCode.M_SERVER_OPEN_SERVER_SOCKET_1; StringBuffer sb = new StringBuffer(); for (int i = 0; i < candidateAddrs.length; i++) { if (sb.length() > 0) { sb.append(", "); } sb.append(candidateAddrs[i]); } messageParameters = new Object[] { address, sb.toString() }; } else { messageID = ErrorCode.M_SERVER_OPEN_SERVER_SOCKET_2; messageParameters = new Object[]{ address }; } throw new UnknownHostException(Error.getMessage(messageID, 0, messageParameters)); } } /* * Following line necessary for Java 1.3 on UNIX. See accept() * comment elsewhere in this file. */ socket.setSoTimeout(1000); printWithThread("Got server socket: " + socket); print(sw.elapsedTimeToMessage("Server socket opened successfully")); if (socketFactory.isSecure()) { print("Using TLS/SSL-encrypted JDBC"); } printWithThread("openServerSocket() exiting"); } /** Prints a timestamped message indicating that this server is online */ private void printServerOnlineMessage() { String s = getProductName() + " " + getProductVersion() + " is online on port " + this.getPort(); ; printWithTimestamp(s); printResource("online.help"); } /** * Prints a description of the server properties iff !isSilent(). */ protected void printProperties() { Enumeration e; String key; String value; // Avoid the waste of generating each description, // only for trace() to silently discard it if (isSilent()) { return; } e = serverProperties.propertyNames(); while (e.hasMoreElements()) { key = (String) e.nextElement(); value = serverProperties.getProperty(key); printWithThread(key + "=" + value); } } /** * Puts this server into the SERVER_CLOSING state, closes the ServerSocket * and nullifies the reference to it. If the ServerSocket is already null, * this method exists immediately, otherwise, the result is to fully * shut down the server. */ private synchronized void releaseServerSocket() { printWithThread("releaseServerSocket() entered"); if (socket != null) { printWithThread("Releasing server socket: [" + socket + "]"); setState(ServerConstants.SERVER_STATE_CLOSING); try { socket.close(); } catch (IOException e) { printError("Exception closing server socket"); printError("releaseServerSocket(): " + e); } socket = null; } printWithThread("releaseServerSocket() exited"); } /** * Attempts to bring this server fully online by opening * a new ServerSocket, obtaining the hosted databases, * notifying the status waiter thread (if any) and * finally entering the listen loop if all else succeeds. * If any part of the process fails, then this server enters * its shutdown sequence. */ private void run() { StopWatch sw; ThreadGroup tg; String tgName; printWithThread("run() entered"); print("Initiating startup sequence..."); printProperties(); sw = new StopWatch(); setServerError(null); try { // Faster init first: // It is huge waste to fully open the databases, only // to find that the socket address is already in use openServerSocket(); } catch (Exception e) { setServerError(e); printError("run()/openServerSocket(): "); printStackTrace(e); shutdown(true); return; } tgName = "HSQLDB Connections @" + Integer.toString(this.hashCode(), 16); tg = new ThreadGroup(tgName); tg.setDaemon(false); serverConnectionThreadGroup = tg; // Mount the databases this server is supposed to host. // This may take some time if the databases are not all // already open. if (!openDatabases()) { setServerError(null); printError("Shutting down because there are no open databases"); shutdown(true); return; } // At this point, we have a valid server socket and // a valid hosted database set, so its OK to start // listening for connections. setState(ServerConstants.SERVER_STATE_ONLINE); print(sw.elapsedTimeToMessage("Startup sequence completed")); printServerOnlineMessage(); // isShuttingDown is only read after socket connections are 'accept'ed. isShuttingDown = false; // In case shutdown was aborted previously. try { /* * This loop is necessary for UNIX w/ Sun Java 1.3 because * in that case the socket.close() elsewhere will not * interrupt this accept(). */ while (socket != null) { try { handleConnection(socket.accept()); } catch (java.io.InterruptedIOException iioe) {} } } catch (IOException ioe) { if (getState() == ServerConstants.SERVER_STATE_ONLINE) { setServerError(ioe); printError(this + ".run()/handleConnection(): "); printStackTrace(ioe); } } catch (Throwable t) { printWithThread(t.toString()); } finally { shutdown(false); // or maybe getServerError() != null? } } /** * Sets this Server's last encountered error state. * * @param t The new value for the server error */ protected void setServerError(Throwable t) { serverError = t; } /** * Shuts down all the database served by this server. As a consequence, * this server and any other server that is serving a subset of the * databases will be shutdown, unless the server was started with * server.remote_open property. * * The shutdownMode must be one of: * *

                *
              • org.hsqldb.Database.CLOSEMODE_IMMEDIATELY *
              • org.hsqldb.Database.CLOSEMODE_NORMAL *
              • org.hsqldb.Database.CLOSEMODE_COMPACT *
              • org.hsqldb.Database.CLOSEMODE_SCRIPT *
              * @param shutdownMode a value between 0-4, usually 0 or 1. */ public void shutdownCatalogs(int shutdownMode) { DatabaseManager.shutdownDatabases(this, shutdownMode); } /** * Shuts down this server and all the database served by this server. As a * consequence, any other server that is serving a subset of the databases * will be shutdown, unless the server was started with server.remote_open * property. * * The shutdownMode must be one of: * *
                *
              • org.hsqldb.Database.CLOSEMODE_IMMEDIATELY *
              • org.hsqldb.Database.CLOSEMODE_NORMAL *
              • org.hsqldb.Database.CLOSEMODE_COMPACT *
              • org.hsqldb.Database.CLOSEMODE_SCRIPT *
              * @param shutdownMode a value between 0-4, usually 0 or 1. */ public void shutdownWithCatalogs(int shutdownMode) { // If an unchecked exception is thrown, isShuttingDown will be left true, // which is good from a security standpoint. isShuttingDown = true; // make handleConnection() reject new connection attempts DatabaseManager.shutdownDatabases(this, shutdownMode); shutdown(false); isShuttingDown = false; } /** * External method to shut down this server. */ public void shutdown() { shutdown(false); } /** * Shuts down this server. * * @param error true if shutdown is in response to an error * state, else false */ protected synchronized void shutdown(boolean error) { if (serverState == ServerConstants.SERVER_STATE_SHUTDOWN) { return; } StopWatch sw; printWithThread("shutdown() entered"); sw = new StopWatch(); print("Initiating shutdown sequence..."); releaseServerSocket(); DatabaseManager.deRegisterServer(this); if (dbPath != null) { for (int i = 0; i < dbPath.length; i++) { releaseDatabase(dbID[i]); } } // Be nice and let applications exit if there are no // running connection threads - wait at most 100 ms per active thread if (serverConnectionThreadGroup != null) { if (!serverConnectionThreadGroup.isDestroyed()) { int count = serverConnectionThreadGroup.activeCount(); for (int i = 0; serverConnectionThreadGroup.activeCount() > 0 && i < count; i++) { try { Thread.sleep(100); } catch (Exception e) { // e.getMessage(); } } try { serverConnectionThreadGroup.destroy(); printWithThread(serverConnectionThreadGroup.getName() + " destroyed"); } catch (Throwable t) { printWithThread(serverConnectionThreadGroup.getName() + " not destroyed"); printWithThread(t.toString()); } } serverConnectionThreadGroup = null; } serverThread = null; setState(ServerConstants.SERVER_STATE_SHUTDOWN); print(sw.elapsedTimeToMessage("Shutdown sequence completed")); if (isNoSystemExit()) { printWithTimestamp("SHUTDOWN : System.exit() was not called"); printWithThread("shutdown() exited"); } else { printWithTimestamp("SHUTDOWN : System.exit() is called next"); printWithThread("shutdown() exiting..."); try { System.exit(0); } catch (Throwable t) { printWithThread(t.toString()); } } } /** * Used by Connection object */ synchronized void setActionSequence(int dbIndex) { dbActionSequence[dbIndex] = actionSequence++; } /** * Feature is turned off by, pending a property to allow it. */ protected int closeOldestDatabase() { return -1; /* int index = -1; Database db; synchronized (this) { long min = Long.MAX_VALUE; for (int i = 0; i < dbActionSequence.length; i++) { if (min > dbActionSequence[i]) { min = dbActionSequence[i]; index = i; } } if (index == -1) { return -1; } db = DatabaseManager.lookupDatabaseObject(dbType[index], dbPath[index]); if (db == null) { return -1; } } db.close(Database.CLOSEMODE_IMMEDIATELY); return index; */ } /** * Prints message for the specified key, without any special * formatting. The message content comes from the server * resource bundle and thus may localized according to the default * JVM locale.

              * * Uses System.out directly instead of Trace.printSystemOut() so it * always prints, regardless of Trace settings. * * @param key for message */ protected static void printHelp(String key) { System.out.println(BundleHandler.getString(serverBundleHandle, key)); } /** * Creates and starts a new Server.

              * * Allows starting a Server via the command line interface.

              * * @param args the command line arguments for the Server instance */ public static void main(String[] args) { HsqlProperties argProps = null; argProps = HsqlProperties.argArrayToProps(args, ServerProperties.sc_key_prefix); String[] errors = argProps.getErrorKeys(); if (errors.length != 0) { System.out.println("no value for argument:" + errors[0]); printHelp("server.help"); return; } String propsPath = argProps.getProperty(ServerProperties.sc_key_props); String propsExtension = ""; if (propsPath == null) { propsPath = "server"; propsExtension = ".properties"; } else { argProps.removeProperty(ServerProperties.sc_key_props); } propsPath = FileUtil.getFileUtil().canonicalOrAbsolutePath(propsPath); ServerProperties fileProps = ServerConfiguration.getPropertiesFromFile( ServerConstants.SC_PROTOCOL_HSQL, propsPath, propsExtension); ServerProperties props = fileProps == null ? new ServerProperties(ServerConstants.SC_PROTOCOL_HSQL) : fileProps; props.addProperties(argProps); ServerConfiguration.translateDefaultDatabaseProperty(props); // Standard behaviour when started from the command line // is to halt the VM when the server shuts down. This may, of // course, be overridden by whatever, if any, security policy // is in place. ServerConfiguration.translateDefaultNoSystemExitProperty(props); ServerConfiguration.translateAddressProperty(props); // finished setting up properties; Server server = new Server(); try { server.setProperties(props); } catch (Exception e) { server.printError("Failed to set properties"); server.printStackTrace(e); return; } // now messages go to the channel specified in properties server.print("Startup sequence initiated from main() method"); if (fileProps != null) { server.print("Loaded properties from [" + propsPath + propsExtension + "]"); } else { server.print("Could not load properties from file"); server.print("Using cli/default properties only"); } server.start(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/OdbcUtil.java0000644000175000017500000002613712007547404022630 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.io.IOException; import java.util.Locale; import org.hsqldb.ColumnBase; import org.hsqldb.lib.DataOutputStream; import org.hsqldb.result.ResultMetaData; /** * Static values and methods to facilitate servicing ODBC clients. */ public class OdbcUtil { static void validateInputPacketSize(OdbcPacketInputStream p) throws RecoverableOdbcFailure { int remaining = -1; try { remaining = p.available(); } catch (IOException ioe) { // Just ignore here and we will send notifiction below. // If there really is an I/O problem, it will be handled better // on the next read. } if (remaining < 1) { return; } throw new RecoverableOdbcFailure( "Client supplied bad length for " + p.packetType + " packet. " + remaining + " bytes available after processing", "Bad length for " + p.packetType + " packet. " + remaining + " extra bytes", "08P01"); // Code here means Protocol Violation } static String echoBackReplyString(String inCommand, int retval) { String uc = inCommand.trim().toUpperCase(Locale.ENGLISH); int firstWhiteSpace; for (firstWhiteSpace = 0; firstWhiteSpace < uc.length(); firstWhiteSpace++) { if (Character.isWhitespace(uc.charAt(firstWhiteSpace))) { break; } } StringBuffer replyString = new StringBuffer( uc.substring(0, firstWhiteSpace)); String keyword = replyString.toString(); if (keyword.equals("UPDATE") || keyword.equals("DELETE")) { replyString.append(" " + retval); } else if (keyword.equals("CREATE") || keyword.equals("DROP")) { // This case is significantly missing from the spec., yet // PostgreSQL Server echo's these commands as implemented here. // TODO: Add error-checking int wordStart; for (wordStart = firstWhiteSpace; wordStart < uc.length(); wordStart++) { if (!Character.isWhitespace(uc.charAt(wordStart))) { break; } } int wordEnd; for (wordEnd = wordStart; wordEnd < uc.length(); wordEnd++) { if (!Character.isWhitespace(uc.charAt(wordEnd))) { break; } } replyString.append(" " + uc.substring(wordStart, wordEnd)); } else if (keyword.equals("INSERT")) { replyString.append(" " + 0 + ' ' + retval); // The number is the supposed to be the oid for single-row // inserts into a table that has row oids. // Since the requirement is conditional, it's very likely that the // client will make any use of the value we pass. } // If we ever implement following SQL commands, add echo's for these // strings too: MOVE, FETCH, COPY. return replyString.toString(); } static void writeParam( String key, String val, DataOutputStream hOutStream) throws IOException { OdbcPacketOutputStream alertPacket = OdbcPacketOutputStream.newOdbcPacketOutputStream(); alertPacket.write(key); alertPacket.write(val); alertPacket.xmit('S', hOutStream); alertPacket.close(); } // Constants taken from connection.h static final int ODBC_SM_DATABASE = 64; static final int ODBC_SM_USER = 32; static final int ODBC_SM_OPTIONS = 64; static final int ODBC_SM_UNUSED = 64; static final int ODBC_SM_TTY = 64; static final int ODBC_AUTH_REQ_PASSWORD = 3; static final int ODBC_AUTH_REQ_OK = 0; static void alertClient(int severity, String message, DataOutputStream hOutStream) throws IOException { alertClient(severity, message, null, hOutStream); } static void alertClient(int severity, String message, String sqlStateCode, DataOutputStream hOutStream) throws IOException { if (sqlStateCode == null) { sqlStateCode = "XX000"; // This default code means INTERNAL ERROR } if (!odbcSeverityMap.containsKey(severity)) { throw new IllegalArgumentException( "Unknown severity value (" + severity + ')'); } OdbcPacketOutputStream alertPacket = OdbcPacketOutputStream.newOdbcPacketOutputStream(); alertPacket.write("S" + odbcSeverityMap.get(severity)); if (severity < ODBC_SEVERITY_NOTICE) { alertPacket.write("C" + sqlStateCode); } alertPacket.write("M" + message); alertPacket.writeByte(0); alertPacket.xmit((severity < ODBC_SEVERITY_NOTICE) ? 'E' : 'N', hOutStream); alertPacket.close(); } static String[][] hardcodedParams = new String[][] { new String[] { "client_encoding", "SQL_ASCII" }, new String[] { "DateStyle", "ISO, MDY" }, new String[] { "integer_datetimes", "on" }, new String[] { "is_superuser", "on" }, new String[] { "server_encoding", "SQL_ASCII" }, new String[] { "server_version", "8.3.1" }, new String[] { "session_authorization", "blaine" }, new String[] { "standard_conforming_strings", "off" }, new String[] { "TimeZone", "US/Eastern" }, }; static final int ODBC_SIMPLE_MODE = 0; static final int ODBC_EXTENDED_MODE = 1; static final int ODBC_EXT_RECOVER_MODE = 2; static final int ODBC_SEVERITY_FATAL = 1; static final int ODBC_SEVERITY_ERROR = 2; static final int ODBC_SEVERITY_PANIC = 3; static final int ODBC_SEVERITY_WARNING = 4; static final int ODBC_SEVERITY_NOTICE = 5; static final int ODBC_SEVERITY_DEBUG = 6; static final int ODBC_SEVERITY_INFO = 7; static final int ODBC_SEVERITY_LOG = 8; static org.hsqldb.lib.IntKeyHashMap odbcSeverityMap = new org.hsqldb.lib.IntKeyHashMap(); static { odbcSeverityMap.put(ODBC_SEVERITY_FATAL, "FATAL"); odbcSeverityMap.put(ODBC_SEVERITY_ERROR, "ERROR"); odbcSeverityMap.put(ODBC_SEVERITY_PANIC, "PANIC"); odbcSeverityMap.put(ODBC_SEVERITY_WARNING, "WARNING"); odbcSeverityMap.put(ODBC_SEVERITY_NOTICE, "NOTICE"); odbcSeverityMap.put(ODBC_SEVERITY_DEBUG, "DEBUG"); odbcSeverityMap.put(ODBC_SEVERITY_INFO, "INFO"); odbcSeverityMap.put(ODBC_SEVERITY_LOG, "LOG"); } /** * TODO: Eliminate the mungling on the client-side instead of * attempting very problematic correction here! */ static String revertMungledPreparedQuery(String inQuery) { // THIS PURPOSEFULLY USING Java 1.4! return inQuery.replaceAll("\\$\\d+", "?"); } public static int getTableOidForColumn(int colIndex, ResultMetaData md) { if (!md.isTableColumn(colIndex)) { return 0; } ColumnBase col = md.columns[colIndex]; int hashCode = (col.getSchemaNameString() + '.' + col.getTableNameString()).hashCode(); if (hashCode < 0) { hashCode *= -1; } return hashCode; } /** * Temporary hack. * * This ID should stick with the table * column. Here, it will change based on user-specified column label. * The int has is also being truncated into a short. */ public static short getIdForColumn(int colIndex, ResultMetaData md) { if (!md.isTableColumn(colIndex)) { return 0; } short hashCode = (short) md.getGeneratedColumnNames()[colIndex].hashCode(); if (hashCode < 0) { hashCode *= -1; } return hashCode; //return (short) (colIndex + 1); } /** * @param hexChars A String containing an EVEN number of hex * characters. */ public static String hexCharsToOctalOctets(String hexChars) { int chars = hexChars.length(); if (chars != (chars / 2) * 2) { throw new IllegalArgumentException("Hex character lists contains " + "an odd number of characters: " + chars); } StringBuffer sb = new StringBuffer(); char c; int octet; for (int i = 0; i < chars; i++) { octet = 0; c = hexChars.charAt(i); if (c >= 'a' && c <= 'f') { octet += 10 + c - 'a'; } else if (c >= 'A' && c <= 'F') { octet += 10 + c - 'A'; } else if (c >= '0' && c <= '9') { octet += c - '0'; } else { throw new IllegalArgumentException( "Non-hex character in input at offset " + i + ": " + c); } octet = octet << 4; c = hexChars.charAt(++i); if (c >= 'a' && c <= 'f') { octet += 10 + c - 'a'; } else if (c >= 'A' && c <= 'F') { octet += 10 + c - 'A'; } else if (c >= '0' && c <= '9') { octet += c - '0'; } else { throw new IllegalArgumentException( "Non-hex character in input at offset " + i + ": " + c); } sb.append('\\'); sb.append((char) ('0' + (octet >> 6))); sb.append((char) ('0' + ((octet >> 3) & 7))); sb.append((char) ('0' + (octet & 7))); } return sb.toString(); } public static void main(String[] sa) { System.out.println("(" + OdbcUtil.hexCharsToOctalOctets(sa[0]) + ')'); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/ServerAcl.java0000644000175000017500000004217012007547404023004 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import org.hsqldb.store.BitMap; /** * A list of ACL permit and deny entries with a permitAccess method * which tells whether candidate addresses are permitted or denied * by this ACL list. *

              * The ACL file is reloaded whenever a modification to it is detected. * If you copy in a file with an older file date, you will need to touch it. *

              * *

              * The public runtime method is permitAccess(). * The public setup method is the constructor. *

              * Each non-comment line in the ACL file must be a rule of the format: *

              
               *     {allow|deny} [/significant-bits]
               * 
              * For example *
              
               *     allow ahostname
               *     deny ahost.domain.com
               *     allow 127.0.0.1
               *     allow 2001:db8::/32
               * 
              *

              * In order to detect bit specification mistakes, we require that * non-significant bits be zero in the values. * An undesirable consequence of this is, you can't use a specification like * the following to mean "all of the hosts on the same network as x.admc.com": *

              
               *     allow x.admc.com/24
               * 
              *

              * * @see #ServerAcl(File) * @see #permitAccess **/ public final class ServerAcl { public static final class AclFormatException extends Exception { public AclFormatException(String s) { super(s); } } protected static final byte[] ALL_SET_4BYTES = new byte[] { -1, -1, -1, -1 }; protected static final byte[] ALL_SET_16BYTES = new byte[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; // -1 is all-bits-on in 2's-complement for signed values. // Must do it this way since Java has no support for unsigned integral // constants. private static final class AclEntry { private byte[] value; private byte[] mask; // These are the bits in candidate which must match private int bitBlockSize; public boolean allow; public AclEntry(byte[] value, int bitBlockSize, boolean allow) throws AclFormatException { byte[] allOn = null; switch (value.length) { case 4 : allOn = ALL_SET_4BYTES; break; case 16 : allOn = ALL_SET_16BYTES; break; default : throw new IllegalArgumentException( "Only 4 and 16 bytes supported, not " + value.length); } if (bitBlockSize > value.length * 8) { throw new IllegalArgumentException( "Specified " + bitBlockSize + " significant bits, but value only has " + (value.length * 8) + " bits"); } this.bitBlockSize = bitBlockSize; this.value = value; mask = BitMap.leftShift(allOn, value.length * 8 - bitBlockSize); if (mask.length != value.length) { throw new RuntimeException( "Basic program assertion failed. " + "Generated mask length " + mask.length + " (bytes) does not match given value length " + value.length + " (bytes)."); } this.allow = allow; validateMask(); } public String toString() { StringBuffer sb = new StringBuffer("Addrs "); sb.append((value.length == 16) ? ("[" + ServerAcl.colonNotation(value) + ']') : ServerAcl.dottedNotation(value)); sb.append("/" + bitBlockSize + ' ' + (allow ? "ALLOW" : "DENY")); return sb.toString(); } public boolean matches(byte[] candidate) { if (value.length != candidate.length) { return false; } return !BitMap.hasAnyBitSet(BitMap.xor(value, BitMap.and(candidate, mask))); } public void validateMask() throws AclFormatException { if (BitMap.hasAnyBitSet(BitMap.and(value, BitMap.not(mask)))) { throw new AclFormatException( "The base address '" + ServerAcl.dottedNotation(value) + "' is too specific for block-size-spec /" + bitBlockSize); } } } /** * @param uba Unsigned byte array */ public static String dottedNotation(byte[] uba) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < uba.length; i++) { if (i > 0) { sb.append('.'); } sb.append((int) uba[i] & 0xff); } return sb.toString(); } /** * @param uba Unsigned byte array */ public static String colonNotation(byte[] uba) { // TODO: handle odd byte lengths. if ((uba.length / 2) * 2 != uba.length) { throw new RuntimeException( "At this time .colonNotation only handles even byte quantities"); } StringBuffer sb = new StringBuffer(); for (int i = 0; i < uba.length; i += 2) { if (i > 0) { sb.append(':'); } sb.append(Integer.toHexString((uba[i] & 0xff) * 256 + (uba[i + 1] & 0xff))); } return sb.toString(); } private PrintWriter pw = null; public void setPrintWriter(PrintWriter pw) { this.pw = pw; } public String toString() { StringBuffer sb = new StringBuffer(); for (int i = 0; i < aclEntries.size(); i++) { if (i > 0) { sb.append('\n'); } sb.append("Entry " + (i + 1) + ": " + aclEntries.get(i)); } return sb.toString(); } private List aclEntries; static private AclEntry PROHIBIT_ALL_IPV4; static private AclEntry PROHIBIT_ALL_IPV6; static { try { PROHIBIT_ALL_IPV4 = new AclEntry(InetAddress.getByName("0.0.0.0").getAddress(), 0, false); PROHIBIT_ALL_IPV6 = new AclEntry(InetAddress.getByName("::").getAddress(), 0, false); } catch (UnknownHostException uke) { // Should never reach here, since no name service is needed to // look up either address. throw new RuntimeException( "Unexpected problem in static initializer", uke); } catch (AclFormatException afe) { throw new RuntimeException( "Unexpected problem in static initializer", afe); } } /** * Uses system network libraries to resolve the given String to an IP addr, * then determine whether this address is permitted or denied. * * Specified name may be a numerical-based String like "1.2.3.4", a * constant known to the networking libraries, or a host name to be * resolved by the systems name resolution system. * * If the given String can't be resolved to an IP addr, false is returned. * * @see #permitAccess(byte[]) */ public boolean permitAccess(String s) { try { return permitAccess(InetAddress.getByName(s).getAddress()); } catch (UnknownHostException uke) { println("'" + s + "' denied because failed to resolve to an addr"); return false; // Resolution of candidate failed } } /** * @return true if access for the candidate address should be permitted, * false if access should be denied. * @throws RuntimeException if no rule covers the candidate address. * This would be the case if this class is applied to some * network protocol other than ipv4 or ipv6, without adding a * default rule for it. */ public boolean permitAccess(byte[] addr) { ensureAclsUptodate(); for (int i = 0; i < aclEntries.size(); i++) { if (((AclEntry) aclEntries.get(i)).matches(addr)) { AclEntry hit = (AclEntry) aclEntries.get(i); println("Addr '" + ServerAcl.dottedNotation(addr) + "' matched rule #" + (i + 1) + ": " + hit); return hit.allow; } } throw new RuntimeException("No rule matches address '" + ServerAcl.dottedNotation(addr) + "'"); } private void println(String s) { if (pw == null) { return; } pw.println(s); pw.flush(); } private File aclFile; private long lastLoadTime = 0; private static final class InternalException extends Exception {} public ServerAcl(File aclFile) throws IOException, AclFormatException { this.aclFile = aclFile; aclEntries = load(); } synchronized protected void ensureAclsUptodate() { if (lastLoadTime > aclFile.lastModified()) { return; } try { aclEntries = load(); println("ACLs reloaded from file"); return; } catch (Exception e) { println("Failed to reload ACL file. Retaining old ACLs. " + e); } } protected List load() throws IOException, AclFormatException { if (!aclFile.exists()) { throw new IOException("File '" + aclFile.getAbsolutePath() + "' is not present"); } if (!aclFile.isFile()) { throw new IOException("'" + aclFile.getAbsolutePath() + "' is not a regular file"); } if (!aclFile.canRead()) { throw new IOException("'" + aclFile.getAbsolutePath() + "' is not accessible"); } String line; String ruleTypeString; StringTokenizer toker; String addrString, bitString = null; int slashIndex; int linenum = 0; byte[] addr; boolean allow; int bits; BufferedReader br = new BufferedReader(new FileReader(aclFile)); List newAcls = new ArrayList(); try { while ((line = br.readLine()) != null) { linenum++; line = line.trim(); if (line.length() < 1) { continue; } if (line.charAt(0) == '#') { continue; } toker = new StringTokenizer(line); try { if (toker.countTokens() != 2) { throw new InternalException(); } ruleTypeString = toker.nextToken(); addrString = toker.nextToken(); slashIndex = addrString.indexOf('/'); if (slashIndex > -1) { bitString = addrString.substring(slashIndex + 1); addrString = addrString.substring(0, slashIndex); } addr = InetAddress.getByName(addrString).getAddress(); bits = (bitString == null) ? (addr.length * 8) : Integer.parseInt(bitString); if (ruleTypeString.equalsIgnoreCase("allow")) { allow = true; } else if (ruleTypeString.equalsIgnoreCase("permit")) { allow = true; } else if (ruleTypeString.equalsIgnoreCase("accept")) { allow = true; } else if (ruleTypeString.equalsIgnoreCase("prohibit")) { allow = false; } else if (ruleTypeString.equalsIgnoreCase("deny")) { allow = false; } else if (ruleTypeString.equalsIgnoreCase("reject")) { allow = false; } else { throw new InternalException(); } } catch (NumberFormatException nfe) { throw new AclFormatException("Syntax error at ACL file '" + aclFile.getAbsolutePath() + "', line " + linenum); } catch (InternalException ie) { throw new AclFormatException("Syntax error at ACL file '" + aclFile.getAbsolutePath() + "', line " + linenum); } try { newAcls.add(new AclEntry(addr, bits, allow)); } catch (AclFormatException afe) { throw new AclFormatException("Syntax error at ACL file '" + aclFile.getAbsolutePath() + "', line " + linenum + ": " + afe.toString()); } } } finally { br.close(); } newAcls.add(PROHIBIT_ALL_IPV4); newAcls.add(PROHIBIT_ALL_IPV6); lastLoadTime = new java.util.Date().getTime(); return newAcls; } /** * Utility method that allows interactive testing of individal * ACL records, as well as the net effect of the ACL record list. * * Run "java -cp path/to/hsqldb.jar org.hsqldb.server.ServerAcl --help" * for Syntax help. */ public static void main(String[] sa) throws AclFormatException, IOException { if (sa.length > 1) { throw new RuntimeException("Try: java -cp path/to/hsqldb.jar " + ServerAcl.class.getName() + " --help"); } if (sa.length > 0 && sa[0].equals("--help")) { System.err.println("SYNTAX: java -cp path/to/hsqldb.jar " + ServerAcl.class.getName() + " [filepath.txt]"); System.err.println("ACL file path defaults to 'acl.txt' in the " + "current directory."); System.exit(0); } ServerAcl serverAcl = new ServerAcl(new File((sa.length == 0) ? "acl.txt" : sa[0])); serverAcl.setPrintWriter(new PrintWriter(System.out)); System.out.println(serverAcl.toString()); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter hostnames or IP addresses to be tested " + "(one per line)."); String s; while ((s = br.readLine()) != null) { s = s.trim(); if (s.length() < 1) { continue; } System.out.println(Boolean.toString(serverAcl.permitAccess(s))); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/OdbcPacketInputStream.java0000644000175000017500000001752112007547404025313 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import org.hsqldb.HsqlException; import org.hsqldb.types.BinaryData; /** * An atomic transfer packet received from a HyperSQL client. * * Since we read and cache all data for the packet upon instantiation, the * available method is reliable and may be relied upon. * * @see #available() */ class OdbcPacketInputStream extends DataInputStream { char packetType; private InputStream bufferStream; /** * Instantiate a packet of the specified type and size. */ static OdbcPacketInputStream newOdbcPacketInputStream( char cType, InputStream streamSource, int sizeInt) throws IOException { return newOdbcPacketInputStream( cType, streamSource, new Integer(sizeInt)); } /** * Instantiate a packet of the specified type, with size determined by * the first int read from the given stream. */ static OdbcPacketInputStream newOdbcPacketInputStream( char cType, InputStream streamSource) throws IOException { return newOdbcPacketInputStream(cType, streamSource, null); } static private OdbcPacketInputStream newOdbcPacketInputStream( char cType, InputStream streamSource, Integer packetSizeObj) throws IOException { int bytesRead, i; int packetSize = 0; if (packetSizeObj == null) { byte[] fourBytes = new byte[4]; bytesRead = 0; while ((i = streamSource.read(fourBytes, bytesRead, fourBytes.length - bytesRead)) > 0) { bytesRead += i; } if (bytesRead != fourBytes.length) { throw new EOFException("Failed to read size header int"); } packetSize = ((fourBytes[0] & 0xff) << 24) + ((fourBytes[1] & 0xff) <<16) + ((fourBytes[2] & 0xff) << 8) + (fourBytes[3] & 0xff) - 4; // Minus 4 because this counts the size int itself. } else { packetSize = packetSizeObj.intValue(); } byte[] xferBuffer = new byte[packetSize]; bytesRead = 0; while ((i = streamSource.read(xferBuffer, bytesRead, xferBuffer.length - bytesRead)) > 0) { bytesRead += i; } if (bytesRead != xferBuffer.length) { throw new EOFException ( "Failed to read packet contents from given stream"); } return new OdbcPacketInputStream( cType, new ByteArrayInputStream(xferBuffer)); } private OdbcPacketInputStream(char packetType, InputStream bufferStream) { super(bufferStream); this.packetType = packetType; } /** * Generate a String/String Map from null-terminated String pairs, until * a '\0' character is read in place of the first key character. * * @return the generated Map * @throws EOFException if the rest of packet does not contained the * required, well-formed null-terminated string pairs. */ Map readStringPairs() throws IOException { String key; Map map = new HashMap(); while (true) { key = readString(); if (key.length() < 1) { break; } map.put(key, readString()); } return map; } /** * Reads a NULL-TERMINATED String. * * @throws IOException if attempt to read past end of packet. */ String readString() throws IOException { /* Would be MUCH easier to do this with Java6's String * encoding/decoding operations */ ByteArrayOutputStream baos = new ByteArrayOutputStream(); baos.write((byte) 'X'); baos.write((byte) 'X'); // Place-holders to be replaced with short length int i; while ((i = readByte()) > 0) { baos.write((byte) i); } byte[] ba = baos.toByteArray(); baos.close(); int len = ba.length - 2; ba[0] = (byte) (len >>> 8); ba[1] = (byte) len; DataInputStream dis = new DataInputStream(new ByteArrayInputStream(ba)); String s = dis.readUTF(); //String s = DataInputStream.readUTF(dis); // TODO: Test the previous two to see if one works better for // high-order characters. dis.close(); return s; } BinaryData readSizedBinaryData() throws IOException { int len = readInt(); try { return (len < 0) ? null : new BinaryData((long) len, this); } catch (HsqlException he) { throw new IOException(he.getMessage()); } } String readSizedString() throws IOException { int len = readInt(); return (len < 0) ? null : readString(len); } /** * These Strings are not null-terminated. * * @param len Bytes to read (not necessarily characters to be returned! * @throws IOException if attempt to read past end of packet. */ String readString(int len) throws IOException { /* Would be MUCH easier to do this with Java6's String * encoding/decoding operations */ int bytesRead = 0; int i; byte[] ba = new byte[len + 2]; ba[0] = (byte) (len >>> 8); ba[1] = (byte) len; while ((i = read(ba, 2 + bytesRead, len - bytesRead)) > -1 && bytesRead < len) { bytesRead += i; } if (bytesRead != len) { throw new EOFException("Packet ran dry"); } for (i = 2; i < ba.length - 1; i++) { if (ba[i] == 0) { throw new RuntimeException( "Null internal to String at offset " + (i - 2)); } } DataInputStream dis = new DataInputStream(new ByteArrayInputStream(ba)); String s = dis.readUTF(); //String s = DataInputStream.readUTF(dis); // TODO: Test the previous two to see if one works better for // high-order characters. dis.close(); return s; } public char readByteChar() throws IOException { return (char) readByte(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/ServerProperties.java0000644000175000017500000002707012007547404024443 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Enumeration; import org.hsqldb.lib.HashMap; import org.hsqldb.lib.IntKeyHashMap; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.persist.HsqlProperties; /** * A subclass HsqlProperties with functionality needed for the HSQLDB Server * implementations.

              * * A property object is checked once and all the errors are stored in * collections to be used * * Meta records specify accepted keys and policies for the expected values.

              * * Policy for defaults:

                *
              • If (non-null) default is specified for the Meta record, then * behavior is obvious. *
              • If pattern-type Meta record, then there is no default. * A value is required for the property. *
              • Otherwise null is specified for the Meta record and user must set * a value. *
              * * If a range is specified in the Meta record, then the value is checked * against the range.

              * * If a set of values specified in the Meta record, then the value is checked * against the set.

              * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public class ServerProperties extends HsqlProperties { // types of properties static final int SERVER_PROPERTY = 0; static final int SERVER_MULTI_PROPERTY = 1; static final int SYSTEM_PROPERTY = 2; // keys to properties static final String sc_key_prefix = "server"; static final String sc_key_address = "server.address"; static final String sc_key_autorestart_server = "server.restart_on_shutdown"; static final String sc_key_database = "server.database"; static final String sc_key_dbname = "server.dbname"; static final String sc_key_no_system_exit = "server.no_system_exit"; static final String sc_key_port = "server.port"; static final String sc_key_http_port = "server.port"; static final String sc_key_silent = "server.silent"; static final String sc_key_tls = "server.tls"; static final String sc_key_trace = "server.trace"; static final String sc_key_web_default_page = "server.default_page"; static final String sc_key_web_root = "server.root"; static final String sc_key_max_connections = "server.maxconnections"; static final String sc_key_remote_open_db = "server.remote_open"; static final String sc_key_max_databases = "server.maxdatabases"; static final String sc_key_acl = "server.acl"; static final String sc_key_daemon = "server.daemon"; static final String sc_key_props = "server.props"; static final String sc_key_system = "system"; // web server page defaults static final String sc_default_web_mime = "text/html"; static final String sc_default_web_page = "index.html"; static final String sc_default_web_root = "."; // static final HashMap meta = new HashMap(); static final OrderedHashSet prefixes = new OrderedHashSet(); // final int protocol; protected boolean initialised = false; // IntKeyHashMap idToAliasMap = new IntKeyHashMap(); IntKeyHashMap idToPathMap = new IntKeyHashMap(); public ServerProperties(int protocol, File file) throws IOException { FileInputStream fis = null; try { fis = new FileInputStream(file); stringProps.load(fis); } finally { if (fis != null) { fis.close(); } } this.protocol = protocol; } ServerProperties(int protocol) { this.protocol = protocol; } ServerProperties(int protocol, String path, String extension) { super(path, extension); this.protocol = protocol; } /** * Validates according to Meta map, and sets System Properties for those * properties with names matching the requisite pattern. */ public void validate() { Enumeration en = stringProps.propertyNames(); while (en.hasMoreElements()) { String key = (String) en.nextElement(); Object[] metadata = (Object[]) meta.get(key); if (metadata == null) { metadata = getPrefixedMetadata(key); } if (metadata == null) { String error = "unsupported property: " + key; super.addError(ANY_ERROR, error); continue; } String error = null; if (((Integer) metadata[indexType]).intValue() == SYSTEM_PROPERTY) { error = validateSystemProperty(key, metadata); } else if (((Integer) metadata[indexType]).intValue() == SERVER_MULTI_PROPERTY) { error = validateMultiProperty(key, metadata); } else { String value = getProperty(key); if (value == null) { if (metadata[indexDefaultValue] == null) { error = "missing value for property: " + key; } else { setProperty(key, metadata[indexDefaultValue].toString()); } } else { error = HsqlProperties.validateProperty(key, value, metadata); } } if (error != null) { super.addError(ANY_ERROR, error); } } Iterator it = idToAliasMap.keySet().iterator(); while (it.hasNext()) { int number = it.nextInt(); if (!idToPathMap.containsKey(number)) { addError(ANY_ERROR, "no path for database id: " + number); } } it = idToPathMap.keySet().iterator(); while (it.hasNext()) { int number = it.nextInt(); if (!idToAliasMap.containsKey(number)) { addError(ANY_ERROR, "no alias for database id: " + number); } } initialised = true; } Object[] getPrefixedMetadata(String key) { for (int i = 0; i < prefixes.size(); i++) { String prefix = (String) prefixes.get(i); if (key.startsWith(prefix)) { return (Object[]) meta.get(prefix); } } return null; } /** * Checks an alias or database path. Duplicates are checked as duplicate * numbering may result from differnt strings (e.g. 02 and 2). */ String validateMultiProperty(String key, Object[] meta) { int dbNumber; String prefix = (String) meta[indexName]; if (meta[indexName].equals(sc_key_database)) { if (sc_key_database.equals(key)) { key = key + ".0"; } } try { dbNumber = Integer.parseInt(key.substring(prefix.length() + 1)); } catch (NumberFormatException e1) { return ("maformed database enumerator: " + key); } if (meta[indexName].equals(sc_key_dbname)) { String alias = stringProps.getProperty(key).toLowerCase(); Object existing = idToAliasMap.put(dbNumber, alias); if (existing != null) { return "duplicate database enumerator: " + key; } } else if (meta[indexName].equals(sc_key_database)) { String path = stringProps.getProperty(key); Object existing = idToPathMap.put(dbNumber, path); if (existing != null) { return "duplicate database enumerator: " + key; } } return null; } /** * System properties are currently not checked, as different libraries in * the environment may need different names? */ String validateSystemProperty(String key, Object[] meta) { String prefix = (String) meta[indexName]; String specificKey = key.substring(prefix.length() + 1); String value = stringProps.getProperty(key); if (value == null) { return "value required for property: " + key; } System.setProperty(specificKey, value); return null; } static { // properties with variable suffixes meta.put(sc_key_database, getMeta(sc_key_database, SERVER_MULTI_PROPERTY, null)); meta.put(sc_key_dbname, getMeta(sc_key_dbname, SERVER_MULTI_PROPERTY, null)); meta.put(sc_key_system, getMeta(sc_key_system, SYSTEM_PROPERTY, null)); // properties with fixed names meta.put(sc_key_silent, getMeta(sc_key_silent, SERVER_PROPERTY, false)); meta.put(sc_key_trace, getMeta(sc_key_trace, SERVER_PROPERTY, false)); meta.put(sc_key_tls, getMeta(sc_key_tls, SERVER_PROPERTY, false)); meta.put(sc_key_acl, getMeta(sc_key_acl, SERVER_PROPERTY, null)); meta.put(sc_key_autorestart_server, getMeta(sc_key_autorestart_server, SERVER_PROPERTY, false)); meta.put(sc_key_remote_open_db, getMeta(sc_key_remote_open_db, SERVER_PROPERTY, false)); meta.put(sc_key_no_system_exit, getMeta(sc_key_no_system_exit, SERVER_PROPERTY, false)); meta.put(sc_key_daemon, getMeta(sc_key_daemon, SERVER_PROPERTY, false)); meta.put(sc_key_address, getMeta(sc_key_address, SERVER_PROPERTY, null)); meta.put(sc_key_port, getMeta(sc_key_port, 0, 9001, 0, 65535)); meta.put(sc_key_http_port, getMeta(sc_key_http_port, 0, 80, 0, 65535)); meta.put(sc_key_max_connections, getMeta(sc_key_max_connections, 0, 100, 1, 10000)); meta.put(sc_key_max_databases, getMeta(sc_key_max_databases, 0, 10, 1, 1000)); // prefixes.add(sc_key_database); prefixes.add(sc_key_dbname); prefixes.add(sc_key_system); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/WebServer.java0000644000175000017500000002454412007547404023027 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import org.hsqldb.lib.FileUtil; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.resources.BundleHandler; // fredt@users 20020215 - patch 1.7.0 by fredt // method rorganised to use new HsqlServerProperties class // unsaved@users 20021113 - patch 1.7.2 - SSL support // boucherb@users 20030510 - patch 1.7.2 - SSL support moved to factory interface // boucherb@users 20030510 - patch 1.7.2 - moved all common code to Server // boucherb@users 20030510 - patch 1.7.2 - general lint removal /** * The HSQLDB HTTP protocol network database server.

              * * WebServer has two distinct functions:

              * * The primary function is to allow client/server access to HSQLDB databases * via the HTTP protocol. This protocol is less efficient than the HSQL * protocol used by the Server class and should be used only in situations * where sandboxes or firewalls between the client and the server do not * allow the use of the HSQL protocol. One example is client/server access by * an applet running in browsers on remote hosts and accessing the database * engine on the HTTP server from which the applet originated. From version * 1.7.2, HTTP database connections are persistent and support transactions. * Similar to HSQL connections, they should be explicitly closed to free the * server resources.

              * * The secondary function of WebServer is to act as a simple general purpose * HTTP server. It is aimed to support the minimum requirements set out by * the HTTP/1.0 standard. The HEAD and GET methods can be used to query and * retreive static files from the HTTP server.

              * * Both the database server and HTTP server functions of WebServer can be * configured with the webserver.properties file. It contains entries for the * database server similar to those for the HSQL protocol Server class. In * addition, a list mapping different file endings to their mime types may be * included in this file. (fredt@users)

              * * From the command line, the options are as follows:

              *

               * +-----------------+-------------+----------+------------------------------+
               * |    OPTION       |    TYPE     | DEFAULT  |         DESCRIPTION          |
               * +-----------------+-------------+----------+------------------------------|
               * | --help          |             |          | prints this message          |
               * | --address       | name|number | any      | server inet address          |
               * | --port          | number      | 80       | port at which server listens |
               * | --database.i    | [type]spec  | 0=test   | path of database i           |
               * | --dbname.i      | alias       |          | url alias for database i     |
               * | --silent        | true|false  | true     | false => display all queries |
               * | --trace         | true|false  | false    | display JDBC trace messages  |
               * | --no_system_exit| true|false  | false    | do not issue System.exit()   |
               * +-----------------+-------------+----------+------------------------------+
               * 
              * * Example of the webserver.properties file: * *
               * server.port=80
               * server.database.0=test
               * server.dbname.0=...
               * ...
               * server.database.n=...
               * server.dbname.n=...
               * server.silent=true
               *
               * .htm=text/html
               * .html=text/html
               * .txt=text/plain
               * .gif=image/gif
               * .class=application/octet-stream
               * .jpg=image/jpeg
               * .jgep=image/jpeg
               * .zip=application/x-zip-compressed
               * 
              * *
                *
              • For server.root, use '/' as the separator, even for DOS/Windows. *
              • File extensions for mime types must be lowercase and start with '.' *
              * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.7.2 * @since 1.7.2 */ public class WebServer extends Server { /** * Handle to resource bundle providing i18n for things like * HTTP error pages. */ static int webBundleHandle = BundleHandler.getBundleHandle("webserver", null); public WebServer() { super(ServerConstants.SC_PROTOCOL_HTTP); } /** * Starts a new WebServer. * * @param args the "command line" parameters with which to start * the WebServer. "-?" will cause the command line arguments * help to be printed to the standard output */ public static void main(String[] args) { HsqlProperties argProps = null; argProps = HsqlProperties.argArrayToProps(args, ServerProperties.sc_key_prefix); String[] errors = argProps.getErrorKeys(); if (errors.length != 0) { System.out.println("no value for argument:" + errors[0]); printHelp("webserver.help"); return; } String propsPath = argProps.getProperty(ServerProperties.sc_key_props); String propsExtension = ""; if (propsPath == null) { propsPath = "webserver"; propsExtension = ".properties"; } propsPath = FileUtil.getFileUtil().canonicalOrAbsolutePath(propsPath); ServerProperties fileProps = ServerConfiguration.getPropertiesFromFile( ServerConstants.SC_PROTOCOL_HTTP, propsPath, propsExtension); ServerProperties props = fileProps == null ? new ServerProperties(ServerConstants.SC_PROTOCOL_HTTP) : fileProps; props.addProperties(argProps); ServerConfiguration.translateDefaultDatabaseProperty(props); // Standard behaviour when started from the command line // is to halt the VM when the server shuts down. This may, of // course, be overridden by whatever, if any, security policy // is in place. ServerConfiguration.translateDefaultNoSystemExitProperty(props); ServerConfiguration.translateAddressProperty(props); // finished setting up properties; Server server = new WebServer(); try { server.setProperties(props); } catch (Exception e) { server.printError("Failed to set properties"); server.printStackTrace(e); return; } // now messages go to the channel specified in properties server.print("Startup sequence initiated from main() method"); if (fileProps != null) { server.print("Loaded properties from [" + propsPath + ".properties]"); } else { server.print("Could not load properties from file"); server.print("Using cli/default properties only"); } server.start(); } /** * Retrieves the name of the web page served when no page is specified. * This attribute is relevant only when server protocol is HTTP(S). * * @return the name of the web page served when no page is specified * * @jmx.managed-attribute * access="read-write" * description="Used when server protocol is HTTP(S)" */ public String getDefaultWebPage() { return serverProperties.getProperty( ServerProperties.sc_key_web_default_page); } /** * Retrieves a String object describing the command line and * properties options for this Server. * * @return the command line and properties options help for this Server */ public String getHelpString() { return BundleHandler.getString(serverBundleHandle, "webserver.help"); } /** * Retrieves this server's product name.

              * * Typically, this will be something like: "HSQLDB xxx server". * * @return the product name of this server * * @jmx.managed-attribute * access="read-only" * description="Of Server" */ public String getProductName() { return "HSQLDB web server"; } /** * Retrieves a string respresentaion of the network protocol * this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'. * * @return string respresentation of this server's protocol * * @jmx.managed-attribute * access="read-only" * description="Used to handle connections" */ public String getProtocol() { return isTls() ? "HTTPS" : "HTTP"; } /** * Retrieves the root context (directory) from which web content * is served. This property is relevant only when the server * protocol is HTTP(S). Although unlikely, it may be that in the future * other contexts, such as jar urls may be supported, so that pages can * be served from the contents of a jar or from the JVM class path. * * @return the root context (directory) from which web content is served * * @jmx.managed-attribute * access="read-write" * description="Context (directory)" */ public String getWebRoot() { return serverProperties.getProperty(ServerProperties.sc_key_web_root); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/package.html0000644000175000017500000000010712007547404022526 0ustar renerene The HyperSQL network listener classes. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/HsqlSocketFactory.java0000644000175000017500000001567512007547404024540 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * Base class for producing the Socket objects used by HSQLDB. * * @author Blaine Simpson (blaine dot simpson at admc dot com) * @author boucherb@users * @version 1.7.2 * @since 1.7.2 */ public class HsqlSocketFactory { // ----------------------------- static members --------------------------------- private static HsqlSocketFactory plainImpl; private static HsqlSocketFactory sslImpl; // ------------------------------ constructors --------------------------------- /** * External construction disabled. New factory instances are retreived * through the newHsqlSocketFactory method instead. */ protected HsqlSocketFactory() throws Exception {} // ------------------------- factory builder method ---------------------------- /** * Retrieves an HsqlSocketFactory whose subclass and attributes are * determined by the specified argument, tls. * * @param tls whether to retrieve a factory producing SSL sockets * @throws Exception if the new factory cannot be constructed or is * of the wrong type * @return a new factory */ public static HsqlSocketFactory getInstance(boolean tls) throws Exception { return tls ? getSSLImpl() : getPlainImpl(); } // -------------------------- public instance methods -------------------------- public void configureSocket(Socket socket) { // default: do nothing } /** * Returns a server socket bound to the specified port. * The socket is configured with the socket options * given to this factory. * * @return the ServerSocket * @param port the port to which to bind the ServerSocket * @throws Exception if a network error occurs */ public ServerSocket createServerSocket(int port) throws Exception { return new ServerSocket(port); } /** * Returns a server socket bound to the specified port. * The socket is configured with the socket options * given to this factory. * * @return the ServerSocket * @param port the port to which to bind the ServerSocket * @throws Exception if a network error occurs */ public ServerSocket createServerSocket(int port, String address) throws Exception { return new ServerSocket(port, 128, InetAddress.getByName(address)); } /** * Creates a socket and connects it to the specified remote host at the * specified remote port. This socket is configured using the socket options * established for this factory. * * @return the socket * @param host the server host * @param port the server port * @throws Exception if a network error occurs */ public Socket createSocket(String host, int port) throws Exception { return new Socket(host, port); } /** * Retrieves whether this factory produces secure sockets. * * @return true if this factory produces secure sockets */ public boolean isSecure() { return false; } // ------------------------ static utility methods ----------------------------- private static HsqlSocketFactory getPlainImpl() throws Exception { synchronized (HsqlSocketFactory.class) { if (plainImpl == null) { plainImpl = new HsqlSocketFactory(); } } return plainImpl; } private static HsqlSocketFactory getSSLImpl() throws Exception { synchronized (HsqlSocketFactory.class) { if (sslImpl == null) { sslImpl = newFactory("org.hsqldb.server.HsqlSocketFactorySecure"); } } return sslImpl; } /** * Retrieves a new HsqlSocketFactory whose class * is determined by the implClass argument. The basic contract here * is that implementations constructed by this method should return * true upon calling isSecure() iff they actually create secure sockets. * There is no way to guarantee this directly here, so it is simply * trusted that an implementation is secure if it returns true * for calls to isSecure(); * * @return a new secure socket factory * @param implClass the fully qaulified name of the desired * class to construct * @throws Exception if a new secure socket factory cannot * be constructed */ private static HsqlSocketFactory newFactory(String implClass) throws Exception { Class clazz; Constructor ctor; Class[] ctorParm; Object[] ctorArg; Object factory; clazz = Class.forName(implClass); ctorParm = new Class[0]; // protected constructor ctor = clazz.getDeclaredConstructor(ctorParm); ctorArg = new Object[0]; try { factory = ctor.newInstance(ctorArg); } catch (InvocationTargetException e) { Throwable t = e.getTargetException(); throw (t instanceof Exception) ? ((Exception) t) : new RuntimeException( t.toString()); } return (HsqlSocketFactory) factory; } // -- } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/WebServerConnection.java0000644000175000017500000005232112007547404025041 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.Socket; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import org.hsqldb.DatabaseManager; import org.hsqldb.HsqlException; import org.hsqldb.Session; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.DataOutputStream; import org.hsqldb.lib.InOutUtil; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.resources.BundleHandler; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.rowio.RowInputBinary; import org.hsqldb.rowio.RowOutputBinary; import org.hsqldb.lib.HsqlByteArrayOutputStream; // fredt@users 20021002 - patch 1.7.1 - changed notification method // unsaved@users 20021113 - patch 1.7.2 - SSL support // boucherb@users 20030510 - patch 1.7.2 - SSL support moved to factory interface // boucherb@users 20030510 - patch 1.7.2 - general lint removal // boucherb@users 20030514 - patch 1.7.2 - localized error responses // fredt@users 20030628 - patch 1.7.2 - new protocol, persistent sessions /** * A web server connection is a transient object that lasts for the duration * of the SQL call and its result. This class uses the notification * mechanism in WebServer to allow cleanup after a SHUTDOWN.

              * * The POST method is used for login and subsequent remote calls. In 1.7.2 * The initial login establishes a persistent Session and returns its handle * to the client. Subsequent calls are executed in the context of this * session.

              * (fredt@users) * * Rewritten in version HSQLDB 1.7.2, based on original Hypersonic code. * * @author Thomas Mueller (Hypersonic SQL Group) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since Hypersonic SQL */ class WebServerConnection implements Runnable { static final String ENCODING = "ISO-8859-1"; private Charset iso = Charset.forName(ENCODING); private CharsetDecoder iso_8859_1_decoder = iso.newDecoder(); private Socket socket; private WebServer server; private static final int REQUEST_TYPE_BAD = 0; private static final int REQUEST_TYPE_GET = 1; private static final int REQUEST_TYPE_HEAD = 2; private static final int REQUEST_TYPE_POST = 3; private static final String HEADER_OK = "HTTP/1.0 200 OK"; private static final String HEADER_BAD_REQUEST = "HTTP/1.0 400 Bad Request"; private static final String HEADER_NOT_FOUND = "HTTP/1.0 404 Not Found"; private static final String HEADER_FORBIDDEN = "HTTP/1.0 403 Forbidden"; static final int BUFFER_SIZE = 256; final byte[] mainBuffer = new byte[BUFFER_SIZE]; private RowOutputBinary rowOut = new RowOutputBinary(mainBuffer); private RowInputBinary rowIn = new RowInputBinary(rowOut); // static byte[] BYTES_GET; static byte[] BYTES_HEAD; static byte[] BYTES_POST; static byte[] BYTES_CONTENT; static { try { BYTES_GET = "GET".getBytes("ISO-8859-1"); BYTES_HEAD = "HEAD".getBytes("ISO-8859-1"); BYTES_POST = "POST".getBytes("ISO-8859-1"); BYTES_CONTENT = "Content-Length: ".getBytes("ISO-8859-1"); } catch (UnsupportedEncodingException e) { Error.runtimeError(ErrorCode.U_S0500, "RowOutputTextLog"); } } static final byte[] BYTES_WHITESPACE = new byte[] { (byte) ' ', (byte) '\t' }; // default mime type mappings private static final int hnd_content_types = BundleHandler.getBundleHandle("content-types", null); /** * Creates a new WebServerConnection to the specified WebServer on the * specified socket. * * @param socket the network socket on which WebServer communication * takes place * @param server the WebServer instance to which the object * represents a connection */ WebServerConnection(Socket socket, WebServer server) { this.server = server; this.socket = socket; } /** * Retrieves a best-guess mime-type string using the file extension * of the name argument. * * @return a best-guess mime-type string using the file extension * of the name argument. */ private String getMimeTypeString(String name) { int pos; String key; String mimeType; if (name == null) { return ServerConstants.SC_DEFAULT_WEB_MIME; } pos = name.lastIndexOf('.'); key = null; mimeType = null; // first search user-specified mapping if (pos >= 0) { key = name.substring(pos).toLowerCase(); mimeType = server.serverProperties.getProperty(key); } // if not found, search default mapping if (mimeType == null && key.length() > 1) { mimeType = BundleHandler.getString(hnd_content_types, key.substring(1)); } return mimeType == null ? ServerConstants.SC_DEFAULT_WEB_MIME : mimeType; } /** * Causes this WebServerConnection to process its HTTP request * in a blocking fashion until the request is fully processed * or an exception occurs internally. * * This method reads the Request line then delegates action to subroutines. */ public void run() { DataInputStream inStream = null; try { inStream = new DataInputStream(socket.getInputStream()); int count; String name = null; int method = REQUEST_TYPE_BAD; // read line, ignoring any leading blank lines (there shouldn't be any, but just to be safe) do { count = InOutUtil.readLine(inStream, rowOut); if (count == 0) { throw new Exception(); } } while (count < 2); byte[] byteArray = rowOut.toByteArray(); int offset = rowOut.size() - count; if (ArrayUtil.containsAt(byteArray, offset, BYTES_POST)) { method = REQUEST_TYPE_POST; offset += BYTES_POST.length; } else if (ArrayUtil.containsAt(byteArray, offset, BYTES_GET)) { method = REQUEST_TYPE_GET; offset += BYTES_GET.length; } else if (ArrayUtil.containsAt(byteArray, offset, BYTES_HEAD)) { method = REQUEST_TYPE_HEAD; offset += BYTES_HEAD.length; } else { method = REQUEST_TYPE_BAD; } count = ArrayUtil.countStartElementsAt(byteArray, offset, BYTES_WHITESPACE); if (count == 0) { method = REQUEST_TYPE_BAD; } offset += count; count = ArrayUtil.countNonStartElementsAt(byteArray, offset, BYTES_WHITESPACE); name = new String(byteArray, offset, count, ENCODING); switch (method) { case REQUEST_TYPE_POST : processPost(inStream, name); break; case REQUEST_TYPE_BAD : processError(REQUEST_TYPE_BAD); break; case REQUEST_TYPE_GET : processGet(name, true); break; case REQUEST_TYPE_HEAD : processGet(name, false); break; } } catch (Exception e) { server.printStackTrace(e); } finally { try { if (inStream != null) { inStream.close(); } socket.close(); } catch (IOException ioe) { server.printStackTrace(ioe); } } } /** * POST is used only for database access. So we can assume the strings * are those generated by ClientConnectionHTTP */ private void processPost(InputStream inStream, String name) throws IOException { try { // In run() the first line of the requestHeader was already read into rowOut (for a POST // this looks something like: 'POST / HTTP/1.1') // // Now let's read the rest of the requestHeader until (including) the blank line that // denotes the end of the requestHeader block (We can not assume a fixed number of // lines since proxy's might add stuff, nor should we assume a certain order of the // requestHeader lines) int readLineLength; do { readLineLength = InOutUtil.readLine(inStream, rowOut); } while (readLineLength > 2); // Blank line is usually 2 bytes ('\r\n') // rowOut now contains the entire requestHeader as bytes. It is converted here // into a java String, so that we can easily do some error checking on it and // inspect it during debugging String requestHeader = iso_8859_1_decoder.decode( ByteBuffer.wrap(rowOut.toByteArray())).toString(); // System.out.println(requestHeader); //For debugging // Throw an error if the Content-Type is something other than an what // ClientConnectionHTTP is supposed to send if (requestHeader.indexOf("Content-Type: application/octet-stream") < 0) { throw new Exception(); } //TODO: Determine presence of Keep-Alive in requestHeader and act upon it accordingly. // if (requestHeader.indexOf("Connection: keep-alive") >= 0) { } } catch (Exception e) { processError(HttpURLConnection.HTTP_BAD_REQUEST); return; } // inStream's read-pointer will now be positioned at the beginning of the request's pay-load processQuery(inStream); } /** * Processes a database query in HSQL protocol that has been * tunneled over HTTP protocol. * * @param inStream the incoming byte stream representing the HSQL protocol * database query */ void processQuery(InputStream inStream) { try { DataInputStream dataIn = new DataInputStream(inStream); int databaseID = dataIn.readInt(); long sessionID = dataIn.readLong(); int mode = dataIn.readByte(); Session session = DatabaseManager.getSession(databaseID, sessionID); Result resultIn = Result.newResult(session, mode, dataIn, rowIn); resultIn.setDatabaseId(databaseID); resultIn.setSessionId(sessionID); // Result resultOut; if (resultIn.getType() == ResultConstants.CONNECT) { try { String databaseName = resultIn.getDatabaseName(); int dbIndex = server.getDBIndex(databaseName); int dbID = server.dbID[dbIndex]; session = DatabaseManager.newSession(dbID, resultIn.getMainString(), resultIn.getSubString(), resultIn.getZoneString(), resultIn.getUpdateCount()); resultIn.readAdditionalResults(session, dataIn, rowIn); resultOut = Result.newConnectionAcknowledgeResponse( session.getDatabase(), session.getId(), dbID); } catch (HsqlException e) { resultOut = Result.newErrorResult(e); } catch (RuntimeException e) { resultOut = Result.newErrorResult(e); } } else { int dbID = resultIn.getDatabaseId(); if (session == null) { resultOut = Result.newErrorResult( Error.error(ErrorCode.SERVER_DATABASE_DISCONNECTED)); } else { resultIn.setSession(session); resultIn.readLobResults(session, dataIn, rowIn); resultOut = session.execute(resultIn); } } int type = resultIn.getType(); // patched 2.2.9 by Aart 2012-05-15: Make sure 'Content-length' is correctly set if (type == ResultConstants.DISCONNECT || type == ResultConstants.RESETSESSION) { DataOutputStream dataOut = new DataOutputStream(socket.getOutputStream()); // Upon DISCONNECT 6 bytes are read by the ClientConnectionHTTP": mode (1 byte), a length (int), and an 'additional results (1 byte) String header = getHead(HEADER_OK, false, "application/octet-stream", 6); dataOut.write(header.getBytes(ENCODING)); dataOut.writeByte(ResultConstants.DISCONNECT); // Mode dataOut.writeInt(4); //Length Int of first result is always read! Minvalue is 4: It is the number of bytes of the current result (it includes the length of this Int itself) dataOut.writeByte(ResultConstants.NONE); // No Additional results dataOut.close(); return; } // TODO: when doing Keep-Alive connections, try to retain buffer HsqlByteArrayOutputStream memStream = new HsqlByteArrayOutputStream(); DataOutputStream tempOutput = new DataOutputStream(memStream); resultOut.write(session, tempOutput, rowOut); DataOutputStream dataOut = new DataOutputStream(socket.getOutputStream()); // Write HTTP response header String header = getHead(HEADER_OK, false, "application/octet-stream", memStream.size()); dataOut.write(header.getBytes(ENCODING)); // Write actual pay-load to response memStream.writeTo(dataOut); dataOut.close(); // patch-end 2.2.9 by Aart 2012-05-15 } catch (Exception e) { server.printStackTrace(e); } } /** * Processes an HTTP GET request * * @param name the name of the content to get * @param send whether to send the content as well, or just the header */ private void processGet(String name, boolean send) { try { String hdr; OutputStream os; InputStream is; int b; if (name.endsWith("/")) { name += server.getDefaultWebPage(); } // traversing up the directory structure is forbidden. if (name.indexOf("..") != -1) { processError(HttpURLConnection.HTTP_FORBIDDEN); return; } name = server.getWebRoot() + name; if (File.separatorChar != '/') { name = name.replace('/', File.separatorChar); } is = null; server.printWithThread("GET " + name); try { File file = new File(name); is = new DataInputStream(new FileInputStream(file)); hdr = getHead(HEADER_OK, true, getMimeTypeString(name), (int) file.length()); } catch (IOException e) { processError(HttpURLConnection.HTTP_NOT_FOUND); if (is != null) { is.close(); } return; } os = new BufferedOutputStream(socket.getOutputStream()); os.write(hdr.getBytes(ENCODING)); if (send) { while ((b = is.read()) != -1) { os.write(b); } } os.flush(); os.close(); is.close(); } catch (Exception e) { server.printError("processGet: " + e.toString()); server.printStackTrace(e); } } /** * Retrieves an HTTP protocol header given the supplied arguments. * * @param responseCodeString the HTTP response code * @param addInfo true if additional header info is to be added * @param mimeType the Content-Type field value * @param length the Content-Length field value * @return an HTTP protocol header */ String getHead(String responseCodeString, boolean addInfo, String mimeType, int length) { StringBuffer sb = new StringBuffer(128); sb.append(responseCodeString).append("\r\n"); if (addInfo) { sb.append("Allow: GET, HEAD, POST\nMIME-Version: 1.0\r\n"); sb.append("Server: ").append( HsqlDatabaseProperties.PRODUCT_NAME).append("\r\n"); } if (mimeType != null) { sb.append("Cache-Control: no-cache\r\n"); // DB-traffic should not be cached by proxy's sb.append("Content-Type: ").append(mimeType).append("\r\n"); //sb.append("Content-Length: ").append(length).append("\r\n"); } sb.append("\r\n"); return sb.toString(); } /** * Processess an HTTP error condition, sending an error response to * the client. * * @param code the error condition code */ private void processError(int code) { String msg; server.printWithThread("processError " + code); switch (code) { case HttpURLConnection.HTTP_BAD_REQUEST : msg = getHead(HEADER_BAD_REQUEST, false, null, 0); msg += BundleHandler.getString(WebServer.webBundleHandle, "BAD_REQUEST"); break; case HttpURLConnection.HTTP_FORBIDDEN : msg = getHead(HEADER_FORBIDDEN, false, null, 0); msg += BundleHandler.getString(WebServer.webBundleHandle, "FORBIDDEN"); break; case HttpURLConnection.HTTP_NOT_FOUND : default : msg = getHead(HEADER_NOT_FOUND, false, null, 0); msg += BundleHandler.getString(WebServer.webBundleHandle, "NOT_FOUND"); break; } try { OutputStream os = new BufferedOutputStream(socket.getOutputStream()); os.write(msg.getBytes(ENCODING)); os.flush(); os.close(); } catch (Exception e) { server.printError("processError: " + e.toString()); server.printStackTrace(e); } } /** * Retrieves the thread name to be used when * this object is the Runnable object of a Thread. * * @return the thread name to be used when * this object is the Runnable object of a Thread. */ String getConnectionThreadName() { return "HSQLDB HTTP Connection @" + Integer.toString(hashCode(), 16); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/ServerConfiguration.java0000644000175000017500000002420412007547404025112 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.net.InetAddress; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.StringUtil; import org.hsqldb.persist.HsqlProperties; /** * @todo: move to here from Server and WebServer the remaining extraneous code * dealing primarily with reading/setting properties from files, etc. */ /** * Assists with Server and WebServer configuration tasks. * * @author boucherb@users * @version 2.2.7 * @since 1.7.2 */ public final class ServerConfiguration implements ServerConstants { private ServerConfiguration() {} /** * Retrieves the default port that a Server will try to use in the * abscence of an explicitly specified one, given the specified * value for whether or not to use secure sockets. * * @param protocol the protcol specifier code of the Server * @param isTls if true, retrieve the default port when using secure * sockets, else the default port when using plain sockets * @return the default port used in the abscence of an explicit * specification. * */ public static int getDefaultPort(int protocol, boolean isTls) { switch (protocol) { case SC_PROTOCOL_HSQL : { return isTls ? SC_DEFAULT_HSQLS_SERVER_PORT : SC_DEFAULT_HSQL_SERVER_PORT; } case SC_PROTOCOL_HTTP : { return isTls ? SC_DEFAULT_HTTPS_SERVER_PORT : SC_DEFAULT_HTTP_SERVER_PORT; } case SC_PROTOCOL_BER : { return isTls ? -1 : SC_DEFAULT_BER_SERVER_PORT; } default : { return -1; } } } /** * Retrieves a new HsqlProperties object, if possible, loaded from the * specified file. * * @param path the file's path, without the .properties extention * (which is added automatically) * @return a new properties object loaded from the specified file */ public static ServerProperties getPropertiesFromFile(int protocol, String path, String extension) { boolean result; if (StringUtil.isEmpty(path)) { return null; } ServerProperties p = new ServerProperties(protocol, path, extension); try { result = p.load(); } catch (Exception e) { return null; } return result ? p : null; } /** * Retrieves an array of Strings naming the distinct, known to be valid local * InetAddress names for this machine. The process is to collect and * return the union of the following sets: * *

                *
              1. InetAddress.getAllByName(InetAddress.getLocalHost().getHostAddress()) *
              2. InetAddress.getAllByName(InetAddress.getLocalHost().getHostName()) *
              3. InetAddress.getAllByName(InetAddress.getByName(null).getHostAddress()) *
              4. InetAddress.getAllByName(InetAddress.getByName(null).getHostName()) *
              5. InetAddress.getByName("loopback").getHostAddress() *
              6. InetAddress.getByName("loopback").getHostname() *
              * * @return the distinct, known to be valid local * InetAddress names for this machine */ public static String[] listLocalInetAddressNames() { InetAddress addr; InetAddress[] addrs; HashSet set; set = new HashSet(); try { addr = InetAddress.getLocalHost(); addrs = InetAddress.getAllByName(addr.getHostAddress()); for (int i = 0; i < addrs.length; i++) { set.add(addrs[i].getHostAddress()); set.add(addrs[i].getHostName()); } addrs = InetAddress.getAllByName(addr.getHostName()); for (int i = 0; i < addrs.length; i++) { set.add(addrs[i].getHostAddress()); set.add(addrs[i].getHostName()); } } catch (Exception e) {} try { addr = InetAddress.getByName(null); addrs = InetAddress.getAllByName(addr.getHostAddress()); for (int i = 0; i < addrs.length; i++) { set.add(addrs[i].getHostAddress()); set.add(addrs[i].getHostName()); } addrs = InetAddress.getAllByName(addr.getHostName()); for (int i = 0; i < addrs.length; i++) { set.add(addrs[i].getHostAddress()); set.add(addrs[i].getHostName()); } } catch (Exception e) {} try { set.add(InetAddress.getByName("loopback").getHostAddress()); set.add(InetAddress.getByName("loopback").getHostName()); } catch (Exception e) {} String[] array = new String[set.size()]; set.toArray(array); return array; } /** * Retrieves a new default properties object for a server of the * specified protocol * * @return a new default properties object */ public static ServerProperties newDefaultProperties(int protocol) { ServerProperties p = new ServerProperties(protocol); p.setProperty(ServerProperties.sc_key_autorestart_server, SC_DEFAULT_SERVER_AUTORESTART); p.setProperty(ServerProperties.sc_key_address, SC_DEFAULT_ADDRESS); p.setProperty(ServerProperties.sc_key_no_system_exit, SC_DEFAULT_NO_SYSTEM_EXIT); p.setProperty(ServerProperties.sc_key_max_databases, SC_DEFAULT_MAX_DATABASES); p.setProperty(ServerProperties.sc_key_silent, SC_DEFAULT_SILENT); p.setProperty(ServerProperties.sc_key_tls, SC_DEFAULT_TLS); p.setProperty(ServerProperties.sc_key_trace, SC_DEFAULT_TRACE); p.setProperty(ServerProperties.sc_key_web_default_page, SC_DEFAULT_WEB_PAGE); p.setProperty(ServerProperties.sc_key_web_root, SC_DEFAULT_WEB_ROOT); // Purposefully do not set a default Port because the default is // derived from TLS, which is runtime-configurable. // Things work very well if we leave it unset here and use the // getDefaultPort() method above to get the correct value. return p; } /** * Translates null or zero length value for address key to the * special value ServerConstants.SC_DEFAULT_ADDRESS which causes * ServerSockets to be constructed without specifying an InetAddress. * * @param p The properties object upon which to perform the translation */ public static void translateAddressProperty(HsqlProperties p) { if (p == null) { return; } String address = p.getProperty(ServerProperties.sc_key_address); if (StringUtil.isEmpty(address)) { p.setProperty(ServerProperties.sc_key_address, SC_DEFAULT_ADDRESS); } } /** * Translates the legacy default database form: database=... * to the 1.7.2 form: database.0=... * * @param p The properties object upon which to perform the translation */ public static void translateDefaultDatabaseProperty(HsqlProperties p) { if (p == null) { return; } if (!p.isPropertyTrue(ServerProperties.sc_key_remote_open_db)) { if (p.getProperty(ServerProperties.sc_key_database + "." + 0) == null) { String defaultdb = p.getProperty(ServerProperties.sc_key_database); if (defaultdb == null) { defaultdb = SC_DEFAULT_DATABASE; } else { p.removeProperty(ServerProperties.sc_key_database); } p.setProperty(ServerProperties.sc_key_database + ".0", defaultdb); p.setProperty(ServerProperties.sc_key_dbname + ".0", ""); } if (p.getProperty(ServerProperties.sc_key_dbname + "." + 0) == null) { p.setProperty(ServerProperties.sc_key_dbname + ".0", ""); } } } /** * Tranlates unspecified no_system_exit property to false, the default * typically required when a Server is started from the command line. * * @param p The properties object upon which to perform the translation */ public static void translateDefaultNoSystemExitProperty(HsqlProperties p) { if (p == null) { return; } p.setPropertyIfNotExists(ServerProperties.sc_key_no_system_exit, "false"); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/ServerConnection.java0000644000175000017500000023320012007547404024400 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.server; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.net.Socket; import java.net.SocketException; import java.util.concurrent.atomic.AtomicInteger; import org.hsqldb.ClientConnection; import org.hsqldb.ColumnBase; import org.hsqldb.DatabaseManager; import org.hsqldb.HsqlException; import org.hsqldb.Session; import org.hsqldb.StatementTypes; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.DataOutputStream; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.resources.BundleHandler; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.result.ResultMetaData; import org.hsqldb.result.ResultProperties; import org.hsqldb.rowio.RowInputBinary; import org.hsqldb.rowio.RowOutputBinary; import org.hsqldb.rowio.RowOutputInterface; import org.hsqldb.types.Type; // fredt@users 20020215 - patch 461556 by paul-h@users - server factory // fredt@users 20020424 - patch 1.7.0 by fredt - shutdown without exit // fredt@users 20021002 - patch 1.7.1 by fredt - changed notification method // fredt@users 20030618 - patch 1.7.2 by fredt - changed read/write methods // fredt@users 20091013 - move set session to null suggested by Otto Joyner /** * All ServerConnection objects are listed in a Set in server * and removed by this class when closed.

              * * When the database or server is shutdown, the signalClose() method is called * for all current ServerConnection instances. This will call the private * close() method unless the ServerConnection thread itself has caused the * shutdown. In this case, the keepAlive flag is set to false, allowing the * thread to terminate once it has returned the result of the operation to * the client. * (fredt@users)

              * * Rewritten in HSQLDB version 1.7.2, based on original Hypersonic code. * * @author Thomas Mueller (Hypersonic SQL Group) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since Hypersonic SQL */ class ServerConnection implements Runnable { boolean keepAlive; private String user; int dbID; int dbIndex; private volatile Session session; private Socket socket; private Server server; private DataInputStream dataInput; private DataOutputStream dataOutput; private int mThread; static final int BUFFER_SIZE = 0x1000; final byte[] mainBuffer = new byte[BUFFER_SIZE]; RowOutputInterface rowOut; RowInputBinary rowIn; Thread runnerThread; // private static AtomicInteger mCurrentThread = new AtomicInteger(0); // protected static String TEXTBANNER_PART1 = null; protected static String TEXTBANNER_PART2 = null; static { int serverBundleHandle = BundleHandler.getBundleHandle("org_hsqldb_Server_messages", null); if (serverBundleHandle < 0) { throw new RuntimeException( "MISSING Resource Bundle. See source code"); // This will be caught before prod release. // Not necessary to localize message. } TEXTBANNER_PART1 = BundleHandler.getString(serverBundleHandle, "textbanner.part1"); TEXTBANNER_PART2 = BundleHandler.getString(serverBundleHandle, "textbanner.part2"); if (TEXTBANNER_PART1 == null || TEXTBANNER_PART2 == null) { throw new RuntimeException( "MISSING Resource Bundle msg definition. See source code"); // This will be caught before prod release. // Not necessary to localize message. } } /** * Creates a new ServerConnection to the specified Server on the * specified socket. * * @param socket the network socket on which Server communication * takes place * @param server the Server instance to which the object * represents a connection */ ServerConnection(Socket socket, Server server) { RowOutputBinary rowOutTemp = new RowOutputBinary(mainBuffer); rowIn = new RowInputBinary(rowOutTemp); rowOut = rowOutTemp; // Thread runnerThread; this.socket = socket; this.server = server; mThread = mCurrentThread.getAndIncrement(); synchronized (server.serverConnSet) { server.serverConnSet.add(this); } } /** * Signals this object to close, including exiting the thread running * the request handling loop */ void signalClose() { keepAlive = false; if (!Thread.currentThread().equals(runnerThread)) { close(); } } /** * Closes this connection. */ private void close() { if (session != null) { session.close(); session = null; } // fredt@user - closing the socket is to stop this thread synchronized (this) { try { if (socket != null) { socket.close(); socket = null; } } catch (IOException e) {} socket = null; } synchronized (server.serverConnSet) { server.serverConnSet.remove(this); } try { runnerThread.setContextClassLoader(null); } catch (Throwable t) {} } /** * Initializes this connection. *

              * Will return (not throw) if fail to initialize the connection. *

              */ private void init() { runnerThread = Thread.currentThread(); keepAlive = true; try { socket.setTcpNoDelay(true); dataInput = new DataInputStream( new BufferedInputStream(socket.getInputStream())); dataOutput = new DataOutputStream(socket.getOutputStream()); int firstInt = handshake(); switch (streamProtocol) { case HSQL_STREAM_PROTOCOL : if (firstInt != ClientConnection .NETWORK_COMPATIBILITY_VERSION_INT) { if (firstInt == -1900000) { firstInt = -2000000; } String verString = ClientConnection.toNetCompVersionString(firstInt); throw Error.error( null, ErrorCode.SERVER_VERSIONS_INCOMPATIBLE, 0, new String[] { verString, HsqlDatabaseProperties.hsqldb_version }); } Result resultIn = Result.newResult(dataInput, rowIn); resultIn.readAdditionalResults(session, dataInput, rowIn); Result resultOut; resultOut = setDatabase(resultIn); resultOut.write(session, dataOutput, rowOut); break; case ODBC_STREAM_PROTOCOL : odbcConnect(firstInt); break; default : // Protocol detection failures should already have been // handled. keepAlive = false; } } catch (Exception e) { // Only "unexpected" failures are caught here. // Expected failures will have been handled (by sending feedback // to user-- with an output Result for normal protocols), then // continuing. StringBuffer sb = new StringBuffer(mThread + ":Failed to connect client."); if (user != null) { sb.append(" User '" + user + "'."); } server.printWithThread(sb.toString() + " Stack trace follows."); server.printStackTrace(e); } } private static class CleanExit extends Exception {} private static class ClientFailure extends Exception { private String clientMessage = null; public ClientFailure(String ourMessage, String clientMessage) { super(ourMessage); this.clientMessage = clientMessage; } public String getClientMessage() { return clientMessage; } } private CleanExit cleanExit = new CleanExit(); private void receiveResult(int resultMode) throws CleanExit, IOException { boolean terminate = false; Result resultIn = Result.newResult(session, resultMode, dataInput, rowIn); resultIn.readLobResults(session, dataInput, rowIn); server.printRequest(mThread, resultIn); Result resultOut = null; switch (resultIn.getType()) { case ResultConstants.CONNECT : { resultOut = setDatabase(resultIn); break; } case ResultConstants.DISCONNECT : { resultOut = Result.updateZeroResult; terminate = true; break; } case ResultConstants.RESETSESSION : { session.resetSession(); resultOut = Result.updateZeroResult; break; } case ResultConstants.EXECUTE_INVALID : { resultOut = Result.newErrorResult(Error.error(ErrorCode.X_07502)); break; } default : { resultOut = session.execute(resultIn); break; } } resultOut.write(session, dataOutput, rowOut); rowOut.reset(mainBuffer); rowIn.resetRow(mainBuffer.length); if (terminate) { throw cleanExit; } } private OdbcPacketOutputStream outPacket = null; private void receiveOdbcPacket(char inC) throws IOException, CleanExit { /* * The driver's notion of the transaction state, I (no) or T (yes), * corresponds precisely inversely to our server-side Session * autoCommit setting. * If the user/app runs in non-autocommit mode and says to run a * COMMIT followed by an INSERT, the driver will handle the user/app's * facade of autocommittedness, and will send the server
                *
              1. COMMIT (which will cause us to set session.setAutoCommit(true) *
              2. BEGIN (which will cause us to set session.setAutoCommit(false) *
              3. INSERT... *
              */ char c; boolean sendReadyForQuery = false; String psHandle, portalHandle, handle, dataString, tmpStr; // Statement which must be executed after the primary statement, but // before sending the ReadyForQuery Z packet. String interposedStatement = null; Result r, rOut; int paramCount, lastSemi; OdbcPreparedStatement odbcPs; StatementPortal portal; ResultMetaData pmd; OdbcPacketInputStream inPacket = null; Type[] colTypes; PgType[] pgTypes; try { inPacket = OdbcPacketInputStream.newOdbcPacketInputStream(inC, dataInput); server.printWithThread("Got op (" + inPacket.packetType + ')'); server.printWithThread("Got packet length of " + inPacket.available() + " + type byte + 4 size header"); if (inPacket.available() >= 1000000000) { throw new IOException("Insane packet length: " + inPacket.available() + " + type byte + 4 size header"); } } catch (SocketException se) { server.printWithThread("Ungraceful client exit: " + se); throw cleanExit; // not "clean", but handled } catch (IOException ioe) { server.printWithThread("Fatal ODBC protocol failure: " + ioe); try { OdbcUtil.alertClient(OdbcUtil.ODBC_SEVERITY_FATAL, ioe.toString(), "08P01", dataOutput); // Code here means Protocol Violation } catch (Exception e) { // We just make an honest effort to notify the client } throw cleanExit; // not "clean", but handled } /** * ODBC Service State Machine (the remainder of this method) */ switch (odbcCommMode) { case OdbcUtil.ODBC_EXT_RECOVER_MODE : if (inPacket.packetType != 'S') { if (server.isTrace()) { server.printWithThread("Ignoring a '" + inPacket.packetType + "'"); } return; } odbcCommMode = OdbcUtil.ODBC_EXTENDED_MODE; server.printWithThread( "EXTENDED comm session being recovered"); // Now the main switch will handle the Sync packet carefully // the same as if there were no recovery. break; case OdbcUtil.ODBC_SIMPLE_MODE : switch (inPacket.packetType) { case 'P' : // This is the only way to make this switch, according // to docs, but that does not allow for intermixing of // static and prepared statement (selects or other). // Therefore we allow all of the following, which works // great. case 'H' : case 'S' : case 'D' : case 'B' : case 'E' : case 'C' : odbcCommMode = OdbcUtil.ODBC_EXTENDED_MODE; server.printWithThread( "Switching mode from SIMPLE to EXTENDED"); // Do not detect unexpected ops here. // In that case, leave the mode as it is, and the main // switch below will handle appropriately. } break; case OdbcUtil.ODBC_EXTENDED_MODE : switch (inPacket.packetType) { case 'Q' : odbcCommMode = OdbcUtil.ODBC_SIMPLE_MODE; server.printWithThread( "Switching mode from EXTENDED to SIMPLE"); // Do not detect unexpected ops here. // In that case, leave the mode as it is, and the main // switch below will handle appropriately. } break; default : throw new RuntimeException("Unexpected ODBC comm mode value: " + odbcCommMode); } outPacket.reset(); try { // Every switch case must either throw or break. // For cases which break // The packet will always be checked to make sure all bytes have // been consumed. // Set boolean sendReadyForQuery to send a Z/ReadyForQuery packet // to client. // DO NOT return early. If you need to abort, that is exceptional // behavior and you should throw an Exception. MAIN_ODBC_COMM_SWITCH: switch (inPacket.packetType) { case 'Q' : // Query packet String sql = inPacket.readString(); // We don't ask for the null terminator /* ********************************************** * These first few cases handle the driver's implicit handling * of transactions. */ if (sql.startsWith("BEGIN;") || sql.equals("BEGIN")) { /* * We may get here because of Driver client trying to * manage transactions implicitly; or because user/app. * has really issued a "BEGIN" command. * In the first case, we don't need to run the * corresponding START TRANSACTION command, since the * HyperSQL engine does this automatically, and can tell * when it is needed far better than the client; however * we do use this fact to update our Session autocommit * state to match the client's notion. * We ignore the latter case, because real HyperSQL * user/apps will use "START TRANSACTION", not "BEGIN". * Therefore, we just update autocommit state and run no * other command against the engine. */ sql = sql.equals("BEGIN") ? null : sql.substring( "BEGIN;".length()); server.printWithThread( "ODBC Trans started. Session AutoCommit -> F"); try { session.setAutoCommit(false); } catch (HsqlException he) { throw new RecoverableOdbcFailure( "Failed to change transaction state: " + he.getMessage(), he.getSQLState()); } // Now just placate the driver outPacket.write("BEGIN"); outPacket.xmit('C', dataOutput); if (sql == null) { sendReadyForQuery = true; break; } } if (sql.startsWith("SAVEPOINT ") && sql.indexOf(';') > 0) { int firstSemi = sql.indexOf(';'); server.printWithThread( "Interposing BEFORE primary statement: " + sql.substring(0, firstSemi)); odbcExecDirect(sql.substring(0, firstSemi)); sql = sql.substring(firstSemi + 1); } lastSemi = sql.lastIndexOf(';'); if (lastSemi > 0) { String suffix = sql.substring(lastSemi + 1); if (suffix.startsWith("RELEASE ")) { interposedStatement = suffix; sql = sql.substring(0, lastSemi); } } /** ******************************************* */ String normalized = sql.trim().toLowerCase(); if (server.isTrace()) { server.printWithThread("Received query (" + sql + ')'); } /* * BEWARE: We aren't supporting multiple result-sets from a * compound statement. Plus, a general requirement is, the * entire compound statement may return just one result set. * I don't have time to check how it works elsewhere, but here, * and for now, the Rowset-generating statement (SELECT, etc.) * must be first in order for us to detect that we need to * return a result set. * If we do parse out the component statement here, the states * set above apply to all executions, and only one Z packet * should be sent at the very end. * * I find that the Driver can't handle compound statements * which mix resultset + non-resultset statements (even in * SIMPLE mode), so we are more capable than our client is. */ if (normalized.startsWith("select current_schema()")) { server.printWithThread( "Implement 'select current_schema() emulation!"); throw new RecoverableOdbcFailure( "current_schema() not supported yet", "0A000"); } if (normalized.startsWith("select n.nspname,")) { // Executed by psqlodbc after every user-specified query. server.printWithThread( "Swallowing 'select n.nspname,...'"); outPacket.writeShort(1); // Num cols. outPacket.write("oid"); outPacket.writeInt(201); outPacket.writeShort(1); outPacket.writeInt(23); outPacket.writeShort(4); outPacket.writeInt(-1); outPacket.writeShort(0); outPacket.xmit('T', dataOutput); // Xmit Row Definition // This query returns no rows. typenam "lo"?? outPacket.write("SELECT"); outPacket.xmit('C', dataOutput); sendReadyForQuery = true; break; } if (normalized.startsWith( "select oid, typbasetype from")) { // Executed by psqlodbc immediately after connecting. server.printWithThread( "Simulating 'select oid, typbasetype...'"); /* * This query is run as "a hack to get the oid of our * large object oid type. */ outPacket.writeShort(2); // Num cols. outPacket.write("oid"); // Col. name outPacket.writeInt(101); // table ID outPacket.writeShort(102); // column id outPacket.writeInt(26); // Datatype ID [adtid] outPacket.writeShort(4); // Datatype size [adtsize] outPacket.writeInt(-1); // Var size [atttypmod] outPacket.writeShort(0); // text "format code" outPacket.write("typbasetype"); // Col. name outPacket.writeInt(101); // table ID outPacket.writeShort(103); // column id outPacket.writeInt(26); // Datatype ID [adtid] outPacket.writeShort(4); // Datatype size [adtsize] outPacket.writeInt(-1); // Var size [atttypmod] outPacket.writeShort(0); // text "format code" outPacket.xmit('T', dataOutput); // sending a Tuple (row) // This query returns no rows. typenam "lo"?? outPacket.write("SELECT"); outPacket.xmit('C', dataOutput); sendReadyForQuery = true; break; } if (normalized.startsWith("select ")) { server.printWithThread( "Performing a real non-prepared SELECT..."); r = Result.newExecuteDirectRequest(); r.setPrepareOrExecuteProperties( sql, 0, 0, StatementTypes.RETURN_RESULT, 0, ResultProperties.defaultPropsValue, java.sql.Statement.NO_GENERATED_KEYS, null, null); rOut = session.execute(r); switch (rOut.getType()) { case ResultConstants.DATA : break; case ResultConstants.ERROR : throw new RecoverableOdbcFailure(rOut); default : throw new RecoverableOdbcFailure( "Output Result from Query execution is of " + "unexpected type: " + rOut.getType()); } // See Result.newDataHeadResult() for what we have here // .metaData, .navigator RowSetNavigator navigator = rOut.getNavigator(); ResultMetaData md = rOut.metaData; if (md == null) { throw new RecoverableOdbcFailure( "Failed to get metadata for query results"); } int columnCount = md.getColumnCount(); String[] colLabels = md.getGeneratedColumnNames(); colTypes = md.columnTypes; pgTypes = new PgType[columnCount]; for (int i = 0; i < pgTypes.length; i++) { pgTypes[i] = PgType.getPgType(colTypes[i], md.isTableColumn(i)); } // fredt : colLabels may not contain some column names // colDefs is used when no label is present: // SELECT TABLECOL AS COLLABLE has both name and label // SELECT TABLECOL has name 'TABLECOL' // SELECT 2 AS CONST has label 'CONST' ColumnBase[] colDefs = md.columns; // Num cols. outPacket.writeShort(columnCount); for (int i = 0; i < columnCount; i++) { // col name if (colLabels[i] != null) { outPacket.write(colLabels[i]); } else { outPacket.write(colDefs[i].getNameString()); } // table ID [relid]: outPacket.writeInt(OdbcUtil.getTableOidForColumn(i, md)); // column id [attid] outPacket.writeShort(OdbcUtil.getIdForColumn(i, md)); outPacket.writeInt(pgTypes[i].getOid()); // Datatype size [adtsize] outPacket.writeShort(pgTypes[i].getTypeWidth()); outPacket.writeInt(pgTypes[i].getLPConstraint()); // Var size [atttypmod] // This is the size constraint integer // like VARCHAR(12) or DECIMAL(4). // -1 if none specified for this column. outPacket.writeShort(0); // format code, 0 = text column, 1 = binary column, // but entirely ignored by our driver. // Would only be non-0 if a 'B' command requested it. } outPacket.xmit('T', dataOutput); // Xmit Row Definition int rowNum = 0; while (navigator.next()) { rowNum++; Object[] rowData = navigator.getCurrent(); // Row.getData(). Don't know why *Data.getCurrent() // method returns Object instead of O[]. // TODO: Remove the assertion here: if (rowData == null) { throw new RecoverableOdbcFailure("Null row?"); } if (rowData.length < columnCount) { throw new RecoverableOdbcFailure( "Data element mismatch. " + columnCount + " metadata cols, yet " + rowData.length + " data elements for row " + rowNum); } //server.printWithThread("Row " + rowNum + " has " //+ rowData.length + " elements"); outPacket.writeShort(columnCount); // This field is just swallowed by PG ODBC // client, but OdbcUtil.validated by psql. for (int i = 0; i < columnCount; i++) { if (rowData[i] == null) { /* server.printWithThread("R" + rowNum + "C" + (i+1) + " => [null]"); */ outPacket.writeInt(-1); } else { dataString = pgTypes[i].valueString(rowData[i]); outPacket.writeSized(dataString); if (server.isTrace()) { server.printWithThread( "R" + rowNum + "C" + (i + 1) + " => (" + rowData[i].getClass().getName() + ") [" + dataString + ']'); } } } outPacket.xmit('D', dataOutput); } outPacket.write("SELECT"); outPacket.xmit('C', dataOutput); sendReadyForQuery = true; break; } if (normalized.startsWith("deallocate \"") && normalized.charAt(normalized.length() - 1) == '"') { tmpStr = sql.trim().substring( "deallocate \"".length()).trim(); // Must use "sql" directly since name is case-sensitive handle = tmpStr.substring(0, tmpStr.length() - 1); odbcPs = (OdbcPreparedStatement) sessionOdbcPsMap.get( handle); if (odbcPs != null) { odbcPs.close(); } portal = (StatementPortal) sessionOdbcPortalMap.get(handle); if (portal != null) { portal.close(); } if (odbcPs == null && portal == null) { /* throw new RecoverableOdbcFailure(null, "No object present for handle: " + handle, "08P01"); Driver does not handle state change correctly, so for now we just issue a warning: OdbcUtil.alertClient(OdbcUtil.ODBC_SEVERITY_ERROR, "No object present for handle: " + handle, dataOutput); TODO: Retest this. May have been side-effect of other problems. */ server.printWithThread( "Ignoring bad 'DEALLOCATE' cmd"); } if (server.isTrace()) { server.printWithThread("Deallocated PS/Portal '" + handle + "'"); } outPacket.write("DEALLOCATE"); outPacket.xmit('C', dataOutput); sendReadyForQuery = true; break; } if (normalized.startsWith("set client_encoding to ")) { server.printWithThread("Stubbing EXECDIR for: " + sql); outPacket.write("SET"); outPacket.xmit('C', dataOutput); sendReadyForQuery = true; break; } // Case below is non-String-matched Qs: server.printWithThread("Performing a real EXECDIRECT..."); odbcExecDirect(sql); sendReadyForQuery = true; break; case 'X' : // Terminate packet if (sessionOdbcPsMap.size() > (sessionOdbcPsMap.containsKey("") ? 1 : 0)) { server.printWithThread("Client left " + sessionOdbcPsMap.size() + " PS objects open"); } if (sessionOdbcPortalMap.size() > (sessionOdbcPortalMap.containsKey("") ? 1 : 0)) { server.printWithThread("Client left " + sessionOdbcPortalMap.size() + " Portal objects open"); } OdbcUtil.validateInputPacketSize(inPacket); throw cleanExit; case 'H' : // Flush packet // No-op. It is impossible to cache while supporting multiple // ps and portal objects, so there is nothing for a Flush to // do. There isn't even a reply to a Flush packet. break; case 'S' : // Sync packet // Special case for Sync packets. // To facilitate recovery, we do not abort in case of problems. if (session.isAutoCommit()) { try { // I don't see how this can be useful. If we ran DML, it // will have autocommitted. If we have just switched to // autoCommit mode, then according to spec we must have // executed an implicit commit then. server.printWithThread( "Silly implicit commit by Sync"); session.commit(true); // TODO: Find out if chain param should be T or F. } catch (HsqlException he) { server.printWithThread("Implicit commit failed: " + he); OdbcUtil.alertClient(OdbcUtil.ODBC_SEVERITY_ERROR, "Implicit commit failed", he.getSQLState(), dataOutput); } } sendReadyForQuery = true; break; case 'P' : // Parse packet psHandle = inPacket.readString(); String query = OdbcUtil.revertMungledPreparedQuery( inPacket.readString()); paramCount = inPacket.readUnsignedShort(); for (int i = 0; i < paramCount; i++) { if (inPacket.readInt() != 0) { throw new RecoverableOdbcFailure( null, "Parameter-type OID specifiers not supported yet", "0A000"); } } if (server.isTrace()) { server.printWithThread( "Received Prepare request for query (" + query + ") with handle '" + psHandle + "'"); } if (psHandle.length() > 0 && sessionOdbcPsMap.containsKey(psHandle)) { throw new RecoverableOdbcFailure( null, "PS handle '" + psHandle + "' already in use. " + "You must close it before recreating", "08P01"); } new OdbcPreparedStatement(psHandle, query, sessionOdbcPsMap, session); outPacket.xmit('1', dataOutput); break; case 'D' : // Describe packet c = inPacket.readByteChar(); handle = inPacket.readString(); odbcPs = null; portal = null; if (c == 'S') { odbcPs = (OdbcPreparedStatement) sessionOdbcPsMap.get( handle); } else if (c == 'P') { portal = (StatementPortal) sessionOdbcPortalMap.get(handle); } else { throw new RecoverableOdbcFailure( null, "Description packet request type invalid: " + c, "08P01"); } if (server.isTrace()) { server.printWithThread("Received Describe request for " + c + " of handle '" + handle + "'"); } if (odbcPs == null && portal == null) { throw new RecoverableOdbcFailure( null, "No object present for " + c + " handle: " + handle, "08P01"); } Result ackResult = (odbcPs == null) ? portal.ackResult : odbcPs.ackResult; pmd = ackResult.parameterMetaData; paramCount = pmd.getColumnCount(); Type[] paramTypes = pmd.getParameterTypes(); if (paramCount != paramTypes.length) { throw new RecoverableOdbcFailure( "Parameter count mismatch. Count of " + paramCount + " reported, but there are " + paramTypes.length + " param md objects"); } if (c == 'S') { outPacket.writeShort(paramCount); for (int i = 0; i < paramTypes.length; i++) { outPacket.writeInt( PgType.getPgType( paramTypes[i], true).getOid()); // TODO: Determine whether parameter typing works // better for Strings when try to match table column // or not. 2nd param to getPgType(). } outPacket.xmit('t', dataOutput); // ParameterDescription packet } ResultMetaData md = ackResult.metaData; if (md.getColumnCount() < 1) { if (server.isTrace()) { server.printWithThread( "Non-rowset query so returning NoData packet"); } // Send NoData packet because no columnar output from // this statement. outPacket.xmit('n', dataOutput); break; } // TODO: // May need to pass the extra BIGINT pseudo-column for // updatable-row or other purposes. In that case, it may // make sense to use getExtendedColumnCount(), etc. String[] colNames = md.getGeneratedColumnNames(); if (md.getColumnCount() != colNames.length) { throw new RecoverableOdbcFailure( "Couldn't get all column names: " + md.getColumnCount() + " cols. but only got " + colNames.length + " col. names"); } colTypes = md.columnTypes; pgTypes = new PgType[colNames.length]; ColumnBase[] colDefs = md.columns; for (int i = 0; i < pgTypes.length; i++) { pgTypes[i] = PgType.getPgType(colTypes[i], md.isTableColumn(i)); } if (colNames.length != colDefs.length) { throw new RecoverableOdbcFailure( "Col data mismatch. " + colDefs.length + " col instances but " + colNames.length + " col names"); } outPacket.writeShort(colNames.length); // Num cols. for (int i = 0; i < colNames.length; i++) { outPacket.write(colNames[i]); // Col. name // table ID [relid]: outPacket.writeInt(OdbcUtil.getTableOidForColumn(i, md)); // column id [attid] outPacket.writeShort(OdbcUtil.getIdForColumn(i, md)); outPacket.writeInt(pgTypes[i].getOid()); // Datatype size [adtsize] outPacket.writeShort(pgTypes[i].getTypeWidth()); outPacket.writeInt(pgTypes[i].getLPConstraint()); // Var size [atttypmod] // This is the size constraint integer // like VARCHAR(12) or DECIMAL(4). // -1 if none specified for this column. outPacket.writeShort(0); // format code, 0 = text column, 1 = binary column, // but entirely ignored by our driver. // Would only be non-0 if a 'B' command requested it. } outPacket.xmit('T', dataOutput); // Xmit Row Definition break; case 'B' : // Bind packet portalHandle = inPacket.readString(); psHandle = inPacket.readString(); int paramFormatCount = inPacket.readUnsignedShort(); boolean[] paramBinary = new boolean[paramFormatCount]; for (int i = 0; i < paramFormatCount; i++) { paramBinary[i] = inPacket.readUnsignedShort() != 0; if (server.isTrace() && paramBinary[i]) { server.printWithThread("Binary param #" + i); } } paramCount = inPacket.readUnsignedShort(); Object[] paramVals = new Object[paramCount]; for (int i = 0; i < paramVals.length; i++) { if (i < paramBinary.length && paramBinary[i]) { paramVals[i] = inPacket.readSizedBinaryData(); } else { paramVals[i] = inPacket.readSizedString(); } } int outFormatCount = inPacket.readUnsignedShort(); for (int i = 0; i < outFormatCount; i++) { if (inPacket.readUnsignedShort() != 0) { throw new RecoverableOdbcFailure( null, "Binary output values not supported", "0A000"); } } if (server.isTrace()) { server.printWithThread( "Received Bind request to make Portal from (" + psHandle + ")' with handle '" + portalHandle + "'"); } odbcPs = (OdbcPreparedStatement) sessionOdbcPsMap.get(psHandle); if (odbcPs == null) { throw new RecoverableOdbcFailure( null, "No object present for PS handle: " + psHandle, "08P01"); } if (portalHandle.length() > 0 && sessionOdbcPortalMap.containsKey( portalHandle)) { throw new RecoverableOdbcFailure( null, "Portal handle '" + portalHandle + "' already in use. " + "You must close it before recreating", "08P01"); } pmd = odbcPs.ackResult.parameterMetaData; if (paramCount != pmd.getColumnCount()) { throw new RecoverableOdbcFailure( null, "Client didn't specify all " + pmd.getColumnCount() + " parameters (" + paramCount + ')', "08P01"); } new StatementPortal(portalHandle, odbcPs, paramVals, sessionOdbcPortalMap); outPacket.xmit('2', dataOutput); break; case 'E' : // Execute packet portalHandle = inPacket.readString(); int fetchRows = inPacket.readInt(); if (server.isTrace()) { server.printWithThread("Received Exec request for " + fetchRows + " rows from portal handle '" + portalHandle + "'"); } portal = (StatementPortal) sessionOdbcPortalMap.get( portalHandle); if (portal == null) { throw new RecoverableOdbcFailure( null, "No object present for Portal handle: " + portalHandle, "08P01"); } // result properties means readonly, not holdable portal.bindResult.setPreparedExecuteProperties( portal.parameters, fetchRows, 0, 0); // 0 for maxRows means unlimited. Same for fetchRows. rOut = session.execute(portal.bindResult); switch (rOut.getType()) { case ResultConstants.UPDATECOUNT : outPacket.write( OdbcUtil.echoBackReplyString( portal.lcQuery, rOut.getUpdateCount())); outPacket.xmit('C', dataOutput); // end of rows (B or D packets) // This keeps session.autoUpdate in sync with client's // notion of transaction state. if (portal.lcQuery.equals("commit") || portal.lcQuery.startsWith("commit ") || portal.lcQuery.equals("rollback") || portal.lcQuery.startsWith( "rollback ")) { try { session.setAutoCommit(true); } catch (HsqlException he) { throw new RecoverableOdbcFailure( "Failed to change transaction state: " + he.getMessage(), he.getSQLState()); } } break MAIN_ODBC_COMM_SWITCH; case ResultConstants.DATA : break; case ResultConstants.ERROR : throw new RecoverableOdbcFailure(rOut); default : throw new RecoverableOdbcFailure( "Output Result from Portal execution is of " + "unexpected type: " + rOut.getType()); } // See Result.newDataHeadResult() for what we have here // .metaData, .navigator RowSetNavigator navigator = rOut.getNavigator(); int rowNum = 0; int colCount = portal.ackResult.metaData.getColumnCount(); while (navigator.next()) { rowNum++; Object[] rowData = navigator.getCurrent(); if (rowData == null) { throw new RecoverableOdbcFailure("Null row?"); } if (rowData.length < colCount) { throw new RecoverableOdbcFailure( "Data element mismatch. " + colCount + " metadata cols, yet " + rowData.length + " data elements for row " + rowNum); } //server.printWithThread("Row " + rowNum + " has " //+ rowData.length + " elements"); outPacket.writeShort(colCount); // This field is just swallowed by PG ODBC // client, but validated by psql. colTypes = portal.ackResult.metaData.columnTypes; pgTypes = new PgType[colCount]; for (int i = 0; i < pgTypes.length; i++) { pgTypes[i] = PgType.getPgType( colTypes[i], portal.ackResult.metaData.isTableColumn(i)); } for (int i = 0; i < colCount; i++) { if (rowData[i] == null) { /* server.printWithThread("R" + rowNum + "C" + (i+1) + " => [null]"); */ outPacket.writeInt(-1); } else { dataString = pgTypes[i].valueString(rowData[i]); outPacket.writeSized(dataString); if (server.isTrace()) { server.printWithThread( "R" + rowNum + "C" + (i + 1) + " => (" + rowData[i].getClass().getName() + ") [" + dataString + ']'); } } } outPacket.xmit('D', dataOutput); } if (navigator.afterLast()) { outPacket.write("SELECT"); outPacket.xmit('C', dataOutput); // end of rows (B or D packets) } else { outPacket.xmit('s', dataOutput); } // N.b., we return. // You might think that this completion of an EXTENDED sequence // would end in ReadyForQuery/Z, but no. break; case 'C' : // Close packet c = inPacket.readByteChar(); handle = inPacket.readString(); odbcPs = null; portal = null; if (c == 'S') { odbcPs = (OdbcPreparedStatement) sessionOdbcPsMap.get( handle); if (odbcPs != null) { odbcPs.close(); } } else if (c == 'P') { portal = (StatementPortal) sessionOdbcPortalMap.get(handle); if (portal != null) { portal.close(); } } else { throw new RecoverableOdbcFailure( null, "Description packet request type invalid: " + c, "08P01"); } // TODO: Try sending a warning to client for both == null. // Broke things earlier, but that may have been due to // other problems. if (server.isTrace()) { server.printWithThread("Closed " + c + " '" + handle + "'? " + (odbcPs != null || portal != null)); } outPacket.xmit('3', dataOutput); break; default : throw new RecoverableOdbcFailure( null, "Unsupported operation type (" + inPacket.packetType + ')', "0A000"); } OdbcUtil.validateInputPacketSize(inPacket); if (interposedStatement != null) { server.printWithThread("Interposing AFTER primary statement: " + interposedStatement); odbcExecDirect(interposedStatement); } if (sendReadyForQuery) { outPacket.reset(); // The reset is unnecessary now. For safety in case somebody // codes something above which may abort processing of a // packet before xmit. outPacket.writeByte(session.isAutoCommit() ? 'I' : 'T'); outPacket.xmit('Z', dataOutput); } } catch (RecoverableOdbcFailure rf) { Result errorResult = rf.getErrorResult(); if (errorResult == null) { String stateCode = rf.getSqlStateCode(); String svrMsg = rf.toString(); String cliMsg = rf.getClientMessage(); if (svrMsg != null) { server.printWithThread(svrMsg); } else if (server.isTrace()) { server.printWithThread("Client error: " + cliMsg); } if (cliMsg != null) { OdbcUtil.alertClient(OdbcUtil.ODBC_SEVERITY_ERROR, cliMsg, stateCode, dataOutput); } } else { if (server.isTrace()) { server.printWithThread("Result object error: " + errorResult.getMainString()); } // This class of error is not considered a Server problem, so // we don't log on the server side. OdbcUtil.alertClient(OdbcUtil.ODBC_SEVERITY_ERROR, errorResult.getMainString(), errorResult.getSubString(), dataOutput); } switch (odbcCommMode) { case OdbcUtil.ODBC_SIMPLE_MODE : outPacket.reset(); /// transaction status = Error outPacket.writeByte('E'); /// transaction status = Error // TODO: Consider keeping this state until the session // is either committed or rolled back. // (Right now we just return 'E' here, then revert to // I or T). outPacket.xmit('Z', dataOutput); break; case OdbcUtil.ODBC_EXTENDED_MODE : odbcCommMode = OdbcUtil.ODBC_EXT_RECOVER_MODE; server.printWithThread("Reverting to EXT_RECOVER mode"); break; } } } /** * Initializes this connection and runs the request handling * loop until closed. */ public void run() { int msgType; init(); if (session != null) { try { while (keepAlive) { msgType = dataInput.readByte(); if (msgType < ResultConstants.MODE_UPPER_LIMIT) { receiveResult(msgType); } else { receiveOdbcPacket((char) msgType); } } } catch (CleanExit ce) { keepAlive = false; } catch (IOException e) { // fredt - is thrown when connection drops server.printWithThread(mThread + ":disconnected " + user); } catch (HsqlException e) { // fredt - is thrown in unforeseen circumstances if (keepAlive) { server.printStackTrace(e); } } catch (Throwable e) { // fredt - is thrown in unforeseen circumstances if (keepAlive) { server.printStackTrace(e); } } } close(); } private Result setDatabase(Result resultIn) { try { String databaseName = resultIn.getDatabaseName(); dbIndex = server.getDBIndex(databaseName); dbID = server.dbID[dbIndex]; user = resultIn.getMainString(); if (!server.isSilent()) { server.printWithThread(mThread + ":Trying to connect user '" + user + "' to DB (" + databaseName + ')'); } session = DatabaseManager.newSession(dbID, user, resultIn.getSubString(), resultIn.getZoneString(), resultIn.getUpdateCount()); if (!server.isSilent()) { server.printWithThread(mThread + ":Connected user '" + user + "'"); } return Result.newConnectionAcknowledgeResponse( session.getDatabase(), session.getId(), session.getDatabase().getDatabaseID()); } catch (HsqlException e) { session = null; return Result.newErrorResult(e); } catch (RuntimeException e) { session = null; return Result.newErrorResult(e); } } /** * Retrieves the thread name to be used when * this object is the Runnable object of a Thread. * * @return the thread name to be used when this object is the Runnable * object of a Thread. */ String getConnectionThreadName() { return "HSQLDB Connection @" + Integer.toString(hashCode(), 16); } /** * Don't want this too high, or users may give up before seeing the * banner. Can't be too low or we could close a valid but slow * client connection. */ public static long MAX_WAIT_FOR_CLIENT_DATA = 1000; // ms. public static long CLIENT_DATA_POLLING_PERIOD = 100; // ms. /** * The only known case where a connection attempt will get stuck is * if client connects with hsqls to a https server; or * hsql to a http server. * All other client X server combinations are handled gracefully. *

              * If returns (a.o.t. throws), then state variable streamProtocol will * be set. * * @return int read as first thing off of stream */ public int handshake() throws IOException { long clientDataDeadline = new java.util.Date().getTime() + MAX_WAIT_FOR_CLIENT_DATA; if (!(socket instanceof javax.net.ssl.SSLSocket)) { // available() does not work for SSL socket input stream do { try { Thread.sleep(CLIENT_DATA_POLLING_PERIOD); } catch (InterruptedException ie) {} } while (dataInput.available() < 5 && new java.util.Date().getTime() < clientDataDeadline); // Old HSQLDB clients will send resultType byte + 4 length bytes // New HSQLDB clients will send NCV int + above = 9 bytes // ODBC clients will send a much larger StartupPacket if (dataInput.available() < 1) { dataOutput.write( (TEXTBANNER_PART1 + ClientConnection.NETWORK_COMPATIBILITY_VERSION + TEXTBANNER_PART2 + '\n').getBytes()); dataOutput.flush(); throw Error.error(ErrorCode.SERVER_UNKNOWN_CLIENT); } } int firstInt = dataInput.readInt(); switch (firstInt >> 24) { case 80 : // Empirically server.print( "Rejected attempt from client using hsql HTTP protocol"); return 0; case 0 : // For ODBC protocol, this is the first byte of a 4-byte int // size. The size can never be large enough that the first // byte will be non-zero. streamProtocol = ODBC_STREAM_PROTOCOL; break; default : streamProtocol = HSQL_STREAM_PROTOCOL; // HSQL protocol client } return firstInt; } private void odbcConnect(int firstInt) throws IOException { /* Until client receives teh ReadyForQuery packet at the end of this * method, we (the server) initiate all packet exchanges. */ int major = dataInput.readUnsignedShort(); int minor = dataInput.readUnsignedShort(); // Can just return to fail, until the value of "session" is set below. if (major == 1 && minor == 7) { // This is what old HyperSQL versions always send // TODO: Consider sending client a 1.8-compatible SQLException server.print("A pre-9.0 client attempted to connect. " + "We rejected them."); return; } if (major == 1234 && minor == 5679) { // No reason to pay any attention to the size header in this case. dataOutput.writeByte('N'); // SSL not supported yet // TODO: Implement SSL here (and reply with 'S') odbcConnect(dataInput.readInt()); return; } if (major == 1234 && minor == 5678) { // No reason to pay any attention to the size header in this case. if (firstInt != 16) { server.print( "ODBC cancellation request sent wrong packet length: " + firstInt); } server.print( "Got an ODBC cancelation request for thread ID " + dataInput.readInt() + ", but we don't support " + "OOB cancellation yet. " + "Ignoring this request and closing the connection."); // N.b., Spec says to NOT reply to client in this case. return; } server.printWithThread("ODBC client connected. " + "ODBC Protocol Compatibility Version " + major + '.' + minor); OdbcPacketInputStream inPacket = OdbcPacketInputStream.newOdbcPacketInputStream('\0', dataInput, firstInt - 8); // - 4 for size of firstInt - 2 for major - 2 for minor java.util.Map stringPairs = inPacket.readStringPairs(); if (server.isTrace()) { server.print("String Pairs from ODBC client: " + stringPairs); } try { try { OdbcUtil.validateInputPacketSize(inPacket); } catch (RecoverableOdbcFailure rf) { // In this case, we do not treat it as recoverable throw new ClientFailure(rf.toString(), rf.getClientMessage()); } inPacket.close(); if (!stringPairs.containsKey("database")) { throw new ClientFailure("Client did not identify database", "Target database not identified"); } if (!stringPairs.containsKey("user")) { throw new ClientFailure("Client did not identify user", "Target account not identified"); } String databaseName = (String) stringPairs.get("database"); user = (String) stringPairs.get("user"); if (databaseName.equals("/")) { // Work-around because ODBC doesn't allow "" for Database name databaseName = ""; } /* Unencoded/unsalted authentication */ dataOutput.writeByte('R'); dataOutput.writeInt(8); //size dataOutput.writeInt(OdbcUtil.ODBC_AUTH_REQ_PASSWORD); dataOutput.flush(); // areq of auth. mode. char c = '\0'; try { c = (char) dataInput.readByte(); } catch (EOFException eofe) { server.printWithThread( "Looks like we got a goofy psql no-auth attempt. " + "Will probably retry properly very shortly"); return; } if (c != 'p') { throw new ClientFailure( "Expected password prefix 'p', " + "but got '" + c + "'", "Password value not prefixed with 'p'"); } int len = dataInput.readInt() - 5; // Is password len after -4 for count int -1 for null term if (len < 0) { throw new ClientFailure( "Client submitted invalid password length " + len, "Invalid password length " + len); } String password = ServerConnection.readNullTermdUTF(len, dataInput); dbIndex = server.getDBIndex(databaseName); dbID = server.dbID[dbIndex]; if (!server.isSilent()) { server.printWithThread(mThread + ":Trying to connect user '" + user + "' to DB (" + databaseName + ')'); } try { session = DatabaseManager.newSession(dbID, user, password, null, 0); // TODO: Find out what updateCount, the last para, is for: // resultIn.getUpdateCount()); } catch (Exception e) { throw new ClientFailure("User name or password denied: " + e, "Login attempt rejected"); } } catch (ClientFailure cf) { server.print(cf.toString()); // Code below means CONNECTION FAILURE OdbcUtil.alertClient(OdbcUtil.ODBC_SEVERITY_FATAL, cf.getClientMessage(), "08006", dataOutput); return; } outPacket = OdbcPacketOutputStream.newOdbcPacketOutputStream(); outPacket.writeInt(OdbcUtil.ODBC_AUTH_REQ_OK); //success outPacket.xmit('R', dataOutput); // Notify client of success for (int i = 0; i < OdbcUtil.hardcodedParams.length; i++) { OdbcUtil.writeParam(OdbcUtil.hardcodedParams[i][0], OdbcUtil.hardcodedParams[i][1], dataOutput); } // If/when we implement OOB cancellation, we would send the // Session identifier and key here, with a 'K' packet. outPacket.writeByte('I'); // Trans. status = Not in transaction outPacket.xmit('Z', dataOutput); // Notify client of success // This ReadyForQuery turns over responsibility to initiate packet // exchanges to the client. OdbcUtil.alertClient( OdbcUtil.ODBC_SEVERITY_INFO, "MHello\nYou have connected to HyperSQL ODBC Server", dataOutput); dataOutput.flush(); } private java.util.Map sessionOdbcPsMap = new java.util.HashMap(); private java.util.Map sessionOdbcPortalMap = new java.util.HashMap(); /** * Read String directy from dataInput. * * @param reqLength Required length */ private static String readNullTermdUTF(int reqLength, java.io.InputStream istream) throws IOException { /* Would be MUCH easier to do this with Java6's String * encoding/decoding operations */ int bytesRead = 0; byte[] ba = new byte[reqLength + 3]; ba[0] = (byte) (reqLength >>> 8); ba[1] = (byte) reqLength; while (bytesRead < reqLength + 1) { bytesRead += istream.read(ba, 2 + bytesRead, reqLength + 1 - bytesRead); } if (ba[ba.length - 1] != 0) { throw new IOException("String not null-terminated"); } for (int i = 2; i < ba.length - 1; i++) { if (ba[i] == 0) { throw new RuntimeException("Null internal to String at offset " + (i - 2)); } } java.io.DataInputStream dis = new java.io.DataInputStream(new ByteArrayInputStream(ba)); String s = dis.readUTF(); //String s = java.io.DataInputStream.readUTF(dis); // TODO: Test the previous two to see if one works better for // high-order characters. dis.close(); return s; } // Tentative state variable private int streamProtocol = UNDEFINED_STREAM_PROTOCOL; static final int UNDEFINED_STREAM_PROTOCOL = 0; static final int HSQL_STREAM_PROTOCOL = 1; static final int ODBC_STREAM_PROTOCOL = 2; int odbcCommMode = OdbcUtil.ODBC_SIMPLE_MODE; private void odbcExecDirect(String inStatement) throws RecoverableOdbcFailure, IOException { String statement = inStatement; String norm = statement.trim().toLowerCase(); if (norm.startsWith("release ") && !norm.startsWith("release savepoint")) { server.printWithThread( "Transmogrifying 'RELEASE ...' to 'RELEASE SAVEPOINT..."); statement = statement.trim().substring(0, "release ".length()) + "SAVEPOINT " + statement.trim().substring("release ".length()); } Result r = Result.newExecuteDirectRequest(); r.setPrepareOrExecuteProperties( statement, 0, 0, StatementTypes.RETURN_COUNT, 0, ResultProperties.defaultPropsValue, ResultConstants.RETURN_NO_GENERATED_KEYS, null, null); Result rOut = session.execute(r); switch (rOut.getType()) { case ResultConstants.UPDATECOUNT : break; case ResultConstants.ERROR : throw new RecoverableOdbcFailure(rOut); default : throw new RecoverableOdbcFailure( "Output Result from execution is of " + "unexpected type: " + rOut.getType()); } outPacket.reset(); outPacket.write(OdbcUtil.echoBackReplyString(norm, rOut.getUpdateCount())); // This keeps session.autoUpdate in sync with client's notion // of transaction state. outPacket.xmit('C', dataOutput); if (norm.equals("commit") || norm.startsWith("commit ") || norm.equals("rollback") || norm.startsWith("rollback ")) { try { session.setAutoCommit(true); } catch (HsqlException he) { throw new RecoverableOdbcFailure( "Failed to change transaction state: " + he.getMessage(), he.getSQLState()); } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/StatementPortal.java0000644000175000017500000001156512007547404024250 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.util.Map; import org.hsqldb.Session; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; class StatementPortal { public Object[] parameters; public Result bindResult, ackResult; public String lcQuery; public String handle; private Map containingMap; private Session session; /** * Convenience wrapper for the 3-param constructor. * * @see #StatementPortal(String, OdbcPreparedStatement, Object[], Map) */ public StatementPortal(String handle, OdbcPreparedStatement odbcPs, Map containingMap) throws RecoverableOdbcFailure { this(handle, odbcPs, new Object[0], containingMap); } /** * Instantiates a proxy ODBC StatementPortal object for the * Connection Session, and adds the new instance to the specified map. * * @param paramObjs Param values are either String or BinaryData instances */ public StatementPortal(String handle, OdbcPreparedStatement odbcPs, Object[] paramObjs, Map containingMap) throws RecoverableOdbcFailure { this.handle = handle; lcQuery = odbcPs.query.toLowerCase(); ackResult = odbcPs.ackResult; session = odbcPs.session; this.containingMap = containingMap; bindResult = Result.newPreparedExecuteRequest( odbcPs.ackResult.parameterMetaData.getParameterTypes(), odbcPs.ackResult.getStatementID()); switch (bindResult.getType()) { case ResultConstants.EXECUTE: break; case ResultConstants.ERROR: throw new RecoverableOdbcFailure(bindResult); default: throw new RecoverableOdbcFailure( "Output Result from seconary Statement prep is of " + "unexpected type: " + bindResult.getType()); } if (paramObjs.length < 1) { parameters = new Object[0]; } else { org.hsqldb.result.ResultMetaData pmd = odbcPs.ackResult.parameterMetaData; if (pmd == null) { throw new RecoverableOdbcFailure("No metadata for Result ack"); } org.hsqldb.types.Type[] paramTypes = pmd.getParameterTypes(); if (paramTypes.length != paramObjs.length) { throw new RecoverableOdbcFailure(null, "Client didn't specify all " + paramTypes.length + " parameters (" + paramObjs.length + ')', "08P01"); } parameters = new Object[paramObjs.length]; try { for (int i = 0; i < parameters.length; i++) { parameters[i] = (paramObjs[i] instanceof String) ? PgType.getPgType(paramTypes[i], true) .getParameter((String) paramObjs[i], session) : paramObjs[i]; } } catch (java.sql.SQLException se) { throw new RecoverableOdbcFailure("Typing failure: " + se); } } containingMap.put(handle, this); } /** * Releases resources for this instance * and removes this instance from the containing map. */ public void close() { // TODO: Free up resources! containingMap.remove(handle); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/ServerConstants.java0000644000175000017500000000605512007547404024263 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; /** * An enumeration of the property keys and default property values used by * HSQLDB servers * * @author boucherb@users * @version 2.1.1 * @since 1.7.2 */ public interface ServerConstants { // server states int SERVER_STATE_ONLINE = 1; int SERVER_STATE_OPENING = 4; int SERVER_STATE_CLOSING = 8; int SERVER_STATE_SHUTDOWN = 16; int SC_DATABASE_SHUTDOWN = 0; // use default address for server socket String SC_DEFAULT_ADDRESS = "0.0.0.0"; // default database name if non specified String SC_DEFAULT_DATABASE = "test"; // default port for each protocol int SC_DEFAULT_HSQL_SERVER_PORT = 9001; int SC_DEFAULT_HSQLS_SERVER_PORT = 554; int SC_DEFAULT_HTTP_SERVER_PORT = 80; int SC_DEFAULT_HTTPS_SERVER_PORT = 443; int SC_DEFAULT_BER_SERVER_PORT = 9101; // operation modes boolean SC_DEFAULT_SERVER_AUTORESTART = false; boolean SC_DEFAULT_NO_SYSTEM_EXIT = true; boolean SC_DEFAULT_SILENT = true; boolean SC_DEFAULT_TLS = false; boolean SC_DEFAULT_TRACE = false; boolean SC_DEFAULT_REMOTE_OPEN_DB = false; int SC_DEFAULT_MAX_DATABASES = 10; // type of server int SC_PROTOCOL_HTTP = 0; int SC_PROTOCOL_HSQL = 1; int SC_PROTOCOL_BER = 2; // web server page defaults String SC_DEFAULT_WEB_MIME = "text/html"; String SC_DEFAULT_WEB_PAGE = "index.html"; String SC_DEFAULT_WEB_ROOT = "."; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/OdbcPreparedStatement.java0000644000175000017500000000775312007547404025345 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.hsqldb.Session; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.result.ResultProperties; class OdbcPreparedStatement { public String handle, query; public Result ackResult; public Session session; private Map containingMap; private List portals = new ArrayList(); protected OdbcPreparedStatement(OdbcPreparedStatement other) { this.handle = other.handle; this.ackResult = other.ackResult; } /** * Instantiates an proxy OdbcPreparedStatement object for the * Connection Session, and adds the new instance to the specified map. */ public OdbcPreparedStatement(String handle, String query, Map containingMap, Session session) throws RecoverableOdbcFailure { this.handle = handle; this.query = query; this.containingMap = containingMap; this.session = session; Result psResult = Result.newPrepareStatementRequest(); psResult.setPrepareOrExecuteProperties( query, 0, 0, 0, 0,ResultProperties.defaultPropsValue, Statement.NO_GENERATED_KEYS, null, null); ackResult = session.execute(psResult); switch (ackResult.getType()) { case ResultConstants.PREPARE_ACK : break; case ResultConstants.ERROR : throw new RecoverableOdbcFailure(ackResult); default : throw new RecoverableOdbcFailure( "Output Result from Statement prep is of " + "unexpected type: " + ackResult.getType()); } containingMap.put(handle, this); } /** * Releases resources for this instance and all associated StatementPortals, * and removes this instance from the containing map. */ public void close() { // TODO: Free up resources! containingMap.remove(handle); while (portals.size() > 0) { ((StatementPortal) portals.remove(1)).close(); } } /** * Associates an StatementPortal withwith OdbcPreparedStatement. */ public void addPortal(StatementPortal portal) { portals.add(portal); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/server/HsqlServerFactory.java0000644000175000017500000000655612007547404024554 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import java.sql.SQLException; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.HsqlException; import org.hsqldb.jdbc.Util; import org.hsqldb.persist.HsqlProperties; // fredt@users 20020215 - patch 461556 by paul-h@users - modified // minor changes to support the new HsqlServerProperties class // boucherb@users 20030501 - Server now implements HsqlSocketRequestHandler /** * HsqlServerFactory * * @author paul-h@users * @version 2.2.0 * @since 1.7.0 */ public class HsqlServerFactory { private HsqlServerFactory() {} public static HsqlSocketRequestHandler createHsqlServer(String dbFilePath, boolean debugMessages, boolean silentMode) throws SQLException { ServerProperties props = new ServerProperties(ServerConstants.SC_PROTOCOL_HSQL); props.setProperty("server.dbname.0", ""); props.setProperty("server.database.0", dbFilePath); props.setProperty("server.trace", debugMessages); props.setProperty("server.silent", silentMode); Server server = new Server(); try { server.setProperties(props); } catch (Exception e) { throw new SQLException("Failed to set server properties: " + e); } if (!server.openDatabases()) { Throwable t = server.getServerError(); if (t instanceof HsqlException) { throw Util.sqlException((HsqlException) t); } else { throw Util.sqlException(Error.error(ErrorCode.GENERAL_ERROR)); } } server.setState(ServerConstants.SERVER_STATE_ONLINE); // Server now implements HsqlSocketRequestHandler, // so there's really no need for HsqlSocketRequestHandlerImpl return server; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/RowAVLDisk.java0000644000175000017500000002516512007547416021545 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb; import java.io.IOException; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.NodeAVL; import org.hsqldb.index.NodeAVLDisk; import org.hsqldb.lib.LongLookup; import org.hsqldb.persist.PersistentStore; import org.hsqldb.rowio.RowInputInterface; import org.hsqldb.rowio.RowOutputInterface; // fredt@users 20020221 - patch 513005 by sqlbob@users (RMP) // fredt@users 20020920 - patch 1.7.1 - refactoring to cut memory footprint // fredt@users 20021205 - patch 1.7.2 - enhancements // fredt@users 20021215 - doc 1.7.2 - javadoc comments // boucherb@users - 20040411 - doc 1.7.2 - javadoc comments /** * In-memory representation of a disk-based database row object with methods * for serialization and de-serialization.

              * * New class derived from Hypersonic SQL code and enhanced in HSQLDB.

              * * @author Fred Toussi (fredt@users dot sourceforge dot net) * @author Thomas Mueller (Hypersonic SQL Group) * @version 2.2.9 * @since Hypersonic SQL */ public class RowAVLDisk extends RowAVL { public static final int NO_POS = -1; // int storageSize; int keepCount; volatile boolean isInMemory; int accessCount; boolean isNew; /** * Flag indicating unwritten data. */ boolean hasDataChanged; /** * Flag indicating Node data has changed. */ private boolean hasNodesChanged; /** * Constructor for new Rows. Variable hasDataChanged is set to true in * order to indicate the data needs saving. * * @param t table * @param o row data */ public RowAVLDisk(TableBase t, Object[] o, PersistentStore store) { super(t, o); setNewNodes(store); hasDataChanged = hasNodesChanged = isNew = true; } /** * Constructor when read from the disk into the Cache. * * @param t table * @param in data source * @throws IOException */ public RowAVLDisk(TableBase t, RowInputInterface in) throws IOException { super(t, (Object[]) null); position = in.getPos(); storageSize = in.getSize(); int indexcount = t.getIndexCount(); nPrimaryNode = new NodeAVLDisk(this, in, 0); NodeAVL n = nPrimaryNode; for (int i = 1; i < indexcount; i++) { n.nNext = new NodeAVLDisk(this, in, i); n = n.nNext; } rowData = in.readData(table.getColumnTypes()); } RowAVLDisk(TableBase t) { super(t, (Object[]) null); } public NodeAVL insertNode(int index) { return null; } private void readRowInfo(RowInputInterface in) { // for use when additional transaction info is attached to rows } /** * Sets flag for Node data change. */ public synchronized void setNodesChanged() { hasNodesChanged = true; } public void updateAccessCount(int count) { accessCount = count; } public int getAccessCount() { return accessCount; } public int getStorageSize() { return storageSize; } public boolean isMemory() { return false; } /** * Sets the file position for the row * * @param pos position in data file */ public void setPos(long pos) { position = pos; } /** * Sets flag for row data change. */ public synchronized void setChanged(boolean changed) { hasDataChanged = changed; } public boolean isNew() { return isNew; } /** * Returns true if Node data has changed. * * @return boolean */ public synchronized boolean hasChanged() { return hasNodesChanged || hasDataChanged; } /** * Returns the Table to which this Row belongs. * * @return Table */ public TableBase getTable() { return table; } public void setStorageSize(int size) { storageSize = size; } /** * Returns true if any of the Nodes for this row is a root node. * Used only in Cache.java to avoid removing the row from the cache. * * @return boolean */ public synchronized boolean isKeepInMemory() { return keepCount > 0; } /** * Only unlinks nodes. Is not a destroy() method */ public void delete(PersistentStore store) { RowAVLDisk row = this; if (!row.keepInMemory(true)) { row = (RowAVLDisk) store.get(row, true); } super.delete(store); row.keepInMemory(false); } public void destroy() { NodeAVL n = nPrimaryNode; while (n != null) { NodeAVL last = n; n = n.nNext; last.nNext = null; } nPrimaryNode = null; } public synchronized boolean keepInMemory(boolean keep) { if (!isInMemory) { return false; } if (keep) { keepCount++; } else { keepCount--; if (keepCount < 0) { throw Error.runtimeError(ErrorCode.U_S0500, "RowAVLDisk - keep count"); } } return true; } public synchronized boolean isInMemory() { return isInMemory; } public synchronized void setInMemory(boolean in) { isInMemory = in; if (in) { return; } NodeAVL n = nPrimaryNode; while (n != null) { n.setInMemory(in); n = n.nNext; } } public void setNewNodes(PersistentStore store) { int indexcount = store.getAccessorKeys().length; nPrimaryNode = new NodeAVLDisk(this, 0); NodeAVL n = nPrimaryNode; for (int i = 1; i < indexcount; i++) { n.nNext = new NodeAVLDisk(this, i); n = n.nNext; } } public int getRealSize(RowOutputInterface out) { return out.getSize(this); } /** * Used exclusively by Cache to save the row to disk. New implementation in * 1.7.2 writes out only the Node data if the table row data has not * changed. This situation accounts for the majority of invocations as for * each row deleted or inserted, the Nodes for several other rows will * change. */ public void write(RowOutputInterface out) { writeNodes(out); if (hasDataChanged) { out.writeData(this, table.colTypes); out.writeEnd(); hasDataChanged = false; isNew = false; } } public void write(RowOutputInterface out, LongLookup lookup) { out.writeSize(storageSize); NodeAVL rownode = nPrimaryNode; while (rownode != null) { rownode.write(out, lookup); rownode = rownode.nNext; } out.writeData(this, table.colTypes); out.writeEnd(); } /** * Writes the Nodes, immediately after the row size. * * @param out * * @throws IOException */ void writeNodes(RowOutputInterface out) { out.writeSize(storageSize); NodeAVL n = nPrimaryNode; while (n != null) { n.write(out); n = n.nNext; } hasNodesChanged = false; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TransactionManager2PL.java0000644000175000017500000002273412007547374023720 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.persist.CachedObject; import org.hsqldb.persist.PersistentStore; /** * Manages rows involved in transactions * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 2.0.0 */ public class TransactionManager2PL extends TransactionManagerCommon implements TransactionManager { public TransactionManager2PL(Database db) { database = db; lobSession = database.sessionManager.getSysLobSession(); txModel = LOCKS; } public long getGlobalChangeTimestamp() { return globalChangeTimestamp.get(); } public boolean isMVRows() { return false; } public boolean isMVCC() { return false; } public int getTransactionControl() { return LOCKS; } public void setTransactionControl(Session session, int mode) { super.setTransactionControl(session, mode); } public void completeActions(Session session) { endActionTPL(session); } public boolean prepareCommitActions(Session session) { session.actionTimestamp = nextChangeTimestamp(); return true; } public boolean commitTransaction(Session session) { if (session.abortTransaction) { return false; } int limit = session.rowActionList.size(); Object[] list = session.rowActionList.getArray(); writeLock.lock(); try { // new actionTimestamp used for commitTimestamp session.actionTimestamp = nextChangeTimestamp(); session.transactionEndTimestamp = session.actionTimestamp; endTransaction(session); for (int i = 0; i < limit; i++) { RowAction action = (RowAction) list[i]; action.commit(session); } persistCommit(session, list, limit); endTransactionTPL(session); } finally { writeLock.unlock(); } session.tempSet.clear(); return true; } public void rollback(Session session) { session.abortTransaction = false; session.actionTimestamp = nextChangeTimestamp(); session.transactionEndTimestamp = session.actionTimestamp; rollbackPartial(session, 0, session.transactionTimestamp); endTransaction(session); writeLock.lock(); try { endTransactionTPL(session); } finally { writeLock.unlock(); } } public void rollbackSavepoint(Session session, int index) { long timestamp = session.sessionContext.savepointTimestamps.get(index); Integer oi = (Integer) session.sessionContext.savepoints.get(index); int start = oi.intValue(); while (session.sessionContext.savepoints.size() > index + 1) { session.sessionContext.savepoints.remove( session.sessionContext.savepoints.size() - 1); session.sessionContext.savepointTimestamps.removeLast(); } rollbackPartial(session, start, timestamp); } public void rollbackAction(Session session) { rollbackPartial(session, session.actionIndex, session.actionTimestamp); endActionTPL(session); } /** * rollback the row actions from start index in list and * the given timestamp */ void rollbackPartial(Session session, int start, long timestamp) { Object[] list = session.rowActionList.getArray(); int limit = session.rowActionList.size(); if (start == limit) { return; } for (int i = limit - 1; i >= start; i--) { RowAction action = (RowAction) list[i]; if (action == null || action.type == RowActionBase.ACTION_NONE || action.type == RowActionBase.ACTION_DELETE_FINAL) { continue; } Row row = action.memoryRow; if (row == null) { row = (Row) action.store.get(action.getPos(), false); } if (row == null) { continue; } action.rollback(session, timestamp); int type = action.mergeRollback(session, timestamp, row); action.store.rollbackRow(session, row, type, txModel); } session.rowActionList.setSize(start); } public RowAction addDeleteAction(Session session, Table table, Row row, int[] colMap) { RowAction action; synchronized (row) { action = RowAction.addDeleteAction(session, table, row, colMap); } session.rowActionList.add(action); PersistentStore store = table.getRowStore(session); store.delete(session, row); row.rowAction = null; return action; } public void addInsertAction(Session session, Table table, PersistentStore store, Row row, int[] changedColumns) { RowAction action = row.rowAction; if (action == null) { /* System.out.println("null insert action " + session + " " + session.actionTimestamp); */ throw Error.runtimeError(ErrorCode.GENERAL_ERROR, "null insert action "); } store.indexRow(session, row); session.rowActionList.add(action); row.rowAction = null; } // functional unit - accessibility of rows public boolean canRead(Session session, Row row, int mode, int[] colMap) { return true; } public boolean canRead(Session session, long id, int mode) { return true; } /** * add transaction info to a row just loaded from the cache. called only * for CACHED tables */ public void setTransactionInfo(CachedObject object) {} public void removeTransactionInfo(CachedObject object) {} public void beginTransaction(Session session) { if (!session.isTransaction) { session.actionTimestamp = nextChangeTimestamp(); session.transactionTimestamp = session.actionTimestamp; session.isTransaction = true; transactionCount++; } } /** * add session to the end of queue when a transaction starts * (depending on isolation mode) */ public void beginAction(Session session, Statement cs) { if (session.hasLocks(cs)) { return; } writeLock.lock(); try { if (cs.getCompileTimestamp() < database.schemaManager.getSchemaChangeTimestamp()) { cs = session.statementManager.getStatement(session, cs); session.sessionContext.currentStatement = cs; if (cs == null) { return; } } boolean canProceed = setWaitedSessionsTPL(session, cs); if (canProceed) { if (session.tempSet.isEmpty()) { lockTablesTPL(session, cs); // we don't set other sessions that would now be waiting for this one too // next lock release will do it } else { setWaitingSessionTPL(session); } } } finally { writeLock.unlock(); } } public void beginActionResume(Session session) { session.actionTimestamp = nextChangeTimestamp(); if (!session.isTransaction) { session.transactionTimestamp = session.actionTimestamp; session.isTransaction = true; transactionCount++; } return; } void endTransaction(Session session) { if (session.isTransaction) { session.isTransaction = false; transactionCount--; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ExpressionAccessor.java0000644000175000017500000001334612007547356023443 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HsqlList; import org.hsqldb.types.Type; /** * database object component access * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 2.0.0 */ public class ExpressionAccessor extends Expression { ExpressionAccessor(Expression left, Expression right) { super(OpTypes.ARRAY_ACCESS); nodes = new Expression[] { left, right }; } public ColumnSchema getColumn() { return nodes[LEFT].getColumn(); } public HsqlList resolveColumnReferences(Session session, RangeGroup rangeGroup, int rangeCount, RangeGroup[] rangeGroups, HsqlList unresolvedSet, boolean acceptsSequences) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } unresolvedSet = nodes[i].resolveColumnReferences(session, rangeGroup, rangeCount, rangeGroups, unresolvedSet, acceptsSequences); } return unresolvedSet; } public void resolveTypes(Session session, Expression parent) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { nodes[i].resolveTypes(session, this); } } if (nodes[LEFT].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (!nodes[LEFT].dataType.isArrayType()) { throw Error.error(ErrorCode.X_42563); } dataType = nodes[LEFT].dataType.collectionBaseType(); if (nodes[RIGHT].opType == OpTypes.DYNAMIC_PARAM) { nodes[RIGHT].dataType = Type.SQL_INTEGER; } } public Object getValue(Session session) { Object[] array = (Object[]) nodes[LEFT].getValue(session); if (array == null) { return null; } Number index = (Number) nodes[RIGHT].getValue(session); if (index == null) { return null; } if (index.intValue() < 1 || index.intValue() > array.length) { throw Error.error(ErrorCode.X_2202E); } return array[index.intValue() - 1]; } /** * Assignment result */ public Object[] getUpdatedArray(Session session, Object[] array, Object value, boolean copy) { if (array == null) { throw Error.error(ErrorCode.X_2200E); } Number index = (Number) nodes[RIGHT].getValue(session); if (index == null) { throw Error.error(ErrorCode.X_2202E); } int i = index.intValue() - 1; if (i < 0) { throw Error.error(ErrorCode.X_2202E); } if (i >= nodes[LEFT].dataType.arrayLimitCardinality()) { throw Error.error(ErrorCode.X_2202E); } Object[] newArray = array; if (i >= array.length) { newArray = new Object[i + 1]; System.arraycopy(array, 0, newArray, 0, array.length); } else if (copy) { newArray = new Object[array.length]; System.arraycopy(array, 0, newArray, 0, array.length); } newArray[i] = value; return newArray; } public String getSQL() { StringBuffer sb = new StringBuffer(64); String left = getContextSQL(nodes[LEFT]); sb.append(left).append('['); sb.append(nodes[RIGHT].getSQL()).append(']'); return sb.toString(); } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(64); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } sb.append("ARRAY ACCESS"); if (getLeftNode() != null) { sb.append(" array=["); sb.append(nodes[LEFT].describe(session, blanks + 1)); sb.append(']'); } if (getRightNode() != null) { sb.append(" array_index=["); sb.append(nodes[RIGHT].describe(session, blanks + 1)); sb.append(']'); } return sb.toString(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/auth/0000755000175000017500000000000012007570422017676 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/auth/HsqldbSlaveAuthBean.java0000644000175000017500000001540712007547376024404 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.auth; import java.util.Set; import java.sql.SQLException; import java.sql.Connection; import java.sql.DriverManager; import org.hsqldb.lib.FrameworkLogger; /** * Delegates authentication decisions, and optionally determination of user * roles and schema, to a different HyperSQL catalog, which may be in the same * JVM or remote. * * For now, at least, this class uses DriverManager to make the ephemeral * database connections. * * @see AuthFunctionBean * @author Blaine Simpson (blaine dot simpson at admc dot com) * @since 2.0.1 */ public class HsqldbSlaveAuthBean implements AuthFunctionBean { private static FrameworkLogger logger = FrameworkLogger.getLog(HsqldbSlaveAuthBean.class); private String masterJdbcUrl, validationUser, validationPassword; private boolean delegateRolesSchema = true; protected boolean initialized; /** * Use this method and setValidationPassword if you want access to the * master database to be verified upon instance initialization. */ public void setValidationUser(String validationUser) { this.validationUser = validationUser; } /** * Use this method and setValidationUser if you want access to the * master database to be verified upon instance initialization. */ public void setValidationPassword(String validationPassword) { this.validationPassword = validationPassword; } public void setMasterJdbcUrl(String masterJdbcUrl) { this.masterJdbcUrl = masterJdbcUrl; } /** * Defaults to true. * * Whether roles and initial schema for the new session will be determined * by what they are for this user in the master database. */ public void setDelegateRolesSchema(boolean doDelegateRolesSchema) { delegateRolesSchema = doDelegateRolesSchema; } public HsqldbSlaveAuthBean() { // Intentionally empty } /** * @throws IllegalStateException if any required setting has not been set. * @throws SQLException if properties 'validationUser' and * 'validationPassword' have been set, but we fail to connect to the * master database. */ public void init() throws SQLException { if (masterJdbcUrl == null) { throw new IllegalStateException( "Required property 'masterJdbcUrl' not set"); } if (validationUser != null || validationPassword != null) { if (validationUser == null || validationPassword == null) { throw new IllegalStateException( "If you set one property of 'validationUser' or " + "'validationPassword', then you must set both."); } Connection c = null; SQLException problem = null; try { c = DriverManager.getConnection( masterJdbcUrl, validationUser, validationPassword); } catch (SQLException se) { logger.error("Master/slave Connection validation failure", se); problem = se; // Just indicates to let the original exception // percolate through in the finally block, to prevent an // exception in the finally block from obscuring the ultimate // cause of the problem. } finally { if (c != null) try { c.close(); c = null; // Encourage GC } catch (SQLException nestedSe) { logger.error( "Failed to close test master/slave Connection", nestedSe); if (problem == null) { throw nestedSe; } } } } initialized = true; } /** * @see AuthFunctionBean#authenticate(String, String) */ public String[] authenticate(String userName, String password) throws DenyException { if (!initialized) { throw new IllegalStateException( "You must invoke the 'init' method to initialize the " + HsqldbSlaveAuthBean.class.getName() + " instance."); } Connection c = null; try { c = DriverManager.getConnection(masterJdbcUrl, userName, password); if (delegateRolesSchema) { Set schemaAndRoles = AuthUtils.getEnabledRoles(c); String schemaOnMaster = AuthUtils.getInitialSchema(c); if (schemaOnMaster != null) { schemaAndRoles.add(schemaOnMaster); } logger.finer("Slave delegating schema+roles: " + schemaAndRoles); return schemaAndRoles.toArray(new String[0]); } return null; } catch (SQLException se) { throw new DenyException(); } finally { if (c != null) try { c.close(); c = null; // Encourage GC } catch (SQLException nestedSe) { logger.severe( "Failed to close master/slave Connection", nestedSe); } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/auth/AuthBeanMultiplexer.java0000644000175000017500000002646012007547376024507 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.auth; import java.util.Map; import java.util.List; import java.util.HashMap; import java.util.ArrayList; import java.util.Collections; import java.sql.Connection; import java.sql.SQLException; import java.sql.ResultSet; import org.hsqldb.jdbc.JDBCArrayBasic; import org.hsqldb.types.Type; import org.hsqldb.lib.FrameworkLogger; /** * This class provides a method which can be used directly as a HyperSQL static * Java function method. * Manages a set of AuthFunctionBean implementations * * @author Blaine Simpson (blaine dot simpson at admc dot com) * @since 2.0.1 */ public class AuthBeanMultiplexer { private static FrameworkLogger logger = FrameworkLogger.getLog(AuthBeanMultiplexer.class); /** * This sole constructor is purposefully private, so users or frameworks * that want to work with instances will be forced to use the singleton * instead of creating useless extra instance copies. */ private AuthBeanMultiplexer() { // Intentionally empty } private static AuthBeanMultiplexer singleton = new AuthBeanMultiplexer(); /** * @see #setAuthFunctionBeans(List) */ private static Map> beans = new HashMap>(); public static AuthBeanMultiplexer getSingleton() { return singleton; } /** * Clear the set of AuthFunctionBeans */ public void clear() { AuthBeanMultiplexer.beans.clear(); } /** * Primary purpose of this class is to manage this static map. * From dbNames to ordered-lists-of-AuthFunctionBeans. * This is not an "adder" function, but a "setter" function, so do not use * this to add to a partial set, but to assign the entire set. *

              * The given entries are copied, to limit side-effects and concurrency * issues. *

              */ public void setAuthFunctionBeans( Map> authFunctionBeanMap) { if (AuthBeanMultiplexer.beans.size() > 0) throw new IllegalStateException( "Use setAuthFunctionBeans(Map) only when the set is empty"); AuthBeanMultiplexer.beans.putAll(authFunctionBeanMap); } protected static String getUniqueNameFor(Connection c) throws SQLException { ResultSet rs = c.createStatement().executeQuery("CALL database_name()"); try { if (!rs.next()) { throw new SQLException( "Engine did not reveal unique database name"); } return rs.getString(1); } finally { if (rs != null) try { rs.close(); } catch (SQLException se) { logger.error( "Failed to close ResultSet for retrieving db name"); } rs = null; // Encourage GC } } /** * Wrapper for setAuthFunctioNBeans(String, List) * * @param c An open Connection to the desired database. * @throws SQLException if failed to obtain unique name from given * Connection. */ public void setAuthFunctionBeans(Connection c, List authFunctionBeans) throws SQLException { setAuthFunctionBeans(getUniqueNameFor(c), authFunctionBeans); } /** * This is not an "adder" function, but a "setter" function for the * specified dbName , so do not use this to add to a database's * FunctionBeans, but to assign the entire list for that database. *

              * The given entries are copied, to limit side-effects and concurrency * issues. *

              * Use this method instead of setAuthFunctionBean(String, AuthFunctionBean) * in order to set up multiple authenticators for a single database for * redundancy purposes. *

              * * @see #setAuthFunctionBeans(Map) * @see #setAuthFunctionBean(String, AuthFunctionBean) */ public void setAuthFunctionBeans(String dbName, List authFunctionBeans) { if (dbName == null || dbName.length() != 16) { throw new IllegalArgumentException( "Database name not exactly 16 characters long: " + dbName); } List dbsBeans = AuthBeanMultiplexer.beans.get(dbName); if (dbsBeans == null) { dbsBeans = new ArrayList(); AuthBeanMultiplexer.beans.put(dbName, dbsBeans); } else { if (dbsBeans.size() > 0) throw new IllegalStateException( "Use setAuthFunctionBeans(String, List) only when the " + "db's AuthFunctionBean list is empty"); } dbsBeans.addAll(authFunctionBeans); } /** * Exactly the same as setAuthFunctionBeans(String, List) other than taking * an open Connection to identify the database. */ public void setAuthFunctionBean(Connection c, AuthFunctionBean authFunctionBean) throws SQLException { setAuthFunctionBeans(getUniqueNameFor(c), Collections.singletonList(authFunctionBean)); } /** * This is not an "adder" function, but a "setter" function for the * specified dbName , so do not use this to add to a database's * FunctionBeans, but to assign ths single given AuthFunctionBean as the * specified database's authenticator. *

              * To set up multiple authenticators for a single database for redundancy * purposes, use the method setAuthFunctionBeans(String, List) instead. *

              * * @see #setAuthFunctionBeans(String, List) */ public void setAuthFunctionBean(String dbName, AuthFunctionBean authFunctionBean) { setAuthFunctionBeans( dbName, Collections.singletonList(authFunctionBean)); } /** * HyperSQL Java Function Method. *

              * Registered AuthFunctionBeans matching the specified database and password * will be tried in order. *

                *
              1. If the AuthFunctionBean being tried throws a non-runtime Exception, * then that RuntimeException is passed through (re-thrown), resulting * in a SQLException for the authenticating application. *
              2. If the AuthFunctionBean being tried doesn't throw anything, then * the return value is passed through (returned) and HyperSQL will * allow access and set roles according to HyperSQL's authentication * function contract. *
              3. If the AuthFunctionBean being tried throws a RuntimeException, then * the next AuthFunctionBean in turn will be tried. * If all matching AuthFunctionBeans throw RuntimeExceptions, then the * first RuntimeException that was thrown will be passed through * (re-thrown), resulting in a SQLException for the authenticating * application. *
              4. If there are no AuthFunctionBeans registered for the specified * dbName, then this method will throw an IllegalArgumentException, * resulting in a SQLException for the authenticating application. *
              * * @see HyperSQL User Guide, System Management * chapter, Authentication Settings subsection. * @throws IllegalArgumentException if no AuthFunctionBean has been set for * specified dbName. * @throws RuntimeException if all matching AuthFunctionBeans threw * RuntimeExceptions. (This indicates that no matching * AuthFunctionBean functioned properly, not that authentication was * purposefully denied by any AuthFunctionBean). * @throws Exception (non-runtime). A matching AuthFunctionBean threw this * Exception. * @return Null or java.sql.Array to indicate successful authentication * according to the contract for HyperSQL authentication functions. */ public static java.sql.Array authenticate( String database, String user, String password) throws Exception { /* This method both logs and throws because due to JDBC requirements, * the Exception messages will not make it to applications. * Though these messages won't make it to the end user, at least the * application adminster will have access to problem details. */ if (database == null || database.length() != 16) { throw new IllegalStateException("Internal problem. " + "Database name not exactly 16 characters long: " + database); } List beanList = AuthBeanMultiplexer.beans.get(database); if (beanList == null) { logger.error("Database '" + database + "' has not been set up with " + AuthBeanMultiplexer.class.getName()); throw new IllegalArgumentException("Database '" + database + "' has not been set up with " + AuthBeanMultiplexer.class.getName()); } Exception firstRTE = null; String[] beanRet; for (AuthFunctionBean nextBean : beanList) try { beanRet = nextBean.authenticate(user, password); return (beanRet == null) ? null : new JDBCArrayBasic(beanRet, Type.SQL_VARCHAR); } catch (RuntimeException re) { if (firstRTE == null) { firstRTE = re; } logger.error("System failure of an AuthFunctionBean: " + ((re.getMessage() == null) ? re.toString() : re.getMessage())); } catch (Exception e) { throw e; } throw firstRTE; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/auth/AuthUtils.java0000644000175000017500000000726112007547376022505 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.auth; import java.sql.Array; import java.sql.Connection; import java.util.Set; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; import java.util.HashSet; import org.hsqldb.jdbc.JDBCArrayBasic; import org.hsqldb.lib.FrameworkLogger; /** * Static external-auth-related utilities. * * @author Blaine Simpson (blaine dot simpson at admc dot com) * @since 2.0.1 */ public class AuthUtils { private static FrameworkLogger logger = FrameworkLogger.getLog(AuthUtils.class); /** * Do not instantiate an AuthUtils, because the only purpose of * this class is to provide static methods. */ private AuthUtils() { // Intentionally empty } static String getInitialSchema(Connection c) throws SQLException { ResultSet rs = c.createStatement().executeQuery( "SELECT initial_schema FROM information_schema.system_users\n" + "WHERE user_name = current_user"); try { if (!rs.next()) { throw new IllegalStateException( "Failed to retrieve initial_schema for current user"); } return rs.getString(1); } finally { if (rs != null) try { rs.close(); } catch (SQLException se) { logger.error("Failed " + "to close ResultSet for retrieving initial schema"); } rs = null; // Encourage GC } } static Set getEnabledRoles(Connection c) throws SQLException { Set roles = new HashSet(); ResultSet rs = c.createStatement().executeQuery( "SELECT * FROM information_schema.enabled_roles"); try { while (rs.next()) roles.add(rs.getString(1)); } finally { if (rs != null) try { rs.close(); } catch (SQLException se) { logger.error( "Failed to close ResultSet for retrieving db name"); } rs = null; // Encourage GC } return roles; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/auth/AuthFunctionBean.java0000644000175000017500000000602612007547376023756 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.auth; /** * N.b. AuthFunctionBeans are NOT directly usable as HyperSQL Authentication * Function methods, they are POJO beans to be managed by AuthBeanMultiplexer * (which does have a real HyperSQL Authentication Function static method). * * @see AuthBeanMultiplexer for how these beans are used. * @author Blaine Simpson (blaine dot simpson at admc dot com) * @since 2.0.1 */ public interface AuthFunctionBean { /** * Return a list of authorized roles or null to indicate that the * implementation does not intend to produce a specific role list but only * to indicate whether to allow access or not. * A return value of String[0] is different from returning null, and means * that the user should not be granted any roles. * * @throws Exception If user should not be allowed access to the specified * database. Other registed AuthFunctionBeans will not be attempted. * @throws RuntimeException Upon system problem. The exception will be * logged to the HyperSQL application logger and other registered * AuthFunctionBeans (if any) will be attempted. * @return null or String[] according to the contract of HyperSQL * authentication function contract, except that the role/schema * list is returned as a String[] instead of a java.sql.Array. */ public String[] authenticate( String userName, String password) throws Exception; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/auth/LdapAuthBean.java0000644000175000017500000007562012007547376023057 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.auth; import java.io.IOException; import java.io.File; import java.io.FileInputStream; import java.util.List; import java.util.ArrayList; import java.util.Arrays; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.util.Hashtable; import java.util.Properties; import javax.naming.AuthenticationException; import javax.naming.NamingException; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.directory.SearchResult; import javax.naming.directory.BasicAttributes; import javax.naming.directory.Attributes; import javax.naming.directory.Attribute; import javax.naming.ldap.StartTlsRequest; import javax.naming.ldap.StartTlsResponse; import javax.naming.ldap.LdapContext; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.ExtendedRequest; import javax.naming.ldap.ExtendedResponse; import org.hsqldb.lib.FrameworkLogger; /** * Authenticates to a HyperSQL catalog according to entries in a LDAP * database. * If using LDAP StartTLS and your server has a certificate not trusted by * default by your JRE, then set system property 'javax.net.ssl.trustStore' to * the path to a trust store containing the cert (as well as any other certs * that your app needs for other purposes). *

              * This class with authenticate login attempts against LDAP entries with RDN of * the HyperSQL account name (the precise attribute name defaults to 'uid', but * you may change that). *

              * This class purposefully does not support LDAPS, because LDAPS is deprecated * in favor of StartTLS, which we do support. * If you need to support LDAPS and are using SE 1.6, use our JaasAuthBean with * Sun's LdapLoginModule. *

              * This class does not support SASL/External authentication, because the work * involved with securely obtaining user-specific certs would be more complex * than everything else here combined. * Another AuthFunctionBean would have to be written if SASL/External is needed. *

              * To use instances of this class, you must use at least the methods * setLdapHost, setParentDn, initialize, plus * rolesSchemaAttribute and/or accessAttribute. *

              * For a user to be given HyperSQL catalog access, that user must either have * a value for accessAttribute if that property is set (optionally requiring * a match with accessValuePattern); or, if the accessAttribute is not set then * must have some (any) value for rolesSchemaAttribute (optionally requiring a * match with roleSchemaValuePattern). * Consequently, if you have set both accessAttribute and rolesSchemaAttribute, * the latter attribute will only be consulted if the check of the former * attribute succeeds. *

              * If you want roles assigned according to the local HyperSQL database instead * of according to LDAP, then set accessAttribute but not rolesSchemaAttribute. *

              * If what is wanted is to grant access but with no roles (overriding local * roles if there are any), then set both accessAttribute and * rolesSchemaAttribute, but do not set any rolesSchemaAttribute attribute * values for these no-role users. * (I hesitate to mention it, but you could accomplish the same thing with only * a rolesSchemaAttribute attribute, by setting only a dummy role/schema value * for non-role users, because HyperSQL will ignore unknown roles or schemas * but still give access since a list was still supplied). *

              * * @see AuthFunctionBean * @see #setLdapHost(String) * @see #setParentDn(String) * @see #init() * @author Blaine Simpson (blaine dot simpson at admc dot com) * @since 2.0.1 */ public class LdapAuthBean implements AuthFunctionBean { private static FrameworkLogger logger = FrameworkLogger.getLog(LdapAuthBean.class); private Integer ldapPort; private String ldapHost, principalTemplate, saslRealm, parentDn; private Pattern roleSchemaValuePattern, accessValuePattern; private String initialContextFactory = "com.sun.jndi.ldap.LdapCtxFactory"; private boolean tls; // This is for StartTLS, not tunneled TLS/LDAPS. // Variable named just "tls" only for brevity. private String mechanism = "SIMPLE"; private String rdnAttribute = "uid"; private boolean initialized; private String rolesSchemaAttribute, accessAttribute; protected String[] attributeUnion; /** * If this is set, then the entire (brief) transaction with the LDAP server * will be encrypted. */ public void setStartTls(boolean isTls) { this.tls = isTls; } public LdapAuthBean() { // Intentionally empty } public void setLdapPort(int ldapPort) { this.ldapPort = Integer.valueOf(ldapPort); } /** * @throws IllegalStateException if any required setting has not been set. */ public void init() { if (ldapHost == null) { throw new IllegalStateException( "Required property 'ldapHost' not set"); } if (parentDn == null) { throw new IllegalStateException( "Required property 'parentDn' not set"); } if (initialContextFactory == null) { throw new IllegalStateException( "Required property 'initialContextFactory' not set"); } if (mechanism == null) { throw new IllegalStateException( "Required property 'mechanism' not set"); } if (rdnAttribute == null) { throw new IllegalStateException( "Required property 'rdnAttribute' not set"); } if (rolesSchemaAttribute == null && accessAttribute == null) { throw new IllegalStateException( "You must set property 'rolesSchemaAttribute' " + "and/or property 'accessAttribute'"); } if (roleSchemaValuePattern != null && rolesSchemaAttribute == null) { throw new IllegalStateException( "If property 'roleSchemaValuePattern' is set, then you " + "must also set property 'rolesSchemaAttribute' to " + "indicate which attribute to evalueate"); } if (accessValuePattern != null && accessAttribute == null) { throw new IllegalStateException( "If property 'accessValuePattern' is set, then you " + "must also set property 'accessAttribute' to " + "indicate which attribute to evalueate"); } if (rolesSchemaAttribute != null && accessAttribute != null) { attributeUnion = new String[] { rolesSchemaAttribute, accessAttribute }; } else if (rolesSchemaAttribute != null) { attributeUnion = new String[] { rolesSchemaAttribute }; } else { attributeUnion = new String[] { accessAttribute }; } initialized = true; } /** * Assign a pattern to detect honored accessAttribute values. * If you set accessAttribute but not accessValuePattern, then all that will * be checked for access is if the RDN + parentDN entry has the * accessAttribute attribute. (I.e. the specific value will not matter * whatsoever). *

              * You may only use this property if you have set property accessAttribute. * If you have set accessAttribute but not this property, then access will * be decided based solely upon existence of this attribute. *

              * Capture groups in the pattern will be ignored and serve no purpose. *

              * N.b. this Pattern will be used for the matches() operation, therefore it * must match the entire candidate value strings (this is different than * the find operation which does not need to satisfy the entire candidate * value). *

              Example1 :

                   *     TRUE
                   * 
              * This will match true values per OpenLDAP's boolean OID. *

              * * @see Matcher#matches() */ public void setAccessValuePattern(Pattern accessValuePattern) { this.accessValuePattern = accessValuePattern; } /** * String wrapper for method setAccessValuePattern(Pattern) * * Use the (x?) Pattern constructs to set options. * * @throws java.util.regex.PatternSyntaxException * @see #setAccessValuePattern(Pattern) */ public void setAccessValuePatternString(String patternString) { setAccessValuePattern(Pattern.compile(patternString)); } /** * Assign a pattern to both detect honored values, and to map from a single * value of "rolesSchemaAttribute"s to a HyperSQL role or schema string. * If your rolesSchemaAttribute holds only the String values precisely as * HyperSQL needs them, then don't use this method at all and all matching * attribute values will be passed directly. *

              * You may only use this property if you have set property * rolesSchemaAttribute. * If rolesSchemaAttribute is set but this property is not set, then * the value will directly determine the user's roles and schema. *

              * Unlike the rolesSchemaAttribute, the property at-hand uses the * singular for "role", because whereas rolesSchemaAttribute is the * attribute for listing multiple roles, roleSchemaValuePattern is used * to evaluate single role values. *

              * These are two distinct and important purposes for the specified Pattern. *

                *
              1. * Values that do not successfully match the pattern will be ignored. *
              2. * Optionally uses parentheses to specify a single capture group * (if you use parentheses to specify more than one matching group, we * will only capture for the first). * What is captured by this group is exactly the role or schema that * HyperSQL will attempt to assign. * If no capture parens are given then the Pattern is only used for the * acceptance decision, and the LDAP-provided value will be returned * verbatim. *
              *

              * Together, these two features work great to extract just the needed role * and schema names from 'memberof' DNs, and will have no problem if you * also use 'memberof' for unrelated purposes. *

              * N.b. this Pattern will be used for the matches() operation, therefore it * must match the entire candidate value strings (this is different than * the find operation which does not need to satisfy the entire candidate * value). *

              Example1 :

                   *     cn=([^,]+),ou=dbRole,dc=admc,dc=com
                   * 
              * will extract the CN value from matching attribute values. *

              Example1 :

                   *     cn=[^,]+,ou=dbRole,dc=admc,dc=com
                   * 
              * will return the entire cn...com string for matching * attribute values. *

              * * @see Matcher#matches() */ public void setRoleSchemaValuePattern(Pattern roleSchemaValuePattern) { this.roleSchemaValuePattern = roleSchemaValuePattern; } /** * String wrapper for method setRoleSchemaValuePattern(Pattern) * * Use the (x?) Pattern constructs to set options. * * @throws java.util.regex.PatternSyntaxException * @see #setRoleSchemaValuePattern(Pattern) */ public void setRoleSchemaValuePatternString(String patternString) { setRoleSchemaValuePattern(Pattern.compile(patternString)); } /** * Defaults to "SIMPLE". * * @param mechanism Either 'SIMPLE' (the default) for LDAP Simple, or * one of the LDAP SASL mechamisms, such as 'DIGEST-MD5'. */ public void setSecurityMechanism(String mechanism) { this.mechanism = mechanism; } /** * Do not specify URL scheme ("ldap:") because that is implied. * (Since we purposefully don't support LDAPS, there would be no reason to * change that). *

              * If using StartTLS, then this host name must match the cn of the LDAP * server's certificate. *

              * If you need to support LDAPS and are using SE 1.6, use our JaasAuthBean * with Sun's LdapLoginModule instead of this class. *

              * * @see JaasAuthBean */ public void setLdapHost(String ldapHost) { this.ldapHost = ldapHost; } /** * A template String containing place-holder token '${username}'. * All occurrences of '${username}' (without the quotes) will be translated * to the username that authentication is being attempted with. *

              * If you supply a principalTemplate that does not contain '${username}', * then authentication will be user-independent. *

              * It is common to authenticate to LDAP servers with the DN of the user's * LDAP entry. In this situation, set principalTemplate to * <RDN_ATTR=>${username},<PARENT_DN>. * For example if you use parentDn of * "ou=people,dc=admc,dc=com" and rdnAttribute of * uid, then you would set

                   *     "uid=${username},ou=people,dc=admc,dc=com"
                   * 
              *

              * By default the user name will be passed exactly as it is, so don't use * this setter if that is what you want. (This works great for OpenLDAP * with DIGEST-MD5 SASL, for example). *

              */ public void setPrincipalTemplate(String principalTemplate) { this.principalTemplate = principalTemplate; } /** * Most users should not call this, and will get the default of * "com.sun.jndi.ldap.LdapCtxFactory". * Use this method if you prefer to use a context factory provided by your * framework or container, for example, or if you are using a non-Sun JRE. */ public void setInitialContextFactory(String initialContextFactory) { this.initialContextFactory = initialContextFactory; } /** * Some LDAP servers using a SASL mechanism require a realm to be specified, * and some mechanisms allow a realm to be specified if you wish to use that * feature. * By default no realm will be sent to the LDAP server. *

              * Don't use this setter if you are not setting a SASL mechanism. *

              */ public void setSaslRealm(String saslRealm) { this.saslRealm = saslRealm; } /** * Set DN which is parent of the user DNs. * E.g. "ou=people,dc=admc,dc=com" */ public void setParentDn(String parentDn) { this.parentDn = parentDn; } /** * rdnAttribute must hold the user name exactly as the HyperSQL login will * be made with. *

              * This is the RDN relative to the Parent DN specified with setParentDN. * Defaults to 'uid'. *

              * * @see #setParentDn(String) */ public void setRdnAttribute(String rdnAttribute) { this.rdnAttribute = rdnAttribute; } /** * Set the attribute name of the RDN + parentDn entries in which is stored * the list of roles and optional schema for the authenticating user. *

              * There is no default. You must set this attribute if you want LDAP * instead of the local HyperSQL database to determine the user's roles! * You must set the rolesSchemaAttribute property and/or the * accessAttribute property. * Consequently, if you do no tset this property, then you must set the * accessAttribute property, and this LdapAuthBean will only determine * access not roles. *

              * To use the nice reverse group membership feature of LDAP, set * this value to "memberof". *

              * If you have set both rolesSchemaAttribute and this value, then the * attribute set here will only be consulted if the accessAttribute check * succeeds. *

              */ public void setRolesSchemaAttribute(String attribute) { rolesSchemaAttribute = attribute; } /** * Set the attribute name of the RDN + parentDn entries which will be * consulted to decide whether the user can access the HyperSQL database. *

              * There is no default. If you set this attribute, then the attribute will * determine whether the user can access the HyperSQL database, regardless * of whether the rolesSchemaAttribute attribute is set. *

              * If you set just this property, then the local HyperSQL database will * decide all roles for the user. If you set this property and propety * rolesSchemaAttribute then this attribute will determine access, and if * this attribute grants access then the rolesSchemaAttribute value will * determine the user's roles. *

              */ public void setAccessAttribute(String attribute) { accessAttribute = attribute; } /** * @see AuthFunctionBean#authenticate(String, String) */ public String[] authenticate(String userName, String password) throws DenyException { if (!initialized) { throw new IllegalStateException( "You must invoke the 'init' method to initialize the " + LdapAuthBean.class.getName() + " instance."); } Hashtable env = new Hashtable(5, 0.75f); env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory); env.put(Context.PROVIDER_URL, "ldap://" + ldapHost + ((ldapPort == null) ? "" : (":" + ldapPort))); StartTlsResponse tlsResponse = null; LdapContext ctx = null; try { ctx = new InitialLdapContext(env, null); if (tls) { // Requesting to start TLS on an LDAP association tlsResponse = (StartTlsResponse) ctx.extendedOperation( new StartTlsRequest()); // Starting TLS tlsResponse.negotiate(); } // A TLS/SSL secure channel has been established if you reach here. // Assertion of client's authorization Identity -- Explicit way ctx.addToEnvironment(Context.SECURITY_AUTHENTICATION, mechanism); ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, ((principalTemplate == null) ? userName : principalTemplate.replace("${username}", userName))); ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password); if (saslRealm != null) { env.put("java.naming.security.sasl.realm", saslRealm); } // The Context.SECURITY_* authorizations are only applied when the // following statement executes. (Or any other remote operations done // while the TLS connection is still open). NamingEnumeration sRess = null; try { sRess = ctx.search(parentDn, new BasicAttributes(rdnAttribute, userName), attributeUnion); } catch (AuthenticationException ae) { throw new DenyException(); } catch (Exception e) { throw new RuntimeException(e); } if (!sRess.hasMore()) { throw new DenyException(); } SearchResult sRes = sRess.next(); if (sRess.hasMore()) { throw new RuntimeException("> 1 result"); } Attributes attrs = sRes.getAttributes(); if (accessAttribute != null) { Attribute attribute = attrs.get(accessAttribute); if (attribute == null) { throw new DenyException(); } if (attribute.size() != 1) { throw new RuntimeException("Access attribute '" + accessAttribute + "' has unexpected value count: " + attribute.size()); } if (accessValuePattern != null) { Object accessValue = attribute.get(0); if (accessValue == null) { throw new RuntimeException( "Access Attr. value is null"); } if (!(accessValue instanceof String)) { throw new RuntimeException("Access Attr. value " + "not a String: " + accessValue.getClass().getName()); } if (!accessValuePattern.matcher( (String) accessValue).matches()) { throw new DenyException(); } } } if (rolesSchemaAttribute == null) { return null; } // If we reach here, then we definitely need to try to return a // list of roles + schema. List returns = new ArrayList(); Attribute attribute = attrs.get(rolesSchemaAttribute); if (attribute != null) { int valCount = attribute.size(); Matcher matcher; Object oneVal; for (int i = 0; i < valCount; i++) { oneVal = attribute.get(i); if (oneVal == null) { throw new RuntimeException( "R/S Attr value #" + i + " is null"); } if (!(oneVal instanceof String)) { throw new RuntimeException( "R/S Attr value #" + i + " not a String: " + oneVal.getClass().getName()); } if (roleSchemaValuePattern == null) { returns.add((String) oneVal); } else { matcher = roleSchemaValuePattern.matcher( (String) oneVal); if (matcher.matches()) { returns.add((matcher.groupCount() > 0) ? matcher.group(1) : (String) oneVal); } } } } if (returns.size() < 1) { if (accessAttribute == null) { throw new DenyException(); } return new String[0]; } return returns.toArray(new String[0]); } catch (DenyException de) { // This throws a non-runtime Exception, which is handled as an // access denial instead of a system problem. throw de; } catch (RuntimeException re) { throw re; } catch (IOException ioe) { throw new RuntimeException(ioe); } catch (NamingException ne) { throw new RuntimeException(ne); } finally { if (tlsResponse != null) try { tlsResponse.close(); } catch (IOException ioe) { logger.error("Failed to close TLS Response", ioe); } if (ctx != null) try { ctx.close(); } catch (NamingException ne) { logger.error("Failed to close LDAP Context", ne); } } } /** * Run this method to try and test configuration settings for LdapAuthBeans, * or to troubleshoot. * It purposefully does not test the Java Function or the JDBC layer at all. * This program will attempt to retrieve and display the schema/roles list * for the specified user and with the specified password from the LDAP * server according to the specified properties. *

              * Passwords typed on the command line are inherently not secure, so only * use this program when the computer it is run on is secured and where * your command line may not be observed, directly or indirectly, by others. *

              * Set the properties in a properties file to match your LDAP security and * Directory Information Tree structure and use this program to check * everything between the LdapAuthBean and your LDAP server. * You then know the exact settings to use for an LdapAuthBean that you can * plug into AuthBeanMultiplexer. *

              * Run with no arguments to see required syntax. *

              * The property file may contain any of the following properties, which * exactly match the corresponding setter methods in this class. *

                *
              • trustStore. This is the only property without a corresponding * setter method. Setting this property has the same effect as * setting Java system property * 'javax.net.ssl.trustStore'. *
              • startTls. Takes a boolean value according to * method java.util.Boolean.parseBoolean. *
              • roleSchemaValuePattern. Correponds to method * setRoleSchemaValuePatternString *
              • accessValuePattern. Correponds to method * setAccessValuePatternString *
              • ldapPort *
              • securityMechanism *
              • ldapHost *
              • principalTemplate *
              • initialContextFactory *
              • saslRealm *
              • parentDn *
              • rdnAttribute *
              • rolesSchemaAttribute *
              • accessAttribute *
              * Tokens like ${this} will not be expanded to system property values, * and your bean will get the values exactly as you type them in. *

              * The file sample/ldap-exerciser.properties in the HyperSQL distribution * may be used as a template or example. *

              */ public static void main(String[] sa) throws IOException { if (sa.length != 3) { throw new IllegalArgumentException( "SYNTAX: java " + AuthBeanMultiplexer.class.getName() + " path/to/file.properties "); } File file = new File(sa[0]); if (!file.isFile()) { throw new IllegalArgumentException( "Not a file: " + file.getAbsolutePath()); } Properties p = new Properties(); p.load(new FileInputStream(file)); String trustStore = p.getProperty("trustStore"); String startTlsString = p.getProperty("startTls"); String ldapPortString = p.getProperty("ldapPort"); String roleSchemaValuePatternString = p.getProperty("roleSchemaValuePattern"); String accessValuePatternString = p.getProperty("accessValuePattern"); String securityMechanism = p.getProperty("securityMechanism"); String ldapHost = p.getProperty("ldapHost"); String principalTemplate = p.getProperty("principalTemplate"); String initialContextFactory = p.getProperty("initialContextFactory"); String saslRealm = p.getProperty("saslRealm"); String parentDn = p.getProperty("parentDn"); String rdnAttribute = p.getProperty("rdnAttribute"); String rolesSchemaAttribute = p.getProperty("rolesSchemaAttribute"); String accessAttribute = p.getProperty("accessAttribute"); if (trustStore != null) { if (!(new File(trustStore)).isFile()) { throw new IllegalArgumentException( "Specified trust store is not a file: " + trustStore); } System.setProperty("javax.net.ssl.trustStore", trustStore); } LdapAuthBean bean = new LdapAuthBean(); if (startTlsString != null) { bean.setStartTls(Boolean.parseBoolean(startTlsString)); } if (ldapPortString != null) { bean.setLdapPort(Integer.parseInt(ldapPortString)); } if (roleSchemaValuePatternString != null) { bean.setRoleSchemaValuePatternString(roleSchemaValuePatternString); } if (accessValuePatternString != null) { bean.setAccessValuePatternString(accessValuePatternString); } if (securityMechanism != null) { bean.setSecurityMechanism(securityMechanism); } if (ldapHost != null) { bean.setLdapHost(ldapHost); } if (principalTemplate != null) { bean.setPrincipalTemplate(principalTemplate); } if (initialContextFactory != null) { bean.setInitialContextFactory(initialContextFactory); } if (saslRealm != null) { bean.setSaslRealm(saslRealm); } if (parentDn != null) { bean.setParentDn(parentDn); } if (rdnAttribute != null) { bean.setRdnAttribute(rdnAttribute); } if (rolesSchemaAttribute != null) { bean.setRolesSchemaAttribute(rolesSchemaAttribute); } if (accessAttribute != null) { bean.setAccessAttribute(accessAttribute); } bean.init(); String[] res = null; try { res = bean.authenticate(sa[1], sa[2]); } catch (DenyException de) { System.out.println(""); return; } if (res == null) { System.out.println(""); } else { System.out.println(Integer.toString(res.length) + " Roles/Schema: " + Arrays.toString(res)); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/auth/DenyException.java0000644000175000017500000000337412007547376023342 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.auth; /** * @author Blaine Simpson (blaine dot simpson at admc dot com) * @since 2.0.1 */ public class DenyException extends Exception { // Intentionally empty } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/auth/JaasAuthBean.java0000644000175000017500000003110612007547376023044 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.auth; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import java.util.regex.Matcher; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import javax.security.auth.callback.Callback; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.PasswordCallback; import javax.security.auth.callback.UnsupportedCallbackException; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.Subject; import java.security.Principal; import org.hsqldb.lib.FrameworkLogger; /** * Provides authentication and authorization (roles and initial schema) * according to JAAS modules configured by the runtime JAAS implementation. *

              * JAAS modules used must have both a NameCallback and a PasswordCallback. * This is how we pass the JDBC-provided user name and password to the module. *

              * JAAS setup is Java-implementation-specific. * For Sun Java, you set up a JAAS configuration file which resides at * $HOME/.java.login.config or at the location that you set with * Java system property java.security.auth.login.config. *

              * You can use this bean to manage just access, or also to manage roles or * initial schemas. * To use for roles or initial schemas, you must set the roleSchemaValuePattern * property to distinguish which of the JAAS-module-provided values to use. * By default, all JAAS-module-provided Principles will be candidates. * If you set property roleSchemaViaCredential to true, then all * JAAS-module-provided public Credentials will be candidates instead. *

              * * @see AuthFunctionBean * @see NameCallback * @see PasswordCallback * @author Blaine Simpson (blaine dot simpson at admc dot com) * @since 2.0.1 */ public class JaasAuthBean implements AuthFunctionBean { private static FrameworkLogger logger = FrameworkLogger.getLog(JaasAuthBean.class); private boolean initialized; private String applicationKey; private Pattern roleSchemaValuePattern; private boolean roleSchemaViaCredential; public JaasAuthBean() { // Intentionally empty } /** * By default, If roleSchemaValuePattern is set, then role and schema * values are obtained from principle values; otherwise existing account * privileges are used (if any). * If roleSchemaViaCredential is set to true and roleSchemaValuePattern is * set, then credential values will be used instead. *

              * Do not set roleSchemaViaCredential to true unless roleSchemaValuePattern * is set. *

              */ public void setRoleSchemaViaCredential(boolean roleSchemaViaCredential) { this.roleSchemaViaCredential = roleSchemaViaCredential; } /** * @throws IllegalStateException if any required setting has not been set. */ public void init() { if (applicationKey == null) { throw new IllegalStateException( "Required property 'applicationKey' not set"); } if (roleSchemaViaCredential && roleSchemaValuePattern == null) { throw new IllegalStateException( "Properties 'roleSchemaViaCredential' and " + "'roleSchemaValuePattern' are mutually exclusive. " + "If you want JaasAuthBean to manage roles or schemas, " + "you must set property 'roleSchemaValuePattern'."); } initialized = true; } /** * Set the key into the JAAS runtime configuration. * * For Sun's JAAS implementation, this is the "application" identifier for * a stanza in the JAAS configuration file. */ public void setApplicationKey(String applicationKey) { this.applicationKey = applicationKey; } /** * Assign a pattern to both detect honored values, and optionally * to map from a single principal name or public credential string * to a single HyperSQL role or schema string. * Do not use this method if you are using this JaasAuthBean only to * permit or reject access (with roles and schema being determined by * pre-existing local HyperSQL accounts). * On that case, simple success of the login() method method will allow * access as the specified user. *

              * If every principal name or public credentials holds only the String * values precisely as HyperSQL needs them, then set the pattern to ".+". * For example, if the JAAS module returns principals (or credentials) with * values "one", "two", "three", then if you set this pattern to ".+", * HyperSQL will attempt to assign initial schema and roles for the values * "one", "two", and "three". *

              * These are two distinct and important purposes for the specified Pattern. *

                *
              1. * Values that do not successfully match the pattern will be ignored. * If the pattern does match, then the entire principal or credential * value will be used to assign initial schema or role (as long as it * is a valid schema name or role name in the local database). *
              2. * Optionally uses parentheses to specify a single capture group * (if you use parentheses to specify more than one matching group, we * will only capture for the first). * What is captured by this group is exactly the role or schema that * HyperSQL will attempt to assign. * If no capture parens are given then the Pattern is only used for the * acceptance decision, and the JAAS-provided value will be returned * verbatim. *
              *

              * N.b. this Pattern will be used for the matches() operation, therefore it * must match the entire candidate value strings (this is different than * the find operation which does not need to satisfy the entire candidate * value). *

              Example1 :

                   *     cn=([^,]+),ou=dbRole,dc=admc,dc=com
                   * 
              * will extract the CN value from matching attribute values. *

              Example1 :

                   *     cn=[^,]+,ou=dbRole,dc=admc,dc=com
                   * 
              * will return the entire cn...com string for matching * attribute values. *

              * * @see Matcher#matches() */ public void setRoleSchemaValuePattern(Pattern roleSchemaValuePattern) { this.roleSchemaValuePattern = roleSchemaValuePattern; } /** * String wrapper for method setRoleSchemaValuePattern(Pattern) * * Use the (x?) Pattern constructs to set options. * * @throws java.util.regex.PatternSyntaxException * @see #setRoleSchemaValuePattern(Pattern) */ public void setRoleSchemaValuePatternString(String patternString) { setRoleSchemaValuePattern(Pattern.compile(patternString)); } public static class UPCallbackHandler implements CallbackHandler { private String u; private char[] p; public UPCallbackHandler(String u, String pString) { this.u = u; p = pString.toCharArray(); } public void handle(Callback[] callbacks) throws UnsupportedCallbackException { boolean didSetName = false; boolean didSetPassword = false; for (Callback cb : callbacks) if (cb instanceof NameCallback) { ((NameCallback) cb).setName(u); didSetName = true; } else if (cb instanceof PasswordCallback) { ((PasswordCallback) cb).setPassword(p); didSetPassword = true; } else { throw new UnsupportedCallbackException(cb, "Unsupported Callback type: " + cb.getClass().getName()); } if (!didSetName) throw new IllegalStateException( "Supplied Callbacks does not include a NameCallback"); if (!didSetPassword) throw new IllegalStateException("Supplied Callbacks " + "does not include a PasswordCallback"); } } /** * @see AuthFunctionBean#authenticate(String, String) */ public String[] authenticate(String userName, String password) throws DenyException { if (!initialized) { throw new IllegalStateException( "You must invoke the 'init' method to initialize the " + JaasAuthBean.class.getName() + " instance."); } try { LoginContext lc = new LoginContext(applicationKey, new UPCallbackHandler(userName, password)); try { lc.login(); } catch (LoginException le) { // I wish there were a way to distinguish system problems from // purposeful rejections here. :-( logger.finer("JSSE backend denying access: " + le); throw new DenyException(); } try { if (roleSchemaValuePattern == null) { return null; } int i = 0; Matcher m = null; List rsCandidates = new ArrayList(); List rsList = new ArrayList(); Subject s = lc.getSubject(); if (roleSchemaViaCredential) { for (Object cred : new ArrayList(s.getPublicCredentials())) { rsCandidates.add(cred.toString()); } } else { for (Principal p : new ArrayList(s.getPrincipals())) { rsCandidates.add(p.getName()); } } logger.finer(Integer.toString(rsCandidates.size()) + " candidate " + (roleSchemaViaCredential ? "Credentials" : "Principals")); for (String candid : rsCandidates) { m = roleSchemaValuePattern.matcher(candid); if (m.matches()) { logger.finer(" +" + ++i + ": " + ((m.groupCount() > 0) ? m.group(1) : candid)); rsList.add((m.groupCount() > 0) ? m.group(1) : candid); } else { logger.finer(" -" + ++i + ": " + candid); } } return rsList.toArray(new String[0]); } finally { lc.logout(); } } catch (LoginException le) { logger.severe("System JaasAuthBean failure", le); throw new RuntimeException(le); // JAAS System failure } catch (RuntimeException re) { logger.severe("System JaasAuthBean failure", re); throw re; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/package.html0000644000175000017500000000030512007547362021223 0ustar renerene Contains basic HyperSQL engine classes. See the HyperSQL User Guide for details about HyperSQL database hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TableUtil.java0000644000175000017500000000777112007547370021507 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.types.Type; /* * Utility functions to set up special tables. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public class TableUtil { static Table newSingleColumnTable(Database database, HsqlName tableName, int tableType, HsqlName colName, Type colType) { TableDerived table; table = new TableDerived(database, tableName, tableType); ColumnSchema column = new ColumnSchema(colName, colType, false, true, null); table.addColumn(column); table.createPrimaryKeyConstraint(table.getName(), new int[]{ 0 }, true); return table; } static void setTableIndexesForSubquery(Table table, boolean fullIndex, boolean uniqueRows) { int[] cols = null; if (fullIndex) { cols = new int[table.getColumnCount()]; ArrayUtil.fillSequence(cols); } table.createPrimaryKey(null, uniqueRows ? cols : null, false); if (uniqueRows) { table.fullIndex = table.getPrimaryIndex(); } else if (fullIndex) { table.fullIndex = table.createIndexForColumns(null, cols); } } public static void addAutoColumns(Table table, Type[] colTypes) { for (int i = 0; i < colTypes.length; i++) { ColumnSchema column = new ColumnSchema(HsqlNameManager.getAutoColumnName(i), colTypes[i], true, false, null); table.addColumnNoCheck(column); } } public static void setColumnsInSchemaTable(Table table, HsqlName[] columnNames, Type[] columnTypes) { for (int i = 0; i < columnNames.length; i++) { HsqlName columnName = columnNames[i]; columnName = table.database.nameManager.newColumnSchemaHsqlName( table.getName(), columnName); ColumnSchema column = new ColumnSchema(columnName, columnTypes[i], true, false, null); table.addColumn(column); } table.setColumnStructures(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/RoutineSchema.java0000644000175000017500000002345012007547376022366 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.rights.Grantee; import org.hsqldb.types.NumberType; import org.hsqldb.types.Type; /** * Implementation of SQL procedure and functions * * @author Fred Toussi (fredt@users dot sourceforge.net) * * @version 1.9.0 * @since 1.9.0 */ public class RoutineSchema implements SchemaObject { Routine[] routines = Routine.emptyArray; int routineType; private HsqlName name; public RoutineSchema(int type, HsqlName name) { routineType = type; this.name = name; } public int getType() { return routineType; } public HsqlName getCatalogName() { return name.schema.schema; } public HsqlName getSchemaName() { return name.schema; } public HsqlName getName() { return name; } public Grantee getOwner() { return name.schema.owner; } public OrderedHashSet getReferences() { OrderedHashSet set = new OrderedHashSet(); for (int i = 0; i < routines.length; i++) { set.addAll(routines[i].getReferences()); } return set; } public OrderedHashSet getComponents() { OrderedHashSet set = new OrderedHashSet(); set.addAll(routines); return set; } public void compile(Session session, SchemaObject parentObject) {} public String getSQL() { return null; } public long getChangeTimestamp() { return 0; } public String[] getSQLArray() { HsqlArrayList list = new HsqlArrayList(); for (int i = 0; i < routines.length; i++) { list.add(routines[i].getSQL()); } String[] array = new String[list.size()]; list.toArray(array); return array; } public void addSpecificRoutine(Database database, Routine routine) { int signature = routine.getParameterSignature(); Type[] types = routine.getParameterTypes(); for (int i = 0; i < this.routines.length; i++) { if (routines[i].parameterTypes.length == types.length) { if (routineType == SchemaObject.PROCEDURE) { throw Error.error(ErrorCode.X_42605); } if (routines[i].isAggregate() != routine.isAggregate()) { throw Error.error(ErrorCode.X_42605); } boolean match = true; for (int j = 0; j < types.length; j++) { if (!routines[i].parameterTypes[j].equals(types[j])) { match = false; break; } } if (match) { throw Error.error(ErrorCode.X_42605); } } } if (routine.getSpecificName() == null) { HsqlName specificName = database.nameManager.newSpecificRoutineName(name); routine.setSpecificName(specificName); } else { routine.getSpecificName().parent = name; routine.getSpecificName().schema = name.schema; } routine.setName(name); routine.routineSchema = this; routines = (Routine[]) ArrayUtil.resizeArray(routines, routines.length + 1); routines[routines.length - 1] = routine; } public void removeSpecificRoutine(Routine routine) { for (int i = 0; i < this.routines.length; i++) { if (routines[i] == routine) { routines = (Routine[]) ArrayUtil.toAdjustedArray(routines, null, i, -1); break; } } } public Routine[] getSpecificRoutines() { return routines; } public Routine getSpecificRoutine(Type[] types) { Routine routine = findSpecificRoutine(types); if (routine == null) { StringBuffer sb = new StringBuffer(); sb.append(name.getSchemaQualifiedStatementName()); sb.append(Tokens.T_OPENBRACKET); for (int i = 0; i < types.length; i++) { if (i != 0) { sb.append(Tokens.T_COMMA); } sb.append(types[i].getNameString()); } sb.append(Tokens.T_CLOSEBRACKET); throw Error.error(ErrorCode.X_42609, sb.toString()); } return routine; } public Routine findSpecificRoutine(Type[] types) { int matchIndex = -1; outerLoop: for (int i = 0; i < this.routines.length; i++) { int matchCount = 0; if (routines[i].isAggregate()) { if (types.length == 1) { if (types[0] == null) { return routines[i]; } int typeDifference = types[0].precedenceDegree( routines[i].parameterTypes[0]); if (typeDifference < -NumberType.DOUBLE_WIDTH) { if (matchIndex == -1) { continue; } int oldDiff = types[0].precedenceDegree( routines[matchIndex].parameterTypes[0]); int newDiff = types[0].precedenceDegree( routines[i].parameterTypes[0]); if (oldDiff == newDiff) { continue outerLoop; } if (newDiff < oldDiff) { matchIndex = i; } continue outerLoop; } else if (typeDifference == 0) { return routines[i]; } else { matchIndex = i; continue outerLoop; } } // treat routine as non-aggregate } if (routines[i].parameterTypes.length != types.length) { continue; } if (types.length == 0) { return this.routines[i]; } for (int j = 0; j < types.length; j++) { int typeDifference; // parameters if (types[j] == null) { continue; } typeDifference = types[j].precedenceDegree(routines[i].parameterTypes[j]); if (typeDifference < -NumberType.DOUBLE_WIDTH) { // accept numeric type narrowing continue outerLoop; } else if (typeDifference == 0) { if (matchCount == j) { matchCount = j + 1; } } } if (matchCount == types.length) { return routines[i]; } if (matchIndex == -1) { matchIndex = i; continue; } for (int j = 0; j < types.length; j++) { if (types[j] == null) { continue; } int oldDiff = types[j].precedenceDegree( routines[matchIndex].parameterTypes[j]); int newDiff = types[j].precedenceDegree(routines[i].parameterTypes[j]); if (oldDiff == newDiff) { continue; } if (newDiff < oldDiff) { matchIndex = i; } continue outerLoop; } } return matchIndex < 0 ? null : routines[matchIndex]; } public Routine getSpecificRoutine(int paramCount) { for (int i = 0; i < this.routines.length; i++) { if (routines[i].parameterTypes.length == paramCount) { return routines[i]; } } throw Error.error(ErrorCode.X_42501); } public boolean isAggregate() { return routines[0].isAggregate; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementQuery.java0000644000175000017500000000767212007547406022614 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.ParserDQL.CompileContext; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.result.Result; import org.hsqldb.result.ResultMetaData; import org.hsqldb.result.ResultProperties; /** * Implementation of Statement for query expressions.

              * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class StatementQuery extends StatementDMQL { StatementQuery(Session session, QueryExpression queryExpression, CompileContext compileContext) { super(StatementTypes.SELECT_CURSOR, StatementTypes.X_SQL_DATA, session.getCurrentSchemaHsqlName()); this.statementReturnType = StatementTypes.RETURN_RESULT; this.queryExpression = queryExpression; setDatabseObjects(session, compileContext); checkAccessRights(session); } Result getResult(Session session) { Result result = queryExpression.getResult(session, session.getMaxRows()); result.setStatement(this); return result; } public ResultMetaData getResultMetaData() { switch (type) { case StatementTypes.SELECT_CURSOR : return queryExpression.getMetaData(); case StatementTypes.SELECT_SINGLE : return queryExpression.getMetaData(); default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementQuery.getResultMetaData()"); } } void collectTableNamesForRead(OrderedHashSet set) { queryExpression.getBaseTableNames(set); for (int i = 0; i < subqueries.length; i++) { if (subqueries[i].queryExpression != null) { subqueries[i].queryExpression.getBaseTableNames(set); } } for (int i = 0; i < routines.length; i++) { set.addAll(routines[i].getTableNamesForRead()); } } void collectTableNamesForWrite(OrderedHashSet set) { if (queryExpression.isUpdatable) { queryExpression.getBaseTableNames(set); } } public int getResultProperties() { return queryExpression.isUpdatable ? ResultProperties.updatablePropsValue : ResultProperties.defaultPropsValue; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/SetFunction.java0000644000175000017500000005327312007547352022061 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.io.Serializable; import java.math.BigDecimal; import java.math.BigInteger; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HashSet; import org.hsqldb.store.ValuePool; import org.hsqldb.types.ArrayType; import org.hsqldb.types.DTIType; import org.hsqldb.types.IntervalMonthData; import org.hsqldb.types.IntervalSecondData; import org.hsqldb.types.IntervalType; import org.hsqldb.types.NumberType; import org.hsqldb.types.RowType; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Type.TypedComparator; import org.hsqldb.types.Types; /** * Implementation of SQL set functions (currently only aggregate functions). * This reduces temporary Object creation by SUM and AVG functions for * INTEGER and narrower types. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 * */ public class SetFunction implements Serializable { private HashSet distinctValues; private boolean isDistinct; // private int setType; private int typeCode; private Type type; private ArrayType arrayType; private Type returnType; // private long count; // private boolean hasNull; private boolean every = true; private boolean some = false; private long currentLong; private double currentDouble; private BigDecimal currentBigDecimal; private Object currentValue; SetFunction(Session session, int setType, Type type, Type returnType, boolean isDistinct, ArrayType arrayType) { this.setType = setType; this.type = type; this.returnType = returnType; if (isDistinct) { this.isDistinct = true; this.arrayType = arrayType; distinctValues = new HashSet(); if (type.isRowType() || type.isArrayType()) { TypedComparator comparator = Type.newComparator(session); SortAndSlice sort = new SortAndSlice(); int length = type.isRowType() ? ((RowType) type).getTypesArray().length : 1; sort.prepareMultiColumn(length); comparator.setType(type, sort); distinctValues.setComparator(comparator); } } if (setType == OpTypes.VAR_SAMP || setType == OpTypes.STDDEV_SAMP) { this.sample = true; } if (type != null) { typeCode = type.typeCode; if (type.isIntervalType()) { typeCode = Types.SQL_INTERVAL; } } } void add(Session session, Object item) { if (item == null) { hasNull = true; return; } if (isDistinct && !distinctValues.add(item)) { return; } count++; switch (setType) { case OpTypes.COUNT : return; case OpTypes.AVG : case OpTypes.SUM : { switch (typeCode) { case Types.TINYINT : case Types.SQL_SMALLINT : case Types.SQL_INTEGER : currentLong += ((Number) item).intValue(); return; case Types.SQL_INTERVAL : { if (item instanceof IntervalSecondData) { addLong(((IntervalSecondData) item).getSeconds()); currentLong += ((IntervalSecondData) item).getNanos(); if (Math.abs(currentLong) >= DTIType.nanoScaleFactors[0]) { addLong(currentLong / DTIType.nanoScaleFactors[0]); currentLong %= DTIType.nanoScaleFactors[0]; } } else if (item instanceof IntervalMonthData) { addLong(((IntervalMonthData) item).units); } return; } case Types.SQL_DATE : case Types.SQL_TIMESTAMP : case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : { addLong(((TimestampData) item).getSeconds()); currentLong += ((TimestampData) item).getNanos(); if (Math.abs(currentLong) >= DTIType.nanoScaleFactors[0]) { addLong(currentLong / DTIType.nanoScaleFactors[0]); currentLong %= DTIType.nanoScaleFactors[0]; } currentDouble = ((TimestampData) item).getZone(); return; } case Types.SQL_BIGINT : addLong(((Number) item).longValue()); return; case Types.SQL_REAL : case Types.SQL_FLOAT : case Types.SQL_DOUBLE : currentDouble += ((Number) item).doubleValue(); return; case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : if (currentBigDecimal == null) { currentBigDecimal = (BigDecimal) item; } else { currentBigDecimal = currentBigDecimal.add((BigDecimal) item); } return; default : throw Error.error(ErrorCode.X_42563); } } case OpTypes.MIN : { if (currentValue == null) { currentValue = item; return; } if (type.compare(session, currentValue, item) > 0) { currentValue = item; } return; } case OpTypes.MAX : { if (currentValue == null) { currentValue = item; return; } if (type.compare(session, currentValue, item) < 0) { currentValue = item; } return; } case OpTypes.EVERY : if (!(item instanceof Boolean)) { throw Error.error(ErrorCode.X_42563); } every = every && ((Boolean) item).booleanValue(); return; case OpTypes.SOME : if (!(item instanceof Boolean)) { throw Error.error(ErrorCode.X_42563); } some = some || ((Boolean) item).booleanValue(); return; case OpTypes.STDDEV_POP : case OpTypes.STDDEV_SAMP : case OpTypes.VAR_POP : case OpTypes.VAR_SAMP : addDataPoint((Number) item); return; case OpTypes.USER_AGGREGATE : currentValue = item; return; default : throw Error.runtimeError(ErrorCode.U_S0500, "SetFunction"); } } Object getValue(Session session) { if (hasNull) { session.addWarning(Error.error(ErrorCode.W_01003)); } if (setType == OpTypes.COUNT) { if (count > 0 && isDistinct && type.isCharacterType()) { Object[] array = new Object[distinctValues.size()]; distinctValues.toArray(array); SortAndSlice sort = new SortAndSlice(); sort.prepareSingleColumn(0); arrayType.sort(session, array, sort); count = arrayType.deDuplicate(session, array, sort); } return ValuePool.getLong(count); } if (count == 0) { return null; } switch (setType) { case OpTypes.AVG : { switch (typeCode) { case Types.TINYINT : case Types.SQL_SMALLINT : case Types.SQL_INTEGER : if (returnType.scale != 0) { return returnType.divide(session, currentLong, count); } return new Long(currentLong / count); case Types.SQL_BIGINT : { long value = getLongSum().divide( BigInteger.valueOf(count)).longValue(); return new Long(value); } case Types.SQL_REAL : case Types.SQL_FLOAT : case Types.SQL_DOUBLE : return new Double(currentDouble / count); case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : if (returnType.scale == type.scale) { return currentBigDecimal.divide( new BigDecimal(count), BigDecimal.ROUND_DOWN); } else { return returnType.divide(session, currentBigDecimal, count); } case Types.SQL_INTERVAL : { BigInteger bi = getLongSum().divide(BigInteger.valueOf(count)); if (!NumberType.isInLongLimits(bi)) { throw Error.error(ErrorCode.X_22015); } if (((IntervalType) type).isDaySecondIntervalType()) { return new IntervalSecondData(bi.longValue(), currentLong, (IntervalType) type, true); } else { return IntervalMonthData.newIntervalMonth( bi.longValue(), (IntervalType) type); } } case Types.SQL_DATE : case Types.SQL_TIMESTAMP : case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : { BigInteger bi = getLongSum().divide(BigInteger.valueOf(count)); if (!NumberType.isInLongLimits(bi)) { throw Error.error(ErrorCode.X_22015); } return new TimestampData(bi.longValue(), (int) currentLong, (int) currentDouble); } default : throw Error.runtimeError(ErrorCode.U_S0500, "SetFunction"); } } case OpTypes.SUM : { switch (typeCode) { case Types.TINYINT : case Types.SQL_SMALLINT : case Types.SQL_INTEGER : return new Long(currentLong); case Types.SQL_BIGINT : return new BigDecimal(getLongSum()); case Types.SQL_REAL : case Types.SQL_FLOAT : case Types.SQL_DOUBLE : return new Double(currentDouble); case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : return currentBigDecimal; case Types.SQL_INTERVAL : { BigInteger bi = getLongSum(); if (!NumberType.isInLongLimits(bi)) { throw Error.error(ErrorCode.X_22015); } if (((IntervalType) type).isDaySecondIntervalType()) { return new IntervalSecondData(bi.longValue(), currentLong, (IntervalType) type, true); } else { return IntervalMonthData.newIntervalMonth( bi.longValue(), (IntervalType) type); } } default : throw Error.runtimeError(ErrorCode.U_S0500, "SetFunction"); } } case OpTypes.MIN : case OpTypes.MAX : return currentValue; case OpTypes.EVERY : return every ? Boolean.TRUE : Boolean.FALSE; case OpTypes.SOME : return some ? Boolean.TRUE : Boolean.FALSE; case OpTypes.STDDEV_POP : case OpTypes.STDDEV_SAMP : return getStdDev(); case OpTypes.VAR_POP : case OpTypes.VAR_SAMP : return getVariance(); case OpTypes.USER_AGGREGATE : return currentValue; default : throw Error.runtimeError(ErrorCode.U_S0500, "SetFunction"); } } /** * During parsing and before an instance of SetFunction is created, * getType is called with type parameter set to correct type when main * SELECT statements contain aggregates. * */ static Type getType(Session session, int setType, Type type) { if (setType == OpTypes.COUNT) { return Type.SQL_BIGINT; } int typeCode = type.isIntervalType() ? Types.SQL_INTERVAL : type.typeCode; switch (setType) { case OpTypes.AVG : case OpTypes.MEDIAN : { switch (typeCode) { case Types.TINYINT : case Types.SQL_SMALLINT : case Types.SQL_INTEGER : case Types.SQL_BIGINT : case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : int scale = session.database.sqlAvgScale; if (scale <= type.scale) { return type; } int digits = ((NumberType) type).getDecimalPrecision(); return NumberType.getNumberType(Types.SQL_DECIMAL, digits + scale, scale); case Types.SQL_REAL : case Types.SQL_FLOAT : case Types.SQL_DOUBLE : case Types.SQL_INTERVAL : case Types.SQL_DATE : case Types.SQL_TIMESTAMP : case Types.SQL_TIMESTAMP_WITH_TIME_ZONE : return type; default : throw Error.error(ErrorCode.X_42563); } } case OpTypes.SUM : { switch (typeCode) { case Types.TINYINT : case Types.SQL_SMALLINT : case Types.SQL_INTEGER : return Type.SQL_BIGINT; case Types.SQL_BIGINT : return Type.SQL_DECIMAL_BIGINT_SQR; case Types.SQL_REAL : case Types.SQL_FLOAT : case Types.SQL_DOUBLE : return Type.SQL_DOUBLE; case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : return Type.getType(type.typeCode, null, null, type.precision * 2, type.scale); case Types.SQL_INTERVAL : return IntervalType.newIntervalType( type.typeCode, DTIType.maxIntervalPrecision, type.scale); default : throw Error.error(ErrorCode.X_42563); } } case OpTypes.MIN : case OpTypes.MAX : if (type.isArrayType() || type.isLobType()) { throw Error.error(ErrorCode.X_42563); } return type; case OpTypes.EVERY : case OpTypes.SOME : if (type.isBooleanType()) { return Type.SQL_BOOLEAN; } break; case OpTypes.STDDEV_POP : case OpTypes.STDDEV_SAMP : case OpTypes.VAR_POP : case OpTypes.VAR_SAMP : if (type.isNumberType()) { return Type.SQL_DOUBLE; } break; case OpTypes.USER_AGGREGATE : return type; default : throw Error.runtimeError(ErrorCode.U_S0500, "SetFunction"); } throw Error.error(ErrorCode.X_42563); } // long sum - originally a separate class /** * Maintain the sum of multiple long values without creating a new * BigInteger object for each addition. */ static final BigInteger multiplier = BigInteger.valueOf(0x0000000100000000L); // BigInteger bigint = BigInteger.ZERO; long hi; long lo; void addLong(long value) { if (value == 0) {} else if (value > 0) { hi += value >> 32; lo += value & 0x00000000ffffffffL; } else { if (value == Long.MIN_VALUE) { hi -= 0x000000080000000L; } else { long temp = ~value + 1; hi -= temp >> 32; lo -= temp & 0x00000000ffffffffL; } } // bigint = bigint.add(BigInteger.valueOf(value)); } BigInteger getLongSum() { BigInteger biglo = BigInteger.valueOf(lo); BigInteger bighi = BigInteger.valueOf(hi); BigInteger result = (bighi.multiply(multiplier)).add(biglo); /* if ( result.compareTo(bigint) != 0 ){ throw Trace.error(Trace.GENERAL_ERROR, "longSum mismatch"); } */ return result; } // end long sum // statistics support - written by Campbell // this section was orginally an independent class private double sk; private double vk; private long n; private boolean initialized; private boolean sample; private void addDataPoint(Number x) { // optimized double xi; double xsi; long nm1; if (x == null) { return; } xi = x.doubleValue(); if (!initialized) { n = 1; sk = xi; vk = 0.0; initialized = true; return; } n++; nm1 = (n - 1); xsi = (sk - (xi * nm1)); vk += ((xsi * xsi) / n) / nm1; sk += xi; } private Number getVariance() { if (!initialized) { return null; } return sample ? (n == 1) ? null // NULL (not NaN) is correct in this case : new Double(vk / (double) (n - 1)) : new Double(vk / (double) (n)); } private Number getStdDev() { if (!initialized) { return null; } return sample ? (n == 1) ? null // NULL (not NaN) is correct in this case : new Double(Math.sqrt(vk / (double) (n - 1))) : new Double(Math.sqrt(vk / (double) (n))); } // end statistics support } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/NumberSequence.java0000644000175000017500000004634012007547416022537 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.math.BigDecimal; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.rights.Grantee; import org.hsqldb.store.ValuePool; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Maintains a sequence of numbers. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ public final class NumberSequence implements SchemaObject { public static final NumberSequence[] emptyArray = new NumberSequence[]{}; // private HsqlName name; // present value private long currValue; // last value private long lastValue; // limit state private boolean limitReached; // original start value - used in CREATE and ALTER commands private long startValue; private long minValue; private long maxValue; private long increment; private Type dataType; private boolean isCycle; private boolean isAlways; private boolean restartValueDefault; public NumberSequence() { try { setDefaults(null, Type.SQL_BIGINT); } catch (HsqlException e) {} } public NumberSequence(HsqlName name, Type type) { setDefaults(name, type); } public void setDefaults(HsqlName name, Type type) { this.name = name; this.dataType = type; this.name = name; long min; long max; switch (dataType.typeCode) { case Types.TINYINT : max = Byte.MAX_VALUE; min = Byte.MIN_VALUE; break; case Types.SQL_SMALLINT : max = Short.MAX_VALUE; min = Short.MIN_VALUE; break; case Types.SQL_INTEGER : max = Integer.MAX_VALUE; min = Integer.MIN_VALUE; break; case Types.SQL_BIGINT : max = Long.MAX_VALUE; min = Long.MIN_VALUE; break; case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : if (type.scale == 0) { max = Long.MAX_VALUE; min = Long.MIN_VALUE; break; } // fall through default : throw Error.error(ErrorCode.X_42563); } minValue = min; maxValue = max; increment = 1; } /** * constructor with initial value and increment; */ public NumberSequence(HsqlName name, long value, long increment, Type type) { this(name, type); setStartValue(value); setIncrement(increment); } public int getType() { return SchemaObject.SEQUENCE; } public HsqlName getName() { return name; } public HsqlName getCatalogName() { return name.schema.schema; } public HsqlName getSchemaName() { return name.schema; } public Grantee getOwner() { return name.schema.owner; } public OrderedHashSet getReferences() { return new OrderedHashSet(); } public OrderedHashSet getComponents() { return null; } public void compile(Session session, SchemaObject parentObject) {} public String getSQL() { StringBuffer sb = new StringBuffer(128); sb.append(Tokens.T_CREATE).append(' '); sb.append(Tokens.T_SEQUENCE).append(' '); sb.append(getName().getSchemaQualifiedStatementName()).append(' '); sb.append(Tokens.T_AS).append(' '); sb.append(getDataType().getNameString()).append(' '); // sb.append(Tokens.T_START).append(' '); sb.append(Tokens.T_WITH).append(' '); sb.append(startValue); if (getIncrement() != 1) { sb.append(' ').append(Tokens.T_INCREMENT).append(' '); sb.append(Tokens.T_BY).append(' '); sb.append(getIncrement()); } if (!hasDefaultMinMax()) { sb.append(' ').append(Tokens.T_MINVALUE).append(' '); sb.append(getMinValue()); sb.append(' ').append(Tokens.T_MAXVALUE).append(' '); sb.append(getMaxValue()); } if (isCycle()) { sb.append(' ').append(Tokens.T_CYCLE); } if (name == null) { sb.append(Tokens.T_CLOSEBRACKET); } return sb.toString(); } public String getSQLColumnDefinition() { StringBuffer sb = new StringBuffer(128); sb.append(Tokens.T_GENERATED).append(' '); if (name == null) { if (isAlways()) { sb.append(Tokens.T_ALWAYS); } else { sb.append(Tokens.T_BY).append(' ').append(Tokens.T_DEFAULT); } sb.append(' ').append(Tokens.T_AS).append(' ').append( Tokens.T_IDENTITY).append(Tokens.T_OPENBRACKET); // sb.append(Tokens.T_START).append(' '); sb.append(Tokens.T_WITH).append(' '); sb.append(startValue); if (getIncrement() != 1) { sb.append(' ').append(Tokens.T_INCREMENT).append(' '); sb.append(Tokens.T_BY).append(' '); sb.append(getIncrement()); } if (!hasDefaultMinMax()) { sb.append(' ').append(Tokens.T_MINVALUE).append(' '); sb.append(getMinValue()); sb.append(' ').append(Tokens.T_MAXVALUE).append(' '); sb.append(getMaxValue()); } if (isCycle()) { sb.append(' ').append(Tokens.T_CYCLE); } if (name == null) { sb.append(Tokens.T_CLOSEBRACKET); } } else { sb.append(Tokens.T_BY).append(' ').append(Tokens.T_DEFAULT); sb.append(' ').append(Tokens.T_AS).append(' '); sb.append(Tokens.T_SEQUENCE).append(' '); sb.append(getName().getSchemaQualifiedStatementName()); } return sb.toString(); } public long getChangeTimestamp() { return 0; } public String getRestartSQL() { StringBuffer sb = new StringBuffer(128); sb.append(Tokens.T_ALTER).append(' '); sb.append(Tokens.T_SEQUENCE); sb.append(' ').append(name.getSchemaQualifiedStatementName()); sb.append(' ').append(Tokens.T_RESTART); sb.append(' ').append(Tokens.T_WITH).append(' ').append(peek()); return sb.toString(); } public static String getRestartSQL(Table t) { String colname = t.getColumn(t.identityColumn).getName().statementName; NumberSequence seq = t.identitySequence; StringBuffer sb = new StringBuffer(128); sb.append(Tokens.T_ALTER).append(' ').append(Tokens.T_TABLE); sb.append(' ').append(t.getName().getSchemaQualifiedStatementName()); sb.append(' ').append(Tokens.T_ALTER).append(' '); sb.append(Tokens.T_COLUMN); sb.append(' ').append(colname); sb.append(' ').append(Tokens.T_RESTART); sb.append(' ').append(Tokens.T_WITH).append(' ').append(seq.peek()); return sb.toString(); } public Type getDataType() { return dataType; } public long getIncrement() { return increment; } public synchronized long getStartValue() { return startValue; } public synchronized long getMinValue() { return minValue; } public synchronized long getMaxValue() { return maxValue; } public synchronized boolean isCycle() { return isCycle; } public synchronized boolean isAlways() { return isAlways; } public synchronized boolean hasDefaultMinMax() { long min; long max; switch (dataType.typeCode) { case Types.TINYINT : max = Byte.MAX_VALUE; min = Byte.MIN_VALUE; break; case Types.SQL_SMALLINT : max = Short.MAX_VALUE; min = Short.MIN_VALUE; break; case Types.SQL_INTEGER : max = Integer.MAX_VALUE; min = Integer.MIN_VALUE; break; case Types.SQL_BIGINT : max = Long.MAX_VALUE; min = Long.MIN_VALUE; break; case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : max = Long.MAX_VALUE; min = Long.MIN_VALUE; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "NumberSequence"); } return minValue == min && maxValue == max; } synchronized void setStartValue(long value) { if (value < minValue || value > maxValue) { throw Error.error(ErrorCode.X_42597); } startValue = value; currValue = lastValue = startValue; } synchronized void setMinValue(long value) { checkInTypeRange(value); if (value >= maxValue || currValue < value) { throw Error.error(ErrorCode.X_42597); } minValue = value; } synchronized void setDefaultMinValue() { minValue = getDefaultMinOrMax(false); } synchronized void setMaxValue(long value) { checkInTypeRange(value); if (value <= minValue || currValue > value) { throw Error.error(ErrorCode.X_42597); } maxValue = value; } synchronized void setDefaultMaxValue() { maxValue = getDefaultMinOrMax(true); } synchronized void setIncrement(long value) { if (value < Short.MIN_VALUE / 2 || value > Short.MAX_VALUE / 2) { throw Error.error(ErrorCode.X_42597); } increment = value; } synchronized void setCurrentValueNoCheck(long value) { checkInTypeRange(value); currValue = lastValue = value; } synchronized void setStartValueNoCheck(long value) { checkInTypeRange(value); startValue = value; currValue = lastValue = startValue; } synchronized void setStartValueDefault() { restartValueDefault = true; } synchronized void setMinValueNoCheck(long value) { checkInTypeRange(value); minValue = value; } synchronized void setMaxValueNoCheck(long value) { checkInTypeRange(value); maxValue = value; } synchronized void setCycle(boolean value) { isCycle = value; } synchronized void setAlways(boolean value) { isAlways = value; } private long getDefaultMinOrMax(boolean isMax) { long min; long max; switch (dataType.typeCode) { case Types.TINYINT : max = Byte.MAX_VALUE; min = Byte.MIN_VALUE; break; case Types.SQL_SMALLINT : max = Short.MAX_VALUE; min = Short.MIN_VALUE; break; case Types.SQL_INTEGER : max = Integer.MAX_VALUE; min = Integer.MIN_VALUE; break; case Types.SQL_BIGINT : max = Long.MAX_VALUE; min = Long.MIN_VALUE; break; case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : max = Long.MAX_VALUE; min = Long.MIN_VALUE; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "NumberSequence"); } return isMax ? max : min; } private void checkInTypeRange(long value) { long min; long max; switch (dataType.typeCode) { case Types.TINYINT : max = Byte.MAX_VALUE; min = Byte.MIN_VALUE; break; case Types.SQL_SMALLINT : max = Short.MAX_VALUE; min = Short.MIN_VALUE; break; case Types.SQL_INTEGER : max = Integer.MAX_VALUE; min = Integer.MIN_VALUE; break; case Types.SQL_BIGINT : max = Long.MAX_VALUE; min = Long.MIN_VALUE; break; case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : max = Long.MAX_VALUE; min = Long.MIN_VALUE; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "NumberSequence"); } if (value < min || value > max) { throw Error.error(ErrorCode.X_42597); } } synchronized void checkValues() { if (restartValueDefault) { currValue = lastValue = startValue; restartValueDefault = false; } if (minValue >= maxValue || startValue < minValue || startValue > maxValue || currValue < minValue || currValue > maxValue) { throw Error.error(ErrorCode.X_42597); } } synchronized NumberSequence duplicate() { NumberSequence copy = new NumberSequence(); copy.name = name; copy.startValue = startValue; copy.currValue = currValue; copy.lastValue = lastValue; copy.increment = increment; copy.dataType = dataType; copy.minValue = minValue; copy.maxValue = maxValue; copy.isCycle = isCycle; copy.isAlways = isAlways; return copy; } synchronized void reset(NumberSequence other) { name = other.name; startValue = other.startValue; currValue = other.currValue; lastValue = other.lastValue; increment = other.increment; dataType = other.dataType; minValue = other.minValue; maxValue = other.maxValue; isCycle = other.isCycle; isAlways = other.isAlways; } /** * getter for a given value */ synchronized long userUpdate(long value) { if (value == currValue) { currValue += increment; return value; } if (increment > 0) { if (value > currValue) { currValue += ((value - currValue + increment) / increment) * increment; } } else { if (value < currValue) { currValue += ((value - currValue + increment) / increment) * increment; } } return value; } /** * Updates are necessary for text tables * For memory tables, the logged and scripted RESTART WITH will override * this. * No checks as values may have overridden the sequnece defaults */ synchronized long systemUpdate(long value) { if (value == currValue) { currValue += increment; return value; } if (increment > 0) { if (value > currValue) { currValue = value + increment; } } else { if (value < currValue) { currValue = value + increment; } } return value; } synchronized Object getValueObject() { long value = getValue(); Object result; switch (dataType.typeCode) { default : case Types.SQL_SMALLINT : case Types.SQL_INTEGER : result = ValuePool.getInt((int) value); break; case Types.SQL_BIGINT : result = ValuePool.getLong(value); break; case Types.SQL_NUMERIC : case Types.SQL_DECIMAL : result = ValuePool.getBigDecimal(new BigDecimal(value)); break; } return result; } /** * principal getter for the next sequence value */ synchronized public long getValue() { if (limitReached) { throw Error.error(ErrorCode.X_2200H); } long nextValue; if (increment > 0) { if (currValue > maxValue - increment) { if (isCycle) { nextValue = minValue; } else { limitReached = true; nextValue = minValue; } } else { nextValue = currValue + increment; } } else { if (currValue < minValue - increment) { if (isCycle) { nextValue = maxValue; } else { limitReached = true; nextValue = minValue; } } else { nextValue = currValue + increment; } } long result = currValue; currValue = nextValue; return result; } /** * reset to start value */ synchronized void reset() { // no change if called before getValue() or called twice lastValue = currValue = startValue; } /** * get next value without incrementing */ synchronized public long peek() { return currValue; } /** * reset the wasUsed flag */ synchronized boolean resetWasUsed() { boolean result = lastValue != currValue; lastValue = currValue; return result; } /** * reset to new initial value */ synchronized public void reset(long value) { if (value < minValue || value > maxValue) { throw Error.error(ErrorCode.X_42597); } startValue = currValue = lastValue = value; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Routine.java0000644000175000017500000012017612007547362021243 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.sql.ResultSet; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.HsqlNameManager.SimpleName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.jdbc.JDBCResultSet; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.result.Result; import org.hsqldb.rights.Grantee; import org.hsqldb.store.BitMap; import org.hsqldb.store.ValuePool; import org.hsqldb.types.RowType; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Implementation of specific routine * * @author Fred Toussi (fredt@users dot sourceforge.net) * * @version 2.0.1 * @since 1.9.0 */ public class Routine implements SchemaObject, RangeGroup, Cloneable { public static final int NO_SQL = 1; public static final int CONTAINS_SQL = 2; public static final int READS_SQL = 3; public static final int MODIFIES_SQL = 4; // public static final int LANGUAGE_JAVA = 1; public static final int LANGUAGE_SQL = 2; // public static final int PARAM_STYLE_JAVA = 1; public static final int PARAM_STYLE_SQL = 2; // static final Routine[] emptyArray = new Routine[]{}; // RoutineSchema routineSchema; private HsqlName name; private HsqlName specificName; Type[] parameterTypes; int typeGroups; Type returnType; Type[] tableType; Table returnTable; final int routineType; int language = LANGUAGE_SQL; int dataImpact = CONTAINS_SQL; int parameterStyle; boolean isDeterministic; boolean isNullInputOutput; boolean isNewSavepointLevel = true; int maxDynamicResults = 0; boolean isRecursive; boolean returnsTable; Statement statement; // boolean isAggregate; // private String methodName; Method javaMethod; boolean javaMethodWithConnection; private boolean isLibraryRoutine; // HashMappedList parameterList = new HashMappedList(); RangeVariable[] ranges = RangeVariable.emptyArray; // int variableCount; // OrderedHashSet references; // Table triggerTable; int triggerType; int triggerOperation; public Routine(int type) { routineType = type; returnType = Type.SQL_ALL_TYPES; ranges = new RangeVariable[]{ new RangeVariable(parameterList, null, false, RangeVariable.PARAMETER_RANGE) }; } public Routine(Table table, RangeVariable[] ranges, int impact, int triggerType, int operationType) { routineType = SchemaObject.TRIGGER; returnType = Type.SQL_ALL_TYPES; dataImpact = impact; this.ranges = ranges; this.triggerTable = table; this.triggerType = triggerType; this.triggerOperation = operationType; } public int getType() { return routineType; } public HsqlName getName() { return name; } public HsqlName getSchemaName() { if (routineType == SchemaObject.TRIGGER) { return triggerTable.getSchemaName(); } return name.schema; } public HsqlName getCatalogName() { return name.schema.schema; } public Grantee getOwner() { return name.schema.owner; } public OrderedHashSet getReferences() { return references; } public OrderedHashSet getComponents() { return null; } public void compile(Session session, SchemaObject parentObject) { ParserRoutine p = new ParserRoutine(session, new Scanner(statement.getSQL())); p.read(); p.startRecording(); Statement statement = p.compileSQLProcedureStatementOrNull(this, null); Token[] tokenisedStatement = p.getRecordedStatement(); String sql = Token.getSQL(tokenisedStatement); statement.setSQL(sql); setProcedure(statement); statement.resolve(session); setReferences(); } public String getSQL() { return getDefinitionSQL(true); } public String getSQLAlter() { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_ALTER).append(' ').append(Tokens.T_SPECIFIC); sb.append(' ').append(Tokens.T_ROUTINE).append(' '); sb.append(specificName.getSchemaQualifiedStatementName()); sb.append(' ').append(Tokens.T_BODY); sb.append(' ').append(statement.getSQL()); return sb.toString(); } public String getSQLDeclaration() { return getDefinitionSQL(false); } private String getDefinitionSQL(boolean withBody) { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_CREATE).append(' '); if (isAggregate) { sb.append(Tokens.T_AGGREGATE).append(' '); } if (routineType == SchemaObject.PROCEDURE) { sb.append(Tokens.T_PROCEDURE); } else { sb.append(Tokens.T_FUNCTION); } sb.append(' '); sb.append(name.getSchemaQualifiedStatementName()); sb.append('('); for (int i = 0; i < parameterList.size(); i++) { if (i > 0) { sb.append(','); } ColumnSchema param = (ColumnSchema) parameterList.get(i); // in - out sb.append(param.getSQL()); } sb.append(')'); sb.append(' '); if (routineType == SchemaObject.FUNCTION) { sb.append(Tokens.T_RETURNS); sb.append(' '); if (returnsTable) { sb.append(Tokens.T_TABLE); sb.append(returnTable.getColumnListWithTypeSQL()); } else { sb.append(returnType.getTypeDefinition()); } sb.append(' '); } // SPECIFIC if (specificName != null) { sb.append(Tokens.T_SPECIFIC); sb.append(' '); sb.append(specificName.getStatementName()); sb.append(' '); } // sb.append(Tokens.T_LANGUAGE); sb.append(' '); if (language == LANGUAGE_JAVA) { sb.append(Tokens.T_JAVA); } else { sb.append(Tokens.T_SQL); } sb.append(' '); // if (!isDeterministic) { sb.append(Tokens.T_NOT); sb.append(' '); } sb.append(Tokens.T_DETERMINISTIC); sb.append(' '); // sb.append(getDataImpactString()); sb.append(' '); // if (routineType == SchemaObject.FUNCTION) { if (isNullInputOutput) { sb.append(Tokens.T_RETURNS).append(' ').append(Tokens.T_NULL); } else { sb.append(Tokens.T_CALLED); } sb.append(' ').append(Tokens.T_ON).append(' '); sb.append(Tokens.T_NULL).append(' ').append(Tokens.T_INPUT); sb.append(' '); } else { if (isNewSavepointLevel) { sb.append(Tokens.T_NEW); } else { sb.append(Tokens.T_OLD); } sb.append(' ').append(Tokens.T_SAVEPOINT).append(' '); sb.append(Tokens.T_LEVEL).append(' '); if (maxDynamicResults != 0) { sb.append(' ').append(Tokens.T_DYNAMIC).append(' '); sb.append(Tokens.T_RESULT).append(' ').append(Tokens.T_SETS); sb.append(' ').append(maxDynamicResults).append(' '); } } if (language == LANGUAGE_JAVA) { sb.append(Tokens.T_EXTERNAL).append(' ').append(Tokens.T_NAME); sb.append(' ').append('\'').append(methodName).append('\''); } else { if (withBody) { sb.append(statement.getSQL()); } else { sb.append(Tokens.T_SIGNAL).append(' '); sb.append(Tokens.T_SQLSTATE).append(' '); sb.append('\'').append("45000").append('\''); } } return sb.toString(); } public String getSQLBodyDefinition() { StringBuffer sb = new StringBuffer(); if (language == LANGUAGE_JAVA) { sb.append(Tokens.T_EXTERNAL).append(' ').append(Tokens.T_NAME); sb.append(' ').append('\'').append(methodName).append('\''); } else { sb.append(statement.getSQL()); } return sb.toString(); } public String getExternalName() { if (language == LANGUAGE_JAVA) { return methodName; } else { return null; } } public long getChangeTimestamp() { return 0; } public void addParameter(ColumnSchema param) { HsqlName name = param.getName(); String paramName = name == null ? HsqlNameManager.getAutoNoNameColumnString(parameterList.size()) : name.name; parameterList.add(paramName, param); } public void setLanguage(int lang) { language = lang; } public int getLanguage() { return language; } boolean isPSM() { return language == LANGUAGE_SQL; } public void setDataImpact(int impact) { dataImpact = impact; } public int getDataImpact() { return dataImpact; } public String getDataImpactString() { StringBuffer sb = new StringBuffer(); switch (this.dataImpact) { case NO_SQL : sb.append(Tokens.T_NO).append(' ').append(Tokens.T_SQL); break; case CONTAINS_SQL : sb.append(Tokens.T_CONTAINS).append(' ').append(Tokens.T_SQL); break; case READS_SQL : sb.append(Tokens.T_READS).append(' ').append( Tokens.T_SQL).append(' ').append(Tokens.T_DATA); break; case MODIFIES_SQL : sb.append(Tokens.T_MODIFIES).append(' ').append( Tokens.T_SQL).append(' ').append(Tokens.T_DATA); break; } return sb.toString(); } public void setReturnType(Type type) { returnType = type; } public Type getReturnType() { return returnType; } public void setTableType(Type[] types) { tableType = types; } public Type[] getTableType() { return tableType; } public Table getTable() { return returnTable; } public void setProcedure(Statement statement) { this.statement = statement; } public Statement getProcedure() { return statement; } public void setSpecificName(HsqlName name) { specificName = name; } public int getMaxDynamicResults() { return maxDynamicResults; } public void setName(HsqlName name) { this.name = name; } public HsqlName getSpecificName() { return specificName; } public void setDeterministic(boolean value) { isDeterministic = value; } public boolean isDeterministic() { return isDeterministic; } public void setNullInputOutput(boolean value) { isNullInputOutput = value; } public boolean isNullInputOutput() { return isNullInputOutput; } public void setNewSavepointLevel(boolean value) { isNewSavepointLevel = value; } public void setMaxDynamicResults(int value) { maxDynamicResults = value; } public void setParameterStyle(int style) { parameterStyle = style; } public void setMethodURL(String url) { this.methodName = url; } public Method getMethod() { return javaMethod; } public void setMethod(Method method) { this.javaMethod = method; } public void setReturnTable(TableDerived table) { this.returnTable = table; this.returnsTable = true; SimpleName[] names = new SimpleName[table.getColumnCount()]; Type[] types = table.getColumnTypes(); returnType = new RowType(types); } public boolean returnsTable() { return returnsTable; } public void setAggregate(boolean isAggregate) { this.isAggregate = isAggregate; } public boolean isAggregate() { return isAggregate; } public void resolve(Session session) { setLanguage(language); if (language == Routine.LANGUAGE_SQL) { if (dataImpact == NO_SQL) { throw Error.error(ErrorCode.X_42604, "CONTAINS SQL"); } if (parameterStyle == PARAM_STYLE_JAVA) { throw Error.error(ErrorCode.X_42604, "PARAMETER STYLE"); } } if (language == Routine.LANGUAGE_SQL) { if (parameterStyle != 0 && parameterStyle != PARAM_STYLE_SQL) { throw Error.error(ErrorCode.X_42604, "PARAMETER STYLE"); } } parameterTypes = new Type[parameterList.size()]; typeGroups = 0; for (int i = 0; i < parameterTypes.length; i++) { ColumnSchema param = (ColumnSchema) parameterList.get(i); parameterTypes[i] = param.dataType; if (i < 4) { BitMap.setByte(typeGroups, (byte) param.dataType.typeComparisonGroup, i * 8); } } if (isAggregate) { if (parameterTypes.length != 4) { throw Error.error(ErrorCode.X_42610); } boolean check = parameterTypes[1].typeCode == Types.BOOLEAN; // ColumnSchema param = (ColumnSchema) parameterList.get(0); check &= param.getParameterMode() == SchemaObject.ParameterModes.PARAM_IN; param = (ColumnSchema) parameterList.get(1); check &= param.getParameterMode() == SchemaObject.ParameterModes.PARAM_IN; param = (ColumnSchema) parameterList.get(2); check &= param.getParameterMode() == SchemaObject.ParameterModes.PARAM_INOUT; param = (ColumnSchema) parameterList.get(3); check &= param.getParameterMode() == SchemaObject.ParameterModes.PARAM_INOUT; if (!check) { throw Error.error(ErrorCode.X_42610); } } resolveReferences(session); } void resolveReferences(Session session) { if (statement != null) { statement.resolve(session); checkSQLData(session); } if (methodName != null && javaMethod == null) { boolean[] hasConnection = new boolean[1]; javaMethod = getMethod(methodName, this, hasConnection, returnsTable); if (javaMethod == null) { throw Error.error(ErrorCode.X_46103); } javaMethodWithConnection = hasConnection[0]; String className = javaMethod.getDeclaringClass().getName(); if (className.equals("java.lang.Math")) { isLibraryRoutine = true; } } setReferences(); } private void setReferences() { OrderedHashSet set = new OrderedHashSet(); for (int i = 0; i < parameterTypes.length; i++) { ColumnSchema param = (ColumnSchema) parameterList.get(i); OrderedHashSet refs = param.getReferences(); if (refs != null) { set.addAll(refs); } } if (statement != null) { set.addAll(statement.getReferences()); } isRecursive = false; if (set.contains(getSpecificName())) { set.remove(this.getSpecificName()); isRecursive = true; } references = set; } void checkSQLData(Session session) { OrderedHashSet set = statement.getReferences(); for (int i = 0; i < set.size(); i++) { HsqlName name = (HsqlName) set.get(i); if (name.type == SchemaObject.SPECIFIC_ROUTINE) { Routine routine = (Routine) session.database.schemaManager.getSchemaObject( name); if (routine.dataImpact == Routine.READS_SQL) { if (dataImpact == Routine.CONTAINS_SQL) { throw Error.error(ErrorCode.X_42608, Tokens.T_READS + ' ' + Tokens.T_SQL); } } else if (routine.dataImpact == Routine.MODIFIES_SQL) { if (dataImpact == Routine.CONTAINS_SQL || dataImpact == Routine.READS_SQL) { throw Error.error(ErrorCode.X_42608, Tokens.T_MODIFIES + ' ' + Tokens.T_SQL); } } } } if (dataImpact == Routine.CONTAINS_SQL || dataImpact == Routine.READS_SQL) { HsqlName[] names = statement.getTableNamesForWrite(); for (int i = 0; i < names.length; i++) { if (names[i].schema != SqlInvariants.MODULE_HSQLNAME) { throw Error.error(ErrorCode.X_42608, Tokens.T_MODIFIES + ' ' + Tokens.T_SQL); } } } if (dataImpact == Routine.CONTAINS_SQL) { HsqlName[] names = statement.getTableNamesForRead(); for (int i = 0; i < names.length; i++) { if (names[i].schema != SqlInvariants.MODULE_HSQLNAME) { throw Error.error(ErrorCode.X_42608, Tokens.T_READS + ' ' + Tokens.T_SQL); } } } } public boolean isTrigger() { return routineType == SchemaObject.TRIGGER; } public boolean isProcedure() { return routineType == SchemaObject.PROCEDURE; } public boolean isFunction() { return routineType == SchemaObject.FUNCTION; } public ColumnSchema getParameter(int i) { return (ColumnSchema) parameterList.get(i); } Type[] getParameterTypes() { return parameterTypes; } int getParameterSignature() { return typeGroups; } public int getParameterCount() { return parameterTypes.length; } public int getParameterCount(int type) { int count = 0; for (int i = 0; i < parameterList.size(); i++) { ColumnSchema col = (ColumnSchema) parameterList.get(i); if (col.getParameterMode() == type) { count++; } } return count; } public int getParameterIndex(String name) { return parameterList.getIndex(name); } public RangeVariable[] getRangeVariables() { return ranges; } public void setCorrelated() { // } public int getVariableCount() { return variableCount; } public boolean isLibraryRoutine() { return isLibraryRoutine; } public HsqlName[] getTableNamesForRead() { if (statement == null) { return HsqlName.emptyArray; } return statement.getTableNamesForRead(); } public HsqlName[] getTableNamesForWrite() { if (statement == null) { return HsqlName.emptyArray; } return statement.getTableNamesForWrite(); } public void resetAlteredRoutineSettings() { if (isPSM()) { methodName = null; javaMethod = null; javaMethodWithConnection = false; parameterStyle = PARAM_STYLE_SQL; if (dataImpact == NO_SQL) { dataImpact = CONTAINS_SQL; } } else { statement = null; references = null; variableCount = 0; ranges = RangeVariable.emptyArray; } } public void setAsAlteredRoutine(Routine routine) { language = routine.language; dataImpact = routine.dataImpact; parameterStyle = routine.parameterStyle; isDeterministic = routine.isDeterministic; isNullInputOutput = routine.isNullInputOutput; maxDynamicResults = routine.maxDynamicResults; isRecursive = routine.isRecursive; javaMethod = routine.javaMethod; // isRecursive = routine.isRecursive; javaMethodWithConnection = routine.javaMethodWithConnection; methodName = routine.methodName; statement = routine.statement; references = routine.references; variableCount = routine.variableCount; ranges = routine.ranges; } Object[] convertArgsToJava(Session session, Object[] callArguments) { int extraArg = javaMethodWithConnection ? 1 : 0; Object[] data = new Object[javaMethod.getParameterTypes().length]; Type[] types = getParameterTypes(); int i = 0; for (; i < types.length; i++) { Object value = callArguments[i]; ColumnSchema param = getParameter(i); if (param.parameterMode == SchemaObject.ParameterModes.PARAM_IN) { data[i + extraArg] = types[i].convertSQLToJava(session, value); } else { Object jdbcValue = types[i].convertSQLToJava(session, value); Class cl = types[i].getJDBCClass(); Object array = java.lang.reflect.Array.newInstance(cl, 1); java.lang.reflect.Array.set(array, 0, jdbcValue); data[i + extraArg] = array; } } for (; i + extraArg < data.length; i++) { data[i + extraArg] = new java.sql.ResultSet[1]; } return data; } void convertArgsToSQL(Session session, Object[] callArguments, Object[] data) { int extraArg = javaMethodWithConnection ? 1 : 0; Type[] types = getParameterTypes(); int i = 0; for (; i < types.length; i++) { Object value = data[i + extraArg]; ColumnSchema param = getParameter(i); if (param.parameterMode != SchemaObject.ParameterModes.PARAM_IN) { value = java.lang.reflect.Array.get(value, 0); } callArguments[i] = types[i].convertJavaToSQL(session, value); } Result head = null; for (; i + extraArg < data.length; i++) { ResultSet rs = ((ResultSet[]) data[i + extraArg])[0]; if (rs != null) { if (rs instanceof JDBCResultSet) { Result r = ((JDBCResultSet) rs).result; if (head == null) { callArguments[i] = r; head = r; } else { head.addChainedResult(r); } } else { Error.error(ErrorCode.X_46000, "ResultSet not native"); } } } } public Result invokeJavaMethodDirect(Object[] data) { Result result; try { Object returnValue = javaMethod.invoke(null, data); returnValue = returnType.convertJavaToSQL(null, returnValue); result = Result.newPSMResult(returnValue); } catch (Throwable t) { result = Result.newErrorResult( Error.error(t, ErrorCode.X_46000, getName().name), null); } return result; } Result invokeJavaMethod(Session session, Object[] data) { Result result; HsqlName oldSessionSchema = session.getCurrentSchemaHsqlName(); try { if (dataImpact == Routine.NO_SQL) { session.sessionContext.isReadOnly = Boolean.TRUE; session.setNoSQL(); } else if (dataImpact == Routine.CONTAINS_SQL) { session.sessionContext.isReadOnly = Boolean.TRUE; } else if (dataImpact == Routine.READS_SQL) { session.sessionContext.isReadOnly = Boolean.TRUE; } session.setCurrentSchemaHsqlName(getSchemaName()); Object returnValue = javaMethod.invoke(null, data); if (returnsTable()) { if (returnValue instanceof JDBCResultSet) { result = ((JDBCResultSet) returnValue).result; } else { // convert ResultSet to table throw Error.runtimeError(ErrorCode.U_S0500, "FunctionSQLInvoked"); } } else { returnValue = returnType.convertJavaToSQL(session, returnValue); result = Result.newPSMResult(returnValue); } } catch (InvocationTargetException e) { result = Result.newErrorResult( Error.error(e, ErrorCode.X_46000, getName().name), null); } catch (IllegalAccessException e) { result = Result.newErrorResult( Error.error(e, ErrorCode.X_46000, getName().name), null); } catch (Throwable e) { result = Result.newErrorResult( Error.error(e, ErrorCode.X_46000, getName().name), null); } session.setCurrentSchemaHsqlName(oldSessionSchema); return result; } public Result invoke(Session session, Object[] data, Object[] aggregateData, boolean push) { Result result; if (push) { session.sessionContext.push(); } if (isPSM()) { try { session.sessionContext.routineArguments = data; session.sessionContext.routineVariables = ValuePool.emptyObjectArray; if (variableCount > 0) { session.sessionContext.routineVariables = new Object[variableCount]; } result = statement.execute(session); if (aggregateData != null) { for (int i = 0; i < aggregateData.length; i++) { aggregateData[i] = data[i + 1]; } } } catch (Throwable e) { result = Result.newErrorResult(e); } } else { if (isAggregate) { data = convertArgsToJava(session, data); } result = invokeJavaMethod(session, data); if (isAggregate) { Object[] callResult = new Object[data.length]; convertArgsToSQL(session, callResult, data); for (int i = 0; i < aggregateData.length; i++) { aggregateData[i] = callResult[i + 1]; } } } if (push) { session.sessionContext.pop(); } return result; } public Routine duplicate() { try { return (Routine) super.clone(); } catch (CloneNotSupportedException e) { throw Error.runtimeError(ErrorCode.U_S0500, "Type"); } } static Method getMethod(String name, Routine routine, boolean[] hasConnection, boolean returnsTable) { int i = name.indexOf(':'); if (i != -1) { if (!name.substring(0, i).equals(SqlInvariants.CLASSPATH_NAME)) { throw Error.error(ErrorCode.X_46102, name); } name = name.substring(i + 1); } Method[] methods = getMethods(name); int firstMismatch = -1; for (i = 0; i < methods.length; i++) { int offset = 0; hasConnection[0] = false; Method method = methods[i]; Class[] params = method.getParameterTypes(); int matchedParamCount; if (params.length > 0 && params[0].equals(java.sql.Connection.class)) { offset = 1; hasConnection[0] = true; } matchedParamCount = params.length - offset; if (routine.isProcedure()) { for (int j = offset; j < params.length; j++) { if (params[j].isArray() && java.sql.ResultSet.class.isAssignableFrom(params[j].getComponentType())) { matchedParamCount = j - offset; break; } } } if (matchedParamCount != routine.parameterTypes.length) { continue; } if (returnsTable) { if (!java.sql.ResultSet.class.isAssignableFrom( method.getReturnType())) { continue; } } else { Type methodReturnType = Types.getParameterSQLType(method.getReturnType()); if (methodReturnType == null) { continue; } if (!routine.returnType.canBeAssignedFrom(methodReturnType)) { continue; } if (!methodReturnType.isLobType() && (methodReturnType.isBinaryType() || methodReturnType.isCharacterType())) { // } else if (methodReturnType.typeCode != routine.returnType.typeCode) { continue; } } for (int j = 0; j < routine.parameterTypes.length; j++) { boolean isInOut = false; Class param = params[j + offset]; if (param.isArray()) { if (!byte[].class.equals(param)) { param = param.getComponentType(); if (param.isPrimitive()) { method = null; break; } isInOut = true; } } Type methodParamType = Types.getParameterSQLType(param); if (methodParamType == null) { method = null; break; } boolean result = routine.parameterTypes[j].typeComparisonGroup == methodParamType.typeComparisonGroup; // exact type for number if (result && routine.parameterTypes[j].isNumberType()) { result = routine.parameterTypes[j].typeCode == methodParamType.typeCode; } if (isInOut && routine.getParameter(j).parameterMode == SchemaObject.ParameterModes.PARAM_IN) { result = false; } if (!result) { method = null; if (j + offset > firstMismatch) { firstMismatch = j + offset; } break; } } if (method != null) { for (int j = 0; j < routine.parameterTypes.length; j++) { routine.getParameter(j).setNullable( !params[j + offset].isPrimitive()); } return method; } } if (firstMismatch >= 0) { ColumnSchema param = routine.getParameter(firstMismatch); throw Error.error(ErrorCode.X_46511, param.getNameString()); } return null; } static Method[] getMethods(String name) { int i = name.lastIndexOf('.'); if (i == -1) { throw Error.error(ErrorCode.X_42501, name); } String className = name.substring(0, i); String methodname = name.substring(i + 1); Class cl; Method[] methods = null; if (!HsqlDatabaseProperties.supportsJavaMethod(name)) { throw Error.error(ErrorCode.X_42501, className); } try { cl = Class.forName(className, true, Thread.currentThread().getContextClassLoader()); } catch (Throwable t1) { try { cl = Class.forName(className); } catch (Throwable t) { throw Error.error(t, ErrorCode.X_42501, ErrorCode.M_Message_Pair, new Object[] { t.toString(), className }); } } try { methods = cl.getMethods(); } catch (Throwable t) { throw Error.error(t, ErrorCode.X_42501, ErrorCode.M_Message_Pair, new Object[] { t.toString(), className }); } HsqlArrayList list = new HsqlArrayList(); for (i = 0; i < methods.length; i++) { int offset = 0; int endIndex = Integer.MAX_VALUE; Method method = methods[i]; int modifiers = method.getModifiers(); if (!method.getName().equals(methodname) || !Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) { continue; } Class[] params = methods[i].getParameterTypes(); if (params.length > 0 && params[0].equals(java.sql.Connection.class)) { offset = 1; } for (int j = offset; j < params.length; j++) { Class param = params[j]; if (param.isArray()) { if (!byte[].class.equals(param)) { param = param.getComponentType(); if (param.isPrimitive()) { method = null; break; } if (java.sql.ResultSet.class.isAssignableFrom(param)) { if (endIndex > j) { endIndex = j; } } } if (j >= endIndex) { if (java.sql.ResultSet.class.isAssignableFrom(param)) { continue; } else { method = null; break; } } } else { if (j > endIndex) { method = null; break; } } Type methodParamType = Types.getParameterSQLType(param); if (methodParamType == null) { method = null; break; } } if (method == null) { continue; } if (java.sql.ResultSet.class.isAssignableFrom( method.getReturnType())) { list.add(methods[i]); } else { Type methodReturnType = Types.getParameterSQLType(method.getReturnType()); if (methodReturnType != null) { list.add(methods[i]); } } } methods = new Method[list.size()]; list.toArray(methods); return methods; } public static Routine[] newRoutines(Session session, Method[] methods) { Routine[] routines = new Routine[methods.length]; for (int i = 0; i < methods.length; i++) { Method method = methods[i]; routines[i] = newRoutine(session, method); } return routines; } /** * Returns a new function Routine object based solely on a Java Method object. */ public static Routine newRoutine(Session session, Method method) { Routine routine = new Routine(SchemaObject.FUNCTION); int offset = 0; Class[] params = method.getParameterTypes(); String className = method.getDeclaringClass().getName(); StringBuffer sb = new StringBuffer(); sb.append("CLASSPATH:"); sb.append(method.getDeclaringClass().getName()).append('.'); sb.append(method.getName()); if (params.length > 0 && params[0].equals(java.sql.Connection.class)) { offset = 1; } String name = sb.toString(); if (className.equals("java.lang.Math")) { routine.isLibraryRoutine = true; } for (int j = offset; j < params.length; j++) { Type methodParamType = Types.getParameterSQLType(params[j]); ColumnSchema param = new ColumnSchema(null, methodParamType, !params[j].isPrimitive(), false, null); routine.addParameter(param); } routine.setLanguage(Routine.LANGUAGE_JAVA); routine.setMethod(method); routine.setMethodURL(name); routine.setDataImpact(Routine.NO_SQL); Type methodReturnType = Types.getParameterSQLType(method.getReturnType()); routine.javaMethodWithConnection = offset == 1; routine.setReturnType(methodReturnType); routine.resolve(session); return routine; } public static void createRoutines(Session session, HsqlName schema, String name) { Method[] methods = Routine.getMethods(name); Routine[] routines = Routine.newRoutines(session, methods); HsqlName routineName = session.database.nameManager.newHsqlName(schema, name, true, SchemaObject.FUNCTION); for (int i = 0; i < routines.length; i++) { routines[i].setName(routineName); session.database.schemaManager.addSchemaObject(routines[i]); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/SessionManager.java0000644000175000017500000002241112007547376022532 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.LongKeyHashMap; import org.hsqldb.rights.User; /** * Container that maintains a map of session id's to Session objects. * Responsible for managing opening and closing of sessions. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.2 */ public class SessionManager { long sessionIdCount = 0; private LongKeyHashMap sessionMap = new LongKeyHashMap(); private Session sysSession; private Session sysLobSession; /** * @todo: * Eliminate the Database-centric nature of SessionManager. * e.g. Sessions should be able to migrate from one Database instance * to another using session control language moderated by SessionManager */ /** * Constructs an new SessionManager handling the specified Database. * Creates a SYS User. */ public SessionManager(Database db) { User sysUser = db.getUserManager().getSysUser(); sysSession = new Session(db, sysUser, false, false, sessionIdCount++, null, 0); sysLobSession = new Session(db, sysUser, true, false, sessionIdCount++, null, 0); } /** * @todo: * It should be possible to create an initially 'disconnected' Session that * can execute general commands using a SessionCommandInterpreter. * * EXAMPLES: Open a Session to start a Server, add/remove * databases hosted by an existing Server, connect to a * Database... * * REQUIRES: auth scheme independent of any particular Database instance * e.g. provide service to use /etc/passwd and /etc/groups, * JAAS-plugin, etc. */ /** * Binds the specified Session object into this SessionManager's active * Session registry. This method is typically called internally as * the final step, when a successful connection has been made. * * @param db the database to which the new Session is initially connected * @param user the Session User * @param readonly the ReadOnly attribute for the new Session * @param forLog true when session is for reading a log * @param timeZoneSeconds the session time zone second interval * @return Session */ public synchronized Session newSession(Database db, User user, boolean readonly, boolean autoCommit, String zoneString, int timeZoneSeconds) { Session s = new Session(db, user, autoCommit, readonly, sessionIdCount, zoneString, timeZoneSeconds); sessionMap.put(sessionIdCount, s); sessionIdCount++; return s; } public synchronized Session newSessionForLog(Database db) { boolean autoCommit = db.databaseProperties.isVersion18(); Session s = new Session(db, db.getUserManager().getSysUser(), autoCommit, false, sessionIdCount, null, 0); s.isProcessingLog = true; sessionMap.put(sessionIdCount, s); sessionIdCount++; return s; } /** * Retrieves a new SYS Session. */ public Session getSysSessionForScript(Database db) { Session session = new Session(db, db.getUserManager().getSysUser(), false, false, 0, null, 0); session.isProcessingScript = true; return session; } public Session getSysLobSession() { return sysLobSession; } /** * Retrieves the common SYS Session. */ public Session getSysSession() { sysSession.currentSchema = sysSession.database.schemaManager.getDefaultSchemaHsqlName(); sysSession.isProcessingScript = false; sysSession.isProcessingLog = false; sysSession.setUser(sysSession.database.getUserManager().getSysUser()); return sysSession; } /** * Retrieves a transient transaction session. */ public Session newSysSession() { Session session = new Session(sysSession.database, sysSession.getUser(), false, false, sessionIdCount, null, 0); session.currentSchema = sysSession.database.schemaManager.getDefaultSchemaHsqlName(); sessionMap.put(sessionIdCount, session); sessionIdCount++; return session; } public Session newSysSession(HsqlName schema, User user) { Session session = new Session(sysSession.database, user, false, false, 0, null, 0); session.currentSchema = schema; return session; } /** * Closes all Sessions registered with this SessionManager. */ public void closeAllSessions() { // don't disconnect system user; need it to save database Session[] sessions = getAllSessions(); for (int i = 0; i < sessions.length; i++) { sessions[i].close(); } } /** * Removes the session from management and disconnects. */ synchronized void removeSession(Session session) { sessionMap.remove(session.getId()); } /** * Closes all sessions and system */ synchronized void close() { closeAllSessions(); sysSession.close(); sysLobSession.close(); } /** * Returns true if no session exists beyond the sys session. */ synchronized boolean isEmpty() { return sessionMap.isEmpty(); } /** * Retrieves a list of the Sessions in this container that * are visible to the specified Session, given the access rights of * the Session User. */ public synchronized Session[] getVisibleSessions(Session session) { return session.isAdmin() ? getAllSessions() : new Session[]{ session }; } /** * Retrieves the Session with the specified Session identifier or null * if no such Session is registered with this SessionManager. */ synchronized Session getSession(long id) { return (Session) sessionMap.get(id); } public synchronized Session[] getAllSessions() { Session[] sessions = new Session[sessionMap.size()]; Iterator it = sessionMap.values().iterator(); for (int i = 0; it.hasNext(); i++) { sessions[i] = (Session) it.next(); } return sessions; } public synchronized boolean isUserActive(String userName) { Iterator it = sessionMap.values().iterator(); for (int i = 0; it.hasNext(); i++) { Session session = (Session) it.next(); if (userName.equals(session.getUser().getName().getNameString())) { return true; } } return false; } public synchronized void removeSchemaReference(Schema schema) { Iterator it = sessionMap.values().iterator(); for (int i = 0; it.hasNext(); i++) { Session session = (Session) it.next(); if (session.getCurrentSchemaHsqlName() == schema.getName()) { session.resetSchema(); } } } public synchronized void resetLoggedSchemas() { Iterator it = sessionMap.values().iterator(); for (int i = 0; it.hasNext(); i++) { Session session = (Session) it.next(); session.loggedSchema = null; } this.sysLobSession.loggedSchema = null; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ClientConnection.java0000644000175000017500000004340512007547374023056 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.net.Socket; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.jdbc.JDBCConnection; import org.hsqldb.lib.DataOutputStream; import org.hsqldb.navigator.RowSetNavigatorClient; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.result.ResultLob; import org.hsqldb.rowio.RowInputBinary; import org.hsqldb.rowio.RowOutputBinary; import org.hsqldb.rowio.RowOutputInterface; import org.hsqldb.server.HsqlSocketFactory; import org.hsqldb.store.ValuePool; import org.hsqldb.types.BlobDataID; import org.hsqldb.types.ClobDataID; import org.hsqldb.types.TimestampData; /** * Base remote session proxy implementation. Uses instances of Result to * transmit and recieve data. This implementation utilises the updated HSQL * protocol. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.7.2 */ public class ClientConnection implements SessionInterface { /** * Specifies the Compatibility version required for both Servers and * network JDBC Clients built with this baseline. Must remain public * for Server to have visibility to it. * * Update this value only when the current version of HSQLDB does not * have inter-compatibility with Server and network JDBC Driver of * the previous HSQLDB version. * * Must specify all 4 version segments (any segment may be the value 0, * however). The string elements at (position p from right counted from 0) * are multiplied by 100 to power p and added up, then negated, to form the * integer representation of version string. */ public static final String NETWORK_COMPATIBILITY_VERSION = "2.1.0.0"; public static final int NETWORK_COMPATIBILITY_VERSION_INT = -2010000; // static final int BUFFER_SIZE = 0x1000; final byte[] mainBuffer = new byte[BUFFER_SIZE]; private boolean isClosed; private Socket socket; protected DataOutputStream dataOutput; protected DataInputStream dataInput; protected RowOutputInterface rowOut; protected RowInputBinary rowIn; private Result resultOut; private long sessionID; private long lobIDSequence = -1; // private boolean isReadOnlyDefault = false; private boolean isAutoCommit = true; private int zoneSeconds; private Scanner scanner; private String zoneString; private Calendar calendar; // JDBCConnection connection; String host; int port; String path; String database; boolean isTLS; int databaseID; String clientPropertiesString; HsqlProperties clientProperties; String databaseUniqueName; /** * Establishes a connection to the server. */ public ClientConnection(String host, int port, String path, String database, boolean isTLS, String user, String password, int timeZoneSeconds) { this.host = host; this.port = port; this.path = path; this.database = database; this.isTLS = isTLS; this.zoneSeconds = timeZoneSeconds; this.zoneString = TimeZone.getDefault().getID(); initStructures(); Result login = Result.newConnectionAttemptRequest(user, password, database, zoneString, timeZoneSeconds); initConnection(host, port, isTLS); Result resultIn = execute(login); if (resultIn.isError()) { throw Error.error(resultIn); } sessionID = resultIn.getSessionId(); databaseID = resultIn.getDatabaseId(); databaseUniqueName = resultIn.getDatabaseName(); clientPropertiesString = resultIn.getMainString(); } /** * resultOut is reused to trasmit all remote calls for session management. * Here the structure is preset for sending attributes. */ private void initStructures() { RowOutputBinary rowOutTemp = new RowOutputBinary(mainBuffer); rowOut = rowOutTemp; rowIn = new RowInputBinary(rowOutTemp); resultOut = Result.newSessionAttributesResult(); } protected void initConnection(String host, int port, boolean isTLS) { openConnection(host, port, isTLS); } protected void openConnection(String host, int port, boolean isTLS) { try { socket = HsqlSocketFactory.getInstance(isTLS).createSocket(host, port); socket.setTcpNoDelay(true); dataOutput = new DataOutputStream(socket.getOutputStream()); dataInput = new DataInputStream( new BufferedInputStream(socket.getInputStream())); handshake(); } catch (Exception e) { // The details from "e" should not be thrown away here. This is // very useful info for end users to diagnose the runtime problem. throw new HsqlException(e, Error.getStateString(ErrorCode.X_08001), -ErrorCode.X_08001); } } protected void closeConnection() { try { if (socket != null) { socket.close(); } } catch (Exception e) {} socket = null; } public synchronized Result execute(Result r) { try { r.setSessionId(sessionID); r.setDatabaseId(databaseID); write(r); return read(); } catch (Throwable e) { throw Error.error(ErrorCode.X_08006, e.toString()); } } public synchronized RowSetNavigatorClient getRows(long navigatorId, int offset, int size) { try { resultOut.setResultType(ResultConstants.REQUESTDATA); resultOut.setResultId(navigatorId); resultOut.setUpdateCount(offset); resultOut.setFetchSize(size); Result result = execute(resultOut); return (RowSetNavigatorClient) result.getNavigator(); } catch (Throwable e) { throw Error.error(ErrorCode.X_08006, e.toString()); } } public synchronized void closeNavigator(long navigatorId) { try { resultOut.setResultType(ResultConstants.CLOSE_RESULT); resultOut.setResultId(navigatorId); execute(resultOut); } catch (Throwable e) {} } public synchronized void close() { if (isClosed) { return; } isClosed = true; try { resultOut.setResultType(ResultConstants.DISCONNECT); execute(resultOut); } catch (Exception e) {} try { closeConnection(); } catch (Exception e) {} } public synchronized Object getAttribute(int id) { resultOut.setResultType(ResultConstants.GETSESSIONATTR); resultOut.setStatementType(id); Result in = execute(resultOut); if (in.isError()) { throw Error.error(in); } Object[] data = in.getSingleRowData(); switch (id) { case SessionInterface.INFO_AUTOCOMMIT : return data[SessionInterface.INFO_BOOLEAN]; case SessionInterface.INFO_CONNECTION_READONLY : return data[SessionInterface.INFO_BOOLEAN]; case SessionInterface.INFO_ISOLATION : return data[SessionInterface.INFO_INTEGER]; case SessionInterface.INFO_CATALOG : return data[SessionInterface.INFO_VARCHAR]; } return null; } public synchronized void setAttribute(int id, Object value) { resultOut.setResultType(ResultConstants.SETSESSIONATTR); Object[] data = resultOut.getSingleRowData(); data[SessionInterface.INFO_ID] = ValuePool.getInt(id); switch (id) { case SessionInterface.INFO_AUTOCOMMIT : case SessionInterface.INFO_CONNECTION_READONLY : data[SessionInterface.INFO_BOOLEAN] = value; break; case SessionInterface.INFO_ISOLATION : data[SessionInterface.INFO_INTEGER] = value; break; case SessionInterface.INFO_CATALOG : data[SessionInterface.INFO_VARCHAR] = value; break; } Result resultIn = execute(resultOut); if (resultIn.isError()) { throw Error.error(resultIn); } } public synchronized boolean isReadOnlyDefault() { Object info = getAttribute(SessionInterface.INFO_CONNECTION_READONLY); isReadOnlyDefault = ((Boolean) info).booleanValue(); return isReadOnlyDefault; } public synchronized void setReadOnlyDefault(boolean mode) { if (mode != isReadOnlyDefault) { setAttribute(SessionInterface.INFO_CONNECTION_READONLY, mode ? Boolean.TRUE : Boolean.FALSE); isReadOnlyDefault = mode; } } public synchronized boolean isAutoCommit() { Object info = getAttribute(SessionInterface.INFO_AUTOCOMMIT); isAutoCommit = ((Boolean) info).booleanValue(); return isAutoCommit; } public synchronized void setAutoCommit(boolean mode) { if (mode != isAutoCommit) { setAttribute(SessionInterface.INFO_AUTOCOMMIT, mode ? Boolean.TRUE : Boolean .FALSE); isAutoCommit = mode; } } public synchronized void setIsolationDefault(int level) { setAttribute(SessionInterface.INFO_ISOLATION, ValuePool.getInt(level)); } public synchronized int getIsolation() { Object info = getAttribute(SessionInterface.INFO_ISOLATION); return ((Integer) info).intValue(); } public synchronized boolean isClosed() { return isClosed; } public Session getSession() { return null; } public synchronized void startPhasedTransaction() {} public synchronized void prepareCommit() { resultOut.setAsTransactionEndRequest(ResultConstants.PREPARECOMMIT, null); Result in = execute(resultOut); if (in.isError()) { throw Error.error(in); } } public synchronized void commit(boolean chain) { resultOut.setAsTransactionEndRequest(ResultConstants.TX_COMMIT, null); Result in = execute(resultOut); if (in.isError()) { throw Error.error(in); } } public synchronized void rollback(boolean chain) { resultOut.setAsTransactionEndRequest(ResultConstants.TX_ROLLBACK, null); Result in = execute(resultOut); if (in.isError()) { throw Error.error(in); } } public synchronized void rollbackToSavepoint(String name) { resultOut.setAsTransactionEndRequest( ResultConstants.TX_SAVEPOINT_NAME_ROLLBACK, name); Result in = execute(resultOut); if (in.isError()) { throw Error.error(in); } } public synchronized void savepoint(String name) { Result result = Result.newSetSavepointRequest(name); Result in = execute(result); if (in.isError()) { throw Error.error(in); } } public synchronized void releaseSavepoint(String name) { resultOut.setAsTransactionEndRequest( ResultConstants.TX_SAVEPOINT_NAME_RELEASE, name); Result in = execute(resultOut); if (in.isError()) { throw Error.error(in); } } public void addWarning(HsqlException warning) {} public synchronized long getId() { return sessionID; } /** * Used by pooled connections to reset the server-side session to a new * one. In case of failure, the connection is closed. * * When the Connection.close() method is called, a pooled connection calls * this method instead of HSQLClientConnection.close(). It can then * reuse the HSQLClientConnection object with no further initialisation. * */ public synchronized void resetSession() { Result login = Result.newResetSessionRequest(); Result resultIn = execute(login); if (resultIn.isError()) { isClosed = true; closeConnection(); throw Error.error(resultIn); } sessionID = resultIn.getSessionId(); databaseID = resultIn.getDatabaseId(); } protected void write(Result r) throws IOException, HsqlException { r.write(this, dataOutput, rowOut); } protected Result read() throws IOException, HsqlException { Result result = Result.newResult(dataInput, rowIn); result.readAdditionalResults(this, dataInput, rowIn); rowOut.reset(mainBuffer); rowIn.resetRow(mainBuffer.length); return result; } /** * Never called on this class */ public synchronized String getInternalConnectionURL() { return null; } public synchronized long getLobId() { return lobIDSequence--; } public BlobDataID createBlob(long length) { BlobDataID blob = new BlobDataID(getLobId()); return blob; } public ClobDataID createClob(long length) { ClobDataID clob = new ClobDataID(getLobId()); return clob; } /** * Does nothing here */ public void allocateResultLob(ResultLob resultLob, InputStream dataInput) {} public Scanner getScanner() { if (scanner == null) { scanner = new Scanner(); } return scanner; } public Calendar getCalendar() { if (calendar == null) { TimeZone zone = TimeZone.getTimeZone(zoneString); calendar = new GregorianCalendar(zone); } return calendar; } public TimestampData getCurrentDate() { long currentMillis = System.currentTimeMillis(); long seconds = HsqlDateTime.getCurrentDateMillis(currentMillis) / 1000; return new TimestampData(seconds); } public int getZoneSeconds() { return zoneSeconds; } public int getStreamBlockSize() { return lobStreamBlockSize; } public HsqlProperties getClientProperties() { if (clientProperties == null) { if (clientPropertiesString.length() > 0) { clientProperties = HsqlProperties.delimitedArgPairsToProps( clientPropertiesString, "=", ";", null); } else { clientProperties = new HsqlProperties(); } } return clientProperties; } public JDBCConnection getJDBCConnection() { return connection; } public void setJDBCConnection(JDBCConnection connection) { this.connection = connection; } public String getDatabaseUniqueName() { return databaseUniqueName; } /** * Converts specified encoded integer to a Network Compatibility Version * String. The tranmitted integer is negative to distinguish it from * 7 bit ASCII characters. */ public static String toNetCompVersionString(int i) { StringBuffer sb = new StringBuffer(); i *= -1; sb.append(i / 1000000); i %= 1000000; sb.append('.'); sb.append(i / 10000); i %= 10000; sb.append('.'); sb.append(i / 100); i %= 100; sb.append('.'); sb.append(i); return sb.toString(); } protected void handshake() throws IOException { dataOutput.writeInt(NETWORK_COMPATIBILITY_VERSION_INT); dataOutput.flush(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ExpressionLogical.java0000644000175000017500000021452512007547416023252 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.OrderedIntHashSet; import org.hsqldb.navigator.RowIterator; import org.hsqldb.persist.PersistentStore; import org.hsqldb.types.ArrayType; import org.hsqldb.types.DTIType; import org.hsqldb.types.DateTimeType; import org.hsqldb.types.NumberType; import org.hsqldb.types.Type; /** * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class ExpressionLogical extends Expression { boolean noOptimisation; boolean isQuantified; boolean isTerminal; // RangeVariable[] rangeArray = RangeVariable.emptyArray; /** * For LIKE */ ExpressionLogical(int type) { super(type); dataType = Type.SQL_BOOLEAN; } /** * For boolean constants */ ExpressionLogical(boolean b) { super(OpTypes.VALUE); dataType = Type.SQL_BOOLEAN; valueData = b ? Boolean.TRUE : Boolean.FALSE; } /* * Create an equality expressions using existing columns and * range variables. The expression is fully resolved in constructor. */ ExpressionLogical(RangeVariable leftRangeVar, int colIndexLeft, RangeVariable rightRangeVar, int colIndexRight) { super(OpTypes.EQUAL); ExpressionColumn leftExpression = new ExpressionColumn(leftRangeVar, colIndexLeft); ExpressionColumn rightExpression = new ExpressionColumn(rightRangeVar, colIndexRight); nodes = new Expression[BINARY]; nodes[LEFT] = leftExpression; nodes[RIGHT] = rightExpression; setEqualityMode(); dataType = Type.SQL_BOOLEAN; } /** * Creates an equality expression */ ExpressionLogical(Expression left, Expression right) { super(OpTypes.EQUAL); nodes = new Expression[BINARY]; nodes[LEFT] = left; nodes[RIGHT] = right; setEqualityMode(); dataType = Type.SQL_BOOLEAN; } /** * Creates a binary operation expression */ ExpressionLogical(int type, Expression left, Expression right) { super(type); nodes = new Expression[BINARY]; nodes[LEFT] = left; nodes[RIGHT] = right; switch (opType) { case OpTypes.EQUAL : case OpTypes.GREATER_EQUAL : case OpTypes.GREATER : case OpTypes.SMALLER : case OpTypes.SMALLER_EQUAL : setEqualityMode(); // fall through case OpTypes.NOT_EQUAL : case OpTypes.OVERLAPS : case OpTypes.NOT_DISTINCT : case OpTypes.IN : case OpTypes.MATCH_SIMPLE : case OpTypes.MATCH_PARTIAL : case OpTypes.MATCH_FULL : case OpTypes.MATCH_UNIQUE_SIMPLE : case OpTypes.MATCH_UNIQUE_PARTIAL : case OpTypes.MATCH_UNIQUE_FULL : case OpTypes.AND : case OpTypes.OR : dataType = Type.SQL_BOOLEAN; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } } /** * Creates a modified LIKE comparison */ ExpressionLogical(int type, Expression left, Expression right, Expression end) { super(type); nodes = new Expression[TERNARY]; nodes[LEFT] = left; nodes[RIGHT] = right; nodes[2] = end; } /** * Creates a unary operation expression */ ExpressionLogical(int type, Expression e) { super(type); nodes = new Expression[UNARY]; nodes[LEFT] = e; switch (opType) { case OpTypes.UNIQUE : case OpTypes.EXISTS : case OpTypes.IS_NULL : case OpTypes.NOT : dataType = Type.SQL_BOOLEAN; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } if (opType == OpTypes.IS_NULL && nodes[LEFT].opType == OpTypes.COLUMN) { isSingleColumnNull = true; } if (opType == OpTypes.NOT && nodes[LEFT].isSingleColumnNull) { isSingleColumnNotNull = true; } } /** * Creates a column not null expression for check constraints */ ExpressionLogical(ColumnSchema column) { super(OpTypes.NOT); nodes = new Expression[UNARY]; dataType = Type.SQL_BOOLEAN; Expression e = new ExpressionColumn(column); e = new ExpressionLogical(OpTypes.IS_NULL, e); nodes[LEFT] = e; } void setEqualityMode() { if (nodes[LEFT].opType == OpTypes.COLUMN) { nodes[LEFT].nullability = SchemaObject.Nullability.NO_NULLS; switch (nodes[RIGHT].opType) { case OpTypes.COLUMN : isColumnCondition = true; if (opType == OpTypes.EQUAL) { isColumnEqual = true; } nodes[RIGHT].nullability = SchemaObject.Nullability.NO_NULLS; break; case OpTypes.VALUE : case OpTypes.DYNAMIC_PARAM : case OpTypes.PARAMETER : case OpTypes.VARIABLE : isSingleColumnCondition = true; if (opType == OpTypes.EQUAL) { isSingleColumnEqual = true; } break; } } else if (nodes[RIGHT].opType == OpTypes.COLUMN) { nodes[RIGHT].nullability = SchemaObject.Nullability.NO_NULLS; switch (nodes[LEFT].opType) { case OpTypes.VALUE : case OpTypes.DYNAMIC_PARAM : case OpTypes.PARAMETER : case OpTypes.VARIABLE : isSingleColumnCondition = true; if (opType == OpTypes.EQUAL) { isSingleColumnEqual = true; } break; } } } /** * Creates a NOT NULL condition */ static ExpressionLogical newNotNullCondition(Expression e) { e = new ExpressionLogical(OpTypes.IS_NULL, e); return new ExpressionLogical(OpTypes.NOT, e); } // logical ops static Expression andExpressions(Expression e1, Expression e2) { if (e1 == null) { return e2; } if (e2 == null) { return e1; } if (ExpressionLogical.EXPR_FALSE.equals(e1) || ExpressionLogical.EXPR_FALSE.equals(e2)) { return ExpressionLogical.EXPR_FALSE; } if (e1 == e2) { return e1; } return new ExpressionLogical(OpTypes.AND, e1, e2); } static Expression orExpressions(Expression e1, Expression e2) { if (e1 == null) { return e2; } if (e2 == null) { return e1; } if (e1 == e2) { return e1; } return new ExpressionLogical(OpTypes.OR, e1, e2); } public void addLeftColumnsForAllAny(RangeVariable range, OrderedIntHashSet set) { if (nodes.length == 0) { return; } for (int j = 0; j < nodes[LEFT].nodes.length; j++) { int index = nodes[LEFT].nodes[j].getColumnIndex(); if (index < 0 || nodes[LEFT].nodes[j].getRangeVariable() != range) { set.clear(); return; } set.add(index); } } public void setSubType(int type) { exprSubType = type; if (exprSubType == OpTypes.ALL_QUANTIFIED || exprSubType == OpTypes.ANY_QUANTIFIED) { isQuantified = true; } } public String getSQL() { StringBuffer sb = new StringBuffer(64); if (opType == OpTypes.VALUE) { return super.getSQL(); } String left = getContextSQL(nodes[LEFT]); String right = getContextSQL(nodes.length > 1 ? nodes[RIGHT] : null); switch (opType) { case OpTypes.NOT : if (nodes[LEFT].opType == OpTypes.IS_NULL) { sb.append(getContextSQL(nodes[LEFT].nodes[LEFT])).append( ' ').append(Tokens.T_IS).append(' ').append( Tokens.T_NOT).append(' ').append(Tokens.T_NULL); return sb.toString(); } if (nodes[LEFT].opType == OpTypes.NOT_DISTINCT) { sb.append(getContextSQL(nodes[LEFT].nodes[LEFT])).append( ' ').append(Tokens.T_IS).append(' ').append( Tokens.T_DISTINCT).append(' ').append( Tokens.T_FROM).append(' ').append( getContextSQL(nodes[LEFT].nodes[RIGHT])); return sb.toString(); } sb.append(Tokens.T_NOT).append(' ').append(left); return sb.toString(); case OpTypes.NOT_DISTINCT : sb.append(left).append(' ').append(Tokens.T_IS).append( ' ').append(Tokens.T_NOT).append(' ').append( Tokens.T_DISTINCT).append(' ').append( Tokens.T_FROM).append(' ').append(right); return sb.toString(); case OpTypes.IS_NULL : sb.append(left).append(' ').append(Tokens.T_IS).append( ' ').append(Tokens.T_NULL); return sb.toString(); case OpTypes.UNIQUE : sb.append(' ').append(Tokens.T_UNIQUE).append(' '); break; case OpTypes.EXISTS : sb.append(' ').append(Tokens.T_EXISTS).append(' '); break; case OpTypes.EQUAL : sb.append(left).append('=').append(right); return sb.toString(); case OpTypes.GREATER_EQUAL : sb.append(left).append(">=").append(right); return sb.toString(); case OpTypes.GREATER : sb.append(left).append('>').append(right); return sb.toString(); case OpTypes.SMALLER : sb.append(left).append('<').append(right); return sb.toString(); case OpTypes.SMALLER_EQUAL : sb.append(left).append("<=").append(right); return sb.toString(); case OpTypes.NOT_EQUAL : if (Tokens.T_NULL.equals(right)) { sb.append(left).append(" IS NOT ").append(right); } else { sb.append(left).append("!=").append(right); } return sb.toString(); case OpTypes.AND : sb.append(left).append(' ').append(Tokens.T_AND).append( ' ').append(right); return sb.toString(); case OpTypes.OR : sb.append(left).append(' ').append(Tokens.T_OR).append( ' ').append(right); return sb.toString(); case OpTypes.IN : sb.append(left).append(' ').append(Tokens.T_IN).append( ' ').append(right); return sb.toString(); case OpTypes.MATCH_SIMPLE : sb.append(left).append(' ').append(Tokens.T_MATCH).append( ' ').append(right); return sb.toString(); case OpTypes.MATCH_PARTIAL : sb.append(left).append(' ').append(Tokens.T_MATCH).append( ' ').append(Tokens.PARTIAL).append(right); return sb.toString(); case OpTypes.MATCH_FULL : sb.append(left).append(' ').append(Tokens.T_MATCH).append( ' ').append(Tokens.FULL).append(right); return sb.toString(); case OpTypes.MATCH_UNIQUE_SIMPLE : sb.append(left).append(' ').append(Tokens.T_MATCH).append( ' ').append(Tokens.UNIQUE).append(right); return sb.toString(); case OpTypes.MATCH_UNIQUE_PARTIAL : sb.append(left).append(' ').append(Tokens.T_MATCH).append( ' ').append(Tokens.UNIQUE).append(' ').append( Tokens.PARTIAL).append(right); return sb.toString(); case OpTypes.MATCH_UNIQUE_FULL : sb.append(left).append(' ').append(Tokens.T_MATCH).append( ' ').append(Tokens.UNIQUE).append(' ').append( Tokens.FULL).append(right); return sb.toString(); default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } return sb.toString(); } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(64); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } switch (opType) { case OpTypes.VALUE : sb.append("VALUE = ").append( dataType.convertToSQLString(valueData)); sb.append(", TYPE = ").append(dataType.getNameString()); return sb.toString(); case OpTypes.NOT : if (nodes[LEFT].opType == OpTypes.NOT_DISTINCT) { sb.append(Tokens.T_DISTINCT); return sb.toString(); } sb.append(Tokens.T_NOT); break; case OpTypes.NOT_DISTINCT : sb.append(Tokens.T_NOT).append(' ').append(Tokens.T_DISTINCT); break; case OpTypes.EQUAL : sb.append("EQUAL"); break; case OpTypes.GREATER_EQUAL : sb.append("GREATER_EQUAL"); break; case OpTypes.GREATER : sb.append("GREATER"); break; case OpTypes.SMALLER : sb.append("SMALLER"); break; case OpTypes.SMALLER_EQUAL : sb.append("SMALLER_EQUAL"); break; case OpTypes.NOT_EQUAL : sb.append("NOT_EQUAL"); break; case OpTypes.AND : sb.append(Tokens.T_AND); break; case OpTypes.OR : sb.append(Tokens.T_OR); break; case OpTypes.MATCH_SIMPLE : case OpTypes.MATCH_PARTIAL : case OpTypes.MATCH_FULL : case OpTypes.MATCH_UNIQUE_SIMPLE : case OpTypes.MATCH_UNIQUE_PARTIAL : case OpTypes.MATCH_UNIQUE_FULL : sb.append(Tokens.T_MATCH); break; case OpTypes.IS_NULL : sb.append(Tokens.T_IS).append(' ').append(Tokens.T_NULL); break; case OpTypes.UNIQUE : sb.append(Tokens.T_UNIQUE); break; case OpTypes.EXISTS : sb.append(Tokens.T_EXISTS); break; case OpTypes.OVERLAPS : sb.append(Tokens.T_OVERLAPS); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } if (getLeftNode() != null) { sb.append(" arg_left=["); sb.append(nodes[LEFT].describe(session, blanks + 1)); sb.append(']'); } if (getRightNode() != null) { sb.append(" arg_right=["); sb.append(nodes[RIGHT].describe(session, blanks + 1)); sb.append(']'); } return sb.toString(); } public void resolveTypes(Session session, Expression parent) { // parametric ALL / ANY if (isQuantified) { if (nodes[RIGHT].opType == OpTypes.TABLE) { if (nodes[RIGHT] instanceof ExpressionTable) { if (nodes[RIGHT].nodes[LEFT].opType == OpTypes.DYNAMIC_PARAM) { nodes[LEFT].resolveTypes(session, this); nodes[RIGHT].nodes[LEFT].dataType = new ArrayType( nodes[LEFT].dataType, ArrayType.defaultLargeArrayCardinality); } } } } for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { nodes[i].resolveTypes(session, this); } } switch (opType) { case OpTypes.VALUE : break; case OpTypes.NOT_DISTINCT : changeToRowExpression(LEFT); changeToRowExpression(RIGHT); resolveRowTypes(); checkRowComparison(); break; case OpTypes.EQUAL : case OpTypes.GREATER_EQUAL : case OpTypes.GREATER : case OpTypes.SMALLER : case OpTypes.SMALLER_EQUAL : case OpTypes.NOT_EQUAL : resolveTypesForComparison(session, parent); break; case OpTypes.AND : { resolveTypesForLogicalOp(); if (nodes[LEFT].opType == OpTypes.VALUE) { if (nodes[RIGHT].opType == OpTypes.VALUE) { setAsConstantValue(session); } else { Object value = nodes[LEFT].getValue(session); if (value == null || Boolean.FALSE.equals(value)) { setAsConstantValue(Boolean.FALSE); } } } else if (nodes[RIGHT].opType == OpTypes.VALUE) { Object value = nodes[RIGHT].getValue(session); if (value == null || Boolean.FALSE.equals(value)) { setAsConstantValue(Boolean.FALSE); } } break; } case OpTypes.OR : { resolveTypesForLogicalOp(); if (nodes[LEFT].opType == OpTypes.VALUE) { if (nodes[RIGHT].opType == OpTypes.VALUE) { setAsConstantValue(session); } else { Object value = nodes[LEFT].getValue(session); if (Boolean.TRUE.equals(value)) { setAsConstantValue(Boolean.TRUE); } } } else if (nodes[RIGHT].opType == OpTypes.VALUE) { Object value = nodes[RIGHT].getValue(session); if (Boolean.TRUE.equals(value)) { setAsConstantValue(Boolean.TRUE); } } break; } case OpTypes.IS_NULL : if (nodes[LEFT].isUnresolvedParam()) { if (session.database.sqlEnforceTypes) { throw Error.error(ErrorCode.X_42563); } nodes[LEFT].dataType = Type.SQL_VARCHAR_DEFAULT; } if (nodes[LEFT].opType == OpTypes.VALUE) { setAsConstantValue(session); } break; case OpTypes.NOT : if (nodes[LEFT].isUnresolvedParam()) { nodes[LEFT].dataType = Type.SQL_BOOLEAN; break; } if (nodes[LEFT].opType == OpTypes.VALUE) { if (nodes[LEFT].dataType.isBooleanType()) { setAsConstantValue(session); break; } else { throw Error.error(ErrorCode.X_42563); } } if (nodes[LEFT].dataType == null || !nodes[LEFT].dataType.isBooleanType()) { throw Error.error(ErrorCode.X_42563); } dataType = Type.SQL_BOOLEAN; break; case OpTypes.OVERLAPS : resolveTypesForOverlaps(); break; case OpTypes.IN : resolveTypesForIn(session); break; case OpTypes.MATCH_SIMPLE : case OpTypes.MATCH_PARTIAL : case OpTypes.MATCH_FULL : case OpTypes.MATCH_UNIQUE_SIMPLE : case OpTypes.MATCH_UNIQUE_PARTIAL : case OpTypes.MATCH_UNIQUE_FULL : resolveTypesForAllAny(session); break; case OpTypes.UNIQUE : case OpTypes.EXISTS : break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } } private void resolveTypesForLogicalOp() { if (nodes[LEFT].isUnresolvedParam()) { nodes[LEFT].dataType = Type.SQL_BOOLEAN; } if (nodes[RIGHT].isUnresolvedParam()) { nodes[RIGHT].dataType = Type.SQL_BOOLEAN; } if (nodes[LEFT].dataType == null || nodes[RIGHT].dataType == null) { throw Error.error(ErrorCode.X_42571); } if (nodes[LEFT].opType == OpTypes.ROW || nodes[RIGHT].opType == OpTypes.ROW) { throw Error.error(ErrorCode.X_42565); } if (Type.SQL_BOOLEAN != nodes[LEFT].dataType || Type.SQL_BOOLEAN != nodes[RIGHT].dataType) { throw Error.error(ErrorCode.X_42568); } } private void resolveTypesForComparison(Session session, Expression parent) { if (exprSubType == OpTypes.ALL_QUANTIFIED || exprSubType == OpTypes.ANY_QUANTIFIED) { resolveTypesForAllAny(session); checkRowComparison(); return; } int leftDegree = nodes[LEFT].getDegree(); int rightDegree = nodes[RIGHT].getDegree(); if (leftDegree > 1 || rightDegree > 1) { if (leftDegree != rightDegree) { throw Error.error(ErrorCode.X_42564); } resolveRowTypes(); checkRowComparison(); return; } else { if (nodes[LEFT].isUnresolvedParam()) { nodes[LEFT].dataType = nodes[RIGHT].dataType; } else if (nodes[RIGHT].isUnresolvedParam()) { nodes[RIGHT].dataType = nodes[LEFT].dataType; } if (nodes[LEFT].dataType == null) { nodes[LEFT].dataType = nodes[RIGHT].dataType; } else if (nodes[RIGHT].dataType == null) { nodes[RIGHT].dataType = nodes[LEFT].dataType; } if (nodes[LEFT].dataType == null || nodes[RIGHT].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (nodes[LEFT].dataType.typeComparisonGroup != nodes[RIGHT].dataType.typeComparisonGroup) { if (convertDateTimeLiteral(session, nodes[LEFT], nodes[RIGHT])) { // compatibility for BIT with number and BOOLEAN - convert bit to other type } else if (nodes[LEFT].dataType.isBitType() || nodes[LEFT].dataType.isBooleanType()) { if (session.database.sqlEnforceTypes) { throw Error.error(ErrorCode.X_42562); } if (nodes[LEFT].dataType.canConvertFrom( nodes[RIGHT].dataType)) { nodes[RIGHT] = ExpressionOp.getCastExpression(session, nodes[RIGHT], nodes[LEFT].dataType); } } else if (nodes[RIGHT].dataType.isBitType() || nodes[RIGHT].dataType.isBooleanType()) { if (session.database.sqlEnforceTypes) { throw Error.error(ErrorCode.X_42562); } if (nodes[RIGHT].dataType.canConvertFrom( nodes[LEFT].dataType)) { nodes[LEFT] = ExpressionOp.getCastExpression(session, nodes[LEFT], nodes[RIGHT].dataType); } } else if (nodes[LEFT].dataType.isNumberType()) { if (session.database.sqlEnforceTypes) { throw Error.error(ErrorCode.X_42562); } if (nodes[LEFT].dataType.canConvertFrom( nodes[RIGHT].dataType)) { nodes[RIGHT] = ExpressionOp.getCastExpression(session, nodes[RIGHT], nodes[LEFT].dataType); } } else if (nodes[RIGHT].dataType.isNumberType()) { if (session.database.sqlEnforceTypes) { throw Error.error(ErrorCode.X_42562); } if (nodes[RIGHT].dataType.canConvertFrom( nodes[LEFT].dataType)) { nodes[LEFT] = ExpressionOp.getCastExpression(session, nodes[LEFT], nodes[RIGHT].dataType); } } else if (nodes[LEFT].dataType.isDateTimeType()) { if (nodes[LEFT].dataType.isDateTimeTypeWithZone() ^ nodes[RIGHT].dataType.isDateTimeTypeWithZone()) { nodes[LEFT] = new ExpressionOp(nodes[LEFT]); } } else { throw Error.error(ErrorCode.X_42562); } } if (opType == OpTypes.EQUAL || opType == OpTypes.NOT_EQUAL) { // } else { if (nodes[LEFT].dataType.isArrayType() || nodes[LEFT].dataType.isLobType() || nodes[RIGHT].dataType.isLobType()) { throw Error.error(ErrorCode.X_42534); } } if (nodes[LEFT].opType == OpTypes.ROWNUM && nodes[RIGHT].opType == OpTypes.VALUE) { isTerminal = true; } if (nodes[LEFT].dataType.typeComparisonGroup != nodes[RIGHT].dataType.typeComparisonGroup) { throw Error.error(ErrorCode.X_42562); } if (nodes[LEFT].opType == OpTypes.VALUE && nodes[RIGHT].opType == OpTypes.VALUE) { setAsConstantValue(session); } } } private void changeToRowExpression(int nodeIndex) { if (nodes[nodeIndex].opType != OpTypes.ROW) { nodes[nodeIndex] = new Expression(OpTypes.ROW, new Expression[]{ nodes[nodeIndex] }); nodes[nodeIndex].nodeDataTypes = new Type[]{ nodes[nodeIndex].nodes[0].dataType }; } } private void resolveRowTypes() { for (int i = 0; i < nodes[LEFT].nodeDataTypes.length; i++) { Type leftType = nodes[LEFT].nodeDataTypes[i]; Type rightType = nodes[RIGHT].nodeDataTypes[i]; if (leftType == null) { leftType = nodes[LEFT].nodeDataTypes[i] = rightType; } else if (nodes[RIGHT].dataType == null) { rightType = nodes[RIGHT].nodeDataTypes[i] = leftType; } if (leftType == null || rightType == null) { throw Error.error(ErrorCode.X_42567); } if (leftType.typeComparisonGroup != rightType.typeComparisonGroup) { throw Error.error(ErrorCode.X_42562); } else if (leftType.isDateTimeType()) { if (leftType.isDateTimeTypeWithZone() ^ rightType.isDateTimeTypeWithZone()) { nodes[LEFT].nodes[i] = new ExpressionOp(nodes[LEFT].nodes[i]); nodes[LEFT].nodeDataTypes[i] = nodes[LEFT].nodes[i].dataType; } } } } void checkRowComparison() { if (opType == OpTypes.EQUAL || opType == OpTypes.NOT_EQUAL) { return; } for (int i = 0; i < nodes[LEFT].nodeDataTypes.length; i++) { Type leftType = nodes[LEFT].nodeDataTypes[i]; Type rightType = nodes[RIGHT].nodeDataTypes[i]; if (leftType.isArrayType() || leftType.isLobType() || rightType.isLobType()) { throw Error.error(ErrorCode.X_42534); } } } /** * for compatibility, convert a datetime character string to a datetime * value for comparison */ private boolean convertDateTimeLiteral(Session session, Expression a, Expression b) { if (a.dataType.isDateTimeType()) { // } else if (b.dataType.isDateTimeType()) { Expression c = a; a = b; b = c; } else { return false; } if (a.dataType.isDateTimeTypeWithZone()) { return false; } if (b.opType == OpTypes.VALUE && b.dataType.isCharacterType()) { try { b.valueData = a.dataType.castToType(session, b.valueData, b.dataType); b.dataType = a.dataType; } catch (HsqlException e) { if (a.dataType == Type.SQL_DATE) { b.valueData = Type.SQL_TIMESTAMP.castToType(session, b.valueData, b.dataType); b.dataType = Type.SQL_TIMESTAMP; } } return true; } return false; } void resolveTypesForOverlaps() { if (nodes[LEFT].nodes[0].isUnresolvedParam()) { nodes[LEFT].nodes[0].dataType = nodes[RIGHT].nodes[0].dataType; } if (nodes[RIGHT].nodes[0].isUnresolvedParam()) { nodes[RIGHT].nodes[0].dataType = nodes[LEFT].nodes[0].dataType; } if (nodes[LEFT].nodes[0].dataType == null) { nodes[LEFT].nodes[0].dataType = nodes[RIGHT].nodes[0].dataType = Type.SQL_TIMESTAMP; } if (nodes[LEFT].nodes[1].isUnresolvedParam()) { nodes[LEFT].nodes[1].dataType = nodes[RIGHT].nodes[0].dataType; } if (nodes[RIGHT].nodes[1].isUnresolvedParam()) { nodes[RIGHT].nodes[1].dataType = nodes[LEFT].nodes[0].dataType; } if (!DTIType .isValidDatetimeRange(nodes[LEFT].nodes[0] .dataType, nodes[LEFT].nodes[1].dataType) || !DTIType .isValidDatetimeRange(nodes[RIGHT].nodes[0] .dataType, nodes[RIGHT].nodes[1].dataType)) { throw Error.error(ErrorCode.X_42563); } if (!DTIType.isValidDatetimeRange(nodes[LEFT].nodes[0].dataType, nodes[LEFT].nodes[1].dataType)) { throw Error.error(ErrorCode.X_42563); } nodes[LEFT].nodeDataTypes[0] = nodes[LEFT].nodes[0].dataType; nodes[LEFT].nodeDataTypes[1] = nodes[LEFT].nodes[1].dataType; nodes[RIGHT].nodeDataTypes[0] = nodes[RIGHT].nodes[0].dataType; nodes[RIGHT].nodeDataTypes[1] = nodes[RIGHT].nodes[1].dataType; } void resolveTypesForAllAny(Session session) { int degree = nodes[LEFT].getDegree(); if (degree == 1 && nodes[LEFT].opType != OpTypes.ROW) { nodes[LEFT] = new Expression(OpTypes.ROW, new Expression[]{ nodes[LEFT] }); } if (nodes[RIGHT].opType == OpTypes.VALUELIST) { nodes[RIGHT].prepareTable(session, nodes[LEFT], degree); nodes[RIGHT].table.prepareTable(); } // encounterd in system generated MATCH predicates if (nodes[RIGHT].nodeDataTypes == null) { nodes[RIGHT].prepareTable(session, nodes[LEFT], degree); } if (degree != nodes[RIGHT].nodeDataTypes.length) { throw Error.error(ErrorCode.X_42564); } if (nodes[RIGHT].opType == OpTypes.VALUELIST) {} if (nodes[LEFT].nodeDataTypes == null) { nodes[LEFT].nodeDataTypes = new Type[nodes[LEFT].nodes.length]; } for (int i = 0; i < nodes[LEFT].nodeDataTypes.length; i++) { Type type = nodes[LEFT].nodes[i].dataType; if (type == null) { type = nodes[RIGHT].nodeDataTypes[i]; } if (type == null) { throw Error.error(ErrorCode.X_42567); } if (type.typeComparisonGroup != nodes[RIGHT].nodeDataTypes[i].typeComparisonGroup) { throw Error.error(ErrorCode.X_42563); } nodes[LEFT].nodeDataTypes[i] = type; nodes[LEFT].nodes[i].dataType = type; } } void resolveTypesForIn(Session session) { resolveTypesForAllAny(session); } public Object getValue(Session session) { switch (opType) { case OpTypes.VALUE : return valueData; case OpTypes.SIMPLE_COLUMN : { Object value = session.sessionContext.rangeIterators[rangePosition] .getCurrent(columnIndex); return value; } case OpTypes.NEGATE : return ((NumberType) dataType).negate( nodes[LEFT].getValue(session, nodes[LEFT].dataType)); case OpTypes.IS_NULL : return nodes[LEFT].getValue(session) == null ? Boolean.TRUE : Boolean.FALSE; case OpTypes.OVERLAPS : { Object[] left = nodes[LEFT].getRowValue(session); Object[] right = nodes[RIGHT].getRowValue(session); return DateTimeType.overlaps(session, left, nodes[LEFT].nodeDataTypes, right, nodes[RIGHT].nodeDataTypes); } case OpTypes.IN : { return testInCondition(session); } case OpTypes.MATCH_SIMPLE : case OpTypes.MATCH_PARTIAL : case OpTypes.MATCH_FULL : case OpTypes.MATCH_UNIQUE_SIMPLE : case OpTypes.MATCH_UNIQUE_PARTIAL : case OpTypes.MATCH_UNIQUE_FULL : { return testMatchCondition(session); } case OpTypes.NOT_DISTINCT : return testNotDistinctCondition(session); case OpTypes.UNIQUE : { nodes[LEFT].materialise(session); return nodes[LEFT].table.hasUniqueNotNullRows(session) ? Boolean.TRUE : Boolean.FALSE; } case OpTypes.EXISTS : { return testExistsCondition(session); } case OpTypes.NOT : { Boolean result = (Boolean) nodes[LEFT].getValue(session); return result == null ? null : result.booleanValue() ? Boolean.FALSE : Boolean.TRUE; } case OpTypes.AND : { Boolean r1 = (Boolean) nodes[LEFT].getValue(session); if (Boolean.FALSE.equals(r1)) { return Boolean.FALSE; } Boolean r2 = (Boolean) nodes[RIGHT].getValue(session); if (Boolean.FALSE.equals(r2)) { return Boolean.FALSE; } if (r1 == null || r2 == null) { return null; } return Boolean.TRUE; } case OpTypes.OR : { Boolean r1 = (Boolean) nodes[LEFT].getValue(session); if (Boolean.TRUE.equals(r1)) { return Boolean.TRUE; } Boolean r2 = (Boolean) nodes[RIGHT].getValue(session); if (Boolean.TRUE.equals(r2)) { return Boolean.TRUE; } if (r1 == null || r2 == null) { return null; } return Boolean.FALSE; } case OpTypes.EQUAL : case OpTypes.GREATER : case OpTypes.GREATER_EQUAL : case OpTypes.SMALLER_EQUAL : case OpTypes.SMALLER : case OpTypes.NOT_EQUAL : { if (exprSubType == OpTypes.ANY_QUANTIFIED || exprSubType == OpTypes.ALL_QUANTIFIED) { return testAllAnyCondition(session); } Object o1 = nodes[LEFT].getValue(session); Object o2 = nodes[RIGHT].getValue(session); if (nodes[LEFT].dataType != null && nodes[LEFT].dataType.isArrayType()) { return compareValues(session, (Object) o1, (Object) o2); } if (o1 instanceof Object[]) { if (o2 != null && !(o2 instanceof Object[])) { throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } return compareValues(session, (Object[]) o1, (Object[]) o2); } else { if (o2 instanceof Object[]) { o2 = ((Object[]) o2)[0]; } return compareValues(session, o1, o2); } } default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } } /** * For MATCH SIMPLE and FULL expressions, nulls in left are handled * prior to calling this method */ private Boolean compareValues(Session session, Object left, Object right) { int result = 0; if (left == null || right == null) { return null; } result = nodes[LEFT].dataType.compare(session, left, right); switch (opType) { case OpTypes.EQUAL : return result == 0 ? Boolean.TRUE : Boolean.FALSE; case OpTypes.NOT_EQUAL : return result != 0 ? Boolean.TRUE : Boolean.FALSE; case OpTypes.GREATER : return result > 0 ? Boolean.TRUE : Boolean.FALSE; case OpTypes.GREATER_EQUAL : return result >= 0 ? Boolean.TRUE : Boolean.FALSE; case OpTypes.SMALLER_EQUAL : return result <= 0 ? Boolean.TRUE : Boolean.FALSE; case OpTypes.SMALLER : return result < 0 ? Boolean.TRUE : Boolean.FALSE; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } } /** * For MATCH SIMPLE and FULL expressions, nulls in left are handled * prior to calling this method */ private Boolean compareValues(Session session, Object[] left, Object[] right) { int result = 0; boolean hasNull = false; if (left == null || right == null) { return null; } Object[] leftList = (Object[]) left; Object[] rightList = (Object[]) right; for (int i = 0; i < nodes[LEFT].nodes.length; i++) { if (leftList[i] == null) { if (opType == OpTypes.MATCH_PARTIAL || opType == OpTypes.MATCH_UNIQUE_PARTIAL) { continue; } hasNull = true; } if (rightList[i] == null) { hasNull = true; } Object leftValue = leftList[i]; Object rightValue = rightList[i]; Type[] types = nodes[LEFT].nodeDataTypes; result = types[i].compare(session, leftValue, rightValue); if (result != 0) { break; } } switch (opType) { case OpTypes.MATCH_SIMPLE : case OpTypes.MATCH_UNIQUE_SIMPLE : case OpTypes.MATCH_PARTIAL : case OpTypes.MATCH_UNIQUE_PARTIAL : case OpTypes.MATCH_FULL : case OpTypes.MATCH_UNIQUE_FULL : case OpTypes.NOT_DISTINCT : return result == 0 ? Boolean.TRUE : Boolean.FALSE; case OpTypes.IN : case OpTypes.EQUAL : if (hasNull) { return null; } return result == 0 ? Boolean.TRUE : Boolean.FALSE; case OpTypes.NOT_EQUAL : if (hasNull) { return null; } return result != 0 ? Boolean.TRUE : Boolean.FALSE; case OpTypes.GREATER : if (hasNull) { return null; } return result > 0 ? Boolean.TRUE : Boolean.FALSE; case OpTypes.GREATER_EQUAL : if (hasNull) { return null; } return result >= 0 ? Boolean.TRUE : Boolean.FALSE; case OpTypes.SMALLER_EQUAL : if (hasNull) { return null; } return result <= 0 ? Boolean.TRUE : Boolean.FALSE; case OpTypes.SMALLER : if (hasNull) { return null; } return result < 0 ? Boolean.TRUE : Boolean.FALSE; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } } /** * Returns the result of testing a VALUE_LIST expression */ private Boolean testInCondition(Session session) { Object[] data = nodes[LEFT].getRowValue(session); if (data == null) { return null; } if (Expression.countNulls(data) != 0) { return null; } if (nodes[RIGHT].opType == OpTypes.VALUELIST) { final int length = nodes[RIGHT].nodes.length; for (int i = 0; i < length; i++) { Object[] rowData = nodes[RIGHT].nodes[i].getRowValue(session); if (Boolean.TRUE.equals(compareValues(session, data, rowData))) { return Boolean.TRUE; } } return Boolean.FALSE; } throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } private Boolean testNotDistinctCondition(Session session) { Object[] leftData = nodes[LEFT].getRowValue(session); Object[] rightData = nodes[RIGHT].getRowValue(session); if (leftData == null || rightData == null) { return leftData == rightData; } return compareValues(session, leftData, rightData); } private Boolean testMatchCondition(Session session) { Object[] data = nodes[LEFT].getRowValue(session); if (data == null) { return Boolean.TRUE; } final int nulls = countNulls(data); if (nulls != 0) { switch (opType) { case OpTypes.MATCH_SIMPLE : case OpTypes.MATCH_UNIQUE_SIMPLE : return Boolean.TRUE; case OpTypes.MATCH_PARTIAL : case OpTypes.MATCH_UNIQUE_PARTIAL : if (nulls == data.length) { return Boolean.TRUE; } break; case OpTypes.MATCH_FULL : case OpTypes.MATCH_UNIQUE_FULL : return nulls == data.length ? Boolean.TRUE : Boolean.FALSE; } } switch (nodes[RIGHT].opType) { case OpTypes.VALUELIST : { final int length = nodes[RIGHT].nodes.length; boolean hasMatch = false; for (int i = 0; i < length; i++) { Object[] rowData = nodes[RIGHT].nodes[i].getRowValue(session); Boolean result = compareValues(session, data, rowData); if (result == null || !result.booleanValue()) { continue; } switch (opType) { case OpTypes.MATCH_SIMPLE : case OpTypes.MATCH_PARTIAL : case OpTypes.MATCH_FULL : return Boolean.TRUE; case OpTypes.MATCH_UNIQUE_SIMPLE : case OpTypes.MATCH_UNIQUE_PARTIAL : case OpTypes.MATCH_UNIQUE_FULL : if (hasMatch) { return Boolean.FALSE; } hasMatch = true; } } return hasMatch ? Boolean.TRUE : Boolean.FALSE; } case OpTypes.TABLE_SUBQUERY : { PersistentStore store = nodes[RIGHT].getTable().getRowStore(session); nodes[RIGHT].materialise(session); convertToType(session, data, nodes[LEFT].nodeDataTypes, nodes[RIGHT].nodeDataTypes); if (nulls != 0 && (opType == OpTypes.MATCH_PARTIAL || opType == OpTypes.MATCH_UNIQUE_PARTIAL)) { boolean hasMatch = false; RowIterator it = nodes[RIGHT].getTable().rowIterator(session); while (it.hasNext()) { Object[] rowData = it.getNextRow().getData(); Boolean result = compareValues(session, data, rowData); if (result == null) { continue; } if (result.booleanValue()) { if (opType == OpTypes.MATCH_PARTIAL) { return Boolean.TRUE; } if (hasMatch) { return Boolean.FALSE; } hasMatch = true; } } return hasMatch ? Boolean.TRUE : Boolean.FALSE; } RowIterator it = nodes[RIGHT].getTable().getPrimaryIndex().findFirstRow( session, store, data); boolean result = it.hasNext(); if (!result) { return Boolean.FALSE; } switch (opType) { case OpTypes.MATCH_SIMPLE : case OpTypes.MATCH_PARTIAL : case OpTypes.MATCH_FULL : return Boolean.TRUE; } it.getNextRow(); result = it.hasNext(); if (!result) { return Boolean.TRUE; } Object[] rowData = it.getNextRow().getData(); Boolean returnValue = Boolean.TRUE.equals(compareValues(session, data, rowData)) ? Boolean.FALSE : Boolean.TRUE; return returnValue; } default : { throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } } } private Boolean testExistsCondition(Session session) { nodes[LEFT].materialise(session); return nodes[LEFT].getTable().isEmpty(session) ? Boolean.FALSE : Boolean.TRUE; } private Boolean testAllAnyCondition(Session session) { Object[] rowData = (Object[]) nodes[LEFT].getRowValue(session); TableDerived td = nodes[RIGHT].table; td.materialiseCorrelated(session); Boolean result = getAllAnyValue(session, rowData, td); return result; } private Boolean getAllAnyValue(Session session, Object[] data, TableDerived td) { Table table = td; boolean empty = table.isEmpty(session); Index index = table.getFullIndex(); RowIterator it; PersistentStore store = table.getRowStore(session); Row firstrow; Row lastrow; Object[] firstdata; Object[] lastdata; boolean hasNullValue = false; for (int i = 0; i < table.columnCount; i++) { hasNullValue |= store.hasNull(i); } switch (exprSubType) { case OpTypes.ANY_QUANTIFIED : { if (empty) { return Boolean.FALSE; } if (countNulls(data) == data.length) { return null; } convertToType(session, data, nodes[LEFT].nodeDataTypes, nodes[RIGHT].nodeDataTypes); if (opType == OpTypes.EQUAL) { it = index.findFirstRow(session, store, data); if (it.hasNext()) { return Boolean.TRUE; } else { if (hasNullValue) { return null; } else { return Boolean.FALSE; } } } if (opType == OpTypes.NOT_EQUAL) { it = index.firstRow(session, store); } else { it = index.findFirstRowNotNull(session, store); } firstrow = it.getNextRow(); if (firstrow == null) { return null; } firstdata = firstrow.getData(); lastrow = index.lastRow(session, store).getNextRow(); lastdata = lastrow.getData(); Boolean comparefirst = compareValues(session, data, firstdata); Boolean comparelast = compareValues(session, data, lastdata); switch (opType) { case OpTypes.NOT_EQUAL : if (Boolean.TRUE.equals(comparefirst) || Boolean.TRUE.equals(comparelast)) { return Boolean.TRUE; } else if (Boolean.FALSE.equals(comparefirst) && Boolean.FALSE.equals(comparelast)) { it = index.findFirstRow(session, store, data); return Boolean.FALSE; } else { return null; } case OpTypes.GREATER : return comparefirst; case OpTypes.GREATER_EQUAL : return comparefirst; case OpTypes.SMALLER : return comparelast; case OpTypes.SMALLER_EQUAL : return comparelast; } break; } case OpTypes.ALL_QUANTIFIED : { if (empty) { return Boolean.TRUE; } if (countNulls(data) == data.length) { return null; } it = index.firstRow(session, store); firstrow = it.getNextRow(); firstdata = firstrow.getData(); if (countNulls(firstdata) == data.length) { return null; } convertToType(session, data, nodes[LEFT].nodeDataTypes, nodes[RIGHT].nodeDataTypes); it = index.findFirstRow(session, store, data); if (opType == OpTypes.EQUAL) { if (it.hasNext()) { return store.elementCount(session) == 1 ? Boolean.TRUE : Boolean .FALSE; } else { return Boolean.FALSE; } } if (opType == OpTypes.NOT_EQUAL) { return it.hasNext() ? Boolean.FALSE : Boolean.TRUE; } lastrow = index.lastRow(session, store).getNextRow(); lastdata = lastrow.getData(); Boolean comparefirst = compareValues(session, data, firstdata); Boolean comparelast = compareValues(session, data, lastdata); switch (opType) { case OpTypes.GREATER : return comparelast; case OpTypes.GREATER_EQUAL : return comparelast; case OpTypes.SMALLER : return comparefirst; case OpTypes.SMALLER_EQUAL : return comparefirst; } break; } } return null; } /** * Converts an OR containing an AND to an AND */ void distributeOr() { if (opType != OpTypes.OR) { return; } if (nodes[LEFT].opType == OpTypes.AND) { opType = OpTypes.AND; Expression temp = new ExpressionLogical(OpTypes.OR, nodes[LEFT].nodes[RIGHT], nodes[RIGHT]); nodes[LEFT].opType = OpTypes.OR; nodes[LEFT].nodes[RIGHT] = nodes[RIGHT]; nodes[RIGHT] = temp; } else if (nodes[RIGHT].opType == OpTypes.AND) { Expression temp = nodes[LEFT]; nodes[LEFT] = nodes[RIGHT]; nodes[RIGHT] = temp; distributeOr(); return; } ((ExpressionLogical) nodes[LEFT]).distributeOr(); ((ExpressionLogical) nodes[RIGHT]).distributeOr(); } /** * */ public boolean isIndexable(RangeVariable rangeVar) { boolean result; switch (opType) { case OpTypes.AND : { result = nodes[LEFT].isIndexable(rangeVar) || nodes[RIGHT].isIndexable(rangeVar); return result; } case OpTypes.OR : { result = nodes[LEFT].isIndexable(rangeVar) && nodes[RIGHT].isIndexable(rangeVar); return result; } default : { Expression temp = getIndexableExpression(rangeVar); return temp != null; } } } Expression getIndexableExpression(RangeVariable rangeVar) { switch (opType) { case OpTypes.IS_NULL : return nodes[LEFT].opType == OpTypes.COLUMN && nodes[LEFT].isIndexable(rangeVar) ? this : null; case OpTypes.NOT : return nodes[LEFT].opType == OpTypes.IS_NULL && nodes[LEFT].nodes[LEFT].opType == OpTypes.COLUMN && nodes[LEFT].nodes[LEFT].isIndexable(rangeVar) ? this : null; case OpTypes.EQUAL : if (exprSubType == OpTypes.ANY_QUANTIFIED) { if (nodes[RIGHT].isCorrelated) { return null; } for (int node = 0; node < nodes[LEFT].nodes.length; node++) { if (nodes[LEFT].nodes[node].opType == OpTypes.COLUMN && nodes[LEFT].nodes[node].isIndexable( rangeVar)) { return this; } } return null; } // fall through case OpTypes.GREATER : case OpTypes.GREATER_EQUAL : case OpTypes.SMALLER : case OpTypes.SMALLER_EQUAL : if (exprSubType != 0 && exprSubType != OpTypes.LIKE) { return null; } if (nodes[LEFT].opType == OpTypes.COLUMN && nodes[LEFT].isIndexable(rangeVar)) { if (nodes[RIGHT].hasReference(rangeVar)) { return null; } return this; } if (nodes[LEFT].hasReference(rangeVar)) { return null; } if (nodes[RIGHT].opType == OpTypes.COLUMN && nodes[RIGHT].isIndexable(rangeVar)) { swapCondition(); return this; } return null; case OpTypes.OR : if (isIndexable(rangeVar)) { return this; } return null; default : return null; } } /** * Called only on comparison expressions after reordering which have * a COLUMN left leaf */ boolean isSimpleBound() { if (opType == OpTypes.IS_NULL) { return true; } if (nodes[RIGHT] != null) { if (nodes[RIGHT].opType == OpTypes.VALUE) { // also true for all parameters return true; } if (nodes[RIGHT].opType == OpTypes.SQL_FUNCTION) { if (((FunctionSQL) nodes[RIGHT]).isValueFunction()) { return true; } } } return false; } boolean convertToSmaller() { switch (opType) { case OpTypes.GREATER_EQUAL : case OpTypes.GREATER : swapCondition(); return true; case OpTypes.SMALLER_EQUAL : case OpTypes.SMALLER : return true; default : return false; } } /** * Swap the condition with its complement */ void swapCondition() { int i = OpTypes.EQUAL; switch (opType) { case OpTypes.GREATER_EQUAL : i = OpTypes.SMALLER_EQUAL; break; case OpTypes.SMALLER_EQUAL : i = OpTypes.GREATER_EQUAL; break; case OpTypes.SMALLER : i = OpTypes.GREATER; break; case OpTypes.GREATER : i = OpTypes.SMALLER; break; case OpTypes.NOT_DISTINCT : i = OpTypes.NOT_DISTINCT; break; case OpTypes.EQUAL : break; default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } opType = i; Expression e = nodes[LEFT]; nodes[LEFT] = nodes[RIGHT]; nodes[RIGHT] = e; } boolean reorderComparison(Session session, Expression parent) { Expression colExpression = null; Expression nonColExpression = null; boolean left = false; boolean replaceColumn = false; int operation = 0; if (nodes[LEFT].opType == OpTypes.ADD) { operation = OpTypes.SUBTRACT; left = true; } else if (nodes[LEFT].opType == OpTypes.SUBTRACT) { operation = OpTypes.ADD; left = true; } else if (nodes[RIGHT].opType == OpTypes.ADD) { operation = OpTypes.SUBTRACT; } else if (nodes[RIGHT].opType == OpTypes.SUBTRACT) { operation = OpTypes.ADD; } if (operation == 0) { return false; } if (left) { if (nodes[LEFT].nodes[LEFT].opType == OpTypes.COLUMN) { colExpression = nodes[LEFT].nodes[LEFT]; nonColExpression = nodes[LEFT].nodes[RIGHT]; } else if (nodes[LEFT].nodes[RIGHT].opType == OpTypes.COLUMN) { replaceColumn = operation == OpTypes.ADD; colExpression = nodes[LEFT].nodes[RIGHT]; nonColExpression = nodes[LEFT].nodes[LEFT]; } } else { if (nodes[RIGHT].nodes[LEFT].opType == OpTypes.COLUMN) { colExpression = nodes[RIGHT].nodes[LEFT]; nonColExpression = nodes[RIGHT].nodes[RIGHT]; } else if (nodes[RIGHT].nodes[RIGHT].opType == OpTypes.COLUMN) { replaceColumn = operation == OpTypes.ADD; colExpression = nodes[RIGHT].nodes[RIGHT]; nonColExpression = nodes[RIGHT].nodes[LEFT]; } } if (colExpression == null) { return false; } Expression otherExpression = left ? nodes[RIGHT] : nodes[LEFT]; ExpressionArithmetic newArg = null; if (!replaceColumn) { newArg = new ExpressionArithmetic(operation, otherExpression, nonColExpression); newArg.resolveTypesForArithmetic(session, parent); } if (left) { if (replaceColumn) { nodes[RIGHT] = colExpression; nodes[LEFT].nodes[RIGHT] = otherExpression; ((ExpressionArithmetic) nodes[LEFT]).resolveTypesForArithmetic( session, parent); } else { nodes[LEFT] = colExpression; nodes[RIGHT] = newArg; } } else { if (replaceColumn) { nodes[LEFT] = colExpression; nodes[RIGHT].nodes[RIGHT] = otherExpression; ((ExpressionArithmetic) nodes[RIGHT]) .resolveTypesForArithmetic(session, parent); } else { nodes[RIGHT] = colExpression; nodes[LEFT] = newArg; } } return true; } boolean isConditionRangeVariable(RangeVariable range) { if (nodes[LEFT].getRangeVariable() == range) { return true; } if (nodes[RIGHT].getRangeVariable() == range) { return true; } return false; } RangeVariable[] getJoinRangeVariables(RangeVariable[] ranges) { OrderedHashSet set = collectRangeVariables(ranges, null); if (set != null) { rangeArray = new RangeVariable[set.size()]; set.toArray(rangeArray); } return rangeArray; } double costFactor(Session session, RangeVariable rangeVar, int operation) { double cost; switch (opType) { case OpTypes.OR : { return nodes[LEFT].costFactor(session, rangeVar, opType) + nodes[RIGHT].costFactor(session, rangeVar, opType); } case OpTypes.OVERLAPS : case OpTypes.IN : case OpTypes.MATCH_SIMPLE : case OpTypes.MATCH_PARTIAL : case OpTypes.MATCH_FULL : case OpTypes.MATCH_UNIQUE_SIMPLE : case OpTypes.MATCH_UNIQUE_PARTIAL : case OpTypes.MATCH_UNIQUE_FULL : case OpTypes.NOT_DISTINCT : { PersistentStore store = rangeVar.rangeTable.getRowStore(session); cost = store.elementCount(); if (cost < Index.minimumSelectivity) { cost = Index.minimumSelectivity; } break; } case OpTypes.IS_NULL : case OpTypes.NOT : { cost = costFactorUnaryColumn(session, rangeVar); break; } case OpTypes.EQUAL : { switch (exprSubType) { case OpTypes.ANY_QUANTIFIED : { if (nodes[LEFT].opType == OpTypes.COLUMN && nodes[LEFT].getRangeVariable() == rangeVar) { cost = costFactorColumns(session, rangeVar); cost *= 1024; break; } } // fall through case OpTypes.ALL_QUANTIFIED : { PersistentStore store = rangeVar.rangeTable.getRowStore(session); cost = store.elementCount(); if (cost < Index.minimumSelectivity) { cost = Index.minimumSelectivity; } cost *= 1024; break; } default : cost = costFactorColumns(session, rangeVar); } break; } case OpTypes.GREATER : case OpTypes.GREATER_EQUAL : case OpTypes.SMALLER : case OpTypes.SMALLER_EQUAL : { cost = costFactorColumns(session, rangeVar); break; } default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionLogical"); } return cost; } double costFactorUnaryColumn(Session session, RangeVariable rangeVar) { if (nodes[LEFT].opType == OpTypes.COLUMN && nodes[LEFT].getRangeVariable() == rangeVar) { return nodes[LEFT].costFactor(session, rangeVar, opType); } else { PersistentStore store = rangeVar.rangeTable.getRowStore(session); double cost = store.elementCount(); return cost < Index.minimumSelectivity ? Index.minimumSelectivity : cost; } } double costFactorColumns(Session session, RangeVariable rangeVar) { double cost = 0; if (nodes[LEFT].opType == OpTypes.COLUMN && nodes[LEFT].getRangeVariable() == rangeVar) { if (!nodes[RIGHT].hasReference(rangeVar)) { cost = nodes[LEFT].costFactor(session, rangeVar, opType); } } else if (nodes[RIGHT].opType == OpTypes.COLUMN && nodes[RIGHT].getRangeVariable() == rangeVar) { if (!nodes[LEFT].hasReference(rangeVar)) { cost = nodes[RIGHT].costFactor(session, rangeVar, opType); } } else { PersistentStore store = rangeVar.rangeTable.getRowStore(session); cost = store.elementCount(); } if (cost == 0) { PersistentStore store = rangeVar.rangeTable.getRowStore(session); cost = store.elementCount(); } if (cost < Index.minimumSelectivity) { cost = Index.minimumSelectivity; } return cost; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ExpressionColumn.java0000644000175000017500000010315312007547362023127 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.HsqlNameManager.SimpleName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.ArrayListIdentity; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HsqlList; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.Set; import org.hsqldb.navigator.RangeIterator; import org.hsqldb.persist.PersistentStore; import org.hsqldb.store.ValuePool; import org.hsqldb.types.Type; /** * Implementation of column, variable, parameter, etc. access operations. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class ExpressionColumn extends Expression { public static final ExpressionColumn[] emptyArray = new ExpressionColumn[]{}; static final SimpleName rownumName = HsqlNameManager.getSimpleName("ROWNUM", false); // public final static HashMappedList diagnosticsList = new HashMappedList(); final static String[] diagnosticsVariableTokens = new String[] { Tokens.T_NUMBER, Tokens.T_MORE, Tokens.T_ROW_COUNT }; public final static int idx_number = 0; public final static int idx_more = 1; public final static int idx_row_count = 2; static { for (int i = 0; i < diagnosticsVariableTokens.length; i++) { HsqlName name = HsqlNameManager.newSystemObjectName( diagnosticsVariableTokens[i], SchemaObject.VARIABLE); Type type = Type.SQL_INTEGER; if (diagnosticsVariableTokens[i] == Tokens.T_MORE) { type = Type.SQL_CHAR; } ColumnSchema col = new ColumnSchema(name, type, false, false, null); diagnosticsList.add(diagnosticsVariableTokens[i], col); } } // ColumnSchema column; String schema; String tableName; String columnName; RangeVariable rangeVariable; // NumberSequence sequence; boolean isWritable; // = false; true if column of writable table // boolean isParam; // /** * Creates a OpTypes.COLUMN expression */ ExpressionColumn(String schema, String table, String column) { super(OpTypes.COLUMN); this.schema = schema; this.tableName = table; this.columnName = column; } ExpressionColumn(ColumnSchema column) { super(OpTypes.COLUMN); this.column = column; this.dataType = column.getDataType(); columnName = column.getName().name; } ExpressionColumn(RangeVariable rangeVar, int index) { super(OpTypes.COLUMN); columnIndex = index; setAutoAttributesAsColumn(rangeVar, columnIndex); } /** * Creates a temporary OpTypes.COLUMN expression */ ExpressionColumn(Expression e, int colIndex, int rangePosition) { super(OpTypes.SIMPLE_COLUMN); dataType = e.dataType; columnIndex = colIndex; alias = e.alias; this.rangePosition = rangePosition; } ExpressionColumn() { super(OpTypes.ASTERISK); } ExpressionColumn(int type) { super(type); if (type == OpTypes.DYNAMIC_PARAM) { isParam = true; } else if (type == OpTypes.ROWNUM) { columnName = rownumName.name; dataType = Type.SQL_INTEGER; } } /** * For diagnostics vars */ ExpressionColumn(int type, int columnIndex) { super(type); this.column = (ColumnSchema) diagnosticsList.get(columnIndex); this.columnIndex = columnIndex; this.dataType = column.dataType; } ExpressionColumn(Expression[] nodes, String name) { super(OpTypes.COALESCE); this.nodes = nodes; this.columnName = name; } /** * Creates an OpCodes.ASTERISK expression */ ExpressionColumn(String schema, String table) { super(OpTypes.MULTICOLUMN); this.schema = schema; tableName = table; } /** * Creates a OpTypes.SEQUENCE expression */ ExpressionColumn(NumberSequence sequence, int opType) { super(opType); this.sequence = sequence; dataType = sequence.getDataType(); } void setAutoAttributesAsColumn(RangeVariable range, int i) { columnIndex = i; column = range.getColumn(i); dataType = column.getDataType(); columnName = range.getColumnAlias(i).name; tableName = range.getTableAlias().name; rangeVariable = range; rangeVariable.addColumn(columnIndex); } void setAttributesAsColumn(RangeVariable range, int i) { columnIndex = i; column = range.getColumn(i); dataType = column.getDataType(); rangeVariable = range; rangeVariable.addColumn(columnIndex); } public byte getNullability() { switch (opType) { case OpTypes.COLUMN : if (nullability == SchemaObject.Nullability.NULLABLE_UNKNOWN) { return column.getNullability(); } return nullability; case OpTypes.SEQUENCE : case OpTypes.COALESCE : case OpTypes.ROWNUM : return SchemaObject.Nullability.NO_NULLS; default : return SchemaObject.Nullability.NULLABLE_UNKNOWN; } } void setAttributesAsColumn(ColumnSchema column, boolean isWritable) { this.column = column; dataType = column.getDataType(); this.isWritable = isWritable; } SimpleName getSimpleName() { if (alias != null) { return alias; } if (rangeVariable != null && rangeVariable.hasColumnAlias()) { return rangeVariable.getColumnAlias(columnIndex); } if (column != null) { return column.getName(); } if (opType == OpTypes.COALESCE) { return nodes[LEFT].getSimpleName(); } else if (opType == OpTypes.ROWNUM) { return rownumName; } return null; } String getAlias() { if (alias != null) { return alias.name; } switch (opType) { case OpTypes.COLUMN : case OpTypes.COALESCE : case OpTypes.ROWNUM : return columnName; } return ""; } void collectObjectNames(Set set) { switch (opType) { case OpTypes.SEQUENCE : HsqlName name = sequence.getName(); set.add(name); return; case OpTypes.MULTICOLUMN : case OpTypes.DYNAMIC_PARAM : case OpTypes.ASTERISK : case OpTypes.SIMPLE_COLUMN : case OpTypes.COALESCE : break; case OpTypes.PARAMETER : case OpTypes.VARIABLE : break; case OpTypes.COLUMN : set.add(column.getName()); if (column.getName().parent != null) { set.add(column.getName().parent); } return; } } String getColumnName() { switch (opType) { case OpTypes.COLUMN : case OpTypes.PARAMETER : case OpTypes.VARIABLE : if (column != null) { return column.getName().name; } } return getAlias(); } public ColumnSchema getColumn() { return column; } String getSchemaName() { return schema; } RangeVariable getRangeVariable() { return rangeVariable; } public HsqlList resolveColumnReferences(Session session, RangeGroup rangeGroup, int rangeCount, RangeGroup[] rangeGroups, HsqlList unresolvedSet, boolean acceptsSequences) { switch (opType) { case OpTypes.SEQUENCE : if (!acceptsSequences) { throw Error.error(ErrorCode.X_42598); } break; case OpTypes.ROWNUM : case OpTypes.MULTICOLUMN : case OpTypes.DYNAMIC_PARAM : case OpTypes.ASTERISK : case OpTypes.SIMPLE_COLUMN : case OpTypes.COALESCE : case OpTypes.DIAGNOSTICS_VARIABLE : break; case OpTypes.COLUMN : case OpTypes.PARAMETER : case OpTypes.VARIABLE : { boolean resolved = false; boolean tableQualified = tableName != null; if (rangeVariable != null) { return unresolvedSet; } RangeVariable[] rangeVarArray = rangeGroup.getRangeVariables(); for (int i = 0; i < rangeCount; i++) { RangeVariable rangeVar = rangeVarArray[i]; if (rangeVar == null) { continue; } if (resolved) { if (session.database.sqlEnforceRefs) { if (resolvesDuplicateColumnReference(rangeVar)) { String message = getColumnName(); if (alias != null) { StringBuffer sb = new StringBuffer(message); sb.append(' ').append(Tokens.T_AS).append( ' ').append(alias.getStatementName()); message = sb.toString(); } throw Error.error(ErrorCode.X_42580, message); } } } else { if (resolveColumnReference(rangeVar, false)) { if (tableQualified) { return unresolvedSet; } resolved = true; continue; } } } if (resolved) { return unresolvedSet; } if (session.database.sqlSyntaxOra) { if (acceptsSequences && tableName != null) { if (Tokens.T_CURRVAL.equals(columnName)) { NumberSequence seq = session.database.schemaManager.getSequence( tableName, session.getSchemaName(schema), false); if (seq != null) { opType = OpTypes.SEQUENCE_CURRENT; dataType = seq.getDataType(); sequence = seq; schema = null; tableName = null; columnName = null; resolved = true; } } else if (Tokens.T_NEXTVAL.equals(columnName)) { NumberSequence seq = session.database.schemaManager.getSequence( tableName, session.getSchemaName(schema), false); if (seq != null) { opType = OpTypes.SEQUENCE; dataType = seq.getDataType(); sequence = seq; schema = null; tableName = null; columnName = null; resolved = true; } } } } if (resolved) { return unresolvedSet; } for (int idx = rangeGroups.length - 1; idx >= 0; idx--) { rangeVarArray = rangeGroups[idx].getRangeVariables(); for (int i = 0; i < rangeVarArray.length; i++) { RangeVariable rangeVar = rangeVarArray[i]; if (rangeVar == null) { continue; } if (resolveColumnReference(rangeVar, true)) { if (opType == OpTypes.COLUMN) { rangeGroup.setCorrelated(); for (int idxx = rangeGroups.length - 1; idxx > idx; idxx--) { rangeGroups[idxx].setCorrelated(); } } return unresolvedSet; } } } if (unresolvedSet == null) { unresolvedSet = new ArrayListIdentity(); } unresolvedSet.add(this); } } return unresolvedSet; } private boolean resolveColumnReference(RangeVariable rangeVar, boolean outer) { Expression e = rangeVar.getColumnExpression(columnName); if (e != null) { opType = e.opType; nodes = e.nodes; dataType = e.dataType; return true; } int colIndex = rangeVar.findColumn(schema, tableName, columnName); if (colIndex == -1) { return false; } switch (rangeVar.rangeType) { case RangeVariable.PARAMETER_RANGE : case RangeVariable.VARIALBE_RANGE : { if (tableName != null) { return false; } ColumnSchema column = rangeVar.getColumn(colIndex); if (column.getParameterMode() == SchemaObject.ParameterModes.PARAM_OUT) { return false; } else { opType = rangeVar.rangeType == RangeVariable.VARIALBE_RANGE ? OpTypes.VARIABLE : OpTypes .PARAMETER; } break; } case RangeVariable.TRANSITION_RANGE : { if (tableName == null) { return false; } if (schema != null) { return false; } opType = OpTypes.TRANSITION_VARIABLE; break; } default : { break; } } setAttributesAsColumn(rangeVar, colIndex); return true; } boolean resolvesDuplicateColumnReference(RangeVariable rangeVar) { if (tableName == null) { Expression e = rangeVar.getColumnExpression(columnName); if (e != null) { return false; } switch (rangeVar.rangeType) { case RangeVariable.PARAMETER_RANGE : case RangeVariable.VARIALBE_RANGE : case RangeVariable.TRANSITION_RANGE : return false; default : int colIndex = rangeVar.findColumn(schema, tableName, columnName); return colIndex != -1; } } return false; } public void resolveTypes(Session session, Expression parent) { switch (opType) { case OpTypes.DEFAULT : if (parent != null && parent.opType != OpTypes.ROW) { throw Error.error(ErrorCode.X_42544); } break; case OpTypes.COALESCE : { Type type = null; for (int i = 0; i < nodes.length; i++) { type = Type.getAggregateType(nodes[i].dataType, type); } dataType = type; break; } } } public Object getValue(Session session) { switch (opType) { case OpTypes.DEFAULT : return null; case OpTypes.DIAGNOSTICS_VARIABLE : { return getDiagnosticsVariable(session); } case OpTypes.VARIABLE : { return session.sessionContext.routineVariables[columnIndex]; } case OpTypes.PARAMETER : { return session.sessionContext.routineArguments[columnIndex]; } case OpTypes.TRANSITION_VARIABLE : { return session.sessionContext .triggerArguments[rangeVariable.rangePosition][columnIndex]; } case OpTypes.COLUMN : { RangeIterator[] iterators = session.sessionContext.rangeIterators; Object value = iterators[rangeVariable.rangePosition].getCurrent( columnIndex); if (dataType != column.dataType) { value = dataType.convertToType(session, value, column.dataType); } return value; } case OpTypes.SIMPLE_COLUMN : { Object value = session.sessionContext.rangeIterators[rangePosition] .getCurrent(columnIndex); return value; } case OpTypes.COALESCE : { Object value = null; for (int i = 0; i < nodes.length; i++) { value = nodes[i].getValue(session, dataType); if (value != null) { return value; } } return value; } case OpTypes.DYNAMIC_PARAM : { return session.sessionContext.dynamicArguments[parameterIndex]; } case OpTypes.SEQUENCE : { return session.sessionData.getSequenceValue(sequence); } case OpTypes.SEQUENCE_CURRENT : { return session.sessionData.getSequenceCurrent(sequence); } case OpTypes.ROWNUM : { return ValuePool.getInt(session.sessionContext.rownum); } case OpTypes.ASTERISK : case OpTypes.MULTICOLUMN : default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionColumn"); } } private Object getDiagnosticsVariable(Session session) { return session.sessionContext.diagnosticsVariables[columnIndex]; } public String getSQL() { switch (opType) { case OpTypes.DEFAULT : return Tokens.T_DEFAULT; case OpTypes.DYNAMIC_PARAM : return Tokens.T_QUESTION; case OpTypes.ASTERISK : return "*"; case OpTypes.COALESCE : return alias.getStatementName(); case OpTypes.DIAGNOSTICS_VARIABLE : case OpTypes.VARIABLE : case OpTypes.PARAMETER : return column.getName().statementName; case OpTypes.ROWNUM : { StringBuffer sb = new StringBuffer(Tokens.T_ROWNUM); sb.append('(').append(')'); } case OpTypes.COLUMN : { if (column == null) { if (alias != null) { return alias.getStatementName(); } else { if (tableName == null) { return columnName; } StringBuffer sb = new StringBuffer(); sb.append(tableName); sb.append('.'); sb.append(columnName); return sb.toString(); } } if (rangeVariable.tableAlias == null) { return column.getName().getSchemaQualifiedStatementName(); } else { StringBuffer sb = new StringBuffer(); sb.append(rangeVariable.tableAlias.getStatementName()); sb.append('.'); sb.append(column.getName().statementName); return sb.toString(); } } case OpTypes.MULTICOLUMN : { if (nodes.length == 0) { return "*"; } StringBuffer sb = new StringBuffer(); for (int i = 0; i < nodes.length; i++) { Expression e = nodes[i]; if (i > 0) { sb.append(','); } String s = e.getSQL(); sb.append(s); } return sb.toString(); } default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionColumn"); } } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(64); for (int i = 0; i < blanks; i++) { sb.append(' '); } switch (opType) { case OpTypes.DEFAULT : sb.append(Tokens.T_DEFAULT); break; case OpTypes.ASTERISK : sb.append("OpTypes.ASTERISK "); break; case OpTypes.VARIABLE : sb.append("VARIABLE: "); sb.append(column.getName().name); break; case OpTypes.PARAMETER : sb.append(Tokens.T_PARAMETER).append(": "); sb.append(column.getName().name); break; case OpTypes.COALESCE : sb.append(Tokens.T_COLUMN).append(": "); sb.append(columnName); if (alias != null) { sb.append(" AS ").append(alias.name); } break; case OpTypes.COLUMN : sb.append(Tokens.T_COLUMN).append(": "); sb.append(column.getName().getSchemaQualifiedStatementName()); if (alias != null) { sb.append(" AS ").append(alias.name); } break; case OpTypes.DYNAMIC_PARAM : sb.append("DYNAMIC PARAM: "); sb.append(", TYPE = ").append(dataType.getNameString()); break; case OpTypes.SEQUENCE : sb.append(Tokens.T_SEQUENCE).append(": "); sb.append(sequence.getName().name); break; case OpTypes.MULTICOLUMN : // shouldn't get here } sb.append('\n'); return sb.toString(); } /** * Returns the table name used in query * * @return table name */ String getTableName() { if (opType == OpTypes.MULTICOLUMN) { return tableName; } if (opType == OpTypes.COLUMN) { if (rangeVariable == null) { return tableName; } else { return rangeVariable.getTable().getName().name; } } return ""; } static void checkColumnsResolved(HsqlList set) { if (set != null && !set.isEmpty()) { StringBuffer sb = new StringBuffer(); Expression e = (Expression) set.get(0); if (e instanceof ExpressionColumn) { ExpressionColumn c = (ExpressionColumn) e; if (c.schema != null) { sb.append(c.schema + '.'); } if (c.tableName != null) { sb.append(c.tableName + '.'); } sb.append(c.getColumnName()); throw Error.error(ErrorCode.X_42501, sb.toString()); } else { OrderedHashSet newSet = new OrderedHashSet(); e.collectAllExpressions(newSet, Expression.columnExpressionSet, Expression.emptyExpressionSet); // throw with column name checkColumnsResolved(newSet); // throw anyway if not found throw Error.error(ErrorCode.X_42501); } } } public OrderedHashSet getUnkeyedColumns(OrderedHashSet unresolvedSet) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } unresolvedSet = nodes[i].getUnkeyedColumns(unresolvedSet); } if (opType == OpTypes.COLUMN && !rangeVariable.hasKeyedColumnInGroupBy) { if (unresolvedSet == null) { unresolvedSet = new OrderedHashSet(); } unresolvedSet.add(this); } return unresolvedSet; } /** * collects all range variables in expression tree */ OrderedHashSet collectRangeVariables(RangeVariable[] rangeVariables, OrderedHashSet set) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { set = nodes[i].collectRangeVariables(rangeVariables, set); } } if (rangeVariable != null) { for (int i = 0; i < rangeVariables.length; i++) { if (rangeVariables[i] == rangeVariable) { if (set == null) { set = new OrderedHashSet(); } set.add(rangeVariable); break; } } } return set; } Expression replaceAliasInOrderBy(Expression[] columns, int length) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } nodes[i] = nodes[i].replaceAliasInOrderBy(columns, length); } switch (opType) { case OpTypes.COALESCE : case OpTypes.COLUMN : { for (int i = 0; i < length; i++) { SimpleName aliasName = columns[i].alias; String alias = aliasName == null ? null : aliasName.name; if (schema == null && tableName == null && columnName.equals(alias)) { return columns[i]; } } for (int i = 0; i < length; i++) { if (columns[i] instanceof ExpressionColumn) { if (this.equals(columns[i])) { return columns[i]; } if (tableName == null && schema == null && columnName .equals(((ExpressionColumn) columns[i]) .columnName)) { return columns[i]; } } } } default : } return this; } Expression replaceColumnReferences(RangeVariable range, Expression[] list) { if (opType == OpTypes.COLUMN && rangeVariable == range) { return list[columnIndex]; } for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } nodes[i] = nodes[i].replaceColumnReferences(range, list); } return this; } /** * return true if given RangeVariable is used in expression tree */ boolean hasReference(RangeVariable range) { if (range == rangeVariable) { return true; } for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { if (nodes[i].hasReference(range)) { return true; } } } return false; } /** * SIMPLE_COLUMN expressions can be of different Java types */ public boolean equals(Expression other) { if (other == this) { return true; } if (other == null) { return false; } if (opType != other.opType) { return false; } switch (opType) { case OpTypes.SIMPLE_COLUMN : return this.columnIndex == other.columnIndex; case OpTypes.COALESCE : return nodes == other.nodes; case OpTypes.VARIABLE : case OpTypes.PARAMETER : case OpTypes.COLUMN : return column == other.getColumn() && rangeVariable == other.getRangeVariable(); default : return false; } } void replaceRangeVariables(RangeVariable[] ranges, RangeVariable[] newRanges) { for (int i = 0; i < nodes.length; i++) { nodes[i].replaceRangeVariables(ranges, newRanges); } for (int i = 0; i < ranges.length; i++) { if (rangeVariable == ranges[i]) { rangeVariable = newRanges[i]; break; } } } void resetColumnReferences() { rangeVariable = null; columnIndex = -1; } public boolean isIndexable(RangeVariable range) { if (opType == OpTypes.COLUMN) { return rangeVariable == range; } return false; } public boolean isUnresolvedParam() { return isParam && dataType == null; } boolean isDynamicParam() { return isParam; } RangeVariable[] getJoinRangeVariables(RangeVariable[] ranges) { if (opType == OpTypes.COLUMN) { return new RangeVariable[]{ rangeVariable }; } return RangeVariable.emptyArray; } /** * For normal tables only. We don't want to create an index on * each column that is checked. */ double costFactor(Session session, RangeVariable range, int operation) { if (range.rangeTable instanceof TableDerived) { return 1024; } PersistentStore store = range.rangeTable.getRowStore(session); int indexType = range.rangeTable.indexTypeForColumn(session, columnIndex); double factor; switch (indexType) { case Index.INDEX_UNIQUE : if (operation == OpTypes.EQUAL) { factor = 1; } else { factor = store.elementCount() / 2; } break; case Index.INDEX_NON_UNIQUE : if (operation == OpTypes.EQUAL) { factor = store.elementCount() / 8; if (factor > 1024) { factor = 1024; } } else { factor = store.elementCount() / 2; } break; case Index.INDEX_NONE : default : factor = store.elementCount(); break; } return factor < Index.minimumSelectivity ? Index.minimumSelectivity : factor; } public Expression duplicate() { if (opType == OpTypes.PARAMETER) { return this; } return super.duplicate(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ExpressionValue.java0000644000175000017500000000715312007547406022750 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.types.Type; /** * Implementation of value access operations. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.9.0 * @since 1.9.0 */ public class ExpressionValue extends Expression { /** * Creates a VALUE expression */ ExpressionValue(Object o, Type datatype) { super(OpTypes.VALUE); nodes = Expression.emptyArray; dataType = datatype; valueData = o; } public byte getNullability() { return valueData == null ? SchemaObject.Nullability.NULLABLE : SchemaObject.Nullability.NO_NULLS; } public String getSQL() { switch (opType) { case OpTypes.VALUE : if (valueData == null) { return Tokens.T_NULL; } return dataType.convertToSQLString(valueData); default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionValue"); } } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(64); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } switch (opType) { case OpTypes.VALUE : sb.append("VALUE = ").append( dataType.convertToSQLString(valueData)); sb.append(", TYPE = ").append(dataType.getNameString()); return sb.toString(); default : throw Error.runtimeError(ErrorCode.U_S0500, "ExpressionValue"); } } Object getValue(Session session, Type type) { if (dataType == type || valueData == null) { return valueData; } return type.convertToType(session, valueData, dataType); } public Object getValue(Session session) { return valueData; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementDML.java0000644000175000017500000015701012007547352022113 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.ParserDQL.CompileContext; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.navigator.RangeIterator; import org.hsqldb.navigator.RowIterator; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.navigator.RowSetNavigatorClient; import org.hsqldb.navigator.RowSetNavigatorDataChange; import org.hsqldb.persist.PersistentStore; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.result.ResultMetaData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Implementation of Statement for DML statements.

              * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ // support for MERGE statement originally contributed by Justin Spadea (jzs9783@users dot sourceforge.net) public class StatementDML extends StatementDMQL { Expression[] targets; boolean isTruncate; // boolean isSimpleInsert; int generatedType; ResultMetaData generatedInputMetaData; /** column indexes for generated values */ int[] generatedIndexes; /** ResultMetaData for generated values */ ResultMetaData generatedResultMetaData; public StatementDML(int type, int group, HsqlName schemaName) { super(type, group, schemaName); } /** * Instantiate this as a DELETE statement */ StatementDML(Session session, Table targetTable, RangeVariable[] rangeVars, CompileContext compileContext, boolean restartIdentity, int type) { super(StatementTypes.DELETE_WHERE, StatementTypes.X_SQL_DATA_CHANGE, session.getCurrentSchemaHsqlName()); this.targetTable = targetTable; this.baseTable = targetTable.getBaseTable() == null ? targetTable : targetTable .getBaseTable(); this.targetRangeVariables = rangeVars; this.restartIdentity = restartIdentity; setDatabseObjects(session, compileContext); checkAccessRights(session); if (type == StatementTypes.TRUNCATE) { isTruncate = true; } targetRangeVariables[0].addAllColumns(); } /** * Instantiate this as an UPDATE statement. */ StatementDML(Session session, Expression[] targets, Table targetTable, RangeVariable rangeVars[], int[] updateColumnMap, Expression[] colExpressions, boolean[] checkColumns, CompileContext compileContext) { super(StatementTypes.UPDATE_WHERE, StatementTypes.X_SQL_DATA_CHANGE, session.getCurrentSchemaHsqlName()); this.targets = targets; this.targetTable = targetTable; this.baseTable = targetTable.getBaseTable() == null ? targetTable : targetTable .getBaseTable(); this.updateColumnMap = updateColumnMap; this.updateExpressions = colExpressions; this.updateCheckColumns = checkColumns; this.targetRangeVariables = rangeVars; setupChecks(); setDatabseObjects(session, compileContext); checkAccessRights(session); targetRangeVariables[0].addAllColumns(); } /** * Instantiate this as a MERGE statement. */ StatementDML(Session session, Expression[] targets, RangeVariable[] targetRangeVars, int[] insertColMap, int[] updateColMap, boolean[] checkColumns, Expression mergeCondition, Expression insertExpr, Expression[] updateExpr, CompileContext compileContext) { super(StatementTypes.MERGE, StatementTypes.X_SQL_DATA_CHANGE, session.getCurrentSchemaHsqlName()); this.targets = targets; this.sourceTable = targetRangeVars[0].rangeTable; this.targetTable = targetRangeVars[1].rangeTable; this.baseTable = targetTable.isTriggerUpdatable() ? targetTable : targetTable .getBaseTable(); this.insertCheckColumns = checkColumns; this.insertColumnMap = insertColMap; this.updateColumnMap = updateColMap; this.insertExpression = insertExpr; this.updateExpressions = updateExpr; this.targetRangeVariables = targetRangeVars; this.condition = mergeCondition; setupChecks(); setDatabseObjects(session, compileContext); checkAccessRights(session); } /** * Instantiate this as a CURSOR operation statement. */ StatementDML() { super(StatementTypes.UPDATE_CURSOR, StatementTypes.X_SQL_DATA_CHANGE, null); } void setupChecks() { if (targetTable != baseTable) { QuerySpecification select = ((TableDerived) targetTable).getQueryExpression() .getMainSelect(); this.updatableTableCheck = select.checkQueryCondition; this.checkRangeVariable = select.rangeVariables[select.rangeVariables.length - 1]; } } Result getResult(Session session) { Result result = null; switch (type) { case StatementTypes.UPDATE_WHERE : result = executeUpdateStatement(session); break; case StatementTypes.MERGE : result = executeMergeStatement(session); break; case StatementTypes.DELETE_WHERE : if (isTruncate) { result = executeDeleteTruncateStatement(session); } else { result = executeDeleteStatement(session); } break; default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementDML"); } session.sessionContext .diagnosticsVariables[ExpressionColumn.idx_row_count] = Integer.valueOf(result.getUpdateCount()); return result; } // this fk references -> other : other read lock void collectTableNamesForRead(OrderedHashSet set) { if (baseTable.isView()) { getTriggerTableNames(set, false); } else if (!baseTable.isTemp()) { for (int i = 0; i < baseTable.fkConstraints.length; i++) { Constraint constraint = baseTable.fkConstraints[i]; switch (type) { case StatementTypes.UPDATE_WHERE : { if (ArrayUtil.haveCommonElement( constraint.getRefColumns(), updateColumnMap)) { set.add(baseTable.fkConstraints[i].getMain() .getName()); } break; } case StatementTypes.INSERT : { set.add( baseTable.fkConstraints[i].getMain().getName()); break; } case StatementTypes.MERGE : { if (updateColumnMap != null) { if (ArrayUtil.haveCommonElement( constraint.getRefColumns(), updateColumnMap)) { set.add(baseTable.fkConstraints[i].getMain() .getName()); } } if (insertExpression != null) { set.add(baseTable.fkConstraints[i].getMain() .getName()); } break; } } } if (type == StatementTypes.UPDATE_WHERE || type == StatementTypes.MERGE) { baseTable.collectFKReadLocks(updateColumnMap, set); } else if (type == StatementTypes.DELETE_WHERE) { baseTable.collectFKReadLocks(null, set); } getTriggerTableNames(set, false); } for (int i = 0; i < rangeVariables.length; i++) { Table rangeTable = rangeVariables[i].rangeTable; HsqlName name = rangeTable.getName(); if (rangeTable.isReadOnly() || rangeTable.isTemp()) { continue; } if (name.schema == SqlInvariants.SYSTEM_SCHEMA_HSQLNAME) { continue; } set.add(name); } for (int i = 0; i < subqueries.length; i++) { if (subqueries[i].queryExpression != null) { subqueries[i].queryExpression.getBaseTableNames(set); } } for (int i = 0; i < routines.length; i++) { set.addAll(routines[i].getTableNamesForRead()); } } void collectTableNamesForWrite(OrderedHashSet set) { // other fk references this : if constraint trigger action : other write lock if (baseTable.isView()) { getTriggerTableNames(set, true); } else if (!baseTable.isTemp()) { set.add(baseTable.getName()); if (type == StatementTypes.UPDATE_WHERE || type == StatementTypes.MERGE) { if (updateExpressions.length != 0) { baseTable.collectFKWriteLocks(updateColumnMap, set); } } else if (type == StatementTypes.DELETE_WHERE) { baseTable.collectFKWriteLocks(null, set); } getTriggerTableNames(set, true); } } /** * @todo - fredt - low priority - this does not work with different prepare calls * with the same SQL statement, but different generated column requests * To fix, add comment encapsulating the generated column list to SQL * to differentiate between the two invocations */ public void setGeneratedColumnInfo(int generate, ResultMetaData meta) { // also supports INSERT_SELECT if (type != StatementTypes.INSERT) { return; } int idColIndex = baseTable.getIdentityColumnIndex(); generatedType = generate; generatedInputMetaData = meta; switch (generate) { case ResultConstants.RETURN_NO_GENERATED_KEYS : return; case ResultConstants.RETURN_GENERATED_KEYS_COL_INDEXES : generatedIndexes = meta.getGeneratedColumnIndexes(); for (int i = 0; i < generatedIndexes.length; i++) { if (generatedIndexes[i] < 0 || generatedIndexes[i] >= baseTable.getColumnCount()) { throw Error.error(ErrorCode.X_42501); } } break; case ResultConstants.RETURN_GENERATED_KEYS : if (baseTable.hasGeneratedColumn()) { if (idColIndex >= 0) { int generatedCount = ArrayUtil.countTrueElements(baseTable.colGenerated) + 1; generatedIndexes = new int[generatedCount]; for (int i = 0, j = 0; i < baseTable.colGenerated.length; i++) { if (baseTable.colGenerated[i] || i == idColIndex) { generatedIndexes[j++] = i; } } } else { generatedIndexes = ArrayUtil.booleanArrayToIntIndexes( baseTable.colGenerated); } } else if (idColIndex >= 0) { generatedIndexes = new int[]{ idColIndex }; } else { return; } break; case ResultConstants.RETURN_GENERATED_KEYS_COL_NAMES : String[] columnNames = meta.getGeneratedColumnNames(); generatedIndexes = baseTable.getColumnIndexes(columnNames); for (int i = 0; i < generatedIndexes.length; i++) { if (generatedIndexes[i] < 0) { throw Error.error(ErrorCode.X_42501, columnNames[0]); } } break; } generatedResultMetaData = ResultMetaData.newResultMetaData(generatedIndexes.length); for (int i = 0; i < generatedIndexes.length; i++) { ColumnSchema column = baseTable.getColumn(generatedIndexes[i]); generatedResultMetaData.columns[i] = column; } generatedResultMetaData.prepareData(); isSimpleInsert = false; } Object[] getGeneratedColumns(Object[] data) { if (generatedIndexes == null) { return null; } Object[] values = new Object[generatedIndexes.length]; for (int i = 0; i < generatedIndexes.length; i++) { values[i] = data[generatedIndexes[i]]; } return values; } public boolean hasGeneratedColumns() { return generatedIndexes != null; } public ResultMetaData generatedResultMetaData() { return generatedResultMetaData; } void getTriggerTableNames(OrderedHashSet set, boolean write) { for (int i = 0; i < baseTable.triggerList.length; i++) { TriggerDef td = baseTable.triggerList[i]; switch (type) { case StatementTypes.INSERT : if (td.getStatementType() == StatementTypes.INSERT) { break; } continue; case StatementTypes.UPDATE_WHERE : if (td.getStatementType() == StatementTypes.UPDATE_WHERE) { break; } continue; case StatementTypes.DELETE_WHERE : if (td.getStatementType() == StatementTypes.DELETE_WHERE) { break; } continue; case StatementTypes.MERGE : if (td.getStatementType() == StatementTypes.INSERT || td.getStatementType() == StatementTypes.UPDATE_WHERE) { break; } continue; default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementDML"); } if (td.routine != null) { if (write) { set.addAll(td.routine.getTableNamesForWrite()); } else { set.addAll(td.routine.getTableNamesForRead()); } } } } /** * Executes an UPDATE statement. * * @return Result object */ Result executeUpdateStatement(Session session) { int count = 0; Expression[] colExpressions = updateExpressions; RowSetNavigatorDataChange rowset = session.sessionContext.getRowSetDataChange(); Type[] colTypes = baseTable.getColumnTypes(); RangeIterator it = RangeVariable.getIterator(session, targetRangeVariables); Result resultOut = null; RowSetNavigator generatedNavigator = null; if (generatedIndexes != null) { resultOut = Result.newUpdateCountResult(generatedResultMetaData, 0); generatedNavigator = resultOut.getChainedResult().getNavigator(); } session.sessionContext.rownum = 1; while (it.next()) { session.sessionData.startRowProcessing(); Row row = it.getCurrentRow(); Object[] data = row.getData(); Object[] newData = getUpdatedData(session, targets, baseTable, updateColumnMap, colExpressions, colTypes, data); if (updatableTableCheck != null) { it.setCurrent(newData); boolean check = updatableTableCheck.testCondition(session); if (!check) { it.release(); throw Error.error(ErrorCode.X_44000); } } rowset.addRow(session, row, newData, colTypes, updateColumnMap); session.sessionContext.rownum++; } rowset.endMainDataSet(); it.release(); /* debug 190 if (rowset.size() == 0) { System.out.println(targetTable.getName().name + " zero update: session " + session.getId()); } else if (rowset.size() >1) { System.out.println("multiple update: session " + session.getId() + ", " + rowset.size()); } //* debug 190 */ rowset.beforeFirst(); count = update(session, baseTable, rowset, generatedNavigator); if (resultOut == null) { if (count == 1) { return Result.updateOneResult; } else if (count == 0) { session.addWarning(HsqlException.noDataCondition); return Result.updateZeroResult; } return new Result(ResultConstants.UPDATECOUNT, count); } else { resultOut.setUpdateCount(count); if (count == 0) { session.addWarning(HsqlException.noDataCondition); } return resultOut; } } static Object[] getUpdatedData(Session session, Expression[] targets, Table targetTable, int[] columnMap, Expression[] colExpressions, Type[] colTypes, Object[] oldData) { Object[] data = targetTable.getEmptyRowData(); System.arraycopy(oldData, 0, data, 0, data.length); for (int i = 0, ix = 0; i < columnMap.length; ) { Expression expr = colExpressions[ix++]; if (expr.getType() == OpTypes.ROW) { Object[] values = expr.getRowValue(session); for (int j = 0; j < values.length; j++, i++) { int colIndex = columnMap[i]; Expression e = expr.nodes[j]; // transitional - still supporting null for identity generation if (targetTable.identityColumn == colIndex) { if (e.getType() == OpTypes.VALUE && e.valueData == null) { continue; } } if (e.getType() == OpTypes.DEFAULT) { if (targetTable.identityColumn == colIndex) { continue; } data[colIndex] = targetTable.colDefaults[colIndex].getValue( session); continue; } data[colIndex] = colTypes[colIndex].convertToType(session, values[j], e.dataType); } } else if (expr.getType() == OpTypes.ROW_SUBQUERY) { Object[] values = expr.getRowValue(session); for (int j = 0; j < values.length; j++, i++) { int colIndex = columnMap[i]; Type colType = expr.table.queryExpression.getMetaData() .columnTypes[j]; data[colIndex] = colTypes[colIndex].convertToType(session, values[j], colType); } } else { int colIndex = columnMap[i]; if (expr.getType() == OpTypes.DEFAULT) { if (targetTable.identityColumn == colIndex) { i++; continue; } data[colIndex] = targetTable.colDefaults[colIndex].getValue(session); i++; continue; } Object value = expr.getValue(session); if (targets[i].getType() == OpTypes.ARRAY_ACCESS) { data[colIndex] = ((ExpressionAccessor) targets[i]).getUpdatedArray( session, (Object[]) data[colIndex], value, true); } else { data[colIndex] = colTypes[colIndex].convertToType(session, value, expr.dataType); } i++; } } return data; } /** * Executes a MERGE statement. * * @return Result object */ Result executeMergeStatement(Session session) { Type[] colTypes = baseTable.getColumnTypes(); Result resultOut = null; RowSetNavigator generatedNavigator = null; if (generatedIndexes != null) { resultOut = Result.newUpdateCountResult(generatedResultMetaData, 0); generatedNavigator = resultOut.getChainedResult().getNavigator(); } int count = 0; // data generated for non-matching rows RowSetNavigatorClient newData = new RowSetNavigatorClient(8); // rowset for update operation RowSetNavigatorDataChange updateRowSet = session.sessionContext.getRowSetDataChange(); RangeVariable[] joinRangeIterators = targetRangeVariables; // populate insert and update lists RangeIterator[] rangeIterators = new RangeIterator[joinRangeIterators.length]; for (int i = 0; i < joinRangeIterators.length; i++) { rangeIterators[i] = joinRangeIterators[i].getIterator(session); } for (int currentIndex = 0; currentIndex >= 0; ) { RangeIterator it = rangeIterators[currentIndex]; boolean beforeFirst = it.isBeforeFirst(); if (it.next()) { if (currentIndex < joinRangeIterators.length - 1) { currentIndex++; continue; } } else { if (currentIndex == 1 && beforeFirst && insertExpression != null) { Object[] data = getInsertData(session, colTypes, insertExpression.nodes[0].nodes); if (data != null) { newData.add(data); } } it.reset(); currentIndex--; continue; } // row matches! if (updateExpressions.length != 0) { Row row = it.getCurrentRow(); // this is always the second iterator session.sessionData.startRowProcessing(); Object[] data = getUpdatedData(session, targets, baseTable, updateColumnMap, updateExpressions, colTypes, row.getData()); try { updateRowSet.addRow(session, row, data, colTypes, updateColumnMap); } catch (HsqlException e) { for (int i = 0; i < joinRangeIterators.length; i++) { rangeIterators[i].reset(); } throw Error.error(ErrorCode.X_21000); } } } updateRowSet.endMainDataSet(); for (int i = 0; i < joinRangeIterators.length; i++) { rangeIterators[i].reset(); } // run the transaction as a whole, updating and inserting where needed // update any matched rows if (updateExpressions.length != 0) { count = update(session, baseTable, updateRowSet, generatedNavigator); } // insert any non-matched rows if (newData.getSize() > 0) { insertRowSet(session, generatedNavigator, newData); count += newData.getSize(); } if (insertExpression != null && baseTable.triggerLists[Trigger.INSERT_AFTER].length > 0) { baseTable.fireTriggers(session, Trigger.INSERT_AFTER, newData); } if (resultOut == null) { if (count == 1) { return Result.updateOneResult; } if (count == 0) { session.addWarning(HsqlException.noDataCondition); return Result.updateZeroResult; } return new Result(ResultConstants.UPDATECOUNT, count); } else { resultOut.setUpdateCount(count); if (count == 0) { session.addWarning(HsqlException.noDataCondition); } return resultOut; } } void insertRowSet(Session session, RowSetNavigator generatedNavigator, RowSetNavigator newData) { PersistentStore store = baseTable.getRowStore(session); RangeIterator checkIterator = null; if (updatableTableCheck != null) { checkIterator = checkRangeVariable.getIterator(session); } newData.beforeFirst(); if (baseTable.triggerLists[Trigger.INSERT_BEFORE_ROW].length > 0) { while (newData.hasNext()) { Object[] data = (Object[]) newData.getNext(); baseTable.fireTriggers(session, Trigger.INSERT_BEFORE_ROW, null, data, null); } newData.beforeFirst(); } while (newData.hasNext()) { Object[] data = (Object[]) newData.getNext(); // for identity using global sequence session.sessionData.startRowProcessing(); baseTable.insertSingleRow(session, store, data, null); if (checkIterator != null) { checkIterator.setCurrent(data); boolean check = updatableTableCheck.testCondition(session); if (!check) { throw Error.error(ErrorCode.X_44000); } } if (generatedNavigator != null) { Object[] generatedValues = getGeneratedColumns(data); generatedNavigator.add(generatedValues); } } newData.beforeFirst(); while (newData.hasNext()) { Object[] data = (Object[]) newData.getNext(); performIntegrityChecks(session, baseTable, null, data, null); } newData.beforeFirst(); if (baseTable.triggerLists[Trigger.INSERT_AFTER_ROW].length > 0) { while (newData.hasNext()) { Object[] data = (Object[]) newData.getNext(); baseTable.fireTriggers(session, Trigger.INSERT_AFTER_ROW, null, data, null); } newData.beforeFirst(); } } Result insertSingleRow(Session session, PersistentStore store, Object[] data) { if (baseTable.triggerLists[Trigger.INSERT_BEFORE_ROW].length > 0) { baseTable.fireTriggers(session, Trigger.INSERT_BEFORE_ROW, null, data, null); } baseTable.insertSingleRow(session, store, data, null); performIntegrityChecks(session, baseTable, null, data, null); if (session.database.isReferentialIntegrity()) { for (int i = 0, size = baseTable.fkConstraints.length; i < size; i++) { baseTable.fkConstraints[i].checkInsert(session, baseTable, data, true); } } if (baseTable.triggerLists[Trigger.INSERT_AFTER_ROW].length > 0) { baseTable.fireTriggers(session, Trigger.INSERT_AFTER_ROW, null, data, null); } if (baseTable.triggerLists[Trigger.INSERT_AFTER].length > 0) { baseTable.fireTriggers(session, Trigger.INSERT_AFTER, (RowSetNavigator) null); } return Result.updateOneResult; } Object[] getInsertData(Session session, Type[] colTypes, Expression[] rowArgs) { Object[] data = baseTable.getNewRowData(session); session.sessionData.startRowProcessing(); for (int i = 0; i < rowArgs.length; i++) { Expression e = rowArgs[i]; int colIndex = insertColumnMap[i]; if (e.opType == OpTypes.DEFAULT) { if (baseTable.identityColumn == colIndex) { continue; } if (baseTable.colDefaults[colIndex] != null) { data[colIndex] = baseTable.colDefaults[colIndex].getValue(session); } continue; } Object value = e.getValue(session); Type type = colTypes[colIndex]; if (session.database.sqlSyntaxMys || session.database.sqlSyntaxPgs) { try { value = type.convertToType(session, value, e.dataType); } catch (HsqlException ex) { if (type.typeCode == Types.SQL_DATE) { value = Type.SQL_TIMESTAMP.convertToType(session, value, e.dataType); value = type.convertToType(session, value, Type.SQL_TIMESTAMP); } else if (type.typeCode == Types.SQL_TIMESTAMP) { value = Type.SQL_DATE.convertToType(session, value, e.dataType); value = type.convertToType(session, value, Type.SQL_DATE); } else { throw ex; } } } else { // DYNAMIC_PARAM and PARAMETER expressions may have wider values value = type.convertToType(session, value, e.dataType); } data[colIndex] = value; } return data; } /** * Highest level multiple row update method.

              * * Following clauses from SQL Standard section 11.8 are enforced 9) Let ISS * be the innermost SQL-statement being executed. 10) If evaluation of these * General Rules during the execution of ISS would cause an update of some * site to a value that is distinct from the value to which that site was * previously updated during the execution of ISS, then an exception * condition is raised: triggered data change violation. 11) If evaluation * of these General Rules during the execution of ISS would cause deletion * of a row containing a site that is identified for replacement in that * row, then an exception condition is raised: triggered data change * violation. * * @param session Session * @param table Table * @param updateList RowSetNavigatorDataChange * @return int */ int update(Session session, Table table, RowSetNavigatorDataChange navigator, RowSetNavigator generatedNavigator) { int rowCount = navigator.getSize(); // set identity column where null and check columns for (int i = 0; i < rowCount; i++) { navigator.next(); Object[] data = navigator.getCurrentChangedData(); // for identity using global sequence session.sessionData.startRowProcessing(); /** * @todo 1.9.0 - make optional using database property - * this means the identity column can be set to null to force * creation of a new identity value */ table.setIdentityColumn(session, data); table.setGeneratedColumns(session, data); } navigator.beforeFirst(); if (table.fkMainConstraints.length > 0) { HashSet path = session.sessionContext.getConstraintPath(); for (int i = 0; i < rowCount; i++) { navigator.next(); Row row = navigator.getCurrentRow(); Object[] data = navigator.getCurrentChangedData(); performReferentialActions(session, table, navigator, row, data, this.updateColumnMap, path); path.clear(); } navigator.beforeFirst(); } while (navigator.next()) { Row row = navigator.getCurrentRow(); Object[] data = navigator.getCurrentChangedData(); int[] changedColumns = navigator.getCurrentChangedColumns(); Table currentTable = ((Table) row.getTable()); if (currentTable instanceof TableDerived) { currentTable = ((TableDerived) currentTable).view; } if (currentTable.triggerLists[Trigger.UPDATE_BEFORE_ROW].length > 0) { currentTable.fireTriggers(session, Trigger.UPDATE_BEFORE_ROW, row.getData(), data, changedColumns); currentTable.enforceRowConstraints(session, data); } } if (table.isView) { return rowCount; } navigator.beforeFirst(); while (navigator.next()) { Row row = navigator.getCurrentRow(); Table currentTable = ((Table) row.getTable()); int[] changedColumns = navigator.getCurrentChangedColumns(); session.addDeleteAction(currentTable, row, changedColumns); } navigator.beforeFirst(); while (navigator.next()) { Row row = navigator.getCurrentRow(); Object[] data = navigator.getCurrentChangedData(); Table currentTable = ((Table) row.getTable()); int[] changedColumns = navigator.getCurrentChangedColumns(); PersistentStore store = currentTable.getRowStore(session); if (data == null) { continue; } Row newRow = currentTable.insertSingleRow(session, store, data, changedColumns); if (generatedNavigator != null) { Object[] generatedValues = getGeneratedColumns(data); generatedNavigator.add(generatedValues); } // newRow.rowAction.updatedAction = row.rowAction; } navigator.beforeFirst(); OrderedHashSet extraUpdateTables = null; boolean hasAfterRowTriggers = table.triggerLists[Trigger.UPDATE_AFTER_ROW].length > 0; while (navigator.next()) { Row row = navigator.getCurrentRow(); Table currentTable = ((Table) row.getTable()); Object[] changedData = navigator.getCurrentChangedData(); int[] changedColumns = navigator.getCurrentChangedColumns(); performIntegrityChecks(session, currentTable, row.getData(), changedData, changedColumns); if (currentTable != table) { if (extraUpdateTables == null) { extraUpdateTables = new OrderedHashSet(); } extraUpdateTables.add(currentTable); if (currentTable.triggerLists[Trigger.UPDATE_AFTER_ROW].length > 0) { hasAfterRowTriggers = true; } } } navigator.beforeFirst(); if (hasAfterRowTriggers) { while (navigator.next()) { Row row = navigator.getCurrentRow(); Object[] changedData = navigator.getCurrentChangedData(); int[] changedColumns = navigator.getCurrentChangedColumns(); Table currentTable = ((Table) row.getTable()); currentTable.fireTriggers(session, Trigger.UPDATE_AFTER_ROW, row.getData(), changedData, changedColumns); } navigator.beforeFirst(); } baseTable.fireTriggers(session, Trigger.UPDATE_AFTER, navigator); if (extraUpdateTables != null) { for (int i = 0; i < extraUpdateTables.size(); i++) { Table currentTable = (Table) extraUpdateTables.get(i); currentTable.fireTriggers(session, Trigger.UPDATE_AFTER, navigator); } } return rowCount; } /** * Executes a DELETE statement. * * @return the result of executing the statement */ Result executeDeleteStatement(Session session) { int count = 0; RangeIterator it = RangeVariable.getIterator(session, targetRangeVariables); RowSetNavigatorDataChange rowset = session.sessionContext.getRowSetDataChange(); session.sessionContext.rownum = 1; while (it.next()) { Row currentRow = it.getCurrentRow(); rowset.addRow(currentRow); session.sessionContext.rownum++; } it.release(); rowset.endMainDataSet(); if (rowset.getSize() > 0) { count = delete(session, baseTable, rowset); } else { session.addWarning(HsqlException.noDataCondition); return Result.updateZeroResult; } if (count == 1) { return Result.updateOneResult; } return new Result(ResultConstants.UPDATECOUNT, count); } Result executeDeleteTruncateStatement(Session session) { PersistentStore store = targetTable.getRowStore(session); RowIterator it = targetTable.getPrimaryIndex().firstRow(store); boolean hasData = it.hasNext(); for (int i = 0; i < targetTable.fkMainConstraints.length; i++) { if (targetTable.fkMainConstraints[i].getRef() != targetTable) { HsqlName tableName = targetTable.fkMainConstraints[i].getRef().getName(); Table refTable = session.database.schemaManager.getUserTable(session, tableName); if (!refTable.isEmpty(session)) { throw Error.error(ErrorCode.X_23504, refTable.getName().name); } } } try { while (it.hasNext()) { Row row = it.getNextRow(); session.addDeleteAction((Table) row.getTable(), row, null); } if (restartIdentity && targetTable.identitySequence != null) { targetTable.identitySequence.reset(); } } finally { it.release(); } if (!hasData) { session.addWarning(HsqlException.noDataCondition); } return Result.updateOneResult; } /** * Highest level multiple row delete method. Corresponds to an SQL * DELETE. */ int delete(Session session, Table table, RowSetNavigatorDataChange navigator) { int rowCount = navigator.getSize(); navigator.beforeFirst(); if (table.fkMainConstraints.length > 0) { HashSet path = session.sessionContext.getConstraintPath(); for (int i = 0; i < rowCount; i++) { navigator.next(); Row row = navigator.getCurrentRow(); performReferentialActions(session, table, navigator, row, null, null, path); path.clear(); } navigator.beforeFirst(); } while (navigator.next()) { Row row = navigator.getCurrentRow(); Object[] changedData = navigator.getCurrentChangedData(); int[] changedColumns = navigator.getCurrentChangedColumns(); Table currentTable = ((Table) row.getTable()); if (currentTable instanceof TableDerived) { currentTable = ((TableDerived) currentTable).view; } if (changedData == null) { currentTable.fireTriggers(session, Trigger.DELETE_BEFORE_ROW, row.getData(), null, null); } else { currentTable.fireTriggers(session, Trigger.UPDATE_BEFORE_ROW, row.getData(), changedData, changedColumns); } } if (table.isView) { return rowCount; } navigator.beforeFirst(); boolean hasUpdate = false; while (navigator.next()) { Row row = navigator.getCurrentRow(); Object[] data = navigator.getCurrentChangedData(); Table currentTable = ((Table) row.getTable()); session.addDeleteAction(currentTable, row, null); if (data != null) { hasUpdate = true; } } navigator.beforeFirst(); if (hasUpdate) { while (navigator.next()) { Row row = navigator.getCurrentRow(); Object[] data = navigator.getCurrentChangedData(); Table currentTable = ((Table) row.getTable()); int[] changedColumns = navigator.getCurrentChangedColumns(); PersistentStore store = currentTable.getRowStore(session); if (data == null) { continue; } Row newRow = currentTable.insertSingleRow(session, store, data, changedColumns); // newRow.rowAction.updatedAction = row.rowAction; } navigator.beforeFirst(); } OrderedHashSet extraUpdateTables = null; OrderedHashSet extraDeleteTables = null; boolean hasAfterRowTriggers = table.triggerLists[Trigger.DELETE_AFTER_ROW].length > 0; if (rowCount != navigator.getSize()) { while (navigator.next()) { Row row = navigator.getCurrentRow(); Object[] changedData = navigator.getCurrentChangedData(); int[] changedColumns = navigator.getCurrentChangedColumns(); Table currentTable = ((Table) row.getTable()); if (changedData != null) { performIntegrityChecks(session, currentTable, row.getData(), changedData, changedColumns); } if (currentTable != table) { if (changedData == null) { if (currentTable.triggerLists[Trigger.DELETE_AFTER_ROW] .length > 0) { hasAfterRowTriggers = true; } if (extraDeleteTables == null) { extraDeleteTables = new OrderedHashSet(); } extraDeleteTables.add(currentTable); } else { if (currentTable.triggerLists[Trigger.UPDATE_AFTER_ROW] .length > 0) { hasAfterRowTriggers = true; } if (extraUpdateTables == null) { extraUpdateTables = new OrderedHashSet(); } extraUpdateTables.add(currentTable); } } } navigator.beforeFirst(); } if (hasAfterRowTriggers) { while (navigator.next()) { Row row = navigator.getCurrentRow(); Object[] changedData = navigator.getCurrentChangedData(); Table currentTable = ((Table) row.getTable()); if (changedData == null) { currentTable.fireTriggers(session, Trigger.DELETE_AFTER_ROW, row.getData(), null, null); } else { currentTable.fireTriggers(session, Trigger.UPDATE_AFTER_ROW, row.getData(), changedData, null); } } navigator.beforeFirst(); } table.fireTriggers(session, Trigger.DELETE_AFTER, navigator); if (extraUpdateTables != null) { for (int i = 0; i < extraUpdateTables.size(); i++) { Table currentTable = (Table) extraUpdateTables.get(i); currentTable.fireTriggers(session, Trigger.UPDATE_AFTER, navigator); } } if (extraDeleteTables != null) { for (int i = 0; i < extraDeleteTables.size(); i++) { Table currentTable = (Table) extraDeleteTables.get(i); currentTable.fireTriggers(session, Trigger.DELETE_AFTER, navigator); } } return rowCount; } static void performIntegrityChecks(Session session, Table table, Object[] oldData, Object[] newData, int[] updatedColumns) { if (newData == null) { return; } for (int i = 0, size = table.checkConstraints.length; i < size; i++) { table.checkConstraints[i].checkInsert(session, table, newData, oldData == null); } if (!session.database.isReferentialIntegrity()) { return; } for (int i = 0, size = table.fkConstraints.length; i < size; i++) { boolean check = oldData == null; Constraint c = table.fkConstraints[i]; if (!check) { check = ArrayUtil.haveCommonElement(c.getRefColumns(), updatedColumns); } if (check) { c.checkInsert(session, table, newData, oldData == null); } } } static void performReferentialActions(Session session, Table table, RowSetNavigatorDataChange navigator, Row row, Object[] data, int[] changedCols, HashSet path) { if (!session.database.isReferentialIntegrity()) { return; } boolean delete = data == null; for (int i = 0, size = table.fkMainConstraints.length; i < size; i++) { Constraint c = table.fkMainConstraints[i]; int action = delete ? c.core.deleteAction : c.core.updateAction; if (!delete) { if (!ArrayUtil.haveCommonElement(changedCols, c.core.mainCols)) { continue; } if (c.core.mainIndex.compareRowNonUnique( session, row.getData(), data, c.core.mainCols) == 0) { continue; } } RowIterator refiterator = c.findFkRef(session, row.getData()); if (!refiterator.hasNext()) { refiterator.release(); continue; } while (refiterator.hasNext()) { Row refRow = refiterator.getNextRow(); Object[] refData = null; /** @todo use MATCH */ if (c.core.refIndex.compareRowNonUnique( session, refRow.getData(), row.getData(), c.core.mainCols) != 0) { break; } if (delete && refRow.getId() == row.getId()) { continue; } switch (action) { case SchemaObject.ReferentialAction.CASCADE : { if (delete) { boolean result; try { result = navigator.addRow(refRow); } catch (HsqlException e) { String[] info = getConstraintInfo(c); refiterator.release(); throw Error.error(null, ErrorCode.X_27000, ErrorCode.CONSTRAINT, info); } if (result) { performReferentialActions(session, c.core.refTable, navigator, refRow, null, null, path); } continue; } refData = c.core.refTable.getEmptyRowData(); System.arraycopy(refRow.getData(), 0, refData, 0, refData.length); for (int j = 0; j < c.core.refCols.length; j++) { refData[c.core.refCols[j]] = data[c.core.mainCols[j]]; } break; } case SchemaObject.ReferentialAction.SET_NULL : { refData = c.core.refTable.getEmptyRowData(); System.arraycopy(refRow.getData(), 0, refData, 0, refData.length); for (int j = 0; j < c.core.refCols.length; j++) { refData[c.core.refCols[j]] = null; } break; } case SchemaObject.ReferentialAction.SET_DEFAULT : { refData = c.core.refTable.getEmptyRowData(); System.arraycopy(refRow.getData(), 0, refData, 0, refData.length); for (int j = 0; j < c.core.refCols.length; j++) { ColumnSchema col = c.core.refTable.getColumn(c.core.refCols[j]); refData[c.core.refCols[j]] = col.getDefaultValue(session); } break; } case SchemaObject.ReferentialAction.NO_ACTION : if (navigator.containsDeletedRow(refRow)) { continue; } // fall through case SchemaObject.ReferentialAction.RESTRICT : { int errorCode = c.core.deleteAction == SchemaObject.ReferentialAction .NO_ACTION ? ErrorCode.X_23504 : ErrorCode.X_23001; String[] info = getConstraintInfo(c); refiterator.release(); throw Error.error(null, errorCode, ErrorCode.CONSTRAINT, info); } default : continue; } try { refData = navigator.addRow(session, refRow, refData, c.core.refTable.getColumnTypes(), c.core.refCols); } catch (HsqlException e) { String[] info = getConstraintInfo(c); refiterator.release(); throw Error.error(null, ErrorCode.X_27000, ErrorCode.CONSTRAINT, info); } if (refData == null) { // happens only with enforceDeleteOrUpdate=false and updated row is already deleted continue; } if (!path.add(c)) { continue; } performReferentialActions(session, c.core.refTable, navigator, refRow, refData, c.core.refCols, path); path.remove(c); } refiterator.release(); } } static String[] getConstraintInfo(Constraint c) { return new String[] { c.core.refName.name, c.core.refTable.getName().name }; } public void clearStructures(Session session) { session.sessionContext.clearStructures(this); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Session.java0000644000175000017500000020042412007547360021232 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Locale; import java.util.Random; import java.util.TimeZone; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.jdbc.JDBCConnection; import org.hsqldb.jdbc.JDBCDriver; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.CountUpDownLatch; import org.hsqldb.lib.HashMap; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.HsqlDeque; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.SimpleLog; import org.hsqldb.lib.java.JavaSystem; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.navigator.RowSetNavigatorClient; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.persist.PersistentStore; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.result.ResultLob; import org.hsqldb.result.ResultProperties; import org.hsqldb.rights.Grantee; import org.hsqldb.rights.User; import org.hsqldb.store.ValuePool; import org.hsqldb.types.BlobDataID; import org.hsqldb.types.ClobDataID; import org.hsqldb.types.TimeData; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; import org.hsqldb.types.Type.TypedComparator; /** * Implementation of SQL sessions. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.0 */ public class Session implements SessionInterface { // private volatile boolean isClosed; // public Database database; private final User sessionUser; private User user; private Grantee role; // transaction support public boolean isReadOnlyDefault; int isolationLevelDefault = SessionInterface.TX_READ_COMMITTED; int isolationLevel = SessionInterface.TX_READ_COMMITTED; boolean isReadOnlyIsolation; int actionIndex; long actionTimestamp; long transactionTimestamp; long transactionEndTimestamp; boolean txConflictRollback; boolean isPreTransaction; boolean isTransaction; boolean isBatch; volatile boolean abortTransaction; volatile boolean redoAction; HsqlArrayList rowActionList; volatile boolean tempUnlocked; public OrderedHashSet waitedSessions; public OrderedHashSet waitingSessions; OrderedHashSet tempSet; public CountUpDownLatch latch = new CountUpDownLatch(); Statement lockStatement; // current settings final String zoneString; final int sessionTimeZoneSeconds; int timeZoneSeconds; boolean isNetwork; private int sessionMaxRows; private final long sessionId; int sessionTxId = -1; private boolean script; boolean ignoreCase; // internal connection private JDBCConnection intConnection; // external connection private JDBCConnection extConnection; // schema public HsqlName currentSchema; public HsqlName loggedSchema; // query processing ParserCommand parser; boolean isProcessingScript; boolean isProcessingLog; public SessionContext sessionContext; int resultMaxMemoryRows; // public SessionData sessionData; // public StatementManager statementManager; /** * Constructs a new Session object. * * @param db the database to which this represents a connection * @param user the initial user * @param autocommit the initial autocommit value * @param readonly the initial readonly value * @param id the session identifier, as known to the database */ Session(Database db, User user, boolean autocommit, boolean readonly, long id, String zoneString, int timeZoneSeconds) { sessionId = id; database = db; this.user = user; this.sessionUser = user; this.zoneString = zoneString; this.sessionTimeZoneSeconds = timeZoneSeconds; this.timeZoneSeconds = timeZoneSeconds; rowActionList = new HsqlArrayList(32, true); waitedSessions = new OrderedHashSet(); waitingSessions = new OrderedHashSet(); tempSet = new OrderedHashSet(); isolationLevelDefault = database.defaultIsolationLevel; isolationLevel = isolationLevelDefault; txConflictRollback = database.txConflictRollback; isReadOnlyDefault = readonly; isReadOnlyIsolation = isolationLevel == SessionInterface.TX_READ_UNCOMMITTED; sessionContext = new SessionContext(this); sessionContext.isAutoCommit = autocommit ? Boolean.TRUE : Boolean.FALSE; sessionContext.isReadOnly = isReadOnlyDefault ? Boolean.TRUE : Boolean.FALSE; parser = new ParserCommand(this, new Scanner()); setResultMemoryRowCount(database.getResultMaxMemoryRows()); resetSchema(); sessionData = new SessionData(database, this); statementManager = new StatementManager(database); } void resetSchema() { loggedSchema = null; currentSchema = user.getInitialOrDefaultSchema(); } /** * Retrieves the session identifier for this Session. * * @return the session identifier for this Session */ public long getId() { return sessionId; } /** * Closes this Session. */ public synchronized void close() { if (isClosed) { return; } rollback(false); try { database.logger.writeOtherStatement(this, Tokens.T_DISCONNECT); } catch (HsqlException e) {} sessionData.closeAllNavigators(); sessionData.persistentStoreCollection.release(); statementManager.reset(); database.sessionManager.removeSession(this); database.closeIfLast(); // keep sessionContext and sessionData rowActionList.clear(); database = null; user = null; sessionContext.savepoints = null; sessionContext.lastIdentity = null; intConnection = null; isClosed = true; } /** * Retrieves whether this Session is closed. * * @return true if this Session is closed */ public boolean isClosed() { return isClosed; } public synchronized void setIsolationDefault(int level) { if (level == SessionInterface.TX_READ_UNCOMMITTED) { level = SessionInterface.TX_READ_COMMITTED; } if (level == isolationLevelDefault) { return; } isolationLevelDefault = level; if (!isInMidTransaction()) { isolationLevel = isolationLevelDefault; isReadOnlyIsolation = level == SessionInterface.TX_READ_UNCOMMITTED; } } /** * sets ISOLATION for the next transaction only */ public void setIsolation(int level) { if (isInMidTransaction()) { throw Error.error(ErrorCode.X_25001); } if (level == SessionInterface.TX_READ_UNCOMMITTED) { level = SessionInterface.TX_READ_COMMITTED; } if (isolationLevel != level) { isolationLevel = level; isReadOnlyIsolation = level == SessionInterface.TX_READ_UNCOMMITTED; } } public synchronized int getIsolation() { return isolationLevel; } /** * Setter for iLastIdentity attribute. * * @param i the new value */ void setLastIdentity(Number i) { sessionContext.lastIdentity = i; } /** * Getter for iLastIdentity attribute. * * @return the current value */ public Number getLastIdentity() { return sessionContext.lastIdentity; } /** * Retrieves the Database instance to which this * Session represents a connection. * * @return the Database object to which this Session is connected */ public Database getDatabase() { return database; } /** * Retrieves the name, as known to the database, of the * user currently controlling this Session. * * @return the name of the user currently connected within this Session */ public String getUsername() { return user.getName().getNameString(); } /** * Retrieves the User object representing the user currently controlling * this Session. * * @return this Session's User object */ public User getUser() { return (User) user; } public Grantee getGrantee() { return user; } public Grantee getRole() { return role; } /** * Sets this Session's User object to the one specified by the * user argument. * * @param user the new User object for this session */ public void setUser(User user) { this.user = user; } public void setRole(Grantee role) { this.role = role; } int getMaxRows() { return sessionContext.currentMaxRows; } /** * The SQL command SET MAXROWS n will override the Statement.setMaxRows(n) * for the next direct statement only * * NB this is dedicated to the SET MAXROWS sql statement and should not * otherwise be called. (fredt@users) */ void setSQLMaxRows(int rows) { sessionMaxRows = rows; } /** * Checks whether this Session's current User has the privileges of * the ADMIN role. */ void checkAdmin() { user.checkAdmin(); } /** * This is used for reading - writing to existing tables. * @throws HsqlException */ void checkReadWrite() { if (sessionContext.isReadOnly.booleanValue() || isReadOnlyIsolation) { throw Error.error(ErrorCode.X_25006); } } /** * This is used for creating new database objects such as tables. * @throws HsqlException */ void checkDDLWrite() { if (isProcessingScript || isProcessingLog) { return; } checkReadWrite(); } public long getActionTimestamp() { return actionTimestamp; } /** * Adds a delete action to the row and the transaction manager. * * @param table the table of the row * @param row the deleted row * @throws HsqlException */ public void addDeleteAction(Table table, Row row, int[] colMap) { // tempActionHistory.add("add delete action " + actionTimestamp); if (abortTransaction) { // throw Error.error(ErrorCode.X_40001); } database.txManager.addDeleteAction(this, table, row, colMap); } void addInsertAction(Table table, PersistentStore store, Row row, int[] changedColumns) { // tempActionHistory.add("add insert to transaction " + actionTimestamp); database.txManager.addInsertAction(this, table, store, row, changedColumns); // abort only after adding so that the new row gets removed from indexes if (abortTransaction) { // throw Error.error(ErrorCode.X_40001); } } /** * Setter for the autocommit attribute. * * @param autocommit the new value * @throws HsqlException */ public synchronized void setAutoCommit(boolean autocommit) { if (isClosed) { return; } if (sessionContext.isAutoCommit.booleanValue() != autocommit) { commit(false); sessionContext.isAutoCommit = ValuePool.getBoolean(autocommit); } } public void beginAction(Statement cs) { actionIndex = rowActionList.size(); database.txManager.beginAction(this, cs); database.txManager.beginActionResume(this); } public void endAction(Result result) { // tempActionHistory.add("endAction " + actionTimestamp); sessionData.persistentStoreCollection.clearStatementTables(); if (result.mode == ResultConstants.ERROR) { sessionData.persistentStoreCollection.clearResultTables( actionTimestamp); database.txManager.rollbackAction(this); } else { sessionContext .diagnosticsVariables[ExpressionColumn.idx_row_count] = result.mode == ResultConstants.UPDATECOUNT ? Integer.valueOf(result.getUpdateCount()) : ValuePool.INTEGER_0; database.txManager.completeActions(this); } // tempActionHistory.add("endAction ends " + actionTimestamp); } public boolean hasLocks(Statement statement) { if (lockStatement == statement) { if (isolationLevel == SessionInterface.TX_REPEATABLE_READ || isolationLevel == SessionInterface.TX_SERIALIZABLE) { return true; } if (statement.getTableNamesForRead().length == 0) { return true; } } return false; } public void startTransaction() { database.txManager.beginTransaction(this); } public synchronized void startPhasedTransaction() {} /** * @todo - fredt - for two phased pre-commit - after this call, further * state changing calls should fail */ public synchronized void prepareCommit() { if (isClosed) { throw Error.error(ErrorCode.X_08003); } if (!database.txManager.prepareCommitActions(this)) { // tempActionHistory.add("commit aborts " + actionTimestamp); rollback(false); throw Error.error(ErrorCode.X_40001); } } /** * Commits any uncommited transaction this Session may have open * * @throws HsqlException */ public synchronized void commit(boolean chain) { // tempActionHistory.add("commit " + actionTimestamp); if (isClosed) { return; } if (sessionContext.depth > 0) { return; } if (!isTransaction && rowActionList.size() == 0) { sessionContext.isReadOnly = isReadOnlyDefault ? Boolean.TRUE : Boolean.FALSE; setIsolation(isolationLevelDefault); return; } if (!database.txManager.commitTransaction(this)) { // tempActionHistory.add("commit aborts " + actionTimestamp); rollback(chain); throw Error.error(ErrorCode.X_40001); } endTransaction(true, chain); if (database != null && !sessionUser.isSystem() && database.logger.needsCheckpointReset()) { database.checkpointRunner.start(); } } /** * Rolls back any uncommited transaction this Session may have open. * * @throws HsqlException */ public synchronized void rollback(boolean chain) { // tempActionHistory.add("rollback " + actionTimestamp); if (isClosed) { return; } if (sessionContext.depth > 0) { return; } database.txManager.rollback(this); endTransaction(false, chain); } private void endTransaction(boolean commit, boolean chain) { sessionContext.savepoints.clear(); sessionContext.savepointTimestamps.clear(); rowActionList.clear(); sessionData.persistentStoreCollection.clearTransactionTables(); sessionData.closeAllTransactionNavigators(); sessionData.clearLobOps(); lockStatement = null; logSequences(); if (!chain) { sessionContext.isReadOnly = isReadOnlyDefault ? Boolean.TRUE : Boolean.FALSE; setIsolation(isolationLevelDefault); } Statement endTX = commit ? StatementSession.commitNoChainStatement : StatementSession.rollbackNoChainStatement; if (database.logger.getSqlEventLogLevel() > 0) { database.logger.logStatementEvent(this, endTX, null, SimpleLog.LOG_ERROR); } /* debug 190 tempActionHistory.add("commit ends " + actionTimestamp); tempActionHistory.clear(); //*/ } /** * Clear structures and reset variables to original. For JDBC use only. */ public synchronized void resetSession() { if (isClosed) { return; } rollback(false); sessionData.closeAllNavigators(); sessionData.persistentStoreCollection.clearAllTables(); sessionData.clearLobOps(); statementManager.reset(); sessionContext.lastIdentity = ValuePool.INTEGER_0; sessionContext.isAutoCommit = Boolean.TRUE; setResultMemoryRowCount(database.getResultMaxMemoryRows()); user = sessionUser; resetSchema(); setZoneSeconds(sessionTimeZoneSeconds); sessionMaxRows = 0; ignoreCase = false; setIsolation(isolationLevelDefault); txConflictRollback = database.txConflictRollback; } /** * Registers a transaction SAVEPOINT. A new SAVEPOINT with the * name of an existing one replaces the old SAVEPOINT. * * @param name name of the savepoint * @throws HsqlException if there is no current transaction */ public synchronized void savepoint(String name) { int index = sessionContext.savepoints.getIndex(name); if (index != -1) { sessionContext.savepoints.remove(name); sessionContext.savepointTimestamps.remove(index); } sessionContext.savepoints.add(name, ValuePool.getInt(rowActionList.size())); sessionContext.savepointTimestamps.addLast(actionTimestamp); } /** * Performs a partial transaction ROLLBACK to savepoint. * * @param name name of savepoint * @throws HsqlException */ public synchronized void rollbackToSavepoint(String name) { if (isClosed) { return; } int index = sessionContext.savepoints.getIndex(name); if (index < 0) { throw Error.error(ErrorCode.X_3B001, name); } database.txManager.rollbackSavepoint(this, index); } /** * Performs a partial transaction ROLLBACK of current savepoint level. * * @throws HsqlException */ public synchronized void rollbackToSavepoint() { if (isClosed) { return; } String name = (String) sessionContext.savepoints.getKey(0); database.txManager.rollbackSavepoint(this, 0); } /** * Releases a savepoint * * @param name name of savepoint * @throws HsqlException if name does not correspond to a savepoint */ public synchronized void releaseSavepoint(String name) { // remove this and all later savepoints int index = sessionContext.savepoints.getIndex(name); if (index < 0) { throw Error.error(ErrorCode.X_3B001, name); } while (sessionContext.savepoints.size() > index) { sessionContext.savepoints.remove(sessionContext.savepoints.size() - 1); sessionContext.savepointTimestamps.removeLast(); } } public boolean isInMidTransaction() { return isTransaction; } public void setNoSQL() { sessionContext.noSQL = Boolean.TRUE; } public void setIgnoreCase(boolean mode) { ignoreCase = mode; } public boolean isIgnorecase() { return ignoreCase; } /** * sets READ ONLY for next transaction / subtransaction only * * @param readonly the new value */ public void setReadOnly(boolean readonly) { if (!readonly && database.databaseReadOnly) { throw Error.error(ErrorCode.DATABASE_IS_READONLY); } if (isInMidTransaction()) { throw Error.error(ErrorCode.X_25001); } sessionContext.isReadOnly = readonly ? Boolean.TRUE : Boolean.FALSE; } public synchronized void setReadOnlyDefault(boolean readonly) { if (!readonly && database.databaseReadOnly) { throw Error.error(ErrorCode.DATABASE_IS_READONLY); } isReadOnlyDefault = readonly; if (!isInMidTransaction()) { sessionContext.isReadOnly = isReadOnlyDefault ? Boolean.TRUE : Boolean.FALSE; } } /** * Getter for readonly attribute. * * @return the current value */ public boolean isReadOnly() { return sessionContext.isReadOnly.booleanValue() || isReadOnlyIsolation; } public synchronized boolean isReadOnlyDefault() { return isReadOnlyDefault; } /** * Getter for autoCommit attribute. * * @return the current value */ public synchronized boolean isAutoCommit() { return sessionContext.isAutoCommit.booleanValue(); } public synchronized int getStreamBlockSize() { return lobStreamBlockSize; } /** * A switch to set scripting on the basis of type of statement executed. * Afterwards the method reponsible for logging uses * isScripting() to determine if logging is required for the executed * statement. (fredt@users) * * @param script The new scripting value */ void setScripting(boolean script) { this.script = script; } /** * Getter for scripting attribute. * * @return scripting for the last statement. */ boolean isScripting() { return script; } /** * Retrieves an internal Connection object equivalent to the one * that created this Session. * * @return internal connection. */ JDBCConnection getInternalConnection() { if (intConnection == null) { intConnection = new JDBCConnection(this); } JDBCDriver.driverInstance.threadConnection.set(intConnection); return intConnection; } void releaseInternalConnection() { if (sessionContext.depth == 0) { JDBCDriver.driverInstance.threadConnection.set(null); } } /** * Retreives the external JDBC connection */ public JDBCConnection getJDBCConnection() { return extConnection; } public void setJDBCConnection(JDBCConnection connection) { extConnection = connection; } public String getDatabaseUniqueName() { return database.getUniqueName(); } // boucherb@users 20020810 metadata 1.7.2 //---------------------------------------------------------------- private final long connectTime = System.currentTimeMillis(); // more effecient for MetaData concerns than checkAdmin /** * Getter for admin attribute. * * @return the current value */ public boolean isAdmin() { return user.isAdmin(); } /** * Getter for connectTime attribute. * * @return the value */ public long getConnectTime() { return connectTime; } /** * Count of acctions in current transaction. * * @return the current value */ public int getTransactionSize() { return rowActionList.size(); } public long getTransactionTimestamp() { return transactionTimestamp; } public Statement compileStatement(String sql, int props) { parser.reset(sql); Statement cs = parser.compileStatement(props); return cs; } public Statement compileStatement(String sql) { parser.reset(sql); Statement cs = parser.compileStatement(ResultProperties.defaultPropsValue); cs.setCompileTimestamp(Long.MAX_VALUE); return cs; } /** * Executes the command encapsulated by the cmd argument. * * @param cmd the command to execute * @return the result of executing the command */ public synchronized Result execute(Result cmd) { if (isClosed) { return Result.newErrorResult(Error.error(ErrorCode.X_08503)); } sessionContext.currentMaxRows = 0; isBatch = false; JavaSystem.gc(); switch (cmd.mode) { case ResultConstants.LARGE_OBJECT_OP : { return performLOBOperation((ResultLob) cmd); } case ResultConstants.EXECUTE : { int maxRows = cmd.getUpdateCount(); if (maxRows == -1) { sessionContext.currentMaxRows = 0; } else { sessionContext.currentMaxRows = maxRows; } Statement cs = cmd.statement; if (cs == null || cs.compileTimestamp < database.schemaManager.schemaChangeTimestamp) { long csid = cmd.getStatementID(); cs = statementManager.getStatement(this, csid); cmd.setStatement(cs); if (cs == null) { // invalid sql has been removed already return Result.newErrorResult( Error.error(ErrorCode.X_07502)); } } Object[] pvals = (Object[]) cmd.valueData; Result result = executeCompiledStatement(cs, pvals); result = performPostExecute(cmd, result); return result; } case ResultConstants.BATCHEXECUTE : { isBatch = true; Result result = executeCompiledBatchStatement(cmd); result = performPostExecute(cmd, result); return result; } case ResultConstants.EXECDIRECT : { Result result = executeDirectStatement(cmd); result = performPostExecute(cmd, result); return result; } case ResultConstants.BATCHEXECDIRECT : { isBatch = true; Result result = executeDirectBatchStatement(cmd); result = performPostExecute(cmd, result); return result; } case ResultConstants.PREPARE : { Statement cs; try { cs = statementManager.compile(this, cmd); } catch (Throwable t) { String errorString = cmd.getMainString(); if (database.getProperties().getErrorLevel() == HsqlDatabaseProperties.NO_MESSAGE) { errorString = null; } return Result.newErrorResult(t, errorString); } Result result = Result.newPrepareResponse(cs); if (cs.getType() == StatementTypes.SELECT_CURSOR || cs.getType() == StatementTypes.CALL) { sessionData.setResultSetProperties(cmd, result); } result = performPostExecute(cmd, result); return result; } case ResultConstants.CLOSE_RESULT : { closeNavigator(cmd.getResultId()); return Result.updateZeroResult; } case ResultConstants.UPDATE_RESULT : { Result result = this.executeResultUpdate(cmd); result = performPostExecute(cmd, result); return result; } case ResultConstants.FREESTMT : { statementManager.freeStatement(cmd.getStatementID()); return Result.updateZeroResult; } case ResultConstants.GETSESSIONATTR : { int id = cmd.getStatementType(); return getAttributesResult(id); } case ResultConstants.SETSESSIONATTR : { return setAttributes(cmd); } case ResultConstants.ENDTRAN : { switch (cmd.getActionType()) { case ResultConstants.TX_COMMIT : try { commit(false); } catch (Throwable t) { return Result.newErrorResult(t); } break; case ResultConstants.TX_COMMIT_AND_CHAIN : try { commit(true); } catch (Throwable t) { return Result.newErrorResult(t); } break; case ResultConstants.TX_ROLLBACK : rollback(false); break; case ResultConstants.TX_ROLLBACK_AND_CHAIN : rollback(true); break; case ResultConstants.TX_SAVEPOINT_NAME_RELEASE : try { String name = cmd.getMainString(); releaseSavepoint(name); } catch (Throwable t) { return Result.newErrorResult(t); } break; case ResultConstants.TX_SAVEPOINT_NAME_ROLLBACK : try { rollbackToSavepoint(cmd.getMainString()); } catch (Throwable t) { return Result.newErrorResult(t); } break; case ResultConstants.PREPARECOMMIT : try { prepareCommit(); } catch (Throwable t) { return Result.newErrorResult(t); } break; } return Result.updateZeroResult; } case ResultConstants.SETCONNECTATTR : { switch (cmd.getConnectionAttrType()) { case ResultConstants.SQL_ATTR_SAVEPOINT_NAME : try { savepoint(cmd.getMainString()); } catch (Throwable t) { return Result.newErrorResult(t); } // case ResultConstants.SQL_ATTR_AUTO_IPD // - always true // default: throw - case never happens } return Result.updateZeroResult; } case ResultConstants.REQUESTDATA : { return sessionData.getDataResultSlice(cmd.getResultId(), cmd.getUpdateCount(), cmd.getFetchSize()); } case ResultConstants.DISCONNECT : { close(); return Result.updateZeroResult; } default : { return Result.newErrorResult( Error.runtimeError(ErrorCode.U_S0500, "Session")); } } } private Result performPostExecute(Result command, Result result) { if (result.mode == ResultConstants.DATA) { result = sessionData.getDataResultHead(command, result, isNetwork); } /* else if (result.mode == ResultConstants.ERROR) { while (sessionContext.depth > 0) { sessionContext.pop(); } } */ if (sqlWarnings != null && sqlWarnings.size() > 0) { if (result.mode == ResultConstants.UPDATECOUNT) { result = new Result(ResultConstants.UPDATECOUNT, result.getUpdateCount()); } HsqlException[] warnings = getAndClearWarnings(); result.addWarnings(warnings); } return result; } public RowSetNavigatorClient getRows(long navigatorId, int offset, int blockSize) { return sessionData.getRowSetSlice(navigatorId, offset, blockSize); } public synchronized void closeNavigator(long id) { sessionData.closeNavigator(id); } public Result executeDirectStatement(Result cmd) { String sql = cmd.getMainString(); HsqlArrayList list; int maxRows = cmd.getUpdateCount(); if (maxRows == -1) { sessionContext.currentMaxRows = 0; } else if (sessionMaxRows == 0) { sessionContext.currentMaxRows = maxRows; } else { sessionContext.currentMaxRows = sessionMaxRows; sessionMaxRows = 0; } try { list = parser.compileStatements(sql, cmd); } catch (Throwable e) { return Result.newErrorResult(e); } Result result = null; for (int i = 0; i < list.size(); i++) { Statement cs = (Statement) list.get(i); cs.setGeneratedColumnInfo(cmd.getGeneratedResultType(), cmd.getGeneratedResultMetaData()); result = executeCompiledStatement(cs, ValuePool.emptyObjectArray); if (result.mode == ResultConstants.ERROR) { break; } } return result; } public Result executeDirectStatement(String sql) { try { Statement cs = compileStatement(sql); Result result = executeCompiledStatement(cs, ValuePool.emptyObjectArray); return result; } catch (HsqlException e) { return Result.newErrorResult(e); } } public Result executeCompiledStatement(Statement cs, Object[] pvals) { Result r; if (abortTransaction) { rollback(false); return Result.newErrorResult(Error.error(ErrorCode.X_40001)); } if (sessionContext.depth > 0) { if (sessionContext.noSQL.booleanValue() || cs.isAutoCommitStatement()) { return Result.newErrorResult(Error.error(ErrorCode.X_46000)); } } if (cs.isAutoCommitStatement()) { if (isReadOnly()) { return Result.newErrorResult(Error.error(ErrorCode.X_25006)); } try { /** special autocommit for backward compatibility */ commit(false); } catch (HsqlException e) { database.logger.logInfoEvent("Exception at commit"); } } sessionContext.currentStatement = cs; boolean isTX = cs.isTransactionStatement(); if (!isTX) { if (database.logger.getSqlEventLogLevel() >= SimpleLog.LOG_NORMAL) { sessionContext.setDynamicArguments(pvals); database.logger.logStatementEvent(this, cs, pvals, SimpleLog.LOG_NORMAL); } r = cs.execute(this); sessionContext.currentStatement = null; return r; } while (true) { actionIndex = rowActionList.size(); database.txManager.beginAction(this, cs); cs = sessionContext.currentStatement; if (cs == null) { return Result.newErrorResult(Error.error(ErrorCode.X_07502)); } if (abortTransaction) { rollback(false); sessionContext.currentStatement = null; return Result.newErrorResult(Error.error(ErrorCode.X_40001)); } try { latch.await(); } catch (InterruptedException e) { abortTransaction = true; } if (abortTransaction) { rollback(false); sessionContext.currentStatement = null; return Result.newErrorResult(Error.error(ErrorCode.X_40001)); } database.txManager.beginActionResume(this); // tempActionHistory.add("sql execute " + cs.sql + " " + actionTimestamp + " " + rowActionList.size()); sessionContext.setDynamicArguments(pvals); if (database.logger.getSqlEventLogLevel() >= SimpleLog.LOG_NORMAL) { database.logger.logStatementEvent(this, cs, pvals, SimpleLog.LOG_NORMAL); } r = cs.execute(this); lockStatement = sessionContext.currentStatement; // tempActionHistory.add("sql execute end " + actionTimestamp + " " + rowActionList.size()); endAction(r); if (abortTransaction) { rollback(false); sessionContext.currentStatement = null; return Result.newErrorResult(Error.error(r.getException(), ErrorCode.X_40001, null)); } if (redoAction) { redoAction = false; try { latch.await(); } catch (InterruptedException e) { abortTransaction = true; } } else { break; } } if (sessionContext.depth == 0 && (sessionContext.isAutoCommit.booleanValue() || cs.isAutoCommitStatement())) { try { if (r.mode == ResultConstants.ERROR) { rollback(false); } else { commit(false); } } catch (Exception e) { sessionContext.currentStatement = null; return Result.newErrorResult(Error.error(ErrorCode.X_40001, e)); } } sessionContext.currentStatement = null; return r; } private Result executeCompiledBatchStatement(Result cmd) { long csid; Statement cs; int[] updateCounts; int count; cs = cmd.statement; if (cs == null || cs.compileTimestamp < database.schemaManager.schemaChangeTimestamp) { csid = cmd.getStatementID(); cs = statementManager.getStatement(this, csid); if (cs == null) { // invalid sql has been removed already return Result.newErrorResult(Error.error(ErrorCode.X_07502)); } } count = 0; RowSetNavigator nav = cmd.initialiseNavigator(); updateCounts = new int[nav.getSize()]; Result generatedResult = null; if (cs.hasGeneratedColumns()) { generatedResult = Result.newGeneratedDataResult(cs.generatedResultMetaData()); } Result error = null; while (nav.hasNext()) { Object[] pvals = (Object[]) nav.getNext(); Result in = executeCompiledStatement(cs, pvals); // On the client side, iterate over the vals and throw // a BatchUpdateException if a batch status value of // esultConstants.EXECUTE_FAILED is encountered in the result if (in.isUpdateCount()) { if (cs.hasGeneratedColumns()) { RowSetNavigator navgen = in.getChainedResult().getNavigator(); while (navgen.hasNext()) { Object[] generatedRow = navgen.getNext(); generatedResult.getNavigator().add(generatedRow); } } updateCounts[count++] = in.getUpdateCount(); } else if (in.isData()) { // FIXME: we don't have what it takes yet // to differentiate between things like // stored procedure calls to methods with // void return type and select statements with // a single row/column containg null updateCounts[count++] = ResultConstants.SUCCESS_NO_INFO; } else if (in.mode == ResultConstants.CALL_RESPONSE) { updateCounts[count++] = ResultConstants.SUCCESS_NO_INFO; } else if (in.mode == ResultConstants.ERROR) { updateCounts = ArrayUtil.arraySlice(updateCounts, 0, count); error = in; break; } else { throw Error.runtimeError(ErrorCode.U_S0500, "Session"); } } return Result.newBatchedExecuteResponse(updateCounts, generatedResult, error); } private Result executeDirectBatchStatement(Result cmd) { int[] updateCounts; int count; count = 0; RowSetNavigator nav = cmd.initialiseNavigator(); updateCounts = new int[nav.getSize()]; Result error = null; while (nav.hasNext()) { Result in; Object[] data = (Object[]) nav.getNext(); String sql = (String) data[0]; try { in = executeDirectStatement(sql); } catch (Throwable t) { in = Result.newErrorResult(t); // if (t instanceof OutOfMemoryError) { // System.gc(); // } // "in" alread equals "err" // maybe test for OOME and do a gc() ? // t.printStackTrace(); } if (in.isUpdateCount()) { updateCounts[count++] = in.getUpdateCount(); } else if (in.isData()) { // FIXME: we don't have what it takes yet // to differentiate between things like // stored procedure calls to methods with // void return type and select statements with // a single row/column containg null updateCounts[count++] = ResultConstants.SUCCESS_NO_INFO; } else if (in.mode == ResultConstants.CALL_RESPONSE) { updateCounts[count++] = ResultConstants.SUCCESS_NO_INFO; } else if (in.mode == ResultConstants.ERROR) { updateCounts = ArrayUtil.arraySlice(updateCounts, 0, count); error = in; break; } else { throw Error.runtimeError(ErrorCode.U_S0500, "Session"); } } return Result.newBatchedExecuteResponse(updateCounts, null, error); } /** * Retrieves the result of inserting, updating or deleting a row * from an updatable result. * * @return the result of executing the statement */ private Result executeResultUpdate(Result cmd) { long id = cmd.getResultId(); int actionType = cmd.getActionType(); Result result = sessionData.getDataResult(id); if (result == null) { return Result.newErrorResult(Error.error(ErrorCode.X_24501)); } Object[] pvals = (Object[]) cmd.valueData; Type[] types = cmd.metaData.columnTypes; StatementQuery statement = (StatementQuery) result.getStatement(); QueryExpression qe = statement.queryExpression; Table baseTable = qe.getBaseTable(); int[] columnMap = qe.getBaseTableColumnMap(); sessionContext.rowUpdateStatement.setRowActionProperties(result, actionType, baseTable, types, columnMap); Result resultOut = executeCompiledStatement(sessionContext.rowUpdateStatement, pvals); return resultOut; } // session DATETIME functions long currentDateSCN; long currentTimestampSCN; long currentMillis; private TimestampData currentDate; private TimestampData currentTimestamp; private TimestampData localTimestamp; private TimeData currentTime; private TimeData localTime; /** * Returns the current date, unchanged for the duration of the current * execution unit (statement).

              * * SQL standards require that CURRENT_DATE, CURRENT_TIME and * CURRENT_TIMESTAMP are all evaluated at the same point of * time in the duration of each SQL statement, no matter how long the * SQL statement takes to complete.

              * * When this method or a corresponding method for CURRENT_TIME or * CURRENT_TIMESTAMP is first called in the scope of a system change * number, currentMillis is set to the current system time. All further * CURRENT_XXXX calls in this scope will use this millisecond value. * (fredt@users) */ public synchronized TimestampData getCurrentDate() { resetCurrentTimestamp(); if (currentDate == null) { currentDate = (TimestampData) Type.SQL_DATE.getValue(currentMillis / 1000, 0, getZoneSeconds()); } return currentDate; } /** * Returns the current time, unchanged for the duration of the current * execution unit (statement) */ synchronized TimeData getCurrentTime(boolean withZone) { resetCurrentTimestamp(); if (withZone) { if (currentTime == null) { int seconds = (int) (HsqlDateTime.getNormalisedTime(currentMillis)) / 1000; int nanos = (int) (currentMillis % 1000) * 1000000; currentTime = new TimeData(seconds, nanos, getZoneSeconds()); } return currentTime; } else { if (localTime == null) { int seconds = (int) (HsqlDateTime.getNormalisedTime( currentMillis + getZoneSeconds() * 1000)) / 1000; int nanos = (int) (currentMillis % 1000) * 1000000; localTime = new TimeData(seconds, nanos, 0); } return localTime; } } /** * Returns the current timestamp, unchanged for the duration of the current * execution unit (statement) */ synchronized TimestampData getCurrentTimestamp(boolean withZone) { resetCurrentTimestamp(); if (withZone) { if (currentTimestamp == null) { int nanos = (int) (currentMillis % 1000) * 1000000; currentTimestamp = new TimestampData((currentMillis / 1000), nanos, getZoneSeconds()); } return currentTimestamp; } else { if (localTimestamp == null) { int nanos = (int) (currentMillis % 1000) * 1000000; localTimestamp = new TimestampData(currentMillis / 1000 + getZoneSeconds(), nanos, 0); } return localTimestamp; } } private void resetCurrentTimestamp() { if (currentTimestampSCN != actionTimestamp) { currentTimestampSCN = actionTimestamp; currentMillis = System.currentTimeMillis(); currentDate = null; currentTimestamp = null; localTimestamp = null; currentTime = null; localTime = null; } } public int getZoneSeconds() { return timeZoneSeconds; } public void setZoneSeconds(int seconds) { if (seconds == sessionTimeZoneSeconds) { calendar = null; timeZoneSeconds = sessionTimeZoneSeconds; } else { TimeZone zone = TimeZone.getDefault(); zone.setRawOffset(seconds * 1000); calendar = new GregorianCalendar(zone); timeZoneSeconds = seconds; } } private Result getAttributesResult(int id) { Result r = Result.newSessionAttributesResult(); Object[] data = r.getSingleRowData(); data[SessionInterface.INFO_ID] = ValuePool.getInt(id); switch (id) { case SessionInterface.INFO_ISOLATION : data[SessionInterface.INFO_INTEGER] = ValuePool.getInt(isolationLevel); break; case SessionInterface.INFO_AUTOCOMMIT : data[SessionInterface.INFO_BOOLEAN] = sessionContext.isAutoCommit; break; case SessionInterface.INFO_CONNECTION_READONLY : data[SessionInterface.INFO_BOOLEAN] = sessionContext.isReadOnly; break; case SessionInterface.INFO_CATALOG : data[SessionInterface.INFO_VARCHAR] = database.getCatalogName().name; break; } return r; } private Result setAttributes(Result r) { Object[] row = r.getSessionAttributes(); int id = ((Integer) row[SessionInterface.INFO_ID]).intValue(); try { switch (id) { case SessionInterface.INFO_AUTOCOMMIT : { boolean value = ((Boolean) row[SessionInterface.INFO_BOOLEAN]) .booleanValue(); this.setAutoCommit(value); break; } case SessionInterface.INFO_CONNECTION_READONLY : { boolean value = ((Boolean) row[SessionInterface.INFO_BOOLEAN]) .booleanValue(); this.setReadOnlyDefault(value); break; } case SessionInterface.INFO_ISOLATION : { int value = ((Integer) row[SessionInterface.INFO_INTEGER]) .intValue(); this.setIsolationDefault(value); break; } case SessionInterface.INFO_CATALOG : { String value = ((String) row[SessionInterface.INFO_VARCHAR]); this.setCatalog(value); } } } catch (HsqlException e) { return Result.newErrorResult(e); } return Result.updateZeroResult; } public synchronized Object getAttribute(int id) { switch (id) { case SessionInterface.INFO_ISOLATION : return ValuePool.getInt(isolationLevel); case SessionInterface.INFO_AUTOCOMMIT : return sessionContext.isAutoCommit; case SessionInterface.INFO_CONNECTION_READONLY : return isReadOnlyDefault ? Boolean.TRUE : Boolean.FALSE; case SessionInterface.INFO_CATALOG : return database.getCatalogName().name; } return null; } public synchronized void setAttribute(int id, Object object) { switch (id) { case SessionInterface.INFO_AUTOCOMMIT : { boolean value = ((Boolean) object).booleanValue(); this.setAutoCommit(value); break; } case SessionInterface.INFO_CONNECTION_READONLY : { boolean value = ((Boolean) object).booleanValue(); this.setReadOnlyDefault(value); break; } case SessionInterface.INFO_ISOLATION : { int value = ((Integer) object).intValue(); this.setIsolationDefault(value); break; } case SessionInterface.INFO_CATALOG : { String value = ((String) object); this.setCatalog(value); } } } // lobs public BlobDataID createBlob(long length) { long lobID = database.lobManager.createBlob(this, length); if (lobID == 0) { throw Error.error(ErrorCode.X_0F502); } sessionData.registerNewLob(lobID); return new BlobDataID(lobID); } public ClobDataID createClob(long length) { long lobID = database.lobManager.createClob(this, length); if (lobID == 0) { throw Error.error(ErrorCode.X_0F502); } sessionData.registerNewLob(lobID); return new ClobDataID(lobID); } public void registerResultLobs(Result result) { sessionData.registerLobForResult(result); } public void allocateResultLob(ResultLob result, InputStream inputStream) { sessionData.allocateLobForResult(result, inputStream); } Result performLOBOperation(ResultLob cmd) { long id = cmd.getLobID(); int operation = cmd.getSubType(); switch (operation) { case ResultLob.LobResultTypes.REQUEST_GET_LOB : { return database.lobManager.getLob(id, cmd.getOffset(), cmd.getBlockLength()); } case ResultLob.LobResultTypes.REQUEST_GET_LENGTH : { return database.lobManager.getLength(id); } case ResultLob.LobResultTypes.REQUEST_GET_BYTES : { return database.lobManager.getBytes( id, cmd.getOffset(), (int) cmd.getBlockLength()); } case ResultLob.LobResultTypes.REQUEST_SET_BYTES : { return database.lobManager.setBytes( id, cmd.getOffset(), cmd.getByteArray(), (int) cmd.getBlockLength()); } case ResultLob.LobResultTypes.REQUEST_GET_CHARS : { return database.lobManager.getChars( id, cmd.getOffset(), (int) cmd.getBlockLength()); } case ResultLob.LobResultTypes.REQUEST_SET_CHARS : { return database.lobManager.setChars(id, cmd.getOffset(), cmd.getCharArray()); } case ResultLob.LobResultTypes.REQUEST_TRUNCATE : { return database.lobManager.truncate(id, cmd.getOffset()); } case ResultLob.LobResultTypes.REQUEST_DUPLICATE_LOB : { return database.lobManager.createDuplicateLob(id); } case ResultLob.LobResultTypes.REQUEST_CREATE_BYTES : case ResultLob.LobResultTypes.REQUEST_CREATE_CHARS : case ResultLob.LobResultTypes.REQUEST_GET_BYTE_PATTERN_POSITION : case ResultLob.LobResultTypes.REQUEST_GET_CHAR_PATTERN_POSITION : { throw Error.error(ErrorCode.X_0A501); } default : { throw Error.runtimeError(ErrorCode.U_S0500, "Session"); } } } // DatabaseMetaData.getURL should work as specified for // internal connections too. public String getInternalConnectionURL() { return DatabaseURL.S_URL_PREFIX + database.getURI(); } boolean isProcessingScript() { return isProcessingScript; } boolean isProcessingLog() { return isProcessingLog; } // schema object methods public void setSchema(String schema) { currentSchema = database.schemaManager.getSchemaHsqlName(schema); } public void setCatalog(String catalog) { if (database.getCatalogName().name.equals(catalog)) { return; } throw Error.error(ErrorCode.X_3D000); } /** * If schemaName is null, return the current schema name, else return * the HsqlName object for the schema. If schemaName does not exist, * throw. */ HsqlName getSchemaHsqlName(String name) { return name == null ? currentSchema : database.schemaManager.getSchemaHsqlName(name); } /** * Same as above, but return string */ public String getSchemaName(String name) { return name == null ? currentSchema.name : database.schemaManager.getSchemaName(name); } public void setCurrentSchemaHsqlName(HsqlName name) { currentSchema = name; } public HsqlName getCurrentSchemaHsqlName() { return currentSchema; } public int getResultMemoryRowCount() { return resultMaxMemoryRows; } public void setResultMemoryRowCount(int count) { if (database.logger.getTempDirectoryPath() != null) { if (count < 0) { count = 0; } resultMaxMemoryRows = count; } } // warnings HsqlDeque sqlWarnings; public void addWarning(HsqlException warning) { if (sqlWarnings == null) { sqlWarnings = new HsqlDeque(); } if (sqlWarnings.size() > 9) { sqlWarnings.removeFirst(); } int index = sqlWarnings.indexOf(warning); if (index >= 0) { sqlWarnings.remove(index); } sqlWarnings.add(warning); } public HsqlException[] getAndClearWarnings() { if (sqlWarnings == null) { return HsqlException.emptyArray; } HsqlException[] array = new HsqlException[sqlWarnings.size()]; sqlWarnings.toArray(array); sqlWarnings.clear(); return array; } public HsqlException getLastWarning() { if (sqlWarnings == null || sqlWarnings.size() == 0) { return null; } return (HsqlException) sqlWarnings.getLast(); } public void clearWarnings() { if (sqlWarnings != null) { sqlWarnings.clear(); } } // session zone Calendar calendar; public Calendar getCalendar() { if (calendar == null) { if (zoneString == null) { calendar = new GregorianCalendar(); } else { TimeZone zone = TimeZone.getTimeZone(zoneString); calendar = new GregorianCalendar(zone); } } return calendar; } // services TypedComparator typedComparator; Scanner secondaryScanner; SimpleDateFormat simpleDateFormat; SimpleDateFormat simpleDateFormatGMT; Random randomGenerator = new Random(); long seed = -1; // public TypedComparator getComparator() { if (typedComparator == null) { typedComparator = Type.newComparator(this); } return typedComparator; } public double random(long seed) { if (this.seed != seed) { randomGenerator.setSeed(seed); this.seed = seed; } return randomGenerator.nextDouble(); } public double random() { return randomGenerator.nextDouble(); } public Scanner getScanner() { if (secondaryScanner == null) { secondaryScanner = new Scanner(); } return secondaryScanner; } // properties HsqlProperties clientProperties; public HsqlProperties getClientProperties() { if (clientProperties == null) { clientProperties = new HsqlProperties(); clientProperties.setProperty( HsqlDatabaseProperties.jdbc_translate_tti_types, database.sqlTranslateTTI); } return clientProperties; } public SimpleDateFormat getSimpleDateFormatGMT() { if (simpleDateFormatGMT == null) { simpleDateFormatGMT = new SimpleDateFormat("MMMM", Locale.ENGLISH); Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT")); simpleDateFormatGMT.setCalendar(cal); } return simpleDateFormatGMT; } // SEQUENCE current values void logSequences() { HashMap map = sessionData.sequenceUpdateMap; if (map == null || map.isEmpty()) { return; } Iterator it = map.keySet().iterator(); for (int i = 0, size = map.size(); i < size; i++) { NumberSequence sequence = (NumberSequence) it.next(); database.logger.writeSequenceStatement(this, sequence); } sessionData.sequenceUpdateMap.clear(); } String getStartTransactionSQL() { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_START).append(' ').append(Tokens.T_TRANSACTION); if (isolationLevel != isolationLevelDefault) { sb.append(' '); appendIsolationSQL(sb, isolationLevel); } return sb.toString(); } String getTransactionIsolationSQL() { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_SET).append(' ').append(Tokens.T_TRANSACTION); sb.append(' '); appendIsolationSQL(sb, isolationLevel); return sb.toString(); } String getSessionIsolationSQL() { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_SET).append(' ').append(Tokens.T_SESSION); sb.append(' ').append(Tokens.T_CHARACTERISTICS).append(' '); sb.append(Tokens.T_AS).append(' ').append(Tokens.T_TRANSACTION).append( ' '); appendIsolationSQL(sb, isolationLevelDefault); return sb.toString(); } static void appendIsolationSQL(StringBuffer sb, int isolationLevel) { sb.append(Tokens.T_ISOLATION).append(' '); sb.append(Tokens.T_LEVEL).append(' '); sb.append(getIsolationString(isolationLevel)); } static String getIsolationString(int isolationLevel) { switch (isolationLevel) { case SessionInterface.TX_READ_UNCOMMITTED : case SessionInterface.TX_READ_COMMITTED : StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_READ).append(' '); sb.append(Tokens.T_COMMITTED); return sb.toString(); case SessionInterface.TX_REPEATABLE_READ : case SessionInterface.TX_SERIALIZABLE : default : return Tokens.T_SERIALIZABLE; } } String getSetSchemaStatement() { return "SET SCHEMA " + currentSchema.statementName; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementExpression.java0000644000175000017500000001343312007547416023637 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.ParserDQL.CompileContext; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArraySort; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.navigator.RowSetNavigatorData; import org.hsqldb.result.Result; /** * Implementation of Statement for PSM statements with expressions. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class StatementExpression extends StatementDMQL { Expression expression; /** * for RETURN and flow control */ StatementExpression(Session session, CompileContext compileContext, int type, Expression expression) { super(type, StatementTypes.X_SQL_CONTROL, null); switch (type) { case StatementTypes.RETURN : case StatementTypes.CONDITION : break; default : throw Error.runtimeError(ErrorCode.U_S0500, ""); } isTransactionStatement = false; this.expression = expression; setDatabseObjects(session, compileContext); checkAccessRights(session); } public String getSQL() { StringBuffer sb = new StringBuffer(); switch (type) { case StatementTypes.RETURN : return sql; case StatementTypes.CONDITION : sb.append(expression.getSQL()); break; } return sb.toString(); } TableDerived[] getSubqueries(Session session) { OrderedHashSet subQueries = null; if (expression != null) { subQueries = expression.collectAllSubqueries(subQueries); } if (subQueries == null || subQueries.size() == 0) { return TableDerived.emptyArray; } TableDerived[] subQueryArray = new TableDerived[subQueries.size()]; subQueries.toArray(subQueryArray); ArraySort.sort(subQueryArray, 0, subQueryArray.length, subQueryArray[0]); for (int i = 0; i < subqueries.length; i++) { subQueryArray[i].prepareTable(); } return subQueryArray; } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } sb.append(Tokens.T_STATEMENT); return sb.toString(); } public Result execute(Session session) { Result result; try { if (subqueries.length > 0) { materializeSubQueries(session); } result = getResult(session); } catch (Throwable t) { result = Result.newErrorResult(t, null); } if (result.isError()) { result.getException().setStatementType(group, type); } return result; } Result getResult(Session session) { switch (type) { case StatementTypes.RETURN : case StatementTypes.CONDITION : Result result = expression.getResult(session); // data navigator has statement scope and will be cleared at the end of statement if (result.isData()) { RowSetNavigatorData navigator = new RowSetNavigatorData(session, result.getNavigator()); result.setNavigator(navigator); } return result; default : throw Error.runtimeError(ErrorCode.U_S0500, ""); } } public void resolve(Session session) {} String describeImpl(Session session) throws Exception { return getSQL(); } void collectTableNamesForRead(OrderedHashSet set) { for (int i = 0; i < subqueries.length; i++) { if (subqueries[i].queryExpression != null) { subqueries[i].queryExpression.getBaseTableNames(set); } } for (int i = 0; i < routines.length; i++) { set.addAll(routines[i].getTableNamesForRead()); } } void collectTableNamesForWrite(OrderedHashSet set) {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/0000755000175000017500000000000012007570422020350 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/0000755000175000017500000000000012007570422022045 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/SqlTool.syntax_de.text0000644000175000017500000000330312007547370026352 0ustar renereneSyntax: java org.hsqldb.cmdline.SqlTool [--opt[=optwert]...] urlid [datei1.sql...] Optionen: --help Gibt diese Hilfe aus. --list Zeigt urlids aus der RC-Datei an. --noInput Nicht von stdin lesen (Standardeinstellung wenn SQL-Datei angegeben oder der Schalter --sql benutzt wird). --stdInput Liest von stdin ZUSÄTZLICH zu SQL-Dateien/--sql Eingabe. --inlineRc=url=val1,user=val2[,x=val3...][,password=] Inline RC-Variablen --debug Gibt Debug Infos auf stderr aus. --noAutoFile Führt die Datei auto.sql im Home-Verzeichniss nicht aus. --autoCommit Auto-commit JDBC DML Befehle --sql="SQL; Anweisungen;" Führt die angegebene SQL-Anweisung aus statt von stdin zu lesen (bevor SQL-Dateien - wenn angegeben - ausgeführt werden) wobei 'SQL' aus SQL-Befehlen gebildet wird. Siehe Handbuch. --rcFile=path/file.rc Verwende Info-Datei [$HOME/sqltool.rc] --continueOnErr=true|false Weiter (true) oder Abbrechen (false) nach Fehler. --setVar=NAME1=val1[,NAME2=val2...] PL Variablen --driver=a.b.c.Driver JDBC Treiber Class [%{2}] urlid ID von Url/Benutzername/Passwort in der RC-Datei datei1.sql... SQL Dateien auszuführen [stdin] (Benutzen Sie '-' für Nicht-Interaktives stdin!). Lesen Sie das SqlTool Handbuch für unterstützte sqltool.* Systemeigenschaften. SqlTool v. %{1}. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/errorat.text0000644000175000017500000000005312007547370024435 0ustar renereneError at '%{1}' line %{2}: %{3:+"%3" }%{4} hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/buffer.help_de.text0000644000175000017500000000452512007547370025637 0ustar renereneEDITIER-PUFFER UND VERLAUFSBEFEHLE. Nur während der interaktiven Benutzung vorhanden. :? Editier-Puffer/Verlauf - Hilfe :h Zeigt Befehlsverlauf (sowie Editier-Pufferinhalt) an :b Zeigt den aktuellen Inhalt des Editier-Puffer an :X (Ganzzahl X) Lädt Befehl Nr. X aus dem Verlauf in den Editier-Puffer :-Y (Ganzzahl -Y) Wie :X, nur geht -Y entsprechend Y Befehle zurück Die restlichen Editier/Verlaufsbefehle arbeiten standardmäßig alle im Editier-Puffer, sie können aber auch auf jeden Befehl im Verlaufsspeicher angewendet werden, wenn Sie nach dem Doppelpunkt ein Muster angeben, welches auf den gesuchten Befehl zutrifft; wie z.B.: ":blau;" um den letzten Befehl der "blau" enthielt nochmal auszuführen. Oder "w -3 /tmp/befehl.txt" um den drittletzten Befehl an die Datei befehl.txt anzuhängen. :; Führt den Editier-Pufferinhalt aus (Spezial, PL oder SQL-Befehl) :w datei/pfad.sql Aktuellen Editier-Pufferinhalt an Datei anhängen. :a[text] In den Anhängemodus wechseln mit einer Kopie des Pufferinhaltes. :s/von regex/zu/ Ersetzt alle Übereinstimmungen "von regex" mit "zu". :s/von/zu/[igm;] Ein oder Mehrfachersetzung mit mehreren Optionen. von: Regulärer Ausdruck. Siehe auch 'perlre'-Manpage oder Java API Spezifikation für java.util.regex.Pattern! zu: Wenn leer - dann werden alle "von"`s gelöscht (z.b. ":s/x//"). [igm;] Diese Optionen arbeiten genau wie in Perl oder java.util.regex ausgenommen ';', bedeutet nach der Ersetzung ausführen. Die Option 'g' bedeutet das alle (Global) Treffer ersetzt werden; 's' ist ist immer aktiv. /: Kann beliebiges Zeichen sein, welches weder im "von" noch "zu" Begriff vorkommt. SUBSTITUTIONS-SCHALTER: i: ignoriert Groß/Kleinschreibung g: Global (alle Treffer ersetzen) m: ^ und $ bezeieht sich auf den Zeilenanfang und Ende (siehe Perl 'm' Option) ;: Ausführung nach der Ersetzung hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/rejectreport.bottom_de.text0000644000175000017500000000022212007547370027440 0ustar renerene %{1}

              SqlFile Revision %{2}.
              hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/Token.java0000644000175000017500000001277512007547370024012 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.cmdline.sqltool; import java.util.regex.Pattern; /* @(#)$Id: Token.java 4497 2011-10-09 18:43:39Z unsaved $ */ public class Token { public static final int SQL_TYPE = 0; public static final int SPECIAL_TYPE = 1; public static final int PL_TYPE = 2; public static final int EDIT_TYPE = 3; public static final int RAW_TYPE = 4; public static final int RAWEXEC_TYPE = 5; public static final int SYNTAX_ERR_TYPE = 6; public static final int UNTERM_TYPE = 7; public static final int BUFFER_TYPE = 8; public static final int MACRO_TYPE = 9; public static final Pattern leadingWhitePattern = Pattern.compile("^\\s+"); public int line; public TokenList nestedBlock = null; public String[] typeString = { "SQL", "SPECIAL", "PL", "EDIT", "RAW", "RAWEXEC", "SYNTAX", "UNTERM", "BUFFER", "MACRO" }; public char[] typeChar = { 'S', '\\', '*', 'E', 'R', 'X', '!', '<', '>', '/' }; public String getTypeString() { return typeString[type]; } public char getTypeChar() { return typeChar[type]; } public String val; public int type; public Token(int inType, String inVal, int inLine) { val = inVal; type = inType; line = inLine + 1; switch (inType) { case SPECIAL_TYPE: case EDIT_TYPE: case PL_TYPE: case MACRO_TYPE: // These types must be not null. May be just whitespace. // Will be trimmed. if (val == null) throw new IllegalArgumentException( "Null String value for scanner token"); // Leading white space is always safe for us to trim from these // types of commands, but we must preserve trailing whitespace // for some commands. val = leadingWhitePattern.matcher(val).replaceFirst(""); break; case SYNTAX_ERR_TYPE: case BUFFER_TYPE: case RAW_TYPE: case RAWEXEC_TYPE: case UNTERM_TYPE: // These types must be not null. May be just whitespace. // Will NOT be trimmed. if (val == null) throw new IllegalArgumentException( "Null String value for scanner token"); break; case SQL_TYPE: // These types may be anything (null, whitespace, etc.). // Will NOT be trimmed break; default: throw new IllegalArgumentException( "Internal error. Unexpected scanner token type: " + inType); } } public Token(int inType, StringBuffer inBuf, int inLine) { this(inType, inBuf.toString(), inLine); } public Token(int inType, int inLine) { this(inType, (String) null, inLine); } public String toString() { return "@" + line + " TYPE=" + getTypeString() + ", VALUE=(" + val + ')'; } /** * Equality ignores the line number */ public boolean equals(Token otherToken) { if (type != otherToken.type) return false; if (val == null && otherToken.val != null) return false; if (val != null && otherToken.val == null) return false; if (val != null && !val.equals(otherToken.val)) return false; return true; } /* * Convenience wrapper for brevity. */ public String reconstitute() { return reconstitute(false); } /* * A command string generated from val and type which can hopefully be * re-executed. */ public String reconstitute(boolean semify) { if (val == null) return ""; switch (type) { case Token.SPECIAL_TYPE: case Token.PL_TYPE: return Character.toString(getTypeChar()) + val; case Token.SQL_TYPE: return val + (semify ? ";" : ""); } return "? " + val; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/dsv.options_de.text0000644000175000017500000000751312007547370025725 0ustar renerene \m pfad/datei.dsv Importiert Datensätze aus einer DSV-Textdatei in eine Tabelle. (weitere Optionen '\m?'). \mq pfad/datei.csv Ditto, aber mit traditionellen CSV doppelt zitiert. \x {TABELLE|SELECT...} Exportiert Tabellen oder Abfragen in eine DSV-Textdatei (weitere Optionen: '\x?'). \xq {TABELLE|SEL...} Ditto, aber mit traditionellen CSV doppelt zitiert. DSV bedeutet Delimiter-Separated-Values (dt. etwa:Trennzeichen-getrennte Werte). Es ist im Grunde genommen CSV (Comma Separated Values), DSV verwendet aber als Trennzeichen nur Zeichen welche sonst nicht im Text vorkommen. Auf diese Weise wird die bei CSV oft notwendige Maskierung von Trennzeichen im Text umgangen. Alle DSV PL-Variablen sind optional. Um sich den Inhalt einer PL-Variable anzeigen zu lassen, geben Sie "* listvalues" ein (ohne die ""). Um einer Variable einen Wert zu zuweisen: "* *DSV_COL_DELIM = ," Bitte vergessen Sie nicht, das erste * leitet eine PL-Variable ein und das zweite * steht am Beginn eines jeden Variablennamens. \x oder \m im folgenden zeigen an wo die Einstellung anwendbar ist. Der Standardwert/Verhalten steht in den [quadratischen Klammern]. *ALL_QUOTED \xq Doppeltes Anführungszeichen jede Zelle für \xq Exporte. ["false"] *DSV_SKIP_PREFIX \m Das Vorzeichen, das eine Kommentarzeile in der Datei einleitet. ["#"] *DSV_COL_SPLITTER \m Das Spaltentrennzeichen fürs Einlesen als Regex. ["\|"] *DSV_COL_DELIM \x Das Spaltentrennzeichen für die Ausgabe. ["|"] *DSV_ROW_SPLITTER \m Das Zeilentrennzeichen fürs Einlesen als Regex. ["\r\n|\r|\n"] *DSV_ROW_DELIM \x Das Zeilentrennzeichen für die Ausgabe. [Betriebssystem-abhängig (Java-System Property line.separator)] *NULL_REP_TOKEN \m\x Zeichenkette, um eine Datenbank-null darzustellen. ["[null]"] *DSV_TARGET_FILE \x Der Name der Zieldatei. [Name Quelltabelle + ".dsv"] *DSV_TARGET_TABLE \m Name der Tabelle in welche die Daten importiert werden. [DSV-Dateiname ohne Dateiendung] *DSV_CONST_COLS \m Spalteninhalt, welcher in jede Reihe geschrieben wird. *DSV_REJECT_FILE \m DSV-Datei, in die alle abgelehnten Datensätze geschrieben werden. [None*] *DSV_REJECT_REPORT \m HTML-Bericht mit den Gründen für abgelehnten Datensätze. [None*] *DSV_SKIP_COLS \m\x Spalten aus der Eingabedatei/Tabelle welche ausgelassen werden. *DSV_TRIM_ALL \m Wenn auf "true" gesetzt, werden alle führenden und abschließenden Leerzeichen aus allen Spalten nach dem import entfernt. [false] *DSV_RECORDS_PER_COMMIT \m Integer-Wert (X). Wird er gesetzt, so überschreibt er die aktuelle Autocommit Einstellung, es wird nun nach X erfolgreichen INSERTS commitet (sowie nach Abschluss des Imports). * Das Importieren wird sofort nach dem ersten fehlerhaften Ipmort eines Datensatzes abgebrochen, es sei den die Variablen *DSV_REJECT_FILE und/oder *DSV_REJECT_REPORT sind gesetzt. (Die "Rollback"-Funktion (Rückgängig machen) des SqlTols hängt von der Verwendung der Optionen \c und \z ab.) Auto-commit und *DSV_RECORDS_PER_COMMIT stellen sicher das alle erfolgreich eingefügten Datensätze auch commitet werden - Rollbacks sind dann aber nicht mehr möglich. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/errorat_de.text0000644000175000017500000000005512007547370025107 0ustar renereneFehler an '%{1}' Zeile %{2}: %{3:+"%3" }%{4} hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/dsv.options.text0000644000175000017500000000715712007547370025261 0ustar renereneDSV stands for Delimiter-Separated-Values, which is just CSV (comma- separated-values) but always using a proper delimiter to prevent the need for quoting and escaping which CSV files have. You can use all of these features with traditional CSV files, which allows for the use of the column-delimiter inside data, by using \xq and \mq instead of \x and \q. Here are the special commands to initiate DSV and CSV imports and exports. \m file/path.dsv iMport DSV text file records into a table (opts \m?) \mq f/path.csv Ditto, but with traditional CSV double-quoting \x {TABLE|:[appendage]|SELECT...} eXport table or query to DSV text file (options \x?) \xq {TABLE|:[appendage]|SELECT...} Ditto, but writes traditional CSV double-quoting. Export commands must specify either a table name, a 1-line SQL query (with no terminating ';') , or ':'. ':' means to use the last edit buffer, which you set up by entering a SQL query in raw mode, or interactively recall or edit a previous command. All of the DSV PL variables are optional. To see all PL var. values, run "* listvalues". Set the values like: * *DSV_COL_DELIM = , Don't forget the * indicating a PL command PLUS the leading * in all of these variable names. (Names like *THIS indicate a SqlTool system PL variable). The second column indicates where the setting is applicable, either a specific command; or M for \m or \mq; or X for \x or \xq; or MX for all. Default value/behavior is in [square brackets]. *ALL_QUOTED \xq Double-quote every cell for \xq exports. ["false"] *DSV_COL_SPLITTER M Column input delimiter regexp. ["\|"] *DSV_COL_DELIM X Column output delimiter. ["|"] *DSV_CONST_COLS M Column value assignments to apply to every row. [None] *DSV_RECORDS_PER_COMMIT M Set to integer value (X). Overrides current auto-commit setting and commits after every X successful inserts (and upon import completion). ["1" if auto-committing, "0" (never) if not] *DSV_REJECT_FILE M DSV file to be created with rejected records. [None*] *DSV_REJECT_REPORT M HTML report to explain reject records [None*] *DSV_ROW_SPLITTER M Row input delimiter regexp. ["\r\n|\r|\n"] *DSV_ROW_DELIM X Row output delimiter [OS-dependent (Java line.separator)] *DSV_SKIP_COLS MX Skip columns from input DSV file or input table. [None] *DSV_SKIP_PREFIX M Comment line prefix in DSV files. ["#"] Set to "" (empty String) to disable commenting. *DSV_TARGET_FILE X File which exports will write to [source table name + ".dsv", or ".csv" for \xq] *DSV_TARGET_TABLE M Table which imports will write to [DSV filename without extension] *DSV_TRIM_ALL M If set to "true", trim leading and trailing whitespace from all columns upon import [false] *NULL_REP_TOKEN MX String to represent database null. ["[null]"] * Imports will abort immediately upon the first import record failure, unless either *DSV_REJECT_FILE or *DSV_REJECT_REPORT (or both) are set. (Whether SqlTool will roll back and quit depends on your settings for \c and \a). Auto-commit and *DSV_RECORDS_PER_COMMIT ensure that all successfully inserted records will commit, so rollbacks are impossible with either of these. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/rejectreport.bottom.text0000644000175000017500000000012512007547370026772 0ustar renerene %{1} hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/macro.help_de.text0000644000175000017500000000061312007547370025461 0ustar renerene/? Zeigt diesen Hilfetext an /= Zeigt alle Makros /= Name Befehl... Definieren Sie ein Makro zu dem angebenen SQL-Befehl. (Kein ";" eingeben!). /: Name [Anhang] Definieren Sie ein Makro zum aktuellen Puffer-Inhalt /Name [Anhang] Laden Sie das Makro in den Puffer /Name [Anhang]; Führen Sie das Makro aus hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/SqlTool.syntax.text0000644000175000017500000000364212007547370025710 0ustar renereneSyntax: java org.hsqldb.cmdline.SqlTool [--opt[=optval]...] urlid [file1.sql...] urlid ID of connection settings in rcfile. '-' means to not connect to any data source file1.sql... SQL files to be executed [stdin] '-' means non-interactive stdin. OR: java org.hsqldb.cmdline.SqlTool [--opt[=optval]...] (Precisely equivalent to the first case, with urlid of '-' and no SQL files) Options: --help Displays this message --autoCommit Auto-commit JDBC DML commands --continueOnErr=true|false Continue (if true) or Abort (false) upon errors --debug Print Debug info to stderr --driver=a.b.c.Driver JDBC driver class [%{2}] --inlineRc=url=val1,user=val2[,asetting=val3...][,password=] Inline RC variables (use --driver for driver) --list List urlids in the rc file --noAutoFile Do not execute auto.sql from home dir --noInput Do not read stdin (default if sql file given or --sql switch used). --rcFile=/file/path.rc Connect Info File [$HOME/sqltool.rc] --setVar=NAME1=val1[,NAME2=val2...] PL variables May use multiple instances of this switch. -p NAME=value Assign a single PL variable. May use multiple instances of this switch. --sql="SQL; Statements;" Execute given SQL instead of stdin (before SQL files if any are specified) where "SQL" consists of SQL command(s). See the Guide. --stdInput Read stdin IN ADDITION to sql files/--sql input Values set with inlineRc or setVar may use \ to escape commas inside of values. SqlTool v. %{1}. The invocation samples assume you have set up 'CLASSPATH'. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/special.help.text0000644000175000017500000000377412007547370025343 0ustar renereneSPECIAL COMMANDS Filter substrings are case-sensitive! Use "SCHEMANAME." to narrow to schema. \? Special command Help \. Enter raw SQL. End with line containing only "." \= Commit JDBC session \! COMMAND [ARGS] Execute external program (no support for stdin) \a [true|false] Auto-commit JDBC DML commands (for current conn) \b save next result to Binary buffer (no display) \bd file/path.bin Dump Binary buffer to file \bl file/path.bin Load file into Binary buffer \bp use ? in next SQL statement to upload Binary buffer \c [true|false] Continue upon errors (a.o.t. abort upon error) \d OBJECTNAME [regx] Describe table or view columns \d{tvsiSanur*?} [substr] List objects of specified type: (Tbls/Views/Seqs/Indexes/SysTbls/Aliases/schemaNames/Users/Roles/table-like) \h [true|false] enable or disable HTML output mode \i file/path.sql Include/execute commands from external file \j [urlid] display Jdbc connection details, or connect to 'urlid' \j acct [pwd] jdbc:url Establish connection to Jdbc data source at URL \l LEVEL A Message Log message. (list available levels with \l?) \m file/path.dsv [*] iMport DSV text file records into a table (opts \m?) \mq f/path.csv [*] Ditto, but with traditional CSV double-quoting \o [file/path.html] tee (or stop teeing) query Output to specified file \oc stop teeing query Output and write Closing HTML \p[r] [A Message] Print string to stdout (r = Raw HTML when in \h mode) \q [abort message] Quit (or you can end input with Ctrl-Z or Ctrl-D) \t [true|false] report execution Times for all SQL commands \v [TRAN_ISO_LVL] view/set the connection transaction isolation leVel \x {TABLE|SELECT...} eXport table or query to DSV text file (options \x?) \xq {TABLE|SEL...} Ditto, but with traditional CSV double-quoting. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/Calculator.java0000644000175000017500000003554312007547370025021 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.cmdline.sqltool; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import java.util.regex.Pattern; import java.util.EnumSet; public class Calculator { private List atoms = new ArrayList(); private static Pattern intPattern = Pattern.compile("[+-]?\\d+"); private Map vars; private enum MathOp { LPAREN('('), RPAREN(')'), ADD('+'), SUBTRACT('-'), MULTIPLY('*'), DIVIDE('/'), REM('%'), POWER('^') ; MathOp(char c) { this.c = c; } private char c; public String toString() { return Character.toString(c); } public static MathOp valueOf(char c) { for (MathOp o : MathOp.values()) if (o.c == c) return o; return null; } } private EnumSet TradOrLParen = EnumSet.of(MathOp.ADD, MathOp.SUBTRACT, MathOp.LPAREN, MathOp.MULTIPLY, MathOp.DIVIDE, MathOp.REM, MathOp.POWER); private long deref(String varName) { if (!vars.containsKey(varName)) throw new IllegalStateException("Undefined variable: " + varName); try { return Long.parseLong(vars.get(varName)); } catch (NumberFormatException nfe) { throw new IllegalStateException( "Variable's value not an integer: " + varName); } } private class Atom { /* Atoms do not hold variables. * Makes for nice simplification by dereferencing variable names in * the constructor and just dealing with integer values thereafter. */ private Atom(String token) { /* if (token == null || token.length() < 1) throw new IllegalArgumentException( "Tokens must have length > 1, but was '" + token + "'"); */ if (token == null) throw new IllegalArgumentException("Tokens may not be null"); if (token.length() < 1) throw new IllegalArgumentException("Tokens may not be empty"); if (intPattern.matcher(token).matches()) { val = Long.parseLong(token); return; } if (token.length() == 1) { op = MathOp.valueOf(token.charAt(0)); if (op != null) return; } // System.err.println("Trying '" + token + "'"); val = deref(token); } private Atom(MathOp op) { this.op = op; } private Atom(long val) { this.val = val; } public MathOp op; public long val; public String toString() { return (op == null) ? Long.toString(val) : op.toString(); } } public String toString() { return atoms.toString(); } public Calculator(String[] sa, Map vars) { /* Populates the atom list. * Also collapses 2-part negative numbers into single Atoms. */ if (vars.size() < 1) throw new IllegalArgumentException("No expression supplied"); this.vars = vars; Atom atom = null, prePrevAtom; int prevIndex; NEXT_TOKEN: for (String token : sa) try { atom = new Atom(token); prevIndex = atoms.size() - 1; if (prevIndex < 0) continue; if (atoms.get(prevIndex).op != MathOp.SUBTRACT) continue; prePrevAtom = (prevIndex > 0) ? atoms.get(prevIndex-1) : null; if (prePrevAtom != null && !TradOrLParen.contains(prePrevAtom.op)) continue; if (atom.op == null) { atoms.remove(prevIndex); atom.val *= -1; } else if (atom.op == MathOp.LPAREN) { atoms.remove(prevIndex); atoms.add(new Atom(-1L)); atoms.add(new Atom(MathOp.MULTIPLY)); } } finally { atoms.add(atom); } } /** * Every integer, var name, and single-math-op-character get their own * tokens here. * Special processesing is needed afterwards because negative signs get * separated into separate tokens. */ public Calculator(String s, Map vars) { this(s.replaceAll("([-()*/+^])", " $1 ") .trim().split("\\s+"), vars); } /** * If atoms[startAtomIndex] == '(', then last visited atoms will be the * next top-level (un-paired) ')'. * Otherwise, all remainign atoms will be visited. * Every visited atom will be removed from 'atoms'. * * @returns Value that all visited atoms reduce to. */ public long reduce(int startAtomIndex, boolean stopAtParenClose) { // Every occurence of atoms.remove() below is an instance of reduction. int i; Long prevValue = null; Atom atom; // Reduce parens via recursion i = startAtomIndex - 1; PAREN_SEEKER: while (atoms.size() >= ++i) { if (atoms.size() == i) { if (stopAtParenClose) throw new IllegalStateException( "Unbalanced '" + MathOp.LPAREN + "'"); break; } atom = atoms.get(i); if (atom.op != null) switch (atom.op) { case RPAREN: if (!stopAtParenClose) throw new IllegalStateException( "Unbalanced '" + MathOp.RPAREN + "'"); atoms.remove(i); break PAREN_SEEKER; case LPAREN: // Recurse. Reduction inside of reduce(). atoms.remove(i); atoms.add(i, new Atom(reduce(i, true))); break; default: // Intentionally empty } } int remaining = i - startAtomIndex; if (remaining < 1) throw new IllegalStateException("Empty expression"); // System.out.println("Need to consume " + remaining + " after parens removed"); Atom nextAtom; MathOp op; // Reduce powers i = startAtomIndex; atom = atoms.get(i); if (atom.op != null) throw new IllegalStateException( "Expected initial value expected but got operation " + atom.op); while (startAtomIndex + remaining > i + 1) { if (startAtomIndex + remaining < i + 3) throw new IllegalStateException( "No operator/operand pairing remaining"); nextAtom = atoms.get(i + 1); if (nextAtom.op == null) throw new IllegalStateException( "Operator expected but got value " + nextAtom.val); op = nextAtom.op; nextAtom = atoms.get(i + 2); if (nextAtom.op != null) throw new IllegalStateException( "Value expected but got operator " + nextAtom.op); if (op != MathOp.POWER) { // Skip 'atom' (current) and the operand that we'll handle later i += 2; atom = nextAtom; continue; } // Reduce the operator and right operand Atoms remaining -= 2; atoms.remove(i + 1); atoms.remove(i + 1); long origVal = atom.val; atom.val = 1; for (int j = 0; j < nextAtom.val; j++) atom.val *= origVal; } // Reduce multiplication and division i = startAtomIndex; atom = atoms.get(i); if (atom.op != null) throw new IllegalStateException( "Expected initial value expected but got operation " + atom.op); while (startAtomIndex + remaining > i + 1) { if (startAtomIndex + remaining < i + 3) throw new IllegalStateException( "No operator/operand pairing remaining"); nextAtom = atoms.get(i + 1); if (nextAtom.op == null) throw new IllegalStateException( "Operator expected but got value " + nextAtom.val); op = nextAtom.op; nextAtom = atoms.get(i + 2); if (nextAtom.op != null) throw new IllegalStateException( "Value expected but got operator " + nextAtom.op); if (op != MathOp.MULTIPLY && op != MathOp.DIVIDE && op != MathOp.REM) { // Skip 'atom' (current) and the operand that we'll handle later i += 2; atom = nextAtom; continue; } // Reduce the operator and right operand Atoms remaining -= 2; atoms.remove(i + 1); atoms.remove(i + 1); if (op == MathOp.MULTIPLY) atom.val *= nextAtom.val; else if (op == MathOp.DIVIDE) atom.val /= nextAtom.val; else atom.val %= nextAtom.val; } // Reduce addition and subtraction // Reduce the leading value atom = atoms.remove(startAtomIndex); remaining--; if (atom.op != null) throw new IllegalStateException( "Value expected but got operation " + atom.op); long total = atom.val; while (remaining > 0) { // Reduce the operator Atom --remaining; atom = atoms.remove(startAtomIndex); op = atom.op; // System.err.println("Trying +/- for " + op); if (op == null) throw new IllegalStateException( "Operator expected but got value " + atom.val); if (remaining <= 0) throw new IllegalStateException("No operand for operator " + op); // Reduce the right operand --remaining; atom = atoms.remove(startAtomIndex); if (atom.op != null) throw new IllegalStateException( "Value expected but got operation " + atom.op); switch (op) { case ADD: total += atom.val; break; case SUBTRACT: total -= atom.val; break; default: throw new IllegalStateException("Unknown operator: " + op); } } return total; } /* TODO: Replace this method with a proper unit test class */ public static void main(String[] sa) { if (sa.length != 1) throw new IllegalArgumentException( "SYNTAX: java Calculator 'expression'"); Map uV = new HashMap(); uV.put("one", "1"); uV.put("two", "2"); uV.put("three", "3"); uV.put("four", "4"); uV.put("five", "5"); uV.put("six", "6"); uV.put("seven", "7"); uV.put("eight", "8"); uV.put("nine", "9"); Calculator calc = new Calculator(sa[0], uV); System.out.println(calc); System.out.println(calc.reduce(0, false)); /* if (sa[0].length() != sa[0].length()) { System.out.println((sa[0].length() >= sa[0].length()) ? ">" : "<"); return; } int val = sa[0].compareTo(sa[1]); if (val == 0) System.out.println("=="); else if (val > 0) System.out.println(">"); else System.out.println("<"); */ } /** * Does not actually do the assigment, but validates the input variable * and returns the value ready to be assigned to it. */ public static long reassignValue(String assignee, Map valMap, String opStr, String expr) { long outVal = 0; try { outVal = Long.parseLong(valMap.get(assignee)); } catch (NumberFormatException nfe) { throw new IllegalArgumentException( "Can not perform a self-operation on a non-integer: " + assignee); } Long rhValObj = (expr == null || expr.trim().length() < 1) ? null : Long.valueOf( new Calculator(expr, valMap).reduce(0, false)); if (opStr.equals("++")) { if (rhValObj != null) throw new IllegalStateException( "++ operator takes no right hand operand"); return ++outVal; } if (opStr.equals("--")) { if (rhValObj != null) throw new IllegalStateException( "++ operator takes no right hand operand"); return --outVal; } if (rhValObj == null) throw new IllegalStateException( "Operator requires a right hand operand: " + opStr); long rhVal = rhValObj.intValue(); if (opStr.equals("+=")) { outVal += rhVal; } else if (opStr.equals("-=")) { outVal -= rhVal; } else if (opStr.equals("*=")) { outVal *= rhVal; } else if (opStr.equals("/=")) { outVal /= rhVal; } else if (opStr.equals("%=")) { outVal %= rhVal; } else { throw new IllegalStateException("Unsupported operator: " + opStr); } return outVal; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/TokenSource.java0000644000175000017500000000342212007547370025160 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.cmdline.sqltool; import java.io.IOException; /* @(#)$Id: TokenSource.java 4141 2011-03-14 01:35:49Z fredt $ */ public interface TokenSource { public Token yylex() throws IOException; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/SqlFileScanner.java0000644000175000017500000010173212007547370025573 0ustar renerene/* The following code was generated by JFlex 1.4.1 on 11/4/11 7:23 PM */ /* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* @(#)$Id: SqlFileScanner.java 4705 2011-11-05 01:15:23Z unsaved $ */ package org.hsqldb.cmdline.sqltool; import java.io.PrintStream; import org.hsqldb.lib.FrameworkLogger; /** * This class is a scanner generated by * JFlex 1.4.1 * on 11/4/11 7:23 PM from the specification file * /home/blaine/hsqldb/src/org/hsqldb/cmdline/sqltool.flex */ public class SqlFileScanner implements TokenSource { /** This character denotes the end of file */ public static final int YYEOF = -1; /** initial size of the lookahead buffer */ private static final int ZZ_BUFFERSIZE = 16384; /** lexical states */ public static final int SPECIAL = 12; public static final int SQL_DOUBLE_QUOTED = 8; public static final int SQL_SINGLE_QUOTED = 6; public static final int GOBBLE = 10; public static final int RAW = 4; public static final int SQL = 2; public static final int YYINITIAL = 0; public static final int EDIT = 16; public static final int PL = 14; public static final int PROMPT_CHANGE_STATE = 20; public static final int MACRO = 18; /** * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l * at the beginning of a line * l is of the form l = 2*k, k a non negative integer */ private static final int ZZ_LEXSTATE[] = { 0, 0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11 }; /** * Translates characters to character classes */ private static final String ZZ_CMAP_PACKED = "\11\0\1\6\1\2\1\0\1\6\1\1\22\0\1\6\1\0\1\3"+ "\4\0\1\33\2\0\1\5\2\0\1\7\1\32\1\4\12\0\1\31"+ "\1\10\5\0\1\20\1\11\1\16\1\26\1\12\1\22\1\13\1\0"+ "\1\14\2\0\1\27\1\0\1\15\1\24\1\25\1\0\1\17\1\0"+ "\1\21\1\23\6\0\1\30\4\0\1\20\1\11\1\16\1\26\1\12"+ "\1\22\1\13\1\0\1\14\2\0\1\27\1\0\1\15\1\24\1\25"+ "\1\0\1\17\1\0\1\21\1\23\uff8a\0"; /** * Translates characters to character classes */ private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); /** * Translates DFA states to action switch labels. */ private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = "\14\0\1\1\2\2\1\3\1\4\1\5\1\6\1\7"+ "\1\10\3\1\1\11\1\12\1\13\2\14\1\15\2\13"+ "\1\16\1\17\2\20\1\13\1\0\2\21\1\0\1\22"+ "\1\23\1\22\1\24\2\25\1\22\2\26\2\22\2\27"+ "\2\30\2\31\2\32\7\0\2\33\10\0\2\34\2\35"+ "\1\0\2\36\1\37\3\0\1\40\1\41\3\0\2\42"+ "\23\0"; private static int [] zzUnpackAction() { int [] result = new int[114]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; } private static int zzUnpackAction(String packed, int offset, int [] result) { int i = 0; /* index in packed string */ int j = offset; /* index in unpacked array */ int l = packed.length(); while (i < l) { int count = packed.charAt(i++); int value = packed.charAt(i++); do result[j++] = value; while (--count > 0); } return j; } /** * Translates a state to a row index in the transition table */ private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\34\0\70\0\124\0\160\0\214\0\250\0\304"+ "\0\340\0\374\0\u0118\0\u0134\0\u0150\0\u016c\0\u0150\0\u0150"+ "\0\u0188\0\u0150\0\u01a4\0\u01c0\0\u0150\0\u01dc\0\u01f8\0\u0214"+ "\0\u0150\0\u0150\0\u0150\0\u0230\0\u0150\0\u0150\0\u024c\0\u0268"+ "\0\u0150\0\u0150\0\u0284\0\u0150\0\u02a0\0\u02bc\0\u02d8\0\u0150"+ "\0\u02f4\0\u0310\0\u032c\0\u0348\0\u0150\0\u0364\0\u0150\0\u0150"+ "\0\u0380\0\u0150\0\u039c\0\u03b8\0\u03d4\0\u0150\0\u03f0\0\u0150"+ "\0\u040c\0\u0150\0\u0428\0\u0150\0\u0444\0\u0460\0\u047c\0\u0498"+ "\0\u04b4\0\u04d0\0\u02a0\0\u04ec\0\u0150\0\u0508\0\u0524\0\u0540"+ "\0\u055c\0\u0578\0\u0594\0\u05b0\0\u05cc\0\u05e8\0\u0150\0\u0604"+ "\0\u0150\0\u0620\0\u063c\0\u0150\0\u0150\0\u0658\0\u0674\0\u0690"+ "\0\u0150\0\u0150\0\u06ac\0\u06c8\0\u06e4\0\u0700\0\u0150\0\u071c"+ "\0\u0738\0\u0754\0\u0770\0\u078c\0\u07a8\0\u07c4\0\u07e0\0\u07fc"+ "\0\u0818\0\u0834\0\u0850\0\u086c\0\u0888\0\u08a4\0\u08c0\0\u08dc"+ "\0\u08f8\0\u0914"; private static int [] zzUnpackRowMap() { int [] result = new int[114]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; } private static int zzUnpackRowMap(String packed, int offset, int [] result) { int i = 0; /* index in packed string */ int j = offset; /* index in unpacked array */ int l = packed.length(); while (i < l) { int high = packed.charAt(i++) << 16; result[j++] = high | packed.charAt(i++); } return j; } /** * The transition table of the DFA */ private static final int [] ZZ_TRANS = zzUnpackTrans(); private static final String ZZ_TRANS_PACKED_0 = "\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24"+ "\1\25\1\26\4\15\1\27\7\15\1\30\1\15\1\31"+ "\1\32\1\15\1\20\1\33\1\34\1\35\1\36\1\37"+ "\2\33\1\40\1\41\22\33\1\42\1\33\1\43\1\44"+ "\1\36\1\37\1\33\1\45\1\40\1\41\22\33\1\42"+ "\1\46\1\47\1\50\3\46\1\4\23\46\1\51\1\46"+ "\33\52\1\53\3\54\1\55\30\54\1\7\1\56\1\57"+ "\31\7\1\60\1\61\1\62\1\60\1\63\2\60\1\64"+ "\25\60\1\65\1\66\1\60\1\63\2\60\1\64\25\60"+ "\1\67\1\70\32\60\1\71\1\72\1\60\1\63\2\60"+ "\1\64\24\60\1\0\1\73\1\74\67\0\1\17\36\0"+ "\1\75\34\0\1\23\25\0\1\24\2\0\31\24\12\0"+ "\1\76\40\0\1\77\26\0\1\100\23\0\1\35\36\0"+ "\1\101\35\0\1\102\26\0\1\44\32\0\1\43\1\44"+ "\3\0\1\103\25\0\1\46\1\47\1\50\31\46\2\0"+ "\1\50\31\0\1\46\1\104\1\105\3\46\1\51\1\46"+ "\1\106\23\46\33\52\34\0\1\60\3\54\1\0\30\54"+ "\2\0\1\57\33\0\1\62\36\0\1\107\35\0\1\110"+ "\26\0\1\66\33\0\1\70\33\0\1\72\33\0\1\74"+ "\31\0\5\75\1\111\26\75\13\0\1\112\32\0\1\113"+ "\37\0\1\114\15\0\5\101\1\115\26\101\1\102\1\116"+ "\1\117\31\102\2\0\1\105\31\0\1\46\1\120\1\121"+ "\3\46\1\106\25\46\5\107\1\122\26\107\1\110\1\123"+ "\1\124\31\110\4\75\1\125\1\111\26\75\14\0\1\126"+ "\37\0\1\127\42\0\1\130\4\0\4\101\1\131\1\115"+ "\26\101\2\0\1\117\33\0\1\121\31\0\4\107\1\132"+ "\1\122\26\107\2\0\1\124\46\0\1\133\37\0\1\134"+ "\32\0\1\135\14\0\1\136\1\137\3\0\1\133\37\0"+ "\1\140\40\0\1\141\16\0\1\137\37\0\1\142\37\0"+ "\1\133\27\0\1\142\13\0\1\143\2\0\1\144\31\0"+ "\1\145\27\0\1\146\31\0\1\147\42\0\1\150\25\0"+ "\1\151\33\0\1\152\36\0\1\153\24\0\1\154\35\0"+ "\1\155\45\0\1\156\31\0\1\157\32\0\1\160\25\0"+ "\1\161\35\0\1\162\14\0\1\161\1\136\1\137\31\161"+ "\12\0\1\161\21\0"; private static int [] zzUnpackTrans() { int [] result = new int[2352]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; } private static int zzUnpackTrans(String packed, int offset, int [] result) { int i = 0; /* index in packed string */ int j = offset; /* index in unpacked array */ int l = packed.length(); while (i < l) { int count = packed.charAt(i++); int value = packed.charAt(i++); value--; do result[j++] = value; while (--count > 0); } return j; } /* error codes */ private static final int ZZ_UNKNOWN_ERROR = 0; private static final int ZZ_NO_MATCH = 1; private static final int ZZ_PUSHBACK_2BIG = 2; /* error messages for the codes above */ private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input", "Error: pushback value was too large" }; /** * ZZ_ATTRIBUTE[aState] contains the attributes of state aState */ private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = "\14\0\1\11\1\1\2\11\1\1\1\11\2\1\1\11"+ "\3\1\3\11\1\1\2\11\2\1\2\11\1\1\1\11"+ "\1\1\1\0\1\1\1\11\1\0\3\1\1\11\1\1"+ "\2\11\1\1\1\11\3\1\1\11\1\1\1\11\1\1"+ "\1\11\1\1\1\11\7\0\1\1\1\11\10\0\1\1"+ "\1\11\1\1\1\11\1\0\1\1\2\11\3\0\2\11"+ "\3\0\1\1\1\11\23\0"; private static int [] zzUnpackAttribute() { int [] result = new int[114]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; } private static int zzUnpackAttribute(String packed, int offset, int [] result) { int i = 0; /* index in packed string */ int j = offset; /* index in unpacked array */ int l = packed.length(); while (i < l) { int count = packed.charAt(i++); int value = packed.charAt(i++); do result[j++] = value; while (--count > 0); } return j; } /** the input device */ private java.io.Reader zzReader; /** the current state of the DFA */ private int zzState; /** the current lexical state */ private int zzLexicalState = YYINITIAL; /** this buffer contains the current text to be matched and is the source of the yytext() string */ private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; /** the textposition at the last accepting state */ private int zzMarkedPos; /** the textposition at the last state to be included in yytext */ private int zzPushbackPos; /** the current text position in the buffer */ private int zzCurrentPos; /** startRead marks the beginning of the yytext() string in the buffer */ private int zzStartRead; /** endRead marks the last character in the buffer, that has been read from input */ private int zzEndRead; /** number of newlines encountered up to the start of the matched text */ private int yyline; /** the number of characters up to the start of the matched text */ private int yychar; /** * the number of characters from the last newline up to the start of the * matched text */ private int yycolumn; /** * zzAtBOL == true <=> the scanner is currently at the beginning of a line */ private boolean zzAtBOL = true; /** zzAtEOF == true <=> the scanner is at the EOF */ private boolean zzAtEOF; /** denotes if the user-EOF-code has already been executed */ private boolean zzEOFDone; /* user code: */ static private FrameworkLogger logger = FrameworkLogger.getLog(SqlFileScanner.class); private StringBuffer commandBuffer = new StringBuffer(); private boolean interactive; private PrintStream psStd = System.out; private String magicPrefix; private int requestedState = YYINITIAL; private String rawLeadinPrompt; private boolean specialAppendState; // This last is needed for very unique check needed when appending to // a SQL command. Only applies to interactive mode. public void setRequestedState(int requestedState) { this.requestedState = requestedState; } /** * Really need a way to validate that this is called before using the * scanner, like Spring's init-method property. * For now, will just check explicitly before using. */ public void setRawLeadinPrompt(String rawLeadinPrompt) { this.rawLeadinPrompt = rawLeadinPrompt; } private void rawLeadinPrompt() { if (!interactive) { return; } assert rawLeadinPrompt != null: "Internal assertion failed. " + "Scanner's message Resource Bundle not initialized properly"; psStd.println(rawLeadinPrompt); } // Trims only the end private void trimBuffer() { int len = commandBuffer.length(); commandBuffer.setLength(len - ((len > 1 && commandBuffer.charAt(len - 2) == '\r') ? 2 : 1)); } public void setCommandBuffer(String s) { commandBuffer.setLength(0); commandBuffer.append(s); } public void setInteractive(boolean interactive) { this.interactive = interactive; } public void setMagicPrefix(String magicPrefix) { this.magicPrefix = magicPrefix; } public void setStdPrintStream(PrintStream psStd) { this.psStd = psStd; } //private String sqlPrompt = "+sql> "; private String sqlPrompt = null; public void setSqlPrompt(String sqlPrompt) { this.sqlPrompt = sqlPrompt; } public String getSqlPrompt() { return sqlPrompt; } //private String sqltoolPrompt = "sql> "; private String sqltoolPrompt = null; public void setSqltoolPrompt(String sqltoolPrompt) { this.sqltoolPrompt = sqltoolPrompt; } public String getSqltoolPrompt() { return sqltoolPrompt; } //private String rawPrompt = "raw> "; private String rawPrompt = null; public void setRawPrompt(String rawPrompt) { this.rawPrompt = rawPrompt; } public String getRawPrompt() { return rawPrompt; } private void debug(String id, String msg) { logger.finest(id + ": [" + msg + ']'); } public String strippedYytext() { String lineString = yytext(); int len = lineString.length(); len = len - ((len > 1 && lineString.charAt(len - 2) == '\r') ? 2 : 1); return (lineString.substring(0, len)); } // Trims only the end public void pushbackTrim() { String lineString = yytext(); int len = lineString.length(); yypushback((len > 1 && lineString.charAt(len - 2) == '\r') ? 2 : 1); } private void prompt(String s) { if (!interactive) return; psStd.print(s); } public void prompt() { if (sqltoolPrompt != null) prompt(sqltoolPrompt); specialAppendState = (interactive && magicPrefix != null); // This tells scanner that if SQL input "looks" empty, it isn't. if (interactive && magicPrefix != null) { psStd.print(magicPrefix); magicPrefix = null; } } /** * Creates a new scanner * There is also a java.io.InputStream version of this constructor. * * @param in the java.io.Reader to read input from. */ public SqlFileScanner(java.io.Reader in) { this.zzReader = in; } /** * Creates a new scanner. * There is also java.io.Reader version of this constructor. * * @param in the java.io.Inputstream to read input from. */ public SqlFileScanner(java.io.InputStream in) { this(new java.io.InputStreamReader(in)); } /** * Unpacks the compressed character translation table. * * @param packed the packed character translation table * @return the unpacked character translation table */ private static char [] zzUnpackCMap(String packed) { char [] map = new char[0x10000]; int i = 0; /* index in packed string */ int j = 0; /* index in unpacked array */ while (i < 132) { int count = packed.charAt(i++); char value = packed.charAt(i++); do map[j++] = value; while (--count > 0); } return map; } /** * Refills the input buffer. * * @return false, iff there was new input. * * @exception java.io.IOException if any I/O-Error occurs */ private boolean zzRefill() throws java.io.IOException { /* first: make room (if you can) */ if (zzStartRead > 0) { System.arraycopy(zzBuffer, zzStartRead, zzBuffer, 0, zzEndRead-zzStartRead); /* translate stored positions */ zzEndRead-= zzStartRead; zzCurrentPos-= zzStartRead; zzMarkedPos-= zzStartRead; zzPushbackPos-= zzStartRead; zzStartRead = 0; } /* is the buffer big enough? */ if (zzCurrentPos >= zzBuffer.length) { /* if not: blow it up */ char newBuffer[] = new char[zzCurrentPos*2]; System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); zzBuffer = newBuffer; } /* finally: fill the buffer with new input */ int numRead = zzReader.read(zzBuffer, zzEndRead, zzBuffer.length-zzEndRead); if (numRead < 0) { return true; } else { zzEndRead+= numRead; return false; } } /** * Closes the input stream. */ public final void yyclose() throws java.io.IOException { zzAtEOF = true; /* indicate end of file */ zzEndRead = zzStartRead; /* invalidate buffer */ if (zzReader != null) zzReader.close(); } /** * Resets the scanner to read from a new input stream. * Does not close the old reader. * * All internal variables are reset, the old input stream * cannot be reused (internal buffer is discarded and lost). * Lexical state is set to ZZ_INITIAL. * * @param reader the new input stream */ public final void yyreset(java.io.Reader reader) { zzReader = reader; zzAtBOL = true; zzAtEOF = false; zzEndRead = zzStartRead = 0; zzCurrentPos = zzMarkedPos = zzPushbackPos = 0; yyline = yychar = yycolumn = 0; zzLexicalState = YYINITIAL; } /** * Returns the current lexical state. */ public final int yystate() { return zzLexicalState; } /** * Enters a new lexical state * * @param newState the new lexical state */ public final void yybegin(int newState) { zzLexicalState = newState; } /** * Returns the text matched by the current regular expression. */ public final String yytext() { return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); } /** * Returns the character at position pos from the * matched text. * * It is equivalent to yytext().charAt(pos), but faster * * @param pos the position of the character to fetch. * A value from 0 to yylength()-1. * * @return the character at position pos */ public final char yycharat(int pos) { return zzBuffer[zzStartRead+pos]; } /** * Returns the length of the matched text region. */ public final int yylength() { return zzMarkedPos-zzStartRead; } /** * Reports an error that occured while scanning. * * In a wellformed scanner (no or only correct usage of * yypushback(int) and a match-all fallback rule) this method * will only be called with things that "Can't Possibly Happen". * If this method is called, something is seriously wrong * (e.g. a JFlex bug producing a faulty scanner etc.). * * Usual syntax/scanner level error handling should be done * in error fallback rules. * * @param errorCode the code of the errormessage to display */ private void zzScanError(int errorCode) { String message; try { message = ZZ_ERROR_MSG[errorCode]; } catch (ArrayIndexOutOfBoundsException e) { message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; } throw new Error(message); } /** * Pushes the specified amount of characters back into the input stream. * * They will be read again by then next call of the scanning method * * @param number the number of characters to be read again. * This number must not be greater than yylength()! */ public void yypushback(int number) { if ( number > yylength() ) zzScanError(ZZ_PUSHBACK_2BIG); zzMarkedPos -= number; } /** * Contains user EOF-code, which will be executed exactly once, * when the end of file is reached */ private void zzDoEOF() throws java.io.IOException { if (!zzEOFDone) { zzEOFDone = true; yyclose(); } } /** * Resumes scanning until the next regular expression is matched, * the end of input is encountered or an I/O-Error occurs. * * @return the next token * @exception java.io.IOException if any I/O-Error occurs */ public Token yylex() throws java.io.IOException { int zzInput; int zzAction; // cached fields: int zzCurrentPosL; int zzMarkedPosL; int zzEndReadL = zzEndRead; char [] zzBufferL = zzBuffer; char [] zzCMapL = ZZ_CMAP; int [] zzTransL = ZZ_TRANS; int [] zzRowMapL = ZZ_ROWMAP; int [] zzAttrL = ZZ_ATTRIBUTE; while (true) { zzMarkedPosL = zzMarkedPos; boolean zzR = false; for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL; zzCurrentPosL++) { switch (zzBufferL[zzCurrentPosL]) { case '\u000B': case '\u000C': case '\u0085': case '\u2028': case '\u2029': yyline++; yycolumn = 0; zzR = false; break; case '\r': yyline++; yycolumn = 0; zzR = true; break; case '\n': if (zzR) zzR = false; else { yyline++; yycolumn = 0; } break; default: zzR = false; yycolumn++; } } if (zzR) { // peek one character ahead if it is \n (if we have counted one line too much) boolean zzPeek; if (zzMarkedPosL < zzEndReadL) zzPeek = zzBufferL[zzMarkedPosL] == '\n'; else if (zzAtEOF) zzPeek = false; else { boolean eof = zzRefill(); zzEndReadL = zzEndRead; zzMarkedPosL = zzMarkedPos; zzBufferL = zzBuffer; if (eof) zzPeek = false; else zzPeek = zzBufferL[zzMarkedPosL] == '\n'; } if (zzPeek) yyline--; } if (zzMarkedPosL > zzStartRead) { switch (zzBufferL[zzMarkedPosL-1]) { case '\n': case '\u000B': case '\u000C': case '\u0085': case '\u2028': case '\u2029': zzAtBOL = true; break; case '\r': if (zzMarkedPosL < zzEndReadL) zzAtBOL = zzBufferL[zzMarkedPosL] != '\n'; else if (zzAtEOF) zzAtBOL = false; else { boolean eof = zzRefill(); zzMarkedPosL = zzMarkedPos; zzEndReadL = zzEndRead; zzBufferL = zzBuffer; if (eof) zzAtBOL = false; else zzAtBOL = zzBufferL[zzMarkedPosL] != '\n'; } break; default: zzAtBOL = false; } } zzAction = -1; zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; if (zzAtBOL) zzState = ZZ_LEXSTATE[zzLexicalState+1]; else zzState = ZZ_LEXSTATE[zzLexicalState]; zzForAction: { while (true) { if (zzCurrentPosL < zzEndReadL) zzInput = zzBufferL[zzCurrentPosL++]; else if (zzAtEOF) { zzInput = YYEOF; break zzForAction; } else { // store back cached positions zzCurrentPos = zzCurrentPosL; zzMarkedPos = zzMarkedPosL; boolean eof = zzRefill(); // get translated positions and possibly new buffer zzCurrentPosL = zzCurrentPos; zzMarkedPosL = zzMarkedPos; zzBufferL = zzBuffer; zzEndReadL = zzEndRead; if (eof) { zzInput = YYEOF; break zzForAction; } else { zzInput = zzBufferL[zzCurrentPosL++]; } } int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; if (zzNext == -1) break zzForAction; zzState = zzNext; int zzAttributes = zzAttrL[zzState]; if ( (zzAttributes & 1) == 1 ) { zzAction = zzState; zzMarkedPosL = zzCurrentPosL; if ( (zzAttributes & 8) == 8 ) break zzForAction; } } } // store back cached position zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { case 19: { commandBuffer.append(yytext()); debug("SQL '", yytext()); yybegin(SQL); } case 35: break; case 9: { commandBuffer.setLength(0); yybegin(SPECIAL); } case 36: break; case 30: { pushbackTrim(); /* embedded comment may disable opening quotes and closing ; */ debug("Spl. -- Comment", yytext()); } case 37: break; case 10: { commandBuffer.setLength(0); yybegin(EDIT); } case 38: break; case 21: { yybegin(YYINITIAL); debug("Gobbled", yytext()); prompt(); } case 39: break; case 31: { /* Ignore top-level traditional comments */ debug ("/**/ Comment", yytext()); } case 40: break; case 8: { return new Token(Token.SQL_TYPE, yyline); } case 41: break; case 2: { prompt(); } case 42: break; case 22: { if (commandBuffer.toString().trim().equals(".")) { commandBuffer.setLength(0); yybegin(RAW); rawLeadinPrompt(); if (rawPrompt != null) prompt(rawPrompt); } else { requestedState = YYINITIAL; yybegin(PROMPT_CHANGE_STATE); pushbackTrim(); return new Token(Token.SPECIAL_TYPE, commandBuffer, yyline); } } case 43: break; case 28: { specialAppendState = false; commandBuffer.append(yytext()); /* embedded comment may disable opening quotes and closing ; */ debug("SQL -- Comment", yytext()); } case 44: break; case 17: { if (commandBuffer.length() > 0) commandBuffer.append('\n'); commandBuffer.append(strippedYytext()); if (rawPrompt != null) prompt(rawPrompt); } case 45: break; case 26: { yybegin(requestedState); prompt(); } case 46: break; case 4: { commandBuffer.setLength(0); yybegin(MACRO); } case 47: break; case 18: { commandBuffer.append(yytext()); } case 48: break; case 11: { specialAppendState = false; commandBuffer.append(yytext()); } case 49: break; case 25: { requestedState = YYINITIAL; yybegin(PROMPT_CHANGE_STATE); pushbackTrim(); return new Token(Token.MACRO_TYPE, commandBuffer, yyline); } case 50: break; case 16: { if (interactive && !specialAppendState) { requestedState = YYINITIAL; yybegin(PROMPT_CHANGE_STATE); pushbackTrim(); trimBuffer(); return new Token(Token.BUFFER_TYPE, commandBuffer, yyline); } specialAppendState = false; commandBuffer.append(yytext()); } case 51: break; case 29: { yybegin(YYINITIAL); prompt(); return new Token(Token.RAWEXEC_TYPE, commandBuffer, yyline); } case 52: break; case 27: { yybegin(YYINITIAL); prompt(); return new Token(Token.RAW_TYPE, commandBuffer, yyline); } case 53: break; case 14: { specialAppendState = false; yybegin(YYINITIAL); return new Token(Token.SQL_TYPE, commandBuffer, yyline); } case 54: break; case 33: { /* embedded comment may disable opening closing \n */ debug("Spl. /**/ Comment", yytext()); } case 55: break; case 3: { yybegin(GOBBLE); return new Token(Token.SYNTAX_ERR_TYPE, yytext(), yyline); } case 56: break; case 20: { commandBuffer.append(yytext()); yybegin(SQL); debug("SQL \"", yytext()); } case 57: break; case 1: { setCommandBuffer(yytext()); yybegin(SQL); } case 58: break; case 23: { requestedState = YYINITIAL; yybegin(PROMPT_CHANGE_STATE); pushbackTrim(); return new Token(Token.PL_TYPE, commandBuffer, yyline); } case 59: break; case 6: { /* Ignore top-level white space */ debug("Whitespace", yytext()); } case 60: break; case 12: { specialAppendState = false; commandBuffer.append(yytext()); if (sqlPrompt != null) prompt(sqlPrompt); } case 61: break; case 24: { requestedState = YYINITIAL; yybegin(PROMPT_CHANGE_STATE); pushbackTrim(); return new Token(Token.EDIT_TYPE, commandBuffer, yyline); } case 62: break; case 7: { debug ("-- Comment", yytext()); } case 63: break; case 15: { specialAppendState = false; commandBuffer.append(yytext()); yybegin(SQL_SINGLE_QUOTED); } case 64: break; case 5: { commandBuffer.setLength(0); yybegin(PL); } case 65: break; case 34: { /* These are commands which may contain nested commands and/or which * require the closing semicolon to sent to the DB engine. * The BEGIN and DECLARE needed for PL/SQL probably do not need to * terminate the line, as we have it specified here, but I'd rather not be * too liberal with proprietary SQL like this, because it's easy to * envision other proprietary or non-proprietary commands beginning with * DECLARE or BEGIN. */ setCommandBuffer(strippedYytext()); yybegin(RAW); rawLeadinPrompt(); if (rawPrompt != null) prompt(rawPrompt); } case 66: break; case 32: { specialAppendState = false; commandBuffer.append(yytext()); /* embedded comment may disable opening quotes and closing ; */ debug("SQL /**/ Comment", yytext()); } case 67: break; case 13: { specialAppendState = false; commandBuffer.append(yytext()); yybegin(SQL_DOUBLE_QUOTED); } case 68: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; zzDoEOF(); switch (zzLexicalState) { case SPECIAL: { yybegin(YYINITIAL); return new Token(Token.UNTERM_TYPE, commandBuffer, yyline); } case 115: break; case SQL_DOUBLE_QUOTED: { yybegin(YYINITIAL); return new Token(Token.UNTERM_TYPE, commandBuffer, yyline); } case 116: break; case SQL_SINGLE_QUOTED: { yybegin(YYINITIAL); return new Token(Token.UNTERM_TYPE, commandBuffer, yyline); } case 117: break; case RAW: { yybegin(YYINITIAL); return new Token(Token.UNTERM_TYPE, commandBuffer, yyline); } case 118: break; case SQL: { yybegin(YYINITIAL); return new Token(Token.UNTERM_TYPE, commandBuffer, yyline); } case 119: break; case EDIT: { yybegin(YYINITIAL); return new Token(Token.UNTERM_TYPE, commandBuffer, yyline); } case 120: break; case PL: { yybegin(YYINITIAL); return new Token(Token.UNTERM_TYPE, commandBuffer, yyline); } case 121: break; case MACRO: { yybegin(YYINITIAL); return new Token(Token.UNTERM_TYPE, commandBuffer, yyline); } case 122: break; default: return null; } } else { zzScanError(ZZ_NO_MATCH); } } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/pl.help.text0000644000175000017500000000367212007547370024333 0ustar renerenePROCEDURAL LANGUAGE HELP This help describes variable usage (referencing) and the PL help commands. Please use the following commands for help about other aspects of PL. * ? This PL Help * ? assign Help about variable assignments: * ? assign * ? control Help about control structures like '*if' and loops: *? control * dump VARNAME path.txt Dump variable value to text file * list[values] [VARNAME1...] List PL variable(s) (defaults to all) * listsysprops [VARNAME1...] List Java System property(s) (defaults to all) * prepare VARNAME Use ? in next SQL statement to upload val. (Just "?", since "*{?}" is the auto var.). Resolve PL variable values, which have been set, like: *{VARNAME}. Resolve PL variable values, which MAY have been set, like: *{:VARNAME}. SqlTool reserves variables with names beginning with * for special purposes. These are called SqlTool system variables. Variables beginning with a letter and followed by zero or more letters, digits, or _, are 'user' vars. Resolve System Property values (which you may not set) like: ${property.name}. Resolve PL variables in logical expressions, like (*VARNAME == 1). [No curlies] When purposefully telling SqlTool a variable's "name", like to make an assignment, write just the name like: VARNAME = 1. [Bare names] Use PL vars in math expressions, like ((NEWVAR = VARNAME * 3)). [Bare names] Auto. variable ? is set to the very latest SQL datum fetched (or update count). Query: The value of the last field of the last row returned. (Except will be set to the *NULL_REP_TOKEN value instead of to real null if the value retrieved is a SQL null). other: Return status of the command (for updates this will be the number of rows updated). null/unset: If the last SQL command failed, ? will be unset (aka null). hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/rejectreport.top.text0000644000175000017500000000215412007547370026274 0ustar renerene

              Input DSV file: %{1}

              Reject DSV file: %{2}

              %{3:+

              The corresponding records in '%3' are at line numbers of (reject # + 1), since the header record occupies the first line.

              } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/d.options_de.text0000644000175000017500000000063012007547370025345 0ustar renerene\dX [Parameter...] wobei X eine der folgenden Möglichkeiten ist: t: Auflistung von Tabellen v: Auflistung von Views s: Auflistung von Sequenzen i: Auflistung von Indizes S: Auflistung von Systemtabellen a: Auflistung von Aliasse n: Auflistung von Schemanamen u: Auflistung von Benutzern r: Auflistung von Rollen *: Auflistung von tabellenähnlichen Objekten hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/FileRecordReader.java0000644000175000017500000001453612007547370026070 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.cmdline.sqltool; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.FileInputStream; import java.util.regex.Pattern; import java.util.regex.Matcher; /** * This class does not impement or extend java.io classes/interfaces, and is * not a Reader in the sense of java.io.Reader. * It is a 'reader' in the sense that it provides a method that reads and * return records from a text file. * * The unique use case here is that records are delimited with a regular * expression pattern yet the file contents are read incrementally to minimize * RAM usage. */ public class FileRecordReader { /* * We purposefully use a non-buffered Reader. We are doing buffering * outselves. * We have to read linearly from the front, so combined with previous * requirement, that narrows us to FileReader or FileInputStream. * Since we need to get at characters, FileReader is the most direct * tool for us to use. */ // Can lower dramatically, all the way to 1, to test buffering. public static final int INITIAL_CHARBUFFER_SIZE = 10240; private File file; private InputStreamReader reader; private Pattern recordPattern; private long postRead; private StringBuilder stringBuffer = new StringBuilder(); private char[] charBuffer = new char[INITIAL_CHARBUFFER_SIZE]; /** * @throws java.util.regex.PatternSyntaxException * @throws UnsupportedEncodingException */ public FileRecordReader( String filePath, String recordDelimiterRegex, String encoding) throws FileNotFoundException, UnsupportedEncodingException { file = new File(filePath); reader = new InputStreamReader(new FileInputStream(file), encoding); recordPattern = Pattern.compile( "(.*?)(" + recordDelimiterRegex + ").*", Pattern.DOTALL); } /** * Free up resources and close all potentially open I/O streams. */ public void close() throws IOException { if (reader == null) throw new IllegalStateException("File already closed: " + file); reader.close(); reader = null; } public String getName() { return file.getName(); } public String getPath() { return file.getPath(); } public String getAbsolutePath() { return file.getAbsolutePath(); } public boolean isOpen() { return reader != null; } /** * To be replaced by proper unit test class * * @throws IOException */ public static void main(String[] sa) throws IOException { if (sa.length != 2) throw new IllegalArgumentException( "SYNTAX: java " + FileRecordReader.class.getName() + " file.txt RECORD_DELIM"); FileRecordReader frr = new FileRecordReader(sa[0], sa[1], "UTF-8"); int i = 0; String r; while ((r = frr.nextRecord()) != null) System.out.println("Rec #" + (++i) + ": [" + r + ']'); } /** * @return null if no more records in input file * @throws IOException */ public String nextRecord() throws IOException { Matcher matcher; boolean reloaded = false; while (true) { matcher = recordPattern.matcher(stringBuffer); if (matcher.matches()) { String rec = matcher.group(1); stringBuffer.delete(0, matcher.end(2)); //System.err.println(" REM=(" + stringBuffer + ')'); return rec; } if (reader == null) { if (stringBuffer.length() < 1) return null; String rec = stringBuffer.toString(); stringBuffer.setLength(0); //System.err.println(" Rem=()"); return rec; } reload(reloaded); //System.err.println(" Reloaded to {" + stringBuffer + '}'); reloaded = true; } } /** * @param increaseBuffer. If true, grab 2 x as many bytes as previous read. * @throws IOException */ private void reload(boolean increaseBuffer) throws IOException { if (reader == null) throw new IllegalStateException( "Attempt to reload after source file has been closed"); if (increaseBuffer) charBuffer = new char[charBuffer.length * 2]; //if (increaseBuffer) System.err.println("-> " + charBuffer.length); int retVal = reader.read(charBuffer); // Indicate OED for 0, since we could get into loop by returning 0: if (retVal > 0) stringBuffer.append(charBuffer, 0, retVal); else close(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/rejectreport.row.text0000644000175000017500000000045512007547370026303 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/d.options.text0000644000175000017500000000201412007547370024673 0ustar renerene\dX [parameter...] where X is one of the following. a: list Aliases c: list Catalogs i: list Indexes (for some databases, must specify literal target table) n: list schema Names r: list Roles s: list Sequences S: list System tables t: list Tables u: list Users v: list Views *: list table-like objects In most cases, 'parameter...' is a case-specific SUBSTRING to narrow matches. The following details apply to those commands which list schema objects. By default, objects in all schemas will be listed (excepting some exclusions for system schemas or system objects), with filtering if specified. If a filter param is supplied and begins with a dot, then the search is narrowed to the session's current schema. If the filter param contains a dot in any other position, then the characters before the dot specify a literal and case-sensitive schema name. Some or all of these dot filters will not work if your database doesn't support schemas according to the SQL specifications. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/pl.control.text0000644000175000017500000000564612007547370025066 0ustar renerenePROCEDURAL LANGUAGE CONTROL/BRANCHING COMMANDS * ? Main PL Help * break [file|for|foreach|forrows|while] Exits a PL block or file early * return Exits a file early (equivalent to no-param 'break') * continue [foreach|while] Exits a PL block iteration early * if (logical expr) Any 1-line command Called 'inline' or shortcut if. * if (logical expr) Execute following PL block only if expr true * else Execute block if paired 'if' statement false * end if Obviously... * for ((VARNAME OP math expr)) (logical expr) ((VARNAME OP math expr)) Traditional mathematical for loop with initial expr., test condition, iter. expr. Example: * for ((i = 0)) (*i < 10) ((i += 1)) * for (logical expr) ((VARNAME OP math expr)) Same as previous, but with no initial expr. * end for * foreach VARNAME ([val1...]) Repeat the following PL block with the variable set to each value in turn. * end foreach * forrows [VARNAME1...] An SQL query statement must be the very next Sql query that may span command, then a PL block that will be executed multiple lines; for each output row from the query. Specified vars, if any, will be assigned to the corresponding column output for each row, and env var. *ROW will be set just like ? except if multiple columns, they will all be * end forrows concatenated into *ROW. * while (logical expr) Repeat following PL block while expr true * end while Several of the PL control commands specify one or more PL variable names, logical expressions, or mathematical expressions. You must write the PL variables as follows for these situations: BARE_NAME To just specify a variable name, like where 'VARNAME' is written above, just write the bare variable name. Variable references inside of ((math expressions)) are also written as bare names. *STARRED_NAME In logical expressions, you should prefix variable names with *, to indicate that you want to test the value of variable "X", not the string "X". *{STARRED_CURLYBRACED_NAME} Resolve variable to its value. Shown here only for completeness. It is an error to do this if variable has not been set. Example: \p *{VARNAME} *{:STARRED_CURLYBRACED_NAME} Same as previous. Colon causes unset variables to resolve to the empty string instead of failing. Example: \p *{:VARNAME} hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/pl.help_de.text0000644000175000017500000000601612007547370024776 0ustar renerenePROZEDUALE SPRACHE (PROCEDURAL LANGUAGE) BEFEHLE * ? PL Hilfe * VARNAME = [neur Wert] Weist der Variable einen Wert zu. * - VARNAME Löscht die Variable. * VARNAME ~ Weist der Variable als Wert den Inhalt der direkt folgenden SQL-Anweiung oder eines Zählers zu (Bitte beachten Sie auch die Hinweise am Ende der Auflistung). * VARNAME _ Dasselbe wie * VARNAME _, nur das die Abfrage keine Ausgabe erzeugt (d.h, es werden keine Zeilen angezeigt). * list[values] [VARNAME1...] Listet PL-Variable(n) auf (standardmäßig alle). * listsysprops [VARNAME1...] Listet die System-Properties von Java auf (standardmäßig alle). * load VARNAME datei.txt Lädt Variable aus einer Textatei. * dump VARNAME datei.txt Schreibt die Variable in eine Textdatei. * prepare VARNAME Verwenden Sie ? in der nächsten SQL-Anweisung um die Variable an dieser Stelle einzusetzten (bei "*{?}" wird die Standardvariable verwendet). * foreach VARNAME ([Wert1...]) Wiederholt den folgenden PL-Block pro Wert mit der Variable, wobei diese im PL-Block jeweils durch den Wert ersetzt wird. * if (logical expr) Führt den folgenden PL-Block nur aus wenn der Ausdruck in Klammern wahr ist. * while (logical expr) Wiederholt den folgenden PL-Block solange wie der Ausdruck in den Klammern wahr ist. * end foreach|if|while Beendent einen PL-Block. * break [foreach|if|while|file]Unterbricht einen PL-Block oder Datei vorzeitig. * return Unterbricht eine Datei vorzeitig. * continue [foreach|while] Bricht einen Schleifendurch in einem PL-Block ab und fährt mit dem nächsten Durchlauf fort. Verwenden Sie PL-Variablen (die Sie gesetzt haben) wie folgt: *{VARNAME}. Verwenden Sie Systemeigenschaften (auch wenn Sie sie vlt. nicht gesetzt haben) so: ${property.name}. In logischen Ausdrücken verwenden Sie PL-Variablen so: (VARNAME == 1). Die automatische Variable ? bezieht sich immer auf die jüngste SQL-Anweisung (oder Updatezähler). Abfrage: Der Wert des ersten Feldes aus der ersten Reihe welche zurück gegeben wurde. sonstige: Rückgabewert eines Befehls (bei Updates ist dies die Zahl der aktualisierten Reihen). '* VARNAME ~' or '* VARNAME _' setzt den jeweiligen Wert der Variable exakt. genau wie ?. (~ zeigt den Wert, _ erzeugt keine Ausgabe). hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/macro.help.text0000644000175000017500000000375112007547370025017 0ustar renereneMacros may only be entered as the first thing in a command, because macros are stored 'commands', not stored text (like PL variables). SqlTool functions are macros that accept positional parameters and the function names always end with () (like "myFunction()"). Unless noted, everything said here about macros also applies to functions. /? Display this help /= Display all macros /= name body... Define a macro with body of the specified Special, PL, or SQL command (do not type the SQL-terminating ";"). /: name [appendage] Define a macro wth body equal to the current buffer contents. If you want your 'appendage' to begin with a space, then you must type two spaces after the name here. This can be used to define a macro with content of a multi-lined SQL statement, or even of chunked SQL statements. /name [appendage] Expand (non-function) macro to buffer /name [appendage]; Execute (non-function) macro after variables in body are dereferenced /name(param1,...) [appendage] Expand function to buffer /name(param1,...) [appendage]; Execute function after dereferencing Macros may contain PL variable references. The references are not expanded until the macro executes. Use the : syntax, like *{:name} to prevent the execution from failing if that variable is not set (this will cause the unset variable to expand to the empty string). Define functions exactly as you define macros, except with names like "this()", and the function body may contain positional PL variable references like *{1}, *{2}, *{:3}, etc. Use the colon (like "*{:3}") for optional parameters (see previous paragraph). Use functions exactly like macros, except insert comma-separated parameters (if any), between the parentheses of the function name, like "fn1();" or "fn2(first param value, second param value)". hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/pl.assign.text0000644000175000017500000000474212007547370024666 0ustar renerenePROCEDURAL LANGUAGE ASSIGNMENT COMMANDS * ? Main PL Help * VARNAME = [new value] Set variable value. Leading space is trimmed from new value. * - VARNAME Unset variable * VARNAME ~ Set variable value to the value of the very next SQL value or count fetched (see details at the bottom of this listing). * VARNAME _ Same as * VARNAME _, except the query is done silently (i.e, no rows to screen). * VARNAME :[appendage] Set variable value to the previous edit buffer contents. * load VARNAME path.txt Load variable value from text file * ((VARNAME OP math expr)) Perform integer math and assign to the var. Internal ops: variables, +, -, *, /, %, ^, () Assignment OPs: =, ++, +=, -=, *=, /=, %= No string values, system properties, or SqlTool system variables allowed. PL user variables written as bare names. * for, * foreach, * forrows These branching commands assign values. Run '* ? control" for more details about these. SqlTool reserves variables with names beginning with * for special purposes. These are called SqlTool system variables. Variables beginning with a letter and followed by zero or more letters, digits, or _, are 'user' vars. System Property values may not be set. Auto. variable ? is set to the very latest SQL datum fetched (or update count). Query: The value of the last field of the last row returned. (Except will be set to the *NULL_REP_TOKEN value instead of to real null if the value retrieved is a SQL null). other: Return status of the command (for updates this will be the number of rows updated). null/unset: If the last SQL command failed, ? will be unset (aka null). Inside of * forrows blocks only, *ROW will be set just like ? except if multiple columns, they will all be concatenated into *ROW. '* VARNAME ~' or '* VARNAME _' sets the specified variable's value just like ?, but to the very next returned value; and VARNAME will be assigned null if the fetched value is SQL null. ~ and _ assignments are equivalent except that _ suppresses display output. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/top-boilerplate.html0000644000175000017500000000771512007547370026055 0ustar renerene*{:REPORT_TITLE}

              *{:REPORT_TITLE}

              hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/SqlFile.banner.text0000644000175000017500000000220612007547370025564 0ustar renereneSqlFile processor v. %{1}. Distribution is permitted under the terms of the HSQLDB license. (c) 2004-2011 Blaine Simpson and the HSQL Development Group. \q to Quit. \? lists Special Commands. :? lists Edit-Buffer/History commands. *? lists PL commands. /? displays help on how to set and use macros (incl. functions). SPECIAL Commands begin with '\' and execute when you hit ENTER. EDIT-BUFFER / HISTORY Commands begin with ':' and execute when you hit ENTER. PROCEDURAL LANGUAGE commands begin with '*' and end when you hit ENTER. MACRO executions and definitions begin with '/' and end when you hit ENTER. All other lines comprise SQL Statements (or comments). SQL Statements are terminated by either unquoted ';' (which executes the statement), or a blank line (which moves the statement into the edit buffer without executing). After turning on variable expansion with command "*" (or any other PL command), PL variables may be used in most commands like so: *{PLVARNAME}. Be aware when using regular expressions on commands, that the regex.s operate only on the command text after the * or \ prefix, if any. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/raw.leadin_de.text0000644000175000017500000000047412007547370025462 0ustar renereneGeben Sie reines SQL (ROW-SQL) ein! Keine '\', ':', '*' Befehle. Schließen Sie mit einer Leerzeile ab welche nur ".;" enthält um alles an die Datenbank zu senden; oder nur "." um alles in den Editiert-Puffer für die Bearbeitung oder Speicherung zu laden. ----------------------------------------------------------- hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/TokenList.java0000644000175000017500000000427412007547370024641 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.cmdline.sqltool; import java.util.ArrayList; /* @(#)$Id: TokenList.java 4141 2011-03-14 01:35:49Z fredt $ */ /** * A list of SqlFile Tokens */ public class TokenList extends ArrayList implements TokenSource { static final long serialVersionUID = 5441418591320947274L; public TokenList() { super(); } public TokenList(TokenList inList) { super(inList); } public Token yylex() { if (size() < 1) return null; //return remove(0); // Java5 return remove(0); } public TokenList dup() { return new TokenList(this); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/special.help_de.text0000644000175000017500000000525212007547370026004 0ustar renereneSonderbefehle. Bei Filterzeichenketten wird die Groß/Kleinschreibung beachtet. Verwenden Sie "SCHEMANAME.", um auf ein Schema zu begrenzen. \? Sonderbefehle Hilfe \. Geben Sie reines SQL ein (Raw-SQL). Schließen Sie mit einer Leerzeile ab, die nur einen "." enthält \= Commitet JDBC Transaktionen. \! BEFEHL [ARGE] Führt externe Programme aus (stdin wird nicht unterstützt). \a [true|false] Commitet automatisch JDBC DML Befehle. \b Speichert die nächste Ergebnismenge im Binärpuffer (keine Ausgabe). \bd pfad/datei.bin Speichert den Binärpuffer in Datei. \bl pfad/datei.bin Lädt Datei in den Binärpuffer \bp Verwenden Sie ? in der nächsten SQL-Anweisung um den Binärpuffer hochzuladen. \c [true|false] Weiter nach Fehler oder Abbruch nach Fehler. \d OBJEKTNAME [regx] Beschreibt Spalten von Tabellen oder Views \d{tvsiSanur*?} [Zeichenkette] Listet Objekte der spezifizierten Art: (Tbln/Views/Seqs/Indexe/SysTbln/Aliase/SchemaNamen/Benutzer/Rollenn/tbl-ähnlich) \h [true|false] Schaltet in den HTML-Ausgabe-Modus. \i pfad/datei.sql Befehle aus externer Datei ausführen/einbinden \j [urlid] Anzeige JDBC-Verbindung Details, oder zu 'urlid' zu verbinden \j acct pwd jdbc:url Herstellung der Verbindung zum JDBC-Datenquelle auf URL \l LEVEL Log-Meld. Log-Meldung. (verfügbare Levels mit '\l?' anzeigen lassen.) \m pfad/datei.dsv [*] Importiert Datensätze aus einer DSV-Textdatei in eine Tabelle. (weitere Optionen '\m?'). \mq pfad/datei.csv Ditto, aber mit traditionellen CSV doppelt zitiert. \o [datei/pfad.html] Leitet (oder stoppt dies) die Ausgabe der Abfrage in die angegebene Datei um. \p [Eine Nachricht] Gibt Nachricht auf stdout aus \q [Abbruchmeldung] Beendet das Programm (oder beenden Sie es mit STRG-Z oder STRG-D). \t [true|false] Gibt die Ausführungszeiten für alle SQL-Befehle aus. \v [TRAN_ISO_LEVEL] Zeigt/Setzt das Level der Verbindungs-Transaktion-Isolation. (connection transaction isolation) \x {TABELLE|SELECT...} Exportiert Tabellen oder Abfragen in eine DSV-Textdatei (weitere Optionen: '\x?'). \xq {TABELLE|SEL...} Ditto, aber mit traditionellen CSV doppelt zitiert. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/SqlFile.banner_de.text0000644000175000017500000000243712007547370026242 0ustar renereneSqlFile processor v. %{1}. Die Weitergabe ist zulässig unter den Bedingungen der HSQLDB Lizenz. (c) 2004-2011 Blaine Simpson und die HSQL Development Group. \q beenden. \? Sonderbefehle auflisten. :? Edit-Puffer/Verlaufsbefehle auflisten. *? PL Befehle auflisten. /? Zeigt die Hilfe und wie Makros (Befehlsaliase) definiert und gelöscht werden. SONDERBEFEHLE fangen mit \ ab und werden mit ENTER ausgeführt. EDIT-PUFFER / VERLAUFSBEFEHLE fangen mit einem ':' an und werden mit ENTER ausgeführt. PROCEDURAL LANGUAGE (PL) Befehle fangen mit einem '*' an und werden mit ENTER beendet. MAKRO Ausführungen und Definitionen beginnen mit einem '/' und werden mit ENTER beendet. Alle anderen Zeilen enthalten SQL-Anweisungen (oder Kommentare). SQL-Anweisungen werden entweder durch ein ';' beendet (und dann ausgeführt) oder mit einer Leerzeile (dadurch wird die Anweisung in den Edit-Puffer verschoben und nicht ausgeführt). Nach einer Variablenexpansion mit dem Befehl '*' (oder jedem anderen PL-Befehl), können PL-Variablen in den meisten Befehlen wie folgt verwendet werden: *{PLVARNAME} Wenn Sie Reguläre Ausdrücke in Kommandos verwenden, beachten Sie bitte, daß diese im Befehlstext nur nach dem '*' oder '\' Präfix (falls vorhanden) wirken, hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/rejectreport.top_de.text0000644000175000017500000000425412007547370026747 0ustar renerene SqlTool DSV Reject-Report

              Import durchgeführt am %{1} mit SqlTool.

              Import-DSV-Datei: %{2}

              Reject-DSV-Datei: %{3}

              %{4:+

              Die passenden Datensätze in '%4' sind bei Zeilennummer von (Reject # +), seit der führende Datensatz die erste Zeile eingenommen hat.

              }
              rej. # input
              line #
              bad column
              (if known)
              reason
              %{2} %{3} %{4}
              %{5}
              hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/buffer.help.text0000644000175000017500000000427412007547370025170 0ustar renereneEDIT BUFFER AND HISTORY COMMANDS. Not available for non-interactive use. :? Edit buffer / history Help :b List current contents of edit Buffer :h Show History of previous commands (plus buffer contents) :X (integer X) Load command #X from Command history into the Edit buffer :-Y (integer -Y) Same an editY means Y commands back :/regex/ Same as :-Y, except it means latest command in history matching the given regular expression The remaining edit/execute commands all operate on the Edit Buffer by default, but will also operate on any command from history if you interpose a command identifier right after the colon, like ":/blue/;" to re-execute the last command you ran which contains "blue", or ":w -3 /tmp/output.txt" to append the third command 'back' to a file. :; Execute edit buffer content (special, PL, or SQL command) :a[text] Enter append mode with a copy of the buffer contents :aAPPENDAGE; Append to buffer contents then executes resulting command :s/from regex/to/ Substitute match of "from regex" with "to" :s/from/to/[igm;] One or multiple Substitutions with specified options from: Standard regexp. See 'perlre' man page or Java API spec for java.util.regex.Pattern. to: If empty, from's will be deleted (e.g. ":s/x//"). [igm;] Options work exactly as in Perl or java.util.regex, except ';' means to execute after substitution, 'g' means Global (multiple) substitutions, and option 's' is always on. /: Can actually be any character which occurs in neither "to" string nor "from" string. SUBSTITUTION MODE SWITCHES: i: case Insensitive g: Global (substitute ALL occurrences of "from" string) m: ^ and $ match line breaks (like Perl m option) ;: execute immediately after substitution :w file/path.sql Append current buffer contents to the specified file hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/bottom-boilerplate.html0000644000175000017500000000027512007547370026551 0ustar renerene
              hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool/raw.leadin.text0000644000175000017500000000032612007547370025006 0ustar renereneEnter RAW SQL. No \, :, * commands. End with a line containing only ".;" to send to database, or only "." to store to edit buffer for editing or saving. ----------------------------------------------------------- hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool.flex0000644000175000017500000002743512007547370022746 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* @(#)$Id: sqltool.flex 4705 2011-11-05 01:15:23Z unsaved $ */ package org.hsqldb.cmdline.sqltool; import java.io.PrintStream; import org.hsqldb.lib.FrameworkLogger; %% // Defaults to Yylex %class SqlFileScanner %implements TokenSource %{ static private FrameworkLogger logger = FrameworkLogger.getLog(SqlFileScanner.class); private StringBuffer commandBuffer = new StringBuffer(); private boolean interactive; private PrintStream psStd = System.out; private String magicPrefix; private int requestedState = YYINITIAL; private String rawLeadinPrompt; private boolean specialAppendState; // This last is needed for very unique check needed when appending to // a SQL command. Only applies to interactive mode. public void setRequestedState(int requestedState) { this.requestedState = requestedState; } /** * Really need a way to validate that this is called before using the * scanner, like Spring's init-method property. * For now, will just check explicitly before using. */ public void setRawLeadinPrompt(String rawLeadinPrompt) { this.rawLeadinPrompt = rawLeadinPrompt; } private void rawLeadinPrompt() { if (!interactive) { return; } assert rawLeadinPrompt != null: "Internal assertion failed. " + "Scanner's message Resource Bundle not initialized properly"; psStd.println(rawLeadinPrompt); } // Trims only the end private void trimBuffer() { int len = commandBuffer.length(); commandBuffer.setLength(len - ((len > 1 && commandBuffer.charAt(len - 2) == '\r') ? 2 : 1)); } public void setCommandBuffer(String s) { commandBuffer.setLength(0); commandBuffer.append(s); } public void setInteractive(boolean interactive) { this.interactive = interactive; } public void setMagicPrefix(String magicPrefix) { this.magicPrefix = magicPrefix; } public void setStdPrintStream(PrintStream psStd) { this.psStd = psStd; } //private String sqlPrompt = "+sql> "; private String sqlPrompt = null; public void setSqlPrompt(String sqlPrompt) { this.sqlPrompt = sqlPrompt; } public String getSqlPrompt() { return sqlPrompt; } //private String sqltoolPrompt = "sql> "; private String sqltoolPrompt = null; public void setSqltoolPrompt(String sqltoolPrompt) { this.sqltoolPrompt = sqltoolPrompt; } public String getSqltoolPrompt() { return sqltoolPrompt; } //private String rawPrompt = "raw> "; private String rawPrompt = null; public void setRawPrompt(String rawPrompt) { this.rawPrompt = rawPrompt; } public String getRawPrompt() { return rawPrompt; } private void debug(String id, String msg) { logger.finest(id + ": [" + msg + ']'); } public String strippedYytext() { String lineString = yytext(); int len = lineString.length(); len = len - ((len > 1 && lineString.charAt(len - 2) == '\r') ? 2 : 1); return (lineString.substring(0, len)); } // Trims only the end public void pushbackTrim() { String lineString = yytext(); int len = lineString.length(); yypushback((len > 1 && lineString.charAt(len - 2) == '\r') ? 2 : 1); } private void prompt(String s) { if (!interactive) return; psStd.print(s); } public void prompt() { if (sqltoolPrompt != null) prompt(sqltoolPrompt); specialAppendState = (interactive && magicPrefix != null); // This tells scanner that if SQL input "looks" empty, it isn't. if (interactive && magicPrefix != null) { psStd.print(magicPrefix); magicPrefix = null; } } %} %public //%int %line %column %eofclose %unicode %type Token %xstates SQL RAW SQL_SINGLE_QUOTED SQL_DOUBLE_QUOTED GOBBLE SPECIAL PL EDIT %xstates MACRO PROMPT_CHANGE_STATE /* Single-quotes Escaped with '', * In Oracle, at least, no inner double-quotes (i.e. no escaping) * SQL-Embedded comments are passed to SQL engine as part of SQL command */ /* Expressions could be simplified by using "." instead of "[^\r\n]", but * the JFlex docs say that "." means "[^n]", therefore this would mess up * DOS-style line endings. */ LINETERM_MAC = \r|\n|\r\n SQL_STARTER = [^\n\r\t\f \\*:\"\'] TRADITIONAL_COMMENT = "/*" ~"*/" /* CURLY_COMMENT = "{" ~"}" Purposefully not supporting */ %% {LINETERM_MAC} { yybegin(requestedState); prompt(); } ~{LINETERM_MAC} { yybegin(YYINITIAL); debug("Gobbled", yytext()); prompt(); } <> { yybegin(YYINITIAL); return new Token(Token.UNTERM_TYPE, commandBuffer, yyline); } {TRADITIONAL_COMMENT} { /* Ignore top-level traditional comments */ debug ("/**/ Comment", yytext()); } [ \f\t]+ { /* Ignore top-level white space */ debug("Whitespace", yytext()); } {LINETERM_MAC} { prompt(); } [--][^\n\r]* { debug ("-- Comment", yytext()); } ; { return new Token(Token.SQL_TYPE, yyline); } [Bb][Ee][Gg][Ii][Nn] [\f\t ]* {LINETERM_MAC} | [Cc][Rr][Ee][Aa][Tt][Ee] [\f\t ]+ [Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn] [^\n\r]* {LINETERM_MAC} | [Cc][Rr][Ee][Aa][Tt][Ee] [\f\t ]+ [Pp][Rr][Oo][Cc][Ee][Dd][Uu][Rr][Ee] [^\n\r]* {LINETERM_MAC} | [Dd][Ee][Cc][Ll][Aa][Rr][Ee] [\f\t ]* {LINETERM_MAC} { /* These are commands which may contain nested commands and/or which * require the closing semicolon to sent to the DB engine. * The BEGIN and DECLARE needed for PL/SQL probably do not need to * terminate the line, as we have it specified here, but I'd rather not be * too liberal with proprietary SQL like this, because it's easy to * envision other proprietary or non-proprietary commands beginning with * DECLARE or BEGIN. */ setCommandBuffer(strippedYytext()); yybegin(RAW); rawLeadinPrompt(); if (rawPrompt != null) prompt(rawPrompt); } \* { commandBuffer.setLength(0); yybegin(PL); } \\ { commandBuffer.setLength(0); yybegin(SPECIAL); } \: { commandBuffer.setLength(0); yybegin(EDIT); } \/ { commandBuffer.setLength(0); yybegin(MACRO); } { [\f\t ]*\.[\f\t ]* ; [\f\t ]* {LINETERM_MAC} { yybegin(YYINITIAL); prompt(); return new Token(Token.RAWEXEC_TYPE, commandBuffer, yyline); } [\f\t ]*\.[\f\t ]* {LINETERM_MAC} { yybegin(YYINITIAL); prompt(); return new Token(Token.RAW_TYPE, commandBuffer, yyline); } ~{LINETERM_MAC} { if (commandBuffer.length() > 0) commandBuffer.append('\n'); commandBuffer.append(strippedYytext()); if (rawPrompt != null) prompt(rawPrompt); } } {LINETERM_MAC} { if (commandBuffer.toString().trim().equals(".")) { commandBuffer.setLength(0); yybegin(RAW); rawLeadinPrompt(); if (rawPrompt != null) prompt(rawPrompt); } else { requestedState = YYINITIAL; yybegin(PROMPT_CHANGE_STATE); pushbackTrim(); return new Token(Token.SPECIAL_TYPE, commandBuffer, yyline); } } {LINETERM_MAC} { requestedState = YYINITIAL; yybegin(PROMPT_CHANGE_STATE); pushbackTrim(); return new Token(Token.PL_TYPE, commandBuffer, yyline); } {LINETERM_MAC} { requestedState = YYINITIAL; yybegin(PROMPT_CHANGE_STATE); pushbackTrim(); return new Token(Token.MACRO_TYPE, commandBuffer, yyline); } {LINETERM_MAC} { requestedState = YYINITIAL; yybegin(PROMPT_CHANGE_STATE); pushbackTrim(); return new Token(Token.EDIT_TYPE, commandBuffer, yyline); } { // Purposefully not allowing comments within :Edit commands {TRADITIONAL_COMMENT} { /* embedded comment may disable opening closing \n */ debug("Spl. /**/ Comment", yytext()); } "--" ~{LINETERM_MAC} { pushbackTrim(); /* embedded comment may disable opening quotes and closing ; */ debug("Spl. -- Comment", yytext()); } } { [^\n\r] { commandBuffer.append(yytext()); } } {SQL_STARTER} { setCommandBuffer(yytext()); yybegin(SQL); } { ^[\f\t ]* {LINETERM_MAC} { if (interactive && !specialAppendState) { requestedState = YYINITIAL; yybegin(PROMPT_CHANGE_STATE); pushbackTrim(); trimBuffer(); return new Token(Token.BUFFER_TYPE, commandBuffer, yyline); } specialAppendState = false; commandBuffer.append(yytext()); } {TRADITIONAL_COMMENT} { specialAppendState = false; commandBuffer.append(yytext()); /* embedded comment may disable opening quotes and closing ; */ debug("SQL /**/ Comment", yytext()); } "--" ~{LINETERM_MAC} { specialAppendState = false; commandBuffer.append(yytext()); /* embedded comment may disable opening quotes and closing ; */ debug("SQL -- Comment", yytext()); } {LINETERM_MAC} { specialAppendState = false; commandBuffer.append(yytext()); if (sqlPrompt != null) prompt(sqlPrompt); } [^\"\';] { specialAppendState = false; commandBuffer.append(yytext()); } \' { specialAppendState = false; commandBuffer.append(yytext()); yybegin(SQL_SINGLE_QUOTED); } \" { specialAppendState = false; commandBuffer.append(yytext()); yybegin(SQL_DOUBLE_QUOTED); } ; { specialAppendState = false; yybegin(YYINITIAL); return new Token(Token.SQL_TYPE, commandBuffer, yyline); } } { [^\']+ { commandBuffer.append(yytext()); } \'\' { commandBuffer.append(yytext()); } \' { commandBuffer.append(yytext()); debug("SQL '", yytext()); yybegin(SQL); } } { [^\"]+ { commandBuffer.append(yytext()); } \" { commandBuffer.append(yytext()); yybegin(SQL); debug("SQL \"", yytext()); } } [^\r\n] { yybegin(GOBBLE); return new Token(Token.SYNTAX_ERR_TYPE, yytext(), yyline); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/SqltoolRB.java0000644000175000017500000002320412007547370023103 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.cmdline; import org.hsqldb.lib.ValidatingResourceBundle; import org.hsqldb.lib.RefCapableRBInterface; /* $Id: SqltoolRB.java 4809 2011-11-20 21:12:35Z unsaved $ */ /** * Resource Bundle for SqlTool and associated classes. * * Purpose of this class is to wrap a RefCapablePropertyResourceBundle to * reliably detect any possible use of a missing property key as soon as * this class is clinitted. * The reason for this is to allow us developers to detect all such errors * before end-users ever use this class. * * IMPORTANT: To add a new ResourceBundle element, add two new lines, one * like
               *    public static final int NEWKEYID = keyCounter++;
               * 
              and one line
               *      new Integer(KEY2), "key2",
               * 
              * Both should be inserted right after all of the other lines of the same type. * NEWKEYID is obviously a new constant which you will use in calling code * like SqltoolRB.NEWKEYID. */ public enum SqltoolRB implements RefCapableRBInterface { SqlTool_syntax, // SqlTool inline properties: passwordFor_prompt, SqlTool_varset_badformat, SqlTool_abort_continue_mutuallyexclusive, sqltempfile_fail, rcdata_inlineurl_missing, rcdata_inline_extravars, rcdata_inlineusername_missing, rcdata_password_visible, password_readfail, connection_fail, rcdata_genfromvalues_fail, conndata_retrieval_fail, jdbc_established, SqlTool_params_redundant, // SqlFile class, file references: SqlFile_banner, buffer_help, special_help, pl_help, pl_control, pl_assign, dsv_options, d_options, raw_leadin, errorat, rejectreport_top, rejectreport_row, rejectreport_bottom, macro_help, // SqlFile inline properties: rawmode_prompt, raw_movedtobuffer, input_movedtobuffer, sqlstatement_empty, causereport, break_unsatisfied, continue_unsatisfied, primaryinput_accessfail, input_unterminated, plvar_set_incomplete, aborting, rollingback, special_unspecified, bufhist_unspecified, buffer_executing, nobuffer_yet, commandnum_malformat, buffer_restored, substitution_malformat, substitution_nomatch, substitution_syntax, buffer_unknown, special_extrachars, buffer_extrachars, special_malformat, html_mode, dsv_targetfile_demand, file_wrotechars, file_writefail, special_d_like, outputfile_nonetoclose, outputfile_reopening, outputfile_header, destfile_demand, buffer_empty, file_appendfail, sqlfile_name_demand, sqlfile_execute_fail, a_setting, committed, special_b_malformat, binary_loadedbytesinto, binary_filefail, c_setting, bang_incomplete, bang_command_fail, special_unknown, dsv_m_syntax, dsv_x_syntax, raw_empty, dsv_nocolsleft, dsv_skipcols_missing, plalias_malformat, plvar_undefined, sysprop_empty, sysprop_unterminated, sysprop_undefined, var_infinite, plvar_nameempty, plvar_unterminated, pl_malformat, deprecated_noop, end_noblock, continue_syntax, break_syntax, pl_list_parens, pl_list_lengths, dumpload_malformat, plvar_nocolon, plvar_tildedash_nomoreargs, dumpload_fail, pl_malformat_specific, pl_block_fail, ifwhile_malformat, pl_unknown, pl_block_unterminated, vendor_oracle_dS, vendor_derby_dr, vendor_nosup_d, vendor_derby_du, special_d_unknown, metadata_fetch_fail, metadata_fetch_failfor, prepare_demandqm, binbuffer_empty, vendor_nosup_sysschemas, noresult, dsv_bincol, binbuf_write, rows_fetched, rows_fetched_dsv, row_update_singular, row_update_multiple, history_unavailable, history_none, editbuffer_contents, buffer_instructions, history_number_req, history_backto, history_upto, history_back, describe_table_name, describe_table_datatype, describe_table_width, describe_table_nonulls, describe_table_precision, describe_table_scale, logical_unrecognized, read_toobig, read_partial, read_convertfail, dsv_coldelim_present, dsv_rowdelim_present, dsv_nullrep_present, dsv_constcols_nullcol, file_readfail, inputfile_closefail, dsv_header_none, dsv_header_noswitchtarg, dsv_header_noswitchmatch, dsv_header_nonswitched, dsv_nocolheader, dsv_metadata_mismatch, query_metadatafail, dsv_rejectfile_setupfail, dsv_rejectreport_setupfail, none, insertion_preparefail, dsv_header_matchernonhead, dsv_colcount_mismatch, dsv_insertcol_mismatch, time_bad, boolean_bad, inputrec_modified, dsv_recin_fail, dsv_import_summary, insertions_notcommitted, autocommit_fetchfail, dsv_rejectfile_purgefail, dsv_rejectreport_purgefail, edit_malformat, input_malformat, append_empty, transiso_report, exectime_reporting, exectime_report, regex_malformat, encode_fail, macro_tip, macrodef_malformat, macrodef_empty, macrodef_semi, macro_malformat, macro_undefined, log_syntax, log_syntax_error, reject_rpc, rpc_autocommit_failure, rpc_commit_failure, disconnect_success, disconnect_failure, no_required_conn, disconnected_msg, connected_fallbackmsg, no_vendor_schemaspt, schemaname_retrieval_fail, remove_empty_vars_suggestset, auto_unset_warning, pl_unset_nomoreargs, dsv_q_nodblquote, connect_failure, streamread_failure, illegal_at, suggest_j, pipeclose_failure, arrayimp_jvmreq, arrayval_malformat, sqlarray_badjvm, csv_coldelim_present, csv_quote_unterminated, math_expr_fail, varname_warning, null_assignment, bad_time_format, no_timestamp_format, else_without_if, import_col_dup ; private static ValidatingResourceBundle vrb = new ValidatingResourceBundle( SqltoolRB.class.getPackage().getName() + ".sqltool", SqltoolRB.class); static { vrb.setMissingPosValueBehavior(ValidatingResourceBundle.NOOP_BEHAVIOR); vrb.setMissingPropertyBehavior(ValidatingResourceBundle.NOOP_BEHAVIOR); } public String getString() { return vrb.getString(this); } public String toString() { return ValidatingResourceBundle.resourceKeyFor(this); } public String getExpandedString() { return vrb.getExpandedString(this); } public String getExpandedString(String... strings) { return vrb.getExpandedString(this, strings); } public String getString(Throwable t) { return vrb.getString(this, (t.getMessage() == null) ? t.toString() : (t.getClass().getSimpleName() + ": " + t.getMessage())); } public String getString(String... strings) { return vrb.getString(this, strings); } public String getString(int i1) { return vrb.getString(this, i1); } public String getString(int i1, int i2) { return vrb.getString(this, i1, i2); } public String getString(int i1, int i2, int i3) { return vrb.getString(this, i1, i2, i3); } public String getString(int i1, String s2) { return vrb.getString(this, i1, s2); } public String getString(String s1, int i2) { return vrb.getString(this, s1, i2); } public String getString(int i1, int i2, String s3) { return vrb.getString(this, i1, i2, s3); } public String getString(int i1, String s2, int i3) { return vrb.getString(this, i1, s2, i3); } public String getString(String s1, int i2, int i3) { return vrb.getString(this, s1, i2, i3); } public String getString(int i1, String s2, String s3) { return vrb.getString(this, i1, s3, s3); } public String getString(String s1, String s2, int i3) { return vrb.getString(this, s1, s2, i3); } public String getString(String s1, int i2, String s3) { return vrb.getString(this, s1, i2, s3); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool_de.properties0000644000175000017500000003465212007547370024653 0ustar renerene# $Id: sqltool_de.properties 4811 2011-11-20 21:30:16Z unsaved $ # IMPORTANT: Make sure to use ISO-8859-1 encoding for any extended characters, # both in this file (actually any .properties file) and all referenced text # files. # GENERAL .properties SYNTAX: # White space AT END OF LINES IS SIGNIFICANT # White space at beginning of lines is not # \ at very end of line makes the following line a continuation line (with # no implied newline in the value. # (Combined with the previous 2 rules, this means that white space before # this \ is significant, and whitespace at beginning of continutation lines # is not). # \n does not work as an escape. Use unicode \u000a for line breaks instead. # German Locale String resources for SqlTool. # This file is loaded by RefCapablePropertyResourceBundle, so if any # property here has no value set, the value MUST be set in a file # located at sqltool/PROPERTYNAME.text # The empty val settings in sqltool.properties are inherited to the other # languages, so see the "sqltool.properties" file about that. # Property keys MAY NOT CONTAIN UNDERSCORE. Underscores in Enum constants # will automatically be transated to dots. # Traditional inline .properties values: rawmode.prompt=row SqlTool.varset.badformat=Syntax der Variablen entspricht nicht dem Format "name=währung[,...]". SqlTool.abort.continue.mutuallyexclusive=Die Schalter '--abortOnErr' und \ '--continueOnErr' schließen sich gegenseitig aus. sqltempfile.fail=Die angegebe SQL konnte nicht in der Datei gespeichert werden.\u000aUrsache: %{1} rcdata.inlineurl.missing=Das 'url' Element wird für inlineRC benötigt. rcdata.inline.extravars=Nicht unterstützte(s) inlineRC Element(e) angegeben: %{1}. rcdata.inlineusername.missing=Das 'user' Element wird für inlineRC benötigt. rcdata.password.visible=Das 'password' Element muß leer sein. \ Um ein Passwort zu verwenden lassen Sie das\u000a\ 'password' Element weg, sie werden dann separat danach gefragt! password.readfail=Fehler beim einlesen des Passwortes.\u000aUrsache: %{1} rcdata.genfromvalues.fail=RCData ließ sich aus den angegebenen Werten nicht erzeugen.\u000aUrsache: %{1} conndata.retrieval.fail=Konnte keine Verbindungsinformationen für urlid "%{1} finden".\u000aUrsache: %{2} jdbc.established=JDBC Verbindung hergestellt zu eine %{1} v. %{2} Datenbank\u000a\ als "%{3}" mit %{4} Isolation. connection.fail=Konnte keine Verbindung herstellen zu %{1} als Benutzer "%{3}"! \u000aUrsache: %{3} tempfile.removal.fail=Beim Versuch die temporäre Datei '%{1}' zu löschen trat ein Fehler auf. # Value for following line has trailing whitespace on purpose. passwordFor.prompt=Bitte Passwort angeben für %{1}!: sqlfile.readfail=Die SQL Datei '%{1}' konnte nicht gelesen werden. raw.movedtobuffer=Raw-SQL Block in den Edit-Puffer verschoben. Geben Sie ":;" ein, um den Block auszuführen! input.movedtobuffer=Aktueller Befehl wurde in den Edit-Puffer verschoben. sqlstatement.empty=Leere SQL-Anweisung. causereport=Ursache: %{1} break.unsatisfied=Unzureichende 'break' Anweisung (%{1} Typ). continue.unsatisfied=Unzureichende 'continue' Anweisung%{1:+ (type '%1')}. input.unterminated=Unvollständige Eingabe: "%{1}" primaryinput.accessfail=Fehler beim Zugriff auf die Primäreingabe. aborting=SqlTool abgebrochen: %{1} plvar.set.incomplete=Einstellung der Variable '%{1}' ist unvollständig geblieben. rollingback=Die SQL-Transaktion wird rückgängig gemacht. bufhist.unspecified=Kein Befehl spezifiziert. Rufen Sie ":?" auf, um die Kommandos für den Befehlszwischenspeicher und den Verlauf anzuzeigen! special.unspecified=Kein Befehl spezifiziert. Rufen Sie "\\?" auf, um die Sonderbefehle aufzulisten! buffer.executing=Befehl aus dem Edit-Puffer ausgeführt:\u000a"%{1}"\u000a nobuffer.yet=Noch kein Pufferinhalt. commandnum.malformat=Fehlerhaft formatierter Befehl Nr. "%{1}". buffer.restored=Folgender Befehl wurde wieder hergestellt.\u000a\ ":?" eingeben, um die Pufferbefehle anzuzeigen.\u000a%{1} substitution.malformat=Fehlerhafte Ersetzungsanweisung. substitution.nomatch=Puffer unverändert, da der Musterabgleich fehlschlug. substitution.syntax=Syntax für Ersetzungen: ":s/von regex/zu string/igm;". \ Optionale Schalter: i, g, m, ;. buffer.unknown=Unbekannter Pufferbefehl ":%{1}". dsv.x.syntax=Exportsyntax: "\\x Tabelle_oder_angezeigter_name " OR "\\x SELECT Anweisung".\u000a\ (Nicht mit ';' beenden, da der \\x Befehl selbst keine SQL-Anweisung ist. dsv.m.syntax=Importsyntax: \\m Datei/Pfad.dsv [*] (* bedeutet keine Anmerkungen in der DSV Datei). special.extrachars=Extrazeichen nach "\\%{1}" Befehl: %{2} buffer.extrachars=Extrazeichen nach ":%{1}" Befehl: %{2} special.malformat=Fehlerhaft formatierter Sonderbefehl. html.mode=HTML-Modus ist jetzt gesetzt auf %{1}. dsv.targetfile.demand=Sie müssen die PL-Variable "*DSV_TARGET_FILE" setzten, um die fragliche Variante von \\x zu verwenden. file.wrotechars=Das Zeichen %{1} wurde in die Datei '%{2}' geschrieben. file.writefail=Konnte nicht in die Datei '%{1}' schreiben. file.appendfail=Konnnte nichts zur Datei '%{1}' hinzufügen. destfile.demand=Sie müssen einen Namen für die Zieldatei angeben. special.d.like=\\d Angezeigte Befehle müssen wie '\\dX' oder '\\d OBJECTNAME' sein. '\\d?' eingeben für weitere Auflistungen. outputfile.nonetoclose=Für die Abfrage existiert keine Ausgabedatei welche geschlossen werden könnte. outputfile.reopening=Schließe Ausgabedatei der aktuellen Abfrage und öffne sie erneut. outputfile.header=Ausgabe der Abfrage von %{1}. buffer.empty=Kein Befehl im Edit-Puffer. sqlfile.name.demand=Geben Sie bitte einen SQL-Dateinamen an. sqlfile.execute.fail=Konnte den Inhalt der SQL-Datei '%{1} nicht ausführen. a.setting=Auto-Commit-Modus wird gesetzt auf %{1}. committed=Transaktion ausgeführt. special.b.malformat=Fehlerhaft formatierter Binärbefehl. binary.loadedbytesinto=%{1} Bytes in den Binärpuffer geladen. binary.filefail=Fehler beim schreiben der Binärdaten in Datei '%{1}'. c.setting="Nach-Fehler-fortfahren" (Continue-on-error) wird gesetzt auf %{1}. bang.incomplete=Nach dem externen Befehl muss ein '!' folgen um ihn auszuführen. bang.command.fail=Externer Befehl ist fehlgeschlagen:\u000a"%{1}" special.unknown=Unbekannter Sonderbefehl "\\%{1}". raw.empty=RAW-Anweisung wurde abgebrochen (keine Eingabe erhalten). dsv.nocolsleft=Keine weiteren Spalten verblieben, nachdem %{1:+"%1" und }"-" Spalten ausgelassen worden sind. dsv.skipcols.missing=Die folgende(n) Leerspalte(n) ist nicht vorhanden: %{1}. plalias.malformat=Fehlerhafte Verwendung des PL-Alias. plvar.undefined=Unbestimmte PL-Variable "%{1}". var.infinite=Mögliche endlose Variable gehen zurück, einschliesslich '%{1}'. sysprop.empty=Leerer Systemvariablename. sysprop.unterminated=Unvollständiger Systemvariablenname. sysprop.undefined: Nicht gesetzte Systemeinstellung "%{1}". plvar.nameempty=Leerer PL-Variablenname. plvar.unterminated=Unvollständiger PL-Variablenname. pl.malformat=Fehlerhafter PL-Befehl. deprecated.noop=Nicht unterst?tzter Befehl hat keine Wirkung. Entfernen Sie inh!: %{1}. end.noblock=Fehlender Abschluss der 'end'-Anweisung. continue.syntax=PL 'continue' Anweisung erfordert kein Argument oder von \ 'foreach', 'while'. break.syntax=PL 'break' Anweisung erfordert kein Argument oder von \ 'foreach', 'if', 'while', 'file'. pl.list.parens=Die äußersten Klammern sind nicht Teil der Werte. pl.list.lengths=Zeigt den Variablennamen und die Länge der Werte. \ (Verwende 'listvalues', um die Werte zu sehen). dumpload.malformat=Fehlerhafter PL 'dump' oder 'load' Befehl. plvar.nocolon=PL Variablennamen dürfen nicht ':' enthalten. plvar.tildedash.nomoreargs=PL ~/_ Befehle akzeptieren keine anderen Argumente ("%{1}"). dumpload.fail=Konnte Variable '%{1}' nicht in/von Datei '%{2}' speichern/laden. pl.malformat.specific=Fehlerhafter PL '%{1}' Befehl. pl.block.fail=Konnte die Anweisungen vom PL-Block nicht ausführen. ifwhile.malformat=Fehlerhafter PL 'if'/'while' Befehl. pl.unknown=Unbekannter PL-Befehl "%{1}". pl.block.unterminated=Nicht beendeter PL '%{1}' Block vendor.oracle.dS=*** WARNUNG:\u000a\ *** Liste Tabelle im Systemeigenen Schemata, da\u000a\ *** Oracle (TM) keine JDBC System-Tabellenliste zurückgibt. vendor.derby.dr=Derby verfügt nicht über SQL-Rollen. vendor.nosup.d=SqlFile unterstützt noch nicht \\d%{1} für Ihren Datenbanktyp. vendor.derby.du=Es ist unmöglich, eine zuverlässige Benutzerliste von Derby zu erhalten. special.d.unknown=Unbekannte \\d Wahl: '%{1}'. metadata.fetch.fail=Konnte die Metadaten der Datenbank nicht bekommen. metadata.fetch.failfor=Konnte die Metadaten der Datenbank für '%{1}' nicht bekommen. prepare.demandqm='Prepared statements' müssen ein '?' enthalten. binbuffer.empty=Binärpuffer ist leer. vendor.nosup.sysschemas=*** WARNUNG:\u000a\ *** Lasse Tabellen vom System eigenen Schemata wegfallen\u000a\ *** (weil DB-Distributor sie nicht von JDBC unterscheidet). noresult=Kein Resultat. dsv.bincol=Tabelle hat eine binäre Spalte. DSV Dateien sind Textdateien und keine Binärdateien. binbuf.write=Lese %{1} Bytes von Spalte '%{2}' (Typ %{3}) in den Binärpuffer. rows.fetched=%{1} Reihen geholt. rows.fetched.dsv=%{1} Reihen von der Datenbank geholt. row.update.multiple=%{1} Reihen aktualisierten. row.update.singular=1 Reihe aktualisierte. history.unavailable=Befehlsverlauf nicht vorhanden. history.none=Noch keinen Verlauf. editbuffer.contents=Edit-Pufferinhalt:\u000a"%{1}" buffer.instructions=Um einen Befehl in Puffer zu kopieren, geben Sie ":27" oder ":-3" ein. \ Um den Puffer erneut auszuführen ":;". history.number.req=Geben Sie bitte eine positive Ganzzahl als Befehlsnummer ein, oder eine \ negative Zahl,\u000aum X Befehle im Verlauf zurück zu gehen. history.backto=Befehlsverlauf geht nur zurück bis #%{1}. history.upto=Befehlsverlauf geht nur zurück bis #%{1}. history.back=Befehlsverlauf geht nur %{1} Befehl(e) zurück. describe.table.name=NAME describe.table.datatype=DATENTYP describe.table.width=BREITE describe.table.nonulls=KEINE-NULL describe.table.precision=PRÄZISION describe.table.scale=SKALA logical.unrecognized=Unbekannte logische Operation. read.toobig=Datenmenge ist zu groß um alles auf einmal einzulesen.\u000a\ Lassen Sie das Programm bitte mit mehr Arbeitsspeicher laufen (Versuchen Sie den 'java -Xm*' Schalter). read.partial=Lese nicht alle Bytes. %{1} Bytes von %{2} werden gelesen. read.convertfail=Wert ist zu groß, um ihn in eine Zeichenkette umzuwandeln. \u000a\ Lassen Sie das Programm bitte mit mehr Arbeitsspeicher laufen (Versuchen Sie den Java -Xm* Schalter). dsv.coldelim.present=Tabellendaten enthalten unsere Spaltentrennzeichen '%{1}'. dsv.rowdelim.present=Tabellendaten enthalten unsere Zeilentrennzeichen '%{1}'. dsv.nullrep.present=Tabellendaten enthalten unser NULL-Zeichen '%{1}'. dsv.constcols.nullcol=*DSV_CONST_COLS Element hat null-Spalten-Namen. file.readfail=Die Datei '%{1} kann nicht gelesen werden. inputfile.closefail=Konnte Import-Datei nicht schließen. dsv.header.none=Keine Kopfzeile (Header) in der Import-Datei. dsv.header.noswitchtarg=Kopfzeichen in DSV-Datei Zeile %{1} erreicht ohne eine Zieltabelle spezifiziert zu haben. dsv.header.noswitchmatch=Ende eines Kopfzeichen in DSV-Datei Zeile %{1} erreicht, ohne dabei eine Kopfspalte definiert zu haben. dsv.header.nonswitched=Kopfzeile in Kopfzeichen ohne Tabellenbezug in DSV-Datei Zeile %{1}. dsv.nocolheader=Keine Spaltenüberschrift für Spalte #%{1} in DSV-Datei in Zeile %{2}. dsv.metadata.mismatch=Die Metadaten passen nicht zu den Spalten. query.metadatafail=Konnte für die Abfrage keine Metadaten finden, verwendete:\u000a"%{1}" dsv.rejectfile.setupfail=Konnte Reject-Datei '%{1}' nicht erstellen. dsv.rejectreport.setupfail=Konnte Reject-Report '%{1}' nicht erstellen. none=Nichts insertion.preparefail=Fehler beim Vorbereiten der Setup-Zeichenketten für Einfügen:\u000a"%{1}" dsv.header.matchernonhead=Nicht-Header-Zeile im Suchblock der Tabelle in der DSV-Datei in Zeile %{1}. dsv.colcount.mismatch=Die Kopfzeile hat %{1} Spalten, aber der Importdatensatz hat %{2} Spaltenwerte. dsv.insertcol.mismatch=Erwartete insgesamt %{1} Werte zum importieren, erfaßte aber %{2}. dsv.nonskip.mismatch=Die Kopfzeile hat %{1} nicht auszulassende Spalten, aber der Importdatensatz hat %{2} Werte zum Einfügen. time.bad=Falscher Datum/Zeitwert. boolean.bad=Falscher Boolean-Wert '%{1}'. inputrec.modified=%{1} Reihen geändert durch diesen Eingabedatensatz. dsv.recin.fail=Auswerten oder Einfügen der Eingabezeile %{1} %{2:+, Spalte '%2' } ist fehlgeschlagen. dsv.import.summary=Importzusammenfassung (%{1}Ausgelassen / Zurückgewiesen / Eingefügt): \ %{2} / %{3} / %{4}%{5:+ bevor abgebrochen}. insertions.notcommitted=Alle einzufügenden Datensätze gehen verloren, wenn du nicht commitest. autocommit.fetchfail=Fehler beim Erhalt des Autocommit-Wertes. dsv.rejectfile.purgefail:Fehler beim Löschen der nicht benötigten Reject-Datei '%{1}'. dsv.rejectreport.purgefail=Fehler beim Löschen des nicht benötigten Reject-Reportes '%{1}'. edit.malformat=Fehlerhafter Pufferbefehl. input.malformat=Syntaxfehler in der Eingabe. append.empty=Verwende ':,' (und nichts weiter) um einen Befehl zu wiederholen. transiso.report=Transactions-Isolations-Level ist jetzt %{1} %{2} exectime.reporting=Bericht zur Ausführungdauer auf %{1} gesetzt. exectime.report=Dauer: %{1} ms. regex.malformat=Falsches Regex-Muster: %{1} encode.fail=Ausgabe-Kodierung ist fehlgeschlagen: %{1} macro.tip=Rufen Sie /? auf für die Makro-Hilfe! macrodef.malformat=Fehlerhafter Makro-Definitions-Befehl. macrodef.empty=Dieses Makro ist leer. macrodef.semi=Makro-Werte können nicht mit ";" enden. macro.malformat=Falscher Makro-Befehl. macro.undefined=Es gibt kein definiertes Makro mit dem Namen "%{1}". errstream.deprecated:\ WARNUNG: Die SqlFile-execute-Methode mit dem Parameter "error stream" ist \u000a\ abgekündigt und sollte nicht mehr verwendet werden. Bitte passen Sie ihr Programm \u000a\ so an, das es eine der Logging-Möglichkeiten verwendet. \ Mache weiter.... log.syntax=SYNTAX: \\l LEVEL Nachricht\u000a\ Wobei LEVEL eines der folgend ist : FINEST, FINER, INFO, WARNING, SEVERE log.syntax.error=Logging-Syntax-Fehler. Rufen Sie '\\l?' auf um die Hilfe zu sehen! reject.rpc=Lösche *DSV_RECORDS_PER_COMMIT, da ein kein Ganzzahl-Wert angegeben wurde: %{1}. rpc.autocommit.failure=Fehler beim Einrichten der *DSV_RECORDS_PER_COMMIT Option. rpc.commit.failure=Fehler beim Abschließen des Commit-Status für die *DSV_RECORDS_PER_COMMIT Option. remove.empty.vars.suggestset=Wir löschen die Variabel. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/SqlToolError.java0000644000175000017500000000465212007547370023637 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.cmdline; import org.hsqldb.lib.AppendableException; /** * Exceptions thrown by the SqlTool system externally to SqlFile. * (As opposed to the nested Exceptions within those classes). * This class is misnamed, because it is not only errors. * When there is time, this file and class should be renamed. *

              * This class has a misleading name and should really be renamed. * It is Java Exception, not a Java Error. *

              */ public class SqlToolError extends AppendableException { static final long serialVersionUID = 1792522673702223649L; public SqlToolError(Throwable cause) { super(null, cause); } public SqlToolError() { // Purposefully empty } public SqlToolError(String s) { super(s); } public SqlToolError(String string, Throwable cause) { super(string, cause); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/SqlFile.java0000644000175000017500000100411312007547370022560 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.cmdline; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.HashSet; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import java.util.logging.Level; import java.text.SimpleDateFormat; import java.text.ParseException; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; import java.nio.charset.Charset; import org.hsqldb.lib.AppendableException; import org.hsqldb.lib.RCData; import org.hsqldb.lib.StringUtil; import org.hsqldb.lib.FrameworkLogger; import org.hsqldb.cmdline.sqltool.Token; import org.hsqldb.cmdline.sqltool.TokenList; import org.hsqldb.cmdline.sqltool.TokenSource; import org.hsqldb.cmdline.sqltool.SqlFileScanner; import org.hsqldb.cmdline.sqltool.Calculator; import org.hsqldb.cmdline.sqltool.FileRecordReader; /* $Id: SqlFile.java 5037 2012-07-25 22:34:40Z fredt $ */ /** * Encapsulation of SQL text and the environment under which it will executed * with a JDBC Connection. * 'SqlInputStream' would be a more precise name, but the content we are * talking about here is what is colloqially known as the contents of * "SQL file"s. *

              * The file src/org/hsqldb/sample/SqlFileEmbedder.java * in the HSQLDB distribution provides an example for using SqlFile to * execute SQL files directly from your own Java classes. *

              * The complexities of passing userVars and macros maps are to facilitate * strong scoping (among blocks and nested scripts). *

              * Some implementation comments and variable names use keywords based * on the following definitions.

                *
              • COMMAND = Statement || SpecialCommand || BufferCommand *
              • Statement = SQL statement like "SQL Statement;" *
              • SpecialCommand = Special Command like "\x arg..." *
              • BufferCommand = Editing/buffer command like ":s/this/that/" *
              *

              * When entering SQL statements, you are always "appending" to the * "immediate" command (not the "buffer", which is a different thing). * All you can do to the immediate command is append new lines to it, * execute it, or save it to buffer. * When you are entering a buffer edit command like ":s/this/that/", * your immediate command is the buffer-edit-command. The buffer * is the command string that you are editing. * The buffer usually contains either an exact copy of the last command * executed or sent to buffer by entering a blank line, * but BUFFER commands can change the contents of the buffer. *

              * In general, the special commands mirror those of Postgresql's psql, * but SqlFile handles command editing very differently than Postgresql * does, in part because of Java's lack of support for raw tty I/O. * The \p special command, in particular, is very different from psql's. *

              * Buffer commands are unique to SQLFile. The ":" commands allow * you to edit the buffer and to execute the buffer. *

              * \d commands are very poorly supported for Mysql because * (a) Mysql lacks most of the most basic JDBC support elements, and * the most basic role and schema features, and * (b) to access the Mysql data dictionary, one must change the database * instance (to do that would require work to restore the original state * and could have disastrous effects upon transactions). *

              * The process*() methods, other than processBuffHist() ALWAYS execute * on "buffer", and expect it to contain the method specific prefix * (if any). *

              * The input/output Reader/Stream are generally managed by the caller. * An exception is that the input reader may be closed automatically or on * demand by the user, since in some cases this class builds the Reader. * There is no corresponding functionality for output since the user always * has control over that object (which may be null or System.out). *

              * * @see * The SqlTool chapter of the * HyperSQL Utilities Guide * @see org.hsqldb.sample.SqlFileEmbedder * @version $Revision: 5037 $, $Date: 2012-07-25 23:34:40 +0100 (Wed, 25 Jul 2012) $ * @author Blaine Simpson (blaine dot simpson at admc dot com) */ public class SqlFile { private enum Recursion { FILE, IF, WHILE, FOREACH, FOR, FORROWS } private static FrameworkLogger logger = FrameworkLogger.getLog(SqlFile.class); private static final int DEFAULT_HISTORY_SIZE = 40; private boolean executing; private boolean permitEmptySqlStatements; private boolean interactive; private String primaryPrompt = "sql> "; private static String rawPrompt; private static Method createArrayOfMethod; private String contPrompt = " +> "; private boolean htmlMode; private TokenList history; /** Platform-specific line separator */ public static String LS = System.getProperty("line.separator"); private int maxHistoryLength = 1; // TODO: Implement PL variable to interactively change history length. // Study to be sure this won't cause state inconsistencies. private boolean reportTimes; private Reader reader; // Reader serves the auxiliary purpose of null meaning execute() // has finished. private String inputStreamLabel; private File baseDir; private boolean dsvTrimAll; private boolean ignoreBangStatus; private boolean allQuoted; private boolean doPrepare; private static String DSV_X_SYNTAX_MSG; private static String DSV_M_SYNTAX_MSG; private static String nobufferYetString; private String prepareVar; private int dsvRecordsPerCommit = 0; static String DEFAULT_FILE_ENCODING = System.getProperty("file.encoding"); static Set hiddenVars = new HashSet( Arrays.asList("?", "*START_TIME", "*VERSION")); // These settings are never null private String nullRepToken; // May be "" private String nullRepHtml; // May be "" private String dsvColDelim; // May NOT be "" private String dsvColSplitter; // May NOT be "" private String dsvRowDelim; // May NOT be "" private String dsvRowSplitter; // May NOT be "" private String dsvConstCols; // May NOT be "" private String dsvSkipPrefix; // May not be "" // Following may be null but not "" private String dsvSkipCols; private String dsvTargetFile; private String dsvTargetTable; private String dsvRejectFile; private String dsvRejectReport; private String topHtmlFile; private String bottomHtmlFile; private SimpleDateFormat timestampFormat; /** * N.b. javax.util.regex Optional capture groups (...)? are completely * unpredictable wrt whether you get a null capture group vs. no capture. * Must always check count! */ private static Pattern varPattern = Pattern.compile("\\*?[a-zA-Z]\\w*"); private static Pattern wordAndDotPattern = Pattern.compile("[\\w.]+"); private static Pattern specialPattern = Pattern.compile("(\\S+)(?:(\\s+.*\\S))?\\s*"); private static Pattern plPattern = Pattern.compile("(.*\\S)?\\s*"); private static Pattern mathAsgnPattern = Pattern.compile( "\\(\\(\\s*([a-zA-Z]\\w*)\\s*([-+*/%][-+=])\\s*(.+?)?\\s*\\)\\)\\s*"); private static Pattern mathPattern = Pattern.compile( "\\(\\(\\s*([a-zA-Z]\\w*)\\s*=\\s*(.+?)?\\s*\\)\\)\\s*"); private static Pattern foreachPattern = Pattern.compile("foreach\\s+(\\S+)\\s*\\(([^)]+)\\)\\s*"); private static Pattern forrowsPattern = Pattern.compile("forrows((?:\\s+[a-zA-Z]\\w*)*)\\s*"); private static Pattern forPattern = Pattern.compile( "for\\s+(\\(\\(.+\\)\\))?\\s*(\\([^)]+\\))\\s*(\\(\\(.+\\)\\))\\s*"); private static Pattern ifwhilePattern = Pattern.compile("\\S+\\s*\\(([^)]*)\\)\\s*"); private static Pattern inlineifPattern = Pattern.compile("(if\\s*\\([^)]*\\))(.*\\S.*)"); private static Pattern varsetPattern = Pattern.compile("(\\S+)\\s*([=_~:])(.*)?"); private static Pattern substitutionPattern = Pattern.compile("(\\S)(.+?)\\1(.*?)\\1(.+?)?\\s*"); // Note that this pattern does not include the leading ":s". private static Pattern slashHistoryPattern = Pattern.compile("\\s*/([^/]+)/\\s*(\\S.*)?"); private static Pattern historyPattern = Pattern.compile("\\s*(-?\\d+)?\\s*(\\S.*)?"); // Note that this pattern does not include the leading ":". private static Pattern wincmdPattern; private static Pattern useMacroPattern = Pattern.compile("(\\w+)(\\s.*[^;])?(;?)"); private static Pattern useFnPattern = Pattern.compile("(\\w+\\()\\s*([^;)]*?)\\s*\\)(.*)"); private static Pattern legacyEditMacroPattern = Pattern.compile("(\\w+(?:\\(\\))?)\\s*:(.*)"); private static Pattern editMacroPattern = Pattern.compile(":\\s(\\w+(?:\\(\\))?)(?:\\s(.*))?"); private static Pattern spMacroPattern = Pattern.compile("(\\w+(?:\\(\\))?)\\s+([*\\\\])(.*\\S)"); private static Pattern sqlMacroPattern = Pattern.compile("(\\w+(?:\\(\\))?)\\s+(.*\\S)"); private static Pattern integerPattern = Pattern.compile("\\d+"); private static Pattern nameValPairPattern = Pattern.compile("\\s*(\\w+)\\s*=(.*)"); // Specifically permits 0-length values, but not names. private static Pattern dotPattern = Pattern.compile("(\\w*)\\.(\\w*)"); private static Pattern commitOccursPattern = Pattern.compile("(?is)(?:set\\s+autocommit.*)|(commit\\s*)"); private static Pattern logPattern = Pattern.compile("(?i)(FINER|WARNING|SEVERE|INFO|FINEST)\\s+(.*\\S)"); private static Pattern arrayPattern = Pattern.compile("ARRAY\\s*\\[\\s*(.*\\S)?\\s*\\]"); private static Pattern fnParamPat = Pattern.compile("\\*\\{(:)?(\\d+)\\}"); private static Map nestingPLCommands = new HashMap(); private static Map inlineNestPLCommands = new HashMap(); static { nestingPLCommands.put("if", ifwhilePattern); nestingPLCommands.put("while", ifwhilePattern); nestingPLCommands.put("foreach", foreachPattern); nestingPLCommands.put("forrows", forrowsPattern); nestingPLCommands.put("for", forPattern); inlineNestPLCommands.put("if", inlineifPattern); if (System.getProperty("os.name").startsWith("Windows")) wincmdPattern = Pattern.compile("([^\"]+)?(\"[^\"]*\")?"); rawPrompt = SqltoolRB.rawmode_prompt.getString() + "> "; DSV_OPTIONS_TEXT = SqltoolRB.dsv_options.getString(); D_OPTIONS_TEXT = SqltoolRB.d_options.getString(); DSV_X_SYNTAX_MSG = SqltoolRB.dsv_x_syntax.getString(); DSV_M_SYNTAX_MSG = SqltoolRB.dsv_m_syntax.getString(); nobufferYetString = SqltoolRB.nobuffer_yet.getString(); try { SqlFile.createArrayOfMethod = Connection.class.getDeclaredMethod( "createArrayOf", String.class, Object[].class); } catch (Exception expectedException) { // Purposeful no-op. Leave createArrayOfMethod null. } } // This can throw a runtime exception, but since the pattern // Strings are constant, one test run of the program will tell // if the patterns are good. private boolean removeEmptyVars() { String sysP = System.getProperty("sqltool.REMOVE_EMPTY_VARS"); return sysP != null && Boolean.parseBoolean(sysP); } /** * Encapsulate updating local variables which depend upon PL variables. *

              * Right now this is called whenever the user variable map is changed. * It would be more efficient to do it JIT by keeping track of when * the vars may be "dirty" by a variable map change, and having all * methods that use the settings call a conditional updater, but that * is less reliable since there is no way to guarantee that the vars * are not used without checking. * UPDATE: Could do what is needed by making a Map subclass with * overridden setters which enforce dirtiness. *

              */ private void updateUserSettings() { // Unset those system userVars where empty string makes no sense. String varVal; if (shared.userVars.containsKey("NULL") || shared.userVars.containsKey("*NULL")) { errprintln(SqltoolRB.null_assignment.getString()); shared.userVars.remove("NULL"); shared.userVars.remove("*NULL"); } for (String noEmpty : new String[] { "DSV_SKIP_COLS", "DSV_COL_DELIM", "TIMESTAMP_FORMAT", "DSV_COL_SPLITTER", "DSV_ROW_DELIM", "DSV_ROW_SPLITTER", "DSV_TARGET_FILE", "DSV_TARGET_TABLE", "DSV_CONST_COLS", "DSV_REJECT_FILE", "DSV_REJECT_REPORT", "DSV_RECORDS_PER_COMMIT", }) { varVal = shared.userVars.get('*' + noEmpty); if (varVal == null || varVal.length() > 0) { continue; } if (!removeEmptyVars()) { errprintln(SqltoolRB.auto_unset_warning.getString(noEmpty)); } shared.userVars.remove('*' + noEmpty); } // Null/empty policy of *DSV_SKIP_PREFIX variable is very different // from that of our dsvSkipPrefix local variable. // *DSV... null -> dsv* default // *DSV... "" -> dsv* null // There is no dsv* of "" dsvSkipPrefix = SqlFile.convertEscapes( shared.userVars.get("*DSV_SKIP_PREFIX")); if (dsvSkipPrefix == null) { dsvSkipPrefix = DEFAULT_SKIP_PREFIX; } else if (dsvSkipPrefix.length() < 1) { dsvSkipPrefix = null; } dsvSkipCols = shared.userVars.get("*DSV_SKIP_COLS"); dsvTrimAll = Boolean.parseBoolean( shared.userVars.get("*DSV_TRIM_ALL")); ignoreBangStatus = Boolean.parseBoolean( shared.userVars.get("*IGNORE_BANG_STATUS")); allQuoted = Boolean.parseBoolean( shared.userVars.get("*ALL_QUOTED")); dsvColDelim = SqlFile.convertEscapes( shared.userVars.get("*DSV_COL_DELIM")); if (dsvColDelim == null) dsvColDelim = DEFAULT_COL_DELIM; dsvColSplitter = shared.userVars.get("*DSV_COL_SPLITTER"); if (dsvColSplitter == null) dsvColSplitter = DEFAULT_COL_SPLITTER; dsvRowDelim = SqlFile.convertEscapes( shared.userVars.get("*DSV_ROW_DELIM")); if (dsvRowDelim == null) dsvRowDelim = DEFAULT_ROW_DELIM; dsvRowSplitter = shared.userVars.get("*DSV_ROW_SPLITTER"); if (dsvRowSplitter == null) dsvRowSplitter = DEFAULT_ROW_SPLITTER; dsvTargetFile = shared.userVars.get("*DSV_TARGET_FILE"); dsvTargetTable = shared.userVars.get("*DSV_TARGET_TABLE"); dsvConstCols = shared.userVars.get("*DSV_CONST_COLS"); dsvRejectFile = shared.userVars.get("*DSV_REJECT_FILE"); dsvRejectReport = shared.userVars.get("*DSV_REJECT_REPORT"); topHtmlFile = shared.userVars.get("*TOP_HTMLFRAG_FILE"); bottomHtmlFile = shared.userVars.get("*BOTTOM_HTMLFRAG_FILE"); dsvRecordsPerCommit = 0; if (shared.userVars.get("*DSV_RECORDS_PER_COMMIT") != null) try { dsvRecordsPerCommit = Integer.parseInt( shared.userVars.get("*DSV_RECORDS_PER_COMMIT")); } catch (NumberFormatException nfe) { errprintln(SqltoolRB.reject_rpc.getString( shared.userVars.get("*DSV_RECORDS_PER_COMMIT"))); shared.userVars.remove("*DSV_RECORDS_PER_COMMIT"); } nullRepToken = convertEscapes(shared.userVars.get("*NULL_REP_TOKEN")); if (nullRepToken == null) nullRepToken = DEFAULT_NULL_REP; nullRepHtml = shared.userVars.get("*NULL_REP_HTML"); if (nullRepHtml == null) nullRepHtml = DEFAULT_NULL_HTML; timestampFormat = null; String formatString = shared.userVars.get("*TIMESTAMP_FORMAT"); if (formatString != null) try { timestampFormat = new SimpleDateFormat(formatString); } catch (IllegalArgumentException iae) { errprintln(SqltoolRB.bad_time_format.getString( formatString, iae.getMessage())); shared.userVars.remove("*TIMESTAMP_FORMAT"); } } /** * Private class to "share" attributes among a family of SqlFile instances. */ private static class SharedFields { /* Since SqlTool can run against different versions of HSQLDB (plus * against any JDBC database), it can't make assumptions about * commands which may cause implicit commits, or commit state * requirements with specific databases may have for specific SQL * statements. Therefore, we just assume that any statement other * than COMMIT or SET AUTOCOMMIT causes an implicit COMMIT (the * Java API spec mandates that setting AUTOCOMMIT causes an implicit * COMMIT, regardless of whether turning AUTOCOMMIT on or off). */ boolean possiblyUncommitteds; Connection jdbcConn; // Since we enforce non-null mapping values, userVars.get(key) of null // always means that that the map does not contain the specified key. Map userVars = new HashMap(); Map macros = new HashMap(); PrintStream psStd; SharedFields(PrintStream psStd) { this.psStd = psStd; } String encoding; } private SharedFields shared; private static final String DIVIDER = "-----------------------------------------------------------------" + "-----------------------------------------------------------------"; // Needs to be at least as wide as the widest field or header displayed. private static final String revString = "$Revision: 5037 $"; private static final int revStringLength = revString.length(); private static final String revnum = (revStringLength - " $".length() > "$Revision: ".length()) ? revString.substring("$Revision: ".length(), revStringLength - " $".length()) : ""; private static String DSV_OPTIONS_TEXT; private static String D_OPTIONS_TEXT; /** * Convenience wrapper for the SqlFile(File, String) constructor * * @throws IOException * @see #SqlFile(File, String) */ public SqlFile(File inputFile) throws IOException { this(inputFile, null); } /** * Convenience wrapper for the SqlFile(File, String, boolean) constructor * * @param encoding is applied to both the given File and other files * read in or written out. Null will use your env+JVM settings. * @throws IOException * @see #SqlFile(File, String, boolean) */ public SqlFile(File inputFile, String encoding) throws IOException { this(inputFile, encoding, false); } /** * Constructor for non-interactive usage with a SQL file, using the * specified encoding and sending normal output to stdout. * * @param encoding is applied to the given File and other files * read in or written out. Null will use your env+JVM settings. * @param interactive If true, prompts are printed, the interactive * Special commands are enabled, and * continueOnError defaults to true. * @throws IOException * @see #SqlFile(Reader, String, PrintStream, String, boolean, File) */ public SqlFile(File inputFile, String encoding, boolean interactive) throws IOException { this(new InputStreamReader(new FileInputStream(inputFile), (encoding == null) ? DEFAULT_FILE_ENCODING : encoding), inputFile.toString(), System.out, encoding, interactive, inputFile.getParentFile()); } /** * Constructor for interactive usage with stdin/stdout * * @param encoding is applied to other files read in or written out (but * not to stdin or stdout). * Null will use your env+JVM settings. * @param interactive If true, prompts are printed, the interactive * Special commands are enabled, and * continueOnError defaults to true. * @throws IOException * @see #SqlFile(Reader, String, PrintStream, String, boolean, File) */ public SqlFile(String encoding, boolean interactive) throws IOException { this((encoding == null) ? new InputStreamReader(System.in) : new InputStreamReader(System.in, encoding), "", System.out, encoding, interactive, null); } /** * Instantiate a SqlFile instance for SQL input from 'reader'. * * After any needed customization, the SQL can be executed by the * execute method. *

              * Most Special Commands and many Buffer commands are only for * interactive use. *

              * This program never writes to an error stream (stderr or alternative). * All meta messages and error messages are written using the logging * facility. *

              * * @param reader Source for the SQL to be executed. * Caller is responsible for setting up encoding. * (the 'encoding' parameter will NOT be applied * to this reader). * @param psStd PrintStream for normal output. * If null, normal output will be discarded. * Caller is responsible for settingup encoding * (the 'encoding' parameter will NOT be applied * to this stream). * @param interactive If true, prompts are printed, the interactive * Special commands are enabled, and * continueOnError defaults to true. * @throws IOException * @see #execute() */ public SqlFile(Reader reader, String inputStreamLabel, PrintStream psStd, String encoding, boolean interactive, File baseDir) throws IOException { this(reader, inputStreamLabel, baseDir); try { shared = new SharedFields(psStd); shared.userVars.put( "*START_TIME", (new java.util.Date()).toString()); shared.userVars.put("*REVISION", revnum); shared.userVars.put("?", ""); setEncoding(encoding); this.interactive = interactive; continueOnError = this.interactive; if (interactive) { history = new TokenList(); maxHistoryLength = DEFAULT_HISTORY_SIZE; } // Updates local vars basd on * shared.userVars // even when (like now) these are all defaults. } catch (IOException ioe) { closeReader(); throw ioe; } catch (RuntimeException re) { closeReader(); throw re; } } /** * Wrapper for SqlFile(SqlFile, Reader, String) * * @see #SqlFile(SqlFile, Reader, String) */ private SqlFile(SqlFile parentSqlFile, File inputFile) throws IOException { this(parentSqlFile, new InputStreamReader(new FileInputStream(inputFile), (parentSqlFile.shared.encoding == null) ? DEFAULT_FILE_ENCODING : parentSqlFile.shared.encoding), inputFile.toString(), inputFile.getParentFile()); } /** * Constructor for recursion */ private SqlFile(SqlFile parentSqlFile, Reader reader, String inputStreamLabel, File baseDir) { this(reader, inputStreamLabel, baseDir); try { recursed = Recursion.FILE; shared = parentSqlFile.shared; // shared.userVars.put("?", ""); Don't destroy this useful value! interactive = false; continueOnError = parentSqlFile.continueOnError; // Nested input is non-interactive because it just can't work to // have user append to edit buffer, and displaying prompts would // be misleading and inappropriate; yet we will inherit the current // continueOnError behavior. } catch (RuntimeException re) { closeReader(); throw re; } } /** * Base Constructor which every other Constructor starts with */ private SqlFile(Reader reader, String inputStreamLabel, File baseDir) { logger.privlog(Level.FINER, "ting SqlFile instance", null, 2, FrameworkLogger.class); if (reader == null) throw new IllegalArgumentException("'reader' may not be null"); if (inputStreamLabel == null) throw new IllegalArgumentException( "'inputStreamLabel' may not be null"); // Don't try to verify reader.ready() here, since we require it to be // reayd to read only in execute(), plus in many caess it's useful for // execute() to block. this.reader = reader; this.inputStreamLabel = inputStreamLabel; this.baseDir = (baseDir == null) ? new File(".") : baseDir; } public void setConnection(Connection jdbcConn) { if (jdbcConn == null) throw new IllegalArgumentException( "We don't yet support unsetting the JDBC Connection"); shared.jdbcConn = jdbcConn; } public Connection getConnection() { return shared.jdbcConn; } public void setContinueOnError(boolean continueOnError) { this.continueOnError = continueOnError; } public void setMaxHistoryLength(int maxHistoryLength) { if (executing) throw new IllegalStateException( "Can't set maxHistoryLength after execute() has been called"); if (reader == null) throw new IllegalStateException( "Can't set maxHistoryLength execute() has run"); this.maxHistoryLength = maxHistoryLength; } public void addMacros(Map newMacros) { shared.macros.putAll(newMacros); } public void addUserVars(Map newUserVars) { for (String val : newUserVars.values()) { if (val == null) throw new IllegalArgumentException( "Null mapping values not allowed"); } shared.userVars.putAll(newUserVars); List strangeVars = new ArrayList(); for (String name : newUserVars.keySet()) if (!name.equals("?") && !varPattern.matcher(name).matches()) strangeVars.add(name); if (strangeVars.size() > 0) errprintln(SqltoolRB.varname_warning.getString( strangeVars.toString())); sqlExpandMode = null; } /** * Get a reference to the user variable map. * * Since you are getting a reference to the private map used inside this * class, update this map with great caution and attention to lifecycle * handling of the variable map. */ public Map getUserVars() { return shared.userVars; } public Map getMacros() { // Consider whether safer to return a deep copy. Probably. return shared.macros; } /** * This sets the instance variable and the corresponding PL variable. * * @param newEncoding may be null to revert to using defaults again. */ private void setEncoding(String newEncoding) throws UnsupportedEncodingException { if (newEncoding == null || newEncoding.length() < 1) { shared.encoding = null; shared.userVars.remove("*ENCODING"); return; } if (!Charset.isSupported(newEncoding)) throw new UnsupportedEncodingException(newEncoding); shared.userVars.put("*ENCODING", newEncoding); shared.encoding = newEncoding; } // So we can tell how to handle quit and break commands. private Recursion recursed; private PrintWriter pwQuery; private PrintWriter pwDsv; private boolean continueOnError; /* * This is reset upon each execute() invocation (to true if interactive, * false otherwise). */ private SqlFileScanner scanner; private Token buffer, prevToken; private boolean preempt; private String lastSqlStatement; private boolean autoClose = true; private boolean csvStyleQuoting; /** * Specify whether the supplied or generated input Reader should * automatically be closed by the execute() method. *

              * execute() will close the Reader by default (i.e. 'autoClose' defaults * to true). * You may want to set this to false if you want to stop execution with * \q or similar, then continue using the Reader or underlying Stream. *

              * The caller is always responsible for closing the output object (if any) * used by SqlFile. *

              */ public void setAutoClose(boolean autoClose) { this.autoClose = autoClose; } /** * Process all the commands from the file or Reader associated with * "this" object. * SQL commands in the content get executed against the current JDBC * data source connection. * * @throws SQLExceptions thrown by JDBC driver. * Only possible if in "\c false" mode. * @throws SqlToolError all other errors. * This includes including QuitNow, BreakException, * ContinueException for recursive calls only. */ synchronized public void execute() throws SqlToolError, SQLException { if (reader == null) throw new IllegalStateException("Can't call execute() " + "more than once for a single SqlFile instance"); updateUserSettings(); try { scanner = new SqlFileScanner(reader); scanner.setStdPrintStream(shared.psStd); scanner.setRawLeadinPrompt(SqltoolRB.raw_leadin.getString()); if (interactive) { stdprintln(SqltoolRB.SqlFile_banner.getString(revnum)); scanner.setRawPrompt(rawPrompt); scanner.setSqlPrompt(contPrompt); scanner.setSqltoolPrompt(primaryPrompt); scanner.setInteractive(true); if (shared.jdbcConn == null) stdprintln(SqltoolRB.suggest_j.getString()); stdprint(primaryPrompt); } scanpass(scanner); } finally { try { closeQueryOutputStream(); if (autoClose) closeReader(); } finally { reader = null; // Encourage GC of buffers } } } /** * Close the reader. * * The execute method will run this automatically, by default. */ public void closeReader() { if (reader == null) return; try { if (scanner != null) try { scanner.yyclose(); } catch (IOException ioe) { errprintln(SqltoolRB.pipeclose_failure.getString(ioe)); } try { reader.close(); } catch (IOException ioe) { // Purposefully empty. // The reader will usually already be closed at this point. } } finally { reader = null; // Encourage GC of buffers } } /** * If command is not an inline-nest command, returns null; * * @return Matcher which has already successfully .matched() or null */ private Matcher inlineNestMatcher(Token token) throws BadSpecial { if (token.type != Token.PL_TYPE) return null; // The scanner assures that val is non-null for PL_TYPEs. String commandWord = token.val.replaceFirst("\\s.*", ""); if (!inlineNestPLCommands.containsKey(commandWord)) return null; Pattern pattern = inlineNestPLCommands.get(commandWord); Matcher m = pattern.matcher(token.val); return m.matches() ? m : null; } /** * Returns normalized nesting command String, like "if" or "foreach". * If command is not a nesting command, returns null; * If there's a proper command String, but the entire PL command is * malformatted, throws. */ private String nestingCommand(Token token) throws BadSpecial { if (token.type != Token.PL_TYPE) return null; // The scanner assures that val is non-null for PL_TYPEs. String commandWord = token.val.replaceFirst("\\s.*", ""); if (!nestingPLCommands.containsKey(commandWord)) return null; Pattern pattern = nestingPLCommands.get(commandWord); if (pattern.matcher(token.val).matches()) return commandWord; throw new BadSpecial(SqltoolRB.pl_malformat.getString()); } /** * Sets sqlExpandMode to true if any end-user userVar is set. */ private void setSqlExpandMode() { for (String key : shared.userVars.keySet()) { if (key.charAt(0) != '*' && !key.equals("?")) { sqlExpandMode = Boolean.TRUE; return; } } sqlExpandMode = Boolean.FALSE; } synchronized protected void scanpass(TokenSource ts) throws SqlToolError, SQLException { boolean rollbackUncoms = true; String nestingCommand; Matcher inlineNestMatcher; Token token = null; sqlExpandMode = null; try { while (true) try { if (preempt) { token = buffer; preempt = false; } else { token = ts.yylex(); logger.finest("SqlFile got new token: " + token); } if (token == null) break; inlineNestMatcher = inlineNestMatcher(token); if (inlineNestMatcher != null) { processInlineBlock(token, inlineNestMatcher.group(1), inlineNestMatcher.group(2)); processBlock(token); continue; } nestingCommand = nestingCommand(token); if (nestingCommand != null) { if (token.nestedBlock == null) token.nestedBlock = seekTokenSource(nestingCommand); /* This command (and the same recursive call inside * of the seekTokenSource() method) ensure that all * "blocks" are tokenized immediately as block * commands are encountered, and the blocks are * tokenized in their entirety all the way to the * leaves. */ processBlock(token); /* processBlock recurses through scanpass(), * which processes the nested commands which have * (in all cases) already beeen tokenized. */ continue; } switch (token.type) { case Token.SYNTAX_ERR_TYPE: throw new SqlToolError( SqltoolRB.input_malformat.getString()); // Will get here if Scanner can't match input to any // known command type. // An easy way to get here is to start a command with // quotes. case Token.UNTERM_TYPE: throw new SqlToolError( SqltoolRB.input_unterminated.getString( token.val)); case Token.RAW_TYPE: case Token.RAWEXEC_TYPE: /* * A real problem in this block is that the Scanner * has already displayed the next prompt at this * point. We handle this specially within this * block, but if we throw, the handler will not * know that the prompt has to be re-displayed. * I.e., KNOWN ISSUE: For some errors caught during * raw command execution, interactive users will not * get a prompt to tell them to proceed. */ if (token.val == null) token.val = ""; /* * Don't have time know to figure out whether it would * ever be useful to send just (non-zero) whitespace * to the DB. Prohibiting for now. */ if (token.val.trim().length() < 1) throw new SqlToolError( SqltoolRB.raw_empty.getString()); int receivedType = token.type; token.type = Token.SQL_TYPE; if (setBuf(token) && receivedType == Token.RAW_TYPE && interactive) { stdprintln(""); stdprintln(SqltoolRB.raw_movedtobuffer.getString()); stdprint(primaryPrompt); // All of these stdprint*'s are to work around a // very complicated issue where the Scanner // has already displayed the next prompt before // we can display our status message. } if (receivedType == Token.RAWEXEC_TYPE) { historize(); Statement statement = processSQL(); ResultSet rs = null; if (statement != null) { try { rs = statement.getResultSet(); } catch (SQLException se) { try { if (statement != null) statement.close(); } catch (SQLException nse) { // Purposefully doing nothing } finally { statement = null; } throw se; // rethrow } displaySqlResults( statement, rs, null, null, true); } } continue; case Token.MACRO_TYPE: processMacro(token); continue; case Token.PL_TYPE: // Storing prevToken as an attempted hack prevToken = buffer; setBuf(token); historize(); processPL(); continue; case Token.SPECIAL_TYPE: // Storing prevToken as an attempted hack prevToken = buffer; setBuf(token); historize(); processSpecial(null); continue; case Token.EDIT_TYPE: // Scanner only returns EDIT_TYPEs in interactive mode processBuffHist(token); continue; case Token.BUFFER_TYPE: token.type = Token.SQL_TYPE; if (setBuf(token)) stdprintln( SqltoolRB.input_movedtobuffer.getString()); continue; case Token.SQL_TYPE: if (token.val == null) token.val = ""; setBuf(token); historize(); Statement statement = processSQL(); ResultSet rs = null; if (statement != null) { try { rs = statement.getResultSet(); } catch (SQLException se) { try { if (statement != null) statement.close(); } catch (SQLException nse) { // Purposefully doing nothing } finally { statement = null; } throw se; // rethrow } displaySqlResults( statement, rs, null, null, true); } continue; default: assert false : "Internal assertion failed. Unexpected token type: " + token.getTypeString(); } } catch (BadSpecial bs) { // BadSpecials ALWAYS have non-null getMessage(). if (token == null) { errprintln(SqltoolRB.errorat.getString( inputStreamLabel, "?", "?", bs.getMessage())); } else { errprintln(SqltoolRB.errorat.getString( inputStreamLabel, Integer.toString(token.line), token.reconstitute(), bs.getMessage(), bs.getMessage())); } Throwable cause = bs.getCause(); if (cause != null) errprintln(SqltoolRB.causereport.getString(cause)); if (!continueOnError) throw new SqlToolError(bs); } catch (SQLException se) { //se.printStackTrace(); errprintln("SQL " + SqltoolRB.errorat.getString( inputStreamLabel, ((token == null) ? "?" : Integer.toString(token.line)), lastSqlStatement, se.getMessage())); // It's possible that we could have // SQLException.getMessage() == null, but if so, I think // it reasonable to show "null". That's a DB inadequacy. if (!continueOnError) throw se; } catch (BreakException be) { String msg = be.getMessage(); if (recursed != null) { rollbackUncoms = false; // Recursion level will exit by rethrowing the BE. // We set rollbackUncoms to false because only the // top level should detect break errors and // possibly roll back. } else if (msg == null || msg.equals("file")) { break; } else { errprintln(SqltoolRB.break_unsatisfied.getString(msg)); } if (recursed != null || !continueOnError) throw be; } catch (ContinueException ce) { String msg = ce.getMessage(); if (recursed != null) { rollbackUncoms = false; } else { errprintln(SqltoolRB.continue_unsatisfied.getString(msg)); } if (recursed != null || !continueOnError) throw ce; } catch (QuitNow qn) { throw qn; } catch (SqlToolError ste) { StringBuffer sb = new StringBuffer(SqltoolRB.errorat.getString( /* WARNING: I have removed an extra LS appended to * non-null ste.getMessages() below because I believe that * it is unnecessary (and causes inconsistent blank lines * to be written). * If I am wrong and this is needed for Scanner display or * something, restore it. */ ((token == null) ? (new String[] { inputStreamLabel, "?", "?", ((ste.getMessage() == null) ? "" : ste.getMessage()) }) : (new String[] { inputStreamLabel, Integer.toString(token.line), ((token.val == null) ? "" : token.reconstitute()), ((ste.getMessage() == null) ? "" : ste.getMessage()) })) )); Throwable cause = ste.getCause(); errprintln((cause == null) ? sb.toString() : SqltoolRB.causereport.getString(cause)); if (!continueOnError) throw ste; } rollbackUncoms = false; // Exiting gracefully, so don't roll back. } catch (IOException ioe) { throw new SqlToolError( SqltoolRB.primaryinput_accessfail.getString(), ioe); } catch (QuitNow qn) { if (recursed != null) throw qn; // Will rollback if conditions otherwise require. // Otherwise top level will decide based upon qn.getMessage(). rollbackUncoms = (qn.getMessage() != null); if (rollbackUncoms) { errprintln(SqltoolRB.aborting.getString(qn.getMessage())); throw new SqlToolError(qn.getMessage()); } return; } finally { if (fetchingVar != null) { errprintln(SqltoolRB.plvar_set_incomplete.getString( fetchingVar)); fetchingVar = null; rollbackUncoms = true; } if (shared.jdbcConn != null) { if (shared.jdbcConn.getAutoCommit()) shared.possiblyUncommitteds = false; if (rollbackUncoms && shared.possiblyUncommitteds) { errprintln(SqltoolRB.rollingback.getString()); shared.jdbcConn.rollback(); shared.possiblyUncommitteds = false; } } } } /** * Utility nested Exception class for internal use only. * * Do not instantiate with null message. */ private static class BadSpecial extends AppendableException { static final long serialVersionUID = 7162440064026570590L; BadSpecial(String s) { super(s); assert s != null: "Must construct BadSpecials with non-null message"; } BadSpecial(String s, Throwable t) { super(s, t); assert s != null: "Must construct BadSpecials with non-null message"; } } /** * Utility nested Exception class for internal use. * This must extend SqlToolError because it has to percolate up from * recursions of SqlTool.execute(), yet SqlTool.execute() is public. * Therefore, external users have no reason to specifically handle * QuitNow. */ private class QuitNow extends SqlToolError { static final long serialVersionUID = 1811094258670900488L; public QuitNow(String s) { super(s); } public QuitNow() { super(); } } /** * Utility nested Exception class for internal use. * This must extend SqlToolError because it has to percolate up from * recursions of SqlTool.execute(), yet SqlTool.execute() is public. * Therefore, external users have no reason to specifically handle * BreakException. */ private class BreakException extends SqlToolError { static final long serialVersionUID = 351150072817675994L; public BreakException() { super(); } public BreakException(String s) { super(s); } } /** * Utility nested Exception class for internal use. * This must extend SqlToolError because it has to percolate up from * recursions of SqlTool.execute(), yet SqlTool.execute() is public. * Therefore, external users have no reason to specifically handle * ContinueException. */ private class ContinueException extends SqlToolError { static final long serialVersionUID = 5064604160827106014L; public ContinueException() { super(); } public ContinueException(String s) { super(s); } } /** * Utility nested Exception class for internal use only. */ private class BadSubst extends Exception { static final long serialVersionUID = 7325933736897253269L; BadSubst(String s) { super(s); } } /** * Utility nested Exception class for internal use only. */ private class RowError extends AppendableException { static final long serialVersionUID = 754346434606022750L; RowError(String s) { super(s); } /* Unused so far RowError(Throwable t) { this(null, t); } */ RowError(String s, Throwable t) { super(s, t); } } /** * Process a Buffer/History Command. * * Due to the nature of the goal here, we don't trim() "other" like * we do for other kinds of commands. * * @param inString Complete command, less the leading ':' character. * @throws SQLException thrown by JDBC driver. * @throws BadSpecial special-command-specific errors. * @throws SqlToolError all other errors. */ private void processBuffHist(Token token) throws BadSpecial, SQLException, SqlToolError { if (token.val.length() < 1) throw new BadSpecial(SqltoolRB.bufhist_unspecified.getString()); // First handle the simple cases where user may not specify a // command number. char commandChar = token.val.charAt(0); String other = token.val.substring(1); if (other.trim().length() == 0) other = null; switch (commandChar) { case 'l' : case 'b' : if (other != null) throw new BadSpecial( SqltoolRB.special_extrachars.getString("l", other)); if (buffer == null) { stdprintln(nobufferYetString); } else { stdprintln(SqltoolRB.editbuffer_contents.getString( buffer.reconstitute())); } return; case 'h' : if (other != null) throw new BadSpecial( SqltoolRB.special_extrachars.getString("h", other)); showHistory(); return; case '?' : stdprintln(SqltoolRB.buffer_help.getString()); return; } Integer histNum = null; Matcher hm = slashHistoryPattern.matcher(token.val); if (hm.matches()) { histNum = historySearch(hm.group(1)); if (histNum == null) { stdprintln(SqltoolRB.substitution_nomatch.getString()); return; } } else { hm = historyPattern.matcher(token.val); if (!hm.matches()) throw new BadSpecial(SqltoolRB.edit_malformat.getString()); // Empirically, I find that this pattern always captures two // groups. Unfortunately, there's no way to guarantee that :( . histNum = ((hm.group(1) == null || hm.group(1).length() < 1) ? null : Integer.valueOf(hm.group(1))); } if (hm.groupCount() != 2) throw new BadSpecial(SqltoolRB.edit_malformat.getString()); // Empirically, I find that this pattern always captures two // groups. Unfortunately, there's no way to guarantee that :( . commandChar = ((hm.group(2) == null || hm.group(2).length() < 1) ? '\0' : hm.group(2).charAt(0)); other = ((commandChar == '\0') ? null : hm.group(2).substring(1)); if (other != null && other.trim().length() < 1) other = null; Token targetCommand = ((histNum == null) ? null : commandFromHistory(histNum.intValue())); // Every command below depends upon buffer content. switch (commandChar) { case '\0' : // Special token set above. Just history recall. setBuf(targetCommand); stdprintln(SqltoolRB.buffer_restored.getString( buffer.reconstitute())); return; case ';' : if (other != null) throw new BadSpecial( SqltoolRB.special_extrachars.getString(";", other)); if (targetCommand != null) setBuf(targetCommand); if (buffer == null) throw new BadSpecial( SqltoolRB.nobuffer_yet.getString()); stdprintln(SqltoolRB.buffer_executing.getString( buffer.reconstitute())); preempt = true; return; case 'a' : if (targetCommand == null) targetCommand = buffer; if (targetCommand == null) throw new BadSpecial( SqltoolRB.nobuffer_yet.getString()); boolean doExec = false; if (other != null) { if (other.trim().charAt(other.trim().length() - 1) == ';') { other = other.substring(0, other.lastIndexOf(';')); if (other.trim().length() < 1) throw new BadSpecial( SqltoolRB.append_empty.getString()); doExec = true; } } Token newToken = new Token(targetCommand.type, targetCommand.val, targetCommand.line); if (other != null) newToken.val += other; setBuf(newToken); if (doExec) { stdprintln(SqltoolRB.buffer_executing.getString( buffer.reconstitute())); preempt = true; return; } if (interactive) scanner.setMagicPrefix( newToken.reconstitute()); switch (newToken.type) { case Token.SQL_TYPE: scanner.setRequestedState(SqlFileScanner.SQL); break; case Token.SPECIAL_TYPE: scanner.setRequestedState(SqlFileScanner.SPECIAL); break; case Token.PL_TYPE: scanner.setRequestedState(SqlFileScanner.PL); break; default: assert false: "Internal assertion failed. " + "Appending to unexpected type: " + newToken.getTypeString(); } scanner.setCommandBuffer(newToken.val); return; case 'w' : if (targetCommand == null) targetCommand = buffer; if (targetCommand == null) throw new BadSpecial( SqltoolRB.nobuffer_yet.getString()); if (other == null) throw new BadSpecial(SqltoolRB.destfile_demand.getString()); String targetFile = dereferenceAt(dereference(other.trim(), false)); // Dereference and trim the target file name // This is the only case where we dereference a : command. PrintWriter pw = null; try { pw = new PrintWriter( new OutputStreamWriter( new FileOutputStream(targetFile, true), (shared.encoding == null) ? DEFAULT_FILE_ENCODING : shared.encoding) // Appendmode so can append to an SQL script. ); pw.println(targetCommand.reconstitute(true)); pw.flush(); } catch (Exception e) { throw new BadSpecial(SqltoolRB.file_appendfail.getString( targetFile), e); } finally { if (pw != null) try { pw.close(); } finally { pw = null; // Encourage GC of buffers } } return; case 's' : boolean modeExecute = false; boolean modeGlobal = false; if (targetCommand == null) targetCommand = buffer; if (targetCommand == null) throw new BadSpecial( SqltoolRB.nobuffer_yet.getString()); try { if (other == null || other.length() < 3) throw new BadSubst( SqltoolRB.substitution_malformat.getString()); Matcher m = substitutionPattern.matcher(other); if (!m.matches()) throw new BadSubst( SqltoolRB.substitution_malformat.getString()); // Note that this pattern does not include the leading ':'. assert m.groupCount() > 2 && m.groupCount() < 5 : "Internal assertion failed. " + "Matched substitution pattern, but captured " + m.groupCount() + " groups"; String optionGroup = ( (m.groupCount() > 3 && m.group(4) != null) ? (new String(m.group(4))) : null); if (optionGroup != null) { if (optionGroup.indexOf(';') > -1) { modeExecute = true; optionGroup = optionGroup.replaceFirst(";", ""); } if (optionGroup.indexOf('g') > -1) { modeGlobal = true; optionGroup = optionGroup.replaceFirst("g", ""); } } Matcher bufferMatcher = Pattern.compile("(?s" + ((optionGroup == null) ? "" : optionGroup) + ')' + m.group(2)).matcher(targetCommand.val); Token newBuffer = new Token(targetCommand.type, (modeGlobal ? bufferMatcher.replaceAll(m.group(3)) : bufferMatcher.replaceFirst(m.group(3))), targetCommand.line); if (newBuffer.val.equals(targetCommand.val)) { stdprintln(SqltoolRB.substitution_nomatch.getString()); return; } setBuf(newBuffer); stdprintln(modeExecute ? SqltoolRB.buffer_executing.getString( buffer.reconstitute()) : SqltoolRB.editbuffer_contents.getString( buffer.reconstitute()) ); } catch (PatternSyntaxException pse) { throw new BadSpecial( SqltoolRB.substitution_syntax.getString(), pse); } catch (BadSubst badswitch) { throw new BadSpecial( SqltoolRB.substitution_syntax.getString()); } if (modeExecute) preempt = true; return; } throw new BadSpecial(SqltoolRB.buffer_unknown.getString( Character.toString(commandChar))); } private void enforce1charSpecial(String tokenString, char command) throws BadSpecial { if (tokenString.length() != 1) throw new BadSpecial(SqltoolRB.special_extrachars.getString( Character.toString(command), tokenString.substring(1))); } /** * Process a Special Command. * * @param inString TRIMMED, no-null command (without leading \), * or null to operate on buffer. * @throws SQLException thrown by JDBC driver. * @throws BadSpecial special-command-specific errors. * @throws SqlToolError all other errors, plus QuitNow, * BreakException, ContinueException. */ private void processSpecial(String inString) throws BadSpecial, QuitNow, SQLException, SqlToolError { String string = (inString == null) ? buffer.val : inString; if (string.length() < 1) throw new BadSpecial(SqltoolRB.special_unspecified.getString()); Matcher m = specialPattern.matcher(dereference(string, false)); if (!m.matches()) throw new BadSpecial(SqltoolRB.special_malformat.getString()); // I think it's impossible to get here, since the pattern is // so liberal. assert m.groupCount() > 0 && m.groupCount() < 3: "Internal assertion failed. Pattern matched, yet captured " + m.groupCount() + " groups"; String arg1 = m.group(1); // If other count > 1 and group(2) not null, then it is non-empty. String other = ((m.groupCount() > 1) ? m.group(2) : null); switch (arg1.charAt(0)) { case 'q' : enforce1charSpecial(arg1, 'q'); if (other != null) throw new QuitNow(other.trim()); throw new QuitNow(); case 'H' : case 'h' : enforce1charSpecial(arg1, 'h'); htmlMode = (other == null) ? (!htmlMode) : Boolean.parseBoolean(other.trim()); shared.psStd.println(SqltoolRB.html_mode.getString( Boolean.toString(htmlMode))); return; case 'm' : if (arg1.equals("m?") || arg1.equals("mq?") || (other != null && other.trim().equals("?") && (arg1.equals("m") || arg1.equals("mq")))) { stdprintln(DSV_OPTIONS_TEXT + LS + DSV_M_SYNTAX_MSG); return; } shared.userVars.remove("?"); requireConnection(); if ((!arg1.equals("mq") && arg1.length() != 1) || other == null) throw new BadSpecial(DSV_M_SYNTAX_MSG); other = other.trim(); String skipPrefix = dsvSkipPrefix; if (other.charAt(other.length() - 1) == '*') { other = other.substring(0, other.length()-1).trim(); if (other.length() < 1) throw new BadSpecial(DSV_M_SYNTAX_MSG); skipPrefix = null; } csvStyleQuoting = arg1.equals("mq"); try { importDsv(dereferenceAt(other), skipPrefix); } finally { csvStyleQuoting = false; } shared.userVars.put("?", ""); return; case 'x' : if (arg1.equals("x?") || arg1.equals("xq?") || (other != null && other.trim().equals("?") && (arg1.equals("x") || arg1.equals("xq")))) { stdprintln(DSV_OPTIONS_TEXT + LS + DSV_X_SYNTAX_MSG); return; } shared.userVars.remove("?"); requireConnection(); try { if ((!arg1.equals("xq") && arg1.length() != 1) || other == null) throw new BadSpecial(DSV_X_SYNTAX_MSG); String tableName = null; StringBuilder query = new StringBuilder(); // Due to regex, other does contain at least one \S. if (other.trim().charAt(0) == ':') { // Case 1: Query from Edit-buffer if (prevToken == null) throw new BadSpecial(nobufferYetString); query.append(prevToken.val) .append(other.substring(other.indexOf(':')+1)); } else if (wordAndDotPattern.matcher( other.trim()).matches()) { // Case 2: Table name specified tableName = other.trim(); query.append("SELECT * FROM ").append(tableName); } else { // Case 3: Explicit in-line query query.append(other.trim()); } if (dsvTargetFile == null && tableName == null) throw new BadSpecial( SqltoolRB.dsv_targetfile_demand.getString()); ResultSet rs = null; Statement st = null; File dsvFile = null; csvStyleQuoting = arg1.equals("xq"); try { dsvFile = new File((dsvTargetFile == null) ? (tableName + (csvStyleQuoting ? ".csv" : ".dsv")) : dereferenceAt(dsvTargetFile)); pwDsv = new PrintWriter(new OutputStreamWriter( new FileOutputStream(dsvFile), (shared.encoding == null) ? DEFAULT_FILE_ENCODING : shared.encoding)); st = shared.jdbcConn.createStatement(); rs = st.executeQuery(query.toString()); List colList = new ArrayList(); int[] incCols = null; if (dsvSkipCols != null) { Set skipCols = new HashSet(); for (String s : dsvSkipCols.split( "\\Q" + dsvColDelim, -1)) { // Don't know if better to use dsvColDelim or // dsvColSplitter. Going with former, since the // latter should not need to be set for eXporting // (only importing). skipCols.add(s.trim().toLowerCase()); } ResultSetMetaData rsmd = rs.getMetaData(); for (int i = 1; i <= rsmd.getColumnCount(); i++) { if (!skipCols.remove(rsmd.getColumnName(i) .toLowerCase())) colList.add(Integer.valueOf(i)); } if (colList.size() < 1) throw new BadSpecial( SqltoolRB.dsv_nocolsleft.getString( dsvSkipCols)); if (skipCols.size() > 0) throw new BadSpecial( SqltoolRB.dsv_skipcols_missing.getString( skipCols.toString())); incCols = new int[colList.size()]; for (int i = 0; i < incCols.length; i++) incCols[i] = colList.get(i).intValue(); } displaySqlResults(st, rs, incCols, null, true); } finally { csvStyleQuoting = false; if (rs != null) try { rs.close(); } catch (SQLException se) { // Purposefully empty } finally { rs = null; } if (st != null) try { st.close(); } catch (SQLException se) { // Purposefully empty } finally { st = null; } } pwDsv.flush(); stdprintln(SqltoolRB.file_wrotechars.getString( Long.toString(dsvFile.length()), dsvFile.toString())); } catch (FileNotFoundException e) { throw new BadSpecial(SqltoolRB.file_writefail.getString( other), e); } catch (UnsupportedEncodingException e) { throw new BadSpecial(SqltoolRB.file_writefail.getString( other), e); } finally { // Reset all state changes if (pwDsv != null) try { pwDsv.close(); } finally { pwDsv = null; // Encourage GC of buffers } } return; case 'd' : if (arg1.equals("d?") || (arg1.equals("d") && other != null && other.trim().equals("?"))) { stdprintln(D_OPTIONS_TEXT); return; } requireConnection(); if (arg1.length() == 2) { listTables(arg1.charAt(1), (other == null) ? null : other.trim()); return; } if (arg1.length() == 1 && other != null) try { other = other.trim(); int space = other.indexOf(' '); if (space < 0) { describe(other, null); } else { describe(other.substring(0, space), other.substring(space + 1).trim()); } return; } catch (SQLException se) { throw new BadSpecial( SqltoolRB.metadata_fetch_fail.getString(), se); } throw new BadSpecial(SqltoolRB.special_d_like.getString()); case 'o' : boolean addFooter = arg1.equals("oc"); if (addFooter) arg1 = "o"; enforce1charSpecial(arg1, 'o'); if (other == null) { if (pwQuery == null) throw new BadSpecial( SqltoolRB.outputfile_nonetoclose.getString()); if (addFooter) writeFooter(pwQuery, "(the HTML report file)"); closeQueryOutputStream(); return; } other = other.trim(); if (pwQuery != null) { shared.psStd.println( SqltoolRB.outputfile_reopening.getString()); closeQueryOutputStream(); } String filePath = dereferenceAt(other); boolean preExists = new File(filePath).exists(); try { pwQuery = new PrintWriter(new OutputStreamWriter( new FileOutputStream(filePath, true), (shared.encoding == null) ? DEFAULT_FILE_ENCODING : shared.encoding)); } catch (Exception e) { throw new BadSpecial(SqltoolRB.file_writefail.getString( filePath), e); } /* Opening in append mode, so it's possible that we will * be adding superfluous and tags. * I think that browsers can handle that */ if (htmlMode && !preExists) writeHeader(pwQuery, filePath); pwQuery.flush(); return; case 'i' : enforce1charSpecial(arg1, 'i'); if (other == null) throw new BadSpecial( SqltoolRB.sqlfile_name_demand.getString()); other = other.trim(); sqlExpandMode = null; try { new SqlFile(this, new File(dereferenceAt(other))).execute(); } catch (ContinueException ce) { throw ce; } catch (BreakException be) { String beMessage = be.getMessage(); // Handle "file" and plain breaks (by doing nothing) if (beMessage != null && !beMessage.equals("file")) throw be; } catch (QuitNow qn) { throw qn; } catch (Exception e) { throw new BadSpecial( SqltoolRB.sqlfile_execute_fail.getString(other), e); } updateUserSettings(); return; case 'p' : if (arg1.equals("pr")) { if (other == null) { if (shared.psStd != null) shared.psStd.println(); if (pwQuery != null) { pwQuery.println(); pwQuery.flush(); } } else { shared.psStd.println(other); if (pwQuery != null) { pwQuery.println(other); pwQuery.flush(); } } return; } enforce1charSpecial(arg1, 'p'); if (other == null) { stdprintln(true); } else { stdprintln(other.trim(), true); } return; case 'l' : if ((arg1.equals("l?") && other == null) || (arg1.equals("l") && other != null && other.equals("?"))) { stdprintln(SqltoolRB.log_syntax.getString()); } else { enforce1charSpecial(arg1, 'l'); Matcher logMatcher = ((other == null) ? null : logPattern.matcher(other.trim())); if (logMatcher == null || (!logMatcher.matches())) throw new BadSpecial( SqltoolRB.log_syntax_error.getString()); String levelString = logMatcher.group(1); Level level = null; if (levelString.equalsIgnoreCase("FINER")) level = Level.FINER; else if (levelString.equalsIgnoreCase("WARNING")) level = Level.WARNING; else if (levelString.equalsIgnoreCase("SEVERE")) level = Level.SEVERE; else if (levelString.equalsIgnoreCase("INFO")) level = Level.INFO; else if (levelString.equalsIgnoreCase("FINEST")) level = Level.FINEST; assert level != null: "Internal assertion failed. " + " Unexpected Level string: " + levelString; logger.enduserlog(level, logMatcher.group(2)); } return; case 'a' : requireConnection(); enforce1charSpecial(arg1, 'a'); if (other != null) { other = other.trim(); shared.jdbcConn.setAutoCommit( Boolean.parseBoolean(other)); shared.possiblyUncommitteds = false; } stdprintln(SqltoolRB.a_setting.getString( Boolean.toString(shared.jdbcConn.getAutoCommit()))); return; case 'j' : try { enforce1charSpecial(arg1, 'j'); String urlid = null; String acct = null; String pwd = null; String url = null; boolean goalAutoCommit = false; String[] tokens = (other == null) ? (new String[0]) : other.trim().split("\\s+", 3); switch (tokens.length) { case 0: break; case 1: urlid = tokens[0]; break; case 2: acct = tokens[0]; pwd = ""; // default password to "" url = tokens[1]; break; case 3: acct = tokens[0]; pwd = tokens[1]; url = tokens[2]; break; } if (tokens.length > 0) { // Close current connection if (shared.jdbcConn != null) try { goalAutoCommit = shared.jdbcConn.getAutoCommit(); shared.jdbcConn.close(); shared.possiblyUncommitteds = false; shared.jdbcConn = null; stdprintln(SqltoolRB.disconnect_success.getString()); } catch (SQLException se) { throw new BadSpecial( SqltoolRB.disconnect_failure.getString(), se); } } if (urlid != null || acct != null) try { if (urlid != null) { shared.jdbcConn = new RCData(new File( SqlTool.DEFAULT_RCFILE), urlid).getConnection(); } else if (acct != null) { shared.jdbcConn = DriverManager.getConnection(url, acct, pwd); } shared.possiblyUncommitteds = false; shared.jdbcConn.setAutoCommit(goalAutoCommit); } catch (Exception e) { throw new BadSpecial( SqltoolRB.connect_failure.getString(), e); } displayConnBanner(); } catch (Throwable t) { t.printStackTrace(); return; } return; case 'v' : requireConnection(); enforce1charSpecial(arg1, 'v'); if (other != null) { other = other.trim(); if (integerPattern.matcher(other).matches()) { shared.jdbcConn.setTransactionIsolation( Integer.parseInt(other)); } else { RCData.setTI(shared.jdbcConn, other); } } stdprintln(SqltoolRB.transiso_report.getString( (shared.jdbcConn.isReadOnly() ? "R/O " : "R/W "), RCData.tiToString( shared.jdbcConn.getTransactionIsolation()))); return; case '=' : requireConnection(); enforce1charSpecial(arg1, '='); shared.jdbcConn.commit(); shared.possiblyUncommitteds = false; stdprintln(SqltoolRB.committed.getString()); return; case 'b' : if (arg1.length() == 1) { if (other != null) throw new BadSpecial( SqltoolRB.special_b_malformat.getString()); fetchBinary = true; return; } if (arg1.charAt(1) == 'p') { if (other != null) throw new BadSpecial( SqltoolRB.special_b_malformat.getString()); doPrepare = true; return; } if ((arg1.charAt(1) != 'd' && arg1.charAt(1) != 'l') || other == null) throw new BadSpecial( SqltoolRB.special_b_malformat.getString()); other = other.trim(); File otherFile = new File(dereferenceAt(other)); try { if (arg1.charAt(1) == 'd') { dump(otherFile); } else { binBuffer = SqlFile.loadBinary(otherFile); stdprintln(SqltoolRB.binary_loadedbytesinto.getString( binBuffer.length)); } } catch (BadSpecial bs) { throw bs; } catch (IOException ioe) { throw new BadSpecial(SqltoolRB.binary_filefail.getString( other), ioe); } return; case 't' : enforce1charSpecial(arg1, '='); if (other != null) // But remember that we have to abort on some I/O errors. reportTimes = Boolean.parseBoolean(other.trim()); stdprintln(SqltoolRB.exectime_reporting.getString( Boolean.toString(reportTimes))); return; case 'c' : enforce1charSpecial(arg1, '='); if (other != null) // But remember that we have to abort on some I/O errors. continueOnError = Boolean.parseBoolean(other.trim()); stdprintln(SqltoolRB.c_setting.getString( Boolean.toString(continueOnError))); return; case '?' : stdprintln(SqltoolRB.special_help.getString()); return; case '!' : /* N.b. This DOES NOT HANDLE UNIX shell wildcards, since there * is no UNIX shell involved. * Doesn't make sense to incur overhead of a shell without * stdin capability. * Could pipe System.in to the forked process, but that's * probably not worth the effort due to Java's terrible * and inescapable System.in buffering. I.e., the forked * program or shell wouldn't get stdin until user hits Enter. * * I'd like to execute the user's default shell if they * ran "\!" with no argument, but (a) there is no portable * way to determine the user's default or login shell; and * (b) shell is useless without stdin ability. */ InputStream stream; byte[] ba = new byte[1024]; String extCommand = ((arg1.length() == 1) ? "" : arg1.substring(1)) + ((arg1.length() > 1 && other != null) ? " " : "") + ((other == null) ? "" : other.trim()); if (extCommand.trim().length() < 1) throw new BadSpecial(SqltoolRB.bang_incomplete.getString()); Process proc = null; try { Runtime runtime = Runtime.getRuntime(); proc = ((wincmdPattern == null) ? runtime.exec(extCommand) : runtime.exec(genWinArgs(extCommand)) ); proc.getOutputStream().close(); int i; stream = proc.getInputStream(); while ((i = stream.read(ba)) > 0) stdprint(new String(ba, 0, i)); stream.close(); stream = proc.getErrorStream(); String s; while ((i = stream.read(ba)) > 0) { s = new String(ba, 0, i); if (s.endsWith(LS)) { // This block just prevents logging of // double-line-breaks. if (s.length() == LS.length()) continue; s = s.substring(0, s.length() - LS.length()); } logger.severe(s); } stream.close(); stream = null; // Encourage buffer GC if (proc.waitFor() != 0 && !ignoreBangStatus) throw new BadSpecial( SqltoolRB.bang_command_fail.getString( extCommand)); } catch (BadSpecial bs) { throw bs; } catch (Exception e) { throw new BadSpecial(SqltoolRB.bang_command_fail.getString( extCommand), e); } finally { if (proc != null) proc.destroy(); } return; } throw new BadSpecial(SqltoolRB.special_unknown.getString( Character.toString(arg1.charAt(0)))); } private static final char[] nonVarChars = { ' ', '\t', '=', '}', '\n', '\r', '\f' }; /** * Returns index specifying 1 past end of a variable name. * * @param inString String containing a variable name * @param startIndex Index within inString where the variable name begins * @return Index within inString, 1 past end of the variable name */ static int pastName(String inString, int startIndex) { String workString = inString.substring(startIndex); int e = inString.length(); // Index 1 past end of var name. int nonVarIndex; for (char nonVarChar : nonVarChars) { nonVarIndex = workString.indexOf(nonVarChar); if (nonVarIndex > -1 && nonVarIndex < e) e = nonVarIndex; } return startIndex + e; } /** * Deference *{} PL variables and ${} System Property variables. * * @throws SqlToolError */ private String dereference(String inString, boolean permitAlias) throws SqlToolError { if (inString.length() < 1) return inString; /* TODO: Rewrite using java.util.regex. */ String varName, varValue; StringBuffer expandBuffer = new StringBuffer(inString); int b, e; // begin and end of name. end really 1 PAST name int iterations; if (permitAlias && inString.trim().charAt(0) == '/') { int slashIndex = inString.indexOf('/'); e = SqlFile.pastName(inString.substring(slashIndex + 1), 0); // In this case, e is the exact length of the var name. if (e < 1) throw new SqlToolError(SqltoolRB.plalias_malformat.getString()); varName = inString.substring(slashIndex + 1, slashIndex + 1 + e); varValue = shared.userVars.get(varName); if (varValue == null) throw new SqlToolError( SqltoolRB.plvar_undefined.getString(varName)); expandBuffer.replace(slashIndex, slashIndex + 1 + e, shared.userVars.get(varName)); } String s; boolean permitUnset; // Permit unset with: ${:varname} // Prohibit unset with : ${varnam} iterations = 0; while (true) { s = expandBuffer.toString(); b = s.indexOf("${"); if (b < 0) break; // No more unexpanded variable uses e = s.indexOf('}', b + 2); if (e == b + 2) throw new SqlToolError(SqltoolRB.sysprop_empty.getString()); if (e < 0) throw new SqlToolError( SqltoolRB.sysprop_unterminated.getString()); permitUnset = (s.charAt(b + 2) == ':'); varName = s.substring(b + (permitUnset ? 3 : 2), e); if (iterations++ > 10000) throw new SqlToolError(SqltoolRB.var_infinite.getString(varName)); varValue = System.getProperty(varName); if (varValue == null) { if (permitUnset) { varValue = ""; } else { throw new SqlToolError( SqltoolRB.sysprop_undefined.getString(varName)); } } expandBuffer.replace(b, e + 1, varValue); } iterations = 0; while (true) { s = expandBuffer.toString(); b = s.indexOf("*{"); if (b < 0) break; // No more unexpanded variable uses e = s.indexOf('}', b + 2); if (e == b + 2) throw new SqlToolError(SqltoolRB.plvar_nameempty.getString()); if (e < 0) throw new SqlToolError( SqltoolRB.plvar_unterminated.getString()); permitUnset = (s.charAt(b + 2) == ':'); varName = s.substring(b + (permitUnset ? 3 : 2), e); if (iterations++ > 100000) throw new SqlToolError( SqltoolRB.var_infinite.getString(varName)); // TODO: Use a smarter algorithm to handle (or prohibit) // recursion without this clumsy detection tactic. varValue = shared.userVars.get(varName); if (varValue == null) { // Key not in map, since never null vals. if (varName.equals("*TIMESTAMP")) { if (timestampFormat == null) throw new SqlToolError( SqltoolRB.no_timestamp_format.getString()); varValue = timestampFormat.format(new java.util.Date()); } else { if (!permitUnset) throw new SqlToolError( SqltoolRB.plvar_undefined.getString(varName)); varValue = ""; } } expandBuffer.replace(b, e + 1, varValue); } return expandBuffer.toString(); } private Boolean sqlExpandMode; // Null indicates dirty. // PL variable name currently awaiting query output. private String fetchingVar; private boolean silentFetch; private boolean fetchBinary; /** * Process a block PL command like "if" or "foreach". * * @throws SQLException only if thrown by *forrows processing. */ private void processBlock(Token token) throws BadSpecial, SqlToolError, SQLException { Matcher m = plPattern.matcher(dereference(token.val, false)); if (!m.matches()) throw new BadSpecial(SqltoolRB.pl_malformat.getString()); // I think it's impossible to get here, since the pattern is // so liberal. if (m.groupCount() < 1 || m.group(1) == null) { stdprintln(SqltoolRB.deprecated_noop.getString("*")); return; } String[] tokens = m.group(1).split("\\s+", -1); if (tokens[0].equals("for")) { Matcher forM = forPattern.matcher( dereference(token.val, false)); if (!forM.matches()) throw new BadSpecial( SqltoolRB.pl_malformat_specific.getString("for")); assert forM.groupCount() == 2 || forM.groupCount() == 3: "Internal assertion failed. " + "forh pattern matched, but captured " + forM.groupCount() + " groups"; String iterableAssignmentStr = forM.group(forM.groupCount()); String logicalExprStr = forM.group(forM.groupCount() - 1); String initAssignmentStr = (forM.groupCount() < 3 || forM.group(1) == null || forM.group(1).trim().length() < 1) ? null : forM.group(1); if (initAssignmentStr != null) try { Matcher mathMatcher = mathAsgnPattern.matcher(initAssignmentStr); if (mathMatcher.matches()) { shared.userVars.put(mathMatcher.group(1), Long.toString( Calculator.reassignValue(mathMatcher.group(1), shared.userVars, mathMatcher.group(2), (mathMatcher.groupCount() < 3) ? null : mathMatcher.group(3)))); } else { mathMatcher = mathPattern.matcher(initAssignmentStr); if (mathMatcher.matches()) shared.userVars.put(mathMatcher.group(1), Long.toString( new Calculator(((mathMatcher.groupCount() > 1 && mathMatcher.group(2) != null) ? mathMatcher.group(2) : ""), shared.userVars).reduce(0, false))); } sqlExpandMode = null; } catch (RuntimeException re) { throw new BadSpecial(SqltoolRB.math_expr_fail.getString(re)); } String[] values = logicalExprStr.substring(1, logicalExprStr.length() - 1) .replaceAll("!([a-zA-Z0-9*])", "! $1"). replaceAll("([a-zA-Z0-9*])!", "$1 !").split("\\s+", -1); try { while (eval(values)) { Recursion origRecursed = recursed; recursed = Recursion.FOR; try { scanpass(token.nestedBlock.dup()); } catch (ContinueException ce) { String ceMessage = ce.getMessage(); if (ceMessage != null && !ceMessage.equals("for")) throw ce; } finally { recursed = origRecursed; } try { Matcher mathMatcher = mathAsgnPattern.matcher(iterableAssignmentStr); if (mathMatcher.matches()) { shared.userVars.put( mathMatcher.group(1), Long.toString( Calculator.reassignValue( mathMatcher.group(1), shared.userVars, mathMatcher.group(2), (mathMatcher.groupCount() < 3) ? null : mathMatcher.group(3)))); } else { mathMatcher = mathPattern.matcher(iterableAssignmentStr); if (mathMatcher.matches()) shared.userVars.put( mathMatcher.group(1), Long.toString( new Calculator( ((mathMatcher.groupCount() > 1 && mathMatcher.group(2) != null) ? mathMatcher.group(2) : ""), shared.userVars).reduce(0, false))); } } catch (RuntimeException re) { throw new BadSpecial( SqltoolRB.math_expr_fail.getString(re)); } // No updateUserSettings since can't modify *System vars sqlExpandMode = null; } } catch (BreakException be) { String beMessage = be.getMessage(); // Handle "for" and plain breaks (by doing nothing) if (beMessage != null && !beMessage.equals("for")) throw be; } catch (QuitNow qn) { throw qn; } catch (RuntimeException re) { throw re; // Unrecoverable } catch (Exception e) { throw new BadSpecial(SqltoolRB.pl_block_fail.getString(), e); } finally { // If we haven't instantiated a new SqlTool, then the following // are unncessary. TODO: Test this and remove if unnecessary. updateUserSettings(); sqlExpandMode = null; } return; } if (tokens[0].equals("forrows")) { Matcher forrowsM = forrowsPattern.matcher( dereference(token.val, false)); if (!forrowsM.matches()) throw new BadSpecial( SqltoolRB.pl_malformat_specific.getString("forrows")); String[] vars = (forrowsM.groupCount() > 0 && forrowsM.group(1) != null && forrowsM.group(1).length() > 0) ? forrowsM.group(1).trim().split("\\s+") : null; String[] origVals = (vars == null) ? null : new String[vars.length]; if (origVals != null) for (int i = 0; i < vars.length; i++) origVals[i] = shared.userVars.get(vars[i]); TokenList dupNesteds = token.nestedBlock.dup(); if (dupNesteds.size() < 2) // TODO: Define message throw new BadSpecial("Empty forrows loop"); Token queryToken = dupNesteds.remove(0); if (queryToken.type != Token.SQL_TYPE) // TODO: Define message throw new BadSpecial("*forrows command not followed " + "immediately by an SQL statement"); setBuf(queryToken); List rowData = new ArrayList(); Statement statement = processSQL(); ResultSet rs = null; if (statement == null) // TODO: Define message throw new BadSpecial("Failed to prepare SQL for loop"); int colCount = 0; try { rs = statement.getResultSet(); ResultSetMetaData rsmd = rs.getMetaData(); colCount = rsmd.getColumnCount(); if (vars != null && vars.length > colCount) // TODO: Define message throw new BadSpecial("*forrows command specifies " + vars.length + " variables, but query pulled only " + colCount + " columns"); if (colCount < 1) return; String[] rowCells; while (rs.next()) { rowCells = new String[colCount]; rowData.add(rowCells); for (int i = 1; i <= colCount; i++) rowCells[i-1] = rs.getString(i); } } finally { try { if (rs != null) rs.close(); } catch (SQLException nse) { // Purposefully doing nothing } finally { rs = null; } try { if (statement != null) statement.close(); } catch (SQLException nse) { // Purposefully doing nothing } finally { statement = null; } } lastSqlStatement = null; // Done with SQL if (rowData.size() > 0) { String firstVal = rowData.get(0)[0]; String lastVal = rowData.get(rowData.size()-1)[colCount - 1]; shared.userVars.put("?", (lastVal == null) ? nullRepToken : lastVal); if (fetchingVar != null) { if (firstVal == null) shared.userVars.remove(fetchingVar); else shared.userVars.put(fetchingVar, firstVal); updateUserSettings(); sqlExpandMode = null; fetchingVar = null; } } else { shared.userVars.put("?", ""); } StringBuilder rowBuilder = new StringBuilder(); String rowVal; try { for (String[] cells : rowData) { if (cells.length == 1) { rowVal = (cells[0] == null) ? nullRepToken : cells[0]; } else { rowBuilder.setLength(0); for (String s : cells) { if (rowBuilder.length() > 0) rowBuilder.append(dsvColDelim); rowBuilder.append((s == null) ? nullRepToken : s); } rowVal = rowBuilder.toString(); } shared.userVars.put("*ROW", rowVal); if (vars != null) for (int i = 0; i < vars.length; i++) if (cells[i] == null) shared.userVars.remove(vars[i]); else shared.userVars.put(vars[i], cells[i]); updateUserSettings(); Recursion origRecursed = recursed; recursed = Recursion.FORROWS; try { scanpass(dupNesteds.dup()); } catch (ContinueException ce) { String ceMessage = ce.getMessage(); if (ceMessage != null && !ceMessage.equals("forrows")) throw ce; } finally { recursed = origRecursed; } } } catch (BreakException be) { String beMessage = be.getMessage(); // Handle "forrows" and plain breaks (by doing nothing) if (beMessage != null && !beMessage.equals("forrows")) throw be; } catch (QuitNow qn) { throw qn; } catch (RuntimeException re) { throw re; // Unrecoverable } catch (Exception e) { throw new BadSpecial(SqltoolRB.pl_block_fail.getString(), e); } finally { shared.userVars.remove("*ROW"); if (origVals != null) for (int i = 1; i < origVals.length; i++) if (origVals[i] == null) shared.userVars.remove(vars[i]); else shared.userVars.put(vars[i], origVals[i]); updateUserSettings(); sqlExpandMode = null; } return; } if (tokens[0].equals("foreach")) { Matcher foreachM = foreachPattern.matcher( dereference(token.val, false)); if (!foreachM.matches()) throw new BadSpecial( SqltoolRB.pl_malformat_specific.getString("foreach")); if (foreachM.groupCount() != 2) assert foreachM.groupCount() == 2: "Internal assertion failed. " + "foreach pattern matched, but captured " + foreachM.groupCount() + " groups"; String varName = foreachM.group(1); if (varName.indexOf(':') > -1) throw new BadSpecial(SqltoolRB.plvar_nocolon.getString()); if (!varPattern.matcher(varName).matches()) errprintln(SqltoolRB.varname_warning.getString(varName)); String[] values = foreachM.group(2).split("\\s+", -1); String origval = shared.userVars.get(varName); try { for (String val : values) { // val may never be null shared.userVars.put(varName, val); updateUserSettings(); Recursion origRecursed = recursed; recursed = Recursion.FOREACH; try { scanpass(token.nestedBlock.dup()); } catch (ContinueException ce) { String ceMessage = ce.getMessage(); if (ceMessage != null && !ceMessage.equals("foreach")) throw ce; } finally { recursed = origRecursed; } } } catch (BreakException be) { String beMessage = be.getMessage(); // Handle "foreach" and plain breaks (by doing nothing) if (beMessage != null && !beMessage.equals("foreach")) throw be; } catch (QuitNow qn) { throw qn; } catch (RuntimeException re) { throw re; // Unrecoverable } catch (Exception e) { throw new BadSpecial(SqltoolRB.pl_block_fail.getString(), e); } finally { if (origval == null) { shared.userVars.remove(varName); } else { shared.userVars.put(varName, origval); } updateUserSettings(); sqlExpandMode = null; } return; } if (tokens[0].equals("if") || tokens[0].equals("while")) { Matcher ifwhileM= ifwhilePattern.matcher( dereference(token.val, false)); if (!ifwhileM.matches()) throw new BadSpecial(SqltoolRB.ifwhile_malformat.getString()); assert ifwhileM.groupCount() == 1: "Internal assertion failed. " + "if/while pattern matched, but captured " + ifwhileM.groupCount() + " groups"; String[] values = ifwhileM.group(1).replaceAll("!([a-zA-Z0-9*])", "! $1"). replaceAll("([a-zA-Z0-9*])!", "$1 !").split("\\s+", -1); if (tokens[0].equals("if")) { try { // Provisionally 'else'. Will be nulled if it is not: Token elseToken = (token.nestedBlock.size() < 1) ? null : token.nestedBlock.get( token.nestedBlock.size() - 1); if (elseToken != null && (elseToken.type != Token.PL_TYPE || !elseToken.val.equals("else"))) elseToken = null; //if (elseToken != null) //token.nestedBlock.remove(token.nestedBlock.size() - 1); Token recurseToken = eval(values) ? token : elseToken; if (recurseToken != null) { Recursion origRecursed = recursed; recursed = Recursion.IF; try { scanpass(recurseToken.nestedBlock.dup()); } finally { recursed = origRecursed; } } } catch (BreakException be) { String beMessage = be.getMessage(); // Handle "if" and plain breaks (by doing nothing) if (beMessage == null || !beMessage.equals("if")) throw be; } catch (ContinueException ce) { throw ce; } catch (QuitNow qn) { throw qn; } catch (BadSpecial bs) { bs.appendMessage( SqltoolRB.pl_malformat_specific.getString("if")); throw bs; } catch (RuntimeException re) { throw re; // Unrecoverable } catch (Exception e) { throw new BadSpecial( SqltoolRB.pl_block_fail.getString(), e); } } else if (tokens[0].equals("while")) { try { while (eval(values)) { Recursion origRecursed = recursed; recursed = Recursion.WHILE; try { scanpass(token.nestedBlock.dup()); } catch (ContinueException ce) { String ceMessage = ce.getMessage(); if (ceMessage != null && !ceMessage.equals("while")) throw ce; } finally { recursed = origRecursed; } } } catch (BreakException be) { String beMessage = be.getMessage(); // Handle "while" and plain breaks (by doing nothing) if (beMessage != null && !beMessage.equals("while")) throw be; } catch (QuitNow qn) { throw qn; } catch (BadSpecial bs) { bs.appendMessage( SqltoolRB.pl_malformat_specific.getString("while")); throw bs; } catch (RuntimeException re) { throw re; // Unrecoverable } catch (Exception e) { throw new BadSpecial( SqltoolRB.pl_block_fail.getString(), e); } } else { assert false: SqltoolRB.pl_unknown.getString(tokens[0]); } return; } throw new BadSpecial(SqltoolRB.pl_unknown.getString(tokens[0])); } /** * Process a Non-Block Process Language Command. * Nesting not supported yet. * * @param inString Trimmed non-null command without leading * * (may be empty string ""). * @throws BadSpecial special-command-specific errors. * @throws SqlToolError all other errors, plus BreakException and * ContinueException. */ private void processPL() throws BadSpecial, SqlToolError { String string = buffer.val; String dereffed = dereference(string, false); Matcher mathMatcher = mathAsgnPattern.matcher(dereffed); if (mathMatcher.matches()) try { shared.userVars.put(mathMatcher.group(1), Long.toString( Calculator.reassignValue(mathMatcher.group(1), shared.userVars, mathMatcher.group(2), (mathMatcher.groupCount() < 3) ? null : mathMatcher.group(3)))); // No updateUserSettings since can't modify *System vars sqlExpandMode = null; return; } catch (RuntimeException re) { throw new BadSpecial(SqltoolRB.math_expr_fail.getString(re)); } mathMatcher = mathPattern.matcher(dereffed); if (mathMatcher.matches()) try { shared.userVars.put(mathMatcher.group(1), Long.toString( new Calculator(((mathMatcher.groupCount() > 1 && mathMatcher.group(2) != null) ? mathMatcher.group(2) : ""), shared.userVars).reduce(0, false))); // No updateUserSettings since can't modify *System vars sqlExpandMode = null; return; } catch (RuntimeException re) { throw new BadSpecial(SqltoolRB.math_expr_fail.getString(re)); } Matcher m = plPattern.matcher(dereffed); if (!m.matches()) throw new BadSpecial(SqltoolRB.pl_malformat.getString()); // I think it's impossible to get here, since the pattern is // so liberal. if (m.groupCount() < 1 || m.group(1) == null) { stdprintln(SqltoolRB.deprecated_noop.getString("*")); return; } String[] tokens = m.group(1).split("\\s+", -1); if (tokens[0].charAt(0) == '?') { String remainder = tokens[0].substring(1); String msg = null; if (remainder.startsWith("assign") || (tokens.length > 1 && tokens[1].startsWith("assign"))) msg = SqltoolRB.pl_assign.getString(); else if (remainder.equals("control") || (tokens.length > 1 && tokens[1].equals("control"))) msg = SqltoolRB.pl_control.getString(); else msg = SqltoolRB.pl_help.getString(); stdprintln(msg); return; } if (tokens[0].equals("else")) { if (recursed != Recursion.IF) throw new BadSpecial(SqltoolRB.else_without_if.getString()); return; } if (tokens[0].equals("end")) throw new BadSpecial(SqltoolRB.end_noblock.getString()); if (tokens[0].equals("continue")) { if (tokens.length > 1) { if (tokens.length == 2 && (tokens[1].equals("foreach") || tokens[1].equals("forrows") || tokens[1].equals("for") || tokens[1].equals("while"))) throw new ContinueException(tokens[1]); throw new BadSpecial(SqltoolRB.continue_syntax.getString()); } throw new ContinueException(); } if (tokens[0].equals("return")) { if (tokens.length > 1) throw new BadSpecial(SqltoolRB.break_syntax.getString()); throw new BreakException("file"); } if (tokens[0].equals("break")) { if (tokens.length > 1) { if (tokens.length == 2 && (tokens[1].equals("foreach") || tokens[1].equals("forrows") || tokens[1].equals("while") || tokens[1].equals("for") || tokens[1].equals("file"))) throw new BreakException(tokens[1]); throw new BadSpecial(SqltoolRB.break_syntax.getString()); } throw new BreakException(); } if (tokens[0].equals("list") || tokens[0].equals("listvalues") || tokens[0].equals("listsysprops")) { boolean sysProps =tokens[0].equals("listsysprops"); String s; boolean doValues = (tokens[0].equals("listvalues") || sysProps); // Always list System Property values. // They are unlikely to be very long, like PL variables may be. if (tokens.length == 1) { stdprint(formatNicely( (sysProps ? System.getProperties() : shared.userVars), doValues)); } else { if (doValues) { stdprintln(SqltoolRB.pl_list_parens.getString()); } else { stdprintln(SqltoolRB.pl_list_lengths.getString()); } for (String token : tokens) { s = (String) (sysProps ? System.getProperties() : shared.userVars).get(token); if (s == null) continue; stdprintln(" " + token + ": " + (doValues ? ("(" + s + ')') : Integer.toString(s.length()))); } } return; } if (tokens[0].equals("dump") || tokens[0].equals("load")) { if (tokens.length != 3) throw new BadSpecial(SqltoolRB.dumpload_malformat.getString()); String varName = tokens[1]; if (varName.indexOf(':') > -1) throw new BadSpecial(SqltoolRB.plvar_nocolon.getString()); File dlFile = new File(dereferenceAt(tokens[2])); try { if (tokens[0].equals("dump")) { dump(varName, dlFile); } else { load(varName, dlFile, shared.encoding); } } catch (IOException ioe) { throw new BadSpecial(SqltoolRB.dumpload_fail.getString( varName, dlFile.toString()), ioe); } return; } if (tokens[0].equals("prepare")) { if (tokens.length != 2) throw new BadSpecial( SqltoolRB.pl_malformat_specific.getString("prepare")); if (shared.userVars.get(tokens[1]) == null) throw new BadSpecial( SqltoolRB.plvar_undefined.getString(tokens[1])); prepareVar = tokens[1]; doPrepare = true; return; } if (tokens[0].equals("-")) { // We do not consider it an error to remove a non-existent // variable. if (tokens.length != 2) throw new BadSpecial( SqltoolRB.pl_unset_nomoreargs.getString()); if (fetchingVar != null && fetchingVar.equals(tokens[1])) fetchingVar = null; if (tokens[1].equals("*ENCODING")) try { // Special case so we can proactively prohibit encodings // which will not work, so we'll always be confident // that 'encoding' value is always good. setEncoding(m.group(3)); return; } catch (UnsupportedEncodingException use) { // Impossible to get here. Satisfy compiler. throw new BadSpecial( SqltoolRB.encode_fail.getString(m.group(3))); } shared.userVars.remove(tokens[1]); updateUserSettings(); sqlExpandMode = null; return; } String derefed = dereference(string, false); m = varsetPattern.matcher(derefed); if (!m.matches()) throw new BadSpecial(SqltoolRB.pl_unknown.getString(tokens[0])); assert m.groupCount() > 1 && m.groupCount() < 4: "varset pattern matched but captured " + m.groupCount() + " groups"; String varName = m.group(1); // Test for ambiguous form: * VARNAME_ // Ambibuous whether _ is part of varname or operator. if (derefed.trim().equals(varName + '_')) throw new BadSpecial(SqltoolRB.pl_unknown.getString(tokens[0])); if (varName.indexOf(':') > -1) throw new BadSpecial(SqltoolRB.plvar_nocolon.getString()); if (!varPattern.matcher(varName).matches()) errprintln(SqltoolRB.varname_warning.getString(varName)); switch (m.group(2).charAt(0)) { case ':' : if (prevToken == null) throw new BadSpecial(nobufferYetString); StringBuilder sb = new StringBuilder(); switch (prevToken.type) { case Token.PL_TYPE: sb.append('*'); break; case Token.SPECIAL_TYPE: sb.append('\\'); break; default: // Intentionally empty } sb.append(prevToken.val); if (m.groupCount() > 2 && m.group(3) != null) sb.append(m.group(3)); shared.userVars.put(varName, sb.toString()); updateUserSettings(); sqlExpandMode = null; return; case '_' : silentFetch = true; case '~' : // TODO: Condsider limiting fetchingVars to User variables // (as opposed to *SYSTEM variables). // That would eliminate some updateUserSettings calls. if (m.groupCount() > 2 && m.group(3) != null && m.group(3).trim().length() > 0) { throw new BadSpecial( SqltoolRB.plvar_tildedash_nomoreargs.getString( m.group(3).trim())); } shared.userVars.remove(varName); updateUserSettings(); sqlExpandMode = null; fetchingVar = varName; return; case '=' : if (fetchingVar != null && fetchingVar.equals(varName)) fetchingVar = null; String varVal = (m.groupCount() > 2 && m.group(3) != null) ? m.group(3).replaceFirst("^\\s+", "") : null; if (varVal != null && varVal.length() < 1) varVal = null; if (varName.equals("*ENCODING")) try { // Special case so we can proactively prohibit encodings // which will not work, so we'll always be confident // that 'encoding' value is always good. setEncoding(varVal.trim()); return; } catch (UnsupportedEncodingException use) { throw new BadSpecial( SqltoolRB.encode_fail.getString(varVal)); } if (varVal == null) { if (removeEmptyVars()) { stdprintln(SqltoolRB. remove_empty_vars_suggestset.getString()); shared.userVars.remove(varName); } else { shared.userVars.put(varName, ""); } } else { shared.userVars.put(varName, varVal); } updateUserSettings(); sqlExpandMode = null; return; } throw new BadSpecial(SqltoolRB.pl_unknown.getString(tokens[0])); // I think this would already be caught in the setvar block above. } /** * Wrapper methods so don't need to call x(..., false) in most cases. */ /* Unused. Enable when/if need. private void stdprintln() { stdprintln(false); } */ private void stdprint(String s) { stdprint(s, false); } private void stdprintln(String s) { stdprintln(s, false); } /** * Encapsulates normal output. * * Conditionally HTML-ifies output. */ private void stdprintln(boolean queryOutput) { if (shared.psStd != null) { if (htmlMode) { shared.psStd.println("
              "); } else { shared.psStd.println(); } } if (queryOutput && pwQuery != null) { if (htmlMode) { pwQuery.println("
              "); } else { pwQuery.println(); } pwQuery.flush(); } } /** * Encapsulates error output. * * Conditionally HTML-ifies error output. */ private void errprintln(String s) { if (pwQuery != null && htmlMode) { pwQuery.println("
              " + SqlFile.escapeHtml(s) + "
              "); pwQuery.flush(); } if (shared.psStd != null && htmlMode) { shared.psStd.println("
              " + SqlFile.escapeHtml(s) + "
              "); } else { logger.privlog(Level.SEVERE, s, null, 4, SqlFile.class); /* Only consistent way we can log source location is to log * the caller of SqlFile. * This seems acceptable, since the location being reported * here is not the source of the problem anyways. */ } } /** * Encapsulates normal output. * * Conditionally HTML-ifies output. */ private void stdprint(String s, boolean queryOutput) { if (shared.psStd != null) shared.psStd.print( htmlMode ? ("

              " + SqlFile.escapeHtml(s) + "

              ") : s); if (queryOutput && pwQuery != null) { pwQuery.print( htmlMode ? ("

              " + SqlFile.escapeHtml(s) + "

              ") : s); pwQuery.flush(); } } /** * Encapsulates normal output. * * Conditionally HTML-ifies output. */ private void stdprintln(String s, boolean queryOutput) { shared.psStd.println( htmlMode ? ("

              " + SqlFile.escapeHtml(s) + "

              ") : s); if (queryOutput && pwQuery != null) { pwQuery.println( htmlMode ? ("

              " + SqlFile.escapeHtml(s) + "

              ") : s); pwQuery.flush(); } } // Just because users may be used to seeing "[null]" in normal // SqlFile output, we use the same default value for null in DSV // files, but this DSV null representation can be changed to anything. private static final String DEFAULT_NULL_REP = "[null]"; private static final String DEFAULT_NULL_HTML = "Ø"; private static final String DEFAULT_ROW_DELIM = LS; private static final String DEFAULT_ROW_SPLITTER = "\\r\\n|\\r|\\n"; private static final String DEFAULT_COL_DELIM = "|"; private static final String DEFAULT_COL_SPLITTER = "\\|"; private static final String DEFAULT_SKIP_PREFIX = "#"; private static final int DEFAULT_ELEMENT = 0, HSQLDB_ELEMENT = 1, ORACLE_ELEMENT = 2 ; // These do not specify order listed, just inclusion. private static final int[] listMDSchemaCols = { 1 }; private static final int[] listMDIndexCols = { 2, 6, 3, 9, 4, 10, 11 }; /** Column numbering starting at 1. */ private static final int[][] listMDTableCols = { { 2, 3 }, // Default { 2, 3 }, // HSQLDB { 2, 3 }, // Oracle }; /** * SYS and SYSTEM are the only base system accounts in Oracle, however, * from an empirical perspective, all of these other accounts are * system accounts because
                *
              • they are hidden from the casual user *
              • they are created by the installer at installation-time *
              • they are used automatically by the Oracle engine when the * specific Oracle sub-product is used *
              • the accounts should not be messed with by database users *
              • the accounts should certainly not be used if the specific * Oracle sub-product is going to be used. *
              * * General advice: If you aren't going to use an Oracle sub-product, * then don't install it! * Don't blindly accept default when running OUI. * * If users also see accounts that they didn't create with names like * SCOTT, ADAMS, JONES, CLARK, BLAKE, OE, PM, SH, QS, QS_*, these * contain sample data and the schemas can safely be removed. */ private static final String[] oracleSysSchemas = { "SYS", "SYSTEM", "OUTLN", "DBSNMP", "OUTLN", "MDSYS", "ORDSYS", "ORDPLUGINS", "CTXSYS", "DSSYS", "PERFSTAT", "WKPROXY", "WKSYS", "WMSYS", "XDB", "ANONYMOUS", "ODM", "ODM_MTR", "OLAPSYS", "TRACESVR", "REPADMIN" }; public String getCurrentSchema() throws BadSpecial, SqlToolError { requireConnection(); Statement st = null; ResultSet rs = null; try { st = shared.jdbcConn.createStatement(); rs = st.executeQuery("VALUES CURRENT_SCHEMA"); if (!rs.next()) throw new BadSpecial(SqltoolRB.no_vendor_schemaspt.getString()); String currentSchema = rs.getString(1); if (currentSchema == null) throw new BadSpecial( SqltoolRB.schemaname_retrieval_fail.getString()); return currentSchema; } catch (SQLException se) { throw new BadSpecial(SqltoolRB.no_vendor_schemaspt.getString()); } finally { if (rs != null) try { rs.close(); } catch (SQLException se) { // Purposefully doing nothing } finally { rs = null; } if (st != null) try { st.close(); } catch (SQLException se) { // Purposefully doing nothing } finally { st = null; } } } /** * Lists available database tables. * * Filter handling is admittedly inconsistent, both wrt pattern * matching (java.util.regex vs. DB-implemented matching) and * which columns the filter is matched against. * The former is because, for performance and because the DB should * know best how to supply the desired results, we need to let the * database do filtering if at all possible. * In many cases, the DB does not have a filter option, so we have * to filter ourselves. * For the latter, we have no control over which columsn the DB * matches agains, plus the displaySqlResults() method in this class * can only match against all columns (only reason not to add * column-specific filtering is to keep the complexity manageable). * * @throws BadSpecial usually wrap a cause (which cause is a * SQLException in some cases). * @throws SqlToolError passed through from other methods in this class. */ private void listTables(char c, String inFilter) throws BadSpecial, SqlToolError { requireConnection(); String schema = null; int[] listSet = null; String[] types = null; /** For workaround for \T for Oracle */ String[] additionalSchemas = null; /** This is for specific non-getTable() queries */ Statement statement = null; ResultSet rs = null; String narrower = ""; /* * Doing case-sensitive filters now, for greater portability. String filter = ((inFilter == null) ? null : inFilter.toUpperCase()); */ String filter = inFilter; try { DatabaseMetaData md = shared.jdbcConn.getMetaData(); String dbProductName = md.getDatabaseProductName(); int majorVersion = 0; int minorVersion = 0; // We only use majorVersion and minorVersion for HyperSQL so far // The calls avoided here avoid problems with non-confirmant drivers if (dbProductName.indexOf("HSQL") > -1) try { majorVersion = md.getDatabaseMajorVersion(); minorVersion = md.getDatabaseMinorVersion(); } catch (UnsupportedOperationException uoe) { // It seems that Sun's JDBC/ODBC bridge throws here majorVersion = 2; minorVersion = 0; } //System.err.println("DB NAME = (" + dbProductName + ')'); // Database-specific table filtering. /* 3 Types of actions: * 1) Special handling. Return from the "case" block directly. * 2) Execute a specific query. Set statement in the "case". * 3) Otherwise, set filter info for dbmd.getTable() in the * "case". */ types = new String[1]; switch (c) { case '*' : types = null; break; case 'S' : if (dbProductName.indexOf("Oracle") > -1) { errprintln(SqltoolRB.vendor_oracle_dS.getString()); types[0] = "TABLE"; schema = "SYS"; additionalSchemas = oracleSysSchemas; } else { types[0] = "SYSTEM TABLE"; } break; case 's' : if (dbProductName.indexOf("HSQL") > -1) { // HSQLDB does not consider Sequences as "tables", // hence we do not list them in // DatabaseMetaData.getTables(). if (filter != null) { Matcher matcher = dotPattern.matcher(filter); if (matcher.matches()) { filter = (matcher.group(2).length() > 0) ? matcher.group(2) : null; narrower = "\nWHERE sequence_schema = '" + ((matcher.group(1).length() > 0) ? matcher.group(1) : getCurrentSchema()) + "'"; } } statement = shared.jdbcConn.createStatement(); statement.execute( "SELECT sequence_schema, sequence_name FROM " + "information_schema." + ((minorVersion> 8 || majorVersion > 1) ? "sequences" : "system_sequences") + narrower); } else { types[0] = "SEQUENCE"; } break; case 'r' : if (dbProductName.indexOf("HSQL") > -1) { statement = shared.jdbcConn.createStatement(); statement.execute( "SELECT authorization_name FROM information_schema." + ((minorVersion> 8 || majorVersion > 1) ? "authorizations" : "system_authorizations") + "\nWHERE authorization_type = 'ROLE'\n" + "ORDER BY authorization_name"); } else if (dbProductName.indexOf( "Adaptive Server Enterprise") > -1) { // This is the basic Sybase server. Sybase also has // their "Anywhere", ASA (for embedded), and replication // databases, but I don't know the Metadata strings for // those. statement = shared.jdbcConn.createStatement(); statement.execute( "SELECT name FROM syssrvroles ORDER BY name"); } else if (dbProductName.indexOf( "Apache Derby") > -1) { throw new BadSpecial( SqltoolRB.vendor_derby_dr.getString()); } else { throw new BadSpecial( SqltoolRB.vendor_nosup_d.getString("r")); } break; case 'u' : if (dbProductName.indexOf("HSQL") > -1) { statement = shared.jdbcConn.createStatement(); statement.execute("SELECT " + ((minorVersion> 8 || majorVersion > 1) ? "user_name" : "user") + ", admin FROM " + "information_schema.system_users\n" + "ORDER BY user_name"); } else if (dbProductName.indexOf("Oracle") > -1) { statement = shared.jdbcConn.createStatement(); statement.execute( "SELECT username, created FROM all_users " + "ORDER BY username"); } else if (dbProductName.indexOf("PostgreSQL") > -1) { statement = shared.jdbcConn.createStatement(); statement.execute( "SELECT usename, usesuper FROM pg_catalog.pg_user " + "ORDER BY usename"); } else if (dbProductName.indexOf( "Adaptive Server Enterprise") > -1) { // This is the basic Sybase server. Sybase also has // their "Anywhere", ASA (for embedded), and replication // databases, but I don't know the Metadata strings for // those. statement = shared.jdbcConn.createStatement(); statement.execute( "SELECT name, accdate, fullname FROM syslogins " + "ORDER BY name"); } else if (dbProductName.indexOf( "Apache Derby") > -1) { throw new BadSpecial( SqltoolRB.vendor_derby_du.getString()); } else { throw new BadSpecial( SqltoolRB.vendor_nosup_d.getString("u")); } break; case 'a' : if (dbProductName.indexOf("HSQL") > -1 && (minorVersion < 9 && majorVersion < 2)) { // HSQLDB after 1.8 doesn't support any type of aliases // Earlier HSQLDB Aliases are not the same things as // the aliases listed in DatabaseMetaData.getTables(). if (filter != null) { Matcher matcher = dotPattern.matcher(filter); if (matcher.matches()) { filter = (matcher.group(2).length() > 0) ? matcher.group(2) : null; narrower = "\nWHERE alias_schema = '" + ((matcher.group(1).length() > 0) ? matcher.group(1) : getCurrentSchema()) + "'"; } } statement = shared.jdbcConn.createStatement(); statement.execute( "SELECT alias_schem, alias FROM " + "information_schema.system_aliases" + narrower); } else { types[0] = "ALIAS"; } break; case 't' : excludeSysSchemas = (dbProductName.indexOf("Oracle") > -1); types[0] = "TABLE"; break; case 'v' : types[0] = "VIEW"; break; case 'c' : rs = md.getCatalogs(); if (rs == null) throw new BadSpecial( SqltoolRB.metadata_fetch_fail.getString()); displaySqlResults(null, rs, listMDSchemaCols, filter, false); return; case 'n' : rs = md.getSchemas(); if (rs == null) throw new BadSpecial( SqltoolRB.metadata_fetch_fail.getString()); displaySqlResults(null, rs, listMDSchemaCols, filter, false); return; case 'i' : // Some databases require to specify table, some don't. /* if (filter == null) { throw new BadSpecial("You must specify the index's " + "table as argument to \\di"); } */ String table = null; if (filter != null) { Matcher matcher = dotPattern.matcher(filter); if (matcher.matches()) { table = (matcher.group(2).length() > 0) ? matcher.group(2) : null; schema = (matcher.group(1).length() > 0) ? matcher.group(1) : getCurrentSchema(); } else { table = filter; } filter = null; } // N.b. Oracle incorrectly reports the INDEX SCHEMA as // the TABLE SCHEMA. The Metadata structure seems to // be designed with the assumption that the INDEX schema // will be the same as the TABLE schema. rs = md.getIndexInfo(null, schema, table, false, true); if (rs == null) throw new BadSpecial( SqltoolRB.metadata_fetch_fail.getString()); displaySqlResults(null, rs, listMDIndexCols, null, false); return; default : throw new BadSpecial(SqltoolRB.special_d_unknown.getString( Character.toString(c)) + LS + D_OPTIONS_TEXT); } if (statement == null) { if (dbProductName.indexOf("HSQL") > -1) { listSet = listMDTableCols[HSQLDB_ELEMENT]; } else if (dbProductName.indexOf("Oracle") > -1) { listSet = listMDTableCols[ORACLE_ELEMENT]; } else { listSet = listMDTableCols[DEFAULT_ELEMENT]; } if (schema == null && filter != null) { Matcher matcher = dotPattern.matcher(filter); if (matcher.matches()) { filter = (matcher.group(2).length() > 0) ? matcher.group(2) : null; schema = (matcher.group(1).length() > 0) ? matcher.group(1) : getCurrentSchema(); } } } rs = ((statement == null) ? md.getTables(null, schema, null, types) : statement.getResultSet()); if (rs == null) throw new BadSpecial(SqltoolRB.metadata_fetch_fail.getString()); displaySqlResults(statement, rs, listSet, filter, false); if (additionalSchemas != null) { for (String additionalSchema : additionalSchemas) { /* * Inefficient, but we have to do each successful query * twice in order to prevent calling displaySqlResults * for empty/non-existent schemas */ rs = md.getTables(null, additionalSchema, null, types); if (rs == null) throw new BadSpecial( SqltoolRB.metadata_fetch_failfor.getString( additionalSchema)); if (!rs.next()) continue; displaySqlResults( null, md.getTables(null, additionalSchema, null, types), listSet, filter, false); } } } catch (SQLException se) { throw new BadSpecial(SqltoolRB.metadata_fetch_fail.getString(), se); } catch (NullPointerException npe) { throw new BadSpecial(SqltoolRB.metadata_fetch_fail.getString(), npe); } finally { excludeSysSchemas = false; if (rs != null) { try { rs.close(); } catch (SQLException se) { // We already got what we want from it, or have/are // processing a more specific error. } finally { rs = null; } } if (statement != null) try { statement.close(); } catch (SQLException se) { // Purposefully doing nothing } finally { statement = null; } } } private boolean excludeSysSchemas; /** * Process the contents of Edit Buffer as an SQL Statement * * @return an open SQL Statement or null. * @throws SQLException thrown by JDBC driver. * @throws SqlToolError all other errors. */ private Statement processSQL() throws SQLException, SqlToolError { shared.userVars.remove("?"); requireConnection(); assert buffer != null: "Internal assertion failed. No buffer in processSQL()."; assert buffer.type == Token.SQL_TYPE: "Internal assertion failed. " + "Token type " + buffer.getTypeString() + " in processSQL()."; // No reason to check autoCommit constantly. If we need to roll // back, we will check the autocommit state at that time. if (sqlExpandMode == null) setSqlExpandMode(); lastSqlStatement = sqlExpandMode.booleanValue() ? dereference(buffer.val, true) : buffer.val; // Above is the only case where we deference conditionally. // For :, \, * commands we either always do or always don't. // N.b. "lastSqlStatement" is a misnomer only inside this method. // Outside of this method, this var references the "last" SQL // statement which we attempted to execute. if ((!permitEmptySqlStatements) && buffer.val == null || buffer.val.trim().length() < 1) throw new SqlToolError(SqltoolRB.sqlstatement_empty.getString()); // There is nothing inherently wrong with issuing // an empty command, like to test DB server health. // But, this check effectively catches many syntax // errors early. Statement statement = null; long startTime = 0; if (reportTimes) startTime = (new java.util.Date()).getTime(); try { if (doPrepare) { if (lastSqlStatement.indexOf('?') < 1) { lastSqlStatement = null; throw new SqlToolError(SqltoolRB.prepare_demandqm.getString()); } doPrepare = false; PreparedStatement ps = shared.jdbcConn.prepareStatement(lastSqlStatement); statement = ps; if (prepareVar == null) { if (binBuffer == null) { lastSqlStatement = null; throw new SqlToolError( SqltoolRB.binbuffer_empty.getString()); } ps.setBytes(1, binBuffer); } else { String val = shared.userVars.get(prepareVar); if (val == null) { lastSqlStatement = null; throw new SqlToolError( SqltoolRB.plvar_undefined.getString(prepareVar)); } prepareVar = null; ps.setString(1, val); } ps.executeUpdate(); } else { statement = shared.jdbcConn.createStatement(); statement.execute(lastSqlStatement); } // We close SQL resources for following catches. // If we return resources, we obviously do not close them. // User already being notified about the problem so don't clutter // with details about close failures. } catch (SQLException se) { if (statement != null) try { statement.close(); } catch (SQLException sen) { // Intentionally empty. See preceding comment } finally { statement = null; } throw se; // rethrow } catch (SqlToolError ste) { if (statement != null) try { statement.close(); } catch (SQLException sen) { // Intentionally empty. See preceding comment } finally { statement = null; } throw ste; // rethrow } finally { if (reportTimes) { long elapsed = (new java.util.Date().getTime()) - startTime; //condlPrintln("
              rej. # Eingabe
              Zeile #
              fehlerhafte Spalte
              (wenn bekannt)
              Ursache
              ", true); condlPrintln(SqltoolRB.exectime_report.getString( (int) elapsed), false); } } /* This catches about the only very safe way to know a COMMIT * is not needed. */ try { shared.possiblyUncommitteds = !shared.jdbcConn.getAutoCommit() && !commitOccursPattern.matcher(lastSqlStatement).matches(); } catch (java.sql.SQLException se) { // The thing about this block is, we can't clean up resources // because our connection has been severed. We just notify and // return. // If connection is closed by instance shutdown or whatever, we'll // get here. lastSqlStatement = null; // I forget what this is for try { shared.jdbcConn.close(); } catch (Exception anye) { // Intentionally empty } shared.jdbcConn = null; shared.possiblyUncommitteds = false; stdprintln(SqltoolRB.disconnect_success.getString()); return null; } return statement; } /** * Display the given result set or update count for user and closes the * supplied JDBC resources. * The last 3 params are to narrow down records and columns where * that can not be done with a where clause (like in metadata queries). *

              * Caller is responsible for closing any passed Statement or ResultSet. * * @param statement The SQL Statement that the result set is for. * This is so we can get the statement's update count, * and so we can close it. * Can be null if you don't want either of those things. * @param r The ResultSet to display and close. * @param incCols Optional list of which columns to include (i.e., if * given, then other columns will be skipped). * @param filterRegex Optional filter. Rows are skipped which to not * contain this substring in ANY COLUMN. * (Should add another param to specify targeted columns). * @throws SQLException thrown by JDBC driver. * @throws SqlToolError all other errors. */ private void displaySqlResults(Statement statement, ResultSet r, int[] incCols, String filterString, boolean updateStatus) throws SQLException, SqlToolError { try { if (pwDsv != null && csvStyleQuoting && (dsvColDelim.indexOf('"') > -1 || dsvRowDelim.indexOf('"') > -1)) throw new SqlToolError(SqltoolRB.dsv_q_nodblquote.getString()); java.sql.Timestamp ts; int dotAt; int updateCount = (statement == null) ? -1 : statement .getUpdateCount(); boolean silent = silentFetch; boolean binary = fetchBinary; Pattern filter = null; silentFetch = false; fetchBinary = false; if (filterString != null) try { filter = Pattern.compile(filterString); } catch (PatternSyntaxException pse) { throw new SqlToolError(SqltoolRB.regex_malformat.getString(pse)); } if (excludeSysSchemas) stdprintln(SqltoolRB.vendor_nosup_sysschemas.getString()); switch (updateCount) { case -1 : if (r == null) { stdprintln(SqltoolRB.noresult.getString(), true); break; } ResultSetMetaData m = r.getMetaData(); int cols = m.getColumnCount(); int incCount = (incCols == null) ? cols : incCols .length; String val; List rows = new ArrayList(); String[] headerArray = null; String[] fieldArray; int[] maxWidth = new int[incCount]; int insi; boolean skip; boolean isValNull; // STEP 1: GATHER DATA if (!htmlMode) for (int i = 0; i < maxWidth.length; i++) maxWidth[i] = 0; boolean[] rightJust = new boolean[incCount]; int[] dataType = new int[incCount]; boolean[] autonulls = new boolean[incCount]; insi = -1; headerArray = new String[incCount]; for (int i = 1; i <= cols; i++) { if (incCols != null) { skip = true; for (int j = 0; j < incCols.length; j++) if (i == incCols[j]) skip = false; if (skip) continue; } headerArray[++insi] = (pwDsv != null && csvStyleQuoting && allQuoted) ? ('"' + m.getColumnLabel(i) + '"') : m.getColumnLabel(i); dataType[insi] = m.getColumnType(i); rightJust[insi] = false; autonulls[insi] = true; // This is what we want for java.sql.Types.ARRAY : switch (dataType[insi]) { case java.sql.Types.BIGINT : case java.sql.Types.BIT : case java.sql.Types.DECIMAL : case java.sql.Types.DOUBLE : case java.sql.Types.FLOAT : case java.sql.Types.INTEGER : case java.sql.Types.NUMERIC : case java.sql.Types.REAL : case java.sql.Types.SMALLINT : case java.sql.Types.TINYINT : rightJust[insi] = true; break; case java.sql.Types.VARBINARY : case java.sql.Types.VARCHAR : case java.sql.Types.BLOB : case java.sql.Types.CLOB : case java.sql.Types.LONGVARBINARY : case java.sql.Types.LONGVARCHAR : autonulls[insi] = false; break; } if (htmlMode) continue; if (headerArray[insi] != null && headerArray[insi].length() > maxWidth[insi]) maxWidth[insi] = headerArray[insi].length(); } boolean filteredOut; while (r.next()) { fieldArray = new String[incCount]; insi = -1; filteredOut = filter != null; for (int i = 1; i <= cols; i++) { // This is the only case where we can save a data // read by recognizing we don't need this datum early. if (incCols != null) { skip = true; for (int incCol : incCols) if (i == incCol) skip = false; if (skip) continue; } // This row may still be ditched, but it is now // certain that we need to increment the fieldArray // index. ++insi; if (!SqlFile.canDisplayType(dataType[insi])) binary = true; val = null; isValNull = true; if (!binary) { /* * The special formatting for all time-related * fields is because the most popular current * databases are extremely inconsistent about * what resolution is returned for the same types. * In my experience so far, Dates MAY have * resolution down to second, but only TIMESTAMPs * support sub-second res. (and always can). * On top of that there is no consistency across * getObject().toString(). Oracle doesn't even * implement it for their custom TIMESTAMP type. */ switch (dataType[insi]) { case org.hsqldb.types.Types.SQL_TIMESTAMP_WITH_TIME_ZONE: case org.hsqldb.types.Types.SQL_TIME_WITH_TIME_ZONE: case java.sql.Types.TIMESTAMP: case java.sql.Types.DATE: case java.sql.Types.TIME: ts = r.getTimestamp(i); isValNull = r.wasNull(); val = ((ts == null) ? null : ts.toString()); // Following block truncates non-zero // sub-seconds from time types OTHER than // TIMESTAMP. if (dataType[insi] != java.sql.Types.TIMESTAMP && dataType[insi] != org.hsqldb.types.Types.SQL_TIMESTAMP_WITH_TIME_ZONE && val != null) { dotAt = val.lastIndexOf('.'); for (int z = dotAt + 1; z < val.length(); z++) if (val.charAt(z) != '0') { dotAt = 0; break; } if (dotAt > 1) val = val.substring(0, dotAt); } break; default: val = r.getString(i); isValNull = r.wasNull(); // If we tried to get a String but it // failed, try getting it with a String // Stream if (val == null) try { val = streamToString( r.getAsciiStream(i), shared.encoding); isValNull = r.wasNull(); } catch (Exception e) { // This isn't an error. // We are attempting to do a stream // fetch if-and-only-if the column // supports it. } } } if (binary || (val == null && !isValNull)) { if (pwDsv != null) throw new SqlToolError( SqltoolRB.dsv_bincol.getString()); // DB has a value but we either explicitly want // it as binary, or we failed to get it as String. try { binBuffer = SqlFile.streamToBytes(r.getBinaryStream(i)); isValNull = r.wasNull(); } catch (IOException ioe) { throw new SqlToolError( SqltoolRB.streamread_failure.getString(), ioe); } stdprintln(SqltoolRB.binbuf_write.getString( Integer.toString(binBuffer.length), headerArray[insi], SqlFile.sqlTypeToString(dataType[insi]) )); if (updateStatus) shared.userVars.put("?", ""); if (fetchingVar != null) { shared.userVars.put(fetchingVar, ""); updateUserSettings(); sqlExpandMode = null; fetchingVar = null; } lastSqlStatement = null; return; } if (excludeSysSchemas && val != null && i == 2) for (String oracleSysSchema : oracleSysSchemas) if (val.equals(oracleSysSchema)) { filteredOut = true; break; } // nullRepToken may never be null if (updateStatus) shared.userVars.put("?", ((val == null) ? nullRepToken : val)); if (fetchingVar != null) { if (val == null) shared.userVars.remove(fetchingVar); else shared.userVars.put(fetchingVar, val); updateUserSettings(); sqlExpandMode = null; fetchingVar = null; } if (silent) { lastSqlStatement = null; return; } // We do not omit rows here. We collect information // so we can make the decision after all rows are // read in. if (filter != null && (val == null || filter.matcher(val).find())) filteredOut = false; /////////////////////////////// // A little tricky here. fieldArray[] MUST get set. if (val == null && pwDsv == null) { if (dataType[insi] == java.sql.Types.VARCHAR) { fieldArray[insi] = htmlMode ? "\u0000" : nullRepToken; } else { fieldArray[insi] = ""; } } else { fieldArray[insi] = val; } /////////////////////////////// if (htmlMode || pwDsv != null) continue; if (fieldArray[insi].length() > maxWidth[insi]) maxWidth[insi] = fieldArray[insi].length(); } if (!filteredOut) rows.add(fieldArray); } if (updateStatus && !shared.userVars.containsKey("?")) shared.userVars.put("?", ""); if (fetchingVar != null) { shared.userVars.remove(fetchingVar); updateUserSettings(); sqlExpandMode = null; fetchingVar = null; } // STEP 2: DISPLAY DATA (= 2a OR 2b) // STEP 2a (Non-DSV) if (pwDsv == null) { condlPrintln("", true); if (incCount > 1) { condlPrint(SqlFile.htmlRow(COL_HEAD) + LS + PRE_TD, true); for (int i = 0; i < headerArray.length; i++) { condlPrint("", true); condlPrint(((i > 0) ? " " : "") + ((i < headerArray.length - 1 || rightJust[i]) ? StringUtil.toPaddedString( headerArray[i], maxWidth[i], ' ', !rightJust[i]) : headerArray[i]) , false); } condlPrintln(LS + PRE_TR + "", true); condlPrintln("", false); if (!htmlMode) { for (int i = 0; i < headerArray.length; i++) condlPrint(((i > 0) ? " " : "") + SqlFile.divider( maxWidth[i]), false); condlPrintln("", false); } } condlPrintln("", true); for (int i = 0; i < rows.size(); i++) { condlPrint(SqlFile.htmlRow(((i % 2) == 0) ? COL_EVEN : COL_ODD) + LS + PRE_TD, true); fieldArray = rows.get(i); for (int j = 0; j < fieldArray.length; j++) { condlPrint("" + (fieldArray[j].equals("\u0000") ? nullRepHtml : SqlFile.escapeHtml(fieldArray[j])) + "", true); condlPrint(((j > 0) ? " " : "") + ((j < fieldArray.length - 1 || rightJust[j]) ? StringUtil.toPaddedString( fieldArray[j], maxWidth[j], ' ', !rightJust[j]) : fieldArray[j]) , false); } condlPrintln(LS + PRE_TR + "", true); condlPrintln("", false); } condlPrintln("
              " + SqlFile.escapeHtml(headerArray[i]) + "
              ", true); if (interactive && rows.size() != 1) stdprintln(LS + SqltoolRB.rows_fetched.getString( rows.size()), true); break; } // STEP 2b (DSV) if (incCount > 0) { for (int i = 0; i < headerArray.length; i++) { dsvSafe(headerArray[i]); pwDsv.print(headerArray[i]); if (i < headerArray.length - 1) pwDsv.print(dsvColDelim); } pwDsv.print(dsvRowDelim); } if (csvStyleQuoting) { Pattern delimPat = Pattern.compile(dsvColDelim); for (String[] fArray : rows) for (int j = 0; j < fArray.length; j++) if (fArray[j] != null && (allQuoted || fArray[j].indexOf('"') > -1 || fArray[j].indexOf(dsvColDelim) > -1)) fArray[j] = '"' + fArray[j].replace("\"", "\"\"") + '"'; } for (String[] fArray : rows) { for (int j = 0; j < fArray.length; j++) { if (pwDsv == null) dsvSafe(fArray[j]); pwDsv.print((fArray[j] == null) ? (autonulls[j] ? "" : nullRepToken) : fArray[j]); if (j < fArray.length - 1) pwDsv.print(dsvColDelim); } pwDsv.print(dsvRowDelim); } stdprintln(SqltoolRB.rows_fetched_dsv.getString(rows.size())); // Undecided about whether should display row count here when // in non-interactive mode break; default : if (updateStatus) shared.userVars.put("?", Integer.toString(updateCount)); if (fetchingVar != null) { shared.userVars.put( fetchingVar, Integer.toString(updateCount)); fetchingVar = null; updateUserSettings(); sqlExpandMode = null; } if (updateCount != 0 && interactive) stdprintln((updateCount == 1) ? SqltoolRB.row_update_singular.getString() : SqltoolRB.row_update_multiple.getString(updateCount)); break; } lastSqlStatement = null; // Clear this only if we don't error out } finally { if (r != null) try { r.close(); } catch (SQLException se) { logger.warning("Failed to close SQL result set: " + se); } finally { r = null; } if (statement != null) try { statement.close(); } catch (SQLException se) { logger.warning("Failed to close SQL statement: " + se); } finally { statement = null; } } } private static final int COL_HEAD = 0, COL_ODD = 1, COL_EVEN = 2 ; private static final String PRE_TR = " "; private static final String PRE_TD = " "; /** * Print a properly formatted HTML <TR> command for the given * situation. * * @param colType Column type: COL_HEAD, COL_ODD or COL_EVEN. */ private static String htmlRow(int colType) { switch (colType) { case COL_HEAD : return PRE_TR + ""; case COL_ODD : return PRE_TR + ""; case COL_EVEN : return PRE_TR + ""; } return null; } /** * Returns a divider of hypens of requested length. * * @param len Length of output String. */ private static String divider(int len) { return (len > DIVIDER.length()) ? DIVIDER : DIVIDER.substring(0, len); } /** * Display command history. */ private void showHistory() throws BadSpecial { if (history == null) throw new BadSpecial(SqltoolRB.history_unavailable.getString()); if (history.size() < 1) throw new BadSpecial(SqltoolRB.history_none.getString()); if (shared.psStd == null) return; // Input can be dual-purpose, i.e. the script can be intended for // both interactive and non-interactive usage. Token token; for (int i = 0; i < history.size(); i++) { token = history.get(i); shared.psStd.println("#" + (i + oldestHist) + " or " + (i - history.size()) + ':'); shared.psStd.println(token.reconstitute()); } if (buffer != null) shared.psStd.println(SqltoolRB.editbuffer_contents.getString( buffer.reconstitute())); shared.psStd.println(); shared.psStd.println(SqltoolRB.buffer_instructions.getString()); } /** * Return a Command from command history. */ private Token commandFromHistory(int inIndex) throws BadSpecial { int index = inIndex; // Just to quiet compiler warnings. if (history == null) throw new BadSpecial(SqltoolRB.history_unavailable.getString()); if (index == 0) throw new BadSpecial(SqltoolRB.history_number_req.getString()); if (index > 0) { // Positive command# given index -= oldestHist; if (index < 0) throw new BadSpecial( SqltoolRB.history_backto.getString(oldestHist)); if (index >= history.size()) throw new BadSpecial(SqltoolRB.history_upto.getString( history.size() + oldestHist - 1)); } else { // Negative command# given index += history.size(); if (index < 0) throw new BadSpecial( SqltoolRB.history_back.getString(history.size())); } return history.get(index); } /** * Search Command History for a regex match. * * @return Absolute command number, if any match. */ private Integer historySearch(String findRegex) throws BadSpecial { if (history == null) throw new BadSpecial(SqltoolRB.history_unavailable.getString()); Pattern pattern = null; try { pattern = Pattern.compile("(?ims)" + findRegex); } catch (PatternSyntaxException pse) { throw new BadSpecial(SqltoolRB.regex_malformat.getString(pse)); } // Make matching more liberal. Users can customize search behavior // by using "(?-OPTIONS)" or (?OPTIONS) in their regexes. for (int index = history.size() - 1; index >= 0; index--) if (pattern.matcher((history.get(index)).val).find()) return Integer.valueOf(index + oldestHist); return null; } /** * Set buffer, unless the given token equals what is already in the * buffer. */ private boolean setBuf(Token newBuffer) { if (buffer != null) if (buffer != null && buffer.equals(newBuffer)) return false; switch (newBuffer.type) { case Token.SQL_TYPE: case Token.PL_TYPE: case Token.SPECIAL_TYPE: break; default: assert false: "Internal assertion failed. " + "Attempted to add command type " + newBuffer.getTypeString() + " to buffer"; } buffer = new Token(newBuffer.type, new String(newBuffer.val), newBuffer.line); // System.err.println("Buffer is now (" + buffer + ')'); return true; } int oldestHist = 1; /** * Add a command onto the history list. */ private boolean historize() { if (history == null || buffer == null) return false; if (history.size() > 0 && history.get(history.size() - 1).equals(buffer)) // Don't store two consecutive commands that are exactly the same. return false; history.add(buffer); if (history.size() <= maxHistoryLength) return true; history.remove(0); oldestHist++; return true; } /** * Describe the columns of specified table. * * @param tableName Table that will be described. * @param filter Optional regex to filter by. * By default, will match only against the column name. * Prefix with "/" to match against the entire output line. */ private void describe(String tableName, String filterString) throws SQLException { assert shared.jdbcConn != null: "Somehow got to 'describe' even though we have no Conn"; /* * Doing case-sensitive filters now, for greater portability. String filter = ((inFilter == null) ? null : inFilter.toUpperCase()); */ Pattern filter = null; boolean filterMatchesAll = false; // match filter against all cols. List rows = new ArrayList(); String[] headerArray = { SqltoolRB.describe_table_name.getString(), SqltoolRB.describe_table_datatype.getString(), SqltoolRB.describe_table_width.getString(), SqltoolRB.describe_table_nonulls.getString(), SqltoolRB.describe_table_precision.getString(), SqltoolRB.describe_table_scale.getString(), }; String[] fieldArray; int[] maxWidth = { 0, 0, 0, 0, 0, 0 }; boolean[] rightJust = { false, false, true, false, true, true }; int precision, scale; if (filterString != null) try { filterMatchesAll = (filterString.charAt(0) == '/'); filter = Pattern.compile(filterMatchesAll ? filterString.substring(1) : filterString); } catch (PatternSyntaxException pse) { throw new SQLException(SqltoolRB.regex_malformat.getString(pse)); // This is obviously not a SQLException. // Perhaps change input parameter to a Pattern to require // caller to compile the pattern? } for (int i = 0; i < headerArray.length; i++) { if (htmlMode) continue; if (headerArray[i].length() > maxWidth[i]) maxWidth[i] = headerArray[i].length(); } ResultSet r = null; Statement statement = shared.jdbcConn.createStatement(); // STEP 1: GATHER DATA try { statement.execute("SELECT * FROM " + tableName + " WHERE 1 = 2"); r = statement.getResultSet(); ResultSetMetaData m = r.getMetaData(); int cols = m.getColumnCount(); for (int i = 0; i < cols; i++) { fieldArray = new String[6]; precision = m.getPrecision(i + 1); scale = m.getScale(i + 1); fieldArray[0] = m.getColumnName(i + 1); if (filter != null && (!filterMatchesAll) && !filter.matcher(fieldArray[0]).find()) continue; fieldArray[1] = m.getColumnTypeName(i + 1); fieldArray[2] = Integer.toString(m.getColumnDisplaySize(i + 1)); fieldArray[3] = ((m.isNullable(i + 1) == java.sql.ResultSetMetaData.columnNullable) ? "" : "*"); fieldArray[4] = (precision == 0) ? "" :Integer.toString(precision); fieldArray[5] = (scale == 0) ? "" :Integer.toString(scale); if (filter != null && filterMatchesAll && !filter.matcher(fieldArray[0] + ' ' + fieldArray[1] + ' ' + fieldArray[2] + ' ' + fieldArray[3]).find()) continue; rows.add(fieldArray); for (int j = 0; j < fieldArray.length; j++) if (fieldArray[j].length() > maxWidth[j]) maxWidth[j] = fieldArray[j].length(); } // STEP 2: DISPLAY DATA condlPrint("" + LS + SqlFile.htmlRow(COL_HEAD) + LS + PRE_TD, true); for (int i = 0; i < headerArray.length; i++) { condlPrint("", true); condlPrint(((i > 0) ? " " : "") + ((i < headerArray.length - 1 || rightJust[i]) ? StringUtil.toPaddedString( headerArray[i], maxWidth[i], ' ', !rightJust[i]) : headerArray[i]) , false); } condlPrintln(LS + PRE_TR + "", true); condlPrintln("", false); condlPrintln("", true); if (!htmlMode) { for (int i = 0; i < headerArray.length; i++) condlPrint(((i > 0) ? " " : "") + SqlFile.divider(maxWidth[i]), false); condlPrintln("", false); } for (int i = 0; i < rows.size(); i++) { condlPrint(SqlFile.htmlRow( ((i % 2) == 0) ? COL_EVEN : COL_ODD) + LS + PRE_TD, true); fieldArray = rows.get(i); for (int j = 0; j < fieldArray.length; j++) { condlPrint("" + SqlFile.escapeHtml(fieldArray[j]) + "", true); condlPrint(((j > 0) ? " " : "") + ((j < fieldArray.length - 1 || rightJust[j]) ? StringUtil.toPaddedString( fieldArray[j], maxWidth[j], ' ', !rightJust[j]) : fieldArray[j]) , false); } condlPrintln(LS + PRE_TR + "", true); condlPrintln("", false); } condlPrintln(LS + "
              " + SqlFile.escapeHtml(headerArray[i]) + "
              ", true); } finally { if (r != null) try { r.close(); } catch (SQLException nse) { // intentionally empty; } finally { r = null; } if (statement != null) try { statement.close(); } catch (SQLException nse) { // intentionally empty; } finally { statement = null; } } } /** * Unset variables are permitted in expressions as long as use * the short *VARNAME form. */ private boolean eval(String[] inTokens) throws BadSpecial { /* TODO: Rewrite using java.util.regex. */ // dereference *VARNAME variables. // N.b. we work with a "copy" of the tokens. boolean negate = inTokens.length > 0 && inTokens[0].equals("!"); String[] tokens = new String[negate ? (inTokens.length - 1) : inTokens.length]; String inToken; for (int i = 0; i < tokens.length; i++) { inToken = inTokens[i + (negate ? 1 : 0)]; if (inToken.length() > 1 && inToken.charAt(0) == '*') { tokens[i] = shared.userVars.get(inToken.substring(1)); } else { tokens[i] = inTokens[i + (negate ? 1 : 0)]; } } if (tokens.length == 1) return (tokens[0] != null && tokens[0].length() > 0 && !tokens[0].equals("0")) ^ negate; if (tokens.length == 3) { if (tokens[1] == null) throw new BadSpecial(SqltoolRB.logical_unrecognized.getString()); if (tokens[1].equals("!=") || tokens[1].equals("<>") || tokens[1].equals("><")) { negate = !negate; tokens[1] = "=="; } if (tokens[1].equals(">=") || tokens[1].equals("=>")) { negate = !negate; tokens[1] = "<"; } if (tokens[1].equals("<=") || tokens[1].equals("=<")) { negate = !negate; tokens[1] = ">"; } if (tokens[1].equals("==")) { if (tokens[0] == null || tokens[2] == null) return (tokens[0] == null && tokens[2] == null) ^ negate; return tokens[0].equals(tokens[2]) ^ negate; } char c1 = (tokens[0] == null || tokens[0].length() < 1) ? '\0' : tokens[0].charAt(0); char c2 = (tokens[2] == null || tokens[2].length() < 1) ? '\0' : tokens[2].charAt(0); if (tokens[1].equals(">")) { if (tokens[0] == null || tokens[2] == null) return !negate; if (c1 == '-' && c2 == '-') { negate = !negate; } else if (c1 == '-') { return negate; } else if (c2 == '-') { return !negate; } return (tokens[0].length() > tokens[2].length() || ((tokens[0].length() == tokens[2].length()) && tokens[0].compareTo(tokens[2]) > 0)) ^ negate; } if (tokens[1].equals("<")) { if (tokens[0] == null || tokens[2] == null) return !negate; if (c1 == '-' && c2 == '-') { negate = !negate; } else if (c1 == '-') { return !negate; } else if (c2 == '-') { return negate; } return (tokens[2].length() > tokens[0].length() || ((tokens[2].length() == tokens[0].length()) && tokens[2].compareTo(tokens[0]) > 0)) ^ negate; } } throw new BadSpecial(SqltoolRB.logical_unrecognized.getString()); } private void closeQueryOutputStream() { if (pwQuery == null) return; try { if (htmlMode) { pwQuery.flush(); } } finally { try { pwQuery.close(); } finally { pwQuery = null; // Encourage GC of buffers } } } /** * Print to psStd and possibly pwQuery iff current HTML mode matches * supplied printHtml. * * The condlPrint methods do not escape HTML like the stdprint methods do. */ private void condlPrintln(String s, boolean printHtml) { if ((printHtml && !htmlMode) || (htmlMode && !printHtml)) return; if (shared.psStd != null) shared.psStd.println(s); if (pwQuery != null) { pwQuery.println(s); pwQuery.flush(); } } /** * Print to psStd and possibly pwQuery iff current HTML mode matches * supplied printHtml. * * The condlPrint methods do not escape HTML like the stdprint methods do. */ private void condlPrint(String s, boolean printHtml) { if ((printHtml && !htmlMode) || (htmlMode && !printHtml)) return; if (shared.psStd != null) shared.psStd.print(s); if (pwQuery != null) { pwQuery.print(s); pwQuery.flush(); } } private String formatNicely(Map map, boolean withValues) { String s; StringBuffer sb = new StringBuffer(); if (withValues) { SqlFile.appendLine(sb, SqltoolRB.pl_list_parens.getString()); } else { SqlFile.appendLine(sb, SqltoolRB.pl_list_lengths.getString()); } for (Map.Entry entry : new TreeMap(map).entrySet()) { s = (String) entry.getValue(); SqlFile.appendLine(sb, " " + (String) entry.getKey() + ": " + (withValues ? ("(" + s + ')') : Integer.toString( s.length()))); } return sb.toString(); } /** * Ascii file dump. * * dumpFile must not be null. */ private void dump(String varName, File dumpFile) throws IOException, BadSpecial { String val = shared.userVars.get(varName); if (val == null) throw new BadSpecial(SqltoolRB.plvar_undefined.getString(varName)); OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream(dumpFile), (shared.encoding == null) ? DEFAULT_FILE_ENCODING : shared.encoding); try { osw.write(val); if (val.length() > 0) { char lastChar = val.charAt(val.length() - 1); if (lastChar != '\n' && lastChar != '\r') osw.write(LS); } osw.flush(); } finally { try { osw.close(); } catch (IOException ioe) { // Intentionally empty } finally { osw = null; // Encourage GC of buffers } } // Since opened in overwrite mode, since we didn't exception out, // we can be confident that we wrote all the bytest in the file. stdprintln(SqltoolRB.file_wrotechars.getString( Long.toString(dumpFile.length()), dumpFile.toString())); } byte[] binBuffer; /** * Binary file dump * * dumpFile must not be null. */ private void dump(File dumpFile) throws IOException, BadSpecial { if (binBuffer == null) throw new BadSpecial(SqltoolRB.binbuffer_empty.getString()); int len = 0; FileOutputStream fos = new FileOutputStream(dumpFile); try { fos.write(binBuffer); len = binBuffer.length; binBuffer = null; fos.flush(); } finally { try { fos.close(); } catch (IOException ioe) { // Intentionally empty } finally { fos = null; // Encourage GC of buffers } } stdprintln(SqltoolRB.file_wrotechars.getString( len, dumpFile.toString())); } /** * As the name says... * This method always closes the input stream. */ public String streamToString(InputStream isIn, String cs) throws IOException { InputStream is = isIn; // Compiler warning, when we can null the ref byte[] ba = null; int bytesread = 0; int retval; try { try { ba = new byte[is.available()]; } catch (RuntimeException re) { throw new IOException(SqltoolRB.read_toobig.getString()); } while (bytesread < ba.length && (retval = is.read( ba, bytesread, ba.length - bytesread)) > 0) { bytesread += retval; } if (bytesread != ba.length) throw new IOException( SqltoolRB.read_partial.getString(bytesread, ba.length)); try { return (cs == null) ? (new String(ba)) : (new String(ba, cs)); } catch (UnsupportedEncodingException uee) { throw new IOException( SqltoolRB.encode_fail.getString(uee)); } catch (RuntimeException re) { throw new IOException(SqltoolRB.read_convertfail.getString()); } } finally { try { is.close(); } catch (IOException ioe) { // intentionally empty } finally { is = null; // Encourage GC of buffers } } } /** * Ascii file load. */ private void load(String varName, File asciiFile, String cs) throws IOException { String string = streamToString(new FileInputStream(asciiFile), cs); // The streamToString() method ensures that the Stream gets closed shared.userVars.put(varName, string); if (!varPattern.matcher(varName).matches()) errprintln(SqltoolRB.varname_warning.getString(varName)); updateUserSettings(); sqlExpandMode = null; } /** * As the name says... */ public static byte[] streamToBytes(InputStream is) throws IOException { byte[] xferBuffer = new byte[10240]; byte[] outBytes = null; int i; ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { while ((i = is.read(xferBuffer)) > 0) baos.write(xferBuffer, 0, i); outBytes = baos.toByteArray(); } finally { baos = null; // Encourage buffer GC } return outBytes; } /** * Binary file load * * @return The bytes which are the content of the fil */ public static byte[] loadBinary(File binFile) throws IOException { byte[] xferBuffer = new byte[10240]; byte[] outBytes = null; ByteArrayOutputStream baos; int i; FileInputStream fis = new FileInputStream(binFile); try { baos = new ByteArrayOutputStream(); while ((i = fis.read(xferBuffer)) > 0) baos.write(xferBuffer, 0, i); outBytes = baos.toByteArray(); } finally { try { fis.close(); } catch (IOException ioe) { // intentionally empty } finally { fis = null; // Encourage GC of buffers baos = null; // Encourage GC of buffers } } return outBytes; } /** * This method is used to tell SqlFile whether this Sql Type must * ALWAYS be loaded to the binary buffer without displaying. *

              * N.b.: If this returns "true" for a type, then the user can never * "see" values for these columns. * Therefore, if a type may-or-may-not-be displayable, better to return * false here and let the user choose. * In general, if there is a toString() operator for this Sql Type * then return false, since the JDBC driver should know how to make the * value displayable. *

              * * @see http://java.sun.com/docs/books/tutorial/jdbc/basics/retrieving.html * The table on this page lists the most common SqlTypes, all of which * must implement toString() * @see java.sql.Types */ public static boolean canDisplayType(int i) { /* I don't now about some of the more obscure types, like REF and * DATALINK */ switch (i) { //case java.sql.Types.BINARY : case java.sql.Types.BLOB : case java.sql.Types.JAVA_OBJECT : //case java.sql.Types.LONGVARBINARY : //case java.sql.Types.LONGVARCHAR : case java.sql.Types.OTHER : case java.sql.Types.STRUCT : //case java.sql.Types.VARBINARY : return false; } return true; } // won't compile with JDK 1.4 without these private static final int JDBC3_BOOLEAN = 16; private static final int JDBC3_DATALINK = 70; /** * Return a String representation of the specified java.sql.Types type. */ public static String sqlTypeToString(int i) { switch (i) { case java.sql.Types.ARRAY : return "ARRAY"; case java.sql.Types.BIGINT : return "BIGINT"; case java.sql.Types.BINARY : return "BINARY"; case java.sql.Types.BIT : return "BIT"; case java.sql.Types.BLOB : return "BLOB"; case JDBC3_BOOLEAN : return "BOOLEAN"; case java.sql.Types.CHAR : return "CHAR"; case java.sql.Types.CLOB : return "CLOB"; case JDBC3_DATALINK : return "DATALINK"; case java.sql.Types.DATE : return "DATE"; case java.sql.Types.DECIMAL : return "DECIMAL"; case java.sql.Types.DISTINCT : return "DISTINCT"; case java.sql.Types.DOUBLE : return "DOUBLE"; case java.sql.Types.FLOAT : return "FLOAT"; case java.sql.Types.INTEGER : return "INTEGER"; case java.sql.Types.JAVA_OBJECT : return "JAVA_OBJECT"; case java.sql.Types.LONGVARBINARY : return "LONGVARBINARY"; case java.sql.Types.LONGVARCHAR : return "LONGVARCHAR"; case java.sql.Types.NULL : return "NULL"; case java.sql.Types.NUMERIC : return "NUMERIC"; case java.sql.Types.OTHER : return "OTHER"; case java.sql.Types.REAL : return "REAL"; case java.sql.Types.REF : return "REF"; case java.sql.Types.SMALLINT : return "SMALLINT"; case java.sql.Types.STRUCT : return "STRUCT"; case java.sql.Types.TIME : return "TIME"; case java.sql.Types.TIMESTAMP : return "TIMESTAMP"; case java.sql.Types.TINYINT : return "TINYINT"; case java.sql.Types.VARBINARY : return "VARBINARY"; case java.sql.Types.VARCHAR : return "VARCHAR"; case org.hsqldb.types.Types.SQL_TIME_WITH_TIME_ZONE : return "SQL_TIME_WITH_TIME_ZONE"; case org.hsqldb.types.Types.SQL_TIMESTAMP_WITH_TIME_ZONE : return "SQL_TIMESTAMP_WITH_TIME_ZONE"; } return "Unknown type " + i; } /** * Validate that String is safe to write TO DSV file. * * @throws SqlToolError if validation fails. */ public void dsvSafe(String s) throws SqlToolError { assert pwDsv != null && dsvColDelim != null && dsvRowDelim != null && nullRepToken != null: "Assertion failed. \n" + "dsvSafe called when DSV settings are incomplete"; if (s == null) return; if (s.indexOf(dsvColDelim) > 0) throw new SqlToolError( SqltoolRB.dsv_coldelim_present.getString(dsvColDelim)); if (s.indexOf(dsvRowDelim) > 0) throw new SqlToolError( SqltoolRB.dsv_rowdelim_present.getString(dsvRowDelim)); if (s.trim().equals(nullRepToken)) // The trim() is to avoid the situation where the contents of a // field "looks like" the null-rep token. throw new SqlToolError( SqltoolRB.dsv_nullrep_present.getString(nullRepToken)); } /** * Translates user-supplied escapes into the traditionaly corresponding * corresponding binary characters. * * Allowed sequences: *
                *
              • \0\d+ (an octal digit) *
              • \[0-9]\d* (a decimal digit) *
              • \[Xx][0-9]{2} (a hex digit) *
              • \n Newline (Ctrl-J) *
              • \r Carriage return (Ctrl-M) *
              • \t Horizontal tab (Ctrl-I) *
              • \f Form feed (Ctrl-L) *
              * * Java 1.4 String methods will make this into a 1 or 2 line task. */ public static String convertEscapes(String inString) { if (inString == null) return null; return convertNumericEscapes( convertEscapes(convertEscapes(convertEscapes(convertEscapes( convertEscapes(inString, "\\n", "\n"), "\\r", "\r"), "\\t", "\t"), "\\\\", "\\"), "\\f", "\f") ); } /** * @param string Non-null String to modify. */ private static String convertNumericEscapes(String string) { String workString = string; int i = 0; for (char dig = '0'; dig <= '9'; dig++) { while ((i = workString.indexOf("\\" + dig, i)) > -1 && i < workString.length() - 1) workString = convertNumericEscape(string, i); while ((i = workString.indexOf("\\x" + dig, i)) > -1 && i < workString.length() - 1) workString = convertNumericEscape(string, i); while ((i = workString.indexOf("\\X" + dig, i)) > -1 && i < workString.length() - 1) workString = convertNumericEscape(string, i); } return workString; } /** * @offset Position of the leading \. */ private static String convertNumericEscape(String string, int offset) { int post = -1; int firstDigit = -1; int radix = -1; if (Character.toUpperCase(string.charAt(offset + 1)) == 'X') { firstDigit = offset + 2; radix = 16; post = firstDigit + 2; if (post > string.length()) post = string.length(); } else { firstDigit = offset + 1; radix = (Character.toUpperCase(string.charAt(firstDigit)) == '0') ? 8 : 10; post = firstDigit + 1; while (post < string.length() && Character.isDigit(string.charAt(post))) post++; } return string.substring(0, offset) + ((char) Integer.parseInt(string.substring(firstDigit, post), radix)) + string.substring(post); } /** * @param string Non-null String to modify. */ private static String convertEscapes(String string, String from, String to) { String workString = string; int i = 0; int fromLen = from.length(); while ((i = workString.indexOf(from, i)) > -1 && i < workString.length() - 1) workString = workString.substring(0, i) + to + workString.substring(i + fromLen); return workString; } private void checkFor02(String s) throws SqlToolError { try { if (csvStyleQuoting && s.indexOf('\u0002') > -1) throw new SqlToolError( SqltoolRB.csv_coldelim_present.getString("\\u0002")); } catch (RuntimeException re) { throw new SqlToolError(SqltoolRB.read_convertfail.getString(), re); } } /** * Convert CSV 'line' into DSV 'lines'. */ private String preprocessCsvQuoting(String s, int lineNum) throws SqlToolError { StringBuilder sb = new StringBuilder(); int offset, segLen, prevOffset; if (s.indexOf('"') < 0) return s.replaceAll(dsvColSplitter, "\u0002"); prevOffset = -1; SEEK_QUOTEDFIELD: while (prevOffset < s.length() - 1) { // Get start of next quoted field: offset = s.indexOf('"', prevOffset + 1); segLen = ((offset < 0) ? s.length() : offset) - (prevOffset + 1); if (segLen > 1) // Here we insert non-quoted segments, replacing all // dsvColSplitters. sb.append(s.substring( prevOffset + 1, prevOffset + 1 + segLen) .replaceAll(dsvColSplitter, "\u0002")); if (offset < 0) break; // Done with line prevOffset = offset; while ((offset = s.indexOf( '"', prevOffset + 1)) > -1) { if (offset - prevOffset > 1) // Here we insert quoted segments without any "s. sb.append(s.substring( prevOffset + 1, offset)); prevOffset = offset; if (s.length() < offset + 2 || s.charAt(offset + 1) != '"') // Field terminated continue SEEK_QUOTEDFIELD; // Field-internal "" prevOffset++; sb.append('"'); } throw new SqlToolError( SqltoolRB.csv_quote_unterminated.getString(lineNum)); } return sb.toString(); } /** * Name is self-explanatory. * * @throws SqlToolError Would prefer to throw an internal exception, * but we want this method to have external * visibility. */ public void importDsv(String filePath, String skipPrefix) throws SqlToolError { /* * If there is user demand, open file in random access mode so don't * need to load 2 copies of the entire file into memory. * This will be difficult because can't use standard Java language * features to search through a character array for multi-character * substrings. */ requireConnection(); /* To make string comparisons, contains() methods, etc. a little * simpler and concise, just switch all column names to lower-case. * This is ok since we acknowledge up front that DSV import/export * assume no special characters or escaping in column names. */ if (csvStyleQuoting && (dsvColSplitter.indexOf('"') > -1 || dsvRowSplitter.indexOf('"') > -1)) throw new SqlToolError(SqltoolRB.dsv_q_nodblquote.getString()); Matcher matcher; SortedMap constColMap = null; if (dsvConstCols != null) { // We trim col. names, but not values. Must allow users to // specify values as spaces, empty string, null. // We do not support CVS-quoted style constColMap String. // Must be specified in DSV style. constColMap = new TreeMap(); for (String constPair : dsvConstCols.split(dsvColSplitter, -1)) { matcher = nameValPairPattern.matcher(constPair); if (!matcher.matches()) throw new SqlToolError( SqltoolRB.dsv_constcols_nullcol.getString()); constColMap.put(matcher.group(1).toLowerCase(), ((matcher.groupCount() < 2 || matcher.group(2) == null) ? "" : matcher.group(2))); } } Set skipCols = null; if (dsvSkipCols != null) { // We do not support CVS-quoted style skipCols String. // Must be specified in DSV style. skipCols = new HashSet(); for (String skipCol : dsvSkipCols.split(dsvColSplitter, -1)) skipCols.add(skipCol.trim().toLowerCase()); } FileRecordReader dsvReader = null; try { dsvReader = new FileRecordReader(filePath, dsvRowSplitter, (shared.encoding == null) ? DEFAULT_FILE_ENCODING : shared.encoding); } catch (UnsupportedEncodingException uee) { throw new SqlToolError(uee); } catch (IOException ioe) { throw new SqlToolError(SqltoolRB.file_readfail.getString(filePath)); } catch (PatternSyntaxException pse) { throw new SqlToolError( SqltoolRB.regex_malformat.getString(dsvRowSplitter)); } // TODO: Undefine message. I eliminated this constraint //throw new SqlToolError(SqltoolRB.read_toobig.getString(), re); int retval; String dateString; List headerList = new ArrayList(); String tableName = dsvTargetTable; // First read one until we get one header line int lineCount = 0; String trimmedLine = null; boolean switching = false; int headerOffset = 0; // Used to offset read-start of header record String curLine = null; // Val will be replaced 4 lines down // This is just to quiet compiler warning try { while (true) { try { curLine = dsvReader.nextRecord(); } catch (IOException ioe) { throw new SqlToolError(ioe); } if (curLine == null) throw new SqlToolError(SqltoolRB.dsv_header_none.getString()); checkFor02(curLine); lineCount++; trimmedLine = curLine.trim(); if (trimmedLine.length() < 1 || (skipPrefix != null && trimmedLine.startsWith(skipPrefix))) continue; if (trimmedLine.startsWith("targettable=")) { if (tableName == null) tableName = trimmedLine.substring( "targettable=".length()).trim(); continue; } if (trimmedLine.equals("headerswitch{")) { if (tableName == null) throw new SqlToolError( SqltoolRB.dsv_header_noswitchtarg.getString( lineCount)); switching = true; continue; } if (trimmedLine.equals("}")) throw new SqlToolError( SqltoolRB.dsv_header_noswitchmatch.getString(lineCount)); if (!switching) break; int colonAt = trimmedLine.indexOf(':'); if (colonAt < 1 || colonAt == trimmedLine.length() - 1) throw new SqlToolError( SqltoolRB.dsv_header_nonswitched.getString(lineCount)); String headerName = trimmedLine.substring(0, colonAt).trim(); // Need to be sure here that tableName is not null (in // which case it would be determined later on by the file name). if (headerName.equals("*") || headerName.equalsIgnoreCase(tableName)){ headerOffset = 1 + curLine.indexOf(':'); break; } // Skip non-matched header line } if (csvStyleQuoting) curLine = preprocessCsvQuoting(curLine, lineCount); String headerLine = curLine.substring(headerOffset); String colName; String[] cols = headerLine.split( (csvStyleQuoting ? "\u0002" : dsvColSplitter), -1); Set usedCols = new HashSet(); // Checks for dup cols for (String col : cols) { if (col.length() < 1) throw new SqlToolError(SqltoolRB.dsv_nocolheader.getString( headerList.size() + 1, lineCount)); colName = col.trim().toLowerCase(); if (colName.equals("-") || (skipCols != null && skipCols.remove(colName)) || (constColMap != null && constColMap.containsKey(colName))) colName = null; headerList.add(colName); if (colName == null) continue; if (usedCols.contains(colName.toLowerCase())) throw new SqlToolError( SqltoolRB.import_col_dup.getString(colName)); usedCols.add(colName.toLowerCase()); } if (skipCols != null && skipCols.size() > 0) throw new SqlToolError(SqltoolRB.dsv_skipcols_missing.getString( skipCols.toString())); boolean oneCol = false; // At least 1 non-null column for (String header : headerList) if (header != null) { oneCol = true; break; } if (oneCol == false) // Difficult call, but I think in any real-world situation, the // user will want to know if they are inserting records with no // data from their input file. throw new SqlToolError( SqltoolRB.dsv_nocolsleft.getString(dsvSkipCols)); int inputColHeadCount = headerList.size(); if (constColMap != null) headerList.addAll(constColMap.keySet()); String[] headers = headerList.toArray(new String[0]); // headers contains input headers + all constCols, some of these // values may be nulls. if (tableName == null) { tableName = dsvReader.getName(); int i = tableName.lastIndexOf('.'); if (i > 0) tableName = tableName.substring(0, i); } StringBuffer tmpSb = new StringBuffer(); List tmpList = new ArrayList(); int skippers = 0; for (String header : headers) { if (header == null) { skippers++; continue; } if (tmpSb.length() > 0) tmpSb.append(", "); tmpSb.append(header); tmpList.add(header); } boolean[] autonulls = new boolean[headers.length - skippers]; boolean[] parseDate = new boolean[autonulls.length]; boolean[] parseBool = new boolean[autonulls.length]; char[] readFormat = new char[autonulls.length]; String[] insertFieldName = tmpList.toArray(new String[] {}); // Remember that the headers array has all columns in DSV file, // even skipped columns. // The autonulls array only has columns that we will insert into. StringBuffer sb = new StringBuffer("INSERT INTO " + tableName + " (" + tmpSb + ") VALUES ("); StringBuffer typeQuerySb = new StringBuffer("SELECT " + tmpSb + " FROM " + tableName + " WHERE 1 = 2"); try { ResultSetMetaData rsmd = shared.jdbcConn.createStatement().executeQuery( typeQuerySb.toString()).getMetaData(); if (rsmd.getColumnCount() != autonulls.length) throw new SqlToolError( SqltoolRB.dsv_metadata_mismatch.getString()); // Don't know if it's possible to get here. // If so, it's probably a SqlTool problem, not a user or // data problem. // Should be researched and either return a user-friendly // message or a RuntimeExceptin. for (int i = 0; i < autonulls.length; i++) { autonulls[i] = true; parseDate[i] = false; parseBool[i] = false; readFormat[i] = 's'; // regular Strings switch(rsmd.getColumnType(i + 1)) { case java.sql.Types.BIT : autonulls[i] = true; readFormat[i] = 'b'; break; case java.sql.Types.LONGVARBINARY : case java.sql.Types.VARBINARY : case java.sql.Types.BINARY : autonulls[i] = true; readFormat[i] = 'x'; break; case java.sql.Types.BOOLEAN: parseBool[i] = true; break; case java.sql.Types.ARRAY : autonulls[i] = true; readFormat[i] = 'a'; break; case java.sql.Types.VARCHAR : case java.sql.Types.BLOB : case java.sql.Types.CLOB : case java.sql.Types.LONGVARCHAR : autonulls[i] = false; // This means to preserve white space and to insert // "" for "". Otherwise we trim white space and // insert null for \s*. break; case java.sql.Types.DATE: case java.sql.Types.TIME: case java.sql.Types.TIMESTAMP: case org.hsqldb.types.Types.SQL_TIMESTAMP_WITH_TIME_ZONE: case org.hsqldb.types.Types.SQL_TIME_WITH_TIME_ZONE: parseDate[i] = true; } } } catch (SQLException se) { throw new SqlToolError(SqltoolRB.query_metadatafail.getString( typeQuerySb.toString()), se); } for (int i = 0; i < autonulls.length; i++) { if (i > 0) sb.append(", "); sb.append('?'); } // Initialize REJECT file(s) int rejectCount = 0; File rejectFile = null; File rejectReportFile = null; PrintWriter rejectWriter = null; PrintWriter rejectReportWriter = null; try { if (dsvRejectFile != null) try { rejectFile = new File(dereferenceAt(dsvRejectFile)); rejectWriter = new PrintWriter( new OutputStreamWriter(new FileOutputStream(rejectFile), (shared.encoding == null) ? DEFAULT_FILE_ENCODING : shared.encoding)); rejectWriter.print(headerLine + dsvRowDelim); } catch (BadSpecial bs) { throw new SqlToolError(SqltoolRB.dsv_rejectfile_setupfail.getString( dsvRejectFile), bs); } catch (IOException ioe) { throw new SqlToolError(SqltoolRB.dsv_rejectfile_setupfail.getString( dsvRejectFile), ioe); } if (dsvRejectReport != null) try { rejectReportFile = new File(dereferenceAt(dsvRejectReport)); rejectReportWriter = new PrintWriter(new OutputStreamWriter( new FileOutputStream(rejectReportFile), (shared.encoding == null) ? DEFAULT_FILE_ENCODING : shared.encoding)); boolean setTitle = !shared.userVars.containsKey("REPORT_TITLE"); if (setTitle) shared.userVars.put("REPORT_TITLE", "SqlTool " + (csvStyleQuoting ? "CSV" : "DSV") + " Reject Report"); try { writeHeader(rejectReportWriter, dsvRejectReport); } finally { if (setTitle) shared.userVars.remove("REPORT_TITLE"); } rejectReportWriter.println(SqltoolRB.rejectreport_top.getString( dsvReader.getPath(), ((rejectFile == null) ? SqltoolRB.none.getString() : rejectFile.getPath()), ((rejectFile == null) ? null : rejectFile.getPath()))); } catch (BadSpecial bs) { throw new SqlToolError( SqltoolRB.dsv_rejectreport_setupfail.getString( dsvRejectReport), bs); } catch (IOException ioe) { throw new SqlToolError( SqltoolRB.dsv_rejectreport_setupfail.getString( dsvRejectReport), ioe); } int recCount = 0; int skipCount = 0; PreparedStatement ps = null; boolean importAborted = false; boolean doResetAutocommit = false; try { doResetAutocommit = dsvRecordsPerCommit > 0 && shared.jdbcConn.getAutoCommit(); if (doResetAutocommit) shared.jdbcConn.setAutoCommit(false); } catch (SQLException se) { throw new SqlToolError( SqltoolRB.rpc_autocommit_failure.getString(), se); } // We're now assured that if dsvRecordsPerCommit is > 0, then // autocommit is off. try { try { ps = shared.jdbcConn.prepareStatement(sb.toString() + ')'); } catch (SQLException se) { throw new SqlToolError( SqltoolRB.insertion_preparefail.getString( sb.toString()), se); } String[] dataVals = new String[autonulls.length]; // Length is number of cols to insert INTO, not nec. # in DSV file. int readColCount; int storeColCount; Matcher arMatcher; String currentFieldName = null; String[] arVals; // Insert data rows 1-row-at-a-time while (true) try { try { try { curLine = dsvReader.nextRecord(); } catch (IOException ioe) { throw new SqlToolError(ioe); } if (curLine == null) break; checkFor02(curLine); if (csvStyleQuoting) curLine = preprocessCsvQuoting(curLine, ++lineCount); trimmedLine = curLine.trim(); if (trimmedLine.length() < 1) continue; // Silently skip blank lines if (skipPrefix != null && trimmedLine.startsWith(skipPrefix)) { skipCount++; continue; } if (switching) { if (trimmedLine.equals("}")) { switching = false; continue; } int colonAt = trimmedLine.indexOf(':'); if (colonAt < 1 || colonAt == trimmedLine.length() - 1) throw new SqlToolError( SqltoolRB.dsv_header_matchernonhead.getString( lineCount)); continue; } // Finished using "trimmed" line now. Whitespace is // meaningful hereafter. // Finally we will attempt to add a record! recCount++; // Remember that recCount counts both inserts + rejects readColCount = 0; storeColCount = 0; cols = curLine.split( (csvStyleQuoting ? "\u0002" : dsvColSplitter), -1); for (String col : cols) { if (readColCount == inputColHeadCount) throw new RowError( SqltoolRB.dsv_colcount_mismatch.getString( inputColHeadCount, 1 + readColCount)); if (headers[readColCount++] != null) dataVals[storeColCount++] = dsvTrimAll ? col.trim() : col; } if (readColCount < inputColHeadCount) throw new RowError( SqltoolRB.dsv_colcount_mismatch.getString( inputColHeadCount, readColCount)); /* Already checked for readColCount too high in prev. block */ if (constColMap != null) for (String val : constColMap.values()) dataVals[storeColCount++] = val; if (storeColCount != dataVals.length) throw new RowError( SqltoolRB.dsv_insertcol_mismatch.getString( dataVals.length, storeColCount)); for (int i = 0; i < dataVals.length; i++) { currentFieldName = insertFieldName[i]; if (autonulls[i]) dataVals[i] = dataVals[i].trim(); // N.b. WE SPECIFICALLY DO NOT HANDLE TIMES WITHOUT // DATES, LIKE "3:14:00", BECAUSE, WHILE THIS MAY BE // USEFUL AND EFFICIENT, IT IS NOT PORTABLE. //System.err.println("ps.setString(" + i + ", " // + dataVals[i] + ')'); if (parseDate[i]) { if ((dataVals[i].length() < 1 && autonulls[i]) || dataVals[i].equals(nullRepToken)) { ps.setTimestamp(i + 1, null); } else { // BEWARE: This may not work for some non-US // date/time formats. if (dataVals[i].indexOf(':') > 0 && dataVals[i].indexOf('-') > 0) { dateString = dataVals[i]; } else if (dataVals[i].indexOf(':') < 1) { dateString = dataVals[i] + " 0:00:00"; } else if (dataVals[i].indexOf('-') < 1) { dateString = "0000-00-00 " + dataVals[i]; } else { dateString = null; // To shut up compiler assert false: "Unexpected date/time val: " + dataVals[i]; } try { ps.setTimestamp(i + 1, java.sql.Timestamp.valueOf(dateString)); } catch (IllegalArgumentException iae) { throw new RowError( SqltoolRB.time_bad.getString( dateString), iae); } } } else if (parseBool[i]) { if ((dataVals[i].length() < 1 && autonulls[i]) || dataVals[i].equals(nullRepToken)) { ps.setNull(i + 1, java.sql.Types.BOOLEAN); } else { try { ps.setBoolean(i + 1, Boolean.parseBoolean(dataVals[i])); // Boolean... is equivalent to Java 4's // Boolean.parseBoolean(). } catch (IllegalArgumentException iae) { throw new RowError( SqltoolRB.boolean_bad.getString( dataVals[i]), iae); } } } else { switch (readFormat[i]) { case 'b': ps.setBytes( i + 1, (dataVals[i].length() < 1) ? null : SqlFile.bitCharsToBytes( dataVals[i])); break; case 'x': ps.setBytes( i + 1, (dataVals[i].length() < 1) ? null : SqlFile.hexCharOctetsToBytes( dataVals[i])); break; case 'a' : if (SqlFile.createArrayOfMethod == null) throw new SqlToolError( SqltoolRB.arrayimp_jvmreq .getString()); if (dataVals[i].length() < 1) { ps.setArray(i + 1, null); break; } arMatcher = arrayPattern.matcher(dataVals[i]); if (!arMatcher.matches()) throw new RowError( SqltoolRB.arrayval_malformat .getString(dataVals[i])); arVals = (arMatcher.group(1) == null) ? (new String[0]) : arMatcher.group(1).split("\\s*,\\s*"); // N.b. THIS DOES NOT HANDLE commas WITHIN // Array ELEMENT VALUES. try { ps.setArray(i + 1, (java.sql.Array) SqlFile.createArrayOfMethod.invoke( shared.jdbcConn, "VARCHAR", arVals)); } catch (IllegalAccessException iae) { throw new RuntimeException(iae); } catch (InvocationTargetException ite) { if (ite.getCause() != null && ite.getCause() instanceof AbstractMethodError) throw new SqlToolError( SqltoolRB.sqlarray_badjvm .getString()); throw new RuntimeException(ite); } // createArrayOf method is Java-6-specific! break; default: ps.setString( i + 1, (((dataVals[i].length() < 1 && autonulls[i]) || dataVals[i].equals(nullRepToken)) ? null : dataVals[i])); } } currentFieldName = null; } retval = ps.executeUpdate(); if (retval != 1) throw new RowError( SqltoolRB.inputrec_modified.getString(retval)); if (dsvRecordsPerCommit > 0 && (recCount - rejectCount) % dsvRecordsPerCommit == 0) { shared.jdbcConn.commit(); shared.possiblyUncommitteds = false; } else { shared.possiblyUncommitteds = true; } } catch (NumberFormatException nfe) { throw new RowError(null, nfe); } catch (SQLException se) { throw new RowError(null, se); } } catch (RowError re) { rejectCount++; if (rejectWriter != null || rejectReportWriter != null) { if (rejectWriter != null) rejectWriter.print(curLine + dsvRowDelim); if (rejectReportWriter != null) genRejectReportRecord(rejectReportWriter, rejectCount, lineCount, currentFieldName, re.getMessage(), re.getCause()); } else { importAborted = true; throw new SqlToolError( SqltoolRB.dsv_recin_fail.getString( lineCount, currentFieldName) + ((re.getMessage() == null) ? "" : (" " + re.getMessage())), re.getCause()); } } } finally { if (ps != null) try { ps.close(); } catch (SQLException se) { // We already got what we want from it, or have/are // processing a more specific error. } finally { ps = null; // Encourage GC of buffers } try { if (dsvRecordsPerCommit > 0 && (recCount - rejectCount) % dsvRecordsPerCommit != 0) { // To be consistent, if *DSV_RECORDS_PER_COMMIT is set, we // always commit all inserted records. // This little block commits any straggler commits since the // last commit. shared.jdbcConn.commit(); shared.possiblyUncommitteds = false; } if (doResetAutocommit) shared.jdbcConn.setAutoCommit(true); } catch (SQLException se) { throw new SqlToolError( SqltoolRB.rpc_commit_failure.getString(), se); } String summaryString = null; if (recCount > 0) { summaryString = SqltoolRB.dsv_import_summary.getString( ((skipPrefix == null) ? "" : ("'" + skipPrefix + "'-")), Integer.toString(skipCount), Integer.toString(rejectCount), Integer.toString(recCount - rejectCount), (importAborted ? "importAborted" : null)); stdprintln(summaryString); } try { if (recCount > rejectCount && dsvRecordsPerCommit < 1 && !shared.jdbcConn.getAutoCommit()) stdprintln(SqltoolRB.insertions_notcommitted.getString()); } catch (SQLException se) { stdprintln(SqltoolRB.autocommit_fetchfail.getString()); stdprintln(SqltoolRB.insertions_notcommitted.getString()); // No reason to throw here. If user attempts to use the // connection for anything significant, we will throw then. } if (rejectWriter != null) rejectWriter.flush(); if (rejectReportWriter != null && rejectCount > 0) { rejectReportWriter.println( SqltoolRB.rejectreport_bottom.getString( summaryString, revnum)); writeFooter(rejectReportWriter, dsvRejectReport); rejectReportWriter.flush(); } } } finally { if (rejectWriter != null) try { rejectWriter.close(); } finally { rejectWriter = null; // Encourage GC of buffers } if (rejectReportWriter != null) try { rejectReportWriter.close(); } finally { rejectReportWriter = null; // Encourage GC of buffers } if (rejectCount == 0) { if (rejectFile != null && rejectFile.exists() && !rejectFile.delete()) errprintln(SqltoolRB.dsv_rejectfile_purgefail.getString( rejectFile.toString())); if (rejectReportFile != null && !rejectReportFile.delete()) errprintln(SqltoolRB.dsv_rejectreport_purgefail.getString( rejectReportFile.toString())); // These are trivial errors. } } } finally { if (dsvReader.isOpen()) try { dsvReader.close(); } catch (Exception ioe) { // Just log it logger.error( SqltoolRB.inputfile_closefail.getString() + ": " + ioe); } } } protected static void appendLine(StringBuffer sb, String s) { sb.append(s + LS); } /** * Does a poor-man's parse of a MSDOS command line and parses it * into a WIndows cmd.exe invocation to approximate. */ private static String[] genWinArgs(String monolithic) { List list = new ArrayList(); list.add("cmd.exe"); list.add("/y"); list.add("/c"); Matcher m = wincmdPattern.matcher(monolithic); while (m.find()) for (int i = 1; i <= m.groupCount(); i++) { if (m.group(i) == null) continue; if (m.group(i).length() > 1 && m.group(i).charAt(0) == '"') { list.add(m.group(i).substring(1, m.group(i).length() - 1)); continue; } list.addAll(Arrays.asList(m.group(i).split("\\s+", -1))); } return list.toArray(new String[] {}); } private void genRejectReportRecord(PrintWriter pw, int rCount, int lCount, String field, String eMsg, Throwable cause) { pw.println(SqltoolRB.rejectreport_row.getString( "sqltool-" + ((rCount % 2 == 0) ? "even" : "odd"), Integer.toString(rCount), Integer.toString(lCount), ((field == null) ? "" : field), (((eMsg == null) ? "" : eMsg) + ((eMsg == null || cause == null) ? "" : "
              ") + ((cause == null) ? "" : ( (cause instanceof SQLException && cause.getMessage() != null) ? cause.getMessage() : cause.toString() ) ) ))); } /** * Parses input into command tokens, but does not perform the commands * (unless you consider parsing blocks of nested commands to be * "performing" a command). * * Throws only if I/O error or if nestingCommand != null and * EOF encountered before end of entire file * (encountered at any level of recursion). * * Exceptions thrown within this method percolate right up to the * external call (in scanpass), regardless of ContinueOnErr setting. * This is because it's impossible to know when to terminate blocks * if there is a parsing error. * Only a separate SqlFile invocation (incl. \i command) will cause * a seekTokenSource exception to be handled at a level other than * the very top. * * @param nestingCommand Set to null to read scanner until EOF. */ private TokenList seekTokenSource(String nestingCommand) throws BadSpecial, IOException, SqlToolError { Token token; TokenList newTS = new TokenList(); Pattern endPattern = null; Pattern elsePattern = null; if (nestingCommand != null) if (nestingCommand.equals("if")) { endPattern = Pattern.compile("end\\s+" + nestingCommand); elsePattern = Pattern.compile("else"); } else if (nestingCommand.equals("else")) { endPattern = Pattern.compile("end\\s+if"); } else { endPattern = Pattern.compile("end\\s+" + nestingCommand); } String subNestingCommand; Matcher inlineNestMatcher; while ((token = scanner.yylex()) != null) { if (endPattern != null && token.type == Token.PL_TYPE && endPattern.matcher(token.val).matches()) return newTS; if (elsePattern != null && token.type == Token.PL_TYPE && elsePattern.matcher(token.val).matches()) { assert token.nestedBlock == null: "else statement's .nested block not null"; token.nestedBlock = seekTokenSource("else"); newTS.add(token); return newTS; } inlineNestMatcher = inlineNestMatcher(token); if (inlineNestMatcher != null) { processInlineBlock(token, inlineNestMatcher.group(1), inlineNestMatcher.group(2)); } else { subNestingCommand = nestingCommand(token); if (subNestingCommand != null) token.nestedBlock = seekTokenSource(subNestingCommand); } newTS.add(token); } if (nestingCommand == null) return newTS; throw new BadSpecial( SqltoolRB.pl_block_unterminated.getString(nestingCommand)); } /** * We want leading space to be trimmed. * Leading space should probably not be trimmed, but it is trimmed now * (by the Scanner). */ private void processMacro(Token defToken) throws BadSpecial { Matcher matcher; Token macroToken; if (defToken.val.length() < 1) throw new BadSpecial(SqltoolRB.macro_tip.getString()); int newType = -1; StringBuffer newVal = new StringBuffer(); switch (defToken.val.charAt(0)) { case '?': stdprintln(SqltoolRB.macro_help.getString()); break; case ':': matcher = editMacroPattern.matcher(defToken.val); if (!matcher.matches()) throw new BadSpecial(SqltoolRB.macro_malformat.getString()); if (buffer == null) { stdprintln(nobufferYetString); return; } newVal.append(buffer.val); if (matcher.groupCount() > 1 && matcher.group(2) != null && matcher.group(2).length() > 0) newVal.append(matcher.group(2)); newType = buffer.type; if (newVal.length() < 1) throw new BadSpecial(SqltoolRB.macrodef_empty.getString()); if (newVal.charAt(newVal.length() - 1) == ';') throw new BadSpecial(SqltoolRB.macrodef_semi.getString()); shared.macros.put(matcher.group(1), new Token(buffer.type, newVal, defToken.line)); break; case '=': String defString = defToken.val; defString = defString.substring(1).trim(); if (defString.length() < 1) { for (Map.Entry entry : shared.macros.entrySet()) stdprintln(entry.getKey() + " = " + entry.getValue().reconstitute()); break; } matcher = legacyEditMacroPattern.matcher(defString); if (matcher.matches()) { if (buffer == null) { stdprintln(nobufferYetString); return; } newVal.append(buffer.val); if (matcher.groupCount() > 1 && matcher.group(2) != null && matcher.group(2).length() > 0) newVal.append(matcher.group(2)); newType = buffer.type; } else { matcher = spMacroPattern.matcher(defString); if (matcher.matches()) { newVal.append(matcher.group(3)); newType = (matcher.group(2).equals("*") ? Token.PL_TYPE : Token.SPECIAL_TYPE); } else { matcher = sqlMacroPattern.matcher(defString); if (!matcher.matches()) throw new BadSpecial( SqltoolRB.macro_malformat.getString()); newVal.append(matcher.group(2)); newType = Token.SQL_TYPE; } } if (newVal.length() < 1) throw new BadSpecial(SqltoolRB.macrodef_empty.getString()); if (newVal.charAt(newVal.length() - 1) == ';') throw new BadSpecial(SqltoolRB.macrodef_semi.getString()); shared.macros.put(matcher.group(1), new Token(newType, newVal, defToken.line)); break; default: matcher = useFnPattern.matcher(defToken.val); if (matcher.matches()) { macroToken = shared.macros.get(matcher.group(1) + ')'); if (macroToken == null) throw new BadSpecial( SqltoolRB.macro_undefined.getString( matcher.group(1) + "...)")); String[] splitVars = null; if (matcher.groupCount() > 1 && matcher.group(2) != null && matcher.group(2).length() > 0) { //buffer.val += matcher.group(2); splitVars = matcher.group(2).split("\\s*,\\s*", -1); } else { splitVars = new String[0]; } String thirdGroup = (matcher.groupCount() > 2 && matcher.group(3) != null) ? matcher.group(3) : null; preempt = thirdGroup != null && thirdGroup.endsWith(";"); if (preempt) { if (thirdGroup.length() == 1) { thirdGroup = null; } else { thirdGroup = thirdGroup.substring(0, thirdGroup.length() - 1); } } Matcher templateM = fnParamPat.matcher(macroToken.val); int prevEnd = 0; String varVal; int varNum; setBuf(macroToken); buffer.val = ""; buffer.line = defToken.line; while (templateM.find()) { buffer.val += macroToken.val .substring(prevEnd, templateM.start()); varNum = Integer.valueOf( templateM.group(templateM.groupCount())); varVal = (varNum > 0 && varNum <= splitVars.length) ? splitVars[varNum-1] : null; if (varVal == null && (templateM.groupCount() < 2 || templateM.group(1) == null || templateM.group(1).length() < 1)) throw new BadSpecial( SqltoolRB.plvar_undefined.getString( templateM.group(templateM.groupCount()))); if (varVal != null) buffer.val += varVal; prevEnd = templateM.end(); } buffer.val += macroToken.val.substring(prevEnd); if (thirdGroup != null) buffer.val += thirdGroup; return; } matcher = useMacroPattern.matcher(defToken.val); if (!matcher.matches()) throw new BadSpecial(SqltoolRB.macro_malformat.getString()); macroToken = shared.macros.get(matcher.group(1)); if (macroToken == null) throw new BadSpecial(SqltoolRB.macro_undefined.getString( matcher.group(1))); setBuf(macroToken); buffer.line = defToken.line; if (matcher.groupCount() > 1 && matcher.group(2) != null && matcher.group(2).length() > 0) buffer.val += matcher.group(2); preempt = matcher.group(matcher.groupCount()).equals(";"); } } /** * Convert a String to a byte array by interpreting every 2 characters as * an octal byte value. */ public static byte[] hexCharOctetsToBytes(String hexChars) { int chars = hexChars.length(); if (chars != (chars / 2) * 2) throw new NumberFormatException("Hex character lists contains " + "an odd number of characters: " + chars); byte[] ba = new byte[chars/2]; int offset = 0; char c; int octet; for (int i = 0; i < chars; i++) { octet = 0; c = hexChars.charAt(i); if (c >= 'a' && c <= 'f') { octet += 10 + c - 'a'; } else if (c >= 'A' && c <= 'F') { octet += 10 + c - 'A'; } else if (c >= '0' && c <= '9') { octet += c - '0'; } else { throw new NumberFormatException( "Non-hex character in input at offset " + i + ": " + c); } octet = octet << 4; c = hexChars.charAt(++i); if (c >= 'a' && c <= 'f') { octet += 10 + c - 'a'; } else if (c >= 'A' && c <= 'F') { octet += 10 + c - 'A'; } else if (c >= '0' && c <= '9') { octet += c - '0'; } else { throw new NumberFormatException( "Non-hex character in input at offset " + i + ": " + c); } ba[offset++] = (byte) octet; } assert ba.length == offset: "Internal accounting problem. Expected to fill buffer of " + "size "+ ba.length + ", but wrote only " + offset + " bytes"; return ba; } /** * Just a stub for now. */ public static byte[] bitCharsToBytes(String hexChars) { if (hexChars == null) throw new NullPointerException(); // To shut up compiler warn throw new NumberFormatException( "Sorry. Bit exporting not supported yet"); } private void requireConnection() throws SqlToolError { if (shared.jdbcConn == null) throw new SqlToolError(SqltoolRB.no_required_conn.getString()); } /** * Returns a String report for the specified JDBC Connection. * * For databases with poor JDBC support, you won't get much detail. */ public static String getBanner(Connection c) { try { DatabaseMetaData md = c.getMetaData(); return (md == null) ? null : SqltoolRB.jdbc_established.getString( md.getDatabaseProductName(), md.getDatabaseProductVersion(), md.getUserName(), (c.isReadOnly() ? "R/O " : "R/W ") + RCData.tiToString( c.getTransactionIsolation())); } catch (SQLException se) { return null; } } private void displayConnBanner() { String msg = (shared.jdbcConn == null) ? SqltoolRB.disconnected_msg.getString() : SqlFile.getBanner(shared.jdbcConn); stdprintln((msg == null) ? SqltoolRB.connected_fallbackmsg.getString() : msg); } private String dereferenceAt(String s) throws BadSpecial { if (s.indexOf('@') != 0) return s; if (baseDir == null) throw new BadSpecial(SqltoolRB.illegal_at.getString()); return baseDir.getPath() + s.substring(1); } /** * Escaping rules taken from 'Reserved Characters in HTML table at * http://www.w3schools.com/tags/ref_entities.asp */ public static String escapeHtml(String s) { StringBuilder sb = new StringBuilder(); char[] charArray = s.toCharArray(); for (char c : charArray) switch (c) { case '"': sb.append("""); break; case '\'': // This case not supported by Commons Lang's escapeHtml sb.append("'"); break; case '&': sb.append("&"); break; case '<': sb.append("<"); break; case '>': sb.append(">"); break; default: sb.append(c); } return sb.toString(); } /** * @param filePath only used for error reporting. */ private void writeHeader(PrintWriter pWriter, String filePath) throws BadSpecial, SqlToolError { char[] readBfr = new char[1024]; int i; StringWriter sWriter = new StringWriter(); InputStreamReader isr = null; String str; try { InputStream is = (topHtmlFile == null) ? getClass().getResourceAsStream( "sqltool/top-boilerplate.html") : new FileInputStream(topHtmlFile); if (is == null) throw new IOException("Missing resource: " + ((topHtmlFile == null) ? topHtmlFile : "sqltool/top-boilerplate")); isr = new InputStreamReader(is); while ((i = isr.read(readBfr)) > -1) sWriter.write(readBfr, 0, i); readBfr = null; str = sWriter.toString(); sWriter.close(); } catch (Exception e) { throw new BadSpecial( SqltoolRB.file_writefail.getString(filePath), e); } finally { try { if (isr != null) isr.close(); } catch (IOException ioe) { // TODO: Throw appropriate exception } } pWriter.write(dereference(str.replaceAll("\\r?\\n", LS), true)); } /** * @param filePath only used for error reporting. */ private void writeFooter(PrintWriter pwQuery, String filePath) throws SqlToolError { char[] readBfr = new char[1024]; int i; StringWriter sWriter = new StringWriter(); InputStreamReader isr = null; String str; try { InputStream is = (bottomHtmlFile == null) ? getClass().getResourceAsStream( "sqltool/bottom-boilerplate.html") : new FileInputStream(bottomHtmlFile); if (is == null) throw new IOException("Missing resource: " + ((bottomHtmlFile == null) ? bottomHtmlFile : "sqltool/bottom-boilerplate")); isr = new InputStreamReader(is); while ((i = isr.read(readBfr)) > -1) sWriter.write(readBfr, 0, i); readBfr = null; str = sWriter.toString(); sWriter.close(); } catch (Exception e) { throw new SqlToolError( SqltoolRB.file_writefail.getString(filePath), e); } finally { try { if (isr != null) isr.close(); } catch (IOException ioe) { // TODO: Throw appropriate exception } } pwQuery.write(dereference(str.replaceAll("\\r?\\n", LS), true)); } private void processInlineBlock( Token t, String ifCmdText, String nestingText) throws BadSpecial, IOException, SqlToolError { assert t.nestedBlock == null: "Inline-nest command has .nestBlock pre-populated"; SqlFileScanner storedScanner = scanner; try { scanner = new SqlFileScanner(new StringReader(nestingText + '\n')); scanner.setStdPrintStream(shared.psStd); scanner.setRawLeadinPrompt(""); scanner.setInteractive(interactive); t.nestedBlock = seekTokenSource(null); } finally { scanner = storedScanner; } t.val = ifCmdText; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool_nl.properties0000644000175000017500000003232212007547370024664 0ustar renerene# $Id: sqltool_nl.properties 4698 2011-11-04 18:32:08Z unsaved $ # IMPORTANT: Make sure to use ISO-8859-1 encoding for any extended characters, # both in this file (actually any .properties file) and all referenced text # files. # GENERAL .properties SYNTAX: # White space AT END OF LINES IS SIGNIFICANT # White space at beginning of lines is not # \ at very end of line makes the following line a continuation line (with # no implied newline in the value. # (Combined with the previous 2 rules, this means that white space before # this \ is significant, and whitespace at beginning of continutation lines # is not). # \n does not work as an escape. Use unicode \u000a for line breaks instead. # Default Locale String resources for SqlTool. # This file is loaded by RefCapablePropertyResourceBundle, so if any # property here has no value set, the value MUST be set in a file # located at sqltool/PROPERTYNAME.text # The empty val settings in sqltool.properties are inherited to the other # languages, so see the "sqltool.properties" file about that. # Property keys MAY NOT CONTAIN UNDERSCORE. Underscores in Enum constants # will automatically be transated to dots. # Traditional inline .properties values: rawmode.prompt=raw SqlTool.varset.badformat=Variabele settings zijn niet van het juiste formaat "naam=waarde[,...]". SqlTool.abort.continue.mutuallyexclusive=Opties '--abortOnErr' en \ '--continueOnErr' kunnen niet gelijktijdig worden gebruikt. sqltempfile.fail=Het schrijven van de opgegeven sql naar een tijdelijk bestand is mislukt.\u000aReden: %{1} rcdata.inlineurl.missing=Het 'url' element is verplicht bij het gebruik van inline RC argument. rcdata.inline.extravars=Niet ondersteunde inline element(en) verstrekt: %{1}. rcdata.inlineusername.missing=Het 'user' element is verplicht bij het gebruik van inline RC argument. password.readfail=Wachtwoord lezen is mislukt.\u000aReden: %{1} sqltempfile.fail=Het schrijven van de opgegeven sql naar een tijdelijk bestand is mislukt.\u000aReden: %{1} rcdata.genfromvalues.fail=Het genereren van RCData uit de opgegeven waardes is mislukt.\u000aReden: %{1} conndata.retrieval.fail=Het ophalen van de verbindings informatie voor url identificatie "%{1}" is mislukt.\u000aReden: %{2} jdbc.established=JDBC verbinding totstand gekomen naar een %{1} v. %{2} database als "%{3}". connection.fail=Het opzetten van een verbinding naar '%{1}' als gebruiker "%{2}" is mislukt.\u000aReden: %{3} tempfile.removal.fail=Fout opgetreden bij het verwijderen van het tijdelijke bestand '%1'. # Value for following line has trailing whitespace on purpose. passwordFor.prompt=Geef wachtwoord voor %{1}: sqlfile.readfail=Kan SQL bestand niet lezen '%{1}'. raw.movedtobuffer=Ruw SQL fragment geplaatst in buffer. Run ":;" om het fragment uit te voeren. input.movedtobuffer=Huidige input geplaatst in buffer. sqlstatement.empty=Leeg SQL Statement. causereport=Reden: %{1} break.unsatisfied=Onjuist geplaatst 'break' commando (type %{1}). continue.unsatisfied=Onjuist geplaatst 'continue' commando${1:+ (type '%1')}. input.unterminated=Onafgesloten input: "%{1}" primaryinput.accessfail=Fout bij het benaderen van de primaire input. aborting=Voortijdig beeindigen van SqlTool: %{1} plvar.set.incomplete=Het zetten van de variable '%{1}' is niet voltooid. inputreader.closefail=Het sluiten van de input lezer is mislukt. rollingback=Terugrollen van SQL transactie. special.unspecified=Speciaal commando van onbekend type? buffer.executing=Uitvoeren van commando uit buffer:\u000a"%{1}"\u000a executing=Uitvoeren commando:\u000a"%{1}"\u000a nobuffer.yet=Nog geen buffer. commandnum.malformat=Onjuist geformatteerd commando nummer "%{1}". buffer.restored=Navolgende commando teurggehaald naar de buffer. Geef ":?" voor een lijst van de beschikbare buffer commando's.\u000a%{1} substitution.malformat=Onjuist geformatteerd vervangings commando substitution.nomatch=Buffer niet gewijzigd vanwege ontbreken patroon overeenkomst substitution.syntax=Substitutie syntax: ":s/van regular expression/naar string/igm;". \ Optionele modes i, g, m, ;. buffer.unknown=Onbekend Buffer commando ":%{1}". dsv.x.syntax=Export syntax: "\\x tabel_of_view_naam " OF "\\x SELECT statement".\u000a\ (Eindig niet met ';', omdat het \\x commando geen SQL is). dsv.m.syntax=Import syntax: \\m file/path.dsv [*] (* betekent geen commentaar in DSV bestand). special.extrachars=Extra characters na "\\%{1}" commando: %{2} buffer.extrachars=Extra characters na ":{1}" commando: %{2} special.malformat=Onjuist samengesteld special commando. html.mode=HTML Mode is nu gelijkgesteld aan %{1}. dsv.targetfile.demand=U moet de PL variabele '*DSV_TARGET_FILE' zetten om gebruik te maken van de query variant van \\x. file.wrotechars=%{1} karakters geschreven naar bestand '%{2}'. file.writefail=Fout bij het schrijven naar bestand '%{1}'. file.appendfail=Fout bij het toevoegen van informatie aan bestand '%{1}'. destfile.demand=U dient een bestemmings bestand naam op te geven. special.d.like=Describe commando's moeten zijn samengesteld als '\\dX' of als '\\d OBJECTNAME'. '\\d?' om een lijst te maken. outputfile.nonetoclose=Er is geen query uitvoer bestand om te sluiten. outputfile.reopening=Huidige query uitvoer bestand wordt gesloten en een nieuwe wordt geopend. outputfile.header=Query uitvoer van %{1}. buffer.empty=Geen commando aanwezig in buffer. sqlfile.name.demand=U dient een SQL bestands naam te specificeren. sqlfile.execute.fail=Het uitvoeren van de inhoud van SQL bestand '%{1}' is mislukt. a.setting=Auto-commit is gezet op %{1}. committed=Sessie doorgevoerd. special.b.malformat=Onjuist samengesteld binair commando. binary.loadedbytesinto=%{1} bytes geladen in binaire buffer. binary.filefail=Hetladen/dumpen van binaire data naar bestand '%{1}' is mislukt. c.setting=Doorgaan-bij-fout is gezet op %{1}. bang.incomplete=U moet ! laten volgen door het uit te voeren externe commando . bang.command.fail=Uitvoering extern commando mislukt:\u000a"%{1}" special.unknown=Onbekend Speciaal commando "\\%{1}". raw.empty=Ruw statement afgebroken (geen input gespecificeerd). dsv.nocolsleft=Geen resterende kolommenna weglaten van %{1:+"%1" en }"-" kolommen. dsv.skipcols.missing=De volgende over te slaan kolom(men) zijn niet aanwezig: %{1}. plalias.malformat=Onjuist geformatteerd PL alias gebruik. plvar.undefined=Ongedefinieerde PL variabele "%{1}". var.infinite=Mogelijk oneindige variabele regressie samenhangend met '%{1}'. sysprop.empty=Lege Systeem eigenschap variabele naam. sysprop.unterminated=Onafgesloten Systeem Property variabele naam. sysprop.undefined=Ongedefinieerde Systeem Property "%{1}". plvar.nameempty=Lege PL variabele naam. plvar.unterminated=Onjuist afgesloten PL variabele naam. pl.malformat=Onjuist geformatteerd PL commando. # TODO: translate this entry: deprecated.noop=Deprecated: %{1}. end.noblock=Het PL end statement is niet omgeven door enig PL blok. continue.syntax=Het PL 'continue' statement vereist geen argument ofwel een van \ 'foreach', 'while'. break.syntax=Het PL 'break' statement vereist geen argument ofwel een van \ 'foreach', 'if', 'while', 'file'. pl.list.parens=De buitenste haakjes zijn geen onderdeel van de waarden. pl.list.lengths=Weergave van variabele namen en de lengte van de waarden \ (gebruik 'listvalues' om de waarden te zien). dumpload.malformat=Onjuist geformatteerd PL 'dump' of 'load' commando. plvar.nocolon=PL variabele namen mogen geen ':' bevatten. plvar.tildedash.nomoreargs=PL ~/_ set commando's kennen geen andere argumenten ("%{1}"). dumpload.fail=Het dumpen/laden van variabele '%{1}' naar/van bestand '%{2}' is mislukt. prepare.malformat=Onjuist geformatteerd PL 'prepare' commando. foreach.malformat=Onjuist geformatteerd PL 'foreach' commando. pl.tempfile.fail=Fout bij het schrijven naar het PL blok tijdelijke bestand. pl.block.fail=Fout bij het uitvoeren van instructies uit het PL blok. ifwhile.malformat=Onjuist geformatteerd PL 'if'/'while' commando. if.malformat=Onjuist geformatteerd PL 'if' commando. while.malformat=Onjuist geformatteerd PL 'while' commando. pl.unknown=Onbekend PL commando "%{1}". pl.block.unterminated=Onafgesloten PL '%{1}' blok end.syntax=Het PL 'end' statement vereist een van de volgende argumenten \ 'foreach' of 'if' of 'while' (%{1}). vendor.oracle.dS=*** WAARSCHUWING:\u000a\ *** De tabellen in het systeem schema worden niet gelijst omdat \u000a\ *** Oracle TM) geen JDBC systeem tabel lijst teruggeeft. vendor.derby.dr=Derby heeft SQL Rollen niet geimplementeerd. vendor.nosup.d=SqlFile ondersteunt nog niet \\d%{1} van uw database leverancier. vendor.derby.du=Het is onmogelijk om een betrouwbare gebruikers lijst van Derby te verkrijgen. special.d.unknown=Onbekende beschrijvings optie: '%{1}'. metadata.fetch.fail=Ophalen van de metadata uit de database is mislukt. metadata.fetch.failfor=Ophalen metadata uit database voor '%{1}' is mislukt. prepare.demandqm=Prepared statements moeten een '?' bevatten. binbuffer.empty=Binaire SqlFile buffer is leeg. vendor.nosup.sysschemas=*** WAARSCHUWING:\u000a\ *** De tabellen in het systeem schema wordt niet gelijst \u000a\ *** (omdat de DB levernacier deze niet onderscheidt naar JDBC). noresult=Geen resultaat. dsv.bincol=Tabel heeft een binaire kolom. DSV bestanden bevatten tekst, geen binaire informatie. binbuf.write=%{1} bytes gelezen van veld '%{2}' (type %{3}) in de binaire buffer. rows.fetched=%{1} rijen opgehaald. rows.fetched.dsv=%{1} rij(en) opgehaald uit de database. row.update.multiple=%{1} rijen gewijzigd. row.update.singular=1 rij gewijzigd. history.unavailable=Commando historie niet beschikbaar. history.none=Nog geen historie beschikbaar. editbuffer.contents=Wijzig-Buffer inhoud:\u000a"%{1}" buffer.instructions=Plaats een commando in de buffer zoals ":27" or ":-3". \ Voor buffer inhoud hernieuwd uit middels ":;". history.number.req=U dient een positief commando nummer te specificeren, of \ een negatief getal\u000ahetgeen X commandos "terug" betekent. history.backto=Historie gaat slechts terug tot #%{1}. history.upto=Historie gaat slechts tot #%{1}. history.back=Historie gaat slechts %{1} commando(s) terug. describe.table.name=NAAM describe.table.datatype=DATATYPE describe.table.width=BREEDTE describe.table.nonulls=NIET-NULLEN logical.unrecognized=Niet herkende logische operatie. read.toobig=Resource is te groot om een keer te kunnen verwerken.\u000a\ Draai het programma opnieuw met meer RAM (try Java -Xm* switches).: read.partial=Niet alle bytes zijn ingelezen. %{1} bytes gelezen uit het beschikbare %{2} aantal. read.convertfail=Waarde te groot om te converteren naar een String. \ draai het programma opnieuw met meer RAM geheugen (probeer Java -Xm* parameters). dsv.coldelim.present=Gegevens uit tabel bevatten onze kolom delimiter '%{1}'. dsv.rowdelim.present=Gegevens uit tabel bevatten onze rij delimiter '%{1}'. dsv.nullrep.present=Gegevens uit tabel bevatten onze null-representation token '%{1}'. dsv.constcols.nullcol=*DSV_CONST_COLS element heeft null kolom naam. file.readfail=Kan bestand '%{1}' niet lezen. inputfile.closefail=Fout bij het sluiten van invoer bestand. dsv.header.none=Geen header record in invoer bestand. dsv.header.noswitchtarg=Headerswitch in DSV bestand regel ${1}, maar er is nog geen doel tabel gespecificeerd. dsv.header.noswitchmatch=Afsluiten van een headerswitch bereikt in DSV bestand regel %{1} zonder bijbehorende header. dsv.header.nonswitched=Header regel binnen switch zonder tabel matcher in DSV file regel %{1}. dsv.nocolheader=Geen kolomheader voor kolom #%{1} in DSV bestand regel %{2}. dsv.metadata.mismatch=Kolommen Metadata mismatch. query.metadatafail=Het ophalen van metadata voor query door gebruik van :\u000a"%{1}" is mislukt dsv.rejectfile.setupfail=Fout bij het opzetten van een afkeuringen bestand '%{1}'. dsv.rejectreport.setupfail=Het opzetten van het bestand met afkeuringen is mislukt '%{1}'. none=Geen block.disabled=BLOK GEDEACTIVEERD insertion.preparefail=Het voorbereiden van de toevoeg setup string:\u000a"%{1}" is mislukt dsv.header.matchernonhead=Niet Header gerelateerde regel in tabel matcher blok in DSV bestand regel %{1}. dsv.colcount.mismatch=Header heeft %{1} kolommen, maar invoer record heeft %{2} kolom waarden. dsv.nonskip.mismatch=Header heeft %{1} aantal niet over te slaan kolommen, maar het invoer record heeft %{2} invoeg waardes. time.bad=Onjuiste datum/tijd waarde '%{1}'. boolean.bad=Onjuiste boolean waarde '%{1}'. inputrec.modified=%{1} rijen gewijzigd door deze invoer regel. dsv.recin.fail=Het interpreteren of invoegen van invoer regel %{1} %{2:+, kolom '%2' } is mislukt. dsv.import.summary=Import samenvatting (%{1}genegeerd / afkeuringen / toevoegingen): %{2} \ / %{3} / %{4}. dsv.import.summary=Import samenvatting (%{1}genegeerd / afkeuringen / toevoegingen): \ %{2} / %{3} / %{4}%{5:+ voor afbreken}. insertions.notcommitted=Toevoegingen zullen verloren gaan als U geen commit doorvoert. autocommit.fetchfail=Het verkrijgen van de connectie autocommit waarde is mislukt. dsv.rejectfile.purgefail=Het verwijderen van het onnodige afkeuringen bestand is mislukt '%{1}'. dsv.rejectreport.purgefail=Het verwijderen van het onnodige afkeuringen rapport is mislukt '%{1}'. hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/package.html0000644000175000017500000000030312007547370022633 0ustar renerene Contains command-line utilities. See the SqlTool chapter of the HyperSQL Utilities Guide hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/sqltool.properties0000644000175000017500000003712712007547370024203 0ustar renerene# $Id: sqltool.properties 4809 2011-11-20 21:12:35Z unsaved $ # Default Locale String resources for SqlTool. # IMPORTANT: Make sure to use ISO-8859-1 encoding for any extended characters, # both in this file (actually any .properties file) and all referenced text # files. # GENERAL .properties SYNTAX: # White space AT END OF LINES IS SIGNIFICANT # White space at beginning of lines is not # \ at very end of line makes the following line a continuation line (with # no implied newline in the value. # (Combined with the previous 2 rules, this means that white space before # this \ is significant, and whitespace at beginning of continutation lines # is not). # \n does not work as an escape. Use unicode \u000a for line breaks instead. # This file is loaded by RefCapablePropertyResourceBundle, so if any # property here has no value set, the value MUST be set in a file # located at sqltool/PROPERTYNAME.text # Property keys MAY NOT CONTAIN UNDERSCORE. Underscores in Enum constants # will automatically be transated to dots. # These empty-vals tell RefCapablePropertyResourceBundle to look for text files: SqlTool.syntax= SqlFile.banner= buffer.help= special.help= pl.help= pl.control= pl.assign= dsv.options= d.options= raw.leadin= errorat= rejectreport.top= rejectreport.row= rejectreport.bottom= macro.help= # Traditional inline .properties values: rawmode.prompt=raw SqlTool.varset.badformat=Variable settings not of format "name=value[,...]". SqlTool.abort.continue.mutuallyexclusive=Switches '--abortOnErr' and \ '--continueOnErr' are mutually exclusive. SqlTool.params.redundant=Redundant command-line switch(es) specified. \u000a\ Use '--help' switch for syntax help. sqltempfile.fail=Failed to write given sql to temp file.\u000aCause: %{1} rcdata.inlineurl.missing='url' element is required for inline RC arg. rcdata.inline.extravars=Unsupported inline element(s) supplied: %{1}. rcdata.inlineusername.missing='user' element is required for inline RC arg. rcdata.password.visible='password' element must have empty value. \ For non-empty password, give no\u000a\ password element and you will be prompted for the value. password.readfail=Failed to read in password.\u000aCause: %{1} rcdata.genfromvalues.fail=Failed to generate RCData from given values.\u000aCause: %{1} conndata.retrieval.fail=Failed to retrieve connection info for urlid "%{1}".\u000aCause: %{2} jdbc.established=JDBC Connection established to a %{1} v. %{2} database\u000a\ as "%{3}" with %{4} Isolation. connection.fail=Failed to get a connection to '%{1}' as user "%{2}".\u000aCause: %{3} # Value for following line has trailing whitespace on purpose. passwordFor.prompt=Enter password for %{1}: raw.movedtobuffer=Raw SQL chunk moved into edit buffer. Run ":;" to execute the chunk. input.movedtobuffer=Current input moved into edit buffer. sqlstatement.empty=Empty SQL Statement. causereport=Cause: %{1} break.unsatisfied=Unsatisfied 'break' statement (type %{1}). continue.unsatisfied=Unsatisfied 'continue' statement%{1:+ (type '%1')}. input.unterminated=Unterminated input: "%{1}" primaryinput.accessfail=Error accessing primary input. aborting=Aborting SqlTool: %{1} plvar.set.incomplete=Did not finish setting variable '%{1}' before a code block exited. rollingback=Rolling back SQL transaction. bufhist.unspecified=No command specified. Run ":?" to list Edit-Buffer/History Commands. special.unspecified=No command specified. Run "\\?" to list Special Commands. buffer.executing=Executing command from edit buffer:\u000a"%{1}"\u000a nobuffer.yet=No edit buffer contents yet. commandnum.malformat=Malformatted command number "%{1}". buffer.restored=Restored following command to buffer. Enter ":?" to list buffer commands.\u000a%{1} substitution.malformat=Malformatted substitution command. substitution.nomatch=Edit buffer unchanged due to no pattern match. substitution.syntax=Substitution syntax: ":s/from regex/to string/igm;". \ Optional modes i, g, m, ;. buffer.unknown=Unknown Edit-Buffer/History command ":%{1}". dsv.x.syntax=Export syntax: "\\x table_or_view_name " OR "\\x SELECT statement".\u000a\ OR for CSV-style double-quoting: "\\xq tbl_view_name " OR "\\xq SELECT stmt".\u000a\ (Do not end with ';', since the \\x command itself is not SQL). dsv.m.syntax=Import syntax: \\m file/path.dsv [*]\u000a\ OR \\mq file/path.csv [*] (for CSV-style double-quoting)\u000a\ * means no comments in DSV file. special.extrachars=Extra characters after "\\%{1}" command: %{2} buffer.extrachars=Extra characters after ":%{1}" command: %{2} special.malformat=Malformatted special command. html.mode=HTML Mode is now set to %{1}. dsv.targetfile.demand=You must set PL variable '*DSV_TARGET_FILE' in order to use the query variant of \\x. file.wrotechars=Wrote %{1} characters to file '%{2}'. file.writefail=Failed to write to file '%{1}'. file.appendfail=Failed to append to file '%{1}'. destfile.demand=You must supply a destination file name. special.d.like=Describe commands must be like '\\dX' or like '\\d OBJECTNAME'. '\\d?' to list. outputfile.nonetoclose=There is no query output file to close. outputfile.reopening=Closing current query output file and opening new one. outputfile.header=Query output from %{1}. buffer.empty=No command in edit buffer. sqlfile.name.demand=You must supply an SQL file name. sqlfile.execute.fail=Failed to execute contents of SQL file '%{1}'. a.setting=Auto-commit is set to %{1}. committed=Session committed. special.b.malformat=Malformatted binary command. binary.loadedbytesinto=Loaded %{1} bytes into Binary buffer. binary.filefail=Failed to load/dump binary data to file '%{1}'. c.setting=Continue-on-error is set to %{1}. bang.incomplete=You must follow ! with the external command to run. bang.command.fail=External command failed:\u000a"%{1}" special.unknown=Unknown Special command "\\%{1}". raw.empty=Raw statement aborted (no input given). dsv.nocolsleft=No remaining columns after omitting %{1:+"%1" and }"-" columns. dsv.skipcols.missing=The following skip column(s) not present: %{1}. plalias.malformat=Malformed PL alias usage. plvar.undefined=Undefined PL variable "%{1}". var.infinite=Possible infinite variable regress involving '%{1}'. sysprop.empty=Empty System Property variable name. sysprop.unterminated=Unterminated System Property variable name. sysprop.undefined=Undefined System Property "%{1}". plvar.nameempty=Empty PL variable name. plvar.unterminated=Unterminated PL variable name. pl.malformat=Malformatted PL command. deprecated.noop=Deprecated command has no effect. Please remove: %{1}. end.noblock=Unmatched 'end' command. continue.syntax=PL 'continue' statement requires no argument or one of \ 'foreach', 'while'. break.syntax=PL 'break' statement requires no argument or one of \ 'foreach', 'if', 'while', 'file'. pl.list.parens=Listing all 'set' variables (any var not seen is unset and equal to null).\u000a\ The outermost parentheses are not part of the values. pl.list.lengths=Listing all 'set' variables (any var not seen is unset and equal to null).\u000a\ Showing variable names and length of values (use 'listvalues' to see values). dumpload.malformat=Malformatted PL 'dump' or 'load' command. plvar.nocolon=PL variable names may not contain ':'. plvar.tildedash.nomoreargs=PL ~/_ set commands take no other args ("%{1}"). dumpload.fail=Failed to dump/load variable '%{1}' to/from file '%{2}'. pl.malformat.specific=Malformatted PL '%{1}' command. pl.block.fail=Failed to execute instructions from PL block. ifwhile.malformat=Malformatted PL 'if'/'while' command. pl.unknown=Unknown PL command "%{1}". pl.block.unterminated=Unterminated PL '%{1}' block vendor.oracle.dS=*** WARNING:\u000a\ *** Listing tables in system-supplied schemas since\u000a\ *** Oracle (TM) doesn't return a JDBC system table list. vendor.derby.dr=Derby has not implemented SQL Roles. vendor.nosup.d=SqlFile does not yet support \\d%{1} for your database vendor. vendor.derby.du=It's impossible to get a reliable user list from Derby. special.d.unknown=Unknown describe option: '%{1}'. metadata.fetch.fail=Failed to get metadata from database. metadata.fetch.failfor=Failed to get metadata from database for '%{1}'. prepare.demandqm=Prepared statements must contain one '?'. binbuffer.empty=Binary SqlFile buffer is empty. vendor.nosup.sysschemas=*** WARNING:\u000a\ *** Omitting tables from system-supplied schemas\u000a\ *** (because DB vendor doesn't differentiate them to JDBC). noresult=No result. dsv.bincol=Table has a binary column. DSV files are text, not binary, files. binbuf.write=Read %{1} bytes from field '%{2}' (type %{3}) into binary buffer. rows.fetched=Fetched %{1} rows. rows.fetched.dsv=%{1} row(s) fetched from database. row.update.multiple=%{1} rows updated. row.update.singular=1 row updated. history.unavailable=Command history not available. history.none=No history yet. editbuffer.contents=Edit buffer contents:\u000a"%{1}" buffer.instructions=Copy a command to edit buffer like ":27" or ":-3". \ Re-execute buffer like ":;". history.number.req=You must specify a positive absolute command number, or \ a negative number\u000ameaning X commands "back". history.backto=History only goes back to #%{1}. history.upto=History only goes up to #%{1}. history.back=History only goes back %{1} command(s). describe.table.name=NAME describe.table.datatype=DATATYPE describe.table.width=WIDTH describe.table.nonulls=NO-NULLS describe.table.precision=PRECISION describe.table.scale=SCALE logical.unrecognized=Unrecognized logical operation. read.toobig=Resource is too big to read in one gulp.\u000a\ Please run the program with more RAM (try Java -Xm* switches). read.partial=Didn't read all bytes. Read in %{1} bytes out of %{2}. read.convertfail=Value too big to convert to String. \ Please run the program with more RAM (try Java -Xm* switches). dsv.coldelim.present=Table data contains our column delimiter '%{1}'. dsv.rowdelim.present=Table data contains our row delimiter '%{1}'. dsv.nullrep.present=Table data contains our null-representation token '%{1}'. dsv.constcols.nullcol=*DSV_CONST_COLS element has null column name. file.readfail=Can't read file '%{1}'. inputfile.closefail=Failed to close input file. dsv.header.none=No header record in input file. dsv.header.noswitchtarg=Headerswitch at DSV file line %{1}, but no target table specified yet. dsv.header.noswitchmatch=Reached close of headerswitch at DSV file line %{1} without matching a header. dsv.header.nonswitched=Header line inside switch without table matcher at DSV file line %{1}. dsv.nocolheader=No column header for column #%{1} at DSV file line %{2}. dsv.metadata.mismatch=Metadata mismatch for columns. query.metadatafail=Failed to get metadata for query by using:\u000a"%{1}" dsv.rejectfile.setupfail=Failed to set up reject file '%{1}'. dsv.rejectreport.setupfail=Failed to set up reject report file '%{1}'. none=None insertion.preparefail=Failed to prepare insertion setup string:\u000a"%{1}" dsv.header.matchernonhead=Non-Header line within table matcher block at DSV file line %{1}. dsv.colcount.mismatch=Header has %{1} columns, but input record has %{2} column values. dsv.insertcol.mismatch=Expected total of %{1} insert values, but gathered %{2}. dsv.nonskip.mismatch=Header has %{1} non-skip columns, but input record has %{2} insertion values. time.bad=Bad date/time value '%{1}'. boolean.bad=Bad boolean value '%{1}'. inputrec.modified=%{1} rows modified by this input record. dsv.recin.fail=Parse or insert of input line %{1} %{2:+, column '%2' }failed. dsv.import.summary=Import summary (%{1}skips / rejects / inserts): \ %{2} / %{3} / %{4}%{5:+ before aborting}. insertions.notcommitted=Insertions will be lost if you don't commit. autocommit.fetchfail=Failed to obtain connection autocommit value. dsv.rejectfile.purgefail=Failed to purge unnecessary reject file '%{1}'. dsv.rejectreport.purgefail=Failed to purge unnecessary reject report '%{1}'. edit.malformat=Edit/History command malformatted. input.malformat=Syntax error in input. append.empty=Use ':;' to repeat a command without appending transiso.report=Transaction Isolation Level is now %{1} %{2} exectime.reporting=Execution-time reporting is set to %{1} exectime.report=Took %{1} ms. regex.malformat=Malformed regex pattern: %{1} encode.fail=Unsupported encoding: %{1} macro.tip=Run /? for Macro help macrodef.malformat=Malformatted macro def. command macrodef.empty=No content specified for macro macrodef.semi=Macro values may not end with ';' macro.malformat=Malformatted macro command macro.undefined=No macro defined with name "%{1}". log.syntax=SYNTAX: \\l LEVEL Message\u000a\ Where LEVEL is one of: FINEST, FINER, INFO, WARNING, SEVERE log.syntax.error=Logging syntax error. Run '\\l?' for help reject.rpc=Clearing *DSV_RECORDS_PER_COMMIT, since non-integer specified: %{1} rpc.autocommit.failure=Failed to set up autocommit for *DSV_RECORDS_PER_COMMIT option rpc.commit.failure=Failed to finalize commit status for *DSV_RECORDS_PER_COMMIT option disconnect.success=Disconnected from JDBC Data Source disconnect.failure=Failed to disconnect from JDBC Data Source no.required.conn=We are not connected to a Data Source, but one is required for this action disconnected.msg= connected.fallbackmsg= no.vendor.schemaspt=Database does not support SQL-standard SCHEMA operations schemaname.retrieval.fail=Failed to retrieve current SCHEMA name from database remove.empty.vars.suggestset=Unsetting variable.\u000a\ You are advised to NOT set Java system property 'sqltool.REMOVE_EMPTY_VARS',\u000a\ and simply use the command '* - VARNAME' to explicitly unset/remove variables. auto.unset.warning=Unsetting variable '%{1}'. You should not have this set to an empty string. pl.unset.nomoreargs=PL ! unset command takes no arg other than the var name dsv.q.nodblquote=\\xq and \\xm prohibit delimiters containing '"' connect.failure=Failed to connect streamread.failure=Failed to read value using stream illegal.at=Leading @ in file paths has special meaning, and may only be used if input is a file. suggest.j=To connect to a data source, use '\\j urlid' or '\\j account password jdbc:url...' pipeclose.failure=Failed to close pipes: %{1} arrayimp.jvmreq=SqlTool requires >= Java 1.6 at run time in order to import Array values arrayval.malformat=Malformatted ARRAY value: (%{1}) sqlarray.badjvm=SqlTool binary is not Array-compatible with your runtime JRE. Array imports not possible. csv.coldelim.present=CSV-style quoting is only suitable for text files, but your file contains\u000a\ character '%{1}'. csv.quote.unterminated=Unterminated CSV-style "-quoted field at data file line #%{1} math.expr.fail=Math expression failure: %{1} varname.warning=Variables not beginning with a letter or containing a character other\u000a\ than letters, digits, and _, are deprecated.\u000a\ (Excepting reserved PL variables, which begin with *).:\u000a\ %{1} null.assignment=You may never assign a value to variable 'NULL' or '*NULL'.\u000a\ These variables always have the value of null, which is different from\u000a\ the empty string. bad.time.format=Malformatted date/time format string.\u000a\ %{2}: %{1}\u000a\ An useful example is: yyyy-MM-dd'T'HH:mm:ss.SSSZ\u000a\ Reference for formatting available at\u000a\ http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html no.timestamp.format=You can't expand *TIMESTAMP unless *TIMESTAMP_FORMAT has been set else.without.if='else' statement not at top level of an if block import.col.dup=Multiple input columns for single output database column: %{1} hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/SqlToolSprayer.java0000644000175000017500000001464412007547370024175 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.cmdline; import java.io.File; import java.util.ArrayList; import java.util.Date; /* $Id: SqlToolSprayer.java 4141 2011-03-14 01:35:49Z fredt $ */ /** * Sql Tool Sprayer. * Invokes SqlTool.objectMain() multiple times with the same SQL. * Invokes for multiple urlids and/or retries. * * See JavaDocs for the main method for syntax of how to run. * * System properties used if set: *
                *
              • sqltoolsprayer.period (in ms.)
              • *
              • sqltoolsprayer.maxtime (in ms.)
              • *
              • sqltoolsprayer.rcfile (filepath)
              • *
              * * @see #main(String[]) * @version $Revision: 4141 $, $Date: 2011-03-14 01:35:49 +0000 (Mon, 14 Mar 2011) $ * @author Blaine Simpson (blaine dot simpson at admc dot com) */ public class SqlToolSprayer { public static String LS = System.getProperty("line.separator"); private static String SYNTAX_MSG = "SYNTAX: java [-D...] SqlToolSprayer 'SQL;' [urlid1 urlid2...]\n" + "System properties you may use [default values]:\n" + " sqltoolsprayer.period (in ms.) [500]\n" + " sqltoolsprayer.maxtime (in ms.) [0]\n" + " sqltoolsprayer.monfile (filepath) [none]\n" + " sqltoolsprayer.rcfile (filepath) [none. SqlTool default used.]"; static { if (!LS.equals("\n")) { SYNTAX_MSG = SYNTAX_MSG.replaceAll("\n", LS); } } public static void main(String[] sa) { if (sa.length < 1) { System.err.println(SYNTAX_MSG); System.exit(4); } long period = ((System.getProperty("sqltoolsprayer.period") == null) ? 500 : Integer.parseInt( System.getProperty("sqltoolsprayer.period"))); long maxtime = ((System.getProperty("sqltoolsprayer.maxtime") == null) ? 0 : Integer.parseInt( System.getProperty("sqltoolsprayer.maxtime"))); String rcFile = System.getProperty("sqltoolsprayer.rcfile"); File monitorFile = (System.getProperty("sqltoolsprayer.monfile") == null) ? null : new File( System.getProperty( "sqltoolsprayer.monfile")); ArrayList urlids = new ArrayList(); for (int i = 1; i < sa.length; i++) { urlids.add(sa[i]); } if (urlids.size() < 1) { System.err.println("No urlids specified. Nothing to spray."); System.exit(5); } boolean[] status = new boolean[urlids.size()]; String[] withRcArgs = { "--sql=" + sa[0], "--rcfile=" + rcFile, null }; String[] withoutRcArgs = { "--sql=" + sa[0], null }; String[] sqlToolArgs = (rcFile == null) ? withoutRcArgs : withRcArgs; boolean onefailed = false; long startTime = (new Date()).getTime(); while (true) { if (monitorFile != null && !monitorFile.exists()) { System.err.println("Required file is gone: " + monitorFile); System.exit(2); } onefailed = false; for (int i = 0; i < status.length; i++) { if (status[i]) { continue; } sqlToolArgs[sqlToolArgs.length - 1] = urlids.get(i); // System.err.println("ARGS:" // + java.util.Arrays.asList(sqlToolArgs)); try { SqlTool.objectMain(sqlToolArgs); status[i] = true; System.err.println("Success for instance '" + urlids.get(i) + "'"); } catch (SqlTool.SqlToolException se) { onefailed = true; } } if (!onefailed) { break; } if (maxtime == 0 || (new Date()).getTime() > startTime + maxtime) { break; } try { Thread.sleep(period); } catch (InterruptedException ie) { // Purposefully doing nothing } } ArrayList failedUrlids = new ArrayList(); // If all statuses true, then System.exit(0); for (int i = 0; i < status.length; i++) { if (status[i] != true) { failedUrlids.add(urlids.get(i)); } } if (failedUrlids.size() > 0) { System.err.println("Failed instances: " + failedUrlids); System.exit(1); } System.exit(0); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/cmdline/SqlTool.java0000644000175000017500000007421412007547370022626 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.cmdline; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.PipedReader; import java.io.PipedWriter; import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import org.hsqldb.lib.FrameworkLogger; import org.hsqldb.lib.RCData; import org.hsqldb.cmdline.sqltool.Token; /* $Id: SqlTool.java 4720 2011-11-08 00:10:09Z unsaved $ */ /** * A command-line JDBC SQL tool supporting both interactive and * non-interactive usage. *

              * See JavaDocs for the main method for syntax of how to run from the * command-line. *

              * Programmatic users will usually want to use the objectMain(String[]) method * if they want arguments and behavior exactly like command-line SqlTool. * But in many cases, you will have better control and efficiency by using * the SqlFile class directly. The file * src/org/hsqldb/sample/SqlFileEmbedder.java * in the HSQLDB distribution provides an example for this latter strategy. *

              * * @see * The SqlTool chapter of the * HyperSQL Utilities Guide * @see #main(String[]) * @see #objectMain(String[]) * @see SqlFile * @see org.hsqldb.sample.SqlFileEmbedder * @version $Revision: 4720 $, $Date: 2011-11-08 00:10:09 +0000 (Tue, 08 Nov 2011) $ * @author Blaine Simpson (blaine dot simpson at admc dot com) */ public class SqlTool { private static FrameworkLogger logger = FrameworkLogger.getLog(SqlTool.class); public static final String DEFAULT_RCFILE = System.getProperty("user.home") + "/sqltool.rc"; // N.b. the following are static! private static final String revString = "$Revision: 4720 $"; private static final int revStringLength = revString.length(); private static final String revnum = (revStringLength - " $".length() > "$Revision: ".length()) ? revString.substring("$Revision: ".length(), revStringLength - " $".length()) : ""; public static final int SQLTOOLERR_EXITVAL = 1; public static final int SYNTAXERR_EXITVAL = 11; public static final int RCERR_EXITVAL = 2; public static final int SQLERR_EXITVAL = 3; public static final int IOERR_EXITVAL = 4; public static final int FILEERR_EXITVAL = 5; public static final int INPUTERR_EXITVAL = 6; public static final int CONNECTERR_EXITVAL = 7; /** * The configuration identifier to use when connection parameters are * specified on the command line */ private static String CMDLINE_ID = "cmdline"; /** Platform-specific line separator */ public static String LS = System.getProperty("line.separator"); /** Utility nested class for internal use. */ private static class BadCmdline extends Exception { static final long serialVersionUID = -2134764796788108325L; BadCmdline() { // Purposefully empty } } /** Utility object for internal use. */ private static BadCmdline bcl = new BadCmdline(); /** For trapping of exceptions inside this class. * These are always handled inside this class. */ private static class PrivateException extends Exception { static final long serialVersionUID = -7765061479594523462L; /* Unused at this time PrivateException() { super(); } */ PrivateException(String s) { super(s); } } public static class SqlToolException extends Exception { static final long serialVersionUID = 1424909871915188519L; int exitValue = 1; SqlToolException(String message, int exitValue) { super(message); this.exitValue = exitValue; } SqlToolException(int exitValue, String message) { this(message, exitValue); } SqlToolException(int exitValue) { super(); this.exitValue = exitValue; } } /** * Prompt the user for a password. * * @param username The user the password is for * @return The password the user entered */ private static String promptForPassword(String username) throws PrivateException { BufferedReader console; String password; password = null; try { console = new BufferedReader(new InputStreamReader(System.in)); // Prompt for password System.out.print(SqltoolRB.passwordFor_prompt.getString( RCData.expandSysPropVars(username))); // Read the password from the command line password = console.readLine(); if (password == null) { password = ""; } else { password = password.trim(); } } catch (IOException e) { throw new PrivateException(e.getMessage()); } finally { console = null; // Encourage GC of buffers } return password; } /** * Parses a comma delimited string of name value pairs into a * Map object. * * @param varString The string to parse * @param varMap The map to save the paired values into * @param lowerCaseKeys Set to true if the map keys should be * converted to lower case */ private static void varParser(String inVarString, Map varMap, boolean lowerCaseKeys) throws PrivateException { int equals; String var; String val; if (varMap == null) { throw new IllegalArgumentException( "varMap is null in SqlTool.varParser call"); } if (inVarString == null) { throw new IllegalArgumentException( "inVarString is null in SqlTool.varParser call"); } boolean escapesPresent = inVarString.indexOf("\\,") > -1; String varString = escapesPresent ? inVarString.replace("\\,", "\u0002") : inVarString; for (String token : varString.split("\\s*,\\s*")) { equals = token.indexOf('='); if (equals < 1) { throw new PrivateException( SqltoolRB.SqlTool_varset_badformat.getString()); } var = token.substring(0, equals).trim(); val = token.substring(equals + 1).trim(); if (escapesPresent) { val = val.replace("\u0002", ","); } if (var.length() < 1) { throw new PrivateException( SqltoolRB.SqlTool_varset_badformat.getString()); } if (lowerCaseKeys) { var = var.toLowerCase(); } varMap.put(var, val); } } /** * A static wrapper for objectMain, so that that method may be executed * as a Java "program". *

              * Throws only RuntimeExceptions or Errors, because this method is intended * to System.exit() for all but disastrous system problems, for which * the inconvenience of a stack trace would be the least of your worries. *

              * If you don't want SqlTool to System.exit(), then use the method * objectMain() instead of this method. *

              * * @see #objectMain(String[]) */ public static void main(String[] args) { try { SqlTool.objectMain(args); } catch (SqlToolException fr) { System.err.println( (fr.getMessage() == null) ? fr : fr.getMessage()); System.exit(fr.exitValue); } System.exit(0); } /** * Connect to a JDBC Database and execute the commands given on * stdin or in SQL file(s). *

              * This method is changed for HSQLDB 1.8.0.8 and later to never * System.exit(). * Developers may catch Throwables to handle all fatal situations. *

              * * @param arg Run "java... org.hsqldb.cmdline.SqlTool --help" for syntax. * @throws SqlToolException Upon any fatal error, with useful * reason as the exception's message. */ public static void objectMain(String[] arg) throws SqlToolException { logger.finer("Invoking SqlTool"); /* * The big picture is, we parse input args; load a RCData; * get a JDBC Connection with the RCData; instantiate and * execute as many SqlFiles as we need to. */ String rcFile = null; PipedReader tmpReader = null; String sqlText = null; String driver = null; String targetDb = null; boolean debug = false; File[] scriptFiles = null; int i = -1; boolean listMode = false; boolean interactive = false; boolean noinput = false; boolean noautoFile = false; boolean autoCommit = false; Boolean coeOverride = null; Boolean stdinputOverride = null; String rcParams = null; String rcUrl = null; String rcUsername = null; String rcPassword = null; String rcCharset = null; String rcTruststore = null; String rcTransIso = null; Map rcFields = null; String parameter; SqlFile[] sqlFiles = null; Connection conn = null; Map userVars = new HashMap(); try { // Try block to GC tmpReader try { // Try block for BadCmdline while ((i + 1 < arg.length)) if (arg[i + 1].startsWith("--")) { i++; if (arg[i].length() == 2) { break; // "--" } parameter = arg[i].substring(2).toLowerCase(); if (parameter.equals("help")) { System.out.println(SqltoolRB.SqlTool_syntax.getString( revnum, RCData.DEFAULT_JDBC_DRIVER)); return; } if (parameter.equals("abortonerr")) { if (coeOverride != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_abort_continue_mutuallyexclusive.getString()); } coeOverride = Boolean.FALSE; } else if (parameter.equals("continueonerr")) { if (coeOverride != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_abort_continue_mutuallyexclusive.getString()); } coeOverride = Boolean.TRUE; } else if (parameter.startsWith("continueonerr=")) { if (coeOverride != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_abort_continue_mutuallyexclusive.getString()); } coeOverride = Boolean.valueOf( arg[i].substring("--continueonerr=".length())); } else if (parameter.equals("list")) { if (listMode) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } listMode = true; } else if (parameter.equals("rcfile")) { if (++i == arg.length) { throw bcl; } if (rcFile != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } rcFile = arg[i]; } else if (parameter.startsWith("rcfile=")) { if (rcFile != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } rcFile = arg[i].substring("--rcfile=".length()); } else if (parameter.equals("setvar")) { if (++i == arg.length) { throw bcl; } try { varParser(arg[i], userVars, false); } catch (PrivateException pe) { throw new SqlToolException( RCERR_EXITVAL, pe.getMessage()); } } else if (parameter.startsWith("setvar=")) { try { varParser(arg[i].substring("--setvar=".length()), userVars, false); } catch (PrivateException pe) { throw new SqlToolException( RCERR_EXITVAL, pe.getMessage()); } } else if (parameter.equals("sql")) { noinput = true; // but turn back on if file "-" specd. if (++i == arg.length) { throw bcl; } if (sqlText != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } sqlText = arg[i]; } else if (parameter.startsWith("sql=")) { noinput = true; // but turn back on if file "-" specd. if (sqlText != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } sqlText = arg[i].substring("--sql=".length()); } else if (parameter.equals("debug")) { if (debug) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } debug = true; } else if (parameter.equals("noautofile")) { if (noautoFile) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } noautoFile = true; } else if (parameter.equals("autocommit")) { if (autoCommit) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } autoCommit = true; } else if (parameter.equals("stdinput")) { noinput = false; if (stdinputOverride != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } stdinputOverride = Boolean.TRUE; } else if (parameter.equals("noinput")) { noinput = true; if (stdinputOverride != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } stdinputOverride = Boolean.FALSE; } else if (parameter.equals("driver")) { if (++i == arg.length) { throw bcl; } if (driver != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } driver = arg[i]; } else if (parameter.startsWith("driver=")) { if (driver != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } driver = arg[i].substring("--driver=".length()); } else if (parameter.equals("inlinerc")) { if (++i == arg.length) { throw bcl; } if (rcParams != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } rcParams = arg[i]; } else if (parameter.startsWith("inlinerc=")) { if (rcParams != null) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_params_redundant.getString()); } rcParams = arg[i].substring("--inlinerc=".length()); } else { throw bcl; } } else if (arg[i + 1].startsWith("-P") || arg[i + 1].startsWith("-p")) { i++; boolean sepSwitch = arg[i].length() < 3; if (sepSwitch) { if (++i == arg.length) { throw bcl; } } int equalAt = arg[i].indexOf('='); if (equalAt < (sepSwitch ? 1 : 3)) { throw new SqlToolException(RCERR_EXITVAL, "Specified var assignment contains no '='"); } userVars.put(arg[i].substring(sepSwitch ? 0 : 2, equalAt), arg[i].substring(equalAt + 1)); } else { break; } if (!listMode && rcParams == null && ++i != arg.length) { // If an inline RC file was specified, don't look for targetDb targetDb = arg[i]; if (targetDb.equals("-")) targetDb = null; } int scriptIndex = 0; if (sqlText != null) { try { tmpReader = new PipedReader(); PipedWriter tmpWriter = new PipedWriter(tmpReader); // My best guess is that the encoding here will be however // we read the SQL text from the command-line, which will // be the platform default encoding. Therefore, don't // specify an encoding for this pipe. try { tmpWriter.write(sqlText + LS); tmpWriter.flush(); } finally { try { tmpWriter.close(); } finally { tmpWriter = null; // Encourage GC of buffers } } } catch (IOException ioe) { throw new SqlToolException(IOERR_EXITVAL, SqltoolRB.sqltempfile_fail.getString( ioe.toString())); } } if (stdinputOverride != null) { noinput = !stdinputOverride.booleanValue(); } interactive = (!noinput) && (arg.length <= i + 1); if (arg.length == i + 2 && arg[i + 1].equals("-")) { if (stdinputOverride == null) { noinput = false; } } else if (arg.length > i + 1) { // I.e., if there are any SQL files specified. scriptFiles = new File[arg.length - i - 1 + ((stdinputOverride == null || !stdinputOverride.booleanValue()) ? 0 : 1)]; if (debug) { System.err.println("scriptFiles has " + scriptFiles.length + " elements"); } while (i + 1 < arg.length) { scriptFiles[scriptIndex++] = new File(arg[++i]); } if (stdinputOverride != null && stdinputOverride.booleanValue()) { scriptFiles[scriptIndex++] = null; noinput = true; } } } catch (BadCmdline bcle) { throw new SqlToolException(SYNTAXERR_EXITVAL, SqltoolRB.SqlTool_syntax.getString( revnum, RCData.DEFAULT_JDBC_DRIVER)); } RCData conData = null; // Use the inline RC file if it was specified if (rcParams != null) { rcFields = new HashMap(); try { varParser(rcParams, rcFields, true); } catch (PrivateException e) { throw new SqlToolException(SYNTAXERR_EXITVAL, e.getMessage()); } rcUrl = rcFields.remove("url"); rcUsername = rcFields.remove("user"); rcCharset = rcFields.remove("charset"); rcTruststore = rcFields.remove("truststore"); rcPassword = rcFields.remove("password"); rcTransIso = rcFields.remove("transiso"); // Don't ask for password if what we have already is invalid! if (rcUrl == null || rcUrl.length() < 1) throw new SqlToolException(RCERR_EXITVAL, SqltoolRB.rcdata_inlineurl_missing.getString()); // We now allow both null and "" user name, but we require password // if the user name != null. if (rcPassword != null && rcPassword.length() > 0) throw new SqlToolException(RCERR_EXITVAL, SqltoolRB.rcdata_password_visible.getString()); if (rcFields.size() > 0) { throw new SqlToolException(INPUTERR_EXITVAL, SqltoolRB.rcdata_inline_extravars.getString( rcFields.keySet().toString())); } if (rcUsername != null && rcPassword == null) try { rcPassword = promptForPassword(rcUsername); } catch (PrivateException e) { throw new SqlToolException(INPUTERR_EXITVAL, SqltoolRB.password_readfail.getString(e.getMessage())); } try { conData = new RCData(CMDLINE_ID, rcUrl, rcUsername, rcPassword, driver, rcCharset, rcTruststore, null, rcTransIso); } catch (RuntimeException re) { throw re; // Unrecoverable } catch (Exception e) { throw new SqlToolException(RCERR_EXITVAL, SqltoolRB.rcdata_genfromvalues_fail.getString()); } } else if (listMode || targetDb != null) { try { conData = new RCData(new File((rcFile == null) ? DEFAULT_RCFILE : rcFile), targetDb); } catch (RuntimeException re) { throw re; // Unrecoverable } catch (Exception e) { throw new SqlToolException(RCERR_EXITVAL, SqltoolRB.conndata_retrieval_fail.getString( targetDb, e.getMessage())); } } //if (debug) { //conData.report(); //} if (listMode) { // listMode has been handled above. // Just returning here to prevent unexpected consequences if the // user specifies both an inline RC (will will be ignored) and // --list. return; } if (interactive) System.out.print("SqlTool v. " + revnum + '.' + LS); if (conData != null) try { conn = conData.getConnection( driver, System.getProperty("javax.net.ssl.trustStore")); conn.setAutoCommit(autoCommit); String conBanner; if (interactive && (conBanner = SqlFile.getBanner(conn)) != null) { System.out.println(conBanner); } } catch (RuntimeException re) { throw re; // Unrecoverable } catch (Exception e) { if (debug) logger.error(e.getClass().getName(), e); // Let's not continue as if nothing is wrong. String reportUser = (conData.username == null) ? "" : conData.username; throw new SqlToolException(CONNECTERR_EXITVAL, SqltoolRB.connection_fail.getString(conData.url, reportUser, e.getMessage())); } File[] emptyFileArray = {}; File[] singleNullFileArray = { null }; File autoFile = null; if (interactive && !noautoFile) { autoFile = new File(System.getProperty("user.home") + "/auto.sql"); if ((!autoFile.isFile()) || !autoFile.canRead()) { autoFile = null; } } if (scriptFiles == null) { // I.e., if no SQL files given on command-line. // Input file list is either nothing or {null} to read stdin. scriptFiles = (noinput ? emptyFileArray : singleNullFileArray); } int numFiles = scriptFiles.length; if (tmpReader != null) { numFiles += 1; } if (autoFile != null) { numFiles += 1; } sqlFiles = new SqlFile[numFiles]; // We print version before execing this one. int interactiveFileIndex = -1; String encoding = (conData == null) ? null : conData.charset; try { int fileIndex = 0; if (autoFile != null) { sqlFiles[fileIndex++] = new SqlFile(autoFile, encoding); } if (tmpReader != null) { sqlFiles[fileIndex++] = new SqlFile( tmpReader, "--sql", System.out, null, false, null); } for (File scriptFile : scriptFiles) { if (interactiveFileIndex < 0 && interactive) { interactiveFileIndex = fileIndex; } sqlFiles[fileIndex++] = (scriptFile == null) ? (new SqlFile(encoding, interactive)) : (new SqlFile(scriptFile,encoding, interactive)); } } catch (IOException ioe) { try { if (conn != null) conn.close(); } catch (Exception e) { // Can only report on so many errors at one time } throw new SqlToolException(FILEERR_EXITVAL, ioe.getMessage()); } } finally { // DO NOT close tmpReader, since SqlFile needs to read from it // (and will auto-close it). tmpReader = null; // Encourage GC of buffers } Map macros = null; try { for (SqlFile sqlFile : sqlFiles) { if (conn != null) sqlFile.setConnection(conn); if (userVars.size() > 0) sqlFile.addUserVars(userVars); if (macros != null) sqlFile.addMacros(macros); if (coeOverride != null) sqlFile.setContinueOnError(coeOverride.booleanValue()); sqlFile.execute(); userVars = sqlFile.getUserVars(); macros = sqlFile.getMacros(); conn = sqlFile.getConnection(); } // Following two Exception types are handled properly inside of // SqlFile. We just need to return an appropriate error status. } catch (SqlToolError ste) { throw new SqlToolException(SQLTOOLERR_EXITVAL); } catch (SQLException se) { // SqlTool will only throw an SQLException if it is in // "\c false" mode. throw new SqlToolException(SQLERR_EXITVAL); } finally { try { if (conn != null) conn.close(); } catch (Exception e) { // Purposefully doing nothing } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TransactionManagerCommon.java0000644000175000017500000005717312007547416024555 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HashMap; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.LongDeque; import org.hsqldb.lib.LongKeyHashMap; import org.hsqldb.lib.MultiValueHashMap; import org.hsqldb.lib.OrderedHashSet; /** * Shared code for TransactionManager classes * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 2.0.0 */ class TransactionManagerCommon { Database database; Session lobSession; int txModel; HsqlName[] catalogNameList; // ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock(); // functional unit - sessions involved in live transactions /** live transactions keeping committed transactions from being merged */ LongDeque liveTransactionTimestamps = new LongDeque(); /** global timestamp for database */ AtomicLong globalChangeTimestamp = new AtomicLong(1); long globalDataChangeTimestamp; // int transactionCount = 0; // HashMap tableWriteLocks = new HashMap(); MultiValueHashMap tableReadLocks = new MultiValueHashMap(); // functional unit - cached table transactions /** Map : rowID -> RowAction */ public LongKeyHashMap rowActionMap; void setTransactionControl(Session session, int mode) { TransactionManagerCommon manager = null; if (mode == txModel) { return; } // statement runs as transaction writeLock.lock(); switch (txModel) { case TransactionManager.MVCC : case TransactionManager.MVLOCKS : if (liveTransactionTimestamps.size() != 1) { throw Error.error(ErrorCode.X_25001); } } try { switch (mode) { case TransactionManager.MVCC : { manager = new TransactionManagerMVCC(database); manager.liveTransactionTimestamps.addLast( session.transactionTimestamp); break; } case TransactionManager.MVLOCKS : { manager = new TransactionManagerMV2PL(database); manager.liveTransactionTimestamps.addLast( session.transactionTimestamp); break; } case TransactionManager.LOCKS : { manager = new TransactionManager2PL(database); break; } } manager.globalChangeTimestamp.set(globalChangeTimestamp.get()); manager.transactionCount = transactionCount; database.txManager = (TransactionManager) manager; return; } finally { writeLock.unlock(); } } void persistCommit(Session session, Object[] list, int limit) { for (int i = 0; i < limit; i++) { RowAction action = (RowAction) list[i]; if (action.type == RowActionBase.ACTION_NONE) { continue; } int type = action.getCommitTypeOn(session.actionTimestamp); Row row = action.memoryRow; if (row == null) { row = (Row) action.store.get(action.getPos(), false); } if (action.table.hasLobColumn) { switch (type) { case RowActionBase.ACTION_INSERT : session.sessionData.adjustLobUsageCount(action.table, row.getData(), 1); break; case RowActionBase.ACTION_DELETE : session.sessionData.adjustLobUsageCount(action.table, row.getData(), -1); break; case RowActionBase.ACTION_INSERT_DELETE : default : } int newLimit = session.rowActionList.size(); if (newLimit > limit) { list = session.rowActionList.getArray(); for (int j = limit; j < newLimit; j++) { RowAction lobAction = (RowAction) list[j]; lobAction.commit(session); } limit = newLimit; } } try { action.store.commitRow(session, row, type, txModel); if (txModel == TransactionManager.LOCKS) { action.setAsNoOp(); row.rowAction = null; } } catch (HsqlException e) { database.logger.logWarningEvent("data commit failed", e); } } try { if (limit > 0) { database.logger.writeCommitStatement(session); } } catch (HsqlException e) { database.logger.logWarningEvent("data commit failed", e); } } void finaliseRows(Session session, Object[] list, int start, int limit, boolean commit) { for (int i = start; i < limit; i++) { RowAction action = (RowAction) list[i]; if (action.table.tableType == TableBase.CACHED_TABLE) { if (action.type == RowActionBase.ACTION_NONE) { Lock mapLock = rowActionMap.getWriteLock(); mapLock.lock(); try { synchronized (action) { // remove only if not changed if (action.type == RowActionBase.ACTION_NONE) { rowActionMap.remove(action.getPos()); } } } finally { mapLock.unlock(); } } } if (action.type == RowActionBase.ACTION_DELETE_FINAL && !action.deleteComplete) { try { action.deleteComplete = true; if (action.table.getTableType() == TableBase.TEMP_TABLE) { continue; } Row row = action.memoryRow; if (row == null) { row = (Row) action.store.get(action.getPos(), false); } action.store.commitRow(session, row, action.type, txModel); } catch (Exception e) { // throw unexpectedException(e.getMessage()); } } } } /** * merge a given list of transaction rollback action with given timestamp */ void mergeRolledBackTransaction(Session session, long timestamp, Object[] list, int start, int limit) { for (int i = start; i < limit; i++) { RowAction action = (RowAction) list[i]; Row row = action.memoryRow; if (row == null) { if (action.type == RowAction.ACTION_NONE) { continue; } row = (Row) action.store.get(action.getPos(), false); } if (row == null) { // only if transaction has been merged // shouldn't normally happen continue; } synchronized (row) { action.mergeRollback(session, timestamp, row); } } } /** * merge a transaction committed at a given timestamp. */ void mergeTransaction(Session session, Object[] list, int start, int limit, long timestamp) { for (int i = start; i < limit; i++) { RowAction rowact = (RowAction) list[i]; rowact.mergeToTimestamp(timestamp); } } /** * gets the next timestamp for an action */ long nextChangeTimestamp() { return globalChangeTimestamp.incrementAndGet(); } boolean checkDeadlock(Session session, OrderedHashSet newWaits) { int size = session.waitingSessions.size(); for (int i = 0; i < size; i++) { Session current = (Session) session.waitingSessions.get(i); if (newWaits.contains(current)) { return false; } if (!checkDeadlock(current, newWaits)) { return false; } } return true; } boolean checkDeadlock(Session session, Session other) { int size = session.waitingSessions.size(); for (int i = 0; i < size; i++) { Session current = (Session) session.waitingSessions.get(i); if (current == other) { return false; } if (!checkDeadlock(current, other)) { return false; } } return true; } void endActionTPL(Session session) { if (session.isolationLevel == SessionInterface.TX_REPEATABLE_READ || session.isolationLevel == SessionInterface.TX_SERIALIZABLE) { return; } if (session.sessionContext.currentStatement == null) { // after java function / proc with db access return; } if (session.sessionContext.depth > 0) { // routine or trigger return; } HsqlName[] readLocks = session.sessionContext.currentStatement.getTableNamesForRead(); if (readLocks.length == 0) { return; } writeLock.lock(); try { unlockReadTablesTPL(session, readLocks); final int waitingCount = session.waitingSessions.size(); if (waitingCount == 0) { return; } boolean canUnlock = false; // if write lock was used for read lock for (int i = 0; i < readLocks.length; i++) { if (tableWriteLocks.get(readLocks[i]) != session) { canUnlock = true; break; } } if (!canUnlock) { return; } canUnlock = false; for (int i = 0; i < waitingCount; i++) { Session current = (Session) session.waitingSessions.get(i); if (current.abortTransaction) { canUnlock = true; break; } Statement currentStatement = current.sessionContext.currentStatement; if (currentStatement == null) { canUnlock = true; break; } if (ArrayUtil.containsAny( readLocks, currentStatement.getTableNamesForWrite())) { canUnlock = true; break; } } if (!canUnlock) { return; } resetLocks(session); resetLatchesMidTransaction(session); } finally { writeLock.unlock(); } } void endTransactionTPL(Session session) { unlockTablesTPL(session); final int waitingCount = session.waitingSessions.size(); if (waitingCount == 0) { return; } resetLocks(session); resetLatches(session); } void resetLocks(Session session) { final int waitingCount = session.waitingSessions.size(); for (int i = 0; i < waitingCount; i++) { Session current = (Session) session.waitingSessions.get(i); current.tempUnlocked = false; long count = current.latch.getCount(); if (count == 1) { boolean canProceed = setWaitedSessionsTPL(current, current.sessionContext.currentStatement); if (canProceed) { if (current.tempSet.isEmpty()) { lockTablesTPL(current, current.sessionContext.currentStatement); current.tempUnlocked = true; } } } } for (int i = 0; i < waitingCount; i++) { Session current = (Session) session.waitingSessions.get(i); if (current.tempUnlocked) { // } else if (current.abortTransaction) { // } else { // this can introduce additional waits for the sessions setWaitedSessionsTPL(current, current.sessionContext.currentStatement); } } } void resetLatches(Session session) { final int waitingCount = session.waitingSessions.size(); for (int i = 0; i < waitingCount; i++) { Session current = (Session) session.waitingSessions.get(i); if (!current.abortTransaction && current.tempSet.isEmpty()) { // valid for top level statements // boolean hasLocks = hasLocks(current, current.sessionContext.currentStatement); // if (!hasLocks) { // System.out.println("trouble"); // hasLocks(current, current.sessionContext.currentStatement); // } } setWaitingSessionTPL(current); } session.waitingSessions.clear(); session.latch.setCount(0); } void resetLatchesMidTransaction(Session session) { session.tempSet.clear(); session.tempSet.addAll(session.waitingSessions); session.waitingSessions.clear(); final int waitingCount = session.tempSet.size(); for (int i = 0; i < waitingCount; i++) { Session current = (Session) session.tempSet.get(i); if (!current.abortTransaction && current.tempSet.isEmpty()) { // valid for top level statements // boolean hasLocks = hasLocks(current, current.sessionContext.currentStatement); // if (!hasLocks) { // System.out.println("trouble"); // hasLocks(current, current.sessionContext.currentStatement); // } } setWaitingSessionTPL(current); } session.tempSet.clear(); } boolean setWaitedSessionsTPL(Session session, Statement cs) { session.tempSet.clear(); if (cs == null) { return true; } if (session.abortTransaction) { return false; } HsqlName[] nameList = cs.getTableNamesForWrite(); for (int i = 0; i < nameList.length; i++) { HsqlName name = nameList[i]; if (name.schema == SqlInvariants.SYSTEM_SCHEMA_HSQLNAME) { continue; } Session holder = (Session) tableWriteLocks.get(name); if (holder != null && holder != session) { session.tempSet.add(holder); } Iterator it = tableReadLocks.get(name); while (it.hasNext()) { holder = (Session) it.next(); if (holder != session) { session.tempSet.add(holder); } } } nameList = cs.getTableNamesForRead(); if (txModel == TransactionManager.MVLOCKS && session.isReadOnly()) { nameList = catalogNameList; } for (int i = 0; i < nameList.length; i++) { HsqlName name = nameList[i]; if (name.schema == SqlInvariants.SYSTEM_SCHEMA_HSQLNAME) { continue; } Session holder = (Session) tableWriteLocks.get(name); if (holder != null && holder != session) { session.tempSet.add(holder); } } if (session.tempSet.isEmpty()) { return true; } if (checkDeadlock(session, session.tempSet)) { return true; } session.tempSet.clear(); session.abortTransaction = true; return false; } void setWaitingSessionTPL(Session session) { int count = session.tempSet.size(); assert session.latch.getCount() <= count + 1; for (int i = 0; i < count; i++) { Session current = (Session) session.tempSet.get(i); current.waitingSessions.add(session); } session.tempSet.clear(); session.latch.setCount(count); } void lockTablesTPL(Session session, Statement cs) { if (cs == null || session.abortTransaction) { return; } HsqlName[] nameList = cs.getTableNamesForWrite(); for (int i = 0; i < nameList.length; i++) { HsqlName name = nameList[i]; if (name.schema == SqlInvariants.SYSTEM_SCHEMA_HSQLNAME) { continue; } tableWriteLocks.put(name, session); } nameList = cs.getTableNamesForRead(); for (int i = 0; i < nameList.length; i++) { HsqlName name = nameList[i]; if (name.schema == SqlInvariants.SYSTEM_SCHEMA_HSQLNAME) { continue; } tableReadLocks.put(name, session); } } void unlockTablesTPL(Session session) { Iterator it = tableWriteLocks.values().iterator(); while (it.hasNext()) { Session s = (Session) it.next(); if (s == session) { it.remove(); } } it = tableReadLocks.values().iterator(); while (it.hasNext()) { Session s = (Session) it.next(); if (s == session) { it.remove(); } } } void unlockReadTablesTPL(Session session, HsqlName[] locks) { for (int i = 0; i < locks.length; i++) { tableReadLocks.remove(locks[i], session); } } boolean hasLocks(Session session, Statement cs) { if (cs == null) { return true; } HsqlName[] nameList = cs.getTableNamesForWrite(); for (int i = 0; i < nameList.length; i++) { HsqlName name = nameList[i]; if (name.schema == SqlInvariants.SYSTEM_SCHEMA_HSQLNAME) { continue; } Session holder = (Session) tableWriteLocks.get(name); if (holder != null && holder != session) { return false; } Iterator it = tableReadLocks.get(name); while (it.hasNext()) { holder = (Session) it.next(); if (holder != session) { return false; } } } nameList = cs.getTableNamesForRead(); for (int i = 0; i < nameList.length; i++) { HsqlName name = nameList[i]; if (name.schema == SqlInvariants.SYSTEM_SCHEMA_HSQLNAME) { continue; } Session holder = (Session) tableWriteLocks.get(name); if (holder != null && holder != session) { return false; } } return true; } long getFirstLiveTransactionTimestamp() { if (liveTransactionTimestamps.isEmpty()) { return Long.MAX_VALUE; } return liveTransactionTimestamps.get(0); } /** * Return an array of all row actions sorted by System Change No. */ RowAction[] getRowActionList() { writeLock.lock(); try { Session[] sessions = database.sessionManager.getAllSessions(); int[] tIndex = new int[sessions.length]; RowAction[] rowActions; int rowActionCount = 0; { int actioncount = 0; for (int i = 0; i < sessions.length; i++) { actioncount += sessions[i].getTransactionSize(); } rowActions = new RowAction[actioncount]; } while (true) { boolean found = false; long minChangeNo = Long.MAX_VALUE; int sessionIndex = 0; // find the lowest available SCN across all sessions for (int i = 0; i < sessions.length; i++) { int tSize = sessions[i].getTransactionSize(); if (tIndex[i] < tSize) { RowAction current = (RowAction) sessions[i].rowActionList.get( tIndex[i]); if (current.actionTimestamp < minChangeNo) { minChangeNo = current.actionTimestamp; sessionIndex = i; } found = true; } } if (!found) { break; } HsqlArrayList currentList = sessions[sessionIndex].rowActionList; for (; tIndex[sessionIndex] < currentList.size(); ) { RowAction current = (RowAction) currentList.get(tIndex[sessionIndex]); // if the next change no is in this session, continue adding if (current.actionTimestamp == minChangeNo + 1) { minChangeNo++; } if (current.actionTimestamp == minChangeNo) { rowActions[rowActionCount++] = current; tIndex[sessionIndex]++; } else { break; } } } return rowActions; } finally { writeLock.unlock(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/QueryExpression.java0000644000175000017500000010153412007547416023000 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.ParserDQL.CompileContext; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.ArrayListIdentity; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HsqlList; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.OrderedIntHashSet; import org.hsqldb.lib.Set; import org.hsqldb.navigator.RowIterator; import org.hsqldb.navigator.RowSetNavigatorData; import org.hsqldb.navigator.RowSetNavigatorDataTable; import org.hsqldb.result.Result; import org.hsqldb.result.ResultMetaData; import org.hsqldb.store.ValuePool; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Implementation of an SQL query expression * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ /** * @todo 1.9.0 - review these * - work out usage of getMainSelect etc and add relevant methods * - Result metadata for the final result of QueryExpression * */ public class QueryExpression implements RangeGroup { public static final int NOUNION = 0, UNION = 1, UNION_ALL = 2, INTERSECT = 3, INTERSECT_ALL = 4, EXCEPT_ALL = 5, EXCEPT = 6, UNION_TERM = 7; // int columnCount; private QueryExpression leftQueryExpression; private QueryExpression rightQueryExpression; SortAndSlice sortAndSlice; private int unionType; private boolean unionCorresponding; private OrderedHashSet unionCorrespondingColumns; int[] unionColumnMap; Type[] unionColumnTypes; boolean isFullOrder; // HsqlList unresolvedExpressions; // boolean isReferencesResolved; boolean isPartOneResolved; boolean isPartTwoResolved; boolean isResolved; // int persistenceScope = TableBase.SCOPE_STATEMENT; // ResultMetaData resultMetaData; boolean[] accessibleColumns; // View view; boolean isBaseMergeable; boolean isMergeable; boolean isUpdatable; boolean isInsertable; boolean isCheckable; boolean isTopLevel; boolean isRecursive; boolean isSingleRow; boolean acceptsSequences; boolean isCorrelated; boolean isTable; boolean isValueList; // TableDerived recursiveTable; // public TableBase resultTable; public Index mainIndex; public Index fullIndex; public Index orderIndex; public Index idIndex; // CompileContext compileContext; // QueryExpression(CompileContext compileContext) { this.compileContext = compileContext; sortAndSlice = SortAndSlice.noSort; } public QueryExpression(CompileContext compileContext, QueryExpression leftQueryExpression) { this(compileContext); sortAndSlice = SortAndSlice.noSort; this.leftQueryExpression = leftQueryExpression; } public RangeVariable[] getRangeVariables() { return RangeVariable.emptyArray; } public void setCorrelated() { isCorrelated = true; } public void setSingleRow() { isSingleRow = true; } public boolean isRecursive() { return isRecursive; } void addUnion(QueryExpression queryExpression, int unionType) { sortAndSlice = SortAndSlice.noSort; this.rightQueryExpression = queryExpression; this.unionType = unionType; setFullOrder(); } void addSortAndSlice(SortAndSlice sortAndSlice) { this.sortAndSlice = sortAndSlice; sortAndSlice.sortUnion = true; } public void setUnionCorresoponding() { unionCorresponding = true; } public void setUnionCorrespondingColumns(OrderedHashSet names) { unionCorrespondingColumns = names; } public void setFullOrder() { isFullOrder = true; if (leftQueryExpression != null) { leftQueryExpression.setFullOrder(); } if (rightQueryExpression != null) { rightQueryExpression.setFullOrder(); } } public void resolve(Session session) { resolveReferences(session, RangeGroup.emptyArray); ExpressionColumn.checkColumnsResolved(unresolvedExpressions); resolveTypes(session); } public void resolve(Session session, RangeGroup[] rangeGroups, Type[] targetTypes) { resolveReferences(session, rangeGroups); if (unresolvedExpressions != null) { for (int i = 0; i < unresolvedExpressions.size(); i++) { Expression e = (Expression) unresolvedExpressions.get(i); HsqlList list = e.resolveColumnReferences(session, RangeGroup.emptyGroup, rangeGroups, null); ExpressionColumn.checkColumnsResolved(list); } } resolveTypesPartOne(session); if (targetTypes != null) { for (int i = 0; i < unionColumnTypes.length && i < targetTypes.length; i++) { if (unionColumnTypes[i] == null) { unionColumnTypes[i] = targetTypes[i]; } } } resolveTypesPartTwo(session); resolveTypesPartThree(session); } public void resolveReferences(Session session, RangeGroup[] rangeGroups) { if (isReferencesResolved) { return; } leftQueryExpression.resolveReferences(session, rangeGroups); rightQueryExpression.resolveReferences(session, rangeGroups); addUnresolvedExpressions(leftQueryExpression.unresolvedExpressions); addUnresolvedExpressions(rightQueryExpression.unresolvedExpressions); if (leftQueryExpression.isCorrelated || rightQueryExpression.isCorrelated) { setCorrelated(); } if (!unionCorresponding) { columnCount = leftQueryExpression.getColumnCount(); int rightCount = rightQueryExpression.getColumnCount(); if (columnCount != rightCount) { throw Error.error(ErrorCode.X_42594); } unionColumnTypes = new Type[columnCount]; leftQueryExpression.unionColumnMap = rightQueryExpression.unionColumnMap = new int[columnCount]; ArrayUtil.fillSequence(leftQueryExpression.unionColumnMap); resolveColumnRefernecesInUnionOrderBy(); accessibleColumns = leftQueryExpression.accessibleColumns; isReferencesResolved = true; return; } String[] leftNames = leftQueryExpression.getColumnNames(); String[] rightNames = rightQueryExpression.getColumnNames(); if (unionCorrespondingColumns == null) { unionCorrespondingColumns = new OrderedHashSet(); OrderedIntHashSet leftColumns = new OrderedIntHashSet(); OrderedIntHashSet rightColumns = new OrderedIntHashSet(); for (int i = 0; i < leftNames.length; i++) { String name = leftNames[i]; int index = ArrayUtil.find(rightNames, name); if (name.length() > 0 && index != -1) { if (!leftQueryExpression.accessibleColumns[i]) { throw Error.error(ErrorCode.X_42578); } if (!rightQueryExpression.accessibleColumns[index]) { throw Error.error(ErrorCode.X_42578); } leftColumns.add(i); rightColumns.add(index); unionCorrespondingColumns.add(name); } } if (unionCorrespondingColumns.isEmpty()) { throw Error.error(ErrorCode.X_42578); } leftQueryExpression.unionColumnMap = leftColumns.toArray(); rightQueryExpression.unionColumnMap = rightColumns.toArray(); } else { leftQueryExpression.unionColumnMap = new int[unionCorrespondingColumns.size()]; rightQueryExpression.unionColumnMap = new int[unionCorrespondingColumns.size()]; for (int i = 0; i < unionCorrespondingColumns.size(); i++) { String name = (String) unionCorrespondingColumns.get(i); int index = ArrayUtil.find(leftNames, name); if (index == -1) { throw Error.error(ErrorCode.X_42501); } if (!leftQueryExpression.accessibleColumns[index]) { throw Error.error(ErrorCode.X_42578); } leftQueryExpression.unionColumnMap[i] = index; index = ArrayUtil.find(rightNames, name); if (index == -1) { throw Error.error(ErrorCode.X_42501); } if (!rightQueryExpression.accessibleColumns[index]) { throw Error.error(ErrorCode.X_42578); } rightQueryExpression.unionColumnMap[i] = index; } } columnCount = unionCorrespondingColumns.size(); unionColumnTypes = new Type[columnCount]; resolveColumnRefernecesInUnionOrderBy(); accessibleColumns = new boolean[columnCount]; ArrayUtil.fillArray(accessibleColumns, true); isReferencesResolved = true; } /** * Only simple column reference or column position allowed */ void resolveColumnRefernecesInUnionOrderBy() { int orderCount = sortAndSlice.getOrderLength(); if (orderCount == 0) { return; } String[] unionColumnNames = getColumnNames(); for (int i = 0; i < orderCount; i++) { Expression sort = (Expression) sortAndSlice.exprList.get(i); Expression e = sort.getLeftNode(); if (e.getType() == OpTypes.VALUE) { if (e.getDataType().typeCode == Types.SQL_INTEGER) { int index = ((Integer) e.getValue(null)).intValue(); if (0 < index && index <= unionColumnNames.length) { sort.getLeftNode().queryTableColumnIndex = index - 1; continue; } } } else if (e.getType() == OpTypes.COLUMN) { int index = ArrayUtil.find(unionColumnNames, e.getColumnName()); if (index >= 0) { sort.getLeftNode().queryTableColumnIndex = index; continue; } } throw Error.error(ErrorCode.X_42576); } sortAndSlice.prepare(null); } private void addUnresolvedExpressions(HsqlList expressions) { if (expressions == null) { return; } if (unresolvedExpressions == null) { unresolvedExpressions = new ArrayListIdentity(); } unresolvedExpressions.addAll(expressions); } public void resolveTypes(Session session) { if (isResolved) { return; } resolveTypesPartOne(session); resolveTypesPartTwo(session); resolveTypesPartThree(session); } void resolveTypesPartOne(Session session) { if (isPartOneResolved) { return; } ArrayUtil.projectRowReverse(leftQueryExpression.unionColumnTypes, leftQueryExpression.unionColumnMap, unionColumnTypes); leftQueryExpression.resolveTypesPartOne(session); ArrayUtil.projectRow(leftQueryExpression.unionColumnTypes, leftQueryExpression.unionColumnMap, unionColumnTypes); ArrayUtil.projectRowReverse(rightQueryExpression.unionColumnTypes, rightQueryExpression.unionColumnMap, unionColumnTypes); rightQueryExpression.resolveTypesPartOne(session); ArrayUtil.projectRow(rightQueryExpression.unionColumnTypes, rightQueryExpression.unionColumnMap, unionColumnTypes); isPartOneResolved = true; } void resolveTypesPartTwo(Session session) { if (isPartTwoResolved) { return; } ArrayUtil.projectRowReverse(leftQueryExpression.unionColumnTypes, leftQueryExpression.unionColumnMap, unionColumnTypes); leftQueryExpression.resolveTypesPartTwo(session); leftQueryExpression.resolveTypesPartThree(session); ArrayUtil.projectRowReverse(rightQueryExpression.unionColumnTypes, rightQueryExpression.unionColumnMap, unionColumnTypes); rightQueryExpression.resolveTypesPartTwo(session); rightQueryExpression.resolveTypesPartThree(session); // ResultMetaData leftMeta = leftQueryExpression.getMetaData(); ResultMetaData rightMeta = rightQueryExpression.getMetaData(); for (int i = 0; i < leftQueryExpression.unionColumnMap.length; i++) { int leftIndex = leftQueryExpression.unionColumnMap[i]; int rightIndex = rightQueryExpression.unionColumnMap[i]; ColumnBase column = leftMeta.columns[leftIndex]; byte leftNullability = leftMeta.columns[leftIndex].getNullability(); byte rightNullability = rightMeta.columns[rightIndex].getNullability(); if (column instanceof ColumnSchema && rightMeta.columns[rightIndex] instanceof ColumnBase) { column = new ColumnBase(); column.setType(leftQueryExpression.unionColumnTypes[i]); column.setNullability(leftNullability); leftMeta.columns[leftIndex] = column; } if (rightNullability == SchemaObject.Nullability .NULLABLE || (rightNullability == SchemaObject.Nullability .NULLABLE_UNKNOWN && leftNullability == SchemaObject .Nullability.NO_NULLS)) { if (column instanceof ColumnSchema) { column = new ColumnBase(); column.setType(leftQueryExpression.unionColumnTypes[i]); leftMeta.columns[leftIndex] = column; } column.setNullability(rightNullability); } } if (unionCorresponding || isRecursive) { resultMetaData = leftQueryExpression.getMetaData().getNewMetaData( leftQueryExpression.unionColumnMap); createTable(session); } if (sortAndSlice.hasOrder()) { QueryExpression queryExpression = this; while (true) { if (queryExpression.leftQueryExpression == null || queryExpression.unionCorresponding) { sortAndSlice.setIndex(session, queryExpression.resultTable); break; } queryExpression = queryExpression.leftQueryExpression; } } isPartTwoResolved = true; } void resolveTypesPartThree(Session session) { compileContext = null; isResolved = true; } public Object[] getValues(Session session) { Result r = getResult(session, 2); int size = r.getNavigator().getSize(); if (size == 0) { return new Object[r.metaData.getColumnCount()]; } else if (size == 1) { return r.getSingleRowData(); } else { throw Error.error(ErrorCode.X_21000); } } public void addExtraConditions(Expression e) {} public Object[] getSingleRowValues(Session session) { Result r = getResult(session, 2); int size = r.getNavigator().getSize(); if (size == 0) { return null; } else if (size == 1) { return r.getSingleRowData(); } else { throw Error.error(ErrorCode.X_21000); } } public Object getValue(Session session) { Object[] values = getValues(session); return values[0]; } Result getResult(Session session, int maxRows) { if (isRecursive) { return getResultRecursive(session); } int currentMaxRows = unionType == UNION_ALL ? maxRows : 0; Result first = leftQueryExpression.getResult(session, currentMaxRows); RowSetNavigatorData navigator = (RowSetNavigatorData) first.getNavigator(); Result second = rightQueryExpression.getResult(session, currentMaxRows); RowSetNavigatorData rightNavigator = (RowSetNavigatorData) second.getNavigator(); if (unionCorresponding) { RowSetNavigatorData rowSet; boolean memory = session.resultMaxMemoryRows == 0 || (navigator.getSize() < session.resultMaxMemoryRows && rightNavigator.getSize() < session.resultMaxMemoryRows); if (memory) { rowSet = new RowSetNavigatorData(session, this); } else { rowSet = new RowSetNavigatorDataTable(session, this); } rowSet.copy(navigator, leftQueryExpression.unionColumnMap); navigator.release(); navigator = rowSet; first.setNavigator(navigator); first.metaData = this.getMetaData(); if (memory) { rowSet = new RowSetNavigatorData(session, this); } else { rowSet = new RowSetNavigatorDataTable(session, this); } rowSet.copy(rightNavigator, rightQueryExpression.unionColumnMap); rightNavigator.release(); rightNavigator = rowSet; } switch (unionType) { case UNION : navigator.union(session, rightNavigator); break; case UNION_ALL : navigator.unionAll(session, rightNavigator); break; case INTERSECT : navigator.intersect(session, rightNavigator); break; case INTERSECT_ALL : navigator.intersectAll(session, rightNavigator); break; case EXCEPT : navigator.except(session, rightNavigator); break; case EXCEPT_ALL : navigator.exceptAll(session, rightNavigator); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "QueryExpression"); } if (sortAndSlice.hasOrder()) { navigator.sortOrderUnion(session, sortAndSlice); } if (sortAndSlice.hasLimit()) { int[] limits = sortAndSlice.getLimits(session, this, maxRows); navigator.trim(limits[0], limits[1]); } navigator.reset(); return first; } Result getResultRecursive(Session session) { Result tempResult; RowSetNavigatorData rowSet = new RowSetNavigatorData(session, this); Result result = Result.newResult(rowSet); recursiveTable.materialise(session); RowIterator it = recursiveTable.rowIterator(session); rowSet.copy(it, unionColumnMap); result.metaData = resultMetaData; for (int round = 0; ; round++) { tempResult = rightQueryExpression.getResult(session, 0); RowSetNavigatorData tempNavigator = (RowSetNavigatorData) tempResult.getNavigator(); if (tempNavigator.isEmpty()) { break; } switch (unionType) { case UNION : rowSet.union(session, tempNavigator); break; case UNION_ALL : rowSet.unionAll(session, tempNavigator); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "QueryExpression"); } recursiveTable.clearAllData(session); tempNavigator.reset(); recursiveTable.insertIntoTable(session, tempResult); if (round > 256) { throw Error.error(ErrorCode.GENERAL_ERROR); } } recursiveTable.clearAllData(session); rowSet.reset(); return result; } public OrderedHashSet getSubqueries() { OrderedHashSet subqueries = leftQueryExpression.getSubqueries(); subqueries = OrderedHashSet.addAll(subqueries, rightQueryExpression.getSubqueries()); return subqueries; } public boolean isSingleColumn() { return leftQueryExpression.isSingleColumn(); } public ResultMetaData getMetaData() { if (resultMetaData != null) { return resultMetaData; } return leftQueryExpression.getMetaData(); } public QuerySpecification getMainSelect() { if (leftQueryExpression == null) { return (QuerySpecification) this; } return leftQueryExpression.getMainSelect(); } /** @todo 1.9.0 review */ public String describe(Session session, int blanks) { StringBuffer sb; String temp; StringBuffer b = new StringBuffer(blanks); for (int i = 0; i < blanks; i++) { b.append(' '); } sb = new StringBuffer(); switch (unionType) { case UNION : temp = Tokens.T_UNION; break; case UNION_ALL : temp = Tokens.T_UNION + ' ' + Tokens.T_ALL; break; case INTERSECT : temp = Tokens.T_INTERSECT; break; case INTERSECT_ALL : temp = Tokens.T_INTERSECT + ' ' + Tokens.T_ALL; break; case EXCEPT : temp = Tokens.T_EXCEPT; break; case EXCEPT_ALL : temp = Tokens.T_EXCEPT + ' ' + Tokens.T_ALL; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "QueryExpression"); } sb.append(b).append(temp).append("\n"); sb.append(b).append("Left Query=[\n"); sb.append(b).append(leftQueryExpression.describe(session, blanks + 2)); sb.append(b).append("]\n"); sb.append(b).append("Right Query=[\n"); sb.append(b).append(rightQueryExpression.describe(session, blanks + 2)); sb.append(b).append("]\n"); return sb.toString(); } public HsqlList getUnresolvedExpressions() { return unresolvedExpressions; } public boolean areColumnsResolved() { if (unresolvedExpressions == null || unresolvedExpressions.isEmpty()) { return true; } for (int i = 0; i < unresolvedExpressions.size(); i++) { Expression e = (Expression) unresolvedExpressions.get(i); if (e.getRangeVariable() == null) { return false; } if (e.getRangeVariable().rangeType == RangeVariable.TABLE_RANGE) { return false; } } return true; } String[] getColumnNames() { if (unionCorrespondingColumns == null) { return leftQueryExpression.getColumnNames(); } String[] names = new String[unionCorrespondingColumns.size()]; unionCorrespondingColumns.toArray(names); return names; } public Type[] getColumnTypes() { return unionColumnTypes; } public int getColumnCount() { if (unionCorrespondingColumns == null) { int left = leftQueryExpression.getColumnCount(); int right = rightQueryExpression.getColumnCount(); if (left != right) { throw Error.error(ErrorCode.X_42594); } return left; } return unionCorrespondingColumns.size(); } public OrderedHashSet collectAllExpressions(OrderedHashSet set, OrderedIntHashSet typeSet, OrderedIntHashSet stopAtTypeSet) { set = leftQueryExpression.collectAllExpressions(set, typeSet, stopAtTypeSet); if (rightQueryExpression != null) { set = rightQueryExpression.collectAllExpressions(set, typeSet, stopAtTypeSet); } return set; } OrderedHashSet collectRangeVariables(RangeVariable[] rangeVars, OrderedHashSet set) { set = leftQueryExpression.collectRangeVariables(rangeVars, set); if (rightQueryExpression != null) { set = rightQueryExpression.collectRangeVariables(rangeVars, set); } return set; } public void collectObjectNames(Set set) { leftQueryExpression.collectObjectNames(set); if (rightQueryExpression != null) { rightQueryExpression.collectObjectNames(set); } } public HashMappedList getColumns() { this.getResultTable(); return ((TableDerived) getResultTable()).columnList; } /** * Used prior to type resolution */ public void setView(View view) { this.view = view; this.isUpdatable = true; this.acceptsSequences = true; this.isTopLevel = true; } /** * Used in views after full type resolution */ public void setTableColumnNames(HashMappedList list) { if (resultTable != null) { ((TableDerived) resultTable).columnList = list; return; } leftQueryExpression.setTableColumnNames(list); } void createTable(Session session) { createResultTable(session); mainIndex = resultTable.getPrimaryIndex(); if (sortAndSlice.hasOrder()) { orderIndex = sortAndSlice.getNewIndex(session, resultTable); } int[] fullCols = new int[columnCount]; ArrayUtil.fillSequence(fullCols); fullIndex = resultTable.createAndAddIndexStructure(null, fullCols, null, null, false, false, false); resultTable.fullIndex = fullIndex; } void createResultTable(Session session) { HsqlName tableName; HashMappedList columnList; int tableType; tableName = session.database.nameManager.getSubqueryTableName(); tableType = persistenceScope == TableBase.SCOPE_STATEMENT ? TableBase.SYSTEM_SUBQUERY : TableBase.RESULT_TABLE; columnList = leftQueryExpression.getUnionColumns(); try { resultTable = new TableDerived(session.database, tableName, tableType, unionColumnTypes, columnList, ValuePool.emptyIntArray); } catch (Exception e) {} } public void setColumnsDefined() { if (leftQueryExpression != null) { leftQueryExpression.setColumnsDefined(); } } /** * Not for views. Only used on root node. */ public void setReturningResult() { if (compileContext.getSequences().length > 0) { throw Error.error(ErrorCode.X_42598); } isTopLevel = true; setReturningResultSet(); } /** * Sets the scope to SESSION for the QueryExpression object that creates * the table */ void setReturningResultSet() { if (unionCorresponding) { persistenceScope = TableBase.SCOPE_SESSION; return; } leftQueryExpression.setReturningResultSet(); } private HashMappedList getUnionColumns() { if (unionCorresponding || leftQueryExpression == null) { HashMappedList columns = ((TableDerived) resultTable).columnList; HashMappedList list = new HashMappedList(); for (int i = 0; i < unionColumnMap.length; i++) { ColumnSchema column = (ColumnSchema) columns.get(unionColumnMap[i]); list.add(column.getName().name, column); } return list; } return leftQueryExpression.getUnionColumns(); } public HsqlName[] getResultColumnNames() { if (resultTable == null) { return leftQueryExpression.getResultColumnNames(); } HashMappedList list = ((TableDerived) resultTable).columnList; HsqlName[] resultColumnNames = new HsqlName[list.size()]; for (int i = 0; i < resultColumnNames.length; i++) { resultColumnNames[i] = ((ColumnSchema) list.get(i)).getName(); } return resultColumnNames; } public TableBase getResultTable() { if (resultTable != null) { return resultTable; } if (leftQueryExpression != null) { return leftQueryExpression.getResultTable(); } return null; } // public Table getBaseTable() { return null; } public boolean isUpdatable() { return isUpdatable; } public boolean isInsertable() { return isInsertable; } public int[] getBaseTableColumnMap() { return null; } public Expression getCheckCondition() { return null; } public boolean hasReference(RangeVariable range) { if (leftQueryExpression.hasReference(range)) { return true; } if (rightQueryExpression.hasReference(range)) { return true; } return false; } void getBaseTableNames(OrderedHashSet set) { leftQueryExpression.getBaseTableNames(set); rightQueryExpression.getBaseTableNames(set); } boolean isEquivalent(QueryExpression other) { return leftQueryExpression.isEquivalent(other.leftQueryExpression) && unionType == other.unionType && (rightQueryExpression == null ? other.rightQueryExpression == null : rightQueryExpression.isEquivalent( other.rightQueryExpression)); } public void replaceColumnReferences(RangeVariable range, Expression[] list) { leftQueryExpression.replaceColumnReferences(range, list); rightQueryExpression.replaceColumnReferences(range, list); } public void replaceRangeVariables(RangeVariable[] ranges, RangeVariable[] newRanges) { leftQueryExpression.replaceRangeVariables(ranges, newRanges); rightQueryExpression.replaceRangeVariables(ranges, newRanges); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Statement.java0000644000175000017500000001550712007547352021562 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.result.Result; import org.hsqldb.result.ResultMetaData; import org.hsqldb.result.ResultProperties; /** * Base class for compiled statement objects.

              * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public abstract class Statement { static final int META_RESET_VIEWS = 1; static final int META_RESET_STATEMENTS = 2; // static final Statement[] emptyArray = new Statement[]{}; // final int type; int group; boolean isLogged = true; boolean isValid = true; int statementReturnType = StatementTypes.RETURN_COUNT; /** the default schema name used to resolve names in the sql */ HsqlName schemaName; /** root in PSM */ Routine root; /** parent in PSM */ StatementCompound parent; boolean isError; boolean isTransactionStatement; boolean isExplain; /** SQL string for the statement */ String sql; /** id in StatementManager */ long id; /** compileTimestamp */ long compileTimestamp; /** table names read - for concurrency control */ HsqlName[] readTableNames = HsqlName.emptyArray; /** table names written - for concurrency control */ HsqlName[] writeTableNames = HsqlName.emptyArray;; // OrderedHashSet references; // int cursorPropertiesRequest; public abstract Result execute(Session session); public void setParameters(ExpressionColumn[] params) {} Statement(int type) { this.type = type; } Statement(int type, int group) { this.type = type; this.group = group; } public final boolean isError() { return isError; } public boolean isTransactionStatement() { return isTransactionStatement; } public boolean isAutoCommitStatement() { return false; } public void setCompileTimestamp(long ts) { compileTimestamp = ts; } public long getCompileTimestamp() { return compileTimestamp; } public final void setSQL(String sql) { this.sql = sql; } public String getSQL() { return sql; } public OrderedHashSet getReferences() { return references; } public final void setDescribe() { isExplain = true; } public abstract String describe(Session session); public HsqlName getSchemaName() { return schemaName; } public final void setSchemaHsqlName(HsqlName name) { schemaName = name; } public final void setID(long csid) { id = csid; } public final long getID() { return id; } public final int getType() { return type; } public final int getGroup() { return group; } public final boolean isValid() { return isValid; } public final boolean isLogged() { return isLogged; } public void clearVariables() {} public void resolve(Session session) {} public final HsqlName[] getTableNamesForRead() { return readTableNames; } public final HsqlName[] getTableNamesForWrite() { return writeTableNames; } public boolean isCatalogLock() { switch (group) { case StatementTypes.X_SQL_SCHEMA_MANIPULATION : // in MVCC log replay statement is not followed by COMMIT so no lock if (type == StatementTypes.ALTER_SEQUENCE) { return false; } case StatementTypes.X_SQL_SCHEMA_DEFINITION : case StatementTypes.X_HSQLDB_SCHEMA_MANIPULATION : return true; case StatementTypes.X_HSQLDB_DATABASE_OPERATION : return true; default : return false; } } public boolean isCatalogChange() { switch (group) { case StatementTypes.X_SQL_SCHEMA_DEFINITION : case StatementTypes.X_SQL_SCHEMA_MANIPULATION : case StatementTypes.X_HSQLDB_SCHEMA_MANIPULATION : return true; default : return false; } } public void setParent(StatementCompound statement) { this.parent = statement; } public void setRoot(Routine root) { this.root = root; } public boolean hasGeneratedColumns() { return false; } public ResultMetaData generatedResultMetaData() { return null; } public void setGeneratedColumnInfo(int mode, ResultMetaData meta) {} public ResultMetaData getResultMetaData() { return ResultMetaData.emptyResultMetaData; } public ResultMetaData getParametersMetaData() { return ResultMetaData.emptyParamMetaData; } public int getResultProperties() { return ResultProperties.defaultPropsValue; } public int getStatementReturnType() { return statementReturnType; } public int getCursorPropertiesRequest() { return cursorPropertiesRequest; } public void setCursorPropertiesRequest(int props) { cursorPropertiesRequest = props; } public void clearStructures(Session session) {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ExpressionLike.java0000644000175000017500000003162212007547352022556 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HsqlList; import org.hsqldb.types.BinaryData; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Implementation of LIKE operations * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public final class ExpressionLike extends ExpressionLogical { private static final int ESCAPE = 2; private Like likeObject; /** * Creates a LIKE expression */ ExpressionLike(Expression left, Expression right, Expression escape, boolean noOptimisation) { super(OpTypes.LIKE); nodes = new Expression[TERNARY]; nodes[LEFT] = left; nodes[RIGHT] = right; nodes[ESCAPE] = escape; likeObject = new Like(); this.noOptimisation = noOptimisation; } private ExpressionLike(ExpressionLike other) { super(OpTypes.LIKE); this.nodes = other.nodes; this.likeObject = other.likeObject; } public HsqlList resolveColumnReferences(Session session, RangeGroup rangeGroup, int rangeCount, RangeGroup[] rangeGroups, HsqlList unresolvedSet, boolean acceptsSequences) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { unresolvedSet = nodes[i].resolveColumnReferences(session, rangeGroup, rangeCount, rangeGroups, unresolvedSet, acceptsSequences); } } return unresolvedSet; } public Object getValue(Session session) { if (opType != OpTypes.LIKE) { return super.getValue(session); } Object leftValue = nodes[LEFT].getValue(session); Object rightValue = nodes[RIGHT].getValue(session); Object escapeValue = nodes[ESCAPE] == null ? null : nodes[ESCAPE].getValue( session); if (likeObject.isVariable) { synchronized (likeObject) { likeObject.setPattern(session, rightValue, escapeValue, nodes[ESCAPE] != null); return likeObject.compare(session, leftValue); } } return likeObject.compare(session, leftValue); } public void resolveTypes(Session session, Expression parent) { if (opType != OpTypes.LIKE) { return; } for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { nodes[i].resolveTypes(session, this); } } boolean isEscapeFixedConstant = true; if (nodes[ESCAPE] != null) { if (nodes[ESCAPE].isUnresolvedParam()) { throw Error.error(ErrorCode.X_42567); } nodes[ESCAPE].resolveTypes(session, this); isEscapeFixedConstant = nodes[ESCAPE].opType == OpTypes.VALUE; if (isEscapeFixedConstant) { nodes[ESCAPE].setAsConstantValue(session); if (nodes[ESCAPE].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (nodes[ESCAPE].valueData != null) { long length; switch (nodes[ESCAPE].dataType.typeCode) { case Types.SQL_CHAR : case Types.SQL_VARCHAR : length = ((String) nodes[ESCAPE].valueData).length(); break; case Types.SQL_BINARY : case Types.SQL_VARBINARY : length = ((BinaryData) nodes[ESCAPE].valueData).length( session); break; default : throw Error.error(ErrorCode.X_42563); } if (length != 1) { throw Error.error(ErrorCode.X_22019); } } } } if (nodes[LEFT].isUnresolvedParam() && nodes[RIGHT].isUnresolvedParam()) { nodes[LEFT].dataType = Type.SQL_VARCHAR_DEFAULT; } if (nodes[LEFT].dataType == null && nodes[RIGHT].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (nodes[LEFT].isUnresolvedParam()) { nodes[LEFT].dataType = nodes[RIGHT].dataType.isBinaryType() ? Type.SQL_VARBINARY_DEFAULT : Type.SQL_VARCHAR_DEFAULT; } else if (nodes[RIGHT].isUnresolvedParam()) { nodes[RIGHT].dataType = nodes[LEFT].dataType.isBinaryType() ? Type.SQL_VARBINARY_DEFAULT : Type.SQL_VARCHAR_DEFAULT; } if (nodes[LEFT].dataType == null || nodes[RIGHT].dataType == null) { throw Error.error(ErrorCode.X_42567); } switch (nodes[LEFT].dataType.typeComparisonGroup) { case Types.SQL_VARCHAR : { if (nodes[RIGHT].dataType.isCharacterType() && (nodes[ESCAPE] == null || nodes[ESCAPE].dataType.isCharacterType())) { boolean ignoreCase = nodes[LEFT].dataType.typeCode == Types .VARCHAR_IGNORECASE || nodes[RIGHT].dataType .typeCode == Types.VARCHAR_IGNORECASE; likeObject.setIgnoreCase(ignoreCase); } else { throw Error.error(ErrorCode.X_42563); } break; } case Types.SQL_VARBINARY : { if (nodes[RIGHT].dataType.isBinaryType() && (nodes[ESCAPE] == null || nodes[ESCAPE].dataType.isBinaryType())) { likeObject.isBinary = true; } else { throw Error.error(ErrorCode.X_42563); } break; } case Types.OTHER : { throw Error.error(ErrorCode.X_42563); } default : { if (session.database.sqlEnforceTypes) { throw Error.error(ErrorCode.X_42562); } nodes[LEFT] = ExpressionOp.getCastExpression(session, nodes[LEFT], Type.SQL_VARCHAR_DEFAULT); if (nodes[RIGHT].dataType.isCharacterType() && (nodes[ESCAPE] == null || nodes[ESCAPE].dataType.isCharacterType())) { boolean ignoreCase = nodes[RIGHT].dataType.typeCode == Types.VARCHAR_IGNORECASE; likeObject.setIgnoreCase(ignoreCase); } else { throw Error.error(ErrorCode.X_42563); } break; } } likeObject.dataType = nodes[LEFT].dataType; boolean isRightArgFixedConstant = nodes[RIGHT].opType == OpTypes.VALUE; if (isRightArgFixedConstant && isEscapeFixedConstant) { if (nodes[LEFT].opType == OpTypes.VALUE) { setAsConstantValue(session); likeObject = null; return; } likeObject.isVariable = false; } // always optimise with logical conditions Object pattern = isRightArgFixedConstant ? nodes[RIGHT].getValue(session) : null; boolean constantEscape = isEscapeFixedConstant && nodes[ESCAPE] != null; Object escape = constantEscape ? nodes[ESCAPE].getValue(session) : null; likeObject.setPattern(session, pattern, escape, nodes[ESCAPE] != null); if (noOptimisation) { return; } if (likeObject.isEquivalentToUnknownPredicate()) { this.setAsConstantValue(session); likeObject = null; return; } if (likeObject.isEquivalentToEqualsPredicate()) { opType = OpTypes.EQUAL; nodes[RIGHT] = new ExpressionValue(likeObject.getRangeLow(), Type.SQL_VARCHAR); likeObject = null; setEqualityMode(); return; } if (likeObject.isEquivalentToNotNullPredicate()) { Expression notNull = new ExpressionLogical(OpTypes.IS_NULL, nodes[LEFT]); opType = OpTypes.NOT; nodes = new Expression[UNARY]; nodes[LEFT] = notNull; likeObject = null; return; } if (nodes[LEFT].opType == OpTypes.COLUMN) { ExpressionLike newLike = new ExpressionLike(this); Expression prefix = new ExpressionOp(OpTypes.LIKE_ARG, nodes[RIGHT], nodes[ESCAPE]); prefix.resolveTypes(session, null); Expression cast = new ExpressionOp(OpTypes.PREFIX, nodes[LEFT], prefix); Expression equ = new ExpressionLogical(OpTypes.EQUAL, cast, prefix); equ = new ExpressionLogical(OpTypes.GREATER_EQUAL, nodes[LEFT], prefix, equ); equ.setSubType(OpTypes.LIKE); nodes = new Expression[BINARY]; likeObject = null; nodes[LEFT] = equ; nodes[RIGHT] = newLike; opType = OpTypes.AND; } } public String getSQL() { if (likeObject == null) { return super.getSQL(); } String left = getContextSQL(nodes[LEFT]); String right = getContextSQL(nodes[RIGHT]); StringBuffer sb = new StringBuffer(); sb.append(left).append(' ').append(Tokens.T_LIKE).append(' '); sb.append(right); /** @todo fredt - scripting of non-ascii escapes needs changes to general script logging */ if (nodes[ESCAPE] != null) { sb.append(' ').append(Tokens.T_ESCAPE).append(' '); sb.append(nodes[ESCAPE].getSQL()); sb.append(' '); } return sb.toString(); } protected String describe(Session session, int blanks) { if (likeObject == null) { return super.describe(session, blanks); } StringBuffer sb = new StringBuffer(); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } sb.append("LIKE "); sb.append(likeObject.describe(session)); return sb.toString(); } public Expression duplicate() { ExpressionLike e = (ExpressionLike) super.duplicate(); if (likeObject != null) { e.likeObject = likeObject.duplicate(); } return e; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ExpressionArithmetic.java0000644000175000017500000005246212007547352023770 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HsqlList; import org.hsqldb.types.CharacterType; import org.hsqldb.types.NumberType; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Implementation of arithmetic and concatenation operations * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public class ExpressionArithmetic extends Expression { ExpressionArithmetic(int type, Expression left, Expression right) { super(type); nodes = new Expression[BINARY]; nodes[LEFT] = left; nodes[RIGHT] = right; switch (opType) { case OpTypes.ADD : case OpTypes.SUBTRACT : case OpTypes.MULTIPLY : case OpTypes.DIVIDE : case OpTypes.CONCAT : return; default : throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } } ExpressionArithmetic(int type, Expression e) { super(type); nodes = new Expression[UNARY]; nodes[LEFT] = e; switch (opType) { case OpTypes.NEGATE : return; default : throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } } public String getSQL() { StringBuffer sb = new StringBuffer(64); switch (opType) { case OpTypes.VALUE : if (valueData == null) { return Tokens.T_NULL; } if (dataType == null) { throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } return dataType.convertToSQLString(valueData); } String left = getContextSQL(nodes.length > 0 ? nodes[LEFT] : null); String right = getContextSQL(nodes.length > 1 ? nodes[RIGHT] : null); switch (opType) { case OpTypes.CAST : sb.append(' ').append(Tokens.T_CAST).append('('); sb.append(left).append(' ').append(Tokens.T_AS).append(' '); sb.append(dataType.getTypeDefinition()); sb.append(')'); break; case OpTypes.NEGATE : sb.append('-').append(left); break; case OpTypes.ADD : sb.append(left).append('+').append(right); break; case OpTypes.SUBTRACT : sb.append(left).append('-').append(right); break; case OpTypes.MULTIPLY : sb.append(left).append('*').append(right); break; case OpTypes.DIVIDE : sb.append(left).append('/').append(right); break; case OpTypes.CONCAT : sb.append(left).append("||").append(right); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } return sb.toString(); } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(64); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } switch (opType) { case OpTypes.VALUE : sb.append("VALUE = ").append( dataType.convertToSQLString(valueData)); sb.append(", TYPE = ").append(dataType.getNameString()); return sb.toString(); case OpTypes.ROW : // case OpTypes.VALUELIST : sb.append("VALUELIST "); sb.append(" TYPE = ").append(dataType.getNameString()); for (int i = 0; i < nodes.length; i++) { sb.append(nodes[i].describe(session, blanks + blanks)); sb.append(' '); } break; case OpTypes.NEGATE : sb.append("NEGATE "); break; case OpTypes.ADD : sb.append("ADD "); break; case OpTypes.SUBTRACT : sb.append("SUBTRACT "); break; case OpTypes.MULTIPLY : sb.append("MULTIPLY "); break; case OpTypes.DIVIDE : sb.append("DIVIDE "); break; case OpTypes.CONCAT : sb.append("CONCAT "); break; case OpTypes.CAST : sb.append("CAST "); sb.append(dataType.getTypeDefinition()); sb.append(' '); break; } if (getLeftNode() != null) { sb.append(" arg_left=["); sb.append(nodes[LEFT].describe(session, blanks + 1)); sb.append(']'); } if (getRightNode() != null) { sb.append(" arg_right=["); sb.append(nodes[RIGHT].describe(session, blanks + 1)); sb.append(']'); } return sb.toString(); } public HsqlList resolveColumnReferences(Session session, RangeGroup rangeGroup, int rangeCount, RangeGroup[] rangeGroups, HsqlList unresolvedSet, boolean acceptsSequences) { if (opType == OpTypes.VALUE) { return unresolvedSet; } for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } unresolvedSet = nodes[i].resolveColumnReferences(session, rangeGroup, rangeCount, rangeGroups, unresolvedSet, acceptsSequences); } return unresolvedSet; } public void resolveTypes(Session session, Expression parent) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { nodes[i].resolveTypes(session, this); } } switch (opType) { case OpTypes.VALUE : break; case OpTypes.NEGATE : if (nodes[LEFT].isUnresolvedParam() || nodes[LEFT].dataType == null) { throw Error.error(ErrorCode.X_42567); } dataType = nodes[LEFT].dataType; if (!dataType.isNumberType()) { throw Error.error(ErrorCode.X_42563); } if (nodes[LEFT].opType == OpTypes.VALUE) { setAsConstantValue(session); } break; case OpTypes.ADD : // special case for concat using + if ((nodes[LEFT].dataType != null && nodes[LEFT].dataType .isCharacterType()) || (nodes[RIGHT].dataType != null && nodes[RIGHT].dataType .isCharacterType())) { opType = OpTypes.CONCAT; resolveTypesForConcat(session, parent); break; } // fall through case OpTypes.SUBTRACT : case OpTypes.MULTIPLY : case OpTypes.DIVIDE : resolveTypesForArithmetic(session, parent); break; case OpTypes.CONCAT : resolveTypesForConcat(session, parent); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } } void resolveTypesForArithmetic(Session session, Expression parent) { if (nodes[LEFT].isUnresolvedParam() && nodes[RIGHT].isUnresolvedParam()) { nodes[LEFT].dataType = nodes[RIGHT].dataType = Type.SQL_INTEGER; } if (nodes[LEFT].dataType == null && nodes[RIGHT].dataType == null) { nodes[LEFT].dataType = nodes[RIGHT].dataType = Type.SQL_INTEGER; } if (nodes[LEFT].isUnresolvedParam()) { if (nodes[RIGHT].dataType == null) { throw Error.error(ErrorCode.X_42567); } if (nodes[RIGHT].dataType.isIntervalType()) { if (parent != null) { switch (parent.opType) { case OpTypes.EQUAL : case OpTypes.GREATER_EQUAL : case OpTypes.SMALLER_EQUAL : case OpTypes.SMALLER : case OpTypes.GREATER : for (int i = 0; i < parent.nodes.length; i++) { if (parent.nodes[i] != this) { if (parent.nodes[i].dataType != null && parent.nodes[i].dataType .isDateTimeType()) { nodes[LEFT].dataType = parent.nodes[i].dataType; } break; } } break; default : } } } if (nodes[LEFT].dataType == null) { switch (opType) { case OpTypes.SUBTRACT : if (nodes[RIGHT].dataType.isIntervalType()) { nodes[LEFT].dataType = Type.SQL_TIMESTAMP_WITH_TIME_ZONE; } break; case OpTypes.ADD : if (nodes[RIGHT].dataType.isDateTimeType()) { if (nodes[RIGHT].dataType.typeComparisonGroup == Types.SQL_DATE) { nodes[LEFT].dataType = Type .SQL_INTERVAL_YEAR_TO_MONTH_MAX_PRECISION; } else { nodes[LEFT].dataType = Type .SQL_INTERVAL_DAY_TO_SECOND_MAX_PRECISION; } } else if (nodes[RIGHT].dataType.isIntervalType()) { nodes[LEFT].dataType = Type.SQL_TIMESTAMP_WITH_TIME_ZONE; } break; } } if (nodes[LEFT].dataType == null) { nodes[LEFT].dataType = nodes[RIGHT].dataType; } } else if (nodes[RIGHT].isUnresolvedParam()) { if (nodes[LEFT].dataType == null) { throw Error.error(ErrorCode.X_42567); } switch (opType) { case OpTypes.MULTIPLY : case OpTypes.DIVIDE : if (nodes[LEFT].dataType.isIntervalType()) { nodes[RIGHT].dataType = Type.SQL_DECIMAL; } else { nodes[RIGHT].dataType = nodes[LEFT].dataType; } break; case OpTypes.SUBTRACT : case OpTypes.ADD : if (nodes[LEFT].dataType.isDateTimeType()) { // datetime subtract - type predetermined if (dataType != null && dataType.isIntervalType()) { nodes[RIGHT].dataType = nodes[LEFT].dataType; } else if (nodes[LEFT].dataType.typeComparisonGroup == Types.SQL_DATE) { nodes[RIGHT].dataType = Type.SQL_INTERVAL_YEAR_TO_MONTH_MAX_PRECISION; } else { nodes[RIGHT].dataType = Type.SQL_INTERVAL_DAY_TO_SECOND_MAX_PRECISION; } } else { nodes[RIGHT].dataType = nodes[LEFT].dataType; } break; } } if (nodes[LEFT].dataType == null || nodes[RIGHT].dataType == null) { throw Error.error(ErrorCode.X_42567); } // datetime subtract - type predetermined if (dataType != null && dataType.isIntervalType()) { if (nodes[LEFT].dataType.isDateTimeType() && nodes[RIGHT].dataType.isDateTimeType()) { if (nodes[LEFT].dataType.typeComparisonGroup != nodes[RIGHT].dataType.typeComparisonGroup) { throw Error.error(ErrorCode.X_42562); } } else { Type type = nodes[LEFT].dataType.getCombinedType(session, nodes[RIGHT].dataType, opType); if (type == null) { throw Error.error(ErrorCode.X_42562); } if (type.isIntervalType()) { if (type.typeCode != dataType.typeCode) { throw Error.error(ErrorCode.X_42562); } } else if (type.isNumberType()) { nodes[LEFT] = new ExpressionOp(nodes[LEFT], dataType); nodes[RIGHT] = new ExpressionOp(nodes[RIGHT], dataType); nodes[LEFT].resolveTypes(session, this); nodes[RIGHT].resolveTypes(session, this); } else { throw Error.error(ErrorCode.X_42562); } } } else { dataType = nodes[LEFT].dataType.getCombinedType(session, nodes[RIGHT].dataType, opType); if (dataType.isDateTimeType()) { if (nodes[LEFT].dataType.isIntervalType()) { if (opType != OpTypes.ADD) { throw Error.error(ErrorCode.X_42563); } Expression temp = nodes[LEFT]; nodes[LEFT] = nodes[RIGHT]; nodes[RIGHT] = temp; } else if (nodes[RIGHT].dataType.isNumberType()) { if (!session.database.sqlSyntaxOra) { throw Error.error(ErrorCode.X_42562); } } } } if (nodes[LEFT].opType == OpTypes.VALUE && nodes[RIGHT].opType == OpTypes.VALUE) { setAsConstantValue(session); } } void resolveTypesForConcat(Session session, Expression parent) { if (dataType != null) { return; } if (nodes[LEFT].isUnresolvedParam()) { nodes[LEFT].dataType = getParameterType(nodes[RIGHT].dataType); } else if (nodes[RIGHT].isUnresolvedParam()) { nodes[RIGHT].dataType = getParameterType(nodes[LEFT].dataType); } if (nodes[LEFT].dataType == null) { nodes[LEFT].dataType = Type.SQL_VARCHAR_DEFAULT; } if (nodes[RIGHT].dataType == null) { nodes[RIGHT].dataType = Type.SQL_VARCHAR_DEFAULT; } if (nodes[LEFT].dataType.isBinaryType() ^ nodes[RIGHT].dataType.isBinaryType()) { throw Error.error(ErrorCode.X_42563); } if (nodes[LEFT].dataType.isArrayType()) { Expression e = nodes[RIGHT]; if (e.opType == OpTypes.ARRAY_ACCESS) { if (parent == null) { throw Error.error(ErrorCode.X_42563); } nodes[RIGHT] = e.getLeftNode(); e.nodes[LEFT] = this; parent.replaceNode(this, e); } } if (nodes[LEFT].dataType.isArrayType() ^ nodes[RIGHT].dataType.isArrayType()) { throw Error.error(ErrorCode.X_42563); } // conversion of right argument to character for backward compatibility if (nodes[LEFT].dataType.isCharacterType() && !nodes[RIGHT].dataType.isCharacterType()) { if (session.database.sqlEnforceTypes) { throw Error.error(ErrorCode.X_42562); } Type newType = CharacterType.getCharacterType(Types.SQL_VARCHAR, nodes[RIGHT].dataType.displaySize(), nodes[LEFT].dataType.getCollation()); nodes[RIGHT] = ExpressionOp.getCastExpression(session, nodes[RIGHT], newType); } if (nodes[RIGHT].dataType.isCharacterType() && !nodes[LEFT].dataType.isCharacterType()) { if (session.database.sqlEnforceTypes) { throw Error.error(ErrorCode.X_42562); } Type newType = CharacterType.getCharacterType(Types.SQL_VARCHAR, nodes[LEFT].dataType.displaySize(), nodes[RIGHT].dataType.getCollation()); nodes[LEFT] = ExpressionOp.getCastExpression(session, nodes[LEFT], newType); } dataType = nodes[LEFT].dataType.getCombinedType(session, nodes[RIGHT].dataType, OpTypes.CONCAT); if (nodes[LEFT].opType == OpTypes.VALUE && nodes[RIGHT].opType == OpTypes.VALUE) { setAsConstantValue(session); } } private Type getParameterType(Type type) { if (type == null) { return null; } switch (type.typeCode) { case Types.SQL_CHAR : case Types.SQL_VARCHAR : return Type.SQL_VARCHAR_DEFAULT; case Types.SQL_CLOB : return Type.SQL_CLOB; case Types.SQL_BINARY : case Types.SQL_VARBINARY : return Type.SQL_VARBINARY_DEFAULT; case Types.SQL_BLOB : return Type.SQL_BLOB; case Types.SQL_BIT : case Types.SQL_BIT_VARYING : return Type.SQL_BIT_VARYING_MAX_LENGTH; case Types.SQL_ARRAY : return type; default : return null; } } public Object getValue(Session session) { switch (opType) { case OpTypes.VALUE : return valueData; case OpTypes.SIMPLE_COLUMN : { Object value = session.sessionContext.rangeIterators[rangePosition] .getCurrent(columnIndex); return value; } case OpTypes.NEGATE : return ((NumberType) dataType).negate( nodes[LEFT].getValue(session, nodes[LEFT].dataType)); } Object a = nodes[LEFT].getValue(session); Object b = nodes[RIGHT].getValue(session); switch (opType) { case OpTypes.ADD : return dataType.add(a, b, nodes[RIGHT].dataType); case OpTypes.SUBTRACT : return dataType.subtract(a, b, nodes[RIGHT].dataType); case OpTypes.MULTIPLY : return dataType.multiply(a, b); case OpTypes.DIVIDE : return dataType.divide(session, a, b); case OpTypes.CONCAT : if (!session.database.sqlConcatNulls && nodes[LEFT].dataType.isCharacterType()) { if (a == null && b != null) { a = ""; } else if (a != null && b == null) { b = ""; } } return dataType.concat(session, a, b); default : throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TransactionManagerMVCC.java0000644000175000017500000006627312007547406024055 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.util.concurrent.locks.Lock; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.HsqlDeque; import org.hsqldb.lib.LongDeque; import org.hsqldb.lib.LongKeyHashMap; import org.hsqldb.persist.CachedObject; import org.hsqldb.persist.PersistentStore; /** * Manages rows involved in transactions * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 2.0.0 */ public class TransactionManagerMVCC extends TransactionManagerCommon implements TransactionManager { // functional unit - merged committed transactions HsqlDeque committedTransactions = new HsqlDeque(); LongDeque committedTransactionTimestamps = new LongDeque(); // locks boolean isLockedMode; Session catalogWriteSession; // long lockTxTs; long lockSessionId; long unlockTxTs; long unlockSessionId; // int redoCount = 0; // public TransactionManagerMVCC(Database db) { database = db; lobSession = database.sessionManager.getSysLobSession(); rowActionMap = new LongKeyHashMap(10000); txModel = MVCC; } public long getGlobalChangeTimestamp() { return globalChangeTimestamp.get(); } public boolean isMVRows() { return true; } public boolean isMVCC() { return true; } public int getTransactionControl() { return MVCC; } public void setTransactionControl(Session session, int mode) { super.setTransactionControl(session, mode); } public void completeActions(Session session) {} public boolean prepareCommitActions(Session session) { Object[] list = session.rowActionList.getArray(); int limit = session.rowActionList.size(); if (session.abortTransaction) { // System.out.println("cascade fail " + session + " " + session.actionTimestamp); return false; } writeLock.lock(); try { for (int i = 0; i < limit; i++) { RowAction rowact = (RowAction) list[i]; if (!rowact.canCommit(session, session.tempSet)) { // System.out.println("commit conflicts " + session + " " + session.actionTimestamp); return false; } } session.actionTimestamp = nextChangeTimestamp(); for (int i = 0; i < limit; i++) { RowAction action = (RowAction) list[i]; action.prepareCommit(session); } for (int i = 0; i < session.tempSet.size(); i++) { Session current = ((RowActionBase) session.tempSet.get(i)).session; current.abortTransaction = true; } return true; } finally { writeLock.unlock(); session.tempSet.clear(); } } public boolean commitTransaction(Session session) { if (session.abortTransaction) { return false; } int limit = session.rowActionList.size(); Object[] list = session.rowActionList.getArray(); writeLock.lock(); try { for (int i = 0; i < limit; i++) { RowAction rowact = (RowAction) list[i]; if (!rowact.canCommit(session, session.tempSet)) { // System.out.println("commit conflicts " + session + " " + session.actionTimestamp); return false; } } // new actionTimestamp used for commitTimestamp session.actionTimestamp = nextChangeTimestamp(); session.transactionEndTimestamp = session.actionTimestamp; endTransaction(session); for (int i = 0; i < limit; i++) { RowAction action = (RowAction) list[i]; action.commit(session); } for (int i = 0; i < session.tempSet.size(); i++) { Session current = ((RowActionBase) session.tempSet.get(i)).session; current.abortTransaction = true; } persistCommit(session, list, limit); int newLimit = session.rowActionList.size(); if (newLimit > limit) { list = session.rowActionList.getArray(); mergeTransaction(session, list, limit, newLimit, session.actionTimestamp); finaliseRows(session, list, limit, newLimit, true); session.rowActionList.setSize(limit); } // session.actionTimestamp is the committed tx timestamp if (getFirstLiveTransactionTimestamp() > session.actionTimestamp || session == lobSession) { mergeTransaction(session, list, 0, limit, session.actionTimestamp); finaliseRows(session, list, 0, limit, true); } else { if (session.rowActionList.size() > 0) { list = session.rowActionList.toArray(); addToCommittedQueue(session, list); } } endTransactionTPL(session); // session.isTransaction = false; countDownLatches(session); } finally { writeLock.unlock(); session.tempSet.clear(); } return true; } public void rollback(Session session) { writeLock.lock(); try { session.abortTransaction = false; session.actionTimestamp = nextChangeTimestamp(); session.transactionEndTimestamp = session.actionTimestamp; rollbackPartial(session, 0, session.transactionTimestamp); endTransaction(session); endTransactionTPL(session); session.isTransaction = false; countDownLatches(session); } finally { writeLock.unlock(); } } public void rollbackSavepoint(Session session, int index) { long timestamp = session.sessionContext.savepointTimestamps.get(index); Integer oi = (Integer) session.sessionContext.savepoints.get(index); int start = oi.intValue(); while (session.sessionContext.savepoints.size() > index + 1) { session.sessionContext.savepoints.remove( session.sessionContext.savepoints.size() - 1); session.sessionContext.savepointTimestamps.removeLast(); } rollbackPartial(session, start, timestamp); } public void rollbackAction(Session session) { rollbackPartial(session, session.actionIndex, session.actionTimestamp); } /** * rollback the row actions from start index in list and * the given timestamp */ void rollbackPartial(Session session, int start, long timestamp) { Object[] list = session.rowActionList.getArray(); int limit = session.rowActionList.size(); if (start == limit) { return; } for (int i = start; i < limit; i++) { RowAction action = (RowAction) list[i]; if (action == null) { /* System.out.println("null insert action " + session + " " + session.actionTimestamp); */ throw Error.runtimeError(ErrorCode.GENERAL_ERROR, "null rollback action "); } action.rollback(session, timestamp); } // rolled back transactions can always be merged as they have never been // seen by other sessions writeLock.lock(); try { mergeRolledBackTransaction(session, timestamp, list, start, limit); finaliseRows(session, list, start, limit, false); } finally { writeLock.unlock(); } session.rowActionList.setSize(start); } public RowAction addDeleteAction(Session session, Table table, Row row, int[] colMap) { RowAction action = addDeleteActionToRow(session, table, row, colMap); Session actionSession = null; boolean redoAction = true; if (action == null) { writeLock.lock(); try { rollbackAction(session); if (session.isolationLevel == SessionInterface .TX_REPEATABLE_READ || session .isolationLevel == SessionInterface.TX_SERIALIZABLE) { session.tempSet.clear(); session.redoAction = false; session.abortTransaction = session.txConflictRollback; throw Error.error(ErrorCode.X_40501); } // can redo when conflicting action is already committed if (row.rowAction != null && row.rowAction.isDeleted()) { session.tempSet.clear(); session.redoAction = true; redoCount++; throw Error.error(ErrorCode.X_40501); } redoAction = !session.tempSet.isEmpty(); if (redoAction) { actionSession = ((RowActionBase) session.tempSet.get(0)).session; session.tempSet.clear(); if (actionSession != null) { redoAction = checkDeadlock(session, actionSession); } } if (redoAction) { session.redoAction = true; if (actionSession != null) { actionSession.waitingSessions.add(session); session.waitedSessions.add(actionSession); session.latch.countUp(); } redoCount++; } else { session.redoAction = false; session.abortTransaction = session.txConflictRollback; } throw Error.error(ErrorCode.X_40501); } finally { writeLock.unlock(); } } session.rowActionList.add(action); return action; } public void addInsertAction(Session session, Table table, PersistentStore store, Row row, int[] changedColumns) { RowAction action = row.rowAction; Session actionSession = null; boolean redoAction = false; boolean redoWait = true; HsqlException cause = null; if (action == null) { /* System.out.println("null insert action " + session + " " + session.actionTimestamp); */ throw Error.runtimeError(ErrorCode.GENERAL_ERROR, "null insert action "); } if (table.tableType == TableBase.CACHED_TABLE) { rowActionMap.put(action.getPos(), action); } try { store.indexRow(session, row); } catch (HsqlException e) { if (session.tempSet.isEmpty()) { throw e; } redoAction = true; cause = e; } if (!redoAction) { session.rowActionList.add(action); return; } writeLock.lock(); try { rollbackAction(session); RowActionBase otherAction = (RowActionBase) session.tempSet.get(0); actionSession = otherAction.session; session.tempSet.clear(); if (otherAction.commitTimestamp != 0) { redoWait = false; } switch (session.isolationLevel) { case SessionInterface.TX_REPEATABLE_READ : case SessionInterface.TX_SERIALIZABLE : redoAction = false; break; default : redoAction = checkDeadlock(session, actionSession); } if (redoAction) { session.redoAction = true; if (redoWait) { actionSession.waitingSessions.add(session); session.waitedSessions.add(actionSession); session.latch.countUp(); } redoCount++; } else { session.abortTransaction = session.txConflictRollback; session.redoAction = false; } throw Error.error(cause, ErrorCode.X_40501, null); } finally { writeLock.unlock(); } } // functional unit - accessibility of rows public boolean canRead(Session session, Row row, int mode, int[] colMap) { RowAction action = row.rowAction; if (mode == TransactionManager.ACTION_READ) { if (action == null) { return true; } return action.canRead(session, TransactionManager.ACTION_READ); } if (mode == ACTION_REF) { boolean result; if (action == null) { result = true; } else { result = action.canRead(session, TransactionManager.ACTION_READ); } return result; /* if (result) { synchronized (row) { if (row.isMemory()) { result = RowAction.addRefAction(session, row, colMap); } else { ReentrantReadWriteLock.WriteLock mapLock = rowActionMap.getWriteLock(); mapLock.lock(); try { action = row.rowAction; if (action == null) { action = (RowAction) rowActionMap.get(row.getPos()); row.rowAction = action; } result = RowAction.addRefAction(session, row, colMap); if (result && action == null) { rowActionMap.put(row.getPos(), action); } } finally { mapLock.unlock(); } } } if (result) { session.rowActionList.add(row.rowAction); } else { if (!session.tempSet.isEmpty()) { Session current = (Session) session.tempSet.get(0); session.redoAction = true; session.latch.countUp(); current.waitingSessions.add(session); session.waitedSessions.add(current); session.tempSet.clear(); throw Error.error(ErrorCode.X_40501); } } return true; } return false; */ } if (action == null) { return true; } return action.canRead(session, mode); } public boolean canRead(Session session, long id, int mode) { RowAction action = (RowAction) rowActionMap.get(id); if (action == null) { return true; } return action.canRead(session, mode); } /** * add transaction info to a row just loaded from the cache. called only * for CACHED tables */ public void setTransactionInfo(CachedObject object) { if (object.isMemory()) { return; } Row row = (Row) object; RowAction rowact = (RowAction) rowActionMap.get(row.position); row.rowAction = rowact; } /** * remove the transaction info */ public void removeTransactionInfo(CachedObject object) { if (object.isMemory()) { return; } rowActionMap.remove(object.getPos()); } /** * add a list of actions to the end of queue */ void addToCommittedQueue(Session session, Object[] list) { synchronized (committedTransactionTimestamps) { // add the txList according to commit timestamp committedTransactions.addLast(list); // get session commit timestamp committedTransactionTimestamps.addLast(session.actionTimestamp); /* debug 190 if (committedTransactions.size() > 64) { System.out.println("******* excessive transaction queue"); } // debug 190 */ } } /** * expire all committed transactions that are no longer in scope */ void mergeExpiredTransactions(Session session) { long timestamp = getFirstLiveTransactionTimestamp(); while (true) { long commitTimestamp; Object[] actions; synchronized (committedTransactionTimestamps) { if (committedTransactionTimestamps.isEmpty()) { break; } commitTimestamp = committedTransactionTimestamps.getFirst(); if (commitTimestamp < timestamp) { committedTransactionTimestamps.removeFirst(); actions = (Object[]) committedTransactions.removeFirst(); } else { break; } } mergeTransaction(session, actions, 0, actions.length, commitTimestamp); finaliseRows(session, actions, 0, actions.length, true); } } public void beginTransaction(Session session) { writeLock.lock(); try { if (!session.isTransaction) { session.actionTimestamp = nextChangeTimestamp(); session.transactionTimestamp = session.actionTimestamp; session.isTransaction = true; liveTransactionTimestamps.addLast( session.transactionTimestamp); transactionCount++; } } finally { writeLock.unlock(); } } /** * add session to the end of queue when a transaction starts * (depending on isolation mode) */ public void beginAction(Session session, Statement cs) { if (session.isTransaction) { return; } if (cs == null) { return; } writeLock.lock(); try { if (cs.getCompileTimestamp() < database.schemaManager.getSchemaChangeTimestamp()) { cs = session.statementManager.getStatement(session, cs); session.sessionContext.currentStatement = cs; if (cs == null) { return; } } session.isPreTransaction = true; if (!isLockedMode && !cs.isCatalogLock()) { return; } beginActionTPL(session, cs); } finally { writeLock.unlock(); } } /** * add session to the end of queue when a transaction starts * (depending on isolation mode) */ public void beginActionResume(Session session) { writeLock.lock(); try { session.actionTimestamp = nextChangeTimestamp(); if (!session.isTransaction) { session.transactionTimestamp = session.actionTimestamp; session.isTransaction = true; liveTransactionTimestamps.addLast(session.actionTimestamp); transactionCount++; } session.isPreTransaction = false; } finally { writeLock.unlock(); } } RowAction addDeleteActionToRow(Session session, Table table, Row row, int[] colMap) { RowAction action = null; synchronized (row) { if (table.tableType == TableBase.CACHED_TABLE) { Lock mapLock = rowActionMap.getWriteLock(); mapLock.lock(); try { /* using rowActionMap as source */ action = (RowAction) rowActionMap.get(row.getPos()); if (action == null) { action = RowAction.addDeleteAction(session, table, row, colMap); if (action != null) { rowActionMap.put(row.getPos(), action); } } else { row.rowAction = action; action = RowAction.addDeleteAction(session, table, row, colMap); } } finally { mapLock.unlock(); } } else { action = RowAction.addDeleteAction(session, table, row, colMap); } } return action; } /** * remove session from queue when a transaction ends * and expire any committed transactions * that are no longer required. remove transactions ended before the first * timestamp in liveTransactionsSession queue */ void endTransaction(Session session) { long timestamp = session.transactionTimestamp; int index = liveTransactionTimestamps.indexOf(timestamp); if (index >= 0) { transactionCount--; liveTransactionTimestamps.remove(index); mergeExpiredTransactions(session); } } private void countDownLatches(Session session) { for (int i = 0; i < session.waitingSessions.size(); i++) { Session current = (Session) session.waitingSessions.get(i); current.waitedSessions.remove(session); current.latch.countDown(); } session.waitingSessions.clear(); } void getTransactionSessions(HashSet set) { Session[] sessions = database.sessionManager.getAllSessions(); for (int i = 0; i < sessions.length; i++) { long timestamp = sessions[i].getTransactionTimestamp(); if (liveTransactionTimestamps.contains(timestamp)) { set.add(sessions[i]); } else if (sessions[i].isPreTransaction) { set.add(sessions[i]); } else if (sessions[i].isTransaction) { set.add(sessions[i]); } } } void endTransactionTPL(Session session) { if (catalogWriteSession != session) { return; } Session nextSession = null; session.waitingSessions.size(); for (int i = 0; i < session.waitingSessions.size(); i++) { Session current = (Session) session.waitingSessions.get(i); Statement st = current.sessionContext.currentStatement; if (st != null && st.isCatalogLock()) { nextSession = current; break; } } if (nextSession == null) { catalogWriteSession = null; isLockedMode = false; } else { for (int i = 0; i < session.waitingSessions.size(); i++) { Session current = (Session) session.waitingSessions.get(i); if (current != nextSession) { current.waitedSessions.add(nextSession); nextSession.waitingSessions.add(current); current.latch.countUp(); } } catalogWriteSession = nextSession; } unlockTxTs = session.actionTimestamp; unlockSessionId = session.getId(); } boolean beginActionTPL(Session session, Statement cs) { if (cs == null) { return true; } if (session.abortTransaction) { return false; } if (session == catalogWriteSession) { return true; } session.tempSet.clear(); if (cs.isCatalogLock()) { if (catalogWriteSession == null) { catalogWriteSession = session; isLockedMode = true; lockTxTs = session.actionTimestamp; lockSessionId = session.getId(); getTransactionSessions(session.tempSet); session.tempSet.remove(session); if (!session.tempSet.isEmpty()) { setWaitingSessionTPL(session); } return true; } } if (!isLockedMode) { return true; } if (cs.getTableNamesForWrite().length > 0) { if (cs.getTableNamesForWrite()[0].schema == SqlInvariants.LOBS_SCHEMA_HSQLNAME) { return true; } } else if (cs.getTableNamesForRead().length > 0) { if (cs.getTableNamesForRead()[0].schema == SqlInvariants.LOBS_SCHEMA_HSQLNAME) { return true; } } else { return true; } if (session.waitingSessions.contains(catalogWriteSession)) { return true; } if (catalogWriteSession.waitingSessions.add(session)) { session.waitedSessions.add(catalogWriteSession); session.latch.countUp(); } return true; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/dbinfo/0000755000175000017500000000000012007570422020176 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/dbinfo/DatabaseInformationMain.java0000644000175000017500000043750012007547352025577 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.dbinfo; import org.hsqldb.ColumnSchema; import org.hsqldb.Constraint; import org.hsqldb.Database; import org.hsqldb.HsqlException; import org.hsqldb.HsqlNameManager; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.NumberSequence; import org.hsqldb.Routine; import org.hsqldb.RoutineSchema; import org.hsqldb.SchemaObject; import org.hsqldb.Session; import org.hsqldb.SqlInvariants; import org.hsqldb.Table; import org.hsqldb.TableBase; import org.hsqldb.Tokens; import org.hsqldb.TypeInvariants; import org.hsqldb.index.Index; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.WrapperIterator; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.persist.PersistentStore; import org.hsqldb.rights.GrantConstants; import org.hsqldb.rights.Grantee; import org.hsqldb.rights.GranteeManager; import org.hsqldb.rights.Right; import org.hsqldb.rights.User; import org.hsqldb.store.ValuePool; import org.hsqldb.types.DateTimeType; import org.hsqldb.types.IntervalType; import org.hsqldb.types.NumberType; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /* $Id: DatabaseInformationMain.java 4837 2011-12-19 00:27:59Z fredt $ */ // fredt@users - 1.7.2 - structural modifications to allow inheritance // boucherb@users - 1.7.2 - 20020225 // - factored out all reusable code into DIXXX support classes // - completed Fred's work on allowing inheritance // boucherb@users - 1.7.2 - 20020304 - bug fixes, refinements, better java docs // fredt@users - 1.8.0 - updated to report latest enhancements and changes // boucherb@users 20051207 - patch 1.8.x initial JDBC 4.0 support work // Revision 1.9 2006/07/12 11:36:59 boucherb // - JDBC 4.0, Mustang b87: support for new DatabaseMetaData.getColumns() IS_AUTOINCREMENT result column // - minor javadoc and code comment updates /** * Provides definitions for a few of the SQL Standard Schemata views that are * supported by HSQLDB.

              * * Provides definitions for some of HSQLDB's additional system view. * * The views supported in this class are exclusively those that are needed * to build the ResultSet objects that are returned by JDBC DatabaseMetaData * calls.

              * * The definitions for the rest of SQL standard and HSQLDB specific system views * are provided by DatabaseInformationFull, which extends this class.

              * * Produces a collection of views that form the system data dictionary.

              * * Implementations use a group of arrays of equal size to store various * attributes or cached instances of system tables.

              * * Two fixed static lists of reserved table names are kept in String[] and * HsqlName[] forms. These are shared by all implementations of * DatabaseInformtion.

              * * Each implementation keeps a lookup set of names for those tables whose * contents are never cached (nonCachedTablesSet).

              * * An instance of this class uses three lists named sysTablexxxx for caching * system tables.

              * * sysTableSessionDependent indicates which tables contain data that is * dependent on the user rights of the User associatiod with the Session.

              * * sysTableSessions contains the Session with whose rights each cached table * was built.

              * * sysTables contains the cached tables.

              * * At the time of instantiation, which is part of the Database.open() method * invocation, an empty table is created and placed in sysTables with calls to * generateTable(int) for each name in sysTableNames. Some of these * table entries may be null if an implementation does not produce them.

              * * Calls to setStore(String, Session) return a cached table if various * caching rules are met (see below), or it will delete all rows of the table * and rebuild the contents via generateTable(int).

              * * generateTable(int) calls the appropriate single method for each table. * These methods either build and return an empty table (if sysTables * contains null for the table slot) or populate the table with up-to-date * rows.

              * * Rules for caching are applied as follows:

              * * If a table has non-cached contents, its contents are cleared and * rebuilt.

              * * For the rest of the tables, if the table has not been built for the Session * object or it is out of date, the table contents are cleared and rebuilt.

              * * (fredt@users)

              * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.7.2 */ class DatabaseInformationMain extends DatabaseInformation { static Type CARDINAL_NUMBER = TypeInvariants.CARDINAL_NUMBER; static Type YES_OR_NO = TypeInvariants.YES_OR_NO; static Type CHARACTER_DATA = TypeInvariants.CHARACTER_DATA; static Type SQL_IDENTIFIER = TypeInvariants.SQL_IDENTIFIER; static Type TIME_STAMP = TypeInvariants.TIME_STAMP; /** The HsqlNames of the system tables. */ protected static final HsqlName[] sysTableHsqlNames; /** true if the contents of a cached system table depends on the session */ protected static final boolean[] sysTableSessionDependent = new boolean[sysTableNames.length]; /** Set: { names of system tables that are not to be cached } */ protected static final HashSet nonCachedTablesSet; /** The table types HSQLDB supports. */ protected static final String[] tableTypes = new String[] { "GLOBAL TEMPORARY", "SYSTEM TABLE", "TABLE", "VIEW" }; /** Provides naming support. */ static { synchronized (DatabaseInformationMain.class) { nonCachedTablesSet = new HashSet(); sysTableHsqlNames = new HsqlName[sysTableNames.length]; for (int i = 0; i < sysTableNames.length; i++) { sysTableHsqlNames[i] = HsqlNameManager.newInfoSchemaTableName(sysTableNames[i]); sysTableHsqlNames[i].schema = SqlInvariants.INFORMATION_SCHEMA_HSQLNAME; sysTableSessionDependent[i] = true; } // build the set of non-cached tables nonCachedTablesSet.add("SYSTEM_CACHEINFO"); nonCachedTablesSet.add("SYSTEM_SESSIONINFO"); nonCachedTablesSet.add("SYSTEM_SESSIONS"); nonCachedTablesSet.add("SYSTEM_PROPERTIES"); nonCachedTablesSet.add("SYSTEM_SEQUENCES"); } } /** cache of system tables */ protected final Table[] sysTables = new Table[sysTableNames.length]; /** * Constructs a table producer which provides system tables * for the specified Database object.

              * * Note: before 1.7.2 Alpha N, it was important to observe that * by specifying an instance of this class or one of its descendents to * handle system table production, the new set of builtin permissions * and aliases would overwrite those of an existing database, meaning that * metadata reporting might have been rendered less secure if the same * database were then opened again using a lower numbered system table * producer instance (i.e. one in a 1.7.1 or earlier distribution). * As of 1.7.2 Alpha N, system-generated permissions and aliases are no * longer recorded in the checkpoint script, obseleting this issue. * Checkpointing of system-generated grants and aliases was removed * because their existence is very close to a core requirment for correct * operation and they are reintroduced to the system at each startup. * In a future release, it may even be an exception condition to attempt * to remove or alter system-generated grants and aliases, * respectvely.

              * * @param db the Database object for which this object * produces system tables */ DatabaseInformationMain(Database db) { super(db); Session session = db.sessionManager.getSysSession(); init(session); } protected final void addColumn(Table t, String name, Type type) { HsqlName cn; ColumnSchema c; cn = database.nameManager.newInfoSchemaColumnName(name, t.getName()); c = new ColumnSchema(cn, type, true, false, null); t.addColumn(c); } /** * Retrieves an enumeration over all of the tables in this database. * This means all user tables, views, system tables, system views, * including temporary and text tables.

              * * @return an enumeration over all of the tables in this database */ protected final Iterator allTables() { return new WrapperIterator( database.schemaManager.databaseObjectIterator(SchemaObject.TABLE), new WrapperIterator(sysTables, true)); } /** * Clears the contents of cached system tables and resets user slots * to null.

              * */ protected final void cacheClear(Session session) { int i = sysTables.length; while (i-- > 0) { Table t = sysTables[i]; if (t != null) { t.clearAllData(session); } } } /** * Retrieves the system table corresponding to the specified * tableIndex value.

              * * @param tableIndex int value identifying the system table to generate * @return the system table corresponding to the specified tableIndex value */ protected Table generateTable(Session session, PersistentStore store, int tableIndex) { // Please note that this class produces non-null tables for // just those absolutely essential to the JDBC 1 spec and the // HSQLDB core. Also, all table producing methods except // SYSTEM_PROCEDURES() and SYSTEM_PROCEDURECOLUMNS() are declared final; // this class produces only an empty table for each, as per previous // DatabaseInformation implementations, whereas // DatabaseInformationFull produces comprehensive content for // them). // // This break down of inheritance allows DatabaseInformation and // DatabaseInformationMain (this class) to be made as small as possible // while still meeting their mandates: // // 1.) DatabaseInformation prevents use of reserved system table names // for user tables and views, meaning that even under highly // constrained use cases where the notion of DatabaseMetaData can // be discarded (i.e. the engine operates in a distribution where // DatabaseInforationMain/Full and JDBCDatabaseMetaData have been // dropped from the JAR), it is still impossible to produce a // database which will be incompatible in terms of system table <=> // user table name clashes, if/when imported into a more // capable operating environment. // // 2.) DatabaseInformationMain builds on DatabaseInformation, providing // at minimum what is needed for comprehensive operation under // JDK 1.1/JDBC 1 and provides, at minimum, what was provided under // earlier implementations. // // 3.) descendents of DatabaseInformationMain (such as the current // DatabaseInformationFull) need not (and indeed: now cannot) // override most of the DatabaseInformationMain table producing // methods, as for the most part they are expected to be already // fully comprehensive, security aware and accessible to all users. switch (tableIndex) { case SYSTEM_BESTROWIDENTIFIER : return SYSTEM_BESTROWIDENTIFIER(session, store); case SYSTEM_COLUMNS : return SYSTEM_COLUMNS(session, store); case SYSTEM_CONNECTION_PROPERTIES : return SYSTEM_CONNECTION_PROPERTIES(session, store); case SYSTEM_CROSSREFERENCE : return SYSTEM_CROSSREFERENCE(session, store); case SYSTEM_INDEXINFO : return SYSTEM_INDEXINFO(session, store); case SYSTEM_PRIMARYKEYS : return SYSTEM_PRIMARYKEYS(session, store); case SYSTEM_PROCEDURECOLUMNS : return SYSTEM_PROCEDURECOLUMNS(session, store); case SYSTEM_PROCEDURES : return SYSTEM_PROCEDURES(session, store); case SYSTEM_SCHEMAS : return SYSTEM_SCHEMAS(session, store); case SYSTEM_SEQUENCES : return SYSTEM_SEQUENCES(session, store); case SYSTEM_TABLES : return SYSTEM_TABLES(session, store); case SYSTEM_TABLETYPES : return SYSTEM_TABLETYPES(session, store); case SYSTEM_TYPEINFO : return SYSTEM_TYPEINFO(session, store); case SYSTEM_USERS : return SYSTEM_USERS(session, store); case SYSTEM_UDTS : return SYSTEM_UDTS(session, store); case SYSTEM_VERSIONCOLUMNS : return SYSTEM_VERSIONCOLUMNS(session, store); case COLUMN_PRIVILEGES : return COLUMN_PRIVILEGES(session, store); case SEQUENCES : return SEQUENCES(session, store); case TABLE_PRIVILEGES : return TABLE_PRIVILEGES(session, store); case INFORMATION_SCHEMA_CATALOG_NAME : return INFORMATION_SCHEMA_CATALOG_NAME(session, store); default : return null; } } /** * One time initialisation of instance attributes * at construction time.

              * */ protected final void init(Session session) { // flag the Session-dependent cached tables Table t; for (int i = 0; i < sysTables.length; i++) { t = sysTables[i] = generateTable(session, null, i); if (t != null) { t.setDataReadOnly(true); } } GranteeManager gm = database.getGranteeManager(); Right right = new Right(); right.set(GrantConstants.SELECT, null); for (int i = 0; i < sysTableHsqlNames.length; i++) { if (sysTables[i] != null) { gm.grantSystemToPublic(sysTables[i], right); } } right = Right.fullRights; gm.grantSystemToPublic(TypeInvariants.YES_OR_NO, right); gm.grantSystemToPublic(TypeInvariants.TIME_STAMP, right); gm.grantSystemToPublic(TypeInvariants.CARDINAL_NUMBER, right); gm.grantSystemToPublic(TypeInvariants.CHARACTER_DATA, right); gm.grantSystemToPublic(TypeInvariants.SQL_CHARACTER, right); gm.grantSystemToPublic(TypeInvariants.SQL_IDENTIFIER_CHARSET, right); gm.grantSystemToPublic(TypeInvariants.SQL_IDENTIFIER, right); gm.grantSystemToPublic(TypeInvariants.SQL_TEXT, right); } /** * Retrieves whether any form of SQL access is allowed against the * the specified table w.r.t the database access rights * assigned to current Session object's User.

              * * @return true if the table is accessible, else false * @param table the table for which to check accessibility */ protected final boolean isAccessibleTable(Session session, Table table) { return session.getGrantee().isAccessible(table); } /** * Creates a new primoidal system table with the specified name.

              * * @return a new system table * @param name of the table */ protected final Table createBlankTable(HsqlName name) { Table table = new Table(database, name, TableBase.INFO_SCHEMA_TABLE); return table; } /** * Retrieves the system Table object corresponding to * the given name and session arguments.

              * * @param session the Session object requesting the table * @param name a String identifying the desired table * database access error occurs * @return a system table corresponding to the name and * session arguments */ public final Table getSystemTable(Session session, String name) { Table t; int tableIndex; if (!isSystemTable(name)) { return null; } tableIndex = getSysTableID(name); t = sysTables[tableIndex]; // fredt - any system table that is not supported will be null here if (t == null) { return t; } // At the time of opening the database, no content is needed. // However, table structure is required at this // point to allow processing logged View defn's against system // tables if (!withContent) { return t; } return t; } public boolean isNonCachedTable(String name) { return nonCachedTablesSet.contains(name); } public final void setStore(Session session, Table table, PersistentStore store) { long dbscts = database.schemaManager.getSchemaChangeTimestamp(); if (store.getTimestamp() == dbscts && !isNonCachedTable(table.getName().name)) { return; } // fredt - clear the contents of table and generate store.removeAll(); store.setTimestamp(dbscts); int tableIndex = getSysTableID(table.getName().name); generateTable(session, store, tableIndex); } /** * Retrieves a Table object describing the optimal * set of visible columns that uniquely identifies a row * for each accessible table defined within this database.

              * * Each row describes a single column of the best row indentifier column * set for a particular table. Each row has the following * columns:

              * *

                   * SCOPE          SMALLINT  scope of applicability
                   * COLUMN_NAME    VARCHAR   simple name of the column
                   * DATA_TYPE      SMALLINT  SQL data type from Types
                   * TYPE_NAME      VARCHAR   canonical type name
                   * COLUMN_SIZE    INTEGER   precision
                   * BUFFER_LENGTH  INTEGER   transfer size in bytes, if definitely known
                   * DECIMAL_DIGITS SMALLINT  scale  - fixed # of decimal digits
                   * PSEUDO_COLUMN  SMALLINT  is this a pseudo column like an Oracle ROWID?
                   * TABLE_CAT      VARCHAR   table catalog
                   * TABLE_SCHEM    VARCHAR   simple name of table schema
                   * TABLE_NAME     VARCHAR   simple table name
                   * NULLABLE       SMALLINT  is column nullable?
                   * IN_KEY         BOOLEAN   column belongs to a primary or alternate key?
                   * 

              * * Notes:

              * * JDBCDatabaseMetaData.getBestRowIdentifier uses its * nullable parameter to filter the rows of this table in the following * manner:

              * * If the nullable parameter is false, then rows are reported * only if, in addition to satisfying the other specified filter values, * the IN_KEY column value is TRUE. If the nullable parameter is * true, then the IN_KEY column value is ignored.

              * * There is not yet infrastructure in place to make some of the ranking * descisions described below, and it is anticipated that mechanisms * upon which cost descisions could be based will change significantly over * the next few releases. Hence, in the interest of simplicity and of not * making overly complex dependency on features that will almost certainly * change significantly in the near future, the current implementation, * while perfectly adequate for all but the most demanding or exacting * purposes, is actually sub-optimal in the strictest sense.

              * * A description of the current implementation follows:

              * * DEFINTIONS:

              * * Alternate key

              * *

                *
              • An attribute of a table that, by virtue of its having a set of * columns that are both the full set of columns participating in a * unique constraint or index and are all not null, yeilds the same * selectability characteristic that would obtained by declaring a * primary key on those same columns. *

              * * Column set performance ranking

              * *

                *
              • The ranking of the expected average performance w.r.t a subset of * a table's columns used to select and/or compare rows, as taken in * relation to all other distinct candidate subsets under * consideration. This can be estimated by comparing each cadidate * subset in terms of total column count, relative peformance of * comparisons amongst the domains of the columns and differences * in other costs involved in the execution plans generated using * each subset under consideration for row selection/comparison. *

              * * * Rules:

              * * Given the above definitions, the rules currently in effect for reporting * best row identifier are as follows, in order of precedence:

              * *

                *
              1. if the table under consideration has a primary key contraint, then * the columns of the primary key are reported, with no consideration * given to the column set performance ranking over the set of * candidate keys. Each row has its IN_KEY column set to TRUE. * *
              2. if 1.) does not hold, then if there exits one or more alternate * keys, then the columns of the alternate key with the lowest column * count are reported, with no consideration given to the column set * performance ranking over the set of candidate keys. If there * exists a tie for lowest column count, then the columns of the * first such key encountered are reported. * Each row has its IN_KEY column set to TRUE. * *
              3. if both 1.) and 2.) do not hold, then, if possible, a unique * contraint/index is selected from the set of unique * contraints/indices containing at least one column having * a not null constraint, with no consideration given to the * column set performance ranking over the set of all such * candidate column sets. If there exists a tie for lowest non-zero * count of columns having a not null constraint, then the columns * of the first such encountered candidate set are reported. Each * row has its IN_KEY column set to FALSE.

                * *

              4. Finally, if the set of candidate column sets in 3.) is the empty, * then no column set is reported for the table under consideration. *

              * * The scope reported for a best row identifier column set is determined * thus:

              * *

                *
              1. if the database containing the table under consideration is in * read-only mode or the table under consideration is GLOBAL TEMPORARY * (a TEMP or TEMP TEXT table, in HSQLDB parlance), then the scope * is reported as * java.sql.DatabaseMetaData.bestRowSession. * *
              2. if 1.) does not hold, then the scope is reported as * java.sql.DatabaseMetaData.bestRowTemporary. *

              * * @return a Table object describing the optimal * set of visible columns that uniquely identifies a row * for each accessible table defined within this database */ final Table SYSTEM_BESTROWIDENTIFIER(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_BESTROWIDENTIFIER]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_BESTROWIDENTIFIER]); addColumn(t, "SCOPE", Type.SQL_SMALLINT); // not null addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); // not null addColumn(t, "DATA_TYPE", Type.SQL_SMALLINT); // not null addColumn(t, "TYPE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_SIZE", Type.SQL_INTEGER); addColumn(t, "BUFFER_LENGTH", Type.SQL_INTEGER); addColumn(t, "DECIMAL_DIGITS", Type.SQL_SMALLINT); addColumn(t, "PSEUDO_COLUMN", Type.SQL_SMALLINT); // not null addColumn(t, "TABLE_CAT", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEM", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "NULLABLE", Type.SQL_SMALLINT); // not null addColumn(t, "IN_KEY", Type.SQL_BOOLEAN); // not null // order: SCOPE // for unique: TABLE_CAT, TABLE_SCHEM, TABLE_NAME, COLUMN_NAME // false PK, as TABLE_CAT and/or TABLE_SCHEM may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_BESTROWIDENTIFIER].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 8, 9, 10, 1 }, false); return t; } // calculated column values Integer scope; // { temp, transaction, session } Integer pseudo; //------------------------------------------- // required for restriction of results via // DatabaseMetaData filter parameters, but // not actually required to be included in // DatabaseMetaData.getBestRowIdentifier() // result set //------------------------------------------- String tableCatalog; // table calalog String tableSchema; // table schema String tableName; // table name Boolean inKey; // column participates in PK or AK? //------------------------------------------- /** * @todo - Maybe include: - backing index (constraint) name? * - column sequence in index (constraint)? */ //------------------------------------------- // Intermediate holders Iterator tables; Table table; DITableInfo ti; int[] cols; Object[] row; HsqlProperties p; // Column number mappings final int iscope = 0; final int icolumn_name = 1; final int idata_type = 2; final int itype_name = 3; final int icolumn_size = 4; final int ibuffer_length = 5; final int idecimal_digits = 6; final int ipseudo_column = 7; final int itable_cat = 8; final int itable_schem = 9; final int itable_name = 10; final int inullable = 11; final int iinKey = 12; // Initialization ti = new DITableInfo(); tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); boolean translateTTI = database.sqlTranslateTTI; // Do it. while (tables.hasNext()) { table = (Table) tables.next(); /** @todo - requires access to the actual columns */ if (table.isView() || !isAccessibleTable(session, table)) { continue; } cols = table.getBestRowIdentifiers(); if (cols == null) { continue; } ti.setTable(table); inKey = ValuePool.getBoolean(table.isBestRowIdentifiersStrict()); tableCatalog = table.getCatalogName().name; tableSchema = table.getSchemaName().name; tableName = table.getName().name; Type[] types = table.getColumnTypes(); scope = ti.getBRIScope(); pseudo = ti.getBRIPseudo(); for (int i = 0; i < cols.length; i++) { ColumnSchema column = table.getColumn(i); Type type = types[i]; if (translateTTI) { if (type.isIntervalType()) { type = ((IntervalType) type).getCharacterType(); } else if (type.isDateTimeTypeWithZone()) { type = ((DateTimeType) type) .getDateTimeTypeWithoutZone(); } } row = t.getEmptyRowData(); row[iscope] = scope; row[icolumn_name] = column.getName().name; row[idata_type] = ValuePool.getInt(type.getJDBCTypeCode()); row[itype_name] = type.getNameString(); row[icolumn_size] = ValuePool.getInt(type.getJDBCPrecision()); row[ibuffer_length] = null; row[idecimal_digits] = type.acceptsScale() ? ValuePool.getInt(type.getJDBCScale()) : null; row[ipseudo_column] = pseudo; row[itable_cat] = tableCatalog; row[itable_schem] = tableSchema; row[itable_name] = tableName; row[inullable] = ValuePool.getInt(column.getNullability()); row[iinKey] = inKey; t.insertSys(session, store, row); } } return t; } /** * Retrieves a Table object describing the * visible columns of all accessible tables defined * within this database.

              * * Each row is a column description with the following columns:

              * *

                   * TABLE_CAT         VARCHAR   table catalog
                   * TABLE_SCHEM       VARCHAR   table schema
                   * TABLE_NAME        VARCHAR   table name
                   * COLUMN_NAME       VARCHAR   column name
                   * DATA_TYPE         SMALLINT  SQL type from DITypes
                   * TYPE_NAME         VARCHAR   canonical type name
                   * COLUMN_SIZE       INTEGER   column size (length/precision)
                   * BUFFER_LENGTH     INTEGER   transfer size in bytes, if definitely known
                   * DECIMAL_DIGITS    INTEGER   # of fractional digits (scale)
                   * NUM_PREC_RADIX    INTEGER   Radix
                   * NULLABLE          INTEGER   is NULL allowed? (from DatabaseMetaData)
                   * REMARKS           VARCHAR   comment describing column
                   * COLUMN_DEF        VARCHAR   default value (possibly expression) for the
                   *                             column, which should be interpreted as a
                   *                             string when the value is enclosed in quotes
                   *                             (may be null)
                   * SQL_DATA_TYPE     VARCHAR   type code as expected in the SQL CLI SQLDA
                   * SQL_DATETIME_SUB  INTEGER   the SQL CLI subtype for DATETIME types
                   * CHAR_OCTET_LENGTH INTEGER   for char types, max # of chars/bytes in column
                   * ORDINAL_POSITION  INTEGER   1-based index of column in table
                   * IS_NULLABLE       VARCHAR   is column nullable? ("YES"|"NO"|""}
                   * SCOPE_CATLOG      VARCHAR   catalog of REF attribute scope table
                   * SCOPE_SCHEMA      VARCHAR   schema of REF attribute scope table
                   * SCOPE_TABLE       VARCHAR   name of REF attribute scope table
                   * SOURCE_DATA_TYPE  VARCHAR   source type of REF attribute
                   * TYPE_SUB          INTEGER   HSQLDB data subtype code
                   * 

              * * @return a Table object describing the * visible columns of all accessible * tables defined within this database.

              */ final Table SYSTEM_COLUMNS(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_COLUMNS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_COLUMNS]); addColumn(t, "TABLE_CAT", SQL_IDENTIFIER); // 0 addColumn(t, "TABLE_SCHEM", SQL_IDENTIFIER); // 1 addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); // not null addColumn(t, "DATA_TYPE", Type.SQL_SMALLINT); // not null addColumn(t, "TYPE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_SIZE", Type.SQL_INTEGER); // 6 addColumn(t, "BUFFER_LENGTH", Type.SQL_INTEGER); // 7 addColumn(t, "DECIMAL_DIGITS", Type.SQL_INTEGER); // 8 addColumn(t, "NUM_PREC_RADIX", Type.SQL_INTEGER); // 9 addColumn(t, "NULLABLE", Type.SQL_INTEGER); // not null addColumn(t, "REMARKS", CHARACTER_DATA); // 11 addColumn(t, "COLUMN_DEF", CHARACTER_DATA); // 12 addColumn(t, "SQL_DATA_TYPE", Type.SQL_INTEGER); // 13 addColumn(t, "SQL_DATETIME_SUB", Type.SQL_INTEGER); // 14 addColumn(t, "CHAR_OCTET_LENGTH", Type.SQL_INTEGER); // 15 addColumn(t, "ORDINAL_POSITION", Type.SQL_INTEGER); // not null addColumn(t, "IS_NULLABLE", YES_OR_NO); // not null addColumn(t, "SCOPE_CATALOG", SQL_IDENTIFIER); // 18 addColumn(t, "SCOPE_SCHEMA", SQL_IDENTIFIER); // 19 addColumn(t, "SCOPE_TABLE", SQL_IDENTIFIER); // 20 addColumn(t, "SOURCE_DATA_TYPE", SQL_IDENTIFIER); // 21 // ---------------------------------------------------------------- // JDBC 4.0 - added Mustang b86 // ---------------------------------------------------------------- addColumn(t, "IS_AUTOINCREMENT", YES_OR_NO); // 22 // ---------------------------------------------------------------- // JDBC 4.1 // ---------------------------------------------------------------- addColumn(t, "IS_GENERATEDCOLUMN", YES_OR_NO); // 23 // order: TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION // added for unique: TABLE_CAT // false PK, as TABLE_SCHEM and/or TABLE_CAT may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_COLUMNS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 16 }, false); return t; } // calculated column values String tableCatalog; String tableSchema; String tableName; // intermediate holders int columnCount; Iterator tables; Table table; Object[] row; DITableInfo ti; // column number mappings final int itable_cat = 0; final int itable_schem = 1; final int itable_name = 2; final int icolumn_name = 3; final int idata_type = 4; final int itype_name = 5; final int icolumn_size = 6; final int ibuffer_length = 7; final int idecimal_digits = 8; final int inum_prec_radix = 9; final int inullable = 10; final int iremark = 11; final int icolumn_def = 12; final int isql_data_type = 13; final int isql_datetime_sub = 14; final int ichar_octet_length = 15; final int iordinal_position = 16; final int iis_nullable = 17; final int iscope_cat = 18; final int iscope_schem = 19; final int iscope_table = 20; final int isource_data_type = 21; // JDBC 4.0 final int iis_autoinc = 22; // JDBC 4.1 final int iis_generated = 23; // Initialization tables = allTables(); ti = new DITableInfo(); boolean translateTTI = database.sqlTranslateTTI; // Do it. while (tables.hasNext()) { table = (Table) tables.next(); /** @todo - requires access to the actual columns */ if (!isAccessibleTable(session, table)) { continue; } ti.setTable(table); tableCatalog = table.getCatalogName().name; tableSchema = table.getSchemaName().name; tableName = table.getName().name; columnCount = table.getColumnCount(); for (int i = 0; i < columnCount; i++) { ColumnSchema column = table.getColumn(i); Type type = column.getDataType(); if (translateTTI) { if (type.isIntervalType()) { type = ((IntervalType) type).getCharacterType(); } else if (type.isDateTimeTypeWithZone()) { type = ((DateTimeType) type) .getDateTimeTypeWithoutZone(); } } row = t.getEmptyRowData(); // row[itable_cat] = tableCatalog; row[itable_schem] = tableSchema; row[itable_name] = tableName; row[icolumn_name] = column.getName().name; row[idata_type] = ValuePool.getInt(type.getJDBCTypeCode()); row[itype_name] = type.getNameString(); row[icolumn_size] = ValuePool.INTEGER_0; row[ichar_octet_length] = ValuePool.INTEGER_0; if (type.isArrayType()) { row[itype_name] = type.getDefinition(); } if (type.isCharacterType()) { row[icolumn_size] = ValuePool.getInt(type.getJDBCPrecision()); // this is length not octet_length, for character columns row[ichar_octet_length] = ValuePool.getInt(type.getJDBCPrecision()); } if (type.isBinaryType()) { row[icolumn_size] = ValuePool.getInt(type.getJDBCPrecision()); row[ichar_octet_length] = ValuePool.getInt(type.getJDBCPrecision()); } if (type.isNumberType()) { row[icolumn_size] = ValuePool.getInt( ((NumberType) type).getNumericPrecisionInRadix()); row[inum_prec_radix] = ValuePool.getInt(type.getPrecisionRadix()); if (type.isExactNumberType()) { row[idecimal_digits] = ValuePool.getLong(type.scale); } } if (type.isDateTimeType()) { int size = (int) column.getDataType().displaySize(); row[icolumn_size] = ValuePool.getInt(size); row[isql_datetime_sub] = ValuePool.getInt( ((DateTimeType) type).getSqlDateTimeSub()); } row[inullable] = ValuePool.getInt(column.getNullability()); row[iremark] = ti.getColRemarks(i); row[icolumn_def] = column.getDefaultSQL(); row[isql_data_type] = ValuePool.getInt(type.typeCode); row[iordinal_position] = ValuePool.getInt(i + 1); row[iis_nullable] = column.isNullable() ? "YES" : "NO"; if (type.isDistinctType()) { row[isource_data_type] = type.getName().getSchemaQualifiedStatementName(); } // JDBC 4.0 row[iis_autoinc] = column.isIdentity() ? "YES" : "NO"; row[iis_generated] = column.isGenerated() ? "YES" : "NO"; t.insertSys(session, store, row); } } return t; } /** * Retrieves a Table object describing, for each * accessible referencing and referenced table, how the referencing * tables import, for the purposes of referential integrity, * the columns of the referenced tables.

              * * Each row is a foreign key column description with the following * columns:

              * *

                   * PKTABLE_CAT   VARCHAR   referenced table catalog
                   * PKTABLE_SCHEM VARCHAR   referenced table schema
                   * PKTABLE_NAME  VARCHAR   referenced table name
                   * PKCOLUMN_NAME VARCHAR   referenced column name
                   * FKTABLE_CAT   VARCHAR   referencing table catalog
                   * FKTABLE_SCHEM VARCHAR   referencing table schema
                   * FKTABLE_NAME  VARCHAR   referencing table name
                   * FKCOLUMN_NAME VARCHAR   referencing column
                   * KEY_SEQ       SMALLINT  sequence number within foreign key
                   * UPDATE_RULE   SMALLINT
                   *    { Cascade | Set Null | Set Default | Restrict (No Action)}?
                   * DELETE_RULE   SMALLINT
                   *    { Cascade | Set Null | Set Default | Restrict (No Action)}?
                   * FK_NAME       VARCHAR   foreign key constraint name
                   * PK_NAME       VARCHAR   primary key or unique constraint name
                   * DEFERRABILITY SMALLINT
                   *    { initially deferred | initially immediate | not deferrable }
                   * 

              * * @return a Table object describing how accessible tables * import other accessible tables' primary key and/or unique * constraint columns */ final Table SYSTEM_CROSSREFERENCE(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_CROSSREFERENCE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_CROSSREFERENCE]); addColumn(t, "PKTABLE_CAT", SQL_IDENTIFIER); addColumn(t, "PKTABLE_SCHEM", SQL_IDENTIFIER); addColumn(t, "PKTABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "PKCOLUMN_NAME", SQL_IDENTIFIER); // not null addColumn(t, "FKTABLE_CAT", SQL_IDENTIFIER); addColumn(t, "FKTABLE_SCHEM", SQL_IDENTIFIER); addColumn(t, "FKTABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "FKCOLUMN_NAME", SQL_IDENTIFIER); // not null addColumn(t, "KEY_SEQ", Type.SQL_SMALLINT); // not null addColumn(t, "UPDATE_RULE", Type.SQL_SMALLINT); // not null addColumn(t, "DELETE_RULE", Type.SQL_SMALLINT); // not null addColumn(t, "FK_NAME", SQL_IDENTIFIER); addColumn(t, "PK_NAME", SQL_IDENTIFIER); addColumn(t, "DEFERRABILITY", Type.SQL_SMALLINT); // not null // order: FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, and KEY_SEQ // added for unique: FK_NAME // false PK, as FKTABLE_CAT, FKTABLE_SCHEM and/or FK_NAME // may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_CROSSREFERENCE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 4, 5, 6, 8, 11 }, false); return t; } // calculated column values String pkTableCatalog; String pkTableSchema; String pkTableName; String pkColumnName; String fkTableCatalog; String fkTableSchema; String fkTableName; String fkColumnName; Integer keySequence; Integer updateRule; Integer deleteRule; String fkName; String pkName; Integer deferrability; // Intermediate holders Iterator tables; Table table; Table fkTable; Table pkTable; int columnCount; int[] mainCols; int[] refCols; Constraint[] constraints; Constraint constraint; int constraintCount; HsqlArrayList fkConstraintsList; Object[] row; // column number mappings final int ipk_table_cat = 0; final int ipk_table_schem = 1; final int ipk_table_name = 2; final int ipk_column_name = 3; final int ifk_table_cat = 4; final int ifk_table_schem = 5; final int ifk_table_name = 6; final int ifk_column_name = 7; final int ikey_seq = 8; final int iupdate_rule = 9; final int idelete_rule = 10; final int ifk_name = 11; final int ipk_name = 12; final int ideferrability = 13; tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); // We must consider all the constraints in all the user tables, since // this is where reference relationships are recorded. However, we // are only concerned with Constraint.FOREIGN_KEY constraints here // because their corresponing Constraint.MAIN entries are essentially // duplicate data recorded in the referenced rather than the // referencing table. Also, we skip constraints where either // the referenced, referencing or both tables are not accessible // relative to the session of the calling context fkConstraintsList = new HsqlArrayList(); while (tables.hasNext()) { table = (Table) tables.next(); if (table.isView() || !isAccessibleTable(session, table)) { continue; } constraints = table.getConstraints(); constraintCount = constraints.length; for (int i = 0; i < constraintCount; i++) { constraint = (Constraint) constraints[i]; if (constraint.getConstraintType() == SchemaObject .ConstraintTypes .FOREIGN_KEY && isAccessibleTable(session, constraint .getRef())) { fkConstraintsList.add(constraint); } } } // Now that we have all of the desired constraints, we need to // process them, generating one row in our ouput table for each // imported/exported column pair of each constraint. // Do it. for (int i = 0; i < fkConstraintsList.size(); i++) { constraint = (Constraint) fkConstraintsList.get(i); pkTable = constraint.getMain(); pkTableName = pkTable.getName().name; fkTable = constraint.getRef(); fkTableName = fkTable.getName().name; pkTableCatalog = pkTable.getCatalogName().name; pkTableSchema = pkTable.getSchemaName().name; fkTableCatalog = fkTable.getCatalogName().name; fkTableSchema = fkTable.getSchemaName().name; mainCols = constraint.getMainColumns(); refCols = constraint.getRefColumns(); columnCount = refCols.length; fkName = constraint.getRefName().name; pkName = constraint.getUniqueName().name; deferrability = ValuePool.getInt(constraint.getDeferability()); //pkName = constraint.getMainIndex().getName().name; deleteRule = ValuePool.getInt(constraint.getDeleteAction()); updateRule = ValuePool.getInt(constraint.getUpdateAction()); for (int j = 0; j < columnCount; j++) { keySequence = ValuePool.getInt(j + 1); pkColumnName = pkTable.getColumn(mainCols[j]).getNameString(); fkColumnName = fkTable.getColumn(refCols[j]).getNameString(); row = t.getEmptyRowData(); row[ipk_table_cat] = pkTableCatalog; row[ipk_table_schem] = pkTableSchema; row[ipk_table_name] = pkTableName; row[ipk_column_name] = pkColumnName; row[ifk_table_cat] = fkTableCatalog; row[ifk_table_schem] = fkTableSchema; row[ifk_table_name] = fkTableName; row[ifk_column_name] = fkColumnName; row[ikey_seq] = keySequence; row[iupdate_rule] = updateRule; row[idelete_rule] = deleteRule; row[ifk_name] = fkName; row[ipk_name] = pkName; row[ideferrability] = deferrability; t.insertSys(session, store, row); } } return t; } /** * Retrieves a Table object describing the visible * Index objects for each accessible table defined * within this database.

              * * Each row is an index column description with the following * columns:

              * *

                   * TABLE_CAT        VARCHAR   table's catalog
                   * TABLE_SCHEM      VARCHAR   simple name of table's schema
                   * TABLE_NAME       VARCHAR   simple name of the table using the index
                   * NON_UNIQUE       BOOLEAN   can index values be non-unique?
                   * INDEX_QUALIFIER  VARCHAR   catalog in which the index is defined
                   * INDEX_NAME       VARCHAR   simple name of the index
                   * TYPE             SMALLINT  index type: { Clustered | Hashed | Other }
                   * ORDINAL_POSITION SMALLINT  column sequence number within index
                   * COLUMN_NAME      VARCHAR   simple column name
                   * ASC_OR_DESC      VARCHAR   col. sort sequence: {"A" (Asc) | "D" (Desc)}
                   * CARDINALITY      INTEGER   # of unique values in index (not implemented)
                   * PAGES            INTEGER   index page use (not implemented)
                   * FILTER_CONDITION VARCHAR   filter condition, if any (not implemented)
                   * // HSQLDB-extension
                   * ROW_CARDINALITY  INTEGER   total # of rows in index (not implemented)
                   * 

              * * @return a Table object describing the visible * Index objects for each accessible * table defined within this database. */ final Table SYSTEM_INDEXINFO(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_INDEXINFO]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_INDEXINFO]); // JDBC addColumn(t, "TABLE_CAT", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEM", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // NOT NULL addColumn(t, "NON_UNIQUE", Type.SQL_BOOLEAN); // NOT NULL addColumn(t, "INDEX_QUALIFIER", SQL_IDENTIFIER); addColumn(t, "INDEX_NAME", SQL_IDENTIFIER); addColumn(t, "TYPE", Type.SQL_SMALLINT); // NOT NULL addColumn(t, "ORDINAL_POSITION", Type.SQL_SMALLINT); // NOT NULL addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); addColumn(t, "ASC_OR_DESC", CHARACTER_DATA); addColumn(t, "CARDINALITY", Type.SQL_INTEGER); addColumn(t, "PAGES", Type.SQL_INTEGER); addColumn(t, "FILTER_CONDITION", CHARACTER_DATA); // HSQLDB extension addColumn(t, "ROW_CARDINALITY", Type.SQL_INTEGER); // order: NON_UNIQUE, TYPE, INDEX_NAME, and ORDINAL_POSITION. // added for unique: INDEX_QUALIFIER, TABLE_NAME // false PK, as INDEX_QUALIFIER may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_INDEXINFO].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5, 7 }, false); return t; } // calculated column values String tableCatalog; String tableSchema; String tableName; Boolean nonUnique; String indexQualifier; String indexName; Integer indexType; //Integer ordinalPosition; //String columnName; //String ascOrDesc; Integer cardinality; Integer pages; String filterCondition; Integer rowCardinality; // Intermediate holders Iterator tables; Table table; int indexCount; int[] cols; int col; int colCount; Object[] row; // column number mappings final int itable_cat = 0; final int itable_schem = 1; final int itable_name = 2; final int inon_unique = 3; final int iindex_qualifier = 4; final int iindex_name = 5; final int itype = 6; final int iordinal_position = 7; final int icolumn_name = 8; final int iasc_or_desc = 9; final int icardinality = 10; final int ipages = 11; final int ifilter_condition = 12; final int irow_cardinality = 13; // Initialization tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); // Do it. while (tables.hasNext()) { table = (Table) tables.next(); if (table.isView() || !isAccessibleTable(session, table)) { continue; } tableCatalog = table.getCatalogName().name; tableSchema = table.getSchemaName().name; tableName = table.getName().name; // not supported yet filterCondition = null; // different cat for index not supported yet indexQualifier = tableCatalog; indexCount = table.getIndexCount(); // process all of the visible indices for this table for (int i = 0; i < indexCount; i++) { Index index = table.getIndex(i); colCount = table.getIndex(i).getColumnCount(); if (colCount < 1) { continue; } indexName = index.getName().name; nonUnique = index.isUnique() ? Boolean.FALSE : Boolean.TRUE; cardinality = null; pages = ValuePool.INTEGER_0; rowCardinality = null; cols = index.getColumns(); indexType = ValuePool.getInt(3); for (int k = 0; k < colCount; k++) { col = cols[k]; row = t.getEmptyRowData(); row[itable_cat] = tableCatalog; row[itable_schem] = tableSchema; row[itable_name] = tableName; row[inon_unique] = nonUnique; row[iindex_qualifier] = indexQualifier; row[iindex_name] = indexName; row[itype] = indexType; row[iordinal_position] = ValuePool.getInt(k + 1); row[icolumn_name] = table.getColumn(cols[k]).getName().name; row[iasc_or_desc] = "A"; row[icardinality] = cardinality; row[ipages] = pages; row[irow_cardinality] = rowCardinality; row[ifilter_condition] = filterCondition; t.insertSys(session, store, row); } } } return t; } /** * Retrieves a Table object describing the visible * primary key columns of each accessible table defined within * this database.

              * * Each row is a PRIMARY KEY column description with the following * columns:

              * *

                   * TABLE_CAT   VARCHAR   table catalog
                   * TABLE_SCHEM VARCHAR   table schema
                   * TABLE_NAME  VARCHAR   table name
                   * COLUMN_NAME VARCHAR   column name
                   * KEY_SEQ     SMALLINT  sequence number within primary key
                   * PK_NAME     VARCHAR   primary key constraint name
                   * 

              * * @return a Table object describing the visible * primary key columns of each accessible table * defined within this database. */ final Table SYSTEM_PRIMARYKEYS(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_PRIMARYKEYS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_PRIMARYKEYS]); addColumn(t, "TABLE_CAT", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEM", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); // not null addColumn(t, "KEY_SEQ", Type.SQL_SMALLINT); // not null addColumn(t, "PK_NAME", SQL_IDENTIFIER); // order: COLUMN_NAME // added for unique: TABLE_NAME, TABLE_SCHEM, TABLE_CAT // false PK, as TABLE_SCHEM and/or TABLE_CAT may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_PRIMARYKEYS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 3, 2, 1, 0 }, false); return t; } // calculated column values String tableCatalog; String tableSchema; String tableName; //String columnName; //Integer keySequence; String primaryKeyName; // Intermediate holders Iterator tables; Table table; Object[] row; Constraint constraint; int[] cols; int colCount; HsqlProperties p; // column number mappings final int itable_cat = 0; final int itable_schem = 1; final int itable_name = 2; final int icolumn_name = 3; final int ikey_seq = 4; final int ipk_name = 5; // Initialization p = database.getProperties(); tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); while (tables.hasNext()) { table = (Table) tables.next(); if (table.isView() || !isAccessibleTable(session, table) || !table.hasPrimaryKey()) { continue; } constraint = table.getPrimaryConstraint(); tableCatalog = table.getCatalogName().name; tableSchema = table.getSchemaName().name; tableName = table.getName().name; primaryKeyName = constraint.getName().name; cols = constraint.getMainColumns(); colCount = cols.length; for (int j = 0; j < colCount; j++) { row = t.getEmptyRowData(); row[itable_cat] = tableCatalog; row[itable_schem] = tableSchema; row[itable_name] = tableName; row[icolumn_name] = table.getColumn(cols[j]).getName().name; row[ikey_seq] = ValuePool.getInt(j + 1); row[ipk_name] = primaryKeyName; t.insertSys(session, store, row); } } return t; } /** * Retrieves a Table object describing the * return, parameter and result columns of the accessible * routines defined within this database.

              * * Each row is a procedure column description with the following * columns:

              * *

                   * PROCEDURE_CAT   VARCHAR   routine catalog
                   * PROCEDURE_SCHEM VARCHAR   routine schema
                   * PROCEDURE_NAME  VARCHAR   routine name
                   * COLUMN_NAME     VARCHAR   column/parameter name
                   * COLUMN_TYPE     SMALLINT  kind of column/parameter
                   * DATA_TYPE       SMALLINT  SQL type from DITypes
                   * TYPE_NAME       VARCHAR   SQL type name
                   * PRECISION       INTEGER   precision (length) of type
                   * LENGTH          INTEGER   transfer size, in bytes, if definitely known
                   *                           (roughly equivalent to BUFFER_SIZE for table
                   *                           columns)
                   * SCALE           SMALLINT  scale
                   * RADIX           SMALLINT  radix
                   * NULLABLE        SMALLINT  can column contain NULL?
                   * REMARKS         VARCHAR   explanatory comment on column
                   * // JDBC 4.0
                   * COLUMN_DEF        VARCHAR The default column value.
                   *                           The string NULL (not enclosed in quotes)
                   *                           - If NULL was specified as the default value
                   *                           TRUNCATE (not enclosed in quotes)
                   *                           - If the specified default value cannot be
                   *                           represented without truncation
                   *                           NULL
                   *                           - If a default value was not specified
                   * SQL_DATA_TYPE     INTEGER CLI type list from SQL 2003 Table 37,
                   *                           tables 6-9 Annex A1, and/or addendums in other
                   *                           documents, such as:
                   *                           SQL 2003 Part 9: Management of External Data (SQL/MED) : DATALINK
                   *                           SQL 2003 Part 14: XML-Related Specifications (SQL/XML) : XML
                   * SQL_DATETIME_SUB  INTEGER SQL 2003 CLI datetime/interval subcode.
                   * CHAR_OCTET_LENGTH INTEGER The maximum length of binary and character
                   *                           based columns.  For any other datatype the
                   *                           returned value is a NULL
                   * ORDINAL_POSITION  INTEGER The ordinal position, starting from 1, for the
                   *                           input and output parameters for a procedure.
                   *                           A value of 0 is returned if this row describes
                   *                           the procedure's return value.
                   * IS_NULLABLE       VARCHAR ISO rules are used to determinte the nulliblity
                   *                           for a column.
                   *
                   *                           YES (enclosed in quotes)  --- if the column can include NULLs
                   *                           NO  (enclosed in quotes)  --- if the column cannot include NULLs
                   *                           empty string              --- if the nullability for the column is unknown
                   *
                   * SPECIFIC_NAME     VARCHAR The name which uniquely identifies this
                   *                           procedure within its schema.
                   *                           Typically (but not restricted to) a
                   *                           fully qualified Java Method name and
                   *                           signature
                   * // HSQLDB extension
                   * JDBC_SEQ          INTEGER The JDBC-specified order within
                   *                           runs of PROCEDURE_SCHEM, PROCEDURE_NAME,
                   *                           SPECIFIC_NAME, which is:
                   *
                   *                           return value (0), if any, first, followed
                   *                           by the parameter descriptions in call order
                   *                           (1..n1), followed by the result column
                   *                           descriptions in column number order
                   *                           (n1 + 1..n1 + n2)
                   * 

              * * @return a Table object describing the * return, parameter and result columns * of the accessible routines defined * within this database. */ Table SYSTEM_PROCEDURECOLUMNS(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_PROCEDURECOLUMNS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_PROCEDURECOLUMNS]); // ---------------------------------------------------------------- // required // ---------------------------------------------------------------- addColumn(t, "PROCEDURE_CAT", SQL_IDENTIFIER); // 0 addColumn(t, "PROCEDURE_SCHEM", SQL_IDENTIFIER); // 1 addColumn(t, "PROCEDURE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_TYPE", Type.SQL_SMALLINT); // not null addColumn(t, "DATA_TYPE", Type.SQL_SMALLINT); // not null addColumn(t, "TYPE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "PRECISION", Type.SQL_INTEGER); // 7 addColumn(t, "LENGTH", Type.SQL_INTEGER); // 8 addColumn(t, "SCALE", Type.SQL_SMALLINT); // 9 addColumn(t, "RADIX", Type.SQL_SMALLINT); // 10 addColumn(t, "NULLABLE", Type.SQL_SMALLINT); // not null addColumn(t, "REMARKS", CHARACTER_DATA); // 12 // ---------------------------------------------------------------- // JDBC 4.0 // ---------------------------------------------------------------- addColumn(t, "COLUMN_DEF", CHARACTER_DATA); // 13 addColumn(t, "SQL_DATA_TYPE", Type.SQL_INTEGER); // 14 addColumn(t, "SQL_DATETIME_SUB", Type.SQL_INTEGER); // 15 addColumn(t, "CHAR_OCTET_LENGTH", Type.SQL_INTEGER); // 16 addColumn(t, "ORDINAL_POSITION", Type.SQL_INTEGER); // 17 addColumn(t, "IS_NULLABLE", CHARACTER_DATA); // 18 addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); // 19 // order: PROCEDURE_SCHEM, PROCEDURE_NAME, SPECIFIC_NAME, ORDINAL_POSITION // HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_PROCEDURECOLUMNS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 19, 17 }, false); return t; } // column number mappings final int specific_cat = 0; final int specific_schem = 1; final int procedure_name = 2; final int parameter_name = 3; final int parameter_mode = 4; final int data_type_sql_id = 5; final int data_type = 6; final int numeric_precision = 7; final int byte_length = 8; final int numeric_scale = 9; final int numeric_precision_radix = 10; final int nullable = 11; final int remark = 12; final int default_val = 13; final int sql_data_type = 14; final int sql_datetime_sub = 15; final int character_octet_length = 16; final int ordinal_position = 17; final int is_nullable = 18; final int specific_name = 19; // intermediate holders int columnCount; Iterator routines; RoutineSchema routineSchema; Routine routine; Object[] row; Type type; // Initialization boolean translateTTI = database.sqlTranslateTTI; routines = database.schemaManager.databaseObjectIterator( SchemaObject.ROUTINE); while (routines.hasNext()) { routineSchema = (RoutineSchema) routines.next(); if (!session.getGrantee().isAccessible(routineSchema)) { continue; } Routine[] specifics = routineSchema.getSpecificRoutines(); for (int i = 0; i < specifics.length; i++) { routine = specifics[i]; columnCount = routine.getParameterCount(); for (int j = 0; j < columnCount; j++) { ColumnSchema column = routine.getParameter(j); row = t.getEmptyRowData(); type = column.getDataType(); if (translateTTI) { if (type.isIntervalType()) { type = ((IntervalType) type).getCharacterType(); } else if (type.isDateTimeTypeWithZone()) { type = ((DateTimeType) type) .getDateTimeTypeWithoutZone(); } } row[specific_cat] = database.getCatalogName().name; row[specific_schem] = routine.getSchemaName().name; row[specific_name] = routine.getSpecificName().name; row[procedure_name] = routine.getName().name; row[parameter_name] = column.getName().name; row[ordinal_position] = ValuePool.getInt(j + 1); row[parameter_mode] = ValuePool.getInt(column.getParameterMode()); row[data_type] = type.getFullNameString(); row[data_type_sql_id] = ValuePool.getInt(type.getJDBCTypeCode()); row[numeric_precision] = ValuePool.INTEGER_0; row[character_octet_length] = ValuePool.INTEGER_0; if (type.isCharacterType()) { row[numeric_precision] = ValuePool.getInt(type.getJDBCPrecision()); // this is length not octet_length, for character columns row[character_octet_length] = ValuePool.getInt(type.getJDBCPrecision()); } if (type.isBinaryType()) { row[numeric_precision] = ValuePool.getInt(type.getJDBCPrecision()); row[character_octet_length] = ValuePool.getInt(type.getJDBCPrecision()); } if (type.isNumberType()) { row[numeric_precision] = ValuePool.getInt( ((NumberType) type).getNumericPrecisionInRadix()); row[numeric_precision_radix] = ValuePool.getLong(type.getPrecisionRadix()); if (type.isExactNumberType()) { row[numeric_scale] = ValuePool.getLong(type.scale); } } if (type.isDateTimeType()) { int size = (int) column.getDataType().displaySize(); row[numeric_precision] = ValuePool.getInt(size); } row[sql_data_type] = ValuePool.getInt(column.getDataType().typeCode); row[nullable] = ValuePool.getInt(column.getNullability()); row[is_nullable] = column.isNullable() ? "YES" : "NO"; t.insertSys(session, store, row); } } } return t; } /** * Retrieves a Table object describing the accessible * routines defined within this database. * * Each row is a procedure description with the following * columns:

              * *

                   * PROCEDURE_CAT     VARCHAR   catalog in which routine is defined
                   * PROCEDURE_SCHEM   VARCHAR   schema in which routine is defined
                   * PROCEDURE_NAME    VARCHAR   simple routine identifier
                   * COL_4             INTEGER   unused
                   * COL_5             INTEGER   unused
                   * COL_6             INTEGER   unused
                   * REMARKS           VARCHAR   explanatory comment on the routine
                   * PROCEDURE_TYPE    SMALLINT  { Unknown | No Result | Returns Result }
                   * // JDBC 4.0
                   * SPECIFIC_NAME     VARCHAR   The name which uniquely identifies this
                   *                             procedure within its schema.
                   *                             typically (but not restricted to) a
                   *                             fully qualified Java Method name
                   *                             and signature.
                   * // HSQLDB extension
                   * ORIGIN            VARCHAR   {ALIAS |
                   *                             [BUILTIN | USER DEFINED] ROUTINE |
                   *                             [BUILTIN | USER DEFINED] TRIGGER |
                   *                              ...}
                   * 

              * * @return a Table object describing the accessible * routines defined within the this database */ Table SYSTEM_PROCEDURES(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_PROCEDURES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_PROCEDURES]); // ---------------------------------------------------------------- // required // ---------------------------------------------------------------- addColumn(t, "PROCEDURE_CAT", SQL_IDENTIFIER); // 0 addColumn(t, "PROCEDURE_SCHEM", SQL_IDENTIFIER); // 1 addColumn(t, "PROCEDURE_NAME", SQL_IDENTIFIER); // 2 addColumn(t, "COL_4", Type.SQL_INTEGER); // 3 addColumn(t, "COL_5", Type.SQL_INTEGER); // 4 addColumn(t, "COL_6", Type.SQL_INTEGER); // 5 addColumn(t, "REMARKS", CHARACTER_DATA); // 6 // basically: function (returns result), procedure (no return value) // or unknown (say, a trigger callout routine) addColumn(t, "PROCEDURE_TYPE", Type.SQL_SMALLINT); // 7 // ---------------------------------------------------------------- // JDBC 4.0 // ---------------------------------------------------------------- addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); // 8 // ---------------------------------------------------------------- // order: PROCEDURE_CAT, PROCEDURE_SCHEM, PROCEDURE_NAME, SPECIFIC_NAME HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_PROCEDURES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 8 }, false); return t; } // final int procedure_catalog = 0; final int procedure_schema = 1; final int procedure_name = 2; final int col_4 = 3; final int col_5 = 4; final int col_6 = 5; final int remarks = 6; final int procedure_type = 7; final int specific_name = 8; // Iterator it = database.schemaManager.databaseObjectIterator( SchemaObject.SPECIFIC_ROUTINE); while (it.hasNext()) { Routine routine = (Routine) it.next(); Object[] row = t.getEmptyRowData(); row[procedure_catalog] = row[procedure_catalog] = database.getCatalogName().name; row[procedure_schema] = routine.getSchemaName().name; row[procedure_name] = routine.getName().name; row[remarks] = routine.getName().comment; row[procedure_type] = routine.isProcedure() ? ValuePool.INTEGER_1 : ValuePool.INTEGER_2; row[specific_name] = routine.getSpecificName().name; t.insertSys(session, store, row); } return t; } /** * getClientInfoProperties * * @return Result * *

            • NAME String=> The name of the client info property
              *
            • MAX_LEN int=> The maximum length of the value for the property
              *
            • DEFAULT_VALUE String=> The default value of the property
              *
            • DESCRIPTION String=> A description of the property. This will typically * contain information as to where this property is * stored in the database. */ final Table SYSTEM_CONNECTION_PROPERTIES(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_CONNECTION_PROPERTIES]; if (t == null) { t = createBlankTable( sysTableHsqlNames[SYSTEM_CONNECTION_PROPERTIES]); addColumn(t, "NAME", SQL_IDENTIFIER); addColumn(t, "MAX_LEN", Type.SQL_INTEGER); addColumn(t, "DEFAULT_VALUE", SQL_IDENTIFIER); // not null addColumn(t, "DESCRIPTION", SQL_IDENTIFIER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_PRIMARYKEYS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, true); return t; } Object[] row; // column number mappings final int iname = 0; final int imax_len = 1; final int idefault_value = 2; final int idescription = 3; Iterator it = HsqlDatabaseProperties.getPropertiesMetaIterator(); while (it.hasNext()) { Object[] meta = (Object[]) it.next(); int propType = ((Integer) meta[HsqlProperties.indexType]).intValue(); if (propType == HsqlDatabaseProperties.FILE_PROPERTY) { if (HsqlDatabaseProperties.hsqldb_readonly.equals( meta[HsqlProperties.indexName]) || HsqlDatabaseProperties .hsqldb_files_readonly.equals( meta[HsqlProperties.indexName])) {} else { continue; } } else if (propType != HsqlDatabaseProperties.SQL_PROPERTY) { continue; } row = t.getEmptyRowData(); Object def = meta[HsqlProperties.indexDefaultValue]; row[iname] = meta[HsqlProperties.indexName]; row[imax_len] = ValuePool.getInt(8); row[idefault_value] = def == null ? null : def.toString(); row[idescription] = "see HyperSQL guide"; t.insertSys(session, store, row); } return t; } /** * Inserts a set of procedure description rows into the Table * object specified by the t argument.

              * * @param t the table into which the specified rows will eventually * be inserted * @param l the list of procedure name aliases to which the specified column * values apply * @param cat the procedure catalog name * @param schem the procedure schema name * @param pName the base (non-alias) procedure name * @param ip the procedure input parameter count * @param op the procedure output parameter count * @param rs the procedure result column count * @param remark a human-readable remark regarding the procedure * @param pType the procedure type code, indicating whether it is a * function, procedure, or uncatagorized (i.e. returns * a value, does not return a value, or it is unknown * if it returns a value) * @param specificName the specific name of the procedure * (typically but not limited to a * fully qualified Java Method name and signature) * @param origin origin of the procedure, e.g. * (["BUILTIN" | "USER DEFINED"] "ROUTINE" | "TRIGGER") | "ALIAS", etc. * */ protected void addProcRows(Session session, Table t, HsqlArrayList l, String cat, String schem, String pName, Integer ip, Integer op, Integer rs, String remark, Integer pType, String specificName, String origin) { PersistentStore store = t.getRowStore(session); // column number mappings final int icat = 0; final int ischem = 1; final int ipname = 2; final int iinput_parms = 3; final int ioutput_parms = 4; final int iresult_sets = 5; final int iremark = 6; final int iptype = 7; final int isn = 8; final int iporigin = 9; Object[] row = t.getEmptyRowData(); row[icat] = cat; row[ischem] = schem; row[ipname] = pName; row[iinput_parms] = ip; row[ioutput_parms] = op; row[iresult_sets] = rs; row[iremark] = remark; row[iptype] = pType; row[iporigin] = origin; row[isn] = specificName; t.insertSys(session, store, row); if (l != null) { int size = l.size(); for (int i = 0; i < size; i++) { row = t.getEmptyRowData(); pName = (String) l.get(i); row[icat] = cat; row[ischem] = schem; row[ipname] = pName; row[iinput_parms] = ip; row[ioutput_parms] = op; row[iresult_sets] = rs; row[iremark] = remark; row[iptype] = pType; row[iporigin] = "ALIAS"; row[isn] = specificName; t.insertSys(session, store, row); } } } /** * Inserts a set of procedure column description rows into the * Table specified by the t argument. * *

              * * @param t the table in which the rows are to be inserted * @param l the list of procedure name aliases to which the specified * column values apply * @param cat the procedure's catalog name * @param schem the procedure's schema name * @param pName the procedure's simple base (non-alias) name * @param cName the procedure column name * @param cType the column type (return, parameter, result) * @param dType the column's data type code * @param tName the column's canonical data type name * @param prec the column's precision * @param len the column's buffer length * @param scale the column's scale (decimal digits) * @param radix the column's numeric precision radix * @param nullability the column's java.sql.DatbaseMetaData nullabiliy code * @param remark a human-readable remark regarding the column * @param colDefault String * @param sqlDataType helper value to back JDBC contract sort order * @param sqlDateTimeSub Integer * @param charOctetLength Integer * @param ordinalPosition Integer * @param isNullable String * @param specificName the specific name of the procedure (typically but * not limited to a fully qualified Java Method name and signature) * @param jdbcSequence int */ protected void addPColRows(Session session, Table t, HsqlArrayList l, String cat, String schem, String pName, String cName, Integer cType, Integer dType, String tName, Integer prec, Integer len, Integer scale, Integer radix, Integer nullability, String remark, String colDefault, Integer sqlDataType, Integer sqlDateTimeSub, Integer charOctetLength, Integer ordinalPosition, String isNullable, String specificName) { PersistentStore store = t.getRowStore(session); // column number mappings final int icat = 0; final int ischem = 1; final int iname = 2; final int icol_name = 3; final int icol_type = 4; final int idata_type = 5; final int itype_name = 6; final int iprec = 7; final int ilength = 8; final int iscale = 9; final int iradix = 10; final int inullable = 11; final int iremark = 12; // JDBC 4.0 final int icol_default = 13; final int isql_data_type = 14; final int isql_datetime_sub = 15; final int ichar_octet_len = 16; final int iordinal_position = 17; final int iis_nullable = 18; final int ispecific_name = 19; // initialization Object[] row = t.getEmptyRowData(); // Do it. row[icat] = cat; row[ischem] = schem; row[iname] = pName; row[icol_name] = cName; row[icol_type] = cType; row[idata_type] = dType; row[itype_name] = tName; row[iprec] = prec; row[ilength] = len; row[iscale] = scale; row[iradix] = radix; row[inullable] = nullability; row[iremark] = remark; // JDBC 4.0 row[icol_default] = colDefault; row[isql_data_type] = sqlDataType; row[isql_datetime_sub] = sqlDateTimeSub; row[ichar_octet_len] = charOctetLength; row[iordinal_position] = ordinalPosition; row[iis_nullable] = isNullable; row[ispecific_name] = specificName; t.insertSys(session, store, row); if (l != null) { int size = l.size(); for (int i = 0; i < size; i++) { row = t.getEmptyRowData(); pName = (String) l.get(i); row[icat] = cat; row[ischem] = schem; row[iname] = pName; row[icol_name] = cName; row[icol_type] = cType; row[idata_type] = dType; row[itype_name] = tName; row[iprec] = prec; row[ilength] = len; row[iscale] = scale; row[iradix] = radix; row[inullable] = nullability; row[iremark] = remark; // JDBC 4.0 row[icol_default] = colDefault; row[isql_data_type] = sqlDataType; row[isql_datetime_sub] = sqlDateTimeSub; row[ichar_octet_len] = charOctetLength; row[iordinal_position] = ordinalPosition; row[iis_nullable] = isNullable; row[ispecific_name] = specificName; t.insertSys(session, store, row); } } } /** * Retrieves a Table object describing the accessible schemas * defined within this database.

              * * Each row is a schema description with the following * columns:

              * *

                   * TABLE_SCHEM      VARCHAR   simple schema name
                   * TABLE_CATALOG    VARCHAR   catalog in which schema is defined
                   * IS_DEFAULT       BOOLEAN   is the schema the default for new sessions
                   * 

              * * @return table containing information about schemas defined * within this database */ final Table SYSTEM_SCHEMAS(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_SCHEMAS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_SCHEMAS]); addColumn(t, "TABLE_SCHEM", SQL_IDENTIFIER); // not null addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "IS_DEFAULT", Type.SQL_BOOLEAN); // order: TABLE_SCHEM // true PK, as rows never have null TABLE_SCHEM HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_SCHEMAS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, true); return t; } Object[] row; // Initialization String[] schemas = database.schemaManager.getSchemaNamesArray(); String defschema = database.schemaManager.getDefaultSchemaHsqlName().name; // Do it. for (int i = 0; i < schemas.length; i++) { row = t.getEmptyRowData(); String schema = schemas[i]; row[0] = schema; row[1] = database.getCatalogName().name; row[2] = schema.equals(defschema) ? Boolean.TRUE : Boolean.FALSE; t.insertSys(session, store, row); } return t; } /** * Retrieves a Table object describing the accessible * tables defined within this database.

              * * Each row is a table description with the following columns:

              * *

                   * TABLE_CAT                 VARCHAR   table catalog
                   * TABLE_SCHEM               VARCHAR   table schema
                   * TABLE_NAME                VARCHAR   table name
                   * TABLE_TYPE                VARCHAR   {"TABLE" | "VIEW" |
                   *                                      "SYSTEM TABLE" | "GLOBAL TEMPORARY"}
                   * REMARKS                   VARCHAR   comment on the table.
                   * TYPE_CAT                  VARCHAR   table type catalog (not implemented).
                   * TYPE_SCHEM                VARCHAR   table type schema (not implemented).
                   * TYPE_NAME                 VARCHAR   table type name (not implemented).
                   * SELF_REFERENCING_COL_NAME VARCHAR   designated "identifier" column of
                   *                                     typed table (not implemented).
                   * REF_GENERATION            VARCHAR   {"SYSTEM" | "USER" |
                   *                                      "DERIVED" | NULL } (not implemented)
                   * HSQLDB_TYPE               VARCHAR   HSQLDB-specific type:
                   *                                     {"MEMORY" | "CACHED" | "TEXT" | ...}
                   * READ_ONLY                 BOOLEAN   TRUE if table is read-only,
                   *                                     else FALSE.
                   * COMMIT_ACTION             VARCHAR   "PRESERVE" or "DELETE" for temp tables,
                   *                                     else NULL
                   * 

              * * @return a Table object describing the accessible * tables defined within this database */ final Table SYSTEM_TABLES(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_TABLES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_TABLES]); // ------------------------------------------------------------- // required // ------------------------------------------------------------- addColumn(t, "TABLE_CAT", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEM", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "TABLE_TYPE", CHARACTER_DATA); // not null addColumn(t, "REMARKS", CHARACTER_DATA); // ------------------------------------------------------------- // JDBC 3.0 // ------------------------------------------------------------- addColumn(t, "TYPE_CAT", SQL_IDENTIFIER); addColumn(t, "TYPE_SCHEM", SQL_IDENTIFIER); addColumn(t, "TYPE_NAME", SQL_IDENTIFIER); addColumn(t, "SELF_REFERENCING_COL_NAME", SQL_IDENTIFIER); addColumn(t, "REF_GENERATION", CHARACTER_DATA); // ------------------------------------------------------------- // extended // ------------------------------------------------------------ addColumn(t, "HSQLDB_TYPE", SQL_IDENTIFIER); addColumn(t, "READ_ONLY", Type.SQL_BOOLEAN); // not null addColumn(t, "COMMIT_ACTION", CHARACTER_DATA); // not null // ------------------------------------------------------------ // order TABLE_TYPE, TABLE_SCHEM and TABLE_NAME // added for unique: TABLE_CAT // false PK, as TABLE_SCHEM and/or TABLE_CAT may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_TABLES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 3, 1, 2, 0 }, false); return t; } // intermediate holders Iterator tables; Table table; Object[] row; HsqlName accessKey; DITableInfo ti; // column number mappings // JDBC 1 final int itable_cat = 0; final int itable_schem = 1; final int itable_name = 2; final int itable_type = 3; final int iremark = 4; // JDBC 3.0 final int itype_cat = 5; final int itype_schem = 6; final int itype_name = 7; final int isref_cname = 8; final int iref_gen = 9; // hsqldb ext final int ihsqldb_type = 10; final int iread_only = 11; final int icommit_action = 12; // Initialization tables = allTables(); ti = new DITableInfo(); // Do it. while (tables.hasNext()) { table = (Table) tables.next(); if (!isAccessibleTable(session, table)) { continue; } ti.setTable(table); row = t.getEmptyRowData(); row[itable_cat] = database.getCatalogName().name; row[itable_schem] = table.getSchemaName().name; row[itable_name] = table.getName().name; row[itable_type] = ti.getJDBCStandardType(); row[iremark] = ti.getRemark(); row[ihsqldb_type] = ti.getHsqlType(); row[iread_only] = table.isDataReadOnly() ? Boolean.TRUE : Boolean.FALSE; row[icommit_action] = table.isTemp() ? (table.onCommitPreserve() ? "PRESERVE" : "DELETE") : null; t.insertSys(session, store, row); } return t; } /** * Retrieves a Table object describing the table types * available in this database.

              * * In general, the range of values that may be commonly encounted across * most DBMS implementations is:

              * *

                *
              • "TABLE" *
              • "VIEW" *
              • "SYSTEM TABLE" *
              • "GLOBAL TEMPORARY" *
              • "LOCAL TEMPORARY" *
              • "ALIAS" *
              • "SYNONYM" *

              * * As of HSQLDB 1.7.2, the engine supports and thus this method reports * only a subset of the range above:

              * *

                *
              • "TABLE" * (HSQLDB MEMORY, CACHED and TEXT tables) *
              • "VIEW" (Views) *
              • "SYSTEM TABLE" * (The tables generated by this object) *
              • "GLOBAL TEMPORARY" * (HSQLDB TEMP and TEMP TEXT tables) *

              * * @return a Table object describing the table types * available in this database */ Table SYSTEM_TABLETYPES(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_TABLETYPES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_TABLETYPES]); addColumn(t, "TABLE_TYPE", SQL_IDENTIFIER); // not null // order: TABLE_TYPE // true PK HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_TABLETYPES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, true); return t; } Object[] row; for (int i = 0; i < tableTypes.length; i++) { row = t.getEmptyRowData(); row[0] = tableTypes[i]; t.insertSys(session, store, row); } return t; } /** * Retrieves a Table object describing the * result expected by the JDBC DatabaseMetaData interface implementation * for system-defined SQL types supported as table columns. * *

                   * TYPE_NAME          VARCHAR   the canonical name for DDL statements.
                   * DATA_TYPE          SMALLINT  data type code from DITypes.
                   * PRECISION          INTEGER   max column size.
                   *                              number => max precision.
                   *                              character => max characters.
                   *                              datetime => max chars incl. frac. component.
                   * LITERAL_PREFIX     VARCHAR   char(s) prefixing literal of this type.
                   * LITERAL_SUFFIX     VARCHAR   char(s) terminating literal of this type.
                   * CREATE_PARAMS      VARCHAR   Localized syntax-order list of domain
                   *                              create parameter keywords.
                   *                              - for human consumption only
                   * NULLABLE           SMALLINT  {No Nulls | Nullable | Unknown}
                   * CASE_SENSITIVE     BOOLEAN   case-sensitive in collations/comparisons?
                   * SEARCHABLE         SMALLINT  {None | Char (Only WHERE .. LIKE) |
                   *                               Basic (Except WHERE .. LIKE) |
                   *                               Searchable (All forms)}
                   * UNSIGNED_ATTRIBUTE BOOLEAN   {TRUE  (unsigned) | FALSE (signed) |
                   *                               NULL (non-numeric or not applicable)}
                   * FIXED_PREC_SCALE   BOOLEAN   {TRUE (fixed) | FALSE (variable) |
                   *                               NULL (non-numeric or not applicable)}
                   * AUTO_INCREMENT     BOOLEAN   automatic unique value generated for
                   *                              inserts and updates when no value or
                   *                              NULL specified?
                   * LOCAL_TYPE_NAME    VARCHAR   localized name of data type;
                   *                              - NULL if not supported.
                   *                              - for human consuption only
                   * MINIMUM_SCALE      SMALLINT  minimum scale supported.
                   * MAXIMUM_SCALE      SMALLINT  maximum scale supported.
                   * SQL_DATA_TYPE      INTEGER   value expected in SQL CLI SQL_DESC_TYPE
                   *                              field of the SQLDA.
                   * SQL_DATETIME_SUB   INTEGER   SQL CLI datetime/interval subcode.
                   * NUM_PREC_RADIX     INTEGER   numeric base w.r.t # of digits reported in
                   *                              PRECISION column (typically 10).
                   * 

              * * @return a Table object describing the * system-defined SQL types supported as table columns */ final Table SYSTEM_TYPEINFO(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_TYPEINFO]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_TYPEINFO]); //------------------------------------------- // required by JDBC: // ------------------------------------------ addColumn(t, "TYPE_NAME", SQL_IDENTIFIER); addColumn(t, "DATA_TYPE", Type.SQL_SMALLINT); addColumn(t, "PRECISION", Type.SQL_INTEGER); addColumn(t, "LITERAL_PREFIX", CHARACTER_DATA); addColumn(t, "LITERAL_SUFFIX", CHARACTER_DATA); addColumn(t, "CREATE_PARAMS", CHARACTER_DATA); addColumn(t, "NULLABLE", Type.SQL_SMALLINT); addColumn(t, "CASE_SENSITIVE", Type.SQL_BOOLEAN); addColumn(t, "SEARCHABLE", Type.SQL_INTEGER); addColumn(t, "UNSIGNED_ATTRIBUTE", Type.SQL_BOOLEAN); addColumn(t, "FIXED_PREC_SCALE", Type.SQL_BOOLEAN); addColumn(t, "AUTO_INCREMENT", Type.SQL_BOOLEAN); addColumn(t, "LOCAL_TYPE_NAME", SQL_IDENTIFIER); addColumn(t, "MINIMUM_SCALE", Type.SQL_SMALLINT); addColumn(t, "MAXIMUM_SCALE", Type.SQL_SMALLINT); addColumn(t, "SQL_DATA_TYPE", Type.SQL_INTEGER); addColumn(t, "SQL_DATETIME_SUB", Type.SQL_INTEGER); addColumn(t, "NUM_PREC_RADIX", Type.SQL_INTEGER); //------------------------------------------- // SQL CLI / ODBC - not in JDBC spec // ------------------------------------------ addColumn(t, "INTERVAL_PRECISION", Type.SQL_INTEGER); // order: DATA_TYPE, TYPE_NAME // true primary key HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_TYPEINFO].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 1, 0 }, true); return t; } //----------------------------------------- // Same as SYSTEM_TYPEINFO //----------------------------------------- final int itype_name = 0; final int idata_type = 1; final int iprecision = 2; final int iliteral_prefix = 3; final int iliteral_suffix = 4; final int icreate_params = 5; final int inullable = 6; final int icase_sensitive = 7; final int isearchable = 8; final int iunsigned_attribute = 9; final int ifixed_prec_scale = 10; final int iauto_increment = 11; final int ilocal_type_name = 12; final int iminimum_scale = 13; final int imaximum_scale = 14; final int isql_data_type = 15; final int isql_datetime_sub = 16; final int inum_prec_radix = 17; //------------------------------------------ // Extensions //------------------------------------------ // not in JDBC, but in SQL CLI SQLDA / ODBC //------------------------------------------ final int iinterval_precision = 18; Object[] row; Iterator it = Type.typeNames.keySet().iterator(); boolean translateTTI = database.sqlTranslateTTI; while (it.hasNext()) { String typeName = (String) it.next(); int typeCode = Type.typeNames.get(typeName); Type type = Type.getDefaultType(typeCode); if (type == null) { continue; } if (translateTTI) { if (type.isIntervalType()) { type = ((IntervalType) type).getCharacterType(); } else if (type.isDateTimeTypeWithZone()) { type = ((DateTimeType) type).getDateTimeTypeWithoutZone(); } } row = t.getEmptyRowData(); row[itype_name] = typeName; row[idata_type] = ValuePool.getInt(type.getJDBCTypeCode()); long maxPrecision = type.getMaxPrecision(); row[iprecision] = maxPrecision > Integer.MAX_VALUE ? ValuePool.INTEGER_MAX : ValuePool.getInt((int) maxPrecision); if (type.isBinaryType() || type.isCharacterType() || type.isDateTimeType() || type.isIntervalType()) { row[iliteral_prefix] = "\'"; row[iliteral_suffix] = "\'"; } if (type.acceptsPrecision() && type.acceptsScale()) { row[icreate_params] = "PRECISION,SCALE"; } else if (type.acceptsPrecision()) { row[icreate_params] = type.isNumberType() ? "PRECISION" : "LENGTH"; } else if (type.acceptsScale()) { row[icreate_params] = "SCALE"; } row[inullable] = ValuePool.INTEGER_1; row[icase_sensitive] = type.isCharacterType() && type.typeCode != Types.VARCHAR_IGNORECASE ? Boolean.TRUE : Boolean.FALSE; if (type.isLobType()) { row[isearchable] = ValuePool.INTEGER_0; } else if (type.isCharacterType() || (type.isBinaryType() && !type.isBitType())) { row[isearchable] = ValuePool.getInt(3); } else { row[isearchable] = ValuePool.getInt(2); } row[iunsigned_attribute] = Boolean.FALSE; row[ifixed_prec_scale] = type.typeCode == Types.SQL_NUMERIC || type.typeCode == Types.SQL_DECIMAL ? Boolean.TRUE : Boolean.FALSE; row[iauto_increment] = type.isIntegralType() ? Boolean.TRUE : Boolean.FALSE; row[ilocal_type_name] = null; row[iminimum_scale] = ValuePool.INTEGER_0; row[imaximum_scale] = ValuePool.getInt(type.getMaxScale()); row[isql_data_type] = null; row[isql_datetime_sub] = null; row[inum_prec_radix] = ValuePool.getInt(type.getPrecisionRadix()); //------------------------------------------ if (type.isIntervalType()) { row[iinterval_precision] = null; } t.insertSys(session, store, row); } row = t.getEmptyRowData(); row[itype_name] = "DISTINCT"; row[idata_type] = ValuePool.getInt(Types.DISTINCT); return t; } /** * Retrieves a Table object describing the accessible * user-defined types defined in this database.

              * * Schema-specific UDTs may have type JAVA_OBJECT, STRUCT, or DISTINCT. * *

              Each row is a UDT descripion with the following columns: *

                *
              1. TYPE_CAT VARCHAR => the type's catalog *
              2. TYPE_SCHEM VARCHAR => type's schema *
              3. TYPE_NAME VARCHAR => type name *
              4. CLASS_NAME VARCHAR => Java class name *
              5. DATA_TYPE VARCHAR => * type value defined in DITypes; * one of JAVA_OBJECT, STRUCT, or * DISTINCT *
              6. REMARKS VARCHAR => * explanatory comment on the type *
              7. BASE_TYPESMALLINT => * type code of the source type of a DISTINCT type or the * type that implements the user-generated reference type of the * SELF_REFERENCING_COLUMN of a structured type as defined in * DITypes (null if DATA_TYPE is not DISTINCT or not * STRUCT with REFERENCE_GENERATION = USER_DEFINED) * *

              * * @return a Table object describing the accessible * user-defined types defined in this database */ Table SYSTEM_UDTS(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_UDTS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_UDTS]); addColumn(t, "TYPE_CAT", SQL_IDENTIFIER); addColumn(t, "TYPE_SCHEM", SQL_IDENTIFIER); addColumn(t, "TYPE_NAME", SQL_IDENTIFIER); addColumn(t, "CLASS_NAME", CHARACTER_DATA); addColumn(t, "DATA_TYPE", Type.SQL_INTEGER); addColumn(t, "REMARKS", CHARACTER_DATA); addColumn(t, "BASE_TYPE", Type.SQL_SMALLINT); // HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_UDTS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, null, false); return t; } boolean translateTTI = database.sqlTranslateTTI; // column number mappings final int type_catalog = 0; final int type_schema = 1; final int type_name = 2; final int class_name = 3; final int data_type = 4; final int remarks = 5; final int base_type = 6; Iterator it = database.schemaManager.databaseObjectIterator(SchemaObject.TYPE); while (it.hasNext()) { Type distinct = (Type) it.next(); if (!distinct.isDistinctType()) { continue; } Object[] data = t.getEmptyRowData(); Type type = distinct; if (translateTTI) { if (type.isIntervalType()) { type = ((IntervalType) type).getCharacterType(); } else if (type.isDateTimeTypeWithZone()) { type = ((DateTimeType) type).getDateTimeTypeWithoutZone(); } } data[type_catalog] = database.getCatalogName().name; data[type_schema] = distinct.getSchemaName().name; data[type_name] = distinct.getName().name; data[class_name] = type.getJDBCClassName(); data[data_type] = ValuePool.getInt(Types.DISTINCT); data[remarks] = null; data[base_type] = ValuePool.getInt(type.getJDBCTypeCode()); t.insertSys(session, store, data); } return t; } /** * Retrieves a Table object describing the accessible * columns that are automatically updated when any value in a row * is updated.

              * * Each row is a version column description with the following columns:

              * *

                *
              1. SCOPE SMALLINT => is not used *
              2. COLUMN_NAME VARCHAR => column name *
              3. DATA_TYPE SMALLINT => * SQL data type from java.sql.Types *
              4. TYPE_NAME SMALLINT => * Data source dependent type name *
              5. COLUMN_SIZE INTEGER => precision *
              6. BUFFER_LENGTH INTEGER => * length of column value in bytes *
              7. DECIMAL_DIGITS SMALLINT => scale *
              8. PSEUDO_COLUMN SMALLINT => * is this a pseudo column like an Oracle ROWID:
                * (as defined in java.sql.DatabaseMetadata) *
                  *
                • versionColumnUnknown - may or may not be * pseudo column *
                • versionColumnNotPseudo - is NOT a pseudo column *
                • versionColumnPseudo - is a pseudo column *
                *

              * * Note: Currently, the HSQLDB engine does not support version * columns, so an empty table is returned.

              * * @return a Table object describing the columns * that are automatically updated when any value * in a row is updated */ Table SYSTEM_VERSIONCOLUMNS(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_VERSIONCOLUMNS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_VERSIONCOLUMNS]); // ---------------------------------------------------------------- // required by DatabaseMetaData.getVersionColumns result set // ---------------------------------------------------------------- addColumn(t, "SCOPE", Type.SQL_INTEGER); addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); // not null addColumn(t, "DATA_TYPE", Type.SQL_SMALLINT); // not null addColumn(t, "TYPE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_SIZE", Type.SQL_SMALLINT); addColumn(t, "BUFFER_LENGTH", Type.SQL_INTEGER); addColumn(t, "DECIMAL_DIGITS", Type.SQL_SMALLINT); addColumn(t, "PSEUDO_COLUMN", Type.SQL_SMALLINT); // not null // ----------------------------------------------------------------- // required by DatabaseMetaData.getVersionColumns filter parameters // ----------------------------------------------------------------- addColumn(t, "TABLE_CAT", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEM", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null // ----------------------------------------------------------------- HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_VERSIONCOLUMNS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, null, false); return t; } return t; } /** * Retrieves a Table object describing the * visible Users defined within this database. * @return table containing information about the users defined within * this database */ Table SYSTEM_USERS(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_USERS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_USERS]); addColumn(t, "USER_NAME", SQL_IDENTIFIER); addColumn(t, "ADMIN", Type.SQL_BOOLEAN); addColumn(t, "INITIAL_SCHEMA", SQL_IDENTIFIER); addColumn(t, "AUTHENTICATION", SQL_IDENTIFIER); addColumn(t, "PASSWORD_DIGEST", SQL_IDENTIFIER); // order: USER // true PK HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_USERS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, true); return t; } // Intermediate holders HsqlArrayList users; User user; Object[] row; HsqlName initialSchema; // Initialization users = database.getUserManager().listVisibleUsers(session); // Do it. for (int i = 0; i < users.size(); i++) { row = t.getEmptyRowData(); user = (User) users.get(i); initialSchema = user.getInitialSchema(); row[0] = user.getName().getNameString(); row[1] = ValuePool.getBoolean(user.isAdmin()); row[2] = ((initialSchema == null) ? null : initialSchema.name); row[3] = user.isLocalOnly ? Tokens.T_LOCAL : user.isExternalOnly ? Tokens.T_EXTERNAL : Tokens.T_ANY; row[4] = user.getPasswordDigest(); t.insertSys(session, store, row); } return t; } // ----------------------------------------------------------------------------- // SQL SCHEMATA VIEWS // limited to views used in JDBC DatabaseMetaData /** * Retrieves a Table object describing the visible * access rights for all visible columns of all accessible * tables defined within this database.

              * * Each row is a column privilege description with the following * columns:

              * *

                   * TABLE_CAT    VARCHAR   table catalog
                   * TABLE_SCHEM  VARCHAR   table schema
                   * TABLE_NAME   VARCHAR   table name
                   * COLUMN_NAME  VARCHAR   column name
                   * GRANTOR      VARCHAR   grantor of access
                   * GRANTEE      VARCHAR   grantee of access
                   * PRIVILEGE    VARCHAR   name of access
                   * IS_GRANTABLE VARCHAR   grantable?: "YES" - grant to others, else "NO"
                   * 
              * * Note: From 1.9.0, HSQLDB supports column level * privileges.

              * * @return a Table object describing the visible * access rights for all visible columns of * all accessible tables defined within this * database */ final Table COLUMN_PRIVILEGES(Session session, PersistentStore store) { Table t = sysTables[COLUMN_PRIVILEGES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[COLUMN_PRIVILEGES]); addColumn(t, "GRANTOR", SQL_IDENTIFIER); // not null addColumn(t, "GRANTEE", SQL_IDENTIFIER); // not null addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); // not null addColumn(t, "PRIVILEGE_TYPE", CHARACTER_DATA); // not null addColumn(t, "IS_GRANTABLE", YES_OR_NO); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[COLUMN_PRIVILEGES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 2, 3, 4, 5, 6, 1, 0 }, false); return t; } // calculated column values String tableCatalog; String tableSchema; String tableName; Grantee granteeObject; // intermediate holders User user; Iterator tables; Table table; Object[] row; // column number mappings final int grantor = 0; final int grantee = 1; final int table_catalog = 2; final int table_schema = 3; final int table_name = 4; final int column_name = 5; final int privilege_type = 6; final int is_grantable = 7; // enumerations OrderedHashSet grantees = session.getGrantee().getGranteeAndAllRolesWithPublic(); // Initialization tables = allTables(); while (tables.hasNext()) { table = (Table) tables.next(); tableName = table.getName().name; tableCatalog = database.getCatalogName().name; tableSchema = table.getSchemaName().name; for (int i = 0; i < grantees.size(); i++) { granteeObject = (Grantee) grantees.get(i); OrderedHashSet rights = granteeObject.getAllDirectPrivileges(table); OrderedHashSet grants = granteeObject.getAllGrantedPrivileges(table); if (!grants.isEmpty()) { grants.addAll(rights); rights = grants; } for (int j = 0; j < rights.size(); j++) { Right right = (Right) rights.get(j); Right grantableRight = right.getGrantableRights(); for (int k = 0; k < Right.privilegeTypes.length; k++) { OrderedHashSet columnList = right.getColumnsForPrivilege( table, Right.privilegeTypes[k]); OrderedHashSet grantableList = grantableRight.getColumnsForPrivilege(table, Right.privilegeTypes[k]); for (int l = 0; l < columnList.size(); l++) { HsqlName fullName = ((HsqlName) columnList.get(l)); row = t.getEmptyRowData(); row[grantor] = right.getGrantor().getName().name; row[grantee] = right.getGrantee().getName().name; row[table_catalog] = tableCatalog; row[table_schema] = tableSchema; row[table_name] = tableName; row[column_name] = fullName.name; row[privilege_type] = Right.privilegeNames[k]; row[is_grantable] = right.getGrantee() == table.getOwner() || grantableList.contains(fullName) ? "YES" : "NO"; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } } } } return t; } /** * The SEQUENCES view has one row for each external sequence * generator.

              * * Definition:

              * *

                   *
                   *      SEQUENCE_CATALOG     VARCHAR NULL,
                   *      SEQUENCE_SCHEMA      VARCHAR NULL,
                   *      SEQUENCE_NAME        VARCHAR NOT NULL,
                   *      DATA_TYPE            CHARACTER_DATA
                   *      DATA_TYPE            CHARACTER_DATA
                   *      NUMERIC_PRECISION    CARDINAL_NUMBER
                   *      NUMERIC_PRECISION_RADIX CARDINAL_NUMBER
                   *      NUMERIC_SCALE        CARDINAL_NUMBER
                   *      MAXIMUM_VALUE        VARCHAR NOT NULL,
                   *      MINIMUM_VALUE        VARCHAR NOT NULL,
                   *      INCREMENT            VARCHAR NOT NULL,
                   *      CYCLE_OPTION         VARCHAR {'YES', 'NO'},
                   *      START_WITH           VARCHAR NOT NULL,
                   *      DECLARED_DATA_TYPE   CHARACTER_DATA
                   *      DECLARED_NUMERIC_PRECISION CARDINAL_NUMBER
                   *      DECLARED_NUMERIC_SCALE     CARDINAL_NUMBER
                   *
                   * 
              * * DESCRIPTION:

              * *

                *
              1. The values of SEQUENCE_CATALOG, SEQUENCE_SCHEMA, and * SEQUENCE_NAME are the catalog name, unqualified schema name, * and qualified identifier, respectively, of the sequence generator * being described.

                * *

              2. The values of SEQUENCE_CATALOG, SEQUENCE_SCHEMA, SEQUENCE_NAME, and * DTD_IDENTIFIER are the values of OBJECT_CATALOG, OBJECT_SCHEMA, * OBJECT_NAME, and DTD_IDENTIFIER, respectively, of the row in * DATA_TYPE_DESCRIPTOR (not yet implemented) that describes the data * type of the sequence generator.

                * *

              3. The values of MAXIMUM_VALUE, MINIMUM_VALUE, and INCREMENT are the * character representations of maximum value, minimum value, * and increment, respectively, of the sequence generator being * described.

                * *

              4. The values of CYCLE_OPTION have the following meanings:

                * * * * * * * * * *
                YESThe cycle option of the sequence generator * is CYCLE.
                NOThe cycle option of the sequence generator is * NO CYCLE.

                * *

              5. The value of START_WITH is HSQLDB-specific (not in the SQL 200n * spec).

                * * It is the character representation of the START WITH value.

                * *

              6. The value of NEXT_VALUE is HSQLDB-specific (not in the SQL 200n)

                * This is the character representation of the value that * would be generated by NEXT VALUE FOR when this sequence * is materialized in an SQL statement.

                *

              * * @return Table */ final Table SEQUENCES(Session session, PersistentStore store) { Table t = sysTables[SEQUENCES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SEQUENCES]); addColumn(t, "SEQUENCE_CATALOG", SQL_IDENTIFIER); addColumn(t, "SEQUENCE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SEQUENCE_NAME", SQL_IDENTIFIER); addColumn(t, "DATA_TYPE", CHARACTER_DATA); addColumn(t, "NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "NUMERIC_PRECISION_RADIX", CARDINAL_NUMBER); addColumn(t, "NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "MAXIMUM_VALUE", CHARACTER_DATA); addColumn(t, "MINIMUM_VALUE", CHARACTER_DATA); addColumn(t, "INCREMENT", CHARACTER_DATA); addColumn(t, "CYCLE_OPTION", YES_OR_NO); addColumn(t, "DECLARED_DATA_TYPE", CHARACTER_DATA); addColumn(t, "DECLARED_NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "DECLARED_NUMERIC_SCALE", CARDINAL_NUMBER); // HSQLDB-specific addColumn(t, "START_WITH", CHARACTER_DATA); addColumn(t, "NEXT_VALUE", CHARACTER_DATA); // order SEQUENCE_CATALOG, SEQUENCE_SCHEMA, SEQUENCE_NAME // false PK, as CATALOG may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SEQUENCES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2 }, false); return t; } // final int sequence_catalog = 0; final int sequence_schema = 1; final int sequence_name = 2; final int data_type = 3; final int numeric_precision = 4; final int numeric_precision_radix = 5; final int numeric_scale = 6; final int maximum_value = 7; final int minimum_value = 8; final int increment = 9; final int cycle_option = 10; final int declared_data_type = 11; final int declared_numeric_precision = 12; final int declared_numeric_scale = 13; final int start_with = 14; final int next_value = 15; // Iterator it; Object[] row; NumberSequence sequence; it = database.schemaManager.databaseObjectIterator( SchemaObject.SEQUENCE); while (it.hasNext()) { sequence = (NumberSequence) it.next(); if (!session.getGrantee().isAccessible(sequence)) { continue; } row = t.getEmptyRowData(); NumberType type = (NumberType) sequence.getDataType(); int radix = (type.typeCode == Types.SQL_NUMERIC || type.typeCode == Types .SQL_DECIMAL) ? 10 : 2; row[sequence_catalog] = database.getCatalogName().name; row[sequence_schema] = sequence.getSchemaName().name; row[sequence_name] = sequence.getName().name; row[data_type] = sequence.getDataType().getFullNameString(); row[numeric_precision] = ValuePool.getInt((int) type.getPrecision()); row[numeric_precision_radix] = ValuePool.getInt(radix); row[numeric_scale] = ValuePool.INTEGER_0; row[maximum_value] = String.valueOf(sequence.getMaxValue()); row[minimum_value] = String.valueOf(sequence.getMinValue()); row[increment] = String.valueOf(sequence.getIncrement()); row[cycle_option] = sequence.isCycle() ? "YES" : "NO"; row[declared_data_type] = row[data_type]; row[declared_numeric_precision] = row[numeric_precision]; row[declared_numeric_scale] = row[declared_numeric_scale]; row[start_with] = String.valueOf(sequence.getStartValue()); row[next_value] = String.valueOf(sequence.peek()); t.insertSys(session, store, row); } return t; } final Table SYSTEM_SEQUENCES(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_SEQUENCES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_SEQUENCES]); addColumn(t, "SEQUENCE_CATALOG", SQL_IDENTIFIER); addColumn(t, "SEQUENCE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SEQUENCE_NAME", SQL_IDENTIFIER); addColumn(t, "DATA_TYPE", CHARACTER_DATA); addColumn(t, "NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "NUMERIC_PRECISION_RADIX", CARDINAL_NUMBER); addColumn(t, "NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "MAXIMUM_VALUE", CHARACTER_DATA); addColumn(t, "MINIMUM_VALUE", CHARACTER_DATA); addColumn(t, "INCREMENT", CHARACTER_DATA); addColumn(t, "CYCLE_OPTION", YES_OR_NO); addColumn(t, "DECLARED_DATA_TYPE", CHARACTER_DATA); addColumn(t, "DECLARED_NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "DECLARED_NUMERIC_SCALE", CARDINAL_NUMBER); // HSQLDB-specific addColumn(t, "START_WITH", CHARACTER_DATA); addColumn(t, "NEXT_VALUE", CHARACTER_DATA); // order SEQUENCE_CATALOG, SEQUENCE_SCHEMA, SEQUENCE_NAME // false PK, as CATALOG may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_SEQUENCES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2 }, false); return t; } // final int sequence_catalog = 0; final int sequence_schema = 1; final int sequence_name = 2; final int data_type = 3; final int numeric_precision = 4; final int numeric_precision_radix = 5; final int numeric_scale = 6; final int maximum_value = 7; final int minimum_value = 8; final int increment = 9; final int cycle_option = 10; final int declared_data_type = 11; final int declared_numeric_precision = 12; final int declared_numeric_scale = 13; final int start_with = 14; final int next_value = 15; // Iterator it; Object[] row; NumberSequence sequence; it = database.schemaManager.databaseObjectIterator( SchemaObject.SEQUENCE); while (it.hasNext()) { sequence = (NumberSequence) it.next(); if (!session.getGrantee().isAccessible(sequence)) { continue; } row = t.getEmptyRowData(); NumberType type = (NumberType) sequence.getDataType(); int radix = (type.typeCode == Types.SQL_NUMERIC || type.typeCode == Types .SQL_DECIMAL) ? 10 : 2; row[sequence_catalog] = database.getCatalogName().name; row[sequence_schema] = sequence.getSchemaName().name; row[sequence_name] = sequence.getName().name; row[data_type] = sequence.getDataType().getFullNameString(); row[numeric_precision] = ValuePool.getInt((int) type.getPrecision()); row[numeric_precision_radix] = ValuePool.getInt(radix); row[numeric_scale] = ValuePool.INTEGER_0; row[maximum_value] = String.valueOf(sequence.getMaxValue()); row[minimum_value] = String.valueOf(sequence.getMinValue()); row[increment] = String.valueOf(sequence.getIncrement()); row[cycle_option] = sequence.isCycle() ? "YES" : "NO"; row[declared_data_type] = row[data_type]; row[declared_numeric_precision] = row[numeric_precision]; row[declared_numeric_scale] = row[declared_numeric_scale]; row[start_with] = String.valueOf(sequence.getStartValue()); row[next_value] = String.valueOf(sequence.peek()); t.insertSys(session, store, row); } return t; } /* WHERE ( GRANTEE IN ( 'PUBLIC', CURRENT_USER ) OR GRANTEE IN ( SELECT ROLE_NAME FROM ENABLED_ROLES ) OR GRANTOR = CURRENT_USER OR GRANTOR IN ( SELECT ROLE_NAME FROM ENABLED_ROLES ) ) */ /** * The TABLE_PRIVILEGES view has one row for each visible access * right for each accessible table definied within this database.

              * * Each row is a table privilege description with the following columns:

              * *

                   * GRANTOR      VARCHAR   grantor of access
                   * GRANTEE      VARCHAR   grantee of access
                   * TABLE_CATALOG    VARCHAR   table catalog
                   * TABLE_SCHEMA  VARCHAR   table schema
                   * TABLE_NAME   VARCHAR   table name
                   * PRIVILEGE_TYPE    VARCHAR   { "SELECT" | "INSERT" | "UPDATE" | "DELETE" | "REFERENCES" | "TRIGGER" }
                   * IS_GRANTABLE VARCHAR   { "YES" | "NO" }
                   * WITH_HIERARCHY   { "YES" | "NO" }
                   * 
              * * @return a Table object describing the visible * access rights for each accessible table * defined within this database */ final Table TABLE_PRIVILEGES(Session session, PersistentStore store) { Table t = sysTables[TABLE_PRIVILEGES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[TABLE_PRIVILEGES]); addColumn(t, "GRANTOR", SQL_IDENTIFIER); // not null addColumn(t, "GRANTEE", SQL_IDENTIFIER); // not null addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "PRIVILEGE_TYPE", CHARACTER_DATA); // not null addColumn(t, "IS_GRANTABLE", YES_OR_NO); // not null addColumn(t, "WITH_HIERARCHY", YES_OR_NO); // HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SEQUENCES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5, 6 }, false); return t; } // calculated column values String tableCatalog; String tableSchema; String tableName; Grantee granteeObject; String privilege; // intermediate holders Iterator tables; Table table; Object[] row; // column number mappings final int grantor = 0; final int grantee = 1; final int table_catalog = 2; final int table_schema = 3; final int table_name = 4; final int privilege_type = 5; final int is_grantable = 6; final int with_hierarchy = 7; OrderedHashSet grantees = session.getGrantee().getGranteeAndAllRolesWithPublic(); tables = allTables(); while (tables.hasNext()) { table = (Table) tables.next(); tableName = table.getName().name; tableCatalog = table.getCatalogName().name; tableSchema = table.getSchemaName().name; for (int i = 0; i < grantees.size(); i++) { granteeObject = (Grantee) grantees.get(i); OrderedHashSet rights = granteeObject.getAllDirectPrivileges(table); OrderedHashSet grants = granteeObject.getAllGrantedPrivileges(table); if (!grants.isEmpty()) { grants.addAll(rights); rights = grants; } for (int j = 0; j < rights.size(); j++) { Right right = (Right) rights.get(j); Right grantableRight = right.getGrantableRights(); for (int k = 0; k < Right.privilegeTypes.length; k++) { if (!right.canAccessFully(Right.privilegeTypes[k])) { continue; } privilege = Right.privilegeNames[k]; row = t.getEmptyRowData(); row[grantor] = right.getGrantor().getName().name; row[grantee] = right.getGrantee().getName().name; row[table_catalog] = tableCatalog; row[table_schema] = tableSchema; row[table_name] = tableName; row[privilege_type] = privilege; row[is_grantable] = right.getGrantee() == table.getOwner() || grantableRight.canAccessFully( Right.privilegeTypes[k]) ? "YES" : "NO"; row[with_hierarchy] = "NO"; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } } } return t; } Table TABLES(Session session, PersistentStore store) { Table t = sysTables[TABLES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[TABLES]); addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); addColumn(t, "TABLE_TYPE", CHARACTER_DATA); addColumn(t, "SELF_REFERENCING_COLUMN_NAME", SQL_IDENTIFIER); addColumn(t, "REFERENCE_GENERATION", CHARACTER_DATA); addColumn(t, "USER_DEFINED_TYPE_CATALOG", SQL_IDENTIFIER); addColumn(t, "USER_DEFINED_TYPE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "USER_DEFINED_TYPE_NAME", SQL_IDENTIFIER); addColumn(t, "IS_INSERTABLE_INTO", YES_OR_NO); addColumn(t, "IS_TYPED", YES_OR_NO); addColumn(t, "COMMIT_ACTION", CHARACTER_DATA); // HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[TABLES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, }, false); return t; } // intermediate holders Iterator tables; Table table; Object[] row; final int table_catalog = 0; final int table_schema = 1; final int table_name = 2; final int table_type = 3; final int self_referencing_column_name = 4; final int reference_generation = 5; final int user_defined_type_catalog = 6; final int user_defined_type_schema = 7; final int user_defined_type_name = 8; final int is_insertable_into = 9; final int is_typed = 10; final int commit_action = 11; // Initialization tables = allTables(); // Do it. while (tables.hasNext()) { table = (Table) tables.next(); if (!isAccessibleTable(session, table)) { continue; } row = t.getEmptyRowData(); row[table_catalog] = database.getCatalogName().name; row[table_schema] = table.getSchemaName().name; row[table_name] = table.getName().name; switch (table.getTableType()) { case TableBase.INFO_SCHEMA_TABLE : case TableBase.VIEW_TABLE : row[table_type] = "VIEW"; row[is_insertable_into] = table.isInsertable() ? Tokens.T_YES : Tokens.T_NO; break; case TableBase.TEMP_TABLE : case TableBase.TEMP_TEXT_TABLE : row[table_type] = "GLOBAL TEMPORARY"; row[is_insertable_into] = "YES"; break; default : row[table_type] = "BASE TABLE"; row[is_insertable_into] = table.isInsertable() ? Tokens.T_YES : Tokens.T_NO; break; } row[self_referencing_column_name] = null; row[reference_generation] = null; row[user_defined_type_catalog] = null; row[user_defined_type_schema] = null; row[user_defined_type_name] = null; row[is_typed] = "NO"; row[commit_action] = table.isTemp() ? (table.onCommitPreserve() ? "PRESERVE" : "DELETE") : null; t.insertSys(session, store, row); } return t; } // ----------------------------------------------------------------------------- // SQL SCHEMATA BASE TABLE /** * Retrieves a Table object naming the accessible catalogs * defined within this database.

              * * Each row is a catalog name description with the following column:

              * *

                   * TABLE_CAT   VARCHAR   catalog name
                   * 

              * * @return a Table object naming the accessible * catalogs defined within this database */ final Table INFORMATION_SCHEMA_CATALOG_NAME(Session session, PersistentStore store) { Table t = sysTables[INFORMATION_SCHEMA_CATALOG_NAME]; if (t == null) { t = createBlankTable( sysTableHsqlNames[INFORMATION_SCHEMA_CATALOG_NAME]); addColumn(t, "CATALOG_NAME", SQL_IDENTIFIER); // not null // order: TABLE_CAT // true PK HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[INFORMATION_SCHEMA_CATALOG_NAME].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, true); return t; } Object[] row = t.getEmptyRowData(); row[0] = database.getCatalogName().name; t.insertSys(session, store, row); return t; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/dbinfo/DatabaseInformation.java0000644000175000017500000004702312007547352024767 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.dbinfo; import java.lang.reflect.Constructor; import org.hsqldb.Database; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.lib.IntValueHashMap; import org.hsqldb.persist.PersistentStore; // fredt@users - 1.7.2 - structural modifications to allow inheritance // boucherB@users 20020305 - completed inheritance work, including final access // boucherB@users 20020305 - javadoc updates/corrections // boucherB@users 20020305 - SYSTEM_VIEWS brought in line with SQL 200n // boucherb@users 20050514 - further SQL 200n metdata support /** * Base class for system tables. Includes a factory method which returns the * most complete implementation available in the jar. This base implementation * knows the names of all system tables but returns null for any system table. *

              * This class has been developed from scratch to replace the previous * DatabaseInformation implementations.

              * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @version 2.0.1 * @since 1.7.2 */ public class DatabaseInformation { // ids for system table names strictly in order of sysTableNames[] protected static final int SYSTEM_BESTROWIDENTIFIER = 0; protected static final int SYSTEM_COLUMNS = 1; protected static final int SYSTEM_CROSSREFERENCE = 2; protected static final int SYSTEM_INDEXINFO = 3; protected static final int SYSTEM_PRIMARYKEYS = 4; protected static final int SYSTEM_PROCEDURECOLUMNS = 5; protected static final int SYSTEM_PROCEDURES = 6; protected static final int SYSTEM_SCHEMAS = 7; protected static final int SYSTEM_TABLES = 8; protected static final int SYSTEM_TABLETYPES = 9; protected static final int SYSTEM_TYPEINFO = 10; protected static final int SYSTEM_UDTS = 11; protected static final int SYSTEM_USERS = 12; //-- ref in SqlFile only protected static final int SYSTEM_VERSIONCOLUMNS = 13; //-- returns autogenerated columns protected static final int SYSTEM_SEQUENCES = 14; //-- same as SEQUENCES // HSQLDB-specific protected static final int SYSTEM_CACHEINFO = 15; protected static final int SYSTEM_COLUMN_SEQUENCE_USAGE = 16; protected static final int SYSTEM_COMMENTS = 17; protected static final int SYSTEM_CONNECTION_PROPERTIES = 18; protected static final int SYSTEM_PROPERTIES = 19; protected static final int SYSTEM_SESSIONINFO = 20; protected static final int SYSTEM_SESSIONS = 21; protected static final int SYSTEM_TEXTTABLES = 22; // SQL 200n tables protected static final int ADMINISTRABLE_ROLE_AUTHORIZATIONS = 23; protected static final int APPLICABLE_ROLES = 24; protected static final int ASSERTIONS = 25; protected static final int AUTHORIZATIONS = 26; protected static final int CHARACTER_SETS = 27; protected static final int CHECK_CONSTRAINT_ROUTINE_USAGE = 28; protected static final int CHECK_CONSTRAINTS = 29; protected static final int COLLATIONS = 30; protected static final int COLUMN_COLUMN_USAGE = 31; protected static final int COLUMN_DOMAIN_USAGE = 32; protected static final int COLUMN_PRIVILEGES = 33; protected static final int COLUMN_UDT_USAGE = 34; protected static final int COLUMNS = 35; protected static final int CONSTRAINT_COLUMN_USAGE = 36; protected static final int CONSTRAINT_TABLE_USAGE = 37; protected static final int DATA_TYPE_PRIVILEGES = 38; protected static final int DOMAIN_CONSTRAINTS = 39; protected static final int DOMAINS = 40; protected static final int ELEMENT_TYPES = 41; protected static final int ENABLED_ROLES = 42; protected static final int INFORMATION_SCHEMA_CATALOG_NAME = 43; protected static final int JAR_JAR_USAGE = 44; protected static final int JARS = 45; protected static final int KEY_COLUMN_USAGE = 46; protected static final int METHOD_SPECIFICATIONS = 47; protected static final int MODULE_COLUMN_USAGE = 48; protected static final int MODULE_PRIVILEGES = 49; protected static final int MODULE_TABLE_USAGE = 50; protected static final int MODULES = 51; protected static final int PARAMETERS = 52; protected static final int REFERENTIAL_CONSTRAINTS = 53; protected static final int ROLE_AUTHORIZATION_DESCRIPTORS = 54; protected static final int ROLE_COLUMN_GRANTS = 55; protected static final int ROLE_MODULE_GRANTS = 56; protected static final int ROLE_ROUTINE_GRANTS = 57; protected static final int ROLE_TABLE_GRANTS = 58; protected static final int ROLE_UDT_GRANTS = 59; protected static final int ROLE_USAGE_GRANTS = 60; protected static final int ROUTINE_COLUMN_USAGE = 61; protected static final int ROUTINE_JAR_USAGE = 62; protected static final int ROUTINE_PRIVILEGES = 63; protected static final int ROUTINE_ROUTINE_USAGE = 64; protected static final int ROUTINE_SEQUENCE_USAGE = 65; protected static final int ROUTINE_TABLE_USAGE = 66; protected static final int ROUTINES = 67; protected static final int SCHEMATA = 68; protected static final int SEQUENCES = 69; protected static final int SQL_FEATURES = 70; protected static final int SQL_IMPLEMENTATION_INFO = 71; protected static final int SQL_PACKAGES = 72; protected static final int SQL_PARTS = 73; protected static final int SQL_SIZING = 74; protected static final int SQL_SIZING_PROFILES = 75; protected static final int TABLE_CONSTRAINTS = 76; protected static final int TABLE_PRIVILEGES = 77; protected static final int TABLES = 78; protected static final int TRANSLATIONS = 79; protected static final int TRIGGER_COLUMN_USAGE = 80; protected static final int TRIGGER_ROUTINE_USAGE = 81; protected static final int TRIGGER_SEQUENCE_USAGE = 82; protected static final int TRIGGER_TABLE_USAGE = 83; protected static final int TRIGGERED_UPDATE_COLUMNS = 84; protected static final int TRIGGERS = 85; protected static final int TYPE_JAR_USAGE = 86; protected static final int UDT_PRIVILEGES = 87; protected static final int USAGE_PRIVILEGES = 88; protected static final int USER_DEFINED_TYPES = 89; protected static final int VIEW_COLUMN_USAGE = 90; protected static final int VIEW_ROUTINE_USAGE = 91; protected static final int VIEW_TABLE_USAGE = 92; protected static final int VIEWS = 93; /** system table names strictly in order of their ids */ protected static final String[] sysTableNames = { "SYSTEM_BESTROWIDENTIFIER", // "SYSTEM_COLUMNS", // "SYSTEM_CROSSREFERENCE", // "SYSTEM_INDEXINFO", // "SYSTEM_PRIMARYKEYS", // "SYSTEM_PROCEDURECOLUMNS", // "SYSTEM_PROCEDURES", // "SYSTEM_SCHEMAS", // "SYSTEM_TABLES", // "SYSTEM_TABLETYPES", // "SYSTEM_TYPEINFO", // "SYSTEM_UDTS", // "SYSTEM_USERS", // "SYSTEM_VERSIONCOLUMNS", // "SYSTEM_SEQUENCES", // // HSQLDB-specific "SYSTEM_CACHEINFO", // "SYSTEM_COLUMN_SEQUENCE_USAGE", // "SYSTEM_COMMENTS", // "SYSTEM_CONNECTION_PROPERTIES", // "SYSTEM_PROPERTIES", // "SYSTEM_SESSIONINFO", // "SYSTEM_SESSIONS", // "SYSTEM_TEXTTABLES", // // SQL 200n "ADMINISTRABLE_ROLE_AUTHORIZATIONS", // "APPLICABLE_ROLES", // "ASSERTIONS", // "AUTHORIZATIONS", // "CHARACTER_SETS", // "CHECK_CONSTRAINT_ROUTINE_USAGE", // "CHECK_CONSTRAINTS", // "COLLATIONS", // "COLUMN_COLUMN_USAGE", // "COLUMN_DOMAIN_USAGE", // "COLUMN_PRIVILEGES", // "COLUMN_UDT_USAGE", // "COLUMNS", // "CONSTRAINT_COLUMN_USAGE", // "CONSTRAINT_TABLE_USAGE", // "DATA_TYPE_PRIVILEGES", // "DOMAIN_CONSTRAINTS", // "DOMAINS", // "ELEMENT_TYPES", // "ENABLED_ROLES", // "INFORMATION_SCHEMA_CATALOG_NAME", // "JAR_JAR_USAGE", // "JARS", // "KEY_COLUMN_USAGE", // "METHOD_SPECIFICATIONS", // "MODULE_COLUMN_USAGE", // "MODULE_PRIVILEGES", // "MODULE_TABLE_USAGE", // "MODULES", // "PARAMETERS", // "REFERENTIAL_CONSTRAINTS", // "ROLE_AUTHORIZATION_DESCRIPTORS", // "ROLE_COLUMN_GRANTS", // "ROLE_MODULE_GRANTS", // "ROLE_ROUTINE_GRANTS", // "ROLE_TABLE_GRANTS", // "ROLE_UDT_GRANTS", // "ROLE_USAGE_GRANTS", // "ROUTINE_COLUMN_USAGE", // "ROUTINE_JAR_USAGE", // "ROUTINE_PRIVILEGES", // "ROUTINE_ROUTINE_USAGE", // "ROUTINE_SEQUENCE_USAGE", // "ROUTINE_TABLE_USAGE", // "ROUTINES", // "SCHEMATA", // "SEQUENCES", // "SQL_FEATURES", // "SQL_IMPLEMENTATION_INFO", // "SQL_PACKAGES", // "SQL_PARTS", // "SQL_SIZING", // "SQL_SIZING_PROFILES", // "TABLE_CONSTRAINTS", // "TABLE_PRIVILEGES", // "TABLES", // "TRANSLATIONS", // "TRIGGER_COLUMN_USAGE", // "TRIGGER_ROUTINE_USAGE", // "TRIGGER_SEQUENCE_USAGE", // "TRIGGER_TABLE_USAGE", // "TRIGGERED_UPDATE_COLUMNS", // "TRIGGERS", // "TYPE_JAR_USAGE", // "UDT_PRIVILEGES", // "USAGE_PRIVILEGES", // "USER_DEFINED_TYPES", // "VIEW_COLUMN_USAGE", // "VIEW_ROUTINE_USAGE", // "VIEW_TABLE_USAGE", // "VIEWS", // }; /** Map: table name => table id */ protected static final IntValueHashMap sysTableNamesMap; static { synchronized (DatabaseInformation.class) { sysTableNamesMap = new IntValueHashMap(97); for (int i = 0; i < sysTableNames.length; i++) { sysTableNamesMap.put(sysTableNames[i], i); } } } static int getSysTableID(String token) { return sysTableNamesMap.get(token, -1); } /** Database for which to produce tables */ protected final Database database; /** * state flag -- if true, contentful tables are to be produced, else * empty (surrogate) tables are to be produced. This allows faster * database startup where user views reference system tables and faster * system table structural reflection for table metadata. */ protected boolean withContent = false; /** * Factory method returns the fullest system table producer * implementation available. This instantiates implementations beginning * with the most complete, finally choosing an empty table producer * implemenation (this class) if no better instance can be constructed. * @param db The Database object for which to produce system tables * @return the fullest system table producer * implementation available */ public static final DatabaseInformation newDatabaseInformation( Database db) { Class c = null; try { c = Class.forName("org.hsqldb.dbinfo.DatabaseInformationFull"); } catch (Exception e) { try { c = Class.forName("org.hsqldb.dbinfo.DatabaseInformationMain"); } catch (Exception e2) { c = DatabaseInformation.class; } } try { Class[] ctorParmTypes = new Class[]{ Database.class }; Object[] ctorParms = new Object[]{ db }; Constructor ctor = c.getDeclaredConstructor(ctorParmTypes); return (DatabaseInformation) ctor.newInstance(ctorParms); } catch (Exception e) { e.printStackTrace(); } return new DatabaseInformation(db); } /** * Constructs a new DatabaseInformation instance which knows the names of * all system tables (isSystemTable()) but simpy returns null for all * getSystemTable() requests.

              * * @param db The Database object for which to produce system tables */ DatabaseInformation(Database db) { database = db; } /** * Tests if the specified name is that of a system table.

              * * @param name the name to test * @return true if the specified name is that of a system table */ final boolean isSystemTable(String name) { return sysTableNamesMap.containsKey(name); } /** * Retrieves a table with the specified name whose content may depend on * the execution context indicated by the session argument as well as the * current value of withContent.

              * * @param session the context in which to produce the table * @param name the name of the table to produce * @return a table corresponding to the name and session arguments, or * null if there is no such table to be produced */ public Table getSystemTable(Session session, String name) { return null; } /** * Sets the store for the given session, populates the store if necessary. */ public void setStore(Session session, Table table, PersistentStore store) {} /** * Switches this table producer between producing empty (surrogate) * or contentful tables.

              * * @param withContent if true, then produce contentful tables, else * produce emtpy (surrogate) tables */ public final void setWithContent(boolean withContent) { this.withContent = withContent; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/dbinfo/DITableInfo.java0000644000175000017500000001752612007547352023142 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.dbinfo; import java.util.Locale; import org.hsqldb.Table; import org.hsqldb.TableBase; import org.hsqldb.resources.BundleHandler; import org.hsqldb.store.ValuePool; /** * Provides extended information about HSQLDB tables and their * columns/indices.

              * * Current version has been reduced in scope.

              * * @author boucherb@users * @version 2.2.7 * @since 1.7.2 */ final class DITableInfo { // related to DatabaseMetaData int bestRowTemporary = 0; int bestRowTransaction = 1; int bestRowSession = 2; int bestRowUnknown = 0; int bestRowNotPseudo = 1; static final short tableIndexOther = 3; /** Used in buffer size and character octet length determinations. */ private static final int HALF_MAX_INT = Integer.MAX_VALUE >>> 1; /** BundleHandler id for column remarks resource bundle. */ private int hnd_column_remarks = -1; /** BundleHandler id for table remarks resource bundle. */ private int hnd_table_remarks = -1; /** The Table object upon which this object is reporting. */ private Table table; /** * Creates a new DITableInfo object with the default Locale and reporting * on no table. It is absolutely essential the a valid Table object is * assigned to this object, using the setTable method, before any Table, * Column or Index oriented value retrieval methods are called; this class * contains no assertions or exception handling related to a null or * invalid table member attribute. */ DITableInfo() { setupBundles(); } /** * Sets the Locale for table and column remarks.

              */ void setupBundles() { Locale oldLocale; synchronized (BundleHandler.class) { oldLocale = BundleHandler.getLocale(); BundleHandler.setLocale(Locale.getDefault()); hnd_column_remarks = BundleHandler.getBundleHandle("column-remarks", null); hnd_table_remarks = BundleHandler.getBundleHandle("table-remarks", null); BundleHandler.setLocale(oldLocale); } } /** * Retrieves whether the best row identifier column is * a pseudo column, like an Oracle ROWID.

              * * Currently, this always returns an Integer whose value is * DatabaseMetaData.bestRowNotPseudo, as HSQLDB does not support * pseudo columns such as ROWID.

              * * @return whether the best row identifier column is * a pseudo column */ Integer getBRIPseudo() { return ValuePool.getInt(bestRowNotPseudo); } /** * Retrieves the scope of the best row identifier.

              * * This implements the rules described in * DatabaseInformationMain.SYSTEM_BESTROWIDENTIFIER.

              * * @return the scope of the best row identifier */ Integer getBRIScope() { return (table.isWritable()) ? ValuePool.getInt(bestRowTemporary) : ValuePool.getInt(bestRowSession); } /** * Retrieves the simple name of the specified column.

              * * @param i zero-based column index * @return the simple name of the specified column. */ String getColName(int i) { return table.getColumn(i).getName().name; } /** * Retrieves the remarks, if any, recorded against the specified * column.

              * * @param i zero-based column index * @return the remarks recorded against the specified column. */ String getColRemarks(int i) { String key; if (table.getTableType() != TableBase.INFO_SCHEMA_TABLE) { return table.getColumn(i).getName().comment; } key = getName() + "_" + getColName(i); return BundleHandler.getString(hnd_column_remarks, key); } /** * Retrieves the HSQLDB-specific type of the table.

              * * @return the HSQLDB-specific type of the table */ String getHsqlType() { switch (table.getTableType()) { case TableBase.MEMORY_TABLE : case TableBase.TEMP_TABLE : case TableBase.INFO_SCHEMA_TABLE : return "MEMORY"; case TableBase.CACHED_TABLE : return "CACHED"; case TableBase.TEMP_TEXT_TABLE : case TableBase.TEXT_TABLE : return "TEXT"; case TableBase.VIEW_TABLE : default : return null; } } /** * Retrieves the simple name of the table.

              * * @return the simple name of the table */ String getName() { return table.getName().name; } /** * Retrieves the remarks (if any) recorded against the Table.

              * * @return the remarks recorded against the Table */ String getRemark() { return (table.getTableType() == TableBase.INFO_SCHEMA_TABLE) ? BundleHandler.getString(hnd_table_remarks, getName()) : table.getName().comment; } /** * Retrieves the standard JDBC type of the table.

              * * "TABLE" for user-defined tables, "VIEW" for user-defined views, * and so on. * * @return the standard JDBC type of the table */ String getJDBCStandardType() { switch (table.getTableType()) { case TableBase.VIEW_TABLE : return "VIEW"; case TableBase.TEMP_TABLE : case TableBase.TEMP_TEXT_TABLE : return "GLOBAL TEMPORARY"; case TableBase.INFO_SCHEMA_TABLE : return "SYSTEM TABLE"; default : if (table.getOwner().isSystem() ) { return "SYSTEM TABLE"; } return "TABLE"; } } /** * Retrieves the Table object on which this object is currently * reporting.

              * * @return the Table object on which this object * is currently reporting */ Table getTable() { return this.table; } /** * Assigns the Table object on which this object is to report.

              * * @param table the Table object on which this object is to report */ void setTable(Table table) { this.table = table; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/dbinfo/DatabaseInformationFull.java0000644000175000017500000117263612007547352025624 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.dbinfo; import java.io.InputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.security.AccessController; import java.security.PrivilegedAction; import org.hsqldb.ColumnSchema; import org.hsqldb.Constraint; import org.hsqldb.Database; import org.hsqldb.Expression; import org.hsqldb.ExpressionColumn; import org.hsqldb.HsqlException; import org.hsqldb.HsqlNameManager; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.NumberSequence; import org.hsqldb.Routine; import org.hsqldb.RoutineSchema; import org.hsqldb.Schema; import org.hsqldb.SchemaObject; import org.hsqldb.SchemaObjectSet; import org.hsqldb.Session; import org.hsqldb.SqlInvariants; import org.hsqldb.Statement; import org.hsqldb.Table; import org.hsqldb.TextTable; import org.hsqldb.Tokens; import org.hsqldb.TriggerDef; import org.hsqldb.View; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.LineGroupReader; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.Set; import org.hsqldb.lib.WrapperIterator; import org.hsqldb.persist.DataFileCache; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.persist.PersistentStore; import org.hsqldb.persist.TextCache; import org.hsqldb.persist.TextFileSettings; import org.hsqldb.result.Result; import org.hsqldb.rights.GrantConstants; import org.hsqldb.rights.Grantee; import org.hsqldb.rights.Right; import org.hsqldb.store.ValuePool; import org.hsqldb.types.ArrayType; import org.hsqldb.types.CharacterType; import org.hsqldb.types.Charset; import org.hsqldb.types.Collation; import org.hsqldb.types.IntervalType; import org.hsqldb.types.NumberType; import org.hsqldb.types.TimestampData; import org.hsqldb.types.Type; // fredt@users - 1.7.2 - structural modifications to allow inheritance // boucherb@users - 1.7.2 - 20020225 // - factored out all reusable code into DIXXX support classes // - completed Fred's work on allowing inheritance // boucherb@users - 1.7.2 - 20020304 - bug fixes, refinements, better java docs // fredt@users - 1.8.0 - updated to report latest enhancements and changes // boucherb@users - 1.8.0 - 20050515 - further SQL 2003 metadata support // boucherb@users 20051207 - patch 1.8.x initial JDBC 4.0 support work // fredt@users - 1.9.0 - new tables + renaming + upgrade of some others to SQL/SCHEMATA // Revision 1.12 2006/07/12 11:42:09 boucherb // - merging back remaining material overritten by Fred's type-system upgrades // - rework to use grantee (versus user) orientation for certain system table content // - update collation and character set reporting to correctly reflect SQL3 spec /** * Provides definitions for most of the SQL Standard Schemata views that are * supported by HSQLDB.

              * * Provides definitions for some of HSQLDB's additional system vies. * * The definitions for the rest of system vies are provided by * DatabaseInformationMain, which this class extends.

              * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.1 * @since 1.7.2 */ final class DatabaseInformationFull extends org.hsqldb.dbinfo.DatabaseInformationMain { static final HashMappedList statementMap; static { synchronized (DatabaseInformationFull.class) { final String resourceFileName = "/org/hsqldb/resources/information-schema.sql"; final String[] starters = new String[]{ "/*" }; InputStream fis = (InputStream) AccessController.doPrivileged( new PrivilegedAction() { public InputStream run() { return getClass().getResourceAsStream(resourceFileName); } }); InputStreamReader reader = null; try { reader = new InputStreamReader(fis, "ISO-8859-1"); } catch (Exception e) {} LineNumberReader lineReader = new LineNumberReader(reader); LineGroupReader lg = new LineGroupReader(lineReader, starters); statementMap = lg.getAsMap(); lg.close(); } } /** * Constructs a new DatabaseInformationFull instance.

              * * @param db the database for which to produce system tables. */ DatabaseInformationFull(Database db) { super(db); } /** * Retrieves the system table corresponding to the specified index.

              * * @param tableIndex index identifying the system table to generate * @return the system table corresponding to the specified index */ protected Table generateTable(Session session, PersistentStore store, int tableIndex) { switch (tableIndex) { // HSQLDB-specific case SYSTEM_CACHEINFO : return SYSTEM_CACHEINFO(session, store); case SYSTEM_COLUMN_SEQUENCE_USAGE : return SYSTEM_COLUMN_SEQUENCE_USAGE(session, store); case SYSTEM_COMMENTS : return SYSTEM_COMMENTS(session, store); case SYSTEM_SESSIONINFO : return SYSTEM_SESSIONINFO(session, store); case SYSTEM_PROPERTIES : return SYSTEM_PROPERTIES(session, store); case SYSTEM_SESSIONS : return SYSTEM_SESSIONS(session, store); case SYSTEM_TEXTTABLES : return SYSTEM_TEXTTABLES(session, store); // SQL views case ADMINISTRABLE_ROLE_AUTHORIZATIONS : return ADMINISTRABLE_ROLE_AUTHORIZATIONS(session, store); case APPLICABLE_ROLES : return APPLICABLE_ROLES(session, store); case ASSERTIONS : return ASSERTIONS(session, store); case AUTHORIZATIONS : return AUTHORIZATIONS(session, store); case CHARACTER_SETS : return CHARACTER_SETS(session, store); case CHECK_CONSTRAINT_ROUTINE_USAGE : return CHECK_CONSTRAINT_ROUTINE_USAGE(session, store); case CHECK_CONSTRAINTS : return CHECK_CONSTRAINTS(session, store); case COLLATIONS : return COLLATIONS(session, store); case COLUMN_COLUMN_USAGE : return COLUMN_COLUMN_USAGE(session, store); case COLUMN_DOMAIN_USAGE : return COLUMN_DOMAIN_USAGE(session, store); case COLUMN_UDT_USAGE : return COLUMN_UDT_USAGE(session, store); case CONSTRAINT_COLUMN_USAGE : return CONSTRAINT_COLUMN_USAGE(session, store); case CONSTRAINT_TABLE_USAGE : return CONSTRAINT_TABLE_USAGE(session, store); case COLUMNS : return COLUMNS(session, store); case DATA_TYPE_PRIVILEGES : return DATA_TYPE_PRIVILEGES(session, store); case DOMAIN_CONSTRAINTS : return DOMAIN_CONSTRAINTS(session, store); case DOMAINS : return DOMAINS(session, store); case ELEMENT_TYPES : return ELEMENT_TYPES(session, store); case ENABLED_ROLES : return ENABLED_ROLES(session, store); case JAR_JAR_USAGE : return JAR_JAR_USAGE(session, store); case JARS : return JARS(session, store); case KEY_COLUMN_USAGE : return KEY_COLUMN_USAGE(session, store); case METHOD_SPECIFICATIONS : return METHOD_SPECIFICATIONS(session, store); case MODULE_COLUMN_USAGE : return MODULE_COLUMN_USAGE(session, store); case MODULE_PRIVILEGES : return MODULE_PRIVILEGES(session, store); case MODULE_TABLE_USAGE : return MODULE_TABLE_USAGE(session, store); case MODULES : return MODULES(session, store); case PARAMETERS : return PARAMETERS(session, store); case REFERENTIAL_CONSTRAINTS : return REFERENTIAL_CONSTRAINTS(session, store); case ROLE_AUTHORIZATION_DESCRIPTORS : return ROLE_AUTHORIZATION_DESCRIPTORS(session, store); case ROLE_COLUMN_GRANTS : return ROLE_COLUMN_GRANTS(session, store); case ROLE_ROUTINE_GRANTS : return ROLE_ROUTINE_GRANTS(session, store); case ROLE_TABLE_GRANTS : return ROLE_TABLE_GRANTS(session, store); case ROLE_USAGE_GRANTS : return ROLE_USAGE_GRANTS(session, store); case ROLE_UDT_GRANTS : return ROLE_UDT_GRANTS(session, store); case ROUTINE_COLUMN_USAGE : return ROUTINE_COLUMN_USAGE(session, store); case ROUTINE_JAR_USAGE : return ROUTINE_JAR_USAGE(session, store); case ROUTINE_PRIVILEGES : return ROUTINE_PRIVILEGES(session, store); case ROUTINE_ROUTINE_USAGE : return ROUTINE_ROUTINE_USAGE(session, store); case ROUTINE_SEQUENCE_USAGE : return ROUTINE_SEQUENCE_USAGE(session, store); case ROUTINE_TABLE_USAGE : return ROUTINE_TABLE_USAGE(session, store); case ROUTINES : return ROUTINES(session, store); case SCHEMATA : return SCHEMATA(session, store); case SEQUENCES : return SEQUENCES(session, store); case SQL_FEATURES : return SQL_FEATURES(session, store); case SQL_IMPLEMENTATION_INFO : return SQL_IMPLEMENTATION_INFO(session, store); case SQL_PACKAGES : return SQL_PACKAGES(session, store); case SQL_PARTS : return SQL_PARTS(session, store); case SQL_SIZING : return SQL_SIZING(session, store); case SQL_SIZING_PROFILES : return SQL_SIZING_PROFILES(session, store); case TABLE_CONSTRAINTS : return TABLE_CONSTRAINTS(session, store); case TABLES : return TABLES(session, store); case TRANSLATIONS : return TRANSLATIONS(session, store); case TRIGGERED_UPDATE_COLUMNS : return TRIGGERED_UPDATE_COLUMNS(session, store); case TRIGGER_COLUMN_USAGE : return TRIGGER_COLUMN_USAGE(session, store); case TRIGGER_ROUTINE_USAGE : return TRIGGER_ROUTINE_USAGE(session, store); case TRIGGER_SEQUENCE_USAGE : return TRIGGER_SEQUENCE_USAGE(session, store); case TRIGGER_TABLE_USAGE : return TRIGGER_TABLE_USAGE(session, store); case TRIGGERS : return TRIGGERS(session, store); case UDT_PRIVILEGES : return UDT_PRIVILEGES(session, store); case USAGE_PRIVILEGES : return USAGE_PRIVILEGES(session, store); case USER_DEFINED_TYPES : return USER_DEFINED_TYPES(session, store); case VIEW_COLUMN_USAGE : return VIEW_COLUMN_USAGE(session, store); case VIEW_ROUTINE_USAGE : return VIEW_ROUTINE_USAGE(session, store); case VIEW_TABLE_USAGE : return VIEW_TABLE_USAGE(session, store); case VIEWS : return VIEWS(session, store); default : return super.generateTable(session, store, tableIndex); } } /** * SQL:2008 VIEW

              * * Retrieves a Table object describing the current * state of all row caching objects for the accessible * tables defined within this database.

              * * Currently, the row caching objects for which state is reported are:

              * *

                *
              1. the system-wide Cache object used by CACHED tables. *
              2. any TextCache objects in use by [TEMP] TEXT tables. *

              * * Each row is a cache object state description with the following * columns:

              * *

                   * CACHE_FILE          CHARACTER_DATA   absolute path of cache data file
                   * MAX_CACHE_SIZE      INTEGER   maximum allowable cached Row objects
                   * MAX_CACHE_BYTE_SIZE INTEGER   maximum allowable size of cached Row objects
                   * CACHE_LENGTH        INTEGER   number of data bytes currently cached
                   * CACHE_SIZE          INTEGER   number of rows currently cached
                   * FREE_BYTES          INTEGER   total bytes in available file allocation units
                   * FREE_COUNT          INTEGER   total # of allocation units available
                   * FREE_POS            INTEGER   largest file position allocated + 1
                   * 

              * * Notes:

              * * TextCache objects do not maintain a free list because * deleted rows are only marked deleted and never reused. As such, the * columns FREE_BYTES, SMALLEST_FREE_ITEM, LARGEST_FREE_ITEM, and * FREE_COUNT are always reported as zero for rows reporting on * TextCache objects.

              * * Currently, CACHE_SIZE, FREE_BYTES, SMALLEST_FREE_ITEM, LARGEST_FREE_ITEM, * FREE_COUNT and FREE_POS are the only dynamically changing values. * All others are constant for the life of a cache object. In a future * release, other column values may also change over the life of a cache * object, as SQL syntax may eventually be introduced to allow runtime * modification of certain cache properties.

              * * @return a description of the current state of all row caching * objects associated with the accessible tables of the database */ Table SYSTEM_CACHEINFO(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_CACHEINFO]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_CACHEINFO]); addColumn(t, "CACHE_FILE", CHARACTER_DATA); // not null addColumn(t, "MAX_CACHE_COUNT", CARDINAL_NUMBER); // not null addColumn(t, "MAX_CACHE_BYTES", CARDINAL_NUMBER); // not null addColumn(t, "CACHE_SIZE", CARDINAL_NUMBER); // not null addColumn(t, "CACHE_BYTES", CARDINAL_NUMBER); // not null addColumn(t, "FILE_FREE_BYTES", CARDINAL_NUMBER); // not null addColumn(t, "FILE_FREE_COUNT", CARDINAL_NUMBER); // not null addColumn(t, "FILE_FREE_POS", CARDINAL_NUMBER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_CACHEINFO].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, true); return t; } // column number mappings final int icache_file = 0; final int imax_cache_sz = 1; final int imax_cache_bytes = 2; final int icache_size = 3; final int icache_length = 4; final int ifree_bytes = 5; final int ifree_count = 6; final int ifree_pos = 7; // DataFileCache cache = null; Object[] row; HashSet cacheSet; Iterator caches; Iterator tables; Table table; int iFreeBytes; int iLargestFreeItem; long lSmallestFreeItem; // Initialization cacheSet = new HashSet(); // dynamic system tables are never cached tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); while (tables.hasNext()) { table = (Table) tables.next(); PersistentStore currentStore = table.getRowStore(session); if (session.getGrantee().isFullyAccessibleByRole( table.getName())) { if (currentStore != null) { cache = currentStore.getCache(); } if (cache != null) { cacheSet.add(cache); } } } caches = cacheSet.iterator(); // Do it. while (caches.hasNext()) { cache = (DataFileCache) caches.next(); row = t.getEmptyRowData(); row[icache_file] = FileUtil.getFileUtil().canonicalOrAbsolutePath( cache.getFileName()); row[imax_cache_sz] = ValuePool.getLong(cache.capacity()); row[imax_cache_bytes] = ValuePool.getLong(cache.bytesCapacity()); row[icache_size] = ValuePool.getLong(cache.getCachedObjectCount()); row[icache_length] = ValuePool.getLong(cache.getTotalCachedBlockSize()); row[ifree_bytes] = ValuePool.getLong(cache.getTotalFreeBlockSize()); row[ifree_count] = ValuePool.getLong(cache.getFreeBlockCount()); row[ifree_pos] = ValuePool.getLong(cache.getFileFreePos()); t.insertSys(session, store, row); } return t; } Table SYSTEM_COLUMN_SEQUENCE_USAGE(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_COLUMN_SEQUENCE_USAGE]; if (t == null) { t = createBlankTable( sysTableHsqlNames[SYSTEM_COLUMN_SEQUENCE_USAGE]); addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); //0 addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); addColumn(t, "SEQUENCE_CATALOG", SQL_IDENTIFIER); addColumn(t, "SEQUENCE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SEQUENCE_NAME", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_COLUMN_SEQUENCE_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4 }, false); return t; } final int table_cat = 0; final int table_schem = 1; final int table_name = 2; final int column_name = 3; final int sequence_catalog = 4; final int sequence_schema = 5; final int sequence_name = 6; // // intermediate holders int columnCount; Iterator tables; Table table; Object[] row; OrderedHashSet columnList; NumberSequence sequence; // Initialization tables = allTables(); while (tables.hasNext()) { table = (Table) tables.next(); if (!table.hasIdentityColumn()) { continue; } columnList = session.getGrantee().getColumnsForAllPrivileges(table); if (columnList.isEmpty()) { continue; } columnCount = table.getColumnCount(); for (int i = 0; i < columnCount; i++) { ColumnSchema column = table.getColumn(i); if (!column.isIdentity()) { continue; } sequence = column.getIdentitySequence(); if (sequence.getName() == null) { continue; } if (!columnList.contains(column.getName())) { continue; } row = t.getEmptyRowData(); row[table_cat] = database.getCatalogName().name; row[table_schem] = table.getSchemaName().name; row[table_name] = table.getName().name; row[column_name] = column.getName().name; row[sequence_catalog] = database.getCatalogName().name; row[sequence_schema] = sequence.getSchemaName().name; row[sequence_name] = sequence.getName().name; t.insertSys(session, store, row); } } return t; } Table SYSTEM_COMMENTS(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_COMMENTS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_COMMENTS]); addColumn(t, "OBJECT_CATALOG", SQL_IDENTIFIER); addColumn(t, "OBJECT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "OBJECT_NAME", SQL_IDENTIFIER); // not null addColumn(t, "OBJECT_TYPE", SQL_IDENTIFIER); addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); addColumn(t, "COMMENT", CHARACTER_DATA); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_COMMENTS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4 }, false); return t; } // column number mappings final int catalog = 0; final int schema = 1; final int name = 2; final int type = 3; final int column_name = 4; final int remark = 5; // Iterator it; Object[] row; // DITableInfo ti = new DITableInfo(); it = allTables(); while (it.hasNext()) { Table table = (Table) it.next(); if (!session.getGrantee().isAccessible(table)) { continue; } ti.setTable(table); int colCount = table.getColumnCount(); for (int i = 0; i < colCount; i++) { ColumnSchema column = table.getColumn(i); if (column.getName().comment == null) { continue; } row = t.getEmptyRowData(); row[catalog] = database.getCatalogName().name; row[schema] = table.getSchemaName().name; row[name] = table.getName().name; row[type] = "COLUMN"; row[column_name] = column.getName().name; row[remark] = column.getName().comment; t.insertSys(session, store, row); } if (table.getTableType() != Table.INFO_SCHEMA_TABLE && table.getName().comment == null) { continue; } row = t.getEmptyRowData(); row[catalog] = database.getCatalogName().name; row[schema] = table.getSchemaName().name; row[name] = table.getName().name; row[type] = table.isView() || table.getTableType() == Table.INFO_SCHEMA_TABLE ? "VIEW" : "TABLE"; row[column_name] = null; row[remark] = ti.getRemark(); t.insertSys(session, store, row); } it = database.schemaManager.databaseObjectIterator( SchemaObject.ROUTINE); while (it.hasNext()) { SchemaObject object = (SchemaObject) it.next(); if (!session.getGrantee().isAccessible(object)) { continue; } if (object.getName().comment == null) { continue; } row = t.getEmptyRowData(); row[catalog] = database.getCatalogName().name; row[schema] = object.getSchemaName().name; row[name] = object.getName().name; row[type] = "ROUTINE"; row[column_name] = null; row[remark] = object.getName().comment; t.insertSys(session, store, row); } return t; } /** * Retrieves a Table object describing the capabilities * and operating parameter properties for the engine hosting this * database, as well as their applicability in terms of scope and * name space.

              * * Reported properties include certain predefined Database * properties file values as well as certain database scope * attributes.

              * * It is intended that all Database attributes and * properties that can be set via the database properties file, * JDBC connection properties or SQL SET/ALTER statements will * eventually be reported here or, where more applicable, in an * ANSI/ISO conforming feature info base table in the defintion * schema.

              * * Currently, the database properties reported are:

              * *

                *
              1. hsqldb.cache_file_scale - the scaling factor used to translate data and index structure file pointers *
              2. hsqldb.cache_scale - base-2 exponent scaling allowable cache row count *
              3. hsqldb.cache_size_scale - base-2 exponent scaling allowable cache byte count *
              4. hsqldb.cache_version - *
              5. hsqldb.catalogs - whether to report the database catalog (database uri) *
              6. hsqldb.compatible_version - *
              7. hsqldb.files_readonly - whether the database is in files_readonly mode *
              8. hsqldb.gc_interval - # new records forcing gc ({0|NULL}=>never) *
              9. hsqldb.max_nio_scale - scale factor for cache nio mapped buffers *
              10. hsqldb.nio_data_file - whether cache uses nio mapped buffers *
              11. hsqldb.original_version - *
              12. sql.enforce_strict_size - column length specifications enforced strictly (raise exception on overflow)? *
              13. textdb.all_quoted - default policy regarding whether to quote all character field values *
              14. textdb.cache_scale - base-2 exponent scaling allowable cache row count *
              15. textdb.cache_size_scale - base-2 exponent scaling allowable cache byte count *
              16. textdb.encoding - default TEXT table file encoding *
              17. textdb.fs - default field separator *
              18. textdb.vs - default varchar field separator *
              19. textdb.lvs - default long varchar field separator *
              20. textdb.ignore_first - default policy regarding whether to ignore the first line *
              21. textdb.quoted - default policy regarding treatement character field values that _may_ require quoting *
              22. IGNORECASE - create table VARCHAR_IGNORECASE? *
              23. LOGSIZSE - # bytes to which REDO log grows before auto-checkpoint *
              24. REFERENTIAL_INTEGITY - currently enforcing referential integrity? *
              25. SCRIPTFORMAT - 0 : TEXT, 1 : BINARY, ... *
              26. WRITEDELAY - does REDO log currently use buffered write strategy? *

              * * @return table describing database and session operating parameters * and capabilities */ Table SYSTEM_PROPERTIES(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_PROPERTIES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_PROPERTIES]); addColumn(t, "PROPERTY_SCOPE", CHARACTER_DATA); addColumn(t, "PROPERTY_NAMESPACE", CHARACTER_DATA); addColumn(t, "PROPERTY_NAME", CHARACTER_DATA); addColumn(t, "PROPERTY_VALUE", CHARACTER_DATA); addColumn(t, "PROPERTY_CLASS", CHARACTER_DATA); // order PROPERTY_SCOPE, PROPERTY_NAMESPACE, PROPERTY_NAME // true PK HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_PROPERTIES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2 }, true); return t; } // column number mappings final int iscope = 0; final int ins = 1; final int iname = 2; final int ivalue = 3; final int iclass = 4; // // calculated column values String scope; String nameSpace; // intermediate holders Object[] row; HsqlDatabaseProperties props; // First, we want the names and values for // all JDBC capabilities constants scope = "SESSION"; props = database.getProperties(); nameSpace = "database.properties"; // boolean properties Iterator it = props.getUserDefinedPropertyData().iterator(); while (it.hasNext()) { Object[] metaData = (Object[]) it.next(); row = t.getEmptyRowData(); row[iscope] = scope; row[ins] = nameSpace; row[iname] = metaData[HsqlProperties.indexName]; row[ivalue] = database.logger.getValueStringForProperty((String) row[iname]); if (row[ivalue] == null) { row[ivalue] = props.getPropertyString((String) row[iname]); } row[iclass] = metaData[HsqlProperties.indexClass]; t.insertSys(session, store, row); } return t; } /** * Retrieves a Table object describing attributes * for the calling session context.

              * * The rows report the following {key,value} pairs:

              * *

                   * KEY (VARCHAR)       VALUE (VARCHAR)
                   * ------------------- ---------------
                   * AUTOCOMMIT          TRUE / FALSE (session is in autocommit mode or not)
                   * CURRENT SCHEMA      the name of current schema
                   * CURRENT STATEMENT   current SQL statement
                   * DATABASE            the name of the database
                   * DATABASE READONLY   TRUE / FALSE (database is in read-only mode or not)
                   * IDENTITY            the last identity value used by calling session
                   * IGNORECASE          IGNORECASE property for new VARCHAR columns
                   * ISOLATION_LEVEL     transaction isolation level of session
                   * SESSION_ID          the id of the calling session
                   * SESSION READONLY    TRUE / FALSE (session is in read-only mode or not)
                   * USER                the name of user connected in the calling session
                   * 
              * * Note: This table may become deprecated in a future * release, as the information it reports now duplicates information * reported in the newer SYSTEM_SESSIONS and SYSTEM_PROPERTIES * tables.

              * * @return a Table object describing the * attributes of the connection associated * with the current execution context */ Table SYSTEM_SESSIONINFO(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_SESSIONINFO]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_SESSIONINFO]); addColumn(t, "KEY", CHARACTER_DATA); // not null addColumn(t, "VALUE", CHARACTER_DATA); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_SESSIONINFO].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, true); return t; } Object[] row; row = t.getEmptyRowData(); row[0] = "SESSION ID"; row[1] = String.valueOf(session.getId()); t.insertSys(session, store, row); row = t.getEmptyRowData(); row[0] = "AUTOCOMMIT"; row[1] = session.isAutoCommit() ? Tokens.T_TRUE : Tokens.T_FALSE; t.insertSys(session, store, row); row = t.getEmptyRowData(); row[0] = "USER"; row[1] = session.getUsername(); t.insertSys(session, store, row); row = t.getEmptyRowData(); row[0] = "SESSION READONLY"; row[1] = session.isReadOnlyDefault() ? Tokens.T_TRUE : Tokens.T_FALSE; t.insertSys(session, store, row); row = t.getEmptyRowData(); row[0] = "DATABASE READONLY"; row[1] = database.isReadOnly() ? Tokens.T_TRUE : Tokens.T_FALSE; t.insertSys(session, store, row); row = t.getEmptyRowData(); row[0] = "DATABASE"; row[1] = database.getURI(); t.insertSys(session, store, row); row = t.getEmptyRowData(); row[0] = "IDENTITY"; row[1] = String.valueOf(session.getLastIdentity()); t.insertSys(session, store, row); row = t.getEmptyRowData(); row[0] = "CURRENT SCHEMA"; row[1] = String.valueOf(session.getSchemaName(null)); t.insertSys(session, store, row); row = t.getEmptyRowData(); row[0] = "ISOLATION LEVEL"; row[1] = String.valueOf(session.getIsolation()); t.insertSys(session, store, row); row = t.getEmptyRowData(); row[0] = "IGNORECASE"; row[1] = session.isIgnorecase() ? Tokens.T_TRUE : Tokens.T_FALSE; t.insertSys(session, store, row); row = t.getEmptyRowData(); row[0] = "CURRENT STATEMENT"; row[1] = ""; Statement st = session.sessionContext.currentStatement; if (st != null) { row[1] = st.getSQL(); } t.insertSys(session, store, row); return t; } /** * Retrieves a Table object describing all visible * sessions. ADMIN users see *all* sessions * while non-admin users see only their own session.

              * * Each row is a session state description with the following columns:

              * *

                   * SESSION_ID         BIGINT    session identifier
                   * CONNECTED          TIMESTAMP time at which session was created
                   * USER_NAME          VARCHAR   db user name of current session user
                   * IS_ADMIN           BOOLEAN   is session user an admin user?
                   * AUTOCOMMIT         BOOLEAN   is session in autocommit mode?
                   * READONLY           BOOLEAN   is session in read-only mode?
                   * LAST_IDENTITY      BIGINT    last identity value used by this session
                   * SCHEMA             VARCHAR   current schema for session
                   * TRANSACTION        BOOLEAN   is session in a transaction
                   * TRANSACTION_SIZE   BIGINT    # of undo items in current transaction
                   * WAITING_FOR_THIS   VARCHAR   comma separated list of sessions waiting for this one
                   * THIS_WAITING_FOR   VARCHAR   comma separated list of sessions this session is waiting for
                   * CURRENT_STATEMENT  VARCHAR   SQL statement currently running
                   * LATCH_COUNT        INTEGER   latch count for session
                   * 

              * * @return a Table object describing all visible * sessions */ Table SYSTEM_SESSIONS(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_SESSIONS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_SESSIONS]); addColumn(t, "SESSION_ID", CARDINAL_NUMBER); addColumn(t, "CONNECTED", TIME_STAMP); addColumn(t, "USER_NAME", SQL_IDENTIFIER); addColumn(t, "IS_ADMIN", Type.SQL_BOOLEAN); addColumn(t, "AUTOCOMMIT", Type.SQL_BOOLEAN); addColumn(t, "READONLY", Type.SQL_BOOLEAN); // Note: some sessions may have a NULL LAST_IDENTITY value addColumn(t, "LAST_IDENTITY", CARDINAL_NUMBER); addColumn(t, "SCHEMA", SQL_IDENTIFIER); addColumn(t, "TRANSACTION", Type.SQL_BOOLEAN); addColumn(t, "TRANSACTION_SIZE", CARDINAL_NUMBER); addColumn(t, "WAITING_FOR_THIS", CHARACTER_DATA); addColumn(t, "THIS_WAITING_FOR", CHARACTER_DATA); addColumn(t, "CURRENT_STATEMENT", CHARACTER_DATA); addColumn(t, "LATCH_COUNT", CARDINAL_NUMBER); // order: SESSION_ID // true primary key HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_SESSIONS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, true); return t; } // column number mappings final int isid = 0; final int ict = 1; final int iuname = 2; final int iis_admin = 3; final int iautocmt = 4; final int ireadonly = 5; final int ilast_id = 6; final int it_schema = 7; final int it_tx = 8; final int it_size = 9; final int it_waiting = 10; final int it_waited = 11; final int it_statement = 12; final int it_latch_count = 13; // // intermediate holders Session[] sessions; Session s; Object[] row; // Initialisation sessions = database.sessionManager.getVisibleSessions(session); // Do it. for (int i = 0; i < sessions.length; i++) { if (sessions[i].isClosed()) { continue; } s = sessions[i]; row = t.getEmptyRowData(); row[isid] = ValuePool.getLong(s.getId()); row[ict] = new TimestampData(s.getConnectTime() / 1000); row[iuname] = s.getUsername(); row[iis_admin] = ValuePool.getBoolean(s.isAdmin()); row[iautocmt] = s.sessionContext.isAutoCommit; row[ireadonly] = s.isReadOnlyDefault; Number lastId = s.getLastIdentity(); if (lastId != null) { row[ilast_id] = ValuePool.getLong(lastId.longValue()); } row[it_tx] = Boolean.valueOf(s.isInMidTransaction()); row[it_size] = ValuePool.getLong(s.getTransactionSize()); HsqlName name = s.getCurrentSchemaHsqlName(); if (name != null) { row[it_schema] = name.name; } row[it_waiting] = ""; row[it_waited] = ""; if (s.waitingSessions.size() > 0) { StringBuffer sb = new StringBuffer(); Session[] array = new Session[s.waitingSessions.size()]; s.waitingSessions.toArray(array); for (int j = 0; j < array.length; j++) { if (j > 0) { sb.append(','); } sb.append(array[j].getId()); } row[it_waiting] = sb.toString(); } if (s.waitedSessions.size() > 0) { StringBuffer sb = new StringBuffer(); Session[] array = new Session[s.waitedSessions.size()]; s.waitedSessions.toArray(array); for (int j = 0; j < array.length; j++) { if (j > 0) { sb.append(','); } sb.append(array[j].getId()); } row[it_waited] = sb.toString(); } Statement st = s.sessionContext.currentStatement; row[it_statement] = st == null ? "" : st.getSQL(); row[it_latch_count] = new Long(s.latch.getCount()); t.insertSys(session, store, row); } return t; } /** * Retrieves a Table object describing the TEXT TABLE objects * defined within this database. The table contains one row for each row * in the SYSTEM_TABLES table with a HSQLDB_TYPE of TEXT .

              * * Each row is a description of the attributes that defines its TEXT TABLE, * with the following columns: * *

                   * TABLE_CAT                 VARCHAR   table's catalog name
                   * TABLE_SCHEM               VARCHAR   table's simple schema name
                   * TABLE_NAME                VARCHAR   table's simple name
                   * DATA_SOURCE_DEFINITION    VARCHAR   the "spec" proption of the table's
                   *                                     SET TABLE ... SOURCE DDL declaration
                   * FILE_PATH                 VARCHAR   absolute file path.
                   * FILE_ENCODING             VARCHAR   endcoding of table's text file
                   * FIELD_SEPARATOR           VARCHAR   default field separator
                   * VARCHAR_SEPARATOR         VARCAHR   varchar field separator
                   * LONGVARCHAR_SEPARATOR     VARCHAR   longvarchar field separator
                   * IS_IGNORE_FIRST           BOOLEAN   ignores first line of file?
                   * IS_QUOTED                 BOOLEAN   fields are quoted if necessary?
                   * IS_ALL_QUOTED             BOOLEAN   all fields are quoted?
                   * IS_DESC                   BOOLEAN   read rows starting at end of file?
                   * 

              * * @return a Table object describing the text attributes * of the accessible text tables defined within this database * */ Table SYSTEM_TEXTTABLES(Session session, PersistentStore store) { Table t = sysTables[SYSTEM_TEXTTABLES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SYSTEM_TEXTTABLES]); addColumn(t, "TABLE_CAT", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEM", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "DATA_SOURCE_DEFINTION", CHARACTER_DATA); addColumn(t, "FILE_PATH", CHARACTER_DATA); addColumn(t, "FILE_ENCODING", CHARACTER_DATA); addColumn(t, "FIELD_SEPARATOR", CHARACTER_DATA); addColumn(t, "VARCHAR_SEPARATOR", CHARACTER_DATA); addColumn(t, "LONGVARCHAR_SEPARATOR", CHARACTER_DATA); addColumn(t, "IS_IGNORE_FIRST", Type.SQL_BOOLEAN); addColumn(t, "IS_ALL_QUOTED", Type.SQL_BOOLEAN); addColumn(t, "IS_QUOTED", Type.SQL_BOOLEAN); addColumn(t, "IS_DESC", Type.SQL_BOOLEAN); // ------------------------------------------------------------ HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SYSTEM_TEXTTABLES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, }, false); return t; } // column number mappings final int itable_cat = 0; final int itable_schem = 1; final int itable_name = 2; final int idsd = 3; final int ifile_path = 4; final int ifile_enc = 5; final int ifs = 6; final int ivfs = 7; final int ilvfs = 8; final int iif = 9; final int iiq = 10; final int iiaq = 11; final int iid = 12; // // intermediate holders Iterator tables; Table table; Object[] row; // Initialization tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); // Do it. while (tables.hasNext()) { table = (Table) tables.next(); PersistentStore currentStore = table.getRowStore(session); if (!table.isText() || !isAccessibleTable(session, table)) { continue; } row = t.getEmptyRowData(); row[itable_cat] = database.getCatalogName().name; row[itable_schem] = table.getSchemaName().name; row[itable_name] = table.getName().name; row[idsd] = ((TextTable) table).getDataSource(); TextCache cache = (TextCache) currentStore.getCache(); if (cache != null) { TextFileSettings textFileSettings = cache.getTextFileSettings(); row[ifile_path] = FileUtil.getFileUtil().canonicalOrAbsolutePath( cache.getFileName()); row[ifile_enc] = textFileSettings.stringEncoding; row[ifs] = textFileSettings.fs; row[ivfs] = textFileSettings.vs; row[ilvfs] = textFileSettings.lvs; row[iif] = ValuePool.getBoolean(textFileSettings.ignoreFirst); row[iiq] = ValuePool.getBoolean(textFileSettings.isQuoted); row[iiaq] = ValuePool.getBoolean(textFileSettings.isAllQuoted); row[iid] = ((TextTable) table).isDescDataSource() ? Boolean.TRUE : Boolean.FALSE; } t.insertSys(session, store, row); } return t; } //------------------------------------------------------------------------------ // SQL SCHEMATA VIEWS /** * SQL:2008 VIEW

              * * ADMINISTRABLE_ROLE_AUTHORIZATIONS

              * * Returns roles that are grantable by an admin user, which means all the * roles. * * @return Table */ Table ADMINISTRABLE_ROLE_AUTHORIZATIONS(Session session, PersistentStore store) { Table t = sysTables[ADMINISTRABLE_ROLE_AUTHORIZATIONS]; if (t == null) { t = createBlankTable( sysTableHsqlNames[ADMINISTRABLE_ROLE_AUTHORIZATIONS]); addColumn(t, "GRANTEE", SQL_IDENTIFIER); addColumn(t, "ROLE_NAME", SQL_IDENTIFIER); addColumn(t, "IS_GRANTABLE", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ADMINISTRABLE_ROLE_AUTHORIZATIONS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2 }, false); return t; } if (session.isAdmin()) { insertRoles(session, t, session.getGrantee(), true); } return t; } /** * SQL:2008 VIEW

              * * APPLICABLE_ROLES

              * * Identifies the applicable roles for the current user.

              * * Definition

              * *

                   * CREATE RECURSIVE VIEW APPLICABLE_ROLES ( GRANTEE, ROLE_NAME, IS_GRANTABLE ) AS
                   *      ( ( SELECT GRANTEE, ROLE_NAME, IS_GRANTABLE
                   *            FROM DEFINITION_SCHEMA.ROLE_AUTHORIZATION_DESCRIPTORS
                   *           WHERE ( GRANTEE IN ( CURRENT_USER, 'PUBLIC' )
                   *                OR GRANTEE IN ( SELECT ROLE_NAME
                   *                                  FROM ENABLED_ROLES ) ) )
                   *      UNION
                   *      ( SELECT RAD.GRANTEE, RAD.ROLE_NAME, RAD.IS_GRANTABLE
                   *          FROM DEFINITION_SCHEMA.ROLE_AUTHORIZATION_DESCRIPTORS RAD
                   *          JOIN APPLICABLE_ROLES R
                   *            ON RAD.GRANTEE = R.ROLE_NAME ) );
                   *
                   * GRANT SELECT ON TABLE APPLICABLE_ROLES
                   *    TO PUBLIC WITH GRANT OPTION;
                   * 
              */ Table APPLICABLE_ROLES(Session session, PersistentStore store) { Table t = sysTables[APPLICABLE_ROLES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[APPLICABLE_ROLES]); addColumn(t, "GRANTEE", SQL_IDENTIFIER); addColumn(t, "ROLE_NAME", SQL_IDENTIFIER); addColumn(t, "IS_GRANTABLE", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[APPLICABLE_ROLES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2 }, false); return t; } insertRoles(session, t, session.getGrantee(), session.isAdmin()); return t; } private void insertRoles(Session session, Table t, Grantee role, boolean isGrantable) { final int grantee = 0; final int role_name = 1; final int is_grantable = 2; PersistentStore store = t.getRowStore(session); if (isGrantable) { Set roles = database.getGranteeManager().getRoleNames(); Iterator it = roles.iterator(); while (it.hasNext()) { String roleName = (String) it.next(); Object[] row = t.getEmptyRowData(); row[grantee] = role.getName().getNameString(); row[role_name] = roleName; row[is_grantable] = Tokens.T_YES; t.insertSys(session, store, row); } } else { OrderedHashSet roles = role.getDirectRoles(); for (int i = 0; i < roles.size(); i++) { String roleName = (String) roles.get(i); Object[] row = t.getEmptyRowData(); row[grantee] = role.getName().getNameString(); row[role_name] = roleName; row[is_grantable] = Tokens.T_NO; t.insertSys(session, store, row); role = database.getGranteeManager().getRole(roleName); insertRoles(session, t, role, isGrantable); } } } /** * SQL:2008 VIEW

              * * The ASSERTIONS view is empty.

              * */ Table ASSERTIONS(Session session, PersistentStore store) { Table t = sysTables[ASSERTIONS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ASSERTIONS]); addColumn(t, "CONSTRAINT_CATALOG", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_NAME", SQL_IDENTIFIER); // not null addColumn(t, "IS_DEFERRABLE", YES_OR_NO); addColumn(t, "INITIALLY_DEFERRED", YES_OR_NO); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ASSERTIONS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2 }, false); return t; } final int constraint_catalog = 0; final int constraint_schema = 1; final int constraint_name = 2; final int is_deferrable = 3; final int initially_deferred = 4; return t; } /** * SQL:2008 VIEW

              * * SYSTEM_AUTHORIZATIONS

              * * The AUTHORIZATIONS table has one row for each <role name> and * one row for each <authorization identifier > referenced in the * Information Schema. These are the <role name>s and * <authorization identifier>s that may grant privileges as well as * those that may create a schema, or currently own a schema created * through a <schema definition>.

              * * Definition

              * *

                   *  CREATE TABLE AUTHORIZATIONS (
                   *       AUTHORIZATION_NAME INFORMATION_SCHEMA.SQL_IDENTIFIER,
                   *       AUTHORIZATION_TYPE INFORMATION_SCHEMA.CHARACTER_DATA
                   *           CONSTRAINT AUTHORIZATIONS_AUTHORIZATION_TYPE_NOT_NULL
                   *               NOT NULL
                   *           CONSTRAINT AUTHORIZATIONS_AUTHORIZATION_TYPE_CHECK
                   *               CHECK ( AUTHORIZATION_TYPE IN ( 'USER', 'ROLE' ) ),
                   *           CONSTRAINT AUTHORIZATIONS_PRIMARY_KEY
                   *               PRIMARY KEY (AUTHORIZATION_NAME)
                   *       )
                   *  
              * * Description

              * *

                *
              1. The values of AUTHORIZATION_TYPE have the following meanings:

                * * * * * * * * * * *
                USERThe value of AUTHORIZATION_NAME is a known * <user identifier>.
                NOThe value of AUTHORIZATION_NAME is a <role * name> defined by a <role definition>.

                *

              * * @return Table */ Table AUTHORIZATIONS(Session session, PersistentStore store) { Table t = sysTables[AUTHORIZATIONS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[AUTHORIZATIONS]); addColumn(t, "AUTHORIZATION_NAME", SQL_IDENTIFIER); // not null addColumn(t, "AUTHORIZATION_TYPE", SQL_IDENTIFIER); // not null // true PK HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[AUTHORIZATIONS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, true); return t; } // Intermediate holders Iterator grantees; Grantee grantee; Object[] row; // initialization grantees = session.getGrantee().visibleGrantees().iterator(); // Do it. while (grantees.hasNext()) { grantee = (Grantee) grantees.next(); row = t.getEmptyRowData(); row[0] = grantee.getName().getNameString(); row[1] = grantee.isRole() ? "ROLE" : "USER"; t.insertSys(session, store, row); } return t; } Table CHARACTER_SETS(Session session, PersistentStore store) { Table t = sysTables[CHARACTER_SETS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[CHARACTER_SETS]); addColumn(t, "CHARACTER_SET_CATALOG", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_NAME", SQL_IDENTIFIER); addColumn(t, "CHARACTER_REPERTOIRE", SQL_IDENTIFIER); addColumn(t, "FORM_OF_USE", SQL_IDENTIFIER); addColumn(t, "DEFAULT_COLLATE_CATALOG", SQL_IDENTIFIER); addColumn(t, "DEFAULT_COLLATE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "DEFAULT_COLLATE_NAME", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[CHARACTER_SETS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2 }, false); return t; } final int character_set_catalog = 0; final int character_set_schema = 1; final int character_set_name = 2; final int character_repertoire = 3; final int form_of_use = 4; final int default_collate_catalog = 5; final int default_collate_schema = 6; final int default_collate_name = 7; // Iterator it = database.schemaManager.databaseObjectIterator( SchemaObject.CHARSET); while (it.hasNext()) { Charset charset = (Charset) it.next(); if (!session.getGrantee().isAccessible(charset)) { continue; } Object[] data = t.getEmptyRowData(); data[character_set_catalog] = database.getCatalogName().name; data[character_set_schema] = charset.getSchemaName().name; data[character_set_name] = charset.getName().name; data[character_repertoire] = "UCS"; data[form_of_use] = "UTF16"; data[default_collate_catalog] = data[character_set_catalog]; if (charset.base == null) { data[default_collate_schema] = data[character_set_schema]; data[default_collate_name] = data[character_set_name]; } else { data[default_collate_schema] = charset.base.schema.name; data[default_collate_name] = charset.base.name; } t.insertSys(session, store, data); } return t; } /** * SQL:2008 VIEW

              * * The CHECK_CONSTRAINT_ROUTINE_USAGE view has one row for each * SQL-invoked routine identified as the subject routine of either a * <routine invocation>, a <method reference>, a * <method invocation>, or a <static method invocation> * contained in an <assertion definition>, a <domain * constraint>, or a <table constraint definition>.

              * * Definition:

              * *

                   * CREATE TABLE SYSTEM_CHECK_ROUTINE_USAGE (
                   *      CONSTRAINT_CATALOG      VARCHAR NULL,
                   *      CONSTRAINT_SCHEMA       VARCHAR NULL,
                   *      CONSTRAINT_NAME         VARCHAR NOT NULL,
                   *      SPECIFIC_CATALOG        VARCHAR NULL,
                   *      SPECIFIC_SCHEMA         VARCHAR NULL,
                   *      SPECIFIC_NAME           VARCHAR NOT NULL,
                   *      UNIQUE( CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME,
                   *              SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME )
                   * )
                   * 
              * * Description:

              * *

                *
              1. The CHECK_ROUTINE_USAGE table has one row for each * SQL-invoked routine R identified as the subject routine of either a * <routine invocation>, a <method reference>, a <method * invocation>, or a <static method invocation> contained in * an <assertion definition> or in the <check constraint * definition> contained in either a <domain constraint> or a * <table constraint definition>.

                * *

              2. The values of CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, and * CONSTRAINT_NAME are the catalog name, schema name, and * identifier, respectively, of the assertion or check * constraint being described.

                * *

              3. The values of SPECIFIC_CATALOG, SPECIFIC_SCHEMA, and SPECIFIC_NAME * are the catalog name, schema name, and qualified * identifier, respectively, of the specific name of R.

                * * <1i> Routines are reported only if the user or one of its roles is * the authorization (owner) of the routine. * *

              * * @return Table */ Table CHECK_CONSTRAINT_ROUTINE_USAGE(Session session, PersistentStore store) { Table t = sysTables[CHECK_CONSTRAINT_ROUTINE_USAGE]; if (t == null) { t = createBlankTable( sysTableHsqlNames[CHECK_CONSTRAINT_ROUTINE_USAGE]); addColumn(t, "CONSTRAINT_CATALOG", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_NAME", SQL_IDENTIFIER); // not null addColumn(t, "SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[CHECK_CONSTRAINT_ROUTINE_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5 }, false); return t; } // column number mappings final int constraint_catalog = 0; final int constraint_schema = 1; final int constraint_name = 2; final int specific_catalog = 3; final int specific_schema = 4; final int specific_name = 5; // // Intermediate holders Iterator constraints; Constraint constraint; OrderedHashSet references; Object[] row; constraints = database.schemaManager.databaseObjectIterator( SchemaObject.CONSTRAINT); while (constraints.hasNext()) { HsqlName constraintName = (HsqlName) constraints.next(); if (constraintName.parent == null) { continue; } switch (constraintName.parent.type) { case SchemaObject.TABLE : { Table table; try { table = (Table) database.schemaManager.getSchemaObject( constraintName.parent.name, constraintName.parent.schema.name, SchemaObject.TABLE); } catch (Exception e) { continue; } constraint = table.getConstraint(constraintName.name); if (constraint.getConstraintType() != SchemaObject.ConstraintTypes.CHECK) { continue; } break; } case SchemaObject.DOMAIN : { Type domain; try { domain = (Type) database.schemaManager.getSchemaObject( constraintName.parent.name, constraintName.parent.schema.name, SchemaObject.DOMAIN); } catch (Exception e) { continue; } constraint = domain.userTypeModifier.getConstraint( constraintName.name); } default : continue; } references = constraint.getReferences(); for (int i = 0; i < references.size(); i++) { HsqlName name = (HsqlName) references.get(i); if (name.type != SchemaObject.SPECIFIC_ROUTINE) { continue; } if (!session.getGrantee().isFullyAccessibleByRole(name)) { continue; } row = t.getEmptyRowData(); row[constraint_catalog] = database.getCatalogName().name; row[constraint_schema] = constraint.getSchemaName().name; row[constraint_name] = constraint.getName().name; row[specific_catalog] = database.getCatalogName().name; row[specific_schema] = name.schema.name; row[specific_name] = name.name; t.insertSys(session, store, row); } } return t; } /** * SQL:2008 VIEW

              * * The CHECK_CONSTRAINTS view has one row for each domain * constraint, table check constraint, and assertion.

              * * Definition:

              * *

                   *      CONSTRAINT_CATALOG  VARCHAR NULL,
                   *      CONSTRAINT_SCHEMA   VARCHAR NULL,
                   *      CONSTRAINT_NAME     VARCHAR NOT NULL,
                   *      CHECK_CLAUSE        VARCHAR NOT NULL,
                   * 
              * * Description:

              * *

                *
              1. A constraint is shown in this view if the authorization for the * schema that contains the constraint is the current user or is a role * assigned to the current user.

                * *

              2. The values of CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA and * CONSTRAINT_NAME are the catalog name, schema name, * and identifier, respectively, of the constraint being * described.

                * *

              3. the value of CHECK_CLAUSE is that character representation of * the search condition contained in the check constraint. * * <1i> Constraints are reported only if the user or one of its roles is * the authorization (owner) of the table. *
              * * @return Table */ Table CHECK_CONSTRAINTS(Session session, PersistentStore store) { Table t = sysTables[CHECK_CONSTRAINTS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[CHECK_CONSTRAINTS]); addColumn(t, "CONSTRAINT_CATALOG", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_NAME", SQL_IDENTIFIER); // not null addColumn(t, "CHECK_CLAUSE", CHARACTER_DATA); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[CHECK_CONSTRAINTS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 2, 1, 0 }, false); return t; } // column number mappings final int constraint_catalog = 0; final int constraint_schema = 1; final int constraint_name = 2; final int check_clause = 3; // // calculated column values // Intermediate holders Iterator tables; Table table; Constraint[] tableConstraints; int constraintCount; Constraint constraint; Object[] row; // tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); while (tables.hasNext()) { table = (Table) tables.next(); if (table.isView() || !session.getGrantee().isFullyAccessibleByRole( table.getName())) { continue; } tableConstraints = table.getConstraints(); constraintCount = tableConstraints.length; for (int i = 0; i < constraintCount; i++) { constraint = tableConstraints[i]; if (constraint.getConstraintType() != SchemaObject.ConstraintTypes.CHECK) { continue; } row = t.getEmptyRowData(); row[constraint_catalog] = database.getCatalogName().name; row[constraint_schema] = table.getSchemaName().name; row[constraint_name] = constraint.getName().name; try { row[check_clause] = constraint.getCheckSQL(); } catch (Exception e) {} t.insertSys(session, store, row); } } Iterator it = database.schemaManager.databaseObjectIterator(SchemaObject.DOMAIN); while (it.hasNext()) { Type domain = (Type) it.next(); if (!domain.isDomainType()) { continue; } if (!session.getGrantee().isFullyAccessibleByRole( domain.getName())) { continue; } tableConstraints = domain.userTypeModifier.getConstraints(); constraintCount = tableConstraints.length; for (int i = 0; i < constraintCount; i++) { constraint = tableConstraints[i]; row = t.getEmptyRowData(); row[constraint_catalog] = database.getCatalogName().name; row[constraint_schema] = domain.getSchemaName().name; row[constraint_name] = constraint.getName().name; try { row[check_clause] = constraint.getCheckSQL(); } catch (Exception e) {} t.insertSys(session, store, row); } } return t; } /** * SQL:2008 VIEW

              * * COLLATIONS

              * * The COLLATIONS view has one row for each character collation * descriptor.

              * * Definition * *

                   * CREATE TABLE COLLATIONS (
                   *      COLLATION_CATALOG INFORMATION_SCHEMA.SQL_IDENTIFIER,
                   *      COLLATION_SCHEMA INFORMATION_SCHEMA.SQL_IDENTIFIER,
                   *      COLLATION_NAME INFORMATION_SCHEMA.SQL_IDENTIFIER,
                   *      PAD_ATTRIBUTE INFORMATION_SCHEMA.CHARACTER_DATA
                   *          CONSTRAINT COLLATIONS_PAD_ATTRIBUTE_CHECK
                   *              CHECK ( PAD_ATTRIBUTE IN
                   *                  ( 'NO PAD', 'PAD SPACE' ) )
                   * )
                   * 
              * * Description

              * *

                *
              1. The values of COLLATION_CATALOG, COLLATION_SCHEMA, and * COLLATION_NAME are the catalog name, schema name, * and identifier, respectively, of the collation being * described.

                * *

              2. The values of PAD_ATTRIBUTE have the following meanings:

                * * * * * * * * * * *
                NO PADThe collation being described has the NO PAD * characteristic.
                PADThe collation being described has the PAD SPACE * characteristic.

                *

              * * @return Table */ Table COLLATIONS(Session session, PersistentStore store) { Table t = sysTables[COLLATIONS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[COLLATIONS]); addColumn(t, "COLLATION_CATALOG", SQL_IDENTIFIER); addColumn(t, "COLLATION_SCHEMA", SQL_IDENTIFIER); // not null addColumn(t, "COLLATION_NAME", SQL_IDENTIFIER); // not null addColumn(t, "PAD_ATTRIBUTE", CHARACTER_DATA); // false PK, as rows may have NULL COLLATION_CATALOG HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[COLLATIONS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2 }, false); return t; } // Column number mappings final int collation_catalog = 0; final int collation_schema = 1; final int collation_name = 2; final int pad_attribute = 3; // // Intermediate holders Iterator collations; Collation collation; String collationName; String collationSchema; String padAttribute = "PAD SPACE"; Object[] row; collations = database.schemaManager.databaseObjectIterator( SchemaObject.COLLATION); while (collations.hasNext()) { row = t.getEmptyRowData(); collation = (Collation) collations.next(); collationSchema = collation.getSchemaName().name; collationName = collation.getName().name; row[collation_catalog] = database.getCatalogName().name; row[collation_schema] = collationSchema; row[collation_name] = collationName; row[pad_attribute] = collation.isPadSpace() ? "PAD SPACE" : "NO PAD"; t.insertSys(session, store, row); } // Initialization collations = Collation.nameToJavaName.keySet().iterator(); // Do it. while (collations.hasNext()) { row = t.getEmptyRowData(); collationSchema = "INFORMATION_SCHEMA"; collationName = (String) collations.next(); row[collation_catalog] = database.getCatalogName().name; row[collation_schema] = collationSchema; row[collation_name] = collationName; row[pad_attribute] = padAttribute; t.insertSys(session, store, row); } return t; } /** * SQL:2008 VIEW

              * The COLUMN_COLUMN_USAGE view has one row for each column referenced by * a GENERATED column.

              * * Definition:

              * * TABLE_CATALOG VARCHAR * TABLE_SCHEMA VARCHAR * TABLE_NAME VARCHAR * COLUMN_NAME VARCHAR * DEPENDENT_COLUMN VARCHAR * * * * Description:

              * *

                *
              1. The values of TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, and * COLUMN_NAME are the catalog name, schema name, * identifier, and column name, respectively, of a column * defined as GENERATED ALWAYS.. * *
              2. The value of DEPENDENT_COLUMN is the name of generated column. The value * of COLUMN_NAME is the name of a column referenced by the generated * column. There may be multiple rows for each generated column. * * <1i> Columns are reported only if the user or one of its roles is * the authorization (owner) of the table. *
              *

              * * @return Table */ Table COLUMN_COLUMN_USAGE(Session session, PersistentStore store) { Table t = sysTables[COLUMN_COLUMN_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[COLUMN_COLUMN_USAGE]); addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); addColumn(t, "DEPENDENT_COLUMN", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[COLUMN_COLUMN_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4 }, false); return t; } final int table_catalog = 0; final int table_schema = 1; final int table_name = 2; final int column_name = 3; final int dependent_column = 4; // Iterator tables; Table table; Object[] row; tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); while (tables.hasNext()) { table = (Table) tables.next(); if (table.isView() || !session.getGrantee().isFullyAccessibleByRole( table.getName())) { continue; } if (!table.hasGeneratedColumn()) { continue; } HsqlName name = table.getName(); for (int i = 0; i < table.getColumnCount(); i++) { ColumnSchema column = table.getColumn(i); if (!column.isGenerated()) { continue; } OrderedHashSet set = column.getGeneratedColumnReferences(); if (set != null) { for (int j = 0; j < set.size(); j++) { row = t.getEmptyRowData(); row[table_catalog] = database.getCatalogName().name; row[table_schema] = name.schema.name; row[table_name] = name.name; row[column_name] = ((HsqlName) set.get(j)).name; row[dependent_column] = column.getName().name; t.insertSys(session, store, row); } } } } return t; } /** * SQL:2008 VIEW

              * The COLUMN_DOMAIN_USAGE view has one row for each column defined with a * a DOMAIN data type.

              * * Definition:

              * * DOMAIN_CATALOG VARCHAR * DOMAIN_SCHEMA VARCHAR * DOMAIN_NAME VARCHAR * TABLE_CATALOG VARCHAR * TABLE_SCHEMA VARCHAR * TABLE_NAME VARCHAR * COLUMN_NAME VARCHAR * * * * Description:

              * *

                *
              1. The values of DOMAIN_CATALOG, DOMAIN_SCHEMA and DOMAIN_NAME * are the catalog name, schema name, * name, respectively, of a DOMAIN data type. * *
              2. The values of TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, and * COLUMN_NAME are the catalog name, schema name, * identifier, and column name, respectively, of a column * defined with a DOMAIN data type. * * <1i> Columns are reported only if the user or one of its roles is * the authorization (owner) of the DOMAIN. *
              *

              * * @return Table */ Table COLUMN_DOMAIN_USAGE(Session session, PersistentStore store) { Table t = sysTables[COLUMN_DOMAIN_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[COLUMN_DOMAIN_USAGE]); addColumn(t, "DOMAIN_CATALOG", SQL_IDENTIFIER); addColumn(t, "DOMAIN_SCHEMA", SQL_IDENTIFIER); addColumn(t, "DOMAIN_NAME", SQL_IDENTIFIER); addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[COLUMN_DOMAIN_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5, 6 }, false); return t; } // column number mappings final int domain_catalog = 0; final int domain_schema = 1; final int domain_name = 2; final int table_catalog = 3; final int table_schema = 4; final int table_name = 5; final int column_name = 6; // intermediate holders int columnCount; Iterator tables; Table table; Object[] row; Type type; HsqlName tableName; // Initialization tables = allTables(); Grantee grantee = session.getGrantee(); while (tables.hasNext()) { table = (Table) tables.next(); columnCount = table.getColumnCount(); tableName = table.getName(); for (int i = 0; i < columnCount; i++) { ColumnSchema column = table.getColumn(i); type = column.getDataType(); if (!type.isDomainType()) { continue; } if (!grantee.isFullyAccessibleByRole(type.getName())) { continue; } row = t.getEmptyRowData(); row[domain_catalog] = database.getCatalogName().name; row[domain_schema] = type.getSchemaName().name; row[domain_name] = type.getName().name; row[table_catalog] = database.getCatalogName().name; row[table_schema] = tableName.schema.name; row[table_name] = tableName.name; row[column_name] = column.getNameString(); t.insertSys(session, store, row); } } return t; } /** * SQL:2008 VIEW

              * The COLUMN_DOMAIN_USAGE view has one row for each column defined with a * a DOMAIN data type.

              * * Definition:

              * * UDT_CATALOG VARCHAR * UDT_SCHEMA VARCHAR * UDT_NAME VARCHAR * TABLE_CATALOG VARCHAR * TABLE_SCHEMA VARCHAR * TABLE_NAME VARCHAR * COLUMN_NAME VARCHAR * * * * Description:

              * *

                *
              1. The values of UDT_CATALOG, UDT_SCHEMA and UDT_NAME * are the catalog name, schema name, * name, respectively, of a DISTINCT TYPE data type. * *
              2. The values of TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, and * COLUMN_NAME are the catalog name, schema name, * identifier, and column name, respectively, of a column * defined with a DICTINCT TYPE data type. * * <1i> Columns are reported only if the user or one of its roles is * the authorization (owner) of the DISTINCT TYPE. *
              *

              * * @return Table */ Table COLUMN_UDT_USAGE(Session session, PersistentStore store) { Table t = sysTables[COLUMN_UDT_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[COLUMN_UDT_USAGE]); addColumn(t, "UDT_CATALOG", SQL_IDENTIFIER); addColumn(t, "UDT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "UDT_NAME", SQL_IDENTIFIER); addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[COLUMN_UDT_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5, 6 }, false); return t; } // column number mappings final int udt_catalog = 0; final int udt_schema = 1; final int udt_name = 2; final int table_catalog = 3; final int table_schema = 4; final int table_name = 5; final int column_name = 6; // intermediate holders int columnCount; Iterator tables; Table table; Object[] row; Type type; HsqlName tableName; // Initialization tables = allTables(); Grantee grantee = session.getGrantee(); while (tables.hasNext()) { table = (Table) tables.next(); columnCount = table.getColumnCount(); tableName = table.getName(); for (int i = 0; i < columnCount; i++) { ColumnSchema column = table.getColumn(i); type = column.getDataType(); if (!type.isDistinctType()) { continue; } if (!grantee.isFullyAccessibleByRole(type.getName())) { continue; } row = t.getEmptyRowData(); row[udt_catalog] = database.getCatalogName().name; row[udt_schema] = type.getSchemaName().name; row[udt_name] = type.getName().name; row[table_catalog] = database.getCatalogName().name; row[table_schema] = tableName.schema.name; row[table_name] = tableName.name; row[column_name] = column.getNameString(); t.insertSys(session, store, row); } } return t; } /** * SQL:2008 VIEW

              * The COLUMNS view has one row for each column of each table or view. * The column, its data type characteristics, together with its * IDENTITY or GENERATED characteristics are reported in this view.

              *

                * <1i> Columns are reported only if the user or one of its roles is * the authorization (owner) of the table, or is granted any privilege * on the table or the column. * *
              * */ Table COLUMNS(Session session, PersistentStore store) { Table t = sysTables[COLUMNS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[COLUMNS]); addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); //0 addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); addColumn(t, "ORDINAL_POSITION", CARDINAL_NUMBER); addColumn(t, "COLUMN_DEFAULT", CHARACTER_DATA); addColumn(t, "IS_NULLABLE", YES_OR_NO); addColumn(t, "DATA_TYPE", CHARACTER_DATA); addColumn(t, "CHARACTER_MAXIMUM_LENGTH", CARDINAL_NUMBER); addColumn(t, "CHARACTER_OCTET_LENGTH", CARDINAL_NUMBER); addColumn(t, "NUMERIC_PRECISION", CARDINAL_NUMBER); //10 addColumn(t, "NUMERIC_PRECISION_RADIX", CARDINAL_NUMBER); addColumn(t, "NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "DATETIME_PRECISION", CARDINAL_NUMBER); addColumn(t, "INTERVAL_TYPE", CHARACTER_DATA); addColumn(t, "INTERVAL_PRECISION", CARDINAL_NUMBER); addColumn(t, "CHARACTER_SET_CATALOG", CHARACTER_DATA); addColumn(t, "CHARACTER_SET_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_NAME", SQL_IDENTIFIER); addColumn(t, "COLLATION_CATALOG", SQL_IDENTIFIER); addColumn(t, "COLLATION_SCHEMA", SQL_IDENTIFIER); //20 addColumn(t, "COLLATION_NAME", SQL_IDENTIFIER); addColumn(t, "DOMAIN_CATALOG", SQL_IDENTIFIER); addColumn(t, "DOMAIN_SCHEMA", SQL_IDENTIFIER); addColumn(t, "DOMAIN_NAME", SQL_IDENTIFIER); addColumn(t, "UDT_CATALOG", SQL_IDENTIFIER); addColumn(t, "UDT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "UDT_NAME", SQL_IDENTIFIER); addColumn(t, "SCOPE_CATALOG", SQL_IDENTIFIER); addColumn(t, "SCOPE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SCOPE_NAME", SQL_IDENTIFIER); //30 addColumn(t, "MAXIMUM_CARDINALITY", CARDINAL_NUMBER); // (only for array tyes) addColumn(t, "DTD_IDENTIFIER", SQL_IDENTIFIER); addColumn(t, "IS_SELF_REFERENCING", YES_OR_NO); addColumn(t, "IS_IDENTITY", YES_OR_NO); addColumn(t, "IDENTITY_GENERATION", CHARACTER_DATA); // ALWAYS / BY DEFAULT addColumn(t, "IDENTITY_START", CHARACTER_DATA); addColumn(t, "IDENTITY_INCREMENT", CHARACTER_DATA); addColumn(t, "IDENTITY_MAXIMUM", CHARACTER_DATA); addColumn(t, "IDENTITY_MINIMUM", CHARACTER_DATA); addColumn(t, "IDENTITY_CYCLE", YES_OR_NO); //40 addColumn(t, "IS_GENERATED", CHARACTER_DATA); // ALWAYS / NEVER addColumn(t, "GENERATION_EXPRESSION", CHARACTER_DATA); addColumn(t, "IS_UPDATABLE", YES_OR_NO); addColumn(t, "DECLARED_DATA_TYPE", CHARACTER_DATA); addColumn(t, "DECLARED_NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "DECLARED_NUMERIC_SCALE", CARDINAL_NUMBER); // order: TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION // added for unique: TABLE_CAT // false PK, as TABLE_SCHEM and/or TABLE_CAT may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[COLUMNS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 3, 2, 1, 4 }, false); return t; } // column number mappings final int table_cat = 0; final int table_schem = 1; final int table_name = 2; final int column_name = 3; final int ordinal_position = 4; final int column_default = 5; final int is_nullable = 6; final int data_type = 7; final int character_maximum_length = 8; final int character_octet_length = 9; final int numeric_precision = 10; final int numeric_precision_radix = 11; final int numeric_scale = 12; final int datetime_precision = 13; final int interval_type = 14; final int interval_precision = 15; final int character_set_catalog = 16; final int character_set_schema = 17; final int character_set_name = 18; final int collation_catalog = 19; final int collation_schema = 20; final int collation_name = 21; final int domain_catalog = 22; final int domain_schema = 23; final int domain_name = 24; final int udt_catalog = 25; final int udt_schema = 26; final int udt_name = 27; final int scope_catalog = 28; final int scope_schema = 29; final int scope_name = 30; final int maximum_cardinality = 31; final int dtd_identifier = 32; final int is_self_referencing = 33; final int is_identity = 34; final int identity_generation = 35; final int identity_start = 36; final int identity_increment = 37; final int identity_maximum = 38; final int identity_minimum = 39; final int identity_cycle = 40; final int is_generated = 41; final int generation_expression = 42; final int is_updatable = 43; final int declared_data_type = 44; final int declared_numeric_precision = 45; final int declared_numeric_scale = 46; // // intermediate holders int columnCount; Iterator tables; Table table; Object[] row; OrderedHashSet columnList; Type type; // Initialization tables = allTables(); while (tables.hasNext()) { table = (Table) tables.next(); columnList = session.getGrantee().getColumnsForAllPrivileges(table); if (columnList.isEmpty()) { continue; } columnCount = table.getColumnCount(); for (int i = 0; i < columnCount; i++) { ColumnSchema column = table.getColumn(i); type = column.getDataType(); if (!columnList.contains(column.getName())) { continue; } row = t.getEmptyRowData(); row[table_cat] = database.getCatalogName().name; row[table_schem] = table.getSchemaName().name; row[table_name] = table.getName().name; row[column_name] = column.getName().name; row[ordinal_position] = ValuePool.getLong(i + 1); row[column_default] = column.getDefaultSQL(); row[is_nullable] = column.isNullable() ? "YES" : "NO"; row[data_type] = type.getFullNameString(); // common type block if (type.isCharacterType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision * 2); row[character_set_catalog] = database.getCatalogName().name; row[character_set_schema] = ((CharacterType) type).getCharacterSet() .getSchemaName().name; row[character_set_name] = ((CharacterType) type).getCharacterSet().getName() .name; row[collation_catalog] = database.getCatalogName().name; row[collation_schema] = ((CharacterType) type).getCollation().getSchemaName() .name; row[collation_name] = ((CharacterType) type).getCollation().getName().name; } else if (type.isNumberType()) { row[numeric_precision] = ValuePool.getLong( ((NumberType) type).getNumericPrecisionInRadix()); row[declared_numeric_precision] = ValuePool.getLong( ((NumberType) type).getNumericPrecisionInRadix()); if (type.isExactNumberType()) { row[numeric_scale] = row[declared_numeric_scale] = ValuePool.getLong(type.scale); } row[numeric_precision_radix] = ValuePool.getLong(type.getPrecisionRadix()); } else if (type.isBooleanType()) { // } else if (type.isDateTimeType()) { row[datetime_precision] = ValuePool.getLong(type.scale); } else if (type.isIntervalType()) { row[data_type] = "INTERVAL"; row[interval_type] = ((IntervalType) type).getQualifier(type.typeCode); row[interval_precision] = ValuePool.getLong(type.precision); row[datetime_precision] = ValuePool.getLong(type.scale); } else if (type.isBinaryType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision); } else if (type.isBitType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision); } else if (type.isArrayType()) { row[maximum_cardinality] = ValuePool.getLong(type.arrayLimitCardinality()); row[data_type] = "ARRAY"; } if (type.isDomainType()) { row[domain_catalog] = database.getCatalogName().name; row[domain_schema] = type.getSchemaName().name; row[domain_name] = type.getName().name; } if (type.isDistinctType()) { row[udt_catalog] = database.getCatalogName().name; row[udt_schema] = type.getSchemaName().name; row[udt_name] = type.getName().name; } row[scope_catalog] = null; row[scope_schema] = null; row[scope_name] = null; row[dtd_identifier] = type.getDefinition(); row[is_self_referencing] = null; row[is_identity] = column.isIdentity() ? "YES" : "NO"; if (column.isIdentity()) { NumberSequence sequence = column.getIdentitySequence(); row[identity_generation] = sequence.isAlways() ? "ALWAYS" : "BY DEFAULT"; row[identity_start] = Long.toString(sequence.getStartValue()); row[identity_increment] = Long.toString(sequence.getIncrement()); row[identity_maximum] = Long.toString(sequence.getMaxValue()); row[identity_minimum] = Long.toString(sequence.getMinValue()); row[identity_cycle] = sequence.isCycle() ? "YES" : "NO"; } row[is_generated] = "NEVER"; if (column.isGenerated()) { row[is_generated] = "ALWAYS"; row[generation_expression] = column.getGeneratingExpression().getSQL(); } row[is_updatable] = table.isWritable() ? "YES" : "NO"; row[declared_data_type] = row[data_type]; if (type.isNumberType()) { row[declared_numeric_precision] = row[numeric_precision]; row[declared_numeric_scale] = row[numeric_scale]; } t.insertSys(session, store, row); } } return t; } /** * SQL:2008 VIEW

              * * The CONSTRAINT_COLUMN_USAGE view has one row for each column identified by * a table constraint or assertion.

              * * Definition:

              * * TABLE_CATALOG VARCHAR * TABLE_SCHEMA VARCHAR * TABLE_NAME VARCHAR * COLUMN_NAME VARCHAR * CONSTRAINT_CATALOG VARCHAR * CONSTRAINT_SCHEMA VARCHAR * CONSTRAINT_NAME VARCHAR * * * * Description:

              * *

                *
              1. The values of TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, and * COLUMN_NAME are the catalog name, schema name, * identifier, and column name, respectively, of a column * identified by a <column reference> explicitly or implicitly * contained in the <search condition> of the constraint * being described. * *
              2. The values of CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, and * CONSTRAINT_NAME are the catalog name, schema name, * and identifier, respectively, of the constraint being * described.

                * *

              3. For FOREIGN KEY constraints, the columns of the UNIQUE constraint * in the referenced table are also included in this view. * * <1i> Columns are reported only if the user or one of its roles is * the authorization (owner) of the table. * *
              * * @return Table */ Table CONSTRAINT_COLUMN_USAGE(Session session, PersistentStore store) { Table t = sysTables[CONSTRAINT_COLUMN_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[CONSTRAINT_COLUMN_USAGE]); addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); // not null addColumn(t, "CONSTRAINT_CATALOG", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_NAME", SQL_IDENTIFIER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[CONSTRAINT_COLUMN_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5, 6 }, false); return t; } // column number mappings final int table_catalog = 0; final int table_schema = 1; final int table_name = 2; final int column_name = 3; final int constraint_catalog = 4; final int constraint_schema = 5; final int constraint_name = 6; // // calculated column values String constraintCatalog; String constraintSchema; String constraintName; // Intermediate holders Iterator tables; Table table; Constraint[] constraints; int constraintCount; Constraint constraint; Iterator iterator; Object[] row; // Initialization tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); // Do it. while (tables.hasNext()) { table = (Table) tables.next(); if (table.isView() || !session.getGrantee().isFullyAccessibleByRole( table.getName())) { continue; } constraints = table.getConstraints(); constraintCount = constraints.length; constraintCatalog = database.getCatalogName().name; constraintSchema = table.getSchemaName().name; // process constraints for (int i = 0; i < constraintCount; i++) { constraint = constraints[i]; constraintName = constraint.getName().name; switch (constraint.getConstraintType()) { case SchemaObject.ConstraintTypes.CHECK : { OrderedHashSet expressions = constraint.getCheckColumnExpressions(); if (expressions == null) { break; } iterator = expressions.iterator(); // calculate distinct column references while (iterator.hasNext()) { ExpressionColumn expr = (ExpressionColumn) iterator.next(); HsqlName name = expr.getColumn().getName(); if (name.type != SchemaObject.COLUMN) { continue; } row = t.getEmptyRowData(); row[table_catalog] = database.getCatalogName().name; row[table_schema] = name.schema.name; row[table_name] = name.parent.name; row[column_name] = name.name; row[constraint_catalog] = constraintCatalog; row[constraint_schema] = constraintSchema; row[constraint_name] = constraintName; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } break; } case SchemaObject.ConstraintTypes.UNIQUE : case SchemaObject.ConstraintTypes.PRIMARY_KEY : case SchemaObject.ConstraintTypes.FOREIGN_KEY : { Table target = table; int[] cols = constraint.getMainColumns(); if (constraint.getConstraintType() == SchemaObject.ConstraintTypes.FOREIGN_KEY) { cols = constraint.getRefColumns(); } for (int j = 0; j < cols.length; j++) { row = t.getEmptyRowData(); row[table_catalog] = database.getCatalogName().name; row[table_schema] = constraintSchema; row[table_name] = target.getName().name; row[column_name] = target.getColumn(cols[j]).getName().name; row[constraint_catalog] = constraintCatalog; row[constraint_schema] = constraintSchema; row[constraint_name] = constraintName; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } } } } return t; } /** * SQL:2008 VIEW

              * * The CONSTRAINT_TABLE_USAGE view has one row for each table identified by a * <table name> simply contained in a <table reference> * contained in the <search condition> of a check constraint, * domain constraint, or assertion. It has one row for each table * containing / referenced by each PRIMARY KEY, UNIQUE and FOREIGN KEY * constraint

              * * Definition:

              * *

                   *      TABLE_CATALOG           VARCHAR
                   *      TABLE_SCHEMA            VARCHAR
                   *      TABLE_NAME              VARCHAR
                   *      CONSTRAINT_CATALOG      VARCHAR
                   *      CONSTRAINT_SCHEMA       VARCHAR
                   *      CONSTRAINT_NAME         VARCHAR
                   * 
              * * Description:

              * *

                *
              1. The values of CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, and * CONSTRAINT_NAME are the catalog name, schema name, * and identifier, respectively, of the constraint being * described.

                * *

              2. The values of TABLE_CATALOG, TABLE_SCHEMA, and TABLE_NAME are the * catalog name, schema name, and identifier, * respectively, of a table identified by a <table name> * simply contained in a <table reference> contained in the * *lt;search condition> of the constraint being described, or * its columns. * * <1i> Tables are reported only if the user or one of its roles is * the authorization (owner) of the table. *
              * * @return Table */ Table CONSTRAINT_TABLE_USAGE(Session session, PersistentStore store) { Table t = sysTables[CONSTRAINT_TABLE_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[CONSTRAINT_TABLE_USAGE]); addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "CONSTRAINT_CATALOG", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_NAME", SQL_IDENTIFIER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[CONSTRAINT_TABLE_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5 }, false); return t; } // Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); Result rs = sys.executeDirectStatement( "select DISTINCT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, " + "CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME " + "from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE"); t.insertSys(session, store, rs); sys.close(); return t; } /** * SQL:2008 VIEW

              * * The DATA_TYPE_PRIVILEGES view has one row for each use of a data type. * Currently this view does not report the DTD_IDENTIFIER column. * Definition:

              * *

                   *      OBJECT_CATALOG      VARCHAR
                   *      OBJECT_SCHEMA       VARCHAR
                   *      OBJECT_NAME         VARCHAR
                   *      OBJECT_TYPE         VARCHAR
                   *      DTD_IDENTIFIER      VARCHAR
                   * 
              * * Description:

              * *

                *
              1. The values of OBJECT_CATALOG, OBJECT_SCHEMA, and * OBJECT_NAME are the catalog name, schema name, * and identifier, respectively, of the object.

                * *

              2. The value of OBJECT_TYPE is the type of the object, for example * 'TABLE'. * * <1i> Tables are reported only if the user or one of its roles is * the authorization (owner) of the table. *
              * * @return Table */ Table DATA_TYPE_PRIVILEGES(Session session, PersistentStore store) { Table t = sysTables[DATA_TYPE_PRIVILEGES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[DATA_TYPE_PRIVILEGES]); addColumn(t, "OBJECT_CATALOG", SQL_IDENTIFIER); addColumn(t, "OBJECT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "OBJECT_NAME", SQL_IDENTIFIER); // not null addColumn(t, "OBJECT_TYPE", SQL_IDENTIFIER); addColumn(t, "DTD_IDENTIFIER", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[DATA_TYPE_PRIVILEGES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4 }, false); return t; } // Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); String sql = (String) statementMap.get("/*data_type_privileges*/"); Result rs = sys.executeDirectStatement(sql); t.insertSys(session, store, rs); sys.close(); return t; } /** * a DEFINITION_SCHEMA table. Not in the INFORMATION_SCHEMA list */ /* Table DATA_TYPE_DESCRIPTOR() { Table t = sysTables[DATA_TYPE_DESCRIPTOR]; if (t == null) { t = createBlankTable(sysTableHsqlNames[DATA_TYPE_DESCRIPTOR]); addColumn(t, "OBJECT_CATALOG", SQL_IDENTIFIER); addColumn(t, "OBJECT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "OBJECT_NAME", SQL_IDENTIFIER); addColumn(t, "OBJECT_TYPE", CHARACTER_DATA); addColumn(t, "DTD_IDENTIFIER", SQL_IDENTIFIER); addColumn(t, "DATA_TYPE", CHARACTER_DATA); addColumn(t, "CHARACTER_SET_CATALOG", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_NAME", SQL_IDENTIFIER); addColumn(t, "CHARACTER_MAXIMUM_LENGTH", CARDINAL_NUMBER); addColumn(t, "CHARACTER_OCTET_LENGTH", CARDINAL_NUMBER); addColumn(t, "COLLATION_CATALOG", SQL_IDENTIFIER); addColumn(t, "COLLATION_SCHEMA", SQL_IDENTIFIER); addColumn(t, "COLLATION_NAME", SQL_IDENTIFIER); addColumn(t, "NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "NUMERIC_PRECISION_RADIX", CARDINAL_NUMBER); addColumn(t, "NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "DECLARED_DATA_TYPE", CHARACTER_DATA); addColumn(t, "DECLARED_NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "DECLARED_NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "DATETIME_PRECISION", CARDINAL_NUMBER); addColumn(t, "INTERVAL_TYPE", CHARACTER_DATA); addColumn(t, "INTERVAL_PRECISION", CARDINAL_NUMBER); addColumn(t, "USER_DEFINED_TYPE_CATALOG", SQL_IDENTIFIER); addColumn(t, "USER_DEFINED_TYPE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "USER_DEFINED_TYPE_NAME", SQL_IDENTIFIER); addColumn(t, "SCOPE_CATALOG", SQL_IDENTIFIER); addColumn(t, "SCOPE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SCOPE_NAME", SQL_IDENTIFIER); addColumn(t, "MAXIMUM_CARDINALITY", CARDINAL_NUMBER); t.createPrimaryKeyConstraint(null, new int[] { 0, 1, 2, 4, 5, 6 }, false); return t; } PersistentStore store = session.sessionData.getRowStore(t); final int object_catalog = 0; final int object_schema = 1; final int object_name = 2; final int object_type = 3; final int dtd_identifier = 4; final int data_type = 5; final int character_set_catalog = 6; final int character_set_schema = 7; final int character_set_name = 8; final int character_maximum_length = 9; final int character_octet_length = 10; final int collation_catalog = 11; final int collation_schema = 12; final int collation_name = 13; final int numeric_precision = 14; final int numeric_precision_radix = 15; final int numeric_scale = 16; final int declared_data_type = 17; final int declared_numeric_precision = 18; final int declared_numeric_scale = 19; final int datetime_precision = 20; final int interval_type = 21; final int interval_precision = 22; final int user_defined_type_catalog = 23; final int user_defined_type_schema = 24; final int user_defined_type_name = 25; final int scope_catalog = 26; final int scope_schema = 27; final int scope_name = 28; final int maximum_cardinality = 29; return t; } */ /** * SQL:2008 VIEW

              * * The DOMAIN_CONSTRAINTS view has one row for each domain * constraint.

              * * Definition:

              * *

                   *      CONSTRAINT_CATALOG  VARCHAR NULL,
                   *      CONSTRAINT_SCHEMA   VARCHAR NULL,
                   *      CONSTRAINT_NAME     VARCHAR NOT NULL,
                   *      DOMAIN_CATALOG      VARCHAR
                   *      DOMAIN_SCHEMA       VARCHAR
                   *      DOMAIN_NAME         VARCHAR
                   *      IS_DEFERABLE        VARCHAR NOT NULL,
                   *      INITIALLY_DEFERRED  VARCHAR NOT NULL,
                   * 
              * * Description:

              * *

                *
              1. A constraint is shown in this view if the authorization for the * DOMAIN that contains the constraint is the current user or is a role * assigned to the current user.

                * *

              2. The values of CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA and * CONSTRAINT_NAME are the catalog name, schema name, * and identifier, respectively, of the constraint being * described.

                * * <1i> Constraints are reported only if the user or one of its roles is * the authorization (owner) of the DOMAIN. *

              * * @return Table */ Table DOMAIN_CONSTRAINTS(Session session, PersistentStore store) { Table t = sysTables[DOMAIN_CONSTRAINTS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[DOMAIN_CONSTRAINTS]); addColumn(t, "CONSTRAINT_CATALOG", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_NAME", SQL_IDENTIFIER); // not null addColumn(t, "DOMAIN_CATALOG", SQL_IDENTIFIER); addColumn(t, "DOMAIN_SCHEMA", SQL_IDENTIFIER); addColumn(t, "DOMAIN_NAME", SQL_IDENTIFIER); addColumn(t, "IS_DEFERRABLE", YES_OR_NO); addColumn(t, "INITIALLY_DEFERRED", YES_OR_NO); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[DOMAIN_CONSTRAINTS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 4, 5, 6 }, false); return t; } final int constraint_catalog = 0; final int constraint_schema = 1; final int constraint_name = 2; final int domain_catalog = 3; final int domain_schema = 4; final int domain_name = 5; final int is_deferrable = 6; final int initially_deferred = 7; // // Iterator it = database.schemaManager.databaseObjectIterator(SchemaObject.DOMAIN); while (it.hasNext()) { Type domain = (Type) it.next(); if (!domain.isDomainType()) { continue; } if (!session.getGrantee().isFullyAccessibleByRole( domain.getName())) { continue; } Constraint[] constraints = domain.userTypeModifier.getConstraints(); for (int i = 0; i < constraints.length; i++) { Object[] data = t.getEmptyRowData(); data[constraint_catalog] = data[domain_catalog] = database.getCatalogName().name; data[constraint_schema] = data[domain_schema] = domain.getSchemaName().name; data[constraint_name] = constraints[i].getName().name; data[domain_name] = domain.getName().name; data[is_deferrable] = Tokens.T_NO; data[initially_deferred] = Tokens.T_NO; t.insertSys(session, store, data); } } return t; } /** * SQL:2008 VIEW

              * * The DOMAINS view has one row for each domain.

              * * @return Table */ Table DOMAINS(Session session, PersistentStore store) { Table t = sysTables[DOMAINS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[DOMAINS]); addColumn(t, "DOMAIN_CATALOG", SQL_IDENTIFIER); addColumn(t, "DOMAIN_SCHEMA", SQL_IDENTIFIER); addColumn(t, "DOMAIN_NAME", SQL_IDENTIFIER); addColumn(t, "DATA_TYPE", SQL_IDENTIFIER); addColumn(t, "CHARACTER_MAXIMUM_LENGTH", CARDINAL_NUMBER); addColumn(t, "CHARACTER_OCTET_LENGTH", CARDINAL_NUMBER); addColumn(t, "CHARACTER_SET_CATALOG", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_NAME", SQL_IDENTIFIER); addColumn(t, "COLLATION_CATALOG", SQL_IDENTIFIER); addColumn(t, "COLLATION_SCHEMA", SQL_IDENTIFIER); addColumn(t, "COLLATION_NAME", SQL_IDENTIFIER); addColumn(t, "NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "NUMERIC_PRECISION_RADIX", CARDINAL_NUMBER); addColumn(t, "NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "DATETIME_PRECISION", CARDINAL_NUMBER); addColumn(t, "INTERVAL_TYPE", CHARACTER_DATA); addColumn(t, "INTERVAL_PRECISION", CARDINAL_NUMBER); addColumn(t, "DOMAIN_DEFAULT", CHARACTER_DATA); addColumn(t, "MAXIMUM_CARDINALITY", CARDINAL_NUMBER); addColumn(t, "DTD_IDENTIFIER", SQL_IDENTIFIER); addColumn(t, "DECLARED_DATA_TYPE", CHARACTER_DATA); addColumn(t, "DECLARED_NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "DECLARED_NUMERIC_SCALE", CARDINAL_NUMBER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[DOMAINS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 4, 5, 6 }, false); return t; } final int domain_catalog = 0; final int domain_schema = 1; final int domain_name = 2; final int data_type = 3; final int character_maximum_length = 4; final int character_octet_length = 5; final int character_set_catalog = 6; final int character_set_schema = 7; final int character_set_name = 8; final int collation_catalog = 9; final int collation_schema = 10; final int collation_name = 11; final int numeric_precision = 12; final int numeric_precision_radix = 13; final int numeric_scale = 14; final int datetime_precision = 15; final int interval_type = 16; final int interval_precision = 17; final int domain_default = 18; final int maximum_cardinality = 19; final int dtd_identifier = 20; final int declared_data_type = 21; final int declared_numeric_precision = 22; final int declared_numeric_scale = 23; // // Iterator it = database.schemaManager.databaseObjectIterator(SchemaObject.DOMAIN); while (it.hasNext()) { Type type = (Type) it.next(); if (!type.isDomainType()) { continue; } if (!session.getGrantee().isAccessible(type)) { continue; } Object[] row = t.getEmptyRowData(); row[domain_catalog] = database.getCatalogName().name; row[domain_schema] = type.getSchemaName().name; row[domain_name] = type.getName().name; row[data_type] = type.getFullNameString(); // common type block if (type.isCharacterType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision * 2); row[character_set_catalog] = database.getCatalogName().name; row[character_set_schema] = ((CharacterType) type).getCharacterSet().getSchemaName() .name; row[character_set_name] = ((CharacterType) type).getCharacterSet().getName().name; row[collation_catalog] = database.getCatalogName().name; row[collation_schema] = ((CharacterType) type).getCollation().getSchemaName().name; row[collation_name] = ((CharacterType) type).getCollation().getName().name; } else if (type.isNumberType()) { row[numeric_precision] = ValuePool.getLong( ((NumberType) type).getNumericPrecisionInRadix()); row[declared_numeric_precision] = ValuePool.getLong( ((NumberType) type).getNumericPrecisionInRadix()); if (type.isExactNumberType()) { row[numeric_scale] = row[declared_numeric_scale] = ValuePool.getLong(type.scale); } row[numeric_precision_radix] = ValuePool.getLong(type.getPrecisionRadix()); } else if (type.isBooleanType()) { // } else if (type.isDateTimeType()) { row[datetime_precision] = ValuePool.getLong(type.scale); } else if (type.isIntervalType()) { row[data_type] = "INTERVAL"; row[interval_type] = ((IntervalType) type).getQualifier(type.typeCode); row[interval_precision] = ValuePool.getLong(type.precision); row[datetime_precision] = ValuePool.getLong(type.scale); } else if (type.isBinaryType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision); } else if (type.isBitType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision); } else if (type.isArrayType()) { row[maximum_cardinality] = ValuePool.getLong(type.arrayLimitCardinality()); row[data_type] = "ARRAY"; } row[dtd_identifier] = type.getDefinition(); row[declared_data_type] = row[data_type]; // end common block Expression defaultExpression = type.userTypeModifier.getDefaultClause(); if (defaultExpression != null) { row[domain_default] = defaultExpression.getSQL(); } t.insertSys(session, store, row); } return t; } /** * SQL:2008 VIEW

              * * The type attributes of elements of array.

              * * The ELEMENT_TYPES view is empty.

              * * @return Table */ Table ELEMENT_TYPES(Session session, PersistentStore store) { Table t = sysTables[ELEMENT_TYPES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ELEMENT_TYPES]); addColumn(t, "OBJECT_CATALOG", SQL_IDENTIFIER); addColumn(t, "OBJECT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "OBJECT_NAME", SQL_IDENTIFIER); addColumn(t, "OBJECT_TYPE", SQL_IDENTIFIER); addColumn(t, "COLLECTION_TYPE_IDENTIFIER", SQL_IDENTIFIER); addColumn(t, "DATA_TYPE", SQL_IDENTIFIER); addColumn(t, "CHARACTER_MAXIMUM_LENGTH", CARDINAL_NUMBER); addColumn(t, "CHARACTER_OCTET_LENGTH", CARDINAL_NUMBER); addColumn(t, "CHARACTER_SET_CATALOG", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_NAME", SQL_IDENTIFIER); addColumn(t, "COLLATION_CATALOG", SQL_IDENTIFIER); addColumn(t, "COLLATION_SCHEMA", SQL_IDENTIFIER); addColumn(t, "COLLATION_NAME", SQL_IDENTIFIER); addColumn(t, "NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "NUMERIC_PRECISION_RADIX", CARDINAL_NUMBER); addColumn(t, "NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "DATETIME_PRECISION", CARDINAL_NUMBER); addColumn(t, "INTERVAL_TYPE", CHARACTER_DATA); addColumn(t, "INTERVAL_PRECISION", CARDINAL_NUMBER); addColumn(t, "UDT_CATALOG", SQL_IDENTIFIER); addColumn(t, "UDT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "UDT_NAME", SQL_IDENTIFIER); addColumn(t, "SCOPE_CATALOG", SQL_IDENTIFIER); addColumn(t, "SCOPE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SCOPE_NAME", SQL_IDENTIFIER); addColumn(t, "MAXIMUM_CARDINALITY", CARDINAL_NUMBER); addColumn(t, "DTD_IDENTIFIER", SQL_IDENTIFIER); addColumn(t, "DECLARED_DATA_TYPE", CHARACTER_DATA); addColumn(t, "DECLARED_NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "DECLARED_NUMERIC_SCALE", CARDINAL_NUMBER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ELEMENT_TYPES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 4, 5, 27 }, true); return t; } final int object_catalog = 0; final int object_schema = 1; final int object_name = 2; final int object_type = 3; final int collection_type_identifier = 4; // final int udt_catalog = 20; final int udt_schema = 21; final int udt_name = 22; final int scope_catalog = 23; final int scope_schema = 24; final int scope_name = 25; // // intermediate holders int columnCount; Iterator tables; Table table; Object[] row; OrderedHashSet columnList; Type type; // Initialization tables = allTables(); while (tables.hasNext()) { table = (Table) tables.next(); columnList = session.getGrantee().getColumnsForAllPrivileges(table); if (columnList.isEmpty()) { continue; } columnCount = table.getColumnCount(); for (int i = 0; i < columnCount; i++) { ColumnSchema column = table.getColumn(i); if (!columnList.contains(column.getName())) { continue; } type = column.getDataType(); if (type.isDistinctType() || type.isDomainType() || !type.isArrayType()) { continue; } row = t.getEmptyRowData(); row[object_catalog] = database.getCatalogName().name; row[object_schema] = table.getSchemaName().name; row[object_name] = table.getName().name; row[object_type] = "TABLE"; row[collection_type_identifier] = type.getDefinition(); addTypeInfo(row, ((ArrayType) type).collectionBaseType()); try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } Iterator it = database.schemaManager.databaseObjectIterator(SchemaObject.DOMAIN); while (it.hasNext()) { type = (Type) it.next(); if (!type.isDomainType() || !type.isArrayType()) { continue; } if (!session.getGrantee().isAccessible(type)) { continue; } row = t.getEmptyRowData(); row[object_catalog] = database.getCatalogName().name; row[object_schema] = type.getSchemaName().name; row[object_name] = type.getName().name; row[object_type] = "DOMAIN"; row[collection_type_identifier] = type.getDefinition(); addTypeInfo(row, ((ArrayType) type).collectionBaseType()); t.insertSys(session, store, row); } it = database.schemaManager.databaseObjectIterator(SchemaObject.TYPE); while (it.hasNext()) { type = (Type) it.next(); if (!type.isDistinctType() || !type.isArrayType()) { continue; } if (!session.getGrantee().isAccessible(type)) { continue; } row = t.getEmptyRowData(); row[object_catalog] = database.getCatalogName().name; row[object_schema] = type.getSchemaName().name; row[object_name] = type.getName().name; row[object_type] = "USER-DEFINED TYPE"; row[collection_type_identifier] = type.getDefinition(); addTypeInfo(row, ((ArrayType) type).collectionBaseType()); try { t.insertSys(session, store, row); } catch (HsqlException e) {} } it = database.schemaManager.databaseObjectIterator( SchemaObject.SPECIFIC_ROUTINE); while (it.hasNext()) { Routine routine = (Routine) it.next(); if (!session.getGrantee().isAccessible(routine)) { continue; } type = routine.isProcedure() ? null : routine.getReturnType(); if (type == null || type.isDistinctType() || type.isDomainType() || !type.isArrayType()) { // } else { row = t.getEmptyRowData(); row[object_catalog] = database.getCatalogName().name; row[object_schema] = routine.getSchemaName().name; row[object_name] = routine.getName().name; row[object_type] = "ROUTINE"; row[collection_type_identifier] = type.getDefinition(); addTypeInfo(row, ((ArrayType) type).collectionBaseType()); try { t.insertSys(session, store, row); } catch (HsqlException e) {} } Type returnType = type; int paramCount = routine.getParameterCount(); for (int i = 0; i < paramCount; i++) { ColumnSchema param = routine.getParameter(i); type = param.getDataType(); if (type.isDistinctType() || type.isDomainType() || !type.isArrayType()) { continue; } if (type.equals(returnType)) { continue; } row = t.getEmptyRowData(); row[object_catalog] = database.getCatalogName().name; row[object_schema] = routine.getSchemaName().name; row[object_name] = routine.getName().name; row[object_type] = "ROUTINE"; row[collection_type_identifier] = type.getDefinition(); addTypeInfo(row, ((ArrayType) type).collectionBaseType()); try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } return t; } void addTypeInfo(Object[] row, Type type) { final int data_type = 5; final int character_maximum_length = 6; final int character_octet_length = 7; final int character_set_catalog = 8; final int character_set_schema = 9; final int character_set_name = 10; final int collation_catalog = 11; final int collation_schema = 12; final int collation_name = 13; final int numeric_precision = 14; final int numeric_precision_radix = 15; final int numeric_scale = 16; final int datetime_precision = 17; final int interval_type = 18; final int interval_precision = 19; // final int maximum_cardinality = 26; final int dtd_identifier = 27; final int declared_data_type = 28; final int declared_numeric_precision = 29; final int declared_numeric_scale = 30; row[data_type] = type.getFullNameString(); if (type.isCharacterType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision * 2); row[character_set_catalog] = database.getCatalogName().name; row[character_set_schema] = ((CharacterType) type).getCharacterSet().getSchemaName().name; row[character_set_name] = ((CharacterType) type).getCharacterSet().getName().name; row[collation_catalog] = database.getCatalogName().name; row[collation_schema] = ((CharacterType) type).getCollation().getSchemaName().name; row[collation_name] = ((CharacterType) type).getCollation().getName().name; } else if (type.isNumberType()) { row[numeric_precision] = ValuePool.getLong( ((NumberType) type).getNumericPrecisionInRadix()); row[declared_numeric_precision] = ValuePool.getLong( ((NumberType) type).getNumericPrecisionInRadix()); if (type.isExactNumberType()) { row[numeric_scale] = row[declared_numeric_scale] = ValuePool.getLong(type.scale); } row[numeric_precision_radix] = ValuePool.getLong(type.getPrecisionRadix()); } else if (type.isBooleanType()) { // } else if (type.isDateTimeType()) { row[datetime_precision] = ValuePool.getLong(type.scale); } else if (type.isIntervalType()) { row[data_type] = "INTERVAL"; row[interval_type] = ((IntervalType) type).getQualifier(type.typeCode); row[interval_precision] = ValuePool.getLong(type.precision); row[datetime_precision] = ValuePool.getLong(type.scale); } else if (type.isBinaryType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision); } else if (type.isBitType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision); } else if (type.isArrayType()) { row[maximum_cardinality] = ValuePool.getLong(type.arrayLimitCardinality()); } row[dtd_identifier] = type.getDefinition(); row[declared_data_type] = row[data_type]; } /** * SQL:2008 VIEW

              * * ENABLED_ROLES

              * * Identify the enabled roles for the current SQL-session.

              * * Definition

              * *

                   * CREATE RECURSIVE VIEW ENABLED_ROLES ( ROLE_NAME ) AS
                   *      VALUES ( CURRENT_ROLE )
                   *      UNION
                   *      SELECT RAD.ROLE_NAME
                   *        FROM DEFINITION_SCHEMA.ROLE_AUTHORIZATION_DESCRIPTORS RAD
                   *        JOIN ENABLED_ROLES R
                   *          ON RAD.GRANTEE = R.ROLE_NAME;
                   *
                   * GRANT SELECT ON TABLE ENABLED_ROLES
                   *    TO PUBLIC WITH GRANT OPTION;
                   * 
              */ Table ENABLED_ROLES(Session session, PersistentStore store) { Table t = sysTables[ENABLED_ROLES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ENABLED_ROLES]); addColumn(t, "ROLE_NAME", SQL_IDENTIFIER); // true PK HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ENABLED_ROLES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, true); return t; } // Intermediate holders Iterator grantees; Grantee grantee; Object[] row; // initialization grantees = session.getGrantee().getAllRoles().iterator(); while (grantees.hasNext()) { grantee = (Grantee) grantees.next(); row = t.getEmptyRowData(); row[0] = grantee.getName().getNameString(); t.insertSys(session, store, row); } return t; } /** * SQL:2008 VIEW

              * * The JAR_JAR_USAGE view is empty.

              * */ Table JAR_JAR_USAGE(Session session, PersistentStore store) { Table t = sysTables[JAR_JAR_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[JAR_JAR_USAGE]); addColumn(t, "PATH_JAR_CATALOG", SQL_IDENTIFIER); addColumn(t, "PATH_JAR_SCHAMA", SQL_IDENTIFIER); addColumn(t, "PATH_JAR_NAME", SQL_IDENTIFIER); addColumn(t, "JAR_CATALOG", SQL_IDENTIFIER); addColumn(t, "JAR_SCHEMA", SQL_IDENTIFIER); addColumn(t, "JAR_NAME", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[JAR_JAR_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5 }, false); return t; } // column number mappings final int path_jar_catalog = 0; final int path_jar_schema = 1; final int path_jar_name = 2; final int jar_catalog = 3; final int jar_schema = 4; final int jar_name = 5; // Iterator it; Object[] row; return t; } /** * SQL:2008 VIEW

              * * The JARS view is empty.

              * */ Table JARS(Session session, PersistentStore store) { Table t = sysTables[JARS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[JARS]); addColumn(t, "JAR_CATALOG", SQL_IDENTIFIER); addColumn(t, "JAR_SCHEMA", SQL_IDENTIFIER); addColumn(t, "JAR_NAME", SQL_IDENTIFIER); addColumn(t, "JAR_PATH", CHARACTER_DATA); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[JARS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3 }, false); return t; } // column number mappings final int jar_catalog = 0; final int jar_schema = 1; final int jar_name = 2; final int jar_path = 3; // Iterator it; Object[] row; return t; } /** * SQL:2008 VIEW

              * * The KEY_COLUMN_USAGE view describes the columns of * PRIMARY KEY, UNIQUE, FOREIGN KEY, and CHECK constraint of each accessible table * defined within this database.

              * * Each row is a PRIMARY KEY or UNIQUE column description with the following * columns:

              * *

                   * CONSTRAINT_CATALOG              VARCHAR NULL,
                   * CONSTRAINT_SCHEMA               VARCHAR NULL,
                   * CONSTRAINT_NAME                 VARCHAR NOT NULL,
                   * TABLE_CATALOG                   VARCHAR   table catalog
                   * TABLE_SCHEMA                    VARCHAR   table schema
                   * TABLE_NAME                      VARCHAR   table name
                   * COLUMN_NAME                     VARCHAR   column name
                   * ORDINAL_POSITION                INT
                   * POSITION_IN_UNIQUE_CONSTRAINT   INT
                   * 

              * * The ORDINAL_POSITION column refers to the position of the column in the * definition of the UNIQUE or FOREIGN KEY constraints.

              * The POSITION_IN_UNIQUE_CONSTRAINT column is defined for FOREIGN KEY constraints * only. It refers to the position of the referenced column in the UNIQUE * constraint in the reference table.

              * A column is included in this view if the user has some privilege on al * the columns of the constraint.

              * * @return a Table object describing the visible * primary key and unique columns of each accessible table * defined within this database. */ Table KEY_COLUMN_USAGE(Session session, PersistentStore store) { Table t = sysTables[KEY_COLUMN_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[KEY_COLUMN_USAGE]); addColumn(t, "CONSTRAINT_CATALOG", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_NAME", SQL_IDENTIFIER); // not null addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); // not null addColumn(t, "ORDINAL_POSITION", CARDINAL_NUMBER); // not null addColumn(t, "POSITION_IN_UNIQUE_CONSTRAINT", CARDINAL_NUMBER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[KEY_COLUMN_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 2, 1, 0, 6, 7 }, false); return t; } // Intermediate holders Iterator tables; Object[] row; // column number mappings final int constraint_catalog = 0; final int constraint_schema = 1; final int constraint_name = 2; final int table_catalog = 3; final int table_schema = 4; final int table_name = 5; final int column_name = 6; final int ordinal_position = 7; final int position_in_unique_constraint = 8; // Initialization tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); while (tables.hasNext()) { Table table = (Table) tables.next(); String tableCatalog = database.getCatalogName().name; HsqlName tableName = table.getName(); if (table.isView()) { continue; } if (!session.getGrantee().isAccessible(tableName)) { continue; } Constraint[] constraints = table.getConstraints(); for (int i = 0; i < constraints.length; i++) { Constraint constraint = constraints[i]; if (constraint.getConstraintType() == SchemaObject .ConstraintTypes.PRIMARY_KEY || constraint .getConstraintType() == SchemaObject.ConstraintTypes .UNIQUE || constraint .getConstraintType() == SchemaObject.ConstraintTypes .FOREIGN_KEY) { String constraintName = constraint.getName().name; int[] cols = constraint.getMainColumns(); int[] uniqueColMap = null; if (constraint.getConstraintType() == SchemaObject.ConstraintTypes.FOREIGN_KEY) { Table uniqueConstTable = constraint.getMain(); Constraint uniqueConstraint = uniqueConstTable.getConstraint( constraint.getUniqueName().name); int[] uniqueConstIndexes = uniqueConstraint.getMainColumns(); uniqueColMap = new int[cols.length]; for (int j = 0; j < cols.length; j++) { uniqueColMap[j] = ArrayUtil.find(uniqueConstIndexes, cols[j]); } cols = constraint.getRefColumns(); } if (!session.getGrantee().hasColumnRights(table, cols)) { continue; } for (int j = 0; j < cols.length; j++) { row = t.getEmptyRowData(); row[constraint_catalog] = tableCatalog; row[constraint_schema] = tableName.schema.name; row[constraint_name] = constraintName; row[table_catalog] = tableCatalog; row[table_schema] = tableName.schema.name; row[table_name] = tableName.name; row[column_name] = table.getColumn(cols[j]).getName().name; row[ordinal_position] = ValuePool.getLong(j + 1); if (constraint.getConstraintType() == SchemaObject.ConstraintTypes.FOREIGN_KEY) { row[position_in_unique_constraint] = ValuePool.getInt(uniqueColMap[j] + 1); } t.insertSys(session, store, row); } } } } return t; } /** * SQL:2008 VIEW

              * * The METHOD_SPECIFICATION_PARAMETERS view is not implemented.

              * */ Table METHOD_SPECIFICATION_PARAMETERS(Session session, PersistentStore store) { return null; } /** * SQL:2008 VIEW

              * * The METHOD_SPECIFICATIONS view is not implemented.

              * */ Table METHOD_SPECIFICATIONS(Session session, PersistentStore store) { return null; } /** * SQL:2008 VIEW

              * * The MODULE_COLUMN_USAGE view is not implemented.

              * */ Table MODULE_COLUMN_USAGE(Session session, PersistentStore store) { return null; } /** * SQL:2008 VIEW

              * * The MODULE_PRIVILEGES view is not implemented.

              * */ Table MODULE_PRIVILEGES(Session session, PersistentStore store) { return null; } /** * SQL:2008 VIEW

              * * The MODULE_TABLE_USAGE view is not implemented.

              * */ Table MODULE_TABLE_USAGE(Session session, PersistentStore store) { return null; } /** * SQL:2008 VIEW

              * * The MODULES view is not implemented.

              * */ Table MODULES(Session session, PersistentStore store) { return null; } /** * SQL:2008 VIEW

              * * The PARAMETERS view has one row for each parameter of a user defined * routine.

              * *

                   *      OBJECT_CATALOG      VARCHAR
                   *      OBJECT_SCHEMA       VARCHAR
                   *      OBJECT_NAME         VARCHAR
                   *      OBJECT_TYPE         VARCHAR
                   *      DTD_IDENTIFIER      VARCHAR
                   * 
              * * Description:

              * *

                *
              1. The values of OBJECT_CATALOG, OBJECT_SCHEMA, and * OBJECT_NAME are the catalog name, schema name, * and identifier, respectively, of the object.

                * *

              2. The value of OBJECT_TYPE is the type of the object, for example * 'TABLE'. * * <1i> Tables are reported only if the user or one of its roles is * the authorization (owner) of the table. *
              * * @return Table */ Table PARAMETERS(Session session, PersistentStore store) { Table t = sysTables[PARAMETERS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[PARAMETERS]); addColumn(t, "SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); addColumn(t, "ORDINAL_POSITION", CARDINAL_NUMBER); addColumn(t, "PARAMETER_MODE", CHARACTER_DATA); addColumn(t, "IS_RESULT", YES_OR_NO); addColumn(t, "AS_LOCATOR", YES_OR_NO); addColumn(t, "PARAMETER_NAME", SQL_IDENTIFIER); // addColumn(t, "FROM_SQL_SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "FROM_SQL_SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "FROM_SQL_SPECIFIC_NAME", SQL_IDENTIFIER); // addColumn(t, "TO_SQL_SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "TO_SQL_SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TO_SQL_SPECIFIC_NAME", SQL_IDENTIFIER); // addColumn(t, "DATA_TYPE", CHARACTER_DATA); addColumn(t, "CHARACTER_MAXIMUM_LENGTH", CARDINAL_NUMBER); addColumn(t, "CHARACTER_OCTET_LENGTH", CARDINAL_NUMBER); addColumn(t, "CHARACTER_SET_CATALOG", CHARACTER_DATA); addColumn(t, "CHARACTER_SET_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_NAME", SQL_IDENTIFIER); addColumn(t, "COLLATION_CATALOG", SQL_IDENTIFIER); addColumn(t, "COLLATION_SCHEMA", SQL_IDENTIFIER); addColumn(t, "COLLATION_NAME", SQL_IDENTIFIER); addColumn(t, "NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "NUMERIC_PRECISION_RADIX", CARDINAL_NUMBER); addColumn(t, "NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "DATETIME_PRECISION", CARDINAL_NUMBER); addColumn(t, "INTERVAL_TYPE", CHARACTER_DATA); addColumn(t, "INTERVAL_PRECISION", CARDINAL_NUMBER); addColumn(t, "UDT_CATALOG", SQL_IDENTIFIER); addColumn(t, "UDT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "UDT_NAME", SQL_IDENTIFIER); addColumn(t, "SCOPE_CATALOG", SQL_IDENTIFIER); addColumn(t, "SCOPE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SCOPE_NAME", SQL_IDENTIFIER); addColumn(t, "MAXIMUM_CARDINALITY", CARDINAL_NUMBER); addColumn(t, "DTD_IDENTIFIER", SQL_IDENTIFIER); addColumn(t, "DECLARED_DATA_TYPE", CHARACTER_DATA); addColumn(t, "DECLARED_NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "DECLARED_NUMERIC_SCALE", CARDINAL_NUMBER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[PARAMETERS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3 }, false); return t; } // column number mappings final int specific_cat = 0; final int specific_schem = 1; final int specific_name = 2; final int ordinal_position = 3; final int parameter_mode = 4; final int is_result = 5; final int as_locator = 6; final int parameter_name = 7; final int from_specific_catalog = 8; final int from_specific_schema = 9; final int from_specific_name = 10; final int to_specific_catalog = 11; final int to_specific_schema = 12; final int to_specific_name = 13; final int data_type = 14; final int character_maximum_length = 15; final int character_octet_length = 16; final int character_set_catalog = 17; final int character_set_schema = 18; final int character_set_name = 19; final int collation_catalog = 20; final int collation_schema = 21; final int collation_name = 22; final int numeric_precision = 23; final int numeric_precision_radix = 24; final int numeric_scale = 25; final int datetime_precision = 26; final int interval_type = 27; final int interval_precision = 28; final int udt_catalog = 29; final int udt_schema = 30; final int udt_name = 31; final int scope_catalog = 32; final int scope_schema = 33; final int scope_name = 34; final int maximum_cardinality = 35; final int dtd_identifier = 36; // intermediate holders int columnCount; Iterator routines; RoutineSchema routineSchema; Routine routine; Object[] row; Type type; // Initialization routines = database.schemaManager.databaseObjectIterator( SchemaObject.ROUTINE); while (routines.hasNext()) { routineSchema = (RoutineSchema) routines.next(); if (!session.getGrantee().isAccessible(routineSchema)) { continue; } Routine[] specifics = routineSchema.getSpecificRoutines(); for (int i = 0; i < specifics.length; i++) { routine = specifics[i]; columnCount = routine.getParameterCount(); for (int j = 0; j < columnCount; j++) { ColumnSchema column = routine.getParameter(j); type = column.getDataType(); row = t.getEmptyRowData(); row[specific_cat] = database.getCatalogName().name; row[specific_schem] = routine.getSchemaName().name; row[specific_name] = routine.getSpecificName().name; row[parameter_name] = column.getName().name; row[ordinal_position] = ValuePool.getLong(j + 1); switch (column.getParameterMode()) { case SchemaObject.ParameterModes.PARAM_IN : row[parameter_mode] = "IN"; break; case SchemaObject.ParameterModes.PARAM_OUT : row[parameter_mode] = "OUT"; break; case SchemaObject.ParameterModes.PARAM_INOUT : row[parameter_mode] = "INOUT"; break; } row[is_result] = "NO"; row[as_locator] = "NO"; row[data_type] = type.getFullNameString(); // common type block if (type.isCharacterType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision * 2); row[character_set_catalog] = database.getCatalogName().name; row[character_set_schema] = ((CharacterType) type).getCharacterSet() .getSchemaName().name; row[character_set_name] = ((CharacterType) type).getCharacterSet().getName() .name; row[collation_catalog] = database.getCatalogName().name; row[collation_schema] = ((CharacterType) type).getCollation() .getSchemaName().name; row[collation_name] = ((CharacterType) type).getCollation().getName() .name; } else if (type.isNumberType()) { row[numeric_precision] = ValuePool.getLong( ((NumberType) type).getNumericPrecisionInRadix()); row[numeric_precision_radix] = ValuePool.getLong(type.getPrecisionRadix()); } else if (type.isBooleanType()) { // } else if (type.isDateTimeType()) { row[datetime_precision] = ValuePool.getLong(type.scale); } else if (type.isIntervalType()) { row[data_type] = "INTERVAL"; row[interval_type] = ((IntervalType) type).getQualifier(type.typeCode); row[interval_precision] = ValuePool.getLong(type.precision); row[datetime_precision] = ValuePool.getLong(type.scale); } else if (type.isBinaryType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision); } else if (type.isBitType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision); } else if (type.isArrayType()) { row[maximum_cardinality] = ValuePool.getLong(type.arrayLimitCardinality()); row[data_type] = "ARRAY"; } if (type.isDistinctType()) { row[udt_catalog] = database.getCatalogName().name; row[udt_schema] = type.getSchemaName().name; row[udt_name] = type.getName().name; } row[dtd_identifier] = type.getDefinition(); // end common block t.insertSys(session, store, row); } } } return t; } /** * SQL:2008 VIEW

              * * The REFERENTIAL_CONSTRAINTS view has one row for each FOREIGN KEY * constraint.

              * * Definition:

              * *

                   *      CONSTRAINT_CATALOG             VARCHAR ,
                   *      CONSTRAINT_SCHEMA              VARCHAR ,
                   *      CONSTRAINT_NAME                VARCHAR ,
                   *      UNIQUE_CONSTRAINT_CATALOG      VARCHAR ,
                   *      UNIQUE_CONSTRAINT_SCHEMA       VARCHAR ,
                   *      UNIQUE_CONSTRAINT_NAME         VARCHAR ,
                   *      MATCH_OPTION                   VARCHAR ,
                   *      UPDATE_RULE                    VARCHAR ,
                   *      DELETE_RULE                    VARCHAR ,
                   * 
              * * Description:

              * *

                *
              1. The values of CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA and * CONSTRAINT_NAME are the catalog name, schema name, * and identifier, respectively, of the constraint being * described.

                * *

              2. The values of UNIQUE_CONSTRAINT_CATALOG, UNIQUE_CONSTRAINT_SCHEMA and * UNIQUE_CONSTRAINT_NAME are the catalog name, schema name, * and identifier, respectively, of the referenced UNIQUE constraint.

                * *

              3. A constraint is shown in this view if the user has table level * privilege of at lease one of the types, INSERT, UPDATE, DELETE, * REFERENCES or TRIGGER. *
              * * @return Table */ Table REFERENTIAL_CONSTRAINTS(Session session, PersistentStore store) { Table t = sysTables[REFERENTIAL_CONSTRAINTS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[REFERENTIAL_CONSTRAINTS]); addColumn(t, "CONSTRAINT_CATALOG", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_NAME", SQL_IDENTIFIER); // not null addColumn(t, "UNIQUE_CONSTRAINT_CATALOG", SQL_IDENTIFIER); // not null addColumn(t, "UNIQUE_CONSTRAINT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "UNIQUE_CONSTRAINT_NAME", SQL_IDENTIFIER); addColumn(t, "MATCH_OPTION", CHARACTER_DATA); // not null addColumn(t, "UPDATE_RULE", CHARACTER_DATA); // not null addColumn(t, "DELETE_RULE", CHARACTER_DATA); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[REFERENTIAL_CONSTRAINTS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, }, false); return t; } // column number mappings final int constraint_catalog = 0; final int constraint_schema = 1; final int constraint_name = 2; final int unique_constraint_catalog = 3; final int unique_constraint_schema = 4; final int unique_constraint_name = 5; final int match_option = 6; final int update_rule = 7; final int delete_rule = 8; // Iterator tables; Table table; Constraint[] constraints; Constraint constraint; Object[] row; tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); while (tables.hasNext()) { table = (Table) tables.next(); if (table.isView() || !session.getGrantee().hasNonSelectTableRight(table)) { continue; } constraints = table.getConstraints(); for (int i = 0; i < constraints.length; i++) { constraint = constraints[i]; if (constraint.getConstraintType() != SchemaObject.ConstraintTypes.FOREIGN_KEY) { continue; } HsqlName uniqueName = constraint.getUniqueName(); row = t.getEmptyRowData(); row[constraint_catalog] = database.getCatalogName().name; row[constraint_schema] = constraint.getSchemaName().name; row[constraint_name] = constraint.getName().name; if (isAccessibleTable(session, constraint.getMain())) { row[unique_constraint_catalog] = database.getCatalogName().name; row[unique_constraint_schema] = uniqueName.schema.name; row[unique_constraint_name] = uniqueName.name; } row[match_option] = Tokens.T_NONE; row[update_rule] = constraint.getUpdateActionString(); row[delete_rule] = constraint.getDeleteActionString(); t.insertSys(session, store, row); } } return t; } /** * SQL:2008 VIEW

              * * The ROLE_COLUMN_GRANTS view has one row for each privilege granted to each * ROLE on each column.

              * * Definition:

              * *

                   *      GRANTOR                        VARCHAR ,
                   *      GRANTEE                        VARCHAR ,
                   *      TABLE_CATALOG                  VARCHAR ,
                   *      TABLE_SCHEMA                   VARCHAR ,
                   *      TABLE_NAME                     VARCHAR ,
                   *      COLUMN_NAME                    VARCHAR ,
                   *      PRIVILEGE_TYPE                 VARCHAR ,
                   *      IS_GRANTABLE                   VARCHAR ,
                   * 
              * * Description:

              * *

                *
              1. The values of GRANTOR is the grantor of the privilege. The value of * GRANTEE is the name of the ROLE. * *
              2. The values of TABLE_CATALOG, TABLE_SCHEMA, * TABLE_NAME and COLUMN_NAME are the catalog name, schema name, * table name and column identifier, respectively, of the column grant being * described.

                * *

              3. The value of PRIVILEGE_TYPE is the type of the privilege, including, * 'SELECT', 'UPDATE', 'INSERT', 'REFERENCES' and 'TRIGGER'. * The value IS_GRANTABLE is 'YES' if the privilege is grantable.

                *

              * * @return Table */ Table ROLE_COLUMN_GRANTS(Session session, PersistentStore store) { Table t = sysTables[ROLE_COLUMN_GRANTS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ROLE_COLUMN_GRANTS]); addColumn(t, "GRANTOR", SQL_IDENTIFIER); // not null addColumn(t, "GRANTEE", SQL_IDENTIFIER); // not null addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); // not null addColumn(t, "PRIVILEGE_TYPE", CHARACTER_DATA); // not null addColumn(t, "IS_GRANTABLE", YES_OR_NO); // not null // order: COLUMN_NAME, PRIVILEGE // for unique: GRANTEE, GRANTOR, TABLE_NAME, TABLE_SCHEMA, TABLE_CAT // false PK, as TABLE_SCHEMA and/or TABLE_CAT may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROLE_COLUMN_GRANTS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 5, 6, 1, 0, 4, 3, 2 }, false); return t; } Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); Result rs = sys.executeDirectStatement( "SELECT GRANTOR, GRANTEE, TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, PRIVILEGE_TYPE, IS_GRANTABLE " + "FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES " + "JOIN INFORMATION_SCHEMA.APPLICABLE_ROLES ON GRANTEE = ROLE_NAME;"); t.insertSys(session, store, rs); sys.close(); return t; } /** * SQL:2008 VIEW

              * * The ROLE_ROUTINE_GRANTS view has one row for each privilege granted to each * ROLE on each specific routine.

              * * Definition:

              * *

                   *      GRANTOR                        VARCHAR ,
                   *      GRANTEE                        VARCHAR ,
                   *      SPECIFIC_CATALOG               VARCHAR ,
                   *      SPECIFIC_SCHEMA                VARCHAR ,
                   *      SPECIFIC_NAME                  VARCHAR ,
                   *      ROUTINE_CATALOG                VARCHAR ,
                   *      ROUTINE_SCHEMA                 VARCHAR ,
                   *      ROUTINE_NAME                   VARCHAR ,
                   *      PRIVILEGE_TYPE                 VARCHAR ,
                   *      IS_GRANTABLE                   VARCHAR ,
                   * 
              * * Description:

              * *

                *
              1. The values of GRANTOR is the grantor of the privilege. The value of * GRANTEE is the name of the ROLE. * *
              2. The values of SPECIFIC_CATALOG, SPECIFIC_SCHEMA and * SPECIFIC_NAME are the catalog name, schema name, * routine identifier, respectively, of the grant being * described.

                * *

              3. The value of PRIVILEGE_TYPE is the type of the privilege, including * 'EXECUTE'. * The value IS_GRANTABLE is 'YES' if the privilege is grantable.

                *

              * * @return Table */ Table ROLE_ROUTINE_GRANTS(Session session, PersistentStore store) { Table t = sysTables[ROLE_ROUTINE_GRANTS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ROLE_ROUTINE_GRANTS]); addColumn(t, "GRANTOR", SQL_IDENTIFIER); // not null addColumn(t, "GRANTEE", SQL_IDENTIFIER); // not null addColumn(t, "SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); // not null addColumn(t, "ROUTINE_CATALOG", SQL_IDENTIFIER); addColumn(t, "ROUTINE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "ROUTINE_NAME", SQL_IDENTIFIER); addColumn(t, "PRIVILEGE_TYPE", CHARACTER_DATA); addColumn(t, "IS_GRANTABLE", YES_OR_NO); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROLE_ROUTINE_GRANTS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, false); return t; } Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); Result rs = sys.executeDirectStatement( "SELECT GRANTOR, GRANTEE, SPECIFIC_CATALOG, SPECIFIC_SCHEMA, " + "SPECIFIC_NAME, ROUTINE_CATALOG, ROUTINE_SCHEMA, ROUTINE_NAME, " + "PRIVILEGE_TYPE, IS_GRANTABLE " + "FROM INFORMATION_SCHEMA.ROUTINE_PRIVILEGES " + "JOIN INFORMATION_SCHEMA.APPLICABLE_ROLES ON GRANTEE = ROLE_NAME;"); t.insertSys(session, store, rs); sys.close(); // Column number mappings final int grantor = 0; final int grantee = 1; final int table_name = 2; final int specific_catalog = 3; final int specific_schema = 4; final int specific_name = 5; final int routine_catalog = 6; final int routine_schema = 7; final int routine_name = 8; final int privilege_type = 9; final int is_grantable = 10; // return t; } /** * SQL:2008 VIEW

              * * The ROLE_ROUTINE_GRANTS view has one row for each privilege granted to each * ROLE on each table.

              * * Definition:

              * *

                   *      GRANTOR                        VARCHAR ,
                   *      GRANTEE                        VARCHAR ,
                   *      TABLE_CATALOG                  VARCHAR ,
                   *      TABLE_SCHEMA                   VARCHAR ,
                   *      TABLE_NAME                     VARCHAR ,
                   *      PRIVILEGE_TYPE                 VARCHAR ,
                   *      IS_GRANTABLE                   VARCHAR ,
                   *      WITH_HIERARCHY                 VARCHAR ,
                   * 
              * * Description:

              * *

                *
              1. The values of GRANTOR is the grantor of the privilege. The value of * GRANTEE is the name of the ROLE. * *
              2. The values of TABLE_CATALOG, TABLE_SCHEMA and * TABLE_NAME are the catalog name, schema name and * table name, respectively, of the table level grant being * described.

                * *

              3. The value of PRIVILEGE_TYPE is the type of the privilege, including, * 'DELETE', 'SELECT', 'UPDATE', 'INSERT', 'REFERENCES' and 'TRIGGER'. * The value IS_GRANTABLE is 'YES' if the privilege is grantable.

                *

              * * @return Table */ Table ROLE_TABLE_GRANTS(Session session, PersistentStore store) { Table t = sysTables[ROLE_TABLE_GRANTS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ROLE_TABLE_GRANTS]); addColumn(t, "GRANTOR", SQL_IDENTIFIER); // not null addColumn(t, "GRANTEE", SQL_IDENTIFIER); // not null addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "PRIVILEGE_TYPE", CHARACTER_DATA); // not null addColumn(t, "IS_GRANTABLE", YES_OR_NO); // not null addColumn(t, "WITH_HIERARCHY", YES_OR_NO); // order: TABLE_SCHEM, TABLE_NAME, and PRIVILEGE, // added for unique: GRANTEE, GRANTOR, // false PK, as TABLE_SCHEM and/or TABLE_CAT may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROLE_TABLE_GRANTS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 3, 4, 5, 0, 1 }, false); return t; } Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); Result rs = sys.executeDirectStatement( "SELECT GRANTOR, GRANTEE, TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, " + "PRIVILEGE_TYPE, IS_GRANTABLE, 'NO' " + "FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES " + "JOIN INFORMATION_SCHEMA.APPLICABLE_ROLES ON GRANTEE = ROLE_NAME;"); t.insertSys(session, store, rs); sys.close(); return t; } /** * SQL:2008 VIEW

              * * The ROLE_UDT_GRANT view has one row for each privilege granted to each * user defined type.

              * * Definition:

              * *

                   *      GRANTOR                        VARCHAR ,
                   *      GRANTEE                        VARCHAR ,
                   *      UDT_CATALOG                    VARCHAR ,
                   *      UDT_SCHEMA                     VARCHAR ,
                   *      UDT_NAME                       VARCHAR ,
                   *      PRIVILEGE_TYPE                 VARCHAR ,
                   *      IS_GRANTABLE                   VARCHAR ,
                   * 
              * * Description:

              * *

                *
              1. The values of GRANTOR is the grantor of the privilege. The value of * GRANTEE is the name of the ROLE. * *
              2. The values of UDT_CATALOG, UDT_SCHEMA and * UDT_NAME are the catalog name, schema name and * table name, respectively, of the table level grant being * described.

                * *

              3. The value of PRIVILEGE_TYPE is the type of the privilege, including, * 'USAGE'. * The value IS_GRANTABLE is 'YES' if the privilege is grantable.

                *

              * * @return Table */ Table ROLE_UDT_GRANTS(Session session, PersistentStore store) { Table t = sysTables[ROLE_UDT_GRANTS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ROLE_UDT_GRANTS]); addColumn(t, "GRANTOR", SQL_IDENTIFIER); // not null addColumn(t, "GRANTEE", SQL_IDENTIFIER); // not null addColumn(t, "UDT_CATALOG", SQL_IDENTIFIER); addColumn(t, "UDT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "UDT_NAME", SQL_IDENTIFIER); // not null addColumn(t, "PRIVILEGE_TYPE", CHARACTER_DATA); addColumn(t, "IS_GRANTABLE", YES_OR_NO); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROLE_TABLE_GRANTS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, null, false); return t; } Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); Result rs = sys.executeDirectStatement( "SELECT GRANTOR, GRANTEE, UDT_CATALOG, UDT_SCHEMA, UDT_NAME, " + "PRIVILEGE_TYPE, IS_GRANTABLE " + "FROM INFORMATION_SCHEMA.UDT_PRIVILEGES " + "JOIN INFORMATION_SCHEMA.APPLICABLE_ROLES ON GRANTEE = ROLE_NAME;"); t.insertSys(session, store, rs); sys.close(); return t; } /** * SQL:2008 VIEW

              * * The ROLE_USAGE_GRANTS view has one row for each privilege granted to each * ROLE on each table.

              * * Definition:

              * *

                   *      GRANTOR                        VARCHAR ,
                   *      GRANTEE                        VARCHAR ,
                   *      OBJECT_CATALOG                 VARCHAR ,
                   *      OBJECT_SCHEMA                  VARCHAR ,
                   *      OBJECT_NAME                    VARCHAR ,
                   *      OBJECT_TYPE                    VARCHAR ,
                   *      PRIVILEGE_TYPE                 VARCHAR ,
                   *      IS_GRANTABLE                   VARCHAR ,
                   * 
              * * Description:

              * *

                *
              1. The values of GRANTOR is the grantor of the privilege. The value of * GRANTEE is the name of the ROLE. * *
              2. The values of OBJECT_CATALOG, OBJECT_SCHEMA and * OBJECT_NAME are the catalog name, schema name and * table name, respectively, of the object being * described.

                *

              3. The value of OBJECT_TYPE is they type of object, including 'DOMAIN', 'CHARACTER SET', * 'COLLATION', 'TRANSLATION' and 'SEQUENCE'. *
              4. The value of PRIVILEGE_TYPE is the type of the privilege, including, * 'USAGE'. * The value IS_GRANTABLE is 'YES' if the privilege is grantable.

                *

              * * @return Table */ Table ROLE_USAGE_GRANTS(Session session, PersistentStore store) { Table t = sysTables[ROLE_USAGE_GRANTS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ROLE_USAGE_GRANTS]); addColumn(t, "GRANTOR", SQL_IDENTIFIER); // not null addColumn(t, "GRANTEE", SQL_IDENTIFIER); // not null addColumn(t, "OBJECT_CATALOG", SQL_IDENTIFIER); addColumn(t, "OBJECT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "OBJECT_NAME", SQL_IDENTIFIER); // not null addColumn(t, "OBJECT_TYPE", CHARACTER_DATA); // not null addColumn(t, "PRIVILEGE_TYPE", CHARACTER_DATA); addColumn(t, "IS_GRANTABLE", YES_OR_NO); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROLE_USAGE_GRANTS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5, 6, 7 }, false); return t; } Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); Result rs = sys.executeDirectStatement( "SELECT GRANTOR, GRANTEE, OBJECT_CATALOG, OBJECT_SCHEMA, OBJECT_NAME, " + "OBJECT_TYPE, PRIVILEGE_TYPE, IS_GRANTABLE " + "FROM INFORMATION_SCHEMA.USAGE_PRIVILEGES " + "JOIN INFORMATION_SCHEMA.APPLICABLE_ROLES ON GRANTEE = ROLE_NAME;"); t.insertSys(session, store, rs); sys.close(); return t; } /** * SQL:2008 VIEW

              * * The ROUTINE_COLUMN_USAGE view has one row for each column * referenced in the body of a routine.

              * * Definition:

              * * SPECIFIC_CATALOG VARCHAR , * SPECIFIC_SCHEMA VARCHAR , * SPECIFIC_NAME VARCHAR , * ROUTINE_CATALOG VARCHAR , * ROUTINE_SCHEMA VARCHAR , * ROUTINE_NAME VARCHAR , * TABLE_CATALOG VARCHAR , * TABLE_SCHEMA VARCHAR , * TABLE_NAME VARCHAR , * COLUMN_NAME VARCHAR , * * * * Description:

              * *

                *
              1. The values of SPECIFIC_CATALOG, SPECIFIC_SCHEMA and * SPECIFIC_NAME are the catalog name, schema name, * specific routine identifier, respectively, of the grant being * described.

                *

              2. The values of TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, and * COLUMN_NAME are the catalog name, schema name, * identifier, and column name, respectively, of a column * reference in the routine body.<> * * <1i> Columns are reported only if the user or one of its roles is * the authorization (owner) of the table. * *
              * * @return Table */ Table ROUTINE_COLUMN_USAGE(Session session, PersistentStore store) { Table t = sysTables[ROUTINE_COLUMN_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ROUTINE_COLUMN_USAGE]); addColumn(t, "SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); addColumn(t, "ROUTINE_CATALOG", SQL_IDENTIFIER); addColumn(t, "ROUTINE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "ROUTINE_NAME", SQL_IDENTIFIER); addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROUTINE_COLUMN_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 3, 4, 5, 0, 1, 2, 6, 7, 8, 9 }, false); return t; } // column number mappings final int specific_catalog = 0; final int specific_schema = 1; final int specific_name = 2; final int routine_catalog = 3; final int routine_schema = 4; final int routine_name = 5; final int table_catalog = 6; final int table_schema = 7; final int table_name = 8; final int column_name = 9; // Iterator it; Object[] row; it = database.schemaManager.databaseObjectIterator( SchemaObject.SPECIFIC_ROUTINE); while (it.hasNext()) { Routine routine = (Routine) it.next(); OrderedHashSet set = routine.getReferences(); for (int i = 0; i < set.size(); i++) { HsqlName refName = (HsqlName) set.get(i); if (refName.type != SchemaObject.COLUMN) { continue; } if (!session.getGrantee().isFullyAccessibleByRole(refName)) { continue; } row = t.getEmptyRowData(); // row[specific_catalog] = database.getCatalogName().name; row[specific_schema] = routine.getSchemaName().name; row[specific_name] = routine.getSpecificName().name; row[routine_catalog] = database.getCatalogName().name; row[routine_schema] = routine.getSchemaName().name; row[routine_name] = routine.getName().name; row[table_catalog] = database.getCatalogName().name; row[table_schema] = refName.parent.schema.name; row[table_name] = refName.parent.name; row[column_name] = refName.name; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } return t; } /** * SQL:2008 VIEW

              * * The ROUTINE_PRIVILEGES view has one row for each privilege granted on * a PROCEDURE or CATALOG. * *

                   *      GRANTOR               VARCHAR ,
                   *      GRANTEE               VARCHAR ,
                   *      SPECIFIC_CATALOG      VARCHAR ,
                   *      SPECIFIC_SCHEMA       VARCHAR ,
                   *      SPECIFIC_NAME         VARCHAR ,
                   *      ROUTINE_CATALOG       VARCHAR ,
                   *      ROUTINE_SCHEMA        VARCHAR ,
                   *      ROUTINE_NAME          VARCHAR ,
                   *      PRIVILEGE_TYPE        VARCHAR ,
                   *      IS_GRANTABLE          VARCHAR ,
                   * 
              * * Description:

              * *

                *
              1. The values of GRANTOR is the grantor of the privilege. The value of * GRANTEE is the name of the grantee. * *
              2. The values of SPECIFIC_CATALOG, SPECIFIC_SCHEMA and * SPECIFIC_NAME are the catalog name, schema name * and identifier, respectively, of the specific ROUTINE.

                * *

              3. The values of ROUTINE_CATALOG, ROUTINE_SCHEMA and * ROUTINE_NAME are the catalog name, schema name * and identifier, respectively, of the ROUTINE.

                * *

              4. The value of PRIVILEGE_TYPE is the type of the privilege, including, * 'EXECUTE' * The value IS_GRANTABLE is 'YES' if the privilege is grantable.

                *

              * * @return Table */ Table ROUTINE_PRIVILEGES(Session session, PersistentStore store) { Table t = sysTables[ROUTINE_PRIVILEGES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ROUTINE_PRIVILEGES]); addColumn(t, "GRANTOR", SQL_IDENTIFIER); // not null addColumn(t, "GRANTEE", SQL_IDENTIFIER); // not null addColumn(t, "SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); // not null addColumn(t, "ROUTINE_CATALOG", SQL_IDENTIFIER); addColumn(t, "ROUTINE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "ROUTINE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "PRIVILEGE_TYPE", CHARACTER_DATA); // not null addColumn(t, "IS_GRANTABLE", YES_OR_NO); // not null // HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROUTINE_PRIVILEGES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, false); return t; } // column number mappings final int grantor = 0; final int grantee = 1; final int specific_catalog = 2; final int specific_schema = 3; final int specific_name = 4; final int routine_catalog = 5; final int routine_schema = 6; final int routine_name = 7; final int privilege_type = 8; final int is_grantable = 9; // // calculated column values Grantee granteeObject; String privilege; // intermediate holders Iterator routines; Routine routine; Object[] row; OrderedHashSet grantees = session.getGrantee().visibleGrantees(); routines = database.schemaManager.databaseObjectIterator( SchemaObject.SPECIFIC_ROUTINE); while (routines.hasNext()) { routine = (Routine) routines.next(); for (int i = 0; i < grantees.size(); i++) { granteeObject = (Grantee) grantees.get(i); OrderedHashSet rights = granteeObject.getAllDirectPrivileges(routine); OrderedHashSet grants = granteeObject.getAllGrantedPrivileges(routine); if (!grants.isEmpty()) { grants.addAll(rights); rights = grants; } for (int j = 0; j < rights.size(); j++) { Right right = (Right) rights.get(j); Right grantableRight = right.getGrantableRights(); if (!right.canAccessFully(GrantConstants.EXECUTE)) { continue; } privilege = Tokens.T_EXECUTE; row = t.getEmptyRowData(); // row[grantor] = right.getGrantor().getName().name; row[grantee] = right.getGrantee().getName().name; row[specific_catalog] = database.getCatalogName().name; row[specific_schema] = routine.getSchemaName().name; row[specific_name] = routine.getSpecificName().name; row[routine_catalog] = database.getCatalogName().name; row[routine_schema] = routine.getSchemaName().name; row[routine_name] = routine.getName().name; row[privilege_type] = privilege; row[is_grantable] = right.getGrantee() == routine.getOwner() || grantableRight.canAccessFully( GrantConstants.EXECUTE) ? "YES" : "NO"; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } } return t; } /** * SQL:2008 VIEW

              * * The ROUTINE_JAR_USAGE view has one row for each jar archive * referenced in the body of a Java routine.

              * * Definition:

              * * SPECIFIC_CATALOG VARCHAR , * SPECIFIC_SCHEMA VARCHAR , * SPECIFIC_NAME VARCHAR , * JAR_CATALOG VARCHAR , * JAR_SCHEMA VARCHAR , * JAR_NAME VARCHAR , * * * * Description:

              * *

                *
              1. The values of SPECIFIC_CATALOG, SPECIFIC_SCHEMA and * SPECIFIC_NAME are the catalog name, schema name, * specific routine identifier, respectively.

                * *

              2. The values of JAR_CATALOG, JAR_SCHEMA and JAR_NAME are * the catalog name, schema name, * identifier, and column name, respectively, of a jar * reference in the routine body.<> * * <1i> Currently 'CLASSPATH' is reported for all entries. * *
              * * @return Table */ Table ROUTINE_JAR_USAGE(Session session, PersistentStore store) { Table t = sysTables[ROUTINE_JAR_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ROUTINE_JAR_USAGE]); addColumn(t, "SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); addColumn(t, "JAR_CATALOG", SQL_IDENTIFIER); addColumn(t, "JAR_SCHEMA", SQL_IDENTIFIER); addColumn(t, "JAR_NAME", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROUTINE_JAR_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5 }, false); return t; } // column number mappings final int specific_catalog = 0; final int specific_schema = 1; final int specific_name = 2; final int jar_catalog = 3; final int jar_schema = 4; final int jar_name = 5; // Iterator it; Object[] row; if (!session.isAdmin()) { return t; } it = database.schemaManager.databaseObjectIterator( SchemaObject.SPECIFIC_ROUTINE); while (it.hasNext()) { Routine routine = (Routine) it.next(); if (routine.getLanguage() != Routine.LANGUAGE_JAVA) { continue; } row = t.getEmptyRowData(); row[specific_catalog] = database.getCatalogName().name; row[specific_schema] = routine.getSchemaName().name; row[specific_name] = routine.getSpecificName().name; row[jar_catalog] = database.getCatalogName().name; row[jar_schema] = database.schemaManager.getSQLJSchemaHsqlName().name; row[jar_name] = "CLASSPATH"; t.insertSys(session, store, row); } return t; } /** * SQL:2008 VIEW

              * * The ROUTINE_ROUTINE_USAGE view has one row for each routine * referenced in the body of a routine.

              * * Definition:

              * * SPECIFIC_CATALOG VARCHAR , * SPECIFIC_SCHEMA VARCHAR , * SPECIFIC_NAME VARCHAR , * ROUTINE_CATALOG VARCHAR , * ROUTINE_SCHEMA VARCHAR , * ROUTINE_NAME VARCHAR , * * * * Description:

              * *

                *
              1. The values of SPECIFIC_CATALOG, SPECIFIC_SCHEMA and * SPECIFIC_NAME are the catalog name, schema name, * specific routine identifier, respectively, of the routine * which contains the reference.

                *

              2. The values of ROUTINE_CATALOG, ROUTINE_SCHEMA and ROUTINE_NAME * are the catalog name, schema name and * identifier, respectively, of the routine that is referenced.

                * * <1i> Referenced routines are reported only if the user or one of its roles is * the authorization (owner) of the referenced routine. * *

              * * @return Table */ Table ROUTINE_ROUTINE_USAGE(Session session, PersistentStore store) { Table t = sysTables[ROUTINE_ROUTINE_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ROUTINE_ROUTINE_USAGE]); addColumn(t, "SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); addColumn(t, "ROUTINE_CATALOG", SQL_IDENTIFIER); addColumn(t, "ROUTINE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "ROUTINE_NAME", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROUTINE_ROUTINE_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5 }, false); return t; } // column number mappings final int specific_catalog = 0; final int specific_schema = 1; final int specific_name = 2; final int routine_catalog = 3; final int routine_schema = 4; final int routine_name = 5; // Iterator it; Object[] row; it = database.schemaManager.databaseObjectIterator( SchemaObject.SPECIFIC_ROUTINE); while (it.hasNext()) { Routine routine = (Routine) it.next(); OrderedHashSet set = routine.getReferences(); for (int i = 0; i < set.size(); i++) { HsqlName refName = (HsqlName) set.get(i); if (refName.type != SchemaObject.SPECIFIC_ROUTINE) { continue; } if (!session.getGrantee().isFullyAccessibleByRole(refName)) { continue; } row = t.getEmptyRowData(); row[specific_catalog] = database.getCatalogName().name; row[specific_schema] = routine.getSchemaName().name; row[specific_name] = routine.getSpecificName().name; row[routine_catalog] = database.getCatalogName().name; row[routine_schema] = refName.schema.name; row[routine_name] = refName.name; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } return t; } /** * SQL:2008 VIEW

              * * The ROUTINE_SEQUENCE_USAGE view has one row for each SEQUENCE * referenced in the body of a routine.

              * * Definition:

              * * SPECIFIC_CATALOG VARCHAR , * SPECIFIC_SCHEMA VARCHAR , * SPECIFIC_NAME VARCHAR , * SEQUENCE_CATALOG VARCHAR , * SEQUENCE_SCHEMA VARCHAR , * SEQUENCE_NAME VARCHAR , * * * * Description:

              * *

                *
              1. The values of SPECIFIC_CATALOG, SPECIFIC_SCHEMA and * SPECIFIC_NAME are the catalog name, schema name, * specific routine identifier, respectively, of the routine.

                *

              2. The values of SEQUENCE_CATALOG, SEQUENCE_SCHEMA and SEQUENCE_NAME * are the catalog name, schema name and * identifier, respectively, of a SEQUENCE * reference in the routine body.<> * * <1i> Referenced sequences are reported only if the user or one of its roles is * the authorization (owner) of the SEQUENCE. * *
              * * @return Table */ Table ROUTINE_SEQUENCE_USAGE(Session session, PersistentStore store) { Table t = sysTables[ROUTINE_SEQUENCE_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ROUTINE_SEQUENCE_USAGE]); addColumn(t, "SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); addColumn(t, "SEQUENCE_CATALOG", SQL_IDENTIFIER); addColumn(t, "SEQUENCE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SEQUENCE_NAME", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROUTINE_SEQUENCE_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5 }, false); return t; } // column number mappings final int specific_catalog = 0; final int specific_schema = 1; final int specific_name = 2; final int sequence_catalog = 3; final int sequence_schema = 4; final int sequence_name = 5; // Iterator it; Object[] row; it = database.schemaManager.databaseObjectIterator( SchemaObject.SPECIFIC_ROUTINE); while (it.hasNext()) { Routine routine = (Routine) it.next(); OrderedHashSet set = routine.getReferences(); for (int i = 0; i < set.size(); i++) { HsqlName refName = (HsqlName) set.get(i); if (refName.type != SchemaObject.SEQUENCE) { continue; } if (!session.getGrantee().isFullyAccessibleByRole(refName)) { continue; } row = t.getEmptyRowData(); row[specific_catalog] = database.getCatalogName().name; row[specific_schema] = routine.getSchemaName().name; row[specific_name] = routine.getSpecificName().name; row[sequence_catalog] = database.getCatalogName().name; row[sequence_schema] = refName.schema.name; row[sequence_name] = refName.name; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } return t; } /** * SQL:2008 VIEW

              * * The ROUTINE_TABLE_USAGE view has one row for each TABLE * referenced in the body of a routine.

              * * Definition:

              * * SPECIFIC_CATALOG VARCHAR , * SPECIFIC_SCHEMA VARCHAR , * SPECIFIC_NAME VARCHAR , * ROUTINE_CATALOG VARCHAR , * ROUTINE_SCHEMA VARCHAR , * ROUTINE_NAME VARCHAR , * TABLE_CATALOG VARCHAR , * TABLE_SCHEMA VARCHAR , * TABLE_NAME VARCHAR , * * * * Description:

              * *

                *
              1. The values of SPECIFIC_CATALOG, SPECIFIC_SCHEMA and * SPECIFIC_NAME are the catalog name, schema name, * specific routine identifier, respectively, of the routine.

                *

              2. The values of TABLE_CATALOG, TABLE_SCHEMA and TABLE_NAME * are the catalog name, schema name and * identifier, respectively, of a TABLE * reference in the routine body.<> * * <1i> Tables are reported only if the user or one of its roles is * the authorization (owner) of the TABLE. * *
              * * @return Table */ Table ROUTINE_TABLE_USAGE(Session session, PersistentStore store) { Table t = sysTables[ROUTINE_TABLE_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ROUTINE_TABLE_USAGE]); addColumn(t, "SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); addColumn(t, "ROUTINE_CATALOG", SQL_IDENTIFIER); addColumn(t, "ROUTINE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "ROUTINE_NAME", SQL_IDENTIFIER); addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROUTINE_TABLE_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 3, 4, 5, 0, 1, 2, 6, 7, 8 }, false); return t; } // column number mappings final int specific_catalog = 0; final int specific_schema = 1; final int specific_name = 2; final int routine_catalog = 3; final int routine_schema = 4; final int routine_name = 5; final int table_catalog = 6; final int table_schema = 7; final int table_name = 8; // Iterator it; Object[] row; it = database.schemaManager.databaseObjectIterator( SchemaObject.SPECIFIC_ROUTINE); while (it.hasNext()) { Routine routine = (Routine) it.next(); OrderedHashSet set = routine.getReferences(); for (int i = 0; i < set.size(); i++) { HsqlName refName = (HsqlName) set.get(i); if (refName.type != SchemaObject.TABLE && refName.type != SchemaObject.VIEW) { continue; } if (!session.getGrantee().isFullyAccessibleByRole(refName)) { continue; } row = t.getEmptyRowData(); row[specific_catalog] = database.getCatalogName().name; row[specific_schema] = routine.getSchemaName().name; row[specific_name] = routine.getSpecificName().name; row[routine_catalog] = database.getCatalogName().name; row[routine_schema] = routine.getSchemaName().name; row[routine_name] = routine.getName().name; row[table_catalog] = database.getCatalogName().name; row[table_schema] = refName.schema.name; row[table_name] = refName.name; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } return t; } /** * SQL:2008 VIEW

              * * The ROUTINES view has one row for each PROCEDURE and FUNCTION.

              * */ Table ROUTINES(Session session, PersistentStore store) { Table t = sysTables[ROUTINES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[ROUTINES]); addColumn(t, "SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); addColumn(t, "ROUTINE_CATALOG", SQL_IDENTIFIER); addColumn(t, "ROUTINE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "ROUTINE_NAME", SQL_IDENTIFIER); addColumn(t, "ROUTINE_TYPE", CHARACTER_DATA); addColumn(t, "MODULE_CATALOG", SQL_IDENTIFIER); addColumn(t, "MODULE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "MODULE_NAME", SQL_IDENTIFIER); addColumn(t, "UDT_CATALOG", SQL_IDENTIFIER); addColumn(t, "UDT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "UDT_NAME", SQL_IDENTIFIER); addColumn(t, "DATA_TYPE", CHARACTER_DATA); addColumn(t, "CHARACTER_MAXIMUM_LENGTH", CARDINAL_NUMBER); addColumn(t, "CHARACTER_OCTET_LENGTH", CARDINAL_NUMBER); addColumn(t, "CHARACTER_SET_CATALOG", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_NAME", SQL_IDENTIFIER); addColumn(t, "COLLATION_CATALOG", SQL_IDENTIFIER); addColumn(t, "COLLATION_SCHEMA", SQL_IDENTIFIER); // addColumn(t, "COLLATION_NAME", SQL_IDENTIFIER); addColumn(t, "NUMERIC_PRECISION", CARDINAL_NUMBER); // addColumn(t, "NUMERIC_PRECISION_RADIX", CARDINAL_NUMBER); addColumn(t, "NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "DATETIME_PRECISION", CARDINAL_NUMBER); addColumn(t, "INTERVAL_TYPE", CHARACTER_DATA); addColumn(t, "INTERVAL_PRECISION", CARDINAL_NUMBER); addColumn(t, "TYPE_UDT_CATALOG", SQL_IDENTIFIER); addColumn(t, "TYPE_UDT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TYPE_UDT_NAME", SQL_IDENTIFIER); addColumn(t, "SCOPE_CATALOG", SQL_IDENTIFIER); addColumn(t, "SCOPE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SCOPE_NAME", SQL_IDENTIFIER); // addColumn(t, "MAXIMUM_CARDINALITY", CARDINAL_NUMBER); // (only for array tyes) addColumn(t, "DTD_IDENTIFIER", SQL_IDENTIFIER); addColumn(t, "ROUTINE_BODY", CHARACTER_DATA); addColumn(t, "ROUTINE_DEFINITION", CHARACTER_DATA); addColumn(t, "EXTERNAL_NAME", CHARACTER_DATA); addColumn(t, "EXTERNAL_LANGUAGE", CHARACTER_DATA); addColumn(t, "PARAMETER_STYLE", CHARACTER_DATA); addColumn(t, "IS_DETERMINISTIC", YES_OR_NO); addColumn(t, "SQL_DATA_ACCESS", CHARACTER_DATA); addColumn(t, "IS_NULL_CALL", YES_OR_NO); addColumn(t, "SQL_PATH", CHARACTER_DATA); addColumn(t, "SCHEMA_LEVEL_ROUTINE", YES_OR_NO); // addColumn(t, "MAX_DYNAMIC_RESULT_SETS", CARDINAL_NUMBER); addColumn(t, "IS_USER_DEFINED_CAST", YES_OR_NO); addColumn(t, "IS_IMPLICITLY_INVOCABLE", YES_OR_NO); addColumn(t, "SECURITY_TYPE", CHARACTER_DATA); addColumn(t, "TO_SQL_SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "TO_SQL_SPECIFIC_SCHEMA", SQL_IDENTIFIER); // addColumn(t, "TO_SQL_SPECIFIC_NAME", SQL_IDENTIFIER); addColumn(t, "AS_LOCATOR", YES_OR_NO); addColumn(t, "CREATED", TIME_STAMP); addColumn(t, "LAST_ALTERED", TIME_STAMP); addColumn(t, "NEW_SAVEPOINT_LEVEL", YES_OR_NO); addColumn(t, "IS_UDT_DEPENDENT", YES_OR_NO); addColumn(t, "RESULT_CAST_FROM_DATA_TYPE", CHARACTER_DATA); addColumn(t, "RESULT_CAST_AS_LOCATOR", YES_OR_NO); addColumn(t, "RESULT_CAST_CHAR_MAX_LENGTH", CARDINAL_NUMBER); addColumn(t, "RESULT_CAST_CHAR_OCTET_LENGTH", CARDINAL_NUMBER); addColumn(t, "RESULT_CAST_CHAR_SET_CATALOG", CHARACTER_DATA); addColumn(t, "RESULT_CAST_CHAR_SET_SCHEMA", SQL_IDENTIFIER); addColumn(t, "RESULT_CAST_CHARACTER_SET_NAME", SQL_IDENTIFIER); addColumn(t, "RESULT_CAST_COLLATION_CATALOG", SQL_IDENTIFIER); addColumn(t, "RESULT_CAST_COLLATION_SCHEMA", SQL_IDENTIFIER); addColumn(t, "RESULT_CAST_COLLATION_NAME", SQL_IDENTIFIER); addColumn(t, "RESULT_CAST_NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "RESULT_CAST_NUMERIC_RADIX", CARDINAL_NUMBER); addColumn(t, "RESULT_CAST_NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "RESULT_CAST_DATETIME_PRECISION", CARDINAL_NUMBER); addColumn(t, "RESULT_CAST_INTERVAL_TYPE", CHARACTER_DATA); addColumn(t, "RESULT_CAST_INTERVAL_PRECISION", CARDINAL_NUMBER); addColumn(t, "RESULT_CAST_TYPE_UDT_CATALOG", SQL_IDENTIFIER); addColumn(t, "RESULT_CAST_TYPE_UDT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "RESULT_CAST_TYPE_UDT_NAME", SQL_IDENTIFIER); addColumn(t, "RESULT_CAST_SCOPE_CATALOG", SQL_IDENTIFIER); addColumn(t, "RESULT_CAST_SCOPE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "RESULT_CAST_SCOPE_NAME", SQL_IDENTIFIER); addColumn(t, "RESULT_CAST_MAX_CARDINALITY", CARDINAL_NUMBER); addColumn(t, "RESULT_CAST_DTD_IDENTIFIER", CHARACTER_DATA); addColumn(t, "DECLARED_DATA_TYPE", CHARACTER_DATA); addColumn(t, "DECLARED_NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "DECLARED_NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "RESULT_CAST_FROM_DECLARED_DATA_TYPE", CHARACTER_DATA); addColumn(t, "RESULT_CAST_DECLARED_NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "RESULT_CAST_DECLARED_NUMERIC_SCALE", CARDINAL_NUMBER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROUTINES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 3, 4, 5, 0, 1, 2 }, false); return t; } // column number mappings final int specific_catalog = 0; final int specific_schema = 1; final int specific_name = 2; final int routine_catalog = 3; final int routine_schema = 4; final int routine_name = 5; final int routine_type = 6; final int module_catalog = 7; final int module_schema = 8; final int module_name = 9; final int udt_catalog = 10; final int udt_schema = 11; final int udt_name = 12; final int data_type = 13; final int character_maximum_length = 14; final int character_octet_length = 15; final int character_set_catalog = 16; final int character_set_schema = 17; final int character_set_name = 18; final int collation_catalog = 19; final int collation_schema = 20; final int collation_name = 21; final int numeric_precision = 22; final int numeric_precision_radix = 23; final int numeric_scale = 24; final int datetime_precision = 25; final int interval_type = 26; final int interval_precision = 27; final int type_udt_catalog = 28; final int type_udt_schema = 29; final int type_udt_name = 30; final int scope_catalog = 31; final int scope_schema = 32; final int scope_name = 33; final int maximum_cardinality = 34; final int dtd_identifier = 35; final int routine_body = 36; final int routine_definition = 37; final int external_name = 38; final int external_language = 39; final int parameter_style = 40; final int is_deterministic = 41; final int sql_data_access = 42; final int is_null_call = 43; final int sql_path = 44; final int schema_level_routine = 45; final int max_dynamic_result_sets = 46; final int is_user_defined_cast = 47; final int is_implicitly_invocable = 48; final int security_type = 49; final int to_sql_specific_catalog = 50; final int to_sql_specific_schema = 51; final int to_sql_specific_name = 52; final int as_locator = 53; final int created = 54; final int last_altered = 55; final int new_savepoint_level = 56; final int is_udt_dependent = 57; final int result_cast_from_data_type = 58; final int result_cast_as_locator = 59; final int result_cast_char_max_length = 60; final int result_cast_char_octet_length = 61; final int result_cast_char_set_catalog = 62; final int result_cast_char_set_schema = 63; final int result_cast_character_set_name = 64; final int result_cast_collation_catalog = 65; final int result_cast_collation_schema = 66; final int result_cast_collation_name = 67; final int result_cast_numeric_precision = 68; final int result_cast_numeric_radix = 69; final int result_cast_numeric_scale = 70; final int result_cast_datetime_precision = 71; final int result_cast_interval_type = 72; final int result_cast_interval_precision = 73; final int result_cast_type_udt_catalog = 74; final int result_cast_type_udt_schema = 75; final int result_cast_type_udt_name = 76; final int result_cast_scope_catalog = 77; final int result_cast_scope_schema = 78; final int result_cast_scope_name = 79; final int result_cast_max_cardinality = 80; final int result_cast_dtd_identifier = 81; final int declared_data_type = 82; final int declared_numeric_precision = 83; final int declared_numeric_scale = 84; final int result_cast_from_declared_data_type = 85; final int result_cast_declared_numeric_precision = 86; final int result_cast_declared_numeric_scale = 87; // Iterator it; Object[] row; it = database.schemaManager.databaseObjectIterator( SchemaObject.SPECIFIC_ROUTINE); while (it.hasNext()) { Routine routine = (Routine) it.next(); boolean isFullyAccessible; if (!session.getGrantee().isAccessible(routine)) { continue; } isFullyAccessible = session.getGrantee().isFullyAccessibleByRole( routine.getName()); row = t.getEmptyRowData(); Type type = routine.isProcedure() ? null : routine.getReturnType(); // row[specific_catalog] = database.getCatalogName().name; row[specific_schema] = routine.getSchemaName().name; row[specific_name] = routine.getSpecificName().name; row[routine_catalog] = database.getCatalogName().name; row[routine_schema] = routine.getSchemaName().name; row[routine_name] = routine.getName().name; row[routine_type] = routine.isProcedure() ? Tokens.T_PROCEDURE : Tokens.T_FUNCTION; row[module_catalog] = null; row[module_schema] = null; row[module_name] = null; row[udt_catalog] = null; row[udt_schema] = null; row[udt_name] = null; row[data_type] = type == null ? null : type.getNameString(); if (type != null) { // common type block if (type.isCharacterType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision * 2); row[character_set_catalog] = database.getCatalogName().name; row[character_set_schema] = ((CharacterType) type).getCharacterSet() .getSchemaName().name; row[character_set_name] = ((CharacterType) type).getCharacterSet().getName() .name; row[collation_catalog] = database.getCatalogName().name; row[collation_schema] = ((CharacterType) type).getCollation().getSchemaName() .name; row[collation_name] = ((CharacterType) type).getCollation().getName().name; } else if (type.isNumberType()) { row[numeric_precision] = ValuePool.getLong( ((NumberType) type).getNumericPrecisionInRadix()); row[declared_numeric_precision] = ValuePool.getLong( ((NumberType) type).getNumericPrecisionInRadix()); if (type.isExactNumberType()) { row[numeric_scale] = row[declared_numeric_scale] = ValuePool.getLong(type.scale); } row[numeric_precision_radix] = ValuePool.getLong(type.getPrecisionRadix()); } else if (type.isBooleanType()) { // } else if (type.isDateTimeType()) { row[datetime_precision] = ValuePool.getLong(type.scale); } else if (type.isIntervalType()) { row[data_type] = "INTERVAL"; row[interval_type] = ((IntervalType) type).getQualifier(type.typeCode); row[interval_precision] = ValuePool.getLong(type.precision); row[datetime_precision] = ValuePool.getLong(type.scale); } else if (type.isBinaryType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision); } else if (type.isBitType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision); } else if (type.isArrayType()) { row[maximum_cardinality] = ValuePool.getLong(type.arrayLimitCardinality()); row[data_type] = "ARRAY"; } row[dtd_identifier] = type.getDefinition(); row[declared_data_type] = row[data_type]; // end common block } row[type_udt_catalog] = null; row[type_udt_schema] = null; row[type_udt_name] = null; row[scope_catalog] = null; row[scope_schema] = null; row[scope_name] = null; row[routine_body] = routine.getLanguage() == Routine.LANGUAGE_JAVA ? "EXTERNAL" : "SQL"; row[routine_definition] = isFullyAccessible ? routine.getSQL() : null; row[external_name] = routine.getExternalName(); row[external_language] = routine.getLanguage() == Routine.LANGUAGE_JAVA ? "JAVA" : null; row[parameter_style] = routine.getLanguage() == Routine.LANGUAGE_JAVA ? "JAVA" : null; row[is_deterministic] = routine.isDeterministic() ? "YES" : "NO"; row[sql_data_access] = routine.getDataImpactString(); row[is_null_call] = type == null ? null : routine.isNullInputOutput() ? "YES" : "NO"; row[sql_path] = null; row[schema_level_routine] = "YES"; row[max_dynamic_result_sets] = ValuePool.getLong(0); row[is_user_defined_cast] = type == null ? null : "NO"; row[is_implicitly_invocable] = null; row[security_type] = "DEFINER"; row[to_sql_specific_catalog] = null; row[to_sql_specific_schema] = null; row[to_sql_specific_name] = null; row[as_locator] = type == null ? null : "NO"; row[created] = null; row[last_altered] = null; row[new_savepoint_level] = "YES"; row[is_udt_dependent] = null; row[result_cast_from_data_type] = null; row[result_cast_as_locator] = null; row[result_cast_char_max_length] = null; row[result_cast_char_octet_length] = null; row[result_cast_char_set_catalog] = null; row[result_cast_char_set_schema] = null; row[result_cast_character_set_name] = null; row[result_cast_collation_catalog] = null; row[result_cast_collation_schema] = null; row[result_cast_collation_name] = null; row[result_cast_numeric_precision] = null; row[result_cast_numeric_radix] = null; row[result_cast_numeric_scale] = null; row[result_cast_datetime_precision] = null; row[result_cast_interval_type] = null; row[result_cast_interval_precision] = null; row[result_cast_type_udt_catalog] = null; row[result_cast_type_udt_schema] = null; row[result_cast_type_udt_name] = null; row[result_cast_scope_catalog] = null; row[result_cast_scope_schema] = null; row[result_cast_scope_name] = null; row[result_cast_max_cardinality] = null; row[result_cast_dtd_identifier] = null; row[declared_data_type] = row[data_type]; row[declared_numeric_precision] = row[numeric_precision]; row[declared_numeric_scale] = row[numeric_scale]; row[result_cast_from_declared_data_type] = null; row[result_cast_declared_numeric_precision] = null; row[result_cast_declared_numeric_scale] = null; t.insertSys(session, store, row); } return t; } /** * SQL:2008 VIEW

              * * The SCHEMATA view has one row for each accessible schema.

              * * Definition:

              * * CATALOG_NAME VARCHAR , * SCHEMA_NAME VARCHAR , * SCHEMA_OWNER VARCHAR , * DEFAULT_CHARACTER_SET_CATALOG VARCHAR , * DEFAULT_CHARACTER_SET_SCHEMA VARCHAR , * DEFAULT_CHARACTER_SET_NAME VARCHAR , * SQL_PATH VARCHAR , * * * * Description

              * *

                *
              1. The value of CATALOG_NAME is the name of the catalog of the * schema described by this row.

                * *

              2. The value of SCHEMA_NAME is the schema name of * the schema described by this row.

                * *

              3. The values of SCHEMA_OWNER are the authorization identifiers * that own the schemata.

                * *

              4. The values of DEFAULT_CHARACTER_SET_CATALOG, * DEFAULT_CHARACTER_SET_SCHEMA, and DEFAULT_CHARACTER_SET_NAME * are the catalog name, schema name, and qualified * identifier, respectively, of the default character set for * columns and domains in the schemata.

                * *

              5. Case:

                *

                  *
                • If <schema path specification> was specified in * the <schema definition> that defined the schema * described by this row and the character representation * of the <schema path specification> can be * represented without truncation, then the value of * SQL_PATH is that character representation.

                  * *

                • Otherwise, the value of SQL_PATH is the null value. *
                *
              * * @return Table */ Table SCHEMATA(Session session, PersistentStore store) { Table t = sysTables[SCHEMATA]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SCHEMATA]); addColumn(t, "CATALOG_NAME", SQL_IDENTIFIER); addColumn(t, "SCHEMA_NAME", SQL_IDENTIFIER); addColumn(t, "SCHEMA_OWNER", SQL_IDENTIFIER); addColumn(t, "DEFAULT_CHARACTER_SET_CATALOG", SQL_IDENTIFIER); addColumn(t, "DEFAULT_CHARACTER_SET_SCHEMA", SQL_IDENTIFIER); addColumn(t, "DEFAULT_CHARACTER_SET_NAME", SQL_IDENTIFIER); addColumn(t, "SQL_PATH", CHARACTER_DATA); // order: CATALOG_NAME, SCHEMA_NAME // false PK, as rows may have NULL CATALOG_NAME HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SCHEMATA].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1 }, false); return t; } // Intermediate holders Schema[] schemas; Schema schema; String dcsSchema = SqlInvariants.INFORMATION_SCHEMA; String dcsName = "SQL_TEXT"; String sqlPath = null; Grantee user = session.getGrantee(); Object[] row; // column number mappings final int schema_catalog = 0; final int schema_name = 1; final int schema_owner = 2; final int default_character_set_catalog = 3; final int default_character_set_schema = 4; final int default_character_set_name = 5; final int sql_path = 6; // Initialization schemas = database.schemaManager.getAllSchemas(); // Do it. for (int i = 0; i < schemas.length; i++) { schema = schemas[i]; if (!user.hasSchemaUpdateOrGrantRights( schema.getName().getNameString())) { continue; } row = t.getEmptyRowData(); row[schema_catalog] = database.getCatalogName().name; row[schema_name] = schema.getName().getNameString(); row[schema_owner] = schema.getOwner().getName().getNameString(); row[default_character_set_catalog] = database.getCatalogName().name; row[default_character_set_schema] = dcsSchema; row[default_character_set_name] = dcsName; row[sql_path] = sqlPath; t.insertSys(session, store, row); } return t; } /** * SQL:2008 VIEW

              * * The SQL_FEATURES view lists the individual features of the SQL Standard * supported by HyperSQL.

              * */ Table SQL_FEATURES(Session session, PersistentStore store) { Table t = sysTables[SQL_FEATURES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SQL_FEATURES]); addColumn(t, "FEATURE_ID", CHARACTER_DATA); addColumn(t, "FEATURE_NAME", CHARACTER_DATA); addColumn(t, "SUB_FEATURE_ID", CHARACTER_DATA); addColumn(t, "SUB_FEATURE_NAME", CHARACTER_DATA); addColumn(t, "IS_SUPPORTED", YES_OR_NO); addColumn(t, "IS_VERIFIED_BY", CHARACTER_DATA); addColumn(t, "COMMENTS", CHARACTER_DATA); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SQL_FEATURES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 2 }, false); return t; } Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); String sql = (String) statementMap.get("/*sql_features*/"); Result rs = sys.executeDirectStatement(sql); t.insertSys(session, store, rs); return t; } /** * SQL:2008 VIEW

              * * The SQL_IMPLEMENTATION_INFO view is empty.

              * */ Table SQL_IMPLEMENTATION_INFO(Session session, PersistentStore store) { Table t = sysTables[SQL_IMPLEMENTATION_INFO]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SQL_IMPLEMENTATION_INFO]); addColumn(t, "IMPLEMENTATION_INFO_ID", CARDINAL_NUMBER); addColumn(t, "IMPLEMENTATION_INFO_NAME", CHARACTER_DATA); addColumn(t, "INTEGER_VALUE", CARDINAL_NUMBER); addColumn(t, "CHARACTER_VALUE", CHARACTER_DATA); addColumn(t, "COMMENTS", CHARACTER_DATA); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SQL_IMPLEMENTATION_INFO].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, false); return t; } Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); String sql = (String) statementMap.get("/*sql_implementation_info*/"); Result rs = sys.executeDirectStatement(sql); t.insertSys(session, store, rs); return t; } /** * SQL:2008 VIEW

              * * The SQL_PACHAGES view lists the packages of the SQL Standard supported by * HyperSQL.

              * */ Table SQL_PACKAGES(Session session, PersistentStore store) { Table t = sysTables[SQL_PACKAGES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SQL_PACKAGES]); addColumn(t, "ID", CHARACTER_DATA); addColumn(t, "NAME", CHARACTER_DATA); addColumn(t, "IS_SUPPORTED", YES_OR_NO); addColumn(t, "IS_VERIFIED_BY", CHARACTER_DATA); addColumn(t, "COMMENTS", CHARACTER_DATA); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SQL_PACKAGES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, false); return t; } Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); String sql = (String) statementMap.get("/*sql_packages*/"); Result rs = sys.executeDirectStatement(sql); t.insertSys(session, store, rs); return t; } /** * SQL:2008 VIEW

              * * The SQL_PARTS view lists the parts of the SQL Standard supported by * HyperSQL.

              * */ Table SQL_PARTS(Session session, PersistentStore store) { Table t = sysTables[SQL_PARTS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SQL_PARTS]); addColumn(t, "PART", CHARACTER_DATA); addColumn(t, "NAME", CHARACTER_DATA); addColumn(t, "IS_SUPPORTED", YES_OR_NO); addColumn(t, "IS_VERIFIED_BY", CHARACTER_DATA); addColumn(t, "COMMENTS", CHARACTER_DATA); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SQL_PARTS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, false); return t; } Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); String sql = (String) statementMap.get("/*sql_parts*/"); Result rs = sys.executeDirectStatement(sql); t.insertSys(session, store, rs); return t; } /** * SQL:2008 VIEW

              * * The SQL_SIZING view has one row for the maximum size of each built in * type supported by HyperSQL.

              * */ Table SQL_SIZING(Session session, PersistentStore store) { Table t = sysTables[SQL_SIZING]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SQL_SIZING]); addColumn(t, "SIZING_ID", CARDINAL_NUMBER); addColumn(t, "SIZING_NAME", CHARACTER_DATA); addColumn(t, "SUPPORTED_VALUE", CARDINAL_NUMBER); addColumn(t, "COMMENTS", CHARACTER_DATA); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SQL_SIZING].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, false); return t; } Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); String sql = (String) statementMap.get("/*sql_sizing*/"); Result rs = sys.executeDirectStatement(sql); t.insertSys(session, store, rs); return t; } /** * SQL:2008 VIEW

              * * The SQL_SIZING_PROFILES is empty.

              * */ Table SQL_SIZING_PROFILES(Session session, PersistentStore store) { Table t = sysTables[SQL_SIZING_PROFILES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[SQL_SIZING_PROFILES]); addColumn(t, "SIZING_ID", CARDINAL_NUMBER); addColumn(t, "SIZING_NAME", CHARACTER_DATA); addColumn(t, "PROFILE_ID", CARDINAL_NUMBER); addColumn(t, "PROFILE_NAME", CHARACTER_DATA); addColumn(t, "REQUIRED_VALUE", CARDINAL_NUMBER); addColumn(t, "COMMENTS", CHARACTER_DATA); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[SQL_SIZING_PROFILES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[]{ 0 }, false); return t; } Session sys = database.sessionManager.newSysSession( SqlInvariants.INFORMATION_SCHEMA_HSQLNAME, session.getUser()); /* Result rs = sys.executeDirectStatement( "VALUES " + ";"); t.insertSys(session, store, rs); */ return t; } /** * The TABLE_CONSTRAINTS table has one row for each table constraint * associated with a table.

              * * It effectively contains a representation of the table constraint * descriptors.

              * * Definition:

              * *

                   * CREATE TABLE SYSTEM_TABLE_CONSTRAINTS (
                   *      CONSTRAINT_CATALOG      VARCHAR NULL,
                   *      CONSTRAINT_SCHEMA       VARCHAR NULL,
                   *      CONSTRAINT_NAME         VARCHAR NOT NULL,
                   *      CONSTRAINT_TYPE         VARCHAR NOT NULL,
                   *      TABLE_CATALOG           VARCHAR NULL,
                   *      TABLE_SCHEMA            VARCHAR NULL,
                   *      TABLE_NAME              VARCHAR NOT NULL,
                   *      IS_DEFERRABLE           VARCHAR NOT NULL,
                   *      INITIALLY_DEFERRED      VARCHAR NOT NULL,
                   *
                   *      CHECK ( CONSTRAINT_TYPE IN
                   *                      ( 'UNIQUE', 'PRIMARY KEY',
                   *                        'FOREIGN KEY', 'CHECK' ) ),
                   *
                   *      CHECK ( ( IS_DEFERRABLE, INITIALLY_DEFERRED ) IN
                   *              ( VALUES ( 'NO',  'NO'  ),
                   *                       ( 'YES', 'NO'  ),
                   *                       ( 'YES', 'YES' ) ) )
                   * )
                   * 
              * * Description:

              * *

                *
              1. The values of CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, and * CONSTRAINT_NAME are the catalog name, schema * name, and identifier, respectively, of the * constraint being described. If the <table constraint * definition> or <add table constraint definition> * that defined the constraint did not specify a * <constraint name>, then the values of CONSTRAINT_CATALOG, * CONSTRAINT_SCHEMA, and CONSTRAINT_NAME are * implementation-defined.

                * *

              2. The values of CONSTRAINT_TYPE have the following meanings:

                * * * * * * * * * * * * * * * * * *
                FOREIGN KEYThe constraint being described is a * foreign key constraint.
                UNIQUEThe constraint being described is a * unique constraint.
                PRIMARY KEYThe constraint being described is a * primary key constraint.
                CHECKThe constraint being described is a * check constraint.

                * *

              3. The values of TABLE_CATALOG, TABLE_SCHEMA, and TABLE_NAME are * the catalog name, the schema name, and the * name of the table to which the * table constraint being described applies.

                * *

              4. The values of IS_DEFERRABLE have the following meanings:

                * * * * * * * * * * *
                YESThe table constraint is deferrable.
                NOThe table constraint is not deferrable.

                * *

              5. The values of INITIALLY_DEFERRED have the following meanings:

                * * * * * * * * * * *
                YESThe table constraint is initially deferred.
                NOThe table constraint is initially immediate.

                *

              * * @return Table */ Table TABLE_CONSTRAINTS(Session session, PersistentStore store) { Table t = sysTables[TABLE_CONSTRAINTS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[TABLE_CONSTRAINTS]); addColumn(t, "CONSTRAINT_CATALOG", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CONSTRAINT_NAME", SQL_IDENTIFIER); // not null addColumn(t, "CONSTRAINT_TYPE", CHARACTER_DATA); // not null addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "IS_DEFERRABLE", YES_OR_NO); // not null addColumn(t, "INITIALLY_DEFERRED", YES_OR_NO); // not null // false PK, as CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, // TABLE_CATALOG and/or TABLE_SCHEMA may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[TABLE_CONSTRAINTS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 4, 5, 6 }, false); return t; } // Intermediate holders Iterator tables; Table table; Constraint[] constraints; int constraintCount; Constraint constraint; String cat; String schem; Object[] row; // column number mappings final int constraint_catalog = 0; final int constraint_schema = 1; final int constraint_name = 2; final int constraint_type = 3; final int table_catalog = 4; final int table_schema = 5; final int table_name = 6; final int is_deferable = 7; final int initially_deferred = 8; // initialization tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); table = null; // else compiler complains // do it while (tables.hasNext()) { table = (Table) tables.next(); /** requires any INSERT or UPDATE or DELETE or REFERENCES or TRIGGER, (not SELECT) right */ if (table.isView() || !session.getGrantee().hasNonSelectTableRight(table)) { continue; } constraints = table.getConstraints(); constraintCount = constraints.length; for (int i = 0; i < constraintCount; i++) { constraint = constraints[i]; row = t.getEmptyRowData(); switch (constraint.getConstraintType()) { case SchemaObject.ConstraintTypes.CHECK : { row[constraint_type] = "CHECK"; break; } case SchemaObject.ConstraintTypes.UNIQUE : { row[constraint_type] = "UNIQUE"; break; } case SchemaObject.ConstraintTypes.FOREIGN_KEY : { row[constraint_type] = "FOREIGN KEY"; table = constraint.getRef(); break; } case SchemaObject.ConstraintTypes.PRIMARY_KEY : { row[constraint_type] = "PRIMARY KEY"; break; } case SchemaObject.ConstraintTypes.MAIN : default : { continue; } } cat = database.getCatalogName().name; schem = table.getSchemaName().name; row[constraint_catalog] = cat; row[constraint_schema] = schem; row[constraint_name] = constraint.getName().name; row[table_catalog] = cat; row[table_schema] = schem; row[table_name] = table.getName().name; row[is_deferable] = Tokens.T_NO; row[initially_deferred] = Tokens.T_NO; t.insertSys(session, store, row); } } return t; } /** * SQL:2008 VIEW

              * * The TRANSLATIONS view has one row for each translation between two * character sets.

              * */ Table TRANSLATIONS(Session session, PersistentStore store) { Table t = sysTables[TRANSLATIONS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[TRANSLATIONS]); addColumn(t, "TRANSLATION_CATALOG", SQL_IDENTIFIER); addColumn(t, "TRANSLATION_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TRANSLATION_NAME", SQL_IDENTIFIER); addColumn(t, "SOURCE_CHARACTER_SET_CATALOG", SQL_IDENTIFIER); addColumn(t, "SOURCE_CHARACTER_SET_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SOURCE_CHARACTER_SET_NAME", SQL_IDENTIFIER); addColumn(t, "TARGET_CHARACTER_SET_CATALOG", SQL_IDENTIFIER); addColumn(t, "TARGET_CHARACTER_SET_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TARGET_CHARACTER_SET_NAME", SQL_IDENTIFIER); addColumn(t, "TRANSLATION_SOURCE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TRANSLATION_SOURCE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TRANSLATION_SOURCE_NAME", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[TRANSLATIONS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2 }, false); return t; } return t; } /** * SQL:2008 VIEW

              * * The TRIGGER_COLUMN_USAGE view has one row for each column * referenced in the body of a trigger.

              * * Definition:

              * * TRIGGER_CATALOG VARCHAR , * TRIGGER_SCHEMA VARCHAR , * TRIGGER_NAME VARCHAR , * TABLE_CATALOG VARCHAR , * TABLE_SCHEMA VARCHAR , * TABLE_NAME VARCHAR , * COLUMN_NAME VARCHAR , * * * * Description:

              * *

                *
              1. The values of TRIGGER_CATALOG, TRIGGER_SCHEMA and * TRIGGER_NAME are the catalog name, schema name and * identifier, respectively, of the trigger.

                *

              2. The values of TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, and * COLUMN_NAME are the catalog name, schema name, * identifier, and column name, respectively, of a column * reference in the trigger body.<> * * <1i> Columns are reported only if the user or one of its roles is * the authorization (owner) of the TRIGGER. * *
              * * @return Table */ Table TRIGGER_COLUMN_USAGE(Session session, PersistentStore store) { Table t = sysTables[TRIGGER_COLUMN_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[TRIGGER_COLUMN_USAGE]); addColumn(t, "TRIGGER_CATALOG", SQL_IDENTIFIER); addColumn(t, "TRIGGER_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TRIGGER_NAME", SQL_IDENTIFIER); // not null addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[TRIGGER_COLUMN_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5, 6 }, false); return t; } // column number mappings final int trigger_catalog = 0; final int trigger_schema = 1; final int trigger_name = 2; final int table_catalog = 3; final int table_schema = 4; final int table_name = 5; final int column_name = 6; // Iterator it; Object[] row; it = database.schemaManager.databaseObjectIterator( SchemaObject.TRIGGER); while (it.hasNext()) { TriggerDef trigger = (TriggerDef) it.next(); if (!session.getGrantee().isFullyAccessibleByRole( trigger.getName())) { continue; } OrderedHashSet set = trigger.getReferences(); for (int i = 0; i < set.size(); i++) { HsqlName refName = (HsqlName) set.get(i); if (refName.type != SchemaObject.COLUMN) { continue; } if (!session.getGrantee().isAccessible(refName)) { continue; } row = t.getEmptyRowData(); // row[trigger_catalog] = database.getCatalogName().name; row[trigger_schema] = trigger.getSchemaName().name; row[trigger_name] = trigger.getName().name; row[table_catalog] = database.getCatalogName().name; row[table_schema] = refName.parent.schema.name; row[table_name] = refName.parent.name; row[column_name] = refName.name; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } // Initialization return t; } /** * SQL:2008 VIEW

              * * The TRIGGER_ROUTINE_USAGE view has one row for each routine * referenced in the body of a trigger.

              * * Definition:

              * * TRIGGER_CATALOG VARCHAR , * TRIGGER_SCHEMA VARCHAR , * TRIGGER_NAME VARCHAR , * SPECIFIC_CATALOG VARCHAR , * SPECIFIC_SCHEMA VARCHAR , * SPECIFIC_NAME VARCHAR , * * * * Description:

              * *

                *
              1. The values of TRIGGER_CATALOG, TRIGGER_SCHEMA and TRIGGER_NAME * are the catalog name, schema name and * identifier, respectively, of the TRIGGER.

                *

              2. The values of SPECIFIC_CATALOG, SPECIFIC_SCHEMA and * SPECIFIC_NAME are the catalog name, schema name, * specific routine identifier, respectively, of the routine * that is referenced.

                * * <1i> Referenced routines are reported only if the user or one of its roles is * the authorization (owner) of the TRIGGER. * *

              * * @return Table */ Table TRIGGER_ROUTINE_USAGE(Session session, PersistentStore store) { Table t = sysTables[TRIGGER_ROUTINE_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[TRIGGER_ROUTINE_USAGE]); addColumn(t, "TRIGGER_CATALOG", SQL_IDENTIFIER); addColumn(t, "TRIGGER_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TRIGGER_NAME", SQL_IDENTIFIER); // not null addColumn(t, "SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[TRIGGER_ROUTINE_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5 }, false); return t; } // column number mappings final int trigger_catalog = 0; final int trigger_schema = 1; final int trigger_name = 2; final int specific_catalog = 3; final int specific_schema = 4; final int specific_name = 5; // Iterator it; Object[] row; it = database.schemaManager.databaseObjectIterator( SchemaObject.TRIGGER); while (it.hasNext()) { TriggerDef trigger = (TriggerDef) it.next(); if (!session.getGrantee().isFullyAccessibleByRole( trigger.getName())) { continue; } OrderedHashSet set = trigger.getReferences(); for (int i = 0; i < set.size(); i++) { HsqlName refName = (HsqlName) set.get(i); if (refName.type != SchemaObject.SPECIFIC_ROUTINE) { continue; } row = t.getEmptyRowData(); row[trigger_catalog] = database.getCatalogName().name; row[trigger_schema] = trigger.getSchemaName().name; row[trigger_name] = trigger.getName().name; row[specific_catalog] = database.getCatalogName().name; row[specific_schema] = refName.schema.name; row[specific_name] = refName.name; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } return t; } /** * SQL:2008 VIEW

              * * The TRIGGER_SEQUENCE_USAGE view has one row for each SEQUENCE * referenced in the body of a trigger.

              * * Definition:

              * * TRIGGER_CATALOG VARCHAR , * TRIGGER_SCHEMA VARCHAR , * TRIGGER_NAME VARCHAR , * SEQUENCE_CATALOG VARCHAR , * SEQUENCE_SCHEMA VARCHAR , * SEQUENCE_NAME VARCHAR , * * * * Description:

              * *

                *
              1. The values of TRIGGER_CATALOG, TRIGGER_SCHEMA and TRIGGER_NAME * are the catalog name, schema name and * identifier, respectively, of the TRIGGER.

                *

              2. The values of SEQUENCE_CATALOG, SEQUENCE_SCHEMA and * SEQUENCE_NAME are the catalog name, schema name and * identifier, respectively, of the SEQUENCE * that is referenced.

                * * <1i> Referenced sequences are reported only if the user or one of its roles is * the authorization (owner) of the TRIGGER. * *

              * * @return Table */ Table TRIGGER_SEQUENCE_USAGE(Session session, PersistentStore store) { Table t = sysTables[TRIGGER_SEQUENCE_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[TRIGGER_SEQUENCE_USAGE]); addColumn(t, "TRIGGER_CATALOG", SQL_IDENTIFIER); addColumn(t, "TRIGGER_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TRIGGER_NAME", SQL_IDENTIFIER); // not null addColumn(t, "SEQUENCE_CATALOG", SQL_IDENTIFIER); addColumn(t, "SEQUENCE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SEQUENCE_NAME", SQL_IDENTIFIER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[TRIGGER_SEQUENCE_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5 }, false); return t; } // column number mappings final int trigger_catalog = 0; final int trigger_schema = 1; final int trigger_name = 2; final int sequence_catalog = 3; final int sequence_schema = 4; final int sequence_name = 5; // Iterator it; Object[] row; it = database.schemaManager.databaseObjectIterator( SchemaObject.TRIGGER); while (it.hasNext()) { TriggerDef trigger = (TriggerDef) it.next(); if (!session.getGrantee().isFullyAccessibleByRole( trigger.getName())) { continue; } OrderedHashSet set = trigger.getReferences(); for (int i = 0; i < set.size(); i++) { HsqlName refName = (HsqlName) set.get(i); if (refName.type != SchemaObject.SEQUENCE) { continue; } row = t.getEmptyRowData(); row[trigger_catalog] = database.getCatalogName().name; row[trigger_schema] = trigger.getSchemaName().name; row[trigger_name] = trigger.getName().name; row[sequence_catalog] = database.getCatalogName().name; row[sequence_schema] = refName.schema.name; row[sequence_name] = refName.name; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } // Initialization return t; } /** * SQL:2008 VIEW

              * * The TRIGGER_TABLE_USAGE view has one row for each TABLE * referenced in the body of a trigger.

              * * Definition:

              * * TRIGGER_CATALOG VARCHAR , * TRIGGER_SCHEMA VARCHAR , * TRIGGER_NAME VARCHAR , * TABLE_CATALOG VARCHAR , * TABLE_SCHEMA VARCHAR , * TABLE_NAME VARCHAR , * * * * Description:

              * *

                *
              1. The values of TRIGGER_CATALOG, TRIGGER_SCHEMA and TRIGGER_NAME * are the catalog name, schema name and * identifier, respectively, of the TRIGGER.

                *

              2. The values of TABLE_CATALOG, TABLE_SCHEMA and * TABLE_NAME are the catalog name, schema name and * identifier, respectively, of the TABLE * that is referenced.

                * * <1i> Referenced tables are reported only if the user or one of its roles is * the authorization (owner) of the TRIGGER. * *

              * * @return Table */ Table TRIGGER_TABLE_USAGE(Session session, PersistentStore store) { Table t = sysTables[TRIGGER_TABLE_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[TRIGGER_TABLE_USAGE]); addColumn(t, "TRIGGER_CATALOG", SQL_IDENTIFIER); addColumn(t, "TRIGGER_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TRIGGER_NAME", SQL_IDENTIFIER); // not null addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[TRIGGER_TABLE_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5 }, false); return t; } // column number mappings final int trigger_catalog = 0; final int trigger_schema = 1; final int trigger_name = 2; final int table_catalog = 3; final int table_schema = 4; final int table_name = 5; // Iterator it; Object[] row; it = database.schemaManager.databaseObjectIterator( SchemaObject.TRIGGER); while (it.hasNext()) { TriggerDef trigger = (TriggerDef) it.next(); if (!session.getGrantee().isFullyAccessibleByRole( trigger.getName())) { continue; } OrderedHashSet set = trigger.getReferences(); for (int i = 0; i < set.size(); i++) { HsqlName refName = (HsqlName) set.get(i); if (refName.type != SchemaObject.TABLE && refName.type != SchemaObject.VIEW) { continue; } row = t.getEmptyRowData(); row[trigger_catalog] = database.getCatalogName().name; row[trigger_schema] = trigger.getSchemaName().name; row[trigger_name] = trigger.getName().name; row[table_catalog] = database.getCatalogName().name; row[table_schema] = refName.schema.name; row[table_name] = refName.name; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } // Initialization return t; } /** * SQL:2008 VIEW

              * * The TRIGGERS view has one row for each TRIGGER.

              * * Definition:

              * * TRIGGER_CATALOG VARCHAR , * TRIGGER_SCHEMA VARCHAR , * TRIGGER_NAME VARCHAR , * EVENT_MANIPULATION VARCHAR , * EVENT_OBJECT_CATALOG VARCHAR , * EVENT_OBJECT_SCHEMA VARCHAR , * EVENT_OBJECT_TABLE VARCHAR , * ACTION_ORDER VARCHAR , * ACTION_CONDITION VARCHAR , * ACTION_STATEMENT VARCHAR , * ACTION_ORIENTATION VARCHAR , * ACTION_TIMING_ VARCHAR , * ACTION_REFERENCE_OLD_TABLE VARCHAR , * ACTION_REFERENCE_NEW_TABLE VARCHAR , * ACTION_REFERENCE_OLD_ROW VARCHAR , * ACTION_REFERENCE_NEW_ROW VARCHAR , * CREATED VARCHAR , * * * * Description:

              * *

                *
              1. The values of TRIGGER_CATALOG, TRIGGER_SCHEMA and TRIGGER_NAME * are the catalog name, schema name and * identifier, respectively, of the TRIGGER.

                *

              2. The value of EVENT_MANUPULATION indicates for which action the * trigger is fired: 'INSERT', 'UPDATE' or 'DELETE'. *
              3. The values of EVENT_OBJECT_CATALOG, EVENT_OBJECT_SCHEMA and * EVENT_OBJECT_NAME are the catalog name, schema name and * identifier, respectively, of the trigger TABLE.

                *

              4. The value of ACTION_ORDER indicates the ordinal position of the * trigger is firing event, among all the triggers of the same * ACTION_ORIENTATION and ACTION_TIMING. *
              5. The value of ACTION_CONDITION is the text of the SQL expression in * t he optional WHEN condition. *
              6. The value of ACTION_STATEMENT is the text of the SQL statement(s) * executed by the trigger. *
              7. The value of ACTION_ORIENTATION indicates whether the trigger is * fired once per each 'STATEMENT' or per each 'ROW'. *
              8. The value of ACTION_TIMING indicates when the trigger is * trigger is fired: 'BEFORE', 'AFTER' or 'INSTEAD OF'. *
              9. The value of ACTION_REFERENCING_OLD_TABLE contains the name of the * OLD TABLE transition table. *
              10. The value of ACTION_REFERENCING_NEW_TABLE contains the name of the * NEW TABLE transition table. *
              11. The value of ACTION_REFERENCING_OLD_ROW contains the name of the * OLD ROW. *
              12. The value of ACTION_REFERENCING_NEW_ROW contains the name of the * NEW ROW. *
              13. The value of CREATED contains the timestamp of the creation of the * trigger. Currently NULL. * <1i> Triggers are reported only if the user or one of its roles has * some privilege on at least one column of the trigger table. *
              14. The ACTION_CONDITION and ACTION_STATEMENT columns show the SQL only * if the user or one of its roles is the authorization (owner) of the * trigger table. *
              * * @return Table */ Table TRIGGERS(Session session, PersistentStore store) { Table t = sysTables[TRIGGERS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[TRIGGERS]); addColumn(t, "TRIGGER_CATALOG", SQL_IDENTIFIER); addColumn(t, "TRIGGER_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TRIGGER_NAME", SQL_IDENTIFIER); addColumn(t, "EVENT_MANIPULATION", SQL_IDENTIFIER); addColumn(t, "EVENT_OBJECT_CATALOG", SQL_IDENTIFIER); addColumn(t, "EVENT_OBJECT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "EVENT_OBJECT_TABLE", SQL_IDENTIFIER); addColumn(t, "ACTION_ORDER", CARDINAL_NUMBER); addColumn(t, "ACTION_CONDITION", CHARACTER_DATA); addColumn(t, "ACTION_STATEMENT", CHARACTER_DATA); addColumn(t, "ACTION_ORIENTATION", CHARACTER_DATA); addColumn(t, "ACTION_TIMING", CHARACTER_DATA); addColumn(t, "ACTION_REFERENCE_OLD_TABLE", SQL_IDENTIFIER); addColumn(t, "ACTION_REFERENCE_NEW_TABLE", SQL_IDENTIFIER); addColumn(t, "ACTION_REFERENCE_OLD_ROW", SQL_IDENTIFIER); addColumn(t, "ACTION_REFERENCE_NEW_ROW", SQL_IDENTIFIER); addColumn(t, "CREATED", TIME_STAMP); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[TRIGGERS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2 }, false); return t; } // column number mappings final int trigger_catalog = 0; final int trigger_schema = 1; final int trigger_name = 2; final int event_manipulation = 3; final int event_object_catalog = 4; final int event_object_schema = 5; final int event_object_table = 6; final int action_order = 7; final int action_condition = 8; final int action_statement = 9; final int action_orientation = 10; final int action_timing = 11; final int action_reference_old_table = 12; final int action_reference_new_table = 13; final int action_reference_old_row = 14; final int action_reference_new_row = 15; final int created = 16; // Iterator it; Object[] row; it = database.schemaManager.databaseObjectIterator( SchemaObject.TRIGGER); while (it.hasNext()) { TriggerDef trigger = (TriggerDef) it.next(); boolean isFullAccess = session.getGrantee().isFullyAccessibleByRole( trigger.getName()); if (!session.getGrantee().hasNonSelectTableRight( trigger.getTable())) { continue; } row = t.getEmptyRowData(); row[trigger_catalog] = database.getCatalogName().name; row[trigger_schema] = trigger.getSchemaName().name; row[trigger_name] = trigger.getName().name; row[event_manipulation] = trigger.getEventTypeString(); row[event_object_catalog] = database.getCatalogName().name; row[event_object_schema] = trigger.getTable().getSchemaName().name; row[event_object_table] = trigger.getTable().getName().name; int order = trigger.getTable().getTriggerIndex(trigger.getName().name); row[action_order] = ValuePool.getLong(order); row[action_condition] = isFullAccess ? trigger.getConditionSQL() : null; row[action_statement] = isFullAccess ? trigger.getProcedureSQL() : null; row[action_orientation] = trigger.getActionOrientationString(); row[action_timing] = trigger.getActionTimingString(); row[action_reference_old_table] = trigger.getOldTransitionTableName(); row[action_reference_new_table] = trigger.getNewTransitionTableName(); row[action_reference_old_row] = trigger.getOldTransitionRowName(); row[action_reference_new_row] = trigger.getNewTransitionRowName(); row[created] = null; t.insertSys(session, store, row); } // Initialization return t; } /** * SQL:2008 VIEW

              * * The TRIGGERED_UPDATE_COLUMNS view has one row for each column * referenced in the optional column list of a UPDATE trigger.

              * * Definition:

              * * TRIGGER_CATALOG VARCHAR , * TRIGGER_SCHEMA VARCHAR , * TRIGGER_NAME VARCHAR , * EVENT_OBJECT_CATALOG VARCHAR , * EVENT_OBJECT_SCHEMA VARCHAR , * EVENT_OBJECT_NAME VARCHAR , * * * * Description:

              * *

                *
              1. The values of TRIGGER_CATALOG, TRIGGER_SCHEMA and TRIGGER_NAME * are the catalog name, schema name and * identifier, respectively, of the TRIGGER.

                *

              2. The values of EVENT_OBJECT_CATALOG, EVENT_OBJECT_SCHEMA and * EVENT_OBJECT_NAME are the catalog name, schema name and * identifier, respectively, of the COLUMN * that is referenced.

                *

              * * @return Table */ Table TRIGGERED_UPDATE_COLUMNS(Session session, PersistentStore store) { Table t = sysTables[TRIGGERED_UPDATE_COLUMNS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[TRIGGERED_UPDATE_COLUMNS]); addColumn(t, "TRIGGER_CATALOG", SQL_IDENTIFIER); addColumn(t, "TRIGGER_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TRIGGER_NAME", SQL_IDENTIFIER); // not null addColumn(t, "EVENT_OBJECT_CATALOG", SQL_IDENTIFIER); // not null addColumn(t, "EVENT_OBJECT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "EVENT_OBJECT_TABLE", SQL_IDENTIFIER); addColumn(t, "EVENT_OBJECT_COLUMN", SQL_IDENTIFIER); // not null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[TRIGGERED_UPDATE_COLUMNS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5, 6 }, false); return t; } // column number mappings final int trigger_catalog = 0; final int trigger_schema = 1; final int trigger_name = 2; final int event_object_catalog = 3; final int event_object_schema = 4; final int event_object_table = 5; final int event_object_column = 6; // Iterator it; Object[] row; it = database.schemaManager.databaseObjectIterator( SchemaObject.TRIGGER); while (it.hasNext()) { TriggerDef trigger = (TriggerDef) it.next(); if (!session.getGrantee().isAccessible(trigger)) { continue; } int[] colIndexes = trigger.getUpdateColumnIndexes(); if (colIndexes == null) { continue; } for (int i = 0; i < colIndexes.length; i++) { ColumnSchema column = trigger.getTable().getColumn(colIndexes[i]); row = t.getEmptyRowData(); row[trigger_catalog] = database.getCatalogName().name; row[trigger_schema] = trigger.getSchemaName().name; row[trigger_name] = trigger.getName().name; row[event_object_catalog] = database.getCatalogName().name; row[event_object_schema] = trigger.getTable().getSchemaName().name; row[event_object_table] = trigger.getTable().getName().name; row[event_object_column] = column.getNameString(); t.insertSys(session, store, row); } } // Initialization return t; } /** * SQL:2008 VIEW

              * * The UDT_PRIVILEGES view has one row for each privilege granted on * a DISTINCT TYPE. * *

                   *      GRANTOR               VARCHAR
                   *      GRANTEE               VARCHAR
                   *      UDT_CATALOG           VARCHAR
                   *      UDT_SCHEMA            VARCHAR
                   *      UDT_NAME              VARCHAR
                   *      PRIVILEGE_TYPE        VARCHAR
                   *      IS_GRANTABLE          VARCHAR
                   * 
              * * Description:

              * *

                *
              1. The values of GRANTOR is the grantor of the privilege. The value of * GRANTEE is the name of the grantee. * *
              2. The values of UDT_CATALOG, UDT_SCHEMA and * UDT_NAME are the catalog name, schema name * and identifier, respectively, of the user defined type * described.

                * *

              3. The value of PRIVILEGE_TYPE is the type of the privilege, including, * 'USAGE' * The value IS_GRANTABLE is 'YES' if the privilege is grantable.

                *

              * * @return Table */ Table UDT_PRIVILEGES(Session session, PersistentStore store) { Table t = sysTables[UDT_PRIVILEGES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[UDT_PRIVILEGES]); addColumn(t, "GRANTOR", SQL_IDENTIFIER); addColumn(t, "GRANTEE", SQL_IDENTIFIER); addColumn(t, "UDT_CATALOG", SQL_IDENTIFIER); addColumn(t, "UDT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "UDT_NAME", SQL_IDENTIFIER); addColumn(t, "PRIVILEGE_TYPE", CHARACTER_DATA); addColumn(t, "IS_GRANTABLE", YES_OR_NO); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[UDT_PRIVILEGES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4 }, false); return t; } final int grantor = 0; final int grantee = 1; final int udt_catalog = 2; final int udt_schema = 3; final int udt_name = 4; final int privilege_type = 5; final int is_grantable = 6; // Iterator objects = database.schemaManager.databaseObjectIterator(SchemaObject.TYPE); OrderedHashSet grantees = session.getGrantee().getGranteeAndAllRolesWithPublic(); while (objects.hasNext()) { SchemaObject object = (SchemaObject) objects.next(); if (object.getType() != SchemaObject.TYPE) { continue; } for (int i = 0; i < grantees.size(); i++) { Grantee granteeObject = (Grantee) grantees.get(i); OrderedHashSet rights = granteeObject.getAllDirectPrivileges(object); OrderedHashSet grants = granteeObject.getAllGrantedPrivileges(object); if (!grants.isEmpty()) { grants.addAll(rights); rights = grants; } for (int j = 0; j < rights.size(); j++) { Right right = (Right) rights.get(j); Right grantableRight = right.getGrantableRights(); Object[] row; row = t.getEmptyRowData(); row[grantor] = right.getGrantor().getName().name; row[grantee] = right.getGrantee().getName().name; row[udt_catalog] = database.getCatalogName().name; row[udt_schema] = object.getSchemaName().name; row[udt_name] = object.getName().name; row[privilege_type] = Tokens.T_USAGE; row[is_grantable] = right.getGrantee() == object.getOwner() || grantableRight.isFull() ? Tokens.T_YES : Tokens.T_NO;; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } } return t; } /** * SQL:2008 VIEW

              * * The USAGE_PRIVILEGES view has one row for each usage privilege * descriptor.

              * * It effectively contains a representation of the usage privilege * descriptors.

              * * Definition:

              * *

                   * CREATE TABLE SYSTEM_USAGE_PRIVILEGES (
                   *      GRANTOR         VARCHAR NOT NULL,
                   *      GRANTEE         VARCHAR NOT NULL,
                   *      OBJECT_CATALOG  VARCHAR NULL,
                   *      OBJECT_SCHEMA   VARCHAR NULL,
                   *      OBJECT_NAME     VARCHAR NOT NULL,
                   *      OBJECT_TYPE     VARCHAR NOT NULL
                   *      PRIVILEGE_TYPE  VARCHAR NOT NULL
                   *      IS_GRANTABLE    VARCHAR NOT NULL
                   * )
                   * 
              * * Description:

              * *

                *
              1. The value of GRANTOR is the <authorization identifier> of the * user or role who granted usage privileges on the object of the type * identified by OBJECT_TYPE that is identified by OBJECT_CATALOG, * OBJECT_SCHEMA, and OBJECT_NAME, to the user or role identified by the * value of GRANTEE forthe usage privilege being described.

                * *

              2. The value of GRANTEE is the <authorization identifier> of some * user or role, or PUBLIC to indicate all users, to whom the usage * privilege being described is granted.

                * *

              3. The values of OBJECT_CATALOG, OBJECT_SCHEMA, and OBJECT_NAME are the * catalog name, schema name, and identifier, * respectively, of the object to which the privilege applies.

                * *

              4. The values of OBJECT_TYPE have the following meanings:

                * * * * * * * * * * * * * * * * * * * * * * *
                DOMAINThe object to which the privilege applies is * a domain.
                CHARACTER SETThe object to which the privilege applies is a * character set.
                COLLATIONThe object to which the privilege applies is a * collation.
                TRANSLATIONThe object to which the privilege applies is a * transliteration.
                SEQUENCEThe object to which the privilege applies is a * sequence generator.

                * *

              5. The values of IS_GRANTABLE have the following meanings:

                * * * * * * * * * * *
                YESThe privilege being described was granted * WITH GRANT OPTION and is thus grantable.
                NOThe privilege being described was not granted * WITH GRANT OPTION and is thus not grantable.

                *

                  * * @return Table */ Table USAGE_PRIVILEGES(Session session, PersistentStore store) { Table t = sysTables[USAGE_PRIVILEGES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[USAGE_PRIVILEGES]); addColumn(t, "GRANTOR", SQL_IDENTIFIER); // not null addColumn(t, "GRANTEE", SQL_IDENTIFIER); // not null addColumn(t, "OBJECT_CATALOG", SQL_IDENTIFIER); addColumn(t, "OBJECT_SCHEMA", SQL_IDENTIFIER); addColumn(t, "OBJECT_NAME", SQL_IDENTIFIER); // not null addColumn(t, "OBJECT_TYPE", CHARACTER_DATA); // not null addColumn(t, "PRIVILEGE_TYPE", CHARACTER_DATA); addColumn(t, "IS_GRANTABLE", YES_OR_NO); // not null // order: COLUMN_NAME, PRIVILEGE // for unique: GRANTEE, GRANTOR, TABLE_NAME, TABLE_SCHEM, TABLE_CAT // false PK, as TABLE_SCHEM and/or TABLE_CAT may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[USAGE_PRIVILEGES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5, 6, 7 }, false); return t; } // Object[] row; // final int grantor = 0; final int grantee = 1; final int object_catalog = 2; final int object_schema = 3; final int object_name = 4; final int object_type = 5; final int privilege_type = 6; final int is_grantable = 7; // Iterator objects = new WrapperIterator(database.schemaManager .databaseObjectIterator(SchemaObject.SEQUENCE), database .schemaManager.databaseObjectIterator(SchemaObject.COLLATION)); objects = new WrapperIterator( objects, database.schemaManager.databaseObjectIterator( SchemaObject.CHARSET)); objects = new WrapperIterator( objects, database.schemaManager.databaseObjectIterator( SchemaObject.DOMAIN)); // TYPE objects are covered in separate UDT_PRIVILEGES view OrderedHashSet grantees = session.getGrantee().getGranteeAndAllRolesWithPublic(); while (objects.hasNext()) { SchemaObject object = (SchemaObject) objects.next(); for (int i = 0; i < grantees.size(); i++) { Grantee granteeObject = (Grantee) grantees.get(i); OrderedHashSet rights = granteeObject.getAllDirectPrivileges(object); OrderedHashSet grants = granteeObject.getAllGrantedPrivileges(object); if (!grants.isEmpty()) { grants.addAll(rights); rights = grants; } for (int j = 0; j < rights.size(); j++) { Right right = (Right) rights.get(j); Right grantableRight = right.getGrantableRights(); row = t.getEmptyRowData(); row[grantor] = right.getGrantor().getName().name; row[grantee] = right.getGrantee().getName().name; row[object_catalog] = database.getCatalogName().name; row[object_schema] = object.getSchemaName().name; row[object_name] = object.getName().name; row[object_type] = SchemaObjectSet.getName(object.getName().type); row[privilege_type] = Tokens.T_USAGE; row[is_grantable] = right.getGrantee() == object.getOwner() || grantableRight.isFull() ? Tokens.T_YES : Tokens.T_NO;; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } } return t; } /** * SQL:2008 VIEW

                  * * The USER_DEFINED_TYPES view has one row for each user defined type. * Only DICTINCT TYPE user defined types are currently supported.

                  * * Definition:

                  * *

                       *      VIEW_CATALOG    VARCHAR NULL,
                       *      VIEW_SCHEMA     VARCHAR NULL,
                       *      VIEW_NAME       VARCHAR NOT NULL,
                       *      TABLE_CATALOG   VARCHAR NULL,
                       *      TABLE_SCHEMA    VARCHAR NULL,
                       *      TABLE_NAME      VARCHAR NOT NULL,
                       *      COLUMN_NAME     VARCHAR NOT NULL,
                       * 
                  * * Description:

                  * *

                    *
                  1. The values of VIEW_CATALOG, VIEW_SCHEMA, and VIEW_NAME are the * catalog name, schema name, and identifier, * respectively, of the view being described.

                    * *

                  2. The values of TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, and * COLUMN_NAME are the catalog name, schema name, * table name, and column name, respectively, of a column * of a table that is explicitly or implicitly referenced in the * <query expression> of the view being described. * <1i> Referenced routines are reported only if the user or one of its roles is * the authorization (owner) of the referenced ROUTINE *
                  * * @return Table */ Table USER_DEFINED_TYPES(Session session, PersistentStore store) { Table t = sysTables[USER_DEFINED_TYPES]; if (t == null) { t = createBlankTable(sysTableHsqlNames[USER_DEFINED_TYPES]); addColumn(t, "USER_DEFINED_TYPE_CATALOG", SQL_IDENTIFIER); addColumn(t, "USER_DEFINED_TYPE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "USER_DEFINED_TYPE_NAME", SQL_IDENTIFIER); addColumn(t, "USER_DEFINED_TYPE_CATEGORY", SQL_IDENTIFIER); addColumn(t, "IS_INSTANTIABLE", YES_OR_NO); addColumn(t, "IS_FINAL", YES_OR_NO); addColumn(t, "ORDERING_FORM", SQL_IDENTIFIER); addColumn(t, "ORDERING_CATEGORY", SQL_IDENTIFIER); addColumn(t, "ORDERING_ROUTINE_CATALOG", SQL_IDENTIFIER); addColumn(t, "ORDERING_ROUTINE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "ORDERING_ROUTINE_NAME", SQL_IDENTIFIER); addColumn(t, "REFERENCE_TYPE", SQL_IDENTIFIER); addColumn(t, "DATA_TYPE", CHARACTER_DATA); addColumn(t, "CHARACTER_MAXIMUM_LENGTH", CARDINAL_NUMBER); addColumn(t, "CHARACTER_OCTET_LENGTH", CARDINAL_NUMBER); addColumn(t, "CHARACTER_SET_CATALOG", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_SCHEMA", SQL_IDENTIFIER); addColumn(t, "CHARACTER_SET_NAME", SQL_IDENTIFIER); addColumn(t, "COLLATION_CATALOG", SQL_IDENTIFIER); addColumn(t, "COLLATION_SCHEMA", SQL_IDENTIFIER); addColumn(t, "COLLATION_NAME", SQL_IDENTIFIER); addColumn(t, "NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "NUMERIC_PRECISION_RADIX", CARDINAL_NUMBER); addColumn(t, "NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "DATETIME_PRECISION", CARDINAL_NUMBER); addColumn(t, "INTERVAL_TYPE", CHARACTER_DATA); addColumn(t, "INTERVAL_PRECISION", CARDINAL_NUMBER); addColumn(t, "SOURCE_DTD_IDENTIFIER", CHARACTER_DATA); addColumn(t, "REF_DTD_IDENTIFIER", CHARACTER_DATA); addColumn(t, "DECLARED_DATA_TYPE", CHARACTER_DATA); addColumn(t, "DECLARED_NUMERIC_PRECISION", CARDINAL_NUMBER); addColumn(t, "DECLARED_NUMERIC_SCALE", CARDINAL_NUMBER); addColumn(t, "MAXIMUM_CARDINALITY", CARDINAL_NUMBER); addColumn(t, "EXTERNAL_NAME", CHARACTER_DATA); addColumn(t, "EXTERNAL_LANGUAGE", CHARACTER_DATA); addColumn(t, "JAVA_INTERFACE", CHARACTER_DATA); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[USER_DEFINED_TYPES].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 4, 5, 6 }, false); return t; } final int user_defined_type_catalog = 0; final int user_defined_type_schema = 1; final int user_defined_type_name = 2; final int user_defined_type_category = 3; final int is_instantiable = 4; final int is_final = 5; final int ordering_form = 6; final int ordering_category = 7; final int ordering_routine_catalog = 8; final int ordering_routine_schema = 9; final int ordering_routine_name = 10; final int reference_type = 11; final int data_type = 12; final int character_maximum_length = 13; final int character_octet_length = 14; final int character_set_catalog = 15; final int character_set_schema = 16; final int character_set_name = 17; final int collation_catalog = 18; final int collation_schema = 19; final int collation_name = 20; final int numeric_precision = 21; final int numeric_precision_radix = 22; final int numeric_scale = 23; final int datetime_precision = 24; final int interval_type = 25; final int interval_precision = 26; final int source_dtd_identifier = 27; final int ref_dtd_identifier = 28; final int declared_data_type = 29; final int declared_numeric_precision = 30; final int declared_numeric_scale = 31; final int maximum_cardinality = 32; // Iterator it = database.schemaManager.databaseObjectIterator(SchemaObject.TYPE); while (it.hasNext()) { Type type = (Type) it.next(); if (!type.isDistinctType()) { continue; } Object[] row = t.getEmptyRowData(); row[user_defined_type_catalog] = database.getCatalogName().name; row[user_defined_type_schema] = type.getSchemaName().name; row[user_defined_type_name] = type.getName().name; row[data_type] = type.getFullNameString(); row[user_defined_type_category] = "DISTINCT"; row[is_instantiable] = "YES"; row[is_final] = "YES"; row[ordering_form] = "FULL"; // common type block if (type.isCharacterType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision * 2); row[character_set_catalog] = database.getCatalogName().name; row[character_set_schema] = ((CharacterType) type).getCharacterSet().getSchemaName() .name; row[character_set_name] = ((CharacterType) type).getCharacterSet().getName().name; row[collation_catalog] = database.getCatalogName().name; row[collation_schema] = ((CharacterType) type).getCollation().getSchemaName().name; row[collation_name] = ((CharacterType) type).getCollation().getName().name; } else if (type.isNumberType()) { row[numeric_precision] = ValuePool.getLong( ((NumberType) type).getNumericPrecisionInRadix()); row[declared_numeric_precision] = ValuePool.getLong( ((NumberType) type).getNumericPrecisionInRadix()); if (type.isExactNumberType()) { row[numeric_scale] = row[declared_numeric_scale] = ValuePool.getLong(type.scale); } row[numeric_precision_radix] = ValuePool.getLong(type.getPrecisionRadix()); } else if (type.isBooleanType()) {} else if (type.isDateTimeType()) { row[datetime_precision] = ValuePool.getLong(type.scale); } else if (type.isIntervalType()) { row[data_type] = "INTERVAL"; row[interval_type] = ((IntervalType) type).getQualifier(type.typeCode); row[interval_precision] = ValuePool.getLong(type.precision); row[datetime_precision] = ValuePool.getLong(type.scale); } else if (type.isBinaryType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision); } else if (type.isBitType()) { row[character_maximum_length] = ValuePool.getLong(type.precision); row[character_octet_length] = ValuePool.getLong(type.precision); } else if (type.isArrayType()) { row[maximum_cardinality] = ValuePool.getLong(type.arrayLimitCardinality()); row[data_type] = "ARRAY"; } // end common block row[source_dtd_identifier] = type.getDefinition(); row[declared_data_type] = row[data_type]; t.insertSys(session, store, row); } return t; } /** * SQL:2008 VIEW

                  * * The VIEW_COLUMN_USAGE view has one row for each column of a * table that is explicitly or implicitly referenced in the * <query expression> of the view being described.

                  * * Definition:

                  * *

                       *      VIEW_CATALOG    VARCHAR NULL,
                       *      VIEW_SCHEMA     VARCHAR NULL,
                       *      VIEW_NAME       VARCHAR NOT NULL,
                       *      TABLE_CATALOG   VARCHAR NULL,
                       *      TABLE_SCHEMA    VARCHAR NULL,
                       *      TABLE_NAME      VARCHAR NOT NULL,
                       *      COLUMN_NAME     VARCHAR NOT NULL,
                       * 
                  * * Description:

                  * *

                    *
                  1. The values of VIEW_CATALOG, VIEW_SCHEMA, and VIEW_NAME are the * catalog name, schema name, and identifier, * respectively, of the view being described.

                    * *

                  2. The values of TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, and * COLUMN_NAME are the catalog name, schema name, * table name, and column name, respectively, of a column * of a table that is explicitly or implicitly referenced in the * <query expression> of the view being described. * <1i> Referenced routines are reported only if the user or one of its roles is * the authorization (owner) of the referenced ROUTINE *
                  * * @return Table */ Table VIEW_COLUMN_USAGE(Session session, PersistentStore store) { Table t = sysTables[VIEW_COLUMN_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[VIEW_COLUMN_USAGE]); addColumn(t, "VIEW_CATALOG", SQL_IDENTIFIER); addColumn(t, "VIEW_SCHEMA", SQL_IDENTIFIER); addColumn(t, "VIEW_NAME", SQL_IDENTIFIER); addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[VIEW_COLUMN_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5, 6 }, false); return t; } // Calculated column values String viewCatalog; String viewSchema; String viewName; // Intermediate holders Iterator tables; View view; Table table; Object[] row; Iterator iterator; // Column number mappings final int view_catalog = 0; final int view_schema = 1; final int view_name = 2; final int table_catalog = 3; final int table_schema = 4; final int table_name = 5; final int column_name = 6; // Initialization tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); // Do it. while (tables.hasNext()) { table = (Table) tables.next(); if (table.isView() && session.getGrantee().isFullyAccessibleByRole( table.getName())) { // fall through } else { continue; } viewCatalog = database.getCatalogName().name; viewSchema = table.getSchemaName().name; viewName = table.getName().name; view = (View) table; OrderedHashSet references = view.getReferences(); iterator = references.iterator(); while (iterator.hasNext()) { HsqlName refName = (HsqlName) iterator.next(); if (refName.type != SchemaObject.COLUMN) { continue; } row = t.getEmptyRowData(); row[view_catalog] = viewCatalog; row[view_schema] = viewSchema; row[view_name] = viewName; row[table_catalog] = viewCatalog; row[table_schema] = refName.parent.schema.name; row[table_name] = refName.parent.name; row[column_name] = refName.name; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } return t; } /** * SQL:2008 VIEW

                  * * The VIEW_ROUTINE_USAGE view has one row for each SQL-invoked * routine identified as the subject routine of either a <routine * invocation>, a <method reference>, a <method invocation>, * or a <static method invocation> contained in a <view * definition>.

                  * * Definition

                  * *

                       *      TABLE_CATALOG       VARCHAR NULL,
                       *      TABLE_SCHEMA        VARCHAR NULL,
                       *      TABLE_NAME          VARCHAR NOT NULL,
                       *      SPECIFIC_CATALOG    VARCHAR NULL,
                       *      SPECIFIC_SCHEMA     VARCHAR NULL,
                       *      SPECIFIC_NAME       VARCHAR NOT NULL,
                       * 
                  * * Description

                  * *

                    *
                  1. The values of TABLE_CATALOG, TABLE_SCHEMA, and TABLE_NAME are the * catalog name, schema name, and identifier, * respectively, of the viewed table being described. * *
                  2. The values of SPECIFIC_CATALOG, SPECIFIC_SCHEMA, and SPECIFIC_NAME are * the catalog name, schema name, and identifier, * respectively, of the specific name of R. * <1i> Referenced routines are reported only if the user or one of its roles is * the authorization (owner) of the referenced ROUTINE. *
                  * * @return Table */ Table VIEW_ROUTINE_USAGE(Session session, PersistentStore store) { Table t = sysTables[VIEW_ROUTINE_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[VIEW_ROUTINE_USAGE]); addColumn(t, "VIEW_CATALOG", SQL_IDENTIFIER); addColumn(t, "VIEW_SCHEMA", SQL_IDENTIFIER); addColumn(t, "VIEW_NAME", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_CATALOG", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_SCHEMA", SQL_IDENTIFIER); addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER); HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[VIEW_ROUTINE_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5 }, false); return t; } // Intermediate holders Iterator tables; Table table; Object[] row; // Column number mappings final int view_catalog = 0; final int view_schema = 1; final int view_name = 2; final int specific_catalog = 3; final int specific_schema = 4; final int specific_name = 5; // Initialization tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); // Do it. while (tables.hasNext()) { table = (Table) tables.next(); if (!table.isView()) { continue; } OrderedHashSet set = table.getReferences(); for (int i = 0; i < set.size(); i++) { HsqlName refName = (HsqlName) set.get(i); if (refName.type != SchemaObject.SPECIFIC_ROUTINE) { continue; } if (!session.getGrantee().isFullyAccessibleByRole(refName)) { continue; } row = t.getEmptyRowData(); row[view_catalog] = database.getCatalogName().name; row[view_schema] = table.getSchemaName().name; row[view_name] = table.getName().name; row[specific_catalog] = database.getCatalogName().name; row[specific_schema] = refName.schema.name; row[specific_name] = refName.name; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } return t; } /** * SQL:2008 VIEW

                  * * The VIEW_TABLE_USAGE view has one row for each table identified * by a <table name> simply contained in a <table reference> * that is contained in the <query expression> of a view.

                  * * Definition

                  * *

                       *      VIEW_CATALOG    VARCHAR NULL,
                       *      VIEW_SCHEMA     VARCHAR NULL,
                       *      VIEW_NAME       VARCHAR NULL,
                       *      TABLE_CATALOG   VARCHAR NULL,
                       *      TABLE_SCHEMA    VARCHAR NULL,
                       *      TABLE_NAME      VARCHAR NULL,
                       * 
                  * * Description:

                  * *

                    *
                  1. The values of VIEW_CATALOG, VIEW_SCHEMA, and VIEW_NAME are the * catalog name, schema name, and identifier, * respectively, of the view being described.

                    * *

                  2. The values of TABLE_CATALOG, TABLE_SCHEMA, and TABLE_NAME are the * catalog name, schema name, and identifier, * respectively, of a table identified by a <table name> * simply contained in a <table reference> that is contained in * the <query expression> of the view being described. * <1i> Referenced tables are reported only if the user or one of its roles is * the authorization (owner) of the referenced TABLE *
                  * * @return Table */ Table VIEW_TABLE_USAGE(Session session, PersistentStore store) { Table t = sysTables[VIEW_TABLE_USAGE]; if (t == null) { t = createBlankTable(sysTableHsqlNames[VIEW_TABLE_USAGE]); addColumn(t, "VIEW_CATALOG", SQL_IDENTIFIER); addColumn(t, "VIEW_SCHEMA", SQL_IDENTIFIER); addColumn(t, "VIEW_NAME", SQL_IDENTIFIER); // not null addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null // false PK, as VIEW_CATALOG, VIEW_SCHEMA, TABLE_CATALOG, and/or // TABLE_SCHEMA may be NULL HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[VIEW_TABLE_USAGE].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1, 2, 3, 4, 5 }, false); return t; } // Column number mappings final int view_catalog = 0; final int view_schema = 1; final int view_name = 2; final int table_catalog = 3; final int table_schema = 4; final int table_name = 5; // Iterator tables; Table table; Object[] row; // Initialization tables = database.schemaManager.databaseObjectIterator(SchemaObject.TABLE); // Do it. while (tables.hasNext()) { table = (Table) tables.next(); if (!table.isView()) { continue; } OrderedHashSet references = table.getReferences(); for (int i = 0; i < references.size(); i++) { HsqlName refName = (HsqlName) references.get(i); if (refName.type != SchemaObject.TABLE && refName.type != SchemaObject.VIEW) { continue; } if (!session.getGrantee().isFullyAccessibleByRole(refName)) { continue; } row = t.getEmptyRowData(); row[view_catalog] = database.getCatalogName().name; row[view_schema] = table.getSchemaName().name; row[view_name] = table.getName().name; row[table_catalog] = database.getCatalogName().name; row[table_schema] = refName.schema.name; row[table_name] = refName.name; try { t.insertSys(session, store, row); } catch (HsqlException e) {} } } return t; } /** * SQL:2008 VIEW

                  * * The VIEWS view contains one row for each VIEW definition.

                  * * Each row is a description of the query expression that defines its view, * with the following columns: * *

                       *      TABLE_CATALOG    VARCHAR     name of view's defining catalog.
                       *      TABLE_SCHEMA     VARCHAR     name of view's defining schema.
                       *      TABLE_NAME       VARCHAR     the simple name of the view.
                       *      VIEW_DEFINITION  VARCHAR     the character representation of the
                       *                                   <query expression> contained in the
                       *                                   corresponding <view descriptor>.
                       *      CHECK_OPTION     VARCHAR     {"CASCADED" | "LOCAL" | "NONE"}
                       *      IS_UPDATABLE     VARCHAR     {"YES" | "NO"}
                       *      INSERTABLE_INTO VARCHAR      {"YES" | "NO"}
                       *      IS_TRIGGER_UPDATABLE        VARCHAR  {"YES" | "NO"}
                       *      IS_TRIGGER_DELETEABLE       VARCHAR  {"YES" | "NO"}
                       *      IS_TRIGGER_INSERTABLE_INTO  VARCHAR  {"YES" | "NO"}
                       * 

                  * * @return a tabular description of the text source of all * View objects accessible to * the user. */ Table VIEWS(Session session, PersistentStore store) { Table t = sysTables[VIEWS]; if (t == null) { t = createBlankTable(sysTableHsqlNames[VIEWS]); addColumn(t, "TABLE_CATALOG", SQL_IDENTIFIER); addColumn(t, "TABLE_SCHEMA", SQL_IDENTIFIER); addColumn(t, "TABLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "VIEW_DEFINITION", CHARACTER_DATA); // not null addColumn(t, "CHECK_OPTION", CHARACTER_DATA); // not null addColumn(t, "IS_UPDATABLE", YES_OR_NO); // not null addColumn(t, "INSERTABLE_INTO", YES_OR_NO); // not null addColumn(t, "IS_TRIGGER_UPDATABLE", YES_OR_NO); // not null addColumn(t, "IS_TRIGGER_DELETABLE", YES_OR_NO); // not null addColumn(t, "IS_TRIGGER_INSERTABLE_INTO", YES_OR_NO); // not null // order TABLE_NAME // added for unique: TABLE_SCHEMA, TABLE_CATALOG // false PK, as TABLE_SCHEMA and/or TABLE_CATALOG may be null HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[VIEWS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 1, 2, 0 }, false); return t; } Iterator tables; Table table; Object[] row; final int table_catalog = 0; final int table_schema = 1; final int table_name = 2; final int view_definition = 3; final int check_option = 4; final int is_updatable = 5; final int insertable_into = 6; final int is_trigger_updatable = 7; final int is_trigger_deletable = 8; final int is_trigger_insertable_into = 9; tables = allTables(); while (tables.hasNext()) { table = (Table) tables.next(); if (!table.isView() && table.getSchemaName() != SqlInvariants.INFORMATION_SCHEMA_HSQLNAME) { continue; } if (!isAccessibleTable(session, table)) { continue; } row = t.getEmptyRowData(); row[table_catalog] = database.getCatalogName().name; row[table_schema] = table.getSchemaName().name; row[table_name] = table.getName().name; String check = Tokens.T_NONE; if (table instanceof View) { if (session.getGrantee().isFullyAccessibleByRole( table.getName())) { row[view_definition] = ((View) table).getStatement(); } switch (((View) table).getCheckOption()) { case SchemaObject.ViewCheckModes.CHECK_NONE : break; case SchemaObject.ViewCheckModes.CHECK_LOCAL : check = Tokens.T_LOCAL; break; case SchemaObject.ViewCheckModes.CHECK_CASCADE : check = Tokens.T_CASCADED; break; } } row[check_option] = check; row[is_updatable] = table.isUpdatable() ? Tokens.T_YES : Tokens.T_NO; row[insertable_into] = table.isInsertable() ? Tokens.T_YES : Tokens.T_NO; row[is_trigger_updatable] = table.isTriggerUpdatable() ? Tokens.T_YES : Tokens.T_NO;; row[is_trigger_deletable] = table.isTriggerDeletable() ? Tokens.T_YES : Tokens.T_NO;; row[is_trigger_insertable_into] = table.isTriggerInsertable() ? Tokens.T_YES : Tokens.T_NO;; t.insertSys(session, store, row); } return t; } //------------------------------------------------------------------------------ // SQL SCHEMATA BASE TABLES /** * SQL:2008 VIEW

                  * * ROLE_AUTHORIZATION_DESCRIPTORS

                  * * Contains a representation of the role authorization descriptors.

                  * Definition * *

                       *      ROLE_NAME     VARCHAR     name of view's defining catalog.
                       *      GRANTEE       VARCHAR     name of view's defining schema.
                       *      GRANTOR       VARCHAR     the simple name of the view.
                       *      IS_GRANTABLE  VARCHAR     the character representation of the
                       * 
                  * * Description

                  * *

                    *
                  1. The value of ROLE_NAME is the <role name> of some * <role granted> by the <grant role statement> or * the <role name> of a <role definition>.

                    * *

                  2. The value of GRANTEE is an <authorization identifier>, * possibly PUBLIC, or <role name> specified as a * <grantee> contained in a <grant role statement>, * or the <authorization identifier> of the current * SQLsession when the <role definition> is executed.

                    * *

                  3. The value of GRANTOR is the <authorization identifier> * of the user or role who granted the role identified by * ROLE_NAME to the user or role identified by the value of * GRANTEE.

                    * *

                  4. The values of IS_GRANTABLE have the following meanings:

                    * * * * * * * * * * *
                    YESThe described role is grantable.
                    NOThe described role is not grantable.

                    *

                  * * @return Table */ Table ROLE_AUTHORIZATION_DESCRIPTORS(Session session, PersistentStore store) { Table t = sysTables[ROLE_AUTHORIZATION_DESCRIPTORS]; if (t == null) { t = createBlankTable( sysTableHsqlNames[ROLE_AUTHORIZATION_DESCRIPTORS]); addColumn(t, "ROLE_NAME", SQL_IDENTIFIER); // not null addColumn(t, "GRANTEE", SQL_IDENTIFIER); // not null addColumn(t, "GRANTOR", SQL_IDENTIFIER); // not null addColumn(t, "IS_GRANTABLE", YES_OR_NO); // not null // true PK HsqlName name = HsqlNameManager.newInfoSchemaObjectName( sysTableHsqlNames[ROLE_AUTHORIZATION_DESCRIPTORS].name, false, SchemaObject.INDEX); t.createPrimaryKeyConstraint(name, new int[] { 0, 1 }, true); return t; } // Intermediate holders String grantorName = SqlInvariants.SYSTEM_AUTHORIZATION_NAME; Iterator grantees; Grantee granteeObject; String granteeName; Iterator roles; String isGrantable; Object[] row; // Column number mappings final int role_name = 0; final int grantee = 1; final int grantor = 2; final int is_grantable = 3; // Initialization grantees = session.getGrantee().visibleGrantees().iterator(); // while (grantees.hasNext()) { granteeObject = (Grantee) grantees.next(); granteeName = granteeObject.getName().getNameString(); roles = granteeObject.getDirectRoles().iterator(); isGrantable = granteeObject.isAdmin() ? Tokens.T_YES : Tokens.T_NO;; while (roles.hasNext()) { Grantee role = (Grantee) roles.next(); row = t.getEmptyRowData(); row[role_name] = role.getName().getNameString(); row[grantee] = granteeName; row[grantor] = grantorName; row[is_grantable] = isGrantable; t.insertSys(session, store, row); } } return t; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Row.java0000644000175000017500000001132312007547362020356 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.lib.LongLookup; import org.hsqldb.persist.CachedObject; import org.hsqldb.persist.PersistentStore; import org.hsqldb.rowio.RowOutputInterface; /** * Base class for a database row object. * * @author Fred Toussi (fredt@users dot sourceforge dot net) * @version 2.2.9 */ public class Row implements CachedObject { long position; Object[] rowData; public volatile RowAction rowAction; protected TableBase table; public RowAction getAction() { return rowAction; } /** * Default constructor used only in subclasses. */ public Row(TableBase table, Object[] data) { this.table = table; this.rowData = data; } /** * Returns the array of fields in the database row. */ public Object[] getData() { return rowData; } boolean isDeleted(Session session, PersistentStore store) { Row row = (Row) store.get(this, false); RowAction action = row.rowAction; if (action == null) { return false; } return !action.canRead(session, TransactionManager.ACTION_READ); } public void setChanged(boolean changed) {} public void setStorageSize(int size) {} public int getStorageSize() { return 0; } public boolean isMemory() { return true; } public void updateAccessCount(int count) {} public int getAccessCount() { return 0; } public long getPos() { return position; } public long getId() { return ((long) table.getId() << 40) + position; } public void setPos(long pos) { position = pos; } public boolean isNew() { return false; } public boolean hasChanged() { return false; } public boolean isKeepInMemory() { return true; } public boolean keepInMemory(boolean keep) { return true; } public boolean isInMemory() { return true; } public void setInMemory(boolean in) {} public void delete(PersistentStore store) {} public void restore() {} public void destroy() {} public int getRealSize(RowOutputInterface out) { return 0; } public TableBase getTable() { return table; } public void write(RowOutputInterface out) {} public void write(RowOutputInterface out, LongLookup lookup) {} /** * Lifetime scope of this method is limited depends on the operations * performed. Rows deleted completely can equal rows produced later. * This can return invalid results if used with deleted rows. * * @param obj row to compare * @return boolean */ public boolean equals(Object obj) { if (obj == this) { return true; } if (obj instanceof Row) { return ((Row) obj).table == table && ((Row) obj).position == position; } return false; } /** * Hash code is always valid. * * @return file position of row */ public int hashCode() { return (int) position; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementSimple.java0000644000175000017500000001423612007547362022733 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.result.Result; /** * Implementation of Statement for simple PSM control statements. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public class StatementSimple extends Statement { String sqlState; String message; HsqlName label; // ColumnSchema[] variables; int[] variableIndexes; StatementSimple(int type, HsqlName label) { super(type, StatementTypes.X_SQL_CONTROL); references = new OrderedHashSet(); isTransactionStatement = false; this.label = label; } StatementSimple(int type, String sqlState, String message) { super(type, StatementTypes.X_SQL_CONTROL); references = new OrderedHashSet(); isTransactionStatement = false; this.sqlState = sqlState; this.message = message; } public String getSQL() { StringBuffer sb = new StringBuffer(); switch (type) { case StatementTypes.SIGNAL : sb.append(Tokens.T_SIGNAL).append(' '); sb.append(Tokens.T_SQLSTATE); sb.append(' ').append('\'').append(sqlState).append('\''); break; case StatementTypes.RESIGNAL : sb.append(Tokens.T_RESIGNAL).append(' '); sb.append(Tokens.T_SQLSTATE); sb.append(' ').append('\'').append(sqlState).append('\''); break; case StatementTypes.ITERATE : sb.append(Tokens.T_ITERATE).append(' ').append(label); break; case StatementTypes.LEAVE : sb.append(Tokens.T_LEAVE).append(' ').append(label); break; } return sb.toString(); } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } sb.append(Tokens.T_STATEMENT); return sb.toString(); } public Result execute(Session session) { Result result; try { result = getResult(session); } catch (Throwable t) { result = Result.newErrorResult(t, null); } if (result.isError()) { result.getException().setStatementType(group, type); } return result; } Result getResult(Session session) { switch (type) { /** @todo - check sqlState against allowed values */ case StatementTypes.SIGNAL : case StatementTypes.RESIGNAL : HsqlException ex = Error.error(message, sqlState); return Result.newErrorResult(ex); case StatementTypes.ITERATE : case StatementTypes.LEAVE : return Result.newPSMResult(type, label.name, null); default : throw Error.runtimeError(ErrorCode.U_S0500, ""); } } public void resolve(Session session) { boolean resolved = false; switch (type) { case StatementTypes.SIGNAL : case StatementTypes.RESIGNAL : resolved = true; break; case StatementTypes.ITERATE : { StatementCompound statement = parent; while (statement != null) { if (statement.isLoop) { if (label == null) { resolved = true; break; } if (statement.label != null && label.name.equals(statement.label.name)) { resolved = true; break; } } statement = statement.parent; } break; } case StatementTypes.LEAVE : resolved = true; break; default : throw Error.runtimeError(ErrorCode.U_S0500, ""); } if (!resolved) { throw Error.error(ErrorCode.X_42602); } } public String describe(Session session) { return ""; } public boolean isCatalogLock() { return false; } public boolean isCatalogChange() { return false; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementSession.java0000644000175000017500000006313212007547412023120 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.result.Result; import org.hsqldb.rights.Grantee; import org.hsqldb.rights.User; import org.hsqldb.types.DTIType; import org.hsqldb.types.IntervalSecondData; import org.hsqldb.types.Type; /** * Implementation of Statement for SQL session statements.

                  * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.6 * @since 1.9.0 */ public class StatementSession extends Statement { public final static StatementSession commitNoChainStatement = new StatementSession(StatementTypes.COMMIT_WORK, new Object[]{ Boolean.FALSE }); public final static StatementSession rollbackNoChainStatement = new StatementSession(StatementTypes.ROLLBACK_WORK, new Object[]{ Boolean.FALSE }); public final static StatementSession commitAndChainStatement = new StatementSession(StatementTypes.COMMIT_WORK, new Object[]{ Boolean.TRUE }); public final static StatementSession rollbackAndChainStatement = new StatementSession(StatementTypes.ROLLBACK_WORK, new Object[]{ Boolean.TRUE }); static { commitNoChainStatement.sql = Tokens.T_COMMIT; commitAndChainStatement.sql = Tokens.T_COMMIT + ' ' + Tokens.T_CHAIN; rollbackNoChainStatement.sql = Tokens.T_ROLLBACK; rollbackAndChainStatement.sql = Tokens.T_ROLLBACK + ' ' + Tokens.T_CHAIN; commitNoChainStatement.compileTimestamp = Long.MAX_VALUE; commitAndChainStatement.compileTimestamp = Long.MAX_VALUE; rollbackNoChainStatement.compileTimestamp = Long.MAX_VALUE; rollbackAndChainStatement.compileTimestamp = Long.MAX_VALUE; } Expression[] expressions; Object[] parameters; StatementSession(int type, Expression[] args) { super(type); this.expressions = args; isTransactionStatement = false; isLogged = false; switch (type) { case StatementTypes.SET_PATH : case StatementTypes.SET_TIME_ZONE : case StatementTypes.SET_NAMES : case StatementTypes.SET_ROLE : case StatementTypes.SET_SCHEMA : case StatementTypes.SET_CATALOG : case StatementTypes.SET_SESSION_AUTHORIZATION : case StatementTypes.SET_COLLATION : group = StatementTypes.X_SQL_SESSION; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "StateemntSession"); } } StatementSession(int type, Object[] args) { super(type); this.parameters = args; isTransactionStatement = false; isLogged = false; switch (type) { // logged by statement case StatementTypes.SET_SCHEMA : group = StatementTypes.X_SQL_SESSION; isLogged = true; break; case StatementTypes.DECLARE_VARIABLE : group = StatementTypes.X_HSQLDB_SESSION; isLogged = true; break; // cursor case StatementTypes.ALLOCATE_CURSOR : group = StatementTypes.X_SQL_DATA; break; case StatementTypes.ALLOCATE_DESCRIPTOR : case StatementTypes.DEALLOCATE_DESCRIPTOR : case StatementTypes.DEALLOCATE_PREPARE : group = StatementTypes.X_SQL_DYNAMIC; break; // case StatementTypes.DYNAMIC_DELETE_CURSOR : group = StatementTypes.X_SQL_DATA_CHANGE; break; case StatementTypes.DYNAMIC_CLOSE : case StatementTypes.DYNAMIC_FETCH : case StatementTypes.DYNAMIC_OPEN : group = StatementTypes.X_SQL_DATA; break; // case StatementTypes.OPEN : case StatementTypes.FETCH : case StatementTypes.FREE_LOCATOR : case StatementTypes.GET_DESCRIPTOR : case StatementTypes.HOLD_LOCATOR : group = StatementTypes.X_SQL_DATA; break; // case StatementTypes.PREPARABLE_DYNAMIC_DELETE_CURSOR : case StatementTypes.PREPARABLE_DYNAMIC_UPDATE_CURSOR : case StatementTypes.PREPARE : group = StatementTypes.X_SQL_DYNAMIC; break; // logged by session case StatementTypes.DISCONNECT : group = StatementTypes.X_SQL_CONNECTION; break; // case StatementTypes.SET_COLLATION : case StatementTypes.SET_CONNECTION : case StatementTypes.SET_CONSTRAINT : case StatementTypes.SET_DESCRIPTOR : case StatementTypes.SET_SESSION_CHARACTERISTICS : case StatementTypes.SET_TRANSFORM_GROUP : case StatementTypes.SET_SESSION_RESULT_MAX_ROWS : case StatementTypes.SET_SESSION_RESULT_MEMORY_ROWS : case StatementTypes.SET_SESSION_AUTOCOMMIT : group = StatementTypes.X_HSQLDB_SESSION; break; case StatementTypes.SET_SESSION_SQL_IGNORECASE : isLogged = true; group = StatementTypes.X_HSQLDB_SESSION; break; // logged by session if necessary case StatementTypes.COMMIT_WORK : case StatementTypes.RELEASE_SAVEPOINT : case StatementTypes.ROLLBACK_SAVEPOINT : case StatementTypes.ROLLBACK_WORK : case StatementTypes.SAVEPOINT : case StatementTypes.SET_TRANSACTION : case StatementTypes.START_TRANSACTION : group = StatementTypes.X_SQL_TRANSACTION; break; case StatementTypes.DECLARE_SESSION_TABLE : case StatementTypes.DROP_TABLE : group = StatementTypes.X_SQL_SESSION; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementSession"); } } StatementSession(int type, HsqlName[] readNames, HsqlName[] writeNames) { super(type); this.isTransactionStatement = true; this.readTableNames = readNames; writeTableNames = writeNames; switch (type) { case StatementTypes.TRANSACTION_LOCK_TABLE : group = StatementTypes.X_HSQLDB_TRANSACTION; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementSession"); } } public Result execute(Session session) { Result result; try { result = getResult(session); } catch (Throwable t) { result = Result.newErrorResult(t, null); } if (result.isError()) { result.getException().setStatementType(group, type); return result; } try { if (isLogged) { session.database.logger.writeOtherStatement(session, sql); } } catch (Throwable e) { return Result.newErrorResult(e, sql); } return result; } Result getResult(Session session) { boolean startTransaction = false; if (this.isExplain) { return Result.newSingleColumnStringResult("OPERATION", describe(session)); } switch (type) { // cursor case StatementTypes.ALLOCATE_CURSOR : case StatementTypes.ALLOCATE_DESCRIPTOR : return Result.updateZeroResult; // case StatementTypes.COMMIT_WORK : { try { boolean chain = ((Boolean) parameters[0]).booleanValue(); session.commit(chain); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.DEALLOCATE_DESCRIPTOR : case StatementTypes.DEALLOCATE_PREPARE : return Result.updateZeroResult; case StatementTypes.DISCONNECT : session.close(); return Result.updateZeroResult; // case StatementTypes.DYNAMIC_CLOSE : case StatementTypes.DYNAMIC_DELETE_CURSOR : case StatementTypes.DYNAMIC_FETCH : case StatementTypes.DYNAMIC_OPEN : // case StatementTypes.FETCH : case StatementTypes.FREE_LOCATOR : case StatementTypes.GET_DESCRIPTOR : case StatementTypes.HOLD_LOCATOR : // case StatementTypes.OPEN : case StatementTypes.PREPARABLE_DYNAMIC_DELETE_CURSOR : case StatementTypes.PREPARABLE_DYNAMIC_UPDATE_CURSOR : case StatementTypes.PREPARE : return Result.updateZeroResult; case StatementTypes.TRANSACTION_LOCK_TABLE : { return Result.updateZeroResult; } case StatementTypes.RELEASE_SAVEPOINT : { String savepoint = (String) parameters[0]; try { session.releaseSavepoint(savepoint); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.ROLLBACK_WORK : { boolean chain = ((Boolean) parameters[0]).booleanValue(); session.rollback(chain); return Result.updateZeroResult; } case StatementTypes.ROLLBACK_SAVEPOINT : { String savepoint = (String) parameters[0]; try { session.rollbackToSavepoint(savepoint); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SAVEPOINT : { String savepoint = (String) parameters[0]; session.savepoint(savepoint); return Result.updateZeroResult; } case StatementTypes.SET_CATALOG : { String name; try { name = (String) expressions[0].getValue(session); name = (String) Type.SQL_VARCHAR.trim(session, name, ' ', true, true); if (session.database.getCatalogName().name.equals(name)) { return Result.updateZeroResult; } return Result.newErrorResult( Error.error(ErrorCode.X_3D000), sql); } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_CONNECTION : case StatementTypes.SET_CONSTRAINT : case StatementTypes.SET_DESCRIPTOR : return Result.updateZeroResult; case StatementTypes.SET_TIME_ZONE : { Object value = null; if (expressions[0].getType() == OpTypes.VALUE && expressions[0].getConstantValueNoCheck(session) == null) { session.setZoneSeconds(session.sessionTimeZoneSeconds); return Result.updateZeroResult; } try { value = expressions[0].getValue(session); } catch (HsqlException e) {} if (value instanceof Result) { Result result = (Result) value; if (result.isData()) { Object[] data = (Object[]) result.getNavigator().getNext(); boolean single = !result.getNavigator().next(); if (single && data != null && data[0] != null) { value = data[0]; result.getNavigator().release(); } else { result.getNavigator().release(); return Result.newErrorResult( Error.error(ErrorCode.X_22009), sql); } } else { return Result.newErrorResult( Error.error(ErrorCode.X_22009), sql); } } else { if (value == null) { return Result.newErrorResult( Error.error(ErrorCode.X_22009), sql); } } long seconds = ((IntervalSecondData) value).getSeconds(); if (-DTIType.timezoneSecondsLimit <= seconds && seconds <= DTIType.timezoneSecondsLimit) { session.setZoneSeconds((int) seconds); return Result.updateZeroResult; } return Result.newErrorResult(Error.error(ErrorCode.X_22009), sql); } case StatementTypes.SET_NAMES : return Result.updateZeroResult; case StatementTypes.SET_PATH : return Result.updateZeroResult; case StatementTypes.SET_ROLE : { String name; Grantee role = null; try { name = (String) expressions[0].getValue(session); if (name != null) { name = (String) Type.SQL_VARCHAR.trim(session, name, ' ', true, true); role = session.database.granteeManager.getRole(name); } } catch (HsqlException e) { return Result.newErrorResult( Error.error(ErrorCode.X_0P000), sql); } if (session.isInMidTransaction()) { return Result.newErrorResult( Error.error(ErrorCode.X_25001), sql); } if (role == null) { session.setRole(null); } if (session.getGrantee().hasRole(role)) { session.setRole(role); return Result.updateZeroResult; } else { return Result.newErrorResult( Error.error(ErrorCode.X_0P000), sql); } } case StatementTypes.SET_SCHEMA : { String name; HsqlName schema; try { if (expressions == null) { name = ((HsqlName) parameters[0]).name; } else { name = (String) expressions[0].getValue(session); } name = (String) Type.SQL_VARCHAR.trim(session, name, ' ', true, true); schema = session.database.schemaManager.getSchemaHsqlName(name); session.setCurrentSchemaHsqlName(schema); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_SESSION_AUTHORIZATION : { if (session.isInMidTransaction()) { return Result.newErrorResult( Error.error(ErrorCode.X_25001), sql); } try { String user; String password = null; user = (String) expressions[0].getValue(session); user = (String) Type.SQL_VARCHAR.trim(session, user, ' ', true, true); if (expressions[1] != null) { password = (String) expressions[1].getValue(session); } User userObject; if (password == null) { userObject = session.database.userManager.get(user); } else { userObject = session.database.getUserManager().getUser(user, password); } if (userObject == null) { throw Error.error(ErrorCode.X_28501); } // override the actual SQL at runtime sql = userObject.getConnectUserSQL(); if (userObject == session.getGrantee()) { return Result.updateZeroResult; } if (password == null && !session.isProcessingLog() && userObject.isAdmin() && !session.getGrantee().isAdmin()) { throw Error.error(ErrorCode.X_28000); } if (session.getGrantee().canChangeAuthorisation()) { session.setUser((User) userObject); session.setRole(null); session.resetSchema(); return Result.updateZeroResult; } /** @todo may need different error code */ throw Error.error(ErrorCode.X_28000); } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_SESSION_CHARACTERISTICS : { try { if (parameters[0] != null) { boolean readonly = ((Boolean) parameters[0]).booleanValue(); session.setReadOnlyDefault(readonly); } if (parameters[1] != null) { int level = ((Integer) parameters[1]).intValue(); session.setIsolationDefault(level); } return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_COLLATION : return Result.updateZeroResult; case StatementTypes.SET_TRANSFORM_GROUP : return Result.updateZeroResult; case StatementTypes.START_TRANSACTION : startTransaction = true; // fall through case StatementTypes.SET_TRANSACTION : { try { if (parameters[0] != null) { boolean readonly = ((Boolean) parameters[0]).booleanValue(); session.setReadOnly(readonly); } if (parameters[1] != null) { int level = ((Integer) parameters[1]).intValue(); session.setIsolation(level); } if (startTransaction) { session.startTransaction(); } return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } // case StatementTypes.SET_SESSION_AUTOCOMMIT : { boolean mode = ((Boolean) parameters[0]).booleanValue(); try { session.setAutoCommit(mode); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.DECLARE_VARIABLE : { ColumnSchema[] variables = (ColumnSchema[]) parameters[0]; try { for (int i = 0; i < variables.length; i++) { session.sessionContext.addSessionVariable( variables[i]); } return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_SESSION_RESULT_MAX_ROWS : { int size = ((Integer) parameters[0]).intValue(); session.setSQLMaxRows(size); return Result.updateZeroResult; } case StatementTypes.SET_SESSION_RESULT_MEMORY_ROWS : { int size = ((Integer) parameters[0]).intValue(); session.setResultMemoryRowCount(size); return Result.updateZeroResult; } case StatementTypes.SET_SESSION_SQL_IGNORECASE : { try { boolean mode = ((Boolean) parameters[0]).booleanValue(); session.setIgnoreCase(mode); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.DECLARE_SESSION_TABLE : { Table table = (Table) parameters[0]; HsqlArrayList tempConstraints = (HsqlArrayList) parameters[1]; StatementDMQL statement = (StatementDMQL) parameters[2]; try { if (tempConstraints.size() != 0) { table = ParserDDL.addTableConstraintDefinitions(session, table, tempConstraints, null, false); } table.compile(session, null); session.sessionContext.addSessionTable(table); if (table.hasLobColumn) { throw Error.error(ErrorCode.X_42534); } if (statement != null) { Result result = statement.execute(session); table.insertIntoTable(session, result); } return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.DROP_TABLE : { HsqlName name = (HsqlName) parameters[0]; Boolean ifExists = (Boolean) parameters[1]; Table table = session.sessionContext.findSessionTable(name.name); if (table == null) { if (ifExists.booleanValue()) { return Result.updateZeroResult; } else { throw Error.error(ErrorCode.X_42501, name.name); } } session.sessionContext.dropSessionTable(name.name); return Result.updateZeroResult; } default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementSession"); } } public boolean isAutoCommitStatement() { return false; } public String describe(Session session) { return sql; } public boolean isCatalogLock() { return false; } public boolean isCatalogChange() { return false; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/StatementCommand.java0000644000175000017500000013517112007547352023061 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.java.JavaSystem; import org.hsqldb.persist.HsqlDatabaseProperties; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.persist.PersistentStore; import org.hsqldb.result.Result; import org.hsqldb.result.ResultMetaData; import org.hsqldb.rights.User; import org.hsqldb.scriptio.ScriptWriterText; /** * Implementation of Statement for SQL commands.

                  * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.8 * @since 1.9.0 */ public class StatementCommand extends Statement { Object[] parameters; StatementCommand(int type, Object[] args) { this(type, args, null, null); } StatementCommand(int type, Object[] args, HsqlName[] readNames, HsqlName[] writeNames) { super(type); this.isTransactionStatement = true; this.parameters = args; if (readNames != null) { this.readTableNames = readNames; } if (writeNames != null) { this.writeTableNames = writeNames; } switch (type) { case StatementTypes.TRUNCATE : group = StatementTypes.X_HSQLDB_DATABASE_OPERATION; break; case StatementTypes.EXPLAIN_PLAN : group = StatementTypes.X_SQL_DIAGNOSTICS; statementReturnType = StatementTypes.RETURN_RESULT; isTransactionStatement = false; isLogged = false; break; case StatementTypes.DATABASE_CHECKPOINT : group = StatementTypes.X_HSQLDB_DATABASE_OPERATION; isLogged = false; break; case StatementTypes.DATABASE_SCRIPT : { String name = (String) parameters[0]; if (name == null) { statementReturnType = StatementTypes.RETURN_RESULT; } group = StatementTypes.X_HSQLDB_DATABASE_OPERATION; isLogged = false; } case StatementTypes.DATABASE_BACKUP : group = StatementTypes.X_HSQLDB_DATABASE_OPERATION; isLogged = false; break; case StatementTypes.SET_DATABASE_UNIQUE_NAME : case StatementTypes.SET_DATABASE_FILES_WRITE_DELAY : case StatementTypes.SET_DATABASE_FILES_TEMP_PATH : isTransactionStatement = false; group = StatementTypes.X_HSQLDB_SETTING; break; case StatementTypes.SET_DATABASE_FILES_EVENT_LOG : isTransactionStatement = false; group = StatementTypes.X_HSQLDB_SETTING; break; // case StatementTypes.SET_DATABASE_DEFAULT_INITIAL_SCHEMA : case StatementTypes.SET_DATABASE_DEFAULT_TABLE_TYPE : case StatementTypes.SET_DATABASE_FILES_CACHE_ROWS : case StatementTypes.SET_DATABASE_FILES_CACHE_SIZE : case StatementTypes.SET_DATABASE_FILES_SCALE : case StatementTypes.SET_DATABASE_FILES_DEFRAG : case StatementTypes.SET_DATABASE_FILES_LOBS_SCALE : case StatementTypes.SET_DATABASE_FILES_LOG : case StatementTypes.SET_DATABASE_FILES_LOG_SIZE : case StatementTypes.SET_DATABASE_FILES_NIO : case StatementTypes.SET_DATABASE_FILES_SCRIPT_FORMAT : case StatementTypes.SET_DATABASE_AUTHENTICATION : case StatementTypes.SET_DATABASE_PASSWORD_CHECK : case StatementTypes.SET_DATABASE_PROPERTY : case StatementTypes.SET_DATABASE_RESULT_MEMORY_ROWS : case StatementTypes.SET_DATABASE_SQL_REFERENTIAL_INTEGRITY : case StatementTypes.SET_DATABASE_SQL : case StatementTypes.SET_DATABASE_TRANSACTION_CONTROL : case StatementTypes.SET_DATABASE_DEFAULT_ISOLATION_LEVEL : case StatementTypes.SET_DATABASE_TRANSACTION_CONFLICT : case StatementTypes.SET_DATABASE_GC : // case StatementTypes.SET_DATABASE_SQL_COLLATION : case StatementTypes.SET_DATABASE_FILES_BACKUP_INCREMENT : case StatementTypes.SET_DATABASE_TEXT_SOURCE : group = StatementTypes.X_HSQLDB_SETTING; break; case StatementTypes.SET_TABLE_CLUSTERED : group = StatementTypes.X_HSQLDB_SCHEMA_MANIPULATION; break; case StatementTypes.SET_TABLE_SOURCE_HEADER : isLogged = false; // fall through case StatementTypes.SET_TABLE_SOURCE : group = StatementTypes.X_HSQLDB_SCHEMA_MANIPULATION; break; case StatementTypes.SET_TABLE_READONLY : group = StatementTypes.X_HSQLDB_SCHEMA_MANIPULATION; break; case StatementTypes.DATABASE_SHUTDOWN : group = StatementTypes.X_HSQLDB_DATABASE_OPERATION; isTransactionStatement = false; isLogged = false; break; case StatementTypes.SET_TABLE_TYPE : group = StatementTypes.X_HSQLDB_SCHEMA_MANIPULATION; break; case StatementTypes.SET_TABLE_INDEX : group = StatementTypes.X_HSQLDB_SETTING; isTransactionStatement = false; isLogged = false; break; case StatementTypes.SET_USER_LOCAL : case StatementTypes.SET_USER_INITIAL_SCHEMA : case StatementTypes.SET_USER_PASSWORD : group = StatementTypes.X_HSQLDB_SETTING; isTransactionStatement = false; break; case StatementTypes.ALTER_SESSION : group = StatementTypes.X_HSQLDB_SESSION; isTransactionStatement = false; isLogged = false; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "StatementCommand"); } } public Result execute(Session session) { Result result; try { result = getResult(session); } catch (Throwable t) { result = Result.newErrorResult(t, null); } if (result.isError()) { result.getException().setStatementType(group, type); return result; } try { if (isLogged) { session.database.logger.writeOtherStatement(session, sql); } } catch (Throwable e) { return Result.newErrorResult(e, sql); } return result; } Result getResult(Session session) { if (this.isExplain) { return Result.newSingleColumnStringResult("OPERATION", describe(session)); } switch (type) { case StatementTypes.TRUNCATE : { return getTruncateResult(session); } case StatementTypes.EXPLAIN_PLAN : { Statement statement = (Statement) parameters[0]; return Result.newSingleColumnStringResult("OPERATION", statement.describe(session)); } case StatementTypes.DATABASE_BACKUP : { String path = (String) parameters[0]; boolean blocking = ((Boolean) parameters[1]).booleanValue(); boolean script = ((Boolean) parameters[2]).booleanValue(); boolean compressed = ((Boolean) parameters[3]).booleanValue(); try { session.checkAdmin(); if (!session.database.getType().equals( DatabaseURL.S_FILE)) { // Do not enforce this constraint for SCRIPT type // backup. return Result.newErrorResult( Error.error(ErrorCode.DATABASE_IS_NON_FILE)); // If we were to back up res: type DB's, could use // DatabasURL.isFileBasedDataType(), but I see no // point to back up one of these. } if (session.database.isReadOnly()) { // Do not enforce this constraint for SCRIPT type // backup. return Result.newErrorResult( Error.error(ErrorCode.DATABASE_IS_MEMORY_ONLY), null); } if (session.database.logger.isStoredFileAccess()) { return Result.newErrorResult( Error.error(ErrorCode.DATABASE_IS_NON_FILE), null); } session.database.logger.backup(path, script, blocking, compressed); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.DATABASE_CHECKPOINT : { boolean defrag = ((Boolean) parameters[0]).booleanValue(); session.database.lobManager.lock(); try { session.checkAdmin(); session.checkDDLWrite(); session.database.logger.checkpoint(defrag); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } finally { session.database.lobManager.unlock(); } } case StatementTypes.SET_DATABASE_FILES_BACKUP_INCREMENT : { try { boolean mode = ((Boolean) parameters[0]).booleanValue(); session.checkAdmin(); session.checkDDLWrite(); session.database.logger.setIncrementBackup(mode); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_FILES_CACHE_ROWS : { try { int value = ((Integer) parameters[0]).intValue(); boolean check = parameters[1] == null; session.checkAdmin(); session.checkDDLWrite(); if (check && !session.database.getProperties() .validateProperty(HsqlDatabaseProperties .hsqldb_cache_rows, value)) { throw Error.error(ErrorCode.X_42556); } session.database.logger.setCacheMaxRows(value); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_FILES_CACHE_SIZE : { try { int value = ((Integer) parameters[0]).intValue(); boolean check = parameters[1] == null; session.checkAdmin(); session.checkDDLWrite(); if (check && !session.database.getProperties() .validateProperty(HsqlDatabaseProperties .hsqldb_cache_size, value)) { throw Error.error(ErrorCode.X_42556); } session.database.logger.setCacheSize(value); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_FILES_LOBS_SCALE : { try { int value = ((Integer) parameters[0]).intValue(); session.checkAdmin(); session.checkDDLWrite(); if (session.isProcessingScript) { session.database.logger.setLobFileScaleNoCheck(value); } else { session.database.logger.setLobFileScale(value); } return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_FILES_SCALE : { try { int value = ((Integer) parameters[0]).intValue(); session.checkAdmin(); session.checkDDLWrite(); if (session.isProcessingScript) { session.database.logger.setDataFileScaleNoCheck(value); } else { session.database.logger.setDataFileScale(value); } return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_FILES_DEFRAG : { try { int value = ((Integer) parameters[0]).intValue(); session.checkAdmin(); session.checkDDLWrite(); if (!session.database.getProperties().validateProperty( HsqlDatabaseProperties.hsqldb_defrag_limit, value)) { throw Error.error(ErrorCode.X_42556); } session.database.logger.setDefagLimit(value); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_FILES_EVENT_LOG : { try { int value = ((Integer) parameters[0]).intValue(); boolean isSql = ((Boolean) parameters[1]).booleanValue(); session.checkAdmin(); session.checkDDLWrite(); session.database.logger.setEventLogLevel(value, isSql); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_FILES_NIO : { try { session.checkAdmin(); session.checkDDLWrite(); Object v = parameters[0]; if (v instanceof Boolean) { boolean value = ((Boolean) parameters[0]).booleanValue(); session.database.logger.setNioDataFile(value); } else { int value = ((Integer) parameters[0]).intValue(); session.database.logger.setNioMaxSize(value); } return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_FILES_LOG : { try { boolean value = ((Boolean) parameters[0]).booleanValue(); session.checkAdmin(); session.checkDDLWrite(); session.database.logger.setLogData(value); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_FILES_LOG_SIZE : { try { int value = ((Integer) parameters[0]).intValue(); session.checkAdmin(); session.checkDDLWrite(); session.database.logger.setLogSize(value); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_FILES_TEMP_PATH : { try { String value = (String) parameters[0]; session.checkAdmin(); session.checkDDLWrite(); // no action return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_FILES_SCRIPT_FORMAT : { try { int value = ((Integer) parameters[0]).intValue(); session.checkAdmin(); session.checkDDLWrite(); session.database.logger.setScriptType(value); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_FILES_WRITE_DELAY : { try { int value = ((Integer) parameters[0]).intValue(); session.checkAdmin(); session.checkDDLWrite(); session.database.logger.setWriteDelay(value); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_AUTHENTICATION : { try { Routine routine = (Routine) parameters[0]; session.checkAdmin(); session.checkDDLWrite(); session.database.userManager.setExtAuthenticationFunction( routine); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_PASSWORD_CHECK : { try { Routine routine = (Routine) parameters[0]; session.checkAdmin(); session.checkDDLWrite(); session.database.userManager.setPasswordCheckFunction( routine); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_SQL_COLLATION : { try { String name = (String) parameters[0]; boolean padSpaces = ((Boolean) parameters[1]).booleanValue(); /** @todo 1.9.0 - ensure no data in character columns */ session.checkAdmin(); session.checkDDLWrite(); session.database.collation.setCollation(name, padSpaces); session.database.schemaManager.setSchemaChangeTimestamp(); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_SQL_REFERENTIAL_INTEGRITY : { boolean mode = ((Boolean) parameters[0]).booleanValue(); session.checkAdmin(); session.checkDDLWrite(); session.database.setReferentialIntegrity(mode); return Result.updateZeroResult; } case StatementTypes.SET_DATABASE_SQL : { String property = (String) parameters[0]; boolean mode = ((Boolean) parameters[1]).booleanValue(); int value = ((Number) parameters[2]).intValue(); session.checkAdmin(); session.checkDDLWrite(); if (property == HsqlDatabaseProperties.sql_enforce_names) { session.database.setStrictNames(mode); } else if (property == HsqlDatabaseProperties.sql_regular_names) { session.database.setRegularNames(mode); } else if (property == HsqlDatabaseProperties.sql_enforce_size) { session.database.setStrictColumnSize(mode); } else if (property == HsqlDatabaseProperties.sql_enforce_types) { session.database.setStrictTypes(mode); } else if (property == HsqlDatabaseProperties.sql_enforce_refs) { session.database.setStrictReferences(mode); } else if (property == HsqlDatabaseProperties.sql_enforce_tdcd) { session.database.setStrictTDCD(mode); } else if (property == HsqlDatabaseProperties.sql_enforce_tdcu) { session.database.setStrictTDCU(mode); } else if (property == HsqlDatabaseProperties .jdbc_translate_tti_types) { session.database.setTranslateTTI(mode); } else if (property == HsqlDatabaseProperties.sql_concat_nulls) { session.database.setConcatNulls(mode); } else if (property == HsqlDatabaseProperties.sql_nulls_first) { session.database.setNullsFirst(mode); } else if (property == HsqlDatabaseProperties.sql_unique_nulls) { session.database.setUniqueNulls(mode); } else if (property == HsqlDatabaseProperties.sql_convert_trunc) { session.database.setConvertTrunc(mode); } else if (property == HsqlDatabaseProperties.sql_avg_scale) { session.database.setAvgScale(value); } else if (property == HsqlDatabaseProperties.sql_double_nan) { session.database.setDoubleNaN(mode); } else if (property == HsqlDatabaseProperties.sql_longvar_is_lob) { session.database.setLongVarIsLob(mode); } else if (property == HsqlDatabaseProperties.sql_syntax_db2) { session.database.setSyntaxDb2(mode); } else if (property == HsqlDatabaseProperties.sql_syntax_mss) { session.database.setSyntaxMss(mode); } else if (property == HsqlDatabaseProperties.sql_syntax_mys) { session.database.setSyntaxMys(mode); } else if (property == HsqlDatabaseProperties.sql_syntax_ora) { session.database.setSyntaxOra(mode); } else if (property == HsqlDatabaseProperties.sql_syntax_pgs) { session.database.setSyntaxPgs(mode); } return Result.updateZeroResult; } case StatementTypes.SET_DATABASE_DEFAULT_INITIAL_SCHEMA : { HsqlName schema = (HsqlName) parameters[0]; session.checkAdmin(); session.checkDDLWrite(); // session.database.schemaManager.setDefaultSchemaHsqlName( schema); session.database.schemaManager.setSchemaChangeTimestamp(); // return Result.updateZeroResult; } case StatementTypes.SET_DATABASE_DEFAULT_TABLE_TYPE : { Integer type = (Integer) parameters[0]; session.checkAdmin(); session.checkDDLWrite(); // session.database.schemaManager.setDefaultTableType( type.intValue()); // return Result.updateZeroResult; } case StatementTypes.SET_DATABASE_TRANSACTION_CONTROL : { try { int mode = ((Integer) parameters[0]).intValue(); session.checkAdmin(); session.database.txManager.setTransactionControl(session, mode); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_DEFAULT_ISOLATION_LEVEL : { try { int mode = ((Integer) parameters[0]).intValue(); session.checkAdmin(); session.database.defaultIsolationLevel = mode; return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_TRANSACTION_CONFLICT : { try { boolean mode = ((Boolean) parameters[0]).booleanValue(); session.checkAdmin(); session.database.txConflictRollback = mode; return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_GC : { try { int count = ((Integer) parameters[0]).intValue(); session.checkAdmin(); JavaSystem.gcFrequency = count; return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_PROPERTY : { try { String property = (String) parameters[0]; Object value = parameters[1]; // command is a no-op from 1.9 session.checkAdmin(); session.checkDDLWrite(); /* HsqlDatabaseProperties p = session.database.getProperties(); p.setDatabaseProperty(property, value.toString().toLowerCase()); */ return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_RESULT_MEMORY_ROWS : { int size = ((Integer) parameters[0]).intValue(); session.checkAdmin(); session.database.setResultMaxMemoryRows(size); return Result.updateZeroResult; } case StatementTypes.SET_DATABASE_TEXT_SOURCE : { try { String source = (String) parameters[0]; HsqlProperties props = null; session.checkAdmin(); if (source.length() > 0) { props = HsqlProperties.delimitedArgPairsToProps(source, "=", ";", null); if (props.getErrorKeys().length > 0) { throw Error.error(ErrorCode.TEXT_TABLE_SOURCE, props.getErrorKeys()[0]); } session.database.logger.setDefaultTextTableProperties( source, props); } return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_DATABASE_UNIQUE_NAME : { try { String name = (String) parameters[0]; session.checkAdmin(); session.database.setUniqueName(name); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.DATABASE_SCRIPT : { ScriptWriterText dsw = null; String name = (String) parameters[0]; try { session.checkAdmin(); if (name == null) { return session.database.getScript(false); } else { dsw = new ScriptWriterText(session.database, name, true, true, true); dsw.writeAll(); dsw.close(); return Result.updateZeroResult; } } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.DATABASE_SHUTDOWN : { try { int mode = ((Integer) parameters[0]).intValue(); session.checkAdmin(); session.database.close(mode); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_TABLE_CLUSTERED : { try { HsqlName name = (HsqlName) parameters[0]; int[] colIndex = (int[]) parameters[1]; Table table = session.database.schemaManager.getTable(session, name.name, name.schema.name); StatementSchema.checkSchemaUpdateAuthorisation(session, table.getSchemaName()); if (!table.isCached() && !table.isText()) { throw Error.error(ErrorCode.ACCESS_IS_DENIED); } Index index = table.getIndexForColumns(session, colIndex); if (index != null) { Index[] indexes = table.getIndexList(); for (int i = 0; i < indexes.length; i++) { indexes[i].setClustered(false); } index.setClustered(true); } return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_TABLE_INDEX : { try { HsqlName name = (HsqlName) parameters[0]; String value = (String) parameters[1]; Table table = session.database.schemaManager.getTable(session, name.name, name.schema.name); if (session.isProcessingScript()) { table.setIndexRoots(session, value); } return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_TABLE_READONLY : { try { HsqlName name = (HsqlName) parameters[0]; Table table = session.database.schemaManager.getTable(session, name.name, name.schema.name); boolean mode = ((Boolean) parameters[1]).booleanValue(); StatementSchema.checkSchemaUpdateAuthorisation(session, table.getSchemaName()); table.setDataReadOnly(mode); session.database.schemaManager.setSchemaChangeTimestamp(); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_TABLE_SOURCE : case StatementTypes.SET_TABLE_SOURCE_HEADER : { try { HsqlName name = (HsqlName) parameters[0]; Table table = session.database.schemaManager.getTable(session, name.name, name.schema.name); StatementSchema.checkSchemaUpdateAuthorisation(session, table.getSchemaName()); if (!table.isText()) { Exception e = Error.error(ErrorCode.X_S0522); return Result.newErrorResult(e, sql); } if (parameters[1] != null) { boolean mode = ((Boolean) parameters[1]).booleanValue(); if (mode) { ((TextTable) table).connect(session); } else { ((TextTable) table).disconnect(); } session.database.schemaManager .setSchemaChangeTimestamp(); return Result.updateZeroResult; } String source = (String) parameters[2]; boolean isDesc = ((Boolean) parameters[3]).booleanValue(); boolean isHeader = ((Boolean) parameters[4]).booleanValue(); if (isHeader) { ((TextTable) table).setHeader(source); } else { ((TextTable) table).setDataSource(session, source, isDesc, false); } return Result.updateZeroResult; } catch (Throwable e) { if (!(e instanceof HsqlException)) { e = Error.error(ErrorCode.GENERAL_IO_ERROR, e.toString()); } if (session.isProcessingLog() || session.isProcessingScript()) { session.addWarning((HsqlException) e); session.database.logger.logWarningEvent( "Problem processing SET TABLE SOURCE", e); return Result.updateZeroResult; } else { return Result.newErrorResult(e, sql); } } } case StatementTypes.SET_TABLE_TYPE : { try { HsqlName name = (HsqlName) parameters[0]; int type = ((Integer) parameters[1]).intValue(); // Table table = session.database.schemaManager.getUserTable(session, name.name, name.schema.name); if (name.schema != SqlInvariants.LOBS_SCHEMA_HSQLNAME) { StatementSchema.checkSchemaUpdateAuthorisation(session, table.getSchemaName()); } session.setScripting(true); TableWorks tw = new TableWorks(session, table); tw.setTableType(session, type); session.database.schemaManager.setSchemaChangeTimestamp(); if (name.schema == SqlInvariants.LOBS_SCHEMA_HSQLNAME) { session.database.lobManager.compileStatements(); } return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_USER_LOCAL : { User user = (User) parameters[0]; boolean mode = ((Boolean) parameters[1]).booleanValue(); session.checkAdmin(); session.checkDDLWrite(); user.isLocalOnly = mode; session.database.schemaManager.setSchemaChangeTimestamp(); return Result.updateZeroResult; } case StatementTypes.SET_USER_INITIAL_SCHEMA : { try { User user = (User) parameters[0]; HsqlName schema = (HsqlName) parameters[1]; session.checkDDLWrite(); if (user == null) { user = session.getUser(); } else { session.checkAdmin(); session.checkDDLWrite(); user = session.database.userManager.get( user.getName().getNameString()); } if (schema != null) { schema = session.database.schemaManager.getSchemaHsqlName( schema.name); } // user.setInitialSchema(schema); session.database.schemaManager.setSchemaChangeTimestamp(); // return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.SET_USER_PASSWORD : { try { User user = parameters[0] == null ? session.getUser() : (User) parameters[0]; String password = (String) parameters[1]; boolean isDigest = (Boolean) parameters[2]; session.checkDDLWrite(); session.setScripting(true); session.database.userManager.setPassword(session, user, password, isDigest); return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } case StatementTypes.ALTER_SESSION : { try { long sessionID = ((Number) parameters[0]).longValue(); int action = ((Number) parameters[1]).intValue(); Session targetSession = session.database.sessionManager.getSession(sessionID); if (targetSession == null) { throw Error.error(ErrorCode.X_2E000); } switch (action) { case Tokens.ALL : targetSession.resetSession(); break; case Tokens.TABLE : targetSession.sessionData.persistentStoreCollection .clearAllTables(); break; case Tokens.RESULT : targetSession.sessionData.closeAllNavigators(); break; case Tokens.CLOSE : targetSession.abortTransaction = true; targetSession.latch.setCount(0); targetSession.close(); break; case Tokens.RELEASE : targetSession.abortTransaction = true; targetSession.latch.setCount(0); break; } } catch (HsqlException e) { return Result.newErrorResult(e, sql); } return Result.updateZeroResult; } default : throw Error.runtimeError(ErrorCode.U_S0500, "StatemntCommand"); } } Result getTruncateResult(Session session) { try { HsqlName name = (HsqlName) parameters[0]; boolean restartIdentity = (Boolean) parameters[1]; boolean noCheck = (Boolean) parameters[2]; Table[] tables; if (name.type == SchemaObject.TABLE) { Table table = session.database.schemaManager.getUserTable(session, name); tables = new Table[]{ table }; session.getGrantee().checkDelete(table); if (!noCheck) { for (int i = 0; i < table.fkMainConstraints.length; i++) { if (table.fkMainConstraints[i].getRef() != table) { HsqlName tableName = table.fkMainConstraints[i].getRef().getName(); Table refTable = session.database.schemaManager.getUserTable( session, tableName); if (!refTable.isEmpty(session)) { throw Error.error(ErrorCode.X_23504, refTable.getName().name); } } } } } else { // ensure schema existence session.database.schemaManager.getSchemaHsqlName(name.name); HashMappedList list = session.database.schemaManager.getTables(name.name); tables = new Table[list.size()]; list.toValuesArray(tables); StatementSchema.checkSchemaUpdateAuthorisation(session, name); if (!noCheck) { OrderedHashSet set = new OrderedHashSet(); session.database.schemaManager .getCascadingReferencesToSchema(name, set); for (int i = 0; i < set.size(); i++) { HsqlName objectName = (HsqlName) set.get(i); if (objectName.type == SchemaObject.CONSTRAINT) { if (objectName.parent.type == SchemaObject.TABLE) { Table refTable = (Table) session.database.schemaManager .getUserTable(session, objectName.parent); if (!refTable.isEmpty(session)) { throw Error.error(ErrorCode.X_23504, refTable.getName().name); } } } } } if (restartIdentity) { Iterator it = session.database.schemaManager.databaseObjectIterator( name.name, SchemaObject.SEQUENCE); while (it.hasNext()) { NumberSequence sequence = (NumberSequence) it.next(); sequence.reset(); } } } for (int i = 0; i < tables.length; i++) { Table table = tables[i]; PersistentStore store = table.getRowStore(session); store.removeAll(); if (restartIdentity && table.identitySequence != null) { table.identitySequence.reset(); } } return Result.updateZeroResult; } catch (HsqlException e) { return Result.newErrorResult(e, sql); } } public ResultMetaData getResultMetaData() { switch (type) { case StatementTypes.EXPLAIN_PLAN : return ResultMetaData.newSingleColumnMetaData("OPERATION"); case StatementTypes.DATABASE_SCRIPT : if (statementReturnType == StatementTypes.RETURN_RESULT) { return ResultMetaData.newSingleColumnMetaData("COMMANDS"); } default : return super.getResultMetaData(); } } public boolean isAutoCommitStatement() { return isTransactionStatement; } public String describe(Session session) { return sql; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/SqlInvariants.java0000644000175000017500000001420212007547406022403 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; /** * Invariant schema object namess. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.7 * @since 1.9.0 */ public class SqlInvariants { /** * The role name reserved for authorization of INFORMATION_SCHEMA and * system objects. */ public static final String SYSTEM_AUTHORIZATION_NAME = "_SYSTEM"; /** The role name reserved for ADMIN users. */ public static final String DBA_ADMIN_ROLE_NAME = "DBA"; /** The role name allowing schema creation for users. */ public static final String SCHEMA_CREATE_ROLE_NAME = "CREATE_SCHEMA"; /** The role name allowing switching authorisation for users. */ public static final String CHANGE_AUTH_ROLE_NAME = "CHANGE_AUTHORIZATION"; // public static final String SYSTEM_SUBQUERY = "SYSTEM_SUBQUERY"; /** The role name reserved for the special PUBLIC pseudo-user. */ public static final String PUBLIC_ROLE_NAME = "PUBLIC"; public static final String SYSTEM_SCHEMA = "SYSTEM_SCHEMA"; public static final String LOBS_SCHEMA = "SYSTEM_LOBS"; public static final String DEFINITION_SCHEMA = "DEFINITION_SCHEMA"; public static final String INFORMATION_SCHEMA = "INFORMATION_SCHEMA"; public static final String SQLJ_SCHEMA = "SQLJ"; public static final String PUBLIC_SCHEMA = "PUBLIC"; public static final String CLASSPATH_NAME = "CLASSPATH"; public static final String MODULE = "MODULE"; public static final String DUAL = "DUAL"; public static final String DUMMY = "DUMMY"; public static final String IDX = "IDX"; public static final HsqlName INFORMATION_SCHEMA_HSQLNAME; public static final HsqlName SYSTEM_SCHEMA_HSQLNAME; public static final HsqlName LOBS_SCHEMA_HSQLNAME; public static final HsqlName SQLJ_SCHEMA_HSQLNAME; public static final HsqlName SYSTEM_SUBQUERY_HSQLNAME; public static final HsqlName MODULE_HSQLNAME; public static final HsqlName DUAL_TABLE_HSQLNAME; public static final HsqlName DUAL_COLUMN_HSQLNAME; public static final HsqlName SYSTEM_INDEX_HSQLNAME; static { INFORMATION_SCHEMA_HSQLNAME = HsqlNameManager.newSystemObjectName(INFORMATION_SCHEMA, SchemaObject.SCHEMA); SYSTEM_SCHEMA_HSQLNAME = HsqlNameManager.newSystemObjectName(SYSTEM_SCHEMA, SchemaObject.SCHEMA); LOBS_SCHEMA_HSQLNAME = HsqlNameManager.newSystemObjectName(LOBS_SCHEMA, SchemaObject.SCHEMA); SQLJ_SCHEMA_HSQLNAME = HsqlNameManager.newSystemObjectName(SQLJ_SCHEMA, SchemaObject.SCHEMA); SYSTEM_SUBQUERY_HSQLNAME = HsqlNameManager.newSystemObjectName(SYSTEM_SUBQUERY, SchemaObject.TABLE); MODULE_HSQLNAME = HsqlNameManager.newSystemObjectName(MODULE, SchemaObject.SCHEMA); DUAL_TABLE_HSQLNAME = HsqlNameManager.newSystemObjectName(DUAL, SchemaObject.SCHEMA); DUAL_COLUMN_HSQLNAME = HsqlNameManager.newSystemObjectName(DUMMY, SchemaObject.SCHEMA); SYSTEM_INDEX_HSQLNAME = HsqlNameManager.newSystemObjectName(IDX, SchemaObject.INDEX); SYSTEM_SUBQUERY_HSQLNAME.setSchemaIfNull(SYSTEM_SCHEMA_HSQLNAME); } public static final void checkSchemaNameNotSystem(String name) { if (isSystemSchemaName(name)) { throw Error.error(ErrorCode.X_42503, name); } } public static final boolean isSystemSchemaName(String name) { if (SqlInvariants.DEFINITION_SCHEMA.equals(name) || SqlInvariants.INFORMATION_SCHEMA.equals(name) || SqlInvariants.SYSTEM_SCHEMA.equals(name) || SqlInvariants.SQLJ_SCHEMA.equals(name)) { return true; } return false; } public static final boolean isLobsSchemaName(String name) { if (SqlInvariants.LOBS_SCHEMA.equals(name)) { return true; } return false; } public static final boolean isSchemaNameSystem(HsqlName name) { if (name.schema != null) { name = name.schema; } if (SqlInvariants.INFORMATION_SCHEMA_HSQLNAME.equals(name) || SqlInvariants.SYSTEM_SCHEMA_HSQLNAME.equals(name) || SqlInvariants.SQLJ_SCHEMA_HSQLNAME.equals(name)) { return true; } return false; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/0000755000175000017500000000000012007570424017716 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestAcl.java0000644000175000017500000003302412007547406022126 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.hsqldb.server.ServerAcl; import junit.framework.Test; import java.io.IOException; import java.io.File; import java.io.PrintWriter; import java.io.FileWriter; import java.net.InetAddress; import java.util.List; import java.util.ArrayList; public class TestAcl extends junit.framework.TestCase { private ServerAcl aclDefault = null; private ServerAcl[] aclPermitLocalhosts = null; private ServerAcl[] aclPermitLocalNets = null; private ServerAcl[] aclDenyLocalNets = null; private ServerAcl[] aclDenyLocalhosts = null; private ServerAcl[] aclPermitAlls = null; private ServerAcl[] aclDenyAlls = null; private InetAddress localhostByName = InetAddress.getByName("localhost"); private InetAddress localhostByAddr = InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }); // Can't depend on any other host name being resolvable :( private InetAddress otherHostByAddr = InetAddress.getByAddress(new byte[] { 1, 2, 3, 4 }); public TestAcl() throws IOException, ServerAcl.AclFormatException { commonSetup(); } public TestAcl(String s) throws IOException, ServerAcl.AclFormatException { super(s); commonSetup(); } private void commonSetup() throws IOException, ServerAcl.AclFormatException { boolean verbose = System.getProperty("VERBOSE") != null; File file; PrintWriter pw; List acls = new ArrayList(); file = File.createTempFile("zero", ".txt"); file.deleteOnExit(); (new FileWriter(file)).close(); aclDefault = new ServerAcl(file); if (verbose) { aclDefault.setPrintWriter(new PrintWriter(System.out)); } acls.clear(); file = File.createTempFile("aclDenyAll1", ".txt"); file.deleteOnExit(); pw = new PrintWriter(new FileWriter(file)); pw.println("# Deny all test ACL\n"); pw.println("deny 0.0.0.0/0"); pw.close(); acls.add(new ServerAcl(file)); aclDenyAlls = (ServerAcl[]) acls.toArray(new ServerAcl[0]); if (verbose) { for (int i = 0; i < aclDenyAlls.length; i++) { aclDenyAlls[i].setPrintWriter(new PrintWriter(System.out)); } } acls.clear(); file = File.createTempFile("aclPermitLocalhost1", ".txt"); file.deleteOnExit(); pw = new PrintWriter(new FileWriter(file)); pw.println("# Permit Localhost test ACL\n"); pw.println("permit 127.0.0.1"); pw.close(); acls.add(new ServerAcl(file)); file = File.createTempFile("aclPermitLocalhost2", ".txt"); file.deleteOnExit(); pw = new PrintWriter(new FileWriter(file)); pw.println("# Permit Localhost test ACL\n"); pw.println("permit 127.0.0.1/32"); pw.close(); acls.add(new ServerAcl(file)); aclPermitLocalhosts = (ServerAcl[]) acls.toArray(new ServerAcl[0]); if (verbose) { for (int i = 0; i < aclPermitLocalhosts.length; i++) { aclPermitLocalhosts[i].setPrintWriter( new PrintWriter(System.out)); } } acls.clear(); file = File.createTempFile("aclPermitLocalNet1", ".txt"); file.deleteOnExit(); pw = new PrintWriter(new FileWriter(file)); pw.println("# Permit Local Net test ACL\n"); pw.println("permit 127.0.0.0/24"); pw.close(); acls.add(new ServerAcl(file)); aclPermitLocalNets = (ServerAcl[]) acls.toArray(new ServerAcl[0]); if (verbose) { for (int i = 0; i < aclPermitLocalNets.length; i++) { aclPermitLocalNets[i].setPrintWriter( new PrintWriter(System.out)); } } acls.clear(); file = File.createTempFile("aclDenyLocalNet1", ".txt"); file.deleteOnExit(); pw = new PrintWriter(new FileWriter(file)); pw.println("# Deny Local Net test ACL\n"); pw.println("deny 127.0.0.0/24"); pw.println("allow 0.0.0.0/0"); pw.close(); acls.add(new ServerAcl(file)); aclDenyLocalNets = (ServerAcl[]) acls.toArray(new ServerAcl[0]); if (verbose) { for (int i = 0; i < aclDenyLocalNets.length; i++) { aclDenyLocalNets[i].setPrintWriter( new PrintWriter(System.out)); } } acls.clear(); file = File.createTempFile("aclDenyLocalhost1", ".txt"); file.deleteOnExit(); pw = new PrintWriter(new FileWriter(file)); pw.println("# Deny Localhost test ACL\n"); pw.println("deny 127.0.0.1/32"); pw.println("allow 0.0.0.0/0"); pw.close(); acls.add(new ServerAcl(file)); aclDenyLocalhosts = (ServerAcl[]) acls.toArray(new ServerAcl[0]); if (verbose) { for (int i = 0; i < aclDenyLocalhosts.length; i++) { aclDenyLocalhosts[i].setPrintWriter( new PrintWriter(System.out)); } } acls.clear(); file = File.createTempFile("aclPermitAll1", ".txt"); file.deleteOnExit(); pw = new PrintWriter(new FileWriter(file)); pw.println("# Permit all test ACL\n"); pw.println("permit 0.0.0.0/0"); pw.close(); acls.add(new ServerAcl(file)); aclPermitAlls = (ServerAcl[]) acls.toArray(new ServerAcl[0]); if (verbose) { for (int i = 0; i < aclPermitAlls.length; i++) { aclPermitAlls[i].setPrintWriter(new PrintWriter(System.out)); } } } /** * This method allows to easily run this unit test independent of the other * unit tests, and without dealing with Ant or unrelated test suites. */ public static void main(String[] sa) { junit.textui.TestRunner runner = new junit.textui.TestRunner(); junit.framework.TestResult result = runner.run(runner.getTest(TestAcl.class.getName())); System.exit(result.wasSuccessful() ? 0 : 1); } public void testDefaultWithNames() { assertFalse("Permitting access from localhost with default ACL", aclDefault.permitAccess(localhostByName.getAddress())); } public void testDefaultWithIPs() { assertFalse("Permitting access from localhost with default ACL", aclDefault.permitAccess(localhostByAddr.getAddress())); assertFalse("Permitting access from other host with default ACL", aclDefault.permitAccess(otherHostByAddr.getAddress())); } public void testDenyAllWithNames() { ServerAcl acl; for (int i = 0; i < aclDenyAlls.length; i++) { acl = (ServerAcl) aclDenyAlls[i]; assertFalse("Permitting access from localhost with deny-all ACL", acl.permitAccess(localhostByName.getAddress())); } } public void testDenyAllWithIPs() { ServerAcl acl; for (int i = 0; i < aclDenyAlls.length; i++) { acl = (ServerAcl) aclDenyAlls[i]; assertFalse("Permitting access from localhost with deny-all ACL", acl.permitAccess(localhostByAddr.getAddress())); assertFalse("Permitting access from other host with deny-all ACL", acl.permitAccess(otherHostByAddr.getAddress())); } } public void testLocalhostOnlyWithNames() { ServerAcl acl; for (int i = 0; i < aclPermitLocalhosts.length; i++) { acl = (ServerAcl) aclPermitLocalhosts[i]; assertTrue( "Denying access from localhost with localhost-permit ACL", acl.permitAccess(localhostByName.getAddress())); } } public void testLocalhostOnlyWithIPs() { ServerAcl acl; for (int i = 0; i < aclPermitLocalhosts.length; i++) { acl = (ServerAcl) aclPermitLocalhosts[i]; assertTrue( "Denying access from localhost with localhost-permit ACL", acl.permitAccess(localhostByAddr.getAddress())); assertFalse( "Permitting access from other host with localhost-permit ACL", acl.permitAccess(otherHostByAddr.getAddress())); } } public void testNoLocalhostOnlyWithNames() { ServerAcl acl; for (int i = 0; i < aclDenyLocalhosts.length; i++) { acl = (ServerAcl) aclDenyLocalhosts[i]; assertFalse( "Permitting access from localhost with localhost-deny ACL", acl.permitAccess(localhostByName.getAddress())); } } public void testNoLocalhostOnlyWithIPs() { ServerAcl acl; for (int i = 0; i < aclDenyLocalhosts.length; i++) { acl = (ServerAcl) aclDenyLocalhosts[i]; assertFalse( "Permitting access from localhost with localhost-deny ACL", acl.permitAccess(localhostByAddr.getAddress())); assertTrue( "Denying access from other host with localhost-deny ACL", acl.permitAccess(otherHostByAddr.getAddress())); } } public void testLocalNetOnlyWithNames() { ServerAcl acl; for (int i = 0; i < aclPermitLocalNets.length; i++) { acl = (ServerAcl) aclPermitLocalNets[i]; assertTrue("Denying access from localNet with localNet-permit ACL", acl.permitAccess(localhostByName.getAddress())); } } public void testLocalNetOnlyWithIPs() { ServerAcl acl; for (int i = 0; i < aclPermitLocalNets.length; i++) { acl = (ServerAcl) aclPermitLocalNets[i]; assertTrue("Denying access from localNet with localNet-permit ACL", acl.permitAccess(localhostByAddr.getAddress())); assertFalse( "Permitting access from other Net with localNet-permit ACL", acl.permitAccess(otherHostByAddr.getAddress())); } } public void testNoLocalNetOnlyWithNames() { ServerAcl acl; for (int i = 0; i < aclDenyLocalNets.length; i++) { acl = (ServerAcl) aclDenyLocalNets[i]; assertFalse( "Permitting access from localNet with localNet-deny ACL", acl.permitAccess(localhostByName.getAddress())); } } public void testNoLocalNetOnlyWithIPs() { ServerAcl acl; for (int i = 0; i < aclDenyLocalNets.length; i++) { acl = (ServerAcl) aclDenyLocalNets[i]; assertFalse( "Permitting access from localNet with localNet-deny ACL", acl.permitAccess(localhostByAddr.getAddress())); assertTrue("Denying access from other Net with localNet-deny ACL", acl.permitAccess(otherHostByAddr.getAddress())); } } public static Test suite() throws IOException, ServerAcl.AclFormatException { TestSuite newSuite = new TestSuite(); newSuite.addTest(new TestAcl("testDefaultWithNames")); newSuite.addTest(new TestAcl("testDefaultWithIPs")); newSuite.addTest(new TestAcl("testDenyAllWithNames")); newSuite.addTest(new TestAcl("testDenyAllWithIPs")); newSuite.addTest(new TestAcl("testLocalhostOnlyWithNames")); newSuite.addTest(new TestAcl("testLocalhostOnlyWithIPs")); newSuite.addTest(new TestAcl("testNoLocalhostOnlyWithNames")); newSuite.addTest(new TestAcl("testNoLocalhostOnlyWithIPs")); newSuite.addTest(new TestAcl("testLocalNetOnlyWithNames")); newSuite.addTest(new TestAcl("testLocalNetOnlyWithIPs")); newSuite.addTest(new TestAcl("testNoLocalNetOnlyWithNames")); newSuite.addTest(new TestAcl("testNoLocalNetOnlyWithIPs")); return newSuite; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestStressInsert.java0000644000175000017500000001514712007547410024100 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.util.Random; import org.hsqldb.jdbc.JDBCBlob; import java.util.Arrays; /** * Test with small cache and very large row inserts */ public class TestStressInsert { private Connection con; private PreparedStatement insertStmtA; private PreparedStatement insertStmtB; private static final int LOB_SIZE = 1024 * 1024; private static final int MAX_SIZE = 4000; private final Random random = new Random(0); byte[] data = getRandomBytes(LOB_SIZE); public void init() throws Exception { String driver = "org.hsqldb.jdbc.JDBCDriver"; String url = "jdbc:hsqldb:file:/hsql/stress/test"; // String url = "jdbc:hsqldb:hsql://localhost/test"; Class.forName(driver); con = DriverManager.getConnection(url, "sa", ""); con.setAutoCommit(true); // set cache sizes Statement stmt = con.createStatement(); try { stmt.execute("set files write delay 10000 millis"); stmt.execute("set files log size " + 200); stmt.execute("set files backup increment true"); DatabaseMetaData metaData = con.getMetaData(); ResultSet rs = metaData.getTables(null, null, "B", null); boolean schemaExists; try { schemaExists = rs.next(); } finally { rs.close(); } if (!schemaExists) { stmt.execute( "create cached table A (ID binary(16) PRIMARY KEY, DATA longvarbinary not null)"); stmt.execute( "create cached table B (ID binary(16) PRIMARY KEY, DATA BLOB(10M) not null)"); } stmt.execute("checkpoint"); } finally { stmt.close(); } // prepare statements insertStmtA = con.prepareStatement("insert into A (DATA, ID) values (?, ?)"); insertStmtB = con.prepareStatement("insert into B (DATA, ID) values (?, ?)"); } public void shutdown() throws Exception { insertStmtA.close(); insertStmtB.close(); Statement stmt = con.createStatement(); stmt.executeUpdate("SHUTDOWN"); con.close(); } public void insertA(byte[] id) throws Exception { try { int length = getRandomLength(LOB_SIZE); byte[] array = Arrays.copyOf(data, length); insertStmtA.setBytes(1, array); insertStmtA.setBytes(2, id); insertStmtA.execute(); } finally { insertStmtA.clearParameters(); insertStmtA.clearWarnings(); } } public void insertB(byte[] id) throws Exception { try { int length = getRandomLength(LOB_SIZE); byte[] array = Arrays.copyOf(data, length); insertStmtB.setBytes(1, array); insertStmtB.setBytes(2, id); insertStmtB.execute(); } finally { insertStmtB.clearParameters(); insertStmtB.clearWarnings(); } } private void stressInsertA() throws Exception { long t1 = System.currentTimeMillis(); long t2 = System.currentTimeMillis(); System.out.println("done " + (t2 - t1)); for (int i = 0; i < MAX_SIZE; i++) { insertA(getRandomBytes(16)); if (i % 100 == 0) { long t3 = System.currentTimeMillis(); System.out.println("inserted " + i + ", 100 in " + (t3 - t2)); t2 = t3; } } System.out.println("total inserted " + MAX_SIZE + " in " + (t2 - t1)); shutdown(); } private void stressInsertB() throws Exception { long t1 = System.currentTimeMillis(); long t2 = System.currentTimeMillis(); System.out.println("done " + (t2 - t1)); for (int i = 0; i < MAX_SIZE; i++) { insertB(getRandomBytes(16)); if (i % 100 == 0) { long t3 = System.currentTimeMillis(); System.out.println("inserted " + i + ", 100 in " + (t3 - t2)); t2 = t3; } } System.out.println("total inserted " + MAX_SIZE + " in " + (t2 - t1)); shutdown(); } private byte[] getRandomBytes(int length) { byte[] ret = new byte[length]; random.nextBytes(ret); return ret; } private int getRandomLength(int max) { int length = random.nextInt(max); return length; } public static void main(String[] args) { try { System.out.print("Initializing..."); TestStressInsert test = new TestStressInsert(); test.init(); test.stressInsertB(); } catch (Exception e) { e.printStackTrace(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestTextTables.java0000644000175000017500000001760312007547410023506 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class TestTextTables extends TestBase { static String url = "jdbc:hsqldb:file:/hsql/testtext/test;sql.enforce_strict_size=true"; public TestTextTables(String name) { super(name, url, false, false); } protected void setUp() { super.setUp(); } public void testSectionOne() throws Exception { TestUtil.deleteDatabase("/hsql/testtext/test"); TestUtil.delete("/hsql/testtext/t.txt"); TestUtil.delete("/hsql/testtext/tt.txt"); TestUtil.delete("/hsql/testtext/tident.txt"); TestUtil.delete("/hsql/testtext/tsingle.txt"); initDatabase(); partA(); partD(); } public void testSectionTwo() throws Exception { TestUtil.deleteDatabase("/hsql/testtext/test"); TestUtil.delete("/hsql/testtext/t.txt"); TestUtil.delete("/hsql/testtext/tt.txt"); TestUtil.delete("/hsql/testtext/tident.txt"); TestUtil.delete("/hsql/testtext/tsingle.txt"); initDatabase(); partB(); partD(); } public void testSectionThree() throws Exception { Connection conn = newConnection(); Statement st = conn.createStatement(); st.execute("SHUTDOWN SCRIPT"); } public void testSectionFour() throws Exception { partD(); Connection conn = newConnection(); Statement st = conn.createStatement(); st.execute("SHUTDOWN"); } public void testSectionFive() throws Exception { Connection conn = newConnection(); PreparedStatement ps = conn.prepareStatement("insert into tident (c2) values ?"); for (int i = 0; i < 20; i++) { ps.setString(1, String.valueOf(i)); ps.executeUpdate(); } ps.close(); ps = conn.prepareStatement("insert into tsingle (c1) values ?"); for (int i = 0; i < 20; i++) { ps.setInt(1, i + 7); ps.executeUpdate(); } ps.close(); Statement st = conn.createStatement(); st.execute("SHUTDOWN IMMEDIATELY"); partD(); conn = newConnection(); st = conn.createStatement(); st.execute("insert into tident values default, 'dont know'"); int count = st.executeUpdate("update tident set c2 = c2 || ' '"); assertEquals("identity table count mismatch", 21, count); ResultSet rs = st.executeQuery("select count(*) from tsingle"); assertTrue(rs.next()); assertEquals(20, rs.getInt(1)); st.execute("set table tsingle read only"); st.execute("SHUTDOWN SCRIPT"); conn = newConnection(); st = conn.createStatement(); st.execute("SHUTDOWN SCRIPT"); } public void testSectionSix() throws Exception { Connection conn = newConnection(); Statement st = conn.createStatement(); st.execute("set table tsingle read write"); st.execute("SHUTDOWN SCRIPT"); conn = newConnection(); st = conn.createStatement(); st.execute("create memory table tmsingle (c1 int primary key)"); st.execute("truncate table tident restart identity"); st.execute("truncate table tsingle restart identity"); ResultSet rs = st.executeQuery("select count(*) from tident"); assertTrue(rs.next()); assertEquals(0, rs.getInt(1)); st.execute("set table tident source off"); st.execute("set table tsingle source off"); st.execute("alter table tsingle add unique(c1)"); st.execute("alter table tident add foreign key (c1) references tmsingle(c1)"); st.execute("set table tident source on"); st.execute("set table tsingle source on"); rs = st.executeQuery("select count(*) from tmsingle"); assertTrue(rs.next()); assertEquals(0, rs.getInt(1)); rs = st.executeQuery("select count(*) from tident"); assertTrue(rs.next()); assertEquals(0, rs.getInt(1)); PreparedStatement ps = conn.prepareStatement("insert into tmsingle(c1) values ?"); for (int i = 0; i < 20; i++) { ps.setInt(1, i); ps.executeUpdate(); } ps.close(); ps = conn.prepareStatement("insert into tident (c1, c2) values ?, ?"); for (int i = 0; i < 20; i++) { ps.setInt(1, i); ps.setString(2, String.valueOf(i)); ps.executeUpdate(); } ps.close(); st = conn.createStatement(); rs = st.executeQuery("select count(*) from tmsingle"); assertTrue(rs.next()); assertEquals(20, rs.getInt(1)); rs = st.executeQuery("select count(*) from tident"); assertTrue(rs.next()); assertEquals(20, rs.getInt(1)); st.execute("SHUTDOWN SCRIPT"); conn = newConnection(); st = conn.createStatement(); rs = st.executeQuery("select count(*) from tmsingle"); assertTrue(rs.next()); assertEquals(20, rs.getInt(1)); rs = st.executeQuery("select count(*) from tident"); assertTrue(rs.next()); assertEquals(20, rs.getInt(1)); conn = newConnection(); st = conn.createStatement(); st.execute("SHUTDOWN"); } void initDatabase() throws Exception { Connection conn = newConnection(); Statement st = conn.createStatement(); st.execute("set files write delay 0"); st.execute("set database transaction control locks"); } void partA() throws Exception { Connection conn = newConnection(); TestUtil.testScript(conn, "testrun/hsqldb/TestText01.txt"); Statement st = conn.createStatement(); st.execute("SHUTDOWN"); } void partB() throws Exception { Connection conn = newConnection(); TestUtil.testScript(conn, "testrun/hsqldb/TestText01.txt"); Statement st = conn.createStatement(); st.execute("SHUTDOWN IMMEDIATELY"); } void partD() throws Exception { Connection conn = newConnection(); TestUtil.testScript(conn, "testrun/hsqldb/TestText02.txt"); Statement st = conn.createStatement(); st.execute("SHUTDOWN"); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/HsqldbTestCase.java0000644000175000017500000001326312007547406023443 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.File; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.util.Properties; /** * Description : HsqldbTestCase * *

                  Society : dataXpresso * @since 8 august 2006 * @author Julien Blaize */ public class HsqldbTestCase { /** * Deletes all files and subdirectories under dir. * Returns true if all deletions were successful. * If a deletion fails, the method stops attempting to delete and returns false. */ public static boolean deleteDir(File dir) { if (dir.isDirectory()) { String[] children = dir.list(); for (int i = 0; i < children.length; i++) { boolean success = deleteDir(new File(dir, children[i])); if (!success) { return false; } } } // The directory is now empty so delete it return dir.delete(); } public static void main(String[] args) { Properties props = new Properties(); props.put("user", "sa"); props.put("password", ""); props.put("hsqldb.default_table_type", "cached"); //props.put("hsqldb.cache_size_scale", "12"); props.put("hsqldb.cache_scale", "8"); //props.put("hsqldb.cache_file_scale", "8"); props.put("hsqldb.applog", "0"); props.put("hsqldb.log_size", "200"); props.put("hsqldb.result_memory_rows", "10"); props.put("shutdown", "true"); String url = "jdbc:hsqldb:"; url += "/hsql/statBase/test"; //delete earlier files HsqldbTestCase.deleteDir(new File("/hsql/statBase/")); try { Class clsDriver = Class.forName("org.hsqldb.jdbc.JDBCDriver"); Driver driver = (Driver) clsDriver.newInstance(); DriverManager.registerDriver(driver); Connection con = DriverManager.getConnection(url, props); String createQuery = "drop table test1 if exists;create table test1 (rowNum identity, col1 varchar(50), col2 int, col3 varchar(50))"; Statement st = con.createStatement(); st.execute(createQuery); st.close(); //we try to insert values in batch String insertQuery = "insert into test1 (col1,col2,col3) values (?,?,?)"; PreparedStatement pst = con.prepareStatement(insertQuery); //we insert 1001 for (int i = 0; i < 1001; i++) { pst.setString(1, "string_" + i); pst.setInt(2, i); pst.setString(3, "string2_" + i); pst.addBatch(); if ((i > 0) && (i % 100 == 0)) { pst.executeBatch(); } } pst.close(); //we try to do a select on this statement and to scroll it with the absolute method String selectQuery = "select * from test1"; st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet scrollableSet = st.executeQuery(selectQuery); scrollableSet.setFetchSize(100); scrollableSet.next(); int tmpIndex = scrollableSet.getInt(3); if (tmpIndex != 0) { System.out.println("index at 0 is !=0"); } //we go from 0 to 1000 with absolute and a gap of 100 for (int i = 0; i <= 1000; i += 100) { scrollableSet.absolute(i + 1); tmpIndex = scrollableSet.getInt(3); System.out.println(tmpIndex); } //we go from 1000 to 0 with absolute and a gap of 100 for (int i = 1000; i > 0; i -= 100) { scrollableSet.relative(-100); tmpIndex = scrollableSet.getInt(3); System.out.println(tmpIndex); } } catch (Exception ex) { ex.printStackTrace(System.out); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestHarness.java0000644000175000017500000002022412007547410023023 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Filename: TestHarness.java * Created on May 18, 2005 * Author: Carl Gould * Copyright Calmetrics 2005 * Project: HSQLDB_Test */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; /** * Describe this class * * @author Carl */ public class TestHarness extends JFrame { protected String dbURL; protected JTextArea textArea; public static void main(String[] args) { if (args.length == 0) { args = new String[]{ "testrecovery" }; } try { Class.forName("org.hsqldb.jdbc.JDBCDriver").newInstance(); } catch (Exception e) { System.out.println("ERROR: failed to load HSQLDB JDBC driver."); e.printStackTrace(); return; } new TestHarness("jdbc:hsqldb:file:" + args[0]); } public TestHarness(String url) { super("HSQLDB Test Harness"); this.dbURL = url; setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { doClose(); } }); initComponents(); setSize(400, 400); setLocation(200, 200); setVisible(true); try { Connection c = getConnection("sa", "password", true); textArea.setText("Database already exists."); c.close(); } catch (SQLException e1) { doCreate(); } } protected void initComponents() { Container main = getContentPane(); textArea = new JTextArea(); JPanel buttons = new JPanel(new FlowLayout()); JButton close = new JButton("Close Gracefully"); close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doClose(); } }); JButton create = new JButton("Add Row"); create.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doInsert(); } }); JButton list = new JButton("List Data"); list.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doListing(); } }); JButton kill = new JButton("Kill"); kill.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); buttons.add(create); buttons.add(list); buttons.add(kill); buttons.add(close); main.add(new JScrollPane(textArea), BorderLayout.CENTER); main.add(buttons, BorderLayout.SOUTH); } protected void doInsert() { try { Connection con = getConnection("ABCD", "dcba", false); if (con != null) { Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT NEXT VALUE FOR MySeq FROM Dummy"); rs.next(); int id = rs.getInt(1); stmt.executeUpdate("INSERT INTO MyTable (Id, Name) VALUES (" + id + ", 'This is row #" + id + "')"); append("Row #" + id + " added"); stmt.close(); con.close(); } } catch (SQLException e) { e.printStackTrace(); } } protected void doListing() { try { Connection con = getConnection("ABCD", "dcba", false); if (con != null) { Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT * FROM MyTable ORDER BY Id ASC"); append("Listing 'MyTable'...."); while (rs.next()) { append(" " + rs.getString(1) + ", " + rs.getString(2)); } append("...done."); stmt.close(); con.close(); } } catch (SQLException e) { e.printStackTrace(); } } private void append(String s) { textArea.setText(textArea.getText() + "\n" + s); } protected void doClose() { try { Connection con = getConnection("sa", "password", false); if (con != null) { Statement stmt = con.createStatement(); stmt.execute("SHUTDOWN"); stmt.close(); con.close(); } } catch (SQLException e) { e.printStackTrace(); } System.exit(0); } protected void doCreate() { try { Connection con = getConnection("sa", "", false); if (con != null) { Statement stmt = con.createStatement(); stmt.execute("SET PASSWORD 'password'"); stmt.execute("CREATE USER abcd PASSWORD 'dcba'"); stmt.execute("CREATE SEQUENCE MySeq"); stmt.execute( "CREATE TABLE MyTable (Id INT PRIMARY KEY, Name VARCHAR(100) NOT NULL)"); stmt.execute("CREATE TABLE Dummy (Blah VARCHAR(100) NOT NULL)"); stmt.execute( "INSERT INTO Dummy (Blah) VALUES ('dummy value')"); stmt.execute("GRANT ALL ON MyTable TO abcd"); stmt.execute("GRANT ALL ON Dummy TO abcd"); stmt.execute("GRANT ALL ON SEQUENCE MySeq TO abcd"); stmt.close(); con.close(); textArea.setText("Database created."); } } catch (SQLException e) { e.printStackTrace(); } } protected Connection getConnection(String username, String password, boolean ifExists) throws SQLException { Properties props = new Properties(); props.put("user", username); props.put("password", password); props.put("ifexists", String.valueOf(ifExists)); return DriverManager.getConnection(dbURL, props); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestLibSpeed.java0000644000175000017500000001734512007547410023121 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import org.hsqldb.lib.DoubleIntIndex; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.IntKeyHashMap; import org.hsqldb.lib.IntKeyIntValueHashMap; import org.hsqldb.lib.IntValueHashMap; import org.hsqldb.lib.StopWatch; /** * @author Fred Toussi (fredt@users dot sourceforge.net) */ public class TestLibSpeed { static final String[][] sNumeric = { { "ABS", "org.hsqldb.Library.abs" }, { "ACOS", "java.lang.Math.acos" }, { "ASIN", "java.lang.Math.asin" }, { "ATAN", "java.lang.Math.atan" }, { "ATAN2", "java.lang.Math.atan2" }, { "CEILING", "java.lang.Math.ceil" }, { "COS", "java.lang.Math.cos" }, { "COT", "org.hsqldb.Library.cot" }, { "DEGREES", "java.lang.Math.toDegrees" }, { "EXP", "java.lang.Math.exp" }, { "FLOOR", "java.lang.Math.floor" }, { "LOG", "java.lang.Math.log" }, { "LOG10", "org.hsqldb.Library.log10" }, { "MOD", "org.hsqldb.Library.mod" }, { "PI", "org.hsqldb.Library.pi" }, { "POWER", "java.lang.Math.pow" }, { "RADIANS", "java.lang.Math.toRadians" }, { "RAND", "java.lang.Math.random" }, { "ROUND", "org.hsqldb.Library.round" }, { "SIGN", "org.hsqldb.Library.sign" }, { "SIN", "java.lang.Math.sin" }, { "SQRT", "java.lang.Math.sqrt" }, { "TAN", "java.lang.Math.tan" }, { "TRUNCATE", "org.hsqldb.Library.truncate" }, { "BITAND", "org.hsqldb.Library.bitand" }, { "BITOR", "org.hsqldb.Library.bitor" }, { "ROUNDMAGIC", "org.hsqldb.Library.roundMagic" } }; static HashSet hashSet = new HashSet(); static DoubleIntIndex doubleIntLookup = new DoubleIntIndex(sNumeric.length, false); static IntKeyIntValueHashMap intKeyIntValueHashLookup = new IntKeyIntValueHashMap(); static IntValueHashMap intValueHashLookup = new IntValueHashMap(sNumeric.length); static IntKeyHashMap intKeyHashLookup = new IntKeyHashMap(); static { doubleIntLookup.setKeysSearchTarget(); java.util.Random randomgen = new java.util.Random(); int[] row = new int[2]; for (int i = 0; i < sNumeric.length; i++) { hashSet.add(sNumeric[i][0]); intKeyIntValueHashLookup.put(randomgen.nextInt(sNumeric.length), i); intKeyHashLookup.put(i, new Integer(i)); doubleIntLookup.add(randomgen.nextInt(sNumeric.length), i); intValueHashLookup.put(sNumeric[i][0], randomgen.nextInt(sNumeric.length)); } } static int count = 100000; public TestLibSpeed() { java.util.Random randomgen = new java.util.Random(); StopWatch sw = new StopWatch(); int dummy = 0; System.out.println("set lookup "); for (int k = 0; k < 3; k++) { sw.zero(); for (int j = 0; j < count; j++) { for (int i = 0; i < sNumeric.length; i++) { int r = randomgen.nextInt(sNumeric.length); hashSet.contains(sNumeric[r][0]); dummy += r; } } System.out.println("HashSet contains " + sw.elapsedTime()); sw.zero(); for (int j = 0; j < count; j++) { for (int i = 0; i < sNumeric.length; i++) { int r = randomgen.nextInt(sNumeric.length); intKeyIntValueHashLookup.get(r, -1); dummy += r; } } System.out.println("IntKeyIntValueHashMap Lookup with array " + sw.elapsedTime()); sw.zero(); for (int j = 0; j < count; j++) { for (int i = 0; i < sNumeric.length; i++) { int r = randomgen.nextInt(sNumeric.length); intKeyHashLookup.get(r); dummy += r; } } System.out.println("IntKeyHashMap Lookup " + sw.elapsedTime()); sw.zero(); for (int j = 0; j < count; j++) { for (int i = 0; i < sNumeric.length; i++) { int r = randomgen.nextInt(sNumeric.length); doubleIntLookup.findFirstEqualKeyIndex(r); dummy += r; } } System.out.println("DoubleIntTable Lookup " + sw.elapsedTime()); sw.zero(); for (int j = 0; j < count; j++) { for (int i = 0; i < sNumeric.length; i++) { int r = randomgen.nextInt(sNumeric.length); intValueHashLookup.get(sNumeric[r][0], 0); dummy += r; } } System.out.println("IntKeyIntValueHashMap Lookup " + sw.elapsedTime()); sw.zero(); for (int j = 0; j < count; j++) { for (int i = 0; i < sNumeric.length; i++) { int r = randomgen.nextInt(sNumeric.length); dummy += r; } } System.out.println("emptyOp " + sw.elapsedTime()); sw.zero(); for (int j = 0; j < count; j++) { for (int i = 0; i < sNumeric.length; i++) { int r = randomgen.nextInt(sNumeric.length); doubleIntLookup.findFirstEqualKeyIndex(r); dummy += r; } } System.out.println("DoubleIntTable Lookup " + sw.elapsedTime()); sw.zero(); System.out.println("Object Cache Test " + sw.elapsedTime()); } } public static void main(String[] argv) { TestLibSpeed ls = new TestLibSpeed(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestTypeConversion.java0000644000175000017500000001436512007547410024420 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.sql.Array; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestTypeConversion extends TestBase { Connection connection; Statement statement; public TestTypeConversion(String name) { super(name); // super(name, "jdbc:hsqldb:file:test3", false, false); // super(name, "jdbc:hsqldb:mem:test3", false, false); } protected void setUp() { super.setUp(); try { connection = super.newConnection(); statement = connection.createStatement(); } catch (Exception e) { System.out.println(e); } } public void testStreams() { try { String ddl0 = "DROP TABLE BSTREAM IF EXISTS"; String ddl1 = "CREATE TABLE BSTREAM(A INT IDENTITY PRIMARY KEY, B VARBINARY(20))"; statement.execute(ddl0); statement.execute(ddl1); } catch (SQLException e) { e.printStackTrace(); fail("ddl failure"); } try { String dml0 = "insert into bstream values(default, ?)"; String dql0 = "select * from bstream where a = ?"; PreparedStatement ps1 = connection.prepareStatement(dml0); PreparedStatement ps2 = connection.prepareStatement(dql0); byte[] data = new byte[] { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 }; InputStream is = new ByteArrayInputStream(data); ps1.setBinaryStream(1, is); ps1.execute(); ps1.setObject(1, data); ps1.execute(); ps2.setInt(1, 1); ResultSet rs = ps2.executeQuery(); rs.next(); InputStream isr = rs.getBinaryStream(2); for(int i =0; i < data.length ; i++) { int val = isr.read(); assertTrue(val == data[i]); } } catch (Exception e) { e.printStackTrace(); fail("dml failure"); } } public void testBitA() { try { String ddl0 = "DROP TABLE BITTEST IF EXISTS"; String ddl1 = "CREATE TABLE BITTEST(BITA BIT(1), BITB BIT(2), " + "BITVA BIT VARYING(1), BITVB BIT VARYING(2), ID IDENTITY)"; statement.execute(ddl0); statement.execute(ddl1); } catch (SQLException e) { e.printStackTrace(); fail("ddl failure"); } try { String dml0 = "insert into bittest values(?, ?, ?, ?, default)"; String dql0 = "select * from bittest;"; PreparedStatement ps = connection.prepareStatement(dml0); byte[] data = new byte[]{ -0x80 }; ps.setBoolean(1, true); ps.setBytes(2, data); ps.setBytes(3, data); ps.setBytes(4, data); ps.executeUpdate(); // data = new byte[]{ 0 }; ps.setBoolean(1, false); ps.setBytes(2, data); ps.setBytes(3, data); ps.setBytes(4, data); ps.executeUpdate(); ps.close(); ps = connection.prepareStatement(dql0); ResultSet rs = ps.executeQuery(); rs.next(); boolean boole = rs.getBoolean(1); assertTrue(boole); boole = rs.getBoolean(1); assertTrue(boole); rs.next(); boole = rs.getBoolean(1); assertFalse(boole); boole = rs.getBoolean(1); assertFalse(boole); } catch (SQLException e) { e.printStackTrace(); fail("dml failure"); } } public void testArrayA() { try { String ddl0 = "DROP TABLE ARRAYTEST IF EXISTS"; String ddl1 = "CREATE TABLE ARRAYTEST(A INTEGER ARRAY)"; String dml1 = "INSERT INTO ARRAYTEST VALUES(ARRAY[0,0])"; String dml2 = "INSERT INTO ARRAYTEST VALUES ?"; statement.execute(ddl0); statement.execute(ddl1); statement.execute(dml1); PreparedStatement ps = connection.prepareStatement(dml2); Object[] objects = new Object [] { "1", 3, 9}; Array array = connection.createArrayOf("INTEGER", objects); ps.setArray(1, array); ps.execute(); } catch (SQLException e) { e.printStackTrace(); fail("array failure"); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestUtil.java0000644000175000017500000011742712007547410022351 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; import java.io.Reader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import org.hsqldb.lib.ArraySort; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.LineGroupReader; import org.hsqldb.lib.StopWatch; import org.hsqldb.lib.StringComparator; import org.hsqldb.lib.StringUtil; /** * Utility class providing methodes for submitting test statements or * scripts to the database, comparing the results returned with * the expected results. The test script format is compatible with existing * scripts. * * Script writers be aware that you can't use stderr to distinguish error * messages. This class writes error messages to stdout. * * @author Ewan Slater (ewanslater@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) */ public class TestUtil { /* * The executing scripts do have state. This class should be * redesigned with OOD. */ static private final SimpleDateFormat sdfYMDHMS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); static private boolean abortOnErr = false; static final private String TIMESTAMP_VAR_STR = "${timestamp}"; static final String LS = System.getProperty("line.separator", "\n"); public static void main(String[] argv) { StopWatch sw = new StopWatch(true); TestUtil.testScripts("testrun/hsqldb"); System.out.println(sw.currentElapsedTimeToMessage("Total time :")); } public static void deleteDatabase(String path) { FileUtil.deleteOrRenameDatabaseFiles(path); } static boolean delete(String file) { return new File(file).delete(); } public static void checkDatabaseFilesDeleted(String path) { File[] list = FileUtil.getDatabaseFileList(path); if (list.length != 0) { System.out.println("database files not deleted"); } } /** * Expand occurrences of "${timestamp}" in input to time stamps. */ static protected void expandStamps(StringBuffer sb) { int i = sb.indexOf(TIMESTAMP_VAR_STR); if (i < 1) { return; } String timestamp; synchronized (sdfYMDHMS) { timestamp = sdfYMDHMS.format(new java.util.Date()); } while (i > -1) { sb.replace(i, i + TIMESTAMP_VAR_STR.length(), timestamp); i = sb.indexOf(TIMESTAMP_VAR_STR); } } static void testScripts(String directory) { TestUtil.deleteDatabase("test1"); try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); // String url = "jdbc:hsqldb:test1;crypt_key=604a6105889da65326bf35790a923932;crypt_type=blowfish"; String url = "jdbc:hsqldb:test1;sql.enforce_strict_size=true"; String user = "sa"; String password = ""; Connection cConnection = null; String[] filelist; String absolute = new File(directory).getAbsolutePath(); filelist = new File(absolute).list(); ArraySort.sort((Object[]) filelist, 0, filelist.length, new StringComparator()); for (int i = 0; i < filelist.length; i++) { String fname = filelist[i]; if (fname.startsWith("TestSelf") && fname.endsWith(".txt")) { print("Openning DB"); cConnection = DriverManager.getConnection(url, user, password); testScript(cConnection, absolute + File.separator + fname); cConnection.close(); } } cConnection = DriverManager.getConnection(url, user, password); // cConnection.createStatement().execute("SHUTDOWN"); // TestUtil.deleteDatabase("test1"); // TestUtil.checkDatabaseFilesDeleted("test1"); } catch (Exception e) { e.printStackTrace(); print("TestUtil init error: " + e.toString()); } } static void testScript(Connection aConnection, String aPath) { /* * This is a legacy wrapper method which purposefully inherits the sins * of the original. * No indication is given to the invoker of even RuntimeExceptions. */ File file = new File(aPath); try { TestUtil.testScript(aConnection, file.getAbsolutePath(), new FileReader(file)); } catch (Exception e) { e.printStackTrace(); System.out.println("test script file error: " + e.toString()); } } /** * Runs a preformatted script.

                  * * Where a result set is required, each line in the script will * be interpreted as a seperate expected row in the ResultSet * returned by the query. Within each row, fields should be delimited * using either comma (the default), or a user defined delimiter * which should be specified in the System property TestUtilFieldDelimiter * @param aConnection Connection object for the database * @param sourceName Identifies the script which failed * @param inReader Source of commands to be tested */ public static void testScript(Connection aConnection, String sourceName, Reader inReader) throws SQLException, IOException { Statement statement = aConnection.createStatement(); LineNumberReader reader = new LineNumberReader(inReader); LineGroupReader sqlReader = new LineGroupReader(reader); int startLine = 0; System.out.println("Opened test script file: " + sourceName); /** * we read the lines from the start of one section of the script "/*" * until the start of the next section, collecting the lines in the * list. * When a new section starts, we pass the list of lines * to the test method to be processed. */ try { while (true) { HsqlArrayList section = sqlReader.getSection(); startLine = sqlReader.getStartLineNumber(); if (section.size() == 0) { break; } testSection(statement, section, sourceName, startLine); } statement.close(); // The following catch blocks are just to report the source location // of the failure. } catch (SQLException se) { System.out.println("Error encountered at command beginning at " + sourceName + ':' + startLine); throw se; } catch (RuntimeException re) { System.out.println("Error encountered at command beginning at " + sourceName + ':' + startLine); throw re; } System.out.println("Processed " + reader.getLineNumber() + " lines from " + sourceName); } /** Legacy wrapper */ static void test(Statement stat, String s, int line) { TestUtil.test(stat, s, null, line); } /** * Performs a preformatted statement or group of statements and throws * if the result does not match the expected one. * @param line start line in the script file for this test * @param stat Statement object used to access the database * @param sourceName Identifies the script which failed * @param s Contains the type, expected result and SQL for the test */ static void test(Statement stat, String s, String sourceName, int line) { //maintain the interface for this method HsqlArrayList section = new HsqlArrayList(); section.add(s); testSection(stat, section, sourceName, line); } /** * Method to save typing ;-) * This method does not distinguish between normal and error output. * * @param s String to be printed */ static void print(String s) { System.out.println(s); } /** * Takes a discrete section of the test script, contained in the * section vector, splits this into the expected result(s) and * submits the statement to the database, comparing the results * returned with the expected results. * If the actual result differs from that expected, or an * exception is thrown, then the appropriate message is printed. * @param stat Statement object used to access the database * @param section Vector of script lines containing a discrete * section of script (i.e. test type, expected results, * SQL for the statement). * @param line line of the script file where this section started */ private static void testSection(Statement stat, HsqlArrayList section, String scriptName, int line) { //create an appropriate instance of ParsedSection ParsedSection pSection = parsedSectionFactory(section); if (pSection == null) { //it was not possible to sucessfully parse the section System.out.println( "The section starting at " + scriptName + ':' + line + " could not be parsed, and so was not processed." + LS); return; } if (pSection instanceof IgnoreParsedSection) { System.out.println("At " + scriptName + ':' + line + ": " + pSection.getResultString()); return; } if (pSection instanceof DisplaySection || pSection instanceof WaitSection || pSection instanceof ProceedSection) { String s = pSection.getResultString(); if (s != null) { // May or may not want to report line number for these sections? System.out.println(pSection.getResultString()); } } if (pSection instanceof DisplaySection) { return; // Do not run test method for DisplaySections. } if (!pSection.test(stat)) { System.out.println("Section starting at " + scriptName + ':' + line + " returned an unexpected result: " + pSection); if (TestUtil.abortOnErr) { throw new TestRuntimeException(scriptName + ": " + line + "pSection"); } } } /** * Factory method to create appropriate parsed section class for the section * @param aSection Vector containing the section of script * @return a ParesedSection object */ private static ParsedSection parsedSectionFactory(HsqlArrayList aSection) { //type of the section char type = ' '; //section represented as an array of Strings, one for each significant //line in the section String[] rows = null; //read the first line of the Vector... String topLine = (String) aSection.get(0); //...and check it for the type... if (topLine.startsWith("/*")) { type = topLine.charAt(2); //if the type code is UPPERCASE and system property IgnoreCodeCase //has been set to true, make the type code lowercase if ((Character.isUpperCase(type)) && (Boolean.getBoolean("IgnoreCodeCase"))) { type = Character.toLowerCase(type); } //if the type code is invalid return null if (!ParsedSection.isValidCode(type)) { return null; } //...strip out the type declaration... topLine = topLine.substring(3); } //if, after stripping out the declaration from topLine, the length of topLine //is greater than 0, then keep the rest of the line, as the first row. //Otherwise it will be discarded, and the offset (between the array and the vector) //set to 1. int offset = 0; if (topLine.trim().length() > 0) { rows = new String[aSection.size()]; rows[0] = topLine; } else { rows = new String[aSection.size() - 1]; offset = 1; } //pull the rest of aSection into the rows array. for (int i = (1 - offset); i < rows.length; i++) { rows[i] = (String) aSection.get(i + offset); } //then pass this to the constructor for the ParsedSection class that //corresponds to the value of type switch (type) { case 'u' : return new UpdateParsedSection(rows); case 's' : return new SilentParsedSection(rows); case 'w' : return new WaitSection(rows); case 'p' : return new ProceedSection(rows); case 'r' : return new ResultSetParsedSection(rows); case 'o' : return new ResultSetOutputParsedSection(rows); case 'c' : return new CountParsedSection(rows); case 'd' : return new DisplaySection(rows); case 'e' : return new ExceptionParsedSection(rows); case ' ' : return new BlankParsedSection(rows); default : //if we arrive here, then we should have a valid code, //since we validated it earlier, so return an //IgnoreParsedSection object return new IgnoreParsedSection(rows, type); } } /** * This method should certainly be an instance method. * * Can't do that until make this entire class OO. */ public static void setAbortOnErr(boolean aoe) { abortOnErr = aoe; } static class TestRuntimeException extends RuntimeException { public TestRuntimeException(String s) { super(s); } public TestRuntimeException(Throwable t) { super(t); } public TestRuntimeException(String s, Throwable t) { super(s, t); } } } /** * Abstract inner class representing a parsed section of script. * The specific ParsedSections for each type of test should inherit from this. */ abstract class ParsedSection { static final String LS = System.getProperty("line.separator", "\n"); /** * Type of this test. * @see #isValidCode(char) for allowed values */ protected char type = ' '; /** error message for this section */ String message = null; /** contents of the section as an array of Strings, one for each line in the section. */ protected String[] lines = null; /** number of the last row containing results in sectionLines */ protected int resEndRow = 0; /** SQL query to be submitted to the database. */ protected String sqlString = null; /** * Constructor when the section's input lines do not need to be parsed * into SQL. */ protected ParsedSection() {} /** * Common constructor functions for this family. * @param aLines Array of the script lines containing the section of script. * database */ protected ParsedSection(String[] aLines) { lines = aLines; //read the lines array backwards to get out the SQL String //using a StringBuffer for efficency until we've got the whole String StringBuffer sqlBuff = new StringBuffer(); int endIndex = 0; int k = lines.length - 1; do { //check to see if the row contains the end of the result set if ((endIndex = lines[k].indexOf("*/")) != -1) { //then this is the end of the result set sqlBuff.insert(0, lines[k].substring(endIndex + 2)); lines[k] = lines[k].substring(0, endIndex); if (lines[k].length() == 0) { resEndRow = k - 1; } else { resEndRow = k; } break; } else { sqlBuff.insert(0, lines[k]); } k--; } while (k >= 0); //set sqlString value sqlString = sqlBuff.toString(); } /** * String representation of this ParsedSection * @return String representation of this ParsedSection */ public String toString() { StringBuffer b = new StringBuffer(); b.append(LS + "******" + LS); b.append("contents of lines array:" + LS); for (int i = 0; i < lines.length; i++) { if (lines[i].trim().length() > 0) { b.append("line ").append(i).append(": ").append( lines[i]).append(LS); } } b.append("Type: "); b.append(getType()).append(LS); b.append("SQL: ").append(getSql()).append(LS); b.append("results:").append(LS); b.append(getResultString()); //check to see if the message field has been populated if (getMessage() != null) { b.append("\nmessage:").append(LS); b.append(getMessage()); } b.append(LS + "******" + LS); return b.toString(); } /** * returns a String representation of the expected result for the test * @return The expected result(s) for the test */ protected abstract String getResultString(); /** * returns the error message for the section * * @return message */ protected String getMessage() { return message; } /** * returns the type of this section * @return type of this section */ protected char getType() { return type; } /** * returns the SQL statement for this section * @return SQL statement for this section */ protected String getSql() { return sqlString; } /** * performs the test contained in the section against the database. * @param aStatement Statement object * @return true if the result(s) are as expected, otherwise false */ protected boolean test(Statement aStatement) { try { aStatement.execute(getSql()); } catch (Exception x) { message = x.toString(); return false; } return true; } /** * Checks that the type code letter is valid * @param aCode Lower-cased type code to validate. * @return true if the type code is valid, otherwise false. */ protected static boolean isValidCode(char aCode) { /* Allowed values for test codes are: * (note that UPPERCASE codes, while valid are only processed if the * system property IgnoreCodeCase has been set to true) * * 'u' - update * 'c' - count * 'e' - exception * 'r' - results * 'w' - wait * 'p' - proceed * 's' - silent * 'd' - display (No reason to use upper-case). * ' ' - not a test */ switch (aCode) { case ' ' : case 'r' : case 'o' : case 'e' : case 'c' : case 'u' : case 's' : case 'd' : case 'w' : case 'p' : return true; } return false; } } /** Represents a ParsedSection for a ResultSet test */ class ResultSetParsedSection extends ParsedSection { private String delim = System.getProperty("TestUtilFieldDelimiter", ","); private String[] expectedRows = null; /** * constructs a new instance of ResultSetParsedSection, interpreting * the supplied results as one or more lines of delimited field values * @param lines String[] */ protected ResultSetParsedSection(String[] lines) { super(lines); type = 'r'; //now we'll populate the expectedResults array expectedRows = new String[(resEndRow + 1)]; for (int i = 0; i <= resEndRow; i++) { int skip = StringUtil.skipSpaces(lines[i], 0); expectedRows[i] = lines[i].substring(skip); } } protected String getResultString() { StringBuffer printVal = new StringBuffer(); for (int i = 0; i < getExpectedRows().length; i++) { printVal.append(getExpectedRows()[i]).append(LS); } return printVal.toString(); } protected boolean test(Statement aStatement) { try { try { //execute the SQL aStatement.execute(getSql()); } catch (SQLException s) { throw new Exception("Expected a ResultSet, but got the error: " + s.getMessage()); } //check that update count != -1 if (aStatement.getUpdateCount() != -1) { throw new Exception( "Expected a ResultSet, but got an update count of " + aStatement.getUpdateCount()); } //iterate over the ResultSet ResultSet results = aStatement.getResultSet(); int count = 0; while (results.next()) { if (count < getExpectedRows().length) { String[] expectedFields = StringUtil.split(getExpectedRows()[count], delim); //check that we have the number of columns expected... if (results.getMetaData().getColumnCount() == expectedFields.length) { //...and if so, check that the column values are as expected... int j = 0; for (int i = 0; i < expectedFields.length; i++) { j = i + 1; String actual = results.getString(j); //...including null values... if (actual == null) { //..then we have a null //...check to see if we were expecting it... if (!expectedFields[i].equalsIgnoreCase( "NULL")) { throw new Exception( "Expected row " + count + " of the ResultSet to contain:" + LS + getExpectedRows()[count] + LS + "but field " + j + " contained NULL"); } } else if (!actual.equals(expectedFields[i])) { //then the results are different throw new Exception( "Expected row " + (count + 1) + " of the ResultSet to contain:" + LS + getExpectedRows()[count] + LS + "but field " + j + " contained " + results.getString(j)); } } } else { //we have the wrong number of columns throw new Exception( "Expected the ResultSet to contain " + expectedFields.length + " fields, but it contained " + results.getMetaData().getColumnCount() + " fields."); } } count++; } //check that we got as many rows as expected if (count != getExpectedRows().length) { //we don't have the expected number of rows throw new Exception("Expected the ResultSet to contain " + getExpectedRows().length + " rows, but it contained " + count + " rows."); } } catch (Exception x) { message = x.toString(); return false; } return true; } private String[] getExpectedRows() { return expectedRows; } } /** Represents a ParsedSection for a ResultSet dump */ class ResultSetOutputParsedSection extends ParsedSection { private String delim = System.getProperty("TestUtilFieldDelimiter", ","); private String[] expectedRows = null; /** * constructs a new instance of ResultSetParsedSection, interpreting * the supplied results as one or more lines of delimited field values * @param lines String[] */ protected ResultSetOutputParsedSection(String[] lines) { super(lines); type = 'o'; } protected String getResultString() { return ""; } protected boolean test(Statement aStatement) { try { try { //execute the SQL aStatement.execute(getSql()); } catch (SQLException s) { throw new Exception("Expected a ResultSet, but got the error: " + s.getMessage()); } //check that update count != -1 if (aStatement.getUpdateCount() != -1) { throw new Exception( "Expected a ResultSet, but got an update count of " + aStatement.getUpdateCount()); } //iterate over the ResultSet ResultSet results = aStatement.getResultSet(); StringBuffer printVal = new StringBuffer(); while (results.next()) { for (int j = 0; j < results.getMetaData().getColumnCount(); j++) { if (j != 0) { printVal.append(','); } printVal.append(results.getString(j + 1)); } printVal.append(LS); } throw new Exception(printVal.toString()); } catch (Exception x) { message = x.toString(); return false; } } private String[] getExpectedRows() { return expectedRows; } } /** Represents a ParsedSection for an update test */ class UpdateParsedSection extends ParsedSection { //expected update count int countWeWant; protected UpdateParsedSection(String[] lines) { super(lines); type = 'u'; countWeWant = Integer.parseInt(lines[0]); } protected String getResultString() { return Integer.toString(getCountWeWant()); } private int getCountWeWant() { return countWeWant; } protected boolean test(Statement aStatement) { try { try { //execute the SQL aStatement.execute(getSql()); } catch (SQLException s) { throw new Exception("Expected an update count of " + getCountWeWant() + ", but got the error: " + s.getMessage()); } if (aStatement.getUpdateCount() != getCountWeWant()) { throw new Exception("Expected an update count of " + getCountWeWant() + ", but got an update count of " + aStatement.getUpdateCount() + "."); } } catch (Exception x) { message = x.toString(); return false; } return true; } } class WaitSection extends ParsedSection { /* Would love to have a setting to say whether multi-thread mode, * but the static design of TestUtil prevents that. * a W command will cause a non-threaded execution to wait forever. */ static private String W_SYNTAX_MSG = "Syntax of Wait commands:" + LS + " /*w 123*/ To Wait 123 milliseconds" + LS + " /*w false x*/ Wait until /*p*/ command in another script has executed" + LS + " /*w true x*/ Same, but the /*p*/ must not have executed yet"; /** Represents a ParsedSection for wait execution */ long sleepTime = -1; Waiter waiter = null; boolean enforceSequence = false; protected WaitSection(String[] inLines) { /* Can't user the super constructor, since it does funny things when * constructing the SQL Buffer, which we don't need. */ lines = inLines; int closeCmd = lines[0].indexOf("*/"); String cmd = lines[0].substring(0, closeCmd); lines[0] = lines[0].substring(closeCmd + 2).trim(); String trimmed = cmd.trim(); if (trimmed.indexOf('e') < 0 && trimmed.indexOf('E') < 0) { // Does not contain "true" or "false" sleepTime = Long.parseLong(trimmed); } else { try { // Would like to use String.split(), but don't know if Java 4 // is allowed here. // Until we can use Java 4, prohibit tabs as white space. int index = trimmed.indexOf(' '); if (index < 0) { throw new IllegalArgumentException(); } enforceSequence = Boolean.valueOf(trimmed.substring(0, index)).booleanValue(); waiter = Waiter.getWaiter(trimmed.substring(index).trim()); } catch (IllegalArgumentException ie) { throw new IllegalArgumentException(W_SYNTAX_MSG); } } type = 'w'; } protected String getResultString() { StringBuffer sb = new StringBuffer(); if (lines.length == 1 && lines[0].trim().length() < 1) { return null; } for (int i = 0; i < lines.length; i++) { if (i > 0) { sb.append(LS); } sb.append("+ " + lines[i]); } TestUtil.expandStamps(sb); return sb.toString().trim(); } protected boolean test(Statement aStatement) { if (waiter == null) { try { //System.err.println("Sleeping for " + sleepTime + " ms."); Thread.sleep(sleepTime); } catch (InterruptedException ie) { throw new RuntimeException("Test sleep interrupted", ie); } } else { waiter.waitFor(enforceSequence); } return true; } } class ProceedSection extends ParsedSection { /* See comment above for WaitSection */ static private String P_SYNTAX_MSG = "Syntax of Proceed commands:" + LS + " /*p false x*/ /*p*/ command in another script may Proceed" + LS + " /*p true x*/ Same, but the /*w*/ must be waiting when we execute /*p*/" ; /** Represents a ParsedSection for wait execution */ Waiter waiter = null; boolean enforceSequence = false; protected ProceedSection(String[] inLines) { /* Can't use the super constructor, since it does funny things when * constructing the SQL Buffer, which we don't need. */ lines = inLines; int closeCmd = lines[0].indexOf("*/"); String cmd = lines[0].substring(0, closeCmd); lines[0] = lines[0].substring(closeCmd + 2).trim(); String trimmed = cmd.trim(); try { // Would like to use String.split(), but don't know if Java 4 // is allowed here. // Until we can use Java 4, prohibit tabs as white space. int index = trimmed.indexOf(' '); if (index < 0) { throw new IllegalArgumentException(); } enforceSequence = Boolean.valueOf(trimmed.substring(0, index)).booleanValue(); waiter = Waiter.getWaiter(trimmed.substring(index).trim()); } catch (IllegalArgumentException ie) { throw new IllegalArgumentException(P_SYNTAX_MSG); } type = 'p'; } protected String getResultString() { StringBuffer sb = new StringBuffer(); if (lines.length == 1 && lines[0].trim().length() < 1) { return null; } for (int i = 0; i < lines.length; i++) { if (i > 0) { sb.append(LS); } sb.append("+ " + lines[i]); } TestUtil.expandStamps(sb); return sb.toString().trim(); } protected boolean test(Statement aStatement) { waiter.resume(enforceSequence); return true; } } /** Represents a ParsedSection for silent execution */ class SilentParsedSection extends ParsedSection { protected SilentParsedSection(String[] lines) { super(lines); type = 's'; } protected String getResultString() { return null; } protected boolean test(Statement aStatement) { try { aStatement.execute(getSql()); } catch (Exception x) {} return true; } } /** Represents a ParsedSection for a count test */ class CountParsedSection extends ParsedSection { //expected row count private int countWeWant; protected CountParsedSection(String[] lines) { super(lines); type = 'c'; countWeWant = Integer.parseInt(lines[0]); } protected String getResultString() { return Integer.toString(getCountWeWant()); } private int getCountWeWant() { return countWeWant; } protected boolean test(Statement aStatement) { try { //execute the SQL try { aStatement.execute(getSql()); } catch (SQLException s) { throw new Exception("Expected a ResultSet containing " + getCountWeWant() + " rows, but got the error: " + s.getMessage()); } //check that update count != -1 if (aStatement.getUpdateCount() != -1) { throw new Exception( "Expected a ResultSet, but got an update count of " + aStatement.getUpdateCount()); } //iterate over the ResultSet ResultSet results = aStatement.getResultSet(); int count = 0; while (results.next()) { count++; } //check that we got as many rows as expected if (count != getCountWeWant()) { //we don't have the expected number of rows throw new Exception("Expected the ResultSet to contain " + getCountWeWant() + " rows, but it contained " + count + " rows."); } } catch (Exception x) { message = x.toString(); return false; } return true; } } /** Represents a ParsedSection for an Exception test */ class ExceptionParsedSection extends ParsedSection { private String expectedState = null; private Throwable caught = null; protected ExceptionParsedSection(String[] lines) { super(lines); expectedState = lines[0].trim(); if (expectedState.length() < 1) { expectedState = null; } type = 'e'; } protected String getResultString() { return (caught == null) ? "Nothing thrown" : caught.toString(); } protected boolean test(Statement aStatement) { try { aStatement.execute(getSql()); } catch (SQLException sqlX) { caught = sqlX; if (expectedState == null || expectedState.equalsIgnoreCase(sqlX.getSQLState())) { return true; } message = "SQLState '" + sqlX.getSQLState() + "' : " + sqlX.toString() + " instead of '" + expectedState + "'"; } catch (Exception x) { caught = x; message = x.toString(); } return false; } } /** Represents a ParsedSection for a section with blank type */ class BlankParsedSection extends ParsedSection { protected BlankParsedSection(String[] lines) { super(lines); type = ' '; } protected String getResultString() { return message; } } /** Represents a ParsedSection that is to be ignored */ class IgnoreParsedSection extends ParsedSection { protected IgnoreParsedSection(String[] inLines, char aType) { /* Extremely ambiguous to use input parameter of same exact * variable name as the superclass member "lines". * Therefore, renaming to inLines. */ // Inefficient to parse this into SQL when we aren't going to use // it as SQL. Should probably just be removed to use the // super() constructor. super(inLines); type = aType; } protected String getResultString() { return "This section, of type '" + getType() + "' was ignored"; } } /** Represents a Section to be Displayed, not executed */ class DisplaySection extends ParsedSection { protected DisplaySection(String[] inLines) { /* Can't user the super constructor, since it does funny things when * constructing the SQL Buffer, which we don't need. */ lines = inLines; int firstSlash = lines[0].indexOf('/'); lines[0] = lines[0].substring(firstSlash + 1).trim(); } protected String getResultString() { StringBuffer sb = new StringBuffer(); if (lines.length == 1 && lines[0].trim().length() < 1) { return null; } for (int i = 0; i < lines.length; i++) { if (i > 0) { sb.append(LS); } sb.append("+ " + lines[i]); } TestUtil.expandStamps(sb); return sb.toString().trim(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestDatetimeSimple.java0000644000175000017500000002613612007547410024336 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; import java.util.TimeZone; import junit.framework.TestCase; /** * Date Test Case. */ public class TestDatetimeSimple extends TestCase { static String connectionURL = "jdbc:hsqldb:file:/hsql/tests/testdatetimesimple"; static { try { Class.forName("org.hsqldb.jdbcDriver"); } catch (ClassNotFoundException cnfe) { throw new RuntimeException( " failed. JDBC Driver class not in CLASSPATH"); } } public void testTimestampParam() throws SQLException { Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:db", "sa", ""); Statement stmt = c.createStatement(); stmt.execute("create table dual (c0 integer)"); stmt.executeUpdate("insert into dual values (2)"); ResultSet set = stmt.executeQuery( "select to_number(to_char((select current_timestamp + c0 day from dual), 'YYYYMMDD')) from dual"); if (set.next()) { System.out.println("stmt res=" + set.getInt(1)); } set.close(); PreparedStatement pstmt = c.prepareStatement( "select to_number(to_char((select ? + c0 day from dual), 'YYYYMMDD')) from dual"); pstmt.setTimestamp(1, new Timestamp(System.currentTimeMillis())); set = pstmt.executeQuery(); if (set.next()) { System.out.println("pstmt res=" + set.getInt(1)); } pstmt = c.prepareStatement( "select to_number(to_char((select ? - c0 day from dual), 'YYYYMMDD')) from dual"); pstmt.setTimestamp(1, new Timestamp(System.currentTimeMillis())); set = pstmt.executeQuery(); if (set.next()) { System.out.println("pstmt res=" + set.getInt(1)); } c.close(); } public void testSimple() throws SQLException { TestUtil.deleteDatabase("/hsql/tests/testdatetimesimple"); Connection conn = DriverManager.getConnection(connectionURL, "SA", ""); ResultSet rs; PreparedStatement ps; Statement st = conn.createStatement(); st.executeUpdate("SET TIME ZONE INTERVAL '-5:00' HOUR TO MINUTE"); st.executeUpdate("DROP TABLE t IF EXISTS"); st.executeUpdate("CREATE TABLE t(i int, d date)"); st.executeUpdate("INSERT INTO t VALUES(1, '2008-11-27')"); rs = st.executeQuery("SELECT d FROM t"); rs.next(); System.out.println("Object: " + rs.getObject("d") // + " ; Timestamp: " + rs.getTimestamp("d") // + " ; Date: " + rs.getDate("d") // + " ; String: " + rs.getString("d")); rs.close(); rs = st.executeQuery("SELECT count(*) c FROM t WHERE d = " + "'2008-11-27'"); rs.next(); System.out.println("Match? " + (rs.getInt("c") > 0)); st.executeUpdate("DELETE FROM t"); /* This is prohibited: st.executeUpdate("INSERT INTO t VALUES(2, '2008-11-27 0:00:00')"); Q: Do we want to prohibit this, even though we permit the same usage with PreparedStatement using a Timestamp, as follows? A: In the disallowed case, a String that is not a data string is used, while in the other case, a timestamp object is used. It follows the cast specification, which requires the String to be a valid date string, and allows casting from a TIMESTAMP object to DATE */ ps = conn.prepareStatement("INSERT INTO t VALUES(3, ?)"); ps.setTimestamp(1, java.sql.Timestamp.valueOf("2008-10-27 0:00:00")); ps.execute(); ps.close(); rs = st.executeQuery("SELECT d FROM t"); rs.next(); System.out.println("Object: " + rs.getObject("d") // + " ; Date: " + rs.getDate("d") // + " ; Timestamp: " + rs.getTimestamp("d") + // "; String: " + rs.getString("d")); rs.close(); rs = st.executeQuery("SELECT count(*) c FROM t WHERE d = " + "'2008-10-27'"); /* FRED: When the DATE value is inserted with a TIMESTAMP, * all matches using a date fail. The query here fails regardless * of what date I use. */ rs.next(); System.out.println("Match? " + (rs.getInt("c") > 0)); /** ******** TIMESTAMP COL BELOW ********* */ st.executeUpdate("DROP TABLE t2 IF EXISTS"); st.executeUpdate("CREATE TABLE t2(i int, ts timestamp)"); /* These all fail: st.executeUpdate("INSERT INTO t2 VALUES(1, '2008-11-27')"); st.executeUpdate("INSERT INTO t2 VALUES(1, timestamp '2008-11-27')"); in both cases, the string is not a valid timestamp string */ st.executeUpdate( "INSERT INTO t2 VALUES(1, timestamp '2008-11-27 12:30:00')"); st.executeUpdate("INSERT INTO t2 VALUES(1, '2008-11-27 12:30:00')"); /** FOLLOWING ALL WORK AS EXPECTED: */ ps = conn.prepareStatement("INSERT INTO t2 VALUES(2, ?)"); ps.setTimestamp(1, java.sql.Timestamp.valueOf("2008-10-27 0:00:00")); ps.execute(); ps.close(); rs = st.executeQuery("SELECT ts FROM t2"); rs.next(); System.out.println("Object: " + rs.getObject("ts") // + " ; Timestamp: " + rs.getTimestamp("ts") // + " ; Date: " + rs.getObject("ts") // + "; String: " + rs.getString("ts")); rs.close(); st.executeUpdate("SHUTDOWN"); conn.close(); } public void testValues() throws SQLException { TestUtil.deleteDatabase("/hsql/tests/testdatetimesimple"); Connection conn = DriverManager.getConnection(connectionURL, "SA", ""); ResultSet rs; PreparedStatement ps; String s; Object o; java.sql.Date d; java.sql.Timestamp ts; Statement st = conn.createStatement(); st.executeUpdate("SET TIME ZONE INTERVAL '-5:00' HOUR TO MINUTE"); st.executeUpdate("DROP TABLE t3 IF EXISTS"); st.executeUpdate("CREATE TABLE t3(d date)"); st.executeUpdate("INSERT INTO t3 VALUES('2008-11-27')"); rs = st.executeQuery("SELECT d FROM t3"); rs.next(); s = rs.getString("d"); o = rs.getObject("d"); d = rs.getDate("d"); ts = rs.getTimestamp("d"); System.out.println("2008-11-27 INSERTED" + "\n String: " + s + "\n Object: " + o + "\n Date: " + dump(d) + "\n Timestamp: " + dump(ts) + '\n'); rs.close(); st.executeUpdate("DROP TABLE ts IF EXISTS"); st.executeUpdate( "CREATE TABLE ts(id integer generated by default as identity (start with 1), ts timestamp, tsz timestamp with time zone)"); st.executeUpdate( "INSERT INTO ts VALUES DEFAULT, LOCALTIMESTAMP, CURRENT_TIMESTAMP"); rs = st.executeQuery("CALL CURRENT_DATE"); rs.next(); o = rs.getObject(1); d = rs.getDate(1); s = rs.getString(1); ts = rs.getTimestamp(1); System.out.println("CURRENT_DATE @" + new java.util.Date() + "\n String: " + s + "\n Object: " + o + "\n Date: " + dump(d) + "\n Timestamp: " + dump(ts) + '\n'); rs.close(); rs = st.executeQuery("CALL LOCALTIMESTAMP"); rs.next(); o = rs.getObject(1); s = rs.getString(1); ts = rs.getTimestamp(1); System.out.println("LOCALTIMESTAMP @" + new java.util.Date() + "\n String: " + s + "\n Object: " + o + "\n Timestamp: " + dump(ts) + '\n'); rs.close(); rs = st.executeQuery("CALL CURRENT_TIMESTAMP"); rs.next(); s = rs.getString(1); o = rs.getObject(1); ts = rs.getTimestamp(1); System.out.println("CURRENT_TIMESTAMP @" + new java.util.Date() + "\n String: " + s + "\n Object: " + o + "\n Timestamp: " + dump(ts) + '\n'); rs.close(); st.executeUpdate("SHUTDOWN"); conn.close(); } public static String dump(java.sql.Timestamp t) { return "String (" + t.toString() + "), GMTString (" + t.toGMTString() + "), LocalString (" + t.toLocaleString() + ')'; } public static String dump(java.sql.Date d) { return "String (" + d.toString() + "), GMTString (" + d.toGMTString() + "), LocalString (" + d.toLocaleString() + ')'; } public static void main(String[] argv) { TestDatetimeSimple testA = new TestDatetimeSimple(); String[] zones = { "GMT-05:00" }; try { for (int i = 0; i < zones.length; i++) { TimeZone timeZone = TimeZone.getTimeZone(zones[i]); TimeZone.setDefault(timeZone); testA.testSimple(); testA.testValues(); } } catch (SQLException e) { e.printStackTrace(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TriggerClass.java0000644000175000017500000000447312007547410023161 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import org.hsqldb.Trigger; import org.hsqldb.jdbc.JDBCArrayBasic; import org.hsqldb.types.Type; public class TriggerClass implements Trigger { static int callCount; static int[] callCounts = new int[12]; public void fire(int type, String trigName, String tabName, Object[] oldRow, Object[] newRow) { callCounts[type]++; callCount++; } public static java.sql.Array authenticateFalse(String database, String user, String password) { throw new RuntimeException("bad user"); } public static java.sql.Array authenticate( String database, String user, String password) { return new JDBCArrayBasic(new String[] { "DBA" }, Type.SQL_VARCHAR); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestJavaFunctions.java0000644000175000017500000001533412007547406024205 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.math.BigInteger; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.hsqldb.jdbc.JDBCConnection; import org.hsqldb.jdbc.JDBCResultSet; import org.hsqldb.navigator.RowSetNavigator; import org.hsqldb.navigator.RowSetNavigatorClient; import org.hsqldb.result.Result; import org.hsqldb.result.ResultMetaData; import org.hsqldb.types.BinaryData; import org.hsqldb.types.Type; public class TestJavaFunctions extends TestBase { public TestJavaFunctions() { super("TestJavaFunction", "jdbc:hsqldb:file:test3", false, false); } protected void setUp() { super.setUp(); try { prepareDatabase(); } catch (Exception e) { e.printStackTrace(); } } void prepareDatabase() throws SQLException { Connection c = newConnection(); Statement s = c.createStatement(); s.executeUpdate("DROP FUNCTION TEST_QUERY IF EXISTS"); s.executeUpdate("DROP FUNCTION TEST_CUSTOM_RESULT IF EXISTS"); s.executeUpdate("DROP TABLE T IF EXISTS"); s.executeUpdate("CREATE TABLE T(C VARCHAR(20), I INT)"); s.executeUpdate("INSERT INTO T VALUES 'Thames', 10"); s.executeUpdate("INSERT INTO T VALUES 'Fleet', 12"); s.executeUpdate("INSERT INTO T VALUES 'Brent', 14"); s.executeUpdate("INSERT INTO T VALUES 'Westbourne', 16"); s.executeUpdate( "CREATE FUNCTION TEST_QUERY(INT) RETURNS TABLE(N VARCHAR(20), I INT) " + " READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.TestJavaFunctions.getQueryResult'"); s.executeUpdate( "CREATE FUNCTION TEST_CUSTOM_RESULT(BIGINT, BIGINT) RETURNS TABLE(I BIGINT, N VARBINARY(1000)) " + " READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.TestJavaFunctions.getCustomResult'"); s.executeUpdate("CHECKPOINT"); c.close(); } public void testOne() throws SQLException { Connection c = newConnection(); CallableStatement s = c.prepareCall("CALL TEST_QUERY(16)"); s.execute(); ResultSet r = s.getResultSet(); while (r.next()) { String temp = "" + r.getInt(2) + " " + r.getString(1); System.out.println(temp); } s = c.prepareCall("CALL TEST_CUSTOM_RESULT(6, 19)"); s.execute(); r = s.getResultSet(); while (r.next()) { String temp = "" + r.getLong(1) + " " + org.hsqldb.lib.StringConverter.byteArrayToSQLHexString( r.getBytes(2)); System.out.println(temp); } r = s.executeQuery(); s = c.prepareCall("CALL TEST_CUSTOM_RESULT(6, 1900)"); try { s.execute(); r = s.getResultSet(); fail("exception not thrown"); } catch (SQLException e) { System.out.println(e.getMessage()); } c.close(); } public static void main(String[] args) throws SQLException {} public static ResultSet getQueryResult(Connection connection, int i) throws SQLException { Statement st = connection.createStatement(); return st.executeQuery("SELECT * FROM T WHERE I < " + i); } public static ResultSet getQueryResult(Connection connection, String p1) throws SQLException { return getQueryResult(connection, 13); } public static ResultSet getQueryResult(Connection connection, String p1, String p2) throws SQLException { return getQueryResult(connection, 20); } private static Result newTwoColumnResult() { Type[] types = new Type[2]; types[0] = Type.SQL_BIGINT; types[1] = Type.SQL_VARBINARY_DEFAULT; ResultMetaData meta = ResultMetaData.newSimpleResultMetaData(types); RowSetNavigator navigator = new RowSetNavigatorClient(); Result result = Result.newDataResult(meta); result.setNavigator(navigator); return result; } public static ResultSet getCustomResult(Connection connection, long start, long end) throws SQLException { Result result = newTwoColumnResult(); if (end < start) { long temp = start; start = end; end = temp; } if (end > 1000) { throw org.hsqldb.jdbc.Util.invalidArgument( "value larger than 100"); } if (end > start + 100) { end = start + 100; } for (long i = start; i < end; i++) { Object[] row = new Object[2]; row[0] = Long.valueOf(i); row[1] = new BinaryData(BigInteger.valueOf(i).toByteArray(), false); result.navigator.add(row); } result.navigator.reset(); return new JDBCResultSet((JDBCConnection) connection, null, result, result.metaData); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestSql.java0000644000175000017500000007645012007547410022173 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import junit.framework.TestCase; import junit.framework.TestResult; import java.sql.Date; /** * Test sql statements via jdbc against in-memory database * @author Fred Toussi (fredt@users dot sourceforge.net) */ public class TestSql extends TestBase { Statement stmnt; PreparedStatement pstmnt; Connection connection; String getColumnName = "false"; public TestSql(String name) { super(name); } protected void setUp() { super.setUp(); try { connection = super.newConnection(); stmnt = connection.createStatement(); } catch (Exception e) {} } public void testMetaData() { String ddl0 = "DROP TABLE ADDRESSBOOK IF EXISTS; DROP TABLE ADDRESSBOOK_CATEGORY IF EXISTS; DROP TABLE USER IF EXISTS;"; String ddl1 = "CREATE TABLE USER(USER_ID INTEGER NOT NULL PRIMARY KEY,LOGIN_ID VARCHAR(128) NOT NULL,USER_NAME VARCHAR(254) DEFAULT ' ' NOT NULL,CREATE_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,UPDATE_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,LAST_ACCESS_DATE TIMESTAMP,CONSTRAINT IXUQ_LOGIN_ID0 UNIQUE(LOGIN_ID))"; String ddl2 = "CREATE TABLE ADDRESSBOOK_CATEGORY(USER_ID INTEGER NOT NULL,CATEGORY_ID INTEGER DEFAULT 0 NOT NULL,CATEGORY_NAME VARCHAR(60) DEFAULT '' NOT NULL,CONSTRAINT SYS_PK_ADDRESSBOOK_CATEGORY PRIMARY KEY(USER_ID,CATEGORY_ID),CONSTRAINT FK_ADRBKCAT1 FOREIGN KEY(USER_ID) REFERENCES USER(USER_ID) ON DELETE CASCADE)"; String ddl3 = "CREATE TABLE ADDRESSBOOK(USER_ID INTEGER NOT NULL,ADDRESSBOOK_ID INTEGER NOT NULL,CATEGORY_ID INTEGER DEFAULT 0 NOT NULL,FIRST VARCHAR(64) DEFAULT '' NOT NULL,LAST VARCHAR(64) DEFAULT '' NOT NULL,NOTE VARCHAR(128) DEFAULT '' NOT NULL,CONSTRAINT SYS_PK_ADDRESSBOOK PRIMARY KEY(USER_ID,ADDRESSBOOK_ID),CONSTRAINT FK_ADRBOOK1 FOREIGN KEY(USER_ID,CATEGORY_ID) REFERENCES ADDRESSBOOK_CATEGORY(USER_ID,CATEGORY_ID) ON DELETE CASCADE)"; String result1 = "1"; String result2 = "2"; String result3 = "3"; String result4 = "4"; String result5 = "5"; try { stmnt.execute(ddl0); stmnt.execute(ddl1); stmnt.execute(ddl2); stmnt.execute(ddl3); DatabaseMetaData md = connection.getMetaData(); { System.out.println("Testing DatabaseMetaData methods"); System.out.println(md.getDatabaseMajorVersion()); System.out.println(md.getDatabaseMinorVersion()); System.out.println(md.getDatabaseProductName()); System.out.println(md.getDatabaseProductVersion()); System.out.println(md.getDefaultTransactionIsolation()); System.out.println(md.getDriverMajorVersion()); System.out.println(md.getDriverMinorVersion()); System.out.println(md.getDriverName()); System.out.println(md.getDriverVersion()); System.out.println(md.getExtraNameCharacters()); System.out.println(md.getIdentifierQuoteString()); System.out.println(md.getJDBCMajorVersion()); System.out.println(md.getJDBCMinorVersion()); System.out.println(md.getMaxBinaryLiteralLength()); System.out.println(md.getMaxCatalogNameLength()); System.out.println(md.getMaxColumnsInGroupBy()); System.out.println(md.getMaxColumnsInIndex()); System.out.println(md.getMaxColumnsInOrderBy()); System.out.println(md.getMaxColumnsInSelect()); System.out.println(md.getMaxColumnsInTable()); System.out.println(md.getMaxConnections()); System.out.println(md.getMaxCursorNameLength()); System.out.println(md.getMaxIndexLength()); System.out.println(md.getMaxProcedureNameLength()); System.out.println(md.getMaxRowSize()); System.out.println(md.getMaxSchemaNameLength()); System.out.println(md.getMaxStatementLength()); System.out.println(md.getMaxStatements()); System.out.println(md.getMaxTableNameLength()); System.out.println(md.getMaxUserNameLength()); System.out.println(md.getNumericFunctions()); System.out.println(md.getProcedureTerm()); System.out.println(md.getResultSetHoldability()); System.out.println(md.getSchemaTerm()); System.out.println(md.getSearchStringEscape()); System.out.println( "Testing DatabaseMetaData.getSQLKeywords()"); System.out.println(md.getSQLKeywords()); System.out.println(md.getSQLStateType()); System.out.println( "Testing DatabaseMetaData.getStringFunctions()"); System.out.println(md.getStringFunctions()); System.out.println( "Testing DatabaseMetaData.getSystemFunctions()"); System.out.println(md.getSystemFunctions()); System.out.println( "Testing DatabaseMetaData.getTimeDateFunctions()"); System.out.println(md.getTimeDateFunctions()); System.out.println(md.getURL()); System.out.println(md.getUserName()); System.out.println(DatabaseMetaData.importedKeyCascade); System.out.println(md.isCatalogAtStart()); System.out.println(md.isReadOnly()); ResultSet rs; rs = md.getPrimaryKeys(null, null, "USER"); ResultSetMetaData rsmd = rs.getMetaData(); String result0 = ""; for (; rs.next(); ) { for (int i = 0; i < rsmd.getColumnCount(); i++) { result0 += rs.getString(i + 1) + ":"; } result0 += "\n"; } rs.close(); System.out.println(result0); } { ResultSet rs; rs = md.getBestRowIdentifier(null, null, "USER", 0, true); ResultSetMetaData rsmd = rs.getMetaData(); String result0 = ""; for (; rs.next(); ) { for (int i = 0; i < rsmd.getColumnCount(); i++) { result0 += rs.getString(i + 1) + ":"; } result0 += "\n"; } rs.close(); System.out.println(result0); } { ResultSet rs = md.getImportedKeys(null, null, "ADDRESSBOOK"); ResultSetMetaData rsmd = rs.getMetaData(); result1 = ""; for (; rs.next(); ) { for (int i = 0; i < rsmd.getColumnCount(); i++) { result1 += rs.getString(i + 1) + ":"; } result1 += "\n"; } rs.close(); System.out.println(result1); } { ResultSet rs = md.getCrossReference(null, null, "ADDRESSBOOK_CATEGORY", null, null, "ADDRESSBOOK"); ResultSetMetaData rsmd = rs.getMetaData(); result2 = ""; for (; rs.next(); ) { for (int i = 0; i < rsmd.getColumnCount(); i++) { result2 += rs.getString(i + 1) + ":"; } result2 += "\n"; } rs.close(); System.out.println(result2); } { ResultSet rs = md.getExportedKeys(null, null, "USER"); ResultSetMetaData rsmd = rs.getMetaData(); result3 = ""; for (; rs.next(); ) { for (int i = 0; i < rsmd.getColumnCount(); i++) { result3 += rs.getString(i + 1) + ":"; } result3 += "\n"; } rs.close(); System.out.println(result3); } { ResultSet rs = md.getCrossReference(null, null, "USER", null, null, "ADDRESSBOOK_CATEGORY"); ResultSetMetaData rsmd = rs.getMetaData(); result4 = ""; for (; rs.next(); ) { for (int i = 0; i < rsmd.getColumnCount(); i++) { result4 += rs.getString(i + 1) + ":"; } result4 += "\n"; } rs.close(); System.out.println(result4); } { stmnt.execute("DROP TABLE T IF EXISTS;"); stmnt.execute( "CREATE TABLE T (I IDENTITY, A CHAR(20), B CHAR(20));"); stmnt.execute( "INSERT INTO T VALUES (NULL, 'get_column_name', '" + getColumnName + "');"); ResultSet rs = stmnt.executeQuery( "SELECT I, A, B, A \"aliasA\", B \"aliasB\", 1 FROM T;"); ResultSetMetaData rsmd = rs.getMetaData(); result5 = ""; for (; rs.next(); ) { for (int i = 0; i < rsmd.getColumnCount(); i++) { result5 += rsmd.getColumnName(i + 1) + ":" + rs.getString(i + 1) + ":"; } result5 += "\n"; } rs.close(); rs = stmnt.executeQuery( "SELECT I, A, B, A \"aliasA\", B \"aliasB\", 1 FROM T;");; rsmd = rs.getMetaData(); for (; rs.next(); ) { for (int i = 0; i < rsmd.getColumnCount(); i++) { result5 += rsmd.getColumnLabel(i + 1) + ":" + rs.getString(i + 1) + ":"; } result5 += "\n"; } System.out.println(result5); System.out.println("first column identity: " + rsmd.isAutoIncrement(1)); rsmd.isCaseSensitive(1); rsmd.isCurrency(1); rsmd.isDefinitelyWritable(1); rsmd.isNullable(1); rsmd.isReadOnly(1); rsmd.isSearchable(1); rsmd.isSigned(1); rsmd.isWritable(1); rs.close(); // test identity with PreparedStatement pstmnt = connection.prepareStatement( "INSERT INTO T VALUES (?,?,?)"); pstmnt.setString(1, null); pstmnt.setString(2, "test"); pstmnt.setString(3, "test2"); pstmnt.executeUpdate(); pstmnt = connection.prepareStatement("call identity()"); ResultSet rsi = pstmnt.executeQuery(); rsi.next(); int identity = rsi.getInt(1); System.out.println("call identity(): " + identity); rsi.close(); } } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMetaData complete"); // assert equality of exported and imported with xref assertEquals(result1, result2); assertEquals(result3, result4); } /** * Demonstration of a reported bug.

                  * Because all values were turned into strings with toString before * PreparedStatement.executeQuery() was called, special values such as * NaN were not accepted. * * This test can be extended to cover various conversions through JDBC * */ public void testDoubleNaN() { double value = 0; boolean wasEqual = false; String message = "DB operation completed"; String ddl1 = "DROP TABLE t1 IF EXISTS;" + "CREATE TABLE t1 ( d DECIMAL, f DOUBLE, l BIGINT, i INTEGER, s SMALLINT, t TINYINT, " + "dt DATE DEFAULT CURRENT_DATE, ti TIME DEFAULT CURRENT_TIME, ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP );"; try { stmnt.execute(ddl1); PreparedStatement ps = connection.prepareStatement( "INSERT INTO t1 (d,f,l,i,s,t,dt,ti,ts) VALUES (?,?,?,?,?,?,?,?,?)"); ps.setString(1, "0.2"); ps.setDouble(2, 0.2); ps.setLong(3, java.lang.Long.MAX_VALUE); ps.setInt(4, Integer.MAX_VALUE); ps.setInt(5, Short.MAX_VALUE); ps.setInt(6, 0); ps.setDate(7, new java.sql.Date(System.currentTimeMillis())); ps.setTime(8, new java.sql.Time(System.currentTimeMillis())); ps.setTimestamp( 9, new java.sql.Timestamp(System.currentTimeMillis())); ps.execute(); ps.setInt(1, 0); ps.setDouble(2, java.lang.Double.NaN); ps.setLong(3, java.lang.Long.MIN_VALUE); ps.setInt(4, Integer.MIN_VALUE); ps.setInt(5, Short.MIN_VALUE); ps.setInt(6, 0); // allowed conversions ps.setTimestamp( 7, new java.sql.Timestamp(System.currentTimeMillis() + 1)); ps.setTime(8, new java.sql.Time(System.currentTimeMillis() + 1)); ps.setDate(9, new java.sql.Date(System.currentTimeMillis() + 1)); ps.execute(); // ps.setInt(1, 0); ps.setDouble(2, java.lang.Double.POSITIVE_INFINITY); ps.setInt(4, Integer.MIN_VALUE); // test conversion // ps.setObject(5, Boolean.TRUE); // no longer converts boolean to int // ps.setBoolean(5, true); ps.setObject(5, new Short((short) 2), Types.SMALLINT); ps.setObject(6, new Integer(2), Types.TINYINT); // allowed conversions ps.setObject(7, new java.sql.Date(System.currentTimeMillis() + 2)); ps.setObject(8, new java.sql.Time(System.currentTimeMillis() + 2)); ps.setObject(9, new java.sql.Timestamp(System.currentTimeMillis() + 2)); ps.execute(); ps.setObject(1, new Float(0), Types.INTEGER); ps.setObject(4, new Float(1), Types.INTEGER); ps.setDouble(2, java.lang.Double.NEGATIVE_INFINITY); ps.execute(); ResultSet rs = stmnt.executeQuery("SELECT d, f, l, i, s*2, t FROM t1"); boolean result = rs.next(); value = rs.getDouble(2); // int smallintValue = rs.getShort(3); int integerValue = rs.getInt(4); if (rs.next()) { value = rs.getDouble(2); wasEqual = Double.isNaN(value); integerValue = rs.getInt(4); // tests for conversion // getInt on DECIMAL integerValue = rs.getInt(1); } if (rs.next()) { value = rs.getDouble(2); wasEqual = wasEqual && value == Double.POSITIVE_INFINITY; } if (rs.next()) { value = rs.getDouble(2); wasEqual = wasEqual && value == Double.NEGATIVE_INFINITY; } rs = stmnt.executeQuery("SELECT MAX(i) FROM t1"); if (rs.next()) { int max = rs.getInt(1); System.out.println("Max value for i: " + max); } try { // cause errors ps.setString(5, "three"); fail("update did not fail"); } catch (SQLException e) {} { stmnt.execute("drop table CDTYPE if exists"); // test for the value MAX(column) in an empty table stmnt.execute( "CREATE TABLE cdType (ID INTEGER NOT NULL, name VARCHAR(50), PRIMARY KEY(ID))"); rs = stmnt.executeQuery("SELECT MAX(ID) FROM cdType"); if (rs.next()) { int max = rs.getInt(1); System.out.println("Max value for ID: " + max); } else { System.out.println("Max value for ID not returned"); } stmnt.executeUpdate( "INSERT INTO cdType VALUES (10,'Test String');"); stmnt.execute("CALL IDENTITY();"); try { stmnt.executeUpdate( "INSERT INTO cdType VALUES (10,'Test String');"); } catch (SQLException e1) { stmnt.execute("ROLLBACK"); connection.rollback(); } } } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testDoubleNaN complete"); // assert new behaviour assertEquals(true, wasEqual); } public void testAny() { try { String ddl = "drop table PRICE_RELATE_USER_ORDER_V2 if exists;" + "create table PRICE_RELATE_USER_ORDER_V2 " + "(ID_ORDER_V2 BIGINT, ID_USER NUMERIC, DATE_CREATE TIMESTAMP)"; String sql = "insert into PRICE_RELATE_USER_ORDER_V2 " + "(ID_ORDER_V2, ID_USER, DATE_CREATE) " + "values " + "(?, ?, ?)"; Statement st = connection.createStatement(); st.execute(ddl); PreparedStatement ps = connection.prepareStatement(sql); ps.setLong(1, 1); ps.setNull(2, Types.NUMERIC); ps.setTimestamp( 3, new java.sql.Timestamp(System.currentTimeMillis())); ps.execute(); } catch (SQLException e) { e.printStackTrace(); System.out.println("TestSql.testAny() error: " + e.getMessage()); } System.out.println("testAny complete"); } /** * Fix for bug #1201135 */ public void testBinds() { try { PreparedStatement pstmt = connection.prepareStatement("drop table test if exists"); pstmt.execute(); pstmt = connection.prepareStatement("create table test (id integer)"); pstmt.execute(); pstmt = connection.prepareStatement("insert into test values (10)"); pstmt.execute(); pstmt = connection.prepareStatement("insert into test values (20)"); pstmt.execute(); pstmt = connection.prepareStatement( "select count(*) from test where id is null"); ResultSet rs = pstmt.executeQuery(); rs.next(); int count = rs.getInt(1); assertEquals(0, count); pstmt = connection.prepareStatement("select limit ? 2 id from test"); pstmt.setInt(1, 0); rs = pstmt.executeQuery(); rs.next(); count = rs.getInt(1); assertEquals(10, count); pstmt.setInt(1, 1); rs = pstmt.executeQuery(); rs.next(); count = rs.getInt(1); assertEquals(20, count); } catch (SQLException e) { e.printStackTrace(); System.out.println("TestSql.testBinds() error: " + e.getMessage()); } } // miscellaneous tests public void testX1() { String tableDDL = "create table lo_attribute ( " + "learningid varchar(15) not null, " + "ordering integer not null," + "attribute_value_data varchar(85)," + "constraint PK_LO_ATTR primary key (learningid, ordering))"; try { Statement stmt = connection.createStatement(); stmt.execute("drop table lo_attribute if exists"); stmt.execute(tableDDL); stmt.execute( "insert into lo_attribute values('abcd', 10, 'cdef')"); stmt.execute( "insert into lo_attribute values('bcde', 20, 'cdef')"); } catch (SQLException e) { assertEquals(0, 1); } try { String prepared = "update lo_attribute set " + " ordering = (ordering - 1) where ordering > ?"; PreparedStatement ps = connection.prepareStatement(prepared); ps.setInt(1, 10); ps.execute(); } catch (SQLException e) { assertEquals(0, 1); } try { connection.setAutoCommit(false); java.sql.Savepoint savepoint = connection.setSavepoint("savepoint"); connection.createStatement().executeQuery("CALL true;"); connection.rollback(savepoint); } catch (SQLException e) { assertEquals(0, 1); } } /** * In 1.8.0.2, this fails in client / server due to column type of the * second select for b1 being boolean, while the first select is interpreted * as varchar. The rowOutputBase class attempts to cast the Java Boolean * into String. */ public void testUnionColumnTypes() { try { Connection conn = newConnection(); Statement stmt = conn.createStatement(); stmt.execute("DROP TABLE test1 IF EXISTS"); stmt.execute("DROP TABLE test2 IF EXISTS"); stmt.execute("CREATE TABLE test1 (id int, b1 boolean)"); stmt.execute("CREATE TABLE test2 (id int)"); stmt.execute("INSERT INTO test1 VALUES(1,true)"); stmt.execute("INSERT INTO test2 VALUES(2)"); ResultSet rs = stmt.executeQuery( "select id,null as b1 from test2 union select id, b1 from test1"); Boolean[] array = new Boolean[2]; for (int i = 0; rs.next(); i++) { boolean boole = rs.getBoolean(2); array[i] = Boolean.valueOf(boole); if (rs.wasNull()) { array[i] = null; } } boolean result = (array[0] == null && array[1] == Boolean.TRUE) || (array[0] == Boolean.TRUE && array[1] == null); assertTrue(result); } catch (SQLException e) { e.printStackTrace(); System.out.println("TestSql.testUnionColumnType() error: " + e.getMessage()); } } public void testUnionSubquery() throws Exception { Statement st = connection.createStatement(); st.execute("DROP TABLE t1 if exists;"); st.execute("DROP TABLE t2 if exists;"); st.execute( "CREATE TABLE t1 (id int not null, v1 int, v2 int, primary key(id))"); st.execute( "CREATE TABLE t2 (id int not null, v1 int, v3 int, primary key(id))"); st.execute("INSERT INTO t1 values(1,1,1)"); st.execute("INSERT INTO t1 values(2,2,2)"); st.execute("INSERT INTO t2 values(1,3,3)"); ResultSet rs = st.executeQuery( "select t as atable, a as idvalue, b as value1, c as value2, d as value3 from(" + "(select 't1' as t, t1.id as a, t1.v1 as b, t1.v2 as c, null as d from t1) union" + "(select 't2' as t, t2.id as a, t2.v1 as b, null as c, t2.v3 as d from t2)) order by atable, idvalue"); assertTrue(rs.next()); assertEquals("t1", rs.getObject("atable")); assertEquals(1, rs.getInt("idvalue")); assertEquals(1, rs.getInt("value1")); assertEquals(1, rs.getInt("value2")); assertEquals(null, rs.getObject("value3")); assertTrue(rs.next()); assertEquals("t1", rs.getObject("atable")); assertEquals(2, rs.getInt("idvalue")); assertEquals(2, rs.getInt("value1")); assertEquals(2, rs.getInt("value2")); assertEquals(null, rs.getObject("value3")); assertTrue(rs.next()); assertEquals("t2", rs.getObject("atable")); assertEquals(1, rs.getInt("idvalue")); assertEquals(3, rs.getInt("value1")); assertEquals(null, rs.getObject("value2")); assertEquals(3, rs.getInt("value3")); //this fails! assertFalse(rs.next()); } public void testPreparedWithManyParams() throws Exception { int count = 40; String tabledef = "CREATE TABLE T1 ("; for (int i = 0; i < count; i++) { if (i != 0) { tabledef = tabledef + ','; } tabledef = tabledef + "COL_" + i + " INT NOT NULL"; } tabledef += ");"; String querydef = "INSERT INTO T1("; for (int i = 0; i < count; i++) { if (i != 0) { querydef = querydef + ','; } querydef = querydef + "COL_" + i; } querydef += ") VALUES ("; for (int i = 0; i < count; i++) { if (i != 0) { querydef = querydef + ','; } querydef = querydef + "?"; } querydef += ");"; Statement st = connection.createStatement(); st.execute("DROP TABLE T1 IF EXISTS;"); st.execute(tabledef); PreparedStatement ps = connection.prepareStatement(querydef); for (int i = 0; i < count; i++) { ps.setInt(i + 1, i + 311); } ps.executeUpdate(); } static byte[] b1 = { 0, 1, -128, 44, 12 }; static byte[] b2 = { 10, 127 }; public void testBinaryFunction() throws Exception { Statement sStatement = null; ResultSet r; boolean mismatch; sStatement = connection.createStatement(); try { // prepared statements String s = "create table bintest(id int primary key, bin varbinary(100))"; sStatement.execute(s); s = "insert into bintest values ( ?, ?)"; PreparedStatement p = connection.prepareStatement(s); p.clearParameters(); p.setInt(1, 10); p.setBytes(2, b1); p.executeUpdate(); p.clearParameters(); p.setInt(1, 20); p.setBytes(2, b2); p.executeUpdate(); byte[] b1n; byte[] b2n; s = "select \"org.hsqldb.lib.ArrayUtil.countStartElementsAt\"(bin,0, ?) " + "from bintest"; p = connection.prepareStatement(s); p.setBytes(1, b2); r = p.executeQuery(); r.next(); int integer1 = r.getInt(1); r.next(); int integer2 = r.getInt(1); s = "select \"org.hsqldb.lib.StringConverter.hexStringToByteArray\"" + "(\"org.hsqldb.lib.StringConverter.byteArrayToHexString\"(x'abcd')) " + "from bintest"; r = sStatement.executeQuery(s); r.next(); b1n = r.getBytes(1); r.next(); b1n = r.getBytes(1); //-- s = "select \"org.hsqldb.lib.StringConverter.byteArrayToHexString\"(bin) " + "from bintest"; r = sStatement.executeQuery(s); r.next(); b1n = r.getBytes(1); r.next(); b1n = r.getBytes(1); s = "create table obj(id int,o object)"; sStatement.execute(s); s = "insert into obj values(?,?)"; p = connection.prepareStatement(s); p.setInt(1, 1); int[] ia1 = { 1, 2, 3 }; p.setObject(2, ia1); p.executeUpdate(); p.clearParameters(); p.setInt(1, 2); java.awt.Rectangle r1 = new java.awt.Rectangle(10, 11, 12, 13); p.setObject(2, r1); p.executeUpdate(); r = sStatement.executeQuery("SELECT o FROM obj ORDER BY id DESC"); r.next(); java.awt.Rectangle r2 = (java.awt.Rectangle) r.getObject(1); if (r2.x != 10 || r2.y != 11 || r2.width != 12 || r2.height != 13) { throw new Exception("Object data error: Rectangle"); } r.next(); int[] ia2 = (int[]) (r.getObject(1)); if (ia2[0] != 1 || ia2[1] != 2 || ia2[2] != 3 || ia2.length != 3) { throw new Exception("Object data error: int[]"); } sStatement.close(); } catch (Exception e) { assertEquals(0, 1); } } protected void tearDown() { try { stmnt.execute("SHUTDOWN"); if (!isNetwork) { connection.close(); } } catch (Exception e) { e.printStackTrace(); System.out.println("TestSql.tearDown() error: " + e.getMessage()); } super.tearDown(); } public static void main(String[] argv) { TestResult result = new TestResult(); TestCase testA = new TestSql("testMetaData"); TestCase testB = new TestSql("testDoubleNaN"); TestCase testC = new TestSql("testAny"); testA.run(result); testB.run(result); testC.run(result); System.out.println("TestSql error count: " + result.failureCount()); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestBatchBug.java0000644000175000017500000001636212007547410023107 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; public class TestBatchBug { static final int DATASET_COUNT = 2; static final int DECIMAL_FIELDS_PER_DATASET = 2; static final String TABLE_ATTR_CACHED = "CACHED"; static final String IN_PROCESS_FILE_URL = "jdbc:hsqldb:/hsql/testbatch/perftest"; static final String HSQLDB_LOCALHOST_URL = "jdbc:hsqldb:hsql://localhost/yourtest"; ; static final String TEST_TABLE_NAME = "CSBug"; static String FIELD_LIST_WITHOUT_ID = "Kennung, Last_Update "; // wird in static {} erweitert: static String FIELD_LIST_WITH_ID = "ID, "; static String SQL_SELECT_ALL_FIELDS = "SELECT "; // wird in static {} erweitert: static { for (int i = 1; i <= DECIMAL_FIELDS_PER_DATASET; i++) { FIELD_LIST_WITHOUT_ID += ", Field_" + i; } FIELD_LIST_WITH_ID += FIELD_LIST_WITHOUT_ID; SQL_SELECT_ALL_FIELDS += FIELD_LIST_WITH_ID + " FROM " + TEST_TABLE_NAME; } static int ldfNrFuerKennung; public static void main(String[] arg) { try { // Load the HSQL Database Engine JDBC driver Class.forName("org.hsqldb.jdbc.JDBCDriver"); String[] urls = { IN_PROCESS_FILE_URL }; for (int i = 0; i < urls.length; i++) { String url = urls[i]; String[] tableAttrs = { TABLE_ATTR_CACHED }; for (int iAttr = 0; iAttr < tableAttrs.length; iAttr++) { testURL(url, "CACHED"); } } System.out.println("bye"); } catch (Exception e) { e.printStackTrace(); } } static void testURL(String url, String tableAttr) throws SQLException { System.out.println(url); Connection con = DriverManager.getConnection(url, "sa", ""); reCreateTable(con, "CACHED"); populateTable(con); con.close(); } static void reCreateTable(Connection con, String tableAttr) throws SQLException { String cvsFileName = TEST_TABLE_NAME + ".csv"; // Create a statement object Statement stmt = con.createStatement(); // Try to drop the table try { stmt.executeUpdate("DROP TABLE " + TEST_TABLE_NAME + " IF EXISTS"); } catch (SQLException e) { // Ignore Exception, because the table may not yet exist System.out.println(e.getMessage()); } StringBuffer sql = new StringBuffer(); sql.append("CREATE "); sql.append(tableAttr); // z.B. "CACHED" sql.append(" TABLE "); sql.append(TEST_TABLE_NAME); sql.append(" ("); sql.append("Id integer IDENTITY"); sql.append(", "); sql.append("Kennung varchar(20) NOT NULL"); // etwas andere Schreibweise von CURRENT TIMESTAMP sql.append(", last_update TIMESTAMP "); sql.append("DEFAULT CURRENT_TIMESTAMP NOT NULL"); for (int i = 1; i <= DECIMAL_FIELDS_PER_DATASET; i++) { sql.append(", Field_" + i + " decimal"); } sql.append(", UNIQUE(Kennung)"); sql.append(")"); System.out.println(sql.toString()); stmt.executeUpdate(sql.toString()); // CLEAR TABLE sql = new StringBuffer(); sql.append("DELETE FROM "); sql.append(TEST_TABLE_NAME); System.out.println(sql.toString()); stmt.executeUpdate(sql.toString()); stmt.close(); // is no longer used } // tries to enter 2 records static void populateTable(Connection con) throws SQLException { long startTime = System.currentTimeMillis(); Timestamp now = new Timestamp(startTime); con.setAutoCommit(false); String sql = createInsertSQL(true, false); PreparedStatement prep = con.prepareStatement(sql); prep.clearParameters(); prep.setString(1, "xxx"); prep.setTimestamp(2, now); // last_update for (int ii = 0; ii < DECIMAL_FIELDS_PER_DATASET; ii++) { prep.setDouble(ii + 3, 0.123456789); // Wert } prep.addBatch(); prep.setString(1, "yyy"); prep.setTimestamp(2, now); // last_update for (int ii = 0; ii < DECIMAL_FIELDS_PER_DATASET; ii++) { prep.setDouble(ii + 3, 0.123456789); // Wert } prep.addBatch(); int[] updateCounts = prep.executeBatch(); con.setAutoCommit(true); prep.close(); } static String createInsertSQL(boolean prepStmt, boolean getIdAfterInsert) { StringBuffer sql = new StringBuffer(); sql.append("INSERT INTO "); sql.append(TEST_TABLE_NAME); sql.append(" ("); sql.append(FIELD_LIST_WITHOUT_ID); sql.append(") VALUES ("); Timestamp now = new Timestamp(System.currentTimeMillis()); Object val = "?"; if (prepStmt) { sql.append(val + ", " + val); } else { long millis = System.currentTimeMillis(); sql.append("'Ken"); sql.append((++ldfNrFuerKennung) + "'"); val = new Double(0.123456789) + ""; sql.append(", '" + now.toString() + "'"); } for (int i = 1; i <= DECIMAL_FIELDS_PER_DATASET; i++) { sql.append(", " + val); } sql.append(")"); String ret = sql.toString(); System.out.println(ret); return ret; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestCascade.java0000644000175000017500000001571212007547410022751 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; /* * CascadeDeleteBug.java * * Created on June 24, 2002, 8:48 AM */ import java.io.File; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import junit.framework.TestCase; /** * Test case to demonstrate catastrophic bug in cascade delete code. * * @version 1.0 * @author David Kopp */ public class TestCascade extends TestCase { Connection con; public TestCascade(String name) { super(name); } protected void setUp() { try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); createDatabase(); con = DriverManager.getConnection("jdbc:hsqldb:testdb", "sa", ""); } catch (Exception e) { e.printStackTrace(); System.out.println(this + ".setUp() error: " + e.getMessage()); } } protected void tearDown() { try { con.createStatement().execute("SHUTDOWN"); con.close(); } catch (SQLException e) {} } public void testDelete() { try { insertData(con); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT COUNT(EIACODXA) FROM CA"); rs.next(); int origCount = rs.getInt(1); rs.close(); deleteXBRecord(con); rs = stmt.executeQuery("SELECT COUNT(EIACODXA) FROM CA"); rs.next(); int newCount = rs.getInt(1); rs.close(); stmt.close(); assertEquals(9, newCount); } catch (SQLException e) { this.assertTrue("SQLException thrown", false); } } private static void createDatabase() throws SQLException { new File("testdb.backup").delete(); new File("testdb.data").delete(); new File("testdb.properties").delete(); new File("testdb.script").delete(); Connection con = DriverManager.getConnection("jdbc:hsqldb:testdb", "sa", ""); String[] saDDL = { "CREATE CACHED TABLE XB (EIACODXA VARCHAR(10) NOT NULL, LSACONXB VARCHAR(18) NOT NULL, ALTLCNXB VARCHAR(2) NOT NULL, LCNTYPXB VARCHAR(1) NOT NULL, LCNINDXB VARCHAR(1), LCNAMEXB VARCHAR(19), UPDT_BY VARCHAR(32), LST_UPDT TIMESTAMP, CONSTRAINT XPKXB PRIMARY KEY (EIACODXA, LSACONXB, ALTLCNXB, LCNTYPXB));", // "CREATE INDEX XIF2XB ON XB (EIACODXA);", "CREATE CACHED TABLE CA ( EIACODXA VARCHAR(10) NOT NULL, LSACONXB VARCHAR(18) NOT NULL, ALTLCNXB VARCHAR(2) NOT NULL, LCNTYPXB VARCHAR(1) NOT NULL, TASKCDCA VARCHAR(7) NOT NULL, TSKFRQCA NUMERIC(7,4), UPDT_BY VARCHAR(32), LST_UPDT TIMESTAMP, CONSTRAINT XPKCA PRIMARY KEY (EIACODXA, LSACONXB, ALTLCNXB, LCNTYPXB, TASKCDCA), CONSTRAINT R_XB_CA FOREIGN KEY (EIACODXA, LSACONXB, ALTLCNXB, LCNTYPXB) REFERENCES XB ON DELETE CASCADE);", // "CREATE INDEX XIF26CA ON CA ( EIACODXA, LSACONXB, ALTLCNXB, LCNTYPXB);" }; Statement stmt = con.createStatement(); for (int index = 0; index < saDDL.length; index++) { stmt.executeUpdate(saDDL[index]); } stmt.execute("SHUTDOWN"); con.close(); } // createDatabase /** * This method demonstrates the bug in cascading deletes. Before this method, * the CA table has 12 records. After, it should have 9, but instead it has * 0. */ private static void deleteXBRecord(Connection con) throws SQLException { Statement stmt = con.createStatement(); stmt.executeUpdate( "DELETE FROM XB WHERE LSACONXB = 'LEAA' AND EIACODXA = 'T850' AND LCNTYPXB = 'P' AND ALTLCNXB = '00'"); stmt.close(); } // deleteXBRecord private static void insertData(Connection con) throws SQLException { String[] saData = { "INSERT INTO XB VALUES('T850','LEAA','00','P',NULL,'LCN NAME','sa',NOW)", "INSERT INTO XB VALUES('T850','LEAA01','00','P',NULL,'LCN NAME','sa',NOW)", "INSERT INTO XB VALUES('T850','LEAA02','00','P',NULL,'LCN NAME','sa',NOW)", "INSERT INTO XB VALUES('T850','LEAA03','00','P',NULL,'LCN NAME','sa',NOW)", "INSERT INTO CA VALUES('T850','LEAA','00','P','ABCDEFG',3.14,'sa',NOW)", "INSERT INTO CA VALUES('T850','LEAA','00','P','QRSTUJV',3.14,'sa',NOW)", "INSERT INTO CA VALUES('T850','LEAA','00','P','ZZZZZZZ',3.14,'sa',NOW)", "INSERT INTO CA VALUES('T850','LEAA01','00','P','ABCDEFG',3.14,'sa',NOW)", "INSERT INTO CA VALUES('T850','LEAA01','00','P','QRSTUJV',3.14,'sa',NOW)", "INSERT INTO CA VALUES('T850','LEAA01','00','P','ZZZZZZZ',3.14,'sa',NOW)", "INSERT INTO CA VALUES('T850','LEAA02','00','P','ABCDEFG',3.14,'sa',NOW)", "INSERT INTO CA VALUES('T850','LEAA02','00','P','QRSTUJV',3.14,'sa',NOW)", "INSERT INTO CA VALUES('T850','LEAA02','00','P','ZZZZZZZ',3.14,'sa',NOW)", "INSERT INTO CA VALUES('T850','LEAA03','00','P','ABCDEFG',3.14,'sa',NOW)", "INSERT INTO CA VALUES('T850','LEAA03','00','P','QRSTUJV',3.14,'sa',NOW)", "INSERT INTO CA VALUES('T850','LEAA03','00','P','ZZZZZZZ',3.14,'sa',NOW)" }; Statement stmt = con.createStatement(); for (int index = 0; index < saData.length; index++) { stmt.executeUpdate(saData[index]); } } // insertData } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestCollation.java0000644000175000017500000002102412007547410023343 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import org.hsqldb.types.Collation; /** * Test HSQLDBs collation capabilities * @author frank.schoenheit@sun.com */ public class TestCollation extends TestBase { java.sql.Statement statement; java.sql.Connection connection; org.hsqldb.lib.Iterator collIterator; org.hsqldb.lib.Iterator localeIterator; /** Creates a new instance of TestCollation */ public TestCollation(String name) { super(name); super.isNetwork = false; } protected void setUp() { super.setUp(); try { connection = super.newConnection(); statement = connection.createStatement(); } catch (Exception e) {} collIterator = Collation.getCollationsIterator(); localeIterator = Collation.getLocalesIterator(); } protected void tearDown() { try { statement = connection.createStatement(); statement.execute("SHUTDOWN"); } catch (Exception e) {} super.tearDown(); } /** * checks whether expected locales are present and selectable */ public void testVerifyAvailability() { // let's check whether unknown collation identifiers are rejected try { statement.execute( getSetCollationStmt( "ThisIsDefinitlyNoValidCollationIdentifier")); fail("database did not reject invalid collation name"); } catch (java.sql.SQLException e) {} // let's check whether the DB accepts all known collations int count = 0; while (collIterator.hasNext()) { String collationName = (String) collIterator.next(); try { statement.execute(getSetCollationStmt(collationName)); } catch (java.sql.SQLException e) { fail("could not set collation '" + collationName + "'\n exception message: " + e.getMessage()); } ++count; } System.out.println("checked " + count + " collations for availability."); // even if the above worked, we cannot be sure that all locales are really supported. // The fact that SET DATABASE COLLATION succeeeded only means that a Collator could // be instantiated with a Locale matching the given collation name. But what if // Locale.Instance(...) lied, and returned a fallback Locale instance? // // Hmm, looking at the documentation of Locale.getAvailableLocales, I'm not sure // whether it is really feasible. The doc states "returns a list of all installed Locales". // The "installed" puzzles me - maybe this is really different per installation, and not only // per JDK version? java.util.Locale[] availableLocales = java.util.Locale.getAvailableLocales(); org.hsqldb.lib.Set existenceCheck = new org.hsqldb.lib.HashSet(); for (int i = 0; i < availableLocales.length; ++i) { String availaleName = availableLocales[i].getLanguage(); if (availableLocales[i].getCountry().length() > 0) { availaleName += "-" + availableLocales[i].getCountry(); } existenceCheck.add(availaleName); } String notInstalled = ""; int expected = 0, failed = 0; while (localeIterator.hasNext()) { String localeName = (String) localeIterator.next(); ++expected; if (!existenceCheck.contains(localeName)) { if (notInstalled.length() > 0) { notInstalled += "; "; } notInstalled += localeName; ++failed; } } if (notInstalled.length() > 0) { fail("the following locales are not installed:\n " + notInstalled + "\n (" + failed + " out of " + expected + ")"); } } /** * checks whether sorting via a given collation works as expected */ public void testVerifyCollation() { String failedCollations = ""; String failMessage = ""; while (collIterator.hasNext()) { String collationName = (String) collIterator.next(); String message = checkSorting(collationName); if (message.length() > 0) { if (failedCollations.length() > 0) { failedCollations += ", "; } failedCollations += collationName; failMessage += message; } } if (failedCollations.length() > 0) { fail("test failed for following collations:\n" + failedCollations + "\n" + failMessage); } } /** * returns an SQL statement to set the database collation */ protected final String getSetCollationStmt(String collationName) { final String setCollationStmtPre = "SET DATABASE COLLATION \""; final String setCollationStmtPost = "\""; return setCollationStmtPre + collationName + setCollationStmtPost; } /** * checks sorting a table with according to a given collation */ protected String checkSorting(String collationName) { String stmt1 = "DROP TABLE WORDLIST IF EXISTS;"; String stmt2 = "CREATE TEXT TABLE WORDLIST ( ID INTEGER, WORD VARCHAR(50) );"; String stmt3 = "SET TABLE WORDLIST SOURCE \"" + collationName + ".csv;encoding=UTF-8\""; String selectStmt = "SELECT ID, WORD FROM WORDLIST ORDER BY WORD"; String returnMessage = ""; try { // set database collation statement.execute(getSetCollationStmt(collationName)); statement.execute(stmt1); statement.execute(stmt2); statement.execute(stmt3); java.sql.ResultSet results = statement.executeQuery(selectStmt); while (results.next()) { int expectedPosition = results.getInt(1); int foundPosition = results.getRow(); if (expectedPosition != foundPosition) { String word = results.getString(2); return "testing collation '" + collationName + "' failed\n" + " word : " + word + "\n" + " expected position : " + expectedPosition + "\n" + " found position : " + foundPosition + "\n"; } } } catch (java.sql.SQLException e) { return "testing collation '" + collationName + "' failed\n exception message: " + e.getMessage() + "\n"; } return ""; } public static void main(String[] argv) { runWithResult(TestCollation.class, "testVerifyAvailability"); runWithResult(TestCollation.class, "testVerifyCollation"); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestDima.java0000644000175000017500000002301312007547406022276 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Properties; public class TestDima { public void testOne() { try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); Connection conn = java.sql.DriverManager.getConnection( "jdbc:hsqldb:file:/hsql/testdima/test", "sa", ""); conn.setAutoCommit(false); Statement stat = conn.createStatement(); stat.executeUpdate("DROP TABLE BAZ IF EXISTS"); stat.executeUpdate("DROP TABLE BAR IF EXISTS"); stat.executeUpdate("DROP TABLE FOO IF EXISTS"); conn.commit(); stat.executeUpdate("CHECKPOINT"); stat.executeUpdate( "CREATE CACHED TABLE FOO (ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, VAL VARCHAR(80))"); stat.executeUpdate( "CREATE TABLE BAR (ID INTEGER IDENTITY PRIMARY KEY, FOOID INTEGER NOT NULL, " + "VAL VARCHAR(80), FOREIGN KEY(FOOID) REFERENCES FOO(ID) ON DELETE CASCADE)"); stat.executeUpdate( "CREATE TABLE BAZ (ID INTEGER IDENTITY PRIMARY KEY, BARID INTEGER NOT NULL, " + "VAL VARCHAR(80), FOREIGN KEY(BARID) REFERENCES BAR(ID) ON DELETE CASCADE)"); conn.commit(); stat.executeUpdate("CHECKPOINT"); stat.executeUpdate("INSERT INTO FOO (VAL) VALUES ('foo 1')"); stat.executeUpdate( "INSERT INTO BAR (FOOID,VAL) VALUES (IDENTITY(),'bar 1')"); stat.executeUpdate( "INSERT INTO BAZ (BARID,VAL) VALUES (IDENTITY(),'baz 1')"); stat.executeUpdate("INSERT INTO FOO (VAL) VALUES ('foo 2')"); stat.executeUpdate( "INSERT INTO BAR (FOOID,VAL) VALUES (IDENTITY(),'bar 2')"); stat.executeUpdate( "INSERT INTO BAZ (BARID,VAL) VALUES (IDENTITY(),'baz 2')"); stat.executeUpdate("INSERT INTO FOO (VAL) VALUES ('foo 3')"); stat.executeUpdate( "INSERT INTO BAR (FOOID,VAL) VALUES (IDENTITY(),'bar 3')"); stat.executeUpdate( "INSERT INTO BAZ (BARID,VAL) VALUES (IDENTITY(),'baz 3')"); ResultSet rs; Statement query = conn.createStatement( java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE, java.sql.ResultSet.CONCUR_READ_ONLY); rs = query.executeQuery("SELECT ID,VAL FROM FOO"); System.out.println("Table FOO:"); while (rs.next()) { System.out.println(rs.getInt(1)); System.out.println(rs.getString(2)); } rs = query.executeQuery("SELECT ID,FOOID,VAL FROM BAR"); System.out.println("Table BAR:"); while (rs.next()) { System.out.println(rs.getInt(1)); System.out.println(rs.getInt(2)); System.out.println(rs.getString(3)); } rs = query.executeQuery("SELECT ID,BARID,VAL FROM BAZ"); System.out.println("Table BAZ:"); while (rs.next()) { System.out.println(rs.getInt(1)); System.out.println(rs.getInt(2)); System.out.println(rs.getString(3)); } rs.close(); query.close(); stat.close(); conn.close(); } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(); } } public static void testTwo() { TestUtil.deleteDatabase("test"); try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); Properties pp = new Properties(); pp.put("user", "sa"); pp.put("password", ""); Connection c = DriverManager.getConnection("jdbc:hsqldb:file:test", pp); c.createStatement().executeUpdate( "create cached table SNS_OIDS(NAME varchar(20) not null primary key, ID int)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='_snsLog'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('_snsLog', 1)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='visitorTags'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('visitorTags', 1)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='departments'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('departments', 1)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='operators'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('operators', 1)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='zones'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('zones', 1)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='pages'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('pages', 1)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=21 WHERE \"NAME\"='visitorTags'"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='actionDefinitions'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('actionDefinitions', 1)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='actionVariants'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('actionVariants', 1)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='actionPoints'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('actionPoints', 1)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='actionTags'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('actionTags', 1)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='captureFields'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('captureFields', 1)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='reactions'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('reactions', 1)"); c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=1 WHERE \"NAME\"='reactionOperations'"); c.createStatement().executeUpdate( "INSERT INTO SNS_OIDS (\"NAME\", \"ID\") VALUES ('reactionOperations', 1)"); int count = c.createStatement().executeUpdate( "UPDATE SNS_OIDS SET \"ID\"=21 WHERE \"NAME\"='actionTags'"); System.out.println("count == " + count); // should be 1, 0 instead! } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(); } } public static void main(String[] args) throws Exception { TestDima test = new TestDima(); test.testOne(); test.testTwo(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestHashStructures.java0000644000175000017500000004367112007547410024422 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.util.Random; import org.hsqldb.lib.DoubleIntIndex; import org.hsqldb.lib.StopWatch; import junit.framework.TestCase; /** * @author Fred Toussi (fredt@users dot sourceforge.net) */ public class TestHashStructures extends TestCase { public TestHashStructures(String s) { super(s); } Random randomgen = new java.util.Random(); public void testHashMap() throws Exception { boolean failed = false; int testSize = 33; org.hsqldb.lib.HashMap hMap = new org.hsqldb.lib.HashMap(); org.hsqldb.lib.IntKeyHashMap hIntMap = new org.hsqldb.lib.IntKeyHashMap(); java.util.HashMap uMap = new java.util.HashMap(); try { populateBySerialIntKeys(uMap, hMap, testSize); compareByUIterator(uMap, hMap); compareByHIterator(uMap, hMap); // - populateByRandomIntKeys(uMap, hMap, testSize); compareByUIterator(uMap, hMap); compareByHIterator(uMap, hMap); // depopulateRandomly(uMap, hMap, 20); compareByUIterator(uMap, hMap); compareByHIterator(uMap, hMap); // - populateBySerialIntKeys(uMap, hMap, testSize); compareByUIterator(uMap, hMap); compareByHIterator(uMap, hMap); // depopulateByIterator(uMap, hMap, 20); compareByUIterator(uMap, hMap); compareByHIterator(uMap, hMap); } catch (Exception e) { failed = true; } assertTrue(!failed); } public void testIntKeyHashMap() throws Exception { boolean failed = false; int testSize = 33; org.hsqldb.lib.IntKeyHashMap hIntMap = new org.hsqldb.lib.IntKeyHashMap(); java.util.HashMap uMap = new java.util.HashMap(); try { populateBySerialIntKeysInt(uMap, hIntMap, testSize); compareByUIteratorInt(uMap, hIntMap); populateByRandomIntKeysInt(uMap, hIntMap, testSize); compareByUIteratorInt(uMap, hIntMap); compareByHIteratorInt(uMap, hIntMap); // depopulateByIntIterator(uMap, hIntMap, 20); compareByUIteratorInt(uMap, hIntMap); compareByHIteratorInt(uMap, hIntMap); // clearByIntIterator(uMap, hIntMap); compareByUIteratorInt(uMap, hIntMap); compareByHIteratorInt(uMap, hIntMap); // - populateBySerialIntKeysInt(uMap, hIntMap, testSize); compareByUIteratorInt(uMap, hIntMap); compareByHIteratorInt(uMap, hIntMap); // clearByIntIterator(uMap, hIntMap); compareByUIteratorInt(uMap, hIntMap); compareByHIteratorInt(uMap, hIntMap); } catch (Exception e) { failed = true; } assertTrue(!failed); } public void testHashMappedList() throws Exception { boolean failed = false; int testSize = 33; org.hsqldb.lib.HashMappedList hMap = new org.hsqldb.lib.HashMappedList(); java.util.HashMap uMap = new java.util.HashMap(); try { populateBySerialIntKeys(uMap, hMap, testSize); compareByUIterator(uMap, hMap); compareByHIterator(uMap, hMap); populateByRandomIntKeys(uMap, hMap, testSize); compareByUIterator(uMap, hMap); compareByHIterator(uMap, hMap); depopulateRandomly(uMap, hMap, 20); compareByUIterator(uMap, hMap); compareByHIterator(uMap, hMap); populateByRandomIntKeys(uMap, hMap, testSize); compareByUIterator(uMap, hMap); compareByHIterator(uMap, hMap); depopulateRandomly(uMap, hMap, 20); populateBySerialIntKeys(uMap, hMap, testSize); compareByUIterator(uMap, hMap); compareByHIterator(uMap, hMap); } catch (Exception e) { failed = true; } assertTrue(!failed); } public void testDoubleIntLookup() throws Exception { boolean failed = false; int testSize = 512; org.hsqldb.lib.IntKeyHashMap hIntMap = new org.hsqldb.lib.IntKeyHashMap(); DoubleIntIndex intLookup = new DoubleIntIndex(12, false); try { intLookup.setKeysSearchTarget(); populateBySerialIntKeysInt(intLookup, hIntMap, testSize); compareByHIteratorInt(intLookup, hIntMap); populateByRandomIntKeysInt(intLookup, hIntMap, testSize); compareByHIteratorInt(intLookup, hIntMap); } catch (Exception e) { failed = true; } assertTrue(!failed); } public void testDoubleIntSpeed() throws Exception { boolean failed = false; int testSize = 500; org.hsqldb.lib.IntKeyHashMap hIntMap = new org.hsqldb.lib.IntKeyHashMap(); DoubleIntIndex intLookup = new DoubleIntIndex(testSize, false); intLookup.setKeysSearchTarget(); populateByRandomIntKeysInt(intLookup, hIntMap, testSize); compareByHIteratorInt(intLookup, hIntMap); int[] sample = getSampleIntArray(intLookup, 100); int[] sampleVals = new int[sample.length]; int i = 0; int j = 0; StopWatch sw = new StopWatch(); try { for (j = 0; j < 10000; j++) { for (i = 0; i < sample.length; i++) { int pos = intLookup.findFirstEqualKeyIndex(sample[i]); sampleVals[i] = intLookup.getValue(pos); intLookup.remove(pos); } for (i = 0; i < sample.length; i++) { intLookup.addUnique(sample[i], sampleVals[i]); } } System.out.println( sw.elapsedTimeToMessage("Double int table times")); intLookup.findFirstEqualKeyIndex(0); // sort compareByHIteratorInt(intLookup, hIntMap); } catch (Exception e) { System.out.println( sw.elapsedTimeToMessage("Double int table error: i =" + i)); failed = true; } assertTrue(!failed); } int[] getSampleIntArray(org.hsqldb.lib.DoubleIntIndex index, int size) { int[] array = new int[size]; org.hsqldb.lib.IntKeyHashMap map = new org.hsqldb.lib.IntKeyHashMap(); for (; map.size() < size; ) { int pos = nextIntRandom(randomgen, index.size()); map.put(pos, null); } org.hsqldb.lib.Iterator it = map.keySet().iterator(); for (int i = 0; i < size; i++) { int pos = it.nextInt(); array[i] = index.getKey(pos); } return array; } void populateBySerialIntKeys(java.util.HashMap uMap, org.hsqldb.lib.HashMap hMap, int testSize) throws Exception { for (int i = 0; i < testSize; i++) { int intValue = randomgen.nextInt(); uMap.put(new Integer(i), new Integer(intValue)); hMap.put(new Integer(i), new Integer(intValue)); if (uMap.size() != hMap.size()) { throw new Exception("HashMap size mismatch"); } } } void populateBySerialIntKeysInt(java.util.HashMap uMap, org.hsqldb.lib.IntKeyHashMap hMap, int testSize) throws Exception { for (int i = 0; i < testSize; i++) { int intValue = randomgen.nextInt(); uMap.put(new Integer(i), new Integer(intValue)); hMap.put(i, new Integer(intValue)); if (uMap.size() != hMap.size()) { throw new Exception("HashMap size mismatch"); } } } void populateBySerialIntKeysInt(DoubleIntIndex intLookup, org.hsqldb.lib.IntKeyHashMap hMap, int testSize) throws Exception { for (int i = 0; i < testSize; i++) { int intValue = randomgen.nextInt(); intLookup.addUnique(i, intValue); hMap.put(i, new Integer(intValue)); if (intLookup.size() != hMap.size()) { throw new Exception("HashMap size mismatch"); } } } void populateByRandomIntKeysInt(DoubleIntIndex intLookup, org.hsqldb.lib.IntKeyHashMap hMap, int testSize) throws Exception { for (int i = 0; i < testSize; i++) { int intValue = randomgen.nextInt(); intLookup.addUnique(intValue, i); hMap.put(intValue, new Integer(i)); // actually this can happen as duplicates are allowed in DoubleIntTable if (intLookup.size() != hMap.size()) { throw new Exception("Duplicate random in int lookup"); } } } void populateByRandomIntKeys(java.util.HashMap uMap, org.hsqldb.lib.HashMap hMap, int testSize) throws Exception { for (int i = 0; i < testSize; i++) { int intValue = randomgen.nextInt(); uMap.put(new Integer(intValue), new Integer(i)); hMap.put(new Integer(intValue), new Integer(i)); if (uMap.size() != hMap.size()) { throw new Exception("HashMap size mismatch"); } } } void populateByRandomIntKeysInt(java.util.HashMap uMap, org.hsqldb.lib.IntKeyHashMap hMap, int testSize) throws Exception { for (int i = 0; i < testSize; i++) { int intValue = randomgen.nextInt(); uMap.put(new Integer(intValue), new Integer(i)); hMap.put(intValue, new Integer(i)); if (uMap.size() != hMap.size()) { throw new Exception("HashMap size mismatch"); } } } void depopulateRandomly(java.util.HashMap uMap, org.hsqldb.lib.HashMap hMap, int testCount) throws Exception { int removeCount = 0; int size = uMap.size(); if (testCount > size / 2) { testCount = size / 2; } while (removeCount < testCount) { java.util.Iterator uIt = uMap.keySet().iterator(); for (int i = 0; uIt.hasNext(); i++) { Object uKey = uIt.next(); int intValue = randomgen.nextInt(size); if (intValue == i) { uIt.remove(); hMap.remove(uKey); removeCount++; } if (uMap.size() != hMap.size()) { throw new Exception("HashMap size mismatch"); } } } } void depopulateByIterator(java.util.HashMap uMap, org.hsqldb.lib.HashMap hMap, int testCount) throws Exception { org.hsqldb.lib.Iterator hIt = hMap.keySet().iterator(); System.out.println(uMap.size()); for (int i = 0; hIt.hasNext(); i++) { Object key = hIt.next(); int check = randomgen.nextInt(2); if (check == i % 2) { hIt.remove(); uMap.remove(key); } if (uMap.size() != hMap.size()) { throw new Exception("HashMap size mismatch"); } } System.out.println(uMap.size()); } void depopulateByIntIterator(java.util.HashMap uMap, org.hsqldb.lib.IntKeyHashMap hIntMap, int testCount) throws Exception { org.hsqldb.lib.Iterator hIt = hIntMap.keySet().iterator(); System.out.println(uMap.size()); for (int i = 0; hIt.hasNext(); i++) { Object key = new Integer(hIt.nextInt()); int check = randomgen.nextInt(2); if (check == i % 2) { hIt.remove(); uMap.remove(key); } if (uMap.size() != hIntMap.size()) { throw new Exception("HashMap size mismatch"); } } System.out.println(uMap.size()); } void clearByIntIterator(java.util.HashMap uMap, org.hsqldb.lib.IntKeyHashMap hIntMap) throws Exception { org.hsqldb.lib.Iterator hIt = hIntMap.keySet().iterator(); System.out.println(uMap.size()); for (int i = 0; hIt.hasNext(); i++) { Object key = new Integer(hIt.nextInt()); hIt.remove(); uMap.remove(key); if (uMap.size() != hIntMap.size()) { throw new Exception("HashMap size mismatch"); } } System.out.println(uMap.size()); } void compareByUIterator(java.util.HashMap uMap, org.hsqldb.lib.HashMap hMap) throws Exception { java.util.Iterator uIt = uMap.keySet().iterator(); for (int i = 0; uIt.hasNext(); i++) { Object uKey = uIt.next(); Object oU = uMap.get(uKey); Object hU = hMap.get(uKey); if (!oU.equals(hU)) { throw new Exception("HashMap value mismatch"); } } } void compareByHIterator(java.util.HashMap uMap, org.hsqldb.lib.HashMap hMap) throws Exception { org.hsqldb.lib.Iterator hIt = hMap.keySet().iterator(); for (int i = 0; hIt.hasNext(); i++) { Object hKey = hIt.next(); Object oU = uMap.get(hKey); Object hU = hMap.get(hKey); if (!oU.equals(hU)) { throw new Exception("HashMap value mismatch"); } } } void compareByUIteratorInt(java.util.HashMap uMap, org.hsqldb.lib.IntKeyHashMap hMap) throws Exception { java.util.Iterator uIt = uMap.keySet().iterator(); for (int i = 0; uIt.hasNext(); i++) { Object uKey = uIt.next(); Object oU = uMap.get(uKey); Object hU = hMap.get(((Integer) uKey).intValue()); if (!oU.equals(hU)) { throw new Exception("HashMap value mismatch"); } } } void compareByHIteratorInt(java.util.HashMap uMap, org.hsqldb.lib.IntKeyHashMap hMap) throws Exception { org.hsqldb.lib.Iterator hIt = hMap.keySet().iterator(); for (int i = 0; hIt.hasNext(); i++) { Object hKey = new Integer(hIt.nextInt()); Object oU = uMap.get(hKey); Object hU = hMap.get(((Integer) hKey).intValue()); if (!oU.equals(hU)) { throw new Exception("HashMap value mismatch"); } } } void compareByHIteratorInt(DoubleIntIndex intLookup, org.hsqldb.lib.IntKeyHashMap hMap) throws Exception { org.hsqldb.lib.Iterator hIt = hMap.keySet().iterator(); for (int i = 0; hIt.hasNext(); i++) { int hK = hIt.nextInt(); int lookup = intLookup.findFirstEqualKeyIndex(hK); int lV = intLookup.getValue(lookup); Integer hV = (Integer) hMap.get(hK); if (hV.intValue() != lV) { throw new Exception("HashMap value mismatch"); } } } int nextIntRandom(Random r, int range) { int b = r.nextInt(); if (b == Integer.MIN_VALUE) { b = Integer.MAX_VALUE; } b = Math.abs(b); return b % range; } public static void main(String[] argv) { try { TestHashStructures test = new TestHashStructures("testHashMap"); test.testHashMap(); test.testIntKeyHashMap(); test.testHashMappedList(); test.testDoubleIntLookup(); test.testDoubleIntSpeed(); } catch (Exception e) { e.printStackTrace(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestCacheSize.java0000644000175000017500000010326412007547410023264 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.FileWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Random; import org.hsqldb.lib.FileUtil; import org.hsqldb.lib.StopWatch; import org.hsqldb.persist.HsqlProperties; /** * Test large cached tables by setting up a cached table of 100000 records * or more and a much smaller memory table with about 1/100th rows used. * Populate both tables so that an indexed column of the cached table has a * foreign key reference to the main table. * * This database can be used to demonstrate efficient queries to retrieve * the data from the cached table. * * 1.7.1 insert timings for 100000 rows, cache scale 12: * simple table, no extra index: 52 s * with index on lastname only: 56 s * with index on zip only: 211 s * foreign key, referential_integrity true: 216 s * * The above have improved a lot in 1.7.2 * * This test now incorporates the defunct TestTextTables * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.8.0 * @since 1.7.0 */ public class TestCacheSize { // program can edit the *.properties file to set cache_size, old files are deleted protected boolean filedb = true; // shutdown performed mid operation - not for mem: or hsql: URL's protected boolean shutdown = true; // fixed protected String url = "jdbc:hsqldb:"; // protected String filepath = "hsql://localhost/mytest"; // protected String filepath = "mem:test"; protected String filepath = "/hsql/testcache/test"; // frequent reporting of progress boolean reportProgress = true; // type of the big table {MEMORY | CACHED | TEXT | ""} String tableType = "CACHED"; int cacheScale = 14; int cacheSizeScale = 10; boolean nioMode = true; int writeDelay = 60; boolean indexZip = false; boolean indexLastName = false; boolean addForeignKey = false; boolean refIntegrity = true; // may speed up inserts when tableType=="CACHED" boolean createTempTable = false; // introduces fragmentation to the .data file during insert boolean deleteWhileInsert = false; int deleteWhileInsertInterval = 10000; // size of the tables used in test int bigrows = 4*256000; // number of ops int bigops = 4*256000; int smallops = 32000; int smallrows = 0xfff; // if the extra table needs to be created and filled up boolean multikeytable = false; // String user; String password; Statement sStatement; Connection cConnection; FileWriter writer; // String filler = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"; private void checkSelects() { countTestID(); selectID(); // selectZipTable(); } private void checkUpdates() { // updateIDLinear(); // updateID(); updateTestString(); countTestID(); deleteTest(); countTestID(); countZip(); } protected void setUp() { try { writer = new FileWriter("speedtests.html", true); writer.write("\n"); storeResult(new java.util.Date().toString(), 0, 0, 0); storeResult(filepath + " " + tableType + " " + nioMode, cacheScale, 0, 0); } catch (Exception e) {} user = "sa"; password = ""; try { sStatement = null; cConnection = null; Class.forName("org.hsqldb.jdbc.JDBCDriver"); if (filedb) { deleteDatabase(filepath); cConnection = DriverManager.getConnection(url + filepath, user, password); sStatement = cConnection.createStatement(); // sStatement.execute("SET FILES WRITE DELAY " + 2); sStatement.execute("SET FILES DEFRAG " + 0); sStatement.execute("SET FILES LOG SIZE " + 0); // sStatement.execute("SET FILES LOG FALSE"); sStatement.execute("SET DATABASE EVENT LOG LEVEL 1"); int cacheRows = (1 << cacheScale) * 3; int cacheSize = (1 << cacheSizeScale) * cacheRows / 1024; sStatement.execute("SET FILES CACHE ROWS " + cacheRows); sStatement.execute("SET FILES CACHE SIZE " + cacheSize); sStatement.execute("SET FILES NIO " + nioMode); sStatement.execute("SET FILES BACKUP INCREMENT " + true); sStatement.execute("SHUTDOWN"); cConnection.close(); } } catch (Exception e) { e.printStackTrace(); System.out.println("TestSql.setUp() error: " + e.getMessage()); } } /** * Fill up the cache * * */ public void testFillUp() { StopWatch sw = new StopWatch(); String ddl1 = "DROP TABLE test IF EXISTS"; String ddl11 = "DROP TABLE zip IF EXISTS"; String ddl2 = "CREATE TABLE zip( zip INT IDENTITY )"; String ddl3 = "CREATE " + tableType + " TABLE test( id INT IDENTITY," + " firstname VARCHAR(20), " + " lastname VARCHAR(20), " + " zip INTEGER, " + " filler VARCHAR(300))"; String ddl31 = "SET TABLE test SOURCE \"test.csv;cache_scale=" + cacheScale + "\""; // adding extra index will slow down inserts a bit String ddl4 = "CREATE INDEX idx1 ON TEST (lastname)"; // adding this index will slow down inserts a lot String ddl5 = "CREATE INDEX idx2 ON TEST (zip)"; // referential integrity checks will slow down inserts a bit String ddl6 = "ALTER TABLE test add constraint c1 FOREIGN KEY (zip) REFERENCES zip(zip) ON DELETE CASCADE;"; String ddl7 = "CREATE TEMP TABLE temptest( id INT," + " firstname VARCHAR, " + " lastname VARCHAR, " + " zip INTEGER, " + " filler VARCHAR)"; String mddl1 = "DROP TABLE test2 IF EXISTS"; String mddl2 = "CREATE " + tableType + " TABLE test2( id1 INT, id2 INT," + " firstname VARCHAR, " + " lastname VARCHAR, " + " zip INTEGER, " + " filler VARCHAR, " + " PRIMARY KEY (id1,id2) )"; String mdd13 = "SET TABLE test2 SOURCE \"test2.csv;cache_scale=" + cacheScale + "\""; try { // System.out.println("Connecting"); sw.zero(); cConnection = null; sStatement = null; cConnection = DriverManager.getConnection(url + filepath, user, password); System.out.println("connection time -- " + sw.elapsedTime()); sw.zero(); sStatement = cConnection.createStatement(); java.util.Random randomgen = new java.util.Random(); // sStatement.execute("SET WRITE_DELAY " + writeDelay); sStatement.execute(ddl1); sStatement.execute(ddl2); sStatement.execute(ddl3); if (tableType.equals("TEXT")) { sStatement.execute(ddl31); } // System.out.println("test table with no index"); if (indexLastName) { sStatement.execute(ddl4); System.out.println("created index on lastname"); } if (indexZip) { sStatement.execute(ddl5); System.out.println("created index on zip"); } if (addForeignKey) { sStatement.execute(ddl6); System.out.println("added foreign key"); } if (createTempTable) { sStatement.execute(ddl7); System.out.println("created temp table"); } if (multikeytable) { sStatement.execute(mddl1); sStatement.execute(mddl2); if (tableType.equals("TEXT")) { sStatement.execute(mdd13); } System.out.println("created multi key table"); } // sStatement.execute("CREATE INDEX idx3 ON tempTEST (zip);"); System.out.println("complete setup time -- " + sw.elapsedTime() + " ms"); fillUpBigTable(filler, randomgen); if (multikeytable) { fillUpMultiTable(filler, randomgen); } sw.zero(); if (shutdown) { sStatement.execute("SHUTDOWN"); long time = sw.elapsedTime(); storeResult("shutdown", 0, time, 0); System.out.println("shutdown time -- " + time + " ms"); } cConnection.close(); } catch (SQLException e) { System.out.println(e.getMessage()); } } private void fillUpBigTable(String filler, Random randomgen) throws SQLException { StopWatch sw = new StopWatch(); int i; PreparedStatement ps = cConnection.prepareStatement("INSERT INTO zip VALUES(?)"); for (i = 0; i <= smallrows; i++) { ps.setInt(1, i); ps.execute(); } ps.close(); sStatement.execute("SET DATABASE REFERENTIAL INTEGRITY " + this.refIntegrity); ps = cConnection.prepareStatement( "INSERT INTO test (firstname,lastname,zip,filler) VALUES (?,?,?,?)"); ps.setString(1, "Julia"); ps.setString(2, "Clancy"); for (i = 0; i < bigrows; i++) { ps.setInt(3, nextIntRandom(randomgen, smallrows)); { // small rows long nextrandom = randomgen.nextLong(); int randomlength = (int) nextrandom & 0x7f; if (randomlength > filler.length()) { randomlength = filler.length(); } String varfiller = filler.substring(0, randomlength); ps.setString(4, nextrandom + varfiller); } /* { // big rows long nextrandom = randomgen.nextLong(); int randomlength = (int) nextrandom & 0x7ff; if (randomlength > filler.length() * 20) { randomlength = filler.length() * 20; } StringBuffer sb = new StringBuffer(0xff); for (int j = 0; j < 20; j++) { sb.append(filler); } String varfiller = sb.substring(0, randomlength); ps.setString(4, nextrandom + varfiller); } */ ps.execute(); if (reportProgress && (i + 1) % 10000 == 0) { System.out.println("insert " + (i + 1) + " : " + sw.elapsedTime()); } // delete and add 4000 rows to introduce fragmentation if (deleteWhileInsert && i != 0 && i % deleteWhileInsertInterval == 0) { sStatement.execute("CALL IDENTITY();"); ResultSet rs = sStatement.getResultSet(); rs.next(); int lastId = rs.getInt(1); sStatement.execute( "SELECT * INTO TEMP tempt FROM test WHERE id > " + (lastId - 4000)); sStatement.execute("DELETE FROM test WHERE id > " + (lastId - 4000)); sStatement.execute("INSERT INTO test SELECT * FROM tempt"); sStatement.execute("DROP TABLE tempt"); } } ps.close(); // sStatement.execute("INSERT INTO test SELECT * FROM temptest;"); // sStatement.execute("DROP TABLE temptest;"); // sStatement.execute(ddl7); long time = sw.elapsedTime(); long rate = ((long) i * 1000) / (time + 1); storeResult("insert", i, time, rate); System.out.println("insert time for " + i + " rows -- " + time + " ms -- " + rate + " tps"); } private void fillUpMultiTable(String filler, Random randomgen) throws SQLException { StopWatch sw = new StopWatch(); int i; PreparedStatement ps = cConnection.prepareStatement( "INSERT INTO test2 (id1, id2, firstname,lastname,zip,filler) VALUES (?,?,?,?,?,?)"); ps.setString(3, "Julia"); ps.setString(4, "Clancy"); int id1 = 0; for (i = 0; i < bigrows; i++) { int id2 = nextIntRandom(randomgen, Integer.MAX_VALUE); if (i % 1000 == 0) { id1 = nextIntRandom(randomgen, Integer.MAX_VALUE); } ps.setInt(1, id1); ps.setInt(2, id2); ps.setInt(5, nextIntRandom(randomgen, smallrows)); long nextrandom = randomgen.nextLong(); int randomlength = (int) nextrandom & 0x7f; if (randomlength > filler.length()) { randomlength = filler.length(); } String varfiller = filler.substring(0, randomlength); ps.setString(6, nextrandom + varfiller); try { ps.execute(); } catch (SQLException e) { e.printStackTrace(); } if (reportProgress && (i + 1) % 10000 == 0) { System.out.println("insert " + (i + 1) + " : " + sw.elapsedTime()); } } ps.close(); System.out.println("total multi key rows inserted: " + i); System.out.println("insert time: " + sw.elapsedTime() + " rps: " + (i * 1000 / (sw.elapsedTime() + 1))); } protected void tearDown() { try { writer.write("\n
                  \n"); writer.close(); } catch (Exception e) {} } protected void checkResults() { try { StopWatch sw = new StopWatch(); ResultSet rs; cConnection = DriverManager.getConnection(url + filepath, user, password); long time = sw.elapsedTime(); storeResult("reopen", 0, time, 0); System.out.println("database reopen time -- " + time + " ms"); sw.zero(); sStatement = cConnection.createStatement(); // sStatement.execute("SET WRITE_DELAY " + writeDelay); checkSelects(); checkUpdates(); sw.zero(); if (shutdown) { sStatement.execute("SHUTDOWN"); time = sw.elapsedTime(); storeResult("shutdown", 0, time, 0); System.out.println("shutdown time -- " + time + " ms"); } cConnection.close(); // System.out.println("database close time -- " + sw.elapsedTime() + " ms"); } catch (SQLException e) { e.printStackTrace(); } } void selectZip() { StopWatch sw = new StopWatch(); java.util.Random randomgen = new java.util.Random(); int i = 0; boolean slow = false; try { PreparedStatement ps = cConnection.prepareStatement( "SELECT TOP 1 firstname,lastname,zip,filler FROM test WHERE zip = ?"); for (; i < bigops; i++) { ps.setInt(1, nextIntRandom(randomgen, smallrows)); ps.execute(); if ((i + 1) == 100 && sw.elapsedTime() > 50000) { slow = true; } if (reportProgress && (i + 1) % 10000 == 0 || (slow && (i + 1) % 100 == 0)) { System.out.println("Select " + (i + 1) + " : " + sw.elapsedTime() + " rps: " + (i * 1000 / (sw.elapsedTime() + 1))); } } } catch (SQLException e) { e.printStackTrace(); } long time = sw.elapsedTime(); long rate = ((long) i * 1000) / (time + 1); storeResult("select random zip", i, time, rate); System.out.println("select time for random zip " + i + " rows -- " + time + " ms -- " + rate + " tps"); } void selectID() { StopWatch sw = new StopWatch(); java.util.Random randomgen = new java.util.Random(); int i = 0; boolean slow = false; try { PreparedStatement ps = cConnection.prepareStatement( "SELECT firstname,lastname,zip,filler FROM test WHERE id = ?"); for (i = 0; i < smallops; i++) { ps.setInt(1, nextIntRandom(randomgen, bigrows - 1)); ps.execute(); if (reportProgress && (i + 1) % 10000 == 0 || (slow && (i + 1) % 100 == 0)) { System.out.println("Select " + (i + 1) + " : " + (sw.elapsedTime() + 1)); } } ps.close(); } catch (SQLException e) { e.printStackTrace(); } long time = sw.elapsedTime(); long rate = ((long) i * 1000) / (time + 1); storeResult("select random id", i, time, rate); System.out.println("select time for random id " + i + " rows -- " + time + " ms -- " + rate + " tps"); } void selectZipTable() { StopWatch sw = new StopWatch(); java.util.Random randomgen = new java.util.Random(); int i = 0; boolean slow = false; try { PreparedStatement ps = cConnection.prepareStatement( "SELECT zip FROM zip WHERE zip = ?"); for (i = 0; i < bigops; i++) { ps.setInt(1, nextIntRandom(randomgen, smallrows - 1)); ps.execute(); if (reportProgress && (i + 1) % 10000 == 0 || (slow && (i + 1) % 100 == 0)) { System.out.println("Select " + (i + 1) + " : " + (sw.elapsedTime() + 1)); } } ps.close(); } catch (SQLException e) { e.printStackTrace(); } long time = sw.elapsedTime(); long rate = ((long) i * 1000) / (time + 1); storeResult("select random zip (zip table)", i, time, rate); System.out.println("select time for random zip from zip table " + i + " rows -- " + time + " ms -- " + rate + " tps"); } private void countTestID() { try { StopWatch sw = new StopWatch(); // the tests use different indexes // use primary index sStatement.execute("SELECT count(*) from TEST where id > -1"); ResultSet rs = sStatement.getResultSet(); rs.next(); long time = sw.elapsedTime(); long rate = ((long) bigrows * 1000) / (time + 1); storeResult("count (index on id)", rs.getInt(1), time, rate); System.out.println("count time (index on id) " + rs.getInt(1) + " rows -- " + time + " ms -- " + rate + " tps"); sw.zero(); sStatement.execute("SELECT count(*) from TEST"); rs = sStatement.getResultSet(); rs.next(); time = sw.elapsedTime(); rate = (1000L) / (time + 1); storeResult("count (index on id)", rs.getInt(1), time, rate); System.out.println("count time (full count) " + rs.getInt(1) + " rows -- " + time + " ms -- " + rate + " tps"); } catch (SQLException e) {} } private void countTestZip() { try { StopWatch sw = new StopWatch(); sStatement.execute("SELECT count(*) from TEST where zip > -1"); ResultSet rs = sStatement.getResultSet(); rs.next(); long time = (long) sw.elapsedTime(); long rate = ((long) bigrows * 1000) / (time + 1); storeResult("count (index on zip)", rs.getInt(1), time, rate); System.out.println("count time (index on zip) " + rs.getInt(1) + " rows -- " + time + " ms -- " + rate + " tps"); } catch (SQLException e) {} } private void countZip() { try { StopWatch sw = new StopWatch(); sStatement.execute("SELECT count(*) from zip where zip > -1"); ResultSet rs = sStatement.getResultSet(); rs.next(); System.out.println("count time (zip table) " + rs.getInt(1) + " rows -- " + sw.elapsedTime() + " ms"); } catch (SQLException e) {} } private void updateZip() { StopWatch sw = new StopWatch(); java.util.Random randomgen = new java.util.Random(); int i = 0; boolean slow = false; int count = 0; int random = 0; try { PreparedStatement ps = cConnection.prepareStatement( "UPDATE test SET filler = filler || zip WHERE zip = ?"); for (; i < smallrows; i++) { random = nextIntRandom(randomgen, smallrows - 1); ps.setInt(1, random); count += ps.executeUpdate(); if (reportProgress && count % 10000 < 20) { System.out.println("Update " + count + " : " + (sw.elapsedTime() + 1)); } } ps.close(); } catch (SQLException e) { System.out.println("error : " + random); e.printStackTrace(); } long time = sw.elapsedTime(); long rate = (i * 1000) / (time + 1); storeResult("update with random zip", i, time, rate); System.out.println("update time with random zip " + i + " rows -- " + time + " ms -- " + rate + " tps"); } void updateID() { StopWatch sw = new StopWatch(); java.util.Random randomgen = new java.util.Random(); int i = 0; boolean slow = false; int count = 0; int random = 0; try { PreparedStatement ps = cConnection.prepareStatement( "UPDATE test SET zip = zip + 1 WHERE id = ? and zip <> " + smallrows); for (i = 0; i < smallops; i++) { random = nextIntRandom(randomgen, bigrows - 1); ps.setInt(1, random); ps.execute(); if (reportProgress && (i + 1) % 10000 == 0 || (slow && (i + 1) % 100 == 0)) { System.out.println("Update " + (i + 1) + " : " + sw.elapsedTime() + " rps: " + (i * 1000 / (sw.elapsedTime() + 1))); } } ps.close(); } catch (SQLException e) { System.out.println("error : " + random); e.printStackTrace(); } long time = sw.elapsedTime(); long rate = (i * 1000) / (time + 1); storeResult("update with random id", i, time, rate); System.out.println("update time with random id " + i + " rows -- " + time + " ms -- " + rate + " tps"); } void updateTestString() { StopWatch sw = new StopWatch(); java.util.Random randomgen = new java.util.Random(); int i = 0; boolean slow = false; int count = 0; int random = 0; try { PreparedStatement ps = cConnection.prepareStatement( "UPDATE test SET filler = ? WHERE id = ? and zip <> " + smallrows); for (i = 0; i < smallops * 2; i++) { random = nextIntRandom(randomgen, bigrows - 1); int randomLength = nextIntRandom(randomgen, filler.length()); String newFiller = filler.substring(randomLength); ps.setString(1, newFiller); ps.setInt(2, random); ps.execute(); if (reportProgress && (i + 1) % 10000 == 0 || (slow && (i + 1) % 100 == 0)) { System.out.println("Update " + (i + 1) + " : " + sw.elapsedTime() + " rps: " + (i * 1000 / (sw.elapsedTime() + 1))); } } ps.close(); } catch (SQLException e) { System.out.println("error : " + random); e.printStackTrace(); } long time = sw.elapsedTime(); long rate = (i * 1000) / (time + 1); storeResult("update with random id", i, time, rate); System.out.println("update time with random id " + i + " rows -- " + time + " ms -- " + rate + " tps"); } void updateIDLinear() { StopWatch sw = new StopWatch(); java.util.Random randomgen = new java.util.Random(); int i = 0; boolean slow = false; int count = 0; int random = 0; try { PreparedStatement ps = cConnection.prepareStatement( "UPDATE test SET zip = zip + 1 WHERE id = ? and zip <> " + smallrows); for (i = 0; i < bigops; i++) { random = i; ps.setInt(1, random); ps.execute(); if (reportProgress && (i + 1) % 10000 == 0 || (slow && (i + 1) % 100 == 0)) { System.out.println("Update " + (i + 1) + " : " + sw.elapsedTime() + " rps: " + (i * 1000 / (sw.elapsedTime() + 1))); } } ps.close(); } catch (SQLException e) { System.out.println("error : " + random); e.printStackTrace(); } long time = sw.elapsedTime(); long rate = (i * 1000) / (time + 1); storeResult("update with sequential id", i, time, rate); System.out.println("update time with sequential id " + i + " rows -- " + time + " ms -- " + rate + " tps"); } void deleteTest() { StopWatch sw = new StopWatch(); java.util.Random randomgen = new java.util.Random(); int i = 0; boolean slow = false; int count = 0; int random = 0; try { PreparedStatement ps = cConnection.prepareStatement("DELETE FROM test WHERE id = ?"); for (i = 0; count < smallops; i++) { random = nextIntRandom(randomgen, bigrows); // random = i; ps.setInt(1, random); count += ps.executeUpdate(); /* if ((i + 1) % 10000 == 0) { Statement st = cConnection.createStatement(); st.execute("CHECKPOINT DEFRAG"); st.close(); } */ if (reportProgress && (i + 1) % 10000 == 0 || (slow && (i + 1) % 100 == 0)) { System.out.println("delete " + (i + 1) + " : " + sw.elapsedTime() + " rps: " + (i * 1000 / (sw.elapsedTime() + 1))); } } ps.close(); } catch (SQLException e) { System.out.println("error : " + random); e.printStackTrace(); } long time = sw.elapsedTime(); long rate = (count * 1000) / (time + 1); storeResult("delete with random id", count, time, rate); System.out.println("delete time for random id " + count + " rows -- " + time + " ms -- " + rate + " tps"); } void deleteZipTable() { StopWatch sw = new StopWatch(); java.util.Random randomgen = new java.util.Random(); int i = 0; boolean slow = false; int count = 0; int random = 0; try { PreparedStatement ps = cConnection.prepareStatement("DELETE FROM zip WHERE zip = ?"); for (i = 0; i <= smallrows; i++) { // random = randomgen.nextInt(smallrows - 1); random = i; ps.setInt(1, random); count += ps.executeUpdate(); if (reportProgress && (i + 1) % 10000 == 0 || (slow && (i + 1) % 100 == 0)) { System.out.println("delete " + (i + 1) + " : " + sw.elapsedTime() + " rps: " + (i * 1000 / (sw.elapsedTime() + 1))); } } ps.close(); } catch (SQLException e) { System.out.println("error : " + random); e.printStackTrace(); } long time = sw.elapsedTime(); long rate = ((long) count * 1000) / (time + 1); storeResult("delete with random zip", count, time, rate); System.out.println("delete time for random zip " + count + " rows -- " + time + " ms -- " + rate + " tps"); } void storeResult(String description, int count, long time, long rate) { try { writer.write("" + description + "" + count + "" + time + "" + rate + "\n"); } catch (Exception e) {} } static void deleteDatabase(String path) { FileUtil fileUtil = FileUtil.getFileUtil(); fileUtil.delete(path + ".backup"); fileUtil.delete(path + ".properties"); fileUtil.delete(path + ".script"); fileUtil.delete(path + ".data"); fileUtil.delete(path + ".log"); fileUtil.delete(path + ".lck"); fileUtil.delete(path + ".csv"); } int nextIntRandom(Random r, int range) { int b = r.nextInt(); if (b == Integer.MIN_VALUE) { b = Integer.MAX_VALUE; } b = Math.abs(b); return b % range; } public static void main(String[] argv) { TestCacheSize test = new TestCacheSize(); HsqlProperties props = HsqlProperties.argArrayToProps(argv, "test"); test.bigops = props.getIntegerProperty("test.bigops", test.bigops); test.bigrows = test.bigops; test.smallops = test.bigops / 8; test.cacheScale = props.getIntegerProperty("test.scale", test.cacheScale); test.tableType = props.getProperty("test.tabletype", test.tableType); test.nioMode = props.isPropertyTrue("test.nio", test.nioMode); if (props.getProperty("test.dbtype", "").equals("mem")) { test.filepath = "mem:test"; test.filedb = false; test.shutdown = false; } test.setUp(); StopWatch sw = new StopWatch(); test.testFillUp(); test.checkResults(); long time = sw.elapsedTime(); test.storeResult("total test time", 0, (int) time, 0); System.out.println("total test time -- " + sw.elapsedTime() + " ms"); test.tearDown(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestBug785429.java0000644000175000017500000001270312007547410022643 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import junit.framework.TestCase; import junit.framework.TestResult; /** * Tests Bug 785429 concerning BINARY values as PreparedStatement parameters * * @author boucherb@users */ public class TestBug785429 extends TestBase { Statement stmt; Connection conn; public TestBug785429(String name) { super(name); } protected void setUp() { super.setUp(); try { conn = super.newConnection(); conn.setAutoCommit(false); stmt = conn.createStatement(); } catch (Exception e) {} } public void test() throws Exception { String sql; String msg; PreparedStatement ps; ResultSet rs; int rowcount = 0; stmt.executeUpdate("drop table testA if exists;"); stmt.executeUpdate("drop table testB if exists;"); stmt.executeUpdate("create table testA(oid binary(2), data integer);"); stmt.executeUpdate("create table testB(oid binary(2), data integer);"); stmt.executeUpdate("insert into testA values(X'0001',1);"); stmt.executeUpdate("insert into testB values(X'0001',1);"); sql = "select * from testA as ttt,(select oid,data from testB) as tst " + "where (tst.oid=ttt.oid) and (tst.oid=X'0001');"; rs = stmt.executeQuery(sql); rowcount = 0; while (rs.next()) { rowcount++; } msg = sql + ": row count:"; assertEquals(msg, 1, rowcount); stmt.execute("drop table testA if exists"); stmt.execute("drop table testB if exists"); stmt.execute("create table testA(oid binary(2), data integer)"); stmt.execute("create table testB(oid binary(2), data integer)"); byte[] oid = new byte[] { 0, 1 }; ps = conn.prepareStatement("insert into testA values(?,1)"); ps.setBytes(1, oid); ps.execute(); ps = conn.prepareStatement("insert into testB values (?,1)"); ps.setBytes(1, oid); ps.execute(); sql = "select * from testA as ttt,(select oid,data from testB) as tst " + "where (tst.oid=ttt.oid) and (tst.oid=?);"; try { ps = conn.prepareStatement(sql); } catch (Exception e) { e.printStackTrace(); } ps.setBytes(1, oid); rs = ps.executeQuery(); rowcount = 0; int colCount = rs.getMetaData().getColumnCount(); while (rs.next()) { // for (int i= 1; i <= colCount; i++) { // System.out.print(rs.getString(i) + ", "); // } // // System.out.println(); rowcount++; } msg = sql + ": row count:"; assertEquals(msg, 1, rowcount); } protected void tearDown() { try { stmt.execute("SHUTDOWN"); if (!isNetwork) { conn.close(); } } catch (Exception e) { e.printStackTrace(); System.out.println("TestSql.tearDown() error: " + e.getMessage()); } super.tearDown(); } public static void main(String[] args) throws Exception { TestResult result; TestCase test; java.util.Enumeration exceptions; java.util.Enumeration failures; int count; result = new TestResult(); test = new TestBug785429("test"); test.run(result); count = result.failureCount(); System.out.println("TestBug785429 failure count: " + count); failures = result.failures(); while (failures.hasMoreElements()) { System.out.println(failures.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/ClearTests.java0000644000175000017500000000433112007547410022632 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; class ClearTests { public static void main(String[] argv) { TestUtil.deleteDatabase("test"); TestUtil.deleteDatabase("test1"); TestUtil.deleteDatabase("test2"); TestUtil.deleteDatabase("test3"); TestUtil.deleteDatabase("/hsql/testbench/test"); TestUtil.deleteDatabase("/hsql/jdbcbench/test"); TestUtil.deleteDatabase("/hsql/test/subselect"); TestUtil.deleteDatabase("/hsql/test/testpersistent"); TestUtil.deleteDatabase("/hsql/testdima/test"); TestUtil.deleteDatabase("/hsql/testpa/test"); TestUtil.deleteDatabase("/hsql/testtime/test"); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestMultiInsert.java0000644000175000017500000001307512007547410023705 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.Enumeration; import junit.framework.TestCase; import junit.framework.TestResult; /** * Test multiple row insert statements via jdbc against in-memory database * @author Justin Spadea */ public class TestMultiInsert extends TestBase { Statement stmnt; PreparedStatement pstmnt; Connection connection; public TestMultiInsert(String name) { super(name); } protected void setUp() { super.setUp(); try { connection = super.newConnection(); stmnt = connection.createStatement(); } catch (Exception e) {} } private void printTable(String table, String cols, int expected) throws SQLException { int rows = 0; ResultSet rs = stmnt.executeQuery("SELECT " + cols + " FROM " + table); ResultSetMetaData rsmd = rs.getMetaData(); String result = "Table " + table + ", expecting " + expected + " rows total:\n"; while (rs.next()) { for (int i = 0; i < rsmd.getColumnCount(); i++) { result += rsmd.getColumnLabel(i + 1) + ":" + rs.getString(i + 1) + ":"; } result += "\n"; rows++; } rs.close(); System.out.println(result); assertEquals(expected, rows); } public void testMultiInsert() { try { // create table T and insert two rows simultaneously stmnt.execute("DROP TABLE T IF EXISTS;"); stmnt.execute( "CREATE TABLE T (I IDENTITY, A CHAR(10), B CHAR(10));"); stmnt.execute( "INSERT INTO T VALUES (NULL, 'A', 'a'),(NULL, 'B', 'b');"); // print table out - should have two rows printTable("T", "*", 2); // 3 inserts - a normal standard syntax, multi-row syntax for // single row, and multi-row syntax for two rows stmnt.execute("INSERT INTO T VALUES(NULL,'single1','s1');"); stmnt.execute("INSERT INTO T VALUES((NULL,'single2','s2'));"); stmnt.execute( "INSERT INTO T VALUES((NULL,'double1','d1'),(NULL,'double2','d2'));"); // print table out - should have 6 rows printTable("T", "*", 6); // insert via a prepared statement - both single and multi rows pstmnt = connection.prepareStatement("INSERT INTO T VALUES (?,?,?)"); pstmnt.setString(1, null); pstmnt.setString(2, "prepared1"); pstmnt.setString(3, "test1"); pstmnt.executeUpdate(); pstmnt = connection.prepareStatement("INSERT INTO T VALUES (?,?,?),(null,?,?)"); pstmnt.setString(1, null); pstmnt.setString(2, "prepared2"); pstmnt.setString(3, "test2"); pstmnt.setString(4, "prepared3"); pstmnt.setString(5, "test3"); pstmnt.executeUpdate(); // print table out - should have 9 rows printTable("T", "*", 9); } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMultiInsert complete"); } protected void tearDown() { try { connection.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("TestSql.tearDown() error: " + e.getMessage()); } super.tearDown(); } public static void main(String[] argv) { TestResult result = new TestResult(); TestCase testA = new TestMultiInsert("testMultiInsert"); testA.run(result); System.out.println("TestMultiInsert error count: " + result.failureCount()); Enumeration e = result.failures(); while(e.hasMoreElements()) System.out.println(e.nextElement()); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestSubselect.java0000644000175000017500000004155712007547410023365 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import junit.framework.TestCase; /** * Test cases for HSQL subselects. * * @author David Moles Apr 30, 2002 */ // fredt@users - modified to remove dependecy on DBUnit public class TestSubselect extends TestCase { //------------------------------------------------------------ // Class variables //------------------------------------------------------------ private static final String databaseDriver = "org.hsqldb.jdbc.JDBCDriver"; private static final String databaseURL = "jdbc:hsqldb:/hsql/test/subselect"; private static final String databaseUser = "sa"; private static final String databasePassword = ""; //------------------------------------------------------------ // Instance variables //------------------------------------------------------------ private Connection jdbcConnection; //------------------------------------------------------------ // Constructors //------------------------------------------------------------ /** * Constructs a new SubselectTest. */ public TestSubselect(String s) { super(s); } //------------------------------------------------------------ // Class methods //------------------------------------------------------------ protected static Connection getJDBCConnection() throws SQLException { return DriverManager.getConnection(databaseURL, databaseUser, databasePassword); } protected void setUp() throws Exception { TestUtil.deleteDatabase("/hsql/test/subselect"); Class.forName(databaseDriver); jdbcConnection = getJDBCConnection(); createDataset(); } protected void tearDown() throws Exception { jdbcConnection.close(); jdbcConnection = null; super.tearDown(); } void createDataset() throws SQLException { Statement statement = jdbcConnection.createStatement(); statement.execute("drop table colors if exists; " + "drop table sizes if exists; " + "drop table fruits if exists; " + "drop table trees if exists; "); statement.execute("create table colors(id int, val varchar(10)); "); statement.execute("insert into colors values(1,'red'); " + "insert into colors values(2,'green'); " + "insert into colors values(3,'orange'); " + "insert into colors values(4,'indigo'); "); statement.execute("create table sizes(id int, val varchar(10)); "); statement.execute("insert into sizes values(1,'small'); " + "insert into sizes values(2,'medium'); " + "insert into sizes values(3,'large'); " + "insert into sizes values(4,'odd'); "); statement.execute( "create table fruits(id int, name varchar(20), color_id int); "); statement.execute( "insert into fruits values(1, 'golden delicious',2); " + "insert into fruits values(2, 'macintosh',1); " + "insert into fruits values(3, 'red delicious',1); " + "insert into fruits values(4, 'granny smith',2); " + "insert into fruits values(5, 'tangerine',4);"); statement.execute( "create table trees(id int, name varchar(30), fruit_id int, size_id int); "); statement.execute( "insert into trees values(1, 'small golden delicious tree',1,1); " + "insert into trees values(2, 'large macintosh tree',2,3); " + "insert into trees values(3, 'large red delicious tree',3,3); " + "insert into trees values(4, 'small red delicious tree',3,1); " + "insert into trees values(5, 'medium granny smith tree',4,2); "); statement.close(); } //------------------------------------------------------------ // Helper methods //------------------------------------------------------------ private static void compareResults(String sql, String[] expected, Connection jdbcConnection) throws SQLException { Statement statement = jdbcConnection.createStatement(); ResultSet results = statement.executeQuery(sql); int rowCount = 0; while (results.next()) { assertTrue("Statement <" + sql + "> returned too many rows.", (rowCount < expected.length)); assertEquals("Statement <" + sql + "> returned wrong value.", expected[rowCount], results.getString(1)); rowCount++; } assertEquals("Statement <" + sql + "> returned wrong number of rows.", expected.length, rowCount); } //------------------------------------------------------------ // Test methods //------------------------------------------------------------ /** * This test is basically a sanity check of the data set. */ public void testSimpleJoin() throws SQLException { String sql = "select trees.id, trees.name, sizes.val, fruits.name, colors.val" + " from trees, sizes, fruits, colors" + " where trees.size_id = sizes.id" + " and trees.fruit_id = fruits.id" + " and fruits.color_id = colors.id" + " order by 1"; int expectedRows = 5; String[] expectedTrees = new String[] { "small golden delicious tree", "large macintosh tree", "large red delicious tree", "small red delicious tree", "medium granny smith tree" }; String[] expectedSizes = new String[] { "small", "large", "large", "small", "medium" }; String[] expectedFruits = new String[] { "golden delicious", "macintosh", "red delicious", "red delicious", "granny smith" }; String[] expectedColors = new String[] { "green", "red", "red", "red", "green" }; Statement statement = jdbcConnection.createStatement(); ResultSet results = statement.executeQuery(sql); String[] trees = new String[expectedRows]; String[] fruits = new String[expectedRows]; String[] sizes = new String[expectedRows]; String[] colors = new String[expectedRows]; int rowCount = 0; while (results.next()) { assertTrue("Statement <" + sql + "> returned too many rows.", (rowCount <= expectedRows)); assertEquals("Statement <" + sql + "> returned rows in wrong order.", (1 + rowCount), results.getInt(1)); assertEquals("Statement <" + sql + "> returned wrong value.", expectedTrees[rowCount], results.getString(2)); assertEquals("Statement <" + sql + "> returned wrong value.", expectedSizes[rowCount], results.getString(3)); assertEquals("Statement <" + sql + "> returned wrong value.", expectedFruits[rowCount], results.getString(4)); assertEquals("Statement <" + sql + "> returned wrong value.", expectedColors[rowCount], results.getString(5)); rowCount++; } assertEquals("Statement <" + sql + "> returned wrong number of rows.", expectedRows, rowCount); } /** * Inner select with where clause in outer select having column with same name as where clause in inner select */ public void testWhereClausesColliding() throws SQLException { String sql = "select name from fruits where id in (select fruit_id from trees where id < 3) order by name"; String[] expected = new String[] { "golden delicious", "macintosh" }; compareResults(sql, expected, jdbcConnection); } /** * As above, with table aliases. */ public void testWhereClausesCollidingWithAliases() throws SQLException { String sql = "select a.name from fruits a where a.id in (select b.fruit_id from trees b where b.id < 3) order by name"; String[] expected = new String[] { "golden delicious", "macintosh" }; compareResults(sql, expected, jdbcConnection); } /** * Inner select with two tables having columns with the same name, one of which is referred to in the * subselect, the other of which is not used in the query (both FRUITS and TREES have NAME column, * but we're only selecting FRUITS.NAME and we're not referring to TREES.NAME at all). */ public void testHiddenCollision() throws SQLException { String sql = "select name from fruits where id in (select fruit_id from trees) order by name"; String[] expected = new String[] { "golden delicious", "granny smith", "macintosh", "red delicious" }; compareResults(sql, expected, jdbcConnection); } /** * As above, with table aliases. */ public void testHiddenCollisionWithAliases() throws SQLException { String sql = "select a.name from fruits a where a.id in (select b.fruit_id from trees b) order by a.name"; String[] expected = new String[] { "golden delicious", "granny smith", "macintosh", "red delicious" }; compareResults(sql, expected, jdbcConnection); } /** * Inner select with where clause in outer select having column with same name as select clause in inner select */ public void testWhereSelectColliding() throws SQLException { // Yes, this is a nonsensical query String sql = "select val from colors where id in (select id from trees where fruit_id = 3) order by val"; String[] expected = new String[] { "indigo", "orange" }; compareResults(sql, expected, jdbcConnection); } /** * As above, with aliases. */ public void testWhereSelectCollidingWithAliases() throws SQLException { // Yes, this is a nonsensical query String sql = "select a.val from colors a where a.id in (select b.id from trees b where b.fruit_id = 3) order by a.val"; String[] expected = new String[] { "indigo", "orange" }; compareResults(sql, expected, jdbcConnection); } /** * Inner select involving same table */ public void testSameTable() throws SQLException { String sql = "select name from trees where id in (select id from trees where fruit_id = 3) order by name"; String[] expected = new String[] { "large red delicious tree", "small red delicious tree" }; compareResults(sql, expected, jdbcConnection); } /** * As above with aliases. */ public void testSameTableWithAliases() throws SQLException { String sql = "select a.name from trees a where a.id in (select b.id from trees b where b.fruit_id = 3) order by a.name"; String[] expected = new String[] { "large red delicious tree", "small red delicious tree" }; compareResults(sql, expected, jdbcConnection); } /** * Inner select involving same table as one of two joined tables in outer select */ public void testSameTableWithJoin() throws SQLException { String sql = "select sizes.val from trees, sizes where sizes.id = trees.size_id and trees.id in (select id from trees where fruit_id = 3) order by sizes.val"; String[] expected = new String[] { "large", "small" }; compareResults(sql, expected, jdbcConnection); } /** * Tests two subselects, anded. */ public void testAndedSubselects() throws SQLException { String sql = "select name from trees where size_id in (select id from sizes where val = 'large') and fruit_id in (select id from fruits where color_id = 1) order by name"; String[] expected = new String[] { "large macintosh tree", "large red delicious tree" }; compareResults(sql, expected, jdbcConnection); } /** * Test nested subselects. */ public void testNestedSubselects() throws SQLException { String sql = "select name from trees where fruit_id in (select id from fruits where color_id in (select id from colors where val = 'red')) order by name"; String[] expected = new String[] { "large macintosh tree", "large red delicious tree", "small red delicious tree" }; compareResults(sql, expected, jdbcConnection); } /** * Inner select with "not in" in outer select where clause. */ public void testNotIn() throws SQLException { String sql = "select name from fruits where id not in (select fruit_id from trees) order by name"; String[] expected = new String[]{ "tangerine" }; compareResults(sql, expected, jdbcConnection); } /** * Inner select with "not in" in outer select where clause and same table in inner select where clause. */ public void testNotInSameTableAndColumn() throws SQLException { String sql = "select name from fruits where id not in (select id from fruits where color_id > 1 ) order by name"; String[] expected = new String[] { "macintosh", "red delicious" }; compareResults(sql, expected, jdbcConnection); } /** * Inner select reusing alias names from outer select, but using them for different tables */ public void testAliasScope() throws SQLException { String sql = "select a.val, b.name from sizes a, trees b where a.id = b.size_id and b.id in (select a.id from trees a, fruits b where a.fruit_id = b.id and b.name='red delicious') order by a.val"; String[] expectedSizes = new String[] { "large", "small" }; String[] expectedTrees = new String[] { "large red delicious tree", "small red delicious tree" }; assertEquals( "Programmer error: expected arrays should be of equal length.", expectedSizes.length, expectedTrees.length); Statement statement = jdbcConnection.createStatement(); ResultSet results = statement.executeQuery(sql); int rowCount = 0; while (results.next()) { assertTrue("Statement <" + sql + "> returned too many rows.", (rowCount < expectedSizes.length)); assertEquals("Statement <" + sql + "> returned wrong value.", expectedSizes[rowCount], results.getString(1)); assertEquals("Statement <" + sql + "> returned wrong value.", expectedTrees[rowCount], results.getString(2)); rowCount++; } assertEquals("Statement <" + sql + "> returned wrong number of rows.", expectedSizes.length, rowCount); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestDatabaseMetaData.java0000644000175000017500000002604112007547410024530 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Types; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import junit.framework.TestResult; public class TestDatabaseMetaData extends TestBase { public TestDatabaseMetaData(String name) { super(name); } public void testOne() throws Exception { Connection conn = newConnection(); PreparedStatement pstmt; int updateCount; try { pstmt = conn.prepareStatement("DROP TABLE t1 IF EXISTS"); pstmt.executeUpdate(); pstmt.close(); pstmt = conn.prepareStatement( "CREATE TABLE t1 (cha CHARACTER, dec DECIMAL, doub DOUBLE, lon BIGINT, \"IN\" INTEGER, sma SMALLINT, tin TINYINT, " + "dat DATE DEFAULT CURRENT_DATE, tim TIME DEFAULT CURRENT_TIME, timest TIMESTAMP DEFAULT CURRENT_TIMESTAMP );"); updateCount = pstmt.executeUpdate(); assertTrue("expected update count of zero", updateCount == 0); pstmt = conn.prepareStatement("CREATE INDEX t1 ON t1 (cha );"); updateCount = pstmt.executeUpdate(); pstmt = conn.prepareStatement("DROP TABLE t2 IF EXISTS"); updateCount = pstmt.executeUpdate(); pstmt = conn.prepareStatement( "CREATE TABLE t2 (cha CHARACTER, dec DECIMAL, doub DOUBLE, lon BIGINT, \"IN\" INTEGER, sma SMALLINT, tin TINYINT, " + "dat DATE DEFAULT CURRENT_DATE, tim TIME DEFAULT CURRENT_TIME, timest TIMESTAMP DEFAULT CURRENT_TIMESTAMP );"); updateCount = pstmt.executeUpdate(); pstmt = conn.prepareStatement("CREATE INDEX t2 ON t2 (cha );"); updateCount = pstmt.executeUpdate(); DatabaseMetaData dbmd = conn.getMetaData(); ResultSet rsp = dbmd.getTablePrivileges(null, null, "T1"); while (rsp.next()) { System.out.println("Table: " + rsp.getString(3) + " priv: " + rsp.getString(6)); } rsp = dbmd.getIndexInfo(null, null, "T1", false, false); while (rsp.next()) { System.out.println("Table: " + rsp.getString(3) + " IndexName: " + rsp.getString(6)); } rsp = dbmd.getIndexInfo(null, null, "T2", false, false); while (rsp.next()) { System.out.println("Table: " + rsp.getString(3) + " IndexName: " + rsp.getString(6)); } pstmt = conn.prepareStatement("DROP INDEX t2;"); updateCount = pstmt.executeUpdate(); rsp = dbmd.getIndexInfo(null, null, "T2", false, false); assertTrue("expected getIndexInfo returns empty resultset", rsp.next() == false); ResultSet rs = dbmd.getTables(null, null, "T1", new String[]{ "TABLE" }); ArrayList tablesarr = new ArrayList(); int i; for (i = 0; rs.next(); i++) { String tempstr = rs.getString("TABLE_NAME").trim().toLowerCase(); tablesarr.add(tempstr); } rs.close(); assertTrue("expected table t1 count of 1", i == 1); Iterator it = tablesarr.iterator(); for (; it.hasNext(); ) { // create new ArrayList and HashMap for the table String tablename = ((String) it.next()).trim(); List collist = new ArrayList(30); rs = dbmd.getColumns(null, null, tablename.toUpperCase(), null); for (i = 0; rs.next(); i++) { collist.add( rs.getString("COLUMN_NAME").trim().toLowerCase()); } rs.close(); } pstmt = conn.prepareStatement("DROP TABLE t_1 IF EXISTS"); pstmt.executeUpdate(); pstmt.close(); pstmt = conn.prepareStatement( "CREATE TABLE t_1 (cha CHARACTER(10), deci DECIMAL(10,2), doub DOUBLE, lon BIGINT, \"IN\" INTEGER, sma SMALLINT, tin TINYINT, " + "dat DATE DEFAULT CURRENT_DATE, tim TIME DEFAULT CURRENT_TIME, timest TIMESTAMP DEFAULT CURRENT_TIMESTAMP, bool BOOLEAN );"); updateCount = pstmt.executeUpdate(); assertTrue("expected update count of zero", updateCount == 0); rs = dbmd.getTables(null, null, "T\\_1", new String[]{ "TABLE" }); for (i = 0; rs.next(); i++) { String tempstr = rs.getString("TABLE_NAME").trim().toLowerCase(); tablesarr.add(tempstr); } rs.close(); assertTrue("expected table t_1 count of 1", i == 1); // test various methods dbmd.getPrimaryKeys(null, null, "T_1"); dbmd.getImportedKeys(null, null, "T_1"); dbmd.getCrossReference(null, null, "T_1", null, null, "T_1"); // test ResultSetMetaData pstmt = conn.prepareStatement( "INSERT INTO T_1 (cha, deci, doub) VALUES ('name', 10.23, 0)"); pstmt.executeUpdate(); pstmt.close(); pstmt = conn.prepareStatement("SELECT * FROM T_1"); rs = pstmt.executeQuery(); ResultSetMetaData md = rs.getMetaData(); int x = md.getColumnDisplaySize(1); int y = md.getColumnDisplaySize(2); int b = md.getPrecision(2); int c = md.getScale(1); int d = md.getScale(2); String e = md.getColumnClassName(10); boolean testresult = (x == 10) && (y == 12) && (b == 10) && (c == 0) && (d == 2) && e.equals("java.sql.Timestamp"); assertTrue("wrong result metadata", testresult); e = md.getColumnClassName(11); testresult = e.equals("java.lang.Boolean"); assertTrue("wrong result metadata", testresult); pstmt.close(); // } catch (Exception e) { assertTrue("unable to prepare or execute DDL", false); } finally { conn.close(); } } /** * Basic test of DatabaseMetaData functions that access system tables */ public void testTwo() throws Exception { Connection conn = newConnection(); int updateCount; try { TestUtil.testScript(conn, "testrun/hsqldb/TestSelf.txt"); DatabaseMetaData dbmeta = conn.getMetaData(); dbmeta.allProceduresAreCallable(); dbmeta.getBestRowIdentifier(null, null, "T_1", DatabaseMetaData.bestRowTransaction, true); dbmeta.getCatalogs(); dbmeta.getColumnPrivileges(null, "PUBLIC", "T_1", "%"); dbmeta.getColumns("PUBLIC", "PUBLIC", "T_1", "%"); dbmeta.getCrossReference(null, null, "T_1", null, null, "T_1"); dbmeta.getExportedKeys(null, null, "T_1"); dbmeta.getFunctionColumns(null, "%", "%", "%"); dbmeta.getFunctions(null, "%", "%"); dbmeta.getImportedKeys("PUBLIC", "PUBLIC", "T_1"); dbmeta.getIndexInfo("PUBLIC", "PUBLIC", "T1", true, true); dbmeta.getPrimaryKeys("PUBLIC", "PUBLIC", "T_1"); dbmeta.getProcedureColumns(null, null, "%", "%"); dbmeta.getProcedures("PUBLIC", "%", "%"); dbmeta.getSchemas(null, "#"); dbmeta.getTablePrivileges(null, "%", "%"); dbmeta.getUDTs(null, "%", "%", new int[]{ Types.DISTINCT }); } catch (Exception e) { assertTrue("unable to prepare or execute DDL", false); } finally { conn.close(); } } /** * Basic test of DatabaseMetaData functions that access functions */ public void testThree() throws Exception { Connection conn = newConnection(); int updateCount; try { TestUtil.testScript(conn, "testrun/hsqldb/TestSelf.txt"); DatabaseMetaData dbmeta = conn.getMetaData(); int txIsolation = dbmeta.getDefaultTransactionIsolation(); String userName = dbmeta.getUserName(); boolean isReadOnly = dbmeta.isReadOnly(); } catch (Exception e) { assertTrue("unable to prepare or execute DDL", false); } finally { conn.close(); } } public static void main(String[] args) throws Exception { TestResult result; TestCase test; java.util.Enumeration failures; int count; result = new TestResult(); test = new TestDatabaseMetaData("test"); test.run(result); count = result.failureCount(); System.out.println("TestDatabaseMetaData failure count: " + count); failures = result.failures(); while (failures.hasMoreElements()) { System.out.println(failures.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestSqlPersistent.java0000644000175000017500000005140012007547410024240 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import junit.framework.TestCase; import junit.framework.TestResult; /** * Test sql statements via jdbc against a database with cached tables * @author Fred Toussi (fredt@users dot sourceforge.net) */ public class TestSqlPersistent extends TestCase { // change the url to reflect your preferred db location and name // String url = "jdbc:hsqldb:hsql://localhost/mytest"; String url = "jdbc:hsqldb:/hsql/test/testpersistent"; String user; String password; Statement stmnt; Connection connection; public TestSqlPersistent(String name) { super(name); } protected void setUp() throws Exception { super.setUp(); user = "sa"; password = ""; stmnt = null; connection = null; TestUtil.deleteDatabase("/hsql/test/testpersistent"); try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); connection = DriverManager.getConnection(url, user, password); stmnt = connection.createStatement(); } catch (Exception e) { e.printStackTrace(); System.out.println("TestSqlPersistence.setUp() error: " + e.getMessage()); } } /** * demonstration of bug fix #482109 - inserting Integers * and Strings with PreparedStatement.setObject() did not work; * String, Integer and Array types are inserted and retrieved * * demonstration of retrieving values using different getXXX methods */ public void testInsertObject() { Object stringValue = null; Object integerValue = null; Object arrayValue = null; Object bytearrayValue = null; Object stringValueResult = null; Object integerValueResult = null; Object arrayValueResult = null; boolean wasNull = false; String message = "DB operation completed"; try { String sqlString = "DROP TABLE PREFERENCE IF EXISTS;" + "CREATE CACHED TABLE PREFERENCE (" + "User_Id INTEGER NOT NULL, " + "Pref_Name VARCHAR(30) NOT NULL, " + "Pref_Value OBJECT NOT NULL, " + "DateCreated DATETIME DEFAULT NOW NOT NULL, " + "PRIMARY KEY(User_Id, Pref_Name) )"; stmnt.execute(sqlString); sqlString = "INSERT INTO PREFERENCE " + "(User_Id,Pref_Name,Pref_Value,DateCreated) " + "VALUES (?,?,?,current_timestamp)"; PreparedStatement ps = connection.prepareStatement(sqlString); // initialise stringValue = "String Value for Preference 1"; integerValue = new Integer(1000); arrayValue = new Double[] { new Double(1), new Double(Double.NaN), new Double(Double.NEGATIVE_INFINITY), new Double(Double.POSITIVE_INFINITY) }; bytearrayValue = new byte[] { 1, 2, 3, 4, 5, 6, }; // String as Object ps.setInt(1, 1); ps.setString(2, "String Type Object 1"); // fredt - in order to store Strings in OBJECT columns setObject should // explicitly be called with a Types.OTHER type // ps.setObject(3, stringValue); will throw an exception ps.setObject(3, stringValue, Types.OTHER); ps.execute(); // Integer as Object ps.setInt(1, 2); ps.setString(2, "Integer Type Object 2"); // ps.setObject(3, integerValue, Types.OTHER); should work too ps.setObject(3, integerValue); ps.execute(); // Array as object ps.setInt(1, 3); ps.setString(2, "Array Type Object 3"); /* ps.setCharacterStream( 2, new java.io.StringReader("Array Type Object 3"), 19); */ // ps.setObject(3, arrayValue, Types.OTHER); should work too ps.setObject(3, arrayValue); ps.execute(); // byte arrray as object ps.setInt(1, 3); ps.setString(2, "byte Array Type Object 3"); /* ps.setCharacterStream( 2, new java.io.StringReader("byte Array Type Object 3"), 19); */ // ps.setObject(3, bytearrayValue); will fail // must use this to indicate we are inserting into an OTHER column ps.setObject(3, bytearrayValue, Types.OTHER); ps.execute(); ResultSet rs = stmnt.executeQuery("SELECT * FROM PREFERENCE"); boolean result = rs.next(); // a string can be retrieved as a String or a stream // as Unicode string String str = rs.getString(2); System.out.println(str); // as Unicode stream InputStream is = rs.getUnicodeStream(2); int c; while ((c = is.read()) > -1) { c = is.read(); System.out.print((char) c); } System.out.println(); // as ASCII stream, ignoring the high order bytes is = rs.getAsciiStream(2); while ((c = is.read()) > -1) { System.out.print((char) c); } System.out.println(); // JAVA 2 specific // as character stream via a Reader /* Reader re = rs.getCharacterStream(2); while ((c = re.read()) > -1) { System.out.print((char) c); } */ // retrieving objects inserted into the third column stringValueResult = rs.getObject(3); rs.next(); integerValueResult = rs.getObject(3); rs.next(); arrayValueResult = rs.getObject(3); // how to check if the last retrieved value was null wasNull = rs.wasNull(); // cast objects to original types - will throw if type is wrong String castStringValue = (String) stringValueResult; Integer castIntegerValue = (Integer) integerValueResult; Double[] castDoubleArrayValue = (Double[]) arrayValueResult; { sqlString = "DELETE FROM PREFERENCE WHERE user_id = ?"; PreparedStatement st = connection.prepareStatement(sqlString); st.setString(1, "2"); int ret = st.executeUpdate(); // here, ret is equal to 1, that is expected //conn.commit(); // not needed, as far as AUTO_COMMIT is set to TRUE st.close(); st = connection.prepareStatement( "SELECT user_id FROM PREFERENCE WHERE user_id=?"); st.setString(1, "2"); rs = st.executeQuery(); while (rs.next()) { System.out.println(rs.getString(1)); } } } catch (SQLException e) { System.out.println(e.getMessage()); } catch (IOException e1) {} /* boolean success = stringValue.equals(stringValueResult) && integerValue.equals(integerValueResult) && java.util.Arrays.equals((Double[]) arrayValue, (Double[]) arrayValueResult); */ boolean success = true; assertEquals(true, success); } public void testSelectObject() throws IOException { String stringValue = null; Integer integerValue = null; Double[] arrayValue = null; byte[] byteArrayValue = null; String stringValueResult = null; Integer integerValueResult = null; Double[] arrayValueResult = null; boolean wasNull = false; String message = "DB operation completed"; try { String sqlString = "DROP TABLE TESTOBJECT IF EXISTS;" + "CREATE CACHED TABLE TESTOBJECT (" + "ID INTEGER NOT NULL IDENTITY, " + "STOREDOBJECT OTHER, STOREDBIN BINARY(100) )"; stmnt.execute(sqlString); sqlString = "INSERT INTO TESTOBJECT " + "(STOREDOBJECT, STOREDBIN) " + "VALUES (?,?)"; PreparedStatement ps = connection.prepareStatement(sqlString); // initialise stringValue = "Test String Value"; integerValue = new Integer(1000); arrayValue = new Double[] { new Double(1), new Double(Double.NaN), new Double(Double.NEGATIVE_INFINITY), new Double(Double.POSITIVE_INFINITY) }; byteArrayValue = new byte[] { 1, 2, 3 }; // String as Object // fredt - in order to store Strings in OBJECT columns setObject should // explicitly be called with a Types.OTHER type ps.setObject(1, stringValue, Types.OTHER); ps.setBytes(2, byteArrayValue); ps.execute(); // Integer as Object ps.setObject(1, integerValue, Types.OTHER); ps.setBinaryStream(2, new ByteArrayInputStream(byteArrayValue), byteArrayValue.length); ps.execute(); // Array as object ps.setObject(1, arrayValue, Types.OTHER); // file as binary - works fine but file path and name has to be modified for test environment /* int length = (int) new File("c://ft/db.jar").length(); FileInputStream fis = new FileInputStream("c://ft/db.jar"); ps.setBinaryStream(2,fis,length); */ ps.execute(); ResultSet rs = stmnt.executeQuery("SELECT * FROM TESTOBJECT"); boolean result = rs.next(); // retrieving objects inserted into the third column stringValueResult = (String) rs.getObject(2); rs.next(); integerValueResult = (Integer) rs.getObject(2); rs.next(); arrayValueResult = (Double[]) rs.getObject(2); // cast objects to original types - will throw if type is wrong String castStringValue = (String) stringValueResult; Integer castIntegerValue = (Integer) integerValueResult; Double[] castDoubleArrayValue = (Double[]) arrayValueResult; for (int i = 0; i < arrayValue.length; i++) { if (!arrayValue[i].equals(arrayValueResult[i])) { System.out.println("array mismatch: " + arrayValue[i] + " : " + arrayValueResult[i]); } } rs.close(); ps.close(); sqlString = "SELECT * FROM TESTOBJECT WHERE STOREDOBJECT = ?"; ps = connection.prepareStatement(sqlString); ps.setObject(1, new Integer(1000)); rs = ps.executeQuery(); rs.next(); Object returnVal = rs.getObject(2); rs.next(); } catch (SQLException e) { System.out.println(e.getMessage()); } boolean success = stringValue.equals(stringValueResult) && integerValue.equals(integerValueResult) && java.util.Arrays.equals((Double[]) arrayValue, (Double[]) arrayValueResult); assertEquals(true, success); try { String sqlString = "drop table objects if exists"; PreparedStatement ps = connection.prepareStatement(sqlString); ps.execute(); sqlString = "create cached table objects (object_id INTEGER IDENTITY," + "object_name VARCHAR(128) NOT NULL,role_name VARCHAR(128) NOT NULL," + "value LONGVARBINARY(1000) NOT NULL,description LONGVARCHAR(1000))"; ps = connection.prepareStatement(sqlString); ps.execute(); sqlString = "INSERT INTO objects VALUES(1, 'name','role',?,'description')"; ps = connection.prepareStatement(sqlString); ps.setBytes(1, new byte[] { 1, 2, 3, 4, 5 }); ps.executeUpdate(); sqlString = "UPDATE objects SET value = ?, description = ? WHERE " + "object_name = ? AND role_name = ?"; ps = connection.prepareStatement(sqlString); ps.setBytes(1, new byte[] { 1, 2, 3, 4, 5 }); ps.setString(2, "desc"); ps.setString(3, "new"); ps.setString(4, "role"); ps.executeUpdate(); } catch (SQLException e) { System.out.println(e.getMessage()); } } public void testDoubleNaN() { doTestDoubleNan(false); } private void doTestDoubleNan(boolean shutdown) { double value = 0; boolean wasEqual = false; String message = "DB operation completed"; String ddl1 = "DROP TABLE t1 IF EXISTS;" + "CREATE TABLE t1 ( d DECIMAL, f DOUBLE, l BIGINT, i INTEGER, s SMALLINT, t TINYINT, " + "dt DATE DEFAULT CURRENT_DATE, ti TIME DEFAULT CURRENT_TIME, ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP );"; try { stmnt.execute(ddl1); PreparedStatement ps = connection.prepareStatement( "INSERT INTO t1 (d,f,l,i,s,t,dt,ti,ts) VALUES (?,?,?,?,?,?,?,?,?)"); ps.setString(1, "0.2"); ps.setDouble(2, 0.2); ps.setLong(3, java.lang.Long.MAX_VALUE); ps.setInt(4, Integer.MAX_VALUE); ps.setInt(5, Short.MAX_VALUE); ps.setInt(6, 0); ps.setDate(7, new java.sql.Date(System.currentTimeMillis())); ps.setTime(8, new java.sql.Time(System.currentTimeMillis())); ps.setTimestamp( 9, new java.sql.Timestamp(System.currentTimeMillis())); ps.execute(); ps.setInt(1, 0); ps.setDouble(2, java.lang.Double.NaN); ps.setLong(3, java.lang.Long.MIN_VALUE); ps.setInt(4, Integer.MIN_VALUE); ps.setInt(5, Short.MIN_VALUE); ps.setInt(6, 0); // allowed conversions ps.setTimestamp( 7, new java.sql.Timestamp(System.currentTimeMillis() + 1)); ps.setTime(8, new java.sql.Time(System.currentTimeMillis() + 1)); ps.setDate(9, new java.sql.Date(System.currentTimeMillis() + 1)); ps.execute(); // ps.setInt(1, 0); ps.setDouble(2, java.lang.Double.POSITIVE_INFINITY); ps.setInt(4, Integer.MIN_VALUE); // test conversion // ps.setObject(5, Boolean.TRUE); // no longer converts boolean to int // ps.setBoolean(5, true); ps.setObject(5, new Short((short) 2), Types.SMALLINT); ps.setObject(6, new Integer(2), Types.TINYINT); // allowed conversions ps.setObject(7, new java.sql.Date(System.currentTimeMillis() + 2)); ps.setObject(8, new java.sql.Time(System.currentTimeMillis() + 2)); ps.setObject(9, new java.sql.Timestamp(System.currentTimeMillis() + 2)); ps.execute(); ps.setObject(1, new Float(0), Types.INTEGER); ps.setObject(4, new Float(1), Types.INTEGER); ps.setDouble(2, java.lang.Double.NEGATIVE_INFINITY); ps.execute(); ResultSet rs = stmnt.executeQuery("SELECT d, f, l, i, s*2, t FROM t1"); boolean result = rs.next(); value = rs.getDouble(2); // int smallintValue = rs.getShort(3); int integerValue = rs.getInt(4); if (rs.next()) { value = rs.getDouble(2); wasEqual = Double.isNaN(value); integerValue = rs.getInt(4); // tests for conversion // getInt on DECIMAL integerValue = rs.getInt(1); } if (rs.next()) { value = rs.getDouble(2); wasEqual = wasEqual && value == Double.POSITIVE_INFINITY; } if (rs.next()) { value = rs.getDouble(2); wasEqual = wasEqual && value == Double.NEGATIVE_INFINITY; } rs = stmnt.executeQuery("SELECT MAX(i) FROM t1"); if (rs.next()) { int max = rs.getInt(1); System.out.println("Max value for i: " + max); } try { // cause errors ps.setString(5, "three"); fail("update did not fail"); } catch (SQLException e) {} { stmnt.execute("drop table CDTYPE if exists"); // test for the value MAX(column) in an empty table stmnt.execute( "CREATE TABLE cdType (ID INTEGER NOT NULL, name VARCHAR(50), PRIMARY KEY(ID))"); rs = stmnt.executeQuery("SELECT MAX(ID) FROM cdType"); if (rs.next()) { int max = rs.getInt(1); System.out.println("Max value for ID: " + max); } else { System.out.println("Max value for ID not returned"); } stmnt.executeUpdate( "INSERT INTO cdType VALUES (10,'Test String');"); stmnt.execute("CALL IDENTITY();"); try { stmnt.executeUpdate( "INSERT INTO cdType VALUES (10,'Test String');"); } catch (SQLException e1) { connection.rollback(); } } } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testDoubleNaN complete"); // assert new behaviour assertEquals(true, wasEqual); } protected void tearDown() { try { stmnt.execute("SHUTDOWN"); connection.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("TestSql.tearDown() error: " + e.getMessage()); } } public static void main(String[] argv) { TestResult result = new TestResult(); TestCase testC = new TestSqlPersistent("testInsertObject"); TestCase testD = new TestSqlPersistent("testSelectObject"); testC.run(result); testD.run(result); System.out.println("TestSqlPersistent error count: " + result.failureCount()); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestScriptRunner.java0000644000175000017500000003532412007547410024065 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.io.File; import java.io.Reader; import java.io.InputStreamReader; import java.io.IOException; import java.io.FileReader; import java.util.List; import java.util.Map; import java.util.HashMap; import java.util.ArrayList; import java.util.Iterator; import java.lang.reflect.Method; import org.hsqldb.test.TestUtil; import org.hsqldb.lib.RCData; /** * @see #main */ class TestScriptRunner { protected static final String DEFAULT_RCFILE = "testscriptrunner.rc"; public static String LS = System.getProperty("line.separator"); public static String SYNTAX_MSG = "java " + TestScriptRunner.class.getName() + " [--optionalSwitches...] --urlid=URLID1 [script1.tsql [[--urlid=URLIDX] scriptY.tsql...]...]" + LS + " Specify one input file name as '-' to read from stdin." + LS + " No scripts specified will read from only stdin." + LS + " Simple single-threaded example with RC file '" + DEFAULT_RCFILE + "':" + LS + "java " + TestScriptRunner.class.getName() + "--urlid=URLID script1.tsql script2.tsql" + LS + LS + "OPTIONAL SWITCHES:" + LS + " --verbose Obviously..." + LS + " --threads Each script runs in a parallel thread (dflt. sequential)." + LS + " --rcfile=/path/to/file.rc (Defaults to '" + DEFAULT_RCFILE + "')" + LS + " --populate Use TestCacheSize class to populate one database" + LS + " --sqltool=URLID Invoke an interactive SqlTool session on given URLID" + LS + "(This last is useful for troubleshooting and interactive script dev)."; public boolean verbose = false; public boolean threaded = false; /** * Executes specified SQL test scripts. * * Run java org.hsqldb.util.TestScriptRunner with no * args to display syntax help. * * The TestCacheSize database population uses the database details * as generated in TestCacheSize. It would be nice to get these * from the RC file, but alas, TestCacheSize does much magical work * based on components of the URL, for example. Therefore our user * must make a URLID definition to match that generated by * TestCacheSize for the DB type requested below. We must use that * as the URLID for scripts (and/or SqlTool session) which we want * to connect to the same database. */ public static void main(String[] sa) throws IOException, SQLException { // Make a copy if argv so we can change it safely int argIndex = 0; boolean threaded = false; boolean verbose = false; boolean populate = false; String rcFile = DEFAULT_RCFILE; Map scriptFileMap = new HashMap(); // scriptname -> URLID String currentUrlid = null; String sqlToolUrlid = null; Method sqlToolMainMethod = null; try { for (int i = 0; i < sa.length; i++) { if (sa[i].equals("--verbose")) { verbose = true; continue; } if (sa[i].equals("--threads")) { threaded = true; continue; } if (sa[i].equals("--populate")) { populate = true; continue; } if (sa[i].startsWith("--rcfile=")) { rcFile = sa[i].substring("--rcfile=".length()); continue; } if (sa[i].startsWith("--urlid=")) { currentUrlid = sa[i].substring("--urlid=".length()); continue; } if (sa[i].startsWith("--sqltool=")) { sqlToolUrlid = sa[i].substring("--sqltool=".length()); continue; } if (currentUrlid == null) { throw new IllegalArgumentException( "You must specify 'urlid' before script files."); } if (scriptFileMap.containsKey(sa[i])) throw new IllegalArgumentException( TestScriptRunner.class.getName() + " can't handle the same script name twice. " + "(Just copy or sym-link the script)."); scriptFileMap.put(sa[i], currentUrlid); } if (currentUrlid == null) throw new IllegalArgumentException(); if (scriptFileMap.size() < 1) { scriptFileMap.put("-", currentUrlid); } } catch (IllegalArgumentException e) { if (e.getMessage() != null) System.err.println(e.getMessage()); System.err.println(SYNTAX_MSG); System.exit(2); } if (sqlToolUrlid != null) { Class sqlToolClass = null; try { sqlToolClass = Class.forName("org.hsqldb.util.SqlTool"); } catch (Exception e) { System.err.println("SqlTool class not accessible. " + "Re-run without '--sqltool' switch."); System.exit(3); } try { sqlToolMainMethod = sqlToolClass. getMethod("objectMain", new Class[] {sa.getClass()} ); } catch (Exception e) { System.err.println("SqlTool integration failure: " + e); System.exit(3); } } TestScriptRunner runner = new TestScriptRunner(rcFile, scriptFileMap); runner.setVerbose(verbose); runner.setThreaded(threaded); TestCacheSize tcs = populate ? populate() : null; runner.establishConnections(); boolean success = runner.runScripts(); if (sqlToolMainMethod != null) try { sqlToolMainMethod.invoke(null, new Object[] { new String[] { "--rcfile=" + rcFile, sqlToolUrlid }}); } catch (Exception e) { System.err.println("SqlTool failed: " + e); e.printStackTrace(); } if (tcs != null) tcs.tearDown(); System.exit(success ? 0 : 1); } List scriptRuns = new ArrayList(); private class ScriptRun extends Thread { private Reader reader; private Connection conn = null; private RCData rcdata; private boolean success = false; public ScriptRun(String name, Reader reader, RCData rcdata) { super(name); this.reader = reader; this.rcdata = rcdata; } public boolean getSuccess() { return success; } public void connect() throws SQLException { if (conn != null) { throw new IllegalStateException("Thread '" + getName() + "' has already been connected"); } try { conn = rcdata.getConnection(); } catch (Exception e) { throw new RuntimeException( "Failed to connect to get JDBC connection for '" + getName() + "'", e); } conn.setAutoCommit(false); System.out.println("ScriptRun '" + getName() + "' connected with " + RCData.tiToString(conn.getTransactionIsolation()) + '.'); } public void run() { try { TestUtil.testScript(conn, getName(), reader); success = true; } catch (TestUtil.TestRuntimeException tre) { System.err.println("Script '" + getName() + "' failed"); } catch (IOException ioe) { System.err.println("Aborting thread for script '" + getName() + "' due to: " + ioe); throw new RuntimeException(ioe); } catch (SQLException se) { System.err.println("Aborting thread for script '" + getName() + "' due to: " + se); throw new RuntimeException(se); } finally { try { conn.close(); } catch (SQLException se) { System.err.println("Failed to close JDBC connection for '" + getName() + "': " + se); } } } } public void setVerbose(boolean verbose) { this.verbose = verbose; } public void setThreaded(boolean threaded) { this.threaded = threaded; } public TestScriptRunner(String rcFileString, Map scriptFileMap) throws IOException { TestUtil.setAbortOnErr(true); Map rcdataMap = new HashMap(); File rcFile = new File(rcFileString); if (!rcFile.isFile()) throw new IllegalArgumentException( "RC file '" + rcFileString + "' not a file"); String scriptPath, urlid; Iterator it; File file; Reader reader = null; it = scriptFileMap.values().iterator(); while (it.hasNext()) { urlid = (String) it.next(); if (rcdataMap.containsKey(urlid)) continue; try { rcdataMap.put(urlid, new RCData(rcFile, urlid)); } catch (Exception e) { throw new RuntimeException( "Failed to instantiate RCData with file '" + rcFile + "' for urlid '" + urlid + "'", e); } } it = scriptFileMap.keySet().iterator(); while (it.hasNext()) { scriptPath = (String) it.next(); urlid = (String) scriptFileMap.get(scriptPath); if (scriptPath.equals("-")) { reader = new InputStreamReader(System.in); } else { file = new File(scriptPath); if (!file.isFile()) throw new IOException("'" + file + "' is not a file"); if (!file.canRead()) throw new IOException("'" + file + "' is not readable"); reader = new FileReader(file); } scriptRuns.add(new ScriptRun(scriptPath, reader, (RCData) rcdataMap.get(urlid))); } } public void establishConnections() throws SQLException { for (int i = 0; i < scriptRuns.size(); i++) ((ScriptRun) scriptRuns.get(i)).connect(); if (verbose) System.out.println(Integer.toString(scriptRuns.size()) + " connection threads connected"); } public boolean runScripts() { ScriptRun scriptRun; for (int i = 0; i < scriptRuns.size(); i++) { scriptRun = (ScriptRun) scriptRuns.get(i); if (verbose) System.out.print("Starting " + (++i) + " / " + scriptRuns.size() + "..."); scriptRun.start(); if (verbose) System.out.println(" +"); if (!threaded) try { scriptRun.join(); } catch (InterruptedException ie) { throw new RuntimeException( "Interrupted while waiting for script '" + scriptRun.getName() + "' to execute", ie); } } if (threaded) { if (verbose) System.out.println( "All scripts started. Will now wait for them."); for (int i = 0; i < scriptRuns.size(); i++) try { ((ScriptRun) scriptRuns.get(i)).join(); } catch (InterruptedException ie) { throw new RuntimeException( "Interrupted while waiting for script to execute", ie); } } for (int i = 0; i < scriptRuns.size(); i++) { if (!((ScriptRun) scriptRuns.get(i)).getSuccess()) return false; } return true; } /** * Copied directly from TestCacheSize.main(). * * My goal is to configure population of this database by a properties * file, not by command line (which would just be too many settings * along with the main settings), nor by System Properties (ditto). * I see nothing in the TestCacheSize source code to allow loading by * a properties file, however. */ static protected TestCacheSize populate() { TestCacheSize test = new TestCacheSize(); /* Use all defaults HsqlProperties props = HsqlProperties.argArrayToProps(argv, "test"); test.bigops = props.getIntegerProperty("test.bigops", test.bigops); test.bigrows = test.bigops; test.smallops = test.bigops / 8; test.cacheScale = props.getIntegerProperty("test.scale", test.cacheScale); test.logType = props.getProperty("test.logtype", test.logType); test.tableType = props.getProperty("test.tabletype", test.tableType); test.nioMode = props.isPropertyTrue("test.nio", test.nioMode); */ test.filepath = "mem:test"; test.filedb = false; test.shutdown = false; test.setUp(); test.testFillUp(); //test.checkResults(); //System.out.println("total test time -- " + sw.elapsedTime() + " ms"); return test; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/AbstractTestOdbc.java0000644000175000017500000002072512007547410023761 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.server.Server; import org.hsqldb.server.ServerConstants; /** * Base test class for ODBC testing with JUnit 3.x. * * Provides utility testrunner method, plus sets up and runs a HyperSQL * listener. *

                  * You MUST have a native (non-Java) ODBC DSN configured with the HyperSQL * ODBC driver, DSN name "HSQLDB_UTEST", DSN database "/", port "9797". * The user name and password don't matter. * We use the word query how it is used in the JDBC API, to mean a * SELECT statement, not in the more general way as used in the ODBC API. *

                  * The DSN name and port may be changed from these defaults by setting Java * system properties "test.hsqlodbc.dsnname" and/or "test.hsqlodbc.port". *

                  * This class badly needs JUnit 4.x. * Test runs take about 50x as long as they should because JUnit 3.x does * not have a way to do one-time-per-class setUp and tearDown. * We should instantiate and start up the Server one time, and repopulate * the catalog contents in the traditional setUp(). *

                  */ public abstract class AbstractTestOdbc extends junit.framework.TestCase { protected Connection netConn = null; protected Server server = null; static protected String portString = null; static protected String dsnName = null; public AbstractTestOdbc() {} /** * Accommodate JUnit's test-runner conventions. */ public AbstractTestOdbc(String s) { super(s); } static { try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); } catch (ClassNotFoundException cnfe) { throw new RuntimeException( " failed. JDBC Driver class not in CLASSPATH"); } portString = System.getProperty("test.hsqlodbc.port"); dsnName = System.getProperty("test.hsqlodbc.dsnname"); if (portString == null) { portString = "9797"; } if (dsnName == null) { dsnName = "HSQLDB_UTEST"; } } /** * JUnit convention for cleanup. * * Called after each test*() method. */ protected void tearDown() throws SQLException { if (netConn != null) { netConn.rollback(); // Necessary to prevent the SHUTDOWN command from causing implied // transaction control commands, which will not be able to // complete. netConn.createStatement().executeUpdate("SHUTDOWN"); netConn.close(); netConn = null; try { Thread.sleep(1000); } catch (InterruptedException ie) { } } if (server != null && server.getState() != ServerConstants.SERVER_STATE_SHUTDOWN) { throw new RuntimeException("Server failed to shut down"); } } /** * Specifically, this opens a mem-only DB, populates it, starts a * HyperSQL Server to server it, and opens network JDBC Connection * "netConn" to it, * * Invoked before each test*() invocation by JUnit. */ protected void setUp() { try { Connection setupConn = DriverManager.getConnection( "jdbc:hsqldb:mem:test", "SA", ""); setupConn.setAutoCommit(false); Statement st = setupConn.createStatement(); st.executeUpdate("SET PASSWORD 'sapwd'"); populate(st); st.close(); setupConn.commit(); setupConn.close(); } catch (SQLException se) { throw new RuntimeException( "Failed to set up in-memory database", se); } try { server = new Server(); HsqlProperties properties = new HsqlProperties(); if (System.getProperty("VERBOSE") == null) { server.setLogWriter(null); server.setErrWriter(null); } else { properties.setProperty("server.silent", "false"); properties.setProperty("server.trace", "true"); } properties.setProperty("server.database.0", "mem:test"); properties.setProperty("server.dbname.0", ""); properties.setProperty("server.port", AbstractTestOdbc.portString); server.setProperties(properties); server.start(); try { Thread.sleep(1000); } catch (InterruptedException ie) { } } catch (Exception e) { throw new RuntimeException( "Failed to set up in-memory database", e); } if (server.getState() != ServerConstants.SERVER_STATE_ONLINE) { throw new RuntimeException("Server failed to start up"); } try { netConn = DriverManager.getConnection( "jdbc:odbc:" + dsnName, "SA", "sapwd"); //netConn.setAutoCommit(false); } catch (SQLException se) { if (se.getMessage().indexOf("No suitable driver") > -1) { throw new RuntimeException( "You must install the native library for Sun's jdbc:odbc " + "JDBC driver"); } if (se.getMessage().indexOf("Data source name not found") > -1) { throw new RuntimeException( "You must configure ODBC DSN '" + dsnName + "' (you may change the name and/or port by setting Java " + "system properties 'test.hsqlodbc.port' or " + "'test.hsqlodbc.dsnname'"); } throw new RuntimeException( "Failed to set up JDBC/ODBC network connection", se); } } protected void enableAutoCommit() { try { netConn.setAutoCommit(false); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } } /** * This method allows to easily run this unit test independent of the other * unit tests, and without dealing with Ant or unrelated test suites. * * Invoke like this:
                  
                       *  public static void main(String[] sa) {
                       *      staticRunner(TestOdbcService.class, sa);
                       *  }
                       *
                  , but give your subclass name in place of * TestOdbcService */ public static void staticRunner(Class c, String[] sa) { junit.textui.TestRunner runner = new junit.textui.TestRunner(); junit.framework.TestResult result = runner.run(runner.getTest(c.getName())); System.exit(result.wasSuccessful() ? 0 : 1); } abstract protected void populate(Statement st) throws SQLException; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/Waiter.java0000644000175000017500000001102712007547410022014 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.util.Map; import java.util.HashMap; /** * Single-use synchronization object. * * Design would be more scalable if there were a separate collection class, * instead of the static Waiter.map. The limitation is acceptable since * there's no use case for running multiple Test Runners simultaneously * from a single JVM (one Test runner can handle multiple test scripts * simultaneously or synchronously). * * (It would be much work to make the collection non-static, because that * would require a refactor of TestUtil with proper OOD). */ public class Waiter { /* static private HashMap map = new HashMap(); Java 5 */ static private Map map = new HashMap(); private String key; private boolean notified = false; // resume() method has been called private boolean waiting = false; // a client is waiting (in waitFor()). private boolean abort = false; // Make fail if partner failed public boolean isNotified() { return notified; } public boolean isWaiting() { return waiting; } private Waiter(String key) { this.key = key; map.put(key, this); } /** * @param enforceSequence Fail if waitFor() called before resume() */ public synchronized void waitFor(boolean enforceSequence) { if (abort) throw new RuntimeException("Notifier side failed previously"); if (notified) { if (enforceSequence) throw new RuntimeException( "Request to wait on '" + key + "', but this object has already been notified"); return; } waiting = true; try { wait(); } catch (InterruptedException ie) { throw new RuntimeException( "Unexpected interrupted while waiting for '" + key + "'", ie); } finally { waiting = false; } map.remove(this); if (!notified) throw new RuntimeException( "Exiting waitFor() on '" + key + "' even though not 'notified'"); } /** * @param enforceSequence Fail if waitFor() called before resume() */ public synchronized void resume(boolean enforceSequence) { if (enforceSequence && !waiting) { abort = true; throw new RuntimeException("Requested to resume on '" + key + " ', but nothing is waiting for it"); } notified = true; notify(); } /** * It doesn't matter if the waiter or the waitee runs getWaiter() * first. Whoever requests it first will instantiate it. * * @return A Waiter instance. Never returns nul. */ public synchronized static Waiter getWaiter(String key) { Waiter waiter = (Waiter) map.get(key); if (waiter == null) waiter = new Waiter(key); return waiter; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestMerge.java0000644000175000017500000003370312007547406022472 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.Enumeration; import junit.framework.TestCase; import junit.framework.TestResult; /** * Test merge statements via jdbc against in-memory database * @author Justin Spadea */ public class TestMerge extends TestBase { Statement stmnt; PreparedStatement pstmnt; Connection connection; public TestMerge(String name) { super(name); } protected void setUp() { super.setUp(); try { connection = super.newConnection(); stmnt = connection.createStatement(); } catch (Exception e) {} } /** * Prints a table displaying specified columns, and checks the expected * number of rows. */ private void printTable(String table, String cols, int expected) throws SQLException { int rows = 0; ResultSet rs = stmnt.executeQuery("SELECT " + cols + " FROM " + table); ResultSetMetaData rsmd = rs.getMetaData(); String result = "Table " + table + ", expecting " + expected + " rows total:\n"; while (rs.next()) { for (int i = 0; i < rsmd.getColumnCount(); i++) { result += rsmd.getColumnLabel(i + 1) + ":" + rs.getString(i + 1) + ":"; } result += "\n"; rows++; } rs.close(); System.out.println(result); assertEquals(expected, rows); } /** * Sets up tables T and S and executes MERGE query on them * @param sql * @throws SQLException */ private void executeMerge(String merge) throws SQLException { // create table T and insert some preliminary data stmnt.execute("DROP SCHEMA SA IF EXISTS CASCADE;"); stmnt.execute("CREATE SCHEMA SA AUTHORIZATION SA"); stmnt.execute("DROP TABLE SA.T IF EXISTS;"); stmnt.execute( "CREATE TABLE SA.T (I IDENTITY, A CHAR(10), B CHAR(10));"); stmnt.execute("INSERT INTO SA.T VALUES ((0, 'A', 'a')," + "(1, 'B', 'b'), (4, 'C', 'c'));"); // create table S and insert some preliminary data stmnt.execute("DROP TABLE SA.S IF EXISTS;"); stmnt.execute( "CREATE TABLE SA.S (I IDENTITY, A CHAR(10), B CHAR(10), C CHAR(10));"); stmnt.execute( "INSERT INTO SA.S VALUES ((0, 'D', 'd', 'Dd')," + "(2, 'E', 'e', 'Ee'), (3, 'F', 'f', 'Ff'), (4, 'G', 'g', 'Gg'));"); printTable("SA.T", "*", 3); printTable("SA.S", "*", 4); stmnt.execute(merge); } public void testMerge1() { try { // merge statement with table aliases, using both match statements executeMerge( "MERGE INTO SA.T X " + "USING SA.S AS Y " + "ON X.I = Y.I " + "WHEN MATCHED THEN " + "UPDATE SET X.A = Y.A, X.B = 'UPDATED' " + "WHEN NOT MATCHED THEN " + "INSERT (I, A, B) VALUES (Y.I, Y.A, 'INSERTED');" ); // table t should now have 5 rows, first and fifth with A/B updated // to values A/C from S, second should be the same, and third and // fourth should be the inserted rows that didn't exist before. printTable("SA.T", "*", 5); } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMerge1 complete\n"); } public void testMerge2() { try { // merge statement with only update statement executeMerge( "MERGE INTO SA.T " + "USING SA.S " + "ON T.I = S.I " + "WHEN MATCHED THEN " + "UPDATE SET T.A = S.A, T.B = 'UPDATED';" ); // two rows should be updated, nothing inserted printTable("SA.T", "*", 3); } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMerge2 complete\n"); } public void testMerge3() { try { // merge statement with only insert statement, without // specifying insert columns executeMerge( "MERGE INTO SA.T " + "USING SA.S " + "ON T.I = S.I " + "WHEN NOT MATCHED THEN " + "INSERT VALUES (S.I, S.A, 'INSERTED');" ); // two rows should be updated, nothing inserted printTable("SA.T", "*", 5); } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMerge3 complete\n"); } public void testMerge4() { try { // merge statement with both update and insert, without // specifying insert columns executeMerge( "MERGE INTO SA.T " + "USING SA.S " + "ON T.I = S.I " + "WHEN MATCHED THEN " + "UPDATE SET T.A = S.A, T.B = 'UPDATED' " + "WHEN NOT MATCHED THEN " + "INSERT VALUES (S.I, S.A, 'INSERTED');" ); // two rows should be updated, two rows inserted printTable("SA.T", "*", 5); } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMerge4 complete\n"); } public void testMerge5() { try { // merge statement with select statement as source table, using all // columns from S executeMerge( "MERGE INTO SA.T " + "USING (SELECT * FROM SA.S) AS X " + "ON T.I = X.I " + "WHEN MATCHED THEN " + "UPDATE SET T.A = X.A, T.B = 'UPDATED' " + "WHEN NOT MATCHED THEN " + "INSERT VALUES (X.I, X.A, 'INSERTED');" ); // two rows should be updated, two rows inserted printTable("SA.T", "*", 5); } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMerge5 complete\n"); } public void testMerge6() { try { // merge statement with select statement as source table, specifying // select columns from S executeMerge( "MERGE INTO SA.T " + "USING (SELECT I, A, C FROM SA.S) AS X " + "ON T.I = X.I " + "WHEN MATCHED THEN " + "UPDATE SET T.A = X.A, T.B = 'UPDATED' " + "WHEN NOT MATCHED THEN " + "INSERT VALUES (X.I, X.A, 'INSERTED');" ); // two rows should be updated, two rows inserted printTable("SA.T", "*", 5); } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMerge6 complete\n"); } public void testMerge7() { try { // merge statement with select statement as source table, with WHERE // condition that matches a row in T executeMerge( "MERGE INTO SA.T " + "USING (SELECT * FROM SA.S WHERE I = 4) AS X " + "ON T.I = X.I " + "WHEN MATCHED THEN " + "UPDATE SET T.A = X.A, T.B = 'UPDATED' " + "WHEN NOT MATCHED THEN " + "INSERT VALUES (X.I, X.A, 'INSERTED');" ); // 1 row should be updated printTable("SA.T", "*", 3); } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMerge7 complete\n"); } public void testMerge8() { try { // merge statement with select statement as source table, with WHERE // condition that does not match a row in T executeMerge( "MERGE INTO SA.T " + "USING (SELECT * FROM SA.S WHERE I = 3) AS X " + "ON T.I = X.I " + "WHEN MATCHED THEN " + "UPDATE SET T.A = X.A, T.B = 'UPDATED' " + "WHEN NOT MATCHED THEN " + "INSERT VALUES (X.I, X.A, 'INSERTED');" ); // 1 row should be inserted printTable("SA.T", "*", 4); } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMerge8 complete\n"); } public void testMerge9() { try { // merge statement with select statement as source table, with WHERE // condition that does and does not not match a row in T executeMerge( "MERGE INTO SA.T " + "USING (SELECT * FROM SA.S WHERE I > 2) AS X " + "ON T.I = X.I " + "WHEN MATCHED THEN " + "UPDATE SET T.A = X.A, T.B = 'UPDATED' " + "WHEN NOT MATCHED THEN " + "INSERT VALUES (X.I, X.A, 'INSERTED');" ); // 1 row should be inserted, 1 row updated printTable("SA.T", "*", 4); } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMerge9 complete\n"); } public void testMerge10() { try { // merge statement with values as source table, with WHERE // condition that does not not match a row in T executeMerge("MERGE INTO SA.T " + "USING (VALUES(10, 'testA', 'testB')) AS X (I, A, B) " + "ON T.I = X.I " + "WHEN MATCHED THEN " + "UPDATE SET T.A = X.A, T.B = 'UPDATED' " + "WHEN NOT MATCHED THEN " + "INSERT VALUES (X.I, X.A, 'INSERTED');"); // 1 row should be inserted printTable("SA.T", "*", 4); } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMerge10 complete\n"); } public void testMerge11() { try { executeMerge("SET SCHEMA PUBLIC"); PreparedStatement ps = connection.prepareStatement( "MERGE INTO SA.T " + "USING (VALUES(CAST(? AS INT), 'testA', 'testB')) AS X (I, A, B) " + "ON T.I = X.I " + "WHEN MATCHED THEN " + "UPDATE SET T.A = X.A, T.B = 'UPDATED' " + "WHEN NOT MATCHED THEN " + "INSERT VALUES (X.I, X.A, 'INSERTED');"); ps.setInt(1, 10); ps.executeUpdate(); // 1 row should be inserted printTable("SA.T", "*", 4); } catch (SQLException e) { fail(e.getMessage()); } System.out.println("testMerge10 complete\n"); } protected void tearDown() { try { stmnt.execute("DROP SCHEMA SA IF EXISTS CASCADE;"); connection.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("TestSql.tearDown() error: " + e.getMessage()); } super.tearDown(); } public static void main(String[] argv) { TestResult result = new TestResult(); TestCase testA = new TestMerge("testMerge1"); TestCase testB = new TestMerge("testMerge2"); TestCase testC = new TestMerge("testMerge3"); TestCase testD = new TestMerge("testMerge4"); TestCase testE = new TestMerge("testMerge5"); TestCase testF = new TestMerge("testMerge6"); TestCase testG = new TestMerge("testMerge7"); TestCase testH = new TestMerge("testMerge8"); TestCase testI = new TestMerge("testMerge9"); testA.run(result); testB.run(result); testC.run(result); testD.run(result); testE.run(result); testF.run(result); testG.run(result); testH.run(result); testI.run(result); System.out.println("TestMerge error count: " + result.failureCount()); Enumeration e = result.failures(); while (e.hasMoreElements()) { System.out.println(e.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestUpdatableResults.java0000644000175000017500000000663012007547406024715 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class TestUpdatableResults extends TestBase { public TestUpdatableResults(String name) { super(name); } public void testQuery() { try { Connection c = newConnection(); Statement st = c.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); String s = "CREATE TABLE T (I INTEGER, C CHARACTER(10), B BIT(4) DEFAULT B'')"; st.execute(s); s = "INSERT INTO T VALUES(?,?, DEFAULT)"; PreparedStatement ps = c.prepareStatement(s); for (int i = 1; i <= 20; i++) { ps.setInt(1, i); ps.setString(2, "TEST " + i); ps.execute(); } c.setAutoCommit(false); s = "SELECT * FROM T"; ResultSet rs = st.executeQuery(s); rs.absolute(10); rs.updateString(2, "UPDATE10"); rs.updateRow(); rs.absolute(11); rs.deleteRow(); rs.moveToInsertRow(); rs.updateInt(1, 1011); rs.updateString(2, "INSERT1011"); rs.updateString(3, "0101"); rs.insertRow(); rs.close(); rs = st.executeQuery(s); while (rs.next()) { System.out.println("" + rs.getInt(1) + " " + rs.getString(2) + " " + rs.getString(3)); } st.execute("SHUTDOWN"); if (!isNetwork) { c.close(); } } catch (Exception e) { System.out.print(e); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestINPredicateParameterizationAndCorrelation.java0000644000175000017500000001453112007547410031637 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import junit.framework.TestCase; import junit.framework.TestResult; /** * HSQLDB TestINPredicate Junit test case.

                  * * @author boucherb@users * @version 1.9.0 * @since 1.7.2 */ public class TestINPredicateParameterizationAndCorrelation extends TestBase { public TestINPredicateParameterizationAndCorrelation(String name) { super(name); } /* Implements the TestINPredicate test */ public void test() throws Exception { Connection conn = newConnection(); Statement stmt = conn.createStatement(); PreparedStatement pstmt; ResultSet rs; int actualCount; int expectedCount; String sql; stmt.execute("drop table test if exists"); sql = "create table test(id int)"; stmt.execute(sql); sql = "insert into test values(?)"; pstmt = conn.prepareStatement(sql); for (int i = 0; i < 10; i++) { pstmt.setInt(1, i); pstmt.addBatch(); } pstmt.executeBatch(); // sql = "select count(*) from test where id in(?,?)"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 0); pstmt.setInt(2, 9); rs = pstmt.executeQuery(); rs.next(); expectedCount = 2; actualCount = rs.getInt(1); assertEquals("\"" + sql + "\"", expectedCount, actualCount); // sql = "select count(*) from test a, test b where 0 in(a.id, b.id)"; rs = stmt.executeQuery(sql); rs.next(); expectedCount = rs.getInt(1); sql = "select count(*) from test a, test b where ? in (a.id, b.id)"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 0); rs = pstmt.executeQuery(); rs.next(); actualCount = rs.getInt(1); assertEquals("\"" + sql + "\"", expectedCount, actualCount); // expectedCount = 20; sql = "select count(*) from test a, test b where a.id in(?, ?)"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 0); pstmt.setInt(2, 9); rs = pstmt.executeQuery(); rs.next(); actualCount = rs.getInt(1); assertEquals("\"" + sql + "\"", expectedCount, actualCount); // expectedCount = 10; sql = "select count(*) from test a, test b where ? in(?, b.id)"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 0); pstmt.setInt(2, 9); rs = pstmt.executeQuery(); rs.next(); actualCount = rs.getInt(1); assertEquals("\"" + sql + "\"", expectedCount, actualCount); // expectedCount = 1; sql = "select count(*) from test a where ? in(select b.id from test b where a.id = b.id)"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 0); rs = pstmt.executeQuery(); rs.next(); actualCount = rs.getInt(1); assertEquals("\"" + sql + "\"", expectedCount, actualCount); // sql = "select count(*) from " + "(select * from test where id in (1,2)) a," + "(select * from test where id in (3,4)) b " + "where a.id < 2 and b.id < 4"; rs = stmt.executeQuery(sql); rs.next(); expectedCount = rs.getInt(1); sql = "select count(*) from " + "(select * from test where id in (?,?)) a," + "(select * from test where id in (?,?)) b " + "where a.id < ? and b.id < ?"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 1); pstmt.setInt(2, 2); pstmt.setInt(3, 3); pstmt.setInt(4, 4); pstmt.setInt(5, 2); pstmt.setInt(6, 4); rs = pstmt.executeQuery(); rs.next(); actualCount = rs.getInt(1); assertEquals("row count: ", expectedCount, actualCount); } /* Runs TestINPredicate test from the command line*/ public static void main(String[] args) throws Exception { TestResult result; TestCase test; java.util.Enumeration failures; int count; result = new TestResult(); test = new TestINPredicateParameterizationAndCorrelation("test"); test.run(result); count = result.failureCount(); System.out.println( "TestINPredicateParameterizationAndCorrelation failure count: " + count); failures = result.failures(); while (failures.hasMoreElements()) { System.out.println(failures.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestMultipleConnections.java0000644000175000017500000000646212007547410025426 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestMultipleConnections { public TestMultipleConnections() {} public static void main(String[] args) throws Exception { // test for bug itme 500105 commit does not work with multiple con. FIXED TestMultipleConnections hs = new TestMultipleConnections(); Connection con1 = hs.createObject(); Connection con2 = hs.createObject(); Connection con3 = hs.createObject(); con1.setAutoCommit(false); //connection1.commit(); con2.setAutoCommit(false); //connection1.commit(); con3.setAutoCommit(false); //connection1.commit(); Statement st = con3.createStatement(); st.execute("DROP TABLE T IF EXISTS"); st.execute("CREATE TABLE T (I INT)"); st.execute("INSERT INTO T VALUES (2)"); ResultSet rs = st.executeQuery("SELECT * FROM T"); rs.next(); int value = rs.getInt(1); con2.commit(); con3.commit(); con1.commit(); rs = st.executeQuery("SELECT * FROM T"); rs.next(); if (value != rs.getInt(1)) { throw new Exception("value doesn't exist"); } } /** * create a connection and wait */ protected Connection createObject() { try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); return DriverManager.getConnection("jdbc:hsqldb:/hsql/test/test", "sa", ""); } catch (Exception ex) { ex.printStackTrace(); } return null; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestSubQueriesInPreparedStatements.java0000644000175000017500000001152612007547410027536 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * TestSubQueriesInPreparedStatements.java * * Created on July 9, 2003, 4:03 PM */ package org.hsqldb.test; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; /** * * @author boucherb@users */ public class TestSubQueriesInPreparedStatements { public static void main(String[] args) throws Exception { test(); } public static void test() throws Exception { Connection conn; Statement stmnt; PreparedStatement pstmnt; Driver driver; driver = (Driver) Class.forName("org.hsqldb.jdbc.JDBCDriver").newInstance(); DriverManager.registerDriver(driver); conn = DriverManager.getConnection("jdbc:hsqldb:mem:test", "sa", ""); stmnt = conn.createStatement(); pstmnt = conn.prepareStatement("drop table t if exists"); boolean result = pstmnt.execute(); pstmnt = conn.prepareStatement("create table t(i decimal)"); int updatecount = pstmnt.executeUpdate(); pstmnt = conn.prepareStatement("insert into t values(?)"); for (int i = 0; i < 100; i++) { pstmnt.setInt(1, i); pstmnt.executeUpdate(); } pstmnt = conn.prepareStatement( "select * from (select * from t where i < ?)"); System.out.println("Expecting: 0..3"); pstmnt.setInt(1, 4); ResultSet rs = pstmnt.executeQuery(); while (rs.next()) { System.out.println(rs.getInt(1)); } System.out.println("Expecting: 0..4"); pstmnt.setInt(1, 5); rs = pstmnt.executeQuery(); while (rs.next()) { System.out.println(rs.getInt(1)); } pstmnt = conn.prepareStatement( "select sum(i) from (select i from t where i between ? and ?)"); System.out.println("Expecting: 9"); pstmnt.setInt(1, 4); pstmnt.setInt(2, 5); rs = pstmnt.executeQuery(); while (rs.next()) { System.out.println(rs.getInt(1)); } System.out.println("Expecting: 15"); pstmnt.setInt(2, 6); rs = pstmnt.executeQuery(); while (rs.next()) { System.out.println(rs.getInt(1)); } pstmnt = conn.prepareStatement( "select * from (select i as c1 from t where i < ?) a, (select i as c2 from t where i < ?) b"); System.out.println("Expecting: (0,0)"); pstmnt.setInt(1, 1); pstmnt.setInt(2, 1); rs = pstmnt.executeQuery(); while (rs.next()) { System.out.println("(" + rs.getInt(1) + "," + rs.getInt(2) + ")"); } System.out.println("Expecting: ((0,0), (0,1), (1,0), (1,1)"); pstmnt.setInt(1, 2); pstmnt.setInt(2, 2); rs = pstmnt.executeQuery(); while (rs.next()) { System.out.println("(" + rs.getInt(1) + "," + rs.getInt(2) + ")"); } System.out.println("Expecting: ((0,0) .. (3,3)"); pstmnt.setInt(1, 4); pstmnt.setInt(2, 4); rs = pstmnt.executeQuery(); while (rs.next()) { System.out.println("(" + rs.getInt(1) + "," + rs.getInt(2) + ")"); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/HSQLBug.java0000644000175000017500000001053012007547410021764 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Properties; public class HSQLBug { public static void main(String[] args) throws Exception { Class.forName("org.hsqldb.jdbc.JDBCDriver"); String url = "jdbc:hsqldb:mem:."; Properties properties = new Properties(); properties.setProperty("user", "sa"); properties.setProperty("password", ""); Connection con = DriverManager.getConnection(url, properties); Statement s = con.createStatement(); s.executeUpdate( "CREATE TABLE Table1 (Id INTEGER IDENTITY, Timec DATETIME NOT NULL)"); s.executeUpdate( "CREATE TABLE Table2 (Id INTEGER NOT NULL, Value VARCHAR(100) NOT NULL)"); s.executeUpdate("CREATE INDEX idx1 ON Table1(timec)"); // Add test data to the tables GregorianCalendar gc = new GregorianCalendar(); for (int i = 0; i < 1000; i++) { gc.add(Calendar.MINUTE, -1); String query = "INSERT INTO Table1 (Timec) VALUES ('" + formatter.format(gc.getTime()) + "')"; s.executeUpdate(query); ResultSet r = s.executeQuery("CALL IDENTITY();"); r.next(); int id = r.getInt(1); s.executeUpdate("INSERT INTO Table2 VALUES (" + id + ", 'ABC')"); s.executeUpdate("INSERT INTO Table2 VALUES (" + id + ", 'DEF')"); } // Build the query StringBuffer query = new StringBuffer(); query.append("SELECT Timec, Value FROM Table1, Table2 "); query.append("WHERE Table1.Id = Table2.Id "); query.append("AND Table1.Timec = "); // The equals sign causes the CPU to go to 100% for a while // query.append( "AND Table1.Time IN " ); // The work-around is to replace it with IN query.append("("); query.append( "SELECT MAX(Timec) FROM Table1 WHERE Timec <= '2020-01-01 00:00:00'"); query.append(")"); System.out.println("Query = " + query); System.out.println( "Starting Query at: " + formatter.format((new GregorianCalendar()).getTime())); ResultSet r = s.executeQuery(query.toString()); r.next(); System.out.println("Result : " + r.getTimestamp(1) + " " + r.getString(2)); System.out.println( "DONE Query at : " + formatter.format((new GregorianCalendar()).getTime())); } private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestPreparedSubQueries.java0000644000175000017500000002241312007547410025174 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.sql.Timestamp; import junit.framework.TestCase; /** * @author kloska@users * @author fredt@users */ public class TestPreparedSubQueries extends TestCase { private Connection con = null; private class sqlStmt { boolean prepare; boolean update; String command; sqlStmt(String c, boolean p, boolean u) { prepare = p; command = c; update = u; } } ; private sqlStmt[] stmtArray = { new sqlStmt("drop table a if exists cascade", false, false), new sqlStmt("create cached table a (a int identity,b int)", false, false), new sqlStmt("create index bIdx on a(b)", false, false), new sqlStmt("insert into a(b) values(1)", true, true), new sqlStmt("insert into a(b) values(2)", true, true), new sqlStmt("insert into a(b) values(3)", true, true), new sqlStmt("insert into a(b) values(4)", true, true), new sqlStmt("insert into a(b) values(5)", true, true), new sqlStmt("insert into a(b) values(6)", true, true), new sqlStmt( "update a set b=100 where b>(select b from a X where X.a=2)", true, true), new sqlStmt("update a set b=200 where b>(select b from a where a=?)", true, true), new sqlStmt( "update a set b=300 where b>(select b from a X where X.a=?)", true, true) }; private Object[][] stmtArgs = { {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, { new Integer(2) }, { new Integer(2) } }; public TestPreparedSubQueries(String name) { super(name); } protected void setUp() { String url = "jdbc:hsqldb:test"; try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); con = java.sql.DriverManager.getConnection(url, "sa", ""); } catch (Exception e) {} } public void testA() { try { int i = 0; for (i = 0; i < stmtArray.length; i++) { int j; System.out.println(" -- #" + i + " ----------------------- "); if (stmtArray[i].prepare) { PreparedStatement ps = null; System.out.println(" -- preparing\n<<<\n" + stmtArray[i].command + "\n>>>\n"); ps = con.prepareStatement(stmtArray[i].command); System.out.print(" -- setting " + stmtArgs[i].length + " Args ["); for (j = 0; j < stmtArgs[i].length; j++) { System.out.print((j > 0 ? "; " : "") + stmtArgs[i][j]); ps.setObject(j + 1, stmtArgs[i][j]); } System.out.println("]"); System.out.println(" -- executing "); if (stmtArray[i].update) { int r = ps.executeUpdate(); System.out.println(" ***** ps.executeUpdate gave me " + r); } else { boolean b = ps.execute(); System.out.print(" ***** ps.execute gave me " + b); } } else { System.out.println(" -- executing directly\n<<<\n" + stmtArray[i].command + "\n>>>\n"); Statement s = con.createStatement(); boolean b = s.execute(stmtArray[i].command); System.out.println(" ***** st.execute gave me " + b); } } } catch (Exception e) { System.out.println(" ?? Caught Exception " + e); assertTrue(false); } assertTrue(true); } public void testGenerated() { boolean valid = false; try { Statement s = con.createStatement(); s.execute("drop table a if exists"); s.execute("create cached table a (a int identity,b int)"); s.execute("insert into a(b) values(1)", Statement.RETURN_GENERATED_KEYS); ResultSet r = s.getGeneratedKeys(); while (r.next()) { r.getInt(1); valid = true; } r.close(); assertTrue(valid); s.execute("insert into a(b) values(2)", new int[]{ 1 }); r = s.getGeneratedKeys(); while (r.next()) { r.getInt(1); valid = true; } assertTrue(valid); s.execute("insert into a(b) values(2)", new String[]{ "A" }); r = s.getGeneratedKeys(); while (r.next()) { r.getInt(1); valid = true; } assertTrue(valid); s.execute("drop table a if exists"); s.execute("create cached table a (g int generated always as (a + b), a int generated always as identity (start with 5), b int, c timestamp default current_timestamp)"); s.execute("insert into a(b) values(1)", Statement.RETURN_GENERATED_KEYS); r = s.getGeneratedKeys(); while (r.next()) { int v = r.getInt(2); valid = true; assertEquals(v, 5); } r.close(); assertTrue(valid); s.execute("insert into a(b) values(2)", new int[]{ 1 }); r = s.getGeneratedKeys(); while (r.next()) { int v = r.getInt(1); valid = true; assertEquals(v, 8); } assertTrue(valid); s.execute("insert into a(b) values(2)", new String[]{ "A", "G", "C" }); r = s.getGeneratedKeys(); while (r.next()) { Timestamp tv = r.getTimestamp(3); int iv = r.getInt(1); valid = true; assertEquals(iv, 7); long diff = System.currentTimeMillis() - tv.getTime(); if (diff > 100 || diff <0) { fail("timestamp not correct"); } } assertTrue(valid); } catch (Exception e) { assertTrue(false); } } public void testIdentity() { boolean valid = false; try { Statement s = con.createStatement(); s.execute("drop table a if exists"); s.execute("create cached table a (a int identity, b int)"); PreparedStatement p1 = con.prepareStatement("insert into a(b) values ?"); p1.setInt(1, 10); p1.executeUpdate(); PreparedStatement p2 = con.prepareStatement("call identity()"); ResultSet r = p2.executeQuery(); while (r.next()) { r.getInt(1); valid = true; } p1.setInt(1, 11); p1.executeUpdate(); PreparedStatement ps3 = con.prepareStatement( "select count(*) from a where a in ((select a from a where b = ?) union (select ? from a))"); ps3.setInt(1, 10); ps3.setInt(2, 1); r = ps3.executeQuery(); while (r.next()) { int value = r.getInt(1); valid = value == 2; } assertTrue(valid); } catch (Exception e) { assertTrue(false); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestNitin.java0000644000175000017500000000622712007547406022515 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; /** * DB Out of memory test * cached tables in non-nio mode * @author Nitin Chauhan */ public class TestNitin { public static void main(String[] args) { java.sql.Connection c = null; java.sql.Statement s = null; java.io.BufferedReader br = null; try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); c = java.sql.DriverManager.getConnection( "jdbc:hsqldb:c:/ft/hsqldb_w_1_8_0/oom/my.db", "SA", ""); s = c.createStatement(); br = new java.io.BufferedReader( new java.io.FileReader("c:/ft/hsqldb_w_1_8_0//oom//my.sql")); String line; int lineNo = 0; while ((line = br.readLine()) != null) { if (line.length() > 0 && line.charAt(0) != '#') { s.execute(line); if (lineNo++ % 100 == 0) { System.out.println(lineNo); } } } } catch (Exception e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } } catch (java.io.IOException ioe) {} try { if (s != null) { s.close(); } } catch (java.sql.SQLException se) {} try { if (c != null) { c.close(); } } catch (java.sql.SQLException se) {} } System.exit(0); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestObjectSize.java0000644000175000017500000000546212007547410023470 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Timestamp; import org.hsqldb.lib.StopWatch; public class TestObjectSize { public TestObjectSize() { StopWatch sw = new StopWatch(); int testCount = 2350000; System.out.println("Fill Memory with Objects "); Object[] objectArray = new Object[testCount]; for (int j = 0; j < objectArray.length; j++) { objectArray[j] = new Timestamp(0); } System.out.println("Array Filled " + sw.elapsedTime()); for (int j = 0; j < objectArray.length; j++) { objectArray[j] = null; } Object[] objectArray2 = new Object[testCount]; Object[] objectArray3 = new Object[testCount]; Object[] objectArray4 = new Object[testCount]; Object[] objectArray5 = new Object[testCount]; Object[] objectArray6 = new Object[testCount]; // Object[] objectArray7 = new Object[testCount]; short[] shortArray = new short[testCount]; byte[] byteArray = new byte[testCount]; System.out.println("Fill with Empty Arrays " + sw.elapsedTime()); sw.zero(); } public static void main(String[] argv) { TestObjectSize ls = new TestObjectSize(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestScripts.java0000644000175000017500000001604712007547410023057 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.File; import java.sql.Connection; import java.sql.DriverManager; import java.util.ArrayList; import java.util.HashMap; /** * Runs test scripts against a single database, using persistent connection(s) * across multiple test script(s). * * @author Blaine Simpson (blaine dot simpson at admc dot com) */ class TestScripts extends TestUtil { /** * Run java org.hsqldb.util.TestScripts --help. * For each script run, the connection will be closed or persisted * depending on whether "--ephConnId=x" or "--persistConnId=x" preceded * the file name (defaulting to closing). * So, by default, for each script file, a new connection will be made * and closed immediately after the script runs. */ public static void main(String[] argv) { if (argv.length > 0 && argv[0].equals("--help")) { System.err.println(SYNTAX_MSG); System.exit(2); } ArrayList scripts = new ArrayList(); ArrayList connIds = new ArrayList(); ArrayList retains = new ArrayList(); int i = -1; int curscript = 0; // java.util.ArrayLists may contain null elements. connIds.add(null); retains.add(null); String newName = null; while (++i < argv.length) { if (argv[i].startsWith("--ephConnId=")) { newName = getIdName(argv[i]); if (newName == null || connIds.set(connIds.size() - 1, getIdName(argv[i])) != null) { System.err.println(SYNTAX_MSG); System.exit(2); } if (retains.set(retains.size() - 1, Boolean.FALSE) != null) { System.err.println(SYNTAX_MSG); System.exit(2); } } else if (argv[i].startsWith("--persistConnId=")) { newName = getIdName(argv[i]); if (newName == null || connIds.set(connIds.size() - 1, newName) != null) { System.err.println(SYNTAX_MSG); System.exit(2); } if (retains.set(retains.size() - 1, Boolean.TRUE) != null) { System.err.println(SYNTAX_MSG); System.exit(2); } } else if (argv[i].startsWith("-")) { System.err.println(SYNTAX_MSG); System.exit(2); } else { scripts.add(argv[i]); connIds.add(null); retains.add(null); } } test(DEF_URL, DEF_USER, DEF_PASSWORD, DEF_DB, (String[]) scripts.toArray(new String[0]), (String[]) connIds.toArray(new String[0]), (Boolean[]) retains.toArray(new Boolean[0])); } private static String getIdName(String s) { int nameStart = s.indexOf('=') + 1; if (nameStart < 1) { return null; } if (nameStart == s.length()) { throw new RuntimeException( "Leave off '=' if you do not want to name a connection"); } return s.substring(nameStart); } private static final String SYNTAX_MSG = "SYNTAX java " + TestScripts.class.getName() + " [--ephConnId=x | --persistConnId=x] file1.txt..."; static String DEF_DB = "test3"; static String DEF_URL = "jdbc:hsqldb:" + DEF_DB + ";sql.enforce_strict_size=true"; static String DEF_USER = "SA"; static String DEF_PASSWORD = ""; static void test(String url, String user, String password, String db, String[] scriptList, String[] idList, Boolean[] persistList) { if (scriptList.length < 1) { System.err.println("Nothing to do. No scripts specified."); return; } HashMap connMap = new HashMap(); if (db != null) { deleteDatabase(db); } try { DriverManager.registerDriver(new org.hsqldb.jdbc.JDBCDriver()); Connection cConnection = null; String id; for (int i = 0; i < scriptList.length; i++) { id = idList[i]; System.out.println("ID: " + id); cConnection = ((id == null) ? null : (Connection) connMap.get(id)); if (cConnection == null) { System.out.println("Getting NEW conn"); cConnection = DriverManager.getConnection(url, user, password); if (id != null) { // If new named conn., then store it. connMap.put(id, cConnection); System.out.println("Storing NEW conn"); } } testScript(cConnection, scriptList[i]); if (persistList[i] == null ||!persistList[i].booleanValue()) { if (id != null) { connMap.remove(id); System.out.println("Removed conn"); } cConnection.close(); System.out.println("Closed conn"); } } } catch (Exception e) { e.printStackTrace(); print("TestSelf init error: " + e.getMessage()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestHSQLDB.java0000644000175000017500000000761212007547410022403 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /* * TestHSQLDB.java * * Created on June 10, 2004, 10:28 PM */ /** * * @author Diego Ballve */ public class TestHSQLDB { /** * @param args the command line arguments */ public static void main(String[] args) { java.sql.DatabaseMetaData metaData = null; String databaseURL = "jdbc:hsqldb:mem:test"; String driver = "org.hsqldb.jdbc.JDBCDriver"; String user = "sa"; String password = ""; //Table creation sql: String ddlStr = "CREATE TABLE USER_(ID VARCHAR(64) NOT NULL PRIMARY KEY,HOME VARCHAR(128),OBJECTTYPE VARCHAR(64),STATUS VARCHAR(64) NOT NULL,PERSONNAME_FIRSTNAME VARCHAR(64),PERSONNAME_MIDDLENAME VARCHAR(64),PERSONNAME_LASTNAME VARCHAR(64),URL VARCHAR(256))"; String sqlStr = "UPDATE User_ SET id=\'urn:uuid:921284f0-bbed-4a4c-9342-ecaf0625f9d7\', home=null, objectType=\'urn:uuid:6d07b299-10e7-408f-843d-bb2bc913bfbb\', status=\'urn:uuid:37d17f1b-3245-425b-988d-e0d98200a146\' , personName_firstName=\'Registry\', personName_middleName=null, personName_lastName=\'Operator\', url=\'http://sourceforge.net/projects/ebxmlrr\' WHERE id = \'urn:uuid:921284f0-bbed-4a4c-9342-ecaf0625f9d7\' "; Statement stmt = null; try { Class.forName(driver); Connection connection = DriverManager.getConnection(databaseURL, user, password); stmt = connection.createStatement(); stmt.addBatch(ddlStr); stmt.addBatch(sqlStr); int[] updateCounts = stmt.executeBatch(); } catch (ClassNotFoundException e) { System.err.println(e.getClass().getName() + ": " + e.getMessage()); e.printStackTrace(System.err); } catch (SQLException e) { System.err.println(e.getClass().getName() + ": " + e.getMessage()); e.printStackTrace(System.err); } finally { try { if (stmt != null) { stmt.close(); } } catch (SQLException e) {} } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestGroupByHaving.java0000644000175000017500000003054412007547410024152 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import junit.framework.TestCase; /** * Test cases for HSQL aggregates and HAVING clause. * * @author Tony Lai ((tony_lai@users dot sourceforge.net) */ // fredt@users - modified to remove dependecy on DBUnit public class TestGroupByHaving extends TestCase { //------------------------------------------------------------ // Class variables //------------------------------------------------------------ private static final String databaseDriver = "org.hsqldb.jdbc.JDBCDriver"; private static final String databaseURL = "jdbc:hsqldb:mem:."; private static final String databaseUser = "sa"; private static final String databasePassword = ""; //------------------------------------------------------------ // Instance variables //------------------------------------------------------------ private Connection conn; private Statement stmt; //------------------------------------------------------------ // Constructors //------------------------------------------------------------ /** * Constructs a new SubselectTest. */ public TestGroupByHaving(String s) { super(s); } //------------------------------------------------------------ // Class methods //------------------------------------------------------------ protected static Connection getJDBCConnection() throws SQLException { return DriverManager.getConnection(databaseURL, databaseUser, databasePassword); } protected void setUp() throws Exception { super.setUp(); if (conn != null) { return; } Class.forName(databaseDriver); conn = getJDBCConnection(); stmt = conn.createStatement(); // I decided not the use the "IF EXISTS" clause since it is not a // SQL standard. try { // stmt.execute("drop table employee"); stmt.execute("drop table employee if exists"); } catch (Exception x) {} stmt.execute("create table employee(id int, " + "firstname VARCHAR(50), " + "lastname VARCHAR(50), " + "salary decimal(10, 2), " + "superior_id int, " + "CONSTRAINT PK_employee PRIMARY KEY (id), " + "CONSTRAINT FK_superior FOREIGN KEY (superior_id) " + "REFERENCES employee(ID))"); addEmployee(1, "Mike", "Smith", 160000, -1); addEmployee(2, "Mary", "Smith", 140000, -1); // Employee under Mike addEmployee(10, "Joe", "Divis", 50000, 1); addEmployee(11, "Peter", "Mason", 45000, 1); addEmployee(12, "Steve", "Johnson", 40000, 1); addEmployee(13, "Jim", "Hood", 35000, 1); // Employee under Mike addEmployee(20, "Jennifer", "Divis", 60000, 2); addEmployee(21, "Helen", "Mason", 50000, 2); addEmployee(22, "Daisy", "Johnson", 40000, 2); addEmployee(23, "Barbara", "Hood", 30000, 2); } protected void tearDown() throws Exception { // I decided not the use the "IF EXISTS" clause since it is not a // SQL standard. try { // stmt.execute("drop table employee"); stmt.execute("drop table employee if exists"); } catch (Exception x) {} if (stmt != null) { stmt.close(); stmt = null; } if (conn != null) { conn.close(); conn = null; } super.tearDown(); } private void addEmployee(int id, String firstName, String lastName, double salary, int superiorId) throws Exception { stmt.execute("insert into employee values(" + id + ", '" + firstName + "', '" + lastName + "', " + salary + ", " + (superiorId <= 0 ? "null" : ("" + superiorId)) + ")"); } /** * Tests aggregated selection with a GROUP_BY clause. This is * a normal use of the GROUP_BY clause. The first two employees * do not have a superior, and must be grouped within the same group, * according to GROUP_BY standard. */ public void testAggregatedGroupBy() throws SQLException { String sql = "select avg(salary), max(id) from employee " + "group by superior_id " + "order by superior_id " + ""; Object[][] expected = new Object[][] { { new Double(150000), new Integer(2) }, { new Double(42500), new Integer(13) }, { new Double(45000), new Integer(23) }, }; compareResults(sql, expected, "00000"); } /** * Tests aggregated selection with a GROUP_BY clause and a * HAVING clause. *

                  * This is a typical use of the GROUP_BY + HAVING clause. * The first two employees are eliminated due to the HAVING * condition. *

                  * This test uses aggregated function to eliminate first group. */ public void testAggregatedGroupByHaving1() throws SQLException { String sql = "select avg(salary), max(id) from employee " + "group by superior_id " + "having max(id) > 5 " + "order by superior_id " + ""; Object[][] expected = new Object[][] { { new Double(42500), new Integer(13) }, { new Double(45000), new Integer(23) }, }; compareResults(sql, expected, "00000"); } /** * Tests aggregated selection with a GROUP_BY clause and a * HAVING clause. *

                  * This is a typical use of the GROUP_BY + HAVING clause. * The first two employees are eliminated due to the HAVING * condition. *

                  * This test uses GROUP_BY column to eliminate first group. */ public void testAggregatedGroupByHaving2() throws SQLException { String sql = "select avg(salary), max(id) from employee " + "group by superior_id " + "having superior_id is not null " + "order by superior_id " + ""; Object[][] expected = new Object[][] { { new Double(42500), new Integer(13) }, { new Double(45000), new Integer(23) }, }; compareResults(sql, expected, "00000"); } /** * Tests an unusual usage of the HAVING clause, without a * GROUP BY clause. *

                  * Only one row is returned by the aggregate selection without a * GROUP BY clause. The HAVING clause is applied to the * only returned row. In this case, the HAVING condition is * satisfied. */ public void testHavingWithoutGroupBy1() throws SQLException { String sql = "select avg(salary), max(id) from employee " + "having avg(salary) > 1000 " + ""; Object[][] expected = new Object[][] { { new Double(65000), new Integer(23) }, }; compareResults(sql, expected, "00000"); } /** * Tests an unusual usage of the HAVING clause, without a * GROUP BY clause. *

                  * Only one row is returned by the aggregate selection without a * GROUP BY clause. The HAVING clause is applied to the * only returned row. In this case, the HAVING condition is * NOT satisfied. */ public void testHavingWithoutGroupBy2() throws SQLException { String sql = "select avg(salary), max(id) from employee " + "having avg(salary) > 1000000 " + ""; Object[][] expected = new Object[][]{}; compareResults(sql, expected, "00000"); } /** * Tests an invalid HAVING clause that contains columns not in * the GROUP BY clause. A SQLException should be thrown. */ public void testInvalidHaving() throws SQLException { String sql = "select avg(salary), max(id) from employee " + "group by lastname " + "having (max(id) > 1) and (superior_id > 1) " + ""; Object[][] expected = new Object[][]{}; compareResults(sql, expected, "42573"); } //------------------------------------------------------------ // Helper methods //------------------------------------------------------------ private void compareResults(String sql, Object[][] rows, String sqlState) throws SQLException { ResultSet rs = null; try { rs = stmt.executeQuery(sql); assertTrue("Statement <" + sql + "> \nexpecting error code: " + sqlState, ("00000".equals(sqlState))); } catch (SQLException sqlx) { if (!sqlx.getSQLState().equals(sqlState)) { sqlx.printStackTrace(); } assertTrue("Statement <" + sql + "> \nthrows wrong error code: " + sqlx.getErrorCode() + " expecting error code: " + sqlState, (sqlx.getSQLState().equals(sqlState))); return; } int rowCount = 0; int colCount = rows.length > 0 ? rows[0].length : 0; while (rs.next()) { assertTrue("Statement <" + sql + "> \nreturned too many rows.", (rowCount < rows.length)); Object[] columns = rows[rowCount]; for (int col = 1, i = 0; i < colCount; i++, col++) { Object result = null; Object expected = columns[i]; if (expected == null) { result = rs.getString(col); result = rs.wasNull() ? null : result; } else if (expected instanceof String) { result = rs.getString(col); } else if (expected instanceof Double) { result = new Double(rs.getString(col)); } else if (expected instanceof Integer) { result = new Integer(rs.getInt(col)); } assertEquals("Statement <" + sql + "> \nreturned wrong value.", columns[i], result); } rowCount++; } assertEquals("Statement <" + sql + "> \nreturned wrong number of rows.", rows.length, rowCount); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestBug778213.java0000644000175000017500000001344612007547406022646 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import junit.framework.TestCase; import junit.framework.TestResult; /** * HSQLDB TestBug778213 Junit test case.

                  * * Test to ensure that DDL can be executed through the * HSQLDB PreparedStatement interface implementation and * that the behaviour of the prepared statement object is * nominally correct under "prepared" DDL. * * @author boucherb@users * @version 1.7.2 * @since 1.7.2 */ public class TestBug778213 extends TestBase { public TestBug778213(String name) { super(name); } /* Implements the TestBug778213_Part3 test */ public void test() throws Exception { Connection conn = newConnection(); PreparedStatement pstmt; int updateCount; try { pstmt = conn.prepareStatement("drop table test if exists"); pstmt.executeUpdate(); pstmt = conn.prepareStatement("create table test(id int)"); updateCount = pstmt.executeUpdate(); assertTrue("expected update count of zero", updateCount == 0); pstmt = conn.prepareStatement("drop table test"); updateCount = pstmt.executeUpdate(); assertTrue("expected update count of zero", updateCount == 0); } catch (Exception e) { assertTrue("unable to prepare or execute DDL", false); } finally { conn.close(); } conn = newConnection(); try { pstmt = conn.prepareStatement("create table test(id int)"); assertTrue("got data expecting update count", !pstmt.execute()); } catch (Exception e) { assertTrue("unable to prepare or execute DDL", false); } finally { conn.close(); } conn = newConnection(); boolean exception = true; try { pstmt = conn.prepareStatement("drop table test"); pstmt.executeQuery(); } catch (SQLException e) { exception = false; } finally { conn.close(); } if (exception) { assertTrue("no exception thrown for executeQuery(DDL)", false); } conn = newConnection(); try { pstmt = conn.prepareStatement("call identity()"); pstmt.execute(); } catch (Exception e) { assertTrue("unable to prepare or execute call", false); } finally { conn.close(); } exception = false; conn = newConnection(); try { pstmt = conn.prepareStatement("create table test(id int)"); pstmt.addBatch(); } catch (SQLException e) { exception = true; } finally { conn.close(); } if (exception) { assertTrue("not expected exception batching prepared DDL", false); } conn = newConnection(); try { pstmt = conn.prepareStatement("create table test(id int)"); assertTrue("expected null ResultSetMetadata for prepared DDL", null == pstmt.getMetaData()); } finally { conn.close(); } conn = newConnection(); //#ifdef JAVA4 try { pstmt = conn.prepareStatement("create table test(id int)"); assertTrue("expected zero parameter for prepared DDL", 0 == pstmt.getParameterMetaData().getParameterCount()); } finally { conn.close(); } //#endif JAVA4 } /* Runs TestBug778213_Part3 test from the command line*/ public static void main(String[] args) throws Exception { TestResult result; TestCase test; java.util.Enumeration failures; int count; result = new TestResult(); test = new TestBug778213("test"); test.run(result); count = result.failureCount(); System.out.println("TestBug778213 failure count: " + count); failures = result.failures(); while (failures.hasMoreElements()) { System.out.println(failures.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestQuotes.java0000644000175000017500000001232412007547410022702 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * Test handling of quote characters in strings * * @author David Walend * @author Jason van Zyl */ public class TestQuotes extends TestCase { private static final String CREATETABLE = "create table quotetest (test varchar(100))"; private static final String DELETE = "delete from quotetest"; private static final String TESTSTRING = "insert into quotetest (test) values (?)"; private static final String NOQUOTES = "the house of the dog of kevin"; private static final String QUOTES = "kevin's dog's house"; private static final String RESULT = "select * from quotetest"; public TestQuotes(String testName) { super(testName); } /** * Run all related test methods */ public static Test suite() { return new TestSuite(org.hsqldb.test.TestQuotes.class); } public void testSetString() { Connection connection = null; Statement statement = null; PreparedStatement pStatement = null; ResultSet rs1 = null; ResultSet rs2 = null; try { DriverManager.registerDriver(new org.hsqldb.jdbc.JDBCDriver()); connection = DriverManager.getConnection("jdbc:hsqldb:mem:.", "sa", ""); statement = connection.createStatement(); statement.executeUpdate(CREATETABLE); pStatement = connection.prepareStatement(TESTSTRING); pStatement.setString(1, NOQUOTES); pStatement.executeUpdate(); rs1 = statement.executeQuery(RESULT); rs1.next(); String result1 = rs1.getString(1); assertTrue("result1 is -" + result1 + "- not -" + NOQUOTES + "-", NOQUOTES.equals(result1)); statement.executeUpdate(DELETE); pStatement.setString(1, QUOTES); pStatement.executeUpdate(); rs2 = statement.executeQuery(RESULT); rs2.next(); String result2 = rs2.getString(1); assertTrue("result2 is " + result2, QUOTES.equals(result2)); } catch (SQLException sqle) { fail(sqle.getMessage()); } finally { if (rs2 != null) { try { rs2.close(); } catch (SQLException sqle) { sqle.printStackTrace(); } } if (rs1 != null) { try { rs1.close(); } catch (SQLException sqle) { sqle.printStackTrace(); } } if (statement != null) { try { statement.close(); } catch (SQLException sqle) { sqle.printStackTrace(); } } if (pStatement != null) { try { pStatement.close(); } catch (SQLException sqle) { sqle.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException sqle) { sqle.printStackTrace(); } } } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestAllTypes.java0000644000175000017500000003731512007547410023166 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.File; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Random; import org.hsqldb.lib.StopWatch; /** * Test large tables containing columns of different types. * * @author Fred Toussi (fredt@users dot sourceforge.net) */ public class TestAllTypes { protected String url = "jdbc:hsqldb:/hsql/testalltypes/test;hsqldb.sqllog=3"; // protected String url = "jdbc:hsqldb:hsql://localhost/yourtest"; boolean network = false; String user; String password; Statement sStatement; Connection cConnection; // prameters boolean reportProgress = true; boolean cachedTable = true; int cacheScale = 12; int logType = 1; int writeDelay = 60; boolean indexZip = true; boolean indexLastName = false; boolean addForeignKey = false; boolean refIntegrity = true; boolean createTempTable = false; // introduces fragmentation to the .data file boolean deleteWhileInsert = false; int deleteWhileInsertInterval = 10000; // int bigrows = 1024 * 1024; protected void setUp() { user = "sa"; password = ""; try { sStatement = null; cConnection = null; Class.forName("org.hsqldb.jdbc.JDBCDriver"); boolean createDatabase = true; if (createDatabase) { cConnection = DriverManager.getConnection(url, user, password); sStatement = cConnection.createStatement(); sStatement.execute("SET DATABASE EVENT LOG LEVEL 2"); sStatement.execute("SET FILES LOG SIZE " + 400); sStatement.execute("SET FILES LOG FALSE"); sStatement.execute("SET FILES WRITE DELAY " + writeDelay); sStatement.execute("SET FILES CACHE SIZE 100000"); sStatement.execute("SHUTDOWN"); cConnection.close(); cConnection = DriverManager.getConnection(url, user, password); sStatement = cConnection.createStatement(); } } catch (Exception e) { e.printStackTrace(); System.out.println("TestSql.setUp() error: " + e.getMessage()); } } /** * Fill up the cache * * */ public void testFillUp() { StopWatch sw = new StopWatch(); int smallrows = 0xfff; double value = 0; String ddl1 = "DROP TABLE test IF EXISTS;" + "DROP TABLE zip IF EXISTS;"; String ddl2 = "CREATE TABLE zip( zip INT IDENTITY );"; String ddl3 = "CREATE " + (cachedTable ? "CACHED " : "") + "TABLE test( id INT IDENTITY," + " firstname VARCHAR(128), " + " lastname VARCHAR(128), " + " zip INTEGER, " + " longfield BIGINT, " + " doublefield DOUBLE, " + " bigdecimalfield DECIMAL, " + " datefield DATE, " + " filler VARCHAR(128)); "; // adding extra index will slow down inserts a bit String ddl4 = "CREATE INDEX idx1 ON TEST (lastname);"; // adding this index will slow down inserts a lot String ddl5 = "CREATE INDEX idx2 ON TEST (zip);"; // referential integrity checks will slow down inserts a bit String ddl6 = "ALTER TABLE test add constraint c1 FOREIGN KEY (zip) REFERENCES zip(zip);"; String filler = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"; try { System.out.println("Connecting"); sw.zero(); cConnection = null; sStatement = null; cConnection = DriverManager.getConnection(url, user, password); System.out.println("connected: " + sw.elapsedTime()); sw.zero(); sStatement = cConnection.createStatement(); java.util.Random randomgen = new java.util.Random(); sStatement.execute(ddl1); sStatement.execute(ddl2); sStatement.execute(ddl3); System.out.println("test table with no index"); if (indexLastName) { sStatement.execute(ddl4); System.out.println("create index on lastname"); } if (indexZip) { sStatement.execute(ddl5); System.out.println("create index on zip"); } if (addForeignKey) { sStatement.execute(ddl6); System.out.println("add foreign key"); } int i; for (i = 0; i <= smallrows; i++) { sStatement.execute("INSERT INTO zip VALUES(null);"); } PreparedStatement ps = cConnection.prepareStatement( "INSERT INTO test (firstname,lastname,zip,longfield,doublefield,bigdecimalfield,datefield) VALUES (?,?,?,?,?,?,?)"); ps.setString(1, "Julia "); ps.setString(2, "Clancy"); for (i = 0; i < bigrows; i++) { ps.setInt(3, nextIntRandom(randomgen, smallrows)); int nextrandom = nextIntRandom(randomgen, filler.length()); int randomlength = nextIntRandom(randomgen, filler.length()); ps.setLong(4, randomgen.nextLong()); ps.setDouble(5, randomgen.nextDouble()); ps.setBigDecimal(6, null); // ps.setDouble(6, randomgen.nextDouble()); ps.setDate(7, new java.sql.Date(nextIntRandom(randomgen, 1000) * 24L * 3600 * 1000)); String varfiller = filler.substring(0, randomlength); // ps.setString(8, nextrandom + varfiller); ps.execute(); if (reportProgress && (i + 1) % 10000 == 0) { System.out.println("Insert " + (i + 1) + " : " + sw.elapsedTime()); } // delete and add 4000 rows to introduce fragmentation if (deleteWhileInsert && i != 0 && i % deleteWhileInsertInterval == 0) { sStatement.execute("CALL IDENTITY();"); ResultSet rs = sStatement.getResultSet(); rs.next(); int lastId = rs.getInt(1); sStatement.execute( "SELECT * INTO TEMP tempt FROM test WHERE id > " + (lastId - 4000) + " ;"); sStatement.execute("DELETE FROM test WHERE id > " + (lastId - 4000) + " ;"); sStatement.execute( "INSERT INTO test SELECT * FROM tempt;"); sStatement.execute("DROP TABLE tempt;"); } } // sStatement.execute("INSERT INTO test SELECT * FROM temptest;"); // sStatement.execute("DROP TABLE temptest;"); // sStatement.execute(ddl7); System.out.println("Total insert: " + i); System.out.println("Insert time: " + sw.elapsedTime() + " rps: " + (i * 1000 / sw.elapsedTime())); sw.zero(); if (!network) { sStatement.execute("SHUTDOWN"); } cConnection.close(); System.out.println("Shutdown Time: " + sw.elapsedTime()); } catch (SQLException e) { System.out.println(e.getMessage()); } } protected void tearDown() {} protected void checkResults() { try { StopWatch sw = new StopWatch(); ResultSet rs; cConnection = DriverManager.getConnection(url, user, password); System.out.println("Reopened database: " + sw.elapsedTime()); sw.zero(); sStatement = cConnection.createStatement(); sStatement.execute("SET FILES WRITE DELAY " + writeDelay); // sStatement.execute("SET DATABASE EVENT LOG SQL LEVEL 3"); // the tests use different indexes // use primary index sStatement.execute("SELECT count(*) from TEST"); rs = sStatement.getResultSet(); rs.next(); System.out.println("Row Count: " + rs.getInt(1)); System.out.println("Time to count: " + sw.elapsedTime()); // use index on zip sw.zero(); sStatement.execute("SELECT count(*) from TEST where zip > -1"); rs = sStatement.getResultSet(); rs.next(); System.out.println("Row Count: " + rs.getInt(1)); System.out.println("Time to count: " + sw.elapsedTime()); checkSelects(); checkUpdates(); sw.zero(); cConnection.close(); System.out.println("Closed connection: " + sw.elapsedTime()); } catch (SQLException e) { System.out.println(e.getMessage()); } } private void checkSelects() { StopWatch sw = new StopWatch(); int smallrows = 0xfff; java.util.Random randomgen = new java.util.Random(); int i = 0; boolean slow = false; try { for (; i < bigrows / 4; i++) { PreparedStatement ps = cConnection.prepareStatement( "SELECT TOP 1 firstname,lastname,zip,filler FROM test WHERE zip = ?"); ps.setInt(1, nextIntRandom(randomgen, smallrows)); ps.execute(); if ((i + 1) == 100 && sw.elapsedTime() > 5000) { slow = true; } if (reportProgress && (i + 1) % 10000 == 0 || (slow && (i + 1) % 100 == 0)) { System.out.println("Select " + (i + 1) + " : " + sw.elapsedTime() + " rps: " + (i * 1000 / sw.elapsedTime())); } } } catch (SQLException e) {} System.out.println("Select random zip " + i + " rows : " + sw.elapsedTime() + " rps: " + (i * 1000 / sw.elapsedTime())); sw.zero(); try { for (i = 0; i < bigrows / 4; i++) { PreparedStatement ps = cConnection.prepareStatement( "SELECT firstname,lastname,zip,filler FROM test WHERE id = ?"); ps.setInt(1, nextIntRandom(randomgen, bigrows - 1)); ps.execute(); if (reportProgress && (i + 1) % 10000 == 0 || (slow && (i + 1) % 100 == 0)) { System.out.println("Select " + (i + 1) + " : " + sw.elapsedTime()); } } } catch (SQLException e) {} System.out.println("Select random id " + i + " rows : " + sw.elapsedTime() + " rps: " + (i * 1000 / sw.elapsedTime())); } private void checkUpdates() { StopWatch sw = new StopWatch(); int smallrows = 0xfff; java.util.Random randomgen = new java.util.Random(); int i = 0; boolean slow = false; int count = 0; try { for (; i < smallrows; i++) { PreparedStatement ps = cConnection.prepareStatement( "UPDATE test SET filler = filler || zip WHERE zip = ?"); int random = nextIntRandom(randomgen, smallrows - 1); ps.setInt(1, random); count += ps.executeUpdate(); if (reportProgress && count % 10000 < 20) { System.out.println("Update " + count + " : " + sw.elapsedTime()); } } } catch (SQLException e) {} System.out.println("Update with random zip " + i + " UPDATE commands, " + count + " rows : " + sw.elapsedTime() + " rps: " + (count * 1000 / (sw.elapsedTime() + 1))); sw.zero(); try { for (i = 0; i < bigrows / 8; i++) { PreparedStatement ps = cConnection.prepareStatement( "UPDATE test SET zip = zip + 1 WHERE id = ?"); int random = nextIntRandom(randomgen, bigrows - 1); ps.setInt(1, random); ps.execute(); if (reportProgress && (i + 1) % 10000 == 0 || (slow && (i + 1) % 100 == 0)) { System.out.println("Update " + (i + 1) + " : " + sw.elapsedTime() + " rps: " + (i * 1000 / sw.elapsedTime())); } } } catch (SQLException e) {} System.out.println("Update with random id " + i + " rows : " + sw.elapsedTime() + " rps: " + (i * 1000 / (sw.elapsedTime() + 1))); } int nextIntRandom(Random r, int range) { int b = r.nextInt(); if (b == Integer.MIN_VALUE) { b = Integer.MAX_VALUE; } b = Math.abs(b); return b % range; } public static void main(String[] argv) { StopWatch sw = new StopWatch(); TestAllTypes test = new TestAllTypes(); test.setUp(); test.testFillUp(); // test.tearDown(); test.checkResults(); System.out.println("Total Test Time: " + sw.elapsedTime()); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestHTTPKeepAlive.java0000644000175000017500000001435612007547410023776 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Enumeration; import junit.framework.TestCase; import junit.framework.TestResult; /** * This tests simply executes more than 2^16 times a 'SELECT *' on a 2-row * table. If no Keep-Alive is used your OS will run out of ports for connections * being repeatedly opened for each SELECT that is executed. If Keep-Alive is * being used, this test will complete in a about 5 seconds on an ivy-bridge * class machine * * @author Aart de Vries */ public class TestHTTPKeepAlive extends TestBase { static Integer failCount = 0; static Integer executeCount = 0; private Statement stmnt; private Connection connection; public TestHTTPKeepAlive(String name) { super(name); } protected void setUp() { super.setUp(); try { connection = newConnection(); stmnt = connection.createStatement(); stmnt.execute("CREATE TABLE IF NOT EXISTS link_table (id INTEGER PRIMARY KEY NOT NULL, other TINYINT NOT NULL)"); stmnt.execute("INSERT INTO link_table VALUES ((0, 1),(1, 2))"); } catch (Exception e) { } } protected void tearDown() { try { stmnt.execute("DROP TABLE IF EXISTS link_table"); connection.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("TestSql.tearDown() error: " + e.getMessage()); } super.tearDown(); } class KeepAliveThread extends Thread { public void run() { Connection c = null; try { c = newConnection(); final Statement statement = c.createStatement(); for (int i = 0; i <= 16500; i++) { statement.executeQuery("SELECT * FROM link_table"); synchronized(executeCount) { executeCount++; } } } catch (SQLException e) { e.printStackTrace(System.out); } finally { try { c.close(); } catch (SQLException e) { e.printStackTrace(); } } } } class TimeoutThread extends Thread { public void run() { Thread t = new KeepAliveThread(); t.start(); try { t.join(15000); if (t.isAlive()) { // If thread still running, then it's probably blocked because the ports are exhausted synchronized(failCount) { if(failCount==0) { failCount++; fail("Keep-Alive is probably not being used"); } } } } catch (InterruptedException ex) { } } } public void testKeepAlive() { Thread t1 = new TimeoutThread(); t1.start(); Thread t2 = new TimeoutThread(); t2.start(); Thread t3 = new TimeoutThread(); t3.start(); Thread t4 = new TimeoutThread(); t4.start(); try { t1.join(); t2.join(); t3.join(); t4.join(); } catch (InterruptedException e) { } System.out.println("testKeepAlive completed " + executeCount + "connections.\n"); } public static void main(String[] argv) { TestResult result = new TestResult(); TestCase testKeepAlive = new TestHTTPKeepAlive("testKeepAlive"); testKeepAlive.run(result); System.out.println("TestKeepAlive error count: " + result.failureCount()); Enumeration e = result.failures(); while (e.hasMoreElements()) { System.out.println(e.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestKarl.java0000644000175000017500000002153112007547410022313 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Calendar; import java.util.GregorianCalendar; /** * @author karl * */ public class TestKarl { static final String SHUTDOWN = "SHUTDOWN"; static final String SHUTDOWN_IMMEDIATELY = "SHUTDOWN IMMEDIATELY"; static final String SHUTDOWN_COMPACT = "SHUTDOWN COMPACT"; /** * * @param args */ public static void main(String[] args) { Connection c = null; try { //copy db File f = new File("db"); if (!f.exists()) { f.mkdir(); } else { File[] list = f.listFiles(); for (int i = 0; i < list.length; i++) { list[i].delete(); } } copy("save/brwahl.properties", "db/brwahl.properties"); copy("save/brwahl.script", "db/brwahl.script"); copy("save/waehler.csv", "db/waehler.csv"); // config test String shutdown = SHUTDOWN; boolean autocommit = false; Class.forName("org.hsqldb.jdbc.JDBCDriver"); c = DriverManager.getConnection("jdbc:hsqldb:file:db/brwahl", "sa", ""); c.setAutoCommit(autocommit); // open ok printMeta(c); printTable(c, "WAEHLER"); // test existing doUpdateInsertDeleteWaehler(c); printTable(c, "WAEHLER"); // test new doCreateTableTest(c); printTable(c, "TEST"); // colse Statement st = c.createStatement(); st.execute(shutdown); st.close(); c.close(); c = null; // reopen test System.out.println("\nDB OK? ..."); c = DriverManager.getConnection("jdbc:hsqldb:file:db/brwahl", "sa", ""); c.setAutoCommit(false); printTable(c, "WAEHLER"); printTable(c, "TEST"); doUpdateInsertDeleteWaehler(c); c.rollback(); if (!autocommit) { doCreateTableTest(c); c.rollback(); } c.close(); c = null; } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (c != null) { try { c.close(); } catch (SQLException e) { e.printStackTrace(); } } } } /** * @param p_connection * @throws SQLException */ private static void doCreateTableTest(Connection p_connection) throws SQLException { System.out.println("CREATE TESTTABLE START ..."); Statement st = p_connection.createStatement(); st.executeUpdate("DROP TABLE TEST IF EXISTS"); st.executeUpdate("CREATE TABLE TEST (TEST INTEGER)"); st.close(); System.out.println("END CREATE TESTTABLE"); System.out.println("INSERT INTO TESTTABLE START ..."); PreparedStatement p = p_connection.prepareStatement( "INSERT INTO TEST (TEST) values (?)"); p.setInt(1, 123); p.execute(); p.close(); System.out.println("END INSERT INTO TESTTABLE"); } /** * @param p_connection * @throws SQLException */ private static void doUpdateInsertDeleteWaehler(Connection p_connection) throws SQLException { System.out.println("UPDATE WAEHLER START ..."); PreparedStatement p = p_connection.prepareStatement( "UPDATE WAEHLER SET AUSTRITTSDATUM=? WHERE NAME=?"); p.setDate(1, null); p.setString(2, "Muster1"); p.execute(); p.close(); System.out.println("END UPDATE WAEHLER"); System.out.println("INSERT INTO WAEHLER START ..."); p = p_connection.prepareStatement( "INSERT INTO WAEHLER (NAME, AUSTRITTSDATUM) VALUES (?,?)"); Calendar cal = GregorianCalendar.getInstance(); p.setString(1, "Muster3"); p.setDate(2, new Date(cal.getTimeInMillis()), cal); p.execute(); p.close(); System.out.println("END INSERT INTO WAEHLER"); System.out.println("DELETE FROM WAEHLER START ..."); p = p_connection.prepareStatement( "DELETE FROM WAEHLER WHERE NAME = ?"); p.setString(1, "Muster2"); p.execute(); p.close(); System.out.println("END DELETE FROM WAEHLER"); } /** * @param p_connection * @param p_table * @throws SQLException */ private static void printTable(Connection p_connection, String p_table) throws SQLException { System.out.println("GET TABLE " + p_table + " START ..."); Statement st = p_connection.createStatement(); ResultSet rs = st.executeQuery("SELECT * FROM " + p_table); int col_count = rs.getMetaData().getColumnCount(); for (int i = 1; i <= col_count; i++) { System.out.print(rs.getMetaData().getColumnLabel(i) + "\t"); } System.out.println(""); while (rs.next()) { for (int i = 1; i <= col_count; i++) { System.out.print(rs.getObject(i)); System.out.print("\t"); } System.out.println(""); } st.close(); System.out.println("... END GET TABLE " + p_table); } /** * @param p_connection * @throws SQLException */ private static void printMeta(Connection p_connection) throws SQLException { System.out.println("GET METADATA START ..."); ResultSet rs = p_connection.getMetaData().getTables(null, null, null, null); System.out.println(rs.toString()); int col_count = rs.getMetaData().getColumnCount(); for (int i = 1; i <= col_count; i++) { System.out.print(rs.getMetaData().getColumnLabel(i) + "\t"); } System.out.println(""); while (rs.next()) { for (int i = 1; i <= col_count; i++) { System.out.print(rs.getObject(i)); System.out.print("\t"); } System.out.println(""); } System.out.println("END GET METADATA"); } private static void copy(String src, String dest) throws IOException { File inputFile = new File(src); File outputFile = new File(dest); if (!inputFile.exists()) { return; } FileInputStream in = new FileInputStream(inputFile); FileOutputStream out = new FileOutputStream(outputFile); int c; while ((c = in.read()) != -1) { out.write(c); } in.close(); out.close(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestLikePredicateOptimizations.java0000644000175000017500000002147212007547410026725 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import junit.framework.TestCase; import junit.framework.TestResult; /** * HSQLDB TestLikePredicate Junit test case.

                  * * @author boucherb@users * @version 1.9.0 * @since 1.7.2 */ public class TestLikePredicateOptimizations extends TestBase { public TestLikePredicateOptimizations(String name) { super(name); } /* Implements the TestLikePredicate test */ public void test() throws Exception { Connection conn = newConnection(); Statement stmt = conn.createStatement(); PreparedStatement pstmt; ResultSet rs; String sql; int expectedCount; int actualCount; stmt.execute("drop table test if exists"); stmt.execute("drop table empty if exists"); sql = "create table test(name varchar(255))"; stmt.execute(sql); sql = "create index idx on test(name)"; stmt.execute(sql); sql = "create table empty(name varchar(255))"; stmt.execute(sql); sql = "insert into empty values 'name10'"; stmt.execute(sql); sql = "insert into empty values 'name11'"; stmt.execute(sql); sql = "insert into test values(?)"; pstmt = conn.prepareStatement(sql); for (int i = 0; i < 10000; i++) { pstmt.setString(1, "name" + i); pstmt.addBatch(); } pstmt.executeBatch(); sql = "select TOP 20 * from test where name like '%me4%' order by name"; rs = stmt.executeQuery(sql); int countOne = 0; int countTwo = 0; while (rs.next()) { countOne++; } sql = "select TOP 20 * from test where name like ? order by name"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, "%me4%"); rs = pstmt.executeQuery(); while (rs.next()) { countTwo++; } assertEquals("\"" + sql + "\"", countOne, countTwo ); // sql = "select count(*) from test where name = (select max(name) from empty)"; rs = stmt.executeQuery(sql); rs.next(); expectedCount = rs.getInt(1); sql = "select count(*) from test where name like (select min(name) from empty)"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); rs.next(); actualCount = rs.getInt(1); assertEquals("\"" + sql + "\"", expectedCount, actualCount); sql = "select count(*) from test where (select max(name) from empty where empty.name = test.name and empty.name > ?) like '%ame11%'"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, "n"); rs = pstmt.executeQuery(); rs.next(); actualCount = rs.getInt(1); assertEquals("\"" + sql + "\"", expectedCount, actualCount); // -- sql = "select count(*) from test where name = ''"; rs = stmt.executeQuery(sql); rs.next(); expectedCount = rs.getInt(1); sql = "select count(*) from test where name like ''"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); rs.next(); actualCount = rs.getInt(1); assertEquals("\"" + sql + "\"", expectedCount, actualCount); // -- sql = "SELECT t.name FROM test t WHERE ((SELECT t2.name from test t2 where t2.name=?) like '%name5000%')"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, "name5000"); rs = pstmt.executeQuery(); assertEquals(rs.next(), true); String actual = rs.getString(1); assertEquals(actual, "name0"); // -- // -- sql = "select count(*) from test where name is not null"; rs = stmt.executeQuery(sql); rs.next(); expectedCount = rs.getInt(1); sql = "select count(*) from test where name like '%'"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); rs.next(); actualCount = rs.getInt(1); assertEquals("\"" + sql + "\"", expectedCount, actualCount); // -- sql = "select count(*) from test where substring(name from 1 for 6) = 'name44'"; rs = stmt.executeQuery(sql); rs.next(); expectedCount = rs.getInt(1); sql = "select count(*) from test where name like 'name44%'"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); rs.next(); actualCount = rs.getInt(1); assertEquals("\"" + sql + "\"", expectedCount, actualCount); // -- sql = "select count(*) from test where left(name,5) = 'name4' and right(name,1) = '5'"; rs = stmt.executeQuery(sql); rs.next(); expectedCount = rs.getInt(1); sql = "select count(*) from test where name like 'name4%5'"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); rs.next(); actualCount = rs.getInt(1); assertEquals("\"" + sql + "\"", expectedCount, actualCount); sql = "select count(*) from test"; rs = stmt.executeQuery(sql); rs.next(); expectedCount = rs.getInt(1); sql = "select count(*) from test where name like '%'"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); rs.next(); actualCount = rs.getInt(1); assertEquals("\"" + sql + "\"", expectedCount, actualCount); // -- String result = "true"; String presult = "false"; stmt.execute("drop table test1 if exists"); sql = "CREATE TABLE test1 (col CHAR(30))"; pstmt = conn.prepareStatement(sql); pstmt.execute(); sql = "INSERT INTO test1 (col) VALUES ('one')"; pstmt = conn.prepareStatement(sql); pstmt.execute(); sql = "SELECT * FROM test1 WHERE ( col LIKE ? )"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, "on%"); rs = pstmt.executeQuery(); if (rs.next()) { presult = rs.getString("COL"); } sql = "SELECT * FROM test1 WHERE ( col LIKE 'one' )"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); if (rs.next()) { result = rs.getString("COL"); } assertEquals("\"" + sql + "\"", result, presult); } /* Runs TestLikePredicate test from the command line*/ public static void main(String[] args) throws Exception { TestResult result; TestCase test; java.util.Enumeration failures; int count; result = new TestResult(); test = new TestLikePredicateOptimizations("test"); test.run(result); count = result.failureCount(); System.out.println("TestLikePredicateOptimizations failure count: " + count); failures = result.failures(); while (failures.hasMoreElements()) { System.out.println(failures.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestOdbcService.java0000644000175000017500000003515412007547410023620 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.PreparedStatement; import java.sql.Statement; /** * See AbstractTestOdbc for more general ODBC test information. * * Standard test methods perform the named test, then perform a simple * (non-prepared) query to verify the state of the server is healthy enough * to successfully serve a query. * (We may or many not add test(s) to verify behavior when no static query * follows). * * @see AbstractTestOdbc */ public class TestOdbcService extends AbstractTestOdbc { public TestOdbcService() {} /** * Accommodate JUnit's test-runner conventions. */ public TestOdbcService(String s) { super(s); } public void testSanity() { try { ResultSet rs = netConn.createStatement().executeQuery( "SELECT count(*) FROM nullmix"); if (!rs.next()) { throw new RuntimeException("The most basic query failed. " + "No row count from 'nullmix'."); } assertEquals("Sanity check failed. Rowcount of 'nullmix'", 6, rs.getInt(1)); rs.close(); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError( "The most basic query failed"); ase.initCause(se); throw ase; } } /** * Tests with input and output parameters, and rerunning query with * modified input parameters. */ public void testFullyPreparedQuery() { try { ResultSet rs; PreparedStatement ps = netConn.prepareStatement( "SELECT i, 3, vc, 'str' FROM nullmix WHERE i < ? OR i > ? " + "ORDER BY i"); ps.setInt(1, 10); ps.setInt(2, 30); rs = ps.executeQuery(); assertTrue("No rows fetched", rs.next()); assertEquals("str", rs.getString(4)); assertEquals(5, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("five", rs.getString(3)); assertTrue("Not enough rows fetched", rs.next()); assertEquals(3, rs.getInt(2)); assertEquals(40, rs.getInt(1)); assertEquals("forty", rs.getString(3)); assertEquals("str", rs.getString(4)); assertFalse("Too many rows fetched", rs.next()); rs.close(); ps.setInt(1, 16); ps.setInt(2, 100); rs = ps.executeQuery(); assertTrue("No rows fetched", rs.next()); assertEquals("str", rs.getString(4)); assertEquals(5, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("five", rs.getString(3)); assertTrue("No rows fetched", rs.next()); assertEquals("str", rs.getString(4)); assertEquals(10, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("ten", rs.getString(3)); assertTrue("No rows fetched", rs.next()); assertEquals("str", rs.getString(4)); assertEquals(15, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("fifteen", rs.getString(3)); assertFalse("Too many rows fetched", rs.next()); rs.close(); verifySimpleQueryOutput(); // Verify server state still good } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } } public void testDetailedSimpleQueryOutput() { try { verifySimpleQueryOutput(); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } } /** * Assumes none of the records above i=20 have been modified. */ public void verifySimpleQueryOutput() throws SQLException { ResultSet rs = netConn.createStatement().executeQuery( "SELECT i, 3, vc, 'str' FROM nullmix WHERE i > 20 ORDER BY i"); assertTrue("No rows fetched", rs.next()); assertEquals("str", rs.getString(4)); assertEquals(21, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("twenty one", rs.getString(3)); assertTrue("Not enough rows fetched", rs.next()); assertEquals(3, rs.getInt(2)); assertEquals(25, rs.getInt(1)); assertNull(rs.getString(3)); assertEquals("str", rs.getString(4)); assertTrue("Not enough rows fetched", rs.next()); assertEquals("str", rs.getString(4)); assertEquals(3, rs.getInt(2)); assertEquals(40, rs.getInt(1)); assertEquals("forty", rs.getString(3)); assertFalse("Too many rows fetched", rs.next()); rs.close(); } public void testPreparedNonRowStatement() { try { PreparedStatement ps = netConn.prepareStatement( "UPDATE nullmix set xtra = ? WHERE i < ?"); ps.setString(1, "first"); ps.setInt(2, 25); assertEquals("First update failed", 4, ps.executeUpdate()); ps.setString(1, "second"); ps.setInt(2, 15); assertEquals("Second update failed", 2, ps.executeUpdate()); ps.close(); ResultSet rs = netConn.createStatement().executeQuery( "SELECT i, 3, vc, xtra FROM nullmix ORDER BY i"); assertTrue("No rows fetched", rs.next()); assertEquals("second", rs.getString(4)); assertEquals(5, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("five", rs.getString(3)); assertTrue("No rows fetched", rs.next()); assertEquals("second", rs.getString(4)); assertEquals(10, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("ten", rs.getString(3)); assertTrue("No rows fetched", rs.next()); assertEquals("first", rs.getString(4)); assertEquals(15, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("fifteen", rs.getString(3)); assertTrue("Not enough rows fetched", rs.next()); assertEquals(3, rs.getInt(2)); assertEquals(21, rs.getInt(1)); assertEquals("twenty one", rs.getString(3)); assertEquals("first", rs.getString(4)); assertTrue("Not enough rows fetched", rs.next()); assertEquals(3, rs.getInt(2)); assertEquals(25, rs.getInt(1)); assertNull(rs.getString(3)); assertNull(rs.getString(4)); assertTrue("Not enough rows fetched", rs.next()); assertEquals(3, rs.getInt(2)); assertEquals(40, rs.getInt(1)); assertEquals("forty", rs.getString(3)); assertNull(rs.getString(4)); assertFalse("Too many rows fetched", rs.next()); rs.close(); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } } public void testParamlessPreparedQuery() { try { ResultSet rs; PreparedStatement ps = netConn.prepareStatement( "SELECT i, 3, vc, 'str' FROM nullmix WHERE i != 21 " + "ORDER BY i"); rs = ps.executeQuery(); assertTrue("No rows fetched", rs.next()); assertEquals("str", rs.getString(4)); assertEquals(5, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("five", rs.getString(3)); assertTrue("No rows fetched", rs.next()); assertEquals("str", rs.getString(4)); assertEquals(10, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("ten", rs.getString(3)); assertTrue("No rows fetched", rs.next()); assertEquals("str", rs.getString(4)); assertEquals(15, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("fifteen", rs.getString(3)); assertTrue("Not enough rows fetched", rs.next()); assertEquals(3, rs.getInt(2)); assertEquals(25, rs.getInt(1)); assertNull(rs.getString(3)); assertEquals("str", rs.getString(4)); assertTrue("Not enough rows fetched", rs.next()); assertEquals(3, rs.getInt(2)); assertEquals(40, rs.getInt(1)); assertEquals("forty", rs.getString(3)); assertEquals("str", rs.getString(4)); assertFalse("Too many rows fetched", rs.next()); rs.close(); rs = ps.executeQuery(); assertTrue("No rows fetched", rs.next()); assertEquals("str", rs.getString(4)); assertEquals(5, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("five", rs.getString(3)); assertTrue("No rows fetched", rs.next()); assertEquals("str", rs.getString(4)); assertEquals(10, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("ten", rs.getString(3)); assertTrue("No rows fetched", rs.next()); assertEquals("str", rs.getString(4)); assertEquals(15, rs.getInt(1)); assertEquals(3, rs.getInt(2)); assertEquals("fifteen", rs.getString(3)); assertTrue("Not enough rows fetched", rs.next()); assertEquals(3, rs.getInt(2)); assertEquals(25, rs.getInt(1)); assertNull(rs.getString(3)); assertEquals("str", rs.getString(4)); assertTrue("Not enough rows fetched", rs.next()); assertEquals(3, rs.getInt(2)); assertEquals(40, rs.getInt(1)); assertEquals("forty", rs.getString(3)); assertEquals("str", rs.getString(4)); assertFalse("Too many rows fetched", rs.next()); rs.close(); verifySimpleQueryOutput(); // Verify server state still good } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } } public void testSimpleUpdate() { try { Statement st = netConn.createStatement(); assertEquals(2, st.executeUpdate( "UPDATE nullmix SET xtra = 'updated' WHERE i < 12")); ResultSet rs = netConn.createStatement().executeQuery( "SELECT * FROM nullmix WHERE xtra = 'updated'"); assertTrue("No rows updated", rs.next()); assertTrue("Only one row updated", rs.next()); assertFalse("Too many rows updated", rs.next()); rs.close(); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } } public void testTranSanity() { enableAutoCommit(); testSanity(); } public void testTranFullyPreparedQuery() { enableAutoCommit(); testFullyPreparedQuery(); } public void testTranDetailedSimpleQueryOutput() { enableAutoCommit(); testDetailedSimpleQueryOutput(); } public void testTranPreparedNonRowStatement() { enableAutoCommit(); testPreparedNonRowStatement(); } public void testTranParamlessPreparedQuery() { enableAutoCommit(); testParamlessPreparedQuery(); } public void testTranSimpleUpdate() { enableAutoCommit(); testSimpleUpdate(); } protected void populate(Statement st) throws SQLException { st.executeUpdate("DROP TABLE nullmix IF EXISTS"); st.executeUpdate("CREATE TABLE nullmix " + "(i INT NOT NULL, vc VARCHAR(20), xtra VARCHAR(20))"); // Would be more elegant and efficient to use a prepared statement // here, but our we want this setup to be as simple as possible, and // leave feature testing for the actual unit tests. st.executeUpdate("INSERT INTO nullmix (i, vc) values(10, 'ten')"); st.executeUpdate("INSERT INTO nullmix (i, vc) values(5, 'five')"); st.executeUpdate("INSERT INTO nullmix (i, vc) values(15, 'fifteen')"); st.executeUpdate( "INSERT INTO nullmix (i, vc) values(21, 'twenty one')"); st.executeUpdate("INSERT INTO nullmix (i, vc) values(40, 'forty')"); st.executeUpdate("INSERT INTO nullmix (i) values(25)"); } public static void main(String[] sa) { staticRunner(TestOdbcService.class, sa); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestSchemaParse.java0000644000175000017500000013720012007547410023616 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestSchemaParse extends junit.framework.TestCase { Connection con = null; Statement statement; private static final String ipref = "INFORMATION_SCHEMA."; protected void setUp() throws Exception { Class.forName("org.hsqldb.jdbc.JDBCDriver"); con = DriverManager.getConnection("jdbc:hsqldb:mem:parsetest", "sa", ""); statement = con.createStatement(); execSQL("SET AUTOCOMMIT false", 0); execSQL("CREATE TABLE tsttbl (i INT, vc VARCHAR(100))", 0); execSQL("CREATE TABLE bigtbl (i INT, vc VARCHAR(100), i101 INT, i102 INT, " + "i103 INT, i104 INT, i105 INT, i106 INT, i107 INT, " + "i108 INT, i109 INT, i110 INT, i111 INT, i112 INT, " + "i113 INT, i114 INT, i115 INT, i116 INT, i117 INT, " + "i118 INT, i119 INT)", 0); execSQL("INSERT INTO tsttbl VALUES (1, 'one')", 1); execSQL("INSERT INTO tsttbl VALUES (2, 'two')", 1); execSQL("CREATE TABLE joinedtbl (i2 INT, vc2 VARCHAR(100))", 0); execSQL("INSERT INTO joinedtbl VALUES (2, 'zwei')", 1); execSQL("CREATE TABLE indexedtbl (i3 INT, vc3 VARCHAR(100))", 0); execSQL("INSERT INTO indexedtbl VALUES (3, 'tres')", 1); execSQL("CREATE TABLE triggedtbl (i4 INT, vc4 VARCHAR(100))", 0); // Can't test text tables in memory-only DB. //execSQL("CREATE TEXT TABLE texttbl (i5 INT, vc5 VARCHAR(100))", 0); execSQL("INSERT INTO triggedtbl VALUES (4, 'quatro')", 1); execSQL("CREATE FUNCTION tstali(VARCHAR(100)) RETURNS VARCHAR(100) " + "LANGUAGE JAVA EXTERNAL NAME " + "'CLASSPATH:org.hsqldb.test.BlaineTrig.capitalize'", 0); execSQL("CREATE UNIQUE INDEX tstind ON indexedtbl (i3)", 0); execSQL("CREATE SEQUENCE tstseq", 0); execSQL("CREATE TRIGGER tsttrig AFTER INSERT ON triggedtbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", 0); execSQL("CREATE USER tstuser PASSWORD fake", 0); execSQL("CREATE TABLE constrainedtbl (i6 INT, vc6 VARCHAR(100), " + "CONSTRAINT ucons UNIQUE(i6))", 0); execSQL("CREATE TABLE primarytbl (i8 INT, i18 INT, vc8 VARCHAR(100), " + "UNIQUE(i8), UNIQUE(i18))", 0); execSQL( "CREATE TABLE foreigntbl (i7 INT, vc7 VARCHAR(100), " + "CONSTRAINT tstfk FOREIGN KEY (i7) REFERENCES primarytbl (i8))", 0); execSQL("CREATE TABLE playtbl (i9 INT, vc9 VARCHAR(100))", 0); execSQL("CREATE TABLE toindextbl (i10 INT, vc10 VARCHAR(100))", 0); execSQL("INSERT INTO toindextbl VALUES (10, 'zehn')", 1); // Do the view last since it can cause dependendies with indexes, etc. execSQL("CREATE VIEW tstview AS SELECT * FROM tsttbl WHERE i < 10", 0); execSQL("COMMIT", 0); } // Want to permit the SHUTDOWN SQL command in tearDown() to fail iff // the test method run has tested SHUTDOWN. private boolean shutdownTested = false; protected void tearDown() throws Exception { // Shut down to destroy all of the DB objects (only works because // it's an in-memory instance. execSQL("SHUTDOWN", shutdownTested); if (con != null) { con.close(); } super.tearDown(); } public void test2pTables() throws Exception { String prefix = "public."; execSQL("DROP VIEW tstview", 0); // Just so deps don't cause problems // Select commands assertEquals(2, queryRowCount("SELECT i FROM " + prefix + "tsttbl WHERE i IN (1, 2, 3)")); execSQL("CREATE TABLE " + prefix + "newtbl AS (SELECT * FROM tsttbl) WITH DATA", 0); assertEquals(2, queryRowCount("SELECT admin FROM " + ipref + "system_users")); assertEquals("Sub-query", 1, queryRowCount("SELECT vc FROM " + prefix + "tsttbl WHERE i = (\n" + " SELECT i2 FROM " + prefix + "joinedtbl\n" + ")")); assertEquals("Join", 1, queryRowCount("SELECT vc FROM " + prefix + "tsttbl, " + prefix + "joinedtbl\n" + "WHERE tsttbl.i = joinedtbl.i2\n" + "AND joinedtbl.vc2 = 'zwei'")); // Selects using Labels/Aliases assertEquals( 2, queryRowCount( "SELECT ali.i FROM " + prefix + "tsttbl ali WHERE ali.i IN (1, 2, 3)")); execSQL("CREATE TABLE " + prefix + "newtbl2 AS (SELECT * FROM tsttbl) WITH DATA", 0); execSQL("CREATE TABLE newtbl3 AS (SELECT * FROM " + prefix + "tsttbl ali) WITH DATA", 0); execSQL("CREATE TABLE "+ prefix + "newtbl4 AS (SELECT * FROM " + prefix + "tsttbl ali) WITH DATA", 0); assertEquals(2, queryRowCount("SELECT ali.admin FROM " + ipref + "system_users ali")); assertEquals("Sub-query", 1, queryRowCount("SELECT ali.vc FROM " + prefix + "tsttbl ali WHERE i = (\n" + " SELECT bali.i2 FROM " + prefix + "joinedtbl bali\n" + ")")); assertEquals("Join", 1, queryRowCount("SELECT ali.vc FROM " + prefix + "tsttbl ali, " + prefix + "joinedtbl bali\n" + "WHERE ali.i = bali.i2\n" + "AND bali.vc2 = 'zwei'")); /* Mixed aliases not working yet assertEquals("Join", 1, queryRowCount( "SELECT ali.vc FROM " + prefix + "tsttbl ali, " + prefix + "joinedtbl bali\nWHERE tsttbl.i = joinedtbl.i2\n" + "AND bali.vc2 = 'zwei'")); */ // Alter Table commands execSQL("ALTER TABLE " + prefix + "playtbl RENAME TO " + prefix + "renamedtbl", 0); execSQL("ALTER TABLE " + prefix + "renamedtbl RENAME TO " + prefix + "playtbl", 0); execSQL("ALTER TABLE " + prefix + "constrainedtbl ADD CONSTRAINT con1 CHECK (i6 > 4)", 0); execSQL("ALTER TABLE " + prefix + "tsttbl ADD COLUMN vco1 VARCHAR(100)", 0); execSQL("ALTER TABLE " + prefix + "tsttbl DROP COLUMN vco1", 0); execSQL("ALTER TABLE " + prefix + "tsttbl ADD COLUMN vco1 VARCHAR(100)", 0); execSQL("ALTER TABLE " + prefix + "tsttbl ALTER COLUMN vco1 RENAME TO j1", 0); execSQL("ALTER TABLE " + prefix + "constrainedtbl DROP CONSTRAINT con1", 0); execSQL("ALTER TABLE " + prefix + "foreigntbl DROP CONSTRAINT tstfk", 0); execSQL("ALTER TABLE " + prefix + "foreigntbl ADD CONSTRAINT tstfk FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", 0); execSQL("ALTER TABLE " + prefix + "playtbl ADD CONSTRAINT ucons9 UNIQUE (i9)", 0); // Drop table command execSQL("DROP TABLE " + prefix + "playtbl", 0); // Set table readonly command execSQL("SET TABLE " + prefix + "tsttbl READONLY true", 0); execSQL("SET TABLE " + prefix + "tsttbl READONLY false", 0); // Create table commands execSQL("CREATE TABLE " + prefix + "tsttbly (i INT, vc VARCHAR(100))", 0); execSQL("CREATE CACHED TABLE " + prefix + "tsttblx (i INT, vc VARCHAR(100))", 0); execSQL("CREATE TABLE constrz (i6 INT, vc6 VARCHAR(100), " + "CONSTRAINT uconsz UNIQUE(i6))", 0); execSQL( "CREATE TABLE forztbl (i7 INT, vc7 VARCHAR(100), " + "CONSTRAINT tstfkz FOREIGN KEY (i7) REFERENCES primarytbl (i8))", 0); // Update command execSQL("UPDATE " + prefix + "tsttbl SET vc = 'eleven' WHERE i = 1", 1); // delete execSQL("DELETE FROM " + prefix + "tsttbl WHERE i = 1", 1); // grant, revoke execSQL("GRANT ALL ON " + prefix + "tsttbl TO tstuser", 0); execSQL("REVOKE ALL ON " + prefix + "tsttbl FROM tstuser RESTRICT", 0); } public void test2pViews() throws Exception { String prefix = "public."; assertEquals(2, queryRowCount("SELECT i FROM " + prefix + "tstview WHERE i IN (1, 2, 3)")); assertEquals(2, queryRowCount("SELECT i FROM tstview")); assertEquals(2, queryRowCount("SELECT ali.i FROM tstview ali")); assertEquals("Sub-query", 1, queryRowCount("SELECT vc FROM " + prefix + "tstview WHERE i = (\n" + " SELECT i2 FROM " + prefix + "joinedtbl\n" + ")")); assertEquals("Join", 1, queryRowCount("SELECT vc FROM " + prefix + "tstview, " + prefix + "joinedtbl\n" + "WHERE tstview.i = joinedtbl.i2\n" + "AND joinedtbl.vc2 = 'zwei'")); assertEquals( 2, queryRowCount( "SELECT i FROM " + prefix + "tstview ali WHERE ali.i IN (1, 2, 3)")); // view execSQL("CREATE VIEW " + prefix + "tstview2 AS SELECT * FROM tsttbl WHERE i < 10", 0); // grant, revoke execSQL("GRANT ALL ON " + prefix + "tstview TO tstuser", 0); execSQL("REVOKE ALL ON " + prefix + "tstview FROM tstuser RESTRICT", 0); // drop execSQL("DROP VIEW tstview", 0); } public void test2pSequences() throws Exception { String prefix = "public."; execSQL("CREATE SEQUENCE " + prefix + "tstseq2", 0); execSQL("ALTER SEQUENCE " + prefix + "tstseq RESTART WITH 23", 0); assertEquals(1, queryRowCount("SELECT next value FOR " + prefix + "tstseq FROM tsttbl WHERE i = 1")); execSQL("DROP SEQUENCE " + prefix + "tstseq", 0); } public void test2pConstraints() throws Exception { String prefix = "public."; // Some named constraints execSQL("CREATE TABLE constbl1 (i11 INT, vc12 VARCHAR(100), " + "CONSTRAINT " + prefix + "uconsw UNIQUE(vc12))", 0); execSQL("CREATE TABLE constbl2 (i11 INT, vc12 VARCHAR(100), " + "CONSTRAINT " + prefix + "chk CHECK (i11 > 4))", 0); execSQL("CREATE TABLE for2tbl (i7 INT, vc7 VARCHAR(100), " + "CONSTRAINT " + prefix + "tstfk2 FOREIGN KEY (i7) REFERENCES primarytbl (i8))", 0); execSQL("CREATE TABLE for3tbl (i7 INT, vc7 VARCHAR(100), " + "CONSTRAINT " + prefix + "tstpk2 PRIMARY KEY (i7))", 0); execSQL("ALTER TABLE constrainedtbl ADD CONSTRAINT " + prefix + "con1 CHECK (i6 > 4)", 0); execSQL("ALTER TABLE foreigntbl ADD CONSTRAINT " + prefix + "tstfkm FOREIGN KEY " + "(i7) REFERENCES primarytbl (i18)", 0); execSQL("ALTER TABLE for3tbl DROP CONSTRAINT " + prefix + "tstpk2", 0); } public void test2pIndexes() throws Exception { String prefix = "public."; execSQL("CREATE UNIQUE INDEX playind ON playtbl (i9)", 0); execSQL("CREATE UNIQUE INDEX bigind ON bigtbl (i)", 0); execSQL("CREATE UNIQUE INDEX " + prefix + "tstind2 ON tsttbl (i)", 0); execSQL("ALTER INDEX " + prefix + "playind RENAME TO renamedind", 0); execSQL("ALTER INDEX " + prefix + "renamedind RENAME TO " + prefix + "tstind22", 0); execSQL("ALTER INDEX tstind RENAME TO " + prefix + "renamedind", 0); execSQL("DROP INDEX " + prefix + "bigind", 0); } public void test2pAliases() throws Exception { String prefix = "public."; // All occurrences of "expect" in this method indicate bugs. // When fixed, don't change the value of "expect" in the method body. int expect = 0; expect = SQL_ABORT; execSQL("CREATE FUNCTION " + prefix + "tstalias(A VARCHAR(100)) " + "RETURNS VARCHAR(100) " + "LANGUAGE JAVA EXTERNAL NAME \'org.hsqldb.test.BlaineTrig.capitalize\'", 0); // Following should not throw an exception: assertEquals( 1, queryRowCount( "SELECT " + prefix + "tstalias('helo') FROM tsttbl WHERE i = 1")); } public void test2pTriggers() throws Exception { String prefix = "public."; execSQL("CREATE TRIGGER " + prefix + "tsttrig2 AFTER INSERT ON triggedtbl " + "CALL \"org.hsqldb.test.BlaineTrig\"", 0); execSQL("DROP TRIGGER " + prefix + "tsttrig", 0); } public void testSanityCheck() throws Exception { // All occurrences of "expect" in this method indicate bugs. // When fixed, change the value of "expect" to 0: int expect = SQL_ABORT; // The most basic CREATEs and INSERTs would have already failed // in the setup method. // Get rid of view early so it doesn't cause dependency problems. assertEquals(2, queryRowCount("SELECT i FROM tstview")); execSQL("DROP VIEW tstview", 0); execSQL("CREATE CACHED TABLE cachtbl (i INT, vc VARCHAR(100))", 0); execSQL("SET TABLE tsttbl READONLY true", 0); execSQL("SET TABLE tsttbl READONLY false", 0); execSQL("INSERT INTO tsttbl VALUES (11, 'eleven')", 1); assertEquals(1, queryRowCount("SELECT i FROM tsttbl WHERE i = 1")); assertEquals( 2, queryRowCount("SELECT i FROM tsttbl WHERE i IN (1, 2, 3)")); execSQL("ALTER SEQUENCE tstseq RESTART WITH 13", 0); execSQL("ALTER TABLE playtbl RENAME TO renamedtbl", 0); execSQL("ALTER TABLE renamedtbl RENAME TO playtbl", 0); execSQL("DROP INDEX tstind", 0); execSQL("DROP TABLE bigtbl", 0); execSQL("DROP SEQUENCE tstseq", 0); execSQL("SET FILES LOG SIZE 5", 0); // Following syntax is now obsolete. execSQL("SET PROPERTY \"hsqldb.first_identity\" 4", SQL_ABORT); execSQL("UPDATE tsttbl SET vc = 'eleven' WHERE i = 1", 1); execSQL( "ALTER TABLE constrainedtbl ADD CONSTRAINT con1 CHECK (i6 > 4)", 0); // Can't test text tables in in-memory DB. execSQL("COMMIT", 0); execSQL("DELETE FROM tsttbl WHERE i < 10", 2); assertEquals(1, queryRowCount("SELECT i FROM tsttbl")); execSQL("ROLLBACK", 0); assertEquals(3, queryRowCount("SELECT i FROM tsttbl")); // Remember that inserts must change after adding a column. execSQL("ALTER TABLE tsttbl ADD COLUMN vco1 VARCHAR(100)", 0); execSQL("ALTER TABLE tsttbl DROP COLUMN vco1", 0); execSQL("CREATE UNIQUE INDEX tstind ON tsttbl (i)", 0); execSQL("SET AUTOCOMMIT true", 0); execSQL("SET AUTOCOMMIT false", 0); execSQL("SET IGNORECASE true", 0); execSQL("SET IGNORECASE false", 0); execSQL("SET PASSWORD blah", 0); execSQL("SET PASSWORD 'blah'", 0); execSQL("SET DATABASE REFERENTIAL INTEGRITY true", 0); execSQL("GRANT ALL ON playtbl TO tstuser", 0); execSQL("REVOKE ALL ON playtbl FROM tstuser RESTRICT", 0); // TODO: These should not throw a Null Pointer exception. execSQL("ALTER INDEX tstind RENAME TO renamedind", 0); execSQL("ALTER INDEX renamedind RENAME TO tstind", 0); execSQL("ALTER USER tstuser SET PASSWORD frank", 0); execSQL("ALTER USER tstuser SET PASSWORD 'frank'", 0); execSQL("ALTER TABLE tsttbl ADD COLUMN vco1 VARCHAR(100)", 0); execSQL("ALTER TABLE tsttbl ALTER COLUMN vco1 RENAME TO j1", 0); execSQL("ALTER TABLE constrainedtbl DROP CONSTRAINT con1", 0); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", 0); execSQL("ALTER TABLE foreigntbl ADD CONSTRAINT tstfk FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", 0); assertEquals("Sub-query", 1, queryRowCount("SELECT vc FROM tsttbl WHERE i = (\n" + " SELECT i2 FROM joinedtbl\n" + ")")); assertEquals( "Join", 1, queryRowCount( "SELECT vc FROM tsttbl, joinedtbl WHERE tsttbl.i = joinedtbl.i2\n" + "AND joinedtbl.vc2 = 'zwei'")); // Over-specified table names assertEquals( "Over-specified Query 1", 1, queryRowCount("SELECT tsttbl.i FROM tsttbl WHERE tsttbl.i = 1")); assertEquals("Over-specified Query 2", 1, queryRowCount("SELECT tsttbl.i FROM tsttbl WHERE i = 1")); assertEquals("Over-specified Query 3", 1, queryRowCount("SELECT i FROM tsttbl WHERE tsttbl.i = 1")); // HSQLDB labels, Oracle aliases assertEquals("Trivial Label/alias 1", 1, queryRowCount("SELECT i FROM tsttbl ali WHERE i = 1")); assertEquals("Trivial Label/alias 2", 1, queryRowCount("SELECT i FROM tsttbl AS ali WHERE i = 1")); assertEquals( "Trivial Label/alias 3", 1, queryRowCount("SELECT ali.i FROM tsttbl ali WHERE i = 1")); assertEquals( "Trivial Label/alias 4", 1, queryRowCount("SELECT i FROM tsttbl ali WHERE ali.i = 1")); assertEquals( "Trivial Label/alias 5", 1, queryRowCount("SELECT ali.i FROM tsttbl ali WHERE ali.i = 1")); /** * Uncomment when this mixing of aliases and real names is fixed. * * assertEquals("Mixed Label/aliases 1", 1, queryRowCount( * "SELECT tsttbl.i FROM tsttbl ali WHERE i = 1")); * assertEquals("Mixed Label/aliases 2", 1, queryRowCount( * "SELECT i FROM tsttbl ali WHERE tsttbl.i = 1")); * assertEquals("Mixed Label/aliases 3", 1, queryRowCount( * "SELECT tsttbl.i FROM tsttbl ali WHERE tsttbl.i = 1")); * assertEquals("Mixed Label/aliases 4", 1, queryRowCount( * "SELECT tsttbl.i FROM tsttbl ali WHERE ali.i = 1")); * assertEquals("Mixed Label/aliases 5", 1, queryRowCount( * "SELECT ali.i FROM tsttbl ali WHERE tsttbl.i = 1")); */ assertEquals( "Join w/Labels/aliases 1", 1, queryRowCount( "SELECT vc FROM tsttbl ali1, joinedtbl ali2\n" + "WHERE i = i2 AND vc2 = 'zwei'")); assertEquals( "Join w/Labels/aliases 2", 1, queryRowCount( "SELECT vc FROM tsttbl ali1, joinedtbl ali2\n" + "WHERE ali1.i = i2 AND ali2.vc2 = 'zwei'")); assertEquals( "Join w/Labels/aliases 3", 1, queryRowCount( "SELECT ali1.vc FROM tsttbl ali1, joinedtbl ali2\n" + "WHERE ali1.i = i2 AND ali2.vc2 = 'zwei'")); assertEquals( "Join w/Labels/aliases 4", 1, queryRowCount( "SELECT ali1.vc FROM tsttbl ali1, joinedtbl ali2\n" + "WHERE i = i2 AND vc2 = 'zwei'")); /** * Uncomment when this mixing of aliases and real names is fixed. * assertEquals("Join w/Mixed Labels/aliases 1", 1, queryRowCount( * "SELECT vc FROM tsttbl ali1, joinedtbl ali2\n" * + "WHERE tsttbl.i = i2 AND vc2 = 'zwei'")); * assertEquals("Join w/Mixed Labels/aliases 2", 1, queryRowCount( * "SELECT vc FROM tsttbl ali1, joinedtbl ali2\n" * + "WHERE tsttbl.i = i2 AND joinedtbl.vc2 = 'zwei'")); * assertEquals("Join w/Mixed Labels/aliases 3", 1, queryRowCount( * "SELECT ali1.vc FROM tsttbl ali1, joinedtbl ali2\n" * + "WHERE ali1.i = i2 AND joinedtbl.vc2 = 'zwei'")); * assertEquals("Join w/Mixed Labels/aliases 4", 1, queryRowCount( * "SELECT tsttbl.vc FROM tsttbl ali1, joinedtbl ali2\n" * + "WHERE ali1.i = i2 AND ali2.vc2 = 'zwei'")); * assertEquals("Join w/Mixed Labels/aliases 5", 1, queryRowCount( * "SELECT tsttbl.vc FROM tsttbl ali1, joinedtbl ali2\n" * + "WHERE i = i2 AND vc2 = 'zwei'")); * assertEquals("Join w/Mixed Labels/aliases 6", 1, queryRowCount( * "SELECT tsttbl.vc FROM tsttbl ali1, joinedtbl ali2\n" * + "WHERE i = i2 AND joinedtbl.vc2 = 'zwei'")); */ execSQL("CHECKPOINT bad", expect); execSQL("INSERT INTO tsttbl(i, vc) VALUES (12, 'twelve')", 1); execSQL("CREATE TABLE newtbl AS (SELECT * FROM tsttbl) WITH DATA", 0); } public void testTwoPartKeywords() throws Exception { multiPartKeywords("public."); } public void testInvalidTwoPartKeywords() throws Exception { multiPartKeywords("alpha."); } public void testThreePartKeywords() throws Exception { multiPartKeywords("public.public."); } public void testInvalidThreePartKeywords() throws Exception { multiPartKeywords("alpha.public."); } public void multiPartKeywords(String pref) throws Exception { /* * Search for "expect =". This indicates a bug that needs fixing. */ /* * IMPORTANT!!!! When fixed, the method should NOT change the * expect value from SQL_ABORT. * Where "expect" is used there is always a real error. */ int expect = SQL_ABORT; // If > 2 name parts. E.g. "x.y.z". boolean manyParter = (pref.lastIndexOf('.') != pref.indexOf('.')); // Prep for we will attempt to drop later execSQL("DROP VIEW tstview", 0); // Don't want dep. problems execSQL("CREATE TABLE adroptbl (i INT, vc VARCHAR(100))", 0); execSQL("CREATE TABLE bdroptbl (i INT, vc VARCHAR(100))", 0); execSQL("CREATE UNIQUE INDEX adropind ON adroptbl (i)", 0); execSQL("CREATE UNIQUE INDEX bdropind ON bdroptbl (i)", 0); execSQL("CREATE SEQUENCE bdropseq", 0); execSQL("CREATE SEQUENCE adropseq", 0); execSQL("CREATE TRIGGER adroptrig AFTER INSERT ON adroptbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", 0); execSQL("CREATE TRIGGER bdroptrig AFTER INSERT ON bdroptbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", 0); execSQL("CREATE VIEW adropviewx AS SELECT * FROM adroptbl", 0); execSQL("CREATE VIEW bdropviewx AS SELECT * FROM bdroptbl", 0); execSQL("ALTER TABLE playtbl ADD COLUMN newc VARCHAR(100)", 0); // prep execSQL("SET TABLE tsttbl READONLY false", 0); // reset execSQL("SET TABLE tsttbl READONLY " + pref + "true", expect); execSQL(pref + "CREATE SEQUENCE tstseqa", expect); execSQL(pref + "SET PROPERTY \"hsqldb.first_identity\" 4", expect); execSQL("SET " + pref + "PROPERTY \"hsqldb.first_identity\" 4", expect); /* This block not keywords, but other non-Strings */ execSQL("SELECT i FROM tsttbl WHERE i = " + pref + "1", expect); execSQL("SELECT i FROM tsttbl WHERE vc = " + pref + "'1.3'", expect); execSQL("SELECT i FROM tsttbl WHERE vc = " + pref + "1", expect); execSQL("SELECT i FROM tsttbl WHERE i = " + pref + "'1.3'", expect); execSQL("SELECT i FROM tsttbl WHERE " + pref + "1 = " + pref + "1", expect); execSQL("SELECT i FROM tsttbl WHERE " + pref + "'1.3' = " + pref + "'1.3'", expect); execSQL("SELECT i FROM tsttbl WHERE " + pref + "true = " + pref + "true", expect); execSQL("SELECT i FROM tsttbl WHERE i " + pref + "IN (2, 4)", expect); execSQL("SELECT i FROM tsttbl WHERE i < 3 y.AND i > 0", expect); execSQL("SELECT i FROM tsttbl WHERE i < y.3 AND i > 0", expect); execSQL("INSERT INTO tsttbl VALUES (" + pref + "1, 'one')", expect); execSQL("CREATE VIEW tstviewx AS SELECT " + pref + "* FROM tsttbl WHERE i < 10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL("INSERT INTO tsttbl VALUES (1, " + pref + "'one')", expect); execSQL("CREATE UNIQUE INDEX tstinda ON toindextbl (" + pref + "i10)", expect); execSQL("DROP INDEX tstinda IF EXISTS", 0); // reset execSQL("CREATE VIEW tstviewx AS SELECT * FROM tsttbl WHERE i < " + pref + "10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL("xDROP VIEW adropview", expect); execSQL("DROP xVIEW bdropview", expect); execSQL("xDROP TRIGGER adroptrig", expect); execSQL("DROP xTRIGGER bdroptrig", expect); execSQL("xDROP INDEX adropind", expect); execSQL("DROP xINDEX bdropind", expect); execSQL("xDROP TABLE adroptbl", expect); execSQL("DROP xTABLE bdroptbl", expect); execSQL("xDROP SEQUENCE adropseq", expect); execSQL("DROP xSEQUENCE bdropseq", expect); execSQL("SET LOGSIZE " + pref + "5", expect); // Can't test text tables in in-memory DB. execSQL(pref + "SET TABLE texttbl SOURCE \"test.csv;fs=|\"", expect); execSQL("SET " + pref + "TABLE texttbl SOURCE \"test.csv;fs=|\"", expect); execSQL("SET TABLE texttbl " + pref + "SOURCE \"test.csv;fs=|\"", expect); execSQL("SET TABLE texttbl SOURCE " + pref + "\"test.csv;fs=|\"", expect); execSQL("UPDATE tsttbl SET vc = " + pref + "'eleven' WHERE i = 1", expect); execSQL("UPDATE tsttbl SET vc = 'eleven' WHERE i = " + pref + "1", expect); execSQL("ALTER SEQUENCE tstseq RESTART WITH " + pref + "13", expect); execSQL("ALTER TABLE constrainedtbl ADD CONSTRAINT con1 CHECK (i6 > " + pref + "4)", expect); execSQL(pref + "INSERT INTO tsttbl VALUES (1, 'one')", expect); execSQL("INSERT " + pref + "INTO tsttbl VALUES (1, 'one')", expect); execSQL(pref + "DELETE FROM tsttbl WHERE i < 10", expect); execSQL(pref + "SELECT i FROM tsttbl", expect); execSQL("SELECT i " + pref + "FROM tsttbl", expect); execSQL("SELECT i FROM tsttbl " + pref + "WHERE i > 0", expect); execSQL(pref + "CREATE ALIAS alpha.tstalia " + "FOR \"org.hsqldb.test.BlaineTrig.capitalize\"", expect); execSQL("CREATE " + pref + "ALIAS tstalib " + "FOR \"org.hsqldb.test.BlaineTrig.capitalize\"", expect); execSQL("CREATE ALIAS tstalic " + pref + "FOR \"org.hsqldb.test.BlaineTrig.capitalize\"", expect); execSQL("CREATE ALIAS tstalid " + "FOR " + pref + "\"org.hsqldb.test.BlaineTrig.capitalize\"", expect); execSQL("ALTER " + pref + "TABLE playtbl DROP COLUMN newc", expect); execSQL("CREATE " + pref + "SEQUENCE tstseqb", expect); execSQL("CREATE " + pref + "TRIGGER tsttrigx AFTER INSERT ON triggedtbl CALL '" + "org.hsqldb.test.BlaineTrig'", expect); execSQL("CREATE " + pref + "USER tstusera PASSWORD fake", expect); execSQL("CREATE VIEW tstviewx " + pref + "AS SELECT * FROM tsttbl WHERE i < 10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL("CREATE UNIQUE " + pref + "INDEX tstinda ON toindextbl (i10)", expect); execSQL("DROP INDEX tstinda IF EXISTS", 0); // reset execSQL("CREATE " + pref + "INDEX tstinda ON toindextbl (i10)", expect); execSQL("DROP INDEX tstinda IF EXISTS", 0); // reset execSQL("CREATE TRIGGER tsttrigy " + pref + "AFTER INSERT ON triggedtbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", expect); execSQL("CREATE USER tstuserb " + pref + "PASSWORD fake", expect); execSQL("CREATE VIEW tstviewx AS " + pref + "SELECT * FROM tsttbl WHERE i < 10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL("CREATE UNIQUE INDEX tstinda " + pref + "ON toindextbl (i10)", expect); execSQL("DROP INDEX tstinda IF EXISTS", 0); // reset execSQL("CREATE TRIGGER tsttrigz AFTER " + pref + "INSERT ON triggedtbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", expect); execSQL("CREATE VIEW tstviewx AS SELECT * " + pref + "FROM tsttbl WHERE i < 10", expect); execSQL("CREATE USER tstuserc PASSWORD " + pref + "fake", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL("CREATE TRIGGER tsttriga AFTER INSERT " + pref + "ON triggedtbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", expect); execSQL("CREATE TRIGGER tsttrigb AFTER INSERT ON triggedtbl " + pref + "CALL \"" + "org.hsqldb.test.BlaineTrig\"", expect); execSQL("CREATE VIEW tstviewx AS SELECT * FROM tsttbl " + pref + "WHERE i < 10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL("CREATE TRIGGER tsttrigc AFTER INSERT ON triggedtbl CALL " + pref + "\"org.hsqldb.test.BlaineTrig'", expect); execSQL("CREATE " + pref + "UNIQUE INDEX tstindx ON toindextbl (i10)", expect); execSQL("DROP INDEX tstinda IF EXISTS", 0); // reset execSQL( "CREATE " + pref + "VIEW tstviewx AS SELECT * FROM tsttbl WHERE i < 10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL(pref + "CREATE USER tstuserd PASSWORD fake", expect); execSQL(pref + "CREATE TRIGGER tsttrigd AFTER INSERT ON triggedtbl CALL \"" + "org.hsqldb.test.BlaineTrig\"", expect); execSQL( pref + "CREATE VIEW tstviewx AS SELECT * FROM tsttbl WHERE i < 10", expect); execSQL("DROP VIEW tstviewx IF EXISTS", 0); // reset execSQL(pref + "CREATE UNIQUE INDEX tstinda ON toindextbl (i10)", expect); execSQL("DROP INDEX tstinda IF EXISTS", 0); // reset execSQL("CREATE TABLE t1 (i " + pref + "INT, vc VARCHAR)", expect); execSQL("DROP TABLE t1 IF EXISTS", 0); // reset execSQL("CREATE TABLE t1 (i INT, vc " + pref + "VARCHAR)", expect); execSQL("DROP TABLE t1 IF EXISTS", 0); // reset execSQL(pref + "CREATE TABLE t1 (i INT, vc VARCHAR)", expect); execSQL("DROP TABLE t1 IF EXISTS", 0); // reset execSQL("CREATE " + pref + "TABLE t1 (i INT, vc VARCHAR)", expect); execSQL("DROP TABLE t1 IF EXISTS", 0); // reset execSQL("CREATE TABLE t1 (i " + pref + "INT, vc VARCHAR)", expect); execSQL("DROP TABLE t1 IF EXISTS", 0); // reset execSQL("CREATE TABLE t1 (i INT, vc " + pref + "VARCHAR)", expect); execSQL("DROP TABLE t1 IF EXISTS", 0); // reset execSQL("DELETE " + pref + "FROM tsttbl WHERE i < 10", expect); execSQL("DELETE FROM tsttbl " + pref + "WHERE i < 10", expect); execSQL(pref + "SET AUTOCOMMIT true", expect); execSQL("SET " + pref + "AUTOCOMMIT true", expect); execSQL("SET AUTOCOMMIT false", 0); // reset execSQL(pref + "SET IGNORECASE true", expect); execSQL("SET " + pref + "IGNORECASE true", expect); execSQL(pref + "SET LOGSIZE 5", expect); execSQL("SET " + pref + "LOGSIZE 5", expect); execSQL(pref + "SET PASSWORD blah", expect); execSQL("SET " + pref + "PASSWORD blah", expect); execSQL(pref + "SET REFERENTIAL_INTEGRITY true", expect); execSQL("SET " + pref + "REFERENTIAL_INTEGRITY true", expect); // Can't test text tables in in-memory DB. execSQL(pref + "SET SCRIPTFORMAT text", expect); execSQL("SET " + pref + "SCRIPTFORMAT text", expect); execSQL(pref + "SET TABLE tsttbl READONLY true", expect); execSQL("SET " + pref + "TABLE tsttbl READONLY true", expect); execSQL("SET TABLE tsttbl READONLY false", 0); // reset execSQL(pref + "GRANT ALL ON playtbl TO tstuser", expect); execSQL("GRANT " + pref + "ALL ON playtbl TO tstuser", expect); execSQL("GRANT ALL " + pref + "ON playtbl TO tstuser", expect); execSQL("GRANT ALL ON playtbl " + pref + "TO tstuser", expect); execSQL("GRANT ALL ON playtbl TO " + pref + "tstuser", expect); execSQL(pref + "REVOKE ALL ON playtbl FROM tstuser RESTRICT", expect); execSQL("REVOKE " + pref + "ALL ON playtbl FROM tstuser RESTRICT", expect); execSQL("REVOKE ALL " + pref + "ON playtbl FROM tstuser RESTRICT", expect); execSQL("REVOKE ALL ON playtbl " + pref + "FROM tstuser RESTRICT", expect); execSQL("REVOKE ALL ON playtbl FROM " + pref + "tstuser RESTRICT", expect); execSQL("GRANT ALL ON playtbl TO tstuser", 0); // reset execSQL(pref + "COMMIT", expect); execSQL(pref + "ROLLBACK", expect); execSQL(pref + "UPDATE tsttbl SET vc = 'eleven' WHERE i = 1", expect); execSQL("UPDATE tsttbl " + pref + "SET vc = 'eleven' WHERE i = 1", expect); execSQL("UPDATE tsttbl SET vc = 'eleven' " + pref + "WHERE i = 1", expect); execSQL(pref + "ALTER INDEX tstind RENAME TO renamedind", expect); execSQL("ALTER INDEX tstind " + pref + "RENAME TO renamedind", expect); execSQL("ALTER " + pref + "INDEX tstind RENAME TO renamedind", expect); execSQL("ALTER INDEX tstind RENAME " + pref + "TO renamedind", expect); execSQL(pref + "ALTER SEQUENCE tstseq RESTART WITH 13", expect); execSQL("ALTER " + pref + "SEQUENCE tstseq RESTART WITH 13", expect); execSQL("ALTER SEQUENCE tstseq " + pref + "RESTART WITH 13", expect); execSQL("ALTER SEQUENCE tstseq RESTART " + pref + "WITH 13", expect); execSQL("ALTER USER tstuser SET PASSWORD " + pref + "frank", expect); execSQL(pref + "ALTER USER tstuser SET PASSWORD frank", expect); execSQL("ALTER " + pref + "USER tstuser SET PASSWORD frank", expect); execSQL("ALTER USER tstuser " + pref + "SET PASSWORD frank", expect); execSQL("ALTER USER tstuser SET " + pref + "PASSWORD frank", expect); execSQL(pref + "ALTER TABLE tsttbl ADD COLUMN vco1 VARCHAR", expect); execSQL("ALTER " + pref + "TABLE tsttbl ADD COLUMN vco2 VARCHAR", expect); execSQL("ALTER TABLE tsttbl " + pref + "ADD COLUMN vco3 VARCHAR", expect); execSQL("ALTER TABLE tsttbl ADD " + pref + "COLUMN vco4 VARCHAR", expect); execSQL("ALTER TABLE tsttbl ADD " + pref + "COLUMN vco5 " + pref + "VARCHAR", expect); execSQL("ALTER TABLE bigtbl DROP " + pref + "COLUMN i103", expect); execSQL("ALTER TABLE bigtbl " + pref + "DROP COLUMN i102", expect); execSQL(pref + "ALTER TABLE bigtbl DROP COLUMN i101", expect); execSQL(pref + "ALTER TABLE bigtbl ALTER COLUMN i104 RENAME TO j1", expect); execSQL("ALTER " + pref + "TABLE bigtbl ALTER COLUMN i105 RENAME TO j2", expect); execSQL("ALTER TABLE bigtbl " + pref + "ALTER COLUMN i106 RENAME TO j3", expect); execSQL("ALTER TABLE bigtbl ALTER " + pref + "COLUMN i107 RENAME TO j4", expect); execSQL("ALTER TABLE bigtbl ALTER COLUMN i108 " + pref + "RENAME TO j5", expect); execSQL("ALTER TABLE bigtbl ALTER COLUMN i109 RENAME " + pref + "TO j6", expect); execSQL( pref + "ALTER TABLE constrainedtbl ADD CONSTRAINT con2 CHECK (i6 > 4)", expect); execSQL( "ALTER " + pref + "TABLE constrainedtbl ADD CONSTRAINT con3 CHECK (i6 > 4)", expect); execSQL("ALTER TABLE constrainedtbl " + pref + "ADD CONSTRAINT con4 CHECK (i6 > 4)", expect); execSQL( "ALTER TABLE constrainedtbl ADD CONSTRAINT con1 CHECK (i6 > 4)", true); // setup execSQL( "ALTER TABLE constrainedtbl ADD CONSTRAINT con2 CHECK (i6 > 4)", true); // setup execSQL( "ALTER TABLE constrainedtbl ADD CONSTRAINT con3 CHECK (i6 > 4)", true); // setup execSQL( "ALTER TABLE constrainedtbl ADD CONSTRAINT con4 CHECK (i6 > 4)", true); // setup execSQL("ALTER TABLE constrainedtbl ADD " + pref + "CONSTRAINT con5 CHECK (i6 > 4)", expect); execSQL("ALTER TABLE constrainedtbl ADD CONSTRAINT con6 " + pref + "CHECK (i6 > 4)", expect); execSQL("ALTER TABLE constrainedtbl DROP CONSTRAINT ucons", true); // reset execSQL( pref + "ALTER TABLE constrainedtbl ADD CONSTRAINT ucons UNIQUE (i6)", expect); execSQL("ALTER TABLE constrainedtbl DROP CONSTRAINT ucons", true); // reset execSQL( "ALTER " + pref + "TABLE constrainedtbl ADD CONSTRAINT ucons UNIQUE (i6)", expect); execSQL("ALTER TABLE constrainedtbl DROP CONSTRAINT ucons", true); // reset execSQL("ALTER TABLE constrainedtbl " + pref + "ADD CONSTRAINT ucons UNIQUE (i6)", expect); execSQL("ALTER TABLE constrainedtbl DROP CONSTRAINT ucons", true); // reset execSQL("ALTER TABLE constrainedtbl ADD " + pref + "CONSTRAINT ucons UNIQUE (i6)", expect); execSQL("ALTER TABLE constrainedtbl DROP CONSTRAINT ucons", true); // reset execSQL("ALTER TABLE constrainedtbl ADD CONSTRAINT ucons " + pref + "UNIQUE (i6)", expect); execSQL("ALTER TABLE constrainedtbl ADD CONSTRAINT ucons UNIQUE (i6)", true); // reset execSQL(pref + "ALTER TABLE playtbl RENAME TO renamedtbl", expect); execSQL("ALTER TABLE renamedtbl RENAME TO playtbl", true); // reset execSQL("ALTER " + pref + "TABLE playtbl RENAME TO renamedtbl", expect); execSQL("ALTER TABLE renamedtbl RENAME TO playtbl", true); // reset execSQL("ALTER TABLE playtbl " + pref + "RENAME TO renamedtbl", expect); execSQL("ALTER TABLE renamedtbl RENAME TO playtbl", true); // reset execSQL("ALTER TABLE playtbl RENAME " + pref + "TO renamedtbl", expect); execSQL(pref + "ALTER TABLE constrainedtbl DROP CONSTRAINT con1", expect); execSQL("ALTER " + pref + "TABLE constrainedtbl DROP CONSTRAINT con2", expect); execSQL("ALTER TABLE constrainedtbl " + pref + "DROP CONSTRAINT con3", expect); execSQL("ALTER TABLE constrainedtbl DROP " + pref + "CONSTRAINT con4", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL(pref + "ALTER TABLE foreigntbl ADD CONSTRAINT tstfk FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL("ALTER " + pref + "TABLE foreigntbl ADD CONSTRAINT tstfk FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL("ALTER TABLE foreigntbl " + pref + "ADD CONSTRAINT tstfk FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL("ALTER TABLE foreigntbl ADD " + pref + "CONSTRAINT tstfk FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL("ALTER TABLE foreigntbl ADD CONSTRAINT tstfk " + pref + "FOREIGN KEY " + "(i7) REFERENCES primarytbl (i8)", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL("ALTER TABLE foreigntbl ADD CONSTRAINT tstfk FOREIGN " + pref + "KEY " + "(i7) REFERENCES primarytbl (i8)", expect); execSQL("ALTER TABLE foreigntbl DROP CONSTRAINT tstfk", true); // reset execSQL("ALTER TABLE foreigntbl ADD CONSTRAINT tstfk FOREIGN KEY " + "(i7) " + pref + "REFERENCES primarytbl (i8)", expect); /* // KEEP THESE TEST CASES AT THE BOTTOM!!!! Can wreck all following // tests in current method, even when this test succeeds. // Can only run one successful SHUTDOWN command in one test case. execSQL(pref + "SHUTDOWN", SQL_ABORT); execSQL(pref + "SHUTDOWN IMMEDIATELY", SQL_ABORT); */ shutdownTested = true; /* Failing execSQL(pref + "SHUTDOWN BADARG", SQL_ABORT); execSQL("Bad SHUTDOWN command did shut down database", "SET LOGSIZE " + pref + "5", 0); */ execSQL("SHUTDOWN IMMEDIATELY", 0); } public void testThreePartNames() throws Exception { execSQL("SELECT public.tsttbl.i FROM public.beta.tsttbl\n" + "WHERE public.tsttbl.i = 1", SQL_ABORT); } /** * This method seems to be obsolete. */ public void testBasicQueries() throws Exception { String prefix = "public."; assertEquals(2, queryRowCount("SELECT i FROM " + prefix + "tsttbl")); assertEquals(1, queryRowCount("SELECT vc FROM " + prefix + "tsttbl WHERE i = 1")); assertEquals(1, queryRowCount("SELECT vc FROM " + prefix + "tsttbl WHERE i = (\n" + " SELECT i2 FROM " + prefix + "joinedtbl\n" + ")")); } /** @todo fredt - need to define additional identifiers to use for all cases of expect */ private static final int SQL_ABORT = -1234; private static final int SQL_INITIAL = -1233; private static final int SQL_FAIL = -1; private void execSQL(String s, boolean ignoreError) throws SQLException { try { statement.execute(s); statement.getUpdateCount(); } catch (SQLException se) { if (!ignoreError) { throw se; } //else System.err.println("FAILURE of (" + s + ')'); } } private void execSQL(String m, String s, int expect) { int retval = SQL_INITIAL; try { statement.execute(s); retval = statement.getUpdateCount(); } catch (SQLException se) { retval = SQL_ABORT; } assertEquals(m, expect, retval); } /** @todo fredt - this method body seems to be incorrect */ private void execSQL(String s, int expect) { execSQL(s, s, expect); } private int queryRowCount(String query) throws SQLException { int count = 0; if (!statement.execute(query)) { return count; } ResultSet rs = statement.getResultSet(); try { while (rs.next()) { count++; } } finally { rs.close(); } return count; } private int tableRowCount(String tableName) throws SQLException { String query = "SELECT count(*) FROM " + tableName; if (!statement.execute(query)) { return 0; } ResultSet rs = statement.getResultSet(); try { if (!rs.next()) { throw new SQLException("0 rows returned by (" + query + ')'); } int count = rs.getInt(1); if (rs.next()) { throw new SQLException("> 1 row returned by (" + query + ')'); } return count; } finally { rs.close(); } //throw new Exception("Failed to get rowcount for " + tableName); } public TestSchemaParse() { super(); } public TestSchemaParse(String s) { super(s); } /** * This method allows to easily run this unit test independent of the other * unit tests, and without dealing with Ant or unrelated test suites. */ public static void main(String[] sa) { junit.textui.TestRunner runner = new junit.textui.TestRunner(); junit.framework.TestResult result = runner.run(runner.getTest(TestSchemaParse.class.getName())); System.exit(result.wasSuccessful() ? 0 : 1); } public static junit.framework.Test suite() { junit.framework.TestSuite newSuite = new junit.framework.TestSuite(); newSuite.addTest(new TestSchemaParse("testSanityCheck")); newSuite.addTest(new TestSchemaParse("testTwoPartKeywords")); newSuite.addTest(new TestSchemaParse("testThreePartKeywords")); newSuite.addTest(new TestSchemaParse("testThreePartNames")); newSuite.addTest(new TestSchemaParse("testBasicQueries")); newSuite.addTest(new TestSchemaParse("test2pTables")); newSuite.addTest(new TestSchemaParse("test2pViews")); newSuite.addTest(new TestSchemaParse("test2pSequences")); newSuite.addTest(new TestSchemaParse("test2pIndexes")); newSuite.addTest(new TestSchemaParse("test2pAliases")); newSuite.addTest(new TestSchemaParse("test2pConstraints")); newSuite.addTest(new TestSchemaParse("test2pTriggers")); return newSuite; } ; public void fire(int i, String name, String table, Object[] row1, Object[] row2) {} public static String capitalize(String inString) { return inString.toUpperCase(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestDateTime.java0000644000175000017500000003001312007547410023111 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.text.DateFormat; import java.util.Calendar; import junit.framework.Assert; /** * Tests for normalisation of Time and Date values. * Base on the original test submission. * @author Miro Halas */ public class TestDateTime extends TestBase { public TestDateTime(String s) { super(s); } protected void setUp() { super.setUp(); try { Connection connection = super.newConnection(); Statement statement = connection.createStatement(); statement.execute("drop table time_test if exists"); statement.execute("drop table date_test if exists"); statement.execute("create table time_test(time_test time)"); statement.execute("create table date_test(date_test date)"); connection.close(); } catch (Exception e) {} } /** * Test the database support for Date objects. Date object ignores the time * portion of the Java Date. * * This class inserts date into database, then retrieve it back using * different java time * * @throws Throwable - an error has occured during test */ public void testBasicDateSupport() throws Throwable { final String INSERT_DATE = "insert into date_test(date_test) values (?)"; // See OracleTests class why we need to select tablename.* final String SELECT_DATE = "select date_test.* from date_test where date_test = ?"; final String DELETE_DATE = "delete from date_test where date_test = ?"; Calendar calGenerate = Calendar.getInstance(); java.sql.Date insertDate; Connection connection = super.newConnection(); PreparedStatement insertStatement; int iUpdateCount = 0; // Set date of my birthday ;-) calGenerate.set(1995, 9, 15, 1, 2, 3); insertDate = new java.sql.Date(calGenerate.getTimeInMillis()); insertStatement = connection.prepareStatement(INSERT_DATE); insertStatement.setDate(1, insertDate); iUpdateCount = insertStatement.executeUpdate(); insertStatement.close(); Assert.assertEquals( "Exactly one record with date data shoud have been inserted.", iUpdateCount, 1); // Now select it back to be sure it is there PreparedStatement selectStatement = null; PreparedStatement deleteStatement = null; ResultSet results = null; java.sql.Date retrievedDate = null; boolean bHasMoreThanOne; int iDeletedCount = 0; // Set different time, since when we are dealing with just dates it // shouldn't matter calGenerate.set(1995, 9, 15, 2, 3, 4); java.sql.Date selectDate = new java.sql.Date(calGenerate.getTimeInMillis()); selectStatement = connection.prepareStatement(SELECT_DATE); selectStatement.setDate(1, selectDate); results = selectStatement.executeQuery(); // Get the date from the database Assert.assertTrue("The inserted date is not in the database.", results.next()); retrievedDate = results.getDate(1); deleteStatement = connection.prepareStatement(DELETE_DATE); deleteStatement.setDate(1, insertDate); iDeletedCount = deleteStatement.executeUpdate(); deleteStatement.close(); Assert.assertEquals( "Exactly one record with date data shoud have been deleted.", iDeletedCount, 1); boolean result = retrievedDate.toString().startsWith( insertDate.toString().substring(0, 10)); Assert.assertTrue( "The date retrieved from database " + DateFormat.getDateTimeInstance().format(retrievedDate) + " is not the same as the inserted one " + DateFormat.getDateTimeInstance().format(insertDate), result); } public void testBasicDefaultTimeSupport() throws Throwable { final String INSERT_TIME = "insert into time_test(time_test) values (?)"; // See OracleTests class why we need to select tablename.* final String SELECT_TIME = "select time_test.* from time_test where time_test = ?"; final String DELETE_TIME = "delete from time_test where time_test = ?"; java.sql.Time insertTime; Connection connection = super.newConnection(); PreparedStatement insertStatement; int iUpdateCount = 0; insertTime = new java.sql.Time(3600000); insertStatement = connection.prepareStatement(INSERT_TIME); insertStatement.setTime(1, insertTime); iUpdateCount = insertStatement.executeUpdate(); insertStatement.close(); Assert.assertEquals( "Exactly one record with time data shoud have been inserted.", iUpdateCount, 1); // Now select it back to be sure it is there PreparedStatement selectStatement = null; PreparedStatement deleteStatement = null; ResultSet results = null; java.sql.Time retrievedTime; int iDeletedCount = 0; java.sql.Time selectTime; selectStatement = connection.prepareStatement(SELECT_TIME); selectTime = new java.sql.Time(3600000); selectStatement.setTime(1, selectTime); results = selectStatement.executeQuery(); // Get the date from the database Assert.assertTrue("The inserted time is not in the database.", results.next()); retrievedTime = results.getTime(1); // deleteStatement = connection.prepareStatement(DELETE_TIME); deleteStatement.setTime(1, insertTime); iDeletedCount = deleteStatement.executeUpdate(); Assert.assertEquals( "Exactly one record with time data shoud have been deleted.", iDeletedCount, 1); // And now test the date Assert.assertNotNull( "The inserted time shouldn't be retrieved as null from the database", retrievedTime); // Ignore milliseconds when comparing dates String selectString = selectTime.toString(); String retrievedString = retrievedTime.toString(); boolean result = retrievedString.equals(selectString); Assert.assertTrue( "The time retrieved from database " + DateFormat.getDateTimeInstance().format(retrievedTime) + " is not the same as the inserted one " + DateFormat.getDateTimeInstance().format(insertTime), result); } /** * Test the database support for Time objects. Time object ignores the date * portion of the Java Date. * * This class inserts time into database, then retrieve it back using * different java date and deletes it using cursor. * * Uses the already setup connection and transaction. * No need to close the connection since base class is doing it for us. * * @throws Throwable - an error has occured during test */ public void testBasicTimeSupport() throws Throwable { final String INSERT_TIME = "insert into time_test(time_test) values (?)"; // See OracleTests class why we need to select tablename.* final String SELECT_TIME = "select time_test.* from time_test where time_test = ?"; final String DELETE_TIME = "delete from time_test where time_test = ?"; Calendar calGenerate = Calendar.getInstance(); java.sql.Time insertTime; Connection connection = super.newConnection(); PreparedStatement insertStatement; int iUpdateCount = 0; // Set date of my birthday ;-) calGenerate.set(1995, 9, 15, 1, 2, 3); insertTime = new java.sql.Time(calGenerate.getTime().getTime()); insertStatement = connection.prepareStatement(INSERT_TIME); insertStatement.setTime(1, insertTime, calGenerate); iUpdateCount = insertStatement.executeUpdate(); insertStatement.close(); Assert.assertEquals( "Exactly one record with time data shoud have been inserted.", iUpdateCount, 1); // Now select it back to be sure it is there PreparedStatement selectStatement = null; PreparedStatement deleteStatement = null; ResultSet results = null; java.sql.Time retrievedTime; int iDeletedCount = 0; java.sql.Time selectTime; selectStatement = connection.prepareStatement(SELECT_TIME); // Set different date, since when we are dealing with just time it // shouldn't matter // fredt - but make sure the date is in the same daylight saving range as today ! calGenerate.set(1975, 9, 16, 1, 2, 3); selectTime = new java.sql.Time(calGenerate.getTime().getTime()); selectStatement.setTime(1, selectTime, calGenerate); results = selectStatement.executeQuery(); // Get the date from the database Assert.assertTrue("The inserted time is not in the database.", results.next()); retrievedTime = results.getTime(1, calGenerate); // deleteStatement = connection.prepareStatement(DELETE_TIME); deleteStatement.setTime(1, insertTime, calGenerate); iDeletedCount = deleteStatement.executeUpdate(); Assert.assertEquals( "Exactly one record with time data shoud have been deleted.", iDeletedCount, 1); // And now test the date Assert.assertNotNull( "The inserted time shouldn't be retrieved as null from the database", retrievedTime); // Ignore milliseconds when comparing dates String selectString = selectTime.toString(); String retrievedString = retrievedTime.toString(); boolean result = retrievedString.equals(selectString); Assert.assertTrue( "The time retrieved from database " + DateFormat.getDateTimeInstance().format(retrievedTime) + " is not the same as the inserted one " + DateFormat.getDateTimeInstance().format(insertTime), result); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/JDBCBench.java0000644000175000017500000010341212007547406022230 0ustar renerenepackage org.hsqldb.test; // nbazin@users - enhancements to the original code // fredt@users - 20050202 - corrected getRandomID(int) to return a randomly distributed value /* * This is a sample implementation of the Transaction Processing Performance * Council Benchmark B coded in Java and ANSI SQL2. * * This version is using one connection per thread to parallellize * server operations. * @author Mark Matthews (mark@mysql.com) */ import java.io.FileOutputStream; import java.io.PrintStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Enumeration; import java.util.Vector; class JDBCBench { /* tpc bm b scaling rules */ public static int tps = 1; /* the tps scaling factor: here it is 1 */ public static int nbranches = 1; /* number of branches in 1 tps db */ public static int ntellers = 10; /* number of tellers in 1 tps db */ public static int naccounts = 100000; /* number of accounts in 1 tps db */ public static int nhistory = 864000; /* number of history recs in 1 tps db */ public static final int TELLER = 0; public static final int BRANCH = 1; public static final int ACCOUNT = 2; int failed_transactions = 0; int transaction_count = 0; static int n_clients = 10; static int n_txn_per_client = 10; long start_time = 0; static boolean transactions = true; static boolean prepared_stmt = false; static String tableExtension = ""; static String createExtension = ""; static String ShutdownCommand = ""; static PrintStream TabFile = null; static boolean verbose = false; MemoryWatcherThread MemoryWatcher; /* main program, creates a 1-tps database: i.e. 1 branch, 10 tellers,... * runs one TPC BM B transaction * example command line: * -driver org.hsqldb.jdbc.JDBCDriver -url jdbc:hsqldb:/hsql/jdbcbench/test -user SA -clients 20 -tpc 10000 */ public static void main(String[] Args) { String DriverName = ""; String DBUrl = ""; String DBUser = ""; String DBPassword = ""; boolean initialize_dataset = false; for (int i = 0; i < Args.length; i++) { if (Args[i].equals("-clients")) { if (i + 1 < Args.length) { i++; n_clients = Integer.parseInt(Args[i]); } } else if (Args[i].equals("-driver")) { if (i + 1 < Args.length) { i++; DriverName = Args[i]; if (DriverName.equals( "org.enhydra.instantdb.jdbc.idbDriver")) { ShutdownCommand = "SHUTDOWN"; } if (DriverName.equals( "com.borland.datastore.jdbc.DataStoreDriver")) {} if (DriverName.equals("com.mckoi.JDBCDriver")) { ShutdownCommand = "SHUTDOWN"; } if (DriverName.equals("org.hsqldb.jdbc.JDBCDriver") || DriverName.equals("org.hsqldb.jdbcDriver")) { tableExtension = "CREATE CACHED TABLE "; // ShutdownCommand = "SHUTDOWN"; } } } else if (Args[i].equals("-url")) { if (i + 1 < Args.length) { i++; DBUrl = Args[i]; } } else if (Args[i].equals("-user")) { if (i + 1 < Args.length) { i++; DBUser = Args[i]; } } else if (Args[i].equals("-tabfile")) { if (i + 1 < Args.length) { i++; try { FileOutputStream File = new FileOutputStream(Args[i]); TabFile = new PrintStream(File); } catch (Exception e) { TabFile = null; } } } else if (Args[i].equals("-password")) { if (i + 1 < Args.length) { i++; DBPassword = Args[i]; } } else if (Args[i].equals("-tpc")) { if (i + 1 < Args.length) { i++; n_txn_per_client = Integer.parseInt(Args[i]); } } else if (Args[i].equals("-init")) { initialize_dataset = true; } else if (Args[i].equals("-tps")) { if (i + 1 < Args.length) { i++; tps = Integer.parseInt(Args[i]); } } else if (Args[i].equals("-v")) { verbose = true; } } if (DriverName.length() == 0 || DBUrl.length() == 0) { System.out.println( "usage: java JDBCBench -driver [driver_class_name] -url [url_to_db] -user [username] -password [password] [-v] [-init] [-tpc n] [-clients n]"); System.out.println(); System.out.println("-v verbose error messages"); System.out.println("-init initialize the tables"); System.out.println("-tpc transactions per client"); System.out.println("-clients number of simultaneous clients"); System.exit(-1); } System.out.println( "*********************************************************"); System.out.println( "* JDBCBench v1.1 *"); System.out.println( "*********************************************************"); System.out.println(); System.out.println("Driver: " + DriverName); System.out.println("URL:" + DBUrl); System.out.println(); System.out.println("Scale factor value: " + tps); System.out.println("Number of clients: " + n_clients); System.out.println("Number of transactions per client: " + n_txn_per_client); System.out.println(); try { Class.forName(DriverName); JDBCBench Me = new JDBCBench(DBUrl, DBUser, DBPassword, initialize_dataset); } catch (Exception E) { System.out.println(E.toString()); E.printStackTrace(); } } public JDBCBench(String url, String user, String password, boolean init) { Vector vClient = new Vector(); Thread Client = null; Enumeration e = null; Connection guardian = null; try { java.util.Date start = new java.util.Date(); if (init) { System.out.println("Start: " + start.toString()); System.out.print("Initializing dataset..."); createDatabase(url, user, password); double seconds = (System.currentTimeMillis() - start.getTime()) / 1000D; System.out.println("done. in " + seconds + " seconds\n"); System.out.println("Complete: " + (new java.util.Date()).toString()); } System.out.println("* Starting Benchmark Run *"); MemoryWatcher = new MemoryWatcherThread(); MemoryWatcher.start(); oneRound(url, user, password, transactions, true); oneRound(url, user, password, transactions, true); oneRound(url, user, password, transactions, true); /* oneRound(url, user, password, transactions, true); oneRound(url, user, password, transactions, true); oneRound(url, user, password, transactions, true); oneRound(url, user, password, transactions, true); oneRound(url, user, password, transactions, true); oneRound(url, user, password, transactions, true); oneRound(url, user, password, transactions, true); oneRound(url, user, password, transactions, true); oneRound(url, user, password, transactions, true); */ } catch (Exception E) { System.out.println(E.toString()); E.printStackTrace(); } finally { MemoryWatcher.end(); try { MemoryWatcher.join(); if (ShutdownCommand.length() > 0) { guardian = connect(url, user, password); Statement Stmt = guardian.createStatement(); Stmt.execute("SHUTDOWN IMMEDIATELY"); Stmt.close(); connectClose(guardian); } if (TabFile != null) { TabFile.close(); } } catch (Exception E1) {} // System.exit(0); } } void oneRound(String url, String user, String password, boolean transactions, boolean prepared) throws InterruptedException, SQLException { Vector vClient = new Vector(); Thread Client = null; Enumeration e = null; Connection guardian = null; // this.transactions = transactions; this.prepared_stmt = prepared; start_time = System.currentTimeMillis(); for (int i = 0; i < n_clients; i++) { Client = new ClientThread(n_txn_per_client, url, user, password, Connection.TRANSACTION_READ_COMMITTED); Client.start(); vClient.addElement(Client); } /* ** Barrier to complete this test session */ e = vClient.elements(); while (e.hasMoreElements()) { Client = (Thread) e.nextElement(); Client.join(); } vClient.removeAllElements(); reportDone(); guardian = connect(url, user, password); checkSums(guardian); connectClose(guardian); } public void reportDone() { long end_time = System.currentTimeMillis(); double completion_time = ((double) end_time - (double) start_time) / 1000; if (TabFile != null) { TabFile.print(tps + ";" + n_clients + ";" + n_txn_per_client + ";"); } System.out.println("\n* Benchmark Report *"); System.out.print("* Featuring "); if (prepared_stmt) { System.out.print(" "); if (TabFile != null) { TabFile.print(";"); } } else { System.out.print(" "); if (TabFile != null) { TabFile.print(";"); } } if (transactions) { System.out.print(" "); if (TabFile != null) { TabFile.print(";"); } } else { System.out.print(" "); if (TabFile != null) { TabFile.print(";"); } } System.out.println("\n--------------------"); System.out.println("Time to execute " + transaction_count + " transactions: " + completion_time + " seconds."); System.out.println("Max/Min memory usage: " + (MemoryWatcher.max / 1024) + " / " + (MemoryWatcher.min / 1024) + " kb"); System.out.println(failed_transactions + " / " + transaction_count + " failed to complete."); double rate = (transaction_count - failed_transactions) / completion_time; System.out.println("Transaction rate: " + rate + " txn/sec."); if (TabFile != null) { TabFile.print((MemoryWatcher.max / 1024) + ";" + (MemoryWatcher.min / 1024) + ";" + failed_transactions + ";" + rate + "\n"); } transaction_count = 0; failed_transactions = 0; MemoryWatcher.reset(); } public synchronized void incrementTransactionCount() { transaction_count++; } public synchronized void incrementFailedTransactionCount() { failed_transactions++; } void createDatabase(String url, String user, String password) throws Exception { Connection Conn = connect(url, user, password); String s = Conn.getMetaData().getDatabaseProductName(); System.out.println("DBMS: " + s); transactions = true; if (transactions) { try { Conn.setAutoCommit(false); System.out.println("In transaction mode"); } catch (SQLException Etrxn) { transactions = false; } } try { int accountsnb = 0; Statement Stmt = Conn.createStatement(); String Query; // Stmt.execute("SET WRITE_DELAY 10000 MILLIS;"); Stmt.execute("SET PROPERTY \"hsqldb.cache_scale\" 16;"); // Query = "SELECT count(*) "; Query += "FROM accounts"; ResultSet RS = Stmt.executeQuery(Query); Stmt.clearWarnings(); while (RS.next()) { accountsnb = RS.getInt(1); } if (transactions) { Conn.commit(); } Stmt.close(); if (accountsnb == (naccounts * tps)) { System.out.println("Already initialized"); connectClose(Conn); return; } } catch (Exception E) {} System.out.println("Drop old tables if they exist"); try { Statement Stmt = Conn.createStatement(); String Query; Query = "DROP TABLE history"; Stmt.execute(Query); Stmt.clearWarnings(); Query = "DROP TABLE accounts"; Stmt.execute(Query); Stmt.clearWarnings(); Query = "DROP TABLE tellers"; Stmt.execute(Query); Stmt.clearWarnings(); Query = "DROP TABLE branches"; Stmt.execute(Query); Stmt.clearWarnings(); if (transactions) { Conn.commit(); } Stmt.close(); } catch (Exception E) {} System.out.println("Creates tables"); try { Statement Stmt = Conn.createStatement(); String Query; if (tableExtension.length() > 0) { Query = tableExtension + " branches ("; } else { Query = "CREATE TABLE branches ("; } Query += "Bid INTEGER NOT NULL PRIMARY KEY, "; Query += "Bbalance INTEGER,"; Query += "filler CHAR(88))"; /* pad to 100 bytes */ if (createExtension.length() > 0) { Query += createExtension; } Stmt.execute(Query); Stmt.clearWarnings(); if (tableExtension.length() > 0) { Query = tableExtension + " tellers ("; } else { Query = "CREATE TABLE tellers ("; } Query += "Tid INTEGER NOT NULL PRIMARY KEY,"; Query += "Bid INTEGER,"; Query += "Tbalance INTEGER,"; Query += "filler CHAR(84))"; /* pad to 100 bytes */ if (createExtension.length() > 0) { Query += createExtension; } Stmt.execute(Query); Stmt.clearWarnings(); if (tableExtension.length() > 0) { Query = tableExtension + " accounts ("; } else { Query = "CREATE TABLE accounts ("; } Query += "Aid INTEGER NOT NULL PRIMARY KEY, "; Query += "Bid INTEGER, "; Query += "Abalance INTEGER, "; Query += "filler CHAR(84))"; /* pad to 100 bytes */ if (createExtension.length() > 0) { Query += createExtension; } Stmt.execute(Query); Stmt.clearWarnings(); if (tableExtension.length() > 0) { Query = tableExtension + " history ("; } else { Query = "CREATE TABLE history ("; } Query += "Tid INTEGER, "; Query += "Bid INTEGER, "; Query += "Aid INTEGER, "; Query += "delta INTEGER, "; Query += "tstime TIMESTAMP, "; Query += "filler CHAR(22))"; /* pad to 50 bytes */ if (createExtension.length() > 0) { Query += createExtension; } Stmt.execute(Query); Stmt.clearWarnings(); /* Stmt.execute("SET TABLE ACCOUNTS SOURCE \"ACCOUNTS.TXT\""); Stmt.execute("SET TABLE BRANCHES SOURCE \"BBRANCHES.TXT\""); Stmt.execute("SET TABLE TELLERS SOURCE \"TELLERS.TXT\""); Stmt.execute("SET TABLE HISTORY SOURCE \"HISTORY.TXT\""); */ if (transactions) { Conn.commit(); } Stmt.close(); } catch (Exception E) { System.out.println( "Delete elements in table in case Drop didn't work"); } System.out.println( "Delete elements in table in case Drop didn't work"); try { Statement Stmt = Conn.createStatement(); String Query; Query = "DELETE FROM history"; Stmt.execute(Query); Stmt.clearWarnings(); Query = "DELETE FROM accounts"; Stmt.execute(Query); Stmt.clearWarnings(); Query = "DELETE FROM tellers"; Stmt.execute(Query); Stmt.clearWarnings(); Query = "DELETE FROM branches"; Stmt.execute(Query); Stmt.clearWarnings(); if (transactions) { Conn.commit(); } /* prime database using TPC BM B scaling rules. ** Note that for each branch and teller: ** branch_id = teller_id / ntellers ** branch_id = account_id / naccounts */ PreparedStatement pstmt = null; prepared_stmt = true; if (prepared_stmt) { try { Query = "INSERT INTO branches(Bid,Bbalance) VALUES (?,0)"; pstmt = Conn.prepareStatement(Query); System.out.println("Using prepared statements"); } catch (SQLException Epstmt) { pstmt = null; prepared_stmt = false; } } System.out.println("Insert data in branches table"); for (int i = 0; i < nbranches * tps; i++) { if (prepared_stmt) { pstmt.setInt(1, i); pstmt.executeUpdate(); pstmt.clearWarnings(); } else { Query = "INSERT INTO branches(Bid,Bbalance) VALUES (" + i + ",0)"; Stmt.executeUpdate(Query); } if ((i % 100 == 0) && (transactions)) { Conn.commit(); } } if (prepared_stmt) { pstmt.close(); } if (transactions) { Conn.commit(); } if (prepared_stmt) { Query = "INSERT INTO tellers(Tid,Bid,Tbalance) VALUES (?,?,0)"; pstmt = Conn.prepareStatement(Query); } System.out.println("Insert data in tellers table"); for (int i = 0; i < ntellers * tps; i++) { if (prepared_stmt) { pstmt.setInt(1, i); pstmt.setInt(2, i / ntellers); pstmt.executeUpdate(); pstmt.clearWarnings(); } else { Query = "INSERT INTO tellers(Tid,Bid,Tbalance) VALUES (" + i + "," + i / ntellers + ",0)"; Stmt.executeUpdate(Query); } if ((i % 100 == 0) && (transactions)) { Conn.commit(); } } if (prepared_stmt) { pstmt.close(); } if (transactions) { Conn.commit(); } if (prepared_stmt) { Query = "INSERT INTO accounts(Aid,Bid,Abalance) VALUES (?,?,0)"; pstmt = Conn.prepareStatement(Query); } System.out.println("Insert data in accounts table"); for (int i = 0; i < naccounts * tps; i++) { if (prepared_stmt) { pstmt.setInt(1, i); pstmt.setInt(2, i / naccounts); pstmt.executeUpdate(); pstmt.clearWarnings(); } else { Query = "INSERT INTO accounts(Aid,Bid,Abalance) VALUES (" + i + "," + i / naccounts + ",0)"; Stmt.executeUpdate(Query); } if ((i % 10000 == 0) && (transactions)) { Conn.commit(); } if ((i > 0) && ((i % 10000) == 0)) { System.out.println("\t" + i + "\t records inserted"); } } if (prepared_stmt) { pstmt.close(); } if (transactions) { Conn.commit(); } System.out.println("\t" + (naccounts * tps) + "\t records inserted"); // for tests if (ShutdownCommand.length() > 0) { Stmt.execute(ShutdownCommand); } Stmt.close(); } catch (Exception E) { System.out.println(E.toString()); E.printStackTrace(); } connectClose(Conn); } /* end of CreateDatabase */ public static int getRandomInt(int lo, int hi) { int ret = 0; ret = (int) (Math.random() * (hi - lo + 1)); ret += lo; return ret; } public static int getRandomID(int type) { int min = 0, max = 0; switch (type) { case TELLER : max = ntellers * tps - 1; break; case BRANCH : max = nbranches * tps - 1; break; case ACCOUNT : max = naccounts * tps - 1; break; } return (getRandomInt(min, max)); } public static Connection connect(String DBUrl, String DBUser, String DBPassword) { try { Connection conn = DriverManager.getConnection(DBUrl, DBUser, DBPassword); return conn; } catch (Exception E) { System.out.println(E.toString()); E.printStackTrace(); } return null; } public static void connectClose(Connection c) { if (c == null) { return; } try { c.close(); } catch (Exception E) { System.out.println(E.toString()); E.printStackTrace(); } } void checkSums(Connection conn) throws SQLException { Statement st1 = null; ResultSet rs = null; int bbalancesum; int tbalancesum; int abalancesum; int deltasum; try { st1 = conn.createStatement(); rs = st1.executeQuery("select sum(bbalance) from branches"); rs.next(); bbalancesum = rs.getInt(1); rs.close(); rs = st1.executeQuery("select sum(tbalance) from tellers"); rs.next(); tbalancesum = rs.getInt(1); rs.close(); rs = st1.executeQuery("select sum(abalance) from accounts"); rs.next(); abalancesum = rs.getInt(1); rs.close(); rs = st1.executeQuery("select sum(delta) from history"); rs.next(); deltasum = rs.getInt(1); rs.close(); rs = null; st1.close(); st1 = null; if (abalancesum != bbalancesum || bbalancesum != tbalancesum || tbalancesum != deltasum) { System.out.println("sums don't match!"); } else { System.out.println("sums match!"); } System.out.println("A " + abalancesum + " B " + bbalancesum + " T " + tbalancesum + " H " + deltasum); } finally { if (st1 != null) { st1.close(); } } } class ClientThread extends Thread { int ntrans = 0; Connection Conn; PreparedStatement pstmt1 = null; PreparedStatement pstmt2 = null; PreparedStatement pstmt3 = null; PreparedStatement pstmt4 = null; PreparedStatement pstmt5 = null; public ClientThread(int number_of_txns, String url, String user, String password, int transactionMode) { System.out.println(number_of_txns); ntrans = number_of_txns; Conn = connect(url, user, password); if (Conn == null) { return; } try { if (transactions) { Conn.setAutoCommit(false); } Conn.setTransactionIsolation(transactionMode); if (prepared_stmt) { String Query; Query = "UPDATE accounts "; Query += "SET Abalance = Abalance + ? "; Query += "WHERE Aid = ?"; pstmt1 = Conn.prepareStatement(Query); Query = "SELECT Abalance "; Query += "FROM accounts "; Query += "WHERE Aid = ?"; pstmt2 = Conn.prepareStatement(Query); Query = "UPDATE tellers "; Query += "SET Tbalance = Tbalance + ? "; Query += "WHERE Tid = ?"; pstmt3 = Conn.prepareStatement(Query); Query = "UPDATE branches "; Query += "SET Bbalance = Bbalance + ? "; Query += "WHERE Bid = ?"; pstmt4 = Conn.prepareStatement(Query); Query = "INSERT INTO history(Tid, Bid, Aid, delta) "; Query += "VALUES (?,?,?,?)"; pstmt5 = Conn.prepareStatement(Query); } } catch (Exception E) { System.out.println(E.toString()); E.printStackTrace(); } } public void run() { while (ntrans-- > 0) { int account = JDBCBench.getRandomID(ACCOUNT); int branch = JDBCBench.getRandomID(BRANCH); int teller = JDBCBench.getRandomID(TELLER); int delta = JDBCBench.getRandomInt(0, 1000); doOne(branch, teller, account, delta); incrementTransactionCount(); } if (prepared_stmt) { try { if (pstmt1 != null) { pstmt1.close(); } if (pstmt2 != null) { pstmt2.close(); } if (pstmt3 != null) { pstmt3.close(); } if (pstmt4 != null) { pstmt4.close(); } if (pstmt5 != null) { pstmt5.close(); } } catch (Exception E) { System.out.println(E.toString()); E.printStackTrace(); } } connectClose(Conn); Conn = null; } /* ** doOne() - Executes a single TPC BM B transaction. */ int doOne(int bid, int tid, int aid, int delta) { int aBalance = 0; if (Conn == null) { incrementFailedTransactionCount(); return 0; } try { if (prepared_stmt) { pstmt1.setInt(1, delta); pstmt1.setInt(2, aid); pstmt1.executeUpdate(); pstmt1.clearWarnings(); pstmt2.setInt(1, aid); ResultSet RS = pstmt2.executeQuery(); pstmt2.clearWarnings(); while (RS.next()) { aBalance = RS.getInt(1); } pstmt3.setInt(1, delta); pstmt3.setInt(2, tid); pstmt3.executeUpdate(); pstmt3.clearWarnings(); pstmt4.setInt(1, delta); pstmt4.setInt(2, bid); pstmt4.executeUpdate(); pstmt4.clearWarnings(); pstmt5.setInt(1, tid); pstmt5.setInt(2, bid); pstmt5.setInt(3, aid); pstmt5.setInt(4, delta); pstmt5.executeUpdate(); pstmt5.clearWarnings(); } else { Statement Stmt = Conn.createStatement(); String Query = "UPDATE accounts "; Query += "SET Abalance = Abalance + " + delta + " "; Query += "WHERE Aid = " + aid; int res = Stmt.executeUpdate(Query); Stmt.clearWarnings(); Query = "SELECT Abalance "; Query += "FROM accounts "; Query += "WHERE Aid = " + aid; ResultSet RS = Stmt.executeQuery(Query); Stmt.clearWarnings(); while (RS.next()) { aBalance = RS.getInt(1); } Query = "UPDATE tellers "; Query += "SET Tbalance = Tbalance + " + delta + " "; Query += "WHERE Tid = " + tid; Stmt.executeUpdate(Query); Stmt.clearWarnings(); Query = "UPDATE branches "; Query += "SET Bbalance = Bbalance + " + delta + " "; Query += "WHERE Bid = " + bid; Stmt.executeUpdate(Query); Stmt.clearWarnings(); Query = "INSERT INTO history(Tid, Bid, Aid, delta) "; Query += "VALUES ("; Query += tid + ","; Query += bid + ","; Query += aid + ","; Query += delta + ")"; Stmt.executeUpdate(Query); Stmt.clearWarnings(); Stmt.close(); } if (transactions) { Conn.commit(); } return aBalance; } catch (Exception E) { if (verbose) { System.out.println("Transaction failed: " + E.toString()); E.printStackTrace(); } incrementFailedTransactionCount(); if (transactions) { try { Conn.rollback(); } catch (SQLException E1) {} } } return 0; } /* end of DoOne */ } /* end of class ClientThread */ class MemoryWatcherThread extends Thread { long min = 0; long max = 0; boolean keep_running = true; public MemoryWatcherThread() { this.reset(); keep_running = true; } public void reset() { System.gc(); long currentFree = Runtime.getRuntime().freeMemory(); long currentAlloc = Runtime.getRuntime().totalMemory(); min = max = (currentAlloc - currentFree); } public void end() { keep_running = false; } public void run() { while (keep_running) { long currentFree = Runtime.getRuntime().freeMemory(); long currentAlloc = Runtime.getRuntime().totalMemory(); long used = currentAlloc - currentFree; if (used < min) { min = used; } if (used > max) { max = used; } try { sleep(100); } catch (InterruptedException E) {} } } } /* end of class MemoryWatcherThread */ } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/AllSimpleTests.java0000644000175000017500000000540312007547410023467 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; public class AllSimpleTests { public AllSimpleTests() { try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } String[] args = new String[0]; void doTests() throws Exception { System.out.println("*********** " + HSQLBug.class.getName()); HSQLBug.main(args); System.out.println("*********** " + TestBatchBug.class.getClass().getName()); TestBatchBug.main(args); System.out.println("*********** " + TestDima.class.getName()); TestDima.main(args); System.out.println("*********** " + TestHSQLDB.class.getName()); TestHSQLDB.main(args); System.out.println("*********** " + TestObjectSize.class.getName()); TestObjectSize.main(args); System.out.println( "*********** " + TestSubQueriesInPreparedStatements.class.getName()); TestSubQueriesInPreparedStatements.main(args); } public static void main(String[] Args) throws Exception { AllSimpleTests ast = new AllSimpleTests(); ast.doTests(); } private void jbInit() throws Exception {} } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestUpdatableResultSets.java0000644000175000017500000001363612007547406025375 0ustar renerene/* Copyright (c) 2001-2009, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestUpdatableResultSets extends TestBase { // Connection connection; Statement statement; public TestUpdatableResultSets(String name) { super(name); } protected void setUp() { super.setUp(); try { connection = super.newConnection(); statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); } catch (Exception e) { System.out.println(e); } } public void testUpdatable() { try { statement.execute("drop table t1 if exists"); statement.execute( "create table t1 (i int primary key, c varchar(10), t varbinary(3))"); String insert = "insert into t1 values(?,?,?)"; String select = "select i, c, t from t1"; PreparedStatement ps = connection.prepareStatement(insert); for (int i = 0; i < 10; i++) { ps.setInt(1, i); ps.setString(2, String.valueOf(i) + " s"); ps.setBytes(3, new byte[] { (byte) i, ' ', (byte) i }); ps.execute(); } connection.setAutoCommit(false); ResultSet rs = statement.executeQuery(select); while (rs.next()) { String s = rs.getString(2); rs.updateString(2, s + s); rs.updateRow(); } rs.close(); rs = statement.executeQuery(select); while (rs.next()) { String s = rs.getString(2); System.out.println(s); } connection.rollback(); rs = statement.executeQuery(select); while (rs.next()) { String s = rs.getString(2); System.out.println(s); } connection.commit(); } catch (SQLException e) { e.printStackTrace(); } } public void testScrollable() { try { statement.execute("drop table t1 if exists"); statement.execute( "create table t1 (i int primary key, c varchar(10), t varbinary(3))"); statement.close(); String insert = "insert into t1 values(?,?,?)"; String select = "select i, c, t from t1"; PreparedStatement ps = connection.prepareStatement(insert); for (int i = 0; i < 10; i++) { ps.setInt(1, i); ps.setString(2, String.valueOf(i) + " s"); ps.setBytes(3, new byte[] { (byte) i, ' ', (byte) i }); ps.execute(); } connection.setAutoCommit(false); statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet srs = statement.executeQuery("select * from t1 limit 2"); srs.afterLast(); while (srs.previous()) { String name = srs.getString(2); float id = srs.getFloat(1); System.out.println(name + " " + id); } srs.close(); srs = statement.executeQuery("select * from t1 limit 2"); srs.absolute(3); while (srs.previous()) { String name = srs.getString(2); float id = srs.getFloat(1); System.out.println(name + " " + id); } srs.absolute(2); while (srs.previous()) { String name = srs.getString(2); float id = srs.getFloat(1); System.out.println(name + " " + id); } srs.absolute(-1); while (srs.previous()) { String name = srs.getString(2); float id = srs.getFloat(1); System.out.println(name + " " + id); } } catch (SQLException e) { e.printStackTrace(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestTriggers.java0000644000175000017500000001214612007547410023212 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import org.hsqldb.Trigger; import org.hsqldb.lib.ArrayUtil; /** * * @author fredt */ public class TestTriggers extends TestBase { Connection conn; public TestTriggers(String testName) { super(testName, "jdbc:hsqldb:file:trigs", false, false); } public void setUp() { super.setUp(); try { openConnection(); } catch (SQLException ex) { throw new RuntimeException(ex); } } public void tearDown() { try { conn.close(); } catch (SQLException ex) { throw new RuntimeException(ex); } super.tearDown(); } public void testTriggerAction() { runScript(); try { runStatements(); } catch (SQLException e) { e.printStackTrace(); assertTrue(false); } try { shutdownDatabase(); } catch (SQLException e) { e.printStackTrace(); assertTrue(false); } try { openConnection(); } catch (SQLException e) { e.printStackTrace(); assertTrue(false); } try { runStatements(); } catch (SQLException e) { e.printStackTrace(); assertTrue(false); } } private void openConnection() throws SQLException { conn = newConnection(); } private void runScript() { TestUtil.testScript(conn, "testrun/hsqldb/TestTriggers.txt"); } private void shutdownDatabase() throws SQLException { Statement st = conn.createStatement(); st.execute("shutdown"); st.close(); } private void runStatements() throws SQLException { Statement st = conn.createStatement(); st.execute("delete from testtrig"); st.execute("alter table testtrig alter column c1 restart with 0"); clearCalls(); st.execute( "insert into testtrig values (default, 'inserted val 1', 100)"); checkCallCount(3); checkCalls(Trigger.INSERT_AFTER, 1); checkCalls(Trigger.INSERT_BEFORE_ROW, 1); checkCalls(Trigger.INSERT_AFTER_ROW, 1); clearCalls(); st.execute( "insert into testtrig (c2, c3) select c2, c3 from testtrig where c1 < 0"); checkCallCount(1); checkCalls(Trigger.INSERT_AFTER, 1); checkCalls(Trigger.INSERT_BEFORE_ROW, 0); checkCalls(Trigger.INSERT_AFTER_ROW, 0); clearCalls(); st.execute("update testtrig set c2 = c2 || ' updated' where c1 = 0"); checkCallCount(3); checkCalls(Trigger.UPDATE_AFTER, 1); checkCalls(Trigger.UPDATE_BEFORE_ROW, 1); checkCalls(Trigger.UPDATE_AFTER_ROW, 1); clearCalls(); st.execute("update testtrig set c2 = c2 || ' updated' where c1 < 0"); checkCallCount(1); checkCalls(Trigger.UPDATE_AFTER, 1); checkCalls(Trigger.UPDATE_BEFORE_ROW, 0); checkCalls(Trigger.UPDATE_AFTER_ROW, 0); st.close(); } void checkCalls(int trigType, int callCount) { assertEquals("call count mismatch", TriggerClass.callCounts[trigType], callCount); } void clearCalls() { TriggerClass.callCount = 0; ArrayUtil.fillArray(TriggerClass.callCounts, 0); } void checkCallCount(int count) { assertEquals("trigger call mismatch", count, TriggerClass.callCount); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestOdbcTypes.java0000644000175000017500000017555612007547410023337 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.PreparedStatement; import java.sql.Time; import java.sql.Timestamp; import java.math.BigDecimal; /** * See AbstractTestOdbc for more general ODBC test information. * * @see AbstractTestOdbc */ public class TestOdbcTypes extends AbstractTestOdbc { /* HyperSQL types to be tested: * * Exact Numeric * TINYINT * SMALLINT * INTEGER * BIGINT * NUMERIC(p?,s?) = DECIMAL() (default for decimal literals) * Approximate Numeric * FLOAT(p?) * DOUBLE = REAL (default for literals with exponent) * BOOLEAN * Character Strings * CHARACTER(1l)* = CHAR() * CHARACTER VARYING(1l) = VARCHAR() = LONGVARCHAR() * CLOB(1l) = CHARACTER LARGE OBJECT(1) * Binary Strings * BINARY(1l)* * BINARY VARYING(1l) = VARBINARY() * BLOB(1l) = BINARY LARGE OBJECT() * Bits * BIT(1l) * BIT VARYING(1l) * OTHER (for holding serialized Java objects) * Date/Times * DATE * TIME(p?,p?) * TIMESTAMP(p?,p?) * INTERVAL...(p2,p0) */ public TestOdbcTypes() {} /** * Accommodate JUnit's test-runner conventions. */ public TestOdbcTypes(String s) { super(s); } protected void populate(Statement st) throws SQLException { st.executeUpdate("DROP TABLE alltypes IF EXISTS"); st.executeUpdate("CREATE TABLE alltypes (\n" + " id INTEGER,\n" + " ti TINYINT,\n" + " si SMALLINT,\n" + " i INTEGER,\n" + " bi BIGINT,\n" + " n NUMERIC(5,2),\n" + " f FLOAT(5),\n" + " r DOUBLE,\n" + " b BOOLEAN,\n" + " c CHARACTER(3),\n" + " cv CHARACTER VARYING(3),\n" + " bt BIT(9),\n" + " btv BIT VARYING(3),\n" + " d DATE,\n" + " t TIME(2),\n" + " tw TIME(2) WITH TIME ZONE,\n" + " ts TIMESTAMP(2),\n" + " tsw TIMESTAMP(2) WITH TIME ZONE,\n" + " bin BINARY(4),\n" + " vb VARBINARY(4),\n" + " dsival INTERVAL DAY(5) TO SECOND(6),\n" + " sival INTERVAL SECOND(6,4)\n" + ')'); /** TODO: This test class can't handle testing unlmited VARCHAR, since * we set up with strict size setting, which prohibits unlimited * VARCHARs. Need to write a standalone test class to test that. */ // Would be more elegant and efficient to use a prepared statement // here, but our we want this setup to be as simple as possible, and // leave feature testing for the actual unit tests. st.executeUpdate("INSERT INTO alltypes VALUES (\n" + " 1, 3, 4, 5, 6, 7.8, 8.9, 9.7, true, 'ab', 'cd',\n" + " b'10', b'10', current_date, '13:14:00',\n" + " '15:16:00', '2009-02-09 16:17:18', '2009-02-09 17:18:19',\n" + " x'A103', x'A103', " + "INTERVAL '145 23:12:19.345' DAY TO SECOND,\n" + " INTERVAL '1000.345' SECOND\n" + ')' ); st.executeUpdate("INSERT INTO alltypes VALUES (\n" + " 2, 3, 4, 5, 6, 7.8, 8.9, 9.7, true, 'ab', 'cd',\n" + " b'10', b'10', current_date, '13:14:00',\n" + " '15:16:00', '2009-02-09 16:17:18', '2009-02-09 17:18:19',\n" + " x'A103', x'A103', " + " INTERVAL '145 23:12:19.345' DAY TO SECOND,\n" + " INTERVAL '1000.345' SECOND\n" + ')' ); } public void testIntegerSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(Integer.class, rs.getObject("i").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals(5, rs.getInt("i")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testTinyIntSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(Integer.class, rs.getObject("ti").getClass()); // Nb. HyperSQL purposefully returns an Integer for this type assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals((byte) 3, rs.getByte("ti")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testSmallIntSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(Integer.class, rs.getObject("si").getClass()); // Nb. HyperSQL purposefully returns an Integer for this type assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals((short) 4, rs.getShort("si")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testBigIntSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(Long.class, rs.getObject("bi").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals(6, rs.getLong("bi")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } /* public void testNumericSimpleRead() { // This is failing. // Looks like we inherited a real bug with numerics from psqlodbc, // because the problem exists with Postresql-supplied psqlodbc // connecting to a Postgresql server. ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(BigDecimal.class, rs.getObject("n").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals(new BigDecimal(7.8), rs.getBigDecimal("n")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } */ public void testFloatSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(Double.class, rs.getObject("f").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals(8.9D, rs.getDouble("f"), 0D); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testDoubleSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(Double.class, rs.getObject("r").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals(9.7D, rs.getDouble("r"), 0D); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testBooleanSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(Boolean.class, rs.getObject("b").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertTrue(rs.getBoolean("b")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testCharSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(String.class, rs.getObject("c").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals("ab ", rs.getString("c")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testVarCharSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(String.class, rs.getObject("cv").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals("cd", rs.getString("cv")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testFixedStringSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT i, 'fixed str' fs, cv\n" + "FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(String.class, rs.getObject("fs").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals("fixed str", rs.getString("fs")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testDerivedStringSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT i, cv || 'appendage' app, 4\n" + "FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(String.class, rs.getObject("app").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals("cdappendage", rs.getString("app")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testDateSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(java.sql.Date.class, rs.getObject("d").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals( new java.sql.Date(new java.util.Date().getTime()).toString(), rs.getDate("d").toString()); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testTimeSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(java.sql.Time.class, rs.getObject("t").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals(Time.valueOf("13:14:00"), rs.getTime("t")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } /* public void testTimeWSimpleRead() { // This test is failing because the JDBC Driver is returning a // String instead of a Time oject for rs.getTime(). ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(java.sql.Time.class, rs.getObject("tw").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals(Time.valueOf("15:16:00"), rs.getTime("tw")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } */ public void testTimestampSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(Timestamp.class, rs.getObject("ts").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals(Timestamp.valueOf("2009-02-09 16:17:18"), rs.getTimestamp("ts")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testTimestampWSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals(Timestamp.class, rs.getObject("tsw").getClass()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals(Timestamp.valueOf("2009-02-09 17:18:19"), rs.getTimestamp("tsw")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testBitSimpleRead() { // This test is failing because of a BIT padding bug in the engine. ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals("100000000", rs.getString("bt")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testBitVaryingSimpleRead() { ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertTrue("Got only one row with id in (1, 2)", rs.next()); assertEquals("10", rs.getString("btv")); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testBinarySimpleRead() { ResultSet rs = null; Statement st = null; byte[] expectedBytes = new byte[] { (byte) 0xa1, (byte) 0x03, (byte) 0, (byte) 0 }; byte[] ba; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals("A1030000", rs.getString("bin")); assertTrue("Got only one row with id in (1, 2)", rs.next()); ba = rs.getBytes("bin"); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } assertEquals("Retrieved bye array length wrong", expectedBytes.length, ba.length); for (int i = 0; i < ba.length; i++) { assertEquals("Byte " + i + " wrong", expectedBytes[i], ba[i]); } } public void testVarBinarySimpleRead() { ResultSet rs = null; Statement st = null; byte[] expectedBytes = new byte[] { (byte) 0xa1, (byte) 0x03 }; byte[] ba; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals("A103", rs.getString("vb")); assertTrue("Got only one row with id in (1, 2)", rs.next()); ba = rs.getBytes("vb"); assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } assertEquals("Retrieved bye array length wrong", expectedBytes.length, ba.length); for (int i = 0; i < ba.length; i++) { assertEquals("Byte " + i + " wrong", expectedBytes[i], ba[i]); } } public void testDaySecIntervalSimpleRead() { /* Since our client does not support the INTERVAL precision * constraints, the returned value will always be toString()'d to * precision of microseconds. */ ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals("145 23:12:19.345000", rs.getString("dsival")); assertTrue("Got only one row with id in (1, 2)", rs.next()); // Can't test the class, because jdbc:odbc or the driver returns // a String for getObject() for interval values. assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testSecIntervalSimpleRead() { /* Since our client does not support the INTERVAL precision * constraints, the returned value will always be toString()'d to * precision of microseconds. */ ResultSet rs = null; Statement st = null; try { st = netConn.createStatement(); rs = st.executeQuery("SELECT * FROM alltypes WHERE id in (1, 2)"); assertTrue("Got no rows with id in (1, 2)", rs.next()); assertEquals("1000.345000", rs.getString("sival")); assertTrue("Got only one row with id in (1, 2)", rs.next()); // Can't test the class, because jdbc:odbc or the driver returns // a String for getObject() for interval values. assertFalse("Got too many rows with id in (1, 2)", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } } catch(Exception e) { } } } public void testIntegerComplex() { PreparedStatement ps = null; ResultSet rs = null; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, i) VALUES(?, ?)"); ps.setInt(1, 3); ps.setInt(2, 495); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE i = ?"); ps.setInt(1, 495); rs = ps.executeQuery(); assertTrue("Got no rows with i = 495", rs.next()); assertEquals(Integer.class, rs.getObject("i").getClass()); assertTrue("Got only one row with i = 495", rs.next()); assertEquals(495, rs.getInt("i")); assertFalse("Got too many rows with i = 495", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } public void testTinyIntComplex() { PreparedStatement ps = null; ResultSet rs = null; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, ti) VALUES(?, ?)"); ps.setInt(1, 3); ps.setByte(2, (byte) 200); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE ti = ?"); ps.setByte(1, (byte) 200); rs = ps.executeQuery(); assertTrue("Got no rows with ti = 200", rs.next()); assertEquals(Integer.class, rs.getObject("ti").getClass()); assertTrue("Got only one row with ti = 200", rs.next()); assertEquals((byte) 200, rs.getByte("ti")); assertFalse("Got too many rows with ti = 200", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } public void testSmallIntComplex() { PreparedStatement ps = null; ResultSet rs = null; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, si) VALUES(?, ?)"); ps.setInt(1, 3); ps.setShort(2, (short) 395); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE si = ?"); ps.setShort(1, (short) 395); rs = ps.executeQuery(); assertTrue("Got no rows with si = 395", rs.next()); assertEquals(Integer.class, rs.getObject("si").getClass()); // Nb. HyperSQL purposefully returns an Integer for this type assertTrue("Got only one row with si = 395", rs.next()); assertEquals((short) 395, rs.getShort("si")); assertFalse("Got too many rows with si = 395", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } public void testBigIntComplex() { PreparedStatement ps = null; ResultSet rs = null; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, bi) VALUES(?, ?)"); ps.setInt(1, 3); ps.setLong(2, 295L); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE bi = ?"); ps.setLong(1, 295L); rs = ps.executeQuery(); assertTrue("Got no rows with bi = 295L", rs.next()); assertEquals(Long.class, rs.getObject("bi").getClass()); assertTrue("Got only one row with bi = 295L", rs.next()); assertEquals(295L, rs.getLong("bi")); assertFalse("Got too many rows with bi = 295L", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } /* TODO: Implement this test after get testNumericSimpleRead() working. * See that method above. public void testNumericComplex() { */ public void testFloatComplex() { PreparedStatement ps = null; ResultSet rs = null; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, f) VALUES(?, ?)"); ps.setInt(1, 3); ps.setFloat(2, 98.765F); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE f = ?"); ps.setFloat(1, 98.765F); rs = ps.executeQuery(); assertTrue("Got no rows with f = 98.765F", rs.next()); assertEquals(Double.class, rs.getObject("f").getClass()); assertTrue("Got only one row with f = 98.765F", rs.next()); assertEquals(98.765D, rs.getDouble("f"), .01D); assertFalse("Got too many rows with f = 98.765F", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } public void testDoubleComplex() { PreparedStatement ps = null; ResultSet rs = null; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, r) VALUES(?, ?)"); ps.setInt(1, 3); ps.setDouble(2, 876.54D); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE r = ?"); ps.setDouble(1, 876.54D); rs = ps.executeQuery(); assertTrue("Got no rows with r = 876.54D", rs.next()); assertEquals(Double.class, rs.getObject("r").getClass()); assertTrue("Got only one row with r = 876.54D", rs.next()); assertEquals(876.54D, rs.getDouble("r"), 0D); assertFalse("Got too many rows with r = 876.54D", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } public void testBooleanComplex() { PreparedStatement ps = null; ResultSet rs = null; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, b) VALUES(?, ?)"); ps.setInt(1, 3); ps.setBoolean(2, false); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE b = ?"); ps.setBoolean(1, false); rs = ps.executeQuery(); assertTrue("Got no rows with b = false", rs.next()); assertEquals(Boolean.class, rs.getObject("b").getClass()); assertTrue("Got only one row with b = false", rs.next()); assertEquals(false, rs.getBoolean("b")); assertFalse("Got too many rows with b = false", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } public void testCharComplex() { PreparedStatement ps = null; ResultSet rs = null; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, c) VALUES(?, ?)"); ps.setInt(1, 3); ps.setString(2, "xy"); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE c = ?"); ps.setString(1, "xy "); rs = ps.executeQuery(); assertTrue("Got no rows with c = 'xy '", rs.next()); assertEquals(String.class, rs.getObject("c").getClass()); assertTrue("Got only one row with c = 'xy '", rs.next()); assertEquals("xy ", rs.getString("c")); assertFalse("Got too many rows with c = 'xy '", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } public void testVarCharComplex() { PreparedStatement ps = null; ResultSet rs = null; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, cv) VALUES(?, ?)"); ps.setInt(1, 3); ps.setString(2, "xy"); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE cv = ?"); ps.setString(1, "xy"); rs = ps.executeQuery(); assertTrue("Got no rows with cv = 'xy'", rs.next()); assertEquals(String.class, rs.getObject("cv").getClass()); assertTrue("Got only one row with cv = 'xy'", rs.next()); assertEquals("xy", rs.getString("cv")); assertFalse("Got too many rows with cv = 'xy'", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } /** * TODO: Find out if there is a way to select based on an expression * using a named derived pseudo-column. public void testDerivedComplex() { PreparedStatement ps = null; ResultSet rs = null; try { ps = netConn.prepareStatement( "SELECT id, cv || 'app' appendage FROM alltypes\n" + "WHERE appendage = ?"); ps.setString(1, "cvapp"); rs = ps.executeQuery(); assertTrue("Got no rows appendage = 'cvapp'", rs.next()); assertEquals(String.class, rs.getObject("r").getClass()); assertTrue("Got only one row with appendage = 'cvapp'", rs.next()); assertEquals("cvapp", rs.getString("r")); assertFalse("Got too many rows with appendage = 'cvapp'", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } */ public void testDateComplex() { PreparedStatement ps = null; ResultSet rs = null; java.sql.Date tomorrow = new java.sql.Date(new java.util.Date().getTime() + 1000 * 60 * 60 * 24); try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, d) VALUES(?, ?)"); ps.setInt(1, 3); ps.setDate(2, tomorrow); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE d = ?"); ps.setDate(1, tomorrow); rs = ps.executeQuery(); assertTrue("Got no rows with d = tomorrow", rs.next()); assertEquals(java.sql.Date.class, rs.getObject("d").getClass()); assertTrue("Got only one row with d = tomorrow", rs.next()); assertEquals(tomorrow.toString(), rs.getDate("d").toString()); // Compare the Strings since "tomorrow" has resolution to // millisecond, but getDate() is probably to the day. assertFalse("Got too many rows with d = tomorrow", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } public void testTimeComplex() { PreparedStatement ps = null; ResultSet rs = null; Time aTime = Time.valueOf("21:19:27"); try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, t) VALUES(?, ?)"); ps.setInt(1, 3); ps.setTime(2, aTime); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE t = ?"); ps.setTime(1, aTime); rs = ps.executeQuery(); assertTrue("Got no rows with t = aTime", rs.next()); assertEquals(Time.class, rs.getObject("t").getClass()); assertTrue("Got only one row with t = aTime", rs.next()); assertEquals(aTime, rs.getTime("t")); assertFalse("Got too many rows with t = aTime", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } /* TODO: Implement this test after get testTimeWSimpleRead() working. * See that method above. public void testTimeWComplex() { */ public void testTimestampComplex() { PreparedStatement ps = null; ResultSet rs = null; Timestamp aTimestamp = Timestamp.valueOf("2009-03-27 17:18:19"); try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, ts) VALUES(?, ?)"); ps.setInt(1, 3); ps.setTimestamp(2, aTimestamp); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE ts = ?"); ps.setTimestamp(1, aTimestamp); rs = ps.executeQuery(); assertTrue("Got no rows with ts = aTimestamp", rs.next()); assertEquals(Timestamp.class, rs.getObject("ts").getClass()); assertTrue("Got only one row with ts = aTimestamp", rs.next()); assertEquals(aTimestamp, rs.getTimestamp("ts")); assertFalse("Got too many rows with ts = aTimestamp", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } public void testTimestampWComplex() { PreparedStatement ps = null; ResultSet rs = null; Timestamp aTimestamp = Timestamp.valueOf("2009-03-27 17:18:19"); try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, tsw) VALUES(?, ?)"); ps.setInt(1, 3); ps.setTimestamp(2, aTimestamp); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE tsw = ?"); ps.setTimestamp(1, aTimestamp); rs = ps.executeQuery(); assertTrue("Got no rows with tsw = aTimestamp", rs.next()); assertEquals(Timestamp.class, rs.getObject("tsw").getClass()); assertTrue("Got only one row with tsw = aTimestamp", rs.next()); assertEquals(aTimestamp, rs.getTimestamp("tsw")); assertFalse("Got too many rows with tsw = aTimestamp", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } /* * Driver needs to be modified to transfer bits in byte (binary) fashion, * the same as is done for VARBINARY/bytea type. public void testBitComplex() { PreparedStatement ps = null; ResultSet rs = null; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, bt) VALUES(?, ?)"); ps.setInt(1, 3); ps.setString(2, "101"); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE bt = ?"); ps.setString(1, "101"); rs = ps.executeQuery(); assertTrue("Got no rows with bt = 101", rs.next()); assertEquals(String.class, rs.getObject("bt").getClass()); assertTrue("Got only one row with bt = 101", rs.next()); assertEquals("101000000", rs.getString("bt")); assertFalse("Got too many rows with bt = 101", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } public void testBitVaryingComplex() { PreparedStatement ps = null; ResultSet rs = null; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, btv) VALUES(?, ?)"); ps.setInt(1, 3); ps.setString(2, "10101"); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE btv = ?"); ps.setString(1, "10101"); rs = ps.executeQuery(); assertTrue("Got no rows with btv = 10101", rs.next()); assertEquals(String.class, rs.getObject("btv").getClass()); assertTrue("Got only one row with btv = 10101", rs.next()); assertEquals("10101", rs.getString("btv")); assertFalse("Got too many rows with btv = 10101", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } */ public void testBinaryComplex() { PreparedStatement ps = null; ResultSet rs = null; byte[] expectedBytes = new byte[] { (byte) 0xaa, (byte) 0x99, (byte) 0, (byte) 0 }; byte[] ba1, ba2; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, bin) VALUES(?, ?)"); ps.setInt(1, 3); ps.setBytes(2, expectedBytes); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE bin = ?"); ps.setBytes(1, expectedBytes); rs = ps.executeQuery(); assertTrue("Got no rows with bin = b'AA99'", rs.next()); ba1 = rs.getBytes("bin"); assertTrue("Got only one row with bin = b'AA99'", rs.next()); ba2 = rs.getBytes("bin"); assertFalse("Got too many rows with bin = b'AA99'", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } assertEquals("Retrieved bye array length wrong (1)", expectedBytes.length, ba1.length); for (int i = 0; i < ba1.length; i++) { assertEquals("Byte " + i + " wrong (1)", expectedBytes[i], ba1[i]); } assertEquals("Retrieved bye array length wrong (2)", expectedBytes.length, ba2.length); for (int i = 0; i < ba2.length; i++) { assertEquals("Byte " + i + " wrong (2)", expectedBytes[i], ba2[i]); } } public void testVarBinaryComplex() { PreparedStatement ps = null; ResultSet rs = null; byte[] expectedBytes = new byte[] { (byte) 0xaa, (byte) 0x99 }; byte[] ba1, ba2; try { ps = netConn.prepareStatement( "INSERT INTO alltypes(id, vb) VALUES(?, ?)"); ps.setInt(1, 3); ps.setBytes(2, expectedBytes); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE vb = ?"); ps.setBytes(1, expectedBytes); rs = ps.executeQuery(); assertTrue("Got no rows with vb = b'AA99'", rs.next()); ba1 = rs.getBytes("vb"); assertTrue("Got only one row with vb = b'AA99'", rs.next()); ba2 = rs.getBytes("vb"); assertFalse("Got too many rows with vb = b'AA99'", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } assertEquals("Retrieved bye array length wrong (1)", expectedBytes.length, ba1.length); for (int i = 0; i < ba1.length; i++) { assertEquals("Byte " + i + " wrong (1)", expectedBytes[i], ba1[i]); } assertEquals("Retrieved bye array length wrong (2)", expectedBytes.length, ba2.length); for (int i = 0; i < ba2.length; i++) { assertEquals("Byte " + i + " wrong (2)", expectedBytes[i], ba2[i]); } } /* * TODO: Learn how to set input params for INTERVAL types. * I don't see how I could set the variant * (HOUR, ...TO SECOND, etc.) with setString() or anything else. public void testDaySecIntervalComplex() { PreparedStatement ps = null; ResultSet rs = null; try { assertEquals("145 23:12:19.345000", rs.getString("dsival")); ps = netConn.prepareStatement( "INSERT INTO alltypes(id, dsival) VALUES(?, ?)"); ps.setInt(1, 3); ps.setString(2, 876.54D); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE dsival = ?"); ps.setString(1, 876.54D); rs = ps.executeQuery(); assertTrue("Got no rows with dsival = 876.54D", rs.next()); assertEquals(String.class, rs.getObject("dsival").getClass()); assertTrue("Got only one row with dsival = 876.54D", rs.next()); assertEquals(876.54D, rs.getString("dsival")); assertFalse("Got too many rows with dsival = 876.54D", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } public void testSecIntervalComplex() { PreparedStatement ps = null; ResultSet rs = null; try { assertEquals("1000.345000", rs.getString("sival")); ps = netConn.prepareStatement( "INSERT INTO alltypes(id, sival) VALUES(?, ?)"); ps.setInt(1, 3); ps.setString(2, 876.54D); assertEquals(1, ps.executeUpdate()); ps.setInt(1, 4); assertEquals(1, ps.executeUpdate()); ps.close(); netConn.commit(); ps = netConn.prepareStatement( "SELECT * FROM alltypes WHERE sival = ?"); ps.setString(1, 876.54D); rs = ps.executeQuery(); assertTrue("Got no rows with sival = 876.54D", rs.next()); assertEquals(String.class, rs.getObject("sival").getClass()); assertTrue("Got only one row with sival = 876.54D", rs.next()); assertEquals(876.54D, rs.getString("sival")); assertFalse("Got too many rows with sival = 876.54D", rs.next()); } catch (SQLException se) { junit.framework.AssertionFailedError ase = new junit.framework.AssertionFailedError(se.getMessage()); ase.initCause(se); throw ase; } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } } catch(Exception e) { } } } */ public static void main(String[] sa) { staticRunner(TestOdbcTypes.class, sa); } /* static protected boolean closeEnough(Time t1, Time t2, int fudgeMin) { long delta = t1.getTime() - t2.getTime(); if (delta < 0) { delta *= -1; } //System.err.println("Delta " + delta); //System.err.println("exp " + (fudgeMin * 1000 * 60)); return delta < fudgeMin * 1000 * 60; } */ } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestDbBackup.java0000644000175000017500000005471312007547406023112 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import org.hsqldb.lib.tar.DbBackup; import org.hsqldb.lib.tar.TarMalformatException; import junit.framework.Test; import junit.framework.TestSuite; public class TestDbBackup extends junit.framework.TestCase { public TestDbBackup() throws IOException, SQLException {} static protected File baseDir = new File(System.getProperty("java.io.tmpdir"), "TestDbBackup-" + System.getProperty("user.name")); static { try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); } catch (ClassNotFoundException cnfe) { throw new RuntimeException( " failed. JDBC Driver class not in CLASSPATH"); } } /** * Individual test methods may or may not need a Connection. * If they do, they run setupConn() then use 'conn', and it will be * automatically closed by the tearDown() method. * * @see #tearDown() */ protected void setupConn(String id) throws SQLException { conn = getConnection(id); alreadyShut = false; } protected void shutdownAndCloseConn() throws SQLException { if (conn == null) { return; } if (!alreadyShut) { conn.createStatement().executeUpdate("SHUTDOWN"); alreadyShut = true; } if (verbose) { System.err.println("Shut down 'db1'"); } conn.close(); conn = null; } /** * Use setupConn() to set up this Connection for just this individual test. * * @see #setupConn(String) */ protected Connection conn = null; protected boolean alreadyShut = false; /** * Remove the specified directory and all of it's descendants. * * @throws IOException if unable to completely remove the specified dir */ protected void rmR(File dir) throws IOException { if (!dir.exists()) { throw new IOException("Specified dir does not exist: " + dir.getAbsolutePath()); } File[] children = dir.listFiles(); for (int i = 0; i < children.length; i++) { if (children[i].isDirectory()) { rmR(children[i]); } else if (!children[i].delete()) { throw new IOException("Failed to remove '" + children[i].getAbsolutePath() + "'"); } } if (!dir.delete()) { throw new IOException("Failed to remove '" + dir.getAbsolutePath() + "'"); } } /** * Accommodate JUnit's test-runner conventions. */ public TestDbBackup(String s) throws IOException, SQLException { super(s); } /** * JUnit convention for cleanup. * * Called after each test*() method. */ protected void tearDown() throws IOException, SQLException { if (baseDir.exists()) { rmR(baseDir); if (verbose) { System.err.println("Tore down"); } } } static boolean verbose = Boolean.getBoolean("VERBOSE"); /** * Specifically, this method creates and populates "db1", then closes it. * * Invoked before each test*() invocation by JUnit. */ protected void setUp() throws IOException, SQLException { if (verbose) { System.err.println("Set-upping"); } if (baseDir.exists()) { throw new IOException( "Please wipe out work directory '" + baseDir + ", which is probably left over from an " + "aborted test run"); } try { setupConn("db1"); Statement st = conn.createStatement(); st.executeUpdate("CREATE TABLE t(i int);"); st.executeUpdate("INSERT INTO t values(34);"); conn.commit(); } catch (SQLException se) {} finally { shutdownAndCloseConn(); } } /** * Make sure to close after using the returned connection * (like in a finally block). */ protected Connection getConnection(String id) throws SQLException { Connection c = DriverManager.getConnection("jdbc:hsqldb:file:" + baseDir.getAbsolutePath() + '/' + id + "/dbfile", "SA", ""); if (verbose) { System.err.println("Opening JDBC URL '" + "jdbc:hsqldb:file:" + baseDir.getAbsolutePath() + '/' + id + "/dbfile"); } c.setAutoCommit(false); return c; } /** * This method allows to easily run this unit test independent of the other * unit tests, and without dealing with Ant or unrelated test suites. */ public static void main(String[] sa) { if (sa.length > 0 && !sa[sa.length - 1].equals("-g")) { TestDbBackup.baseDir = new File(sa[0]); if (baseDir.exists()) { throw new IllegalArgumentException( "If you specify a work directory, it must not exist " + "yet. (This makes it much easier for us to clean up " + "after ourselves)."); } System.err.println("Using user-specified base dir: " + baseDir.getAbsolutePath()); } junit.textui.TestRunner runner = new junit.textui.TestRunner(); junit.framework.TestResult result = runner.run(runner.getTest(TestDbBackup.class.getName())); System.exit(result.wasSuccessful() ? 0 : 1); } public void testSanity() throws SQLException { try { setupConn("db1"); ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM t;"); rs.next(); assertEquals("Wrong table 't' contents", 34, rs.getInt("i")); } finally { shutdownAndCloseConn(); } } public void testBasicBackup() throws SQLException, IOException, TarMalformatException { mainBackupAndRestore("basic.tar"); } public void testGzip() throws SQLException, IOException, TarMalformatException { mainBackupAndRestore("compressed.tar.gz"); } /** * Test all forms of online backups with explicit filenames. */ public void testOnlineBackup() throws SQLException, IOException, TarMalformatException { onlineBackupAndRestore("online.tar", true, false, "db11"); onlineBackupAndRestore("online.tar.gz", false, true, "db12"); onlineBackupAndRestore("online.tgz", false, true, "db13"); } public void onlineBackupAndRestore(String baseTarName, boolean populate, boolean compress, String restoreDest) throws SQLException, IOException, TarMalformatException { try { setupConn("db1"); conn.createStatement().executeUpdate("DELETE FROM t"); // For this case, we wipe the data that we so carefully set up, // so that we can call this method repeatedly without worrying // about left-over data from a previous run. conn.commit(); conn.createStatement().executeUpdate("INSERT INTO t VALUES(1)"); conn.createStatement().executeUpdate("INSERT INTO t VALUES(2)"); conn.createStatement().executeUpdate("INSERT INTO t VALUES(3)"); conn.commit(); conn.createStatement().executeUpdate("INSERT INTO t VALUES(4)"); conn.createStatement().executeUpdate("INSERT INTO t VALUES(5)"); conn.createStatement().executeUpdate("BACKUP DATABASE TO '" + baseDir.getAbsolutePath() + '/' + baseTarName + "' BLOCKING" + (compress ? "" : " NOT COMPRESSED")); conn.createStatement().executeUpdate( "INSERT INTO t VALUES(6)"); conn.commit(); conn.createStatement().executeUpdate("SHUTDOWN"); alreadyShut = true; if (verbose) { System.err.println("Shut down 'db1'"); } } finally { shutdownAndCloseConn(); } File destDir = new File(baseDir, restoreDest); if (!destDir.mkdir()) { throw new IOException("Failed to make new dir. to restore to: " + destDir.getAbsolutePath()); } DbBackup.main(new String[] { "--extract", baseDir.getAbsolutePath() + '/' + baseTarName, destDir.getAbsolutePath() }); try { setupConn(restoreDest); conn.createStatement().executeUpdate("ROLLBACK"); ResultSet rs = conn.createStatement().executeQuery("SELECT count(*) c FROM t;"); rs.next(); // 3 committed, 5 uncommited before saving: assertEquals("Wrong table 't' contents", 5, rs.getInt("c")); } finally { shutdownAndCloseConn(); } } public void mainBackupAndRestore(String baseTarName) throws SQLException, IOException, TarMalformatException { DbBackup.main(new String[] { "--save", baseDir.getAbsolutePath() + '/' + baseTarName, baseDir.getAbsolutePath() + "/db1/dbfile" }); File destDir = new File(baseDir, "mainrestored"); if (!destDir.mkdir()) { throw new IOException("Failed to make new dir. to restore to: " + destDir.getAbsolutePath()); } DbBackup.main(new String[] { "--extract", baseDir.getAbsolutePath() + '/' + baseTarName, destDir.getAbsolutePath() }); try { setupConn("mainrestored"); ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM t;"); rs.next(); assertEquals("Wrong table 't' contents", 34, rs.getInt("i")); } finally { shutdownAndCloseConn(); } } public void testMainAlreadyOpen() throws SQLException, IOException, TarMalformatException { try { setupConn("db1"); try { DbBackup.main(new String[] { "--save", baseDir.getAbsolutePath() + "/mainOpen.tar", baseDir.getAbsolutePath() + "/db1/dbfile" }); } catch (IllegalStateException ioe) { return; } } finally { shutdownAndCloseConn(); } fail("Backup from main() did not throw even though DB is open"); } /** * Test that bad explicit filenames are rejected for onilne backups. */ public void testTarFileNames() throws SQLException, IOException, TarMalformatException { boolean caught; try { setupConn("db1"); conn.createStatement().executeUpdate("INSERT INTO t VALUES(2)"); conn.commit(); // #1: COMPRESSED -> no-extension caught = false; try { conn.createStatement().executeUpdate("BACKUP DATABASE TO '" + baseDir.getAbsolutePath() + "/x/bad' BLOCKING COMPRESSED"); } catch (SQLException se) { caught = true; } if (!caught) { fail("BACKUP did not throw even though requested compression " + "to file '/x/bad'"); } // #2: NOT COMPRESSED -> no-extension caught = false; try { conn.createStatement().executeUpdate("BACKUP DATABASE TO '" + baseDir.getAbsolutePath() + "/x/bad' BLOCKING NOT COMPRESSED"); } catch (SQLException se) { caught = true; } if (!caught) { fail("BACKUP did not throw even though requested " + "no-compression to file '/x/bad'"); } // #3: COMPRESSED -> *.txt caught = false; try { conn.createStatement().executeUpdate("BACKUP DATABASE TO '" + baseDir.getAbsolutePath() + "/x/bad.txt' BLOCKING COMPRESSED"); } catch (SQLException se) { caught = true; } if (!caught) { fail("BACKUP did not throw even though requested compression " + "to file '/x/bad.txt'"); } // #4: NOT COMPRESSED -> *.txt caught = false; try { conn.createStatement().executeUpdate("BACKUP DATABASE TO '" + baseDir.getAbsolutePath() + "/x/bad.txt' BLOCKING NOT COMPRESSED"); } catch (SQLException se) { caught = true; } if (!caught) { fail("BACKUP did not throw even though requested " + "no-compression to file '/x/bad.txt'"); } // #5: DEFAULT -> *.tar caught = false; try { conn.createStatement().executeUpdate("BACKUP DATABASE TO '" + baseDir.getAbsolutePath() + "/x/bad.tar' BLOCKING"); } catch (SQLException se) { caught = true; } if (!caught) { fail("BACKUP did not throw even though requested default " + "to file '/x/bad.tar'"); } // #6: COMPRESSION -> *.tar caught = false; try { conn.createStatement().executeUpdate("BACKUP DATABASE TO '" + baseDir.getAbsolutePath() + "/x/bad.tar' BLOCKING COMPRESSED"); } catch (SQLException se) { caught = true; } if (!caught) { fail("BACKUP did not throw even though requested compression " + "to file '/x/bad.tar'"); } // #7: NOT COMPRESSED -> *.tar.gz caught = false; try { conn.createStatement().executeUpdate("BACKUP DATABASE TO '" + baseDir.getAbsolutePath() + "/x/bad.tar.gz' BLOCKING NOT COMPRESSED"); } catch (SQLException se) { caught = true; } if (!caught) { fail("BACKUP did not throw even though requested " + "non-compression to file '/x/bad.tar.gz'"); } // #8: NOT COMPRESSED -> *.tgz caught = false; try { conn.createStatement().executeUpdate("BACKUP DATABASE TO '" + baseDir.getAbsolutePath() + "/x/bad.tgz' BLOCKING NOT COMPRESSED"); } catch (SQLException se) { caught = true; } if (!caught) { fail("BACKUP did not throw even though requested " + "non-compression to file '/x/bad.tgz'"); } // Finally run a test to ensure that the attempts above didn't // fail for some unexpected reason. conn.createStatement().executeUpdate("BACKUP DATABASE TO '" + baseDir.getAbsolutePath() + "/positivetest.tar' BLOCKING NOT COMPRESSED"); } finally { shutdownAndCloseConn(); } } /** * Test that correct DB names are generated when user supplies just a * directory. * * N.b. This test may not work right if tests are run at midnight. * This limitation will be removed once we can update the FilenameFilters * with Java 4's java.util.regex. */ public void testAutoNaming() throws SQLException, IOException, TarMalformatException { boolean caught; int fileCount; try { setupConn("db1"); conn.createStatement().executeUpdate("INSERT INTO t VALUES(2)"); conn.commit(); fileCount = baseDir.listFiles(autoTarFilenameFilter).length; if (fileCount != 0) throw new IllegalStateException(Integer.toString(fileCount) + " auto-tar files exist in baseDir '" + baseDir.getAbsolutePath() + "' before starting testAutoNaming"); fileCount = baseDir.listFiles(autoTarGzFilenameFilter).length; if (fileCount != 0) throw new IllegalStateException(Integer.toString(fileCount) + " auto-tar.gz files exist in baseDir '" + baseDir.getAbsolutePath() + "' before starting testAutoNaming"); conn.createStatement().executeUpdate("BACKUP DATABASE TO '" + baseDir.getAbsolutePath() + "/' BLOCKING NOT COMPRESSED"); fileCount = baseDir.listFiles(autoTarFilenameFilter).length; if (fileCount != 1) fail(Integer.toString(fileCount) + " auto-tar files exist in baseDir '" + baseDir.getAbsolutePath() + "' after writing a non-compressed backup"); fileCount = baseDir.listFiles(autoTarGzFilenameFilter).length; if (fileCount != 0) fail(Integer.toString(fileCount) + " auto-tar.gz files exist in baseDir '" + baseDir.getAbsolutePath() + "' after writing a non-compressed backup"); conn.createStatement().executeUpdate("BACKUP DATABASE TO '" + baseDir.getAbsolutePath() + "/' BLOCKING COMPRESSED"); fileCount = baseDir.listFiles(autoTarFilenameFilter).length; if (fileCount != 1) fail(Integer.toString(fileCount) + " auto-tar files exist in baseDir '" + baseDir.getAbsolutePath() + "' after writing both backups"); fileCount = baseDir.listFiles(autoTarGzFilenameFilter).length; if (fileCount != 1) fail(Integer.toString(fileCount) + " auto-tar.gz files exist in baseDir '" + baseDir.getAbsolutePath() + "' after writing a compressed backup"); } finally { shutdownAndCloseConn(); } } public static Test suite() throws IOException, SQLException { TestSuite newSuite = new TestSuite(); newSuite.addTest(new TestDbBackup("testSanity")); newSuite.addTest(new TestDbBackup("testBasicBackup")); newSuite.addTest(new TestDbBackup("testMainAlreadyOpen")); newSuite.addTest(new TestDbBackup("testGzip")); newSuite.addTest(new TestDbBackup("testOnlineBackup")); newSuite.addTest(new TestDbBackup("testTarFileNames")); newSuite.addTest(new TestDbBackup("testAutoNaming")); return newSuite; } private String autoMiddlingString = "-" + new SimpleDateFormat("yyyyMMdd").format(new java.util.Date()) + 'T'; FilenameFilter autoTarFilenameFilter = new FilenameFilter() { private String suffixFormat = "-yyyyMMddTHHmmss.tar"; public boolean accept(File dir, String name) { if (name.length() < suffixFormat.length() + 1) { // Require variable name length >= 1 char return false; } int suffixPos = name.length() - suffixFormat.length(); // Would like to use Java 1.4's java.util.regex here. return name.endsWith(".tar") && name.substring(suffixPos, suffixPos + autoMiddlingString.length()) .equals(autoMiddlingString); } }; FilenameFilter autoTarGzFilenameFilter = new FilenameFilter() { private String suffixFormat = "-yyyyMMddTHHmmss.tar.gz"; public boolean accept(File dir, String name) { if (name.length() < suffixFormat.length() + 1) { // Require variable name length >= 1 char return false; } int suffixPos = name.length() - suffixFormat.length(); // Would like to use Java 1.4's java.util.regex here. return name.endsWith(".tar.gz") && name.substring(suffixPos, suffixPos + autoMiddlingString.length()) .equals(autoMiddlingString); } }; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestBench.java0000644000175000017500000010302112007547410022434 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; // nbazin@users - enhancements to the original code // fredt@users - 20050202 - corrected getRandomID(int) to return a randomly distributed value /* * This is a sample implementation of the Transaction Processing Performance * Council Benchmark B coded in Java and ANSI SQL2. * * This version is using one connection per thread to parallellize * server operations. * @author Mark Matthews (mark@mysql.com) */ import java.io.PrintStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Enumeration; import java.util.Vector; import java.sql.CallableStatement; class TestBench { /* tpc bm b scaling rules */ public static int tps = 1; /* the tps scaling factor: here it is 1 */ public static int nbranches = 1; /* number of branches in 1 tps db */ public static int ntellers = 10; /* number of tellers in 1 tps db */ public static int naccounts = 100000; /* number of accounts in 1 tps db */ public static int nhistory = 864000; /* number of history recs in 1 tps db */ public static int rounds = 10; /* number of rounds to run the test */ public static final int TELLER = 0; public static final int BRANCH = 1; public static final int ACCOUNT = 2; int failed_transactions = 0; int transaction_count = 0; static int n_clients = 10; static int n_txn_per_client = 10; static boolean count_results = false; long start_time = 0; static String tableExtension = ""; static String createExtension = ""; static String ShutdownCommand = ""; static boolean useStoredProcedure = false; static boolean verbose = true; MemoryWatcherThread MemoryWatcher; /* main program, creates a 1-tps database: i.e. 1 branch, 10 tellers,... * runs one TPC BM B transaction * example command line: * -driver org.hsqldb.jdbc.JDBCDriver -url jdbc:hsqldb:/hsql/jdbcbench/test -user SA -clients 20 -tpc 10000 */ public static void main(String[] Args) { String DriverName = ""; String DBUrl = ""; String DBUser = ""; String DBPassword = ""; boolean initialize_dataset = true; for (int i = 0; i < Args.length; i++) { if (Args[i].equals("-clients")) { if (i + 1 < Args.length) { i++; n_clients = Integer.parseInt(Args[i]); } } else if (Args[i].equals("-driver")) { if (i + 1 < Args.length) { i++; DriverName = Args[i]; } } else if (Args[i].equals("-url")) { if (i + 1 < Args.length) { i++; DBUrl = Args[i]; } } else if (Args[i].equals("-user")) { if (i + 1 < Args.length) { i++; DBUser = Args[i]; } } else if (Args[i].equals("-password")) { if (i + 1 < Args.length) { i++; DBPassword = Args[i]; } } else if (Args[i].equals("-tpc")) { if (i + 1 < Args.length) { i++; n_txn_per_client = Integer.parseInt(Args[i]); } } else if (Args[i].equals("-init")) { initialize_dataset = true; } else if (Args[i].equals("-tps")) { if (i + 1 < Args.length) { i++; tps = Integer.parseInt(Args[i]); } } else if (Args[i].equals("-rounds")) { if (i + 1 < Args.length) { i++; rounds = Integer.parseInt(Args[i]); } } else if (Args[i].equals("-sp")) { useStoredProcedure = true; } else if (Args[i].equals("-v")) { verbose = true; } } if (DriverName.length() == 0 || DBUrl.length() == 0) { System.out.println( "usage: java TestBench -driver [driver_class_name] -url [url_to_db] -user [username] -password [password] [-v] [-init] [-tpc n] [-clients n]"); System.out.println(); System.out.println("-v verbose error messages"); System.out.println("-init initialize the tables"); System.out.println("-tpc transactions per client"); System.out.println("-clients number of simultaneous clients"); System.exit(-1); } System.out.println( "*********************************************************"); System.out.println( "* TestBench v1.1 *"); System.out.println( "*********************************************************"); System.out.println(); System.out.println("Driver: " + DriverName); System.out.println("URL:" + DBUrl); System.out.println(); System.out.println("Scale factor value: " + tps); System.out.println("Number of clients: " + n_clients); System.out.println("Number of transactions per client: " + n_txn_per_client); System.out.println(); if (DriverName.equals("org.hsqldb.jdbc.JDBCDriver") || DriverName.equals("org.hsqldb.jdbcDriver")) { if (!DBUrl.contains("mem:")) { ShutdownCommand = "SHUTDOWN"; } } try { Class.forName(DriverName); TestBench Me = new TestBench(DBUrl, DBUser, DBPassword, initialize_dataset); } catch (Exception E) { System.out.println(E.getMessage()); E.printStackTrace(); } } public TestBench(String url, String user, String password, boolean init) { Vector vClient = new Vector(); Thread Client = null; Enumeration e = null; Connection guardian = null; try { java.util.Date start = new java.util.Date(); if (init) { System.out.println("Start: " + start.toString()); System.out.print("Initializing dataset..."); createDatabase(url, user, password); double seconds = (System.currentTimeMillis() - start.getTime()) / 1000D; System.out.println("done. in " + seconds + " seconds\n"); System.out.println("Complete: " + (new java.util.Date()).toString()); } System.out.println("* Starting Benchmark Run *"); MemoryWatcher = new MemoryWatcherThread(); MemoryWatcher.start(); long startTime = System.currentTimeMillis(); for (int i = 0; i < rounds; i++) { oneRound(url, user, password); } long tempTime = System.currentTimeMillis() - startTime; startTime = System.currentTimeMillis(); guardian = connect(url, user, password); checkSums(guardian); connectClose(guardian); System.out.println("Total time: " + tempTime / 1000D + " seconds"); System.out.println( "sum check time: " + (System.currentTimeMillis() - startTime / 1000D) + " seconds"); } catch (Exception E) { System.out.println(E.getMessage()); E.printStackTrace(); } finally { MemoryWatcher.end(); try { MemoryWatcher.join(); if (ShutdownCommand.length() > 0) { guardian = connect(url, user, password); Statement Stmt = guardian.createStatement(); Stmt.execute(ShutdownCommand); Stmt.close(); connectClose(guardian); } } catch (Exception E1) {} // System.exit(0); } } void oneRound(String url, String user, String password) throws InterruptedException, SQLException { Vector vClient = new Vector(); Thread Client = null; Enumeration e = null; Connection guardian = null; // start_time = System.currentTimeMillis(); for (int i = 0; i < n_clients; i++) { if (useStoredProcedure) { Client = new ClientThreadProcedure( n_txn_per_client, url, user, password, Connection.TRANSACTION_READ_COMMITTED); } else { Client = new ClientThread(n_txn_per_client, url, user, password, Connection.TRANSACTION_READ_COMMITTED); } Client.start(); vClient.addElement(Client); } /* ** Barrier to complete this test session */ e = vClient.elements(); while (e.hasMoreElements()) { Client = (Thread) e.nextElement(); Client.join(); } vClient.removeAllElements(); reportDone(); guardian = connect(url, user, password); if (count_results) { checkSums(guardian); } connectClose(guardian); } public void reportDone() { long end_time = System.currentTimeMillis(); double completion_time = ((double) end_time - (double) start_time) / 1000; System.out.println("\n* Benchmark Report *"); System.out.println("\n--------------------"); System.out.println("Time to execute " + transaction_count + " transactions: " + completion_time + " seconds."); System.out.println("Max/Min memory usage: " + (MemoryWatcher.max / 1024) + " / " + (MemoryWatcher.min / 1024) + " kb"); System.out.println(failed_transactions + " / " + transaction_count + " failed to complete."); double rate = (transaction_count - failed_transactions) / completion_time; System.out.println("Transaction rate: " + rate + " txn/sec."); System.out.print((MemoryWatcher.max / 1024) + ";" + (MemoryWatcher.min / 1024) + ";" + failed_transactions + ";" + rate + "\n"); transaction_count = 0; failed_transactions = 0; MemoryWatcher.reset(); } public synchronized void incrementTransactionCount() { transaction_count++; } public synchronized void incrementFailedTransactionCount() { failed_transactions++; } void createDatabase(String url, String user, String password) throws Exception { Connection Conn = connect(url, user, password); String s = Conn.getMetaData().getDatabaseProductName(); System.out.println("DBMS: " + s); try { Conn.setAutoCommit(false); System.out.println("In transaction mode"); } catch (SQLException Etrxn) {} try { int accountsnb = 0; Statement Stmt = Conn.createStatement(); String Query; // // Stmt.execute("SET WRITE_DELAY 1000 MILLIS;"); // Stmt.execute("SET DATABASE DEFAULT TABLE TYPE CACHED"); // Query = "SELECT count(*) "; Query += "FROM accounts"; ResultSet RS = Stmt.executeQuery(Query); Stmt.clearWarnings(); while (RS.next()) { accountsnb = RS.getInt(1); } Conn.commit(); Stmt.close(); if (accountsnb == (naccounts * tps)) { System.out.println("Already initialized"); connectClose(Conn); return; } } catch (Exception E) {} System.out.println("Drop old tables if they exist"); try { Statement Stmt = Conn.createStatement(); String Query; Query = "DROP TABLE history"; Stmt.execute(Query); Stmt.clearWarnings(); Query = "DROP TABLE accounts"; Stmt.execute(Query); Stmt.clearWarnings(); Query = "DROP TABLE tellers"; Stmt.execute(Query); Stmt.clearWarnings(); Query = "DROP TABLE branches"; Stmt.execute(Query); Stmt.clearWarnings(); Conn.commit(); Stmt.close(); } catch (Exception E) {} System.out.println("Creates tables"); try { Statement Stmt = Conn.createStatement(); String Query; Query = "CREATE TABLE branches ( " + "Bid INTEGER NOT NULL PRIMARY KEY, " + "Bbalance INTEGER," + "filler CHAR(88))"; /* pad to 100 bytes */ Stmt.execute(Query); Stmt.clearWarnings(); Query = "CREATE TABLE tellers (" + "Tid INTEGER NOT NULL PRIMARY KEY," + "Bid INTEGER," + "Tbalance INTEGER," + "filler CHAR(84))"; /* pad to 100 bytes */ if (createExtension.length() > 0) { Query += createExtension; } Stmt.execute(Query); Stmt.clearWarnings(); Query = "CREATE TABLE accounts (" + "Aid INTEGER NOT NULL PRIMARY KEY, " + "Bid INTEGER, " + "Abalance INTEGER, " + "filler CHAR(84))"; /* pad to 100 bytes */ if (createExtension.length() > 0) { Query += createExtension; } Stmt.execute(Query); Stmt.clearWarnings(); Query = "CREATE TABLE history (" + "Tid INTEGER, " + "Bid INTEGER, " + "Aid INTEGER, " + "delta INTEGER, " + "tstime TIMESTAMP, " + "filler CHAR(22))"; /* pad to 50 bytes */ Stmt.execute(Query); Stmt.clearWarnings(); Query = "CREATE PROCEDURE UPDATE_PROC(IN paid INT, IN ptid INT, IN pbid INT, IN pdelta INT, OUT pbalance INT) " + "MODIFIES SQL DATA BEGIN ATOMIC " + "DECLARE account CURSOR WITH RETURN FOR SELECT Abalance FROM accounts WHERE Aid = paid;" + "UPDATE accounts SET Abalance = abalance + pdelta WHERE aid = paid;" + "OPEN account;" + "SELECT Abalance INTO pbalance FROM accounts WHERE Aid = paid;" + "UPDATE tellers SET Tbalance = Tbalance + pdelta WHERE Tid = ptid;" + "UPDATE branches SET Bbalance = Bbalance + pdelta WHERE Bid = pbid;" + "INSERT INTO history(Tid, Bid, Aid, delta) VALUES (ptid,pbid,paid,pdelta);" + "END"; try { if (url.contains("hsqldb")) { Stmt.execute(Query); } } catch (SQLException e) { e.printStackTrace(); } /* Stmt.execute("SET TABLE ACCOUNTS SOURCE \"ACCOUNTS.TXT\""); Stmt.execute("SET TABLE BRANCHES SOURCE \"BBRANCHES.TXT\""); Stmt.execute("SET TABLE TELLERS SOURCE \"TELLERS.TXT\""); Stmt.execute("SET TABLE HISTORY SOURCE \"HISTORY.TXT\""); */ Conn.commit(); Stmt.close(); } catch (Exception E) { System.out.println( "Delete elements in table in case Drop didn't work"); } try { Statement Stmt = Conn.createStatement(); String Query; Query = "DELETE FROM history"; Stmt.execute(Query); Stmt.clearWarnings(); Query = "DELETE FROM accounts"; Stmt.execute(Query); Stmt.clearWarnings(); Query = "DELETE FROM tellers"; Stmt.execute(Query); Stmt.clearWarnings(); Query = "DELETE FROM branches"; Stmt.execute(Query); Stmt.clearWarnings(); Conn.commit(); /* prime database using TPC BM B scaling rules. ** Note that for each branch and teller: ** branch_id = teller_id / ntellers ** branch_id = account_id / naccounts */ PreparedStatement pstmt = null; try { Query = "INSERT INTO branches(Bid,Bbalance) VALUES (?,0)"; pstmt = Conn.prepareStatement(Query); } catch (SQLException Epstmt) { pstmt = null; } System.out.println("Insert data in branches table"); for (int i = 0; i < nbranches * tps; i++) { pstmt.setInt(1, i); pstmt.executeUpdate(); pstmt.clearWarnings(); if (i % 100 == 0) { Conn.commit(); } } pstmt.close(); Conn.commit(); Query = "INSERT INTO tellers(Tid,Bid,Tbalance) VALUES (?,?,0)"; pstmt = Conn.prepareStatement(Query); System.out.println("Insert data in tellers table"); for (int i = 0; i < ntellers * tps; i++) { pstmt.setInt(1, i); pstmt.setInt(2, i / ntellers); pstmt.executeUpdate(); pstmt.clearWarnings(); if (i % 100 == 0) { Conn.commit(); } } pstmt.close(); Conn.commit(); Query = "INSERT INTO accounts(Aid,Bid,Abalance) VALUES (?,?,0)"; pstmt = Conn.prepareStatement(Query); System.out.println("Insert data in accounts table"); for (int i = 0; i < naccounts * tps; i++) { pstmt.setInt(1, i); pstmt.setInt(2, i / naccounts); pstmt.executeUpdate(); pstmt.clearWarnings(); if (i % 10000 == 0) { Conn.commit(); } if ((i > 0) && ((i % 100000) == 0)) { System.out.println("\t" + i + "\t records inserted"); } } pstmt.close(); Conn.commit(); System.out.println("\t" + (naccounts * tps) + "\t records inserted"); // for tests if (ShutdownCommand.length() > 0) { Stmt.execute(ShutdownCommand); System.out.println("database shutdown"); } Stmt.close(); } catch (Exception E) { System.out.println(E.getMessage()); E.printStackTrace(); } connectClose(Conn); } /* end of CreateDatabase */ public static int getRandomInt(int lo, int hi) { int ret = 0; ret = (int) (Math.random() * (hi - lo + 1)); ret += lo; return ret; } public static int getRandomID(int type) { int min = 0, max = 0; switch (type) { case TELLER : max = ntellers * tps - 1; break; case BRANCH : max = nbranches * tps - 1; break; case ACCOUNT : max = naccounts * tps - 1; break; } return (getRandomInt(min, max)); } public static Connection connect(String DBUrl, String DBUser, String DBPassword) { try { Connection conn = DriverManager.getConnection(DBUrl, DBUser, DBPassword); return conn; } catch (Exception E) { System.out.println(E.getMessage()); E.printStackTrace(); } return null; } public static void connectClose(Connection c) { if (c == null) { return; } try { c.close(); } catch (Exception E) { System.out.println(E.getMessage()); E.printStackTrace(); } } void checkSums(Connection conn) throws SQLException { Statement st1 = null; ResultSet rs = null; int bbalancesum; int tbalancesum; int abalancesum; int abalancecount; int deltasum; try { st1 = conn.createStatement(); rs = st1.executeQuery("select sum(bbalance) from branches"); rs.next(); bbalancesum = rs.getInt(1); rs.close(); rs = st1.executeQuery("select sum(tbalance) from tellers"); rs.next(); tbalancesum = rs.getInt(1); rs.close(); rs = st1.executeQuery( "select sum(abalance), count(abalance) from accounts"); rs.next(); abalancesum = rs.getInt(1); abalancecount = rs.getInt(2); rs.close(); rs = st1.executeQuery("select sum(delta) from history"); rs.next(); deltasum = rs.getInt(1); rs.close(); rs = null; st1.close(); st1 = null; conn.commit(); if (abalancesum != bbalancesum || bbalancesum != tbalancesum || tbalancesum != deltasum) { System.out.println("sums don't match!"); } else { System.out.println("sums match!"); } System.out.println("AC " + abalancecount + " A " + abalancesum + " B " + bbalancesum + " T " + tbalancesum + " H " + deltasum); } finally { if (st1 != null) { st1.close(); } } } class ClientThread extends Thread { int ntrans = 0; Connection Conn; PreparedStatement pstmt1 = null; PreparedStatement pstmt2 = null; PreparedStatement pstmt3 = null; PreparedStatement pstmt4 = null; PreparedStatement pstmt5 = null; public ClientThread(int number_of_txns, String url, String user, String password, int transactionMode) { System.out.println(number_of_txns); ntrans = number_of_txns; Conn = connect(url, user, password); if (Conn == null) { return; } try { Conn.setAutoCommit(false); Conn.setTransactionIsolation(transactionMode); prepareStatements(); } catch (Exception E) { System.out.println(E.getMessage()); E.printStackTrace(); } } void prepareStatements() throws SQLException { String Query; Query = "UPDATE accounts SET Abalance = Abalance + ? WHERE Aid = ?"; pstmt1 = Conn.prepareStatement(Query); Query = "SELECT Abalance FROM accounts WHERE Aid = ?"; pstmt2 = Conn.prepareStatement(Query); Query = "UPDATE tellers SET Tbalance = Tbalance + ? WHERE Tid = ?"; pstmt3 = Conn.prepareStatement(Query); Query = "UPDATE branches SET Bbalance = Bbalance + ? WHERE Bid = ?"; pstmt4 = Conn.prepareStatement(Query); Query = "INSERT INTO history(Tid, Bid, Aid, delta) VALUES (?,?,?,?)"; pstmt5 = Conn.prepareStatement(Query); } public void run() { int count = ntrans; while (count-- > 0) { int account = TestBench.getRandomID(ACCOUNT); int branch = TestBench.getRandomID(BRANCH); int teller = TestBench.getRandomID(TELLER); int delta = TestBench.getRandomInt(-1000, 1000); doOne(branch, teller, account, delta); incrementTransactionCount(); } /* count = ntrans * 20; try { Conn.setReadOnly(true); while (count-- > 0) { int account = TestBench.getRandomID(ACCOUNT); pstmt2.setInt(1, account); pstmt2.executeQuery(); Conn.commit(); incrementTransactionCount(); } } catch (SQLException e) {} */ try { if (pstmt1 != null) { pstmt1.close(); } if (pstmt2 != null) { pstmt2.close(); } if (pstmt3 != null) { pstmt3.close(); } if (pstmt4 != null) { pstmt4.close(); } if (pstmt5 != null) { pstmt5.close(); } } catch (Exception E) { System.out.println(E.getMessage()); E.printStackTrace(); } connectClose(Conn); Conn = null; } /* ** doOne() - Executes a single TPC BM B transaction. */ int doOne(int bid, int tid, int aid, int delta) { int aBalance = 0; if (Conn == null) { incrementFailedTransactionCount(); return 0; } try { pstmt1.setInt(1, delta); pstmt1.setInt(2, aid); pstmt1.executeUpdate(); pstmt1.clearWarnings(); pstmt2.setInt(1, aid); ResultSet RS = pstmt2.executeQuery(); pstmt2.clearWarnings(); while (RS.next()) { aBalance = RS.getInt(1); } pstmt3.setInt(1, delta); pstmt3.setInt(2, tid); pstmt3.executeUpdate(); pstmt3.clearWarnings(); pstmt4.setInt(1, delta); pstmt4.setInt(2, bid); pstmt4.executeUpdate(); pstmt4.clearWarnings(); pstmt5.setInt(1, tid); pstmt5.setInt(2, bid); pstmt5.setInt(3, aid); pstmt5.setInt(4, delta); pstmt5.executeUpdate(); pstmt5.clearWarnings(); Conn.commit(); return aBalance; } catch (Exception E) { if (verbose) { System.out.println("Transaction failed: " + E.getMessage()); E.printStackTrace(); } incrementFailedTransactionCount(); try { Conn.rollback(); } catch (SQLException E1) {} } return 0; } /* end of DoOne */ } /* end of class ClientThread */ class ClientThreadProcedure extends Thread { int ntrans = 0; Connection Conn; CallableStatement pstmt1 = null; public ClientThreadProcedure(int number_of_txns, String url, String user, String password, int transactionMode) { System.out.println(number_of_txns); ntrans = number_of_txns; Conn = connect(url, user, password); if (Conn == null) { return; } try { Conn.setAutoCommit(false); Conn.setTransactionIsolation(transactionMode); prepareStatements(); } catch (Exception E) { System.out.println(E.getMessage()); E.printStackTrace(); } } void prepareStatements() throws SQLException { String Query; Query = "CALL UPDATE_PROC(?, ?, ?, ?, ?)"; pstmt1 = Conn.prepareCall(Query); } public void run() { int count = ntrans; while (count-- > 0) { int account = TestBench.getRandomID(ACCOUNT); int branch = TestBench.getRandomID(BRANCH); int teller = TestBench.getRandomID(TELLER); int delta = TestBench.getRandomInt(-1000, 1000); doOne(branch, teller, account, delta); incrementTransactionCount(); } try { if (pstmt1 != null) { pstmt1.close(); } } catch (Exception E) { System.out.println(E.getMessage()); E.printStackTrace(); } connectClose(Conn); Conn = null; } /* ** doOne() - Executes a single TPC BM B transaction. */ int doOne(int bid, int tid, int aid, int delta) { int aBalance = 0; if (Conn == null) { incrementFailedTransactionCount(); return 0; } try { pstmt1.setInt(1, aid); pstmt1.setInt(2, tid); pstmt1.setInt(3, bid); pstmt1.setInt(4, delta); pstmt1.execute(); ResultSet rs = pstmt1.getResultSet(); while (rs.next()) { aBalance = rs.getInt(1); } rs.close(); pstmt1.clearWarnings(); Conn.commit(); return aBalance; } catch (Exception E) { if (verbose) { System.out.println("Transaction failed: " + E.getMessage()); E.printStackTrace(); } incrementFailedTransactionCount(); try { Conn.rollback(); } catch (SQLException E1) {} } return 0; } /* end of DoOne */ } /* end of class ClientThread */ class MemoryWatcherThread extends Thread { long min = 0; long max = 0; boolean keep_running = true; public MemoryWatcherThread() { this.reset(); keep_running = true; } public void reset() { System.gc(); long currentFree = Runtime.getRuntime().freeMemory(); long currentAlloc = Runtime.getRuntime().totalMemory(); min = max = (currentAlloc - currentFree); } public void end() { keep_running = false; } public void run() { while (keep_running) { long currentFree = Runtime.getRuntime().freeMemory(); long currentAlloc = Runtime.getRuntime().totalMemory(); long used = currentAlloc - currentFree; if (used < min) { min = used; } if (used > max) { max = used; } try { sleep(100); } catch (InterruptedException E) {} } } } /* end of class MemoryWatcherThread */ } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestLobs.java0000644000175000017500000007512012007547410022324 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.CharArrayReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.sql.Blob; import java.sql.CallableStatement; import java.sql.Clob; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.rowset.serial.SerialBlob; import org.hsqldb.jdbc.JDBCBlob; import org.hsqldb.jdbc.JDBCClob; import org.hsqldb.lib.HsqlByteArrayInputStream; import org.hsqldb.lib.StopWatch; public class TestLobs extends TestBase { Connection connection; Statement statement; public TestLobs(String name) { super(name); // super(name, "jdbc:hsqldb:file:test3", false, false); // super(name, "jdbc:hsqldb:mem:test3", false, false); } protected void setUp() { System.out.println("SetUp (sub-)test: " + getName()); super.setUp(); try { connection = super.newConnection(); statement = connection.createStatement(); } catch (Exception e) { System.out.println(e); } } public void testBlobA() { System.out.println("Starting (sub-)test: " + getName()); try { String ddl0 = "DROP TABLE BLOBTEST IF EXISTS"; String ddl1 = "CREATE TABLE BLOBTEST(ID IDENTITY, BLOBFIELD BLOB(100000))"; statement.execute(ddl0); statement.execute(ddl1); } catch (SQLException e) { e.printStackTrace(); fail("test failure"); } try { String dml0 = "insert into blobtest(blobfield) values(?)"; String dql0 = "select * from blobtest;"; PreparedStatement ps = connection.prepareStatement(dml0); byte[] data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; Blob blob = new JDBCBlob(data); ps.setBlob(1, blob); ps.executeUpdate(); data[4] = 50; blob = new JDBCBlob(data); ps.setBlob(1, blob); ps.executeUpdate(); ps.close(); ps = connection.prepareStatement(dql0); ResultSet rs = ps.executeQuery(); rs.next(); Blob blob1 = rs.getBlob(2); rs.next(); Blob blob2 = rs.getBlob(2); byte[] data1 = blob1.getBytes(1, 10); byte[] data2 = blob2.getBytes(1, 10); assertTrue(data1[4] == 5 && data2[4] == 50); } catch (SQLException e) { e.printStackTrace(); fail("test failure"); } } public void testBlobB() { System.out.println("Starting (sub-)test: " + getName()); ResultSet rs; byte[] ba; byte[] baR1 = new byte[] { (byte) 0xF1, (byte) 0xF2, (byte) 0xF3, (byte) 0xF4, (byte) 0xF5, (byte) 0xF6, (byte) 0xF7, (byte) 0xF8, (byte) 0xF9, (byte) 0xFA, (byte) 0xFB }; byte[] baR2 = new byte[] { (byte) 0xE1, (byte) 0xE2, (byte) 0xE3, (byte) 0xE4, (byte) 0xE5, (byte) 0xE6, (byte) 0xE7, (byte) 0xE8, (byte) 0xE9, (byte) 0xEA, (byte) 0xEB }; try { connection.setAutoCommit(false); Statement st = connection.createStatement(); st.executeUpdate("DROP TABLE blo IF EXISTS"); st.executeUpdate("CREATE TABLE blo (id INTEGER, b blob( 100))"); PreparedStatement ps = connection.prepareStatement( "INSERT INTO blo(id, b) values(2, ?)"); //st.executeUpdate("INSERT INTO blo (id, b) VALUES (1, x'A003')"); ps.setBlob(1, new SerialBlob(baR1)); ps.executeUpdate(); rs = st.executeQuery("SELECT b FROM blo WHERE id = 2"); if (!rs.next()) { assertTrue("No row with id 2", false); } java.sql.Blob blob1 = rs.getBlob("b"); System.out.println("Size of retrieved blob: " + blob1.length()); //System.out.println("Value = (" + rs.getString("b") + ')'); byte[] baOut = blob1.getBytes(1, (int) blob1.length()); if (baOut.length != baR1.length) { assertTrue("Expected array len " + baR1.length + ", got len " + baOut.length, false); } for (int i = 0; i < baOut.length; i++) { if (baOut[i] != baR1[i]) { assertTrue("Expected array len " + baR1.length + ", got len " + baOut.length, false); } } rs.close(); rs = st.executeQuery("SELECT b FROM blo WHERE id = 2"); if (!rs.next()) { assertTrue("No row with id 2", false); } // ba = rs.getBytes("b"); doesn't convert but throws ClassCast blob1 = rs.getBlob("b"); ba = blob1.getBytes(1, baR2.length); if (ba.length != baR2.length) { assertTrue("row2 byte length differs", false); } for (int i = 0; i < ba.length; i++) { if (ba[i] != baR1[i]) { assertTrue("row2 byte " + i + " differs", false); } } rs.close(); connection.rollback(); // again with stream ps.setBinaryStream(1, new HsqlByteArrayInputStream(baR1), baR1.length); ps.executeUpdate(); rs = st.executeQuery("SELECT b FROM blo WHERE id = 2"); if (!rs.next()) { assertTrue("No row with id 2", false); } blob1 = rs.getBlob("b"); System.out.println("Size of retrieved blob: " + blob1.length()); //System.out.println("Value = (" + rs.getString("b") + ')'); baOut = blob1.getBytes(1, (int) blob1.length()); if (baOut.length != baR1.length) { assertTrue("Expected array len " + baR1.length + ", got len " + baOut.length, false); } for (int i = 0; i < baOut.length; i++) { if (baOut[i] != baR1[i]) { assertTrue("Expected array len " + baR1.length + ", got len " + baOut.length, false); } } rs.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); fail("test failure"); } } public void testClobA() { System.out.println("Starting (sub-)test: " + getName()); try { String ddl0 = "DROP TABLE CLOBTEST IF EXISTS"; String ddl1 = "CREATE TABLE CLOBTEST(ID IDENTITY, CLOBFIELD CLOB(100000))"; statement.execute(ddl0); statement.execute(ddl1); } catch (SQLException e) {} try { String dml0 = "insert into clobtest(clobfield) values(?)"; String dql0 = "select * from clobtest;"; PreparedStatement ps = connection.prepareStatement(dml0); String data = "Testing clob insert and select ops"; Clob clob = new JDBCClob(data); ps.setClob(1, clob); ps.executeUpdate(); data = data.replaceFirst("insert", "INSERT"); clob = new JDBCClob(data); ps.setClob(1, clob); ps.executeUpdate(); ps.close(); ps = connection.prepareStatement(dql0); ResultSet rs = ps.executeQuery(); rs.next(); Clob clob1 = rs.getClob(2); rs.next(); Clob clob2 = rs.getClob(2); String string = rs.getString(2); int data1 = clob1.getSubString(1, data.length()).indexOf("insert"); int data2 = clob2.getSubString(1, data.length()).indexOf("INSERT"); assertTrue(data1 == data2 && data1 > 0); } catch (SQLException e) { e.printStackTrace(); fail("test failure"); } } public void testClobB() { System.out.println("Starting (sub-)test: " + getName()); try { String ddl0 = "DROP TABLE CLOBTEST IF EXISTS"; String ddl1 = "CREATE TABLE CLOBTEST(ID IDENTITY, V VARCHAR(10), I INT, CLOBFIELD CLOB(100000))"; statement.execute(ddl0); statement.execute(ddl1); } catch (SQLException e) {} try { String dml0 = "insert into clobtest values(default, ?, ?, ?)"; String dql0 = "select * from clobtest;"; PreparedStatement ps = connection.prepareStatement(dml0); String data = "Testing clob insert and select ops"; Clob clob = new JDBCClob(data); ps.setString(1, "test"); ps.setInt(2, 5); ps.setClob(3, clob); ps.executeUpdate(); data = data.replaceFirst("insert", "INSERT"); clob = new JDBCClob(data); ps.setClob(3, clob); ps.executeUpdate(); PreparedStatement ps2 = connection.prepareStatement(dql0); ResultSet rs = ps2.executeQuery(); rs.next(); Clob clob1 = rs.getClob(4); rs.next(); Clob clob2 = rs.getClob(4); int data1 = clob1.getSubString(1, data.length()).indexOf("insert"); int data2 = clob2.getSubString(1, data.length()).indexOf("INSERT"); assertTrue(data1 == data2 && data1 > 0); // Clob clob3 = new JDBCClob(data); Reader reader = clob3.getCharacterStream(); ps.setCharacterStream(3, reader, (int) clob3.length()); ps.executeUpdate(); // reader = clob2.getCharacterStream(); try { ps.setCharacterStream(3, reader, (int) clob3.length()); ps.executeUpdate(); } catch (SQLException e) {} connection.commit(); } catch (SQLException e) { e.printStackTrace(); fail("test failure"); } } public void testClobC() { System.out.println("Starting (sub-)test: " + getName()); try { String ddl0 = "DROP TABLE VARIABLE IF EXISTS"; String ddl1 = "CREATE TABLE VARIABLE (stateid varchar(128), varid numeric(16,0), " + "scalabilitypassivated char(1) DEFAULT 'N', value clob (2G), scopeguid varchar(128)," + "primary key (stateid, varid, scalabilitypassivated, scopeguid))"; statement.execute(ddl0); statement.execute(ddl1); } catch (SQLException e) {} try { String dml0 = "INSERT INTO VARIABLE VALUES (?, ?, 'N', ?, ?)"; String dml1 = "UPDATE VARIABLE SET value = ? WHERE stateid = ? AND " + "varid = ? AND scalabilitypassivated = 'N' AND scopeguid = ?"; PreparedStatement ps = connection.prepareStatement(dml0); // String resourceFileName = "/org/hsqldb/resources/lob-schema.sql"; InputStreamReader reader = null; try { InputStream fis = getClass().getResourceAsStream(resourceFileName); reader = new InputStreamReader(fis, "ISO-8859-1"); } catch (Exception e) {} ps.setString(1, "test-id-1"); ps.setLong(2, 23456789123456L); ps.setCharacterStream(3, reader, 1000); ps.setString(4, "test-scope-1"); ps.executeUpdate(); try { InputStream fis = getClass().getResourceAsStream(resourceFileName); fis = getClass().getResourceAsStream(resourceFileName); reader = new InputStreamReader(fis, "ISO-8859-1"); for (int i = 0; i < 100; i++) { reader.read(); } } catch (Exception e) {} // ps.setString(1, "test-id-2"); ps.setLong(2, 23456789123457L); ps.setCharacterStream(3, reader, 100); ps.setString(4, "test-scope-2"); ps.addBatch(); ps.setString(1, "test-id-3"); ps.setLong(2, 23456789123458L); ps.setCharacterStream(3, reader, 100); ps.setString(4, "test-scope-3"); ps.addBatch(); int[] results = ps.executeBatch(); // try { InputStream fis = getClass().getResourceAsStream(resourceFileName); fis = getClass().getResourceAsStream(resourceFileName); reader = new InputStreamReader(fis, "ISO-8859-1"); for (int i = 0; i < 100; i++) { reader.read(); } } catch (Exception e) {} ps = connection.prepareStatement(dml1); ps.setCharacterStream(1, reader, 500); ps.setString(2, "test-id-1"); ps.setLong(3, 23456789123456L); ps.setString(4, "test-scope-1"); ps.executeUpdate(); ps.close(); } catch (SQLException e) { e.printStackTrace(); fail("test failure"); } } public void testClobD() { System.out.println("Starting (sub-)test: " + getName()); try { String ddl0 = "DROP TABLE VARIABLE IF EXISTS"; String ddl1 = "CREATE TABLE VARIABLE (stateid varchar(128), varid numeric(16,0), " + "scalabilitypassivated char(1) DEFAULT 'N', value clob(20000), scopeguid varchar(128)," + "primary key (stateid, varid, scalabilitypassivated, scopeguid))"; statement.execute(ddl0); statement.execute(ddl1); } catch (SQLException e) {} try { String dml0 = "INSERT INTO VARIABLE VALUES (?, ?, 'N', ?, ?)"; String dml1 = "UPDATE VARIABLE SET value = ? WHERE stateid = ? AND " + "varid = ? AND scalabilitypassivated = 'N' AND scopeguid = ?"; PreparedStatement ps = connection.prepareStatement(dml0); connection.setAutoCommit(false); // JDBCClob dataClob = new JDBCClob("the quick brown fox jumps on the lazy dog"); Reader reader = null; StopWatch sw = new StopWatch(); sw.start(); for (int i = 0; i < 1000; i++) { reader = dataClob.getCharacterStream(); ps.setString(1, "test-id-1" + i); ps.setLong(2, 23456789123456L + i); ps.setCharacterStream(3, reader, dataClob.length()); ps.setString(4, "test-scope-1" + i); ps.executeUpdate(); connection.commit(); } sw.stop(); System.out.println(sw.elapsedTimeToMessage("Time for inserts")); ps = connection.prepareStatement(dml1); sw.zero(); sw.start(); for (int i = 100; i < 200; i++) { reader = dataClob.getCharacterStream(); ps.setCharacterStream(1, reader, dataClob.length()); ps.setString(2, "test-id-1" + i); ps.setLong(3, 23456789123456L + i); ps.setString(4, "test-scope-1" + i); ps.executeUpdate(); connection.commit(); } connection.commit(); sw.stop(); System.out.println(sw.elapsedTimeToMessage("Time for updates")); } catch (SQLException e) { e.printStackTrace(); fail("test failure"); } } public void testClobE() { System.out.println("Starting (sub-)test: " + getName()); try { String ddl0 = "DROP TABLE VARIABLE IF EXISTS"; String ddl1 = "CREATE TABLE VARIABLE (stateid varchar(128), varid numeric(16,0), " + "scalabilitypassivated char(1) DEFAULT 'N', value clob(2000), scopeguid varchar(128)," + "primary key (stateid, varid, scalabilitypassivated, scopeguid))"; statement.execute(ddl0); statement.execute(ddl1); } catch (SQLException e) { System.out.println(e.getMessage()); } try { String dml0 = "INSERT INTO VARIABLE VALUES (?, ?, 'N', ?, ?)"; String dml1 = "UPDATE VARIABLE SET varid = varid + 1 WHERE stateid = ? AND " + "varid = ? AND scalabilitypassivated = 'N' AND scopeguid = ?"; PreparedStatement ps = connection.prepareStatement(dml0); connection.setAutoCommit(false); // JDBCClob dataClob = new JDBCClob("the quick brown fox jumps on the lazy dog"); Reader reader = null; StopWatch sw = new StopWatch(); sw.start(); for (int i = 0; i < 100; i++) { reader = dataClob.getCharacterStream(); ps.setString(1, "test-id-1" + i); ps.setLong(2, 23456789123456L + i); ps.setCharacterStream(3, reader, dataClob.length()); ps.setString(4, "test-scope-1" + i); ps.executeUpdate(); connection.commit(); } sw.stop(); System.out.println(sw.elapsedTimeToMessage("Time for inserts")); ps = connection.prepareStatement(dml1); sw.zero(); sw.start(); for (int i = 10; i < 20; i++) { ps.setString(1, "test-id-1" + i); ps.setLong(2, 23456789123456L + i); ps.setString(3, "test-scope-1" + i); ps.executeUpdate(); connection.commit(); } connection.commit(); ResultSet rs = statement.executeQuery("SELECT * FROM VARIABLE"); while (rs.next()) { Clob clob = rs.getClob(4); long dataLength = dataClob.length(); long clobLength = clob.length(); assertTrue(dataLength == clobLength); assertTrue( dataClob.getSubString(1, 30).equals( clob.getSubString(1, 30))); } rs = statement.executeQuery( "SELECT CAST(SUBSTRING(VALUE FROM 19) AS VARCHAR(100)),STATEID," + "CHARACTER_LENGTH(VALUE),CAST(VALUE AS VARCHAR(100)) FROM " + "VARIABLE WHERE VALUE='THE QUICK BROWN FOX JUMPS ON THE LAZY DOG'" + "AND STATEID>'TEST-ID-197'"); while (rs.next()) { assertTrue(rs.getString(1).equals("x jumps on the lazy dog")); } sw.stop(); System.out.println(sw.elapsedTimeToMessage("Time for updates")); } catch (SQLException e) { e.printStackTrace(); fail("test failure"); } } public void testClobF() { System.out.println("Starting (sub-)test: " + getName()); try { String ddl0 = "DROP TABLE CLOBTEST IF EXISTS"; String ddl1 = "CREATE TABLE CLOBTEST(ID IDENTITY, CLOBFIELD CLOB(100000))"; statement.execute(ddl0); statement.execute(ddl1); } catch (SQLException e) {} try { String dml0 = "insert into clobtest(clobfield) values ?"; String value = "0123456789"; PreparedStatement ps = connection.prepareStatement(dml0); ps.setString(1, value); ps.executeUpdate(); String dq1 = "select CHARACTER_LENGTH(clobfield) from clobtest;"; ResultSet rs = statement.executeQuery(dq1); rs.next(); int length = rs.getInt(1); assertTrue(value.length() == length); rs.close(); String dq3 = "delete from clobtest;"; statement.execute(dq3); char[] testChars = new char[11111]; for (int i = 0, j = 32; i < testChars.length; i++, j++) { if (j > 255) { j = 32; } testChars[i] = (char) j; } ps.setCharacterStream(1, new CharArrayReader(testChars), testChars.length); ps.executeUpdate(); String dq2 = "select clobfield from clobtest;"; rs = statement.executeQuery(dq2); rs.next(); Reader reader = rs.getCharacterStream(1); char[] newChars = new char[testChars.length]; try { reader.read(newChars); } catch (IOException e) { fail("test failure"); } for (int i = 0; i < testChars.length; i++) { if (testChars[i] != newChars[i]) { fail("test failure"); } } } catch (SQLException e) { e.printStackTrace(); fail("test failure"); } } public void testClobG() { System.out.println("Starting (sub-)test: " + getName()); try { String ddl0 = "DROP TABLE CLOBTEST IF EXISTS"; String ddl1 = "CREATE TABLE CLOBTEST(ID IDENTITY, CLOBFIELD CLOB(100000))"; statement.execute(ddl0); statement.execute(ddl1); } catch (SQLException e) {} try { String dml0 = "insert into clobtest(clobfield) values ?"; String value = "0123456789"; PreparedStatement ps = connection.prepareStatement(dml0); Clob clob = connection.createClob(); clob.setString(1, value); ps.setClob(1, clob); ps.executeUpdate(); String dq1 = "select CHARACTER_LENGTH(clobfield) from clobtest;"; ResultSet rs = statement.executeQuery(dq1); rs.next(); int length = rs.getInt(1); assertTrue(value.length() == length); rs.close(); String dq3 = "delete from clobtest;"; statement.execute(dq3); char[] testChars = new char[11111]; for (int i = 0, j = 32; i < testChars.length; i++, j++) { if (j > 255) { j = 32; } testChars[i] = (char) j; } ps.setCharacterStream(1, new CharArrayReader(testChars), testChars.length); ps.executeUpdate(); String dq2 = "select clobfield from clobtest;"; rs = statement.executeQuery(dq2); rs.next(); Reader reader = rs.getCharacterStream(1); char[] newChars = new char[testChars.length]; try { reader.read(newChars); } catch (IOException e) { fail("test failure"); } for (int i = 0; i < testChars.length; i++) { if (testChars[i] != newChars[i]) { fail("test failure"); } } } catch (SQLException e) { e.printStackTrace(); fail("test failure"); } } public void testClobH() { System.out.println("Starting (sub-)test: " + getName()); try { String ddl1 = "create procedure PUBLIC.PROC_A(out p1 clob, out p2 int) READS SQL DATA BEGIN ATOMIC SET p1 = 'dafsdfasdfaefafeajfiwejifpjajsidojfakmvkamsdjfadpsjfoajsdifjaos'; SET p2 = 0; end"; String dml0 = "call PUBLIC.PROC_A(?, ?)"; statement.execute(ddl1); CallableStatement ps = connection.prepareCall(dml0); ps.registerOutParameter(1, java.sql.Types.CLOB); ps.registerOutParameter(2, java.sql.Types.INTEGER); ps.execute(); String string = ps.getClob(1).getSubString(1, 10); System.out.println(string); } catch (SQLException e) { e.printStackTrace(); } } public void testBlobH() { System.out.println("Starting (sub-)test: " + getName()); try { String ddl1 = "DROP TABLE BLOBTEST IF EXISTS"; String ddl2 = "CREATE TABLE BLOBTEST(A INTEGER, B BLOB)"; statement.execute(ddl1); statement.execute(ddl2); } catch (SQLException e) {} try { String dml0 = "insert into blobtest values(1, ?)"; String dql0 = "select * from blobtest"; PreparedStatement ps = connection.prepareStatement(dml0); byte[] data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; connection.setAutoCommit(false); Blob blob = connection.createBlob(); blob.setBytes(1, data); ps.setBlob(1, blob); ps.executeUpdate(); data[4] = 50; blob = new JDBCBlob(data); ps.setBlob(1, blob); ps.executeUpdate(); ps.close(); connection.commit(); ps = connection.prepareStatement(dql0); ResultSet rs = ps.executeQuery(); rs.next(); Blob blob1 = rs.getBlob(2); rs.next(); Blob blob2 = rs.getBlob(2); byte[] data1 = blob1.getBytes(1, 10); byte[] data2 = blob2.getBytes(1, 10); assertTrue(data1[4] == 5 && data2[4] == 50); } catch (SQLException e) { e.printStackTrace(); fail("test failure"); } } public void testBlobI() { System.out.println("Starting (sub-)test: " + getName()); try { Statement st = connection.createStatement(); st.executeUpdate("drop table BLOBTEST if exists"); st.executeUpdate("create table BLOBTEST (BT_BLOB BLOB)"); System.out.println("Running insert..."); PreparedStatement insert = connection.prepareStatement("insert into BLOBTEST values(?)"); insert.setBytes(1, new byte[]{}); insert.executeUpdate(); System.out.println("Running update..."); PreparedStatement update = connection.prepareStatement( "update BLOBTEST set BT_BLOB = CONCAT(BT_BLOB,?)"); update.setBytes(1, new byte[] { 1, 2, 3 }); update.executeUpdate(); System.out.println("Running select..."); PreparedStatement select = connection.prepareStatement("select BT_BLOB from BLOBTEST"); ResultSet result = select.executeQuery(); System.out.println("Results: " + result.getFetchSize()); while (result.next()) { byte[] data = result.getBytes(1); System.out.println("Result: " + data == null ? "null" : data.length); } } catch (SQLException e) { e.printStackTrace(); fail("test failure"); } } /* public static void main(String[] args) throws SQLException { Connection con = null; PreparedStatement st = null; ResultSet rs = null; try { DriverManager.registerDriver(new org.hsqldb.jdbc.JDBCDriver()); con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:7001", "sa", null); // con = DriverManager.getConnection("jdbc:hsqldb:mem:mymemdb", "sa", null); // con.createStatement().execute("drop table aaa"); con.createStatement().execute("create table aaa (a integer, b blob)"); String insert = "insert into aaa values (1, ?)"; st = con.prepareStatement(insert); byte[] b = {0, 1}; Blob blob = con.createBlob(); blob.setBytes(1, b); st.setBlob(1, blob); // this does not work too !!! // st.setBytes(1, b); System.out.println("execute"); st.execute(); System.out.println("execute end"); con.commit(); System.out.println("commit"); con.createStatement().execute("shutdown script"); } catch (SQLException e) { e.printStackTrace(); } finally { if (st != null) { st.close(); } if (con != null) { con.close(); } } } */ protected void tearDown() { System.out.println("TearDown (sub-)test: " + getName()); try { statement = connection.createStatement(); statement.execute("SHUTDOWN"); statement.close(); if (!isNetwork) { connection.close(); } } catch (Exception e) {} super.tearDown(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestViewAsterisks.java0000644000175000017500000005675312007547410024243 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import org.hsqldb.error.ErrorCode; import junit.framework.AssertionFailedError; /** * is a test which verifies the functionality of replacing asterisks in VIEW statements with column * lists. * * During investigating http://www.openoffice.org/issues/show_bug.cgi?id=78296 (an issue raised * in OpenOffice.org, which integrates HSQLDB), it rose that views did not behave to the standard * in that they don't always reflect the table column list at the time of creation of the view. * * This was changed so that when you CREATE a VIEW, then any asterisks in the constituting * statement are replaced with their column lists. * * This test verifies this functionality in a number of different flavours. * * @author frank.schoenheit@sun.com */ public class TestViewAsterisks extends TestBase { java.sql.Statement m_statement; java.sql.Connection m_connection; /** Creates a new instance of TestViewAsterisks */ public TestViewAsterisks(String testName) { super(testName, null, false, false); } /** * creates the database tables needed for the test */ private void setupDatabase() { try { m_connection = newConnection(); m_statement = m_connection.createStatement(); executeStatement("DROP TABLE ABC IF EXISTS CASCADE"); executeStatement("DROP TABLE TABLE_A IF EXISTS CASCADE"); executeStatement("DROP TABLE TABLE_B IF EXISTS CASCADE"); executeStatement("DROP VIEW V1 IF EXISTS CASCADE"); // V1 is created by a previous test case executeStatement( "CREATE TABLE ABC (ID INTEGER NOT NULL PRIMARY KEY, A VARCHAR(50), B VARCHAR(50), C VARCHAR(50))"); executeStatement("INSERT INTO ABC VALUES (1, 'a', 'b', 'c')"); executeStatement("INSERT INTO ABC VALUES (2, 'd', 'e', 'f')"); executeStatement( "CREATE TABLE TABLE_A (ID_A INTEGER NOT NULL PRIMARY KEY, NAME_A VARCHAR(50))"); executeStatement("INSERT INTO TABLE_A VALUES (1, 'first A')"); executeStatement("INSERT INTO TABLE_A VALUES (2, 'second A')"); executeStatement( "CREATE TABLE TABLE_B (ID_B INTEGER NOT NULL PRIMARY KEY, NAME_B VARCHAR(50))"); executeStatement("INSERT INTO TABLE_B VALUES (1, 'first B')"); executeStatement("INSERT INTO TABLE_B VALUES (2, 'second B')"); } catch (SQLException ex) { fail(ex.toString()); } } public void setUp() { super.setUp(); setupDatabase(); } protected void tearDown() { executeStatement("SHUTDOWN"); super.tearDown(); } /** * executes a given m_statement * *

                  Basically, this method calls m_statement.execute(sql), * but wraps any SQLExceptions into a JUnit error. */ private void executeStatement(String sql) { executeStatement(sql, 0); } private void executeStatement(String sql, int expectedVendorCode) { try { m_statement.execute(sql); assertTrue( "executing\n " + sql + "\nwas expected to fail, but it didn't", expectedVendorCode == 0); } catch (SQLException ex) { if (expectedVendorCode == 0) { fail(ex.toString()); } assertEquals( "executing\n " + sql + "\ndid not result in the expected error", expectedVendorCode, -ex .getErrorCode()); } } /** * creates a view with the given name, the given constituting statement, and an optional column list * * @param viewName * specifies the name of the view to create * @param columnList * list of names of the columns of the view, will be specified in the CREATE VIEW statement. Might be null. * @param viewStatement * the statement of the view */ private void createView(String viewName, String[] columnList, String viewStatement) throws SQLException { StringBuffer colList = new StringBuffer(); if (columnList != null) { colList.append(" ("); for (int i = 0; i < columnList.length; ++i) { colList.append('"').append(columnList[i]).append('"'); if (i < columnList.length - 1) { colList.append(','); } } colList.append(")"); } executeStatement("CREATE VIEW " + viewName + colList.toString() + " AS " + viewStatement); if (columnList != null) { ensureTableColumns(viewName, columnList); } } /** * retrieves the statement which defines a given view */ private String getViewStatement(String viewName) throws SQLException { ResultSet res = m_statement.executeQuery( "SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = '" + viewName + "'"); res.next(); String statement = res.getString(1); return statement; } /** * ensures two tables (or views, that is) have the same content */ private void ensureEqualContent(String tableNameLHS, String tableNameRHS) throws SQLException { ResultSet lhs = m_statement.executeQuery("SELECT * FROM \"" + tableNameLHS + "\""); ResultSet rhs = m_statement.executeQuery("SELECT * FROM \"" + tableNameRHS + "\""); ResultSetMetaData meta = lhs.getMetaData(); while (lhs.next() && rhs.next()) { for (int col = 1; col <= meta.getColumnCount(); ++col) { assertEquals("table content does not match: cp. " + tableNameLHS + "-" + tableNameRHS + ", row " + lhs.getRow() + ", col " + col, lhs.getObject(col), rhs.getObject(col)); } } // lhs should be after last, rhs still on last assertTrue("row count does not match: " + tableNameLHS + "-" + tableNameRHS, lhs.isAfterLast() && rhs.isLast()); } /** * ensures the content of a given table matches a given object array's content */ private void ensureTableContent(String tableName, Object[][] tableData) throws SQLException { ResultSet lhs = m_statement.executeQuery("SELECT * FROM \"" + tableName + "\""); ResultSetMetaData meta = lhs.getMetaData(); int colCount = meta.getColumnCount(); while (lhs.next()) { int row = lhs.getRow(); assertEquals(colCount, tableData[row - 1].length); for (int col = 1; col <= colCount; ++col) { assertEquals( "unexpected table content in " + tableName + " (row " + row + ", col " + col + ")", tableData[row - 1][col - 1], lhs.getObject(col)); } } } /** * creates a view with a given name and statement, ensures that it's statement is translated as expected, and ensures * that the content of the view is as expected * * @param viewName * the name of the to-be-created view * @param columnNames * the names of the columns of the view, as to be specified in the CREATE VIEW statement. Might be null, * in this case the view will be created without an explicit column list * @param viewStatement * the statement of the to-be-created view * @param expectedTranslatedStatement * the expected statement of the view, after it has been implicitly translated by HSQL. If the actual * statement after creation does not match this expected statement, this is a failure condition which * results in a AssertionFailedError being thrown. * @param expectedContent * the expected content of the view. If this is null, it is ignored. Else, if it is a * string, it is interpreted as name of the table which must have the same content as a view. If * it's no string either, it must be a two-dimensional Object array specifying the expected content. */ private void checkViewTranslationAndContent(String viewName, String[] columnList, String viewStatement, String expectedTranslatedStatement, Object expectedContent) throws SQLException { createView(viewName, columnList, viewStatement); String actualTranslatedStatement = getViewStatement(viewName); if (!actualTranslatedStatement.equals(expectedTranslatedStatement)) { StringBuffer message = new StringBuffer(); message.append(viewName).append( "'s statement not translated as expected\n"); message.append("original statement:\n ").append( viewStatement).append('\n'); message.append("expected translated statement:\n ").append( expectedTranslatedStatement).append('\n'); message.append("actual translated statement:\n ").append( actualTranslatedStatement).append('\n'); throw new AssertionFailedError(message.toString()); } if (expectedContent instanceof Object[][]) { ensureTableContent(viewName, (Object[][]) expectedContent); } } /** * ensures that a given table has columns with a given name */ private void ensureTableColumns(String tableName, String[] columnNames) throws SQLException { ResultSet res = m_connection.getMetaData().getColumns(null, null, tableName, "%"); while (res.next()) { assertEquals( "unexpected column name in table \"" + tableName + "\" at position " + (res.getRow() - 1), res.getString( "COLUMN_NAME"), columnNames[res.getRow() - 1]); } res.previous(); assertEquals("not enough columns in table \"" + tableName + "\"", columnNames.length, res.getRow()); } /** * checks views selecting an asterisk from a table, in different flavours */ private void checkSimpleViews() throws SQLException { // ................................................................ // SELECT * checkViewTranslationAndContent( "S1", null, "SELECT * FROM ABC", "SELECT PUBLIC.ABC.ID,PUBLIC.ABC.A,PUBLIC.ABC.B,PUBLIC.ABC.C FROM PUBLIC.ABC", "ABC"); // adding a column to "ABC" should succeed, and still leave the view with the columns // before the addition executeStatement("ALTER TABLE ABC ADD COLUMN D VARCHAR(50)"); ensureTableColumns("ABC", new String[] { "ID", "A", "B", "C", "D" }); ensureTableColumns("S1", new String[] { "ID", "A", "B", "C" }); // dropping the column which is not part of the view should be possible executeStatement("ALTER TABLE ABC DROP COLUMN D"); // dropping another column which *is* part of the view shouldn't executeStatement("ALTER TABLE ABC DROP COLUMN C", ErrorCode.X_42536); // finally, dropping the column with CASCADE should work, and also drop the view //executeStatement("ALTER TABLE ABC DROP COLUMN C CASCADE"); // DROP COLUMN c CASCADE not implemented, yet // ................................................................ // same as S1, but this time add a LIMIT clause to the statement checkViewTranslationAndContent( "S2", null, "SELECT LIMIT 0 2 * FROM ABC ORDER BY ID", "SELECT LIMIT 0 2 PUBLIC.ABC.ID,PUBLIC.ABC.A,PUBLIC.ABC.B,PUBLIC.ABC.C FROM PUBLIC.ABC ORDER BY ID", "ABC"); // ................................................................ // same as S1, but this time add a TOP clause to the statement checkViewTranslationAndContent( "S3", null, "SELECT TOP 2 * FROM ABC ORDER BY ID", "SELECT TOP 2 PUBLIC.ABC.ID,PUBLIC.ABC.A,PUBLIC.ABC.B,PUBLIC.ABC.C FROM PUBLIC.ABC ORDER BY ID", "ABC"); // ................................................................ // same as S1, but this time add a DISTINCT clause to the statement checkViewTranslationAndContent( "S4", null, "SELECT DISTINCT * FROM ABC", "SELECT DISTINCT PUBLIC.ABC.ID,PUBLIC.ABC.A,PUBLIC.ABC.B,PUBLIC.ABC.C FROM PUBLIC.ABC", "ABC"); // ................................................................ // same as S1, but this time qualifying the asterisk checkViewTranslationAndContent( "S5", null, "SELECT ABC.* FROM ABC", "SELECT PUBLIC.ABC.ID,PUBLIC.ABC.A,PUBLIC.ABC.B,PUBLIC.ABC.C FROM PUBLIC.ABC", "ABC"); // ................................................................ // same as S5, but this time also giving the table an alias checkViewTranslationAndContent( "S6", null, "SELECT \"A\".* FROM ABC AS A", "SELECT A.ID,A.A,A.B,A.C FROM PUBLIC.ABC AS A", "ABC"); // ................................................................ // same as S1, but bracket the SELECT definition checkViewTranslationAndContent( "S7", null, "( SELECT * FROM ABC )", "(SELECT PUBLIC.ABC.ID,PUBLIC.ABC.A,PUBLIC.ABC.B,PUBLIC.ABC.C FROM PUBLIC.ABC)", "ABC"); } /** * checks views selecting an asterisk plus existing columns */ private void checkAsterisksCombined() throws SQLException { // ................................................................ checkViewTranslationAndContent( "C1", null, "SELECT * AS \"a2\" FROM ABC", "SELECT PUBLIC.ABC.ID,PUBLIC.ABC.A,PUBLIC.ABC.B,PUBLIC.ABC.C AS \"a2\" FROM PUBLIC.ABC", new Object[][] { new Object[] { new Integer(1), "a", "b", "c" }, new Object[] { new Integer(2), "d", "e", "f" } }); // ................................................................ checkViewTranslationAndContent( "C2", null, "SELECT B AS \"b2\", ABC.* FROM ABC", "SELECT B AS \"b2\", PUBLIC.ABC.ID,PUBLIC.ABC.A,PUBLIC.ABC.B,PUBLIC.ABC.C FROM PUBLIC.ABC", new Object[][] { new Object[] { "b", new Integer(1), "a", "b", "c" }, new Object[] { "e", new Integer(2), "d", "e", "f" } }); } /** * checks views selecting asterisks from multiple tables */ private void checkMultipleTables() throws SQLException { // ................................................................ checkViewTranslationAndContent( "M1", null, "SELECT * FROM TABLE_A, TABLE_B", "SELECT PUBLIC.TABLE_A.ID_A,PUBLIC.TABLE_A.NAME_A,PUBLIC.TABLE_B.ID_B,PUBLIC.TABLE_B.NAME_B FROM PUBLIC.TABLE_A,PUBLIC.TABLE_B", new Object[][] { new Object[] { new Integer(1), "first A", new Integer(1), "first B" }, new Object[] { new Integer(1), "first A", new Integer(2), "second B" }, new Object[] { new Integer(2), "second A", new Integer(1), "first B" }, new Object[] { new Integer(2), "second A", new Integer(2), "second B" } }); // ................................................................ checkViewTranslationAndContent( "M2", null, "SELECT TABLE_B.*, TABLE_A.* FROM TABLE_A, TABLE_B", "SELECT PUBLIC.TABLE_B.ID_B,PUBLIC.TABLE_B.NAME_B , PUBLIC.TABLE_A.ID_A,PUBLIC.TABLE_A.NAME_A FROM PUBLIC.TABLE_A,PUBLIC.TABLE_B", new Object[][] { new Object[] { new Integer(1), "first B", new Integer(1), "first A" }, new Object[] { new Integer(2), "second B", new Integer(1), "first A" }, new Object[] { new Integer(1), "first B", new Integer(2), "second A" }, new Object[] { new Integer(2), "second B", new Integer(2), "second A" } }); // ................................................................ checkViewTranslationAndContent( "M3", null, "SELECT \"TABLE_A\".* FROM TABLE_A, TABLE_B", "SELECT PUBLIC.TABLE_A.ID_A,PUBLIC.TABLE_A.NAME_A FROM PUBLIC.TABLE_A,PUBLIC.TABLE_B", new Object[][] { new Object[] { new Integer(1), "first A" }, new Object[] { new Integer(1), "first A" }, new Object[] { new Integer(2), "second A" }, new Object[] { new Integer(2), "second A" } }); } /** * checks views selecting from sub selects */ private void checkSubSelects() throws SQLException { // ................................................................ checkViewTranslationAndContent( "Q1", null, "SELECT * FROM ( SELECT * FROM ABC )", "SELECT ID,A,B,C FROM(SELECT PUBLIC.ABC.ID,PUBLIC.ABC.A,PUBLIC.ABC.B,PUBLIC.ABC.C FROM PUBLIC.ABC)", null); // ................................................................ checkViewTranslationAndContent( "Q2", null, "SELECT * FROM ( SELECT * FROM TABLE_A ), ( SELECT * FROM TABLE_B )", "SELECT ID_A,NAME_A,ID_B,NAME_B FROM(SELECT PUBLIC.TABLE_A.ID_A,PUBLIC.TABLE_A.NAME_A FROM PUBLIC.TABLE_A),(SELECT PUBLIC.TABLE_B.ID_B,PUBLIC.TABLE_B.NAME_B FROM PUBLIC.TABLE_B)", null); // ................................................................ checkViewTranslationAndContent( "Q3", null, "SELECT A.* FROM ( SELECT * FROM TABLE_A ) AS A", "SELECT A.ID_A,A.NAME_A FROM(SELECT PUBLIC.TABLE_A.ID_A,PUBLIC.TABLE_A.NAME_A FROM PUBLIC.TABLE_A)AS A", null); // ................................................................ checkViewTranslationAndContent( "Q4", null, "SELECT A.*, B.* FROM ( SELECT * FROM TABLE_A ) AS A, ( SELECT * FROM TABLE_B ) AS B", "SELECT A.ID_A,A.NAME_A , B.ID_B,B.NAME_B FROM(SELECT PUBLIC.TABLE_A.ID_A,PUBLIC.TABLE_A.NAME_A FROM PUBLIC.TABLE_A)AS A,(SELECT PUBLIC.TABLE_B.ID_B,PUBLIC.TABLE_B.NAME_B FROM PUBLIC.TABLE_B)AS B", null); } /** * checks views which are defined using a column list */ private void checkColumnLists() throws SQLException { // just to ensure the column count handling is as expected, else below tests might be useless executeStatement("CREATE VIEW IMPOSSIBLE (\"A\") AS SELECT * FROM ABC", ErrorCode.X_42593); // ................................................................ // not that it should make any difference to S1, but who knows checkViewTranslationAndContent("L1", new String[] { "C1", "C2", "C3", "C4" }, "SELECT * FROM ABC", "SELECT PUBLIC.ABC.ID,PUBLIC.ABC.A,PUBLIC.ABC.B,PUBLIC.ABC.C FROM PUBLIC.ABC", "ABC"); } /** * checks views based on other views */ private void checkViewsOnViews() throws SQLException { // ................................................................ // not that it should make any difference whether we SELECT FROM a table or view, but who knows checkViewTranslationAndContent( "V1", null, "SELECT * FROM S1", "SELECT PUBLIC.S1.ID,PUBLIC.S1.A,PUBLIC.S1.B,PUBLIC.S1.C FROM PUBLIC.S1", "L1"); } /** * checks views based on a UNION statement */ private void checkUnionViews() throws SQLException { checkViewTranslationAndContent( "U1", null, "SELECT * FROM TABLE_A UNION SELECT * FROM TABLE_B", "SELECT PUBLIC.TABLE_A.ID_A,PUBLIC.TABLE_A.NAME_A FROM PUBLIC.TABLE_A UNION SELECT PUBLIC.TABLE_B.ID_B,PUBLIC.TABLE_B.NAME_B FROM PUBLIC.TABLE_B", new Object[][] { new Object[] { new Integer(1), "first A" }, new Object[] { new Integer(1), "first B" }, new Object[] { new Integer(2), "second A" }, new Object[] { new Integer(2), "second B" } }); checkViewTranslationAndContent( "U2", null, "SELECT * FROM ( SELECT * FROM TABLE_A UNION SELECT * FROM TABLE_B )", "SELECT ID_A,NAME_A FROM(SELECT PUBLIC.TABLE_A.ID_A,PUBLIC.TABLE_A.NAME_A FROM PUBLIC.TABLE_A UNION SELECT PUBLIC.TABLE_B.ID_B,PUBLIC.TABLE_B.NAME_B FROM PUBLIC.TABLE_B)", new Object[][] { new Object[] { new Integer(1), "first A" }, new Object[] { new Integer(1), "first B" }, new Object[] { new Integer(2), "second A" }, new Object[] { new Integer(2), "second B" } }); } /** * main test method of this class */ public void test() { try { checkSimpleViews(); checkAsterisksCombined(); checkMultipleTables(); checkSubSelects(); checkColumnLists(); checkViewsOnViews(); checkUnionViews(); } catch (SQLException ex) { fail(ex.toString()); } } /** * entry point to run the test directly */ public static void main(String[] argv) { runWithResult(TestViewAsterisks.class, "test"); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/AllTests.java0000644000175000017500000001040212007547410022310 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class AllTests extends TestCase { public AllTests(String s) { super(s); } public static Test suite() { TestSuite suite = new TestSuite(); //suite.addTestSuite(org.hsqldb.test.TestHTTPKeepAlive.class); suite.addTestSuite(org.hsqldb.test.TestBatchExecution.class); suite.addTestSuite(org.hsqldb.test.TestBug1191815.class); suite.addTestSuite(org.hsqldb.test.TestBug778213.class); suite.addTestSuite(org.hsqldb.test.TestBug785429.class); suite.addTestSuite(org.hsqldb.test.TestBug808460.class); suite.addTestSuite(org.hsqldb.test.TestCollation.class); suite.addTestSuite(org.hsqldb.test.TestDatabaseMetaData.class); suite.addTestSuite(org.hsqldb.test.TestDateTime.class); suite.addTestSuite(org.hsqldb.test .TestINPredicateParameterizationAndCorrelation.class); suite.addTestSuite(org.hsqldb.test.TestJDBCGeneratedColumns.class); suite.addTestSuite( org.hsqldb.test.TestLikePredicateOptimizations.class); suite.addTestSuite(org.hsqldb.test.TestLobs.class); suite.addTestSuite(org.hsqldb.test.TestMerge.class); suite.addTestSuite(org.hsqldb.test.TestMultiInsert.class); suite.addTestSuite(org.hsqldb.test.TestSql.class); suite.addTestSuite(org.hsqldb.test.TestStoredProcedure.class); suite.addTestSuite(org.hsqldb.test.TestTextTable.class); suite.addTestSuite(org.hsqldb.test.TestTextTables.class); suite.addTestSuite(org.hsqldb.test.TestViewAsterisks.class); suite.addTestSuite(org.hsqldb.test.TestUpdatableResults.class); suite.addTestSuite(org.hsqldb.test.TestUpdatableResultSets.class); suite.addTestSuite(org.hsqldb.test.TestTriggers.class); // Suites that extend TestCase suite.addTestSuite(org.hsqldb.test.TestJDBCSavepoints.class); suite.addTestSuite(org.hsqldb.test.TestPreparedStatements.class); suite.addTestSuite(org.hsqldb.test.TestPreparedSubQueries.class); suite.addTestSuite(org.hsqldb.test.TestSubselect.class); suite.addTestSuite(org.hsqldb.test.TestCascade.class); suite.addTestSuite(org.hsqldb.test.TestDataStructures.class); // 1 Failure Sometimes hangs (Turned off by Fred) suite.addTestSuite(org.hsqldb.test.TestGroupByHaving.class); suite.addTestSuite(org.hsqldb.test.TestSqlPersistent.class); // Sometimes hangs on Connection.close after SHUTDOWN problem return suite; } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestPreparedStatements.java0000644000175000017500000002002512007547410025231 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Statement; import junit.framework.TestCase; import java.sql.ResultSet; /** * @author fredt@users */ public class TestPreparedStatements extends TestCase { private Connection con = null; private class sqlStmt { boolean prepare; boolean update; String command; Object[] args; Object ret; sqlStmt(String c) { command = c; prepare = false; update = false; } sqlStmt(String c, boolean p, boolean u, Object[] a) { command = c; prepare = p; update = u; args = a; } sqlStmt(String c, boolean p, boolean u, Object[] a, Object r) { command = c; prepare = p; update = u; args = a; ret = r; } } private sqlStmt[] stmtArray = { new sqlStmt("drop table public.ivtest if exists cascade"), new sqlStmt( "create cached table ivtest(interval1 INTERVAL YEAR TO MONTH," + " interval2 INTERVAL DAY TO SECOND(3))"), new sqlStmt("drop table public.dttest if exists cascade"), new sqlStmt("create cached table dttest(adate date not null, " + "atime time not null,bg int, primary key(adate,atime))"), new sqlStmt( "insert into dttest values(current_date - 10 day, current_time + 1 hour, 1)", false, true, null), new sqlStmt( "insert into dttest values(current_date - 8 day, current_time - 5 hour, 2)", false, true, null), new sqlStmt( "insert into dttest values(current_date - 7 day, current_time - 4 hour, 3)", false, true, null), new sqlStmt("insert into dttest values(current_date, '12:44:31', 4)", false, true, null), new sqlStmt( "insert into dttest values(current_date + 3 day, current_time - 12 hour, 5)", false, true, null), new sqlStmt("insert into dttest values(current_date + 1 day, current_time - 1 hour, 6)", false, true, null), new sqlStmt("select atime adate from dttest where atime = ? and adate = ?", true, false, new Object[] { "12:44:31", new java.sql.Date(System.currentTimeMillis()) }), new sqlStmt("insert into ivtest values ?, ?", true, true, new Object[] { "1-10", "10 02:15:30.333" }), new sqlStmt( "insert into ivtest values CAST (? AS INTERVAL YEAR TO MONTH), CAST (? AS INTERVAL DAY TO SECOND)", true, true, new Object[] { "1-10", "10 02:15:30.333" }), new sqlStmt("script", true, false, null), new sqlStmt("drop table public.bintest if exists cascade"), new sqlStmt("create cached table bintest(val BIGINT, id BINARY(100))"), new sqlStmt("insert into bintest values ?, ?", true, true, new Object[] { 10L, new byte[] { 1, 2, 3, 4, 5 } }), new sqlStmt("select val from bintest where id = ?", true, false, new Object[]{ new byte[] { 1, 2, 3, 4, 5 } }, 10L), }; public TestPreparedStatements(String name) { super(name); } protected void setUp() { String url = "jdbc:hsqldb:test"; try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); con = java.sql.DriverManager.getConnection(url, "sa", ""); } catch (Exception e) {} } public void testA() { int i = 0; try { for (i = 0; i < stmtArray.length; i++) { int j; System.out.println(" -- #" + i + " ----------------------- "); if (stmtArray[i].prepare) { Object[] stmtArgs = stmtArray[i].args; PreparedStatement ps = null; System.out.println(" -- preparing\n<<<\n" + stmtArray[i].command + "\n>>>\n"); ps = con.prepareStatement(stmtArray[i].command); if (stmtArgs != null) { System.out.print(" -- setting " + stmtArgs.length + " Args ["); for (j = 0; j < stmtArgs.length; j++) { System.out.print((j > 0 ? "; " : "") + stmtArgs[j]); ps.setObject(j + 1, stmtArgs[j]); } System.out.println("]"); } System.out.println(" -- executing "); if (stmtArray[i].update) { int r = ps.executeUpdate(); System.out.println(" ***** ps.executeUpdate gave me " + r); } else { boolean b = ps.execute(); int count = 0; if (b) { ResultSet rs = ps.getResultSet(); while (rs.next()) { if (count == 0 && stmtArray[i].ret != null) { super.assertEquals(stmtArray[i].ret, rs.getObject(1)); } count++; } System.out.print( " ***** ps.execute returned result row count " + count); } else { System.out.print(" ***** ps.execute gave me " + b); } } } else { System.out.println(" -- executing directly\n<<<\n" + stmtArray[i].command + "\n>>>\n"); Statement s = con.createStatement(); boolean b = s.execute(stmtArray[i].command); System.out.println(" ***** st.execute gave me " + b); } } } catch (Exception e) { System.out.println(i + " ?? Caught Exception " + e); super.fail(); } assertTrue(true); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestDataStructures.java0000644000175000017500000004052612007547410024404 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.util.ArrayList; import java.util.Enumeration; import java.util.Random; import java.util.Vector; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.HsqlDeque; import org.hsqldb.lib.HsqlList; import org.hsqldb.lib.StopWatch; import junit.framework.TestCase; /** * Randomly excutes methods on the HsqlList data structures and compares the * results with equivalent calls on the java vector class. * * @author dnordahl@users */ public class TestDataStructures extends TestCase { private static final int NUMBER_OF_TEST_RUNS = 100000; private static final int NUMBER_OF_ITERATIONS_PER_RUN = 80; private Random randomGenerator; //Commands private static final int ADD = 1; private static final int ADD_AT = 2; private static final int GET = 3; private static final int REMOVE = 4; private static final int SET = 5; private static final int OPTIMIZE = 6; private static final int REMOVE_ALL = 7; private Vector listCommandsCalled; /** Creates a new instance of TestDataStructures */ public TestDataStructures(String s) { super(s); randomGenerator = new Random(System.currentTimeMillis()); listCommandsCalled = new Vector(NUMBER_OF_ITERATIONS_PER_RUN); } /** Runs a test on the hsqldb lists */ public void testLists() { HsqlArrayList arrayList = new HsqlArrayList(); HsqlDeque deque = new HsqlDeque(); Vector vector = new Vector(); Vector listCommandsCalled = new Vector(NUMBER_OF_ITERATIONS_PER_RUN); Integer tempInt = null; int tempCommandCode; int tempPosition; boolean arrayListException = false; boolean dequeException = false; boolean vectorException = false; Object arrayListObject = null; Object linkedListObject = null; Object vectorObject = null; for (int i = 0; i < getRandomInt(3, 12); i++) { // prime the contents with a couple items tempInt = getRandomInteger(); arrayList.add(tempInt); deque.add(tempInt); vector.addElement(tempInt); listCommandsCalled.addElement("Add"); } compareLists(arrayList, deque, vector); for (int j = 0; j < NUMBER_OF_ITERATIONS_PER_RUN; j++) { tempCommandCode = getRandomInt(0, 15); // 0 and 8 are ignored or used for a special op switch (tempCommandCode) { case ADD : tempInt = getRandomInteger(); listCommandsCalled.addElement("Add"); arrayList.add(tempInt); deque.add(tempInt); vector.addElement(tempInt); break; case ADD_AT : tempInt = getRandomInteger(); tempPosition = getRandomInt(0, vector.size()); listCommandsCalled.addElement("Add at " + tempPosition); try { arrayList.add(tempPosition, tempInt); } catch (Exception ex) { arrayListException = true; } try { deque.add(tempPosition, tempInt); } catch (Exception ex) { dequeException = true; } try { vector.insertElementAt(tempInt, tempPosition); } catch (Exception ex) { vectorException = true; } compareLists(arrayList, deque, vector); break; case GET : tempPosition = getRandomInt(0, vector.size() - 1); listCommandsCalled.addElement("Get " + tempPosition); try { arrayListObject = arrayList.get(tempPosition); } catch (Exception ex) { arrayListException = true; } try { linkedListObject = deque.get(tempPosition); } catch (Exception ex) { dequeException = true; } try { vectorObject = vector.elementAt(tempPosition); } catch (Exception ex) { vectorException = true; } break; case REMOVE : tempPosition = getRandomInt(0, vector.size() - 1); listCommandsCalled.addElement("Remove " + tempPosition); try { arrayListObject = arrayList.remove(tempPosition); } catch (Exception ex) { arrayListException = true; } try { linkedListObject = deque.remove(tempPosition); } catch (Exception ex) { dequeException = true; } try { vectorObject = vector.elementAt(tempPosition); vector.removeElementAt(tempPosition); } catch (Exception ex) { vectorException = true; } break; case SET : tempInt = getRandomInteger(); tempPosition = getRandomInt(0, vector.size() - 1); listCommandsCalled.addElement("Set " + tempPosition); try { arrayList.set(tempPosition, tempInt); } catch (Exception ex) { arrayListException = true; } try { deque.set(tempPosition, tempInt); } catch (Exception ex) { dequeException = true; } try { vector.setElementAt(tempInt, tempPosition); } catch (Exception ex) { vectorException = true; } compareLists(arrayList, deque, vector); break; case OPTIMIZE : listCommandsCalled.addElement("Optimize"); arrayList.trim(); vector.trimToSize(); break; case REMOVE_ALL : if (getRandomInt(0, 5) == 4) { // to limit the frequency of this call listCommandsCalled.addElement("Remove all"); if (vector.size() == 0) { break; } for (int k = arrayList.size() - 1; k >= 0; k--) { arrayList.remove(k); deque.remove(k); } vector.removeAllElements(); } break; default : } if (arrayListException || dequeException || vectorException) { // if an exception is thrown in vector but not one of the lists or vice versa if (!(arrayListException && dequeException && vectorException)) { if (!(arrayListException && vectorException)) { System.out.println( "Exception discrepancy with vector and arraylist"); } else if (!(dequeException && vectorException)) { System.out.println( "Exception discrepancy with vector and linkedlist"); } else { System.out.println("Error in TestDataStructures"); } this.printListCommandsCalled(listCommandsCalled); fail("test failed"); //System.exit(0); } return; } if (!objectEquals(linkedListObject, arrayListObject, vectorObject)) { System.out.println("Objects returned inconsistent"); this.printListCommandsCalled(listCommandsCalled); fail("test failed"); //System.exit(0); } compareLists(arrayList, deque, vector); } } /** * Compare contents of lists to the vector. Print out stuff if they are * inconsistent and exit. */ public void compareLists(HsqlArrayList arrayList, HsqlDeque linkedList, Vector vector) { boolean arrayListError = false; boolean linkedListError = false; if (!equalsVector(arrayList, vector)) { System.out.println("Error in array list implementation"); arrayListError = true; } if (!equalsVector(linkedList, vector)) { System.out.println("Error in linked list implementation"); linkedListError = true; } if (arrayListError || linkedListError) { this.printListCommandsCalled(listCommandsCalled); System.out.flush(); fail("test failed"); } } /** Prints the list of commands called so far */ public void printListCommandsCalled(Vector commands) { int commandCode = 0; for (int i = 0; i < commands.size(); i++) { System.out.println((String) commands.elementAt(i)); } System.out.flush(); } /** Returns whether three objects are equal */ private boolean objectEquals(Object lObject, Object aObject, Object vObject) { if (lObject == null && aObject == null && vObject == null) { return true; } try { if (!lObject.equals(vObject)) { System.out.println("LinkList object returned inconsistent"); return false; } else if (!aObject.equals(vObject)) { System.out.println("ArrayList object returned inconsistent"); return false; } else { return true; } } catch (NullPointerException ex) { return false; } } /** Returns a random integer in the range of the lowBound and highBound */ private int getRandomInt(int lowBound, int highBound) { double random = randomGenerator.nextDouble(); return ((int) (((highBound - lowBound) * random) + .5)) + lowBound; } /** * Returns an Integer object with a value between Integer.MIN_VALUE and * Integer.MAX_VALUE */ private Integer getRandomInteger() { return new Integer(getRandomInt(0, (int) (Integer.MAX_VALUE / 100.0))); } /** Tells whether the given list contains the same data as the vector */ private boolean equalsVector(HsqlList list, Vector vector) { if (list.size() != vector.size()) { return false; } org.hsqldb.lib.Iterator listElements = list.iterator(); Enumeration vectorElements = vector.elements(); Object listObj = null; Object vectorObj = null; while (listElements.hasNext()) { listObj = listElements.next(); vectorObj = vectorElements.nextElement(); if (!listObj.equals(vectorObj)) { return false; } } return true; } public void testGrowth() { HsqlArrayList d = new HsqlArrayList(); for (int i = 0; i < 12; i++) { d.add(new Integer(i)); } for (int i = 0; i < d.size(); i++) { System.out.println(d.get(i)); } d = new HsqlArrayList(); for (int i = 0; i < 12; i++) { d.add(new Integer(i)); } d.set(11, new Integer(11)); for (int i = 0; i < d.size(); i++) { System.out.println(d.get(i)); } org.hsqldb.lib.Iterator it = d.iterator(); for (int i = 0; it.hasNext(); i++) { Integer value = (Integer) it.next(); System.out.println(value); assertEquals(i, value.intValue()); } //- assertEquals(12, d.size()); } public void testSpeed() { randomGenerator = new Random(System.currentTimeMillis()); int TEST_RUNS = 100000; int LOOP_COUNT = 1000; HsqlArrayList arrayList = new HsqlArrayList(TEST_RUNS); ArrayList utilArrayList = new ArrayList(TEST_RUNS); Vector vector = new Vector(TEST_RUNS); Integer value = new Integer(randomGenerator.nextInt()); Integer INT_0 = new Integer(0); StopWatch sw = new StopWatch(); System.out.println(sw.currentElapsedTimeToMessage("time")); for (int i = 0; i < TEST_RUNS; i++) { arrayList.add(INT_0); } for (int i = 0; i < TEST_RUNS; i++) { for (int j = 0; j < LOOP_COUNT; j++) { arrayList.set(i, INT_0); } } System.out.println( sw.currentElapsedTimeToMessage("time HsqlArrayLsit")); sw.zero(); for (int i = 0; i < TEST_RUNS; i++) { utilArrayList.add(INT_0); } for (int i = 0; i < TEST_RUNS; i++) { for (int j = 0; j < LOOP_COUNT; j++) { utilArrayList.set(i, INT_0); } } System.out.println(sw.currentElapsedTimeToMessage("time ArrayList")); sw.zero(); for (int i = 0; i < TEST_RUNS; i++) { vector.addElement(INT_0); } for (int i = 0; i < TEST_RUNS; i++) { for (int j = 0; j < LOOP_COUNT; j++) { vector.setElementAt(INT_0, i); } } System.out.println(sw.currentElapsedTimeToMessage("time Vector")); } public static void main(String[] args) { TestDataStructures test = new TestDataStructures("testLists"); for (int i = 0; i < NUMBER_OF_TEST_RUNS; i++) { test.testLists(); if (i % 1000 == 0) { System.out.println("Finished " + i + " tests"); System.out.flush(); } } System.out.println( "After " + NUMBER_OF_TEST_RUNS + " tests of a maximum of " + NUMBER_OF_ITERATIONS_PER_RUN + " list commands each test, the list tests passed"); test.testGrowth(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/BlaineTrig.java0000644000175000017500000000363212007547410022604 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; public class BlaineTrig implements org.hsqldb.Trigger { public void fire(int i, String name, String table, Object[] row1, Object[] row2) { System.err.println("Hello World. There is a fire"); } public static String capitalize(String s) { return s.toUpperCase(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestScript.java0000644000175000017500000001230412007547410022664 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; public class TestScript extends TestBase { // String path = "TestSelf01UDAggregates.txt"; // String path = "TestSelf01hsqldb_schema.txt"; // String path = "TestSelf01WithSubquery.txt"; // String path = "TestSelf01RecursiveQueries.txt"; // String path = "TestSelf02UpdatableViews.txt"; // String path = "TestSelf04UnionCorresponding.txt"; // String path = "TestSelf07OrderLimitNulls.txt"; // String path = "TestSelf06Generated.txt"; // String path = "TestSelf01TempTables.txt"; // String path = "TestSelfTriggers2.txt"; // String path = "TestSelf01Function.txt"; // String path = "TestSelf01Procedure.txt"; // String path = "TestSelf01Problems.txt"; // String path = "TestSelf01Subquery.txt"; // String path = "TestSelf01Triggers.txt"; // String path = "TestSelf02UpdatableViews.txt"; // String path = "TestSelf02Merge.txt"; // String path = "TestAny.txt"; // String path = "TestSelf.txt"; // String path = "TestSelfArrays.txt"; // String path = "TestSelf3PartNames.txt"; // String path = "TestSelfArithmetic.txt"; // String path = "TestSelfAlterColumn.txt"; // String path = "TestSelfCaseWhen.txt"; // String path = "TestSelfCheckConstraints.txt"; // String path = "TestSelfColGrant.txt"; // String path = "TestSelfCreate.txt"; // String path = "TestSelfConstraints.txt"; // String path = "TestSelfFunction.txt"; // String path = "TestSelfGrantees.txt"; // String path = "TestSelfGroupBy.txt"; // String path = "TestSelfInsertDeleteQueries.txt"; // String path = "TestSelfInterval.txt"; // String path = "TestSelfInternalFunctions.txt"; // String path = "TestSelfFieldLimits.txt"; // String path = "TestSelfFKModes.txt"; // String path = "TestSelfInPredicateReferencing.txt"; // String path = "TestSelfInsteadOfTriggers.txt"; // String path = "TestSelfIssues.txt"; // String path = "TestSelfJoins.txt"; // String path = "TestSelfLeftJoin.txt"; // String path = "TestSelfNameResolution.txt"; // String path = "TestSelfImmediateShutdown.txt"; // String path = "TestSelfInsertDeleteQueries.txt"; // String path = "TestSelfInPredicateReferencing.txt"; // String path = "TestSelfMultiGrants.txt"; // String path = "TestSelfNot.txt"; // String path = "TestSelfOrderLimits.txt"; // String path = "TestSelfRoleNesting.txt"; // String path = "TestSelfQueries.txt"; // String path = "TestSelfSchemaPersistB1.txt"; // String path = "TestSelfSeqRightsA.txt"; // String path = "TestSelfStoredProcedure.txt"; // String path = "TestSelfStoredProcedureTypes.txt"; // String path = "TestSelfSubselects.txt"; // String path = "TestSelfSysTables.txt"; // String path = "TestSelfTempTable1.txt"; // String path = "TestSelfTransaction.txt"; String path = "TestSelfTriggers2.txt"; // String path = "TestSelfUnions.txt"; // String path = "TestSelfUserFunction.txt"; // String path = "TestSelfViews.txt"; // String path = "TestSelfViewGrants.txt"; // String path = "TestSelfSeqRightsA.txt"; // String path = "TestSelfSysTables.txt"; // String path = "TestTemp.txt"; public TestScript(String name) { super(name, null, false, false); } public void test() throws java.lang.Exception { TestUtil.deleteDatabase("test"); Connection conn = newConnection(); String fullPath = "testrun/hsqldb/" + path; TestUtil.testScript(conn, fullPath); conn.createStatement().execute("SHUTDOWN"); } public static void main(String[] Args) throws Exception { TestScript ts = new TestScript("test"); ts.test(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestBase.java0000644000175000017500000001457312007547406022311 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.lang.reflect.Constructor; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import org.hsqldb.server.Server; import org.hsqldb.server.WebServer; import junit.framework.TestCase; import junit.framework.TestResult; /** * HSQLDB TestBugBase Junit test case.

                  * * By setting the booleans isNetwork, isHTTP, isUseTestServlet below, you can execute all tests that derive from this TestBase class * using either the embedded HSQL server mode in both HSQL or HTTP protocol, or target the HSQL-Servlet mode running in for example * Tomcat. * * When running against the Servlet: This assumes you have a WebApplication called HSQLwebApp running in for example Tomcat, with hsqldb.jar * (or better hsqldbtest.jar renamed to hsqldb.jar) in the WEB-INF/lib directory and web.xml containing something like this:

                  * * {@literal * * test * org.hsqldb.server.Servlet * * hsqldb.server.database * mem:test * * 1 * * * * test * /test * * } * @author boucherb@users * @version 1.7.2 * @since 1.7.2 */ public abstract class TestBase extends TestCase { String serverProps; String url; String user = "sa"; String password = ""; Server server; boolean isNetwork = true; boolean isHTTP = true; // Set false to test HSQL protocol, true to test HTTP, in which case you can use isUseTestServlet to target either HSQL's webserver, or the Servlet server-mode boolean isServlet = false; public TestBase(String name) { super(name); } public TestBase(String name, String url, boolean isNetwork, boolean isHTTP) { super(name); this.isNetwork = isNetwork; this.url = url; this.isHTTP = isHTTP; } protected void setUp() { if (isNetwork) { // change the url to reflect your preferred db location and name if (url == null) { if (isServlet) { url = "jdbc:hsqldb:http://localhost:8080/HSQLwebApp/test"; } else if (isHTTP) { url = "jdbc:hsqldb:http://localhost:8085/test"; } else { url = "jdbc:hsqldb:hsql://localhost/test"; } } if (!isServlet) { server = isHTTP ? new WebServer() : new Server(); if (isHTTP) { server.setPort(8085); } server.setDatabaseName(0, "test"); server.setDatabasePath( 0, "mem:test;sql.enforce_strict_size=true"); server.setLogWriter(null); server.setErrWriter(null); server.start(); } } else { if (url == null) { url = "jdbc:hsqldb:file:test;sql.enforce_strict_size=true"; } } try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); } catch (Exception e) { e.printStackTrace(); System.out.println(this + ".setUp() error: " + e.getMessage()); } } protected void tearDown() { if (isNetwork && !isServlet) { server.stop(); server = null; } } Connection newConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } public static void runWithResult(Class testCaseClass, String testName) { try { Constructor ctor = testCaseClass.getConstructor(new Class[]{ String.class }); TestBase theTest = (TestBase) ctor.newInstance(new Object[]{ testName }); theTest.runWithResult(); } catch (Exception ex) { System.err.println("couldn't execute test:"); ex.printStackTrace(System.err); } } public void runWithResult() { TestResult result = run(); String testName = this.getClass().getName(); if (testName.startsWith("org.hsqldb.test.")) { testName = testName.substring(16); } testName += "." + getName(); int failureCount = result.failureCount(); System.out.println(testName + " failure count: " + failureCount); java.util.Enumeration failures = result.failures(); while (failures.hasMoreElements()) { System.err.println(failures.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestJDBCSavepoints.java0000644000175000017500000004345012007547410024204 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Savepoint; import java.sql.Statement; import org.hsqldb.server.WebServer; import junit.framework.TestCase; import junit.framework.TestResult; import org.hsqldb.server.Server; /** * Tests JDBC java.sql.Savepoint support in context of new engine SQL-savepoint * support and new HSQL protocol extensions for savepoint support.

                  * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.7.2 * @since 1.7.2 */ public class TestJDBCSavepoints extends TestCase { // You change the url and serverProps to reflect your preferred settings // String serverProps = "database.0=mem:test;dbname.0=;silent=false;trace=true" // debugging String serverProps = "database.0=mem:test;dbname.0=;silent=true;trace=false"; String url = "jdbc:hsqldb:hsql://localhost"; // String url = "jdbc:hsqldb:http://localhost"; String user; String password; Statement stmt; Connection conn1; Connection conn2; // Server server; // this exercises everything: // the engine and JDBC savepoint support, // the new HSQL protocol and tunneling HSQL protocol over HTTP Server server; public TestJDBCSavepoints(String name) { super(name); } protected void setUp() { user = "sa"; password = ""; stmt = null; conn1 = null; conn2 = null; server = new Server(); // server = new WebServer(); server.putPropertiesFromString(serverProps); server.start(); try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); conn1 = DriverManager.getConnection(url, user, password); conn2 = DriverManager.getConnection(url, user, password); stmt = conn1.createStatement(); } catch (Exception e) { //e.printStackTrace(); System.out.println(this + ".setUp() error: " + e.getMessage()); } } protected void tearDown() { try { conn1.close(); } catch (Exception e) { //e.printStackTrace(); System.out.println(this + ".tearDown() error: " + e.getMessage()); } try { conn2.close(); } catch (Exception e) { //e.printStackTrace(); System.out.println(this + ".tearDown() error: " + e.getMessage()); } server.stop(); } public void testJDBCSavepoints() throws Exception { String sql; String msg; int i; PreparedStatement ps; ResultSet rs; Savepoint sp1; Savepoint sp2; Savepoint sp3; Savepoint sp4; Savepoint sp5; Savepoint sp6; Savepoint sp7; int rowcount = 0; sql = "drop table t if exists"; stmt.executeUpdate(sql); sql = "create table t(id int, fn varchar(40), ln varchar(40), zip int)"; stmt.executeUpdate(sql); conn1.setAutoCommit(true); //-- Test 1 : The execution of an SQL savepoint statement shall // raise an exception in the absence of an active // enclosing transaction // fredt@users - there is always an active transaction when autocommit // is true. The transaction is committed automatically if the next // Statement.execute() or similar call is performed successfully. /* msg = "savepoint set successfully in the abscence of an active transaction"; try { conn.setSavepoint("savepoint1"); assertTrue(msg,false); } catch (Exception e) {} */ //-- setup for following tests conn1.setAutoCommit(false); sql = "insert into t values(?,?,?,?)"; ps = conn1.prepareStatement(sql); ps.setString(2, "Mary"); ps.setString(3, "Peterson-Clancy"); i = 0; for (; i < 10; i++) { ps.setInt(1, i); ps.setInt(4, i); ps.executeUpdate(); } sp1 = conn1.setSavepoint("savepoint1"); for (; i < 20; i++) { ps.setInt(1, i); ps.setInt(4, i); ps.executeUpdate(); } sp2 = conn1.setSavepoint("savepoint2"); for (; i < 30; i++) { ps.setInt(1, i); ps.setInt(4, i); ps.executeUpdate(); } sp3 = conn1.setSavepoint("savepoint3"); for (; i < 40; i++) { ps.setInt(1, i); ps.setInt(4, i); ps.executeUpdate(); } sp4 = conn1.setSavepoint("savepoint4"); for (; i < 50; i++) { ps.setInt(1, i); ps.setInt(4, i); ps.executeUpdate(); } sp5 = conn1.setSavepoint("savepoint5"); sp6 = conn1.setSavepoint("savepoint6"); sp7 = conn1.setSavepoint("savepoint7"); rs = stmt.executeQuery("select count(*) from t"); rs.next(); rowcount = rs.getInt(1); rs.close(); //-- Test 2 : count of rows matches # rows inserted (assertion req'd by // following tests, but not directly related to the feature // being tested) msg = "select count(*) from t value"; try { assertEquals(msg, 50, rowcount); } catch (Exception e) {} conn2.setAutoCommit(false); conn2.setSavepoint("savepoint1"); conn2.setSavepoint("savepoint2"); //-- test 3 : A JDBC Savepoint shall be considered invalid if used to // release an SQL-savepoint in an SQL-session other than that // of the originating Connection object msg = "savepoint released succesfully on non-originating connection"; try { conn2.releaseSavepoint(sp2); assertTrue(msg, false); } catch (Exception e) {} //-- test 4 : A JDBC Savepoint shall be invalid if used to roll back to // an SQL-savepoint in an SQL-session other than that of the // originating Connection object try { conn2.rollback(sp1); msg = "succesful rollback to savepoint on " + "non-originating connection"; assertTrue(msg, false); } catch (Exception e) {} //-- test 5 : Direct execution of a statement shall // not fail to release an existing indicated savepoint, // regardless of how the indicated savepoint was created msg = "direct execution of statement failed to " + "release JDBC-created SQL-savepoint with identical savepoint name"; try { conn2.createStatement().executeUpdate( "release savepoint \"savepoint2\""); } catch (Exception e) { try { assertTrue(msg, false); } catch (Exception e2) {} } //-- test 6 : Direct execution of a statement // shall not fail to roll back to an existing indicated // savepoint due and only due to how the indicated savepoint // was created msg = "direct execution of statement failed to " + "roll back to existing JDBC-created SQL-savepoint with identical " + "savepoint name"; try { conn2.createStatement().executeUpdate( "rollback to savepoint \"savepoint1\""); } catch (Exception e) { e.printStackTrace(); try { assertTrue(msg, false); } catch (Exception e2) {} } conn1.releaseSavepoint(sp6); //-- test 7 : Releasing an SQL-savepoint shall destroy that savepoint msg = "savepoint released succesfully > 1 times"; try { conn1.releaseSavepoint(sp6); assertTrue(msg, false); } catch (Exception e) {} //-- test 8 : Releasing an SQL-savepoint shall destroy all subsequent SQL- // savepoints in the same savepoint level msg = "savepoint released successfully after preceding savepoint released"; try { conn1.releaseSavepoint(sp7); assertTrue(msg, false); } catch (Exception e) {} //-- test 9 : Releasing an SQL-savepoint shall not affect preceding // savepoints msg = "preceding same-point savepoint destroyed by following savepoint release"; try { conn1.releaseSavepoint(sp5); } catch (Exception e) { try { assertTrue(msg, false); } catch (Exception e2) {} } conn1.rollback(sp4); rs = stmt.executeQuery("select count(*) from t"); rs.next(); rowcount = rs.getInt(1); rs.close(); //-- Test 10 : count of rows matches # rows inserted less the number // of insertions rolled back msg = "select * rowcount after 50 inserts - 10 rolled back:"; try { assertEquals(msg, 40, rowcount); } catch (Exception e) {} //-- test 11 : An SQL-savepoint shall be destroyed in the // process of rolling back to that savepoint msg = "savepoint rolled back succesfully > 1 times"; try { conn1.rollback(sp4); assertTrue(msg, false); } catch (Exception e) {} conn1.rollback(sp3); rs = stmt.executeQuery("select count(*) from t"); rs.next(); rowcount = rs.getInt(1); rs.close(); //-- Test 12 : count of rows matches # rows inserted less the number // of insertions rolled back msg = "select count(*) after 50 inserts - 20 rolled back:"; try { assertEquals(msg, 30, rowcount); } catch (Exception e) {} //-- test 13 : An SQL-savepoint shall be destroyed in the // process of rolling back to that savepoint msg = "savepoint released succesfully after use in rollback"; try { conn1.releaseSavepoint(sp3); assertTrue(msg, false); } catch (Exception e) {} conn1.rollback(sp1); //-- test 14 : All subsequent savepoints (in a savepoint level) // shall be destroyed by the process of rolling back to // a preceeding savepoint (in the same savepoint level) msg = "savepoint rolled back without raising an exception after " + "rollback to a preceeding savepoint"; try { conn1.rollback(sp2); assertTrue(msg, false); } catch (Exception e) {} conn1.rollback(); //-- test 15 : All subsequent savepoints (in a savepoint level) // shall be destroyed by the process of // rolling back the active transaction msg = "savepoint released succesfully when it should have been " + "destroyed by a full rollback"; try { conn1.releaseSavepoint(sp1); assertTrue(msg, false); } catch (Exception e) {} conn1.setAutoCommit(false); sp1 = conn1.setSavepoint("savepoint1"); conn1.rollback(); conn1.setAutoCommit(false); conn1.createStatement().executeUpdate("savepoint \"savepoint1\""); //-- test 16 : A JDBC Savepoint shall be considered invalid if used to // release an SQL-savepoint other than precisely the // one created in correspondence to the creation of that // JDBC Savepoint object // fredt@users - we allow this if the name is valid /* msg = "JDBC Savepoint used to successfully release an identically named " + "savepoint in a transaction distinct from the originating " + "transaction"; try { conn1.releaseSavepoint(sp1); assertTrue(msg, false); } catch (Exception e) {} */ conn1.setAutoCommit(false); sp1 = conn1.setSavepoint("savepoint1"); conn1.createStatement().executeUpdate("savepoint \"savepoint1\""); //-- test 17 : A JDBC Savepoint shall be considered invalid if used to // release an SQL-savepoint other than precisely the // one created in correspondence to the creation of that // JDBC Savepoint object // fredt@users - we allow this if the name is valid /* msg = "JDBC Savepoint used to successfully release an identically named " + "savepoint in a transaction other than the originating " + "transaction"; try { conn1.releaseSavepoint(sp1); assertTrue(msg, false); } catch (Exception e) {} */ //-- test 18 : A JDBC Savepoint shall be considered invalid if used to // roll back to an SQL-savepoint other than precisely the // one created in correspondence to the creation of that // JDBC Savepoint object // fredt@users - we allow this if the name is valid /* msg = "JDBC Savepoint used to successfully to roll back to an " + "identically named savepoint in a transaction distinct " + "from the originating transaction"; try { conn1.rollback(sp1); assertTrue(msg, false); } catch (Exception e) {} */ conn1.setAutoCommit(false); sp1 = conn1.setSavepoint("savepoint1"); conn1.createStatement().executeUpdate("savepoint \"savepoint1\""); //-- test 19 : A JDBC Savepoint shall be considered invalid if used to // roll back to an SQL-savepoint other than precisely the // one created in correspondence to the creation of that // JDBC Savepoint object // fredt@users - we allow this if the name is valid /* msg = "JDBC Savepoint used to successfully release an identically named " + "savepoint in a transaction other than the originating " + "transaction"; try { conn1.releaseSavepoint(sp1); assertTrue(msg, false); } catch (Exception e) {} */ } public void testJDBCAutoSavepoints() throws Exception { String sql; int i; PreparedStatement ps; ResultSet rs; Savepoint sp1; int rowcount = 0; sql = "drop table t if exists"; stmt.executeUpdate(sql); sql = "create table t(id int, fn varchar(40), ln varchar(40), zip int)"; stmt.executeUpdate(sql); //-- setup for following tests conn1.setAutoCommit(false); sql = "insert into t values(?,?,?,?)"; ps = conn1.prepareStatement(sql); ps.setString(2, "Mary"); ps.setString(3, "Peterson-Clancy"); i = 0; for (; i < 10; i++) { ps.setInt(1, i); ps.setInt(4, i); ps.executeUpdate(); } sp1 = conn1.setSavepoint(); for (; i < 12; i++) { ps.setInt(1, i); ps.setInt(4, i); ps.executeUpdate(); } conn1.rollback(sp1); rs = stmt.executeQuery("select count(*) from t"); rs.next(); rowcount = rs.getInt(1); assertEquals(10, rowcount); rs.close(); } /** * @param args the command line arguments */ public static void main(String[] args) throws Exception { TestResult result; TestCase test; java.util.Enumeration failures; int count; result = new TestResult(); test = new TestJDBCSavepoints("testJDBCSavepoints"); test.run(result); count = result.failureCount(); System.out.println("TestJDBCSavepoints failure count: " + count); failures = result.failures(); while (failures.hasMoreElements()) { System.out.println(failures.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestTextTable.java0000644000175000017500000004631312007547410023323 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.IOException; import java.io.PrintStream; import java.sql.SQLException; import org.hsqldb.lib.FileUtil; /** test various text table features * * @author frank.schoenheit@sun.com */ public class TestTextTable extends TestBase { java.sql.Statement m_statement; java.sql.Connection m_connection; private class TextTableDescriptor { private String m_name; private String m_columnSpec; private String m_separator; private String m_separatorSpec; private Object[][] m_data; public TextTableDescriptor(String name, String columnSpec, String separator, String separatorSpec, Object[][] data) { m_name = name; m_columnSpec = columnSpec; m_separator = separator; m_separatorSpec = separatorSpec; m_data = data; } public final String getName() { return m_name; } public final String getColumnSpec() { return m_columnSpec; } public final String getSeparator() { return m_separator; } public final String getSeparatorSpec() { return m_separatorSpec; } public final Object[][] getData() { return m_data; } public final Object[][] appendRowData(Object[] rowData) { Object[][] newData = new Object[m_data.length + 1][rowData.length]; for (int row = 0; row < m_data.length; ++row) { newData[row] = m_data[row]; } newData[m_data.length] = rowData; m_data = newData; return m_data; } /** * creates a text file as described by this instance */ private void createTextFile() { PrintStream textFile = null; try { String completeFileName = m_name + ".csv"; textFile = new PrintStream( FileUtil.getFileUtil().openOutputStreamElement( completeFileName)); new java.io.File(completeFileName).deleteOnExit(); } catch (IOException ex) { fail(ex.toString()); } for (int row = 0; row < m_data.length; ++row) { StringBuffer buf = new StringBuffer(); int colCount = m_data[row].length; for (int col = 0; col < colCount; ++col) { buf.append(m_data[row][col].toString()); if (col + 1 != colCount) { buf.append(m_separator); } } textFile.println(buf.toString()); } textFile.close(); } private String getDataSourceSpec() { return m_name + ".csv;encoding=UTF-8;fs=" + m_separatorSpec; } private void createTable(java.sql.Connection connection) throws SQLException { String createTable = "DROP TABLE \"" + m_name + "\" IF EXISTS;"; createTable += "CREATE TEXT TABLE \"" + m_name + "\" ( " + m_columnSpec + " );"; connection.createStatement().execute(createTable); boolean test = isReadOnly(m_name); String setTableSource = "SET TABLE \"" + m_name + "\" SOURCE \"" + getDataSourceSpec() + "\""; connection.createStatement().execute(setTableSource); } } ; TextTableDescriptor m_products = new TextTableDescriptor("products", "ID INTEGER PRIMARY KEY, \"name\" VARCHAR(20)", "\t", "\\t", new Object[][] { new Object[] { new Integer(1), "Apples" }, new Object[] { new Integer(2), "Oranges" } }); TextTableDescriptor m_customers = new TextTableDescriptor("customers", "ID INTEGER PRIMARY KEY," + "\"name\" VARCHAR(50)," + "\"address\" VARCHAR(50)," + "\"city\" VARCHAR(50)," + "\"postal\" VARCHAR(50)", ";", "\\semi", new Object[][] { new Object[] { new Integer(1), "Food, Inc.", "Down Under", "Melbourne", "509" }, new Object[] { new Integer(2), "Simply Delicious", "Down Under", "Melbourne", "518" }, new Object[] { new Integer(3), "Pure Health", "10 Fish St.", "San Francisco", "94107" } }); /** Creates a new instance of TestTextTable */ public TestTextTable(String testName) { super(testName, null, false, false); } /** * sets up all text files for the test database */ private void setupTextFiles() { m_products.createTextFile(); m_customers.createTextFile(); } /** * creates the database tables needed for the test */ private void setupDatabase() { try { m_connection = newConnection(); m_statement = m_connection.createStatement(); m_products.createTable(m_connection); m_customers.createTable(m_connection); } catch (SQLException ex) { fail(ex.toString()); } } public void setUp() { super.setUp(); setupTextFiles(); setupDatabase(); } protected void tearDown() { executeStatement("SHUTDOWN"); super.tearDown(); } /** * returns the data source definition for a given text table */ private String getDataSourceSpec(String tableName) { String spec = null; try { java.sql.ResultSet results = m_statement.executeQuery( "SELECT DATA_SOURCE_DEFINTION FROM INFORMATION_SCHEMA.SYSTEM_TEXTTABLES " + "WHERE TABLE_NAME='" + tableName + "'"); results.next(); spec = results.getString(1); } catch (SQLException ex) { fail("getDataSourceSpec(" + tableName + ") failed: " + ex.toString()); } return spec; } /** * determines whether a given table is currently read-only */ private boolean isReadOnly(String tableName) { boolean isReadOnly = true; try { java.sql.ResultSet systemTables = m_statement.executeQuery( "SELECT READ_ONLY FROM INFORMATION_SCHEMA.SYSTEM_TABLES " + "WHERE TABLE_NAME='" + m_products.getName() + "'"); systemTables.next(); isReadOnly = systemTables.getBoolean(1); } catch (SQLException ex) { fail("isReadOnly(" + tableName + ") failed: " + ex.toString()); } return isReadOnly; } /** * checks different field separators */ private void checkSeparators() { String[][] separators = new String[][] { // special separators new String[] { ";", "\\semi" }, new String[] { "\"", "\\quote" }, new String[] { " ", "\\space" }, new String[] { "'", "\\apos" }, //new String[] { "\n", "\\n" }, // doesn't work as expected - seems I don't understand how this is intended to work? new String[] { "\t", "\\t" }, new String[] { "\\", "\\" }, // some arbitrary separators which need not to be escaped new String[] { ".", "." }, new String[] { "-", "-" }, new String[] { "#", "#" }, new String[] { ",", "," } // unicode character //new String[] { "\u1234", "\\u1234" } // doesn't work. How do I specify in a FileOutputStream which encoding to use when writing // strings? }; for (int i = 0; i < separators.length; ++i) { String separator = separators[i][0]; String separatorSpec = separators[i][1]; // create the file String tableName = "customers_" + i; TextTableDescriptor tempCustomersDesc = new TextTableDescriptor(tableName, m_customers.getColumnSpec(), separator, separatorSpec, m_customers.getData()); tempCustomersDesc.createTextFile(); try { tempCustomersDesc.createTable(m_connection); } catch (Throwable t) { fail("checkSeparators: separator '" + separatorSpec + "' doesn't work: " + t.toString()); } executeStatement("SET TABLE \"" + tableName + "\" SOURCE OFF"); executeStatement("DROP TABLE \"" + tableName + "\""); } } /** * verifies the content of a given table is as expected * @param tableName * the name of the table whose content is to check * @param expectedValues * the values expected in the table */ private void verifyTableContent(String tableName, Object[][] expectedValues) { String selectStmt = "SELECT * FROM \"" + tableName + "\" ORDER BY ID"; try { java.sql.ResultSet results = m_statement.executeQuery(selectStmt); int row = 0; while (results.next()) { row = results.getRow(); Object[] expectedRowContent = expectedValues[row - 1]; for (int col = 0; col < expectedRowContent.length; ++col) { Object expectedValue = expectedRowContent[col]; Object foundValue = results.getObject(col + 1); assertEquals("table " + tableName + ", row " + row + ", column " + col + ":", expectedValue, foundValue); } } // finally ensure that there are not more rows in the table than expected assertEquals("table " + tableName + "'s row count: ", expectedValues.length, row); } catch (junit.framework.AssertionFailedError e) { throw e; } catch (Throwable t) { fail("verifyTableContent(" + tableName + ") failed with " + t.toString()); } } /** * executes a given m_statement * *

                  Basically, this method calls m_statement.execute(sql), * but wraps any SQLExceptions into a JUnit error. */ private void executeStatement(String sql) { try { m_statement.execute(sql); } catch (SQLException ex) { fail(ex.toString()); } } /** * verifies the initial content of the "products" text table, plus a simple insertion */ private void verifyInitialContent() { verifyTableContent(m_products.getName(), m_products.getData()); verifyTableContent(m_customers.getName(), m_customers.getData()); } /** * does some very basic insertion tests */ private void checkInsertions() { // check whether inserting a value succeeds executeStatement("INSERT INTO \"" + m_products.getName() + "\" VALUES ( 3, 'Pears' )"); verifyTableContent(m_products.getName(), m_products.appendRowData(new Object[] { new Integer(3), "Pears" })); // check whether the PK constraint works try { m_statement.execute("INSERT INTO \"" + m_products.getName() + "\" VALUES ( 1, 'Green Apples' )"); fail("PKs do not work as expected."); } catch (SQLException e) {} } /** * verifies whether implicit and explicit dis/connections from/to the text table source work * as expected */ private void checkSourceConnection() { String sqlSetTable = "SET TABLE \"" + m_products.getName() + "\""; // preconditions for the following tests assertEquals( "internal error: retrieving the data source does not work properly at all.", m_products.getDataSourceSpec(), getDataSourceSpec(m_products.getName())); assertFalse("internal error: table should not be read-only, initially", isReadOnly(m_products.getName())); // disconnect, see if the table behaves well afterwards executeStatement(sqlSetTable + " SOURCE OFF"); assertEquals( "Disconnecting a text table should not reset the table source.", m_products.getDataSourceSpec(), getDataSourceSpec(m_products.getName())); assertTrue( "Disconnecting from the table source should put the table into read-only mode.", isReadOnly(m_products.getName())); try { java.sql.ResultSet tableContent = m_statement.executeQuery("SELECT * FROM \"" + m_products.getName() + "\""); assertFalse("A disconnected table should be empty.", tableContent.next()); } catch (SQLException ex) { fail("Selecting from a disconnected table should return an empty result set."); } // reconnect, see if the table works as expected then executeStatement(sqlSetTable + " SOURCE ON"); verifyTableContent(m_products.getName(), m_products.getData()); // check whether dis-/reconnecting a readonly table preserves the readonly-ness executeStatement(sqlSetTable + " READONLY TRUE"); assertTrue("Setting the table to read-only failed.", isReadOnly(m_products.getName())); executeStatement(sqlSetTable + " SOURCE OFF"); assertTrue("Still, a disconnected table should be read-only.", isReadOnly(m_products.getName())); executeStatement(sqlSetTable + " SOURCE ON"); assertTrue( "A reconnected readonly table should preserve its readonly-ness.", isReadOnly(m_products.getName())); executeStatement(sqlSetTable + " READONLY FALSE"); assertFalse("Unable to reset the readonly-ness.", isReadOnly(m_products.getName())); // check whether setting an invalid data source sets the table to readonly, by // preserving the data source try { // create a malformed file String fileName = "malformed.csv"; PrintStream textFile = new PrintStream( FileUtil.getFileUtil().openOutputStreamElement(fileName)); textFile.println("not a number;some text"); textFile.close(); new java.io.File(fileName).deleteOnExit(); // try setting it as source String newDataSourceSpec = fileName + ";encoding=UTF-8;fs=\\semi"; try { m_statement.execute(sqlSetTable + " SOURCE \"" + newDataSourceSpec + "\""); fail("a malformed data source was accepted silently."); } catch (java.sql.SQLException es) { /* that's expected here */ } /* // new - a malformed data source assignment by user should not survive // and should revert to the existing one assertTrue( "A table with an invalid data source should fall back to read-only.", isReadOnly(m_products.getName())); assertEquals( "A data source which cannot be set should nonetheless be remembered.", newDataSourceSpec, getDataSourceSpec(m_products.getName())); */ // the data source spec should even survive a shutdown executeStatement("SHUTDOWN"); m_connection = newConnection(); m_statement = m_connection.createStatement(); /* assertEquals( "A data source pointing to a mailformed file should survive a database shutdown.", newDataSourceSpec, getDataSourceSpec(m_products.getName())); assertTrue( "After shutdown and DB-reconnect, the table with a malformed source should be read-only, again.", isReadOnly(m_products.getName())); */ // reconnect after fixing the file textFile = new PrintStream( FileUtil.getFileUtil().openOutputStreamElement(fileName)); textFile.println("1;some text"); textFile.close(); executeStatement(sqlSetTable + " SOURCE ON"); assertFalse( "The file was fixed, reconnect was successful, so the table shouldn't be read-only.", isReadOnly(m_products.getName())); // finally re-create the proper version of the table for any further tests m_products.createTextFile(); m_products.createTable(m_connection); verifyTableContent(m_products.getName(), m_products.getData()); } catch (junit.framework.AssertionFailedError e) { throw e; } catch (Throwable t) { fail("checkSourceConnection: unable to check invalid data sources, error: " + t.toString()); } } /** * basic tests for text files */ public void testTextFiles() { verifyInitialContent(); checkInsertions(); checkSeparators(); checkSourceConnection(); } public static void main(String[] argv) { runWithResult(TestTextTable.class, "testTextFiles"); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestAnother.java0000644000175000017500000000713312007547410023024 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import org.hsqldb.lib.StopWatch; public class TestAnother { // fixed protected String url = "jdbc:hsqldb:"; // protected String filepath = "hsql://localhost/mytest"; // protected String filepath = "mem:test"; protected String filepath = "/hsql/testtime/test"; public TestAnother() {} public void setUp() { String user = "sa"; String password = ""; try { Connection conn = null; Class.forName("org.hsqldb.jdbc.JDBCDriver"); conn = DriverManager.getConnection(url + filepath, user, password); Statement stmnt = conn.createStatement(); Statement st = conn.createStatement(); st.executeUpdate("CREATE TABLE TT(D DATE)"); st.executeUpdate("INSERT INTO TT VALUES ('2004-01-02')"); st.executeUpdate("INSERT INTO TT VALUES ('2004-02-02')"); ResultSet rs = st.executeQuery("SELECT * FROM TT"); while (rs.next()) { System.out.println(rs.getDate(1)); } st.executeUpdate("DROP TABLE TT"); rs.close(); Statement stm = conn.createStatement(); stm.executeUpdate( "create table test (id int,atime timestamp default current_timestamp)"); stm = conn.createStatement(); int count = stm.executeUpdate("insert into test (id) values (1)"); System.out.println(count); conn.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("TestSql.setUp() error: " + e.getMessage()); } } public static void main(String[] argv) { StopWatch sw = new StopWatch(); TestAnother test = new TestAnother(); test.setUp(); System.out.println("Total Test Time: " + sw.elapsedTime()); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestBug1191815.java0000644000175000017500000001001712007547410022706 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.sql.Timestamp; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone; import junit.framework.TestCase; import junit.framework.TestResult; /** * Created on Apr 28, 2005 * @author Antranig Basman (antranig@caret.cam.ac.uk) */ public class TestBug1191815 extends TestBase { public TestBug1191815(String name) { super(name); } public void test() throws Exception { try { Connection conn = newConnection(); Statement stmt = conn.createStatement(); stmt.executeUpdate("drop table testA if exists;"); stmt.executeUpdate("create table testA(data timestamp);"); TimeZone pst = TimeZone.getTimeZone("PST"); Calendar cal = new GregorianCalendar(pst); cal.clear(); cal.set(2005, 0, 1, 0, 0, 0); // yyyy-mm-dd hh:mm:ss.fffffffff Timestamp ts = new Timestamp(cal.getTimeInMillis()); ts.setNanos(1000); PreparedStatement ps = conn.prepareStatement("insert into testA values(?)"); ps.setTimestamp(1, ts, cal); ps.execute(); ps.setTimestamp(1, ts, null); ps.execute(); String sql = "select * from testA"; stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); rs.next(); Timestamp returned = rs.getTimestamp(1, cal); rs.next(); Timestamp def = rs.getTimestamp(1, null); assertEquals(ts, returned); assertEquals(ts, def); } catch (Exception e) { e.printStackTrace(); fail(); } } public static void main(String[] args) throws Exception { TestResult result; TestCase test; java.util.Enumeration exceptions; java.util.Enumeration failures; int count; result = new TestResult(); test = new TestBug1191815("test"); test.run(result); count = result.failureCount(); System.out.println("TestBug1192000 failure count: " + count); failures = result.failures(); while (failures.hasMoreElements()) { System.out.println(failures.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestBug808460.java0000644000175000017500000000602212007547406022634 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.Statement; import junit.framework.TestCase; import junit.framework.TestResult; /** * HSQLDB TestBug808460 Junit test case.

                  * * @author boucherb@users * @version 1.7.2 * @since 1.7.2 */ public class TestBug808460 extends TestBase { public TestBug808460(String name) { super(name); } /* Implements the TestBug808460 test */ public void test() throws Exception { Connection conn = newConnection(); Statement stmt = conn.createStatement(); stmt.executeQuery("SELECT * FROM INFORMATION_SCHEMA.SYSTEM_SESSIONS"); conn.close(); conn = newConnection(); stmt = conn.createStatement(); stmt.executeQuery("SELECT * FROM INFORMATION_SCHEMA.SYSTEM_SESSIONS"); conn.close(); } /* Runs TestBug808460 test from the command line*/ public static void main(String[] args) throws Exception { TestResult result; TestCase test; java.util.Enumeration failures; int count; result = new TestResult(); test = new TestBug808460("test"); test.run(result); count = result.failureCount(); System.out.println("TestBug808460 failure count: " + count); failures = result.failures(); while (failures.hasMoreElements()) { System.out.println(failures.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestInstantiation.java0000644000175000017500000000557012007547410024253 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.sql.SQLException; import org.hsqldb.server.HsqlServerFactory; import org.hsqldb.server.HsqlSocketRequestHandler; /** * Test the HsqlServerFactory interface. After running, connect to the * server at port 9999 using the database manager. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.7.0 */ public class TestInstantiation { public TestInstantiation() { try { ServerSocket serversocket; Socket socket; String m_DatabaseName; HsqlSocketRequestHandler m_hsrh; m_DatabaseName = "mem:."; serversocket = new ServerSocket(9999); while (true) { socket = serversocket.accept(); m_hsrh = HsqlServerFactory.createHsqlServer(m_DatabaseName, true, false); m_hsrh.handleConnection(socket); } } catch (IOException e1) { System.out.println(e1.getMessage()); } catch (SQLException e2) { System.out.println(e2.getMessage()); } } public static void main(String[] argv) { new TestInstantiation(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestJDBCGeneratedColumns.java0000644000175000017500000001726212007547410025312 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBCGeneratedColumns extends TestBase { public TestJDBCGeneratedColumns(String name) { super(name); } public void testInsert() { boolean successPrepared = false; boolean successDirect = false; try { Connection c = newConnection(); Statement st = c.createStatement(); String s = "DROP TABLE T IF EXISTS"; st.execute(s); s = "CREATE TABLE T (I INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 33), C CHARACTER(10))"; st.execute(s); s = "INSERT INTO T (C) VALUES('TEST')"; st.execute(s, Statement.RETURN_GENERATED_KEYS); ResultSet rs = st.getGeneratedKeys(); while (rs.next()) { System.out.println("generated: " + rs.getInt(1)); successDirect = rs.getInt(1) == 33; } PreparedStatement ps = c.prepareStatement(s, Statement.RETURN_GENERATED_KEYS); ps.execute(); rs = ps.getGeneratedKeys(); while (rs.next()) { System.out.println("" + rs.getInt(1)); successPrepared = rs.getInt(1) == 34; } ps.close(); ps = c.prepareStatement(s, new int[]{ 1 }); ps.execute(); rs = ps.getGeneratedKeys(); while (rs.next()) { System.out.println("" + rs.getInt(1)); successPrepared &= rs.getInt(1) == 35; } ps.close(); ps = c.prepareStatement(s, new String[]{ "I" }); ps.execute(); rs = ps.getGeneratedKeys(); while (rs.next()) { System.out.println("" + rs.getInt(1)); successPrepared &= rs.getInt(1) == 36; successPrepared &= rs.getBigDecimal(1).intValue() == 36; } ps.close(); ps = c.prepareStatement(s, new String[]{ "I", "C" }); ps.execute(); rs = ps.getGeneratedKeys(); while (rs.next()) { System.out.println("" + rs.getInt(1)); successPrepared &= rs.getInt(1) == 37; successPrepared &= rs.getBigDecimal(1).intValue() == 37; successPrepared &= rs.getString(2).startsWith("TEST"); } ps.close(); ps = c.prepareStatement(s, new String[]{ "C", "I" }); ps.execute(); rs = ps.getGeneratedKeys(); while (rs.next()) { System.out.println("" + rs.getInt(2)); successPrepared &= rs.getInt(2) == 38; successPrepared &= rs.getBigDecimal(2).intValue() == 38; successPrepared &= rs.getString(1).startsWith("TEST"); } ps.close(); } catch (Exception e) { System.out.print(e); } assertTrue(successPrepared); assertTrue(successDirect); } public void testBatchInsert() { boolean successPrepared = false; boolean successDirect = false; try { Connection c = newConnection(); Statement st = c.createStatement(); String s = "DROP TABLE T IF EXISTS"; st.execute(s); s = "CREATE TABLE T (I INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 33), C CHARACTER(10))"; st.execute(s); s = "INSERT INTO T (C) VALUES('TEST')"; PreparedStatement ps = c.prepareStatement(s, Statement.RETURN_GENERATED_KEYS); ps.addBatch(); ps.addBatch(); ps.executeBatch(); ResultSet rs = ps.getGeneratedKeys(); int val = 33; while (rs.next()) { System.out.println("" + rs.getInt(1)); successPrepared = rs.getInt(1) == val; val ++; } ps.close(); ps = c.prepareStatement(s, new int[]{ 1 }); ps.addBatch(); ps.addBatch(); ps.executeBatch(); rs = ps.getGeneratedKeys(); while (rs.next()) { System.out.println("" + rs.getInt(1)); successPrepared &= rs.getInt(1) == val; val ++; } ps.close(); ps = c.prepareStatement(s, new String[]{ "I" }); ps.addBatch(); ps.addBatch(); ps.executeBatch(); rs = ps.getGeneratedKeys(); while (rs.next()) { System.out.println("" + rs.getInt(1)); successPrepared &= rs.getInt(1) == val; successPrepared &= rs.getBigDecimal(1).intValue() == val; val ++; } ps.close(); ps = c.prepareStatement(s, new String[]{ "I", "C" }); ps.addBatch(); ps.addBatch(); ps.executeBatch(); rs = ps.getGeneratedKeys(); while (rs.next()) { System.out.println("" + rs.getInt(1)); successPrepared &= rs.getInt("I") == val; successPrepared &= rs.getBigDecimal(1).intValue() == val; successPrepared &= rs.getString("C").startsWith("TEST"); val ++; } ps.close(); ps = c.prepareStatement(s, new String[]{ "C", "I" }); ps.addBatch(); ps.addBatch(); ps.executeBatch(); rs = ps.getGeneratedKeys(); while (rs.next()) { System.out.println("" + rs.getInt(2)); successPrepared &= rs.getInt(2) == val; successPrepared &= rs.getBigDecimal(2).intValue() == val; successPrepared &= rs.getString(1).startsWith("TEST"); val ++; } ps.close(); } catch (Exception e) { System.out.print(e); } assertTrue(successPrepared); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestStoredProcedure.java0000644000175000017500000004244512007547410024542 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import junit.framework.TestCase; import junit.framework.TestResult; /** * Tests for stored procedures. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 2.0.1 */ public class TestStoredProcedure extends TestBase { public TestStoredProcedure(String name) { super(name); } public void testOne() throws Exception { Connection conn = newConnection(); Statement statement; try { statement = conn.createStatement(); ResultSet rs = statement.executeQuery( "call \"org.hsqldb.test.TestStoredProcedure.procTest1\"()"); rs.next(); int cols = rs.getInt(1); assertFalse("test result not correct", false); } catch (Exception e) {} try { statement = conn.createStatement(); statement.execute( "CREATE temp TABLE MYTABLE(COL1 INTEGER,COL2 VARCHAR(10));"); statement.execute( "CREATE PROCEDURE proc1(IN P1 INT, IN P2 INT, OUT P3 INT) " + "SPECIFIC P2 LANGUAGE JAVA DETERMINISTIC MODIFIES SQL DATA EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.TestStoredProcedure.procTest2'"); CallableStatement c = conn.prepareCall("call proc1(1,2,?)"); c.execute(); int value = c.getInt(1); c.close(); statement.execute( "CREATE FUNCTION func1(IN P1 INT, IN P2 INT) " + "RETURNS TABLE(C1 INT, C2 INT) " + "SPECIFIC F1 LANGUAGE JAVA DETERMINISTIC EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.TestStoredProcedure.funcTest1'"); c = conn.prepareCall("call func1(1,2)"); boolean isResult = c.execute(); assertTrue(isResult); ResultSet rs = c.getResultSet(); rs.next(); assertEquals(value, 2); rs = c.executeQuery(); rs.next(); assertEquals(value, 2); } catch (Exception e) { assertTrue("unexpected error", false); } finally { conn.close(); } } public void testTwo() throws Exception { Connection conn = newConnection(); Statement statement; int updateCount; try { statement = conn.createStatement(); statement.execute("create user testuser password 'test'"); statement.execute("create table testtable(v varchar(20))"); statement.execute( "insert into testtable values ('tennis'), ('tent'), ('television'), ('radio')"); ResultSet rs = statement.executeQuery( "call \"org.hsqldb.test.TestStoredProcedure.funcTest2\"('test')"); rs.next(); boolean b = rs.getBoolean(1); rs.close(); assertTrue("test result not correct", b); statement.execute( "create function func2(varchar(20)) returns boolean " + "SPECIFIC F2 LANGUAGE JAVA DETERMINISTIC NO SQL CALLED ON NULL INPUT EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.TestStoredProcedure.funcTest2'"); rs = statement.executeQuery("call func2('test')"); rs.next(); b = rs.getBoolean(1); rs.close(); assertTrue("test result not correct", b); rs = statement.executeQuery( "select count(*) from testtable where func2(v)"); rs.next(); int count = rs.getInt(1); assertTrue("test result not correct", count == 3); statement.execute( "grant execute on specific function public.f2 to testuser"); boolean isResult = statement.execute("call func2('test')"); assertTrue(isResult); rs = statement.getResultSet(); rs.next(); b = rs.getBoolean(1); assertTrue("test result not correct", b); } catch (Exception e) { assertTrue("unable to execute call to procedure", false); } finally { conn.close(); } } public void testThree() throws SQLException { Connection conn = newConnection(); Statement st = conn.createStatement(); st.execute("declare varone int default 0;"); st.execute( "create procedure proc_inout_result (inout intp int) " + " language java reads sql data external name 'CLASSPATH:org.hsqldb.test.TestStoredProcedure.procWithResultOne'"); CallableStatement cs = conn.prepareCall("call proc_inout_result(varone)"); boolean isResult = cs.execute(); assertFalse(isResult); cs.getMoreResults(); ResultSet rs = cs.getResultSet(); rs.next(); assertEquals(rs.getString(1), "SYSTEM_LOBS"); assertEquals(rs.getString(2), "LOB_IDS"); rs.close(); } public void testFour() throws SQLException { Connection conn = newConnection(); Statement st = conn.createStatement(); st.execute("declare varone int default 0;"); st.execute( "create procedure proc_inout_result_two (inout intp int) " + " language java reads sql data dynamic result sets 2 external name 'CLASSPATH:org.hsqldb.test.TestStoredProcedure.procWithResultTwo'"); CallableStatement cs = conn.prepareCall("call proc_inout_result_two(varone)"); boolean isResult = cs.execute(); assertFalse(isResult); cs.getMoreResults(); ResultSet rs = cs.getResultSet(); rs.next(); assertEquals(rs.getString(1), "SYSTEM_LOBS"); assertEquals(rs.getString(2), "LOB_IDS"); rs.close(); if (cs.getMoreResults()) { rs = cs.getResultSet(); rs.next(); assertEquals(rs.getString(1), "SYSTEM_LOBS"); assertEquals(rs.getString(2), "LOBS"); rs.close(); } } public void testFourParams() throws SQLException { Connection conn = newConnection(); Statement st = conn.createStatement(); st.execute( "create procedure proc_inout_result_two_params (inout intp int) " + " language java reads sql data dynamic result sets 2 external name 'CLASSPATH:org.hsqldb.test.TestStoredProcedure.procWithResultTwo'"); CallableStatement cs = conn.prepareCall("{call proc_inout_result_two_params(?)}"); cs.setInt(1, 0); boolean isResult = cs.execute(); assertFalse(isResult); cs.getMoreResults(); ResultSet rs = cs.getResultSet(); rs.next(); assertEquals(rs.getString(1), "SYSTEM_LOBS"); assertEquals(rs.getString(2), "LOB_IDS"); rs.close(); if (cs.getMoreResults()) { rs = cs.getResultSet(); rs.next(); assertEquals(rs.getString(1), "SYSTEM_LOBS"); assertEquals(rs.getString(2), "LOBS"); rs.close(); } rs = cs.executeQuery(); rs.next(); assertEquals(rs.getString(1), "SYSTEM_LOBS"); assertEquals(rs.getString(2), "LOB_IDS"); rs.close(); } public void testFive() throws SQLException { Connection conn = newConnection(); Statement st = conn.createStatement(); st.execute( "create function func_table (in namep varchar(128)) returns table(cola varchar(128), colb varchar(128)) " + "return table(select schema_name, schema_owner from information_schema.schemata where schema_owner=namep);"); CallableStatement cs = conn.prepareCall("call func_table('_SYSTEM')"); boolean isResult = cs.execute(); assertTrue(isResult); ResultSet rs = cs.getResultSet(); rs.next(); assertEquals(rs.getString(1), "INFORMATION_SCHEMA"); assertEquals(rs.getString(2), "_SYSTEM"); rs.close(); // isResult = st.execute("call func_table('_SYSTEM')"); assertTrue(isResult); rs = st.getResultSet(); rs.next(); assertEquals(rs.getString(1), "INFORMATION_SCHEMA"); assertEquals(rs.getString(2), "_SYSTEM"); rs.close(); } public void testSix() throws SQLException { Connection conn = newConnection(); Statement st = conn.createStatement(); st.execute( "CREATE PROCEDURE get_columns_and_table(tname VARCHAR(128), sname VARCHAR(128)) " + "READS SQL DATA DYNAMIC RESULT SETS 2 " + "BEGIN ATOMIC " + "DECLARE result1 CURSOR FOR SELECT * FROM information_schema.columns " + "WHERE table_name = tname AND table_schema = sname; " + "DECLARE result2 CURSOR FOR SELECT * FROM information_schema.tables " + "WHERE table_name = tname AND table_schema = sname; " + "OPEN result1; " + "OPEN result2; " + "END"); CallableStatement cs = conn.prepareCall( "call get_columns_and_table('TABLES', 'INFORMATION_SCHEMA')"); boolean isResult = cs.execute(); assertFalse(isResult); cs.getMoreResults(); ResultSet rs = cs.getResultSet(); rs.next(); assertEquals("INFORMATION_SCHEMA", rs.getString(2)); rs.close(); boolean more = cs.getMoreResults(); if (more) { rs = cs.getResultSet(); rs.next(); assertEquals("INFORMATION_SCHEMA",rs.getString(2)); } cs = conn.prepareCall( "call get_columns_and_table(?, ?)"); cs.setString(1, "TABLES"); cs.setString(2, "INFORMATION_SCHEMA"); isResult = cs.execute(); assertFalse(isResult); cs.getMoreResults(); rs = cs.getResultSet(); rs.next(); assertEquals("INFORMATION_SCHEMA", rs.getString(2)); rs.close(); more = cs.getMoreResults(); if (more) { rs = cs.getResultSet(); rs.next(); assertEquals("INFORMATION_SCHEMA",rs.getString(2)); } st = conn.createStatement(); isResult = st.execute( "call get_columns_and_table('TABLES', 'INFORMATION_SCHEMA')"); assertFalse(isResult); st.getMoreResults(); rs = st.getResultSet(); rs.next(); assertEquals("INFORMATION_SCHEMA", rs.getString(2)); rs.close(); more = st.getMoreResults(); if (more) { rs = st.getResultSet(); rs.next(); assertEquals("INFORMATION_SCHEMA",rs.getString(2)); } PreparedStatement ps = conn.prepareStatement( "call get_columns_and_table('TABLES', 'INFORMATION_SCHEMA')"); isResult = ps.execute(); assertFalse(isResult); ps.getMoreResults(); rs = ps.getResultSet(); rs.next(); assertEquals("INFORMATION_SCHEMA", rs.getString(2)); rs.close(); more = ps.getMoreResults(); if (more) { rs = ps.getResultSet(); rs.next(); assertEquals("INFORMATION_SCHEMA",rs.getString(2)); } } public static void procWithResultOne(Integer[] intparam, ResultSet[] resultparam) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection"); conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery( "select count(*) from information_schema.columns where table_name='LOB_IDS' and table_schema='SYSTEM_LOBS'"); if (rs.next()) { intparam[0] = rs.getInt(1); rs.close(); } resultparam[0] = st.executeQuery( "select table_schema, table_name from information_schema.tables where table_name='LOB_IDS' and table_schema='SYSTEM_LOBS'"); } public static void procWithResultTwo(Connection conn, Integer[] intparam, ResultSet[] resultparamOne, ResultSet[] resultparamTwo) throws SQLException { conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery( "select count(*) from information_schema.columns where table_name='LOB_IDS' and table_schema='SYSTEM_LOBS'"); if (rs.next()) { intparam[0] = rs.getInt(1); rs.close(); } resultparamOne[0] = st.executeQuery( "select table_schema, table_name from information_schema.tables where table_name='LOB_IDS' and table_schema='SYSTEM_LOBS'"); resultparamTwo[0] = st.executeQuery( "select table_schema, table_name from information_schema.tables where table_name='LOBS' and table_schema='SYSTEM_LOBS'"); } public static void procTest1(Connection conn) throws java.sql.SQLException { int cols; java.sql.Statement stmt = conn.createStatement(); stmt.execute("insert into mytable values(1,'test1');"); stmt.execute("insert into mytable values(2,'test2');"); java.sql.ResultSet rs = stmt.executeQuery("select * from mytable"); java.sql.ResultSetMetaData meta = rs.getMetaData(); cols = meta.getColumnCount(); rs.close(); stmt.close(); } public static void procTest2(int p1, int p2, Integer[] p3) throws java.sql.SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection"); java.sql.Statement stmt = conn.createStatement(); stmt.execute("insert into mytable values(" + p1 + ",'test1')"); stmt.execute("insert into mytable values(" + p2 + ",'test2')"); java.sql.ResultSet rs = stmt.executeQuery("select * from mytable"); java.sql.ResultSetMetaData meta = rs.getMetaData(); int cols = meta.getColumnCount(); p3[0] = Integer.valueOf(cols); rs.close(); stmt.close(); } public static ResultSet funcTest1(int p1, int p2) throws java.sql.SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection"); java.sql.PreparedStatement stmt = conn.prepareStatement( "select * from mytable where col1 = ? or col1 = ?"); stmt.setInt(1, p1); stmt.setInt(2, p2); java.sql.ResultSet rs = stmt.executeQuery(); return rs; } public static boolean funcTest2(Connection conn, String value) throws java.sql.SQLException { if (value != null && value.startsWith("te")) { return true; } return false; } public static void procTest3(Integer value) throws java.sql.SQLException { } public static void main(String[] args) throws Exception { TestResult result; TestCase test; java.util.Enumeration failures; int count; result = new TestResult(); test = new TestStoredProcedure("test"); test.run(result); count = result.failureCount(); System.out.println("TestStoredProcedure failure count: " + count); failures = result.failures(); while (failures.hasMoreElements()) { System.out.println(failures.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestBatchExecution.java0000644000175000017500000003464612007547410024342 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.hsqldb.lib.StopWatch; /** * A quick test of the new CompiledStatement and batch execution facilities. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.2 */ // fredt@users - modified to do some network connection and generated result tests public class TestBatchExecution extends TestBase { static final String drop_table_sql = "drop table test if exists"; static final String create_cached = "create cached "; static final String create_memory = "create memory "; static final String create_temp = "create temp "; static final String table_sql = "table test(id int identity primary key," + "fname varchar(20), lname " + "varchar(20), zip int)"; static final String insert_sql = "insert into test values(?,?,?,?)"; static final String update_sql = "update test set fname = 'Hans' where id = ?"; static final String select_sql = "select * from test where id = ?"; static final String delete_sql = "delete from test where id = ?"; static final String call_sql = "call identity()"; static final String shutdown_sql = "shutdown compact"; static final String def_db_path = "batchtest"; static final int def_runs = 5; static final int rows = 10000; static Connection conn; static Statement stmnt; static String url; public TestBatchExecution(String name) { super(name); } public void test() throws Exception { conn = newConnection(); stmnt = conn.createStatement(); url = super.url; nonPreparedTest(); preparedTestOne(5); } static void print(String s) { System.out.print(s); } static void println(String s) { System.out.println(s); } static void printCommandStats(StopWatch sw, String cmd, int count) { long et = sw.elapsedTime(); print(sw.elapsedTimeToMessage(count + " " + cmd)); println(" " + ((1000 * count) / et) + " ops/s."); } public static void main(String[] args) throws Exception { int runs; String db_path; Driver driver; runs = def_runs; db_path = def_db_path; try { runs = Integer.parseInt(args[0]); } catch (Exception e) {} db_path = "batchtest"; try { db_path = args[1]; } catch (Exception e) {} // get the connection and statement driver = (Driver) Class.forName("org.hsqldb.jdbc.JDBCDriver").newInstance(); DriverManager.registerDriver(driver); url = "jdbc:hsqldb:file:" + db_path + ";crypt_key=604a6105889da65326bf35790a923932;crypt_type=blowfish;hsqldb.default_table_type=cached;hsqldb.cache_rows=100" ; conn = DriverManager.getConnection(url, "SA", ""); stmnt = conn.createStatement(); runTests(runs); } static void runTests(int runs) throws Exception { println(""); println("***************************************"); println("featuring cached (persistent) table"); println("***************************************"); // drop and recreate the test table println(drop_table_sql); stmnt.execute(drop_table_sql); println(create_cached + table_sql); stmnt.execute(create_cached + table_sql); preparedTestOne(runs); // drop the test table and shut down database println(drop_table_sql); stmnt.execute(drop_table_sql); println("---------------------------------------"); println("shutting down database"); stmnt.execute(shutdown_sql); println("---------------------------------------"); // get the connection and statement conn = DriverManager.getConnection(url, "SA", ""); stmnt = conn.createStatement(); println(""); println("***************************************"); println("featuring memory (persistent) table"); println("***************************************"); // drop and recreate the test table println(drop_table_sql); stmnt.execute(drop_table_sql); println(create_memory + table_sql); stmnt.execute(create_memory + table_sql); preparedTestOne(runs); // drop the test table and shut down database println(drop_table_sql); stmnt.execute(drop_table_sql); println("---------------------------------------"); println("shutting down database"); stmnt.execute(shutdown_sql); println("---------------------------------------"); // get the connection and statement conn = DriverManager.getConnection(url, "SA", ""); stmnt = conn.createStatement(); println(""); println("***************************************"); println("featuring temp (transient) table"); println("***************************************"); // drop and recreate the test table println(drop_table_sql); stmnt.execute(drop_table_sql); println(create_temp + table_sql); stmnt.execute(create_temp + table_sql); preparedTestOne(runs); // drop the test table println(drop_table_sql); stmnt.execute(drop_table_sql); println("---------------------------------------"); println("shutting down database"); stmnt.execute(shutdown_sql); println("---------------------------------------"); // preparedTestTwo(); preparedTestThree(); } public static void nonPreparedTest() throws Exception { stmnt.addBatch(drop_table_sql); stmnt.addBatch(create_memory + table_sql); stmnt.executeBatch(); } public static void preparedTestOne(int runs) throws Exception { PreparedStatement insertStmnt; PreparedStatement updateStmnt; PreparedStatement selectStmnt; PreparedStatement deleteStmnt; PreparedStatement callStmnt; StopWatch sw; println("---------------------------------------"); println("Preparing Statements:"); println("---------------------------------------"); println(insert_sql); println(update_sql); println(select_sql); println(delete_sql); println(call_sql); sw = new StopWatch(); // prepare the statements insertStmnt = conn.prepareStatement(insert_sql, Statement.RETURN_GENERATED_KEYS); updateStmnt = conn.prepareStatement(update_sql); selectStmnt = conn.prepareStatement(select_sql); deleteStmnt = conn.prepareStatement(delete_sql); callStmnt = conn.prepareCall(call_sql); println("---------------------------------------"); println(sw.elapsedTimeToMessage("statements prepared")); println("---------------------------------------"); sw.zero(); // set up the batch data for (int i = 0; i < rows; i++) { insertStmnt.setInt(1, i); insertStmnt.setString(2, "Julia"); insertStmnt.setString(3, "Peterson-Clancy"); insertStmnt.setInt(4, i); updateStmnt.setInt(1, i); selectStmnt.setInt(1, i); deleteStmnt.setInt(1, i); insertStmnt.addBatch(); updateStmnt.addBatch(); selectStmnt.addBatch(); deleteStmnt.addBatch(); callStmnt.addBatch(); } println("---------------------------------------"); println(sw.elapsedTimeToMessage("" + 5 * rows + " batch entries created")); sw.zero(); // do the test loop forever for (int i = 0; i < 1; i++) { println("---------------------------------------"); // inserts sw.zero(); insertStmnt.executeBatch(); printCommandStats(sw, "inserts", rows); ResultSet generated = insertStmnt.getGeneratedKeys(); StringBuffer sb = new StringBuffer(); int genCount = 0; while (generated.next()) { int gen = generated.getInt(1); if (gen % 1000 == 0) { sb.append(gen).append(" - "); } genCount++; } System.out.println(sb.toString()); printCommandStats(sw, "generated reads", genCount); // updates sw.zero(); int[] updateCounts = updateStmnt.executeBatch(); printCommandStats(sw, "updates", updateCounts.length); // selects sw.zero(); // selectStmnt.executeBatch(); // printCommandStats(sw, "selects"); // deletes sw.zero(); updateCounts = deleteStmnt.executeBatch(); printCommandStats(sw, "deletes", updateCounts.length); // calls sw.zero(); // callStmnt.executeBatch(); // printCommandStats(sw, "calls "); } } public static void preparedTestTwo() { System.out.println("preparedTestTwo"); try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); Connection con = DriverManager.getConnection("jdbc:hsqldb:mem:.", "sa", ""); System.out.println("con=" + con); Statement stmt = con.createStatement(); try { stmt.executeUpdate("drop table ttt"); } catch (Exception e) {} stmt.executeUpdate("create table ttt (id integer)"); PreparedStatement prep = con.prepareStatement("INSERT INTO ttt (id) VALUES (?)"); con.setAutoCommit(false); for (int i = 1; i <= 4; i++) { // [2, 3, 4] prep.setInt(1, i); prep.addBatch(); System.out.println("executeBatch() for " + i); prep.executeBatch(); con.commit(); // prep.clearBatch(); // -> java.lang.NullPointerException // at org.hsqldb.Result.getUpdateCounts(Unknown Source) } prep.close(); // see what we got ResultSet rs = stmt.executeQuery("select * from ttt"); while (rs.next()) { System.out.println("id = " + rs.getInt(1)); } System.out.println("bye."); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static void preparedTestThree() { System.out.println("preparedTestThree"); try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); Connection con = DriverManager.getConnection("jdbc:hsqldb:mem:.", "sa", ""); con.setAutoCommit(false); System.out.println("con=" + con); Statement stmt = con.createStatement(); try { stmt.executeUpdate("drop table node"); } catch (Exception e) {} stmt.executeUpdate( "create table Node (id varbinary(255) not null, name varchar(255), primary key (id))"); PreparedStatement prep = con.prepareStatement( "insert into Node (name, id) values (?, ?)"); byte[] byteArray = null; try { byteArray = org.hsqldb.lib.StringConverter.hexStringToByteArray( "c0a8000a30d110808130d18080880000"); } catch (Exception e) {} ; prep.setNull(1, java.sql.Types.VARCHAR); prep.setBytes(2, byteArray); int result = prep.executeUpdate(); prep.close(); prep = con.prepareStatement("delete from Node where id=?"); prep.setBytes(1, byteArray); prep.addBatch(); System.out.println("executeBatch() for delete"); prep.executeBatch(); con.commit(); // prep.clearBatch(); // -> java.lang.NullPointerException // at org.hsqldb.Result.getUpdateCounts(Unknown Source) prep.close(); // see what we got ResultSet rs = stmt.executeQuery("select * from Node"); while (rs.next()) { System.out.println("row retreived"); } System.out.println("bye."); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/test/TestNullInUnion.java0000644000175000017500000000713512007547406023645 0ustar renerene/* Copyright (c) 2001-2009, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import junit.framework.TestCase; public class TestNullInUnion extends TestCase { public void testUnionSubquery() throws Exception { Class.forName("org.hsqldb.jdbcDriver").newInstance(); Connection con = DriverManager.getConnection("jdbc:hsqldb:mem:test", "sa", ""); Statement st = con.createStatement(); st.execute( "CREATE TABLE t1 (id int not null, v1 int, v2 int, primary key(id))"); st.execute( "CREATE TABLE t2 (id int not null, v1 int, v3 int, primary key(id))"); st.execute("INSERT INTO t1 values(1,1,1)"); st.execute("INSERT INTO t1 values(2,2,2)"); st.execute("INSERT INTO t2 values(1,3,3)"); ResultSet rs = st.executeQuery( "select t as atable, a as idvalue, b as value1, c as value2, d as value3 from(" + "(select 't1' as t, t1.id as a, t1.v1 as b, t1.v2 as c, null as d from t1) union" + "(select 't2' as t, t2.id as a, t2.v1 as b, null as c, t2.v3 as d from t2)) order by atable, idvalue"); assertTrue(rs.next()); assertEquals("t1", rs.getObject("atable")); assertEquals(1, rs.getInt("idvalue")); assertEquals(1, rs.getInt("value1")); assertEquals(1, rs.getInt("value2")); assertEquals(null, rs.getObject("value3")); assertTrue(rs.next()); assertEquals("t1", rs.getObject("atable")); assertEquals(2, rs.getInt("idvalue")); assertEquals(2, rs.getInt("value1")); assertEquals(2, rs.getInt("value2")); assertEquals(null, rs.getObject("value3")); assertTrue(rs.next()); assertEquals("t2", rs.getObject("atable")); assertEquals(1, rs.getInt("idvalue")); assertEquals(3, rs.getInt("value1")); assertEquals(null, rs.getObject("value2")); assertEquals(3, rs.getInt("value3")); //this fails! assertFalse(rs.next()); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/SortAndSlice.java0000644000175000017500000003327212007547370022147 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.types.Collation; import org.hsqldb.types.Type; /* * Implementation of ORDER BY and LIMIT properties of query expressions. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public final class SortAndSlice { static final SortAndSlice noSort = new SortAndSlice(); static final int[] defaultLimits = new int[] { 0, Integer.MAX_VALUE, Integer.MAX_VALUE }; // public int[] sortOrder; public boolean[] sortDescending; public boolean[] sortNullsLast; public Collation[] collations; boolean sortUnion; HsqlArrayList exprList = new HsqlArrayList(); ExpressionOp limitCondition; int columnCount; boolean hasNullsLast; boolean strictLimit; boolean zeroLimit; boolean usingIndex; boolean allDescending; public boolean skipSort = false; // true when result can be used as is public boolean skipFullResult = false; // true when result can be sliced as is public Index index; public Table primaryTable; public Index primaryTableIndex; public int[] colIndexes; public boolean isGenerated; public SortAndSlice() {} public HsqlArrayList getExpressionList() { return exprList; } public boolean hasOrder() { return exprList.size() != 0; } public boolean hasLimit() { return limitCondition != null; } public int getOrderLength() { return exprList.size(); } public void addOrderExpression(Expression e) { exprList.add(e); } public void addLimitCondition(ExpressionOp expression) { limitCondition = expression; } public void setStrictLimit() { strictLimit = true; } public void setZeroLimit() { zeroLimit = true; } public void setUsingIndex() { usingIndex = true; } public void prepareSingleColumn(int colIndex) { sortOrder = new int[1]; sortDescending = new boolean[1]; sortNullsLast = new boolean[1]; sortOrder[0] = colIndex; } public void prepareMultiColumn(int count) { sortOrder = new int[count]; sortDescending = new boolean[count]; sortNullsLast = new boolean[count]; for (int i = 0; i < count; i++) { sortOrder[i] = i; } } public void prepare(int degree) { columnCount = exprList.size(); if (columnCount == 0) { return; } sortOrder = new int[columnCount + degree]; sortDescending = new boolean[columnCount + degree]; sortNullsLast = new boolean[columnCount + degree]; ArrayUtil.fillSequence(sortOrder); for (int i = 0; i < columnCount; i++) { ExpressionOrderBy sort = (ExpressionOrderBy) exprList.get(i); sortDescending[i] = sort.isDescending(); sortNullsLast[i] = sort.isNullsLast(); hasNullsLast |= sortNullsLast[i]; } } public void prepare(QuerySpecification select) { columnCount = exprList.size(); if (columnCount == 0) { return; } sortOrder = new int[columnCount]; sortDescending = new boolean[columnCount]; sortNullsLast = new boolean[columnCount]; for (int i = 0; i < columnCount; i++) { ExpressionOrderBy sort = (ExpressionOrderBy) exprList.get(i); if (sort.getLeftNode().queryTableColumnIndex == -1) { sortOrder[i] = select.indexStartOrderBy + i; } else { sortOrder[i] = sort.getLeftNode().queryTableColumnIndex; } sortDescending[i] = sort.isDescending(); sortNullsLast[i] = sort.isNullsLast(); hasNullsLast |= sortNullsLast[i]; if (sort.collation != null) { if (collations == null) { collations = new Collation[columnCount]; } collations[i] = sort.collation; } } } void setSortIndex(QuerySpecification select) { if (isGenerated) { return; } for (int i = 0; i < columnCount; i++) { ExpressionOrderBy sort = (ExpressionOrderBy) exprList.get(i); Type dataType = sort.getLeftNode().getDataType(); if (dataType.isArrayType() || dataType.isLobType()) { throw Error.error(ErrorCode.X_42534); } } if (select.isDistinctSelect || select.isGrouped || select.isAggregated) { return; } if (columnCount == 0) { if (limitCondition == null) { return; } skipFullResult = true; return; } if (select == null) { return; } if (collations != null) { return; } colIndexes = new int[columnCount]; boolean isNullable = false; for (int i = 0; i < columnCount; i++) { Expression e = ((Expression) exprList.get(i)).getLeftNode(); if (e.getType() != OpTypes.COLUMN) { return; } if (((ExpressionColumn) e).getRangeVariable() != select.rangeVariables[0]) { return; } colIndexes[i] = e.columnIndex; if (e.getColumn().getNullability() != SchemaObject.Nullability.NO_NULLS) { isNullable = true; } } if (hasNullsLast && isNullable) { return; } int count = ArrayUtil.countTrueElements(sortDescending); allDescending = count == columnCount; if (!allDescending && count > 0) { return; } primaryTable = select.rangeVariables[0].getTable(); primaryTableIndex = primaryTable.getFullIndexForColumns(colIndexes); } void setSortRange(QuerySpecification select) { if (primaryTableIndex == null) { return; } Index rangeIndex = select.rangeVariables[0].getSortIndex(); if (rangeIndex == null) { // multi-index return; } if (primaryTable != select.rangeVariables[0].rangeTable) { return; } if (rangeIndex == primaryTableIndex) { if (allDescending) { boolean reversed = select.rangeVariables[0].reverseOrder(); if (!reversed) { return; } } skipSort = true; skipFullResult = true; } else if (!select.rangeVariables[0].joinConditions[0] .hasIndexCondition()) { if (select.rangeVariables[0].setSortIndex(primaryTableIndex, allDescending)) { skipSort = true; skipFullResult = true; } } } public boolean prepareSpecial(Session session, QuerySpecification select) { Expression e = select.exprColumns[select.indexStartAggregates]; int opType = e.getType(); e = e.getLeftNode(); if (e.getType() != OpTypes.COLUMN) { return false; } if (((ExpressionColumn) e).getRangeVariable() != select.rangeVariables[0]) { return false; } Index rangeIndex = select.rangeVariables[0].getSortIndex(); if (rangeIndex == null) { return false; } if (select.rangeVariables[0].hasSingleIndexCondition()) { int[] colIndexes = rangeIndex.getColumns(); if (colIndexes[0] != ((ExpressionColumn) e).getColumnIndex()) { return false; } if (opType == OpTypes.MAX) { select.rangeVariables[0].reverseOrder(); } } else if (select.rangeVariables[0].hasAnyIndexCondition()) { return false; } else { Table table = select.rangeVariables[0].getTable(); Index index = table.getIndexForColumn( session, ((ExpressionColumn) e).getColumnIndex()); if (index == null) { return false; } Expression[] conditions = new Expression[]{ ExpressionLogical.newNotNullCondition(e) }; select.rangeVariables[0].joinConditions[0].addIndexCondition( conditions, index, 1); if (opType == OpTypes.MAX) { select.rangeVariables[0].reverseOrder(); } } columnCount = 1; sortOrder = new int[columnCount]; sortDescending = new boolean[columnCount]; sortNullsLast = new boolean[columnCount]; skipSort = true; skipFullResult = true; return true; } int[] getLimits(Session session, QueryExpression qe, int maxRows) { int skipRows = 0; int limitRows = Integer.MAX_VALUE; int limitFetch = Integer.MAX_VALUE; boolean hasLimits = false; if (hasLimit()) { Integer value = (Integer) limitCondition.getLeftNode().getValue(session); if (value == null || value.intValue() < 0) { throw Error.error(ErrorCode.X_2201X); } skipRows = value.intValue(); hasLimits = skipRows != 0; if (limitCondition.getRightNode() != null) { value = (Integer) limitCondition.getRightNode().getValue(session); if (value == null || value.intValue() < 0 || (strictLimit && value.intValue() == 0)) { throw Error.error(ErrorCode.X_2201W); } if (value.intValue() == 0 && !zeroLimit) { limitRows = Integer.MAX_VALUE; } else { limitRows = value.intValue(); hasLimits = true; } } } if (maxRows != 0) { if (maxRows < limitRows) { limitRows = maxRows; } hasLimits = true; } boolean simpleLimit = false; if (qe instanceof QuerySpecification) { QuerySpecification qs = (QuerySpecification) qe; if (!qs.isDistinctSelect && !qs.isGrouped) { simpleLimit = true; } } if (hasLimits) { if (simpleLimit && (!hasOrder() || skipSort) && (!hasLimit() || skipFullResult)) { if (limitFetch - skipRows > limitRows) { limitFetch = skipRows + limitRows; } } return new int[] { skipRows, limitRows, limitFetch }; } return defaultLimits; } public void setIndex(Session session, TableBase table) { index = getNewIndex(session, table); } public Index getNewIndex(Session session, TableBase table) { if (hasOrder()) { Index orderIndex = table.createAndAddIndexStructure(null, sortOrder, sortDescending, sortNullsLast, false, false, false); if (collations != null) { for (int i = 0; i < columnCount; i++) { if (collations[i] != null) { Type type = orderIndex.getColumnTypes()[i]; type = Type.getType(type.typeCode, type.getCharacterSet(), collations[i], type.precision, type.scale); orderIndex.getColumnTypes()[i] = type; } } } return orderIndex; } return null; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TransactionManager.java0000644000175000017500000000716012007547376023400 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.persist.CachedObject; import org.hsqldb.persist.PersistentStore; /** * Manages rows involved in transactions * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 2.0.0 */ public interface TransactionManager { // public int LOCKS = 0; public int MVLOCKS = 1; public int MVCC = 2; // public int ACTION_READ = 0; public int ACTION_DUP = 1; public int ACTION_REF = 2; public long getGlobalChangeTimestamp(); public RowAction addDeleteAction(Session session, Table table, Row row, int[] colMap); public void addInsertAction(Session session, Table table, PersistentStore store, Row row, int[] changedColumns); /** * add session to the end of queue when a transaction starts * (depending on isolation mode) */ public void beginAction(Session session, Statement cs); public void beginActionResume(Session session); public void beginTransaction(Session session); // functional unit - accessibility of rows public boolean canRead(Session session, Row row, int mode, int[] colMap); public boolean canRead(Session session, long id, int mode); public boolean commitTransaction(Session session); public void completeActions(Session session); public int getTransactionControl(); public boolean isMVRows(); public boolean isMVCC(); public boolean prepareCommitActions(Session session); public void rollback(Session session); public void rollbackAction(Session session); public void rollbackSavepoint(Session session, int index); public void setTransactionControl(Session session, int mode); /** * add transaction info to a row just loaded from the cache. called only * for CACHED tables */ public void setTransactionInfo(CachedObject object); /** * remove the transaction info */ public void removeTransactionInfo(CachedObject object); } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/Expression.java0000644000175000017500000016633512007547374021767 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.HsqlNameManager.SimpleName; import org.hsqldb.ParserDQL.CompileContext; import org.hsqldb.RangeGroup.RangeGroupSimple; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.index.Index; import org.hsqldb.lib.ArrayListIdentity; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.HsqlList; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.OrderedIntHashSet; import org.hsqldb.lib.Set; import org.hsqldb.navigator.RowSetNavigatorData; import org.hsqldb.persist.PersistentStore; import org.hsqldb.result.Result; import org.hsqldb.types.ArrayType; import org.hsqldb.types.CharacterType; import org.hsqldb.types.Collation; import org.hsqldb.types.NullType; import org.hsqldb.types.Type; import org.hsqldb.types.Types; /** * Expression class. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class Expression implements Cloneable { public static final int LEFT = 0; public static final int RIGHT = 1; public static final int UNARY = 1; public static final int BINARY = 2; public static final int TERNARY = 3; // // static final Expression[] emptyArray = new Expression[]{}; // static final Expression EXPR_TRUE = new ExpressionLogical(true); static final Expression EXPR_FALSE = new ExpressionLogical(false); // static final OrderedIntHashSet aggregateFunctionSet = new OrderedIntHashSet(); static { aggregateFunctionSet.add(OpTypes.COUNT); aggregateFunctionSet.add(OpTypes.SUM); aggregateFunctionSet.add(OpTypes.MIN); aggregateFunctionSet.add(OpTypes.MAX); aggregateFunctionSet.add(OpTypes.AVG); aggregateFunctionSet.add(OpTypes.EVERY); aggregateFunctionSet.add(OpTypes.SOME); aggregateFunctionSet.add(OpTypes.STDDEV_POP); aggregateFunctionSet.add(OpTypes.STDDEV_SAMP); aggregateFunctionSet.add(OpTypes.VAR_POP); aggregateFunctionSet.add(OpTypes.VAR_SAMP); aggregateFunctionSet.add(OpTypes.GROUP_CONCAT); aggregateFunctionSet.add(OpTypes.ARRAY_AGG); aggregateFunctionSet.add(OpTypes.MEDIAN); aggregateFunctionSet.add(OpTypes.USER_AGGREGATE); } static final OrderedIntHashSet columnExpressionSet = new OrderedIntHashSet(); static { columnExpressionSet.add(OpTypes.COLUMN); } static final OrderedIntHashSet subqueryExpressionSet = new OrderedIntHashSet(); static { subqueryExpressionSet.add(OpTypes.ROW_SUBQUERY); subqueryExpressionSet.add(OpTypes.TABLE_SUBQUERY); } static final OrderedIntHashSet subqueryAggregateExpressionSet = new OrderedIntHashSet(); static { subqueryAggregateExpressionSet.add(OpTypes.COUNT); subqueryAggregateExpressionSet.add(OpTypes.SUM); subqueryAggregateExpressionSet.add(OpTypes.MIN); subqueryAggregateExpressionSet.add(OpTypes.MAX); subqueryAggregateExpressionSet.add(OpTypes.AVG); subqueryAggregateExpressionSet.add(OpTypes.EVERY); subqueryAggregateExpressionSet.add(OpTypes.SOME); subqueryAggregateExpressionSet.add(OpTypes.STDDEV_POP); subqueryAggregateExpressionSet.add(OpTypes.STDDEV_SAMP); subqueryAggregateExpressionSet.add(OpTypes.VAR_POP); subqueryAggregateExpressionSet.add(OpTypes.VAR_SAMP); subqueryAggregateExpressionSet.add(OpTypes.GROUP_CONCAT); subqueryAggregateExpressionSet.add(OpTypes.ARRAY_AGG); subqueryAggregateExpressionSet.add(OpTypes.MEDIAN); subqueryAggregateExpressionSet.add(OpTypes.USER_AGGREGATE); // subqueryAggregateExpressionSet.add(OpTypes.TABLE_SUBQUERY); subqueryAggregateExpressionSet.add(OpTypes.ROW_SUBQUERY); } static final OrderedIntHashSet functionExpressionSet = new OrderedIntHashSet(); static { functionExpressionSet.add(OpTypes.SQL_FUNCTION); functionExpressionSet.add(OpTypes.FUNCTION); } static final OrderedIntHashSet emptyExpressionSet = new OrderedIntHashSet(); // type protected int opType; // type qualifier protected int exprSubType; // SimpleName alias; // aggregate private boolean isAggregate; // VALUE protected Object valueData; protected Expression[] nodes; Type[] nodeDataTypes; TableDerived table; // for query and value lists, etc boolean isCorrelated; // for COLUMN int columnIndex = -1; // data type protected Type dataType; // int queryTableColumnIndex = -1; // >= 0 when it is used for order by // index of a session-dependent field int parameterIndex = -1; // int rangePosition = -1; // boolean isColumnCondition; boolean isColumnEqual; boolean isSingleColumnCondition; boolean isSingleColumnEqual; boolean isSingleColumnNull; boolean isSingleColumnNotNull; byte nullability = SchemaObject.Nullability.NULLABLE_UNKNOWN; // Collation collation; Expression(int type) { opType = type; nodes = emptyArray; } // IN condition optimisation /** * Creates a SUBQUERY expression. */ Expression(int type, TableDerived table) { switch (type) { case OpTypes.ARRAY : opType = OpTypes.ARRAY; break; case OpTypes.ARRAY_SUBQUERY : opType = OpTypes.ARRAY_SUBQUERY; break; case OpTypes.TABLE_SUBQUERY : opType = OpTypes.TABLE_SUBQUERY; break; case OpTypes.ROW_SUBQUERY : case OpTypes.SCALAR_SUBQUERY : opType = OpTypes.ROW_SUBQUERY; break; default : throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } nodes = emptyArray; this.table = table; } /** * ROW, ARRAY etc. */ Expression(int type, Expression[] list) { this(type); this.nodes = list; } static String getContextSQL(Expression expression) { if (expression == null) { return null; } String ddl = expression.getSQL(); switch (expression.opType) { case OpTypes.VALUE : case OpTypes.COLUMN : case OpTypes.ROW : case OpTypes.FUNCTION : case OpTypes.SQL_FUNCTION : case OpTypes.ALTERNATIVE : case OpTypes.CASEWHEN : case OpTypes.CAST : return ddl; } StringBuffer sb = new StringBuffer(); ddl = sb.append('(').append(ddl).append(')').toString(); return ddl; } /** * For use with CHECK constraints. Under development. * * Currently supports a subset of expressions and is suitable for CHECK * search conditions that refer only to the inserted/updated row. * * For full DDL reporting of VIEW select queries and CHECK search * conditions, future improvements here are dependent upon improvements to * SELECT query parsing, so that it is performed in a number of passes. * An early pass should result in the query turned into an Expression tree * that contains the information in the original SQL without any * alterations, and with tables and columns all resolved. This Expression * can then be preserved for future use. Table and column names that * are not user-defined aliases should be kept as the HsqlName structures * so that table or column renaming is reflected in the precompiled * query. */ public String getSQL() { StringBuffer sb = new StringBuffer(64); switch (opType) { case OpTypes.VALUE : if (valueData == null) { return Tokens.T_NULL; } return dataType.convertToSQLString(valueData); case OpTypes.ROW : sb.append('('); for (int i = 0; i < nodes.length; i++) { if (i > 0) { sb.append(','); } sb.append(nodes[i].getSQL()); } sb.append(')'); return sb.toString(); // case OpTypes.VALUELIST : for (int i = 0; i < nodes.length; i++) { if (i > 0) { sb.append(','); } sb.append(nodes[i].getSQL()); } return sb.toString(); } switch (opType) { case OpTypes.ARRAY : sb.append(Tokens.T_ARRAY).append('['); for (int i = 0; i < nodes.length; i++) { if (i > 0) { sb.append(','); } sb.append(nodes[i].getSQL()); } sb.append(']'); break; case OpTypes.ARRAY_SUBQUERY : // case OpTypes.ROW_SUBQUERY : case OpTypes.TABLE_SUBQUERY : sb.append('('); sb.append(')'); break; default : throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } return sb.toString(); } protected String describe(Session session, int blanks) { StringBuffer sb = new StringBuffer(64); sb.append('\n'); for (int i = 0; i < blanks; i++) { sb.append(' '); } switch (opType) { case OpTypes.VALUE : sb.append("VALUE = ").append( dataType.convertToSQLString(valueData)); sb.append(", TYPE = ").append(dataType.getNameString()); return sb.toString(); case OpTypes.ARRAY : sb.append("ARRAY "); return sb.toString(); case OpTypes.ARRAY_SUBQUERY : sb.append("ARRAY SUBQUERY"); return sb.toString(); // case OpTypes.ROW_SUBQUERY : case OpTypes.TABLE_SUBQUERY : sb.append("QUERY "); sb.append(table.queryExpression.describe(session, blanks)); return sb.toString(); case OpTypes.ROW : sb.append("ROW = "); for (int i = 0; i < nodes.length; i++) { sb.append(nodes[i].describe(session, blanks + 1)); sb.append(' '); } break; case OpTypes.VALUELIST : sb.append("VALUELIST "); for (int i = 0; i < nodes.length; i++) { sb.append(nodes[i].describe(session, blanks + 1)); sb.append(' '); } break; } return sb.toString(); } /** * Set the data type */ void setDataType(Session session, Type type) { if (opType == OpTypes.VALUE) { valueData = type.convertToType(session, valueData, dataType); } dataType = type; } public boolean equals(Expression other) { if (other == this) { return true; } if (other == null) { return false; } if (opType != other.opType || exprSubType != other.exprSubType || !equals(dataType, other.dataType)) { return false; } switch (opType) { case OpTypes.SIMPLE_COLUMN : return this.columnIndex == other.columnIndex; case OpTypes.VALUE : return equals(valueData, other.valueData); case OpTypes.ARRAY : // case OpTypes.ARRAY_SUBQUERY : case OpTypes.ROW_SUBQUERY : case OpTypes.TABLE_SUBQUERY : return (table.queryExpression.isEquivalent( other.table.queryExpression)); default : return equals(nodes, other.nodes); } } public boolean equals(Object other) { if (other == this) { return true; } if (other instanceof Expression) { return equals((Expression) other); } return false; } public int hashCode() { int val = opType + exprSubType; for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { val += nodes[i].hashCode(); } } return val; } static boolean equals(Object o1, Object o2) { if (o1 == o2) { return true; } return (o1 == null) ? o2 == null : o1.equals(o2); } static boolean equals(Expression[] row1, Expression[] row2) { if (row1 == row2) { return true; } if (row1.length != row2.length) { return false; } int len = row1.length; for (int i = 0; i < len; i++) { Expression e1 = row1[i]; Expression e2 = row2[i]; boolean equals = (e1 == null) ? e2 == null : e1.equals(e2); if (!equals) { return false; } } return true; } /** * For GROUP only. */ boolean isComposedOf(Expression exprList[], int start, int end, OrderedIntHashSet excludeSet) { switch (opType) { case OpTypes.VALUE : case OpTypes.DYNAMIC_PARAM : case OpTypes.PARAMETER : case OpTypes.VARIABLE : { return true; } } if (excludeSet.contains(opType)) { return true; } for (int i = start; i < end; i++) { if (equals(exprList[i])) { return true; } } switch (opType) { case OpTypes.LIKE : case OpTypes.MATCH_SIMPLE : case OpTypes.MATCH_PARTIAL : case OpTypes.MATCH_FULL : case OpTypes.MATCH_UNIQUE_SIMPLE : case OpTypes.MATCH_UNIQUE_PARTIAL : case OpTypes.MATCH_UNIQUE_FULL : case OpTypes.UNIQUE : case OpTypes.EXISTS : case OpTypes.ARRAY : case OpTypes.ARRAY_SUBQUERY : case OpTypes.TABLE_SUBQUERY : // case OpTypes.COUNT : case OpTypes.SUM : case OpTypes.MIN : case OpTypes.MAX : case OpTypes.AVG : case OpTypes.EVERY : case OpTypes.SOME : case OpTypes.STDDEV_POP : case OpTypes.STDDEV_SAMP : case OpTypes.VAR_POP : case OpTypes.VAR_SAMP : return false; case OpTypes.ROW_SUBQUERY : { if (table == null) { break; } if (!(table.getQueryExpression() instanceof QuerySpecification)) { return false; } QuerySpecification qs = (QuerySpecification) table.getQueryExpression(); OrderedHashSet set = new OrderedHashSet(); for (int i = start; i < end; i++) { if (exprList[i].opType == OpTypes.COLUMN) { set.add(exprList[i]); } } return qs.collectOuterColumnExpressions(null, set) == null; } } if (nodes.length == 0) { return false; } boolean result = true; for (int i = 0; i < nodes.length; i++) { result &= (nodes[i] == null || nodes[i].isComposedOf(exprList, start, end, excludeSet)); } return result; } /** * For HAVING only. */ boolean isComposedOf(OrderedHashSet expressions, RangeGroup[] rangeGroups, OrderedIntHashSet excludeSet) { if (opType == OpTypes.VALUE || opType == OpTypes.DYNAMIC_PARAM || opType == OpTypes.PARAMETER || opType == OpTypes.VARIABLE) { return true; } if (excludeSet.contains(opType)) { return true; } for (int i = 0; i < expressions.size(); i++) { if (equals(expressions.get(i))) { return true; } } if (opType == OpTypes.COLUMN) { for (int i = 0; i < rangeGroups.length; i++) { RangeVariable[] ranges = rangeGroups[i].getRangeVariables(); for (int j = 0; j < ranges.length; j++) { if (ranges[j] == getRangeVariable()) { return true; } } } } switch (opType) { case OpTypes.COUNT : case OpTypes.SUM : case OpTypes.MIN : case OpTypes.MAX : case OpTypes.AVG : case OpTypes.EVERY : case OpTypes.SOME : case OpTypes.STDDEV_POP : case OpTypes.STDDEV_SAMP : case OpTypes.VAR_POP : case OpTypes.VAR_SAMP : return false; } /* case OpCodes.LIKE : case OpCodes.ALL : case OpCodes.ANY : case OpCodes.IN : case OpCodes.MATCH_SIMPLE : case OpCodes.MATCH_PARTIAL : case OpCodes.MATCH_FULL : case OpCodes.MATCH_UNIQUE_SIMPLE : case OpCodes.MATCH_UNIQUE_PARTIAL : case OpCodes.MATCH_UNIQUE_FULL : case OpCodes.UNIQUE : case OpCodes.EXISTS : case OpCodes.TABLE_SUBQUERY : case OpCodes.ROW_SUBQUERY : */ if (nodes.length == 0) { return false; } boolean result = true; for (int i = 0; i < nodes.length; i++) { result &= (nodes[i] == null || nodes[i].isComposedOf(expressions, rangeGroups, excludeSet)); } return result; } Expression replaceColumnReferences(RangeVariable range, Expression[] list) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } nodes[i] = nodes[i].replaceColumnReferences(range, list); } if (table != null && table.queryExpression != null) { table.queryExpression.replaceColumnReferences(range, list); } return this; } void replaceRangeVariables(RangeVariable[] ranges, RangeVariable[] newRanges) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } nodes[i].replaceRangeVariables(ranges, newRanges); } if (table != null && table.queryExpression != null) { table.queryExpression.replaceRangeVariables(ranges, newRanges); } } void resetColumnReferences() { for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } nodes[i].resetColumnReferences(); } } void convertToSimpleColumn(OrderedHashSet expressions, OrderedHashSet replacements) { if (opType == OpTypes.VALUE) { return; } if (opType == OpTypes.SIMPLE_COLUMN) { return; } int index = expressions.getIndex(this); if (index != -1) { Expression e = (Expression) replacements.get(index); nodes = emptyArray; opType = OpTypes.SIMPLE_COLUMN; columnIndex = e.columnIndex; rangePosition = e.rangePosition; return; } for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } nodes[i].convertToSimpleColumn(expressions, replacements); } if (table != null) { if (table.queryExpression != null) { OrderedHashSet set = new OrderedHashSet(); table.queryExpression.collectAllExpressions(set, Expression.columnExpressionSet, Expression.emptyExpressionSet); for (int i = 0; i < set.size(); i++) { Expression e = (Expression) set.get(i); e.convertToSimpleColumn(expressions, replacements); } } } } boolean isAggregate() { return isAggregate; } void setAggregate() { isAggregate = true; } boolean isSelfAggregate() { return false; } /** * Set the column alias */ void setAlias(SimpleName name) { alias = name; } /** * Get the column alias */ String getAlias() { if (alias != null) { return alias.name; } return ""; } SimpleName getSimpleName() { if (alias != null) { return alias; } return null; } /** * Returns the type of expression */ public int getType() { return opType; } /** * Returns the left node */ Expression getLeftNode() { return nodes.length > 0 ? nodes[LEFT] : null; } /** * Returns the right node */ Expression getRightNode() { return nodes.length > 1 ? nodes[RIGHT] : null; } void setLeftNode(Expression e) { nodes[LEFT] = e; } void setRightNode(Expression e) { nodes[RIGHT] = e; } void setSubType(int subType) { exprSubType = subType; } /** * Returns the range variable for a COLUMN expression */ RangeVariable getRangeVariable() { return null; } /** * return the expression for an alias used in an ORDER BY clause */ Expression replaceAliasInOrderBy(Expression[] columns, int length) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } nodes[i] = nodes[i].replaceAliasInOrderBy(columns, length); } return this; } /** * collects all range variables in expression tree */ OrderedHashSet collectRangeVariables(RangeVariable[] rangeVariables, OrderedHashSet set) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { set = nodes[i].collectRangeVariables(rangeVariables, set); } } if (table != null && table.queryExpression != null) { set = table.queryExpression.collectRangeVariables(rangeVariables, set); } return set; } /** * collects all schema objects */ void collectObjectNames(Set set) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { nodes[i].collectObjectNames(set); } } if (table != null) { if (table.queryExpression != null) { table.queryExpression.collectObjectNames(set); } } } /** * return true if given RangeVariable is used in expression tree */ boolean hasReference(RangeVariable range) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { if (nodes[i].hasReference(range)) { return true; } } } if (table != null && table.queryExpression != null) { if (table.queryExpression.hasReference(range)) { return true; } } return false; } /** * return true if given RangeVariable is used in expression tree */ boolean hasReference(RangeVariable[] ranges, int exclude) { OrderedHashSet set = collectRangeVariables(ranges, null); if (set == null) { return false; } for (int j = 0; j < set.size(); j++) { if (set.get(j) != ranges[exclude]) { return true; } } return false; } /** * resolve tables and collect unresolved column expressions */ public HsqlList resolveColumnReferences(Session session, RangeGroup rangeGroup, RangeGroup[] rangeGroups, HsqlList unresolvedSet) { return resolveColumnReferences(session, rangeGroup, rangeGroup.getRangeVariables().length, rangeGroups, unresolvedSet, true); } public HsqlList resolveColumnReferences(Session session, RangeGroup rangeGroup, int rangeCount, RangeGroup[] rangeGroups, HsqlList unresolvedSet, boolean acceptsSequences) { if (opType == OpTypes.VALUE) { return unresolvedSet; } switch (opType) { case OpTypes.TABLE : case OpTypes.VALUELIST : { if (table != null) { if (rangeGroup.getRangeVariables().length > rangeCount) { RangeVariable[] rangeVars = (RangeVariable[]) ArrayUtil.resizeArray( rangeGroup.getRangeVariables(), rangeCount); rangeGroup = new RangeGroupSimple(rangeVars, rangeGroup); } rangeGroups = (RangeGroup[]) ArrayUtil.toAdjustedArray(rangeGroups, rangeGroup, rangeGroups.length, 1); rangeGroup = new RangeGroupSimple(table); rangeCount = 0; } for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } unresolvedSet = nodes[i].resolveColumnReferences(session, rangeGroup, rangeCount, rangeGroups, unresolvedSet, acceptsSequences); } return unresolvedSet; } } for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } unresolvedSet = nodes[i].resolveColumnReferences(session, rangeGroup, rangeCount, rangeGroups, unresolvedSet, acceptsSequences); } switch (opType) { case OpTypes.ARRAY : break; case OpTypes.ARRAY_SUBQUERY : case OpTypes.ROW_SUBQUERY : case OpTypes.TABLE_SUBQUERY : { RangeVariable[] rangeVars = rangeGroup.getRangeVariables(); if (rangeVars.length > rangeCount) { rangeVars = (RangeVariable[]) ArrayUtil.resizeArray(rangeVars, rangeCount); rangeGroup = new RangeGroupSimple(rangeVars, rangeGroup); } rangeGroups = (RangeGroup[]) ArrayUtil.toAdjustedArray(rangeGroups, rangeGroup, rangeGroups.length, 1); QueryExpression queryExpression = table.queryExpression; if (queryExpression != null) { queryExpression.resolveReferences(session, rangeGroups); if (!queryExpression.areColumnsResolved()) { if (unresolvedSet == null) { unresolvedSet = new ArrayListIdentity(); } unresolvedSet.addAll( queryExpression.getUnresolvedExpressions()); } } Expression dataExpression = table.dataExpression; if (dataExpression != null) { unresolvedSet = dataExpression.resolveColumnReferences(session, rangeGroup, rangeCount, rangeGroups, unresolvedSet, acceptsSequences); } break; } default : } return unresolvedSet; } public OrderedHashSet getUnkeyedColumns(OrderedHashSet unresolvedSet) { if (opType == OpTypes.VALUE) { return unresolvedSet; } for (int i = 0; i < nodes.length; i++) { if (nodes[i] == null) { continue; } unresolvedSet = nodes[i].getUnkeyedColumns(unresolvedSet); } switch (opType) { case OpTypes.ARRAY : case OpTypes.ARRAY_SUBQUERY : case OpTypes.ROW_SUBQUERY : case OpTypes.TABLE_SUBQUERY : if (table != null) { if (unresolvedSet == null) { unresolvedSet = new OrderedHashSet(); } unresolvedSet.add(this); } break; } return unresolvedSet; } public void resolveTypes(Session session, Expression parent) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { nodes[i].resolveTypes(session, this); } } switch (opType) { case OpTypes.VALUE : break; case OpTypes.VALUELIST : /** @todo - should it fall through */ break; case OpTypes.ROW : nodeDataTypes = new Type[nodes.length]; for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { nodeDataTypes[i] = nodes[i].dataType; } } break; case OpTypes.ARRAY : { Type nodeDataType = null; for (int i = 0; i < nodes.length; i++) { nodeDataType = Type.getAggregateType(nodeDataType, nodes[i].dataType); } for (int i = 0; i < nodes.length; i++) { nodes[i].dataType = nodeDataType; } if (nodeDataType != null) { for (int i = 0; i < nodes.length; i++) { if (nodes[i].valueData != null) { nodes[i].valueData = nodeDataType.convertToDefaultType( session, nodes[i].valueData); } } } dataType = new ArrayType(nodeDataType, nodes.length); return; } case OpTypes.ARRAY_SUBQUERY : { QueryExpression queryExpression = table.queryExpression; queryExpression.resolveTypes(session); table.prepareTable(); nodeDataTypes = queryExpression.getColumnTypes(); dataType = nodeDataTypes[0]; if (nodeDataTypes.length > 1) { throw Error.error(ErrorCode.X_42564); } dataType = new ArrayType(dataType, nodes.length); break; } case OpTypes.ROW_SUBQUERY : case OpTypes.TABLE_SUBQUERY : { QueryExpression queryExpression = table.queryExpression; if (queryExpression != null) { queryExpression.resolveTypes(session); } Expression dataExpression = table.dataExpression; if (dataExpression != null) { dataExpression.resolveTypes(session, null); } table.prepareTable(); nodeDataTypes = table.getColumnTypes(); dataType = nodeDataTypes[0]; break; } default : throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } } void setAsConstantValue(Session session) { valueData = getValue(session); opType = OpTypes.VALUE; nodes = emptyArray; } void setAsConstantValue(Object value) { valueData = value; opType = OpTypes.VALUE; nodes = emptyArray; } void prepareTable(Session session, Expression row, int degree) { if (nodeDataTypes != null) { return; } for (int i = 0; i < nodes.length; i++) { Expression e = nodes[i]; if (e.opType == OpTypes.ROW) { if (degree != e.nodes.length) { throw Error.error(ErrorCode.X_42564); } } else if (degree == 1) { nodes[i] = new Expression(OpTypes.ROW); nodes[i].nodes = new Expression[]{ e }; } else { throw Error.error(ErrorCode.X_42564); } } nodeDataTypes = new Type[degree]; for (int j = 0; j < degree; j++) { Type type = row == null ? null : row.nodes[j] .dataType; boolean hasUresolvedParameter = row == null ? false : row.nodes[j] .isUnresolvedParam(); for (int i = 0; i < nodes.length; i++) { type = Type.getAggregateType(nodes[i].nodes[j].dataType, type); hasUresolvedParameter |= nodes[i].nodes[j].isUnresolvedParam(); } if (type == null) { type = Type.SQL_VARCHAR_DEFAULT; } int typeCode = type.typeCode; if (hasUresolvedParameter && type.isCharacterType()) { if (typeCode == Types.SQL_CHAR || type.precision < Type.SQL_VARCHAR_DEFAULT.precision) { if (typeCode == Types.SQL_CHAR) { typeCode = Types.SQL_VARCHAR; } long precision = Math.max(Type.SQL_VARCHAR_DEFAULT.precision, type.precision); type = CharacterType.getCharacterType(typeCode, precision, type.getCollation()); } } nodeDataTypes[j] = type; if (row != null && row.nodes[j].isUnresolvedParam()) { row.nodes[j].dataType = type; } for (int i = 0; i < nodes.length; i++) { if (nodes[i].nodes[j].isUnresolvedParam()) { nodes[i].nodes[j].dataType = nodeDataTypes[j]; continue; } if (nodes[i].nodes[j].opType == OpTypes.VALUE) { if (nodes[i].nodes[j].valueData == null) { nodes[i].nodes[j].dataType = nodeDataTypes[j]; } } } if (nodeDataTypes[j].isCharacterType() && !((CharacterType) nodeDataTypes[j]) .isEqualIdentical()) { // collation issues } } } /** * Details of IN condition optimisation for 1.9.0 * Predicates with SELECT are QUERY expressions * * Predicates with IN list * * Parser adds a SubQuery to the list for each predicate * At type resolution IN lists that are entirely fixed constant or parameter * values are selected for possible optimisation. The flags: * * IN expression right side isCorrelated == true if there are non-constant, * non-param expressions in the list (Expressions may have to be resolved * against the full set of columns of the query, so must be re-evaluated * for each row and evaluated after all the joins have been made) * * VALUELIST expression isFixedConstantValueList == true when all * expressions are fixed constant and none is a param. With this flag, * a single-column VALUELIST can be accessed as a HashMap. * * Predicates may be optimised as joins if isCorrelated == false * */ void insertValuesIntoSubqueryTable(Session session, PersistentStore store) { for (int i = 0; i < nodes.length; i++) { Object[] data = nodes[i].getRowValue(session); for (int j = 0; j < nodeDataTypes.length; j++) { data[j] = nodeDataTypes[j].convertToType(session, data[j], nodes[i].nodes[j].dataType); } Row row = (Row) store.getNewCachedObject(session, data, false); try { store.indexRow(session, row); } catch (HsqlException e) {} } } /** * Returns the name of a column as string * * @return column name */ String getColumnName() { return getAlias(); } public ColumnSchema getColumn() { return null; } /** * Returns the column index in the table */ int getColumnIndex() { return columnIndex; } /** * Returns the data type */ Type getDataType() { return dataType; } byte getNullability() { return nullability; } Type getNodeDataType(int i) { if (nodeDataTypes == null) { if (i > 0) { throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } return dataType; } else { return nodeDataTypes[i]; } } Type[] getNodeDataTypes() { if (nodeDataTypes == null) { return new Type[]{ dataType }; } else { return nodeDataTypes; } } int getDegree() { switch (opType) { case OpTypes.ROW : return nodes.length; case OpTypes.TABLE : case OpTypes.ROW_SUBQUERY : case OpTypes.TABLE_SUBQUERY : if (table == null) { return nodeDataTypes.length; } return table.queryExpression.getColumnCount(); default : return 1; } } public Table getTable() { return table; } public void materialise(Session session) { if (table == null) { return; } if (table.isCorrelated()) { table.materialiseCorrelated(session); } else { table.materialise(session); } } Object getValue(Session session, Type type) { Object o = getValue(session); if (o == null || dataType == type) { return o; } return type.convertToType(session, o, dataType); } public Object getConstantValueNoCheck(Session session) { try { return getValue(session); } catch (HsqlException e) { return null; } } public Object[] getRowValue(Session session) { switch (opType) { case OpTypes.ROW : { Object[] data = new Object[nodes.length]; for (int i = 0; i < nodes.length; i++) { data[i] = nodes[i].getValue(session); } return data; } case OpTypes.ROW_SUBQUERY : case OpTypes.TABLE_SUBQUERY : { return table.queryExpression.getValues(session); } default : throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } } public Object getValue(Session session) { switch (opType) { case OpTypes.VALUE : return valueData; case OpTypes.SIMPLE_COLUMN : { Object value = session.sessionContext.rangeIterators[rangePosition] .getCurrent(columnIndex); return value; } case OpTypes.ROW : { if (nodes.length == 1) { return nodes[0].getValue(session); } Object[] row = new Object[nodes.length]; for (int i = 0; i < nodes.length; i++) { row[i] = nodes[i].getValue(session); } return row; } case OpTypes.ARRAY : { Object[] array = new Object[nodes.length]; for (int i = 0; i < nodes.length; i++) { array[i] = nodes[i].getValue(session); } return array; } case OpTypes.ARRAY_SUBQUERY : { table.materialiseCorrelated(session); RowSetNavigatorData nav = table.getNavigator(session); int size = nav.getSize(); Object[] array = new Object[size]; nav.beforeFirst(); for (int i = 0; nav.hasNext(); i++) { Object[] data = nav.getNextRowData(); array[i] = data[0]; } return array; } case OpTypes.TABLE_SUBQUERY : case OpTypes.ROW_SUBQUERY : { table.materialiseCorrelated(session); Object[] value = table.getValues(session); if (value.length == 1) { return ((Object[]) value)[0]; } return value; } default : throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } } public Result getResult(Session session) { switch (opType) { case OpTypes.ARRAY : { RowSetNavigatorData navigator = table.getNavigator(session); Object[] array = new Object[navigator.getSize()]; navigator.beforeFirst(); for (int i = 0; navigator.hasNext(); i++) { Object[] data = navigator.getNext(); array[i] = data[0]; } return Result.newPSMResult(array); } case OpTypes.TABLE_SUBQUERY : { table.materialiseCorrelated(session); RowSetNavigatorData navigator = table.getNavigator(session); Result result = Result.newResult(navigator); result.metaData = table.queryExpression.getMetaData(); return result; } default : { Object value = getValue(session); return Result.newPSMResult(value); } } } public boolean testCondition(Session session) { return Boolean.TRUE.equals(getValue(session)); } static int countNulls(Object[] a) { int nulls = 0; for (int i = 0; i < a.length; i++) { if (a[i] == null) { nulls++; } } return nulls; } public boolean isIndexable(RangeVariable range) { return false; } static void convertToType(Session session, Object[] data, Type[] dataType, Type[] newType) { for (int i = 0; i < data.length; i++) { if (dataType[i].typeComparisonGroup != newType[i].typeComparisonGroup) { data[i] = newType[i].convertToType(session, data[i], dataType[i]); } } } /** * Returns a Select object that can be used for checking the contents * of an existing table against the given CHECK search condition. */ static QuerySpecification getCheckSelect(Session session, Table t, Expression e) { CompileContext compileContext = new CompileContext(session, null); compileContext.reset(0); QuerySpecification s = new QuerySpecification(compileContext); RangeVariable range = new RangeVariable(t, null, null, null, compileContext); RangeVariable[] ranges = new RangeVariable[]{ range }; RangeGroup rangeGroup = new RangeGroupSimple(ranges); e.resolveCheckOrGenExpression(session, rangeGroup, true); if (Type.SQL_BOOLEAN != e.getDataType()) { throw Error.error(ErrorCode.X_42568); } Expression condition = new ExpressionLogical(OpTypes.NOT, e); s.addSelectColumnExpression(EXPR_TRUE); s.addRangeVariable(session, range); s.addQueryCondition(condition); s.resolve(session); return s; } public void resolveCheckOrGenExpression(Session session, RangeGroup rangeGroup, boolean isCheck) { boolean nonDeterministic = false; OrderedHashSet set = new OrderedHashSet(); HsqlList unresolved = resolveColumnReferences(session, rangeGroup, RangeGroup.emptyArray, null); ExpressionColumn.checkColumnsResolved(unresolved); resolveTypes(session, null); collectAllExpressions(set, Expression.subqueryAggregateExpressionSet, Expression.emptyExpressionSet); if (!set.isEmpty()) { throw Error.error(ErrorCode.X_42512); } collectAllExpressions(set, Expression.functionExpressionSet, Expression.emptyExpressionSet); for (int i = 0; i < set.size(); i++) { Expression current = (Expression) set.get(i); if (current.opType == OpTypes.FUNCTION) { if (!((FunctionSQLInvoked) current).isDeterministic()) { throw Error.error(ErrorCode.X_42512); } } if (current.opType == OpTypes.SQL_FUNCTION) { if (!((FunctionSQL) current).isDeterministic()) { if (isCheck) { nonDeterministic = true; continue; } throw Error.error(ErrorCode.X_42512); } } } if (isCheck && nonDeterministic) { HsqlArrayList list = new HsqlArrayList(); RangeVariableResolver.decomposeAndConditions(session, this, list); for (int i = 0; i < list.size(); i++) { nonDeterministic = true; Expression e = (Expression) list.get(i); Expression e1; if (e instanceof ExpressionLogical) { boolean b = ((ExpressionLogical) e).convertToSmaller(); if (!b) { break; } e1 = e.getRightNode(); e = e.getLeftNode(); if (!e.dataType.isDateTimeType()) { nonDeterministic = true; break; } if (e.hasNonDeterministicFunction()) { nonDeterministic = true; break; } // both sides are actually consistent regarding timeZone // e.dataType.isDateTimeTypeWithZone(); if (e1 instanceof ExpressionArithmetic) { if (opType == OpTypes.ADD) { if (e1.getRightNode() .hasNonDeterministicFunction()) { e1.swapLeftAndRightNodes(); } } else if (opType == OpTypes.SUBTRACT) {} else { break; } if (e1.getRightNode().hasNonDeterministicFunction()) { break; } e1 = e1.getLeftNode(); } if (e1.opType == OpTypes.SQL_FUNCTION) { FunctionSQL function = (FunctionSQL) e1; switch (function.funcType) { case FunctionSQL.FUNC_CURRENT_DATE : case FunctionSQL.FUNC_CURRENT_TIMESTAMP : case FunctionSQL.FUNC_LOCALTIMESTAMP : nonDeterministic = false; continue; default : break; } break; } break; } else { break; } } if (nonDeterministic) { throw Error.error(ErrorCode.X_42512); } } set.clear(); collectObjectNames(set); RangeVariable[] ranges = rangeGroup.getRangeVariables(); for (int i = 0; i < set.size(); i++) { HsqlName name = (HsqlName) set.get(i); switch (name.type) { case SchemaObject.COLUMN : { if (isCheck) { break; } int colIndex = ranges[0].rangeTable.findColumn(name.name); ColumnSchema column = ranges[0].rangeTable.getColumn(colIndex); if (column.isGenerated()) { throw Error.error(ErrorCode.X_42512); } break; } case SchemaObject.SEQUENCE : { throw Error.error(ErrorCode.X_42512); } case SchemaObject.SPECIFIC_ROUTINE : { Routine routine = (Routine) session.database.schemaManager .getSchemaObject(name); if (!routine.isDeterministic()) { throw Error.error(ErrorCode.X_42512); } int impact = routine.getDataImpact(); if (impact == Routine.READS_SQL || impact == Routine.MODIFIES_SQL) { throw Error.error(ErrorCode.X_42512); } } } } set.clear(); } boolean isUnresolvedParam() { return false; } boolean isDynamicParam() { return false; } boolean hasNonDeterministicFunction() { OrderedHashSet list = null; list = collectAllExpressions(list, Expression.functionExpressionSet, Expression.emptyExpressionSet); if (list == null) { return false; } for (int j = 0; j < list.size(); j++) { Expression current = (Expression) list.get(j); if (current.opType == OpTypes.FUNCTION) { if (!((FunctionSQLInvoked) current).isDeterministic()) { return true; } } else if (current.opType == OpTypes.SQL_FUNCTION) { if (!((FunctionSQL) current).isDeterministic()) { return true; } } } return false; } void swapLeftAndRightNodes() { Expression temp = nodes[LEFT]; nodes[LEFT] = nodes[RIGHT]; nodes[RIGHT] = temp; } void setAttributesAsColumn(ColumnSchema column, boolean isWritable) { throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } String getValueClassName() { Type type = dataType == null ? NullType.getNullType() : dataType; return type.getJDBCClassName(); } /** * collect all expressions of a set of expression types appearing anywhere * in a select statement and its subselects, etc. */ OrderedHashSet collectAllExpressions(OrderedHashSet set, OrderedIntHashSet typeSet, OrderedIntHashSet stopAtTypeSet) { if (stopAtTypeSet.contains(opType)) { return set; } for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { set = nodes[i].collectAllExpressions(set, typeSet, stopAtTypeSet); } } boolean added = false; if (typeSet.contains(opType)) { if (set == null) { set = new OrderedHashSet(); } set.add(this); added = true; } if (!added) { if (table != null && table.queryExpression != null) { set = table.queryExpression.collectAllExpressions(set, typeSet, stopAtTypeSet); } } return set; } public OrderedHashSet getSubqueries() { return collectAllSubqueries(null); } OrderedHashSet collectAllSubqueries(OrderedHashSet set) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { set = nodes[i].collectAllSubqueries(set); } } if (table != null) { OrderedHashSet tempSet = null; if (table.queryExpression != null) { tempSet = table.queryExpression.getSubqueries(); set = OrderedHashSet.addAll(set, tempSet); } if (set == null) { set = new OrderedHashSet(); } set.add(table); } return set; } /** * isCorrelated */ public boolean isCorrelated() { if (table == null) { return false; } return table.isCorrelated(); } /** * checkValidCheckConstraint */ public void checkValidCheckConstraint() { OrderedHashSet set = null; set = collectAllExpressions(set, Expression.subqueryAggregateExpressionSet, Expression.emptyExpressionSet); if (set != null && !set.isEmpty()) { throw Error.error(ErrorCode.X_0A000, "subquery in check constraint"); } } static HsqlList resolveColumnSet(Session session, RangeVariable[] rangeVars, RangeGroup[] rangeGroups, HsqlList sourceSet) { return resolveColumnSet(session, rangeVars, rangeVars.length, rangeGroups, sourceSet, null); } static HsqlList resolveColumnSet(Session session, RangeVariable[] rangeVars, int rangeCount, RangeGroup[] rangeGroups, HsqlList sourceSet, HsqlList targetSet) { if (sourceSet == null) { return targetSet; } RangeGroup rangeGroup = new RangeGroupSimple(rangeVars); for (int i = 0; i < sourceSet.size(); i++) { Expression e = (Expression) sourceSet.get(i); targetSet = e.resolveColumnReferences(session, rangeGroup, rangeCount, rangeGroups, targetSet, false); } return targetSet; } boolean isConditionRangeVariable(RangeVariable range) { return false; } RangeVariable[] getJoinRangeVariables(RangeVariable[] ranges) { return RangeVariable.emptyArray; } double costFactor(Session session, RangeVariable range, int operation) { return Index.minimumSelectivity; } Expression getIndexableExpression(RangeVariable rangeVar) { return null; } public Expression duplicate() { Expression e = null; try { e = (Expression) super.clone(); e.nodes = (Expression[]) nodes.clone(); for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { e.nodes[i] = nodes[i].duplicate(); } } } catch (CloneNotSupportedException ex) { throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } return e; } void replaceNode(Expression existing, Expression replacement) { for (int i = 0; i < nodes.length; i++) { if (nodes[i] == existing) { replacement.alias = nodes[i].alias; nodes[i] = replacement; return; } } throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } public Object updateAggregatingValue(Session session, Object currValue) { throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } public Object getAggregatedValue(Session session, Object currValue) { throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } public Expression getCondition() { return null; } public boolean hasCondition() { return false; } public void setCondition(Expression e) { throw Error.runtimeError(ErrorCode.U_S0500, "Expression"); } public void setCollation(Collation collation) { this.collation = collation; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/RowAVLDiskLarge.java0000644000175000017500000000642312007547376022521 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.io.IOException; import org.hsqldb.index.NodeAVL; import org.hsqldb.index.NodeAVLDiskLarge; import org.hsqldb.persist.PersistentStore; import org.hsqldb.rowio.RowInputInterface; /** * Subclass of Row huge databases.

                  * @author Fred Toussi (fredt@users dot sourceforge dot net) * @version 2.2.9 * @since 2.2.9 */ public class RowAVLDiskLarge extends RowAVLDisk { /** * Constructor for new Rows. Variable hasDataChanged is set to true in * order to indicate the data needs saving. * * @param t table * @param o row data */ public RowAVLDiskLarge(TableBase t, Object[] o, PersistentStore store) { super(t, o, store); } /** * Constructor when read from the disk into the Cache. * * @param t table * @param in data source * @throws IOException */ public RowAVLDiskLarge(TableBase t, RowInputInterface in) throws IOException { super(t); position = in.getPos(); storageSize = in.getSize(); int indexcount = t.getIndexCount(); nPrimaryNode = new NodeAVLDiskLarge(this, in, 0); NodeAVL n = nPrimaryNode; for (int i = 1; i < indexcount; i++) { n.nNext = new NodeAVLDiskLarge(this, in, i); n = n.nNext; } rowData = in.readData(table.getColumnTypes()); } public void setNewNodes(PersistentStore store) { int indexcount = store.getAccessorKeys().length; nPrimaryNode = new NodeAVLDiskLarge(this, 0); NodeAVL n = nPrimaryNode; for (int i = 1; i < indexcount; i++) { n.nNext = new NodeAVLDiskLarge(this, i); n = n.nNext; } } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rights/0000755000175000017500000000000012007570424020237 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rights/User.java0000644000175000017500000001613012007547414022024 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rights; import org.hsqldb.HsqlNameManager; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.Tokens; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.MD5; import org.hsqldb.lib.StringConverter; /** * A User Object extends Grantee with password for a * particular database user.

                  * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @author Blaine Simpson (blaine dot simpson at admc dot com) * * @version 2.1.1 * @since 1.8.0 */ public class User extends Grantee { /** password. */ private String password; public boolean isLocalOnly; public boolean isExternalOnly; /** default schema when new Sessions started (defaults to PUBLIC schema) */ private HsqlName initialSchema = null; /** * Constructor */ User(HsqlName name, GranteeManager manager) { super(name, manager); if (manager != null) { updateAllRights(); } } public String getSQL() { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_CREATE).append(' ').append(Tokens.T_USER); sb.append(' ').append(granteeName.statementName).append(' '); sb.append(Tokens.T_PASSWORD).append(' ').append(Tokens.T_DIGEST); sb.append(' ').append('\'').append(password).append('\''); return sb.toString(); } public String getPasswordDigest() { return password; } public void setPassword(String password, boolean isDigest) { if (!isDigest) { password = MD5.encode(password, null); } this.password = password; } /** * Checks if this object's password attibute equals * specified argument, else throws. */ public void checkPassword(String value) { String digest = MD5.encode(value, null); if (!digest.equals(password)) { throw Error.error(ErrorCode.X_28000); } } /** * Returns the initial schema for the user */ public HsqlName getInitialSchema() { return initialSchema; } public HsqlName getInitialOrDefaultSchema() { if (initialSchema != null) { return initialSchema; } HsqlName schema = granteeManager.database.schemaManager.findSchemaHsqlName( getName().getNameString()); if (schema == null) { return granteeManager.database.schemaManager .getDefaultSchemaHsqlName(); } else { return schema; } } /** * This class does not have access to the SchemaManager, therefore * caller should verify that the given schemaName exists. * * @param schema An existing schema. Null value allowed, * which means use the DB default session schema. */ public void setInitialSchema(HsqlName schema) { initialSchema = schema; } public String getInitialSchemaSQL() { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_ALTER).append(' '); sb.append(Tokens.T_USER).append(' '); sb.append(getName().getStatementName()).append(' '); sb.append(Tokens.T_SET).append(' '); sb.append(Tokens.T_INITIAL).append(' '); sb.append(Tokens.T_SCHEMA).append(' '); sb.append(initialSchema.getStatementName()); return sb.toString(); } /** * Returns the DDL string for local authentication. * */ public String getLocalUserSQL() { StringBuffer sb = new StringBuffer(64); sb.append(Tokens.T_ALTER).append(' '); sb.append(Tokens.T_USER).append(' '); sb.append(getName().getStatementName()).append(' '); sb.append(Tokens.T_SET).append(' ').append(Tokens.T_LOCAL); sb.append(' ').append(Tokens.T_TRUE); return sb.toString(); } /** * Returns the SQL string for setting password digest. * */ public String getSetPasswordDigestSQL() { StringBuffer sb = new StringBuffer(64); sb.append(Tokens.T_ALTER).append(' '); sb.append(Tokens.T_USER).append(' '); sb.append(getName().getStatementName()).append(' '); sb.append(Tokens.T_SET).append(' '); sb.append(Tokens.T_PASSWORD).append(' ').append(Tokens.T_DIGEST); sb.append(' ').append('\'').append(password).append('\''); return sb.toString(); } /** * Returns the SQL string for setting password digest. * */ public static String getSetCurrentPasswordDigestSQL(String password, boolean isDigest) { if (!isDigest) { password = MD5.encode(password, null); } StringBuffer sb = new StringBuffer(64); sb.append(Tokens.T_SET).append(' '); sb.append(Tokens.T_PASSWORD).append(' ').append(Tokens.T_DIGEST); sb.append(' ').append('\'').append(password).append('\''); return sb.toString(); } /** * Retrieves the redo log character sequence for connecting * this user * * @return the redo log character sequence for connecting * this user */ public String getConnectUserSQL() { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_SET).append(' '); sb.append(Tokens.T_SESSION).append(' '); sb.append(Tokens.T_AUTHORIZATION).append(' '); sb.append(StringConverter.toQuotedString(getName().getNameString(), '\'', true)); return sb.toString(); } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rights/UserManager.java0000644000175000017500000003474112007547414023327 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rights; import org.hsqldb.Database; import org.hsqldb.HsqlException; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.Routine; import org.hsqldb.Schema; import org.hsqldb.SchemaObject; import org.hsqldb.Session; import org.hsqldb.SqlInvariants; import org.hsqldb.Tokens; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.result.Result; /** * Manages the User objects for a Database instance. * The special users PUBLIC_USER_NAME and SYSTEM_AUTHORIZATION_NAME * are created and managed here. SYSTEM_AUTHORIZATION_NAME is also * special in that the name is not kept in the user "list" * (PUBLIC_USER_NAME is kept in the list because it's needed by MetaData * routines via "listVisibleUsers(x, true)"). * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * * @version 2.1.1 * @since 1.7.2 * @see User */ public final class UserManager { /** * This object's set of User objects.

                  * * Note: The special _SYSTEM role * is not included in this list but the special PUBLIC * User object is kept in the list because it's needed by MetaData * routines via "listVisibleUsers(x, true)". */ private HashMappedList userList; private GranteeManager granteeManager; /** * The function for password complexity. */ Routine pwCheckFunction; Routine extAuthenticationFunction; /** * Construction happens once for each Database instance. * * Creates special users PUBLIC_USER_NAME and SYSTEM_AUTHORIZATION_NAME. * Sets up association with the GranteeManager for this database. */ public UserManager(Database database) { granteeManager = database.getGranteeManager(); userList = new HashMappedList(); } /** * Creates a new User object under management of this object.

                  * * A set of constraints regarding user creation is imposed:

                  * *

                    *
                  1. If the specified name is null, then an * ASSERTION_FAILED exception is thrown stating that * the name is null. * *
                  2. If this object's collection already contains an element whose * name attribute equals the name argument, then * a GRANTEE_ALREADY_EXISTS exception is thrown. * (This will catch attempts to create Reserved grantee names). *
                  */ public User createUser(HsqlName name, String password, boolean isDigest) { // This will throw an appropriate exception if grantee already exists, // regardless of whether the name is in any User, Role, etc. list. User user = granteeManager.addUser(name); user.setPassword(password, isDigest); boolean success = userList.add(name.name, user); if (!success) { throw Error.error(ErrorCode.X_28503, name.statementName); } return user; } public void setPassword(Session session, User user, String password, boolean isDigest) { if (!isDigest && !checkComplexity(session, password)) { throw Error.error(ErrorCode.PASSWORD_COMPLEXITY); } // requires: UserManager.createSAUser(), UserManager.createPublicUser() user.setPassword(password, isDigest); } public boolean checkComplexity(Session session, String password) { if (session == null || pwCheckFunction == null) { return true; } Result result = pwCheckFunction.invoke(session, new Object[]{ password }, null, false); Boolean check = (Boolean) result.getValueObject(); if (check == null || !check.booleanValue()) { return false; } return true; } /** * Attempts to drop a User object with the specified name * from this object's set.

                  * * A successful drop action consists of:

                  * *

                    * *
                  • removing the User object with the specified name * from the set. * *
                  • revoking all rights from the removed User
                    * (this ensures that in case there are still references to the * just dropped User object, those references * cannot be used to erronously access database objects). * *

                  * */ public void dropUser(String name) { boolean reservedUser = GranteeManager.isReserved(name); if (reservedUser) { throw Error.error(ErrorCode.X_28502, name); } boolean result = granteeManager.removeGrantee(name); if (!result) { throw Error.error(ErrorCode.X_28501, name); } User user = (User) userList.remove(name); if (user == null) { throw Error.error(ErrorCode.X_28501, name); } } public void createFirstUser(String username, String password) { boolean isQuoted = true; if (username.equalsIgnoreCase("SA")) { username = "SA"; isQuoted = false; } HsqlName name = granteeManager.database.nameManager.newHsqlName(username, isQuoted, SchemaObject.GRANTEE); User user = createUser(name, password, false); user.isLocalOnly = true; granteeManager.grant(name.name, SqlInvariants.DBA_ADMIN_ROLE_NAME, granteeManager.getDBARole()); } /** * Returns the User object with the specified name and * password from this object's set. */ public User getUser(String name, String password) { if (name == null) { name = ""; } if (password == null) { password = ""; } User user = (User) userList.get(name); boolean isLocal = user != null && user.isLocalOnly; if (extAuthenticationFunction == null || isLocal) { user = get(name); user.checkPassword(password); return user; } /* * Authentication returns String[]. When null, use the existing * user object only, with existing privileges. * When not null, ignore if user exists. Otherwise create a user and * assign the list of roles to the user. */ Result result = extAuthenticationFunction.invokeJavaMethodDirect(new String[] { granteeManager.database.getUniqueName(), name, password }); if (result.isError()) { throw Error.error(ErrorCode.X_28501, result.getMainString()); } Object[] roles = (Object[]) result.getValueObject(); if (user == null) { HsqlName hsqlName = granteeManager.database.nameManager.newHsqlName(name, true, SchemaObject.GRANTEE); user = createUser(hsqlName, "", false); user.isExternalOnly = true; } if (roles == null) { user.updateAllRights(); return user; } // this clears all existing privileges of the user user.clearPrivileges(); // assigns the roles to the user for (int i = 0; i < roles.length; i++) { try { Grantee role = granteeManager.getRole((String) roles[i]); user.grant(role); } catch (HsqlException e) {} } user.updateAllRights(); for (int i = 0; i < roles.length; i++) { Schema schema = granteeManager.database.schemaManager.findSchema( (String) roles[i]); if (schema != null) { user.setInitialSchema(schema.getName()); break; } } return user; } /** * Retrieves this object's set of User objects as * an associative list. */ public HashMappedList getUsers() { return userList; } public boolean exists(String name) { return userList.get(name) == null ? false : true; } /** * Returns the User object identified by the * name argument. */ public User get(String name) { User user = (User) userList.get(name); if (user == null) { throw Error.error(ErrorCode.X_28501, name); } return user; } /** * Retrieves the User objects representing the database * users that are visible to the User object * represented by the session argument.

                  * * If the session argument's User object * attribute has isAdmin() true (directly or by virtue of a Role), * then all of the * User objects in this collection are considered visible. * Otherwise, only this object's special PUBLIC * User object attribute and the session User * object, if it exists in this collection, are considered visible.

                  * * @param session The Session object used to determine * visibility * @return a list of User objects visible to * the User object contained by the * session argument. * */ public HsqlArrayList listVisibleUsers(Session session) { HsqlArrayList list; User user; boolean isAdmin; String sessionName; String userName; list = new HsqlArrayList(); isAdmin = session.isAdmin(); sessionName = session.getUsername(); if (userList == null || userList.size() == 0) { return list; } for (int i = 0; i < userList.size(); i++) { user = (User) userList.get(i); if (user == null) { continue; } userName = user.getName().getNameString(); if (isAdmin) { list.add(user); } else if (sessionName.equals(userName)) { list.add(user); } } return list; } /** * Returns the specially constructed * SYSTEM_AUTHORIZATION_NAME * User object for the current Database object. * * @return the SYS_AUTHORIZATION_NAME * User object * */ public User getSysUser() { return GranteeManager.systemAuthorisation; } public synchronized void removeSchemaReference(String schemaName) { for (int i = 0; i < userList.size(); i++) { User user = (User) userList.get(i); HsqlName schema = user.getInitialSchema(); if (schema == null) { continue; } if (schemaName.equals(schema.name)) { user.setInitialSchema(null); } } } public void setPasswordCheckFunction(Routine function) { pwCheckFunction = function; } public void setExtAuthenticationFunction(Routine function) { extAuthenticationFunction = function; } public String[] getInitialSchemaSQL() { HsqlArrayList list = new HsqlArrayList(userList.size()); for (int i = 0; i < userList.size(); i++) { User user = (User) userList.get(i); if (user.isSystem) { continue; } HsqlName name = user.getInitialSchema(); if (name == null) { continue; } list.add(user.getInitialSchemaSQL()); } String[] array = new String[list.size()]; list.toArray(array); return array; } public String[] getAuthenticationSQL() { HsqlArrayList list = new HsqlArrayList(); String[] array; if (pwCheckFunction != null) { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_SET).append(' ').append(Tokens.T_DATABASE); sb.append(' ').append(Tokens.T_PASSWORD).append(' '); sb.append(Tokens.T_CHECK).append(' ').append(Tokens.T_FUNCTION); sb.append(' '); sb.append(pwCheckFunction.getSQLBodyDefinition()); list.add(sb.toString()); } if (extAuthenticationFunction != null) { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_SET).append(' ').append(Tokens.T_DATABASE); sb.append(' ').append(Tokens.T_AUTHENTICATION).append(' '); sb.append(Tokens.T_FUNCTION).append(' '); sb.append(extAuthenticationFunction.getSQLBodyDefinition()); list.add(sb.toString()); } array = new String[list.size()]; list.toArray(array); return array; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rights/Right.java0000644000175000017500000006611112007547414022167 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rights; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.SchemaObject; import org.hsqldb.Table; import org.hsqldb.Tokens; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.OrderedHashSet; /** * Represents the set of rights on a database object * * @author Fred Toussi (fredt@users dot sourceforge.net) * * @version 2.0.1 * @since 1.9.0 */ public final class Right { boolean isFull; boolean isFullSelect; boolean isFullInsert; boolean isFullUpdate; boolean isFullReferences; boolean isFullTrigger; boolean isFullDelete; OrderedHashSet selectColumnSet; OrderedHashSet insertColumnSet; OrderedHashSet updateColumnSet; OrderedHashSet referencesColumnSet; OrderedHashSet triggerColumnSet; // Right grantableRights; Grantee grantor; Grantee grantee; // public static final OrderedHashSet emptySet = new OrderedHashSet(); public static final Right fullRights = new Right(); public static final Right noRights = new Right(); static final OrderedHashSet fullRightsSet = new OrderedHashSet(); static { fullRights.grantor = GranteeManager.systemAuthorisation; fullRights.isFull = true; fullRightsSet.add(fullRights); } public static final String[] privilegeNames = { Tokens.T_SELECT, Tokens.T_INSERT, Tokens.T_UPDATE, Tokens.T_DELETE, Tokens.T_REFERENCES, Tokens.T_TRIGGER }; public static final int[] privilegeTypes = { GrantConstants.SELECT, GrantConstants.INSERT, GrantConstants.UPDATE, GrantConstants.DELETE, GrantConstants.REFERENCES, GrantConstants.TRIGGER }; public Right() { this.isFull = false; } Right(Table table) { isFull = false; isFullDelete = true; selectColumnSet = table.getColumnNameSet(); insertColumnSet = table.getColumnNameSet(); updateColumnSet = table.getColumnNameSet(); referencesColumnSet = table.getColumnNameSet(); triggerColumnSet = table.getColumnNameSet(); } public boolean isFull() { return isFull; } public Grantee getGrantor() { return grantor; } public Grantee getGrantee() { return grantee; } public Right getGrantableRights() { return grantableRights == null ? noRights : grantableRights; } public Right duplicate() { Right right = new Right(); right.add(this); return right; } /** * Supports column level GRANT */ public void add(Right right) { if (isFull) { return; } if (right.isFull) { clear(); isFull = true; return; } isFullSelect |= right.isFullSelect; isFullInsert |= right.isFullInsert; isFullUpdate |= right.isFullUpdate; isFullReferences |= right.isFullReferences; isFullDelete |= right.isFullDelete; if (isFullSelect) { selectColumnSet = null; } else if (right.selectColumnSet != null) { if (selectColumnSet == null) { selectColumnSet = new OrderedHashSet(); } selectColumnSet.addAll(right.selectColumnSet); } if (isFullInsert) { insertColumnSet = null; } else if (right.insertColumnSet != null) { if (insertColumnSet == null) { insertColumnSet = new OrderedHashSet(); } insertColumnSet.addAll(right.insertColumnSet); } if (isFullUpdate) { updateColumnSet = null; } else if (right.updateColumnSet != null) { if (updateColumnSet == null) { updateColumnSet = new OrderedHashSet(); } updateColumnSet.addAll(right.updateColumnSet); } if (isFullReferences) { referencesColumnSet = null; } else if (right.referencesColumnSet != null) { if (referencesColumnSet == null) { referencesColumnSet = new OrderedHashSet(); } referencesColumnSet.addAll(right.referencesColumnSet); } if (isFullTrigger) { triggerColumnSet = null; } else if (right.triggerColumnSet != null) { if (triggerColumnSet == null) { triggerColumnSet = new OrderedHashSet(); } triggerColumnSet.addAll(right.triggerColumnSet); } } /** * supports column level REVOKE */ public void remove(SchemaObject object, Right right) { if (right.isFull) { clear(); return; } if (isFull) { isFull = false; isFullSelect = isFullInsert = isFullUpdate = isFullReferences = isFullDelete = true; } if (right.isFullDelete) { isFullDelete = false; } if (!isFullSelect && selectColumnSet == null) {} else if (right.isFullSelect) { isFullSelect = false; selectColumnSet = null; } else if (right.selectColumnSet != null) { if (isFullSelect) { isFullSelect = false; selectColumnSet = ((Table) object).getColumnNameSet(); } selectColumnSet.removeAll(right.selectColumnSet); if (selectColumnSet.isEmpty()) { selectColumnSet = null; } } if (!isFullInsert && insertColumnSet == null) {} else if (right.isFullInsert) { isFullInsert = false; insertColumnSet = null; } else if (right.insertColumnSet != null) { if (isFullInsert) { isFullInsert = false; insertColumnSet = ((Table) object).getColumnNameSet(); } insertColumnSet.removeAll(right.insertColumnSet); if (insertColumnSet.isEmpty()) { insertColumnSet = null; } } if (!isFullUpdate && updateColumnSet == null) {} else if (right.isFullUpdate) { isFullUpdate = false; updateColumnSet = null; } else if (right.updateColumnSet != null) { if (isFullUpdate) { isFullUpdate = false; updateColumnSet = ((Table) object).getColumnNameSet(); } updateColumnSet.removeAll(right.updateColumnSet); if (updateColumnSet.isEmpty()) { updateColumnSet = null; } } if (!isFullReferences && referencesColumnSet == null) {} else if (right.isFullReferences) { isFullReferences = false; referencesColumnSet = null; } else if (right.referencesColumnSet != null) { if (isFullReferences) { isFullReferences = false; referencesColumnSet = ((Table) object).getColumnNameSet(); } referencesColumnSet.removeAll(right.referencesColumnSet); if (referencesColumnSet.isEmpty()) { referencesColumnSet = null; } } if (!isFullTrigger && triggerColumnSet == null) {} else if (right.isFullTrigger) { isFullTrigger = false; triggerColumnSet = null; } else if (right.triggerColumnSet != null) { if (isFullTrigger) { isFullTrigger = false; triggerColumnSet = ((Table) object).getColumnNameSet(); } triggerColumnSet.removeAll(right.triggerColumnSet); if (triggerColumnSet.isEmpty()) { triggerColumnSet = null; } } } void clear() { isFull = isFullSelect = isFullInsert = isFullUpdate = isFullReferences = isFullDelete = false; selectColumnSet = insertColumnSet = updateColumnSet = referencesColumnSet = triggerColumnSet = null; } /** * supports column level GRANT / REVOKE */ public boolean isEmpty() { if (isFull || isFullSelect || isFullInsert || isFullUpdate || isFullReferences || isFullDelete) { return false; } if (selectColumnSet != null && !selectColumnSet.isEmpty()) { return false; } if (insertColumnSet != null && !insertColumnSet.isEmpty()) { return false; } if (updateColumnSet != null && !updateColumnSet.isEmpty()) { return false; } if (referencesColumnSet != null && !referencesColumnSet.isEmpty()) { return false; } if (triggerColumnSet != null && !triggerColumnSet.isEmpty()) { return false; } return true; } OrderedHashSet getColumnsForAllRights(Table table) { if (isFull) { return table.getColumnNameSet(); } if (isFullSelect || isFullInsert || isFullUpdate || isFullReferences) { return table.getColumnNameSet(); } OrderedHashSet set = new OrderedHashSet(); if (selectColumnSet != null) { set.addAll(selectColumnSet); } if (insertColumnSet != null) { set.addAll(insertColumnSet); } if (updateColumnSet != null) { set.addAll(updateColumnSet); } if (referencesColumnSet != null) { set.addAll(referencesColumnSet); } return set; } // construction public boolean contains(Right right) { if (isFull) { return true; } if (right.isFull) { return false; } if (!containsRights(isFullSelect, selectColumnSet, right.selectColumnSet, right.isFullSelect)) { return false; } if (!containsRights(isFullInsert, insertColumnSet, right.insertColumnSet, right.isFullInsert)) { return false; } if (!containsRights(isFullUpdate, updateColumnSet, right.updateColumnSet, right.isFullUpdate)) { return false; } if (!containsRights(isFullReferences, referencesColumnSet, right.referencesColumnSet, right.isFullReferences)) { return false; } if (!containsRights(isFullTrigger, triggerColumnSet, right.triggerColumnSet, right.isFullTrigger)) { return false; } if (!isFullDelete && right.isFullDelete) { return false; } return true; } void removeDroppedColumns(OrderedHashSet columnSet, Table table) { for (int i = 0; i < columnSet.size(); i++) { HsqlName name = (HsqlName) columnSet.get(i); if (table.findColumn(name.name) >= 0) { columnSet.remove(i); i--; } } } public OrderedHashSet getColumnsForPrivilege(Table table, int type) { if (isFull) { return table.getColumnNameSet(); } switch (type) { case GrantConstants.SELECT : return isFullSelect ? table.getColumnNameSet() : selectColumnSet == null ? emptySet : selectColumnSet; case GrantConstants.INSERT : return isFullInsert ? table.getColumnNameSet() : insertColumnSet == null ? emptySet : insertColumnSet; case GrantConstants.UPDATE : return isFullUpdate ? table.getColumnNameSet() : updateColumnSet == null ? emptySet : updateColumnSet; case GrantConstants.REFERENCES : return isFullReferences ? table.getColumnNameSet() : referencesColumnSet == null ? emptySet : referencesColumnSet; case GrantConstants.TRIGGER : return isFullTrigger ? table.getColumnNameSet() : triggerColumnSet == null ? emptySet : triggerColumnSet; } return emptySet; } /** * Supports column level checks */ static boolean containsAllColumns(OrderedHashSet columnSet, Table table, boolean[] columnCheckList) { for (int i = 0; i < columnCheckList.length; i++) { if (columnCheckList[i]) { if (columnSet == null) { return false; } if (columnSet.contains(table.getColumn(i).getName())) { continue; } return false; } } return true; } static boolean containsRights(boolean isFull, OrderedHashSet columnSet, OrderedHashSet otherColumnSet, boolean otherIsFull) { if (isFull) { return true; } if (otherIsFull) { return false; } if (otherColumnSet != null && (columnSet == null || !columnSet.containsAll(otherColumnSet))) { return false; } return true; } /** * Supports column level rights */ boolean canSelect(Table table, boolean[] columnCheckList) { if (isFull || isFullSelect) { return true; } return containsAllColumns(selectColumnSet, table, columnCheckList); } /** * Supports column level rights */ boolean canInsert(Table table, boolean[] columnCheckList) { if (isFull || isFullInsert) { return true; } return containsAllColumns(insertColumnSet, table, columnCheckList); } /** * Supports column level rights */ boolean canUpdate(Table table, boolean[] columnCheckList) { if (isFull || isFullUpdate) { return true; } return containsAllColumns(updateColumnSet, table, columnCheckList); } /** * Supports column level rights */ boolean canReference(Table table, boolean[] columnCheckList) { if (isFull || isFullReferences) { return true; } return containsAllColumns(referencesColumnSet, table, columnCheckList); } /** * Supports column level rights */ boolean canTrigger(Table table, boolean[] columnCheckList) { if (isFull || isFullTrigger) { return true; } return containsAllColumns(triggerColumnSet, table, columnCheckList); } boolean canDelete() { return isFull || isFullDelete; } public boolean canAccessFully(int privilegeType) { if (isFull) { return true; } switch (privilegeType) { case GrantConstants.DELETE : return isFullDelete; case GrantConstants.SELECT : return isFullSelect; case GrantConstants.INSERT : return isFullInsert; case GrantConstants.UPDATE : return isFullUpdate; case GrantConstants.REFERENCES : return isFullReferences; case GrantConstants.TRIGGER : return isFullTrigger; case GrantConstants.EXECUTE : return isFull; default : throw Error.runtimeError(ErrorCode.U_S0500, "Right"); } } public boolean canAcesssNonSelect() { if (isFull) { return true; } if (isFullInsert || isFullUpdate || isFullDelete || isFullReferences || isFullTrigger) { return true; } boolean result = false; result |= (insertColumnSet != null && !insertColumnSet.isEmpty()); result |= (updateColumnSet != null && !updateColumnSet.isEmpty()); result |= referencesColumnSet != null && !referencesColumnSet.isEmpty(); result |= triggerColumnSet != null && !triggerColumnSet.isEmpty(); return result; } /** * Supports column level rights */ public boolean canAccess(int privilegeType) { if (isFull) { return true; } switch (privilegeType) { case GrantConstants.DELETE : return isFullDelete; case GrantConstants.SELECT : if (isFullSelect) { return true; } return selectColumnSet != null && !selectColumnSet.isEmpty(); case GrantConstants.INSERT : if (isFullInsert) { return true; } return insertColumnSet != null && !insertColumnSet.isEmpty(); case GrantConstants.UPDATE : if (isFullUpdate) { return true; } return updateColumnSet != null && !updateColumnSet.isEmpty(); case GrantConstants.REFERENCES : if (isFullReferences) { return true; } return referencesColumnSet != null && !referencesColumnSet.isEmpty(); case GrantConstants.TRIGGER : if (isFullTrigger) { return true; } return triggerColumnSet != null && !triggerColumnSet.isEmpty(); case GrantConstants.EXECUTE : return isFull; default : throw Error.runtimeError(ErrorCode.U_S0500, "Right"); } } public boolean canAccess(Table table, int[] columnMap) { if (isFull) { return true; } if (isFullSelect || isFullInsert || isFullUpdate || isFullDelete || isFullReferences || isFullTrigger) { return true; } boolean result = false; result |= (selectColumnSet != null && insertColumnSet.isEmpty()); result |= (insertColumnSet != null && insertColumnSet.isEmpty()); result |= (updateColumnSet != null && !updateColumnSet.isEmpty()); result |= referencesColumnSet != null && !referencesColumnSet.isEmpty(); result |= triggerColumnSet != null && !triggerColumnSet.isEmpty(); if (!result) { return false; } HashSet set = new HashSet(); set.addAll(selectColumnSet); set.addAll(insertColumnSet); set.addAll(updateColumnSet); set.addAll(referencesColumnSet); set.addAll(triggerColumnSet); for (int i = 0; i < columnMap.length; i++) { if (!set.contains(table.getColumn(i).getName())) { return false; } } return result; } /** * supports column level GRANT */ String getTableRightsSQL(Table table) { StringBuffer sb = new StringBuffer(); if (isFull) { return Tokens.T_ALL; } if (isFullSelect) { sb.append(Tokens.T_SELECT); sb.append(','); } else if (selectColumnSet != null) { sb.append(Tokens.T_SELECT); getColumnList(table, selectColumnSet, sb); sb.append(','); } if (isFullInsert) { sb.append(Tokens.T_INSERT); sb.append(','); } else if (insertColumnSet != null) { sb.append(Tokens.T_INSERT); getColumnList(table, insertColumnSet, sb); sb.append(','); } if (isFullUpdate) { sb.append(Tokens.T_UPDATE); sb.append(','); } else if (updateColumnSet != null) { sb.append(Tokens.T_UPDATE); getColumnList(table, updateColumnSet, sb); sb.append(','); } if (isFullDelete) { sb.append(Tokens.T_DELETE); sb.append(','); } if (isFullReferences) { sb.append(Tokens.T_REFERENCES); sb.append(','); } else if (referencesColumnSet != null) { sb.append(Tokens.T_REFERENCES); sb.append(','); } if (isFullTrigger) { sb.append(Tokens.T_TRIGGER); sb.append(','); } else if (triggerColumnSet != null) { sb.append(Tokens.T_TRIGGER); sb.append(','); } return sb.toString().substring(0, sb.length() - 1); } private static void getColumnList(Table t, OrderedHashSet set, StringBuffer buf) { int count = 0; boolean[] colCheckList = t.getNewColumnCheckList(); for (int i = 0; i < set.size(); i++) { HsqlName name = (HsqlName) set.get(i); int colIndex = t.findColumn(name.name); if (colIndex == -1) { continue; } colCheckList[colIndex] = true; count++; } if (count == 0) { throw Error.runtimeError(ErrorCode.U_S0500, "Right"); } buf.append('('); for (int i = 0, colCount = 0; i < colCheckList.length; i++) { if (colCheckList[i]) { colCount++; buf.append(t.getColumn(i).getName().statementName); if (colCount < count) { buf.append(','); } } } buf.append(')'); } public void setColumns(Table table) { if (selectColumnSet != null) { setColumns(table, selectColumnSet); } if (insertColumnSet != null) { setColumns(table, insertColumnSet); } if (updateColumnSet != null) { setColumns(table, updateColumnSet); } if (referencesColumnSet != null) { setColumns(table, referencesColumnSet); } if (triggerColumnSet != null) { setColumns(table, triggerColumnSet); } } private static void setColumns(Table t, OrderedHashSet set) { int count = 0; boolean[] colCheckList = t.getNewColumnCheckList(); for (int i = 0; i < set.size(); i++) { String name = (String) set.get(i); int colIndex = t.findColumn(name); if (colIndex == -1) { throw Error.error(ErrorCode.X_42501, name); } colCheckList[colIndex] = true; count++; } if (count == 0) { throw Error.error(ErrorCode.X_42501); } set.clear(); for (int i = 0; i < colCheckList.length; i++) { if (colCheckList[i]) { set.add(t.getColumn(i).getName()); } } } public void set(int type, OrderedHashSet set) { switch (type) { case GrantConstants.SELECT : if (set == null) { isFullSelect = true; } selectColumnSet = set; break; case GrantConstants.DELETE : if (set == null) { isFullDelete = true; } break; case GrantConstants.INSERT : if (set == null) { isFullInsert = true; } insertColumnSet = set; break; case GrantConstants.UPDATE : if (set == null) { isFullUpdate = true; } updateColumnSet = set; break; case GrantConstants.REFERENCES : if (set == null) { isFullReferences = true; } referencesColumnSet = set; break; case GrantConstants.TRIGGER : if (set == null) { isFullTrigger = true; } triggerColumnSet = set; break; } } /** * Used solely by org.hsqldb.dbinfo in existing system tables lacking column * level reporting.

                  * * Returns names of individual rights instead of ALL */ String[] getTableRightsArray() { if (isFull) { return new String[] { Tokens.T_SELECT, Tokens.T_INSERT, Tokens.T_UPDATE, Tokens.T_DELETE, Tokens.T_REFERENCES }; } HsqlArrayList list = new HsqlArrayList(); String[] array = new String[list.size()]; if (isFullSelect) { list.add(Tokens.T_SELECT); } if (isFullInsert) { list.add(Tokens.T_INSERT); } if (isFullUpdate) { list.add(Tokens.T_UPDATE); } if (isFullDelete) { list.add(Tokens.T_DELETE); } if (isFullReferences) { list.add(Tokens.T_REFERENCES); } if (isFullTrigger) { list.add(Tokens.T_TRIGGER); } list.toArray(array); return array; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rights/GranteeManager.java0000644000175000017500000005640412007547414023776 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rights; import org.hsqldb.Database; import org.hsqldb.HsqlNameManager; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.Routine; import org.hsqldb.RoutineSchema; import org.hsqldb.SchemaObject; import org.hsqldb.SqlInvariants; import org.hsqldb.Tokens; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.Collection; import org.hsqldb.lib.HashMappedList; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.IntValueHashMap; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.Set; /** * Contains a set of Grantee objects, and supports operations for creating, * finding, modifying and deleting Grantee objects for a Database; plus * Administrative privileges. * * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @author Blaine Simpson (blaine dot simpson at admc dot com) * * @version 2.0.1 * @since 1.8.0 * @see Grantee */ public class GranteeManager { /** * The grantee object for the _SYSTEM role. */ static User systemAuthorisation; static { HsqlName name = HsqlNameManager.newSystemObjectName( SqlInvariants.SYSTEM_AUTHORIZATION_NAME, SchemaObject.GRANTEE); systemAuthorisation = new User(name, null); systemAuthorisation.isSystem = true; systemAuthorisation.setAdminDirect(); systemAuthorisation.setInitialSchema( SqlInvariants.SYSTEM_SCHEMA_HSQLNAME); SqlInvariants.INFORMATION_SCHEMA_HSQLNAME.owner = systemAuthorisation; SqlInvariants.SYSTEM_SCHEMA_HSQLNAME.owner = systemAuthorisation; SqlInvariants.LOBS_SCHEMA_HSQLNAME.owner = systemAuthorisation; SqlInvariants.SQLJ_SCHEMA_HSQLNAME.owner = systemAuthorisation; } /** * Map of grantee-String-to-Grantee-objects.

                  * Keys include all USER and ROLE names */ private HashMappedList map = new HashMappedList(); /** * Map of role-Strings-to-Grantee-object.

                  * Keys include all ROLES names */ private HashMappedList roleMap = new HashMappedList(); /** * Used only to pass the SchemaManager to Grantees for checking * schema authorizations. */ Database database; /** * The PUBLIC role. */ Grantee publicRole; /** * The DBA role. */ Grantee dbaRole; /** * The role for schema creation rights. */ Grantee schemaRole; /** * The role for changing authorization rights. */ Grantee changeAuthRole; /** * Construct the GranteeManager for a Database. Construct special Grantee * objects for _SYSTEM, PUBLIC and DBA, and add them to the Grantee map. * * @param database Only needed to link to the RoleManager later on. */ public GranteeManager(Database database) { this.database = database; // map.add(systemAuthorisation.getNameString(), systemAuthorisation); // roleMap.add(systemAuthorisation.getNameString(), systemAuthorisation); addRole( this.database.nameManager.newHsqlName( SqlInvariants.PUBLIC_ROLE_NAME, false, SchemaObject.GRANTEE)); publicRole = getRole(SqlInvariants.PUBLIC_ROLE_NAME); publicRole.isPublic = true; addRole( this.database.nameManager.newHsqlName( SqlInvariants.DBA_ADMIN_ROLE_NAME, false, SchemaObject.GRANTEE)); dbaRole = getRole(SqlInvariants.DBA_ADMIN_ROLE_NAME); dbaRole.setAdminDirect(); addRole( this.database.nameManager.newHsqlName( SqlInvariants.SCHEMA_CREATE_ROLE_NAME, false, SchemaObject.GRANTEE)); schemaRole = getRole(SqlInvariants.SCHEMA_CREATE_ROLE_NAME); addRole( this.database.nameManager.newHsqlName( SqlInvariants.CHANGE_AUTH_ROLE_NAME, false, SchemaObject.GRANTEE)); changeAuthRole = getRole(SqlInvariants.CHANGE_AUTH_ROLE_NAME); } static final IntValueHashMap rightsStringLookup = new IntValueHashMap(7); static { rightsStringLookup.put(Tokens.T_ALL, GrantConstants.ALL); rightsStringLookup.put(Tokens.T_SELECT, GrantConstants.SELECT); rightsStringLookup.put(Tokens.T_UPDATE, GrantConstants.UPDATE); rightsStringLookup.put(Tokens.T_DELETE, GrantConstants.DELETE); rightsStringLookup.put(Tokens.T_INSERT, GrantConstants.INSERT); rightsStringLookup.put(Tokens.T_EXECUTE, GrantConstants.EXECUTE); rightsStringLookup.put(Tokens.T_USAGE, GrantConstants.USAGE); rightsStringLookup.put(Tokens.T_REFERENCES, GrantConstants.REFERENCES); rightsStringLookup.put(Tokens.T_TRIGGER, GrantConstants.TRIGGER); } public Grantee getDBARole() { return dbaRole; } public static Grantee getSystemRole() { return systemAuthorisation; } /** * Grants the rights represented by the rights argument on * the database object identified by the dbobject argument * to the Grantee object identified by name argument.

                  * * Note: For the dbobject argument, Java Class objects are identified * using a String object whose value is the fully qualified name * of the Class, while Table and other objects are * identified by an HsqlName object. A Table * object identifier must be precisely the one obtained by calling * table.getName(); if a different HsqlName * object with an identical name attribute is specified, then * rights checks and tests will fail, since the HsqlName * class implements its {@link HsqlName#hashCode hashCode} and * {@link HsqlName#equals equals} methods based on pure object * identity, rather than on attribute values.

                  */ public void grant(OrderedHashSet granteeList, SchemaObject dbObject, Right right, Grantee grantor, boolean withGrantOption) { if (dbObject instanceof RoutineSchema) { SchemaObject[] routines = ((RoutineSchema) dbObject).getSpecificRoutines(); grant(granteeList, routines, right, grantor, withGrantOption); return; } HsqlName name = dbObject.getName(); if (dbObject instanceof Routine) { name = ((Routine) dbObject).getSpecificName(); } if (!grantor.isGrantable(dbObject, right)) { throw Error.error(ErrorCode.X_0L000, grantor.getName().getNameString()); } if (grantor.isAdmin()) { grantor = dbObject.getOwner(); } checkGranteeList(granteeList); for (int i = 0; i < granteeList.size(); i++) { Grantee grantee = get((String) granteeList.get(i)); grantee.grant(name, right, grantor, withGrantOption); if (grantee.isRole) { updateAllRights(grantee); } } } public void grant(OrderedHashSet granteeList, SchemaObject[] routines, Right right, Grantee grantor, boolean withGrantOption) { boolean granted = false; for (int i = 0; i < routines.length; i++) { if (!grantor.isGrantable(routines[i], right)) { continue; } grant(granteeList, routines[i], right, grantor, withGrantOption); granted = true; } if (!granted) { throw Error.error(ErrorCode.X_0L000, grantor.getName().getNameString()); } } public void checkGranteeList(OrderedHashSet granteeList) { for (int i = 0; i < granteeList.size(); i++) { String name = (String) granteeList.get(i); Grantee grantee = get(name); if (grantee == null) { throw Error.error(ErrorCode.X_28501, name); } if (isImmutable(name)) { throw Error.error(ErrorCode.X_28502, name); } if (grantee instanceof User && ((User) grantee).isExternalOnly) { throw Error.error(ErrorCode.X_28000, name); } } } /** * Grant a role to this Grantee. */ public void grant(String granteeName, String roleName, Grantee grantor) { Grantee grantee = get(granteeName); if (grantee == null) { throw Error.error(ErrorCode.X_28501, granteeName); } if (isImmutable(granteeName)) { throw Error.error(ErrorCode.X_28502, granteeName); } Grantee role = getRole(roleName); if (role == null) { throw Error.error(ErrorCode.X_0P000, roleName); } if (role == grantee) { throw Error.error(ErrorCode.X_0P501, granteeName); } // boucherb@users 20050515 // SQL 2003 Foundation, 4.34.3 // No cycles of role grants are allowed. if (role.hasRole(grantee)) { // boucherb@users /** @todo: Correct reporting of actual grant path */ throw Error.error(ErrorCode.X_0P501, roleName); } if (!grantor.isGrantable(role)) { throw Error.error(ErrorCode.X_0L000, grantor.getName().getNameString()); } grantee.grant(role); grantee.updateAllRights(); if (grantee.isRole) { updateAllRights(grantee); } } public void checkRoleList(String granteeName, OrderedHashSet roleList, Grantee grantor, boolean grant) { Grantee grantee = get(granteeName); for (int i = 0; i < roleList.size(); i++) { String roleName = (String) roleList.get(i); Grantee role = getRole(roleName); if (role == null) { throw Error.error(ErrorCode.X_0P000, roleName); } if (roleName.equals(SqlInvariants.SYSTEM_AUTHORIZATION_NAME) || roleName.equals(SqlInvariants.PUBLIC_ROLE_NAME)) { throw Error.error(ErrorCode.X_28502, roleName); } if (grant) { if (grantee.getDirectRoles().contains(role)) { /** @todo shouldnt throw */ throw Error.error(ErrorCode.X_0P000, granteeName); } } else { if (!grantee.getDirectRoles().contains(role)) { /** @todo shouldnt throw */ throw Error.error(ErrorCode.X_0P000, roleName); } } if (!grantor.isAdmin()) { throw Error.error(ErrorCode.X_0L000, grantor.getName().getNameString()); } } } public void grantSystemToPublic(SchemaObject object, Right right) { publicRole.grant(object.getName(), right, systemAuthorisation, true); } /** * Revoke a role from a Grantee */ public void revoke(String granteeName, String roleName, Grantee grantor) { if (!grantor.isAdmin()) { throw Error.error(ErrorCode.X_42507); } Grantee grantee = get(granteeName); if (grantee == null) { throw Error.error(ErrorCode.X_28000, granteeName); } Grantee role = (Grantee) roleMap.get(roleName); grantee.revoke(role); grantee.updateAllRights(); if (grantee.isRole) { updateAllRights(grantee); } } /** * Revokes the rights represented by the rights argument on * the database object identified by the dbobject argument * from the User object identified by the name * argument.

                  * @see #grant */ public void revoke(OrderedHashSet granteeList, SchemaObject dbObject, Right rights, Grantee grantor, boolean grantOption, boolean cascade) { if (dbObject instanceof RoutineSchema) { SchemaObject[] routines = ((RoutineSchema) dbObject).getSpecificRoutines(); revoke(granteeList, routines, rights, grantor, grantOption, cascade); return; } HsqlName name = dbObject.getName(); if (dbObject instanceof Routine) { name = ((Routine) dbObject).getSpecificName(); } if (!grantor.isFullyAccessibleByRole(name)) { throw Error.error(ErrorCode.X_42501, dbObject.getName().name); } if (grantor.isAdmin()) { grantor = dbObject.getOwner(); } for (int i = 0; i < granteeList.size(); i++) { String granteeName = (String) granteeList.get(i); Grantee g = get(granteeName); if (g == null) { throw Error.error(ErrorCode.X_28501, granteeName); } if (isImmutable(granteeName)) { throw Error.error(ErrorCode.X_28502, granteeName); } } for (int i = 0; i < granteeList.size(); i++) { String granteeName = (String) granteeList.get(i); Grantee g = get(granteeName); g.revoke(dbObject, rights, grantor, grantOption); g.updateAllRights(); if (g.isRole) { updateAllRights(g); } } } public void revoke(OrderedHashSet granteeList, SchemaObject[] routines, Right rights, Grantee grantor, boolean grantOption, boolean cascade) { for (int i = 0; i < routines.length; i++) { revoke(granteeList, routines[i], rights, grantor, grantOption, cascade); } } /** * Removes a role without any privileges from all grantees */ void removeEmptyRole(Grantee role) { for (int i = 0; i < map.size(); i++) { Grantee grantee = (Grantee) map.get(i); grantee.roles.remove(role); } } /** * Removes all rights mappings for the database object identified by * the dbobject argument from all Grantee objects in the set. */ public void removeDbObject(HsqlName name) { for (int i = 0; i < map.size(); i++) { Grantee g = (Grantee) map.get(i); g.revokeDbObject(name); } } public void removeDbObjects(OrderedHashSet nameSet) { Iterator it = nameSet.iterator(); while (it.hasNext()) { HsqlName name = (HsqlName) it.next(); for (int i = 0; i < map.size(); i++) { Grantee g = (Grantee) map.get(i); g.revokeDbObject(name); } } } /** * First updates all ROLE Grantee objects. Then updates all USER Grantee * Objects. */ void updateAllRights(Grantee role) { for (int i = 0; i < map.size(); i++) { Grantee grantee = (Grantee) map.get(i); if (grantee.isRole) { grantee.updateNestedRoles(role); } } for (int i = 0; i < map.size(); i++) { Grantee grantee = (Grantee) map.get(i); if (!grantee.isRole) { grantee.updateAllRights(); } } } /** */ public boolean removeGrantee(String name) { /* * Explicitly can't remove PUBLIC_USER_NAME and system grantees. */ if (isReserved(name)) { return false; } Grantee g = (Grantee) map.remove(name); if (g == null) { return false; } g.clearPrivileges(); updateAllRights(g); if (g.isRole) { roleMap.remove(name); removeEmptyRole(g); } return true; } /** * Creates a new Role object under management of this object.

                  * * A set of constraints regarding user creation is imposed:

                  * *

                    *
                  1. Can't create a role with name same as any right. * *
                  2. If this object's collection already contains an element whose * name attribute equals the name argument, then * a GRANTEE_ALREADY_EXISTS or ROLE_ALREADY_EXISTS Trace * is thrown. * (This will catch attempts to create Reserved grantee names). *
                  */ public Grantee addRole(HsqlName name) { if (map.containsKey(name.name)) { throw Error.error(ErrorCode.X_28503, name.name); } if (SqlInvariants.isLobsSchemaName(name.name) || SqlInvariants.isSystemSchemaName(name.name)) { throw Error.error(ErrorCode.X_28502, name.name); } Grantee g = new Grantee(name, this); g.isRole = true; map.put(name.name, g); roleMap.add(name.name, g); return g; } public User addUser(HsqlName name) { if (map.containsKey(name.name)) { throw Error.error(ErrorCode.X_28503, name.name); } if (SqlInvariants.isLobsSchemaName(name.name) || SqlInvariants.isSystemSchemaName(name.name)) { throw Error.error(ErrorCode.X_28502, name.name); } User g = new User(name, this); map.put(name.name, g); return g; } /** * Returns true if named Grantee object exists. * This will return true for reserved Grantees * SYSTEM_AUTHORIZATION_NAME, ADMIN_ROLE_NAME, PUBLIC_USER_NAME. */ boolean isGrantee(String name) { return map.containsKey(name); } public static int getCheckSingleRight(String right) { int r = getRight(right); if (r != 0) { return r; } throw Error.error(ErrorCode.X_42581, right); } /** * Translate a string representation or right(s) into its numeric form. */ public static int getRight(String right) { return rightsStringLookup.get(right, 0); } public Grantee get(String name) { return (Grantee) map.get(name); } public Collection getGrantees() { return map.values(); } public static boolean validRightString(String rightString) { return getRight(rightString) != 0; } public static boolean isImmutable(String name) { return name.equals(SqlInvariants.SYSTEM_AUTHORIZATION_NAME) || name.equals(SqlInvariants.DBA_ADMIN_ROLE_NAME) || name.equals(SqlInvariants.SCHEMA_CREATE_ROLE_NAME) || name.equals(SqlInvariants.CHANGE_AUTH_ROLE_NAME); } public static boolean isReserved(String name) { return name.equals(SqlInvariants.SYSTEM_AUTHORIZATION_NAME) || name.equals(SqlInvariants.DBA_ADMIN_ROLE_NAME) || name.equals(SqlInvariants.SCHEMA_CREATE_ROLE_NAME) || name.equals(SqlInvariants.CHANGE_AUTH_ROLE_NAME) || name.equals(SqlInvariants.PUBLIC_ROLE_NAME); } /** * Attempts to drop a Role with the specified name * from this object's set.

                  * * A successful drop action consists of:

                  * *

                    * *
                  • removing the Grantee object with the specified name * from the set. *

                  * */ public void dropRole(String name) { if (!isRole(name)) { throw Error.error(ErrorCode.X_0P000, name); } if (GranteeManager.isReserved(name)) { throw Error.error(ErrorCode.X_42507); } removeGrantee(name); } public Set getRoleNames() { return roleMap.keySet(); } public Collection getRoles() { return roleMap.values(); } /** * Returns Grantee for the named Role */ public Grantee getRole(String name) { Grantee g = (Grantee) roleMap.get(name); if (g == null) { throw Error.error(ErrorCode.X_0P000, name); } return g; } public boolean isRole(String name) { return roleMap.containsKey(name); } public String[] getSQL() { HsqlArrayList list = new HsqlArrayList(); // roles Iterator it = getRoles().iterator(); while (it.hasNext()) { Grantee grantee = (Grantee) it.next(); // ADMIN_ROLE_NAME is not persisted if (!GranteeManager.isReserved( grantee.getName().getNameString())) { list.add(grantee.getSQL()); } } // users it = getGrantees().iterator(); for (; it.hasNext(); ) { Grantee grantee = (Grantee) it.next(); if (grantee instanceof User) { if (((User) grantee).isExternalOnly) { continue; } list.add(grantee.getSQL()); if (((User) grantee).isLocalOnly) { list.add(((User) grantee).getLocalUserSQL()); } } } String[] array = new String[list.size()]; list.toArray(array); return array; } public String[] getRightstSQL() { HsqlArrayList list = new HsqlArrayList(); Iterator grantees = getGrantees().iterator(); while (grantees.hasNext()) { Grantee grantee = (Grantee) grantees.next(); String name = grantee.getName().getNameString(); // _SYSTEM user, DBA Role grants not persisted if (GranteeManager.isImmutable(name)) { continue; } if (grantee instanceof User && ((User) grantee).isExternalOnly) { continue; } HsqlArrayList subList = grantee.getRightsSQL(); list.addAll(subList); } String[] array = new String[list.size()]; list.toArray(array); return array; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rights/GrantConstants.java0000644000175000017500000000476312007547414024067 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rights; /** * The constants for grants. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @version 1.7.2 * @since 1.7.2 */ public interface GrantConstants { /** Flag required to SELECT from a table. */ int SELECT = 1 << 0; /** Flag required to DELETE from a table. */ int DELETE = 1 << 1; /** Flag required to INSERT into a table. */ int INSERT = 1 << 2; /** Flag required to UPDATE a table. */ int UPDATE = 1 << 3; /** Flag required to use a sequence. */ int USAGE = 1 << 4; /** Flag required to execute a routine. */ int EXECUTE = 1 << 5; /** Flag required for check or assertion constraint referencing a column. */ int REFERENCES = 1 << 6; /** Flag required to use of a trigger. */ int TRIGGER = 1 << 7; /** Combined flag permitting any action. */ int ALL = SELECT | DELETE | INSERT | UPDATE | USAGE | EXECUTE; } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/rights/Grantee.java0000644000175000017500000010603412007547414022476 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.rights; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.NumberSequence; import org.hsqldb.Routine; import org.hsqldb.SchemaObject; import org.hsqldb.Session; import org.hsqldb.Table; import org.hsqldb.Tokens; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.HashMap; import org.hsqldb.lib.HashSet; import org.hsqldb.lib.HsqlArrayList; import org.hsqldb.lib.Iterator; import org.hsqldb.lib.MultiValueHashMap; import org.hsqldb.lib.OrderedHashSet; import org.hsqldb.lib.Set; import org.hsqldb.types.Type; /** * A Grantee Object holds the name, access and administrative rights for a * particular grantee.

                  * It supplies the methods used to grant, revoke, test * and check a grantee's access rights to other database objects. * It also holds a reference to the common PUBLIC User Object, * which represent the special user refered to in * GRANT ... TO PUBLIC statements.

                  * The check(), isAccessible() and getGrantedClassNames() methods check the * rights granted to the PUBLIC User Object, in addition to individually * granted rights, in order to decide which rights exist for the user. * * Method names ending in Direct indicate methods which do not recurse * to look through Roles which "this" object is a member of. * * We use the word "Admin" (e.g., in private variable "admin" and method * "isAdmin()) to mean this Grantee has admin priv by any means. * We use the word "adminDirect" (e.g., in private variable "adminDirect" * and method "isAdminDirect()) to mean this Grantee has admin priv * directly. * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @author Blaine Simpson (blaine dot simpson at admc dot com) * * @version 2.0.1 * @since 1.8.0 */ public class Grantee implements SchemaObject { boolean isRole; /** * true if this grantee has database administrator priv directly * (ie., not by membership in any role) */ private boolean isAdminDirect = false; /** true if this grantee has database administrator priv by any means. */ private boolean isAdmin = false; /** true if this user can create schemas with its own authorisation */ boolean isSchemaCreator = false; /** true if this grantee is PUBLIC. */ boolean isPublic = false; /** true if this grantee is _SYSTEM. */ boolean isSystem = false; /** Grantee name. */ protected HsqlName granteeName; /** map with database object identifier keys and access privileges values */ private MultiValueHashMap directRightsMap; /** contains righs granted direct, or via roles, expept those of PUBLIC */ HashMap fullRightsMap; /** These are the DIRECT roles. Each of these may contain nested roles */ OrderedHashSet roles; /** map with database object identifier keys and access privileges values */ private MultiValueHashMap grantedRightsMap; /** Needed only to give access to the roles for this database */ protected GranteeManager granteeManager; /** */ protected Right ownerRights; /** * Constructor. */ Grantee(HsqlName name, GranteeManager man) { fullRightsMap = new HashMap(); directRightsMap = new MultiValueHashMap(); grantedRightsMap = new MultiValueHashMap(); granteeName = name; granteeManager = man; roles = new OrderedHashSet(); ownerRights = new Right(); ownerRights.isFull = true; ownerRights.grantor = GranteeManager.systemAuthorisation; ownerRights.grantee = this; } public int getType() { return SchemaObject.GRANTEE; } public HsqlName getName() { return granteeName; } public HsqlName getSchemaName() { return null; } public HsqlName getCatalogName() { return null; } public Grantee getOwner() { return null; } public OrderedHashSet getReferences() { return new OrderedHashSet(); } public OrderedHashSet getComponents() { return null; } public void compile(Session session, SchemaObject parentObject) {} public String getSQL() { StringBuffer sb = new StringBuffer(); sb.append(Tokens.T_CREATE).append(' ').append(Tokens.T_ROLE); sb.append(' ').append(granteeName.statementName); return sb.toString(); } public long getChangeTimestamp() { return 0; } public boolean isRole() { return isRole; } public boolean isSystem() { return isSystem; } /** * Gets direct roles, not roles nested within them. */ public OrderedHashSet getDirectRoles() { return roles; } /** * Gets direct and indirect roles. */ public OrderedHashSet getAllRoles() { OrderedHashSet set = getGranteeAndAllRoles(); // Since we added "Grantee" in addition to Roles, need to remove self. set.remove(this); return set; } public OrderedHashSet getGranteeAndAllRoles() { OrderedHashSet set = new OrderedHashSet(); addGranteeAndRoles(set); return set; } public OrderedHashSet getGranteeAndAllRolesWithPublic() { OrderedHashSet set = new OrderedHashSet(); addGranteeAndRoles(set); set.add(granteeManager.publicRole); return set; } public boolean isAccessible(HsqlName name, int privilegeType) { if (isFullyAccessibleByRole(name)) { return true; } Right right = (Right) fullRightsMap.get(name); if (right == null) { return false; } return right.canAccess(privilegeType); } /** * returns true if grantee has any privilege (to any column) of the object */ public boolean isAccessible(SchemaObject object) { return isAccessible(object.getName()); } public boolean isAccessible(HsqlName name) { if (isFullyAccessibleByRole(name)) { return true; } Right right = (Right) fullRightsMap.get(name); if (right != null && !right.isEmpty()) { return true; } if (!isPublic) { return granteeManager.publicRole.isAccessible(name); } return false; } /** * Adds to given Set this.sName plus all roles and nested roles. * * @return Given role with new elements added. */ private OrderedHashSet addGranteeAndRoles(OrderedHashSet set) { Grantee candidateRole; set.add(this); for (int i = 0; i < roles.size(); i++) { candidateRole = (Grantee) roles.get(i); if (!set.contains(candidateRole)) { candidateRole.addGranteeAndRoles(set); } } return set; } private boolean hasRoleDirect(Grantee role) { return roles.contains(role); } public boolean hasRole(Grantee role) { return getAllRoles().contains(role); } /** * Grants the specified rights on the specified database object.

                  * * Keys stored in rightsMap for database tables are their HsqlName * attribute. This allows rights to persist when a table is renamed.

                  */ void grant(HsqlName name, Right right, Grantee grantor, boolean withGrant) { final Right grantableRights = ((Grantee) grantor).getAllGrantableRights(name); Right existingRight = null; if (right == Right.fullRights) { if (grantableRights.isEmpty()) { return; // has no rights } right = grantableRights; } else { if (!grantableRights.contains(right)) { throw Error.error(ErrorCode.X_0L000); } } Iterator it = directRightsMap.get(name); while (it.hasNext()) { Right existing = (Right) it.next(); if (existing.grantor == grantor) { existingRight = existing; existingRight.add(right); break; } } if (existingRight == null) { existingRight = right.duplicate(); existingRight.grantor = grantor; existingRight.grantee = this; directRightsMap.put(name, existingRight); } if (withGrant) { if (existingRight.grantableRights == null) { existingRight.grantableRights = right.duplicate(); } else { existingRight.grantableRights.add(right); } } if (!grantor.isSystem()) { // based on assumption that there is no need to access ((Grantee) grantor).grantedRightsMap.put(name, existingRight); } updateAllRights(); } /** * Revokes the specified rights on the specified database object.

                  * * If, after removing the specified rights, no rights remain on the * database object, then the key/value pair for that object is removed * from the rights map */ void revoke(SchemaObject object, Right right, Grantee grantor, boolean grantOption) { HsqlName name = object.getName(); if (object instanceof Routine) { name = ((Routine) object).getSpecificName(); } Iterator it = directRightsMap.get(name); Right existing = null; while (it.hasNext()) { existing = (Right) it.next(); if (existing.grantor == grantor) { break; } } if (existing == null) { return; } if (existing.grantableRights != null) { existing.grantableRights.remove(object, right); } if (grantOption) { return; } if (right.isFull) { directRightsMap.remove(name, existing); ((Grantee) grantor).grantedRightsMap.remove(name, existing); updateAllRights(); return; } existing.remove(object, right); if (existing.isEmpty()) { directRightsMap.remove(name, existing); ((Grantee) grantor).grantedRightsMap.remove(name, existing); } updateAllRights(); return; } /** * Revokes all rights on the specified database object.

                  * * This method removes any existing mapping from the rights map */ void revokeDbObject(HsqlName name) { directRightsMap.remove(name); grantedRightsMap.remove(name); fullRightsMap.remove(name); } /** * Revokes all rights from this Grantee object. The map is cleared and * the database administrator role attribute is set false. */ void clearPrivileges() { roles.clear(); directRightsMap.clear(); grantedRightsMap.clear(); fullRightsMap.clear(); isAdmin = false; } public OrderedHashSet getColumnsForAllPrivileges(SchemaObject object) { if (object instanceof Table) { Table table = (Table) object; if (isFullyAccessibleByRole(table.getName())) { return table.getColumnNameSet(); } Right right = (Right) fullRightsMap.get(table.getName()); return right == null ? Right.emptySet : right.getColumnsForAllRights(table); } return Right.emptySet; } public OrderedHashSet getAllDirectPrivileges(SchemaObject object) { if (object.getOwner() == this) { OrderedHashSet set = new OrderedHashSet(); set.add(ownerRights); return set; } HsqlName name = object.getName(); if (object instanceof Routine) { name = ((Routine) object).getSpecificName(); } Iterator rights = directRightsMap.get(name); if (rights.hasNext()) { OrderedHashSet set = new OrderedHashSet(); while (rights.hasNext()) { set.add(rights.next()); } return set; } return Right.emptySet; } public OrderedHashSet getAllGrantedPrivileges(SchemaObject object) { HsqlName name = object.getName(); if (object instanceof Routine) { name = ((Routine) object).getSpecificName(); } Iterator rights = grantedRightsMap.get(name); if (rights.hasNext()) { OrderedHashSet set = new OrderedHashSet(); while (rights.hasNext()) { set.add(rights.next()); } return set; } return Right.emptySet; } /** * Checks if a right represented by the methods * have been granted on the specified database object.

                  * * This is done by checking that a mapping exists in the rights map * from the dbobject argument. Otherwise, it throws. */ public void checkSelect(SchemaObject object, boolean[] checkList) { if (object instanceof Table) { Table table = (Table) object; if (isFullyAccessibleByRole(table.getName())) { return; } Right right = (Right) fullRightsMap.get(table.getName()); if (right != null && right.canSelect(table, checkList)) { return; } } throw Error.error(ErrorCode.X_42501, object.getName().name); } public void checkInsert(SchemaObject object, boolean[] checkList) { if (object instanceof Table) { Table table = (Table) object; if (isFullyAccessibleByRole(table.getName())) { return; } Right right = (Right) fullRightsMap.get(table.getName()); if (right != null && right.canInsert(table, checkList)) { return; } } throw Error.error(ErrorCode.X_42501, object.getName().name); } public void checkUpdate(SchemaObject object, boolean[] checkList) { if (object instanceof Table) { Table table = (Table) object; if (isFullyAccessibleByRole(table.getName())) { return; } Right right = (Right) fullRightsMap.get(table.getName()); if (right != null && right.canUpdate(table, checkList)) { return; } } throw Error.error(ErrorCode.X_42501, object.getName().name); } public void checkReferences(SchemaObject object, boolean[] checkList) { if (object instanceof Table) { Table table = (Table) object; if (isFullyAccessibleByRole(table.getName())) { return; } Right right = (Right) fullRightsMap.get(table.getName()); if (right != null && right.canReference(table, checkList)) { return; } } throw Error.error(ErrorCode.X_42501, object.getName().name); } public void checkTrigger(SchemaObject object, boolean[] checkList) { if (object instanceof Table) { Table table = (Table) object; if (isFullyAccessibleByRole(table.getName())) { return; } Right right = (Right) fullRightsMap.get(table.getName()); if (right != null && right.canReference(table, checkList)) { return; } } throw Error.error(ErrorCode.X_42501, object.getName().name); } public void checkDelete(SchemaObject object) { if (object instanceof Table) { Table table = (Table) object; if (isFullyAccessibleByRole(table.getName())) { return; } Right right = (Right) fullRightsMap.get(table.getName()); if (right != null && right.canDelete()) { return; } } throw Error.error(ErrorCode.X_42501, object.getName().name); } public void checkAccess(SchemaObject object) { if (isFullyAccessibleByRole(object.getName())) { return; } HsqlName name = object.getName(); if (object instanceof Routine) { name = ((Routine) object).getSpecificName(); } Right right = (Right) fullRightsMap.get(name); if (right != null && !right.isEmpty()) { return; } throw Error.error(ErrorCode.X_42501, object.getName().name); } /** * Checks if this object can modify schema objects or grant access rights * to them. */ public void checkSchemaUpdateOrGrantRights(String schemaName) { if (!hasSchemaUpdateOrGrantRights(schemaName)) { throw Error.error(ErrorCode.X_42501, schemaName); } } /** * Checks if this object can modify schema objects or grant access rights * to them. */ public boolean hasSchemaUpdateOrGrantRights(String schemaName) { // If a DBA if (isAdmin()) { return true; } Grantee schemaOwner = granteeManager.database.schemaManager.toSchemaOwner(schemaName); // If owner of Schema if (schemaOwner == this) { return true; } // If a member of Schema authorization role if (hasRole(schemaOwner)) { return true; } return false; } public boolean isGrantable(SchemaObject object, Right right) { if (isFullyAccessibleByRole(object.getName())) { return true; } Right grantableRights = getAllGrantableRights(object.getName()); return grantableRights.contains(right); } public boolean isGrantable(Grantee role) { return isAdmin; } public boolean isFullyAccessibleByRole(HsqlName name) { Grantee owner; if (isAdmin) { return true; } if (name.type == SchemaObject.SCHEMA) { owner = name.owner; } else if (name.schema == null) { return false; } else { owner = name.schema.owner; } if (owner == this) { return true; } if (hasRole(owner)) { return true; } return false; } /** * Checks whether this Grantee has administrative privs either directly * or indirectly. Otherwise it throws. */ public void checkAdmin() { if (!isAdmin()) { throw Error.error(ErrorCode.X_42507); } } /** * Returns true if this Grantee has administrative privs either directly * or indirectly. */ public boolean isAdmin() { return isAdmin; } /** * Returns true if this Grantee can create schemas with own authorization. */ public boolean isSchemaCreator() { return isAdmin || hasRole(granteeManager.schemaRole); } /** * Returns true if this Grantee can change to a different user. */ public boolean canChangeAuthorisation() { return isAdmin || hasRole(granteeManager.changeAuthRole); } /** * Returns true if this grantee object is for the PUBLIC role. */ public boolean isPublic() { return isPublic; } /** * Iteration of all visible grantees, including self.

                  * * For grantees with admin, this is all grantees. * For regular grantees, this is self plus all roles granted directly * or indirectly */ public OrderedHashSet visibleGrantees() { OrderedHashSet grantees = new OrderedHashSet(); GranteeManager gm = granteeManager; if (isAdmin()) { grantees.addAll(gm.getGrantees()); } else { grantees.add(this); Iterator it = getAllRoles().iterator(); while (it.hasNext()) { grantees.add(it.next()); } } return grantees; } public boolean hasNonSelectTableRight(SchemaObject table) { if (isFullyAccessibleByRole(table.getName())) { return true; } Right right = (Right) fullRightsMap.get(table.getName()); if (right == null) { return false; } return right.canAcesssNonSelect(); } public boolean hasColumnRights(SchemaObject table, int[] columnMap) { if (isFullyAccessibleByRole(table.getName())) { return true; } Right right = (Right) fullRightsMap.get(table.getName()); if (right == null) { return false; } return right.canAccess((Table) table, columnMap); } /** * Violates naming convention (for backward compatibility). * Should be "setAdminDirect(boolean"). */ void setAdminDirect() { isAdmin = isAdminDirect = true; } /** * Recursive method used with ROLE Grantee objects to set the fullRightsMap * and admin flag for all the roles. * * If a new ROLE is granted to a ROLE Grantee object, the ROLE should first * be added to the Set of ROLE Grantee objects (roles) for the grantee. * The grantee will be the parameter. * * If the direct permissions granted to an existing ROLE Grentee is * modified no extra initial action is necessary. * The existing Grantee will be the parameter. * * If an existing ROLE is REVOKEed from a ROLE, it should first be removed * from the set of ROLE Grantee objects in the containing ROLE. * The containing ROLE will be the parameter. * * If an existing ROLE is DROPped, all its privileges should be cleared * first. The ROLE will be the parameter. After calling this method on * all other roles, the DROPped role should be removed from all grantees. * * After the initial modification, this method should be called iteratively * on all the ROLE Grantee objects contained in RoleManager. * * The updateAllRights() method is then called iteratively on all the * USER Grantee objects contained in UserManager. * @param role a modified, revoked or dropped role. * @return true if this Grantee has possibly changed as a result */ boolean updateNestedRoles(Grantee role) { boolean hasNested = false; if (role != this) { for (int i = 0; i < roles.size(); i++) { Grantee currentRole = (Grantee) roles.get(i); hasNested |= currentRole.updateNestedRoles(role); } } if (hasNested) { updateAllRights(); } return hasNested || role == this; } /** * Method used with all Grantee objects to set the full set of rights * according to those inherited form ROLE Grantee objects and those * granted to the object itself. */ /** * @todo -- see if this is correct and the currentRole.fullRightsMap * is always updated prior to being added to this.fullRightsMap */ void updateAllRights() { fullRightsMap.clear(); isAdmin = isAdminDirect; for (int i = 0; i < roles.size(); i++) { Grantee currentRole = (Grantee) roles.get(i); addToFullRights(currentRole.fullRightsMap); isAdmin |= currentRole.isAdmin(); } addToFullRights(directRightsMap); if (!isRole && !isPublic && !isSystem) { addToFullRights(granteeManager.publicRole.fullRightsMap); } } /** * Full or partial rights are added to existing */ void addToFullRights(HashMap map) { Iterator it = map.keySet().iterator(); while (it.hasNext()) { Object key = it.next(); Right add = (Right) map.get(key); Right existing = (Right) fullRightsMap.get(key); if (existing == null) { existing = add.duplicate(); fullRightsMap.put(key, existing); } else { existing.add(add); } if (add.grantableRights == null) { continue; } if (existing.grantableRights == null) { existing.grantableRights = add.grantableRights.duplicate(); } else { existing.grantableRights.add(add.grantableRights); } } } /** * Full or partial rights are added to existing */ private void addToFullRights(MultiValueHashMap map) { Iterator it = map.keySet().iterator(); while (it.hasNext()) { Object key = it.next(); Iterator values = map.get(key); Right existing = (Right) fullRightsMap.get(key); while (values.hasNext()) { Right add = (Right) values.next(); if (existing == null) { existing = add.duplicate(); fullRightsMap.put(key, existing); } else { existing.add(add); } if (add.grantableRights == null) { continue; } if (existing.grantableRights == null) { existing.grantableRights = add.grantableRights.duplicate(); } else { existing.grantableRights.add(add.grantableRights); } } } } Right getAllGrantableRights(HsqlName name) { if (isAdmin) { return ((Grantee) name.schema.owner).ownerRights; } if (name.schema.owner == this) { return ownerRights; } if (roles.contains(name.schema.owner)) { return ((Grantee) name.schema.owner).ownerRights; } OrderedHashSet set = getAllRoles(); for (int i = 0; i < set.size(); i++) { Grantee role = (Grantee) set.get(i); if (name.schema.owner == role) { return role.ownerRights; } } Right right = (Right) fullRightsMap.get(name); return right == null || right.grantableRights == null ? Right.noRights : right .grantableRights; } /** * Retrieves the map object that represents the rights that have been * granted on database objects.

                  * * The map has keys and values with the following interpretation:

                  * *

                    *
                  • The keys are generally (but not limited to) objects having * an attribute or value equal to the name of an actual database * object. * *
                  • Specifically, the keys act as database object identifiers. * *
                  • The values are Right objects. *
                  */ private MultiValueHashMap getRights() { // necessary to create the script return directRightsMap; } /** * Grant a role */ void grant(Grantee role) { roles.add(role); } /** * Revoke a direct role only */ void revoke(Grantee role) { if (!hasRoleDirect(role)) { throw Error.error(ErrorCode.X_0P503, role.getName().getNameString()); } roles.remove(role); } private String roleMapToString(OrderedHashSet roles) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < roles.size(); i++) { if (sb.length() > 0) { sb.append(','); } Grantee role = (Grantee) roles.get(i); sb.append(role.getName().getStatementName()); } return sb.toString(); } HsqlArrayList getRightsSQL() { HsqlArrayList list = new HsqlArrayList(); String roleString = roleMapToString(roles); if (roleString.length() != 0) { StringBuffer sb = new StringBuffer(128); sb.append(Tokens.T_GRANT).append(' ').append(roleString); sb.append(' ').append(Tokens.T_TO).append(' '); sb.append(getName().getStatementName()); list.add(sb.toString()); } MultiValueHashMap rightsMap = getRights(); Iterator dbObjects = rightsMap.keySet().iterator(); while (dbObjects.hasNext()) { Object nameObject = dbObjects.next(); Iterator rights = rightsMap.get(nameObject); while (rights.hasNext()) { Right right = (Right) rights.next(); StringBuffer sb = new StringBuffer(128); HsqlName hsqlname = (HsqlName) nameObject; switch (hsqlname.type) { case SchemaObject.TABLE : case SchemaObject.VIEW : Table table = granteeManager.database.schemaManager .findUserTable(null, hsqlname.name, hsqlname.schema.name); if (table != null) { sb.append(Tokens.T_GRANT).append(' '); sb.append(right.getTableRightsSQL(table)); sb.append(' ').append(Tokens.T_ON).append(' '); sb.append(Tokens.T_TABLE).append(' '); sb.append( hsqlname.getSchemaQualifiedStatementName()); } break; case SchemaObject.SEQUENCE : NumberSequence sequence = (NumberSequence) granteeManager.database .schemaManager .findSchemaObject(hsqlname.name, hsqlname.schema.name, SchemaObject.SEQUENCE); if (sequence != null) { sb.append(Tokens.T_GRANT).append(' '); sb.append(Tokens.T_USAGE); sb.append(' ').append(Tokens.T_ON).append(' '); sb.append(Tokens.T_SEQUENCE).append(' '); sb.append( hsqlname.getSchemaQualifiedStatementName()); } break; case SchemaObject.DOMAIN : Type domain = (Type) granteeManager.database.schemaManager .findSchemaObject(hsqlname.name, hsqlname.schema.name, SchemaObject.DOMAIN); if (domain != null) { sb.append(Tokens.T_GRANT).append(' '); sb.append(Tokens.T_USAGE); sb.append(' ').append(Tokens.T_ON).append(' '); sb.append(Tokens.T_DOMAIN).append(' '); sb.append( hsqlname.getSchemaQualifiedStatementName()); } break; case SchemaObject.TYPE : Type type = (Type) granteeManager.database.schemaManager .findSchemaObject(hsqlname.name, hsqlname.schema.name, SchemaObject.DOMAIN); if (type != null) { sb.append(Tokens.T_GRANT).append(' '); sb.append(Tokens.T_USAGE); sb.append(' ').append(Tokens.T_ON).append(' '); sb.append(Tokens.T_TYPE).append(' '); sb.append( hsqlname.getSchemaQualifiedStatementName()); } break; case SchemaObject.PROCEDURE : case SchemaObject.FUNCTION : case SchemaObject.SPECIFIC_ROUTINE : SchemaObject routine = (SchemaObject) granteeManager.database .schemaManager .findSchemaObject(hsqlname.name, hsqlname.schema.name, hsqlname.type); if (routine != null) { sb.append(Tokens.T_GRANT).append(' '); sb.append(Tokens.T_EXECUTE).append(' '); sb.append(Tokens.T_ON).append(' '); sb.append(Tokens.T_SPECIFIC).append(' '); if (routine.getType() == SchemaObject.PROCEDURE) { sb.append(Tokens.T_PROCEDURE); } else { sb.append(Tokens.T_FUNCTION); } sb.append(' '); sb.append( hsqlname.getSchemaQualifiedStatementName()); } break; } if (sb.length() == 0) { continue; } sb.append(' ').append(Tokens.T_TO).append(' '); sb.append(getName().getStatementName()); list.add(sb.toString()); } } return list; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/TableDerived.java0000644000175000017500000003273512007547362022153 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import java.util.Comparator; import org.hsqldb.HsqlNameManager.HsqlName; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayUtil; import org.hsqldb.lib.HashMappedList; import org.hsqldb.navigator.RowIterator; import org.hsqldb.navigator.RowSetNavigatorData; import org.hsqldb.navigator.RowSetNavigatorDataTable; import org.hsqldb.persist.PersistentStore; import org.hsqldb.result.Result; import org.hsqldb.types.Type; /** * Table with data derived from a query expression. * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class TableDerived extends Table implements Comparator { // public final static TableDerived[] emptyArray = new TableDerived[]{}; // QueryExpression queryExpression; Expression dataExpression; boolean uniqueRows; boolean uniquePredicate; String sql; View view; int depth; boolean canRecompile = false; public TableDerived(Database database, HsqlName name, int type) { super(database, name, type); switch (type) { // for special use, not INFORMATION_SCHEMA views case TableBase.CHANGE_SET_TABLE : case TableBase.SYSTEM_TABLE : case TableBase.FUNCTION_TABLE : case TableBase.VIEW_TABLE : case TableBase.RESULT_TABLE : case TableBase.SYSTEM_SUBQUERY : break; default : throw Error.runtimeError(ErrorCode.U_S0500, "Table"); } } public TableDerived(Database database, HsqlName name, int type, Type[] columnTypes, HashMappedList columnList, int[] pkColumns) { this(database, name, type); this.colTypes = columnTypes; this.columnList = columnList; columnCount = columnList.size(); createPrimaryKey(null, pkColumns, true); } public TableDerived(Database database, HsqlName name, int type, QueryExpression queryExpression, Expression dataExpression, int opType, int depth) { super(database, name, type); switch (type) { case TableBase.SYSTEM_SUBQUERY : case TableBase.VIEW_TABLE : break; default : throw Error.runtimeError(ErrorCode.U_S0500, "Table"); } this.queryExpression = queryExpression; this.dataExpression = dataExpression; this.depth = depth; switch (opType) { case OpTypes.EXISTS : queryExpression.setSingleRow(); break; case OpTypes.IN : if (queryExpression != null) { queryExpression.setFullOrder(); } uniqueRows = true; break; case OpTypes.UNIQUE : queryExpression.setFullOrder(); uniquePredicate = true; break; } if (dataExpression != null) { dataExpression.table = this; } } public int getId() { return 0; } public boolean isQueryBased() { return true; } public boolean isWritable() { return true; } public boolean isInsertable() { if (view != null && view.isTriggerInsertable) { return false; } return queryExpression == null ? false : queryExpression.isInsertable(); } public boolean isUpdatable() { if (view != null && view.isTriggerUpdatable) { return false; } return queryExpression == null ? false : queryExpression.isUpdatable(); } public int[] getUpdatableColumns() { if (queryExpression != null) { return queryExpression.getBaseTableColumnMap(); } return defaultColumnMap; } public boolean isTriggerInsertable() { if (view != null) { return view.isTriggerInsertable; } return false; } public boolean isTriggerUpdatable() { if (view != null) { return view.isTriggerUpdatable; } return false; } public boolean isTriggerDeletable() { if (view != null) { return view.isTriggerDeletable; } return false; } public Table getBaseTable() { return queryExpression == null ? this : queryExpression.getBaseTable(); } public int[] getBaseTableColumnMap() { return queryExpression == null ? null : queryExpression .getBaseTableColumnMap(); } public QueryExpression getQueryExpression() { return queryExpression; } public Expression getDataExpression() { return dataExpression; } public void prepareTable() { if (columnCount > 0) { return; } if (dataExpression != null) { if (columnCount == 0) { TableUtil.addAutoColumns(this, dataExpression.nodeDataTypes); setTableIndexesForSubquery(); } } if (queryExpression != null) { columnList = queryExpression.getColumns(); columnCount = queryExpression.getColumnCount(); setTableIndexesForSubquery(); } } public void prepareTable(HsqlName[] columns) { if (dataExpression != null) { // columns prepared } if (queryExpression != null) { columnCount = queryExpression.getColumnCount(); columnList = queryExpression.getColumns(); } if (columns != null) { if (columns.length != columnList.size()) { throw Error.error(ErrorCode.X_42593); } for (int i = 0; i < columnCount; i++) { columnList.setKey(i, columns[i].name); ColumnSchema col = (ColumnSchema) columnList.get(i); col.getName().rename(columns[i]); } } setTableIndexesForSubquery(); } private void setTableIndexesForSubquery() { int[] cols = null; if (uniqueRows || uniquePredicate) { cols = new int[getColumnCount()]; ArrayUtil.fillSequence(cols); } int pkcols[] = uniqueRows ? cols : null; if (primaryKeyCols == null) { createPrimaryKey(null, pkcols, false); } if (uniqueRows) { fullIndex = getPrimaryIndex(); } else if (uniquePredicate) { fullIndex = createIndexForColumns(null, cols); } } void setCorrelated() { if (dataExpression != null) { dataExpression.isCorrelated = true; } if (queryExpression != null) { queryExpression.isCorrelated = true; } } boolean isCorrelated() { if (dataExpression != null) { return dataExpression.isCorrelated; } if (queryExpression != null) { return queryExpression.isCorrelated; } return false; } boolean hasUniqueNotNullRows(Session session) { return getNavigator(session).hasUniqueNotNullRows(session); } void resetToView() { queryExpression = view.getQueryExpression(); } public void materialise(Session session) { session.sessionContext.pushStatementState(); try { PersistentStore store; // table constructors if (dataExpression != null) { store = session.sessionData.getSubqueryRowStore(this); dataExpression.insertValuesIntoSubqueryTable(session, store); return; } if (queryExpression == null) { return; } Result result; result = queryExpression.getResult(session, 0); if (uniqueRows) { RowSetNavigatorData navigator = ((RowSetNavigatorData) result.getNavigator()); navigator.removeDuplicates(session); } store = session.sessionData.getSubqueryRowStore(this); insertResult(session, store, result); result.getNavigator().release(); } finally { session.sessionContext.popStatementState(); } } public void materialiseCorrelated(Session session) { if (isCorrelated()) { materialise(session); } } public boolean isRecompiled() { if (canRecompile && queryExpression instanceof QuerySpecification) { QuerySpecification qs = (QuerySpecification) queryExpression; if (qs.isAggregated || qs.isGrouped || qs.isOrderSensitive) { return false; } else { return true; } } return false; } public TableDerived newDerivedTable(Session session) { TableDerived td = this; if (isRecompiled()) { ParserDQL p = new ParserDQL(session, new Scanner()); p.reset(sql, session.parser.compileContext.getRangeVarCount()); p.read(); td = p.XreadSubqueryTableBody(tableName, OpTypes.TABLE_SUBQUERY); session.parser.compileContext.setNextRangeVarIndex( p.compileContext.getRangeVarCount());; td.queryExpression.resolve(session); td.columnList = columnList; td.columnCount = columnList.size(); td.triggerList = triggerList; td.triggerLists = triggerLists; td.view = view; td.createPrimaryKey(); } return td; } public Object[] getValues(Session session) { RowIterator it = rowIterator(session); if (it.hasNext()) { Row row = it.getNextRow(); if (it.hasNext()) { throw Error.error(ErrorCode.X_21000); } return row.getData(); } else { return new Object[getColumnCount()]; } } public Object getValue(Session session) { Object[] data = getValues(session); return data[0]; } public RowSetNavigatorData getNavigator(Session session) { RowSetNavigatorData navigator = new RowSetNavigatorDataTable(session, this); return navigator; } public void setSQL(String sql) { this.sql = sql; } /** * This results in the following sort order: * * view subqueries, then other subqueries * * view subqueries: * views sorted by creation order (earlier declaration first) * * other subqueries: * subqueries sorted by depth within select query * */ public int compare(Object a, Object b) { TableDerived sqa = (TableDerived) a; TableDerived sqb = (TableDerived) b; // return sqb.depth - sqa.depth; if (sqa.view != null && sqb.view != null) { int ia = database.schemaManager.getTableIndex(sqa.view); int ib = database.schemaManager.getTableIndex(sqb.view); if (ia == -1) { ia = database.schemaManager.getTables( sqa.view.getSchemaName().name).size(); } if (ib == -1) { ib = database.schemaManager.getTables( sqb.view.getSchemaName().name).size(); } int diff = ia - ib; return diff == 0 ? sqb.depth - sqa.depth : diff; } else { return sqb.depth - sqa.depth; } } public void setDataTimestamp(long timestamp) { // no op } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/FunctionSQLInvoked.java0000644000175000017500000002306212007547362023277 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.lib.ArrayListIdentity; import org.hsqldb.lib.HsqlList; import org.hsqldb.lib.Set; import org.hsqldb.result.Result; import org.hsqldb.store.ValuePool; import org.hsqldb.types.Type; /** * Implementation of SQL-invoked user-defined function calls - PSM and JRT * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.0.1 * @since 1.9.0 */ public class FunctionSQLInvoked extends Expression { RoutineSchema routineSchema; Routine routine; Expression condition = Expression.EXPR_TRUE; // needed for equals() method FunctionSQLInvoked(RoutineSchema routineSchema) { super(routineSchema.isAggregate() ? OpTypes.USER_AGGREGATE : OpTypes.FUNCTION); this.routineSchema = routineSchema; } public void setArguments(Expression[] newNodes) { this.nodes = newNodes; } public HsqlList resolveColumnReferences(Session session, RangeGroup rangeGroup, int rangeCount, RangeGroup[] rangeGroups, HsqlList unresolvedSet, boolean acceptsSequences) { HsqlList conditionSet = condition.resolveColumnReferences(session, rangeGroup, rangeCount, rangeGroups, null, false); if (conditionSet != null) { ExpressionColumn.checkColumnsResolved(conditionSet); } if (isSelfAggregate()) { if (unresolvedSet == null) { unresolvedSet = new ArrayListIdentity(); } unresolvedSet.add(this); return unresolvedSet; } else { return super.resolveColumnReferences(session, rangeGroup, rangeCount, rangeGroups, unresolvedSet, acceptsSequences); } } public void resolveTypes(Session session, Expression parent) { Type[] types = new Type[nodes.length]; for (int i = 0; i < nodes.length; i++) { Expression e = nodes[i]; e.resolveTypes(session, this); types[i] = e.dataType; } routine = routineSchema.getSpecificRoutine(types); for (int i = 0; i < nodes.length; i++) { if (nodes[i].dataType == null) { nodes[i].dataType = routine.getParameterTypes()[i]; } } dataType = routine.getReturnType(); condition.resolveTypes(session, null); } private Object getValueInternal(Session session, Object[] aggregateData) { boolean isValue = false; int variableCount = routine.getVariableCount(); Result result; int extraArg = routine.javaMethodWithConnection ? 1 : 0; Object[] data = ValuePool.emptyObjectArray; boolean push = true; if (extraArg + nodes.length > 0) { if (opType == OpTypes.USER_AGGREGATE) { data = new Object[routine.getParameterCount()]; for (int i = 0; i < aggregateData.length; i++) { data[i + 1] = aggregateData[i]; } } else { data = new Object[nodes.length + extraArg]; } if (!routine.isPSM()) { Object connection = session.getInternalConnection(); if (extraArg > 0) { data[0] = connection; } } } Type[] dataTypes = routine.getParameterTypes(); for (int i = 0; i < nodes.length; i++) { Expression e = nodes[i]; Object value = e.getValue(session, dataTypes[i]); if (value == null) { if (routine.isNullInputOutput()) { return null; } if (!routine.getParameter(i).isNullable()) { return Result.newErrorResult( Error.error(ErrorCode.X_39004)); } } if (routine.isPSM()) { data[i] = value; } else { data[i + extraArg] = e.dataType.convertSQLToJava(session, value); } } result = routine.invoke(session, data, aggregateData, push); session.releaseInternalConnection(); if (result.isError()) { throw result.getException(); } if (isValue) { return result.valueData; } else { return result; } } public Object getValue(Session session) { if (opType == OpTypes.SIMPLE_COLUMN) { Object value = session.sessionContext.rangeIterators[rangePosition] .getCurrent(columnIndex); return value; } Object returnValue = getValueInternal(session, null); if (returnValue instanceof Result) { Result result = (Result) returnValue; if (result.isError()) { throw result.getException(); } else if (result.isSimpleValue()) { returnValue = result.getValueObject(); } else if (result.isData()) { returnValue = result; } else { throw Error.error(ErrorCode.X_2F005, routine.getName().name); } } return returnValue; } public Result getResult(Session session) { Object value = getValueInternal(session, null); if (value instanceof Result) { return (Result) value; } return Result.newPSMResult(value); } void collectObjectNames(Set set) { set.add(routine.getSpecificName()); } public String getSQL() { StringBuffer sb = new StringBuffer(); sb.append(routineSchema.getName().getSchemaQualifiedStatementName()); sb.append('('); int nodeCount = nodes.length; if (opType == OpTypes.USER_AGGREGATE) { nodeCount = 1; } for (int i = 0; i < nodeCount; i++) { if (i != 0) { sb.append(','); } sb.append(nodes[i].getSQL()); } sb.append(')'); return sb.toString(); } public String describe(Session session, int blanks) { return super.describe(session, blanks); } boolean isSelfAggregate() { return routineSchema.isAggregate(); } public boolean isDeterministic() { return routine.isDeterministic(); } public boolean equals(Expression other) { if (!(other instanceof FunctionSQLInvoked)) { return false; } FunctionSQLInvoked o = (FunctionSQLInvoked) other; if (opType == other.opType && routineSchema == o.routineSchema && routine == o.routine && condition.equals(o.condition)) { return super.equals(other); } return false; } public Object updateAggregatingValue(Session session, Object currValue) { if (!condition.testCondition(session)) { return currValue; } Object[] array = (Object[]) currValue; if (array == null) { array = new Object[3]; } array[0] = Boolean.FALSE; getValueInternal(session, array); return array; } public Object getAggregatedValue(Session session, Object currValue) { Object[] array = (Object[]) currValue; if (array == null) { array = new Object[3]; } array[0] = Boolean.TRUE; Result result = (Result) getValueInternal(session, array); Object returnValue; if (result.isError()) { throw result.getException(); } else { return result.getValueObject(); } } public Expression getCondition() { return condition; } public boolean hasCondition() { return condition != null && condition != Expression.EXPR_TRUE; } public void setCondition(Expression e) { condition = e; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/ColumnBase.java0000644000175000017500000001103412007547370021635 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.types.Type; /** * Base implementation of variables, columns of result or table.

                  * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.9.0 */ public class ColumnBase { private String name; private String table; private String schema; private String catalog; private boolean isWriteable; private boolean isSearchable; protected byte parameterMode; protected boolean isIdentity; protected byte nullability = SchemaObject.Nullability.NULLABLE; protected Type dataType; ColumnBase() {} public ColumnBase(String catalog, String schema, String table, String name) { this.catalog = catalog; this.schema = schema; this.table = table; this.name = name; } public ColumnBase(String catalog, ColumnSchema other) { this.catalog = catalog; this.schema = other.getSchemaNameString(); this.table = other.getTableNameString(); this.name = other.getNameString(); this.nullability = other.getNullability(); this.isIdentity = other.isIdentity(); this.isSearchable = other.isSearchable(); this.isWriteable = other.isWriteable(); } public String getNameString() { return name; } public String getTableNameString() { return table; } public String getSchemaNameString() { return schema; } public String getCatalogNameString() { return catalog; } public void setIdentity(boolean value) { isIdentity = value; } public boolean isIdentity() { return isIdentity; } protected void setType(ColumnBase other) { nullability = other.nullability; dataType = other.dataType; } public void setType(Type type) { this.dataType = type; } public boolean isNullable() { return !isIdentity && nullability == SchemaObject.Nullability.NULLABLE; } protected void setNullable(boolean value) { nullability = value ? SchemaObject.Nullability.NULLABLE : SchemaObject.Nullability.NO_NULLS; } public byte getNullability() { return isIdentity ? SchemaObject.Nullability.NO_NULLS : nullability; } public void setNullability(byte value) { nullability = value; } public boolean isWriteable() { return isWriteable; } public void setWriteable(boolean value) { isWriteable = value; } public boolean isSearchable() { return isSearchable; } public void setSearchable(boolean value) { isSearchable = value; } public Type getDataType() { return dataType; } public byte getParameterMode() { return parameterMode; } public void setParameterMode(byte mode) { this.parameterMode = mode; } } hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/resources/0000755000175000017500000000000012007570424020751 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/resources/sql-state-messages.properties0000644000175000017500000006217112007547420026620 0ustar renerene# SQL CODE definitions # # # # # @author Campbell Boucher Burnet (boucherb@users dot sourceforge.net) # @author Fred Toussi (fredt@users dot sourceforge.net) # @version 2.0.1 # @since 1.9.0 # # do not translate this section 0001=: $$ required: $$ 0002=; $$ table: $$ 0003=; $$ table: $$ column: $$ # message parts 0021=\u0020table $$ row count error : $$ read, needed $$ 0022=\u0020 wrong data for insert operation 0023=attempt to connect while db opening /closing 0024=\u0020line:\u0020 0025=\u0020line: $$ $$ 0026=\u0020$$ $$ 0027=\u0020$$.properties $$ 0028=properties name is null or empty # message parts 0041=Error in text source field 0042=openning file: $$ error: $$ 0043=closing file: $$ error: $$ 0044=purging file: $$ error: $$ # message parts 0051=error $$ reading row - file $$ 0052=error $$ opening file - file $$ 0053=error $$ closing file - file $$ # message parts 0061=Invalid address : $$\nTry one of: $$ 0062=Invalid address : $$ 0063=Server certificate has no Common Name 0064=Server certificate has empty Common Name 0065=Certificate Common Name[$$] does not match host name[$$] # message parts 0070=; ResultSet is empty 0071=; ResultSet is positioned before first row 0072=; ResultSet is positioned after last row # message parts 0081=; in LIMIT, OFFSET or FETCH # SQLSTATE definitions # successful completion 0000=00000 successful completion # HSQLDB operations 0201=S0500 unsupported internal operation 0301=S0501 no file name specified for source 0302=S0502 no value specified for field 0303=S0503 zero-length separator 0304=S0504 0320=S0521 operation is not allowed on text table with data 0321=S0522 invalid statemnet - text table required 0331=S0531 encode / decode error # HSQLDB authentication 0391=S1000 password complexity # Server 0401=S1000 Transfer corrupted 0402=S0504 database disconnected 0403=S0504 Client driver version greater than '$$' is required. \ HSQLDB server version is '$$' 0404=S0504 Network client is not a HSQLDB JDBC driver 0405=S0504 Client using HSQLDB http protocol instead of hsql 0406=S0504 Incomplete read of handshaking bytes 0407=S1000 no valid database paths # JDBC 0421=S1000 Column not found 0422=S1000 InputStream error 0423=S1000 Invalid argument in JDBC call 0424=S1000 Parameter not set 0425=S1000 Unknown JDBC escape sequence: { # HSQLDB non-core and file 0451=S1000 Database lock acquisition failure 0452=S1000 file input/output error 0453=S1000 wrong database file version 0454=S1000 data file is modified but backup file does not exist 0455=S1000 The database is in read only mode 0456=S1000 The table data is read only 0457=S1000 Access is denied 0458=S1000 General error 0459=S1000 Database is memory only 0460=S1000 Out of Memory 0461=S1000 error in script file 0462=S1000 Unsupported suffix in file name '$$'. (Supported suffixes: $$) 0463=S1000 Mismatch between specified compression mode '$$' and file name '$$' 0464=S1000 Database is non-file type 0465=S1000 Database does not exists 0466=S1000 Data File input/output error 0467=S1000 IO error 0468=S1000 Data File size limit is reached 0469=S1000 Data File is in use 0470=S1000 Backup error # text tables 0481=S1000 The table's data source has not been defined 0482=S1000 Invalid TEXT table source string 0483=S1000 bad TEXT table source file - line number: $$ $$ 0484=S1000 TEXT table source file - IO error 0485=S1000 end-of-line characters not allowed 0486=S1000 Header not allowed or too long 0487=S1000 Text source file already exists 0488=S1000 No end sep. # warning 1000=01000 warning 1001=01001 warning: cursor operation conflict 1002=01002 warning: disconnect error 1003=01003 warning: null value eliminated in set function 1004=01004 warning: string data, right truncation 1005=01005 warning: insufficient item descriptor areas 1006=01006 warning: privilege not revoked 1007=01007 warning: privilege not granted 1009=01009 warning: search condition too long for information schema 1010=0100A warning: query expression too long for information schema 1011=0100B warning: default value too long for information schema 1012=0100C warning: result sets returned 1013=0100D warning: additional result sets returned 1014=0100E warning: attempt to return too many result sets 1015=0100F warning: statement too long for information schema 1016=01011 warning: SQL-Java path too long for information schema 1017=0102F warning: array data, right truncation # no data 1100=02000 no data 1101=02001 no data: no additional result sets returned # dynamic SQL error 1200=07000 dynamic SQL error 1201=07001 dynamic SQL error: using clause does not match dynamic parameter specifications 1202=07002 dynamic SQL error: using clause does not match target specifications 1203=07003 dynamic SQL error: cursor specification cannot be executed 1204=07004 dynamic SQL error: using clause required for dynamic parameters 1205=07005 dynamic SQL error: prepared statement not a cursor specification 1206=07006 dynamic SQL error: restricted data type attribute violation 1207=07007 dynamic SQL error: using clause required for result fields 1208=07008 dynamic SQL error: invalid descriptor count 1209=07009 dynamic SQL error: invalid descriptor index 1211=0700B dynamic SQL error: data type transform function violation 1212=0700C dynamic SQL error: undefined DATA value 1213=0700D dynamic SQL error: invalid DATA target 1214=0700E dynamic SQL error: invalid LEVEL value 1215=0700F dynamic SQL error: invalid DATETIME_INTERVAL_CODE # HSQLDB 1251=07501 statement is closed 1252=07502 statement is invalid 1253=07503 statement does not generate a row count 1254=07504 statement does not generate a result set 1255=07505 statement is in batch mode 1256=07506 statement is not in batch mode # connection exception 1300=08000 connection exception 1301=08001 connection exception: SQL-client unable to establish SQL-connection 1302=08002 connection exception: connection name in use 1303=08003 connection exception: connection does not exist 1304=08004 connection exception: SQL-server rejected establishment of SQL-connection 1305=08006 connection exception: connection failure 1306=08007 connection exception: transaction resolution unknown # HSQLDB connection exception 1351=08501 connection exception: timed out 1352=08502 warning: unsupported client info 1353=08503 connection exception: closed # triggered action exception 1400=09000 triggered action exception # feature not supported 1500=0A000 feature not supported 1501=0A001 feature not supported: multiple server transactions # HSQLDB feature not supported 1551=0A501 feature not supported: # invalid target type specification 1600=0D000 invalid target type specification # invalid schema name list specification 1700=0E000 invalid schema name list specification # locator exception 1800=0F000 locator exception 1801=0F001 locator exception: invalid specification # HSQLDB locator 3474=0F502 lob is no longer valid 3475=0F503 lob stream is closed # resignal when handler not active 1900=0K000 resignal when handler not active # invalid grantor 2000=0L000 invalid grantor # HSQLDB 2051=0L501 invalid grantor - lacks CREATE_SCHEMA privilege # invalid SQL-invoked procedure reference 2100=0M000 invalid SQL-invoked procedure reference # invalid role specification 2200=0P000 invalid role specification # HSQLDB 2251=0P501 invalid role specification - circular grant 2252=0P502 invalid role specification - already granted 2253=0P503 invalid role specification - does not have role # invalid transform group name specification 2300=0S000 invalid transform group name specification # target table disagrees with cursor specification 2400=0T000 target table disagrees with cursor specification # attempt to assign to non-updatable column 2500=0U000 attempt to assign to non-updatable column # attempt to assign to ordering column 2600=0V000 attempt to assign to ordering column # prohibited statement encountered during trigger execution 2700=0W000 prohibited statement encountered during trigger execution # invalid foreign server specification 2800=0X000 invalid foreign server specification # pass-through specific condition 2900=0Y000 pass-through specific condition 2901=0Y001 pass-through specific condition: invalid cursor option 2902=0Y002 pass-through specific condition: invalid cursor allocation # diagnostics exception 3000=0Z000 diagnostics exception 3001=0Z001 diagnostics exception: maximum number of stacked diagnostics areas exceeded # 04-PSM 3003=0Z002 diagnostics exception: stacked diagnostics accessed without active handler # 04-PSM 3100=20000 case not found for case statement # cardinality violation 3201=21000 cardinality violation # data exception 3400=22000 data exception 3401=22001 data exception: string data, right truncation 3402=22002 data exception: null value, no indicator parameter 3403=22003 data exception: numeric value out of range 3404=22004 data exception: null value not allowed 3405=22005 data exception: error in assignment 3406=22006 data exception: invalid interval format 3407=22007 data exception: invalid datetime format 3408=22008 data exception: datetime field overflow 3409=22009 data exception: invalid time zone displacement value 3410=2200B data exception: escape character conflict 3411=2200C data exception: invalid use of escape character 3412=2200D data exception: invalid escape octet 3413=2200E data exception: null value in array target 3414=2200F data exception: zero-length character string 3415=2200G data exception: most specific type mismatch 3416=2200H data exception: sequence generator limit exceeded 3417=2200J data exception: nonidentical notations with the same name 3418=2200K data exception: nonidentical unparsed entities with the same name 3419=2200L data exception: not an XML document 3420=2200M data exception: invalid XML document 3421=2200N data exception: invalid XML content 3422=2200P data exception: interval value out of range 3423=2200Q data exception: multiset value overflow 3424=2200R data exception: XML value overflow 3425=2200S data exception: invalid comment 3426=2200T data exception: invalid processing instruction 3427=2200U data exception: not an XQuery document node 3428=2200V data exception: invalid XQuery context item 3429=2200W data exception: XQuery serialization error 3430=22010 data exception: invalid indicator parameter value 3431=22011 data exception: substring error 3432=22012 data exception: division by zero 3433=22013 data exception: invalid preceding or following size in window function 3434=22014 data exception: invalid argument for NTILE function 3435=22015 data exception: interval field overflow 3436=22016 data exception: invalid argument for NTH_VALUE function 3437=22017 data exception: invalid data specified for datalink 3438=22018 data exception: invalid character value for cast 3439=22019 data exception: invalid escape character 3440=2201A data exception: null argument passed to datalink constructor 3441=2201B data exception: invalid regular expression 3442=2201C data exception: null row not permitted in table 3443=2201D data exception: datalink value exceeds maximum length 3444=2201E data exception: invalid argument for natural logarithm 3445=2201F data exception: invalid argument for power function 3446=2201G data exception: invalid argument for width bucket function 3447=2201J data exception: XQuery sequence cannot be validated 3448=2201S data exception: invalid XQuery regular expression 3449=2201T data exception: invalid XQuery option flag 3450=2201U data exception: attempt to replace a zero-length string 3451=2201V data exception: invalid XQuery replacement string 3452=2201W data exception: invalid row count in fetch first clause 3453=2201X data exception: invalid row count in result offset clause 3454=22021 data exception: character not in repertoire 3455=22022 data exception: indicator overflow 3456=22023 data exception: invalid parameter value 3457=22024 data exception: unterminated C string 3458=22025 data exception: invalid escape sequence 3459=22026 data exception: string data, length mismatch 3460=22027 data exception: trim error 3461=22029 data exception: noncharacter in UCS string # HSQLDB data exception 3471=22501 value cannot be converted to target type 3472=22511 invalid function argument 3473=22521 object serialization failure # 04-PSM 3488=2202A data exception: null value in field reference 3489=2202D data exception: null value substituted for mutator subject parameter 3490=2202E data exception: array element error 3491=2202F data exception: array data, right truncation 3492=2202G data exception: invalid repeat argument in a sample clause 3493=2202H data exception: invalid sample size # integrity constraint violation 3500=23000 integrity constraint violation 3501=23001 integrity constraint violation: restrict violation 0010=23502 integrity constraint violation: NOT NULL check constraint 0177=23503 integrity constraint violation: foreign key no parent 0008=23504 integrity constraint violation: foreign key no action 0104=23505 integrity constraint violation: unique constraint or index violation 0157=23513 integrity constraint violation: check constraint # invalid cursor state 3600=24000 invalid cursor state 3601=24501 invalid cursor state: identified cursor is not open 3602=24502 invalid cursor state: identified cursor is already open 3603=24504 invalid cursor state: identifier cursor not positioned on row in UPDATE, DELETE, SET, or GET statement 3604=24513 invalid cursor state: cannot FETCH NEXT, PRIOR, CURRENT, or RELATIVE, cursor position is unknown 3605=24514 invalid cursor state: cursor disabled by previous error 3606=24515 invalid cursor state: all column must be set before insert 3621=24521 invalid cursor state: row has been modified outside the cursor # invalid transaction state 3700=25000 invalid transaction state 3701=25001 invalid transaction state: active SQL-transaction 3702=25002 invalid transaction state: branch transaction already active 3703=25003 invalid transaction state: inappropriate access mode for branch transaction 3704=25004 invalid transaction state: inappropriate isolation level for branch transaction 3705=25005 invalid transaction state: no active SQL-transaction for branch transaction 3706=25006 invalid transaction state: read-only SQL-transaction 3707=25007 invalid transaction state: schema and data statement mixing not supported 3708=25008 invalid transaction state: held cursor requires same isolation level # invalid SQL statement name 3800=26000 invalid SQL statement name # triggered data change violation 3900=27000 triggered data change violation # invalid authorization specification 4000=28000 invalid authorization specification # HSQLDB invalid authorization specification 4001=28501 invalid authorization specification - not found 4002=28502 invalid authorization specification - system identifier 4003=28503 invalid authorization specification - already exists # syntax error or access rule violation in direct statement 4100=2A000 syntax error or access rule violation in direct statement # dependent privilege descriptors still exist 4200=2B000 dependent privilege descriptors still exist # invalid character set name 4300=2C000 invalid character set name # invalid transaction termination 4400=2D000 invalid transaction termination 4401=2D522 invalid transaction termination: COMMIT and ROLLBACK not allowed in ATOMIC compound statement # invalid connection name 4500=2E000 invalid connection name # SQL routine exception 4600=2F000 SQL routine exception 4602=2F002 SQL routine exception: modifying SQL-data not permitted 4603=2F003 SQL routine exception: prohibited SQL-statement attempted 4604=2F004 SQL routine exception: reading SQL-data not permitted 4605=2F005 SQL routine exception: function did not execute return statement # invalid collation name 4650=2H000 invalid collation name # invalid SQL statement identifier 4660=30000 invalid SQL statement identifier # invalid SQL descriptor name 4670=33000 invalid SQL descriptor name # invalid cursor name 4680=34000 invalid cursor name # invalid condition number 4690=35000 invalid condition number # cursor sensitivity exception 4700=36000 cursor sensitivity exception 4701=36001 cursor sensitivity exception: request rejected 4702=36002 cursor sensitivity exception: request failed # cursor compatibility warnings 4711=36501 cursor sensitivity mismatch 4712=36502 cursor updatability mismatch 4713=36503 cursor holdability mismatch # syntax error or access rule violation in dynamic statement 4790=37000 syntax error or access rule violation in dynamic statement # external routine exception 4800=38000 external routine exception 4801=38001 external routine exception: containing SQL not permitted 4802=38002 external routine exception: modifying SQL-data not permitted 4803=38003 external routine exception: prohibited SQL-statement attempted 4804=38004 external routine exception: reading SQL-data not permitted # external routine invocation exception 4810=39000 external routine invocation exception 4811=39004 external routine invocation exception: null value not allowed # savepoint exception 4820=3B000 savepoint exception 4821=3B001 savepoint exception: invalid specification 4822=3B002 savepoint exception: too many # ambiguous cursor name 4830=3C000 ambiguous cursor name # invalid catalog name 4840=3D000 invalid catalog name # invalid schema name 4850=3F000 invalid schema name # transaction rollback 4860=40000 transaction rollback 4861=40001 transaction rollback: serialization failure 4862=40002 transaction rollback: integrity constraint violation 4863=40003 transaction rollback: statement completion unknown 4864=40004 transaction rollback: triggered action exception # HSQLDB internal transactions 4871=40501 transaction rollback: row change by multiple transactions # syntax error or access rule violation 5000=42000 syntax error or access rule violation # HSQLDB database object names 5501=42501 user lacks privilege or object not found 5502=42502 dependent objects exist 5503=42503 system object cannot be modified 5504=42504 object name already exists 5505=42505 invalid schema name - name mismatch 5506=42506 invalid catalog name 5507=42507 admin rights required 5508=42508 label not found 5509=42509 type not found or user lacks privilege 5510=42510 name too long # genrated columns 5512=42512 invalid expression in CHECK or GENERATED clause 5513=42513 assignment to generated column # constraint defintition issues 5520=42520 SET NULL requires nullable column 5521=42521 SET DEFAULT requires column default expression for 5522=42522 a UNIQUE constraint already exists on the set of columns 5523=42523 table has no primary key 5524=42524 constraint definition not allowed 5525=42525 identity definition not allowed 5526=42526 column is in primary key 5527=42527 column is in constraint 5528=42528 a FOREIGN KEY constraint already exists on the set of columns 5529=42529 a UNIQUE constraint does not exist on referenced columns 5530=42530 primary key definition not allowed 5531=42531 default expression needed 5532=42532 primary key already exist 5533=42533 is referenced by FOREIGN KEY constraint 5534=42534 column of LOB or ARRAY type cannot be used in operation # other definition issues 5535=42535 not an identity column 5536=42536 column is referenced in 5537=42537 cannot use WITH CHECK OPTION for read-only view 5538=42538 TRIGGER definition not compatible with table 5539=42539 cannot drop a user that is currently connected # DML 5541=42541 requires DEFAULT keyword 5542=42542 requires OVERRIDING clause 5543=42543 requires either DEFAULT keyword or OVERRIDING clause 5544=42544 DEFAULT keyword cannot be used as column has no DEFAULT 5545=42545 INSERT, UPDATE, DELETE or TRUNCATE not permitted for table or view 5546=42546 number of target columns does not match that of query expression 5547=42547 WHEN MATCHED already used in MERGE 5548=42548 WHEN NOT MATCHED altready used in MERGE 5549=42549 LIMIT, OFFSET or FETCH altready used # 5551=42551 too many identifier parts 5555=42555 invalid property name 5556=42556 invalid property value # HSQLDB type conversion 5561=42561 incompatible data type in conversion 5562=42562 incompatible data types in combination 5563=42563 incompatible data type in operation 5564=42564 row column count mismatch 5565=42565 row expression not allowed 5566=42566 interval qualifier missing or not valid 5567=42567 data type cast needed for parameter or null literal 5568=42568 data type of expression is not boolean 5569=42569 quoted identifier required 5570=42570 concatenation exceeds maximum type length # 5571=42571 NULL literal not allowed 5572=42572 invalid GROUP BY expression 5573=42573 invalid HAVING expression 5574=42574 expression not in aggregate or GROUP BY columns 5575=42575 parameter marker not allowed 5576=42576 invalid ORDER BY expression 5577=42577 duplicate column name in column list 5578=42578 duplicate column name in derived table 5579=42579 duplicate update of column 5580=42580 ambiguous column reference # lexical elements 5581=42581 unexpected token 5582=42582 unknown token 5583=42583 malformed quoted identifier 5584=42584 malformed string 5585=42585 malformed numeric constant 5586=42586 malformed unicode string 5587=42587 malformed binary string 5588=42588 malformed bit string 5589=42589 malformed comment 5590=42590 unexpected end of statement # other 5591=42591 cannot drop sole column of table 5592=42592 precision or scale out of range 5593=42593 column count mismatch in column name list 5594=42594 column number mismatch detected in rows of UNION, INTERSECT, EXCEPT, or VALUES operation 5595=42595 invalid privilege specified - ALL PRIVILEGES required 5596=42596 schema qualifier does not match enclosing create schema statement. 5597=42597 number out of the valid range for sequence generator 5598=42598 sequence expression cannot be used in this context 5599=42599 length must be specified in type definition # HSQLDB - PSM definition and calls 5601=42601 repeat handler declaration 5602=42602 invalid statement 5603=42603 dynamic parameter or variable required as INOUT or OUT argument 5604=42604 SQL routine exception: incompatible declaration attributes 5605=42605 SQL routine exception: routine signature already exists 5606=42606 SQL routine exception: variable name already exists 5607=42607 invalid SQLSTATE value 5608=42608 wrong or missing data impact clause in declaration 5609=42609 routine signature not found for 5610=42610 wrong signature for aggregate function declaration # with check option violation 5700=44000 with check option violation # 04-PSM # unhandled user-defined exception 5800=45000 unhandled user-defined exception # Java execution 6000=46000 Java execution 6001=46001 Java execution: invalid URL 6002=46002 Java execution: invalid JAR name 6003=46003 Java execution: invalid class deletion 6004=46005 Java execution: invalid replacement 6007=4600A Java execution: attempt to replace uninstalled JAR 6008=4600B Java execution: attempt to remove uninstalled JAR 6009=4600C Java execution: invalid JAR removal 6010=4600D Java execution: invalid path 6011=4600E Java execution: self-referencing path 6012=46102 Java execution: invalid JAR name in path 6013=46103 Java execution: unresolved class name, method name or signature # HSQLDB - SQL/JRT 6021=46511 declared parameter types do not match method signature # Unknown Error: Catch-All 6500=99000 Unknown Error: Catch-All 6501=99099 Unknown Error: Error converting vendor code to SQL state code # FDW-specific condition 6600=HV000 FDW-specific condition 6601=HV001 FDW-specific condition: memory allocation error 6602=HV002 FDW-specific condition: dynamic parameter value needed 6603=HV004 FDW-specific condition: invalid data type 6604=HV005 FDW-specific condition: column name not found 6605=HV006 FDW-specific condition: invalid data type descriptors 6606=HV007 FDW-specific condition: invalid column name 6607=HV008 FDW-specific condition: invalid column number 6608=HV009 FDW-specific condition: invalid use of null pointer 6609=HV00A FDW-specific condition: invalid string format 6610=HV00B FDW-specific condition: invalid handle 6611=HV00C FDW-specific condition: invalid option index 6612=HV00D FDW-specific condition: invalid option name 6613=HV00J FDW-specific condition: option name not found 6614=HV00K FDW-specific condition: reply handle 6615=HV00L FDW-specific condition: unable to create execution 6616=HV00M FDW-specific condition: unable to create reply 6617=HV00N FDW-specific condition: unable to establish connection 6618=HV00P FDW-specific condition: no schemas 6619=HV00Q FDW-specific condition: schema not found 6620=HV00R FDW-specific condition: table not found 6621=HV010 FDW-specific condition: function sequence error 6622=HV014 FDW-specific condition: limit on number of handles exceeded 6623=HV021 FDW-specific condition: inconsistent descriptor information 6624=HV024 FDW-specific condition: invalid attribute value 6625=HV090 FDW-specific condition: invalid string length or buffer length 6626=HV091 FDW-specific condition: invalid descriptor field identifier # datalink exception 6700=HW000 datalink exception 6701=HW001 datalink exception: external file not linked 6702=HW002 datalink exception: external file already linked 6703=HW003 datalink exception: referenced file does not exist 6704=HW004 datalink exception: invalid write token 6705=HW005 datalink exception: invalid datalink construction 6706=HW006 datalink exception: invalid write permission for update 6707=HW007 datalink exception: referenced file not valid # CLI-specific condition 6800=HY093 CLI-specific condition: invalid datalink value hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/resources/sql-state-messages_es.properties0000644000175000017500000007473212007547416027322 0ustar renerene# SQL CODE definitions # Translated by Miquel Jordana (miquel71@users dot sourceforge.net) # # todo : 0454 # # @author Campbell Boucher Burnet (boucherb@users dot sourceforge.net) # @author Fred Toussi (fredt@users dot sourceforge.net) # @version 2.0.0 # @since 1.9.0 # # do not translate this section 0001=: $$ required: $$ 0002=; $$ table: $$ 0003=; $$ table: $$ column: $$ # message parts 0021=\u0020tabla $$ error contando filas : $$ leídas, pero $$ requeridas 0022=\u0020dato erróneo en operación de inserción 0023=intentado conectar mientras la base de datos se esta abriendo o cerrando 0024=\u0020línea:\u0020 0025=\u0020línea: $$ $$ 0026=\u0020$$ $$ 0027=\u0020$$.properties $$ 0028=el nombre del las 'properties' es nulo o vacío # message parts 0041=Error en el texto del campo origen 0042=abriendo fichero: $$ error: $$ 0043=cerrando fichero: $$ error: $$ 0044=limpiando fichero: $$ error: $$ # message parts 0051=error $$ abriendo fila - fichero $$ 0052=error $$ cerrando fichero - fichero $$ 0053=error $$ cerrando fichero - fichero $$ # message parts 0061=Dirección incorrecta : $$\nIntente una entre: $$ 0062=Dirección incorrecta : $$ 0063=El certificado del servidor no tiene Nombre Común 0064=El certificado del servidor tiene un texto vacío en el Nombre Común 0065=El Nombre Común del certificado[$$] no corresponde con el nombre del equipo[$$] # message parts 0070=; El resultado de la consulta es vacío 0071=; Posición actual del resultado de la consulta es antes del primer registro 0072=; Posición actual del resultado de la consulta es después del último registro # message parts 0081=; en LIMIT, OFFSET o FETCH # SQLSTATE definitions # successful completion 0000=00000 operación completada correctamente # HSQLDB operations 0201=S0500 operación interna no soportada 0301=S0501 no se ha indicado nombre para el origen 0302=S0502 no se ha indicado valor para el campo 0303=S0503 separador con texto de longitud cero 0304=S0504 0320=S0521 la operación no está permitida en una tabla de texto con datos 0321=S0522 sentencia inválida - es necesario indicar tabla de texto 0331=S0531 error de codificación / decodificación # HSQLDB authentication 0391=S1000 password complexity # Server 0401=S1000 Datos transferidos corruptos 0402=S0504 base de datos desconectada 0403=S0504 La versión del cliente '$$' es incompatible. \ Se requiere una versión de protocolo de red HSQLDB '$$' 0404=S0504 El cliente de red no es un controlador JDBC HSQLDB 0405=S0504 El cliente está usando el protocolo HSQLDB http en lugar de hsql 0406=S0504 Lectura incompleta de datos personalizados 0407=S1000 Rutas de ficheros para la base de datos no son correctas # JDBC 0421=S1000 Columna no encontrada 0422=S1000 Error en lectura de datos ('InputStream') 0423=S1000 Argumento incorrecto en una llamada JDBC 0424=S1000 Parámetro no indicado 0425=S1000 Secuencia de escape JDBC desconocida: { # HSQLDB non-core and file 0451=S1000 Fallo al obtener un bloqueo en la base de datos 0452=S1000 Error de lectura/escritura de fichero 0453=S1000 Versión de fichero de base de datos errónea 0454=S1000 data file is modified but backup file does not exist 0455=S1000 La base de datos está en modo solo lectura 0456=S1000 La tabla de datos es de solo lectura 0457=S1000 Acceso denegado 0458=S1000 Error general 0459=S1000 La base de datos es de tipo solo memoria 0460=S1000 Sin memoria 0461=S1000 Error en el fichero script 0462=S1000 Sufijo inválido en el nombre del fichero '$$'. (sufijos válidos: $$) 0463=S1000 Discordancia entre el modo de compresión indicado '$$' y el nombre de fichero '$$' 0464=S1000 La base de datos es de tipo 'sin fichero' 0465=S1000 La base de datos no existe 0466=S1000 Error de lectura/escritura del fichero de datos 0467=S1000 Error de lectura/escritura (IO) 0468=S1000 Superado el tamaño máximo para el fichero de datos 0469=S1000 Archivo de datos en uso 0470=S1000 Backup error # text tables 0481=S1000 El origen de datos para la tabla no se ha especificado 0482=S1000 Texto incorrecto para TEXT de la tabla origen 0483=S1000 TEXT incorrecto en el fichero de la tabla origen - número de línea: $$ $$ 0484=S1000 TEXT en el fichero de la tabla origen - error de lectura/escritura ('IO') 0485=S1000 Caracteres de final de línea no permitidos 0486=S1000 Cabecera no permitida o demasiado larga 0487=S1000 El fichero de texto origen ya existe 0488=S1000 No hay separador de fin # warning 1000=01000 advertencia 1001=01001 advertencia: conflicto en la operación del cursor 1002=01002 advertencia: error de desconexión 1003=01003 advertencia: valor nulo eliminado en la operación de asignación 1004=01004 advertencia: dato de tipo texto, truncado por la derecha 1005=01005 advertencia: áreas de descripción del elemento insuficientes 1006=01006 advertencia: privilegio no revocado 1007=01007 advertencia: privilegio no otorgado 1009=01009 advertencia: condición de búsqueda demasiado larga para el esquema de información ('information schema') 1010=0100A advertencia: expresión demasiado larga para el esquema de información ('information schema') 1011=0100B advertencia: valor por defecto demasiado largo para el esquema de información ('information schema') 1012=0100C advertencia: conjunto de datos ('resultset') devueltos en la operación 1013=0100D advertencia: conjunto de datos ('resultset') adicionales devueltos 1014=0100E advertencia: se ha intentado devolver demasiados conjuntos de datos 1015=0100F advertencia: sentencia demasiado larga para el esquema de información ('information schema') 1016=01011 advertencia: ruta SQL-Java demasiado larga para el esquema de información ('information schema') 1017=0102F advertencia: dato de tipo lista ('array'), truncado por la derecha # no data 1100=02000 no hay datos 1101=02001 no hay datos: no se devuelven conjuntos de datos ('resultsets') adicionales # dynamic SQL error 1200=07000 error de sentencia SQL dinámica 1201=07001 error de sentencia SQL dinámica: la parte USING de la sentencia SQL no cumple las especificaciones de sentencia dinámica 1202=07002 error de sentencia SQL dinámica: la parte USING de la sentencia SQL no cumple las especificaciones para la tabla destino 1203=07003 error de sentencia SQL dinámica: el cursor indicado no puede ejecutarse 1204=07004 error de sentencia SQL dinámica: la sentencia dinámica requiere la parte USING 1205=07005 error de sentencia SQL dinámica: la sentencia preparada no es un cursor válido 1206=07006 error de sentencia SQL dinámica: atributo no permitido para el tipo de dato restringido 1207=07007 error de sentencia SQL dinámica: los campos resultantes de la sentencia requieren la parte USING 1208=07008 error de sentencia SQL dinámica: contador de descripción incorrecto 1209=07009 error de sentencia SQL dinámica: índice de descripción incorrecto 1211=0700B error de sentencia SQL dinámica: función de transformación no permitida para el tipo de dato 1212=0700C error de sentencia SQL dinámica: valor DATA no definido 1213=0700D error de sentencia SQL dinámica: destino DATA incorrecto 1214=0700E error de sentencia SQL dinámica: valor LEVEL incorrecto 1215=0700F error de sentencia SQL dinámica: DATETIME_INTERVAL_CODE incorrecto # HSQLDB 1251=07501 sentencia SQL está cerrada 1252=07502 sentencia SQL es incorrecta 1253=07503 sentencia SQL no devuelve el número de filas 1254=07504 sentencia SQL no devuelve un conjunto de datos ('result set') 1255=07505 sentencia SQL se ejecuta en modo 'batch' 1256=07506 sentencia SQL no se ejecuta en modo 'batch' # connection exception 1300=08000 excepción de conexión 1301=08001 excepción de conexión: cliente SQL no puede establecer una conexión 1302=08002 excepción de conexión: nombre de conexión en uso 1303=08003 excepción de conexión: conexión no existe 1304=08004 excepción de conexión: servidor SQL rechaza la conexión SQL 1305=08006 excepción de conexión: fallo de conexión 1306=08007 excepción de conexión: resolución de transacción desconocida # HSQLDB connection exception 1351=08501 excepción de conexión: demasiado tiempo (timed out) 1352=08502 advertencia: información de cliente no soportada 1353=08503 excepción de conexión: cerrada # triggered action exception 1400=09000 excepción en la acción del disparador ('trigger') # feature not supported 1500=0A000 característica no soportada 1501=0A001 característica no soportada: múltiple transacciones de servidor # HSQLDB feature not supported 1551=0A501 característica no soportada: # invalid target type specification 1600=0D000 tipo de destino indicado incorrecto # invalid schema name list specification 1700=0E000 nombre de lista indicada para el esquema incorrecto # locator exception 1800=0F000 excepción del localizador 1801=0F001 excepción del localizador: valor indicado incorrecto # HSQLDB locator 3474=0F502 lob antiguo y ya no es válido 3475=0F503 lob - canal de datos ('stream') está cerrado # resignal when handler not active 1900=0K000 señal reenviada cuando el canal no estaba activo # invalid grantor 2000=0L000 otorgador de privilegios ('grantor') incorrecto # HSQLDB 2051=0L501 otorgador de privilegios ('grantor') incorrecto - falta el privilegio CREATE_SCHEMA # invalid SQL-invoked procedure reference 2100=0M000 referencia al procedimiento SQL invocado incorrecto # invalid role specification 2200=0P000 role indicado incorrecto # HSQLDB 2251=0P501 role indicado incorrecto - permiso circular 2252=0P502 role indicado incorrecto - permiso ya otorgado 2253=0P503 role indicado incorrecto - role no indicado # invalid transform group name specification 2300=0S000 nombre de la transformación del grupo indicado incorrecto # target table disagrees with cursor specification 2400=0T000 tabla destino no corresponde con el cursor indicado # attempt to assign to non-updatable column 2500=0U000 intento de asignar valores a una columna no actualizable # attempt to assign to ordering column 2600=0V000 intento de asignar valores a una columna de ordenación # prohibited statement encountered during trigger execution 2700=0W000 sentencia prohibida durante la ejecución de un disparador ('trigger') # invalid foreign server specification 2800=0X000 servidor externo indicado incorrecto # pass-through specific condition 2900=0Y000 condición del no-verificador ('pass-through') 2901=0Y001 condición del no-verificador ('pass-through'): opción del cursor incorrecto 2902=0Y002 condición del no-verificador ('pass-through'): creación del cursor incorrecto # diagnostics exception 3000=0Z000 excepción de diagnósticos 3001=0Z001 excepción de diagnósticos: máximo número de áreas de diagnosis excedido # 04-PSM 3003=0Z002 excepción de diagnósticos: diagnosis accedido sin un canal activo # 04-PSM 3100=20000 sentencia CASE no contiene casos # cardinality violation 3201=21000 violación de cardinalidad # data exception 3400=22000 excepción de datos 3401=22001 excepción de datos: dato de tipo texto, truncado por la derecha 3402=22002 excepción de datos: valor nulo, parámetro no indicador 3403=22003 excepción de datos: valor numérico fuera de rango 3404=22004 excepción de datos: valor nulo no permitido 3405=22005 excepción de datos: error en asignación 3406=22006 excepción de datos: formato de intervalo incorrecto 3407=22007 excepción de datos: formato fecha/hora incorrecto 3408=22008 excepción de datos: desbordamiento ('overflow') para campo fecha/hora 3409=22009 excepción de datos: valor de desplazamiento de zona horaria incorrecto 3410=2200B excepción de datos: conflicto con el carácter de escape 3411=2200C excepción de datos: uso incorrecto del carácter de escape 3412=2200D excepción de datos: octeto de escape incorrecto 3413=2200E excepción de datos: valor nulo en lista ('array') destino 3414=2200F excepción de datos: texto de longitud cero 3415=2200G excepción de datos: error más específico de conversión de tipo 3416=2200H excepción de datos: excedido el límite del generador de secuencia 3417=2200J excepción de datos: notaciones no idénticas con el mismo nombre 3418=2200K excepción de datos: entidades sin parsear no idénticas con el mismo nombre 3419=2200L excepción de datos: no es un documento XML 3420=2200M excepción de datos: documento XML incorrecto 3421=2200N excepción de datos: contenido XML incorrecto 3422=2200P excepción de datos: valor del intervalo fuera de rango 3423=2200Q excepción de datos: desbordamiento ('overflow') en valor multiregistro ('multiset') 3424=2200R excepción de datos: desbordamiento ('overflow') en valor XML 3425=2200S excepción de datos: comentario incorrecto 3426=2200T excepción de datos: instrucción de procesado incorrecta 3427=2200U excepción de datos: nodo del documento no es un XQuery 3428=2200V excepción de datos: contexto del elemento XQuery incorrecto 3429=2200W excepción de datos: error al serializar un XQuery 3430=22010 excepción de datos: valor del parámetro del indicador incorrecto 3431=22011 excepción de datos: error en parte del texto ('substring') 3432=22012 excepción de datos: división por cero 3433=22013 excepción de datos: tamaño anterior o posterior del contexto de la función incorrecto 3434=22014 excepción de datos: argumento incorrecto para la función NTILE 3435=22015 excepción de datos: desbordamiento del campo intervalo 3436=22016 excepción de datos: argumento incorrecto para la función NTH_VALUE 3437=22017 excepción de datos: dato indicado incorrecto para el canal de datos ('datalink') 3438=22018 excepción de datos: valor incorrecto para CAST 3439=22019 excepción de datos: carácter de escape incorrecto 3440=2201A excepción de datos: argumento nulo pasado al constructor del canal de datos ('datalink') 3441=2201B excepción de datos: expresión regular incorrecta 3442=2201C excepción de datos: fila nula no permitido en la tabla 3443=2201D excepción de datos: el valor del canal de datos ('datalink') excede la longitud máxima 3444=2201E excepción de datos: argumento incorrecto para el logaritmo natural 3445=2201F excepción de datos: argumento incorrecto para la función potencia 3446=2201G excepción de datos: argumento incorrecto para la funcion cubo 3447=2201J excepción de datos: secuencia XQuery no puede ser validada 3448=2201S excepción de datos: expresión regular en XQuery incorrecta 3449=2201T excepción de datos: opción en XQuery incorrecta 3450=2201U excepción de datos: intento de remplazar un texto de longitud cero 3451=2201V excepción de datos: texto sustituto para XQuery incorrecto 3452=2201W excepción de datos: filas contadas incorrectas al procesar mover al primer registro 3453=2201X excepción de datos: filas contadas incorrecata al procesar posición del resultado 3454=22021 excepción de datos: carácter no encontrado en el dicccionario 3455=22022 excepción de datos: desbordamiento del indicador 3456=22023 excepción de datos: valor del parámetro incorrecto 3457=22024 excepción de datos: texto C no terminado 3458=22025 excepción de datos: secuencia de escape incorrecta 3459=22026 excepción de datos: dato tipo texto, discondancia en la longitud 3460=22027 excepción de datos: error de trim 3461=22029 excepción de datos: no hay caracteres in texto UCS # HSQLDB data exception 3471=22501 el valor no se puede convertir al tipo destino 3472=22511 argumento de la función incorrecto 3473=22521 fallo de serializar el objeto # 04-PSM 3488=2202A excepción de datos: valor nulo en el campo referencia 3489=2202D excepción de datos: valor nulo sustituido por el parámetro del sujeto variable 3490=2202E excepción de datos: error en el elemento lista ('array') 3491=2202F excepción de datos: dato lista ('array'), truncado por la derecha 3492=2202G excepción de datos: argumento repetido en un paso del muestreo 3493=2202H excepción de datos: tamaño del muestreo incorrecto # integrity constraint violation 3500=23000 violación del restricción de integridad 3501=23001 violación del restricción de integridad: violación de la restriciión 0010=23502 violación del restricción de integridad: restricción ('check') NOT NULL 0177=23503 violación del restricción de integridad: no ha registro padre en clave foránea 0008=23504 violación del restricción de integridad: sin acción para la clave foránea 0104=23505 violación del restricción de integridad: violación de índice o clave única 0157=23513 violación del restricción de integridad: restricción ('check') no se cumple # invalid cursor state 3600=24000 estado del cursor incorrecto 3601=24501 estado del cursor incorrecto: cursor indicado no está abierto 3602=24502 estado del cursor incorrecto: cursor indicado ya estaba abierto 3603=24504 estado del cursor incorrecto: cursor indicado no está posicionado en una fila para sentencia UPDATE, DELETE, SET, o GET 3604=24513 estado del cursor incorrecto: no se puede hacer FETCH NEXT, PRIOR, CURRENT, o RELATIVE, ya que la posicón del cursor es desconocida 3605=24514 estado del cursor incorrecto: cursor desactivado por un error previo 3606=24515 estado del cursor incorrecto: todas las columnas se deben informar antes de llamar a INSERT 3621=24521 estado del cursor incorrecto: la fila se ha modificado fuera del cursor # invalid transaction state 3700=25000 estado de transacción incorrecto 3701=25001 estado de transacción incorrecto: transacción SQL activa 3702=25002 estado de transacción incorrecto: transacción parcial ya estaba activa 3703=25003 estado de transacción incorrecto: modo de acceso inadecuado para una transacción parcial 3704=25004 estado de transacción incorrecto: nivel de aislamiento inadecuado para una transacción parcial 3705=25005 estado de transacción incorrecto: no hay activo ninguna transacción SQL para la transacción parcial 3706=25006 estado de transacción incorrecto: transacción SQL de sólo lectura 3707=25007 estado de transacción incorrecto: no se soporta mezclar sentencias de datos y de sistema ('infomartion schema') 3708=25008 estado de transacción incorrecto: el cursor detenido necesita el mismo nivel de aislamiento # invalid SQL statement name 3800=26000 nombre de sentencia SQL incorrecto # triggered data change violation 3900=27000 violación al cambiar datos a través de un disparador # invalid authorization specification 4000=28000 autorización incorrecta # HSQLDB invalid authorization specification 4001=28501 autorización incorrecta - no se encuentra 4002=28502 autorización incorrecta - identificador interno 4003=28503 autorización incorrecta - ya existe # syntax error or access rule violation in direct statement 4100=2A000 error de sintáxis o violación de acceso en una sentencia directa # dependent privilege descriptors still exist 4200=2B000 descritores de privilegios dependientes todavía existen # invalid character set name 4300=2C000 name informado con carácter incorrecto # invalid transaction termination 4400=2D000 finalización de la transacción incorrecta 4401=2D522 finalización de la transacción incorrecta: COMMIT y ROLLBACK no están permitidos en una sentencia atómica compuesta # invalid connection name 4500=2E000 nombre de conexión incorrecto # SQL routine exception 4600=2F000 excepción en rutina SQL 4602=2F002 excepción en rutina SQL: modificar datos SQL no está permitido 4603=2F003 excepción en rutina SQL: sentencia SQL ejecutada prohibida 4604=2F004 excepción en rutina SQL: leer datos SQL no está permitido 4605=2F005 excepción en rutina SQL: la función no ejecutó una sentencia RETURN # invalid collation name 4650=2H000 nombre de juego de caracteres ('collation') incorrecto # invalid SQL statement identifier 4660=30000 identificador de sentencia SQL incorrecto # invalid SQL descriptor name 4670=33000 nombre de descriptor SQL incorrecto # invalid cursor name 4680=34000 nombre de cursor incorrecto # invalid condition number 4690=35000 número de condición incorrecto # cursor sensitivity exception 4700=36000 excepción en sensibilidad del cursor 4701=36001 excepción en sensibilidad del cursor: petición rechazada 4702=36002 excepción en sensibilidad del cursor: petición fallida # cursor compatibility warnings 4711=36501 discrepancia en sensibilidad del cursor 4712=36502 discrepancia en updatibiidad del cursor 4713=36503 discrepancia en nivel de retención del cursor # syntax error or access rule violation in dynamic statement 4790=37000 error de sintáxis o violación de acceso en una sentencia dinámica # external routine exception 4800=38000 excepcón en rutina externa 4801=38001 excepcón en rutina externa: SQL contenido no permitido 4802=38002 excepcón en rutina externa: cambios en datos SQL no está permitido 4803=38003 excepcón en rutina externa: sentencia SQL ejecutada prohibida 4804=38004 excepcón en rutina externa: leer datos SQL no está permitido # external routine invocation exception 4810=39000 excepcón al ejecutar rutina externa 4811=39004 excepcón al ejecutar rutina externa: valor nulo no permitido # savepoint exception 4820=3B000 excepción en punto de retorno ('savepoint') 4821=3B001 excepción en punto de retorno ('savepoint'): formato incorrecto 4822=3B002 excepción en punto de retorno ('savepoint'): demasiados # ambiguous cursor name 4830=3C000 nombre de cursor ambiguo # invalid catalog name 4840=3D000 nombre de catálogo incorrecto # invalid schema name 4850=3F000 nombre de esquema incorrecto # transaction rollback 4860=40000 deshacer transacción ('rollback') 4861=40001 deshacer transacción ('rollback'): fallo de serialización 4862=40002 deshacer transacción ('rollback'): violación del restricción de integridad 4863=40003 deshacer transacción ('rollback'): sentencia de finalización desconocida 4864=40004 deshacer transacción ('rollback'): excepción al ejecutar un disparador # HSQLDB internal transactions 4871=40501 deshacer transacción ('rollback'): fila modificada por múltiples transacciones # syntax error or access rule violation 5000=42000 error de sintáxis o violación de acceso # HSQLDB database object names 5501=42501 usuario no tiene privilegios suficientes o objeto no encontrado 5502=42502 exiset objeto dependiente 5503=42503 objeto de sistema no puede ser modificado 5504=42504 nombre del objeto ya existe 5505=42505 nombre de esquema incorrecto - discrepancia en el nombre 5506=42506 nombre de catálogo incorrecto 5507=42507 se requiere derechos de administrador 5508=42508 etiqueta no encontrada 5509=42509 tipo no encontrado o el usuario no tiene privilegios suficientes 5510=42510 nombre demasiado largo # genrated columns 5512=42512 expresión incorrecta en paret CHECK o GENERATED 5513=42513 asignación a columna generada # constraint defintition issues 5520=42520 SET NULL requiere una columna nulable 5521=42521 SET DEFAULT requiere una expresión para el valor por defecto de la columna 5522=42522 ya existe una restricción única, UNIQUE, para este conjunto de columnas 5523=42523 la tabla no tiene clave primária 5524=42524 la definición de esta restricción no está permitida 5525=42525 la definición de identidad ('identity') no está permitida 5526=42526 la columna forma parte de la clave primaria 5527=42527 la columna forma parte de una restricción 5528=42528 ya existe una clave foránea ('FOREIGN KEY') para este conjunto de columnas 5529=42529 no existe una restricción única, ('UNIQUE') en las columnas indicadas 5530=42530 la definición de esta clave primária no está permitida 5531=42531 se necesita una expresión para el valor por defecto 5532=42532 ya existe una clave primária 5533=42533 es referenciada por una clave foránea ('FOREIGN KEY') 5534=42534 la columna de tipo LOB o ARRAY no se puede usar en esta operación # other definition issues 5535=42535 no es una columna identidad ('identity') 5536=42536 la columna está referenciada en 5537=42537 no se puede usar WITH CHECK OPTION para una vista de sólo lectura 5538=42538 la definición del disparador ('TRIGGER') no es compatible con la tabla 5539=42539 no se puede borrar un usuario mientras esté conectado # DML 5541=42541 se requiere la palabra DEFAULT 5542=42542 se requiere la parte OVERRIDING 5543=42543 se requiere o la palabra DEFAULT o la parte OVERRIDING 5544=42544 la palabra DEFAULT no se puede usar en columnas sin valor por defecto 5545=42545 INSERT, UPDATE, DELETE o TRUNCATE no permitido para la tabla o la vista 5546=42546 el número de columnas destino no concuerda con la expressión de la consulta 5547=42547 WHEN MATCHED repetido en sentencia MERGE 5548=42548 WHEN NOT MATCHED repetido en sentencia MERGE 5549=42549 LIMIT, OFFSET o FETCH ya utilizado # 5551=42551 demasiados elementos para los identificadores 5555=42555 nombre de propiedad incorrecto 5556=42556 valor para la propiedad incorrecto # HSQLDB type conversion 5561=42561 tipo de datos incompatibles en la conversión 5562=42562 tipo de datos incompatibles en la combinación 5563=42563 tipo de datos incompatibles en la comparación 5564=42564 discrepancia en el número de filas contadas 5565=42565 tipo de datos incompatibles en la operación 5566=42566 falta el calificador del intervalo 5567=42567 se necesita conversión de tipo de dato para el parámetro o para el literal nulo 5568=42568 el tipo de dato de la expresión no es boleano 5569=42569 se requiere un identificador entrecomillado 5570=42570 la concatenación excede el máximo de longitud que permite el tipo de dato # 5571=42571 el literal NULL no está permitido 5572=42572 expresión GROUP BY incorrecta 5573=42573 expresión HAVING incorrecta 5574=42574 la expresión no está en una agregación o columnas del GROUP BY 5575=42575 el marcador del parámetro no está permitido 5576=42576 expresión ORDER BY incorrecta 5577=42577 nombre de columna duplicada en la lista de columnas 5578=42578 nombre de columna duplicada en la tabla derivada 5579=42579 actualización de la columna duplicada 5580=42580 refencia a la columna ambigua # lexical elements 5581=42581 palabra no esperado 5582=42582 palabra desconocida 5583=42583 identificador entrecomillado mal escrito 5584=42584 texto mal escrito 5585=42585 constante numérica mal escrita 5586=42586 texto unicode mal escrito 5587=42587 texto binario mal escrito 5588=42588 texto de tipo bit mal escrito 5589=42589 comentario mal escrito 5590=42590 fin de sentencia no esperado # other 5591=42591 no se puede borrar última columna de la tabla 5592=42592 precisión o escala fuera de rango 5593=42593 se han detectado columnas incompatibles en filas resultantes de operaciones UNION, INTERSECT, EXCEPT, o VALUES 5594=42594 numéro de filas incorrecto en filas resultantes de operaciones UNION, INTERSECT, EXCEPT, o VALUES 5595=42595 privilegio indicado incorrecto - se requiere ALL PRIVILEGES 5596=42596 el esquema indicado no corresponde con el esquema de la sentencia "create schema" incluida 5597=42597 número fuera de rango válido para el generador de secuencia 5598=42598 la expresión secuencia no se puede usar en este contexto 5599=42599 la longitud se debe indicar en la definición del tipo de dato # HSQLDB - PSM definition and calls 5601=42601 declaración de identificador repetida 5602=42602 sentencia incorrecta 5603=42603 parámetro dinámico o variable requerida en un argumento INOUT o OUT 5604=42604 excepción en rutina SQL: declaración de atributos incompatible 5605=42605 excepción en rutina SQL: ya existe otra rutina con la misma firma 5606=42606 excepción en rutina SQL: nombre de variable ya existe 5607=42607 valor SQLSTATE incorrecto 5608=42608 declaración incorrecta ya que no respeta la restricción sobre datos, parámetro SQL DATA 5609=42609 la firma de la rutina no se ha encontrado para 5610=42610 declaración incorrecta 'aggregate function' # with check option violation 5700=44000 violación de opción 'with check option' # 04-PSM # unhandled user-defined exception 5800=45000 excepción definida por el usuario no esperada # Java execution 6000=46000 Java execution 6001=46001 Java execution: URL incorrecto 6002=46002 Java execution: nombre de JAR incorrecto 6003=46003 Java execution: borrado de clase incorrecto 6004=46005 Java execution: substitución incorrecta 6007=4600A Java execution: intento de reemplazar un JAR desinstalado 6008=4600B Java execution: intento de borrar un JAR ya desinstalado 6009=4600C Java execution: borrado de JAR incorrecto 6010=4600D Java execution: ruta incorrecta 6011=4600E Java execution: la ruta apunta a si mismo 6012=46102 Java execution: nombre de JAR incorrecto en la ruta 6013=46103 Java execution: no se puede resolver el nombre de clase # HSQLDB - SQL/JRT 6021=46511 los tipos de parámetros declarados no corresponden con la firma del método # Unknown Error: Catch-All 6500=99000 Error desconocido: no contemplado ('Catch-All') 6501=99099 Error desconocido: Error convirtiendo el código del vendedor a un código de estado SQL # FDW-specific condition 6600=HV000 condición específica FDW 6601=HV001 condición específica FDW: error al reservar memoria 6602=HV002 condición específica FDW: se necesita un valor de parámetro dinámico 6603=HV004 condición específica FDW: tipo de dato incorrecto 6604=HV005 condición específica FDW: nombre de columna no encontrado 6605=HV006 condición específica FDW: los descriptores de los tipos de dato son incorrectos 6606=HV007 condición específica FDW: nombre de columna incorrecto 6607=HV008 condición específica FDW: número de columna incorrecto 6608=HV009 condición específica FDW: uso incorrecto del puntero nulo 6609=HV00A condición específica FDW: formato de texto incorrecto 6610=HV00B condición específica FDW: identificador ('handle') incorrecto 6611=HV00C condición específica FDW: índice de opción incorrecto 6612=HV00D condición específica FDW: nombre de opción incorrecto 6613=HV00J condición específica FDW: nombre de opción no encontrado 6614=HV00K condición específica FDW: identficador ('handle') repetido 6615=HV00L condición específica FDW: no se podido crer la ejecución 6616=HV00M condición específica FDW: no se podido crear la repetción 6617=HV00N condición específica FDW: no se podido establecer la conexión 6618=HV00P condición específica FDW: no hay esquemas 6619=HV00Q condición específica FDW: esquema no encontrado 6620=HV00R condición específica FDW: tabla no encontrada 6621=HV010 condición específica FDW: error en la función secuencia 6622=HV014 condición específica FDW: excedido el máximo de identificadores ('handle') permitido 6623=HV021 condición específica FDW: información del descriptor inconsistente 6624=HV024 condición específica FDW: valor del atributo incorrecto 6625=HV090 condición específica FDW: longitud de bufer o del texto incorrecto 6626=HV091 condición específica FDW: identificador del campo descriptor incorrecto # datalink exception 6700=HW000 excepción en conexión de datos 6701=HW001 excepción en conexión de datos: fichero externo no conectado 6702=HW002 excepción en conexión de datos: fichero externo ya está conectado 6703=HW003 excepción en conexión de datos: el fichero de referencia no existe 6704=HW004 excepción en conexión de datos: palabra ('token') de escritura incorrecto 6705=HW005 excepción en conexión de datos: construcción de la conexión de datos incorrecto 6706=HW006 excepción en conexión de datos: no tiene permiso de escritura para actualizar 6707=HW007 excepción en conexión de datos: fichero de referencia incorrecto # CLI-specific condition 6800=HY093 condición específica CLI: valor de conexión de datos incorrecto hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/resources/column-remarks.properties0000644000175000017500000011264412007547416026043 0ustar renerene# default column-remarks # SYSTEM_ALLTYPEINFO SYSTEM_ALLTYPEINFO_TYPE_NAME=the HSQLDB-specific data type name; this is the canonical name used in CREATE TABLE and ALTER TABLE statements. SYSTEM_ALLTYPEINFO_DATA_TYPE=SQL data type. This may be a java.sql.Types data type, a SQL 200n data type or an HSQLDB-specific data type. For datetime or interval data types, this column returns the concise data type (such as SQL_­TYPE_­TIME or SQL_­INTERVAL_­YEAR_­TO_­MONTH). SYSTEM_ALLTYPEINFO_PRECISION=The maximum column size for this data type. For numeric data, this is the maximum precision. For string data, this is the length in characters. For datetime data types, this is the length in characters of the string representation (assuming the maximum allowed precision of the fractional seconds component). NULL for data types where column size is not applicable. For interval data types, this is the number of characters in the character representation of the interval literal (as defined by the interval leading precision). SYSTEM_ALLTYPEINFO_LITERAL_PREFIX=the character or characters used to prefix a literal of this type; for example, a single quotation mark (') for character data types; NULL for data types where a literal prefix is not applicable SYSTEM_ALLTYPEINFO_LITERAL_SUFFIX=the character or characters used to terminate a literal of this type; for example, a single quotation mark (') for character data types; NULL for data types where a literal suffix is not applicable SYSTEM_ALLTYPEINFO_CREATE_PARAMS=A list of keywords, separated by commas, corresponding to each parameter that may be specified in parentheses when issuing DDL relative to the data type. The keywords in the list, in the language of the current Locale, may be any of the following: length, precision, scale. They appear in the order that the syntax requires that they be used. For example, CREATE_PARAMS for DECIMAL with an English locale would be "precision,scale"; CREATE_PARAMS for VARCHAR would be "length". The value is NULL if there are no parameters for the data type definition; for example, INTEGER. SYSTEM_ALLTYPEINFO_NULLABLE=NULL values allowed for this type?: { No Nulls | Nullable | Unknown } SYSTEM_ALLTYPEINFO_CASE_SENSITIVE=TRUE if the type is case-sensitive in collations and comparisons; FALSE otherwise SYSTEM_ALLTYPEINFO_SEARCHABLE=use of WHERE?: { None | Char (Only WHERE .. LIKE) | Basic (Except WHERE .. LIKE) | Searchable (All forms of WHERE...) } SYSTEM_ALLTYPEINFO_UNSIGNED_ATTRIBUTE=TRUE if the data type is unsigned; NULL the attribute is not applicable to the data type or the data type is not numeric. SYSTEM_ALLTYPEINFO_FIXED_PREC_SCALE=TRUE if the data type has predefined fixed precision and scale , like a money data type. NULL for non-numeric types. SYSTEM_ALLTYPEINFO_AUTO_INCREMENT=NULL if the attribute is not applicable to the data type or the data type is not numeric. If TRUE, this indicates that when an insert is made, a unique value is inserted into the column at insert time. The increment is not defined. An application should not assume that auto-increment values start at any particular point or increment by any particular value. SYSTEM_ALLTYPEINFO_LOCAL_TYPE_NAME=Localized version of the name of the data type; NULL if a localized name is not supported. This name is intended for display only, such as in dialog boxes SYSTEM_ALLTYPEINFO_MINIMUM_SCALE=minimum scale supported SYSTEM_ALLTYPEINFO_MAXIMUM_SCALE=maximum scale supported SYSTEM_ALLTYPEINFO_SQL_DATA_TYPE=The value of the SQL data type as it would appear in the SQL CLI SQL_DESC_TYPE field of the SQLDA. SYSTEM_ALLTYPEINFO_SQL_DATETIME_SUB=When the value of SQL_DATA_TYPE is SQL_DATETIME or SQL_INTERVAL, this column contains the datetime/interval subcode. For data types other than datetime and interval, this column is NULL. SYSTEM_ALLTYPEINFO_NUM_PREC_RADIX=For numeric types, this column contains the value 10 to indicate that COLUMN_SIZE specifies a number of decimal digits. Otherwise, this column is NULL. SYSTEM_ALLTYPEINFO_INTERVAL_PRECISION=If the data type is an interval data type, then this column contains the value of the interval leading precision. Otherwise, this column is NULL. SYSTEM_ALLTYPEINFO_AS_TAB_COL=TRUE if the engine supports this data type as a table column, else FALSE SYSTEM_ALLTYPEINFO_AS_PROC_COL=TRUE if the engine supports this data type as a procedure parameter or return type, else FALSE SYSTEM_ALLTYPEINFO_MAX_PREC_ACT=same as PRECISION except for data types whose precision cannot be represented by an INTEGER column value SYSTEM_ALLTYPEINFO_MIN_SCALE_ACT=same as MINIMUM_SCALE except for data types whose minimum scale cannot be represented by a SMALLINT column value SYSTEM_ALLTYPEINFO_MAX_SCALE_ACT=same as MAXIMUM_SCALE except for data types whose maximum scale cannot be represented by a SMALLINT column value SYSTEM_ALLTYPEINFO_COL_ST_CLS_NAME=the fully qualified name of the Java class that HSQLDB uses to represent values of this type in memory SYSTEM_ALLTYPEINFO_COL_ST_IS_SUP=TRUE if the Java class that HSQLDB uses to represent values of this type in memory is supported under the hosting JVM and engine build options SYSTEM_ALLTYPEINFO_STD_MAP_CLS_NAME=the fully qualified name of the Java class that the JDBC standard mapping uses to represent values of this type SYSTEM_ALLTYPEINFO_STD_MAP_IS_SUP=TRUE if the Java class that the JDBC standard mapping uses to represent values of this type is supported under the current JVM SYSTEM_ALLTYPEINFO_CST_MAP_CLS_NAME=the fully qualified name of the Java class that HSQLDB provides to represent values of this type via the JDBC interface SYSTEM_ALLTYPEINFO_CST_MAP_IS_SUP=TRUE if the Java class that HSQLDB provides to represent values of this type via the JDBC interface is supported under the hosting JVM and engine build options SYSTEM_ALLTYPEINFO_MCOL_JDBC=the maximum character octet length of this type if it is representable via the JDBC interface (i.e. as an INTEGER column value) SYSTEM_ALLTYPEINFO_MCOL_ACT=same as MCOL_JDBC except for data types whose maximum character octet length cannot be represented by an INTEGER column value SYSTEM_ALLTYPEINFO_DEF_OR_FIXED_SCALE=the default or fixed scale of numeric types; NULL if not applicable of the type is not numeric SYSTEM_ALLTYPEINFO_REMARKS=a localized explanatory comment on the data type SYSTEM_ALLTYPEINFO_TYPE_SUB=the variant tag for this variation of the data type. 1 = standard, 2 = identity, 4 = ignore case # SYSTEM_BESTROWIDENTIFIER SYSTEM_BESTROWIDENTIFIER_SCOPE=actual scope of result, as defined in java.sql.DatabaseMetadata SYSTEM_BESTROWIDENTIFIER_COLUMN_NAME=simple column name SYSTEM_BESTROWIDENTIFIER_DATA_TYPE=SQL data type. This may be a java.sql.Types data type, a SQL 200n data type or an HSQLDB-specific data type. For datetime or interval data types, this column returns the concise data type (such as SQL_­TYPE_­TIME or SQL_­INTERVAL_­YEAR_­TO_­MONTH). SYSTEM_BESTROWIDENTIFIER_TYPE_NAME=the HSQLDB-specific data type name; this is the canonical name used in CREATE TABLE and ALTER TABLE statements. SYSTEM_BESTROWIDENTIFIER_COLUMN_SIZE=precision for number types; length for variable sized types; NULL for others SYSTEM_BESTROWIDENTIFIER_BUFFER_LENGTH=The maximum length in bytes of data, if definitely known, that would be transferred to a buffer on a fetch operation. For numeric data, this size may be different than the size of the data stored on the data source. This value is the same as the COLUMN_SIZE column for binary data. This value is the twice the COLUMN_SIZE column for character data. If the actual value is larger than can be represented in an INTEGER column value, this is NULL. SYSTEM_BESTROWIDENTIFIER_DECIMAL_DIGITS=scale of column for number types SYSTEM_BESTROWIDENTIFIER_PSEUDO_COLUMN=is this a pseudo column like an Oracle ROWID? SYSTEM_BESTROWIDENTIFIER_TABLE_CAT=catalog in which the table containing the column is defined SYSTEM_BESTROWIDENTIFIER_TABLE_SCHEM=schema in which the table containing the column is defined SYSTEM_BESTROWIDENTIFIER_TABLE_NAME=simple name of the table containing the column SYSTEM_BESTROWIDENTIFIER_NULLABLE=is the column nullable? SYSTEM_BESTROWIDENTIFIER_IN_KEY=does column participate in primary or alternate key? # SYSTEM_CACHEINFO #SYSTEM_CACHEINFO_CACHE_CLASS=FQN of the Java Class implementing the cache #SYSTEM_CACHEINFO_CACHE_HASH=the in-memory hashCode() of the Cache object SYSTEM_CACHEINFO_CACHE_FILE=absolute path of the file underlying the cache object #SYSTEM_CACHEINFO_CACHE_LENGTH=length of the cache object's row data array SYSTEM_CACHEINFO_MAX_CACHE_COUNT=maximum number of rows that will be buffered in memory by this cache SYSTEM_CACHEINFO_MAX_CACHE_BYTES=approximate maximum size, in bytes, of row data that will be buffered in memory by this cache SYSTEM_CACHEINFO_CACHE_SIZE=number of rows currently cached SYSTEM_CACHEINFO_CACHE_BYTES=approximate number of row data bytes currently cached SYSTEM_CACHEINFO_FILE_FREE_BYTES=aggregate size, in octets, of all allocation units considered available for reuse #SYSTEM_CACHEINFO_SMALLEST_FREE_ITEM=size, in octets, of smallest allocation unit available for reuse #SYSTEM_CACHEINFO_LARGEST_FREE_ITEM=size, in octets, of largest allocation unit available for reuse SYSTEM_CACHEINFO_FILE_FREE_COUNT=number of allocation units available for reuse SYSTEM_CACHEINFO_FILE_FREE_POS=one greater than largest file position known to be allocated #SYSTEM_CACHEINFO_MAX_CACHE_SIZE=maximum allowable number of cached Row objects #SYSTEM_CACHEINFO_MAX_CACHE_BYTE_SIZE=limit on memory consumption of cached Row objects #SYSTEM_CACHEINFO_MULTIPLIER_MASK=binary mask used to calculate indices into row data array #SYSTEM_CACHEINFO_WRITER_LENGTH=length of row write buffer array # INFORMATION_SCHEMA_CATALOG_NAME INFORMATION_SCHEMA_CATALOG_NAME_CATALOG_NAME=catalog name # SYSTEM_COLUMNPRIVILEGES SYSTEM_COLUMNPRIVILEGES_TABLE_CAT=catalog in which the table containing the column is defined SYSTEM_COLUMNPRIVILEGES_TABLE_SCHEM=schema in which the table containing the column is defined SYSTEM_COLUMNPRIVILEGES_TABLE_NAME=simple name of the table containing the column is defined SYSTEM_COLUMNPRIVILEGES_COLUMN_NAME=simple name of the column SYSTEM_COLUMNPRIVILEGES_GRANTOR=grantor of access SYSTEM_COLUMNPRIVILEGES_GRANTEE=grantee of access SYSTEM_COLUMNPRIVILEGES_PRIVILEGE=name of access, e.g. one of { ALL, SELECT, INSERT, UPDATE, DELETE, ...} SYSTEM_COLUMNPRIVILEGES_IS_GRANTABLE=grantable?: YES - may grant to others, NO - not permitted to grant to others, NULL - unknown # SYSTEM_COLUMNS SYSTEM_COLUMNS_TABLE_CAT=catalog in which the table containing the column is defined SYSTEM_COLUMNS_TABLE_SCHEM=schema in which the table containing the column is defined SYSTEM_COLUMNS_TABLE_NAME=simple name of the table containing the column SYSTEM_COLUMNS_COLUMN_NAME=simple name of the column SYSTEM_COLUMNS_DATA_TYPE=SQL data type. This may be a java.sql.Types data type, a SQL 200n data type or an HSQLDB-specific data type. For datetime or interval data types, this column returns the concise data type (such as SQL_­TYPE_­TIME or SQL_­INTERVAL_­YEAR_­TO_­MONTH). SYSTEM_COLUMNS_TYPE_NAME=the HSQLDB-specific data type name; this is the canonical name used in CREATE TABLE and ALTER TABLE statements. SYSTEM_COLUMNS_COLUMN_SIZE=precision for number types; length for sized types; NULL if not applicable SYSTEM_COLUMNS_BUFFER_LENGTH=The maximum length in bytes of data, if definitely known, that would be transferred to a buffer on a fetch operation. For numeric data, this size may be different than the size of the data stored on the data source. This value is the same as the COLUMN_SIZE column for binary data. This value is the twice the COLUMN_SIZE column for character data. If the actual value is larger than can be represented in an INTEGER column value, this is NULL. SYSTEM_COLUMNS_DECIMAL_DIGITS=# of fractional digits (scale) for number types SYSTEM_COLUMNS_NUM_PREC_RADIX=Radix of reported numeric precision (i.e. base of number types) SYSTEM_COLUMNS_NULLABLE=is NULL allowed?: { columnNoNulls (maybe not), columnNullable (definitely), columnNullableUnknown } SYSTEM_COLUMNS_REMARKS=explanitory comment describing the column (may be NULL) SYSTEM_COLUMNS_COLUMN_DEF=default value (may be NULL) SYSTEM_COLUMNS_SQL_DATA_TYPE=The value of the SQL data type as it would appear in the SQL CLI SQL_DESC_TYPE field of the SQLDA. SYSTEM_COLUMNS_SQL_DATETIME_SUB=When the value of SQL_DATA_TYPE is SQL_DATETIME or SQL_INTERVAL, this column contains the datetime/interval subcode. For data types other than datetime and interval, this column is NULL. SYSTEM_COLUMNS_CHAR_OCTET_LENGTH=for char types, the maximum number of bytes in the column, if the value can be represented as an INTEGER column value, else NULL SYSTEM_COLUMNS_ORDINAL_POSITION=index of column in table (starting at 1) SYSTEM_COLUMNS_IS_NULLABLE=is column nullable?: { YES (might allow) | NO (definitely not) | '' (unknown) } SYSTEM_COLUMNS_SCOPE_CATLOG=catalog of table that is the scope of a reference attribute (NULL if DATA_TYPE isn't REF) SYSTEM_COLUMNS_SCOPE_SCHEMA=schema of table that is the scope of a reference attribute (NULL if the DATA_TYPE isn't REF) SYSTEM_COLUMNS_SCOPE_TABLE=table name that this the scope of a reference attribute (NULL if the DATA_TYPE isn't REF) SYSTEM_COLUMNS_SOURCE_DATA_TYPE=source type of a distinct type or user-generated Ref type, SQL type from DITypes (NULL if DATA_TYPE isn't DISTINCT or user-generated REF) SYSTEM_COLUMNS_TYPE_SUB=the HSQLDB-specific type subidentifier (1:default, 2:identity, 4:ignorecase) # SYSTEM_CROSSREFERENCE SYSTEM_CROSSREFERENCE_PKTABLE_CAT=the catalog in which the referenced table is defined SYSTEM_CROSSREFERENCE_PKTABLE_SCHEM=the schema in which the referenced table is defined SYSTEM_CROSSREFERENCE_PKTABLE_NAME=simple name of the referenced table SYSTEM_CROSSREFERENCE_PKCOLUMN_NAME=simple name of the referenced column SYSTEM_CROSSREFERENCE_FKTABLE_CAT=the catalog in which the referencing table is defined SYSTEM_CROSSREFERENCE_FKTABLE_SCHEM=the schema in which the referencing table is defined SYSTEM_CROSSREFERENCE_FKTABLE_NAME=the simple name of the referencing table SYSTEM_CROSSREFERENCE_FKCOLUMN_NAME=the simple name of the referencing column SYSTEM_CROSSREFERENCE_KEY_SEQ=sequence number within foreign key definition SYSTEM_CROSSREFERENCE_UPDATE_RULE=how does an update of referenced row columns affect referencing rows?: e.g. { Cascade | Set Null | Set Default | Restrict (No Action) } SYSTEM_CROSSREFERENCE_DELETE_RULE=how does deletion of a referenced row affect referencing rows?: e.g. { Cascade | Set Null | Set Default | Restrict (No Action) } SYSTEM_CROSSREFERENCE_FK_NAME=the name of the foreign key SYSTEM_CROSSREFERENCE_PK_NAME=the name of the referenced column set (usually the name of a primary key constraint, but may be a unique constraint or even the name of a non-unique index previous to 1.7.0) SYSTEM_CROSSREFERENCE_DEFERRABILITY=foreign key constraints deferred until commit?: e.g. { initially deferred | initially immediate | not deferrable } # SYSTEM_INDEXINFO SYSTEM_INDEXINFO_TABLE_CAT=catalog in which the table using the index is defined SYSTEM_INDEXINFO_TABLE_SCHEM=schema in which the table using the index is defined SYSTEM_INDEXINFO_TABLE_NAME=simple name of the table using the index SYSTEM_INDEXINFO_NON_UNIQUE=can index values be non-unique? SYSTEM_INDEXINFO_INDEX_QUALIFIER=catalog in which the index is defined SYSTEM_INDEXINFO_INDEX_NAME=simple name of the index SYSTEM_INDEXINFO_TYPE=index type: e.g. { Clustered | Hashed | Other } SYSTEM_INDEXINFO_ORDINAL_POSITION=column sequence number within index SYSTEM_INDEXINFO_COLUMN_NAME=simple column name SYSTEM_INDEXINFO_ASC_OR_DESC=column sort sequence: e.g. { "A" (Ascending) | "D" (Descending) } SYSTEM_INDEXINFO_CARDINALITY=index cardinality: # of unique values in the index (currently unused) SYSTEM_INDEXINFO_PAGES=index page use (currently unused) SYSTEM_INDEXINFO_FILTER_CONDITION=filter condition, if any (currently unused) # SYSTEM_LOBS SYSTEM_LOBS_NAME=Java classfile encoded absolute name of a resource ( /dir1/.../dirn/resourcename.ext) SYSTEM_LOBS_CONTENT=binary content of Java class file or resource SYSTEM_LOBS_CONTENT_TYPE=content type (possibly a mime-type value) SYSTEM_LOBS_MD5=MD5 hash of content (efficiently detects and avoids attempts to reload identical content) SYSTEM_LOBS_CREATED=time at which content was initially loaded SYSTEM_LOBS_MODIFIED=time at which content was last modified # SYSTEM_PRIMARYKEYS SYSTEM_PRIMARYKEYS_TABLE_CAT=catalog in which table containing primary key is defined SYSTEM_PRIMARYKEYS_TABLE_SCHEM=schema in which table containing primary key is defined SYSTEM_PRIMARYKEYS_TABLE_NAME=simple name of table containing primary key SYSTEM_PRIMARYKEYS_COLUMN_NAME=simple name of column participating in primary key SYSTEM_PRIMARYKEYS_KEY_SEQ=sequence number of column within primary key SYSTEM_PRIMARYKEYS_PK_NAME=primary key name # SYSTEM_PROCEDURECOLUMNS SYSTEM_PROCEDURECOLUMNS_PROCEDURE_CAT=catalog in which procedure is defined SYSTEM_PROCEDURECOLUMNS_PROCEDURE_SCHEM=schema in which procedure is defined SYSTEM_PROCEDURECOLUMNS_PROCEDURE_NAME=procedure identifier SYSTEM_PROCEDURECOLUMNS_COLUMN_NAME=( result column | call parameter | return value ) name SYSTEM_PROCEDURECOLUMNS_COLUMN_TYPE=kind of column/parameter: { Unknown | IN | INOUT | OUT | RETURN | RESULT } SYSTEM_PROCEDURECOLUMNS_DATA_TYPE=SQL data type. This may be a java.sql.Types data type, a SQL 200n data type or an HSQLDB-specific data type. For datetime or interval data types, this column returns the concise data type (such as SQL_­TYPE_­TIME or SQL_­INTERVAL_­YEAR_­TO_­MONTH). SYSTEM_PROCEDURECOLUMNS_TYPE_NAME=the HSQLDB-specific data type name; for data types supported as table column types, this is the canonical name used in CREATE TABLE and ALTER TABLE statements. SYSTEM_PROCEDURECOLUMNS_PRECISION=precision for number types; max length for sized types; fixed or max length for others if known, or NULL if not applicable SYSTEM_PROCEDURECOLUMNS_LENGTH=The maximum length in bytes of data, if definitely known, that would be transferred to a buffer on a fetch operation. For numeric data, this size may be different than the size of the data stored on the data source. This value is the same as the COLUMN_SIZE column for binary data. This value is the twice the COLUMN_SIZE column for character data. If the actual value is unknown or is larger than can be represented in an INTEGER column value, this is NULL. SYSTEM_PROCEDURECOLUMNS_SCALE=scale (# of fractional digits) for number types SYSTEM_PROCEDURECOLUMNS_RADIX=Radix of reported numeric precision (i.e. base of number types) SYSTEM_PROCEDURECOLUMNS_NULLABLE=can column contain NULL: { No Nulls | Nullable | Unknown }? SYSTEM_PROCEDURECOLUMNS_REMARKS=comment describing parameter or result column SYSTEM_PROCEDURECOLUMNS_SPECIFIC_NAME=typically, (but not limited to) the fully qualified name and signature of the Java method providing the SQL-invoked routine's entry point SYSTEM_PROCEDURECOLUMNS_SEQ=provides the ability to deliver rows in JDBC DataseMetaData sort contrct order # SYSTEM_PROCEDURES SYSTEM_PROCEDURES_PROCEDURE_CAT=catalog in which procedure is defined SYSTEM_PROCEDURES_PROCEDURE_SCHEM=schema in which procedure is defined SYSTEM_PROCEDURES_PROCEDURE_NAME=procedure identifier SYSTEM_PROCEDURES_REMARKS=explanatory comment on the procedure SYSTEM_PROCEDURES_PROCEDURE_TYPE=kind of procedure: { Unknown | No Result | Returns Result } SYSTEM_PROCEDURES_NUM_INPUT_PARAMS=number of procedure input parameters SYSTEM_PROCEDURES_NUM_OUTPUT_PARAMS=number of procedure output parameters SYSTEM_PROCEDURES_NUM_RESULT_SETS=number of result sets returned by procedure (if any) SYSTEM_PROCEDURES_ORIGIN=how was named procedure introduced to system?: e.g. { BUILTIN | USER CLASS GRANT | ALIAS | TRIGGER | MODULE | ...} SYSTEM_PROCEDURES_SPECIFIC_NAME=typically, (but not limited to) the fully qualified name and signature of the Java method providing the SQL-invoked routine's entry point # SYSTEM_PROPERTIES SYSTEM_PROPERTIES_PROPERTY_SCOPE=the scope of the property, e.g. ( TEMPORARY | TRANSACTION | SESSION | ...} SYSTEM_PROPERTIES_PROPERTY_NAMESPACE=the namespace in which the property is applicable, e.g. ( database.properties | org.hsqldb.Database | java.sql.DatabaseMetaData | ...) SYSTEM_PROPERTIES_PROPERTY_NAME=the name of the property SYSTEM_PROPERTIES_PROPERTY_VALUE=the current value of the property SYSTEM_PROPERTIES_PROPERTY_CLASS=the type of the value, e.g. ( int | boolean | java.lang.String | ...) # SYSTEM_SCHEMAS SYSTEM_SCHEMAS_TABLE_SCHEM=schema name SYSTEM_SCHEMAS_TABLE_CATALOG=catalog in which schema is defined SYSTEM_SCHEMAS_IS_DEFAULT=whether the described schema is the default schema # SYSTEM_SESSIONS SYSTEM_SESSIONS_SESSION_ID=session identifier SYSTEM_SESSIONS_CONNECTED=time at which session connected to database SYSTEM_SESSIONS_USER_NAME=name of session user, as known to the database SYSTEM_SESSIONS_IS_ADMIN=is session user an admin user? SYSTEM_SESSIONS_AUTOCOMMIT=is session in autocommit mode? SYSTEM_SESSIONS_READONLY=is session in read-only mode? SYSTEM_SESSIONS_MAXROWS=what is the session's MAXROWS setting? SYSTEM_SESSIONS_LAST_IDENTITY=what is the last identity value used by this session? SYSTEM_SESSIONS_TRANSACTION_SIZE=how many undo items are there in this session's transaction buffer? #since 1.8.0 SYSTEM_SESSIONS_SCHEMA=this session's current default schema # SYSTEM_SESSIONINFO SYSTEM_SESSIONINFO_KEY=KEY: { SESSION_ID | AUTOCOMMIT | USER | CONNECTION_READONLY | DATABASE_READONLY | MAXROWS | DATABASE | IDENTITY ... } SYSTEM_SESSIONINFO_VALUE=VALUE: the value corresponding to the indicated key (see JavaDocs) # SYSTEM_TABLEPRIVILEGES SYSTEM_TABLEPRIVILEGES_TABLE_CAT=table catalog SYSTEM_TABLEPRIVILEGES_TABLE_SCHEM=table schema SYSTEM_TABLEPRIVILEGES_TABLE_NAME=table name SYSTEM_TABLEPRIVILEGES_GRANTOR=grantor of access SYSTEM_TABLEPRIVILEGES_GRANTEE=grantee of access SYSTEM_TABLEPRIVILEGES_PRIVILEGE=name of access: e.g. one of { ALL | SELECT | INSERT | UPDATE | DELETE } SYSTEM_TABLEPRIVILEGES_IS_GRANTABLE=for grantee: YES - may grant to others, NO - may not grant to others, NULL - unknown # SYSTEM_TABLES SYSTEM_TABLES_TABLE_CAT=table catalog SYSTEM_TABLES_TABLE_SCHEM=table schema SYSTEM_TABLES_TABLE_NAME=table name SYSTEM_TABLES_TABLE_TYPE=table type: e.g. one of { TABLE | VIEW | SYSTEM TABLE | GLOBAL TEMPORARY ... } SYSTEM_TABLES_REMARKS=explanatory comment on the table SYSTEM_TABLES_TYPE_CAT=table type catalog SYSTEM_TABLES_TYPE_SCHEM=table type schema SYSTEM_TABLES_TYPE_NAME=table type name SYSTEM_TABLES_SELF_REFERENCING_COL_NAME=name of the designated "identifier" column of typed table (null if not typed) SYSTEM_TABLES_REF_GENERATION=how are values in SELF_REFERENCING_COL_NAME created?: e.g. one of { "SYSTEM" | "USER" | "DERIVED" | NULL } SYSTEM_TABLES_HSQLDB_TYPE=the HSQLDB-specific type of the table, e.g. ( MEMORY | CACHED | TEXT | ...) SYSTEM_TABLES_READ_ONLY=TRUE if the table is read-only, else FALSE # SYSTEM_TABLETYPES SYSTEM_TABLETYPES_TABLE_TYPE=table type name # SYSTEM_TEXTTABLES SYSTEM_TEXTTABLES_TABLE_CAT=table catalog SYSTEM_TEXTTABLES_TABLE_SCHEM=table schema SYSTEM_TEXTTABLES_TABLE_NAME=table name SYSTEM_TEXTTABLES_DATA_SOURCE_DEFINTION=the "spec" proption of the table's SET TABLE ... SOURCE DDL declaration SYSTEM_TEXTTABLES_FILE_PATH=path to table's text file data source SYSTEM_TEXTTABLES_FILE_ENCODING=encoding of table's text file data source SYSTEM_TEXTTABLES_FIELD_SEPARATOR=the default field separator SYSTEM_TEXTTABLES_VARCHAR_SEPARATOR=varchar field separator SYSTEM_TEXTTABLES_LONGVARCHAR_SEPARATOR=longvarchar field separator SYSTEM_TEXTTABLES_IS_IGNORE_FIRST=ignores first line of file? # added to reflect 1.7.2 RC1 SYSTEM_TEXTTABLES_IS_QUOTED=fields are quoted if necessary? #-- SYSTEM_TEXTTABLES_IS_ALL_QUOTED=every field is quoted? SYSTEM_TEXTTABLES_IS_DESC=read rows starting at end of file? # SYSTEM_TYPEINFO SYSTEM_TYPEINFO_TYPE_NAME=the HSQLDB-specific data type name; this is the canonical name used in CREATE TABLE and ALTER TABLE statements. SYSTEM_TYPEINFO_DATA_TYPE=SQL data type. This may be a java.sql.Types data type, a SQL 200n data type or an HSQLDB-specific data type. For datetime or interval data types, this column returns the concise data type (such as SQL_­TYPE_­TIME or SQL_­INTERVAL_­YEAR_­TO_­MONTH). SYSTEM_TYPEINFO_PRECISION=The maximum column size for this data type. For numeric data, this is the maximum precision. For string data, this is the length in characters. For datetime data types, this is the length in characters of the string representation (assuming the maximum allowed precision of the fractional seconds component). NULL for data types where column size is not applicable. For interval data types, this is the number of characters in the character representation of the interval literal (as defined by the interval leading precision). SYSTEM_TYPEINFO_LITERAL_PREFIX=the character or characters used to prefix a literal of this type; for example, a single quotation mark (') for character data types; NULL for data types where a literal prefix is not applicable SYSTEM_TYPEINFO_LITERAL_SUFFIX=the character or characters used to terminate a literal of this type; for example, a single quotation mark (') for character data types; NULL for data types where a literal suffix is not applicable SYSTEM_TYPEINFO_CREATE_PARAMS=A list of keywords, separated by commas, corresponding to each parameter that may be specified in parentheses when issuing DDL relative to the data type. The keywords in the list, in the language of the current Locale, may be any of the following: length, precision, scale. They appear in the order that the syntax requires that they be used. For example, CREATE_PARAMS for DECIMAL with an English locale would be "precision,scale"; CREATE_PARAMS for VARCHAR would be "length". The value is NULL if there are no parameters for the data type definition; for example, INTEGER. SYSTEM_TYPEINFO_NULLABLE=NULL values allowed for this type?: { No Nulls | Nullable | Unknown } SYSTEM_TYPEINFO_CASE_SENSITIVE=TRUE if the type is case-sensitive in collations and comparisons; FALSE otherwise SYSTEM_TYPEINFO_SEARCHABLE=use of WHERE?: { None | Char (Only WHERE .. LIKE) | Basic (Except WHERE .. LIKE) | Searchable (All forms of WHERE...) } SYSTEM_TYPEINFO_UNSIGNED_ATTRIBUTE=TRUE if the data type is unsigned; NULL the attribute is not applicable to the data type or the data type is not numeric. SYSTEM_TYPEINFO_FIXED_PREC_SCALE=TRUE if the data type has predefined fixed precision and scale , like a money data type. NULL for non-numeric types. SYSTEM_TYPEINFO_AUTO_INCREMENT=NULL if the attribute is not applicable to the data type or the data type is not numeric. If TRUE, this indicates that when an insert is made, a unique value is inserted into the column at insert time. The increment is not defined. An application should not assume that auto-increment values start at any particular point or increment by any particular value. SYSTEM_TYPEINFO_LOCAL_TYPE_NAME=Localized version of the name of the data type; NULL if a localized name is not supported. This name is intended for display only, such as in dialog boxes SYSTEM_TYPEINFO_MINIMUM_SCALE=minimum scale supported SYSTEM_TYPEINFO_MAXIMUM_SCALE=maximum scale supported SYSTEM_TYPEINFO_SQL_DATA_TYPE=The value of the SQL data type as it would appear in the SQL CLI SQL_DESC_TYPE field of the SQLDA. SYSTEM_TYPEINFO_SQL_DATETIME_SUB=When the value of SQL_DATA_TYPE is SQL_DATETIME or SQL_INTERVAL, this column contains the datetime/interval subcode. For data types other than datetime and interval, this column is NULL. SYSTEM_TYPEINFO_NUM_PREC_RADIX=For numeric types, this column contains the value 10 to indicate that COLUMN_SIZE specifies a number of decimal digits. Otherwise, this column is NULL. SYSTEM_TYPEINFO_TYPE_SUB=the variant tag for this variation of the data type. 1 = standard, 2 = identity, 4 = ignore case # SYSTEM_UDTS SYSTEM_UDTS_TYPE_CAT=type's catalog SYSTEM_UDTS_TYPE_SCHEM=type's schema SYSTEM_UDTS_TYPE_NAME=type's DBMS name SYSTEM_UDTS_CLASS_NAME=type's Java class name SYSTEM_UDTS_DATA_TYPE=type value defined in DITypes, from one of { "JAVA_OBJECT" | "STRUCT" | "DISTINCT" } SYSTEM_UDTS_BASE_TYPE=type code of the source type of a DISTINCT type or the type that implements the user-generated reference type of the SELF_REFERENCING_COLUMN of a structured type as defined in DITypes (null if DATA_TYPE is not DISTINCT or not STRUCT with REFERENCE_GENERATION = USER_DEFINED) SYSTEM_UDTS_REMARKS=explanatory comment on the user defined type # SYSTEM_USERS SYSTEM_USERS_USER=user name SYSTEM_USERS_ADMIN=has the administrative privilege? SYSTEM_USERS_INITIAL_SCHEMA=initial schema for user # SYSTEM_VERSIONCOLUMNS SYSTEM_VERSIONCOLUMNS_TABLE_CAT=table catalog SYSTEM_VERSIONCOLUMNS_TABLE_SCHEM=table schema SYSTEM_VERSIONCOLUMNS_TABLE_NAME=simple table name SYSTEM_VERSIONCOLUMNS_SCOPE=not used SYSTEM_VERSIONCOLUMNS_COLUMN_NAME=column name SYSTEM_VERSIONCOLUMNS_DATA_TYPE=SQL data type from DITypes SYSTEM_VERSIONCOLUMNS_TYPE_NAME=Data source dependent type name SYSTEM_VERSIONCOLUMNS_COLUMN_SIZE=precision SYSTEM_VERSIONCOLUMNS_BUFFER_LENGTH=length of column value in bytes SYSTEM_VERSIONCOLUMNS_DECIMAL_DIGITS=scale SYSTEM_VERSIONCOLUMNS_PSEUDO_COLUMN=is this a pseudo column like an Oracle ROWID: { Unknown | Not Pseudo | Pseudo }? # SYSTEM_VIEWS SYSTEM_VIEWS_TABLE_CATALOG=name of catalog in which view is defined SYSTEM_VIEWS_TABLE_SCHEMA=unqualified name of schema in which view is defined SYSTEM_VIEWS_TABLE_NAME=simple name of view SYSTEM_VIEWS_VIEW_DEFINITION=the character representation of the query expression contained in the corresponding view descriptor. SYSTEM_VIEWS_CHECK_OPTION={"CASCADED" | "LOCAL" | "NONE"} SYSTEM_VIEWS_IS_UPDATABLE={"YES" | "NO"} SYSTEM_VIEWS_VALID={TRUE | FALSE} # Since 1.7.2 RC1 # SYSTEM_CHECK_COLUMN_USAGE SYSTEM_CHECK_COLUMN_USAGE_CONSTRAINT_CATALOG=constraint catalog name SYSTEM_CHECK_COLUMN_USAGE_CONSTRAINT_SCHEMA=constraint schema name SYSTEM_CHECK_COLUMN_USAGE_CONSTRAINT_NAME=constraint identifier SYSTEM_CHECK_COLUMN_USAGE_TABLE_CATALOG=table catalog name SYSTEM_CHECK_COLUMN_USAGE_TABLE_SCHEMA= table schema name SYSTEM_CHECK_COLUMN_USAGE_TABLE_NAME=table name SYSTEM_CHECK_COLUMN_USAGE_COLUMN_NAME=name of column referenced explicitly or implicitly as contained in the of the constraint being described. # SYSTEM_CHECK_CONSTRAINTS SYSTEM_CHECK_CONSTRAINTS_CONSTRAINT_CATALOG=constraint catalog name SYSTEM_CHECK_CONSTRAINTS_CONSTRAINT_SCHEMA=constraint schema name SYSTEM_CHECK_CONSTRAINTS_CONSTRAINT_NAME=constraint identifier SYSTEM_CHECK_CONSTRAINTS_CHECK_CLAUSE=the character representation of the contained in the , , or that defined the check constraint being described, or NULL if it cannot be described without truncation # SYSTEM_CHECK_ROUTINE_USAGE SYSTEM_CHECK_ROUTINE_USAGE_CONSTRAINT_CATALOG=constraint catalog name SYSTEM_CHECK_ROUTINE_USAGE_CONSTRAINT_SCHEMA=constraint schema name SYSTEM_CHECK_ROUTINE_USAGE_CONSTRAINT_NAME=constraint identifier SYSTEM_CHECK_ROUTINE_USAGE_SPECIFIC_CATALOG=catalog name of specific name of routine SYSTEM_CHECK_ROUTINE_USAGE_SPECIFIC_SCHEMA=schema name of specific name of routine SYSTEM_CHECK_ROUTINE_USAGE_SPECIFIC_NAME=specific name of SQL-invoked routine identified as the subject routine of either a , a , a , or a contained in the or in the contained in either a or a # CONSTRAINT_TABLE_USAGE CONSTRAINT_TABLE_USAGE_TABLE_CATALOG=table catalog name CONSTRAINT_TABLE_USAGE_TABLE_SCHEMA=table schema name CONSTRAINT_TABLE_USAGE_TABLE_NAME=name of a table identified by a
                  simply contained in a
                  contained in the lt;search condition> of the constraint being described. CONSTRAINT_TABLE_USAGE_CONSTRAINT_CATALOG=constraint catalog name CONSTRAINT_TABLE_USAGE_CONSTRAINT_SCHEMA=constraint schema name CONSTRAINT_TABLE_USAGE_CONSTRAINT_NAME=constraint identifier # SYSTEM_SEQUENCES SYSTEM_SEQUENCES_SEQUENCE_CATALOG=sequence catalog name SYSTEM_SEQUENCES_SEQUENCE_SCHEMA=sequence schema name SYSTEM_SEQUENCES_SEQUENCE_NAME=sequence identifier SYSTEM_SEQUENCES_DTD_IDENTIFIER=implementation dependent data type descriptor identifier SYSTEM_SEQUENCES_MAXIMUM_VALUE=sequence maximum value SYSTEM_SEQUENCES_MINIMUM_VALUE=sequence minimum value SYSTEM_SEQUENCES_INCREMENT=sequence increment SYSTEM_SEQUENCES_CYCLE_OPTION=sequence cycle option ('YES' | 'NO') SYSTEM_SEQUENCES_START_WITH=sequence start with value # SYSTEM_TABLE_CONSTRAINTS SYSTEM_TABLE_CONSTRAINTS_CONSTRAINT_CATALOG=constraint catalog name SYSTEM_TABLE_CONSTRAINTS_CONSTRAINT_SCHEMA=constraint schema name SYSTEM_TABLE_CONSTRAINTS_CONSTRAINT_NAME=constraint identifier SYSTEM_TABLE_CONSTRAINTS_CONSTRAINT_TYPE=('UNIQUE' | 'PRIMARY KEY' | 'FOREIGN KEY' | 'CHECK') SYSTEM_TABLE_CONSTRAINTS_TABLE_CATALOG=table catalog name SYSTEM_TABLE_CONSTRAINTS_TABLE_SCHEMA=table schema name SYSTEM_TABLE_CONSTRAINTS_TABLE_NAME=table identifier SYSTEM_TABLE_CONSTRAINTS_IS_DEFERRABLE=('YES' | 'NO') SYSTEM_TABLE_CONSTRAINTS_INITIALLY_DEFERRED=('YES' | 'NO') # SYSTEM_USAGE_PRIVILEGES SYSTEM_USAGE_PRIVILEGES_GRANTOR= of the user or role who granted usage privileges on the object SYSTEM_USAGE_PRIVILEGES_GRANTEE= of some user or role, or ?PUBLIC? to indicate all users, to whom the usage privilege being described is granted SYSTEM_USAGE_PRIVILEGES_OBJECT_CATALOG=object catalog name SYSTEM_USAGE_PRIVILEGES_OBJECT_SCHEMA=object catalog schema SYSTEM_USAGE_PRIVILEGES_OBJECT_NAME=identifier of the object to which the privilege applies SYSTEM_USAGE_PRIVILEGES_OBJECT_TYPE=(DOMAIN' | 'CHARACTER SET' | 'COLLATION' | 'TRANSLATION' | 'SEQUENCE') SYSTEM_USAGE_PRIVILEGES_IS_GRANTABLE=('YES' | 'NO') # SYSTEM_VIEW_COLUMN_USAGE SYSTEM_VIEW_COLUMN_USAGE_VIEW_CATALOG=view catalog name SYSTEM_VIEW_COLUMN_USAGE_VIEW_SCHEMA=view schema name SYSTEM_VIEW_COLUMN_USAGE_VIEW_NAME=view identifier SYSTEM_VIEW_COLUMN_USAGE_TABLE_CATALOG=table catalog name SYSTEM_VIEW_COLUMN_USAGE_TABLE_SCHEMA=table schema name SYSTEM_VIEW_COLUMN_USAGE_TABLE_NAME=table identifier SYSTEM_VIEW_COLUMN_USAGE_COLUMN_NAME=column of table that is explicitly or implicitly referenced in the of the view being described. # SYSTEM_VIEW_ROUTINE_USAGE SYSTEM_VIEW_ROUTINE_USAGE_TABLE_CATALOG=view catalog name SYSTEM_VIEW_ROUTINE_USAGE_TABLE_SCHEMA=view schema name SYSTEM_VIEW_ROUTINE_USAGE_TABLE_NAME=view identifier SYSTEM_VIEW_ROUTINE_USAGE_SPECIFIC_CATALOG=catalog name of specific name of routine SYSTEM_VIEW_ROUTINE_USAGE_SPECIFIC_SCHEMA=schema name of specific name of routine SYSTEM_VIEW_ROUTINE_USAGE_SPECIFIC_NAME=specific name of SQL-invoked subject routine of either a , a , a , or a contained in the SYSTEM_VIEW_TABLE_USAGE_VIEW_CATALOG=view catalog name SYSTEM_VIEW_TABLE_USAGE_VIEW_SCHEMA=view schema name SYSTEM_VIEW_TABLE_USAGE_VIEW_NAME=view identifier SYSTEM_VIEW_TABLE_USAGE_TABLE_CATALOG=table catalog name SYSTEM_VIEW_TABLE_USAGE_TABLE_SCHEMA=table schema name SYSTEM_VIEW_TABLE_USAGE_TABLE_NAME=table identified by a
                  simply contained in a
                  that is contained in the of the view being described. # Since 1.8.0 # SYSTEM_AUTHORIZATIONS SYSTEM_AUTHORIZATIONS_AUTHORIZATION_NAME=a or SYSTEM_AUTHORIZATIONS_AUTHORIZATION_TYPE=('USER' | 'ROLE') whether the AUTHORIZATION_NAME is a known or is a defined by a . # SYSTEM_COLLATIONS SYSTEM_COLLATIONS_COLLATION_CATALOG=catalog name of the collation being described SYSTEM_COLLATIONS_COLLATION_SCHEMA=unqualified schema name of the collation being described SYSTEM_COLLATIONS_COLLATION_NAME=qualified identifier of the collation being described SYSTEM_COLLATIONS_PAD_ATTRIBUTE=('NO PAD' | 'PAD SPACE') whether the collation being described has the NO PAD or PAD SPACE characteristic SYSTEM_COLLATIONS_COLLATION_TYPE=NULL (deprecated) SYSTEM_COLLATIONS_COLLATION_DEFINITION=NULL (deprecated) SYSTEM_COLLATIONS_COLLATION_DICTIONARY=NULL (deprecated) SYSTEM_COLLATIONS_CHARACTER_REPERTOIRE_NAME=the name of the charater repertoire to which the collation being described is applicable. # SYSTEM_ROLE_AUTHORIZATION_DESCRIPTORS SYSTEM_ROLE_AUTHORIZATION_DESCRIPTORS_ROLE_NAME=the of some by the or the of a . SYSTEM_ROLE_AUTHORIZATION_DESCRIPTORS_GRANTEE=an , possibly PUBLIC, or specified as a contained in a , or the of the current SQLsession when the is executed. SYSTEM_ROLE_AUTHORIZATION_DESCRIPTORS_GRANTOR=the of the user or role who granted the role identified by ROLE_NAME to the user or role identified by the value of GRANTEE. # SYSTEM_SCHEMATA SYSTEM_SCHEMATA_CATALOG_NAME=the name of the catalog of the described schema SYSTEM_SCHEMATA_SCHEMA_NAME=the unqualified schema name of the described schema SYSTEM_SCHEMATA_SCHEMA_OWNER=the authorization identifier that owns the schema. SYSTEM_SCHEMATA_DEFAULT_CHARACTER_SET_CATALOG=the catalog name of the default character set for columns and domains in the schema. SYSTEM_SCHEMATA_DEFAULT_CHARACTER_SET_SCHEMA=the unqualified schema name of the default character set for columns and domains in the schema. SYSTEM_SCHEMATA_DEFAULT_CHARACTER_SET_NAME=the qualified identifier of the default character set for columns and domains in the schemata. SYSTEM_SCHEMATA_SQL_PATH=the character representation of the schema's , or null if it cannot be represented without truncation hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/resources/org_hsqldb_DatabaseClassLoader.properties0000644000175000017500000000432012007547416031120 0ustar renerenejarLoad(java.sql.Connection,java.lang.String)=Loads the resources stored in the specified archive into the database specified by the conn argument.

                  Only entries that pass an acceptance test are actually stored. For instance, entries whose content is Java bytecode are accepted only if the classes they define are not in a java.* package. Similarly, all entries of the jar archive special form "META-INF/*" are rejected. Also, for each loading entry that has a resource with the same name already loaded, the MD5 hash values of the contents are compared; if the hash values are equal, then loading entry is ignored. jarLoad(java.sql.Connection,java.lang.String)@0=A Result object describing the result of loading the archive jarLoad(java.sql.Connection,java.lang.String)@1=conn - A Connection object identifying the target database jarLoad(java.sql.Connection,java.lang.String)@2=name - the name of the archive; this may be either a jar protocol URL string or a bare file path jarUnload(java.sql.Connection,java.lang.String)=Removes the resources in the archive identified by the from name argument from the database specified by the conn argument. jarUnload(java.sql.Connection,java.lang.String)@0=A Result object describing the result of unloading the archive jarUnload(java.sql.Connection,java.lang.String)@1=conn - A Connection object identifying the target database jarUnload(java.sql.Connection,java.lang.String)@2=name - the name of the archive; this may be either a jar protocol URL string or a bare file path callMain(java.sql.Connection,java.lang.String,java.lang.String)=Invokes the special public static void main(String[] args) method of the Java Class indentified by the className argument. callMain(java.sql.Connection,java.lang.String,java.lang.String)@1=conn - A Connection object identifying the execution context in which to invoke the method callMain(java.sql.Connection,java.lang.String,java.lang.String)@2=className - the fully qualified name of a Java Class callMain(java.sql.Connection,java.lang.String,java.lang.String)@3=args - a comma-separated list of argument strings hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/resources/data-type-create-parameters.properties0000644000175000017500000000011312007547416030361 0ustar renerene# default data-type-create-parameters SIZED=length DECIMAL=precision,scale hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/resources/table-remarks.properties0000644000175000017500000001065112007547416025630 0ustar renerene#table remarks SYSTEM_ALLTYPEINFO=a description of all non user-defined data types known to this database and the level of support for them in various capacities SYSTEM_BESTROWIDENTIFIER=for each accessible table defined within this database, the optimal set of visible columns that uniquely identifies a row SYSTEM_CACHEINFO=the current state of the system row caching mechanism SYSTEM_COLUMNS=the visible columns of each accessible table defined within this database SYSTEM_COLUMN_SEQUENCE_USAGE=the name of the sequences used by autogenerated columns SYSTEM_COMMENTS=comments on tables, views and columns, defined by users or system SYSTEM_CONNECTION_PROPERTIES=properties defined for the current connection SYSTEM_CROSSREFERENCE=a description of how the accessible tables defined within this database import visible columns to enforce referential integrity SYSTEM_INDEXINFO=information about the indicies of each accessible table defined within this database SYSTEM_PRIMARYKEYS=the visible columns of the primary key of each accessible table defined within this database SYSTEM_PROCEDURECOLUMNS=a description of the return type, parameters and result columns of each accessible callable procedure, SQL function, trigger body and UDT method defined within this database SYSTEM_PROCEDURES=the procedures, SQL functions, trigger body routines and UDT methods defined within the database SYSTEM_PROPERTIES=the static and dynamic system properties and operating parameters of this database SYSTEM_SCHEMAS=the accessible schemas defined within this database SYSTEM_SESSIONINFO=information about the current database session SYSTEM_SESSIONS=the visible sessions open in this database SYSTEM_SEQUENCES=the visible sequences in this database SYSTEM_TABLES=the accessible tables defined within this database SYSTEM_TABLETYPES=the types of tables that can be created/found within this database SYSTEM_TEXTTABLES=the data source descriptors of the accessible TEXT TABLE objects defined within this database SYSTEM_TYPEINFO=a description of predefined table column data types known to this database SYSTEM_UDTS=the user-defined types that are available within this database SYSTEM_USERS=users defined within this database SYSTEM_VERSIONCOLUMNS=the visible columns of the accessible tables that are automatically updated when any value in a row is updated AUTHORIZATIONS=one row for each user and one row for each role COLLATIONS=one row for each character collation descriptor. COLUMN_PRIVILEGES=the visible user level access permissions of each visible column of each accessible table defined within this database CONSTRAINT_COLUMN_USAGE=one row for each column identified by a contained in the of a check constraint, domain constraint, or assertion. CHECK_CONSTRAINT_ROUTINE_USAGE=one row for each SQL-invoked routine identified as the subject routine of either a , a , a , or a contained in an , a , or a

                  . CHECK_CONSTRAINTS=one row for each domain constraint, table check constraint, and assertion. CONSTRAINT_TABLE_USAGE=one row for each table identified by a
                  simply contained in a
                  contained in the of a check constraint, domain constraint, or assertion. INFORMATION_SCHEMA_CATALOG_NAME=the catalog defined within this database ROLE_AUTHORIZATION_DESCRIPTORS=one row for each role granted directly to a grantee SCHEMATA=one row for each schema. SEQUENCES=one row for each external sequence generator TABLE_CONSTRAINTS=one row for each table constraint associated with a table TABLE_PRIVILEGES=the visible user level access permissions for each accessible table defined within this database USAGE_PRIVILEGES=one row for each usage privilege descriptor. VIEW_COLUMN_USAGE=one row for each column of a table that is explicitly or implicitly referenced in the of the view being described. VIEW_ROUTINE_USAGE=one row for each SQL-invoked routine identified as the subject routine of either a , a , a , or a contained in a VIEW_TABLE_USAGE=one row for each table identified by a
                  simply contained in a
                  that is contained in the of a view VIEWS=the view descriptors of the accessible views defined within this database hsqldb2.2-2.2.9.orig/hsqldb/src/org/hsqldb/resources/information-schema.sql0000644000175000017500000012200712007547416025264 0ustar renerene-- author Fred Toussi (fredt@users dot sourceforge.net) version 2.2.9 /*system_procedures*/ SELECT ROUTINE_CATALOG AS PROCEDURE_CAT, ROUTINE_SCHEMA AS PROCEDURE_SCHEM, ROUTINE_NAME AS PROCEDURE_NAME, 0, 0, 0, CAST( NULL AS VARCHAR(256)) AS REMARKS, CASE WHEN ROUTINE_TYPE = 'PROCEDURE' THEN 1 ELSE 2 END CASE AS PROCEDURE_TYPE, SPECIFIC_NAME FROM INFORMATION_SCHEMA.ROUTINES /*data_type_privileges*/ SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, 'TABLE', DTD_IDENTIFIER FROM COLUMNS UNION SELECT DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME, 'DOMAIN', DTD_IDENTIFIER FROM DOMAINS UNION SELECT SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME, 'ROUTINE', DTD_IDENTIFIER FROM PARAMETERS UNION SELECT SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME, 'ROUTINE', DTD_IDENTIFIER FROM ROUTINES WHERE DTD_IDENTIFIER IS NOT NULL UNION SELECT USER_DEFINED_TYPE_CATALOG, USER_DEFINED_TYPE_SCHEMA, USER_DEFINED_TYPE_NAME, 'USER-DEFINED TYPE', SOURCE_DTD_IDENTIFIER FROM USER_DEFINED_TYPES WHERE SOURCE_DTD_IDENTIFIER IS NOT NULL UNION SELECT USER_DEFINED_TYPE_CATALOG, USER_DEFINED_TYPE_SCHEMA, USER_DEFINED_TYPE_NAME, 'USER-DEFINED TYPE', REF_DTD_IDENTIFIER FROM USER_DEFINED_TYPES WHERE REF_DTD_IDENTIFIER IS NOT NULL; /*sql_features*/ VALUES ('B011', 'Embedded Ada', '', '', 'NO', CAST(NULL AS CHARACTER), ''), ('B012', 'Embedded C', '', '', 'NO', NULL, ''), ('B013', 'Embedded COBOL', '', '', 'NO', NULL, ''), ('B014', 'Embedded Fortran', '', '', 'NO', NULL, ''), ('B015', 'Embedded MUMPS', '', '', 'NO', NULL, ''), ('B016', 'Embedded Pascal', '', '', 'NO', NULL, ''), ('B017', 'Embedded PL/I', '', '', 'NO', NULL, ''), ('B021', 'Direct SQL', '', '', 'YES', NULL, ''), ('B031', 'Basic dynamic SQL', '', '', 'NO', NULL, ''), ('B032', 'Extended dynamic SQL', '', '', 'NO', NULL, ''), ('B032', 'Extended dynamic SQL', '01', 'describe input statement', 'NO', NULL, ''), ('B033', 'Untyped SQL-invoked function arguments', '', '', 'NO', NULL, ''), ('B034', 'Dynamic specification of cursor attributes', '', '', 'NO', NULL, ''), ('B041', 'Extensions to embedded SQL exception declarations', '', '', 'NO', NULL, ''), ('B051', 'Enhanced execution rights', '', '', 'NO', NULL, ''), ('B111', 'Module language Ada', '', '', 'NO', NULL, ''), ('B112', 'Module language C', '', '', 'NO', NULL, ''), ('B113', 'Module language COBOL', '', '', 'NO', NULL, ''), ('B114', 'Module language Fortran', '', '', 'NO', NULL, ''), ('B115', 'Module language MUMPS', '', '', 'NO', NULL, ''), ('B116', 'Module language Pascal', '', '', 'NO', NULL, ''), ('B117', 'Module language PL/I', '', '', 'NO', NULL, ''), ('B121', 'Routine language Ada', '', '', 'NO', NULL, ''), ('B122', 'Routine language C', '', '', 'NO', NULL, ''), ('B123', 'Routine language COBOL', '', '', 'NO', NULL, ''), ('B124', 'Routine language Fortran', '', '', 'NO', NULL, ''), ('B125', 'Routine language MUMPS', '', '', 'NO', NULL, ''), ('B126', 'Routine language Pascal', '', '', 'NO', NULL, ''), ('B127', 'Routine language PL/I', '', '', 'NO', NULL, ''), ('B128', 'Routine language SQL', '', '', 'YES', NULL, 'only schema-contained routines'), ('C011', 'Call-Level Interface', '', '', 'YES', NULL, 'via JDBC'), ('E011', 'Numeric data types', '', '', 'YES', NULL, ''), ('E011', 'Numeric data types', '01', 'INTEGER and SMALLINT data types', 'YES', NULL, ''), ('E011', 'Numeric data types', '02', 'REAL, DOUBLE PRECISION, and FLOAT data types', 'YES', NULL, ''), ('E011', 'Numeric data types', '03', 'DECIMAL and NUMERIC data types', 'YES', NULL, ''), ('E011', 'Numeric data types', '04', 'Arithmetic operators', 'YES', NULL, ''), ('E011', 'Numeric data types', '05', 'Numeric comparison', 'YES', NULL, ''), ('E011', 'Numeric data types', '06', 'Implicit casting among the numeric data types', 'YES', NULL, ''), ('E021', 'Character data types', '', '', 'YES', NULL, ''), ('E021', 'Character string types', '01', 'CHARACTER data type', 'YES', NULL, ''), ('E021', 'Character string types', '02', 'CHARACTER VARYING data type', 'YES', NULL, ''), ('E021', 'Character string types', '03', 'Character literals', 'YES', NULL, ''), ('E021', 'Character string types', '04', 'CHARACTER_LENGTH function', 'YES', NULL, ''), ('E021', 'Character string types', '05', 'OCTET_LENGTH function', 'YES', NULL, ''), ('E021', 'Character string types', '06', 'SUBSTRING function', 'YES', NULL, ''), ('E021', 'Character string types', '07', 'Character concatenation', 'YES', NULL, ''), ('E021', 'Character string types', '08', 'UPPER and LOWER functions', 'YES', NULL, ''), ('E021', 'Character string types', '09', 'TRIM function', 'YES', NULL, ''), ('E021', 'Character string types', '10', 'Implicit casting among the character string types', 'YES', NULL, ''), ('E021', 'Character string types', '11', 'POSITION function', 'YES', NULL, ''), ('E021', 'Character string types', '12', 'Character comparison', 'YES', NULL, ''), ('E031', 'Identifiers', '', '', 'YES', NULL, ''), ('E031', 'Identifiers', '01', 'Delimited identifiers', 'YES', NULL, ''), ('E031', 'Identifiers', '02', 'Lower case identifiers', 'YES', NULL, ''), ('E031', 'Identifiers', '03', 'Trailing underscore', 'YES', NULL, ''), ('E051', 'Basic query specification', '', '', 'YES', NULL, ''), ('E051', 'Basic query specification', '01', 'SELECT DISTINCT', 'YES', NULL, ''), ('E051', 'Basic query specification', '02', 'GROUP BY clause', 'YES', NULL, ''), ('E051', 'Basic query specification', '04', 'GROUP BY can contain columns not in
                  Prev Preface Next
                  HyperSQL Utilities Guide Home Chapter 1. SqlTool


                  Preface

                  If you notice any mistakes in this document, please email the author listed at the beginning of the chapter. If you have problems with the procedures themselves, please use the HSQLDB support facilities which are listed at http://hsqldb.org/web/hsqlSupport.html.

                  Available formats for this document

                  This document is available in several formats.

                  You may be reading this document right now at http://hsqldb.org/doc/2.0, or in a distribution somewhere else. I hereby call the document distribution from which you are reading this, your current distro.

                  http://hsqldb.org/doc/2.0 hosts the latest production versions of all available formats. If you want a different format of the same version of the document you are reading now, then you should try your current distro. If you want the latest production version, you should try http://hsqldb.org/doc/2.0.

                  Sometimes, distributions other than http://hsqldb.org/doc/2.0 do not host all available formats. So, if you can't access the format that you want in your current distro, you have no choice but to use the newest production version at http://hsqldb.org/doc/2.0.

                  Table 1. Available formats of this document


                  If you are reading this document now with a standalone PDF reader, the your distro links may not work.


                  $Revision: 4904 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/util-guide/test-utility-chapt.html0000644000175000017500000002346412007570302023370 0ustar renerene Chapter 2. Hsqldb Test Utility

                  Chapter 2. Hsqldb Test Utility

                  The org.hsqldb.test package contains a number of tests for various functions of the database engine. Among these, the TestUtil class performs the tests that are based on scripts. To run the tests, you should compile the hsqldbtest.jar target with Ant and JUnit.

                  The TestUtil class should be run in the /testrun/hsqldb directory of the distributed files. It then runs the set of TestSelf*.txt files in the directory. To start the application in Windows, change to the directory and type:

                   java org.hsqldb.test.TestUtil

                  All files in the working directory with names matching TestSelf*.txt are processed in alphabetical order.

                  You can add your own scripts to test different series of SQL queries. The format of the TestSelf*.txt file is simple text, with some indentation and prefixes in the form of Java-style comments. The prefixes indicate what the expected result should be.

                  The class org.hsqldb.test.TestScriptRunner is a more general program which you can use to test any script files which you specify (with scripts of the same exact format as described below). For example,

                  java org.hsqldb.test.TestScriptRunner --urlid=mem script1.tsql script2.sql

                  You must have the HSQLDB classes, including the util and test classes, in your CLASSPATH. The urlid must be set up in an RC file as explained in the RC File Authentication Setup section. Use the rcfile= argument to specify an RC file other than the default of testscriptrunner.rc in the current directory. To see all invocation possibilities, just run TestScriptRunner with no arguments at all. TestScriptRunner can run tests sequentially (the default) or in simultaneous asynchronous threads.

                  • Comment lines must start with -- and are ignored

                  • Lines starting with spaces are the continuation of the previous line (for long SQL statements)

                  • SQL statements with no prefix are simply executed.

                  • The remaining items in this list exemplify use of the available command line-prefixes.

                  • The /*s*/ option stands for silent. It is used for executing queries regardless of results. Used for preparation of tests, not for actual tests.

                    /*s*/ Any SQL statement - errors are ignored
                  • The /*c<rows>*/ option is for SELECT queries and asserts the number of rows in the result matches the given count.

                    /*c<rows>*/ SQL statement returning count of <rows>
                  • The /*u*/ option is for queries that return an update count, such as DELETE and UPDATE. It asserts the update count matches.

                    /*u<count>*/ SQL statement returning an update count equal to <count>
                  • The /*e*/ option asserts that the given query results is an error. It is mainly used for testing the error detection capabilities of the engine. The SQL State of the expected error can be defined, for example /*e42578*/, to verify the returned error. This option can be used with syntactically valid queries to assert a certain state in the database. For example a CREATE TABLE can be used to assert the table of the same name already exists.

                    /*e*/ SQL statement that should produce an error when executing
                  • The /*r....*/ option asserts the SELECT query returns a single row containing the given set of field values.

                    /*r<string1>,<string2>*/ SQL statement returning a single row ResultSet equal to the specified value
                  • The extended /*r...*/ option asserts the SELECT query returns the given rows containing the given set of field values.

                    /*r
                        <string1>,<string2>
                        <string1>,<string2>
                        <string1>,<string2>
                    */ SQL statement returning a multiple row ResultSet equal to the specified values

                    (note that the result set lines are indented).

                  • The /*d*/ directive just displays the supplied text.

                    /*d*/ Some message
                  • The /*w MILLIS*/ directive causes the test to Wait for a specified number of millisedonds.

                    /*w 1000*/ Optional message
                  • The /*w ENFORCE_SEQUENCE WAITER_NAME*/ directive causes the test to Wait for the specified Waiter. A waiter is just name that is used to associate a /*w*/ directive to its corresponding /*p*/ directive. The ENFORCE_SEQUENCE argument must be set to true or false to specify whether to fail unless the /*p*/ command runs after the /*w*/ command is waiting.

                    /*w true script4*/ Optional message
                  • The /*p ENFORCE_SEQUENCE WAITER_NAME*/ directive is the peer directive to /*w*/, which causes a waiting thread to Proceed.

                    /*p true script4*/ Optional message
                  • All the options are lowercase letters. During development, an uppercase can be used for a given test to exclude a test from the test run. The utility will just report the test blocks that have been excluded without running them. Once the code has been developed, the option can be turned into lowercase to perform the actual test.

                  See the TestSelf*.txt files in the /testrun/hsqldb/ directory for actual examples.

                  The String ${timestamp} may be used in script messages (like in /*d*/, /*w*/, /*p*/). It expands to the current time, down to the second. For example,

                  /*d*/ It is now ${timestamp}

                  $Revision: 4904 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/util-guide/util-guide.html0000644000175000017500000132425412007570422021670 0ustar renerene HyperSQL Utilities Guide

                  HyperSQL Utilities Guide

                  Edited by

                  The HSQLB Development Group

                  Edited by

                  Blaine Simpson

                  The HSQL Development Group

                  Edited by

                  Fred Toussi

                  The HSQL Development Group

                  Copyright 2002-2011 The HSQL Development Group. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license.

                  2012-08-06 00:15:25+0100


                  Table of Contents

                  Preface
                  Available formats for this document
                  1. SqlTool
                  Try It
                  Purpose, Coverage, Changes in Behavior
                  Platforms and SqlTool versions covered
                  Recent Functional Changes
                  New Features
                  The Bare Minimum
                  Quotes and Spaces
                  Embedding
                  Non-displayable Types
                  Compound commands or commands with semi-colons
                  Desktop shortcuts
                  Loading sample data
                  Satisfying SqlTool's CLASSPATH Requirements
                  Accessing older HSQLDB Databases with SqlTool
                  App-specific Classes, Embedding, and non-HyperSQL Databases
                  Distributing SqlTool with your Apps
                  SqlTool Client PCs
                  RC File Authentication Setup
                  Switching Data Sources
                  Using Inline RC Authentication
                  Logging
                  Interactive Usage
                  SqlTool Command-Line Editing
                  Command Types
                  Emulating Non-Interactive mode
                  Command Types
                  Special Commands
                  Edit Buffer / History Commands
                  Command History
                  PL Commands
                  Non-Interactive
                  Giving SQL on the Command Line
                  SQL Files
                  Piping and shell scripting
                  Automation
                  Optimally Compatible SQL Files
                  Comments
                  Special Commands and Edit Buffer Commands in SQL Files
                  Getting Interactive Functionality with SQL Files
                  Character Encoding
                  Generating Text or HTML Reports
                  Storing and Retrieving Binary Files
                  SqlTool Procedural Language
                  Nulls and Empty Strings
                  Variables
                  Macros
                  SqlTool Functions
                  PL Sample
                  Logical Expressions
                  Mathematical Assignments
                  Flow Control
                  PL Example
                  Chunking
                  Why?
                  How?
                  Raw Mode
                  SQL/PSM, SQL/JRT, and PL/SQL
                  Delimiter-Separated-Value Imports and Exports
                  Simple DSV exports and imports using default settings
                  Specifying queries and options
                  CSV Imports and Exports
                  Unit Testing SqlTool
                  2. Hsqldb Test Utility
                  3. Database Manager
                  Brief Introduction
                  Auto tree-update
                  Automatic Connection
                  RC File
                  Using the current DatabaseManagers with an older HSQLDB distribution.
                  DatabaseManagerSwing as an Applet
                  4. Transfer Tool
                  Brief Introduction
                  A. SqlTool System PL Variables
                  B. HyperSQL File Links

                  Preface

                  If you notice any mistakes in this document, please email the author listed at the beginning of the chapter. If you have problems with the procedures themselves, please use the HSQLDB support facilities which are listed at http://hsqldb.org/web/hsqlSupport.html.

                  Available formats for this document

                  This document is available in several formats.

                  You may be reading this document right now at http://hsqldb.org/doc/2.0, or in a distribution somewhere else. I hereby call the document distribution from which you are reading this, your current distro.

                  http://hsqldb.org/doc/2.0 hosts the latest production versions of all available formats. If you want a different format of the same version of the document you are reading now, then you should try your current distro. If you want the latest production version, you should try http://hsqldb.org/doc/2.0.

                  Sometimes, distributions other than http://hsqldb.org/doc/2.0 do not host all available formats. So, if you can't access the format that you want in your current distro, you have no choice but to use the newest production version at http://hsqldb.org/doc/2.0.

                  Table 1. Available formats of this document


                  If you are reading this document now with a standalone PDF reader, the your distro links may not work.

                  Chapter 1. SqlTool

                  SqlTool Manual

                  Blaine Simpson

                  HSQL Development Group

                  $Revision: 4940 $

                  2012-08-06 00:15:25+0100

                  Try It

                  If you know how to type in a Java command at your shell command line, and you know at least the most basic SQL commands, then you know enough to benefit from SqlTool. You can play with Java system properties, PL variables, math, and other things by just executing this sqltool-2.2.6.jar file. But SqlTool was made for JDBC, so you should download HyperSQL to have SqlTool automatically connect to a fully functional, pure Java database; or obtain a JDBC driver for any other SQL database that you have an account in.

                  If HyperSQL's hsqldb.jar resides in the same directory as the SqlTool jar file, then you can connect up to a HyperSQL instance from SqlTool just by specifying the JDBC URL, root account user name of SA and empty password, with the \j command. See the Switching Data Sources section below for details about \j.

                  Purpose, Coverage, Changes in Behavior

                  [Note]Note

                  Due to many important improvements to SqlTool, both in terms of stability and features, all users of SqlTool are advised to use the latest version of SqlTool, even if your database instances run with an older HSQLDB version. How to do this is documented in the Accessing older HSQLDB Databases with SqlTool section below.

                  This document explains how to use SqlTool, the main purpose of which is to read your SQL text file or stdin, and execute the SQL commands therein against a JDBC database. There are also a great number of features to facilitate both interactive use and automation. The following paragraphs explain in a general way why SqlTool is better than any existing tool for text-mode interactive SQL work, and for automated SQL tasks. Two important benefits which SqlTool shares with other pure Java JDBC tools is that users can use a consistent interface and syntax to interact with a huge variety of databases-- any database which supports JDBC; plus the tool itself runs on any Java platform. Instead of using isql for Sybase, psql for Postgresql, Sql*plus for Oracle, etc., you can use SqlTool for all of them. As far as I know, SqlTool is the only production-ready, pure Java, command-line, generic JDBC client. Several databases come with a command-line client with limited JDBC abilities (usually designed for use with just their specific database).

                  [Important]Use the In-Program Help!

                  The SqlTool commands and settings are intuitive once you are familiar with the usage idioms. This Guide does not attempt to list every SqlTool command and option available. When you want to know what SqlTool commands or options are available for a specific purpose, you need to list the commands of the appropriate type with the relevant "?" command. For example, as explained below, to see all Special commands, you would run \?; and to see all DSV export options, you run \x?.

                  SqlTool is purposefully not a Gui tool like Toad or DatabaseManager. There are many use cases where a Gui SQL tool would be better. Where automation is involved in any way, you really need a text client to at least test things properly and usually to prototype and try things out. A command-line tool is really better for executing SQL scripts, any form of automation, direct-to-file fetching, and remote client usage. To clarify this last, if you have to do your SQL client work on a work server on the other side of a VPN connection, you will quickly appreciate the speed difference between text data transmission and graphical data transmission, even if using VNC or Remote Console. Another case would be where you are doing some repetitive or very structured work where variables or language features would be useful. Gui proponents may disagree with me, but scripting (of any sort) is more efficient than repetitive copy & pasting with a Gui editor. SqlTool starts up very quickly, and it takes up a tiny fraction of the RAM required to run a comparably complex Gui like Toad.

                  SqlTool is superior for interactive use because over many years it has evolved lots of features proven to be efficient for day-to-day use. Four concise in-program help commands (\?, :?, *? and /?) list all available commands of the corresponding type. SqlTool doesn't support up-arrow or other OOB escapes (due to basic Java I/O limitations), but it more than makes up for this limitation with macros, user variables, command-line history and recall, and command-line editing with extended Perl/Java regular expressions. The \d commands deliver JDBC metadata information as consistently as possible (in several cases, database-specific work-arounds are used to obtain the underlying data even though the database doesn't provide metadata according to the JDBC specs). Unlike server-side language features, the same feature set works for any database server. Database access details may be supplied on the command line, but day-to-day users will want to centralize JDBC connection details into a single, protected RC file. You can put connection details (username, password, URL, and other optional settings) for scores of target databases into your RC file, then connect to any of them whenever you want by just giving SqlTool the ID ("urlid") for that database. When you Execute SqlTool interactively, it behaves by default exactly as you would want it to. If errors occur, you are given specific error messages and you can decide whether to roll back your session. You can easily change this behavior to auto-commit, exit-upon-error, etc., for the current session or for all interactive invocations. You can import or export delimiter-separated-value files. If you need to run a specific statement repeatedly, perhaps changing the WHERE clause each time, it is very simple to define a macro.

                  When you Execute SqlTool with a SQL script, it also behaves by default exactly as you would want it to. If any error is encountered, the connection will be rolled back, then SqlTool will exit with an error exit value. If you wish, you can detect and handle error (or other) conditions yourself. For scripts expected to produce errors (like many scripts provided by database vendors), you can have SqlTool continue-upon-error. For SQL script-writers, you will have access to portable scripting features which you've had to live without until now. You can use variables set on the command line or in your script. You can handle specific errors based on the output of SQL commands or of your variables. You can chain SQL scripts, invoke external programs, dump data to files, use prepared statements, Finally, you have a procedural language with if, foreach, while, continue, and break statements.

                  Platforms and SqlTool versions covered

                  SqlTool runs on any Java 1.5 or later platform. I know that SqlTool works well with Sun and OpenJDK JVMs. I haven't run other vendors' JVMs in years (IBM, JRockit, etc.). As my use with OpenJDK proves that I don't depend on Sun-specific classes, I expect it to work well with other (1.5-compatible) Java implementations.

                  SqlTool no longer writes any files without being explicitly instructed to. Therefore, it should work fine on read-only systems, and you'll never have orphaned temp files left around.

                  The command-line examples in this chapter work as given on all platforms (if you substitute in a normalized path in place of $HSQLDB_HOME), except where noted otherwise. When doing any significant command-line work on Windows (especially shell scripting), you're better off to completely avoid paths with spaces or funny characters. If you can't avoid it, use double-quotes and expect problems. As with any Java program, file or directory paths on the command line after "java" can use forward slashes instead of back slashes (this goes for System properties and the CLASSPATH variable too). I use forward slashes because they can be used consistently, and I don't have to contort my fingers to type them :).

                  If you are using SqlTool from a HyperSQL distribution of version 2.2.5 or earlier, you should use the documentation with that distribution, because this manual documents many new features, several significant changes to interactive-only commands, and a few changes effecting backwards-compatibility (see next section about that). This document is now updated for the current versions of SqlTool and SqlFile at the time I am writing this (versions 4720 and 4863 correspondingly-- SqlFile is the class which actually processes the SQL content for SqlTool). Therefore, if you are using a version of SqlTool or SqlFile that is more than a couple revisions greater, you should find a newer version of this document. (The imprecision is due to content-independent revision increments at build time, and the likelihood of one or two behavior-independent bug fixes after public releases). The startup banner will report both versions when you run SqlTool interactively. (Dotted version numbers of SqlTool and SqlFile definitely indicate ancient versions).

                  This guide covers SqlTool as bundled with HSQLDB after 2.2.5. [1]

                  Recent Functional Changes

                  This section lists changes to SqlTool since the last major release of HSQLDB which may effect the portability of SQL scripts. For this revision of this document, this list consists of script-impacting changes made to SqlTool after the final 2.0.0 HyperSQL release.

                  • SqlTool always has treated unset PL variables equal to null-valued variables, and this is not changing. There is no distinction between unset and null-valued. But before revision 4423 (i.e. pre-HyperSQL 2.2.6), SqlTool almost always treated variable value of empty String (i.e. what is between these two quotes: "") as equivalent to null/unset. The most common case where a user would see this was in the command to unset a PL variable: * VARNAME =. Though your command says to assign the value of the empty string to VARNAME, varname would unset it instead (which latter is equivalent to assigning null to it).

                    SqlTool achieves several new benefits by purposefully assigning the empty string for some purposes, and distinctly unsetting for other purposes. One example of this is the new consistent and robust handling of the PL variable ?. Now, when ? is unset (aka null), it always mean that the last SQL command failed. If this variable has the value of the empty string, it means that the last cell returned had value of the empty string, or the ? was reset (for example due to SqlTool startup).

                    When you run SqlTool interactively, you will see warnings about setting PL variables to nothing. If you don't do anything involving assignment or testing of unset or empty variables, then skip this item and ignore the new warnings. In an upcoming release, by default, setting a PL variable to nothing, like * name = Bruno will no longer unset/remove the variable but will instead assign an empty-string value. There are important use cases for empty-string values. In new scripts and interactively, from now on you should use the new PL command "* - VARNAME" if you really want to unset a variable. If you do not set Java system property 'sqltool.REMOVE_EMPTY_VARS', everything behaves just like before (except that you will be able to use the new * - VARNAME command), but you will get the warnings. But if you do anything involving assignment or testing of unset or empty variables, you need to set this property.

                    For legacy scripts, you should set 'sqltool.REMOVE_EMPTY_VARS' to true to quiet the messages, retaining the old behavior and protecting from the behavior change in the future. For maintained or new scripts, set the value of the property to false, and only use "* - VARNAME" to unset variables.

                    sqltool.REMOVE_EMPTY_VARS only effects the assignment operation * VARNAME =. Regardless of this setting, SqlTool itself will assign some SqlTool PL variables to the empty string and to null, and _ will assign nulls if the next call value retrieve is null, variables which have never been set will be equal to null, and you can use command line parameters -P or --setVar to assign PL variables to the empty String. (For example "java -jar .../sqltool.jar -Pvarname= urlid script.sql").

                  • DSV input now accepts JDBC Timestamp format with date and optionally time of day.
                  • The simplest PL command, just "*", has been deprecated. It is now useless since the only time where variables are not expanded are in SQL commands if no user variable has been set. Since you obviously must set at least one variable value if you intend for variable substitution to succeed, the purpose of the old * command is satisfied intuitively and automatically now. (That purpose being to prevent modification of SQL text without the operator's knowledge).
                  • The * command (just plain "*") has been removed because it is no longer necessary. (See item on it in the previous section of this manual).
                  • Bugs in variable scoping have been fixed. All variables are global and shared among auto.sql, all command-line and nested SQL scripts, and interactive shells.
                  • A bug has been fixed so that SqlTool system PL variables (with names starting with "*") are now honored no matter how or where the variable value was set.
                  • Variables with non-alpha-numerical characters, and those beginning with digits have been deprecated but are still supported for now.
                  • The data (and just the data) of HTML reports has remained the same, but the whole system has been drastically modernized and enhanced. You may notice new special command \pr. This is a \p variant applicable only to HTML mode, telling SqlTool to treat the expression as Raw, so the author can type in HTML, JavaScript or other text not to be formatted. HTML model also gets its own *NULL_REP_HTML setting distinct from *NULL_REP_TOKEN.
                  • For consistency, the \H toggle switch has been superseded with \h true|false> The old variants are still supported.
                  • Command /= name :... has been superseded by the more consistent (with our other commands) /: name.... The old variant is still supported.
                  • Removed support for SqlTool system PL variable names deprecated years ago.
                  • Idiosyncratic * option to \m is no longer necessary (though still supported). SqlTool system variable *DSV_SKIP_PREFIX may now be set to the empty string to indicate no skipping.
                  • Import reject report files were being retained on Windows, even when there were not rejected records. This bug has been fixed.
                  • PL variables *NULL and NULL are reserved and may be referenced but not assigned to.
                  • The special PL variable ? is now updated rigorously. It will be null only if the last SQL command that was run failed.
                  • The special PL variable ? is now listed in the output of * list and * listvalues commands. (Unless at the time it is unset/null, of course, and in this case the absence of ? indicates that it is unset.
                  • The look of DSV import reject reports has changed, and the name of user-supplied (optional) CSS file has been changed. (See following section about why).
                  • The \d tableLikeObject command output now has 2 more columns, to report precision and scale.

                  New Features

                  Since 2.0.0 final

                  To reduce duplication, new features are listed in the Recent Functional Changes section are not repeated here, so check that list too.

                  • You can (and if you use nested scripts, you probably should) prefix relative paths given inside of SqlTool with @/. This makes them relative to the parent script directory instead of to the invocation current directory.
                  • More accepting of dates and times in DSV imports.
                  • CSV exporting and importing with double-quote delimiting and escaping.
                  • New "* - VARNAME" PL command added to explicitly unset/remove a variable. Definitely read the first item in the Recent Functional Changes section.
                  • Added integer math feature very similar to that of Bash and Korn shells.
                  • Added some new logical operators
                  • Added new : variant for exporting (\x and \xq), which uses a query from the edit buffer. This provides direct support for exports using long, multi-line queries.
                  • SqlTool functions have been implemented. These are just / macros which take positional parameters. They can be distinguished from regular macros by having name like this(), and being invoked like this(with, parameters).
                  • We have provided multiple ways to accommodate command-line inlineRcs and variable assignments where the values contain commas, and generally added flexibility to the latter. In both cases, commas may be escaped with the backslash character. New switch -p (also usable as -P) is provided as an easier way to eliminate the delimiter issue.
                  • Multiple --sql, -p, and -P arguments to SqlTool are now honored, and they are evaluated in specified order.
                  • Added automatically-assigned SqlTool system PL variables *START_TIME and *REVISION.
                  • Added optional SqlTool system PL variable *TIMESTAMP_FORMAT, which, when set causes new SqlTool system PL variable *TIMESTAMP to be automatically set to the time when this (latter) variable is referenced. Unlike *START_TIME, the *TIMESTAMP_FORMAT + *TIMESTAMP combination allows the user to specify exactly how to display the time and/or date.
                  • The DSV import reject report has been refactored to use the same templating and substitution used by the new HTML reports.
                  • The SqlTool unit test system has been ported from Bash to Groovy wrapped by Gradle. The system requirements have thereby been reduced from requiring a Bash shell to just requiring a Java 6 JRE.
                  • Added an inline/shortcut *if syntax like this: * if (*x == *b) \p Any 1-lne statement. People who value conciseness, like myself, will appreciate this.
                  • Added * else statement to accompany * if statement.
                  • Added traditional mathematical * if statement. Run *? to see syntax.
                  • Added iteration over query result set rows with loop statement * forrows.
                  • Added statement * return as a more intuitive alias for * break file.

                  The Bare Minimum

                  The Bare Minimum You Need to Know to Run SqlTool

                  [Warning]Warning

                  If you are using an Oracle database server, it will commit your current transaction if you cleanly disconnect, regardless of whether you have set auto-commit or not. This will occur if you exit SqlTool (or any other client) in the normal way (as opposed to killing the process or using Ctrl-C, etc.). This is mentioned in this section only for brevity, so I don't need to mention it in the main text in the many places where auto-commit is discussed. This behavior has nothing to do with SqlTool. It is a quirk of Oracle.

                  If you want to use SqlTool, then you either have an SQL text file, or you want to interactively type in SQL commands. If neither case applies to you, then you are probably looking at the wrong program.

                  Procedure 1.1. To run SqlTool...

                  1. Copy the file sample/sqltool.rc [1] of your HyperSQL distribution to your home directory and secure access to it if your computer is accessible to anybody else (most likely from the network). This file will work as-is for a Memory Only database instance; or if your target is a HyperSQL Server running on your local computer with default settings and the password for the "SA" account is blank (the SA password is blank when new HyperSQL database instances are created). Edit the file if you need to change the target Server URL, username, password, character set, JDBC driver, or TLS trust store as documented in the RC File Authentication Setup section. You could, alternatively, use the --inlineRc command-line switch or the \j special command to connect up to a data source, as documented below.

                  2. Find out where your sqltool.jar file resides. It typically resides at HSQLDB_HOME/lib/sqltool.jar where HSQLDB_HOME is the "hsqldb" directory inside the root level of your HyperSQL software installation. (For example, if you extract hsqldb-9.1.0.zip into c:\temp, your HSQLDB_HOME would be c:/temp/hsqldb-9.1.0/hsqldb. Your file may also have a version label in the file name, like sqltool-1.2.3.4.jar. The forward slashes work just fine on Windows). For this reason, I'm going to use "$HSQLDB_HOME/lib/sqltool.jar" as the path to sqltool.jar for my examples, but understand that you need to use the actual path to your own sqltool.jar file. (Unix users may set a real env. variable if they wish, in which case the examples may be used verbatim; Window users may do the same, but will need to dereference the variables like %THIS% instead of like $THIS).

                    [Warning]Warning

                    My examples assume there are no spaces or funky characters in your file paths. This avoids bugs with the Windows cmd shell and makes for simpler syntax all-around. If you insist on using directories with spaces or shell metacharacters (including standard Windows home directories like C:\Documents and Settings\blaine), you will need to double-quote arguments containing these paths. (On UNIX you can alternatively use single-quotes to avoid variable dereferencing at the same time).

                  3. If you are just starting with SqlTool, you are best off running your SqlTool command from a shell command-line (as opposed to by using icons or the Windows' Start/Run... or Start/Start Search). This way, you will be sure to see error messages if you type the command wrong or if SqlTool can't start up for some reason. On recent versions of Windows, you can get a shell by running cmd from Start/Run... or Start/Start Search). On UNIX or Linux, any real or virtual terminal will work.

                    On your shell command line, run

                        java -jar $HSQLDB_HOME/lib/sqltool.jar --help

                    to see what command-line arguments are available. Note that you don't need to worry about setting the CLASSPATH when you use the -jar switch to java.

                    To run SqlTool without a JDBC connection, run

                        java -jar $HSQLDB_HOME/lib/sqltool.jar

                    You won't be able to execute any SQL, but you can play with the SqlTool interface (including using PL features).

                    To execute SQL, you'll need the classes for the target database's JDBC driver (and database engine classes for in-process databases). As this section is titled The Bare Minimum, I'll just say that if you are running SqlTool from a HyperSQL product installation, you are all set to connect to any kind of HyperSQL database. This is because SqlTool will look for the file hsqldb.jar in the same directory as sqltool.jar, and that file contains all of the needed classes. (SqlTool supports all JDBC databases and does not require a HyperSQL installation, but these cases would take us beyond the bare minimum). So, with hsqldb.jar in place, you can run commands like

                        java -jar $HSQLDB_HOME/lib/sqltool.jar mem

                    for interactive use, or

                        java -jar $HSQLDB_HOME/lib/sqltool.jar --sql="SQL statement;" mem

                    or

                         java -jar $HSQLDB_HOME/lib/sqltool.jar mem filepath1.sql...

                    where mem is an urlid, and the following arguments are paths to text SQL files. For the filepaths, you can use whatever wildcards your operating system shell supports.

                    The urlid mem in these commands is a key into your RC file, as explained in the RC File Authentication Setup section. Since this is a mem: type catalog, you can use SqlTool with this urlid immediately with no database setup whatsoever (however, you can't persist any changes that you make to this database). The sample sqltool.rc file also defines the urlid "localhost-sa" for a local HyperSQL Listener. At the end of this section, I explain how you can load some sample data to play with, if you want to.

                  [Tip]Tip

                  If SqlTool fails to connect to the specified urlid and you don't know why, add the invocation parameter --debug. This will cause SqlTool to display a stack trace from where the connection attempt fails. (If a connection attempt fails with the interactive \j command, details will always be displayed).

                  [Important]You are responsible for Commit behavior

                  SqlTool does not commit SQL changes by default. (You can use the --autoCommit command-line switch to have it auto-commit). This leaves it to the user's discretion whether to commit or rollback their modifications. If you do want your changes committed, remember to run \= before quitting SqlTool. (Most databases also support the SQL command commit;),

                  If you put a file named auto.sql into your home directory, this file will be executed automatically every time that you run SqlTool interactively (unless you invoke with the --noAutoFile switch). I did say interactively: If you want to execute this file when you execute SQL scripts from the command line, then your script must use \i ${user.home}/auto.sql or similar to invoke it explicitly.

                  To use a JDBC Driver other than the HyperSQL driver, you can't use the -jar switch because you need to modify the classpath. You must add the sqltool.jar file and your JDBC driver classes to your classpath, and you must tell SqlTool what the JDBC driver class name is. The latter can be accomplished by either using the "--driver" switch, or setting "driver" in your config file. The RC File Authentication Setup section. explains the second method. Here's an example of the first method (after you have set the classpath appropriately).

                  java org.hsqldb.cmdline.SqlTool --driver=oracle.jdbc.OracleDriver urlid
                  [Tip]Tip

                  If the tables of query output on your screen are all messy because of lines wrapping, the best and easiest solution is usually to resize your terminal emulator window to make it wider. (With some terms you click & drag the frame edges to resize, with others you use a menu system where you can enter the number of columns).

                  Quotes and Spaces

                  Single and double-quotes are not treated specially by SqlTool. This makes SqlTool more intuitive than most shell languages, ensures that quotes sent to the database engine are not adulterated, and eliminates the need for somehow escaping quote characters.

                  Line delimiters are special, as that is the primary means for SqlTool to tell when a command is finished (requiring combination with semi-colon to support multi-line SQL statements). Spaces and tabs are preserved inside of your strings and variable values, but are trimmed from the beginning in nearly all cases (such space having very rare usefulness). The cases where leading whitespace is preserved exactly as specified in your strings are the : commands (including * VARNAME :, /: VARNAME, \x :, and \xq :).

                  So, if you write the SQL command

                  INSERT into t values ('one ''    and   ''  two');

                  or the SqlTool print command

                  \p A message for my 'Greatest...     fan'

                  you just type exactly what you want to send to the database, or what you want displayed.

                  Embedding

                  Using SqlTool to execute SQL files from your own Java code

                  To repeat what is stated in the JavaDoc for the SqlTool class itself: Programmatic users will usually want to use the objectMain(String[]) method if they want arguments and behavior exactly like command-line SqlTool. If you don't need invocation parameter parsing, auto.sql execution, etc., you will have more control and efficiency by using the SqlFile class directly. The file src/org/hsqldb/sample/SqlFileEmbedder.java in the HyperSQL distribution provides an example for this latter strategy.

                  Non-displayable Types

                  There are some SQL types which SqlTool (being a text-based program) can't display properly. This includes the SQL types BLOB, JAVA_OBJECT, STRUCT, and OTHER. When you run a query that returns any of these, SqlTool will save the very first such value obtained to the binary buffer and will not display any output from this query. You can then save the binary value to a file, as explained in the Storing and Retrieving Binary Files section.

                  There are other types, such as BINARY, which JDBC can make displayable (by using ResultSet.getString()), but which you may very well want to retrieve in raw binary format. You can use the \b command to retrieve any-column-type-at-all in raw binary format (so you can later store the value to a binary file).

                  Another restriction which all text-based database clients have is the practical inability for the user to type in binary data such as photos, audio streams, and serialized Java objects. You can use SqlTool to load any binary object into a database by telling SqlTool to get the insert/update datum from a file. This is also explained in the Storing and Retrieving Binary Files section.

                  Compound commands or commands with semi-colons

                  See the Chunking section if you need to execute any compound SQL commands or SQL commands containing non-escaped/quoted semi-colons.

                  Desktop shortcuts

                  Desktop shortcuts and quick launch icons are useful, especially if you often run SqlTool with the same set of arguments. It's really easy to set up several of them-- one for each way that you invoke SqlTool (i.e., each one would start SqlTool with all the arguments for one of your typical startup needs). One typical setup is to have one shortcut for each database account which you normally use (use a different urlid argument in each shortcut's Target specification.

                  Desktop icon setup varies depending on your Desktop manager, of course. I'll explain how to set up a SqlTool startup icon in Windows XP. Linux and Mac users should be able to take it from there, since it's easier with the common Linux and Mac desktops.

                  Procedure 1.2. Creating a Desktop Shortcut for SqlTool

                  1. Right click in the main Windows background.

                  2. New

                  3. Shortcut

                  4. Browse

                  5. Navigate to where your good JRE lives. For recent Sun JRE's, it installs to C:\Program Files\Java\*\bin by default (the * will be a JDK or JRE identifier and version number).

                  6. Select java.exe.

                  7. OK

                  8. Next

                  9. Enter any name

                  10. Finish

                  11. Right click the new icon.

                  12. Properties

                  13. Edit the Target field.

                  14. Leave the path to java.exe exactly as it is, including the quotes, but append to what is there. Beginning with a space, enter the command-line that you want run.

                  15. Change Icon... to a pretty icon.

                  16. If you want a quick-launch icon instead of (or in addition to) a desktop shortcut icon, click and drag it to your quick launch bar. (You may or may not need to edit the Windows Toolbar properties to let you add new items). Postnote: Quick launch setup has become more idiosyncratic on the more recent versions of Windows, sometimes requiring esoteric hacks to make them in some cases. So, if the instructions here don't work, you'll have to seek help elsewhere.

                  Loading sample data

                  If you want some sample database objects and data to play with, execute the sample/sampledata.sql SQL file [1]. To separate the sample data from your regular data, you can put it into its own schema by running this before you import:

                      CREATE SCHEMA sampledata AUTHORIZATION dba;
                    SET SCHEMA sampledata;

                  Run it like this from an SqlTool session

                      \i HSQLDB_HOME/sample/sampledata.sql

                  where HSQLDB_HOME is the base directory of your HSQLDB software installation [1].

                  For memory-only databases, you'll need to run this every time that you run SqlTool. For other (persistent) databases, the data will reside in your database until you drop the tables.

                  Satisfying SqlTool's CLASSPATH Requirements

                  As discussed earlier, only the single file sqltool.jar is required to run SqlTool (the file name may contain a version label like sqltool-1.2.3.4.jar). But it's useless as an SQL Tool unless you can connect to a JDBC data source, and for that you need the target database's JDBC driver in the classpath. For in-process catalogs, you'll also need the database engine classes in the CLASSPATH. The The Bare Minimum section explains that the easiest way to use SqlTool with any HyperSQL database is to just use sqltool.jar in-place where it resides in a HyperSQL installation. This section explains how to satisfy the CLASSPATH requirements for other setups and use cases.

                  Accessing older HSQLDB Databases with SqlTool

                  If you are using SqlTool to access non-HSQLDB database(s), then you should use the latest and greatest-- just grab the newest public release of SqlTool (like from the latest public HyperSQL release) and skip this subsection.

                  You are strongly encouraged to use the latest SqlTool release to access older HSQLDB databases, to enjoy greatly improved SqlTool robustness and features. It is very easy to do this.

                  1. Obtain the latest sqltool.jar file. One way to obtain the latest sqltool.jar file is to download the latest HyperSQL distribution and extract that single file

                  2. Place (or copy) your new sqltool.jar file right alongside the hsqldb.jar file for your target database version. If you don't have a local copy of the hsqldb.jar file for your target database, just copy it from your database server, or download the full distribution for that server version and extract it.

                  3. (If you have used older versions of SqlTool before, notice that you now invoke SqlTool by specifying the sqltool.jar file instead of the hsqldb.jar). If your target database is a previous 2.x version of HyperSQL, then you are finished and can use the new SqlTool for your older database. Users upgrading from a pre-2.x version please continue...

                    Run SqlTool like this.

                        java -jar path/to/sqltool.jar --driver=org.hsqldb.jdbcDriver...

                    where you specify the pre-2.x JDBC driver name org.hsqldb.jdbcDriver. Give any other SqlTool parameters as you usually would.

                    Once you have verified that you can access your database using the --driver parameter as explained above, edit your sqltool.rc file, and add a new line

                        driver org.hsqldb.jdbcDriver

                    after each urlid that is for a pre-2.x database. Once you do this, you can invoke SqlTool as usual (i.e. you no longer need the --driver argument for your invocations).

                  App-specific Classes, Embedding, and non-HyperSQL Databases

                  For these situations, you need to add your custom, third-party, or SQL driver classes to your Java CLASSPATH. Java doesn't support adding arbitrary elements to the classpath when you use the -jar, so you must set a classpath containing sqltool.jar plus whatever else you need, then invoke SqlTool without the -jar switch, as briefly described at the end of the The Bare Minimum section. For embedded apps, invoke your own main class instead of SqlTool, and you can invoke SqlTool or SqlFile from your code base.

                  To customize the classpath, you need to set up your classpath by using your operating system or shell variable CLASSPATH or by using the java switch -cp (or the equivalent -classpath). I'm not going to take up space here to explain how to set up a Java CLASSPATH. That is a platform-dependent task that is documented well in tons of Java introductions and tutorials. What I'm responsible for telling you is what you need to add to your classpath. For the non-embedded case where you have set up your CLASSPATH environmental variable, you would invoke SqlTool like this.

                      java org.hsqldb.cmdline.SqlTool ...

                  If you are using the -cp switch instead of a CLASSPATH variable, stick it after java. After "SqlTool", give any SqlTool parameters exactly as you would put after java -jar .../sqltool.jar if you didn't need to customize the CLASSPATH. You can specify a JDBC driver class to use either with the --driver switch to SqlTool, or in your RC file stanza (the last method is usually more convenient).

                  Note that without the -jar switch, SqlTool will still automatically pull in HyperSQL JDBC driver or engine classes from HyperSQL jar files in the same directory. It's often a good practice to minimize your runtime classpath. To prevent the possibility of pulling in classes from other HyperSQL jar files, just copy sqltool.jar to some other directory (which does not contain other HyperSQL jar files) and put the path to that one in your classpath.

                  Distributing SqlTool with your Apps

                  You can distribute SqlTool along with your application, for standalone or embedded invocation. For embedded use, you will need to customize the classpath as discussed in the previous item. Either way, you should minimize your application footprint by distributing only those HyperSQL jar files needed by your app. You will obviously need sqltool.jar if you will use the SqlTool or SqlFile class in any way. If your app will only connect to external HyperSQL listeners, then build and include hsqljdbc.jar. If your app will also run a HyperSQL Listener, you'll need to include hsqldb.jar. If your app will connect directly to a in-process catalog, then include hsqldbmain.jar. Note that you never need to include more than one of hsqldb.jar, hsqldbmain.jar, hsqljdbc.jar, since the former jars include everything in the following jars.

                  SqlTool Client PCs

                  If you just want to be able to run SqlTool (interactively or non-interactively) on a PC, and have no need for documentation, then it's usually easiest to just copy sqltool.jar and hsqldb.jar to the PCs (plus JDBC driver jars for any other target databases). If you want to minimize what you distribute, then build and distribute hsqljdbc.jar or hsqldbmain.jar instead of hsqldb.jar, according to the criteria listed in the previous sub-section.

                  RC File Authentication Setup

                  RC file authentication setup is accomplished by creating a text RC configuration file. In this section, when I say configuration or config file, I mean an RC configuration file. RC files can be used by any JDBC client program that uses the org.hsqldb.util.RCData class-- this includes SqlTool, DatabaseManager, DatabaseManagerSwing.

                  You can use it for your own JDBC client programs too. There is example code showing how to do this at src/org/hsqldb/sample/SqlFileEmbedder.java.

                  The sample RC file shown here resides at sample/sqltool.rc in your HSQLDB distribution [1].

                  Example 1.1. Sample RC File

                  # $Id: sqltool.rc 4313 2011-06-06 02:19:38Z unsaved $
                  
                  # This is a sample RC configuration file used by SqlTool, DatabaseManager,
                  # and any other program that uses the org.hsqldb.lib.RCData class.
                  # See the documentation for SqlTool for various ways to use this file.
                  
                  # If you have the least concerns about security, then secure access to
                  # your RC file.
                  
                  # You can run SqlTool right now by copying this file to your home directory
                  # and running
                  #    java -jar /path/to/sqltool.jar mem
                  # This will access the first urlid definition below in order to use a 
                  # personal Memory-Only database.
                  # "url" values may, of course, contain JDBC connection properties, delimited
                  # with semicolons.
                  # As of revision 3347 of SqlFile, you can also connect to datasources defined
                  # here from within an SqlTool session/file with the command "\j urlid".
                  
                  # You can use Java system property values in this file like this:  ${user.home}
                  
                  # The only feature added recently is the optional "transiso" setting,
                  # which may be set to an all-caps transaction isolation level as listed
                  # in the Java API Spec for java.sql.Connection.
                  # Windows users are advised to use forward slashes instead of reverse slashes,
                  # and to avoid paths containing spaces or other funny characters.  (This
                  # recommendation applies to any Java app, not just SqlTool).
                  
                  # A personal Memory-Only (non-persistent) database.
                  urlid mem
                  url jdbc:hsqldb:mem:memdbid
                  username SA
                  password
                  
                  # A personal, local, persistent database.
                  urlid personal
                  url jdbc:hsqldb:file:${user.home}/db/personal;shutdown=true
                  username SA
                  password
                  transiso TRANSACTION_READ_COMMITTED
                  # When connecting directly to a file database like this, you should 
                  # use the shutdown connection property like this to shut down the DB
                  # properly when you exit the JVM.
                  
                  # This is for a hsqldb Server running with default settings on your local
                  # computer (and for which you have not changed the password for "SA").
                  urlid localhost-sa
                  url jdbc:hsqldb:hsql://localhost
                  username SA
                  password
                  
                  
                  
                  # Template for a urlid for an Oracle database.
                  # You will need to put the oracle.jdbc.OracleDriver class into your 
                  # classpath.
                  # In the great majority of cases, you want to use the file classes12.zip
                  # (which you can get from the directory $ORACLE_HOME/jdbc/lib of any
                  # Oracle installation compatible with your server).
                  # Since you need to add to the classpath, you can't invoke SqlTool with
                  # the jar switch, like "java -jar .../sqltool.jar...".
                  # Put both the SqlTool jar and classes12.zip in your classpath (and export!)
                  # and run something like "java org.hsqldb.util.SqlTool...".
                  
                  #urlid cardiff2
                  #url jdbc:oracle:thin:@aegir.admc.com:1522:TRAFFIC_SID
                  #username blaine
                  #password secretpassword
                  #driver oracle.jdbc.OracleDriver
                  
                  
                  
                  # Template for a TLS-encrypted HSQLDB Server.
                  # Remember that the hostname in hsqls (and https) JDBC URLs must match the
                  # CN of the server certificate (the port and instance alias that follows 
                  # are not part of the certificate at all).
                  # You only need to set "truststore" if the server cert is not approved by
                  # your system default truststore (which a commercial certificate probably
                  # would be).
                  
                  #urlid tls
                  #url jdbc:hsqldb:hsqls://db.admc.com:9001/lm2
                  #username BLAINE
                  #password asecret
                  #truststore ${user.home}/ca/db/db-trust.store
                  
                  
                  # Template for a Postgresql database
                  #urlid blainedb
                  #url jdbc:postgresql://idun.africawork.org/blainedb
                  #username blaine
                  #password losung1
                  #driver org.postgresql.Driver
                  
                  # Template for a MySQL database.  MySQL has poor JDBC support.
                  #urlid mysql-testdb
                  #url jdbc:mysql://hostname:3306/dbname
                  #username root
                  #password hiddenpwd
                  #driver com.mysql.jdbc.Driver
                  
                  # Note that "databases" in SQL Server and Sybase are traditionally used for
                  # the same purpose as "schemas" with more SQL-compliant databases.
                  
                  # Template for a Microsoft SQL Server database using Microsoft's Driver
                  # (I find that the JTDS driver is much more responsive than Microsoft's).
                  # OLDER JDBC Driver:
                  #urlid msprojsvr
                  #url jdbc:microsoft:sqlserver://hostname;DatabaseName=DbName;SelectMethod=Cursor
                  # The SelectMethod setting is required to do more than one thing on a JDBC
                  # session (I guess Microsoft thought nobody would really use Java for 
                  # anything other than a "hello world" program).
                  # This is for Microsoft's SQL Server 2000 driver (requires mssqlserver.jar
                  # and msutil.jar).
                  #driver com.microsoft.jdbc.sqlserver.SQLServerDriver
                  #username myuser
                  #password hiddenpwd
                  # Current 2011 JDBC Driver for Microsoft SQL Server:
                  # Requires just the new sqljdbc4.jar.  (Microsoft just loves back-slashes)
                  #url jdbc:sqlserver://hostname\instanceName;DatabaseName=dbname
                  #driver com.microsoft.jdbc.sqlserver.SQLServerDriver
                  
                  # Template for Microsoft SQL Server database using the JTDS Driver
                  # http://jtds.sourceforge.net  Jar file has name like "jtds-1.2.5.jar".
                  #urlid nlyte
                  #username myuser
                  #password hiddenpwd
                  #url jdbc:jtds:sqlserver://myhost/nlyte;instance=MSSQLSERVER
                  #driver net.sourceforge.jtds.jdbc.Driver
                  
                  # Template for a Sybase database
                  #urlid sybase
                  #url jdbc:sybase:Tds:hostname:4100/dbname
                  #username blaine
                  #password hiddenpwd
                  # This is for the jConnect driver (requires jconn3.jar).
                  #driver com.sybase.jdbc3.jdbc.SybDriver
                  
                  # Template for Embedded Derby / Java DB.
                  #urlid derby1
                  #url jdbc:derby:path/to/derby/directory;create=true
                  #username ${user.name}
                  #password any_noauthbydefault
                  #driver org.apache.derby.jdbc.EmbeddedDriver
                  # The embedded Derby driver requires derby.jar.
                  # There'a also the org.apache.derby.jdbc.ClientDriver driver with URL
                  # like jdbc:derby://<server>[:<port>]/databaseName, which requires
                  # derbyclient.jar.
                  # You can use \= to commit, since the Derby team decided (why???)
                  # not to implement the SQL standard statement "commit"!!
                  # Note that SqlTool can not shut down an embedded Derby database properly,
                  # since that requires an additional SQL connection just for that purpose.
                  # However, I've never lost data by not shutting it down properly.
                  # Other than not supporting this quirk of Derby, SqlTool is miles ahead of ij.
                  

                  As noted in the comment (and as used in a couple examples), you can use Java system properties like this: ${user.home}. Windows users, please read the suggestion directed to you in the file.

                  You can put this file anywhere you want to, and specify the location to SqlTool/DatabaseManager/DatabaseManagerSwing by using the --rcfile argument. If there is no reason to not use the default location (and there are situations where you would not want to), then use the default location and you won't have to give --rcfile arguments to SqlTool/DatabaseManager/DatabaseManagerSwing. The default location is sqltool.rc or dbmanager.rc in your home directory (corresponding to the program using it). If you have any doubt about where your home directory is, just run SqlTool with a phony urlid and it will tell you where it expects the configuration file to be.

                      java -jar $HSQLDB_HOME/lib/sqltool.jar x

                  The config file consists of stanza(s) like this:

                      urlid web
                      url jdbc:hsqldb:hsql://localhost
                      username web
                      password webspassword

                  These four settings are required for every urlid. (There are optional settings also, which are described a couple paragraphs down). The URL may contain JDBC connection properties. You can have as many blank lines and comments like

                      # This comment

                  in the file as you like. The whole point is that the urlid that you give in your SqlTool/DatabaseManager command must match a urlid in your configuration file.

                  [Warning]Warning

                  Use whatever facilities are at your disposal to protect your configuration file.

                  It should be readable, both locally and remotely, only to users who run programs that need it. On UNIX, this is easily accomplished by using chmod/chown commands and making sure that it is protected from anonymous remote access (like via NFS, FTP or Samba).

                  You can also put the following optional settings into a urlid stanza. The setting will, of course, only apply to that urlid.

                  charset

                  This is used by the SqlTool program, but not by the DatabaseManager programs. See the Character Encoding section of the Non-Interactive section. This is used for input and output files, not for stdin or stdout, which are controlled by environmental variables and Java system properties. If you set no encoding for an urlid, input and outfiles will use the same encoding as for stdin/stdout. (As of right now, the charset setting here is not honored by the \j command, but only when SqlTool loads an urlid specified on the command-line).

                  driver

                  Sets the JDBC driver class name. You can, alternatively, set this for one SqlTool/DatabaseManager invocation by using the command line switch --driver. Defaults to org.hsqldb.jdbc.JDBCDriver.

                  truststore

                  TLS trust keystore store file path as documented in the TLS section of the Listeners chapter of the HyperSQL User Guide You usually only need to set this if the server is using a non-publicly-certified certificate (like a self-signed self-ca'd cert). Relative paths will be resolved relative to the ${user.dir} system property at JRE invocation time.

                  transiso

                  Specify the Transaction Isolation Level with an all-caps string, exactly as listed in he Field Summary of the Java API Spec for the class java.sql.Connection.

                  Property and SqlTool command-line switches override settings made in the configuration file.

                  Switching Data Sources

                  The \j command lets you switch JDBC Data Sources in your SQL files (or interactively). "\?" shows the syntax to make a connection by either RCData urlid or by name + password + JDBC Url. (If you omit the password parameter, an empty string password will be used). The urlid variant uses RC file of $HOME/sqltool.rc. We will add a way to specify an RC file if there is any demand for that.

                  You can start SqlTool without any JDBC Connection by specifying no Inline RC and urlid of "-" (just a hyphen). If you don't need to specify any SQL file paths, you can skip the hyphen, as in this example.

                  java -jar $HSQLDB_HOME/lib/sqltool.jar -Pv1=one

                  (The "-" is required when specifying one or more SQL files, in order to distinguish urlid-spec from file-spec). Consequently, if you invoke SqlTool with no parameters at all, you will get a SqlTool session with no JDBC Connection. You will obviously need to use \j before doing any database work.

                  Using Inline RC Authentication

                  Inline RC authentication setup is accomplished by using the --inlineRc command-line switch on SqlTool. The --inlineRc command-line switch takes a comma-separated list of key/value elements. The url and user elements are required. The rest are optional. The --inlineRc switch is the only case where you can give SQL file paths without a preceding urlid indicator (an urlid or -). The program knows not to look for an urlid if you give an inline.

                  Since commas are used to separate each name=value pair, you must do some extra work for any commas inside of the values of any name=values. Escape them by proceeding them with backslash, like "myName=my\p,value" to inform SqlTool that the comma is part of the value and not a name/value separator.

                  url

                  The JDBC URL of the database you wish to connect to.

                  user

                  The username to connect to the database as.

                  charset

                  Sets the character encoding. Overrides the platform default, or what you have set by env variables or Java system properties. (Does not effect stdin or stdout).

                  truststore

                  The TLS trust keystore file path as documented in the TLS chapter. Relative paths will be resolved relative to the current directory.

                  transiso

                  java.sql.Connection transaction isolation level to connect with, as specified in the Java API spec.

                  password

                  You may only use this element to set empty password, like

                      password=

                  For any other password value, omit the password element and you will be prompted for the value.

                  (Use the --driver switch instead of --inlineRc to specify a JDBC driver class). Here is an example of invoking SqlTool to connect to a standalone database.

                  java -jar $HSQLDB_HOME/lib/sqltool.jar --inlineRc=url=jdbc:hsqldb:file:/home/dan/dandb,user=dan

                  For security reasons, you cannot specify a non-empty password as an argument. You will be prompted for a password as part of the login process.

                  Logging

                  Both the \l command and all warnings and error messages now use a logging facility. The logging facility hands off to Log4j if Log4j is found in the classpath, and otherwise will hand off to java.util.logging. The default behavior of java.util.logging should work fine for most users. If you are using log4j and are redirecting with pipes, you may want to configure a Console Appender with target of "System.err" so that error output will go to the error stream (all console output for java.util.logging goes to stderr by default). See the API specs for Log4j and for J2SE for how to configure either product. If you are embedding SqlTool in a product to process SQL files, I suggest that you use log4j. java.util.logging is neither scalable nor well-designed.

                  Run the command \l? to see how to use the logging command \l in your SQL files (or interactively), including what logging levels you may specify.

                  Interactive Usage

                  Do read the The Bare Minimum section before you read this section.

                  You run SqlTool interactively by specifying no SQL filepaths on the SqlTool command line. Like this.

                      java -jar $HSQLDB_HOME/lib/sqltool.jar urlid

                  Procedure 1.3. What happens when SqlTool is run interactively (using all default settings)

                  1. SqlTool starts up and connects to the specified database, using your SqlTool configuration file (as explained in the RC File Authentication Setup section).

                  2. SQL file auto.sql in your home directory is executed (if there is one),

                  3. SqlTool displays a banner showing the SqlTool and SqlFile version numbers and describes the different command types that you can give, as well as commands to list all of the specific commands available to you.

                  You exit your session by using the "\q" special command or ending input (like with Ctrl-D or Ctrl-Z).

                  [Important]Important

                  Any command may be preceded by space characters. Special Commands, Edit Buffer Commands, PL Commands, Macros always consist of just one line.

                  These rules do not apply at all to Raw Mode. Raw mode is for use by advanced users when they want to completely bypass SqlTool processing in order to enter a chunk of text for direct transmission to the database engine.

                  SqlTool Command-Line Editing

                  If you are really comfortable with grep, perl, or vim, you will instantly be an expert with SqlTool command-line editing. Due to limitations of Java I/O, we can't use up-arrow recall, which many people are used to from DosKey and Bash shell. If you don't know how to use regular expressions, and don't want to learn how to use them, then just forget command-recall. (Actually DosKey does work from vanilla Windows MSDOS console windows. Be aware that it suffers from the same 20-year old quirks as DOS command-line editing. Very often the command line history will get shifted and you won't be able to find the command you want to recall. Usually you can work around this by typing a comment... "::" to DOS or "--" to SqlTool then re-trying on the next command line).

                  Basic command entry (i.e., without regexps)

                  • Just type in your command, and use the backspace-key to fix mistakes on the same line.
                  • If you goof up a multi-line command, just hit the ENTER key twice to start over. (The command will be moved to the buffer where it will do no harm).
                  • Use the ":h" command to view your command history. You can use your terminal emulator scroll bar and copy and paste facility to repeat commands.
                  • As long as you don't need to change text that is already in a command, you can easily repeat commands from the history like ":14;" to re-run command number 14 from history.
                  • Expanding just a bit from the previous item, you can add on to a previous command by running a command like ":14a" (where the "a" means append).
                  • See the Macros section about how to set and use macros.

                  If you use regular expressions to search through your command history, or to modify commands, be aware that the command type of commands in history are fixed. You can search and modify the text after a \ or * prefix (if any), but you can't search on or change a prefix (or add or remove one).

                  Command Types

                  When you are typing into SqlTool, you are always typing part of the immediate command. If the immediate command is an SQL statement, it is executed as soon as SqlTool reads in the trailing (unquoted) semi-colon. Commands of the other command types are executed as soon as you hit ENTER. The interactive : commands can perform actions with or on the edit buffer. The edit buffer usually contains a copy of the last command executed, and you can always view it with the :b command. If you never use any : commands, you can entirely ignore the edit buffer. If you want to repeat commands or edit previous commands, you will need to work with the edit buffer. The immediate command contains whatever (and exactly what) you type. The command history and edit buffer may contain any type of command other than comments and : commands (i.e., : commands and comments are just not copied to the history or to the edit buffer).

                  Hopefully an example will clarify the difference between the immediate command and the edit buffer. If you type in the edit buffer Substitution command ":s/tbl/table/", the :s command that you typed is the immediate command (and it will never be stored to the edit buffer or history, since it is a : command), but the purpose of the substitution command is to modify the contents of the edit buffer (perform a substitution on it)-- the goal being that after your substitutions you would execute the buffer with the ":;" command. The ":a" command is special in that when you hit ENTER to execute it, it copies the contents of the edit buffer to a new immediate command and leaves you in a state where you are appending to that immediate command (nearly) exactly as if you had just typed it in.

                  Emulating Non-Interactive mode

                  You can run SqlTool interactively, but have SqlTool behave exactly as if it were processing an SQL file (i.e., no command-line prompts, error-handling that defaults to fail-upon-error, etc.). Just specify "-" as the SQL file name in the command line. This is a good way to test what SqlTool will do when it encounters any specific command in an SQL file. See the Piping and shell scripting subsection of the Non-Interactive chapter for an example.

                  Command Types

                  Command types

                  SQL Statement

                  Any command that you enter which does not begin with "\", ":", "* " or "/" is an SQL Statement. The command is not terminated when you hit ENTER, like most OS shells. You terminate SQL Statements with either ";" or with a blank line. In the former case, the SQL Statement will be executed against the SQL database and the command will go into the edit buffer and SQL command history for editing or viewing later on. In the former case, execute against the SQL database means to transmit the SQL text to the database engine for execution. In the latter case (you end an SQL Statement with a blank line), the command will go to the edit buffer and SQL history, but will not be executed (but you can execute it later from the edit buffer).

                  (Blank lines are only interpreted this way when SqlTool is run interactively. In SQL files, blank lines inside of SQL statements remain part of the SQL statement).

                  As a result of these termination rules, whenever you are entering text that is not a Special Command, Edit Buffer / History Command, or PL Command, you are always appending lines to an SQL Statement or comment. (In the case of the first line, you will be appending to an empty SQL statement. I.e. you will be starting a new SQL Statement or comment).

                  Special Command

                  Run the command "\?" to list the Special Commands. All of the Special Commands begin with "\". I'll describe some of the most useful Special Commands below.

                  Edit Buffer / History Command

                  Run the command ":?" to list the Edit-Buffer/History Commands. All of these commands begin with ":". These commands use commands from the command history, or operate upon the edit "buffer", so that you can edit and/or (re-)execute previously entered commands.

                  PL Command

                  Procedural Language commands. Run the command "*?" to list the PL Commands. All of the PL Commands begin with "*". PL commands are for setting and using scripting variables and conditional and flow control statements like * if and * while. A few PL features (such as macros and updating and selecting data directly from/to files) can be a real convenience for nearly all users, so these features will be discussed briefly in this section. More detailed explanation of PL variables and the other PL features, with examples, are covered in the SqlTool Procedural Language section.

                  Macro Command

                  Macro definition and usage commands. Run the command "/?" to show the define, list, or use macros.

                  Raw Mode

                  The descriptions of command-types above do not apply to Raw Mode. In raw mode, SqlTool doesn't interpret what you type at all. It all just goes into the edit buffer which you can send to the database engine. Beginners can safely ignore raw mode. You will never encounter it unless you run the "\." special command, or define a stored procedure or function. See the Raw Mode section for the details.

                  Special Commands

                  Essential Special Commands

                  \?

                  In-program Help. Run this to show ALL available Special Commands instead of just the subset listed here!

                  \q

                  Quit

                  \j...

                  View JDBC Data Source details or connect up to a JDBC Data Source (replacing the current connection, if any). Run \? to see the syntax for the different usages.

                  \i path/to/script.sql

                  Execute the specified SQL script, then continue again interactively. Since SqlTool is a Java program, you can safely use forward slashes in your file paths, regardless of your operating system. You can use Java system properties like ${user.home}, PL variables like *{this} and @ in your file paths. The last is mostly useful for \i statements inside of SQL files, where it means the directory containing the current script.

                  \c true (or false)

                  Change error-handling (Continue-on-error) behavior from the default. By default when SqlTool is run interactively, errors will be reported but SqlTool will continue to process subsequent commands. By default when SqlTool is run non-interactively, errors will also cause SqlTool to stop processing the current stream (like stdin) or SQL file. The default settings are usually what is desired, except for SQL scripts which need to abort upon failures, even when invoked manually (including for interactive testing purposes).

                  \=

                  Commit the current SQL transaction. Most users are used to typing the SQL statement commit;, but this command is crucial for those databases which don't support the statement. It's obviously unnecessary if you have auto-commit mode on.

                  \m?

                  List a summary of DSV and CSV importing, and all available options for them. You can use variables in the file path specifications, as described for the \i command above.

                  \x?

                  Ditto.

                  \mq?

                  Ditto.

                  \xq?

                  Ditto.

                  \d?

                  List a summary of the \d commands below.

                  \dt [filter_substring]

                  \dv [filter_substring]

                  \ds [filter_substring]

                  \di [table_name]

                  \dS [filter_substring]

                  \da [filter_substring]

                  \dn [filter_substring]

                  \du [filter_substring]

                  \dr [filter_substring]

                  \d* [filter_substring]

                  Lists available objects of the given type.

                  • t: non-system Tables
                  • v: Views
                  • s: Sequences
                  • i: Indexes
                  • S: System tables
                  • a: Aliases
                  • n: schema Names
                  • u: database Users
                  • r: Roles
                  • *: all table-like objects

                  If your database supports schemas, then the schema name will also be listed.

                  If you supply an optional filter substring, then only items which match the specified substring. will be listed. In most cases, the specified filter will be treated as a regular expression matched against the candidate object names. In order to take advantage of extreme server-side performance benefits, however, in some cases the substring is passed to the database server and the filter will processed by the server.

                  [Important]The regexp test is case-sensitive!

                  Even though in SQL queries and for the "\d objectname" command object names are usually case-insensitive, for the \dX commands, you must capitalize the filter substring exactly as it will appear in the special command output. This is an inconvenience, since the database engine will change names in SQL to default case unless you double-quote the name, but that is server-side functionality which cannot (portably) be reproduced by SqlTool. You can use spaces and other special characters in the string.

                  [Tip]Schema-narrowed Filter Specs

                  Filter substrings ending with "." are special. If a substring ends with ".", then this means to narrow the search by the exact, case-sensitive schema name given. For example, if I run "\d* BLAINE.", this will list all table-like database objects in the "BLAINE" schema. The capitalization of the schema must be exactly the same as how the schema name is listed by the "\dn" command. You can use spaces and other special characters in the string. (I.e., enter the name exactly how you would enter it inside of double-quotes in an SQL command). This is an inconvenience, since the database engine will change names in SQL to default case unless you double-quote the name, but that is server-side functionality which cannot (portably) be reproduced by SqlTool.

                  [Tip]Current-Schema Filter Spec

                  The filter string "." (just a plain dot) means the current session schema, for databases which support the concept according to the SQL standard (HyperSQL database does).

                  [Important]Searching for Indexes

                  Indexes may not be searched for by substring, only by exact target table name. So if I1 is an index on table T1, then you list this index by running "\di T1". In addition, many database vendors will report on indexes only if a target table is identified. Therefore, "\di" with no argument will fail if your database vendor does not support it.

                  \d objectname [[/]regexp]

                  Lists names of columns in the specified table or view. objectname may be a base table name or a schema.object name.

                  If you supply a filter string, then only columns with a name matching the given regular expression will be listd. (If no special characters are used, this just means that names containing the specified substring will match). You'll find this filter is a great convenience compared to other database utilities, where you have to list all columns of large tables when you are only interested in one of them.

                  To narrow the displayed information based on all column outputs, instead of just the column names, just prefix the expression with /. For example, to list all INTEGER columns, you could run \d mytable /INTEGER.

                  [Tip]Tip

                  When working with real data (as opposed to learning or playing), I often find it useful to run two SqlTool sessions in two side-by-side terminal emulator windows. I do all of my real work in one window, and use the other mostly for \d commands. This way I can refer to the data dictionary while writing SQL commands, without having to scroll.

                  This list here includes only the essential Special Commands, but n.b. that there are other useful Special Commands which you can list by running \?. (You can, for example, execute SQL from external SQL files, and save your interactive SQL commands to files). Some specifics of these other commands are specified immediately below, and the Generating Text or HTML Reports section explains how to use the "\o" and "\h" special commands to generate reports.

                  Be aware that the \! Special Command does not work for external programs that read from standard input. You can invoke non-interactive and graphical interactive programs, but not command-line interactive programs.

                  SqlTool executes \! programs directly, it does not run an operating system shell (this is to avoid OS-specific code in SqlTool). Because of this, you can give as many command-line arguments as you wish, but you can't use shell wildcards or redirection.

                  Edit Buffer / History Commands

                  Edit Buffer / History Commands

                  :?

                  IN-program Help

                  :b

                  List the current contents of the edit buffer.

                  :h

                  Shows the Command History. For each command which has been executed (up to the max history length), the SQL command history will show the command; its command number (#); and also how many commands back it is (as a negative number). : commands are never added to the history list. You can then use either form of the command identifier to recall a command to the edit buffer (the command described next) or as the target of any of the following : commands. This last is accomplished in a manner very similar to the vi editor. You specify the target command number between the colon and the command. As an example, if you gave the command :s/X/Y/, that would perform the substitution on the contents of the edit buffer; but if you gave the command :-3 s/X/Y/, that would perform the substitution on the command 3 back in the command history (and copy the output to the edit buffer). Also, just like vi, you can identify the command to recall by using a regular expression inside of slashes, like :/blue/ s/X/Y/ to operate on the last command you ran which contains "blue".

                  :13 OR :-2 OR :/blue/

                  Recalls a command from Command history to the edit buffer. Enter ":" followed by the positive command number from Command history, like ":13"... or ":" followed by a negative number like ":-2" for two commands back in the Command history... or ":" followed by a regular expression inside slashes, like ":/blue/" to recall the last command which contains "blue". The specified command will be written to the edit buffer so that you can execute it or edit it using the commands below.

                  As described under the :h command immediately above, you can follow the command number here with any of the commands below to perform the given operation on the specified command from history instead of on the edit buffer contents. So, for example, ":4;" would load command 4 from history then execute it (see the ":;" command below).

                  :;

                  Executes the SQL, Special or PL statement in the edit buffer (by default). This is an extremely useful command. It's easy to remember because it consists of ":", meaning Edit Buffer Command, plus a line-terminating ";", (which generally means to execute an SQL statement, though in this case it will also execute a special or PL command).

                  :a

                  Enter append mode with the contents of the edit buffer (by default) as the current command. When you hit ENTER, things will be nearly exactly the same as if you physically re-typed the command that is in the edit buffer. Whatever lines you type next will be appended to the immediate command. As always, you then have the choice of hitting ENTER to execute a Special or PL command, entering a blank line to store back to the edit buffer, or end a SQL statement with semi-colon and ENTER to execute it.

                  You can, optionally, put a string after the :a, in which case things will be exactly as just described except the additional text will also be appended to the new immediate command. If you put a string after the :a which ends with ;, then the resultant new immediate command will just be executed right away, as if you typed in and entered the entire thing.

                  If your edit buffer contains SELECT x FROM mytab and you run a:le, the resultant command will be SELECT x FROM mytable. If your edit buffer contains SELECT x FROM mytab and you run a: ORDER BY y, the resultant command will be SELECT x FROM mytab ORDER BY y. Notice that in the latter case the append text begins with a space character.

                  You may notice that you can't use the left-arrow or backspace key to back up over the original text. This is due to Java and portability constraints. If you want to edit existing text, then you shouldn't use the Append command.

                  :s/from regex/to string/switches

                  The Substitution Command is the primary method for SqlTool command editing-- it operates upon the current edit buffer by default. The "to string" and the "switches" are both optional (though the final "/" is not). To start with, I'll discuss the use and behavior if you don't supply any substitution mode switches.

                  Don't use "/" if it occurs in either "from string" or "to string". You can use any character that you want in place of "/", but it must not occur in the from or to strings. Example

                      :s@from string@to string@

                  The to string is substituted for the first occurrence of the (case-specific) from string. The replacement will consider the entire SQL statement, even if it is a multi-line statement.

                  In the example above, the from regex was a plain string, but it is interpreted as a regular expression so you can do all kinds of powerful substitutions. See the perlre man page, or the java.util.regex.Pattern API Spec for everything you need to know about extended regular expressions.

                  Don't end a to string with ";" in attempt to make a command execute. There is a substitution mode switch to use for that purpose.

                  You can use any combination of the substitution mode switches.

                  • Use "i" to make the searches for from regex case insensitive.

                  • Use "g" to substitute Globally, i.e., to substitute all occurrences of the from regex instead of only the first occurrence found.

                  • Use ";" to execute the command immediately after the substitution is performed.

                  • Use "m" for ^ and $ to match each line-break in a multi-line edit buffer, instead of just at the very beginning and every end of the entire buffer.

                  If you specify a command number (from the command history), you end up with a feature very reminiscent of vi, but even more powerful, since the Perl/Java regular expression are a superset of the vi regular expressions. As an example,

                      :24 s/pin/needle/g;

                  would start with command number 24 from command history, substitute "needle" for all occurrences of "pin", then execute the result of that substitution (and this final statement will of course be copied to the edit buffer and to command history).

                  :w /path/to/file.sql

                  This appends the contents of the current buffer (by default) to the specified file. Since what is being written are Special, PL, or SQL commands, you are effectively creating an SQL script. To write some previous command to a file, just restore the command to the edit buffer with a command like ":-4" before you give the :w command.

                  I find the ":/regex/" and ":/regex/;" constructs particularly handy for every-day usage.

                      :/\\d/;

                  re-executes the last \d command that you gave (The extra "\" is needed to escape the special meaning of "\" in regular expressions). It's great to be able to recall and execute the last "insert" command, for example, without needing to check the history or keep track of how many commands back it was. To re-execute the last insert command, just run ":/insert/;". If you want to be safe about it, do it in two steps to verify that you didn't accidentally recall some other command which happened to contain the string "insert", like

                      :/insert/
                      :;

                  (Executing the last only if you are satisfied when SqlTool reports what command it restored). Often, of course, you will want to change the command before re-executing, and that's when you combine the :s and :a commands.

                  We'll finish up with a couple fine points about Edit/Buffer commands. You generally can't use PL variables in Edit/Buffer commands, to eliminate possible ambiguities and complexities when modifying commands. The :w command is an exception to this rule, since it can be useful to use variables to determine the output file, and this command does not do any "editing".

                  The :? in-program help explains how you can change the default regular expression matching behavior (case sensitivity, etc.), but you can always use syntax like "(?i)" inside of your regular expression, as described in the Java API spec for class java.util.regex.Pattern. History-command-matching with the /regex/ construct is purposefully liberal, matching any portion of the command, case sensitive, etc., but you can still use the method just described to modify this behavior. In this case, you could use "(?-i)" at the beginning of your regular expression to be case-sensitive.

                  Command History

                  The SQL history shown by the :h command, and used by other commands, is truncated to 100 entries, since its utility comes from being able to quickly view the history list. You can change the history length by setting the system property sqltool.historyLength to the desire integer value (using any of the System Property mechanisms provided by Java). If there is any demand, I'll make the setting of this value more convenient.

                  The SQL history list contains all executed commands other than Edit Buffer commands and comments, even if the command has a syntax error or fails upon execution. The reason for including bad commands is so that you can recall and fix them if you wish to. The same applies to the edit buffer. If you copy a command to the edit buffer by entering blank line, or if you edit the edit buffer, that edit buffer value will never make it into the command history until and if you execute it.

                  PL Commands

                  Essential PL Command

                  * ?

                  In-program Help about using the PL variables which have been set. Use this command!

                  * ? assign

                  In-program Help about setting and unsetting PL variables. Use this command!

                  * VARNAME = value

                  Set the value of a variable. If the variable doesn't exist yet, it will be created. The most common use for this is so that you can later use it in math expressions like VARNAME, in logical (conditionally) expressions like *{VARNAME}, or in other commands (including SQL) like *{VARNAME} or *{:VARNAME} construct. The only difference between *{literal} and *{:VARNAME} is that the former produces an error if VARNAME is not set, whereas the latter will expand to a zero-length string if VARNAME is not set.

                  [Important]Preventing unset-variable Errors

                  You can prevent all unset-variable errors by using the construct *{:VARNAME} in place of *{VARNAME} wherever VARNAME may not then be set.

                  [Warning]Warning

                  With the current version of SqlTool, you can't use this assignment command to set the value of a variable to the empty string unless you set Java system property sqltool.REMOVE_EMPTY_VARS to false. We are talking about assignments like the following:

                      * VARNAME =

                  If sqltool.REMOVE_EMPTY_VARS is set to false, then the assignment shown assigns the empty string. Otherwise, the assignment shown unsets the variable (which is equivalent to setting it to be null). You are encouraged to set sqltool.REMOVE_EMPTY_VARS to false, because this will become the default behavior of SqlTool shortly (i.e. even if you don't set the system property). Regardless of sqltool.REMOVE_EMPTY_VARS, you can always use the unset command (described next) to unset variables, and you can always use command line switches -P or --setVar to assign empty strings.

                  See Variables subsection for information about variable usage.

                  * - VARNAME

                  Unset (remove) the specified variable.

                  * VARNAME _

                  When next SQL command is run, instead of displaying the rows, just store the very first column value to variable VARNAME. This works for CLOB columns too. It also works with Oracle XML type columns if you use column labels and the getclobval function. If the SQL null value is retrieved next, then this variable will be assigned the value null, which is the same thing as unsetting it. It's easy to tell when a variable is set to null vs. when it is set to the empty string. See the Nulls and Empty Strings section about that.

                  * ? control

                  In-program Help about PL control/branching commands. Use this command!

                  * if (LOGICAL EXPR)

                  If the logical expression evaluates to true, then the following block of code (up to the paired * end if statement is executed. If the expression is false, then the same code block is skipped. Run * ? control for details, including the optional * else statement, a short-cut inline if statement, and several other branching statements.

                  This list here includes only a sampling of some essential PL Commands, but there are many other useful PL Commands which you can list by running * ?.

                  PL variables are intimately involved with most PL commands, and (and with some Special commands). Even if you never assign a PL variable, if you are at technical level of using PL commands, you should at least know how to check SqlTool system PL variables which effect SqlTool's behavior. See the Nulls and Empty Strings section about that.

                  Non-Interactive

                  Read the Interactive Usage section if you have not already, because much of what is in this section builds upon that. You can skip all discussion about Command History and the edit buffer if you will not use those interactive features. (Except the important exception that the edit buffer is still populated by executed commands and raw mode, so the buffer can be used by * VARNAME :, /: VARNAME, \x :, and \xq : commands).

                  The previous point brings us to another important consideration for SQL script writers. When SqlTool is run interactively, you can enter a blank line after a SQL command to send the command to the edit buffer without executing it. That action is not supported in scripts, however, because scripters expect more freedom in usage of white space. I.e., scripters should be able to add blank lines wherever they want to in their scripts-- and they can. The problem is, defining variables or macros or performing exports using multi-line SQL statements requires the multi-line SQL statements in the edit buffer. One way to do these commands into the buffer is to execute the SQL command, but usually you do not want the SQL to execute until expansion or execution time of the variable/macro/export. The empty-line method only works in interactive mode. What we use is Raw Mode. This works great both interactively and non-interactively, and it supports Chunking without having to format your SQL in a special way. A great application of this is to put multi-line macro and function definitions into your auto.sql file.

                  SqlTool system PL variables control behavior (for example, they control many aspects of DSV importing and exporting). User PL variables can be used to make your scripts dynamic and for conditional actions. Both system and user PL variables can be set by --setVar and -p switches, or PL commands in --sql switches or SQL files (as well as in auto.sql for interactive usage). Since the variables are all global and shared across contexts, the variables thus set effect behavior of all subsequence content in --sql switches and SQL files (and auto.sql and stdin for interactive usage). See the Variables subsection for the particulars.

                  [Important]Remember to Commit

                  If you're doing data updates, remember to issue a commit command or use the --autoCommit switch.

                  As you'll see, SqlTool has many features that are very convenient for scripting. But what really makes it superior for automation tasks (as compared to SQL tools from other vendors) is the ability to reliably detect errors and to control JDBC transactions. SqlTool is designed so that you can reliably determine if errors occurred within SQL scripts themselves, and from the invoking environment (for example, from a Perl, Bash, or Python script, or a simple cron tab invocation).

                  Giving SQL on the Command Line

                  If you just have a couple Commands to run, you can run them directly from the comand-line or from a shell script without an SQL file, like this.

                  java -jar $HSQLDB_HOME/lib/sqltool.jar --sql="SQL statement;" urlid

                  [Note]Note

                  The --sql switch automatically implies --noinput, so if you want to execute the specified SQL before and in addition to an interactive session (or stdin piping), then you must also give the --stdinput switch.

                  Since SqlTool transmits SQL statements to the database engine only when a line is terminated with ";", if you want feedback from multiple SQL statements in an --sql expression, you will need to use functionality of your OS shell to include linebreaks after the semicolons in the expression. With any Bourne-compatible shell, you can include linebreaks in the SQL statements like this.

                      java -jar $HSQLDB_HOME/lib/sqltool.jar --sql='
                          SQL statement number one;
                          * NEWVAR = something
                          \p A SqlTool Special command which echoes NEWVAR: *{NEWVAR}
                              number two;
                          SQL statement three;
                      ' urlid

                  Notice that the SQL string is not strictly SQL, but SqlTool input, so it may contain Special or PL commands. The variable is set this way only for educational purposes. The same thing could be accomplished more elegantly by using the -p switch.

                  [Note]Note

                  The multi-line examples in this section will only work as-is with a Bourne-compatible shell. With some ugliness they can be converted to C shell. For Windows, you are better off to stick with SQL files for multi-line input.

                  If you don't need feedback, just separate the SQL commands with semicolons and the entire expression will be chunked.

                  The --sql switch is very useful for setting shell variables to the output of SQL Statements, like this.

                      # A shell script
                      USERCOUNT=`java -jar $HSQLDB_HOME/lib/sqltool.jar --sql='
                          select count(*) from usertbl;
                      ' urlid` || {
                          # Handle the SqlTool error
                      }
                      echo "There are $USERCOUNT users registered in the database."
                      [ "$USECOUNT" -gt 3 ] && {   # If there are more than 3 users registered
                          # Some conditional shell scripting

                  SQL Files

                  Just give paths to sql text file(s) on the command line after the urlid.

                  Often, you will want to redirect output to a file, like

                   java -jar $HSQLDB_HOME/lib/sqltool.jar urlid file.sql... > /tmp/file.log 2>&1

                  You can also execute SQL files from an interactive session with the "\i"' Special Command, but be aware that the default behavior in an interactive session is to continue upon errors. If the SQL file was written without any concern for error handling, then the file will continue to execute after errors occur. You could run \c false before \i filename, but then your SqlTool session will exit if an error is encountered in the SQL file. If you have an SQL file without error handling, and you want to abort that file when an error occurs, but not exit SqlTool, the easiest way to accomplish this is usually to add \c false to the top of the script.

                  If you specify multiple SQL files on the command-line, the default behavior is to exit SqlTool immediately if any of the SQL files encounters an error.

                  SQL files themselves have ultimate control over error handling. Regardless of what command-line options are set, or what commands you give interactively, if a SQL file contains error handling statements, they will take precedence.

                  You can also use \i in SQL files to pull in (nest) additional SQL files. This is a powerful way to hierarchically maintain and configuration manage a set of scripts for a product, project, or database. For encapsulation, tracking, and collaboration purposes, it's usually best to keep each SQL script focused on one task or goal, for example: creating a table, it's trigger, and loading initial data from a DSV file. Usually a set of such scripts will have to be executed in a precise order so that referenced tables are created before tables with foreign keys to them, etc. I make a super-script for every database project that I manage. Besides this strategy proving and configuration managing an installation procedure known to work, I can recreate large and complex, custom product databases for deployments or tests in seconds. With the addition of some very simple PL coding, I can re-create all database structures in a parallel schema by just specifying a schema name when I invoke the super-script.

                  Only for interactive SqlTool invocations, the file auto.sql in your home directory will be executed before your typed (or piped) input. It is processed in the same way as a script file specified on the command-line except that since you are running SqlTool interactively, the interactive SqlTool rules will apply. If your auto.sql does setup that you need done for non-interactive SQL files, then add a \i ${user.home}/auto.sql to the top of the script, understanding that if you execute that script interactively you will cause auto.sql to be executed a second time, but see the following tip about preventing that.

                  [Tip] Preventing redundant execution of utility or shared scripts.

                  There's a common idiom used in UNIX login and shell initialization scripts that prevents redundant executions, and it works great for SqlTool too. Think up a unique PL variable name which will keep track of whether the script has been sourced in the current SqlTool session, and the script will have no effect if called a 2nd, 3rd, etc. time. This example applies the idiom to an auto.sql file, but it can be used in any script that you want to prevent superfluous executions in a developer-friendly way.

                      * if (*AUTO_EXECUTED)
                          * break
                      * end if
                      * AUTO_EXECUTED = true

                  It would be slightly more efficient, but less reliable, to put the test on the caller's side instead of the callee side, like this:

                      * if (! *AUTO_EXECUTED)
                          * \i ${user.home}/auto.sql
                      * end if

                  As you would probably guess, all of SQL's file commands (for example loading or saving SQL scripts, binary data, DSV data) take either relative or absolute file paths. However, when you nest scripts, you will usually want to begin your paths with the @/. The initial @ character in file paths means the directory containing the current script. This is important because of Java's frustrating inability to switch the current directory. By using @, you can cross-reference between SQL scripts in one or several co-located directories, and everything will just work, regardless of your current directory when you invoke script(s).

                  [Tip]Make use of @/ construct for CMD scripts with nesting

                  If you use a managed set of nested scripts, you are advised to prefix all relative file paths inside of SqlTool scripts with @/. Without this, relative file paths would be resolved relative to the invocation directory-- making your scripts require a specific invocation directory. The at character will resolve to the directory containing the current script.

                  You can use the following SQL file, sample/sample.sql, from your HyperSQL distribution [1]. It contains SQL as well as Special Commands making good use of most of the Special Commands documented below.

                  /*
                      $Id: sample.sql 3637 2010-06-07 00:59:13Z unsaved $
                      Exemplifies use of SqlTool.
                      PCTASK Table creation
                  */
                  
                  /* Ignore error for these two statements */
                  \c true
                  DROP TABLE pctasklist;
                  DROP TABLE pctask;
                  \c false
                  
                  \p Creating table pctask
                  CREATE TABLE pctask (
                      id integer identity,
                      name varchar(40),
                      description varchar(256),
                      url varchar(80),
                      UNIQUE (name)
                  );
                  
                  \p Creating table pctasklist
                  CREATE TABLE pctasklist (
                      id integer identity,
                      host varchar(20) not null,
                      tasksequence int not null,
                      pctask integer,
                      assigndate timestamp default current_timestamp,
                      completedate timestamp,
                      show boolean default true,
                      FOREIGN KEY (pctask) REFERENCES pctask,
                      UNIQUE (host, tasksequence)
                  );
                  
                  \p Granting privileges
                  GRANT select ON pctask TO public;
                  GRANT all ON pctask TO tomcat;
                  GRANT select ON pctasklist TO public;
                  GRANT all ON pctasklist TO tomcat;
                  
                  \p Inserting test records
                  INSERT INTO pctask (name, description, url) VALUES (
                      'task one', 'Description for task 1', 'http://cnn.com');
                  INSERT INTO pctasklist (host, tasksequence, pctask) VALUES (
                      'admc-masq', 101, (SELECT id FROM pctask WHERE name = 'task one'));
                  
                  commit;
                  

                  You can execute this SQL file with a Memory Only database with a command like

                      java -jar $HSQLDB_HOME/lib/sqltool.jar  --sql='
                          create user tomcat password "x";
                      ' mem path/to/hsqldb/sample/sample.sql

                  This shows how you can mix SQL on the command line, and SQL inside an SQL file.

                  [Note]Note

                  The example above uses Bourne shell syntax. C shell syntax would be similar. You would need to use an SQL file to accomplish this on Windows.

                  (The --sql="create...;" argument in the example creates an account which the following script uses). You should see error messages between the Continue-on-error...true and Continue-on-error...false. The script purposefully runs commands that might fail there. The reason the script does this is to perform database-independent conditional table removals. (The SQL clause IF EXISTS is more graceful and succinct, so you may want to use that if you don't need to support databases which don't support IF EXISTS). If an error occurs when continue-on-error is false, the script would abort immediately.

                  Piping and shell scripting

                  You can of course, redirect output from SqlTool to a file or another program.

                  java -jar $HSQLDB_HOME/lib/sqltool.jar urlid file.sql > file.txt 2>&1
                  
                  java -jar $HSQLDB_HOME/lib/sqltool.jar urlid file.sql 2>&1 | someprogram...

                  You can type commands in to SqlTool while being in non-interactive mode by supplying "-" as the file name. This is a good way to test how SqlTool will behave when processing your SQL files.

                      java -jar $HSQLDB_HOME/lib/sqltool.jar urlid -

                  This is how you have SqlTool read its input from another program:

                  Example 1.2. Piping input into SqlTool

                      echo "Some SQL commands with '$VARIABLES';" |
                      java -jar $HSQLDB_HOME/lib/sqltool.jar urlid -


                  Example 1.3. Redirecting input into SqlTool

                      java -jar $HSQLDB_HOME/lib/sqltool.jar urlid - < myFile.sql


                  For a shell not as graceful as the Bourne-compatible shells, you would need to type this all on the same line (or use a line-continuation trick).

                  [Warning]Warning

                  Beware of null stdin to SqlTool (or SqlFile). At least with Java 6 on UNIX, System.in returns megabytes of garbage for reads if stdin is closed. I consider this an obvious bug. Therefore, unlike any other program you would invoke from scripts, check stdin before running any Java program that will read from it. I consider this a big ugly bug in Java. This is not just theoretical, because many remote execution environments will have stdin closed off.

                  Make sure that you also read the Giving SQL on the Command Line section. The --sql and -p switches are great facilities to use with shell scripts.

                  Automation

                  SqlTool is ideal for mission-critical automation because, unlike other SQL tools, SqlTool returns a dependable exit status and gives you control over error handling and SQL transactions. Autocommit is off by default, so you can build a completely dependable solution by intelligently using \c commands (Continue upon Errors) and commit statements, and by verifying exit statuses.

                  Using the SqlTool Procedural Language, you have ultimate control over program flow, and you can use variables for database input and output as well as for many other purposes. See the SqlTool Procedural Language section.

                  [Tip]Tip

                  Since SqlTool religiously returns meaningful exit status, you can use the following idiom to send alerts about failed batch jobs (for example, jobs started by cron, at, AutoSys, Quartz, Hudson).

                  Example 1.4. Error-handling Idiom

                  java -jar $HSQLDB_HOME/lib/sqltool.jar urlid $HOME/app/myFile.sql >> $HOME/log/app.log 2>&1 ||
                  echo "See log file y:$HOME/log/app.log" | mailx -s "App aborted on host y" recip1@z.com recip2@z.com

                  Optimally Compatible SQL Files

                  If you want your SQL scripts optimally compatible among other SQL tools, then don't use any Special or PL Commands. SqlTool has default behavior which I think is far superior to the other SQL tools, but you will have to disable these defaults in order to have optimally compatible behavior.

                  These switches provide compatibility at the cost of poor control and error detection.

                  • --continueOnErr=true

                    The output will still contain error messages about everything that SqlTool doesn't like (malformatted commands, SQL command failures, empty SQL commands), but SqlTool will continue to run. Errors will not cause rollbacks (but that won't matter because of the following setting).

                  • --autoCommit

                  You don't have to worry about accidental expansion of PL variables, since SqlTool will never expand PL variables if you don't set any variables on the command line, or give any "* " PL commands. (And you could not have "* " commands in a compatible SQL file).

                  Comments

                  Comments of the form /*...*/ or -- behave as a SQL programmer would expect, in all contexts other than in interactive edit/history commands.

                  If a comment occurs outside of an SQL statement, SqlTool will not send the comment to the database (to improve performance). Raw mode can be used to send just comments to the database. In order to proactively catch accidents, SqlTool will complain if you attempt to send an empty SQL statement (i.e., just whitespace) to the database, even in raw mode.

                  Special Commands and Edit Buffer Commands in SQL Files

                  Generally, don't use Edit Buffer / History Commands in your sql files, because they won't work. Edit Buffer / History Commands are for interactive use only. However, the important scripting commands * VARNAME :, /: VARNAME, \x :, and \xq :, as well as Raw Mode do use the edit buffer.

                  You can, of course, use any SqlTool command at all interactively. The goal here is just to group together the commands most useful to script-writers.

                  \q [abort message]

                  Be aware that the \q command will cause SqlTool to completely exit. If a script x.sql has a \q command in it, then it doesn't matter if the script is executed like

                      java -jar .../sqltool.jar urlid a.sql x.sql z.sql

                  or if you use \i to read it in interactively, or if another SQL file uses \i to nest it. If \q is encountered, SqlTool will quit. See the SqlTool Procedural Language section for commands to abort an SQL file (or even parts of an SQL file) without causing SqlTool to exit.

                  \q takes an optional argument, which is an abort message. If you give an abort message, the message is displayed to the user and SqlTool will exit with a failure status. If you give no abort message, then SqlTool will exit quietly with successful status. As a result,

                      \q

                  means to make an immediate but successful exit, whereas

                      \q Message

                  means to abort immediately with error status. Both commands will exit gracefully.

                  \p [text to print]

                  Print the given string to stdout. Just give "\p" alone to print a blank line.

                  \l SEVERITY_LEVEL text to log

                  The logging subsystem will display and/or log and/or email or whatever, depending on how you have it configured. To see where messages go by default, just play with it interactively. Run "\l?" to list the available severity levels.

                  \i /path/to/file.sql

                  Include another SQL file at this location. You can use this to nest SQL files. For database installation scripts I often have a master SQL file which includes all of the other SQL files in the correct sequence. Be aware that the current continue-upon-error behavior will apply to included files until such point as the SQL file runs its own error handling commands.

                  \o [file/path.txt]

                  Tee output to the specified file (or stop doing so). See the Generating Text or HTML Reports section.

                  \=

                  A database-independent way to commit your SQL session. Useful for database which have no COMMIT SQL statement.

                  \a [true|false]

                  This turns on and off SQL transaction autocommits. Auto-commit defaults to false, but you can change that behavior by using the --autoCommit command-line switch.

                  \c [true|false]

                  A "true" setting tells SqlTool to Continue when errors are encountered. The current transaction will not be rolled back upon SQL errors, so if \c is true, then run the ROLLBACK; command yourself if that's what you want to happen. The default for interactive use is to continue upon error, but the default for non-interactive use is to abort upon error. You can override this behavior by using the --continueOnErr command-line switch.

                  With database setup scripts, I usually find it convenient to set "true" before dropping tables (so that things will continue if the tables aren't there), then set it back to false so that real errors are caught. DROP TABLE tablename IF EXISTS; is a more elegant, but less portable, way to accomplish the same thing.

                  [Tip]Tip

                  It depends on what you want your SQL files to do, of course, but I usually want my SQL files to abort when an error is encountered, without necessarily killing the SqlTool session. If this is the behavior that you want, then put an explicit \c false at the top of your SQL file and turn on continue-upon-error only for sections where you really want to permit errors, or where you are using PL commands to handle errors manually. This will give the desired behavior whether your script is called by somebody interactively, from the SqlTool command-line, or included in another SQL file (i.e. nested).

                  [Important]Important

                  The default settings are usually best for people who don't want to put in any explicit \c or error handling code at all. If you run SQL files from the SqlTool command line, then any errors will cause SqlTool to roll back and abort immediately. If you run SqlTool interactively and invoke SQL files with \i commands, the scripts will continue to run upon errors (and will not roll back). This behavior was chosen because there are lots of SQL files out there that produce errors which can be ignored; but we don't want to ignore errors that a user won't see. I reiterate that any and all of this behavior can (and often should) be changed by Special Commands run in your interactive shell or in the SQL files. Only you know whether errors in your SQL files can safely be ignored.

                  Getting Interactive Functionality with SQL Files

                  Some script developers may run into cases where they want to run with sql files but they also want SqlTool's interactive behavior. For example, they may want to do command recall in the sql file, or they may want to log SqlTool's command-line prompts (which are not printed in non-interactive mode). In this case, do not give the sql file(s) as an argument to SqlTool, but pipe them in instead, like

                  java -jar $HSQLDB_HOME/lib/sqltool.jar urlid < filepath1.sql > /tmp/log.html 2>&1

                  or

                  cat filepath1.sql... |
                  java -jar $HSQLDB_HOME/lib/sqltool.jar urlid > /tmp/log.html 2>&1

                  For a shell not as graceful as the Bourne-compatible shells, you would need to type this all on the same line (or use a line-continuation trick).

                  Character Encoding

                  There are several levels of encoding settings. First there are your platform defaults. These can be changed, temporarily or permanently, with system settings or environmental variables. Java system properties may be used to change the encodings for the JVM run. Finally, can specify a different encoding in your RC file, as documented in the RC File Authentication Setup section, though these will not effect stdin or stdout (as explained there). Programmatic users of SqlFile have complete control over encoding by setting up Readers and PrintWriters, or by using constructors with an encoding parameter. Developers should understand that where a SqlFile constructor takes a Reader or a PrintWriter parameter, we will not apply encoding settings to them, leaving that up to you.

                  Generating Text or HTML Reports

                  This section is about making a file containing the output of database queries. You can generate reports by using operating system facilities such as redirection, tee, and cutting and pasting. But it is much easier to use the "\o" and "\h" special commands.

                  [Note]Note

                  HTML reporting has been drastically modernized. It now has user-overridable boilerplates, flexible and safe CSS styles, and PL variable substitution.

                  Procedure 1.4. Writing query output to an external file

                  1. By default, everything will be done in plain text. If you want your report to be in HTML format, then give the special command \h true. If you do so, you will probably want to use filenames with an suffix of ".html" or ".htm" instead of ".txt" in the next step. You must set HTML mode to true before running the \o command of the next step, because this is how the \o command knows to write the opening HTML (header and such) to the file.

                  2. Run the command \o path/to/reportfile.txt. From this point on, output from your queries will be appended to the specified file. (I.e. another copy of the output is generated.) This way you can continue to monitor or use output as usual as the report is generated.

                  3. When you want SqlTool to stop writing to the file, run \o (or just quit SqlTool if you have no other work to do). If you are in HTML mode and you are finished writing the file (i.e. you will not append to it again later), then close it with \oc instead, to

                  4. If you turned HTML mode on before and want to turn it off now, run \h false.

                  It is not just the output of "SELECT" statements that will make it into the report file, but...

                  Kinds of output that get teed to \o files

                  • Output of SELECT statements.
                  • Output of all "\d" Special Commands. (I.e., "\dt", "\dv", etc., and "\d OBJECTNAME").
                  • Output of "\p" Special Commands. You will want to use this to add titles, and perhaps spacing, for the output of individual queries.

                  Other output will go to your screen or stdout, but will not make it into the report file. Be aware that no error messages will go into the report file. If SqlTool is run non-interactively (including if you give any SQL file(s) on the command line), SqlTool will abort with an error status if errors are encountered. The right way to handle errors is to check the SqlTool exit status. (The described error-handling behavior can be modified with SqlTool command-line switches and Special Commands).

                  [Warning]Warning

                  Remember that \o appends to the named file. If you want a new file, then use a new file name or remove the pre-existing target file ahead of time.

                  [Tip]Tip

                  So that I don't end up with a bunch of junk in my report file, I usually leave \o off while I perfect my SQL. With \o off, I perfect the SQL query until it produces on my screen exactly what I want saved to file. At this point I turn on \o and run ":/select/;" to repeat the last SQL command containing the given string ("select" in this example). If I have several complex queries to run, I turn \o off and repeat until I'm finished. (Every time you turn \o on, it will append to the file, just like we need).

                  Usually it doesn't come to mind that I need a wider screen until a query produces lines that are too long. In this case, stretch your window and repeat the last command with the ":;" Edit Buffer Command.

                  HTML output has its own *NULL_REP_HTML setting distinct from *NULL_REP_TOKEN. It fulfils *NULL_REP_TOKEN's output purpose of saying how to represent SQL nulls retrieved from VARCHAR columns, but lets you manage it for HTML separately from display and CSV/DSV output.

                  Several new features have been added to HTML reporting between revisions 4505 and 4606 inclusive. All of the new features are explained in comments in the working, sample SQL file below. If you write your own top boilerplate fragment, you will probably want to style the CSS classes written by SqlTool. These class names all begin with sqltool-, to avoid namespace collisions. Just generate a sample report to see which what class names get used.

                  A HTML report

                  The report above has a simple table dump and the basic column definitions for that table. You can, of course, make reports with any number of queries of any level of sophistication. The SQL file below generated this report.

                  Please study this example closely, because this is your principal source of education about the specifics of creating HTML reports. Notice the close at the very end with the explicit HTML-close command \oc. If you used just \o, the file would be closed but the closing HTML code would not be written. csv-sample.sql [1].

                  Example 1.5. Sample HTML Report Generation Script

                  /*
                   * $Id: html-report.sql 4564 2011-10-19 04:27:37Z unsaved $
                   *
                   * Sample/Template for writing an HTML Report
                   */
                  
                  -- Populate sample data
                  create table t (i integer, vc varchar(20));
                  insert into t values(1, 'one');
                  insert into t values(2, 'two');
                  insert into t values(3, 'three');
                  insert into t values(4, 'four');
                  insert into t values(5, 'five');
                  commit;
                  
                  
                  -- IMPORTANT:  \o will append by default.  If you want to write a new file,
                  -- it's your responsibility to check that a file of the same name does not
                  -- already exist (or remove it).
                  
                  
                  -- Follow the following examples to use your own HTML fragment files.
                  -- * *TOP_HTMLFRAG_FILE = /tmp/top.html
                  -- * *BOTTOM_HTMLFRAG_FILE = /tmp/bottom.html
                  
                  -- The default TOP_HTMLFRAG_FILE has a reference to this PL variable.
                  * REPORT_TITLE = Blaine's Sample Report
                  -- The default will also override its CSS style settings with your own if you
                  -- put them in a file named "overrides.css" in same directory alongside your
                  -- reports ("report.html" in this example).
                  -- You can add references to ${system.properties} and *{PL_VARIABLES} in
                  -- your own custom fragment files too.
                  
                  
                  -- Turn on HTML output mode.
                  -- Must enable HTML _before_ opening to write top frag.
                  \h true
                  \o report.html
                  \p A message to appear in the Report
                  SELECT * FROM t;
                  
                  -- Close off output just to show that you can go back and forth.
                  -- A close with '\o' will not write the bottom boilerplate that closes the HTML.
                  \o
                  \h false
                  \p Some non-HTML non-Report output:
                  SELECT count(*) FROM t;
                  
                  \h true
                  -- Re-open the report
                  \o report.html
                  \d t
                  -- This time close it with
                  \oc
                  


                  One thing that I chose not to exemplify in the example, so as not to scare away less technical users, is that you can use the \p variant command \pr. When you give a \p command in HTML mode, SqlTool formats the output into a paragraph. But coders may want to write HTML, Javascript, JSP, or similar code, and SqlTool should treat this as Raw to be written as-is to the report file. This is what \p accomplishes.

                  Storing and Retrieving Binary Files

                  You can upload binary files such as photographs, audio files, or serialized Java objects into database columns. SqlTool keeps one binary buffer which you can load from files with the \bl command, or from a database query by doing a one-row query for any non-displayable type (including BLOB, OBJECT, and OTHER). In the latter case, the data returned for the first non-displayable column of the first result row will be stored into the binary buffer.

                  Once you have data in the binary buffer, you can upload it to a database column (including BLOB, OBJECT, and OTHER type columns), or save it to a file. The former is accomplished by the special command \bp followed by a prepared SQL query containing one question mark place-holder to indicate where the data gets inserted. The latter is accomplished with the \bd command.

                  You can also store the output from normal, displayable column into the binary buffer by using the special command \b. The very first column value from the first result row of the next SQL command will be stored to the binary byte buffer.

                  Example 1.6. Inserting binary data into database from a file

                      \bl /tmp/favoritesong.mp3
                      \bp
                      INSERT INTO musictbl (id, stream) VALUES(3112, ?);

                  Example 1.7. Downloading binary data from database to a file

                      SELECT stream FROM musictbl WHERE id = 3112;
                      \bd /tmp/favoritesong.mp3

                  You can also store and retrieve text column values to/from ASCII files, as documented in the Essential PL Command section.

                  SqlTool Procedural Language

                  Aka PL

                  Most importantly, run SqlTool interactively and give the "*?" command to see what PL commands are available to you. I've tried to design the language features to be intuitive. Readers experience with significant shell scripting in any language can probably learn the rudiments by looking at (and running!) the sample script sample/pl.sql in your HyperSQL distribution [1] and then pick up everything else by using the *? command from within an interactive SqlTool session. (By significant shell scripting, I mean to the extent of using variables, for loops, etc.).

                  It generally causes an error to reference a variable that has not been set. SqlTool will always attempt to de-reference PL variable and Java system property references, except for (a) in : commands, and (b) in SQL statements if no user PL variable has been set. Since you should never be trying to dereference a PL variable if none have been set, the practical implications are just: If you want Java system properties to be de-referenced, just make sure that any PL user variable is set; and if you have strings like ${this} appear in your SQL text (which you do not want expanded), unset all user PL variables before executing that text (if any have been set earlier). The purpose of this system is to avoid changing user-specified SQL without the user knowing it. People who don't use PL at all don't have to worry about strings getting accidentally expanded.

                  PL is also used to upload and download column values to/from local ASCII files, analogously to the special \b commands for binary files. This is explained above in the Interactive Essential PL Command section above.

                  Nulls and Empty Strings

                  I am raising this PL variable topic out of order here because it is important to understand, and I'd like you to have the concept firmly in mind before digging into other details about variables. In this sub-section I am only talking about PL variable values (not system properties or SQL engine variables, etc.).

                  Very similarly to Java system properties, if the value of a PL variable is null, then the variable is unset; and (if you set the sqltool.REMOVE_EMPTY_VARS mode as suggested) there is no way to directly assign a variable to null. If, for example, you ran

                                * MYVAR = null

                  that would assign the string value of null to your variable, not the real null value. If a variable is assigned null indirectly, say by fetching a null cell value into a variable, or when variable ? is assigned null due to a SQL failure, this action is entirely equivalent to unsetting the variable.

                  [Important]Recap

                  If a variable is unset, or has never yet been set, then that variable's value is null. If a variable's value is null, then the variable is unset.

                  You can assign a PL variable the empty string value by using a command switch -P or --setVar. For example

                  java -jar .../sqltool.jar -Pvarname= urlid script.sql

                  You can see it's an empty string by echoing the value:

                  \p One*{varname}Two
                  OneTwo

                  With the next minor release of SqlTool, or now if you set Java system property sqltool.REMOVE_EMPTY_VARS to false, that you can use the vanilla PL assignment command to assign empty values like this:

                  * MYVAR =

                  Distinguishing Nulls from Empty Strings

                  You can't use the simplest Special Command \p to distinguish null variables, because (a) It is an error to expand an unset/null value with the ${x} construct, and the alternative ${:x} is safe but displays null values as if they were empty strings-- thereby not distinguishing. But don't fear. There are easy ways.

                  Unset/null variables are not listed by the commands * list or * listvalues. Therefore, say you want to know if variable MYVAR is set or not (stated differently, whether it is non-null or null). Run

                      * list MYVAR

                  . If it lists the variable then it is set and is not null.

                  You can use the * if command to compare your variable to the null value or to the empty string. The first test here will tell you if MYVAR is equal to null (by comparing it to reserved PL variable *NULL). The second test here compares MYVAR to a variable that you assigned the empty string to earlier.

                  Example 1.8. Explicit null and empty-string Tests

                      java -jar .../sqltool.jar -pEMPTYSTRING=
                      ....
                      * if (*MYVAR == **NULL)
                          \p MYVAR really is null
                      * end if
                      * if (*MYVAR == EMPTYSTING)
                          \p MYVAR is now an empty string
                      * end if


                  Definitely study the Special values for ?, and _ (or ~) Variables example.

                  Variables

                  Following subsections explain important things about specific variable types. Here we just list the variable types and give a few points about variable usage generally.

                  Variable Types

                  Database/SQL Variables

                  SqlTool has no control over variable mechanisms provided by the SQL implementation or database vendor. You can use such constructs only in SQL commands, since the other command types never reach the database engine. Nothing else that we have to say about manuals applies to database/SQL variables.

                  Java System Properties

                  SqlTool allows for reading but not writing of these variables with ${varname} and * listsysprops. To prevent your SQL text from being changed unintentionally, ${varname} occurrences will not be expanded inside of SQL statements unless at least one PL user variable has been set. Therefore, if executing portable SQL scripts (and by default), SqlTool will not expand ${varname}s inside of SQL statements.

                  PL User Variables

                  These variables have names beginning with a letter and (if the name is longer than one character) any number of letter, digit, or _ characters. The letters are case-specific. Two examples are m and MY_VAR. There variables are created and assigned values on the SqlTool command-line or with any of several PL assignment commands listed by the * ? command. Depending on context (see below about that), they are referenced as *{MY_VAR}, as *MY_VAR, or as MY_VAR. You can display all current user (and SqlTool system) variables with the PL command * listvalues.

                  SqlTool System PL Variables

                  These are PL variables just like PL user variables, but the variable names begin with the * character, like *DSV_TARGET_FILE, and they effect SqlTool system behavior. Some of these are initialized by SqlTool automatically. You can change and examine the values in the same way as PL user variables. See the following subsection about System PL Variables for details.

                  Reserved PL Variable ?

                  The ? variable is set automatically to the results of SQL statement executions. The reset state is the empty string, and it is only ever set to null (aka unset) if an SQL error was encountered.

                  *PL variables NULL and *NULL

                  These are actually reserved system and user PL variables, and since they are very unique and interchangeable with one another, I'm giving them their own bullet. These are reserved PL variables which always have the value of null (which has the meaning of unset. You can compare other variables to *NULL or NULL to see if they are set or not. A specific application is to compare ? to *NULL or NULL to see if the last SQL command has failed.

                  General Rules for PL vars and Java system props

                  • PL variables and Java system properties are always expanded in Special, and (most) PL commands if they are written like *{VARNAME} and ${VARNAME} correspondingly. They are expanded in the same way inside of SQL statements as long as one (or more) PL variable has been set.
                  • Your SQL scripts can give good feedback by displaying the value of variables with the "\p" Special command.

                  System PL Variables

                  [Important]Important

                  Definitely run command * ? to view in-program help about referencing PL variables, and run * ? assign if you will be assigning variables.

                  SqlTool automatically assign values to a few special system variables. As I write this, the special variables are only *START_TIME, *REVISION, *TIMESTAMP. *START_TIME is a date and time string formatted for the user's locale. *REVISION is SqlTool's version string (i.e., it is not a valid real or integer number). *TIMESTAMP is a user-configurable date or time string configurable with another system variable *TIMESTAMP_FORMAT.

                  SqlTool System PL variables are the mechanism used to configure SqlTool behavior. You can list all set PL variables by running the SqlTool command * listvalues. If a SqlTool System variable is not shown, then it is unset (which is equivalent to non-null). But if a system variable is not set, that doesn't mean that the setting behavior will be unset, but rather that the default behavior will apply. For example, if you * listvalues and the variable *DSV_COL_DELIM is not listed, that doesn't mean that there will be no DSV column delimiter, but that the default DSV column delimiter will be used. The in-program help can be used to determine what the default behavior is. (In the case of *DSV_COL_DELIM, you can see the default behavior by running \x?.

                  See the list of system variables in the SqlTool System PL Variables appendix.

                  PL Variables

                  This subsection explains points common to most or all of the PL variable varieties (all variables other than Database/SQL and Java system properties).

                  The new -p switch is an easy and elegant way to set PL variables when you know the needed values at SqlTool invocation time. This is a more user-friendly variant of the --setVar switch. The primary benefit is that you can specify multiple variable assignments using multiple -p switches, eliminating the need to separate name=value elements with commas (doing this necessitates the usage of \, escapes when there are commas in your intended variable values). The most basic usage is like -PNAME=value, but there are a few things to know to make this feature more useful. Firstly, the space after -p is optional, so you can write either -PNAME=value or -P NAME=value. Secondly, the 'p' itself is case-insensitive. You may choose to always user upper-case or always lower-case to be consistent. But if you do not put space after the p, I recommend that you change the capitalization of the p to more easily distinguish your variable names, like -pVARNAME=x and -Pvarname=y.

                  • PL variables are global to a SqlTool invocation and are therefore shared among

                    • --setVar command-line switches.
                    • -P or -p command-line switches.
                    • --sql command-line switches.
                    • auto.sql file, if it is present and the rules call for it to load.
                    • SQL files loaded with \i from top or a nested level.
                    • standard input whether from a terminal, redirection, or piping

                    The variable must, of course, be set at a point in time before it is referenced.

                  • Use the * list command to list some or all variables; or * listvalues to also see the values. (Exception: The *EXCEPTION variable can not be displayed with the list commands).
                  • Assignment

                    [Tip]A Mnemonic

                    The mnemonic distinction between assignment commands * VARNAME _ and * VARNAME ~ is that the latter shows the output, which you can think of as looking like ~ on your computer display. See the in-program help (*?) about the purpose and usage of these two commands.

                    Run the * ? command to see a list of commands that you can use to assign and to unset PL variables. The most simple assignment command is * VARNAME = Var value, but you can assign values from command output, query return values, contents of files, mathematical expressions, the edit buffer, etc.

                    Only the * VARNAME : assignment variant supports assigning a multi-line SQL statement(s) as body. To populate the edit buffer with your multi-line SQL query for the : assignment, you must execute the SQL command before (usually undesirable), or end the SQL with a blank line instead of a ; only works interactively), or use Raw Mode.

                  • You can also set PL variables other than ? using the --setVar and -P (also usable as -p) command-line switches. I give a very brief but useful example of this below.
                  • You can unset (remove) PL variables using the * - VARNAME command.
                  • It is an error in a Special and most PL commands to expand an unset (remove) variable with *{VARNAME} or ${VARNAME}. Therefore, if the variable/property may not be set, just add a colon like *{:VARNAME} or ${:VARNAME} to expand the variable if set, but expand to a zero-length string if the variable is not set.
                  • Inside of logical expressions (like inside of if and while commands), reference variables like *VARNAME, i.e. without the curly brace, and don't worry about a construct like ${:VARNAME} because it is legal to compare unset variables (all unset variables are equal to one another). The justfication for this simplification is explained below.
                  • The assignee variable name, and variables inside of mathematical expressions are written simply as bare words. For example: "* VARNAME = Var value (* there is a command prefix-- not part of the variable specifier) and "* ((VARNAME = OTHER_VARNAME * 6))".

                  PL commands can be used to upload and download column values to/from local ASCII files, but the corresponding actions for binary files use the special \b commands. This is because PL variables are used for ASCII values and you can store any number of column values in PL variables. This is not true for binary column values. The \b commands work with a single binary byte buffer.

                  See the SqlTool Procedural Language section below for information on using variables in other ways, and information on the other PL commands and features.

                  PL ? Variable

                  You don't set the ? variable. It is much like the Bourne shell variable $? in that it is always automatically set to the first value of a result set (or the return value of other SQL commands). It works very similarly to the * VARNAME ~ and * VARNAME ~ assignment commands, but the value of ? is set automatically without you doing anything. You can, of course, dereference ? like any PL variable or view it with * list or * listvalues. If you are running interactively or have turned on \c (continue-upon-error), you should be prepared that ? could get unset by SQL failures and thereby cause *{?} references to fail. (In which case the list commands still work, you can check it with an * if comparison, and the *{:?} construct will be safe (though this last does not show you the difference between empty string and null). The important thing to remember about the list commands is that variables that are not listed are unset (i.e., are null).

                  ? is reliably set to null only upon SQL failures. Upon SqlTool startup, ? is set to the empty string "" instead of being unset or null. If a query returns a null value in the last cell, then ? will be assigned to the current *DSV_NULL_REP value instead of the literal null value. Therefore if you enable continue-on-error with \c true (or in interactive mode when this is the default... though I can't think of how this could be useful interactively), you can test for SQL failures with

                      * if (*? == *NULL)

                  (*NULL is a reserved PL variable that always has the value of null, which means unset).

                  The important functional difference between variables assigned with VARNAME _ or VARNAME ~ vs. ? is that the latter is always set to the last SQL cell value fetched (or return value for non-result-set SQL). Explicit assignments with _ or ~ are made from the very next cell content retrieved after the _ or ~ command (or return value for non-result-set SQL). Easier to show what I mean than to explain it...

                  Example 1.9. Special values for ?, and _ (or ~) Variables

                  sql> \p At startup ? is equal to empty string.  See between A and B:  A*{?}B
                  At startup ? is equal to empty string.  See between A and B:  AB
                  sql> * if (A*{?}B == AB) \p ? is the empty string
                  ? is the empty string
                  sql> 
                  sql> CREATE TABLE t(i INTEGER, vc VARCHAR(20));
                  sql> INSERT INTO t VALUES(1, 'one');
                  1 row updated.
                  sql> INSERT INTO t VALUES(2, 'two');
                  1 row updated.
                  sql> * res ~
                  sql> SELECT * FROM t;
                  I  VC
                  -  ---
                  1  one
                  2  two
                  
                  Fetched 2 rows.
                  sql> \p *{?}
                  two
                  sql> \p *{res}
                  1
                  sql> * listvalues ? res
                  Listing all 'set' variables (any var not seen is unset and equal to null).
                  The outermost parentheses are not part of the values.
                      ?: (two)
                      res: (1)
                  sql> 
                  sql> INSERT INTO t VALUES (3, null);
                  1 row updated.
                  sql> *res ~
                  sql> SELECT vc FROM t WHERE i = 3;
                  [null]
                  sql> \p *{?}
                  [null]
                  sql> * if (*res == **NULL) \p res really is null
                  res really is null
                  sql> * listvalues ? res
                  Listing all 'set' variables (any var not seen is unset and equal to null).
                  The outermost parentheses are not part of the values.
                      ?: ([null])
                  sql> 
                  sql> -- This will prevent SqlTool from aborting when we run a bad SQL statement:
                  sql> \c true
                  Continue-on-error is set to true.
                  sql> *res ~
                  sql> SELECT hocus FROM pocus;
                  SEVERE  SQL Error at '<stdin>' line 23:
                  "SELECT hocus FROM pocus"
                  user lacks privilege or object not found: POCUS
                  sql> * if (*? == **NULL) \p ? really is null
                  ? really is null
                  SEVERE  Did not finish setting variable 'res' before a code block exited.
                  SEVERE  Rolling back SQL transaction.
                  sql> * if (*res == **NULL) \p res really is null
                  res really is null
                  sql> * listvalues ? res
                  Listing all 'set' variables (any var not seen is unset and equal to null).
                  The outermost parentheses are not part of the values.
                  sql>


                  (The SQL that generated this is available in the file nullempty.sql in the sample directory of your HyperSQL distribution.

                  Macros

                  Macros are just shortcut commands that you can run in place of the full commands which they stand for. Macros stand for SQL, Special or PL commands, whereas PL variables can only be used for elements within a command. It is very easy to define, list, and use macros. Run the command "/?" to see how. If you often run a particular query, then for the effort of about 5 extra keystrokes, you can define a macro for it so that you can enter just "/q;" to run it, whether the original query is 1 line or 40 lines. (You can use any name in place of "q", and the target command can be any kind of SQL, special, or PL command).

                  When you run/use a macro, you can append to the macro value. appendage in the "/?" listing shows where you can append additional text to the original command. So, if you define

                      sql> /= myworkers  SELECT name FROM employees

                  , you could narrow the query variously during different macro invocations, like

                      sql> /myworkers WHERE dept = 20;
                      sql> /myworkers WHERE name like 'Karen%';

                  Just like when recalling a command from history, you use ";" to execute even Special and PL macro commands.

                      sql> /= notate  \p Work completed by
                      sql> /notate Blaine;

                  If you don't type the ;, you will just recall the command to the buffer (from which you can execute or edit it, if you wish to).

                  To make a macro for a mult-line SQL statement, you use the "/: name" construct. First, get the target command into the command buffer. If you have already run the command, then run ":h" to see the command number and load it to the buffer like ":13". If you haven't run the command yet, then just enter the command, but end it with a blank line (and no semi-colon). You can check the buffer with ":b" to make sure it is what you want. Then just run "/: name" to define a macro with name "name".

                  SqlTool Functions

                  SqlTool functions are macros which take positional parameters. They are functions in the shell-programming sense. They do not return values in the sense of functions as distinguished from procedures or methods. As the /? in-program help shows, they can be defined by literal assignment or by buffer contents, and optional appendages work as one would want-- just like regular macros. They are intuitive to define and use, so one example should be all the instruction needed.

                  Example 1.10. Creating a SqlTool Function

                  \.
                  INSERT INTO t(i, vc) VALUES(*{1}, '*{2}');
                  SELECT * FROM t
                    WHERE i = *{1}
                  .
                  /: writeread()  AND audited is null


                  This is a non-trivial example where we insert into a table with some automatically generated columns, and we want to see the entire created record before deciding whether to commit the new record. Since what we want to do will take multiple lines of SQL, and indeed 2 SQL statements, we use raw mode to write the multi-line SQL statement to the edit buffer, then use the /: MACRONAME [appendage] construct to define a macro with body of the previous edit buffer contents. As described elsewhere, if you want to do this in a SQL file (as opposed to interactively), you have to use raw mode as we have done here. Just by assigning a name ending with () we have made a function instead of a regula macro. Notice how we used positional parameters references *{1} and *{2} in the macro body. We wanted to add a little to what was in the edit buffer, so we added an appendage to the /: command. Note the extra space after () or we would have ended up with resulting body of "... i = *{1}AND audited...".

                  Example 1.11. Invoking a SqlTool Function

                  /writeread(10, ten);


                  Not much to explain. Though the second character is for a string value to insert into the a varchar column, we wrote the function so that the function body supplies the single-quotes instead of having to type them in ever time we use the function. Leading and trailing white space is trimmed from each parameter. So if you want your value to have leading or trialing space, you will have to type in the quotes at invocation time. Another limitation caused by this convenient parsing is that functions just won't work when your invocation parameters need to contain commas. Just like for regular macros, the terminating ; causes the expanded macro to execute.

                  PL Sample

                  Here is a short SQL file that gives the specified user write permissions on some application tables.

                  Example 1.12. Simple SQL file using PL

                      /*
                         grantwrite.sql
                  
                         Run SqlTool like this:
                             java -jar path/to/sqltool.jar -pUSER=debbie grantwrite.sql
                       */
                  
                      /* Explicitly turn on PL variable expansion, in case no variables have
                         been set yet.  (Only the case if user did not set USER).
                      */
                  
                      GRANT all ON book TO *{USER};
                      GRANT all ON category TO *{USER};

                  Note that this script will work for any (existing) user just by supplying a different user name on the command-line. I.e., no need to modify the tested and proven script. There is no need for a commit statement in this SQL file since no DML is done. If the script is accidentally run without setting the USER variable, SqlTool will give a very clear notification of that.

                  Logical Expressions

                  Logical expressions occur only inside of logical expression parentheses in PL statements. For example, if (*var1 > astring) and while (*checkvar). (The parentheses after "foreach" do not enclose a logical expression, they just enclose a list).

                  Spaces are not allowed in elements of logical expressions. These are examples of illegal logical expressions: * while (two words), * if (*x == two words). You can certainly do what you want to do, however, by using variables to hold multi-word strings. You can achieve the goals for the two previous attempts with

                      *tmpVar = two words
                      * while (*tmpVar)
                      ...
                      * if (*x == *tmpVar)

                  It is critically important here to use *tmpvar instead of *{tmpvar} in this situation, because *{...} would not delay expansion and would therefore be equivalent to entering the multiple words.

                  SqlTool's logical expressions are purposefully minimalistic. We do not support nested operations or mixing with assignment commands. Notice that there are no ||, &&, AND, or OR operations in the table below. You can not assign the value of a boolean expression directly. You can achieve that goal with an * while and mathematical assignments.

                  As stated earlier, inside of logical expressions you should normally reference PL variables without curly braces. This syntatic simplification is allowed because multi-word tokens are not allowed in logical expressions (therefore {...} is not needed to group words). For example, "word", ">", and "*VARNAME" are all separate atoms.

                  You can indeed use the curly format like "*{THIS}" inside of logical expressions, but the casual user should stick to "*THIS". There is a difference between *{VARNAME} and *VARNAME inside logical expressions. *{VARNAME} is expanded one time when the parser first encounters the logical expression. *VARNAME is re-expanded every time that the expression is evaluated. So, you would never want to code * while (*{X} < 5) because the statement will always be true or always be false. (I.e. the following block will loop infinitely or will never run). Another difference between *{VARNAME} and *VARNAME is that the latter resolves to unset (this is very different from the empty string that *{:VARNAME} would resolve to).

                  If you do use the braces, make sure that the expansion value doesn't contain quotes or whitespace. (They would expand and then the expression would most likely no longer be a valid expression as listed in the table below). Quotes and whitespace are fine in *VARNAME variables, but it is the entire value that will be used in evaluations, regardless of whether quotes match up, etc. I.e. quotes and whitespace are not special to the token evaluator. Hence-- casual users should not use braces inside of logical expressions.

                  Though tokens inside logical expressions are atomic, you definitely can and should do tests on strings that contain spaces. You just have to use a variable for each such string value. For example, if I want to see if the special variable ? is equal to one two three, then you must do it like this:

                      * cfString = one  two three
                      * if (*cfString == ?)

                  As noted elsewhere in this guide, internal spaces are preserved as given. For assignments, trailing spaces are generally preserved. Leading spaces are preserved only for the : assignment commands.

                  Logical Operators

                  TOKEN

                  The token may be a literal, a *{VARNAME} which is expanded early, or a *VARNAME which is expanded late. (You usually do not want to use *{VARNAME} in logical expressions). False if the token is not set, empty, or "0". True otherwise.

                  TOKEN1 == TOKEN2

                  True if the two tokens are equivalent "strings".

                  TOKEN1 <> TOKEN2

                  Ditto.

                  TOKEN1 >< TOKEN2

                  Ditto.

                  TOKEN1 > TOKEN2

                  True if the TOKEN1 string is longer than TOKEN2 or is the same length but is greater according to a string sort.

                  TOKEN1 < TOKEN2

                  Similarly to TOKEN1 > TOKEN2.

                  ! LOGICAL_EXPRESSION

                  Logical negation of any of the expressions listed above.

                  TOKEN1 >= TOKEN2

                  True if the TOKEN1 string is longer than TOKEN2 or is the same length but is greater or equal value according to a string sort.

                  TOKEN1 => TOKEN2

                  Ditto.

                  TOKEN1 <= TOKEN2

                  Similarly to TOKEN1 >= TOKEN2.

                  TOKEN1 =< TOKEN2

                  Ditto.

                  *VARNAMEs in logical expressions, where the VARNAME variable is not set, evaluate to an empty string. Therefore (*UNSETVAR = 0) would be false, even though (*UNSETVAR) by itself is false and (0) by itself is false. Another way of saying this is that *VARNAME in a logical expression is equivalent to *{:VARNAME} out of a logical expression.

                  When developing scripts, you definitely should use SqlTool interactively to verify that SqlTool evaluates logical expressions as you expect. Just run * if commands that print something (i.e. \p) if the test expression is true.

                  Mathematical Assignments

                  Only integer math is supported, and only in mathematical assignment commands. Math assignment commands are of the format

                  <ASSIGNEE> <ASSIGNMENT_OP> <INTEGER_EXPRESSION>

                  For example,

                  SQUARE_FOOTAGE += (FOYER_FEET + 20) * 3 + 300 * BATHS

                  This works very close to Bash and Korn shell ((...)) integer math. The primary difference from those shells is that we prohibit useless non-assignment commands. Therefore, our math assignment commands always begin with the assignee variable name and an assignment operator.

                  Those users unfamiliar with programs that do strictly integer math should play around with it before using it for anything important. It may surprise you that real numbers like 2.9 are not automatically converted to an integer, but are simply prohibited; and that results of expressions are truncated to an integer, not rounded.

                  The list below is available from the program by running * ? (they are listed after the words "Assignment OPs:"). Note that though we support assignment operator ++, we do not support -- because that conflicts with our single-line comment delimiter --. The work-around is to use -=1 instead.

                  Mathmatical Assignment Operators

                  • =
                  • ++ (increment by 1, no expression allowed)
                  • -= (subtract value of the expression)
                  • += (add to...)
                  • /= (divide by...)
                  • %= (divide by expression and return remainder)

                  To the right of the assignment operator is the integer math expression consisting of raw variable names, integers, and mathematical operators. The variables referenced, if any, must all contain integer values. In the expression only user PL variables may be used. Not Java system properties nor SqlTool system PL variables.

                  The list below is available from the program by running * ? (they are listed after the words "Internal ops:").

                  Mathmatical Expression Operators

                  • INTEGER_USER_VARIABLE_NAME (resolve to its value)
                  • () (specify precedence)
                  • +
                  • -
                  • *
                  • / (division)
                  • % (division remainder)
                  • ^ (power)

                  Flow Control

                  Flow control works by conditionally executing blocks of Commands according to conditions specified by logical expressions.

                  [Important]Important

                  Definitely run command * ? control to view a list of the available flow control statements, and details about how to use them.

                  The conditionally executed blocks are called PL Blocks. These PL Blocks always occur between a PL flow control statement (like * foreach, *while, * if) and a corresponding * end PL Command (like * end foreach).

                  Definitely read the section Logical Expressions.

                  The values of control variables for * foreach and * forrows PL blocks will change as expected.

                  There are * break and * continue, which work as any shell scripter would expect them to. The * break command can also be used to quit the current SQL file without triggering any error processing. (I.e. processing will continue with the next line in the including SQL file or interactive session, or with the next SQL file if you supplied multiple on the command-line).

                  There is now also an inline * if command that is very handy and concise. Try these samples on.

                  Example 1.13. Inline If Statement

                      * if (*x == *NULL) \q Aborting program
                      ....
                      * while...
                          * if (*exitCondition) * break
                      ...
                      * if (*notableEvent) \l SEVERE Something bad happened


                  PL Example

                  Below is the example SQL file sample/pl.sql, which shows how to use most of the basic PL features [1]. If you have a question about how to use a particular PL feature, check this file in your distribution before asking for help... and definitely read the in-program help for * ? carefully! Give it a run, like

                  java -jar $HSQLDB_HOME/lib/sqltool.jar mem $HSQLDB_HOME/pl.jar

                  It will suggest that you re-run it with another parameter. Insert the new parameter before "mem".

                  Example 1.14. SQL File showing use of most PL features

                  /*
                      $Id: pl.sql 4564 2011-10-19 04:27:37Z unsaved $
                      SQL File to illustrate the use of some basic SqlTool PL features.
                      Invoke like
                          java -jar .../sqltool.jar mem .../pl.sql
                                                                           -- blaine
                  */
                  
                  * if (! *MYTABLE)
                      \p MYTABLE variable not set!
                      /* You could use \q to Quit SqlTool, but it's often better to just
                         break out of the current SQL file.
                         If people invoke your script from SqlTool interactively (with
                         \i yourscriptname.sql) any \q will kill their SqlTool session. */
                      \p Use argument "-pMYTABLE=mytablename" for SqlTool
                      * break
                  * end if
                  
                  -- Turning on Continue-upon-errors so that we can check for errors ourselves.
                  \c true
                  
                  \p
                  \p Loading up a table named '*{MYTABLE}'...
                  
                  CREATE TABLE *{MYTABLE} (
                      i int,
                      s varchar(20)
                  );
                  -- PL variable ? is always set to status or fetched value of last SQL
                  -- statement.  It will be null/unset if the last SQL statement failed.
                  \p CREATE status is *{?}
                  \p
                  
                  /* Validate our return status.
                     In case of success of a CREATE TABLE, *? will be 0, and therefore a
                     '* if (*?)' would be false.
                     So we follow the general practice of testing *? for the error indicator
                     value of null, using the reserved SqlTool system variable *NULL.
                   */
                  * if (*? == *NULL)
                      \p Our CREATE TABLE command failed.
                      * break
                  * end if
                  
                  -- Default Continue-on-error behavior is what you usually want
                  \c false
                  \p
                  
                  /* Insert data with a foreach loop.
                     These values could be from a read of another table or from variables
                     set on the command line like
                  */
                  \p Inserting some data into our new table
                  * foreach VALUE (12 22 24 15)
                      * if (*VALUE > 23)
                          \p Skipping *{VALUE} because it is greater than 23
                          * continue
                          \p YOU WILL NEVER SEE THIS LINE, because we just 'continued'.
                      * end if
                      INSERT INTO *{MYTABLE} VALUES (*{VALUE}, 'String of *{VALUE}');
                  * end foreach
                  \p
                  
                  /* This time instead of using the ? variable, we're assigning the SELECT value
                     to a User variable, 'themax'. */
                  * themax ~
                  /* Can put Special Commands and comments between "* VARNAME ~" and the target 
                     SQL statement. */
                  \p We're saving the max value for later.  You'll still see query output here:
                  SELECT MAX(i) FROM *{MYTABLE};
                  
                  /* No need to test for failure status (either ? or themax being unset/null),
                     because we are in \c mode and would have aborted if the SELECT failed. */
                  * if (0 == *themax)
                      \p Got 0 as the max value.
                      * break
                      \p YOU WILL NEVER SEE THIS LINE, because we just 'broke'.
                  * end if
                  
                  \p
                  \p ##############################################################
                  \p The results of our work:
                  SELECT * FROM *{MYTABLE};
                  \p MAX value is *{themax}
                  
                  \p
                  \p Counting down to exit
                  * ((i = 3))
                  * while (*i > 0)
                      \p *{i}...
                      * ((i -= 1))  -- i++ is supported but i-- is not, because -- marks comments
                  * end while
                  
                  \p
                  \p Everything worked.  Signing off.
                  

                  Chunking

                  We hereby call the ability to transmit multiple SQL commands to the database in one transmission chunking. Normally it's best to send SQL statements to the database one-at-a-time. That way, the database can give you or your program feedback about each statement. But there are situations where it is more important to transmit multiple-statements-at-a-time than to get feedback for each statement individually.

                  Why?

                  The first general reason to chunk SQL commands is performance. For standalone databases, the most common performance bottleneck is network latency. Chunking SQL commands can dramatically reduce network traffic.

                  The second reason is that there are a couple SQL commands which require the terminating ";" to be sent to the database engine. For simplicity and efficiency, it's usually better for general JDBC clients like SqlTool to strip off the final delimiter. Raw commands retains everything that the user types.

                  The third general reason to chunk SQL commands is if your database requires you to send multiple commands in one transmission. This is usually the case with the following types of commands:

                  • Nested SQL commands, like the nested CREATE SCHEMA variant, and most stored procedure, function, and trigger definitions.
                  • Commands containing non-quoted programming language to be interpreted by the database engine. Definitions of stored procedures, function, and triggers often contain code like this.

                  How?

                  Use raw mode. Go to the Raw Mode section to see how. You can enter any text at all, exactly how you want it to be sent to the database engine. Therefore, in addition to chunking SQL commands, you can give commands for non-SQL extensions to the database. For example, you could enter JavaScript code to be used in a stored procedure.

                  Raw Mode

                  You begin raw mode by issuing the Special Command "\.". You can then enter as much text in any format you want. When you are finished, enter a line consisting of only ".;" to store the input to the edit buffer and send it to the database server for execution.

                  You may end the raw input with a line consisting only of "." (instead of ".;"). This will just save the input to the edit buffer so that you can do things like edit it or create a macro/function/variable for it. To execute a database command after editing, use the command ":;" when you are satisfied (use ":b" to view buffer).

                  You may end the raw input with a line consisting only of "." You'll notice that your prompt will be the "raw" prompt between entering "\." and terminating the raw input with ".;" or ".".

                  Just by running commands beginning with BEGIN, DECLARE, CREATE function, or CREATE procedure, your SqlTool session will automatically be changed to Raw mode, exactly as if you had entered "\.". That's because these commands are universally used to define stored procedures or functions, and these commands require raw mode (as explained in the previous section). You can always switch to raw mode explicitly instead of depending on the automatic switching. Raw mode always requires you to indicate where the raw input ends, regardless of raw mode was entered explicitly or automatically. Trigger definition statements do not automatically switch to raw mode, because there are many trigger definitions where raw mode is not necessary-- therefore, you must explicitly use raw mode to define triggers which contain semi-colons.

                  Example 1.15. Interactive Raw Mode example

                      sql> \.
                      Enter RAW text.  No \, :, * commands.
                      End with a line containing only ".;" to send to database,
                      or only "." to store to edit buffer for editing or saving.
                      -----------------------------------------------------------
                      raw> line one;
                      raw> line two;
                      raw> line three;
                      raw> .
                      Raw chunk moved into buffer.  Run ":;" to execute the chunk.
                      sql> :;
                      Executing command from buffer:
                      line one;
                      line two;
                      line three;
                  
                      SQL Error at 'stdin' line 13:
                      "line one;
                      line two;
                      line three;"
                      Unexpected token: LINE
                      sql>


                  The error message "Unexpected token: LINE in statement [line]" comes from the database engine, not SqlTool. All three lines were transmitted to the database engine.

                  Edit Buffer Commands are not available when running SqlTool non-interactively.

                  SQL/PSM, SQL/JRT, and PL/SQL

                  This section covers database-engine-embedded languages, which are often used in the definition of stored procedures, stored functions, and triggers. SQL/PSM, SQL/JRT, and PL/SQ: are well known examples. We prefer SQL/PSM and SQL/JRT because unlike the alternatives, they are based on open SQL specifications.

                  [Note]Note

                  PL/SQL is not the same as PL. PL is the procedural language of SqlFile and is independent of your back-end database. PL commands always begin with *. PL/SQL is an Oracle-specific extension processed on the server side. You can not intermix PL and any server-embedded language (except for setting a PL variable to the output of execution), because when you enter server language to SqlTool, that input is not processed by SqlFile.

                  Use Raw Mode to send server-language code blocks to the database engine. You do not need to enter the "\." command to enter raw mode. Just begin a new SqlTool command line with "DECLARE", "BEGIN", "CREATE FUNCTION", or "CREATE PROCEDURE", and SqlTool will automatically put you into raw mode. See the Raw Mode section for details.

                  The following sample SQL file resides at sample/plsql.sql in your HyperSQL distribution [1]. This script will only work with Oracle, only if you have permission to create the table "T1" in the default schema, and if that object does not already exist.

                  Example 1.16. PL/SQL Example

                  /*
                   * $Id: plsql.sql 826 2009-01-17 05:04:52Z unsaved $
                   *
                   * This example is copied from the "Simple Programs in PL/SQL"
                   * example by Yu-May Chang, Jeff Ullman, Prof. Jennifer Widom at
                   * the Standord University Database Group's page
                   * http://www-db.stanford.edu/~ullman/fcdb/oracle/or-plsql.html .
                   * I have only removed some blank lines (in case somebody wants to
                   * copy this code interactively-- because you can't use blank
                   * lines inside of SQL commands in non-raw mode SqlTool when running
                   * it interactively); and, at the bottom I have  replaced the
                   * client-specific, non-standard command "run;" with SqlTool's
                   * corresponding command ".;" and added a plain SQL SELECT command
                   * to show whether the PL/SQL code worked.  - Blaine
                   */
                  
                  CREATE TABLE T1(
                      e INTEGER,
                      f INTEGER
                  );
                  
                  DELETE FROM T1;
                  
                  INSERT INTO T1 VALUES(1, 3);
                  
                  INSERT INTO T1 VALUES(2, 4);
                  
                  /* Above is plain SQL; below is the PL/SQL program. */
                  DECLARE
                  
                      a NUMBER;
                  
                      b NUMBER;
                  
                  BEGIN
                  
                      SELECT e,f INTO a,b FROM T1 WHERE e>1;
                  
                      INSERT INTO T1 VALUES(b,a);
                  
                  END;
                  
                  .;
                  /** The statement on the previous line, ".;" is SqlTool specific.
                   *  This command says to save the input up to this point to the
                   *  edit buffer and send it to the database server for execution.
                   *  I added the SELECT statement below to give imm
                   */
                  
                  /* This should show 3 rows, one containing values 4 and 2 (in this order)...*/
                  SELECT * FROM t1;
                  


                  Note that, inside of raw mode, you can use any kind of formatting that your database engine needs or permits: Whatever you enter-- blank lines, comments, everything-- will be transmitted to the database engine.

                  This file resides at testrun/sqltool/sqljrt.sql

                  Example 1.17. SQL/JRT Example

                  /*
                   * $Id: sqljrt.sql 3353 2009-12-15 19:52:13Z unsaved $
                   *
                   * Tests SQL/JRT
                   */
                  
                  create function dehex(VARCHAR(80), INTEGER)
                      returns INTEGER
                      no sql
                      language java
                      external name 'CLASSPATH:java.lang.Integer.valueOf'
                  .;
                  
                  CALL dehex('12', 16);
                  *if (*? != 18)
                      \q SQL/JRT function failed
                  *end if
                  


                  This file resides at testrun/sqltool/sqlpsm.sql

                  Example 1.18. SQL/PSM Example

                  /*
                   * $Id: sqlpsm.sql 826 2009-01-17 05:04:52Z unsaved $
                   *
                   * Tests SQL/JRT
                   */
                  
                  create table customers(
                      id INTEGER default 0, firstname VARCHAR(50), lastname VARCHAR(50),
                      entrytime TIMESTAMP);
                  
                  create procedure new_customer(firstname varchar(50), lastname varchar(50))
                      modifies sql data
                      insert into customers values (
                          default, firstname, lastname, current_timestamp)
                  .;
                  
                  SELECT count(*) FROM customers;
                  *if (*? != 0)
                      \q SQL/PSM preparation failed
                  *end if
                  
                  CALL new_customer('blaine', 'simpson');
                  
                  SELECT count(*) FROM customers;
                  *if (*? != 1)
                      \q SQL/PSM procedure failed
                  *end if
                  


                  Delimiter-Separated-Value Imports and Exports

                  SqlTool's DSV functionality encompasses what many users will recognize as CSV export, as well as portable backup or transfer of data. Those familiar with Oracle's SQL*Loader will recognize the extreme usefulness of the feature set. Besides database- and platform-independent data backups, exports can be used to deploy data sets with applications, to transfer data among multiple database instances (even drastically different database instances such as SQL Server and HyperSQL), and to properly change control data sets with a content management system such as a collaboration server or Subversion. To jump way ahead for a moment to whet your appetite, here is a sample import reject report which will can be generated automatically for you upon import just by setting the PL variable *DSV_REJECT_REPORT (to the desired destination HTML file name).

                  A DSV Import reject report

                  If you wish to, you can review the reject report before deciding whether to commit or roll back the inserts.

                  [Note]Note

                  This feature is independent of HyperSQL Text Tables. (See the Text Tables chapter of the HyperSQL User Guide for details about them). a server-side feature of HyperSQL. It makes no difference to SqlTool whether the source or target table of your export/import is a memory, cache, or text table. Indeed, like all features of SqlTool, it works fine with other JDBC databases. It works great, for example to migrate data from a table of one type to a table of another type, or to another schema, or to another database instance, or to another database system.

                  Most business type people would call this feature "CSV", but there is an important difference. Though "CSV" stands for Comma-Separated Values, the only thing actually distinctive about CSV is not the comma but the way that double-quotes are used for escaping purposes. As discussed in this section, with Delimiter-Separated-Value files, we purposefully choose an effective delimiter instead of the CSV method of using a delimiter which works in some cases and then use double-quoting to escape occurrence of the column-delimiter and of double-quote itself in the actual data. Just by choosing a delimiter which never needs escaping, we eliminate the whole double-quoting complication, and the data in our files always look just like the corresponding data in the database. To make this CSV / Delimiter-separated-value distinction clear, I use the suffix ".dsv" for my data files. This leads me to stipulate the abbreviation DSV for the Delimiter Separated Value feature of HyperSQL.

                  Use the \x command to eXport a table to a DSV file, and the \m command to iMport a DSV file into a pre-existing table. Use command \x? or \m? for a listing of all related commands and options.

                  The row and column delimiters may be any String (or even a regular expression for import), not just a single character. The export function is more general than just a table data exporter. Besides the trivial generalization that you may specify a view or other virtual table name in place of a table name, you can alternatively export the output of any query which produces normal text output. (This could actually even be multiple multiple-line SQL statements, as long as the last one outputs the needed data cells). A benefit to specifying even a simple query is that it allows you to export only some columns of a table, and to specify a WHERE clause to narrow down the rows to be exported (or perform any other SQL transformation, mapping, join, etc.). A specific use for this would be to exclude columns of binary data (which can be exported by other means, such as a PL loop to store binary values to files with the \bd command), or pseudo-or derived columns.

                  Note that the import command will not create a new table. This is because of the impossibility of guessing appropriate types and constraints based only on column names and a data sampling (which is all that a DSV-importer has access to). Therefore, if you wish to populate a new table, create the table before running the import. The import file does not need to have data for all columns of a table. The only required columns are those required by database constraints (non-null, indexes, keys, etc.) One specific reason to omit columns is if you want values of some columns to be created automatically by column DEFAULT settings, triggers, HyperSQL identity sequences, etc. Another reason would be to skip binary columns.

                  Due to wildly varying support and behavior of data and time types in SQL databases, SqlTool always converts date-type and time-type values being imported from DSV files using java.sql.Timestamps. This usually provides more resolution than is needed, but is required for portability. Therefore, questions about acceptable date/time formats are ultimately decided by the Java's java.sql.Timestamp class.

                  Simple DSV exports and imports using default settings

                  Even if you need to change delimiters, table names, or file names from the defaults, I suggest that you run one export and import with default settings as a practice run. A memory-only HyperSQL instance is ideal for test runs like this.

                  This command exports the table icf.projects to the file projects.dsv in the current directory (where you invoked SqlTool from). By default, the output file name will be the specified source table name plus the extension .dsv.

                  Example 1.19. DSV Export Example

                      SET SCHEMA icf;
                      \x projects


                  We could also have run \x icf.projects (which would have created a file named icf.projects.dsv) instead of changing the session schema. In this example we have chosen to make the export file name independent of the schema to facilitate importing it into a different schema.

                  Take a look at the output file. Notice that the first line consists of column names, not data. This line is present because it will be needed if the file is to used for a DSV import. Notice the following characteristics about the export data. The column delimiter is the pipe character "|". The record delimiter is the default line delimiter character(s) for your operating system. The string used to represent database NULLs is [null]. See the next section for how to change these from their default values.

                  [Warning]Warning

                  You can not DSV import Array values where any Array elements contain commas, for example an Array of VARCHARs which contain one or more commas. There is no such limitation on DSV exports, which you can use for purposes other than SqlTool importing, or you could use a script to change the commas to some other character.

                  This command imports the data from the file projects.dsv in the current directory (where you invoked SqlTool from) into the table newschema.projects. By default, the output table name will be the input filename after removing optional leading directory and trailing final extension.

                  Example 1.20. DSV Import Example

                      SET SCHEMA newschema;
                      \m projects.dsv


                  If the DSV file was named with the target schema, you would have skipped the SET SCHEMA command, like \m newschema.projects.dsv. In order to allow for more flexibility, the default input input delimiters are not exactly the same as the output delimiters. The input delimiters are regular expressions. The input column delimiter happens to be the regular expression corresponding exactly to "|"; but the input record delimiter matches UNIX, Windows, Mac, and HTTP line breaks.

                  Specifying queries and options

                  For a hands on example of a DSM import which generates an import report and uses some other options, change to directory HSQLDB/sample and play with the working script dsv-sample.sql [1]. You can execute it like

                      java -jar ../lib/sqltool.jar mem dsv-sample.sql

                  (assuming that you are using the supplied sqltool.rc file or have have urlid mem set up).

                  The header line in the DSV file is required at this time. (If there is user demand, it can be made optional for exporting, but it will remain required for importing).

                  Your export will fail if the output column or record delimiter, or the null representation value occurs in the data being exported. You change these values by setting the PL variables *DSV_COL_DELIM, *DSV_ROW_DELIM, *DSV_NULL_REP. Notice that the asterisk is part of the variable names, to indicate that these variables are used by SqlTool internally. Regular expressions have their own mechanism for including special characters. *DSV_NULL_REP effects normal displaying of VARCHAR output to screen or stdout, not just importing and exporting-- so you should reset the value if you want to revert to normal display behavior. When specifying output delimiters, you can use the escape sequences \n, \r, \f, \t, \\, and decimal, octal or hex specifications like \20, \020, \0x20. For example, to change the column delimiter to the tab character, you would give the command

                      * *DSV_COL_DELIM = \t

                  The input (\m) delimiter values, *DSV_COL_SPLITTER and *DSV_ROW_SPLITTER, are set using normal Perl/Java regexp syntax. There are escapes for specifying special characters, and anything else you would need. Input vs. output row and column delimiters are easily distinguished by containing "SPLITTER" for splitting input (\m) files; or "DELIM" for the delimiters that we will write (\x) among the data.

                  [Tip] *DSV...DELIM vs *DSV...SPLITTER settings

                  Both the ...DELIM and the ...SPLITTER settings are for delimiting cells of data, but whereas our DELIM values are literal things that SqlTool will write right into a DSV file, SPLITTER values are patterns for detecting the literal delimiters in existing DSV files.

                  The settings named like *DSV...SPLITTER are input delimiters specified as regular expressions following the rules in the API spec for java.util.regex.Pattern. The settings named like *DSV...SPLITTER are output delimiters specified as constant strings which can contain escape sequences to represent special characters (as documented in this section).

                  For imports, you must always specify the source DSV file path. If you want to export to a different file than one in the current directory named according to the source table, set the PL variable *DSV_TARGET_FILE, like

                      * *DSV_TARGET_FILE = /tmp/dtbl.dsv

                  For exports, you must always specify the source table name or query. If you want to import to a table other than that derived from the input DSV file name, set the PL variable *DSV_TARGET_TABLE. The table name may contain a schema name prefix.

                  You don't need to import all of the columns in a data file. To designate the fields to be skipped, iether set the PL PL variable *DSV_SKIP_COLUMNS, or replace the column names in the header line to "-" (hyphen). The value of *DSV_SKIP_COLUMNS is case-insensitive, and multiple column names are separated with white space and/or commas.

                  You can specify a query instead of a tablename with the \x command in order to filter or transform data from a table or view, or to export the output of a join, etc. You must set the PL variable *DSV_TARGET_FILE, as explained above (since there is no table name from which to automatically map a file name).

                  Example 1.21. DSV Export of an Arbitrary Query

                      * *DSV_TARGET_FILE = outfile.txt
                      \x SELECT entrydate, 2 * aval "Double aval", modtime FROM bs.dtbl


                  Note that I specified the column label alias "Double aval" so that the label for that column in the DSV file header will not be blank. You can type a query line as long long as you want to, but if you want to use a specified query that spans multiple lines, then you must use the command variant \x : to use the query in the previous edit buffer. (To populate the edit buffer with your multi-line SQL query, you must execute the command before... usually undesirable, or end the SQL with a blank line instead of a ;... only works interactively, or use Raw Mode).

                  By default, imports will abort as soon as a error is encountered during parsing the file or inserting data. If you invoke SqlTool with a SQL script on the command line, the failure will cause SqlTool to roll back and exit. If run interactively, you can decide whether to commit or roll back the rows that inserted before the failure. You can modify this behavior with the \a and \c settings.

                  If you set either a reject dsv file or a reject report file, then failures during imports will be reported but will not cause the import to abort. When run in this way, SqlTool will give you a report at the end about how many records were skipped, rejected, and successfully inserted. The reject dsv file is just a dsv file with exact copies of the dsv records that failed to insert. The reject report file is a HTML report which lists, for every rejected record, why that record was rejected. \m? will show you that the required PL variables for this functionality are *DSV_REJECT_FILE and *DSV_REJECT_REPORT. In both cases, you set the variable value to the path of the file which SqlTool will create.

                  Reject reports use the same templating system as SqlTool HTML reports. Therefore you can set SqlTool system PL variables *TOP_HTMLFRAG_FILE or *BOTTOM_HTMLFRAG_FILE to use your own opening and closing HTML and to completely replace the styling. If you use the default templates you can set user PL variable REPORT_TITLE for the obvious reason, and you can place a file named overrides.css into the same directory as your generated report, for the obvious purpose. You can use PL variable references in your own fragment files (remember to use the ${:VARNAME} construct to prevent errors for variables that are not set). You can also use automatically set variables like *TIMESTAMP and *REVISION

                  To allow for user-friendly entry of headers, we require that tables for DSV import/exports use standard column names. I.e., no column names that would require quoting in interactive SQL statements. The DSV import and export parsers are very smart and user-friendly. The data types of columns are checked so that the parser can make safe assumptions about white space and blank entries in the data. If a column is a JDBC Boolean type, for example, then we know that a field value of " True " obviously means "True", and that a field value of "" obviously means null. Since we require vanilla style column names, we allow white space anywhere in the header column. We allow blank lines anywhere (where "lines" are delimited by *DSV_ROW_DELIM). By default, commented lines are ignored, but this can be disabled (by setting DSV_SKIP_PREFIX to the empty string) or you can change the delimiter character from # to whatever you want (by setting DSV_SKIP_PREFIX to that value).

                  [Important]Use In-Program Help for Importing and Exporting

                  Run the command "\x?" or "\m?" to see the several system PL variables which you can set to adjust reject file behavior, commenting behavior, and other DSV features. The in-program help is the definitive reference for available options, not this manual.

                  You can also define some settings right in the DSV file, and you can even specify multiple header lines in a single DSV file. I use this last feature to import data from one data set into multiple tables that are joined. Since I don't have any more time to dedicate to explaining all of these features, I'll give you some examples from working DSV files and let you take it from there.

                  Example 1.22. Sample DSV headerswitch settings

                      # RCS keyword was here.
                  
                      headerswitch{
                      itemdef:name|-|-|hardness|breakdc|-
                      simpleitemdef:itemdef_name|maxvalue|weight|-|-|maxhp
                      }


                  I'll just note that the prefixes for the header rows must be of format target-table-name + :. You can use * for target-table-name here, for the obvious purpose.

                  Example 1.23. DSV targettable setting

                      targettable=t


                  This last example is from the SqlTool unit test file dsv-trimming.dsv. These special commands must be at the top of the file (before any normal data or header lines).

                  There is also the *DSV_CONST_COLS setting, which you can use to automatically write static, constant values to the specified columns of all inserted rows.

                  CSV Imports and Exports

                  The only difference between CSV and DSV is that CSVs allow presence of the column delimiter in the CSV file, and require the use of double-quotes to escape occurrences of both that column delimiter and of double-quotes in the real data cells. To enable this double-quote escaping, just use commands \xq and \mq instead of \x and \m. Since CSV is this double-quote escaping, SqlTool's \xq and \mq commands initiate CSV exports and imports. Conflicting with the name, CSV files do not need to use comma as the column delimiter, and the tab character is a common alternative. Since CSV importing and exporting is implemented as a sub-case of DSV import and exporting, everything in the Delimiter-Separated-Value Imports and Exports section applies, and CSV users should definitely read that section.

                  I should also mention the trivial difference between \xq and \x that if you do not specify *DSV_TARGET_FILE, the default filename suffix will be ".csv" instead of ".dsv".

                  Always use command \mq? or \xq? to list all available import and export options.

                  Settings Often of Interest to CSV User

                  *DSV_COL_DELIM

                  Set to what column delimiter to write to the CSV file. Values of "," and "\t" (without the quotes) are most common with CSVs. This is what SqlTool will use to separate the values in a single output CSV file line.

                  *DSV_COL_SPLITTER

                  Set to the column-delimiter character in the CSV file to be read. This is what SqlTool will use to split each line into multiple cell values. Values of "," and "\t" (without the quotes) are most common with CSVs.

                  *NULL_REP_TOKEN

                  This effects only data coming from or destined to columns with a string data type, because nulls can easily be distinguished from non-nulls for other data types. By default, SqlTool will distinguish between nulls and empty strings for string columns. Many CSV-support applications can't handle importing or exporting nulls. In you are interfacing to such an app, set Java system property 'sqltool.REMOVE_EMPTY_VARS' to false and set *NULL_REP_TOKEN to the empty string like "* *NULL_RP_TOKEN =". This will cause both nulls and empty strings to write empty strings to the export CSV file; and will cause empty strings in the import CSV file to create nulls. (The Java system property setting will become unnecessary with the next minor relase of SqlTool because that is going to be SqlTool's default behavior). *NULL_REP_TOKEN also effects how nulls in VARCHAR columns are represented in regular query output (non-exports), so after your exporting/importing you will often want to reset it with "* - *NULL_REP_TOKEN" unless you will be exiting SqlTool immediately.

                  *ALL_QUOTED

                  Every cell value will be quoted upon \xq, instead of just those values containing a column delimiter character or double-quote that needs escaping. *ALL_QUOTED does not effect the *NULL_REP_TOKEN. If you want the null-rep token to be double-quoted took, then you must set the *NULL_REP_TOKEN value itself to be double-quoted.

                  *DSV_REJECT_REPORT

                  Set this to the path of a HTML file that will be generated if any bad input records are encountered upon \mq. Instead of aborting, SqlTool will continue and import every record that it is able to. You can view the summary counts (always displayed) and/or the reject report before deciding whether to commit or rollback the new database records.

                  This sample shows everything you need to know to get going with CSV. csv-sample.sql [1].

                  Example 1.24. Sample CSV export + import script

                  /*
                   * $Id: csv-sample.sql 4812 2011-11-20 21:31:49Z unsaved $
                   *
                   * Create a table, CVSV-export the data, import it back.
                   */
                  
                  * *DSV_COL_DELIM = ,
                  * *DSV_COL_SPLITTER = ,
                  -- Following causes a reject report to be written if there are any bad records
                  -- during the import.  To test it, enable the "FORCE AN ERROR" block below.
                  * *DSV_REJECT_REPORT = import.html
                  
                  -- 1. SETTINGS
                  -- For applications like MS Excel, which can't import or export nulls, we have
                  -- to dummy down our database empty strings to export and import as if they
                  -- were nulls.
                  * *NULL_REP_TOKEN =
                  
                  -- Enable following line to quote every cell value
                  -- * *ALL_QUOTED = true
                  
                  
                  -- 2. SET UP TEST DATA
                  CREATE TABLE t (i INT, v VARCHAR(25), d DATE);
                  INSERT INTO t(i, v, d) VALUES (1, 'one two three', null);
                  INSERT INTO t(i, v, d) VALUES (2, null, '2007-06-24');
                  INSERT INTO t(i, v, d) VALUES (3, 'one,two,,three', '2007-06-24');
                  INSERT INTO t(i, v, d) VALUES (4, '"one"two""three', '2007-06-24');
                  INSERT INTO t(i, v, d) VALUES (5, '"one,two"three,', '2007-06-24');
                  INSERT INTO t(i, v, d) VALUES (6, '', '2007-06-24');
                  commit;
                  
                  -- 3. CSV EXPORT
                  /* Export */
                  \xq t
                  /*  FORCE AN ERROR.  Enable the following 3 lines to force a bad CSV record.
                  \o t.csv
                  \p barf
                  \o
                  */
                  
                  -- 4. BACK UP AND ZERO SOURCE TABLE
                  CREATE TABLE orig AS (SELECT * FROM t) WITH DATA;
                  DELETE FROM t;
                  commit;
                  
                  -- 5. CSV IMPORT
                  \mq t.csv
                  commit;
                  
                  -- 6. MANUALLY EXAMINE DIFFERENCES BETWEEN SOURCE AND IMPORTED DATA.
                  -- See <HSQLDB_ROOT>/testrun/sqltool/csv-roundtrip.sql to see a way to make
                  -- this same comparison programmatically.
                  * - *NULL_REP_TOKEN
                  \p
                  \p ORIGINAL:
                  SELECT * FROM orig;
                  \p
                  \p IMPORTED:
                  SELECT * FROM t;
                  \p
                  \p The empty string in the source table will have been translated to null in
                  \p the imported data.
                  \p You can see that the generated CSV file represents both nulls and
                  \p empty strings as nothing, hence the convergence.
                  


                  Unit Testing SqlTool

                  The SqlTool unit tests reside at testrun/sqltool in your HyperSQL distribution or source code repository. Just run runtests in that directory to execute all of the tests (except for non-Windows, non-UNIX, non-MacOS users, who must invoke ../../build/gradlew directly). Read the file README.txt to find out all about file naming conventions so that you can write your own SQL test script files.

                  The system requirements to run the tests is now just a Java 6 JRE. The real test runner is implemented in the Groovy script runtests.groovy. By just typing runtests, Windows and Linux (incl. MacOS) users will invoke their OS-specific scripts. All users can invoke Gradle manually instead if they wish to, using either ../../build/gradlew or a local Gradle installation. If you have Groovy installed, you can cut out all of the wrappers and invoke the Groovy script directly, like groovy runtests.groovy (or change the interpreter line within the script file to point to your own groovy path).



                  [1] To reduce the time I will need to spend maintaining this document, in this chapter I am giving the path to the sample directory as it is in HyperSQL 2.0.x distributions, namely, HSQLDB_HOME/sample. Users of HSQLDB before 2.0.x should translate these sample directory paths to use HSQLDB_HOME/src/org/hsqldb/sample/....

                  Chapter 2. Hsqldb Test Utility

                  The org.hsqldb.test package contains a number of tests for various functions of the database engine. Among these, the TestUtil class performs the tests that are based on scripts. To run the tests, you should compile the hsqldbtest.jar target with Ant and JUnit.

                  The TestUtil class should be run in the /testrun/hsqldb directory of the distributed files. It then runs the set of TestSelf*.txt files in the directory. To start the application in Windows, change to the directory and type:

                   java org.hsqldb.test.TestUtil

                  All files in the working directory with names matching TestSelf*.txt are processed in alphabetical order.

                  You can add your own scripts to test different series of SQL queries. The format of the TestSelf*.txt file is simple text, with some indentation and prefixes in the form of Java-style comments. The prefixes indicate what the expected result should be.

                  The class org.hsqldb.test.TestScriptRunner is a more general program which you can use to test any script files which you specify (with scripts of the same exact format as described below). For example,

                  java org.hsqldb.test.TestScriptRunner --urlid=mem script1.tsql script2.sql

                  You must have the HSQLDB classes, including the util and test classes, in your CLASSPATH. The urlid must be set up in an RC file as explained in the RC File Authentication Setup section. Use the rcfile= argument to specify an RC file other than the default of testscriptrunner.rc in the current directory. To see all invocation possibilities, just run TestScriptRunner with no arguments at all. TestScriptRunner can run tests sequentially (the default) or in simultaneous asynchronous threads.

                  • Comment lines must start with -- and are ignored

                  • Lines starting with spaces are the continuation of the previous line (for long SQL statements)

                  • SQL statements with no prefix are simply executed.

                  • The remaining items in this list exemplify use of the available command line-prefixes.

                  • The /*s*/ option stands for silent. It is used for executing queries regardless of results. Used for preparation of tests, not for actual tests.

                    /*s*/ Any SQL statement - errors are ignored
                  • The /*c<rows>*/ option is for SELECT queries and asserts the number of rows in the result matches the given count.

                    /*c<rows>*/ SQL statement returning count of <rows>
                  • The /*u*/ option is for queries that return an update count, such as DELETE and UPDATE. It asserts the update count matches.

                    /*u<count>*/ SQL statement returning an update count equal to <count>
                  • The /*e*/ option asserts that the given query results is an error. It is mainly used for testing the error detection capabilities of the engine. The SQL State of the expected error can be defined, for example /*e42578*/, to verify the returned error. This option can be used with syntactically valid queries to assert a certain state in the database. For example a CREATE TABLE can be used to assert the table of the same name already exists.

                    /*e*/ SQL statement that should produce an error when executing
                  • The /*r....*/ option asserts the SELECT query returns a single row containing the given set of field values.

                    /*r<string1>,<string2>*/ SQL statement returning a single row ResultSet equal to the specified value
                  • The extended /*r...*/ option asserts the SELECT query returns the given rows containing the given set of field values.

                    /*r
                        <string1>,<string2>
                        <string1>,<string2>
                        <string1>,<string2>
                    */ SQL statement returning a multiple row ResultSet equal to the specified values

                    (note that the result set lines are indented).

                  • The /*d*/ directive just displays the supplied text.

                    /*d*/ Some message
                  • The /*w MILLIS*/ directive causes the test to Wait for a specified number of millisedonds.

                    /*w 1000*/ Optional message
                  • The /*w ENFORCE_SEQUENCE WAITER_NAME*/ directive causes the test to Wait for the specified Waiter. A waiter is just name that is used to associate a /*w*/ directive to its corresponding /*p*/ directive. The ENFORCE_SEQUENCE argument must be set to true or false to specify whether to fail unless the /*p*/ command runs after the /*w*/ command is waiting.

                    /*w true script4*/ Optional message
                  • The /*p ENFORCE_SEQUENCE WAITER_NAME*/ directive is the peer directive to /*w*/, which causes a waiting thread to Proceed.

                    /*p true script4*/ Optional message
                  • All the options are lowercase letters. During development, an uppercase can be used for a given test to exclude a test from the test run. The utility will just report the test blocks that have been excluded without running them. Once the code has been developed, the option can be turned into lowercase to perform the actual test.

                  See the TestSelf*.txt files in the /testrun/hsqldb/ directory for actual examples.

                  The String ${timestamp} may be used in script messages (like in /*d*/, /*w*/, /*p*/). It expands to the current time, down to the second. For example,

                  /*d*/ It is now ${timestamp}

                  Chapter 3. Database Manager

                  Fred Toussi

                  The HSQL Development Group

                  Blaine Simpson

                  The HSQL Development Group

                  $Revision: 4904 $

                  2012-08-06 00:15:25+0100

                  Brief Introduction

                  The Database Manager tool is a simple GUI database query tool with a tree display of the tables. Both AWT and SWING versions of the tool are available and work almost identically. The AWT version class name is org.hsqldb.util.DatabaseManager; the SWING version, org.hsqldb.util.DatabaseManagerSwing. The SWING version has more refinements than the AWT version.

                  The AWT version of the database manager can be deployed as an applet in a browser. A demo HTML file with an embedded Database Manager is included in the /demo directory.

                  When the Database Manager is started, a dialogue allows you to enter the JDBC driver, URL, user and password for the new connection. A drop-down box, Type, offers preset values for JDBC driver and URL for most popular database engines, including HSQLDB. Once you have selected an item from this drop-down box, you should edit the URL to specify the details of the database or any additional properties to pass. You should also enter the username and password before clicking on the OK button.

                  The connection dialogue allows you to save the settings for the connection you are about to make. You can then access the connection in future sessions. To save a connection setting, enter a name in the Setting Name box before clicking on the OK button. Next time the connection dialogue is displayed, the drop-down box labelled Recent will include the name for all the saved connection settings. When you select a name, the individual settings are displayed in the appropriate boxes.

                  The small Clr button next to the drop-down box allows you to clear all the saved settings. If you want to modify an existing setting, first select it from the drop-down box then modify any of the text boxes before making the connection. The modified values will be saved.

                  Most SWING menu items have context-sensitive tool tip help text which will appear if you hold the mouse cursor still over the desired menu item. (Assuming that you don't turn Tooltips off under the Help menu.

                  The database object tree in the SWING version allows you to right click on the name of a table or column and choose from common SQL statements for the object, for example SELECT * FROM thistable ... If you click on one of the given choices, the sample statement is copied to the command window, where you can modify and complete it.

                  The DatabaseManagers do work with HSQLDB servers serving TLS-encrypted JDBC data. See the TLS section of the Listeners chapter of the HyperSQL User Guide

                  [Tip]Tip

                  If you are using DatabaseManagerSwing with Oracle, you will want to make sure that Show row counts and Show row counts are both off before connecting to the database. You may also want to turn off Auto tree-update, as described in the next section.

                  Auto tree-update

                  By default, the object tree in the left panel is refreshed when you execute DDL which may update those objects. If you are on a slow network or performance-challenged PC, use the view / Auto-refresh tree menu item to turn it off. You will then need to use the viewRefresh tree menu item every time that you want to refresh the tree.

                  [Note]Note

                  Auto-refresh tree does not automatically show all updates to database objects, it only refreshes when you submit DDL which may update database objects. (This behavior is a compromise between utility and performance).

                  Automatic Connection

                  You can use command-line switches to supply connection information. If you use these switch(es), then the connection dialog window will be skipped and a JDBC connection will be established immediately. Assuming that the hsqldb.jar (or an alternative jar) are in your CLASSPATH, this command will list the available command-line options.

                      java org.hsqldb.util.DatabaseManagerSwing --help

                  It's convenient to skip the connection dialog window if you always work with the same database account.

                  [Warning]Warning

                  Use of the --password switch is not secure. Everything typed on command-lines is generally available to other users on the computer. The problem is compounded if you use a network connection to obtain your command line. The RC File section explains how you can set up automatic connections without supplying a password on the command line.

                  RC File

                  You can skip the connection dialog window securely by putting the connection information into an RC file and then using the --urlid switch to DatabaseManager or DatabaseManagerSwing. This strategy is great for adding launch menu items and/or launch icons to your desktop. You can set up one icon for each of the database accounts which you regularly use.

                  The default location for the RC file is dbmanager.rc in your home directory. The RC File Authentication Setup section explains how to put the connection information into this text file. If you also run SqlTool, then you can share the RC file with SqlTool by using a sym-link (if your operating system supports sym links), or by using the --rcfile switch for either SqlTool or DatabaseManagerSwing.

                  [Warning]Warning

                  Use your operating system facilities to prevent others from reading your RC file, since it contains passwords.

                  To set up launch items/icons, first experiment on your command line to find exactly what command works. For example,

                  java -cp /path/to/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing --urlid mem

                  Then, use your window manager to add an item that runs this command.

                  Using the current DatabaseManagers with an older HSQLDB distribution.

                  This procedure will allow users of a legacy version of HSQLDB to use all of the new features of the DatabaseManagers. You will also get the new version of the SqlTool! This procedure works for distros going back to 1.7.3.3 at least, probably much farther.

                  These instructions assume that you are capable of running an Ant build. See the Building Appendix of the HyperSQL User Guide.

                  1. Download and extract a current HSQLDB distribution. If you don't want to use the source code, documentation, etc., you can use a temporary directory and remove it afterwards.

                  2. Cd to the build directory under the root directory where you extracted the distribution to.

                  3. Run ant hsqldbutil.

                  4. If you're going to wipe out the build directory, copy hsqldbutil.jar to a safe location first.

                  5. For now on, whenever you are going to run DatabaseManager*, make sure that you have this hsqldbutil.jar as the first item in your CLASSPATH.

                  Here's a UNIX example where somebody wants to use the new DatabaseManagerSwing with their older HSQLDB database, as well as with Postgresql and a local application.

                  CLASSPATH=/path/to/hsqldbutil.jar:/home/bob/myapp/classes:/usr/local/lib/pg.jdbc3.jar
                  export CLASSPATH
                  java org.hsqldb.util.DatabaseManagerSwing --urlid urlid

                  DatabaseManagerSwing as an Applet

                  DatabaseManagerSwing is also an applet. You can use it in HTML, JSPs, etc. Be aware that in Applet mode, actions to load or save local files will be disabled, and attempts to access any server other than the HTML-serving-host will fail.

                  Since the Applet can not store or load locally saved preferences, the only way to have persistent preference settings is by using Applet parameters.

                  DatabaseManagerSwing Applet Parameters

                  jdbcUrl

                  URL of a data source to auto-connect to. String value.

                  jdbcDriver

                  URL of a data source to auto-connect to. String value. Defaults to org.hsqldb.driver.JDBCDriver.

                  jdbcUser

                  User name for data source to auto-connect to. String value.

                  jdbcPassword

                  Password for data source to auto-connect to. String value. Defaults to zero-length string.

                  schemaFilter

                  Display only object from this schema in the object navigator. String value.

                  laf

                  Look-and-feel. String value.

                  loadSampleData

                  Auto-load sample data. Boolean value. Defaults to false.

                  autoRefresh

                  Auto-refresh the object navigator when DDL modifications detected in user SQL commands. Boolean value. Defaults to true.

                  showRowCounts

                  Show number of rows in each table in the object navigator. Boolean value. Defaults to false.

                  showSysTables

                  Show system tables in the object navigator. Boolean value. Defaults to false.

                  showSchemas

                  Show object names like schema.name in object navigator. Boolean value. Defaults to true.

                  resultGrid

                  Show query results in Gui grid (as opposed to in plain text). Boolean value. Defaults to true.

                  showToolTips

                  Show help hover-text. Boolean value. Defaults to true.

                  Chapter 4. Transfer Tool

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 4904 $

                  2012-08-06 00:15:25+0100

                  Table of Contents

                  Brief Introduction

                  Brief Introduction

                  Transfer Tool is a GUI program for transferring SQL schema and data from one JDBC source to another. Source and destination can be different database engines or different databases on the same server.

                  Transfer Tool works in two different modes. Direct transfer maintains a connection to both source and destination and performs the transfer. Dump and Restore mode is invoked once to transfer the data from the source to a text file (Dump), then again to transfer the data from the text file to the destination (Restore). With Dump and Restore, it is possible to make any changes to database object definitions and data prior to restoring it to the target.

                  Dump and Restore modes can be set via the command line with -d (--dump) or -r (--restore) options. Alternatively the Transfer Tool can be started with any of the three modes from the Database Manager's Tools menu.

                  The connection dialogue allows you to save the settings for the connection you are about to make. You can then access the connection in future sessions. These settings are shared with those from the Database Manager tool. See the appendix on Database Manager for details of the connection dialogue box.

                  From version 1.8.0 Transfer Tool is no longer part of the hsqldb.jar. You can build the hsqldbutil.jar using the Ant command of the same name, to build a jar that includes Transfer Tool and the Database Manager.

                  When collecting meta-data, Transfer Tool performs SELECT * FROM <table> queries on all the tables in the source database. This may take a long time with some database engines. When the source database is HSQLDB, this means memory should be available for the result sets returned from the queries. Therefore, the memory allocation of the java process in which Transfer Tool is executed may have to be high.

                  The current version of Transfer is far from ideal, as it has not been actively developed for several years. The program also lacks the ability to create UNIQUE constraints and creates UNIQUE indexes instead. However, some bugs have been fixed in the latest version and the program can be used with most of the supported databases. The best way to use the program is the DUMP and RESTORE modes, which allow you to manually change the SQL statements in the dump file before restoring to a database. A useful idea is to dump and restore the database definition separately from the database data.

                  Appendix A. SqlTool System PL Variables

                  As of SqlFile revision 4863

                  SqlTool System PL variables are the mechanism used to configure SqlTool behavior. You can list all set PL variables by running the SqlTool command * listvalues. If a SqlTool System variable is not shown, then it is unset (which is equivalent to non-null). But if a system variable is not set, that doesn't mean that the setting behavior will be unset, but rather that the default behavior will apply. For example, if you * listvalues and the variable *DSV_COL_DELIM is not listed, that doesn't mean that there will be no DSV column delimiter, but that the default DSV column delimiter will be used. The in-program help can be used to determine what the default behavior is. (In the case of *DSV_COL_DELIM, you can see the default behavior by running \x?.

                  Besides System PL variables, there are also user PL variables which have names beginning with a letter, and the special variables ? and NULL. NULL is completely equivalent to *NULL, which is explained below. See the SqlTool chapter about ?.

                  *ALL_QUOTED

                  Boolean. Whether to quote all values (excluding null values) in a \xq export. No effect on any command other than \xq.

                  *BOTTOM_HTMLFRAG_FILE

                  File path to HTML fragment file to close the HTML report or DSV import reject file.

                  *DSV_COL_DELIM

                  Literal string (which may contain character escapes). DSV or CSV output column delimiter literal. Run \x? to see default value and details.

                  *DSV_COL_SPLITTER

                  Regular expression. DSV or CSV input column delimiter regular expression. Run \x? to see default value and details.

                  *DSV_CONST_COLS

                  A list of column_name = column_value|... settings. Specifies constant import values. Run \x? to see default value and details.

                  *DSV_RECORDS_PER_COMMIT

                  Integer. How often to commit upon DSV/CSV imports. Run \x? to see default value and details.

                  *DSV_REJECT_FILE

                  File path. Path to DSV file of rejects rejected upon CSV/DSV imports. Run \x? to see default value and details.

                  *DSV_REJECT_REPORT

                  File path. Path to HTML report about CSV/DSV import failures. Run \x? to see default value and details.

                  *DSV_ROW_DELIM

                  Literal string (which may contain character escapes). DSV or CSV output row delimiter literal. Run \x? to see default value and details.

                  *DSV_ROW_SPLITTER

                  Regular expression. DSV or CSV input row delimiter regular expression. Run \x? to see default value and details.

                  *DSV_SKIP_COLS

                  A list of column names to skip, like column1|column2 Specifies columns to omit from CSV or DSV importing or exporting. Run \x? to see default value and details.

                  *DSV_SKIP_PREFIX

                  Literal string (which may contain character escapes). Specifies comment delimiter character or string in DSV or CSV files. Run \x? to see default value and details.

                  *DSV_TRIM_ALL

                  Boolean. Trim leading and trailing white space from every cell in CSV or DSV file upon import. Run \x? to see default value and details.

                  *DSV_TARGET_FILE

                  File path. File where to export CSV or DSV to. Run \x? to see default value and details.

                  *DSV_TARGET_TABLE

                  Table name. Table where to import CSV or DSV to. Run \x? to see default value and details.

                  *IGNORE_BANG_STATUS

                  Boolean. If true, then if an external command executed by \! returns error (non-zero) status, SqlTool will not report or try to act on the error. (This will have no effect on what the external program may do).

                  *NULL

                  Null (i.e. always unset).

                  *NULL_REP_HTML

                  Literal string (which may contain character escapes). Same as *NULL_REP_TOKEN, but only applies to HTML reports.

                  *NULL_REP_TOKEN

                  Literal string (which may contain character escapes). String value to represent SQL nulls from VARCHAR columns and null (unset) PL variable values. Applies to what displays on screen and what gets written into export files.

                  *REVISION

                  Read only. Literal string.

                  *ROW

                  Read only. Literal string. Set only inside of * forrow loop bodies. If there is only a single column fetched, then this is equal to that cell of the current row, unless that value is null, in which case *ROW will be the *NULL_REP_TOKEN value.

                  *START_TIME

                  Read only. Literal string. Automatically set to a localized string presenting the date and time.

                  *TIMESTAMP

                  Read only. Literal string. Only usable if *TIMESTAMP_FORMAT has been set. Displays the date and/or time at which this variable is dereferenced.

                  *TIMESTAMP_FORMAT

                  Formatting string, as described below. Setting this variable enables the *TIMESTAMP read-only variable to be used. Set to a date and/or time format like yyyy-MM-dd'T'HH:mm:ss.SSSZ, as described at http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

                  *TOP_HTMLFRAG_FILE

                  File path. File path to HTML fragment file to open the HTML report or DSV import reject file.

                  Appendix B. HyperSQL File Links

                  HyperSQL Files referred to in this Guide

                  HyperSQL files referred to in the text may be retrieved from the canonical HyperSQL documentation site, http://hsqldb.org/doc/2.0, or from the same location you are reading this page from.

                  [Note]Note

                  If you are reading this document with a standalone PDF reader, only the http://hsqldb.org/doc/2.0/... links will function.


                  $Revision: 4904 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/util-guide/html-report.png0000644000175000017500000005664012007570374021723 0ustar renerene‰PNG  IHDRø9zªØÁsBITÛáOà€PLTEÿ×'¨# þùîä @@>ÿûÌÌ̵ªbùâÁüî}“’ŒÙ•LýÙ*mqoü×=™™f÷÷÷úÁ0ྌ¦’ ÿÿÿÔ‰>v\,ý÷é c²¡#ÿöÞÿÿ÷¼¶³(((ÿÿï‹9Ý›V÷Ž'ߨÔÿÿÌš_KƒƒƒÿþæY[Wïïî°¯­àÓÃRRR­œ>{{{Òmh~¸üñåfff<™™™#K‡¬ÿþÔ•†µ²£é¸wý÷¬üÚqþî­333ßѳIYD½½½Ö„i¨„N½^è°kµ;!wƒQèææÿÿ™þàŒÓZ þîÖú½mV}³ºµüÔ`ä¼.ÿý¼ çÏ›ü÷‡§¥Ÿææß:::é–zÔvZü¶cn—.$"Å1ÅÅÅàÞÞèæ×²¨kÖÖÕ33̶lF¸°|JJJýý­{žÈæ®fìçÎP¨–'\r‹û¹];g®Ø@ýçÎþîœ(œVÿü¤E+"í寙™™ûõuÁ$üßIˆùë pHYsØØH‘¦!tEXtSoftwareMacromedia Fireworks 4.0ê&'u IDATxœí‹ÓFº÷½‡®WPÞ¨±J FæÐc)¶ ^ѵ[p¡©N¹¤-TNéëTJÔÄ'pLî’Ï¿þ>s“FWÛI¸ÍbÝF£Ñ|癫F*†¥ÈïNJnõ#]¶JF¡$[n¶©²ö+m_Ú÷}¾5&û»¯}Gc:™ H-¹Tp'qÀïŸüLè÷•}ÞÖÛïZ^A&k'—]§T~öìþ=âÆ“<þ’øï;ÄoÛäg@k¼Eî)XüÝ1ˆRx·ÌÀß¹c<½sÌóvïÖ~ÈŸâXøž,'Éôß2ø‘Ÿ†ýÁüßçMí‹»äc q÷i-º‰£àí;Ÿß¹óù±]е“«óþ‹ŽFnH–á¤wnò$õ&c½Mî<–G˜V`îÜn/~ûËÏAÇŽÞÝ}öøñ—þY&Bó0Á¿CòoHo“{2–Èn7bü*€ÿô»»ŸÕøò=,IAÀ4Gz;&_’Vg›áƒz×wn"„:·Š|ó¦!WGù¡VïÃÿBž…vȲZ?öý`a0èn—Ñâ Ú:ìSmØíDÀŽÀ‹òúÏ:üøK+¡’"Áäßù:d¼RÉ®„–£/NÉžòq¯”ÂÚäÀ¯DÀãR/´wÀc!y¶Ça¡´œºf‡WJº«—¸Ýø/OžüãØýûÏ>»öÃ'wè9ºµˆäá_K=Tð©äqɆ…Z"–ßuº]O7\ÍÐ$£kc;/kG®<­k–<µ$½n×V¸°4àѶEZz ÖKjÝ®sˆ\7áǬãÃÙ ÆþáK B¤’+¸ÈœÐE!sµEãmp·\°ØTßm›Ã‚w/šp*¢å·ÎDK+% ­è‹Qð«ÇŽ»öÙg×®5ÿþÉ*9eQw=$µ‚šŽNÐ,Úû¾" ×áË0$ÛpXðnµîÉn]Å»iÕC¨uݽhÿ%p¿¶º}íÚwŸ|~‡‡öÈ¿óê0É'ÀGY½ƒ,ÞCV‡Àãl ‹"e†êÑ:ªk‚cWˆþLma×$w–\ÀÛõK續2þ.]§8‰9Ûð–Q àÉ%ü¬]Ecá©ãâGëBÀJÞ›…N¹\„Å“nW^ÄXh Ú­{–d¹:GËÃí’[²1Ä0øí;ŸC{ð!×ge¼êðRYæqÈä#èëä§®U9o #D¼¡P‰K([K¸¨×ÐvMsgÕ’é6I] €÷]êžî–MIfàÉ%‚„‚—4kÇ{ºí¨DŽ­s=~‡MžG²PhxÔµQòÌ:u=±n©NóT½„ÜYÄ/•J¨r‡]3ðn“£–ÑÕ5Rëë†À£¾Î#¹<¹W¹Ã™ ¬¢,(⵩ ùýÇ‘Í)X2v»ì”Án¿ËV]Åä±î¬ù€Ã0U]×UÓ0ƒäô¸' 7ã`ù)nÐÁ¬Êô8i>Ñ<ýàHë oÒݲ´½Ð69JBGÉ:ýOÜ–›Âöà$€¤‰IƒÇX(ßvnHÆul; K ­¤Ý>x·ÆN´Úå;vÛ†œ~CÜÓÇìýn†G•}4S‡¸ÃÁŽÉë‹Â’B+aw~±í¹U¤^¨ƒ_2õR©¤›’Õá“?öÔæRèí«KþÀa¢:PÄD"9 KÚnïVƒÝx8j_Ù1¨5ç{CF8fÏé›x ÃĎѧ`™r7~_JƒpÈQè-³tˆÀòÒÁgÓßï ¿QüoU‰7ÄëpÀ32ú#ÍÿÀ7þf€3.øDÓ?p Aö¿ç7dè¾øËQ-!íEõ„Sd“졎–|=‰i)Q›S*³< ¥±I ðp’f eßËw›ú=ˆ‰€gzÒݨÎñŠ|²löz=ÚoÔ£b몯^T*'3*5óè;—äâ¢+¥ÖâÏy?>²Þ‘à~‚‹)”> v"ôôOLs Ÿß—xSïN²eJš¬9¶îH rtÃÑB'œ?韾@úç?ƒ½°r!3fögûŸag§>o-!ãw iAªÚ¼zõak¼³h *ª³ÜªÀ*²ò…qÏÖUSÚD'ì,Yr ah™²º¨ P:ZFçâÎ1 ®¢ÃU$²‹¹’å‡-”sh•µ1.Ǧ#Oè_¸pîÜ7nÜ@™2ÿä¼ß4¸òýÙ³ÝûÏ®]»öÔ0ûÜÜNƒXßtƒu(©øáïH”|°ÒÀŸ(Bú¿|â‰U ÿ™ vêB>)«‚K8nzÛ®ÌÕmµµetçÆv¯ÒîöZ[¶=7^ëµ@=(ñ_솣=¾ŒçÁôøÖØV|k­·Ö:.-V 5çº,>l­­µ¶¼EÉqZ;=[ù‚ÖjuuÇ[´ÖT¸4œÐê®TZö\ËñàĹñŽçUlsœ«AMÀÛè*;p ØåVÆÝ.¸²æÁ ,ѶmTÊuÕ¥Jxšb'N¼~ýý÷¯oÜxñÏÄ|ß°µƒî?»²»{åÆºù³ßPGõ2ô{Ý' ”i.s€ë×ý œþ g_°. o DàrNç€t˜{(«_ªÔë] Þ…ÿ]çñ•J·ÛË•5»·V±{[ãÊœ½Œˆ?iìñmû½.gà±/~lÕqzvwÜ3Qž2W7ìJhCI0V—67ÇÇ»†ŽÁ/,WŽ//nn ö¸§‚ëne®Û­¬­¡Õ­ø áܹqoéîåËô*õÎAÞoµL¯µ¦ë°”*s%[¯Ôé-Þ7ü0ûS_}ïÔ럾8'_¢oÆ5lòX×(w<ÍØÑÏßÿþ èï×þ÷OÿÄqÒÀ!½¶@%‚ë,À‰àúõë4ˆ! rƒ´ÊB]}ž”ñÁݵå½Ö\»ÞÅÄzË­­ÞòNËîçVÎÚËOÎÅ:u–|ð>y¥í»«O*Ýz·5ÆÞ€Mç)]CE™I]¶³yueõ[&$ªsw÷–×¶ ~8O˜ÛªÌÁßw+·aYYY¹}»r{ íÅšÛyøúõÃÊÜwsã•.õÝÜNb¦YÑÕJÉ€Z†¡cƒOnQ†êŽÜ±ËÿüéÏS÷~ýõ×ëßÿ ¤.Drü’Û@БžBm÷>ú}:GuócÜÃèsÄ“dçÐd»|ùrÐã‡U-ÿI’ÊþO°H*À‰à'Ö«‹-ôÏP¢ˆôd×ê—m/-cð½¥';ƒAað[ã-Ø´·Pº¥î…;ùÐÆró'3Œy¥~—€ïÚÝ ß:¾Õ»Ãà{KK°¤©kùÄ‹Ëks+cD8Îïl­ÝqkeåRåÒ ¢ ‹Û°¬œ½tûöÙíØ<{ö zFðö·÷î}[¹t ŽÁ®ï@&Vææ£0·væQ]¥d¨²®í…kÍÑ*4«,C©~é5Ö©{ˆû¯×¬˜Í—ܦ¨„À3kÇàÿƒkmÄliIþñ7>³s´ñï†#‰j8øóû $fá^Ý 8ÿ¸Øe x @@ñ½Œ°Àʉå-0Á9È\w Ò¶Æ`O;ãÛ;PÉ[[>Ó|' ž’Wê8EøÖ¸»q?¾ Få»9’§<|XÙÚ:>^YYoÍïÖñ••³+¿¾wïÞøäÉÛg0P¾t¶ræRe{›€ßÞ®œ= °¼´½}öÌ™Kg·o_|üø"lBz8‹ÓÂYH•³+âÛ-H*hYYÙšŸ‡åü÷É:×=ª_‰îýpýûo~‚ÈÍo\ÛÝ ƒ¿~gå÷Ç~ø“„ç—É ½°8°RàÆ ”¾ÿU")àÔ÷ßÿùç( ø ÑÀ« Ùà÷–{Èò®!-ŸXž_ÛÁ/0ZÛ‚Ü–i~þ!hž×ÎwËhO'2Ô±+”÷ŽW¶¶À€oCÆ}0ʬoÏ ?@«RY¹ýbø$<»rñ[´Š¢<ý,=a[;».ÅCZXAëÛ·.‚`óäÅß*(àdA\<ùÞ< '?~ܪTn?þõ^‚þ "ˆÿˆ‹æ~áB|= |@þ&­É¡|š`úø{”OcÒ`̬ŽN[ñÁЬOM&ýNAEàI¯qr½ª’€‰àÆOA2ÈÎê_,--ñ.c¤˜ìP~L„LÓ§ŸþvfþkOæ¨ÔÑžoo¯ \ø6Ñ Ú ë`§`¬aÿ¾-þ[¼\ %9á"º>lVÀÊñž••“'·‘N"ð·Áð/^ܦz„]m?ztñSì\ž$‡/þR€›§æMtèÔ©?B-lT(ÇÚt|É×S®|G*(¸€ÆhШ) QNGêP}ŸöºÒò†fÜ¡€«qµAHÐl œ°údÙài®Ílù믣(ª ß˜¾LÑì¸Ëõ¦iÝo‘Ù‹D˜8Y}ŒBÊ@‰ hŸ:…ÓÙã¯qjAéì"¬?öO@ÞCR¹ˆ s”¹?Æ›ØÙc¼…6ý”®¶?ý„¯÷ë¯h#Þ×=Ž5Îéý.6Bž`íüˆã^*ñæ¾²àÿ΃GP ·á>Â}î´!ùèßø¢´ñ0ø5B\øóûë$àj©àYQ õ*àþ5f~óNå'‡ßΞØÿúënÝWiCDd¿Ê„¯™N!Ô¾P¤ým 8 åù_³}håQ¹€×¾Æ§½G„ô˜–,gX'æôÌ®OálòÏ?£D°â7ãüb<ã¾BDÀB¹_G9ÇŸ¯“Ž»pm-¡7‡&4Kkž¬9¡›Ká¦!ª¦€Ï#kÃø”3n¼ö'š|Ê ²ú0ׯ¿6ùÊÀ×I qÈtð-Øø·¡3B51ŸðñÇ÷*l¾B5:Z*†€s’¬à½œÚgÛöF¨“.bí+L/wÌg¼è‡¯ž}ÂÊÿÑü€d@¸Ì!ÕøxHÒ\»OŒüÛÇ8_ eëă?{fþñcž+Θ½&ÒŽõ·¾M×cVHÐ| .Ìrå()5øA› •„Lüˆ‰?ØÊYµ°ø.—ÇóàÁÔ¯ÿ=+Ìi.üIX>fºŽ`“‚eø9­o|ù-OÒ ¼tqy@(”)àYIž€4u¤zwæ»ù¸¢æŸfð‰ %õ4–ÇџâÀ¿+ûkjë }¸ŠÍsˆ=VædØ4èHgpjò¨3†”½1èa‹Çõ¿o¢×ç{ü1 >ž;%ƒ_ü4]Œ·_Gzœ¬•µ‡Ó‰¶¸æ`¨uàbLx„,“gìY%-›|ªá‡É³æuR¬Ó‡eÁÅòW‡_‰é;ìízаK㎌˜Á'¶ ù„j_:øEž7´¸¡ú¨Øl ÔäÃ}8tßpï׉ ª¯³uï÷†Ó81†¨ƒ ÷ô=|+æïEà§*äˆÈòÃ~'_øÙXܳë ú>8FÝl –Ç’×ÉìOA>Ü•{! 8˶“ÕŒ‰‚OªvùÄ î`Bÿ$kÿß½ûäɓȃ9™ñ%ÌÞ`ÀÑL,¸ÿH2÷»&‘;8™f4ê3«v¡‘¶?¨ç%k”5֌ь> ‘§±dĆÏÊ#9|,\ž¼'xâÅDÀsØñj#ìĨ6iO`¡1™«±h&-ðJIäÁ=Fv_f­˜ŸX¡€@°¿NMîúu¿ BŒŸ%åÏ„#Y™‰Õ(röÆŸ8sO(Ê#È“óút#9IËÛ)ô`fG8 {5Œm,àg.¯ÏÖ€bD}¬øY;¬¤qŠI7—çý¬çË7h.Àˆûíö$ÅÌŒ1“i¢yO¢Íºl>þ?%ë"©Œ§ÌÏ3”ž3ržø‹˜a§(B;M)ùU¦f¸Ã–m~q‚”ßãÊ`:wœñž ã&m0ÕßO²è4&w¥~0ç»eNyzð¬ÍÕ©"ȳyOdžP<Íöt}ìôðÙè&I_üD«‘<˜ÇÅm†ój~=1 6ÝI‚ÔÝ©™¿ÙÙ)à}ÚS€N%ŸÁ>€m¿k¡¶ª’-#A¸Užt Å)§8Ö‰`Þô‰ .÷ñÇh¸'(Ô© ¼QîJ1& žYw¼žu•/ÆÉJ¤`çÀg°÷ÁÍ´9ãƒÚ[‚+j{#C§÷§ž:p×èƒü°°öHBú[i…}ªø¡HnÁG¨;ºTÒ«êW{ž육d·ÍÔ÷ ùfõ„}‹ ËÿíÛw>V2„Ä‚?ù—ðȸ÷¬Íc¾­'9+Ïßí@²)Qò<ÃG8êš,9Qc>gkºÜFûà&¦Àäõvú{§Þx¦Èç]ûÉîçΕ ùh¶`— ÇlÖñ¿æ¨Ùl:R©ÜåÊxàÁ;u´XO¿î~»µ–⎂׌v¹u’2Ú8LðòýÝ+×ê¶^o^ñîË!ÏOÃåûs_¸œ×¼I~š†iÚõ¶9ñâ»÷ÿötwšPšâ.šèà”SÀ?±1wc2÷€|}»^rt:þÓh£/ÙH¥zçrxL·¦yð£‚÷šþ=„^2†OAßÚJ‚OÀ{í¶¡Ûõz?¿KÀo?_]}ž ^–LÓIL[æ•+OuO“5ýÚî®ò\‘,ྩÜú¯çhÿ/ÇàwéÑ+KÊd¤yjÛ0%»\2Ò³¯+¥¿Íý>Éz_‡‡òVS/¶M bÉk¯'÷¹?Q õɹ'½R/’67ÛîæÂæbyqójÙBuû+HÞ0 üÙ"N%ct!<"o¹®eðà‹$ÄQðFÉÿ#‡,Kf³Ý‘O$5hùe  ^kwÑ!Õ¶»h3 ÞR´ûŸ=óý_HK°ß&B› ¸_‘P#Å«?ݽ¢DÀÿ×­*ÊòóçÊÕyMYU¬ž,cðu:_¹ñMu$»­›ÝnŒêFP~%¸G3ô~ÿáo?~…VÒ‘ÐÛz—·n*ý~}wNq}òA;þn`盛x½s=øÔî]C1Ï-¢ßFþ*ß^+šj´€RÍõ«WÁ“Ü^áÁ“x'àrCgžu$ÿo]ÅDCFÁ¶êøtrÿ¼ÝF­DÕè%¿Ù cQî ˆHžŸ;[ŽcñKåéîS·)\û©ù, Þð·”%yuUYZ]R¶•¥cª²mAn¦”1¢r$’Pû¤Þ,ëív 2M“‹Ã˜ûß¿ÿþ•¿ýíoOŸÝöÕïÉŽX0w.[«ÕÆ`àÊ^‡veqàuTÈ¥%¨´CþP:×…ßz|[Üý\ý.,l6 v®{e~üt½Ô޾í­]Z¿ê7æmR§3øIµôk$•¯+,«7;’[ÖÉ­(ûëäþ,®¦¬—[YÀ· ´Öîv“²úgÏîƒÅxÿâÀó ™Ìç4Vœ·TžBNO’‚ i Þðªµ-o¯Â=ʽcòâ#K>f¡AÆÌªoF§Vl€½dóÖ˜û¯žþÍ×_›_%;¢7 ÜJ»õ¨ä <·ÿÄö4¨ýÅ÷¤®Ÿë9;bñ‹%­¾ˆ~ÛÞ¹sY×ìAc“eóìz§}Õ[³³ôäúà¹Iµ)àÛ`àn™ìQÛÁß:5BÍžAäÎz‡Þ?_×í£àŸAcÎ ç<@Bù—ªª(󷄬þ¾;WbY½i½z¥©ÇäÞ+ÙR5kuÚÞz…Á+Úh8Š•á’fuÖkÍfÉ0lÝóøZ`ÔýîWÍ)öJó«ÝdG,šWÂÑ„YÛÎÀlðàYoxÚlý )ÝŸØõhõþ ”îp`±ã=y‚¹»pÃo½1’¤B S’šõ ?Ï^U‘ ~Ds}¤¶üùÅÿ€Þ©ÆˆVf÷‘×PLDÀC{ ÎÕJxÎu變r_Ùä–ŠþôÊ} 5+¤§W®è!ÏÕzµ­-õ¬ÅcšslGÛÖ´KÇŽ½²Tr…F‘æZ£`“€ÝÐ%)T­º÷~ÿ “ÿëÙõߥ4Gd§É²Ìz½\.3îµp­Þð,‘Ÿ<>· Ü-Ãm ”Á ßö›£õ~ÉÅ“î<Ë2ú}hèöïúä}ðçɤ0TC˰x¦¢üùàYs7¥‡–ñ¡v~¼#+çö.(J‰–„m/Ñâeà}W’v¡Ä½¯[¯vðM­jK·áW;í9+©OÉ—gèzÛ°U}b£Oùý)Éç'×ë W2×h·ÛåõZÙ3Y îII²<(Ù'¶çîÜCÏi׋ë I²–z½ž«i^s½Xìƒ>ÎâýIµ)àŽ#{$«—:Á_Þ­„DkõutÔ£]…‘æÜÝÇ?‚®*ƒTð¨V¯hjR¯xˆ<ªh]yZ9QðÒàÒêŽuªÒK·Yõ¿šug¡$½/Ò×ïsû+èìä>œ:Ä€RB=%^g£,»e2 ‘x²5‰¼Ï=úäÝ2˜xÇÕ677µ¥eM¶Mh9˜Aö‘žÄ[^qÚ£Ž‰WKFðçƒGÍÍu!ª’ûëýv|×îv:$q„ÁËÑ£Í?>V”Tð¸pq‡”èt‰ü~úØ_yz­S/<¼=@ßé}ŒÎî«–ÅH“ 'ëx é÷þz¶yö¯?~5±§-[môcYÀ< ü¹½ºã¢¯µfƒ/iÉÜïîëåjÜ.ím®­ÉZ³Üoó…xBþ||¢š^ðçKÈ.ê«wa%é$Ös§wÛ†NÛ2Ò= IDAT À0ø«?â‡Úÿ8>|¦dý  ×õQ£^…*wúâê+":<Üõì9gJîÊžùê÷¯ÎTšûëyYAÀ] Ì> ™Èj{¢ ÎãžwÌz$ò=HOï«&ƒŸŠ}輘éOØGag¦:¿À_açtMa*Àg( ü4ö³WŽwxÒ•O?6Û"93HPbø»©tà‚;S¦Å‡Ç^Á›n`ò!î±f=÷Ü6O?Â4vÜeÔ˜S]¿Ó¨~¿”òFŒ¬l>é+ù|LAéÀÀÇ0O~6¡;‰kàSp§ríK($fÏàgeœ¼Ûˆ×:øÉÖM=ˆzw94Ñ*`œøzƒŸ"r«‰àSîWçb/rá’@â?ÎWOP2xïÀt§äžÜ°ãßì³/Ô‰ÄyÅÁ{|ÖK˜Rß|-XÉÀÚo™ûLÙ<ºaÄûÒTàco Ë4öQÛžðT–î߃¿¥ƒOÖLÀ³^Ðuðº¹´Ô ”­YÀO¶ì8ïX5,gÄ^*Í–¨DJH×”à'gå—“j僟½gà3ßN‘Å^(E™àM]Xý >êËDîIä_œ¼ÃéäÝiÁ_¤·ROà÷—ˆ2bcÉèõÝ}Äú¾%¡V:€OYàÉlqKyAc,°ð¨/߯ Å U–nï'OÒ×Ëâ—K~zrZðÜ齌süÀÍ>ü¤ü|~Ö(?ˆž=“<ÏuþNn&x9ûKÙÙà?#³ÅŸOþ~ÿéL66œÖS¼¾ûúÔŸcÝ»3-øÐéé>üT¶J}m<|z¤ß4òÝbü(?õ:ñ£äwcéèyDälœZfqIѵkfðŽ ùšL½Nð }¤=ã r%<ÎÖ!øûŠò( ÞlŒLŵ=¥Ýð¼N#(ìïÌÿöÛoó,ÿþ6<ŠÞ;ßÿñq:ñÇþÀã/Ò©ñØÈÌ<åÊ`À‘ç­œ¬Ç"%t±«ä‹åùF¥G\n×ÜØl´×Q>8™úd&ú’1ý:[N>1ªkøs¥d¶Î•+<ù\züe)‘¯ªG¥eƒG¢(èéÿW!‹¯×LEÕ<«n(V‡›lAÀ3ÝÁ¹€?K?þÔ'ü×ÊÂ=¼ï4<÷Ez¼ky<ÞqØÇÅe«¢:ùp掶p¤Æ™›ŸMÎ!_,—¼ŠnضîàY9›ãã¶ÝŠ}þÞ_”¿LQÆoVðÙîÎñò™-÷ñê£k÷ñ-~~.]¡Wiä«ê²ÿÁuºNnxKѼ¤ØÿtóÞv,ÅÚNGð þkô¥"bï_Îß!>úmùËá7Íß9E2ù_Ï+@þWbñÔé‹ç¾H þøñ•ÝEŸ‡ÄïÒ¯ƒûà• œG«8²ü=royŒæÞŒ—é×Éeœ{/–Kè;䦃-.`¶CÜc•€†©4 ¥ÞhÀ¯>Âs÷çë¶nJ.õ™-'‚/ä¿{LþÌ™§xò¹tO#ßGgßI·*º¹<Þq¹ï­/á[&_PwüéÊ˧ÏTà7þ3S‘MàûßT|ß:Š7ªÕm¨cÙrßj9f¥¾Îç ø¿ oËë&ù¹3^ó¬åÝòyíx««:žëU Ûš*>åqk<žS½ð/¢´je³ÐPª…õFaTX/áìÖšnz®eµZ†*AÝŒ.'—ò1ò|çìü.ýxË–ÖÈ÷ÑÙwÒ½Š½SY3J«4G¾·îÒ›D_P×õ pÿǃg^V«gbà¯=ƒšôßIàMôzîP±ê& ðÓ;¿]üöá‰Ôâ/oކ£Íh¿E<@W^þ©^ÀúÏOϾHöÌ·l{¼ezèkÅøõJ½²øPÕŽ‚—$U·Ç6ú²øñ-]7UÝ«‹²„¾Xî¸.WÆk•q»ÛÚŠÙèÅ‹/^EaFåa­T^£aM1uœÁ¨¸h¡>[t9E%À7ΜyxîÌ™3 <ù(»C¿Î}'½Ò… ⤠ñaTtÉ÷Œ¾¨^ÒÍÊËÊi }öe5žÕöÙµk–2øWx¸?OñÖGhö©ÿí·;!Ÿòßž¸C;w.o66c ý;¿¢Œþ5"BñÁ_Øl bÝ:ðüéQæÜÚ² î@®ç8[Ç_?Ÿ Þ<޾Gb«TèçÌ<)YR!߀¬¾T7tRÆkãnݰÇfh®©hÊ=å4zCÉ¡\և뵂©¬WG£ZÎní3©Ï®K–“ËøD‹?óã~úçÏ?[¦àKõîÊØv*=}-ÍJe¥°QIP)¡›4|˰ ÑäA_ÚCÈêOGÀŸ»öì>zQŸö¯$ðõ‚ ࡎgQð_ž¸xçâ‰/)x¬¤áö;¿â¯¾VþøòWå×_ï\à• žû"½‚êNX% ‚¡‚Åë&×·“˜Õ«(±€)Ø­¹¹–M·J&2BÍõL»¢š\¯µº¶ÙëRè $CÓôÚ»÷µð¹ôÂÐ-Ê…2dô…rß9Ž-^¦>{–E–û+ãgÑ÷©Æ¾ÅúØ·ÙÚQ½µ–Ζj¥^YÑ!_·U ÿÁr“6Š&«Reeû˳Q‹‡h¸»ŒÞñ¯ðJ­aÙõŽR·P;žG¾sòÎÂÞïí ?.ÍÀß»zïËÏ•‡èïâ(sn=>ø"=ìØim­tû@ÕÇ;´ˆÇ‘¯Ü!ðã-cn à¡>8g;tKE`[Ë’Ù‚äÊxm­eCñ¯X»š€¨È᎔õº2j”Ö×Ë&X?z_–¼T™SÕã–F}–Øröö.ãÏüàÏpe¼ e¼¹3ÞYoé]š•R{<'!àùóoÙ…U)`ògN?x+ã•'èõ?n*.ôÖ£0Ô×Û¶×®ˆCüoË¿|ü[|ÐÑÏY>MÕ_U®~þùÈëÏŸø#>´ï‘UÃwàÞÕ­±Z0êθÂå£ñæÜâXW×Z(Kº3×un!‹—Q£2‡+ãew ¥pVÀï?}zmWžØsjA5z¼#¹Ôg-÷ÓœÃàÿêõ´VjA‹C‚ê;ðö<²3‡ŠÏq”ù{äϤ7‰¢ICíøêÙ—þq¶r&šÕß•OþˆÞ¯q‘™|ðH% ƒ]«ÙŠY«¡Éû‘2þËå…/>ý”ÇðÏq"ì0MZÆ+ØA„»£Hh $J/©ËÎv$W£>Ël93wþéÓû÷Ñ+W0xH§$”8ˆ¨O–¨¿½&Ôu-¸.þ³ÈM¢]²œ^yü9â~O1ƒ¬žo"[÷ÌxÒœC:ùéE >e<ÀŸüþ“~®ýó“QÚie|‰ÿ"}‰{dô½±ª r¿è ž=9èÏ’I÷<ëñ–µP_ýy¶3ÜUíy˦«_™üò`Úû/Ó‹ÈÁÅfÓ³g»Wp·zyéî5?´šßcÇ–‰òï8u†ÀZ˜ÿã?Ê_ÄÓÎܰ8ða¥ã_¾–}‘šÑóàaŸ?,‹¾H/ùtqIƒ†* 8DŸÑMjþekaA sO œ(>¥‚Ÿ}vš—ï|›>›y¢¦s5½âñòaSW¦xôê°ÁŸ; ðçû‡Ì7Uo|ÈÎ9e?–•…5ÑÉÁÒÁ»¦ð4üôI€µè¦âÕÌ誑ý¾¯Ó%žo¾3M~?¸šm!ÍH>²“¤¢´Ò#Ãæónç²Á'ÒM;@ýÀÜSìÝÇ¿/ðï:Îß e‚OÃ>Ë$¿b—’¦é¿‰v%U'×Qþ~(|ò›‹’êúS}a> >œ¦¡ÏmÍ`òï:®ß+%€× šÇQŽpŸ6«ç÷&r÷¡e’Oœ`(1¯اP øäšÝ„Æ} :·3VÏ^ÍK£Í½1o¿y|SÉ$ð'nm¯®nß:‘J~o'6ÜNµ·ìCTT,Ý<0ùð ™à7ÉMl¦ÄÁ{‹ûü]$kò§‡“$ٜ⟺˜þ—Õ/=_ý%…üÞ\ïx4ã§ÜáH(5èèÅÉ’cª©õ¿¸’QÇÉg‚Ÿ_}ôËüü/V}~£l·;mý͌ʞ_X8÷¢ÆÒ”i¿P’NߎɰcƒÿÙà=ÿå—G @ÿ(±f·7·¼¶6—”á“#xí|l¢-»ÿ[Ï¿\õÀ@æW¿\]ý™¼V±¹V¥çYzêM±qÉÒ±È4ù´¼Øó2æÎ¾mËfŦL\ÕðCŽô5Û´Ï}ß}ýã'?üðC«ho¬Ý]àüŽÏ¸Mý ¹<"ºvm$«t^-žý‹•~h?"ÎÀôŸ¯† ÷½½ïܹÿ÷Öú(ô'Á‘åPM_·l£dz¤š©.,lo©Kwï?nWzKO¶Æ;K›ãåÍ¥ÊòâòåWÇ=»×3¥ÍÍù¾¥UÜÁÂBes³²3®x›è  ´ÜBS@åðDÛàþ·Ÿ¯váæ_A~¿²ú|›Í=iµL¯"yËDZ‘‰¤–U™ƒå¢6¨Øæ{lù—*ý6þÚm‘™k%O\E—á]Ôä¥ã4kHùÜ÷…»¿~qïÏÝx±Àù0ã6Å ¦hëÊKÓÙ¼ZÇ£¡{ð òòl~*•Ó/ñ³õx4-~Y´†^½âÁï}7÷Ýws˜îZØØŸÌ¥ÑñS«®‡kvŒ«W7—+=gs¯²fTzæ|kg§µå?îìT¶z;Ç!I,l¶ZÝž#-÷µˆ¸ÅŠ#io:hV¬¹ÖZëµ÷akm­µ…ÈÓ/g‡¹+«Ï_I²¼öêù«Ïú<™~`›Sjíôщ¤ø¶Õ%H›NÍw_ªôzªZé©€Àƒã’á,Vzº³8Œñ‰¶„ˆ[ +ÊïõwÈ{>xK^#ðª U¦Ç]bI»]M,E©‹y¬¤|’›˜|¿ßalV¬–6qÕ÷Ô!—%ó7’ü>îÅÎF{cåû~úéœ2aÆm¢ä®W®¸8›µ :¯åõ$Tìý…*wÇ^S-ëÒ%ËR½zu+x„zù {3Êý\ú‘s¶\²QËBWmÇÒQm±µµÕ²{&°l͵ëÝ®ì½~vel˜›¸1'™h¦š®¸ÖÒñlØeÞÖ] vzš6hÍÕK¥…ŽtëP…¹kn‘IÒ–v¼…ÁÃæÆ`›l"ézÀŽfN33+âF­V±Ž56+VK›¸ê{êxø²Éß>ÆZè ;s§N½þéĹóÊ~fÜ"ðè YÏž¹ <.ã=*>ø À/£¯÷¶Ûî¡!/q}ð„ïMΪÃäo®Å{hì`Ї¦é¨¿I¦ª.AV¿3žëÎ{ÎÇJeÅp ·Ðš— %øAÍV«·Ö‚lçÕPN™Çƒ58±Û‚H€Ž´‰¾íx t–õèØ±c›¤Œ_;^A/ÐÕV¯77FI‹N$ÏAÁŽ-<.•ZY3]£ÓG^•lqlV¬•:q•y*‘ËføíTùׯ_߸qn÷{ú·¥_©Y%™Ü7˜ŠFB•þœoòì£×Çn…úç–oî~Û>°ù›aî~§¼­ØªŠl^7m[üÂâxÜ…6äâ4KÇ[ªgVæ £Òµ%”0’Y¥d"¨mÂ2ÝÓZXD;%wq Æ“ÖÓŽo¢ë-öᣠ·ãKàšA:®´º(?¡Iç`©ã#ó8 {¹ˆ±ƒúëè`Á¬X/mâ*óÔ#—MïTGÕî‹'NÜ%¹}̸­»XÞ•+`öuÒœÃ/~pq¨²,þî‹múÉs°™íHgíòÍ›káž¼€|ÈÞ/à9é¸f€§ª$h²-š"´PUG9ý……M6»ÔCKo0ptM÷¼€&°¢c‹à–òù„‡)ñö6 >½ ´­‘i°¦k¡¤èP¹£IMÔÔÅSM!¶°Ç©SµšŠ?+v>q•zJæÍ:É_;©Õõ*2¯(÷ÙgÜÖƒ…'JBf‡Á{ähdæoz;5Ú–o“¯à;¶²|"ÜI¿´6×ë-ïí…Ghô“'k)-=! 6æ~5^%Ÿ Ûô<@Œûe%IZ„ ·¸¹¸¸xÖ6%<¡UÓàࢵ°0ðHì¹À™ÍE ´d¤£ýwšs‰ÝÄ%üÆ y€ç—Â)‰ ®À&’"F®†æ–’9­é]cÅðÇ»Š8M‘Y± W-â*­F.›æ÷F­Š¾DyáÆ©à]’3θÕÚ¼Êþºz0ó×Íä×.!c¹´³¼L&ÁF:ëcò =T±Cô7¹¹Žõzé*vÃÝu¤>Ô-O:fqÝí«óßuÅÆáør”w W²ÉMäu¬¯ÞŸXÌ_•ýŽ<ÿçq8fÑÀCì;²´³ï<›[›lHï=ø=¤pæžÍ=-ƒˆ½a"÷”A÷Y§Çìô'¼7”Þ€RÀŸà§IôXÊ)aÇ<|.÷÷‹vþy¬Iä§ŸÀm:‡ÙIâèkFð @ƒ­Ì3|ô~)}ì69SÏÈìS˜Í˜2ÅÞ”’ð8«Ï ž™Ò¬=VŽO>Ž9“>¾©ÃDñúƒQ ø’Pî„Á¿ëô(ôö%ÀçT|N%ÀçT|N%ÀçTü¾æìmI|>%ÀçT|Nï }ÐJŸþÚ{¡£/>§às*>§às*>§zgàíbÑ~³WÊÒÏfe8±Ññ#L~Š[|¿µðádÃZ±Q²"‡2ÎÆЊ3wú¸vÊõa­_l¶ Çšì~™20ሪ:†6ù¤7®ÃOèw´ÐÁŒ³ß0x§ÙÌš.(ûá—Þ@xf Õ²zÿ*®S¯áõÆ´×7ö—ÕOyWÒ9ì8–æÙëï<çÖ’ê8dÕúÐl¡:ð «7JÓ^ß()—pÅÉ®¬¹å÷<ÈÝÀëêÑL¡:4ð²Ê›ü›Ê`§óµŽ¯îÑ-mý}Oòºjç „h¦Px‹_3^FMçk3^.½Wà=¼Þ!š)T‡ÞMïÚbê×£NI ŸHëj»8\ïxÿV©3ªmŒÊFèD²¦ÍbmX[o¶õXHka£ò¦ ‰Ú^¯5 ìd£Øq#.œrqØN Gq<¨i¥áõaêM¦]d—›ýa¿Y¶åˆSÙ+вÊ))œ¼Ž7š±#\X6J¡#àKd9Ô™÷Fë;܉äj÷Hìp3.3$ôê5WÖÔr¡“jYuÝK¸ù„ ¦E±x¿A;3íz²Þ÷ƒß+o`(ÅŽÀ²£[öï)%JÖm Mã8î»n›;‘„«íë¶Fœp#ÿî‹u)ÜÔøWoÊh@èf›eèÅî )¨iE µå워_Ýhµáh_‡wj¬§‚ŽtX͹6¶²š=‚VGxYæFøai ã¦­ŽcÄuE|§\ ÀbXÈ(~Ÿõ*§~ÝIVHàê*y«Q±ê¯Öy8(M’6"wÔˆ[GTŸ¦©Ä3¯‡S&É'pàlÎi±é¹öÖÁ3Õ:F¤è¤«&^JxW;—a$]|£ÎétÿžYÎõˆ¿fü>µ SD¢yvfH:þÕ¹ÕP¹…cš˜«¾ƒì ònY;~DÓFò™I×#­@’%àÔ²áNqžPzgà«ëe3z§œ,>.À›¾\ãåšd¤T •8Âjõ´0zAf_ ",+$¨OÁ®öy8($Í”ÃwÔXDõË~-&ṳ̀ëÕ9ÉÎzà´C=HŽødVVo“̱éFŽD]×¢§úëA Æ5^RÒâÚ™‡·îGbR] d‡ÐÃ7“ÍZtuÈ»à‚Ò ßAvP·T#ÛÏ“ÏLº^'ˆ#º³8U£WJŽ“¯VOªGëZüˆÞ€†»í„SɺÞÝhÁ2q¥xZÇ·¥wü 3±Ñ‰!I^å×IPú³•s땆áãÉg&]o=H 4ÇZœz±+MÖá§0ÚÑ#*ßðÊYV#ñWÖø×KŽRG»¤6½xqª$¯Æ×‡³5ä–6XZM>3ézÃX¹@h Wš¤CïQÌqp×u-ì:%bƒÕpý ´¾v=0ç¬!‹¤ÚT!I^ÒâӃʻ%%+z’ÏLº^¦Å§"ÉÐ!‚׸›ŽÂÉŽºN‰Ø`•Y#×f›™ýz,\AæGll8UH2ÁO*㳂¸%ÖÁ2ûä3“®—YÆ'^i‚<©lF-¾ÏîB› |x ÅL¼·H¿×0²›ÏˆyŒ¦ I&ø©jõ)Aå|£ÝC¤!ṳ̀ëÅkõ¥ˆÇñxÍÔ¡—ñåÈ‘ b}6ð¤‰Ëz¥G¤•Å]™6‰ð˜`tIJv¿³6h´OI&øIíø´ F|#Žic2ṳ̀ëe¶ã¹+‘Pƒ\!VÞ„uxàÍa)ÜÚÌóhgØÔàI:¢=\` ¡~w@ë‰×¢«pTrIDAT\…瑸›nrH2ÁgôÜe5ê[¹ÊÅS♉׋öÜé1ƒcP$¨ñfX‡ÔŽ—ì&—Nãù ¨<#xRZ×]Í«oT‡áö:Š„º©I6Ê¿7$YŽ­nÔWsU,uºd‚Ïê«Ï jÔ­Eržõô3“¯î«/Ç=Æj“S½Ñ¤‡|õ™»jQ"Aà°ÈÁ¾nß 2‚æWßL¿x-r rÐú:ï`DL Ij@ÈZx´lú †ÂжýXO93éz •S£>³‹Y̻ڄ': |m}ÔàFC¸ðhõâî¥LŽî 𲆆ªÑøyìA%W¯7×kÃa?á–W*7ÑS¶ÅFÛ¯áOIj@èšÓ)ûßC5MPcà5Ö­§œ™t=¬´ñx¼lÕÑc Åú¤‹ÅLšÉŠDí‡q=~²øœJ€Ï©øœJ€Ï¥’ªÎÀõøIà…>$e€ú • ^(/às*>§às*>§às*>§Bàw¡·/G€Ï§øœJ€Ï©øœJ€Ï©øœJ€Ï©øœÊ± –ŸC ð9•ŸS ð9•ŸS ð9•ŸS}(àï:GM àåѼ`õÍxÛL¿V5õ’xÊR¿=SÂCáëJo7kn²ãÃÐÛŒ¸ê¤KÂÙ56ìÙý<òJ?ÒÛí7wÁ÷ <¨¾>»ŸG^qðnMöj²¿Y­ºÍ†å6jm nÔj ”#È¥æF¿#q+Š9ÚhÚøÔreáLÖ?z*G÷gV«>5¼Ê9ç\j>ËÆñí©KZôZÜîÈeÉÙîFèPâuÙÕ˜ŸG^qðu0÷‘lW;ºÛi Ÿ:lYµ¶çÕû‹¥²§éÅ*·¢TKš×hcWeÉ«ã}Á Ô;ü‹Håšåïeg*ÕbÝ£G‚UÎÎeÓÐô*ïmµQ²ÌfI _‹Û˜z#|ˆ¿®Lvµ×âkó\%¹ % „аUÆ©½ iWœ*·‚åÕ|Wõjèêþ%{Ë!ÓÁg*Õº$XxB]ÜÉ<‚kŽÂ;éno”ÙµkjøPôº$0FÈÏ#¯xE¼áÛ¢RuéŒî¹Â÷ tŠ:)ü¢!rebWá¨wø—80û¡° ñqÏ?¬F=!.-îܪ®V 碌åÄÀàj=Îú¹CÜuƒ`²«}°à¸Š[Žä—þ}ó"”Šr½?é ·¢ÕGè0r¥)ñ8ï¨mHwgÒãøH°xs ¥Ÿ×è[áCÜuƒ`VÃ~yEÁ[ô…-†Á÷=Î1íen¥Þ‘dê [Š;ùµøàL¥*ùG‚ÕÀÞeÌÛ‰à“Sï„q×å,>ìç‘W|‰»ëþÎ0ø2.ÿô&TÚú+¸°×¸‚=|ç]´ŒÎL)ã}Ox—ü}L>90Ú†:”\Ƈý<òŠ‚ïÓ‰t¥Û¯­×=ËFÑ_™š‡Š¥Þ4§Iªò¨Vß Ÿ@4Re½­ÕgBí9¨Õû«'¼Kþ>Á“kq»£¡N;¥Ð¡àº|­>ìç‘Wc?g&®¾U ðð¶Y«µÍÉîbâ2êjú°ÚÕ»ºîÛÕ‡2/4£øœJ€Ï©øœJ€Ï©øœJ€Ï©øœJ€Ï©"à;Ö»»¡YÐO ðGD<×§.ÀçEf ¼Q|Oºø##>§às*>§às*>§J_($ ´0 Cøm÷«†ëü‘ÔŒàË…ZŒ eIªF¶iôø#©Á;Õ¦$™8R‡¤‘ÕMÍ^j [/ÈàKüÑÕ¬àÕ†$mTIzP0ø£«YÁCñn8“¤53x»P,lXeü‘ÖÌà¥~¡@jò¢V”5;øRåñ¨_íø£)Ñs—S ð9•ŸS ð9•ŸS ð9U¼xÊ6àsª8øÅ÷¤K€?2às*>§às*>§2…ŸC¥/ ü‡¬t‹à?hM~®ßŸC»ç6ª‡°²Sܘ{-ÀU!ðÜ·ÆÒÁÏõwvùBqça£qãÆVg¾8'ÀU©Ó‚/îì"ìž¿qãaõÆ›°=_દ_}M€è±j¡Tø#§Ù-žC“dTw§.ã×ÖpOíôw^¯‰¬þÈJÒ’Áy´VÏÅÎÍjmK€?ªÒS³úfBžž"þȲzW€Ï¡Ò²zþ—Èês*‘ÕçT"«Ï©â8â)Û\Heõ|.¯Eß“.þÈH€Ï©øœJ€Ï©øœJ€Ï©RÀëÅj¿íòà ü¥ðë¶ç4Ûü‡«Œ¬ÞràÑsÚ†£i†¦9šeôû†%À]e€7ŠQ‹ï”4¯êjõŽVê«j¿$À]¥ƒ7‡R¼ÝÔÚÕ’Ö´µ‘ [#þè*¼>4µ(xw¨Õì¾6h`÷š[à®ÒÀŒ{¨r·nôµ¾½® ‹?òJ_ß´0øš ?ía]«ÃŸ(ã¼RÀã§« .ި͛Oó ˆZýQ—è¹Ë©øœJ€Ï©øœJ€Ï©øœJ§J¿S¬ö¿{̓/ð”RÀ÷·>l|'À¸ÊÈêÑ L}ðäµwìÕÕ°,ï¯Þc-À¥ƒøÝ͸ÅÓWWŠkÁû«¹÷X ðGF©à …„2ž¾ºº€^dËÞ_ͽÇZ€?2ʰøF1žþà%{u•ý©D”UƳÁ³÷Wsï±àŒRÀßœ½v3T«¯­EÁ³÷Wsï±àŒRÀoõ«Åp;×ãCàý÷Wï±àŒD_}N%ÀçT|N%ÀçT|N%ÀçTâ)ÛœJ€Ï©ÄLšœJ€Ï©øœJ€Ï©¦x©©d45øfIXü‡¤TðÞ°¿1MŽ/À¥‚ï´ÃàÅÛ«?,¥w6¬xüöjöv»M …R­ ÀM¥ZÜâÙû,}ðESà¦Ò¾PÑ×À³7ØúàU‘ÕU¥€Go®ƒgï¬öÁ‹2þÈ*ó]¶i_õÐkmø£¬Œv|zßèxúº¤5xV«—Õš!Ài‰¾úœJ€Ï©øœJ€Ï©øœJ€Ï©ÄS¶9•ŸS‰™49•ŸS ð9•ŸSM ~¾_à? M þæÜäWÙ ðGG)àƒw2ðô=—ü¢4ð1‹Ÿhíü‘Ò´àɳX¯«ÈîÑoðÆjþH* |µÚØŠY|á~‡ýwßño¬à¤R+w¯·j±nÌa±ñcµ$•Q«ßÆÁß(nÝØºzcµ$•¾ŸvöçCo¬à¤RÀ×^ïôçÀߨ˜+Þ½±Z€?’Êx{õÜ$ðsøëÜ«ø#)ÑWŸS ð9•ŸS ð9•ŸS ð9•xÊ6§às*>§àsª(øëÝÝŠÐ,Š€Ê‹øœJ€Ï©øœJ€Ï©øœJ€Ï©øœJ€Ï©øœêлlªÞ‚w£(ø_r*>§à¹5«öqÊ¡zv×àø¼H€'^ð|>$À/øF|¡pP±]—Ik³ƒGçF‚)À.øHôN“(&‚'[üAuÀ‡=àG)à …K§«/·aíL¡P}I÷<8}éÌì¾ô²úòR8âa×éK8Fé9ø=9‘ÍmåU´‚.qéV’gÃÂö­K…K·¶ C ‰yNý Âç_?ØÅyÇíÆÞ0èèoûå¹àð/·/ð3ÛîÙs†üÀn8¶ý²p‰øK…loÿƒöÏÁGB›/ gðé°õKàþR’gÈÑKpƒ¯…N Á³NŸ¾uútá%Œ°Å§ƒç3ïm¢Å6»ÞÞ“,ðÑZ}Ò`ŸÐUYÃ@€ ]¦Õ>‘ƒ{&ºl÷§wþ6xþÝê탯> åªÿNõ.²úCöL€ßxâ…/ÀçCqðù”ŸS ð¿LÿKª}œr¨žÂõx>/à‰¼Ÿ ðÄ ^€Ï‡RÀfx8¥P¤kä‘¶„]¯¿«=wnø{àg£ñ0Õ³t±ïß;à÷£ÃsÎ?9ø½Þ(Î=|¸ÕöÀr¾ÑHõ,K…ÈR€ßüëùIàþ· Üòa5Õ³,"K~?:\ð7vj7’Àoøß&,ËùFüS•üÛÒ!ƒGŸçÁÓýÁôTæÊøÂp?e¼8:lð7j;I?Ç;¡«ó ß(àß–üüÆë‚ïó¦Qä°#óÃ×iže©Y ðûÑ¡ƒ¿1w³àûÀ¼y8„ZýëB„Ú͹4ϲTˆ,øýèðÁß(|üvüÃÆÆƒáÍ5®ŒG‡qU0ѳt1ÙR€ßŸDÏñB€àó!žx!À ðùO¼àø|Heâ-ð$õ>üÔ r¸SÄZè©jiVUÂxaè>ÐyUvÄIܳ,™«`_ÝÓž2ùx‹}]ÓQN:½Å³Sʘn™³eÖì$‹:Ið,]:2vañUx»¨uXN]ƳS°%c›ÆøÐ—ñ1' ž¥ÊÀÜEP¥¶ãkF -¼aCwÕ)jõì\vãƒn–||ð1'Iž¥¨¾!ᥨÕP©à‰VÜ ×³c?¥OÜB½S…’Ÿùàƒ;Ið,E¤šàŠvüA%zŸ ðÄ ^€Ï‡xâ…/ÀçCâ)[">§Ê=øÜêÝ!x7Š€Ê‹øœJ€Ï©øœJ€Ï©øœJ€Ï©øœJ€Ï©øœJ€Ï©øœJ€Ï©øœJ€Ï©øœJ€Ï©øœ*~$ô!ËKï }ÐJ/” ð9•ŸS ð9•ŸS ð9•ŸS ð9•ê<>‡àsª÷ |õ@‡ßoM|š‹7sÛ‡ ÞmÔ6F攎ã7TMÞ¬%Ç€S/œæÆ¨¤Ñ“7|ðÒj÷ûm+ì…½¯ûþŒ°ËR­V -‡ýŽ*äuÏö³eòÝjõâF“‹¬jÈÏÔX9$*x·Vv4§9¥ë©Á³Õ¤p7ên}ß3R5¯Q'ëz;|¸\vÝr9ìΪÕ=Ï=‚ÁÛ}Ód‰ÁO…ЬwÈc× Ü®Óï¶Þñ4“‹¬´{<à;eßÛfß!ÌöúFÙå·ûUE*¯÷Á>hÚ¦G Òú½Å°,)Ô7>† ĶnÀÞ¬JØ`¬Y­?JÍB‰4ì®\¶­æ!—#%þLº$/ÐA~îÀý¾-k½>û nÝ¿-½XÔå`‰÷{}ôÛç†×¨Cßg>éEÇmæ¦c¡ ¶%ˆSs;%zCìˆ]tœ"¦")Ô7<Î+ÍòÈ´Ê:±'µöÇ·ø*ç®Ù‰Es¹„—5ˆg¯ÆŸÉBÝçwù~îÀ£´•v‰WA©‡`d·ÎnË&.ý%ñ£7j“b}:TðC–k(u=ˆ‰ªDLÁßf¥±Ûd¶C4à¾T.&}D$R¨oä ì‰(¥h³x½F }«ô×\OÝ8ð̺§.ã™Ye<±xE*Jܶµi-^é”J‡ùj®Ã®ÕK²YE…‘©Ià^BÛEjþ°¶ŽŒ„±G’ÄÊø¢ørÙrFÔ­_«§e¼N‰æóŠ9âB/ã™;Ëê™ËikõÌÌZ=Ü Jʈµw›¦æ•ÛÁ­exvY¿§8vÒ—‹OôÇQÙˆ4J.à‘qì ãÇéÆ#Ú¡‘Ú*×+4»ö ¾(µÑ ¢Äòã’þhßLr“~Ð&]»ÜØltp‰i¢Ã·´è<:’Y44ôP…?°I=@òý¥ûøñ`Ÿ WóÁ³ËúcCðhô†žHÇQýi.8l<:Ží{ëtãíÐHm5ðiÚ'ø¡Œ»§Ù˜¥—dK6¾™ä&íCû¿µøð¸$[²ñM’sM1v‰ž‡#7ÆÍ²Û¬ñ}ßtL“¦lìÓël ªWh`“žó­†ÇƒC#üÕªÜ/¾,±øb¢ÅÓé8*7"í‡ V5|1Ÿ(óÕéÆ{¢7Ä|Ú‡©ŒŒK²eèáÁiÆ.¿ŒçÆfÙmv¸ñU¤A->°½7¤Ð˜o5Éâ®ÆƒÇ—%e|9v\ƳÉ8*7"³ø àÑqlß[¤ïa>°é·oñ¸Vïùµúè¸dÒxæTc—¨ÁDì˜ÍrŒØ.ÓŒ€§cŸ O³‹‘MzÎ_RðrãÁxL7éj>xvY\«ï{á°ÓZ=;£ò#Ò~ph(¹€GDZýÑe¤a>°iÞ§u8íøè¸dh<3ÅMâØ%´ã;$:ÙØ,ÇÈÂU‚1ÍxZËÕ×7Rd`“^ƒó—üpãÁ¸âœt5¼?” íøª }ÐŽg'öûÜV• «ÕŽc#Òl¤o3ØÀ4ïÓŒz?{îö«}DÀþÅ·egÒá…ò> ðû–»‘8À:Yü¡ë­‚ß·x¡w'>§às*>§às*>§às*>§às*>§às*>§às*>§às* þÐ{¯ª¯ápXMpÆðtDü{®8CJnˆ¦Ëíó·¢ÄAÿ ðûÄmæAªI.'^$Í‚Ò!/.ID æÿà$Ì•Cœ•Ùàsñ -$wˆ?oòüŒ qÌ`<{ü¬ÉãÌYÆŽ—ÉØ9øä4QÆïSa¸<¯ˆ£8ð`oÂYÓçq&s‹¦ÙzÜô“À÷}n!”,Bt;IáL"Á#m†¬=Í´72mžK(!ðM½ Èûe½ùÖbñkj=°|bܾô\=á¼Ól+|¿¬¶ûÀ½\{—zDÄAHØ5+WV§òœJÌ»Pâˆæø àôÛf»Í^(E!dYǦÆ K„ùE¾Ä¨'*R¹ë×M³-¸§+ -v,ÙY¦xsŠxLÿÇ¡Oì¶I8åÿbà>S)ø¦r4üÌÄ‡Í üŒfõN]dõ™š‰é¾È'ò’)#Y¤¦/•»¶C*w‚|ªÆ8:¾B+bÙè“iOA=Õ5¬¨¾¡¶Is®ñ.£ö=×dºS9 ȧvÃø©€ç›À2 vb‰‚_g8ëï,ZߥžD;<˜"Ÿ>’ D­<Åðg/4…|ÒS[u&øäÑò ô“3ö™È«NÁàgQõpšïLS"Ÿ-0ôÉ@€?4Q’¸Nø7>›÷”à÷¡¸Ñs.áí š¶„?ñ$NëfÁàgUæƒÓgóý7>ݯº$ÀϪ˜Á‡¬Ý_›9y@ô©‰8ÿ)FúÇ+¨Bù“®ªã]Bè-KWõºS*tôw¡·* ®:R§Pn”ú\ÉñôR£ðÿ&ÆÆšA$„ØIEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/util-guide/util-guide.pdf0000644000175000017500000156554712007570374021517 0ustar renerene%PDF-1.4 %ª«¬­ 4 0 obj << /Title (HyperSQL Utilities Guide) /Author (, Blaine Simpson, and Fred Toussi) /Keywords (HyperSQL, Hsqldb, Hypersonic, Database, JDBC, Java, SqlTool, HSQLDB, HyperSQL, SQL, JDBC, Hsqldb, Test, Utility, Hsqldb, Database, Manager, Hsqldb, Transfer) /Creator (DocBook XSL Stylesheets with Apache FOP) /Producer (Apache FOP Version 1.0) /CreationDate (D:20120806001717+01'00') >> endobj 5 0 obj << /N 3 /Length 11 0 R /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 6 0 obj [/ICCBased 5 0 R] endobj 7 0 obj << /Type /Metadata /Subtype /XML /Length 12 0 R >> stream HyperSQL Utilities Guide , Blaine Simpson, and Fred Toussi 2012-08-06T00:17:17+01:00 2012-08-06T00:17:17+01:00 DocBook XSL Stylesheets with Apache FOP 2012-08-06T00:17:17+01:00 HyperSQL, Hsqldb, Hypersonic, Database, JDBC, Java, SqlTool, HSQLDB, HyperSQL, SQL, JDBC, Hsqldb, Test, Utility, Hsqldb, Database, Manager, Hsqldb, Transfer 1.4 Apache FOP Version 1.0 endstream endobj 10 0 obj << /Length 13 0 R /Filter /FlateDecode >> stream xœuMkÂ@†ïû+Þc»$ûqÔRz ®'éA›ULüH<øï»‰…VDf`ày‡‡™“P T¯ý0Žñ]‹Ó/S0ŒL÷¨LpXÖ8µ‘ü9Ý'ÿ<Ïy ;1ñâm–si-;çà·ÇY-©ÈˆTV’­!"­ák¬^Þ¯Çp^”ŸXvq»ZÌ/± £/øÁ©øN¦(ÝâŒsº`(›KÅÅM5­b*l®c²_Ç&`ëc{hÆX7fç”úÃ¥mãÍ>õé¡Rüh¤J« endstream endobj 8 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 10 0 R >> endobj 11 0 obj 2596 endobj 12 0 obj 1124 endobj 13 0 obj 207 endobj 15 0 obj << /Name /Im1 /Type /XObject /Length 17 0 R /Filter /FlateDecode /Subtype /Image /Width 148 /Height 32 /BitsPerComponent 8 /ColorSpace /DeviceGray >> stream xœ½— LÔeÇwœxPº3›T¨EÎ2™ZZše&¶,­†5]ëe9åU]Z •€™Î²W—͵4‘)ŽÔFK¦‚5v$!" ÜÓïyûßÿåîü»N~ÛÝó}~Ïïù=ŸûÿŸ·lKÎ>ÔØÙÓ\]ôÈA[˜Ý¢®Yž"Šu¬ óÙåK—Ë•.+K±RDžø’c­¤¿õDÙ3‘|‚hìÂSÜ»¦ÉnزZVʰr.hDa÷ɱ›¸'í2Ñ™g kˆ£:óÖ3Y+½CW2Ïò=ÚöÁdZΆlý|Óîò)ų¿æêAd:IÇy‰Íð¤ñkä%BNö™ú§ÿ_&KÔ0­Ãc\Øt‰3ÓD-D]¢ÞøWtáê}êksLy([çÃ@¬Ât5”I'Mð2À¿XÄi†gLctLPJ½SîÕ?œ+^ù¶9&–þ9ü…‰ðØ2*çÄ"ÍÈ :co-ѸAõ+j¬É3ø8j:«˜jéùë ·×®á+±l áãz¦i“y9á  §Š|R-fï¯óø®p©šé˜^EÅtÝF‘IÅÕ阵Ïs—žé}R“·hêãEìŒù z&"ö‡,Ît`‹0¿LÎë,þP3IëeûÒ|öË»c[´i—*¾s:,ßû†:;„3)æÿþ´µ?¬bªÿFtòˆú¢êþa`úÑÛv‘¯Å°Ý(üÏàIÓLìrqÖ¢b:nÉa—×Z ÷ìä·þþ½é!z¦y8“%o}–lÃ%ª–¬=øµ0:\®¬Q¦£xèŒ_07Qe›œ–ùظá>3Üž˜úì“÷;Õ®¸]rä–=¬(·úG0˜_ö€²ÿP¦ê›èí?íÝ™E‡÷¬ž¨ï2¨¼›è<¨ïÓ”éH0˜Ô–Í Ö˜ ~~ö¤ôHxBÃTl&¾=\O¸q ðcƒ({¸d:t&x‘Òo†6”#5Ò2UŸ û2Ì:Oáë¥Q*×[uuu[o$]ÿ¦¼ endstream endobj 16 0 obj << /Name /Im2 /Type /XObject /Length 18 0 R /Filter /FlateDecode /Subtype /Image /Width 148 /Height 32 /BitsPerComponent 8 /ColorSpace [/ICCBased 5 0 R] /SMask 15 0 R >> stream xœíšyOAÀ?߈Q T0$¢ ¢x 5‘+R¶Û–C@N…"rH)m‰ÿµ…Öh9¶G⧨S¶ÌNw»»3³ ]J_æ¯Î{3oÞoßÌ›Ýf2eÑ_¬Þ”r+¶ƒ7EnU¿ GS™¾yÇ`Ó¨V2"Z/ÎòIÁÉáÜNª©Q­D™šÜòè ¸¸Ï¿Ïo_™à€“.Ÿ•pésqO¿6N‡«Á ÖZ¥=ð`2ôdá wýD_™P°³zÒ øŒ/‡ñ¦:—*m™´™Xÿãù¨eGŒ[ÁLo5ª]wQ%%ú…ùóÿ ‹«ÉQC[õØ^ÏúiA|×—ÅZ¼Bmñƒ…õ‘ÚNÔNì¡€À†ùè[øÙ×Î8ȵú¯!@° ¾«a‡9 ŽmÁш\R6QŽ(h¼°^ {ÝÄ>„b¶ù;–-ñÆøqó¬f|Í>ÑæIä†F5º¸)GžbLU+e¢'ƒÄüõÏ8$Ê’!wB®ª@›g£P¹m1jXvr DìHAèÈN!&,ó{£AˆÜ”ït_ÍØEöÙüŸ6óvNjv¤a!eG=/ÏDì”Õ¤¡ƒÑñ$žÅéü$fÏÚIë|¤y6òj%nEÇÞÓëöŃ¢°SÅGLœ^§#b'K8ÅÖOaÒõ ×7ËNÊlò±a:ŒÞÐë'sçcãTØ€ì躔ˆ¬0Ò€dÁí 'Úóå#¨;oÃv'Mv¡ò|áŒÁ®ÖùÜ©wÇ4>;L+-ìäð‚“.$ﺜB¡6Iééñ+ƒ`µƒVƒÛ‰¢°£‹3E Ð9LÁg¢ ®o‹ƒD`.ûv’f¾wZèíD²uÀÅigG§Vp:"ÌI©3 v «ã›Õ'Ð1_Ô* h‘¾ïâ7O€¯céþo Uö€.{&µZ ³“›—õ¥aÀ¦ÂÂ{<ˆ–”Hzžº¬ð’Ž–¦×‘¾ì Ž`GÊ•m}ßUi~ØŠ–!7÷ní¸Âáošù;¼“vm QC±£ÐÇT0»Lþg;PCJ?T9¢o M3‘¾­³ÛáGp×+.»‚«#eÓ‹¹4Õq¬Týai«ØG“®e.‚Ž€ïªTS‹švv8#(+à[‘.AÎ\t¨.•vÙwí‹#çGa÷jöZqw4øã]4©K:²Ó%é º׋Ý9¾¼ìc¼É¶…ƒê±½,Älý·opÒõnä]Û߬ƻ‹Ð‹Ü¼ÚÙQ›_;‘Õ (Z|i…GÉg kî(¸#DÞç_ä)"cpvDs];9¬2˜¤­ßÅÝŸ ‰Þê:Ñø0Pøv‹¢ÓæN1*à’]Θɖwv.Ǭø·­î‰|MåüÓ^úüoH %Yozd7mq¥ùÞ‚eLqÎ)mvªb|tò g—1>º“´Ì.#ÁwųSWAev¼pÃ$5¼W +Ôàþ4ÆG} endstream endobj 17 0 obj 1262 endobj 18 0 obj 1153 endobj 19 0 obj << /Length 20 0 R /Filter /FlateDecode >> stream xœÍSÁr›0½ó{È!™E ƒ®§’˜N™°QlÍr@$ã¿ï ˆ‘íéµé»oµoßîŠWÅŸo_“„úô^ŒÁ„C (À&DÐJœ8Š¡°L{d0ƒN÷Î~{•Gaá==ã¡(‰àÝ£gä=ÍÒ{Àâ‘ ˆ“$´rÂâØ–ˆ@Þ|/9ÌuwúC½%¢Ÿ®ÞU0þ_(²šºw[çøLH·ú£@Òãˆs-øˆâ?$A!Bx„Åm¨61¼màÃŒºÎú÷_;¨œäÓ¹v-~Vq»Ô\ül¶6…7K½›ÛÀÊ !}q¿müf–PJ9FJxº¼Ûïd½|ø ¿Œ*”Q²E«ryõ éd‰€ÑÁ‚ Ös¬öp ³"S•„¥*w®®!«r¸­e©n›Fõ|KÈOX.å›j”®¦&4„‹³ž¤Ü·«B­3ƒIgF§Œû4ö)NŠN™˜ü Å”±›ø¤™˜“$ |Õ»}­6[Wà +¸äõ‘šPº•£sgçwðæòMzWÊÊ¡XԺݑѿ—u©Û툩f´7uVÞ0z´sÕ˜Z­Zãh0[7=×ëöXÀ»2[Ý:@Ví§0²îçxÀÚ*—µ[À­†ò›³ý$œDa$1ÞÄn–úlšÏ|¸*Y5’ôyßÒîÿPÕlA endstream endobj 14 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 19 0 R >> endobj 20 0 obj 538 endobj 22 0 obj << /URI (http://hsqldb.org/web/hsqlSupport.html) /S /URI >> endobj 23 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.914 662.3 539.998 671.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 22 0 R /H /I >> endobj 25 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 650.3 210.9 659.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 22 0 R /H /I >> endobj 26 0 obj << /URI (index.html) /S /URI >> endobj 27 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.039 405.85 206.099 414.85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 26 0 R /H /I >> endobj 28 0 obj << /URI (http://hsqldb.org/doc/2.0/util-guide/) /S /URI >> endobj 29 0 obj << /Type /Annot /Subtype /Link /Rect [ 276.424 405.85 419.774 414.85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 28 0 R /H /I >> endobj 30 0 obj << /URI (util-guide.html) /S /URI >> endobj 31 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.039 388.85 222.769 397.85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 30 0 R /H /I >> endobj 32 0 obj << /URI (http://hsqldb.org/doc/2.0/util-guide/util-guide.html) /S /URI >> endobj 33 0 obj << /Type /Annot /Subtype /Link /Rect [ 276.424 388.85 479.504 397.85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 34 0 obj << /Type /FileSpec /F (util-guide.pdf) >> endobj 35 0 obj << /S /GoToR /F 34 0 R /D [ 0 /XYZ null null null ] >> endobj 36 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.039 371.85 217.759 380.85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 35 0 R /H /I >> endobj 37 0 obj << /URI (http://hsqldb.org/doc/2.0/util-guide/util-guide.pdf) /S /URI >> endobj 38 0 obj << /Type /Annot /Subtype /Link /Rect [ 276.424 371.85 474.494 380.85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 37 0 R /H /I >> endobj 39 0 obj << /Length 40 0 R /Filter /FlateDecode >> stream xœíZmoã6þî_Áo·Z¤Þû­½½½î¡ºH€¢(úA±éXXYÊJr|ù÷¾ˆ¤HÊN®×nÐî¾Àœ93>œ‡”ýiEP¯ùG^R´9¬>)A9Eq¦Ti†H޳¨@¤„"-PÃ;Κ¼‹jÆB«zKa~Zµ«ý{õ˯Ði‹"œ¢Ó*òŒK37«à<ÍpœeYªX)&EÁ]Ä8ƒÆæ€Öï½íDï)zn(úìÑÛÅ„¾ŠˆxLbÍŪSø—c±ô³iÍŸX°Ðz£…ÿ Ž¥4˜¦àœ?jÔJ¨Oþ`j¦bfòsq&Ê”5ØÍ«˜âŸéÙ¡:°åuŒsœç/#$0^Mqý îPñõK£$k@h°É®xV<öݱ٢±’Ø›c#H ï&ÆÍÊÕó²@#âÄa­«šÐ•ëpE>)uKÑ lÞ±>(Îp6ßäƒÖvv¯¥q_µZ8ce²ÓM8_™Ý` IÕ¶ )5$¥â¦3×;ÝTg9ÑÞTí?,û› ?%±»så.#3ܹýL[ú!Ö. ú88uè§ö„%JP\L©Ã‘Q=|ßÉ#©`at@º‹<S$¤ v’5‚x%‚XbÍì–4ñJØêÖï ¶R‡[)ÜQ Œ]ä¹âV±Ê#Ÿ¸Åôxî/æúâl9÷'®„yàÀwÝ4€B.0%¼î–Gpæt ã#†p£Ü3©'ª{0hâIóRÐøæd>]ý¬§ÈƒåVeÑ $¸’—-{xËðx< aWæ¹IÍópBœtš _Q¡íCžƒ%8¡Ée°P8Jļª•ZŒr)ÊIÑ,“e¯üÀb[·Áâº9„âP¢HŽ5@É:*•i/Î…ðl×ʯmØ‹oJ~ võÙ¡̹x bK)Îâr9Å)Öj6ç vØŠOL.ƒ¸ÎrÏ÷EV šôi §Vy×k”ûîÏÒÒ9o³>jU•#œj\LÙÒYÂ8ÏM~ø-¡ p¤š½‹ýçþØ~d[ôÝíߟc)“ãY-w òe€,š pGž?—”žE@a³ ¬žïòN4–ÜÙ}fÐ8'—vˆ/‚BÝnÙ­wo ´€„¸õôùHðÌÆc¢Ôe­ÑõÙ Éeç1Œãlý\}.ná²äî3Ãe‘dÖp[o®ïõ–­Ïÿ2î áüí盦¹®Ûë®e—9g‘/œó×ãS*žA@"cÈBO_BTÖ›ƒ à*ú ÉêÇ·ïÎÔ;¯‚ Ü7‚ÿ/† ¿œÖͧo%] ]¤°ˆCšõúý5‰þ"{ØîÎóX5¯ÇÜ·‡<‘¹/Ÿ‹¬‹D@ÖÜÍkBÖKén¿%7qa Wyþ­³þZè æ[gþSñª cÕn«†â¡DŠþ¬_A#ëM6jêöã€ø¯Jø7­§®ÿˆ­Ð>¬~Ž“2 endstream endobj 24 0 obj [ 23 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 36 0 R 38 0 R ] endobj 21 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 24 0 R /Contents 39 0 R >> endobj 40 0 obj 1973 endobj 42 0 obj << /Type /Action /S /GoTo /D [21 0 R /XYZ 72.0 469.2 null] >> endobj 43 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 680.124 227.424 689.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 42 0 R /H /I >> endobj 45 0 obj << /Type /Annot /Subtype /Link /Rect [ 525.908 680.124 539.722 689.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 42 0 R /H /I >> endobj 46 0 obj << /Length 47 0 R /Filter /FlateDecode >> stream xœÍØKo1ðû~Š9¶‡ºã¿æâ!—ŠHªBÛÐHÙF%¡|}Ö»Û<Ø"ñ¿òÐ:ã±ÇÞß&JòÐxâî~VÙ„®ÛæaŒyÊBšÆPLä³K\¨¥ñE‰…V5ñ¨YSƦöÑ1{xqG_šû†é}syÕ%Ý»H?žL>Ló¹¹èŠÇä43×*ΗRK¨K]㺥ó­Ð›uŸý´ú:ÿóÕ®H½ü+ªkêÍ{uéÙõôG1ðqÏÁe±‹ï£Ý38b]ÄIìŠ×®Õ(1kÇS3ö;ŽÜÉ8ÕÁàßÏk¿Å—,Îô­y=kÎßEòL³Åþ]”£«1WÄêMhÖÒåÉãéÍ>6og“Ëá…ÏÙ„±ÖÞíFë…"…™ýѦzÚV\e®Ÿz?*‰cfõÏs“ìe$;{(;@ÙÉ. e+” lC² ²4ÈÒKaÄR±F,Å#–âKñˆ¥xÄR±A,E K…,²TÈ2@–² e€,#d!ËY&È2A– ²Ìe†,3d™!ËYȲ@–Ydiˆe÷ÊF,•KeIJûþ e#–êKÄR±T,²TÈR!K…,d ËYFÈ2B–²Le‚,d™ Ë YfÈ2C–²,e, ²4ÈÒ KC,#–ËÀˆeðˆeðˆeðˆeÄ2b± Y*d©¥B–² e€,#»ÄÆ\²»„¨Î8[±Ê®ûùËÌY§Ã—˃¿é.š_nM›l endstream endobj 44 0 obj [ 43 0 R 45 0 R ] endobj 41 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 44 0 R /Contents 46 0 R >> endobj 47 0 obj 678 endobj 49 0 obj << /Length 50 0 R /Filter /FlateDecode >> stream xœÍ[m“Û¶þ~¿‚“é4NG¢)R”¨|騱_šÄ‰}I&“Ët :¡G2AÞYýõ]`/$¥k§ÒæenŸ%^ `±»€>^-¢þë?ëM•‡«Ä[Dë4ÊVÄÊWÑb¯’":Dмˆj]p@ê"Df†K¥ì£_®š«$úúê·ß¡P%q=^%“Ʊ™W?Bçù*ÎVÅf³!YÓxQº‹,^Q¢çׇ4z%Mi+½n(ùŸKJ”-Òÿ‰’èîêåÍÕó7y´H¢›_‹4‹×+ÐójµŒŠ8K7úŸ4º9D¿=û𱾑²þâ÷èæ›«×744¬§O ÿ­c³‚òe2ü¬.Ç÷\øgÈNœæ0ý©¦ ¥¿úƒ%s£ ü{Q!ÔTPy<=FSdç—gbÇšƒ)HåWÕ¬³É4ê¾/&™,¦c+¼­OÑÑüø­%UÙŠc§f8wNÒd¤ÖèžòL¥nüà€Ü9’õ<°NÈfæx•hyÙÍ;9߉šû&xWj]ø‚¨0¤[~/\Ö‚7ƒ½bwàt†»=·, íg%*ÇÞšüù‡ï‰*eÓÀTÐìÌÝÀMÇ¢®‰üØ‹ò—•næx„ù¬ã Ô‘óŠèJìv¼åMÉ'ÚX.GÚ€…úȹQ¯ Aþ©³tÅ:æø-kÔA(%¤+‹kÄw-;îEÉêWwf™üÁwjfßP½ÂaÀÏßeI³ õÞ.Fƒ¾’’µY~¿hìLX25Uv*x”}mT—çñFo]O?Bc¤)BÀÂ/•¤-PÉCð±åGÞ‰N<<´HÃÒ:u»¶/»¾åLv)ž•ê¶ÛÖ\o½fÍ]{ÔsvœéöUØ>¨`¢©U1Y,f…åñBOßõuì_÷ÂmµeûLyÞ<¨Ø– >Šnæ3¶}çZIR7²níN3£--Ûîö E(lƒþùn'Jg «Û³Æ£á4"¯”Ç ³?OTX$#ÁîYÙWpvúaIJvÃÉ5ÿi=ÖâžG7’Uñ¤‘„y±ÞlÖËåÀ}5§ò&^ºCÞЪoDÐyn8»ˆŽ}=~\$È„­âÁ–—lÀt² :ÐêEt⬠:Ç©AzÏ‚üAÖ¨:dÔ² >ã¸ÁæGìU4Æ„É"iƒNì™ê0ÍG:$¥f«³“ö8*ÜþØ7x„#€s±¨ƒE3ùà|98Öž×Ç ¼qДcÜ>Cñž¿ÙŒËt¹‰ÓÄLóüŒÌ··µU'~iºZ@Õ"IÖÅâLÕ™ëþrç«UœX­ËÕ™¾|¢ïuñTÍÿ¤ï"ƒ°ÜÇ\“þòDß›ü©š®k² O‹‘Aì±Y/6Ų87ç—ÅÈÒÕS5ÑÀ›Îk¡:/úQH?0QëcòòÒÁmR åŸ:‹l=ê·”-ì$8è*4é<ëºxÄyk‚¸’\5ŸwƒA9Âåpœ³¶•Žav‘äÜ z÷¹*ÙÑljķϪž{‰¤#·L‰Ò¡o@+\?çèZDg‚uûÅÌ×⌀ 6Ô=b!‚)üyŠè`„x¸ í&¬%‚b^2ϳg¨m·l¥š-+4çÜ¥ Ä4ÌÓ\èÝ“g¸0RðÄa}Í.|µ-Nu–d¨#Û©Þ¤xÒ“ƒ€ ;8úü©ãM…¦9?@tüœ&’X-¿ë!ø kAà`p{îÍ>è÷ö6hs°5 §âµ ƒ ß¼zù•GÞ1òù‰#˜º‰B&SS}¬Çç/ 4 |ÆÛP–:Jncƒo¡'K+ˆ*Z„¨Ý3Ëiñ`õó9„J¥Øá.08×°çdÆþZ׬žÊÒ¸‘ŒO³í˜ï½,³ÓÖ'2¶cKë°gª‚blк½ìïô¬§)îîh; Ïp±>Î1EL 2X v‹,µ/ÏvESŒ@k lAì?5Æ«rßMˆ °ñËÛ×ï_¥k›3BÌY¹Ÿªh“ UÔ }ŒÁv‡UjR€Jè”XCK¢£™`išÓ¡z±\%‰M­‘Ìbg IæÏBoã ¤ÐÅÐÌ•1^†ÄTîÌBc˜°p­¤¥½-Dx²”·†zsˆM¨3âZ‹ˆMâ¨k4І4+k\»ç ›NP ô…!+œ:qÖ”\À²æèB —æÁÐBžõÓmƒÒÚºÑõ~ 7l9h&HgžkWÛ›ð›ˆXÐŒ÷¥jf ÆãžCÚ^šPûj?|›ª2+†ª$s’/ÑDtè}&× ì© <ˆ½ÌKtîBdü4ôÁQê<Ž1lž§Ï Åë]ìYoÂFèÊ6èòÓÑ9³ÈAÂ4øºU_Ž%T¡ˆT¶éàAoS•åÉPe¢K˜Ð{{ @Yœäˆ‚Ùˤ¹#d]nDt9ka°ÌlqÙ€ŸÛóà4‹ƒÏ¤G[¯Á á@ç­> Ôe‰\(ãEš*g••ãb¹ùfáóÝHëóÈ& ‘3¸nBV˜BGÎã^”{AÈÏ‚6ö¬:ß]-ÂbzóI eFCÔ6ò1öȹh?èÈ]÷ ÚšÁí ‰}È â¹`<[N¬Î‹Dß²ºüUâ®j‰§m‚µ{ßÔT58„‘ã7b½²ùdÐ]úÐw9ÞyšÖ#ɦÃ&£ «éQNUXŒ7'xqí"Û¶Hî1ÇdJdHûPÄbí“Ýs‹tаmè.l}â‹Wýáèh{QoÃÿ†ݾ<®'jK»]¼r’XÿÇ—~#ýfêêf›‘a×{ÙXŒ%¯z¼sI#<‹.]&è\óKVëÅ´i±»x— °—+Ξèqµz¢"¸ÑÞ+;w“’ÿ]·é"{¢"Xžš_îtùTݧ:]>%­µìO\ªòÍf£¯¬ÎôkìÇåk"(¯;e›iÝ-hùþò=Ñò‰ª‘_¬±m!ƒY=@[¦y¼\¥I’¯èµÕ5ët2[¹íAµI¨G¥¾ÁåÕE¡ô«ØÐäb±NÇÉ›ˆC9` ’”R14åøè\—+ß:$åIðØq®uߘ;&6û±>-@lsª„x|Bw‘êõ¡Ü•£ßyóÍ«¿ùqüü:'‘6ÍçÓ[%˜Ã‘ö(>Ó#È·!$?æsÏÑýy$‚ªîzáí³ë—ßÍ‚Šïey/º€£CpÌãEPýpò4Á¬SÈ«ƒæþ=h‡&ƒÐµ'+‰y~ !ÐÄs˜Œ æbC/×éH‘î,…S™Ë’ë=X6Ây`™)7ƒ@]ßêÕ77O-:}N´Y›&ºÔû‹ÒS B-`g%ël²æ “…l¤§kÙÜÑÔlÜAå1ùÆ —Í ¾¾2¶œ|8„0ÊZ”Fâ‰ß^‘ߌYQ{p£^iC? *}¨½}JFBг-+!úIˆh¶ 6­šË¦>M«%ùHcê¤Àˆ)´¡ÚÑ„¹ÁŒª9Je{‡ F…Ž*¥æ». ®éœäé:NÖE’¤²“t-¸Î×ÇÝŒ"bm=×Êsp[!m/l©…=;Ò[XdX­ bAQ›O$(šSŽÎ ;Ö-¾"$DQÕoU':LSœ—y²ÑW–úÒ£ :cÝ4×’g›‘ÖÈ×]é0ÄÓ€œÃõÏ"–ë8K›M±:ÓìŸÞ‚ß÷êåßß¾ûîõe—f±y¢ é “#)ù±³È½#Ô ‘´îÔzŸC¬N¯tÖ.nh÷رp©C*q×hkBWJš5^>¦[šÓÑôÊ!Ï£ü"À¤?bò,Åd>7–˾¸F®ÚãÑd¡ ÜhüÈÕ;Ø?ÔF,w;('˜Ò…>¬øŽ‡=²)*õJ ¤´fŸÄ9ª¾Ê Ó]ß4A³°ctÚü‹Ø3¯wg^²f#MÙüæBgª`ð¸@è…]`ÆkæM.PÉŒúüc/ÉÚRý&¨M‡„Ãp†A lX/‚ºN ŸM#`_.¸vt¬ˆFÕ ‘ÖPNó˜hPu7Xºñô¹Ø6‡>T`Üæ…9ƒhá"b;Z,?ûÿ™Ç6SeéX«GÖí*8p÷ô·°‡gA ´HÓÆ¥º·Îä"¾“áWJð#ø`Žñç+ àôvÆr‹ñéñÕ·/>|øáÅÍÛ‹Ö*_ž©f&j¥í­ Ž=§“’œ.Äמ´ ×€@ÉÈ…Œàñ%5½ç'hþlÙA7A³á•™gÛ 2–ѹmmÞÌŽmÐ.,ç© ÔH[àj‚7q§oõ¡óKsËú%èiúŒ[ÿ|$ƒFŠœ®"¯íïüoè5{æßàχI=ýœ¢•[œþ¾…®[Ê•˜_€%¶½{ÿü‚â%BiœšÆ±?w¼¼þ"Â;V™›óÁÏ*YöÎóœjÀü$Ô€{1–‡7¢p3ÏîR-z—f˜žnùé(ѰÈÉ£†?z>Œ!–ÌdÃã™x!tBwÿ9Æ:îo ¬ÌoAB¥hÔ¬Æ> endobj 50 0 obj 4509 endobj 52 0 obj << /Length 53 0 R /Filter /FlateDecode >> stream xœÍkÜ6îûþ #_š;Z¿ŠCÓ$×}g¯Å¡[žÍŽ[=ñc7û漢myrwz×´ IKEQIiÞ_ž6⯬½Ýéê=Ñ/ ½(%R’zAÆR?÷N!y’{µh8E#I¥Öˆ½_®š+ßûûÕ¯¿A£½ç³Ä{¼ò̑ͻ«að$eQšEA²†,Ès1DÄRv'ïæí)ô^µ²µ’^0òÿçÒÛEAø ‘ïÝ_½¼½ºy“xïÝŒ aIJôœ¦±—³(,Ä?¡w{ò~}þî}}Û¶õ‹ß¼Û¯¯^ßÒÔ°Ÿ0žþ͘´ É‡$ö§_,ëÒtC…ÿb! (,L`âSM J‹ L¤‚ðïU…+«ó|y¤¦þÊÁ×W"K˜ ±|²‘¥ü©UýÅ:[,£{}6þ˜ªÞ{_–yÏ›öÑ ãy_|o‡¶3ÈpäÙ]Ç›Áx×Wmc±n&û5„²ÙO¾¾©j‹{9¬ ;T' {kõ8ø±«†ª¹·YØS¾sÈg¡¿"\œ§´ô–JC¦Ó] úèÏm³‡‘ë§ÍF0H2Of‡aš"»ºì­oÇjw4h¹Ʋ®Ÿ åܵ;Þ÷|ß»¿±˜·Í@+†Z\-¤X »ÌÐn¼ãЊ_[² üÔŽ–t_h) Yù¾äjiìi]"V@ Ñ‚hMG‚–åà§Îþ¤+ñáˆv#T²O0»Qã`׎g‹UÇ*m"’rßqØݵ&Ðì%ÜÛ±ÞkôP5{Ç äÝ…9/ôÇ3ý‘!‡K½çûv7ž`E™¦Ü‰%ÓXu:w|WÑ D³º¦éÐjÌdSàgÿ“&ƒß”V »f×q!ƒa[šæÛ±’J¡1`ë^›fõź®þäuul[óÙ¡“LÓ6¸v‰6€†ÇV[~,ª¶›M ¿÷ Ã4f…`Ò1P#/Hgh€½%©ï‡y€­â;¡…7cÚm›²ö¾¿rÏ{3ü⢂%QPYš[z‘f‚ÕpÉJãuÕæëÙk\íØÐöÄv%7 †ãeÐÈ©üCnÄÈ¢5.=0‚´& U§’âò¤a~8Àœ# ;/·U] O®!`„…I0SW¿ëªóЋ-É£ùœ@dŸñˆXŽ*2±ˆ£¡ò¡×îÏb 4ž±§5Y0EÑ6àrÅv“guÒë†ø©Üs3V«A³ˆˆ+;JçvC´f`‹~‘;t$wΪÆQfŸyŽÎ–ŒàÊz¹:i4ë2ŸùÞWOgÞ‰¸ƒ jé‚õ?–2È{ocÓóÁ ?|cà‡²«ÊmÍ­îü=[·ÖÀÍX×›‡²mîšÅµ%_c5PA(b6Ü´–XÒ`À‚˜!É8ÌîêPV‘ΔÕH –ƒ‘ƒÕVò.HÛòá‘sƒ¯Ú[àG,Šð”aèF*uÕÞ‚0fq’àµì¬G'E}D‡üL. cׄͪ¬Ë#΋X@jç`Á´/ÇÁRÕH‰Z¾ qF¹{^1nø@¶Ñ[BŹ–Þ½¸Ö˰Qõ©í‡å*‡~>“Xï€0’‘”¶yÄ•QZ„z4z` òÓ]³ÄÞ :1Dõ¤}Ä8‘ÊŒnlФ9òÞ †ÑÂïÇvàýgöìî…FJÃ6a"S ™PU‚bÅo¤νŒÐ¤hS]Q„–‹®B¿Ùµ§®'¢x"ò¨÷žMCc!6RÑ¿Äzn:èM/›•®« Ÿˆ¢¼†ž-‚«û"‚è$ süyì˜öåEK#ˆŠü¸ptvÌœü¦m^Ÿ-„,ãóóâ­Ü5Χ‚Pá¼ùù‹Ÿ¾ûâÛ׆ðùúq–&,.rHÂ! _2uY¤¤s«hÇ{w‡¹Ø{Cw³Ö =8ˆáò ©{ußXßpYQûŽPÌoíÔ6T£©}èoUÕa±m˜8æJª½h îž×öTº¦ 5hL§%¬ŽûúÉ¡,ŸiC.—*—E9KtaHJ¹…ª¡™!}O¹·Dø‡ò¤ )Øÿ``å ³aÚˆ ¾ ¡¨[åë’F;‘®Ý޽õâ§}=™ÏTk te[G%QV7Xœ@"çPåß.:*W—½þ¬Ñwí£Xè «­Ê–äp‰º¤Ÿ;X­K˜Æ—úá rÁ2³Ãe-µü³œŠ´ŒÛ‚’`™ƒ·Ø¿ë[³LZ“,rôÅ *#/“YHµxIڢ Nl2 gªHšÙ¾^d=eUó=CäíAõV*°¬%Sy‡Í^ùûÌQ¾‚)F~8›‰ªrgÖ t × EoÐìz…¨Êg`ÕËÍ$%¼ãXw dz<Œ]C…~)¿õA˜ þ”é%ñèº`Úa=&Hsæ‹`¼ð‡JÖ5ÊâKÕÀoáŒéP ¤ÑŒ ä°k$í _Q1…ƒFTæsž:äÎIAOšPzü îݨ%eºzL˜(Ú̾,Aʤw½ÊFÕ ¥@T}„sÖª·Hå¶ÅdáæZd„ƒàžʱÌ7c1™¾ì@HZ‚¶³Ä;˜Vƒd2†£¸ÐȺ뀵ˆRÈZÒØ1y‘NY&ƒ ŒU ûÜ€/aÓµë'v°Ô/|?Ï ÇZBÚrj2fms¯ q“…Ê‚+io7?µTgxMe!vl‚”-î[DÔ¶GŒ‚lC°“L/>ÁÒ¢7VšAãÁ!À ® PÄÀFª“¬í6–ÆýS^Ñsמy7A?Y_ b™:í—zèß×Éì§×ß~ÿóëß_ûÃí?‡xwQû~r½TìÏO>‘ˆšó.–sW™¸¥ð¥?ˆ‘ÿÔUíñ;ˆwvülµW¡cl)ŸåW++g›'˜ö¾âm!”Õ!rÁ±' ¶¸ÈÓ$s(äSŒbñâ`cÁÝ >ì…"*òÜl`´c©:K3aJÌÏõB–úHu¹Çx"±Š}ØÈ:¢‘Beg ÓK Úœ1JðÝØv±C!l2‰„$‰^}HaL”èz0‚: š÷Ñ1PbW1RÂ:´ͽ†Cþ–#†‘‘Ú¬Žh:ND=*÷a±3ìý†Ž‘P,~ÍïËÝ“ÁÉý_ )>ëÇ„S¹J"ë"ˆaÁCÈcÃÜ!Ðî «~à"r?u0üÄÈDU? _p`1K‘Âg.vC7ò u¿üR_·$ïÇÊVœ X$râ}_Þs{ ç,+aîŽåMã¹´’níV®Âê‡&àáŠ0ÐÀÕí+’èlGÄfº`„÷´•åùe·Ã‰³<¶cq8ÁôĹ‘ÈúŠÞaË>‰ ¹N:}eéL_°qE?}Þ‰uZ3”\¤ËTéYr:”u¿n(Ap±óµ|>Ò6ˆs`=Þ 2ñ²I¼ubŸO½÷1Æþ%Ï„ЉiÅÖ奢8'nóä¿ÝÒAêâ#ö@VˆÊ¬ÔŒÆð¹Do*Í+LÝXç°ØV·T׸HºàDÕM¸« p…i^X¤EY¿r‰òœiLj_°eF²ŸÀ+w{P»5Cʳi¶®‹ì$ðçË€)¦Ü-áôE âÕÐóú Q:zѹ¢TEwó‘Q;‚v¥)Òóx4<ÔiHìU–Bƒ£sš÷Ïkg£ßÿ­Iˆþ.Í…boŸ4ʬà}“VÝ‘† ¶+1VAL·Ý‰ÛCÁ1¢©è¾VIú +¢"tµåxÀ»D·ô 1:–‰Me˸µxèw4ÏvU:*± BÒ€5îØ;\nÅ3åZ7ƒq€7Þƒ v.»òÄñÖMÓÖÝO1?£OãÔ1Ôæ‡ ,ŠK=ÍØ/}LŽ8ba(®áŠÐ%ÇÖäçrýyQP—ú (c°)O Ž%G„'µìªò ‰èÀQ|ÂÀ áNÔÜ\T!aý´Š#È· ˆÔD跜֘nDZ~ÍQÏHâtѧóc7êŒøæºZýÜ»ºÚ{'0hs!ˆ ÜŸ¹^e&©ÈzR?ð³øÒ»«e»Wï~öªæ ¹‰(”;‘@öÞׯ^~éÝVê  IòÌd’òç_ŠB(pÆ×‘pìÉ—ûàÿ÷å"‡1sñ°E\óáEÙíðQG&œo%Öoutý±ÐÝ5¡”- ðB|"žjf¹ï‡EäôÓõ'—:>SRÐQ¡^&««âÁ¶xÀÈòV‰Z©æX¢Ê°ÊF‡+Î}fú€’ˆ¿œ zÓ’ÍNºL×öp$GÖ›úþlJüô‹A/V²%‡€jóÄk6„iIzÓî AYCEÞØ“b»&  &%""Þ™aI/ˆ¡×G¸ÝB0öRAH9¡ih.fJµqƒá³ó©€úgBïíõò'=i0?ÖáÄw,ÝC?á™?@NÅÙžFE–ùÉì¹râåÓ '°F±D©åx!Û Å3õÖB:¾wÜ"CUý؆з¬ÎcBe2ou´éÅs{ WyôÈWj¿ËU4|2ånéÛ™^ë;¤År_=̇¶gy.ñ¾k*Ó–Æ{ÌV ‹X*|@ợ·î—Ëû-gèùGVr_³ÚîÉž¨­¼+VÈä‹ã·QÂb°°¼éA¼ýl>æYâÉ7¾l‚xkÒUÛQ¸yÌöÕqÑ]¥"­),3–° ¢$v "ߟÿþÕ÷ß¾¾¹¬¼P\ÙBHTd±‹³…ùGO±™"Ð+Âô£wM1¥ÔUmX?"ÊЕM_‹ãÐ&Ò»HÓϼ™ÑzµW…iÎX98r|0’Žªž´2ý^S·x'—Ó‹¿e牶»ÝMÛÝß!ÙoIù7·¬-@ a,x§‰‹7›ü~õ_mg- endstream endobj 51 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 52 0 R >> endobj 53 0 obj 4414 endobj 55 0 obj << /Type /Action /S /GoTo /D [51 0 R /XYZ 72.0 626.666 null] >> endobj 56 0 obj << /Type /Annot /Subtype /Link /Rect [ 287.762 140.941 405.333 149.941 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 55 0 R /H /I >> endobj 58 0 obj << /Length 59 0 R /Filter /FlateDecode >> stream xœÍÙ’Û6ò}¾‚•—µS34AðLÕ9ì'q<“d·¢” ¢ ‰1EÈ9жöã·qCâáìKvsÔ ›8}wCïoPÁ¿wâO^ÆAu¸y¯q(Èãg•fÊÃ,*‚C "-‚FL¼Š)zˆ%VÏVÀ>øé¦½‰‚¿ßüü LÚQ˜§›h´¹Úæþæ{8<ÍBœeYjZã…8‡ ªCðìå!¾`r¶¡^lýÏ©÷)Â(þ? ( v7Ÿ=Ü<{‘( ¶NPŒÃ<>gY!ŽKñO<‚ŸŸÜ¿okžþ<|uóüA_M­ÊÃy(5èâCšD—_<í²x‡…ÿ“+`Â8…;ˆO¨þ+>˜a*¤þÎ2Doå-¾äÔyø¼$ò4¸°¸Aâ1ÿR«þ`žÄ(Î^Ыh¤M¤hð4HPXOê­žÙàÐmOÛ·¬³ãGÒÕdݸ-ø°æ}Ý}ÍZ‹ì™÷½ª(Ýܺo{·ø8tGÆ̶“ÓXãˆQ¢xö¢¼¾,FY˜–i¡8]ûc³lÄ#ÇóËì©;ˆÇ’š» ’¾æÛšn|ö u_?Òælq°X‘à 'Ž®Î#Cϰ_EXÛ²S¬ž<ìIN­iÝîàï±£´íƒÛÔ[X ùü»ÿþUÐÓßúàT÷{6ô`$;ÒŽô¬ûÞÁ® ÝìèêixEQ$q¥ÂÅH´ŠãtL÷hÚƒV,Ôw^@àsŠ$UwX†eZ>£eöT' ¯žü:ðނdžԭ…>š¥Å`Ð1™•éC$ÂѺVOíÙ{ÂíxM©#ª£öH7ÞÇŠ Üñµv·©Ý-³Ã†µ;Ú¹/´¢œ“îzL¹§þ†ô`ÖNä°½'b¡{5øX3ÒäêêœVF3û=Ð BH3¥{àzó!¾.èÞhÚgÃN°ã.-Åzìù*á; û±ˆ=yô>kyhh[ÿF7¡ƒ?mšñÞÞѤó¶Ú5lM¼ùJ7 {˜ëÁäÀ|¢æ]\Z„Y^DQá1#„óùûfVI“([X~ëÑãßT[ÖÝXE~µES·47m)ïá‚Âñª«=¿•xX:R ßð=m>Ö•aŠ|Z.)ÂxÞ§@4†+‚ ‡+ƒÓx%`HùZˆ3;ì…Ã5€N¿Ü¼3Wv£ÀׯìÐW …Y=NØ‚-9xyOº^)£B\Ìýècå4¤TKïÂNîn¬ew‰Ö]Âðz‚m1ºbÛ6„ÚS8E˜¹µ•,œ€œö’JpcЧì’ÍûÑ·ž¸°w—ã–µw¤9îÉ];h'‚¡ùTá€úÐŽß”6¬X¦ *—Àšîê¶ÕÆ~}ĦÞÕ½=Ü8µL¹9‹‚£ƒÈJí ë¡·çvv ä?M3qí4½º6ŽGÖ‰ýDJ%Âû˜§y–™$8YäéhžŠÁwY–@:鉃V†K Ô‘QCýõ:©w– ™ùðÍ+uT\…;„²3ûõ—nfŽá` ·Ôl˜xÚ³Æ_gŒoêL#:}“ŽpHMp¯(®¸iíÚú_ŠdŽYÝÒm÷¤­tHиʬÙ@rö –ÁùÔGГñ#­j¥Úãrƒ™Ï¥Jâ2*K0ç‰Û¬VÇn>¡ǹ°Ö¿ÞÃ^¦¼Èï¡§yˆ¢4g]NÓ9OfV.-õN—þªí}ÚŽÇd¯c¿F²vJâ(ºÚY/w()œÊK@¨È­…zˆ^Ú»HØÅ ýÝíÒw”ôRú-Çô7ð0œ«ÒI¡”FËárrçq6¹ý½,ÏX·S>ºyu{q)·ïWä‘ÜË=Á_ñFUb™3!>,Ë‚þû™¬©€/”ÁJ–BZÎ+Pð¾ñ`Òp¿UžHƒõÄN­-˜T" …F™ç7ÿøÛ^½zûæùë·‚´y­ÍË¥]|÷õóoç+–hjõ8 Å ¤%X ZHãy/´²DPU çÖr¸m«ó­‡6º¬ ÕêKÿÛíÿ3‡^í=„öÿ2ÀÌ êåt£]ºBš,@ƒ Å*\Gçi†¦x°R¹D óè¿· ‘t^+À ÆÃùÔnñ(z¸`ˆê|H;:ÿÎ: 1WžÎDbQ7”¨,D3ò2™x… *!mÁé¢ÀGó>·ñ+]jÔ¤ Ù°Ld ›<û3¬G¸ •0;è“0 çÕ9ŽÃ"L-§vÕ4)}I]ž—Wz"¿õ@)g*}g†V‘{°Y¾ØÐ™‘öŽ©kq™Z-2GÔhE™”E¡)î|rÉ%–$‰ðå õñV×’"-ã«IB…š €Ô±`A0JB”¤àU¢Å²`<ïnèÍe–lâªNý Þ²å‰ª§¼,ýLIDzcDá4,ò¸,ÒbÑç½ÜÔŒŸÛª}9ak¸\Êx205PÃ(ÎÓ‰Íæ;Hy²´ÎžËŽºÑª@U—)B1ä`ÆßLðau˜·*д…¥öl•Êaë(² )ýÅ4¤,f%J¶a··¥[2:¶zZ¤—g©I¶$ QŽ¥ ‰“üZ,_Üÿøöþ뗯߾~óüÅË,DÍlby Q—C^a]´g…ë ‡c{ét˶n7¢Q ŠËþ®>ŠVÔ„¦BÞ› ÷˜-ö`GÓ^¤Í¨(%د´º€/¿ok]+ðD;ê ÕföÖö~9—ë~¡ÿc'~ë0¢5ím½÷¡~qÒå¹:gôoàŸ †Îº ÆT(šìa7Á©]rJDéÿU‡oÜpˆã b±Çó<ïTͺˆ8ÌsAP’Mì!¸Ym_ Çke“m^õ!#ñÜa¼xñ\„³0F‚‰9š<¤¥ í„ÿT“X Ü,Êæ@TùB¾ žP¦~ÂO'qF)ãÊ–_ ®¦©´)C"0ºÊZÁ²G§†^KX!üDæIEOûë<ŸP4¿Ìž*uV U;O‡ãFw›ÜÕ;Ö±7²‡¯p/{;<)g©€µ»S;xxQõºs·vØ{ kw»Š¦­»Ž„YD¼ã‰»E7´v¼%àY¦Ì òÞ¼J‹eÙŽæéœ¸¼j›HX W ý~¹Ø–@Q¦8T”ç-‰/-´'+§Tª6ÐÉŽ›šk¦fµvØ{WdCT1n?|!(.@튲„n‚®e±+f/ å l’ dérºGõŠŠÒüòÏôCÉ63_h¡°@°ʧîfI1Ivh1«'?´à‰,Hï3|Bõ PºÜ½¯¡©eâ;´ÛŸ ãºÏY¤úœšw õºU®ZèdÍ…Óóæ9Ea"â€|Ù<¯„q†—Ú<ƒÒ^=ê'Œê‚4ÊU»d”£y¦ß\ˆD½3cÝ1†äTfX»Ü¤¸ÈLŠËFráZºªÛ äæÖÀ¦‰íZ`b¨‹Ä«ÃEw"ljjW­tú, îóû{3Ñ"U˜`DâK†hrÅ“½xfݲ¦a'‘F™7P²ïñ§ýyêù3…j(ÆPø¥Ëe÷xžļ†Q"aL±‚(,\æ«úýn-IJ˜D)h‹o˜X¡½—p{‚‰q kçŠ5á…ò`‰Š²­–½O±ŒW¤¡¶˜ÅÊ.NOË’8?Çú×ßÒSð‚’~èœ÷@×dÃÂ4 q‘G1.±þIU-l3£0‚ÔaöÒ°:‡‚¼(JÈØ ¿e…“%êÑ~3¨¿‚7ƒl< qß:¬nü+`«)vÝÃQ€  V1BÖ'®‘é ÎPYâM½°®Ër¹t}¼î mªµ®V¿ÚJ™Ã}.ÿú×G!*ò²(â©g Âʰè•W[\gÌjš¦’Ðb:RrÁVQ„xâllEqutµ§Õ;åS…”@•'Ø À ePÇxÉŽÇóÔ[R.oU?WoÈÊíI@æortv“ÕDäP¿»kÈ>½×;¶»?Ø@6ò1Ô )œ4s¨ß›Í|¤J@¹â\uå&8óÔÑC¡3PG"#`¾’~Ï °«Uq©Òòzcç1Ë×%Ƚ§õ‹«Ž[o¢1iúecbÿöì÷uÚÆ+':m°õrÒƒúuÌ;µé!°<ÐÍ„#h7¢’i°©Áyö¬;C°‘“üšY·Lÿ¬:¹ÊNŸÐ×$ q‚#”/ÿîf<ïá×IUÑ£|Ç62éú*Ò&.Ò"‘¨èo~ê¡Âú1’¹ endstream endobj 57 0 obj [ 56 0 R ] endobj 54 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 57 0 R /Contents 58 0 R >> endobj 59 0 obj 3309 endobj 61 0 obj << /Name /Im3 /Type /XObject /Length 62 0 R /Filter /FlateDecode /Subtype /Image /Width 24 /Height 24 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 <0800001000001800002100002900003100004200004A00005200005A00006B00007300007B00008400008C0000940000947B7B9C52529C5A5A9C7B7BA50000A53939A54A4AA58484A59494A5A5A5AD0000AD3131AD9494B50000B52929B58C8CB59C9CB5A5A5B5B5B5BD0000BDADADBDB5B5C60000C61010C61818C6C6C6CE0000CE1010CE1818CE2929D60000D62929D6D6D6DE0000DEDEDEE70000E72121E7E7E7EF0000EF0808EFEFEFF70000F7F7F7FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF>] >> stream xœmQÙ‚0to4 F© W1)5üÿwY¡—Ig_63ÓÙͶm;àR i5 ïöFšï H¥Ð ¢™pmtš ÇNˆ…û¼ÎµHd'6L‰œ=²°su+C{¸â=qË‹àÖÀ!Š—þjsjð×XQƒŸ:°5ùélx2ú“enò× Gócµ?¨ý³CsMy¶`R÷máãV–/NøwþèIÿðvqwÿOü'®ü°(ÕèËÿe3HÝWæ*šEÝ}ާ¿<ˆn! endstream endobj 62 0 obj 212 endobj 63 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.72 675.688 211.71 684.688 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 55 0 R /H /I >> endobj 65 0 obj << /Length 66 0 R /Filter /FlateDecode >> stream xœÍksÜ6î»§_ÎöyeIÔ³3'MzN›4çì¥sSw:Ú]®WµkQòzÿý$%R«Gý©wiÒ@AH=9ĆÿøÆ.YçgOŠæÐ%4P$? NhvDr¢ÈH†Œ=YHUqKdG~9+ÎlòÃÙ¯¿ӆؖOgö@¸óåì_0¸X4ˆâ8Vºº–E8µÖ9¹¾Í]ò})¸[íQý?×ÞÔˆ:îÿF6y8{³<»~ïÇ&Ë­vÇ¥V€ƒÀ#‘EÝÿ¸d™“_Ï¿›ëYh÷8¦ÎÀ çÎ$ó[³¢&ï›b]§e‘däí.)?UŒ¢X |ÅAÁInÎÄ`Co ¨ûXýpÎ]l7bÙÓ¢f¬"yÛeË’º©yfÕ‘pØ,YRð‡z—Ԥܒ7 ߉½ócY„ïX–ñ¡B‘A‡‘"ov3Ÿ²I…x™3RÀ^Êʇt ¶-÷¬Jê²:µ.œ-v{)‡éÜHC¾åò°@”œbçJøÛn\Ô¾-«Ö‡NK¹?¿¿é0¹¿TËýËÓýÅU‡véz×a g\wë §— º*ó‘;Eé±Iµ‚«f»e•ÕáË]ªEï«ò9ÝcmÒ <ªCy³Ç)ωOŒ‡†à¤áh„¬,®HÞduºÈÒ‚T?e#¾NmÑHl¬xvÉ|*½ç€ 'XEí?nÐv‰:”$ºb¬0PˆËaï²e—;ÆÍ^Ieb4ê,’èµçɺ*ÍáÛµmñ:y4EíKžªà &U’³šUüD§£®“‘SÏñ鉑Vr´ØÇ>›”£‹6)lÔAWÞÔ¢{hpŸkŠ1-IX L,¿% ¾f飉NBN$¨Ø5œJ Þ ›êb2öA&0×ÿÊС wj6¬¯Z<—= ½v ,p€A>ÉÔ0¹Y¼À?a׎03ë0é9²Ï"=6ÇüÙ}6àûEÌ<Ž,Oï&‰©#d£)bÇÖҔCrä“©„„“5&å&© v•‹ÈC££¶“K9Ìb˜ãŒ¨ž(çn=i< i°p–¹#Ý Å•ÃH¤ÍgŒfÎÓ‡£ÏaÇ*ƒŽésƒÏö}N²FœÊP9Š:I‹ãð+…I•z`DÄLäR¢E3„·{IWi–Öm«Xˆ¸P–Ôµ ˆÝ¶ã­Êz×@Xºêé¡È°l<¯ê ÷îëí—ÛŸ?M;sFlV@!g³½Ù,kȧcr^î»\Q€!¦ì/Q^"`•ˆNšÄ‰¨[m,vœ-.q-`U>~þýýÏwo–ÓI@YŽU õG])ED^¦‘ŠY°ZAë¤ËÄuA0>é;‚ýUÁí‚ßõˆ"MZ&€¼×E|8"VfúJÀE p¾^0"ÁÐAúY™ÚõöžA—æíßÖï KsU×¼)7Ð{ĉêͯĀO­uÌ#] M!®P\3ÞÁ]€˜²?5î¨(è«ZNŸ…5Âod>+Å–-ôCU–ÏÇ;TÉ~¯»¯Žš-Ù¨ûS*ïƵªØS“VâFcp÷Vˆì+ˆz®Æ:Æó¯ià %Bu)NÜË«>qÇ ¢¸1›?$Ï È‡»wÃUòlײCÈC}g6óòµÙÇ‚V¬nËÚîšïÀâë¦Ö Ó‡=ì|/‚´)òœ‘±.ÓíôKí¹®zp~„‚íEãíÅÄ0Î}û M!Ü[ÔñM ÓE@ ‡$ÝjøþüòEcß}§áË• ¥Šï~¯‘›â¨g‘ɲ[¢¼†ã}iÒ.õ-3Q#ŠZz®ŸY uÇÈšCÞïtØ•DÁªßuÊ¡¸åPz KæGβí9¤à†°W*XN¡aGü´‹"¬HçýnÀ§ün2-ÇÇû¨X‡/ Ë8›N|Ëlݦ¸¶ƒÎ¤3:n3qG²Op&½rÜÞ8ôÇä]’·F?›é«u±­õOŒ.jÏÞ' ù¤mk8ÑÚ«O|j`*½œ™(Z]U\C©³ót:ÓÕ˜&¹kŠ™ªÑæ4øÇ´={n|XhΑgLj©ÃØò±6ŠÃÙrȧ^tj|/Á]>C"%_*Æ›¬&˜ÀW˜w‰[š¬,÷†ÎÜÔº–cMây#Ã^’mY¡Ô™ê9˜0´oCƒpÀ4gƒ!ŸzDúóIxs‡Q0"æ,V7U1Sf…sý ä É!+ö\"o’¥@ïH“¦Æ‡?ªîvÇÔZU,y$Û4›>qð–¯/ðGd(k#³mAs %xõ‚(”å'Ïò>BצÆãæ"oð6ècZ¤y“·ÂP€3|×÷=ÏŠý)Æÿ” ùÄðŒ(Éxû¿¸/O¿'y:£,~ýØ·B>TWì!© :â\ÓÊ­†;†Ž&¨Á%Ò¾hILÝgI/½zÒJ²!¨(kKcêu½UYNõZ¯£cºÐ†½˜cõ¼žeœèÄ2÷J1*–þØ‚e;s* ÂÉJñ´h!U˜#X”U._£“ï¼?W/ŠÝïKUåS»+gz„Y+/<‘»¯ÊµZ"!¡Óªs[DÞÖU¶x{Õ¢¬^[÷V‹¶ÊŸÖ·hN}³`Īú¶üX¨Õ­£DÔ×4^â"I"òK C¼}Nëã•îYvàmmÊâou‡ÌРÖüJ=­\=®'Ó=³½¼¢C¡ç±Ï’õà£$4$}ÃÉ·Ks€­pû5œã «XŠç° ^†ÀfØáJâmZ)ÓIå¿¹Ý‚×øÝ<’¬Þ§¡ÿå…kñ endstream endobj 64 0 obj [ 63 0 R ] endobj 60 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 64 0 R /Contents 65 0 R >> endobj 66 0 obj 3339 endobj 68 0 obj << /Type /Action /S /GoTo /D [60 0 R /XYZ 72.0 215.008 null] >> endobj 69 0 obj << /Type /Annot /Subtype /Link /Rect [ 309.087 506.212 393.238 515.212 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 68 0 R /H /I >> endobj 71 0 obj << /Length 72 0 R /Filter /FlateDecode >> stream xœÍk“Û¶ñûý |óyÆÂà{:ýp~Åî$uâS¦Óæ2J‚Nt(R&©»Ü¿ï‹’Õv&­± `w±»Ø¨¯WŒðßBþ“本÷W_5Ž‘”“0Ѩ8!,¥I‘=Ñ@g¤’ C¹DC…Õ«Ø‘¿]ÕWùîê—_aц4&OWÁ„8’¹»ú ˜Ç “,Ïs-+§,Ë$‹&0XïÉÍÇ='oµÚH/ ÿsé}‰BÆÿ$ ÈÃÕëåÕÍû˜°€,·Îiš€ž“$" y.ÿp²Ü“_®ï¾V˦©^þJ–¹z·ÔGÃ}Òy8üŸRåAƒ‰8 †3žwY¼ÃÂ߈†ˆ å1œANUÚ ú_9a†±Rþ{R!š”·yl¥©?’ùiK¤!`h60 <ÝêVÙÄŠ’w@óˆ±T.ÍSG9L¶W2²¹( g”ðð‚lÆ‚ÁL¢$W£JŽ´Tz£ÆË6–i  šŒõë•¡l&972 /)õáKXJJÜåCª>_‡ß%¨¿8æîÖç±&¯ZŒdÄVËø  òMÆúì8ÝútN²KQX–‚?ƒs+‡&ðçÍçw·Ëwäî͇w?Ü’®Ø*±)ú‚Üþ¼üðéóÇÜ.?~ú+Ù¬Š?¡÷{ô ª¥Y&y3CðîÝrJKf‰"ʘL-Q†4>kRö¤*¤ß•Ù¶Íž5Ññt¢ëʦ¶wñ´ßCÚÊy…•÷3F“㫬¦¦õÝÁPFòÁ ¼–'lL_c†n:•$Éh.1©–àȇ/Eß1 >äáKãðÚYý… †±,>|Z`yÊ4yËPc—f"‡ož‘9Fb]r…| f¬3W)‰h³ €]ö*Ýß—äÃÝOß¿}ýÏŸ~xwƒàÆÝÚ}­Î\…,†ó@öOÒ‰>íø«Ù‘Žwð„æ¡¼ú!›îõ9É’1å2 di6¥@àîõ;AVE'ȦlźoÚgÒlÉsslõII×lû§Ä,ë®/ªªèánÇ2û<Ã(£1ðÌ’8%ø<ÙIYØ«z÷e¥ÓØŸ,”µ”Žvï›–¼$ (ÜÈõ^ìá,‹¦®ž-NZHžµ{eQpÐUeÁZˆúÆ[Y-C–Ä£hƒ¾Ü o]Ñû|f‰éG-Â?CÆqÐýõA´]Ùõ¢îï_Îjª!Œ4$­­bÿS §nEWn¤]ÑÞ†9Ö}YIÙ´ÍA¹ÌT¢ÓF°®Á›øæ=ÔRãûÃâL¼cfÊ[ðœnû\Ö&Ò¿èÈ›ïoïî~¼]~ ŸÅ×#øàŽ×>ó÷ˆ¥1„Yð±„kÚ·Ê$yµîõ¦ìÖÇ®CK"JmUŠö•ÃÇ@HÑHXyð¶ô!ã¿ùä®ÉàB¢‹ÃdFBˆ ½´ô—¢=yx#á„(½ã¶¨7ï´è¸z “`-â~xòáIëbïAûÂÓ׺©û¢ô(SçËÒ‘øÒ}eè%AJ®«b%*ÉrÀ'•œ4s¨G¢d†ƒÖ±Œõ4¤ÑY]³,:Gêþ%µÒ¼>öv\ö/: ;·ÂÁ…7tç„0:9X21}¦çYžÅsÒ¸¶p.pB“Γ<`<Šgö:ië°’p¼öÄÛÖ ,¬¼IÊŽþòöõ ÈÀ1µž­Af-ÔŒͤŽ6ØbàCÀÄN„tðDÀ„h³Px@Ñ>oŸ hÊb§7+ÚòQx|Ñ¥gH¯«¢ëE¿£÷Þ—ø¤aÃ(¤Y=L•RÖ‹CÛ¬Á0§í É0€B”e3ÕM½ÐjŒñÑûëîþå+»'êîÝ®9V'€ðÖ›! ﲯíò‡V¨©ÅÂ`Œ×ãl±š8ôv#¥HFµx’ÇUU®Á²•w º2£„{,–Ô³‰Ü EÒì=Õ;¡WRv¿•|néŽ+í\Ó¦*ä:d¨@#¡DGõ$M¬yèú¶JùÙaD½†_<`†Fš ÇZ£zbçN«{öF„QÃ,]磫ZÐyÂÃ>pJNÔ_ïTʰÕ4Ά²ZèªÜC.„ÓñÛf>PKᤠ¶@èგ½l¾UóÇz–{Ó(óÌØ$†’.K ÿ'š/âs«>­tÎWÏàØª›ÁPLÆQ ù2ð”Á%!˜Å!€]1gHXdëA-ô©v²>©Æƒ¹œ‚Ãæ¿?‡ãh9ÝÑx¼Žw†ÄàxPYrr MóTWM±9s¤«'ùˆ¥½þÐ÷m¹:ª,"½OüÞ·öª²ÐM®”kêp9§Q,6ŽÍçn²êG“Bù&Í%È­›Ã3>[ ¬ž,1ϧ[lù '²–Îfø_ä°+Á¥Ã$ž!á„0½0Bmù°ëevý O,Ê„³ó'à9”ƒË3()gØïà›Õ7<î,…SØú¶êÞµM›ð85yD#vº§W]QNÑY] ubUãMS¿è-´+… ;ªšuQYH:ŒGÖ¼XÈñi=Ìu]S±/Ð3OÎR°"Ø7 –ÍñàtŒêÐ*~e1¦V˜½tx•ñ}ú3&‚x1”ÔVéhåÈhcTæöâ ZÈc`”P[ˆy¹ñ£HÙO3U½cþ›_h«Íé‹ÇÜú{í@,w¤ÆÆepÔ{ °É^AZÔÎM;z^Q¡à•€ƒ¢ \7}¹v\Ì#ÄD–ºy²ã²~l~§Y<ÛawëŸ?aÔÂ9ýÀ]êg&ÄM›%3eÃȽL„€ì;„J9+eáP÷œÜÏ S!Y M‡ˆäÙ ×é=›º;Kßá†bLï*(¤(2fiXÝñôíÔg5·Aÿ™ƒÛ„ÃÂŽ­x,›£›âôw;voÅš=~¯—ö†ök(ºnT YÄ1Vâ8Þ–uÙíԕГµãÓޱþÆ1Úǘ}qì@´Açׄ1˜i‰íÔº@M"¬59£¬4)ë€-‚|œ.룠t¦j‰ò”f¡~T²Ÿ£Í¡í7iú­Ï,'1‹iœƒçJŸ~}f™ü˜ óÎÛÏÃ¥¿ò:a#øü7NË#Œ&<4jô zFk·&2ò‚ — d¾CÙðŸLnbOðDþR6'‘¸DE°>Š4 ÇU£Œ8cÞFß`cûŒ¥û¦0éH;5VÎɯÒà¿1)—ßô’8s¦¿Y@˜%òú¦on¼DA |çþsÓ>P’7«õ[…µ×d.°Ê—Éç(Ï>ZË–ÊþئFé4çatÁ¦!w¿ Æ<ÉkнÉk„ù¥Á3†òë™ú‚œÌˆ={øÓe6ôþyu”Ø3Ĩ'Ðwå£/Ÿ~4Õý†«áÁKÙ@Ï ñ8-œ¼—Q´èÔçØcw,ªê™<Égª™àg Càpý{Oµ}Ô´Ÿ|4`**„@å¶Ä² 1¦ü™ÙŠ9EîñÅ®l4z#N½w=ÃÆ›;Ó7AP‹e›Æ3Ç4~ÚœQxn¿“À*Ý; w8ýëë©X5b&™C˜q¨åQ=§Îg°GþÞ* g˜KÝ®O÷·ì,Õð¿R…|±¿ò±²^-.ÈwàºX„óù.a!ÄF5o÷ãPú—DŽ†ŠŸø‚`. fÑ„‡F~å4#˜ŒåAžšß%<†Øë#.ÈüÈj̆ø dr:à –²9‰|Ä%*‚õy¤Y®5Èw3ÒøÛg,Ý%ùn +ç\¾Käï&Ó,ÏYêÒNÿ^D—Ä¢Œ²@GE­Øê«Žµ¹(Ö;ÛªÜ8Ðþ Çõz¬Û~×!,l‹`rݰ³ e"´mK¼ÕϼÔ?[š®ÓáØ´t¦!EØëHµ|žà*¡8ðþº¤¾l.õøÃ±T(dÉ¡BåÃhT}@V¡ýäÓ2´lêw´q8Cæ›…œš¯¼Óíº£ü¦ž2TÈ•zY«lô”ƒßØÿ ~¢ƒ# endstream endobj 70 0 obj [ 69 0 R ] endobj 67 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 70 0 R /Contents 71 0 R >> endobj 72 0 obj 3465 endobj 74 0 obj << /N 1 /Alternate /DeviceGray /Length 77 0 R /Filter /FlateDecode >> stream xœc``ªðvö fb``ÈÍ+)rrŒŒˆŒR`ˆg`gfdcàOL..õ *aôöwq©a@F†oWA$ÃemÒ[rAQ >Äö)©ÅÉ@#y€ìƔܼ {P^RTÃøÈÉ rf``b²ùRrS€j˜D€ì”’Ô 9 Îþ‘Ažî! Éš †––æ ®‰Å%¹‰y Þù)‰Ù: Ž99 E™é%Å E©Å©Ee©)z@Àvƒ:ÈŸÞ îE‰•Åɉ9© Îùye©EÅ™ùy º ¹‰ †z~¹±ÉLÿA`á¨Ãêg˜8ˆæ„! ¹ ì¼Vppv1<àèÂjLDßÐ`pÜ‚"Î’K‹Ê šQÝÀ*»_)q endstream endobj 75 0 obj [/ICCBased 74 0 R] endobj 76 0 obj << /Name /Im4 /Type /XObject /Length 78 0 R /Filter /FlateDecode /Subtype /Image /Width 25 /Height 24 /BitsPerComponent 8 /ColorSpace [/ICCBased 74 0 R] >> stream xœuR»à ôYÁcd•´)]¦dÊ[A#PÒRjZFPé€-žqÄã=¸;}Úw³Òl¿ZI¢ºYFXbEŠÔ•ä Ü/ êzÄÑ¿Pè¸!š[¦S/nÝŠ*ò¨“Ïã¥Gni8XðÜKTE¿yçº&pd­Ë²Ù¹` ð¼Öyÿñ˜ˆ;Œ£€™ nÕÏÄFˆ'"ÆóÁE[²:ÑŽœi°œÔ×[Ú€ñ¯Ùÿþú Ò Êð”ë0@—IiÚHð(y| endstream endobj 77 0 obj 317 endobj 78 0 obj 202 endobj 79 0 obj << /Name /Im5 /Type /XObject /Length 80 0 R /Filter /FlateDecode /Subtype /Image /Width 24 /Height 24 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 <1000001010101818182929293939394242315A5A296363184242425252526B6B426363527373526363636B6B6B7B7B7B8C8C188C8C39BDBD08ADAD21ADAD399C9C5A8C8C7B9C9C639C9C7BB5B54AB5B552BDBD5AA5A563ADAD6BADAD7BDEDE00D6D618DEDE21DEDE31DEDE39E7E708EFEF00EFEF10FFFF00FFFF08FFFF10E7E729E7E731EFEF31FFFF21C6C65AD6D652CECE73D6D663D6D66BEFEF42E7E763E7E77B8484848C8C8C949494A5A584ADAD8CA5A594A5A59CBDBD84BDBD9CA5A5A5ADADA5ADADADB5B5B5BDBDBDC6C6C6CECECED6D6D6DEDEDEE7E7E7EFEFEFF7F7F7FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>] >> stream xœmR SÂ0 Í¿§2˜:ù7ee¢AXg]ÿÿÿ±[S†ÞÞ]ï^^“ô]R) Dù"F†¨O7ÔtÎz~†O7äE2ó^ƒQ©$e~PÀo-œÇ·ŽÝÖ7Íü‚_ël`W3ßûVÍçÔû Ò£7*=¢¾S€ƒâ®xCü `ïŽxÄ/5 ªÆSŸzgÛ:/Ó»ë¢L¿ßßz)Ó'áÉÛZG¹$ÏÁб;…™ÌˆŸ*ÿC*}2t`ìts6¸Ê”xú…öáQMgŒñ'¶tøh¦`VƒÍùÆÓõưþ41n/Y\,8ÁFÔWxv_ÿ„ˆ™r£þ¥yl¯ endstream endobj 80 0 obj 265 endobj 82 0 obj << /Type /Annot /Subtype /Link /Rect [ 418.806 530.071 539.996 539.071 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 81 0 R /H /I >> endobj 84 0 obj << /Type /Annot /Subtype /Link /Rect [ 241.04 207.109 364.01 216.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 81 0 R /H /I >> endobj 85 0 obj << /Length 86 0 R /Filter /FlateDecode >> stream xœÍkܸíûþ #(z9`Ʊåw‹ûp¦—¢EÑfCq[[³ã‹Û“½iÑÿ^R¢~Mæ¾´Mr·$-QEQ$¥ýøà;üÝã$cNÑ<|$šï$Ì b"E±ã'nì¥Nã’F©Scà ˆM •ZKääüðÐ>xÎï~ü;4*Ïœ—oÁ\²yÿð<ŠÝ N³,#Y™ë§)¸1Eã¼y×0ç»N´VÒ##ï.½-Qà³ÿ‰<çùá›Ç‡7o#Ç÷œÇ£1Ÿnƒžã8tR7`þaÎcãüøúýÇú±ëê/ÿî<þááw45Ù‡Á¿Ä4ù…Þô‹e]šn¨ð_è’—E0üTÓ‚ÒOü ÀH(HþÜT±²:Ï—Ghê¿9øöJ$‘‹47,Ab)jUÿe-–ÇÞž ó¶¬ÉùÒ ™›8¯_ªÚ u×}Ðȱë5<ž¸¡WµA¤bÞ¼Í&D.óÁ¦#¶4éÓð±.îOy¯ú/·Dv£¿¾jWEòÆ eÕóbìú«¦äÃçågsã ô<g‹ñAü”xsà&¶ìŒ,miM!×Õ\tí˜W­‘;·V­;J!ìegÞlDROì¦Îë–ó’—-ê|øàj“m%‚2\Îç®M ñü‡ï¾ùV#e>æ‡Ø™¦­ªì¬m7j¸ç/°N¦“†¾¿žyÿþ/ÔPÃÃçcÕµ;M=\ 3˜ëÀ—: ˜žçùi uR9_ºK]:cþ;—Á9ðk‡Ó²ÆK»ÜDXÛ%GÔò!‡y4U[5—fÓ:˜‡G+tõbÉæéK×yß휗j<9Û&»ÀEN“tÉãŽ=ø·8°¹Îu^ðsí.N‘·Ni¢kXÒÁ©«\ûEÏÍBßOÐ]e ‹BÖéŸüÌ C7Šà넸-ßÐÏY Þ>{òs«—M(5R,àB§(ùO7òü ô8s£ŠàÏùE…9óqUKâ8!1ñ5r¿ȉ-™3‹»-Áõ§¶þl|Ü¡hú‰=)DÕ°ö84ª½þBÿ÷L§-)“Yë“ <äüàŠ()‚®^Bö~Ê?åÎlÚùÕ÷à¾ûæßÿùO¿{SW‡7–Ov~kç9IR¡g†ÀV°Æ£®jGÞçÅX}B?FßõwXw¹ˆèëÖ†n*?+õŠ\IÃ@h×FïX[hîESþš25¬¥$Yâ†HQû,‹ÝÌÆï… z>›ŽaKcèdsvC)‹ß¡àæG¾½• ebø 9ìåñ«ó‹ÄH¦‘”¹Bníˆ@²Žš4ôñØïûêž›pZ޼áíøÛWŸÛ>$vI–ÀáQØp×&ðYìzìÕp}ø ¢jù]­‡E’+lñªžàw,92LÒÅDšZßš)NšúkÙ„{TíÓ”†P£jÒd_¬Hc/Ø|}æÒݳ7&Ú!Ò\9·vb ƒˆ%afwü‚ÂÁûœ'ß…/®ëÞÜ‚ŸeIœÊÑ^N\„«û­};aÇÄX~´ÂåÖ~Œ£[=ÍÐÕ`à¼]Š´a3Ï=P|Ä+Œ/}]•Ûi„ŒË^à¯tÞÙ¢”‘Ù!Ç®®»—ª}¶÷ÏtQöTlõâ:YßÆÎ‚ùÏ£Ád¢ ‚i áoEF»*ÙÂ`Mƒ^¶f/kÙ…Ç Çû‰÷Æ×e‘÷3ÏÞé ¡ìæ?\pÍÎpâN©Ë]á&°?2™K ÞRzßÎa ÛIF_ª,YÜ^è(q#L¿S–­ô]Œ½°ûì³_omhÜ~À!t™á°Oºeñ‘øKD¶§1ž(BeÀ\CøÕ4h¥9 D,Bþú­Ñ@v†‘áɆ©jE:­øÙ¢Í4eÖSU·7œ¨ŸU°Õ-ƒÄWè»ÒÍ’ø­¬Häë ˆÒŽU!²fM~ÏÇËyÅܲlÆwàv%úUmÁ OBÃj §ŸÛY´—@#ã•áÀ>~³í‚ßeqêyQ¬ôUb]ÏJB˜t^wÏ;Bå¾–Z‚.ƒjlU>|¬Ža>Ÿ§Ø9jÎMÃË 6z}]öi;TU„Ða]ï "§édÐ… p"¸_ÀÝbuæÔ½ ighä«$Óúb4(x›¡,BÞ^­Æ§¼}E"Pjqƒ5Ó°³;U 5[,ch"y,‰ ys®mœÎæ¾04Ür+:ÂRùDGy= $‰¨õñ#ìÅA¡rÿ P­™@^Õ]‘×§n÷CþJQeÁ3Qž"‘Qh¨«%ð?‚ZyË{W¾WFæ­·;šï•–’6×NáïtOé[ Ë®@X–ÕÑL5hàu——ÎÐ5Ü!¥ãê8°xÀû**L;§:ŠÏKÞŽðÅÕ!ÿLJ –XÀê ò ?ÆPŠ1QL ä"b`'Ø(”TTk‘d¤l1ª)ãÍ"¼fžx æDšFð+‚⢠2H%|›p$”:,ø³Ù¶0Ö‡ÆS™4,D™n)†ñ6ÃIß²U1&k3_йXÛR$3}HÒBÛW#h–`Ç‘5ÏöË»£8=ûè1¯êA!.x¢,ßÂæ]~P?€Ã™Õ±¢Á3žH %#H®Á²#ŽÈ‡Vì{¿œ®;ݵ,W†«ÚOuÊ{;÷yÃGÞoÆj¨‹,žéb¿/ùáò¼y gñJ'l»º{ÊK¡K&‰¹$™#‰Ô:k½­¤ö$ jí¿0À=§“C’à˜ý#)ŒF;Ó¨ïêú Ï1=fÕ¯è%e3½4] …<åå•"q8˜¢ ‰”Eo7ë fÙ"„ô#/w†ÖsHÏÜê6ZìñŠX#OO_äÀá(áÿxÎT”ÚÃóê g:xzý'HßóÜ@¤TCg,î2²¸Ûwè¾¼ŠÀñ,G‘óÿívi8c·º?}¹›ÍŃã0qÃ,ÈÒêIÔi¯açËha¹UyG¢-„x¥…o¿Ëñ<×S.n) n ¬‡o;¹0½ÕßA×Õ¼‰¥zê[~ýHggUUa}Ê*¨$ô`ã?óâ2N4‚3kr,ÕõÕnú‰÷6>VÍÜ9Á¢±l6QU&‰Ä‹U+–oYäˆ}.ÑóúI9"zssik> <1¬—ʼnS‘‰0åërÃÖc7IÁ¢4^™Ñ~ßv_ƒ’ÞêºËÚ“–Þâa¤¾›*@’ô΀¥Ì€¨i~]J¿8›C/Âû$ÏK¼teä‰Z·ªrÆ "$ðW˜üÆv냄þ¬=-Q‚±v¬“¶/a²Fë#¶Ä”]›o 6aÁ‡ ‰À©TG›/eBjL«£ö‹Š€GònÒx*D?ÇàÍe°0ŠA$²}+Å+ê|zª–J‚Y«_ý dÈ¿ß|Þ_±x…‡çðP5U÷X £Ýç4–ܪ¢ëëüQðï ,PW±ÄfÖæ  gqþ®¯¨†‹XGÁ‚@À‘´Öl¬Z£ÀKÁa§P²‹À.÷α˜Ýx嘚×l‹ùío>ƒ e»«Y‡p;püÏ&OµàZ­"й."§£©©2‘ÙãsF¼Ìs bf‰(ƒ••Q$2atãm«)S ~.…¹çq¨Ÿ%78”k Q[KTµ)%¦M`¥17£×Ñ<»-FZ{»íq§ª\.Õty¸8©ýXø,} JüE¤‘ú—0MI"zFRj¬•Ï}%R‰ˆX»K1±ë$|0­ò\#¸€á$쑾_5È+Ú»½ 2€]Jÿj¿—2¿Ò$¹–aä{S}‰$ÁÄ=EȈ½²tψ- ‚E×+ÕÇ%˜4,.ý8ƒ¤¶qAëB’>‰/+MA/ûˆ;HìE7.zû˜f.>ÍóÃ8ºW Â10ð²$ÙìcÝ`"JW+¡£V´ïÒ@ZוªÏ÷¼ç_ ËåÃìÍ,‹ÿ,ïZº£HEŽU.Grsž^çG´DÜH"…U­ôÖsòó¹ïν¼V´K~o°0I B7‹Rƒ£dúkïãOøÊïú%¨!Ñ«Rãv¦ý Úç. £8q³Ô·*Ý÷]@F >ö<ÆnT±±‘'é%5$2ÃH”J'ø­‚-6 ‚s"ÍÌw)H@[Ÿ™Jq çvjî‘Dí›96ÀÆú@åãISÐÁB” á–R“3»Šm‘&U쥓µ™/Å\¬›Uì‰>$i¡Ž›Ul´c?dKSß*Á ¦ß§œj¾I´3­>^dõ‚>\FY1"´Õ Š‚õKn¾É—vËHMÀ ÃÛÄî !jzs!±—Ž/ˆZv«S9ðÁ(K ó|¨ø"š-Å^8ÓÒÐÕŠ#ÂÔÕx.Tà‘¸ˆt%Øó¡ú'×(©„šñ¾©ZñÔCxsˆ±3-^ª¶± ¾ô,†D­¥|"ѧ×?ÐË ²f†lÉ4\@:úaE)RN•òkŒÊC†¡rþ¬`Êg<ö2J/Õ›¦ò0¥¡BU‘ a‘³ê.êYÓ'‚¹ÞêïôÆQ±T²3.t!dkGzî4@{ÁªóŠ*X:S˜f&Ò´ƒ;áoOþrÓÿc endstream endobj 83 0 obj [ 82 0 R 84 0 R ] endobj 73 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 83 0 R /Contents 85 0 R >> endobj 86 0 obj 4253 endobj 88 0 obj << /Length 89 0 R /Filter /FlateDecode >> stream xœÍXmÛ¸þî_1p tóa¹zq —8i7ØìõÖn‹âöPÐmk£/)gaýï’²,‹trŠk'’¨áÌðyæ…ÔóÄÿ^ËKœzU“çnÌ…Ø?ê†ÂܘDNtI˜@)Ïn¥Hwë«ÑNZ?láo“zâÀ'?ÿ‚B98$„—‰c(×j“ŸÐx?JÒ4í|õˆ›$Ò„O"¼É*¸¹­<˜7Júè½TäüϽzä»ÞÿGl&ï–“›!¸,×§p=ŸÄâE$Ä÷Rùǃe?_-žËeÓ”¯å§É‡e·4=O‡¿˜¨:{Îù›Atõã§Qü_áñB\ƒ|Uv„vWùâx*€ôõ" ªÁä1= ©ßÒøe&bGHrF€ë°?ªß2ƒEiÛ!iັMc/ R|É7UY‚Ø(ð‰ç8ºË¬QE¥hÈA ún QÊ!sÀ9yKBÇM#wì´Ôä”z#­ºž\»çÖ*P#R»rW]Îæ}Û(Îîlê;ÃdOt ÉÏ‹,a(Û‘ü hß× šŠµÛ¢Þ@Y|a0}¢_)4|C¶â¹ÌWdß%é’’2% Ãc Ûˆ§”»®ÖnŠx!I”ò¥Øó²È!£tb„pí6…é–áæuó2ŸÊýφÓÊ Id¤Ûr‹ àO:1ŒÞAŒËÓÝ1¯:1$EÏ$y¢6jR£¥ªBQ uœÃ9V/CÇh«Ã:wôQ׺“ è°ö÷RÞ…®>ÌÅ‘ uu·–9ÞžúJúFgŒ_ΰPyò|:H½sà°[r2 ô9Î;…úÑ'y*‘…£f/€¨Ht‰16ÔÇ«“%Wâ–\ÀŠf_®EIÅ–ÉŽi.4zwŸÎ¶$~|<]Ô=ÃÈ“òß!;µw‹Hb4îó’ÿk ~_ª/:’zcÎä‘a{jsAw2†Ö6ŒÔ¸ñÆŠ€!Q”LífÝ”–\H(Iµ}‰c +6ÝZ ô‘ëþÇùyãíÁ¯É‡È7Ú|Hr]gÑTd<Ý(§ßêíç…¤üÃÃ_±qY>o8#Œ»BDÏV›{¤îᅫœJ~ endstream endobj 87 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 88 0 R >> endobj 89 0 obj 1924 endobj 91 0 obj << /Length 92 0 R /Filter /FlateDecode >> stream xœÍk“Û6î»ÛëL63»´Ôk¯mæ’M/Éô1½¸“éd3ÚÒ®µ‘%¯$ÇñÝÜ?€¤DR’ß—Þ¥iL€  Â~œ¹Äÿ®ð#J<²ÚÌÎ%‘GüP¡‚¸ ˜lˆâ &ZC$QC_`µÖäݬœ9äï³÷€(% È~挘K6og¿‚ð ¤~'I¢tõ¨Ç(§! V2½ñÈM%¨;í‘‘ó?×ÞÔÈw½ÿr?{¾˜ÍˆëÅ×ói‚јú^‚<²Ø÷o‹EUO?Å›ÙË…Úš\‡ÁãÁ߈в&æØ3Ftõx…ÿõ%0Ô `8U(‡ªOœè†0ü¾ø—‚GnäüˆSìl;&I|0DŒMzüåf™Rr“ÕË™“7ü'7Ï'ôvOÆ—0Ëõ).u'À=0cï{±æzËÛõ¼­æš§`½U[Õ‡¿®ê ü®­w.u=w‚]|ó/Rÿ{b¥ï‚Á`e$Ãhàåá²â»v½<¤Ùßí8‡s*ßUõ=å[¾ZgTlFú®³î1º34)ZF2Û+JF`J¯§¼B’F™,ëì '¼h*¼ÓÚ¾(ò¬l•®Jæ>o×ä·ü8%(ºùÇÌôï|þ-¸ø|ÿþúÛmU·ß˜w©ågðÑ%Ù¯óÕZïl,%J†.“Û_ e!NFaÿ{µ#+^r{ûi+½4°83Æ"^Ú¢ H\l „¸ŽjóÌÔV¤ sçysÝY5™°*Üœ¶UUº_Wîº ÓñJJÞå%„Pƒù n. lHF4»ûû¬a-ï%0,k´X)î $è8ì’Šº*¬îRþ]1pšôFTÐv×B ¢„j‰Ü@,Ö{^ZܪKkuj@ͲÛÝÁ’m2.ª{7Ù€:ó•Z~â%¿Ïêù¸üƒ,f›c°äíp†g|@.–=Þ5Ö”ÒPGÃÄ °/à`ÅNH¿ºªWh×£Ñâ9ΩõZ^ßïðhRz}gi[úJÇÊqYé1Ä[#ͬ–U&]k#;bоZé¦ó$F䌱oÇ¢¬À~ú˜ \1qì‚Öo°éz§“’£˜2X’°ÐXÒ7MaIÓ'Îsà@•‚þnäõçYUóXÍÁSWU l2Ñæi T÷‘êG¥ “ö,ŒK ÄíÅ¢¹LI¨¶ªÇuZ«¢‘¯lËvæ1žiÖ¬ê|i©Í±ìÊŒ¿ÃpÙÀ|[^s¨·k© –X½íKYýu˜…z#IHtq{hÃù´å²[¤0onž¿° º.ŸFꦎ)Uõ;º…Ü\Ñ?«$ÈK£ÒTiYðò£y™™äS/ÚÀ –Rý³FÜ gÜ ‹(\?G˨€…4‘ó]2P2·-@E]‚ÇBœ¯Jý#1Þ@Ž¥“žP Ø"E‹Œ42ç˜3b¤Dh© e]Ú˜úg¨Ý9×e…çÄuuÊ(?ÐIV}卸Tv ÄN°péÝò ‡Ñ'‘@×Q”<}r¬ž8À³B5¸0YìוÉc[岇#Á¼1%óöˆÝnÂq÷-Ô÷Íxc"‹oÝyM|u­ŽÓÌÚz×ÛQÛ)-²ZCG:)šý6™¢w ×_½ÞÂÅÁÉQË@ŒÄ>~sû<Ô+÷hã"¢v¿ã(žXŒ m±;ë…jö·!e>ÎüP²Ÿ!ói˜àwÏê‡W¾üá•ñˆ¸ÌVž‘¿`JðuÅÇ;^—pö€+(×q{>BR†Cχr+Jâ07ÄŸ ø>n§ËÌ”@äAQ'ˆº”` dš1Äf|ô0Š9<áÙ€y²Óß”"Pðù~€*+E”bâ MTÞñ÷,eôĆȭ˜¤hƒ‘*&â¤Q~˪xkq ÕÿlÏ›VÃôÍÐCµŽk ì¡PCsÿ†&cÔ…'¯ ¥ƒ Íß 8ÝC’ßBÞñU^äâ«+,ç uˆÃ’æÍ¶j @l+ü²Åß‚|ñ᯦þ…Ä endstream endobj 90 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 91 0 R >> endobj 92 0 obj 3002 endobj 94 0 obj << /Name /Im6 /Type /XObject /Length 95 0 R /Filter /FlateDecode /Subtype /Image /Width 24 /Height 24 /BitsPerComponent 8 /ColorSpace [/ICCBased 74 0 R] >> stream xœ]Q!¶Ä0¼ß—+¿]¹²2veä\# c#‘‘X$GÈ’nÓv¯¯- ½O³a}µB ŠGîA¯™š¹»UàÊHÏO4ñO1•ïeáú„Ö|o{ë}rÐ ¯…ÃõX‚,àÞem’ß4–€±À1³ ªlEUDaÔ`ûTÏÿ¿GBa.Õ zÄKUB÷ðÞ^³ ø.yŽl#ŽDî¯Ô¤¦9²QçÖ;C^%oÏsñµÑÐ3=6¼ëµ°ï¹ ²ð룰Ñz%ðè¾ —ÓøÏ‹1êÌX|_˜Ž4˜%üeSAɬûå9÷d endstream endobj 95 0 obj 240 endobj 96 0 obj << /URI (http://search.maven.org/remotecontent?filepath=org/hsqldb/sqltool/2.2.6/sqltool-2.2.6.jar) /S /URI >> endobj 97 0 obj << /Type /Annot /Subtype /Link /Rect [ 286.618 522.62 431.77 531.62 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 96 0 R /H /I >> endobj 99 0 obj << /Type /Annot /Subtype /Link /Rect [ 442.786 522.62 539.996 531.62 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 96 0 R /H /I >> endobj 100 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 510.62 331.8 519.62 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 96 0 R /H /I >> endobj 102 0 obj << /Type /Annot /Subtype /Link /Rect [ 240.37 441.3 341.47 450.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 101 0 R /H /I >> endobj 103 0 obj << /Type /Action /S /GoTo /D [67 0 R /XYZ 72.0 480.712 null] >> endobj 104 0 obj << /Type /Annot /Subtype /Link /Rect [ 381.528 337.44 539.999 346.44 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 103 0 R /H /I >> endobj 105 0 obj << /Type /Annot /Subtype /Link /Rect [ 126.0 325.44 181.01 334.44 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 103 0 R /H /I >> endobj 106 0 obj << /Length 107 0 R /Filter /FlateDecode >> stream xœÍks·í»~Å6“™&­´Ú÷ÙŽ'ŽêØ™¤u"¥™NœÔO·ñ¾¼»'ùþ}A\bwŽ¿´M“ I¼nß_øŽÿ»RÒúÉ@yÓv-Fº¥Â‘" (nÃâj¨¤“ ¿jÀ€±Þþ=¹ŘçvÕ[üo.î9/î.®_ÆŽï9w;ûŠÒØU47 rõOàÜUί_ø_þæÜ}wñ÷»Åuø/ÛlqŒjmåy~žøNG; ÀŸìL_©<‰=ÏócÜÖ7{Ѳs|×¹}_Þ5M‰ûTæ¹~©ÍE3Qä¦~"Òe£óƒ¨‚ø¯_úk¼YâF)¸$È÷E)ŠZ:·EÕöM}鼺ýñ{çF>ʲi+Yη]sh™Lo¾#/uý<‚ƒJrùùOò±è‹¦~æD9<€Ï‘›óøùŒ'ðüàÊË®<0¶÷ÌOž…Á_=ßóŒ1¦ÖU¦õ³¹"‘~ÐyÆ! ½ëŽÎëÛsq×Ô‰øn+yIê#Ûëó¥ò¾ë;_›ÃÞÕÍC÷lh8rl%C‹š!‚Á߉GŽnšªõ–O¦Út í÷²,Ïr—p¸—\Údôìæ& —Rôö|wU3¼}±YzÎ ­®šæŠÝtT¾¿d4X¦f訯Ƭ¾•usxØsæ†!÷²–»b`”]×T ¥Gä2Ò¿'ËmW¥-Å‘¡OÅÀ—¶§ªÑþØ’/ÖvM+»¡“ݾù~i´<žíQt…¸/ g¨œß•ö7ÇŒXfì>ì‹ú¡g„û#C~?Ða"*?ÈÍaF›©€£IüTy•`EãsŒ™%^žgq´Âzö æë—ùüaâ¦q˜çi¶"¥_p°W¸‰û»èŒœ…3Ã쌦ɮ(ål+a»y‚WÎãO²Açnš€ rÏÿ4ÆR7?„¹q~žñ×9gê¹i–€M×̾†öÙõu/E·Ù»•x”µÛt׋ˀ럲v²j¹iêBÇse¦næß÷Îa{M§q­OãúÄÙØ“UÆ0‘¥i¾²Üoóé`e/‚”v9]¿mÈ.狇Á"&~Ž„'Ñ[¤[i±]ÓYä»›ß\Z´o,L®ŠöÍ¡Ü.íapªá¶yªËFèÇ›§êì^AéÈQ"ÝÂ{8‹±} A†\C±ey´d8ŸZn†u‘‚»Ã„mw¨7„uQ^Zb{è˜Æï!¶ƒ€X ¿²$´Á÷ƒÀ¸H+/ Îc³²¸³íŠGphê(D}tн)™aÑK68n±Ù4ÈfŠÚ]®nè[–M2¨™R{îñ¤/JàÅ%àB²È_Œà¬òƒ³˜ì‹­äZQ–ˆ шõ¢âè¶èà4Ý‘ÑD’›Ý,¢À¦^úå”›«bâ6b&f/#Q-—Ô,Ï l<5 ÆZ^ÓôÁ©¨ûAÔÉHcðG”ï)cD”"$"}+7Åîhb"ÁÓ÷Ô¢?ÿôý%C»¦áÂÍå´”COÑڢ͎!'obãa¯˜ëöë“·/‚ n‰ëKÙb²j‡ãòÒd& }ÿÔtÛKG'KÚ^§tOSó$‰V$½}ûûÉ dù9N‡’L(¶¤d*Ø×—dðú€%†Âr…>"ivzú-ìt£’-ç<“s ÙûFö‹ •¸yªJÂà,$9”p§§÷R;iç*¸'í#·ülÙ;â¾QQï”ÍCðÂO8Öü®®ÚV÷ª¸Ð‹Ü\U·IHò›C×6=¸—oðúâAA{Q?€ç÷B‚‹/šn켿§ÿ†1TܘK—éׯ«{\cû!…Âq¢¤¢a@çFwþi͸Lu³<òAy²@œ°øÿ0„‹ª.[ä'$/aà@|Ü©xr=èñʉà 9¥T&¡t&Ov*FÁQ6ŒÓœ/8΄ƒcu`F xÂǵP¢‚¥ô`&~¢‰¨ÜŸªv¿P„ÎÚC¥ɶËilŠëj°3™Á\©Ó:¤Scen‹Ó]0u UÓV5z¢„ÞÂÍAÇÌSY%fmW*±¢j›BÞ0!uð~TK§_A1ðÒRî,jIBÍødW11†P{_”ÅÀÔ¡xÈNŠrÆž­#°‰ˆ }Ñ3ÿ§ì¢œôÄ.,~gP‡HÌJ Ù>½ÜZm[ðØ3¤ƒÄ$qð>ª«e ´m O¬§)òQ²¹›kº8ˆI«KùJoIÝÉ2ÍÚ]½b!0ÞÔBM¹•¬rQm¾›§½± é6WXe³e°©Ðãð¶ÙÔeC³ÓxÍ9YQ5¯O!œÄAæù±¿¶•Ó|><² \ggù¾Þ€q{ÊßôûÜÐ!̓·²uÌÒç3éæÚ„Áƒà¨*šÀ_ã\ä` ïÌôI°_V6‘µ½ryÀB-Q:0(”C{H–"?´ª!ÌæP¼ÓÃA„_šºgÃzˆµÑ-ÂOûb³·(W—¯ÞI¬’3/Š”Á쟘ä¶?U¨°uS?l‹šéNkiOõ“ÍÄžØÓ"ÔmR$¤ªû›“¹Dà A<(ÛŒ`ASQ„“ÒÚµ¤;%±N{ ©`G¶^}¨îñ Žƒ°qÜL&s'6Êë‹aÞ«…ùÌjX"ªÎ š¸Çº•™úg„1zL ôTH»ÛÛ¹»¦„‡€)­€”±í¾ItÇ™Vþ=È´*GüI·{ Þ[ØFf×¹—àQ(ØBõ²dŠbq»ŠžZ¯ vnq)D°Ep˯ªFwª25+Òð>" ¥Ø»ËC#/å’ÁåvUÆ úw½;¢wO]ž¥ H¡|o5 —NrWý%XžãÔ*ý^Ð5ô3Ý­3½wÙf·FM ±±/Ÿ™öÅ”m™Ô‚Áº4bc†‚¨ig˜1‹°¥6MÝÃY’¯¥Ô Á»áTYk¤?ÖƒøÀœñŠÍpÊ léýáaåM¦óÈ ~W˜µé$˜Þ>ÂÆÝôWW–H)çt†¥ŒŽÑþЪÑ[Š2ÿWmË$?JåvˆÁ’%Sr#ƈ ÚŠ†æìÍjb€‹^¹–ô\/Ec¥Ý²y8P‘†ntö7 7 ˆäY°"¤èß—§«ëôë¸4>[„oê,.?®–jþî&¬ÈnÏ©¥~Ä=ûª×›¦ 䀨? ›¯2¸(ó¼tM>ø‹¿¨+sR¿ Èΰ¯ª÷OxR%3›6®Å°‹‰0>z„ñÍ“áÇp°”ŽeÂúq!7]ßBľî-¯`¼óÄ®b>«¯azè+gª~½1«âÚµ!ˆÏ á¦ÖÝ~D ZÜtry¥R­£•Fõ¨ì¥8WæWg¤êPZl,º]b) pŠ®ÕU>RÜE|ô<|‘¥?‹ýyìÔþP8\%ÃþcYT…ŠkZ,Y Xå-çAÿ\²•}ñPà u†êŒ5›î ƒÕŠÎÁ60lÌèøöK÷T*N|›vô©UŒm¨“-¨8ŒÝ,Oò4HhC?÷ر|]_½éÈi*ç•,Û?ý¶TùàÏTK*õç-)[$ ÆF rè~‡ϵ[ÔýµÌ(Ç~1cÚ=|¡Ä‡[¹Ž”ÖK tË8á#«RoÉÊ fBùÊl€:<“©°ÇÅò¹+I^J²írDš4š–j ½™çªœm/áæ^ìýlc)N<סªŒL“èI-7â¬pK£î!É¥¯ h°³’ K9&ÅŠ †«¶U¶¨à9jïG5!æ6¼°45¨x`Ëm‹¦Â|4ÄŠ¨°z}{(¶s¿¡L‘3SlL.Óê!üF’ùªQꈨ6QÑT弎á?+ç“s´< 6í@}%=ð(ŠR}ááÊ/ôkZšÛß•Uˆ|SuÌW1zä­+[΢ٖyû,ÀtÕÖªHÁR™`­/4Ý6DŒþ–´ãÜ‚£)­iöÚ0"µ¤6^Àº—6§@#{yv3+MÅ8OfVA!>^ÏV}²Ób°4úÄËçWÔgWÔ§FE)ñ¤ðÙóÏFxü9Ê^jKùÔ‹U‹é)ѳ1]Ãjk E·€ì\mŸž(Û‡ÎA¾UÖóŠ L‘xÙÌöÛ,uOêkG·$OænêK •³†¾–òÞ¾}~:¯„Òä ëWŽz9°=µ-µ›Û9`¨-º˜¨¥ÒïíÛÏ—m±$ô\­yꥋûÛ ‰`º’ãÇH%Ï€ˆ° ¸‹ ¡eñNZìŽ>ó@ Â¦×øƒ¨Á»u.ã1-Z–#æĨEdCù¡O3)'”‡Bi¹(˜ZÎì0TGA] BTÄ5è/fu…Ø~Ž¡PYAõcS>Ê­ÅG.Ü©^S/ l\c¤»ƒtZ 3^CóÀôLy¡iÆÉ#müþY¬¿¥cß&ÿxñác-V endstream endobj 98 0 obj [ 97 0 R 99 0 R 100 0 R 102 0 R 104 0 R 105 0 R ] endobj 93 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 98 0 R /Contents 106 0 R >> endobj 107 0 obj 3554 endobj 109 0 obj << /Type /Annot /Subtype /Link /Rect [ 121.15 234.523 205.59 243.523 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 68 0 R /H /I >> endobj 111 0 obj << /Type /Annot /Subtype /Link /Rect [ 106.72 128.71 230.34 137.71 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 81 0 R /H /I >> endobj 112 0 obj << /Length 113 0 R /Filter /FlateDecode >> stream xœÍiÛ¶òûþ ¢x`—+Qwà!Góš EÛìEÑ-d‰¶•È’#JÞøßwxS‡½Î—¾—ž‘sÃ9(}¹ò‘oøO’T쮾(š‚‚X‘¢ù ޽íBÒ(E58ù‚ªFKd‹~¿j®<ôŸ«?ÿ‚A%òp„¯¼sÉæîêWÅ8ˆÓ,Ë”®ûiÊE8 Ø¡Ûw;‚Þ´b´Öž3òþçÚ»>ù?ÐÈC›«W÷W·o#ä{è~m]À'NbXç8QŠ’ñ?ÝïПÏî¾Ô÷m[?ÿ Ý¿¿úá^™&çqç!ð/ÁƒF¢Ð?q¼ËÐ-þ‡84 ` üQ­6TýòŒÄÉß“ ¢X9“§Û#VêŸ~z'’(8m€;k?vªxÉf»Èec²©1ÞÌ—F;iÌ’íóñ÷[Šøœ&ßQÔ·¨h›†={xTæ}¾ÊE9Ú킇C’yž—F’m±Í;FûsšÌæÜÑž¡çè&ôÑ3.[œU^ô´ÓÚmY5¬ ?h×U%]š½¯ó~Ýv;—tu­ñÖ°}Üæ½†í Ám~0ÌÀ" ®ŽVƒyW嫚2i·kmH&Ö‚à÷ù!GìÈzºCû®ÝÓ®¯(ÃèáÙ›ŒiÚÑõšïëÁ`Sh‡þáù¹ÍˆC‘¶¸ÕwëYßvôÜ~̦ÝËU„T¢g÷î,"Zô3= î–²®jÛçýÖb9³pÙÃŽ6=-- µ‚Nª^±ŸÀ–ò‘ÂVW‡‰\GØcU×[9;ÊÚú@Ëù¶%ñdQ:-Ebè:0•UÕvÇs;“¥8&ÒLoLÞ°Šµs¹Ó‘ŸÀU0ûRã×ò|Vmsr/ý4œÍ[!êHŠÌC ¸Q¥¦ZÛ9­uxÐøcÕo¯ &¶V‚lO‹j]‰UR,{¹­‡@#/y7_ žŒá¼Ï-³œ(Ëåö9cmWžóÿù¬? ìò#j›úȃ$lxÅ­)wYî<Ðݾ?"-àÕÕgj²‰‡³Ð÷ä3à‚²¨Û\ÅðB‘ù` =n#Žœ 5Äÿ8…$á‡1Nåó ãlLª9ÉåQ£)®RŽQгár…8K² †LäŒt²vHZä]ÔÈ%\²DÀ„J„•ªHZ©l­»aKûõMÊ$“ÕQ¤éâ8ÅB:sñ(Â^ IÈOàöÝgOG•ƒ‘0ðc9õ­H$„cßÔÂÉÖTÍV¡‡¼èµ·«zÊXÀ¡“'š@-ëóÜIÂpA‘'7I¢só•x}®µMZqY pH%®´Ò·!P=xmÅÚ%,Ç“¸æ!Ø3ú‰ç%¡* žýÆø¤ …Ò]1ðÉ¥ "³Ò(\`xsSv«N„ipnºÏ Ì[ƒV ”,yiðvý´¢~åE¾G²`QÓª©«†~,Nƒ]·Öê-’ÐÑà¹Þ¿yõÚ r‘ ZÔàPPb´³[Q1Ë®1 ýšïö5]Z’ª9´Ÿ¡\;tÛcT#8©Ã¡FìÁóºmlAŽŸÊ1êÜx¼Ó P˜ŒsÌa…¨näsÜ’ ˜y>³ŒŒ4˜ÉP¤q<_Ò'Ȱ/š5­,j<"\®Ê'31d"g¤“}°CÒ"w(_‘™F.á’%‚ñY Dh©†¤Õ™ÊÖÚ¸6ÝŸ©vO*3]Eš.ÎÉN„8I¼,‹=§tE7ŸòýëÇ»_?¼yõßþé‡ÛºZÝBAÛƒ¿cþÐF€CW¿øT®Šï·0 \}Ï»‰ïo·íŽÞ–yÃÿ—«kÞ´¾ðd¼]¢Ç>¤Ë,òÝœåg¼ègj÷ª?BGsÖ6ìÚdä—p‘7¼3“Md‘xn ¦mndM¨)N"Tƒ™ vÑ aCùѯrDDöQÌmþ‘„µcb>Óa„À߯kÚíó®GÂx ªÛ Tî ¦ Lßxò‚CzÄšÛ·tÓÕ‡$­S¢z§ífc!÷¡Å] Ha²u«ýªý#x¢Îª=<Ô *ÚÝN¥ëÈ$nÕzÄcÞ5 ˜Í†Ð®“ àØ—o¨Ô´ ˜–™«ßZ¢°u^T58Vø½ÑqyœB· †Ö®×ÚÀi3 I~¼ °á'˜õd fmÀÉfÀu;£ÕƒÆ€rA%,oš¯ )wf‰âî±bv‚rJ‰lGc×V)‘%xºÄK Äp™š×¹Á¢ýúªÆµëC þ¤þ9Fبrï®.… ¾¢ÛüPµÝ|+àù˜¡Lô o^O×>P«DüòœÃå¶ù¼`ˆ `ð’`‘Q„mÛ¡. çþ³AÖb-"œ_»V\éH„W† úÎ)c¢„óŽ:3¤£K¬V~¨Æ5å✎Ê[w&¿P0ȾÚSìùŽðþg´ ¼cŽn‚@°ËEE¯0በ†k]myk%I¹_C"hkçÙËýž6¥¼„T¬¥¦š5„oêˆ~¡àÓ^ÄüföÓK,ùîNÜ bˆRßvx/=ÇÃjÁã{u×)1µêC¿z×Pyo&±M»¼žêªÎá8߫ğhÇzHºün–𪠳V˜=¸ÑK¢ªÕðé£çCâ¥Kâ ò/?{„xÀ(€>*í9#£É¦•D b}$Èzp«°¸>–  >²á¤;j­VOÀ/ygBÂC'‰©d§GÍ7%¦Û÷ä°t¾æ¬­HŠ ‘»/áÑi’$Z©Ë…C QE-E„«w‰ä#>»-K#I÷I† îŒåä™Èe•UIãpýõƒc6Ôœ"ôh]-Ȇ ” ý|%³i¶ÇŒ[ÆKÁúS®šÄ8àob³ [`õ Y‚_pœf„ *hÔÞ°"¯ùû ÔÀ&?Òº¾))«6 -ç×ЩBÅ—Aû«Âþã V=ñ­›*ÄVdŠpÚèšÖjÄ0Y5Þ¿OÚ –™êhÖZ˜QGKåÌóQ²à[2Ìtßl)‰cìñB;ýeSÏÜ_¥ç¦Zᕳ!àvÅ”oKDø¶EÔK0Í£§ü}[u õñáùµû¤¨‡ré&#äáe¤“x™¦WK¼M`â ðä¬z§oé%Â’´•0J]•¼³j¢ßxÝþDWò«.È‘^ u¡àð¦E¿Å<¶(„b4âפQ°0q::òq|z4¯3_ñ€öSÕT»a7™ì>ôëüÀ ¼@–ù5:3œÉwChE×ü…_re${õp~¶#¢„5D”ÆöÕGç[GÚ‘W •ÙD¾½M‹¸{q¯’oÜ@>_T=WŸÞÝcô¡ú,_¤\rƒAÖõâù+‚î6’ÏõÕ‰C’×1q#2Â/¸žá S2“¡HãÛ¢%}‚ýo¢õG„ËR·U31d"g¤“} îŒFCùŠÌ4r —,ŒÏˆ¡¥ÒèkAwæû3Õî’¬Ñê(ÒtqÎÜ`Ez@8 ^–$ö%É…·XCWWæED‚|2e…üíƒçëtü ¯BJ^8ù8Àèw7·9o6zÜRç2q ÇñAõ]¼lÖM,£=ï¨ØÃó3Wc$^u룿™†²4Ê©¼ˆh•4>ò³ ‰{ «Ä(u¡í •)—8ך§óîX‘ôµ÷µ#Iuœ ÕùNb3=uªßs+²þPAbêã‰Ñ¯û:‡˜å¨Q5 ‹”f“EZÈ(üV”ðAÈ„Ùè“Ó£?¾Fo¹Ú/ÔôU!mº£ý°Ÿ¦‹(Âi ÒÅÓrù ÉàÌp•@Ìç'îG'›‰™)ôU." 5¥3Çéº8rc>?ú–qº†Üvf>($\‡_/Û¯8øq£_i1ð«Õ~ÅÆ fÊÉmC¡,š/ï|G˜²žCã\V œîÈš«ßU‡§SƒÂUº~lún9Éçèo¥›sì@;&Çšº«ŽÍæ@PtÕŠ²™”²Z¯i'_”Æ©€L £‰©ýq MSTä Ú@»Fpêx÷Á;Æ_|ÕëEhSWÑ*.våJv00xÚš‚J÷7ä6· endstream endobj 110 0 obj [ 109 0 R 111 0 R ] endobj 108 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 110 0 R /Contents 112 0 R >> endobj 113 0 obj 3182 endobj 115 0 obj << /Length 116 0 R /Filter /FlateDecode >> stream xœÍXYÛ6~÷¯`󔻌DД䗢E“b‹ @ºî$AÀµi›¯$ïÑ_ßá!‰:ìú)í0ç#çàpÒ÷‹ð{­?â” u¾¸wXˆb‚(wã(Œ1”#G$,A™^8ê%nH êV[bþX‹ý´øð mP€z\áVÌíâ=(gSž¤iêl%8L­‚bƒuŽ^ßäýXšÕ­õZPðŸ[ï[DCò?°(@»Å«Åë· …Zmû Å1?s¡S’ê‚V9úðòö>[•eöêZý¼x³r[³|:xüÅØDÐ`‚EÁpÆ‹®ïQø0µ ˜0؃žÊܺO=Ñ™qý<é'ÊcñÔ×T~ú$b N@Ï÷àúÊ.›œ¢Ö}z3Á$–>~Ü|g7ÓÇ›†Ü;U7H ú˜ç¢zFå5{‰€­K€ŠMîdV>⑬ÑÇþ‰y§±A¶*kdõ¹>ÞÕM¥ŠÝ§ #£8Ðò´c|¸„1f8Š@!‰¢Ž±¾„1…l@aÌzSúЈ»L~.D.§,!  êíѰ㹽DY̘f XÇ).âäNC°3 ㎳¸ˆ3$×Õ·ã<^ÂI‚s®­å½oª‹8)ÁŽ¥$N:ÎoÿSGá”WÇaăP™>TÞý%×€¸€Ü©Y æù ÇhÄ1HNQ´Ý=!l¼ŽÏ¬k–¨(‹ëú¹ndŽVZs='?æ¦h'ižW0Yø°D¿+ù8+5MqñFœ—:YX/Ñ­¼?Êb=k/%!f!jÇg%Oª%º)6òi^nDq¢“"J’ór' oÁbëåæ”—!u<+×["–èûL‰z^V’`®S‰…ä¼ÄÉÂb‰êõ^æý•aNx}#ÕÙzVøtáq‰6<f£ßjYÍŠ§nDŒž÷ÆtaµD¿–óÞÃ1… ‚Bx^êdá·K$²ÌÜu¦¾tÙ9§†Ç#î›-z.U¿ïúx8”ä¶us}¥3¼0iî¯K2zT Sdu ePäf.÷£ µ®Ó<ìô½‚IC‡} š=JkΞ=@QU"ó «ïõ[>î·„Sœ’êWœNM°%p ØÃVà¤Sá(q~›¼òdgyVƒ)H±Ú£÷j½÷è\4¤Í8•dh@}kµUrcXI2Øö@sj= G×î=ä¦ðˆ¼„«HO®uj_y€OûŒEžßOX3·W¸ÙÙËk»B%EãsœB˜ÔÞ¸VrwÌDÕòéPɺ†(ê1ãð°P…Û©Ú}b W.©âA6ÙzZgG{ú¦˜Ûá£]•ÕÆø:è,»‘ø"Û±Ø<ˆ¢»(·íH>WònJ׃¬®kµé ƒ¬¶eWÆuÝÉBnUcNÑûòQßÕœÁ4¬Œ£Èè+nG™ÐèIç@·²ÊRÞÚƒ¨k{Ž·Äa:ßAíw½íZΈ}($Δ p‰)Z™‘OF ¬1Öpo"GW͸AigüŒqØÄ˜ÓÏK7:Ò†·Ð7¶Qã·w~)ÍáØ`YíÕÀŸãvivŸXªX—¸Ò,ë÷ Á,R¶ÃµtëUKùmÃA²Ø©Âº[‰%×{Qìüù.ü­ŠÁ7‚ÿþ< endstream endobj 114 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 115 0 R >> endobj 116 0 obj 1643 endobj 118 0 obj << /Length 119 0 R /Filter /FlateDecode >> stream xœÍZݓܶ ¿¿Bs/µ;w´Dêó±iíô:žÌ¤Þ™LÆçÝ.÷N‰VZKZŸ¯}A?¤ÝÜSÚ8ã’ ø€öëUÅðçVýST<Ú®¾/‰ ‰œXY%Ëã2:DʬŒZÕÑ#U"…æRoOÑ/WÝUýxõù tÚE1Ë¢ç«x!Å|ºú&Ïr&ò²ª*Ò•³¤,Õ‚å@lÑ»»þÑëÞF{%(þŸkïj$þ Q=^ý°¹z÷!‹’8ÚìíH¸`EûœçiT2Á+õ6‡èó›O_ÛMß·o¿D›]½ßÐÒpœº<þ/˜¾A^C–Æ~‹s»f¾åÂß” ä‡ñ Ö šZ:PúW52Ó„ÿžÝå GïÔŸ9ùù“(pXéOœ½÷/ÕŸ¼e‹STsƒ•Uš$¥"J.2 W<. Ïy”VÑ £=ŒMó fˆA4Ri¥õ :!ŸWL âv<Ÿ ·pd"çv¥Ë<&ÎÌ0ÒëŸr;‰#×LÓ ±;Ó… \‘ÎÎ_ F¼°ËŸ?Fo#PíÍÔ±“ûúÔN„¶õ(‰Ñ®Ä¥‘Ž£¥©À‹|uÂöNS°È³Ú ОWY¥¿^.uØœ×^€öFÞ8ºP1ÅÊL©Àt\­Õ‹* „Ï O’˜q“«N]G/qTÆÚ8x“\3Þu¨w»FEË7$w¯Z,H…vý°¦|‹@yJeÔU×_ðE¨Éf6_Ó¤-€÷3YÏÚ€ñ Ð+ ‡njöÔ‰9ò ’$Øýj2—&Y°½£XTI±„Õ@D]oiÐét  Äô¥‚FûºqÕÆRJª‹¼M×Üs§G/GW‡5oò¥ƒÂ¦™XÐ?ŽÒ ®¸×–aeJ§þŸ?¿û2ÈGùýø%¬‚ŽåðpݵŽ"óÒV„X_BzÛ·§Cç4bHˆ4}t1D¦ÓnŒŸä–þÖÈgfáy¿Pd,çs¾²»gÝC*. °à»D`Q&ÓÛ˜gÁè:Ò7—©–XGTØCå4?z À:OÓñ4áîñ°ªÚ•µ_[RÞy2•¤˜/táL§€6„Nw0ÿ}ó}1Öó ŠA>J‘ïø‰ »ÏŸ·sËAq"a'Ö–R†×ýî§ÍûßÿÛ\‡}ô[]/×ÆÎÆßUÎ8ø¹*Ió±êÅ>¼àSñŽæ8ÿh©h?®„æ"gU®½WVBóBß*¯ÊÔüŠaÓ_SUÈ“t…‰yðë%ÌOseŒØlÒ[‡…ɲ#SVq1{V²ªl!žX~"¿¦ DÜSeÁx…*TAXÈçÁn*ï4˜TÞÛ—Å6h†+ír*ï)cx¡2—Sù\ÀÁë ù!Þˆ_0¢€O…Ïýð;=L ½ÀÛÐÎ@9öÜãC=ļ躣Ýj²•õйòÑÖ5©œ"4Ý¿]Kò,ñµÖŸ¶y_N'ú=UJñÇGˆô—/¢!*ØŸZ‹é—š¦ÏãÔðì´Ð‡ Ë ºçèLrn¬úŒrûðr»¶¢\ø+2?*W•áéðGR ËÄW“ µÕ±@vò<2ƒï ±ë Eo„"Mè¡Å‹¡è,Qº¡M& éýÜõ¿!;Q endstream endobj 117 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 118 0 R >> endobj 119 0 obj 3159 endobj 121 0 obj << /URI (http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html) /S /URI >> endobj 122 0 obj << /Type /Annot /Subtype /Link /Rect [ 416.781 136.9 508.797 145.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 124 0 obj << /Type /Annot /Subtype /Link /Rect [ 516.103 136.9 540.003 145.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 125 0 obj << /Type /Annot /Subtype /Link /Rect [ 226.0 124.9 496.25 133.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 126 0 obj << /Length 127 0 R /Filter /FlateDecode >> stream xœÍZ[“Û¶~ß_¡Ù—¦3¶,ê®ÍKoÛ3éä´i³3NÓÙ¦×:Ñ­’œ]ÿûàŽi_zNÚLðQ$‚ þó†yü·ÿdEèíš›?©yYèE)5%©Ç2? r¯ñäIîÕ¢ã)ºÉVêàèýzÓÞÞ¿n~ÿ:í½ÀO¼§›`ÁÙ¼¿ù„'©¥yQ¤kè³<""?b×x›7Mè}×ÉÞJ{Á(øŸkok±ðÿ@£À{¼ùæáfó}â±À{8`aäg)Ø9Mc/÷£°Bï¡ñ~õþÏú¡ëê/ÿð~¸¹ ©á8á$qpùÅò.ÝnZáoìGØ-~˜Àħš”þ™Há¿W B¬¬Áóå‘–ú'…__‰,‚?¿X€0²léTÿ°É«(d_ŸL°ð¥»×8ãyÉÒáîŸùî4ñÑûÒK!x¯¦#×ôûŸß® èù®*k»A“ïÞjrœÊ‰7¼tKÕ:yó}eúlO‡7ü>¼Úž5ØóCyª§_úºéáX…«Ñ1Í0˜Í³Z„~‚Ÿ§4¬Ïªá4òéVh×5MÙî}…ßL_Œzh9êQS§(Á­ÙJõ%Þò] <”Ó$ÖíX“f×u{w»rÌ" ý( ‚€å΢áe[µ0l§~æ½ÂA›ïÓE”)˜ŸY¤¹ƒÏ=Ÿ˜|£¬Oø[4â½pµ0g`]VA‘-y¯ £¾>•†¬«–¯'>4U[Nº}}k1øðêéX펦ᑷ|(ëúì°V;¬%åÇr¬\1¢9º½iþA4¸½Ú¡W§cwz<\µö·Ê’¹+GK駪®-ñõø¢vŽéŠóúbº#mPؘ°!ÉaÛÌÆB f#ï\ü½îÛIzIƒB}ÏÛ=¦Ûs"ŸªéH$nvAßO`À‘ tûË ©C©Ã€Ò`\Ê9 ÈqÌ¥˜;©µË×QæÃà_¼5èÜ 8âº!¸ÿñáþ—•Á°Þíãh°ZWD[nè–—ƒŒ:„ùs¹›ìœ ±l,TZªƒc†,˜{?MÉÓÏcµÇ´ °Ï=ß›R€ÙÐþZN¡—Ý^áAëJ—Ö7 ¿Gþ C¶ˆÀàŠçŒÍ½¦—>¡0ƒZñ©A´µú¡£ˆOgÑG«kÕ40—r²šl–¯G‹wýTžÇ•i}]ó óÙ¼&òÃ8‡¤íÕ±üÄ "•ìŽ]µ³°ÜVjX5©°Š Òk-F¡í`#JCš3_  ýî­¥ Ãuˆ±xH¸$¤^“@Alë²ý¨€pE£¾‚§nÐÍÛr÷qÙ…¬”š¸‚¥÷­Ä™ÈNèäšÐ€épÍ-™GÞTë]Ww­'vT¦®¦yP–̲¹ÿ&}<‰!S„“¤]iÐõSÕµb;›¶þ4iºÔÔ8‘¥éÃc8"´Òw¥a%÷3’êüUJŒÜM‘zâ>C°5Ý(̹&œÏÃ\.Çýç4Níù¸ª-mVb¼ã½ÕEmXœè–^ÚÈê â‚­¯êOpnÔW_ì(|º+B[þäÌEçÀŽ&,ñÓ‹`‚ ošÄH‡4.2Ò¥¦ô"ÓZdD¨!ÒwfŒZXD0ÃÑ|ÂCÁë•Í©µk®l¾!>±]¶x„¦ÒHмˆªQzqæD©u–¦Æ½ÕhGéCõxÔÝJÁ+ F-õ (wLÃùQŠÇd…»YF/€Â®@WŽäNpmé0ž{¸\W€Ò (R!Ð9B‘?••Le±AeæÅ"3O#dAeáïïßÞû v¦<’ž5õý/?ý[ƒæ<•Û«É”%~Gc±K„Ö—QÏTÓéýü<â0óƒ0XÂ\F,ïj~UÁ8a/]iéW<8ÅÒ1O“ÌáÁ,öãËÜ(¶³>DèŸH¿¸Vqk•åÌ!U¯Õ:ŠE ðlHZ-Br¹^°GTˆ›†¥ßè(’hòJB:ÃyI¿t- gÜ-Ÿ]g…¨Ó¯‚‚i‹Ä˜ƒ‘±ƒè‘!ˆV– øÏe"Gdð… £)­,Ê3 ó~nBQšúaET8ä”w–Æ?ýòæe„¿ùÍçë>~‘ÇEžD‰CÄÊ(yÅÉἺîäQ$KWíãˆÉÅHGòg~… —D½°Ph¸¬HÑ¢"Kª‘2"i,$_0U”úiÛ¬"‡¾žÇÝù´ËXE:$+!8ÄP—“8mef$0UÆ2רòG±äyZzc_B¾¾;–$DP9/|æ»SÀu€)ʳ"[©«Bª0ôÙô‡Œñ Ý~­îš¬ùaZ—ÃÐ=©JðL®QejøÈµ|ª“‚K½kJÑÜ;;¬ø’ÀJA%ÝÁé]aÆFÁˆ¾Ftë‡À"÷'ÃB*†äå§Rtd¤ûnŸªêj:ë6q57 °¦Ñ”aI4+ÒO¥³ˆâ¹o‰Œ_ÄOþ\²óYy2 Çcwª÷b‘Nä<_£ó¨lpqs¥ùLÆÝ¸9 ]ã ü‘?o@"æ‚›œnwtÖÒK&èa ³{Ú‚²ÓI$Ϻñ[sÞIŒÅ¿$'kl?TM9œ5nøtį̀:ŠÁ‡wö㥺ù|O£Â×k±$úŠUR]χ¯³%>õr‰¹™$Ý)H§\b.)4:+ŠîŸ|… ·[ô:A¢õo¼2£b¾%ÔÍO jé[µv·¦­¬ÛNæç„T-hZ>X”ØrÁÿP]ô¾ÝXrpa‘† ƒ—î„:CCQ$nS¤÷†?Dã©ïåå—bx¶>]x<6Ò&õ q…ì8œï¦ïHðZOBPdf¥¯$T¯n9ªÖ–FÅ»11\îr¤“ÉÁº FeÓÁ'Hg^",S8/Óç»N\2Ü3¼"£ƒ‡Ñ —O”/#¢ rI÷µ:S$¤k+IƒVmO6‹n¨Dnjq–tËUÇžWßMDåÁ² ’Ñ"qA¬Â YYêi ݃Ü1ÖÒrø+š@Ʋ¼(bæZŽ©»ª‡\¿dcÐ)àx».›^ ÷7@ÅŒeâù±ÈÂ$†DÎoXyq–‚ÿG ”cP2A:Ègu±+à›×€–ѵ i„x4MOŸ~FMÙüTsÃwPÍм…þyc¤èyî§P×Z04°‹†¿$]p mÖáŒ÷…æCã‘Þv_9é…vÃ_2…¸KHŠLMJ£…x­Q–Îì¿PëóZdÊ$ ÌM¢¢ /_:¤Ù,ÏŠ<sò}øs7~%ƒ:âW:WùêEGN‚Ü/ÄSn˜æ³lÅÏ_z…ª(, ïYâ`‚±yèë³Ïåç`Ãbqêài8¨üHrWÇ ß›F 0Ù:TF7„2 A®²³º`ÈtŒý /h×ò!ðPíä[Ùçì$JI€XÆs2ïrU P¹ìˆF¼¾”YÅ·øÕKäíS@ÌTbE`àò¸ P£~:eX§¶cµ×ÇRfGzñ–ŠWt«Ç]æxÜÅŸxkPu°hKzäeW_g¡ì¹œbÙcµ–¯Z¬+¡H’t6ò êÅÖû!ޱÜj)·P_­®PiAY6Xø ¯I/‹†u¨l=p½mAê¼FT]W’¤sg«ÄÕj?pµU2¼€m`Ñ ü©.«…?ÃèqT¥ 6âÅ>JRQ>Dhow,ÑÇ}¬ð‚\aÚ‚ú“+åMòÅ>±²M¬5™|iã\ÓT¨HúúíJTø©`-N票ƒêáú¥`˜%/Öâi ¤ûòQ:"À®ék®Â (Îr8x’üE9‹a©ø\ÀDm¸ö(í}°`íKÿõßÉ;˜vÆDø^@Äùß-.Œ²"-Š,ÈþÖ°f gt”¾8ÓßçãÀB,€¾i9Ƨ©¿Ûl\®UÌ#̾{jë®Üû$ê5÷¡¦ÞS|“nöÝnÜ”}%[6Âx¼3 ãùÇ©™{p gäCKI,:f~’Q¶¹ì. )±Q¾~÷F‘âeÙ1©JÄÙŽ&~#p–,òÞ¤åâù¥ó>¶Ý“ñî$®X&|¤S1ÁDgÕ–†óØ£«6–ê'aF¯l’¸z‚†Aè§ia’:¿¨‡,ðãF²È¥’’lòf^ç$}ûúV‘ô ¡1¬gÓë¹`¦#¨¦üÈÓ²Ÿ2̃š¯0œÆƒä ãi<÷ÙÒ»(©e)%´X5QyŠE•ÅcúnäÎ%Jç® êX±QÀƒê[ù2Y„¡k‚uíN¿©ý/V™º endstream endobj 123 0 obj [ 122 0 R 124 0 R 125 0 R ] endobj 120 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 123 0 R /Contents 126 0 R >> endobj 127 0 obj 3341 endobj 129 0 obj << /Type /Annot /Subtype /Link /Rect [ 102.524 78.25 248.348 86.11 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 131 0 obj << /Type /Annot /Subtype /Link /Rect [ 269.996 78.25 539.996 86.11 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 132 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 66.25 240.0 74.11 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 133 0 obj << /Length 134 0 R /Filter /FlateDecode >> stream xœÍZYo$·~ׯ ¬F=}òƒa#¶³†¯± ŒÀrNg¦½}mÍ¿O‘Å«i•'›ª*’Ū"Yõ‘=Ÿo<âÂÿîøŸ$óI^Ý|–2$> b)Šbâ%N즤"’I£””¼ã„ä]$©ìÌ™üvS߸äÇ›ßÿ€Nâ:¹Ü¸ 卿ãͯ0y;AœfY&mõ/Mù‘Wd÷¾òÉßÑ[YϹÿsëm‹Ïÿ?°È%§›ïnv?DÄsÉÃÑlÏœ$†8ÇqHR'ð3þÏ'ùýöãçò¡iÊw‡Ÿn¾®á8¾y|øâˆ4iˆBwÚbí.-7Rø/t”Äñ#ð7•rAå_Þ ÈHÿ¾©Ê<_©¿rò—W" @⤓ðC+öÓMõ‡l±Š|îW¶U´ÜM¾¡;¦ÛʦûgÏȦء!ýÄÈpf¤g´ËϬ'Ǧ#¨c÷C<ŸÔÏ"ÇK¸¦8]¨=vME:vbÏjüÂè H„O“åx’S0¬¨{V÷ÅP<1gî ¸xpèBôk>/úq§ß‘;?rbr»9m aÐt?îû¡ÆÁêücÙìiY^·FT8ÌÙ¾]Ëñ ¢Ìñ}ˆ‚—­˜ “¾É8sØÊi-š™›<»ŽÕ9¬¬-ÓÏo±3 3Çs3×M“l9_ø•%ƒY¿×÷†—ÆŽï¹®'Þr,ߣÆ7uy›öXtý@Œ°yÇú°¶mâØIù¾KàÀ½¶mýÔ¶ãBØ7_o,N.;2ì™åjÑeóÙæò¦ªh}°$EU±CAÞ)=¬{Q‹Þ]ESÛªú_’tæKË:8Ý0éZ„<@âÑ|-DËŽ2Fžï9 ĨÚXœH'šû·EË`Hîoq•LE‡ülñŒNز¨Ùݾcô“%,j{[ÙXÅck<ƒÅîÇã‘uÛ5Ï¡"L=·6åŸ#lE:ˆ}ùĺ+Ù³SQ×E}"ÜS&d¬}yVEÇζº Aℾ̵b¶÷üÜÆ‰ã‘Ûk3jºoY^¯š§š2{ùz¬öbs!ûˆ)[±¸ÓÖGž‹~hºëã»íª Ìê:¶š¼ÃyÍ3È&SÏÄÁ±¿=2:ŒS¬š¤;VuÑç8%ÂD&:[EîGÝA¯]5FmÛ\à(Œ¥Ó<{HFž8N~`]¹û‰>Ñ5/boæä·±¤aÏmÇúžQ “RÒpôz6¨µ*Ȳoïo{Ø+ ¢U[²­&®“…ž—p¼Às˜BèN€vϤÈ"Hš–!mCjÕä(À°ˆƒw±CEB(QÉE¶Žd‚©@'r½,öæxÆÌ–Íg‘"uãXL¯ûf¡ã&p°eQ8ÑDðv‹¸Je6ÏÄ&ÓÀ‘™?·Iea“-xS”`@êËYÔÄZ¤,ZL¯-²×m±L ¿lQ2‹’’Í£¤AhFÒõÒ̉c8a ÷~Hú][Ô»š±CÉv§¯_.ü Å÷,`(´\š±Äj 5Òr?Ðn°xž[,Ö.¯(ÑÉN À$ÃÈÌ÷òp™ñ¶¶ Ú­¤?pglÐu^ ¡-TµiÀvšž‚4);jraÜl5 ¤ÖŒAºQÓW Ü­iÎÔÈmH±æWèÏüzÔ¥Ðkʵ½Å‹š– 7°Jfm)»¥Ýó¸dòfì$ @ÁžMZÛ‚Mfo&¦Ø}ua—zD©µ37š5ï£pæ½Ú)º"Îk·K|@^.Ç º2Ü_È®¥Ãy74»cQ2§ÿ\®Í¶ø bëñ;ý-m[(µ¶DyŒ\ÞÔDÚî c»Ú[ìºÁ’X!BÁãíþj±v¤°§ßÙ:›'@dëµækæÎ|á£ã€ƒ‡ª&#{Á=+9Œ Ò{ÆA–éØÀu´³Ô|ä&Q¬ü(ùð³Å Z•]ýÙ0rÙ{«/ 3ÉÚm°òÔIÎùåA¿çò{WøuN „Ö†–v Óç]ÑŽ<4†æ®3«oSYàŒ§¢{kZ“ôP0Xº¨!ùÂ,𰸋‡3ï†qQ,ÒÏ 1Wd.šÑtÞHÏ:ë£Î.§Í®äœJü‘2rEeY|Òš6÷wáF«b„WWÊg¾ðå=ÁB ÄXN±<îÀYþ’‘ÆQ":ÜLÁ>ps¿×ÞÝF\4 I8¬ýÐ9×j[‘s@Ûâ ¯âF\îôJÆžžÔ{ÈˈP¾ ¤PÄÃÄ Á;Ê>o ’H£Å#žQCKbéùŽÐzcª7ÖO[ d-f·á‹0`Lßj„„wÓ üÙ SLCEл+÷a‹-xKL–8XBâùÜʽ0“¥˜ÛõE3&A‘ü<&/¢;ØÙIâD€íÒÔ·±Ýîþv/#:—„nìÄÉôrt'Á Ï@ú°óÃJEÒ ´"a]?5Z‰õ•“Üžè“ü%R’ìyè(’›ÇÇ R…œc1¦6r@ŸÓ–ͬé±@ S1Zc^VÏfSå5þ•—¹EfÕN£`]÷9ˆkfÈAØûá«Þp'^ ‹ iCHÓ}ÉÖ{u,G€©zbjDÆz©’#Ï#WCrþÛ #‘K³5ùÄ£”ãåÕHx¾nFK'_ Yì”åËÈ6F.?³ßx"Ëfd$3ùè$èOŒµÖ¸ŽÚjòZš‹aÀGKŸªþF²Ÿ¨Q8SøK{Çp²ôx+~A¢Xõ;’b¸Î_¯ 2~:‹ r¿oB ÕwD¤ÑC¤ÑC¤iy¡×^³¸{î¯õž5+_¤Ù<Þ~S<¾ÛhDШfEö×3wš1QBÞDɘM9Æ_ ÷¢®©y4‰«4ÿ©™o?¼7NÀeX3P.–a„Š4 cõ¯²ÖJ²Å‰|'á¨Õ…^K|¸h#TÌÏ^Ïø!‡»Éëãþ—(j¥#ÞÛœt€3»øÀ;%S0Ãÿ¯ÌðÒúzY–¸_°ã÷ùÈ,q²,v]mÆó0´÷»Ý¡¹ÔeCN·Õ’9!vÜ¡žíbhÌûm‹e‰#¦Úñ(ÈWGç> endobj 134 0 obj 3253 endobj 136 0 obj << /Length 137 0 R /Filter /FlateDecode >> stream xœÍZëoã6ÿž¿‚×/Ý]$ª$ê¹À¡hïÒ6ÅöºÝ͵(š¢mÚÖ­,9’œl®¸ÿý†œáCÛé—Þõð7"‡3ÃáÌôýEÀ|ø÷JþIó-w÷D X2ž)NXz‰Ÿ±#Å«dÇASv¡&WTê`Ë~º¨/|öõÅ/¿B§ó½˜=^øæÈæýÅ0yœx<Éò<'YC/È29÷h,wì³›]ÈþÞ¨ÞZzÉÈÿŸKïJăðÿ@"Ÿm.¾¼½øì«˜>»][Bî¥ Ø9I"–y<Ìå?!»Ý±_^¼¿¯n›¦zù+»ýöâú–TÃqÒyBø/õ” >Ä‘?üâx—¡[*üyi@ñÂtŸ*ZPú+?èf¬ „„X9ƒÇË£,õgN~|%R/,@;¶:ÕŸl²É*ʹ+ãO|©*¢-ªKö’] ¤ìÅ®è—Û²ÞXJQ?Y°oÚ¾ljKhÖ¶Ýo…Ëf·+ê•ÃzYtÎ÷NÔ]Ù—Âé!ú¥çÀÅ¡·à©9¸¬º¾¬* î,‘v¢ß6+‹ÿuèœ V¢[¶`§CßàJ; ý‘ wͪ\K Å™—É Ë΀…ØeÓz†rSÏ÷”¶¹4u¥/Í¡Z„Êaû“»Ÿ_•w/?1”¢w¸ GŒMY׸¨HQ«fæj hÅæP‹ûVt®81n¾ù¯Ì’zh¶Ï¾‚Ý“Œ\0ʼ$¤ý"4àßÐQØ7e×7í“:ã½)÷bŸçyšáÈ[ÔQ®ÔûÞèæùhØm›ÇZƒ…!÷vìë­n9>£ë¯t ¿šri€M;ݙḾj¶öP/‹Þ²@+ÊVàûº)ê¾-…ß•õÒHYö†Û¾ìŸ&¾™ÅCû€@BJ¸—³ë¶Ù°èˆŠE% P¢aóþP.?TO?”âÑöÛÚ1Öæˆ+ÀžA?+wÆ6î\jo‹z#žÇPÔ›~kÅ·_:Ñ÷®..—î©ë…Uzß6{ÑöÆÅò©‹åéЄÝ}ÕC²õHž7JŒ£.„É„ÌÎõ‚sãxNÙjPÖ½Ø(_’表úËø*ÈM4æ:ò9¾×úJð–´%¸ÒÜe·ëˆÖx(WÊ%¹rê‰?~>ÔåÛ⡸{é±›5“Ž/x¸h%pÛÜ| xW|ò3Ó+ÓÈÞЕÚ50nÙÔ¢.Áá½é¬<ô¢Ü‡Yyàîó«8õ½Ó X7!‚t<‹`š¾(ëÎR ÌÄG±<à¦4p [ŠÞáû-fD׫ҙíËÃzíö2Ãxâ|¨í®£XT®ÝyÅÔPQ42Íàh‘»¨èL»0­î ¬òÑ@ѶMkÓ\eeÇö* Ðe9H ž!á"a»Eçô^;L!¤U‡ú3R…Ø1u·Í®1MX…ÞL–4¾¨!–°ÚS«Á!fh5'ʯËN‚ؙػÖ-Ê̲ùXv&qô§›NRêŠiû}U ›6MDÝ sŒr&ÃõfN‚e³7™¨e¡?8Ñ4µkŠÖijÀ$pQõé«a+ìÁšŠ:ÕâS]Ûº S€$"¤«¶™O(î¥Û·èOw¶X‡U‚ºnT¨†ÝçôUaÌ îp…Pݑ՟N€B¡†äm!tž8óG³IkQ¼b¥Žš>ü OÖn°àÊF)-„íGpšLýÙ½}èèê496…ü5Ës/å‰?á8öºƒ*¯/‹ŠY.'J¶2o"«=žãøWìó‘‚“n7õä§M[È=˜Æ^Â^|#ª½Å¢Q‡D:A"ÂÁöÛ7¦ùP´¥,t:CyÜ–Ë­APªÛq ¡"1HdžZÙt¬,Ïäuœ ’ŒOúg'K+¹Ì_N1K¼„à ò(0VdÔå›zΘ“îŽ5•Ñz:?K‡=ÔÅŒ¥@ë£Úƹ<‰Nç’Š*Ÿ¡‡#ËC}šzÅ~üâÝ?¾øîšýë…ý¦£Þ µ=嵉ݑ„Ìž'ŒVÅ #jí9´›õ ¾ØÝ!­ÑÕŸº¢ˆT~ý¥K÷›ŽF.ç%dT(T\Ñn'²MŒl³kH‚˜ë…çw"Ðq™¦jÈQ5•ŽmÇ„B»ž²pç«@‘öèü¥Ë¦tÇí UÿkhO¦®PUùA­î•}8Ù‡üíxMŸ$3£0E“@ÕlJ¨;Ê,C!-¨P<ݽt¾´ÐF©ûp¨a¢ahO3ù©—§)VmX·ò®j!U]™L-× 3³/Ë£*nhd!¹,ƒ4…¸ é(ƒª1Ð%Ê<±¬l-oìSYúË.>vÙ1(χ¤J’\6ñ=ú\`Ùs>aO$ý 7™×ô…úÕOÀ,\‹[4ž!ŠäÎðG „±vŒtqû*3L„q §í=³€Øë I‹2™×ˆâ.ÑdE&²%ÙEÓÆv9ñJ(Ý>Ë!mù`Så¾xÙzÁÔy(!´G×v(tFhäïöƒŠ>CP÷f¿4¦8¢EÐ)êxa&7Tä9:Œ¢™‘09÷Õ ZmšûªP¹ Þªæñ<)2¤µl^¼ói$>ÉÁˆ 1^>œ‘‰ç!}:cN9ž«e¥·œnæßO¦ AwªårAR†E¯ÙBœ ÐqÉ9ޤ{c€ægtþý ’OIr¦ŸŠ¶6 äL{ñ8öƒ@Åáöf@U5ŽÅ°Ôv3AÁ’(ÄXV´Ñ]Âé˜=ÄÞFáo*J"Ï6a§:ÚMÏEÇÝ1ÿp4&ºv™˜AÜÎ@W¢M„9¥C%iàÜnýTb±Æò7 æ~Ñòж‰û®Ó/ÚH¡'môk‹K‡¤/.‰cAG~ÂúùYÏŽÅA¼³‘×þ3{*†ƒýP{˜š"‹Ï{CÄrßs^ìÃ|ªë1únûˆŸÃDìöêÍ(µ¥šF‡º‚êFh-Μ><é#ßð´ËGcó<§ {ûd¥IÇó,‘}8u@Lœ™J?ܽ»þîû¯»þîííÏ¿A||â,|’¡#Sߨ›=uÏg®cê8-W{ÝTUó^›8ê{2ˆ¦ò7&yBfŽ£qâ{ ‡ œc…=7Œ ²C€tØrH¥&)Šú6{6Ê<›ÌB¤a “( ½”ƒ½b-ÂáùQìœLŽæÈd?èx:諌2‘É%<ËJ0 Êh;1‘†~N"wÝ&Ë4ñ¼DéÈJš6¶’ ô9˦q>‘¿]ò!us} ‡œëâãxrt–C¢ ò,O©\Á›ÝÈNîá’[èC5Æñ “?dx$f FÌ0td¼Aã½FÎÉÎóÐË“¯¦S CáÉÁ—®4[|´¶p&T%~0ba£’œá2ýV‡ vé,r9¨ôX•ª–ø»ª9'“qg³ÑbkḯHµí’é}$UeFñ uÈêŽixtj´#€>f!œÚtg^¸4Š€¸?”P2è¡oß‹5°¿­1 Žö]Ì.{ä¯U%BBwö\ÿ:H£¢õ²9´Å£Aľqí BÇ7C0'Ìß¿J)žŽøDI$k¼ãÁ¶QRºž29½!aÜ©Á—Ž ±,ô« RÌ;BóÒdú7»aw­Äº8Tý`þ¬Ñ!Ñ«‚Á/”‡¦‹&!tÛ´}E¿0Ô‹€‡Op ê_Ä(@¿MókÐH>»é \"rÕ6¿þŒÜbSA]j’/*Ú;±)Ú•¬q?®þ/«Äêœ endstream endobj 135 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 136 0 R >> endobj 137 0 obj 3306 endobj 139 0 obj << /Length 140 0 R /Filter /FlateDecode >> stream xœÍÙrÜÆñ_1¥¸,)µqIÙ>ÓåX¶EÅI™®ÄÎV8H1¶ÿ==Ó=€]JON¨ƒÝ™îžžž>x{0þœË_Y²jö–hËB¥DJRd^êçlÏÉ“œÕrà”CŒ•F#²c?ž5g>ûÛÙO?à5ó½„ÝŸù æÈæÕÙ÷ üD¬ãlâ´9>@(õ¤8÷­ª^âEÌ5–|BË2œòÄX2—µsÏ„KûÏd»øã:hn~Bì@¢hEfbIåûK5Þ+–VŽÐ|áÆÕ –O<Íg© ¢0”ÜŒÁÏëW_þðùË×ß^}òË›ò®dçoÊŽ}ôÕ«ï¿ùâ³õòï_^Ôâæ¢[<ùðü°Ož¢‡:ÌƒÔ ÷ °ìåOÏk^ ¬jÇf¸~öçëçlÓµ{6ö¼nê¿.…‰—+FàX†ÑS6vµXÿÂ~ûýº˜%^œgE‘éTöŸØWe³®9vœQ\c¼ëÚnÁ#N<_Š À¦†Çï‹aI FQ\3ŒW»–=¹Úqpøþ}d̪–ÙÃAØŠ~€Çk&¥ÌºÊ›²çÞ“…ˆ4FK†¾cÉŸØÉU1}Âη‹ØÏìãÙ¯j™—É•ÄïÛN®¸l`Ì\þBZ17ÚîU»ç°oÍZ ¢mÊšõ;^ÃÿU'ƒh¶Èëâ„°tæjlƒÌ™[p)öBԼ׳¡f…ld0&ë~=öÛŠ;Îå°ëÙÐ2p?6ðwÛ·ëg=8T‹6­Úý¶›Õ¢Cl`½Š¬¦saxE{™ÙÙÊãNjfÔ*09‘ay1Ù[$ò¢ ‚ yéKP±Y±‡vd÷ {_6ƒ\!l“èä™iÇá0*R©V»‚¥Ýr“Nb ziæÏTD/ÕÁXù<Àç:n9$Œ„¢&ø„F9>Ê2ˆ4ÒÇôÉs›£õB8!|¸B”$b™œ‰Nö…ìÉPi‘…F.áCLããŒDX©Dšä#Ú¸6ߟ¹v’S&Ö!ÒÜ8d— gþÍ>0¥¨ƒ¦Ü²çyìSv1ìŠT·[~úqðHÜý‚X !3¥hó/8SÏÙy{9{VA$4HY÷­Åø;^·¦ "å÷*ó–eä0 ›²d 2Äž÷=ÄMK¸ÃÎb*4iäÉõµxòÔQãÀ+×>ÇØ¶²”ˆ qx•÷2 8rÊa"u™qCf¾5ß”c­¦É¼.ùïÊ;Ñv–" —KŸ˜‰Ž)hToᡵ0dÈ,£3u<¸óTîî=K€Ägíœy´‘ˆÈ´Ø}éH¿ïÄaØ!À.µãà®îa¢`Å»fiÃ(œÙpƒÖ*/&½-º“U dЕ%òͳˆÖ1•* 挦¶ŽXëÞHÀ¬8U«·x[UcçYœŽ‘5Ök‹v££¯>œÅüpFP_ÄQ õôK#]_W’IÈØ÷l‡“Ÿ<ç14­©¬uãÃî4åþ½ó#³ä·¡\4žc„É º 3ˆ.^5nOâäˆðwÂò–v¼vHÓÛªÔU­j7®†V'uÄV¡Ú`—w†Â)3gt¤'HgösNétAçZ”s´ÀµEP-BTáe0<@4ç¦íÜGK­ª:ÀÎꎫ¦Yï(v㮣iÝEáFžO|`åêã(ÀË^ð~p—õà®jiÕtž6Ë jèC-úTÎàðwìDz®Tº^³“g)€ã“ÉÆ(Ïò#œåAüx¹ÿ©€\îÐX«ºjD–•6œf/ BßORju)KDfß%ØË»yÐèž8Pžˆl‰œ:@"”Ž"›o"Uz>—­ÇêÈs7¡F³t™t™dÙ½Wº˜ÓÃ÷{hÊ×F{aV¨Ó•Tu³l•ýxfÕÃZq‘æø÷ \Xy®§·,[V^Q˜{ l“Ÿ'±íóž³Ä÷»!‚ö=¯ïD¤ý÷å` 2·ujÕˆ·w*w!¢•f„ÇÝ3”ÓÔÙQ”¡–ú?ðmÙ­aVÝvcÀ{ŒZQ»ûvðAvÍv2e÷|X-·&ögº¨1F%’×z5Â[¬¼qª±úaeÉ–ÂC˜B›× ¥h¬8m{Ä´í ¡`÷¼z+6ÿÁ.“=)o­¨ô½| NÈ—Ç:JcùvÀ‚8›TùA‹)ó Óu>¡cÏ 2»ƒ wž9ö sN¾Â—ça¬ëSl®Ÿ5‹¯Ÿ»­ÍEÊ£â<‡pµ®ø Rºª´÷¼ÛŒ.gŠþÇß pŠ®Ú‰J†ö¥¡³tfè=l¿t™¥3›K÷ØˆíØ•$Š Zn¹` ð}«EdÌ{ƒcù<Ÿ|èÚõX +—ð†»gš¹c3”ÎSp²òеRÛÎà¸ÜRá`Öº44ÆSUm]ËjA[á<ˆ¥‡t‡Jµ•&ˆái¯aY ½¡Ü˜^B·œ4ÌËj§aí7±¶œÆ6m¾¾Ö¨Õ¥m¸a_ö·†ÜihÛ–õʲ1tþ®„š€ÿEãUÇËÏ»ÂËå]ªïϬQs]¸DÖˆ Ønyç<·µ u[®IÍnà á1B‚Üi‹é>XYð‹WÿpFQÅJèk»‹y貄(ŸÕFÜÂŒ A·jˆQ²Ókn-|ãЩe[»«u”ZÚ:g¶–1T`¸ƒŽ)—[¼Æ¦QŒ‹›‚Vaß@ÝÁwíŒ;×[œîQ®à޶­×ñÙú 19VlK¸åÎàa¢(߯,ʇʳإ÷˜M´²ã½X£‘õTá`=D´o&²îè¨ÂÇÝ„xç‘8bªxžWz.ßÀ¨¢ —ÙèG¥e,¸aÒWpÜĺtžWnØùŠˆz9éŸ%ÃÙL^Ê0Õ•_2Ñܵ·øÐ=ÐË"3Îc/(R?ˆ©Ù`R€†40ûÈ쪉N«¦Gݵ•:X •zCâJ ˆl±C:ùPµÈùRÑrZy~ºñÞãôtWa Óa;t%Âð%UÛ9æÑ ±g°›ÖôS*¬¨åvéTÍáá ˜—É*û…éí$‰úÞá©– nÂ}¹·ÖÖ—–YiGëš QÝNá3å«ÂÙ9k+‘ÈßUÜáLi‚8 ÈÝËWÖ~>µ!Ý@œš|ŽH76 Åx$¸Þ¬‹†’èÚŸçƒaÕT j|Õ:êÏâxƒƒ°qJ…¾z–·»òk²ªÔ…Þ{\b?zdº•¿nÝU@©8\³”ÃrCB˜%Eé—ã´#ƒ†ã!‘ðšjöÈF5¤mÎg&Žl+é>r¥1ýj!Â&Ô€8pÂ\^•EË^jM]tË•~ô«üÔÀ“!â÷‹÷W¾ðóì Ì–œæ­³KátÚ$ÙL$-Ô8ýy§ô£RGY¦¯uÕ‡btͧ¹ÊCXf}ºµA‚X lK7×;ôØûúÛË:hÝn'©" ?çr9©kñ{‡EíÅQt¨#”΢;œÙQ#¤?³ˆ9D½þÀÁi×" Ë~°·èV¶"Õ-™Bœ¢ CÛz»Ú‰æÖ¢˜¹IºCnÄÛ‘[ü»o,|WvBÞqXJƒ…¢Öu'ªƒR€GL^î1OÎÌ£î$Uz³¯!†þF~øg :úöFÊâ;üò‘Ne…¢Š.~ šL«±ëxãpuŒL¼ðåôÊRh/?@Em¡È}ADX3‡)­A~æL› ݤ@§ó·åu7-Q¢¥Bú²F!Qç ú¢I!2uYLßÍã8¼$µ¼¡~Ü>×kVéOZ;©1àéªVŸ ñý0>¶ø÷'û"{l¾Q¿7Ô½¢FõÇ Vã›yç!7'NgüUð×’o)iëU,QAÒ÷M°SßÔc;ö6Íöj6[ú•ü¦¼YCIM™M³òÛõÿƒÒ endstream endobj 138 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 139 0 R >> endobj 140 0 obj 3854 endobj 142 0 obj << /Length 143 0 R /Filter /FlateDecode >> stream xœÍZ{oÜ6ÿ?ag°i‘Ô³A ä±I|HœK¼iîPYËõªÕc-ic臿¡H‰¥Ýlp@ïÜÆKŽF3?g†3\ßÏrà¿sñD%ùì^Ñ (b¾"y>"öåHMB/D™` ‹²–ª¸åd¾ÌŠ™ƒÞÌ~ý ˜–ÈÁz˜9#áRÌõì#(÷|Ìü0Š"…•b†BÃ> ’]\æ½*[î½äüÏÑ›ˆ¡ÿˆt7{±˜]¼öqÐb¥]€P†ììû. 1£‘ø¡h‘£_O®ï³EYf§¿¡Åßgó…Zš|O8…ÿÜzÐàç:Ã'†wõtM….f’L=Xƒx”© UŸâA7ôZÉÏQ¢Œ—ííi-õW*ß½ ÀÃöC§ú‹M6ÚE¡ÛÁ‘KH X£€zn«»Y›YÜX=œ~|Tq´®"4Èñ=¿Z šgEà>æïgÌ—jÛOæøíùÛ·w¾lïÚí Å pB£!ÔË¢°Š‚@"½*R€‡"«„bRæ1‘Rà7 }™›ä1ð+ ).ìRŠG…ƒ†Ž$SïËš¤âC ÊÐPðÎ[ ×d–ðždÅí£.ö8Q—ÛÁ1 ‡ é†-ŸZ L0ƃµK°‚ FP„}FŒÔW²µ:Eêoè$ŒÁÞØ[aÃÚ"°ì!I#sìnãÀ/™­º µ‹ãuÄÑ)x9Á:ámjB|[~5¦ÿµž½(·Ua<­×ª@=}*šøkÂËo°êùC¹Í–zzk*Ió4‹+C¬8ôw½YpnÌšr°+i ëhh#7@ÞCq™dÕ×Z–^¾¤Å²÷ .tÁP`AÅÞu±½tI.²7 Ê¿ÈE„NÈ©ûHæcŒñ³£Ù’ÐG¢Gó2!©WwÛœM7O‹nÔh´†cˆ©T_÷"úW„¶ZÖÃ:MÖâVe–•¢ŽWY0w3áf7§¸›ÂOtc¾µ8äÖû.Èã\xUA .Ç9¯ë¸mÑÚé-o8/ÔL£[CàôaL\H1wÁËRô‚[~^ç­ZØŸ¦Úò;D£`Ÿ<GW߯ˆ'ÏAˆVqVï†äúÓ’&üÛ-ž.•˜˜;*ç›mµ)k¾ÚfPv÷Ôj[Ôz¦ŽiƒÒ¬cCFžÞ­é*N3“•Wëù øk]æÝP—%@H™9VéD.WÐêå†ÕYœ ¥ÁÐpBø†Ã/9¾#Q,SÑCÆ™&‚L…rZA+óökRŸdäTd/-2‹!´ô|wb>ô<¢A‡D8Æ{ùZÈ R(:™ÿóòzq½ÇÇ)f‘ãð¬ QŒ´¬CƒfÀ¼«âD8ަÈP“z›$i‘@'¬I¥?ÉãA ŽŸÆû!@=Ä*…A‘ßm³+ó©Ê9å,]é±Ò)'˲86øº#i,¼Þn6ee°v>Tk’ΨS²Gvg 'Ä$T ÄØj‡Á È7w˜ù zq7Lƒ Q]"oñ\FR§F;î²´š–I²­«æÅøZͱ´ÄNwœªÍwgm ]ÖPÚ€¥Ò<ç˳ì w+d ïaßá2íÔÿ^×oý#݈óKx¢,fÔOq·§}q½ûÄuÀ°ÁðÆ¢\A“k¤ªÄ¥\¹m6Û¦¿ñGÇ‹0aâ¢Ú’±èUU滋`w¨x6mü.R_¯´E,ÀšqQŠ,‹6U 1™ãnH\ˆx×aâ[ƒÝ7$`XI¦®¸6H²R7µ÷`~@û/ø‰7Ô¡IÃFbTØ8pÀD Ž˜ScþpT3RB‡ZL@š®î#LFQºZhÌù¶ì®'Åk…’2¸ál“½+°C®EF‘$Û&{nE °åû"Û*K—òÈèg9lDþßÅCE#è¸(‰þ=B8úÕeλˆÂxOöð sñö?Š\Ÿé`àɺDG×pî¶é¼?!Û/øåù§Ëç/ÞͯŸ¡?aôàë endstream endobj 141 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 142 0 R >> endobj 143 0 obj 2817 endobj 145 0 obj << /Type /Action /S /GoTo /D [141 0 R /XYZ 72.0 311.964 null] >> endobj 146 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.38 550.592 250.33 559.592 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 145 0 R /H /I >> endobj 148 0 obj << /Length 149 0 R /Filter /FlateDecode >> stream xœÍZKsä6¾ûW¨ú²ö”-ëýp©$;ÙLj*;‰]µµ•ÎAV³ÝÚ¨¥Imÿ}@!‰rö”Ý<Êø @¤þ|á;ü{#ÿ¤yà”Ç‹ÏÄó4p„Xqâø©›x™stdqæÔrà„”Cˆ —F#88ÿºh.<ç¿þƒvŽçÆÎË…·Žbî/~†ÅãÄ “,ÏsÒ5pý,“K„nDytn?çï­­µ—‚¼ÿ¹ö\£Ðþ4òœ§‹o.n¿ßsö&ü tÓüœ$‘“¹aËçáèüzyÿ¹~hÛúê7çáÇ‹÷dΓÁÀ©«"hò ޼é]#ßpáÿÈ ‘7ˆÁù¨¦ ¥¿ò&cå ü»êÅ&Ï·Gyê¯\|}'Ò8n6Ù?c¾ŸÕ_ì²Å.ʵ×ñ±ôC{ûs]¿:Wê8'ÎeÑZ|)ާZÆKUוuÑU{6w8°±»j¿hJÆ{ËÍÊŒêx»ª«lÇ¢Ùqõv+³aêÀV:ËÕ]Ãø°7ôk{fB^O\‡7—9-ðf^ÃeáØë5%‰ ¸??öC5œ‡ªmˆe,‘hƒ«Ü~Ÿ/Î~º¾‹ÅO‹¥ïúÛá±¾ŠÇZÜj‹Bÿ ›kRÂØq×[µ…6]¦˜à/= ê¢ø&2‰ ¯††žçùYˆjmõÞ†‰ëƒœÁÐ:ì5âY9šà£0t?´`B†–Ñ6P ‰Ð{G¸eô¡’B_¯Ù"ÅôRQå¢ CÞ’ܱ½ºæË+jžÎÝ©í£Ý¯ŒìYÄ-|E3_³c•BzÓŠ#NCúØîè„Ó3\AÙ6ƒh6Õ³ ÕþFdüx{yݾ펆U²Ÿ&½£«a{us³²ôS[ÔliQ5O|dÁô*öW b¾[øRÖ@_rõ¤+ßÍõyAú¥=×»‰/¢<«ã•Ezt M¬†ƒuÜzúàºò²Øó’Ô_êz÷Õz΂7&nÆ¥)tÜ‘ñÀõº+#G\ïô'QVj[èQÃÌT;B8ˆÆêÒC5,v&ÉfJ¿ÿéáý/*µ{& m6ÕpÍ¡ËöT‰žI9þМäà ° ¯'ošq–º†lÄ Ójr=z,›°¹Ô¢xæªëk¥5ÖûX¸6óf®…é„#ðWU2ª8wýP^=a¾”QœN¢ÙÁq\Ißó¡á€9^â/ç;à4Œ–µå}¸“ÕõG®¯Ÿ†®œâ…^lY_{ ûTtõëöÊŠ© œ*z§Ú+ÿŠóŸs?8xoBT«W„ê2™•h¾—ºq$/ïŒîë÷Çs] 2mýÔ67 â:X¤zdçuå=e~fà½8GQÿÆÈ(,/K,õtg¨Å0ŒUçP¢à• ,ËUF×úuÝËñ¥k£Ü"äÚ¨A%‚÷*?Šé½3#£è ]íÍÖx‘Q>¢S×–¢ïé!)Üm?4`_Õlêö²r…ËLiÚÅ!ó£pf:ØM]5xèy-ÇÓÐ_Žèº¶»9ÀК”C¾¾Ýíľ8×”¬sÓ#½/ªúæ|‚SÒ¸ô¡t·W®aü(ÃyD*—S ››_îÀ¬ gÑâä,DMqdÈR‘ûq<󉯓¬ˆ é?×À‡–;ˆ8]ò©m™„—âÕtÑ}AÃÈáˆXLÒcªcíZ>»"R‰ ª=ËsÄÕl˜6èÿª|Ãþªás—îLÒ™;åæÈ=q{!åÜé¤s 9*…nt9}1:t³õÑŸª“ŒZ©qࡾìªÓ0^ ,Çn¦SðŸ¯ê§¬ ° —…›(UU ·¶4rž_ËCq’!”¦ žCí0eoûvÏÏárêž0›gó §ÝO<èÄ¢ —ýŽ6箃^K’³Sšµéì ˆÜÀ‡æ-¢éìÁ̶¦þ JÜ4…uam³¥÷òr?BÁ2÷TYf|ƒQ–çÓbŽ:· ¢Òh¨ŒFør¨Êƒ»kDMˤ<Š' Ušˆå/¡Ív»¹fðn‚Þ1Ú-Scs»±™g3³1$p éìŽ4%,Ú“®áa!L€ù \,|u¬Çët€ˆœ‹àP±¹ªÂ½¶™ÌÔ¬ºú]7E‰ìëúÁ ÞZÁÞ5 ªŒÊù…€öKoxz @c“xóÕÆ€¶[›V،̂™‘uÑüNWGÀò>¡Í]@¶žT+\½¸^kî-†5¾"Sè‘ͤžcg8ÅSQ5ý0YÉfgY3´B‰zÏV Åc¡^ ƒz®Ä¼!Cšõc {™‡à©I¨ÚZ«ja˜Vu±(×ÎþúGZzó„C¯Z”;àXfjc’ëëú9“ÇÏ•x™>†²Yðmã2Dá€@ïñ¸îq2ÓDâÕ‚8ò"7ʼ‡/qDóDÕ.bØ ›oÂy~CÏV´Å±œŠ³E QAa¡`IË+°ÕÉ6F]v#]ad(Ò<Äø²óV)ÞW¸ÿ¥>6{¡M˜Ú ktª\,ù}Òÿ:°äþeñœ(—'CˆŠŒ„éCõÝj9»œó &tù1Öd:Bì'´·_oøø–ºÂ­³Ê2^sHKìâˆ÷MÍG`½%ÎbbìE3õBjzÌ;x…t)¤€ìßÝ}øé#ÁNÈW>gŠÑ·GH×87šJZ·° œ{ù;†¾aƒŸ¬Ùð(êöe q˜¹~–z¾Ÿêò2Râ¼ut¢\¥ ù#s¦n6ý¢£›; ÛZ…EŠÔð5¼ýuUêá$:EÁ€.h-µ··8öf&•& §F&éO™ lîT$ xÐ7nª“âDÌù­‡ªÔ€ZU>Ò¦yÌ4gumæ©ÃÑòe˜ê×Ëä#À‘¦¢ÁKÑÙ·lVaFbšC¿ÇXÄ!·L§-”/7Û+ª†m&¦ÑÌD¨XŸ«öÜC)«Ê¨^µ/-Ÿ'®ùž®¢7´ߊîåpùdwî('ÉgÎåÇ¢y:O‚±ÊIšBžNšˆôyŸŒgœõïàa–¸™—y~˜ß}½Z„yöÖÌ W¯e`ÌÑ6Õ?Ù ÛÄËfÂ'G3÷d$ÓÑD€GiZÁ§†æI9潪ÇÎ"¡Í»kT.Qg„ÀÞ™'73ª½¶&,Ò&Òçž?_üœç¢«äozëì²mä+¡¶Q‘¶|¾‡„Î]kšæÅfE̬ߟ²‹]ÿù<‡¢Òób‹Œw˜X#üä¸þA4OÝ< ä—‹À"Åh¡Âó¶JÄyž†þŸ(õr€vq½X†Ô™øÐŸQhä]¾1䀣K?(†s‡E5r¶—ý¿yìÙ±(»¶_1ý|Ú¶ïEr#£h¦&ÎŒBy,{QË/@*à#_HPu‚>#CÞ7·êÔ–ÝõöjʑVå ’Fb'°3ÃÑmó,šŠ~"I±­R4þªÀH©§?úýì—Ò| endstream endobj 147 0 obj [ 146 0 R ] endobj 144 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 147 0 R /Contents 148 0 R >> endobj 149 0 obj 3240 endobj 151 0 obj << /Type /Annot /Subtype /Link /Rect [ 523.021 332.476 540.0 341.476 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 81 0 R /H /I >> endobj 153 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 320.476 180.037 329.476 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 81 0 R /H /I >> endobj 154 0 obj << /Length 155 0 R /Filter /FlateDecode >> stream xœÍkܶñûý Â(¸ãIÔ-ÔN.q4‰ïРÈ…n—{«X+­õ¸õýñrF$õØõ¥Ò&N<3$çEÎp†Ú>óàß+õW’ ¶Ú]| šÏÁ‚˜HQÌü„Ç^ÊvŒ4JY©&Ž@5…À@Si6"[öÓEuᱯ.~þ&­™Ç#v¸ðfÌ‘ÍíÅ <Šy§Y–‘®‚ûiªD<`µc×ow‚}QëÙƒöŠ‘÷?×ÞÕ(ðÅÿF{¼x}wq}1ßcw{|ð$?ÇqÈRˆLý#ØÝŽýüòöCyW×å«_ØÝ7_Þ‘i¸N®OÐh ½ñˆsº ÝRá¿H Ø †JÚPú[ `¤„Ÿt±rO·G{ê~z'’(<m@:¾ª?Øe³]T²ÀÓ,ôýT©¢€5ÂK`žˆ…²©‘lkÃ8 °F( ´€¨Ix§S‹„]/ ÌÏ^l(]Œ œ`Viû Ca…8|!Ið\Ig$hŽ §…€ žÆåƒÜæOEݰW¿ìå!o ZmëVV„<ÈUÞ·’°n+›Î TÖݰ¶Þpûã·mŠRšá¾s9á¹i)¼‰šÝ6Wk®RHEì復×ýJZ‚lšºi-~Ø«­EWye‘g]ñXÕ\ÿÅí9g꺮>s‡òÊÁºzÁˆ@ð ð<ÏO4¥Á*8™£4¢d""¹ÀíA¤b­”Ü o ÔÈ¢“MÞɬ«£¯-\–Ö8¬-ÚãÂpbœsRÁ“Áéß“$ÄêM'íX»­ûr}ÿÊôm^=J»òáhÀÛ½\yið7õnB–tUÀHצ×çlðá 8ð±îwDùqÕOÒÛ­ÔŽ"´n–9Áɶ†!:¸Å¿¯ÊãH‹¼¯êÂ=q:±ç°•*’(ÐC¢ÄbÜ©½hóIà]:õY_ßÀm…Dz”g‘Wyˆ¾’]WTì­ã’›¾ ®ò²èŽìPt[-ñFIXÏr$}ò(Š ¶“˜jƒz§ÏªÇCðïª)öA×òI–õ^b hÒ.?waØ®Ú «¼•vÉ2bà+Ë™FêEÎÚ6£à‡ÒÀCVC sÇ‚Œ¼lëeT}ÖºV žl½ªXã‰ë†¨Sç)IUÜ艰ü˜ïö¥¼4Ò ô#¤ͪ ¸¶à Ìà Ü :Õ‡ßH10z aå-«‹£çïV«¬ ìºp¤éÕÜa:ñ_YT:NƒP-„{e·×·îíM‚¼î©êÎ]«vnm ˜ †™ÕÕ$›àÀ®^ËûWÜÞ:«T굘:Ñ—Õ;³¤ÈãHå!Dp3Q»qÿ²Õ‰w°Î—W®ÕýNVÝÜ¡pfÇ…M¢ ¹d*öÅ^2Pb§²RQµÌ×—¬,ÞKSŽz\Õ}‰ª³DDau!”~ªH¡¬ CÏ‹Y˜€4îZ*¯|(xÔ¸‡ãCå°Psx”lÌÓÔW<òü,ö§e–‘!²™ "«Æ%}²ˆÇaô‚?"<_!ªWgbÄDÎH';°ch‘;Uyd¦‘KxŽ‹`~‘+•Hƒ:SÙƒ6î†M÷gªÝ'•™z‡HSç˜9céôzÊ`IàgYÓíúkþ”³«_ó†ýék¸à¾xý¯¯¿ÿîËë²x¸†€êà¨s5Ø7e±fÕ7î>ï¶>Wáö9»îvûkHX|Ûí ´ÿüÏþ™ËQ(f2áyI¡ôºyF ˆ0âI¢êe(LðT0Š5Ià¤a›n½ÃH{„?ã(¨ù‘˜É Òød.é' *g¨ôÊ㥥RûCX{„"nçàä Kq9Êê©hêJUyiÉO ]þ`aMûF%€“b 6íºB:‚°U ßu†Cº¶† Âè,gl»pœÓhâ£áhÙ¾¨•4“0Š&¾ùÇw­$wЛZfr0‘芰V=mlŽ%wàu±ÙÀùÂç'¢9Gt .Çá]ƒÐwo\;¨+3²\#×õJWþèÎ%ÖcÃ'¾ #Ÿ{B½#xÙ‚[Ï-„„C ÄñÂÂwoæ›–%“Iê!BI€‚ü­M!­0ú­ìúý„›ïtòY,Äc»x¶.å^ÀmÅg×µR¿œ\ZJ·­ûÇ­‹cäz(0#F·"ŽÃÊÁÛn]8öá)5CøöJø=m61ú ²öz¤E3ô§Hù¡©áêƒþ<9ÛƒÐË&&«×K¼Œó®HðdziÔû8?…­Ÿs„îRmìÉ[ ‰Ï­¶â·9µÉ€µz(éF”ªkêÒÑýI6s#)úm’`ʉ–ÐïŸa¸HrO‚ÝßAë,›“†"8·ÚÙ|Åùô6(mÔç¼ \à÷ƒzïø©QOÍ'U ýà *|{Lçžì[så»ML/zØ®¶kúUGß|Ͻ¹£$ë5ºÇL@Cϸ F~ªñÿÜz«Àêšœ¸†[Úîc'ÑðyÜâ}‡ íh‘6|!£©ü¬~†ÑA]ôÇÔñ Z*æTª;³Ü*àì’£}þ^NŸía‹ƒi¡†œÒ®òP5¼ê¡h¶îq ®* a ‹hzNpÀÕõ–§ ‹Ÿ#¾€ŽÔWª'þ’|sN.ÙA2}¨ôŸï÷å‘™,dŠ0¨uÔkÛ%+eþ¤FôÙ€ôPPñíá×[ì ›G,Ƨ½]‡ÜOáíW€J}XRlïäÇNùæë»ï¾eï$Ô›];ð~\®ÎÃÌþ6TçØ©ø‚êêÕp7e4œ?ÐåEø.?”<4Á7tùª²9ÜmãùCé‚0ßøãeEÈ:ïò‡¼u|èeSPK¤bû6Í][Ñy.‡ýæP0õ²œû"OLܨ2Fnî›IõŒø&_e1TÏ4§§—íØ–}7r]4N‰‚ÔNJ.¬ªûn,4ºÏ[5Ê-å5:‘Â…-v#ýdÞt;E}0”ûÎÀÖA^Üß×/FjÍýé‡\1®×Gê½Ä è£ßÅø["ýd’0?ÅAŸCAœ¥Q@|¯;û~â§ðÿ®d’|ÈTÐ; Obó³ˆHðfÄ<ÁÃã’CÂ+‡KÉÆ\OþâÀ0‡«|ÊœHㇴ%E Œ“ØQ$ y6"Hý5_ÃëFźú0xHêWS¿É5Ho»ªêÃGÕ5\©z»)Ö9>˜¡¤²z£ÞM¤®5qSÊ…3iãʺԛX§>‡³7··¬íŽ¥b§RÖß²áe‚µý˜Òõ* š7«Dýle|­A$ëf1õ²x¸öë•\÷—>9S€òœº/ŽŒ®H_p;À% ¾$³9W^ 艼2¿Ÿ‘ú>Ÿý0`aÖk|ñÍÛÒ倫ׯc·¥¤­(C‹©`zKñõÏ^ L¿oðõÓ•E:°‚ÈÛÍ ¿dðíeB÷'þpª Ÿz.ÞJ¡Ó¨aõj–[[Tc?ÀÃ×O¢/8 eì¤Öü’äÊOõÏ…Ì—n"œ,ÿ2â¡åš3†kD«‚b›þôûAÄ=‘AghΈ[UÁïÁ·õå‰YÃ&#¶oê8ëGgœv ±ÎáIw,"ê¸VP–¶.gjµ4F•jÓo6ÅG‹×Ž /ôóý gÐ~îR¿ü¡çC^ endstream endobj 152 0 obj [ 151 0 R 153 0 R ] endobj 150 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 152 0 R /Contents 154 0 R >> endobj 155 0 obj 3301 endobj 101 0 obj << /Type /Action /S /GoTo /D [156 0 R /XYZ 72.0 429.342 null] >> endobj 157 0 obj << /Type /Action /S /GoTo /D [150 0 R /XYZ 72.0 409.702 null] >> endobj 158 0 obj << /Type /Annot /Subtype /Link /Rect [ 496.587 640.614 540.001 649.614 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 157 0 R /H /I >> endobj 160 0 obj << /Type /Annot /Subtype /Link /Rect [ 142.0 628.614 183.523 637.614 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 157 0 R /H /I >> endobj 162 0 obj << /Type /Annot /Subtype /Link /Rect [ 245.178 628.614 314.874 637.614 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 161 0 R /H /I >> endobj 163 0 obj << /URI (http://hsqldb.org/doc/2.0/guide/index.html) /S /URI >> endobj 164 0 obj << /Type /Annot /Subtype /Link /Rect [ 142.0 511.728 238.128 520.728 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 163 0 R /H /I >> endobj 165 0 obj << /Type /Annot /Subtype /Link /Rect [ 247.41 511.728 417.15 520.728 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 163 0 R /H /I >> endobj 166 0 obj << /Length 167 0 R /Filter /FlateDecode >> stream xœÍk·ñûýŠ… *ííûQ (?’ Çñ‘¹ àI¼Óúö!/WwV‹þ÷9ÇvW²ý%­óðÌ,9‡ó¢>œ…^ÿ,å_yy«æìÑB/¼8#RšyaîgAá5!EZxµxÊ!ÆŠJ£Ùx¿µg÷ÃÙïÀ µø©÷xL˜#›Ë³_añ4óã¬(Ë’dü°(䱟°j¼ó‹&òžwj´–^2 þçÒ»Åaô QàÝ}uvþ2õÂÀ»ºµ&F±Ÿg ç,K¼Â£Rþ‰¼«Æûýéå‡úªëêoþð®~:{qE[ÃyÒx"ø7÷•|H“àð‹c]†n©ð_âÇHŠ¥°ù©¦¥¿å ¦JAø÷Q…+gòøx”¦þÌÅŸDÅ/ LÝÕŸ¬²É)ʵo&˜ØÒÅà}ã¥pôOŦÛÕkÝp õœ­ÙMÍæS7l4\w+V×{²vm§5ÝÀë½™ÖµvÜÐih'x/4ò¸1ô~×jpÛww=k̨aÃŒÐ-çfÅjð5ø‹™üîõÅßvfe¸Xˆ3QÕ{"ü0 €Y–M™iQ@æŽEhH »wd»žk˜T¬àÊB† ÉÀWƒÕÃmß5v…®Ý7ÝÎŒFS˜(8Žü8ñÃ"6 æBx×Oëêž{ó^¿¼\x/¯Þx]ï]²æ†]ãOø¤‰Ÿç°÷¢‘Ï?º,‡~ Ûg­Y-:ƒlwƒ‡ 7ðmW×Ý#ê)Ýv¨º–Õ† ø0ÀaU;XÆÌ@»¾®ÖvÖÀÚ1ßàW΢ÄÑàU]/¬·v;Ý®Üù„—ŠVÞn̉ŽÓ‘jªE0¶HZSœkd°Ô0˜ÏŒ¼ÂkEÒ\îöÚ ê¦ ˆêF˜b™Áé²/ìuF„J·­' N^ ÖðùÕ™˜ˆ¡ÎíÈ'ÚõÓïôÀîvfßQ:Úw_Ým”ÉD¥Ê–ºÇ…Åèö"BÞÞlH"†÷Îx´vÍÖ™·éÚ®'#Q2’é’××ïõ1MqÄCÇOÅ9Â7¼µ˜ !D¨;¶3ê‰Ç~Žc´ØòUu[Øàê¤$β®Z>—s„)øš aøòZ÷à‘ænädä%TŒ4anÁóïŸ!„l^ÕLÐÈLÇG³›H¥6 „X >±eÒ'bÂç§©ˆ —Ò&­Kª;EÍ™]äáhUû¹¿Š p˜ý:šó¤æ<ñX Ò£P ›SØr7“ÂN×X.]­Î¤ÀQ/ç—d¦ó}ï9¿e»ô-³¡cRÄqæ—”‡qÏpéú;#>ÔëÿýúfåËÃz~Z®$¨€8'×ÔžJPD2¤8bèwbܤ™³½zu)mÒéÜɽç{ÅÅRF¨t_Û2UÚ¦¼Áënµ“¾o6Ò0®Ðº‡ÍDNÌ f¦½ªÀû·X ÜÒvP÷a~òT;QhçÇ=DË__ÉiIîgP dˆØ»j=ff»¤!¤Å„Ÿ9™£–_4«„ Ü€2<1ë÷Iš”úIhj¿Ãi›aØþõüœlÌ÷Nï<òƒó;¹Ùóª]óþfhê×8Iý0»Ë Ó?&c ?݆p½!;±£n´[GŒŠyÂTýBðl…ÅáAG—ÁíÛ¼5 ÚÂpôè^i” ëwĘ ˜]nw7uµª÷Ë•LFTœÐŸ‰žÐ.Bì”—àõíRTw­Ã@ÑVìëC–s þ–×l&Ý•ˆƒ Èë+<•…Üp¯ç¢«`©žH'¨”q¬;…¹Ÿ@Ê^¦yޝ9(ò«C6LyÜDwàì–i£ÔUŒ(ˆÃ5V‘@aoŸ‘v·q§®ŸNn±’Sð_4°…‹ôØõëÉ:¿ëk_Ã×XÊ*ÏlTË5±ÉYö[Öƒ ïÅT=Y:RòS…êv7Ûa¯tQsVP8•³…y(¨c¿Æ£U(Z.~!µ)DþíàÌ~ûLC”}*Xev :îŒJ0ˆ˜:<ÓM~õã/?¿8o4€[ðûÕqOT§ø˜½ýÆçTÁÖf“Ì|gÓ„8ÏGŒ!þ ŠFp  µÿJ¹gHÊ!aíÞ[suáÑA³aê¥_BâXFaév¼—q(CØò&D ¬,êÔÊHѬÛ9#¤Ñ±gîu"Ú3šöF]¤©~ Á­rÑûÌ]vmmH„Rίà'Ë'¹~ú^W;ÈÄ‚›ývÃ[rA´ü¸exIŽ4)ïáºk¿<•œØÞ“žP™Ê´ž-Õ-î«­Š+¸ìƒخ" )„ýfkâË‹«³À/aÝ\¾ä•9TÀ`æ2Ò¨®qáÇP ™—¨>z°‹Û³ð"Nå~ß/Êá€TK’Ë£öyš÷EßFÏŒ´Fáéh CÒ¿˜,nÆ&Ÿ²›ªå‰ÁXŸ/dÍ,Ö9É~h<Ü‘;Tjd"‘KøÃ0¥%ìªDÒâŒ×ÖÒ¸6>Ÿ±tŸf¬"•c^„KoœË$qê—²û ÛœÎ[¾g½÷Õ`ðÏ¿ÿ§ò«uuc|«ü¸|ó~Ûµü¨—Þ˜x@—S2~­30OœëL6 éù‡]ED"龡‡þ†ˆØÛ2Xï u>¥´†0Ûk×´|ÖÜe…Å)!kÈÞAˆ]%6U9±¥”Ñ]…ÞIEÕ¹céÏ¡öÀ Ð oló-C¨·b*v5B¡þÅÕ=wN 4EMˆI2„CÄ·aàKåüê65zÇfž” òA‘æ3ä”jªÀ"™*°ÕÏ82f*ùº›‡ªÛ ¨Ì´Ë—Í{™„ßð[i2ëNš˜ ÍÔ'õ Mºÿ’Š! ?Éâ ŒH’wªÝ@áw;íPa!ü‰ú ä/yQDÿŒC‡ÖXõKTdE06d¨Šv[ƒ©‹Gãå€DåcêáÐCun‹éØélÍ¥m±ìqÁPÐTôå²R¿=ž¯Eå)F€ƒBÐlT×D1uœ H6çÂÕçl&I³ÙML–†£AŸÜgRÌÌ’VžL6·<(÷d• ˜¹s–‚Ë[LÛ› bf•¨>ñù«wš5¯¹ìöâ³[¢U³<õÓ–8ƒ@V@.ÕíÌ6ÀžÈdzSSõ®Úõ§dHfA^e:'‚8Õ²ÊSGj™vfÐãiÙHæki¿áaHØ™¢s27åèîà ‚Já“ûT¢Ï¹hÑIZkx…y ,ìó^á<Øê¡Jú£~F” ÓjðN¶* ¦]ØZQÁ*ýž‚lЬ«æm{¾âêÅ‹‹ª]K—ùÁµ}l)K©lúÁˆwßÊN…|â„ÀPwݽ*Ì̽rJf ¢†g~£TB’V€K ý Xµ+õ¬J6yQ…ÆÐB燡É9°Ð¢­qÎÔi„ö× ³ÖÉ_ªA˜‡3òÈ–Æ·Êœ°Ž“´[Võ à+°ÁZMÁk»—®±ûø8ôL#2Äj˜žÅm}:£µª²ÝGØä}<ð² ILö* c7y„Ð]Ä© ?É ¥2qÜ­àÙd;:Žf&ÛÕÑ#L%ø¡X“óÌC_>|–e’ÎpþŒã cÉâj3Ð÷£/ÄŠm]â‹Ý8âµYq¾Ö9ùÌh“Æá\¶º5›…¥Ñë aONDY½—Äs*hö¯¥šýõõvqZšâôdjKòç'‡¶ÔÁå;mL_ZýêÎ<‰ËîÎVöb¨ÑVÆ4é[˜'ŒB0]ï®÷n$HÀUGògú}åT„Íç&H7§:<ïÞ¾Òb™ w¯Òc¨h`cÔGÐv1äoÿ ç«”¼ endstream endobj 159 0 obj [ 158 0 R 160 0 R 162 0 R 164 0 R 165 0 R ] endobj 156 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 159 0 R /Contents 166 0 R >> endobj 167 0 obj 3768 endobj 169 0 obj << /Type /Action /S /GoTo /D [150 0 R /XYZ 72.0 282.976 null] >> endobj 170 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 624.207 211.984 633.207 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 169 0 R /H /I >> endobj 172 0 obj << /Length 173 0 R /Filter /FlateDecode >> stream xœÍZK“ä¶ ¾Ï¯P:‡ÌVÍhô~Ì\ÞÄk;åÄeïT%.·ênö´²j©-©§wþ}@$AI½N.NöQƒ|€A¤æ×›Ð àï½ü‘—‘·=ÞüJ¼ÐË#/Έ•f^˜ûYPxG@‘^#;:¤ìBd¬¸ÔÁÁûÇM{x_ßüü tÚyŸz—›`69Nóáæžf~œeYÒZ#?, )"ö3 ¶GïáÛcäý¥S½õêåDÁÿ|õ|Eqý¬(ðžoÞ=Ý<¼O½0ðžöÖÂ(öó ìœe‰WøqTÊ?‘÷tô~¾ýðkóÔuÍ›_¼§¿Þ|õDªá8é<üË}åANCšn ó.÷\øŸø1ò€ãG)è ›ÚPú)4™*áÏ«¡©Øàéö(KýžÂ¯ïDÇ/œ ˆ"f{ש~g“ÍvQʆ_”I’(¢8½þù& rèeJr¯ÞÆ&Y ˜©8Wë ;!\_˜Ùñ‘™£›óèEAfȵЏ"ÁŒRú› #+„Í«…$!à’># Gˆd*\w‹ñô\^êv×]î¼7^^ø‰w[µ;CŸaèñ`é@oбÆæÕÀ}g›Ök;Ù¶;aòÁ7œ§C=p©ìßÚAU‹^ëè%z±W JSˆ·cgIµj¤wÕXYPoǺk«þÕ°.‡º±½/}=Öí³Á~øÎÐZ•;Û»Ýy\XkùqAXĸÖCõ"ç…EÛ¾k2B„ÛÆ„!Ž ;E‰Ÿ{·M=ŒÀ6êvÛœwÂvíZµ-ÐH£Ä‡÷Ù<‚'~°Ü¼œ-C ƒhǺjôðyHKž—ef³áFú‡“ØÂ,ÿ™Y9›³U±õ7>S¢gZä37/#¿ÈÒ²Ìãp¶ŒÑ±YÅhíÕˆÀ÷÷çæ7=Û<8ìŽ<ðªí†Ýç¡_z·¯ÝÙðn hc m^-ÝŸÛ]‘Zs1Ý8ö£8†€ð9]ÊzýÅU›…Iz}à\ò|ë8¯)Œ‰ÊùxßN°¾ýib;‹0tŸªã©wœ#¶çQXžI=¸ï޼ï(úVmØbg8ꛣ¡zÎŽõ³].BWúq„52 üL DZG ÃP1 Iµ–õßìŽv–A:Þ¾ÞÚ¡ÝÞÎrƒíªøŠHôugV±3œúx»º…ŠÈÛˆSMÐî¸ä™QÊØ5Ê×¢£P…a`Ì'غÞß<ýí;~§®§G+Œ ?(¥‡ÅÑL”;TúeAn}uÐ T20X|:5U݆qè.†Ö;WêüH샥Wëu·2Ș [¶e0A±»e®¬g4¦Ò£•æé#„r= 3âPB(Eß)wC(n« úAЍ±&}ÖËYuùY&7"„­×¸%Šäs#­hm‰AáÖ2vJt„ÚŽ)qéúQLAÀ£rN}÷ÜWÇášEzQ1©:Æ FXRÕ³öº=GßbŠuæµ ìUTNŒP·/ÝGáµ]{σŠTz‚lËç-Zƒ;O¦Mi r£û¦nÅbןI!oòŽœÅÎ}M.? Ðv*ú–óYÉÈ¿P¶Ïgþ-¹>ÒŠæÛ†œ]ÝÃ)n^ï,«YsÇWNþ‚Ò«£»“ _Ä^‡Q>ˆ†Ùh ÞS39œVgYKyéê…߸×aÞ2·ÝnbÃ,ؤV .TµL{†¹„xïĶÂ8E •>ˆ–«½³Š“B—Þ1Þ¥nv[8ÁƒQ¢èC è€xÇ Â2 åeôá=Ü« ÇaYäûôÙ2LqÖ¯vàyïÎ{y'y𾺮ƒk†[1ÊKš*âétæ’D®±ü/¦[8JêÖì—pû,ƒ’‚ËãÓü˜& ݾýû=0ïÑœf†Œ ¸sBR-!ÓÄ›¥‰gݾ“5®L2Ûs߃C@¨‚ð$¼Rò…Ôu£t©8„Í€‹_¡-óxX:ëõ²·ô6(MžFÚfÄd[ß0Þ«ä´¨T`;©«|D‡ÊÊÛÑÚ90†ÚqëÛóÔ¼J‡(ruPÁ# lŽFúX}2ôCãF´Ïãaýænq$§!E­ÌòLpJ¬…æ3Ò,o—Ô‰WC<:1—¯9íù¸Q¥¬f¬oÿ¸~ó–1ÜþU3t â5ÒÊ•Æpõ>œÜj’ „¢q®Å¦Ú~¼zü’(„‹? MŠr>” Ç,¥Áà(]qX-Y6É܉[ñ\Ñ-ä>„ë/™’R‚â<Š›B1ti¨ŠÜlÙíÄÎ ÌeHìë8ˆå•ÖÊÕÅ’<«…”6i1qûƒÀ|ì‡&Â+ZÔt×AEÞÑLpФÅ)šy™ÂõN¾fÀÈNC)Z’*ÊìVW§ac¸4È–4Ì'Á cÚåë¡?wbØöõFF ÕìúF™„œÆÄ:$!‹ÑtÞ›Ît6&·ï¸R $KZ“pÅßúîsöÖ‡ ©è©CƯ¶0ð^s@-±½µí†‚Ù[4›‚੯ õ±n*Ûˆ;”ÛGLSRnV7K8J³rrpщ  UÉöª!Τ6vá†WMlSh#Æ fˆé$Û®é Ÿwº¨™—ž“Àð%–¢‰)q÷‰Eâz¯)ª´$ùL¯!©µ_š¸ç ùÌ] Ž2¿ à†“Ù|UÃÃ?~z¸Eã¬øÌè;».¼³IúÒ³,¨àMlH–^-”­ÂIØΛa¬Ç3= Ü—‘z®`4)bl×ý•®ª¾1ÿ[Î`­5›„öÞ‘Å¥¨]¹ºJÝxZFÝÇ*0—ø4ôù‰Â”íÈt*|R+}¶'ˆÌ® dû¢{ ¦öG.§îÌ‘[Òæh×É$ba”I˜A·ÎCÌ2\‚õoÝv§×Åiºóx­M̳μ—vŽÄúåmÅùŠœ;ƒþulç¦þ¸èØé$z½Ôª å>£K!w=¤)/¾y!{T´m!MÆD¸±œÌˆ*6âùŒ±øtêÅ0à¦ÓbÚ¡ž]ƒ•jÙ$PÖ/äטÌÞw‘# dÑÕãÉ7© ‚$Ïæ"6ÍY<`SúÅož•ÊÇ"HKùž1ŸÎ®‡jEã£[,º=u<°Eñx¬:„+Ð/Ö[I> |x‘ñL=®¤¾«…T W¥eQäúbÆÞ÷?z÷‘ú†Z8ù£rõäY¢sdιËìÓ~æ\Ù2ç8fæµÔ¾ÅÚ#•™åúJ>‹½z\iAªÚ»¥•ËäÎÊñM–öhtê†ZWáÄâÕrØ%úu‘àŸg#HÝ;ÆÒŽMp±ò}Ÿ±ºé× ¥ deW4Â=Üt¬ UUde(窡F!õÒXkp¶Ûxé í\H”`ß`ŒÆA‹‰<‹‰VüÝ8SG–lH6"&-¶"ÇÈ"k ¨mšæ8!M31¨1†ŽWK*¥ÁD%mÖDEþµ•eQvIð#¾Æ$NºÁ¬A$™¥º„¿i˜vŠ V6†Ëxâ³›OLKZeÓ0À}QÇu#ÚÖÒ×ãˆ÷ÂÈ~ï×ôõÔ •æ°W-…gXÅzRèD@ï 4£ý‰ . ë¯‰^¼ ¦ù4¢`¢Tïcú ¨OpK>ŒóC(ÙÂ"u*üP>YLn‹Ä;·;}<#VDz<0À¶ƒ8î÷AÍ­6Ý ÞˆA¦ÓÓT-Cx”Ü,h–…ÁD3¾eOi¦oú„ä/cXD7\X%„ÜUBçW:,GYžõî,ׅͪ©ä[ùR¶Í¢h¢}`Àà%ꛣµ/'ö¶YÓõ?q/–Ä0 $qŸñˆ‡w¤ÏY$lÿ6ž¬¢%íâd¶kx-Â@›—êÙ+XB: â·Qb­“·+†Í-‚pÓUr?ANÂ¥éwùcräkÓ’fI6ÑLG0ÌúvBÙÕ#,U¯@9ïί;þ¿Ø› endstream endobj 171 0 obj [ 170 0 R ] endobj 168 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 171 0 R /Contents 172 0 R >> endobj 173 0 obj 3096 endobj 175 0 obj << /Type /Annot /Subtype /Link /Rect [ 460.822 591.14 540.0 600.14 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 169 0 R /H /I >> endobj 177 0 obj << /Type /Annot /Subtype /Link /Rect [ 226.0 579.14 290.44 588.14 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 169 0 R /H /I >> endobj 178 0 obj << /Length 179 0 R /Filter /FlateDecode >> stream xœÍZY·~ß_AèŰCõ} I–’MÖ-MâZ#èíáìtÜÓ=êCãòãSd>f­'':°õÉbY]U$÷ó•Ï<ø»‘?Ò<`åñê3ñ|–,Lˆ'ÌOyâeìÈdqÆjÙqBÊ.D†ŠK½ØWÍ•Çþ|õégè´cÙùÊ[G1¯~€ÉㄇI–ç9ép?Ëä!O€(ìåÍ1`ß¶ª·Ö^ òþçÚ»…~ð ‘Ç®^o¯^¾‹™ï±íÞº€„=ÿø¹Þ¶mýâg¶ýëÕÛ-™†ã¤óð/åʃ& qäM[ï2|Ë…ÿ‘Ä`ƒlªiCé§lÐd¬^\å žoZ©ßsòË;‘†ÀáÙdÂÐYû©SýÎK¶ØE9÷ec¼…/Ýݨ·ÿxûáfûÓ¿n¸eƒøu`CËêöÍ´^/q{ìÛ¡ÏsöÆþpK””¨» D ‡ª'²nËb¨Ú†þIù„¤Ê¢!jìÅràÐш~Xµ×2ߵ݊=IÊc–4ð#òÛb(î œ r1¸aÓE]+ý ³/»ê4ôߪÝÂö#‡FPêXÀ‡ÜH+Z¯”çCUMÔRÛY õõëyW¬Kó™uƒ 2~Î3A;…u@Z­›AUcHwxÙv(ƒ{ñyM)¸á¼¶‹sÑ GL1¬ËAf38s4CÕŒb³b[îÏlOm³]§bVÈE¹°•à€‰ 8êGƒ”+!I ½3 ½ ˆFPÊJéGµENm¥Ô§ ì´i\j+yÅ8ß gÖucÓC°éY{nZy€ð]Ë[¶Ç#Ð+ß¹/gÉ¥œ(ÒzË>ÉYÕ×·_‡Ÿ×æ_ŒÛª»}‘Î6§q°X­¦NÇþ$Êj_©¥$98¡;J1Ô}hOíZÊ€ÔØÞ½à~tšL:³'Ì2(;ü<÷òtŰË㔇ež‡kãþ,ˆúÃDÅ­Ìøv•ÖŽf3AÙ~wË>ˆSÛ ýl@q?¨ór$[tÏxôD÷¾We—n’ø<“Urì›|ðÇ5åý^Éo5€Š×ÎMÕ`î§Y5žUU‚´r$¥ãV¶”ÝC§ô€Œ¿÷b?ÖîÛn¡Çšúi8S¬ŠÒMË.'m¨F³Ö2…´·”òæýwßÝl/fï öžͤ¥c ´ƒ%[Ù¨¼†‡^¬7§`Ÿ†nÿÙu/V?àÅ -fÍŸd²äÆ®q±Jn@0q›ö{á¾1]ÑôEIÉÑŒ‡÷¶çû°7fÏ5—Н¹ïcU™Ï¬Ð‘&VÛ.­¿v÷:(ÅäNÂJ žÂaPN2’læ0¬GŒ½ùði¸+ì¢#…y²bÔf#ìZ˜‹^¤Ö#ðgC)ôo @ÙiyXzDÈê”­´f¦Ê=Í}yT( €¢ÖÐ÷Â][×*³QKQþb€,F ÀOi4êÚà¾5dµ7¤ÜÃîMGa‡‚Ï5kÃg55j,8§yÊMý,â7ò<ÌWÄ}x{ûúÕ›¿ýárăÜsy¼™Ÿœ×`ÿ{Qï £Ú;zÃ7½gü\Í8ÛP4¶A×t¬ÄO”¸Áœ%ófÊRt’N–cý‚Asô³L<©è½¥Ñó‘.×§aè2„”Ÿ\[L¡-wËOkØ@Q¼fhÌ ™«d]ФѤ‹{(]œ1d"e·v(&#háÌÚU;gB:èrC2q]M!­ß½hf¨Z¼‹žÞšÊ\íÁÊØÍFïÛûæm×=‘òŸþ"lãåCÊ#y “Gþ(ïdÀó•;íiU³ 'ãQõÚaÝ8ôØpŒ|t8ûв?BÊÕÀú/¢©0zj&t3½ƒœDŒ{Þ¹öå…a>3u×µ§“¾óUÀ“—½Åw=u+ep`¨Ó×\•)ä~}ÈQ¡ÆŒ—'…4Ô|3™²ÐÝ‹ë §±dÍÜØŸ™‹ëœ'òÜK©„… E«tmaï4iûu¢¨-²©1åRe1>n—Ë—(ä yžåi¼b·Þ¯ —Ub_½¾}ë`µ’Mq\Ýþ$œ »yC!ƒ>oÿyóqûñ‰tã‡ÜÏásóÃ5I2a†&‡æ.©c«Ö¨Å$kÃÀ°‹4¸ kÒÛÏ8H«-£™JøØOuÕlëÁÎØ_X4žY¡š›ûòÏWa‚ˆlj 5j`á0T‡ zDŠðIÝcÃ96š®œ—±Èó9yê|BG…êdæ®<Ë#ßÏ$‘a²îá*ù‘—ò8–—Sádù)@è Ø4 ¼„Ǫ›‡ÝŽ,Jò)«–,WTÍf²/Þæ[ñ¡·O,ýÞ¶˜W÷#‚³|ˆCMâÈ㩃¿F))X‘LÅ»šXþ‘¡nO¹sE\üä‚ÈŽy†¢õdš£•˜O©•˜lÌbæj=¡F:[âÍ—ãò ‹òÌÊÈ”ÎÔ×˜Ë¸Š— ½ÁXo+’ŠCXR‡¦¡3€JtEëÛ>Dø)ã”íµnoÈR•­¶‰b†¢oæW4Ò,X©Y6 ûOžŽ–Ow"Š6—´ ᥊"u9F¢0Q“%õE)¢ÊJrŽVó÷¥|Ì”—Ï -V§lX(/ãKùîÒUXW÷ÈÀ:#GçYDÎ9‘8εfÝì'ã©>D8â¾WÚ'ÑL{§ª ¥ûê4Š€œGÑg¨›h ÀËP¤ Ë¿BÜ/+Ûv9±fƒƒ,ÏâdEG< ¦¡¹ó¸˜ £ ‡L˜à]çRUrp ±t{Z[´4™ÉQΟ$ÎôO¤éžžò–7O´–4—ý“‹|ÝM¹IvèJsqq*ÕÎæÑC¿ Âé43{›éjIÍ€Plj̔_HžD‡wW³¼ÂèE(áâT…Ã×·Hˆ¾¿]±"öæÁBßöKgc[ "­„ŶòC CU¬á–¥oéBÑi¢ƒv¢¯ H¬éìÏc„ûRX¢ç'ÄäFðÈb Òɲ +„êHcÚ£¸ow–1y•]‹dq0ÿ<ö]«^×ç h'4%ñíñíÚpñhªHçI3 ißHI8^¨&:õ¬©οÀ»çœÉgO±»{±Z&øb›å<÷å‹-„ño„1Ä ß‡é¢Î«7GUî6Ã×”…1Ô)L˜úª,Ì@X6­e{˜؍ܱR¨ðpO@ÐDÌÅkV‡-UIâã» ©²`|*ºþ›Ëf¸õ˜Ó`ªBw]Ë iOWdeˆ·Pæé’,Î=u+œyQêþÞJ†%™¾‰Ê¸½î5ÆÈ§H[ðdx©Ú›QÝyí©6c·ÖLÔâ> endobj 179 0 obj 3226 endobj 181 0 obj << /Length 182 0 R /Filter /FlateDecode >> stream xœÍk“Û6îûþ Ž¿ts³«ÕÛRïS’n¯›¦Í5ë¶sSw:²MۺȒWuößH€=ìtîCïÒ¤@@A=]yÌ…ÿnÅÏ<õÙúpõD4Í}ÄDŠbæÍØMØ’D +DÇ(ºH*õFdÏ~½*¯\ö«ß~‡Næ:;]¹#æÈæñê'˜<Š NÒ4%Y}ÇK1EàĬìîáà³o*Ù[I/¹ÿsém‰Ïÿ?Èe»«7‹«»o#æ¹l±5.àù3ÁÎq²Ä üTüñÙâÀ~»~|*UU¼ú-Þ]Ý/H5'œÇ‡¿sGzP¯! Ý~‹å]šn¨ð/t¤Åñ#ÐA4´ ô+IáïYƒ+kðpy¤¥þÊÉϯÄ<Š“ô ˆ,Û÷ê/6ÙhÅÜç•ñÝ‘3Íœ}{˜±W,Øu^6-Ï6„U[fNû¹5}h÷œ ’n „ñG‡àUA‡®Ñ¸‚¾[üð^µWÅ«­PwжâÛªVHÝ•e^îFBà’Ü}›•’Ô‰\PÚó Õ_.+5pd­ÐõΤY×Õá•#‹XÈÖ6½ïx(»¡Ùn\ñuÖ5‘vŸ7©ß}uRMÔç¬â^9Aຮ—ãÉ/iîÅó #qZKsvý©¬N$ . »>ÕyË¢VG®Öά?»^^ïÁëx˜fÚtëýòUŸ«fµÍ î lì²0p|Xï4 =”Õöñ':}ì„OßFsÕ „%‰pÖØéÜ C,„ã ÀÖ‚…ç§ìú˜µû»¶º«ù±ª[©쮳Kᇉ3¼4 ã`ÌØ1’}[W[ é0„«¼l Z•7ÒµÇÎjÜöø¼T]m°§Ž×9·Ÿò¢0ØjÂéÁû"gGp‚ 6 acÒÒ(mpsäë|›[¥­4¶¼~p,4++]k\4ùv þ<À›ÁŸGÒ­«ãËùµpS¾0tžŒGê™eë£íŒ¨\w¼äuÖò#½‰‹½Õ㔽høEFU„×Yiàªló²ãSv=TeÞVõxu`Ÿ÷µ¨j&‚ ›5€uY!¡ ú,Ɍ̣=öõÂÄuýX—{pÔé×=—›0N•Š;Z|šc¶†økõßâ¦&µ$¨F&™0dœ >?ç‘~PÞ9±LÝÔw=7"ëÓY!.´&F”̇ȮÒ`k@ÊwiÖ5—Y q³ZÚ ð¾ÑøêÜ,xž ,w½BrC—Q@˲7}(*(T忈½1ý²–ŠCÖZók×µ¥Á7M¶SÁ2ià}“’>¾“Ñ$DBKe– YbJb‰ÈÄAB&•AV-s1 –Uy s@’¹nóg^¼¨8ÌËuÑmððGš3žì(jþ¬¥ÊJ=üñ§÷¶tËëF&Ý’P•Ñpl'/êÛ©ÈK§¾ps?ìåk¾ñ g+´5ˆ3ŸJ©Å’ˆ§]£0Ìüt'M§„I6”ëªƃü\Ñ{Ý\绽™_Þ-$ˆ±A@{иàÓóä͸ÿzÏן4yTükù󾵌y‚Ô‰aŽÏrG ‚ ;_’ôˆm8lÌ|%³A,¼•BSyA’Wâ\Ú x_R„´DÝ4‘@k‚ÈPRrˆ[±ÞFbFh4aÒe ©o„Áé¥O¢ûÅÕÓUãPùˆìoî¦)Ù,²Ë:¤aï0B'´(Õ»ìÍ醕բø¢'€ÞN’†ž— ñƒ(`õî þÌ]'Cº˜°Ð‹•“º)ä(l+ž|¸QŠ!ö8°0Nû¤Bl.ës=[éÔÌçþˆ9‘ÔSÄhVÕ7t'€ìÖHЃ~áÏH"xùüýÁ¶0VÃIUz]Á#Qz„KFœ¼€x›éˆ¤ßgüI1zk3\Š¡X祘중9Îן…_‚ûàÆ)܈©ú™âa…§vâ¤æ“–Î>_Óè¥` ?ð'fÀ{ÜùÜ׃KzêÃðЋ&†Á*KF®á2;ÈØ˜>¥%&=ñlB˜R7D2ÉŸz|nìùJ`z÷¥Á=ù4R;×üP=C5,Q@ßBÛcÍo!H7òÖÝfµ¸^Èi2Q¼Yy›ødü (ÅdQ 5éP¾ b ¿ÇÂÖ&‰ÒÔf‘ÿD !jEI"®H"†yÂýDaÇ1ÑËÅ^zWmQà 7‹_ܲÐ1F̉4cA¢0„¸§‰O‚BhþŒ$*f ùûƒ la¬ ½®`ƒ‘(=Â%£ˆŽqD¼ÍtDêű±½µ.ÅP¬‹q¬g$Ìq1Ž…pñK|QDIÉ/ÕÍ*Ñ!Œ°nªò+«…ë; ÝÑÀ*+D,3àª+×V‹¾]&¢rX~2V¤>¼Xgè„ëbèHVYú-¬¡§ú"¢ôª¡±$9í©þ6â ÷È-_·¶hî‚ÛþôÙDÜU)³ÄH D@Œƒ=К tCEo„ˆÛæ‹A!‘Î ƒæc]mº5>ˆÐü¥}•$œ†{Mau8‘ÇŒW·|â+°±”–ë„õw`=u$ÝÂ1 qÿuk`U@L¿!ú`õå9U¬Ì/ª B•uDf_ß5¼€¸ûûÌbkÇäYO4n"k¬&µ\±Þè¡l³œ§˜‰«a9a¸Ô®ikâ$âÒ¼¼ž¡3CÃ}†°²&b°Æ‡#\1±zŽ4¬žl@U¸G¬áÏpï- TFŸ Ázˆ£™+ƒÝo&gQ‹HÊ,­1´}!k7½,ˆËí06^ä†ã=|u`ªn/Êr÷Ïb[‰$A×…e]R¼FæT¥Š;UE14Éêj‘âìÄYÉùf\¯óÃÒÎñÉLDOY?ëðe öÚT¼Á(Ó/W°4#>SäÒô´éÞ ’(8SÀ)Çg츷çc;Œô¨X >$À ³™¯ú$±¹¨ÊÝ”eàÖÙ·ÌCɤ§®³ì NÎáîÊdéëjW'Y&¥… !wŸÚgòhÔÙ×°•ï7`Ø7Ýv zÓ5v\¦‹bñâI\ìRÉX½ EI,OS!DÂ>k,,om¬:•vþó‡ ‚;£P{LHð·~ÿþ÷ÿüCÈrþÏK/q±ix«^¤ˆ²‘ÙòÚÖK¿®Aø@Ä÷ØKÓ ô. ¿øðýýç?añ.²q,Qzbvl¾æ¬x°¤óø¿”)ü•\àxP.FüØÕÇ +Ú±URG¸É^Ôs¯ÄñûBèõWÂàÎ5oxi1¦c‘²+ŠÆî±ŸÓa‹$µvˆýòúãÛï^4„uUt‡²>û¶I2ÐV”‹ N-!l™l'ŸƒD]nŒ†3ñºÑKN Žt,²¹-ß>þr÷Íã/ôÔ3Þk±ç9âi&õcz7yÔljø^S_%¼…-ÞÕ2Ê N"DVTþ–H¶Á¯6û°i/#‚é%.‰bÒžl>5Λ¼*ÍœaäFfšÒLÆn¬Yömàèv4éua´’NA²í¹­ìØD~00‘e†ÛÄ“)7VSáŸÁüy‰Î€$<ö‘Q¾ðM¶Rêˆx~WÏ&Hid’`prJDÔ;6b+^T'Çà˜L LoÚ4 }{eÚjƒQø$áðË â_ÁtõQ¼_mÑt`³:Û µ¥.žZR¦jÞ„Âñ¶ÊV˜ôª”ÜÚVÒ´/¨¼jÜÛØÛÇG [à Õàò)Î`‚3n¢¬ì‰©¨ëX¤Åž7|ÈÓÂEÅÆ³žr+¾ËËžîíþBøŒÃùÀœÍSgyq{>–'£Ä‹=Ëž«|ä|ÇlÍá¤. Üb{'²'õµË¹ÝapÃ!±ÚçÈ+jºŠO×èo|èSãÿ±åòV endstream endobj 180 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 181 0 R >> endobj 182 0 obj 3570 endobj 184 0 obj << /Length 185 0 R /Filter /FlateDecode >> stream xœÍZ[oÜ6~÷¯ ‚âcE÷Kû`gíÖ³NíA‹¢S´Ä±ÔHâDäx:-úß{x‘¨Ñeœ}énbgx(òœÃï\©É—Ùð÷L|D‰‹Òê䋞sPä"/ÔSAˆœÈ íUHq£R,<Š%zèÉY½Z9úñ¤>±Ñ·'?ÿ‹2d[ÚØ#æŠÍýÉ÷ <-/Œ“$Ѻº–ÇB„g…0H+ôîºrÑ¿©\Ýj/ÙÿsíûyŽû ‘žN.–'ï®äØh¹6.พ…€sú(¶<7\´¬Ðϧ÷_Ê%¥å›_ÐòÃÉåRMíÎãÂOdI:xøöᓞwuóf~}ËSs0c¹œA<*µAõ§xÐ úœD³êmšG"õw Ÿ·DäÁŒÀ‹zØ:Õß ÙÈŠB¶m%¾ãDbi¹ŸÀÃæéDf?‚_ÏC AkØë‡ H°µÁ#©Pr™ÙF5+°$t†ŠÝ®aäN*oô¹WkO¨e$©ÑqYÝn ‰áìq=Zš­$Ù}/ŠÑ'R£þ:wIP|à-6 E"´m[»JQ3ÒpTÔœ"Žžq¹%luê.Ðk¾£¯Woþ‰”+õ88¡åJŽsŒ‡'xä !Ó\ÜÀŠ%0ÿ.>pYÓm3ÍÄ ,?Ž’$NÂcLÁ¤xžÑÄ,[h−IJ«ªà+Àq \9^ú ×væ–DÞàäggèúã§Û»åù–ß ´ZQ´+Êá͆ÔzÜ£Œ¬ñ¶äB×k´§[´Ã5GpÆ]Sp‚0ªÉ­‹’,Æâbo€ˆ+øk&ø4glCkV<eÁ÷‚eš“ô3â9æÀWðDt $A WÕ⟌†jÊǰa‘ïwÂpÙœíù­`­N©ZÑgj¬ÞXf»ÊI½ÀŸÑÒþЎ댑¾¢eIwò@k9,ê'P W›çß2¢ ¡»}·üxƒÖ ~ª.Ð`S {` ‚ÂÀz‹Þ.o?=Wwçß>\]ß\¢¡w¼Ú¼ãtcå¼*'XùÎA`uq»\Þ~œæöH9§ÕÃÀ~Ì’¶ê{q't i¿Cãƒä˜{4dMR§DÇó‚¡O7uMK2$ÃC‹¼Ew—Âõ–×Ky¢‹5÷¼—&AwdC› Os¢dŒy_gB%£\­iŠLøCïïïã{àÌç`|+ynL^¨ Œ“±e6[.\©‚ŒÓF‹ˆ ½j…2+eì•x.ã'+’rÚìA5 Â…ZRôX^ ò‰ƒ(z¥†Òê’½„_;òdX¹v<¶òOpÔƒòYf¬)ãà°=㤲6 Ý@R-ûaÈGoÿøtóðÃùÝõùÅÍåýŸBöX–èL‡¡×Aœn8ì ®@&Ò¿C;O¬ñ¢i&ÖøáÎå¶©ÕaN·\˜³¢Ù”ëºA8Fï#‘Zx»âñðHÖ´! «Efér4„¼<ðëpX W«ñfK&ÖFÁQ.z¾0±%VÎq£vÇ£Š0†ŸdäŠBƒåDóç&ªüű«¸¿¼¹|¿„ôtuwûMULÏö¨M¬q& âû’2QyÖ­Y~Pƒ®,—ÙªÓ^»îEJ–ðMŸç{®7Îç(•Rdü¿_«¤!*›6À¡²+|€“6›Ëi/÷2¹D˜~J¨ç §«|w«°þ2ׄù½Àà)ŒyOEe¦õ™ôA1Ð6TØ}3Á'–FmË”nk¾:}»zsĨѰÜM¬‰áÙç\ÚKì`›;r&BHÂÛÌ8¤oËÖ‹±àÛôZehŠ·3Y^ ÅòÀVŽSpå;ãÝn2²|ª—MÜáD ×ôÄ.ÍÕânk€ Asš SÈíKz$ø_G]›aš µ:R¶hÝ&jÆä7e¢XïÍ”Èâ†?鯕%eafX´/‹c)nzñ÷Cêïñà$Íë"Å¥™‚†¬a=ñ›CBÖí \íýÇ!Ì[…—¸žuçVDk­dh-hö\|ÏŽ&øA8ΚÙ÷Žl4‚eÿTs3!î#"¹½¬šãÄ–àšÄÎŒrͬvŽÛkñ?æ¤6”]OpË2þ •ËbÇý/ñtÝðØÖ#=ýeÎì(Qý†Ô¯²Ì˜ s6ã3ºVõäp:vBH‡š*œ ¢Ó †¡Á›Ü2sš¥$RP°a†®T,)b×ú¤Tê'²žu¤8ôÂð3fiSlxòþS‚[[7fEU”¸9Tª·¶ÅZ}ÕîœnËÞ×þÖyÑ;f­ùɬ ×ÍC$ïðnÞÁ#+™ßïqF;EoñHdÝçàÞ˜LÝjº$ÚTKøÙÉÔ3ïÖåà›~àLH;îÖѱ­§àϽY— ÅEììÞ5OÀÕƒûÊ­z  r•­_tÜÃEDa¯;›‚< ò¢¨1\P®DWÞòš®[Ÿ@N ¡«öõ ¥Ÿd:€>\$`=ÚnJŠ3M<*îŠP¿³mšë!nç69åTƃ¬òÙ6+h{û@z¨dD –Åï¤)Ü»]ôø+Ü¿Zöò=‘f˜ãG,«Tž–Ûª—}I¼ÒîŸ?tçÿLÈF°‡+‰ˆYÅÕ¸;¸&·k¸nuä./äñ¥’ª+ÕX㨈u}iGh$57Ù–hB¥(5^­KÃYåÅ…Q·™fŽ»Q&5ñeKú‡2ÃŒªžeÈ 9ãyhóE°|#CQkŠÄ×f^ô½YÁ EßË Y;Ï÷C¬Àæi .¤ú)97Äp{f"Ñv'T¼¸¹½8Åñ±½‹¯5Ä·aS‡n/>@Ã>/êá‘Ý‹„ÙWè’@Ëï¶ÃíyB—åw—w³ªxîÑÍòe…Vàº6fËÕàÖʼn±z ¸˜\(ܳ#Âá~O²±·ÁøPáSò•`ÑÀ5sèI*´ïAÕš†0ñ–I¸©¼4Bí`N!稗Ïâæ¨^º5~Ul‹/ÎÄ+ÌÄk{þT%q{•"rüÜ{ÔSQª›Qc †"ºŒÓÒR“ÅŒ•g4Ñ¥ìVïÉ fŒ•Ò©¡å¨pëèAð©Éù>ú¤Èñ“$ôü °ŽFŸoÇö.¾B¼ï8Vè…IâùΔ­Ž‡ŸïGÇv÷€ø›ÕœÄµ‡‚ÇÚÔ! Â.4¹PQºÈ­Þ,ÌœJ®jÌ´Ó)J¹€æCÍ›¡ê:r™÷¶‹Î™ô˜«.O³0-Mffe1iöY± I uElÒ5øjÊܦ/Z¼èŸct˜¡ç°Ü@3·ÙlÞ¡Šî-‰ƒ‰íBlÈ«Å÷7†è*œ"SZs\Ô:NÔœj%ÌzÆ Z›™ 7Ÿ ©+%g9-3¹šUVSã¢ÎàšÍ{> endobj 185 0 obj 2677 endobj 188 0 obj << /Type /Annot /Subtype /Link /Rect [ 204.369 488.72 350.659 497.72 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 187 0 R /H /I >> endobj 191 0 obj << /Type /Annot /Subtype /Link /Rect [ 352.51 349.856 477.49 358.856 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 190 0 R /H /I >> endobj 192 0 obj << /Length 193 0 R /Filter /FlateDecode >> stream xœÍk·ñûý ÂZ8ÑKrŸE4Nìø§Nz¤@.(V%Ñ^íÊû¸óþñ>–är%ùÒiønfHÎ ‡Ãypýá‚ þ[È_YAÑjñÁÐÊ(b©!%)"N£í‘Aò$G•œ8å2E5³5²C?_Ôúöâ—_aÒE8A÷ÑŒ¹fs}ñ#ORÌÒ¼( £+Å$Ï¥†SV{ôüjOÑ7š=j/Eÿsí}¡ÿEh{ñâæâù«‘Ýlœ Êp–‚Ó4F9f´(ºÙ£_ž^¨nš¦zö+ºùîâåÙš^'‡ÂÿV4Hâh:ây—¥;*ü1Ó4 `šÀäPeÔü–#˜(éß' bXy‹ÃãQ–ú#…Ÿ>‰Œç“`ijýÔ©þ`“ÍNQÊŽp’É©EF“¸€Áv{¡"KœEr?)j9ÚÀâ8-@D¼5D&À=Mƒ‘Ó ')Rª(WSLjZN:nxÌ÷`U'Hº¦“cÀó¢ôr8“Äi­°Q˜ãodEZP4‘÷Y!f;òvc}¥@ùÄU"”Ê(E‘ñÞ•w%Z¼+[ôÅëëß|óâ߯ß~ÿòy%–Ï»U÷ËÁ¡­Ä-´_=•Ax³³"*Š<5÷—Ëý¡âˆ`†Ñ?ùZ´|Õ‹z‹D}zøÙ7( §]#.p–%Ruå"Ĺˆ2! S=<ÚÜQôÙ9ÊÊ>úˆó„é ùÊԉ暤çYbÔ„YäñJ§ ™S»¯„!ÿ²S`ßùy„`nJS) |z*Õ?€Àà¾ñsÛš2ÙõO2§,Ьù/}ýí^‰Šc/À,G(/p§QÄ2s½^5-z†òb §¥»¯*‡ÖMïMë¼mËß ÕñÑ~Çò¢Úš/VÍþPöbYñ@ZwéÍàûf¨Öž.œ{\P?¸/\xª”þvšú„Ž]¹÷°JÔvûÔ·ÕÐqmgϺ$"yK$yÀžkˆ*l$÷­X½¿}†m@ùpÁRÍDý&IŒ³ˆEbjA¦kAå=ÔâÉ™&1„¹˜YäZìÏe[C³`6ÎeÔÊ%S–0²à'a1x5ËQLRÈÔ0œQ+¡2 ÀŒHϰ©Â‘LÎq\*4åz2![æ4™17¤ óÍ¡Qû"NI`>á1šŒÉ6äO¾2ÞÀ©­L¦‚ fªLçŒ"'¦1 7jH¶ GÕ˜œMx¡Z§µÈ{hÒ̧k>é—I‚3J#Ù´_¾à÷e«®I œÃEÜxH=è;jЮ_‹ÚÃõM7ˆIÊe¼žn‚Œ‡pÏ<âW½‡T¼ì|ü^ô;ýN`‡¦¾Ö¾Z?ýãê_—>Fß"´Ë¡Óc# ‡±ÍõC×ó=õÉð³ôO‡–÷k» @É#I³`ÕžoËåCÏU¨¤ñx$Ú–í²ÜòÝhûJ°ååÚ.v=1E¶VUÓñ5Ñ+KoêN¬¹å:l —–O³¼Í`–ÃÖrºÙñ–ƒZür¤ u%ÞsÇäሠ²"0A)@)‘É’àé¡m «íÁ$#Ød¤QQß5Z Æ7mã­ìV­8ô:±iÊjÇWï½ £Å4ºT»qx;Ô2Ž;ìÈ!£‡žP»ß•½§·¨ª#Æ(H` y´jÃ…·…‰;äÊþAjÊx”+¸[‡ ÛêÁ¼!cË}z‚o&¼}ØT)y7t½¯ËöbUV—žH¾*!‘;Â~4°ÂZ¾oú0̓ÕhÄ«ñ|5¨ìÎë;Ñ6õž×}‡¤ÑÑ®¼ãH´¾ ¨Ùlð¬x ´ÀD&ñ*LÅôûRyÁòj ­…ÍÁ*Xû¦˪kFØœ¢™nWB £˜¥yvDüÉE14Š1”'Ù±Uߊ;í±j-T®#¨‚f¨Ð×ÍLnU}ÅR Žfô2¨Žc’<^IšA¾Lò¢€gVu²Ûkj<â7¡©Ž…q0Z\@‘Gé΋Źœ¥çÖÚƒt9“LÔ|8`SãpZ‡‚[iMé‚Ug•rþ·ïêçþ“€Õ¦\‰Jô˜@î–÷L¥XÝZ˜ÐˆG=¡RIƒf…ffIR@e£¯†¾Ù«*úLC‹GyEJOûäÅN ÞAÃÀk^zC&Ëid/º„-@W:ÜHi5q4M.Å¥#ÛL£Q}; "[ºÎ[;SÚ$uO®ù×ëÒ4UšÆ?Šù)1¨à¦Æéú²Wé•2ç|ÞŠ;îFt¨Ñ°lhZ¥œÆ›;µ/ð¶m¶Ž• s ÚîÛ²îJu!;l©òÈ¡e܋ޒ„Ó "©…—\óM9Tý¥%¨ÈxdªÌ0ËQ­çö¢Q`/iupÕ§²­xÏU “„ÉHB×Tƒñ‰.lj¢†U•ØBа‹‡ÎDM€ooWN† Ý8ñR5’£„á`¹¿”FïnŸÔÄÃCO©‡ÍUnºœo[°U`ZÃي̓ÔOºÒûy ƒËŠ‹ :†b|½ûÉlkab[m{î­ðÚfÅ×C[:Ò›²ÞP€^ZЩĬÒêˆÀa ¸ŽŽàTãÆA5â•J ßTͽ¢M7¨ÅÈ뜨»²òÔ;ǯiç¶Ê{j›uÙ—Ëé·F)¶zBå c$ü–áH%:t†öÐHÛ£kΑ²gørháÔS@–‘9ŸÎptzúxHÞጇ0Š#Š‹\-eG ŽÏLó±7ègSYzÉ—xÍqAÖ/%ñg^JX‘`Hy²«59êFñJG@€P‚ä+ F¬ˆ€˜M^Jä,¦gÙXG2¯©Ž“jÇ'ø¹G91ÉgÌ )xÞ+’°S–JskE OxŒ&ã oÈŸ|e¼óD1™ 6˜©2!œ3ŠœXä†÷(Î’&/%s5&gE¨ÖÙ—’‰=4if޳/%1…Ð %uže…¹y¢^©l&ÁRá-‡ô!»bÝ?š-¾ç¥ìÍÛ¬"©ð=":Œ_ZÜ„:›P§`êl¸‚7MaÓ„wEk¡»E=·q¢¸© )+ÞöGž&bùÜ4±A¹„xˆ6¥¨ gZ–PŽ¢wͲC·ªHãúÓÍ¥¦ÁnÚž«tµ‚öë•ýeípý{üq€Ñß.ÑëaÝ5µ}{=òH*E:ÄDp"h‹‚¯D1F*Ñ.lUs%7ý¹oCÒ» aE 1R…8Âq¤¾rM"H–È$'ÙKîHæž:FÚm}üü‡ #ª8aIA ™ë“ SI²—•¤8ó ¿C¡1ž„bh gOÜÀOü©òâ†M0‘dÅF„“jHÓ°2Ófr`áù„Ú}V™,°Ž‰.¡qN~]’þœÃÅÊ¡ƒÎr“ô~×·¥/ÔXy87‰¦9…]š^¯v z"Ëà6 =üe&ô úõ‘¨>¢E‡ž|u8 ˆ*@e¼kº=<9"ŒP™à‹"±moËWâ@þþ†zY#T#gÔ$e8'P~ñ{ÏÛƒ¬C+Ë_»Ï\²É‘–ëÎ4­I^&ø)1ÑïJ?Ãá¹àl°û²î§ƒ­‡š®Ò`¦Ïö(ÕÑѦå ±Ü7:º Çîõ¨ ×¿Ž„¯=tÝÔöµ6ye”Uûê\àt'0ÊöÿðfV^§ ìgž–T+¹HÒà£&ìôÇJ˜¦Ñ–z aÞå~'V;‡^9°ß‰ú½C…ÇwSzºáÝ”ÏSçÉ‘ wˆ{,ÐʛdzÈ>hUOoã,FeQM6|Ç}.s;Øq-:ÕÓ‚6pbÆH4-¨iå›/诸:·òœi4á¼WL¡ºŠå¿¢©ùhy£Øw'hÒîÄš[nò)éÒºêzVòf7thÀ”c¯';(ýö°†¾Üo |¹ò£>ÉŠ‚Éë,åÞRš„oœÇæ-ÆÏ¸üm EÀßúvà“?ö“Õb& endstream endobj 189 0 obj [ 188 0 R 191 0 R ] endobj 186 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 189 0 R /Contents 192 0 R >> endobj 193 0 obj 3067 endobj 195 0 obj << /Length 196 0 R /Filter /FlateDecode >> stream xœÍ]ܶñý~…¨mœŠ’(é)pa'pà‰oã"Ȇv—{§F+­%í·Aÿ{‡œ¡Hi©µû’6I{œYr¾8œR¯¢€Á¿ÏÕŸ¬àÁfõ‘pQñ „JEe¡`y°ÈÓ<¨ÕÄÉPM¡a¬±4ûàWÍ ¾¿úíw˜´ X˜WìŒ8’¹¹ú˜§"ŒE^ÉÊÃ(Ï‹80Øìƒo^ïyð²Õ³ôŠûŸKïJGüÿ@"Ü]ý}uõÍwi±`µ³.ñ8ÌØYˆ$ÈØê¬öÁoOn>Ö«¶­Ÿþ¬~¸zµ"Õprÿe¡ö Éi¦¿8Þ5â-þ—„1âòtP?Õ´¡ôWý`†©6þ]4‘rÏ·G[ê¯d¾¼Y ˜0Ÿl@ÂÛOê/6ÙÙ.*Þ£2øÑD¦ta\0ø‡ty_vU¹®e°:dzyÌÀ‚˜‡Lyd! \ù²ÊuÙËon~~2DÁ:ršœ¯$žÏyÁÀ`OîËÞšÖ6m3t“ÉíƒìðÁh`Q{¹¹/›ªß»T]ûPmåÖA­O0Ü»$@)*I2S¥Új¹—ÍPUÛèõ" cgÇ[2”Å<ÈfÛv¡EüÚ-°)BGw]ÜÜ;óÚ¦ºãfè¾M}²Påò+}ªÐ¦ÝïËfÛ_«•…P¦è«f#-HvB ¨³ ­v&+¯²`#Üé,Q!e×jˆ‘Í]ÕÈУ…ÈgZ¼¹ªæNkò²&3*`¸/‡x´øûòÁ™ÔŽÃ¾<ãrÝíbÐõXÖ½ýõp¨+ÙûˆlÓâÑ g3 ŒW÷s}ÕŽÂ$‚# “(ÊàæÔrüÔµÙ •÷(ž/uÎbå B]·ýîБõvkKFÕð-¡ÇMkÇ]5¸óÚÝ8„ÆÐШ£]Z ÷&gIQ)•ÆT¯ÿ2M¹—ÿ^ ^<ò-¦qf ²vX/2çÅ äb±g@¡­«~èO=ÄšÃr0£4Ìâ¤ÈÓ8õÐ GiVí8µÈ²9Y 9î×$3.ßÙ1êsmÛꮸu~ðpíC‹\ÝË9åÞ‘©“-9£–¨ ž÷¹©vÕFÓÍ¢~õØZ@~*U­Ù[ ¶Àr΋ c’Ëu¿ìÞEê_âðÆýÿ ï8!ô,Œ¥¹˜úñ×ï_¼[Žû)÷¯s£B’'Îï±Ïª—Áßy”ôZLUÌeßWwt0e}$ «m;&·GÀ©ªA…ñóºjœièd86Gx£#Ó´÷ª‚.Ê?ùÊI3«“VcÅ$Ô|”¦ªlÑŠ"¨3Q-/ûX‘…"S ²È'¼UYɤž|{±Šr«31Y<7/å:(Œ\ˆÑ;af7T!| 6óžÀÄFÒµ„ªW'Fp†Ü)ó V-¦'‹‘'wúA+¥.F¶î”Þ–ŒºˆIE‘Cq8ñÙŸxh.TKyä_zýßKQ@ bñl*Ägn’DÞu®èô£8Ë}ž&_3¢‚M¦+oQ÷w¦¹Æ1öÖ8ÞVý¡Ö½Â%8OW“ÃS¡…ÀXÂhÈ©V4Üë>Lg%D¸¡ 1¶Í™j+„“ùdõÀØP/=ž„y ÕG”ÇÏu¨1b]ˆôBßmå"Í&«Ï žC“­®~EœL[GÓx^¾:_oÊžëˆ×Ù±®qqè1ÿ<êêºúûŒökFãzDaïŠc q“©#ÂÔL´L•L¾+.ÆfÊ™p‘M¥Ê-û|]&ãø<$Ÿ]ðý|y™Ãw¬^®$™ð³²q‘†"®µ`‘Oº—7ï?¬^¼ûþÕêÃw¯ß¼ZSP/_ ãŠFéØÚðä€r·“›ÁALîŧÛñ<¤ºHK°7†R¹¢;9DÝ´TºjˆŠG=o1¤Ø@ÕTCUÖÕ¿0öõ“CÖ–´ü8´ûr¨6ª±vøCØò^¦&3UÌuaF; eµ…É‚¨’êD˜+Ï +(SÜ \5 {ªéz¤Û1dç¬ÇFǦO5œÌÝ–ÅÝxst‹™¶J’]«.©Túïëœ@]½bÊöÄ¢@ÝamåPVµ§ÿŠSèî9•.šÃ;ØÜî¶Ï!|ëîl)5œC½c“ëinz 5‚îÛ '>`t{È­ù¹*-zh•Gè–jDך°é7 ‚Úô¶93€ÖC~= QK5GAMÜ‚cK—ºrNî²6ìÚ"l©¨ ~Šæ:›H>Œ-h:šX·vÜñÖ!HÖ”4aIœ•.pêD”°(™Ç$Çø-×=ifª¦‚qÏbjQQ½o  t›.C­vTvxï#œ+('Û#T¶Üž{q¸~/Ô1Ã1x¯Íoyó&P¦F¾‡3ãåB« 2ÓL!°ŽÆSÓ™C3bl„¥5ó£‰a¤Àñ$Wû–ޝš¤0JéS.JfÊ#éUIª"í±©>¥…‰ê޳ðjŽ1þ`2êŠz¢Ï­å I o20¡F{YŽ×XAÉZ¸õÌÙç" ã"g㩇ÿåÏó4L´¼©ˆ<‹CËŸžö \M@»?˜ÚÅ6iNïóPíö\±³B-‰³P Sð‚{dsB€¯”T›‘²ÙzÎŒ/¯P 21–ËlóâÒZË’¢C_o¼‚¤I"›5ƒ\µàȆzᬠ‹9‡ zæÛØ_äßû…tvyj¿ó ”ò0ÉÕ+`yl°|ƒ’¨Bdy¡+×"s½ïâ,‹|fÓ U7‰â{¶8Pæ]äWdaSew¾ö"_Îy§Ðó /[°¾ò p%jõ˜¢R©i¥UÙA18æQï‡I®®´ ˆxŒt¿—¾y{w4E%¦Ø^'VýK9ïòë RV„Y”yÆèÅà–ót}óL¤.æ­±Á™Ž !-”mJ&Äa|+vI˜Tð5¼”9(ì¸QÇ¥¬¯…º}²oûK"BMÔr.'G;ÛÀQ\åx–ƒØž¥TO©GéA?~A¿‘Ù‹ƒìâ«/¬,SŸË¹‡æ³?ß¿x÷öů–ïä¢è"…Q4Ñg¤Ò4Ú|ž ±¯¿@œâ"…Q„MÛA•phõ%+v¥øÃ OBwÖ„Ž[ ¢²¶¦ =¦æìÍ|zTEP§pz¾˜€†jz*¼óÒ '\=/©¿ª.»U~ßvœÎ)‹u$Ð/¢žwPà5=Káô™ÖsáΧýª^æõ³={ª¤%Ÿ îÚvì¤Ü®ËÍÁúÐ ¤ª]”°hÍíÉÖE¦úí«ÛÛÃW.ËÆQ22ê“uÍ Œ‹÷t¯VW¯bkõ_ƒk°œ1óMgŠßtšÏʦÌÔ8, –2^P´|½×ÁÍ0²€éa^$Q”«AÎã4º»+øEXL (ÕôÕ!Ø|k§¾8åÐ4© 'ì!âST­P.‘:˜]ü°n$ÎÓ3â„2_¾žqç&È’œAŸM‚$"Ì'ˆ/DÑâú|Æ`"Œýa *îTeƒ3Q\ÄE£%YHÛ²#Ôø90÷‹áîÍ|+æb-K‘ÍìA¨¹9–¿ÝT~³0ʲ"ËSúàñ¥Ü©;:IÝ«PSݱ±€ó ".¼PdaÄuñáaôL')(‘ÒK¯_‘â‘quÏ=D¬XSâø¡’ªšçÈïºroq÷²>Xh|Î"uéyŠz&DRŽô§M8ÒpM21Ør#’äa”‚n9Ô/_d ÉÖ%|¶_2MY0ÏUž ÓŸ‘¬e€4”æó/ìèKêÿá0 ¤ endstream endobj 194 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 195 0 R >> endobj 196 0 obj 3422 endobj 198 0 obj << /Length 199 0 R /Filter /FlateDecode >> stream xœÍY[sÛ6~ׯ8Ó_&bp!@2ÛÔã¸L뎛l-%}ˆ2Z‚,n)R&)+žÎæ·ï/ PŽÝv³ë$#àç‚ï\áÜ (ü3Ô^À`ºÜ44 .’@=G–Ðl|áC¢Þ[ê#Í’WÔæt½YÀ¯ƒt@à‡Á‡xhİKx-f4ø• épéAÐØÊêûZw$.¦Kx~¾dð}Vn­×‚ÈÿÜú®Eœ²ÿ‹\^Ï_  Æó]PÆO"ÎRºà;œú‡Áx G7É8Ë’£0þiŽ›«Õ|:xþõœ*‚î}!\rÿ›Ntmé;*þs^Óâ0wÐ_%C›OýE»@õç^@QfÓ=R_Sù~Ox)ŽÏ.ï`?¨¾2d–µîý—!V, Ž`È|'€Ãx¹Êò2JËi¾N§eœ¥Q²£Íâù\å*vX¯T¹Q*Ýn£<Ž®UìHQQÄשší(›¸\ìv5¨Ï_¦ÙÌ ×„Hj]àýéå›ÓŸC-Eâ)8ü­cÝžsס2@1\Xrvfdù#Lâ®ï¡Â·eY6}Þk“K˜ãyØt[80Ê¥ãñ€P.=KØÉ~˜ØÏÖ‰ŽŽ+ËETvwªÞ 4F AIT–ª‚V0ŒêF\½Ž’Mt×ÙªÜmʬ³®ÃµÞ$QÑ96úåb·™ª$Ùín£dÝ᛫rº¨Ã°&LŸ×»\•ë<ÝÏÝ=›fé0WÅ:)‡÷lFc&GÎn~Z%ñ4“a©Ò²°°ãÌáœB}^c׿‰e qÍE8µ%ìÏ &`k•Öw~P½K!5/÷l9$€÷[«4ÊU»\F³ízžgËvÝD†^Þªü®]§êSÙ®Û ¨ÖYZªtûú<Õm•Æy¬†ìýèÂñ¹îØÜ} üœÐøž€?§‹¤ffì)àŒ=À·Ãk¹ŒÒ-<“ŽE»|‘Ýl‘»\‘M¦XºN.5)FEŒžÀ"P,² ltá9‡¥ŠRÀ"”ê/&W§—Žã´÷ôp†2zŸôéb¬q¯)Iá§h¹JP'p`´RÓÛ\u´é'Ï@ßù7¨®ûyrïÛ®¶0é\J=Ý— ýùõúG=¬ì>Æ8_Òs\¼*sƒyŽ}{ˆ £ÑúÐ\l]J¢)1 Ü“ºAh€­Ñ˜Zù\˜òJ;Ô›zÛ“R÷8$y^cŠEx¼1Z"³•0CKmPey‡¾+ ÜÞ“óEd [jŠeÊv’«šƒ”ï0g êÊ:˜Š›ä;˜LVpZBQFy¹^Á `—S7k +§ËUy‡ßåqz팔‚vl:­íÕ €Óã?NþýÊÊ”_"¾~xn­î/j±5P‚ªUø.íÜèâ9Æm¼|‰¬˜úž•Z]»m±øâ!Z,>›Aäq|Ø—¤‡ˆŽ9ö9.ûqvžŽCŸ¾º¡œÆpþfþ^>ƒÛ)à€vöãéåä‘ÉÑäè¶T«¹–ê ¯#õüÍ(¼kQo¡D)ïÂÑä>ƒƒ,U½‚„0PÅò€ul½šE¥š96ƒˆjvû¢f†šËMÖ¯Ùsõ›'T.§Ùwû<ÆzUÀgûxÀû …áÙ¹^_¾ýJÛ.F¸È9Àû3ûåC€áÐn" ˜yQ@ر»Ý¿ @øìƒ‚&¾nFF¦!,l오U”û3ËNû¼G ›{íÀµ§Èÿ^é‘ë†S¨}&À7‰ßŒû]?'qQ6ÝïD;ÝžKI`ÜòY0{!ÂÉê»öìÞ}“Ã(½Ó{H3,Vºaâ¯SÝÜuÚV¬t$ØêmuÔ7@Ò¯Õl“Ù2ÃÑ…caŠ…¤@ezBÔjVB6¯êK}—¹Ì¬Ý€?'/ÐbôÂäÈfàžªf@„4 ícp½>ˆísÂë ›¾dGMüY•T\ʧ%;÷zËæq®s¿·6¹ŽµNvøõÇð2„^ï±1(ôu>ÚS!OJ&—š•nŸ`¶§ÂU-®º;6¸ãã7ï..š&§i¹Âð¾ÓÁ«ÅÚR¹YÃäò?™„®à_3 ]iV׿' ]Ï,ÆÛ$¬½×“V®OûÂÐ>Ð>p‡C/ðö›ZåøÜÃ`óËT¨Þ’ÑU–WPnÔFA¾N!‚«h¦Ÿ#zà*•~²¿°Tâ Ù³S(óµÝ‹5À¾Hãt­†øPRyŽ4U» £EØ ÖÛöä°`A5Bzv/²éº¨Óx¥—vú n¶Qø^§{MXYŒo³ƒo‹r§ß`$§ {nV®ÙF¾ÙcÅ76¯ð«± ߯y×>“hú{>oãD]c|æ]ýKMË*çÙ:½€¾={7²%ÊÞI¾- 'VI8ùRn Ï3þ2‹o6ŒÜïãY}‡8‹…ˆ*@Û ‡ôöNøø^UªÓl†ó~’MÇgqÜ[úE`6V×e–$Zø¢YyµÌ£´ˆª_Ûr$‘†+þŽj*©Ù˜ÃÄD_l?¢šJn6¥ÿj5•®ÙÚþB5mþëç?ºX¦ endstream endobj 197 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 198 0 R >> endobj 199 0 obj 1984 endobj 201 0 obj << /Type /Action /S /GoTo /D [197 0 R /XYZ 72.0 672.0 null] >> endobj 202 0 obj << /Type /Annot /Subtype /Link /Rect [ 153.94 138.474 330.69 147.474 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 201 0 R /H /I >> endobj 204 0 obj << /Length 205 0 R /Filter /FlateDecode >> stream xœÍZ_oÜ6÷§àÃu ›‘(‘’ ‡ëÕé¥HÚ\â¦(ê¢×\[­VÚHÚlEï³ß I‰¤´R6/½s›˜3$g~rþÊû³ðßþJ2FV›³÷†’„‘H$L¨R²!†HyJJè5qˆiFŠkFkâ‘üxV䛳ŸA÷$ œìÏ‚‰p-æíÙ¿A94i–e+£aš¢Šˆ h¬6äé‹ #_×jtÿsô.¢(dÿˆòpöÕÍÙÓ眄¹YÛ#²ˆ&ì,DLR± ¹ÙŸÏß¾/oêº|ò ¹ùöìúÆ,MÏÃÃÃàÿ„ªäuð8ð{œÓ5ð-þÄ4Ò<àPÆa ØUš 5¿±£ore ý{Ö F”3y¼=ÊR¥òùH"àÐÔÛ€(sl謹Ød“]Ôº#¡á«ßQB´grí™ÃjÀë­–Ç$ ©Èðèq®WûF®òí°`JÓ,Ã)‹xDš‡3ø޶¶‰CZÁ‘j$Ycè`#4Ñc6$™Ç)‘ãH)‰'tÖ:ZpBƒØ~/Öä ¹b‚†ä<·ÍySäw¥´œ¢µí]ÕÊîÒÒucÛ¹3°’¤Ów%,å ìݾî1ï¦Ð¾h]^¹›ÁZíÊ’Zòë]ª½Ô5'FæDm—DÁ‡¿È`F@¤ŒFG2 ep*ƒíƒà£DüTïÈ*¯HÞ¶Åü"¯_Z9(Tn¶Ý´]STDƒ¼;]‹dNVõf“W÷¤ÝÝê‘h}OŸgãÃ1NYÈMA\½î'NNQ±g~"Á³0«ìÅ“ ’ˆÑyz—7óš³ta:%ÏA·ü˜o¶¥j@1š&س„ñ0a@i)˜ADâ$Pq¹¥W!8\šÒDw÷žn9:fX%ñä .Lyf"{r/’ÀH¾áø±lŠ$ B!+ìchÙÂeœÆÒ±6ÒâÅxÛ±!j1ÞP¬‡Æx<Æ ÖAAfTX­†ÕÃë6hÜmÌÛ'¡ŒL£9Ë 1,ïÙ€d‚fX`¦ÂœÓßò9¹ú-o¥ôiû¾ì Ú¤H_½?¯ò|FvMY€¯šbÛQ3ëxr3¤’8ö#H+!ðtÒ í rõXcSG)ˆ!_žà2aĨHÀ€\ù c€7‚\ÇÁA¡4le™ã`é=qéSŽŒÙD‡aNë<êHd 5hê1NÔ{ËX éñ0َރܡh‘ "—qЉ@`ÈB·TqX¾MѸ6ÞŸ1ºS|ȳŽa³àDaà=0˰VgüövK¾¯äÅÆeþ¼ÙדÜÆÍpZ&Ì4˜2 <îM !½¥±Ié?¤QéFÕ%}³’»¾½)*U)¢‘¥ÌÛa\½î[æby9ô Sªzß7‹aø¼Ø4[9¨ú£GÏ>´ÜôÔ¶©·²'7ô|†ËÅt™} zsýêûw׿^¿z}óÓ¯ïþñæí’±Òx$¥«ç³?\ô˜ª]ñÒ7™¹ÎËVÎêŠÍÜ4IÌÅŠ Jă‰{»Vš¸Ve© (]LmdÕ @5%–Ž* ¶¤,~ÇÙE{R@̸ÎAI"ŽØêþÁ -Ë8¶•¡}Ë¥Oqtdž5Š;S<,ÈàF7ÒÄàAsŸ¨{c5l¤ÇÅät˜èã ‹LyŒL„ãylTX­†åÅÂ)oÃÆû3FwR,t­£Yã,ÄBÀ3…»wÌÍñ¿ ¯~O%Ïz÷‰Æ0+Š(Ǫj=ëë¢í Øí#ßÁÍ¥%ë¦ÞkåoU­Ð.¸?ã)y„qšÙÊ.LP‘dä\ñ‹Î’; ¡©!ÚKöÖûv+WE^ZÆ?ÓŒù(Ñ'XpA®™"„¼1»"ز¥©úÚ¶ï­-¯–êooí¥åÝÉUîYäö<¿}bÉŽ5ôuV·óʶeÓè›÷•ü¸õÌ•W“äÈ’`´@uC}Úc¸Æn.ÁšÜëdh(³‹šXˆû̸ZÑú·?>þ9¿%p÷^˜kµ¯ê ŠÛÝJ¿"hž±À¬yÙI(ºâÃ) `q Õ8ËØÑ|¹°–,N¶êõ.ëv›¯`w»ÎpÞ¶e~pÙ0§7wÚª¸°ö88û*9=!)¡uoíÕfÙFÂm¢ª;rïÅJ¾Ô÷5†€µÌJnp,Éá”G²‡5L_C¢@PÆàf%LlûÁ=“Çñ¦ž"Mq˜f pä}OÝú–>ªi*AÐüÀðŒW¬8J§/TÅ•h•óç †1–»i8•ÑCPþü 0î{a÷.(D–Áè³°ð’ çŸJ¢=µq뺑—=§Ísê*U5÷y5X_Å"ÕúŠÛé6‡©¯ N¦}rœ[yÑ(ÄJ€‰•g—š,MÅ×9,±Áøx€nÏÛ.dzs_¬×°ôª+—dÿ(ñ´Ã…‡Wuu¥%Îß·O(y³«N(£2>Ö²ÉÂ:‚z7уú‚Åaé"Ȥê>¡(BY2ÑaX~v `4ciôŸ{ŒÓ™q¢†ôx˜l‡©Ô¼¡h‘ "—qЉ^{ «Õ°¼ºñwÃÆû3FwJÝèYÇ°ÆÆY¨áþLyÞ²þÜÃÏÁ@A–½&g 2ˆ^QÌúððb΀Ó[ÿ±[=k?A·Â4¬\¦S®2 úqÑ”C’ûkº©#…ŠÒºäQmS1 Èu{6dA³Ë‘Qs¡ $ŽŠõìê³"À$<"Ãâ´%ªBàеÕYJÓ4›p?µŒ'ºkìÓ¼™dÊ21dÅÉ:q÷”Nàt oœ‘ë¢Ñ•¸–!âñX‘3>²È¾P@ñ± 8„yÒPmýСš³»ÇÊRÌt?¢gù̦8jù$ŒŽÌµ0Ú¡)ßïrx=4å5q«k MèÅëÓ ¯;&¡‘­l>¨rD3^¿šÎþ”!"´O×tñÝ/_.$ûÅɘÀzú8èv+¡²¾w¶³µ To [mLÐÃQ‰’ÏÚÂèØõnãÆóð£ßrÀÄ“Od0 в íU%p±ƒ;¶84_æ¯õ§$Ò”’ëÛ²X:„©¦t\7`—ö„ì'ø"©¾böÇ»fÿÈËþ8(Öƒú´ã°t*s©lâÑ'¤6Ÿ†ågÚ#x j¤LØï;’KâПÇäù‰ækñ¿î÷|“kÝ7Fh\úÛpUa»ßž,ÇKúÞ6weì””ïE³Æ6YÈø1Ä@§œq›ñ¾?mÕ«ïÛ›7/¾ûæÙ4ÒgRQÊÓØŠ!ÓŒÎá2‘ÂÐ,Ìb·Ö€ {~a^«ž‘ ²nŸLç‡0õKÌ0ðÝ_Ïod^–UY€KNE0A‘DCäP$V#ëép¸Om5Al ö9†®xSù¨U!´‘›Š‚ šÆb1‡þh¡ÆáÄD\a$æO®‹ª€<ŒÊv÷ G Ó"Ä!ÇG$LFǰ9³£û·;óGò÷K1SõŸÛ'ä]‰‰f\Ð0; >Ò‰…áæ_ q?"¡L)Õ'-6³FØŽšYD1 R8.ÌLz^—e½×•TK)dÎÝ$Ï®¨«vàIÈ"yQ t±ÙÖM§ïÍšÓáã‰ßÕ;ÛÙ¢i×Åj`øµ#N?leKò_²±}{Ûüm×Z©ê`õËOH·Øªûɹ±ðíò€Ol9YË=ÙÖEW½¤Aö®Í$y•lП©÷ï.ÿ î-Öñ endstream endobj 203 0 obj [ 202 0 R ] endobj 200 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 203 0 R /Contents 204 0 R >> endobj 205 0 obj 3008 endobj 207 0 obj << /Length 208 0 R /Filter /FlateDecode >> stream xœÍ]“Û6î}Ç37Ùt¼ E}'ÓëôcsM/m¯Ù½ëÜtû µéµneÉ‘äuw:ýï HI¶ë¾ô.m&H H€ä>ãðß•ú'É[l.>Íg‰`AL¤(f~âÅp§!È­n^Äý,öÇ*ªÕÂ2='Œó XÕ RWÓÊ!ð´(\gY­5f„Yþ$‹£ >÷»Bh;9»éïJÆÒÁUá,VQsN÷¤ýXþoʋřÇNU0ÍBœwy»–ì%ŒF^Â.o~xo‘nw{•lòN.Ý Ek1Οò¢ÌïK‡uQ¹ UáN3ÊgcåO½$RšGþtÕ®,åfÛ={`£i 1¬•%ɔǺÕ./Lž¥IM9·ùf[Ê£j?±ØJ_\tuólIõÊÂÏõ®±Ø×Ï[ÙÀy¢Tç„|$`Y´]SÜﺢ®<£$Ä x|ÕàÝ |Î}‘âÂoóES·'®[ûŠ΃d°” ¸Â5idÿg×v=Ò®ë¦[ì,aQo6yµ´Kér";·3󪇛… nË|ak¦–¼‚u\ü~],Öîºg«{3-›ºñzd´}=sr>>#«u®âòйE¶rQäe;óþñ¾òvÝ~-™·‡&?åM¡×¢AI@U>÷ȽìÁ]‹qA#®º¼RVå¶/ jX†ùXK¯'¼ëz°°ëŸdó<5™ò¾É`wZÑ0ðR8ŸÚÂK¹**9·„®¿ƒâáû²ÈFŸžg ôõ22ÖÎTÚŒ%Ì^}6;¬O+uëzïð·²0^qBêU'Ñ«GnÁmÞtÅbWæ¥}ÜçµÅptSãŠxd\ÚªPïÖ¥\Á¢Îâ‘Îïë39«~éšÜ¢òbPý(ñ’"‘¶ŒÝBDð 9Ô‡dQº‹ˆŽ.­3ɘ…×ñ»Ë£I%“ B‚H^9*TùÆ*œ5&ü5Vž}œÍ]~K‹ Ðå̓쬿Pò~¨ãÔÚÑøz,€(¦£m‹QvÎÀ`)IÖÝKoÊ(^„”ýhܡ$½wbÀ­xeâ‹&äÔ·x~d!ím·’Æ)´ ¼–#–}ÊËô,n^ñx’3ÅPqûx%`ƒ(?8‘ÝðȃªRTq`½Õ ¨ŽhÞÇN©p]T–¹Â¾µ¨~ÛŽ[nzfixpK,_. •›u®XV©Õû^ÿ`ÝÀI+¦$a`êKµãežŸ$*Óõ‘oë#¬%²È‹q¼¯8,‰JË« ?§ †™˜È Ò¨Žšê£r‘¤¤Œà‰—ôØPÅÔnc•àªb¨TiÙIºHpµ°ØÖP|¸HÛSø ÄÉÉøêœSú L€¤¡N”‚Ãû“—¢cÁU ²WŸ²Íó¾neÓ2vsýþúË[¦£óÛßË j*ëg)OåñB„ F˜eA†Ìçú¶/ê]¹VMSïµoà+¤RÈz×B¦¸Ü5ÊU—ÅjNYu ƒPQ=Õ‹\ù<÷eñxŽÃˆLë í-lE÷.#0Ìèpº ´Ï¥GιÀ'‡|>º•céQ⥾àV ™Jg# Uì€ñwªÚÿD—pŽM`~“+•HC—™jÓÌà(Æzã2Ö(„mrÊeTÊ«®('Ì£°©ïÉ<å¢ÿÈ5éè{>÷Ø—£uØ(Gë3 ý(0–fI¤ ýªJÕïH…¾šâ$Sy:$¬cFº¬àg”¶j~œMdiX]Ð'æÇÃŒûæçF1^äþ€BTÚOĈ‘W'g€ ïÁT°ÈD£á ©ùIF"ŒÔž4èLµØø|ÆÚÓ XIãœhDê“2"ÈÊ ï¦/hsOê—‹µ¾ß}wsýá–½ûîö{ÖÝ]sö´¸{Éþõùû^ßÜ]~ò«ÿÛœ½øäWñÛ‹»—ÓŽ^fKabøQÏül˜wÓIæ… '¸yY¨ãW°O™7]’›2Ò„vv`_Y:Ú=d{ûF½ PqÝ]ÂŽØçß}ÅòTåð”@®©~u"ûŠ÷‚ å¾HLª¡Tx%SÊUÌ{¨ª««®)žðW&H³ñqóÅ0 B˜“ú§Õ1x,¢£ß‰ÑrÌÀiëÉw]½0¦ú"Ï=ÕýYR 6Øm*ýÞÑÂjyH;õY%¦%_ˆ¡µLᙪߡ˜ÂS#ð¾ƒ/T¼Å× \ÔƒßËUí.XÊE±¤t)ôËG`íð‡* Ö©2•Ü{–pST éŠÉ>{wÍs@úÒMûŠfåÓd áU¦À t„ý/,Š¿@ØüÞ 1Ê\)ª¥”.«,ÒwuZ‡ÓÞO]Dš|o‘M½t†Ð´^9¢3´v½Á¾ÏtJ£Ã¼Ùà—Öÿ;¿ãA endstream endobj 206 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 207 0 R >> endobj 208 0 obj 3417 endobj 210 0 obj << /Length 211 0 R /Filter /FlateDecode >> stream xœÍ]sÜ6îÝ¿‚“—³=6-Qßéäfrפ—Ž“´±ï:7Ý>ÈwW>6’Ö››þ÷ J¤ÄÝíö¥wN2@A |¹p‰nů(a$«.¾(šK"F¼P‘‚¸ ˜TD!q“RLœ€bŠ=IU³Y“Ÿ.ê ‡|wñó/0)' È#›‡‹AxR/Œ“$Qº2êÆ±áÑ€¬"wï*F¾mäìA{ÁÈùŸkojä¹ìÿ@#‡¬.þöxq÷6 ®C—Ú\æÑ(;‡¡Obê±Dü0òX‘Ÿ/¾”MS^ýB¿¿x󨶆ë„ó0øQéA“Àw¦#†wtM…>õÊ؃*Õªßb`i ü}Ô Š•±x~<ÒR¦ðã'y@¡ñäüÀ°ýÔ©þd“Y§(dߌcùÏ‹ž\/€Ó¿|Ú.—¼½ñ~ÍëÙvÜa4ÅÝÛd., ¨ï%Žò,±w/a}ìÓ\¾ý÷O?¼~ÿf¤üœn6¼ÎÓÿe`ní„y|¸!¾Ã,î£nYSw}»Íôûfs¾,j½t„ª4kõ´]ѯµ…š|?"Íò A6-.šm7„q#ÆA0g¦4¹ ¤ê=¯ûŽŽ”×Ýæ¼ËÚâ‰ç#…—ß­yËoFR±Á}³á]Z÷#"Í¡xj°_ZVQ`:B?Þð²(ùˆ,.S½´ÙlšÎPÒVÀîÚ4ë‹g^îW7U]§ÏÜXlÙÐcÔóÇqcmˆ>z ÀìmºÓHÕäÆÔQÁ;ƒ®*,ojs ŒK5úý¶ë5ö´7™wŪ.ê•AÒ`VSpóÉDål ;zµ<Ç£^ w+ "Û ‹ËÅÕÑ‹ã¹Á‰¥ç˜¥J'¦Ôàr[Ã6µ¦pýxšk‚¼2ÃJë<}¦NËWÛ%@¦¡n&Õø‡¦/2®ñu³ÓÈÎØ¢* ¼²Ц¥AK[8pÊNÓZ7’×7hGÏ„EB{ñd{¾½“ëÿ¸¿fI|b©–ÖùŠxnLÆÇs£CаãŠx>;±TË.j cè3H£"\Çõ“1S„!ž[. ̉PŒ1¼ƒ—ižkx„Ê¢ï1IÔ˜¿[§½F0.ICN_ë¥ê-DD¿…ˆw_nªÄ ¥4ßñ ;¤˜)ôÄh’xŽëú‘m–»—'nxrbá(8kª ŠŽ¸Lü°]¾ö­¶w·I3ÃK¸2G÷à0þ#Á (kiZß5Û2'2aÁèÛ ‘ѲåݶìE•3D˜Çï(cÔ÷;ó}[¥”äwõõ‡oIº‡à9Û:ŠO0|1.ŒÄÖ¦–I|Êœf³g¿ùšVðd—º.%ïêçæ³ØUJT¾OÞªø:&ŸM|×DN˜D,ða¿¤]]C‚ó¸"¹€kArèB^Õr²„tñÖ¥b! q¼"FMI¥ ™9¬-ªŠÌ–mSiŒ§xU“[Cµ‡Æ`¼Ô0`ƒ>X,ê¡Vc£·+… ~â™¶­'ä‰õJmØ•c«aØ`ZNF¥5n4®4EdW”¥Æ†ŠE±j Xù bèjdm h¿D¯Á°è¹ÉÒÁ÷Õbp$ªÑ×uìŒÝ”EUô³5Y:”%ˆc9(St¶ãpfAcϼ.8ž’çÑXv§ì†t„‡ Øà±Æ„_U]‹Ø®©ÿ2AÛφí!… ΡdNl4*f”XH«9Z@i×hX4@Ò¢6 °Ê~ˆ"ˆܶQ2BÊâ3d>àZXM¶D)#Ïs§,ƒY²7“ê»!…3LâXIöÝ€&áLñ*Éœ°g3þ¦Æ€Jó&Saß–&ÂÆó£D‰¤Ž¤IÒik3‡ys­ÎI6G‹ jäD¢É’ú^s‡Ò‰ÀÏݵÝ„„Ö‰‰ïágÕ»&o í¾”úŠe"ˆ„A2Y÷i[Õ˜ +"L¿´×{ Ãz—E“åâç×ô9%·¿BÚ¤ýú®oî@ƒRA»ÝüóáͧW9z*øïªéûì@®ï왡GCÏŒKh1ò櫈 E_îI¿mk/ bAÚYˆ APD’‘8K;NêfîÈÁwÞ‹¼ÃÖ{âð^t¼'{ÞSB—k!â˜ä IˆŒby‘ƒ”^ÎÖX\Q[FÌl ظï°ðݧ×I ÃÇä©i>“ÇPõ a¿}cóÕ³e¼ ˆ¬|Õ´{›ÏÁ€ïƒ¢ùGºÌÁÜ3Àr@eÝ Ã1Ñøß£CÞ£0õ@#¦êDÒz¯‘TLE'^½Å•¦JóØ öd¬–©ý~HѱhA0/–²mÚc<´ÀSD`ÔAˆ¨Õ-$Üößg6|G9ÅÊÈ©º1`•e Ö#Uêî1U‰!¡1ªä‘MۆŚ ¼' øc¿ņM¹ >gß05 Œ}DØr0š¦4Óìs+JœÓ ˜lU‘ü3º!$Q;̬¯ûjó/¨ï_Iw”·Üº!ýñyyMðÑ…‚<†è`®ô< ¨êåðøÝÚœ [ÏëfQzË‘i&Eý÷Òÿ1Tû endstream endobj 209 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 210 0 R >> endobj 211 0 obj 3317 endobj 213 0 obj << /Type /Action /S /GoTo /D [21 0 R /XYZ 72.0 720.0 null] >> endobj 214 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 680.124 101.98 689.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 213 0 R /H /I >> endobj 216 0 obj << /Type /Annot /Subtype /Link /Rect [ 525.777 680.124 539.95 689.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 213 0 R /H /I >> endobj 217 0 obj << /Type /Action /S /GoTo /D [21 0 R /XYZ 72.0 648.8 null] >> endobj 218 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 668.124 243.974 677.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 217 0 R /H /I >> endobj 219 0 obj << /Type /Annot /Subtype /Link /Rect [ 525.946 668.124 539.754 677.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 217 0 R /H /I >> endobj 220 0 obj << /Type /Action /S /GoTo /D [93 0 R /XYZ 72.0 720.0 null] >> endobj 221 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 656.124 115.305 665.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 220 0 R /H /I >> endobj 222 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.295 656.124 539.87 665.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 220 0 R /H /I >> endobj 223 0 obj << /Type /Action /S /GoTo /D [93 0 R /XYZ 72.0 597.36 null] >> endobj 224 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 644.124 120.173 653.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 223 0 R /H /I >> endobj 225 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.243 644.124 539.866 653.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 223 0 R /H /I >> endobj 226 0 obj << /Type /Action /S /GoTo /D [93 0 R /XYZ 72.0 439.8 null] >> endobj 227 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 632.124 263.182 641.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 226 0 R /H /I >> endobj 228 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.48 632.124 539.67 641.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 226 0 R /H /I >> endobj 229 0 obj << /Type /Action /S /GoTo /D [48 0 R /XYZ 72.0 317.484 null] >> endobj 230 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 620.124 283.215 629.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 229 0 R /H /I >> endobj 231 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.482 620.124 539.65 629.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 229 0 R /H /I >> endobj 232 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 608.124 231.658 617.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 55 0 R /H /I >> endobj 233 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.454 608.124 539.788 617.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 55 0 R /H /I >> endobj 234 0 obj << /Type /Action /S /GoTo /D [54 0 R /XYZ 72.0 202.095 null] >> endobj 235 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 596.124 176.272 605.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 234 0 R /H /I >> endobj 236 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.345 596.124 539.857 605.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 234 0 R /H /I >> endobj 237 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 584.124 177.34 593.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 68 0 R /H /I >> endobj 238 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.351 584.124 539.801 593.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 68 0 R /H /I >> endobj 240 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 572.124 173.464 581.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 239 0 R /H /I >> endobj 241 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.34 572.124 539.802 581.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 239 0 R /H /I >> endobj 243 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 560.124 142.11 569.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 242 0 R /H /I >> endobj 244 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.372 560.124 539.928 569.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 242 0 R /H /I >> endobj 246 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 548.124 189.952 557.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 245 0 R /H /I >> endobj 247 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.455 548.124 539.867 557.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 245 0 R /H /I >> endobj 249 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 536.124 316.692 545.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 248 0 R /H /I >> endobj 250 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.578 536.124 539.606 545.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 248 0 R /H /I >> endobj 252 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 524.124 168.915 533.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 251 0 R /H /I >> endobj 253 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.387 524.124 539.862 533.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 251 0 R /H /I >> endobj 255 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 512.124 181.197 521.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 254 0 R /H /I >> endobj 256 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.362 512.124 539.8 521.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 254 0 R /H /I >> endobj 257 0 obj << /Type /Action /S /GoTo /D [67 0 R /XYZ 72.0 595.746 null] >> endobj 258 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 500.124 296.528 509.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 257 0 R /H /I >> endobj 259 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.703 500.124 539.792 509.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 257 0 R /H /I >> endobj 260 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 488.124 327.334 497.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 103 0 R /H /I >> endobj 261 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.65 488.124 539.676 497.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 103 0 R /H /I >> endobj 263 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 476.124 384.171 485.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 262 0 R /H /I >> endobj 264 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.834 476.124 539.678 485.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 262 0 R /H /I >> endobj 266 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 464.124 270.626 473.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 265 0 R /H /I >> endobj 267 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.521 464.124 539.73 473.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 265 0 R /H /I >> endobj 269 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 452.124 199.674 461.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 268 0 R /H /I >> endobj 270 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.4 452.124 539.837 461.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 268 0 R /H /I >> endobj 271 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 440.124 217.109 449.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 81 0 R /H /I >> endobj 272 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.462 440.124 539.791 449.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 81 0 R /H /I >> endobj 273 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 428.124 193.9 437.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 101 0 R /H /I >> endobj 274 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.447 428.124 539.847 437.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 101 0 R /H /I >> endobj 275 0 obj << /Type /Action /S /GoTo /D [156 0 R /XYZ 72.0 231.379 null] >> endobj 276 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 416.124 225.909 425.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 275 0 R /H /I >> endobj 277 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.49 416.124 539.793 425.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 275 0 R /H /I >> endobj 278 0 obj << /Type /Action /S /GoTo /D [108 0 R /XYZ 72.0 446.718 null] >> endobj 279 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 404.124 129.89 413.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 278 0 R /H /I >> endobj 280 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.351 404.124 539.944 413.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 278 0 R /H /I >> endobj 281 0 obj << /Type /Action /S /GoTo /D [108 0 R /XYZ 72.0 286.821 null] >> endobj 282 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 392.124 167.23 401.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 281 0 R /H /I >> endobj 283 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.413 392.124 539.893 401.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 281 0 R /H /I >> endobj 285 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 380.124 251.55 389.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 284 0 R /H /I >> endobj 286 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.566 380.124 539.836 389.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 284 0 R /H /I >> endobj 288 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 368.124 189.579 377.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 287 0 R /H /I >> endobj 289 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.418 368.124 539.887 377.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 287 0 R /H /I >> endobj 290 0 obj << /Type /Action /S /GoTo /D [144 0 R /XYZ 72.0 636.0 null] >> endobj 291 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 356.124 253.727 365.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 292 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.573 356.124 539.836 365.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 293 0 obj << /Type /Action /S /GoTo /D [144 0 R /XYZ 72.0 549.092 null] >> endobj 294 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 344.124 165.595 353.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 293 0 R /H /I >> endobj 295 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.408 344.124 539.893 353.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 293 0 R /H /I >> endobj 297 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 332.124 174.459 341.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 296 0 R /H /I >> endobj 298 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.438 332.124 539.897 341.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 296 0 R /H /I >> endobj 299 0 obj << /Type /Action /S /GoTo /D [168 0 R /XYZ 72.0 539.121 null] >> endobj 300 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 320.124 230.28 329.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 299 0 R /H /I >> endobj 301 0 obj << /Type /Annot /Subtype /Link /Rect [ 527.294 320.124 540.586 329.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 299 0 R /H /I >> endobj 302 0 obj << /Type /Action /S /GoTo /D [135 0 R /XYZ 72.0 696.0 null] >> endobj 303 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 308.124 195.121 317.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 302 0 R /H /I >> endobj 304 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.435 308.124 539.886 317.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 302 0 R /H /I >> endobj 305 0 obj << /Type /Action /S /GoTo /D [135 0 R /XYZ 72.0 535.839 null] >> endobj 306 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 296.124 156.742 305.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 305 0 R /H /I >> endobj 307 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.382 296.124 539.894 305.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 305 0 R /H /I >> endobj 308 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 284.124 159.31 293.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 161 0 R /H /I >> endobj 309 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.44 284.124 539.944 293.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 161 0 R /H /I >> endobj 310 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 272.124 265.025 281.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 187 0 R /H /I >> endobj 311 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.452 272.124 539.679 281.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 187 0 R /H /I >> endobj 312 0 obj << /Type /Action /S /GoTo /D [138 0 R /XYZ 72.0 641.7 null] >> endobj 313 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 260.124 161.898 269.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 312 0 R /H /I >> endobj 314 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.331 260.124 539.889 269.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 312 0 R /H /I >> endobj 315 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 248.124 224.522 257.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 145 0 R /H /I >> endobj 316 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.428 248.124 539.785 257.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 145 0 R /H /I >> endobj 317 0 obj << /Type /Action /S /GoTo /D [186 0 R /XYZ 72.0 475.22 null] >> endobj 318 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 236.124 167.78 245.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 317 0 R /H /I >> endobj 319 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.402 236.124 539.941 245.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 317 0 R /H /I >> endobj 320 0 obj << /Type /Action /S /GoTo /D [186 0 R /XYZ 72.0 181.764 null] >> endobj 321 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 224.124 255.344 233.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 320 0 R /H /I >> endobj 322 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.526 224.124 539.784 233.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 320 0 R /H /I >> endobj 324 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 212.124 163.34 221.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 323 0 R /H /I >> endobj 325 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.387 212.124 539.94 221.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 323 0 R /H /I >> endobj 327 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 200.124 367.083 209.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 326 0 R /H /I >> endobj 328 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.628 200.124 539.527 209.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 326 0 R /H /I >> endobj 329 0 obj << /Type /Action /S /GoTo /D [150 0 R /XYZ 72.0 646.5 null] >> endobj 330 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 188.124 317.512 197.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 329 0 R /H /I >> endobj 331 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.62 188.124 539.678 197.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 329 0 R /H /I >> endobj 332 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 176.124 200.634 185.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 157 0 R /H /I >> endobj 333 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.456 176.124 539.89 185.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 157 0 R /H /I >> endobj 334 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 164.124 239.577 173.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 169 0 R /H /I >> endobj 335 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.482 164.124 539.743 173.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 169 0 R /H /I >> endobj 336 0 obj << /Type /Action /S /GoTo /D [183 0 R /XYZ 72.0 222.938 null] >> endobj 337 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 152.124 241.8 161.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 336 0 R /H /I >> endobj 338 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.491 152.124 539.746 161.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 336 0 R /H /I >> endobj 339 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 140.124 217.636 149.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 190 0 R /H /I >> endobj 340 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.518 140.124 539.846 149.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 190 0 R /H /I >> endobj 342 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 128.124 221.223 137.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 341 0 R /H /I >> endobj 343 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.412 128.124 539.779 137.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 341 0 R /H /I >> endobj 344 0 obj << /Type /Action /S /GoTo /D [200 0 R /XYZ 72.0 136.974 null] >> endobj 345 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 116.124 158.32 125.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 344 0 R /H /I >> endobj 346 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.373 116.124 539.943 125.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 344 0 R /H /I >> endobj 347 0 obj << /Type /Action /S /GoTo /D [206 0 R /XYZ 72.0 675.941 null] >> endobj 348 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 104.124 149.99 113.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 347 0 R /H /I >> endobj 349 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.344 104.124 539.94 113.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 347 0 R /H /I >> endobj 350 0 obj << /Type /Action /S /GoTo /D [206 0 R /XYZ 72.0 309.486 null] >> endobj 351 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 92.124 195.131 101.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 350 0 R /H /I >> endobj 352 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.437 92.124 539.888 101.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 350 0 R /H /I >> endobj 353 0 obj << /Type /Action /S /GoTo /D [209 0 R /XYZ 72.0 517.95 null] >> endobj 354 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 80.124 165.217 89.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 353 0 R /H /I >> endobj 355 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.339 80.124 539.886 89.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 353 0 R /H /I >> endobj 356 0 obj << /Length 357 0 R /Filter /FlateDecode >> stream xœÍÝMs\É• é}þ ì†mÖŠr÷sü|,%•Tª±¬I™=³hëÄ„2aC Jÿ~üÜ 2îMM¼›ž©ê¶"¯ãëÁ¸~=þöM¿iëUÿÇsܼ~ûÍßž_×o|܈=¿jÚM÷“µ¸y{óüB̸ySáW¬äù²½ö¹>¿ðÓÍÿõÍÃ7íæß¾ùïÿcE?Ü´Ó¼ùÇ7m÷ÆÏoæ»oþ´Þù´“XdæóÇ:N=¢Þ…œlýáõÛ›ù÷·ãæ_·úÓG_o¨ýþÑùIÿ¿øˆêcÚÌ7õ±þŸŸ6ú¯þÃÔöõùâÛâóë_^»þ¿žäüºõšÓ˜ë×zó,ñüë?|úãÜ>³óÿýÅÏäùM}±øòëº}Šÿ+ßy»ùñ›ß|ÿÍ¿ü~Þôvóý__þ¹œBZk=dý§SŒ¬ÿ7ß¿½ùï¯îïïÿËÿ¸ùþÿæwßï¾/þñvžõ¾?ZRß1#êóøê³ÛŒýù“:NßßþåÍÝÍã_o~ûøðt÷ðôáü|iÚøÉ›­7:â¼øïïþzûúî¼äs8ò”^ïaê~ÉÍYIŸ§¼yu±LÖO©ŸÉ–­Ï4ëS•ƒe§‹X‰…ÄFâñ$ž$['±®x}ØWÄbo$‰Ä1H}øê//<ýtÿÅúáñõÇ·wO»©I?¥Kf¶±Ÿ/ËF3ëëÐÖ÷"Z§i3S‡í—ÍhH­¨vRgCµ ÚP ® ©'ª‰eÍhHM,kFêA,kFCjbY3P ²d)ÈR‘¥"KE–YNd9Ër9~2Íh@mÕÕAjï¨VT;©£¡ZP,Y&²Ld™Ä²f4¤&–5£u'–5£!5±¬ ¨±¬ ©‘¥ KA–‚,Y*²Td©Èr"ˉ,'²4diÈÒ¥#KG–Ž,Y² dÈ2‘e"Ë$–5£!5±¬ ©‰eÍhHM,kFêA,kFCjd)ÈR¥ KA–Š,Y®Çö¦™) & 5¡IµÖõ`„òOVùièhMÞÙ~>Ój‹å×Q?Ç?Roþ»¿½ùþññÍîk{’6k[f߯ÿbõå2[ŸQ_i$YV—Fnëëg¶_vùÅ®+£ëc#q‚¸.‹®×wSÍâDãŠ8@\×D×ÇJbq]] ‰Ä ⺺>&‚I{#„½ÃÞbïD±þ*“š8öN û ’}Ê^—Bõ÷|Ƽ¢®K!P+ªÔÚP-¨6T'©ç@õD5²4diÈÒ¥#KG–Ž,Y² dÈ2‘e"Ë$–£ËшåhÄr4b9:±XŽN,Ç –cË1¥ KA–‚,Y*²Td©Èr"ˉ,'²4diÈÒ¥!KG–Ž,Y² dÈ2‘e"ËD–I,¥KiÄR±”N,¥KéÄR±”A,eKÈR¥ KA–Š,Y*²œÈr"ˉ,'²4diÈÒ¥#KG–Ž,Y² dÈ2‘e"Ë$–Úˆ¥6b©Xj'–Ú‰¥vb©Xê –:ˆ¥¢¹¢¹¢¹¢¹¢¹¢¹¢¹¢¹¢¹Îy²u;ùÁ ïŸü~b»=m¶.*hÝú ¥e¦LûûˆøºùþýÏç7§¸yõï—{[×USw9ƒ±[ûÅ‹eëò)¬¯eÍвõ7AëLÏý²Ë¯u Í®Žkfv}¼þh®Ïùàƒßµ~}[㲫[­6¯okLvu;A×·5 »ºn Üê¹:ÀÄÀ®Žï1Ы¿º×ÇøÕÑ &‚5«¿ÿ3ýšZPm¨NR×D ÔÕAêÙQ­¨vR²4diÈÒ¥#KG–Ž,Y² d™È2‘e"Ë$–ÛM! &–ÛM!××Xn7…€šXn7…€šXn7…€Y ²d)ÈR‘¥"KE–YNd9ÏyÖ#¹¦NRÛ@õDuÚ;ªÕNêh¨T#Ë@–‰,Y&±Ün 5±Ün ¹¾îÄr»)ÔÄr»)äúzËí¦P#KA–‚,Y*²Td©ÈR‘åD–YNdiÈÒ¥!KG–Ž,Y:² dÈ2e"ËD–I,µKmÄR±ÔF,µKíÄR;±ÔA,uKÈR¥ KA–‚,Y*²Td9‘eý´_y®Ëûú—ÿÛï?Öv˜Y÷åï?vë~ÿ±~‚}Ýüñãûwîþëv_Ë<éÍ«ß>þýîýí_½ê§Û‡ï>¼¼âþáåÏ¿¹ûéöï÷ïw…~ê1Z³8x·/ËwËô嘲ÌO–­µuU¸_¶14T ª ÕIêõ#ŽÔÕAêõ#ŽÔŠjd)ÈR¥ KA–Š,Y*²œÈr"ˉ, Y²4diÈÒ‘¥#KG–,Y²Ld™È2‘eËÚìIjbY›=A݉emö$5±¬Íž¤&–µÙ“ÔÈR¥ KA–Š,Y*²œÈr"ˉ,'²4diÈÒ¥#KG–Ž,Y² dÈ2‘e"Ë$–µÙ“ÔIJ6{‚ºËÚìIjbY›=A=ˆemö$5²d)ÈR¥"KE–Š,YNdYÏ@°²wé.ÕkÖ¡±Ê–I–­Ÿÿ.ÚZøÁ²ËQ‡Fíp»u¼¹}ªãNÏsŒm;éíÃ//<Ÿ¸ñòŠ¿ß½ÿpÿøðEÿºf#w?ì.ûitÍ4Ñý»}Y½[¦'½5m‚–­oŰõÞÔöËöÓ Õ‚jCu’ººz¢:H]Ý@­¨F–YNdYÝÂ[ï>®©“ÔõÐ ÔÕAêzèjEµ“ººZP,Y&²Ld™Ä²v%šXÖ®Pwb)XÖ®RËÚ•@jbY»@-ÈR¥ KE–Š,Y*²œÈr"ˉ, Y²4déÈÒ‘¥#KG–,Y²Ld™È2‰eíJ 5±¬] ¤&–µ+ÔIJv%€zËÚ•@jd)ÈR¥ KA–Š,Y*²œÈ².Ôuã þÅëÌóuzÏT#—§Ûuz÷\ÝÁeÇØ_§×m]_G¾{}÷ðTï!ÛIn^ýþãÃë§u!~ûæåuÏ[.Þ\¯ë’YOáâvð†_–_®39µºa³v uvZKÖº9Ö]BÔ 3$÷ÁòÉò@yt–+ËåKåÂr¦šHµîA9R­»gHÞ‘ê6²"9R­YÊ‘jM«PÎT…© S¦ªLU™ª2ÕÉT'S¥*9Ž~â ®Hnƒå“årï,W–;Ê£±\XÎTƒ©&SM¦šHµÆX(Gª5È"yGª5ÊB9R­aÉR­qÊ™ª0UaªÂT•©*SU¦ªLu2ÕÉT'S5¦jLÕ˜ª3UgªÎT©S ¦L5™j2ÕDª5çB9R­IÊ‘jͺPŽTkÚEòTkÞ…r¦*LU˜ª0UaªÊT•©*SLu]´Ù25œÌu¶Ù×ÔVO™‚Ö­ë…˜vž™í×ÉÁôk\žZöŸwÿØnøYòýæÕïïnŸ>¾ßºÖÃÀᣞÆÞÆo`·Ð×G82-„-¬IHfô~°p7©IÉå5) ¹°ÜX¾¾YjgÒt½&¯IÉ'Ëå5) ¹²ÜQ^“’ ËåLÕ˜ª1UcªÎT©:S ¦L5˜j0ÕdªÉT©Ž†TGCª£!ÕÑ‘êèHut¤::R©ŽTÇ`ªÂT…© SU¦ªLU™ª2ÕÉT'S­IA=&h‡Úö£ÝÎre¹£ÜË…åÆòDyM H>YÎT“©&SM¤* ©JCªÒª4¤*©JGªÒ‘ª ¤*©Ê`ªÂT…© S¦ªLU™ª2ÕÉT'SLÕ˜ª1UcªÆT©:Su¦L5˜j0ÕdªÉT“©&RÕ†Tµ!UmHU;RÕŽTµ#UHURÕTu0UaªÂT…©*SU¦ªLu2ÕuuൠÅ'›¯ÖäxýÃVí` ë(§1ŸGÕ»…º»8ÚŽi÷¶VˆÍsôýOwçwÐOóæÕonßùâÜ?Ü¿ýøv7ž§ú²l÷.îßâëw ãs}¢ë1[¸û‰×M¦>î'Óåòõ…F¹²ÜQ¾ûI=uùìãª\Xn,O”¯Ç~(Ÿ,”¯Ç~(W–;Ê©S5¦jLÕ™ª3UgªÁTƒ©SM¦šL5™j"ÕÚŒr¤Z;IÞ‘jí@F9R­È(GªµåLU˜ª0UaªÊT•©*SLu2ÕÉT'S5¦jLÕ˜ª3UgªÎTƒ©S ¦L5™j2ÕDªµåHµv “¼#ÕÚŒr¤Z;I>jí@F9S¦*LU˜ª2UeªÊT•©N¦:™êdªÆT©Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHµv £©Öd”#ÕÚŒr¤Z;I>jí@F9Se³%e³%e³%e³%e³%e³%e³%e³¥$‡¬"&›¯nƒäÙϧ롅µÙVëÒ΃A²Î‹èOŸÎçý÷6Nþù ¼ç—¾{wûú`KòykvZäÁ›übùn¡ž2ÛóŒÆiv_ ýè“Ø†;Ë•åŽòz¶@’ Ëå¹òhmŠ_“×3’|²jí`F9S¦*LU˜ª2UeªÊT•©N¦:™êdªÆT©Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHµv0£©Öf”#ÕÚÁŒr¤Z;˜I>jí`F9S¦*LU˜ª0UeªÊT•©N¦:™êdªÆT©S5¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘jí`F9RÕ†Tµ#UíHU;RÕTu UHUÙlIÙlIÙlIÙlIÙlIÙlIÙlIÙli<÷‘#ÐTu<ÞLnƒgoMåhƒçéÑïÞþåî‡î~¼ˆ×ãÿÞÛúë«ÎO;vU×sâÊZ8®ó¾×H:Ö]~­k' ¨Õ†ê$uíBõDuº~y€re9âìyöŽ@{G¢½#Ò>iµ×”9ÖÏ kâÚr}¬$v×Þ“ëc!±‘8A\{N®'‰‰ A#‚F:t"èD0ˆ`Á ‚I“&¬'\1¬§[1¬'[1¬§Z¿>@°žhÄDPˆ A!‚B•*T"8‰à$‚óü¸&үʭ±\Xn,O”û`ùdy <:Ë•åL5™j2Õdª‰TëÉÖQŽTëéÖIÞ‘j=á:Ê‘j=å:Ê‘j=é:Ê™ª0UaªÂT•©*SU¦:™êdª“©N¦jLÕ˜ª1UgªÎT©S ¦L5˜j2Õdª‰Tµ!UmHURÕŽTµ#UíHU;RÕTu ULU˜ª0UaªÊT•©*SU¦:™jaRÏ/îíh¶÷ËÃïí7u¸t¸°Î0Ii½«,<ú €åEôŸ¿úáþû7·?ßþåÍv€I=‹ÜÍ«ï~·ßs¾Te]-Iê²{[/‹wsÌ~ÒQÏt“­ÓSVCÖíÇ¥ŽòuuêË »*–ËåëZå“åòuÅre¹£Ü˜ª1UcªÆT©:Su¦L5˜j0ÕdªÉT“©&R­ó?PŽTëü’w¤Zç ©Öù(GªuþÊ™ª0UaªÂT•©*SU¦:™êdª“©N¦jLÕ˜ª1UgªÎT©S ¦L5˜j2Õdª‰Tëü”#Õ:ÿƒä©Öù(GªuþÉR­ó?PÎT…© S¦ªLU™ª2Ueª“©N¦:™ª1UcªÆT©:Su¦êL5˜j0Õ`ªÉT“©&R­ó?PŽTëü”#Õ:ÿåHµÎÿ ù@ª:ª¦ÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfK5„M÷ççÛ»~Òøü „VPƒuu½ £5‹£éêÑ6úEôÛÇ·ï?žOüXƸyõúñíÛÛ‡>¼¼æñý?û¯ÿ¸úéå¥woïõúñÍãÃåü¶®û,×GÛåèyy€uÖÈ ´n] †ÛóH|·îèJåÆòDym¯'ùdy |] ¢\Yî(¦L5˜j0ÕdªÉT©Ö• Ê‘j] ’¼#ÕºD9R­+A’¤ZW‚(gªÂT…© SU¦ªLU™ª2ÕÉT'SLÕ˜ª1UcªÎT©:Su¦L5˜j0ÕdªÉT©Ö• Ê‘j] ¢©Ö• Ê‘j] ’| ÕºD9S¦*LU˜ª0UeªÊT•©N¦ZÏ?«*䚥®§Gk#Ùºu½Pwã®K«£uGW‚yyXä¿Þ}ø¿ŸßïùÕu%÷Óãû§×Ÿ.¯ãê×Õ}¶Ú1tðV>/¿XÕë,ë)„z]ƒerÊœÏϪ³[vùuï5q"y¢¼&N$Ÿ,”×ĉäÊrGyMœRŸJ½"–Ëå5q"ùdy ¼&N$W–;Ê©S5¦jLÕ™ª3UgªÁTƒ©SM¦šL5™j"Õm7ɑ궛 ä©n»™HŽT·ÝL$GªÛn&’3UaªÂT…©*SU¦ªLu2ÕÉT'SLÕ˜ª1UcªÎT©:S ¦L5˜j0ÕdªÉT©n»™HŽT·ÝL ïHuÛÍDr¤ºífù@ªÛn&’3UaªÂT…©*SU¦ªLU™êdª“©N¦jLÕ˜ª1UgªÎT©:S ¦L5˜j2Õdª‰T·ÝL$GªÛn&’#Õm7ɑ궛 ä©n»™HÎTÙlIÙlIÙlIÙlIÙlIÙlIÙlIÙli;TR-CkóÓÕÛí†Ò°Uj'ËêjaÔ;޹Ÿ`×Åý×Ñ··uœäù]´“ܼúpûöÝù¾ÒçWüpût{0î¹>àõiîßæk¦ÁõÜPké„ í4šœ‡üû…û¹p¢|=”Cùdy |=”C¹²ÜQ¾Ê¡\XÎT•©N¦:™êdªÆT©Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHµD9R­ƒQŽTë0A”#Õ:Pä©Ö¡‚(gªÂT…© S¦ªLU™ª2ÕÉT'SLÕ˜ª1UcªÆT©:Su¦L5˜j0ÕdªÉT“©&R­£QŽTë¨A’w¤ZG ¢©ÖQƒ(GªuÔ Ê™ª0UaªÂT•©*SU¦:™êdª“©N¦jLÕ˜ª1UgªÎT©S ¦L5˜j2Õdª‰Të¨A”#Õ:jä©ÖQƒ(GªÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÛ\xfká‰æžÛdØzÖš-ÜžlH3Û8úfÃýò<ÂïnŸî?üõççñ𺉛WßýíÍ÷oþ·/¯úí·¿þî»?þúû?¼¼êÏwûxÿþîíÝÃn+t]-Ïáë3Š8xŸ/oãà²ÙÌZkâh]mçoz>Êp¿îèúåÆòDymç'ùdy ¼¶ó“\Yî+_ÿHM»¦¶†jAµ¡:IíÕÕAêè¨VT#ËD–‰,Y&±¬ fR˺\u'–u±LjbY—ʤ&–u¡Ljd)ÈR¥ KE–Š,YNd9‘åD–Y²4diÈÒ‘¥#KG–,Y² d™È2‘e˺&5±¬«aPwbYפ&–u% êA,ë:˜ÔÈR¥ KA–Š,Y*²¬'S·ºyQ.ñòJ×Ã|ÿ|!LÖ­¯ÓúVn¢ã`]o—}lwÈ|]ýúõ뻞¯Oë Þ¼z|óÃÝû—ÿðÝŸ¾ý×ß¼¼ü¯·O·¹ýp÷áåUŸÏbò/®owW'ó$ÏOú{ðq¼,ß­‹“öžál™õ“F>_¼ïÖí¯A”åŽro,–Ëå1X>Y(O¦šL5‘ª4¤* ©JCªÒªt¤*©JGª2ª ¤*ƒ© S¦*LU˜ª2UeªÊT'SLu2UcªÆT©Su¦êLÕ™j0Õ`ªÁT“©&SM¦šHURÕ†Tµ!Õõ‹åHU;RÕTu UHUS¦*LU˜ª2UeªÊTëêÈûÊÓÉùº:ª_Â¥$[¶®‡Æó¡¸ûu‡Gzy€Ñ¯ß½ûÕ‡ww¯ïÿzÿºÞÓúרn^ýöÍí‡uùó__^ó»·¹û¡îùâu·çÃmÏ/<<>üê?¿»{¿®¥^^ûùJêàÁY÷–õÅ=ø¨^ÞÀÁ£´f–aíè³ù'ëü´®ÊZ~°ìh@MjAµ¡:I]Ç=€z¢:H]g=€ZQ,'²œÈr"ˉ, Y²4déÈÒ‘¥#Ë@–,Y²Ld™È2‰e ¨IM,k@ êN,k@MjbYjPbYjR#KA–‚,Y*²Td©È²îÄψÔC°õ·c=ÜcëÖc0i­·ÃÇ1½<›»ó!ï?<½¿ÿËǧçµ[=+ìóŒùåŸFÐç—~~üøþå¥õ0n÷¬®ëƒçƒ5÷ïôeí到~‡õé6c´nžº®‡£ó`Õn¹.Þ®×¥ˆ•Äâõ¨ÄBb#q‚x="1"¨DP‰ ÁI'œ%ëçÀ¸.O”Û`ùdy Ü;Ë•åŽòh,–3Õ`ªÉT“©&R­¿PŽTëÀ/’w¤Z~¡©Ö_$HµüB9S¦*LU˜ª2UeªÊT•©N¦:™êdªÆT©Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHµüB9R­¿PŽTëÀ/”#Õ:ð‹ä©Ö_(gªÂT…© S¦ªLU™ª2Õ:%¢î2Jwr\c†9Z¦µdëê™úÖ•ùH=Xw8f°Ë»¹¾(dÖïxîïž>½ôÇßîæu+•¯boìÓºËEõ€ÃÖ¢®h•žl®U–G«.¿úu:É×ã” Ëå‰òõ¸å“åòõ¸åLÕ˜ª3UgªÎT©S ¦L5™j2ÕDªu:Ê‘jN…r¤Z§S¡©ÖéT$Hµî·E9S¦*LU˜ª0UeªÊT•©N¦:™ê,UÉì~Mm Õ‚jCu’Úª'ªƒÔÑQ­¨F–‰,Y&²LbYw×’šXÖݵ îIJî®%5±¬ÍK¤&–µy‰ÔÈR¥ KA–Š,Y*²œÈr"ˉ,'²4diÈÒ¥#KG–Ž,Y² dÈ2‘e"Ë$–µy‰ÔIJ6/ºËÚ¼DjbY›—@=ˆem^"5²d)ÈR¥"KE–Š,k«j¯³‹ Ïj¦X÷œn»Ç¯_ä§ÈmL7VíŠuò“_Þ~ûçßÖ[moúïïÏÏp~éן~º{xº}ûtÿøðòúïîž>¾ÛMÄæ©·XowÊÁ;yY¼[Ww Øó¡W`]PT÷0O̓uû™²ÜQ^G‘\Xn,O”×1E$Ÿ,”S ¦L5™j2Õdª‰Të‰@QŽTkßÉ;R­½(GªµÿåHµö¢œ© S¦*LU™ª2Ueª“©N¦ZG}>`ñŠbžÆÍ«xsÿp÷òòó^ÅíÏ_ïNÜͱ䔵Ñf¼›—·²[ç§a½&¨‰ÖÕmT]Z³ÃuûÉ–°ÜXž(¯[©H>Y(¯»©H®,w”'SM¦šL5‘jíD9R­€$ïHµv¢©Ö@”#ÕÚˆr¦*LU˜ª0UeªÊT•©N¦:™êdª“©S5¦jLÕ™ª3UgªÁTƒ©S ¦šL5™j"Õ*PŽTk É;R­€(Gªµä©Ö@”3UaªÂT…©*SU¦ªLU™êdª“©N¦jLÕ˜ª1UgªÎT©:S ¦L5˜j2Õdª‰Tk Ê‘jíD9R­€(Gªµä©Ö@”3UaªÂT…© SU¦ªLuöS—úÍ·¢¹Ž~ùdh]=åíh½Íƒe‡³°~yà·?þxÿðãEZo8žoÞ¯©¨¯«gÙ}Dëß”)R‡N¶nžº[«÷Ë.¿ÌuùÕq@~}¬$v×Ùã×ÇBb#q‚¸Î¿>&‚I{#„½ÃÞbïD±wÂØ;qì@öA$k§.©Ër~M^‡~’\Yî(¯SÆI.,7–'Êë”q’O–3UcªÆT©:Su¦êLÕ™j0Õ`ªÁT“©&SM¤Z;tQŽTk‡.Ê‘êèHµv袩Ö]”#ÕÚ¡KraªÂT…© SU¦ªLU™êdª“©N¦jLÕ˜ª1UcªÎT©:S ¦L5˜j2ÕdªÉT©Ö]”#ÕÚ¡KòŽTk‡.Ê‘jíÐE9R­º(gªÂT…© SU¦ªLU™êdª“©N¦:™ª1UcªÆT©:Su¦L5˜j0Õ`ªÉT“©&RÕ†Tµ!UmHU;RÕŽTµ#UíHURÕT•Í–”Í–”Í–”Í–”Í–”Í–”Í–j‡®·hÍ£ä¿<—ß ½uéúi…ÑŽ~ëÐmw¹³mbøºú÷‡§»÷·¯Ÿîÿ¾íÎím½ŸÿöáöÇ»ýìyÔ/Dìà­|^ºB×”³~ô¾iU_$ÇvüAŽƒeûódy |=’D¹²ÜQ¾I¢\Xn,ÏÓ¨ß`­‡”×äë‘$Ê'Ëåë‘$Ê•åŽòõ£åÂrc9S5¦jLÕ˜ª3UgªÎTƒ©S ¦L5™j2ÕDª£!ÕÑêhHut¤::R©ŽŽTÇ@ªc Õ1˜ª0UaªÂT•©*SU¦ªLu2ÕÉTç󣥘Gáö“àÎre¹£ÜË…åÆòDy –O–3ÕdªÉT©®«–#UiHUR•ŽT¥#Õu‰òTe ULU˜ª0UaªÂT•©*SU¦:™êdª“©S5¦jLÕ˜ª3UgªÎTƒ©S ¦šL5™j2ÕDªÚª6¤ª ©jGªÚ‘ªv¤ª©ê@ª:ª¦*LU˜ª0UeªÊT•©ÖóiÄÈœÖÁvÛ.ßײõ¹£e~Êe—ÒÆÄ»‘´ÆvoÚ×Õw{óýãã›mKþ¨¹÷oß¾½}øáWß~:Bb{íï~¸Ú絛̀s>Ÿ‹·Û/Ëw’q _-{gËìÔs¥ÙÞÝцäõ =’O–Ék ƒre¹£¼~¡Gra9R­1 ÉR­1 Ê™ª0UaªÂT•©*SU¦ªLu2ÕÉTk³xZëª×ÔµWÔŠj'umµ ÚP¤®Mâ ž¨F–‰,Y&±¬Á ©‰e]HM,kèBjbY#PbYR#KA–‚,Y ²Td©ÈR‘åD–YNdiÈÒ¥!KC–Ž,Y:² dÈ2e"ËD–‰,“XÖX…ÔIJ†* îIJF*¤&–5P!5±¬q ©‘¥ KA–‚,Y*²TdYSu•Ö»:™ÔešÕÍúƒ­ÛNhÍçÑûë~0HÑË“:Ÿç&çaͨà ¾ÿùÝþ¹†Ö7õôõ®†½‘/V_.¬G3ë3K¯íbh¡žl<ÏZvëvcŠ::ãúºNε ÚP¤®S3@=Q¤^ßê¤F–Y²4diÈÒ¥#KG–Ž,Y² d™È2‘e"Ë$–Ûé« &–ÛÙ«××Xn'¯‚šXn箂šXn§®‚Y ²d)ÈR‘¥"KE–YNdYg­.¢˜¡Wå‰ò:k•ä“åò:k•äÊrGyµJra9S ¦šL5™j"Õí¬U’#Õí¬Uw¤Z7¡©ng­‚| Õí¬U’3UaªÂT…©*SU¦ªLU™êdª“©N¦jLÕ˜ª1UgªÎT©:S ¦L5˜j2Õdª‰T·³VIŽT·³VIŽT·³VIŽT·³VA>êvÖ*É™ª0UaªÂT…©*SU¦Z{Çj‚µD¾óî±zz£ápaí«†õè<{Ú塬¿{ûñÍíÓ§§Zßi7¯þóñáWw:ŸÿÃÛÇ.ït®™‰oµl÷¶_VîVÍS«oÛ§LÖÅiýK·Ò)ëöËÎre¹“¼Î‹C¹°ÜXž(_?Q>YŽTë¼8”#Õ:/ŽäÂT…© S¦ªLU™ª2ÕÉT'S¥š­…ç5¹5– Ëå‰r,Ÿ,”Gg¹²œ©&SM¦šL5‘j‡r¤ZçÅ‘¼#Õ:/åHµÎ‹C9R­óâPÎT…© S¦ªLU™ª2ÕÉT'SLu2UcªÆT©:Su¦êL5˜j0Õ`ªÁT“©&SM¤ZçÅ¡©Öyq$ïHµÎ‹C9R­óâH>j‡r¦*LU˜ª0UeªÊT•©Ö޲iqøpÿÛŽ2_µ‚ (¾ÞQ¶[×cw±³¥¿®¾ÚQ&§y¼£l=Êœ9[ëc¼/_®óSÝr˜^ÏŠÖõšËÚ|>·l·p7娹,Éå‰òšË’|²’+ËåÆT©S5¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘ê¶ÃäHuÛãòŽT·]~$GªÛ>?’#Õm§É™ª0UaªÂT•©*SU¦:™êdªóùÑÒv<Åy¢ÜË'ËåÞY®,w”Gc¹°œ©SM¦šL5‘ê¶çäHuÛóòŽT·=$GªÛž?¤ºíù#9S¦*LU˜ª2UeªÊT•©N¦:™êdªÆT©Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHURÕ†Tµ!UmHU;RÕŽTµ#UHURÕÁT…© S¦*LU™ª2ÕÚó矶‚!ì¶ç¯yF²áí×GÆíÎ¥ãò`¹ïÞݽ¾¿}s~/픟όÛÝì¼.öµ6Ù¤ÉÁÛùâ ìÎSZÔ]Ò.Ì“ºezÝ^½[x4Fùdy |ýE¹²ÜQ¾þΪŸ÷e^ ‰Ä b$ž$ÏNb%±ƒØˆ A#‚F:t"D0ˆ`Á$‚I“&¬ù.ˆ`Ív¯;¬¹.ˆ`ÍtA kž b"(DPˆ A%‚J•N"8‰à´íäH¿.O”Û`ùdy Ü;Ë•åŽòh,–3Õ`ªÉT“©&R­Ù-Ê‘jÍnIÞ‘jÍnQŽTkvKòTkv‹r¦*LU˜ª0UeªÊT•©*SLu2ÕÉT©S5¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘jÍnQŽTkv‹r¤ª©jGªÚ‘ª¤ª©ê`ªÂT…© S¦ªLU™êº2Èõø-¦¡å6º]?u"ÆÑ îŸ-¬Ù­e¶ôƒ…=f·yy–e=ǶkYOýæÕo>þõ¯wï_^þ——?þáþÃÓãûŸ_^ñK3Þzʺù<<ÞßËúÝ\¨N%XŸim[&Ëô”6Ö%–­ÛOŸåë_&” Ëå‰òõ/Ê'Ëåë_&”3ÕDªuç<Ê‘jÝ9r¤ZwΣ©Öó$HµîœG9S¦*LU˜ª0UeªÊT•©N¦:™êdªÆT©S5¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘jÝ9r¤ZwΓ¼#ÕºsåHµîœG9R­;çQÎT…© S¦ªLU™ª2ÕÉT'SLu2UcªÆT©:Su¦êL5˜j0Õ`ªÁT“©&SM¤ZwΣ©Öó$ïHµîœG9R­;çI>jÝ9r¦*LU˜ª0UeªÊT•©ÖÕÁ”ÖÖƒ22¨ÑYÏú«­™L¶.NkIké~°nŒË>¶aï×ÕWwη“~g]êi€ž‡Pû·òÅòݺ:gr²5õ$p#2ýè#Þ8êIà@m¨NRדÀz¢:H]OjEµ“Ú¥!KC–†,Y:²tdÈ2e ËD–‰,Y&±¬v¤&–µ×ÔXÖn;RËÚoGjbY;îH,Y ²d©ÈR‘¥"ˉ,'²œÈr"KC–†, Y:²tdéÈ2e Ë@–,Y&²LbY›íHM,k«¨;±¬v¤&–µÍÔƒXÖ&;R#KA–‚,Y*²Td©ÈR‘åD–YNdiÈÒ¥!KG–Ž,Y:² dÈ2e"ËD–I,k/©‰eí¤#5±¬}t¤&–µ‹ÔƒXÖ:R#K4÷Q4÷Q4÷Q4÷Q4÷Q4÷ÙöÎI«Ó' ÑΛçt­›t¡¯÷¸>¾)G ÇÜ]«lßB_Wüöü¬žLåöÃ…ž\ו¼¹¼…/Ö_®‹ÓzÔÖêÎq´nýÌ ›u[o?Xwù…_?³Hí¤®/<Ê…åÆòDùúÁ…òÉò@ù@¦u#8Ê™ª0UaªÂT…©*SU¦ªLu2ÕÉT'S5¦jLÕ˜ª1UgªÎT©S ¦L5™j2Õdª‰Tkœr¤Zm’w¤Z#m”#Õj£©ÖXåLU˜ª0UaªÊT•©*SLu2ÕÉT'S5¦jLÕ˜ª3UgªÎTƒ©S ¦L5™j2ÕDª5ïF9R­‰7É;R­™7Ê‘jM½I>jͽQÎT…© S¦ªLU™ª2Ueª“©N¦:™ª1UcªÆT©:Su¦êL5˜j0Õ`ªl²$l´$l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶´ :Zk.ƒk@.ÑÏOtÅÖÝåçg?Xx8 —ËóC/žùûrÄí§óÌ¿f÷»µçmÌî·©†d†v¶î‹çE߯;vƒzû-É…åÆòDyvAòÉò@ùúVC9BÝN=¹0UaªÂT…©*SU¦ªLu2ÕÉT'S5¦jLÕ˜ª1UgªÎT©S ¦L5™j2Õdª‰T·SRIŽT·“RAÞ‘êvZ*É‘êvb*É‘êvj*É™ª0UaªÂT•©*SU¦:™êdª“©N¦jLÕ˜ª1UgªÎT©S ¦L5˜j2Õdª‰T·“TIŽT·“TAÞ‘êv’*É‘êv’*ÈRÝNR%9S¦*LU˜ª2UeªÊT•©N¦:™êdªÆT©Su¦êLÕ™ª3Õ`ªÁTƒ©&Se£%a³%e³%e³%e³%e³%e³%e³%e³%e³%e³%e³%e³%e³%e³%e³%e³%e³¥mØ3ÃDЀwÛ ~YM£ÿÙB?­0#ÚÑÂa—}lŸÓ×Õ¿ÝÿýþáÇz'uÏÍ«ïþôíË /~úéîå…/ަ8¿âÛû‡ËAyÍ*ÖçTáÁû}Yz0³xÙCNÖåiÆXZóhÝÑðå“åòÞY®,w”Æra¹±œ© S¦*LU™ª2Ueª“©N¦:KUZóèWå‰r,Ÿ,”{g¹²ÜQåÂr¦L5™j2ÕDª5¼@9R­áÉ;R­áÊ‘j /H>j /PÎT…© S¦ªLU™ª2Ueª“©N¦:™ª1UcªÆT©:Su¦êL5˜j0Õ`ªÉT“©&R­áÊ‘j /PŽTkxr¤Zà ’¤Zà ”3UaªÂT…© SU¦ªLµ%ô•¯ïrѽÍ.æºôžìb½FëÝeøáåÅðƒÑżÖ]~Ñûv>È…åÆòDùvFÈ'Ë壳\YÎT뤌õ7"g?ú¦ÛçÂrcy¢¼NË ùdy ¼~&‘\Yî(7¦jLÕ˜ª1UgªÎT©S ¦L5™j2Õdª‰T·“SIŽT·³SAÞ‘êvz*É‘êv~*É‘êv‚*É™ª0UaªÂT•©*SU¦:™êdª“©N¦jLÕ˜ª1UgªÎT©S ¦L5˜j2Õdª‰T·£UIŽT·ÃUAÞ‘êv¼*É‘êvÀ*ÈRÝŽX%9S¦*LU˜ª2UeªÊT•©N¦:™êdªÆT©Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHu;{•äHu;}•äHu;•äHu;ä©ng°’œ©²Ù’²Ù’²Ù’²Ù’²Ù’²ÙRí¾óÒõÁF½Û­æuCwµlaÝjÞ3¬ §GŒ°íòÄÖ?Þ¿{Þ}—ë=<飼?~øéîÍ›Ï/¼~ÿîi…»Ö8ÍuµÛ¤ûÁÿ´|·jžRÖ* %«ò$u$ìG«ö#ªÁòÉò@ùºâA¹²ÜQ¾®xP.,7–3ÕdªÉT©Ž†TGCª£!ÕÑ‘êèHut¤::R©ŽTÇ`ªÂT…© SU¦ªLU™ª2ÕÉT'S¥ºþ ¶yMmÕŠj'µ7T ª ÕIꨞ¨F–‰,Y&±”F,¥KiÄr=~$u'–Ò‰¥tb)ƒXÊ –2¥ KA–‚,Y*²Td©Èr"ˉ,'²4diÈÒ¥!KG–Ž,Y² dÈ2‘e"ËD–I,µKmÄR±ÔN,µKíÄr…¨&–:ˆ¥d)ÈR¥ KE–Š,Y®Ÿö­GkSÀègÛ®9ÖªlBVù)$ZGïJÚÁ +.O^üõǧǷ·O÷uΓ×=¶áGËÎ7¿æÑ3­ï øõÛu}ý`È:‡Ñ"îfë'ÊåëgÊ•åŽòõãåÂrcy®\[Ó9®Ée°|²omÚчw4e™íòPÆz·»‡§Ë¡IݲþºoŸÊ~ÑùþÙv²£ç5N]iöÉÖÅiÎÚø—GëvS:×›äÊrGyëMra¹±=/Óþc}Y¼[§Vsv›GŸã/®Ûöe„fL™ëöA…åÆòDyíË ùdy ¼öe\Yî(¦*LU˜ª0UeªÊT•©N¦:™êdªÆT©S5¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘ê¶/ƒäHuÛ—òŽT·}$GªÛ¾ ’#Õm_É™ª0UaªÂT•©*SU¦ºþ90÷çÄ×?ʪ¸6<³ù`ëÖÕ€g[© >¾—0ýÛÝÓÓó!â¶ÞÅ¿?<ݽ¿}ýtÿ÷»O¯úýLJ×uôÒí›û§Ÿ?½ò÷O?}úóóÃVû¥­õK‡:Œ}{ü¾û>-=øÝƒµjý«K­29Xuô+”;Ê׿È(–Ëåë_d”O–ʃ©S ¦šL5™j2ÕDªõ+”#ÕúÉ;R­_A ©Ö¯ PŽTëW(gªÂT…© SU¦ªLU™êdª“©N¦:™ª1UcªÆT©:Su¦L5˜j0Õ`ªÉT“©&R­_A ©Ö¯ HÞ‘jý åHµ~AòTëW(gªÂT…© SU¦ªLU™jmPêµÿÝýúkŠíòìÓsIUõuZWf-ó`•èÁÅ™^`ðÛŸnëbìü„ú»}óêw¯8x2§õ=b¢­­ÇùoèeýåºzÆà±¾&c°eód-Ö§çý`Ý徎@%ù*P®,w”¯Ç(–Ëåë1Ê™ª1UgªÎT©S ¦L5˜j2Õdª‰Të$”#Õ:Ƀä©ÖI(Gªu’ÉR­“ªyyÞÇ¿Ý=ܽ¿ý´i$úÍ«ïïþçÓ§??¾ÿô§?|ÿß~úóŸïÞ=¾ßþ±ÝTï–9c¼£O‹w“žvŠÏûÁ¯_¥§žÞš 9Xu4N"y4– Ëå‰ò,Ÿ,’×8 åHµÆI$ïHµÆI(Gª5N"ù@ª5NB9S¦*LU˜ª2UeªÊT•©N¦:™ê,Õõ“µ¥_“[g¹²ÜQîåÂrcy¢<Ë'Ë™j2Õdª‰Tkœ„r¤Zã$”#Õ'¡©Ö8‰ä©Ö8 åLU˜ª0UaªÂT•©*SU¦:™êdª“©S5¦jLÕ˜ª3UgªÎTƒ©S ¦šL5™j2ÕDª5NB9R­qÉ;R­qÊ‘j“PŽTkœ„r¦*LU˜ª0UeªÊT•©Ö?Þs=â?Êa2² “âÓ&ºëWùÉs­Z×¥«GIvy þwOï?Í‘ÚI?ßJ~áÏwOïïïþþUð›û‡Û÷?¿¼|øD<ëg´õ?ÒæÁ;}Y¼›ù¬ïò¦k]v¶ÎNZC?u;X·-%Ê×ÅÊ'ËåëâåÊr'yLjra9R­ãIÞ‘jLjr¤ZÇ1¢©ÖqŒ$¦*LU˜ª0UeªÊT•©N¦:™ê,UÏÈ£Ÿ±ûaNCµ ÚP¤öê‰ê utT+ª‘e"ËD–‰,“XÖͤ&–uë#¨;±¬IM,ë¶GR˺é‘ÔÈR¥ KA–Š,Y*²œÈr"ˉ,'²4diÈÒ¥#KG–Ž,Y² dÈ2‘e"Ë$–uo#©‰eÝÙêN,ë¾FR˺«ÔƒXÖ=¤F–‚,Y ²Td©ÈR‘eÍzÂ[ïuhÌõÊmÚ“-Ó 9ÎóžÙº¨¬?˜÷øî0Å¿½ùþñq;Lq=䌛W|ÿøúî‡ïo¿xÝ··?~¼ýñîr8PsÅZë3ÞôËúݺ<µ®­ùt´nŽ“Ô€+ÆÑûÛÍ.ædy Ü:Ë•åŽro,–ËåÁTƒ©SM¦šL5‘jMÓPŽTkš†r¤ZÓ4”#Õš¦‘| Õš¦¡œ© S¦*LU˜ª2UeªÊT'SLu2UcªÆT©Su¦êLÕ™j0Õ`ªÁT“©&SM¦šHµ†k(Gª5^#yGª5`C9R­Ê‘j ÙPÎT…© S¦ªLU™ª2ÕÉT'SLu2UcªÆT©:Su¦êL5˜j0Õ`ªÁT“©&SM¤ZÓ7”#Õš¿‘¼#ÕšÀ¡©Ö Žä©ÖåLU˜ª0UaªÊT•©*S­iœ¶Öu`È´=%wÖ¦ áÔö”ܹRkGžÄe73.Ï ûÏoÞlÏD’ý”Ÿ÷^_øÝÛwçÞÏ/~÷Tû´v­4OcÔÓ‘Œƒ7ÿ²ú`²fúékKÖÙ©YoMMÖíGl‰òõ¯"Ê'Ëåë_E”+Ëåë_E” Ë™j0ÕdªÉT©ÖÍ(Gªus#É;R­›QŽTëæF’¤Z77¢œ© S¦*LU™ª2UeªÊT'SLu2UcªÆT©:Su¦êLÕ™j0Õ`ªÁT“©&SM¤Z77¢©ÖÍ(Gªus#Ê‘jÝÜHòTëæF”3UaªÂT…© SU¦ªLU™êdª“©N¦jLÕ˜ª1UcªÎT©:S ¦L5˜j2ÕdªÉT©ÖÍ(Gªus#É;R­›QŽTëæF”#Õº¹åLU˜ª0UaªÊT•©*S­³²>?›ïõS£mÃ[_Wê.l™Ÿb=(ÚÒýº£ ›µËµþÏÛ÷÷·Ùß¡X¿¨gH˃Uçg4'Ù}PëÃH]›³uëçÖ´Ú:Gë.¿ÒëÇ©“Ô}ýÔBùdy |ýÔB¹²ÜQ¾~j¡™öPû(ÕU¬Ÿv×ä2X>Y(×Îre¹£|6– ËåLÕ˜ª1UcªÎT©:S ¦L5˜j0ÕdªÉT©ÖDåHµ&â$ïHµ&â(Gª5'ù@ª5G9S¦*LU˜ª2UeªÊT•©N¦:™ê|~´”s\“[g¹²ÜQîåÂrcy¢<Ë'Ë™j2Õdª‰Tk"Žr¤Zq”#Õšˆ£©ÖDœä©ÖDåLU˜ª0UaªÂT•©*SU¦:™êdª“©S5¦jLÕ˜ª3UgªÎTƒ©S ¦šL5™j2ÕDªÚª6¤ª ©jGªÚ‘ªv¤ª©ê@ª:ª¦*LU˜ª0UeªÊT•©Ö³›O4®aøúá—1CáB?ÕnÓzžØý:Ƀix¿<ð?n_¿¼…ûz»‘™v°äüéÁ|¾žrGja*[7Oëòúj£QÎT…© S¦ªLU™ª2Ueª“©N¦:™ª1UcªÆT©:Su¦êL5˜j0Õ`ªÉT“©&RÕ†Tµ!UmHURÕŽTµ#UíHURÕTu0UaªÂT…© SU¦ªLµN¯l]Œ n·MµYgÜe~Ê:/bÊÑ2çþwßó§õ¿ÿ–âA endstream endobj 215 0 obj [ 214 0 R 216 0 R 218 0 R 219 0 R 221 0 R 222 0 R 224 0 R 225 0 R 227 0 R 228 0 R 230 0 R 231 0 R 232 0 R 233 0 R 235 0 R 236 0 R 237 0 R 238 0 R 240 0 R 241 0 R 243 0 R 244 0 R 246 0 R 247 0 R 249 0 R 250 0 R 252 0 R 253 0 R 255 0 R 256 0 R 258 0 R 259 0 R 260 0 R 261 0 R 263 0 R 264 0 R 266 0 R 267 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 276 0 R 277 0 R 279 0 R 280 0 R 282 0 R 283 0 R 285 0 R 286 0 R 288 0 R 289 0 R 291 0 R 292 0 R 294 0 R 295 0 R 297 0 R 298 0 R 300 0 R 301 0 R 303 0 R 304 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 313 0 R 314 0 R 315 0 R 316 0 R 318 0 R 319 0 R 321 0 R 322 0 R 324 0 R 325 0 R 327 0 R 328 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 337 0 R 338 0 R 339 0 R 340 0 R 342 0 R 343 0 R 345 0 R 346 0 R 348 0 R 349 0 R 351 0 R 352 0 R 354 0 R 355 0 R ] endobj 212 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 215 0 R /Contents 356 0 R >> endobj 357 0 obj 18036 endobj 359 0 obj << /Length 360 0 R /Filter /FlateDecode >> stream xœåksä¶í»…ê‰Ï³fô~dò˜kï.q{½KbO“NœéÈ»Ü]õ$q-iíx.ùï ¾ô´?¥é%— A!åîÄs\øç‚ÿ$™ï¬«“;IóœÄw‚X’¢Øñ»©S9I£Ô)ùÀȇH0T9‘½óãI}â:ßœüü Ú8.‰œ‡w$Å\|“G1 â4Ë2©«O¼4åS$`]9Ÿ]V¾óЉÑJ{.Èý¯kokxþÿ€F®³;ùóõÉgo"Çsë­qÏHƒã8tRøÿã;וóóÙÕ]yÍXùâçú¯'¯¯åÒ;ÿ&DxPïAºý'–wiº¡ÂßH ñ#XTÊ •¿ü#a ü5ˆe1·GXêœ|~'’($ím@[¶ï;Õl²Ñ.ò¹çãŽ|é²s^À“ˆ¤ÎYÑxÝ]±ÎËòÑz^XÓåµÅ²§ 5XÇ |l­h®ÏÞd#?Câ…‰ë^2Òí¼«÷y£˜Ç‡$ç™-µë¶£ùÆØöšùK’ÔsÝ(Çš}DÕ~ŸÕÍOÃyv[7Ëz{{Ú¢;æ]Áê•¡ÝÒuþ<»iJ2×wÝÔÒž2¯zè‡ó¼fîv,-£Ö¬C‰–³ùî€{CËüÑ¡¿òº…¥9y½qPNÇ=iËÀ›n©CïŽÅ}^Rð4p)ø¡MQïø§:–]q()°5›–Œ¦ }Eëza/V~Š–õ#’8g%Ûq×¶( QC[®’=.—¾ØáØXK·Gu&\uQåeÑÂq!ýG›wÃ,,eaíñÀO•ýœ‚¿n,;ÐF¸‚­kzJüÊ dE·Ù& û¶ÉaÅ»º¢â@{<þŸ­YUÁ¦´DSÞ1XÕh·Ï; ÁãXnÁ5ÓàüÙÏ\’¥8GŒtûí·ù£åúó|«§çõ]Èê^e”TCþO>™Ÿ×Ëæùž3/œ«8ô² ’Ɉÿå»WóƒSÏ2š‰…G<¥C”ÏO²Ì…T1õþ‡ywžÏh`;*’D€ÓÞbàü¶4Ø--Ùƒq¹²£qȼ¶œÊ¸úîÈÅ㸯Î ‹†åh0‘Ì5t ¡‚Š7qA“6EC×]ùH4ÕExm1çë}AïÍŒòè ²c"!ÂO«a3æÃ»ë‘ ŸëùþhÍçÜH¡uÈÙþ(éì¦"X‚˜8 GR,}6®r0(üG†O9@‡‘‰x y(IbÐ4K¥£ ߀²æ¬írŒs£yS´Y)²v±¡ »% ¼‘­¹éÝGL±—IJ`5k*YÑįz­gùî­‚ ·ÜEµP¾EìØ)t}lŒœÛ&_S ™½†<>²TC´uÇ-É£vÊ]º…úª,¶°ºÉX”g˜R<7º¸HŽ<3jRÇ>ÐڒИÑ2MJ.ÌüV¶ø W ÚÍ™Éߊ&Š kc“Àí±o®QM鼿kØñ€yþæqÞ@|£¿æ`#ºrNç³JxÀFLLÁÅ.¤–Eæ¥y}¸‡°ËnǬ_-L ){s%ª¤…‰#„¼Êòãt‚ýü/x÷òï¯ççÜhI€Ã}üÃié!‡ðHǪ‰£îP7f)ÈQåž ä™‰Œõ†âÉÏÌUa™$E2mùéí4ZÌÈwˆSâz|KÃlBÃó×ß^^-”ñp÷[`?µ–¤ÂU¦³‹TÔ¬¬ŸSÚ•&Þ»iäíÑâK51Á Qˆ%Œ6ÞŸ0ª?k¶¸‰,ÜÇlçÜf Y…ÀÍA¡ñ”ûSJ´b¢>‘¿ô`ˆ M›U=cõƒž´½5Qn@°^±YV!oíU3:4ý¼©µ¨Žžž²ŒÊHù^m„šeÊ”Q00¥Ù$Á)R°lb yäzébIy$ó"~Åõ'f|:TðC¨ ül‚ß( ›H+CËžÒÖ†[+à Pa/X¹¿›[RTž”“Yãàˆn¦í$Ë4u!•Ô†îòfÊ[z±íxÇâÖei˜ÆjǨξâ]„>‡[üzoÐãaeÚÉ—(Ó寤yÊéû‰×{Ó{ë"ù´{$ÈBˆš®7±¶ö@×E^.^Ò\+žâ6ó륉©¢äƒ´¶Ì[ÃË ßò:æâÂt@.8ãÛ”Ÿ$ÃÅ`ÿ€†ÇoŒÕ޼?²­£®;ö•q,nˆa+Néÿ× v'ö7ޱ¡:ˆë ªÄ­þ" F$ʽ”HǪb½2y•@dCíZiØ}Rìè8ˆè.Šâf–ê´í,˜%s¼õPC9f¡‘¹Ï˜Køl‹ûËoaØ3CøßG þÙç÷T#Ò8¨^s8׊=š°•å´¸æòr¤=ÚˆX–%bÑí-Cµb¡ØjðRCêî6Tº¥tŠQ1ÏÚhE³a¬ëë~={Tã‰ÑazÇWunžÈ'o×òC>–Á[Ýsº}Cç_½x»$d刪»uÅ}œr…hyòÒõsýù \1CÏKøW!Þ¤tšÝ ¿)Iøûª—wYx’‚¨i{rC Däƒ|T9pIî“JN²•N_°þ`…D®—ÁJß­è9Ât4‡$©ËF“ë±p§Ýé@éAú힯éOLãæéédT®È*.‚ClÂsL½DNaf•$¥Îpn¥½aÃýj÷¤2CëHÒÐ8ú£ÌI‡‡0ŒI(T÷y¬àϹ³Þ^apùÒágdxHl QL\ü# z PÜœ9_:_/4c@N’‘4‰¬÷Žü›Q ˆZ1Z¶ôA¶¢‘"Š#åE‘Ý×Ê·ÜZD($`(×hn‰ä6÷Ö´¹%·¸§¢…ˆ(FY5J¿[5wM^”¦ŸœxGkÚð—žc+C¬­£õ#Î[šo¸p)” 3Ú³²*O%`ªl™ÜÍ0„Åà¸a,•¾~ÿ·×ïë‚À:5Rä•80‡«üQB·êq.K¨Àl«y¡»ïCu……ßxúgô‚wI€œŠ\‘«9,ü’V‹W yS>*½…'=k¡?e·gÜ…€ bŸMéy‘&$Ðo°li+)eÞa‰èª€=òÚ+9$`}†°zƒ-Uj Ö1[5È|;*7?òa^<±¦ç¼ëð%X©­åã˜rã8H°*cñFœ÷gyTä‡LÍÒÒn刦ÔÊ8uO‰sÍ{À¢1úP´tâ˹4&Y Q7Ž2ë|y<Î ÈŸÒqÌħQ:ñå?#Ög}§²~>ë¹±öôøâ«y=ÆL¯Š®cÒ÷9]ßëÉþê‹Ù–9ÉQ@â(ÎRˆ}Ù ¢Ç<Ø©ÐO¶”2 XÊU¨®Ù#sÚ"é[²%¤dà·EFˆ¯QÖL °gmóÊ °‰;üfI ØÕ±ï ‡»™Z8\Žû Ï×kÖˆÄG7wä¢ZÖt¦†£ÃÎ Ó´ï" ¦ñ\UQòh¹XíCB\p¬,Œ¼ù‰û{<óË þ,I&ÄŒ×{Pº’@zôŸœ·ï¿¹üËË·ÿzýÓw?¼¾ºº|?•ýÆŒ*ËÖt‡ŸÁå>¯ùß`û¾-Û}ù-»Ÿqà“ÀàÀ'Iù !b‚éÿÃÇã0,œÁ$®—ØÃ{ÒååÿÛñÄÄF endstream endobj 358 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 359 0 R >> endobj 360 0 obj 3563 endobj 362 0 obj << /Length 363 0 R /Filter /FlateDecode >> stream xœÍZyoÜÆÿ_Ÿb €¬ƒæ}¤– Y9rjɱ6M‹(0¸»\-k’+U(úÝû›‹3<# @Ú8ç=μû½yo6_,bâÏ9ý+ˆl²Î¾ œE›8¾@y>±Ã7C’„^H2º±³¤[ÄÒaX±›;òóQqd’÷G¿üŠMby:2Ä9™»£ÁÜó Ç£(²Ú††”…cøX¬sòú:·Éw%Û-¥§„Ìÿ¹ôºDŽeÿHd’‡£wË£×W±L²Üª°lÇ|ØÙ÷]ŽÑl²ÌÉ/Çw_³eYf¯~%ËG‹¥PŸ£ÁcãßÀ`Ôùà¹f÷‹]-^añŸk8Œa{Ð~Ê„CÅßôƒ\zÌ@üïIƒRÚá¾{˜¥þHæÓž`Œ°ã7Ðlß ª?Ød/RÞÓʘƒXZÞþ°¸±ÈÅ[ÂV6WLÅ¡3<ò]Ú4¥ÑÛhÇ4\VB¿CúÍÅ4éÁ™»4O³¸ÊžIS~àõU4ÈŽÐ4LÇ\Ïšäû¶ËwÄvà¦e‚R É 5ôlš»¦iV×xo¦5œÑ­7¢2Ô57À ßã'NþvùùæòãbR7ªÉ+9N ¹ÊʇtgLþ¹¯’ºNË¢>“¸§]R%hvíRH ÁǸJãUÖ~N[nEÙÈe4-Ýä1Îq£H—r·â%ù¾yn7UZ<\R¹¶e•ÌØ-ô{&¸?>ùéæn±„ð sn¦‘ã mmÞ¿š4jä®Ш†¤) —_“•‡l£Á«D¶qV'g"yL lvåáa§!&õ³­Èð«‡ìŸSuF%;ô@ÃŒØý=§ÓêYÒ¦N²­Ž¨ûjp\l^¢Ž†ë8Qd"xGÔ™óŒC]3yö¿Pc˜ñQØ£~‰G,â¤ãâ¾<~ŠŸÛu¹m—uüŒðmÁfǘq@[6»¸iéjçx†YQäÙîP¢ß­VèÌWbí2nWªdpXÕŒ1u’¯‡‰žJ)–è|yò¯o…¨ÿV&;4cæ0pŒ…;¹«ˆmèFË“C»½ˆïþy'òÐfîß /³rÏ}&‘õºJ÷M}¦¡žËCçÔ6-Ò&ÉžõS»¶ pÄAä‡Dï¦aÒ¢Iªxݤ]BÌtxLªtÛùÊCgš¬,¹µ†›´¦ëöì£]$® Õ¨dÝäánHu(f®g×6\Z:=Ú< hŸt;­¾?w–¬ËA§²Eû{n¡G¶àÿž׺¨Œ¢téÒl;oÃ3á7«ß€·<¢pÀC ä„<`ÞîEwÁ,åA‰ ;ˆ— DIÚ#l쟎LêCN¸FúVj‘D:â%&¢WU(X(®%Åéó–Òèëû§/Ýï Ó·Ž@õÓÎJèˆz lc$ ÷&ð¨}sywwýþf±xKÄòãâfùåöàë›åâýâó—Åß?}^àÛíÍÛ™â€àFF`ô0e…¹*+T©8ßgÉÙK‚:ÛF¡ &ÂÇMÏ¿·žP(á]EƒX‡_âmÄèÔç!P½à‘'´0Yb6r¤kmÓ¶*sÍP»ŽÝ˜ 4#§õð±cSWZÙú.œ”ÈÕ¾*wé*m¿ ÎЇI°(‹ón[A±N„"ÚñÿLbÊC%—²m¢ëiZíŽ #[ ­’Þ,1©Óf7TÔvŠ&„óIÒ¾„q4Â*.ˆ&E¹Goß”ÕÈs™‹F7rq9Yò)NzÁ²0§3[UµÛ8O³4®4$Zaï‡*Îõcí¤ÀÁM©ô™e݈±ƒ£´Xi`yF 8‚gëâª<›iS]šskGi9„ìÆÞ¡½°gǸxæÓ"§@#§Ýs\4F‹ºnÚeÎ¥gëúP!}¸B |l- É€*áý4ŠC¾¾bp–þ¦HL?éx(ß.òu`D t–Ó•…ys1ž×¢Ý²º#òŸ€Bƒÿe:2\z€€7r¼åOWâñ0Qfa >mùÜÕS7ñFÙé›é§>ÚÚè£3‘éR/ÙT·ÛOõ·ÓO݈u3²MkT¿oî_ £À5ÝÞ¶›’½DÛž–Õï±|RÛÄÞ›†£d­o3½C“Ð×+:Ïä;=v¯Í<U|¾ä5`\£é˜ CÂÅ-Ç GxžŸO¿Ô¢§™9Ù²^%ë˜?“øUi›á–ª•nüBV?(ƒÓ»#Kγ´¾A¸–ßcO[ê¿M’¥yÊÂ|ÊAˆ©Ú…š±šÄ™ƒ¡‰¶´çâÖ¤S%a¶˜t‡i!ýñ+ðü1a.¬éè±Í¹£(«ÈýxÓ>„ÖîNîÒ·=¤2’0TOc×1r+²aî‰Ìõé4Nåv\Ñ6Û¶×ÿmlßÅпa@1ÈDÖ,­Á¾ÓSúnX¬«„ ޲mÑ‹E3Ä5Y>%ÙËë¿ "!}+4-Ë æØ÷Óa©>¬úøKèkmBij˜â<ÆÑ±ŒÀ PÌY£ ÷±ñ,ÞÐK”&CÒžc„‘;›Ñ,éÁ¾×”ô&}L7 8AþÜê xk^ðÁ¾?u¨wƒœ©’æ€ î‹S4Õë%,pa}Û-Š–áÊ;-«ôa×H€ýÑßÑ)û|›ªú f½Cÿ˜jª(:j¶îü¤Â0(x5.aÞ/ôD©â'¹Ô~„e0@Ø:G…€¥fñ-³g–þs1úîHéÈ'2Ž3'¤,µBa`ãC'´æÈt«ÖhÓµ/ù¡n´o™Æöhb>¦ *Úˆ"Ø#yt᮵Ý.hÇÚR;ñxÎ!:u eÛ=C}ú+QJÓb•в½1º òm#©ŸQMsÚëÂ|MŠ}ÂDþR#¾êt†½‹ïbú´Ð燲ÚR³³Î•w¬ˆ6Õ¡²Î”ª+;QäJÛyNwœô ÿ{‡ð;!s½¦;w”ˆ.“v—¢«äÝdÃ/=t3]c€‰ÞœnŽÐ¾¦?šˆÑr?Û-:sDT»(þ'ªÿ-/É endstream endobj 361 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 362 0 R >> endobj 363 0 obj 2860 endobj 365 0 obj << /Length 366 0 R /Filter /FlateDecode >> stream xœÍXmÓHþž_Q‹¢‰Çn¿´Í‰E°dœ²pÀŠÝ¬V=IgbƱ3~™Üñ߯ªÝqb»Ð}Ø[3LœvuUuÕSõ”çfà€ÿFôÁ#ËíàF¯9À¸^òp¸Ø!lA ýlÝ’ˆ¾uÕª–®¿là×A:°áŸƒßÿ@¡Ø–ûÝS^«™ Þ¢q?°Ü Œ¢HûÊ,' É„kx³ÜÂÅdËàe¦¤Þ“"ûÿîý©G®ÃþÙp5x1\üìƒcÃ|}„€Ã\‹ç ð ´\ÑÅ`¾…ßÍn’y–%ÿ€ù¿ã¹>Z½ÀÃð‡[ A­¾g·Ÿœ «Y?®âÏrë5\±˜g G‰N¨þ¤‡[_¨þ¼7 ZÕÉænzT¤þJã÷g‚»¸b…­xÑIìÛ ú‹CÖË"Ù¶­ÈsN¢g¾áÃüj@Õy…+€\·\´Q¹Dê.¡;íÞÓxfù¶N×ÁZGí£VsôòfpÐ|xˆm#Ðf¨ƒ´,~ÝígGU¬ÑujH-mA9¥«’j,éÛï8Jºþ©ßîñTGýÚ–}°£ÅošÑªïNÎÓ€2‚°…I[‚r$¢S!ò“¸0ú$rxøjövúòÅŸ¯Þü2¾HâË‹â&)±[Xôp+·mZ¯Ñl¿ ,²"ׯËujK“öq’@Q]]É¢„r#J¸Ë*„Ó(¯Rˆéy¹‘fåFæ°¹ØÊRæLÒBæ´CB*÷Ç'p)×¢ñÁÁ¨ë‡ØVAÐw Ouï \~eçë°‘cà;G÷¹å0ƒìùµôø?b»K$8V9`áç¿›l§WP²5l3ŒÊ¿§°–¢¬rY4­âþ²äŽªJŸóVQrBÈ{¼†Á—;5¾øw‚·ò–"Þ-Í–¥À µ¡ãÝw˜Òõx¢ŠtÔ -èráM¡TKO½h+õ—£‘¯T á 1õ¾WgóbujNË*´ 1[ðz8Y=,,$ð|äc|êŒ{ä`Ïòž0þÄå¿A•âV®àa_k„Siµ1åÖ>eXOUQ梔ª84Šl+áRñ4ãŸÂÊêÛqlnyÔÂ(8š¤·Ùµ„$Æ_ý-8Ø´…{Þq ]ÇŽbYV¯‰ÐšI_' :¡†ÿõà2qjòÜ 0Wè¹ç†µ•á…AÊó»±ïËø>† e_Ë !^ÃâÑ0üåãüù‹éxñذ-ð ¡[,v 7Á­Ècq‰)ÆV…,0(áž!VÍØQ—Y•¬‹ÂÉÛ »«ÆÂ9\V%vÛ³±RÊ›hI½Å>!˜ ¦B¯0äË\ŠkÈP‚Žð·¬ò\¦¥‚è!j‚Zä0Mh[ÃNfÔ%ãwH 9Ë<Þ•°Î³mƒå8EwŲŒoer‡ÑV¬Ñ3Äl·“mh±ˆ•îZuŠLBhÄD‰ôNÅK±Ô5ýÂ3Åyc·Eg©&¼0|‘1'õ=¦AäWÕ–"ó`´ÓI~º½+)ÇäÀ@kìôu3fÈõPÇ¿/î².ÀA¦+‚f_Ös¾ sæ;HbuÍ«<%îÊRø)KË8­ä¨ÚeéHæy–؃j‚ß#*D Ë\^«Sêç”™ÜÛ Œeh;Œ×ö‹%”ye(f†ý<À³†! ïõ?´;ñ ´Ä¢N(Hlš‰•âè(ë¢ÄŒ­àløYgòË65ƒ¾(ê°'ãÚQû¤?½?Ÿ¡nG ˆrÃf'잯˜êãÜ ÍBCÔk–‘/1ÛÔ¬\·ËA‹Çÿ0ˆy¼$¦“=ƒ¸‘ìÅ]AºMQ"!!r¤¦²Bé¤R –ˆ¢î"}C>oG í"IåeaÑSæ%æ©J’ dW´×ý©QÛ쀵À>µ2¤ǾNt :?Úu<Òðó³/†Í¼Ë1Fȹá·Iƺ$ƒMþƒHâ±>õÈ\"¯§Ú'ÃI<Ûo‡Lq;–¥žªå;Ý 8Åß9 Ÿ5Á´Ï±?®(Šy=s ƒ!ÇëòLsâðÙâñì3¡¾µH ?xÌ@6³ŒúÈ:K’l¯y%S¤€vŠ–ê%¾TP¥¢ÓÔgHLõ¬‡U¼%Þõ­¹6jPH:G%­¤‡'™Ó¨Ö0Â]0:‚|øúýtj:”×ã"‡x¾ÛNT:xú´Vn*Q/`†>@€{ƒèhu”e¶ÝRïE½Ç»ÜñUªñÂ.}ÜO5^Ô¥‘¾ Nî½ê~)×¢JÊ#ÍHa´·1e¸€ýám²**‘à\°©a–ñ._·(0„™­¦zvJ©.odÜH Ø<°ySÄú­ëXè7_®Ë $Y¶3d_ýz•<ß *kÌzð£ò¢I bÅJ¶~§® Œ:.=?à¶0Xò ÜBù^MzH Øæ7?ÛÑ3Aß\ ¤[G†ÊN½Ê¨!«eªÝÑ_êsôµ…¼æaÒϧïÇXLø¶ÎðÇÃéÝTL~Ä{!†CÖ:~Ä Ë´5°»ŒÍȹƒÙu¼Û©þôY©ù‚iZ šÑq4G_¡›j ßà¸Ä\ƒz'hÇó }ˆÙ¨Kð‰õæÄ§oÞï“é^?ŒßÁlŒ}âÕdÓÉkìþÿ°õªƒ³ƒ™Õ™›ëwb_ûv_;¼>+ÁäõlünŽó7§Ó ØŒ2 cwg³2Wóçº èÙq2ÑÛþ/š§üH endstream endobj 364 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 365 0 R >> endobj 366 0 obj 2071 endobj 368 0 obj << /Length 369 0 R /Filter /FlateDecode >> stream xœÍYYs7~ç¯èò>Hf¤ÑÜGRÞ”,Ó‰S²R±˜x]Q@$ÍAÍ!Får~û6Ž`'©JUve[DnàëôÃÌÿœó(qaÍÔœ‘ ^¨¦‚œÈ í2PDÄrÆÞ³¨¡'f·$öð~–Ïløföó/È´Û à8³GÂ¥˜ÛÙ¨<-/Œ“$Qgu-'޹ Ï q°ÎàâMæÂ«Bp·§ç‚ìÿùéÍyŽûp"v³—ËÙÅë–[íŽëYQˆ8‡¡±å¹ ÿqa™Áϧ·é²(Òç¿Àò»Ùb©®&÷qçqñod ê-¾Ý_1¼«›×³øÏ·<9‡3–àøRª ª>ùB; @òó³€(QÆæ¡yRÿ¤òÏ["òpÆŠ{lû¾SýìÈuÛVâ;NÄY“È üËÝLd?²Áó"()lq¯&¨ÁFÑr„Kâ H 69²õѬÀv’Оïvµ WK’yÔž!¬†*<–Ö$G¬«Û- Ñ’]­ÎP ´ÙR“m*üS5êFrd^¨s—âž·ØòDhÛ¶r•9Ð|Û¢¤d½é6·Z®`wÉwws¹ .4¥à³xåÇQ’ÄI(Y.æ°Ü³ j–Q`yUS²b MÅòÔ{ _Ã#)Y¥ô Žô=‚TÛåíúíâzqµD¦´¡c…~`ÙüLB#ÏP@àÇŠ–†ä•‘ßN,˜_Œ¥>Â…ÇN0Ì^’~3‡¾˵îŽW$‡CSÃí®IáªÈ2’o*À_°F‚æu+Z)ÍáÙ~º|wsùv¿?,ü¢5)w´†±ÂÈâpûÃ5T5©)—<}©ØØ‚õ½@¸"-¼ü’[ôHQbi|(š“4E Œÿ¦Z>AÑÔü–{ZÒ/Ç m #ßWBšîíåîNÙÝsxýîû·0ÿøöÃòòåõâÓWŽh»Òq½Àÿœ9XîG¸) §tÃm_Óª—Ù–6ü¶ˆSSÁÝ)exã=•}W”Ñä­/ò&MMht±VtMšŠ¢Ï)¹oÃÝݲbC…EE“n`O‘\egc[Ó¡ùéèfÚtŽç íPa$­Câî»S^¼€¹<;:Þè;àIþ›¢ÆuRõnMˆì¡ ðg+Ì÷S©+×è{q_ã‡ï„÷o®¯áfñÓâ^{ËoßÜÂõ››Å™ ߯ ìdU÷ôdê@˜ZûèËl†€Œy£dÜOœ 0šÌvNpàlÿú[?9ÕŽðq-K´QI«&ŤɲhJô§ò~"æ\ÞöÀQî5ÿ Ñæb·ÕG‹+ÇpUóöü£t¶O»± |mÌ㇠NT–p…«¢Ékž›â˜óȦ¿±zbs8¬KsŒÌ8ð¼»çSaâFÁ(¾Ž{ŒGÜ8gðo°'wŲØ8nÔ÷ôùGöɲ&\×Mda‰c76cIïü8â|p~ì‹/8ÞUs8Èl±ÂDËøByQë€Á©Œ”÷•.+ã*lû8eÄÈ+ŽÙQó¸Þ„«ŒÙ<¯çZãFŒúŸ¶—¨ªñ¡Lvœò‚¶zêÈ5Áª×<_¶c²b)«5#úd7,I^eÜ?ÕD†ÑË©ÞÌKv§¡í¦$ 7¤&+Ré ,3í°ÈéP;6N…fˆ\¼‡hxql3Àt ̺‡èš>v‚N„ûÛ›Øou'¸)Ê ±|·m¶3ØÄêŽÆ¹ëZ1œ®x ï(ŽWÜ‘;JbÚ.µýP5½U«Y5ƒxž“úœœó^ÕÒóË=1Îr$OgYäšäšØ±Gcé©h ÕeoÁ e±+I6ÇlÀ-¶?+²Æ øòᾊÝZKȶ_޶QͼԌ¼A¢=¬Xݽ«jgŽ&'ë°Ž!+ŒõŒg5’k=E7Ò#·©¸9׿äf#ÀŸ#=¤å°Á!¢Zðfº…÷ƒ„N*vlöÈ6 wP«õuL9á søø:ð]ôXÇU)çýþéëÏÜbaú cµa)ÝÄ CnÓ-+¥w+zGsZ’Ô˜ÁV«ÜNH7V„ˆOƒVAЮêÔÒN1“8ÐrËÃ2_K'WÓ¯¥* QÊ7$•)¦lý»:3OÖ»ZVônÆÏRäcÓ%Î ãP°*ê:EHÐj¼öá› ‹†x™äë' Ú|/ž@Ýey¤m0PÐGyö~ÂöiÓ °v;zÙvËÖÖøéç`‰NøK¹íb¤±ÇJx¶Y"ßH²³‹$®rXË$Ñ24$EÌq7Z*‚TÅA-éâ &°n‹ðmñÐ0Cfmœ_oˉèšÚ¹g_=ÓëE7\™·Ìë)Srkü1€n8æ;–KçŠ|^”oI¢Â\²µ,£jŽÈœ. Ê Å¸±Ïôd[$ÕT"jõ¾¬ñêšÞšø’ß½zy¥©uÊÚš!'RvO5¥¾æÔ2Õeê’4‰ÝŒÁ·7¤lÑ*é;/`·¡)ÃdÈáïÈQûwIkÂ0ùRÝK —ãJþUGýt Õ„{‡h=l©¢(è¹w,OÈÊMKh”Ù¹zÜÝYŒÚäë–&t4‚fz´mGª´ÅƒÎFé^]¼cåªøÇƒþjúÝá1‹q‰¼.f eÉ/­ðoëiç5?î‘Õ{Am‹4-ŽÂzþNkðåX]aÛŠ5Ä ÛÆØuƒ›3ÅwƒÑá8žÎõ|ܪ;ëfZÏD›™ù8ïK¹z·¸\.´Ð«oo/;R|k–×Z¬ O1î2<'ªk¼^Ãfei·¤zë¶É×¼mè ß;´“Á½1°v;ôë ÅÐa¢ó{wè¹–çø¾ŠþÖ1ß•Y%ŽeÎLæM1“ùùCS´°]/–L)Éw ÙÑ–Vu:PéUŒXŽá|ÀÖ’Ä[CnØw|fûÈi#rò•¢*¶WõýÁU•‘:ã ¿h«ˆ/%ÔÜ…±Æ‚‚?7„GažhÁWÿÏó_ôH×’ endstream endobj 367 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 368 0 R >> endobj 369 0 obj 2369 endobj 187 0 obj << /Type /Action /S /GoTo /D [370 0 R /XYZ 72.0 605.522 null] >> endobj 371 0 obj << /Type /Action /S /GoTo /D [367 0 R /XYZ 72.0 382.5 null] >> endobj 372 0 obj << /Type /Annot /Subtype /Link /Rect [ 504.343 132.622 540.001 141.622 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 371 0 R /H /I >> endobj 374 0 obj << /Length 375 0 R /Filter /FlateDecode >> stream xœÍZY“ܶ~ß_RR%ɵCàW,ù.Ç—¶¢¯+Å™ÁìÐËcÄcתTþ{hhœñêʼn|ݺÐ_cÞ_ùŒÃ?õW’ ¶«®ÞžÏÁ‚ذ¢˜ù‰ó”UÌi”²Rutšª‹iškz#qdï®ê+ξºúåWè´gÜ‹Øã_G1o¯~åQìqše™±Ux~š*CcW±WßT‚}ÞèÞ£õJÿŸ[O- |ñ`gwW¯o®^}1Ÿ³›ƒ _^ƒŸã8d©ˆLýì¦b¿¼xû¾¼išòå¯ìæÛ«/nÌÔpœ ÿ&žŽ çCr÷ ‰®‰o¹ð_èÈŽ'"˜ƒúTš5«c3Ò¿Ï:Ĉ"ƒçË£=õg*?¿I/u@$Ä÷nPýÉ.[¬"êb4_ÿ$ wf„;sšmö:³Bæû^œ©Ð‹"œíϲ’ÕV¶¬oØ›¦ªŠ~š=ŒóÒ,ôýT5RDkï®àÿçè2ú1‘ç>k%;¨sD€M~ì%اbaœ9œRqˆ”’9BϺ ']Ág<Éæ ÇžaàùÁ¨?^¬sF»!–RKµfÅ´ÕS˜©£x".Í:¥)™’Ó¹-ꨯg¾¥œ×™¸EŽ3Ïó» â  b"I0ξ9°—Ld^Ê^|h†ç)#¹oŠúÎRyŸOÄpRv×££ud@ÔŽÍ¢ë+Õ Ùé¨vȼÞOtc… ßmwÄ«/³ùDƒ8‚+2É`s¤Ë)o6ùÐ7tS­ø*„açEL&tE¿;z(†ä1D‡UJãG|ÖÁ˜MÆá ÒŽ.KKwR^[Ê\4–qÌÉXðÑKdÞ­$ßûcÞ[*×ëiˆÙ’¡»¦~u!kÒý >Zµk‹S1àYÞëô~tTµ2/ËÔÐ{jWAºvÃI¶EÓ.¼–„3¯ƒ|.ôl`Ùª¼/šš0û¼»ï}û"§$„Õ ¼°§#B¼ýé;çSSÒч¶©Ù@ôQƒÀû¦ín_^AÇc´Nöo‹²è?œ3¥•e‘oKú}/{¹ë C¶-(¤2kwj Ÿ¦ņ̃°ð}«ã+æ^È^|ûùë7Ñ·yÝå;åãΛ¸6$‘ÖsÄæ^vÅ]­ý‹Œ®±Â0@€ ŸÚ»¼žÚdÖ£Ä^¶UQK«î05§ù#ÙìvCÛí°…Ž«k ÓñÜ-”¥3Á¢U,ð€Û„ñ3cX e‰¢~hîñà4Y?mSWf§!óv mÓç÷¼:•òúœŠÜ6”mIú½Î»#!©Ð?ôGÜ*H£Ît&ºBÙbéX¿ðš¯ò3×mù–©Ùïô½}ég+\s±s¶*ä×%8¿èÑ_ÊkjÁÀfåÒ7æBøBáì1 ¢âPP ¢ i·WÚ&R²‰:Cü6t½¥Žùƒ´Tn›»f0óGÚÒYn[l·C}}F†¹íG@ˆYj_´°Ëqã#g\ý©7µN³)qƒ&®äÚX2¯î(ñÖ1¤‡åÂ&ñÌŸjO5pðÃlÔò ¨eq/a™ŠÎ›òR4QÉr–ˆ(„kYå¥ e G‚sÁ„ëdwÌI7¾ÊŠà;ÇïSîhY&´2JæÊœò%ˆ)?‹ýyÚ4éøB‡aÍÔ¥=‚g^ùY{çŒ0hÌXçjÄLµ‰|¨˜ž‘Ó<²°Èa<ÁEªÈ «Õ°Fsæº5΂Í×gnÝ3÷²ΙrÝŒ¥³sAðÈ!ç\¢Žãßò‡œm~Ë[öׯ!?ý¯¯øÇ¯Êbûª{_ª«ßS7 þþL…z×Cš«îOŸ±¡-‹ýë3´'¢Ô 3že‰Á|1b¾³xOBÕn8"³Ë¾ozùˆ'‚ ƒ¯ž:ž—O@¶š@i mbÂŒ×x×@ŽêÅC*éY|ÎÕ¦)€åÿQsšº¡Œ?Ò>n G²˜‰vl° Þrºª/Œ Œ‹^€ŽjÁ´ìQÝÄr ߊÓ8^ŸtöY7zî…‹ÀOEhhôCs_ßà­’Fê28 ¥áe ħIº"C—³JJ/ ¶ÚEYzLôw#¤@¶ÊK `µ±ˆ8Ë¢4Z5»p{ÎÃ?‘òK®‰í 1ð`Û&@â1Ç䩞 ‘¿ËÝГ•èé²t'¹+ÂdÁ¹4»³Õê&|fáVB‚‰à€¬uU<Ÿi*<áÃÉ•®Šá…–QÔ¶ï÷Å„Ä4gÄk…ž/‚,™XQB¤ÖTàEÈ4:ÙuŽÖ[“û˜Ïýžy*NTÞ¾¼&V%é` ‰Ê¤‡Æ”W©;ÇŠÖ]öl(àÆãp>§I¶2kØ;ÊÚKQ¨–ÖÇw®äpu>dÜO›’uQï´¡pr¸…dh°W}Gú FbºþHŒ]Ó>éª@´Í;‘õIR‘njÜÌH=š…@*·ÍÒTPÝ‚M{"’SK=ûôÙ5{°m³ÒflÇ¥ÿül濃”ûm¾»WãD•{ÆÜ©j(ûÂ@ä÷!áºyØÎI[¤–”¿ŸZŒôkË4S@â±(IÿZ¢OÂ5Â6ÖÎFó‡ZCû|,C »98JZKýð–LGÁ‡¥×æ5SÓ Ýë]9ì%á¨åݶ27Edæ‡ÞV7R¬Š]S6uçH>ÛßzÏ#Üw&RF•XG3Ôk˜v-7ºZÔÛÒQ¯&~Mã©”Ayî„—~ ƒ™Ÿˆ# D¼NÊÙ}Ä  ŽQgbA~â«qâà,ÕÉÇNcCX˜A%s? D¨þ¡¿ÐaXn¾¶bO„°§ÇˆÜšú#Ì1ÙâB‰pµ¸o#ß ÚQW…]k(ýß(i¾fît‘ãÀ«…Î2ÍWefØSÀ•ãdÍ}r[‘Ȳ85ÁÌàÏGá«çË’úpÓAB+2"Týqö«ýÒÐÔòÓ¥Œ œ¥dd|&ãöýïþùÙÏìï¬k*©ª„w‹á€t£pj追=±ÏØxƒ¾UiY^²ñÍâñX@ú*wDzSÔó7öÉ¿±õŸ¥ŸCîã‰pÕ¨?f~ýc³œ_(øŠã—>ê­\qÊH–.~N±íj-Œi*xë B«æ ¬š}v)òél~^Ä D+ÌUŠ2º¾ÖkhÀ •¨,)\eå`6íºé]c 9 ÿÚRÛt&‰”«²8Ò3Gó ¬r¢@Õás¼ÅŒXU3[lÿø‰IϲÌ-W>¹ŽxÈ[Uk×/h¾,ÝÔìd?µÕ¥3Úhl› ¬`c[î¬ûjû‘wÚS »7qr}y%©B|kôM¶ÜOÔÖvËwê‚. ¸‘í÷ qޱ£”wÜ+·¶9t«›> fnÒá{Zú¡—@Ý\$+C7§ó2ö}'þÊ@æ¤õË SD€¥AkøÄ S‡ Ïâ, Óø£*L‘y hòÅ…"“ê$°Óx•^ŽD.u8ô¥R‹êF á†åÞØk†Ä”Ñdc0¸Ãx‚%&SXÈ3Ž1öƒ)ü8]•¦PÆE§@G‘ÙVa9õ§3èÚÌ—bnÖÅ*”ãÚ»ãb! Ž|H3 NÇŸºà©뽬Õø¶c}D¿Œu#{äŠñðÚ™b„& 8ŠÉ‘…ü¦½Ûy·±ã ŠŒÇÝXÃñôâÔ;2V¥ËêL¦³)wj޾`ƒaIქ ¦@b+ÉõjßlF6¶ýÆ6'# ýåôÚç+›ë}ó8½oÚJæg£úÞ€3¤›Ãa]y)Á½%GdŽ”¹Î‘POHdî‡ÅO”Ób>s }á.K Qª‚3寡9à †©R>{ C‚ßÇß°ð&!24$tè'€SÕßg:&–{Ñ­Ù—÷ǧÇõtSÌ»P ¨‚”G¦ÁÉŽWæNPô$ã)(ٱ°#.`äXmo~à§kýP$†}~7?'þ/á¿…û endstream endobj 373 0 obj [ 372 0 R ] endobj 370 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 373 0 R /Contents 374 0 R >> endobj 375 0 obj 3292 endobj 377 0 obj << /Type /Action /S /GoTo /D [376 0 R /XYZ 72.0 653.758 null] >> endobj 378 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.3 679.258 223.37 688.258 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 380 0 obj << /Length 381 0 R /Filter /FlateDecode >> stream xœÍÙn9ò]_Aè%ÉÂfú>`IF“M 0‰Á"ÎÝ¢¤ÞiuÛÝ-+þû-²xõ!ÇØ‡ÙõÌ@U%²î"«¨¹[øÄƒ.ÅGš¤8,îÍ'i@ÂD‘â„ø)M¼ŒˆB²8#•X8ņ’ªV#²'_õÂ#ï߾â ñhLN oÂÙ|YüÂㄆI–ç¹Ò5 ~– !M(äåûC@~mäj­½`äýϵw5 ýàÿ@#ìoÖ‹—¿ÅÄ÷ÈzkSÀBš&àç$‰HFà YÈ·ç_îªuÓT/¾“õ‡Åj­LÃ}"yø7¥2ƒ_Ä‘7üÆÉ.C·Tø/¢!Ò€Bƒl_U* êS|¡ÁX:?Ï:D±r6Ã#=õW ?‰4 ͈}Ç÷äú‹]6‰¢mŒÕ“1ªPS0ì’¶ü£9ý­™1Þ#aFãÔÏó,Áåtœ¼ !yÞ²‡fÃ)‚ïüìõç^-F6»½€†ü…^<‘pfGdëa¼ã³V埠Êxc”Qq^åaþDI±Glˆ!šó;:^ôeSmí¸²ußœ”;þÕ(˜ZÌëž·²úA1à?zEÒŸUu¡Öÿ`E_=Æa¤ëÁOrÛ6ß[NQ«ßóóÄ'íË6•a@ÙBI'çmº‹ŠŸ-_ßÏจ¡nR܇9y™ÒH$ÉN 1,h„EMÛe,»îˆ1Csá/·¼(Yeð· ƒ/¯¯é’ÔUjXZD× b¬³ ‹½Ý‚¤T´»±Ä†L80»êÁ‘.ªˆNÒ½¡ç¾¢banÓaÖro˺ìö|sa(¦äq­*¨#ƒme×£k‘Ôl-Xã ‘%}µ4–»evÙ/ö.ëÛc?·Å]Ä7¥]ssÜn]¥e•î åOÙêÒ™º7 †îíx{2·²ÂxqçÆLT’˜yæy‘úªÒ‚=X5UˆÊTDTª#¢Ý£ÐSÙï-Æ,¨¦°AÄMÅIc[ /éÒ"× ²ë9Ûœ[ûjyý‚ZÂz_v®~Ue±;G÷ŽÝó3&¬”áš['ò`êõ4yÝdHF}Ûh¨ßË"“0Öˆ±À%¸qÖ‚÷:UåŸ\Ã*%l¡ÆÈ+ZÎz³šiàÀжy¹=Öòz~yÏÚ’ÝTfÝÖ2({ªÁµÑÓnÊÖ¹Q:lS/eùÈKl+j_X–^ˆ«@Þ'ŠY^A)ŸÄ±"\%Ž‘Žõe·-á–¸~.V/¯n–â¹/ù‰ Ï!5&’˜ÃÂPtGa4¨Š˜æ¦($¬jBÂ*îV!a“*Óõ f ] ƒ$éZ@dk@U %Ÿa2K´nú²àŽzÌjj 7èáÖÕÐarÃgí[‚˃©ƒhäÆÞŸ8ÄGâ¨:N<}ß ¨=Öµrª@öŠûÛ] c%`ÝÓç“Ñ2…>‹¥kôÛ‘y=öhùÐÒ Ž 'O@¢Hê…Iž¥$JE‡R_’*Ar9UdÈÙ<8ëç§Ñ»³‘‘fФš×kã,¦i¨•XΪö¸*‚Y0# p%¸ªhêH+ì"pÁP ‹=Ábq42/rü0¦dB2ŽÀ@Ÿ*0v’†0Ïÿ9?#†iN!Ïõ,>m]#/£±êà {¸ä"ßÈ ê C¾8áˆ.Öwì^\¼SþpÀøAly_þ÷Sæâ‰z8æ~A¯455ݦ3ѱ›úS3³)Jf¢àlÚ·|NVœL+wÍ8*I†Ž§Ÿ|í'‡æ^>†‹—qé|ÈžÏÇBDXÔ Œ|$;f¸§ñ™ ¾šQêb&ñy­b¶msP]M™äÑŒËÎÇ%ö¢©¯ÎG$ö£¡»‹C†3‰_NVm ÉËzò¬ë¡!}†lüpjO3ö,1(À †ÜÈ’EIpÖ¢åtµ¸K@&_»åº¸¨ú?y}E>¾ÿ´šnÎüˆtxä'Íăk#ƒ{;Ö?ù¬q~T<JOô ú™óýÒÑÍ•’ÚZ ç„MkiIß„ƒ¾/-ò’w•éiE¹Ê:o“Z}ù Ý…%è^U"j€§–òºªf~óG’Ñ“„vIt‰}ËêîPö¡ÁÏdDýH8eE-ñ+–§²c%Îá7x¿Õ³¨èc…Òìž••|À•o¤ú1L¿AˆßóJÛdA“?ø"þ[cC endstream endobj 379 0 obj [ 378 0 R ] endobj 376 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 379 0 R /Contents 380 0 R >> endobj 381 0 obj 2679 endobj 284 0 obj << /Type /Action /S /GoTo /D [382 0 R /XYZ 72.0 594.702 null] >> endobj 287 0 obj << /Type /Action /S /GoTo /D [382 0 R /XYZ 72.0 207.208 null] >> endobj 383 0 obj << /Type /Annot /Subtype /Link /Rect [ 260.294 621.702 309.817 630.702 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 385 0 obj << /Type /Annot /Subtype /Link /Rect [ 113.66 255.874 148.65 264.874 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 347 0 R /H /I >> endobj 386 0 obj << /Length 387 0 R /Filter /FlateDecode >> stream xœÍZ[w· ~ׯàÑKåi<÷‹údÇN]»i"¥>i6ÜY®vª¹¬ffµÞ_à˜ËÊÍKÚ4éâIAàèéÂc.üïFþ$™ÏòêâIó<–ø,ˆ5+Š™—8±›²ŠiF)+eÇ)»h2P\ÝÁŽ}¹¨/\ö׋_ƒNæ:;^¸3á(æîâG˜<Š N³,ÓºúŽ—¦rŠÀ‰È+öúCå³wê=h/¹ÿsí©Fçÿh䲇‹·÷¯¿˜ç²û­uÏœ$;ÇqÈR'ð3ùÏî+öëÕÝSyß4å«ßØýÇ‹÷÷zi8N:ÿ&Žò QCºãâ]†o¹ð_èÈŽãG°ÙTê Õ¿²a #e ü=k-Š žn²Ô9ùùHà8éh¼„Ø~ìT°Éf»(ç>¿wæK¿4&¾=;5‡–u¢ëЦfë;tEýÀú`—«ÕÓ%ëö"/xÉò¦ªx½aMËD½‘}ŠzèÙêª,;ýŽ}×·åÍ;ÙEQÿZ½rŒÁž.‚ÕQ¿±ëÄq¬G„C鞀)GºG! B'Aý4‹QûÕ¾i{^÷FØ9È8n`å0Î,,%—Ì :»[Jtò=+LÃ!ŒŽfúx~äøY’e‰žÔóC'¡ŒoÍ,åø¹þD0U€4TL©=ê k©0b¼d)É µl;f™ûÄ_TÃØžš{ªÎùÙb„3œ?#àgà”Y,ý#E7{SŸØ+v¢bv5è8i] Kï[‘‹ ]פg·ç9éœïxËó^´c™wúÐÆw8ywmYï7pz z{ØnEûâ€|ÂÓBWœø°b/“Â%ÛqŸyÞ6ã呟:8þuWt=k¶ìßù[ Vµpæ2³Øñ|˜ʼ߉N­X¦ ìª=”¢³pÓXºnz ø~_ž¤MeiAOL´$¶?tÝt™éu~XŽà…Y1s>ì'~´#?71 ±Çñ²b­÷{&õH:¼¼/X°¡cÇæ¯`~‹ b×mÓZp °¦VÝ<ó:G_5]["æ¸5±õNÁGéþ{n:Q^ïPê¤êíKÑ ½µŠ·>íy×Y¬ËØ·M.¯(¸u ¯¨-Ý´t~„t>Q÷´‰Mv‡ú‘ÈØâkoÑ`I6œnÒØ·¼îªïÏE Àf Fò݉‘6¼çkû$ê{°^Ñ/ž\æ^ƒ#8¶~:Ê ™>½7Ÿ@“,6ÈYH ¼<5v]7ˆ‡‹à†NÆ® 5 ˆ·‚ VÀ<ìëVÞÉë’vSi…­Ø_¼mI±64‚確>«Í±Ð!aQw2i´¦Šðšñ&îÏ«IýϬNV†¼Éf‚ÓdbF¦W‡6†ˆ]½; Ð;.‹ªèyÞÓY&ú"Òù3·èÃë®-:¡9¯ÿÔ[¨O¼ûÞ¶ÍÑrÀ‰a©¨]‘ï,„Õž,Ú‹f_yÚÌL›åµmÛ¦"&hº¿‰ÓÜzY6±ž¾eáô€åßòngQ·eéXüakéÁAØ4Úk\<¢æ¨f6L¦è⇒·–nÓb¢Œ×*rGÚN¦•ry¦Rð¶þ½A$©®Gˆ×ò̸¾çMŒ ‡ôAH¥ÂÈ ­c£?8†¿ºz“÷}Æ‘…ûgà¦Q·8‚cÓ> ·\/pT¹Á_ŠzÓíÈÏwï~¸#êÔ]£9· zâNk °–D¤6éTÑbÈ6m§…˜3tƒ‰9‡\=º^Þzá_.qoÚCmâz}¨ÖpImkèÇN’Á•BIú¶Îû½ÿºçø +iˆ¸%×á«F¤ƒÈ®Ÿ‹æÐYNÑë„¡¶>m}=ÛfcACÐ]f*ͧ"QPk}²4ض­•¿0PnÍ‚ ƒtbB¹{ün_ êÉp%¸,õÕϿŎëvw.”ï÷bˆKß—"HûBù})‹F/ä0öœ,в,ˆ£}dÖïNàª&}Còu,K£…A³Þpñœï”“!‰Ëòä+ò7'HbPç|ïNä²8g|-S#Y§KuÉJ¥TX°[ 1Ù÷]×¼ÒèÄ‚¤öeN’¤à””›Kßñòz€òëuÅßA¦ú°#âz»Û«ëzÀM;—]5›b{šè̵Qx¨À´îž¿’„Y2±‡U-”ïÓ*'Ô´J´BòìÞ X…jEÙbFA] JRE±q„—3 ãf´1 ¶j˜Õ£R;#Uß.Ø‹¯Šbµ2ú›Æ?l¦La‡®WÅÖN~Z½ºÐú0¯c#7›ØNz¾øè…€‹Â¤úFäL϶’šÈà?­é›|¹'EÃÂëb$NÂ!ˆÝñGv;Ô½PD±g ®+/Á_ð…BVá¦äR4nÒX>XÔXÆ) «¡ëo ÑŸ)ÎÈÜc:Œ@ù–î¶³ÎF\? 7‰²4M’ù (è6ï­ í±gí@ NS9Ù’<ÇÈù°¬ç7&¤Ûp¬+>Dx*Í©-}÷ã'  v€[*ÃkËÓ¯&žM¤_E~èõ×Ï&uZRÓÔË-ôÕÃl‰oH{AÆ ïZI«þ  8««Cýth@‰Õ+2µ¨Š›¼„Ó±ÌïH †ýæï-'``Á4[°^Ãg•hüÜ‚Yœ'‚4Ù  Äñ]o®Á‚üóù¤¡9Ñ\’‘r0¯Iˆó¦îyÆqM~è’M[`»h’w=`| Í£ÝæÚ '­Ú9\’»£xˆPÖ¶³½Š=w¤PŽ„æ‹ÔéÛµ!µ¦Ža¨ˆ…$ê…t-žÕ¡A„ Òø‘A žÊUÇ\®iˆRE‹Ÿ‘Q<ÔM+×n€ÀºÙ‹šë×E-¬1$wsƒú“`NÎX†ß)Jk“á×MSŒdä½S­?³•ŠÔo3ŠÖ…qfž>3ò‚©{«]Ìì‹êlrk ïm/zÑdãwX Ñéçf&÷ÎRCí‘üT±Ò.áWˆ,j ”}U$ì7EÊÐê Ռȧ¹Ú¬0²_gp"\µ¢×ßK(„É¡¥©EÙá':ÿ@«s¼4»ºæ '×äÊj W}¸Ã7áÎ0´> endobj 387 0 obj 3262 endobj 296 0 obj << /Type /Action /S /GoTo /D [388 0 R /XYZ 72.0 567.72 null] >> endobj 389 0 obj << /Type /Annot /Subtype /Link /Rect [ 285.15 685.5 410.13 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 190 0 R /H /I >> endobj 391 0 obj << /Type /Annot /Subtype /Link /Rect [ 460.46 629.22 509.359 638.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 392 0 obj << /Type /Annot /Subtype /Link /Rect [ 461.705 581.22 509.596 590.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 393 0 obj << /Length 394 0 R /Filter /FlateDecode >> stream xœÍZëoä¶ÿî¿B=È]aÓz?Piï‘ô> )Š8h-wW‰VZ‹’ú¿wÈáK×i¿¤Íå°ó‘CÎp83$ïþ, Bøs!~Š*êÃÙ½âEAI®XYDÉÃ28 ”Y´¢áŒM™H®j`üã¬; ƒoÏ~ü m‚dÁãY¸Žb®Ï¾ÀàYN’¼¬ªJÍ5&QYŠ!’Q‚ˇ8xßËÖzöBPø?Ÿ½;£$Šÿf»³·7g—ßdA7[ëQœ";çy”$‰+ñ_Ü‚__ß·7}ß¾ù)¸ùtöáF©†ý„óÄðA¤Í>di8ÿâx—á[.üMI‚<à8ħV-¨ú4™IáïIƒ(QNçåòHKýžƒŸ^‰")g UŽíçNõ;›lµŠbìÜ*[{ÓÄÙÀσ7ÁE\¯y¯©qÏ8Ó`Ëè8 ŒküØ´­¦ïL«MÃë‰s¶1Ÿ††mÛg ›Î oŒ,Îê±é;¢ñç~°ÙH›–mÐÞ3=âp¡{:¶´£B–è• ýÖß]9à ½kQ)Å£ÝÆA`WÀá”0m s‡÷ØŒ{²'z8¶ó&t`Õ’˜$I†Q™ juÿÀ0+PÎiÞ%†è¥`ˆ¤Zw]7ÎH~ª±Š,ÁwC_³Í4Ð6¸¢Ýn¢»å4“Ĉ¾)„ýß4IJn­=`ÑKD,’¢i¬Öø3­‡>x×°RËè §Â¶M×,½â‚ž8(jP£pb8ßO¶Ÿö §¥Á¯.¿~eÚáù¾txÈó…rÊìžýÀ~ B+¾¶WY’<‚Þaaïïécð¹ßøFZµ½‘•¤vâõÐ…¡¸æÉ$)¥îÅø|dæ3½5ý{MuýhZ2H0šKWy¥øg”æë9žêTAˆ.â ’µG1aÕÏc‹4II•æa”zºž/MD֯°,ªu'¢{}ì45ÐGÏ@¯E×ÌOƇR¤c³ cÓ3Þ}5ZFÓl8Ìa=žûɱb¹ÍhÛ‹>οXðóÄO»ƒ§™Jï åuï*ƹÆlÓH‰UDJHÓv‹Añ㾩÷*eÔ´³€3܈p"ŠÆŠ`CGzG¹ÃaÝö±Œ· äÄS#Ñ-kŸ}ºÅéB·fש\U„ðMŠe&ü•¤N«‚îØZBÖÕý$–Z3Ðh‚š:È)\£g+lÀh%HeA¾º½%¯4àGV7´õ)“ä eÔ®Þ™B‡€0ƒ”ÔP|ìY <ª¼Â|B¶Sg ä\3ÛU@z2*R„iUæYá™øÉn°žEC¨­|úbÔÀžÞ°‘‘,ª wšýƒŠÈ‘U9DŽä¥^*#ú&]†›-ØPXk%B,*è‚vêA°œUƒâhP" !#a€¡S,ׄ0n¼‡9‰Eí‘'JÀ¨ÿºQˆð‹òT¥ &®H(âiV(1··_ûj¾U»Ý8Õn Y2¦r‹þµGâ`=r±9N"’Do£Ä'\å{%ÅÔ¬©cЙ]Á¿]]9ˆ>ÀºˆJÓáiãXÎÜLsµ¡Å|fMÇGF7$e’ÅúóéŽC…l9¨UÙ^2yEc%dF‰6ù½oìU»/S3®*êY¨òª²Šs-îgB–%Š”¸júCÃd††´ñéýÛwŠ|±Z‘×ý4ÔLåç É"ˆº‡¨] MGE`¡cPúG¸}=08KÔM·óÍ¿*óÇØu­¨§a€ `1N 6ó¹á5[CÒîùö 1=i؆–Z ə̘?w#}2p+ ³n¶iD†ug(«^O1™DÔ¢°ò(õ’6Á‘Žû˱¿Ä‘ð{_öXwýðÄêiÄgäÂä$…d&Ú6ê舼ë/Wn 9àù\Bç@°ôØt“+•îhã6‘Õ…Õx€NÜ¡š®öžÄ @̱%Y&Žú¯eL@’êlyT|:7 ÌÑHci4VN²LAVó‘Û´¥|ÏìÐMçJl¿¦µBÄÒñsŸ–i²Ðr`;N™.ÿ%¥@îì Vßi†ès ªÚFªˆ$j&Ie)§¯F`6>6ÌL¡m~a:¢U¾«$ËzüñWq½Aöýýëd0Œa¯»JO+R±Cð¤ôìÖYb^œa¦$†1ä!e=ÞŸ~ æô,“4©»€:‰þÖlò‚@ú‡ÔWeq=="y©£wÒÚg)¯THº%±øÆ{ró[@Á9ÆTnéCÏG¼uÊU„cÛ©µc£"¨ÀG .ÑÑ‘¹¶Ù0‹q' ­B”ÛèÛÄ";rœÙíœ!ü‡¥¤XFÑM3@.é‡ç@;ˆmbçÙ¡Ëoò•og1þU•Ä•G ÊV§·F ñ¯„µ+_÷@eUîHêTÈ‘eh º:ˆÎ·"eoiËÙíÒëžïö´Ãk™8OÅÑ’ C?\wӪȣ>ܾ~Á©â æf¾1Tî¸è» )þ´û'!IÄZ'>5ß8ó¹c{úР³)ÖvèÔI£èÔŽÄa½õ4SñÜ2Võ”‘Rœ17"rî»iuNTÜ ynùÒ(N'}RE„WÀJ;öȉ\}ÆÕT|ZÅÙB+5H*-á¤wdÈšIy®”¹ ±,…ï'¬rtw{›—*ÓÒš±²k<ÄLçSÎxsE:p«µe+y+l [çb]Ø$½5UiS"gE%mC8s P–Qû¤rnµQ¨»ÿçJ¤ÕB >L³Àû ±ÙTÞCÈÇMÓIïG,½I ’H‹I Â+G¤í(l…7 :ØÆŸh+C‘!¸¼ÐýÜ™‚Š» éë Ý7 äÌ?“¾ŸPµŒ´£‘ÂúbÕ•!7…Ï€p:,²²*â¨Pé«ÇKí´fçÓñˆ»±ºúÃoÚÔİ>Ž_qú;H¸—¡9“8C¤ƒåÉ8’xC²µ‰Nc«áÓ†sÄnà}ÄÊ"n ʼŒõŽ9øn·Ö ¯éáI„‡KñË'X7©Š@²ÄûëtC¹¨‚zgxÍAý|Õ¯÷%å\SIÙæý'1ÁPP°ß½N–g‹é«Ó_Wr‹ÓÎA*™)4‹E^ã67Ïmé„‚âá@u—P˧`õÜŠ_¨+¹îØÆ¬œÜ7(|Z‹+Ô™Özgɱµ;ä°9B±Å—r‡'Ÿ;¬¾oƱ÷HŒc8‘Ua”Gæ¢æpï¹jyJ$Ô7 $¼*Ìíà“_䪥+Rý딸¦7 endstream endobj 390 0 obj [ 389 0 R 391 0 R 392 0 R ] endobj 388 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 390 0 R /Contents 393 0 R >> endobj 394 0 obj 2802 endobj 161 0 obj << /Type /Action /S /GoTo /D [395 0 R /XYZ 72.0 376.87 null] >> endobj 396 0 obj << /Type /Annot /Subtype /Link /Rect [ 212.94 660.91 256.26 669.91 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 344 0 R /H /I >> endobj 398 0 obj << /Type /Annot /Subtype /Link /Rect [ 436.578 554.73 539.998 563.73 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 341 0 R /H /I >> endobj 399 0 obj << /Type /Annot /Subtype /Link /Rect [ 354.05 378.37 457.67 387.37 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 341 0 R /H /I >> endobj 400 0 obj << /Type /Annot /Subtype /Link /Rect [ 109.646 322.59 184.71 331.59 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 281 0 R /H /I >> endobj 401 0 obj << /Type /Annot /Subtype /Link /Rect [ 311.262 179.5 359.471 188.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 402 0 obj << /Type /Annot /Subtype /Link /Rect [ 189.1 167.5 233.91 176.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 371 0 R /H /I >> endobj 403 0 obj << /Type /Annot /Subtype /Link /Rect [ 179.47 72.41 222.79 81.41 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 344 0 R /H /I >> endobj 404 0 obj << /Length 405 0 R /Filter /FlateDecode >> stream xœÍÙrÜ6ò]_Á}Z9%Ñ$Á3/©ÄQoÙ±cËNRQ*Å™Áh¸æc’çï·n<í}É®cGÝ ú@£Ñè ¾ãÁ×âG’Îöxñ‘Ú|' SS;~âÆ^êBÒ(uJÑqŠ.2ÙJ½98¿^TžóãÅB§ã¹‘óxáM˜#›·¿€ð(vYœfYFº®Ÿ¦Bsc¶Gçéócà|_ËÞJ{ÁÈûŸkokÄüàÿ@#Ϲ¿øîöâé‘ã{ÎíÞ¸€07‰ÁÎq:©Ë‚Lü œÛ£óÇåÛåm]—OþtnÿuqsKCC:á<üM\éAƒQè ¿XÞ¥ÛM+ü ]†mÐâŒA|*iBé§ø ÀH.„XYÄãé‘–ú;…/ÏD ÅMÄ–í‡Nõ7›l2‹B64¸iú~*€4`sšû ?I _ƒ`‰Ópg´aœX#Ä© ¢Þ²b‚(0ôf€ÑÂâ º'± tÑ$° ASÉñk†bñUB<’àÙ’V$8­!¬,Ð$¬ËzïæçÖjè[naÝÁÆúªåê30Gà¤oëã1¯vH‚Q/ï.w¼Ý6ņۭÿÔÝ=±ºÚB¤8 È›"ß”¼½²‡bôP%¦‡Š=­¡"ÿ–Ï †.cžçù)¦,*î´E·=p`³4ËA a:Ãìúõâ|i¼BèÔÍŠÌ,sìï‡ñŒÌk°ãû¼Yñ¤d…ÜIÉÛ¶¸¯~¶‹ç¤°P}1?D–_9׬퟿}y£&%ž&á”ðYs¡ æQÏֹ݄»lø±~à°âĺnO|[ì XJÿ©æ¾Ç\áY&JuRÜùkfþ§ý=p¹!†¸à öö—±b6­›¾º²¾TmÇs«+Æ_„wE{*ó3x¨i£0F¼êÇÖböï¾µTj»ºá „¼9ÏÙFcÞ䙹±WÙ+…=äeÏ"£5“N6v~{ÖðcÝ|ЈpHŸ½xõÝPhkÕšÕs­Y^¶õÜx !ŽGIdr€xÐÈ«&ßJµýíå wç“ù`B¼Økc6³v›D£e¾á¥a€®Â¬]Š­ï¾!lºÓ¡Ýón[Ö˜–åU%lÌÅbòbŸ¦¸¯dDf½Î d‚a÷&¿A„Ü‘ª/Kƒ)w ]á†C˜å¸_-¬ž«ÊÆljË¡¨å±°o¬/ÜùnÎ"8nXàCÍ`´GT íÊ ‡b{0(j‡ð€K›¹ý‰V.¢¹E%ónð¹è\ƒ<ïþiõæy{¶ØÖÌÑJM´"ɳG‡&œ3K̆fÁÁE"¼¤¤”‹°šzÄZ× J Ä ‹Áq&{"‚›´!’»µ%Knɳ”£‘²Ò¤2’ cÓ!¯A¥1|gÆR?ƒ¬!QÄGäf¨ù[Ì3æìŸDC®jÆý¸;äÝÌ^–¥.¤à˜IÐ^ö³­«®Q%õPȤÿóêúÔÔ÷M~t~â剤½~¡˜<Ý4yµ•L»™˜cŠ+É$ëŠB7±(I²aï Ê5M¬þ±  ´‹¼R54ˆ°w—/^ýøüÙ·/œ›ß^¿¹{23È)%†±€Ya ‘²¾/¶yiø§SÃ!vÔ•Õ&bBÞñÖbR[pÓó«ÿjAÚ¾.ËúQ-vÙ´)ëíƒÖ–¢ÛzgÑÞ]ö§ù‡¹å062Â)/yýd½¤ƒøÈ|Hà žaóp}7»H?G¸Ø/ï5à¡`%l†ŸV¨íÀÆG^uºEÆ ù'¾í;¾su‹œSÑȪ£56{ÈädiÂj– ÅoDÄDÌY8ŒFCÑ“™Fn¦ÂÂí‡âtBõ©åM_d¹ òc7öb˜Œ˜ÍHüJº‹Øþ"ÀB]–0EÑ [£æb„ìx—%&š4Äj[ö;òhl"G¤>‰† ì3# ƒÌÍX ¥b$!ò ;óÒ*5„Êe+!\<—Ô Vu§À¼lÀrç+…oø6Çó*‰{yÚ!áZ³}<äšÌ7ªÌ˜Ö‘n›¾(wúcª-¢¹ú6ô’Ñ ÇÛPVHx"a‘`k$ÇC ïŠvÛëŠ?K¯UØ3sH+ñŸ q`z6½­o”ÜJ˜ï ÃdÓCh4Š[‚gKau^%œ„醊dÔV  Ûö<ïz¨rfìåg#{Ý]Þ|Úò²Dòà”ŽG$RO ç•õËþd/E’/1PV@̘طn;=¢§úÔ—°Aï,ê³­|¦Em¦E´H¤É r„’íÊ]´Ÿšù#³Ñ@„‡mÄ("´[*^ÒÔRº¤˜23÷ _/—-Q¸ÆâjY6”êk”O¿_ËLS3•Êì XÕúîîÓʃpÕjX­ÜIÂ>ãö˜yþ¼è+²™·JíXIÙÔ[`ªÄÝpG‰ª»è´×—žÝpØÿûÖnª \b„oäm5 z«ƒ]\ Ô2X³Ô[ì R¨…KíT¿F§ö„‰»ë“Íä±) Ø´®Õô«>IF”YÊØŠCå1µV¬e…´·F‰­†1²#ÌEwåÚ”yõAc²×öó$8~¡Ã>âÒè¶Ün?ð/¡±»QL$5UHDT”¸ûP_çÀ¦†KÒ±áðf LÅåFdçj‹•Nˆ€Ô`ÛŸ„Ï`8•½tô¬l ³¨4nR«;x‰jàŸN"ÿ%ìHWÞ7œïêãT¤¼RVž"òéÎÈ9åÛ™ËÛ0óFFyîrW]}F#ý¨IÕ „o¸Õ}b¸ðèËÎ&!_#T8›%àQ`½¥øÙúNku*¤¨4E3H{}m©Tí–DÀ‚q v{°ujjäqbÊÈ ÆþE^ ²ßø`Ë äÆ&Œ.ómS/|;ñF<0°Ç—´TY¨øõeW\Óº¦6 `ˆ˜³1ÓÖð}ÑØ*ª”mçÔ6âåìP2e£Dœ÷L§¼«[u‰¨¤1Œ®ixUY}ó³Å¥6ð®po-;Rªtõ‚2&'£®í¼<ʸ¸¨w ¶ü+[Èø1ˆGFìÛRs1Þ(5O›–ÃE´vAF…¨ÝКQ ÞWvZ_OyEµ¶H/µIí]q4œd šê¡VÅSéÿOÑ«]ýùÖêºx(B‘™ˆ›²4 gÌ&o?¯§öe騣pì• s†tcxPÉa_Úi”N‚Ño%èÜØíâ„AêíjìWܧˆéE"‹á=>ú`à\1¤i,ô×”“…¾†ÞOÉÞÈJ)_Nïv‚ í4ɲ¥ÿÐ4qÃć9d3TÆ"tF?gÙ{(Ƶ65¾I[Úšz0"᪮f\$òFŠL’¯k?5/SuQ¡UøätÂzx2´H•¹‰º™R=;ôÕ‡i6$jœ  ;Ä/—ûn&îÔY¯P™”L¢âôŽî9Rýz3•©ô1×½ t5 ¦Øèë$GšT›ÑøJiùÙUð· P3”§SYlu&ïË$i:µq0ûŠY<â_&7ò)~N™ ‚0…(š%sÚœV.ïÒ5JËBô–üÊ4Õ †·“Xl)ª/cÌ ÅÕ|œ†ó&] Cñ*ñtóà€ˆ]V¿;XçS‡ ü‘¨G|°Fro5(m€à² Ä}LŠWSΟÅ"QY&×âq*­ìDÛd1ÞÕÖ|Æa{шó5·,q_Ö›Ü2 >1’p{Èñý}Õ¦a(¢/ÿ„ç+ LgF¸ÓÀÝãR××KºëÓ¸½o` =à’0ÝBñàþcÏÑDÔ(•®,†¸^„7‚éŒþë+ W‰-…­@ã¡+n‰¨£D‰è%€èݰë²DZë{‘çC9£Ëg9„*}…~Aó¶ÛÙf7Ÿ:E8Î;ì á~×÷D% εƒ`†Õ´{æfËÝ$L¡LÏ`‚ìK¤@ú›¬týBˆÖ)‡4bÛ—y£nšè×3ÿyOõ endstream endobj 397 0 obj [ 396 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R ] endobj 395 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 397 0 R /Contents 404 0 R >> endobj 405 0 obj 4187 endobj 323 0 obj << /Type /Action /S /GoTo /D [406 0 R /XYZ 72.0 612.04 null] >> endobj 326 0 obj << /Type /Action /S /GoTo /D [406 0 R /XYZ 72.0 484.9 null] >> endobj 407 0 obj << /Type /Annot /Subtype /Link /Rect [ 194.32 407.24 243.48 416.24 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 409 0 obj << /Type /Annot /Subtype /Link /Rect [ 416.512 279.512 539.998 288.512 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 190 0 R /H /I >> endobj 410 0 obj << /Length 411 0 R /Filter /FlateDecode >> stream xœÍËrܸñ®¯@ùykD‘à{o¶cïzËNyת¤R–Ð ¤¡Í!G|h¤|}ºÑ>f¬ä°‰w]înÝF¿ÎýYÀ|øïÿIsÎÖ»³{M XÊY˜hRœ° õ?c;¦‘,ÎX‰G NÑ`¨¨z6![ö³êÌg¿œ}ù “6Ì÷bv8óg̉Íç³ßAxœxa’åy®uå^e("ôÖ;vù~ÇÙ_k5ÛhŒüÿ¹ö®FaÀÿ4òÙÝÙ뫳Ëw1 |vuk] à¡—&`ç$‰Xæ…<Ç?œ]íØ—óÏ÷åU]—/¿²«ßÎÞ^é­Ñ:tÿ§žò Ñ@ùãÇ»º¥ÂßÈ ‰ǰ*õêqÀ€±2ý{Ô š•³xz<ÊR¦ðã'‘†@ñ²Ñ„ܱýØ©þd“ÍNeŸp+æLW[É^²‹(IçußíûÎ⇢,-Öv#t]W(*KMS7Ýɶw²µqS»ÜåƒlžºmQÝYZ·Î íé–°©e[ýÅ™Qßý¯Ïw¢¼­›è:¹qUÝíDµiWtn®=¸?®ß?àB 'ÃBK¸EÙ7²]Y’Üí»'‹.­o¯_: nÈzºÝ"ŒÍ ƒª+ª^ZJW[¸é+ÏboÑþí1NUíH]‹¾ux6uYÞˆõ÷vnŸ{aèû~…dŸk¥¿:§Cg¡ŒÝ°ILë[”ìXÖ<ÛVv°…»ë—Þ„;d$('2SÍœóx®ÃlÚÅ…è»ú ·èfL3ˆfûæDÿY÷¸Õ8„ ¤ý‡Ð­x#Û|¨›æÉ¢ƒïjt½.6 ´4ù¸U[Ô•%1øÓ ?ˆ¦7¥ö#¢µEµvtqC+¤“° £g"{óa3Så|bªBé›d4Od6B³ gjQ=YdfId‚;J7„8ÑE„²¨äÊYØXø®xGD¾øÉ-H&Ij=Kº>åŠív]÷¥3¦C‡ã1 ²gö ühb`£ƒÄ)`{Ñ`.†iã¶(å&—ï ò$£ô}4Z<óý8ψ!øakÍr>,Šs/а™Èãñ"Ô=ͽÌ8*ÁúŒÁlj1#%ŸJÉ!ÏrÈ<á ò.ò<ï§Ë£:!CŽ;J6ÏÐ$§`¢ \àvqq\‹$>µÒʾ‘Æ Ž!…u% dßÔw³;{87#bX®»•%PqÕ|)ø Áª Gç‡Ö¸G(*—ÏÜ3Ó`²½X6bÝaœÉMÑ]n‹¶«!±3g’ƒÁ°xòD{ã{ʱ—jK¸&³„z½î©Ti¼ïZȧÁeTYXÛ”¶DÆ+g‚M›D0i“0Ê´^ê  0“š–5¦Ò°0s#:q#Z‡r=š\ìàèäÌxÜO'ÆÛËFõ.P ‡@qøC,²«ÉL„­É6„Ü8P‰7#}‚Ѧ ûÖ·ÃÎÉ ó•zÛÁhÛŽžï]êfCþ8gæ 7+ŸÜtë­EMyul`· ŸØÍ9ò”{‘=rÂ0É–ºQ% U9‚uÞ';èæ,ô&ØNOuø  ¡&îi•ñQKº>/<é­,Á‚Ö~[t²Ý ô‚eML‚Vˆ9‡´óˆça0±˜¤×B:UsxâÃ]kŽi¿>Cž* óycŠñ·3ØëþöÎýSåÐûX¬P<ƒòÏ I‘ˆ_dÙ¨,Ÿp[A€MªiA£þ•`%Ú Zƒ^Я:Ÿ|PÒ”‹^aY´÷åc‰n­N¦é58œŒp) ýäwï¿Sy~–y6±—³™0Æ¥¢‘|« 'Ánš74ÚÁuU>yök}À>s5Èõ4«Ý¾n:¡\›(íº)ö]舲žêu´n‡!æÃ ÏS?]Ø öYYŒmÖß_ýñ·WßøÏG+ò/ 8x.t%s–«+ùpõˆ¡ÙJãxÃåÏS­ŽëÕ öá“úÙ’.GU€+XàOf__?²ãÛæÑÂ’• Òã½<„ùY.Ë»?!0…Å4¹<:"¹e )û¤ÉåŽÃõ2ÈU²°t>=ò²ãÓ±P~„l6]íyžÂÄ8]ÚÜL¶F'¦oj†ƒ‘€}»QÑ;ïŽÂ0òâÌ’†£‹h¨º½Ò êt r¥qÄ(&¢»B¶ÐÑ|s{R³:”f‚êÓH¤÷„îjafBïh¨E«]”TµG-iê~?ï¤n::ð5!?7>ÆŒ ²«Aìô¶/¡ôqqh 6 ýf˜Âa@Óš¥inóž}«yÓ1ýÜôuzšq´°î5* ΄­ÆR%aúýÉ v%ØZžpÝoèA]³G¦YÖ.—});jƒˆ$‹Î0ÕLk%ˆltâöÛÍød»Ô°ã÷žli žfŠÉq«®7‹"{ìxb:R ªÞœ`0§;0€öQpý 4̼u9 0ÂβJÊG¹îéýøH8¼Øú«‚ ŇÔ<å°g°æî ®,„[lè‡!îªÁà·ê+Ø&Ä^FvÑó1©D’ËŸxÃ1A¿ðb)È!X&½FJâA³5–2̧˜™x37ò3/RεFÜ4r—ðh„,ù‚>‘ãêä à“5Ÿê„F™é4"<ÇJÈ8‘+X“ŒF3ñF£Ñ¹ÍŽi¦â5J'VÒ´™•†×ùœe³Ð…™Lõý(4a¾‰Á.¾‰†yžw ¡ÜAJñØ0áÍT³u”Áñ9 ú¸’¡ÚCà[¡ 6éfD°Ni ¾¾.˜Ò™)6–MgÁÊ‚´ÈËâEeÞ4§[ÁØ…»ºµ?R®’­£Q7--Ê,a61 =f„¡z-TéN#*×hXVP·q_r³²TçJJs%%ì¾§`–¾fF§OÈõ¹Ã/¾²Mg…¨6ë‡lÕ›ÐCÑmë~úyAm7á“íbÍÇ[1$ìH•ò¥ÅpÕ…ö"<ˆmƒ!XB|§‡sDôÓ@õI‡¡Fš»~xöBÂa[èדÐx瘃±«Bt§äœü!ý‚ yo_à³´+¸ÐŒw¥…hS÷ýˆ0=Á¡Å²)Ú})žô+–fPåI qPýUAcŽkŠ GâaF»­ËlaÃqàO6¬¿ º\µ'èzõ½A¡Êƹ~Z0 ¶qNŸç dÎJ!Žs§‡ÊÇŸsçs_N-P1°€d#;ÕdêiÝviC¿¥y&úC_Û¯× {s³™W-е}Ù­žÓPÅ!¶-PÎø‘†*†ûwLLwHÔ8L¨0ÏieæÏ¤hÒ¸yYÒ(¶"ÈÓÌhé4ž¯‘nžfbøDÎH';`Ú—Ñ\e”™N.áYVаßÑRŒà4n¨–4rÏmvL3ŸÕP¬dhS+l¨â(ôR|Øðyh*H¹'[¤8Õ“87w¡U‹Y} šA:,v;¸û‹N2üîD ÞŠðB-Úg…~¢áx)>"0!¤ ñX’>kËD›Ú%<ëðaÝÍGR4i⎠å—C_’…F# D#Âó52á0Ã'rF:ÙÁ!ݹÊ(3\³¬ ’DK±‚5i" ¹ç6;¦™ŠÏ ×J†6µÒéÉRíL BÜa©øœ •ć-„pç¶Ò (Ÿ<ç^>ü`…¡ÑøHô1HSMÖèðÃ"ÛÚj(¯ëѧŴ,õa4ËÇÙ/GÔnà†0ÞÍ\Xð}ª|š¿G%‘ òyœe¦—Û³/øi“ž ÏÒ{Ô|Ý'œªž±'¨ à6ØOâ›X·.Ôc¿ásœj^€L”u%)P–oJQ}gø oôËÀ‰?Å endstream endobj 408 0 obj [ 407 0 R 409 0 R ] endobj 406 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 408 0 R /Contents 410 0 R >> endobj 411 0 obj 3049 endobj 413 0 obj << /Type /Annot /Subtype /Link /Rect [ 489.082 638.97 537.504 647.97 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 415 0 obj << /Type /Annot /Subtype /Link /Rect [ 102.427 361.26 224.942 370.26 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 190 0 R /H /I >> endobj 416 0 obj << /Length 417 0 R /Filter /FlateDecode >> stream xœÍk·íûýŠA çÃÝxFóvaIë´W8/û’¢ÈÁì®önšÙ™õ<|Ùío/%Ryžó%­ó0É‘(Š¢(’Ò¾¿ðþ¹%svÇ‹÷Dó„9AL¤(vüĽÔ9:„¤QꔢáM $•Z#òàüý¢ºðœ¿\üð#4Ú;ž9Þ„9²ywñ- Ån§Y–‘¬ÌõÓT ¸1»£óüöÈœ?ײµ’^0òþçÒÛ>û?Èsî/>¿»xþEäøžsw0&à³ÀMbÐs‡Nê,˜swt~¸|÷¾¼«ëòÙÎÝß.^ßÑÔ°Ÿ0ÿ&®´ Á‡(ô†_,ëÒtC…ÿB7@P\Áħ’”þIáß‹ !VVçñòHMýžƒ/¯DÅM 2K÷C£úU6YE1öŠYyczÛWÎ3ç&HÜĹì¸ApŽÏ¿ÈÆ\ÂÐÃÐó|ÏŸ°»ý3Ï ËWŠÁDŒ8p£0õûòµ!¼´¾åA>äeÏ­ƒÅ‘d X‡ŸLÇ»6o{kn´|4Q\>[—£[?4õqEGußúîzºsƒŒØOí}Ï›³Óð®o*G¹vvuÕÁ"´Øâ¡(é˜Ã>ƒÿ»¼tø/§†ƒ„u_Äþãû¢s¶ýáÀ›k‡w;w:rºi #{±#]•g8ôÜLmb„—÷p솰=/K§ìÄšf°1í%EüÅâªùà%à ̲|Ô„£h`–H’;ÀÂÛþtª›®õ)ª{CÑб/»â¦,*3çwß¾1¼º¼ãb´Íe»yfqÔà¶ÞŸ]ÝÕ<Õ§¾„ÞSõÇñhvä6ÃL¨H®ŸÆp! þXt£µ¾ æB4œ !h`=ÔVç / h~=×¶µæ¿ð]ßñÆq¬­B“å Ҍ’t¤° øÔ>/¥Ñ28M„‡Üó¶h„'Ü<»Öd9C¹ a” a aÒ."¹†¶e^ý¬1R0"EÕv<7œå‰1‹XbìƒwŠüé,ÿ¸ìâÒ`¥Ÿ¦²4ôX7?·–Üoò]W|àåyAcxnÙS0ÛâP/e0(Ä7ËLzÁ2Q–¥Q8íõ6Ô¿¬÷c;áÔ‡Èåãƒc òp(é´ÓØ)Büãùn 2“,ÈÈÈ‹¦¶8m÷¹À‚3up œ—m­<¿–Ç7‚úôÖ”l³Ñ„†á+ õ-y³ÌrØÙªÃfYúè>ó£™IÜÜ€„pÈ®œª«e±ç‡áLw3i¹Ëž’%õÜ8\˜ÍÉòͲ[ë©‡Þ µß·BÉFÈöiƒ(paºh«32že ÀðVzâ1‚Ö‚P?h)à„vÏÍØ¤ÉCf·Î=ì`'w>Ͼm ~pDX[÷Ð‹à —Qx¥î‚µ-/ëÇÛ@báMRˆ˜ÖlÒNؾ°y P7— ?ÖÀ;`ãÆ¶Ñ\¥™.š„©Šð'!KfƹrnŠ%V,4v#è•fž?ÃÂ!mÏL?JÝ0Ér­NÒîHX¸DÈP‰oKj?cI4šÔòêû¡ë%TAŸö»ǰÑëþÒùúßþ¤ð+'Þ<Û<[>}éR |F¨?¥®¨'’kÙ“ Ð³Šï­EÁ,Œboº7fJôåTÖ¹õMÅÙ×Õð3DµýÑÄ\(ÖÏÕ ÊZÅLýìÝŸno J5~#3^R¯nÜ€?9ÕÕ¢Á‰¢ß)JTû(0“±.•1¾/ªKÃø© "²î¯ìtó“­J|³ÙjX­„«)w…aiæhC×3»\¤ä ·ÅÚÏNFk4Ò~ÆâP™N纟êMdo½©Ë H”¨Û®FÍ«³Aªþ¸ÅZ=â¸u6V‚¸u‰$ñÂúFi=µ³¯÷¦4I=-X%mÆ’”„ˆYî5éCZ¬hUW\è©"ƒp¤HQvdŸ;¢"¾‹Ùž;NwVÓ-D±%²Ô¬0È<öM)áQ×=&:zÑ “Å^û ¥lnh|;¡;ÓÔ;¾ï›ÜÞäÕ}ŸßOî1 2ñ"ð¤iÿqüˆ¹Yé‹„kÝZ.··Æe¥1\}„‹ °c>hmª¶Œ˜½UwÓ‹jÕˆ=ægé¸Ã}6qººq:šÈ"™Ã^ÐN]°<ð¼ë]}þ$ôáàL–Yè&!ðÌXªÏˆWÎ÷4•ÅÓÈsBÅÁŸ±8µ‹û7âºÓ$„Ò<"Ê5Kä••]CºµºáîEøØï ¦ó¸)ûÏ뾩,¼}àe9ÒP>µBO£¸æ¶, rå¥XZ ﻚ‚Ûò¼¤Žz ûdÙC¹9mMІîC×'dP]$ð)¶B,¡/­^J‰l¨^‡˜Ò õ“—ì3š2rBÕ ¦DLšîâ­%‚ºtSèûW¶8eÞ”‰Ô6x9‡*—DçS­btîÅ:6Ÿ®DÈF}þ³üðf¦µbdS@Ad9kŽÝÄÀŸM¹¡¼gHY–,ƒ=çš$s\-ÏZ¦VñÚ(êB„m)ˆ¢¥ üÊ€¸}&›¤ñÇ{ɦöAºaGd_£KÖz>C]ÝOÊ0 çý¤B¡ †¯ †¢Óð(-·>îù Ú„ÄWTÞ 1 ƒÁðaÛѨõµàC÷ƒ°ªó#¶lKYà¦âшÆ3“Ç·E~†%våž}OtM“t†Ï¼ôËõê0ÏZiK>)[Ë…6&n!bq6ÃÍ5ÝZ z¶×=Ÿ<ªS‰ã§¦¯è‘ÌMŒ^("9T€ò\Á—R6P,!¡åœâñÐca8#Éf³[NΓ`­«šá°x:UT=¿é!Iº‘—pªž*[¨W,iaÿ•{ƒS®(aHØEùÌúªN¶~‰œB$Â2Ï 2FØåŽAæ­u4Cï†RßsK,ýjftžA2Žwèxc"fÌ‹R„Z '÷Îb*|lÏ Õ [-á³Ì EzÓ‘¯~}µrk}ÕØÚgi¡ñ@UÓq²¹¼­üøP`Ü…S13!¿Ïbó,”ÅÃ"ƒÀÛ®Àè‹Ñ+›k…!_=Þîï~ž.E6>º¥?LÄÊ‘7Lð…‚VJûxÉ»o6ÃV¸?sÖ®Là˜IÅe¼í¦ ÔøXT.ÚZ*‰yý‘˜G)낊[Ü ±Þ<#é¯/ÖL"Yíl¤4Å}R¦\­Dor µùAÛKqß?˜©Èã\ÂeÞjNûšk:fÞ y’G£Œ²/d§3ˆ¼qì²åÝ#çäSE(ȧîlPº Ô¸*WI¤êËR§’@‰<"ÅQ<”Ä·“D’……Önø‘« E*º¯Å[íÄ…9»µ;æVÛáÖLƒ¹ã,òÇ£X!¸mY5Zzà'ª/žEei4Ãeý}C¹LýÊbÚ×ÙÈ»¯k9>­Äâ^€)±x7äAhÄ3­…‚a^¨Z 6¼º1\õKPÒâAƒ[>W¡Ât$¡>°}Yॊ„ŹÅPáÜ€ú/¢˜å¶³MÕŠû¦hmPªFÚ5gDÈý¶ãey=hiõ[¹6MÄ-#Æ6S%¬¬/œK+ÍÐäâ ÛZòÓàÞº^˜ê®oõë‡õ É÷)ê±ÑT®«?¿ûþ§¯¾{óæ§·¯—_6‚=ÄÞ¨§^•4YÐÄ&Ù) »—† V1É×5¸~Ede±¦0^©|qd«Û|RIb+/-™Ë<,Î(’9y±*j¯DͱôÇòà”“‘EU†”^mXg=Ó ›°ÇcY)Û#Ù?b5fÃÊ»HdÏy_v®ëÚ (ü üÖ€Gb R"_¦J>GÂ…Ì £“D·–8ôpÔÈ=}'N_Ôï”XÖ`¼µD¤‹Dà™ªüýP­:ó¤*Ëú~"~Á–%,€æþBœ†žï&)p€p5ÏdÝØc>\¼‡¯f‹ï ¿!›Ê†¤Rl¥3ä©WçFžŸÁÙ2úy# &cIýþu2¸nëâ¾[\U<ò­¯MøxK63 3É|8:8#»©ÐÈD"›ð1*¿ò h3*‘”8㱕4ö‚×g,ݓŒµC¤±rô/!3'yëØËÜ0N=?‰T¸®Ä«¼ÍåÕ+çåKçJ8ý•Ûo`„i‰Ð3P/Wü¤ù%Û´Ÿk¥¾e~j6í+àä°aZÞ|€£ÑzºíÈÀ›êÿyKÅ©®F*צÏGž‹@c)ÈX 9©¨¯%ÙŒO¼"õ4ñó ŽçT¦¢jú)óßsÕ endstream endobj 414 0 obj [ 413 0 R 415 0 R ] endobj 412 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 414 0 R /Contents 416 0 R >> endobj 417 0 obj 4353 endobj 419 0 obj << /Name /Im7 /Type /XObject /Length 420 0 R /Filter /FlateDecode /Subtype /Image /Width 640 /Height 426 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 <000000D4DECD54C04201913B5A5A5AFDF40E005A5AB9C3C8D80000EFFFFF333333525252E99D19D8E7E75782B8ADADADD6D3CE212121EAC635207676FFFFFF8C8C8C666666A5A5A5D56F17DEEFEF3A8686F7F7F7999999424242535A5AEFEFEFA3A19F111110EEE5E881847DC0CECE93BDBDCC3333BDBDBD2E558F86B33E666666909C9CF1E9D57B7B7B844A1ACB9E7EC7C6B44A4A4AE6E1234C7A9BCCCCCCF55555E6F7F71F4985B1C6B03A3A3AB5B5B46BB0355D79A26A64582637AB292929E0D7D7E0CEA8E5E2DF7899AF8A8A8640669AD4A25EFF00008484848994941919191B25ABDC969692A5B34E708FB1C75DD257578D6F29DEDEDE3C608C006666E0934EDA231AF63D3DEFA87A3859717B84849EABABC5C5C5B1BDBDEAE7D7081478737373EBC777ABA9A7F7FFFFE6E6E63547C2A9B6B66699CCC1B0AE080808D6D6D68AAED56D87B1C4C2C02D60A0B31A0F7274E483A06FF67575E0883D4979B3F006068A9EB898BF5BDAA7A7FFECB7768080BDD6D63F74AA999999DAFFFFD1DFDF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>] >> stream xœì½—”F¾ÇÍ>—=^a Ó€ót!0ín™cØ,×r²Ôõ.#¶ ÍMÌOb®–¹,!ú4Jvó¢É՜̿þüª ßfzŽm”ï™é¨÷úðûUÑP Üß¼¶ß`mºíŸKÛî`àVƒMãx5< Öé˜òÚt—†Ã|àªßŽÉ7ÇÎÖš¶x¹ý‘×u¾CòôQ å“á<ü¶û’KÿÌ:ÿ³Aö^eÛ5ÆMC›¥ 7XcOˆ’‹(tÆÜ ÉÝÙ®o»—íÕѱ €~«ô¹kà{9æ¬âµ¨ñlCͶùÒ%ir"Ÿ8À_²»w?¾ûíåyP‚YGcM-Ø$D€Œá-a˜%¢|?k7Šœ–ÂW¹/:ì\hÔõ<åfw[_ŽÙÔ¤®É¬-YÓ45«ç­³úÅô¡Ðk€ßË4 §äæ]—ó^†ï‰»èÏý"Üûæz°À9ï}ÿÞwïÞ“ßþGG& ¼qÊ=´ëjˆ¢bŒr—ûgxILo»Ò-„\y© b‘mV@¦Aê¡‚ð@Un×üM|®l^ÊÀó ­ÝÀ“¯âS€g­fZ¥Xd¾§²‰iSs»kgË´mR’90¦ù"ùkÓü-±wØÔÿ¸[Q'I’ó—n@dåÄðA?d èQ›0›BH±aÎßg§OŸݽûƒõön”¦u­å$R È¢. в"£Â«Lø r jÛD9ѪrM"^®¬Zó¼Ði0à¸ÐêbV¥™×rµ" I ³ÒÓUÈ Ì¢Ð»š¦™[°ß+ÒÚ³¬‚Ô,!ÿ1|‡v-èîn›Ì ÖŠQM‹‚µéS(Ê êR®ß{kè;FÚªNÂynk3˜j ÑÎm’çõ!ã¸:¯íÚóêr7oM䌿]Àïûâ‡÷ß¿övçs;MíÄDuêAÿç–”ZPÖ…8E^aË­QÒmZèwú£Q`ÑŠv€ê[È´ò€/A@pUcËKˆå‹$ð’ÂKíL"G•VÜ©C¡M-µ“üeš%-».0çodš° ™ ³¼4p;·0ÏŠà7`_t ×X¿cFnLSj7vÒÂfP·™Í4îd×GRk,å*9}úŸê7?¿ÿ¿Ÿþþ½6(mRàq³=iùøj7˜º;6Qgÿ´¢òôƒç-Ì‚×x çÁÉ×…VÔ 0mu…÷¿f‚‚ ó­I@‡©×L=°ÿ›œBS3‹Ò$žW‘b{ Ô¶ü±”¦œÑ‚4a“æRH&wƒ’ù0 •¼ðÎåz5±:Äó¾D"âÚÖöÏ#v]2Tfÿ $ótÝ#ûùkNŸþütñY”½ýö_Ú `ÄPQÛ)-˜:à]Á_ „Æs7æúY–Môa®pÿk-Òªªrt7:u]«šEUË3ç]oñˆ2ìU<È)J*6‚‡Ï+”æÍÂÒi–ùÈuxzC%IXáÆD®\œiö«Êk&»7aö8!á>|€¿çP`*¦ 3×ç __EPßLÔºcàϨs“¾Øíõ ªµRtN]Òä0û¨²lÍ1êì_tã¿%þªÀÓŠ ‹-Y6p±qÐÌ÷ʹ°™KÂPãü+¬”¡¶TÎ{Žû_b ín/±ÜlÌùs!no7V![.ì.­bœä¦l­Ìe€¿‚åü H’í ø«Uu1Pö¯I“L–eüÁppÙ÷zÙb¸}oHgÿ¶;þÄvÁßCOÎ#"Ø¿Hð·<‘PÁB×G9ÿϱH¨.ؘÍ?øm’¤öO–[²HƒŽ¡$Æ0‹¬ QÆa LÁßöv<ŒIŽeΟmæà;«|l.W¨µU6Tkž ›eÉÿŠñ_& ¤\Tqž›=›¿¬å/®pMuÉþñ»wwSЦ0þ#²¶`Z@½ )ŠíT©gqzfÆß0Dvìª%ñFM` þ´(]ÌpiqÂÈön#³1¢QUa>ã/Bš"ìÌí‘®âbe c=`ä¸ZФ*ðW¤ôyjS™ññŸIå&ïµ1%%­ëkâ„ʬ=Ï7®Ì)FKÆEãñŒIÊ1ÉQ°@\©ëV㪲ˆFPΖ&Î%GÑ«Æn…Æõ6Ù F‚cÝX.¤_ò›„aož Ì‘M(dMþGÒ´)+ØÄ”ÓÀÜ]¦.ðOG0~Z€Dòf°áUü¾¨\mŽ0 >ªØNñ‹mÐ^Ï&F’²É‡c‰¿šŸHóýƒgØ9ãš8- )µqŽÎ KT°Ã«ë­G÷o™k­wÒ–¿œ¿baÌÅæ—:æƒÖ>‘¿»?¼u÷î?¬ã/ÙÝÝ]—°û”Ðö ·îYîÆ¯Ç÷Bç{ñƃÏ/^¼øàÆÅ‹7Þµ÷Á_5ßzåê[×Ï/ú¾¿”à>Ÿ`òþ7wïÃûíë?ÜÿaÁõª·±M·s„–hõð¯xn¿j¶n¼6kÄ–?m(&ÆÆÄbú¼éäíÁp .Ú(·º5`VÃö·žmîß2Wvd¯PÂ_-ÑýÊb³ñ”=÷ü‚úò#ª®ª!çoeE¬eþîý°ÁNí­á/ׇäY“v½þIžûEê{C‡Õ|ú3ãºãÞä?¾þr½¦_=¸1üéÁEˆpñ;¨ÄGåZþæöïá7oý0Ó³S ¾yå4Iòþ½E2—Þzëúœ?øór»‰ç!-®\þãÕ¿»÷Þº¿”ª=îVˆK“‰>ç¯ü½pîÚY}€†ÛÛœ¿,ˈü¹r x‡š6@Í Ð}CAAl kà±}ç¸8‹Ñ ’cxULc\dæÀ1cÙåü¥ü˰ԧ„ù@J…G,âtÉÁ¾b¤dˆú†— ÓʼAü"Ðz «îq¯€çO0f3±j™¿¯Ou1³ü‰Ys• \†¡VUƒÁ¦'˜PÎ_Õ4GZÁrëÞÖ8«-î.füÝû׿¾~û÷û׿þU¯!øûnøî矿ûÝwÛ7 û7/Ù2—®rð~ZÇhe![–µ|5çíö,ßý÷¯^½°˜ˆ9ƒ» Œ2çÛO\¸w·µµo€óR—5ž‰¡Ü[対öíO®L:þ\sÀlàÎ tá_Í|P¸Ck@ÙÀ4²=p¶¾4þÕ ·þøô [È]åï«ÿ^æÌ:Hð7óP•ÜÔüƒ›\ÎXêGÁÞâC¥UþÎþ÷'Ÿ|òûß¿ýÉ'ÿóõ—üÚ^žáÂF»½{ãÆà§í‹ß ?\žñ׬WùKžûù›™–ýïòÙÎ%üò‘ïKKK $縮ÖDh¾ÙãüiÛ®K‰3þÈûïßëð{ëî…÷/t›õfHnÑóvÖ=ãïÄ£»òãÃ9yÚò'nàT¸n0„­˜õÀráÀk¸£ô¼îsWBàOøNù‡lPð•E+]$&x¶ak;íƒäZþ2þþRùTÕü­n.é@éª}öo¸Â_nAÞÞ‚?¨BBi.ÞÝ¡ÎùÛ®¸Y¬‡.¥T;4ëN,çô=¾Wó}fÿ¾Vÿã÷\Ÿþï=^]òý¥N€¿í‹—/rþ¾ÿ{ù»¹ÿ%p”ï³ÕÃë?‹,×ZþVg ®å/ω“s÷Þ»z ëÙúì¹¹AãØ•.X2WG¼8¹ÿpÆß[ßÌ·2½š?\ÐMÈ`\-ówöÒ;W>¹òpîgüÍb•5¨ÓAc þòŽ?Ìãì¸e8À2äÏ⑵(²ù›ðoÖ µÌßpsü Ú¹/Ÿuü œ¬=á·ìÿûØL®ê‹_*füÿ®×ò—FœÔÕ¿þÆüôoÛþ¦pŒ/ó÷94ÙO7ŸôÓwÛŸ?Xð—Û¾åîç/Ï? øó¹÷¹Î91Í ØAå¾ùGe¯ŒrÏýðÖý ܱ_¹waÁ_NW+sRHdéÎÛûwgcÍ·–fËüa«s]ŽVø«®~ûðÛs§³ùÇŒ¿¢ØÜ¿L´‰)htΟrgX ¸Aô ª5À!àäcD#Ã2TÀV›ƒí``ãÁhP ç¾QþZûÇAþÚ”qû¾ÌßÝ¿íÁqöøO´óªÁ þÄÂ0Otá§±õ¿ðíÀ ƒrµúÔ©³È—Kóß/¿æüý׿f&¬\&‚~uqxã£ÁE˜Ì}÷»Â_‡Îþó/·ßÿæçKùÕ€ßwm'çþp÷­sOÜ„—ÎÞ¡…¼ÉÒæþýŸ;ýðÍœ¿†èÈA=˜ï4Ã`ÆŸ˜ÿÝKç.¸CÁ?ÿ’tü Õ sÑÿUË•ñ¡ ì³'†Så0t«”)Ì?œl’qÊbŽQ¨e0ÏÇYÔŽ°`ÏÀ6âšÃ¦1˜‰"C<9nC‡\lXŽÈ4(êeþ*m~¢`ÆßÓÈ#‡ï ߥ>ÝY‰—¥!Ø~¦åo¥ÝWÏ?ïÝýáþýúéÎ?]1y6¡À“ç_þ%ÿ××ÿzÿÓ÷ײÁôáÒéçß<ðÈ>þÀ÷Ýyÿc„è˿߂ˆ©ék°\Ñû÷o]ºúÖý·ÞºúþÃå5¸µhà‡K¶HA¿¶8ÙsN›mo sq¢¸š¤ÅŒ?°¶gf”<ÃïèÀ©À…¢C÷òS&ÿ²4œ¿Ö葹ü-ýüöϧâ`ö´gŸÒd¶àïÞÿk/9ñ·¯×“¡ã%?t ûùƒ1½Ô4lé·‡Ž¿R?’¿« ¦è̯ßj–â댢±išã±G›ÅfréÜ\ïßZ8à[ÈÖ:ÃÈ×EHªùÄ„_ðÆýþ6SÝÔú²H»â„¶™ë¾lOã‚©së7@¯À;àëZ'Üú­’ÖiO¤gFƘ6ÀîÒv —?É’b¶²y¥%²¼Åxq4[¨ÓOâ]û[Ò›  ׫øµçÀÝ>ôÄGO.ž±O}ý cþãú諃W¼’×?×k±Ä¨×LæŠÐìm^^ Žš ,wçùîÜÝÚÙë+Èß!:ž§ï¼š7ÑË{ŒÕ³3Ÿ¬¯ÛùÛá¯×먞¿^›TÏ_¯MªåoÓ¥èõÆJ\ºéBôzcÕó×k“êùëµIõüõÚ¤zþzmR=½6©%þª'òê'®S‹ýÕ“— ÒÛëTžùy~Ýõ-¿rQÒÆþõëk‘÷>øâ‹/Nóçwׯ֙¸4Ks›}+r£ÍtÒ®d@‡æZô䨹6WƒiÃËɈ¨ë\þŠ+‘@9,÷? ø™€¬þþ§…wk‹ô”qŸ&©N|öÙå¥ôgøýø×ß™¥kŽßµ§Íñ¸µÄßão¾ùø}>çï‹Ó§¿øþ4×{ëbüVbLjo…kÀ[8鬪íSR«‘Br7ƒï…^‡]ï5G»k'iš#Y-ê:•e™nÇ*HÜYW!ƒæU_­Æõg¿Ó<[ªëí3Š£* :þWªŽ•»Òü&,;+¡`‚LÝél+noΆ&ð©2ã†_¦QUÉÐB±Ü 2¯Š°jGí5&ÝÿlͨÝZµa#¨%ÍY!Ë©¾zá,«¡#yèjhþ„ËÙõ6Iljùvß‘]Ë þøÝî÷sìŠû1é8q ý›¦HÝ*‹ØrþäÊD<³ËUæÉý«—òÆ5E°°2MÀ)ðÜØ† ©<ôçü©L†”I’Ôáb+ð—\¹z©fâQt‰¢™y%{JÜŒüØæSLë¼±œŠ„±L*NJ庆¢u>V”³‡G¥¤,ë´'X ªÊåIãTE¤ê@›ÊGY&…2yfN¨t³¬«E5ÒíRoãŽ*ñ„Ñçɶ²TQÑäõÈFK÷°f‚¿hHÙÞ.âÀ•ýlþÅNöÅåáð‹Ï>˜E©þLøàË?þç'ƒY°%þÄøÏFy)£Z†ö°r;RÒ§Åæ…iÎßö7‡ßþ›Ð¬§ßãèýßÿýß»Ÿþ@lX½µø«>¾æýõz=4¡‘£¡pžâxè×]°Ä ˜UU¼õöñw}ò×ó’AÇ/CÐë»U¥ðK°EÑbת“>5«ü]ºùWï\>·ü¹âY®Dm 6'­±¸µâÀèËü%É•›eÉ€|í¢¶òÊ‘+l ²ÖþY4‘ëà**ß®¬R—“D®iQ1£šóçjH%ÇQ$ËØÞŽÅõrÓ‚iUU9ˆÔ¢aÅî53 Hžt•¨¢ 5·€¸¼Á Ü>®RX7h™¿"oùÏ®‹Ý±]y&ØêEGÀ8iï›·vþðÙ|<ã¾óÎ_÷Î;_þøÎ_æüݹ~ýÚu¡KwøwàO­kG·hŽ‹²è¥ÏÈ–ø{ÿ›ûoûø»|ù2Tíû/.¿+ì˦SiñôKàϽ~þî'Ÿ\LZþp müEÑ>ä^­\•¸FaYà—ø{øíÇ·>ùöÄœ?˜Ëu^ʲJ·#¾²„˜ÙŒwD+Õ5Ëü-Î?üäÇ+ƒÎþ¹¢wòˆ¦[–¹àÙÛž—|¹ê.óg¿÷É—…îZ¸Š Ëø³ƒa·›A´’¨rTüù­¨ã/IJ3ÛžóWD¡!Kû¡)Wm! @¦*«$!–*ójÁWÈ,plYf³ÕD\UÂ]\Þ`Ñœ¿ÜÚEtÁ_eÙmâUÆ[Bs•Â*œ%#¿õÁg_|Ã÷½ÏNχ€_~ù—¡û»ß}ùÎïKü8ûq àþø«è$"Z˼Ò&Êù{ÿê[[ƒj?_|Ƶßñ­ÿM¦Óå5´t6<÷íý<7㯊jè°EÓ4F–M­¡Qsƒ¶ÂßÃo¯|rSðWµÏŸæë†Ty•áâ •J–ù¡ s¸½Ìß%ˆ}þ>ç¯öO,þÐÚ?R/ò¯"?óÁ%RžÀ ×¾½ÿ‰wÐ:†LT‘Ûsþ*…I´BÏ[á¯ÇÔ˜ó—cÉô³,PŒi ¹®Âç%:Ô¶•@Uˆ,ü¯G ~ûTV=Ÿó—` M ˆ‹¸ÿíø«ŠÚ©ü™Èvö¯¦ÐLÛ¼9õEuòï¿8ýÙgÂþÍù«Þùë_~|篅!àåeþ®?¼péìýS_ƒ8çÏ*J™èaêü£º9þòÇÃÿûÇåáÖþÜÓ§ÝÓ3þòíbyŒ ü]úöÛ+×PËßÐRÑvÜãy³tÝaÔzþN\}çþö€?b%6ŒŽ‚š?%žÿZðØ$ls^ö¿?¿såÛ '€¿JI˜Z™|}ʱç*|ü7Ûü! ,»®«6…˜0,óW]zÇüöÚÁþ%v ™(õ P »Š† êæüUµS—fE–øÛ–I1dÏMCÀ 4×B€=OŒÿê$·0þµLNoÞÔsþàx#…YÈ6ÄEÉ~þjA"qézžJûÿ {5@;da‹êüôÙ÷»Ÿýá³wßýþŸÍæÇ³ùøã‚¿kWª+W><¼2¸^ã"AŒë$àžªZ­VŸJúr´˜ÿ¾ý‡?üáíp‰¿>»|ùÝÓÌø[ý±Do†§.]½úpØñ'¹dªWÆpª†¡½”„¼4³mªåùïðöµ«×N ¿ZU–Ä`¤‘ÏÃ0äSP1iä–¿åùïð쵫Wÿ8þ’ ÁU§²jµóß0’k·Ë¿âeÈ™Óñ·˜ÿ&îã¶Øã¤ÏkÇt­ëeG™_WŠ[8ª\l0¦³ë0”ãšÁLvº=ŸÿV;+óßB eœëb …ɰXíu¬ñ›ú´Ü–CKgV¾.n7ÿmÖ^U=eîtAmB$&ÝÃ)ìñ½I cPKUµEuòŸªê§ÓßC÷-Ü/¿üäËù8ñε?^¯î?||ex­†v—I/1Éõ)4|46Èß»à:Àß|úûwOÿßúùo#nï ZþžvúÎùëâyG‡> m8‹mþºóÇ8yÎZýºsxÏw­v?8ÝÍÛôg§ÿ~7øòÇYú·/<<¼_ >¾?¸ðªü²8ÿò?üáí˧8~ÿïüü ?ÿüÅ?¾?}ú‹µüÕtv¾ në©ÛQ¬¥ ôÔ7’. “E®¿": ›YÞsýòJýþ±r+Üâ÷ÿ\úýãÎ… W/ˆÿ«צ±-~ÿM~wy·ªÿ šwŠ~y¡µ±u6ÿ%Wמáê~€}öŽWbïÿõâÙxÒÏ,¿q­ùý·>;׫bþòþú—^›TÏ_¯Mªç¯×&Õó×k“êø{)ˆlº®½^=µü14>~y¯Ì¤«×+#Á_m¿ŒÕfm~Þã¥ï¾Œ\H­èùU×/!òRr9äf ñü­r¸úHÅc’¦á清±G=“¦¡ø%Ô¥ÁÌ{ ¹Ð¦|uñÖþ¸'øó/?·œÿpqŒ¢û–G>&y/#“Ü#/¡2ùK©KMк›–ø›­ÖzÌüuW5K})“ãë=”¯¬G|<™ä&OøÔBÇ’OŽ^Ê›×M@—ø+ÛÍ4Gaô|üávÙXìO5[þì6íxò¡ÝÝÝG×gºv<–]ð÷Óç ýt,¹ YWãñz4xÈí oìÅ[’ð×*Ù^æ¯]‹ÝÍQsd‰ŸNDGf´·+nüþeÒ¥¯“Ù•p~}~?ÅÍ–ÍRf Áß¿/ôыɤËe^—Ž?\¼PO¼¯cç/üaW„/‡ ZP‘ê8ŒT–Ö²kžð_*_¹®>*¼øåiJÂt¬Íøc¼²âæGœ¸6ÏézMÌYV™çÖ?JM^sßfþx/}—Aך‚?š´Ÿ‡¬³€¦ŽùµëP€ß-Ú[…h›v¤G´¥>QxMÍÐð¾{mÎßÇb›VXk\YYÚÒVl×­QÁÖõu0á\Û£¢‹À++ø{ðàÁœ?\X7Å0mõvÒVéYŒyÆãYSvï9Rþü_-W‹ÖÖV<¦õŠoÓÃz-E¼­Ê ˜mxUUawöxgXB™•‹Q¡‹èvÍ/‹äß8Hü5â,¥v’:v’àoÌÆº;¦c¼ÂŸÈhòø÷&Öó›AÓXÞ¶Qu ‘/½Š?þÁaÌÚ­µý͛д¦)­ò—ó\ԥݪd6 Å,óºÜ1‡"…'Ÿ‘¦‘ƒåФlLëTϨáÅØÇ-pS¤5°Ä®>" SÅîÒÍùÕ¸<€Ãt}M6¦çs4.gDuüµOÐèøkTŠC3wœḨ^Í«4/ø¾V[«QcjyZÎ%ÑFZ>þó{Ãog9ëµÏ ‹’çµ×¶æÜMc‹?ªª^ï¸MTŽs{¬ÍŽŽ¿Õß"Vø;{éúµÛúPð—qH*Û iU54†U5‰"Ï­%¢Ã–?þ\À‚æ|‡ûïhÆ Õ´Ýî{ ®¯_¿ÝEøÓ+L¢r•ËAèz&‡yª8´¦ª‰QÄ…lˆ#È“óÚ¦,eúªv¡ž£1áî{É“¥@ø¥ëWo×ñxžç›ZdAg±@¤ð» ù32þjÔz¡(^Mdhrý pÚ˜#¡Ýîû*Wx¦h ÛÂjšèºRI–k< Ìtè§]&ÇɧVh1* ÃÀÅš\ê1õ“ŽH÷µåïO?ýý§?ýý£ÏúçGP\ŒQ“²þ KÏ^¨¶à¢ Ý°ˆ-˰ÖUC¨1sä!3_Êå¿>Ußû³>üòÏ„ñ̵¢æÍ>.ŠZs‹°Ø‰C8†uÔ  !ÄQpkÛâB1̹íš%ÔÏê¢wü%…%ëø{ôí?ytb0`\3*håÖÁ¶¾à¯™¸‰ã"m¸ "N•µ /ˆ&rh²øU.1)Et†_Çßðaqë¯ß^q:VÁx‘Œqá¹ÁˆçUy˜—4Ñý*öêŒÖ~Î O@ g|°9=ÒÑü¡,3þ.}ûÇ¿>º3hùÓ[þÀ ï*è`xª¥ÏøÛUÀ‘ï2%±( µ®Óp uñæ»xj×®?¼ý?íüã,†cœ‹äœÊ×vmAX(Ú€ª)ÍÜ{DÎé:þÀ!hT[c‚¿&ÿÓîOí¾·+ø3j‘ R[Œ»ŠW$ ßh0˜ië šu쵇ÕzñºxH_ÎeüéŸ?þsùñ_þü_Ÿ~Ê­aPG2«lAÉë dÛ B8 ,H’Bçí`ƒß"òÄX“Û¤„ŽifßföoI’·ÆþQ·~tåÊ'?ÞüUUm†Ñ®^TU8çOó*W¤fµàà-ŒÔ=`•R<®çßJ^48ÇoÙ<7lùÓ~{AjfçÆ.` ›¾ïOs½´¢¬ŠÁ;æ9ço7æ‹Ì>XM:nÀaÍ¾Íø»uùäÂAþŒ–Å&Y†\w;þ ; >&!9˜A«‘ÖŒéüOíÒ¥³Ï^¿ÆuElô¬lœþ(3]ðÔ@­ä<ÛÕíT{LÖá!†ÆóÊÀÐVÿéO»ÿþù®Ð‚?^`d‚ýÚ°àOæÐŽJ}—×öÖ눘ץ<ÿÆsÑÇŸ~ðÁÿøôÏŸ`ÿ€?dÁˆÂ] 9 @ñôf ýCPJ,J Þw™¾kìÌÅ6™—.æùøo²´\Ð2{Þ¹ÿãyà?àÏ‚ÓFü¹‚¿Ø HåúKüi‚aŠk0€yêñ± Z`Ç!‚¿›ßþxn@ÅÍì^ Ý&0ƒ?¨ Cébª%ûWׂ?BvùM‡šFe²O:i0Ô;—Œ?Ä.¯®þu¹4àöRc‚?[ZµÑè#dziSÎàE?"úŽÔû³‡•–#ªw_>¼pçÂÙ³?¾_1†¹T\ñä8¤í(°Ža$!?Û%^JÆ^#ƒ‡[“ t™6²'“ÙWÁß¿ÿôÓG—ÿtùï]þçGPºZ‘X¹h—ÀŒÒc~?¦Ì à)Œ~³¼ão,r ý`6cä¥Ú¼.-ôƒ:ù¡z‡ª öw jZþ,]eØâýƒ"³9m÷ì«‹c?ðòóïæŒ¿åç×tüñÕX\÷Ò·Ís§&ãÊš›d7HX–pþ\à¥n»¥9lŒAÄ©²ªáGznén£ºÈ:ÃÏ,MJ‚rÄ–ø#hpâÎ?¼~{H9(È&$"AJêqgÜ«hT*×2ª‹,áüíîúÐ’u„¡Õ9œzA‰”F¦7î¾Û-îýâã+çö€?B`nÓÛÍql×ÐY,ä-P^Æ»œ¿jw7Puo´K<ðˆª¾Yü-ºÌ6ÁùØiÇ4è¥ —>>ñøþÞÞý³ Åfaž >¶–ÃÊÜöNèLAµ…vÇ)Ôxà0hƒ¿åŽóR/hàhB&¼Ãüãïÿûƒ¿þùßÿý#HSƒ]à+¯Îx ýOR¤Ëx uàüéµ Pj;_dÖåbz“ .¼ $‹\ôQËßEÙ¶ªå–‚±¥[P^`"7SŠ˜Å;ÜG5äK"ñ2ðÜVû…Ø#¯ÀãÉÀkæ¿-îýsÜÁÀ´XFlÃB £ÄãüÅÀ•g(àlÓÌ!®ÃÈ€û25¯øœÅp]¥PQU±Qé­ò7Š¿íÙ…*¦¸ñ™Ÿ:æ“WåKCÁ÷D<µÝV‰¯í™åv (ª›tí¿lm›?&é݆’·ôüY´‚?½=8ùùþØÍöèáŸÅy¨åCª‰ÚÀµ¾8ΨÉ!Ò¹{]æo^—6A½K°‹×6I]woížY¾„ì?”9[Â$µ™uü‘ûþøøÂ•ü#øáYJm mE:ÓÓ&.Þæ,9Åeÿ¨™HÜžuéø›^dÓÕcQZ]<º´®×•~UÞ¾º˜³*~ûÁ¸;P1KuÖ7óFëj 9óóØ+-6¯5EZÈ›mxü”œ7¢âÊÞ+'O^ŒZ÷0ôɬŸVytÒñ×x]&H;2¯çïÒ…¹öŽ'^å–ø{ïØr¸s"#ã¨vC1>"ÄÁlžÄ_¾t ô¾ë^Øó‘J̯6›ë¯{Êv³’Éq] ˆVÛöx2iɨ9ÈåÀ&ý¨œÈ3_ÿx$Ç®ò™™_!›æäèéLþo#2®xÄ—ËŸöòžÜë”·_¨ãÿËÐñ_dÛë·¥9›.H¯7Q¸ç¯×Õó×k“êùëµIõüõÚ¤zþzmR=½6©UþB“gŠ®!ûPp©Ö¦h·Ú•ëàJ³€"zƒmDCó“‡ÒËx˜‡¶íYT$¢Û¨¤·g|Æ=ƒqDQÐhéù{QZÏߤå)¬H’éÜÿHuÃù#@§fB;þTĈ_glÁ_–ë”d`…ZûàPQð~þ0›ØX2‰d„2j¤n†)øã7(·#<«¨ÇH*ÌJk·Û’ÊRØKÀ‡‚2G‚*2“˜IÇDÒÈH2y`N)•†€?™±ÃÄöÛ™±a±e3àÏ$PBɼ  FãO}J0SxH8œTjB™c௟¿­òGLèÙ¢)ÌæŒçÅ©k£ö¯Ðøhܦ¸Ó¦cΟIlƒ&ã Xø û4"ª†Bf‡L–JˆVXÀŠE(ü%ÖJ•€0È œ¡Å&S™±È€„ÃBÂãÂè1Û†¼Hæ4óUùÎtBT••%•¢&˜ªS#¥¡eJØÎbÃà‰Y…µoÐT²1ä ‹z‘xšž9 §nã–êt$êO”ˆÂ_£ÐQ À°/äéRʬ’8S6e`|m†qhjb! 8@U{}közV­ðGb?óý)žò¿2Ì"ŠÙ$ƒžö ÂT•{C?ŠÁnŒ3•dÂSØafV“fàq³6ù¾Gcp¾8ÍŒ– Tæã¸±|&°¯hšoD²²¦à›” t,v²‚5ž!N±0)˦|øï¼xüδ(†q”€é2ð´ž‘²q«ÔX€> χÎ3ó}‹vdÀä„çÀ½'³`G,.;f/Óî¼ÏŽ8«ñ|ŸÈŸRŸO{G+ãÖ1а£d‘2 ¬Å|pˆŒSª¥ê°×L«ö¯½p½ž¶Þéü¾þü¯8-AÀß¾âuX‰S€E#BÀÆößÚÂ?e³û\D!ÀÛá6YŒ6‹®D³ünËøÊ¸+o÷t×öCѺð"S¼øÀcq·ÍŸŸvd"!QJQ~q¢[ÄçÉF"=BÚ¯³b’5ç¢zýúûéÆ_«§ÒuÜC#<é g¯çÖá¿ÿ®=Æ 9äç‘×S¸7tǬþúƒ^›TÏ_¯Mªç¯×&Õó×k“êùëµIõüõÚ¤zþzmR=½6©ž¿^›TÏ_¯Mªç¯×&Õó×k“êùëµIí»þY\зN+ëq!_Ó^'®êÛïz­&NÈÓÅêõkÿõÏþtýGRæû‘Ç/ê”ãÒ|Ü ¬½ë;̲&zšË²L?[JœYð*Ðë7­÷°XÜëÅ2Ì1ihŠi4Õ ‡aògo2Õ¶$=ÕeÊ Üìà-é½Þ4¼ÿ±öz~©<ÿódq…;_ÇB 1â·PŒEXÜ_YOsVpœ_šÊŸ“€Y{áú,þßCÞÌÜxCj~ÿßÑ]¶ßë ÔAþŠ4Ži*+™Æ$Kš/)¤½ñˆ£MáˆuÄ-ÔxâæFY’,£Î“§F|IJRФÓi@àƒF™G%I5Îv¤Pd¥2ðgñÓ gk.öïõèàú™Še/V°âÑ[ˆ.ì¿;–ábD›Æ+š€ÃÆí_!©jÆÝ’,’YŒ™’¤Q!e!¿é׎¤Z™Ö™O§±XšÀñ¤‚IÖØjŒAÏß©ƒöoÂï?§*;œ¦`çÊvU ±ŽT(îC _ £QÅMØ„ß-üYEš¶i€‰;ƒ1uÎH¶Í×n¡#‰XR þ I‘ ÁŸÌï?—%7¦D•¿7S‡¬@CçoRÊxfÿ&6¹ûuàs8qÚÛ,;þв1gYÒ¨1T,ø›H|‰4Kb- _­áKœáóHjC³,èOż™Zå/p ËQ°ÑÌ’a8¡AãˆðažlÉ!Æf&[b܇ºõ2LØ!YSK“-k|®\4ib§‚PR‘$$Ë’Î %Mä‡jA2•8±%Å4‹°ùoÔ]u½ZåÏ+}b„hèy`èl›Rìñ%yøv›¯ÂCµvåPìu£=ÏCRß\y¢¸“ƒÏ¢ñ¡—"iÝÖâ¯Ü¥N»ëËéÚн~cÚç=™Qy]¸±¸Ûƒ?˜Ê㦰œÉ|ÍñäIƒá’® !˜qÓÚ¿e.¦¬_úÃ^¹6=ÿ+ìù{´?[Ϲmh NëÞiI›3Ç@<„Z‹Ø¸ üÁ}X†‘xÄŸD)tB*ÒŠ±%ÑRÓ4Š5ÚhüCÓXRƒäp áàƒ¹t<+.ØÍw•¢‰þŠ5©òS?CXƒ`—jýý#¿UíçÏ|¡,[üYÑð.3M–cì8#ÖñÇ2Æ&Å"`«l¬ WH–cÔ]„ gH ›H’eÉ— 53&²E±eMóUð¨ +R¡„ŠïàL² •(ÓÚÊ"þ(Vþ ê‘1’È(dIfN¬Ä%v¢, $‡ LÉ%Ý’B âŽL)Ø\öz.íçOåîºŸÆø=ãðny Åíb‚¿ÆË®9à‘Ó·7ŠÀì×]‘’Y”„Lc]Šq{³¹dâ,˜BÁDÂpß è|uâ´«#dùTáëÁP a6UrI%’E¤€IˆJ¥¬}þ¦%‘gfØ”¬´¿·ä7«ƒþw2i˜Qó5ƒ þ®r–øC2+¹kVük2îvΟ¢ë]ÂŤ㯖œZðÇ$ÓV!%ß/áE–JÁüé³Õ²XU3`Ó0™N³ØüùY ›J¾fVÇŸÎÇØF–µÏ­îõ›Ô*©ˈÈ;ŒH:¼‡ÌBÄÂAª¶þ— §ld‘ñµÿœv>Ðñ§[<‚°FgÀ5K6ü‰Å6B[2aêB-O5’eJšÇùÃÄdi"V‡!ꔢ€Û?M²âdÍd ü1#$£’úc„˜ÈöˆP*P: 'I‡Ïiz½êZádÜ}Ò©A•)Æ.šš v¦2F>àfÃîi¶OFáTœ\)§Âý²XR`ñmÆ^ƒ?6% âQ)šZ$ƒ¹†Çà5ã4“!’¤Tòa g”cIRÁñ;í¢2ÜÃ1„ŒJ§EÓŒ¦nÔ)2Áÿ«Y,9ŠÉ7³ m°ýz=ŸöÙ?ñœúv=>F2‚gëìŠEü«ð2±< ØÒ½uØlG\üÁޝ؈Õù.6[øÞdIø{]̦»wxµ7ob¥ßv]BP|±ùH´?óÖ¡¿¿1E™¼¸lÈCGiš$º~¯iøÏb÷zmtøï¿ì…N*Ù“’ƒ‡Âùb‹ÑëSË_Ò_Ðk#êùëµIõüõÚ¤zþzmR=½6©ž¿^›TÏ_¯Mªç¯×&Õó×k“êø«{þzmB¸®{þzmL=½6©ž¿^›Ô*¬Õ¦ ÕëÑŒ?ÖÞ)Ž9¦}d¼Ã¥ÉäÀë‡Êœ]»ÌÔyœJ¥LA ŽJcEkŸ­î-¥añ„laï¨Kék*G¼dK·ñ³5Õ¢EÓm¹ f ¯*Ö{§åê4ÚÁ»°´§íˆòˆ;¸Ü\¹8TwM.Ë.ÈšÊÔ $+ˆDFÒô9®hgŠÿô¾¼»h_M“l8fK#xÚìÈ4\|‘8Èléè5>‚'ÜÏdÏŒawh>±Æj$Ú>a™,sŸâª[â/U‡ÄÙþ²¬ÙtHBÆÁ•ž,þìÒ%YZ±ºjÉ¢§{¢éªý“ðÇät"|ðÌw_ ÈÌ?w[ðÌY3~y<Aê)aÝ—ùu¥mÐv±Yû2 DÂü¯M³¸aާjl‘KbºˆØtÃËE—ŽçÖm™ê³½Î¬ ŒµüÍ’Á]1Ä»…xlw!»”fÃÜ•‰ß„à“¶Ì‹‚Í+\û5#›é,OÏÛ¡B[E»ø‰1¯ƒÂøý3ͼJxÞKý‚g©tu[–ygñ®ðIÓµà<¥ådÚå;P»Êt½9¯éRÁE°RežµTñ›!f}%ÕÀx÷ W¯ò×´7ò²ÂŒTܘFË4Š cG)ÓRdydØ8R03ã¸)Âož£¡§üc:ÅN#k1®ªømA,Œµ†XFéVCÕ Ö°lX#,« _TÁ‰žŸ×`û¾eiJQB2–[|å‚ …RÕPñ$P#Íq(²T…òÛ±ÓÖJWòÒ5žÕðwÌΦ)Â†é° ŠG™R*†xz6 yrP-"Âè—‘aAæÜþ:8@¨­ÑAƒ …¶ÕX"ìØ±i&ñ‘Á]ì@Á ÆV“6§1q¤Œ/ÕpF[Ô_^Ô¸lHa¼†¬A™â©štžCžÍ\"˜ÉPè ]A/æf(C¥sÄ-3~ƒÑt kPl@W˜Æ cÊ›?²^uÈ9€žCÚÐ(Òš´ˆ h¶üYx4RàÈtbd$TšÐ3R¦9„œ1<¾<ÉÍåÔñ,h@C%›ú((C5ÂÑK•>²Q¨ƒ³–}jþ Ê*vÊR¦bm*c‹?ÝTØ4dH2 ‘éÔSj` öÌŽ°aRªM RšÀ$M*hÆŠü66É"Dy1) j-ÂJjJÂ÷;)ŽP&ž/Œ¤€úíaˆd&k%¤aÔ§’ÕÈÄ%Uè$Àªí+´ˆ¨…ü˜z!þÔ2èJÜ•NÏ"þ9õŒîè«ì_ó‰ Æ­í]‘ܬbQhÜê€WÆFpûüI<‡@f¡Çï>%ÊÔC1?@§d–Sø«3³QL¢šH $DXl‹ ú^-ìŒ&õ¥Z옙%ìŸ>Í ðMØÞ@H:þ+5ñk–TèMè ÙĪÂÂjÐÀb¡Ê¢çl¤Ðœ(µ5©í ]MQlBÑ8% ‹†´”›3Ëe6üj5…h¡±eûSË‘JÎ@wóšJ&Œ¢‰,éVPBê¶ÅLT…HØâE) QÉÚ—cŸ²q0ëi-êNSĬeŸ¿5r ‡™Ê]”&s;5³K ²b˜HªZKÕ Lu7šŸOu]ª#8§ù´Ž¸;)R&(Â$SU™Äü¶8Ykè´6&àpÆ#¬ r · B:þ‚1äÏý_Ì7ñûß§µB™¥"¾‚QŒ¨Ú€ÓMS ö$¤ÀŸ¯ª&SeÈ¡+cq ï–>å7ÉeLt$ø‡È2ÿ6¾tÉ5aªü;+dŸß;ßpûg¦àá`>5UUn™Á¾È¯!T–×—8®a¿ÃܨÂcŒ1/ªLÜ«ÎêÏx%y;ðVjÇŸ¶ê˾l¶öO_Ø?~[iç¡À,Â#Û¶¸‡„¤Äb1£+e¹Dý3DQ³,©V¸I¬¡ed8þ„¢ 'T1âƒ^鈚)f/1¿í(µ À0®àÍ&žlŸC ±‘Ku¬ª*«b¼®ÍÚŠ2é vmmhyÒ.#ç<.$xÄgáchà/hÄs¡5ѦP›¢äõç )fCl…Y`ðÁJ›¼»§<3Ù†ÑçªÅhä‡<ÙÚ¢Œ‰Â‡2 ˆŒÚ`¼UqÊý„Ò.¶`ðá”($+—„óÇ:þ2@ »\°{³úó¥’TÎ_ÞØ¶-JóÒ5±ÎKɉ&к`jHDùÚJ Áv#í\Â,¹F…"kóaEkÿ8á|©±³íá–¿¶w8Z¤9chvÌ=¯‹áÁp¤æ-ÉG³óúÃàºæ…ã3þø`Ë’MUkï¡6æ½Äùó•êx¾þ‰à¯=7 &'1ÒÑréD¥a*t…_‹¢µü1Î_Ùxœ?°a_>Êa–vh Lk¼B‰qmçºà*pà@.fÃ(?V€?Òò'3쵦aÛy­b´ Ç-øaŠß~þ°)™Lv è™× Þ‹QSȦÕ!¦™Ç§¢…\K&øNÔ€6Ô$¤I6‹LK_jŒ±?)FšX<-,¸Áà#€¶¤ÆX¶©G¿}EöM>ù*%”Mh7ñ†Ñ‰e) _&l’ÎDSà/œ8i ÀH ƒaðÍF*Pcñ6mÚÒ¥x•˜XA¡‚ÿEF|Õ, éHT‚±³ŒnŬ $7 +LËCHÙ23;°àÀñX–ÓQc-ÞóhJ‘ßdi 5ô4±~#à’YARIƒY¡¨K£Å‡ÚÒ„·©ªáyý‰¤Vê @Ðv¿éTEiÐq6¿Õ4°Dv»ä˜™5ÆxÖ%ÖÏ*kD]éÌyé2Ì+­ÁX¢+‚¢€Úùö,YÏ‚±AÉ{Ëä,ó˜ÑÄç!P„BÌd4ÉÓ7>J%Ëas)•©5vˆSX|$­Eq!ÚßšÈ<¢™¡‘‚¦`N± ³rÊ3Cšr$ÆÐ²Œ6Ùǵ ËÆ–0Åi¹õ¬”O" p€.a¼¦°€I šðŽáal A*ÌbÄhaÌR‘²,‹ÛÑ<_²mTxüdjì‚'3)l„GbEµ1Ä)¼¢}ijE (LQÈ2±mîÇÇ|2£™¢|ü/ Ž*„nOÎÌK‡¹KàïPî’Ël· ÍlŠŠ@G]{´ÉA86¶Ú…Ý ™”—•ZBð†i!:\Ðö, j˜Eš¦HžWfácAОÔAVÉ‚B¬aŽõÉF<íF8ÿÐŒ±7[ÿ…©÷ÃP`¤íh­hOZ¥öré€pÏ*l(†fÐFTÅN1/ZÛ¬Ì*`Ê5±<˜Æ€•çÑp[4Z”©˜û›_×§€6…¶Ó [µQ“Aç²1 ¥R¾Ø“ˆÅnM”§)EQ e þ oKÄAâ|ïÑ ´J ÕA‡lÝïŸMò“nQ§07ƒÀ¯IwEá¡'ê´è°=Ì^»Šæ&Žgv ÆkOÛ†ºÌzñ×.£üÂô\üaÃ8|d G‰«Ï_t->ìä(1ârýž2~ª“ï/E‹ß?”§_¨‹8w,%z¥Šr¬ë›<Ÿý;¢…^ÌOɇgrxò¯äoدd¡ŽÒ1ÏÇ_¯^ϧž¿^›TÏ_¯Mªç¯×&Õó×k“êùëµQ­ç¯×ÆÔÛ¿^›ÖiÏ_¯©·½6)¬³%þ{Ào¯^/Z5YâÔ½z½™ZËß²ÿ%ƒ^½^ŽÊµüÙêÒÍQAÔÐÈGzbÕ x®z½Ú ñÀ^ËŸ¹µódåzöˆ „·ÎðÄzþ^w=­ý»=;E|Ë:+/ó7ÓÎ)éüÖ~õ¿ôz²žÈßÞÞ©=ñz þÛð{Öùóö¶òw2ó¥©÷ü©úîó7~úå"¼înݸqãâ/áu÷â‡/>xÍ|"祽½1a=%u°í8'í­ó¿kÕów¤ò/ç[ÞøåË[»§ò?‚Ïyþˇßmñ?åînº€Ç«#øÛÙÚ‘¦™qgΟäûÓLYgÿÖ©çïHqÂ~yðàÁï¶v|ÐýôàÁ.ð÷ˇ?mšo8`ðbõä­³Àß^Á‡€'nîX[ û·ª§ÎR½}boé÷·NxÀ[*Ìzɧ*K:µØû†ðwñÁÖåŸ~ypqøûn—ïzÓíŸ$ù'·ÎÓG[œ¿L y~ïLQØ¿óÒ©;ÙToÞ^>ÿ×*¼yÇØ¹%ÝöOmíIò“ÊtÊ™_ÒõÚó÷ˇ~øËÖ©à~·vo|tãÆÖçìn]þœCøá‡§øÞ×YOä¯Rœ<¹s›ûßÙôb§‹(ø;!Ú9ɯÙYìÚÚ±ö qÁ·”øHú ’9 üñ(³X;[³¯íÛìÔ¼x¯9[¿üòKûz˜6]ÀãÕÓÿ+beÿï!sþ¶båT¸4Vï‘âÇ~ÆOX/ñ=â§ç‰ó§Ä·ãèVnú¼"Ÿ*¢èŽãLEá›Nù7wf¹¼æüýrã(½Þ>ïïo`ÿ&üÚ•ó–tR•nwWúE_ùâ}Áÿuø¦´óHU’wÂ;à»Í‰´sSºãH§Oß¶nI7aÒ³cDo ¥ž¿C"Îø»%í˜ÒIà/”&þô$ÿ‰$~äßä ¬òw~Á_dœßÙº-í´› îÿ¼ïÜÜsʯ]0Œ7…¿'yÞÞÿ>1âþÎHgÏò«F÷䛬|·Ÿ¿“3þœÿ¿½³ém•×ö¸èD€¢=ÆQ®¡mŽD P$˜ð(7ƒ„!º£„JVƒ"”/ÐòÕï2ôeç¥ÝÝ»ìvûÎ&€—½lócÙN!f쀿Á¿²ßÝó§ý5üýåú(s´z@‚:VÅrq-Öá#©W°/çm$¦…#dO£ya=¼@‹0Qˆ ÐÃ`&Nmº —üýú(äsñÿ‡Íƒ9Ùð… e²œŒëì3þÆá¤²+‹Åßq>†Œ“;¾è&ãÎd<&pªãì^$ßZŸöþo7\¼™$ÿð‚’äï›ëß?¿~+IÝù3/’¿o­Oäïg@’ü}sÉßßjS’?©6uŠ¿Ù%þv¸÷þÂJ}_õ|ÉßwÖ)þXzéwË1½hRNñôc?ŽžâücHýá:ÁŸ”Ôçè8—~ÿÞÿ”ß¿·sL>T€ÔŸ­Ó¿Ïèy¥8ºº`"Œl|Ñèœ`ýñ±¤þlüýû);/à/¸`"ŒlzÑ蜀¿ õgKò'Õ¦$RmJò'Õ¦¾9èpîiïùî åçk‹üXòÙ,?½²~*±Ú{^ãÃñ›üMúüQM÷õj¹û”gM"MVc·A•"Nr¨60læÕ9q’î+!ÎTç(±ysØØa„_dY¸M }²©üW‡ØÁôYÙ®®GõÞ•NL–*ÜË«òÙ-WJfjF®>ÔßO_„?<5°™$s¸‚†Ýø&·„ް9¾ ã É?T0Ë )Ë4KŸ²{C©sPû†Ù8t ¥þ_¨I,¶OgºE¦,ˆ}8FŽD’ƒð_&‰ž²!JnÁÐnòji®a65áp©Ï¬>&)£Pý\¡=ŠÎcfù¡îø~úüÙNÑGë),lü†¹GÍïÁÅ, ÔF1¦–àk"þ˜¹Í¢Ü<³Î2ïÍf”殃Ùðg3jPË»²÷â¨,ÚöÖ‚¹B™µÝÇ¿ïyH©ÏÓ—áoë·ýœ¸Ô¯—Ÿÿiz–¿²ú.-x3Ó³}öü‹ÔwSú3ü™9Ã%ŽxÂCAoå6ÅçOê»êýñïJi29©ÎjûÒ/Æ¿¦¸’ü}s½Ÿ¿éYþªçï ªíK¿À_0 $³~bþ÷ ù ”!—ãï߬VùÃZÎJÿþfý®ñ—6Fçù38ŸÐEþ0>•R}ÁT%³¡OO¼Aûo«Ž%­]ñ·ÐÏùz£Å«ðæÂž?uA_lN?…Q]™=!¿#þ½uý‘Jй/`öüåÞñtZ8'^é¡¡1gÛÂÀlZ$?T‚†Žx/ðoÎU¯R°€õ¼ã'B„ÿáñ×: vd¤Çî¡r~Ê¡ŸjìÉÎ4ƒK—e‰×j²úAµ*~`ãä½ýLÜÙ[¥zŒaýi@V/ãE’2ÖO\Æ"ñüÛ6æÐ™šOYêkõÓïæEPg<Ê_ZPŸÈ©kuqýa%9÷NXÃ_@uÒ HÅ[dižÁZ¬Cö«««œ]Ý”9˃ò"*R½Q„Eer‘e*’Ë ÈMÅûG^ 'Ë)4¤,Kñ…T>eAZÞˆ"á_.öú< Ð_Àñ”¥¢ˆà6i•ÜØPn]qXÖߦû:€\'?›_‰mDÑ"(³LÁoìó”T/¿*YíAT¬6diÒ´-/§•/ð3ÂH¯¾¨‘CfhaӧМ)ä†âkë:W]YQl™î½¦Á­ ›¨¦;`ŒUfÓÊzº·.+ë ¯¯ó÷8°¶‰aљǡPñü=Žùì8Ï·: S˜Šºs†lÝ%Z-n9¥×6Ç¡¢èt«„•œó4åsÜ8^±ÔàåÄÓ÷MlÌMñÄé¡ÕÂÎaC¡XS»À6çsJÓ´ˆrEÓó{›û ÜñúÔSì>c7qAl÷…!;¼¹Ô±¦ooBZ*4ôøåš2¯‡¸˜B#îí =æ¹9É­ÕÓÁþ• ¼ÀÅ¡Ž(Ö&¡.)+}º¹Îõ†?dysèQh?ËLñ%-¨hK݃aÎöxTõ%¨²Ï±I Y}žp¸ZˆOK޼ ç…187„Ž"3Ìuñ<îÕÏò×èsŸ?È}ñÕ¢Xn3%gVŒú…h`; .ÄÅÖ‚ÃŽ/ù£!'âÒwŠúýÕRÖßB¬ßV¾¢4I½C•bJ d²žÉæ.ÜѬ®6ôIÜ´CµüÚÀ$5ÄKSñ\8pÉeßÿµ"1vW³3ºÿáÙýOCa#^‰aý~Ó~ö¥øã·yÈ(÷æÀ[*Þs«üû¢¥nî@s¡±}£š;‰”Wü…0„RÏèQìôXýþë©{§ íTðg™ÌÖnt¸Éq5v þ< Ó!1e6ÀE=Q¼eAü‰ø3þ`Êã`ƒVüzæ9Ì®Še4âæ…&3(O&ãÍSùMC*Â(v®ÛshõÂS%@RðÇzPûÀ†å5/êQ#ü•‡׌C3ïE¼HS¥z3ꤷÀ³ã:þõfÀ?ð×ß¿œÕ퇱›jLþòŠ?:¾¡Ånxß´?›hÁö«ƒ#ü±'þ†_“¿~¨b‚  Ø¶oU/x@ûCޝC^ˆÞB˜‡¶¸5}ñ†9²DûCa{È,;œcÛ¶-¬„b@ +²De¡­¤S##ÓŒŸöm(¶*Q8ÃZj´Gà¥ÜËܳC÷&ñE0±BL<`§çû}ñÞœ(Î>þVjhà«g‡ë¡^¿²‚ÍPA””Åõ´gÛzÓãT¬–,ÝvÅ«PWÄ¿BAz³¬ËæÀ#dN¨m+€LÖ/¾Pƒ„& Ëa¸ïÀjuçˆ+¥‰øª4Ã.RF 6!5õmÍÍ•PŸí«M“¦ý)ªï`%Oìfü…ÞÊlöüU럞`7Õ«jÐgMo^ëEÁÕèd‰7¿™þ&sª»erzÕ†µ2ÒŽVȽÍÉ{ß ú•¯óÞ]YωÙp&à,Å÷ü9I/fy§üsËÇ3 ¾žòÆ~ |=;“ܳÉñvM¹mM8£Û÷f8£­{Ùæ'T¯äé¢óüLÜž½_îÂü¹+LÃ: þ¤¾«$RmJò'Õ¦$RmJò'Õ¦$RmJò'Õ¦$RmJò'Õ¦$RmJò'Õ¦$RmêÖôæ¼RìL„‘B/S‰ÉÇ ú³uò¿?}‘Ü7˜Þrúy}¸©?[ò¿.ÕªNÌÿrVJG×çMÀ(Çá%›³ºN±ÿ¡¤þl)Ñ)þ&ëó‚õÇ0²ñE£sÿýó õgëäúw¢žð÷xÁDÙë‹Fçü}¬©?[’?©6%ù“jS’?©6õUøÛN-”8Àf7º\ÞÝàåñêT±wûö/ùS±‹js¢EËÝz¹^“.áœWVÝ•ú¸›¬ÔÁ:>âdõ²„ÁF=¯ÅËÃña¯Ó}™À¹:Ú©›‰z÷Àwõ¹î’w¢bÚ×X|qµØ©;Îï ÑüP£Í¾ýóuUà‘ªDYc(a9èšØäËá†s¢¾äd=YNÔ çãI]Ypo¾ì‚¯Áßz}¨F¸:!þ5[W)£UåëàpŸzØÀÖ4ÇMæWÅ„%t7³¦pOÔçÅ>å((c¼¼ãê®wk FH]m×êîa¯…Í“Q»ÙmŽ»D}žÜ´àé°òÿäú©&êb÷¼*‹ÝN‘ ™ŒÀ¿>ÞíÝ.é4ÇÊÊò–#®v¼ŸLvúc×ß=ì$“ºÖ§ÝþTѽ{´¨ƒx±Æh3wp1ÙÄØ©×;ð¿ƒÚAuàw—‹ºýh°{y§|þ®h?Ù¥ªêÈÙM e ê±¶PG~ìa‰ª 'Áú£jÔÁ&Lˆ¡Lá’ìT'ê%6t©mc%1ÖŽT¾â“µ‚œ¦9þdD D”ÀØ7þ¸apǨP7 €:áÆõd›äQ\¨:.‡U@¢5­…‹üu¯“ûwÄTׯRÌâd×åþ¸Ï˜µðQG¯Wab¬×ÂÿÚ0n×0ìê ¸óÐX騔€ÇÑžåXDùðn©>’ýå]WUÚGCu½ãЭÝn¸žvU£é<ÔÑQÝ¡ÄÇàtž@¹èÿn˜Ð†xß_”µSlŒç .v«°á¯35]>@§Û£åªáo7zÍûùøÉxœ¿¦ç÷F¿jüüU»T»äÚX©öÀÁêH>M1FŠø÷¨luÎÍ"ȯ:mÒY®ý…¨øƒˆÜÛêXAx½×-T}ò,þ-vúHÅd â¤»˜ꘈ‹]Å?៬—›I<€è¡îGg\Œ6ÇëµóŒ¿ÎXçˆ/OýÜ-‹øM€µÚÕ÷x¬¯Åׯ•§£ؼÞá:þ­ãìx¼RÅÅ^¡:þ öl©«j0uà¸ó0«/äêá%ªàÏV‰¶~膂¿®2™…²OñO]èvºª†+þ–±ŽÔg3¡Ý’ÿ1 K”Ä¿ñx°®øSææ²iìõÚ‡iú£†¿±9|yßÍß©ïøü ôúŽKpmô‹øí‡{yÏßÃê  èŠÑB$/w0ÅXÛ¤éÁøì,Ôñ]uýáDÜiúèXÛæDôTïa§^?çïn,îpˆ¯¸¨`ü)ËA™ŒõÞ¿ºYM|õù€‰ •#lÔø«Xøü‘?aaNëå3q§ÇM¯¯•ÊZøwİ@·B „ÿªœ?Ú¬êÃd½gËWSßIxp¶¸«ÎŒô#ü)]5\/:0P«»x šÓY4É¢ýñÐÿ |7yEçaÍꈊq*w5דºC ÚŠ»ÐþÑò‡ùG£÷ò7ûÎxŒ¿µbT-äèóçøÓÆ“¯ºª¿ÙtÕ‘)’«þ(VaSñG²ZÁRàŽìºfµYAÃüLU¡+Öþx!ª±.‰ˆÚ¸Yš 1Ž]Ôµ·X‚a¤¯ÖÊ¢¶^Õü  ØÇ‰]ñw^"¼"c1a÷ü-ÖÎÝÄ+›µ³YÁ…Ú¬šð1æ«Õ:l$*ºƒÃA—ô¦ËåªSù¯Ö«³Ú@M…ÿê ï®WöJ°§®Š¿ÕÃú4þŽV ½©èj¥4WI_¬Ÿñ·Yø«5¬7æK7“]þúøºÕù¼ƒµÕÂÎÒ„µÔâm*ú|ü]­È ¦°RÿPªøÛ@³®W«¦£—Ø ´ÕõÝëöïõ^þÄ- †¡“ãïƒháªó‹ùÃÜã¤캰4ëÞzþhzRÝÙ¨xµØgÝmÀp×ôGu‹ÁMŒ&wzÈlFwu±»Isb¿4®bÉ£(±#®Æd³Ù[ïDçU;GaŪ‡€r'V¹¥ÊØœƒÚ= [GÌ6£5lîö^`‚0ª,¡¢¢U›ÁDÌÚ›äÎfTû#éz$nµÚUôèNÌã;µ§*ö߉!½Éû¸©–ùw¢Q›ýÉÁØÝ¯F`Ü^G¢¶#X=ƒáFTôGEGu7»»õÝ®Z 몢‡ œªë?ZWu¼kZµv«ÆÿNíjÃ×íoôëIõÝÂ)þ<ÑJ‚5GD?x}Nÿ ¿ï¨‰Ð«ÃK«ËOÓOðWÙt†¿.ÇŸÁßËï?öç>äî;j­___ûO—s ‡×ã3>Uïço²k2žäI‚xm$ÿþ!uNïçÖIuÆÓã/þ”ø'õ ô^þvŠâ‡gæ§J•üI½IÁàÜ÷^4¥Kþ¤ÎéküýMê»Jò'Õ¦$RmJò'Õ¦$RmJò'Õ¦$Rmê³ËüõÞÄßO|½K%ö%ßY§ø£é%½Á$Íq~Ùè¼öÁ¤þlÉß’jUÇùûßÿ“’úýúÏiþþ#%õ›u†¿¥¤~³þsš¿ÿi{b õý%ù“jS’?©6%ù“jS’?©6%ù“jSøSñ;H'•ÿœS¯4<Œ ëõqÎ"T}Ää•5Õé‹ccþ2ùYu ØXÉ ¯7õGÊ9R 5e_鰢­x ‚Œô ‘úˆ.Å¿»ÚOùä þ(§³ì9VÍß¶|ežó—Çî‹ý§}Ë‚ÍÔ=áVi>É¡<{NPVŸ‹€Am˜8Õå Ì•9z}+Hýj]â¡ééÌŠó3.K`ÞX))&O0 ÑqûÀ*tÍÅfÛSÍc;)l¸J8ÔEA¦¢y!!Á ²4SOfx넱¡ÂC 2³* ˜BɈmø…ƒ ™²‘àïÖ!·Èö†%¶ãĉÄ&¬¡¡a ãX»W Û8ös|«%=ÅvîØè ï±)Ehu0QˆðV‹ã¾ðŸ(È7-q #'^ÕúÈðEp©×½Ñ„Æ~Åt&rüýÝzKü#ÛÈìhé®?dåL«§ZÈÎsŒfÝcMß"ê"f!‹#<-±V`àeP˜euÕIˆÊ!>Ì,=´(""ï!Ì«ëï‹Y&En^ùW0â-ÀFÛü±‹øT`\VÃüê]aáЩýƒ[õÔBÇe=s-=ŠO3ª©^Ÿ¶+¿l!'€¿]oä.ç¼¢.YÃ_äéž¿Œ¡¼ü‰éœ—\7Á˜)h.¢T߆ øìT[ ¢XcÏøsB Ž´šdR1P&¨HHåðˆì–(ÑüE÷ÂòÀÕ MK£ò¿E¸>%ø;ˆW•QêæU8ܯ`z•©ß¨KüMáº?ñg0A‡B=`È©†ÏE ˜MQBCi‰Ø?•ZÃ_YSR¿X,ùv_‹(˜‹ ¹‘Gxðàl^!±d°ªI(è N3ÁŸApã$J…VêöªiœËùž?«¼F@#cQÃ_îZ¥"~*‘c«Zv˜¾,²zI|ïÌ<¡ï«0mõpàätqnN)õQ]àÏ. Ô ¤ÛÈ3•$ †™Äïs#±b âê$Šsä¶2…ÉW.>{dÌQHu˜*Lˆ2õR¡¬&kd’Ã¥Õ{"®!c†œ¡i a¸ Niq’ðGÃ"ðWÎ-Å÷bú©½Þm\ÍC5Q«+ì#žô@W)ìÜþsÃÈ«S) WCµ OdL+à¶à‰C¿u9r®SÌœŸüŽIêMz×÷ÏÎÏ}ßR«¤q³§\úZñÓiìlê[äé—m¤>IïáoˆÐöXoS¢¾˜#ÁYKŽŠÓAǵ‹T”9¢þ9zßßß>ëÊIBþÉ¿ÿJµ)ÉŸT›’üIµ©3üýó_)©ß¬3üÉ÷/¥~»N¾ùߤ¤>AÇøs¯ÚžHý5êýÈ_¦èRRŸ#ûÈø›II}–¶?ò'%õ¹’üIµ)ÉŸT›’üIµ)ÉŸT›’üIµ)ÉŸT›’üIµ©ãüõB¿§W_º$ Av@¶^t¬€L©ì¢ù«rõ°¿Ý*¡ûfßåP†$\êå/3fQ˜b×CÝsÝ"p#Ô?^B£'3Ò³Š+ÒïCF×±¢[×µ%R?è÷™ëg‘7I GÑ}àZ[Òßöæ"žE¦5Ëîç–9¿ïχæÖ½5£¨¿½÷€2³wÛ„É{=˲žŸeº/2õÉŸÔ:>þöC= ‚˜(NéŠáx[eJ?"±¶™]˜¦Ø½v¢¨ðÑ•Ãl¢†§ø š­ œ×„KRX·¼jæ­´OêÏÖ©õÇ0ñ®P!àO<B"ð×GͶÛÕ!ìãh–À ùdF‰HdC¸YE·7áP·ÚhžÔ®ãüyn–ÀRYñ×Ë2øƒÙ‚¬æÏò‚ 0I8 €8Ͼ¯ø þª²`w»½B‘mÇ1dŠÛiŸÔŸ­ó?;:%êyÀ_æß‹s†« {úÖ„0–a÷×Û™å†a–¡À7uóÞŠ­e ± ‚ì‘€[næù Ô:Ο֋afš9Ž#ÔúóÖñ]7Óp=Gw]2Û*I¨{aV=¯pzv¢h ü´¢°¿(`èÝÂü/ aUbÉ!Xꕎ¿Ä/ñ“;bÕxZ}fbøÝÂÖ­wÅÀˆg ]aÿÄ‘H…Ó0 ö%f2üIÑÙ¿d!ò?½FR“Îÿý­‰}RR¿Iòï¿RmJò'Õ¦$RmJò'Õ¦$RmJò'Õ¦$RmJò'Õ¦$RmJò'Õ¦$RmJò'Õ¦$RmJò'Õ¦$RmJò'Õ¦$RmJò'Õ¦$RmJò'Õ¦$Rmê‰?)©Ôð'%Õ’*þR)©6$ù“jS’?©6õ’¿´Z©¿K/øc…iÞ†Ûiš3G°¦éÍMÞn¥¾­‚—üÝ7iê&,'IxÅ’Û$Ù¦¥ŸÌ¦íÖRê›Ê-ðÇêõÙ½B“Eú ¿bÃ^»Õ”úžÊÊô8ažæ1uà@gIÆf»õ”ú–Ú–evœ?­æ þ –çrü•úårÿý×ý!þÑ›ÜÓ‰˜«5üéAÞÛ¶[S©o¨LD¿×ë_d†$ö#V0X|L3¿:#%õ+å–åöß_¿)»©¿mÉsØÞˆf_JêW ØÛþ8þJI}ŠÄà+¢ŸäOªÁà ¡Ï»’?©ÏVP¦Ù¿iVïG’?©öñ¯w•¶ý ¢Ôß© –7D)©Á?cw+`©Vtåæc:´¤¤ZPèû¨©ÊD endstream endobj 420 0 obj 27065 endobj 421 0 obj << /Type /Annot /Subtype /Link /Rect [ 490.9 84.691 540.0 93.691 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 163 0 R /H /I >> endobj 423 0 obj << /Type /Annot /Subtype /Link /Rect [ 126.0 72.691 175.208 81.691 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 163 0 R /H /I >> endobj 424 0 obj << /Type /Annot /Subtype /Link /Rect [ 184.426 72.691 354.166 81.691 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 163 0 R /H /I >> endobj 425 0 obj << /Length 426 0 R /Filter /FlateDecode >> stream xœÍÙrÛFò_1û$É% 1ƒ;©­­Ä–§äµc1ÙÓ•C^\@ÓÊ×o÷8Ioò’„>ÐÝè{zzzð¸`Ä?7øcN’|ñhhŒ„œ¸!ùa! œˆäÄ ‘‘ G ²ÐUTí‘=ùÏ¢X8äÕâÃG`Ú‡úä¸pfʵšûÅO`ܨDq_9eQ„&\ädù:çäE©¸­÷¨Èù˽zä2þ7ðÈ!»Å÷«Åò¥O˜CVÛ¾wi@žƒÀ#uyŒ?NV9ùpyÿ˜­Ê2»úHV?.nW&4-‡ÅÃáoHU^øž3~3¨®ŽÞSáŸG]M å>Ä€¯2³ æ‰/,è«éçÙ„Uáéò¨Lý™ÆÏ¯Dè…F£ð½AîÇEõ'§l¶ŠhÛ¡±ÇXˆ¬qÈ}/†—õn¡:‹:$ ©çÀ“Z’-hð‚ì8`@CÀk† );½«ÔwX°©Ç¨‡÷*ùX§î%S[9¤{b\žÚâ_÷Áj |£¾3h(Ö‘‰Y㇣í;s7þ¯Y¹†¦w¥±Œ*Í!6QŪʌÀo½~$÷?Ý-ßÝ¿!U-+Q‹6- ²i&7D×á@ (W:ÓJžÉbCÒ휓û4RœPÚÜŒÅõ©…qÅfyþÝÝ)äñ×äдe.ëõåÅC&ÒB^\“‹&Í«¦,.ÖWßÎuy>uЃ”œ1ç{?˜‹aÏéFw{wû|E’òP´ëËgë+òòýÛ7ÄoN˜ <?wlü;Èþ‹ü㟄†™DèNó0K{™ÈÍ÷Ê™¤Gî$Oã¤;zëj¸| =eºö :c +Å(y!³4O[YßÜëu—››_Dväu^•uÛVn¿(ØZÚêax>ÇÔóÝ8öBtˆ\4䊄4$—/î±àöP$Xe"KÛ'K”ERæ•hÙ‰÷¢µp.ŠŽõÐÀâtLi–Y¸–I¹+Òߤ%ˆŽíyo^ª®çÇ8~×dYŸjœOOŒNŽ´†,ÂbÕ;ç‡Õ›;²…)Š"—ë+Ú]¤à>BWa0eÍ.Ü•Ã0Â[×GC'„1€)œÇ¾‡×œåë<Ô_ÎܡÊG}»|¼…0ßáAdÆ«ïNÔt>%áÄCšºqþ£VÅaè˜=»ÚëÖÏF£BûãÙN‘ÔÌ© ;X|kc7k¨E×0gtêuÿ;#b1ªV &«éÉÎõd¿Û¸ñ‰xÏ q¸ýã= X¿"ecHcfáª;–ù¹Ñ~{…úêCõD ìQà ŸRÐ Ïä\Êußþ˜\@™ÏñÖë~UîÃTëŽÃ!¯ê~*·oÛê›årß> endobj 426 0 obj 1957 endobj 428 0 obj << /URI (http://download.oracle.com/javase/6/docs/api/java/sql/Timestamp.html) /S /URI >> endobj 429 0 obj << /Type /Annot /Subtype /Link /Rect [ 333.75 274.65 417.99 283.65 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 428 0 R /H /I >> endobj 431 0 obj << /Type /Annot /Subtype /Link /Rect [ 427.23 274.65 540.0 283.65 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 428 0 R /H /I >> endobj 432 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 262.65 243.39 271.65 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 428 0 R /H /I >> endobj 433 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 238.65 174.77 247.65 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 428 0 R /H /I >> endobj 434 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.1 238.65 467.26 247.65 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 428 0 R /H /I >> endobj 435 0 obj << /Length 436 0 R /Filter /FlateDecode >> stream xœÍ[Y“ä¶ ~Ÿ_¡òKv«z4’¨3yHí1Ž×e'qfl§Ê㵚=­]IìÕ1G~}@H ’ ©þ|züs)ÿʊȫڋÏÄ ½,òXJ¬$õÂÌOƒÜk=y’{¬xBÊ*D2Å¥ÚÞÏÝEàýåâ—_¡ÒÎ üÄ{¼ÂQÌÍÅ ´‘÷^¨ÚÚz)(øŸ[ïZÄÂèÿÀ¢À»¿x{{qõuâ…w»·!FÌÏRðsšÆ^"ï¶õ~yuó¹¹¢yý«wûíÅõ-u ÛÉà‰àßÌWtRÄÁi‰]†o¹ð_ì3äÇèƒ,jh@éoY ÉD9ÿ>ëå4žòÔSùù‘Èpüüd’ÄñýiPý—]¶E©~^Äa˜K"X¼þþþxq˜zqáõÜÛCÓ8-@A’‘Š eY ‰à¼]²QdÛGF.ŽÌÖK"+,1âqF¾n£ún¤EVƒJ ”8JÎËÎÐt¤ËÏC²œŒbï½öX“çÕ7ÏGÞßüðo8FC¶å'>Ô Cîêýž÷¼«¸a¶”æºÁ>xo«l³AL½#E8µÊþžÜ6N=Ûƒg`:Š~¼ª[ù¼ëˆ(˜y¢–Ý»ÌRðã«Ò’-oEÿ¼±Œª¬ÜÁÊN¢Gþ4:HÚé[ü¡Ûq¾sš6õ'î(m ö¼§ž;6©~MnuDÕŽÞGÑrîëÎÑòXG(Áoß¿}·t‹|Æ‚ s†®Ú•еràƒì\˜Q HB«–ô}}ØØ+7IŠ?•íQŸD*V$ÑÖ÷}9j¶Ô [ö¢%R³tHZ¹E‘ <ÿbÓ²Ó~ÐÍ7K/ÄñÌ Ð#¯Ûm¹ñN¹ÚS^Ý c “äl…áyyëÏô^ ;®ŒÒ´HPí÷bPc­‚|; 0ºÃ`ÔwG.ÐÓÅÔì ª(ÞhÖVÅžÁ_½»ùé«£stÚq§¢#£ì,WÍÀ²³­ìšáÞíAL÷‡SIß톅o²b挲Ë0 }H¬õuºHO?Í2Ë YÊx'Ú¶¼¼áÇRÆãΑ÷SÙL|ÐRW’žÐ/²[ŠÝ8‚pÕÓHtÍóIaÝÝ;¸¬Æ †Ê­²«‡±îª±~på”[#C<è |gÍ©dÿ¼Î×},O-/ç màáÌ;1Á¼ü<‰—·ÜÁx #EOº]REó¡*äÅ8NýQÐ:„œ7V$x©šWVÝR¼_Šncz‘Tà=oê¶yoƒâR…‚µ±nøà´æ /„›¹LßO8´Qž?àPHæŠj‰wÚÂreáåŽZÓ$%)ŒIµ°ùŠEM¹„Ük­g”<êê iZãQ9ƒhµ¾Jî KÈIwâ˜ÒÊe9ÅUgÑ4p œ€ÑcM„¥Ud8mDUM½ÎJ4o¢Î‚J4SÛ]º}¦’Ýön[n=¼qjÕÝ8§—>Šæ‹½ÜhLa{žôÒ`ûlH8äÅ( uÒ)ÅÑC‰¨ãNYùÉ`žnÛ–ÛB)·Ã9ÔCR"‹–#ˆf HêªTsoé 6_Bi4¢È6”.B·#!5O-,X¿ÜñÉ¢äl*£TmEy% Ò†£èvÔ¹/Ù´0]&¾eÝ K˼ÛmY;öÒàÊ’vÁZ:5™/ǃYÓôšRRg“eV /ûÅ,Isí"€aÚïë'‹¿òwÃÃWÓ }vL°.Liô|‹o­3a;¶®1±e¬SCa»bk¹Ýöü¡V1¹ô^:_ÅßÃHó•Œséøœå2s ²5f†ÚœCm/ç$÷y‹•²xE §ó7X°Ì™nÙ—<ñ™eŒ@?ÒÖ%M¢Š¹Œù¡TœCμvw÷tÖþ8y©¥V¬òšñD¹!þSæ“•¦eö³Ú¦ü=Í–#ic*8:~C·#Í0‰Áú,_íw{¶ß Õ M¿ØñúûÕŽÏ:fjw+N8öü’?©™}¿ ‰"›™¤O°Ô£lÑ£Øc•G³•ÖžŒ(Ó’†s!yágŒà _ôç³úaF½ÔVžµÎë aƇ‰œ—«ÖÃH¾ 8ü0–©~±¦W. ¥× Ÿå<”g­ž7jr“GOºEåJ3øgƒ&ð¢°@/GqŒòoUœJ¼W½x44F Ò˜Ôhò€Á°Z•¼#½åŽ˾{ÜÓÞáeH¬øÒÚÃïa}uª=AÌ î"ÈÚ;Rðpx÷zc8x6Ašö๙ë4ÖâêËf}[®r W}w™…dÍ(ÄûÉnxÈ¡[!E·¢wÚÞóŽ÷ecpüqêôQéTÓëB½Ç¹AO,ë-ê\=Ns Ø­š…Yõ¿ÊÓŽÈÙEÏbrúU>/³™ã†#¯êýóÊp<ÔÜÆ 3¶úRE×êeÒk°özÙZPÛX96ee T >W¿dƒ ûIaR:ñÚ€“!{…cUc»dÂ;Ó ŽÖÇi\5Ä™/Ÿ'Þ¯ø2If¾49xÈ¤ãØ‹ÝTá#§}‹£ŠX_,"Bc|˸3ÉâJßô t¯C“—šýD·S)R³Â¹lè"ÙUX0Œ°´µ¼ñLj‹¹±.Y:)ÍfNÒW ˜Þ•8á]ŸÊƒeœ4”GºÅ9É)U¼i†»×¾å¼±ä¦Ò¾vÔ↊4M}W¹^Eä¨jºò$¬âÄÂúÄøÒÑèj‡NMšÃKÓ0Œ—Îæûˆ¾y‚cgaŽð„pÿ,¿H—–T³oãQæ‚…ÂoÖ¥Ÿ¿¹þǵ£»)õib!¦+{ÜòïÄcçÔ<8Ízr×RÈÖ©EK®c5ms„ † «]º³˜o-¸0œ¢ú™Ã™+H}Ù Rb©ïœß–G}ØFÆGQ;Å|¬| TÄo …Ž­+Ã@ß!{-iÆ5¾ fv ZÂê|ªšig‹lLP'÷V@ c»/gÙÂc,˜ï)wv%d©Ò€[(%¤ÝQ¢ÒgK›g „-o,&W.KD[òïßYºâhF‰) #t· «3ô°ÞÔÜ> ÔwŒTñàH½»Û:¥|s$Ýá~éÝp¾Ë>íÄ%DÀŽCš RO5€Ë<‰±Ìg2‘Î’ÿo¶`dfQÒÀ`úf =º ~¬ÕL쨢|²bJ[I¥¤H¿Ÿ!¤-Ž[rË+Z.ãÅæª©‡n릟×*ßO2OÅ«P´êó±¯ÁÒ¥Ãâbæ0ùò‚«s¬" ×A¤ø0ïáHæÔ·>Nó @ÈmM©ç~.G›÷V/Ü[Wï-M»‚Çz8X„“飰×=È)-‰Á¦[™ ± Q]~à³Ên•¥÷Sב¯W£ÇNû:/µXŸéíÄÊÝ:ËØÌ™8×Â@í˜\…|Uä¡To ôƒ«ôX«h ¤íúP½™“=kbߨ>†8‚žžêÞ1m.Ÿ„Hè_FÎ4Ý>ŸtD=¨Z±fî-—'3ÇÝëºËnjÔãzœà5þŽ?á2>ñgáÎlàßTnŠ´³5#bjÀ“pbž0­ÊõXW¹7$n|‰ëls³ ‘hÛ„r¼u-Ž5[§–š»¥ïŠù–QN£YM¥Ï,VïÅm—2Äﯿ~óãw·–1ðQÞ™Ðî­XpĽ¿ç½ËÒך–GänÄ…ÝH‚,»«¸ÛN•Eo:›7(†ÂæÁœ:²Üâ`± oøT=Ê Îî¸1ƒ³w&??IsºÆÛ÷0WߎKÃ.º£½Aá¬WrŦ£^3¡·¶fzM/ã¹ý”i³K,ŽuëZdö7ñAi +P}²q*˜Ï€´óô‚&éïÇáD _¾_Ä1›yMðÁjíG í¿<-·ùâ-×Ë´‚´—92èëBtÕJE:ŸC¨ŸQ ÎL`¿“Ÿi-ì¡EìgA\äi’­´ûX>”þð¹ño¡—pün³ö š, –¦¿G/n!_‚ˆý¾v¹_Ä ^ƒ¾Ôî—yÃ$ñ#&ŸGŠb¥áa¼º’ç¼F”;_ôe ¤šWËðQK7 ü*…öÕpUë+ɹÇ]Çù‡±?Ɔ™|´)ð†w)ö×Eu¬HÞ%GÑJu|¶*˜¼#Ò75ˆ¦ÁÜÌ RÎ}߇}툨ç,)únyúæ‘+o?6–A_s,kê=uéÓ4›õF¿×±Ì¯z˜î*§ö ó4wS,X‹uÓm8æsD&íN/£üJ¯AŠƒ§fGDoËä%rºÑP`ó¥»…·¶HßHú[ˆ?,sƒ8+¾8弪)Ém~¤?~^JñÕ#û­ôo©ž¼(}>»Â0ôÕ Ig+õ_˜]ÿéÔa…´æB‘­iœOV8¯™Ëêæe„ya:{I‚Ôƒ V+zú¼Á{6¹Lã…>²à²>x¸Dïø¾„hñtªñÂÓKÂ? Áœ$¤§k¼âcæ8Âìa„á™BE3EU0Cï¹Fö1fcªêoZ• yÀ3ExƒãlS€»³G Ò£zjE}ÐÄ0AJ¥nT©M9®ôŽ1ƈÎH=s½˜ÄÑÌWÖõžºì˜;ÞƒsbéåÛM]q´ùÞ?¸½Tg“çéÏ'=X²`N— ¾ºË.@³ÁSŸgÈû­e¢•¤ÌîgôD*†øPfž[ç Æ©¡?l9}¾Axö8dp&Ë`dA¾bC]í}Xê?òj<€Ìõd8F‰3ÖêÃ㌒²“ðœ"m¨ün㬱,Š^’a­ÀÌqÅXüdk´ŒlHÕ(ð‚ YòÒBrª_²–Cž%swwâ×O"áIFŠ 9…èoŸ-M‘»±2<=}Ò²êÆ)¥§-Bt%FhËψ¤“£k²ù>^×ב¸¦æØLÃÑüiäÝ`¾oY ð`žÍ<øâØGñZ çõ<šÉOCæÃâDU¾¦¯ÂaL _-à×øGæ+p¦Ã0“?$)²(‰ÁxùëšF©/¿èÏsØFä³¹/² Ô¿¹ !ûL#8Ôb%ý› ‡…¿ép5Þ©`ó{ ? Â" ç?Ë ©Ä3†uúó’5{bcHœ™´ü#èÇ, Ñ‘–}b@,‹ÑîXwØÕKôoé7Tͧ juF…Öæº}îeLj/*žw•Xñâgj…—ÏÃÉe*+`Íh™‚?7×·ÞÍ»o®¿ãÁ2ý§å'ùpFIòr}§ÑÝÝ“wº ÓOÛþ ó¢% endstream endobj 430 0 obj [ 429 0 R 431 0 R 432 0 R 433 0 R 434 0 R ] endobj 427 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 430 0 R /Contents 435 0 R >> endobj 436 0 obj 4167 endobj 438 0 obj << /Type /Annot /Subtype /Link /Rect [ 247.287 588.411 411.603 597.411 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 440 0 obj << /Type /Annot /Subtype /Link /Rect [ 427.227 588.411 539.997 597.411 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 441 0 obj << /Type /Annot /Subtype /Link /Rect [ 126.0 576.411 307.38 585.411 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 442 0 obj << /Type /Annot /Subtype /Link /Rect [ 371.02 213.504 420.18 222.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 443 0 obj << /Length 444 0 R /Filter /FlateDecode >> stream xœÍks·í»~Ç_êt$jßv:<äT­Ü8öµN”ÉP{{¾÷vÏ»{:éß$ÀÇ>î¬|ik;’‚ À¥>_øÌƒ¿WòGš¬Ø]|&šÏÒ€… ‘â„ù)O¼Œí!Yœ±Zv² ¡¢RoD¶ì_ͅǾ¿øégè´fÙñ›1G6.~áqÂÃ$Ëóœt ¸ŸeRDÈŠ»¾Ýì»VõÖÚKFÞÿ\{W£Ðþ4òØÇ‹oV×obæ{lµ±.à!O°s’D,ãaË?[íØO¯?|®Wm[õ3[ýõâfESÃqÒyø—råA£†8òÆ-Žwº¥Â‘Ä0ÙTÓ‚ÒOÙ ÁXž4±rO—GYê¿)üôJ¤!Px6Z€8ul?vªÿ²Éf«(eŸžŒ7ó¥ö0ìûŠùÐÂ^wíÑÀ¢Y¸hëî1躬«]5”]o{w¥KÑWõ³í]õCÕ|”’ÅUÊ#­0µ ¢6ø°¥¹iT ¡#Þà*ÒDEuÕÇ­X5Ck¥‚e,¼´’¬Ñ‘pf{1ÀÛ¸™R°IOl².‡²P‹#\›Á‰§UÃÊ'<$˜ÔTEk>çìCöù~f)é•ò +?ö¤:Ž¿hR#vêÌÑx]}rG Œë7ù,‹SžfižGa¶ wg5›Ù^ ¢³lMÈ΄éÓLã£×Lw_Õ¦ÍO¸ºòã¡C)Ÿö]Ù÷UÛô æ rÐb@ƨߦ­ëöˆÛê*L"žêM«±îP£³^5'»Núĩ,õ¼@&{3Ñgf>ÂBUº¤ó×ïn±ÒFŠACc¿ŠGÁCUs°TùÄß¡Oä…aÈ#éÐaÿ&E!”C²Ç{’…¿m œóédý4ƒ9ƒ$ÏòÅ‘ÛaØÿáúzÝ›ºkÞv¢¨K^´»ëGˆüÉpi©¾¼N€AÑ_‹}u-)×Òv×Êv×d;¾võ„#$<Ì å‰ DœóþyÖ=ã©Ý“Ô_èÎÑ!œezûæn"™íO¸Þþ„žÜþa KGr«.©üÒíEgÙ8šÀö_X‡8œŒ0éúU¨†ãÒFaIÂi†d»Dã0é‡Î˜MŽÛªØ:#D3.suK(ûBìK‡[ùùP6EéðÃ# á®”¨É— ‹©×Èù'ñdþÅV€ãªùÞËY;vÀ & :Á‰ÚCÊ gMÛÜ5=@ FÊrîgðË"ä÷FŃÀç „®Ý¾í†þÒžÛƒw‡~0ˆ¨â¹7(üÙàö¨ ’ˆÂ¢x#,O9ƒÀѺå»Ý,*qÄe#)­µÿ%37ö!YŒâ\ÝØÌg§Ìø¤÷†°½Ê¾fƒ—ZW› dS޾£éB²Ó¤mlCÕ¸f\¨Òü‰Å¡SbÖU ßvÏ ÷¼(ж[«¤£Uy­Ä dú±BQßݱGÑU’ÈNFƒRšTÖlyš.¨ £Á/«¯ß³úåÍíÝÍiƒæþ9>—L†'Sªy\Öi©¬øó4€(5>”jR?áIGgÊ¢ÜZš‹ µ+(T»íº´pHX§8‰°R‰¤Õ™ÊÖÚ¸ 6]Ÿ©v_Tfj"Mcоœe“‹£ ˆx(²8¥´žÁŸß³©ó³?±ëa·¿^5_÷'7ƒ§’ãPntvÂñ•òœQtRñ˜( ¡ˆL˜ ɄۘLÊE©UGe݈û_£2‚XÌÕ Ž¶î™[\ê%í(Tkþ­…OëH–ä|(æ¶ÁãétlI Ò}¨4 ªŸ^ÖEœ4ÔóeçZsƒ óÐ )S(˾XÖ벫) ‘·Ë¯7]»³˜®b D©^¥axr&çÒ¢2/³„Ðn`ã5åt°åCÂz,LÊõ÷Õ×ßœ‹ö‘wŽ·º¬\µ‡±žÚÛ‰g‹¸©˜"ˆù¢¤þDl_lËP‡$ƒLlS=Íó¤ y0JMÿFßÎÔò¯ÛæwƒE›×8sÜ atY‹ ¼Ä@D]ÉèAhDð®¹wØ4 G 18˜tnÑ•£Æºì«Ê!W®×ýòœ~ý§j¿/×—Žf¥Þ&Ô£NÈxw7³rèÅ+£ÇúþÄa᤿ÆF€“AŽ.°Tîúáo·ï~ùö‡»¼ýû‡“î*‹ Å(qsF—FЇ„d¾…URY?p> *®7XÕ,ŽÙ–b]ZöuÕ8¼[¾ºzeàû×Ûçý¶”ù¾¡­–ê:kn{ùn4?rÇ\~8}+ù›¼¯‡CpÅo°5ÄÑ3Œ¬&Uoá*ð«ªÚ©¯¬—¶ /U Ùê¡Ú£ëÐH³ˆ›µ ÑÓ·/÷Pb ¥ÃðX©Ë]méö‘úïÉŒ&× _W ŸÌ±hw;1»äƒžàÏY%K†nìR1Ñ¥(ÂöˆG\HÒ“ àWW+=¢¢.ÅZ¤Ð¬©ykî>rÍÚ‘eÅtèÊÄ 5 DªÁiiNhúMÛí …b ÄãsQu‡ÝܤI81écUñ •—‚t'¦.¡[búe[èŒRì-„B7úµ­+¢ n:L¬³¸îoåÑIŽ·ÓÎA~ö7È=žy°I¶`‚—mYrŽ#]²íj8™)÷QíãBJã »û×}ÕÈ2U~‹`°ý›KV<±• àõ ,•8 íN Uë3Û‰=êî\õ5 êSb0ɽ#¨>³ªˆ>(ùæIìdÔ€ÊÀçêþ=–vÝ×ÝCþ ûêG¹»^P¥F~ÄóÌ˳LU©À5ð<盢*sd§;éÉ!aÝå0R¥ÏA&û§áL‘Æeá’>!T^™¯•Ì·ØËU¡‚t& p%ŒT!*„¶“4ÁX ƒ½ÄÐ9 ýÑô$>ªG§²Ý%™®ÀH—T¢#id3ehP.QO•¡¥TR8<Í‹•(  zÎ=?ˆ62²¸¹»ùvÅÊfèž!úÂ){i{õ]{;Q"¯.Ù®]ìÉ7ïxËz.+Þ3Õn$ßNAe)í¸¿·ê õCóñO‚·ôÓ½ÆÅ.º³}ŒH-Êš`QW*IX+K-Re͸ µÌ]~ôâbÜu$½jf °tóCS·IÐ$v~ˆ3ç+’dó4­º<Œä±Jà ¬Eó‰„1;@xxÞÛ1Â@:5@ŒLêÔ[z«>y- N§gG²¾™EÑí¥Õö`éÕæ%c xè—&àºÅÒ”h¥tg1ûЦ쉩”1ÈÑ,xŽeLC im/_$Hjš‚'ÈÝ´HbêÌntÿÓ¶Ÿs/’KàHšëˆi„¬”½þÙ®a°— <´¢íÝ9uå9n†šù±j=¡åºÒ{8È+oNØ=– jH»?ÔJæ ‘)ëÁÕ#ÞWÚ“${‹ë¬Ü8”Ó¦ÖóJ—OHûðãEÔ$/GÃÝѽ#·|*‹Ãà0éhWZ«YBÔ(9ç–tè*A±„F–äÞÄjëL lÖ3kÅ^´`-9-e ÁTd`jÖ:ç—¹Ëé{}?ޏ—‡ù÷?ž.ßïÌ89÷¶ùÛî“|Ü ß;²b«Áä0Kåu“ož9ø¾/‹xÈæ,§ÝCÈÞâÓÝß‹#{Û®§'?+'iŽ™ì „D÷Ow_úÀ ³ ô z¤¶~ªÜpËKÓç6Ò C²¬*ÀF\ÍÚ¶™S…ʮïyŠ»i/›¢=È5À©T9tø¦AaPïöJ[]‚ú“•ñNd %x78#ÔK?à§;'ÆãÇöÓ|ÿÇòªqd.ûî'ÎMŽˆ0îe„û¢«öƒA•‰¤çUùxŸ".wÉåbϨêCW:*ÔVŸB`È$5&Úª¸Š`×:£DñÉÎÂÑ¢|ªn0e:~°Óo ¹cobD4¼¼bÑ)Âk89×¥A[}{‡øÐÚQ`­j0hk;Ѽ¡yÑðméô:öNƒ°¬Ðy(©SÌ¡›»ÐIëuçö ¼™£ÒÖX=º‡Í…[qz™£ûI‹qK {!bí¥qí?Ä™¦L¼z þeõöî4 óÆ ÑºêéS3IÀ8ƒHùˆ%ÁH;wfh¡K—»Ólì;7fLŒyÄ EõüX‹ä†rú{PÄSõ q°Àôþ~÷ç“ym*Ÿ‚Çyž¤ #dð‰6íJ…è*ßv㤇Þz*Ÿ&cHÀÛ]êÛ];qZâR9 ‡F½óu5<*}Ê8o!ùTÒ }°P–,LT]%½¿ùëÍ·_¸ŽäúÓ|¬Rº˜YÐ>š£®ïoÞýð~uºñ²œÝ6ìA>ɗߌÀ­åÂèOæ]}Ó¯£äû3Y-IXí.Ü:ú«5/ºªXû;-ò×þÌx6= endstream endobj 439 0 obj [ 438 0 R 440 0 R 441 0 R 442 0 R ] endobj 437 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 439 0 R /Contents 443 0 R >> endobj 444 0 obj 4167 endobj 446 0 obj << /Length 447 0 R /Filter /FlateDecode >> stream xœÍks·í»~ÇéLlWZïû‘™NÇ9QjÇŠtMÚ‰2žÕO·Ñ>λ{:kâþ÷‚øØÝ[Uý’ÖN|H ‚¹ŸŽ<æÂßñ“d>[VGŸˆæ±ÄgAL¤(f^âÄnÊ*FH¥¬ èB` ©Ô‘ ûù¨>rÙ·G¿ü VÌu"¶?r'Ì‘ÍåÑ <Š N³,#]}ÇKS!"pb–{qVùìM#{+í#÷®½­Qàùÿ¹ìæèÕâèÅÛˆy.[¬ x~à$1Ø9ŽC–:Ÿ‰?>[Tì—§—ŸÊEÓ”Ï~e‹ïN45'œÇ‡ÿGzР! Ýa‹å]šn¨ðèHŠãG0ÑTÒ‚Ò¯hP`$ „¿³!VÖàñòHKý‘ÂçW" €â¤ƒˆRËöC§úƒM6YE!{~2îÄ—.øo|Ù³gì$ðØÓ–o›¶ïºë¸û»¼2d^m˼/êÝzßQa¹æEN«Ðïïߤ: _lxË×M«¥Ü7;.óZKâý ó¡çïpµ,+øîÈ wy[ä×%—êB0ËØSôâm66b:I10 ½)£ç‹çÅäÞ^¼üöãÛ³w§ŠÏt‡ñŒŒ"Mû¥¼„‰ëºà„S­^}X,>¼¤b~ Q>ŒA¯4~H±¾10¹ "°^–Î;¶-¯É[×+ƒ,˦´ …'«øNˆ™¦ª„<<'!$´lÀ5yÏË{E?+ó%×]7ìúûä: ?[+]O‚8ÅñÐ_绲×-¸!¤# ï¢@Þ[l[Ÿ¿SrH…Ï{cO rqzþábñqq¶x`™]†£qkò5‚˜Úòˆ4×wE³ë ¡åy×Ôdž R"´c¡=‹ˆZ5ʀ뢴jˆ2ÃÙùû>Ø'Œ]×÷§óiîxÛ+Þ9Ë®›÷÷,›gaT(jrø©uTHDlU´S›öÞšf7°eå^óf5qs‘k TÁ8)M;Øhµ$LêHØZ+‰owí¶é¸£ ÿÄÕ‘0-Ž„iKXº"‚–/"¢3DèzÉŒÂpQóC]ö¦aÝæ7¯{C(J‹Åð­xuÍ­Y5uƒÉÎúƒËâtd·?ýþÍO//~xùþô_³>ÇÓq /p¥šºëÛ<'‘"CpÛò;œâàqMÛi aû”!>›ÜŒÌ則pÝ:‹«gŽFqõH3¹z4¼ìŒVh.jØõM‡ô2/e0Ô\§ŠMœ0uGF)‹[à<{ %°LÆ<_œ½?½\¼|>kÿäà@&ƒÊœ°,v²ºûax@æÅéOg—g~x þy®ï„‘8Û %—£‚¡©0˜³löÃeDXDì“u[ðz%í‰TðÖ`ÍZƒž¯xÛkžk°åŸvEkpòB”¯LUxsù“†‹J„…ü³ÊÝ´–îz0dÞ®4aÙ”»ªÖ¨¶3Y|²Ù¡}Î$`8á¤Ô ©E0ÔÍ ‘}³+W3@üÓ®¡lñ¢¶À"å²/îL÷Ëßi& §/,ƒÌ$‘¶Ø˜¾h3â%m¦Q<»F;jt›·°Üf.°I§vòã‘àܾGR±*— CY<ÉÑdÔáUÞçéï·Ò¬ˆICÍoš0”PÛ†/o¹*£ñÃ…Qˆƒ³6,d˜A¸ÊoM¿._$ïº]µí‹ÆVäºÙõSƒA-\7N<4Ø~Sô2Ù dlÚRž&1Jï$|]æõ­ÆÄž+0× ô)„ ¥h6t4†ÉrÖö_bÔèóý›W¯5ò ê ž[ò`iŽ5†{•”üœ‹LôØVÍŒÛ5okpT'¹4cÖ/§©‚¹#{ÞååN˜‘<…×|¢¡Ekõ0dÊddCJóìLO1îɱÆ)ï‹,¥©ACRiÍ«öx%ê]Y:»,ê¥á¸7 ‰.Jt]”e>µ_ìì'*9.Ìd «Üƒpߎ ¾·úªƒC5‘gª\[u®ï÷¢Ü5”ÂCY"xŽŒur áçy%Ô¶!ŠL¼æ”¸z* SC%áÈPO$/±rÈJr‘àŠ—Es_)Âõ½‚:Òã8þPmNe=‡þñâÃÏßœ¾;{õl¾´NŸ0Ë t=ÀÇQz¼º7ÊÊ2îXáP=Š£Ä(¯L6žeqS7-_é×»^ý¦Ð#0‚bc¡¢G¼–q&ššæ2òMÞ«/{°8ôm,.¢ôaÍË¿<¿8}{öykz‚Mœeq’`cô ú(3%2!P÷÷…dô¿zf(Twf¦b&DÕŽˆlòú†ÏÈPîÖú‹„Á&­Û¦2ØW‡ußCƒ¤~¨Óta²É!–C ‘é%š[™ØÊ]§Œ½2уlLJ†dr¡†Ð×–ŸŽ‚™È_v}"˜ˆ®ð#¼Â—·ˆ°æá@jBÕ8Y$<+¡|ûïnžÕ'çmsÓæûŽ—[&NÁ3™i [ˆƒâô3aZàê¤Yèy©R?ˆÖÞÁ¿>xo$”JYèÅ,LOfø 6ßZ¼EøP2ˆN.vªXgCR)H6£’ Ï^¹jæ;aN$õ&2‘ªû& r&VG)UN< ¿IÌ)ÉФa6s@Ÿ0& (ž>‚àÚ„ÿB!ʦ&bü‘['«¡brFƒ®`‘‰FÂ#L$ú‹§W)ÂH%’Rg,›´,Øx}ÆÚýGeÆÖAÒÄ8:ßÊX:öí$s¼8ÏÈ”m1øó»x}Énù=ì¼Ûç³öˆ=J› NAxh¶7Áï“1¡ I)HL76c @¬àýF\à|9¿P"®àèé¾\·<¿]-¿œL9‰W ¡{àYœºBìFÅ~?J¾UþYV\_ö\ÁRÐ6Û)k?9`–ùg*¹˜1')£‚a‰#Räpƒd„L]Ï)ÌjÚB^S|ÆÐˆz]<Ðל݈·ÍÞW ¸¶ÆaŒ×Ü«2y{ÃûyîÔê Ùôg~㘲&DÔg!QŸ­HäùÜŒPàtE Øíké$¼óX&~ êU½¯>ÚÃjs*tU.[‘=pdHG…¤0ÑÐaË:Ô<^$º'Ò$;–G®(¯e» " “ÅCƆþˆ@%ú{áH†& ãæ!}¼B“ø¦Ôñ|ˆ4þxu(jO„øC)…4"§ÝQc¬…?Æ6Àͽˆ”AŸêa/ÓxUFŠ=&€ŒB¤‘Mˆß‘ ÕrñßϨ,ŸýKÿ@Њq¿{Ê¥(·À¤ûÄOEfEi7a”¥‚ÝU%lˆQXBÄú ;¨ê¬¾Ü¢>6AlþÕă7 Ãé,VÝÝIßU%¾dÖë›Àõ ÊO¸8F…Ê|•uTn͈î!,{¨h‹Øµ58ïvš~^†C=úfË D ›Jë\;ùž¨j¯K&KtȪMß+¾]‰ ¢Q¦V ‘ÍhI¤\P„çïN'tÅ7iiz@|$xýá‡Ëüûîò»ÓÙh5(k‚ºiA Ë „ñB!š•™àø[ bÙâIìE#P~~’ËOL “‹îûƒ ¤£¹a}^ðSïÆ°î¢+ꎷâÑCé´ª‚Ž,pè¼x0obH¶ ‹ͧððŽ4¼ûí¬›ßNñ¼9(ââ|/Ó‘B&•ß ÕÒd)>¬Õ= Q®y¿çòB¢¯eé–š/Ó$øÆP¥ ¦øN#÷Цéê M" u¶8™Ì¤æ‘.<¦öX«EÖÆXŠª»¥õd)ã0™Çzáôì'óÁ"˜{á‹ÍN$4âK úÞÕzÿ¯5Ý2ßZC—Ë]k>÷³»nú%Ã}©M½é ¨O¥`Qœ$díÃ/áÿ úP~ì endstream endobj 445 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 446 0 R >> endobj 447 0 obj 3672 endobj 450 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 680.124 156.275 689.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 449 0 R /H /I >> endobj 452 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.35 680.124 539.808 689.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 449 0 R /H /I >> endobj 453 0 obj << /Type /Action /S /GoTo /D [141 0 R /XYZ 72.0 119.028 null] >> endobj 454 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 668.124 194.862 677.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 453 0 R /H /I >> endobj 455 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.414 668.124 539.762 677.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 453 0 R /H /I >> endobj 456 0 obj << /Type /Action /S /GoTo /D [186 0 R /XYZ 72.0 708.9 null] >> endobj 457 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 656.124 215.169 665.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 456 0 R /H /I >> endobj 458 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.469 656.124 539.758 665.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 456 0 R /H /I >> endobj 459 0 obj << /Type /Action /S /GoTo /D [186 0 R /XYZ 72.0 282.28 null] >> endobj 460 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 644.124 177.117 653.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 459 0 R /H /I >> endobj 461 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.454 644.124 539.852 653.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 459 0 R /H /I >> endobj 463 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 632.124 256.725 641.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 462 0 R /H /I >> endobj 464 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.545 632.124 539.716 641.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 462 0 R /H /I >> endobj 466 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 620.124 276.867 629.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 465 0 R /H /I >> endobj 467 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.462 620.124 539.575 629.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 465 0 R /H /I >> endobj 469 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 608.124 287.729 617.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 468 0 R /H /I >> endobj 470 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.494 608.124 539.576 617.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 468 0 R /H /I >> endobj 471 0 obj << /Type /Action /S /GoTo /D [200 0 R /XYZ 72.0 278.473 null] >> endobj 472 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 596.124 237.027 605.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 471 0 R /H /I >> endobj 473 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.485 596.124 539.712 605.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 471 0 R /H /I >> endobj 474 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 584.124 267.04 593.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 201 0 R /H /I >> endobj 475 0 obj << /Type /Annot /Subtype /Link /Rect [ 527.076 584.124 540.219 593.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 201 0 R /H /I >> endobj 476 0 obj << /Type /Action /S /GoTo /D [206 0 R /XYZ 72.0 211.118 null] >> endobj 477 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 572.124 211.867 581.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 476 0 R /H /I >> endobj 478 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.461 572.124 539.76 581.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 476 0 R /H /I >> endobj 479 0 obj << /Type /Action /S /GoTo /D [209 0 R /XYZ 72.0 648.0 null] >> endobj 480 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 560.124 213.518 569.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 479 0 R /H /I >> endobj 481 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.465 560.124 539.759 569.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 479 0 R /H /I >> endobj 482 0 obj << /Type /Action /S /GoTo /D [209 0 R /XYZ 72.0 466.45 null] >> endobj 483 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 548.124 202.53 557.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 482 0 R /H /I >> endobj 484 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.39 548.124 539.716 557.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 482 0 R /H /I >> endobj 486 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 536.124 172.228 545.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 485 0 R /H /I >> endobj 487 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.394 536.124 539.806 545.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 485 0 R /H /I >> endobj 488 0 obj << /Type /Action /S /GoTo /D [364 0 R /XYZ 72.0 686.4 null] >> endobj 489 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 524.124 269.838 533.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 488 0 R /H /I >> endobj 490 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.442 524.124 539.575 533.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 488 0 R /H /I >> endobj 491 0 obj << /Type /Action /S /GoTo /D [376 0 R /XYZ 72.0 384.948 null] >> endobj 492 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 512.124 223.365 521.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 491 0 R /H /I >> endobj 493 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.494 512.124 539.76 521.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 491 0 R /H /I >> endobj 495 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 500.124 167.741 509.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 494 0 R /H /I >> endobj 496 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.428 500.124 539.853 509.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 494 0 R /H /I >> endobj 498 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 488.124 172.712 497.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 497 0 R /H /I >> endobj 499 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.442 488.124 539.853 497.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 497 0 R /H /I >> endobj 501 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 476.124 176.033 485.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 500 0 R /H /I >> endobj 502 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.45 476.124 539.851 485.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 500 0 R /H /I >> endobj 503 0 obj << /Type /Action /S /GoTo /D [427 0 R /XYZ 72.0 128.34 null] >> endobj 504 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 464.124 184.899 473.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 503 0 R /H /I >> endobj 505 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.431 464.124 539.807 473.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 503 0 R /H /I >> endobj 507 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 452.124 184.899 461.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 506 0 R /H /I >> endobj 508 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.431 452.124 539.807 461.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 506 0 R /H /I >> endobj 509 0 obj << /Type /Action /S /GoTo /D [437 0 R /XYZ 72.0 340.444 null] >> endobj 510 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 440.124 238.528 449.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 509 0 R /H /I >> endobj 511 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.444 440.124 539.667 449.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 509 0 R /H /I >> endobj 512 0 obj << /Type /Action /S /GoTo /D [445 0 R /XYZ 72.0 383.68 null] >> endobj 513 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 428.124 238.216 437.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 512 0 R /H /I >> endobj 514 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.538 428.124 539.762 437.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 512 0 R /H /I >> endobj 515 0 obj << /Type /Action /S /GoTo /D [445 0 R /XYZ 72.0 253.77 null] >> endobj 516 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 416.124 190.957 425.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 515 0 R /H /I >> endobj 517 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.449 416.124 539.808 425.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 515 0 R /H /I >> endobj 519 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 404.124 240.829 413.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 518 0 R /H /I >> endobj 520 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.45 404.124 539.666 413.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 518 0 R /H /I >> endobj 521 0 obj << /Length 522 0 R /Filter /FlateDecode >> stream xœÍÝ_s\Ç‘æá{~ \Ê1ëvUefeæÕÆŽ-ÏjÂŽ°EÆìÅÌÄD‚bH‚!˾™Ï¾•Ý À9²ð»™Éá4ÞêðàOŸ·«êüùE¿hëß_Ö<ÇÅë÷/þ|[¿ðq!óþ&›Ý³ÅÅû‹ûƒ°¸xWÁGoVäþM9ÞzŸ>|ñ^|xÑ.þéÅ¿þû ½¹h»øñEÛÜùén^¾øãzp›™‘™÷ë8ôˆz9ÌõÆë÷¿úæý¸øÍÍ1ýù£¯;jÿß?ú‡‘ôñßâ#ªéh~Të~8Ò?z‡i{üžß_n?ߺþ¯9ݶn9 [^ïzw/qÿßzÇç7íø™þû“ŸÉý]=üôëzüÿ+¼]üéÅ?¾zñ«ßÚEo¯ÞžŠ\½·õÏ\V;ÄÈúg\¼zñ¯_ýåúÿ~ñêŸ_|ýjómñ_üµÛpÖcù¬¤¾aF¬Ï¢?úäŽÄ~ÿ9>¥ß]º»¸y{ñõ_/ß|wõéô î|aÚ…øÁÛ\÷9â4¶úáâë­>ܯ^ïáÁ ßþúÁÁo¯ß]îüË]††ÛºC“í?útØŠúúƒ ˾¾$ëÑdÎí°ÃÓ°’°ƒp}p$-(=Q:IzýÖ&iCé éA$û ”} KA–‚,Y ²Td©ÈR‘¥!KC–†,'²œÈr"ˉ,Y:²tdÈ2e ËD–‰,Y&±XŽF,G#–£ËщåèÄr b9±ƒXŽ,Y ²d©ÈR‘¥"KC–†, Y²œÈr"ˉ,Y:²tdÈ2e Ë@–‰,Y&±”F,¥KiÄR:±”N,¥KéÄR±”A,e KA–‚,Y*²Td©ÈR‘¥!KC–†,'²œÈr"KG–Ž,Y:² dÈ2%j}Õ>‚zE½¢ÞGQ÷QÔû(ê}õ>ŠzE½¢ÞGQ÷QÔû(ê}õ>Šz]ÏíC«ÍƒÔ²jz;îhX½Èb­·Ìfz<‰·‹õÇèi{=Žíõzö¸îþׯ?üé||ýáãwïnÎG/ÿüîÕÍÍ»Mw81×Zß>ÜyôfØ7__f4,ÓÖ£QÛzp°‘p€ð:a%aáõ­ ÂB“„‰à$‚“N"èDЉ Á ‚AƒL"˜D0àh@p4 8ŽG‚£Á1€à@p "(DPˆ A%‚J•*4"hDÐJp´m>#=;J+J;I{CiAé‰ÒIÒ1PÚPY&²Ld™ÄR±”F,¥KiÄR:±”N,¥KÄR±”,Y ²d)ÈR‘¥"KE–†, Y²œÈr"ˉ,'²tdéÈÒ‘e Ë@–,Y&²Ld™ÄR±ÔF,µKíÄR;±ÔN,uKÄR±Ô,Y ²d©ÈR‘¥"ËõÛ¾õ\5ТUû¸¾ÅVTwäï óC´Èlºsn mÓ>®çûOÛG9µë›êâ«o¯Þ\ß^½¾û\Ao¥µ¦¹&sÓzäö*óØz¬_ßyñÕ7>]Ý~^zºé»ë—·;¿¹¼»<}^z~ßw—Ÿ®Î·¼½½y>z0ðíör,µÙSL_Ÿ‹äö=Ý ‹C['2­eaõd/4Ómn‡mOÖ¥¤ëÉH JO”N’®'{ m($­ÈR‘¥"KC–†, Y²œÈr"ˉ,Y:²tdÈ2e Ë@–‰,Y&±¬é$M,kúHwbYÓHšXÖôIJ¦?4²d)ÈR¥"KE–Š,Y²4diÈr"ˉ,'²tdéÈÒ‘¥#Ë@–,Y&²Ld™Ä²¦?4±¬é$M,µËšþ@ÒIJ¦?4±¬é -ÈR¥ KA–Š,Y*²¬" IÍ€pZzZ¤6Z³9Ð0?ÌÑ[;£$6=@]{óià§"`TÏð››?¼»¹|ó¹ 8Þø  8©ŽG_Nõ¿¼ïKp¼å¾(8¾ýpØN°~Ä|dkëwÛÎGz»‡°™©Sиõc—aŸ/ºûó›%+‹;НŸ<Ÿ,ž(¾~úPÜXWSyš=59ååÇ«××—ïÎ7üåòÝWŸÎÇoonÏÿóœß¾/­Nÿ÷üæ¿}õpÄþÛ/Îÿry{}ùÝ»«M‘Uûº­_5)#w>âóìTãËì“ç«Îcýü®¾3n¯ó@qGñÞX\X|²x¢ø,n,(.LU˜ª0UeªÊT•©*S5¦jLÕ˜êdª“©N¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘ju(ŽT«ó@q¤ZŠ#Õê¼®ýBŸ–u¹ÝÏ{`lò<þé¸uª7úÈtU6n̲5ó½qO™êŠë$^¯s“¸±x x½ÎMâÊâŽâõ:7‰ ‹3UgªÁTƒ©SM¦šL5‘jms‹âHµ6ºEq¤Z[Ý¢8R­¥y$>j­ÈCq¦*LU˜ª0UaªÊT•©*S5¦jLµ^ç¶Èlω×ëÜ$.,>Yjm•âLU˜ª0UaªÂT•©*S­²hHæzRF:©S§§ë4A”«NoEÓçÎ8µm§7sÛéS§w\,ùòúó…Àïÿø»óAm^}>úáÓçîïxø‡ß=­j"ÉX\xì<ðyäfœ²ÂqëÛØçéÊXÛq›¦£žH¸°ødñDñz"AâÆââõD‚ĕřª3UgªÎT©S ¦L5™j2ÕDª5ÓÅ‘jÍ4Dq¤Z3 Q©ÖLCHµf¢8S¦*LU˜ª0UeªÊT•©S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"ÕšiˆâHµf’xGª5ÓÅ‘jÍ4Dq¤Z3 Qœ© S¦*LU™ª2UeªÆT©S5¦:™êdª“©:Su¦êL5˜j0Õ`ªÁT“©&SM¤Z3 Q©ÖLCïHµf¢8R­™†$>jÍ4Dq¦*LU˜*ë–”uKʺ%eÝRµ’mÅ2jg°ç÷iÕJJ¶ûEÃdœ|Öîøº÷x{­dôm+)ÇV2—ÿûæÃ»ëWŽßžß~ywywõþêÃÝÓŠ¡:ƒá™3dçÎw°'‡Yk³§N6ÎëKÕšøØ·i@êÍ$.,>Y'^Wj&qeqGñºX3‰ ‹OO¯ 6“¸±8SLu2ÕÉT©:Su¦êL5˜j0Õ`ªÉT“©&R­RÅ‘j•Ê(ŽT«TFq¤Z¥2‰¤Z¥2Š3UaªÂT…© SU¦ªLU™ª1UcªÆT'SLu2ÕÉT©:Su¦L5˜j0ÕdªÉT“©&R­RÅ‘j•Ê$Þ‘j•Ê(ŽT«TFq¤Z¥2Š3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT'SLu2UgªÎT©S ¦L5˜j2Õdª‰T«TFq¤ª ©jGªÚ‘ªv¤ª©ê@ª:ª²nIY·¤¬[RÖ-)ë–”uKʺ%­ë‹‹fº¡–ôT*¯Ÿ–uòÂÆù!j6é~›«;”ÍíU;Öóžã™~,ŽOS[O¿½ŸÚz:úôýÍ÷“[O7üðéÁ{oÞžß~óéî|ô‡÷øöêòî‡Ûët¬ODü~ëÊÍÇx¿)¶ød\­‡\Ñì¶3nÛC8Š×oŸ,ž(^¿iHÜXøýÍ›ïºúëe­È}Ú"¬¯Ãz„Öl}¶y¾§‡é¾¢îlÜúêdËté;ãž2ÕFu(.,>Y…(ŽTkŸBGªµO!‰¤Zû¢8S¦*LU˜ª0UeªÊT•©S5¦j÷Ï–šçÄgcqañÉâ‰â>XÜXÚ0{P#o†™lkdݹöMœjdý\#ÿáåïÏ7üT¬‡&5g¹ËΞ‡ïÔÁµÃAt4®­­'Æë+k;ãözaŸ,ž(^‹ÖHÜXjõÂ(ÎT…© S¦*LU™ª2UeªÆT©Ö†H#2j2Ãϧk?$”ž($]{!´¡ttm„ÒŠÒÈ2‘e"ËD–I,«&ibY50HwbY%0I˪€IšXVLÒÈR¥ KA–Š,Y*²4diÈÒ¥!ˉ,'²œÈÒ‘¥#KG–,Y² d™È2‘eËêyIšXVË ÒXj'–Ú‰¥vb©ƒXê –:¥ KA–‚,Y*²TdY5o£õõ-@jËc¯k­õuÒÇÆU¯­·±wz°WìÚÎõgòTìŽÚ#ã7/ÿå|ðõ_?ÞÜÞ=<Þ-y×isdÖ';p¾S§Êè™1Ù°®e>>êãZöq¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜êdª“©N¦:™ª3UgªÎTƒ©S ¦šL5™j2ÕDªkÙgÄ‘êãZöçã©>®eŸGªkÙgÄ‘êãZöq¦*LU˜ª0UeªÊT•©S5¦jLÕ˜êdª“©N¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5‘êãZöq¤ú¸–ýùxGªkÙgÄ‘êãZöçã©>®eŸgª¬[RÖ-)ë–”uKʺ%eÝÒãZöùMããZ–Œ{XËnÆÙÜÖ²þtËÝ~X'ªõµ¼øK-{:8Ï–=ß¼=¿}ùáüöÿºýîúîöòöoç›þøÃÕíß6Ó¿9m¼©­µ¡lÜŠvi}ìU1æÛÆ)žîÎÙë[ëø~è_½R ©Ž†TGGª£#ÕãØ@| Õ1êHõ¸ë/ˆ S¦*LU™ª2UeªÆT©S5¦:™êdª“©:Su¦êL5˜j0Õ`ªÁT“©&SM¤* ©JCªÒªt¤*©JGªÒ‘ª ¤*©Ê`ªÂT…© SU¦ªLU™ª2UcªÆT©N¦:™êdªÎT©:Su¦L5˜j0ÕdªÉT©jCªÚª6¤ª ©jGªÚ‘ªv¤ª©ê@ª:˜ª0UaªÂT…©*SU¦jý0æÌŒ‘¤©~ÉÖoT 6ÎÑj•§î³ØLÇ'hO &9­4m‡y^iz<¸»¼ýÓÕÝÝåw§Êétã}Ÿô´7¨ííÍ[k.;rþtÜz¢#s¬/YN6nĘ́KËäθM­QÏx@¼žñ¸²¸£x=ã!qañÉâ‰âõŒ‡Ä™ª1ÕÉT'SLÕ™ª3UgªÎTƒ©S ¦šL5™j"ÕãŠPGªÇ¡$ŽT+BI©W„‚ø@ªÇ¡$ÎT…© S¦*LU™ª2UeªÆT©ÖËm3[_ŸÄsâµ"”Ä…Å'‹'Š×«i$n,(^¯¦‘¸²8SM¦šL5™j"ÕãŠPGªÇ¡ Þ‘êqE(‰#ÕãŠPGªÇ¡$ÎT…© S¦ªLU™ª2UcªÆT©SLu2ÕÉT©:Su¦L5˜j0Õ`ªÉT“©&R=®%q¤z\ â©W„’8R=®ñT+BIœ© S¦*LU™ª2UeªµxG×s¦NºÀÓô¼lÍ:êO+B­õ–{§{õiº›_?¬3Ïû €ãÑü¼ãñ¯¿¬]WWˆ®ã8¿yýþñ»>½¾½þx·i˜âc©Û·r½iwÆ¡e?MõCãì ¶> endobj 522 0 obj 8745 endobj 524 0 obj << /Length 525 0 R /Filter /FlateDecode >> stream xœÍYYsÛ8~ׯèòKb—LƒÏ½ªd›N”±¥D¢“™O¥( ¶8á!“”eýûm”(’•}™ÝØ.`£»ñu£ä¹§ÁŸsñ0m ~Ô{®æT0)0£šÒ PMÅ DP ,Ý‚P6^IõÊŠÙŠº,à[/îøÐûý$šQtX÷H‡yÉfÚû‚ÂuCa†eÛv¥+UTË"˜bà‹ÁÅ0¢pÔ[í#ò?×~_#¦Òÿ<õ.ÝÞÅ*÷±v•2Å4gÃÐÀRµÅ? n¿¿Ÿ>‡n’„§€û©ç¸ÕÖÊuÂy(þšJáAºFš_ö¼k7_Ï⟦°rgªãħ°2hõ¶¯zPù<HÅjoqÛ<R¥ðÖ0Î(VÃÙþéT1d+ ÙD±5U5©mR]³ñcúÔ+"‹f¢è¦bânðÀ¦‘…fØ(ˆ „òM×-…–¡˜Ú_RNZ[E'ªm¨m¥'Z3¥-®e<鈋ó¶¨xG~câmEv ‰V‰¨¥VS[uÚ²+mH©‘èrTtAùÖA`çw6X ·#`ˆˆJ©|î ή§_¿_o¿O?ß]×™À?¡¥'î­S … Uµ\y~7I&ë ~ß[e<-ÿ'÷s|,“4‡<‡uä9!x„|ÁÑ7<ño`æÍ‘ÒOÒyÖHuÅ*¢£mÎW©†\ ˆ„ÀM çYAÞ{³ßOnÆ“+#p&“ñäfaâÿ@uPc¥+éŠf!ü–m4€™8Ÿœ+ŸÇ‘©Ä.ò(ì2Ñt…•U´IÁ¤K¢kˆ¿03€í®T¦ŽëG¦Ý†VâNÉ>î)xËeø^$qaðƒÃÝœWŸ‡}X/6‰ßå•€+økñ¯Â0C ï…wš¬‹;Úq¾Š¢ Ì“u É*…¹—{3/ãÀ£e¾,†Éa%Æ‹ç[Ù^V™~Ó•f±î(m-|¤PSb(›!ƸÀÔ´¡F÷··ÂDßÝñ/έÔõ^BK¿gºvÈ4*–¨Ò£wž1Û|^%9îþ…§@ÐCxñ•N•ª]S©¹U Ÿâg/Z»Ll–E­-ñE¤’\K´B‚q—Lmg"|Œ²£A’1ÖÜZQSàrpõ‹€ƒÑ5üÛ™Œa:¾X–Á­ËE£­-6‚a’O0Î:un±fÀ 3ß¡CŸÂ·¡û±±?d:m¡që‘m¹Z¶Âh§”ƒNÎÌã)„Yj½ôñáÜÇ™M:ÖŽžù†FÚYä ¾i§ ڎ¡ÀÝ`tYõ7<™ƒ»áÈëáÍ3qFWB.÷›ƒµAebaòrs˜…a$î¯Q»ƒË”søÇÇé—ÛëËï“ñØý×…¨=ÓU|‘=‡9vψÀyš¬â9VDKgő˸8pko#‘÷C’웤¢îZd^Ä[zi%1,Óä)õ¢k?ß ÃLu­ÍÏà¼S'Iê×vd‡¸Kf´ƒ¬ O††£Áíß$ L³‰d󄈓#óË„”.™ÝŽ·‚lk\‰6:iÜ֕被e`Ä|Cv"æÜE³J† .‚s†u4⼈ÖëKÈ¢ Ÿql•òÔ‹³ÐËù\xŒ(LĪ®<&‹ºu{„ËE¡.ñ]+û ºoéß’•è wÍ^^pzâ1O MDDx PYìîRžñ8Ï`–䋲V/*þ®½Ä… fÓ€ýAŒlð½ ûeîò“‹ë'1Þê/¸îzâô û[†ÕX«ÁÕ±¥05›P¶Íë÷qƒ‹çT€ß¸å}²är».,‡ÃNÎ$•ÚŠ§¢ß6`{S¶¯„€í@„l7Bœ‚y½Ò«éJ D‹Þ¹¤3¦Š{!Ö(Ò 8[6Mˆ2‹a½DLF%lvz¿ª^7¢³Û>n–<ÅH·›˜Â`³•h9w“I½ òçíÐOöö-î² OR­ª¹O«,ï¶»”´ŽKì·A3BuÄ Ï§”Ga–ƒ`a—M¨`Ù–dy-?ØÓ¥8!»Ñ<À:Jlp ©ßù+÷W9¯'0r׃äqŸíUíLÅðùø|¹'ö±2@1ˆ“øü[c“Ž ~cö~4üµ5uçùãi=µÊxšõ»ö`´Æz!¶…µ™ ï#4ánÄ/‰ÈlÕð ©ÌâþPÜ$Q {E¹ÀßÙ*ç˜ææ!_´šjio±Ú©RÚ&Ü<œ*»¹ Çòw;(1/ß‹wtÔwQ1IDcax}ç(ùk~PyÆÞäPë–ì©×:'«úÒ™ª÷Ùþ—Ænb/Â(¹bÒZ‹Ø—wKYRæ‚M•Äm‡"TˆË !Šû·ÌÇ‚'/D¦4þá?þ? endstream endobj 523 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 524 0 R >> endobj 525 0 obj 2159 endobj 527 0 obj << /Length 528 0 R /Filter /FlateDecode >> stream xœÍVKÛ8 ¾ûWè8Ì(²äçq‹¶ƒ-ŠÝ ÐC§¯£$jmËãÇxóï—²KŽc´§¶yÀ$%’Ÿ>Ò´Ÿ=øÞ«KœR”—Þ³±ù(¦ˆEÆFÈqDT"£$a‚ µq&ª-Fd£ÕìÖÊ}ö* ïËWØ´C‡hðÈ"¸óèý Éó(IÓÔ`¥ØO•‚ᄼD›w%E¯å¸ûŒ^"¿½‹ˆùô@DÐÁ{µõ6oCä´ÝÛð)ÃqmKôåæñ¹ØJYÜ~EÛ÷Þ›­9šöSÍCá㱃f a@æ+NwMvk…€™¶ÓΠ– SPsU g1 Ò×UBL(Çù²<#S¿2ùz%bœÌ ù÷ó¦úÅ”-ª¨r¯†,zi{äèÝÇç¦=µ/'µáϽhxÉ«®Œ´ë}eÍN˜Ž·Žƒ°b%‡Iþַݤd“ô>{±JdÍÿ¼Á“âBnxVÌ»è*Þ\ƒ!ʺOÅwÖvý(”/']l‡DJ.XlóFÔcnêãÝhÍÛô²4À)SóÓO–QòÈ>8i¯ _EI ïela¼:YùL¸ÖºS-ªÃOöãÂ\tð*R SeÕûΦÿ,ªZkȪU>ˆªÿϪOP­¼pŽù1Ë?=>ÝZCßòÆ 6ˆ¢°š¨^äwîPqä¢Y”˜QÌ!ÄO˜Fûéñ¾­y.ö"W¾j@GȾŎé/Ìh£çYåh‹1<4Ù®p eVõYQœfNp›f;ײw8»{íÑ]•w3t¦ ŒÎx7Žaµ/X-9Âx¿{Qì6 Fƒàb÷a<ë°Ú<]ú4ªŠ&›³”…Bæã,•‰GªKÞv@bÖ Yá³ñÝþ,dÙ ·1Ô]xƒïéªj±ï&VÌŠ šœòêI3ŠC“ÕµîjûŸÚ~]ЩÞÄfÔ˜¹ÅBxŽ[ìF·Jë;ìyWœî¬©ßëniF($NÃ%ˆÃ”7 Ìþ©‘F#‚ý &„ùñ2ª…õ¤+o´ü˜UôŒ™›ºáoÜCVΖÚ]Oþ+þ—”íE±¬B”\VA¢ZBj4Hƒä ÖÈ’|õ–—À©¡~ô€ºîŒê¬;>ÝâÙKâÿiÕÆÕ endstream endobj 526 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 527 0 R >> endobj 528 0 obj 887 endobj 530 0 obj << /Type /Annot /Subtype /Link /Rect [ 200.544 445.067 322.568 454.067 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 81 0 R /H /I >> endobj 532 0 obj << /Length 533 0 R /Filter /FlateDecode >> stream xœÍËrÜ6ò®¯ÀÑVY ¾·’­Rlyã”I4®ÔVœ5ƒÑ0ác>$ëïÓ àŒÆ—ì:£@w£ÑOp¾\øÌƒ®ð¯$l½¿ø¢q>K bŠbæ'<öR¶gH£”•¸p2Ä%z(¬^MÀŽývQ]xì?¿ÿ‹6Ìã{ºðâDæîâ`Å<ˆÓ,Ë´¬‚ûiŠ,Ã`½g×ö‚½«ÕêAz$äýÏ¥·% |ñ!ʤî\ݺ€®®~2…ÞtÆ2‹o°ð_Ȇ‹˜ãT©oBÿÃ0R'£¿žD“²6ÏõªŽøO2÷ØÃÅ«‹ë÷ó=¶Ú/JÀðTdøG°Õžýþ*¯ÿ`«Ÿ.nWŽ5üÃ*sny{DÏó³Øg>XÀ„?9˜²¨,Ž<Ïó#:×Û]~èdÃg?¶_ÊÍ=[ɶcŸº¢,ºg:3jjAM ϲ”¦Dmµ“ì5» "ÐÈ+Ú|ý>›oôSz¨]ð{‡DÝ<ð’„w É@Äáî{§¨)ùú¯üÁk]W]^T­ÁäfXõû{ÐÆ×[3Fq¬]ÛÚZ÷˜7EÝÛ³}µîŠÚf3¡e+j“wù}ÞZY=•äq³¯«Ò…¥ÿ(œȶò nó½ìh࣡£7ú R´ /q‰¢A =½ŠÌãA°Rg·Å~]æmkÁÙ€÷íQyG³ygyc/F n,¸®, ]7Å¡k¹…ZÕÐôÕi)l¥>×½MzW÷¥Íx]ïE)§ôŽªÞcq * =/HcdýÈ•ÿ™7Gµž†ÎNÖå̓ìØSÑíØMÕ±¼Ú°Ÿ>UEÇÛIÁ}"uçSß…ËLOûn6lsI¼d)(ðÑ݆ûh( |o ª/Ž€Âwöq®Q›°ôštk&6E#×]Ý<¹é‘M4Šû¾“–,[¸i2+‚?t“ÝÕDÒöåVv6ç®|Ï[Ðô,·—¼ûÚ1%ƒÓ#ÕñHœ‰·`Âç‡CY¬s J¸ô·¢ÚÔO`×ë]^A|ìêéne;ÝóAþkL|ÏBßO0¡¯‡`˜kÐ*°œË ºKX˜€¼>8çRÕ•à#†æ÷,Œ³)ªD”M£dSšc–2Ü,YŽ< êÌyhÔP†:Ìǵ"äMïÖ;œº%æ§CS¯e‹™ ååa—ßËܰ97²qã²<ŠàXqªõ_J7±PÉ%¯ o6€¬Ô¨~²Öéìg]m±Þ¡M±ÝÊFVª•M!­Í i|÷ËG|éÕJn0:§€¹>ï–étö©Í~T *,‰Úb(¥«Ê$𩲓_;Ìä÷Ù+uzÜÖ{9Œ!0Âù)PjÆB=<4r[|UúЫ‡A ñ¨ÃXS~ó¼j»çr\¥Âx)•)ÄÊÐpm0|óOT ÍY˯0P¹qµ‘&3m4²íËŽéôz/]c^Æ=ø_{Ù¤Jˆ2%þ§ <^^úÜO¤¯4[ ¹ä°wÊbí«J¯€D'N| P¶ºt`…%dn†ûº±ó øåˆ×}hò½A<íŠõ΀º Ôª ¿$ o-ºäkz¬}M‹R=»þìä¼:‘ȹ…k.¶Ïì3Ùñàâ`mh -Ä%&¿ækØHn—·l#qսĻ.ë§Ï¯9{M ,C÷ysFž‡øÈ“4,çyœ4?$ EIË¢Q²)ͳ’®|‡‡FMsê’øà$†qF÷ªj3Œ¦µP}ŸŸÃ@| B¯–¶ú"ðk ül°Ÿ¨­æókƒª-fEåè)ðÒ™ž  y%ñ!:oŸ«õ®©+º]#óMëÖ÷D*!° Otþý,D4gKëÞRçÂJ«ÐãÑS“RüÕ•z>¸x¨ ÌvÛ‘ Âîß÷¼,'Y;ë>*–ЦW*9´ÙŠ!êßø‹ª'ËÓ%1ôSêE†²ßïË` Ô:©¬âókWÔú (ƒ³4IOŠê¬›’ÖO5£ÖNI«Z×g¨Áå®(Â.ÍÒtxæ0̯ßÇîg‘…˜›¹‡ˆ +@ý®Q 6àê€=ˆá[­0¨ÄŠ2¿/Qû=Þ'jîjèKù‰+ôcî¥`œIêŸÒ˜»ŽÊ‘@cñêú²½¼¡ú ã ÖjÓŽ }ÑSº«Ž°z“¥aavôô¹ÀÝNwA•aôÃÆ7ò!o6ДŠòÃ,¶Õ­áÿé'På!oòɹ,BôáaAkP–LµVÕªÏcÐïõЪü¥~.cayjp/‚îaÚÎAᣦšÚ EÍŠE¢d3ðt÷0pˆ‡ƒFM¨%i 6d€òýA@„ÄùòèîÍa#f|&2™‰=Kç-Éc#ÎпDÓ7,5j%]”ľ)÷ž¾EŽd¦ÂÌur´ÍC‹ Ý ‡ÚbÉ·oªçiøeWL6MÝ´nîX4 “ÄO âzñÉ@㬣@%êóÐåú»¦~jÿ­Â áÆpC  4$¦ñÝíÇÛ·«4‚`êìôZ¹¦3s%ÀøÙYóÞŽCËQ-îÖïx¨^£å2£‡âQ"뺯ºsâD Öeø£Å8‘š­Ô ´áÊþlð ?€å›qQ3Ÿ\&Ã7õ4Ëaölø|i†ˆ0g"¦\&xí™ÖºY,ø ÅÀj¨mÃ0“ð0—Á¾÷v¾A†d¦ ÂÌTq26¤÷ÃÄó ibƒqÇith nT£L+Zy"D@ÜáA$²,NƒS!Â]§ßºÃ KðëË^E ŽáAÃôÄLcýËLHЈáG щ œ[ãþ°¡÷~ «3¿1pÛÓs´ÞiñxaiukSÝàÓÏïnV·Ü >t6•!JâʹD º`tQà‰$Ð%'ÝEg„˜(ˆð\–…‹!& BÑô`èŠ<Ç"F<_ö$$—†šzô’4á|@ _³£0†¶Å‚Ï—F‡‡‰˜r™4âɽíu ²XðŠÕYXŸÊ Æ1Ž öý¸·ó 2$3ef¦ŠS!& ‡Z9ƒH !¦ÿN™è©¾¨]¬y,®k¦·ž :qÈ¡ØÈ’ØKNgÝð3Ÿ‚ޤ C  :[ÎJˆ!¶ EjÈüİôl@ݳDaskŸªÎ¸?tË{°Ù,-ºÛÒŽZLèV¨ÛZ’[14àFvô:¹ Ë$žéròá¥I1ÏüÆCtóf¿º#ÄÊžÕŸº5Ð ‘ù’úk¬…ÎC ~F"àÞÚ¹.»’›7³µ÷év¦Š(I/¯­-ôí‘Æ‡¶óލ¶4©møù[b”þe]25‚W;ºx‚Œ¬HÀ½Ex°‚†÷:‚Ú窃^'AFDèÇœ¾+hÐJ­„ ãÒ˜|Â-‘`"/,±Úá6 ´§&º~¨9¥-Æž7Ó¢õi•åìí¯·tÙêæ‡· uªP™µ¨ÈªSï-öG\ü… ËK|ÀÃg¢â¼Î>ö!â õCš¥tŠÓBL~d¡(KX$0`OÀ—³.‡ƒFM³×’4R¯H³d(‹LçË£“§ÃFÌøLd2”Î&+—ä±gè–ƒ·}ÃR£ì¼êJbß”{Oß"G2Ó aæ:9•ZcáñгLøÙZ¥“SU^Ò¿394õ¦_KÌ® Ÿðg’ã£Û‰¤CAÖ4J§Ð‰LÎ: ä×— ‡? ›QCöDWÓ}> endobj 533 0 obj 3548 endobj 535 0 obj << /Length 536 0 R /Filter /FlateDecode >> stream xœÍkoܸñûþ ~è'ph‰õŠÒܦu‘Kšìòár8È×VOµ¤ÍÚ(úß;|H¤(í®Œ×úæ ‡3Ãá¼Hùqå"þyÃ…1Ai¹zT8…yBѹ!œ•HPÁ GCN¢†žÀ*j < ¯«jå ¿®~ùˆ2ä`ŠŽ+gÂ\²Ù¬>ƒp`/ˆâ8VºìFáái‰nnK‚~¬u¯=gäüϵ75ò\ò ‘ƒîWÙ®nÞSä:h»Ó.F8 ÀÌAà£{$æ?mKôËÕßÚÇ"»C[Övèç./òîùÕ¯hû÷Õz«v)X?"ðoˆ…3&¨ïŒg Gð ÿùØ“8À`Ba;|ªPg«~ó‰~H…­äï“¶Q¬ŒÅöI £ý‘ÂÏŠ#ð Ûýë6Ùä¹lǾ놜4 õc˜lîW±àæ".&üš¡°ˆ`Âþ~‹QÁGJ§x¬¦Ž®­¢à •TL´š«žo?IH¯€” …&¼D"çD4S2æjÊÕøE–ô©l¾¼g Ž©â­¤ ˜^‹hFǰìËd†rÏb`ïxpãE#/§Ž k‡àÃàЉo^7n»&¯îݮՈüðúm>@m—t¬dUÒš æP‚ZøU0ÔÔGô…µ‡¢Û°±ÇCR ®FÝC힥ù.g™ S>$Á0Џ²®T}OŠ“„3ç ¶Ìã. #¹â!tÊxB¶E^A,€Á®ØSǪŒe¶1†möˆzßåu5€IÛ²¦k¸3˜mÖÖï¶øx`ÍóICÍ/¼Ï¿3-ì§ÉÒºê’\øòÊì=轆`ðBïP˜µÅCŠ:™(齎'ê˜Ù€þ*ýšZ1«Ws6¡ËQÔ>µ¹ût&v§z¸Ž‡]žŒC¥ˆë˜ˆåº¨Äa !–S!cBFòˆrF›â²i8yì+þ½Èe¦”‰&t”ׯçó"-±Ibbs¹&p°'bœ­O6ÓÀ…ÍÅ<%Eq 2üÌä¤éÊÌÂW†¾ÿ•QÌ›WÇñèKWÆ‘Ì_ÄQùëlª,!;æû…ÉRfÂöd*äÙJ„• ¯ªºcÀ(é·FAr]˜‰Oî®C£T¬iÂéMpAè¹ïO$øþ\˜ÑþÏ}ÞñzmáËõéÓ-†XrF:é •šLÊ9}LÄûp)Tñ×"j”š&š˜'5=§—èZV‘Û&粓ÐIzâμ©K†JÖ¶Éý¹¶òv¹º~t>n&t2nŽè§Ûn7£ðI“CËdÜtüŽ)âk’whW7¼ñ2Eu(ïXƒ ø—yQä-Ëê*[Rì eã¹è‚¬¦OL5²¥:cÍB4­&¸ Sr‡Z”Õ±ÏhÃoVüÌý¡O÷p4B,×§¿0Øbˆ%g¤“žPדrN±ä&ác×WüµH…Ý%&š˜'5=§—èZV‘Û&碋8¼¬ƒ€Ñu„ LJÿ$šm(—ÃŒxÐÀð²CûË|˜Médÿÿ†zØGBø¬?¾ÿôåÝú·ÍúóÏëïÖzæëÛÛíúËoßþ´w…Ö: T¤pgJ±«¡ÚÀ£y€xXÏsС> z#¶‘|/Â$T•yj.’5'MìC¤3ËìNÛØ÷-¢·\=Aˆ®ŽBŽÈ[«¤d(Ú—+ÁΙIZ\Óê4‡ÎËÄc8vyŽ äü3E§uýÔr«¼˜i¶ûy¶Ø@‚ÿ͘8„¨tX…Åœ3ºp£÷`'ÍýA´”U*3*ðŽ€¼öÜ–úÓíÓ'ÄÁAU4tÂåºæÌÕœ»Ã™µ†xéæuûtYŽC]o†ß.)Ú3ÊÄgŸ2ŒŒ³gs|`‰Í©»$/ ðPÂLâóH„£ÌxAYú¥uY&U†šC-ûŽR'Ûp´~‚øâ’J‘>ßÏVz˜ª‡ª3¥J—f!*ˆ .¨d@ø Á¸’MD´1íÕˆ}LçTZVÝmÖ¤ç=R ¦}Õcœ)Ul(CjlB€£²­%™öžZ{¡ÌÐÚ¢ÄÄ“'í¹ 1C¡F»$Ô%š‡¡{[ˆâ默 Q(ùþÞj·€¢>²&MZÅ:¨’-Ö˜jÓ$œ±ï¬¨÷¼ƒº6øVz|Øïm¶©9gLôm¨„Tç®XêaÿPßoQ]Të1{J‹CfðŸË‘kÙOñó|M]€4¦›TÐQàØTùýx€¹8 ¨v]±`ûºé.‹º+êô÷Ö KôÜCò]¯ºcÂHP–È Eº‡ú0Úú02È/õ–>UéLŸíÅžm:Ð:­ÁâI‹„Ê?Xv-z-õˆ;œ;Ãò M{à1pø¥X’¤xÈ#LV}—Z*lËøçû +v¯q÷Ô¡]-$’ ç¾y_úû·¡ºy–o@R {JÊ}1|Ý1…z¡%´¿P®6]">Ù‹ûvÅŸød†çŸþÕå&:Ðâß§Ÿ«]þð]®G¼Z‰2yÖÀ¡mrÊ+=–iË`!sV«1ß®Šüw6¿Z¼ó]›ðÑ‚¡kÿö kÌ­!‹=í¡7D©û½›ÖNp}¬ºé!ùv^äæ¼FY}¬†¯,…k'FïáÔÕq__êĹù}IñÃq7ðÆ-‚§«’¬_J–DƒGÆ!ß°4b¹Bª_˜ˆ!–œ‘Nz¢DrG&)·ÈD#±ÄD@Ïÿ<@ˆè¥¨^[v¯y`öùØÚ]TƶŽBÙÆ9Ù_€;‡.ùw8ߋ̇t身úˆ¦ùBý½Ò ½ï endstream endobj 534 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 535 0 R >> endobj 536 0 obj 2502 endobj 538 0 obj << /URI (distro_baseurl_DEFAULTVAL/guide/index.html) /S /URI >> endobj 539 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.36 164.46 283.06 173.46 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 538 0 R /H /I >> endobj 541 0 obj << /Type /Annot /Subtype /Link /Rect [ 291.39 164.46 489.99 173.46 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 538 0 R /H /I >> endobj 542 0 obj << /Length 543 0 R /Filter /FlateDecode >> stream xœÍksܸí»?ÜLs­­è±ÒjÓOÎÛwN2‰7ÍÜ\37òŠëU#‰=¼ñ¿/@@$%í&í—kó2’xA*_ÏáÃï ü±\…bS}eZ –¡ˆ&ʼn–^â§¢Œ¤q*Jœ8q ƒ‘¦òlBvâÓY}æ‹Wg¿†I¹ð½XÎüsbssö„lj%éjµb]C/HSy ›J<¾ªBñ\éÙƒöÈÈÿŸkïjáÿ…F¨“Þs½ë!üYzzëGñÂ8aaè– ^D4 xa Âq¨äàŸ80€±¶Œ~ž´„Y9‹§~Õ&þ™Â}qwöt}öøe,_¬·6‹–P¼4\á¯P¬+ñû£dñóg±þåìÅz ²Ëf»ˆ²}âç«$ ‰0¦#j•ľï1Ùõl—í;ÙˆÈϳ.»ÍZ)Þduv'2Ýôøe€V.&Ì’À³˜™½ld.ÖªoÛâ\¬wR¼¾y-žË{Yª}%ëN¼jT¿'Æ£¢å…K¬ QDŒž–YQKqSTûVÕ?æ¥ô'ê­V Ø.Y½Ÿ>Èû¢-TýD,VþBü4S$‚ɚР?½ðaü'Aò$ ÿæ¾?8gìvôyN}¾½4?-b¦§M!·âªî•÷›4r}=‹G`‘¬ z‚ƒâ€Y G~†ApÝJ<2[gI¼‰¥SªtТuÌ[ðzé²zõñÊÁò¹¬¯½lNK:Ý®‘.£¼h÷eæ²R[wöÈhP£”­çPžª‘ ËOëù§ÁÄ“YãšPWÃG7Ÿ®Þ¾rð{Ù`Ä´‰Tb„U06œÑ¬q³û¬(Qg—6~PÍw°¬TÛ9„"‡¸/6YY>xy=Ò¬žëïP6eÖºæÔYå./Ú¹ÏVÑÄgª¹óví×2¿õú®(½!þ8èþü‚껇àÁµ„±bç†ðž7‡¢¾óÌìõϬýxbÅ.kE¥`¹…rƒE¥Ý.«ª~d^ÞœYx"!ãÀKÍâl(€îÜenj¥²YL„Mæ0ºu×Ê}©dn)YëÀΪléÝY¼pÇæ:´²ñ«\i•²Øëõ›k‹m‹ÒÑkHþA¹+ÓŒ”Õ­Ìs0ez" ¨YE½){,h›kUò¢‘›N5G¶*™îû§Ô&CëÙ¢¢‘Q!Õ·Žj×M ·]Öt2?·”Ì‚y‘•ê®wxAâ‚O-þ zGeaˆDWäHÅ_ž?}æi ˆ/G®¬o]>\mÙC€‚ãP¶ª™{o¹œx”‰V¸µ<x£êZêÃÌ3´KåÚ_äêPÊ­úvnõÃ^ZLm·3Ý7²ÕKè}VöÒŽ‚Öfß "Ñ5%ã ']Ïõ–Ū}_fvpÈιÒi1õ”VoDêcŠaÐBØÌ<ê è»z#˜ƒÁ]voÈ­,Á»”߈SFkæ¬xÛ(w; U„]÷k{*±Ý©¾42d^t–›Q¼7óAäO³˜â9ÅvöQ»—›bû` †"¹ìàdl- ä±™NzòÔÆÂYíHÈrP‚1+-m^MWHG–«&¦„gÑß¿hÏhþeë¬4 {DiÌÁáÍç ¦‡¬IÐ[¹ÅSjS›/CŠ*ß»_ÅmßuÇŽ§(šf-OPjc7S É©UD0¥ŠP ‚µÇl)@™îˆ€|í@UË€²l>ñˆ.®,ê ¾U}wL‹*û"=ƒýæ,§ÓÒHµH¶ÙÈvÞéD‹i&óNú^0Ñ•H…·}×7vr ü±qô e­ì '¶F²ï `Gž‚‰´ÉÚ!¦j¹Ü3ƒ¿u×@E°0EœÑ‹#oî¯dšõÜç¤ÞÒö6h50‡­%¼•ß:g]QÉ\Æ"š{Î…êÞ0ª¯|Ha9*¬¹‚hÙeYrc¥)äïŸ?eé§eî«å4ÁYE¢RÞ Â(]Ɉ=!£EG¹EÇÞá)œ‰ž% ýa\ý‡ÙxÊ8¢Ç žŸÐ£¨óâ¾Èû¬œ v˜5γ/.—û¹Ói'­,ì^Sd°ipœ-Zø':õ(ÆëN[±w }V6¡0µxÍQJ »,GÅœ( ±] á¼s®›RfÍhÝ ‰& u·œHWÛòY}¦Jå|d³øyë¾g­û·¢åû¸Õ/"l‹F÷XÃ0Ç¡…¹“!„OŒdš¯D!ïš™vÀ˜@(õëcμ£-6|u§ÀØP™wöŵÓeâtÂs—EÓ*€á¨-`¹·Õnwzc0‰§Çûj\ñVjïÄÁµ¶7öŠ­Á¸¿$´Fë/ZY·Ð99#üªÁH±·ëeiv!‡]±ÙYŒ $!³Ö¬ÑÖ€˜ÌZéf‹Yï¬2•ê[Gé¾i•e±W–swÍ^Ï^ k.Û-µ“Ð9žøç£Ë¶í+ÜÜn—uµÊUý—NÀù^‹58|Ð ¸¤ˆ¾Î™Ñktr9²[³ç~¼tµ°--Ôí¿(%å2Bt…dºÃÃ<€ã'ÂM½!”¼ÌL”›âng¥êߪt\,Yš‹)N€‰ø„$!cæáÏÞs†§1·wò¬×Ú‘\Yxx elxCÒÝ-׫û#$p›K„õõÍ…¬7ÍÞ/ÐD^RX<(æYôF:Jw®ÀÍ•e»QŸò`î‘øXçw A"kT|Ãß``“µ ñzü&%>üJ‚#¬æÓ#/ýÎô×pÆùˆOC¯úbÖª†~êÅ1,ZÆÉ 0ýüÿfzô]î¿ÏæCñÆoC«hud>´‘]£þÀˆê›òç/^^~¼^ÿãòúñšöBY~óv]5=ø) ùúat„ïgó¹ïëY”ТháÅèYýí Ê‘V$üézAŸ®õ‡·¥ÆßÊâ…ˆáê¿dœÅÞ™^ºZAŠ@Fq„ß“àß8M¼h_¤@eð˜/ '·øA=„‹l -qJ£•>çF¤I.‡RŒ9žüüḚ̀qÂ܆û3©ÃÜ$JÆŠ !:©Ù MWx„8à*ã TB›2š >˜©2"|Ï)81^Í ÇN™ e5F{3ÝŠ©Z§µXNüA¤™;Ná†xLü¥—@8¦áŠãñŠNpÛ! 76„ú–**ÂǾÌðWjß5\`Îg<¹Ô ]>äN„sl{#^wbÞìÔÁÆ@ÕÃ?Iq´ªÇØJj5¾a„`c bÄ¿>éçRm‚Ø÷4|{N¦î RˆÏpéûñì=·WºIøÃ³–yoEhüî|d7£0òüªŸµØc>ü0æ£ éAÞŒ±ØñN;ì;uÄÓQ0‘‹ëE¿õ! ²{íMSÜÚO7ú>ÝŽnJú¿W¼?û7·.Ñ6 endstream endobj 540 0 obj [ 539 0 R 541 0 R ] endobj 537 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 540 0 R /Contents 542 0 R >> endobj 543 0 obj 2779 endobj 545 0 obj << /Type /Annot /Subtype /Link /Rect [ 417.848 249.9 539.998 258.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 81 0 R /H /I >> endobj 547 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.06 237.9 460.96 246.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 220 0 R /H /I >> endobj 548 0 obj << /Length 549 0 R /Filter /FlateDecode >> stream xœÍÙ’Ü6î}¾BokWMkt>âݤ²[Ùx¶R©8šnö´bmI=ãùûP<¤nw^²k;$$.j¾Ü„^7ø#/#oÛÞ|aZèå‘gLJ3/Ìý,(¼Öc¤H ¯Á‰ˆSŒ%•grð~¹énïï7¿ý“v^à§ÞóM°`Nl>Þü„§™gEY–¬kä‡E"b?`Ûzwß·‘÷¾—³•öÈ(øŸkoj‡ÑÿF÷xóöþæîCê…w¿×W ý83ç°¤ðã¨Ä?‘wßz¿½z_MÕC5 ïŸUW=ŠáõïÞý7ßÝóåzy‰"ø—ûò&YiØ#Æ-›éš ÿ%~L4 øQ {Á¡†–â€Si(úyÖ0ÌÊXì“´Ø_)üü‰ä1PüÂ:‰,5lo_®¿Ød‹SDÙñ Â2 ½7Û(¬Á’ÔË2‚0§}½9M½7 BlNÇ]5 Ú%ÚfÅ0—~Šv)ò‚Ö¿}ñ^ƒ@çW;±¯NÍt;¦ƒ˜áþá±ôHœ‘º[]Òˆ½^p¬:Ñèã b?ˆñ v3åù 4×þ4Ãâ«Øž&-àýûEõö0cm¥·Ev14ìGw[£?¾ß›¢Éš†ýÒб_5 ³Mûpë4\iplúgubzî‡ÏƪAÃG1ìû¡­º­ØlUÓˆîQš†Çzw«‘ÓhÈ&Ë3òT CâñºlØäÆZ:MÆZÑ4VO¢5fö|:sž±£ýÞר¯+vÌbÇŽÏuÓxž|'`à w‡›Â½üÌKE¥~R-ñ$†oª[œYM^–窛p¹Ú$²Àeþìÿ_nâŒ4‘?Côð¨ æœ˜QN”.˜Ct°\(M¼¢ð“2ÌRÒý_½ò;à3ý¢LBp]Š(Ncthø™ø˜'ÊÂKÂÌKr?% nÐóu—®Œµõ’¬´( R .g1=Šã"q3EU ®@53L v@RÎ:„Ièg&á -U´ä9ìMMŒÖ“»°¦ÂîŠX„KöÀ‰e¼•¸™4×PѪæ™8gà*u^‡Ü6Q¶8Ÿåà&†PË–¹þ]Wíß„íz1j¬ë'T°¼­¦z ‘çE“Ç0žÔ4¡èjð£Á’Tù3S8ÞÞjJmˆï;SªÊ sL N,A3D©cÊ›,ò3ÐþôÐ’Â)m0¢ò£”8™3ãævˆb¤¦|zuÙñq¨žj ñD1G+ nûö8ômm²€T!d2TMuSO/+&ˆsÇU·óŒlò鵯J»ÒX/3²¯a¤a¬/–¼Þ»¾ë`Óuß}£ÖK¨Œ1²†3ù•Ž%J (\_m«ÎÀT2ã±¾µw›¦îLòø\O[¾LâŒÄã§ã‘®ÐÌG)këNZ©¾A–©_!/–ª¶rRÆ¥VŸ^‰ñÓë[{^g£‹<±c#[ãKüW»ºjúG?×ÝŽG L»¾zËá§œÏÆ6›ƒhŽgý,žfw:ßO=°O¢«õ*¥e£bÄ]Žùêë½lnªæ¹z=Ù?BÒ¡îf¬ ÿ™k“j»íOÝt¶Ý‰#0꣞ão´;Q™R¿SF¼ƒ_ª¡ƒÍ_ÑòÄA¨Î{ž´\ëyÀÓõ• ÛcèFŒdmá—ê|äT¤ æEºâ)kŠd`-ŒD‘R$ üÜ"\¡ »è‚ä°”ÑÜuXSÑ ULÂE£ÀÄ2eÞJÜL²šŸ5̳qÂUëbûcÙƒI®9.ö?q8Uï¨0K2¿Äg s2"d³9Vã^´Ó4*â4Ni`î‘x¢ØžákÂwø y’ª÷ÂUkÒiØ,mÇuy¢ƒjÁˆ4çÏeíÇ‘c®‰¡†ѰóA£PÉ£1ÚiX½ IÛ‘T2¾&Ý›ãЫ€2­&Ô£½‚ÐŽ_®h|¯aU\+4RiÐ|'c®V-O:›;}˜ªz¥=Œ“dÙR™•ã;ŸYÔHžŒ¯QÞ7!?¿Óð‡º1FF­Ä×c šÂm4!ªG%ªÎä4iätÔðÜž›Ê+£r05ô'·¬FS¤™c ê˜ðîVÞì° ÊFdi?Ñ=ÆEæt`54Ö7Æ$ ä÷“"Ks»a t·PS£`uiƒÅý̾ 1Ý5I&Ò¹Yüa†àÞOìÌß”`´’šÄ—2PBtoÚó­¡ñ!ƽ»`‘(r,rU÷d”ØéÅn!.}8 ˆ©A¾Âp³9 M½;[Â!¬NJ,°WVÏÒuøLõ+ºi¦÷ù)²´òçQõ Br¦zÊÇ—™`Œ=¢šflo¨v;ÓlMu궇¥µãÄÙžz ÏzwÇ`¢øÍ·Êe„æ “à§–ñóÔ}…ó=GPE‚DÇdŽ Fla Rð^k#*­ ¥@©Èa^g½cáf¨dœu–obKë@"²­ƒl§¦À ŽûËEJ 8QÆGeyüÉIš~«É<ÆÈ¼ï„°KÑ,åTƈ.»E˜&~A±‘EñŠž»‡–n£?lÏ÷ÑQv‰‡¡‘±#u;ô­iz€Óôfñýîv´o'©_$yY†erQźJ/ˆãAY®¬3MûÁ2í›*|!¶é£˜NÇåñç¥ÃYgÉ0s’$(G,‡@Êš, B°’‰dÇdE3xñ›#â«æŒ×ÈŸ1ù H %k‚«fÔ¼†“âÚJÚ åß XZâü2ˆBeRe®,ûø¥¹ïûÆ])7Ã}½˜¢€‚f†Éšv·¦µ»U;P¤"xôÃò·V‚À6jp|W|’ÈÂXEÏÕï8>?´‘G$roƒ‡|&·ð+Þéq~’.d$éÊûãš>XêÑÓ1ë„È"\¯G¿…˜È‘c餸ã5-²ÐÈ$\c"˜ÇF"´T&YŸ2V´1Ì=W»k>kXÖa’kœ _7²(ôcüº <]Xùec³=zwÇj:ÜMýþ(zíù^ൢ½P‡dIì‡ø /)tß×ÝÊ_ê’žÎ1ÜcáGèÑ=¨(å/vÉßæ‚Òzôd­Îîª+ü-Êÿ”Þ„E endstream endobj 546 0 obj [ 545 0 R 547 0 R ] endobj 544 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 546 0 R /Contents 548 0 R >> endobj 549 0 obj 3175 endobj 551 0 obj << /Type /Annot /Subtype /Link /Rect [ 491.842 611.268 540.0 620.268 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 538 0 R /H /I >> endobj 553 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 599.268 120.32 608.268 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 538 0 R /H /I >> endobj 554 0 obj << /Type /Annot /Subtype /Link /Rect [ 128.65 599.268 327.25 608.268 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 538 0 R /H /I >> endobj 555 0 obj << /Length 556 0 R /Filter /FlateDecode >> stream xœÍisÛ6ö»öS’ o²3ûÁ®ê&·“Fö“Ét ’˜„ÂÊ÷×ïÃA"i'énšÔxàûñøË…‡ü·?’ÌGyuñEïy(ñQë­(F^‚c’¢ i RT ij¥@ÑË@îjlÐ?.ê ‚~¾øð¶ˆà.È„¸"³¾ø ˜G1â4Ë2-«½4,Ã"¯ÐòM壗؃ô‚ùŸKïJxþÿDí/®ï.–7òºÛÙH=0sGRø™øã£» }x¹¢ÝЖ¡_hM÷¬yõݽ½øéN«(ÏË òáo‚e$}ˆBrþʼn2³owá_ˆµ;Ø@ñ©ÔŽÕ?ŇaIC©ŸOF“rÝ$-ög2Ú#I;8=óD;¶?®?Ùd/ ÞDÑ#^{¨ÑŠé™bp$ÂA–B¼Déußõu†ò¾iXÝ¡!ætȵèTtDkÄËíÅ Æ™¤EŠâëõo·«k´-Ú®)6}Wð«SÂâ3æ&(ö0 c* »CÑ¢W(ΰ‡^ž³mß0³s*ÊÒ´,ùÉ@}+D ¾³hfU²=Í ø@ƹ3Z•ì¸ËÆ`î°°é°®™•pÇhÊÌ éžûOLŸ`¶2G¬ƒô_¼‡ã‹4ĉ1’†hÙr íYgÅTJR XÓè )êܱõ—òŽóò/vG»PC®ùxóÙÁØñÆ2x¸óuÏE˜pCóÏŽ$Žf†$ ÷Ñ*îhZ2Úv—;¦ÑÈŽ í†nÊGTõùíhº6Sû{$ÆQìeYÆCÜ2p)ÀƒE Zô¹¸­Ù¤mÛW§;Hð(ý§ñ‹”Ó#ˆcaéµlúºV¦ÑÇj³¼ª-åM_”[lÀ5s%°ëkæ’»:Y½-¾Î±vŽlzNCŸx$š±Ò“§|g)ÉÒ$zöØëÇ#kàjN⥣3÷ÐÏ}±ec^N=‘ßãlæcCaþ~ìˆ ‘(8Tç)Åo¯ÖëwWw¯Ÿ¾7Р>C`&@J\’¥Ù0#@.y!Û;¨=±Ê÷zyÿë›Zˆ}¥ÕQv>zC¥!¶¼b¾}tàò;”Uo¨Ö*Å »^Œ‚d}Ò­§¦/¦!—JÑXPŽHTåjjŽ487ÇVs¼Dà΃¾ê±ëo»= _JY¨¼‹°>ËB]JlæR‚!Á{‰³ÄBp¼Eädp»½„… ŒlP¿äl Uí`œ\x0s $O!U(.v·J±å*Ñ9a3ÉSèh 5<‚xÂCo /Oænà'8Û×òˆÐÝø ’þ ÄÇ•ÉùP!©Ñª¸ác‰Î6¾ÃD?Ž5 ËUo âŒykiÎ6öÏXºo 3¶ŽÚšÇ<¤dhüÜÃ?ÀÓQvùÛòH»Ã²ãËóô÷Ãòwz¹á›eõq¾ÌK™Xûòo›¥ ÿeYl–Ç=þ´ÝäM™._¨m™à›&š/û mV‡FÉÍ=Í@D «…©>ò‰>PÄ›=Vb)álrX, 5/¶Hþxë8™}  EL2i2´Èsä!@¿£Xɺo¼¤IŒAg˜eÓg¾BaˆCP[³Ôï¨íRrÅVO j;x*·j²]ZŒ×w¿Ü^èíú]k!ÑàÚR¢'Uâ¤+ñ„²²Œ+Ý¥kfþÖDøÔõizn4=¤x‰8 ›µlUÅW€ÊÄ´+Jù¤£ ýö¢€=Ͳä·—fGÍ@z݉i ³ddñÒßòœµ­sìÑJÅÕ iyÅc…%qN+ŠpÇB…€X ÌÌ ¿£ô‹…ÁAB#ºY^µœ“A‚S]`ü£a7¨¹ó¥…ö×9¨ž„ÔZûÄ@`üòÑ9 ®q¾¶ƒFd’Q6'¯Ýó'êªiPkÝå tÅ‹XÛ©‘t¡u¶ZÎ÷G–ƒK¸¹K¾ÃjKiC+ÖÙG¿å (þ讇a‚#1±dIòÌe×4ßšOöuDÖ›& dº™9ö¾¿-dá êýû[ÄwУˆvéÉYL}Ç9¯k˜nÄ„ˆÖ00‚`´ìÙLlePfÄk°ï[VMñ0y|RŒ‘…à0KгáÁr€¨ H)ØŒúfG…9ìªq†…]P+çì(=ÝÛѾTmª%ódÃzF$8×Ó©K[iüvuý£k¦¹ "ö§”¦ˆü'±Oü`x¹QÐÎ9`Š+ŸÜjˆ5$žtÿ»XˆÂûIJ¼hx¹’¼ƒ†àÄ›íŒ4ü÷ ƒŒ—õ߬ዒÕ{èÉ[‰5#lœ@_º¯oó«èMQv³¦›à¯ŠöXB"’©‰o> ¹v ¯œ.51߉<¦?×ô¡ØSH›ß4ešÙß3ª*Gw3BMÐn9ÿ¼€2µØ1V~‹K,qei:ä$‘·×rˆÙiÊpzâJ¸E¦ûV Âm]s^2¨3ÞÙA÷2'L¹FSñ¶©§e ýží` :ÌH2A—’4 _ÞUÏùŇ´ lüa·Ä†…V«[ @«Rìô ×Úí-äiùÀfv ‡‚ø—…`Ä´@Ϋ \5y)ÚAûs®Ý3íã\ýËæÿ‡îq endstream endobj 552 0 obj [ 551 0 R 553 0 R 554 0 R ] endobj 550 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 552 0 R /Contents 555 0 R >> endobj 556 0 obj 2558 endobj 558 0 obj << /Length 559 0 R /Filter /FlateDecode >> stream xœÍ”Ár›0†ï<Å“C ˆkêÖÓÎôК™’d,Z@]¿}%¡8`ðLÚé$Áx$­~í~ÚÝa縀ÕïFaäAR8;ks!ô€Öäà†(À ° êSȵp0Õ;%ÆjÕÝ"…Né`X8÷J´Œ|88xä¼s³t¾©à~€H@£(²¬r)Õ! Ô$)àösáÁ\õ½v„ßœ¾OD\ïaØ:w±sûÉC¼ynê"‚UšCu„"âEúñ .àþjζb’ÃWV²-¯¯!þâ|ŒíÍyÓDžzCd:i°áÏðp§×e'û³Uýgˆt6eAž¯î¢·r[X;ê§©oÕc]õŸ—Édì5ƒ_®HH”ÑA%‚°—ûas½rÊFUÔ±/_šJ¦âð]>ˆ¶ldw«“:šäK%‡²-V¼±Z$d%p–¤ º3çzÕ¤Äê'O(Ù>Û²FÔî„È9+aÏò–#˜ó kóFB#`ÃrÉÑYt OÀ.2Ö&`GzC+²áEG'ÿ'žï!B0Æ.%=¼$囀© ܉£Plyö‹ƒ4¶hØ¿mêv‚3œE®¹T'u¶cŽÄs×òúÝ9“ÃE›ÁV9€‡+&AT•|­Ô^•3eþ»y¸þÜ(˜Hk¬¼ÄY5‘בܧ<¯ {^ßh—bØéèÔe endstream endobj 557 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 558 0 R >> endobj 559 0 obj 541 endobj 561 0 obj << /Length 562 0 R /Filter /FlateDecode >> stream xœÍkÛ¸ñ»?Ф]+zX²’ìn.‡K¯Ùu·÷–i›‰$:¢´ß!‡/IÞýrm^;3çÅáŒò}–~ÏÕå:%e=ûnh Y¦$+ )/H²ŒŠxEjbU¾"•b€ŠÅ€™¦nDŽäˬ™Åäýì÷?€iGâ('³x"ÅÜÎ>ÁáyeÅj½^]Ó(Y­ÔYTPÖäÕ‡:%—Bs[í• ø®}¨Q–¤ÿ)tÌuÔSø³Œtè ù"®iáèž Q†4 Di‡«¥ÊDÂüT ̵eøóYKŒ¨`óدÚÄ?óð˜fo7³W×9Ib²Ùû[´Ì€­Òµú•’MM~Q¬^þA6¿Ì®6“lø“]6‰¢:;Fyq².ÒÃ2’&ÃtF­‹<Žã$G»Þé©c-YDdÓÒFîÞQ¡µÊG¯®eâb$©H"ðHʤë–í`k/%¿ ›##?ß~ú•\²{V‰SÍšŽ¼oEBÁZh<¹J£e²X¯‹l"ºa÷\rѼ&‹u¼ ?áæ`Ëz1Ú’ÆI:Wó¼¿NŠ×Yú·8‰ckÏÐMÊGÉjì£4‹òJÕ*IPèÛ–³=ùÐt­Øõe …î™äºE«(VÅÎéåœû’$QB^([˜K Q ¼ÿüÁ‚§VZZ[t/œŒÎÈlys°4åsÊòÈj'‘6; îhçÈûV8Ñ¢aüåòí;'GôméV:á%ŠîÈÚÈ=àƒó&ÑJŠxä–“o¨r))iC¶ŒìølRù¢ôÜRÉk¼a’€éÓU 7!’ÖðkïA§éÑ\ÏFd¾,àÒÙ˜ìA´ß¤GyãáîAxÄkäHµ»"_ò–•Áz79º¦¼éàop õ`)š†é¼ d*l!sñ²‚tä­¶ÞáSÁmúÈlMcHCÖBêÕÒâÊã4æD–pÙ×' "nàlѺmÊKæN.oîÅ7æöˆ¦ôçˆñ‰g”1É­a“Ücï ¡T·¯c“Á+6ñT#OÝi£ï^^¨} õ°ªÑåЧ8°Æmõˆµ1kÓF«¶aÅŸ9o =¸Žxgcu÷2òÔ/Ó 1dc†³9ðãrêÏd\/OÞ‘-XŠ×ô#´y"å‘6¸ð@sµAl¿ª»µc{Þpe…$Jí´SË¡dw«Re\y £íuÓJ‘.ÆEÊX :®\Õ°OhÄõ½w˜ªgÞz&É:ßsê`ŒŠÙ*ê:<¨â_|À0 2÷Lw/æóNBG·ÛckãëyOÚ{‘#¼© 1P™/øS¨æÔeù³ÅU×TSÙ%¸¼ƒ«­ Pñ{ŒÄ±eŒ ótz+⥠ðGÚÐkÿ"µ,I •èÏDm9®]Ìò$ÎУa 5ħ•8ô!­*ñ “è ¯‘A$½·vƒ!Ìp¯¡(|ºÏ³ŸÕox6mŠnEß=§™º1Q€ÿ{ 3Ðcú¤«q£eɤ²&Ku µGx ;’¸÷}×·žlió )(®;¿!†›´Õo¢æ&XD Ɣɩ².¯,Áä—g†,óÊÝ2Š™:j=®\ôtbÍŽ?ª¶dœÄD¥ÀŽÁK‰l²?ðžËÇ­xœ¦x–Ž Ó5™'п€¶GbO"ÐÌaA·cØì ¢Ÿ_áÀJ4‡`Ç n¯C@y ¢w¶Ýýzܧ)ÜÏ &¬(ÎXr”ß«Ý6úJ[+aÒU§«Jˆœ˜ìcª#¼íyµûï´Î aÍpf’¦ÏjÝw¼ú¡æ‹ÅâGRœ½„ÄŸ†=W¥úè7í+aI÷¿ üs¡ž8´–P ViGxSV½*±ÃÚ¬œ«·gò/—Ø/¦Ã‰£¥ªU¥òXÏ"Hª!Óçê%¾p¤°ëF‚iº56™šp{õëÕ»Cÿê ë›ß>:äï zÅþáðï=ƒ‰ÍK^K¨ï6a%ÁïàÍY.ì§ž)ÆÕÒ¶'X„S}áŽØä"VÓ'tªÁqõ º¯6Sü &E¸¶óEÎPÌècƒgdY(Ì6Èω MQsþåÛ‹PÖÀRŸºl9®›5«E«œ’¦úý<Š^_WDu… ½‡ò©Âå(ø°"Œ† MN_u^$ëd°ÏRÃü æÅ˜J1Ù9 öXT‹e  "éHÀšz†óòóÇyÌ8‘›«ÛÍo7Wž ‡¬ cñ›ÕôãQ3˜3E †6=ð>y ŽæÏhˆ% S`ÇÔ÷àÀ>@“o…6X¹¾êöëƒÆÜ·ŽKÄÞ|fBÜOÿŽd>‡äîC›‘>ÛHzãAÖ¾¯<®JX€Éó⇚Ú\ 4š¼º†â>rxšdЗƒG«§© —ãÂî¦k'[Qð_Ÿfÿa:èt endstream endobj 560 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 561 0 R >> endobj 562 0 obj 2180 endobj 564 0 obj << /Type /Annot /Subtype /Link /Rect [ 505.311 555.66 540.004 564.66 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 220 0 R /H /I >> endobj 566 0 obj << /Length 567 0 R /Filter /FlateDecode >> stream xœÍZYsÜ6~ׯàÛÚ) æ‚äÃVJÖ‘(‘,YšÄ»¥TÔ£á†ÇˆäXVU~ü6Ð^9»•Ý5øš@£ûC7Ðõ´ç9.ü{ ~¢Äw–ÅÞ“’yNä;S¢9^D˜;…£@ÆN.:öš¢‹jRªz#X;ŸöÊ=×ùnï—_¡Óƒã’ÐyÞsGÊQÍÍÞG˜ç :/({wê ùr Qj=7Rj§Z …§YΚΚ¬*³UMÐÑ’˜ç1Uj´Eo å²LC°P7?kK;IZó®Ý®M»àËuZfQ³møƒéZuÍeU®²Ç­¥ghÏ=_§Ÿ³ª&äŸÕÖŒOË®gMkLË MÒA]J¨ˆAŸÅcfÞÎI…f ‹‡t9?»˜µ/¦c¥‹”0‘ØV‰@¸Îö@‡"+)Q “rª³Rn ^tD÷ܶÀ´Á=–U¾-,ý<ÏŠ¬åµe Jì±2žGY/„>MÊ„À‡âÞ2qg‚iÇ¡cØu1p±¶žeåÁ¦®ë´0²5Ï7ÖÔi9¯Ö ub(ëÀ²"+­ÎÏz£Äζ VŠëI¬­l,ûoßœ•cþüá!)æX¦ ìllÓJr1*ð'T¼2ÊåI&´ÐЛвAÐØpî³´Ç£PŒu%ØìÆáM™x{ûåÛùí!˜"†ŒÉ ]â1ÑÇS}Þó&{àXª@‡½ ²ìÔ +<÷-a—y §}”7•!šê?Ônɺ‚Fa`ÒÖ^¦E¯û=ÌL«Td­­!µÚ9Þ*¿õSµ…v®Ydþ€Åf×Y*²2°K’F fךÅ$J(j«_ðˆî§§EWv[P ‡TÀØ„¦?ŸÏ§è;Æ’?œÛG¤Àî}õÜ4Ú1TÏœu+¯1p¦·<Ñ’^5tµðn‹!û $X‡A81ï7;m†ó{×à}=»Žø üË&Oa¯íÖôžçÕsÇò ç#kÞ÷ÄlƒðâxP”PFwð6’(‚„ÅþÄ(õž5Γˆz‹üFœeé}%ŽÑ9–CFÔG0¡d>+À²ã&¶Ã„¬‡áå ððüüîãO—‹“ãAoÆý߃ßP’ˆE€3ÿÓš«J™©h‚ß§mÕrlâ5„¨ö°} »Ì·¸e‰òdÛïvûQV*-jÜí—'lA`Tu«løPMî»ñÀp¾ZñeëT¥“–/Ž~ɯ¤ùPÕ”ŽP?f 2ŽÄ.°…L1öþr±¸¼¸û~qq~z}øÝÝéÙùÉ” £‘ò¦é-<ûì&•[4I6…Ú¬êô±À„U[…5j™Wõ`ͧõÕ\×AYˆ`k2lgE¯WÍÿÌMyHý‡Â¼ Yopâ?Žç˾êÑsQÊ'‚#^BÛ¡¹@\¤/]{Y•m*ƒIáuZ§K,1Q›eºG:‚íÊô<²ÅÛv#‹c=¨d§œ‰¢3¦ÈÍÑ-â\oe~ëÀªŠjJWR2%«P{¦YÞLð›$„â[¡7à÷æêül±8¹ž²j4êš?nóTf3w8f5oĵ(édH ¶+ÓõÈg%²‚¨«ïÚå=JêWÌ äLxûúÀƒ?I` n‡a댷Oà‡›… ñfjòјC07 ôm_D‘®šóuAìÆ •ÂIÍÈá¨ü@—(Ê!-ÿnšê¹ôôwBÈ|Ù §¹+.,#x+ÏÓªnxä» JnDÁ·ÊäŽȪ¦MË©!€—¾fµ¥àþþ{¤+nƒX@­µº>9º¼>¾¹»:¹†»¸8[LÙ5{V¶ü‘ËÛñ&¹ü¾z6 Zµx߉ß™â¼(ðúñvSY=Á¤w˜J€4ÖD‚ƒH2&çid•£Àô;¶t-v®½‚Kêú„zªžµ¹üáäh1w®©síŽ †1ð Ï9…Ð3lë› V=2gTŸf(À7t”hîïïzºmîQ¢¸G`^4û~ztàç×+·¡¢f‡Ô|}ruy=§ãašbÏÕjG1BM1¢¶2muø+Ôþ «¢TC‹7tu€Â+pr[óÆšZ‰@ñØ mÊMÜüj#¸â…0ŠzÔ^~š-*ÆCLQqÀ¼^U¡°õyXW(` -°* %ê•J¦XFPYzty¡p]=O9§þ»ÅEè†$¯¡çxÞQ\ŒG™ââ Š%1½s^ 3*«÷‘ý@W Ö¸e#èݪ篚zºÆÅß@ôù³< aâħö¹uóãÙÕ\‰1"JŒƒÄ)¥j …pÃ͹QEÜ]!ļÄvó[¶Ù·uþÆ š¿¯s]¼êþÀ›0ç÷~Ç_ÇÿN5Æ»öèù8ü,I ½"uæ$âËC¥ÎlD«º* R!¦:Ö¦}l?ÀMQmã¾øj ‰‘éÓF½I"²mS'=ëê2ĦüeÁÀßÝa3âÊo4Q4 ëë“Ó³LÍ1dmœ“èÍΩ½/³øw ¸w*dmžZbïžJÖß>•°ºB¼)OY/>%õ¬ïíT~+êÍ¢Êjï£ÝØVá1td?žœˆUP ÐAƒBMŒAÀ ª¾pMƒc·ïòΠ`OqG®}–.®Ï.îõý^‚ÑëbèÀ÷D]µ¨³Â xø ³F Ôµ3‚¶Ëz!xZn`³I—ì2W"þ™×/.¹ú&.¶uŠK ÒÖSµè”—”¼”eª,7qøú£UþyÖǽZ= ‰ endstream endobj 565 0 obj [ 564 0 R ] endobj 563 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 565 0 R /Contents 566 0 R >> endobj 567 0 obj 2785 endobj 569 0 obj << /Type /Action /S /GoTo /D [563 0 R /XYZ 72.0 720.0 null] >> endobj 570 0 obj << /Type /Annot /Subtype /Link /Rect [ 230.32 555.77 360.61 564.58 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 569 0 R /H /I >> endobj 572 0 obj << /Length 573 0 R /Filter /FlateDecode >> stream xœÍÙrܸñ]_Á7Ë.‰&AðJ*•ò®å”¶ìµ×Rœlíl¹ Œ†µ<Æ$Dzò°ßžÆEô$5ÉÃ&>Jè&Ðèn}úrzü½?Òœxëêì‹Æ…^J¼(Ѩ8ñÂÔO‚Ì«< dqæ•¢ãQStÑÍHbuo켜Õg÷·³_~…N/ðcïá,pˆ+27g?ÁäqâGI–ç¹æ•øa–‰)"?ƺò^^WÄ{ÝÈÞ†{A(øŸs9ŠBòÀQàÝŸ}w{öòMì…w»µ[ $‘Ÿ& ç$¡^æG$ˆw[y¿œß|)o›¦|þ«wûÃÙÕ­M›‡À¿Ô—;èèCLƒã/hw x‹…ÿÔ0>‰Añ©Ô ªŠ¦K©Ÿ³ ѤÐàñòHMý‘“ϯDÆÏŽ€†H÷Ç›êV™³Šbîya‚¹½ä=÷.£&;g‡¾©X_¬YY>"t×÷µ…¿²òÀ; ÷ êk›[þ`nÏ×Csu]Ï+L´-Ø]É;ßâ^¡I®mó¡-zަßÝù´Ã4ˆå hêòQ-ðË7¹«BŒtøâæöÕÇÛÏ·×ï®Ì0GóI⎓ ‡Aæ'Þùì|)ñƒ,Îó,¦3¼út}sýþÇÙyC’,Œ?‰ƒ0+Ÿ†yžé BlPÀ»ó<äKü“xÈ3ØöižÇIøß-IèÄCÑ!€¡ö†©g>ÕõE…?v}[Ô÷±mZ8U=ßã0…&pèxû¬SÒ ½KEA„Y¤/8¨\è,O¼ A’ùiÃPß¡òô>ÊÈÂðav©;ÕÔ†å™Å|åmW4õ:Ràê¼ð¹aiõSdëÆ¢™%ÍÊb3@-—§]RÇšLÝó{náúPÝñvõüíEIîgQqB&Ô÷ô d‰À”¤V:±.­@éˆÈº©·Åý¡¦Í“›d—ûRkú¨ÃCÑï<êÜF´!6†Ñ›ßEyîG9LJ“ØåÀêáó›÷ß½ºWG.ÐñaˆNb |ßÈo…ÒfßW¢Ào‡&¶ö!2ö!òª]ñõŽÕEgÉ€æ7¶k34&íØ1?w|ǾM똟›ƒÏê¡]]oY+- £¼ÄUõ©0_$É\Ít¼ŸW» LAÕÂ8#µç,Iš†ßÉp!„qÎà¡®Tcß„âY7UelªÂÌ{ùÎR@IêòñB iâçJ¹*T™w aæz/ºÄ|ÄÏõlQ˜a;„=ZJ;(»f n×<ÔÇÊ«ñÐ~ŽÎü¦¡‰Ÿe™PZîŠy¨—¶MàåáhÀêüaW¬w2hJüÔp¡ÚüË¡­óº·8 Êö,“yìG|t§î”uS_Ö‡²\ˆu@¬DLâ|‚ãç¾åà»b­ØÚ6³MJ/¡+³^@=”÷HôCß6 ïêgQqVÏu6¬¡Úë3¥ÆÈXÌCaôƒ/ ¢ñQÕû0gdv5 ©#‘ìçt‚Æò–‰ Ú¢p¨‚8ž{¦¿;ôj™tHaô1€§±‡:NáSò‰ù7|Ë%¦kT9¿¹2°‡9D@!!)±dû}ùè#Ä›ËÇ¿±j_r¬‘b‹€Gé6Æ» ÅŠCPxžM°§lb–úÙI61‚p; °ôaº,ë`°'Çœ—…TJ­£¯o>}þþýÛϯ¯Þ^¿›GéÄX)#µ1¼j냩!;ß\X„Ù^ BgS!ÌÙœê,6*· YvÝqÌmƒxX7å¡Bô7¼,*Èk[Ä >3 à±rK»‡ŸŒÝ¼f‚P‚YPðÀ‚EÁ¤Smù¼Ý¡oE}¹o›û–U·ãåMÍêy²ÒŽCsœUE:?{©:cÐ)7“ {©¸ìÿ«óëÚÕ_$|%œ{šeJbŽ5ë ¼ÞÎÊTlN°œYD&Hœ¸Ë¥CThNP¹ð„qjì8÷[FâAPˆÉ†HlÖt„S,®Vßþ:o¢)Åø¦:qÒQÐ1«Šà5Ï2þUŽrÎ+jù}´"a,JX`çR¡Y‡ªÓ=Å»Ùî&rÓñ¾Ÿf^’%~ˆ:JŸ0/É _è^×›âÛ ³¢Ú±Î€F‡@$W£\ö&ƒ5È5qBu»S‰¥L»w_÷:þm_²¢zìÈ”HÄ嶯J‚d¶Ô¨¼Å&Ù(‘Èí0H%Y6µÀ™†y_ðaâ&v”ÅIê:NаÃ׬gwp<_:G™€¥<ÖËÍOo=áÂ~`_™Ù€`µö¼Œ@ÄèÒ )¬ ÞõÚê剩WõNÌŸ¸+È_€N¼ÜÏ®m. ´3wÝ«à\Áʪ¶²ºªÍY÷ˆ¿lЧ’ß3À+ÄC]•QÖ“qÔK®¯nÕY5Ç(HÇ6 ø­nîúc­ò ß`¦ø¬G ]Žà…‹ó‘ºŠúk³fú \Ò\ÆÛE%‹iÔçFC¸Íl³jT  Y¬ÙÂV®7ª~®ÐRJ !O‡™u‡Ì×^hز(Í&Ĺ¼„…ó0Ÿèf9Œó lÒÄxËÚ=Gj@üíÛ¢b-íŽ×|[ôÓz2‹‚ô‚+—»Ji8bKVï·rºŒŠðµWìU¦081Su[QqeÆ4òÐéäiŽÎ¼æ!› ¡ðæ»,.XK#íÜJç\]b(”ŒÄjÖq­·ŠĹ@ŸDŽïY«ëÕOGƒÔ.&'9™`±fÿ‹/?üøêÝÕ[‘€‡\ qa9?X)ŒÞÄp{h©‹LÓ¶©•Nž;ÕÔ>ÌÁW )@ïjC—õ‡–»=ÁØ»7¦ÚÍl¥ooжëËÇ ‹1çBÝž­ȶ:ÅSàB¥•ú¹HAh–Nð´`ùÂ8YiçÖG\¶›½pǬDRtm›ZHªÝ‡†ë`òb¨"-ˉ{ˆ,Éóˆ†Sò²ç¢4Z¢¤;‰£,õqYä“ÿ ()ÿ ¼Ñ$¶ÖÉ¥æÆ·Q8Ž nøº±Œ¾+Žî*%ôlVH¾Lãžß;I²0ìš¹è;^n1¢C€HÒ/!¯á58â+÷Ñ·ŸõVRP¥b[3n×4PyV °"a<ˆø0™]{) Ù´KÊæÁr4éÝ„…ˆÆ®Ö©õ­ºW±®tSTéVm‹é¢´më‚™öxø`D8ŠkÕzÜ…m_ÛfË…ã*Ñ Gï ®ÄuÜ=Ÿ™œ)„eñ/Â'(°ž` ᑸ®ºÊ¥N@®ú (¬ÿ¡èvžô¹ƒû„oÊ×Íû¸Ø–#ÜI.÷Ÿ^}”ÇúÛ¼‹iÀ< ™ÏÎÇ9­DT‰Ótjþ ŽŒøçÍ((Γ˜0)pœ“£êÇŠx\§™êɤÍ!…_¾/›;Vz°|Ì3¥”Æ ÑE7éзÂ_v;€Y5õýÄŒ%AˆºÎ˜³)åMx2íaÜQž¾í¼,E1ÓÿcÝ%?w½Yê(ošEwÄåü³ØBnñn`©°9\ÖOLµP»H—ž®)¯Y³SÌ!ÞàùK,žrGyÛBÜ#‡dá¾å¸‚§BÂö Ž‘x×牗GÐ ÎQÙ°Í”ÄE]>³dªŸ(© F:IΞLûV«ÂÛ¶MSîÅöb^ÍÅMŒWò¯¼œ` ¨ÉóäÑÄ ¸ýºfí ƒp^cÉXPÎνš4µ¿ÁìW‡®¿õë5xƒôÛƒƒÖáŸ'+©²-žáÜ)›¤V ©zÍõÔ¢@V•äÑ’Átºý½Óîy¾¥Ì?ò“u1JÀGQ0 yÎKkÅce7´Å%»:jB߀«ó«ok.Ó ?M¬¸(ãÅV|qõÏï¯>Ü^¿ÿÑîJ‘‰86#D,û’=š“8\¹è%™¬rÇ)õQ Iƒ Çè\ï„S#^ 5¸á±ô—³(Qc"êÇ"†cBý4¥Æú¨úù†9ß‹$ÒŠÀRˆr¢­Î+ï]ÍÁÉëa2àg9 ÃL42Å‘×ÞŸ% ý<…´(ñhÿ3HT©ø8œ[`2ç$;QÕ©‚4*?F•… •Þ1áÙ·Üñ”8Ä5Êü²…3ëÐ7hPÃH iúâN-2AŸŒ&8bÆ~¨<% î*tà°‚‹JJa¬iÛé4Êð1žÔ°×f¼c¶æ¹HGúШ±:æ_Ø‹ÝI¦Æsñ@«Òût@¨ŒÂ\È)Üï8·°­g(s|Äò›ÍNK˜ÇÌ &2÷Îuî1ÀŸ‡Ö¼=„eJ2°®†LжHÛÿ£‘¸3ÍgišÿGŒþþ4£4Îý Nƒ ɦVh`®ßûвQ÷á‘~¹­€R¼òn-,žòu3}›C!Ê…EØ7uÔɰÌs M¦¨C„¶¶ÍÐleÓüf^Œ)„ªÄjèwD¡>š  ˜Ä"i2vBSq0Ò”¹åGÏAä+ÕBÍò@qe’'b¿:_Ì?KÓliäê¹Çî@ç’¡ý¡Ý‹*Ø™ªp J„€êšÁ;úG¿eõoOKÐK endstream endobj 571 0 obj [ 570 0 R ] endobj 568 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 571 0 R /Contents 572 0 R >> endobj 573 0 obj 3773 endobj 575 0 obj << /URI (http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html) /S /URI >> endobj 576 0 obj << /Type /Annot /Subtype /Link /Rect [ 505.582 321.5 539.998 330.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 575 0 R /H /I >> endobj 578 0 obj << /Type /Annot /Subtype /Link /Rect [ 220.0 309.5 514.7 318.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 575 0 R /H /I >> endobj 579 0 obj << /Length 580 0 R /Filter /FlateDecode >> stream xœÍYYsÛF~篘}Šœ’†8ˆË/[ttXY‰(U Sª1‘ÅA eå×oÏ™!0T9µUÙµ­Réécº{ð牋ø{Æ~E‰‡Öåä³ä¹(òJV"7¡£I1*ØÂ’-‘¤Ï¹rµ[ôˤš8èjòÛï°(CÐËÄm.¶YN~åAˆý0N’DÚêa7Ž™ ‡@¬K4½.=t^óÕ½õl#çn½i‘ïzÿ9èyò!L/ä:(ÝèðCûŽã¸±bì{ ûã¡´D¿,?i]ïmGKôé=&'OmßýŽÒ'©ô–oÅóɃæIuð ˜9‡OŒ„S|Í…Ÿö8Ø À-ö¨g,³=ð˜‰ßGc$·2„‡'ƃ÷w*?~8‘Jä±?̳¿9d£Sdº;ãŒòëûóåÃc:_\]¤—×7Â1%àÎâ‘Èe^Pô9ØE';Òm±B^¶´Ñ¨«I¿îê¦Sð‡åƒ¢ëF‘绫µŽÅ¾RôjõõŸ6 -ÕŠ3º!ûB«ûBн~JªÌâ²ç |ÎhGò¢ÅƒµšyØïkwÐtþÁÑ‘PÊ lòtR‘’bI›ü>œŒæ®2"/e(d##ÎK„Q"€Œ’á;ØQ„ŽQ:p ñ°Y| f_ ¢èh¸¢p®ë«»ûÅÅã‡ùÝÕã2§?/-JFb 'RRq—¢“ë"»fOO5ÚÒJ\¯"šK¿v´©H¡ëº,™z]ï;ªO¯ŠÖN/“QW¡x}×q‚8;°Zý£—߉÷†¤ÒÜÐnßT­¶²iĹs´:©êêÌVÎñ`Ã?iS¯Þ±Šˆxít¤Û·§ ÷7P_òBƒªîÝо¬#]ÊœìšWM׊$kcu¥Wl©¢¹OXÁÕIºÍ[»)[ò…vY<‡ˆ\§› #@ùË–tˆiVɰkê熔¨$¯(ƒ“ÙõFÅ÷óÍMóhåÝL_äj/äµEûª¥UÏlXc\ÏãââÓãÇôÖªp$r“ƒ_<ÇÏGt“WÏc=&_o ó]£u]AYW&gK8EÚ<ڮɎ¶àˆÁ\BS3 i– ·>µ åpzÿ¯‹»£¥ãù6éSô´g§\¼"²Û9m¤! IkéTn4¬« ‡vdŒ¨GŽÍ  lÄ\0dÈ0".fÀë0Þ‚·hQwž€²9 hhK«ÎæO2,˜åO7 :L)Ü*´iêR‡ùâ‡ó…ÂëºØ—•^,š«ÞFÕ‰¬Åù¤~‘“¯Á·Z¬ð\®õB Ä€×|–·»‚•4vÝP¸-˜uüÙ3íZôÒä]ܼ9ºl`αäŒç uqñp½¼¾·eËxõ‚’Œ§)F}âˆ|±¨šJdqÿ‹MËh!×çÀ/S§ ‘°‚! ÐŒ%í¥5Ê«6Ϩñt£éã÷¤à(ðwæ†6·Ø!K°î‚—ã—f4Ã3×MbØÇ»h;ŠºÞiôTg¹È ɸ6LîúVzgM¬@ŒÇqDBU’0fåE4ÙBÅx,°( 7´[oivª9rvQH\}™4ý¼G&Ö¦é •´0Ö‰ãQªŒeû¦Ž øS›ó‘3p~_AapË ¹C­^ Ն̅¬ œ*M«)àš´ÆÇÓÊ´JØïECuµØr F¨7d Óä"Ð5ÿ&#£ÃΠ^4,F~ã­ÇÏ"öÒ<ÚãÎá;³¡˜»ð¶r}k{Y¯ïK}£h4Á0ˆ`Ì÷]]’._“BTŠ\'úŠ"…M4YÔ ”ÿI³áöËÛ쀇asÌ Že¤£¼ûwyi‹œ?¬õïYÌ z·Ÿlû–ÿ—÷þ Ùî[yöí雚­ëâ8×I’7ýy¼¼_ÜÎÓ£)7sý·6Ò¦lIk´[*štvà ó¸Ã:8ïïhVUý!MჂ#ZojH:ƒþ½ŸjM3ËqFÊ9âþ¡u#©Ëºtî3næ:8êïÔàˆ8HÁÔÖäO"‘%ï‰õ 6pÓví¯ ¨gÑŠ<¡oÛ~<ꃬ¶ÍÙŽMiõ'l¬$ÙYJži®d‰:—àÉ|²oáÌ ,Ç›1hžÆ#‘'† dŒíT“a/ØðSÉÊå"ÿ75àјzð–éF I`Ù÷þœÝÞžeÙwéw?¾/Ë÷m‹—Ëå¯Ç¯#x¡ycÇSê¾Ø88H²~A7òA×´ïã û˜¡ÆzÞ„)Á‡ë2ôgM^S$J7± n»n÷~:µ}As†'«_ª¢&®á© x]—Ó?Ȧá4«×í”ìrΙvðŽ?]æå® ç.¢~ñ¶+‹ñç=t'§÷â­ûr1¿:öÉt,Ö]ÖùÔWSÇ5™.hþƪЦ!Ï¥Ó$ç`S²Þ‰Æ+Ÿlé±MõG)Øhú|ù`óu6lˆò£dCÿ`W˜Qøàÿ*þsôC¡ endstream endobj 577 0 obj [ 576 0 R 578 0 R ] endobj 574 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 577 0 R /Contents 579 0 R >> endobj 580 0 obj 1952 endobj 582 0 obj << /URI (../verbatim/sample/sqltool.rc) /S /URI >> endobj 583 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 537.149 229.77 546.149 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 582 0 R /H /I >> endobj 585 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/sqltool.rc) /S /URI >> endobj 586 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 514.966 290.62 523.966 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 585 0 R /H /I >> endobj 587 0 obj << /URI (../verbatim/sample/sampledata.sql) /S /URI >> endobj 588 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 492.783 251.43 501.783 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 587 0 R /H /I >> endobj 589 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/sampledata.sql) /S /URI >> endobj 590 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 470.6 312.28 479.6 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 589 0 R /H /I >> endobj 591 0 obj << /URI (../verbatim/sample/sample.sql) /S /URI >> endobj 592 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 448.417 234.77 457.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 591 0 R /H /I >> endobj 593 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/sample.sql) /S /URI >> endobj 594 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 426.234 295.62 435.234 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 593 0 R /H /I >> endobj 595 0 obj << /URI (../verbatim/sample/html-report.sql) /S /URI >> endobj 596 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 404.051 251.99 413.051 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 595 0 R /H /I >> endobj 597 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/html-report.sql) /S /URI >> endobj 598 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 381.868 312.84 390.868 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 597 0 R /H /I >> endobj 599 0 obj << /URI (../verbatim/sample/pl.sql) /S /URI >> endobj 600 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 359.685 214.22 368.685 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 599 0 R /H /I >> endobj 601 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/pl.sql) /S /URI >> endobj 602 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 337.502 275.07 346.502 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 601 0 R /H /I >> endobj 603 0 obj << /URI (../verbatim/sample/plsql.sql) /S /URI >> endobj 604 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 315.319 225.89 324.319 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 603 0 R /H /I >> endobj 605 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/plsql.sql) /S /URI >> endobj 606 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 293.136 286.74 302.136 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 605 0 R /H /I >> endobj 607 0 obj << /URI (../verbatim/sample/dsv-sample.sql) /S /URI >> endobj 608 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 270.953 251.99 279.953 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 607 0 R /H /I >> endobj 609 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/dsv-sample.sql) /S /URI >> endobj 610 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 248.77 312.84 257.77 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 609 0 R /H /I >> endobj 611 0 obj << /URI (../verbatim/sample/csv-sample.sql) /S /URI >> endobj 612 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 226.587 251.43 235.587 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 611 0 R /H /I >> endobj 613 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/csv-sample.sql) /S /URI >> endobj 614 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 204.404 312.28 213.404 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 613 0 R /H /I >> endobj 615 0 obj << /URI (../verbatim/testrun/sqltool/sqljrt.sql) /S /URI >> endobj 616 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 182.221 255.9 191.221 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 615 0 R /H /I >> endobj 617 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/testrun/sqltool/sqljrt.sql) /S /URI >> endobj 618 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 160.038 316.75 169.038 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 617 0 R /H /I >> endobj 619 0 obj << /URI (../verbatim/testrun/sqltool/sqlpsm.sql) /S /URI >> endobj 620 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 137.855 263.68 146.855 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 619 0 R /H /I >> endobj 621 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/testrun/sqltool/sqlpsm.sql) /S /URI >> endobj 622 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 115.672 324.53 124.672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 621 0 R /H /I >> endobj 623 0 obj << /URI (../verbatim/src/org/hsqldb/sample/SqlFileEmbedder.java) /S /URI >> endobj 624 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 93.489 341.43 102.489 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 623 0 R /H /I >> endobj 625 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/src/org/hsqldb/sample/SqlFileEmbedder.java) /S /URI >> endobj 626 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 71.306 402.28 80.306 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 625 0 R /H /I >> endobj 627 0 obj << /Length 628 0 R /Filter /FlateDecode >> stream xœÍXÛrÛ6}×Wìc2M ÜIä­™Äi:™N<ñLÒ<Ðe1åE¦h'þû,x‘H©v&­c‡Àòàìî°€t¿`@ñßKû ‡U¶¸om B·&¥DÓ2h;¡ !µÀAÓBÚ¦¨­-ºéláÏE¾ ðnñù ‚Ö@‰‚o ê74Ÿ×è\i"thŒicå„…¡u!ˆÆÆ*ƒåûŒÃ›¢FwÑ["úŸGßH0þ¿ˆÈÆTÏy=ëROýà…’tø¦·,ö£ÿ$ -„+tn_¥íL´Oû¢kª:³æy6“–ª7øT×:ÅŸéœÂÝâõÍby¥€Q¸ÙwQ ÐBBn쇛 >? Øó/póûâí³~²dÎ,Zß´á£Ìhe›˜Î‰Õ+ÊhE)eªÉë×Ý.Î×ÉwxMà·§]\~ºþWIÇ$ÿ{ß$m¥Z^±S(A…tŒ Ý€be¼‰Ë2^CU@’CµMöðî!YÇ ïˆö¸d ˜@N®N8Ÿ#€Z±ŸmjöcÿàçhBÇúî½ÙÆý^ü½êu³è©×»Nª2‰^6e‘¥^Ey‘'«(íÙF’Y«‡,Ϋ¨JŠ~œû¤Š_ôúÛªÚ½Z.éz‚éÃÅHÙ¶Ýß§ë[R”wKä^rB_@QB«pe1¤ÅªqøT<@TÆ8WÑ:ÉïšIÚEwq=€–ýýBèÆiýd̪5¥¼­Ýº©ÝõÊ pS ¦UI0‚póJ¥iÂü£¨â;"Ih$c¡m„\(a×1þoBj…édÏ2<7ìÎÄxacÏŽû1¢Ád µXRk鱤0 =»;bÍN‰[Kw²:ìL(¢$yºÁhß0# KÅ]v~Bߤ÷"ƒ:‹³w|zX 7-÷Ñ]k:œõ|4ŒþœœÌÁiPçc†b4G‹óÅW".2"Da³ßop›©]<³»¡kÛ]ѵ»ÝÑõë]Òuº|0|Kªí‘æÐÚWQ¾ŽÒ"?ò~|s5ð—/ý"OŸzƒÚJàîó%!ä€J|½ Ãì¿%i ›‡|eËé*3na~zx(¬4FRªE[š?FI¹‡bSW“~³‘A l°ÕÅ:ÎWXHë:N<‡ )^)î÷@7.ÿâ\$ÅÆplD¯à*B\cõ±.GÆœ¢%®º ÐÂÇMÈò1.o±æfK,À»4^¢HUQ¤¤\¹ qÊqwcBÉÚª~vÒgó"-·›LcX݉=®§‹›ÖÓãÓsZø¸Çô¬먊J0’”Ä ¯=;Þð.ÕÔÇÔX ¥=„¥½º:¸º:c¼ºN£…û¬®g45Œ(ƒ×€ðJ:*§ÀO…­QÌ»JØ´˜ÎŸ–Ó`áaQr[eéË2Þe5.§ÀƒÌhN©ÒüR=ýäÈÇ“jʼª:¸²:c¼ºN£…{DÙ]zFP,Ä‚‡xM5/ÐQNŠ™àe†QƒåYøttqÓ:ºc|:Î@ ÷¨Ž˜ò¸”’K¢íñO¹¼\ÊqZd•š„A@™½ÝûÔtp3ÔtÆxÕœF ÷ˆšëýãK_õ´7hªì-AéK%õr#5f.eLzk¨‹›¡«3Æ«ë4Zø¸Gt]M誰K®)WÂ\ª«—©±BkjðÀ ŒOW7­«;Æ§ë ´ðq÷u­â}U>äÝÕÑ>¿ž;£Tý1€!+›/îlÈb‰{Bùvp3vÆxžF ÷„»}6®0.\ÂTH¹ývå_(<îù±’ É(’ûvqÓ »c| Ï@ ÷ 6”«¥U¦©ÛΟîSû]äÛì6^ã§kò5zŒF2Åj®¸À³1¼àÞu¡Ãú»ãëÅ|» endstream endobj 584 0 obj [ 583 0 R 586 0 R 588 0 R 590 0 R 592 0 R 594 0 R 596 0 R 598 0 R 600 0 R 602 0 R 604 0 R 606 0 R 608 0 R 610 0 R 612 0 R 614 0 R 616 0 R 618 0 R 620 0 R 622 0 R 624 0 R 626 0 R ] endobj 581 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 584 0 R /Contents 627 0 R >> endobj 628 0 obj 1423 endobj 630 0 obj << /Type /Action /S /GoTo /D [209 0 R /XYZ 72.0 245.8 null] >> endobj 631 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 709.5 202.308 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 630 0 R /H /I >> endobj 633 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.459 709.5 539.887 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 630 0 R /H /I >> endobj 634 0 obj << /Type /Action /S /GoTo /D [361 0 R /XYZ 72.0 571.444 null] >> endobj 635 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 697.5 229.999 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 634 0 R /H /I >> endobj 636 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.549 697.5 539.888 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 634 0 R /H /I >> endobj 638 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 685.5 174.637 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 637 0 R /H /I >> endobj 639 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.37 685.5 539.887 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 637 0 R /H /I >> endobj 641 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 673.5 170.75 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 640 0 R /H /I >> endobj 642 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.36 673.5 539.89 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 640 0 R /H /I >> endobj 643 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 661.5 135.45 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 371 0 R /H /I >> endobj 644 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.37 661.5 539.947 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 371 0 R /H /I >> endobj 645 0 obj << /Type /Action /S /GoTo /D [367 0 R /XYZ 72.0 290.476 null] >> endobj 646 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 649.5 143.88 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 645 0 R /H /I >> endobj 647 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.326 649.5 539.942 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 645 0 R /H /I >> endobj 648 0 obj << /Type /Action /S /GoTo /D [376 0 R /XYZ 72.0 720.0 null] >> endobj 649 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 637.5 143.88 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 648 0 R /H /I >> endobj 650 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.326 637.5 539.942 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 648 0 R /H /I >> endobj 651 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 625.5 141.219 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 652 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.335 625.5 539.894 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 654 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 613.5 238.594 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 653 0 R /H /I >> endobj 655 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.527 613.5 539.791 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 653 0 R /H /I >> endobj 656 0 obj << /Type /Action /S /GoTo /D [418 0 R /XYZ 72.0 632.1 null] >> endobj 657 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 601.5 290.285 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 656 0 R /H /I >> endobj 658 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.685 601.5 539.793 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 656 0 R /H /I >> endobj 659 0 obj << /Type /Action /S /GoTo /D [427 0 R /XYZ 72.0 237.15 null] >> endobj 660 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 589.5 343.602 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 659 0 R /H /I >> endobj 661 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.601 589.5 539.575 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 659 0 R /H /I >> endobj 663 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 577.5 245.965 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 662 0 R /H /I >> endobj 664 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.496 577.5 539.784 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 662 0 R /H /I >> endobj 665 0 obj << /Type /Action /S /GoTo /D [445 0 R /XYZ 72.0 137.73 null] >> endobj 666 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 565.5 202.234 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 665 0 R /H /I >> endobj 667 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.417 565.5 539.791 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 665 0 R /H /I >> endobj 668 0 obj << /Type /Action /S /GoTo /D [523 0 R /XYZ 72.0 161.7 null] >> endobj 669 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 553.5 182.877 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 668 0 R /H /I >> endobj 670 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.413 553.5 539.846 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 668 0 R /H /I >> endobj 671 0 obj << /Type /Action /S /GoTo /D [529 0 R /XYZ 72.0 720.0 null] >> endobj 672 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 541.5 162.055 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 671 0 R /H /I >> endobj 673 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.363 541.5 539.804 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 671 0 R /H /I >> endobj 674 0 obj << /Type /Action /S /GoTo /D [537 0 R /XYZ 72.0 720.0 null] >> endobj 675 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 529.5 158.593 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 674 0 R /H /I >> endobj 676 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.401 529.5 539.852 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 674 0 R /H /I >> endobj 677 0 obj << /Type /Action /S /GoTo /D [537 0 R /XYZ 72.0 604.56 null] >> endobj 678 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 517.5 169.464 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 677 0 R /H /I >> endobj 679 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.423 517.5 539.897 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 677 0 R /H /I >> endobj 680 0 obj << /Type /Action /S /GoTo /D [544 0 R /XYZ 72.0 720.0 null] >> endobj 681 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 505.5 164.469 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 680 0 R /H /I >> endobj 682 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.407 505.5 539.896 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 680 0 R /H /I >> endobj 683 0 obj << /Type /Action /S /GoTo /D [544 0 R /XYZ 72.0 577.8 null] >> endobj 684 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 493.5 187.748 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 683 0 R /H /I >> endobj 685 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.475 493.5 539.893 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 683 0 R /H /I >> endobj 686 0 obj << /Type /Action /S /GoTo /D [544 0 R /XYZ 72.0 358.8 null] >> endobj 687 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 481.5 128.498 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 686 0 R /H /I >> endobj 688 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.299 481.5 539.897 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 686 0 R /H /I >> endobj 689 0 obj << /Type /Action /S /GoTo /D [550 0 R /XYZ 72.0 720.0 null] >> endobj 690 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 469.5 395.226 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 689 0 R /H /I >> endobj 691 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.76 469.5 539.55 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 689 0 R /H /I >> endobj 692 0 obj << /Type /Action /S /GoTo /D [550 0 R /XYZ 72.0 392.083 null] >> endobj 693 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 457.5 248.445 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 692 0 R /H /I >> endobj 694 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.56 457.5 539.795 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 692 0 R /H /I >> endobj 695 0 obj << /Type /Action /S /GoTo /D [560 0 R /XYZ 72.0 720.0 null] >> endobj 696 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 445.5 139.274 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 695 0 R /H /I >> endobj 697 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.348 445.5 539.855 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 695 0 R /H /I >> endobj 698 0 obj << /Type /Action /S /GoTo /D [560 0 R /XYZ 72.0 621.84 null] >> endobj 699 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 433.5 169.464 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 698 0 R /H /I >> endobj 700 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.423 433.5 539.897 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 698 0 R /H /I >> endobj 701 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 421.5 206.647 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 569 0 R /H /I >> endobj 702 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.447 421.5 539.761 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 569 0 R /H /I >> endobj 703 0 obj << /Type /Action /S /GoTo /D [581 0 R /XYZ 72.0 720.0 null] >> endobj 704 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 409.5 173.616 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 703 0 R /H /I >> endobj 705 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.398 409.5 539.806 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 703 0 R /H /I >> endobj 706 0 obj << /Length 707 0 R /Filter /FlateDecode >> stream xœÍÝAsÇ‘èñ;?ŹOãªÊ¬ÊÌÓ K²WÞ#,“ö6ö‹„X ðÉúö¯²Ô`¦[âü/»kï† ð_?èΩéþñEÝ•ùßÏò,ÚîÛ·/~|z_ÝYÛÉxzW»jûQ|÷v÷ô†wßÝfxòËLž~)Ë{ŸêÃ?ìþýÅÝ‹²û×ÿñŸ3z³+û¾ûéEY=øáa^½øf~ð>ö2<"ž>×¶¯îù!d?æ/¾}»ûÝŸÞ¶Ý—÷Kýñ³Ï*ÿãŸýóÏHjû_ð•Ý÷/>ýâwì»Zv¯¿;~ ô²×^ælì|/-ò?m÷úíî?^~õó»ë÷¯¾ùz÷·Ç›Û›Ç›ë‡Ý¿~¸ysý/ÿ¹{ýo/þðúéº<ÎòÍÔæÿÙ~ùŽ:ù®åôwž}·ýòþã{çÿë^ï›ïÙ·>ÿLù[·OÀOÿ›¿ññ—}ù‚þ÷W¿@Oõlñ9×ò•ûïüà¿.cº¯5eÆü´ÊÞOhnþß3„Óï¶ÿæ¯ÝŠ3?ö¯ÿ©ÔWßf_ßóíÕíî_vŸ…ïëîåþùîýõÃÃÍýÝÃáOùËê*e/Å"|¬¿]°Z%{ó(¥*Z5¿1m~ýµÙjÕþ<ÖBb!ñ q€¸7w;ˆG%±’˜4"hDЈ A'‚Nƒ Ø l¶[‚­ÁV`«@°5 Øl "(DPˆ A%‚J;ìD°OÁ1äF©ŸŽG!±x8@lÄÄb¯$VÁ ‚Aƒ”¥A)@P*” ¥Ai@P”çï‚Xˆ A!‚J•*ìD°ÁN;DpÁA4"èDЉ A'‚AƒÔµA-@P+Ô µA­@PÔµA!‚B…*T"¨DpþcfÃåòé“ÎCtíóñÕƒ¬²}è<°oª«UÚÏkŸ'«gÑŸ¯¸~{õøq"—ÿ€ì^þþááæû»·×w«‰\~Äù…ˆ6aõhÇGØúHÔR†Z¦{s™'.6Ö˶æ? ¶‚jAõ@uÚª;ªÔQQ,ƒXæ(ˆÔÄ2‡A¤&–9"5±Ì¨±Ì‘©‘¥ KA–‚,Y*²Td©È²#ËŽ,{Z¶ù _Bb!ñ q€Ø‰;‰Ä^I¬$&‚Aƒ ˜Ó!Áœ]W ˜Ó!ÁœætÄDPˆ A!‚J•*ìD°ÁN;DpÁA4"èDЉ A'‚AƒÌéˆ`N‡.+Ìéˆ`N‡.Ì鈉 A!‚B•*T"8Ík·R[(„äx¨k”Z› e9ª¥Dߘ֨­Dó'¯ÌsR]ÑoïÊǯÅv/¿¸¿{|{~®>¸†Ø\Ttý¿,^­ûVòYi²jþ °å¹ìU«)Bž_ƒº£ÚIç× VT©óüÚÆü.ØÐ^ÇBâAâqž[_w;ˆóÄúòXIl DpÁA4"hDЈ A'‚Nƒ "@° Ø l¶ [‚­ÁÖ€`k@°5 Ø"(DPˆ A%‚J;ìD0O«óç±—qI¤ ÕÕNj«¨VT©óôÔ‚jdéÈ2e Ë –Rˆ¥b)…XJ%–R‰¥Tb)•XJ#–Òˆ¥4d)ÈR¥ KE–Š,Y*²ìȲ#ËŽ,²Èr KC–†, Y²tdéÈÒ‘e Ë@–A,µK-ÄR ±ÔB,µK­ÄR+±ÔF,µKmÈR¥ KA–‚,Y*²Ì#ûˆp³¸|²˜#V™GøÑk#«žíÀ[­R_OXç Íiô—¯î{É×Â^½}w{}¶,æúzå³u#YyŠÙº¾:f,¶^·šÌÇõ!WæÏjµ~I-¨¨Rçr î¨vRç.kP+ªÔYd9å@–†, Y²tdéÈÒ‘e Ë@–,ƒX.Û®AM,—חוX.[¯AM,—Í× &–ËökP#KA–‚,Y*²Td©È²#ËŽ,ûáØg_ÕKê õh¨î¨vR[Eµ¢ÚHíÕ‚jdéÈ2e Ë –ËFlPËe#öåu%–ËFlPËe#öåu#–ËFlP#KA–‚,Y*²Td©ÈR‘eG–Yvd9å@–Y²4diÈÒ¥#KG–Ž,Y² b©…Xj!–Zˆ¥b©•Xj%–Z‰¥6b©XjC–‚,Y ²d©ÈR‘eÛÏ/L­jd¢}²­Ë‹“Z)ù2ÍÕº^ÎsßÍíÓèßøùÿž¶ëÞs;¹µ¾îŸÌØÇz,ß—+vhUì[õœ5¶õ²):ˆ;‰Äy;˜Ëc%±8§è¤TTÅü^&5qÌ):¨‘Ì):©‘¥ KA–‚,Y*²Td©È²#ËŽ,;²Èr Ë,²4diÈÒ¥#KG–Ž,Y² dÄ2§è¤&–9Eu%–9E'5±Ì):©‰eNÑI,Y ²d©ÈR‘¥"ËŽ,;²ìiiáV6e·¦è Î»È€º£ÚI7’µ¢ÚH÷’µ Y:² dÈ2ˆeNÑIM,sŠêJ,sŠNjb™StP7b™StR#KA–‚,Y*²Td©ÈR‘eG–Yvd9å@–Y²4diÈÒ¥#KG–Ž,Y² b©…Xj!–Zˆ¥b©•Xj%–Z‰¥6b©XjC–‚,Y ²d©ÈR‘å<¶/ FÉË}Ž»›±u9E×Ãô}µnkŠ>XO£¯îú­)úª¿hŠNV=;Ÿ\-û­)ú§ãNbñó)ú§c%±ødŠ~A-¨¨&Š'Sô jâx2Eÿt݈äÉý‚Y ²d)ÈR¥"KE–Š,;²ìȲ#Ë,²Èr KC–†, Y:²tdéÈ2e Ë@–A,O¦èÔÄòdŠþéºË“)ú5±<™¢_PË“)ú5²d)ÈR¥"KE–Š,;²ìÈòùý‚:Hý|Š~AÝQí¤~>E¿ VT©ŸOÑ/¨ÕÈÒ‘e Ë@–A,O¦èÔÄòdŠþéºË“)ú5±<™¢ºnÄòdŠ~A,Y ²d©ÈR‘¥"KE–YvdÙ‘å@–YdiÈÒ¥!KC–Ž,Y:² dÈ2ˆåÉý‚šXžLÑ/¨‰åÉý‚šXžLÑ?]7by2E¿ F–‚,Y ²d©ÈR‘åó):%ŸLÑѺgSôÕº^W'*»8¿zø_¯w^Ì+©î^þùþÍùeÁ—ALÌóS[­~¶ô|:ÞöÞò¼%-{Í]ùCÇzÙù—{þ{|y<ÿ9q'±ƒxþ[ b%±8'ð¤TÄœÀƒºÆœÀ“š@æžÔ„2'ð d)ÈR¥ KE–Š,YvdÙ‘eG–Yd9å@–†, Y²tdéÈÒ‘e Ë@–,ƒXæžÔÄ2'ð ®Ä2'ð¤&–9'5±Ì <©‘¥ KA–‚,Y*²TdÙ‘eG–=-çÀüñ’:H=ª;ªÔVQ­¨6R{Aµ Y:² dÈ2ˆeNàIM,sêJ,sOjb™xP7b™xR#KA–‚,Y*²Td©ÈR‘eG–Yvd9å@–Y²4diÈÒ¥#KG–Ž,Y² b©…Xj!–Zˆ¥b©•Xj%–Z‰¥6b©XjC–‚,Y ²d©ÈR‘e^ ¦R¥:™;/øù£"êÖQþo­Ëë»î͹^·5¯åü*ð¯¾ùúwyõçÿ“Åk^D>ßóo}ýì=WwoŽoüåëßÍbcºÓ#¯ZY·>ÈqõÆœ'Ê<¿±áh]>ÓÚ2mmcÝzˆ3X(Ï'[IÞYî(Ïç[I®,7’·|Ê•äHµ¤Ú Rm©¶ŠT[Eª­!ÕÖjkLU˜ª0UaªÂT•©*SU¦Ú™jgª©¦:˜ê`ªƒ©S5¦jLÕ™ª3UgªÁTƒ©S ¤*©JAªRªT¤*©JEªÒª4¤* ©JcªÂT…© SU¦ªLU™jgª©v¦Ú™ê`ªƒ©¦jLÕ˜ª1UgªÎT©:S ¦L5ª¤ª©jAªZ‘ªV¤ª©jEªÚª6¤ª© S¦*LU™ª2UeªË+sç_’hƒÌFršÔÛÓ]Ñ:Û»DÄ­Noã¤z~ â/¯ooÞÞ<^¿ÿìÕõ»«÷W×o>ûûÕí‡ëü°y‹ÝË?½}wÿþñáøŽ§ñÒá?üsùÝ­Óeïy•„±ñQË7ΛUç×¼ÊÖgûëæ×p~å#JÛX·uMòyraù`y |ž@£¼³ÜQ>ÿŠ œ©v¦:˜ê`ªƒ©¦jLÕ˜ª1UgªÎT©S ¦L5jž@£©æ 4É+RÍh”#Õ¼ãéÌùðÆÍÛ³ßýðps÷ýñÍ7×ß]}¸}<¾ãáúñq«síùÿ(u~­o|†Çõ«uóËÖlâXcël?ºDTÛX¶>|/¨TT©çORwT;¨sÏ5©ÕÄ2÷\“šXæžkRËÜsMjb™{®A-ÈR¥ KE–Š,Y*²ìȲ#ËŽ,²Èr KC–†, Y²tdéÈÒ‘e Ë@–A,sÏ5©‰eî¹&5±Ì=פ&–¹çÔXæžkR#KA–‚,Y ²Td©È2ò­çsj•u.ùóP}Ù«ÖYå–:O17Öõ¾q”¯çGyõîúÛ›ï~~:=e·ú0Çå«u¶—Òóbå­ËƒoµR$mVëÎmj}“|°ÖÑj°uϯʰZ×}cú8ίÝð·»›åuó¯öü¯¯Ÿ¶žÞñêÇÛ×÷÷·çS…ù—Ém~Æy\½Z6Ó1Ó2*[—¯ž‘Ã͆×ëV3y°…raù`y |l¡¼³ÜQ>¶P®,gª©v¦Ú™jgªƒ©¦:˜ª1UcªÆT©:Su¦êL5˜j0Õ@ª¹måH5·’¼"ÕÜ6Šr¤šÛFIÞjnE9S¦*LU˜ª2UeªÊT•©v¦Ú™jOÕv¸ëù¨,W–Ê­°\X>X(÷ÆòÎr¦L5˜j Õù›,Gª¹måH5·¢©æ¶Q’7¤šÛFQÎT…© S¦*LU™ª2Ueª©v¦Ú™ê`ªƒ©¦:˜ª1UcªÆT©:Su¦L5˜j0Õ@ª¹måH5·’¼"ÕÜ6Šr¤ª ©jCªÚª6¦*LU˜ª0UeªÊT•©æä¶EDË—&“Û¹pþáÙºùéEek€:ÊY_– q§QÛ?=¼ï^~õðãí›ßÎ1îñ­¿=ÞÜÞ<þ|ö˜¹Ï ÷’;k7ý¸ú|™ì»._*CËl_æa`x“e«ÙGnC#¹°|°sý]~ˆœëîåŸîßß¿ùðmÞê|²l{rY®èÙc¬¦Àóëây”páäªsÅüÅÆÂõ´ÙPžã’ ËËå9^ ygùüK8?£­—ä9^ ¹²ÜPžã’ ËËå9^ yg9SLu0ÕÁT©S5¦jLÕ™ª3UgªÁTƒ©RÍåH5/r¤š—ŠF9RÍKE“¼!Õ¼T4Ê™ª0UaªÂT…©*SU¦ªLµ3ÕÎT;SLu0ÕÁTS5¦jLÕ˜ª3UgªÎTƒ©S ¦H5/r¤š—Š&yEªy©h”#Õ¼T4Ê‘j^*åLU˜ª0UaªÊT•©*SíLµ3ÕÎT;SLu0ÕÁT©S5¦êLÕ™ª3UgªÁTƒ©RÍKE£©jAªZ‘ªV¤ª©jEªÚª6¤ªl¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶´lÊþ8ý%SÕeÜtD”°…›óæz~Iéßx¼?|ÙÇîåãûëëÏ>¼{sõx}>mžŸÂˆ¹Òlãaž=Äùº±/yÇœyTÃÖÍ¿$ù‡³²õñÖ³æÆòÎrGy|’\Yn(σO’ ËË™ª0UaªÂT•©*SU¦Ú™jgª©v¦:˜ê`ªƒ©S5¦jLÕ™ª3UgªÎTƒ©S ¤ºì›&9R]öMƒ¼"Õeß4É‘ê²oä ©.û¦IÎT…© S¦ªLU™ª2Ueª©v¦Ú™ê`ªƒ©¦jLÕ˜ª1UcªÎT©:S ¦L5ª¤ºì›&9R]öMƒ¼"Õeß4É‘ê²ošäHuÙ7 raªÂT…© SU¦ªLU™jgª©v¦:˜ê`ªƒ©¦jLÕ˜ª1UgªÎT©S ¦L•Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í––IöðR«²Qïaã´•:æàÂe’]ªn­}cÝί°ƒì·W7ß.û³GîÏþâþîîzkçt^¡ÙÔçêºñHÇX-‹ý<Ý>\^„¬›'Ñ#oëè›o=$í,÷™k)ݶ¾.ë©ge¹²ÜP>O¢Q.,,”÷ÆòÎr¦:˜ê`ªƒ©S5¦jLÕ˜ª3UgªÎTƒ©S ¤šÏ0¢©æî`”#Õü¡‚r¤š»ƒIÞj(gªÂT…© S¦ªLU™ª2ÕÎT;Sív8&(ê—䣰\X>X(·ÆòÎrG¹W–+Ë™j0Õ`ªÁT©æî`”#ÕÜLòŠTsw0Ê‘jîF9RÍÝÁ(gªÂT…© SU¦ªLU™jgª©v¦Ú™ê`ªƒ©¦jLÕ˜ª1UgªÎT©:S ¦L5jîF9RÍÝÁ$¯H5w£©æî`’7¤ª ©jcªÂT…© SU¦ªLU™jÞß«ŒpïBF‡ËHÕú\Š&•‡ê?†®iòÃõño?¼}÷x|ÇÇ;R>݇òáø;?Ý<þp|ëêîøëûÛ7×ïo~õꛯ¿üüøö››‡Ç÷7ÿø;Ïׇ*²omn¨¹þÔ²Z7öeôRšný‘cçEÐ#ªm,[ŒTT+ªÔZP-¨¨RÏ3dRwT#Ë,²ÈÒ¥!KC–†,Y:²tdÈ2eK-Ä2oµMjb™7Úu%–y›mR˼É6©‰eÞbÔ‚,Y ²d©ÈR‘¥"ËymEù©œÇG6ò¸Ê¶>Ìo¬³}_>ZiëÆØ8<š§Å2Å|t;TgG<¯~z:Zšg‰:sžýúîøëß¿{w{ýxöøùZœùõ-Ťm|¤ãêÕºyÈÝ¢Ì/tEë\öóÐiþ™56Ö­žüñÁò@y4–w–;Éó‰+”+Ë åµ°©æW(GªùÄÊ‘j>qEraªÂT…©*SU¦ªLU™jgª©v¦:˜ê`ªƒ©S5¦jLÕ˜ª3UgªÎTƒ©S ¤:C–#Õ|â åH5Ÿ¸B9RÍ'®HÞj>q…r¦*LU˜ª0UaªÊT•©*SíLµ3ÕÎTSLu0ÕÁT©S5¦êLÕ™ª3Õ`ªÁTƒ©RÍ'®PŽTó‰+’W¤šO\¡©æW(GªùÄÊ™ª0UaªÂT•©*SU¦:´Ã<ÆÉ8"Ç8=_Êb}°u¶w)ç7ëÆºÕ§,/Š?t¸žRÏÇýþêîá»ÃsRßu{ö0óÄ ™–ÒŠo<à³µgëæ‚7ŸëBØ:Ý‹·Ræ?ãëÎÌHíÕ‚êê u4TwT;©k©,Gšyó_’Wä™7ÿE9Íë|‘¼!Ó¼¼Ê™ª0UaªÂT•©*SU¦ªLµ3ÕÎT;SLu0ÕÁT©S5¦jLÕ™ª3UgªÁTƒ©R]n Dr¤š—÷B9R]®Ir¤š—÷"yCªË«³IÎT…© S¦*LU™ª2Ueª©v¦ÚSµ>]àÓyž2\X>X(Ï‚äåŽr¯,W–3Õ`ªÁTƒ©RÍË{¡©æå½H^‘j^Þ åH5/ï…r¤šÛBQÎT…© S¦ªLU™ª2ÕÎT;SíLµ3ÕÁTSLÕ˜ª1UcªÎT©:Su¦L5˜j U-HU RÕ‚Tµ"U­HU+RÕŠTµ!UmHUS¦*LU˜ª2UeªÊTO®ªFäù ÂüÑQó– haîômykݱ±pøêtçpôzR}þþæú»g7þÓÝãûû7¶n™¶×!Ãcã~ý&Å5÷‹ûüz ¸0o=ÿ€ó ·æÍ$_nraù`y |¹!8È;ËŸßüÓùÉ Á/È•å†ò“‚_ ËËå½±¼³œ©¦:˜ê`ªÆT©S5¦êLÕ™ª3Õ`ªÁT©æ¼åH5çÍ(Gª9oF9RÍy3ÉRÍy3Ê™ª0UaªÂT…©*SU¦ªLµ3ÕÎT;SLu0ÕÁTS5¦jLÕ˜ª3UgªÎTƒ©S ¦H5çÍ(Gª9o&yEª9oF9RÍy3Ê‘jΛQÎT…© S¦ªLU™ª2ÕÎT;SíLµ3ÕÁTSLÕ˜ª1UcªÎT©:Su¦L5˜j Õœ7£©jAªZ‘ªV¤ª©jEªÚª6¤ªl¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶´Ü¢7æ‡74U]î'1OÒŠÖ>¿0ÓjájÞ\N¢ß/[Öç¿Ju÷òÕ·¹CýÙ;~~x¼~{|û/_ý÷«÷7Wÿ¸½~ؘ&µR$¯Ö°úxÇX­ó})ÑGEëò)è‘—-eë ¢ÚHÏ?ƒZP=P¤ÎçžAÝQí¤6diÈÒ¥#KG–Ž,Y² dÄ2/~Ajb™—¾u%–yá R˼쨱̋^Y ²d)ÈR‘¥"KE–Š,;²ìÈ2_·0æ‡ç“‰ŸÎóu $W–Êóu $––Êóu $ï,gªÁTƒ©RÍ+] ©æ•.PŽTóJ(Gªy¥ ’7¤šWº@9S¦*LU˜ª0UeªÊT•©v¦Ú™jgªƒ©¦:˜ê`ªÆT©Su¦êLÕ™j0Õ`ªÁT©æ•.PŽTóJ$¯H5¯tr¤šWº@9RÍ+] œ© S¦*LU™ª2Ueªyá#ï3é[ù¯N¾–¹á/ã?²Îö^¼T‰¶±nÄjl¸¼Öç$ú|æó»—_ýüîúý«o¾>¾'oL{|ëë›»ÿZM ó^Óuþ™MêÆÃ¯Öõ}±’7ªílï{{ºšÈzÝjÔ‘Ï“\Yn(ÏgI.,,”ç³Ç$ï,gªÊT•©*SíLµ3ÕÎT;SLu0ÕÁT©S5¦êLÕ™ª3UgªÁTƒ©RÍñ1Ê‘jI^‘jŽQŽTsˆLò†TsŒŒr¦*LU˜ª0UeªÊT•©*SíLµ3ÕÎTSLu0UcªÆT©Su¦êLÕ™j0Õ`ªTs¢Œr¤še”#Õœ(£©æD™ä ©æDåLU˜ª0UaªÂT•©*SU¦Ú™jgª©¦:˜ê`ªƒ©S5¦jLÕ™ª3UgªÁTƒ©S ¤še”#Ue³%e³%e³%e³%e³%e³%e³%e³%e³%e³%e³%e³%e³%e³¥ÜŠó«R™’.W>/µ44]]&ʽå•dcÕCÿ‡×/¾™ÿýÿƒ¹ endstream endobj 632 0 obj [ 631 0 R 633 0 R 635 0 R 636 0 R 638 0 R 639 0 R 641 0 R 642 0 R 643 0 R 644 0 R 646 0 R 647 0 R 649 0 R 650 0 R 651 0 R 652 0 R 654 0 R 655 0 R 657 0 R 658 0 R 660 0 R 661 0 R 663 0 R 664 0 R 666 0 R 667 0 R 669 0 R 670 0 R 672 0 R 673 0 R 675 0 R 676 0 R 678 0 R 679 0 R 681 0 R 682 0 R 684 0 R 685 0 R 687 0 R 688 0 R 690 0 R 691 0 R 693 0 R 694 0 R 696 0 R 697 0 R 699 0 R 700 0 R 701 0 R 702 0 R 704 0 R 705 0 R ] endobj 629 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 632 0 R /Contents 706 0 R >> endobj 707 0 obj 9651 endobj 709 0 obj << /Type /Action /S /GoTo /D [581 0 R /XYZ 72.0 547.649 null] >> endobj 710 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.963 649.387 261.071 657.247 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 709 0 R /H /I >> endobj 712 0 obj << /Type /Annot /Subtype /Link /Rect [ 363.437 588.787 486.982 597.787 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 81 0 R /H /I >> endobj 713 0 obj << /Length 714 0 R /Filter /FlateDecode >> stream xœÍ[m“ܶ þ~¿BãiÆöÌNÔ»šO΋kgœ:É]&Íô2®V{+[+­%í­¯¿¾ ¾HK­/_Ú&qŒ"A$A€ä~º`^ÿ^‰¿²"ôÊÝÅ'â1/ ½(%V’z,óÓ ÷v<ɽFœ¢‘‘äRi[ï·‹ö"ðþvñÏ? ÐÚ üÄ;^'ÂQÌÍÅÏÐx’úQšEAº†>ËsÑDä§@”;ïúí.ô¾ëdi¥½üϵ·5ŠXø QàÝ_|s{qý:ñXàÝnÌ`aäg)Ø9Mc/÷£°ÿ„ÞíÎûç‹›OÍm×5/ÿðn¸øþ–º†õÄä á¿Ì—3hò!‰ƒékvi¾áŸØ?L âSCJ‹ŠL¤ðïEƒ(«ò|x¤¥þ›/D–ø‚çç“!H-ãOgÕÙf'Ã(Ú^îMp2™Þn¼—^ú¹÷â±;húÈÛQƒ±Óäa¨4MóðÒ”ÛV­SZUç^Ã-0R¸©róó;#«úlØÔMešéú?¥rÝŽUÏ˱~¨šGSàq_YEœ:”ÝnÇÛõàãh[V ƒS3¶ÔË’ƒø~ßÔÕà ã¥'M#´å}åíûnÅW LÓuëöÞã£(àû|½ïù޽~7˜ bœú¬÷§ØúO}WVëˆf>ó½ÛÎë­GããûZ”c>¤…Ä¢+a†²Ø¼·¡£Ð·Ý^˜ò*†é)†]Ób¤4PÍ'‹*¿šA›Ú‰lQ],8U_×Ê¿H¡dÇçj |·oªëáS3ŠÞ÷åL Ë¡n@]–|¹u—s.ŸeEù‚€Iï/8ùYA¥ ôR(<€Å†Ã€ùq¦ê-6Üm4 3®×à Lùç72Öõ0öõê0Ö]kF³s×Þv»ÊªÙWåØõfÀ:ÑôP•0O§QÎf*󲬆êÅb÷Á¦‘¬GCn4I !€Õ¹?Œ•aÔF ®Wr2žçíãª[?j\5ƒ)w÷b× ¦õ¦þˆná¦ïvFäÖTk«ñØõï^úšu»µ4¢…àX7Pͨ6\ÕéåŠhf¹t‚ xs¨£©«Ž Â÷mcÀš|ÅeG‘Q·ÃÈÛ²úZs,™ÒèH’ÑŒ¼¿¯FSlphaÍ3dÜTýCed€oj…×ÓͶ®äFÖp#ãîöÔR,Hf¦ZW~h„Î…Ÿ‰É9ŽÐú 0N\IâxJrχFB{ÏK=»yõLË)ËîÐêfjÝÀªáíGîìê7¯–š[¨}Ä VÒmuT¤2¸Ãoάa¦ÁU˜ŠÕªæÁ`Xb“Ò ì+>VkœÙÄû~-(!Ú¨€„o ›5¶ªÖ–„ÎjoËÛûjAºž„õÔ"üë/ï. ‚h¥où®²XÊÒ—c…s— ªˆÈA6Àг—Šþá»o¾Uôº‡è¢×Ÿ:]áöÝ"Çþ ý çY)À-§+» –µâÈЄ;0³µÝ Ø¢,€Ñ½X¬ùEÈ`? 2G­_tç^ãˆJúÕAD2c]rÚ4ŽÂxØÏÄÇÆ ;(ÂüéJÅ?9(§Ñ™Z°Ãˆö}…ïŽñŒçû ¬Ðf-'CIŸÕŒb‚`hhñ1Ê% Â CÅÐÝXÄ4ކ¯®ê¶©Ûê—òLTqN€Ñ€‚Ò+!Îpð†åÖà®_èÀÝݫ־*kéc§Â­ºý±mÁî–™öî‚Ü1É|ŽÈÀß—°~¹gQù„–Œ…‘C­7°Á|÷Ϳ޼ÿñûÅžE”žñ²Ð@|ž;\7õêú)&ó ÏfµÕp_¥ÉÙì"±DT,„'RžbÆ¢s"ŒrŸ'š–)‚g[èæzõÌp&!7ÕnÅ(/Hè»n4¨©Àň)Ò*ÊGd' ȺÍxä¶ådÄÐ4r p­À¢˜uøîÅktH‘È| àþ,s´K‹…ŠtéQìÂgyu&± >Kz Q¯€íþ¿ëýòüI‚srl½[ô|_Ò,Ìr?!gÌ¢Ð!±üëÝÝXí–5ŠÂà\ýË©õú§¨±Ò@ì8sˆ|ÊDA«3",-ŽbëµðªZ6Uà…ŒèZØçÚBËË0’dÐâwe*„*v%¸ãâÍÐY±ôW‹†Pp ”š8 _áò#\ÛiÙºuÐá«’ùèYË…‘{Kºb~èG~|~kŠb‡i±Àg"¥­4 )¸…µÆCÇ-fS^‹àƾT“B ÐN’ü 6êî8P¦!Yä7$=b>’’¡k/5~û|§éûÓKªÖiâºSwFómæÙ_¬¹?ßs¤K.Bç †¦AD°çãÖúÔzyè =IÓx”9TzÒ¦M¤iRä cF Lf ì M~y¸4¬•Œ—Ú5Lí‘"DÕqn•xtâa<ß)û‹m$1ð&öÖÐàþ2NEHö=©®Î‡$莭¦—7 q¾/}š9Ô|’Õ!V_– 5ËÚ×èîůmýÙîv?h„néA&»dMÁä7ƨÚ#ø÷5§c¯@ähƒÁÇzØ:rà0™ûpéª2¹ ·µL1$(ñ !Ã…©I5ƒƾHr¥ Aw׊_¹‚@b÷µb °Šö.aëÎÑø@¾›“Çã6IÓÌË´g@qnàO[ºD6ßBD›ÊÒƒ'\²·8à ط™¸)H ‡¤¯nß¼½ùjÙƒW8SÛ‘XÅ×Äsçµ`yîÇšI9ýE¨±<ÅÙÙÊà¯õuا‹(Åjð7Ø. Õ)]Gx9,¯§2Htg÷àÄÀŠ48cÿïÅq¡nJûy3– "Gyýý¨AnŠ{‘Ì‹ŠÔËcé¢È=^7 $ b£ÈB;/†„eÂjËÔxSÁ‹wt$ò—x&\³Ô-úI«ºlžúE”ƒ¡•"Àˆ'Œ'h"d…ùᬉ2æÃÎîØE… NT±gÓœd›æˆ¥ô˜7ªÔ°Çf>sµ–µÈfö ÖÜgîc˜ËL\Ê,Œœš?âý›y>âða8Ð #OÕ[Û í =ìyiË¡³IoíG«Q}@iÇØi}ƒƒ•ÕåœDb•ç „éºBi÷ÐÕk ¯÷ó{ a’(š™DœÊ‹Z°±ê HÒÜi\îÖš†¸QzhD^HzÇ?V¦.X§æ¶ðc;òÏFHÓ\ñ¾ƒˆÅ׺Ñ6ïï±󉣰‰*e´¦›/ÙO\!tƒØ,JbܽxßZð׿¿ý‡Õ• ¢’ÛE'‡Ûÿ0iPÌpÕ³ÁV¬³E g`aû8ºÏ}¤ ­¬—"Ró ê«tì`¿n¶÷€…‘ã”é´.ï”ù©6 ux%ÊDÁ²éGä¨E‹ÈzãòEɫʖÜm,uÌ•§‘ÒŸ´bÖ9<2èÞY5ku@¹ „j¤§'5à³ðÍBì°ºUpØ™e³²Í¹õ%Ž ¤¤0—ñ¦Kìiû}‡YS¸ VDHÏKt +G×ëU¼ 3§Ï Þˆ½þåÐú¾?¯„ßäÿ§â}¹Åf6AA¹¼bL93©SùŒ çc‡8,fVÀ%á³¼…® ¨ú·„»jø=®Fäàá(Ò4ÿÐ+&…¶°¦2ðu‘†v‹¶|k.’ Þ>-ÍÉzñé-s ½×ø†^M},Á‰:L¡ÇÔ„t²†Ž*žd#M3áÒp””@¹G Ô-²Üz=!\=ÚZÄÈX>̉?uÂ"tôBŸ3'Ïѹª¦qåÍf½2N?/¡æ¾bZÓŸXï-#é݆¤9†Ôjø®nŸ/=Þ>zò˜tx¨{y|ûÑ®n«Hœºüº8‘I"ȃ%¾—/çz‡FÍká….Å;7¾È 3ñB²ÈÂ$†a‰!+¼’pyA&MÄ«p•”Bj  ‚ˆ¿« ÅbaºcÉh<6ÔxøIÀŠ”Íólʳ|Ú†aM³1‡> ä= ¹ÊQ#°B!ÊOš gíØ:YvžìѤ(sh4a<ÁD¢|˜S¦Ub)uæm“6“›Ï\»/*“ͬƒ¬ãè|±ðòùI|\ä> ) òàŸü{Wxï;_ö®®`žŸ¹š ¼Ñ$Š"J{k #•ÒÞBèHç³çψ­#Ù oRâ×ú|‹ùwЇ ŽÓ¶´÷¥šöÂúPdÅÛJé®ïíÆWxooº8ŽÚSÓg¯E’(š™ìÛw¯nn~zuûfÑÒàÑN«yGõ’WÄÑrÇ]ŒõØÈa™üÀâ¤×¬ˆü0e°åÄÌ¡>B"¾ÁEÒ?Öm½;ì–× $›KŠ‚….©—JÎ[œD’¦Ã"ú]É£é,×l™;&Ü Lè$I“5Ö¦Yœcãl¦f¨éìy=q`|ׇr4 ûÖ¥a›Ø‘ýÆ[>„m *K”~™=}zúu»6¨ÛœÓ^Í+ß°ÔUõÆ¢WUÉõ+úíãÛÿ¤9 endstream endobj 711 0 obj [ 710 0 R 712 0 R ] endobj 708 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 711 0 R /Contents 713 0 R >> endobj 714 0 obj 4181 endobj 251 0 obj << /Type /Action /S /GoTo /D [715 0 R /XYZ 72.0 720.0 null] >> endobj 254 0 obj << /Type /Action /S /GoTo /D [715 0 R /XYZ 72.0 149.068 null] >> endobj 716 0 obj << /Type /Action /S /GoTo /D [581 0 R /XYZ 72.0 503.283 null] >> endobj 717 0 obj << /Type /Annot /Subtype /Link /Rect [ 381.873 98.096 513.351 105.956 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 716 0 R /H /I >> endobj 719 0 obj << /Length 720 0 R /Filter /FlateDecode >> stream xœÍYYsÜ6~ׯÀ›å”ó>üèC[vÇŽT•ÝÊäCbfññÐHÿ~Dƒ”ó–]¥þÀF£ñ¡Ñh@>ñàïµü‘æ)ê‹lóI0Á¦8!~J/#5AÅ©¤âB”*(†S+j+p ¿_4ù×Å‚RI<“Ó…çWfn/¾ÃàqBÃ$Ëó} ¨Ÿerˆ& 5yó©ȇvÒÖÞKCÞÿÜ{Û£Ðþ<òÈþâÝÝÅ››˜ø¹Û™ðƒ¦ ðœ$ÉhäòO@îjòÇåíCu×¶Õë?ÉÝç‹w85ÕOOÿR:EÐâCyË/VtÍí¦þG4TmÐBƒæ ?U¸ øS~Ðb<¤~¾Hš²:Ÿ/ÏÄÔ?9øË+‘ÆT¶Ñl±¹Eþ2ªþaΜe”c{Êžçç‰O:œYHül13èÓ0Ï=ÏóS5­¼¿Ú#ém7ãЫiJvV¨ñH˜Ó$IÀ@xfà5ICr9›AÌš¥‡Q÷(WllŠQ´Í¬Þq”ÆžïÆê Lªžu§ ÏíˆR»xƒr7j w¢“ô°ÃAÕ³zù0[›]Ú5o†ž*f,.bÿŒ‹OÃ+9“0¤ÒŽþ*ÈYoÀÐ΢RÉãÑj~ä«f<ùƒ¼¾¾6_>Ë»¶³œ(VàĬÁÌ ©øS²hÛ{cÌP§ðæRPN¯Ö°½8µcUš™ ¬Î:\&á—¸TqKPU(©E›Úô² V3—’òd’v(À$õ×áù( ¦íM¾M¬KÔp^ö›×᯳¡³NÜtzüiE¥p`ÜñDo ÇYäPŠ%Ø–õÜ¡òÑ’VíØ ätÐ[®`Óvõm°mÈFnÂH)v;ÞGD™|s“;‡N¹Îƒ$ž;ÎØU¢Ô}\?êKôÑi–šØ"wðÂ~ÚÔ;`vmãn¯<¥‘€Í(ÞܤÐåü°šf~ž§I¦l|ëÚ‚—#œr> (ygÄ £’w·:SȱH–«Ç±Ÿä4¤›>Ö)þùF Ö´~ûÃ@ŠJžÉ’‘ZF«ŽŒ-+î÷d™ÒÝ—~îÑ“¹4ÕæÖR®«f§\” ?yD»ë }H¡kè¯eXW 6Ü‘wT>®Í( îVer-Ñ:ZKÈÒ[,Ù`³T+GBå{*¯•YŒ Ú_K»®Ú®Êåë8¢þ|2+pdêÐÆO­‘õŽ0-ü‰ÃtÛÂÖY%;”UDÐÕˆeášc;p»Ãv´L±£,*×=<©;Ö<èb€nª¿ã{Ñ4 tµ‚ìðåö’ÇþÈ ¨Žø´ädYIíºp ™n|òžpbpBÀåxe¡ÚŽYÁçx"úk'«öþÀš='Ÿd$SJ€Fކç¢;ö¡I/s½Ö²¨«öIVÞ×+çk+‚iV3bFœÞ®ç×lÕu1"8ý8+MCk ³¹T'¬VµF)agÛÐÐn^¯zQÎW l°nƒ–KWª$al5–{eÇöVÇÁv`ÁO·ÂièŸqª_eä»nl=Ì Þ²Ž´¹ü¢]ÁzzS@ xZùдƒà†mrXɼ–îB¬ÛŠj51xfŽsÞ[7^qËö³=XFÛ»“bàuï’Å([ns¨§+,;[¾ƒŒî.&\«—tJ÷E}„ãíâ·…ÿŘ endstream endobj 718 0 obj [ 717 0 R ] endobj 715 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 718 0 R /Contents 719 0 R >> endobj 720 0 obj 2372 endobj 262 0 obj << /Type /Action /S /GoTo /D [721 0 R /XYZ 72.0 720.0 null] >> endobj 265 0 obj << /Type /Action /S /GoTo /D [721 0 R /XYZ 72.0 411.0 null] >> endobj 268 0 obj << /Type /Action /S /GoTo /D [721 0 R /XYZ 72.0 277.8 null] >> endobj 81 0 obj << /Type /Action /S /GoTo /D [721 0 R /XYZ 72.0 180.6 null] >> endobj 722 0 obj << /Type /Annot /Subtype /Link /Rect [ 180.547 626.1 265.516 635.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 68 0 R /H /I >> endobj 724 0 obj << /Type /Action /S /GoTo /D [581 0 R /XYZ 72.0 103.989 null] >> endobj 725 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.137 86.1 539.999 93.96 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 724 0 R /H /I >> endobj 726 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 74.1 300.0 81.96 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 724 0 R /H /I >> endobj 727 0 obj << /Length 728 0 R /Filter /FlateDecode >> stream xœÍ[K“Ü6¾Ï¯Påb§ª›Öûqt&ñ®SÉVOU*ç ii¦e«¥¶¤žÉä×/H€$ôœÉ%»N\æ‘ €$²¿\yŽ ÿíå?Iæ;‡ÓÕ¢yNâ;AL¤(v¼DÄnêœi”:µ¬8*Ê*T •j#8:¿^5W®ó¯«ßÿ€J…ãŠÈy¼rg͇̑«Ÿ¡ó(AœfYF²úÂKSÙE b(NΛ÷'ßù¶Uµµô’‘û?—žKxþÿD®sõÍÍÕ›w‘ã¹ÎÍuÏDƒžã8tRø™üã;7'ç÷×¾Ô7m[ý‡sóýÕw744l'LJÿ¡Tm’âS{± )Ë‚5om9/ŠQÖËáÒíiÇ»­ºbλá‰Q¹`0~ Š®z(9?ÔÞ²㮿Ïr‹®xûáÃOooþ-fÊ‘ Û–¥'Ý2ˆ`¾¾.Ú²o^ –Ð_Îç¶c„\™‘á¼{²¤².Oe3ô–‚‚SùXZ †x·£%=ËÆ"² ‚K_®ðÑž‘M=#ðS‘¡ë…i6üþSÞ­:UùMwLG튼'pV­äj\ÐÁÌXI6éôÐ6C^5d€8†Ù¼>ô0AfYøsNý—z€5_l)Àó<๮ï…sV‚s}é-z<æCI~Œ”²F»!" !ólgá@¶GT5ígÖ’ö)ÖU5ÛË0jÿʼn+27p½hi\Û>‘…Mmß=ˆv8²‘åLC·]UÞÕO3sgÞ„_Qö‡®ºÅ¥VZé7ƒ-Óh” «ÕÞ­Ôšô鹩ˆBˆ 7™w¿Þ ÃK2¨›Fóf7¼ÃoòŽ¡ÁwO—Ó”]b‚ŸÅÙß‘" DäÅ®‡›Â÷åA®õÂRho Å©­i¤ãó7„Ö ë•—TýØXp‚Éi‘šØœO?”ùÈJ3ðÜ`2rzÜ7åÜ9ä£EZópÂBî­ò\Ÿøxv"w`?YhîHõ­vƒÚnì-÷ü®ªËÕž}/ÚhíÜuíÉQú?´EéÈ `¾Åy~8õHµ@ÜUVQ»tõWÉhzŽP ½ ï‘–-B:>Ðíy´ÎºœÇLº¥Žíö‰7îi©_nßBq̨Jÿ^vâ•x‹þXÖ5ÃyWå·Ö 3sÊ/ÆÐ*Ò!ž /VÍAؼtd"&‰°¨F‹E=VDh,o¸9ôÀñ1 ½…?Ah³îã¡»ÕÖtŽ+ù dI<áF0iâtiðûÃy]”4ÛjjúþÈ5ÇT~¹Ty 1×órúq \Ï˲`qÜûI4²´ú›>~-Œï_L¹i­t÷íÈÖ­-æŸí°ÔÔ!+œóƒýp,»r>íÃt"‰â K™ Aþ<׸6#>¶¦ÌªáÔŲꋹ)Q´ŒÀ†Ù†tsÌ-‡ª_àr wmwÚåöl´ ’÷Ÿ-XáT´‡‹Œ®Õúƒ¤GœÓTµakl;ØAÌÕ»õUÍеÅEmž’OˆF¢â ,—¡…õ£î…!ýŠb#@óc¹+û3ð©`±1´;åÏÄ N×[,W¶{í•ñܯ}áÁIv>®o8©'¢$r=ß÷Ú.ŠC‹?ÉÝZÕ‹dZ´˜éeUöŽkáhµ#És3%þDD¿D‰ ‹\…Ûå\1Gåcþ`?ã«2:¾®ß`ÜÝPÊæ¡êÚFºc^ªÞSv‹Ý>¶—ÚÊjb+„6ÂG\Wì#œ¦{a%‡æÈüE–øQ ÓÝ_©å4L„N˜€Æ„™"XÝÔa ÂX†ÍÉBÇ[±G–mµ´]›0ˆ0;Ì ¡e£Ë_ ²—º0 ŠHýl¡ççcL?·Xøz¤G3T‡Ïl0“ýnÀÜÅ3ò~$|7uÝ$õºßŒ=ƒ0Ûj+l÷oÇÒ|µ.N \|І›-ò¹_g¦æ_1ÝÝWÌ%ófžÇð%³¥î¡Y,óÙ¯Ïy—ŸJZoHåŸùa¨Ÿ Îí'œ,XÖÛñQÉj@ªB´îwàñ~LYƒ¹¤Ÿ0Àó"ÅEæ‚,‚ ÿæ%y3˜PÂKÒ,â…ŒˆÕÝ⋪À ,B 6¨¨‹æ;W?„äã.i#_0‰Z‰ö.Gd‚ÁLå?YBn‹ßû͵E6{Mltö!‘±Ly\eâ±v2©ÇšqÑ7&£ *t=ôÂø÷{nÝbqºÕž©Ã,ƒóQ™L¡´lXU37œXÆ©xë—k箂(¹òæ¯Üù¨tʘ2Ƕp ¾ô—¼†Ùrjaï8´ÍCÙT…ÁÙkÞ ìÃò¾/£{ùO;(¥º¸Á`JQ–PuÙîãno>‰€‘À(¼…¾6³©2¸ÞÔôÌ’© ³<0I][K;C9œPN9¬öJ[šz¾°*˜±SE}%eÚð®`k‹esto3·„ܦGCTù,™q#ñóþ‰„ FÒ/z†)Ûˆ@'±õ°À2XT]y€ÓÚ“`Ä÷Ã+έ…”3ÌYù¾m ϬÖÕ÷@90'™èÕ96$™ÜÂîÒ ÕHÄÑÑHoÚ¹³`¢ÆsW>àAzAU‚sÛñ³ª«áÉ1\¡ }ô$ªËì ÚfÄG/^¹‘B¤¶Ò~;öQ_aWí™I¸¾Ø…¡p=ˆ„Ã8ZPÆKv¨Ðs·X0E¶¶Ü·§r2ðùÝ-XmÌË8,dÇ OyÇèÈlÝf9¨C£:©1¥¨_«¤·Üä¥AU¢R+V ó šb.Ø8ŽðÂEuxê¦:Mý”®•«~èªÛ‹J ê5Eí>ŠëÛóyëÂ9€˜ ’ñ4!~´‰z°?Çf%Tè¾JFdëQòº¥d.b½4SˆjŸÏ5¬l2?³cä»–W’»H!ùòžG5F H’Çrd,õÝb³¹È[®‘f`¿W¦™ v赑N«#BçÃò(kOŸ ŒRéHÂ+7,ƒþCϹã$_`%W“ª½°ÖÕPž„…ß™ˆ…Æ?­ ¯?R¼JX¯‹s¥%éDiÆØ0W³‘±õ®m‡sWáÚG4ºA@Pp'·ä¶©y-Øõ1$#<Úˆ¤7"ê×lDˆ¥áȃ„˜E0¨ç "íZÐ[e‹…ÛÒ s'3Þo> ð}:|»¢tÉK–Ï¢EyòŒ“dƒAEøTÖn¡€ñú˜=k@ ]q{ ^âŠ8 +Ó¹Ï÷ä o£¹gü³ Mäk=×…5qY˜í;?ˆüÌʼ%Œ9Qv[†c(ÓnŽQ¢÷c#°®™DÏê¸mØÄf.ºþDX ‚ä«Û|Ìi£Dp[2ã ñbEXÑâç'¤|”—Ö¥ÊM<”áâ:º 7«£ŠpÒdUy9+ÿt½ã_hFD·©¶ôc!„`Ôùþ‘eÍê{~v¼ #ÊÉ5 V:‡ƒP'-¥Ìûª$S‡–c&„:Ap=ð2áË+3pàé_Eûi´Å‚I¡UýŒL ›´¾š3|ÉJorXӡμ!‚9ÄÐGó<–2§8³äySû›l#Ðdì¡ õ)Å¿„LRŠðw÷ô( …~Qu4™f3=›™éëÚ';Œ“}Xö¨E^6²ã,µ_#´!¯a±ÈbcUŽä^d2Ê “¿·*Ï[ʾcßæN°¼ž‡Ý#ÅÔþŠ/Øä!/’¿ñ£hS$vK2Þ½@Fß‹Eì*û¾&ãöN$?K#^ævV†üph;ý»$¡Q™žm+pè*X™«ÜRÔ ©àÃ]iª37óéDáúËí^? Æê²²y`ÐÝã:})Å0JˆS<ϧ+›_®yºuÞ^¤:Eó¡.gÍø~å7+°Êìœfê°¡F£.,ÌÇØ½ìŠáªç­@ó§3hð¨Ó3¾yw©Á¡+í+RjÆÊœcÉqþ]ué¦2IÙÃïùGùg$ÿÁîqHz4Ç_lÍkçO«ÇP©|Ï0RéH«"Œä»ã$^à!»÷6a–WÅ—‰‘+¢D«­?ȶÛÞ¥†w¾·ÅS‰¡<"^FÓayf9ËV,·09?bÀ9c‡å ¥YéË—…}·FÜ0þ4Îs÷]~²„Á¼âcæŽå/TF ºÈ»¹(°‡;—¡ªÅ/×ògdxW°ß;Ê)¤îsu«jöcÞä÷òð>!|aö¯ª"Çoæw@™Qû#¦L¿<Á2íèô1ýÈVñ6ŠCLŠë-1aÑ =Ô°ŠåŸ9,ì£zdoPÄC†!à#ZÓ‹-¬¬';¢œIºþÃ¥À>e˜æš• xB’5K„Äø.y«]ßÞÌM†“àAoЃÞôJ1o(“‰?f,;ñiþÖ÷ÓVÎú„ õí3Gù“ÌÿÏNä endstream endobj 723 0 obj [ 722 0 R 725 0 R 726 0 R ] endobj 721 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 723 0 R /Contents 727 0 R >> endobj 728 0 obj 4163 endobj 449 0 obj << /Type /Action /S /GoTo /D [729 0 R /XYZ 72.0 708.0 null] >> endobj 730 0 obj << /Type /Annot /Subtype /Link /Rect [ 246.86 710.1 348.86 717.96 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 709 0 R /H /I >> endobj 732 0 obj << /Length 733 0 R /Filter /FlateDecode >> stream xœÍYksÛ¸ý®_:™i2cS|?ÜéÇvºÎ¬×»±¦™v½“HH¢K‘ AYQ;ýï= õ a»Ÿ¶u¤! ÷^ÜsîÊ·‘Ãlü;£K”¸,]޾µc‹\æ…íP2'²B;fKÖ>ÄAÌ šxtKSÚ[O¶³õÂ}•#›ýeôëo˜”1Û Øfd„k1÷£_ <-/Œ“$imu-'ŽI…g…¸I—l|³tÙU¥fwÖ“ ûný¡EžãþXd³ùèÃd4þ0Çf“ÙžŽëYQ?‡¡ÏbËsúsÙdÉ~}wÿ­˜TUñþ76ù4ºž´[Óëˆ<.>‘¥tô"ðíã7ìÚïGñõ-OaÄrì^- í•^t·r¾>ëVÔÁâ><ÊS¿§ò瑈<ŒXñŽ{àûcRýÎ. HºŸßŒ=àÒd!˜äËU!ØçK6Ëq•‹jS²…¨«…Ì3!o˜Þñøc2 j[qhã/tâÛeûÉ‘ÿüdmÇX~+ÐÛªÓÞb7 ŽI^ðœ&Ã¦ÝØ}aY^²mµ®Ù÷¿üxõe¹lê|ºnòª<‡C™¾ʃ¡ç3¯OgMñÇò¼vYß«[!ü{°y¡å»´‡0Ñ“¯¿kÐ˱ØýÀpÇMÛJ 0"Ê$‘ø€ŽÕó!\æGÈ Ih¹x‚V`>¥Îì“|=iÉü09)hä@LÁޤî˜l¶“ê¡;ùaЗߎtõ¦¯·›ú‘eÃuØœ6e0ðßCÝ¡·§E¤,?_²ž¯žÀ㑜W=Ó³E LÙyÂâY‚ÜŒ Ï@“å {{“³}`1ßs<æÚŽsf‡ø0Û=w’s/þ;[—’?‰Œ½í‡®ÍèÉõßÝ(/‘шîTO¹døðƒ<“Vå,Ÿ¯k®ÂLeµ„Òé–µÅí”]ñ†O¹·¼äsQŸ•Å(½¤Ìö“N/3|·¬j¿Øª®æ5_²fw‚UõÜZÀÙÔ*ò©õù’4±´àRZC%ˆ$ŽyIØ)¹B ʪt½eÓ;ãÕý¯ój-Ù†o¡·"ýXGÐv Š;lÐùϺ×qÂoØÍŒ[5eU!¸lÈé¨K¸}Z­&Eº®óf{JSJý(OS!•qCMn0@RåɶJ˜6à=< s|îÄœ0Øaö7XŸò’ÕërçÀ:Ÿ/VV¢DZ­¶y9ß{,VÆ,ª%`Èk‘6U½5¨ üžO5E ª$‰Ã¡?p0þùgg¼fãoã¦ÚU)\Š¥AT„Žtû^| ›¼(v®`³¼`ëºÈ3–‰Y^æŠOSQ`û(OUË-ƒ83hнA ¬D-«’ìV,áš³»²Ø²¬ )x‰;æ6€ÇÅ‘³ä O5ëZŠS"XÃaݧ«*žK`@f#栻Ʌ<ÅnŠ|™7ì>×vÈlòfj.ó´*ªÒŒ®>pÁs!ɬZ<å’ô{žјDÅðTÑ‹²ê %o’3$6´ÛfºÎDÕÍêj© † øž·È1dÅX±Tí‡N«å’hwòðð¨>1mÎs^×·Ÿ¢Ç'"ªÜÊŒl‘ØvÂÒ}ù?t::gìí¿°´¶(˜þmP‰bôZ^rC¸D°Ì=à:R-±n&x£²M–ÁňU¤L çm6^m@Ô“¦æ¥Ìeu/6 ÂÓò]æ>›Ež.ˆŸZJà*¼‹³”¯ …ärÍNˆ/tº.Ä“@JxBš%ƒ¨R.l½|ñó »_‰T%{JR‚u¹‹Âq<@ïK^fÕFz5²µò¨ ‹Úˆ‡ø ¯3&Q  FØË³–ôX$ºW&%ºpÜè0ÿ‘‡ž*äÊf²‹eʈrÅ) °%]BgÈ”ÈÀ ^ÃPf1öðN¥±.ÏŽ$Úà¾(3ít¾Z¹¡­ö#ÆN‘éö¸Fléá½Á}žõÀ7Ìq‡MÁ…9>¼+«òŒ^ÊæáýK ÒóÂv:cs¿ç‡ÇnÇ\ö˜MÓsÝxœc}³in`ž„=G9JŽZwa˜=·¬ÐÊlP6 s£×k´kôÞ…§¬¨Rºì÷¢Ûà â]È`oûýÍ÷|Gùëü0g³é¸ø'¹X7¨òÏM½ñN¿*¿è[ßí—Öç}ë{ýÚe46ù|ñÓýÅåäæî§¯Ÿ¯/®¾^ÞÝÞÞL&×W1¾ÛÙ/Ô³u5Aª;P˜âHçó‚}bו‡ùu‘š?pѪ[Tú@ûÐP×·{¤f25•Öáü<Ô+¨–û7´12S|ÏZÿzk`‘½^ýxX»³¥hÎ4о×H›»PUi4|]4]åAlPd7(Kì>HHt«5R$ò ¥XR©+Ó®;§$‡LZÎ)¹c¯;*ÑÜ“û‹cÖÃx!eÙ¢’Í™ä¦UýBÙ#ºœÇ;1N¿¾+«£RÚÑk±x½ºd˜â÷ˉaN Ï›îó´ÂaA˜Dy#Z^hªû’Ý¡ÐÄ“ (ìíS÷`ª¯/…®Ü B{Ø$q9ÞÒ¢¯êœè§Î›(æÝQÆ '£ET³Mf%ýª³¡ŽËy ÒcEg@ÕÅckm†Øð²ÙŸO…N'J‘h·ÿ™¯ ¿ØÁ±ß߀õ{¶S7:G#¦šduRÞÑÞÞ}¾¸üñúëw·×còÊgp²ˆú¡§_®ÞtQ„O÷{¸›vM·ò¨TqnŒ©ÐõÞç81+ó; ѰÒEuðãwç‰?60á©B.ìz¥y¨Êóû(’@:6J¬H!QeÔ“ýÓ²¬Ãã%MÇ…ÐïÊ7ìg°nZµ§ŽÎ.IéÓîwÏÝÎÚ¼%¾¯ªºùš¡£ÿ_øwãx endstream endobj 731 0 obj [ 730 0 R ] endobj 729 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 731 0 R /Contents 732 0 R >> endobj 733 0 obj 2251 endobj 735 0 obj << /Type /Action /S /GoTo /D [581 0 R /XYZ 72.0 458.917 null] >> endobj 736 0 obj << /Type /Annot /Subtype /Link /Rect [ 228.765 396.823 337.532 404.683 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 735 0 R /H /I >> endobj 738 0 obj << /Length 739 0 R /Filter /FlateDecode >> stream xœÍksÛ6ò»~n&336Ÿ¹¹™&ŽÒº¤‰•ëõªN‡’ ‹5EÚ$eÇssÿý A*¾/½S“ »À>°»Ø]@¹›„á¿3ñ%­÷³;#(¢ˆ…„ˆD^ˆc´Gˆƒåbao(–è!“X½Z;ôó¬˜aôÍì×ß`Ña/@3ì0Wl®f@xz,Œ“$ѺRıÁ¼ë=:¿ÜSô¦”«[í#ü?×ÞÖˆú F׳׋ÙùÛŒ[„2/ ÁÎaè£Øc4Š{ôëó«»|Q–ùÉohñÝl¾Ð[St"x(ü‰<A½‰ÀÇý+º:¼ÁÂ_ßc °1•k‡êo1Ñi õ=iÍÊ"ºGZêÏ>퉈Æ‹{ ‰eû~PýÉ&s¼(d‹ŸX bʆªëü#Ÿ€eièQ'I„*޶À„A‚‰‘Z‘ ”M¢xZ[Á‚ntÀN%GÎt(4v÷tœüDó6â4ªKhtT ¬¤ã%¦eFjÓjäì{Â%‘p`ÑÀ‡­´^Â/>ö| ÚºE«Òª[ÛËXÑ„B^€I’Q[èðÑlL¹ž÷I«ƒ’:%6ü‘nØ\m¹¯ín/„ ¥Ûð¶ ÜH Ùw5¦ŽØ6ð@‘/ îÅÁpë]¦IPÜK4Hô$Ž Í@ΑyÁçʶhùüÅ«O‹÷¿Ïÿ1¿ø´˜¿Yž¨dCe‰â$b¨‡UÅÓ—R>“‹–<^l@¦»œ…^"Ô‹“Ð^ÞS ý 5Õ+â‘l l‚Äú´)6— :Ag …úóü¡<䮸×yv½kòGƒÙ—•5Ï·Ûlñ¢9µèïœ×µ*žgé*çÖê¦4ã[›²ÙYr^[Se1±læ9¯¾²$ÖÙÆšÏŠºá©µ×rÛãäÚ?"`¸cæÇÊpRG‚ï)ʳŽš]V¿ìjÓtƉ}/H|”"ï0ìE²¼õò¬ÁjM{x FFÃEž|Âá„åÌòט~–p5!$€ Ǭªf#ž®ŒNQC!t ¥W¶ÌD[¶ì¥¢b õé!ž`±>ôY¯zT¿z9ÚØŽ8f¨ÛS’™m]܆–9–ÕDHÇÖ†±“Öþ‚žØ0] ~3Ûr™¡gÿ:Ô¼òvåžÿû<=4¥Wßå#ldbÁ†Òp*Ýd,ÑC% jø±–ÿJžjȇpT˃ºô¥ÀÛª\AŽy4˜ë$¡Sà 6€Êj|õᇯ,)Û,çZ—û}Zl¬ùåómYN÷·6E^¦›¬¸¶dY«ëô¾7²­Éu•Ý6¶Î«¬H+kO›´IOö«ñÀjo®þ.ˆHèE´<1p“Þpñ 2`e`HÖi“Ý[+Jk6]Õe~h¬ÙÖ\ ºM›]íøÛòßóêÔ`v¼0v© îd[cdñC¦ü© C}ÿ>ZÓiañRåFWü:+\Fx`C&7ÃñTûê °YèR$Çmh'ÎÕ&ŽALWÔ×ç“g"!ǽNòÂÒ"+²&Kó/kED¯E¡ ±(SkR+qNv’×»´J× ¯,ݺa9#Þó´¨ýá4 ½8€¤ÅȘulÏl²Š¯›R&¥[Y4)˜JGÇ•ëCUqCVá8iŸAšŽÀ".†Ç•™eµˆ1ÐfûÛ²jt¢ƒ3H(\nµ"mÄS4Ñ—‡?°•±&tëÞ[ 6pTé!ŽE,d¾æmÄiTïáªÑóÍÐCµŽ¾ˆõì¡PŽ9¦__E Ãáõ)¤QŸúÁ@É02Ý—«Ú£Æi7‚F9½–éJÁ5oºqi‰p·W™>Ï”V– Í}V[„²^©á-¤íì³Y)Sž[ý¬Bè¶Cê¶CAY¡{¿ôvèÀd&óŸùžošE L·b˜z‰èà@0=Ò!â£ô:Ù?ƒ"¥zk‘°xÁ8í »ï—ˆ¶=“@מ©-µw/ ­¸Å®÷|3ÍU5Z¾A‹, µ.So<Õåò³³³ÃE¹¿Ï}z£Êžhĺ¢ãWüîÉÈRpjVÞòu¶ÍÖ¢§˜Bõº…RÝ·O×Xy‰/^õp0²´éXtmót™ Byâ.]÷Û K¿t°ô‚Zªw;1x$Yý³àÑ6…ÊÖžS¬…b…Ã$ñCýäú‹nň—˜VLmk+¶õ”À¶Ìóò¡í&%ª½B«ùL?3*ðÈÍ'ñ„#Ä ®«™`[†L˜=ô¡Ò³ä(]-ÎÕ×È# /`šøOP`$ÄI§pÝ „²–¶U¹7P{­Uз·¼êYp“A«’­íYì2@œÞÅnÕa(5i„lÙÓƒLߘ(Ò:ðŒpõj­ãDE{obЄõ9ˆm¥Ðbq8ð}%Ž6ô×틎Î×e¹i{µ} }.|‹˜sÖoÊõa!émÅ! M9ñú+ΩŠ×?‚Ö2‰=ÑfBk©;¶3"š¸N‡jU×?”nF §õ9éi±“GŽ ôJ®>¡x‘@%Zñ_(ÔöjC1t Gé$Õ·ð{44šk€{œ¾h ¡: åh3ùø ø^LàH“Hÿv}þ¹aBÆ&2뇧g—›—Èä XÄ"¸Ý|†Ã3!Œ_ÉKÂþ‰EŠúúl„sä{ Ô÷­_¥æŸ9°…’Æë6Èu/ã°ˆá I`±øébñêê{´?á uÅu5tˆæQØ?B½ÿçî*úœ¾•FÖÚ·òòº?Añª‚”¸EÁ…í4%ª¸$‹ƒY£Q‰”ì²\®åOg#k!Éô ðæãûŸÐâÕëæèvݤõMùñ¯#”>ìÞ¡£ ðÀB·mš×cʉî¼:î’;{½EÒg¢NK*mƈ“Áæ/>Î_-æ½M å˜Ø8l^ÄM¶ËwïyCpOÖ<žŽÐBJ|ŠtÏÑ}Z‰NhùÜÇË“ÒÇîYÚpÕˆíÐ ç@b°ÅpÄ-‡*7¤ñ„l•Oï.?|šƒ„þâÍÝ!cXŠ$QKµ< ‹@$æ/’Z‘Þæ'=-"v„> [ñ¶$óx#ۚǃ8èÛ@îDå5þ££¢lPqÈó1É0× BãZ{ñ|'9Æ!Ä#yX‡¸ÞÃñGâ%­ëìºØ@BM¶‡Û-drˆÃmzÈ›¶/þ½›cKÇòîºÚã1rÆ\ƒÖ»ò­ Ïsè¬[eDÖcà;I>oßœ_~ó}?ÿb@ÙÜòqþvþqþîb~¥íÕ2Ôÿ<î?Û dY endstream endobj 737 0 obj [ 736 0 R ] endobj 734 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 737 0 R /Contents 738 0 R >> endobj 739 0 obj 2984 endobj 741 0 obj << /Name /Im8 /Type /XObject /Length 742 0 R /Filter /FlateDecode /Subtype /Image /Width 504 /Height 569 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 <000000FF0000D72717A8230CFEF98FEEE40940403EFFFB16CCCCCCB5AA62F9E2C1FCEE7D93928CD9954CFDD97F2A16146D716FFCD73D999966F7F7F7FAC130E0BE8CA6920DFFFFFFD4893E765C2CFDF7E92063B2A18123FFF6DE101010FFFFF7BCB6B3282828FFFFEF028B39DD9B56F78E27DFD8D4FFFFCC9A5F4B838383FFFEE6595B57EFEFEEB0AFADE0D3C3525252AD9C3E7B7B7BD26D16687EB8FCF1E56666663C1917999999234B87181EACFFFED4959086B5B2A3E9B877FDF7ACFCDA71FEEEAD333333DFD1B3495944BDBDBDD68469A8844EBD905EE8B06BB53B21778351E8E6E6FFFF99FEE08CD35A0CFEEED6FABD6D567DB3BAB58FFCD460E4BC2EFFFDBC000908E7CF9BFCF787A7A59FE6E6DF3A3A3AE9967AD4765AFCB6636E972E18181824221DC58131C5C5C5E0DEDEE8E6D7B2A86BD6D6D53333CCB66C46B8B07C4A4A4AFDFDAD7B9EC8E6AE66ECE7CE501D18A896275C728BFBB95D3B67AED8401DFDE7CEFEEE9C289C56FFFCA4452B22EDE5C6999999FBF575C12410FCDF9D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>] >> stream xœí‹ÓFº÷½‡®WPÞ¨±K FæÐc)¶ ^ѵ[â BSrI[¨œÒש”¨‰Oà˜Ý%Ÿ%ÿúûÌM]m'æ4?ˆuFóg®I×ͲüîTάÞa¤ËfA/Ȧ“®~¢ÌÃJ=”}›o ÉáîëÐјLf RS.8ã°¿?Ü~*ò‡¿Ê!oëíswLW&+§W»P|þüÁ5-äÄ•\þâð:ÀoÛà§ ”k¼Eì X¼ÝˆRp·L¹ß½«?»{Âu÷|ÖzÄŸa›ø–L;Îðß2÷#ŸýÑü?äM »äa `÷h-:±CÜ­»Ÿß½ûù‰=ÐÓkóÞ ‹¶JîG–áœwnðGõ&ˆc½Mì<G–oìÜn7È}çËÏA'NœÝÛ{þäÉ—ÞI@c–Üß!ø7¤·‰=Kh·1À} ¸ ú¿½½Ïj?|y›•$?\ª-½ƒ¯tI­±ÍàAŸ¼£ƒ;'–A[E¾¹“€«¡ÌP­÷áÏ;dY©…úḇ°0t·Ãhq- ö)춃Ü?GÜ¿Eýgí?~ü¥”@)cðo| r]©àñ.|“/MÉË2q·€ZœdÃä^qÇE_(¨ï;ÆB2l—ÃBiÙ5#ȯ4G+p»}î_ž>ýljžvã‡OîÒS4sÉÅ¿¦2Sî‰àpÉ‚…R vß±;WóÖUW%½ca+/[G®\µc\¥ ¼NÇT&¸î³$ÜѶIšZÖ JͪqÙ‡\3àǨáÃ}Y§¦þáKøé B¤+8ÈœÐA!sÔEým`7°X:TÜ-‹Ã‚w/p ¢åµËDS-è­h‹!îk'Nœ¸ñÙg7n4þþÉ9cQs\$ 5\G[Œr?b ˆå*à½\î#» £– Ö Ö¸a r –Ѓ+]®¹fG2;Èh%Ø’±k ²yH'd›UlÙÆëåoº5W’]·Fƒaà Íçñ%d?ŸGYñ¼P5t‚jêætØa¸ú†°˜º.YzŸÃ‚w+5h™×¼›Öê0ľRÓL Ñ •ï_ök;7n|÷Éçwwh÷Lüë2Ÿf >†=Êçmdï.²9Ägç(+ЗÖN,»BpðdÀh »&Y³äÝŽW2×d”ëwè:¥IŒÙ‚ì°ŒøSîä^>®¢²ðÔpÙ£v `÷Í2§ØûÂâÊz§#/b,´›íÖ\S2£åbˆVÁ)Xb€ûÎÝÏ¡!öå³ò]±y),ç˜1øùù©©Uö¹ëÈn(âÊÕ.æÜU´…]Ó¬Y1eºMREGEçùÜ=—š«y‡eC’wr ?à% O 3Gì Ý~ÃÔM–¡#^uXÐnÓ„Ÿ¾Þmu – ¬óùùµ»P¯» &î7H¬>öd0IÛy+àfCG¤¡ìê8Œ»¢˜6Êß!vMdaªí[GåªÒ1=î¶ŠòpY1Ð’¢Ò€"Þ&G-[5 Âo"»v‘ÕãÃ;åN.Ás‡Ë+ŠŠÂSÃ1È»·€½ß·u„E*KA,v€–_¯ƒÝPô®ªø»)÷Å5ÔŒ;±¶† Ÿµß]Ͳ"ÛÒ¸n¾YƒçÉ£üZ5µ¯\£Æ¸C5Ç«S¨Ñ U+ w&qŸK…ª×a׌{_£Û䨩w4•Tø:î({¯±ÃHáN.ÁÕëp–D«èŠwu¢þðqäEs–”ÝŽ ;¥¾¿›õÓ*k<ÖÝu¯­ë†¢išbèºoîo¼O÷Ÿáö, 3Å-9øƒU™'í&šA£|iváMº[–ýFÚ&GéOà(Y§ÿ‰Òd+³=x' i[’ðàÀÁ1Ê7F…qlËŠÃ’@+n7ãîtÁÔ‰Ö:_ÛjYmÀo{ò(Ý,ÈAÁæwXéGS5‹À͆:¯Q,ZK­˜Ý÷Å.4äÖº>}ÉÐ …‚fHNX³?ôÔâàªþÈa¢:RÄ„"9 KÒnïVüÝw8h]YÀ¨Ø{C&?£çôŽ Ü×,©cò X&ÜÍq?”’Ø…ÿŒcÜ×[Fík†¼}ðGÒQ¹§Ã?ìý¾QúoUG‰7„k&Ü™fLþXã?ò¿ÞL3åkøGŽ€cˆþè÷ü†ÌÜp?µÖÒ~XO9…6ÉêhÉÓÓˆ–bµ5¡R “@—þf“2 {^¾ÛÄçëaD˜;ÓË€î…uWøàÓ£ÛíÒÞ¢.[Wú™²ôÿìþŸÿ!ný4ðŸÿ S`÷¿ÿíåX"Dqr0ÇrÕþ~€ý½ðK„{Á¤2ti!ü!RÃ[xXij1·ÅTCÿßÈàŸ~âqÿDôEXEüÏÏ?ÿ'¬Ÿq¶¿ðYãkiÜ¡>¿Ošo/½HóÍÒÊ~r…hßZX¸~ýzš¶¤IÁô(ËÑ €ç`Lb@AÝ‘üžÌ¤µÌ¶OÙ²®=~Û´Úß cG þ2lbÚØŒƒFÿ“—µ³zð§•ZH³’hÂRÏ?Jµ÷S%¤•ÒÒ~€{s{½»4®¢¸ƒwU+K)ñPóV•å’c.PŒà0\@»8Ð È“˜”ÂÐË¥¾Éƒ§ÏÛ¥"š0©L—Ï„¸?·ç<÷:!—±Ó}?…ÌFÿ8®’t€ôQ a9ÁG‘˲k¥rß/YŽÕí®¬àŠ}©ÔétWÐÚS/ão ˆZ^ÞÿTgÜ x½Â@!)N®ôû%ÛU)äR_ _(9ýîÖn³Ô\wTð1»Š¼ãâ«HfØpRIª{Ã=‘2t þ0wc/Ä›"OŠ­Ù– s$„“†—‚i…æ Ťƒ V‰çޱ—”•Ò²2ß`+(X_™vW–šóKûšKû÷ÚØ—¶oðû>w ¾ïºf UK–®7›¶TÒŒ>6ã……­ÅEœ8®ã:ƈ…SÁîÉõînÓÞbfï“Ñ13Y6KšêÇl\-iè*t® çªìO{SU§dØÇÏUV•¹€3§DúzˆûÞ5{¢sÿ37ίoþ@tócVǧ5·/x3çsˆ@nÀUX‘ðÅO‘SÐÕVBØ=Ɩ½Rô£9«»;ÚÝT”R±µëÛ°¾>ꮌÖW–^¾l€/—÷‚ÏR*×О­’®w-€^²”•“£Ñö2}R$ª­ë×5G»‹f¿¤Ø+ͬ"_u-M1¤-tÂî’©"׆¦Ñ'«‹j%£t.î3á*\E"»˜+Y~ÔDù†ZZáBl2ðþ¥K.|±¼¼Œ²:düñ¿Þ¯seûóç{žß¸qã™®õ¹¹Ý:±7¾ÍëPJÿðÃß‘(x%?}üODôù´©þ3FìÔ‡|L>—pÔtK–Uš«YJs[ï̬n©Õé6·-kn´Þm‚ºPڿ܆û|ùÎs'ä9îÍ‘¥÷æzw½yRZ,AbÍu X|Ô\_on»‹’m7w»¶ñµÙìh¶»Øo®+pi8¡ÙY-5­¹¦í‰s£]×-YÆ:9W…Zp·ÐUvá°Ë):pe΃X¢mK/kŠ3Mmð"´ÁN:8øþûƒåå—ÿŒÍôu³îÛ:èÁók{{×n`ê [?{ tT%C¿7=ЙfñØþoÞô€0ÿ?ƒæÿëùù&X ð‹Îþ9]ÐAì|>¿TªÕ:½ÿ; ÎàK¥N¶WJëVw½du·G¥9kZßçÛôûÊÝϸc_ ùXŠmw­Î¨k e®¦[¥.À†b`¤,mm-ŽNvt s_X:9*\YÜÚ‚¬QW×Ò\§SZ_G«ÛMð8ùs£îÒ½«WéUtê¼ßnns]Ó`)•æ –Vªé“Û»gö `ôg¾þúþ™ƒŸ¾¸_ ö®ëú lðX7(v;ÍÕÑÏßÿþ èï7þ÷OÿÄpÒ´!]µ¥›, ÀiàæÍ›4ˆõ󂤊"]y˜È”ï¿õ•ýæ\«ÖÁÀº+ÍíîÊnÓêŽæVÏ[+O/Dúr–<îør vן–:µNs„½‹::ÎQ:º‚²’¸,{ëúÊç· HSîí¯¬oCýhŸ0·]šƒ¿ïVïÀ²´ºzçNéÎ6Ú‹5·ûèààQiÑj‡z‡în§0Ã(iJ© C C×°¹Ç7%ÕFîØÕþôç™û¿þúëÍïÿP—BÙ}Á©#æHÏ ƒ¿±÷ý>›£ºõ1nyar9ÂIòrh«]½zÕïñÂj•ÿ$)e„þ'X$à4ðëÊÅö úg M„zRëóKȲ—V0÷îÒÓ]ÈŠÁœ0÷íÑ6lZÛ(ûÜVöƒ]{hc¥†ñ“iD|¹vpïXæÞ<¹Ý™«ÃÜ»KK°¤‰kåÔËS+ës«#0Îïn¯ÜQsuõJéÊ*‚ ‹;°,¿rçÎùUØ<þzðη÷ï[ºrŽÁ®ï@$VçæO¢07wçQ=%d¨­®ïëËáÊ3«&C‰¾Œt€uæ>ÂþëMÄ*bñ§¡û* îÌÖ1÷ÿà 1ZZŠü‡ìm6D;ßHšƒÎþüÞO±Ù@°+÷Î=®úfÏòPt¯ *°rje prÖ]ˆ³íXÓîèÎ.ÔïÖWNE4ßÂis§àË5œ €ûnsÔY‡¨Ýì¢ôÝÉQ=*moŸ­®®Ž¶çwóäêêùÕ'_ß¿túôó _9_:w¥´³C¸ïì”Ο‡?X^ÙÙ9îÜ•ó;w.?yr6!9œÇIá<¤€ÒùUñ&¤´,­nÏÏÃrþûx‰ê>Õ¯D÷¸ùý7?Aܦr×oìí¹ß¼É€³²ûã?¿aØIºóÊ㘮WœX°¼ŒRÀ÷ߣŠ@(œùþû?ÿ\^F)Àkú^]J徿ÒEv÷hiåÔÊüú.~Ñú6dµLóó@ó¼v¿[Aûw:_¡†]¡Œw´º½ æ{ríóÈ|QN}gþkøX¥Òê'Á§áàùÕËߢUäeèçé «ØÖ wØuì’Â*Zß¹}›§/ÿVBɧ âêôéßðæi8ùÉ“f©tçɯ÷cô!üGTÄ´0öK—‚ÜkqÜ}ð·h%eÒ„ÒÇߣLƒSfµsÚz÷Çb=h2énò+H8À©õf 2H¤åŸüTšÏ¿\ZZÓ]ÁD1Ø]€ü„!:¤O?ýíÜü× ÊÌD©¡=ßÞYEYð¢U´A×ÁJÁT/Ã>Âý :|Ûû·x'¸@KrÂet}Ø,ã=««§Oï FÜï€Ù_¾¼Cõ»Úyüøò§Ø¸íj¥… ͵öÏU6ýŠ $Èh&ÌX]2‚Tî4Ëf–üõ×OPŒTÐoL_&èvÜáúÐÔηHìe" œ¬>A!a 4°ÏœÁÉìÉ×8± dvÖŸx' ï!¥\F9ÊÙŸàMìì ÞB›^BW;Ÿ~ŠƒÂ×ûõW´âîé>‡gó^O ±uÂ}Èa/xc_]îç¹# ¨åoá~vÚ€ ¹|ôo|Qšÿrÿh¼Ê ® üùýM’ pµ$†*`ÿ#?q'qÆòRÃoçÏAäýõn§æ©°‹"°_ûÂ×LgiO(οþÖœ„2ü¯Ù>´Šr‚'¨PÀk_ãSÈ^È!zB‹–‡3ªOb³yfÕgpùçŸá' XÑpÄ}1Àa_%"Ü?¡Øo¢|ãOÈÔIw]°¢Ó‰CS€¥•NÖwÓsÍ¥‚`›Õã¹ûÄç‘­Y|Ê™6^û5ÿOyA>Äúõ×þ&_ø:N ©¾ ÿ6pF æ>ùä~L]ÍS 2GKÄïo–qÉ Ý«‰µ-wˆºæB¶¾ÊôŠaÇq®‹~øšÙ'¬ìOÍ Höƒ R¦€8]ÂõúxîÈÄ¿}‚3Å@ž>F<÷óçæŸ<á±bógÖ ;ÂÕÛú6YOX As¨0Êy”Ÿ$ÔÝc5T 2ñƒ$Þàv [õÕ²ÁÞ;D\ÏsC¿ùý÷¬ §Yð'Ay”é:bM }”Aà‡²¾ñä59IKðªßûÃåPÆsg¥x ÑDÒ¡šÝ¹ïæ£ ’¹Ç*b€gØÓHö$†ã~T õjéŒ|°rÍžjˆÑìƒàY³:.Òéc±àbe›«½¯Fô7ÚvÓoÑ%aG&È¿àÓÚ˜\|L/™û"pçÍ,j¦)6©µõp× ÝðæUD»s"‚jÄAšÂî½^Á` '¦ðu«áþ½G"EüýûDQÓØ}pœÃëÚ >‹;T"@ßûÇHc›¼²X²ã&ƒýÉoºûo/ù¦Yv¼îq5.8¡íO›ñžºcíþ{÷ž>}z 'õ½˜I¬ç7œƒù·Jä^$r'Ó¬€Æ|j­.’öûU<¿T £f´“R‘/šË‡¹#ðtä• Òðùx({$ƒKþ#ÖÁMÈ0wŽ:^õ3cD˜´&éq+4 s=RøL¥^ IÜ¿ÅÐùò+á7©ÁݼéµÝ¤ãé3þÞÊŸ1GÒ²ïªaâì‹?qÎSŒ‡ˆÇgôÉ&p’À=’±Sæþô)°÷z4ÚXÀW^÷Ÿ¤E€zTñsuXqCãî->&.zΔ—iÀ€{íõ8EŒL1i¬qƒÍzj>þ?ë• ‰ˆ'ÌÌS”Â3qøËˆY'(;I ™Uª¦¸Á~–g~qŠßãz`2vœëž Ò&/oÕÛOòç$Æ÷Ÿ~ã#ç{cŽybî¬îÌU§BÄÓqES4M÷}€ëäìÙp&I_üD«¡ ˜§Åm3j~>1Ž5Љbî×Ú©‘¿ÙYñÜ=ØpNŸ‚Þgm½k¡Vª’-=F¸5w Á)'Ÿ7Ö)bô)¿÷ñÇh„Ç/Щ¼Qìå|Dˆ;³íhë:_„“•P¡ÎqOAïqÏIsÂûÕ· 2®P@¨­Í=œxè€]¥ìÃÂÜ'9éd¥Uõ‰ZÞ3‘ÜÆqA·5Û¯ŸÅVÒ¯w]Ëß9E©n‰¯êÏø^µ˜}‹e–ù[U¶ïb¤Xˆü=.ùÜ‘iï›['<-šO1qV–¿ ؾdCÒÃàwF`ÔTY²Ã¦|ÁR5¹…öÁ=L@ÝÏè­ä7J½îL>w¦´êElý$ÐÁÜI W>Þ7O¼þ/ª×ÞôJò·‰IUÔ²ª76BÜy¸[zóŸ)ÃÛ®&SðacùŽ4¼îGý8„ËJVËŸèàâŽd'ù¹èI¸;ÏŸï•åÇN‚?)ÉA6ö<Ø3è4 ¥Kè18¨´¡¾ƒ-‚ýSM}25ô°£lÕ¹ƒv×HïÑU¾x/ àÓ‡áWqÛ…†ä' ÊÝbgØ–{îj̤cIÜI´î{Ÿ}ö\-¿|‘ ÞW»Ì ×58xsñ"}Šâ¤ßGØrJÀ;Ó>潯®MèÒQèä!­Ì`w¬­èH-ûl¯\N7øÄ‹?ØÛ{-"üæϽa:€¥&fïÿõƒç¥*Iš6Ñ3þ¿¾š,”’q-›ð'+Åž'¯|÷3yÇz:û… E>œ)XEÝ65ü¯1l4¶T(v¸òÝãNÀeWëóÜíúZl$ßw¿¯ZMpG¹«z«XƒúHmÌ’»ü`ïÚš¥Õ×ÜrÀó²«â²ý…'\Æ«î8? Ý0¬ZË{ñ½{¶7I( a—t Mh°‹ñÜŸZ»>»>H¾U+Øñ©·ÐWi¤B­}5Ž;[Ñ<÷¶É†¹» ïBoç fű'ÜÝVK׬Z­ƒŸø sß#Üw^¬­½ˆç.K†aÇ&-ãÚµgš«ÊªvcoÏx^–LÀ¾U¾ý_/Ðþ_NÀïÒãצ”ŠHu•–nHV± '¥eO× ›û}œ#ô6嬆–o*Ä’ÛÚˆáîaªèÊÓ O»…n(lmµœ­…­ÅââÖõ¢‰jõmV"ò»®ëø Dœ úðR,wÞtSç¹çI€ÃÜõ‚÷G™¦Ìf³#ŸHªÓ²KG˜»Úê CŠeuÐf»YV|öÜ-kÿBª_ y€ý6ÙX^€ýš„š'níÙÞµrˆûý×Z¹¼òâEùú¼Z^+›]YÆÜktBr-ä›bKVK3ÚšUÖt¿ðŠqfáýþÃß~ü ­$9"¡·LôvnÍ(÷zmôý¸²ã÷Úï÷|kWܲ۽ЅßP½ÞÑËúâ…Eô»ÀÀ_çjyC Nбqýz,w’Õ—yî$Ú w»XטgmÉûÛP0ЀI°­>Ü>ænµPóPÑ»qÜ@h›;(ä’ëeͦm›ü²ülï™…[ŽõÌxän÷Ûå%ym­¼´¶TÞ)/PÊ;&äeå"&T Ej™ÔE­Õ*@–ipqqÿûï<¸ö·¿ýíÙóÏ¿ú=Þ ÂnÁe«Õj]ï÷ÙmÓ,Ÿ»†Ê¹°ÕuÈ :ð[ ro•!k¿PD¿ [u¨—kn‘0Ý(´Âoqk6®{x‹Tçt~Ú,ý4Iãe–ÏmÉ)jdš—½¿ r{&WIò׋@­(ûÜ[:Zku:qùüóçÀ^ÜqÜy æsš)vŸ[–ŸA6OR‚I ÈÝ#ï¬Á=ÊÝòâcS>a¢Ò@Æ3Ècjnz»šoè@½`ñuÕˆû¯žýÍÓ__Å;¢7 Øû:Jºˆô°àö]§áþÔrU¨÷½w¥¾¦]èÚ}+d¶ˆ~[î… mYS­~}‹åñˆëF»~…[£½áwßzܹi³ Ü[`ÞN‘ìQZþß5AÕ‹¾ŸäöF›Þ>æ^ ÖêÃÜŸC+Î pç<@B¹—¢((çÀ·„|þŽûšú×"ù¼a¾~­*'äîkÙTTs õÔÞ~¹—Õá`)¿%ÕloT‚®[šëòÀ°û½¯?Rê¥ÆW{ñŽX0T·€£ £Î·ì¾Q縳ò]wÕ>XúSR²?µjáŠýS(ÙáÀbÛ}úcwêÁßF}(I9_†$5ê~¿½Ï½ˆ"‘ûfùH-ÅÿóŠþ>½Q•7µÈn¯éˆq‡†œ«8îœ$æÐ/\e½²Á-ËÚ³k$Ô ž]»¦‹êº&I }ؽûûWü_Ïoü.%9"; –y`ÔÅb‘a¯êóºk:üø¹-ÀnêN% n¼¶×nô žX皦ÞëA·wÏïq¿H&~¡ÊYн3åUÿÏãΚ¹ ]7´|´ïƒÜm¹|aÿÑB¹\à¸%aË‹µwp?Ø“¤=(mo„¸kæë]|SkêÒíEøUO@CÎŒëJòäêšÖÒ-EÛÚ+ÿþŒdòãkôº#éeGoµZÅjÑ5Xéä~áiA2](ÕÇ6äîùØeä7òuI2—ºÝ®£ªnc#Ÿïåý~=ÎÞ½i³ Üí¶-»$Ÿ—ÚþŸÏ݉¬Dëó5tÔ¥„¡vܽ'?‚®—û‰ÜQ}¾¬*qå{ÙEàQëÚ³ÚÐs—úWÖvÍ;P‰^ºs„|ÿõî¨ åÉ=ž~ŸûÛ_AçÇwÝÔ ÊÔCâ¶7‹²SôÆÜø¾+›ãÀ{ØÃOÙ­€·ukkK]ZQe³Þ€&ƒág)ÜI´ùÜËvkØ6ðjA÷ÿ<:ÄT|½×~ïXv›¤ wù z†ùÇ'år"wÜ~G4¸MJsºD~?{è¯=»Ñ®†.ÏÝê£oí¾öÇãNö5ÓJC¤JºvÜ—ôû=ß8ÿ׿ÛuÓ’Íú1M@žÂýÂ~ÍvÐWÓ¹Ôxì÷öõb5j—ö·Ö×eµQìµøJB€;1À=V ×ÿó$÷eõÏ;°wë¯Ó:-]£…_ûõñÃë\¼˜Ì=U²v ÈkÚ°^« õ:mqí5ì‹Zz?œ=!öòÞó¿žûê÷¯Î•cûèy±Œx;˜;}wÞiE^/ï—ø°j$`¿wOé†Ü¨L^¯*[Ü>åÎÆePÓOÏ=^&)àe3¥|)”ÏÏcðÊö!¹3ÙÃz}ƒç΃§‹W&Òµ Tßûjccl_”ûP™î‹‹ív¸˜üv1Ø¥nKYÔ:K1L==­9ºÛXZz}¬Ú´ª6ÑÞ^½Z×½Q»Ä?á$‘}''à¾ðèþýû²sDì¨ûx£à^VBà»r„ düþ;JBÒïãóy@ŽÇ½Û®‹ra)‰ûþ’ÑEÊÒ~2ö—+KE¥mw—VB`ÁÆf£ÎÔl ~xÞJþòÆøjìtšö¹‹#+˜a)Öâ.Ö)vkfاZ“Q_¹ÖÖpšÖH²÷{/÷ñgaîÅ·ä˜Á?]ÚGÈÜùo!?—•ÊÀW¥R±Ü•¬p/k<`O­Ë¿!ɦÒÂ9o«Glq¸™È=µåž–ù“ó¶º6œ¨»ྑøywq¶ÒãvzQbUg|9Þs"Íòoð`Gí:8Vñ”Ì=ÍÐÇaGCv¡ï>-É0WñsVòCKo7FR›T3’æ¿ûãÝ`÷?†[‰(Ä=ÅØ'É.ÐÎú±!²Šž¯…°üó¸GÓž~|’Óûª±Ü'Bxø.bøþ“ôaÖ©IN#ðÖÔùGZ î)Já>‰uG¬•ÜYåÁLªˆÏ be<Àî)™·ÀΔfïAÄ‘W<ð†ë|{¤9Ï= ÍÃ!Meu6åD×ï4¦ß/Å¿ï"-{ŸJJ&‘_40îÊ“sŸNè†EÀšž{íDì}1%Äô¹û´¨ãs€wïïZGá>Þ¶©aï®fSùˆcßÝq4îcDf5Ž{¿ÃêBä%-\ ˆ}ÇÑñ ð1Šåîî„Øã[tüK{E:V8¯(w¸§½¯ˆ)ñ¥FáB€ ¬á–š«O•Ç£&|(MÂ=òj±TSµì‰ùNdçÞ-î‡P"÷xMÅ;íÍ[G¯¶‘ð'%¡tMÁ}¼]GqGjhd9%õBaºÄ@%B²&ã>>¿W™ûô8ãžúî‰4ôB Jã^vÑäÐ…µ¿`qÜÞŒÅþå黜Nß›”»ÿEy3ñ>p )%2‘Šî"Ò- }zÒ×|JáNfƒ›å—4Â|û{âãýš@ô›cÉÖ~ú4}e,~eä§§'åÎ}QÞM9Ç ÜÜcÀ‹¿Ïç§ñ£èùsÉu§oâoݦr—Ó¿uÊý32üÅäÜïâ—šÞÅ`#ã§AÝ=óÇÁ½ƒ3|Žuÿî¤Ü_”§ûðã×'9ð¹ðîÉqB|Sɧ‡ñƒ?ÞÜêØ¯Šß‹$£!‘³Urv`™†%A7nþûä2õ:Æ3ô•õ”+È¥Xî8O‡äÜ”ËÃÜúÐ([Ö[nÕ]·]÷ ú»ó¿ýöÛ<˼¿Mb÷î÷|‰>FL?fΖãO ëþæ(™“síâN¾w}Jè³èa©©ÜÑÛ®•Ëè!ÿ×{¯UryXuÍš^6ÛÜœ Âé.μIø!îg>Þ¿ž*/Ü÷¸{NÓ¹s_”Ç»VF£]›}\6KŠÍæìh Ç 1`œ5° ØäòÉqÉ-iºei6ž{³5:iYÍÈ×äïÿ¥ü— Ê÷­>ÛÙ=ÙE>³å!Þjt㞈E¸ï!îáï—é³T*ù,ºì}1®Ó…“ÂÝ,«À]*[ÿtëÇݴͲ>°ìv¸—9î_£kÿrþ.©ëÑoÃ_ ¾9þî’Ãÿz± à%öNޱwî‹òØÜOž\]ÕômoHúý¼·Ç½ì—ñhÇ•?(Р›Ñ ý¼¸ŒóòÉq }Hܰ±½Ã,ÝÒ"¤{¤P7Êu½\«×áWâ¹ùó'5K3$‡úÌ–c¹çtòÇsß{îÜ3Ÿ;ùÞ¹«’œ³›%ÍXí:ÜÓ—ð-“O ÛÀýléÕóçJðäþ™Q– ÀûßT|ù^ØewX­YP½²xî8y»-à'%ü< ÿz¨Žw÷þçg^ [¿¸àq_ÀNÆr÷¾(ö¨%ô½Y©>RßlÚF©…>ïÍqç ÷¿ oÃkù ¸=ZwÍ•&Ýrxõd³£Ø®ã–tˆJ*:åQs4šSÜî/ðªE#W/WrõÜ0·QÀÙÍuÍpÓl6uE‚j]Ž/á#à ÷öùùsŒ;þÞùɦ%­“œ³»%k·´nØ¥faŽ|0Ý¡7‰>®i%Àþ‡ϽªTÎ…¹ßx•:é¿ã¸èÕ):Ü`Ù¬«[õ­Hÿî¯(—?@àO•=î—¶êýHoNˆ;ÿEy”37·-¨ÙåÙvÉÒðç½/¦s7N¢ŠC|X ¤ú=rÏ:–È5 Ÿ/Ôt”ïê¨SÓ­‘˜gk”Õòýò]híRC±:¨ 6ª9£¼Q«98»¹KΤ>;YŽ/ßcíýÜÿùéŸ?ÿý|‘r/Ô:«#Ë.u5ôs¶4J¥Õ°FÅ@©€nÒ°ñ-Ã&D“ Ù{` Ÿ?ä~áÆóèý{ê¿â¸×rp‡ê®‡¹yêòÝ˧¾¤Ü±â†×ïþŠ?BxPþãË_Ë¿þz÷¯tîÜå˨ڄUЀ!˜)Ø»fp]:±ù¼‚Ò ‚Õœ›kZt«` T×°JŠÁ•ïj³cÝ‘&^/20 ·µ÷@ ¾kKË œ\®˜+B.Ÿ+÷Ý“ØÞeê³kšdy¸ò½~}ijäÙ»®£ÏuÍ]Å]ojl©”j¥U 2uK‘ð!7i¡h2KV®¿:²wˆ…{+èíÿŠá^®ÖM«½Ñ.×LÔ~ç¹ß•ïž¾»pq÷úø‚ÏE3î÷¯ßÿòóò#ôwùn9·áîQvì6Á2õæ*º{˜j£]Z¼ã¸ŠÖë÷Ѷ>7îPœ³lº¥ ®ÍÉhBr建޴ h r/›{&šcX–ƒý'µò°^ØØ(`ûèMXòRiNQNš*õYbËér¸|?÷#p?Ç•ï ”ïÆîhw}´­Ùti” ­Ñœ„x»äÏ»edf)‡ÁŸ;ûðU¸|/?E/øq«ìî~= Bm£e¹­ªŽ0¹ÿ¶òäË'/±½ûûœÝÓ4ùüõòõÏ?¿ýÅS„¸¶¢Ü½/Ê£ ø.ܺ²=²PÓ1Ý•¸L4ÚŽ[iÊz³%`A³G£šæÒ-dï2jlC`så»ìl£äÌç÷ƒgÏnìÉc»KM¨@v%‡úì²åaÚq˜û£¿CžÖçAMhkHPqÜ®K–`äPé9‰r~—üô&Q4©¨ý^9ÿêá?Η΅òù{òéÑË3.3ƒ÷ŸžDA°ªU«lT«hn~¨|ÿreáåËO?eÜ1û œzàö-wü÷G0Ÿ¿4Ž{Ùã¾°hÛR¿ïÚŠb@+ŵ%ÉРÏÎ ÷Û\4O‚5K¶fYº&9¶eÙ}‡nÑò]Ó ¾-‘ö;~‡‚êP÷sC5ð=0÷ô7NÒ :ò•ëhÙï“å¡Úïˆ;㎂©Á}˜$ˆ&]:.ÄŠmضíBÔ ?É%7 û šâûi‰iÿø 6ø‹ò¿bòy\³+·ñ,RïÀ=ÄýÛ'Ÿ~ùå§ Ÿ~ʸ‡Çò(÷ûŸs Ø{¸˜/”¹>µàå/]Zè÷û*4ú‹‹‹øuý¾#!3å¸óºæ‘ïH8NÔ¾$õ¡ä•`“´Ó –à|8`´|/c!ìvYBc#axqý´p¶-9*õYfË©±îÏž=x€Þ§‚¹C2%¡ÄADíw²DÌè城cÂuñŸIní’åîå'Ÿ#ì÷ˆŸÏsÜ dé®àNÚqH§?½Œ¹' à÷ÓŸãoxÒÏ­~: ;©|/ð_”/pç‘7Ö/å×ëÂÜmÔŸ'û½X2é’g½Ü²蟿Èv»çoÜ ïÎt´kãßL{üezÙ¿Øtzþ|ïî¬Co$Ý»á…VõúéØ2VÞ'ËV óüñÇ#Ùå‹wÚƒÇ=¨äqû«WCã°/syž;ìóÆaÑå%ïù-.eÐP%q‡Œï¿¿?è–°ÛמAzL÷öÑÑ~H½ùqؤª’D²yª ¾27þ‘ Ž&—Ëû‡èÓ¸qí¾t-,¨Aì1€ÓÓÄ $îÓ“OOÁ²o˧#Õd®&W4Z>lèåñÏYÍšû…Yp¿8Sê2ÞD½iî+ç”þ VÕX'GKïÂ;Ð8î“§Ö”›»ÿ0}êìÈñä‹ZpÏýˆÆ´ìI¦À¦RMq3&!;Ø‘&µ÷C§Ôù¬}¢©Ï1PCû=_'K+<Þlófš€ûahǴך|h'IDIEGŠÅgÝÊ}¥r…›t ú‘±'X»GÿPÜßu”¿JãžD}š©4^.!LÒmáî)Žÿ®cüýP<÷ø—ÅÕò'úB|{0!LÄ=ŸÛšÂàßuT¿WŠá®ª.9„}Ò|žß‹Ýc– >v ­¯ØŒ^PŸ@ñÜã+ucõæÜÎHY<} / 6÷&¼ÃfðL$c¸Ÿº½³¶¶sûT"øýÝÈð:Õþ®¿AQ°4ãÈàc¸/¤rß"7±•ï-í‹÷PÌñ_Ž“dqŠ~¸"û/k_þz±öKøý¹îÉp®O±Ã‘@bÐЫ%ÛP«~QœނOå>¿öø—ùù_¯Í| £lµÚ-íÍ Ã^\X¸pQcªåI?7FßêŸÀ°"ƒý©Ü¿øå—Ç ÿ8¶R·?·²¾>—Û“#5Ëö$ÏrEdñŸä†û½{·_üòø~ØùË_^ÜŽ)Ö÷çŒõõõÝ9ŽyäHÐÞ]IQUÉ«•­­ëq´·ÂÇ®@‡‡nâÅÚªe­®¡›ÀØ*l¤\êGŸ‚Š©òHÜwÙ|×x_§ÁpêÔÁŸ|¿.{اœS«kœt:sÖŸß›XŸ¿wïÔëÇ/^¬€­Ü^Yûòñë•HMnpn%R·çŽpÜ PÒHZ¹Ü_BÛó'—ž¢£'wK‹[×#¶ ÚÂóFÙËŒ£¼ÊsžÍÜÄÍA}ñøÅã×[tiÓî«rÉ Ež0yM¼"Ë@¡ãysÏ{Æ ó^CèÔÔèåRté‡ï¾¿ùÉÉM]’.ò~O<§Ö ÏÉÏŸ«ªBgÎzó{Ó¸£Üq©,ïìÈå%”OFà~=7÷] vþˆÇ?凸«üþ¨»´…ŠbÛp&XéÌT4ÕFUÙÞ¼…Ó¼ÿÐÚÅÈTZvû·_|¹æ‚y̯}¹¶ö%2xµdésÍR×5Mô€!ÿäšHã¥m’iðIst±çEŒ}Ÿ–Í{M˜šªâçéj´Ißë¾wðã'?üðC3om®ß[àüŽÎ©Müޏ<$ºqc(+tæ,žß‹•Â} `?&®Àð_¬ öýýïÛ¹ÿ÷ˆVø(ó§þ‘•@_3-½`¸¤‚©,,ll*K÷îW(Ø’¹úb ~·‰fwu›»º>‡¦§v›ÍQ¡¹Ý]‚¼beÍ]Üjî¢yŠ é£ßGóßæÐüÏ]4÷`ñä:xŠf²B©ìO¥å¸¿>±$¯ŸX;qÅUݯ w£¯âù“š1:Ù#À3tœ>,ØØÞØ¼W3qj*óT"—MñÛ®ÔsËËx¿'ŸS[è{Õù¡YÉ}[•„*žûÏàÙW«OÜôÊ­Ü"ؽ6½oñ·‚ؽŽx«l) ²xÍ°ÊØÞG£4æ ·¡9:ÚV\£4§ë¥Ž%¡tñˆÌ%S=-n¸ æÂ"Ú)9‹ëèD0¤Þu|w±‹ÌõÛ¨¸ý^ÿÐÑQ©ÙA¹ *:K ‘˜ÇIÔ‹yLÔÛ@¯öò罺ISS™§.¹l2w»2¬t^ž:uêiÅbNmÍÁr¯]£¯‘v~¯ƒƒC•bï÷^îÐO–ƒÅì„zhWnÝZößùàÖ~ÕçÎIÃý.}<µ/A[mÑ€a£…b+Êæ/-l±ù£.Zºý¾­ilBç%4E[ç°”/Æ<7‰·wPðéM m•Lt5ÍE—€z*j &.žL ‘…=Nœ½X¯Ô({ó^ûÉSS©§df¬ÿ¹rRÙ¨ Ëxy°@±O?§¶Öï÷M<²:ÌÝ%o6#s{Û卑¶r‡|ÈöĉՕSÁŽù¥õ¹nwe?8(œŸ>]‡ié)Iج1öëî ù”Ü–ëaÜ»(IÒ"ÔåÜÅ­ÅÅÅëè°º%á)«ª Í……¾K"ÏÌlþ'Z %îµSí+ì&®à÷YÈ}<ƒN1I¼Hp6U!rT4{”ÌZMî˿•ÇIŠÌ{™šjzSSqhUrÙ$¿7«ô=ÉKËgüWDN9§Vmñ*šøóèþÜ^';€_¿‚LåÊîÊ ™æê È3ó@Áßâ¦3Öj…ëd  wÒ‘Ž÷@W<éÅs ´‡Î{‹yãwÊaܾÉ"7¡“wѱþyoê¬?CUöºï¼CœÇÁˆEƒ ‘oÁÒ.¾‹lölüœTßïhµAQ1P+çÕtsj])¨27>Ö_;ü–<432š‚© n¨Wä)i÷ãÇaBŠ‹“‰E&Fñ¤š0toGñÜ1bbÝ•OBS¼û8èÑ„ãhìsSrŸÆõ¬½ïÜ÷‘‚9{:ö¤ì!ò⃱ØÙ§å±“ŸðÞ@zŠç~ŠSb( Ðc §ó칬ß+Öù‡¯ÆŸ„{ ¶É¦§ˆã¯é¸Çðô·RÏðÈ{%xøÛø=%§O@6erH{ JV¸ã|>xjjH²õH> ÷(åTøøžfI>äõ£xî¡Ì qשQèíKpϦ÷lJpϦ÷lJpϦ€û¡&æoI‚{&%¸gS‚{6äî}ÐJäžü{¡ã/Á=›ܳ)Á=›ܳ)Á=›zWÜ­|Þz³WJÓ›àΦ¥8±Ðñc ~‚[|¿uhîÁYbƒj¾^0C‡RÎÆ“ÌòS‡vò¨¶‹õÍAµ—o´tÛïþ™00ÁˆªÛº:þ¤7®q'ðÛjà`ÊÙo˜»Ý†lê M”CpÇì o ‚V‡xYäÓE ÷A¡¯á6­ˆcÄÕD|£\öÏ"ØÇ0z›µ §^ÝIZHàê yaQ¾â­Öx8( ’4BwÔ[GT&©Ø3c¯‡&É%pà,Îi¾ ɹú¶¹3UÛz¨Ø¤«^JxW+ꀮa$\|Ÿ.Îæ4ï–YÏÎòˆ¿Fô6U?GD¢vjHÚÞÕ¹Õ@¡…#š«¼ƒô ònYû}H“Fü™q×#Í?’!àIJéøNqŽPxWÜ+E#|£œL>*c¸ž\×åÚb¤D ”›8¾ªµ¤0º~N_ñã+-$¨/Á ¯öx8($ɃwÔHDõŠ^ &þ̸ëÕ8ÉΚï´M=ˆøxÍ(Ÿ·HÎØpBG®«áS½u?ýâº.)eqÅ̉²Ûðâ0®²äÁ›‰ Še5¼:à]pAiï =¨¾[ª¡åe‹ñgÆ]¯íÇÝÙö*á+ÅÇI@3«Ï“šÑ†=¢Õ¡ÅÅî:æT²®w÷|ªŸL\ žÔÙmjm¯ªL,tlHâWùu”Þ4Aåܺ…Aðxü™q×ÛðÓͯ6|§näJã53î”E+|Dá[\)ÜC«ƒJHCþÊ*ÿÒÈaâø–Ô¢ÏO’øÕèú`š ÜÒfKªñgÆ]o 25æJã4;î¶Ã܇xCSƒ®âÕ_ VÍ@›Ák×|cNå0I©N’øÕ í=9¨¼[Rü°r'þ̸ë¥Ú{"’ÍŽ»Êݳ„LVØuB¼ú«¤èK©6ZÌè7"áòs>baƒ‰B’Ê}\ùžTß-1–ÓÇŸw½Ôò=öJc4;¶÷» u:îÁ±#~°Þ$½]ƒÐn> Æ1œ($©Ü'ªÏ'•óö ‘Þƒø3ã®­ÏBGã5U³.ß‹¡#›,ÀÚtÜIÓ–õDIóŠ»2m áQÀð äë^­ßX’TîãÚïIA ùFÓVdü™q×Km¿sW"¥Ÿ yB¤° jfÜ'ÜÚ¾siØÄÜI2¢ýZ` ›¾v ë‰ÖŸ+\]g¸sn|HR¹§ô×¥5ì[±ÂÅSì™±× ÷×iýcP(ÑÊeP³i¿KVƒK¥ÑLTœ’;©mhŽêÖ6+ƒ`;ÅAÍP% eÞ›’,‡V6k¶£: –2YHR¹§õϧ5ìÖ$ùÎFò™ñ× öÏ£cµÈ©îpÜ#=³|¾®’×B‡ÈS8(²¿/à€[çwƒt¿ÝÕ3’/^ ƒì³¶Á;ãB’²›<¨°¢m/ýÕÎŒ»HáÆã”°Ïìb&ó®:æáÍq¯n ëܵ–ßÄ]“ñ±Â]VÑÐ4/<•ähµÆFu0èÅÃr Åzž6_oyuû1!I ]³ÛùA¯^à;¦& j„»ÊZ µ„3㮇•4þÎq—Íz,!_÷±˜/3V¡˜ý0®'¸•àžM îÙ”àžM îYT\¥ù¸žà>F‚»Ð¤dîB´’¸ eE‚{6%¸gS‚{6%¸gS‚{6%¸gSÀÝ~×azû²÷LJpϦ÷lJpϦ÷lJpϦ÷lJpϦlÓÜ3(Á=›ܳ)Á=›ܳ)Á=›ܳ©„{ý]à¸)Ê]Þ¾ÁëUÞŒ·äkU/‰ç%õZS¥û7þ·®(w«QuâÝÎBo3Þ*ã. GdGß´¦÷óØ+Ê}¨µZoîzïwPmcz?½"ܪìVeo³Rq›uÓ©W[&>\¯Vë(? Í^[âVÊÆp³aáSûÈ•‰sXïê¨ÞëŸY©˜øÔà*çœs©¶{,ÇK´§š/¨ákq»C—%g;›C±×eWc~{E¸×ÀØ‡Š¿]ikN»Ž~j°eV[®[ëA$Š®ªå+ÜJ¹RPÝz »*Jn ïóO Þá_ä@*VMo/;³\É×\zÄ_å<á\6tU«ðÞVêÓhÊÁkq»ãS«ñ×õ‚É®öÁÚ{Õ…"ž«W ô“ðO¶Š8­· àJ€]áV°ÜªçªV œ@½Ã¿do1`8øÌr¥æñWCžP—:w2áŽØÃàNºÛÆFv¬ª<¾. ŒðóØ+Ì]Añ#oz–X®8ôGF·ÜÃÛ»Úy”Þ Ñ¹2°«à Ô;üK½@Pø¸ëñWÞ—&wnÅ;W­wÒÝrl`p…çûÜ!îº~0ÙÕ>Tîu\¹-†2KOJD¹Ö µ2·¢Ö†è0r¥–£'pÞQê€îôϤÇñÕ÷$â2Êr”{j`½gq×õƒY úyìânÒ·mø–äÞs9ÇP¬¹•Z[’©+l'RäæSØÞý3ËÉ;â¯úžð.#ÞŽå˜Z;xˆ».gïA?½BÜ ´ÈÝðv¹qÙ§5hì ’Ö[Á½ÊêÁ8ïÂå»fBùîy»äoc2îñQ7ÕÀ¡øò=èç±Wˆ{N–+´Ùž wu£æšŠýÊÐP]Tx+µº¤Ú R‰GõùFð¢¡"kùp}Þ?êÍ~}Þ[õ=á]ò·Ë\‹Û uÚ.ù×åëóA?½‚Ü!‡ÇM8£â·Œ+üOÙlW«E”ýÙíêf£ s+j-?ÈØj¿·Mì…w‘ÑØÚá†4w&jlÓÆ3·êy⻬T¸X.€Ünr-~w00Ì©­sîw]®ýNÝÒð{½Áqmš~0¦Jìê[Õ‡’•§êÍp¯ÔúP×Ósfìê[•à~x_ÕjËï.".—®$¤½Q½«ë¾]} ãïBSJpϦ÷lJpϦ÷lJpϦ÷lJpϦ÷l*Ƚ}d½»;šF!îGý à~Lܹ~tÁ=+2ÂÜ¥¢{’%¸ îÙ”àžM îÙ”àžM îÙT÷\.Žû §£…žÀo«Wy8ØÜ¥¦ã^Ì Ñb˜+JR57´ ½'¸KMÇÝ®<4$ÉxøÐ–Ú$ ˆ|þxj:îRYz1WGæ^ܯ¦ä®ä6%i3§HÒÜ!¸_MÉŠv]Ç9¼°÷c­i¹[¹|>gÁŠ(ßµ¦å.õr9R‡õù㬩¹r,ƒGí÷Šh¿O‰þºlJpϦ÷lJpϦ÷lJpϦ"ÜÅó´™àžME¸/‡Ý“,ÁýØHpϦ÷lJpϦ÷lÊè÷÷ *{.—Ü?d%Ú»àþAkbîs½ÞÚ=·Y©?‚•ÝüæÜà~\ܹ†%sŸëíî"ð¹üî£z}yy»·;ŸŸÜ«” ¹çwuvÏ//?ª,/ß‚íù¼à~\5)÷Êá£Ç*¹œ_÷ܦ¶wz Ù{D‚û±QÍ™´|__Çå;=¶ÛÛ=Xùü±•¤Ær÷sñp}ž¥‰Ý[•ê¶à~\¥%åó>˘ =A‚û±QÍq÷ *!ŸÜ?p‰|>›ù|6%òùl*Òo#ž§Í„”p>/¸gBîjHÑ=ÉÜ÷lJpϦ÷lJpϦ÷l*ž»–¯ôZÏ='¸PŠç¾a¹v£%¸¸JÎçÝÇ=†¡nÚªª«ª½©šz¯§›‚ûñU2w=¶÷vAu+ŽZk«…ž¢ô ‚ûñU"wc …¹[ µU)¨ KZ°5ܯ’¸kC swjÕꩃ¾ V¯:Áýø*»Î°êuzOíYª°÷c¯xîµMI r¯*ðÓÔÔü‰òýØ+ž;~Œ:çpÜõ*X¼‘sU79¨Ïw‰þºlJpϦ÷lJpϦ÷lJpϦÄó´Ù”àžME¸‹ù2™àžM îÙ”àžMMÅ='¸(ܳ©xî»ùJﻞ{Npÿ Ͻ·ýèQý;ÁýÃUr>ÞJêq'¯³c/£†eÎ#µÿfjÁýØ(‘û£ïnEí¾Œ:—_÷ßHͽ™Zp?6JâžËmÆ”ïôeÔ9ôrZöFjîÍÔ‚û±Q²½×óQîô/Ù©+ü;M÷c¢”ò}ν‘š{3µà~lÏýÖüÁú­@}¾ºæÎÞHͽ™Zp?6Šç¾Ý«äƒíw\ƒp÷ÞHí¿™Zp?6ýóÙ”àžM îÙ”àžM îÙ”àžM‰çi³)Á=›óe²)Á=›ܳ)Á=›š”»=œàM¥‚û±Ñ¤Üaï’’¸»ƒ\€ûæ$Ù½à~l”Ä½Ý rï£þ°”ÀÝÞ4Üñû¨Ù[ër4!ä Õœà~<•À}¨«Q{go©ô¸ç Up?žJøÞDOáÎÞJëqWD>\Ͻ6ʽ…Úã.Ê÷c«´÷Ó&Ù{ÅE¯ªܳ’ÛïÉå{½íj‚û±Ö4ÜY}^ªWªºà~¬%úç³)Á=›ܳ)Á=›ܳ)Á=›ÏÓfS‚{6%æËdS‚{6%¸gS‚{65)÷ù^Npÿ€4)÷[sã_O+¸Ås÷_EȸӷW Gì}¬­ îÇJr'^TÕ£_ÿÔ‚û±T÷J¥¾±÷Ü2~'ýwßñï Ü¥’êuÛÕÈwrËóXl>âßA-¸K%×çwQîËùíåí[wP îÇR)Ü{1Üago>ðjÁýX*ž{~ý`·7Ã}ys.¿xµà~,•ü>ê¹å8îsø[Ü;¨÷c)Ñ?ŸM îÙ”àžM îÙ”àžM îÙ”xž6›ܳ)Á=›ܳ©÷#ëÝ݉Ð4 rÊŠ÷lJpϦ÷lJpϦ÷lJpϦ÷lJpϦ÷ljÖý´ÇUïŽÀ»Qˆû/•àžM î·§Õ!N™©g3¸¾à.¸gD‚ûmÁ]pÏŒ÷Û‚ûѹçrG%Ùå{·6=wtn(˜‚ûL¹‡bw’41–;Ùܪ÷Ÿ{ÐÁ}6ŠçžË]9[yµkçr¹Ê+ºçáÙ+çd÷•W•WW‚ñ»Î^ÁJÏÁïÀ mt‰+·ã<ävn_É]¹½“PFÌsê§>ïúþ.Î;n7ö†1G;¯ÌàîEâ«+9ÄûÜp»Böœ#?°Ží¼Ê]áãýJî;;ÿ  ½sð‘Àæ«Ü9|:lýã ¸¿çrô Üàk¡Ó|Ï™½³ðqÜé.Þ;nw„;rså‚;’Ï}‡Ë I´íp»_ÁÊN0Þ_„ÁsüÌ•mîäη9Š<Î3´ûáÇÄOƈxθûá Ùóg Þî÷³¹‘ÏSùÜo³Ìð,ËYùÝä=fx¯xoðœð&2ñ‡g=€•XÏrÈæsW*þõ˜ç\ùæÎ»EþRî·¸ƒï¹³ÙÍçÓ¸#C{åÎÙJÔÞƒç„7Á–¯3föãÙ?rgÏÞ>{6÷Š FÐÞ“¹óÙG÷Ï6Ï¡ÌGpá~6wåñ«(wT†>ö ÇÛ„'+‚½sÐÐ&,ÎV°7Øý•XÏ &qŽü„ËwâI÷pùî'WîN°O説I ¸ßžVSŸRyè9ºg¢Ÿöpzûܯ`sÜß­Þ:÷ÊCR¦ îïTï ŸŸ±g‚ûa$¸ßÜ÷Ì(Â=›ܳ)Á}ò·SRâ”™z6ƒë î‚{F$¸/ î‚{f$¸/ î‚{fÏ=7}¼Ã)¹<]#а%ì:ø®úpß]ööÀÏfýQ¢gÉbŸ+ô?[(¸F3å~kÎ;Ùÿlæç=Úîù{`9_¯'z–¦\h)¸F3å~°9¿ǽî}b0Ç-U=KS.´Ü£™r_Þ­.Çqßô>1˜ó—óõè'÷·¥ÙrGßç¹ÓÒüá£eZ"så{np˜ò]pŸfÌ}¹ºgïs¼º:ó¡QÁýmiÖÜç7ržÌ›zžwÂŽÌ’ÜZçÊwt×c=Kó‘-÷ÃIô×- î‚{f$¸/ î‚{f$¸/ î‚{f$ž§Åܳ)Á]V‡8e¦žÍàú‚»àž îªà.¸gF‚»*¸ î™Qwi`âèpªŽê66+ÖØxçO©åjh5—ËUÛ®êù#Îñ"ädrˆZ¾Òk9°Ò Z“2w‰ŽŽV]u ÍÑòé‘A¤O±zje°Tñ}งœDeì-î8"´üT!n:DZà©bªfEÂ…wnàø>ÐÉSˆuÈIÔ³4§`_‡“ž2þw=MÕP6:¹½³SŠn³iT­8{;‰ñ,Y2uaïGUw+¯æ5XN\¾³S°c‹Æ…÷À‰–ï'1ž%JÇØEù~T%µß«z-ÜA]s” êóì\nãÒsn<<î'qž%¨¶)ᥨÏQIÜõ‰UÜúÖÒ#?¥GÜBC…RŸùàq:‰ñ,A¤ŠàˆöûQ%úëTÁ]pÏŒwUpÜ3#Á]Ü÷ÌHd¹IÜ]¡ZIÜ…²"Á=›ܳ)Á=›ܳ)Á=›ܳ)Á=›R\WpÏ ÷lê}â^9Òá÷[ãŸäâÍÜöL¹;õêæÐ˜Ðqô~*ñ›¢ø°óƒ¼ã…ÝØTzò¦ç^š­^¯eÝ¡°÷4ÏŸ!vY¨V @ å ×vü@ü îÙ~¶Œ¿[µ–ßlp‘U ø™+3Ò,¹;Õ¢­Ú ]OÌ­ÆE€³Ysj›Nôœ¡¢ºõY×ZÁÃÅ¢ã‹AwfµæºÞÛ,ÌÝêK ^",ËZ›\0r-ß½ï:ùnkmW5¸ÈJºÇ÷Ÿ{»èùÚèé2ÙÚØ,:üv¯R–Š=°š²éˆ³žNï0è‹Ä õ ¡­éð£5ªz9h.f•,ófÀŸrÕDi4è®Xô·ËjÕE.‡Jü™tI^‚üðÝÇp×{=KV7Uz}öëߺw[Z>¯Éþïw{è·Ç ¨Q³äÞc>iyÛ©ëä†m¢õ·%ˆCuÚz?숕·í<¥€"'Ô7ž;Î(:òÈ0‹!±&¥ôdz÷ ç®yÅr±€—Uˆf·ÊŸÉBÝãwy~øîc¸£´Ê­ n%B‘Ý:»-‹¸ô–Ä<ܨ‘‹õÃi–Ü*-ÓÚP⺉‚·ÍJb§Á,‡©Ãm)\DzˆHœPßxîØ~T(¿ëJ™Û%UIþŸwƒþ”åJeCöcwƒºë6hb“†d97ò€žÉÊw´¡b¯å»án`àNU.IÑ¡ª›5Õ¿uv[x»î/‰:d1m=%ò§ÔLí×R œU>’ÂÛn»•#ºÁŽ ~*¥€¢ ÿµ÷MsŒªD–õ?å:²÷vÐ¶Õ ²=—2½s~$Ù»JÓ§VîÉl'»uv[›Ô%[? „Pé=ÎD³/ß©½ÓÕèv½àÈ.»Ov„·÷€ƒ G$b `”Âå{ÄÞµ*5óa¤º_íså;u7ä¸3Ûž¸|g~¤•ïÄÞËR^âÞÕ¯Njïåv¡0Ë—n͸>/ÉFD†*Õý[ lç-¨óÃÚ2vÄJ+߈܋EÓR·^}ž–ïÞ9šÉ—!ÂhùÎÜi\>Ï\NZŸg~¤ÖçáQº(YC·a¨n±åߺ_¾Ã¶å/©F²Ó@•âHšiûÝ…ö;ÉyÛ›y…ÃÅoÛAÏB÷×ãŽðõù ƒ2óÃûqŠ›ø8qÌÚïÚêóþ9ÄfeÔÈò‚ÇZÇ}Ú~¯ðî \½Ž]¬–Ü~/sP=?j^û½Rá–Ø ®ÏÊÂ2£±™Ç½¡ú¼låóÈ%[2z½òûÊ]h¼ôZÜÞÙP‚ûÛ•Ú3ãv î¶*+~ÿ[‡àžQ îÙÔ{Éýmçz•„õ7t‰÷A‡å^€ökãD"¹Ìa%ÁMì`e¥RõF^è®øË³AÌÙDg…[ÄùXa¿ÞØ)k>òa÷x)—˜.@å)‡¶§Ð!¹’,ÕY—Hx ÒïÀ°<îV:­ö$‘Ä<š&æÎ.ëuña÷:tR.1]€¦ÚžB‡ã^h@ʯTê?éuXÒÍ87 ÜË&é’¦ƒ±¸?>4š‹Ä1Ña½Ú³õêPò;G¤ú&NZl$“yPæüeûü#Ú1s5;»¬×= ;éÀÅ'z§lš  %ðÐÀµßßã mã!ìÀÐl…ë š^‡ãž—ZhQâùHo€‚hƹIàÞo‘þ\n06<š‹Ä1Ñá¶SØ„?tºÌë*z†Âɤ yþÒ}ü0‰Î˜«yÜÙe½á w4`CO¤§Þ4¶ô¸ö¼õ†¶ñv`h¶âûtŽû@Æ]Òl²ˆdK6 ç&–;z&ÊôöÐÁØðh.ÄD‡²ŠþP>A?òlÝÞȆä?ƒáùK÷ñB$:c®æ=Å.ë ÿ†¸£Zz"8õ† ¹àÐPr\{ÞzCÛx;0TSñ}:„Ç}#lïÁH¶dš$Ûš`°=ûFewYåû»é &=LÿØ`§ÛÞDµ®ÀH&=10È[ Fø«U¸_|YbïùX{§'ÒSnÚ ¬JðbPæ«7´÷„oˆùtͦ| D²eà9ÁI+Ë^ùΠƲ»lsªHýj„»Ÿþµ|Ô<ƒ¼•8{¹Ï_–”ïÅpØqùÎN$§ÜtÄÞý€‡®=o½¡m¼‡ùÀF¢ßº½ãú¼ëÕçÑq˜ V¢–±b6Ë!bc¶Hl3ÄvÖ]ÕʇF2éU8I¡Ë ãAܸ«yÜÙeq}¾çÃNëóìDï<øÄÞ/ðxcPÆÑOO+!î¬ßfãÅêû¯DÖã`‡ÏàÓ¸‡ò€°'˜ýTÜ…&zb›Nå?:>~|®>xŶ÷iT™M³iBâÓ%F>%î³ùëx3ÜÓqO(Á}zEMžc nѤ¥û‘€ÇùsV3 Á}Z¥>G1yïÃSÜ“ýªI‚û”Š˜{ÀÖ½µ©ùû9@ø!‰(þ ÓEòÛU„²'MQôw¡·,MÑjv¡­½ëp½UtÅ–ÚÅzAÏ”lW+ÔsÿVjÆš endstream endobj 742 0 obj 23373 endobj 462 0 obj << /Type /Action /S /GoTo /D [740 0 R /XYZ 72.0 196.341 null] >> endobj 743 0 obj << /Type /Action /S /GoTo /D [581 0 R /XYZ 72.0 414.551 null] >> endobj 744 0 obj << /Type /Annot /Subtype /Link /Rect [ 362.97 198.441 452.97 206.301 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 743 0 R /H /I >> endobj 746 0 obj << /Length 747 0 R /Filter /FlateDecode >> stream xœÍWYsÛ6~ׯ؇ÌÄÎX0 >µÓ$M&í$µf:m”š‚,¶£Ð(ð° 3ãÎÌÍâ#:’øRi­ÛXñ”².|"q¥pý6eðcÞHwÑ[Cô?~‘ï±ÿADî?¬ׯxVÛ¾<æ“@"ÎRrPÄgÚþ0X¥ðéâæ>YåyrùVï¯Ví«9=[< ÿÒTÐhCp:ÞTבßsñŸßñC˜Àw°[I›Ðöi7º¥hrϳ€´¦ÊÓô4H}Kçç3øÈ!j”_°Õ7†l–EçÛÑÒתíSÎ8á‚ZšKB=E)ÎPÈ1Q ûV¹¾=£ ” Ô—8WD”Rµ°|?­~~…ÙçEåÌ4.éD~µ3p K_bå]8­žoóÃ`{–ƒ½~YÆé>ÈUáíÜÔé~ —m’Cï·aG=åIf3fgqçÙ Šm^ ­…Õ$ ÒÓ¿çõÀx˜]õT¾º­‹Ò 6Óð/32` v%<ÄÕÂì²:½5 íûÚ±)íÒn$æ`K”ù~—U…ö­Ø\Ü||Ûá»5Iþw&3EX™ T(Ú¦•ÌÃÑXFJSÏ— çCb²WpÌPUo;¢±Ô®Í—°Ë%£$/MòxÕÑ·& ëÞÌP³_="bÝz_ÄYïÃäè7££tãxS»×îXkuÕ;êCß›(ÞÆQ9·Mdw38 &p4Mq Ø‚º+ó’¿ä˜s$w·n9RM}Í…¦x<¦)p·nŠá”†ù²Oâ(îÍÙ—cgQž¦áÀ˜{Íë×z:|Áˆò±…d'Þ}½Î£Nw6NPí)Ý£·Ûãò±é$·Æêè#ü³.«¯‡Ë}M¨å*P§Ã=-ÞSªWC¬çUáé‰|Óhyl°Ý AWX†6U–Äâró4Ê7d–WVú¡ˆ«Ê`מ}O¦x?#æÎa ÓôIñ¨<,˦[IyŸL”}õ´òùü+ù<Çššð^S>ÒôλÔ>aì¬KÒ)x)ÚÛFKeöìl¤_µÌ#‚À[7ûÕeoܵƒæ&*â}u¼5 `Üó{˜ë€ Žùƒân~ž’BK­Îy * £E…-žìKtÖQ'”⹪ǬIJ††>Þ3ˆ ž–Þôºqôáó™–Õ}Ìœw²’cƒØäê6žã_dM²nØÄ‹© ÀOa Ú¤G–¾ Ð4ÇšEs¼KiPÓz’Š`›êÀ÷¸«§ëÓ¾D©?Aì•K][¼€go7/aW¥É²=”±)q>á§Þм¥G—^üøK¼ôƒ? ÎÊð€ÓåÙ ó¶À0%|q4?—Ò¡ót„+øë•ÁÞÀ^‡ì`²s+ÌF03(©ÄïEŽPá…¶5x}BÌ“ˆNÈà-v Ðr ò}Ýå†lÂ*<¡ê‹ÉË7§ºw‰¬`}CœUæÎWpˆàÑ.,ÖŒ®/×—ß0ÉÅ©8+ B€fr´x“Ú”ë ï žç™yÞi¿ãþI@¢Ë endstream endobj 745 0 obj [ 744 0 R ] endobj 740 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 745 0 R /Contents 746 0 R >> endobj 747 0 obj 1282 endobj 465 0 obj << /Type /Action /S /GoTo /D [748 0 R /XYZ 72.0 696.0 null] >> endobj 468 0 obj << /Type /Action /S /GoTo /D [748 0 R /XYZ 72.0 627.125 null] >> endobj 190 0 obj << /Type /Action /S /GoTo /D [748 0 R /XYZ 72.0 532.512 null] >> endobj 341 0 obj << /Type /Action /S /GoTo /D [748 0 R /XYZ 72.0 273.56 null] >> endobj 749 0 obj << /Type /Annot /Subtype /Link /Rect [ 441.884 546.012 540.001 555.012 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 305 0 R /H /I >> endobj 751 0 obj << /Type /Action /S /GoTo /D [581 0 R /XYZ 72.0 370.185 null] >> endobj 752 0 obj << /Type /Annot /Subtype /Link /Rect [ 438.964 442.336 523.276 450.196 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 751 0 R /H /I >> endobj 753 0 obj << /Type /Annot /Subtype /Link /Rect [ 349.73 275.06 451.68 284.06 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 305 0 R /H /I >> endobj 754 0 obj << /Length 755 0 R /Filter /FlateDecode >> stream xœÍkoäÆí»Å4(_`˽•C¤©¯qp—\ÎîA6´«Ù]õ´š==ì[ýïåÌp’v·î—´¾3LR3$‡äœ‘>^Pâÿkñ'ͲÚ]|D%i@ÂIqBhê%~Fv‘,ÎH-Ž@1ÁPRq´B¶äç‹æÂ'»øõ7Tß‹ÉÓ…?c®ØÜ_üÂãÄ “,ÏsÔ5ðh– ¡—°Ú‘›»]@þÊåh­½`äÿϵw5 ið ‘O6y¸¸y꓇µ „^š€“$"™¹ø ÈÃŽüzyÿ±~à¼~ñyøþâö—¦æ‰à àêÉ=ˆ#üĉ.C·Tø¼PÑ€â1¬A<ªÑ¡øW<Ð`, ¤þž4²r&OÝ#-õG ?í‰4Š—fŽíÇAõ›læE!ûôbüY,ýÂò‚D‰—’ËUѸ¨;n®ç-3X¿µ0úýÐtÝòAÞîŠúÊàeÕíëâP,k;Åëag¥VMÏÊYVMÑ,:¬×¬µ¨}2tU³9Ê¢Û³UUÔŽèÝ®hJƒ/KO¹Õ1WàOìõ 8™\>2¥’DÖUÛõ³ëR#‹z°ó´•$Ò; Çœ¥4ó²òG–'£ùûÙÈ,ó"12";òî‡ûÛwðçáG²ƒÌ¶êAòâ²*¯H×·¬Ø-^÷ß¼þûíýâ2¤4¸"_/^¼<³÷(MÀR1´étï¥tmOMÍ‹rºûä~3»vâ³÷…íE°ÛR¹ù0>án>äÀ@ÒááT¨9Œ¤ÿGø3ÂOŒ§ùX†%£ÿ˜>14º‚i}bÈV#ÂóÂ7LäŒt²pŒ† ‹Ì4r Ï1Œ½¡¥Òh§ÑÆuØÔ?Síž³gGÖAÒÔ8g6. 3~';÷þöõí·¸wÈ«w?¾±ÛêçïnßÝ’ª$_±•^Îv(…• –I\b;4Ö¬ó)ë ÜŠ}çÖ¹ÑaôØI6O…Â()=2Ýê‘Ô`óGV U¹‚7• p…¨øRðg'U"Qúágñá_|}Rí ÏÍüÌ·­5*Æ Ø1«ãÓ¶°¾9šÞÙ·vRñXT5ž—4÷ù%‰&ÊøàɈ'—wŸcR€©!J sJÖU›FS·zlQŠèšýÐbÎpf/õpÞP ×i¹ïXQ²VO`Ÿö ¤7+=þ©ê· ùÕº‚¤×kÊ–Õµ†WmµïÕ‘.´FÆan‰4™XÂYÇ55©U‚û–/Á´׬hÍCe ¶CY‰4×iÂÒNáüƒRM¢ÒÁZ`Ü"ƒ¦Q‚^mνSí—Æäj5v2ªÃÄ÷’:©ÌOŽ,ŻMI¼‰—'!t£ÁùyJ«›}íuë “*9Ì…ÊšgÏ~dkEqêÅYæÓ =Á€JOÏý Mò,ÒÅ-Àuî%äò»D™:õ*BYA¥¯–ƒÈã†hÕ-Æ™ šc*úÓŽ„x$‹žNq2dj&N•4¢1($ 1`uÚW«öd↡ßbŒ)RÝ1ƒ¨PT³:wFØhÁó0ò!‚XÔ¹Úg’cH³s3h›Ž}†BD¨Ç8tJÁ,à0v¼‘Žu(Øp@ú ØuOfÕÌqòœ™“N»j³(h¢ÌÏ9•¾Lâº"wdÇ`u5…[ 1ƒlBøš(—=m%R<4YkÞÈ){Y¿ò/æ÷QazQú'Ê»Sù"÷"¨¬ÃÕ˜Ô$iU ë,Ž P¬mykQ™ÖnÙšµ˜°õL j¹ÛÂÑc[8îw¿. A¢¸+„ctö ‰a §š3Ãñ¦Q-ؼ9 ‰¸‰œ¼9…ÒÀÑ;ŒðÕéC]wDDË-´Âr¯BùÌ-a”'^‰7@>Þb‹p ²ºì4Ô'©z‹.ÃYÂ2Æ%ä”b5ŠÃ1V#*(pm ¶”©D"[Öš©K&)­Ì\+×\_ZqqÕÏdgBmé—àÝçÄZNmÑ›pÂŒ‚‹ž·p±ŸMŒ·âîä!mSù W,^5ÞUj[+lT˨¸­Øll%£æcÄ8(Ô:£Y_Tug *—ÔOÏÒî]œB$n*‡åµC;Üa¾siÜõA–ü0ÒZê1·\àO,d"SØBvXÞ’…¨WLÔ6æ˜O’cP%o²¥½WŸj\GTv§Õ®ª¡Ž;$45uZf=Øi:nš¯,û ê\¾(Dù(wÆ92°üá Ûâ"óÎÂ ìø«‘¬æ¤äs|NÞ„¹èdsH29=bHÙʾڣòjOÝ0Î'¿t[A"‹‘ý`kÎ=Ç^Ø”Ql«˜EN¿ €ÝëË›Ëcü>Ö=çµ÷îöÍïo¿}óöá—ßßóîþô=PŠüÄ;š9C«ÐŽ—Žzx7¢Àa³a^¥¾ÆÅ´ÎøÊ‡q ?gŽó ¬ZØÊõÁ‰·ü·àè¶cÆJDۑ핤“µÞ­ÕíSŸ\‘^Û¢yÆ'qF½ Å9§?ˆ¡h§j~7íÔûn‡‘|å<Ÿñþ[0ÌÓ™ $_ÇÑ'ñ/"Ÿš/†€¹„ÿB!ü`&&˜È}9dèOhܡ⚩F#Âs>c‚ñIŠ"¬T$>˜k3rØÔ?Sížó‰ÀÈ:ø¥ÏÔ8g>ˆóÌ‹ià‡Ð¾Ï·?_7¿Àþ'_± δT‰üH0ÌÓH¿÷5·¡¾/#xo%1g+ T'.«sˆAMå˜*<} G^”‹/ë`͵:» ‘ÌÎ̵ sêÔVå‘+CÑ÷¾Óe¶ Ï rÐP×ã{½³K.fr Ó£µ-+GÜgÙ+ ƒÉâ -Ô)µÔ½¨J¯ Y:ðºýJFQ êõ(lÅ\Ì84ÀYeË‘)I]+ø K~0»­V”3ï{2/^†IrÄ ç^÷Dç&:Kêœ9Î8f›ÒµÅ Kà-ÚúÝ¡eóû¦$Šfû4)T;+ΔpžkÅWìãPÄû([yâá© é>«ÿ7Ò©…² endstream endobj 750 0 obj [ 749 0 R 752 0 R 753 0 R ] endobj 748 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 750 0 R /Contents 754 0 R >> endobj 755 0 obj 3647 endobj 637 0 obj << /Type /Action /S /GoTo /D [756 0 R /XYZ 72.0 528.64 null] >> endobj 485 0 obj << /Type /Action /S /GoTo /D [756 0 R /XYZ 72.0 242.56 null] >> endobj 640 0 obj << /Type /Action /S /GoTo /D [756 0 R /XYZ 72.0 147.32 null] >> endobj 757 0 obj << /Type /Annot /Subtype /Link /Rect [ 180.31 346.42 266.69 355.42 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 630 0 R /H /I >> endobj 759 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.357 97.98 280.357 105.84 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 751 0 R /H /I >> endobj 760 0 obj << /Length 761 0 R /Filter /FlateDecode >> stream xœÍ]sܶñý~úÐY•` Aò!“±Ù£Žâ&–’>Di†âA:Žyä‰äé¤ß]$A‚<¹Ó™´JbËÅ~c?à<®ñàŸsüÆœ¤ÛÕ£1r"¤’°J/"[b6Q‘GKD1KÑB ¶ÞlÈ?WÅÊ#ŸV¿ýHkâÑ€VžC\“¹^ý ÌI…Œâ86²rÊ¢Y*a‘nÉÛË-'?”-v'=òþçÒÛ Æÿ$òÈÃêýÍêíÇ€0ÜÜ!À¸ ¡;K铈 ã'7[òÛÉõc~S–ù›ßÉÍßW7F5}ƒ‡Ã¿!m#hô!ð½ñ+ºzø…ÿ|*4 ” ~ÊCÍoüÐ-ƒÖ@ú÷¢A )ëðÔ=­¥þLæËž@h4r€Y¶ÕŸl2NjȻW&„8)ã¡.—ü]~LšÍ6i²4ÉÉÅó®Ru•ùÇNUISVµÖtÆ0œF>X%òCMë–ó@ã<ƒvùùæâÓÅ—?~¹†?~}÷åòÝû«‹?>¿ûñ‚Üž€eþ¤HS’¬©ÉS’ïÕí› UŒe‡ ãüoíäö p©w*Íî_蛪µ*Ò9aH=ÌuRøÇx8hs(Å1å\ý#”´s‡㌠Eâ)ïÔ¥å ê£gd¥å཮³§ CeÆpL4@³‡â¨w\¼¿Z„I¥¶IV¬U5Ç"‚DcûGãâý XìÊÃ@õíG¸ârÛœ”É)Úyy Ê¢©ºÔ;{)¸ˆ)CÃûQd|_¡ZÆä$Õ$,È¡¬¾ÖÖþîeŒ¾Î0G’ç6\=«tßdŃ}0/Ó¥òÞÚ|(·Û¤XÛß“4-«õ˜\¼îö)}y2µ^’9/0Ÿ8Nã›ØFõ§¦}N}\ ©µ¿…Ç©Ï!’…é/Ý_t)Îy ð %• âʱÉ8Û]Y5IÑô<ŸF±ÏX„‹ˆ‹@êaòˆSÎñæÂBHÊÞIGr-‡œÌ#FC´%¾ŒÇ A6¡œŒ /fúž¸ÎZ#âÔµb×W°ˆF¯«Â|‹$H‹ÏÐç¶0Ö‡-iU¡‚ QF€cFAÄ 2´vÔ÷§|VŒ‘o¦®˜Šµ,E8±‡9æXn& 8…Ǩ 1š}“˜P÷Y‘5J_Tûbؤúâ€.ýÄNÛýyì:¡ºœNÛ;zääû~•¾’Ñ8‡–Ib uIB鼡×O™: »dXæYÝ ;žÌñ²N<%YžÜåèÞdÑÎ$}Õ€ºIµUESŸYdŠõ$¡pVé°V °«IrWî²> Ë¾†d£¶ÔÉbB@«Œ%% LI¹Ñ²C³Áf¶ë|­s¦† ÙZï“ʦ§mäÎ?Òqy'Óú̈öÓÕ@ã}Ëðˆ§â f­>“BF}†¡!¥“ÂÛ©UŠY€8=)”lòC˜å\J:ŸËèWºÓ²&·zJ¢Šu ð7ð‹ý¡_vÑgŒ `Ea4dÃvl« $ø.S?%U†½&à²\Á|¨¶X_}è»]Ú§ä5¢G6ôïÔ†§c²%îUy8’C%\‡Î0_Îq‡{`Òþ!Ës’n’âA‘¤&ÐC¼¨µk`ˆK*qúêšY°¯®0xú}ÙЛEÍ|N½ÇÆ\Šº/ˆBFó~]Ôpb¸$m4:d,™L·r\&æA·ÂÁ@2àÇ…Â ÊŠ½ZöºŒh«šÚ!u6©9ÝX[½,±k[…—aSoTž[Û´Êvªl:ûÜRY{sØc#aíJ:lLïðªû ð ¸—aþ7þƒpâáø°Õ]B©ƒÆ£è–I^—ÝúNu+hŒzä¦ÿþ¸Ïšºé‘¡ØWºú¶Û럯ºå}–÷X‡¬Ù`ëÕ¯²‡U™±T ÎÀ¥‚ Xu›]U¦˜öŠÚnO.©¢.ÂÀ+w§FÑ×6F»¢ŒÃΨ¨7…zn†]žÖ·¬X8´ÜЉ€8N¨sŽ`Y‘æ{,ðËW!Tpó¨âœ0¾Ð›Îz§ Ü)ž@){²j]kÎæ|³©ŽˆÝë—ro±Þïvy¦¦=ø0`cU·û¼Év@Š0 aý4WÖýP¿¹G1 wV¦ÍjR@÷ÙÞ¸Y¡=¼˜Õ b>¾°Æ|†æ)9Ö ßò½s¶SÔI”ëIU/jÈú¥­kµiVCô߸i›ô:Ùî°è–í¸Î¼ ƒÙ¨„.# „yá»xn|°¡äRë|yO®»†ºIñ(>£„ø0‡<ðÁ ø’‚ÃƒÙæ ) FÍfv|H‰º—”sƒ5"y©›ë-~$°ådL¸×ià±X²éÔÞóÀÇÐ ¿aÌÉrÚ>ŠNž{Fðí™7‡ ŸðÉ4|Ø­‘Šq$²ßb¢ëi@ŒÔ6 Nœ)ïNÛaSÿL¥{U˜©u hjœþ•%&Ñ$œ¡ÿ£0Õx^ Ìã-¼yäöäô™|÷9ýüËÕþUÀí#ywWVíK*T‹‡*ÙºÙÀcshÄå@‹ ×Ö, "›u;΀‘ÃCųhÛòªç¬ùÐ=*€È§Äªñ6¥ ¢Xó8ŒGRº˜Ð--Û§(lÔ/žà–·{_üzñå‚\—[ÕlÐRw0äl’ÝNªŸ g^уXÂHÆ¡ôÂþ=¤–#=Šÿ™''“ùÞ+ý°8ÔýRW½V&gu{]^ôÚT½YÎÝÐfEpBÎHÀ[ýj¥mŠRµ/ÅÌ1ƒßîrZ?N{ŽãàòÑ Ç¹‰òs„¯ øjà8ë•î:_½«70Æô»eܶ§ÓË}=Øl[¶/wzÓ>ܹ¸Kê,íw?YÖWI³‡Õñ@@B¸ö£NÛîCÉAB§ôa˃¼À$Út A{Þ—ƒðÐY8—C >9ºItïgbóB¥—0ãê¿ÿxgúX½Õv5Ý,ëµ¶¬Kq—@&J÷yR 0ý¦×Æg$ݨô«ÅdÓ^ŽÝôTz—Y‚‚æ‹uVCÓ}·+s§pض䬿šFÚP/-0!íærôý‰9±SYÏ<˜dŹIÀ‰½òNÍQÿW‡.Sòý‘vì(Ia¢¾ßçùË_È'ìza°IHµ‡nªFÿ×Å¿÷S - endstream endobj 758 0 obj [ 757 0 R 759 0 R ] endobj 756 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 758 0 R /Contents 760 0 R >> endobj 761 0 obj 2635 endobj 653 0 obj << /Type /Action /S /GoTo /D [762 0 R /XYZ 72.0 720.0 null] >> endobj 494 0 obj << /Type /Action /S /GoTo /D [762 0 R /XYZ 72.0 444.685 null] >> endobj 763 0 obj << /Type /Annot /Subtype /Link /Rect [ 89.391 528.968 136.574 537.968 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 765 0 obj << /Type /Annot /Subtype /Link /Rect [ 457.943 504.968 508.651 513.968 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 766 0 obj << /Type /Action /S /GoTo /D [581 0 R /XYZ 72.0 325.819 null] >> endobj 767 0 obj << /Type /Annot /Subtype /Link /Rect [ 251.809 470.785 347.809 478.645 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 766 0 R /H /I >> endobj 768 0 obj << /Length 769 0 R /Filter /FlateDecode >> stream xœÍ]“›8ò}~…jj«6Ù²eAö)NnR“ñÜÖÞÎ>`Ç\08€ãøå~ûµ>ð$yÙ;'«õwÓÝÒäó…‹ø3_,"(Ù]|Ö81‚¼@£ü¹ NˆvH¡¢\l,Žô$VïVÀý~Q\8èÍÅŸÁ¦9ØGÇ Çb®ØÜ^üÂý{AE‘Ö•`7 …°Hvhqµ#èU)w·Ú FÎÿ\{S#Ï%ÿ9èáâÅêbñÚG®ƒV›>\âa€Ÿƒ€¢{$‚V;ôç“ÛÏùª,ó§¡ÕÛ‹åJ›¦èDòøË°Ì ÁŸ:Ã'Fvuø ÿ(ö0˜ø`ƒx”ë€êoñ ]úÒAêû¬C4+ƒxé©¿SøùH008À'†ï‡Iõ7»ÌŠ¢í(~Ž.ª´a`F80 H|ìE‘ã8.Ó‰õÛõâãí»‹·7«Š‹}¼^¬,~šp’ƒ¨ƒ™ë+PNòZm³=E$<©yÒdeÑÁIù…Wýã4nâu\ó9/²¾vkž¦<í6äqñpˆx=ëPÇm–l;(®x·.7 ïEjƒOÖã›mO‘òMVd ËM¯|SV}U&<=T Œò‰áŸŒ¼ÐÑÎ=†)z²9ÒÒ>ÊÀ7¸G))‹×ÑT‘p)sh‰ÖÁl©íøPϾG>ƒ,#)'š–9tV>æqžúœÎ*C<G´¦À³ÙÉ~v^æqä¸4œÐÅPE¦™Ž<Ï{èSQ‹ä_ãÝ>çf7h÷ßðê;Ì¢ÄÇQf(>?cH x1J‰ôæÙˆ8¢Pß³)¿P?ÄÔ“( &ˆÑš'1¼‹èPäÙ'ŽÄëç ¯Š¸É¾ˆ0'$,*AŠà],÷ðƒTTïy’m²$–¯îŠïç /PÒå· êA §@M!²ø1¨ËC])Š ªDø6P*¾/Þ±†8Œ¨ E!d—'J)üŒLƒ^DÝ*.f¢90šoÄ„Y"šÚ³C4ˆ˜\` .90=Ûãwȸô3ÚX`»Ó…Ÿ jÐÂ×$!2”éÊ¥¨ý‚[„4H®’r·]êŽóc|ê 5£…ŽY³m׿¬tH%”õŒ:ºUœä|޻ͿÂ8S«ÙD"¤'k5ÖHDYLØ ÙÐNŠ9,*²ê‹ê?ÎRiµÿ(=H5ÉÔY|—}í1Òaz­ûv œÆÒÍ1O?0rBcîÁþ„ï ¡›ÒÔ›7MV<rL]&Ü"^ü[¾ÄU¯e¾Í»³¥±ÞÊC³?4¼é×ü+O¢=Ý?õضéuˆãVަ:)7k™=ØGHÁ¦kl=õ‘pfjªfÅ@ó¬žp ôì¡kD¬ûd[Ÿ~5±5÷ºaÍÔ…æï»ŠöNZ #fÔÖ-cl„c‡ C†(”áY*¨Æ*oŠê&>v„ïÊ”ˆ¨Êžœ˜û"¥C`¢y\Oµ¬u-Ñ€Lr#n Ÿ€z°ÎËäS=ÅKežZ·u©C¨sî`õ¾êÍ=õ²ê5ç锜6íl©—÷÷øÒP[@+ô’‘gT^¡™I­ÀJ†I»R×¾=ÔMµUƒq¿,¸ÁCç}ÐjöˆÕCº6kèòÕòåõó›ååÌÀ½X¾¹z?À¼¼Y>_-{Äë»÷/WW`“í è§Co¨j廢Pœâã͇—ËWw­ ©ÕW€a B³Ü€âCSî`,Nâ¦0l;¡#Ü'.aL%ܳÚShb0´„cíq/\ßžµ ‘TÙ¾±3Ë€ƒ8ë8:ÛâÇ9ªš  cY}2 ]¤FÏÙ9ÒlÓ¯Û™EÛø ëºõ¢Äé!E®“ŠÇ±¿®Ð a¼\¹—†Åª”oâCÞôˆ:Ùò]lX¢«©mˆl—2wäÒrýo¨(-á-ý4ÎÁŠô„øWÈlÉÈèæ…À©Œ„PgüP_0,Õr1´ôµ*ÒÈîâÁÁâÖ‰{ÞˆŸÂË+.D½t]ÌÃQæ Ïëîæ.d¨xLÔãö(l Ô¹Ú`‘£!ËîŒÛ^Žº ß³dhÔðØ?¡O@Ã^œÐÇBü€BúÚÁCFr”NR}¿Cc§Ù‘#`ø«£P–6Ýe@„ÆWòT*~ÁF]}q¶øYYê‘;¸¹'íõÚ/è§«ôêJ/ I f³hî¸s—!ÇæÐg>ù:5¼µ)úi‚¯â@ð…¾Úñµw=v¹„ö»dÁÒ—ž–I¹Ï@Ȧ*wò®ïò6“>VåCïj¯´z.'$ø :l…¡ÓÛ×2‡sȇù»ø„^na¶ž¡·|³AwysßLðß`@E&.XÏRP@4EK”Ö¡§A†Ðô¶’QV)º+2ñ[Ь9¡Wíþ¦*ûŸk´—½Å“1;.Û¦Ù?[,ŽÇã<]ã¸Ã¸bžÿ9H­›$]/JYƒák®‚¸mv9ÂBÂÀÒ’¥X–íŠïJàºÜ·àüñ ‰!¸F÷¢Ž& ñh]B;ÆES#Q¤-1âbqeˆê œ$ã §yþq›ŸæóîŽWôˆ$.~n€” –êøv•¢Y!¦çkQ!»«о(‹¹ZŬŠÚÙXª«„\LQ–Ñ­ÇΚ¡ò÷O¿ëš‰TI°.¬[·‚K÷yœ€Oeó±$ß{’gpøénsfRuý4†Üj)— ö¯—Hvcmd—-Á£vÌ“²‚ño_©°»ãˆŸXÄòj%†’gêývy½|¹êvÚR(µC¹QoË£p2_IèÖ%s@Œ<ÅÍÑ !iÊ?¾gEz1±-ðƲ÷0oäj}¤Z=q ?Ýû)¢Œ½Ž®Þ¯–o–7³ ŠˆŒ=ŸMKa@K™(2ÊÞÝá[&úÄÃ(ˆ˜§ö¼‚¸‰¯o>¼ §ØzÎØ@{uÀ$ÐÐ4Û«÷·Ë›•°é°Eÿ|~}·¼½âÎ7­<…á_8%ôÏKñÇýëŒ2CtZJÌŸØÃÆ} ºäó5T=Ñzº„ÿ œ­ÎÈÚ½ê@x2ý0yI_LlØ7Ý8V“OŒÞß½{±¼™°>pÙ7­ˆÕà³~„©ŒŒšØCý‘5ò þ“ÉÎ9k% endstream endobj 764 0 obj [ 763 0 R 765 0 R 767 0 R ] endobj 762 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 764 0 R /Contents 768 0 R >> endobj 769 0 obj 2883 endobj 497 0 obj << /Type /Action /S /GoTo /D [770 0 R /XYZ 72.0 506.661 null] >> endobj 500 0 obj << /Type /Action /S /GoTo /D [770 0 R /XYZ 72.0 281.449 null] >> endobj 771 0 obj << /Type /Action /S /GoTo /D [581 0 R /XYZ 72.0 192.721 null] >> endobj 772 0 obj << /Type /Annot /Subtype /Link /Rect [ 154.1 508.761 316.1 516.621 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 771 0 R /H /I >> endobj 774 0 obj << /Type /Action /S /GoTo /D [581 0 R /XYZ 72.0 148.355 null] >> endobj 775 0 obj << /Type /Annot /Subtype /Link /Rect [ 154.1 283.549 316.1 291.409 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 774 0 R /H /I >> endobj 776 0 obj << /Length 777 0 R /Filter /FlateDecode >> stream xœÍXmoã6þî_1WØÄpQ)1ÅÝ!·u»)²/}]àê¢P,ÚQkIŽ^’Ýß¡Dë…¢Ýì}èöEÒh83|8œgèÇ ÿ\È›ÏX'“G%#à;à2%¢ ˆo1;€ÔK@ØIÅÁ£TQn-UÚÍË|œ¤¾Ÿüü *E`[ž'öÈxcf1ùSf¹,àœ«X‹táZ Ö \Þ$|›ÕÚ‡è¥!û}?"—8ÿÙ°ük9¹üޱa¹éR€8®å3Ä™1Ëu¸¼X&ðóÙâq·Ì²Ýù/°üa2_ª©5ãdò8ø×·ê | ž=üÒË®VÞIñŸg¹ %–CqòÓN-¨ºË‡GZÔÜ¢LõëËS#õW:?¾¾‹+,u{Ø“ê/†l´ŠÒ·mq_ªrß¡ÇùvRWÏGUêaâÅ °AãèÈFÍ¡Ô"ÆNŠúCÝEkQ›pFô ¥%§3êhV›z2r— æz2}uÿÁé@”A·²rqðÚŠáè¾U4v„mˆåO]+š§mÞqig“UUÎA“r=Â,§Ö D©àµ˜ßÎ_/AÌ6pónùÂÙ=|w÷þ-, ||3¿›ƒøùflÌ¡VPÃl9âÏ¥–øœœuþnÞ-æwËÆºøéúößóÅêì~®Î nË#‘¯Î-Ë2ÆEm y´Ùwe»Û ä"›j9Ë =ìˆwY‰ +œ•a9kßâ´ˆ£îc¶ióð¹}N²Htc>gUû¼Óö¹*:Caú¹}þ=Æé<`r$aYJ¤úÁõýäíK›YH·¸iÚ×Tˆ¨è¼t÷"OⲸjчÀäãøpr¦˜s"¿¸€û]˜þ^oT\h¹Éð>IKŸqQÓ-ê<Ç»&(”y˜èµ”I¬íŒ&nk\.mn1Æ1]å½N³M¼È©r• ਅ磮‚Y¶l(Ï7ØÒ³,pNj—¢(ó*½,w%V"yÿ-/-¼üû¸Ë´Äs°œÄíåíüS˜ì1~ba“ ‹o/ÀÊ®¤mÃs¼¹p¼Àâ’PIÓeÈ”Qû‡.£æR©å5Z"î‰rïYªwðþ²—ú¾;ò¡DÃÞÃG$yˆ·ŠG H_ð©ÞgäÆÑüôcê}PÈ@E4¼"©ï¹ÊEçU‰ýÐ8šÁ‚éë£G÷’i€N#s¢UrðXÊ|Ìeжî÷,Æ µ+iK__ßDWÐmp]êâ³9žm/ÐáWÔ¹"î J%9GðµÁ2ñÀw‚ cß±V€ jqÂ;­%îÝ¢Ýlã1&9&°é rtmOÀ ƒ€§¿ÎWØTéZ2>DâA|Zýt}÷úÍõÝê,°Wç3ÙÚÍ¿Ÿß­Î &ñ”ªÍ¯\”Už‡†a®«WšÉu0h{®^Xß·U¸ð[øšzUG/ñ Ù! w†‰€W¯o¯‹×Ë7WÒˆ%MZ7H [‘[u7ð~óÊ`š9ަ¶Òõ‰ÍX' ¯¯ooËðŠ8¯fXE}´Ë‰Ê4Þ`Ï2ý'üíïȦÕòlÛ€Éjõئ_› ›‰,2˜À£ðpîÓº¥Üœjq°¦`ƒGð˜rh±ÿ{®Û:Å•mWî‹äO¸Òcˆ¶ƒµÈå#ª ªü°xûTéùX 9Õo¨RžTä±ÐP¥‡bÖhµ5º©ºßYjJoÿý%<€¹7ò¡D-ãažo!Ãc½TñŒ_Ðu7Žæ§ÇM=ù)ûé€àûÀÒK¸iN#Es‚›¼@oÚ¸ïç&ËÓ‡åÂs“JPLmÖP“M.ˆ6½²=d§“Ô„3Ã#¦.ñØqj¢ÄnÈÖ§ì¥ÔD¬8ÆGb9AMÔáÚü :.×f¯¨ »pÜeëª(³DäÅÊøsÇ RÛ!ÜïªZµô‰MXíJ°gXrò¢¬kËq´æ¸]h–½Ñ@JòJZâ±"ÆñË›·óÅòúícÕ¦,Ð!ëø¾†—ÂbŸgkUX Rñüë“ÕY7©§0_?„ùhR¹‰(ž¥´ìà ϑñ&Æâ,sOžˆ ¹o?-D^â OSíÚÎצ5d63 */µx½¥ëæ…»*Ïû_%ôE‰Å×49VÿNÖÝÄ׬þìtš²ú°>L꨿Ϊ´DòE÷õ™¿´ñw+ªAÖgn»ú]ÿÒŸòÀ endstream endobj 773 0 obj [ 772 0 R 775 0 R ] endobj 770 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 773 0 R /Contents 776 0 R >> endobj 777 0 obj 1992 endobj 506 0 obj << /Type /Action /S /GoTo /D [778 0 R /XYZ 72.0 484.76 null] >> endobj 662 0 obj << /Type /Action /S /GoTo /D [778 0 R /XYZ 72.0 363.287 null] >> endobj 779 0 obj << /Type /Action /S /GoTo /D [581 0 R /XYZ 72.0 281.453 null] >> endobj 780 0 obj << /Type /Annot /Subtype /Link /Rect [ 329.31 304.467 419.31 312.327 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 779 0 R /H /I >> endobj 782 0 obj << /Length 783 0 R /Filter /FlateDecode >> stream xœÍْܶñ}¿‚¥')5¢x•ʃlÉñ¦dGÖŽ­¤¼.w£¡Å!G$g*|ºÑƒ×x’‡$²µ‹nÝn}úrå;ü÷¥yàlW_ç;ià„ £âÄñS7ñ2çà0Å™SáÀA‡p3”XMÀÞùxU_yÎ_¯~þmχ+oBœÈÜ\ýÌãÄ “,Ïs–5pý,C¡›@csp^]çM#G+é‘÷?—Þ–(ôƒÿ‰<çÓÕWë«WßÄŽï9ëÙ~ºizN’ÈÉÜ0ÈñOà¬ÎÏÏo¾T릩^üâ¬ÿvõvÍK£y¸yø?uåtÄ‘7ì±v—Æ,üÜp€qƒÖ€]”c‡jÆRAô{Q!LÊš<6ÔÔ“ù²%Ò0n60@œXºnªÿ²Ê&VDÞË‹ñ&{é£p^@—;Ï7Í©Új¨¨ºFûâÞŒkOµn“^}“O6°¸ayžÇ¦··H!H|7sž—›{l›ßĦï½é‘G.Ì÷¼(Ì'ô´8·Ïöåf¯á‡Á’«Ø´¢è…µ^ÝÚ••VkÐâráPt“$÷¼$œ.×^ »íî%Ñ2•Û4Ï2fà9Õ]/ ”7‚¯ùy³S­Í¾¨?•õ'÷{¡šèº²©5¸Ù‹Cá*ðº6SÊNµÅcq8VšÄƒn±Š™gÓ 3½Q­CñYÌÈ!MÛ+ˆ ÛhÕ.ë­8 øQ÷f•Å„°ùBØ{~’b­ÌAvŦ¬Êìï”䊚){§¬¡³p¶ån'ZäÀʘÐCð{ ö,aúkZS¸)m%jUMóÙ {ݤeS»9õÇ“éÂ…»ú¾é˰æ-Ù•mgzª²6]›¦îÊ®ï ÃÕWµQÑÝÊ€!¹-úˆµ¦½0ÃÍÂ[Ñ‘™¾›âÔ‰‰2“ØõaÏ{Añ.Æ9/ÏÅ/¸¬*Ý Ó®…ØÒ§Ip¹3mR ê{æa5¬1mÌ"¶kZ¦ùææ'‹”Ü;®AhkÍŠÑTUó@ß £à«l‹M/Z°O¹±+îšS¿@G' KËL”š¦#¥®‰Fà[V—ÐVTå¡!‚4„­ÞÌ9–G3_‰­Ï~檶ŧ›¦Ýþ{|¶bWœª^¼·æ h9nŸw·/–M‡Í§æÔN4“å#Í4GÑ=&–:ížà=¸Á«âÞ¾ŒV['¶6µ[a>F¡¹îŠÎ"·èTˆÉ’d bœˆýýïÞ-z’ öÏLí ó²»Dðn D£pžN¨ý\Ÿªê—EQB/:3ÙÒñ°”ÒÛ ¯Å£¥Áü(9,F°Å Ø7ó¶.pzúøž? Xƒyvmsp Y¶ŽÚ“÷Eu«c¿/WaB„äotèu8 )’¡X ‘á@-qA~ìF>Fù™ŠÆŠ¶†­¥9Àh7Ë#ßϰ‘a:í§+øé‡¾ë!³ÈNœ¹Y"Y· :&jDŽ~ñ# :@p‘Q¢lB•3$¼jâi:!Î(•0N¸ê±9/ƇJØÙq$H+˜¡Œ „1‡–bELD±g•”üivŒÒYt0/†m›±)Æb-K‘ŽôÁ¨±:–³ÜšèЇÑIêÓÖügs€ 㺢æØ"¿ˆ-rŠ ¼nÛâ‰Ûôõ0𰇋ÛEý43\Tâ§šQL_”µ†‡BF*Ñ÷ ãRIئ;úòq‘ I¡Q)ÜóŸ^øúÛ×:P™AF‚ЍÝêæ¡i…5¥v5¼f%TVu£›ÝÉb*ý_Á‡Ÿâ«›djS@±œ‘~Fi8RÁ“´óËÀ”¥©}"—%ÛÊÅbûxjçwÑÀ¡iº!b54¸p¡a|¯Ìl3u ‰Jä&²ºÕmÚòØΙ-~K&aF›Ì(&‹GŠz]‰­OÇÓÐ+ðR7ÆS0 {‘›õSfXoH*н,šÏ·jKg4¢3Õô\&ž…®ç“‰bF¶‹Ó ŽÏÑЋ©g„ܜږ# ¹¬¾iŸâVd«¹ûæ³Ðª”½l}ûùHT„9ˆŠ„h3IJ1PÜU¸¨EPb†_æ3 kñÀ©â… ÿ%×ÈòÕ“is²ZX…Î!çWÅ 4C*¥"èN,Ð,ëIÜkC:ŶÿÔà´†KjÅ¡¹Ç€¹9âÑUTN%Š-"Ì^À/¢o Èʽ+qÄ|¢ÆÊ„«t 1T0*gáÆeRœ+¹½eG»ç:x&^“Gâ[APUе< âLޱ• wSˆ¦'Jqs¹èGM`õ–'G„0BùxS´ æWŽEL{l7öü<ñÇŽ[ÓMü!]„‡Ì„;Äqx¾Þq¡: #QLÇÁ¡%ØCqýYlÄ%:ñ¡Ï, WF)qƼ•4Ú0SŒåúC1Jax¬PåN6Þ¦iìÂ˳4ÍùÈ„?7o×ÎÍ×ß¾ýîµ£?O?(ðDŽÉóBO½½=8Üä_pvGX& R"p-+%qî&&Ï’W7PÎ… ‡¢3€.Šr_Ùï(öEûIô¦E® ‚{&¤¼<ª^ËS?—Ç£ÍvÀh¹2dn¯«ŸªM€î% ]<Œ4Ær& O“HEñ -# ûxk™Uùùa#8Îò<ͳ8‹f8€Õ§¥N?š:£³;ćszJDú!?ÄÛ ª+ i·Þ1Lž•K\Ì"C ëÎJ<–wXˆ}ZÙ÷ö «Äí—`]&êlÁœ!o™)ç#@2±é+é„Ï\èØTt ÃŒg&ØHçäÚž¡×3ž`qk­ñ­øtªŠÖ öo©¦)Sñœj)òGZÚðUÖ¤k¬WéA…ªgoC–àŒ1’[ÈMñcwlê-Ýô`mž9ÆÏ~ög[Þ#s‚˜¤SuKF *Œ;=|döºüþú«©Æâp¤±e½m 7û®Ø¬däóízýÞ‘¥Î»VŸ;ñ@ΟŒó¨‹æa’2œ¹‚žèåndOôÏ0„@/^bè:XÃJ‰x›^)öºû (ˆÝ ²Ì5|Ž;͈‚ÈM©_…¾ŠÂi‹†Œkðá5Ž÷ÂFûsò„`Å,ò¼PÉ&ßÚˆËâlcÂ&ñÈd:8æ EL$²—¨Bä@, WF 2ilƒí3–î’³Ò?Á7úë×÷뛷﮿[>SÒø•Õ%’„™ïFy‰J,Iòáïÿ@’(‰ÏQY-²ÇWUÞO|èð뇷ïY¦ÙÌTzÈz‹y—Ã~Ge@»³è䋜ÏŠŸªp,Z{2%<³”ÔF°Pú‰•žÑØ| ÉÝà³´s¢vs,lÁ¹N¿¡()H½Z À©$j»3`_Ô¦¬A)pºVO®…ý`RxÆXÅ «*y Ò³ 7µ~¬ew°pêÆQ ³©NªÀ¸³àÂY_Ñ™|znÓÅѼé&Såg–ER»–Þ,LÝ´Û²Ã$M+„¤íÄ_BÛÝæÐ'=€ìNˆÚÞÚ½ý¦¯"Ù¤~;u6hžF8èéÖJ’‘´·}ùçÊÇ Ïé91µUÕ—:öºìcé¸dX-Ú·HÞq†æCQÛ$›ú½húŒ…fÄ€\6­kP÷¤p^‹©Åh™lª¶t|6šRŸ´‘L4Ô²à yøœUt”€è6ÅÑ‚;_D½¡C‚P··õʆÚ´@ýº½µ@®µ°…µƒþ¬îfÓ“>lM{/-¥ÚðèSáUÙ\ñ¼(ÀS½æcWñ2Ë[\¯Zá3`Ž Pu:™Bt#¾/îÌUÿJ¦.tIñ©¼W3e­ÿ‚l?Ár›IH2ŸícDý*Í´P”ºZ4dö8€/Heq|Ox0j˜YÏÉãG®çÅyæ+yüØÙˆËâÌ~Â&ñÈd:8¿ EL$²—¨Ƨ1³P\5jíÏHcllŸ±t—dûí0j¬œ3Ù~âüy˜ÃžŒL¶ÿ'gV:qà+?“Ô'!>’–a–ž'þà †À[¼¨¢÷„ÔÏ EáöÊ –Sÿ0t=ª¿%3‚è•ܼw½^¿ý°\ãs„Œ(êP;/>=Hé½g°$†Ë(W§@ˆ+2SB–ŽÔ½ØI@µ GFð{ÑV¯¦ïñÖsÀëoXBoŸðÍxrwOì=º±ÖwëZŠòAA¨»@"5ð“Ž$‰0ÜÊbÂo§xê÷"¢ê,!Ôc" ˜ $Aü÷ÖZ®õ%ï­w¾øÏ¬þ‚n\P endstream endobj 781 0 obj [ 780 0 R ] endobj 778 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 781 0 R /Contents 782 0 R >> endobj 783 0 obj 4015 endobj 518 0 obj << /Type /Action /S /GoTo /D [784 0 R /XYZ 72.0 176.264 null] >> endobj 785 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 661.5 266.96 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 656 0 R /H /I >> endobj 787 0 obj << /Type /Action /S /GoTo /D [581 0 R /XYZ 72.0 237.087 null] >> endobj 788 0 obj << /Type /Annot /Subtype /Link /Rect [ 370.77 178.364 460.77 186.224 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 787 0 R /H /I >> endobj 789 0 obj << /Length 790 0 R /Filter /FlateDecode >> stream xœÍkoÜ6ò»ÈãlF¤Þ=EšlZ÷œ¦µ·9ôê"wµ¶­´^iíøßßמq¿ôÎIàŠóäp8C)·GŒxðçDüŠSNVÛ£[5ÆH̉©¡0",¦‘—-QH&¤; ˜¢@_ŽªÙˆÜUGùþè÷?`Òšx4$÷GÞ€9²¹8ú„‡õ£$MS¥+§,I„ŸF¬¶äåé–“7µœ­µŒ¼ÿ¹ö®F>ãÿyäúè»åÑË·!aYnl0îÓ8?GQ@êóTüp²Ü’ߟ]ܖ˺.ŸÿA–?-–Ê4¤ÁÃáoLeu„×}âD—·£ð/ >ŽÁå!Ø •jAÕoñ@ƒ¡tþžtˆbå÷—Gzêï>½±#4é,@˜:¾ïÕßì²Á* ÙÓÆxƒXZgmFžÃ3g«¼,jÐemÀ¼Ê®ÊÜ íMÑd]àÙÉí¡n팼Ye»¢º>6#šÖ ‡ÆN]ÕÛmV­-CtîË·i_}‡4ŠXšÀ¢ô ¹¼ü|« vóÔŸ$4bA‡/«àC¦c¾çy¤»¡Ûi|ŸMSÁEÕ´yf©7Ð ÜâûXûeZ¥$ž&ük~ ¼ˆÆ@œÄq:æ—I–LÚX¼(ª• ™×4ÃhãÜë±)šIñbOü$C2'öŸŽv ÷‚]޹±.T‚~j¨&ÝÆ"Fã8ð<>¦ÀlL³8!Õ’qñ¾ DšRîùiÄá˜3AÍá<›&Õ’.ñ¢*Ú"³„å4¾ü¼«÷m3¢~±•O¨!ª«MY¬Zp¼º/ÚTÕ‰ŸCŒÃ³ÄG­Ú!’è³*ÛæÇ F´)ʼQðºÖSëVCy¾V`«Ÿb:ãÚTgš‹•¸ªËöÒÌó²Øm¾×: µ]Š6»Ò´7Ù>[Át…š}æÈ®5󬄙UÖw9ø$z>1Û+öÕþ²:ݬ†TJ@—¬óOC^æÛ¼js‡&s&dlW'«¬q4Áü‡ð›¡V_R騻Ë÷°•;zV—ü$ÊÝŽŸÞè%;¹Èw°`Ôɇ¬<ääÓ=Ä=v,å4ˆ€[³!g2˜Ðtzv“CäÃbg»]Yäͱ”+– Bqßæ¦>”k²Î7b¯ååÙ‹S¥½ÉZM:ŒŠ8¡))~¡”Sáô€•A†Ïʦ¶˜XÞB†žÀøÕȾ¸+²Ò¬‹Í&ßç*äpì*oïóÜa1]0F£ „ƒ”ÇCçëžÎ:ÖUëÇ(@N`]‚8UdZ‘ö¡¦LÒpN ¹\+6~¨Ž;•À<¥m—¯ŠÍÃ#Lñ£”iœB· 5z;ïãòÕù÷‹åÇ·§g‹éÃ< gØ".õzSDÜ@Ðf‡²%"‹ MšÃfS|&÷EY’«œ<™>ÈÈõ¢;MýtÈ›®š»éÓ4ŠfHŸ]—A>š–ÏE-ÃÔžÊ_ÏÈç ú4é“áfePˆBá8Q“^•÷ÙC#Q.g÷·¤Þ±+¾%p^•Tá82»ËŠRõ*“Šù˜7I½»¹¡ZÛúÑ^Åü”& ”Ž~œ¨#$oEÆmÈûM ûu 9Ÿƒ<+RÓ¯š&,#(­#‘òü؉»×ïÏ>¾Yœ¾ë'H–Œ€"ÜSªgïÕNJ©{#jŽáQÂ}]MÿÊp©­_QK &φƠxšIp:ŠüDä7H+!5´ðx¶œŸ!|bd«ôö=›Ù‡Ú:–v——ítàñ©ÕäRÖlõ¡[\hkºtÊç±8®eÞ\>7ÙÞ>ÜÖØkƺ¿Ä³I¢B A`å°á•ØRµµ±SÃH=QŽï´ˆêk%ŒÁ»mÓ Y‘ÝO¦)ãlÄàFÓŽ}¨¿ÞÂz«Ë ¸‘†€éÜa¼B]”‘v3¤XœÝ¡•XÄ6dj¤¢äœ…¢ºá¼·w/~>;].ç#òDj÷†\{OB¸êÄ{ÒÙ±rÜ)åv=jµM(-Hº2c¢Z¢Ña!H…€;7r]9뚨ÅÓÈ„‹„Q N† ‹8åA… rn œÞ’¢]  ÇN#¨!´Ftž­n "–Ú Eåh¸…ºØ•ö©¸:2F5¸Í‚Å,(Á™,AlzÐÞú鈭3Iªùiº'F²Ê_ÐøÐ8ŒÀßi4ä6›Ÿ¡´z˜ hat¯rßï²0 P$>™ðT¢“ N&¶á.Ó$‰õûÓ¯ggÏ?\¾ÿ×â§1Áµà˜b0PʯZ‹×Uù`u»ˆ¨‡Í¢›}½µT{KÄÝÚ È°Ó,Äþ·ÂT.GÄJj ãp$u´hv²çGì*_e° ÇÌŽ’žÙÕ¡,…hhžEÀg•ó¬)¤ÕˆÊ4‚àºÆ\ŠæFZ„£ÊtDªº:é²ÞHo \C4XLY‚ˆ°Dn2D¿³ ¨ úØ Ìä§Ä뙩)ïèoÆl§†¸V1}‡!à|»k †«bg¢™î3ƒªu¦fà]VYFÛ'Ía'JÕ1‹ ÍîZ${äU&kZ±ËÄ[+¹€O[‹Þ€âê†[â[’ú*¸séCÒÔâ§•…U¿†ˆªT”Q$o²U‡fZ„›fdE[˜ì{ÁÐäcÕöùÀ"o-ò#TþΣèk¶ßíë]¾oìÈÓ™þ—A·‡)i¨Bs[¶sô|ñîý‡ÅÇÅ»Ÿ—¿}üðêüb:u§süžZ•ÚÚÂó7ÒƒÒ(`#ì6YÙÌÔUþ,±oo ÐÏÓ½©X'ö¨ô;ÖzcÔBr”öˆ‚±âADoA…š}¦ð²øäLž9!ú|Qg¦q4f†,ècšm‘2ÈŽ3Ó,@QÉ7#éï'Ô*¨+1ÄD¦Û ¼Ÿ¹eŽÉÉô\ËC“y™- ÖžCÌ&/Ä¥ÃÔ-â_$ÃeRDŸÕe&¢X¨",*ÕŽ*8e~ÐÏèÚü“(í„¢VE5€µ3Â*–Ôs劸ª§Ñµ¢«-¼‚bºužÙ<‰ø%,«óXç'¥ÉOˆëü4fxØOü ^IÈ*Ý×c18üëmnñCU嫼i²ýƒK‚í"bº›H•n-Å ˆîóR]d#ŽE/ÂN i4Ñk¤ådëbp•,ÌúYéºFc™>ASňܗRŒ™"ÁL»ÉîŠzùœª‘™·° MÄ%*yz ÅcSšͲQZ¨{fÖ©4vSß+Hoa&OÓ1OÅýœÇÐë^‹­”ŠädëJÄñ„FxŸïöy£ß_à˜Ü"úñõ¡Ìö¿=ä2|SͳF/eµ§Þq]>?6¤‘JöûXÄ pØ™”ôsœ)H^v*ß©B_{:oX¬–·uöaVµS­„…œGEërÄ=‚ØÌ)$4 M¼pÄyŠ@û’g'|l<‘OS–z^ä12âEÑÝugªþÒ×ÍùçB:SoÚb»Í×âíeù0òb βԃ&Ô·²/^ö¿üú~¹x3¦Á`þâã:ýشՈȶÚ`j¹²ã²/\ô°“w_ˆˆkàcƒÙo —) Aõ±"О6yW‹ÆjXWmVTn8”9ž³[¼èØíÞéø¸)K©-Ø{ƒ*k""ÞÓ6Óïè©™‰RF±2DÑÁ‚ŽÅ¢ϱp¬È­ŠøêF©+sÝ˜ã‚¨Ç $Q¯Î½âoÁCŽ·?C.Cù,j9ÝsÂ*» â*.rø dZû°þ$Ó’Æ xe‰ÜX;sëOÇ®Ñø “žîBÍ­ˆz‘å¤j“¾LBã'+cŒíËx– ÁÝ^´M^nÄ0¼cðHòI J Hçï\ž/~\¼^ ÞŸ/Ç|1 S×°,Ñ…êc/…Ög¹ƒí2<ª¾]B$sà–ïÎT—ކgæŠ×Ç•B¯Ü©×y•Ë—ðÎXÑ‘*¯ mÖ™XáѬñ=”ƒûõX©¤~ÏCº…OÄ[Õ¼ZÕù®kmUÞU˜xG-zê|å%”«$œ]9ß.àS0â€qŠÄD.ªƒ£’þfK"¶nWúŠ#fÄÌÐ {f¢Kˆ¼x ÍÊ R8`c@õ™ š_Sÿ&ÓÂxw†ð]‘ß;,qsØn±WDÂÇVÐ%”†ò}§XÍ®Ìòµ|'¤´©Ö/õ-S8u³²ÌŽ<ÎÓP›ý'd_ùHøí*ßÔ{ñZzU¬Å1w“ËK9ØâÆü"öuY^e«O2uT`’¸ª»€ «áv ¡Qó¢0SçZµÉÄç2âûû†8Ÿ¬ˆô$¿<©Ÿ*¨}á÷5lS¬ùõ•/ÎZâZL|Qœ¤ˆî|ÂÓdfòª¹;A=isÛoAEåõ%9£w?Á£ÈbXÇ.]L¹¡óa™:6s@3ê± qsï½Ã(¢¬=/N˜*Ø>ã’1ÊJ.­±jêÿ¡_°7«}±kÍ—ÃMÆbñAoó0€#ûë#Š/ûRHÐ3öôIL|˜C(‘ÍÑ-L'ˆI'm¡öM»C¥r•¤ËØ|kLCðCÄúŸa0¡†ôÿ ×s£ ¦i ~åJŸÁÀ_PH°ä#bxOê$ÕwÆ·¤ï´¡CÄ× .§/:¨¯ ´1Ÿc§$éGS"RÔ‰‰Ž½—/ú{fAŒ{‰Ÿ&¯¾µ /ÈW§ë¯{;Qœäœp±øË=ÂÙ×>û:HÿCU“ÝAöøjÈ=ò"œÞÃ9,¢4H£Ðjðïu2ÒŠ¤L^¸ø z[™E<ÖÁYR¤G:Ârs¼cÎtëÿâåÈ4?ì¹jdä]G½ ÝoHÈ7ä˜tþãÄÚrû¸ endstream endobj 786 0 obj [ 785 0 R 788 0 R ] endobj 784 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 786 0 R /Contents 789 0 R >> endobj 790 0 obj 3713 endobj 792 0 obj << /URI (../apidocs/org/hsqldb/cmdline/SqlFile.html) /S /URI >> endobj 793 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 709.5 286.46 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 792 0 R /H /I >> endobj 795 0 obj << /URI (http://hsqldb.org/doc/2.0/apidocs/org/hsqldb/jcmdline/SqlFile.html) /S /URI >> endobj 796 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 687.5 350.09 696.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 795 0 R /H /I >> endobj 797 0 obj << /Length 798 0 R /Filter /FlateDecode >> stream xœÍSKSÂ0¾çWìQnÒ¤iRŽŽâc¸0tÆrÀ‚€¶”3ŽÿÞ$ ÒR;ã íc²Ùýòí3% €™÷Ê.*ææ¤ôºy•Œ P1 9ø–2 lˆâEá´]m–ðDÖ„ÁO h %|Ö"¯hFdhœËE¤ã8ö±r ´¶.FFHs 9‡›Â¡Ñ["öçÑ×#ÿ1Xë„о„€AòzH£R¦ÌZiÐ(xlIã‹ûÏÍ|; ¿Êæ0X­ßw—HÉmâ³tnޏùºajdÈš–Ú }ëZó‡(*Ñ —&kÊ|oýj QºZUkgm> endobj 798 0 obj 395 endobj 239 0 obj << /Type /Action /S /GoTo /D [799 0 R /XYZ 72.0 720.0 null] >> endobj 242 0 obj << /Type /Action /S /GoTo /D [799 0 R /XYZ 72.0 467.642 null] >> endobj 245 0 obj << /Type /Action /S /GoTo /D [799 0 R /XYZ 72.0 353.734 null] >> endobj 248 0 obj << /Type /Action /S /GoTo /D [799 0 R /XYZ 72.0 159.518 null] >> endobj 800 0 obj << /Type /Action /S /GoTo /D [791 0 R /XYZ 72.0 720.0 null] >> endobj 801 0 obj << /Type /Annot /Subtype /Link /Rect [ 263.586 403.834 305.586 411.694 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 800 0 R /H /I >> endobj 803 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.901 367.834 461.77 375.694 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 724 0 R /H /I >> endobj 804 0 obj << /Type /Annot /Subtype /Link /Rect [ 291.68 265.326 441.96 274.326 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 336 0 R /H /I >> endobj 805 0 obj << /Type /Annot /Subtype /Link /Rect [ 486.643 173.018 539.998 182.018 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 336 0 R /H /I >> endobj 806 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 161.018 168.39 170.018 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 336 0 R /H /I >> endobj 807 0 obj << /Type /Annot /Subtype /Link /Rect [ 103.426 85.51 147.642 94.51 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 371 0 R /H /I >> endobj 808 0 obj << /Length 809 0 R /Filter /FlateDecode >> stream xœÍÙrÜ6ò]_7I[Š÷á}’'±+q6Ò$©”ǵÅá`4LxŒxHÖ~ý6Ð $gÆÊKvåCèÆÑF£/ðñÌa6üYˆ_QⲬ<{$œÃ"—y!¡‚9‘Ú1+q³B 5ÅjzK£رßΪ3›}wöé3 Ú0Û Øó™=[—¹?ûˆ¡å…q’$Ä«k9q,HxV¬d×ïK—}SËÑŠ{±ý?çÞäÈsÜÿŽlöpv»<»þ6`ŽÍ–[­ŽëYQrCŸÅ–ç&âÇeË’}º¸,–u]\~fËgï–´5œ'”Ç…¿‘%5hÔøö¸ÇЮ¯±ðÏ·<ÄÆr؃è*è@é·èPÍ@ -eLž”ÔßIüøID%pV<:‚ØþX«þf™ÍŽQжq=ÛIB‡5´39ñhg0%°¼$±mÛ‰p[?÷uÇ[–Vv¿O3Þâ6…tˆÆf¾mÙ±'ÔÔ#ÕÌ«‡‚³K¶ˆCàüB¬4›º_|ñˆDô˜Æ˜PÕº†§7Vh÷<ËÓ¢xѨµÑ¦‹aiÌr—”ÊôO“0 7úk“•¼êú¼ËŸ T·K+sxk0ÛîxAwÒPàN$T¤ÕCŸ>ðöJLõBËa¼jû9CÐé4¤†pË+£·«Íy\›´K×iËM:yeÀ$yHòԳ鋎7BúŸtš´X‘—y•vc¾Í97†oëÆØA]ò]ýŒÒºþ6œkVèOäÆÛ,݃v©93môà¢úòŠúóÙLÊe»´I3ØXkÍN NÑõ¢$‰“çü@² +iÊýŠ©GòC€tóÊè6†ªE(õ‹ì›¼L›(yZƒIŠúKKÕF´QCÏ;^ŒéfV—%뜵m^å ÖFïê¢á}Þ a0‰'„µ×BCòZÒN|ËNòn§¡–—ù"« sî‚úûý¾n:(A/óEAGƒ¸ûŸ0ft ’%Üvuic¤9Ó0í™(¦k³«1ÖÞýäÍ7FçU›oŒ!õV·_ê¾™ Æ÷1–LÛ JšŽZÑÀAOi“§k4¤ªèÉhfÝwæ9Ö/Kn.¹mêÒ°3‡¯9† X2pyeO´ºŠjA˜s7+8¸lg Z!~Þ¥OcjO¼1—o`;s9ºîDŽ}Ë·}QñVvA }>´Î$× Ñ}O7ÄõÂý8•¨\Ïi‚Äð/`KP*Nõ`i ¶¹1Å)›BIôH­ ¸ˆÁ`gläÞ^Ùv.ÏùĶ Êgd³¢Ç]’áL¦†Ó‡ØÝ À†`a¾Ä?د7wo~|ÇÞ5½ŽœZâê8mÂ¥3¯ß(êÇiG'W8E;:ÉõjõåÄ–]û¤Ô®d u”´ë‚³ `²g‡I?ž¢œž}9wnŽHÜ®ŽK£îë+–oè"{n@ï™P6aII½†×¶ßq"w&‘ .–ɘR бáF‘•@ôìØ1õ®\óÍfÈ>°0áØNâZaB2èÐ5þ¥AºÅÀ0ÿ³¾CŸ·Í 02D–ÁYý\±éS ÷|ÃOH̓ð%HÀrÅ”g.Eîâ:V !,ßs™ó!ø¼3VbSæ+ÝS MŒþ°-˜ù¦ÎóÀù¸ãÁ¤·Žƒ] ¼9Û0?p-OÍ׳P~áJcЊ٬QRG'žwbÎ„Ò¡èÆƒ«z¨‰‡æãN³"mµó®åÅöÍL³Ê‚Ç–ã‚¢øÄâÿjê‡&ßåZæl4šâs.3 ÕÕSUŠ:ÓJvW›KÌB32žtž‘R½þƒgÝi^­.îe¦ðéóêrè.y·«7˜o‡&,ò2Š ¤ÍC/óc©ôk.R3Ô.‰ÐIÂEþ§fÜ ÊÇiTáñ^³%ìjoêê¼›‹Ã‹Çâ 2Ø'™E=Õ™ª( jŸÂIñŽ7&F\ö«¡´taz- ù‰Å{Fâ%sÒißÕVûXÕ&q?ŽO裩¦5K¼Ë, ¡X°MŠ…*O"ÕU×Ôz$"-¾ÝæYΫìe@­u³o1éEe~=»éßæ…ªí¹úö¸É.´ÄÒ¨åξM>q®oÙžpna<ç‚a­5™›)Â.[dcÉÉim“]×ÍÃõÎt³¾nÓr_ðkÚºÞX€­ðâD>ÇÄ@åë|P/ ­ÐKl; ¢Ã  h°J€íΔà÷à„pUó³ ÝñbàiÁP¬¥¾A´Z?åYÒ.\ìWF¨‹i'® ôðòW<³'ßO.yæuµ '/+WK`ø«Ï¶'1ºOªÏˆwEU Á¶¨ü°-¢“v€žw¹¬;Ѹ¡@Šð Ìê>Ыð/ÝB„.›µG ­-b2¡º¢Íšãáˆð †ÀBŒÁ*ï°¡ÙÁún<ŽÚéÂL]›Dñ[M4_ãö‡Ÿnz^0G'^½‚pŽ?ŒÅüd¾À‡›_oþýÓí‡wo—Çk9Nrb…×°à@tlCX/£ãÙ ÷Ë»_N‘“ òT¬ý/Ö&~›ñÜùr?-¿ww<rN͵4õߨ°úšÞèIuó±§Z+‚êe‚&ñ®oªÖÜ«1KÝj‘þ¯ˆŽl®Õ¾=ÞK‹n!ÒšÁæ! jÂmóŸÛTf*Ò~ ÖëB&¬¾ÒÂõ"â…Â$³î·[KLgùf‚èÅ m†‰P÷ݾ7F«j¼bëÌÉó±4ü;*`ƒæ2…ˆzl)„RHÁŠ­ÒQD ‡T¦;W,mÁ%ÏRPàx¤X&±<\È0ojàgdf£]0fÇGßwµ`e9掃âò àÙ.xZÒöBȲE©Èñï“÷ ›OŽn!B—8¯ú¢‚Dà܃± Œçil× £f€¤A¾@ÒHšÕÍÅo¸'A$Ì7çâöýÇ›»ß+°¶Ç'k®”GDèÃ7·o “ÙÁð4>¦W¸†¨¡;ÞöEwÏ;ëw˜¥¬.V—«K;UÍO"¨ÑÈ–¹ÒA–t³Ü‘]@—OaªCÝzÙnP可`°E½é³ ›àÒÛ5¤‚–Fünò†b$ o ÊÐ`ð±Zsô³ëk8["^Iû²Z¥[Ì¥—Äcé¥ÝB<ÑÁÅÎhC¸¶‚hJVfçÊPä‚_ÃL¨Yp3½)® 1 kƒÓW17•º ‹@îCD¢™zÿ ŒøLô†Lã/‰1¿^pVä”´J#Ùάz0“áä­y–$`3ë¼È»…Poéãy"ËÐõÐ5°a!ÕBÍã¹ÁˆÍà$ùä×+¯†²½ßÕ]¼ÔÙoòÚ˜)¾ˆ)Gèí»y“§Eþnàdk€°žÐZCªŒ©2½¾Ìo $¢3Ø*êtc²ô¢}•L4,ÊösúþD€r a “¡ˆÁO€°->{ 7]DŒÓˆZ·Á^;cͼav×ýÈññ¾Ô rãLŠ;ciP}†Dkí´h ~´?69ÂáDj¾xIõ=Û¼è€OÌ‹,°¶í;ÁÉyÊ}kÖÕû‡yr`âÇ ¼ÎÓ'Ff¾ÆÔÓC2í=öô¯Êgð>¶ç'‘çP>û¶.÷u·K=·‹šöЖ_±ÈWf"íR}Ý“(RßÁuõµ\8£á¹6Fü˜­p™ :ús lOÃÇòÝP> endobj 809 0 obj 3429 endobj 810 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 72.0 720.0 null] >> endobj 811 0 obj << /Type /Action /S /GoTo /D [200 0 R /XYZ 72.0 510.203 null] >> endobj 812 0 obj << /Type /Action /S /GoTo /D [194 0 R /XYZ 72.0 161.272 null] >> endobj 813 0 obj << /Type /Action /S /GoTo /D [568 0 R /XYZ 72.0 554.15 null] >> endobj 814 0 obj << /Type /Action /S /GoTo /D [412 0 R /XYZ 72.0 347.76 null] >> endobj 816 0 obj << /Title (HyperSQL Utilities Guide) /Parent 815 0 R /Next 818 0 R /A 810 0 R >> endobj 817 0 obj << /Type /Action /S /GoTo /D [212 0 R /XYZ 72.0 720.0 null] >> endobj 818 0 obj << /Title (Table of Contents) /Parent 815 0 R /Prev 816 0 R /Next 819 0 R /A 817 0 R >> endobj 819 0 obj << /Title (Preface) /Parent 815 0 R /Prev 818 0 R /Next 821 0 R /First 820 0 R /Last 820 0 R /Count -1 /A 213 0 R >> endobj 820 0 obj << /Title (Available formats for this document) /Parent 819 0 R /A 217 0 R >> endobj 821 0 obj << /Title /Parent 815 0 R /Prev 819 0 R /Next 888 0 R /First 822 0 R /Last 887 0 R /Count -66 /A 220 0 R >> endobj 822 0 obj << /Title (Try It) /Parent 821 0 R /Next 823 0 R /A 223 0 R >> endobj 823 0 obj << /Title (Purpose, Coverage, Changes in Behavior) /Parent 821 0 R /Prev 822 0 R /Next 827 0 R /First 824 0 R /Last 826 0 R /Count -3 /A 226 0 R >> endobj 824 0 obj << /Title (Platforms and SqlTool versions covered) /Parent 823 0 R /Next 825 0 R /A 229 0 R >> endobj 825 0 obj << /Title (Recent Functional Changes) /Parent 823 0 R /Prev 824 0 R /Next 826 0 R /A 55 0 R >> endobj 826 0 obj << /Title (New Features) /Parent 823 0 R /Prev 825 0 R /A 234 0 R >> endobj 827 0 obj << /Title (The Bare Minimum) /Parent 821 0 R /Prev 823 0 R /Next 828 0 R /A 68 0 R >> endobj 828 0 obj << /Title (Quotes and Spaces) /Parent 821 0 R /Prev 827 0 R /Next 829 0 R /A 239 0 R >> endobj 829 0 obj << /Title (Embedding) /Parent 821 0 R /Prev 828 0 R /Next 830 0 R /A 242 0 R >> endobj 830 0 obj << /Title (Non-displayable Types) /Parent 821 0 R /Prev 829 0 R /Next 831 0 R /A 245 0 R >> endobj 831 0 obj << /Title (Compound commands or commands with semi-colons) /Parent 821 0 R /Prev 830 0 R /Next 832 0 R /A 248 0 R >> endobj 832 0 obj << /Title (Desktop shortcuts) /Parent 821 0 R /Prev 831 0 R /Next 833 0 R /A 251 0 R >> endobj 833 0 obj << /Title (Loading sample data) /Parent 821 0 R /Prev 832 0 R /Next 834 0 R /A 254 0 R >> endobj 834 0 obj << /Title (Satisfying SqlTool's CLASSPATH Requirements) /Parent 821 0 R /Prev 833 0 R /Next 839 0 R /First 835 0 R /Last 838 0 R /Count -4 /A 257 0 R >> endobj 835 0 obj << /Title (Accessing older HSQLDB Databases with SqlTool) /Parent 834 0 R /Next 836 0 R /A 103 0 R >> endobj 836 0 obj << /Title (App-specific Classes, Embedding, and non-HyperSQL Databases) /Parent 834 0 R /Prev 835 0 R /Next 837 0 R /A 262 0 R >> endobj 837 0 obj << /Title (Distributing SqlTool with your Apps) /Parent 834 0 R /Prev 836 0 R /Next 838 0 R /A 265 0 R >> endobj 838 0 obj << /Title (SqlTool Client PCs) /Parent 834 0 R /Prev 837 0 R /A 268 0 R >> endobj 839 0 obj << /Title (RC File Authentication Setup) /Parent 821 0 R /Prev 834 0 R /Next 840 0 R /A 81 0 R >> endobj 840 0 obj << /Title (Switching Data Sources) /Parent 821 0 R /Prev 839 0 R /Next 841 0 R /A 101 0 R >> endobj 841 0 obj << /Title (Using Inline RC Authentication) /Parent 821 0 R /Prev 840 0 R /Next 842 0 R /A 275 0 R >> endobj 842 0 obj << /Title (Logging) /Parent 821 0 R /Prev 841 0 R /Next 843 0 R /A 278 0 R >> endobj 843 0 obj << /Title (Interactive Usage) /Parent 821 0 R /Prev 842 0 R /Next 847 0 R /First 844 0 R /Last 846 0 R /Count -3 /A 281 0 R >> endobj 844 0 obj << /Title (SqlTool Command-Line Editing) /Parent 843 0 R /Next 845 0 R /A 284 0 R >> endobj 845 0 obj << /Title (Command Types) /Parent 843 0 R /Prev 844 0 R /Next 846 0 R /A 287 0 R >> endobj 846 0 obj << /Title (Emulating Non-Interactive mode) /Parent 843 0 R /Prev 845 0 R /A 290 0 R >> endobj 847 0 obj << /Title (Command Types) /Parent 821 0 R /Prev 843 0 R /Next 848 0 R /A 293 0 R >> endobj 848 0 obj << /Title (Special Commands) /Parent 821 0 R /Prev 847 0 R /Next 849 0 R /A 296 0 R >> endobj 849 0 obj << /Title (Edit Buffer / History Commands) /Parent 821 0 R /Prev 848 0 R /Next 851 0 R /First 850 0 R /Last 850 0 R /Count -1 /A 299 0 R >> endobj 850 0 obj << /Title (Command History) /Parent 849 0 R /A 302 0 R >> endobj 851 0 obj << /Title (PL Commands) /Parent 821 0 R /Prev 849 0 R /Next 852 0 R /A 305 0 R >> endobj 852 0 obj << /Title (Non-Interactive) /Parent 821 0 R /Prev 851 0 R /Next 862 0 R /First 853 0 R /Last 861 0 R /Count -9 /A 161 0 R >> endobj 853 0 obj << /Title (Giving SQL on the Command Line) /Parent 852 0 R /Next 854 0 R /A 187 0 R >> endobj 854 0 obj << /Title (SQL Files) /Parent 852 0 R /Prev 853 0 R /Next 855 0 R /A 312 0 R >> endobj 855 0 obj << /Title (Piping and shell scripting) /Parent 852 0 R /Prev 854 0 R /Next 856 0 R /A 145 0 R >> endobj 856 0 obj << /Title (Automation) /Parent 852 0 R /Prev 855 0 R /Next 857 0 R /A 317 0 R >> endobj 857 0 obj << /Title (Optimally Compatible SQL Files) /Parent 852 0 R /Prev 856 0 R /Next 858 0 R /A 320 0 R >> endobj 858 0 obj << /Title (Comments) /Parent 852 0 R /Prev 857 0 R /Next 859 0 R /A 323 0 R >> endobj 859 0 obj << /Title (Special Commands and Edit Buffer Commands in SQL Files) /Parent 852 0 R /Prev 858 0 R /Next 860 0 R /A 326 0 R >> endobj 860 0 obj << /Title (Getting Interactive Functionality with SQL Files) /Parent 852 0 R /Prev 859 0 R /Next 861 0 R /A 329 0 R >> endobj 861 0 obj << /Title (Character Encoding) /Parent 852 0 R /Prev 860 0 R /A 157 0 R >> endobj 862 0 obj << /Title (Generating Text or HTML Reports) /Parent 821 0 R /Prev 852 0 R /Next 863 0 R /A 169 0 R >> endobj 863 0 obj << /Title (Storing and Retrieving Binary Files) /Parent 821 0 R /Prev 862 0 R /Next 864 0 R /A 336 0 R >> endobj 864 0 obj << /Title (SqlTool Procedural Language) /Parent 821 0 R /Prev 863 0 R /Next 878 0 R /First 865 0 R /Last 877 0 R /Count -13 /A 190 0 R >> endobj 865 0 obj << /Title (Nulls and Empty Strings) /Parent 864 0 R /Next 867 0 R /First 866 0 R /Last 866 0 R /Count -1 /A 341 0 R >> endobj 866 0 obj << /Title (Distinguishing Nulls from Empty Strings) /Parent 865 0 R /A 811 0 R >> endobj 867 0 obj << /Title (Variables) /Parent 864 0 R /Prev 865 0 R /Next 871 0 R /First 868 0 R /Last 870 0 R /Count -3 /A 344 0 R >> endobj 868 0 obj << /Title (System PL Variables) /Parent 867 0 R /Next 869 0 R /A 812 0 R >> endobj 869 0 obj << /Title (PL Variables) /Parent 867 0 R /Prev 868 0 R /Next 870 0 R /A 813 0 R >> endobj 870 0 obj << /Title (PL ? Variable) /Parent 867 0 R /Prev 869 0 R /A 814 0 R >> endobj 871 0 obj << /Title (Macros) /Parent 864 0 R /Prev 867 0 R /Next 872 0 R /A 347 0 R >> endobj 872 0 obj << /Title (SqlTool Functions) /Parent 864 0 R /Prev 871 0 R /Next 873 0 R /A 350 0 R >> endobj 873 0 obj << /Title (PL Sample) /Parent 864 0 R /Prev 872 0 R /Next 874 0 R /A 353 0 R >> endobj 874 0 obj << /Title (Logical Expressions) /Parent 864 0 R /Prev 873 0 R /Next 875 0 R /A 630 0 R >> endobj 875 0 obj << /Title (Mathematical Assignments) /Parent 864 0 R /Prev 874 0 R /Next 876 0 R /A 634 0 R >> endobj 876 0 obj << /Title (Flow Control) /Parent 864 0 R /Prev 875 0 R /Next 877 0 R /A 637 0 R >> endobj 877 0 obj << /Title (PL Example) /Parent 864 0 R /Prev 876 0 R /A 640 0 R >> endobj 878 0 obj << /Title (Chunking) /Parent 821 0 R /Prev 864 0 R /Next 881 0 R /First 879 0 R /Last 880 0 R /Count -2 /A 371 0 R >> endobj 879 0 obj << /Title (Why?) /Parent 878 0 R /Next 880 0 R /A 645 0 R >> endobj 880 0 obj << /Title (How?) /Parent 878 0 R /Prev 879 0 R /A 648 0 R >> endobj 881 0 obj << /Title (Raw Mode) /Parent 821 0 R /Prev 878 0 R /Next 882 0 R /A 377 0 R >> endobj 882 0 obj << /Title (SQL/PSM, SQL/JRT, and PL/SQL) /Parent 821 0 R /Prev 881 0 R /Next 883 0 R /A 653 0 R >> endobj 883 0 obj << /Title (Delimiter-Separated-Value Imports and Exports) /Parent 821 0 R /Prev 882 0 R /Next 886 0 R /First 884 0 R /Last 885 0 R /Count -2 /A 656 0 R >> endobj 884 0 obj << /Title (Simple DSV exports and imports using default settings) /Parent 883 0 R /Next 885 0 R /A 659 0 R >> endobj 885 0 obj << /Title (Specifying queries and options) /Parent 883 0 R /Prev 884 0 R /A 662 0 R >> endobj 886 0 obj << /Title (CSV Imports and Exports) /Parent 821 0 R /Prev 883 0 R /Next 887 0 R /A 665 0 R >> endobj 887 0 obj << /Title (Unit Testing SqlTool) /Parent 821 0 R /Prev 886 0 R /A 668 0 R >> endobj 888 0 obj << /Title /Parent 815 0 R /Prev 821 0 R /Next 889 0 R /A 671 0 R >> endobj 889 0 obj << /Title /Parent 815 0 R /Prev 888 0 R /Next 896 0 R /First 890 0 R /Last 895 0 R /Count -6 /A 674 0 R >> endobj 890 0 obj << /Title (Brief Introduction) /Parent 889 0 R /Next 891 0 R /A 677 0 R >> endobj 891 0 obj << /Title (Auto tree-update) /Parent 889 0 R /Prev 890 0 R /Next 892 0 R /A 680 0 R >> endobj 892 0 obj << /Title (Automatic Connection) /Parent 889 0 R /Prev 891 0 R /Next 893 0 R /A 683 0 R >> endobj 893 0 obj << /Title (RC File) /Parent 889 0 R /Prev 892 0 R /Next 894 0 R /A 686 0 R >> endobj 894 0 obj << /Title (Using the current DatabaseManagers with an older HSQLDB distribution.) /Parent 889 0 R /Prev 893 0 R /Next 895 0 R /A 689 0 R >> endobj 895 0 obj << /Title (DatabaseManagerSwing as an Applet) /Parent 889 0 R /Prev 894 0 R /A 692 0 R >> endobj 896 0 obj << /Title /Parent 815 0 R /Prev 889 0 R /Next 898 0 R /First 897 0 R /Last 897 0 R /Count -1 /A 695 0 R >> endobj 897 0 obj << /Title (Brief Introduction) /Parent 896 0 R /A 698 0 R >> endobj 898 0 obj << /Title /Parent 815 0 R /Prev 896 0 R /Next 899 0 R /A 569 0 R >> endobj 899 0 obj << /Title /Parent 815 0 R /Prev 898 0 R /A 703 0 R >> endobj 900 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding >> endobj 901 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 902 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Courier-Oblique /Encoding /WinAnsiEncoding >> endobj 903 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Roman /Encoding /WinAnsiEncoding >> endobj 904 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding >> endobj 905 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj 906 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Courier /Encoding /WinAnsiEncoding >> endobj 907 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Italic /Encoding /WinAnsiEncoding >> endobj 908 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Bold /Encoding /WinAnsiEncoding >> endobj 909 0 obj << /Limits [(N10002) (N10002)] /Names [(N10002) 810 0 R] >> endobj 910 0 obj << /Limits [(N10128) (N10128)] /Names [(N10128) 229 0 R] >> endobj 911 0 obj << /Limits [(N1021A) (N1021A)] /Names [(N1021A) 234 0 R] >> endobj 912 0 obj << /Limits [(N10387) (N10387)] /Names [(N10387) 239 0 R] >> endobj 913 0 obj << /Limits [(N103A7) (N103A7)] /Names [(N103A7) 242 0 R] >> endobj 914 0 obj << /Limits [(N103BC) (N103BC)] /Names [(N103BC) 245 0 R] >> endobj 915 0 obj << /Limits [(N103DC) (N103DC)] /Names [(N103DC) 248 0 R] >> endobj 916 0 obj << /Limits [(N103E5) (N103E5)] /Names [(N103E5) 251 0 R] >> endobj 917 0 obj << /Limits [(N10446) (N10446)] /Names [(N10446) 254 0 R] >> endobj 918 0 obj << /Limits [(N10462) (N10462)] /Names [(N10462) 257 0 R] >> endobj 919 0 obj << /Limits [(N104BE) (N104BE)] /Names [(N104BE) 262 0 R] >> endobj 920 0 obj << /Limits [(N10505) (N10505)] /Names [(N10505) 265 0 R] >> endobj 921 0 obj << /Limits [(N1052B) (N1052B)] /Names [(N1052B) 268 0 R] >> endobj 922 0 obj << /Limits [(N10688) (N10688)] /Names [(N10688) 284 0 R] >> endobj 923 0 obj << /Limits [(N106AC) (N106AC)] /Names [(N106AC) 287 0 R] >> endobj 924 0 obj << /Limits [(N106C5) (N106C5)] /Names [(N106C5) 290 0 R] >> endobj 925 0 obj << /Limits [(N106D1) (N106D1)] /Names [(N106D1) 293 0 R] >> endobj 926 0 obj << /Limits [(N1071A) (N1071A)] /Names [(N1071A) 296 0 R] >> endobj 927 0 obj << /Limits [(N1081C) (N1081C)] /Names [(N1081C) 299 0 R] >> endobj 928 0 obj << /Limits [(N108CD) (N108CD)] /Names [(N108CD) 302 0 R] >> endobj 929 0 obj << /Limits [(N10A09) (N10A09)] /Names [(N10A09) 312 0 R] >> endobj 930 0 obj << /Limits [(N10ABD) (N10ABD)] /Names [(N10ABD) 317 0 R] >> endobj 931 0 obj << /Limits [(N10AD0) (N10AD0)] /Names [(N10AD0) 320 0 R] >> endobj 932 0 obj << /Limits [(N10AE3) (N10AE3)] /Names [(N10AE3) 323 0 R] >> endobj 933 0 obj << /Limits [(N10AF0) (N10AF0)] /Names [(N10AF0) 326 0 R] >> endobj 934 0 obj << /Limits [(N10B6B) (N10B6B)] /Names [(N10B6B) 329 0 R] >> endobj 935 0 obj << /Limits [(N10CAF) (N10CAF)] /Names [(N10CAF) 811 0 R] >> endobj 936 0 obj << /Limits [(N10E7C) (N10E7C)] /Names [(N10E7C) 814 0 R] >> endobj 937 0 obj << /Limits [(N10EF8) (N10EF8)] /Names [(N10EF8) 350 0 R] >> endobj 938 0 obj << /Limits [(N10F25) (N10F25)] /Names [(N10F25) 353 0 R] >> endobj 939 0 obj << /Limits [(N11013) (N11013)] /Names [(N11013) 634 0 R] >> endobj 940 0 obj << /Limits [(N11076) (N11076)] /Names [(N11076) 637 0 R] >> endobj 941 0 obj << /Limits [(N110B6) (N110B6)] /Names [(N110B6) 640 0 R] >> endobj 942 0 obj << /Limits [(N110DA) (N110DA)] /Names [(N110DA) 645 0 R] >> endobj 943 0 obj << /Limits [(N110EB) (N110EB)] /Names [(N110EB) 648 0 R] >> endobj 944 0 obj << /Limits [(N111A9) (N111A9)] /Names [(N111A9) 659 0 R] >> endobj 945 0 obj << /Limits [(N111E4) (N111E4)] /Names [(N111E4) 662 0 R] >> endobj 946 0 obj << /Limits [(altformats-sect) (altformats-sect)] /Names [(altformats-sect) 217 0 R] >> endobj 947 0 obj << /Limits [(book-pref) (book-pref)] /Names [(book-pref) 213 0 R] >> endobj 948 0 obj << /Limits [(dbm-autoconn-sect) (dbm-autoconn-sect)] /Names [(dbm-autoconn-sect) 683 0 R] >> endobj 949 0 obj << /Limits [(dbm-chapt) (dbm-chapt)] /Names [(dbm-chapt) 674 0 R] >> endobj 950 0 obj << /Limits [(dbm_applet-sect) (dbm_applet-sect)] /Names [(dbm_applet-sect) 692 0 R] >> endobj 951 0 obj << /Limits [(dbm_intro-sect) (dbm_intro-sect)] /Names [(dbm_intro-sect) 677 0 R] >> endobj 952 0 obj << /Limits [(dbm_rcfile-sect) (dbm_rcfile-sect)] /Names [(dbm_rcfile-sect) 686 0 R] >> endobj 953 0 obj << /Limits [(dbm_tree-sect) (dbm_tree-sect)] /Names [(dbm_tree-sect) 680 0 R] >> endobj 954 0 obj << /Limits [(dbm_wold-sect) (dbm_wold-sect)] /Names [(dbm_wold-sect) 689 0 R] >> endobj 955 0 obj << /Limits [(filelinks-app) (filelinks-app)] /Names [(filelinks-app) 703 0 R] >> endobj 956 0 obj << /Limits [(sqltool-chapt) (sqltool-chapt)] /Names [(sqltool-chapt) 220 0 R] >> endobj 957 0 obj << /Limits [(sqltool_auth-sect) (sqltool_auth-sect)] /Names [(sqltool_auth-sect) 81 0 R] >> endobj 958 0 obj << /Limits [(sqltool_baremin-sect) (sqltool_baremin-sect)] /Names [(sqltool_baremin-sect) 68 0 R] >> endobj 959 0 obj << /Limits [(sqltool_binary_files-sect) (sqltool_binary_files-sect)] /Names [(sqltool_binary_files-sect) 336 0 R] >> endobj 960 0 obj << /Limits [(sqltool_book_purpose-sect) (sqltool_book_purpose-sect)] /Names [(sqltool_book_purpose-sect) 226 0 R] >> endobj 961 0 obj << /Limits [(sqltool_charencoding-sect) (sqltool_charencoding-sect)] /Names [(sqltool_charencoding-sect) 157 0 R] >> endobj 962 0 obj << /Limits [(sqltool_chunk-sect) (sqltool_chunk-sect)] /Names [(sqltool_chunk-sect) 371 0 R] >> endobj 963 0 obj << /Limits [(sqltool_csv-sect) (sqltool_csv-sect)] /Names [(sqltool_csv-sect) 665 0 R] >> endobj 964 0 obj << /Limits [(sqltool_dsswitch-sect) (sqltool_dsswitch-sect)] /Names [(sqltool_dsswitch-sect) 101 0 R] >> endobj 965 0 obj << /Limits [(sqltool_dsv-sect) (sqltool_dsv-sect)] /Names [(sqltool_dsv-sect) 656 0 R] >> endobj 966 0 obj << /Limits [(sqltool_embedded-langs-sect) (sqltool_embedded-langs-sect)] /Names [(sqltool_embedded-langs-sect) 653 0 R] >> endobj 967 0 obj << /Limits [(sqltool_functional_changes-sect) (sqltool_functional_changes-sect)] /Names [(sqltool_functional_changes-sect) 55 0 R] >> endobj 968 0 obj << /Limits [(sqltool_ilauth-sect) (sqltool_ilauth-sect)] /Names [(sqltool_ilauth-sect) 275 0 R] >> endobj 969 0 obj << /Limits [(sqltool_int-sect) (sqltool_int-sect)] /Names [(sqltool_int-sect) 281 0 R] >> endobj 970 0 obj << /Limits [(sqltool_interactive_pl_commands-sect) (sqltool_interactive_pl_commands-sect)] /Names [(sqltool_interactive_pl_commands-sect) 305 0 R] >> endobj 971 0 obj << /Limits [(sqltool_logging-sect) (sqltool_logging-sect)] /Names [(sqltool_logging-sect) 278 0 R] >> endobj 972 0 obj << /Limits [(sqltool_logical-sect) (sqltool_logical-sect)] /Names [(sqltool_logical-sect) 630 0 R] >> endobj 973 0 obj << /Limits [(sqltool_macro-sect) (sqltool_macro-sect)] /Names [(sqltool_macro-sect) 347 0 R] >> endobj 974 0 obj << /Limits [(sqltool_nonint-sect) (sqltool_nonint-sect)] /Names [(sqltool_nonint-sect) 161 0 R] >> endobj 975 0 obj << /Limits [(sqltool_nullempty-sect) (sqltool_nullempty-sect)] /Names [(sqltool_nullempty-sect) 341 0 R] >> endobj 976 0 obj << /Limits [(sqltool_olderaccess-sect) (sqltool_olderaccess-sect)] /Names [(sqltool_olderaccess-sect) 103 0 R] >> endobj 977 0 obj << /Limits [(sqltool_pl-sect) (sqltool_pl-sect)] /Names [(sqltool_pl-sect) 190 0 R] >> endobj 978 0 obj << /Limits [(sqltool_pl_variables-sect) (sqltool_pl_variables-sect)] /Names [(sqltool_pl_variables-sect) 813 0 R] >> endobj 979 0 obj << /Limits [(sqltool_plsys_variables-sect) (sqltool_plsys_variables-sect)] /Names [(sqltool_plsys_variables-sect) 812 0 R] >> endobj 980 0 obj << /Limits [(sqltool_raw-sect) (sqltool_raw-sect)] /Names [(sqltool_raw-sect) 377 0 R] >> endobj 981 0 obj << /Limits [(sqltool_report-sect) (sqltool_report-sect)] /Names [(sqltool_report-sect) 169 0 R] >> endobj 982 0 obj << /Limits [(sqltool_scripting-sect) (sqltool_scripting-sect)] /Names [(sqltool_scripting-sect) 145 0 R] >> endobj 983 0 obj << /Limits [(sqltool_sqlswitch-sect) (sqltool_sqlswitch-sect)] /Names [(sqltool_sqlswitch-sect) 187 0 R] >> endobj 984 0 obj << /Limits [(sqltool_tryit-sect) (sqltool_tryit-sect)] /Names [(sqltool_tryit-sect) 223 0 R] >> endobj 985 0 obj << /Limits [(sqltool_unittest-sect) (sqltool_unittest-sect)] /Names [(sqltool_unittest-sect) 668 0 R] >> endobj 986 0 obj << /Limits [(sqltool_variables-sect) (sqltool_variables-sect)] /Names [(sqltool_variables-sect) 344 0 R] >> endobj 987 0 obj << /Limits [(systempls-app) (systempls-app)] /Names [(systempls-app) 569 0 R] >> endobj 988 0 obj << /Limits [(test-utility-chapt) (test-utility-chapt)] /Names [(test-utility-chapt) 671 0 R] >> endobj 989 0 obj << /Limits [(transfer-tool-chapt) (transfer-tool-chapt)] /Names [(transfer-tool-chapt) 695 0 R] >> endobj 990 0 obj << /Limits [(trantool_intro-sect) (trantool_intro-sect)] /Names [(trantool_intro-sect) 698 0 R] >> endobj 991 0 obj << /Limits [(N10002) (trantool_intro-sect)] /Kids [909 0 R 910 0 R 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R 922 0 R 923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R 935 0 R 936 0 R 937 0 R 938 0 R 939 0 R 940 0 R 941 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 950 0 R 951 0 R 952 0 R 953 0 R 954 0 R 955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R 979 0 R 980 0 R 981 0 R 982 0 R 983 0 R 984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R] >> endobj 992 0 obj << /Dests 991 0 R >> endobj 1 0 obj << /Type /Pages /Count 79 /Kids [8 0 R 14 0 R 212 0 R 629 0 R 41 0 R 448 0 R 21 0 R 93 0 R 48 0 R 51 0 R 54 0 R 60 0 R 708 0 R 73 0 R 799 0 R 715 0 R 67 0 R 721 0 R 729 0 R 87 0 R 90 0 R 156 0 R 108 0 R 382 0 R 144 0 R 388 0 R 114 0 R 117 0 R 168 0 R 120 0 R 128 0 R 135 0 R 395 0 R 370 0 R 138 0 R 734 0 R 141 0 R 186 0 R 406 0 R 174 0 R 150 0 R 180 0 R 740 0 R 183 0 R 748 0 R 200 0 R 194 0 R 568 0 R 412 0 R 197 0 R 206 0 R 209 0 R 358 0 R 361 0 R 756 0 R 364 0 R 367 0 R 376 0 R 762 0 R 770 0 R 418 0 R 427 0 R 778 0 R 437 0 R 445 0 R 784 0 R 523 0 R 526 0 R 529 0 R 534 0 R 537 0 R 544 0 R 550 0 R 557 0 R 560 0 R 563 0 R 574 0 R 581 0 R 791 0 R ] >> endobj 2 0 obj << /Type /Catalog /Pages 1 0 R /Metadata 7 0 R /Lang (en) /PageLabels 9 0 R /Outlines 815 0 R /PageMode /UseOutlines /Names 992 0 R >> endobj 3 0 obj << /Font << /F1 901 0 R /F11 900 0 R /F10 902 0 R /F5 903 0 R /F4 904 0 R /F3 905 0 R /F9 906 0 R /F6 907 0 R /F7 908 0 R >> /ProcSet [ /PDF /ImageB /ImageC /Text ] /XObject << /Im6 94 0 R /Im7 419 0 R /Im2 16 0 R /Im8 741 0 R /Im5 79 0 R /Im3 61 0 R /Im1 15 0 R /Im4 76 0 R >> /ColorSpace << /ICC74 75 0 R /DefaultRGB 6 0 R >> >> endobj 9 0 obj << /Nums [0 << /P (i) >> 1 << /P (ii) >> 2 << /P (iii) >> 3 << /P (iv) >> 4 << /P (v) >> 5 << /P (vi) >> 6 << /P (vii) >> 7 << /P (1) >> 8 << /P (2) >> 9 << /P (3) >> 10 << /P (4) >> 11 << /P (5) >> 12 << /P (6) >> 13 << /P (7) >> 14 << /P (8) >> 15 << /P (9) >> 16 << /P (10) >> 17 << /P (11) >> 18 << /P (12) >> 19 << /P (13) >> 20 << /P (14) >> 21 << /P (15) >> 22 << /P (16) >> 23 << /P (17) >> 24 << /P (18) >> 25 << /P (19) >> 26 << /P (20) >> 27 << /P (21) >> 28 << /P (22) >> 29 << /P (23) >> 30 << /P (24) >> 31 << /P (25) >> 32 << /P (26) >> 33 << /P (27) >> 34 << /P (28) >> 35 << /P (29) >> 36 << /P (30) >> 37 << /P (31) >> 38 << /P (32) >> 39 << /P (33) >> 40 << /P (34) >> 41 << /P (35) >> 42 << /P (36) >> 43 << /P (37) >> 44 << /P (38) >> 45 << /P (39) >> 46 << /P (40) >> 47 << /P (41) >> 48 << /P (42) >> 49 << /P (43) >> 50 << /P (44) >> 51 << /P (45) >> 52 << /P (46) >> 53 << /P (47) >> 54 << /P (48) >> 55 << /P (49) >> 56 << /P (50) >> 57 << /P (51) >> 58 << /P (52) >> 59 << /P (53) >> 60 << /P (54) >> 61 << /P (55) >> 62 << /P (56) >> 63 << /P (57) >> 64 << /P (58) >> 65 << /P (59) >> 66 << /P (60) >> 67 << /P (61) >> 68 << /P (62) >> 69 << /P (63) >> 70 << /P (64) >> 71 << /P (65) >> 72 << /P (66) >> 73 << /P (67) >> 74 << /P (68) >> 75 << /P (69) >> 76 << /P (70) >> 77 << /P (71) >> 78 << /P (72) >> ] >> endobj 815 0 obj << /First 816 0 R /Last 899 0 R >> endobj xref 0 993 0000000000 65535 f 0000430753 00000 n 0000431424 00000 n 0000431591 00000 n 0000000015 00000 n 0000000409 00000 n 0000003091 00000 n 0000003124 00000 n 0000004621 00000 n 0000431975 00000 n 0000004338 00000 n 0000004813 00000 n 0000004834 00000 n 0000004855 00000 n 0000008372 00000 n 0000004875 00000 n 0000006339 00000 n 0000007716 00000 n 0000007737 00000 n 0000007758 00000 n 0000008565 00000 n 0000012366 00000 n 0000008585 00000 n 0000008661 00000 n 0000012290 00000 n 0000008797 00000 n 0000008928 00000 n 0000008976 00000 n 0000009114 00000 n 0000009189 00000 n 0000009327 00000 n 0000009380 00000 n 0000009518 00000 n 0000009608 00000 n 0000009746 00000 n 0000009804 00000 n 0000009876 00000 n 0000010014 00000 n 0000010103 00000 n 0000010241 00000 n 0000012576 00000 n 0000013740 00000 n 0000012597 00000 n 0000012675 00000 n 0000013706 00000 n 0000012812 00000 n 0000012952 00000 n 0000013950 00000 n 0000018555 00000 n 0000013970 00000 n 0000018748 00000 n 0000023259 00000 n 0000018769 00000 n 0000023452 00000 n 0000027105 00000 n 0000023473 00000 n 0000023553 00000 n 0000027078 00000 n 0000023693 00000 n 0000027315 00000 n 0000032901 00000 n 0000027336 00000 n 0000029302 00000 n 0000029322 00000 n 0000032874 00000 n 0000029459 00000 n 0000033111 00000 n 0000036920 00000 n 0000033132 00000 n 0000033212 00000 n 0000036893 00000 n 0000033352 00000 n 0000037130 00000 n 0000044745 00000 n 0000037151 00000 n 0000037580 00000 n 0000037615 00000 n 0000038025 00000 n 0000038045 00000 n 0000038065 00000 n 0000040084 00000 n 0000340879 00000 n 0000040104 00000 n 0000044711 00000 n 0000040244 00000 n 0000040382 00000 n 0000044955 00000 n 0000046976 00000 n 0000044976 00000 n 0000047169 00000 n 0000050268 00000 n 0000047190 00000 n 0000050461 00000 n 0000055678 00000 n 0000050482 00000 n 0000050930 00000 n 0000050950 00000 n 0000051077 00000 n 0000055612 00000 n 0000051214 00000 n 0000051352 00000 n 0000091947 00000 n 0000051486 00000 n 0000051622 00000 n 0000051703 00000 n 0000051843 00000 n 0000051980 00000 n 0000055889 00000 n 0000059484 00000 n 0000055911 00000 n 0000059447 00000 n 0000056050 00000 n 0000056187 00000 n 0000059697 00000 n 0000061440 00000 n 0000059719 00000 n 0000061635 00000 n 0000064894 00000 n 0000061657 00000 n 0000065089 00000 n 0000069098 00000 n 0000065111 00000 n 0000065223 00000 n 0000069053 00000 n 0000065361 00000 n 0000065499 00000 n 0000065634 00000 n 0000069311 00000 n 0000073118 00000 n 0000069333 00000 n 0000073073 00000 n 0000069471 00000 n 0000069609 00000 n 0000069742 00000 n 0000073331 00000 n 0000076737 00000 n 0000073353 00000 n 0000076932 00000 n 0000080886 00000 n 0000076954 00000 n 0000081081 00000 n 0000083998 00000 n 0000081103 00000 n 0000084193 00000 n 0000087784 00000 n 0000084215 00000 n 0000084297 00000 n 0000087755 00000 n 0000084437 00000 n 0000087997 00000 n 0000091712 00000 n 0000088019 00000 n 0000091675 00000 n 0000088158 00000 n 0000088296 00000 n 0000091925 00000 n 0000096803 00000 n 0000092029 00000 n 0000092111 00000 n 0000096742 00000 n 0000092253 00000 n 0000194429 00000 n 0000092393 00000 n 0000092535 00000 n 0000092616 00000 n 0000092756 00000 n 0000092896 00000 n 0000097016 00000 n 0000100462 00000 n 0000097038 00000 n 0000097120 00000 n 0000100433 00000 n 0000097259 00000 n 0000100675 00000 n 0000104313 00000 n 0000100697 00000 n 0000104276 00000 n 0000100835 00000 n 0000100972 00000 n 0000104526 00000 n 0000108196 00000 n 0000104548 00000 n 0000108391 00000 n 0000111168 00000 n 0000108413 00000 n 0000111363 00000 n 0000114847 00000 n 0000179535 00000 n 0000111385 00000 n 0000114810 00000 n 0000379571 00000 n 0000111525 00000 n 0000111665 00000 n 0000115060 00000 n 0000118582 00000 n 0000115082 00000 n 0000118777 00000 n 0000120861 00000 n 0000118799 00000 n 0000121056 00000 n 0000124413 00000 n 0000121078 00000 n 0000121158 00000 n 0000124384 00000 n 0000121298 00000 n 0000124626 00000 n 0000128143 00000 n 0000124648 00000 n 0000128338 00000 n 0000131755 00000 n 0000128360 00000 n 0000131950 00000 n 0000167256 00000 n 0000131972 00000 n 0000132051 00000 n 0000166419 00000 n 0000132189 00000 n 0000132330 00000 n 0000132409 00000 n 0000132548 00000 n 0000132690 00000 n 0000132769 00000 n 0000132908 00000 n 0000133049 00000 n 0000133129 00000 n 0000133268 00000 n 0000133410 00000 n 0000133489 00000 n 0000133628 00000 n 0000133768 00000 n 0000133849 00000 n 0000133989 00000 n 0000134130 00000 n 0000134269 00000 n 0000134410 00000 n 0000134491 00000 n 0000134631 00000 n 0000134773 00000 n 0000134910 00000 n 0000405047 00000 n 0000135051 00000 n 0000135190 00000 n 0000405127 00000 n 0000135331 00000 n 0000135469 00000 n 0000405209 00000 n 0000135611 00000 n 0000135750 00000 n 0000405291 00000 n 0000135892 00000 n 0000136031 00000 n 0000337540 00000 n 0000136173 00000 n 0000136312 00000 n 0000337620 00000 n 0000136454 00000 n 0000136593 00000 n 0000136733 00000 n 0000136814 00000 n 0000136953 00000 n 0000137095 00000 n 0000137235 00000 n 0000340639 00000 n 0000137376 00000 n 0000137516 00000 n 0000340719 00000 n 0000137658 00000 n 0000137798 00000 n 0000340799 00000 n 0000137939 00000 n 0000138079 00000 n 0000138219 00000 n 0000138357 00000 n 0000138498 00000 n 0000138635 00000 n 0000138777 00000 n 0000138859 00000 n 0000138998 00000 n 0000139139 00000 n 0000139221 00000 n 0000139359 00000 n 0000139501 00000 n 0000139583 00000 n 0000139721 00000 n 0000186715 00000 n 0000139863 00000 n 0000140002 00000 n 0000186797 00000 n 0000140144 00000 n 0000140284 00000 n 0000140426 00000 n 0000140506 00000 n 0000140646 00000 n 0000140788 00000 n 0000140870 00000 n 0000141009 00000 n 0000190773 00000 n 0000141151 00000 n 0000141290 00000 n 0000141432 00000 n 0000141514 00000 n 0000141652 00000 n 0000141794 00000 n 0000141874 00000 n 0000142014 00000 n 0000142156 00000 n 0000142238 00000 n 0000142377 00000 n 0000142519 00000 n 0000142657 00000 n 0000142798 00000 n 0000142938 00000 n 0000143080 00000 n 0000143160 00000 n 0000143300 00000 n 0000143442 00000 n 0000143582 00000 n 0000143724 00000 n 0000143805 00000 n 0000143944 00000 n 0000144086 00000 n 0000144168 00000 n 0000144308 00000 n 0000200051 00000 n 0000144450 00000 n 0000144589 00000 n 0000200132 00000 n 0000144730 00000 n 0000144870 00000 n 0000145012 00000 n 0000145092 00000 n 0000145232 00000 n 0000145373 00000 n 0000145513 00000 n 0000145654 00000 n 0000145793 00000 n 0000145935 00000 n 0000146017 00000 n 0000146154 00000 n 0000146296 00000 n 0000146435 00000 n 0000379653 00000 n 0000146577 00000 n 0000146717 00000 n 0000146859 00000 n 0000146941 00000 n 0000147080 00000 n 0000147222 00000 n 0000147304 00000 n 0000147443 00000 n 0000147584 00000 n 0000147666 00000 n 0000147805 00000 n 0000147946 00000 n 0000148027 00000 n 0000148165 00000 n 0000148305 00000 n 0000167469 00000 n 0000171133 00000 n 0000167492 00000 n 0000171328 00000 n 0000174288 00000 n 0000171350 00000 n 0000174483 00000 n 0000176654 00000 n 0000174505 00000 n 0000176849 00000 n 0000179318 00000 n 0000176871 00000 n 0000179513 00000 n 0000183238 00000 n 0000179617 00000 n 0000179697 00000 n 0000183209 00000 n 0000179839 00000 n 0000183451 00000 n 0000186480 00000 n 0000183473 00000 n 0000183555 00000 n 0000186451 00000 n 0000183694 00000 n 0000186693 00000 n 0000190538 00000 n 0000186879 00000 n 0000190501 00000 n 0000187021 00000 n 0000187161 00000 n 0000190751 00000 n 0000194194 00000 n 0000190854 00000 n 0000194149 00000 n 0000190990 00000 n 0000191129 00000 n 0000191269 00000 n 0000194407 00000 n 0000199816 00000 n 0000194510 00000 n 0000199739 00000 n 0000194648 00000 n 0000194788 00000 n 0000194926 00000 n 0000195065 00000 n 0000195203 00000 n 0000195338 00000 n 0000195474 00000 n 0000200029 00000 n 0000203656 00000 n 0000200212 00000 n 0000203619 00000 n 0000200350 00000 n 0000200492 00000 n 0000203869 00000 n 0000208639 00000 n 0000203891 00000 n 0000208602 00000 n 0000204031 00000 n 0000204171 00000 n 0000208852 00000 n 0000240214 00000 n 0000208874 00000 n 0000237697 00000 n 0000237720 00000 n 0000240169 00000 n 0000237856 00000 n 0000237994 00000 n 0000238134 00000 n 0000240427 00000 n 0000245546 00000 n 0000240449 00000 n 0000240556 00000 n 0000245485 00000 n 0000240694 00000 n 0000240831 00000 n 0000240967 00000 n 0000241103 00000 n 0000241240 00000 n 0000245759 00000 n 0000250642 00000 n 0000245781 00000 n 0000250589 00000 n 0000245923 00000 n 0000246065 00000 n 0000246204 00000 n 0000246344 00000 n 0000250855 00000 n 0000254627 00000 n 0000250877 00000 n 0000254822 00000 n 0000271863 00000 n 0000345967 00000 n 0000254844 00000 n 0000271458 00000 n 0000254983 00000 n 0000255124 00000 n 0000255206 00000 n 0000255345 00000 n 0000255487 00000 n 0000255567 00000 n 0000255706 00000 n 0000255848 00000 n 0000255929 00000 n 0000256068 00000 n 0000377481 00000 n 0000256210 00000 n 0000256349 00000 n 0000379409 00000 n 0000256491 00000 n 0000256630 00000 n 0000379489 00000 n 0000256772 00000 n 0000256911 00000 n 0000257053 00000 n 0000257135 00000 n 0000257274 00000 n 0000257416 00000 n 0000257554 00000 n 0000257696 00000 n 0000257778 00000 n 0000257917 00000 n 0000258058 00000 n 0000258138 00000 n 0000258277 00000 n 0000258419 00000 n 0000258500 00000 n 0000258638 00000 n 0000384324 00000 n 0000258779 00000 n 0000258918 00000 n 0000259060 00000 n 0000259140 00000 n 0000259279 00000 n 0000259421 00000 n 0000259503 00000 n 0000259642 00000 n 0000387828 00000 n 0000259783 00000 n 0000259922 00000 n 0000391658 00000 n 0000260064 00000 n 0000260203 00000 n 0000391740 00000 n 0000260345 00000 n 0000260484 00000 n 0000260625 00000 n 0000260706 00000 n 0000260845 00000 n 0000394604 00000 n 0000260987 00000 n 0000261126 00000 n 0000261268 00000 n 0000261350 00000 n 0000261489 00000 n 0000261631 00000 n 0000261712 00000 n 0000261851 00000 n 0000261993 00000 n 0000262074 00000 n 0000262213 00000 n 0000399346 00000 n 0000262355 00000 n 0000262494 00000 n 0000262635 00000 n 0000272076 00000 n 0000274335 00000 n 0000272098 00000 n 0000274530 00000 n 0000275517 00000 n 0000274552 00000 n 0000275712 00000 n 0000279529 00000 n 0000275733 00000 n 0000279500 00000 n 0000275874 00000 n 0000279742 00000 n 0000282344 00000 n 0000279764 00000 n 0000282539 00000 n 0000285812 00000 n 0000282561 00000 n 0000282642 00000 n 0000285775 00000 n 0000282780 00000 n 0000282918 00000 n 0000286025 00000 n 0000289610 00000 n 0000286047 00000 n 0000289573 00000 n 0000286184 00000 n 0000286320 00000 n 0000289823 00000 n 0000292944 00000 n 0000289845 00000 n 0000292899 00000 n 0000289985 00000 n 0000290123 00000 n 0000290263 00000 n 0000293157 00000 n 0000293798 00000 n 0000293179 00000 n 0000293993 00000 n 0000296272 00000 n 0000294014 00000 n 0000296467 00000 n 0000299521 00000 n 0000296489 00000 n 0000299492 00000 n 0000296629 00000 n 0000299734 00000 n 0000303854 00000 n 0000299756 00000 n 0000299836 00000 n 0000303825 00000 n 0000299974 00000 n 0000304067 00000 n 0000306543 00000 n 0000304089 00000 n 0000304204 00000 n 0000306506 00000 n 0000304342 00000 n 0000304476 00000 n 0000306756 00000 n 0000313383 00000 n 0000306778 00000 n 0000306846 00000 n 0000313186 00000 n 0000306986 00000 n 0000307077 00000 n 0000307215 00000 n 0000307287 00000 n 0000307427 00000 n 0000307522 00000 n 0000307656 00000 n 0000307724 00000 n 0000307864 00000 n 0000307955 00000 n 0000308093 00000 n 0000308166 00000 n 0000308306 00000 n 0000308402 00000 n 0000308540 00000 n 0000308604 00000 n 0000308744 00000 n 0000308831 00000 n 0000308969 00000 n 0000309036 00000 n 0000309176 00000 n 0000309266 00000 n 0000309404 00000 n 0000309476 00000 n 0000309616 00000 n 0000309711 00000 n 0000309847 00000 n 0000309919 00000 n 0000310059 00000 n 0000310154 00000 n 0000310292 00000 n 0000310369 00000 n 0000310508 00000 n 0000310608 00000 n 0000310746 00000 n 0000310823 00000 n 0000310963 00000 n 0000311063 00000 n 0000311201 00000 n 0000311294 00000 n 0000311433 00000 n 0000311549 00000 n 0000311685 00000 n 0000313596 00000 n 0000332409 00000 n 0000313618 00000 n 0000313698 00000 n 0000331972 00000 n 0000313834 00000 n 0000313972 00000 n 0000314054 00000 n 0000314190 00000 n 0000384243 00000 n 0000314328 00000 n 0000314464 00000 n 0000384405 00000 n 0000314601 00000 n 0000314736 00000 n 0000314872 00000 n 0000315006 00000 n 0000315143 00000 n 0000315225 00000 n 0000315360 00000 n 0000315498 00000 n 0000315578 00000 n 0000315713 00000 n 0000315851 00000 n 0000315986 00000 n 0000387748 00000 n 0000316124 00000 n 0000316259 00000 n 0000316397 00000 n 0000316477 00000 n 0000316612 00000 n 0000316750 00000 n 0000316831 00000 n 0000316967 00000 n 0000394685 00000 n 0000317105 00000 n 0000317241 00000 n 0000317379 00000 n 0000317460 00000 n 0000317595 00000 n 0000317733 00000 n 0000317813 00000 n 0000317948 00000 n 0000318086 00000 n 0000318166 00000 n 0000318301 00000 n 0000318439 00000 n 0000318519 00000 n 0000318654 00000 n 0000318792 00000 n 0000318873 00000 n 0000319008 00000 n 0000319146 00000 n 0000319226 00000 n 0000319361 00000 n 0000319499 00000 n 0000319579 00000 n 0000319714 00000 n 0000319852 00000 n 0000319932 00000 n 0000320067 00000 n 0000320205 00000 n 0000320285 00000 n 0000320420 00000 n 0000320556 00000 n 0000320638 00000 n 0000320773 00000 n 0000320910 00000 n 0000320990 00000 n 0000321125 00000 n 0000321263 00000 n 0000321344 00000 n 0000321479 00000 n 0000321617 00000 n 0000321752 00000 n 0000321890 00000 n 0000321970 00000 n 0000322105 00000 n 0000322243 00000 n 0000332622 00000 n 0000337305 00000 n 0000332644 00000 n 0000332726 00000 n 0000337268 00000 n 0000332868 00000 n 0000333009 00000 n 0000337518 00000 n 0000340404 00000 n 0000337702 00000 n 0000337784 00000 n 0000340375 00000 n 0000337925 00000 n 0000340617 00000 n 0000345732 00000 n 0000340958 00000 n 0000345687 00000 n 0000341095 00000 n 0000341177 00000 n 0000341314 00000 n 0000341446 00000 n 0000345945 00000 n 0000348542 00000 n 0000346047 00000 n 0000348513 00000 n 0000346184 00000 n 0000348755 00000 n 0000352092 00000 n 0000348777 00000 n 0000348859 00000 n 0000352063 00000 n 0000349001 00000 n 0000352305 00000 n 0000379174 00000 n 0000352327 00000 n 0000377458 00000 n 0000377563 00000 n 0000377645 00000 n 0000379145 00000 n 0000377785 00000 n 0000379387 00000 n 0000384008 00000 n 0000379734 00000 n 0000383963 00000 n 0000379876 00000 n 0000379958 00000 n 0000380100 00000 n 0000380238 00000 n 0000384221 00000 n 0000387513 00000 n 0000384486 00000 n 0000387476 00000 n 0000384624 00000 n 0000384763 00000 n 0000387726 00000 n 0000391423 00000 n 0000387910 00000 n 0000391378 00000 n 0000388051 00000 n 0000388193 00000 n 0000388275 00000 n 0000388417 00000 n 0000391636 00000 n 0000394369 00000 n 0000391822 00000 n 0000391904 00000 n 0000394332 00000 n 0000392042 00000 n 0000392124 00000 n 0000392262 00000 n 0000394582 00000 n 0000399111 00000 n 0000394767 00000 n 0000394849 00000 n 0000399082 00000 n 0000394989 00000 n 0000399324 00000 n 0000403612 00000 n 0000399428 00000 n 0000403575 00000 n 0000399562 00000 n 0000399644 00000 n 0000399784 00000 n 0000403825 00000 n 0000404813 00000 n 0000403847 00000 n 0000403928 00000 n 0000404776 00000 n 0000404064 00000 n 0000404169 00000 n 0000404303 00000 n 0000405026 00000 n 0000409870 00000 n 0000405373 00000 n 0000405453 00000 n 0000409801 00000 n 0000405595 00000 n 0000405736 00000 n 0000405876 00000 n 0000406018 00000 n 0000406156 00000 n 0000406294 00000 n 0000410083 00000 n 0000410105 00000 n 0000410183 00000 n 0000410265 00000 n 0000410347 00000 n 0000410428 00000 n 0000433408 00000 n 0000410509 00000 n 0000410610 00000 n 0000410690 00000 n 0000410799 00000 n 0000410940 00000 n 0000411037 00000 n 0000411248 00000 n 0000411331 00000 n 0000411503 00000 n 0000411618 00000 n 0000411734 00000 n 0000411823 00000 n 0000411930 00000 n 0000412039 00000 n 0000412140 00000 n 0000412253 00000 n 0000412391 00000 n 0000412500 00000 n 0000412611 00000 n 0000412788 00000 n 0000412910 00000 n 0000413061 00000 n 0000413188 00000 n 0000413283 00000 n 0000413402 00000 n 0000413516 00000 n 0000413638 00000 n 0000413737 00000 n 0000413888 00000 n 0000413993 00000 n 0000414098 00000 n 0000414205 00000 n 0000414310 00000 n 0000414418 00000 n 0000414582 00000 n 0000414659 00000 n 0000414762 00000 n 0000414911 00000 n 0000415018 00000 n 0000415119 00000 n 0000415237 00000 n 0000415339 00000 n 0000415461 00000 n 0000415561 00000 n 0000415707 00000 n 0000415847 00000 n 0000415942 00000 n 0000416065 00000 n 0000416192 00000 n 0000416354 00000 n 0000416496 00000 n 0000416597 00000 n 0000416740 00000 n 0000416836 00000 n 0000416940 00000 n 0000417030 00000 n 0000417128 00000 n 0000417237 00000 n 0000417338 00000 n 0000417449 00000 n 0000417565 00000 n 0000417669 00000 n 0000417756 00000 n 0000417898 00000 n 0000417979 00000 n 0000418060 00000 n 0000418160 00000 n 0000418280 00000 n 0000418459 00000 n 0000418589 00000 n 0000418696 00000 n 0000418811 00000 n 0000418908 00000 n 0000419124 00000 n 0000419370 00000 n 0000419465 00000 n 0000419573 00000 n 0000419685 00000 n 0000419784 00000 n 0000419945 00000 n 0000420055 00000 n 0000420289 00000 n 0000420369 00000 n 0000420621 00000 n 0000420826 00000 n 0000420937 00000 n 0000421045 00000 n 0000421159 00000 n 0000421269 00000 n 0000421389 00000 n 0000421502 00000 n 0000421608 00000 n 0000421719 00000 n 0000421828 00000 n 0000421906 00000 n 0000421984 00000 n 0000422062 00000 n 0000422140 00000 n 0000422218 00000 n 0000422296 00000 n 0000422374 00000 n 0000422452 00000 n 0000422530 00000 n 0000422608 00000 n 0000422686 00000 n 0000422764 00000 n 0000422842 00000 n 0000422920 00000 n 0000422998 00000 n 0000423076 00000 n 0000423154 00000 n 0000423232 00000 n 0000423310 00000 n 0000423388 00000 n 0000423466 00000 n 0000423544 00000 n 0000423622 00000 n 0000423700 00000 n 0000423778 00000 n 0000423856 00000 n 0000423934 00000 n 0000424012 00000 n 0000424090 00000 n 0000424168 00000 n 0000424246 00000 n 0000424324 00000 n 0000424402 00000 n 0000424480 00000 n 0000424558 00000 n 0000424636 00000 n 0000424714 00000 n 0000424819 00000 n 0000424906 00000 n 0000425017 00000 n 0000425104 00000 n 0000425209 00000 n 0000425311 00000 n 0000425416 00000 n 0000425515 00000 n 0000425614 00000 n 0000425713 00000 n 0000425812 00000 n 0000425922 00000 n 0000426041 00000 n 0000426176 00000 n 0000426311 00000 n 0000426446 00000 n 0000426560 00000 n 0000426668 00000 n 0000426791 00000 n 0000426899 00000 n 0000427040 00000 n 0000427192 00000 n 0000427309 00000 n 0000427417 00000 n 0000427585 00000 n 0000427705 00000 n 0000427825 00000 n 0000427939 00000 n 0000428056 00000 n 0000428182 00000 n 0000428314 00000 n 0000428419 00000 n 0000428554 00000 n 0000428698 00000 n 0000428806 00000 n 0000428923 00000 n 0000429049 00000 n 0000429175 00000 n 0000429289 00000 n 0000429412 00000 n 0000429538 00000 n 0000429637 00000 n 0000429751 00000 n 0000429868 00000 n 0000429985 00000 n 0000430714 00000 n trailer << /Size 993 /Root 2 0 R /Info 4 0 R /ID [<61DFFF9246DC131C55E71279EBC8F96A> <61DFFF9246DC131C55E71279EBC8F96A>] >> startxref 433461 %%EOF hsqldb2.2-2.2.9.orig/hsqldb/doc/util-guide/dummy.html0000644000175000017500000000000112007570302020724 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/doc/util-guide/systempls-app.html0000644000175000017500000002557212007570302022436 0ustar renerene Appendix A. SqlTool System PL Variables

                  Appendix A. SqlTool System PL Variables

                  As of SqlFile revision 4863

                  SqlTool System PL variables are the mechanism used to configure SqlTool behavior. You can list all set PL variables by running the SqlTool command * listvalues. If a SqlTool System variable is not shown, then it is unset (which is equivalent to non-null). But if a system variable is not set, that doesn't mean that the setting behavior will be unset, but rather that the default behavior will apply. For example, if you * listvalues and the variable *DSV_COL_DELIM is not listed, that doesn't mean that there will be no DSV column delimiter, but that the default DSV column delimiter will be used. The in-program help can be used to determine what the default behavior is. (In the case of *DSV_COL_DELIM, you can see the default behavior by running \x?.

                  Besides System PL variables, there are also user PL variables which have names beginning with a letter, and the special variables ? and NULL. NULL is completely equivalent to *NULL, which is explained below. See the SqlTool chapter about ?.

                  *ALL_QUOTED

                  Boolean. Whether to quote all values (excluding null values) in a \xq export. No effect on any command other than \xq.

                  *BOTTOM_HTMLFRAG_FILE

                  File path to HTML fragment file to close the HTML report or DSV import reject file.

                  *DSV_COL_DELIM

                  Literal string (which may contain character escapes). DSV or CSV output column delimiter literal. Run \x? to see default value and details.

                  *DSV_COL_SPLITTER

                  Regular expression. DSV or CSV input column delimiter regular expression. Run \x? to see default value and details.

                  *DSV_CONST_COLS

                  A list of column_name = column_value|... settings. Specifies constant import values. Run \x? to see default value and details.

                  *DSV_RECORDS_PER_COMMIT

                  Integer. How often to commit upon DSV/CSV imports. Run \x? to see default value and details.

                  *DSV_REJECT_FILE

                  File path. Path to DSV file of rejects rejected upon CSV/DSV imports. Run \x? to see default value and details.

                  *DSV_REJECT_REPORT

                  File path. Path to HTML report about CSV/DSV import failures. Run \x? to see default value and details.

                  *DSV_ROW_DELIM

                  Literal string (which may contain character escapes). DSV or CSV output row delimiter literal. Run \x? to see default value and details.

                  *DSV_ROW_SPLITTER

                  Regular expression. DSV or CSV input row delimiter regular expression. Run \x? to see default value and details.

                  *DSV_SKIP_COLS

                  A list of column names to skip, like column1|column2 Specifies columns to omit from CSV or DSV importing or exporting. Run \x? to see default value and details.

                  *DSV_SKIP_PREFIX

                  Literal string (which may contain character escapes). Specifies comment delimiter character or string in DSV or CSV files. Run \x? to see default value and details.

                  *DSV_TRIM_ALL

                  Boolean. Trim leading and trailing white space from every cell in CSV or DSV file upon import. Run \x? to see default value and details.

                  *DSV_TARGET_FILE

                  File path. File where to export CSV or DSV to. Run \x? to see default value and details.

                  *DSV_TARGET_TABLE

                  Table name. Table where to import CSV or DSV to. Run \x? to see default value and details.

                  *IGNORE_BANG_STATUS

                  Boolean. If true, then if an external command executed by \! returns error (non-zero) status, SqlTool will not report or try to act on the error. (This will have no effect on what the external program may do).

                  *NULL

                  Null (i.e. always unset).

                  *NULL_REP_HTML

                  Literal string (which may contain character escapes). Same as *NULL_REP_TOKEN, but only applies to HTML reports.

                  *NULL_REP_TOKEN

                  Literal string (which may contain character escapes). String value to represent SQL nulls from VARCHAR columns and null (unset) PL variable values. Applies to what displays on screen and what gets written into export files.

                  *REVISION

                  Read only. Literal string.

                  *ROW

                  Read only. Literal string. Set only inside of * forrow loop bodies. If there is only a single column fetched, then this is equal to that cell of the current row, unless that value is null, in which case *ROW will be the *NULL_REP_TOKEN value.

                  *START_TIME

                  Read only. Literal string. Automatically set to a localized string presenting the date and time.

                  *TIMESTAMP

                  Read only. Literal string. Only usable if *TIMESTAMP_FORMAT has been set. Displays the date and/or time at which this variable is dereferenced.

                  *TIMESTAMP_FORMAT

                  Formatting string, as described below. Setting this variable enables the *TIMESTAMP read-only variable to be used. Set to a date and/or time format like yyyy-MM-dd'T'HH:mm:ss.SSSZ, as described at http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

                  *TOP_HTMLFRAG_FILE

                  File path. File path to HTML fragment file to open the HTML report or DSV import reject file.

                  $Revision: 4904 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/util-guide/rejreport-sample.png0000644000175000017500000006607612007570374022745 0ustar renerene‰PNG  IHDR€ª¬ÌÜsBITÛáOà€PLTEÔÞÍTÀB‘;ZZZýôZZ¹ÃÈØïÿÿ333RRRéØççW‚¸­­­ÖÓÎ!!!êÆ5 vvÿÿÿŒŒŒfff¥¥¥ÕoÞïï:††÷÷÷™™™BBBSZZïïŸîåè„}ÀÎΓ½½Ì33½½½.U†³>fffœœñéÕ{{{„JËž~ÇÆ´JJJæá#Lz›ÌÌÌõUUæ÷÷I…±Æ°:::µµ´k°5]y¢jdX&7«)))à××àΨåâßx™¯ŠŠ†@fšÔ¢^ÿ„„„‰””%«Ü––’¥³Np±Ç]ÒWWo)ÞÞÞ<`Œffà“NÚ#ö==ï¨z8Yq{„„ž««ÅÅű½½êç×xsssëÇw«©§÷ÿÿæææ5G©¶¶f™ÌÁ°®ÖÖÖŠ®Õm‡±ÄÂÀ-` ³rt䃠oöuuàˆ=Iy³ðŠž¸˜¿[Ú§§ÿì·v€€½ÖÖ?tª™™™ÚÿÿÑßß· ½ pHYsØØH‘¦!tEXtSoftwareMacromedia Fireworks 4.0ê&'u2tEXtCommentCopyright 2009 Axis Data Management Corp.®¢˜ IDATxœì½—”F¾ÇÍ>—=ÞÀ §çéBèiwËÃf¹–“¥®w±Mhnb6xsµÌe ѧQ²›Ws2ÿúó«úe¦ÇÑèØFùž™~z¯¿_ …4póÚ~ƒµé¶.m»ƒä–¯‚OÒðx4X§cÊkÓMx\3pPþ†tLfà˜À9v¸Ö´ÅËí¬ª²ýâ§-/ÅÃy„m÷%ÿ™u.hƒð½ Û¶1+ŒëšÖK(®±Æž%QhÇÜ –2·Ûwâí³w³Câ½::¶AÐo?w }/ÄŒ•¼î6Tl›o õ¡Qâ:ã!²ŽÀîüŠÝ¹óøñï.ÍÃÌZ+B0h'!e o1Ã,EàûY³Qdµ¾ÌtxÑaçúƒ£ªæ)×»Ûúr̺"UEºÆdu]W¬š7wƪÓ‰B¯/ÓÆœ›µ]Î{¾Çî¢?÷‹pœéU̾ÿÃûÞ¹sW~ç-›Ì÷& ÷Ò®«!Šò Ê\î¢á%6½íR·òqé%žˆE¶Y¹ú‰‡r•™]ñ7ñ¹´=x)|Ï˵fOV¼ŠO>îšÍ´ ×·È|OiÓ¦ævÛЖiÛ¤ sbLóEؤù[‚ï°ÇÅÜŠª,ŽãŒ¿´ƒ:@+#† ú!ã@`Ú„ÙBŠ ??uêÔøÎ­wv›°4©*-#¾Ÿ~€u™Ÿ%ç^iÚ ŸRÛ&ʈVŽ‘kšÉ÷2=g%àše¹NsŸȹVå³,̬ò‘«å>‰s”›¥žä¨D¦oæ¹Þ–Ð4ÍÌ‚ý^žTžeå,§fùOà;4lNwwKØdú•–+šç¬IŸBQ^PŸrý&à[ƒß1âvPULÎ2[ëhªE;³I–U‡ 媬²+Ï«ŠÝ¬1’sw¿ò?øàê;­Îì$±cU‰d¾–å”äš_T¹8€yVbË­ŸÐmšë9wüã±oђ涪[È´2Ÿ/F€pYäË‹‰åMòØ÷âÜKì Œ"g•–ܯC©M-±}“ýEÅ €»Î1plš° ™1³¼Äw};³0 Ïrÿ7` _t ר¿cfnMSj×vÜІP·™Í4îg×GT+lå>ÿrêÔ?Õoþà?ûýûMXZÇ$Ç“z{ÚôU®?Íuwb¢Öjyéé1ç››9¯<6Λ€£¯r-¯@`ܪ!î‚Íù%æ[cŸÓ'®™x6p.8ó9†¦fæ…I<¯$ùö°md M8¤9lÂ&Í¥Læúɳ¡OKËá½Ëõjr'tˆó}‰ EÅ•­/, Gìª`¨<ÌBHæéºGXŸ:õÅ©üó0}ç¿4aÁŒ¡¼²š{Ô,3¼M;'fRäõTX@Û†žG~‘$qéYäÛ.Ëk’Sn0™ÌdÛ4½<óÂÜ®r”ÁØrƒE-Çh¬ùs†­bpY–M³ª„@ &d_h:ÿ@QaVÂJZ`³¼HÌ¡#FäùÕd2ñާŸ¨%j­ã£ìpmÒ÷¶cy [Áh,Xvø°*„ ®ª}–üç(ýó;ïtÃ1¦ÑªÌ(xxWJøg};Ã)k>ÿÑ4~¾SȆ‹<„*)Œû4ÌíbEaUV|óUÓX×hûeÛ1O‹ÁF»#“J+qU —˜jšNõšè,¦”çYR^lؤooW—.&.¤_Á¬¾¢ñoüw©§×f=ï\ —a‘ù,˜OJ`Vrè,8†îÕªª(*²üÿýó”Ðï?Üo=MôkêWùæ“Ê.ìÙóëP?ôrH8V{ˆ^ ø„*N ‡°C†Tí†Ã£°Õ( ËÉ?ÿùÅ©SøÃ“Nc?‹\÷‰{_P.6áËÕ«CÁ„šfóbÔ5lÀO2.U¥j£,˜yþç??{ŸcyYM¼ffâ7ÝØ­tBªec’^Ù“­ 2/ÿ€%ÿAâˆß‘#:Ô1ÿ&p|Bé7ݰ£wÿ†#йE¸9êbб$|8~¯6„ó2¾4Ÿ¯ âx_üŽˆ²aEO° ¿+ø›²Ï§À¬W¯M¨°×FÕØk£êìµµç«W—ß¹™›mïÞìàÚÎÊx›Çá/qì®Ï¦l^Ú½úáå™§¿Ø²6\|ðP‰Ýý‘÷GÝžeé½×æ½HY&ºrÀÉä GCe_/¹)ì˜ñŸPJ'6)Éç{pÂ_M×ó"sæ·Ù q+žF![Þ²­%ÅF6Qˆ;2–òßÞW˜’W‡&Í–g½6¬¸ÀqQWÿo@_\gkÛJ3T,b¸#~ßfO cRMÔ¡TåÜZºÇÑ’"UfÏAk,µ¸BH×#Ò=†4ƒç–”š®K£í˜Š\5D9€1«<Œˆ†*^QÅ6µ ÄD¤H[ªŽëC7®‘We1F6..dGæʨІ,m ­°Þëe Ó*Žkº@  , 朲À¬ò½dO(RˆM8z¹;rµ„_·Uè©G‚¹ñ’¹ E'1Ã,*jÍ/rÓM¼PÏ*kàÔu5k»ð Ë,½¤°ŠíÈ­Çålì‡_uÕÄ–wfzŠ‘¦¶å-W2¬ýbœ—P€<óÜsæ…(£¡ë²$CÈ›T,/g¾g‘¬×ÆÄ/àU|+Q’Õ oHgi:B®ÃÓ*qÌr7"réŽÀŸ–`Áʬb²kp#fObìãLp–¡fÊ0u­I¶p÷e…™±ZU UfÒÛ¤½žA•VˆÎ© j}U–­9G­¬ýv ¸`é{Z^b‘%Ëf ^6òëù^90uIh@ð†¥25•3ßž‡ã.˜Cc»ÝK,7p]ˆ[FÛµ•Ë– » +ŸÄ™)[+0g? âx;+U] …¬“8•e™€0$\vá½^¶nÞkÒYÀí@±C8ÆÐ•ó‚ˆ0.Ï&Tð¤Ð÷aÆÏs,¨ 8ºI¿{‚” Ä2«ViРņ`”•!@Ê8m¾)ÜÞŽ†ɰÌ´Í Üg™MÌå5°L‡jÅ“f3¢,¹`1Œƒ8†”ó2Ê2³p£bó—õF%α©.Y@~WðînBÑ Æ€DÖ–LrA¨ç×y¾(•ï,ÎÒtdG®Zo\û–P “Å<—æû Œþ`ï62k'ed€!Òaaluç+³aïa#ÇÕü:QÀ<¡Ì›ÊŒM*×Y¯).hUeX§U–dÍù¾I‰`b1^²1.šL&`þH‚P†I†ü›àM]·œ”¥íC4‚2¶4}.8‹^9qK4©¶Ù؆P0œðèÆr™ ý‚ß< {³a¦lB$kò?’$uQÂ&ä Œúæî¢p0:ž‚ùÓ|$’7ýÅ(¯ä÷Š@å*sŒaRFv‚_l‹öz61uÆ8ËVü„ÚhtðL[,§\³ç§!©&ÎQczŸ VÎìi‹!fVÎDÖ¯ùA¦lJ‰³ù¹÷ýg9{m@´G®XÀæJ 5=ÙüD²ö\ó¡q&°ÒÛÜ¿e®ôÈn¡„¿Z¢ÿ•Åfã)»îùõå‡TU–CàÊzYËÞýq ‚Ü[`¦‡q½&íjýs?÷‹Tw?†«ø¨ºãîô?¾ùj½¦_ß¿>|xÿD¸ð=Tâãb=€s øàÛ·ì´`wÔWc¯œ-‰?¸{âHæâÛo_›h€^æb7ö<ä¡ÅµÌ¼ÒðwçîÛ÷–Rµ'í rñ`:Õç–À3çÏ^=£Ðp{›˜¦)ñ@WŽ€/QÓ¨øúÈPYÃxyä@ç9.N#4(å^Ó˜ä©9pÌHv9€ ç2,uà)A6‡ƒBáó(@r°/+)¢#ÃK'†i¥Þ zl=†eûtX`ˆÈgÝt¬\ð›“m `×A@1w.ãË0Ôª¬1XõÊ,ëúH;XlÝÝÚwµÅFàÝýë›w~ÿ·ýë_Õ"Àï‡ï}qaðÅ{ß¿}}°°€ó’­xñ 'ïg¡u‚Vf²eYË—wÞjÎöÝûàÊ•ó‹Iˆ˜8Ø™ÃH!s¾ýÄù»wkû68/vQáN eÞ*€ÕÕïnzõÌ`ÚèšfxÖ`  kfƒÜZʦ9í3°å Jgà0ðÎ4é %ð®&ƒJt†,šÙp ºÊsÇS~¸øÆæ& (õ`TÁÇ—à ìøpKÏÁ°•ƒÜU¿þïeI×AÀÎ'@U2wPñn6p9€|p©U{‹–V<óߟ~úéïÿΧŸþÏ7_ñ‹}y† #î~üÞõ냇Û¾~<¸Ôجö?8ûó·–]ðòiÏ%þ²ñh$--2ŸåºR¡ùf¨m».(v’>¸Ûò÷öóœo7ëõ,žð¢gÍÜ»ðÄ£;Ÿ|úÓƒ9€YÒ(î%à­”»®?„­˜ÕÀrÁÀ«¹¯ô¼>âV® pŸ£A0äÒAÎo`Í xi˜ÖâÝ߆­Íä’kLùûKpP–ó·ªy¥¥+÷YÀá €™Ax{ ¡ 1¥™xw‡:p»ä†±º”RíЬ[±Œã÷ønÅôÎ~£þÇï¹>ûß»¼º4--~n_¸tø=¸àKßÏ]0€ãl¿,\ûYÌc¹Ö¸: q­ÑòÌ8>{÷ÁÝ+'À¶ž©Îœ›4Î]á‚-s5ðÅ ‚ã{:ßþv¾•éåüI„nL“rÀ3ß½üéåsÜØ ÆJkP%ƒÚf-€˜CÆáq‹`€e6< Å#kahó=6á߬!NkÀáæ43`>j8isâoÙÿ÷ °œ]u$~³è^­0~šع |Œ8ª€å¿þÆ üìo›þ¦p/ø4ÙÃëƒ/>~øýö÷föÈr˜eŸ€ üùì\æ ˜æð bß$¤´W†ºg|ûÞyîÜ/ß=¿°¿«ƒ„™)$²tGî½;Ýxóí¥936ë\—†ãË+ß=øîìÉA7 éÌ«Í]ÌT˜xFçÚÁ s†ù€›ÄÑÀÇ´Pµ8ž<ð;heØC¦ƒÒÚ*s°íl< áß7 `c9)`³Ê2nÞ—¼ó·=8Ðÿï‰fR6Ó8 ¸CêéÃ.\0ã86.¾8mp@®VûàÄm`xé,ZÈ›.ÍbîÝû¹Õßά‰ŽLÔƒIO=ô;Å,xè^<{Þ ùi˜¸p¨¦@˜3‡üìZ¦DˆaŸ=5œ2ƒá[©Ì`â¤Ó”cqŽ-…ɰ8IÃf”{¶Uœ6͈ÀPä)âÉq+:äqŠ‚Áôe8,eµ=€IðÀNË¿ùÛÞ×_ïtv=#NÃÔàh]!Ÿ~¸Ò%&XLB0~š“1ÌójoìÁA<ðñ7ÿñ™üï|³–íëëîñýõï¿ç§aîßÿøæ³`Ðí³ß^ä'Û8î·¼Çõó•³g¿ýöÄb»@M…¹|.üÞÛ€?Ÿk–!ÆŸJ ÊüjÀR›Ÿ/è|yäð}Áá»Ô§;9ñ²4ÀOÆ4®´ûê‰è½;?Þ»W=݉è¡+æ$Ï&ä{òâ4Ì¿äÿúæ_|öÁZ6˜>\:}ÿû·ü²@p·?¸È!úòo¹ bjú.WôÁ½›¯¼}ïí·¯|ð`ù| nl¸â‚-RЯ.ÎùœÕºíun.ΗÓ$ï+»3¤ä~ AN .º'—Ÿ2ù—¥áüµªE̵pé—¸>€³§= ½&³€wÿû_{ñ‰¿}³ž /øñà  = Œ»èźfK¿B´ú‘^©1EWa&|íf½_gMLÓœLúèïú ‡‡G¯š«".³NíUVÌ«Í9pÜ^þ¡­»¾âiÄšßïýµ ´*·z™q×êý.Õ¦üéÝVÿùŸŸvÛ?ùŸ¹N¬Mãåk ÀÁÝo¿ýqøðß»&yÿÃ/¿üò¿¥~wmt‰+µ4·Þ·`ס1š\§Íth®5BOŽiCqq˜6<°ÔŒˆº>Á寸 Ãbÿ“ƒŸ‰ÈòïZèpG±¶HO÷i’jõáçŸ_ZJ¿ãï§¿þôn—þÍ9WŸ6ÇãÖ2€¿ýö[ôÅÀ/Oúò‡S\﯋ò{Œ1©¼å®o¥ï g²ª6U-Ç Éܾçz´Ý V<m/¦¤I†d5¯ªD–eº© q¿]‰ š•|µjwÔýbòl©®7Ï4Ë̇èüQaA :VæJó[³ì´€‚A 2ugÝVÜܵ LáSiF5¿h£,ãáhÅrSȼ̃²€4Wœ´ü³Õa»µjÅÆPKš±\–-Rz²*‹§N™!/¾x2$”6ÈË5qEsLu¤ª®ÃïCðÒ¡²¸WÇe/g¼eÄSNË̵Ôùñ÷%÷TŸùùû‹'äµüýeø»áÜ/¼(zâN‡RP6_¶–t?ÿííú·û7g~=7øCÃß?>_]gqüÉ•ógX=ËÃѸ‚àÏÃì.¿‰#S˶SøŽìJ^Èoƒ¿—aWܦI'±P×yëÆPYıŸñç\Æâšm®Ú0‹ï]¹˜Õ®)‚¥iO¾çF6Mäáh ÊdH™Äq,¶€ñå++&[+𙕲§DõxÙüÙ‹I•Õ–S’ ’IéX‘\UP´¼Ê&Š‚â¼{ÎTBŠ¢JòIŒU¿,Íq×N™×pDª®¸©|¤eR(“gf$ 7MÛZ”cÝ.ô&î¸Ï#õqo+ÛqæuVGÃpéÖÖTnC)ÛÛyä»ò(?sñÃSŸyi8üòó»(å‚ñ7|é§ÿütÐ[PŒm”¡2®dh+³C%yZn^˜nûxøxðÝ¿ u]ý>gïÿþïÿÞûüÔ‡bÃê=ç`ùÉUï¯×ª¡ ­Gg ކ£ª ›>³Ê’7ß>¯Mÿzî|Ò¸ï¾û×ß½ûîW?½û—9€·¯]»zMèâmþT«ÊÑ-šá<ƒ£,|éÓ²e?øvàþÛ>/]ºuûáËKï ÈÒÙLZ<+t¯»óé§WÓ@œ@c€yž[¢›ÔÒU‰kä–.x Àß}róÓïNÌ„ _e…,«t;ä‹Nˆé͸vÇ´T-P½ à™ü܃OºC’Zn\žÏ\½rå0μu"«V3 B¹rÛüK^†Œ9-€‹Ypì>nŠ=‰Kñ„wlAߺ£¡ìh" U¥âæŽ*çÛŒëì*ä¨b0ŸmÏgÁåÎÊ,8WgzXLaJ,ÖƒhüV?-³åÀÒ™•­‹Û΂›Ç»—FY͘;†P›‰©÷pÆ||oœÀ8ÔRUmQìaY><õtßÂw~õÕ§_ÍÇŠ·¯þñZyïÁà“Ëë´»L2x‰H¦Ï ¡à£±Ißû׿üð‡S?¼wêÿÖÏ‚kq×ß`Ðø´¥€6ù IDAT³x`Ï;:ôiÃ.¶ùëN$ãø9hôëÎå=ܵÚýðT;QlÒïNþnðÕO]ú·Î?<¸W>¹78ÿªü²tæøÃ;—Nrþþßùi~"úËüpêÔ—k¬hw{¾ £në©R¬² ôÔ7˜. “E®¿": ë.ï¹~ y¥~ Y¹AnñKÈ.ýrûüù+çÅÿ•kÓØ€–~ Žwi·¬þ š÷Š~i¡µÑu6ÿUWמá jŒ}ö‘WbïÿãÙxÒ.¿q­ù-¸:3׫b³þj˜^U`¯ª°×FÕØk£ê|)KŠlº²½^=µ249~y¯ÌÔ«×+£ÀÊ~ ÒÆÚüôÇ1Jß}¹J?:Ðó«ª^B&ä¥ärÈýÍ£ºŠáêIš†ëãÆ=öLêšâ—P—3ï%äBëâeÔÅ[û;_ 7xü¹Åü'ŒcÝ·„ò1É{™dy •É^J]*‚Öýì´ `· ë1Øæ|\õ,ô¥LޝûP¶²dññd’™<á“ K>z)‡l6Y7 ]°hžHSÅÑ󈛕e=²{<õl´›\´ãÉ„vww]ëtõxl»ðá =<–\P×ÇxÀ>€µx(î «í\ó×2Þ^°Y±ÝÍP}d‘ŸNDG:Ê›e¹avÿ‚2iÓ×Iw$œ]›ßcqã…e³”Høï }üb2is™×¥ç/Ôïë˜'˜ ±+"CŒ.(Oô–FJËòskÙ;Où‹Æ¯ž/]WçÞþ²$!@a2Ñ:¯­¸'ǮͳCº^3C–Ud™õÄR“×ÅÜ·™? Lߥ¹ß6§ÆÍç!km ©c~9;`Ìw‹†ÆV.LJÉ©Ç^³#Þw¯ÎüDlÓrk7+ò\[ÚŠíJ£ÊÙºÎö§l{œ·xe€÷ïߟˆs â&&¯Þ®Oš*=‹ü /ÐdÒ5eûž!åÏÿÕâR{•hmmŇ`Z­ˆð6=¬×ÄÛªðónÃ,Ë»Ýó M€e•dV&F†.¢Û¿N’ã$ñ×°Û‰cèÙirÀ ›èî„Nð €"ÀÉãËà›XÏrlúumyÛFÙ¶D¶ô*þø‡1k·ÒöÛ4oJ“Š&t¼ `ÆsaP—f«JY3±,ʪZ€ÇŠž|JêZö—s<(’° ­mÒa˱@šã:O*þü‰]}>0D¦ŠÝ¦›ñËsy‡éúšlLÏ›dhRtHµ6OÚh¬UŠ3sœ PÌf^Å«4/ø¾V[«qmjYRÌ&ÑFZ6ùóûÃﺜõjÄ å‹’g•×´æÜSc‹?ÔªZï»MTL2{¢ÍÀÕ%Vûó'.>ùËŸÿë³Ï¸=ô«Pf•ƒ-(yå,d»Cû„ùqœë¼|lð»b`žkr›Ð1u÷­³€ÛH’¼uºÕ£Ë—?ýéž°,+3wõ¼,ƒ9€šWºÊ0'å0m¬€@on$îË„âI5ÿVð ÁY~'çÙa ®ð›ÞRS;3vÝF³L/¬0-#pYÆÜxà<µÖ“NjðYÝ·ÀkP—OÏÐcYl’eÈu·úÓ×àcƒ4kõ„οñÔ.^<óà̵«\—ÅFÏJ'±0†2Ó€€ ÔJÎÒ]ÝNô‰Çdýbh2¯ oõ‡Úý÷/v…ò#,à†€2§v\軼°·Z‡Ä¼.xáù7ž‹>ùìÃ?üÇgþ  " –è^`ÈùЧ×3è‚bQšó¾ƒÌô]c÷`.¶É¼dq4ÏÇ€Ó¥¥„VÜ;ÿ΀ü™ð|.œÔº¿ÐF®OJw´à„Æ&ºÆ˜%ÏðG ¶"¼ñÝOgTÜåîë9ÒmÓ„º /&¦Z°€U%$d—ß‹¨iT&û¤Ó±ãÝq÷½`üwYyå'¨ËÅ·˜BØÂªŒZ{<žEH“r /zÑy¤ÚŸ…ø¬¤S½ý*<ÿàÁùÛçÏœyüÉEøŠ1L¨¢’'Ç$M÷@u ƒ Ñúé.ñ2ñjœÜšL Ï´±=v_€ÿþðáÇ—þtéï_úçÇPºZ‘X™l ŒÔ#~›¦Ì à Œ€Ó¬p,trý`6ä%Ú¼. €ôÃ[ù‘¡ùzǪ w ª-]eØâýƒ"³9€M÷ì«‹ã?pôóïfàòƒn:ùJ-®{ñ»æÙ“ˆqeÍs²ëÇ,9€.È·ŠÜÂÖÆ äXYåpˆC=³t·VÝäÏíø3 “¿³% œøŸs®ÝRN ² ‰Ÿjâg)w,Z•Ê•Œª<9€»»#hÊ*ÄÐìœHµÀDó #Ó›´ßí@÷^þÉå³{ !0Cˆéíf8²+è-ð¦G(+¢]`¹»ë«º7Þ¥Fæ{DÕ ß,þ}f›àl ´Zôâù‹Ÿœx|ooïÞ™óbS1O7[ÉA enºÇ÷u¦ ÊB»“jH<_H@¸ÁßrÏy‰ç×p8¡– Þaò÷¿ÿýþß¿øâïÿþ1¨©þ.ˆ•œWg2H‚t¯ @½HKMï‹ÌÚ\Lo:Źçd‘‹>nü0/šVÕÃÌR0¶t êà LähJ³xG€ñ¡†|½$^žÛj¿{ìåx2¸pÝ,¸нwö¼;˜ˈl˜H(A{ÀÀò üm’:Äux?ðÀaªf%Ÿ¸®«´ê“ *K6.¼U‡'®œ½5l´à¥w}ÀãΑÊ?1"J°’Ž˜ÈÀ ?Âa~)Cï×jea8õ°mN8”1TÎôÙ*€îå³WN€ÌI'Ä!Gžb’†Ü ó;ÓS†Þã4Ôˆ®¦S"2ÝÝMl°± Ý„}-Yðâ'÷n=¾È¼(VR0öÈ@8Ê@bçIMa0]M…¼Ú‚.†1=ÛÄ £a>h –fÀÅiq,D†Otvùy †#ÑJ2TROŒPs­Ãóš ’³Ú=þt¬“ÚȹØÿàšt‡µîTXåuÀ!d'dPàÚÑíÈ€Úã#tÄû?†2@nU¨39]]r­©ËÜ àvwÙŠ)îˆæçùLÂUùÂQð=OLm¶•âksйÙŸ¡êÆí_óp0[ÛæO–Gz»¡àM=v­PoO~Z„?¤³9~øgq>jù ªÃ&p%‚/Ž4jrŠtîa—œ×¥IPolã5mRUí[³§Ë—ý3‡K¥&³@rïüŸ¿|âWÜ¥Ô¤ÐT¤5>MââmžÁ’_\v‘šY‹Äí®ÏH `w"z‘M[Eiuñ ÓªZWúUyûêbvUüîÃI{4 ¼Kµë›y£µ5Мù í•›W‡š"-äuž ?5çÍŸ¿¸òLøÒÉâ# Ö>>}Ú5òÓÊ7CZk¯ÍiGFøuâ^”\ª5)ÚM@„öGå:¸†APD¯±-‚hh~‘BzxóжÝEE"º JqsêSÄ…ÀH«»¸t_Î?K¹XÀF¸-.ö´.ÕåЇUº×³i€ãÀÈÙ!!×ÙH;ϣÖÁ †Z×Ìw¤¤ÈBIÙ—²gINS¶/ݱ!xc‘Å¿ù’ä`åÞÒÖþj’Y×Ó\ʦ›Ti?ÀÌá9±@DÀ¡ !4¦iD ØêRˆ-©)°6’tGò$ nJeV¥@bR‡H†Ì Ð,ªfõ% x†¸’Œ}Oj¹­ÎÜ€ÝæÇf¹Í\+ˇÚø‚´ÀB›˜81±fO&à–¨ÀkÙc_ßòÍŸÖtjšŽ†…˜Ú¾6õÆi“Ü¥çÛOÑLF¢E9O…iø¾7ý'Ô$«Æ¦¦‡&‰`‘6Ïoˆ¿È¬™2#Ü ¢œ(מ„)€]!P×;Y€ <Õ¬ùoŒ´&£°’B†%žM ³}äÇ^’ ÚQ§–—Ãj[´ˆíÓ‚ÌôºV08Q/LÇ&Ƨ{_ÈfªéÈfHGŽiù5& ò$è' †a$JM_ÅØB–g& r„Id›ÒØSFSY1-™åßbžcÊ €ã|¤Q™Oh&‡i­H~dpë"$R@ E™u(" UYg2M1,šUŠÂ˜S7Â&sÆ7™¨µ°CɰOÜêê)!2Sª3O¨¥MMmæKز–&“œÓ6‘X.Yªï'¬¥Óɯ%“‰á „ƒãb!ªùõiŽÉ$‡4bVO,¬JdÀZAÜâÉRª-èŸf@*œBrãÑ(äN5Ïqê#™„\0Ô%hG,‡ÔàÆ;éiŒCŠüZ3Hà‹Ò!N™Âò¤&©Î]TÕ@xj!´PEŒŒª”-L3’ìPc}( Þ Æb›H&‘Œ@FµÔÎ3€üÎåf”gåÕIƒ© cÍv[RY{ ¸QPêH0-PEf3é„HK&Ï¡ *¥’Â(30w˜Ø£f~l˜~dÙ 4 T' P2o ¬Ã ‘ÀTŸÌŽ'•šPæì§Á/Fû$&tm^çf}Úó"ŒÔZ‹´ñ˜ ˜k|HnSù¼|ü~µ0†±”€ëRp¶ž‘°q»T[À> N ŸÎ3,bØ¡3žw Ì‚!ذ('<î„Õ#™¶§&pÈYµ7QftÄ'¿ã©•rû†ØQR‹Hé ¬E|€ˆŒÓÑLK6Ôc¯™öYÀæZöZüyø<ØFx¯ó›UøpÁâì—Køvˆ×`m<$ÎXµ›w~¿ ÿ®”u7¿ˆR€ÃÃM:]Œ&‹¶D]þL7aáE|eÜ›7{ÚËý¡hmx‘)^|à±¸çæ‰ÏO?2‘(¥(¿8ã-âódC‘!Í×®˜dÍ)©^¿F‡ÿGÚ1ØêÆ™ôFùÐO:ÓÙë¹õ„ß‚×å„òCÉë)Ü›ºcV1B¯ª°×FÕØk£êìµQõöÚ¨z{mT=€½6ªÀ^U`¯ª°×FÕØk£êìµQõöÚ¨ö_-.ð[§•‹÷ˆ¸°¯n®’Wùí¿¹w½V'äébõzuàŠèÑlýHR:…¿ÊSŽ Ã&5J›ÛÁƒ4­Ã§¹JË¥K‰#õ_@ zý¦uðž‹;ÀXŠ2¦5M0 gzî0Ìþ¨N¦Ú¶‚¤§ºLPY¡›¼W½×›¦5wÅ1Ö\Vϯžçž,.zçK\hFü¶Šœ±‹Û.«YÆ*bókUùã0k®eï’áøÍåuçÉkRñ»âøŽöJþ^o Ö˜'QDYI5&™XÒF’Bš‚9ZçŽXlÜBµ'îy”%É2ª”1y–cÄ+À$ùu2›ù>hœzT’ÔHãbG DVš!€ß1Kqºæúÿ^o€Ö¬ŒªXö"Û±…èÂò»fÎÇ´®½¼ö9mÜæ˜¨fÔ.×"™ù¤V)ÙHçRð›íPª”Y•Žè,‹8ž”3ÉšXµbßï|#µÆNùéTs‡“,]Ñ,˜!V™ Ä=eHákgÔª¸;›ðÛÈ@+O’& 0r§1¦Îiɶùº.t,Kª !)’!”ùé²äàÚ”¨Òó÷fê°•hÀiãN wpja“{`>S§¹û²0/j³£È’Ƶ¡bàTâ+¨YkTøbm5_´à4Ÿ„`_Rkš¦~FæÍÔ>}ǰ+!M-†ta4 êÉ–`l¦²%Æ~¨]JÄ’5³4ÙR±ÆgÌ…áKÓ:rrÉ$IòX²,é´áÀpÒD£@ÍIª'²¤¨–Æb¶Ñu¯]¯…ö艵@1B4ð<0u¶M)öøz=|»Í—è¡Z³¶(öÚŸç!­†í°—ïÑlÒ¦¶{°çQϳ$jcм‚`hµÛì´ ‘h¿ÖÏ›ªÃ~Š3ÃêaXX¼Èôz½.:@vúôa+ïþ*QðÛ½—íuPýŽ6ªÀ^U`¯ª°×FÕØk£êìµQõöÚ¨z{mT=€½6ªÀ^U`¯ª°×FÕ¸ÛØk»»=€½6§}âFÝΡÑ|×Ð3<¼(kB7ÛŸ%t¯ß–Vdª‘:A÷ >&ï¿„OS¤Ðqrè{ÛR­(Ÿš ¿6©ÊÈ\y¹‘ƒO¢Ñ¡—"iÝ3Ùk2Z¹}¶×)³µ¡{ýÆ´ß{2£òº€qh0•'un×81’ùrâ9•Ã]aB3ã#¦µË\LY¿*ˆ½rilÒ=*,è|´@[ÏÅ­i>NkßiAëÓ>ç@<µZ Ù$§ü)X†¡x D)xB*ÒŠ°%ÑBÓ4Š5ZküC][Rƒäpáàƒ¹´€<+.ØÍw¢‰þŠ5)×öS?sXƒ`—jý=%¿UÐÜ¡,[üáÒð.3M–#ì8cÖÈRƦù"`«¨­)—K–cTm„)‡H êP’ei$jjLe) #Ëš6RÁ©* ¬H¹(#§’e¨D™UVò'·ò‡V±l„F.K2s"%*°¦‰/9|``N$é–HwlJþæZ°×sé€*÷ÀÐÿ|@Æo&‡wË«)n–AÖ†X•ͧœø¸¹yvàQÕF)™9PIÈ,Ò¥7w¡K&À†)Œ$ ùø]ÃÀŽÏ×M N³nBšÍ¾V •f3%“T"YDò™„¨äQÊš§uZ xf`ˆMÉJúûM~³Zã‚§Óš_P˜àï*Gl @$³‚{g…Á¿&ãvá*ºÞ¦œO[+É©€L2mR x‘¥BÈ€z·nB©j:Ú4Lf³4²€£4‚M_Q«Pçc@¬#K›]÷úMj€©ˈÈ;ŒH:¼ÌBÄÂ~¢6.˜ §¨å"9âk:ͤ P·xaNƒw–l$ëp¶dÂü…Zž4®%Ë”4ˆ}‰ÉÒT¬CÔE>·€šd×ÄIëédF@ÆMb’/Û§!B¡@éL0l,>±éõªk@’rJgUfH˜»pfÖØ™É€7vÏB°~2 fâK1˜E’Âx‹o 1öÒ\²)IJáÌ")L8œ(Ç%© $%ÒsF1‘$|¿Ó,8Ã=9 øhÁÈt–×õxâZ!†jIŽbòÍ,ElÀ^ϧýP<Ú¾Y¯‘”àn)^±Èßb¡^&–[Ú·V"ëv4ÁÅŒãøzµX=ïbÝ€ð&KÂå‹èbNݾë͸‹7ëò€â³ˆÍG£ýé˜ß°ÿ)Ž)ÊôÅåCÀD:RÓ$éÐ%~Mctðtv¯×FOø-˜½Ð©%{Rr°óP:_l1z½bjŒû‹zmD=€½6ªÀ^U`¯ª°×FÕØk£êìµQõöÚ¨z{mT€U`¯MWU`¯Í©°×FÕØk£Ú k´éRõzc457¦‡Š£„Žiñpi29pGû¡2»«™™:“C±Ôƒ)hþQi¬híÓØ½¥4Ì#Ń-ìu)"}bMå—léþ~¶¦Z4¯Û­bf^ÓÉJ |½Z®N­¼5K{ÚŽ(ޏ­ë`ÁÍ•‹E5q/å²ìœ¬©ìA­HÒœHd,Ížã"w¦ŒžÞ·÷íK ®“ƒ-ǬñaiøO›™‹/òG™-½ü‡ÿ„»ã™ì™ìÌ'vÄÄBÍcG›'2ó‚¥ÃÁS\†KFKÕ!Qº¿,k6’qp '‹?étI––¯.g@Òð鞺ÏÊ dr2n¸óÅíÒ¹èv îü5ãWÌó¤šÖ~™_hÚm6`›5/S_$ÌŸ[7q0‹jæxªÆ™ñ°$¢‹ˆu;RQP¾\Ôyéxní–™Þíuº*0ÖØ%ƒÛbˆw ñØnC¶)u#Ü–‰ß—0"M™›W¸UŒ`l&]$žž·C 5„¶ 2Êóf]c^…ñ{jêy•ð¼7–ú4ÎR骦,óÎâ]1"uÛ‚ó”–“iz”lIm+Óö漦KÁ •yÖRQXÈïèúJª8Ñ"î.7Þ`ÝÜàËr3Tqm Õ(r4Œ¥¨MK‘å±aãPÁÌŒ¢:G ¿xjäŒv”ðÉ ;µ¬Eü1¬â·vø~ä³ Òjb>¤gX5UýHòa±¬*|¹z$òy~^<Y–¦ä$cy‘ÅW•!ÈP(U O}5Ô‡"KU(À±9Mu t/]íY5Çì´aš’!<šo˜óÃhœ*…bˆÇmÓ€'Õ"²!Ì~dÎ-°ƒ}„rYÑjM8ØPh[ô0ÄŽ™¦a’2ø£Ž(XàGØ "Òä4!Ž”òENk‹úkŒ5Éœ×Õ(øD*£"­ïP ëÇW„3Š]‚¡+híEÜðE‚b¨¢tޏfäG`6èЦ1&ƒˆòÆæ¹Wrö¡g£€Ö4 µ:ɣ𠀖G 84Y ”:ðŒ„i!§ ¯[`rƒ9s< ÚÐEIg#äâð´¥J Ü(ÔÁ‰®eŸ@¨³Š¢©Xõ€ÊØâON76 ’LBd:ÕŒX‚}9³Cl˜¾”h3‚”Úù’&å4eyŽ ~s›d"½ˆä95ˆb%1¥)áû‡(Ï#F’OG͈d&k¤aätD%«–}ˆKRªÐ©U{¤Ð<¤EÔ 0¨~ûã¶tzò÷ȉg´Ç÷D­e‡Œ´‘Á¼5Ý+%Ê‹¤ IDAT’›]ÌsÛpÌØ¨}n@‰çàË,ðøM©D™y(âGèÌ—ÌbUjÖŠIT)¾„‹lQБW KŠEý©’};"¾E#f ¨Ï2õ#ÌEa̲¤JáF±‚–‘á&Î@ň{x¥Cj&˜¼ÄüfHh Ä‚ÃЂ7¿×[Ê †ØÈ¤*RU•MT1f׺ö‡¢L[“@[`Zž4kLEK ñ™Ä:ôkñ iM4*T'/xpˆ³&¶Â,°ù`¨MÞß3ž›lÈ‹õb4<Ù:¢LˆÂ‡2 ŠŒÊ`¼YqÂ]…Ò,Ã`ð!•($+„ÈZS` {]°|]ðu”T`=^Û¶-JñÒÕ‘ÎKÉ‘&м`lHHùÂK Áv#i½B—\­Â‘µ‰ùÈ¢±€q>•TˆØÙtq`Ó=@-Ô ´;æÎ×Åð`DRñ–ä#Úyýa€]ñÂñ£™€|Àeɦª5÷Vónâân!;^`…/"lΈJD t`¸\:Qiņ˜ ]1ªDѰ¨= X1‡¯-eŽ1 N;4PªÕ^¡ÄضæÓ]H8r ³f”, i”öšÓ é<W1âP ÁH˜‡òw@lJ&£„zFæƒ÷|\ç²iÕy€iêñ i.W’ n$DÀ5 5 i’ÍBÓ’À<šæcM¬­äÜÅaâCcRc"ÛtÇ¿}…™| VH(Òvú #ËR8ÂLØ$;|œŒ&`0u_ÑÓ02¨€ÅµnJ—äàX"bù¹ .U”ó5µ0¤#Q Æ;Ì2Úõ´¦Üć¾0-S #eËLmß‚cGYN"쇵5±x×£E£:M¨¡§‰µmÌòý€JÌ E]j-š:Ô–¦¼MU ÏëO$Ý·‡ø>‚¶³ø½¨*Jü´ù­©¦´€-²›ÉÌ´6&]—XÜUÖÛÒ™óÒ¥˜WZ7ü‰„EWøyµÙ]²žÂ÷,–-ÈYæ1é%ÎF ˜ÉhÓ¦ ž|œH–!ÃæB*kâ'·øhZ £\´¿5•yD3EcÍÀžææ”g†$4ãHL e=l²@jå–- þ`¢ÓëY ŸIäà-\À˜Œa34å=ÃÃØ“”›ù˜ÑÜ›9¤£dY·¢}|¾¢Û8÷øI'TÛ9OfšÛÅ‚kˆ“{y.:ÒÔòf!P˜<—dbÛÜ•OøŒF3Eùø_èûœUÝœ£™—s¯Àß¡Ü7—cØnçšYç ŽÛi’ƒplb5ë¾å&2)/+µ„à Ó\ô¸( íYÔÐ7ó$ÉM‘<¯ÌÅ}Æ|¿9·ƒ¬‚ù¹X!Â/êV’yÚ r4þ¡ž`¯[[®sBÐÌŸÃ|‰»b(°Æ Òt ´€–7ç®{¹t€¸gå6C3hcªb'˜­iVfå0ïšZÌeÀÎóh¸)Í‹Dœ0s¾æOm m§A·jã:…ÎeM%|%(ÏËáúš(O]ˆ¢@ÊüA߈‚Äù&Þ£Sh•ªƒ;ézÀ?›ä'Ý»Na†Ó€_“COØiáa{˜½v™ÍM(˜t– ÆlOÛ†»ÌzÖ­]iù…éùĆqøðŽ%RŸ¿ìZtØYRbDÅú=EôT§á_Š¿„(O¿ŒõkqVîXJô,JåX—>yN xD½˜Ÿ•Ïäðä_Éß³_ÉB¥c> žÀ^½žO=€½6ªÀ^U`¯ª°×FÕØk³"Z`¯Í©·€½6*¬ÓÀ^›So{mTXgËö@à^½^´Z+² ©zõz92µÀL½z½ë´Õ#¤ ꣂ¨; ôÄÊAþ\ ôzµà½@skçÉÊôÌAx ç­#=IÕ@}¾z½ÚÊpoëɪôÄA¶¶À#=9õùèõj«êìµIõöÚ¨z{mT=€½6ªàÍÛ‡j¼•œ[Ú¶sãÆ™ÕPnœ<<—À×ZÏà[‘¼‘›Í[àÞ(]r[º¹ø†thf=€¯¹^€ÜYCÈI£Ùظco-íÜÙà™À7VÏàÔ:wÚ>ztÒ²ÎY·vN['O[[§%yÊwv¦ÉÍ­“d o/¿ÙxÂz´·õ8·Î€"ŽuR¶n›[7Í­ÛV>Í7¹ô¾Öz~÷$gORNHÓ’5•nÝ”Ÿ“NÞ”öDü9€·gò[JxSz´#>'ÜK§á¹-)O¤3à i+—vNKçÂ4M­ttkìlõ¾özcÀ™óµd½ÅÑžnï žnJM ¹ Œ”3·¤ü-iÚ¸àÇÒ8oéÖIaï¶´5•vréëÓÒIgöua«ðµ×±ØŒ —|kjÜ^ðä@Nì9é­\zë´ôuÈüºðÐóxR ÷$uG²v¤àœtkOºýH:Ýœï\rÁá×£ðe%?+³gL§··¤Gç¤37¥[·¥3§¥Ç ¥­pvÒHwFÑÉ­À×^O àÉYwîn/ÝIÛÔxC ÕÙ Â-É nomM‚sð9—Å©½öDô¹Û¡ on>²Nî¾ ûA·‚0Vƒ[;¡ ‚ª¨ÖT}ô>7OóÄz_w=µ¼Õ+¾i‘—ì´sR:·µ_ý/!½ž¬'¸·wrO¼ž„ÿ&žuîÜ£½­ƒ¾•ޤÉ÷©,;™„׬ù ÎF|Κbóë¬'hH7G{r†çéVáôÈRÔ|gÍoÁo½õÖä{Ò/×?úøúÇßqýúÃ_.ÀëîÖõë×/ür^w/|táÂýלÀ'xNÚÛÛÓÖ“RKÛŽóÖ£½u.x­zTöÑ¥lë£ë¿|tak÷döÑÇð9Ë~ùèû-þñaöÑî¦ x¼: À­i–·çJ£Ñ,UÖYÀuêúeëäuðÀ[»×?¾~}ë‹ ÷w·.}Á)ü裓|ïë¬'ØÌ+ÞzkçwÁÝc§);FøÆøÑQê<,fàMiÇ”Þi:š½Å,‰nðV<·04ÎílÝ’všM÷ôèÜȹ±•_È`o €Or¾½ ~rÌž–ΜᗑîÉ7Y'ø0îÿoïlz[åµ=î: (Eq”k¨C›#$ &<Êí aˆî(¡’Õ H å ´ƒ|õ»ÌKú²›¤»Ý»ìvûÎ&€—½lócÙN!ÏKÕ@[3öàèàÙ÷Èï·j €¹> à­ïÑ– G“u±Z^ŠEø@êuìó9 A[‰©áÙ³ÄèA^X/Ñ2LÔ"#t?º§¶ý„Kÿ}@rϹøÿýöÞœmùRà2[ͦõ2ö €ÓpVÙŠåÅòžï9ŸBƇûûÙ-_öG³io68Õsö/Ào­Ï{/¸.ߌ’xkIøÍõ™/¦_¾¥þ≠à·Ögø’$€ß\ò§9¤:•PªSðæ€{T€ÔŸ­¿’Ïèi¥8º8c"Œl|Öè”`ò±¤þlÿ•ü9;-08c"ŒlzÖè”À õgK(Õ©$€RJ(Õ©¾€9èpîqïéî3å§k‹üµä“Y~0zaýXbµ÷´Æ‡ã79ø›ô5¤šîëÕ¢ ö)ÏšDš*¬:Ç®ƒ*EœäP+l`Ø,ªsâ$m+!ÎTç(±ysØØa„ŸeYºM }´©üW‡ØÁôIÙ®®GõÞ…NL–*ÜË«òÙ5WJfjF.>ÔßO_@<7°™$ ¸„†Ýø'ׄް9¾ ãB É?T0Ë )Ë4KŸ³;C©sPûŠÙ8t ¥_¨I,Ö¦ƒ3Ý"sÄ>#G "ÉÁFø/“DOÙ%×`h7yµ4×0››p¸ÔgÖ“”Q¨~®Ð Eg„1³üPw|?}m§Š# 6~ÃÜ#Œæwàâ& ÔG1¦–k"˜¹ÝD¹xfe1¸¹¡4wÌ.@›QƒZÞ…ÝŽŒ¢²h7 X  eÖ®€yàÔ»ÿ”Eœ¥4ÜYJ•‚‹ B5€z®‡P%—Œú”ÍIXzT#ìƒ}ñ-õEÔpÓâ%ÌÀx[§Ùî(!×é¼ ¸æ×”iURLÇh0˜œ»Mq[³>=n÷ž,wëýzó¼O—ÆÏK<ähSé³,/œ2ú"åy/üÓõÄ7ÕPê»J(Õ©$€RJ(Õ©¾€Ÿ÷€¤Ôçéë¸ó»~t\ê×ËÏß`šž°¬¾S Þ àüä_GŸ< #õÝ”¾ @S#'¤ÄÏ{(è­Ò¦¸ÓJ}W½#^(MÎW#`Nª³Z[üÙØwDÀo®w8? `õ<ĵ¶ø3ã@ø7ë=sÀ_` Œ¹‚ÿfu ÖrVÊø7ë· Á´1:  qàùˆÎˆñ±”ꋦ*ù5úø8ÁÔ~kõZÒÉÚÕòzŸ¯7Z¼± o.ìé#ôÙæø#Õ•i ù-ð­‹ŒP‚N}Ó˜{¯§ÓÂ9òž Ûfó"ù¡4tÄÓyuªz•‚%¬ê§8Ò"ü_Õjg@FúÚMT.Ž9tãc=Ú™fpÎâ¼,ñªMV?·Vl½¹Ÿˆ;­UªÇ¡dõ8^&)cÃÄe,Ãíb©ù”¥¾†qQ?ùóâ¢ꜯ˜T(rêj]„XIDN½)ÖXP4RñnYšçAÐR‹uÈ~qq‘³‹«2gyPRDEª×Œ°¨L.²ÌEr9£©x)É‹ád9‡†”e)¾˜Êç,HË+Q$üËÅÞ: @ž³T\Á&­²€Ê­k#Ëú{д­øÇuòc±ù…ØF$-‚2Ëü¦A›§4 zùEÉj¢bµ!K“¦my9¯|Ÿ¹èFõ@2C ›>…æÌ!7_[×¹êÊŠbË´õš×.l¢ ì€1FTT™Í+ëyk]VÖA^_æ·8°‰›öCc¨–_˜¤†xUp.ž0™¢´ý_+Ãw5A£í+O …xM† ‡MûÙ×_ç!£Ü[p©xû­òº¹í…Öjþ$R^Â(J=c@±3`õ;!l`¤îž2´S e2[»Òá6ÇÕð)ô(L‰Ä¼Ù  Dñ”(âO„iƒ Zxè™§2»*–Ñ\<˜šÌ <šŒ7êW4 ©¤Ø¹X"l[Ì¡Õ[P•€I @í‚–×¼¾GTX–]7šy'"~@B˜E(Õû‚P‡$½™×pp78l‡` ÎêöÃðM5¦€y `ß…Ðb7¼kÚŸŠM´dí áÙ#€ã/ à0Ô 1ÉRlÛ·ª—> BŽ/C^ˆîB˜‡¶¸9}ñê9²D„0È:ö˜Yv¸À¶m[X ŘV2h‰>ÊB[IçG¦W>ÚPlU¢p†µ0Ôè€ÀJ¹–¹g‡îUâ‹pb…0žxÏÀ÷‡âm:Qœÿt®6ÔÐÀ×À ÖC½~›¡‚()‹ËùÀ¶õ¦Ç©X2YºíŠ÷£ ¯ˆ€7`éÍÚ.[€Œ¡¶­3QX¿ C š02‡aÛÕÏWJVi\¤Œ,l‚jêÛš›+¡~ÓV›&MûSVßÁJžØÍ ½•1Ø´V‹ €7Õ«jÐ'MoÞ÷EÁÕød‰÷¿€™þ&sª»er|통2Ò^­{“Ÿ}UèW¾æ{7þue=U$fÄ™ ³_øç$=›å'åŸZCžPð¥ô”7v\àëÙ‰äM^oלÛÖ« 'tý³Nhçž·y‡‚êE=]tžŸ‰ûsðË]˜ï»Â4¬cñPê»J(Õ©$€RJ(Õ©$€RJ(Õ©$€RJ(Õ©$€RJ(Õ©$€RJ(Õ©ŽhͯN+ÅnpÆD)ô¬Ñ)•˜|¬©?[ÇÿƒÕgÙ}ƒÉáݧ÷ëÃHýÙ’ÿÅt©nul¨“R8º?œözýç œ«“½º©·÷|_Ÿë¯xo)*Ö«}MÅçx ×˽ºçüÍ5Ú¶í_lª_©Úä^”5…V£¾‰M¾êoªn9'*á+N6³ÕLq>Õ•÷æó.ø"n6‡ê`„«â_³Uq•2YW¾ÛÔöި9n2¿(ö |(¡¿½iJP±§ñL}ZìcŽB2¦«[®îûq¿&b‚Ôõvt©îï7ñFØ<:°›Ýæ¸OÔ§ÉM +ÿ®k¢.÷O«r¿ÜïÕ ™‘ÙDþë“áí~Ôï“^s¬¬=@o5ájÏÛóÙlÿ ?ôýý}K ™Õ}´)08íïõÇŠ¶nìÉ~¤Žâå£íÂÁÅlcC¤^îÁÿ~TŒöjõÔ‘ß_-ëö£Ñþù­òU¼L È–¬TUGÎ~vo(#Uµ¥:ñc;HT9 ÖT£ö6ÉhF e6 Wd¯’8¹WG(±¡Om+‰q¿!p¤ò5¿Ÿmä4Íñg%B¨ìD¿ È ƒ«8F…ºM€Ô7.g³Ø$âJÕÙpq?B8œ©‚­iõ$\°™ÄØ¿%¦:º4Vêì&Nö}>ãmÆ„l„ŒzÊt³c³þ7†iôû†aïUÁ­‡¦JO¡{—{}¢b2RqÒßM@uJÄÕ®" ðO6«í,AüPÛ“-Âñfã<°7Õ¦¯HÄ—¨þn—e|‰fÏFíë-›Kñ5låßé©6/÷¸Ž€›¸{¯Uqµ7…`¨Ž€£.u]§÷îoê ¹¾ *´U¢mîû¡°¯Ìfd©´é"ªKÝÁN_Õpà*Ö‘úd2´_qã·t‰²†8Ž6€ÊÂ\5½Üø$MÒ85ÇÏ/ðϸtê{þ€#½¾ç\ý"EÀÝÜx?ƒ:(úb²É+Á-L366iºp+>{Kuz['â^smÎDAõî÷êåSo§â‡‹‹Š& ²%ÉØ´þÕízæ«OÇL\¨a{¤ÆÏ\ÇÂÿà xÚ¬&И‰ˆ<ý8nz}£TÖ¿#~ ºZ üWåìýÉv]&› 8[½˜þ΃³åmuf¢¿ ÒWÃͲcµºG¢9½e“,ÚO}ðßÈ÷³Pôî7¡žø§rWx9«;ª­¡¸ퟬ~˜‚4úi'S˜g×9_p£U9úÅúµélD¦ë¾êo·}ubŠäêLŒë°©øY¯a=pKö#]³Þ®¡ËaަªÐºU„è×DD@mÚ¬OF†Ê.GêÆ[®`Õ0Ñ×eY[¯kGPìÃÌ®< Á¯^“©˜µÇ-€Ës;ó§Êvãl×p¥¶ë&€Lùz½ Å›ˆŠîápÔç#½©ÄjµîUþëýê­·PSῺÄû˵½ð©§p}«>Á“õRo*º^+ÍUÒ—ë‡'n—þz‹ŽDÓíýlŸ€ÿ‘>½l†`u±èam}°³2aA5ƒˆÛƒŠ>‚×k²†ilÔ?£…*·Ð¬Ëõºé¨‡6'#m}yû²ý­~@qˆ‘èè|/š¸îýbÅH÷0«Æ»>,Ðú·ÀžËï›q§žY÷¶*^/Û¬û-î{þ Î`I¸íÑì¶Wš£íä¶.v?kN´ ä*š<ˆ{âr̶ÛÖz/z¯Úé=;(V=„”[±Ö…,UÆæÔîaÙzbJ°l`sÛz9¤²„ŠŠVmG31uo’{ÛIí_ ¦›‰¸×jÿUÑ“[1™ïÕžªè+Fõ&ïöZìߊFmÛ“£[±Û.I`赡P ÆIDAT^'¢¶XCƒáVTôIEGõ·ûÛÍí¾Z 몢‡9œªë?ÙTu¼mZµvëÆÿ^íj×íoôžEȬúŠá€žh&Á¿ÀWD?zyNÿ ¿ï¨™Ð‹ÃsKÌOÓ{¬¿t:`ŸãÏðù× í¹¹ûŽÚè———þãåœÂáåôD†OÕ;œí›œG$E’ ^É¿„HÒ;„ÕRóøŒ?%J}ý4€{EñÃsÀ™S¥J¥Þ¤Ÿ€£ÑèÔ÷€^4ÅK¥Né‹ü)Nê»J(Õ©$€RJ(Õ©$€RJ(Õ©$€Rê(€7ç¼ Àžû)•Ø—~g¦çô“4Çùy£Ó^Ø ú³%œHª[ðÿOJê÷ë?'ü”ÔoÖ)ÿy’úÍúÏ ÿ§ëÉÔ÷—PªSI¥:•PªSI¥:•PªSPIį$Uþ>¯^ix6â"8œE¨úˆÉ kªÓgÇÆâyò“ê°±’#^¯ê”r¤jʾÐa3F…['ð6é#õ€9:u´w9å )§7ÙS­À]ùÂ<çÏÝg5 †û–›¹{Ä­Ò|’Cyö‚ ¬>„Ú8qª#ʘ+ ôò^úÕ: Cóã¹ç=>K`>\))&4Ñëöyª´ÄzÜ*Ÿ+k‹/Q‹8…æÕû"j2†yQ10ˆNz–úz €s„LÍÒŒáºæb3Ží¹±6\&j‰¢ ÓGQˆ¼‚àYš©'7x焱¡ÂC 2³*¤˜@BɈmø…ƒŠ™²‘ðÚ!×Èö†%¶ãĉD'¬¡±aãX»S ë8ös|­%ÅvîØè·Üˆ"tu0QˆðN‹ã¡ðŸ(È7-q #'^ÕüÈðEp©×ÝÑÇau&rþÝzS$ÛÈìhé€Ð€¬œiõt ÙyŽÑ FwEsÄwˆºˆYÈâÏK¬Ø0hfY]vR‡¢rŒ³K-K ˆ‡Èo=„y€/fš¹yå_Áˆc´OíRð;†zó¹à¸¬&‡7Hxð ¨st„C§ön}4R —õìµôP(>ͨ:¤z}Ú®ü²¥œþv½@¸žò ¸f €‘S¤-€Cy)S:®¹n$@0SÐBÄ©@ ð?Ø©¶6:F±Æžè:…i5Ѥb¬LP‘Ê?*0Ù-Q¢-Œî„å@ªAš–Få‡p}Jx¯*£Ôc7Ì!«€Ø.c•©ß¨³ÎáÂ?h0‡B€€È©FÐe ˜¸™£!%†Ò±€*µÀ²Æ¤‚±Xó][(Xˆ ¹±Gxððl^ ±n°ª‰,è N3 Apã$J†VꪩœËE  U^"À‘±¨0w­R¿¥È±U­=Ì _ Y½0¾sn<£ïª@m pàätyj^)õQÐ. Ø ¤ÛÈ3•$Œ‡™Äx#±l âò$Šs¡äº2… X.>;d,PHu˜*ÆLˆ3õz¡¬&lf’õÕ"²!ã91B%ÒÂpAœÒâ*(!á†Ä*°4œkŠïÄT)ƒë¸š‹j¢I?à¡Ýk…¼M‰vø‚Ž'-9*އ×.>P PJä úçè'ÿ÷Y—N"ò·Hþ-XªSI¥:•PªSðŸÿJIýfP¾–)õÛuüµÌÿþ#%õ z@÷¢ë¹Ô_£Á+fŠ.%õ9²_‚3)©ÏÒ>W@©N%”êT@©N%”êT@©N%”êT@©NuÀAèôê›B—D!ÈÈ΋^+!S*»hñ¢`=îvJhÁ¾9t9”!—úA¯˜7Q˜b×C=pÝ"p#4|½ˆFÏNfd`d8„Œ®cE×®kK¥~Ð1ï2×Ï"o<’@¢»Àµvd¸,DD‹Lë&»[Xæân¸›;÷ÚŒ¢áîÎÌÌÁu(ïô,Ë~–é¾È4P$€R?èÈ< õ(b¢8¥(†ãíL”)ÈXÄÚevašb÷Ò‰¢ÂG:Œ´‰žâ+è†hUè¼t `’ÂʸåUã0ï¤R¶Ž.BƉw‚ €zäyÀ!Bèf· `\Ãî8ŽÆa [‘8Af”(€TQ@6F› Ptqu«‹öIýá: çfY0•€ƒ,s@˜Ññ Èj-/“„ãóì» À °* vw» ÙvC¦¸›JýÙ:6´³±S¢fþ8g¸Êx ïLd vw¹»±Ü0Ì2ø¦nÞùA±³ c!–ÅA0€Ý rËÍ<"¿è‘úQGÔ†q1άÂC7Žãˆ1µþ¼v|×Í´Æ\ÏÑ]—Üì”$Ô½0+ŠW8;Q´„ZQX_0úî`˜…°4±ä(,õBG†à"˜ø€ „±jH­>31ï`ëÖ»blÄÃ…®°‡âH¤Âé@m‰™ €R¯èô_B²ùŸ^%©¿Igþ×D?)©ß$ù·`©N%”êT@©N%”êT@©N%”êT@©N%”êT@©N%”êT@©N%”êT@©N%”êT@©N%”êT@©N%”êT@©N%”êT@©Nõ@)©Ô(%Õ‘jS)©.$”êT@©NõÀtZ!©¿KÏd…i^‡»yš3G°§éÕUÞm¥¾­‚^Wiê&,'IxÁ’ë$Ù¥¥ŸÜÌ»­¦Ô7•[¾ s¨7dw MLéWü‚ÝÖSê{*+_Á-€ažæ1uà@gIÆf·•ú–Ú•ev@­ –çr–úårÿý×ý1Ò«ÜÓ‰˜«5êA>Øu[U©o¨LÄ¿VÁÈ0 HìG¬`°™g~uFJêWÊ-ËÝ¿ÿ¾‚SvUé’ç°½;;”Ô¯À·{e–’ú‰ñWÄ?  T‚ñ‚Ÿ+v%€RŸ® L³Ó¬Þ$€R "à]¤]?”(õw*(ÇåU„ &JIu þ¹aw'Ç`©Ntáæ ¦cKJª 0ÆÿÚ³ÊDm´ù—IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/util-guide/filelinks-app.html0000644000175000017500000002027112007570302022342 0ustar renerene Appendix B. HyperSQL File Links

                  Appendix B. HyperSQL File Links

                  HyperSQL Files referred to in this Guide

                  HyperSQL files referred to in the text may be retrieved from the canonical HyperSQL documentation site, http://hsqldb.org/doc/2.0, or from the same location you are reading this page from.

                  [Note]Note

                  If you are reading this document with a standalone PDF reader, only the http://hsqldb.org/doc/2.0/... links will function.


                  $Revision: 4904 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/util-guide/dbm-chapt.html0000644000175000017500000004260512007570302021450 0ustar renerene Chapter 3. Database Manager

                  Chapter 3. Database Manager

                  Fred Toussi

                  The HSQL Development Group

                  Blaine Simpson

                  The HSQL Development Group

                  $Revision: 4904 $

                  2012-08-06 00:15:58+0100

                  Brief Introduction

                  The Database Manager tool is a simple GUI database query tool with a tree display of the tables. Both AWT and SWING versions of the tool are available and work almost identically. The AWT version class name is org.hsqldb.util.DatabaseManager; the SWING version, org.hsqldb.util.DatabaseManagerSwing. The SWING version has more refinements than the AWT version.

                  The AWT version of the database manager can be deployed as an applet in a browser. A demo HTML file with an embedded Database Manager is included in the /demo directory.

                  When the Database Manager is started, a dialogue allows you to enter the JDBC driver, URL, user and password for the new connection. A drop-down box, Type, offers preset values for JDBC driver and URL for most popular database engines, including HSQLDB. Once you have selected an item from this drop-down box, you should edit the URL to specify the details of the database or any additional properties to pass. You should also enter the username and password before clicking on the OK button.

                  The connection dialogue allows you to save the settings for the connection you are about to make. You can then access the connection in future sessions. To save a connection setting, enter a name in the Setting Name box before clicking on the OK button. Next time the connection dialogue is displayed, the drop-down box labelled Recent will include the name for all the saved connection settings. When you select a name, the individual settings are displayed in the appropriate boxes.

                  The small Clr button next to the drop-down box allows you to clear all the saved settings. If you want to modify an existing setting, first select it from the drop-down box then modify any of the text boxes before making the connection. The modified values will be saved.

                  Most SWING menu items have context-sensitive tool tip help text which will appear if you hold the mouse cursor still over the desired menu item. (Assuming that you don't turn Tooltips off under the Help menu.

                  The database object tree in the SWING version allows you to right click on the name of a table or column and choose from common SQL statements for the object, for example SELECT * FROM thistable ... If you click on one of the given choices, the sample statement is copied to the command window, where you can modify and complete it.

                  The DatabaseManagers do work with HSQLDB servers serving TLS-encrypted JDBC data. See the TLS section of the Listeners chapter of the HyperSQL User Guide

                  [Tip]Tip

                  If you are using DatabaseManagerSwing with Oracle, you will want to make sure that Show row counts and Show row counts are both off before connecting to the database. You may also want to turn off Auto tree-update, as described in the next section.

                  Auto tree-update

                  By default, the object tree in the left panel is refreshed when you execute DDL which may update those objects. If you are on a slow network or performance-challenged PC, use the view / Auto-refresh tree menu item to turn it off. You will then need to use the viewRefresh tree menu item every time that you want to refresh the tree.

                  [Note]Note

                  Auto-refresh tree does not automatically show all updates to database objects, it only refreshes when you submit DDL which may update database objects. (This behavior is a compromise between utility and performance).

                  Automatic Connection

                  You can use command-line switches to supply connection information. If you use these switch(es), then the connection dialog window will be skipped and a JDBC connection will be established immediately. Assuming that the hsqldb.jar (or an alternative jar) are in your CLASSPATH, this command will list the available command-line options.

                      java org.hsqldb.util.DatabaseManagerSwing --help

                  It's convenient to skip the connection dialog window if you always work with the same database account.

                  [Warning]Warning

                  Use of the --password switch is not secure. Everything typed on command-lines is generally available to other users on the computer. The problem is compounded if you use a network connection to obtain your command line. The RC File section explains how you can set up automatic connections without supplying a password on the command line.

                  RC File

                  You can skip the connection dialog window securely by putting the connection information into an RC file and then using the --urlid switch to DatabaseManager or DatabaseManagerSwing. This strategy is great for adding launch menu items and/or launch icons to your desktop. You can set up one icon for each of the database accounts which you regularly use.

                  The default location for the RC file is dbmanager.rc in your home directory. The RC File Authentication Setup section explains how to put the connection information into this text file. If you also run SqlTool, then you can share the RC file with SqlTool by using a sym-link (if your operating system supports sym links), or by using the --rcfile switch for either SqlTool or DatabaseManagerSwing.

                  [Warning]Warning

                  Use your operating system facilities to prevent others from reading your RC file, since it contains passwords.

                  To set up launch items/icons, first experiment on your command line to find exactly what command works. For example,

                  java -cp /path/to/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing --urlid mem

                  Then, use your window manager to add an item that runs this command.

                  Using the current DatabaseManagers with an older HSQLDB distribution.

                  This procedure will allow users of a legacy version of HSQLDB to use all of the new features of the DatabaseManagers. You will also get the new version of the SqlTool! This procedure works for distros going back to 1.7.3.3 at least, probably much farther.

                  These instructions assume that you are capable of running an Ant build. See the Building Appendix of the HyperSQL User Guide.

                  1. Download and extract a current HSQLDB distribution. If you don't want to use the source code, documentation, etc., you can use a temporary directory and remove it afterwards.

                  2. Cd to the build directory under the root directory where you extracted the distribution to.

                  3. Run ant hsqldbutil.

                  4. If you're going to wipe out the build directory, copy hsqldbutil.jar to a safe location first.

                  5. For now on, whenever you are going to run DatabaseManager*, make sure that you have this hsqldbutil.jar as the first item in your CLASSPATH.

                  Here's a UNIX example where somebody wants to use the new DatabaseManagerSwing with their older HSQLDB database, as well as with Postgresql and a local application.

                  CLASSPATH=/path/to/hsqldbutil.jar:/home/bob/myapp/classes:/usr/local/lib/pg.jdbc3.jar
                  export CLASSPATH
                  java org.hsqldb.util.DatabaseManagerSwing --urlid urlid

                  DatabaseManagerSwing as an Applet

                  DatabaseManagerSwing is also an applet. You can use it in HTML, JSPs, etc. Be aware that in Applet mode, actions to load or save local files will be disabled, and attempts to access any server other than the HTML-serving-host will fail.

                  Since the Applet can not store or load locally saved preferences, the only way to have persistent preference settings is by using Applet parameters.

                  DatabaseManagerSwing Applet Parameters

                  jdbcUrl

                  URL of a data source to auto-connect to. String value.

                  jdbcDriver

                  URL of a data source to auto-connect to. String value. Defaults to org.hsqldb.driver.JDBCDriver.

                  jdbcUser

                  User name for data source to auto-connect to. String value.

                  jdbcPassword

                  Password for data source to auto-connect to. String value. Defaults to zero-length string.

                  schemaFilter

                  Display only object from this schema in the object navigator. String value.

                  laf

                  Look-and-feel. String value.

                  loadSampleData

                  Auto-load sample data. Boolean value. Defaults to false.

                  autoRefresh

                  Auto-refresh the object navigator when DDL modifications detected in user SQL commands. Boolean value. Defaults to true.

                  showRowCounts

                  Show number of rows in each table in the object navigator. Boolean value. Defaults to false.

                  showSysTables

                  Show system tables in the object navigator. Boolean value. Defaults to false.

                  showSchemas

                  Show object names like schema.name in object navigator. Boolean value. Defaults to true.

                  resultGrid

                  Show query results in Gui grid (as opposed to in plain text). Boolean value. Defaults to true.

                  showToolTips

                  Show help hover-text. Boolean value. Defaults to true.

                  $Revision: 4904 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/util-guide/sqltool-chapt.html0000644000175000017500000115620712007570422022413 0ustar renerene Chapter 1. SqlTool

                  Chapter 1. SqlTool

                  SqlTool Manual

                  Blaine Simpson

                  HSQL Development Group

                  $Revision: 4940 $

                  2012-08-06 00:15:58+0100

                  Try It

                  If you know how to type in a Java command at your shell command line, and you know at least the most basic SQL commands, then you know enough to benefit from SqlTool. You can play with Java system properties, PL variables, math, and other things by just executing this sqltool-2.2.6.jar file. But SqlTool was made for JDBC, so you should download HyperSQL to have SqlTool automatically connect to a fully functional, pure Java database; or obtain a JDBC driver for any other SQL database that you have an account in.

                  If HyperSQL's hsqldb.jar resides in the same directory as the SqlTool jar file, then you can connect up to a HyperSQL instance from SqlTool just by specifying the JDBC URL, root account user name of SA and empty password, with the \j command. See the Switching Data Sources section below for details about \j.

                  Purpose, Coverage, Changes in Behavior

                  [Note]Note

                  Due to many important improvements to SqlTool, both in terms of stability and features, all users of SqlTool are advised to use the latest version of SqlTool, even if your database instances run with an older HSQLDB version. How to do this is documented in the Accessing older HSQLDB Databases with SqlTool section below.

                  This document explains how to use SqlTool, the main purpose of which is to read your SQL text file or stdin, and execute the SQL commands therein against a JDBC database. There are also a great number of features to facilitate both interactive use and automation. The following paragraphs explain in a general way why SqlTool is better than any existing tool for text-mode interactive SQL work, and for automated SQL tasks. Two important benefits which SqlTool shares with other pure Java JDBC tools is that users can use a consistent interface and syntax to interact with a huge variety of databases-- any database which supports JDBC; plus the tool itself runs on any Java platform. Instead of using isql for Sybase, psql for Postgresql, Sql*plus for Oracle, etc., you can use SqlTool for all of them. As far as I know, SqlTool is the only production-ready, pure Java, command-line, generic JDBC client. Several databases come with a command-line client with limited JDBC abilities (usually designed for use with just their specific database).

                  [Important]Use the In-Program Help!

                  The SqlTool commands and settings are intuitive once you are familiar with the usage idioms. This Guide does not attempt to list every SqlTool command and option available. When you want to know what SqlTool commands or options are available for a specific purpose, you need to list the commands of the appropriate type with the relevant "?" command. For example, as explained below, to see all Special commands, you would run \?; and to see all DSV export options, you run \x?.

                  SqlTool is purposefully not a Gui tool like Toad or DatabaseManager. There are many use cases where a Gui SQL tool would be better. Where automation is involved in any way, you really need a text client to at least test things properly and usually to prototype and try things out. A command-line tool is really better for executing SQL scripts, any form of automation, direct-to-file fetching, and remote client usage. To clarify this last, if you have to do your SQL client work on a work server on the other side of a VPN connection, you will quickly appreciate the speed difference between text data transmission and graphical data transmission, even if using VNC or Remote Console. Another case would be where you are doing some repetitive or very structured work where variables or language features would be useful. Gui proponents may disagree with me, but scripting (of any sort) is more efficient than repetitive copy & pasting with a Gui editor. SqlTool starts up very quickly, and it takes up a tiny fraction of the RAM required to run a comparably complex Gui like Toad.

                  SqlTool is superior for interactive use because over many years it has evolved lots of features proven to be efficient for day-to-day use. Four concise in-program help commands (\?, :?, *? and /?) list all available commands of the corresponding type. SqlTool doesn't support up-arrow or other OOB escapes (due to basic Java I/O limitations), but it more than makes up for this limitation with macros, user variables, command-line history and recall, and command-line editing with extended Perl/Java regular expressions. The \d commands deliver JDBC metadata information as consistently as possible (in several cases, database-specific work-arounds are used to obtain the underlying data even though the database doesn't provide metadata according to the JDBC specs). Unlike server-side language features, the same feature set works for any database server. Database access details may be supplied on the command line, but day-to-day users will want to centralize JDBC connection details into a single, protected RC file. You can put connection details (username, password, URL, and other optional settings) for scores of target databases into your RC file, then connect to any of them whenever you want by just giving SqlTool the ID ("urlid") for that database. When you Execute SqlTool interactively, it behaves by default exactly as you would want it to. If errors occur, you are given specific error messages and you can decide whether to roll back your session. You can easily change this behavior to auto-commit, exit-upon-error, etc., for the current session or for all interactive invocations. You can import or export delimiter-separated-value files. If you need to run a specific statement repeatedly, perhaps changing the WHERE clause each time, it is very simple to define a macro.

                  When you Execute SqlTool with a SQL script, it also behaves by default exactly as you would want it to. If any error is encountered, the connection will be rolled back, then SqlTool will exit with an error exit value. If you wish, you can detect and handle error (or other) conditions yourself. For scripts expected to produce errors (like many scripts provided by database vendors), you can have SqlTool continue-upon-error. For SQL script-writers, you will have access to portable scripting features which you've had to live without until now. You can use variables set on the command line or in your script. You can handle specific errors based on the output of SQL commands or of your variables. You can chain SQL scripts, invoke external programs, dump data to files, use prepared statements, Finally, you have a procedural language with if, foreach, while, continue, and break statements.

                  Platforms and SqlTool versions covered

                  SqlTool runs on any Java 1.5 or later platform. I know that SqlTool works well with Sun and OpenJDK JVMs. I haven't run other vendors' JVMs in years (IBM, JRockit, etc.). As my use with OpenJDK proves that I don't depend on Sun-specific classes, I expect it to work well with other (1.5-compatible) Java implementations.

                  SqlTool no longer writes any files without being explicitly instructed to. Therefore, it should work fine on read-only systems, and you'll never have orphaned temp files left around.

                  The command-line examples in this chapter work as given on all platforms (if you substitute in a normalized path in place of $HSQLDB_HOME), except where noted otherwise. When doing any significant command-line work on Windows (especially shell scripting), you're better off to completely avoid paths with spaces or funny characters. If you can't avoid it, use double-quotes and expect problems. As with any Java program, file or directory paths on the command line after "java" can use forward slashes instead of back slashes (this goes for System properties and the CLASSPATH variable too). I use forward slashes because they can be used consistently, and I don't have to contort my fingers to type them :).

                  If you are using SqlTool from a HyperSQL distribution of version 2.2.5 or earlier, you should use the documentation with that distribution, because this manual documents many new features, several significant changes to interactive-only commands, and a few changes effecting backwards-compatibility (see next section about that). This document is now updated for the current versions of SqlTool and SqlFile at the time I am writing this (versions 4720 and 4863 correspondingly-- SqlFile is the class which actually processes the SQL content for SqlTool). Therefore, if you are using a version of SqlTool or SqlFile that is more than a couple revisions greater, you should find a newer version of this document. (The imprecision is due to content-independent revision increments at build time, and the likelihood of one or two behavior-independent bug fixes after public releases). The startup banner will report both versions when you run SqlTool interactively. (Dotted version numbers of SqlTool and SqlFile definitely indicate ancient versions).

                  This guide covers SqlTool as bundled with HSQLDB after 2.2.5. [1]

                  Recent Functional Changes

                  This section lists changes to SqlTool since the last major release of HSQLDB which may effect the portability of SQL scripts. For this revision of this document, this list consists of script-impacting changes made to SqlTool after the final 2.0.0 HyperSQL release.

                  • SqlTool always has treated unset PL variables equal to null-valued variables, and this is not changing. There is no distinction between unset and null-valued. But before revision 4423 (i.e. pre-HyperSQL 2.2.6), SqlTool almost always treated variable value of empty String (i.e. what is between these two quotes: "") as equivalent to null/unset. The most common case where a user would see this was in the command to unset a PL variable: * VARNAME =. Though your command says to assign the value of the empty string to VARNAME, varname would unset it instead (which latter is equivalent to assigning null to it).

                    SqlTool achieves several new benefits by purposefully assigning the empty string for some purposes, and distinctly unsetting for other purposes. One example of this is the new consistent and robust handling of the PL variable ?. Now, when ? is unset (aka null), it always mean that the last SQL command failed. If this variable has the value of the empty string, it means that the last cell returned had value of the empty string, or the ? was reset (for example due to SqlTool startup).

                    When you run SqlTool interactively, you will see warnings about setting PL variables to nothing. If you don't do anything involving assignment or testing of unset or empty variables, then skip this item and ignore the new warnings. In an upcoming release, by default, setting a PL variable to nothing, like * name = Bruno will no longer unset/remove the variable but will instead assign an empty-string value. There are important use cases for empty-string values. In new scripts and interactively, from now on you should use the new PL command "* - VARNAME" if you really want to unset a variable. If you do not set Java system property 'sqltool.REMOVE_EMPTY_VARS', everything behaves just like before (except that you will be able to use the new * - VARNAME command), but you will get the warnings. But if you do anything involving assignment or testing of unset or empty variables, you need to set this property.

                    For legacy scripts, you should set 'sqltool.REMOVE_EMPTY_VARS' to true to quiet the messages, retaining the old behavior and protecting from the behavior change in the future. For maintained or new scripts, set the value of the property to false, and only use "* - VARNAME" to unset variables.

                    sqltool.REMOVE_EMPTY_VARS only effects the assignment operation * VARNAME =. Regardless of this setting, SqlTool itself will assign some SqlTool PL variables to the empty string and to null, and _ will assign nulls if the next call value retrieve is null, variables which have never been set will be equal to null, and you can use command line parameters -P or --setVar to assign PL variables to the empty String. (For example "java -jar .../sqltool.jar -Pvarname= urlid script.sql").

                  • DSV input now accepts JDBC Timestamp format with date and optionally time of day.
                  • The simplest PL command, just "*", has been deprecated. It is now useless since the only time where variables are not expanded are in SQL commands if no user variable has been set. Since you obviously must set at least one variable value if you intend for variable substitution to succeed, the purpose of the old * command is satisfied intuitively and automatically now. (That purpose being to prevent modification of SQL text without the operator's knowledge).
                  • The * command (just plain "*") has been removed because it is no longer necessary. (See item on it in the previous section of this manual).
                  • Bugs in variable scoping have been fixed. All variables are global and shared among auto.sql, all command-line and nested SQL scripts, and interactive shells.
                  • A bug has been fixed so that SqlTool system PL variables (with names starting with "*") are now honored no matter how or where the variable value was set.
                  • Variables with non-alpha-numerical characters, and those beginning with digits have been deprecated but are still supported for now.
                  • The data (and just the data) of HTML reports has remained the same, but the whole system has been drastically modernized and enhanced. You may notice new special command \pr. This is a \p variant applicable only to HTML mode, telling SqlTool to treat the expression as Raw, so the author can type in HTML, JavaScript or other text not to be formatted. HTML model also gets its own *NULL_REP_HTML setting distinct from *NULL_REP_TOKEN.
                  • For consistency, the \H toggle switch has been superseded with \h true|false> The old variants are still supported.
                  • Command /= name :... has been superseded by the more consistent (with our other commands) /: name.... The old variant is still supported.
                  • Removed support for SqlTool system PL variable names deprecated years ago.
                  • Idiosyncratic * option to \m is no longer necessary (though still supported). SqlTool system variable *DSV_SKIP_PREFIX may now be set to the empty string to indicate no skipping.
                  • Import reject report files were being retained on Windows, even when there were not rejected records. This bug has been fixed.
                  • PL variables *NULL and NULL are reserved and may be referenced but not assigned to.
                  • The special PL variable ? is now updated rigorously. It will be null only if the last SQL command that was run failed.
                  • The special PL variable ? is now listed in the output of * list and * listvalues commands. (Unless at the time it is unset/null, of course, and in this case the absence of ? indicates that it is unset.
                  • The look of DSV import reject reports has changed, and the name of user-supplied (optional) CSS file has been changed. (See following section about why).
                  • The \d tableLikeObject command output now has 2 more columns, to report precision and scale.

                  New Features

                  Since 2.0.0 final

                  To reduce duplication, new features are listed in the Recent Functional Changes section are not repeated here, so check that list too.

                  • You can (and if you use nested scripts, you probably should) prefix relative paths given inside of SqlTool with @/. This makes them relative to the parent script directory instead of to the invocation current directory.
                  • More accepting of dates and times in DSV imports.
                  • CSV exporting and importing with double-quote delimiting and escaping.
                  • New "* - VARNAME" PL command added to explicitly unset/remove a variable. Definitely read the first item in the Recent Functional Changes section.
                  • Added integer math feature very similar to that of Bash and Korn shells.
                  • Added some new logical operators
                  • Added new : variant for exporting (\x and \xq), which uses a query from the edit buffer. This provides direct support for exports using long, multi-line queries.
                  • SqlTool functions have been implemented. These are just / macros which take positional parameters. They can be distinguished from regular macros by having name like this(), and being invoked like this(with, parameters).
                  • We have provided multiple ways to accommodate command-line inlineRcs and variable assignments where the values contain commas, and generally added flexibility to the latter. In both cases, commas may be escaped with the backslash character. New switch -p (also usable as -P) is provided as an easier way to eliminate the delimiter issue.
                  • Multiple --sql, -p, and -P arguments to SqlTool are now honored, and they are evaluated in specified order.
                  • Added automatically-assigned SqlTool system PL variables *START_TIME and *REVISION.
                  • Added optional SqlTool system PL variable *TIMESTAMP_FORMAT, which, when set causes new SqlTool system PL variable *TIMESTAMP to be automatically set to the time when this (latter) variable is referenced. Unlike *START_TIME, the *TIMESTAMP_FORMAT + *TIMESTAMP combination allows the user to specify exactly how to display the time and/or date.
                  • The DSV import reject report has been refactored to use the same templating and substitution used by the new HTML reports.
                  • The SqlTool unit test system has been ported from Bash to Groovy wrapped by Gradle. The system requirements have thereby been reduced from requiring a Bash shell to just requiring a Java 6 JRE.
                  • Added an inline/shortcut *if syntax like this: * if (*x == *b) \p Any 1-lne statement. People who value conciseness, like myself, will appreciate this.
                  • Added * else statement to accompany * if statement.
                  • Added traditional mathematical * if statement. Run *? to see syntax.
                  • Added iteration over query result set rows with loop statement * forrows.
                  • Added statement * return as a more intuitive alias for * break file.

                  The Bare Minimum

                  The Bare Minimum You Need to Know to Run SqlTool

                  [Warning]Warning

                  If you are using an Oracle database server, it will commit your current transaction if you cleanly disconnect, regardless of whether you have set auto-commit or not. This will occur if you exit SqlTool (or any other client) in the normal way (as opposed to killing the process or using Ctrl-C, etc.). This is mentioned in this section only for brevity, so I don't need to mention it in the main text in the many places where auto-commit is discussed. This behavior has nothing to do with SqlTool. It is a quirk of Oracle.

                  If you want to use SqlTool, then you either have an SQL text file, or you want to interactively type in SQL commands. If neither case applies to you, then you are probably looking at the wrong program.

                  Procedure 1.1. To run SqlTool...

                  1. Copy the file sample/sqltool.rc [1] of your HyperSQL distribution to your home directory and secure access to it if your computer is accessible to anybody else (most likely from the network). This file will work as-is for a Memory Only database instance; or if your target is a HyperSQL Server running on your local computer with default settings and the password for the "SA" account is blank (the SA password is blank when new HyperSQL database instances are created). Edit the file if you need to change the target Server URL, username, password, character set, JDBC driver, or TLS trust store as documented in the RC File Authentication Setup section. You could, alternatively, use the --inlineRc command-line switch or the \j special command to connect up to a data source, as documented below.

                  2. Find out where your sqltool.jar file resides. It typically resides at HSQLDB_HOME/lib/sqltool.jar where HSQLDB_HOME is the "hsqldb" directory inside the root level of your HyperSQL software installation. (For example, if you extract hsqldb-9.1.0.zip into c:\temp, your HSQLDB_HOME would be c:/temp/hsqldb-9.1.0/hsqldb. Your file may also have a version label in the file name, like sqltool-1.2.3.4.jar. The forward slashes work just fine on Windows). For this reason, I'm going to use "$HSQLDB_HOME/lib/sqltool.jar" as the path to sqltool.jar for my examples, but understand that you need to use the actual path to your own sqltool.jar file. (Unix users may set a real env. variable if they wish, in which case the examples may be used verbatim; Window users may do the same, but will need to dereference the variables like %THIS% instead of like $THIS).

                    [Warning]Warning

                    My examples assume there are no spaces or funky characters in your file paths. This avoids bugs with the Windows cmd shell and makes for simpler syntax all-around. If you insist on using directories with spaces or shell metacharacters (including standard Windows home directories like C:\Documents and Settings\blaine), you will need to double-quote arguments containing these paths. (On UNIX you can alternatively use single-quotes to avoid variable dereferencing at the same time).

                  3. If you are just starting with SqlTool, you are best off running your SqlTool command from a shell command-line (as opposed to by using icons or the Windows' Start/Run... or Start/Start Search). This way, you will be sure to see error messages if you type the command wrong or if SqlTool can't start up for some reason. On recent versions of Windows, you can get a shell by running cmd from Start/Run... or Start/Start Search). On UNIX or Linux, any real or virtual terminal will work.

                    On your shell command line, run

                        java -jar $HSQLDB_HOME/lib/sqltool.jar --help

                    to see what command-line arguments are available. Note that you don't need to worry about setting the CLASSPATH when you use the -jar switch to java.

                    To run SqlTool without a JDBC connection, run

                        java -jar $HSQLDB_HOME/lib/sqltool.jar

                    You won't be able to execute any SQL, but you can play with the SqlTool interface (including using PL features).

                    To execute SQL, you'll need the classes for the target database's JDBC driver (and database engine classes for in-process databases). As this section is titled The Bare Minimum, I'll just say that if you are running SqlTool from a HyperSQL product installation, you are all set to connect to any kind of HyperSQL database. This is because SqlTool will look for the file hsqldb.jar in the same directory as sqltool.jar, and that file contains all of the needed classes. (SqlTool supports all JDBC databases and does not require a HyperSQL installation, but these cases would take us beyond the bare minimum). So, with hsqldb.jar in place, you can run commands like

                        java -jar $HSQLDB_HOME/lib/sqltool.jar mem

                    for interactive use, or

                        java -jar $HSQLDB_HOME/lib/sqltool.jar --sql="SQL statement;" mem

                    or

                         java -jar $HSQLDB_HOME/lib/sqltool.jar mem filepath1.sql...

                    where mem is an urlid, and the following arguments are paths to text SQL files. For the filepaths, you can use whatever wildcards your operating system shell supports.

                    The urlid mem in these commands is a key into your RC file, as explained in the RC File Authentication Setup section. Since this is a mem: type catalog, you can use SqlTool with this urlid immediately with no database setup whatsoever (however, you can't persist any changes that you make to this database). The sample sqltool.rc file also defines the urlid "localhost-sa" for a local HyperSQL Listener. At the end of this section, I explain how you can load some sample data to play with, if you want to.

                  [Tip]Tip

                  If SqlTool fails to connect to the specified urlid and you don't know why, add the invocation parameter --debug. This will cause SqlTool to display a stack trace from where the connection attempt fails. (If a connection attempt fails with the interactive \j command, details will always be displayed).

                  [Important]You are responsible for Commit behavior

                  SqlTool does not commit SQL changes by default. (You can use the --autoCommit command-line switch to have it auto-commit). This leaves it to the user's discretion whether to commit or rollback their modifications. If you do want your changes committed, remember to run \= before quitting SqlTool. (Most databases also support the SQL command commit;),

                  If you put a file named auto.sql into your home directory, this file will be executed automatically every time that you run SqlTool interactively (unless you invoke with the --noAutoFile switch). I did say interactively: If you want to execute this file when you execute SQL scripts from the command line, then your script must use \i ${user.home}/auto.sql or similar to invoke it explicitly.

                  To use a JDBC Driver other than the HyperSQL driver, you can't use the -jar switch because you need to modify the classpath. You must add the sqltool.jar file and your JDBC driver classes to your classpath, and you must tell SqlTool what the JDBC driver class name is. The latter can be accomplished by either using the "--driver" switch, or setting "driver" in your config file. The RC File Authentication Setup section. explains the second method. Here's an example of the first method (after you have set the classpath appropriately).

                  java org.hsqldb.cmdline.SqlTool --driver=oracle.jdbc.OracleDriver urlid
                  [Tip]Tip

                  If the tables of query output on your screen are all messy because of lines wrapping, the best and easiest solution is usually to resize your terminal emulator window to make it wider. (With some terms you click & drag the frame edges to resize, with others you use a menu system where you can enter the number of columns).

                  Quotes and Spaces

                  Single and double-quotes are not treated specially by SqlTool. This makes SqlTool more intuitive than most shell languages, ensures that quotes sent to the database engine are not adulterated, and eliminates the need for somehow escaping quote characters.

                  Line delimiters are special, as that is the primary means for SqlTool to tell when a command is finished (requiring combination with semi-colon to support multi-line SQL statements). Spaces and tabs are preserved inside of your strings and variable values, but are trimmed from the beginning in nearly all cases (such space having very rare usefulness). The cases where leading whitespace is preserved exactly as specified in your strings are the : commands (including * VARNAME :, /: VARNAME, \x :, and \xq :).

                  So, if you write the SQL command

                  INSERT into t values ('one ''    and   ''  two');

                  or the SqlTool print command

                  \p A message for my 'Greatest...     fan'

                  you just type exactly what you want to send to the database, or what you want displayed.

                  Embedding

                  Using SqlTool to execute SQL files from your own Java code

                  To repeat what is stated in the JavaDoc for the SqlTool class itself: Programmatic users will usually want to use the objectMain(String[]) method if they want arguments and behavior exactly like command-line SqlTool. If you don't need invocation parameter parsing, auto.sql execution, etc., you will have more control and efficiency by using the SqlFile class directly. The file src/org/hsqldb/sample/SqlFileEmbedder.java in the HyperSQL distribution provides an example for this latter strategy.

                  Non-displayable Types

                  There are some SQL types which SqlTool (being a text-based program) can't display properly. This includes the SQL types BLOB, JAVA_OBJECT, STRUCT, and OTHER. When you run a query that returns any of these, SqlTool will save the very first such value obtained to the binary buffer and will not display any output from this query. You can then save the binary value to a file, as explained in the Storing and Retrieving Binary Files section.

                  There are other types, such as BINARY, which JDBC can make displayable (by using ResultSet.getString()), but which you may very well want to retrieve in raw binary format. You can use the \b command to retrieve any-column-type-at-all in raw binary format (so you can later store the value to a binary file).

                  Another restriction which all text-based database clients have is the practical inability for the user to type in binary data such as photos, audio streams, and serialized Java objects. You can use SqlTool to load any binary object into a database by telling SqlTool to get the insert/update datum from a file. This is also explained in the Storing and Retrieving Binary Files section.

                  Compound commands or commands with semi-colons

                  See the Chunking section if you need to execute any compound SQL commands or SQL commands containing non-escaped/quoted semi-colons.

                  Desktop shortcuts

                  Desktop shortcuts and quick launch icons are useful, especially if you often run SqlTool with the same set of arguments. It's really easy to set up several of them-- one for each way that you invoke SqlTool (i.e., each one would start SqlTool with all the arguments for one of your typical startup needs). One typical setup is to have one shortcut for each database account which you normally use (use a different urlid argument in each shortcut's Target specification.

                  Desktop icon setup varies depending on your Desktop manager, of course. I'll explain how to set up a SqlTool startup icon in Windows XP. Linux and Mac users should be able to take it from there, since it's easier with the common Linux and Mac desktops.

                  Procedure 1.2. Creating a Desktop Shortcut for SqlTool

                  1. Right click in the main Windows background.

                  2. New

                  3. Shortcut

                  4. Browse

                  5. Navigate to where your good JRE lives. For recent Sun JRE's, it installs to C:\Program Files\Java\*\bin by default (the * will be a JDK or JRE identifier and version number).

                  6. Select java.exe.

                  7. OK

                  8. Next

                  9. Enter any name

                  10. Finish

                  11. Right click the new icon.

                  12. Properties

                  13. Edit the Target field.

                  14. Leave the path to java.exe exactly as it is, including the quotes, but append to what is there. Beginning with a space, enter the command-line that you want run.

                  15. Change Icon... to a pretty icon.

                  16. If you want a quick-launch icon instead of (or in addition to) a desktop shortcut icon, click and drag it to your quick launch bar. (You may or may not need to edit the Windows Toolbar properties to let you add new items). Postnote: Quick launch setup has become more idiosyncratic on the more recent versions of Windows, sometimes requiring esoteric hacks to make them in some cases. So, if the instructions here don't work, you'll have to seek help elsewhere.

                  Loading sample data

                  If you want some sample database objects and data to play with, execute the sample/sampledata.sql SQL file [1]. To separate the sample data from your regular data, you can put it into its own schema by running this before you import:

                      CREATE SCHEMA sampledata AUTHORIZATION dba;
                    SET SCHEMA sampledata;

                  Run it like this from an SqlTool session

                      \i HSQLDB_HOME/sample/sampledata.sql

                  where HSQLDB_HOME is the base directory of your HSQLDB software installation [1].

                  For memory-only databases, you'll need to run this every time that you run SqlTool. For other (persistent) databases, the data will reside in your database until you drop the tables.

                  Satisfying SqlTool's CLASSPATH Requirements

                  As discussed earlier, only the single file sqltool.jar is required to run SqlTool (the file name may contain a version label like sqltool-1.2.3.4.jar). But it's useless as an SQL Tool unless you can connect to a JDBC data source, and for that you need the target database's JDBC driver in the classpath. For in-process catalogs, you'll also need the database engine classes in the CLASSPATH. The The Bare Minimum section explains that the easiest way to use SqlTool with any HyperSQL database is to just use sqltool.jar in-place where it resides in a HyperSQL installation. This section explains how to satisfy the CLASSPATH requirements for other setups and use cases.

                  Accessing older HSQLDB Databases with SqlTool

                  If you are using SqlTool to access non-HSQLDB database(s), then you should use the latest and greatest-- just grab the newest public release of SqlTool (like from the latest public HyperSQL release) and skip this subsection.

                  You are strongly encouraged to use the latest SqlTool release to access older HSQLDB databases, to enjoy greatly improved SqlTool robustness and features. It is very easy to do this.

                  1. Obtain the latest sqltool.jar file. One way to obtain the latest sqltool.jar file is to download the latest HyperSQL distribution and extract that single file

                  2. Place (or copy) your new sqltool.jar file right alongside the hsqldb.jar file for your target database version. If you don't have a local copy of the hsqldb.jar file for your target database, just copy it from your database server, or download the full distribution for that server version and extract it.

                  3. (If you have used older versions of SqlTool before, notice that you now invoke SqlTool by specifying the sqltool.jar file instead of the hsqldb.jar). If your target database is a previous 2.x version of HyperSQL, then you are finished and can use the new SqlTool for your older database. Users upgrading from a pre-2.x version please continue...

                    Run SqlTool like this.

                        java -jar path/to/sqltool.jar --driver=org.hsqldb.jdbcDriver...

                    where you specify the pre-2.x JDBC driver name org.hsqldb.jdbcDriver. Give any other SqlTool parameters as you usually would.

                    Once you have verified that you can access your database using the --driver parameter as explained above, edit your sqltool.rc file, and add a new line

                        driver org.hsqldb.jdbcDriver

                    after each urlid that is for a pre-2.x database. Once you do this, you can invoke SqlTool as usual (i.e. you no longer need the --driver argument for your invocations).

                  App-specific Classes, Embedding, and non-HyperSQL Databases

                  For these situations, you need to add your custom, third-party, or SQL driver classes to your Java CLASSPATH. Java doesn't support adding arbitrary elements to the classpath when you use the -jar, so you must set a classpath containing sqltool.jar plus whatever else you need, then invoke SqlTool without the -jar switch, as briefly described at the end of the The Bare Minimum section. For embedded apps, invoke your own main class instead of SqlTool, and you can invoke SqlTool or SqlFile from your code base.

                  To customize the classpath, you need to set up your classpath by using your operating system or shell variable CLASSPATH or by using the java switch -cp (or the equivalent -classpath). I'm not going to take up space here to explain how to set up a Java CLASSPATH. That is a platform-dependent task that is documented well in tons of Java introductions and tutorials. What I'm responsible for telling you is what you need to add to your classpath. For the non-embedded case where you have set up your CLASSPATH environmental variable, you would invoke SqlTool like this.

                      java org.hsqldb.cmdline.SqlTool ...

                  If you are using the -cp switch instead of a CLASSPATH variable, stick it after java. After "SqlTool", give any SqlTool parameters exactly as you would put after java -jar .../sqltool.jar if you didn't need to customize the CLASSPATH. You can specify a JDBC driver class to use either with the --driver switch to SqlTool, or in your RC file stanza (the last method is usually more convenient).

                  Note that without the -jar switch, SqlTool will still automatically pull in HyperSQL JDBC driver or engine classes from HyperSQL jar files in the same directory. It's often a good practice to minimize your runtime classpath. To prevent the possibility of pulling in classes from other HyperSQL jar files, just copy sqltool.jar to some other directory (which does not contain other HyperSQL jar files) and put the path to that one in your classpath.

                  Distributing SqlTool with your Apps

                  You can distribute SqlTool along with your application, for standalone or embedded invocation. For embedded use, you will need to customize the classpath as discussed in the previous item. Either way, you should minimize your application footprint by distributing only those HyperSQL jar files needed by your app. You will obviously need sqltool.jar if you will use the SqlTool or SqlFile class in any way. If your app will only connect to external HyperSQL listeners, then build and include hsqljdbc.jar. If your app will also run a HyperSQL Listener, you'll need to include hsqldb.jar. If your app will connect directly to a in-process catalog, then include hsqldbmain.jar. Note that you never need to include more than one of hsqldb.jar, hsqldbmain.jar, hsqljdbc.jar, since the former jars include everything in the following jars.

                  SqlTool Client PCs

                  If you just want to be able to run SqlTool (interactively or non-interactively) on a PC, and have no need for documentation, then it's usually easiest to just copy sqltool.jar and hsqldb.jar to the PCs (plus JDBC driver jars for any other target databases). If you want to minimize what you distribute, then build and distribute hsqljdbc.jar or hsqldbmain.jar instead of hsqldb.jar, according to the criteria listed in the previous sub-section.

                  RC File Authentication Setup

                  RC file authentication setup is accomplished by creating a text RC configuration file. In this section, when I say configuration or config file, I mean an RC configuration file. RC files can be used by any JDBC client program that uses the org.hsqldb.util.RCData class-- this includes SqlTool, DatabaseManager, DatabaseManagerSwing.

                  You can use it for your own JDBC client programs too. There is example code showing how to do this at src/org/hsqldb/sample/SqlFileEmbedder.java.

                  The sample RC file shown here resides at sample/sqltool.rc in your HSQLDB distribution [1].

                  Example 1.1. Sample RC File

                  # $Id: sqltool.rc 4313 2011-06-06 02:19:38Z unsaved $
                  
                  # This is a sample RC configuration file used by SqlTool, DatabaseManager,
                  # and any other program that uses the org.hsqldb.lib.RCData class.
                  # See the documentation for SqlTool for various ways to use this file.
                  
                  # If you have the least concerns about security, then secure access to
                  # your RC file.
                  
                  # You can run SqlTool right now by copying this file to your home directory
                  # and running
                  #    java -jar /path/to/sqltool.jar mem
                  # This will access the first urlid definition below in order to use a 
                  # personal Memory-Only database.
                  # "url" values may, of course, contain JDBC connection properties, delimited
                  # with semicolons.
                  # As of revision 3347 of SqlFile, you can also connect to datasources defined
                  # here from within an SqlTool session/file with the command "\j urlid".
                  
                  # You can use Java system property values in this file like this:  ${user.home}
                  
                  # The only feature added recently is the optional "transiso" setting,
                  # which may be set to an all-caps transaction isolation level as listed
                  # in the Java API Spec for java.sql.Connection.
                  # Windows users are advised to use forward slashes instead of reverse slashes,
                  # and to avoid paths containing spaces or other funny characters.  (This
                  # recommendation applies to any Java app, not just SqlTool).
                  
                  # A personal Memory-Only (non-persistent) database.
                  urlid mem
                  url jdbc:hsqldb:mem:memdbid
                  username SA
                  password
                  
                  # A personal, local, persistent database.
                  urlid personal
                  url jdbc:hsqldb:file:${user.home}/db/personal;shutdown=true
                  username SA
                  password
                  transiso TRANSACTION_READ_COMMITTED
                  # When connecting directly to a file database like this, you should 
                  # use the shutdown connection property like this to shut down the DB
                  # properly when you exit the JVM.
                  
                  # This is for a hsqldb Server running with default settings on your local
                  # computer (and for which you have not changed the password for "SA").
                  urlid localhost-sa
                  url jdbc:hsqldb:hsql://localhost
                  username SA
                  password
                  
                  
                  
                  # Template for a urlid for an Oracle database.
                  # You will need to put the oracle.jdbc.OracleDriver class into your 
                  # classpath.
                  # In the great majority of cases, you want to use the file classes12.zip
                  # (which you can get from the directory $ORACLE_HOME/jdbc/lib of any
                  # Oracle installation compatible with your server).
                  # Since you need to add to the classpath, you can't invoke SqlTool with
                  # the jar switch, like "java -jar .../sqltool.jar...".
                  # Put both the SqlTool jar and classes12.zip in your classpath (and export!)
                  # and run something like "java org.hsqldb.util.SqlTool...".
                  
                  #urlid cardiff2
                  #url jdbc:oracle:thin:@aegir.admc.com:1522:TRAFFIC_SID
                  #username blaine
                  #password secretpassword
                  #driver oracle.jdbc.OracleDriver
                  
                  
                  
                  # Template for a TLS-encrypted HSQLDB Server.
                  # Remember that the hostname in hsqls (and https) JDBC URLs must match the
                  # CN of the server certificate (the port and instance alias that follows 
                  # are not part of the certificate at all).
                  # You only need to set "truststore" if the server cert is not approved by
                  # your system default truststore (which a commercial certificate probably
                  # would be).
                  
                  #urlid tls
                  #url jdbc:hsqldb:hsqls://db.admc.com:9001/lm2
                  #username BLAINE
                  #password asecret
                  #truststore ${user.home}/ca/db/db-trust.store
                  
                  
                  # Template for a Postgresql database
                  #urlid blainedb
                  #url jdbc:postgresql://idun.africawork.org/blainedb
                  #username blaine
                  #password losung1
                  #driver org.postgresql.Driver
                  
                  # Template for a MySQL database.  MySQL has poor JDBC support.
                  #urlid mysql-testdb
                  #url jdbc:mysql://hostname:3306/dbname
                  #username root
                  #password hiddenpwd
                  #driver com.mysql.jdbc.Driver
                  
                  # Note that "databases" in SQL Server and Sybase are traditionally used for
                  # the same purpose as "schemas" with more SQL-compliant databases.
                  
                  # Template for a Microsoft SQL Server database using Microsoft's Driver
                  # (I find that the JTDS driver is much more responsive than Microsoft's).
                  # OLDER JDBC Driver:
                  #urlid msprojsvr
                  #url jdbc:microsoft:sqlserver://hostname;DatabaseName=DbName;SelectMethod=Cursor
                  # The SelectMethod setting is required to do more than one thing on a JDBC
                  # session (I guess Microsoft thought nobody would really use Java for 
                  # anything other than a "hello world" program).
                  # This is for Microsoft's SQL Server 2000 driver (requires mssqlserver.jar
                  # and msutil.jar).
                  #driver com.microsoft.jdbc.sqlserver.SQLServerDriver
                  #username myuser
                  #password hiddenpwd
                  # Current 2011 JDBC Driver for Microsoft SQL Server:
                  # Requires just the new sqljdbc4.jar.  (Microsoft just loves back-slashes)
                  #url jdbc:sqlserver://hostname\instanceName;DatabaseName=dbname
                  #driver com.microsoft.jdbc.sqlserver.SQLServerDriver
                  
                  # Template for Microsoft SQL Server database using the JTDS Driver
                  # http://jtds.sourceforge.net  Jar file has name like "jtds-1.2.5.jar".
                  #urlid nlyte
                  #username myuser
                  #password hiddenpwd
                  #url jdbc:jtds:sqlserver://myhost/nlyte;instance=MSSQLSERVER
                  #driver net.sourceforge.jtds.jdbc.Driver
                  
                  # Template for a Sybase database
                  #urlid sybase
                  #url jdbc:sybase:Tds:hostname:4100/dbname
                  #username blaine
                  #password hiddenpwd
                  # This is for the jConnect driver (requires jconn3.jar).
                  #driver com.sybase.jdbc3.jdbc.SybDriver
                  
                  # Template for Embedded Derby / Java DB.
                  #urlid derby1
                  #url jdbc:derby:path/to/derby/directory;create=true
                  #username ${user.name}
                  #password any_noauthbydefault
                  #driver org.apache.derby.jdbc.EmbeddedDriver
                  # The embedded Derby driver requires derby.jar.
                  # There'a also the org.apache.derby.jdbc.ClientDriver driver with URL
                  # like jdbc:derby://<server>[:<port>]/databaseName, which requires
                  # derbyclient.jar.
                  # You can use \= to commit, since the Derby team decided (why???)
                  # not to implement the SQL standard statement "commit"!!
                  # Note that SqlTool can not shut down an embedded Derby database properly,
                  # since that requires an additional SQL connection just for that purpose.
                  # However, I've never lost data by not shutting it down properly.
                  # Other than not supporting this quirk of Derby, SqlTool is miles ahead of ij.
                  

                  As noted in the comment (and as used in a couple examples), you can use Java system properties like this: ${user.home}. Windows users, please read the suggestion directed to you in the file.

                  You can put this file anywhere you want to, and specify the location to SqlTool/DatabaseManager/DatabaseManagerSwing by using the --rcfile argument. If there is no reason to not use the default location (and there are situations where you would not want to), then use the default location and you won't have to give --rcfile arguments to SqlTool/DatabaseManager/DatabaseManagerSwing. The default location is sqltool.rc or dbmanager.rc in your home directory (corresponding to the program using it). If you have any doubt about where your home directory is, just run SqlTool with a phony urlid and it will tell you where it expects the configuration file to be.

                      java -jar $HSQLDB_HOME/lib/sqltool.jar x

                  The config file consists of stanza(s) like this:

                      urlid web
                      url jdbc:hsqldb:hsql://localhost
                      username web
                      password webspassword

                  These four settings are required for every urlid. (There are optional settings also, which are described a couple paragraphs down). The URL may contain JDBC connection properties. You can have as many blank lines and comments like

                      # This comment

                  in the file as you like. The whole point is that the urlid that you give in your SqlTool/DatabaseManager command must match a urlid in your configuration file.

                  [Warning]Warning

                  Use whatever facilities are at your disposal to protect your configuration file.

                  It should be readable, both locally and remotely, only to users who run programs that need it. On UNIX, this is easily accomplished by using chmod/chown commands and making sure that it is protected from anonymous remote access (like via NFS, FTP or Samba).

                  You can also put the following optional settings into a urlid stanza. The setting will, of course, only apply to that urlid.

                  charset

                  This is used by the SqlTool program, but not by the DatabaseManager programs. See the Character Encoding section of the Non-Interactive section. This is used for input and output files, not for stdin or stdout, which are controlled by environmental variables and Java system properties. If you set no encoding for an urlid, input and outfiles will use the same encoding as for stdin/stdout. (As of right now, the charset setting here is not honored by the \j command, but only when SqlTool loads an urlid specified on the command-line).

                  driver

                  Sets the JDBC driver class name. You can, alternatively, set this for one SqlTool/DatabaseManager invocation by using the command line switch --driver. Defaults to org.hsqldb.jdbc.JDBCDriver.

                  truststore

                  TLS trust keystore store file path as documented in the TLS section of the Listeners chapter of the HyperSQL User Guide You usually only need to set this if the server is using a non-publicly-certified certificate (like a self-signed self-ca'd cert). Relative paths will be resolved relative to the ${user.dir} system property at JRE invocation time.

                  transiso

                  Specify the Transaction Isolation Level with an all-caps string, exactly as listed in he Field Summary of the Java API Spec for the class java.sql.Connection.

                  Property and SqlTool command-line switches override settings made in the configuration file.

                  Switching Data Sources

                  The \j command lets you switch JDBC Data Sources in your SQL files (or interactively). "\?" shows the syntax to make a connection by either RCData urlid or by name + password + JDBC Url. (If you omit the password parameter, an empty string password will be used). The urlid variant uses RC file of $HOME/sqltool.rc. We will add a way to specify an RC file if there is any demand for that.

                  You can start SqlTool without any JDBC Connection by specifying no Inline RC and urlid of "-" (just a hyphen). If you don't need to specify any SQL file paths, you can skip the hyphen, as in this example.

                  java -jar $HSQLDB_HOME/lib/sqltool.jar -Pv1=one

                  (The "-" is required when specifying one or more SQL files, in order to distinguish urlid-spec from file-spec). Consequently, if you invoke SqlTool with no parameters at all, you will get a SqlTool session with no JDBC Connection. You will obviously need to use \j before doing any database work.

                  Using Inline RC Authentication

                  Inline RC authentication setup is accomplished by using the --inlineRc command-line switch on SqlTool. The --inlineRc command-line switch takes a comma-separated list of key/value elements. The url and user elements are required. The rest are optional. The --inlineRc switch is the only case where you can give SQL file paths without a preceding urlid indicator (an urlid or -). The program knows not to look for an urlid if you give an inline.

                  Since commas are used to separate each name=value pair, you must do some extra work for any commas inside of the values of any name=values. Escape them by proceeding them with backslash, like "myName=my\p,value" to inform SqlTool that the comma is part of the value and not a name/value separator.

                  url

                  The JDBC URL of the database you wish to connect to.

                  user

                  The username to connect to the database as.

                  charset

                  Sets the character encoding. Overrides the platform default, or what you have set by env variables or Java system properties. (Does not effect stdin or stdout).

                  truststore

                  The TLS trust keystore file path as documented in the TLS chapter. Relative paths will be resolved relative to the current directory.

                  transiso

                  java.sql.Connection transaction isolation level to connect with, as specified in the Java API spec.

                  password

                  You may only use this element to set empty password, like

                      password=

                  For any other password value, omit the password element and you will be prompted for the value.

                  (Use the --driver switch instead of --inlineRc to specify a JDBC driver class). Here is an example of invoking SqlTool to connect to a standalone database.

                  java -jar $HSQLDB_HOME/lib/sqltool.jar --inlineRc=url=jdbc:hsqldb:file:/home/dan/dandb,user=dan

                  For security reasons, you cannot specify a non-empty password as an argument. You will be prompted for a password as part of the login process.

                  Logging

                  Both the \l command and all warnings and error messages now use a logging facility. The logging facility hands off to Log4j if Log4j is found in the classpath, and otherwise will hand off to java.util.logging. The default behavior of java.util.logging should work fine for most users. If you are using log4j and are redirecting with pipes, you may want to configure a Console Appender with target of "System.err" so that error output will go to the error stream (all console output for java.util.logging goes to stderr by default). See the API specs for Log4j and for J2SE for how to configure either product. If you are embedding SqlTool in a product to process SQL files, I suggest that you use log4j. java.util.logging is neither scalable nor well-designed.

                  Run the command \l? to see how to use the logging command \l in your SQL files (or interactively), including what logging levels you may specify.

                  Interactive Usage

                  Do read the The Bare Minimum section before you read this section.

                  You run SqlTool interactively by specifying no SQL filepaths on the SqlTool command line. Like this.

                      java -jar $HSQLDB_HOME/lib/sqltool.jar urlid

                  Procedure 1.3. What happens when SqlTool is run interactively (using all default settings)

                  1. SqlTool starts up and connects to the specified database, using your SqlTool configuration file (as explained in the RC File Authentication Setup section).

                  2. SQL file auto.sql in your home directory is executed (if there is one),

                  3. SqlTool displays a banner showing the SqlTool and SqlFile version numbers and describes the different command types that you can give, as well as commands to list all of the specific commands available to you.

                  You exit your session by using the "\q" special command or ending input (like with Ctrl-D or Ctrl-Z).

                  [Important]Important

                  Any command may be preceded by space characters. Special Commands, Edit Buffer Commands, PL Commands, Macros always consist of just one line.

                  These rules do not apply at all to Raw Mode. Raw mode is for use by advanced users when they want to completely bypass SqlTool processing in order to enter a chunk of text for direct transmission to the database engine.

                  SqlTool Command-Line Editing

                  If you are really comfortable with grep, perl, or vim, you will instantly be an expert with SqlTool command-line editing. Due to limitations of Java I/O, we can't use up-arrow recall, which many people are used to from DosKey and Bash shell. If you don't know how to use regular expressions, and don't want to learn how to use them, then just forget command-recall. (Actually DosKey does work from vanilla Windows MSDOS console windows. Be aware that it suffers from the same 20-year old quirks as DOS command-line editing. Very often the command line history will get shifted and you won't be able to find the command you want to recall. Usually you can work around this by typing a comment... "::" to DOS or "--" to SqlTool then re-trying on the next command line).

                  Basic command entry (i.e., without regexps)

                  • Just type in your command, and use the backspace-key to fix mistakes on the same line.
                  • If you goof up a multi-line command, just hit the ENTER key twice to start over. (The command will be moved to the buffer where it will do no harm).
                  • Use the ":h" command to view your command history. You can use your terminal emulator scroll bar and copy and paste facility to repeat commands.
                  • As long as you don't need to change text that is already in a command, you can easily repeat commands from the history like ":14;" to re-run command number 14 from history.
                  • Expanding just a bit from the previous item, you can add on to a previous command by running a command like ":14a" (where the "a" means append).
                  • See the Macros section about how to set and use macros.

                  If you use regular expressions to search through your command history, or to modify commands, be aware that the command type of commands in history are fixed. You can search and modify the text after a \ or * prefix (if any), but you can't search on or change a prefix (or add or remove one).

                  Command Types

                  When you are typing into SqlTool, you are always typing part of the immediate command. If the immediate command is an SQL statement, it is executed as soon as SqlTool reads in the trailing (unquoted) semi-colon. Commands of the other command types are executed as soon as you hit ENTER. The interactive : commands can perform actions with or on the edit buffer. The edit buffer usually contains a copy of the last command executed, and you can always view it with the :b command. If you never use any : commands, you can entirely ignore the edit buffer. If you want to repeat commands or edit previous commands, you will need to work with the edit buffer. The immediate command contains whatever (and exactly what) you type. The command history and edit buffer may contain any type of command other than comments and : commands (i.e., : commands and comments are just not copied to the history or to the edit buffer).

                  Hopefully an example will clarify the difference between the immediate command and the edit buffer. If you type in the edit buffer Substitution command ":s/tbl/table/", the :s command that you typed is the immediate command (and it will never be stored to the edit buffer or history, since it is a : command), but the purpose of the substitution command is to modify the contents of the edit buffer (perform a substitution on it)-- the goal being that after your substitutions you would execute the buffer with the ":;" command. The ":a" command is special in that when you hit ENTER to execute it, it copies the contents of the edit buffer to a new immediate command and leaves you in a state where you are appending to that immediate command (nearly) exactly as if you had just typed it in.

                  Emulating Non-Interactive mode

                  You can run SqlTool interactively, but have SqlTool behave exactly as if it were processing an SQL file (i.e., no command-line prompts, error-handling that defaults to fail-upon-error, etc.). Just specify "-" as the SQL file name in the command line. This is a good way to test what SqlTool will do when it encounters any specific command in an SQL file. See the Piping and shell scripting subsection of the Non-Interactive chapter for an example.

                  Command Types

                  Command types

                  SQL Statement

                  Any command that you enter which does not begin with "\", ":", "* " or "/" is an SQL Statement. The command is not terminated when you hit ENTER, like most OS shells. You terminate SQL Statements with either ";" or with a blank line. In the former case, the SQL Statement will be executed against the SQL database and the command will go into the edit buffer and SQL command history for editing or viewing later on. In the former case, execute against the SQL database means to transmit the SQL text to the database engine for execution. In the latter case (you end an SQL Statement with a blank line), the command will go to the edit buffer and SQL history, but will not be executed (but you can execute it later from the edit buffer).

                  (Blank lines are only interpreted this way when SqlTool is run interactively. In SQL files, blank lines inside of SQL statements remain part of the SQL statement).

                  As a result of these termination rules, whenever you are entering text that is not a Special Command, Edit Buffer / History Command, or PL Command, you are always appending lines to an SQL Statement or comment. (In the case of the first line, you will be appending to an empty SQL statement. I.e. you will be starting a new SQL Statement or comment).

                  Special Command

                  Run the command "\?" to list the Special Commands. All of the Special Commands begin with "\". I'll describe some of the most useful Special Commands below.

                  Edit Buffer / History Command

                  Run the command ":?" to list the Edit-Buffer/History Commands. All of these commands begin with ":". These commands use commands from the command history, or operate upon the edit "buffer", so that you can edit and/or (re-)execute previously entered commands.

                  PL Command

                  Procedural Language commands. Run the command "*?" to list the PL Commands. All of the PL Commands begin with "*". PL commands are for setting and using scripting variables and conditional and flow control statements like * if and * while. A few PL features (such as macros and updating and selecting data directly from/to files) can be a real convenience for nearly all users, so these features will be discussed briefly in this section. More detailed explanation of PL variables and the other PL features, with examples, are covered in the SqlTool Procedural Language section.

                  Macro Command

                  Macro definition and usage commands. Run the command "/?" to show the define, list, or use macros.

                  Raw Mode

                  The descriptions of command-types above do not apply to Raw Mode. In raw mode, SqlTool doesn't interpret what you type at all. It all just goes into the edit buffer which you can send to the database engine. Beginners can safely ignore raw mode. You will never encounter it unless you run the "\." special command, or define a stored procedure or function. See the Raw Mode section for the details.

                  Special Commands

                  Essential Special Commands

                  \?

                  In-program Help. Run this to show ALL available Special Commands instead of just the subset listed here!

                  \q

                  Quit

                  \j...

                  View JDBC Data Source details or connect up to a JDBC Data Source (replacing the current connection, if any). Run \? to see the syntax for the different usages.

                  \i path/to/script.sql

                  Execute the specified SQL script, then continue again interactively. Since SqlTool is a Java program, you can safely use forward slashes in your file paths, regardless of your operating system. You can use Java system properties like ${user.home}, PL variables like *{this} and @ in your file paths. The last is mostly useful for \i statements inside of SQL files, where it means the directory containing the current script.

                  \c true (or false)

                  Change error-handling (Continue-on-error) behavior from the default. By default when SqlTool is run interactively, errors will be reported but SqlTool will continue to process subsequent commands. By default when SqlTool is run non-interactively, errors will also cause SqlTool to stop processing the current stream (like stdin) or SQL file. The default settings are usually what is desired, except for SQL scripts which need to abort upon failures, even when invoked manually (including for interactive testing purposes).

                  \=

                  Commit the current SQL transaction. Most users are used to typing the SQL statement commit;, but this command is crucial for those databases which don't support the statement. It's obviously unnecessary if you have auto-commit mode on.

                  \m?

                  List a summary of DSV and CSV importing, and all available options for them. You can use variables in the file path specifications, as described for the \i command above.

                  \x?

                  Ditto.

                  \mq?

                  Ditto.

                  \xq?

                  Ditto.

                  \d?

                  List a summary of the \d commands below.

                  \dt [filter_substring]

                  \dv [filter_substring]

                  \ds [filter_substring]

                  \di [table_name]

                  \dS [filter_substring]

                  \da [filter_substring]

                  \dn [filter_substring]

                  \du [filter_substring]

                  \dr [filter_substring]

                  \d* [filter_substring]

                  Lists available objects of the given type.

                  • t: non-system Tables
                  • v: Views
                  • s: Sequences
                  • i: Indexes
                  • S: System tables
                  • a: Aliases
                  • n: schema Names
                  • u: database Users
                  • r: Roles
                  • *: all table-like objects

                  If your database supports schemas, then the schema name will also be listed.

                  If you supply an optional filter substring, then only items which match the specified substring. will be listed. In most cases, the specified filter will be treated as a regular expression matched against the candidate object names. In order to take advantage of extreme server-side performance benefits, however, in some cases the substring is passed to the database server and the filter will processed by the server.

                  [Important]The regexp test is case-sensitive!

                  Even though in SQL queries and for the "\d objectname" command object names are usually case-insensitive, for the \dX commands, you must capitalize the filter substring exactly as it will appear in the special command output. This is an inconvenience, since the database engine will change names in SQL to default case unless you double-quote the name, but that is server-side functionality which cannot (portably) be reproduced by SqlTool. You can use spaces and other special characters in the string.

                  [Tip]Schema-narrowed Filter Specs

                  Filter substrings ending with "." are special. If a substring ends with ".", then this means to narrow the search by the exact, case-sensitive schema name given. For example, if I run "\d* BLAINE.", this will list all table-like database objects in the "BLAINE" schema. The capitalization of the schema must be exactly the same as how the schema name is listed by the "\dn" command. You can use spaces and other special characters in the string. (I.e., enter the name exactly how you would enter it inside of double-quotes in an SQL command). This is an inconvenience, since the database engine will change names in SQL to default case unless you double-quote the name, but that is server-side functionality which cannot (portably) be reproduced by SqlTool.

                  [Tip]Current-Schema Filter Spec

                  The filter string "." (just a plain dot) means the current session schema, for databases which support the concept according to the SQL standard (HyperSQL database does).

                  [Important]Searching for Indexes

                  Indexes may not be searched for by substring, only by exact target table name. So if I1 is an index on table T1, then you list this index by running "\di T1". In addition, many database vendors will report on indexes only if a target table is identified. Therefore, "\di" with no argument will fail if your database vendor does not support it.

                  \d objectname [[/]regexp]

                  Lists names of columns in the specified table or view. objectname may be a base table name or a schema.object name.

                  If you supply a filter string, then only columns with a name matching the given regular expression will be listd. (If no special characters are used, this just means that names containing the specified substring will match). You'll find this filter is a great convenience compared to other database utilities, where you have to list all columns of large tables when you are only interested in one of them.

                  To narrow the displayed information based on all column outputs, instead of just the column names, just prefix the expression with /. For example, to list all INTEGER columns, you could run \d mytable /INTEGER.

                  [Tip]Tip

                  When working with real data (as opposed to learning or playing), I often find it useful to run two SqlTool sessions in two side-by-side terminal emulator windows. I do all of my real work in one window, and use the other mostly for \d commands. This way I can refer to the data dictionary while writing SQL commands, without having to scroll.

                  This list here includes only the essential Special Commands, but n.b. that there are other useful Special Commands which you can list by running \?. (You can, for example, execute SQL from external SQL files, and save your interactive SQL commands to files). Some specifics of these other commands are specified immediately below, and the Generating Text or HTML Reports section explains how to use the "\o" and "\h" special commands to generate reports.

                  Be aware that the \! Special Command does not work for external programs that read from standard input. You can invoke non-interactive and graphical interactive programs, but not command-line interactive programs.

                  SqlTool executes \! programs directly, it does not run an operating system shell (this is to avoid OS-specific code in SqlTool). Because of this, you can give as many command-line arguments as you wish, but you can't use shell wildcards or redirection.

                  Edit Buffer / History Commands

                  Edit Buffer / History Commands

                  :?

                  IN-program Help

                  :b

                  List the current contents of the edit buffer.

                  :h

                  Shows the Command History. For each command which has been executed (up to the max history length), the SQL command history will show the command; its command number (#); and also how many commands back it is (as a negative number). : commands are never added to the history list. You can then use either form of the command identifier to recall a command to the edit buffer (the command described next) or as the target of any of the following : commands. This last is accomplished in a manner very similar to the vi editor. You specify the target command number between the colon and the command. As an example, if you gave the command :s/X/Y/, that would perform the substitution on the contents of the edit buffer; but if you gave the command :-3 s/X/Y/, that would perform the substitution on the command 3 back in the command history (and copy the output to the edit buffer). Also, just like vi, you can identify the command to recall by using a regular expression inside of slashes, like :/blue/ s/X/Y/ to operate on the last command you ran which contains "blue".

                  :13 OR :-2 OR :/blue/

                  Recalls a command from Command history to the edit buffer. Enter ":" followed by the positive command number from Command history, like ":13"... or ":" followed by a negative number like ":-2" for two commands back in the Command history... or ":" followed by a regular expression inside slashes, like ":/blue/" to recall the last command which contains "blue". The specified command will be written to the edit buffer so that you can execute it or edit it using the commands below.

                  As described under the :h command immediately above, you can follow the command number here with any of the commands below to perform the given operation on the specified command from history instead of on the edit buffer contents. So, for example, ":4;" would load command 4 from history then execute it (see the ":;" command below).

                  :;

                  Executes the SQL, Special or PL statement in the edit buffer (by default). This is an extremely useful command. It's easy to remember because it consists of ":", meaning Edit Buffer Command, plus a line-terminating ";", (which generally means to execute an SQL statement, though in this case it will also execute a special or PL command).

                  :a

                  Enter append mode with the contents of the edit buffer (by default) as the current command. When you hit ENTER, things will be nearly exactly the same as if you physically re-typed the command that is in the edit buffer. Whatever lines you type next will be appended to the immediate command. As always, you then have the choice of hitting ENTER to execute a Special or PL command, entering a blank line to store back to the edit buffer, or end a SQL statement with semi-colon and ENTER to execute it.

                  You can, optionally, put a string after the :a, in which case things will be exactly as just described except the additional text will also be appended to the new immediate command. If you put a string after the :a which ends with ;, then the resultant new immediate command will just be executed right away, as if you typed in and entered the entire thing.

                  If your edit buffer contains SELECT x FROM mytab and you run a:le, the resultant command will be SELECT x FROM mytable. If your edit buffer contains SELECT x FROM mytab and you run a: ORDER BY y, the resultant command will be SELECT x FROM mytab ORDER BY y. Notice that in the latter case the append text begins with a space character.

                  You may notice that you can't use the left-arrow or backspace key to back up over the original text. This is due to Java and portability constraints. If you want to edit existing text, then you shouldn't use the Append command.

                  :s/from regex/to string/switches

                  The Substitution Command is the primary method for SqlTool command editing-- it operates upon the current edit buffer by default. The "to string" and the "switches" are both optional (though the final "/" is not). To start with, I'll discuss the use and behavior if you don't supply any substitution mode switches.

                  Don't use "/" if it occurs in either "from string" or "to string". You can use any character that you want in place of "/", but it must not occur in the from or to strings. Example

                      :s@from string@to string@

                  The to string is substituted for the first occurrence of the (case-specific) from string. The replacement will consider the entire SQL statement, even if it is a multi-line statement.

                  In the example above, the from regex was a plain string, but it is interpreted as a regular expression so you can do all kinds of powerful substitutions. See the perlre man page, or the java.util.regex.Pattern API Spec for everything you need to know about extended regular expressions.

                  Don't end a to string with ";" in attempt to make a command execute. There is a substitution mode switch to use for that purpose.

                  You can use any combination of the substitution mode switches.

                  • Use "i" to make the searches for from regex case insensitive.

                  • Use "g" to substitute Globally, i.e., to substitute all occurrences of the from regex instead of only the first occurrence found.

                  • Use ";" to execute the command immediately after the substitution is performed.

                  • Use "m" for ^ and $ to match each line-break in a multi-line edit buffer, instead of just at the very beginning and every end of the entire buffer.

                  If you specify a command number (from the command history), you end up with a feature very reminiscent of vi, but even more powerful, since the Perl/Java regular expression are a superset of the vi regular expressions. As an example,

                      :24 s/pin/needle/g;

                  would start with command number 24 from command history, substitute "needle" for all occurrences of "pin", then execute the result of that substitution (and this final statement will of course be copied to the edit buffer and to command history).

                  :w /path/to/file.sql

                  This appends the contents of the current buffer (by default) to the specified file. Since what is being written are Special, PL, or SQL commands, you are effectively creating an SQL script. To write some previous command to a file, just restore the command to the edit buffer with a command like ":-4" before you give the :w command.

                  I find the ":/regex/" and ":/regex/;" constructs particularly handy for every-day usage.

                      :/\\d/;

                  re-executes the last \d command that you gave (The extra "\" is needed to escape the special meaning of "\" in regular expressions). It's great to be able to recall and execute the last "insert" command, for example, without needing to check the history or keep track of how many commands back it was. To re-execute the last insert command, just run ":/insert/;". If you want to be safe about it, do it in two steps to verify that you didn't accidentally recall some other command which happened to contain the string "insert", like

                      :/insert/
                      :;

                  (Executing the last only if you are satisfied when SqlTool reports what command it restored). Often, of course, you will want to change the command before re-executing, and that's when you combine the :s and :a commands.

                  We'll finish up with a couple fine points about Edit/Buffer commands. You generally can't use PL variables in Edit/Buffer commands, to eliminate possible ambiguities and complexities when modifying commands. The :w command is an exception to this rule, since it can be useful to use variables to determine the output file, and this command does not do any "editing".

                  The :? in-program help explains how you can change the default regular expression matching behavior (case sensitivity, etc.), but you can always use syntax like "(?i)" inside of your regular expression, as described in the Java API spec for class java.util.regex.Pattern. History-command-matching with the /regex/ construct is purposefully liberal, matching any portion of the command, case sensitive, etc., but you can still use the method just described to modify this behavior. In this case, you could use "(?-i)" at the beginning of your regular expression to be case-sensitive.

                  Command History

                  The SQL history shown by the :h command, and used by other commands, is truncated to 100 entries, since its utility comes from being able to quickly view the history list. You can change the history length by setting the system property sqltool.historyLength to the desire integer value (using any of the System Property mechanisms provided by Java). If there is any demand, I'll make the setting of this value more convenient.

                  The SQL history list contains all executed commands other than Edit Buffer commands and comments, even if the command has a syntax error or fails upon execution. The reason for including bad commands is so that you can recall and fix them if you wish to. The same applies to the edit buffer. If you copy a command to the edit buffer by entering blank line, or if you edit the edit buffer, that edit buffer value will never make it into the command history until and if you execute it.

                  PL Commands

                  Essential PL Command

                  * ?

                  In-program Help about using the PL variables which have been set. Use this command!

                  * ? assign

                  In-program Help about setting and unsetting PL variables. Use this command!

                  * VARNAME = value

                  Set the value of a variable. If the variable doesn't exist yet, it will be created. The most common use for this is so that you can later use it in math expressions like VARNAME, in logical (conditionally) expressions like *{VARNAME}, or in other commands (including SQL) like *{VARNAME} or *{:VARNAME} construct. The only difference between *{literal} and *{:VARNAME} is that the former produces an error if VARNAME is not set, whereas the latter will expand to a zero-length string if VARNAME is not set.

                  [Important]Preventing unset-variable Errors

                  You can prevent all unset-variable errors by using the construct *{:VARNAME} in place of *{VARNAME} wherever VARNAME may not then be set.

                  [Warning]Warning

                  With the current version of SqlTool, you can't use this assignment command to set the value of a variable to the empty string unless you set Java system property sqltool.REMOVE_EMPTY_VARS to false. We are talking about assignments like the following:

                      * VARNAME =

                  If sqltool.REMOVE_EMPTY_VARS is set to false, then the assignment shown assigns the empty string. Otherwise, the assignment shown unsets the variable (which is equivalent to setting it to be null). You are encouraged to set sqltool.REMOVE_EMPTY_VARS to false, because this will become the default behavior of SqlTool shortly (i.e. even if you don't set the system property). Regardless of sqltool.REMOVE_EMPTY_VARS, you can always use the unset command (described next) to unset variables, and you can always use command line switches -P or --setVar to assign empty strings.

                  See Variables subsection for information about variable usage.

                  * - VARNAME

                  Unset (remove) the specified variable.

                  * VARNAME _

                  When next SQL command is run, instead of displaying the rows, just store the very first column value to variable VARNAME. This works for CLOB columns too. It also works with Oracle XML type columns if you use column labels and the getclobval function. If the SQL null value is retrieved next, then this variable will be assigned the value null, which is the same thing as unsetting it. It's easy to tell when a variable is set to null vs. when it is set to the empty string. See the Nulls and Empty Strings section about that.

                  * ? control

                  In-program Help about PL control/branching commands. Use this command!

                  * if (LOGICAL EXPR)

                  If the logical expression evaluates to true, then the following block of code (up to the paired * end if statement is executed. If the expression is false, then the same code block is skipped. Run * ? control for details, including the optional * else statement, a short-cut inline if statement, and several other branching statements.

                  This list here includes only a sampling of some essential PL Commands, but there are many other useful PL Commands which you can list by running * ?.

                  PL variables are intimately involved with most PL commands, and (and with some Special commands). Even if you never assign a PL variable, if you are at technical level of using PL commands, you should at least know how to check SqlTool system PL variables which effect SqlTool's behavior. See the Nulls and Empty Strings section about that.

                  Non-Interactive

                  Read the Interactive Usage section if you have not already, because much of what is in this section builds upon that. You can skip all discussion about Command History and the edit buffer if you will not use those interactive features. (Except the important exception that the edit buffer is still populated by executed commands and raw mode, so the buffer can be used by * VARNAME :, /: VARNAME, \x :, and \xq : commands).

                  The previous point brings us to another important consideration for SQL script writers. When SqlTool is run interactively, you can enter a blank line after a SQL command to send the command to the edit buffer without executing it. That action is not supported in scripts, however, because scripters expect more freedom in usage of white space. I.e., scripters should be able to add blank lines wherever they want to in their scripts-- and they can. The problem is, defining variables or macros or performing exports using multi-line SQL statements requires the multi-line SQL statements in the edit buffer. One way to do these commands into the buffer is to execute the SQL command, but usually you do not want the SQL to execute until expansion or execution time of the variable/macro/export. The empty-line method only works in interactive mode. What we use is Raw Mode. This works great both interactively and non-interactively, and it supports Chunking without having to format your SQL in a special way. A great application of this is to put multi-line macro and function definitions into your auto.sql file.

                  SqlTool system PL variables control behavior (for example, they control many aspects of DSV importing and exporting). User PL variables can be used to make your scripts dynamic and for conditional actions. Both system and user PL variables can be set by --setVar and -p switches, or PL commands in --sql switches or SQL files (as well as in auto.sql for interactive usage). Since the variables are all global and shared across contexts, the variables thus set effect behavior of all subsequence content in --sql switches and SQL files (and auto.sql and stdin for interactive usage). See the Variables subsection for the particulars.

                  [Important]Remember to Commit

                  If you're doing data updates, remember to issue a commit command or use the --autoCommit switch.

                  As you'll see, SqlTool has many features that are very convenient for scripting. But what really makes it superior for automation tasks (as compared to SQL tools from other vendors) is the ability to reliably detect errors and to control JDBC transactions. SqlTool is designed so that you can reliably determine if errors occurred within SQL scripts themselves, and from the invoking environment (for example, from a Perl, Bash, or Python script, or a simple cron tab invocation).

                  Giving SQL on the Command Line

                  If you just have a couple Commands to run, you can run them directly from the comand-line or from a shell script without an SQL file, like this.

                  java -jar $HSQLDB_HOME/lib/sqltool.jar --sql="SQL statement;" urlid

                  [Note]Note

                  The --sql switch automatically implies --noinput, so if you want to execute the specified SQL before and in addition to an interactive session (or stdin piping), then you must also give the --stdinput switch.

                  Since SqlTool transmits SQL statements to the database engine only when a line is terminated with ";", if you want feedback from multiple SQL statements in an --sql expression, you will need to use functionality of your OS shell to include linebreaks after the semicolons in the expression. With any Bourne-compatible shell, you can include linebreaks in the SQL statements like this.

                      java -jar $HSQLDB_HOME/lib/sqltool.jar --sql='
                          SQL statement number one;
                          * NEWVAR = something
                          \p A SqlTool Special command which echoes NEWVAR: *{NEWVAR}
                              number two;
                          SQL statement three;
                      ' urlid

                  Notice that the SQL string is not strictly SQL, but SqlTool input, so it may contain Special or PL commands. The variable is set this way only for educational purposes. The same thing could be accomplished more elegantly by using the -p switch.

                  [Note]Note

                  The multi-line examples in this section will only work as-is with a Bourne-compatible shell. With some ugliness they can be converted to C shell. For Windows, you are better off to stick with SQL files for multi-line input.

                  If you don't need feedback, just separate the SQL commands with semicolons and the entire expression will be chunked.

                  The --sql switch is very useful for setting shell variables to the output of SQL Statements, like this.

                      # A shell script
                      USERCOUNT=`java -jar $HSQLDB_HOME/lib/sqltool.jar --sql='
                          select count(*) from usertbl;
                      ' urlid` || {
                          # Handle the SqlTool error
                      }
                      echo "There are $USERCOUNT users registered in the database."
                      [ "$USECOUNT" -gt 3 ] && {   # If there are more than 3 users registered
                          # Some conditional shell scripting

                  SQL Files

                  Just give paths to sql text file(s) on the command line after the urlid.

                  Often, you will want to redirect output to a file, like

                   java -jar $HSQLDB_HOME/lib/sqltool.jar urlid file.sql... > /tmp/file.log 2>&1

                  You can also execute SQL files from an interactive session with the "\i"' Special Command, but be aware that the default behavior in an interactive session is to continue upon errors. If the SQL file was written without any concern for error handling, then the file will continue to execute after errors occur. You could run \c false before \i filename, but then your SqlTool session will exit if an error is encountered in the SQL file. If you have an SQL file without error handling, and you want to abort that file when an error occurs, but not exit SqlTool, the easiest way to accomplish this is usually to add \c false to the top of the script.

                  If you specify multiple SQL files on the command-line, the default behavior is to exit SqlTool immediately if any of the SQL files encounters an error.

                  SQL files themselves have ultimate control over error handling. Regardless of what command-line options are set, or what commands you give interactively, if a SQL file contains error handling statements, they will take precedence.

                  You can also use \i in SQL files to pull in (nest) additional SQL files. This is a powerful way to hierarchically maintain and configuration manage a set of scripts for a product, project, or database. For encapsulation, tracking, and collaboration purposes, it's usually best to keep each SQL script focused on one task or goal, for example: creating a table, it's trigger, and loading initial data from a DSV file. Usually a set of such scripts will have to be executed in a precise order so that referenced tables are created before tables with foreign keys to them, etc. I make a super-script for every database project that I manage. Besides this strategy proving and configuration managing an installation procedure known to work, I can recreate large and complex, custom product databases for deployments or tests in seconds. With the addition of some very simple PL coding, I can re-create all database structures in a parallel schema by just specifying a schema name when I invoke the super-script.

                  Only for interactive SqlTool invocations, the file auto.sql in your home directory will be executed before your typed (or piped) input. It is processed in the same way as a script file specified on the command-line except that since you are running SqlTool interactively, the interactive SqlTool rules will apply. If your auto.sql does setup that you need done for non-interactive SQL files, then add a \i ${user.home}/auto.sql to the top of the script, understanding that if you execute that script interactively you will cause auto.sql to be executed a second time, but see the following tip about preventing that.

                  [Tip] Preventing redundant execution of utility or shared scripts.

                  There's a common idiom used in UNIX login and shell initialization scripts that prevents redundant executions, and it works great for SqlTool too. Think up a unique PL variable name which will keep track of whether the script has been sourced in the current SqlTool session, and the script will have no effect if called a 2nd, 3rd, etc. time. This example applies the idiom to an auto.sql file, but it can be used in any script that you want to prevent superfluous executions in a developer-friendly way.

                      * if (*AUTO_EXECUTED)
                          * break
                      * end if
                      * AUTO_EXECUTED = true

                  It would be slightly more efficient, but less reliable, to put the test on the caller's side instead of the callee side, like this:

                      * if (! *AUTO_EXECUTED)
                          * \i ${user.home}/auto.sql
                      * end if

                  As you would probably guess, all of SQL's file commands (for example loading or saving SQL scripts, binary data, DSV data) take either relative or absolute file paths. However, when you nest scripts, you will usually want to begin your paths with the @/. The initial @ character in file paths means the directory containing the current script. This is important because of Java's frustrating inability to switch the current directory. By using @, you can cross-reference between SQL scripts in one or several co-located directories, and everything will just work, regardless of your current directory when you invoke script(s).

                  [Tip]Make use of @/ construct for CMD scripts with nesting

                  If you use a managed set of nested scripts, you are advised to prefix all relative file paths inside of SqlTool scripts with @/. Without this, relative file paths would be resolved relative to the invocation directory-- making your scripts require a specific invocation directory. The at character will resolve to the directory containing the current script.

                  You can use the following SQL file, sample/sample.sql, from your HyperSQL distribution [1]. It contains SQL as well as Special Commands making good use of most of the Special Commands documented below.

                  /*
                      $Id: sample.sql 3637 2010-06-07 00:59:13Z unsaved $
                      Exemplifies use of SqlTool.
                      PCTASK Table creation
                  */
                  
                  /* Ignore error for these two statements */
                  \c true
                  DROP TABLE pctasklist;
                  DROP TABLE pctask;
                  \c false
                  
                  \p Creating table pctask
                  CREATE TABLE pctask (
                      id integer identity,
                      name varchar(40),
                      description varchar(256),
                      url varchar(80),
                      UNIQUE (name)
                  );
                  
                  \p Creating table pctasklist
                  CREATE TABLE pctasklist (
                      id integer identity,
                      host varchar(20) not null,
                      tasksequence int not null,
                      pctask integer,
                      assigndate timestamp default current_timestamp,
                      completedate timestamp,
                      show boolean default true,
                      FOREIGN KEY (pctask) REFERENCES pctask,
                      UNIQUE (host, tasksequence)
                  );
                  
                  \p Granting privileges
                  GRANT select ON pctask TO public;
                  GRANT all ON pctask TO tomcat;
                  GRANT select ON pctasklist TO public;
                  GRANT all ON pctasklist TO tomcat;
                  
                  \p Inserting test records
                  INSERT INTO pctask (name, description, url) VALUES (
                      'task one', 'Description for task 1', 'http://cnn.com');
                  INSERT INTO pctasklist (host, tasksequence, pctask) VALUES (
                      'admc-masq', 101, (SELECT id FROM pctask WHERE name = 'task one'));
                  
                  commit;
                  

                  You can execute this SQL file with a Memory Only database with a command like

                      java -jar $HSQLDB_HOME/lib/sqltool.jar  --sql='
                          create user tomcat password "x";
                      ' mem path/to/hsqldb/sample/sample.sql

                  This shows how you can mix SQL on the command line, and SQL inside an SQL file.

                  [Note]Note

                  The example above uses Bourne shell syntax. C shell syntax would be similar. You would need to use an SQL file to accomplish this on Windows.

                  (The --sql="create...;" argument in the example creates an account which the following script uses). You should see error messages between the Continue-on-error...true and Continue-on-error...false. The script purposefully runs commands that might fail there. The reason the script does this is to perform database-independent conditional table removals. (The SQL clause IF EXISTS is more graceful and succinct, so you may want to use that if you don't need to support databases which don't support IF EXISTS). If an error occurs when continue-on-error is false, the script would abort immediately.

                  Piping and shell scripting

                  You can of course, redirect output from SqlTool to a file or another program.

                  java -jar $HSQLDB_HOME/lib/sqltool.jar urlid file.sql > file.txt 2>&1
                  
                  java -jar $HSQLDB_HOME/lib/sqltool.jar urlid file.sql 2>&1 | someprogram...

                  You can type commands in to SqlTool while being in non-interactive mode by supplying "-" as the file name. This is a good way to test how SqlTool will behave when processing your SQL files.

                      java -jar $HSQLDB_HOME/lib/sqltool.jar urlid -

                  This is how you have SqlTool read its input from another program:

                  Example 1.2. Piping input into SqlTool

                      echo "Some SQL commands with '$VARIABLES';" |
                      java -jar $HSQLDB_HOME/lib/sqltool.jar urlid -


                  Example 1.3. Redirecting input into SqlTool

                      java -jar $HSQLDB_HOME/lib/sqltool.jar urlid - < myFile.sql


                  For a shell not as graceful as the Bourne-compatible shells, you would need to type this all on the same line (or use a line-continuation trick).

                  [Warning]Warning

                  Beware of null stdin to SqlTool (or SqlFile). At least with Java 6 on UNIX, System.in returns megabytes of garbage for reads if stdin is closed. I consider this an obvious bug. Therefore, unlike any other program you would invoke from scripts, check stdin before running any Java program that will read from it. I consider this a big ugly bug in Java. This is not just theoretical, because many remote execution environments will have stdin closed off.

                  Make sure that you also read the Giving SQL on the Command Line section. The --sql and -p switches are great facilities to use with shell scripts.

                  Automation

                  SqlTool is ideal for mission-critical automation because, unlike other SQL tools, SqlTool returns a dependable exit status and gives you control over error handling and SQL transactions. Autocommit is off by default, so you can build a completely dependable solution by intelligently using \c commands (Continue upon Errors) and commit statements, and by verifying exit statuses.

                  Using the SqlTool Procedural Language, you have ultimate control over program flow, and you can use variables for database input and output as well as for many other purposes. See the SqlTool Procedural Language section.

                  [Tip]Tip

                  Since SqlTool religiously returns meaningful exit status, you can use the following idiom to send alerts about failed batch jobs (for example, jobs started by cron, at, AutoSys, Quartz, Hudson).

                  Example 1.4. Error-handling Idiom

                  java -jar $HSQLDB_HOME/lib/sqltool.jar urlid $HOME/app/myFile.sql >> $HOME/log/app.log 2>&1 ||
                  echo "See log file y:$HOME/log/app.log" | mailx -s "App aborted on host y" recip1@z.com recip2@z.com

                  Optimally Compatible SQL Files

                  If you want your SQL scripts optimally compatible among other SQL tools, then don't use any Special or PL Commands. SqlTool has default behavior which I think is far superior to the other SQL tools, but you will have to disable these defaults in order to have optimally compatible behavior.

                  These switches provide compatibility at the cost of poor control and error detection.

                  • --continueOnErr=true

                    The output will still contain error messages about everything that SqlTool doesn't like (malformatted commands, SQL command failures, empty SQL commands), but SqlTool will continue to run. Errors will not cause rollbacks (but that won't matter because of the following setting).

                  • --autoCommit

                  You don't have to worry about accidental expansion of PL variables, since SqlTool will never expand PL variables if you don't set any variables on the command line, or give any "* " PL commands. (And you could not have "* " commands in a compatible SQL file).

                  Comments

                  Comments of the form /*...*/ or -- behave as a SQL programmer would expect, in all contexts other than in interactive edit/history commands.

                  If a comment occurs outside of an SQL statement, SqlTool will not send the comment to the database (to improve performance). Raw mode can be used to send just comments to the database. In order to proactively catch accidents, SqlTool will complain if you attempt to send an empty SQL statement (i.e., just whitespace) to the database, even in raw mode.

                  Special Commands and Edit Buffer Commands in SQL Files

                  Generally, don't use Edit Buffer / History Commands in your sql files, because they won't work. Edit Buffer / History Commands are for interactive use only. However, the important scripting commands * VARNAME :, /: VARNAME, \x :, and \xq :, as well as Raw Mode do use the edit buffer.

                  You can, of course, use any SqlTool command at all interactively. The goal here is just to group together the commands most useful to script-writers.

                  \q [abort message]

                  Be aware that the \q command will cause SqlTool to completely exit. If a script x.sql has a \q command in it, then it doesn't matter if the script is executed like

                      java -jar .../sqltool.jar urlid a.sql x.sql z.sql

                  or if you use \i to read it in interactively, or if another SQL file uses \i to nest it. If \q is encountered, SqlTool will quit. See the SqlTool Procedural Language section for commands to abort an SQL file (or even parts of an SQL file) without causing SqlTool to exit.

                  \q takes an optional argument, which is an abort message. If you give an abort message, the message is displayed to the user and SqlTool will exit with a failure status. If you give no abort message, then SqlTool will exit quietly with successful status. As a result,

                      \q

                  means to make an immediate but successful exit, whereas

                      \q Message

                  means to abort immediately with error status. Both commands will exit gracefully.

                  \p [text to print]

                  Print the given string to stdout. Just give "\p" alone to print a blank line.

                  \l SEVERITY_LEVEL text to log

                  The logging subsystem will display and/or log and/or email or whatever, depending on how you have it configured. To see where messages go by default, just play with it interactively. Run "\l?" to list the available severity levels.

                  \i /path/to/file.sql

                  Include another SQL file at this location. You can use this to nest SQL files. For database installation scripts I often have a master SQL file which includes all of the other SQL files in the correct sequence. Be aware that the current continue-upon-error behavior will apply to included files until such point as the SQL file runs its own error handling commands.

                  \o [file/path.txt]

                  Tee output to the specified file (or stop doing so). See the Generating Text or HTML Reports section.

                  \=

                  A database-independent way to commit your SQL session. Useful for database which have no COMMIT SQL statement.

                  \a [true|false]

                  This turns on and off SQL transaction autocommits. Auto-commit defaults to false, but you can change that behavior by using the --autoCommit command-line switch.

                  \c [true|false]

                  A "true" setting tells SqlTool to Continue when errors are encountered. The current transaction will not be rolled back upon SQL errors, so if \c is true, then run the ROLLBACK; command yourself if that's what you want to happen. The default for interactive use is to continue upon error, but the default for non-interactive use is to abort upon error. You can override this behavior by using the --continueOnErr command-line switch.

                  With database setup scripts, I usually find it convenient to set "true" before dropping tables (so that things will continue if the tables aren't there), then set it back to false so that real errors are caught. DROP TABLE tablename IF EXISTS; is a more elegant, but less portable, way to accomplish the same thing.

                  [Tip]Tip

                  It depends on what you want your SQL files to do, of course, but I usually want my SQL files to abort when an error is encountered, without necessarily killing the SqlTool session. If this is the behavior that you want, then put an explicit \c false at the top of your SQL file and turn on continue-upon-error only for sections where you really want to permit errors, or where you are using PL commands to handle errors manually. This will give the desired behavior whether your script is called by somebody interactively, from the SqlTool command-line, or included in another SQL file (i.e. nested).

                  [Important]Important

                  The default settings are usually best for people who don't want to put in any explicit \c or error handling code at all. If you run SQL files from the SqlTool command line, then any errors will cause SqlTool to roll back and abort immediately. If you run SqlTool interactively and invoke SQL files with \i commands, the scripts will continue to run upon errors (and will not roll back). This behavior was chosen because there are lots of SQL files out there that produce errors which can be ignored; but we don't want to ignore errors that a user won't see. I reiterate that any and all of this behavior can (and often should) be changed by Special Commands run in your interactive shell or in the SQL files. Only you know whether errors in your SQL files can safely be ignored.

                  Getting Interactive Functionality with SQL Files

                  Some script developers may run into cases where they want to run with sql files but they also want SqlTool's interactive behavior. For example, they may want to do command recall in the sql file, or they may want to log SqlTool's command-line prompts (which are not printed in non-interactive mode). In this case, do not give the sql file(s) as an argument to SqlTool, but pipe them in instead, like

                  java -jar $HSQLDB_HOME/lib/sqltool.jar urlid < filepath1.sql > /tmp/log.html 2>&1

                  or

                  cat filepath1.sql... |
                  java -jar $HSQLDB_HOME/lib/sqltool.jar urlid > /tmp/log.html 2>&1

                  For a shell not as graceful as the Bourne-compatible shells, you would need to type this all on the same line (or use a line-continuation trick).

                  Character Encoding

                  There are several levels of encoding settings. First there are your platform defaults. These can be changed, temporarily or permanently, with system settings or environmental variables. Java system properties may be used to change the encodings for the JVM run. Finally, can specify a different encoding in your RC file, as documented in the RC File Authentication Setup section, though these will not effect stdin or stdout (as explained there). Programmatic users of SqlFile have complete control over encoding by setting up Readers and PrintWriters, or by using constructors with an encoding parameter. Developers should understand that where a SqlFile constructor takes a Reader or a PrintWriter parameter, we will not apply encoding settings to them, leaving that up to you.

                  Generating Text or HTML Reports

                  This section is about making a file containing the output of database queries. You can generate reports by using operating system facilities such as redirection, tee, and cutting and pasting. But it is much easier to use the "\o" and "\h" special commands.

                  [Note]Note

                  HTML reporting has been drastically modernized. It now has user-overridable boilerplates, flexible and safe CSS styles, and PL variable substitution.

                  Procedure 1.4. Writing query output to an external file

                  1. By default, everything will be done in plain text. If you want your report to be in HTML format, then give the special command \h true. If you do so, you will probably want to use filenames with an suffix of ".html" or ".htm" instead of ".txt" in the next step. You must set HTML mode to true before running the \o command of the next step, because this is how the \o command knows to write the opening HTML (header and such) to the file.

                  2. Run the command \o path/to/reportfile.txt. From this point on, output from your queries will be appended to the specified file. (I.e. another copy of the output is generated.) This way you can continue to monitor or use output as usual as the report is generated.

                  3. When you want SqlTool to stop writing to the file, run \o (or just quit SqlTool if you have no other work to do). If you are in HTML mode and you are finished writing the file (i.e. you will not append to it again later), then close it with \oc instead, to

                  4. If you turned HTML mode on before and want to turn it off now, run \h false.

                  It is not just the output of "SELECT" statements that will make it into the report file, but...

                  Kinds of output that get teed to \o files

                  • Output of SELECT statements.
                  • Output of all "\d" Special Commands. (I.e., "\dt", "\dv", etc., and "\d OBJECTNAME").
                  • Output of "\p" Special Commands. You will want to use this to add titles, and perhaps spacing, for the output of individual queries.

                  Other output will go to your screen or stdout, but will not make it into the report file. Be aware that no error messages will go into the report file. If SqlTool is run non-interactively (including if you give any SQL file(s) on the command line), SqlTool will abort with an error status if errors are encountered. The right way to handle errors is to check the SqlTool exit status. (The described error-handling behavior can be modified with SqlTool command-line switches and Special Commands).

                  [Warning]Warning

                  Remember that \o appends to the named file. If you want a new file, then use a new file name or remove the pre-existing target file ahead of time.

                  [Tip]Tip

                  So that I don't end up with a bunch of junk in my report file, I usually leave \o off while I perfect my SQL. With \o off, I perfect the SQL query until it produces on my screen exactly what I want saved to file. At this point I turn on \o and run ":/select/;" to repeat the last SQL command containing the given string ("select" in this example). If I have several complex queries to run, I turn \o off and repeat until I'm finished. (Every time you turn \o on, it will append to the file, just like we need).

                  Usually it doesn't come to mind that I need a wider screen until a query produces lines that are too long. In this case, stretch your window and repeat the last command with the ":;" Edit Buffer Command.

                  HTML output has its own *NULL_REP_HTML setting distinct from *NULL_REP_TOKEN. It fulfils *NULL_REP_TOKEN's output purpose of saying how to represent SQL nulls retrieved from VARCHAR columns, but lets you manage it for HTML separately from display and CSV/DSV output.

                  Several new features have been added to HTML reporting between revisions 4505 and 4606 inclusive. All of the new features are explained in comments in the working, sample SQL file below. If you write your own top boilerplate fragment, you will probably want to style the CSS classes written by SqlTool. These class names all begin with sqltool-, to avoid namespace collisions. Just generate a sample report to see which what class names get used.

                  A HTML report

                  The report above has a simple table dump and the basic column definitions for that table. You can, of course, make reports with any number of queries of any level of sophistication. The SQL file below generated this report.

                  Please study this example closely, because this is your principal source of education about the specifics of creating HTML reports. Notice the close at the very end with the explicit HTML-close command \oc. If you used just \o, the file would be closed but the closing HTML code would not be written. csv-sample.sql [1].

                  Example 1.5. Sample HTML Report Generation Script

                  /*
                   * $Id: html-report.sql 4564 2011-10-19 04:27:37Z unsaved $
                   *
                   * Sample/Template for writing an HTML Report
                   */
                  
                  -- Populate sample data
                  create table t (i integer, vc varchar(20));
                  insert into t values(1, 'one');
                  insert into t values(2, 'two');
                  insert into t values(3, 'three');
                  insert into t values(4, 'four');
                  insert into t values(5, 'five');
                  commit;
                  
                  
                  -- IMPORTANT:  \o will append by default.  If you want to write a new file,
                  -- it's your responsibility to check that a file of the same name does not
                  -- already exist (or remove it).
                  
                  
                  -- Follow the following examples to use your own HTML fragment files.
                  -- * *TOP_HTMLFRAG_FILE = /tmp/top.html
                  -- * *BOTTOM_HTMLFRAG_FILE = /tmp/bottom.html
                  
                  -- The default TOP_HTMLFRAG_FILE has a reference to this PL variable.
                  * REPORT_TITLE = Blaine's Sample Report
                  -- The default will also override its CSS style settings with your own if you
                  -- put them in a file named "overrides.css" in same directory alongside your
                  -- reports ("report.html" in this example).
                  -- You can add references to ${system.properties} and *{PL_VARIABLES} in
                  -- your own custom fragment files too.
                  
                  
                  -- Turn on HTML output mode.
                  -- Must enable HTML _before_ opening to write top frag.
                  \h true
                  \o report.html
                  \p A message to appear in the Report
                  SELECT * FROM t;
                  
                  -- Close off output just to show that you can go back and forth.
                  -- A close with '\o' will not write the bottom boilerplate that closes the HTML.
                  \o
                  \h false
                  \p Some non-HTML non-Report output:
                  SELECT count(*) FROM t;
                  
                  \h true
                  -- Re-open the report
                  \o report.html
                  \d t
                  -- This time close it with
                  \oc
                  


                  One thing that I chose not to exemplify in the example, so as not to scare away less technical users, is that you can use the \p variant command \pr. When you give a \p command in HTML mode, SqlTool formats the output into a paragraph. But coders may want to write HTML, Javascript, JSP, or similar code, and SqlTool should treat this as Raw to be written as-is to the report file. This is what \p accomplishes.

                  Storing and Retrieving Binary Files

                  You can upload binary files such as photographs, audio files, or serialized Java objects into database columns. SqlTool keeps one binary buffer which you can load from files with the \bl command, or from a database query by doing a one-row query for any non-displayable type (including BLOB, OBJECT, and OTHER). In the latter case, the data returned for the first non-displayable column of the first result row will be stored into the binary buffer.

                  Once you have data in the binary buffer, you can upload it to a database column (including BLOB, OBJECT, and OTHER type columns), or save it to a file. The former is accomplished by the special command \bp followed by a prepared SQL query containing one question mark place-holder to indicate where the data gets inserted. The latter is accomplished with the \bd command.

                  You can also store the output from normal, displayable column into the binary buffer by using the special command \b. The very first column value from the first result row of the next SQL command will be stored to the binary byte buffer.

                  Example 1.6. Inserting binary data into database from a file

                      \bl /tmp/favoritesong.mp3
                      \bp
                      INSERT INTO musictbl (id, stream) VALUES(3112, ?);

                  Example 1.7. Downloading binary data from database to a file

                      SELECT stream FROM musictbl WHERE id = 3112;
                      \bd /tmp/favoritesong.mp3

                  You can also store and retrieve text column values to/from ASCII files, as documented in the Essential PL Command section.

                  SqlTool Procedural Language

                  Aka PL

                  Most importantly, run SqlTool interactively and give the "*?" command to see what PL commands are available to you. I've tried to design the language features to be intuitive. Readers experience with significant shell scripting in any language can probably learn the rudiments by looking at (and running!) the sample script sample/pl.sql in your HyperSQL distribution [1] and then pick up everything else by using the *? command from within an interactive SqlTool session. (By significant shell scripting, I mean to the extent of using variables, for loops, etc.).

                  It generally causes an error to reference a variable that has not been set. SqlTool will always attempt to de-reference PL variable and Java system property references, except for (a) in : commands, and (b) in SQL statements if no user PL variable has been set. Since you should never be trying to dereference a PL variable if none have been set, the practical implications are just: If you want Java system properties to be de-referenced, just make sure that any PL user variable is set; and if you have strings like ${this} appear in your SQL text (which you do not want expanded), unset all user PL variables before executing that text (if any have been set earlier). The purpose of this system is to avoid changing user-specified SQL without the user knowing it. People who don't use PL at all don't have to worry about strings getting accidentally expanded.

                  PL is also used to upload and download column values to/from local ASCII files, analogously to the special \b commands for binary files. This is explained above in the Interactive Essential PL Command section above.

                  Nulls and Empty Strings

                  I am raising this PL variable topic out of order here because it is important to understand, and I'd like you to have the concept firmly in mind before digging into other details about variables. In this sub-section I am only talking about PL variable values (not system properties or SQL engine variables, etc.).

                  Very similarly to Java system properties, if the value of a PL variable is null, then the variable is unset; and (if you set the sqltool.REMOVE_EMPTY_VARS mode as suggested) there is no way to directly assign a variable to null. If, for example, you ran

                                * MYVAR = null

                  that would assign the string value of null to your variable, not the real null value. If a variable is assigned null indirectly, say by fetching a null cell value into a variable, or when variable ? is assigned null due to a SQL failure, this action is entirely equivalent to unsetting the variable.

                  [Important]Recap

                  If a variable is unset, or has never yet been set, then that variable's value is null. If a variable's value is null, then the variable is unset.

                  You can assign a PL variable the empty string value by using a command switch -P or --setVar. For example

                  java -jar .../sqltool.jar -Pvarname= urlid script.sql

                  You can see it's an empty string by echoing the value:

                  \p One*{varname}Two
                  OneTwo

                  With the next minor release of SqlTool, or now if you set Java system property sqltool.REMOVE_EMPTY_VARS to false, that you can use the vanilla PL assignment command to assign empty values like this:

                  * MYVAR =

                  Distinguishing Nulls from Empty Strings

                  You can't use the simplest Special Command \p to distinguish null variables, because (a) It is an error to expand an unset/null value with the ${x} construct, and the alternative ${:x} is safe but displays null values as if they were empty strings-- thereby not distinguishing. But don't fear. There are easy ways.

                  Unset/null variables are not listed by the commands * list or * listvalues. Therefore, say you want to know if variable MYVAR is set or not (stated differently, whether it is non-null or null). Run

                      * list MYVAR

                  . If it lists the variable then it is set and is not null.

                  You can use the * if command to compare your variable to the null value or to the empty string. The first test here will tell you if MYVAR is equal to null (by comparing it to reserved PL variable *NULL). The second test here compares MYVAR to a variable that you assigned the empty string to earlier.

                  Example 1.8. Explicit null and empty-string Tests

                      java -jar .../sqltool.jar -pEMPTYSTRING=
                      ....
                      * if (*MYVAR == **NULL)
                          \p MYVAR really is null
                      * end if
                      * if (*MYVAR == EMPTYSTING)
                          \p MYVAR is now an empty string
                      * end if


                  Definitely study the Special values for ?, and _ (or ~) Variables example.

                  Variables

                  Following subsections explain important things about specific variable types. Here we just list the variable types and give a few points about variable usage generally.

                  Variable Types

                  Database/SQL Variables

                  SqlTool has no control over variable mechanisms provided by the SQL implementation or database vendor. You can use such constructs only in SQL commands, since the other command types never reach the database engine. Nothing else that we have to say about manuals applies to database/SQL variables.

                  Java System Properties

                  SqlTool allows for reading but not writing of these variables with ${varname} and * listsysprops. To prevent your SQL text from being changed unintentionally, ${varname} occurrences will not be expanded inside of SQL statements unless at least one PL user variable has been set. Therefore, if executing portable SQL scripts (and by default), SqlTool will not expand ${varname}s inside of SQL statements.

                  PL User Variables

                  These variables have names beginning with a letter and (if the name is longer than one character) any number of letter, digit, or _ characters. The letters are case-specific. Two examples are m and MY_VAR. There variables are created and assigned values on the SqlTool command-line or with any of several PL assignment commands listed by the * ? command. Depending on context (see below about that), they are referenced as *{MY_VAR}, as *MY_VAR, or as MY_VAR. You can display all current user (and SqlTool system) variables with the PL command * listvalues.

                  SqlTool System PL Variables

                  These are PL variables just like PL user variables, but the variable names begin with the * character, like *DSV_TARGET_FILE, and they effect SqlTool system behavior. Some of these are initialized by SqlTool automatically. You can change and examine the values in the same way as PL user variables. See the following subsection about System PL Variables for details.

                  Reserved PL Variable ?

                  The ? variable is set automatically to the results of SQL statement executions. The reset state is the empty string, and it is only ever set to null (aka unset) if an SQL error was encountered.

                  *PL variables NULL and *NULL

                  These are actually reserved system and user PL variables, and since they are very unique and interchangeable with one another, I'm giving them their own bullet. These are reserved PL variables which always have the value of null (which has the meaning of unset. You can compare other variables to *NULL or NULL to see if they are set or not. A specific application is to compare ? to *NULL or NULL to see if the last SQL command has failed.

                  General Rules for PL vars and Java system props

                  • PL variables and Java system properties are always expanded in Special, and (most) PL commands if they are written like *{VARNAME} and ${VARNAME} correspondingly. They are expanded in the same way inside of SQL statements as long as one (or more) PL variable has been set.
                  • Your SQL scripts can give good feedback by displaying the value of variables with the "\p" Special command.

                  System PL Variables

                  [Important]Important

                  Definitely run command * ? to view in-program help about referencing PL variables, and run * ? assign if you will be assigning variables.

                  SqlTool automatically assign values to a few special system variables. As I write this, the special variables are only *START_TIME, *REVISION, *TIMESTAMP. *START_TIME is a date and time string formatted for the user's locale. *REVISION is SqlTool's version string (i.e., it is not a valid real or integer number). *TIMESTAMP is a user-configurable date or time string configurable with another system variable *TIMESTAMP_FORMAT.

                  SqlTool System PL variables are the mechanism used to configure SqlTool behavior. You can list all set PL variables by running the SqlTool command * listvalues. If a SqlTool System variable is not shown, then it is unset (which is equivalent to non-null). But if a system variable is not set, that doesn't mean that the setting behavior will be unset, but rather that the default behavior will apply. For example, if you * listvalues and the variable *DSV_COL_DELIM is not listed, that doesn't mean that there will be no DSV column delimiter, but that the default DSV column delimiter will be used. The in-program help can be used to determine what the default behavior is. (In the case of *DSV_COL_DELIM, you can see the default behavior by running \x?.

                  See the list of system variables in the SqlTool System PL Variables appendix.

                  PL Variables

                  This subsection explains points common to most or all of the PL variable varieties (all variables other than Database/SQL and Java system properties).

                  The new -p switch is an easy and elegant way to set PL variables when you know the needed values at SqlTool invocation time. This is a more user-friendly variant of the --setVar switch. The primary benefit is that you can specify multiple variable assignments using multiple -p switches, eliminating the need to separate name=value elements with commas (doing this necessitates the usage of \, escapes when there are commas in your intended variable values). The most basic usage is like -PNAME=value, but there are a few things to know to make this feature more useful. Firstly, the space after -p is optional, so you can write either -PNAME=value or -P NAME=value. Secondly, the 'p' itself is case-insensitive. You may choose to always user upper-case or always lower-case to be consistent. But if you do not put space after the p, I recommend that you change the capitalization of the p to more easily distinguish your variable names, like -pVARNAME=x and -Pvarname=y.

                  • PL variables are global to a SqlTool invocation and are therefore shared among

                    • --setVar command-line switches.
                    • -P or -p command-line switches.
                    • --sql command-line switches.
                    • auto.sql file, if it is present and the rules call for it to load.
                    • SQL files loaded with \i from top or a nested level.
                    • standard input whether from a terminal, redirection, or piping

                    The variable must, of course, be set at a point in time before it is referenced.

                  • Use the * list command to list some or all variables; or * listvalues to also see the values. (Exception: The *EXCEPTION variable can not be displayed with the list commands).
                  • Assignment

                    [Tip]A Mnemonic

                    The mnemonic distinction between assignment commands * VARNAME _ and * VARNAME ~ is that the latter shows the output, which you can think of as looking like ~ on your computer display. See the in-program help (*?) about the purpose and usage of these two commands.

                    Run the * ? command to see a list of commands that you can use to assign and to unset PL variables. The most simple assignment command is * VARNAME = Var value, but you can assign values from command output, query return values, contents of files, mathematical expressions, the edit buffer, etc.

                    Only the * VARNAME : assignment variant supports assigning a multi-line SQL statement(s) as body. To populate the edit buffer with your multi-line SQL query for the : assignment, you must execute the SQL command before (usually undesirable), or end the SQL with a blank line instead of a ; only works interactively), or use Raw Mode.

                  • You can also set PL variables other than ? using the --setVar and -P (also usable as -p) command-line switches. I give a very brief but useful example of this below.
                  • You can unset (remove) PL variables using the * - VARNAME command.
                  • It is an error in a Special and most PL commands to expand an unset (remove) variable with *{VARNAME} or ${VARNAME}. Therefore, if the variable/property may not be set, just add a colon like *{:VARNAME} or ${:VARNAME} to expand the variable if set, but expand to a zero-length string if the variable is not set.
                  • Inside of logical expressions (like inside of if and while commands), reference variables like *VARNAME, i.e. without the curly brace, and don't worry about a construct like ${:VARNAME} because it is legal to compare unset variables (all unset variables are equal to one another). The justfication for this simplification is explained below.
                  • The assignee variable name, and variables inside of mathematical expressions are written simply as bare words. For example: "* VARNAME = Var value (* there is a command prefix-- not part of the variable specifier) and "* ((VARNAME = OTHER_VARNAME * 6))".

                  PL commands can be used to upload and download column values to/from local ASCII files, but the corresponding actions for binary files use the special \b commands. This is because PL variables are used for ASCII values and you can store any number of column values in PL variables. This is not true for binary column values. The \b commands work with a single binary byte buffer.

                  See the SqlTool Procedural Language section below for information on using variables in other ways, and information on the other PL commands and features.

                  PL ? Variable

                  You don't set the ? variable. It is much like the Bourne shell variable $? in that it is always automatically set to the first value of a result set (or the return value of other SQL commands). It works very similarly to the * VARNAME ~ and * VARNAME ~ assignment commands, but the value of ? is set automatically without you doing anything. You can, of course, dereference ? like any PL variable or view it with * list or * listvalues. If you are running interactively or have turned on \c (continue-upon-error), you should be prepared that ? could get unset by SQL failures and thereby cause *{?} references to fail. (In which case the list commands still work, you can check it with an * if comparison, and the *{:?} construct will be safe (though this last does not show you the difference between empty string and null). The important thing to remember about the list commands is that variables that are not listed are unset (i.e., are null).

                  ? is reliably set to null only upon SQL failures. Upon SqlTool startup, ? is set to the empty string "" instead of being unset or null. If a query returns a null value in the last cell, then ? will be assigned to the current *DSV_NULL_REP value instead of the literal null value. Therefore if you enable continue-on-error with \c true (or in interactive mode when this is the default... though I can't think of how this could be useful interactively), you can test for SQL failures with

                      * if (*? == *NULL)

                  (*NULL is a reserved PL variable that always has the value of null, which means unset).

                  The important functional difference between variables assigned with VARNAME _ or VARNAME ~ vs. ? is that the latter is always set to the last SQL cell value fetched (or return value for non-result-set SQL). Explicit assignments with _ or ~ are made from the very next cell content retrieved after the _ or ~ command (or return value for non-result-set SQL). Easier to show what I mean than to explain it...

                  Example 1.9. Special values for ?, and _ (or ~) Variables

                  sql> \p At startup ? is equal to empty string.  See between A and B:  A*{?}B
                  At startup ? is equal to empty string.  See between A and B:  AB
                  sql> * if (A*{?}B == AB) \p ? is the empty string
                  ? is the empty string
                  sql> 
                  sql> CREATE TABLE t(i INTEGER, vc VARCHAR(20));
                  sql> INSERT INTO t VALUES(1, 'one');
                  1 row updated.
                  sql> INSERT INTO t VALUES(2, 'two');
                  1 row updated.
                  sql> * res ~
                  sql> SELECT * FROM t;
                  I  VC
                  -  ---
                  1  one
                  2  two
                  
                  Fetched 2 rows.
                  sql> \p *{?}
                  two
                  sql> \p *{res}
                  1
                  sql> * listvalues ? res
                  Listing all 'set' variables (any var not seen is unset and equal to null).
                  The outermost parentheses are not part of the values.
                      ?: (two)
                      res: (1)
                  sql> 
                  sql> INSERT INTO t VALUES (3, null);
                  1 row updated.
                  sql> *res ~
                  sql> SELECT vc FROM t WHERE i = 3;
                  [null]
                  sql> \p *{?}
                  [null]
                  sql> * if (*res == **NULL) \p res really is null
                  res really is null
                  sql> * listvalues ? res
                  Listing all 'set' variables (any var not seen is unset and equal to null).
                  The outermost parentheses are not part of the values.
                      ?: ([null])
                  sql> 
                  sql> -- This will prevent SqlTool from aborting when we run a bad SQL statement:
                  sql> \c true
                  Continue-on-error is set to true.
                  sql> *res ~
                  sql> SELECT hocus FROM pocus;
                  SEVERE  SQL Error at '<stdin>' line 23:
                  "SELECT hocus FROM pocus"
                  user lacks privilege or object not found: POCUS
                  sql> * if (*? == **NULL) \p ? really is null
                  ? really is null
                  SEVERE  Did not finish setting variable 'res' before a code block exited.
                  SEVERE  Rolling back SQL transaction.
                  sql> * if (*res == **NULL) \p res really is null
                  res really is null
                  sql> * listvalues ? res
                  Listing all 'set' variables (any var not seen is unset and equal to null).
                  The outermost parentheses are not part of the values.
                  sql>


                  (The SQL that generated this is available in the file nullempty.sql in the sample directory of your HyperSQL distribution.

                  Macros

                  Macros are just shortcut commands that you can run in place of the full commands which they stand for. Macros stand for SQL, Special or PL commands, whereas PL variables can only be used for elements within a command. It is very easy to define, list, and use macros. Run the command "/?" to see how. If you often run a particular query, then for the effort of about 5 extra keystrokes, you can define a macro for it so that you can enter just "/q;" to run it, whether the original query is 1 line or 40 lines. (You can use any name in place of "q", and the target command can be any kind of SQL, special, or PL command).

                  When you run/use a macro, you can append to the macro value. appendage in the "/?" listing shows where you can append additional text to the original command. So, if you define

                      sql> /= myworkers  SELECT name FROM employees

                  , you could narrow the query variously during different macro invocations, like

                      sql> /myworkers WHERE dept = 20;
                      sql> /myworkers WHERE name like 'Karen%';

                  Just like when recalling a command from history, you use ";" to execute even Special and PL macro commands.

                      sql> /= notate  \p Work completed by
                      sql> /notate Blaine;

                  If you don't type the ;, you will just recall the command to the buffer (from which you can execute or edit it, if you wish to).

                  To make a macro for a mult-line SQL statement, you use the "/: name" construct. First, get the target command into the command buffer. If you have already run the command, then run ":h" to see the command number and load it to the buffer like ":13". If you haven't run the command yet, then just enter the command, but end it with a blank line (and no semi-colon). You can check the buffer with ":b" to make sure it is what you want. Then just run "/: name" to define a macro with name "name".

                  SqlTool Functions

                  SqlTool functions are macros which take positional parameters. They are functions in the shell-programming sense. They do not return values in the sense of functions as distinguished from procedures or methods. As the /? in-program help shows, they can be defined by literal assignment or by buffer contents, and optional appendages work as one would want-- just like regular macros. They are intuitive to define and use, so one example should be all the instruction needed.

                  Example 1.10. Creating a SqlTool Function

                  \.
                  INSERT INTO t(i, vc) VALUES(*{1}, '*{2}');
                  SELECT * FROM t
                    WHERE i = *{1}
                  .
                  /: writeread()  AND audited is null


                  This is a non-trivial example where we insert into a table with some automatically generated columns, and we want to see the entire created record before deciding whether to commit the new record. Since what we want to do will take multiple lines of SQL, and indeed 2 SQL statements, we use raw mode to write the multi-line SQL statement to the edit buffer, then use the /: MACRONAME [appendage] construct to define a macro with body of the previous edit buffer contents. As described elsewhere, if you want to do this in a SQL file (as opposed to interactively), you have to use raw mode as we have done here. Just by assigning a name ending with () we have made a function instead of a regula macro. Notice how we used positional parameters references *{1} and *{2} in the macro body. We wanted to add a little to what was in the edit buffer, so we added an appendage to the /: command. Note the extra space after () or we would have ended up with resulting body of "... i = *{1}AND audited...".

                  Example 1.11. Invoking a SqlTool Function

                  /writeread(10, ten);


                  Not much to explain. Though the second character is for a string value to insert into the a varchar column, we wrote the function so that the function body supplies the single-quotes instead of having to type them in ever time we use the function. Leading and trailing white space is trimmed from each parameter. So if you want your value to have leading or trialing space, you will have to type in the quotes at invocation time. Another limitation caused by this convenient parsing is that functions just won't work when your invocation parameters need to contain commas. Just like for regular macros, the terminating ; causes the expanded macro to execute.

                  PL Sample

                  Here is a short SQL file that gives the specified user write permissions on some application tables.

                  Example 1.12. Simple SQL file using PL

                      /*
                         grantwrite.sql
                  
                         Run SqlTool like this:
                             java -jar path/to/sqltool.jar -pUSER=debbie grantwrite.sql
                       */
                  
                      /* Explicitly turn on PL variable expansion, in case no variables have
                         been set yet.  (Only the case if user did not set USER).
                      */
                  
                      GRANT all ON book TO *{USER};
                      GRANT all ON category TO *{USER};

                  Note that this script will work for any (existing) user just by supplying a different user name on the command-line. I.e., no need to modify the tested and proven script. There is no need for a commit statement in this SQL file since no DML is done. If the script is accidentally run without setting the USER variable, SqlTool will give a very clear notification of that.

                  Logical Expressions

                  Logical expressions occur only inside of logical expression parentheses in PL statements. For example, if (*var1 > astring) and while (*checkvar). (The parentheses after "foreach" do not enclose a logical expression, they just enclose a list).

                  Spaces are not allowed in elements of logical expressions. These are examples of illegal logical expressions: * while (two words), * if (*x == two words). You can certainly do what you want to do, however, by using variables to hold multi-word strings. You can achieve the goals for the two previous attempts with

                      *tmpVar = two words
                      * while (*tmpVar)
                      ...
                      * if (*x == *tmpVar)

                  It is critically important here to use *tmpvar instead of *{tmpvar} in this situation, because *{...} would not delay expansion and would therefore be equivalent to entering the multiple words.

                  SqlTool's logical expressions are purposefully minimalistic. We do not support nested operations or mixing with assignment commands. Notice that there are no ||, &&, AND, or OR operations in the table below. You can not assign the value of a boolean expression directly. You can achieve that goal with an * while and mathematical assignments.

                  As stated earlier, inside of logical expressions you should normally reference PL variables without curly braces. This syntatic simplification is allowed because multi-word tokens are not allowed in logical expressions (therefore {...} is not needed to group words). For example, "word", ">", and "*VARNAME" are all separate atoms.

                  You can indeed use the curly format like "*{THIS}" inside of logical expressions, but the casual user should stick to "*THIS". There is a difference between *{VARNAME} and *VARNAME inside logical expressions. *{VARNAME} is expanded one time when the parser first encounters the logical expression. *VARNAME is re-expanded every time that the expression is evaluated. So, you would never want to code * while (*{X} < 5) because the statement will always be true or always be false. (I.e. the following block will loop infinitely or will never run). Another difference between *{VARNAME} and *VARNAME is that the latter resolves to unset (this is very different from the empty string that *{:VARNAME} would resolve to).

                  If you do use the braces, make sure that the expansion value doesn't contain quotes or whitespace. (They would expand and then the expression would most likely no longer be a valid expression as listed in the table below). Quotes and whitespace are fine in *VARNAME variables, but it is the entire value that will be used in evaluations, regardless of whether quotes match up, etc. I.e. quotes and whitespace are not special to the token evaluator. Hence-- casual users should not use braces inside of logical expressions.

                  Though tokens inside logical expressions are atomic, you definitely can and should do tests on strings that contain spaces. You just have to use a variable for each such string value. For example, if I want to see if the special variable ? is equal to one two three, then you must do it like this:

                      * cfString = one  two three
                      * if (*cfString == ?)

                  As noted elsewhere in this guide, internal spaces are preserved as given. For assignments, trailing spaces are generally preserved. Leading spaces are preserved only for the : assignment commands.

                  Logical Operators

                  TOKEN

                  The token may be a literal, a *{VARNAME} which is expanded early, or a *VARNAME which is expanded late. (You usually do not want to use *{VARNAME} in logical expressions). False if the token is not set, empty, or "0". True otherwise.

                  TOKEN1 == TOKEN2

                  True if the two tokens are equivalent "strings".

                  TOKEN1 <> TOKEN2

                  Ditto.

                  TOKEN1 >< TOKEN2

                  Ditto.

                  TOKEN1 > TOKEN2

                  True if the TOKEN1 string is longer than TOKEN2 or is the same length but is greater according to a string sort.

                  TOKEN1 < TOKEN2

                  Similarly to TOKEN1 > TOKEN2.

                  ! LOGICAL_EXPRESSION

                  Logical negation of any of the expressions listed above.

                  TOKEN1 >= TOKEN2

                  True if the TOKEN1 string is longer than TOKEN2 or is the same length but is greater or equal value according to a string sort.

                  TOKEN1 => TOKEN2

                  Ditto.

                  TOKEN1 <= TOKEN2

                  Similarly to TOKEN1 >= TOKEN2.

                  TOKEN1 =< TOKEN2

                  Ditto.

                  *VARNAMEs in logical expressions, where the VARNAME variable is not set, evaluate to an empty string. Therefore (*UNSETVAR = 0) would be false, even though (*UNSETVAR) by itself is false and (0) by itself is false. Another way of saying this is that *VARNAME in a logical expression is equivalent to *{:VARNAME} out of a logical expression.

                  When developing scripts, you definitely should use SqlTool interactively to verify that SqlTool evaluates logical expressions as you expect. Just run * if commands that print something (i.e. \p) if the test expression is true.

                  Mathematical Assignments

                  Only integer math is supported, and only in mathematical assignment commands. Math assignment commands are of the format

                  <ASSIGNEE> <ASSIGNMENT_OP> <INTEGER_EXPRESSION>

                  For example,

                  SQUARE_FOOTAGE += (FOYER_FEET + 20) * 3 + 300 * BATHS

                  This works very close to Bash and Korn shell ((...)) integer math. The primary difference from those shells is that we prohibit useless non-assignment commands. Therefore, our math assignment commands always begin with the assignee variable name and an assignment operator.

                  Those users unfamiliar with programs that do strictly integer math should play around with it before using it for anything important. It may surprise you that real numbers like 2.9 are not automatically converted to an integer, but are simply prohibited; and that results of expressions are truncated to an integer, not rounded.

                  The list below is available from the program by running * ? (they are listed after the words "Assignment OPs:"). Note that though we support assignment operator ++, we do not support -- because that conflicts with our single-line comment delimiter --. The work-around is to use -=1 instead.

                  Mathmatical Assignment Operators

                  • =
                  • ++ (increment by 1, no expression allowed)
                  • -= (subtract value of the expression)
                  • += (add to...)
                  • /= (divide by...)
                  • %= (divide by expression and return remainder)

                  To the right of the assignment operator is the integer math expression consisting of raw variable names, integers, and mathematical operators. The variables referenced, if any, must all contain integer values. In the expression only user PL variables may be used. Not Java system properties nor SqlTool system PL variables.

                  The list below is available from the program by running * ? (they are listed after the words "Internal ops:").

                  Mathmatical Expression Operators

                  • INTEGER_USER_VARIABLE_NAME (resolve to its value)
                  • () (specify precedence)
                  • +
                  • -
                  • *
                  • / (division)
                  • % (division remainder)
                  • ^ (power)

                  Flow Control

                  Flow control works by conditionally executing blocks of Commands according to conditions specified by logical expressions.

                  [Important]Important

                  Definitely run command * ? control to view a list of the available flow control statements, and details about how to use them.

                  The conditionally executed blocks are called PL Blocks. These PL Blocks always occur between a PL flow control statement (like * foreach, *while, * if) and a corresponding * end PL Command (like * end foreach).

                  Definitely read the section Logical Expressions.

                  The values of control variables for * foreach and * forrows PL blocks will change as expected.

                  There are * break and * continue, which work as any shell scripter would expect them to. The * break command can also be used to quit the current SQL file without triggering any error processing. (I.e. processing will continue with the next line in the including SQL file or interactive session, or with the next SQL file if you supplied multiple on the command-line).

                  There is now also an inline * if command that is very handy and concise. Try these samples on.

                  Example 1.13. Inline If Statement

                      * if (*x == *NULL) \q Aborting program
                      ....
                      * while...
                          * if (*exitCondition) * break
                      ...
                      * if (*notableEvent) \l SEVERE Something bad happened


                  PL Example

                  Below is the example SQL file sample/pl.sql, which shows how to use most of the basic PL features [1]. If you have a question about how to use a particular PL feature, check this file in your distribution before asking for help... and definitely read the in-program help for * ? carefully! Give it a run, like

                  java -jar $HSQLDB_HOME/lib/sqltool.jar mem $HSQLDB_HOME/pl.jar

                  It will suggest that you re-run it with another parameter. Insert the new parameter before "mem".

                  Example 1.14. SQL File showing use of most PL features

                  /*
                      $Id: pl.sql 4564 2011-10-19 04:27:37Z unsaved $
                      SQL File to illustrate the use of some basic SqlTool PL features.
                      Invoke like
                          java -jar .../sqltool.jar mem .../pl.sql
                                                                           -- blaine
                  */
                  
                  * if (! *MYTABLE)
                      \p MYTABLE variable not set!
                      /* You could use \q to Quit SqlTool, but it's often better to just
                         break out of the current SQL file.
                         If people invoke your script from SqlTool interactively (with
                         \i yourscriptname.sql) any \q will kill their SqlTool session. */
                      \p Use argument "-pMYTABLE=mytablename" for SqlTool
                      * break
                  * end if
                  
                  -- Turning on Continue-upon-errors so that we can check for errors ourselves.
                  \c true
                  
                  \p
                  \p Loading up a table named '*{MYTABLE}'...
                  
                  CREATE TABLE *{MYTABLE} (
                      i int,
                      s varchar(20)
                  );
                  -- PL variable ? is always set to status or fetched value of last SQL
                  -- statement.  It will be null/unset if the last SQL statement failed.
                  \p CREATE status is *{?}
                  \p
                  
                  /* Validate our return status.
                     In case of success of a CREATE TABLE, *? will be 0, and therefore a
                     '* if (*?)' would be false.
                     So we follow the general practice of testing *? for the error indicator
                     value of null, using the reserved SqlTool system variable *NULL.
                   */
                  * if (*? == *NULL)
                      \p Our CREATE TABLE command failed.
                      * break
                  * end if
                  
                  -- Default Continue-on-error behavior is what you usually want
                  \c false
                  \p
                  
                  /* Insert data with a foreach loop.
                     These values could be from a read of another table or from variables
                     set on the command line like
                  */
                  \p Inserting some data into our new table
                  * foreach VALUE (12 22 24 15)
                      * if (*VALUE > 23)
                          \p Skipping *{VALUE} because it is greater than 23
                          * continue
                          \p YOU WILL NEVER SEE THIS LINE, because we just 'continued'.
                      * end if
                      INSERT INTO *{MYTABLE} VALUES (*{VALUE}, 'String of *{VALUE}');
                  * end foreach
                  \p
                  
                  /* This time instead of using the ? variable, we're assigning the SELECT value
                     to a User variable, 'themax'. */
                  * themax ~
                  /* Can put Special Commands and comments between "* VARNAME ~" and the target 
                     SQL statement. */
                  \p We're saving the max value for later.  You'll still see query output here:
                  SELECT MAX(i) FROM *{MYTABLE};
                  
                  /* No need to test for failure status (either ? or themax being unset/null),
                     because we are in \c mode and would have aborted if the SELECT failed. */
                  * if (0 == *themax)
                      \p Got 0 as the max value.
                      * break
                      \p YOU WILL NEVER SEE THIS LINE, because we just 'broke'.
                  * end if
                  
                  \p
                  \p ##############################################################
                  \p The results of our work:
                  SELECT * FROM *{MYTABLE};
                  \p MAX value is *{themax}
                  
                  \p
                  \p Counting down to exit
                  * ((i = 3))
                  * while (*i > 0)
                      \p *{i}...
                      * ((i -= 1))  -- i++ is supported but i-- is not, because -- marks comments
                  * end while
                  
                  \p
                  \p Everything worked.  Signing off.
                  

                  Chunking

                  We hereby call the ability to transmit multiple SQL commands to the database in one transmission chunking. Normally it's best to send SQL statements to the database one-at-a-time. That way, the database can give you or your program feedback about each statement. But there are situations where it is more important to transmit multiple-statements-at-a-time than to get feedback for each statement individually.

                  Why?

                  The first general reason to chunk SQL commands is performance. For standalone databases, the most common performance bottleneck is network latency. Chunking SQL commands can dramatically reduce network traffic.

                  The second reason is that there are a couple SQL commands which require the terminating ";" to be sent to the database engine. For simplicity and efficiency, it's usually better for general JDBC clients like SqlTool to strip off the final delimiter. Raw commands retains everything that the user types.

                  The third general reason to chunk SQL commands is if your database requires you to send multiple commands in one transmission. This is usually the case with the following types of commands:

                  • Nested SQL commands, like the nested CREATE SCHEMA variant, and most stored procedure, function, and trigger definitions.
                  • Commands containing non-quoted programming language to be interpreted by the database engine. Definitions of stored procedures, function, and triggers often contain code like this.

                  How?

                  Use raw mode. Go to the Raw Mode section to see how. You can enter any text at all, exactly how you want it to be sent to the database engine. Therefore, in addition to chunking SQL commands, you can give commands for non-SQL extensions to the database. For example, you could enter JavaScript code to be used in a stored procedure.

                  Raw Mode

                  You begin raw mode by issuing the Special Command "\.". You can then enter as much text in any format you want. When you are finished, enter a line consisting of only ".;" to store the input to the edit buffer and send it to the database server for execution.

                  You may end the raw input with a line consisting only of "." (instead of ".;"). This will just save the input to the edit buffer so that you can do things like edit it or create a macro/function/variable for it. To execute a database command after editing, use the command ":;" when you are satisfied (use ":b" to view buffer).

                  You may end the raw input with a line consisting only of "." You'll notice that your prompt will be the "raw" prompt between entering "\." and terminating the raw input with ".;" or ".".

                  Just by running commands beginning with BEGIN, DECLARE, CREATE function, or CREATE procedure, your SqlTool session will automatically be changed to Raw mode, exactly as if you had entered "\.". That's because these commands are universally used to define stored procedures or functions, and these commands require raw mode (as explained in the previous section). You can always switch to raw mode explicitly instead of depending on the automatic switching. Raw mode always requires you to indicate where the raw input ends, regardless of raw mode was entered explicitly or automatically. Trigger definition statements do not automatically switch to raw mode, because there are many trigger definitions where raw mode is not necessary-- therefore, you must explicitly use raw mode to define triggers which contain semi-colons.

                  Example 1.15. Interactive Raw Mode example

                      sql> \.
                      Enter RAW text.  No \, :, * commands.
                      End with a line containing only ".;" to send to database,
                      or only "." to store to edit buffer for editing or saving.
                      -----------------------------------------------------------
                      raw> line one;
                      raw> line two;
                      raw> line three;
                      raw> .
                      Raw chunk moved into buffer.  Run ":;" to execute the chunk.
                      sql> :;
                      Executing command from buffer:
                      line one;
                      line two;
                      line three;
                  
                      SQL Error at 'stdin' line 13:
                      "line one;
                      line two;
                      line three;"
                      Unexpected token: LINE
                      sql>


                  The error message "Unexpected token: LINE in statement [line]" comes from the database engine, not SqlTool. All three lines were transmitted to the database engine.

                  Edit Buffer Commands are not available when running SqlTool non-interactively.

                  SQL/PSM, SQL/JRT, and PL/SQL

                  This section covers database-engine-embedded languages, which are often used in the definition of stored procedures, stored functions, and triggers. SQL/PSM, SQL/JRT, and PL/SQ: are well known examples. We prefer SQL/PSM and SQL/JRT because unlike the alternatives, they are based on open SQL specifications.

                  [Note]Note

                  PL/SQL is not the same as PL. PL is the procedural language of SqlFile and is independent of your back-end database. PL commands always begin with *. PL/SQL is an Oracle-specific extension processed on the server side. You can not intermix PL and any server-embedded language (except for setting a PL variable to the output of execution), because when you enter server language to SqlTool, that input is not processed by SqlFile.

                  Use Raw Mode to send server-language code blocks to the database engine. You do not need to enter the "\." command to enter raw mode. Just begin a new SqlTool command line with "DECLARE", "BEGIN", "CREATE FUNCTION", or "CREATE PROCEDURE", and SqlTool will automatically put you into raw mode. See the Raw Mode section for details.

                  The following sample SQL file resides at sample/plsql.sql in your HyperSQL distribution [1]. This script will only work with Oracle, only if you have permission to create the table "T1" in the default schema, and if that object does not already exist.

                  Example 1.16. PL/SQL Example

                  /*
                   * $Id: plsql.sql 826 2009-01-17 05:04:52Z unsaved $
                   *
                   * This example is copied from the "Simple Programs in PL/SQL"
                   * example by Yu-May Chang, Jeff Ullman, Prof. Jennifer Widom at
                   * the Standord University Database Group's page
                   * http://www-db.stanford.edu/~ullman/fcdb/oracle/or-plsql.html .
                   * I have only removed some blank lines (in case somebody wants to
                   * copy this code interactively-- because you can't use blank
                   * lines inside of SQL commands in non-raw mode SqlTool when running
                   * it interactively); and, at the bottom I have  replaced the
                   * client-specific, non-standard command "run;" with SqlTool's
                   * corresponding command ".;" and added a plain SQL SELECT command
                   * to show whether the PL/SQL code worked.  - Blaine
                   */
                  
                  CREATE TABLE T1(
                      e INTEGER,
                      f INTEGER
                  );
                  
                  DELETE FROM T1;
                  
                  INSERT INTO T1 VALUES(1, 3);
                  
                  INSERT INTO T1 VALUES(2, 4);
                  
                  /* Above is plain SQL; below is the PL/SQL program. */
                  DECLARE
                  
                      a NUMBER;
                  
                      b NUMBER;
                  
                  BEGIN
                  
                      SELECT e,f INTO a,b FROM T1 WHERE e>1;
                  
                      INSERT INTO T1 VALUES(b,a);
                  
                  END;
                  
                  .;
                  /** The statement on the previous line, ".;" is SqlTool specific.
                   *  This command says to save the input up to this point to the
                   *  edit buffer and send it to the database server for execution.
                   *  I added the SELECT statement below to give imm
                   */
                  
                  /* This should show 3 rows, one containing values 4 and 2 (in this order)...*/
                  SELECT * FROM t1;
                  


                  Note that, inside of raw mode, you can use any kind of formatting that your database engine needs or permits: Whatever you enter-- blank lines, comments, everything-- will be transmitted to the database engine.

                  This file resides at testrun/sqltool/sqljrt.sql

                  Example 1.17. SQL/JRT Example

                  /*
                   * $Id: sqljrt.sql 3353 2009-12-15 19:52:13Z unsaved $
                   *
                   * Tests SQL/JRT
                   */
                  
                  create function dehex(VARCHAR(80), INTEGER)
                      returns INTEGER
                      no sql
                      language java
                      external name 'CLASSPATH:java.lang.Integer.valueOf'
                  .;
                  
                  CALL dehex('12', 16);
                  *if (*? != 18)
                      \q SQL/JRT function failed
                  *end if
                  


                  This file resides at testrun/sqltool/sqlpsm.sql

                  Example 1.18. SQL/PSM Example

                  /*
                   * $Id: sqlpsm.sql 826 2009-01-17 05:04:52Z unsaved $
                   *
                   * Tests SQL/JRT
                   */
                  
                  create table customers(
                      id INTEGER default 0, firstname VARCHAR(50), lastname VARCHAR(50),
                      entrytime TIMESTAMP);
                  
                  create procedure new_customer(firstname varchar(50), lastname varchar(50))
                      modifies sql data
                      insert into customers values (
                          default, firstname, lastname, current_timestamp)
                  .;
                  
                  SELECT count(*) FROM customers;
                  *if (*? != 0)
                      \q SQL/PSM preparation failed
                  *end if
                  
                  CALL new_customer('blaine', 'simpson');
                  
                  SELECT count(*) FROM customers;
                  *if (*? != 1)
                      \q SQL/PSM procedure failed
                  *end if
                  


                  Delimiter-Separated-Value Imports and Exports

                  SqlTool's DSV functionality encompasses what many users will recognize as CSV export, as well as portable backup or transfer of data. Those familiar with Oracle's SQL*Loader will recognize the extreme usefulness of the feature set. Besides database- and platform-independent data backups, exports can be used to deploy data sets with applications, to transfer data among multiple database instances (even drastically different database instances such as SQL Server and HyperSQL), and to properly change control data sets with a content management system such as a collaboration server or Subversion. To jump way ahead for a moment to whet your appetite, here is a sample import reject report which will can be generated automatically for you upon import just by setting the PL variable *DSV_REJECT_REPORT (to the desired destination HTML file name).

                  A DSV Import reject report

                  If you wish to, you can review the reject report before deciding whether to commit or roll back the inserts.

                  [Note]Note

                  This feature is independent of HyperSQL Text Tables. (See the Text Tables chapter of the HyperSQL User Guide for details about them). a server-side feature of HyperSQL. It makes no difference to SqlTool whether the source or target table of your export/import is a memory, cache, or text table. Indeed, like all features of SqlTool, it works fine with other JDBC databases. It works great, for example to migrate data from a table of one type to a table of another type, or to another schema, or to another database instance, or to another database system.

                  Most business type people would call this feature "CSV", but there is an important difference. Though "CSV" stands for Comma-Separated Values, the only thing actually distinctive about CSV is not the comma but the way that double-quotes are used for escaping purposes. As discussed in this section, with Delimiter-Separated-Value files, we purposefully choose an effective delimiter instead of the CSV method of using a delimiter which works in some cases and then use double-quoting to escape occurrence of the column-delimiter and of double-quote itself in the actual data. Just by choosing a delimiter which never needs escaping, we eliminate the whole double-quoting complication, and the data in our files always look just like the corresponding data in the database. To make this CSV / Delimiter-separated-value distinction clear, I use the suffix ".dsv" for my data files. This leads me to stipulate the abbreviation DSV for the Delimiter Separated Value feature of HyperSQL.

                  Use the \x command to eXport a table to a DSV file, and the \m command to iMport a DSV file into a pre-existing table. Use command \x? or \m? for a listing of all related commands and options.

                  The row and column delimiters may be any String (or even a regular expression for import), not just a single character. The export function is more general than just a table data exporter. Besides the trivial generalization that you may specify a view or other virtual table name in place of a table name, you can alternatively export the output of any query which produces normal text output. (This could actually even be multiple multiple-line SQL statements, as long as the last one outputs the needed data cells). A benefit to specifying even a simple query is that it allows you to export only some columns of a table, and to specify a WHERE clause to narrow down the rows to be exported (or perform any other SQL transformation, mapping, join, etc.). A specific use for this would be to exclude columns of binary data (which can be exported by other means, such as a PL loop to store binary values to files with the \bd command), or pseudo-or derived columns.

                  Note that the import command will not create a new table. This is because of the impossibility of guessing appropriate types and constraints based only on column names and a data sampling (which is all that a DSV-importer has access to). Therefore, if you wish to populate a new table, create the table before running the import. The import file does not need to have data for all columns of a table. The only required columns are those required by database constraints (non-null, indexes, keys, etc.) One specific reason to omit columns is if you want values of some columns to be created automatically by column DEFAULT settings, triggers, HyperSQL identity sequences, etc. Another reason would be to skip binary columns.

                  Due to wildly varying support and behavior of data and time types in SQL databases, SqlTool always converts date-type and time-type values being imported from DSV files using java.sql.Timestamps. This usually provides more resolution than is needed, but is required for portability. Therefore, questions about acceptable date/time formats are ultimately decided by the Java's java.sql.Timestamp class.

                  Simple DSV exports and imports using default settings

                  Even if you need to change delimiters, table names, or file names from the defaults, I suggest that you run one export and import with default settings as a practice run. A memory-only HyperSQL instance is ideal for test runs like this.

                  This command exports the table icf.projects to the file projects.dsv in the current directory (where you invoked SqlTool from). By default, the output file name will be the specified source table name plus the extension .dsv.

                  Example 1.19. DSV Export Example

                      SET SCHEMA icf;
                      \x projects


                  We could also have run \x icf.projects (which would have created a file named icf.projects.dsv) instead of changing the session schema. In this example we have chosen to make the export file name independent of the schema to facilitate importing it into a different schema.

                  Take a look at the output file. Notice that the first line consists of column names, not data. This line is present because it will be needed if the file is to used for a DSV import. Notice the following characteristics about the export data. The column delimiter is the pipe character "|". The record delimiter is the default line delimiter character(s) for your operating system. The string used to represent database NULLs is [null]. See the next section for how to change these from their default values.

                  [Warning]Warning

                  You can not DSV import Array values where any Array elements contain commas, for example an Array of VARCHARs which contain one or more commas. There is no such limitation on DSV exports, which you can use for purposes other than SqlTool importing, or you could use a script to change the commas to some other character.

                  This command imports the data from the file projects.dsv in the current directory (where you invoked SqlTool from) into the table newschema.projects. By default, the output table name will be the input filename after removing optional leading directory and trailing final extension.

                  Example 1.20. DSV Import Example

                      SET SCHEMA newschema;
                      \m projects.dsv


                  If the DSV file was named with the target schema, you would have skipped the SET SCHEMA command, like \m newschema.projects.dsv. In order to allow for more flexibility, the default input input delimiters are not exactly the same as the output delimiters. The input delimiters are regular expressions. The input column delimiter happens to be the regular expression corresponding exactly to "|"; but the input record delimiter matches UNIX, Windows, Mac, and HTTP line breaks.

                  Specifying queries and options

                  For a hands on example of a DSM import which generates an import report and uses some other options, change to directory HSQLDB/sample and play with the working script dsv-sample.sql [1]. You can execute it like

                      java -jar ../lib/sqltool.jar mem dsv-sample.sql

                  (assuming that you are using the supplied sqltool.rc file or have have urlid mem set up).

                  The header line in the DSV file is required at this time. (If there is user demand, it can be made optional for exporting, but it will remain required for importing).

                  Your export will fail if the output column or record delimiter, or the null representation value occurs in the data being exported. You change these values by setting the PL variables *DSV_COL_DELIM, *DSV_ROW_DELIM, *DSV_NULL_REP. Notice that the asterisk is part of the variable names, to indicate that these variables are used by SqlTool internally. Regular expressions have their own mechanism for including special characters. *DSV_NULL_REP effects normal displaying of VARCHAR output to screen or stdout, not just importing and exporting-- so you should reset the value if you want to revert to normal display behavior. When specifying output delimiters, you can use the escape sequences \n, \r, \f, \t, \\, and decimal, octal or hex specifications like \20, \020, \0x20. For example, to change the column delimiter to the tab character, you would give the command

                      * *DSV_COL_DELIM = \t

                  The input (\m) delimiter values, *DSV_COL_SPLITTER and *DSV_ROW_SPLITTER, are set using normal Perl/Java regexp syntax. There are escapes for specifying special characters, and anything else you would need. Input vs. output row and column delimiters are easily distinguished by containing "SPLITTER" for splitting input (\m) files; or "DELIM" for the delimiters that we will write (\x) among the data.

                  [Tip] *DSV...DELIM vs *DSV...SPLITTER settings

                  Both the ...DELIM and the ...SPLITTER settings are for delimiting cells of data, but whereas our DELIM values are literal things that SqlTool will write right into a DSV file, SPLITTER values are patterns for detecting the literal delimiters in existing DSV files.

                  The settings named like *DSV...SPLITTER are input delimiters specified as regular expressions following the rules in the API spec for java.util.regex.Pattern. The settings named like *DSV...SPLITTER are output delimiters specified as constant strings which can contain escape sequences to represent special characters (as documented in this section).

                  For imports, you must always specify the source DSV file path. If you want to export to a different file than one in the current directory named according to the source table, set the PL variable *DSV_TARGET_FILE, like

                      * *DSV_TARGET_FILE = /tmp/dtbl.dsv

                  For exports, you must always specify the source table name or query. If you want to import to a table other than that derived from the input DSV file name, set the PL variable *DSV_TARGET_TABLE. The table name may contain a schema name prefix.

                  You don't need to import all of the columns in a data file. To designate the fields to be skipped, iether set the PL PL variable *DSV_SKIP_COLUMNS, or replace the column names in the header line to "-" (hyphen). The value of *DSV_SKIP_COLUMNS is case-insensitive, and multiple column names are separated with white space and/or commas.

                  You can specify a query instead of a tablename with the \x command in order to filter or transform data from a table or view, or to export the output of a join, etc. You must set the PL variable *DSV_TARGET_FILE, as explained above (since there is no table name from which to automatically map a file name).

                  Example 1.21. DSV Export of an Arbitrary Query

                      * *DSV_TARGET_FILE = outfile.txt
                      \x SELECT entrydate, 2 * aval "Double aval", modtime FROM bs.dtbl


                  Note that I specified the column label alias "Double aval" so that the label for that column in the DSV file header will not be blank. You can type a query line as long long as you want to, but if you want to use a specified query that spans multiple lines, then you must use the command variant \x : to use the query in the previous edit buffer. (To populate the edit buffer with your multi-line SQL query, you must execute the command before... usually undesirable, or end the SQL with a blank line instead of a ;... only works interactively, or use Raw Mode).

                  By default, imports will abort as soon as a error is encountered during parsing the file or inserting data. If you invoke SqlTool with a SQL script on the command line, the failure will cause SqlTool to roll back and exit. If run interactively, you can decide whether to commit or roll back the rows that inserted before the failure. You can modify this behavior with the \a and \c settings.

                  If you set either a reject dsv file or a reject report file, then failures during imports will be reported but will not cause the import to abort. When run in this way, SqlTool will give you a report at the end about how many records were skipped, rejected, and successfully inserted. The reject dsv file is just a dsv file with exact copies of the dsv records that failed to insert. The reject report file is a HTML report which lists, for every rejected record, why that record was rejected. \m? will show you that the required PL variables for this functionality are *DSV_REJECT_FILE and *DSV_REJECT_REPORT. In both cases, you set the variable value to the path of the file which SqlTool will create.

                  Reject reports use the same templating system as SqlTool HTML reports. Therefore you can set SqlTool system PL variables *TOP_HTMLFRAG_FILE or *BOTTOM_HTMLFRAG_FILE to use your own opening and closing HTML and to completely replace the styling. If you use the default templates you can set user PL variable REPORT_TITLE for the obvious reason, and you can place a file named overrides.css into the same directory as your generated report, for the obvious purpose. You can use PL variable references in your own fragment files (remember to use the ${:VARNAME} construct to prevent errors for variables that are not set). You can also use automatically set variables like *TIMESTAMP and *REVISION

                  To allow for user-friendly entry of headers, we require that tables for DSV import/exports use standard column names. I.e., no column names that would require quoting in interactive SQL statements. The DSV import and export parsers are very smart and user-friendly. The data types of columns are checked so that the parser can make safe assumptions about white space and blank entries in the data. If a column is a JDBC Boolean type, for example, then we know that a field value of " True " obviously means "True", and that a field value of "" obviously means null. Since we require vanilla style column names, we allow white space anywhere in the header column. We allow blank lines anywhere (where "lines" are delimited by *DSV_ROW_DELIM). By default, commented lines are ignored, but this can be disabled (by setting DSV_SKIP_PREFIX to the empty string) or you can change the delimiter character from # to whatever you want (by setting DSV_SKIP_PREFIX to that value).

                  [Important]Use In-Program Help for Importing and Exporting

                  Run the command "\x?" or "\m?" to see the several system PL variables which you can set to adjust reject file behavior, commenting behavior, and other DSV features. The in-program help is the definitive reference for available options, not this manual.

                  You can also define some settings right in the DSV file, and you can even specify multiple header lines in a single DSV file. I use this last feature to import data from one data set into multiple tables that are joined. Since I don't have any more time to dedicate to explaining all of these features, I'll give you some examples from working DSV files and let you take it from there.

                  Example 1.22. Sample DSV headerswitch settings

                      # RCS keyword was here.
                  
                      headerswitch{
                      itemdef:name|-|-|hardness|breakdc|-
                      simpleitemdef:itemdef_name|maxvalue|weight|-|-|maxhp
                      }


                  I'll just note that the prefixes for the header rows must be of format target-table-name + :. You can use * for target-table-name here, for the obvious purpose.

                  Example 1.23. DSV targettable setting

                      targettable=t


                  This last example is from the SqlTool unit test file dsv-trimming.dsv. These special commands must be at the top of the file (before any normal data or header lines).

                  There is also the *DSV_CONST_COLS setting, which you can use to automatically write static, constant values to the specified columns of all inserted rows.

                  CSV Imports and Exports

                  The only difference between CSV and DSV is that CSVs allow presence of the column delimiter in the CSV file, and require the use of double-quotes to escape occurrences of both that column delimiter and of double-quotes in the real data cells. To enable this double-quote escaping, just use commands \xq and \mq instead of \x and \m. Since CSV is this double-quote escaping, SqlTool's \xq and \mq commands initiate CSV exports and imports. Conflicting with the name, CSV files do not need to use comma as the column delimiter, and the tab character is a common alternative. Since CSV importing and exporting is implemented as a sub-case of DSV import and exporting, everything in the Delimiter-Separated-Value Imports and Exports section applies, and CSV users should definitely read that section.

                  I should also mention the trivial difference between \xq and \x that if you do not specify *DSV_TARGET_FILE, the default filename suffix will be ".csv" instead of ".dsv".

                  Always use command \mq? or \xq? to list all available import and export options.

                  Settings Often of Interest to CSV User

                  *DSV_COL_DELIM

                  Set to what column delimiter to write to the CSV file. Values of "," and "\t" (without the quotes) are most common with CSVs. This is what SqlTool will use to separate the values in a single output CSV file line.

                  *DSV_COL_SPLITTER

                  Set to the column-delimiter character in the CSV file to be read. This is what SqlTool will use to split each line into multiple cell values. Values of "," and "\t" (without the quotes) are most common with CSVs.

                  *NULL_REP_TOKEN

                  This effects only data coming from or destined to columns with a string data type, because nulls can easily be distinguished from non-nulls for other data types. By default, SqlTool will distinguish between nulls and empty strings for string columns. Many CSV-support applications can't handle importing or exporting nulls. In you are interfacing to such an app, set Java system property 'sqltool.REMOVE_EMPTY_VARS' to false and set *NULL_REP_TOKEN to the empty string like "* *NULL_RP_TOKEN =". This will cause both nulls and empty strings to write empty strings to the export CSV file; and will cause empty strings in the import CSV file to create nulls. (The Java system property setting will become unnecessary with the next minor relase of SqlTool because that is going to be SqlTool's default behavior). *NULL_REP_TOKEN also effects how nulls in VARCHAR columns are represented in regular query output (non-exports), so after your exporting/importing you will often want to reset it with "* - *NULL_REP_TOKEN" unless you will be exiting SqlTool immediately.

                  *ALL_QUOTED

                  Every cell value will be quoted upon \xq, instead of just those values containing a column delimiter character or double-quote that needs escaping. *ALL_QUOTED does not effect the *NULL_REP_TOKEN. If you want the null-rep token to be double-quoted took, then you must set the *NULL_REP_TOKEN value itself to be double-quoted.

                  *DSV_REJECT_REPORT

                  Set this to the path of a HTML file that will be generated if any bad input records are encountered upon \mq. Instead of aborting, SqlTool will continue and import every record that it is able to. You can view the summary counts (always displayed) and/or the reject report before deciding whether to commit or rollback the new database records.

                  This sample shows everything you need to know to get going with CSV. csv-sample.sql [1].

                  Example 1.24. Sample CSV export + import script

                  /*
                   * $Id: csv-sample.sql 4812 2011-11-20 21:31:49Z unsaved $
                   *
                   * Create a table, CVSV-export the data, import it back.
                   */
                  
                  * *DSV_COL_DELIM = ,
                  * *DSV_COL_SPLITTER = ,
                  -- Following causes a reject report to be written if there are any bad records
                  -- during the import.  To test it, enable the "FORCE AN ERROR" block below.
                  * *DSV_REJECT_REPORT = import.html
                  
                  -- 1. SETTINGS
                  -- For applications like MS Excel, which can't import or export nulls, we have
                  -- to dummy down our database empty strings to export and import as if they
                  -- were nulls.
                  * *NULL_REP_TOKEN =
                  
                  -- Enable following line to quote every cell value
                  -- * *ALL_QUOTED = true
                  
                  
                  -- 2. SET UP TEST DATA
                  CREATE TABLE t (i INT, v VARCHAR(25), d DATE);
                  INSERT INTO t(i, v, d) VALUES (1, 'one two three', null);
                  INSERT INTO t(i, v, d) VALUES (2, null, '2007-06-24');
                  INSERT INTO t(i, v, d) VALUES (3, 'one,two,,three', '2007-06-24');
                  INSERT INTO t(i, v, d) VALUES (4, '"one"two""three', '2007-06-24');
                  INSERT INTO t(i, v, d) VALUES (5, '"one,two"three,', '2007-06-24');
                  INSERT INTO t(i, v, d) VALUES (6, '', '2007-06-24');
                  commit;
                  
                  -- 3. CSV EXPORT
                  /* Export */
                  \xq t
                  /*  FORCE AN ERROR.  Enable the following 3 lines to force a bad CSV record.
                  \o t.csv
                  \p barf
                  \o
                  */
                  
                  -- 4. BACK UP AND ZERO SOURCE TABLE
                  CREATE TABLE orig AS (SELECT * FROM t) WITH DATA;
                  DELETE FROM t;
                  commit;
                  
                  -- 5. CSV IMPORT
                  \mq t.csv
                  commit;
                  
                  -- 6. MANUALLY EXAMINE DIFFERENCES BETWEEN SOURCE AND IMPORTED DATA.
                  -- See <HSQLDB_ROOT>/testrun/sqltool/csv-roundtrip.sql to see a way to make
                  -- this same comparison programmatically.
                  * - *NULL_REP_TOKEN
                  \p
                  \p ORIGINAL:
                  SELECT * FROM orig;
                  \p
                  \p IMPORTED:
                  SELECT * FROM t;
                  \p
                  \p The empty string in the source table will have been translated to null in
                  \p the imported data.
                  \p You can see that the generated CSV file represents both nulls and
                  \p empty strings as nothing, hence the convergence.
                  


                  Unit Testing SqlTool

                  The SqlTool unit tests reside at testrun/sqltool in your HyperSQL distribution or source code repository. Just run runtests in that directory to execute all of the tests (except for non-Windows, non-UNIX, non-MacOS users, who must invoke ../../build/gradlew directly). Read the file README.txt to find out all about file naming conventions so that you can write your own SQL test script files.

                  The system requirements to run the tests is now just a Java 6 JRE. The real test runner is implemented in the Groovy script runtests.groovy. By just typing runtests, Windows and Linux (incl. MacOS) users will invoke their OS-specific scripts. All users can invoke Gradle manually instead if they wish to, using either ../../build/gradlew or a local Gradle installation. If you have Groovy installed, you can cut out all of the wrappers and invoke the Groovy script directly, like groovy runtests.groovy (or change the interpreter line within the script file to point to your own groovy path).



                  [1] To reduce the time I will need to spend maintaining this document, in this chapter I am giving the path to the sample directory as it is in HyperSQL 2.0.x distributions, namely, HSQLDB_HOME/sample. Users of HSQLDB before 2.0.x should translate these sample directory paths to use HSQLDB_HOME/src/org/hsqldb/sample/....


                  $Revision: 4904 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/util-guide/index.html0000644000175000017500000003364512007570302020724 0ustar renerene HyperSQL Utilities Guide

                  HyperSQL Utilities Guide

                  Edited by

                  The HSQLB Development Group

                  Edited by

                  Blaine Simpson

                  The HSQL Development Group

                  Edited by

                  Fred Toussi

                  The HSQL Development Group

                  Copyright 2002-2011 The HSQL Development Group. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license.

                  2012-08-06 00:15:58+0100


                  Table of Contents

                  Preface
                  Available formats for this document
                  1. SqlTool
                  Try It
                  Purpose, Coverage, Changes in Behavior
                  Platforms and SqlTool versions covered
                  Recent Functional Changes
                  New Features
                  The Bare Minimum
                  Quotes and Spaces
                  Embedding
                  Non-displayable Types
                  Compound commands or commands with semi-colons
                  Desktop shortcuts
                  Loading sample data
                  Satisfying SqlTool's CLASSPATH Requirements
                  Accessing older HSQLDB Databases with SqlTool
                  App-specific Classes, Embedding, and non-HyperSQL Databases
                  Distributing SqlTool with your Apps
                  SqlTool Client PCs
                  RC File Authentication Setup
                  Switching Data Sources
                  Using Inline RC Authentication
                  Logging
                  Interactive Usage
                  SqlTool Command-Line Editing
                  Command Types
                  Emulating Non-Interactive mode
                  Command Types
                  Special Commands
                  Edit Buffer / History Commands
                  Command History
                  PL Commands
                  Non-Interactive
                  Giving SQL on the Command Line
                  SQL Files
                  Piping and shell scripting
                  Automation
                  Optimally Compatible SQL Files
                  Comments
                  Special Commands and Edit Buffer Commands in SQL Files
                  Getting Interactive Functionality with SQL Files
                  Character Encoding
                  Generating Text or HTML Reports
                  Storing and Retrieving Binary Files
                  SqlTool Procedural Language
                  Nulls and Empty Strings
                  Variables
                  Macros
                  SqlTool Functions
                  PL Sample
                  Logical Expressions
                  Mathematical Assignments
                  Flow Control
                  PL Example
                  Chunking
                  Why?
                  How?
                  Raw Mode
                  SQL/PSM, SQL/JRT, and PL/SQL
                  Delimiter-Separated-Value Imports and Exports
                  Simple DSV exports and imports using default settings
                  Specifying queries and options
                  CSV Imports and Exports
                  Unit Testing SqlTool
                  2. Hsqldb Test Utility
                  3. Database Manager
                  Brief Introduction
                  Auto tree-update
                  Automatic Connection
                  RC File
                  Using the current DatabaseManagers with an older HSQLDB distribution.
                  DatabaseManagerSwing as an Applet
                  4. Transfer Tool
                  Brief Introduction
                  A. SqlTool System PL Variables
                  B. HyperSQL File Links

                  $Revision: 4904 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/util-guide/transfer-tool-chapt.html0000644000175000017500000001373012007570302023502 0ustar renerene Chapter 4. Transfer Tool

                  Chapter 4. Transfer Tool

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 4904 $

                  2012-08-06 00:15:58+0100

                  Table of Contents

                  Brief Introduction

                  Brief Introduction

                  Transfer Tool is a GUI program for transferring SQL schema and data from one JDBC source to another. Source and destination can be different database engines or different databases on the same server.

                  Transfer Tool works in two different modes. Direct transfer maintains a connection to both source and destination and performs the transfer. Dump and Restore mode is invoked once to transfer the data from the source to a text file (Dump), then again to transfer the data from the text file to the destination (Restore). With Dump and Restore, it is possible to make any changes to database object definitions and data prior to restoring it to the target.

                  Dump and Restore modes can be set via the command line with -d (--dump) or -r (--restore) options. Alternatively the Transfer Tool can be started with any of the three modes from the Database Manager's Tools menu.

                  The connection dialogue allows you to save the settings for the connection you are about to make. You can then access the connection in future sessions. These settings are shared with those from the Database Manager tool. See the appendix on Database Manager for details of the connection dialogue box.

                  From version 1.8.0 Transfer Tool is no longer part of the hsqldb.jar. You can build the hsqldbutil.jar using the Ant command of the same name, to build a jar that includes Transfer Tool and the Database Manager.

                  When collecting meta-data, Transfer Tool performs SELECT * FROM <table> queries on all the tables in the source database. This may take a long time with some database engines. When the source database is HSQLDB, this means memory should be available for the result sets returned from the queries. Therefore, the memory allocation of the java process in which Transfer Tool is executed may have to be high.

                  The current version of Transfer is far from ideal, as it has not been actively developed for several years. The program also lacks the ability to create UNIQUE constraints and creates UNIQUE indexes instead. However, some bugs have been fixed in the latest version and the program can be used with most of the supported databases. The best way to use the program is the DUMP and RESTORE modes, which allow you to manually change the SQL statements in the dump file before restoring to a database. A useful idea is to dump and restore the database definition separately from the database data.


                  $Revision: 4904 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/docbook.css0000644000175000017500000000506712007570374017017 0ustar renerene/* COMMENT: The shared.css stylesheet for the hsqldb/docs directory and elsewhere *? /* This material is published under the Copyrights and Licenses listed at */ /* and in the directory /hsqldb/docs/hsqldb_lic.txt */ a:visited { color: #000080; } a:link { color: #0000BB; } a:active { color: #0000FF; } span.guibutton, span.guilabel, span.guimenu, span.guimenuitem, span.guisubmenu { color: #000080; font-family:sans-serif; } span.guibutton, span.guilabel { font-weight:bold; } span.guimenu, span.guimenuitem, span.guisubmenu { font-style:italic; } div.caption { font-size: 80%; } /********** Admonitions *****************/ div.tip, div.note { background-color:#FFE4E1; border:2px solid gray; } div.warning, div.caution, div.important { background-color:#FFE4E1; border:2px solid black; } /****************************************/ pre.screen { background-color:#F5F5F5; border:1px solid gray; padding:5px; font-family:monospace; } pre.programlisting { background-color:#F0F8FF; border:1px solid gray; padding:5px; font-family:monospace; } div.variablelist { border:1px solid gray; padding:2px; } span.term { /* in a variablelist, also in dl dt */ font-weight:bold; padding-left:3px; padding-right:3px; color:#000080; } div.itemizedlist ul.disc li { margin-bottom:3px; } h1.title { font-size: 200%; /* Book title */ color:#000080; } h2.subtitle { font-size: 140%; } /* Book subtitle */ div.chapter h2.title, div.preface h2.title, div.appendix h2.title, div.index h2.title { /* All components */ font-size: 170%; font-weight: bold; color: #000080; } div.chapter h2.subtitle, div.preface h2.subtitle, div.appendix h2.subtitle, div.index h2.subtitle { font-size: 130%; } div.section h2.title { /* level1 sections */ font-size: 150%; font-weight: bold; color: #000080; } div.section h3.title { /* level2 sections */ font-size: 130%; font-weight: bold; } div.section h4.title { /* level3 sections */ font-size: 116%; font-weight: bold; margin-left: 10px; } div.section h5.title { /* level4 sections */ font-size: 110%; font-weight: bold; margin-left: 20px; } span.remark { background-color:#32cd32; font:normal bold 12px sans-serif; border:2px solid green; padding-left:2px; padding-right:2px; } img { border:0; padding:0; margin:0; } p.copyright { font-family:sans-serif; } div.variablelist tr { vertical-align:top; background-color:#E0E0E0; } div.variablelist span.term { white-space:nowrap; } hsqldb2.2-2.2.9.orig/hsqldb/doc/hsqldb_lic.txt0000644000175000017500000000313612007570374017525 0ustar renerene/* Copyright (c) 2001-2012, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/0000755000175000017500000000000012007570374016466 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/0000755000175000017500000000000012007570374017255 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/0000755000175000017500000000000012007570374020044 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/hsqldb/0000755000175000017500000000000012007570374021321 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/hsqldb/Tokens.java0000644000175000017500000043057412007570374023444 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; import org.hsqldb.lib.IntKeyHashMap; import org.hsqldb.lib.IntValueHashMap; import org.hsqldb.lib.OrderedIntHashSet; /** * Defines and enumerates reserved and non-reserved SQL keywords.

                  * * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since 1.7.2 */ public class Tokens { // // SQL 200n reserved words full set static final String T_ABS = "ABS"; public static final String T_ALL = "ALL"; static final String T_ALLOCATE = "ALLOCATE"; public static final String T_ALTER = "ALTER"; static final String T_AND = "AND"; public static final String T_ANY = "ANY"; static final String T_ARE = "ARE"; public static final String T_ARRAY = "ARRAY"; public static final String T_ARRAY_AGG = "ARRAY_AGG"; public static final String T_AS = "AS"; static final String T_ASENSITIVE = "ASENSITIVE"; static final String T_ASYMMETRIC = "ASYMMETRIC"; static final String T_AT = "AT"; static final String T_ATOMIC = "ATOMIC"; public static final String T_AUTHORIZATION = "AUTHORIZATION"; public static final String T_AVG = "AVG"; static final String T_BEGIN = "BEGIN"; static final String T_BETWEEN = "BETWEEN"; public static final String T_BIGINT = "BIGINT"; public static final String T_BINARY = "BINARY"; static final String T_BIT_LENGTH = "BIT_LENGTH"; public static final String T_BLOB = "BLOB"; public static final String T_BOOLEAN = "BOOLEAN"; static final String T_BOTH = "BOTH"; static final String T_BY = "BY"; public static final String T_CALL = "CALL"; static final String T_CALLED = "CALLED"; static final String T_CARDINALITY = "CARDINALITY"; public static final String T_CASCADED = "CASCADED"; static final String T_CASE = "CASE"; static final String T_CAST = "CAST"; static final String T_CEIL = "CEIL"; static final String T_CEILING = "CEILING"; public static final String T_CHAR = "CHAR"; static final String T_CHAR_LENGTH = "CHAR_LENGTH"; public static final String T_CHARACTER = "CHARACTER"; static final String T_CHARACTER_LENGTH = "CHARACTER_LENGTH"; public static final String T_CHECK = "CHECK"; public static final String T_CLOB = "CLOB"; static final String T_CLOSE = "CLOSE"; static final String T_COALESCE = "COALESCE"; public static final String T_COLLATE = "COLLATE"; static final String T_COLLECT = "COLLECT"; static final String T_COLUMN = "COLUMN"; public static final String T_COMMIT = "COMMIT"; static final String T_CONDITION = "CONDIITON"; public static final String T_CONNECT = "CONNECT"; public static final String T_CONSTRAINT = "CONSTRAINT"; public static final String T_CONVERT = "CONVERT"; static final String T_CORR = "CORR"; static final String T_CORRESPONDING = "CORRESPONDING"; static final String T_COUNT = "COUNT"; static final String T_COVAR_POP = "COVAR_POP"; static final String T_COVAR_SAMP = "COVAR_SAMP"; public static final String T_CREATE = "CREATE"; static final String T_CROSS = "CROSS"; static final String T_CUBE = "CUBE"; static final String T_CUME_DIST = "CUME_DIST"; static final String T_CURRENT = "CURRENT"; static final String T_CURRENT_CATALOG = "CURRENT_CATALOG"; static final String T_CURRENT_DATE = "CURRENT_DATE"; static final String T_CURRENT_DEFAULT_TRANSFORM_GROUP = "CURRENT_DEFAULT_TRANSFORM_GROUP"; static final String T_CURRENT_PATH = "CURRENT_PATH"; static final String T_CURRENT_ROLE = "CURRENT_ROLE"; static final String T_CURRENT_SCHEMA = "CURRENT_SCHEMA"; static final String T_CURRENT_TIME = "CURRENT_TIME"; static final String T_CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP"; static final String T_CURRENT_TRANSFORM_GROUP_FOR_TYPE = "CURRENT_TRANSFORM_GROUP_FOR_TYPE"; static final String T_CURRENT_USER = "CURRENT_USER"; static final String T_CURSOR = "CURSOR"; static final String T_CYCLE = "CYCLE"; public static final String T_DATE = "DATE"; public static final String T_DAY = "DAY"; static final String T_DEALLOCATE = "DEALLOCATE"; public static final String T_DEC = "DEC"; public static final String T_DECIMAL = "DECIMAL"; static final String T_DECLARE = "DECLARE"; public static final String T_DEFAULT = "DEFAULT"; public static final String T_DELETE = "DELETE"; static final String T_DENSE_RANK = "DENSE_RANK"; static final String T_DEREF = "DEREF"; static final String T_DESCRIBE = "DESCRIBE"; static final String T_DETERMINISTIC = "DETERMINISTIC"; static final String T_DISCONNECT = "DISCONNECT"; static final String T_DISTINCT = "DISTINCT"; public static final String T_DO = "DO"; public static final String T_DOUBLE = "DOUBLE"; static final String T_DROP = "DROP"; static final String T_DYNAMIC = "DYNAMIC"; static final String T_EACH = "EACH"; static final String T_ELEMENT = "ELEMENT"; static final String T_ELSE = "ELSE"; static final String T_ELSEIF = "ELSEIF"; static final String T_END = "END"; static final String T_END_EXEC = "END_EXEC"; static final String T_ESCAPE = "ESCAPE"; static final String T_EVERY = "EVERY"; static final String T_EXCEPT = "EXCEPT"; static final String T_EXEC = "EXEC"; public static final String T_EXECUTE = "EXECUTE"; static final String T_EXISTS = "EXISTS"; static final String T_EXP = "EXP"; public static final String T_EXTERNAL = "EXTERNAL"; static final String T_EXTRACT = "EXTRACT"; public static final String T_FALSE = "FALSE"; static final String T_FETCH = "FETCH"; static final String T_FILTER = "FILTER"; static final String T_FIRST_VALUE = "FIRST_VALUE"; public static final String T_FLOAT = "FLOAT"; static final String T_FLOOR = "FLOOR"; public static final String T_FOR = "FOR"; public static final String T_FOREIGN = "FOREIGN"; static final String T_FREE = "FREE"; public static final String T_FROM = "FROM"; static final String T_FULL = "FULL"; public static final String T_FUNCTION = "FUNCTION"; static final String T_FUSION = "FUSION"; public static final String T_GET = "GET"; static final String T_GLOBAL = "GLOBAL"; public static final String T_GRANT = "GRANT"; static final String T_GROUP = "GROUP"; static final String T_GROUPING = "GROUPING"; static final String T_HANDLER = "HANDLER"; static final String T_HAVING = "HAVING"; static final String T_HOLD = "HOLD"; public static final String T_HOUR = "HOUR"; static final String T_IDENTITY = "IDENTITY"; static final String T_IF = "IF"; static final String T_IMPORT = "IMPORT"; static final String T_IN = "IN"; static final String T_INDICATOR = "INDICATOR"; static final String T_INNER = "INNER"; static final String T_INOUT = "INOUT"; static final String T_INSENSITIVE = "INSENSITIVE"; public static final String T_INSERT = "INSERT"; public static final String T_INT = "INT"; public static final String T_INTEGER = "INTEGER"; static final String T_INTERSECT = "INTERSECT"; static final String T_INTERSECTION = "INTERSECTION"; public static final String T_INTERVAL = "INTERVAL"; static final String T_INTO = "INTO"; static final String T_ITERATE = "ITERATE"; public static final String T_IS = "IS"; static final String T_JAR = "JAR"; // SQL/JRT static final String T_JOIN = "JOIN"; static final String T_LAG = "LAG"; public static final String T_LANGUAGE = "LANGUAGE"; static final String T_LARGE = "LARGE"; static final String T_LAST_VALUE = "LAST_VALUE"; static final String T_LATERAL = "LATERAL"; static final String T_LEAD = "LEAD"; static final String T_LEADING = "LEADING"; static final String T_LEAVE = "LEAVE"; static final String T_LEFT = "LEFT"; static final String T_LIKE = "LIKE"; static final String T_LIKE_REGX = "LIKE_REGX"; static final String T_LN = "LN"; public static final String T_LOCAL = "LOCAL"; static final String T_LOCALTIME = "LOCALTIME"; static final String T_LOCALTIMESTAMP = "LOCALTIMESTAMP"; public static final String T_LOOP = "LOOP"; static final String T_LOWER = "LOWER"; static final String T_MATCH = "MATCH"; static final String T_MAX = "MAX"; static final String T_MAX_CARDINALITY = "MAX_CARDINALITY"; static final String T_MEMBER = "MEMBER"; static final String T_MERGE = "MERGE"; static final String T_METHOD = "METHOD"; static final String T_MIN = "MIN"; public static final String T_MINUTE = "MINUTE"; static final String T_MOD = "MOD"; static final String T_MODIFIES = "MODIFIES"; static final String T_MODULE = "MODULE"; public static final String T_MONTH = "MONTH"; public static final String T_MULTISET = "MULTISET"; static final String T_NATIONAL = "NATIONAL"; static final String T_NATURAL = "NATURAL"; static final String T_NCHAR = "NCHAR"; static final String T_NCLOB = "NCLOB"; static final String T_NEW = "NEW"; public static final String T_NO = "NO"; public static final String T_NONE = "NONE"; static final String T_NORMALIZE = "NORMALIZE"; static final String T_NOT = "NOT"; static final String T_NTH_VALUE = "NTH_VALUE"; static final String T_NTILE = "NTILE"; public static final String T_NULL = "NULL"; public static final String T_NULLIF = "NULLIF"; public static final String T_NUMERIC = "NUMERIC"; static final String T_OCCURRENCES_REGEX = "OCCURRENCES_REGEX"; static final String T_OCTET_LENGTH = "OCTET_LENGTH"; static final String T_OF = "OF"; static final String T_OFFSET = "OFFSET"; static final String T_OLD = "OLD"; public static final String T_ON = "ON"; public static final String T_ONLY = "ONLY"; static final String T_OPEN = "OPEN"; static final String T_OR = "OR"; static final String T_ORDER = "ORDER"; static final String T_OUT = "OUT"; static final String T_OUTER = "OUTER"; static final String T_OVER = "OVER"; static final String T_OVERLAPS = "OVERLAPS"; static final String T_OVERLAY = "OVERLAY"; static final String T_PARAMETER = "PARAMETER"; static final String T_PARTITION = "PARTITION"; static final String T_PERCENT_RANK = "PERCENT_RANK"; static final String T_PERCENTILE_CONT = "PERCENTILE_CONT"; static final String T_PERCENTILE_DISC = "PERCENTILE_DISC"; static final String T_POSITION = "POSITION"; static final String T_POSITION_REGEX = "POSITION_REGEX"; static final String T_POWER = "POWER"; static final String T_PRECISION = "PRECISION"; static final String T_PREPARE = "PREPARE"; static final String T_PRIMARY = "PRIMARY"; public static final String T_PROCEDURE = "PROCEDURE"; static final String T_RANGE = "RANGE"; static final String T_RANK = "RANK"; static final String T_READS = "READS"; public static final String T_REAL = "REAL"; static final String T_RECURSIVE = "RECURSIVE"; static final String T_REF = "REF"; public static final String T_REFERENCES = "REFERENCES"; static final String T_REFERENCING = "REFERENCING"; static final String T_REGR_AVGX = "REGR_AVGX"; static final String T_REGR_AVGY = "REGR_AVGY"; static final String T_REGR_COUNT = "REGR_COUNT"; static final String T_REGR_INTERCEPT = "REGR_INTERCEPT"; static final String T_REGR_R2 = "REGR_R2"; static final String T_REGR_SLOPE = "REGR_SLOPE"; static final String T_REGR_SXX = "REGR_SXX"; static final String T_REGR_SXY = "REGR_SXY"; static final String T_REGR_SYY = "REGR_SYY"; static final String T_RELEASE = "RELEASE"; static final String T_REPEAT = "REPEAT"; static final String T_RESIGNAL = "RESIGNAL"; public static final String T_RESULT = "RESULT"; static final String T_RETURN = "RETURN"; static final String T_RETURNS = "RETURNS"; static final String T_REVOKE = "REVOKE"; static final String T_RIGHT = "RIGHT"; public static final String T_ROLLBACK = "ROLLBACK"; static final String T_ROLLUP = "ROLLUP"; public static final String T_ROW = "ROW"; static final String T_ROW_NUMBER = "ROW_NUMBER"; public static final String T_ROWS = "ROWS"; static final String T_SAVEPOINT = "SAVEPOINT"; static final String T_SCOPE = "SCOPE"; static final String T_SCROLL = "SCROLL"; static final String T_SEARCH = "SEARCH"; public static final String T_SECOND = "SECOND"; public static final String T_SELECT = "SELECT"; static final String T_SENSITIVE = "SENSITIVE"; static final String T_SESSION_USER = "SESSION_USER"; public static final String T_SET = "SET"; static final String T_SIGNAL = "SIGNAL"; static final String T_SIMILAR = "SIMILAR"; public static final String T_SMALLINT = "SMALLINT"; static final String T_SOME = "SOME"; public static final String T_SPECIFIC = "SPECIFIC"; static final String T_SPECIFICTYPE = "SPECIFICTYPE"; public static final String T_SQL = "SQL"; static final String T_SQLEXCEPTION = "SQLEXCEPTION"; static final String T_SQLSTATE = "SQLSTATE"; static final String T_SQLWARNING = "SQLWARNING"; static final String T_SQRT = "SQRT"; static final String T_START = "START"; static final String T_STATIC = "STATIC"; static final String T_STDDEV_POP = "STDDEV_POP"; static final String T_STDDEV_SAMP = "STDDEV_SAMP"; static final String T_SUBMULTISET = "SUBMULTISET"; static final String T_SUBSTRING = "SUBSTRING"; static final String T_SUBSTRING_REGEX = "SUBSTRING_REGEX"; static final String T_SUM = "SUM"; static final String T_SYMMETRIC = "SYMMETRIC"; static final String T_SYSTEM = "SYSTEM"; static final String T_SYSTEM_USER = "SYSTEM_USER"; public static final String T_TABLE = "TABLE"; static final String T_TABLESAMPLE = "TABLESAMPLE"; static final String T_THEN = "THEN"; public static final String T_TIME = "TIME"; public static final String T_TIMESTAMP = "TIMESTAMP"; public static final String T_TIMEZONE_HOUR = "TIMEZONE_HOUR"; public static final String T_TIMEZONE_MINUTE = "TIMEZONE_MINUTE"; public static final String T_TO = "TO"; static final String T_TRAILING = "TRAILING"; public static final String T_TRANSLATE = "TRANSLATE"; static final String T_TRANSLATE_REGEX = "TRANSLATE_REGEX"; static final String T_TRANSLATION = "TRANSLATION"; static final String T_TREAT = "TREAT"; public static final String T_TRIGGER = "TRIGGER"; static final String T_TRIM = "TRIM"; static final String T_TRIM_ARRAY = "TRIM_ARRAY"; public static final String T_TRUE = "TRUE"; public static final String T_TRUNCATE = "TRUNCATE"; static final String T_UESCAPE = "UESCAPE"; static final String T_UNION = "UNION"; public static final String T_UNIQUE = "UNIQUE"; public static final String T_UNKNOWN = "UNKNOWN"; static final String T_UNNEST = "UNNEST"; static final String T_UNTIL = "UNTIL"; public static final String T_UPDATE = "UPDATE"; static final String T_UPPER = "UPPER"; public static final String T_USER = "USER"; static final String T_USING = "USING"; static final String T_VALUE = "VALUE"; static final String T_VALUES = "VALUES"; static final String T_VAR_POP = "VAR_POP"; static final String T_VAR_SAMP = "VAR_SAMP"; public static final String T_VARBINARY = "VARBINARY"; public static final String T_VARCHAR = "VARCHAR"; static final String T_VARYING = "VARYING"; static final String T_WHEN = "WHEN"; static final String T_WHENEVER = "WHENEVER"; static final String T_WHERE = "WHERE"; public static final String T_WHILE = "WHILE"; static final String T_WIDTH_BUCKET = "WIDTH_BUCKET"; static final String T_WINDOW = "WINDOW"; public static final String T_WITH = "WITH"; static final String T_WITHIN = "WITHIN"; static final String T_WITHOUT = "WITHOUT"; public static final String T_YEAR = "YEAR"; // ops static final String T_ASTERISK = "*"; public static final String T_COMMA = ","; static final String T_CIRCUMFLEX = "^"; static final String T_CLOSEBRACKET = ")"; static final String T_COLON = ":"; static final String T_CONCAT = "||"; public static final String T_DIVIDE = "/"; static final String T_EQUALS = "="; static final String T_GREATER = ">"; static final String T_GREATER_EQUALS = ">="; public static final String T_LEFTBRACKET = "["; static final String T_LESS = "<"; static final String T_LESS_EQUALS = "<="; static final String T_PERCENT = "%"; static final String T_PLUS = "+"; static final String T_MINUS = "-"; static final String T_NOT_EQUALS = "<>"; static final String T_NOT_EQUALS_ALT = "!="; static final String T_OPENBRACKET = "("; static final String T_QUESTION = "?"; public static final String T_RIGHTBRACKET = "]"; static final String T_SEMICOLON = ";"; static final String T_DOUBLE_COLON = "::"; // SQL:200n non-reserved word list static final String T_A = "A"; static final String T_ABSOLUTE = "ABSOLUTE"; static final String T_ACTION = "ACTION"; static final String T_ADA = "ADA"; static final String T_ADD = "ADD"; static final String T_ADMIN = "ADMIN"; static final String T_AFTER = "AFTER"; static final String T_ALWAYS = "ALWAYS"; static final String T_ASC = "ASC"; static final String T_ASSERTION = "ASSERTION"; static final String T_ASSIGNMENT = "ASSIGNMENT"; static final String T_ATTRIBUTE = "ATTRIBUTE"; static final String T_ATTRIBUTES = "ATTRIBUTES"; static final String T_BEFORE = "BEFORE"; static final String T_BERNOULLI = "BERNOULLI"; public static final String T_BIT = "BIT"; static final String T_BITLENGTH = "BITLENGTH"; static final String T_BREADTH = "BREADTH"; static final String T_C = "C"; static final String T_CASCADE = "CASCADE"; public static final String T_CATALOG = "CATALOG"; public static final String T_CATALOG_NAME = "CATALOG_NAME"; static final String T_CHAIN = "CHAIN"; static final String T_CHARACTER_SET_CATALOG = "CHARACTER_SET_CATALOG"; static final String T_CHARACTER_SET_NAME = "CHARACTER_SET_NAME"; static final String T_CHARACTER_SET_SCHEMA = "CHARACTER_SET_SCHEMA"; static final String T_CHARACTERISTICS = "CHARACTERISTICS"; static final String T_CHARACTERS = "CHARACTERS"; static final String T_CLASS_ORIGIN = "CLASS_ORIGIN"; static final String T_COBOL = "COBOL"; public static final String T_COLLATION = "COLLATION"; static final String T_COLLATION_CATALOG = "COLLATION_CATALOG"; static final String T_COLLATION_NAME = "COLLATION_NAME"; static final String T_COLLATION_SCHEMA = "COLLATION_SCHEMA"; static final String T_COLUMN_NAME = "COLUMN_NAME"; static final String T_COMMAND_FUNCTION = "COMMAND_FUNCTION"; static final String T_COMMAND_FUNCTION_CODE = "COMMAND_FUNCTION_CODE"; public static final String T_COMMITTED = "COMMITTED"; static final String T_COMPARABLE = "COMPARABLE"; // SQL/JRT static final String T_CONDITION_IDENTIFIER = "CONDIITON_IDENTIFIER"; static final String T_CONDITION_NUMBER = "CONDITION_NUMBER"; static final String T_CONNECTION_NAME = "CONNECTION_NAME"; static final String T_CONSTRAINT_CATALOG = "CONSTRAINT_CATALOG"; static final String T_CONSTRAINT_NAME = "CONSTRAINT_NAME"; static final String T_CONSTRAINT_SCHEMA = "CONSTRAINT_SCHEMA"; static final String T_CONSTRAINTS = "CONSTRAINTS"; static final String T_CONSTRUCTOR = "CONSTRUCTOR"; static final String T_CONTAINS = "CONTAINS"; static final String T_CONTINUE = "CONTINUE"; static final String T_CURRENT_COLLATION = "CURRENT_COLLATION"; static final String T_CURSOR_NAME = "CURSOR_NAME"; public static final String T_DATA = "DATA"; static final String T_DATETIME_INTERVAL_CODE = "DATETIME_INTERVAL_CODE"; static final String T_DATETIME_INTERVAL_PRECISION = "DATETIME_INTERVAL_PRECISION"; public static final String T_DEFAULTS = "DEFAULTS"; static final String T_DEFERRABLE = "DEFERRABLE"; static final String T_DEFERRED = "DEFERRED"; static final String T_DEFINED = "DEFINED"; static final String T_DEFINER = "DEFINER"; static final String T_DEGREE = "DEGREE"; static final String T_DEPTH = "DEPTH"; static final String T_DERIVED = "DERIVED"; static final String T_DESC = "DESC"; static final String T_DESCRIPTOR = "DESCRIPTOR"; static final String T_DIAGNOSTICS = "DIAGNOSTICS"; static final String T_DISPATCH = "DISPATCH"; public static final String T_DOMAIN = "DOMAIN"; static final String T_DYNAMIC_FUNCTION = "DYNAMIC_FUNCTION"; static final String T_DYNAMIC_FUNCTION_CODE = "DYNAMIC_FUNCTION_CODE"; static final String T_EXCEPTION = "EXCEPTION"; static final String T_EXCLUDE = "EXCLUDE"; static final String T_EXCLUDING = "EXCLUDING"; static final String T_EXIT = "EXIT"; static final String T_FINAL = "FINAL"; public static final String T_FIRST = "FIRST"; static final String T_FOLLOWING = "FOLLOWING"; static final String T_FORTRAN = "FORTRAN"; static final String T_FOUND = "FOUND"; public static final String T_G_FACTOR = "G"; static final String T_GENERATED = "GENERATED"; static final String T_GENERAL = "GENERAL"; static final String T_GO = "GO"; static final String T_GOTO = "GOTO"; static final String T_GRANTED = "GRANTED"; static final String T_HIERARCHY = "HIERARCHY"; static final String T_IMPLEMENTATION = "IMPLEMENTATION"; static final String T_INCLUDING = "INCLUDING"; public static final String T_INCREMENT = "INCREMENT"; static final String T_INITIALLY = "INITIALLY"; static final String T_INPUT = "INPUT"; static final String T_INSTANCE = "INSTANCE"; static final String T_INSTANTIABLE = "INSTANTIABLE"; static final String T_INSTEAD = "INSTEAD"; static final String T_INTERFACE = "INTERFACE"; // SQL/JRT static final String T_INVOKER = "INVOKER"; public static final String T_ISOLATION = "ISOLATION"; public static final String T_JAVA = "JAVA"; // SQL/JRT public static final String T_K_FACTOR = "K"; static final String T_KEY = "KEY"; static final String T_KEY_MEMBER = "KEY_MEMBER"; static final String T_KEY_TYPE = "KEY_TYPE"; static final String T_LAST = "LAST"; static final String T_LENGTH = "LENGTH"; public static final String T_LEVEL = "LEVEL"; public static final String T_LIBRARY = "LIBRARY"; static final String T_LOCATOR = "LOCATOR"; public static final String T_M_FACTOR = "M"; static final String T_MAP = "MAP"; static final String T_MATCHED = "MATCHED"; static final String T_MAXVALUE = "MAXVALUE"; static final String T_MESSAGE_LENGTH = "MESSAGE_LENGTH"; static final String T_MESSAGE_OCTET_LENGTH = "MESSAGE_OCTET_LENGTH"; static final String T_MESSAGE_TEXT = "MESSAGE_TEXT"; static final String T_MINVALUE = "MINVALUE"; static final String T_MORE = "MORE"; static final String T_MUMPS = "MUMPS"; public static final String T_NAME = "NAME"; public static final String T_NAMES = "NAMES"; static final String T_NESTING = "NESTING"; static final String T_NEXT = "NEXT"; static final String T_NORMALIZED = "NORMALIZED"; static final String T_NULLABLE = "NULLABLE"; public static final String T_NULLS = "NULLS"; static final String T_NUMBER = "NUMBER"; public static final String T_OBJECT = "OBJECT"; static final String T_OCTETS = "OCTETS"; static final String T_OPTION = "OPTION"; static final String T_OPTIONS = "OPTIONS"; static final String T_ORDERING = "ORDERING"; static final String T_ORDINALITY = "ORDINALITY"; static final String T_OTHERS = "OTHERS"; public static final String T_OVERRIDING = "OVERRIDING"; public static final String T_P_FACTOR = "P"; public static final String T_PAD = "PAD"; static final String T_PARAMETER_MODE = "PARAMETER_MODE"; static final String T_PARAMETER_NAME = "PARAMETER_NAME"; static final String T_PARAMETER_ORDINAL_POSITION = "PARAMETER_ORDINAL_POSITION"; static final String T_PARAMETER_SPECIFIC_CATALOG = "PARAMETER_SPECIFIC_CATALOG"; static final String T_PARAMETER_SPEC_NAME = "PARAMETER_SPECIFIC_NAME"; static final String T_PARAMETER_SPEC_SCHEMA = "PARAMETER_SPECIFIC_SCHEMA"; static final String T_PARTIAL = "PARTIAL"; static final String T_PASCAL = "PASCAL"; public static final String T_PATH = "PATH"; static final String T_PLACING = "PLACING"; static final String T_PLI = "PLI"; static final String T_PRECEDING = "PRECEDING"; static final String T_PRESERVE = "PRESERVE"; static final String T_PRIOR = "PRIOR"; static final String T_PRIVILEGES = "PRIVILEGES"; public static final String T_PUBLIC = "PUBLIC"; public static final String T_READ = "READ"; static final String T_RELATIVE = "RELATIVE"; static final String T_REPEATABLE = "REPEATABLE"; static final String T_RESTART = "RESTART"; static final String T_RESET = "RESET"; static final String T_RETURNED_CARDINALITY = "RETURNED_CARDINALITY"; static final String T_RETURNED_LENGTH = "RETURNED_LENGTH"; static final String T_RETURNED_OCTET_LENGTH = "RETURNED_OCTET_LENGTH"; static final String T_RETURNED_SQLSTATE = "RETURNED_SQLSTATE"; public static final String T_ROLE = "ROLE"; public static final String T_ROUTINE = "ROUTINE"; static final String T_ROUTINE_CATALOG = "ROUTINE_CATALOG"; static final String T_ROUTINE_NAME = "ROUTINE_NAME"; static final String T_ROUTINE_SCHEMA = "ROUTINE_SCHEMA"; static final String T_ROW_COUNT = "ROW_COUNT"; public static final String T_SCALE = "SCALE"; public static final String T_SCHEMA = "SCHEMA"; static final String T_SCHEMA_NAME = "SCHEMA_NAME"; static final String T_SCOPE_CATALOG = "SCOPE_CATALOG"; static final String T_SCOPE_NAME = "SCOPE_NAME"; static final String T_SCOPE_SCHEMA = "SCOPE_SCHEMA"; static final String T_SECTION = "SECTION"; static final String T_SECURITY = "SECURITY"; static final String T_SELF = "SELF"; public static final String T_SEQUENCE = "SEQUENCE"; static final String T_SERIAL = "SERIAL"; public static final String T_SERIALIZABLE = "SERIALIZABLE"; public static final String T_SERVER = "SERVER"; static final String T_SERVER_NAME = "SERVER_NAME"; public static final String T_SESSION = "SESSION"; static final String T_SETS = "SETS"; static final String T_SIMPLE = "SIMPLE"; public static final String T_SIZE = "SIZE"; static final String T_SOURCE = "SOURCE"; public static final String T_SPACE = "SPACE"; static final String T_SPECIFIC_NAME = "SPECIFIC_NAME"; static final String T_SQLDATA = "SQLDATA"; // SQL/JRT static final String T_STACKED = "STACKED"; static final String T_STATE = "STATE"; static final String T_STATEMENT = "STATEMENT"; static final String T_STRUCTURE = "STRUCTURE"; static final String T_STYLE = "STYLE"; static final String T_SUBCLASS_ORIGIN = "SUBCLASS_ORIGIN"; public static final String T_T_FACTOR = "T"; static final String T_TABLE_NAME = "TABLE_NAME"; static final String T_TEMPORARY = "TEMPORARY"; static final String T_TIES = "TIES"; static final String T_TOP_LEVEL_COUNT = "TOP_LEVEL_COUNT"; public static final String T_TRANSACTION = "TRANSACTION"; static final String T_TRANSACTS_COMMITTED = "TRANSACTIONS_COMMITTED"; static final String T_TRANSACTS_ROLLED_BACK = "TRANSACTIONS_ROLLED_BACK"; static final String T_TRANSACTION_ACTIVE = "TRANSACTION_ACTIVE"; static final String T_TRANSFORM = "TRANSFORM"; static final String T_TRANSFORMS = "TRANSFORMS"; static final String T_TRIGGER_CATALOG = "TRIGGER_CATALOG"; static final String T_TRIGGER_NAME = "TRIGGER_NAME"; static final String T_TRIGGER_SCHEMA = "TRIGGER_SCHEMA"; public static final String T_TYPE = "TYPE"; static final String T_UNBOUNDED = "UNBOUNDED"; static final String T_UNCOMMITTED = "UNCOMMITTED"; static final String T_UNDER = "UNDER"; static final String T_UNDO = "UNDO"; static final String T_UNNAMED = "UNNAMED"; public static final String T_USAGE = "USAGE"; static final String T_USER_DEFINED_TYPE_CATALOG = "USER_DEFINED_TYPE_CATALOG"; static final String T_USER_DEFINED_TYPE_CODE = "USER_DEFINED_TYPE_CODE"; static final String T_USER_DEFINED_TYPE_NAME = "USER_DEFINED_TYPE_NAME"; static final String T_USER_DEFINED_TYPE_SCHEMA = "USER_DEFINED_TYPE_SCHEMA"; static final String T_VIEW = "VIEW"; static final String T_WORK = "WORK"; public static final String T_WRAPPER = "WRAPPER"; public static final String T_WRITE = "WRITE"; public static final String T_ZONE = "ZONE"; // other tokens static final String T_ALIAS = "ALIAS"; static final String T_AGGREGATE = "AGGREGATE"; public static final String T_AUTHENTICATION = "AUTHENTICATION"; static final String T_AUTO_INCREMENT = "AUTO_INCREMENT"; static final String T_AUTOCOMMIT = "AUTOCOMMIT"; public static final String T_BACKUP = "BACKUP"; static final String T_BIGSERIAL = "BIGSERIAL"; static final String T_BINARY_DOUBLE = "BINARY_DOUBLE"; static final String T_BINARY_FLOAT = "BINARY_FLOAT"; static final String T_BODY = "BODY"; static final String T_BYTE = "BYTE"; public static final String T_CACHE = "CACHE"; static final String T_CACHED = "CACHED"; static final String T_CASEWHEN = "CASEWHEN"; static final String T_CHECKPOINT = "CHECKPOINT"; static final String T_CITEXT = "CITEXT"; static final String T_CLASS = "CLASS"; static final String T_CLUSTERED = "CLUSTERED"; static final String T_COMMENT = "COMMENT"; static final String T_COMPACT = "COMPACT"; public static final String T_COMPRESSED = "COMPRESSED"; public static final String T_CONFLICT = "CONFLICT"; public static final String T_CONTROL = "CONTROL"; static final String T_CURDATE = "CURDATE"; static final String T_CURRVAL = "CURRVAL"; static final String T_CURTIME = "CURTIME"; public static final String T_DATABASE = "DATABASE"; public static final String T_DATETIME = "DATETIME"; public static final String T_DB2 = "DB2"; public static final String T_DEADLOCK = "DEADLOCK"; public static final String T_DEFRAG = "DEFRAG"; public static final String T_DELAY = "DELAY"; public static final String T_DIGEST = "DIGEST"; static final String T_DUAL = "DUAL"; static final String T_EXPLAIN = "EXPLAIN"; public static final String T_EVENT = "EVENT"; static final String T_FILE = "FILE"; public static final String T_FILES = "FILES"; static final String T_FOLD = "FOLD"; static final String T_FORMAT = "FORMAT"; static final String T_GROUP_CONCAT = "GROUP_CONCAT"; static final String T_HEADER = "HEADER"; static final String T_IFNULL = "IFNULL"; static final String T_IGNORECASE = "IGNORECASE"; static final String T_IMMEDIATELY = "IMMEDIATELY"; public static final String T_INDEX = "INDEX"; public static final String T_INITIAL = "INITIAL"; public static final String T_INTEGRITY = "INTEGRITY"; static final String T_IS_AUTOCOMMIT = "IS_AUTOCOMMIT"; static final String T_IS_READONLY_DATABASE = "IS_READONLY_DATABASE"; static final String T_IS_READONLY_DATABASE_FILES = "IS_READONLY_DATABASE_FILES"; static final String T_IS_READONLY_SESSION = "IS_READONLY_SESSION"; static final String T_ISNULL = "ISNULL"; static final String T_LASTVAL = "LASTVAL"; static final String T_LIMIT = "LIMIT"; public static final String T_LOB = "LOB"; public static final String T_LOCK = "LOCK"; public static final String T_LOCKS = "LOCKS"; public static final String T_LONG = "LONG"; public static final String T_LONGVAR = "LONGVAR"; public static final String T_LONGVARBINARY = "LONGVARBINARY"; public static final String T_LONGVARCHAR = "LONGVARCHAR"; static final String T_MAXROWS = "MAXROWS"; static final String T_MEDIAN = "MEDIAN"; public static final String T_MEMORY = "MEMORY"; public static final String T_MILLIS = "MILLIS"; static final String T_MINUS_EXCEPT = "MINUS"; public static final String T_MSS = "MSS"; public static final String T_MVCC = "MVCC"; public static final String T_MVLOCKS = "MVLOCKS"; public static final String T_MYS = "MYS"; public static final String T_NAN = "NAN"; static final String T_NEXTVAL = "NEXTVAL"; public static final String T_NIO = "NIO"; static final String T_NOWAIT = "NOWAIT"; public static final String T_NVARCHAR = "NVARCHAR"; public static final String T_NVARCHAR2 = "NVARCHAR2"; static final String T_NVL = "NVL"; static final String T_NVL2 = "NVL2"; static final String T_OCTETLENGTH = "OCTETLENGTH"; static final String T_OFF = "OFF"; public static final String T_OTHER = "OTHER"; public static final String T_ORA = "ORA"; public static final String T_PASSWORD = "PASSWORD"; static final String T_PLAN = "PLAN"; public static final String T_PGS = "PGS"; static final String T_PROPERTY = "PROPERTY"; static final String T_QUEUE = "QUEUE"; static final String T_RAW = "RAW"; static final String T_READONLY = "READONLY"; static final String T_REFERENTIAL = "REFERENTIAL"; public static final String T_REGULAR = "REGULAR"; static final String T_RENAME = "RENAME"; static final String T_RESTRICT = "RESTRICT"; static final String T_ROWNUM = "ROWNUM"; static final String T_SCRIPT = "SCRIPT"; static final String T_SEPARATOR = "SEPARATOR"; static final String T_BLOCKING = "BLOCKING"; static final String T_SHUTDOWN = "SHUTDOWN"; static final String T_SQL_TSI_DAY = "SQL_TSI_DAY"; static final String T_SQL_TSI_FRAC_SECOND = "SQL_TSI_FRAC_SECOND"; static final String T_SQL_TSI_MILLI_SECOND = "SQL_TSI_MILLI_SECOND"; static final String T_SQL_TSI_HOUR = "SQL_TSI_HOUR"; static final String T_SQL_TSI_MINUTE = "SQL_TSI_MINUTE"; static final String T_SQL_TSI_MONTH = "SQL_TSI_MONTH"; static final String T_SQL_TSI_QUARTER = "SQL_TSI_QUARTER"; static final String T_SQL_TSI_SECOND = "SQL_TSI_SECOND"; static final String T_SQL_TSI_WEEK = "SQL_TSI_WEEK"; static final String T_SQL_TSI_YEAR = "SQL_TSI_YEAR"; static final String T_SQL_BIGINT = "SQL_BIGINT"; static final String T_SQL_BINARY = "SQL_BINARY"; static final String T_SQL_BIT = "SQL_BIT"; static final String T_SQL_BLOB = "SQL_BLOB"; static final String T_SQL_BOOLEAN = "SQL_BOOLEAN"; static final String T_SQL_CHAR = "SQL_CHAR"; static final String T_SQL_CLOB = "SQL_CLOB"; static final String T_SQL_DATE = "SQL_DATE"; static final String T_SQL_DECIMAL = "SQL_DECIMAL"; static final String T_SQL_DATALINK = "SQL_DATALINK"; static final String T_SQL_DOUBLE = "SQL_DOUBLE"; static final String T_SQL_FLOAT = "SQL_FLOAT"; static final String T_SQL_INTEGER = "SQL_INTEGER"; static final String T_SQL_LONGVARBINARY = "SQL_LONGVARBINARY"; static final String T_SQL_LONGNVARCHAR = "SQL_LONGNVARCHAR"; static final String T_SQL_LONGVARCHAR = "SQL_LONGVARCHAR"; static final String T_SQL_NCHAR = "SQL_NCHAR"; static final String T_SQL_NCLOB = "SQL_NCLOB"; static final String T_SQL_NUMERIC = "SQL_NUMERIC"; static final String T_SQL_NVARCHAR = "SQL_NVARCHAR"; static final String T_SQL_REAL = "SQL_REAL"; static final String T_SQL_ROWID = "SQL_ROWID"; static final String T_SQL_SQLXML = "SQL_SQLXML"; static final String T_SQL_SMALLINT = "SQL_SMALLINT"; static final String T_SQL_TIME = "SQL_TIME"; static final String T_SQL_TIMESTAMP = "SQL_TIMESTAMP"; static final String T_SQL_TINYINT = "SQL_TINYINT"; static final String T_SQL_VARBINARY = "SQL_VARBINARY"; static final String T_SQL_VARCHAR = "SQL_VARCHAR"; public static final String T_SYNTAX = "SYNTAX"; public static final String T_TDC = "TDC"; public static final String T_TEMP = "TEMP"; public static final String T_TEXT = "TEXT"; static final String T_TIMESTAMPADD = "TIMESTAMPADD"; static final String T_TIMESTAMPDIFF = "TIMESTAMPDIFF"; public static final String T_TINYINT = "TINYINT"; static final String T_TOP = "TOP"; public static final String T_TTI = "TTI"; public static final String T_TYPES = "TYPES"; public static final String T_VARCHAR_IGNORECASE = "VARCHAR_IGNORECASE"; public static final String T_VARCHAR2 = "VARCHAR2"; public static final String T_UTF16 = "UTF16"; static final String T_WRITE_DELAY = "WRITE_DELAY"; public static final String T_YES = "YES"; // public static final String T_DAY_NAME = "DAY_NAME"; public static final String T_MONTH_NAME = "MONTH_NAME"; public static final String T_QUARTER = "QUARTER"; public static final String T_DAY_OF_WEEK = "DAY_OF_WEEK"; public static final String T_DAY_OF_MONTH = "DAY_OF_MONTH"; public static final String T_DAY_OF_YEAR = "DAY_OF_YEAR"; public static final String T_WEEK_OF_YEAR = "WEEK_OF_YEAR"; static final String T_DAYNAME = "DAYNAME"; static final String T_MONTHNAME = "MONTHNAME"; static final String T_DAYOFMONTH = "DAYOFMONTH"; static final String T_DAYOFWEEK = "DAYOFWEEK"; static final String T_DAYOFYEAR = "DAYOFYEAR"; static final String T_WEEK = "WEEK"; static final String T_DAYS = "DAYS"; // static final String T_ACOS = "ACOS"; static final String T_ACTION_ID = "ACTION_ID"; static final String T_ARRAY_SORT = "ARRAY_SORT"; static final String T_ASCII = "ASCII"; static final String T_ASIN = "ASIN"; static final String T_ATAN = "ATAN"; static final String T_ATAN2 = "ATAN2"; static final String T_BITAND = "BITAND"; static final String T_BITANDNOT = "BITANDNOT"; static final String T_BITNOT = "BITNOT"; static final String T_BITOR = "BITOR"; static final String T_BITXOR = "BITXOR"; public static final String T_CONCAT_WORD = "CONCAT"; static final String T_CHR = "CHR"; static final String T_COS = "COS"; static final String T_COT = "COT"; static final String T_CRYPT_KEY = "CRYPT_KEY"; static final String T_DATABASE_NAME = "DATABASE_NAME"; static final String T_DATE_ADD = "DATE_ADD"; static final String T_DATE_SUB = "DATE_SUB"; static final String T_DATEADD = "DATEADD"; static final String T_DATEDIFF = "DATEDIFF"; static final String T_DECODE = "DECODE"; static final String T_DEGREES = "DEGREES"; static final String T_DIFFERENCE = "DIFFERENCE"; static final String T_DMOD = "DMOD"; public static final String T_GC = "GC"; static final String T_GREATEST = "GREATEST"; static final String T_HEXTORAW = "HEXTORAW"; static final String T_LCASE = "LCASE"; static final String T_LEAST = "LEAST"; static final String T_LOAD_FILE = "LOAD_FILE"; static final String T_LOCATE = "LOCATE"; public static final String T_LOG = "LOG"; static final String T_LOG10 = "LOG10"; static final String T_LPAD = "LPAD"; static final String T_LTRIM = "LTRIM"; static final String T_NOW = "NOW"; static final String T_PI = "PI"; static final String T_POSITION_ARRAY = "POSITION_ARRAY"; static final String T_RADIANS = "RADIANS"; static final String T_RAND = "RAND"; static final String T_RAWTOHEX = "RAWTOHEX"; static final String T_REGEXP_MATCHES = "REGEXP_MATCHES"; static final String T_REGEXP_SUBSTRING = "REGEXP_SUBSTRING"; static final String T_REGEXP_SUBSTRING_ARRAY = "REGEXP_SUBSTRING_ARRAY"; static final String T_REPLACE = "REPLACE"; static final String T_REVERSE = "REVERSE"; static final String T_ROUND = "ROUND"; static final String T_ROUNDMAGIC = "ROUNDMAGIC"; static final String T_RPAD = "RPAD"; static final String T_RTRIM = "RTRIM"; public static final String T_SECONDS_MIDNIGHT = "SECONDS_SINCE_MIDNIGHT"; static final String T_SIGN = "SIGN"; static final String T_SIN = "SIN"; static final String T_SORT_ARRAY = "SORT_ARRAY"; static final String T_SOUNDEX = "SOUNDEX"; static final String T_SUBSTR = "SUBSTR"; static final String T_SYSDATE = "SYSDATE"; static final String T_SYSTIMESTAMP = "SYSTIMESTAMP"; static final String T_TAN = "TAN"; static final String T_TO_CHAR = "TO_CHAR"; static final String T_TO_DATE = "TO_DATE"; static final String T_TO_NUMBER = "TO_NUMBER"; static final String T_TO_TIMESTAMP = "TO_TIMESTAMP"; static final String T_TRANSACTION_SIZE = "TRANSACTION_SIZE"; static final String T_TRANSACTION_ID = "TRANSACTION_ID"; static final String T_TRUNC = "TRUNC"; static final String T_TODAY = "TODAY"; static final String T_UCASE = "UCASE"; static final String T_UUID = "UUID"; static final String T_UNIX_TIMESTAMP = "UNIX_TIMESTAMP"; // static final String T_ISOLATION_LEVEL = "ISOLATION_LEVEL"; static final String T_SESSION_ISOLATION_LEVEL = "SESSION_ISOLATION_LEVEL"; static final String T_DATABASE_ISOLATION_LEVEL = "DATABASE_ISOLATION_LEVEL"; static final String T_TRANSACTION_CONTROL = "TRANSACTION_CONTROL"; static final String T_TIMEZONE = "TIMEZONE"; static final String T_SESSION_TIMEZONE = "SESSION_TIMEZONE"; static final String T_DATABASE_TIMEZONE = "DATABASE_TIMEZONE"; static final String T_DATABASE_VERSION = "DATABASE_VERSION"; static final String T_SESSION_ID = "SESSION_ID"; static final String T_LOB_ID = "LOB_ID"; static final String T_SEQUENCE_ARRAY = "SEQUENCE_ARRAY"; // //SQL 200n Standard reserved keywords - full set public static final int ABS = 1; public static final int ALL = 2; public static final int ALLOCATE = 3; public static final int ALTER = 4; public static final int AND = 5; public static final int ANY = 6; public static final int ARE = 7; public static final int ARRAY = 8; public static final int ARRAY_AGG = 9; public static final int AS = 10; public static final int ASENSITIVE = 11; public static final int ASYMMETRIC = 12; public static final int AT = 13; public static final int ATOMIC = 14; public static final int AUTHORIZATION = 15; public static final int AVG = 16; public static final int BEGIN = 17; public static final int BETWEEN = 18; public static final int BIGINT = 19; public static final int BINARY = 20; public static final int BLOB = 21; public static final int BOOLEAN = 22; public static final int BOTH = 23; public static final int BY = 24; public static final int CALL = 25; public static final int CALLED = 26; public static final int CARDINALITY = 27; public static final int CASCADED = 28; public static final int CASE = 29; public static final int CAST = 30; public static final int CEIL = 31; public static final int CEILING = 32; public static final int CHAR = 33; public static final int CHAR_LENGTH = 34; public static final int CHARACTER = 35; public static final int CHARACTER_LENGTH = 36; public static final int CHECK = 37; public static final int CLOB = 38; public static final int CLOSE = 39; public static final int COALESCE = 40; public static final int COLLATE = 41; public static final int COLLECT = 42; public static final int COLUMN = 43; public static final int COMMIT = 44; public static final int COMPARABLE = 45; public static final int CONDITION = 46; public static final int CONNECT = 47; public static final int CONSTRAINT = 48; public static final int CONVERT = 49; public static final int CORR = 50; public static final int CORRESPONDING = 51; public static final int COUNT = 52; public static final int COVAR_POP = 53; public static final int COVAR_SAMP = 54; public static final int CREATE = 55; public static final int CROSS = 56; public static final int CUBE = 57; public static final int CUME_DIST = 58; public static final int CURRENT = 59; public static final int CURRENT_CATALOG = 60; public static final int CURRENT_DATE = 61; public static final int CURRENT_DEFAULT_TRANSFORM_GROUP = 62; public static final int CURRENT_PATH = 63; public static final int CURRENT_ROLE = 64; public static final int CURRENT_SCHEMA = 65; public static final int CURRENT_TIME = 66; public static final int CURRENT_TIMESTAMP = 67; public static final int CURRENT_TRANSFORM_GROUP_FOR_TYPE = 68; public static final int CURRENT_USER = 69; public static final int CURSOR = 70; public static final int CYCLE = 71; public static final int DATE = 72; public static final int DAY = 73; public static final int DEALLOCATE = 74; public static final int DEC = 75; public static final int DECIMAL = 76; public static final int DECLARE = 77; public static final int DEFAULT = 78; public static final int DELETE = 79; public static final int DENSE_RANK = 80; public static final int DEREF = 81; public static final int DESCRIBE = 82; public static final int DETERMINISTIC = 83; public static final int DISCONNECT = 84; public static final int DISTINCT = 85; public static final int DO = 86; public static final int DOUBLE = 87; public static final int DROP = 88; public static final int DYNAMIC = 89; public static final int EACH = 90; public static final int ELEMENT = 91; public static final int ELSE = 92; public static final int ELSEIF = 93; public static final int END = 94; public static final int END_EXEC = 95; public static final int ESCAPE = 96; public static final int EVERY = 97; public static final int EXCEPT = 98; public static final int EXEC = 99; public static final int EXECUTE = 100; public static final int EXISTS = 101; public static final int EXIT = 102; public static final int EXP = 103; public static final int EXTERNAL = 104; public static final int EXTRACT = 105; public static final int FALSE = 106; public static final int FETCH = 107; public static final int FILTER = 108; public static final int FIRST_VALUE = 109; public static final int FLOAT = 110; public static final int FLOOR = 111; public static final int FOR = 112; public static final int FOREIGN = 113; public static final int FREE = 114; public static final int FROM = 115; public static final int FULL = 116; public static final int FUNCTION = 117; public static final int FUSION = 118; public static final int GET = 119; public static final int GLOBAL = 120; public static final int GRANT = 121; public static final int GROUP = 122; public static final int GROUPING = 123; public static final int HANDLER = 124; public static final int HAVING = 125; public static final int HOLD = 126; public static final int HOUR = 127; public static final int IDENTITY = 128; public static final int IMPORT = 129; public static final int IN = 130; public static final int INDICATOR = 131; public static final int INNER = 132; public static final int INOUT = 133; public static final int INSENSITIVE = 134; public static final int INSERT = 135; public static final int INT = 136; public static final int INTEGER = 137; public static final int INTERSECT = 138; public static final int INTERSECTION = 139; public static final int INTERVAL = 140; public static final int INTO = 141; public static final int IS = 142; public static final int ITERATE = 143; public static final int JOIN = 144; public static final int LAG = 145; public static final int LANGUAGE = 146; public static final int LARGE = 147; public static final int LAST_VALUE = 148; public static final int LATERAL = 149; public static final int LEAD = 150; public static final int LEADING = 151; public static final int LEAVE = 152; public static final int LEFT = 153; public static final int LIKE = 154; public static final int LIKE_REGEX = 155; public static final int LN = 156; public static final int LOCAL = 157; public static final int LOCALTIME = 158; public static final int LOCALTIMESTAMP = 159; public static final int LOOP = 160; public static final int LOWER = 161; public static final int MATCH = 162; public static final int MAX = 163; public static final int MAX_CARDINALITY = 164; public static final int MEMBER = 165; public static final int MERGE = 166; public static final int METHOD = 167; public static final int MIN = 168; public static final int MINUTE = 169; public static final int MOD = 170; public static final int MODIFIES = 171; public static final int MODULE = 172; public static final int MONTH = 173; public static final int MULTISET = 174; public static final int NATIONAL = 175; public static final int NATURAL = 176; public static final int NCHAR = 177; public static final int NCLOB = 178; public static final int NEW = 179; public static final int NO = 180; public static final int NONE = 181; public static final int NORMALIZE = 182; public static final int NOT = 183; public static final int NTH_VALUE = 184; public static final int NTILE = 185; public static final int NULL = 186; public static final int NULLIF = 187; public static final int NUMERIC = 188; public static final int OCCURRENCES_REGEX = 189; public static final int OCTET_LENGTH = 190; public static final int OF = 191; public static final int OFFSET = 192; public static final int OLD = 193; public static final int ON = 194; public static final int ONLY = 195; public static final int OPEN = 196; public static final int OR = 197; public static final int ORDER = 198; public static final int OUT = 199; public static final int OUTER = 200; public static final int OVER = 201; public static final int OVERLAPS = 202; public static final int OVERLAY = 203; public static final int PARAMETER = 204; public static final int PARTITION = 205; public static final int PERCENT_RANK = 206; public static final int PERCENTILE_CONT = 207; public static final int PERCENTILE_DISC = 208; public static final int POSITION = 209; public static final int POSITION_REGEX = 210; public static final int POWER = 211; public static final int PRECISION = 212; public static final int PREPARE = 213; public static final int PRIMARY = 214; public static final int PROCEDURE = 215; public static final int RANGE = 216; public static final int RANK = 217; public static final int READS = 218; public static final int REAL = 219; public static final int RECURSIVE = 220; public static final int REF = 221; public static final int REFERENCES = 222; public static final int REFERENCING = 223; public static final int REGR_AVGX = 224; public static final int REGR_AVGY = 225; public static final int REGR_COUNT = 226; public static final int REGR_INTERCEPT = 227; public static final int REGR_R2 = 228; public static final int REGR_SLOPE = 229; public static final int REGR_SXX = 230; public static final int REGR_SXY = 231; public static final int REGR_SYY = 232; public static final int RELEASE = 233; public static final int REPEAT = 234; public static final int RESIGNAL = 235; public static final int RESULT = 236; public static final int RETURN = 237; public static final int RETURNS = 238; public static final int REVOKE = 239; public static final int RIGHT = 240; public static final int ROLLBACK = 241; public static final int ROLLUP = 242; public static final int ROW = 243; public static final int ROW_NUMBER = 244; public static final int ROWS = 245; public static final int SAVEPOINT = 246; public static final int SCOPE = 247; public static final int SCROLL = 248; public static final int SEARCH = 249; public static final int SECOND = 250; public static final int SELECT = 251; public static final int SENSITIVE = 252; public static final int SESSION_USER = 253; public static final int SET = 254; public static final int SIGNAL = 255; public static final int SIMILAR = 256; public static final int SMALLINT = 257; public static final int SOME = 258; public static final int SPECIFIC = 259; public static final int SPECIFICTYPE = 260; public static final int SQL = 261; public static final int SQLEXCEPTION = 262; public static final int SQLSTATE = 263; public static final int SQLWARNING = 264; public static final int SQRT = 265; public static final int STACKED = 266; public static final int START = 267; public static final int STATIC = 268; public static final int STDDEV_POP = 269; public static final int STDDEV_SAMP = 270; public static final int SUBMULTISET = 271; public static final int SUBSTRING = 272; public static final int SUBSTRING_REGEX = 273; public static final int SUM = 274; public static final int SYMMETRIC = 275; public static final int SYSTEM = 276; public static final int SYSTEM_USER = 277; public static final int TABLE = 278; public static final int TABLESAMPLE = 279; public static final int THEN = 280; public static final int TIME = 281; public static final int TIMESTAMP = 282; public static final int TIMEZONE_HOUR = 283; public static final int TIMEZONE_MINUTE = 284; public static final int TO = 285; public static final int TRAILING = 286; public static final int TRANSLATE = 287; public static final int TRANSLATE_REGEX = 288; public static final int TRANSLATION = 289; public static final int TREAT = 290; public static final int TRIGGER = 291; public static final int TRIM = 292; public static final int TRIM_ARRAY = 293; public static final int TRUE = 294; public static final int TRUNCATE = 295; public static final int UESCAPE = 296; public static final int UNDO = 297; public static final int UNION = 298; public static final int UNIQUE = 299; public static final int UNKNOWN = 300; public static final int UNNEST = 301; public static final int UNTIL = 302; public static final int UPDATE = 303; public static final int UPPER = 304; public static final int USER = 305; public static final int USING = 306; public static final int VALUE = 307; public static final int VALUES = 308; public static final int VAR_POP = 309; public static final int VAR_SAMP = 310; public static final int VARBINARY = 311; public static final int VARCHAR = 312; public static final int VARYING = 313; public static final int WHEN = 314; public static final int WHENEVER = 315; public static final int WHERE = 316; public static final int WIDTH_BUCKET = 317; public static final int WINDOW = 318; public static final int WITH = 319; public static final int WITHIN = 320; public static final int WITHOUT = 321; public static final int WHILE = 322; public static final int YEAR = 323; // //SQL 200n Standard non-reserved keywords - full set public static final int A = 330; public static final int ABSOLUTE = 331; public static final int ACTION = 332; public static final int ADA = 333; public static final int ADD = 334; public static final int ADMIN = 335; public static final int AFTER = 336; public static final int ALWAYS = 337; public static final int ASC = 338; public static final int ASSERTION = 339; public static final int ASSIGNMENT = 340; public static final int ATTRIBUTE = 341; public static final int ATTRIBUTES = 342; public static final int BEFORE = 343; public static final int BERNOULLI = 344; public static final int BREADTH = 345; public static final int C = 346; public static final int CASCADE = 347; public static final int CATALOG = 348; public static final int CATALOG_NAME = 349; public static final int CHAIN = 350; public static final int CHARACTER_SET_CATALOG = 351; public static final int CHARACTER_SET_NAME = 352; public static final int CHARACTER_SET_SCHEMA = 353; public static final int CHARACTERISTICS = 354; public static final int CHARACTERS = 355; public static final int CLASS_ORIGIN = 356; public static final int COBOL = 357; public static final int COLLATION = 358; public static final int COLLATION_CATALOG = 359; public static final int COLLATION_NAME = 360; public static final int COLLATION_SCHEMA = 361; public static final int COLUMN_NAME = 362; public static final int COMMAND_FUNCTION = 363; public static final int COMMAND_FUNCTION_CODE = 364; public static final int COMMITTED = 365; public static final int CONDITION_IDENTIFIER = 366; public static final int CONDITION_NUMBER = 367; public static final int CONNECTION = 368; public static final int CONNECTION_NAME = 369; public static final int CONSTRAINT_CATALOG = 370; public static final int CONSTRAINT_NAME = 371; public static final int CONSTRAINT_SCHEMA = 372; public static final int CONSTRAINTS = 373; public static final int CONSTRUCTOR = 374; public static final int CONTAINS = 375; public static final int CONTINUE = 376; public static final int CURSOR_NAME = 377; public static final int DATA = 378; public static final int DATETIME_INTERVAL_CODE = 379; public static final int DATETIME_INTERVAL_PRECISION = 380; public static final int DEFAULTS = 381; public static final int DEFERRABLE = 382; public static final int DEFERRED = 383; public static final int DEFINED = 384; public static final int DEFINER = 385; public static final int DEGREE = 386; public static final int DEPTH = 387; public static final int DERIVED = 388; public static final int DESC = 389; public static final int DESCRIPTOR = 390; public static final int DIAGNOSTICS = 391; public static final int DISPATCH = 392; public static final int DOMAIN = 393; public static final int DYNAMIC_FUNCTION = 394; public static final int DYNAMIC_FUNCTION_CODE = 395; public static final int EQUALS = 396; public static final int EXCEPTION = 397; public static final int EXCLUDE = 398; public static final int EXCLUDING = 399; public static final int FINAL = 400; public static final int FIRST = 401; public static final int FOLLOWING = 402; public static final int FORTRAN = 403; public static final int FOUND = 404; public static final int G = 405; public static final int GENERAL = 406; public static final int GENERATED = 407; public static final int GO = 408; public static final int GOTO = 409; public static final int GRANTED = 410; public static final int HIERARCHY = 411; public static final int IF = 412; public static final int IGNORE = 413; public static final int IMMEDIATE = 414; public static final int IMPLEMENTATION = 415; public static final int INCLUDING = 416; public static final int INCREMENT = 417; public static final int INITIALLY = 418; public static final int INPUT = 419; public static final int INSTANCE = 420; public static final int INSTANTIABLE = 421; public static final int INSTEAD = 422; public static final int INVOKER = 423; public static final int ISOLATION = 424; public static final int JAVA = 425; public static final int K = 426; public static final int KEY = 427; public static final int KEY_MEMBER = 428; public static final int KEY_TYPE = 429; public static final int LAST = 430; public static final int LENGTH = 431; public static final int LEVEL = 432; public static final int LIBRARY = 433; public static final int LOCATOR = 434; public static final int M = 435; public static final int MAP = 436; public static final int MATCHED = 437; public static final int MAXVALUE = 438; public static final int MESSAGE_LENGTH = 439; public static final int MESSAGE_OCTET_LENGTH = 440; public static final int MESSAGE_TEXT = 441; public static final int MINVALUE = 442; public static final int MORE = 443; public static final int MUMPS = 444; public static final int NAME = 445; public static final int NAMES = 446; public static final int NESTING = 447; public static final int NEXT = 448; public static final int NORMALIZED = 449; public static final int NULLABLE = 450; public static final int NULLS = 451; public static final int NUMBER = 452; public static final int OBJECT = 453; public static final int OCTETS = 454; public static final int OPTION = 455; public static final int OPTIONS = 456; public static final int ORDERING = 457; public static final int ORDINALITY = 458; public static final int OTHERS = 459; public static final int OUTPUT = 460; public static final int OVERRIDING = 461; public static final int P = 462; public static final int PAD = 463; public static final int PARAMETER_MODE = 464; public static final int PARAMETER_NAME = 465; public static final int PARAMETER_ORDINAL_POSITION = 466; public static final int PARAMETER_SPECIFIC_CATALOG = 467; public static final int PARAMETER_SPECIFIC_NAME = 468; public static final int PARAMETER_SPECIFIC_SCHEMA = 469; public static final int PARTIAL = 470; public static final int PASCAL = 471; public static final int PATH = 472; public static final int PLACING = 473; public static final int PLI = 474; public static final int PRECEDING = 475; public static final int PRESERVE = 476; public static final int PRIOR = 477; public static final int PRIVILEGES = 478; public static final int PUBLIC = 479; public static final int READ = 480; public static final int RELATIVE = 481; public static final int REPEATABLE = 482; public static final int RESPECT = 483; public static final int RESTART = 484; public static final int RESTRICT = 485; public static final int RETURNED_CARDINALITY = 486; public static final int RETURNED_LENGTH = 487; public static final int RETURNED_OCTET_LENGTH = 488; public static final int RETURNED_SQLSTATE = 489; public static final int ROLE = 490; public static final int ROUTINE = 491; public static final int ROUTINE_CATALOG = 492; public static final int ROUTINE_NAME = 493; public static final int ROUTINE_SCHEMA = 494; public static final int ROW_COUNT = 495; public static final int SCALE = 496; public static final int SCHEMA = 497; public static final int SCHEMA_NAME = 498; public static final int SCOPE_CATALOG = 499; public static final int SCOPE_NAME = 500; public static final int SCOPE_SCHEMA = 501; public static final int SECTION = 502; public static final int SECURITY = 503; public static final int SELF = 504; public static final int SEQUENCE = 505; public static final int SERIALIZABLE = 506; public static final int SERVER_NAME = 507; public static final int SESSION = 508; public static final int SERVER = 509; public static final int SETS = 510; public static final int SIMPLE = 511; public static final int SIZE = 512; public static final int SOURCE = 513; public static final int SPACE = 514; public static final int SPECIFIC_NAME = 515; public static final int STATE = 516; public static final int STATEMENT = 517; public static final int STRUCTURE = 518; public static final int STYLE = 519; public static final int SUBCLASS_ORIGIN = 520; public static final int T = 521; public static final int TABLE_NAME = 522; public static final int TEMPORARY = 523; public static final int TIES = 524; public static final int TOP_LEVEL_COUNT = 525; public static final int TRANSACTION = 526; public static final int TRANSACTION_ACTIVE = 527; public static final int TRANSACTIONS_COMMITTED = 528; public static final int TRANSACTIONS_ROLLED_BACK = 529; public static final int TRANSFORM = 530; public static final int TRANSFORMS = 531; public static final int TRIGGER_CATALOG = 532; public static final int TRIGGER_NAME = 533; public static final int TRIGGER_SCHEMA = 534; public static final int TYPE = 535; public static final int UNBOUNDED = 536; public static final int UNCOMMITTED = 537; public static final int UNDER = 538; public static final int UNNAMED = 539; public static final int USAGE = 540; public static final int USER_DEFINED_TYPE_CATALOG = 541; public static final int USER_DEFINED_TYPE_CODE = 542; public static final int USER_DEFINED_TYPE_NAME = 543; public static final int USER_DEFINED_TYPE_SCHEMA = 544; public static final int VIEW = 545; public static final int WORK = 546; public static final int WRITE = 547; public static final int WRAPPER = 548; public static final int ZONE = 549; // other token values used as switch cases static final int ALIAS = 558; static final int AGGREGATE = 559; static final int AUTOCOMMIT = 560; static final int AUTHENTICATION = 561; static final int BACKUP = 562; static final int BINARY_FLOAT = 563; static final int BINARY_DOUBLE = 564; static final int BIT = 565; static final int BLOCKING = 566; static final int BODY = 567; static final int BYTE = 568; static final int CACHE = 569; static final int CACHED = 570; static final int CASEWHEN = 571; static final int CHECKPOINT = 572; static final int CITEXT = 573; static final int CLASS = 574; static final int CLUSTERED = 575; static final int COMMENT = 576; static final int COMPACT = 577; static final int COMPRESSED = 578; static final int CONFLICT = 579; static final int CONTROL = 580; static final int CURRVAL = 581; static final int DATABASE = 582; static final int DEADLOCK = 583; static final int DEFRAG = 584; static final int DELAY = 585; static final int DIGEST = 586; static final int EVENT = 587; static final int EXPLAIN = 588; static final int FILE = 589; static final int FILES = 590; static final int FORMAT = 591; static final int GC = 592; static final int HEADER = 593; static final int IGNORECASE = 594; static final int IMMEDIATELY = 595; static final int INTEGRITY = 596; static final int INDEX = 597; static final int INITIAL = 598; static final int LASTVAL = 599; static final int LIMIT = 600; static final int LOCK = 601; static final int LOCKS = 602; static final int LONG = 603; static final int LONGVAR = 604; static final int MAXROWS = 605; static final int MEDIAN = 606; static final int MEMORY = 607; static final int MILLIS = 608; static final int MINUS_EXCEPT = 609; static final int NAN = 610; static final int NEXTVAL = 611; static final int NVARCHAR2 = 612; static final int NVL2 = 613; static final int OFF = 614; static final int PASSWORD = 615; static final int PLAN = 616; static final int PROPERTY = 617; static final int RAW = 618; static final int READONLY = 619; static final int REFERENTIAL = 620; static final int REGULAR = 621; static final int RENAME = 622; static final int RESET = 623; static final int ROWNUM = 624; static final int SCRIPT = 625; static final int SEPARATOR = 626; static final int SHUTDOWN = 627; static final int SYNTAX = 628; static final int TDC = 629; static final int TEMP = 630; static final int TEXT = 631; static final int TTI = 632; static final int TYPES = 633; static final int VARCHAR2 = 634; static final int WRITE_DELAY = 635; // static final int ACOS = 640; static final int ACTION_ID = 641; static final int ARRAY_SORT = 642; static final int ASCII = 643; static final int ASIN = 644; static final int ATAN = 645; static final int ATAN2 = 646; static final int BIT_LENGTH = 647; static final int BITAND = 648; static final int BITANDNOT = 649; static final int BITLENGTH = 650; static final int BITNOT = 651; static final int BITOR = 652; static final int BITXOR = 653; static final int CHR = 654; static final int CONCAT_WORD = 655; static final int COS = 656; static final int COT = 657; static final int CRYPT_KEY = 658; static final int CURDATE = 659; static final int CURTIME = 660; static final int DATABASE_ISOLATION_LEVEL = 661; static final int DATABASE_NAME = 662; static final int DATABASE_TIMEZONE = 663; static final int DATABASE_VERSION = 664; static final int DATE_ADD = 665; static final int DATE_SUB = 666; static final int DATEADD = 667; static final int DATEDIFF = 668; public static final int DAY_NAME = 669; public static final int DAY_OF_MONTH = 670; public static final int DAY_OF_WEEK = 671; public static final int DAY_OF_YEAR = 672; static final int DAYNAME = 673; static final int DAYOFMONTH = 674; static final int DAYOFWEEK = 675; static final int DAYOFYEAR = 676; static final int DAYS = 677; static final int DECODE = 678; static final int DEGREES = 679; static final int DIFFERENCE = 680; static final int DMOD = 681; static final int HEXTORAW = 682; static final int GREATEST = 683; static final int GROUP_CONCAT = 684; static final int IFNULL = 685; static final int IS_AUTOCOMMIT = 686; static final int IS_READONLY_DATABASE = 687; static final int IS_READONLY_DATABASE_FILES = 688; static final int IS_READONLY_SESSION = 689; static final int ISOLATION_LEVEL = 690; static final int ISNULL = 691; static final int LCASE = 692; static final int LEAST = 693; static final int LOAD_FILE = 694; static final int LOCATE = 695; static final int LOB = 696; static final int LOG = 697; static final int LOG10 = 698; static final int LPAD = 699; static final int LTRIM = 700; static final int LOB_ID = 701; public static final int MONTH_NAME = 702; static final int MONTHNAME = 703; static final int MVCC = 704; static final int MVLOCKS = 705; static final int NIO = 706; static final int NOW = 707; static final int OCTETLENGTH = 708; static final int PI = 709; static final int POSITION_ARRAY = 710; public static final int QUARTER = 711; static final int RADIANS = 712; static final int RAND = 713; static final int RAWTOHEX = 714; static final int REGEXP_MATCHES = 715; static final int REGEXP_SUBSTRING = 716; static final int REGEXP_SUBSTRING_ARRAY = 717; static final int REPLACE = 718; static final int REVERSE = 719; static final int ROUND = 720; static final int ROUNDMAGIC = 721; static final int RTRIM = 722; static final int RPAD = 723; public static final int SECONDS_MIDNIGHT = 724; static final int SEQUENCE_ARRAY = 725; static final int SESSION_ID = 726; static final int SESSION_ISOLATION_LEVEL = 727; static final int SESSION_TIMEZONE = 728; static final int SIGN = 729; static final int SIN = 730; static final int SORT_ARRAY = 731; static final int SOUNDEX = 732; static final int SPACE_WORD = 733; static final int SUBSTR = 734; static final int SYSDATE = 735; static final int SYSTIMESTAMP = 736; static final int TAN = 737; static final int TIMESTAMPADD = 738; static final int TIMESTAMPDIFF = 739; static final int TIMEZONE = 740; static final int TO_CHAR = 741; static final int TO_DATE = 742; static final int TO_NUMBER = 743; static final int TO_TIMESTAMP = 744; static final int TODAY = 755; static final int TOP = 756; static final int TRANSACTION_CONTROL = 757; static final int TRANSACTION_ID = 758; static final int TRANSACTION_SIZE = 759; static final int TRUNC = 760; static final int UCASE = 761; static final int UNIX_TIMESTAMP = 762; static final int UUID = 763; static final int WEEK = 764; public static final int WEEK_OF_YEAR = 765; // static final int ASTERISK = 771; static final int CLOSEBRACKET = 772; static final int COLON = 773; static final int COMMA = 774; static final int CONCAT = 775; static final int DIVIDE = 776; static final int DOUBLE_COLON_OP = 777; static final int DOUBLE_PERIOD_OP = 778; static final int GREATER = 779; static final int GREATER_EQUALS = 780; static final int LEFTBRACKET = 781; static final int LESS = 782; static final int LESS_EQUALS = 783; public static final int MINUS = 784; static final int NOT_EQUALS = 785; static final int OPENBRACKET = 786; static final int PLUS = 787; static final int QUESTION = 788; static final int RIGHT_ARROW_OP = 789; static final int RIGHTBRACKET = 790; static final int SEMICOLON = 791; // public static final int SQL_BIGINT = 801; public static final int SQL_BINARY = 802; public static final int SQL_BIT = 803; public static final int SQL_BLOB = 804; public static final int SQL_BOOLEAN = 805; public static final int SQL_CHAR = 806; public static final int SQL_CLOB = 807; public static final int SQL_DATE = 808; public static final int SQL_DECIMAL = 809; public static final int SQL_DATALINK = 810; public static final int SQL_DOUBLE = 811; public static final int SQL_FLOAT = 812; public static final int SQL_INTEGER = 813; public static final int SQL_LONGVARBINARY = 814; public static final int SQL_LONGNVARCHAR = 815; public static final int SQL_LONGVARCHAR = 816; public static final int SQL_NCHAR = 817; public static final int SQL_NCLOB = 818; public static final int SQL_NUMERIC = 819; public static final int SQL_NVARCHAR = 820; public static final int SQL_REAL = 821; public static final int SQL_ROWID = 822; public static final int SQL_SQLXML = 823; public static final int SQL_SMALLINT = 824; public static final int SQL_TIME = 825; public static final int SQL_TIMESTAMP = 826; public static final int SQL_TINYINT = 827; public static final int SQL_VARBINARY = 828; public static final int SQL_VARCHAR = 829; // static final int SQL_TSI_FRAC_SECOND = 831; static final int SQL_TSI_MILLI_SECOND = 832; static final int SQL_TSI_SECOND = 833; static final int SQL_TSI_MINUTE = 834; static final int SQL_TSI_HOUR = 835; static final int SQL_TSI_DAY = 836; static final int SQL_TSI_WEEK = 837; static final int SQL_TSI_MONTH = 838; static final int SQL_TSI_QUARTER = 839; static final int SQL_TSI_YEAR = 840; // static final int X_KEYSET = 841; static final int X_OPTION = 842; static final int X_REPEAT = 843; static final int X_POS_INTEGER = 844; // public static final int X_VALUE = 845; public static final int X_IDENTIFIER = 846; public static final int X_DELIMITED_IDENTIFIER = 847; public static final int X_ENDPARSE = 848; public static final int X_STARTPARSE = 849; public static final int X_REMARK = 850; public static final int X_NULL = 851; public static final int X_LOB_SIZE = 852; public static final int X_MALFORMED_STRING = 853; public static final int X_MALFORMED_NUMERIC = 854; public static final int X_MALFORMED_BIT_STRING = 855; public static final int X_MALFORMED_BINARY_STRING = 856; public static final int X_MALFORMED_UNICODE_STRING = 857; public static final int X_MALFORMED_COMMENT = 858; public static final int X_MALFORMED_IDENTIFIER = 859; public static final int X_MALFORMED_UNICODE_ESCAPE = 860; // public static final int X_UNKNOWN_TOKEN = -1; private static final IntValueHashMap reservedKeys = new IntValueHashMap(351); static { reservedKeys.put(Tokens.T_ABS, ABS); reservedKeys.put(Tokens.T_AGGREGATE, AGGREGATE); reservedKeys.put(Tokens.T_ALL, ALL); reservedKeys.put(Tokens.T_ALLOCATE, ALLOCATE); reservedKeys.put(Tokens.T_ALTER, ALTER); reservedKeys.put(Tokens.T_AND, AND); reservedKeys.put(Tokens.T_ANY, ANY); reservedKeys.put(Tokens.T_ARE, ARE); reservedKeys.put(Tokens.T_ARRAY, ARRAY); reservedKeys.put(Tokens.T_ARRAY_AGG, ARRAY_AGG); reservedKeys.put(Tokens.T_AS, AS); reservedKeys.put(Tokens.T_ASENSITIVE, ASENSITIVE); reservedKeys.put(Tokens.T_ASYMMETRIC, ASYMMETRIC); reservedKeys.put(Tokens.T_AT, AT); reservedKeys.put(Tokens.T_ATOMIC, ATOMIC); reservedKeys.put(Tokens.T_AUTHORIZATION, AUTHORIZATION); reservedKeys.put(Tokens.T_AVG, AVG); reservedKeys.put(Tokens.T_BEGIN, BEGIN); reservedKeys.put(Tokens.T_BETWEEN, BETWEEN); reservedKeys.put(Tokens.T_BIGINT, BIGINT); reservedKeys.put(Tokens.T_BINARY, BINARY); reservedKeys.put(Tokens.T_BIT_LENGTH, BIT_LENGTH); reservedKeys.put(Tokens.T_BLOB, BLOB); reservedKeys.put(Tokens.T_BOOLEAN, BOOLEAN); reservedKeys.put(Tokens.T_BOTH, BOTH); reservedKeys.put(Tokens.T_BY, BY); reservedKeys.put(Tokens.T_CALL, CALL); reservedKeys.put(Tokens.T_CALLED, CALLED); reservedKeys.put(Tokens.T_CARDINALITY, CARDINALITY); reservedKeys.put(Tokens.T_CASCADED, CASCADED); reservedKeys.put(Tokens.T_CASE, CASE); reservedKeys.put(Tokens.T_CAST, CAST); reservedKeys.put(Tokens.T_CEIL, CEIL); reservedKeys.put(Tokens.T_CEILING, CEILING); reservedKeys.put(Tokens.T_CHAR, CHAR); reservedKeys.put(Tokens.T_CHAR_LENGTH, CHAR_LENGTH); reservedKeys.put(Tokens.T_CHARACTER, CHARACTER); reservedKeys.put(Tokens.T_CHARACTER_LENGTH, CHARACTER_LENGTH); reservedKeys.put(Tokens.T_CHECK, CHECK); reservedKeys.put(Tokens.T_CLOB, CLOB); reservedKeys.put(Tokens.T_CLOSE, CLOSE); reservedKeys.put(Tokens.T_COALESCE, COALESCE); reservedKeys.put(Tokens.T_COLLATE, COLLATE); reservedKeys.put(Tokens.T_COLLECT, COLLECT); reservedKeys.put(Tokens.T_COLUMN, COLUMN); reservedKeys.put(Tokens.T_COMMIT, COMMIT); reservedKeys.put(Tokens.T_COMPARABLE, COMPARABLE); reservedKeys.put(Tokens.T_CONDITION, CONDITION); reservedKeys.put(Tokens.T_CONNECT, CONNECT); reservedKeys.put(Tokens.T_CONSTRAINT, CONSTRAINT); reservedKeys.put(Tokens.T_CONVERT, CONVERT); reservedKeys.put(Tokens.T_CORR, CORR); reservedKeys.put(Tokens.T_CORRESPONDING, CORRESPONDING); reservedKeys.put(Tokens.T_COUNT, COUNT); reservedKeys.put(Tokens.T_COVAR_POP, COVAR_POP); reservedKeys.put(Tokens.T_COVAR_SAMP, COVAR_SAMP); reservedKeys.put(Tokens.T_CREATE, CREATE); reservedKeys.put(Tokens.T_CROSS, CROSS); reservedKeys.put(Tokens.T_CUBE, CUBE); reservedKeys.put(Tokens.T_CUME_DIST, CUME_DIST); reservedKeys.put(Tokens.T_CURRENT, CURRENT); reservedKeys.put(Tokens.T_CURRENT_CATALOG, CURRENT_CATALOG); reservedKeys.put(Tokens.T_CURRENT_DATE, CURRENT_DATE); reservedKeys.put(Tokens.T_CURRENT_DEFAULT_TRANSFORM_GROUP, CURRENT_DEFAULT_TRANSFORM_GROUP); reservedKeys.put(Tokens.T_CURRENT_PATH, CURRENT_PATH); reservedKeys.put(Tokens.T_CURRENT_ROLE, CURRENT_ROLE); reservedKeys.put(Tokens.T_CURRENT_SCHEMA, CURRENT_SCHEMA); reservedKeys.put(Tokens.T_CURRENT_TIME, CURRENT_TIME); reservedKeys.put(Tokens.T_CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); reservedKeys.put(Tokens.T_DO, DO); reservedKeys.put(Tokens.T_CURRENT_TRANSFORM_GROUP_FOR_TYPE, CURRENT_TRANSFORM_GROUP_FOR_TYPE); reservedKeys.put(Tokens.T_CURRENT_USER, CURRENT_USER); reservedKeys.put(Tokens.T_CURSOR, CURSOR); reservedKeys.put(Tokens.T_CYCLE, CYCLE); reservedKeys.put(Tokens.T_DATE, DATE); reservedKeys.put(Tokens.T_DAY, DAY); reservedKeys.put(Tokens.T_DEALLOCATE, DEALLOCATE); reservedKeys.put(Tokens.T_DEC, DEC); reservedKeys.put(Tokens.T_DECIMAL, DECIMAL); reservedKeys.put(Tokens.T_DECLARE, DECLARE); reservedKeys.put(Tokens.T_DEFAULT, DEFAULT); reservedKeys.put(Tokens.T_DELETE, DELETE); reservedKeys.put(Tokens.T_DENSE_RANK, DENSE_RANK); reservedKeys.put(Tokens.T_DEREF, DEREF); reservedKeys.put(Tokens.T_DESCRIBE, DESCRIBE); reservedKeys.put(Tokens.T_DETERMINISTIC, DETERMINISTIC); reservedKeys.put(Tokens.T_DISCONNECT, DISCONNECT); reservedKeys.put(Tokens.T_DISTINCT, DISTINCT); reservedKeys.put(Tokens.T_DOUBLE, DOUBLE); reservedKeys.put(Tokens.T_DROP, DROP); reservedKeys.put(Tokens.T_DYNAMIC, DYNAMIC); reservedKeys.put(Tokens.T_EACH, EACH); reservedKeys.put(Tokens.T_ELEMENT, ELEMENT); reservedKeys.put(Tokens.T_ELSE, ELSE); reservedKeys.put(Tokens.T_ELSEIF, ELSEIF); reservedKeys.put(Tokens.T_END, END); reservedKeys.put(Tokens.T_END_EXEC, END_EXEC); reservedKeys.put(Tokens.T_ESCAPE, ESCAPE); reservedKeys.put(Tokens.T_EVERY, EVERY); reservedKeys.put(Tokens.T_EXCEPT, EXCEPT); reservedKeys.put(Tokens.T_EXEC, EXEC); reservedKeys.put(Tokens.T_EXECUTE, EXECUTE); reservedKeys.put(Tokens.T_EXISTS, EXISTS); reservedKeys.put(Tokens.T_EXIT, EXIT); reservedKeys.put(Tokens.T_EXP, EXP); reservedKeys.put(Tokens.T_EXTERNAL, EXTERNAL); reservedKeys.put(Tokens.T_EXTRACT, EXTRACT); reservedKeys.put(Tokens.T_FALSE, FALSE); reservedKeys.put(Tokens.T_FETCH, FETCH); reservedKeys.put(Tokens.T_FILTER, FILTER); reservedKeys.put(Tokens.T_FIRST_VALUE, FIRST_VALUE); reservedKeys.put(Tokens.T_FLOAT, FLOAT); reservedKeys.put(Tokens.T_FLOOR, FLOOR); reservedKeys.put(Tokens.T_FOR, FOR); reservedKeys.put(Tokens.T_FOREIGN, FOREIGN); reservedKeys.put(Tokens.T_FREE, FREE); reservedKeys.put(Tokens.T_FROM, FROM); reservedKeys.put(Tokens.T_FULL, FULL); reservedKeys.put(Tokens.T_FUNCTION, FUNCTION); reservedKeys.put(Tokens.T_FUSION, FUSION); reservedKeys.put(Tokens.T_GET, GET); reservedKeys.put(Tokens.T_GLOBAL, GLOBAL); reservedKeys.put(Tokens.T_GRANT, GRANT); reservedKeys.put(Tokens.T_GROUP, GROUP); reservedKeys.put(Tokens.T_GROUPING, GROUPING); reservedKeys.put(Tokens.T_HANDLER, HANDLER); reservedKeys.put(Tokens.T_HAVING, HAVING); reservedKeys.put(Tokens.T_HOLD, HOLD); reservedKeys.put(Tokens.T_HOUR, HOUR); reservedKeys.put(Tokens.T_IDENTITY, IDENTITY); reservedKeys.put(Tokens.T_IF, IF); reservedKeys.put(Tokens.T_IMPORT, IMPORT); reservedKeys.put(Tokens.T_IN, IN); reservedKeys.put(Tokens.T_INDICATOR, INDICATOR); reservedKeys.put(Tokens.T_INNER, INNER); reservedKeys.put(Tokens.T_INOUT, INOUT); reservedKeys.put(Tokens.T_INSENSITIVE, INSENSITIVE); reservedKeys.put(Tokens.T_INSERT, INSERT); reservedKeys.put(Tokens.T_INT, INT); reservedKeys.put(Tokens.T_INTEGER, INTEGER); reservedKeys.put(Tokens.T_INTERSECT, INTERSECT); reservedKeys.put(Tokens.T_INTERSECTION, INTERSECTION); reservedKeys.put(Tokens.T_INTERVAL, INTERVAL); reservedKeys.put(Tokens.T_INTO, INTO); reservedKeys.put(Tokens.T_IS, IS); reservedKeys.put(Tokens.T_ITERATE, ITERATE); reservedKeys.put(Tokens.T_JOIN, JOIN); reservedKeys.put(Tokens.T_LAG, LAG); reservedKeys.put(Tokens.T_LANGUAGE, LANGUAGE); reservedKeys.put(Tokens.T_LARGE, LARGE); reservedKeys.put(Tokens.T_LAST_VALUE, LAST_VALUE); reservedKeys.put(Tokens.T_LATERAL, LATERAL); reservedKeys.put(Tokens.T_LEAD, LEAD); reservedKeys.put(Tokens.T_LEADING, LEADING); reservedKeys.put(Tokens.T_LEAVE, LEAVE); reservedKeys.put(Tokens.T_LEFT, LEFT); reservedKeys.put(Tokens.T_LIKE, LIKE); reservedKeys.put(Tokens.T_LIKE_REGX, LIKE_REGEX); reservedKeys.put(Tokens.T_LN, LN); reservedKeys.put(Tokens.T_LOCAL, LOCAL); reservedKeys.put(Tokens.T_LOCALTIME, LOCALTIME); reservedKeys.put(Tokens.T_LOCALTIMESTAMP, LOCALTIMESTAMP); reservedKeys.put(Tokens.T_LOOP, LOOP); reservedKeys.put(Tokens.T_LOWER, LOWER); reservedKeys.put(Tokens.T_MATCH, MATCH); reservedKeys.put(Tokens.T_MAX, MAX); reservedKeys.put(Tokens.T_MAX_CARDINALITY, MAX_CARDINALITY); reservedKeys.put(Tokens.T_MEMBER, MEMBER); reservedKeys.put(Tokens.T_MERGE, MERGE); reservedKeys.put(Tokens.T_METHOD, METHOD); reservedKeys.put(Tokens.T_MIN, MIN); reservedKeys.put(Tokens.T_MINUTE, MINUTE); reservedKeys.put(Tokens.T_MOD, MOD); reservedKeys.put(Tokens.T_MODIFIES, MODIFIES); reservedKeys.put(Tokens.T_MODULE, MODULE); reservedKeys.put(Tokens.T_MONTH, MONTH); reservedKeys.put(Tokens.T_MULTISET, MULTISET); reservedKeys.put(Tokens.T_NATIONAL, NATIONAL); reservedKeys.put(Tokens.T_NATURAL, NATURAL); reservedKeys.put(Tokens.T_NCHAR, NCHAR); reservedKeys.put(Tokens.T_NCLOB, NCLOB); reservedKeys.put(Tokens.T_NEW, NEW); reservedKeys.put(Tokens.T_NO, NO); reservedKeys.put(Tokens.T_NONE, NONE); reservedKeys.put(Tokens.T_NORMALIZE, NORMALIZE); reservedKeys.put(Tokens.T_NOT, NOT); reservedKeys.put(Tokens.T_NTH_VALUE, NTH_VALUE); reservedKeys.put(Tokens.T_NTILE, NTILE); reservedKeys.put(Tokens.T_NULL, NULL); reservedKeys.put(Tokens.T_NULLIF, NULLIF); reservedKeys.put(Tokens.T_NUMERIC, NUMERIC); reservedKeys.put(Tokens.T_OCCURRENCES_REGEX, OCCURRENCES_REGEX); reservedKeys.put(Tokens.T_OCTET_LENGTH, OCTET_LENGTH); reservedKeys.put(Tokens.T_OF, OF); reservedKeys.put(Tokens.T_OFFSET, OFFSET); reservedKeys.put(Tokens.T_OLD, OLD); reservedKeys.put(Tokens.T_ON, ON); reservedKeys.put(Tokens.T_ONLY, ONLY); reservedKeys.put(Tokens.T_OPEN, OPEN); reservedKeys.put(Tokens.T_OR, OR); reservedKeys.put(Tokens.T_ORDER, ORDER); reservedKeys.put(Tokens.T_OUT, OUT); reservedKeys.put(Tokens.T_OUTER, OUTER); reservedKeys.put(Tokens.T_OVER, OVER); reservedKeys.put(Tokens.T_OVERLAPS, OVERLAPS); reservedKeys.put(Tokens.T_OVERLAY, OVERLAY); reservedKeys.put(Tokens.T_PARAMETER, PARAMETER); reservedKeys.put(Tokens.T_PARTITION, PARTITION); reservedKeys.put(Tokens.T_PERCENT_RANK, PERCENT_RANK); reservedKeys.put(Tokens.T_PERCENTILE_CONT, PERCENTILE_CONT); reservedKeys.put(Tokens.T_PERCENTILE_DISC, PERCENTILE_DISC); reservedKeys.put(Tokens.T_POSITION, POSITION); reservedKeys.put(Tokens.T_POSITION_REGEX, POSITION_REGEX); reservedKeys.put(Tokens.T_POWER, POWER); reservedKeys.put(Tokens.T_PRECISION, PRECISION); reservedKeys.put(Tokens.T_PREPARE, PREPARE); reservedKeys.put(Tokens.T_PRIMARY, PRIMARY); reservedKeys.put(Tokens.T_PROCEDURE, PROCEDURE); reservedKeys.put(Tokens.T_RANGE, RANGE); reservedKeys.put(Tokens.T_RANK, RANK); reservedKeys.put(Tokens.T_READS, READS); reservedKeys.put(Tokens.T_REAL, REAL); reservedKeys.put(Tokens.T_RECURSIVE, RECURSIVE); reservedKeys.put(Tokens.T_REF, REF); reservedKeys.put(Tokens.T_REFERENCES, REFERENCES); reservedKeys.put(Tokens.T_REFERENCING, REFERENCING); reservedKeys.put(Tokens.T_REGR_AVGX, REGR_AVGX); reservedKeys.put(Tokens.T_REGR_AVGY, REGR_AVGY); reservedKeys.put(Tokens.T_REGR_COUNT, REGR_COUNT); reservedKeys.put(Tokens.T_REGR_INTERCEPT, REGR_INTERCEPT); reservedKeys.put(Tokens.T_REGR_R2, REGR_R2); reservedKeys.put(Tokens.T_REGR_SLOPE, REGR_SLOPE); reservedKeys.put(Tokens.T_REGR_SXX, REGR_SXX); reservedKeys.put(Tokens.T_REGR_SXY, REGR_SXY); reservedKeys.put(Tokens.T_REGR_SYY, REGR_SYY); reservedKeys.put(Tokens.T_RELEASE, RELEASE); reservedKeys.put(Tokens.T_REPEAT, REPEAT); reservedKeys.put(Tokens.T_RESIGNAL, RESIGNAL); reservedKeys.put(Tokens.T_RETURN, RETURN); reservedKeys.put(Tokens.T_RETURNS, RETURNS); reservedKeys.put(Tokens.T_REVOKE, REVOKE); reservedKeys.put(Tokens.T_RIGHT, RIGHT); reservedKeys.put(Tokens.T_ROLLBACK, ROLLBACK); reservedKeys.put(Tokens.T_ROLLUP, ROLLUP); reservedKeys.put(Tokens.T_ROW, ROW); reservedKeys.put(Tokens.T_ROW_NUMBER, ROW_NUMBER); reservedKeys.put(Tokens.T_ROWS, ROWS); reservedKeys.put(Tokens.T_SAVEPOINT, SAVEPOINT); reservedKeys.put(Tokens.T_SCOPE, SCOPE); reservedKeys.put(Tokens.T_SCROLL, SCROLL); reservedKeys.put(Tokens.T_SEARCH, SEARCH); reservedKeys.put(Tokens.T_SECOND, SECOND); reservedKeys.put(Tokens.T_SELECT, SELECT); reservedKeys.put(Tokens.T_SENSITIVE, SENSITIVE); reservedKeys.put(Tokens.T_SESSION_USER, SESSION_USER); reservedKeys.put(Tokens.T_SET, SET); reservedKeys.put(Tokens.T_SIGNAL, SIGNAL); reservedKeys.put(Tokens.T_SIMILAR, SIMILAR); reservedKeys.put(Tokens.T_SMALLINT, SMALLINT); reservedKeys.put(Tokens.T_SOME, SOME); reservedKeys.put(Tokens.T_SPECIFIC, SPECIFIC); reservedKeys.put(Tokens.T_SPECIFICTYPE, SPECIFICTYPE); reservedKeys.put(Tokens.T_SQL, SQL); reservedKeys.put(Tokens.T_SQLEXCEPTION, SQLEXCEPTION); reservedKeys.put(Tokens.T_SQLSTATE, SQLSTATE); reservedKeys.put(Tokens.T_SQLWARNING, SQLWARNING); reservedKeys.put(Tokens.T_SQRT, SQRT); reservedKeys.put(Tokens.T_STACKED, STACKED); reservedKeys.put(Tokens.T_START, START); reservedKeys.put(Tokens.T_STATIC, STATIC); reservedKeys.put(Tokens.T_STDDEV_POP, STDDEV_POP); reservedKeys.put(Tokens.T_STDDEV_SAMP, STDDEV_SAMP); reservedKeys.put(Tokens.T_SUBMULTISET, SUBMULTISET); reservedKeys.put(Tokens.T_SUBSTRING, SUBSTRING); reservedKeys.put(Tokens.T_SUBSTRING_REGEX, SUBSTRING_REGEX); reservedKeys.put(Tokens.T_SUM, SUM); reservedKeys.put(Tokens.T_SYMMETRIC, SYMMETRIC); reservedKeys.put(Tokens.T_SYSTEM, SYSTEM); reservedKeys.put(Tokens.T_SYSTEM_USER, SYSTEM_USER); reservedKeys.put(Tokens.T_TABLE, TABLE); reservedKeys.put(Tokens.T_TABLESAMPLE, TABLESAMPLE); reservedKeys.put(Tokens.T_THEN, THEN); reservedKeys.put(Tokens.T_TIME, TIME); reservedKeys.put(Tokens.T_TIMESTAMP, TIMESTAMP); reservedKeys.put(Tokens.T_TIMEZONE_HOUR, TIMEZONE_HOUR); reservedKeys.put(Tokens.T_TIMEZONE_MINUTE, TIMEZONE_MINUTE); reservedKeys.put(Tokens.T_TO, TO); reservedKeys.put(Tokens.T_TRAILING, TRAILING); reservedKeys.put(Tokens.T_TRANSLATE, TRANSLATE); reservedKeys.put(Tokens.T_TRANSLATE_REGEX, TRANSLATE_REGEX); reservedKeys.put(Tokens.T_TRANSLATION, TRANSLATION); reservedKeys.put(Tokens.T_TREAT, TREAT); reservedKeys.put(Tokens.T_TRIGGER, TRIGGER); reservedKeys.put(Tokens.T_TRIM, TRIM); reservedKeys.put(Tokens.T_TRIM_ARRAY, TRIM_ARRAY); reservedKeys.put(Tokens.T_TRUE, TRUE); reservedKeys.put(Tokens.T_TRUNCATE, TRUNCATE); reservedKeys.put(Tokens.T_UESCAPE, UESCAPE); reservedKeys.put(Tokens.T_UNDO, UNDO); reservedKeys.put(Tokens.T_UNION, UNION); reservedKeys.put(Tokens.T_UNIQUE, UNIQUE); reservedKeys.put(Tokens.T_UNKNOWN, UNKNOWN); reservedKeys.put(Tokens.T_UNNEST, UNNEST); reservedKeys.put(Tokens.T_UNTIL, UNTIL); reservedKeys.put(Tokens.T_UPDATE, UPDATE); reservedKeys.put(Tokens.T_UPPER, UPPER); reservedKeys.put(Tokens.T_USER, USER); reservedKeys.put(Tokens.T_USING, USING); reservedKeys.put(Tokens.T_VALUE, VALUE); reservedKeys.put(Tokens.T_VALUES, VALUES); reservedKeys.put(Tokens.T_VAR_POP, VAR_POP); reservedKeys.put(Tokens.T_VAR_SAMP, VAR_SAMP); reservedKeys.put(Tokens.T_VARBINARY, VARBINARY); reservedKeys.put(Tokens.T_VARCHAR, VARCHAR); reservedKeys.put(Tokens.T_VARYING, VARYING); reservedKeys.put(Tokens.T_WHEN, WHEN); reservedKeys.put(Tokens.T_WHENEVER, WHENEVER); reservedKeys.put(Tokens.T_WHERE, WHERE); reservedKeys.put(Tokens.T_WIDTH_BUCKET, WIDTH_BUCKET); reservedKeys.put(Tokens.T_WINDOW, WINDOW); reservedKeys.put(Tokens.T_WITH, WITH); reservedKeys.put(Tokens.T_WITHIN, WITHIN); reservedKeys.put(Tokens.T_WITHOUT, WITHOUT); reservedKeys.put(Tokens.T_WHILE, WHILE); reservedKeys.put(Tokens.T_YEAR, YEAR); } private static final IntValueHashMap commandSet = new IntValueHashMap(299); static { commandSet.put(T_ACTION, ACTION); commandSet.put(T_ADD, ADD); commandSet.put(T_ADMIN, ADMIN); commandSet.put(T_AFTER, AFTER); commandSet.put(T_ALIAS, ALIAS); commandSet.put(T_ALWAYS, ALWAYS); commandSet.put(T_ASC, ASC); commandSet.put(T_AUTHENTICATION, AUTHENTICATION); commandSet.put(T_AUTOCOMMIT, AUTOCOMMIT); commandSet.put(T_BACKUP, BACKUP); commandSet.put(T_BEFORE, BEFORE); commandSet.put(T_BINARY_DOUBLE, BINARY_DOUBLE); commandSet.put(T_BINARY_FLOAT, BINARY_FLOAT); commandSet.put(T_BIT, BIT); commandSet.put(T_BYTE, BYTE); commandSet.put(T_BLOCKING, BLOCKING); commandSet.put(T_BODY, BODY); commandSet.put(T_CACHE, CACHE); commandSet.put(T_CACHED, CACHED); commandSet.put(T_CASCADE, CASCADE); commandSet.put(T_CATALOG, CATALOG); commandSet.put(T_CHARACTERISTICS, CHARACTERISTICS); commandSet.put(T_CHARACTERS, CHARACTERS); commandSet.put(T_CHECKPOINT, CHECKPOINT); commandSet.put(T_CITEXT, CITEXT); commandSet.put(T_CRYPT_KEY, CRYPT_KEY); commandSet.put(T_CLASS, CLASS); commandSet.put(T_CLUSTERED, CLUSTERED); commandSet.put(T_COLLATE, COLLATE); commandSet.put(T_COLLATION, COLLATION); commandSet.put(T_COMMENT, COMMENT); commandSet.put(T_COMMITTED, COMMITTED); commandSet.put(T_COMPACT, COMPACT); commandSet.put(T_COMPRESSED, COMPRESSED); commandSet.put(T_CONDITION_IDENTIFIER, Tokens.CONDITION_IDENTIFIER); commandSet.put(T_CONFLICT, CONFLICT); commandSet.put(T_CONTAINS, CONTAINS); commandSet.put(T_CONTINUE, CONTINUE); commandSet.put(T_CONTROL, CONTROL); commandSet.put(T_CURDATE, CURDATE); commandSet.put(T_CURRVAL, CURRVAL); commandSet.put(T_CURTIME, CURTIME); commandSet.put(T_DATA, DATA); commandSet.put(T_DATABASE, DATABASE); commandSet.put(T_DEADLOCK, DEADLOCK); commandSet.put(T_DEFAULTS, DEFAULTS); commandSet.put(T_DEFRAG, DEFRAG); commandSet.put(T_DELAY, DELAY); commandSet.put(T_DESC, DESC); commandSet.put(T_DIAGNOSTICS, DIAGNOSTICS); commandSet.put(T_DIGEST, DIGEST); commandSet.put(T_DOMAIN, DOMAIN); commandSet.put(T_EVENT, EVENT); commandSet.put(T_EXCLUDING, EXCLUDING); commandSet.put(T_EXPLAIN, EXPLAIN); commandSet.put(T_FILE, FILE); commandSet.put(T_FILES, FILES); commandSet.put(T_FINAL, FINAL); commandSet.put(T_FIRST, FIRST); commandSet.put(T_FORMAT, FORMAT); commandSet.put(T_FOUND, FOUND); commandSet.put(T_G_FACTOR, G); commandSet.put(T_GC, GC); commandSet.put(T_GENERATED, GENERATED); commandSet.put(T_GRANTED, GRANTED); commandSet.put(T_GROUP_CONCAT, GROUP_CONCAT); commandSet.put(T_HEADER, HEADER); commandSet.put(T_IF, Tokens.IF); commandSet.put(T_IGNORECASE, IGNORECASE); commandSet.put(T_IMMEDIATELY, IMMEDIATELY); commandSet.put(T_INCLUDING, INCLUDING); commandSet.put(T_INCREMENT, INCREMENT); commandSet.put(T_INDEX, INDEX); commandSet.put(T_INITIAL, INITIAL); commandSet.put(T_INPUT, INPUT); commandSet.put(T_INSTEAD, INSTEAD); commandSet.put(T_INTEGRITY, INTEGRITY); commandSet.put(T_IS_AUTOCOMMIT, IS_AUTOCOMMIT); commandSet.put(T_ISOLATION, ISOLATION); commandSet.put(T_IS_READONLY_DATABASE, IS_READONLY_DATABASE); commandSet.put(T_IS_READONLY_DATABASE_FILES, IS_READONLY_DATABASE_FILES); commandSet.put(T_IS_READONLY_SESSION, IS_READONLY_SESSION); commandSet.put(T_JAVA, JAVA); commandSet.put(T_K_FACTOR, K); commandSet.put(T_KEY, KEY); commandSet.put(T_LAST, LAST); commandSet.put(T_LASTVAL, LASTVAL); commandSet.put(T_LENGTH, LENGTH); commandSet.put(T_LEVEL, LEVEL); commandSet.put(T_LIBRARY, LIBRARY); commandSet.put(T_LIMIT, LIMIT); commandSet.put(T_LOB, LOB); commandSet.put(T_LOCK, LOCK); commandSet.put(T_LOCKS, LOCKS); commandSet.put(T_LONG, LONG); commandSet.put(T_LONGVAR, LONGVAR); commandSet.put(T_M_FACTOR, M); commandSet.put(T_MATCHED, MATCHED); commandSet.put(T_MAXROWS, MAXROWS); commandSet.put(T_MAXVALUE, MAXVALUE); commandSet.put(T_MEDIAN, MEDIAN); commandSet.put(T_MEMORY, MEMORY); commandSet.put(T_MESSAGE_TEXT, MESSAGE_TEXT); commandSet.put(T_MILLIS, MILLIS); commandSet.put(T_MINUS_EXCEPT, MINUS_EXCEPT); commandSet.put(T_MINVALUE, MINVALUE); commandSet.put(T_MORE, MORE); commandSet.put(T_MVCC, MVCC); commandSet.put(T_MVLOCKS, MVLOCKS); commandSet.put(T_NAME, NAME); commandSet.put(T_NEXT, NEXT); commandSet.put(T_NEXTVAL, NEXTVAL); commandSet.put(T_NAN, NAN); commandSet.put(T_NIO, NIO); commandSet.put(T_NOW, NOW); commandSet.put(T_NULLS, NULLS); commandSet.put(T_NUMBER, NUMBER); commandSet.put(T_NVARCHAR2, NVARCHAR2); commandSet.put(T_NVL2, NVL2); commandSet.put(T_OBJECT, OBJECT); commandSet.put(T_OCTETS, OCTETS); commandSet.put(T_OFF, OFF); commandSet.put(T_OPTION, OPTION); commandSet.put(T_ORDINALITY, ORDINALITY); commandSet.put(T_OVERRIDING, OVERRIDING); commandSet.put(T_P_FACTOR, P); commandSet.put(T_PAD, PAD); commandSet.put(T_PARTIAL, PARTIAL); commandSet.put(T_PASSWORD, PASSWORD); commandSet.put(T_PLACING, PLACING); commandSet.put(T_PLAN, PLAN); commandSet.put(T_PRESERVE, PRESERVE); commandSet.put(T_PRIVILEGES, PRIVILEGES); commandSet.put(T_PROPERTY, PROPERTY); commandSet.put(T_RAW, RAW); commandSet.put(T_READ, READ); commandSet.put(T_READONLY, READONLY); commandSet.put(T_REFERENTIAL, REFERENTIAL); commandSet.put(T_REGULAR, REGULAR); commandSet.put(T_RENAME, RENAME); commandSet.put(T_REPEATABLE, REPEATABLE); commandSet.put(T_RESET, RESET); commandSet.put(T_RESTART, RESTART); commandSet.put(T_RESTRICT, RESTRICT); commandSet.put(T_RESULT, RESULT); commandSet.put(T_ROLE, ROLE); commandSet.put(T_ROUTINE, ROUTINE); commandSet.put(T_ROW_COUNT, ROW_COUNT); commandSet.put(T_ROWNUM, ROWNUM); commandSet.put(T_SCALE, SCALE); commandSet.put(T_SCHEMA, SCHEMA); commandSet.put(T_SCRIPT, SCRIPT); commandSet.put(T_SEQUENCE, SEQUENCE); commandSet.put(T_SEPARATOR, SEPARATOR); commandSet.put(T_SERIALIZABLE, SERIALIZABLE); commandSet.put(T_SERVER, SERVER); commandSet.put(T_SESSION, SESSION); commandSet.put(T_SETS, SETS); commandSet.put(T_SHUTDOWN, SHUTDOWN); commandSet.put(T_SIMPLE, SIMPLE); commandSet.put(T_SIZE, SIZE); commandSet.put(T_SOURCE, SOURCE); commandSet.put(T_SQL_BIGINT, SQL_BIGINT); commandSet.put(T_SQL_BINARY, SQL_BINARY); commandSet.put(T_SQL_BIT, SQL_BIT); commandSet.put(T_SQL_BLOB, SQL_BLOB); commandSet.put(T_SQL_BOOLEAN, SQL_BOOLEAN); commandSet.put(T_SQL_CHAR, SQL_CHAR); commandSet.put(T_SQL_CLOB, SQL_CLOB); commandSet.put(T_SQL_DATALINK, SQL_DATALINK); commandSet.put(T_SQL_DATE, SQL_DATE); commandSet.put(T_SQL_DECIMAL, SQL_DECIMAL); commandSet.put(T_SQL_DOUBLE, SQL_DOUBLE); commandSet.put(T_SQL_FLOAT, SQL_FLOAT); commandSet.put(T_SQL_INTEGER, SQL_INTEGER); commandSet.put(T_SQL_LONGNVARCHAR, SQL_LONGNVARCHAR); commandSet.put(T_SQL_LONGVARBINARY, SQL_LONGVARBINARY); commandSet.put(T_SQL_LONGVARCHAR, SQL_LONGVARCHAR); commandSet.put(T_SQL_NCHAR, SQL_NCHAR); commandSet.put(T_SQL_NCLOB, SQL_NCLOB); commandSet.put(T_SQL_NUMERIC, SQL_NUMERIC); commandSet.put(T_SQL_NVARCHAR, SQL_NVARCHAR); commandSet.put(T_SQL_REAL, SQL_REAL); commandSet.put(T_SQL_ROWID, SQL_ROWID); commandSet.put(T_SQL_SMALLINT, SQL_SMALLINT); commandSet.put(T_SQL_SQLXML, SQL_SQLXML); commandSet.put(T_SQL_TIME, SQL_TIME); commandSet.put(T_SQL_TIMESTAMP, SQL_TIMESTAMP); commandSet.put(T_SQL_TINYINT, SQL_TINYINT); commandSet.put(T_SQL_VARBINARY, SQL_VARBINARY); commandSet.put(T_SQL_VARCHAR, SQL_VARCHAR); commandSet.put(T_SQL_TSI_DAY, SQL_TSI_DAY); commandSet.put(T_SQL_TSI_FRAC_SECOND, SQL_TSI_FRAC_SECOND); commandSet.put(T_SQL_TSI_MILLI_SECOND, SQL_TSI_MILLI_SECOND); commandSet.put(T_SQL_TSI_HOUR, SQL_TSI_HOUR); commandSet.put(T_SQL_TSI_MINUTE, SQL_TSI_MINUTE); commandSet.put(T_SQL_TSI_MONTH, SQL_TSI_MONTH); commandSet.put(T_SQL_TSI_QUARTER, SQL_TSI_QUARTER); commandSet.put(T_SQL_TSI_SECOND, SQL_TSI_SECOND); commandSet.put(T_SQL_TSI_WEEK, SQL_TSI_WEEK); commandSet.put(T_SQL_TSI_YEAR, SQL_TSI_YEAR); commandSet.put(T_STATEMENT, STATEMENT); commandSet.put(T_STYLE, STYLE); commandSet.put(T_SYNTAX, SYNTAX); commandSet.put(T_T_FACTOR, T); commandSet.put(T_TDC, TDC); commandSet.put(T_TEMP, TEMP); commandSet.put(T_TEMPORARY, TEMPORARY); commandSet.put(T_TEXT, TEXT); commandSet.put(T_TYPES, TYPES); commandSet.put(T_TIMESTAMPADD, TIMESTAMPADD); commandSet.put(T_TIMESTAMPDIFF, TIMESTAMPDIFF); commandSet.put(T_TOP, TOP); commandSet.put(T_TRANSACTION, TRANSACTION); commandSet.put(T_TRANSACTION_ACTIVE, TRANSACTION_ACTIVE); commandSet.put(T_TRANSACTS_COMMITTED, TRANSACTIONS_COMMITTED); commandSet.put(T_TRANSACTS_ROLLED_BACK, TRANSACTIONS_ROLLED_BACK); commandSet.put(T_TTI, TTI); commandSet.put(T_TYPE, TYPE); commandSet.put(T_UNCOMMITTED, UNCOMMITTED); commandSet.put(T_USAGE, USAGE); commandSet.put(T_VIEW, VIEW); commandSet.put(T_VARCHAR2, VARCHAR2); commandSet.put(T_WORK, WORK); commandSet.put(T_WRAPPER, WRAPPER); commandSet.put(T_WRITE, WRITE); commandSet.put(T_WRITE_DELAY, WRITE_DELAY); commandSet.put(T_ZONE, ZONE); // commandSet.put(T_ACOS, ACOS); commandSet.put(T_ACTION_ID, ACTION_ID); commandSet.put(T_ARRAY_SORT, ARRAY_SORT); commandSet.put(T_ASCII, ASCII); commandSet.put(T_ASIN, ASIN); commandSet.put(T_ATAN, ATAN); commandSet.put(T_ATAN2, ATAN2); commandSet.put(T_BITAND, BITAND); commandSet.put(T_BITANDNOT, BITANDNOT); commandSet.put(T_BITLENGTH, BITLENGTH); commandSet.put(T_BITNOT, BITNOT); commandSet.put(T_BITOR, BITOR); commandSet.put(T_BITXOR, BITXOR); commandSet.put(T_CASEWHEN, Tokens.CASEWHEN); commandSet.put(T_CONCAT_WORD, CONCAT_WORD); commandSet.put(T_CHR, CHR); commandSet.put(T_COS, COS); commandSet.put(T_COT, COT); commandSet.put(T_DATABASE_NAME, DATABASE_NAME); commandSet.put(T_DATE_ADD, DATE_ADD); commandSet.put(T_DATE_SUB, DATE_SUB); commandSet.put(T_DATEADD, DATEADD); commandSet.put(T_DATEDIFF, DATEDIFF); commandSet.put(T_DAY_NAME, DAY_NAME); commandSet.put(T_DAY_OF_MONTH, DAY_OF_MONTH); commandSet.put(T_DAY_OF_WEEK, DAY_OF_WEEK); commandSet.put(T_DAY_OF_YEAR, DAY_OF_YEAR); commandSet.put(T_DAYNAME, DAYNAME); commandSet.put(T_DAYOFMONTH, DAYOFMONTH); commandSet.put(T_DAYOFWEEK, DAYOFWEEK); commandSet.put(T_DAYOFYEAR, DAYOFYEAR); commandSet.put(T_DAYS, DAYS); commandSet.put(T_DECODE, DECODE); commandSet.put(T_DEGREES, DEGREES); commandSet.put(T_DIFFERENCE, DIFFERENCE); commandSet.put(T_DMOD, DMOD); commandSet.put(T_GREATEST, GREATEST); commandSet.put(T_HEXTORAW, HEXTORAW); commandSet.put(T_IFNULL, Tokens.IFNULL); commandSet.put(T_ISNULL, Tokens.ISNULL); commandSet.put(T_LCASE, LCASE); commandSet.put(T_LEAST, LEAST); commandSet.put(T_LOAD_FILE, LOAD_FILE); commandSet.put(T_LOCATE, LOCATE); commandSet.put(T_LOG, LOG); commandSet.put(T_LOG10, LOG10); commandSet.put(T_LPAD, LPAD); commandSet.put(T_LTRIM, LTRIM); commandSet.put(T_MONTH_NAME, MONTH_NAME); commandSet.put(T_MONTHNAME, MONTHNAME); commandSet.put(T_NAMES, Tokens.NAMES); commandSet.put(T_NVL, Tokens.IFNULL); commandSet.put(T_OCTETLENGTH, OCTETLENGTH); commandSet.put(T_PI, PI); commandSet.put(T_POSITION_ARRAY, POSITION_ARRAY); commandSet.put(T_QUARTER, QUARTER); commandSet.put(T_RADIANS, RADIANS); commandSet.put(T_RAND, RAND); commandSet.put(T_RAWTOHEX, RAWTOHEX); commandSet.put(T_REGEXP_MATCHES, REGEXP_MATCHES); commandSet.put(T_REGEXP_SUBSTRING, REGEXP_SUBSTRING); commandSet.put(T_REGEXP_SUBSTRING_ARRAY, REGEXP_SUBSTRING_ARRAY); commandSet.put(T_REPLACE, REPLACE); commandSet.put(T_REVERSE, REVERSE); commandSet.put(T_ROUND, ROUND); commandSet.put(T_ROUNDMAGIC, ROUNDMAGIC); commandSet.put(T_RPAD, RPAD); commandSet.put(T_RTRIM, RTRIM); commandSet.put(T_SECONDS_MIDNIGHT, SECONDS_MIDNIGHT); commandSet.put(T_SESSION_ID, SESSION_ID); commandSet.put(T_SIGN, SIGN); commandSet.put(T_SIN, SIN); commandSet.put(T_SORT_ARRAY, SORT_ARRAY); commandSet.put(T_SOUNDEX, SOUNDEX); commandSet.put(T_SPACE, SPACE); commandSet.put(T_SUBSTR, SUBSTR); commandSet.put(T_SYSDATE, SYSDATE); commandSet.put(T_SYSTIMESTAMP, SYSTIMESTAMP); commandSet.put(T_TAN, TAN); commandSet.put(T_TO_CHAR, TO_CHAR); commandSet.put(T_TO_DATE, TO_DATE); commandSet.put(T_TO_NUMBER, TO_NUMBER); commandSet.put(T_TO_TIMESTAMP, TO_TIMESTAMP); commandSet.put(T_TODAY, TODAY); commandSet.put(T_TRUNC, TRUNC); commandSet.put(T_UCASE, UCASE); commandSet.put(T_TRANSACTION_ID, TRANSACTION_ID); commandSet.put(T_TRANSACTION_SIZE, TRANSACTION_SIZE); commandSet.put(T_UUID, UUID); commandSet.put(T_UNIX_TIMESTAMP, UNIX_TIMESTAMP); commandSet.put(T_WEEK, WEEK); commandSet.put(T_WEEK_OF_YEAR, WEEK_OF_YEAR); // commandSet.put(T_ISOLATION_LEVEL, ISOLATION_LEVEL); commandSet.put(T_SESSION_ISOLATION_LEVEL, SESSION_ISOLATION_LEVEL); commandSet.put(T_DATABASE_ISOLATION_LEVEL, DATABASE_ISOLATION_LEVEL); commandSet.put(T_TRANSACTION_CONTROL, TRANSACTION_CONTROL); commandSet.put(T_TIMEZONE, TIMEZONE); commandSet.put(T_SESSION_TIMEZONE, SESSION_TIMEZONE); commandSet.put(T_DATABASE_TIMEZONE, DATABASE_TIMEZONE); commandSet.put(T_DATABASE_VERSION, DATABASE_VERSION); commandSet.put(T_LOB_ID, LOB_ID); commandSet.put(T_SEQUENCE_ARRAY, SEQUENCE_ARRAY); // commandSet.put(T_ASTERISK, Tokens.ASTERISK); commandSet.put(T_CLOSEBRACKET, CLOSEBRACKET); commandSet.put(T_COLON, Tokens.COLON); commandSet.put(T_COMMA, Tokens.COMMA); commandSet.put(T_CONCAT, Tokens.CONCAT); commandSet.put(T_DIVIDE, Tokens.DIVIDE); commandSet.put(T_EQUALS, Tokens.EQUALS); commandSet.put(T_GREATER, Tokens.GREATER); commandSet.put(T_GREATER_EQUALS, Tokens.GREATER_EQUALS); commandSet.put(T_LEFTBRACKET, LEFTBRACKET); commandSet.put(T_LESS, Tokens.LESS); commandSet.put(T_LESS_EQUALS, Tokens.LESS_EQUALS); commandSet.put(T_MINUS, Tokens.MINUS); commandSet.put(T_NOT_EQUALS, Tokens.NOT_EQUALS); commandSet.put(T_NOT_EQUALS_ALT, Tokens.NOT_EQUALS); commandSet.put(T_OPENBRACKET, OPENBRACKET); commandSet.put(T_PLUS, Tokens.PLUS); commandSet.put(T_QUESTION, Tokens.QUESTION); commandSet.put(T_RIGHTBRACKET, RIGHTBRACKET); commandSet.put(T_SEMICOLON, SEMICOLON); } static int get(String token) { int type = reservedKeys.get(token, -1); if (type == -1) { return commandSet.get(token, -1); } return type; } public static boolean isCoreKeyword(int token) { return coreReservedWords.contains(token); } public static boolean isKeyword(String token) { return reservedKeys.containsKey(token); } public static int getKeywordID(String token, int defaultValue) { return reservedKeys.get(token, defaultValue); } public static int getNonKeywordID(String token, int defaultValue) { return commandSet.get(token, defaultValue); } public static String getKeyword(int token) { String key = (String) reservedKeys.getKey(token); if (key != null) { return key; } key = (String) commandSet.getKey(token); return key; } private static final OrderedIntHashSet coreReservedWords; static { // minimal set of identifier not allowed as table / column / alias names // these are in effect interpreted as reserved words used by HSQLDB coreReservedWords = new OrderedIntHashSet(128); short[] keyword = { AS, AND, ALL, ANY, AT, AVG, BY, BETWEEN, BOTH, CALL, CASE, CAST, CORRESPONDING, CONVERT, COUNT, COALESCE, CREATE, CROSS, DEFAULT, DISTINCT, DO, DROP, ELSE, EVERY, EXISTS, EXCEPT, FOR, FROM, FULL, GRANT, GROUP, HAVING, INTO, IS, IN, INTERSECT, JOIN, INNER, LEFT, LEADING, LIKE, MAX, MIN, NATURAL, NULLIF, NOT, ON, ORDER, OR, OUTER, PRIMARY, REFERENCES, RIGHT, SELECT, SET, SOME, STDDEV_POP, STDDEV_SAMP, SUM, TABLE, THEN, TO, TRAILING, TRIGGER, UNION, UNIQUE, USING, VALUES, VAR_POP, VAR_SAMP, WHEN, WHERE, WITH, }; for (int i = 0; i < keyword.length; i++) { coreReservedWords.add(keyword[i]); } } public static final short[] SQL_INTERVAL_FIELD_CODES = new short[] { Tokens.YEAR, Tokens.MONTH, Tokens.DAY, Tokens.HOUR, Tokens.MINUTE, Tokens.SECOND }; public static final String[] SQL_INTERVAL_FIELD_NAMES = new String[] { Tokens.T_YEAR, Tokens.T_MONTH, Tokens.T_DAY, Tokens.T_HOUR, Tokens.T_MINUTE, Tokens.T_SECOND }; private static final IntKeyHashMap sqlTSILookup = new IntKeyHashMap(10); static { sqlTSILookup.put(SQL_TSI_DAY, T_SQL_TSI_DAY); sqlTSILookup.put(SQL_TSI_FRAC_SECOND, T_SQL_TSI_FRAC_SECOND); sqlTSILookup.put(SQL_TSI_MILLI_SECOND, T_SQL_TSI_MILLI_SECOND); sqlTSILookup.put(SQL_TSI_HOUR, T_SQL_TSI_HOUR); sqlTSILookup.put(SQL_TSI_MINUTE, T_SQL_TSI_MINUTE); sqlTSILookup.put(SQL_TSI_MONTH, T_SQL_TSI_MONTH); sqlTSILookup.put(SQL_TSI_QUARTER, T_SQL_TSI_QUARTER); sqlTSILookup.put(SQL_TSI_SECOND, T_SQL_TSI_SECOND); sqlTSILookup.put(SQL_TSI_WEEK, T_SQL_TSI_WEEK); sqlTSILookup.put(SQL_TSI_YEAR, T_SQL_TSI_YEAR); } public static String getSQLTSIString(int token) { return (String) sqlTSILookup.get(token); } } hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/hsqldb/Trigger.java0000644000175000017500000001106512007570374023572 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb; // fredt@users 20030727 - signature altered to support update triggers /* Contents of row1[] and row2[] in each type of trigger. AFTER INSERT - row1[] contains single String object = "Statement-level". AFTER UPDATE - row1[] contains single String object = "Statement-level". AFTER DELETE - row1[] contains single String object = "Statement-level". BEFORE INSERT FOR EACH ROW - row2[] contains data about to be inserted and this can be modified within the trigger such that modified data gets written to the database. AFTER INSERT FOR EACH ROW - row2[] contains data just inserted into the table. BEFORE UPDATE FOR EACH ROW - row1[] contains currently stored data and not the data that is about to be updated. - row2[] contains the data that is about to be updated. AFTER UPDATE FOR EACH ROW - row1[] contains old stored data. - row2[] contains the new data. BEFORE DELETE FOR EACH ROW - row1[] contains row data about to be deleted. AFTER DELETE FOR EACH ROW - row1[] contains row data that has been deleted. List compiled by Andrew Knight (quozzbat@users) */ /** * The interface an HSQLDB TRIGGER must implement. The user-supplied class that * implements this must have a default constructor. * * @author Peter Hudson (peterhudson@users dot sourceforge.net) * @version 1.9.0 * @since 1.7.0 */ public interface Trigger { // type of trigger int INSERT_AFTER = 0; int DELETE_AFTER = 1; int UPDATE_AFTER = 2; int INSERT_AFTER_ROW = 3; int DELETE_AFTER_ROW = 4; int UPDATE_AFTER_ROW = 5; int INSERT_BEFORE_ROW = 6; int DELETE_BEFORE_ROW = 7; int UPDATE_BEFORE_ROW = 8; /** * The method invoked upon each triggered action. * *

                  type contains the integer index id for trigger type, e.g. * TriggerDef.INSERT_AFTER * *

                  For all triggers defined as default FOR EACH STATEMENT both * oldRow and newRow are null. * *

                  For triggers defined as FOR EACH ROW, the following will apply: * *

                  When UPDATE triggers are fired, oldRow contains the existing values * of the table row and newRow contains the new values. * *

                  For INSERT triggers, oldRow is null and newRow contains the table row * to be inserted. For DELETE triggers, newRow is null and oldRow contains * the table row to be deleted. * *

                  For error conditions, users can construct an HsqlException using one * of the static methods of org.hsqldb.error.Error with a predefined * SQL State from org.hsqldb.error.ErrorCode. * * @param type the type as one of the int values defined in the interface * @param trigName the name of the trigger * @param tabName the name of the table upon which the triggered action is * occuring * @param oldRow the old row * @param newRow the new row * @throws HsqlException */ void fire(int type, String trigName, String tabName, Object[] oldRow, Object[] newRow) throws HsqlException; } hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/hsqldb/server/0000755000175000017500000000000012007570374022627 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/hsqldb/server/Servlet.java0000644000175000017500000003317712007570374025131 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ package org.hsqldb.server; import java.io.DataInputStream; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.hsqldb.DatabaseManager; import org.hsqldb.DatabaseURL; import org.hsqldb.HsqlException; import org.hsqldb.Session; import org.hsqldb.lib.DataOutputStream; import org.hsqldb.lib.HsqlByteArrayOutputStream; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.result.Result; import org.hsqldb.result.ResultConstants; import org.hsqldb.rowio.RowInputBinary; import org.hsqldb.rowio.RowOutputBinary; // fredt@users 20020130 - patch 475586 by wreissen@users // fredt@users 20020328 - patch 1.7.0 by fredt - error trapping // fredt@users 20030630 - patch 1.7.2 - new protocol, persistent sessions // fredt@users 20041112 - patch by Willian Crick - use web_inf directory /** * Servlet can act as an interface between the client and the database for the * the client / server mode of HSQL Database Engine. It uses the HTTP protocol * for communication. This class is not required if the included HSQLDB * Weberver is used on the server host. But if the host is running a J2EE * application server or a servlet container such as Tomcat, the Servlet class * can be hosted on this server / container to serve external requests from * external hosts.

                  * The remote applet / application should * use the normal JDBC interfaces to connect to the URL of this servlet. An * example URL is: *

                   * jdbc:hsqldb:http://myhost.com:8080/servlet/org.hsqldb.server.Servlet
                   * 
                  * The database path/name is taken from the servlet engine property: *
                   * hsqldb.server.database
                   * 
                  *

                  * If the database is deployed in the WEB-INF directory of the servlet container, * the property: *

                   *  hsqldb.server.use_web-inf_path
                   * 
                  * should be set "true" in the web.xml file of the servlet container. * In this case, the database path should begin with a "/". * * JDBC connections via the HTTP protocol are persistent * in the JDBC sense. The JDBC Connection that is established can support * transactions spanning several Statement calls and real PreparedStatement * calls are supported. This class has been rewritten to support the new * features.

                  * (fredt@users)

                  * * Extensively rewritten for HSQLDB. * * @author Thomas Mueller (Hypersonic SQL Group) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 2.2.9 * @since Hypersonic SQL */ public class Servlet extends javax.servlet.http.HttpServlet { private static final int BUFFER_SIZE = 256; private String dbType; private String dbPath; private String errorStr; private RowOutputBinary rowOut; private RowInputBinary rowIn; private int iQueries; public void init(ServletConfig config) { try { super.init(config); rowOut = new RowOutputBinary(BUFFER_SIZE, 1); rowIn = new RowInputBinary(rowOut); } catch (ServletException e) { log(e.toString()); } String dbStr = getInitParameter("hsqldb.server.database"); if (dbStr == null) { dbStr = "."; } // begin WEB-INF patch */ String useWebInfStr = getInitParameter("hsqldb.server.use_web-inf_path"); if (!dbStr.equals(".") && "true".equalsIgnoreCase(useWebInfStr)) { dbStr = getServletContext().getRealPath("/") + "WEB-INF/" + dbStr; } // end WEB-INF patch HsqlProperties dbURL = DatabaseURL.parseURL(dbStr, false, false); log("Database filename = " + dbStr); if (dbURL == null) { errorStr = "Bad Database name"; } else { dbPath = dbURL.getProperty("database"); dbType = dbURL.getProperty("connection_type"); try { DatabaseManager.getDatabase(dbType, dbPath, dbURL); } catch (HsqlException e) { errorStr = e.getMessage(); } } if (errorStr == null) { log("Initialization completed."); } else { log("Database could not be initialised."); log(errorStr); } } private static long lModified = 0; protected long getLastModified(HttpServletRequest req) { // this is made so that the cache of the http server is not used // maybe there is some other way return lModified++; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String query = request.getQueryString(); if ((query == null) || (query.length() == 0)) { response.setContentType("text/html"); // fredt@users 20020130 - patch 1.7.0 by fredt // to avoid caching on the browser response.setHeader("Pragma", "no-cache"); PrintWriter out = response.getWriter(); out.println( "HSQL Database Engine Servlet"); out.println("

                  HSQL Database Engine Servlet

                  "); out.println("The servlet is running.

                  "); if (errorStr == null) { out.println("The database is also running.

                  "); out.println("Database name: " + dbType + dbPath + "

                  "); out.println("Queries processed: " + iQueries + "

                  "); } else { out.println("

                  The database is not running!

                  "); out.println("The error message is:

                  "); out.println(errorStr); } out.println(""); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { synchronized (this) { DataInputStream inStream = null; DataOutputStream dataOut = null; try { // fredt@users - the servlet container, Resin does not return all // the bytes with one call to input.read(b,0,len) when len > 8192 // bytes, the loop in the Result.read() method handles this inStream = new DataInputStream(request.getInputStream()); int databaseID = inStream.readInt(); long sessionID = inStream.readLong(); int mode = inStream.readByte(); Session session = DatabaseManager.getSession(databaseID, sessionID); Result resultIn = Result.newResult(session, mode, inStream, rowIn); resultIn.setDatabaseId(databaseID); resultIn.setSessionId(sessionID); Result resultOut; int type = resultIn.getType(); if (type == ResultConstants.CONNECT) { try { session = DatabaseManager.newSession( dbType, dbPath, resultIn.getMainString(), resultIn.getSubString(), new HsqlProperties(), resultIn.getZoneString(), resultIn.getUpdateCount()); resultIn.readAdditionalResults(null, inStream, rowIn); resultOut = Result.newConnectionAcknowledgeResponse( session.getDatabase(), session.getId(), session.getDatabase().getDatabaseID()); } catch (HsqlException e) { resultOut = Result.newErrorResult(e); } } else if (type == ResultConstants.DISCONNECT || type == ResultConstants.RESETSESSION) { // Upon DISCONNECT 6 bytes are read by the ClientConnectionHTTP": mode (1 byte), a length (int), and an 'additional results (1 byte) response.setHeader("Cache-Control", "no-cache"); // DB-traffic should not be cached by proxy's response.setContentType("application/octet-stream"); response.setContentLength(6); // Only acquire output-stream after headers are set dataOut = new DataOutputStream(response.getOutputStream()); dataOut.writeByte(ResultConstants.DISCONNECT); // Mode dataOut.writeInt(4); //Length Int of first result is always read! Minvalue is 4: It is the number of bytes of the current result (it includes the length of this Int itself) dataOut.writeByte(ResultConstants.NONE); // No Additional results dataOut.close(); return; } else { int dbId = resultIn.getDatabaseId(); long sessionId = resultIn.getSessionId(); session = DatabaseManager.getSession(dbId, sessionId); resultIn.readLobResults(session, inStream, rowIn); resultOut = session.execute(resultIn); } HsqlByteArrayOutputStream memStream = new HsqlByteArrayOutputStream(); DataOutputStream tempOutput = new DataOutputStream(memStream); resultOut.write(session, tempOutput, rowOut); response.setHeader("Cache-Control", "no-cache"); // DB-traffic should not be cached by proxy's response.setContentType("application/octet-stream"); response.setContentLength(memStream.size()); // Only acquire output-stream after headers are set dataOut = new DataOutputStream(response.getOutputStream()); memStream.writeTo(dataOut); iQueries++; } catch (HsqlException e) {} finally { if (dataOut != null) { dataOut.close(); } if (inStream != null) { inStream.close(); } } } // Trace.printSystemOut("Queries processed: "+iQueries+" \n"); } } hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/hsqldb/server/WebServer.java0000644000175000017500000002454412007570374025407 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.server; import org.hsqldb.lib.FileUtil; import org.hsqldb.persist.HsqlProperties; import org.hsqldb.resources.BundleHandler; // fredt@users 20020215 - patch 1.7.0 by fredt // method rorganised to use new HsqlServerProperties class // unsaved@users 20021113 - patch 1.7.2 - SSL support // boucherb@users 20030510 - patch 1.7.2 - SSL support moved to factory interface // boucherb@users 20030510 - patch 1.7.2 - moved all common code to Server // boucherb@users 20030510 - patch 1.7.2 - general lint removal /** * The HSQLDB HTTP protocol network database server.

                  * * WebServer has two distinct functions:

                  * * The primary function is to allow client/server access to HSQLDB databases * via the HTTP protocol. This protocol is less efficient than the HSQL * protocol used by the Server class and should be used only in situations * where sandboxes or firewalls between the client and the server do not * allow the use of the HSQL protocol. One example is client/server access by * an applet running in browsers on remote hosts and accessing the database * engine on the HTTP server from which the applet originated. From version * 1.7.2, HTTP database connections are persistent and support transactions. * Similar to HSQL connections, they should be explicitly closed to free the * server resources.

                  * * The secondary function of WebServer is to act as a simple general purpose * HTTP server. It is aimed to support the minimum requirements set out by * the HTTP/1.0 standard. The HEAD and GET methods can be used to query and * retreive static files from the HTTP server.

                  * * Both the database server and HTTP server functions of WebServer can be * configured with the webserver.properties file. It contains entries for the * database server similar to those for the HSQL protocol Server class. In * addition, a list mapping different file endings to their mime types may be * included in this file. (fredt@users)

                  * * From the command line, the options are as follows:

                  *

                   * +-----------------+-------------+----------+------------------------------+
                   * |    OPTION       |    TYPE     | DEFAULT  |         DESCRIPTION          |
                   * +-----------------+-------------+----------+------------------------------|
                   * | --help          |             |          | prints this message          |
                   * | --address       | name|number | any      | server inet address          |
                   * | --port          | number      | 80       | port at which server listens |
                   * | --database.i    | [type]spec  | 0=test   | path of database i           |
                   * | --dbname.i      | alias       |          | url alias for database i     |
                   * | --silent        | true|false  | true     | false => display all queries |
                   * | --trace         | true|false  | false    | display JDBC trace messages  |
                   * | --no_system_exit| true|false  | false    | do not issue System.exit()   |
                   * +-----------------+-------------+----------+------------------------------+
                   * 
                  * * Example of the webserver.properties file: * *
                   * server.port=80
                   * server.database.0=test
                   * server.dbname.0=...
                   * ...
                   * server.database.n=...
                   * server.dbname.n=...
                   * server.silent=true
                   *
                   * .htm=text/html
                   * .html=text/html
                   * .txt=text/plain
                   * .gif=image/gif
                   * .class=application/octet-stream
                   * .jpg=image/jpeg
                   * .jgep=image/jpeg
                   * .zip=application/x-zip-compressed
                   * 
                  * *
                    *
                  • For server.root, use '/' as the separator, even for DOS/Windows. *
                  • File extensions for mime types must be lowercase and start with '.' *
                  * * @author Campbell Boucher-Burnet (boucherb@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.7.2 * @since 1.7.2 */ public class WebServer extends Server { /** * Handle to resource bundle providing i18n for things like * HTTP error pages. */ static int webBundleHandle = BundleHandler.getBundleHandle("webserver", null); public WebServer() { super(ServerConstants.SC_PROTOCOL_HTTP); } /** * Starts a new WebServer. * * @param args the "command line" parameters with which to start * the WebServer. "-?" will cause the command line arguments * help to be printed to the standard output */ public static void main(String[] args) { HsqlProperties argProps = null; argProps = HsqlProperties.argArrayToProps(args, ServerProperties.sc_key_prefix); String[] errors = argProps.getErrorKeys(); if (errors.length != 0) { System.out.println("no value for argument:" + errors[0]); printHelp("webserver.help"); return; } String propsPath = argProps.getProperty(ServerProperties.sc_key_props); String propsExtension = ""; if (propsPath == null) { propsPath = "webserver"; propsExtension = ".properties"; } propsPath = FileUtil.getFileUtil().canonicalOrAbsolutePath(propsPath); ServerProperties fileProps = ServerConfiguration.getPropertiesFromFile( ServerConstants.SC_PROTOCOL_HTTP, propsPath, propsExtension); ServerProperties props = fileProps == null ? new ServerProperties(ServerConstants.SC_PROTOCOL_HTTP) : fileProps; props.addProperties(argProps); ServerConfiguration.translateDefaultDatabaseProperty(props); // Standard behaviour when started from the command line // is to halt the VM when the server shuts down. This may, of // course, be overridden by whatever, if any, security policy // is in place. ServerConfiguration.translateDefaultNoSystemExitProperty(props); ServerConfiguration.translateAddressProperty(props); // finished setting up properties; Server server = new WebServer(); try { server.setProperties(props); } catch (Exception e) { server.printError("Failed to set properties"); server.printStackTrace(e); return; } // now messages go to the channel specified in properties server.print("Startup sequence initiated from main() method"); if (fileProps != null) { server.print("Loaded properties from [" + propsPath + ".properties]"); } else { server.print("Could not load properties from file"); server.print("Using cli/default properties only"); } server.start(); } /** * Retrieves the name of the web page served when no page is specified. * This attribute is relevant only when server protocol is HTTP(S). * * @return the name of the web page served when no page is specified * * @jmx.managed-attribute * access="read-write" * description="Used when server protocol is HTTP(S)" */ public String getDefaultWebPage() { return serverProperties.getProperty( ServerProperties.sc_key_web_default_page); } /** * Retrieves a String object describing the command line and * properties options for this Server. * * @return the command line and properties options help for this Server */ public String getHelpString() { return BundleHandler.getString(serverBundleHandle, "webserver.help"); } /** * Retrieves this server's product name.

                  * * Typically, this will be something like: "HSQLDB xxx server". * * @return the product name of this server * * @jmx.managed-attribute * access="read-only" * description="Of Server" */ public String getProductName() { return "HSQLDB web server"; } /** * Retrieves a string respresentaion of the network protocol * this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'. * * @return string respresentation of this server's protocol * * @jmx.managed-attribute * access="read-only" * description="Used to handle connections" */ public String getProtocol() { return isTls() ? "HTTPS" : "HTTP"; } /** * Retrieves the root context (directory) from which web content * is served. This property is relevant only when the server * protocol is HTTP(S). Although unlikely, it may be that in the future * other contexts, such as jar urls may be supported, so that pages can * be served from the contents of a jar or from the JVM class path. * * @return the root context (directory) from which web content is served * * @jmx.managed-attribute * access="read-write" * description="Context (directory)" */ public String getWebRoot() { return serverProperties.getProperty(ServerProperties.sc_key_web_root); } } hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/hsqldb/test/0000755000175000017500000000000012007570374022300 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/hsqldb/test/TestBase.java0000644000175000017500000001457312007570374024667 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.test; import java.lang.reflect.Constructor; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import org.hsqldb.server.Server; import org.hsqldb.server.WebServer; import junit.framework.TestCase; import junit.framework.TestResult; /** * HSQLDB TestBugBase Junit test case.

                  * * By setting the booleans isNetwork, isHTTP, isUseTestServlet below, you can execute all tests that derive from this TestBase class * using either the embedded HSQL server mode in both HSQL or HTTP protocol, or target the HSQL-Servlet mode running in for example * Tomcat. * * When running against the Servlet: This assumes you have a WebApplication called HSQLwebApp running in for example Tomcat, with hsqldb.jar * (or better hsqldbtest.jar renamed to hsqldb.jar) in the WEB-INF/lib directory and web.xml containing something like this:

                  * * {@literal * * test * org.hsqldb.server.Servlet * * hsqldb.server.database * mem:test * * 1 * * * * test * /test * * } * @author boucherb@users * @version 1.7.2 * @since 1.7.2 */ public abstract class TestBase extends TestCase { String serverProps; String url; String user = "sa"; String password = ""; Server server; boolean isNetwork = true; boolean isHTTP = true; // Set false to test HSQL protocol, true to test HTTP, in which case you can use isUseTestServlet to target either HSQL's webserver, or the Servlet server-mode boolean isServlet = false; public TestBase(String name) { super(name); } public TestBase(String name, String url, boolean isNetwork, boolean isHTTP) { super(name); this.isNetwork = isNetwork; this.url = url; this.isHTTP = isHTTP; } protected void setUp() { if (isNetwork) { // change the url to reflect your preferred db location and name if (url == null) { if (isServlet) { url = "jdbc:hsqldb:http://localhost:8080/HSQLwebApp/test"; } else if (isHTTP) { url = "jdbc:hsqldb:http://localhost:8085/test"; } else { url = "jdbc:hsqldb:hsql://localhost/test"; } } if (!isServlet) { server = isHTTP ? new WebServer() : new Server(); if (isHTTP) { server.setPort(8085); } server.setDatabaseName(0, "test"); server.setDatabasePath( 0, "mem:test;sql.enforce_strict_size=true"); server.setLogWriter(null); server.setErrWriter(null); server.start(); } } else { if (url == null) { url = "jdbc:hsqldb:file:test;sql.enforce_strict_size=true"; } } try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); } catch (Exception e) { e.printStackTrace(); System.out.println(this + ".setUp() error: " + e.getMessage()); } } protected void tearDown() { if (isNetwork && !isServlet) { server.stop(); server = null; } } Connection newConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } public static void runWithResult(Class testCaseClass, String testName) { try { Constructor ctor = testCaseClass.getConstructor(new Class[]{ String.class }); TestBase theTest = (TestBase) ctor.newInstance(new Object[]{ testName }); theTest.runWithResult(); } catch (Exception ex) { System.err.println("couldn't execute test:"); ex.printStackTrace(System.err); } } public void runWithResult() { TestResult result = run(); String testName = this.getClass().getName(); if (testName.startsWith("org.hsqldb.test.")) { testName = testName.substring(16); } testName += "." + getName(); int failureCount = result.failureCount(); System.out.println(testName + " failure count: " + failureCount); java.util.Enumeration failures = result.failures(); while (failures.hasMoreElements()) { System.err.println(failures.nextElement()); } } } hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/hsqldb/sample/0000755000175000017500000000000012007570374022602 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/hsqldb/sample/TriggerSample.java0000644000175000017500000004360712007570374026224 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.sample; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import org.hsqldb.error.Error; import org.hsqldb.error.ErrorCode; import org.hsqldb.Trigger; import org.hsqldb.lib.StringUtil; // peterhudson@users 20020130 - patch 478657 by peterhudson - new class // fredt@users 20030727 - signature altered // boucherb@users 20040315 - sample updated /** *

                  Sample code for use of triggers in hsqldb. * * This class org.hsqldb.sample package, but a typical implementation is in * users's class hierarchy. * * SQL to invoke is:

                  * CREATE TRIGGER triggerSample BEFORE|AFTER INSERT|UPDATE|DELETE * ON myTable [FOR EACH ROW] [QUEUE n] [NOWAIT] CALL "myPackage.trigClass"
                  * * This will create a thread that will wait for its firing event to occur; * when this happens, the trigger's thread runs the 'trigClass.fire' * Note that this is still in the same Java Virtual Machine as the * database, so make sure the fired method does not hang.

                  * * There is a queue of events waiting to be run by each trigger thread. * This is particularly useful for 'FOR EACH ROW' triggers, when a large * number of trigger events occur in rapid succession, without the trigger * thread getting a chance to run. If the queue becomes full, subsequent * additions to it cause the database engine to suspend awaiting space * in the queue. Take great care to avoid this situation if the trigger * action involves accessing the database, as deadlock will occur. * This can be avoided either by ensuring the QUEUE parameter makes a large * enough queue, or by using the NOWAIT parameter, which causes a new * trigger event to overwrite the most recent event in the queue. * The default queue size is 1024.

                  * * Ensure that "myPackage.trigClass" is present in the classpath which * you use to start hsql.

                  * * If the method wants to access the database, it must establish * a JDBC connection.

                  * * When the 'fire' method is called, it is passed the following arguments:

                  * * fire (int type, String trigName, String tabName, Object oldRow[], * Object[] newRow)

                  * * where 'type' is one of the values enumerated in the Trigger interface and * the 'oldRow'/'newRow' pair represents the rows acted on. The first * length - 1 array slots contain column values and the final slot contains * either null or the value of the internally assigned row identity, if * the concerned table has no primary key. The final slot must _never_ be * modified.

                  * * The mapping of row classes to database types is specified in * /doc/hsqlSyntax.html#Datatypes.

                  * * To be done:

                  * *

                    *
                  1. Implement the "jdbc:default:connection: URL to provide transparent * and portable access to internal connections for use in triggers and * stored procedures.

                    * *

                  2. Implement declaritive column to trigger method argument * mapping, conditional execution (WHEN clause), etc.

                    * *

                  3. Investigate and refine synchronous and asynchronous trigger models.

                    * * Because certain combinations of trigger create parameters cause the * individual triggered actions of a multirow update to run in different * threads, it is possible for an 'after' trigger to run before its * corresponding 'before' trigger; the acceptability and implications * of this needs to be investigated, documented and the behaviour of * the engine fully specified. * *

                  4. Investigate and implement the SQL 200n specified execution stack under * arbitrary triggered action and SQL-invoked routine call graphs. *
                  * * @author Peter Hudson * @author boucherb@users * @version 1.7.2 * @since 1.7.0 */ public class TriggerSample implements Trigger { static final PrintWriter out = new PrintWriter(System.out); static final String drv = "org.hsqldb.jdbc.JDBCDriver"; static final String url = "jdbc:hsqldb:mem:trigger-sample"; static final String usr = "SA"; static final String pwd = ""; static final String impl = TriggerSample.class.getName(); static final String tn = "trig_test"; static final String drop_test_table_stmt = "DROP TABLE " + tn + " IF EXISTS"; static final String create_test_table_stmt = "CREATE TABLE " + tn + "(id INTEGER PRIMARY KEY, value VARCHAR(20))"; static final String drop_audit_table_stmt = "DROP TABLE audit IF EXISTS"; static final String create_audit_table_stmt = "CREATE TABLE audit(" + "id INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1), " + "op VARCHAR(6), " + "tn VARCHAR(20), " + "ors LONGVARCHAR, " + "nrs LONGVARCHAR, " + "ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP)"; static final String audit_insert_stmt = "INSERT INTO audit(op, tn, ors, nrs) VALUES(?, ?, ?, ?)"; /** * A sample HSQLDB Trigger interface implementation.

                  * * This sample prints information about the firing trigger and records * actions in an audit table.

                  * * The techniques used here are simplified dramatically for demonstration * purposes and are in no way recommended as a model upon which to build * actual installations involving triggered actions. * * @param typ trigger type * @param trn trigger name * @param tn table name * @param or old row * @param nr new row */ public void fire(int typ, String trn, String tn, Object[] or, Object[] nr) { synchronized (TriggerSample.class) { String ors = or == null ? "null" : StringUtil.arrayToString(or); String nrs = nr == null ? "null" : StringUtil.arrayToString(nr); out.println("----------------------------------------"); out.println(getTriggerDescriptor(trn, typ, tn)); out.println("old row : " + ors); out.println("new row : " + nrs); out.flush(); if ("TRIG_TEST".equals(tn)) { switch (typ) { case INSERT_BEFORE_ROW : { // Business rule: ID shall be less than 11. // (Marti DiBergi, we love you ;-) // You can cast row[i] given your knowledge of what // the table format is: final int ID = ((Number) nr[0]).intValue(); doAssert(ID < 11, "ID < 11"); break; } case UPDATE_BEFORE_ROW : { // Business rule: ignore update of VALUE 'unchangable'. if ("unchangable".equals(or[1])) { nr[1] = or[1]; // short-circuit the update } // !!!Warning!!! // The engine does not check the class of substituted // values; it's up to you to use the correct class. // For example, this will cause database curruption: // nr[1] = new Integer(5); break; } } } doAuditStep(typ, tn, ors, nrs); } } private static void doAssert(boolean b, String msg) { if (b) { // do nothing } else { throw org.hsqldb.error.Error.error(ErrorCode.GENERAL_ERROR, msg); } } private static void doAuditStep(int typ, String tn, String ors, String nrs) { Connection conn; PreparedStatement stmt; switch (typ) { case INSERT_AFTER_ROW : case UPDATE_AFTER_ROW : case DELETE_AFTER_ROW : { try { conn = getConnection(); stmt = conn.prepareStatement(audit_insert_stmt); stmt.setString(1, getOperationSpec(typ)); stmt.setString(2, tn); stmt.setString(3, ors); stmt.setString(4, nrs); stmt.executeUpdate(); conn.close(); } catch (SQLException se) { se.printStackTrace(); } } } } public static String getWhenSpec(int type) { switch (type) { case INSERT_BEFORE_ROW : case UPDATE_BEFORE_ROW : case DELETE_BEFORE_ROW : { return "BEFORE"; } case INSERT_AFTER : case INSERT_AFTER_ROW : case UPDATE_AFTER : case UPDATE_AFTER_ROW : case DELETE_AFTER : case DELETE_AFTER_ROW : { return "AFTER"; } default : { return ""; } } } public static String getOperationSpec(int type) { switch (type) { case INSERT_AFTER : case INSERT_AFTER_ROW : case INSERT_BEFORE_ROW : { return "INSERT"; } case UPDATE_AFTER : case UPDATE_AFTER_ROW : case UPDATE_BEFORE_ROW : { return "UPDATE"; } case DELETE_AFTER : case DELETE_AFTER_ROW : case DELETE_BEFORE_ROW : { return "DELETE"; } default : { return ""; } } } public static String getQueueSpec(int qs) { return (qs < 0) ? "" : ("QUEUE " + qs); } public static String getForEachSpec(int type) { switch (type) { case INSERT_BEFORE_ROW : case INSERT_AFTER_ROW : case UPDATE_BEFORE_ROW : case UPDATE_AFTER_ROW : case DELETE_AFTER_ROW : case DELETE_BEFORE_ROW : { return "FOR EACH ROW"; } default : { return "FOR EACH STATEMENT"; } } } public static String getTriggerDDL(String trn, int typ, String tab, int qs, String impl) throws SQLException { StringBuffer sb = new StringBuffer(); sb.append("CREATE TRIGGER "); sb.append(trn); sb.append(' '); sb.append(getWhenSpec(typ)); sb.append(' '); sb.append(getOperationSpec(typ)); sb.append(" ON "); sb.append(tab); sb.append(' '); sb.append(getForEachSpec(typ)); sb.append(' '); sb.append(getQueueSpec(qs)); sb.append(" CALL \""); sb.append(impl); sb.append("\""); return sb.toString(); } public static String getTriggerDescriptor(String trn, int typ, String tab) { StringBuffer sb = new StringBuffer(); sb.append("TRIGGER : "); sb.append(trn); sb.append(' '); sb.append(getWhenSpec(typ)); sb.append(' '); sb.append(getOperationSpec(typ)); sb.append(" ON "); sb.append(tab); sb.append(' '); sb.append(getForEachSpec(typ)); return sb.toString(); } private static Connection getConnection() throws SQLException { try { Class.forName(drv).newInstance(); return DriverManager.getConnection(url, usr, pwd); } catch (SQLException se) { throw se; } catch (Exception e) { throw new SQLException(e.toString()); } } private static void createTrigger(Statement stmt, String trn, int typ) throws SQLException { stmt.execute(getTriggerDDL(trn, typ, tn, 0, impl)); } private static void setup() throws SQLException { Connection conn = getConnection(); Statement stmt = conn.createStatement(); stmt.execute(drop_test_table_stmt); stmt.execute(create_test_table_stmt); stmt.execute(drop_audit_table_stmt); stmt.execute(create_audit_table_stmt); createTrigger(stmt, "tibr_" + tn, INSERT_BEFORE_ROW); createTrigger(stmt, "tia_" + tn, INSERT_AFTER); createTrigger(stmt, "tiar_" + tn, INSERT_AFTER_ROW); createTrigger(stmt, "tubr_" + tn, UPDATE_BEFORE_ROW); createTrigger(stmt, "tua_" + tn, UPDATE_AFTER); createTrigger(stmt, "tuar_" + tn, UPDATE_AFTER_ROW); createTrigger(stmt, "tdbr_" + tn, DELETE_BEFORE_ROW); createTrigger(stmt, "tda_" + tn, DELETE_AFTER); createTrigger(stmt, "tdar_" + tn, DELETE_AFTER_ROW); stmt.close(); conn.close(); } private static void doSomeWork() throws SQLException { Connection conn = getConnection(); Statement stmt = conn.createStatement(); conn.setAutoCommit(false); stmt.execute("INSERT INTO trig_test VALUES (1, 'hello')"); stmt.execute("INSERT INTO trig_test VALUES (2, 'now what?')"); stmt.execute("INSERT INTO trig_test VALUES (3, 'unchangable')"); stmt.execute("INSERT INTO trig_test VALUES (4, 'goodbye')"); conn.commit(); dumpTable("trig_test"); stmt.execute("UPDATE trig_test SET value = 'all done'"); conn.commit(); dumpTable("trig_test"); stmt.execute("DELETE FROM trig_test"); conn.rollback(); dumpTable("trig_test"); try { stmt.execute("INSERT INTO trig_test VALUES(11, 'whatever')"); } catch (SQLException se) { se.printStackTrace(); } stmt.execute("INSERT INTO trig_test VALUES(10, 'whatever')"); conn.commit(); dumpTable("trig_test"); stmt.close(); conn.close(); } private static void dumpTable(String tn) throws SQLException { Connection conn = getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from " + tn); ResultSetMetaData rsmd = rs.getMetaData(); int count = rsmd.getColumnCount(); out.println(); out.println("****************************************"); out.println("DUMP FOR TABLE: " + tn); out.println("****************************************"); out.flush(); while (rs.next()) { out.print("["); for (int i = 1; i <= count; i++) { out.print(rs.getString(i)); if (i < count) { out.print(" : "); } } out.println("]"); } out.println(); out.flush(); rs.close(); stmt.close(); conn.close(); } private static void runSample() throws SQLException { setup(); doSomeWork(); dumpTable("audit"); } public static void main(String[] args) throws SQLException { runSample(); } } /* test SQL CREATE CACHED TABLE trig_test (int_field integer) CREATE TRIGGER ins_before BEFORE INSERT ON trig_test CALL "org.hsqldb.sample.TriggerSample" CREATE TRIGGER ins_after AFTER INSERT ON trig_test CALL "org.hsqldb.sample.TriggerSample" CREATE TRIGGER upd_before BEFORE UPDATE ON trig_test CALL "org.hsqldb.sample.TriggerSample" CREATE TRIGGER upd_after AFTER UPDATE ON trig_test CALL "org.hsqldb.sample.TriggerSample" CREATE TRIGGER upd_before_row BEFORE UPDATE ON trig_test FOR EACH ROW CALL "org.hsqldb.sample.TriggerSample" CREATE TRIGGER upd_after_row AFTER UPDATE ON trig_test FOR EACH ROW CALL "org.hsqldb.sample.TriggerSample" CREATE TRIGGER del_before BEFORE DELETE ON trig_test CALL "org.hsqldb.sample.TriggerSample" CREATE TRIGGER del_after AFTER DELETE ON trig_test CALL "org.hsqldb.sample.TriggerSample" CREATE TRIGGER del_before_row BEFORE DELETE ON trig_test FOR EACH ROW CALL "org.hsqldb.sample.TriggerSample" CREATE TRIGGER del_after_row AFTER DELETE ON trig_test FOR EACH ROW CALL "org.hsqldb.sample.TriggerSample" INSERT INTO trig_test VALUES (1) INSERT INTO trig_test VALUES (2) INSERT INTO trig_test VALUES (3) UPDATE trig_test SET int_field = int_field + 3 DELETE FROM trig_test */ hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/hsqldb/sample/Testdb.java0000644000175000017500000001700112007570374024671 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.sample; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; /** * Title: Testdb * Description: simple hello world db example of a * standalone persistent db application * * every time it runs it adds four more rows to sample_table * it does a query and prints the results to standard out * * Author: Karl Meissner karl@meissnersd.com */ public class Testdb { Connection conn; //our connnection to the db - presist for life of program // we dont want this garbage collected until we are done public Testdb(String db_file_name_prefix) throws Exception { // note more general exception // Load the HSQL Database Engine JDBC driver // hsqldb.jar should be in the class path or made part of the current jar Class.forName("org.hsqldb.jdbc.JDBCDriver"); // connect to the database. This will load the db files and start the // database if it is not alread running. // db_file_name_prefix is used to open or create files that hold the state // of the db. // It can contain directory names relative to the // current working directory conn = DriverManager.getConnection("jdbc:hsqldb:" + db_file_name_prefix, // filenames "SA", // username ""); // password } public void shutdown() throws SQLException { Statement st = conn.createStatement(); // db writes out to files and performs clean shuts down // otherwise there will be an unclean shutdown // when program ends st.execute("SHUTDOWN"); conn.close(); // if there are no other open connection } //use for SQL command SELECT public synchronized void query(String expression) throws SQLException { Statement st = null; ResultSet rs = null; st = conn.createStatement(); // statement objects can be reused with // repeated calls to execute but we // choose to make a new one each time rs = st.executeQuery(expression); // run the query // do something with the result set. dump(rs); st.close(); // NOTE!! if you close a statement the associated ResultSet is // closed too // so you should copy the contents to some other object. // the result set is invalidated also if you recycle an Statement // and try to execute some other query before the result set has been // completely examined. } //use for SQL commands CREATE, DROP, INSERT and UPDATE public synchronized void update(String expression) throws SQLException { Statement st = null; st = conn.createStatement(); // statements int i = st.executeUpdate(expression); // run the query if (i == -1) { System.out.println("db error : " + expression); } st.close(); } // void update() public static void dump(ResultSet rs) throws SQLException { // the order of the rows in a cursor // are implementation dependent unless you use the SQL ORDER statement ResultSetMetaData meta = rs.getMetaData(); int colmax = meta.getColumnCount(); int i; Object o = null; // the result set is a cursor into the data. You can only // point to one row at a time // assume we are pointing to BEFORE the first row // rs.next() points to next row and returns true // or false if there is no next row, which breaks the loop for (; rs.next(); ) { for (i = 0; i < colmax; ++i) { o = rs.getObject(i + 1); // Is SQL the first column is indexed // with 1 not 0 System.out.print(o.toString() + " "); } System.out.println(" "); } } //void dump( ResultSet rs ) public static void main(String[] args) { Testdb db = null; try { db = new Testdb("db_file"); } catch (Exception ex1) { ex1.printStackTrace(); // could not start db return; // bye bye } try { //make an empty table // // by declaring the id column IDENTITY, the db will automatically // generate unique values for new rows- useful for row keys db.update( "CREATE TABLE sample_table ( id INTEGER IDENTITY, str_col VARCHAR(256), num_col INTEGER)"); } catch (SQLException ex2) { //ignore //ex2.printStackTrace(); // second time we run program // should throw execption since table // already there // // this will have no effect on the db } try { // add some rows - will create duplicates if run more then once // the id column is automatically generated db.update( "INSERT INTO sample_table(str_col,num_col) VALUES('Ford', 100)"); db.update( "INSERT INTO sample_table(str_col,num_col) VALUES('Toyota', 200)"); db.update( "INSERT INTO sample_table(str_col,num_col) VALUES('Honda', 300)"); db.update( "INSERT INTO sample_table(str_col,num_col) VALUES('GM', 400)"); // do a query db.query("SELECT * FROM sample_table WHERE num_col < 250"); // at end of program db.shutdown(); } catch (SQLException ex3) { ex3.printStackTrace(); } } // main() } // class Testdb hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/src/org/hsqldb/sample/SqlFileEmbedder.java0000644000175000017500000001271312007570374026440 0ustar renerene/* Copyright (c) 2001-2011, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.hsqldb.sample; import java.sql.Connection; import java.sql.SQLException; import org.hsqldb.lib.RCData; import org.hsqldb.cmdline.SqlFile; import org.hsqldb.cmdline.SqlToolError; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * Sample class which executes SQL files, by embedding SqlFile. *

                  * Suitable for using as a template. *

                  * This class also serves as an example of using RCData to allow your * application users to store JDBC access information in a convenient * text file. * * @see #main(String[]) * @see SqlFile * @see RCData * @author Blaine Simpson (blaine dot simpson at admc dot com) */ public class SqlFileEmbedder { private Connection conn; /** * For applications that use a persistent JDBC connection, this class can * be used to encapsulate that connection. (Just strip out the SqlFile * stuff if you don't need that). * * @return The encapsulated JDBC Connection. */ public Connection getConn() { return conn; } /** * Run

                       *     java SqlFileEmbedder
                  * to see Syntax message. */ public static void main(String[] sa) throws Exception { if (sa.length < 3) { System.err.println("SYNTAX: " + SqlFileEmbedder.class.getName() + " path/ro/file.rc URLID file1.sql..."); System.exit(2); } SqlFileEmbedder embedder = new SqlFileEmbedder(new File(sa[0]), sa[1]); String[] files = new String[sa.length - 2]; for (int i = 0; i < sa.length - 2; i++) { files[i] = sa[i + 2]; } try { embedder.executeFiles(files); } finally { try { embedder.getConn().close(); } catch (SQLException se) { // Purposefully ignoring. // We have done what we want and are now going to exit, so // who cares. } } } /** * Instantiates SqlFileEmbedder object and connects to specified database. *

                  * N.b., you do not need to use RCData to use SqlFile. * All SqlFile needs is a live Connection. * I'm using RCData because it is a convenient way for a non-contained * app (i.e. one that doesn't run in a 3rd party container) to get a * Connection. */ public SqlFileEmbedder(File rcFile, String urlid) throws Exception { conn = (new RCData(rcFile, urlid)).getConnection(); conn.setAutoCommit(false); } /** * Your own classes can use this method to execute SQL files. *

                  * See source code for the main(String[]) method for an example of calling * this method. * * @see #main(String[]) */ public void executeFiles(String[] fileStrings) throws IOException, SqlToolError, SQLException { Map sqlVarMap = new HashMap(); sqlVarMap.put("invoker", getClass().getName()); // This variable is pretty useless, but this should show you how to // set variables which you can access inside of scripts like *{this}. File file; SqlFile sqlFile; for (String fileString : fileStrings) { file = new File(fileString); if (!file.isFile()) throw new IOException("SQL file not present: " + file.getAbsolutePath()); sqlFile = new SqlFile(file); sqlFile.setConnection(conn); sqlFile.addUserVars(sqlVarMap); sqlFile.execute(); // The only reason for the following two statements is so that // changes made by one .sql file will effect the future SQL files. // Has no effect if you only execute one SQL file. conn = sqlFile.getConnection(); sqlVarMap = sqlFile.getUserVars(); } } } hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/testrun/0000755000175000017500000000000012007570374020172 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/testrun/sqltool/0000755000175000017500000000000012007570374021667 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/testrun/sqltool/sqlpsm.sql0000644000175000017500000000114512007570374023730 0ustar renerene/* * $Id: sqlpsm.sql 826 2009-01-17 05:04:52Z unsaved $ * * Tests SQL/JRT */ create table customers( id INTEGER default 0, firstname VARCHAR(50), lastname VARCHAR(50), entrytime TIMESTAMP); create procedure new_customer(firstname varchar(50), lastname varchar(50)) modifies sql data insert into customers values ( default, firstname, lastname, current_timestamp) .; SELECT count(*) FROM customers; *if (*? != 0) \q SQL/PSM preparation failed *end if CALL new_customer('blaine', 'simpson'); SELECT count(*) FROM customers; *if (*? != 1) \q SQL/PSM procedure failed *end if hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/testrun/sqltool/sqljrt.sql0000644000175000017500000000047012007570374023730 0ustar renerene/* * $Id: sqljrt.sql 3353 2009-12-15 19:52:13Z unsaved $ * * Tests SQL/JRT */ create function dehex(VARCHAR(80), INTEGER) returns INTEGER no sql language java external name 'CLASSPATH:java.lang.Integer.valueOf' .; CALL dehex('12', 16); *if (*? != 18) \q SQL/JRT function failed *end if hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/0000755000175000017500000000000012007570374017747 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/hsqldb.cfg0000644000175000017500000002127612007570374021715 0ustar renerene# $Id: hsqldb.cfg 3583 2010-05-16 01:49:52Z unsaved $ # Sample configuration file for HyperSQL Server Listener. # See the "HyperSQL on UNIX" chapter of the HyperSQL User Guide. # N.b.!!!! You must place this in the right location for your type of UNIX. # See the init script "hsqldb" to see where this must be placed and # what it should be renamed to. # This file is "sourced" by a Bourne shell, so use Bourne shell syntax. # This file WILL NOT WORK until you set (at least) the non-commented # variables to the appropriate values for your system. # Life will be easier if you avoid all filepaths with spaces or any other # funny characters. Don't ask for support if you ignore this advice. # The URLIDS setting below is new and REQUIRED. This setting replaces the # server.urlid.X settings which used to be needed in your Server's # properties file. # -- Blaine (blaine dot simpson at admc dot com) JAVA_EXECUTABLE=/usr/bin/java # Unless you copied the jar files from another system, this typically # resides at $HSQLDB_HOME/lib/sqltool.jar, where $HSQLDB_HOME is your HSQLDB # software base directory. # The file name may actually have a version label in it, like # sqltool-1.2.3.jar (in which case, you must specify the full name here). # A 'hsqldb.jar' file (with or without version label) must reside in the same # directory as the specified sqltool.jar file. SQLTOOL_JAR_PATH=/opt/hsqldb-2.0.0/hsqldb/lib/sqltool.jar # For the sample value above, there must also exist a file # /opt/hsqldb-2.0.0/hsqldb/lib/hsqldb*.jar. # Where the file "server.properties" or "webserver.properties" resides. SERVER_HOME=/opt/hsqldb-2.0.0/hsqldb/data # What UNIX user the server will run as. # (The shutdown client is always run as root or the invoker of the init script). # Runs as root by default, but you should take the time to set database file # ownerships to another user and set that user name here. HSQLDB_OWNER=hsqldb # The HSQLDB jar file specified in HSQLDB_JAR_PATH above will automatically # be in the class path. This arg specifies additional classpath elements. # To embed your own application, add your jar file(s) or class base # directories here, and add your main class to the INVOC_ADDL_ARGS setting # below. Another common use-case for adding to your class path is to make # classes available to the DB engines for SQL/JRT functions and procedures. #SERVER_ADDL_CLASSPATH=/usr/local/dist/currencybank.jar # For startup or shutdown failures, you can save a lot of debugging time by # temporarily adjusting down MAX_START_SECS and MAX_TERMINATE_SECS to a # little over what it should take for successful startup and shutdown on # your system. # We require all Server/WebServer instances to be accessible within # $MAX_START_SECS from when the Server/WebServer is started. # Defaults to 60. # Raise this is you are running lots of DB instances or have a slow server. #MAX_START_SECS=200 # Max time to allow for JVM to die after all HSQLDB instances stopped. # Defaults to 60. Set high because the script will always continue as soon as # the process has stopped. The importance of this setting is, how long until # a non-stopping-JVM-problem will be detected. #MAX_TERMINATE_SECS=0 # NEW AND IMPORTANT!!! # As noted at the top of this file, this setting replaces the old property # settings server.urlid.X. # Simply list the URLIDs for all DB instances which your *Server starts. # Usually, these will exactly mirror the server.database.X settings in your # server.properties or webserver.properties file. # Each urlid listed here must be defined to a NETWORK url with Admin privileges # in the AUTH_FILE specified below. (Network type because we use this for # inter-process communication) # Separate multiple values with white space. NO OTHER SPECIAL CHARACTERS! # Make sure to quote the entire value if it contains white space separator(s). URLIDS='localhostdb1' # These are urlids # ** IN ADDITION TO URLIDS **, for instances which the init # script should stop but not start. # Most users will not need this setting. If you need it, you'll know it. # Defaults to none (i.e., only URLIDS will be stopped). #SHUTDOWN_URLIDS='ondemand' # SqlTool authentication file used only for shutdown. # The default value will be sqltool.rc in root's home directory, since it is # root who runs the init script. # (See the SqlTool chapter of the HyperSQL Utilities Guide if you don't # understand this). #AUTH_FILE=/home/blaine/sqltool.rc # Typical users will leave this unset and it will default to # org.hsqldb.server.Server. If you need to run the HSQLDB WebServer class # instead, due to a firewall or routing impediment, set this to # org.hsqldb.server.WebServer, see the docs about running WebServr, and # set up a "webserver.properties" file instead of a "server.properties". # The JVM that is started can invoke many classes (see the following item # about that), but this is the server that is used (1) to check status, # (2) to shut down the JVM. #TARGET_CLASS=org.hsqldb.server.WebServer # This is where you may specify both command-line parameters to TARGET_CLASS, # plus any number of additional progams to run (along with their command-line # parameters). The MainInvoker program is used to embed these multiple # static main invocations into a single JVM, so see the API spec for # org.hsqldb.util.MainInvoker if you want to learn more. # N.b. You should only use this setting to set HSQLDB Server or WebServer # parameters if you run multiple instances of this class, since you can use the # server/webserver.properties file for a single instance. # Every additional class (in addition to the TARGET_CLASS) # must be preceded with an empty string, so that MainInvoker will know # you are giving a class name. MainInvoker will invoke the normal # static main(String[]) method of each such class. # By default, MainInvoker will just run TARGET_CLASS with no args. # Example that runs just the TARGET_CLASS with the specified arguments: #INVOC_ADDL_ARGS='-silent false' #but use server.properties property instead! # Example that runs the TARGET_CLASS plus a WebServer: #INVOC_ADDL_ARGS='"" org.hsqldb.server.WebServer' # Note the empty string preceding the class name. # Example that starts TARGET_CLASS with an argument + a WebServer + # your own application with its args (i.e., the HSQLDB Servers are # "embedded" in your application). (Set SERVER_ADDL_CLASSPATH too).: #INVOC_ADDL_ARGS='-silent false "" org.hsqldb.server.WebServer "" com.acme.Stone --env prod localhost' # but use server.properties for -silent option instead! # Example to run a non-TLS server in same JVM with a TLS server. In this # case, TARGET_CLASS is Server which will run both in TLS mode by virtue of # setting the tls, keyStore, and keyStorePassword settings in # server*.properties, as described below; plus an "additional" Server with # overridden 'tls' and 'port' settings: #INVOC_ADDL_ARGS="'' org.hsqldb.server.Server --port 9002 --tls false" # This is an important use case. If you run more than one Server instance, # you can specify different parameters for each here, even though only one # server.properties file is supported. # Note that you use nested quotes to group arguments and to specify the # empty-string delimiter. # The TLS_* settings have been obsoleted. # To get your server running with TLS, set # system.javax.net.ssl.keyStore=/path/to/your/private.keystore # system.javax.net.ssl.keyStorePassword=secretPassword # server.ssl=true # IN server.properties or webserver.properties, and # MAKE THE FILE OWNER-READ-ONLY! # See the TLS Encryption section of the HyperSQL User Guide, paying attention # to the security warning(s). # If you are running with a private server cert, then you will also need to # set "truststore" in the your SqlTool config file (location is set by the # AUTH_FILE variable in this file, or it must be at the default location for # HSQLDB_OWNER). # Any JVM args for the invocation of the JDBC client used to verify DB # instances and to shut them down (SqlToolSprayer). # Server-side System Properties should normally be set with system.* # settings in the server/webserver.properties file. # This example specifies the location of a private trust store for TLS # encryption. # For multiple args, put quotes around entire value. # If you are starting just a TLS_encrypted Listener, you need to uncomment # this so the init scripts uses TLS to connect. # If using a private keystore, you also need to set "truststore" settings in # the sqltool.rc file. #CLIENT_JVMARGS=-Djavax.net.debug=ssl # This sample value displays useful debugging information about TLS/SSL. # Any JVM args for the server. # For multiple args, put quotes around entire value. #SERVER_JVMARGS=-Xmx512m # You can set the "javax.net.debug" property on the server side here, in the # same exact way as shown for the client side above. hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/ldap-exerciser.properties0000644000175000017500000000353312007570374025000 0ustar renerene# $Id: ldap-exerciser.properties 3946 2010-12-16 17:51:51Z unsaved $ # This is a sample properties file for the utility program # org.hsqldb.auth.LdapAuthBean. See the API Spec for # org.hsqldb.auth.LdapAuthBean for details about all of the settings you can use # here. # IMPORTANT: Use ISO-8859-1 encoding for any extended characters, as you always # should for a Java properties file. # The ${...} construct (for system properties) is not supported. # All of these examples use a roleSchemaValuePattern setting to work with the # LDAP memberOf feature. If you have a direct attribute for specifying roles # (and optional schema), then just skip that setting. # These settings are used for all sample setups # When startTls is true, ldapHost must match the CN in the server's cert. ldapHost=beyla.admc.com parentDn=ou=people,dc=admc,dc=com roleSchemaValuePattern=cn=([^,]+).* rolesSchemaAttribute=memberof accessAttribute=hyperSqlAccess # This block of settings works for an OpenLDAP server using the memberOf # feature for membership in roles, with DIGEST-MD5 SASL and StartTLS with a # private (non-commercial) SSL certificate. startTls=true trustStore=/home/blaine/ca/cacert.store securityMechanism=DIGEST-MD5 # To use an LDAP server that is totally unsecured, comment out the settings in # the previous block and enable the one setting here. # An unsecured server can be useful for educational purposes, but not for a # real application! #principalTemplate=uid=${username},ou=people,dc=admc,dc=com # PLAIN authentication, but StartTLS-encrypted. Disable the block above # starting with "startTls=true" and enable the settings in this block. #principalTemplate=uid=${username},ou=people,dc=admc,dc=com # SASL DIGEST-MD5 with no encryption. Disable the block above # starting with "startTls=true" and enable the settings in this block. #securityMechanism=DIGEST-MD5 hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/dsv-sample.sql0000644000175000017500000000235312007570374022546 0ustar renerene/* * $Id: dsv-sample.sql 826 2009-01-17 05:04:52Z unsaved $ * * Imports delimiter-separated-values, and generates an output * reject .dsv file, and a reject report. * * To execute, set up a SqlTool database urlid (see User Guide if you don't * know how to do that); then (from this directory) execute this script like * * java ../lib/hsqldb.jar mem dsv-sample.sql * * (replace "mem" with your urlid). */ CREATE TABLE sampletable(i INT, d DATE NOT NULL, b BOOLEAN); /* If you dont' set *DSV_TARGET_TABLE, it defaults to the base name of the .dsv file. */ * *DSV_TARGET_TABLE = sampletable \p WARNING: Some records will be skipped, and some others will be rejected. \p This is on purpose, so you can work with a reject report. \p /* By default, no reject files are written, and the import will abort upon * the first error encountered. If you set either of these settings, the * import will continue to completion if at all possible. */ * *DSV_REJECT_FILE = ${java.io.tmpdir}/sample-reject.dsv * *DSV_REJECT_REPORT = ${java.io.tmpdir}/sample-reject.html \m sample.dsv /* Enable this line if you want to display all successfully imported data: SELECT * FROM sampletable; */ \p \p See import reject report at '*{*DSV_REJECT_REPORT}'. hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/pl.sql0000644000175000017500000000553512007570374021113 0ustar renerene/* $Id: pl.sql 4564 2011-10-19 04:27:37Z unsaved $ SQL File to illustrate the use of some basic SqlTool PL features. Invoke like java -jar .../sqltool.jar mem .../pl.sql -- blaine */ * if (! *MYTABLE) \p MYTABLE variable not set! /* You could use \q to Quit SqlTool, but it's often better to just break out of the current SQL file. If people invoke your script from SqlTool interactively (with \i yourscriptname.sql) any \q will kill their SqlTool session. */ \p Use argument "-pMYTABLE=mytablename" for SqlTool * break * end if -- Turning on Continue-upon-errors so that we can check for errors ourselves. \c true \p \p Loading up a table named '*{MYTABLE}'... CREATE TABLE *{MYTABLE} ( i int, s varchar(20) ); -- PL variable ? is always set to status or fetched value of last SQL -- statement. It will be null/unset if the last SQL statement failed. \p CREATE status is *{?} \p /* Validate our return status. In case of success of a CREATE TABLE, *? will be 0, and therefore a '* if (*?)' would be false. So we follow the general practice of testing *? for the error indicator value of null, using the reserved SqlTool system variable *NULL. */ * if (*? == *NULL) \p Our CREATE TABLE command failed. * break * end if -- Default Continue-on-error behavior is what you usually want \c false \p /* Insert data with a foreach loop. These values could be from a read of another table or from variables set on the command line like */ \p Inserting some data into our new table * foreach VALUE (12 22 24 15) * if (*VALUE > 23) \p Skipping *{VALUE} because it is greater than 23 * continue \p YOU WILL NEVER SEE THIS LINE, because we just 'continued'. * end if INSERT INTO *{MYTABLE} VALUES (*{VALUE}, 'String of *{VALUE}'); * end foreach \p /* This time instead of using the ? variable, we're assigning the SELECT value to a User variable, 'themax'. */ * themax ~ /* Can put Special Commands and comments between "* VARNAME ~" and the target SQL statement. */ \p We're saving the max value for later. You'll still see query output here: SELECT MAX(i) FROM *{MYTABLE}; /* No need to test for failure status (either ? or themax being unset/null), because we are in \c mode and would have aborted if the SELECT failed. */ * if (0 == *themax) \p Got 0 as the max value. * break \p YOU WILL NEVER SEE THIS LINE, because we just 'broke'. * end if \p \p ############################################################## \p The results of our work: SELECT * FROM *{MYTABLE}; \p MAX value is *{themax} \p \p Counting down to exit * ((i = 3)) * while (*i > 0) \p *{i}... * ((i -= 1)) -- i++ is supported but i-- is not, because -- marks comments * end while \p \p Everything worked. Signing off. hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/plsql.sql0000644000175000017500000000260512007570374021626 0ustar renerene/* * $Id: plsql.sql 826 2009-01-17 05:04:52Z unsaved $ * * This example is copied from the "Simple Programs in PL/SQL" * example by Yu-May Chang, Jeff Ullman, Prof. Jennifer Widom at * the Standord University Database Group's page * http://www-db.stanford.edu/~ullman/fcdb/oracle/or-plsql.html . * I have only removed some blank lines (in case somebody wants to * copy this code interactively-- because you can't use blank * lines inside of SQL commands in non-raw mode SqlTool when running * it interactively); and, at the bottom I have replaced the * client-specific, non-standard command "run;" with SqlTool's * corresponding command ".;" and added a plain SQL SELECT command * to show whether the PL/SQL code worked. - Blaine */ CREATE TABLE T1( e INTEGER, f INTEGER ); DELETE FROM T1; INSERT INTO T1 VALUES(1, 3); INSERT INTO T1 VALUES(2, 4); /* Above is plain SQL; below is the PL/SQL program. */ DECLARE a NUMBER; b NUMBER; BEGIN SELECT e,f INTO a,b FROM T1 WHERE e>1; INSERT INTO T1 VALUES(b,a); END; .; /** The statement on the previous line, ".;" is SqlTool specific. * This command says to save the input up to this point to the * edit buffer and send it to the database server for execution. * I added the SELECT statement below to give imm */ /* This should show 3 rows, one containing values 4 and 2 (in this order)...*/ SELECT * FROM t1; hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/jaas.cfg0000644000175000017500000000350312007570374021347 0ustar renerene/* Copyright (c) 2010, The HSQL Development Group. All rights reserved. Released under the HSQL license, available at http://hsqldb.org This is a working JAAS configuration file that sets up two "applications" for use with HyperSQL's extAuthWithSpring sample. Look under /integration/extAuthWithSpring in your HyperSQL distribution for details. */ demo { /* * A trivial module that allows access if user name and password start with * the specified values. * See source code for the module in for this class under the test-src * directory of your HyperSQL installation. */ org.hsqldb.auth.StartCharModule required //debug=true nameStart="s" pwdStart="p" ; }; sunLdap { /* * JAAS setup for com.sun.security.auth.module.LdapLoginModule. * This proprietary Sun Java 1.6 JSSE module doesn't support StartTLS, but * does support the deprecated LDAPS. It also supports only a single role or * initial schema. * Do a web search for LdapLoginModule for the API Spec which describes the * available settings and (incompletely) functionality. There is another * popular class on the Internet with the same name, so make sure you look at * the one with package of com.sun.security.auth.module. */ com.sun.security.auth.module.LdapLoginModule required // useSSL means LDAPS, not StartDLS (which is not supported). // It is true by default, so set to false unless you want LDAPS. useSSL=false // Enable following line for debugging // debug=true java.naming.security.authentication="DIGEST-MD5" // Your URL must include the parent DN for user records as shown. userProvider="ldap://beyla.admc.com/ou=people,dc=admc,dc=com" authIdentity="{USERNAME}" userFilter="uid={USERNAME}" authzIdentity="{memberof}" ; }; hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/html-report.sql0000644000175000017500000000306412007570374022750 0ustar renerene/* * $Id: html-report.sql 4564 2011-10-19 04:27:37Z unsaved $ * * Sample/Template for writing an HTML Report */ -- Populate sample data create table t (i integer, vc varchar(20)); insert into t values(1, 'one'); insert into t values(2, 'two'); insert into t values(3, 'three'); insert into t values(4, 'four'); insert into t values(5, 'five'); commit; -- IMPORTANT: \o will append by default. If you want to write a new file, -- it's your responsibility to check that a file of the same name does not -- already exist (or remove it). -- Follow the following examples to use your own HTML fragment files. -- * *TOP_HTMLFRAG_FILE = /tmp/top.html -- * *BOTTOM_HTMLFRAG_FILE = /tmp/bottom.html -- The default TOP_HTMLFRAG_FILE has a reference to this PL variable. * REPORT_TITLE = Blaine's Sample Report -- The default will also override its CSS style settings with your own if you -- put them in a file named "overrides.css" in same directory alongside your -- reports ("report.html" in this example). -- You can add references to ${system.properties} and *{PL_VARIABLES} in -- your own custom fragment files too. -- Turn on HTML output mode. -- Must enable HTML _before_ opening to write top frag. \h true \o report.html \p A message to appear in the Report SELECT * FROM t; -- Close off output just to show that you can go back and forth. -- A close with '\o' will not write the bottom boilerplate that closes the HTML. \o \h false \p Some non-HTML non-Report output: SELECT count(*) FROM t; \h true -- Re-open the report \o report.html \d t -- This time close it with \oc hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/server.properties0000644000175000017500000000175412007570374023402 0ustar renerene# Hsqldb Server cfg file. # See the HyperSQL Network Listeners chapter of the HyperSQL User Guide. # Each server.database.X setting defines a database "catalog". # I.e., an independent set of data. # Each server.database.X setting corresponds exactly to the jdbc:hsqldb:* # JDBC URL you would use if you wanted to get a direct (In-Process) # Connection to the catalog instead of "serving" it. server.database.0=file:db0/db0 # I suggest that, for every file: catalog you define, you add the # connection property "ifexists=true" after the database instance # is created (which happens simply by starting the Server one time). # Just append ";ifexists=true" to the file: URL, like so: # server.database.0=file:db0/db0;ifexists=true # server.dbname.0 defaults to "" (i.e. server.dbname.n for n==0), but # the catalog definition n will be entirely ignored for n > 0 if you do not # set server.dbname.n. I.e. dbname setting is required for n > 0, though it # may be set to blank (e.g. "server.dbname.3=") hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/hsqldb.init0000755000175000017500000004461612007570374022127 0ustar renerene#!/bin/sh # For boot-up and system shutdown, most UNIXes explicitly run a shell # interpreter. In that case, the interpreter line above is ignored. # There are a few UNIXes (notably Darwin) that require the interpreter line. # Copyright (c) 2001-2008, The HSQL Development Group # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of the HSQL Development Group nor the names of its # contributors may be used to endorse or promote products derived from this # software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, # OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # $Id: hsqldb.init 4993 2012-05-28 03:37:23Z unsaved $ # UNIX init script for HSQLDB. # IMPORTANT! Users running multiple HSQLDB ***Server processes*** must use a # unique "SERVICE" name for each Server process. Most users will run just one # server instance, possibly serving lots of database instances. Multi-server # runners must change the value on the following line, and, if your system # uses chkconfig or insserv, you must change the value of "hsqldb" to the # same thing (as SERVICE) in the chkconfig and/or insserv blocks a few # lines down from here (incl. in the pidfile and config file paths). (Sorry # to say, but you need to repeat this procedure after every HSQLDB upgrade). SERVICE=hsqldb # This is the one setting which users will commonly change in this file. # It's impossible to determine this script name (in a portable way) at boot-up # time, since ${0} is entirely different for init scripts, depending on UNIX # version. # See the "HyperSQL on UNIX" chapter of the HyperSQL User Guide for how to # use this file. # This block only used by chkconfig systems (incl. SuSE Linux). # chkconfig: 345 87 13 # description: HyperSQL Database, A High Performance Java Database Server # pidfile: /var/run/hsqldb.pid # config: /etc/sysconfig/hsqldb # This block only used by insserv systems (incl. SuSE Linux). ### BEGIN INIT INFO # Provides: hsqldb # Required-Start: $syslog $remote_fs $network $named # Required-Stop: # Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Short-Description: HyperSQL Database Server # Description: HyperSQL Database, A High Performance Java Database Server ### END INIT INFO # UNIX System-V and Linux users should copy this script to the common # init script directory (/etc/init.d/ on most systems) with name "hsqldb", # or whatever you have SERVICE set to (no ".init" suffix!). # N.b. Being a system script, this script does not use inherited variables. # If you want to adjust a setting, edit the config file. # Strategy of this init script is to avoid shell-specific functionality, # and use only lowest-common-denominator Bourne capabilities. # We don't include OS-specific functions, and we don't use shell- # implementation-specific functionality like "echo ...\c" or "echo -n...". # Since some Bourne shells don't support shell functions at all, we don't # even define any local functions. # This script has been generalized to the point that it can now "start" # any combination of classes with the normal static main methods. # You can supply invocation arguments to the # TARGET_CLASS invocation, and can start as many other classes as you # wish by using the INVOC_ADDL_ARGS setting (this includes running # multiple HSQLDB Servers of various types). # Template config file can be obtained from the HyperSQL distribution. # On the day I write this, I have it located at "sample/hsqldb.cfg" in the # distro, but that could change. You need to copy then edit it before it # will work. # Recommended locations for runtime configuration file: # Darwin, SunOS, Solaris: /etc/hsqldb.conf # (However, Sunfreeware.com builds use /usr/local/etc). # Linux: /etc/sysconfig # FreeBSD: /usr/local/etc/hsqldb.cfg # (Replace the base name "hsqldb" with whatever you have SERVICE set to at # the top of this file). # You can put it at any of these locations and it will be used. For # your sanity, only put a file at one of these locations. # -- blaine.simpson@admc.com set +u # Following function is Copyright Apache 2.0 by Axis Data Management Corp. # and code is copied verbatim from # http://pub.admc.com/scripts/bin/minsleep-nov.fnc # Sleeps until process dies or file appears. # 2nd parameter is assumed to be a PID if it is an integer. minsleep() { [ $# -eq 2 ] || { echo 'SYNTAX: minsleep MAXSECS PID|PATH (for integers MAXSECS and PID)' 1>&2 return 2 } TARGET_PID= TARGET_PATH= MAXSECS=$1; shift case "$1" in *[!0-9]*) TARGET_PATH="$1";; *) TARGET_PID="$1";; esac; shift _secs=0 while [ $_secs -lt $MAXSECS ]; do _secs=`expr $_secs + 1` if [ -n "$TARGET_PID" ]; then kill -0 $TARGET_PID > /dev/null 2>&1 || return 0 # Target proc died elif [ -s "$TARGET_PATH" ]; then return 0 # Target process died fi sleep 1 done return 1 # Timed out } # This is only used for recursive invocations. # Will not necessarily be set correctly at system bootup invocations # (where it is sometimes invoked like "sh... /path/to/hsqldb start"), # but, in those cases there will be no recursion. INVOC_PATH=`dirname "$0"` || { echo "'dirname' failed" 1>&2 exit 2 } [ -n "$INVOC_PATH" ] && INVOC_PATH="${INVOC_PATH}/" SYNTAX_MSG="SYNTAX: ${INVOC_PATH}${SERVICE} start|stop|stopcompact|restart|restartcmpacted|status" # You can override any of these default values in your config file: # Max time for background su command to start up and echo pid. # (0 works for moderately fast servers). SU_ECHO_SECS=30 # File used as semaphore. If file is removed, a running pid checker # process will exit. PIDCHECKER_FLAGFILE=/tmp/pidchecker.run # The following settings get overridden by optional setting in the config file. # Max time for JVM to die after all HSQLDB instances stopped. MAX_TERMINATE_SECS=60 # We require all Server/WebServer instances to be accessible within # $MAX_START_SECS from when the Server/WebServer is started. MAX_START_SECS=60 # Class to start TARGET_CLASS=org.hsqldb.server.Server CLIENT_JVMARGS= SERVER_JVMARGS= CFGFILE= LOGFILE= PIDFILE= BASEDIR= AUTH_FILE= SHUTDOWN_OPTION= SERVER_ADDL_CLASSPATH= INVOC_ADDL_ARGS= case "`uname`" in Darwin) # I.e. Mac OS X. I don't know about older Mac OSes. LOGFILE=/var/log/${SERVICE}.log PIDFILE=/var/run/${SERVICE}.pid ;; Linux) LOGFILE=/var/log/${SERVICE}.log PIDFILE=/var/run/${SERVICE}.pid ;; FreeBSD) LOGFILE=/var/log/${SERVICE}.log PIDFILE=/var/run/${SERVICE}.pid ;; SunOS) LOGFILE=/var/log/${SERVICE}.log PIDFILE=/etc/${SERVICE}.pid ;; *) LOGFILE=/var/log/${SERVICE}.log PIDFILE=/etc/${SERVICE}.pid ;; esac for candidate in /etc/sysconfig/${SERVICE} /etc/${SERVICE}.conf \ /etc/${SERVICE}.cfg /Library/Hsqldb/conf/${SERVICE}.cfg \ /Library/Hsqldb/${SERVICE}.cfg /usr/local/etc/${SERVICE}.cfg; do [ -f $candidate ] && { CFGFILE=$candidate break } done [ -n "$CFGFILE" ] || { echo "No global config file found in any of allowed locations" 1>&2 exit 11 } # Sanity check [ -n "$LOGFILE" ] && [ -n "$PIDFILE" ] || { echo "Internal problem in init script" 1>&2 exit 11 } [ $# -eq 1 ] || { echo "$SYNTAX_MSG" 1>&2 exit 4 } # It would be nice to permit some uses, like "status" by non-root users, # but for now our goal is a superuser init script. [ -w / ] || { # Very portable, but perhaps not perfect, test for superuser. echo "Only 'root' may use this init script" 1>&2 exit 4 } # Use bsd-style enable/disable if it's in place. BSDCFG= [ -r /etc/rc.conf ] && [ -f /etc/rc.conf ] && { . /etc/rc.conf BSDCFG=1 } [ -r /etc/rc.conf.local ] && [ -f /etc/rc.conf.local ] && { . /etc/rc.conf.local BSDCFG=1 } [ -n "$BSDCFG" ] && { case "$hsqldb_enable" in [Yy][Ee][Ss]);; [Oo][Nn]);; [Tt][Rr][Uu][Ee]);; *) exit 0;; # Don't run if not enabled for BSD startup esac } COMMAND="$1"; shift [ -r "$CFGFILE" ] || { echo "Unable to read config file '$CFGFILE'" 1>&2 exit 2 } [ -f "$CFGFILE" ] || { echo "'$CFGFILE' is not a regular file" 1>&2 exit 2 } HSQLDB_OWNER= JAVA_EXECUTABLE= SQLTOOL_JAR_PATH= SERVER_HOME= SHUTDOWN_URLIDS= URLIDS= . "$CFGFILE" # Suffix delimiter to $SERVER_ADDL_CLASSPATH, if it is set. [ -n "$SERVER_ADDL_CLASSPATH" ] && SERVER_ADDL_CLASSPATH="${SERVER_ADDL_CLASSPATH}:" # Validate that config file sets all required variables. [ -n "$JAVA_EXECUTABLE" ] && [ -n "$SQLTOOL_JAR_PATH" ] && [ -n "$SERVER_HOME" ] && [ -n "$URLIDS" ] || { echo "Config file '$CFGFILE' does not set one or more of following variables JAVA_EXECUTABLE, SQLTOOL_JAR_PATH, SERVER_HOME, URLIDS" 1>&2 exit 2 } [ -d "$SERVER_HOME" ] || { echo "SERVER_HOME variable in '$CFGFILE' is set to a non-directory." 1>&2 exit 2 } [ -f "$JAVA_EXECUTABLE" ] && [ -f "$SQLTOOL_JAR_PATH" ] || { echo "JAVA_EXECUTABLE or SQLTOOL_JAR_PATH in '$CFGFILE' is set to a non-file." 1>&2 exit 2 } [ -r "$SQLTOOL_JAR_PATH" ] || { echo "'$SQLTOOL_JAR_PATH' isn't readable" 1>&2 exit 2 } [ -x "$JAVA_EXECUTABLE" ] || { echo "No Java executable found at '$JAVA_EXECUTABLE'" 1>&2 exit 2 } # "chown" lives here on some UNIXes. PATH="$PATH:/usr/sbin" # Make a good effort (but not bullet-proof) check on permissions of the # auth file. Unfortunately, if auth-file is not specified, this depends # upon both (a) $HOME being set; and (b) SqlToolSprayer and SqlTool defaults. # On the other hand, it works great if AUTH_FILE is set explicitly by user. if [ -z "$AUTH_FILE" ] && [ -z "$HOME" ]; then : # Lousy init environment didn't set $HOME, so can't find dflt cfg file. else _AUTH_TEST_PATH="$AUTH_FILE" [ -n "${_AUTH_TEST_PATH}" ] || _AUTH_TEST_PATH="$HOME/sqltool.rc" [ -f "$_AUTH_TEST_PATH" ] || { echo "No auth file found at '$_AUTH_TEST_PATH'" 1>&2 exit 2 } [ -r "$_AUTH_TEST_PATH" ] || { echo "Auth file '$_AUTH_TEST_PATH' not readable" 1>&2 exit 2 } ls -lLd "$_AUTH_TEST_PATH" | grep '^-..------' > /dev/null 2>&1 || { echo "Fix permissions on '$_AUTH_TEST_PATH' like 'chmod 600 $_AUTH_TEST_PATH'" 1>&2 exit 2 } fi # Set HSQLDB_PID according to pid file. HSQLDB_PID= [ -r "$PIDFILE" ] && { [ -f "$PIDFILE" ] || { echo "'$PIDFILE' is not a regular file" 1>&2 exit 6 } [ -w "$PIDFILE" ] || { echo "'$PIDFILE' is not writable" 1>&2 exit 6 } HSQLDB_PID="`cat $PIDFILE`" || { echo "Failed to read pid file '$PIDFILE'" 1>&2 exit 6 } case "$HSQLDB_PID" in *[a-zA-Z/!@#$%*+=_~]*) HSQLDB_PID=;; *'^'*) HSQLDB_PID=;; esac [ -n "$HSQLDB_PID" ] || { echo "Pid file '$PIDFILE' does not contain a valid process identifier" 1>&2 exit 6 } kill -0 "$HSQLDB_PID" > /dev/null 2>&1 || { echo 'Removing stale pid file' rm -f "$PIDFILE" || { echo "Failed to remove pid file '$PIDFILE'" 1>&2 exit 6 } HSQLDB_PID= } #echo "PID is ($HSQLDB_PID)" } case "$COMMAND" in status) [ -n "$HSQLDB_PID" ] || { echo "I don't know of any running ${SERVICE} server." exit 0 } echo "There is an ${SERVICE} server loaded from $SQLTOOL_JAR_PATH running with pid $HSQLDB_PID." # I would give a nice ps command here, were ps not so damned # OS-specific. AUTH_FILE_SWITCH= # N.b., there will be a problem if there are special characters or # spaces inside of $AUTH_FILE. [ -n "$AUTH_FILE" ] && AUTH_FILE_SWITCH="-Dsqltoolsprayer.rcfile=$AUTH_FILE" # Might as well set CLASSPATH for a cleaner command. CLASSPATH="$SQLTOOL_JAR_PATH" export CLASSPATH export PATH # Required only for some funny init environments. exec "$JAVA_EXECUTABLE" $AUTH_FILE_SWITCH $CLIENT_JVMARGS \ "-Dsqltoolsprayer.monfile=$PIDFILE" \ org.hsqldb.cmdline.SqlToolSprayer 'CALL true;' $URLIDS > /dev/null ;; start) [ -n "$TLS_KEYSTORE" ] || [ -n "$TLS_PASSWORD" ] && echo "WARNING: The TLS_* settings have been obsoleted. See the comments in the new sample 'hsqldb.cfg' file." 1>&2 [ -n "$HSQLDB_PID" ] && { echo "There is already a ${SERVICE} server running with pid $HSQLDB_PID." 1>&2 exit 1 } if [ -n "$HSQLDB_OWNER" ]; then touch "$PIDFILE" || { echo "Failed to create pid file" 1>&2 exit 1 } chown "$HSQLDB_OWNER" "$PIDFILE" || { echo "Failed to chown pid file to '$HSQLDB_OWNER'" 1>&2 exit 1 } # Some OSes choke if there are newlines in this string. # N.b.!!! The shell of the -c command is the target user's default # login shell, so keep this command shell-independent! nohup su "$HSQLDB_OWNER" -c "cd '$SERVER_HOME' && echo "'$$'" > '$PIDFILE' && exec '$JAVA_EXECUTABLE' $SERVER_JVMARGS -classpath '${SERVER_ADDL_CLASSPATH}${SQLTOOL_JAR_PATH}' org.hsqldb.util.MainInvoker $TARGET_CLASS $INVOC_ADDL_ARGS" >> "$LOGFILE" 2>&1 & else cd "$SERVER_HOME" || { echo "Failed to cd to '$SERVER_HOME'" 1>&2 exit 1 } export JAVA_EXECUTABLE export SQLTOOL_JAR_PATH export PIDFILE export SERVER_JVMARGS export TARGET_CLASS export INVOC_ADDL_ARGS export SERVER_ADDL_CLASSPATH nohup sh -c ' echo $$ > "$PIDFILE" || { echo "Failed to write pid to pid file" 1>&2 exit 1 } eval exec "$JAVA_EXECUTABLE" $SERVER_JVMARGS -classpath "${SERVER_ADDL_CLASSPATH}${SQLTOOL_JAR_PATH}" org.hsqldb.util.MainInvoker $TARGET_CLASS $INVOC_ADDL_ARGS ' >> "$LOGFILE" 2>&1 & fi minsleep $SU_ECHO_SECS "$PIDFILE" # Make sure bg commands have time to echo pid. AUTH_FILE_SWITCH= # N.b., there will be a problem if there are special characters or # spaces inside of $AUTH_FILE. [ -n "$AUTH_FILE" ] && AUTH_FILE_SWITCH="-Dsqltoolsprayer.rcfile=$AUTH_FILE" # Might as well set CLASSPATH for a cleaner command. CLASSPATH="$SQLTOOL_JAR_PATH" export CLASSPATH export PATH # Required only for some funny init environments. # There are many reasons why we could fail to read the pid file, # but regardless of why, the pid file does not contain a valid pid. touch "$PIDCHECKER_FLAGFILE" || { echo "Failed to touch file '$PIDCHECKER_FLAGFILE'" 1>&2 exit 1 } export PIDCHECKER_FLAGFILE export PIDFILE ( while true; do # Could possibly use minsleep to simplify this, but I don't # want to take the time to test the function export behavior. # -a and -e tests are not portable. [ -f "$PIDCHECKER_FLAGFILE" ] || exit 0 kill -0 "`cat $PIDFILE`" > /dev/null 2>&1 || { rm -f "$PIDFILE" "$PIDCHECKER_FLAGFILE" exit 1 } sleep 1 done ) & "$JAVA_EXECUTABLE" $AUTH_FILE_SWITCH $CLIENT_JVMARGS \ "-Dsqltoolsprayer.monfile=$PIDFILE" \ "-Dsqltoolsprayer.maxtime=${MAX_START_SECS}000" \ org.hsqldb.cmdline.SqlToolSprayer 'CALL true;' $URLIDS > /dev/null && { rm -f "$PIDCHECKER_FLAGFILE" echo "$TARGET_CLASS started with pid `cat $PIDFILE`" exit 0 } rm -f "$PIDCHECKER_FLAGFILE" echo "Failed to start $TARGET_CLASS. See log file '$LOGFILE'." 1>&2 exit 1 ;; stop|stopcompact) [ "$COMMAND" = stopcompact ] && SHUTDOWN_OPTION='compact' [ -n "$HSQLDB_PID" ] || { echo "I don't know of any running ${SERVICE} server." 1>&2 exit 1 } AUTH_FILE_SWITCH= # N.b., there will be a problem if there are special characters or # spaces inside of $AUTH_FILE. [ -n "$AUTH_FILE" ] && AUTH_FILE_SWITCH="-Dsqltoolsprayer.rcfile=$AUTH_FILE" # Might as well set CLASSPATH for a cleaner command. CLASSPATH="$SQLTOOL_JAR_PATH" export CLASSPATH export PATH # Required only for some funny init environments. "$JAVA_EXECUTABLE" $AUTH_FILE_SWITCH $CLIENT_JVMARGS \ org.hsqldb.cmdline.SqlToolSprayer "shutdown ${SHUTDOWN_OPTION};" \ $URLIDS $SHUTDOWN_URLIDS || exit 1 minsleep $MAX_TERMINATE_SECS $HSQLDB_PID || { echo "WARNING: ${SERVICE} is still running!" 1>&2 exit 1 } rm -f "$PIDFILE" || { echo "Failed to remove pid file '$PIDFILE'" 1>&2 exit 1 } echo "Successful shutdown ${SHUTDOWN_OPTION} (for the $TARGET_CLASS process)!" exit 0 ;; restart|restartcompacted) STOP_COMMAND=stop [ "$COMMAND" = restartcompacted ] && STOP_COMMAND=stopcompact "${INVOC_PATH}"${SERVICE} $STOP_COMMAND || exit $? exec "${INVOC_PATH}"/${SERVICE} start ;; *) echo "$SYNTAX_MSG" 1>&2 exit 5 ;; esac hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/sqltool.rc0000644000175000017500000001357612007570374022006 0ustar renerene# $Id: sqltool.rc 4313 2011-06-06 02:19:38Z unsaved $ # This is a sample RC configuration file used by SqlTool, DatabaseManager, # and any other program that uses the org.hsqldb.lib.RCData class. # See the documentation for SqlTool for various ways to use this file. # If you have the least concerns about security, then secure access to # your RC file. # You can run SqlTool right now by copying this file to your home directory # and running # java -jar /path/to/sqltool.jar mem # This will access the first urlid definition below in order to use a # personal Memory-Only database. # "url" values may, of course, contain JDBC connection properties, delimited # with semicolons. # As of revision 3347 of SqlFile, you can also connect to datasources defined # here from within an SqlTool session/file with the command "\j urlid". # You can use Java system property values in this file like this: ${user.home} # The only feature added recently is the optional "transiso" setting, # which may be set to an all-caps transaction isolation level as listed # in the Java API Spec for java.sql.Connection. # Windows users are advised to use forward slashes instead of reverse slashes, # and to avoid paths containing spaces or other funny characters. (This # recommendation applies to any Java app, not just SqlTool). # A personal Memory-Only (non-persistent) database. urlid mem url jdbc:hsqldb:mem:memdbid username SA password # A personal, local, persistent database. urlid personal url jdbc:hsqldb:file:${user.home}/db/personal;shutdown=true username SA password transiso TRANSACTION_READ_COMMITTED # When connecting directly to a file database like this, you should # use the shutdown connection property like this to shut down the DB # properly when you exit the JVM. # This is for a hsqldb Server running with default settings on your local # computer (and for which you have not changed the password for "SA"). urlid localhost-sa url jdbc:hsqldb:hsql://localhost username SA password # Template for a urlid for an Oracle database. # You will need to put the oracle.jdbc.OracleDriver class into your # classpath. # In the great majority of cases, you want to use the file classes12.zip # (which you can get from the directory $ORACLE_HOME/jdbc/lib of any # Oracle installation compatible with your server). # Since you need to add to the classpath, you can't invoke SqlTool with # the jar switch, like "java -jar .../sqltool.jar...". # Put both the SqlTool jar and classes12.zip in your classpath (and export!) # and run something like "java org.hsqldb.util.SqlTool...". #urlid cardiff2 #url jdbc:oracle:thin:@aegir.admc.com:1522:TRAFFIC_SID #username blaine #password secretpassword #driver oracle.jdbc.OracleDriver # Template for a TLS-encrypted HSQLDB Server. # Remember that the hostname in hsqls (and https) JDBC URLs must match the # CN of the server certificate (the port and instance alias that follows # are not part of the certificate at all). # You only need to set "truststore" if the server cert is not approved by # your system default truststore (which a commercial certificate probably # would be). #urlid tls #url jdbc:hsqldb:hsqls://db.admc.com:9001/lm2 #username BLAINE #password asecret #truststore ${user.home}/ca/db/db-trust.store # Template for a Postgresql database #urlid blainedb #url jdbc:postgresql://idun.africawork.org/blainedb #username blaine #password losung1 #driver org.postgresql.Driver # Template for a MySQL database. MySQL has poor JDBC support. #urlid mysql-testdb #url jdbc:mysql://hostname:3306/dbname #username root #password hiddenpwd #driver com.mysql.jdbc.Driver # Note that "databases" in SQL Server and Sybase are traditionally used for # the same purpose as "schemas" with more SQL-compliant databases. # Template for a Microsoft SQL Server database using Microsoft's Driver # (I find that the JTDS driver is much more responsive than Microsoft's). # OLDER JDBC Driver: #urlid msprojsvr #url jdbc:microsoft:sqlserver://hostname;DatabaseName=DbName;SelectMethod=Cursor # The SelectMethod setting is required to do more than one thing on a JDBC # session (I guess Microsoft thought nobody would really use Java for # anything other than a "hello world" program). # This is for Microsoft's SQL Server 2000 driver (requires mssqlserver.jar # and msutil.jar). #driver com.microsoft.jdbc.sqlserver.SQLServerDriver #username myuser #password hiddenpwd # Current 2011 JDBC Driver for Microsoft SQL Server: # Requires just the new sqljdbc4.jar. (Microsoft just loves back-slashes) #url jdbc:sqlserver://hostname\instanceName;DatabaseName=dbname #driver com.microsoft.jdbc.sqlserver.SQLServerDriver # Template for Microsoft SQL Server database using the JTDS Driver # http://jtds.sourceforge.net Jar file has name like "jtds-1.2.5.jar". #urlid nlyte #username myuser #password hiddenpwd #url jdbc:jtds:sqlserver://myhost/nlyte;instance=MSSQLSERVER #driver net.sourceforge.jtds.jdbc.Driver # Template for a Sybase database #urlid sybase #url jdbc:sybase:Tds:hostname:4100/dbname #username blaine #password hiddenpwd # This is for the jConnect driver (requires jconn3.jar). #driver com.sybase.jdbc3.jdbc.SybDriver # Template for Embedded Derby / Java DB. #urlid derby1 #url jdbc:derby:path/to/derby/directory;create=true #username ${user.name} #password any_noauthbydefault #driver org.apache.derby.jdbc.EmbeddedDriver # The embedded Derby driver requires derby.jar. # There'a also the org.apache.derby.jdbc.ClientDriver driver with URL # like jdbc:derby://[:]/databaseName, which requires # derbyclient.jar. # You can use \= to commit, since the Derby team decided (why???) # not to implement the SQL standard statement "commit"!! # Note that SqlTool can not shut down an embedded Derby database properly, # since that requires an additional SQL connection just for that purpose. # However, I've never lost data by not shutting it down properly. # Other than not supporting this quirk of Derby, SqlTool is miles ahead of ij. hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/acl.txt0000644000175000017500000000225712007570374021255 0ustar renerene# $Id: acl.txt 826 2009-01-17 05:04:52Z unsaved $ # Sample HyperSQL Network Listener ACL file. # Specify "allow" and "deny" rules # For address specifications, individual addresses, host names, and # network addresses with /bit suffix are allowed, but read the caveat about # host names below, under the sample "localhost" rule. # Blank lines ignored. # Lines with # as the first non-whitespace character are ignored. allow 2001:db8::/32 # Allow this 32-bit ipv4 subnet allow localhost # You should use numerical addresses in ACL files, unless you are certain that # the name will always be known to your network address resolution system # (assume that you will lose Internet connectivity at some time). # With a default name resolution setup on UNIX, you are safe to use names # defined in your /etc/hosts file. deny 192.168.101.253 # Deny a single IP address. # In our example, 192.168.101.0/24 is our local, organizational network. # 192.168.101.253 is the IP address of our Intern's PC. # The Intern does not have permission to access our databases directly. allow 192.168.101.0/24 # Any ipv4 or ipv6 candidate address not matched above will be denied hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/csv-sample.sql0000644000175000017500000000352412007570374022546 0ustar renerene/* * $Id: csv-sample.sql 4812 2011-11-20 21:31:49Z unsaved $ * * Create a table, CVSV-export the data, import it back. */ * *DSV_COL_DELIM = , * *DSV_COL_SPLITTER = , -- Following causes a reject report to be written if there are any bad records -- during the import. To test it, enable the "FORCE AN ERROR" block below. * *DSV_REJECT_REPORT = import.html -- 1. SETTINGS -- For applications like MS Excel, which can't import or export nulls, we have -- to dummy down our database empty strings to export and import as if they -- were nulls. * *NULL_REP_TOKEN = -- Enable following line to quote every cell value -- * *ALL_QUOTED = true -- 2. SET UP TEST DATA CREATE TABLE t (i INT, v VARCHAR(25), d DATE); INSERT INTO t(i, v, d) VALUES (1, 'one two three', null); INSERT INTO t(i, v, d) VALUES (2, null, '2007-06-24'); INSERT INTO t(i, v, d) VALUES (3, 'one,two,,three', '2007-06-24'); INSERT INTO t(i, v, d) VALUES (4, '"one"two""three', '2007-06-24'); INSERT INTO t(i, v, d) VALUES (5, '"one,two"three,', '2007-06-24'); INSERT INTO t(i, v, d) VALUES (6, '', '2007-06-24'); commit; -- 3. CSV EXPORT /* Export */ \xq t /* FORCE AN ERROR. Enable the following 3 lines to force a bad CSV record. \o t.csv \p barf \o */ -- 4. BACK UP AND ZERO SOURCE TABLE CREATE TABLE orig AS (SELECT * FROM t) WITH DATA; DELETE FROM t; commit; -- 5. CSV IMPORT \mq t.csv commit; -- 6. MANUALLY EXAMINE DIFFERENCES BETWEEN SOURCE AND IMPORTED DATA. -- See /testrun/sqltool/csv-roundtrip.sql to see a way to make -- this same comparison programmatically. * - *NULL_REP_TOKEN \p \p ORIGINAL: SELECT * FROM orig; \p \p IMPORTED: SELECT * FROM t; \p \p The empty string in the source table will have been translated to null in \p the imported data. \p You can see that the generated CSV file represents both nulls and \p empty strings as nothing, hence the convergence. hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/sampledata.sql0000644000175000017500000010577412007570374022621 0ustar renerene/* * $Id: sampledata.sql 3353 2009-12-15 19:52:13Z unsaved $ * * Creates and populates database objects with sample data. * This file was created by grabbing the commands made by creating * sample data with the DatabaseManager utility. */ DROP TABLE Item IF EXISTS; DROP TABLE Invoice IF EXISTS; DROP TABLE Product IF EXISTS; DROP TABLE Customer IF EXISTS; CREATE TABLE Customer(ID INTEGER PRIMARY KEY,FirstName VARCHAR(20),LastName VARCHAR(30),Street VARCHAR(50),City VARCHAR(25)); CREATE TABLE Product(ID INTEGER PRIMARY KEY,Name VARCHAR(30),Price DECIMAL); CREATE TABLE Invoice(ID INTEGER PRIMARY KEY,CustomerID INTEGER,Total DECIMAL, FOREIGN KEY (CustomerId) REFERENCES Customer(ID) ON DELETE CASCADE); CREATE TABLE Item(InvoiceID INTEGER,Item INTEGER,ProductID INTEGER,Quantity INTEGER,Cost DECIMAL,PRIMARY KEY(InvoiceID,Item), FOREIGN KEY (InvoiceId) REFERENCES Invoice (ID) ON DELETE CASCADE, FOREIGN KEY (ProductId) REFERENCES Product(ID) ON DELETE CASCADE); INSERT INTO Customer VALUES(0,'Laura','Steel','429 Seventh Av.','Dallas'); INSERT INTO Product VALUES(0,'Iron Iron',54); INSERT INTO Customer VALUES(1,'Susanne','King','366 - 20th Ave.','Olten'); INSERT INTO Product VALUES(1,'Chair Shoe',248); INSERT INTO Customer VALUES(2,'Anne','Miller','20 Upland Pl.','Lyon'); INSERT INTO Product VALUES(2,'Telephone Clock',248); INSERT INTO Customer VALUES(3,'Michael','Clancy','542 Upland Pl.','San Francisco'); INSERT INTO Product VALUES(3,'Chair Chair',254); INSERT INTO Customer VALUES(4,'Sylvia','Ringer','365 College Av.','Dallas'); INSERT INTO Product VALUES(4,'Ice Tea Shoe',128); INSERT INTO Customer VALUES(5,'Laura','Miller','294 Seventh Av.','Paris'); INSERT INTO Product VALUES(5,'Clock Clock',236); INSERT INTO Customer VALUES(6,'Laura','White','506 Upland Pl.','Palo Alto'); INSERT INTO Product VALUES(6,'Ice Tea Chair',98); INSERT INTO Customer VALUES(7,'James','Peterson','231 Upland Pl.','San Francisco'); INSERT INTO Product VALUES(7,'Telephone Shoe',84); INSERT INTO Customer VALUES(8,'Andrew','Miller','288 - 20th Ave.','Seattle'); INSERT INTO Product VALUES(8,'Ice Tea Clock',226); INSERT INTO Customer VALUES(9,'James','Schneider','277 Seventh Av.','Berne'); INSERT INTO Product VALUES(9,'Clock Telephone',172); INSERT INTO Customer VALUES(10,'Anne','Fuller','135 Upland Pl.','Dallas'); INSERT INTO Product VALUES(10,'Telephone Ice Tea',204); INSERT INTO Customer VALUES(11,'Julia','White','412 Upland Pl.','Chicago'); INSERT INTO Product VALUES(11,'Telephone Iron',88); INSERT INTO Customer VALUES(12,'George','Ott','381 Upland Pl.','Palo Alto'); INSERT INTO Product VALUES(12,'Clock Ice Tea',168); INSERT INTO Customer VALUES(13,'Laura','Ringer','38 College Av.','New York'); INSERT INTO Product VALUES(13,'Telephone Clock',180); INSERT INTO Customer VALUES(14,'Bill','Karsen','53 College Av.','Oslo'); INSERT INTO Product VALUES(14,'Telephone Iron',124); INSERT INTO Customer VALUES(15,'Bill','Clancy','319 Upland Pl.','Seattle'); INSERT INTO Product VALUES(15,'Ice Tea Chair',94); INSERT INTO Customer VALUES(16,'John','Fuller','195 Seventh Av.','New York'); INSERT INTO Product VALUES(16,'Ice Tea Shoe',194); INSERT INTO Customer VALUES(17,'Laura','Ott','443 Seventh Av.','Lyon'); INSERT INTO Product VALUES(17,'Clock Ice Tea',220); INSERT INTO Customer VALUES(18,'Sylvia','Fuller','158 - 20th Ave.','Paris'); INSERT INTO Product VALUES(18,'Chair Clock',172); INSERT INTO Customer VALUES(19,'Susanne','Heiniger','86 - 20th Ave.','Dallas'); INSERT INTO Product VALUES(19,'Ice Tea Ice Tea',110); INSERT INTO Customer VALUES(20,'Janet','Schneider','309 - 20th Ave.','Oslo'); INSERT INTO Product VALUES(20,'Ice Tea Telephone',200); INSERT INTO Customer VALUES(21,'Julia','Clancy','18 Seventh Av.','Seattle'); INSERT INTO Product VALUES(21,'Chair Chair',114); INSERT INTO Customer VALUES(22,'Bill','Ott','250 - 20th Ave.','Berne'); INSERT INTO Product VALUES(22,'Iron Iron',66); INSERT INTO Customer VALUES(23,'Julia','Heiniger','358 College Av.','Boston'); INSERT INTO Product VALUES(23,'Shoe Chair',76); INSERT INTO Customer VALUES(24,'James','Sommer','333 Upland Pl.','Olten'); INSERT INTO Product VALUES(24,'Chair Shoe',72); INSERT INTO Customer VALUES(25,'Sylvia','Steel','269 College Av.','Paris'); INSERT INTO Product VALUES(25,'Shoe Shoe',162); INSERT INTO Customer VALUES(26,'James','Clancy','195 Upland Pl.','Oslo'); INSERT INTO Product VALUES(26,'Shoe Shoe',252); INSERT INTO Customer VALUES(27,'Bob','Sommer','509 College Av.','Seattle'); INSERT INTO Product VALUES(27,'Telephone Iron',230); INSERT INTO Customer VALUES(28,'Susanne','White','74 - 20th Ave.','Lyon'); INSERT INTO Product VALUES(28,'Clock Iron',30); INSERT INTO Customer VALUES(29,'Andrew','Smith','254 College Av.','New York'); INSERT INTO Product VALUES(29,'Chair Telephone',112); INSERT INTO Customer VALUES(30,'Bill','Sommer','362 - 20th Ave.','Olten'); INSERT INTO Product VALUES(30,'Shoe Iron',232); INSERT INTO Customer VALUES(31,'Bob','Ringer','371 College Av.','Olten'); INSERT INTO Product VALUES(31,'Ice Tea Telephone',48); INSERT INTO Customer VALUES(32,'Michael','Ott','339 College Av.','Boston'); INSERT INTO Product VALUES(32,'Clock Iron',190); INSERT INTO Customer VALUES(33,'Mary','King','491 College Av.','Oslo'); INSERT INTO Product VALUES(33,'Iron Chair',182); INSERT INTO Customer VALUES(34,'Julia','May','33 Upland Pl.','Seattle'); INSERT INTO Product VALUES(34,'Chair Iron',256); INSERT INTO Customer VALUES(35,'George','Karsen','412 College Av.','Chicago'); INSERT INTO Product VALUES(35,'Telephone Shoe',76); INSERT INTO Customer VALUES(36,'John','Steel','276 Upland Pl.','Dallas'); INSERT INTO Product VALUES(36,'Ice Tea Iron',32); INSERT INTO Customer VALUES(37,'Michael','Clancy','19 Seventh Av.','Dallas'); INSERT INTO Product VALUES(37,'Clock Shoe',94); INSERT INTO Customer VALUES(38,'Andrew','Heiniger','347 College Av.','Lyon'); INSERT INTO Product VALUES(38,'Clock Ice Tea',216); INSERT INTO Customer VALUES(39,'Mary','Karsen','202 College Av.','Chicago'); INSERT INTO Product VALUES(39,'Ice Tea Shoe',154); INSERT INTO Customer VALUES(40,'Susanne','Miller','440 - 20th Ave.','Dallas'); INSERT INTO Product VALUES(40,'Shoe Clock',28); INSERT INTO Customer VALUES(41,'Bill','King','546 College Av.','New York'); INSERT INTO Product VALUES(41,'Clock Ice Tea',206); INSERT INTO Customer VALUES(42,'Robert','Ott','503 Seventh Av.','Oslo'); INSERT INTO Product VALUES(42,'Iron Chair',198); INSERT INTO Customer VALUES(43,'Susanne','Smith','2 Upland Pl.','Dallas'); INSERT INTO Product VALUES(43,'Telephone Clock',94); INSERT INTO Customer VALUES(44,'Sylvia','Ott','361 College Av.','New York'); INSERT INTO Product VALUES(44,'Ice Tea Ice Tea',96); INSERT INTO Customer VALUES(45,'Janet','May','396 Seventh Av.','Oslo'); INSERT INTO Product VALUES(45,'Iron Ice Tea',180); INSERT INTO Customer VALUES(46,'Andrew','May','172 Seventh Av.','New York'); INSERT INTO Product VALUES(46,'Ice Tea Clock',62); INSERT INTO Customer VALUES(47,'Janet','Fuller','445 Upland Pl.','Dallas'); INSERT INTO Product VALUES(47,'Ice Tea Iron',178); INSERT INTO Customer VALUES(48,'Robert','White','549 Seventh Av.','San Francisco'); INSERT INTO Product VALUES(48,'Clock Clock',210); INSERT INTO Customer VALUES(49,'George','Fuller','534 - 20th Ave.','Olten'); INSERT INTO Product VALUES(49,'Iron Iron',22); INSERT INTO Invoice VALUES(0,0,0.0); INSERT INTO Invoice VALUES(1,33,0.0); INSERT INTO Invoice VALUES(2,23,0.0); INSERT INTO Invoice VALUES(3,21,0.0); INSERT INTO Invoice VALUES(4,30,0.0); INSERT INTO Invoice VALUES(5,34,0.0); INSERT INTO Invoice VALUES(6,19,0.0); INSERT INTO Invoice VALUES(7,26,0.0); INSERT INTO Invoice VALUES(8,29,0.0); INSERT INTO Invoice VALUES(9,38,0.0); INSERT INTO Invoice VALUES(10,24,0.0); INSERT INTO Invoice VALUES(11,24,0.0); INSERT INTO Invoice VALUES(12,23,0.0); INSERT INTO Invoice VALUES(13,39,0.0); INSERT INTO Invoice VALUES(14,35,0.0); INSERT INTO Invoice VALUES(15,39,0.0); INSERT INTO Invoice VALUES(16,45,0.0); INSERT INTO Invoice VALUES(17,46,0.0); INSERT INTO Invoice VALUES(18,4,0.0); INSERT INTO Invoice VALUES(19,9,0.0); INSERT INTO Invoice VALUES(20,19,0.0); INSERT INTO Invoice VALUES(21,8,0.0); INSERT INTO Invoice VALUES(22,40,0.0); INSERT INTO Invoice VALUES(23,36,0.0); INSERT INTO Invoice VALUES(24,15,0.0); INSERT INTO Invoice VALUES(25,31,0.0); INSERT INTO Invoice VALUES(26,27,0.0); INSERT INTO Invoice VALUES(27,24,0.0); INSERT INTO Invoice VALUES(28,35,0.0); INSERT INTO Invoice VALUES(29,46,0.0); INSERT INTO Invoice VALUES(30,13,0.0); INSERT INTO Invoice VALUES(31,22,0.0); INSERT INTO Invoice VALUES(32,20,0.0); INSERT INTO Invoice VALUES(33,40,0.0); INSERT INTO Invoice VALUES(34,33,0.0); INSERT INTO Invoice VALUES(35,4,0.0); INSERT INTO Invoice VALUES(36,42,0.0); INSERT INTO Invoice VALUES(37,39,0.0); INSERT INTO Invoice VALUES(38,46,0.0); INSERT INTO Invoice VALUES(39,5,0.0); INSERT INTO Invoice VALUES(40,4,0.0); INSERT INTO Invoice VALUES(41,19,0.0); INSERT INTO Invoice VALUES(42,38,0.0); INSERT INTO Invoice VALUES(43,13,0.0); INSERT INTO Invoice VALUES(44,32,0.0); INSERT INTO Invoice VALUES(45,42,0.0); INSERT INTO Invoice VALUES(46,24,0.0); INSERT INTO Invoice VALUES(47,45,0.0); INSERT INTO Invoice VALUES(48,22,0.0); INSERT INTO Invoice VALUES(49,32,0.0); INSERT INTO Item VALUES(0,12,1,11,1.5); INSERT INTO Item VALUES(0,11,12,4,1.5); INSERT INTO Item VALUES(0,10,4,8,1.5); INSERT INTO Item VALUES(0,9,35,4,1.5); INSERT INTO Item VALUES(0,8,0,23,1.5); INSERT INTO Item VALUES(0,7,7,10,1.5); INSERT INTO Item VALUES(0,6,16,9,1.5); INSERT INTO Item VALUES(0,5,12,15,1.5); INSERT INTO Item VALUES(0,4,47,1,1.5); INSERT INTO Item VALUES(0,3,1,9,1.5); INSERT INTO Item VALUES(0,2,47,3,1.5); INSERT INTO Item VALUES(0,1,14,19,1.5); INSERT INTO Item VALUES(0,0,7,12,1.5); INSERT INTO Item VALUES(1,6,25,19,1.5); INSERT INTO Item VALUES(1,5,25,9,1.5); INSERT INTO Item VALUES(1,4,16,16,1.5); INSERT INTO Item VALUES(1,3,38,8,1.5); INSERT INTO Item VALUES(1,2,19,6,1.5); INSERT INTO Item VALUES(1,1,0,9,1.5); INSERT INTO Item VALUES(1,0,40,8,1.5); INSERT INTO Item VALUES(2,16,36,24,1.5); INSERT INTO Item VALUES(2,15,0,18,1.5); INSERT INTO Item VALUES(2,14,48,19,1.5); INSERT INTO Item VALUES(2,13,12,1,1.5); INSERT INTO Item VALUES(2,12,21,15,1.5); INSERT INTO Item VALUES(2,11,42,21,1.5); INSERT INTO Item VALUES(2,10,49,11,1.5); INSERT INTO Item VALUES(2,9,18,7,1.5); INSERT INTO Item VALUES(2,8,39,2,1.5); INSERT INTO Item VALUES(2,7,30,5,1.5); INSERT INTO Item VALUES(2,6,43,8,1.5); INSERT INTO Item VALUES(2,5,30,4,1.5); INSERT INTO Item VALUES(2,4,38,18,1.5); INSERT INTO Item VALUES(2,3,19,13,1.5); INSERT INTO Item VALUES(2,2,11,9,1.5); INSERT INTO Item VALUES(2,1,25,3,1.5); INSERT INTO Item VALUES(2,0,4,18,1.5); INSERT INTO Item VALUES(3,17,30,17,1.5); INSERT INTO Item VALUES(3,16,19,11,1.5); INSERT INTO Item VALUES(3,15,23,18,1.5); INSERT INTO Item VALUES(3,14,17,22,1.5); INSERT INTO Item VALUES(3,13,41,2,1.5); INSERT INTO Item VALUES(3,12,41,22,1.5); INSERT INTO Item VALUES(3,11,7,11,1.5); INSERT INTO Item VALUES(3,10,10,17,1.5); INSERT INTO Item VALUES(3,9,29,17,1.5); INSERT INTO Item VALUES(3,8,49,9,1.5); INSERT INTO Item VALUES(3,7,26,4,1.5); INSERT INTO Item VALUES(3,6,13,18,1.5); INSERT INTO Item VALUES(3,5,30,10,1.5); INSERT INTO Item VALUES(3,4,20,12,1.5); INSERT INTO Item VALUES(3,3,0,22,1.5); INSERT INTO Item VALUES(3,2,49,3,1.5); INSERT INTO Item VALUES(3,1,1,20,1.5); INSERT INTO Item VALUES(3,0,11,21,1.5); INSERT INTO Item VALUES(4,5,37,24,1.5); INSERT INTO Item VALUES(4,4,9,18,1.5); INSERT INTO Item VALUES(4,3,23,20,1.5); INSERT INTO Item VALUES(4,2,41,23,1.5); INSERT INTO Item VALUES(4,1,35,15,1.5); INSERT INTO Item VALUES(4,0,28,9,1.5); INSERT INTO Item VALUES(5,13,18,17,1.5); INSERT INTO Item VALUES(5,12,8,15,1.5); INSERT INTO Item VALUES(5,11,38,23,1.5); INSERT INTO Item VALUES(5,10,28,18,1.5); INSERT INTO Item VALUES(5,9,37,9,1.5); INSERT INTO Item VALUES(5,8,20,3,1.5); INSERT INTO Item VALUES(5,7,2,4,1.5); INSERT INTO Item VALUES(5,6,7,9,1.5); INSERT INTO Item VALUES(5,5,46,15,1.5); INSERT INTO Item VALUES(5,4,32,14,1.5); INSERT INTO Item VALUES(5,3,24,12,1.5); INSERT INTO Item VALUES(5,2,20,18,1.5); INSERT INTO Item VALUES(5,1,9,23,1.5); INSERT INTO Item VALUES(5,0,9,5,1.5); INSERT INTO Item VALUES(6,11,44,1,1.5); INSERT INTO Item VALUES(6,10,16,13,1.5); INSERT INTO Item VALUES(6,9,19,2,1.5); INSERT INTO Item VALUES(6,8,41,19,1.5); INSERT INTO Item VALUES(6,7,26,10,1.5); INSERT INTO Item VALUES(6,6,37,22,1.5); INSERT INTO Item VALUES(6,5,14,20,1.5); INSERT INTO Item VALUES(6,4,31,20,1.5); INSERT INTO Item VALUES(6,3,30,2,1.5); INSERT INTO Item VALUES(6,2,23,8,1.5); INSERT INTO Item VALUES(6,1,38,21,1.5); INSERT INTO Item VALUES(6,0,15,20,1.5); INSERT INTO Item VALUES(7,18,23,5,1.5); INSERT INTO Item VALUES(7,17,40,1,1.5); INSERT INTO Item VALUES(7,16,7,12,1.5); INSERT INTO Item VALUES(7,15,24,17,1.5); INSERT INTO Item VALUES(7,14,47,14,1.5); INSERT INTO Item VALUES(7,13,32,23,1.5); INSERT INTO Item VALUES(7,12,40,16,1.5); INSERT INTO Item VALUES(7,11,19,13,1.5); INSERT INTO Item VALUES(7,10,7,1,1.5); INSERT INTO Item VALUES(7,9,9,21,1.5); INSERT INTO Item VALUES(7,8,42,19,1.5); INSERT INTO Item VALUES(7,7,2,22,1.5); INSERT INTO Item VALUES(7,6,14,4,1.5); INSERT INTO Item VALUES(7,5,24,10,1.5); INSERT INTO Item VALUES(7,4,2,13,1.5); INSERT INTO Item VALUES(7,3,30,2,1.5); INSERT INTO Item VALUES(7,2,27,17,1.5); INSERT INTO Item VALUES(7,1,23,12,1.5); INSERT INTO Item VALUES(7,0,43,16,1.5); INSERT INTO Item VALUES(8,9,21,23,1.5); INSERT INTO Item VALUES(8,8,38,7,1.5); INSERT INTO Item VALUES(8,7,6,5,1.5); INSERT INTO Item VALUES(8,6,15,19,1.5); INSERT INTO Item VALUES(8,5,24,18,1.5); INSERT INTO Item VALUES(8,4,15,8,1.5); INSERT INTO Item VALUES(8,3,41,16,1.5); INSERT INTO Item VALUES(8,2,11,8,1.5); INSERT INTO Item VALUES(8,1,44,16,1.5); INSERT INTO Item VALUES(8,0,34,15,1.5); INSERT INTO Item VALUES(9,19,48,23,1.5); INSERT INTO Item VALUES(9,18,3,12,1.5); INSERT INTO Item VALUES(9,17,13,17,1.5); INSERT INTO Item VALUES(9,16,24,10,1.5); INSERT INTO Item VALUES(9,15,48,23,1.5); INSERT INTO Item VALUES(9,14,15,8,1.5); INSERT INTO Item VALUES(9,13,42,13,1.5); INSERT INTO Item VALUES(9,12,25,23,1.5); INSERT INTO Item VALUES(9,11,12,16,1.5); INSERT INTO Item VALUES(9,10,38,11,1.5); INSERT INTO Item VALUES(9,9,13,6,1.5); INSERT INTO Item VALUES(9,8,24,11,1.5); INSERT INTO Item VALUES(9,7,2,22,1.5); INSERT INTO Item VALUES(9,6,18,10,1.5); INSERT INTO Item VALUES(9,5,6,2,1.5); INSERT INTO Item VALUES(9,4,36,16,1.5); INSERT INTO Item VALUES(9,3,4,14,1.5); INSERT INTO Item VALUES(9,2,29,12,1.5); INSERT INTO Item VALUES(9,1,18,21,1.5); INSERT INTO Item VALUES(9,0,45,8,1.5); INSERT INTO Item VALUES(10,9,5,10,1.5); INSERT INTO Item VALUES(10,8,22,11,1.5); INSERT INTO Item VALUES(10,7,4,13,1.5); INSERT INTO Item VALUES(10,6,18,14,1.5); INSERT INTO Item VALUES(10,5,5,24,1.5); INSERT INTO Item VALUES(10,4,10,24,1.5); INSERT INTO Item VALUES(10,3,46,1,1.5); INSERT INTO Item VALUES(10,2,7,9,1.5); INSERT INTO Item VALUES(10,1,33,17,1.5); INSERT INTO Item VALUES(10,0,20,1,1.5); INSERT INTO Item VALUES(11,8,20,1,1.5); INSERT INTO Item VALUES(11,7,48,22,1.5); INSERT INTO Item VALUES(11,6,0,12,1.5); INSERT INTO Item VALUES(11,5,19,2,1.5); INSERT INTO Item VALUES(11,4,47,16,1.5); INSERT INTO Item VALUES(11,3,32,21,1.5); INSERT INTO Item VALUES(11,2,0,3,1.5); INSERT INTO Item VALUES(11,1,21,21,1.5); INSERT INTO Item VALUES(11,0,45,10,1.5); INSERT INTO Item VALUES(12,18,9,4,1.5); INSERT INTO Item VALUES(12,17,31,15,1.5); INSERT INTO Item VALUES(12,16,0,9,1.5); INSERT INTO Item VALUES(12,15,22,16,1.5); INSERT INTO Item VALUES(12,14,25,11,1.5); INSERT INTO Item VALUES(12,13,36,21,1.5); INSERT INTO Item VALUES(12,12,13,12,1.5); INSERT INTO Item VALUES(12,11,28,16,1.5); INSERT INTO Item VALUES(12,10,46,19,1.5); INSERT INTO Item VALUES(12,9,25,22,1.5); INSERT INTO Item VALUES(12,8,48,2,1.5); INSERT INTO Item VALUES(12,7,48,7,1.5); INSERT INTO Item VALUES(12,6,31,15,1.5); INSERT INTO Item VALUES(12,5,37,17,1.5); INSERT INTO Item VALUES(12,4,20,11,1.5); INSERT INTO Item VALUES(12,3,0,18,1.5); INSERT INTO Item VALUES(12,2,6,5,1.5); INSERT INTO Item VALUES(12,1,41,19,1.5); INSERT INTO Item VALUES(12,0,1,24,1.5); INSERT INTO Item VALUES(13,21,40,1,1.5); INSERT INTO Item VALUES(13,20,5,19,1.5); INSERT INTO Item VALUES(13,19,42,18,1.5); INSERT INTO Item VALUES(13,18,0,16,1.5); INSERT INTO Item VALUES(13,17,32,18,1.5); INSERT INTO Item VALUES(13,16,22,23,1.5); INSERT INTO Item VALUES(13,15,0,20,1.5); INSERT INTO Item VALUES(13,14,1,12,1.5); INSERT INTO Item VALUES(13,13,10,20,1.5); INSERT INTO Item VALUES(13,12,17,3,1.5); INSERT INTO Item VALUES(13,11,14,3,1.5); INSERT INTO Item VALUES(13,10,45,24,1.5); INSERT INTO Item VALUES(13,9,24,10,1.5); INSERT INTO Item VALUES(13,8,48,11,1.5); INSERT INTO Item VALUES(13,7,29,24,1.5); INSERT INTO Item VALUES(13,6,19,8,1.5); INSERT INTO Item VALUES(13,5,22,19,1.5); INSERT INTO Item VALUES(13,4,26,21,1.5); INSERT INTO Item VALUES(13,3,32,2,1.5); INSERT INTO Item VALUES(13,2,13,20,1.5); INSERT INTO Item VALUES(13,1,1,1,1.5); INSERT INTO Item VALUES(13,0,16,10,1.5); INSERT INTO Item VALUES(14,13,11,23,1.5); INSERT INTO Item VALUES(14,12,4,20,1.5); INSERT INTO Item VALUES(14,11,25,15,1.5); INSERT INTO Item VALUES(14,10,44,16,1.5); INSERT INTO Item VALUES(14,9,13,16,1.5); INSERT INTO Item VALUES(14,8,23,7,1.5); INSERT INTO Item VALUES(14,7,43,4,1.5); INSERT INTO Item VALUES(14,6,26,18,1.5); INSERT INTO Item VALUES(14,5,11,8,1.5); INSERT INTO Item VALUES(14,4,41,17,1.5); INSERT INTO Item VALUES(14,3,34,11,1.5); INSERT INTO Item VALUES(14,2,15,18,1.5); INSERT INTO Item VALUES(14,1,9,22,1.5); INSERT INTO Item VALUES(14,0,42,18,1.5); INSERT INTO Item VALUES(15,2,24,6,1.5); INSERT INTO Item VALUES(15,1,13,21,1.5); INSERT INTO Item VALUES(15,0,17,12,1.5); INSERT INTO Item VALUES(16,15,12,3,1.5); INSERT INTO Item VALUES(16,14,0,19,1.5); INSERT INTO Item VALUES(16,13,20,1,1.5); INSERT INTO Item VALUES(16,12,18,2,1.5); INSERT INTO Item VALUES(16,11,24,7,1.5); INSERT INTO Item VALUES(16,10,43,8,1.5); INSERT INTO Item VALUES(16,9,11,10,1.5); INSERT INTO Item VALUES(16,8,13,17,1.5); INSERT INTO Item VALUES(16,7,8,17,1.5); INSERT INTO Item VALUES(16,6,44,7,1.5); INSERT INTO Item VALUES(16,5,11,15,1.5); INSERT INTO Item VALUES(16,4,10,24,1.5); INSERT INTO Item VALUES(16,3,0,3,1.5); INSERT INTO Item VALUES(16,2,20,15,1.5); INSERT INTO Item VALUES(16,1,36,20,1.5); INSERT INTO Item VALUES(16,0,18,15,1.5); INSERT INTO Item VALUES(17,19,46,12,1.5); INSERT INTO Item VALUES(17,18,5,9,1.5); INSERT INTO Item VALUES(17,17,7,5,1.5); INSERT INTO Item VALUES(17,16,8,16,1.5); INSERT INTO Item VALUES(17,15,35,10,1.5); INSERT INTO Item VALUES(17,14,18,2,1.5); INSERT INTO Item VALUES(17,13,41,5,1.5); INSERT INTO Item VALUES(17,12,22,16,1.5); INSERT INTO Item VALUES(17,11,45,10,1.5); INSERT INTO Item VALUES(17,10,10,12,1.5); INSERT INTO Item VALUES(17,9,8,15,1.5); INSERT INTO Item VALUES(17,8,49,8,1.5); INSERT INTO Item VALUES(17,7,6,15,1.5); INSERT INTO Item VALUES(17,6,43,6,1.5); INSERT INTO Item VALUES(17,5,44,1,1.5); INSERT INTO Item VALUES(17,4,23,2,1.5); INSERT INTO Item VALUES(17,3,24,4,1.5); INSERT INTO Item VALUES(17,2,44,11,1.5); INSERT INTO Item VALUES(17,1,19,19,1.5); INSERT INTO Item VALUES(17,0,16,8,1.5); INSERT INTO Item VALUES(18,18,10,1,1.5); INSERT INTO Item VALUES(18,17,8,1,1.5); INSERT INTO Item VALUES(18,16,31,12,1.5); INSERT INTO Item VALUES(18,15,44,20,1.5); INSERT INTO Item VALUES(18,14,28,20,1.5); INSERT INTO Item VALUES(18,13,14,12,1.5); INSERT INTO Item VALUES(18,12,37,12,1.5); INSERT INTO Item VALUES(18,11,30,8,1.5); INSERT INTO Item VALUES(18,10,34,18,1.5); INSERT INTO Item VALUES(18,9,2,2,1.5); INSERT INTO Item VALUES(18,8,1,24,1.5); INSERT INTO Item VALUES(18,7,15,14,1.5); INSERT INTO Item VALUES(18,6,29,4,1.5); INSERT INTO Item VALUES(18,5,15,6,1.5); INSERT INTO Item VALUES(18,4,28,6,1.5); INSERT INTO Item VALUES(18,3,19,8,1.5); INSERT INTO Item VALUES(18,2,40,12,1.5); INSERT INTO Item VALUES(18,1,33,12,1.5); INSERT INTO Item VALUES(18,0,32,1,1.5); INSERT INTO Item VALUES(19,4,36,24,1.5); INSERT INTO Item VALUES(19,3,49,23,1.5); INSERT INTO Item VALUES(19,2,4,22,1.5); INSERT INTO Item VALUES(19,1,31,2,1.5); INSERT INTO Item VALUES(19,0,12,7,1.5); INSERT INTO Item VALUES(20,11,15,8,1.5); INSERT INTO Item VALUES(20,10,25,11,1.5); INSERT INTO Item VALUES(20,9,12,8,1.5); INSERT INTO Item VALUES(20,8,44,18,1.5); INSERT INTO Item VALUES(20,7,9,9,1.5); INSERT INTO Item VALUES(20,6,20,2,1.5); INSERT INTO Item VALUES(20,5,8,14,1.5); INSERT INTO Item VALUES(20,4,30,13,1.5); INSERT INTO Item VALUES(20,3,25,14,1.5); INSERT INTO Item VALUES(20,2,24,22,1.5); INSERT INTO Item VALUES(20,1,29,6,1.5); INSERT INTO Item VALUES(20,0,47,15,1.5); INSERT INTO Item VALUES(21,11,20,11,1.5); INSERT INTO Item VALUES(21,10,19,14,1.5); INSERT INTO Item VALUES(21,9,35,17,1.5); INSERT INTO Item VALUES(21,8,44,19,1.5); INSERT INTO Item VALUES(21,7,8,9,1.5); INSERT INTO Item VALUES(21,6,26,7,1.5); INSERT INTO Item VALUES(21,5,27,18,1.5); INSERT INTO Item VALUES(21,4,49,22,1.5); INSERT INTO Item VALUES(21,3,30,13,1.5); INSERT INTO Item VALUES(21,2,31,17,1.5); INSERT INTO Item VALUES(21,1,38,19,1.5); INSERT INTO Item VALUES(21,0,9,10,1.5); INSERT INTO Item VALUES(22,9,23,1,1.5); INSERT INTO Item VALUES(22,8,3,2,1.5); INSERT INTO Item VALUES(22,7,21,6,1.5); INSERT INTO Item VALUES(22,6,4,11,1.5); INSERT INTO Item VALUES(22,5,24,5,1.5); INSERT INTO Item VALUES(22,4,5,21,1.5); INSERT INTO Item VALUES(22,3,22,5,1.5); INSERT INTO Item VALUES(22,2,12,20,1.5); INSERT INTO Item VALUES(22,1,30,11,1.5); INSERT INTO Item VALUES(22,0,9,6,1.5); INSERT INTO Item VALUES(23,16,8,11,1.5); INSERT INTO Item VALUES(23,15,13,17,1.5); INSERT INTO Item VALUES(23,14,44,2,1.5); INSERT INTO Item VALUES(23,13,14,17,1.5); INSERT INTO Item VALUES(23,12,4,17,1.5); INSERT INTO Item VALUES(23,11,41,8,1.5); INSERT INTO Item VALUES(23,10,4,18,1.5); INSERT INTO Item VALUES(23,9,20,18,1.5); INSERT INTO Item VALUES(23,8,6,17,1.5); INSERT INTO Item VALUES(23,7,39,3,1.5); INSERT INTO Item VALUES(23,6,16,1,1.5); INSERT INTO Item VALUES(23,5,32,14,1.5); INSERT INTO Item VALUES(23,4,23,19,1.5); INSERT INTO Item VALUES(23,3,40,19,1.5); INSERT INTO Item VALUES(23,2,33,18,1.5); INSERT INTO Item VALUES(23,1,26,8,1.5); INSERT INTO Item VALUES(23,0,48,22,1.5); INSERT INTO Item VALUES(24,15,39,17,1.5); INSERT INTO Item VALUES(24,14,1,13,1.5); INSERT INTO Item VALUES(24,13,15,21,1.5); INSERT INTO Item VALUES(24,12,0,8,1.5); INSERT INTO Item VALUES(24,11,1,4,1.5); INSERT INTO Item VALUES(24,10,27,4,1.5); INSERT INTO Item VALUES(24,9,21,8,1.5); INSERT INTO Item VALUES(24,8,5,18,1.5); INSERT INTO Item VALUES(24,7,7,13,1.5); INSERT INTO Item VALUES(24,6,40,3,1.5); INSERT INTO Item VALUES(24,5,35,16,1.5); INSERT INTO Item VALUES(24,4,15,17,1.5); INSERT INTO Item VALUES(24,3,17,23,1.5); INSERT INTO Item VALUES(24,2,38,10,1.5); INSERT INTO Item VALUES(24,1,46,18,1.5); INSERT INTO Item VALUES(24,0,43,14,1.5); INSERT INTO Item VALUES(25,8,38,3,1.5); INSERT INTO Item VALUES(25,7,16,8,1.5); INSERT INTO Item VALUES(25,6,21,18,1.5); INSERT INTO Item VALUES(25,5,10,5,1.5); INSERT INTO Item VALUES(25,4,47,10,1.5); INSERT INTO Item VALUES(25,3,19,4,1.5); INSERT INTO Item VALUES(25,2,13,8,1.5); INSERT INTO Item VALUES(25,1,43,13,1.5); INSERT INTO Item VALUES(25,0,5,15,1.5); INSERT INTO Item VALUES(26,16,30,4,1.5); INSERT INTO Item VALUES(26,15,8,6,1.5); INSERT INTO Item VALUES(26,14,26,6,1.5); INSERT INTO Item VALUES(26,13,13,10,1.5); INSERT INTO Item VALUES(26,12,27,20,1.5); INSERT INTO Item VALUES(26,11,18,3,1.5); INSERT INTO Item VALUES(26,10,34,16,1.5); INSERT INTO Item VALUES(26,9,1,23,1.5); INSERT INTO Item VALUES(26,8,40,13,1.5); INSERT INTO Item VALUES(26,7,4,16,1.5); INSERT INTO Item VALUES(26,6,7,23,1.5); INSERT INTO Item VALUES(26,5,38,4,1.5); INSERT INTO Item VALUES(26,4,46,7,1.5); INSERT INTO Item VALUES(26,3,16,3,1.5); INSERT INTO Item VALUES(26,2,33,7,1.5); INSERT INTO Item VALUES(26,1,43,21,1.5); INSERT INTO Item VALUES(26,0,42,16,1.5); INSERT INTO Item VALUES(27,2,19,1,1.5); INSERT INTO Item VALUES(27,1,45,15,1.5); INSERT INTO Item VALUES(27,0,24,15,1.5); INSERT INTO Item VALUES(28,8,28,6,1.5); INSERT INTO Item VALUES(28,7,28,8,1.5); INSERT INTO Item VALUES(28,6,33,16,1.5); INSERT INTO Item VALUES(28,5,49,4,1.5); INSERT INTO Item VALUES(28,4,45,17,1.5); INSERT INTO Item VALUES(28,3,6,3,1.5); INSERT INTO Item VALUES(28,2,44,22,1.5); INSERT INTO Item VALUES(28,1,15,13,1.5); INSERT INTO Item VALUES(28,0,35,13,1.5); INSERT INTO Item VALUES(29,8,35,6,1.5); INSERT INTO Item VALUES(29,7,5,1,1.5); INSERT INTO Item VALUES(29,6,4,16,1.5); INSERT INTO Item VALUES(29,5,31,13,1.5); INSERT INTO Item VALUES(29,4,4,7,1.5); INSERT INTO Item VALUES(29,3,7,21,1.5); INSERT INTO Item VALUES(29,2,17,23,1.5); INSERT INTO Item VALUES(29,1,38,12,1.5); INSERT INTO Item VALUES(29,0,33,17,1.5); INSERT INTO Item VALUES(30,6,14,23,1.5); INSERT INTO Item VALUES(30,5,43,23,1.5); INSERT INTO Item VALUES(30,4,34,2,1.5); INSERT INTO Item VALUES(30,3,33,2,1.5); INSERT INTO Item VALUES(30,2,10,18,1.5); INSERT INTO Item VALUES(30,1,16,19,1.5); INSERT INTO Item VALUES(30,0,14,7,1.5); INSERT INTO Item VALUES(31,10,0,3,1.5); INSERT INTO Item VALUES(31,9,14,15,1.5); INSERT INTO Item VALUES(31,8,7,5,1.5); INSERT INTO Item VALUES(31,7,38,3,1.5); INSERT INTO Item VALUES(31,6,26,16,1.5); INSERT INTO Item VALUES(31,5,1,4,1.5); INSERT INTO Item VALUES(31,4,8,14,1.5); INSERT INTO Item VALUES(31,3,12,10,1.5); INSERT INTO Item VALUES(31,2,4,3,1.5); INSERT INTO Item VALUES(31,1,4,23,1.5); INSERT INTO Item VALUES(31,0,33,10,1.5); INSERT INTO Item VALUES(32,2,1,14,1.5); INSERT INTO Item VALUES(32,1,30,13,1.5); INSERT INTO Item VALUES(32,0,35,11,1.5); INSERT INTO Item VALUES(33,15,38,7,1.5); INSERT INTO Item VALUES(33,14,44,13,1.5); INSERT INTO Item VALUES(33,13,25,16,1.5); INSERT INTO Item VALUES(33,12,16,23,1.5); INSERT INTO Item VALUES(33,11,5,7,1.5); INSERT INTO Item VALUES(33,10,24,9,1.5); INSERT INTO Item VALUES(33,9,29,5,1.5); INSERT INTO Item VALUES(33,8,3,15,1.5); INSERT INTO Item VALUES(33,7,43,10,1.5); INSERT INTO Item VALUES(33,6,17,16,1.5); INSERT INTO Item VALUES(33,5,8,11,1.5); INSERT INTO Item VALUES(33,4,24,1,1.5); INSERT INTO Item VALUES(33,3,48,1,1.5); INSERT INTO Item VALUES(33,2,36,16,1.5); INSERT INTO Item VALUES(33,1,10,21,1.5); INSERT INTO Item VALUES(33,0,36,5,1.5); INSERT INTO Item VALUES(34,14,46,7,1.5); INSERT INTO Item VALUES(34,13,30,14,1.5); INSERT INTO Item VALUES(34,12,43,21,1.5); INSERT INTO Item VALUES(34,11,4,17,1.5); INSERT INTO Item VALUES(34,10,41,16,1.5); INSERT INTO Item VALUES(34,9,8,17,1.5); INSERT INTO Item VALUES(34,8,3,1,1.5); INSERT INTO Item VALUES(34,7,21,22,1.5); INSERT INTO Item VALUES(34,6,32,7,1.5); INSERT INTO Item VALUES(34,5,45,13,1.5); INSERT INTO Item VALUES(34,4,27,1,1.5); INSERT INTO Item VALUES(34,3,44,15,1.5); INSERT INTO Item VALUES(34,2,28,22,1.5); INSERT INTO Item VALUES(34,1,4,3,1.5); INSERT INTO Item VALUES(34,0,10,22,1.5); INSERT INTO Item VALUES(35,13,19,17,1.5); INSERT INTO Item VALUES(35,12,7,23,1.5); INSERT INTO Item VALUES(35,11,44,9,1.5); INSERT INTO Item VALUES(35,10,17,11,1.5); INSERT INTO Item VALUES(35,9,19,1,1.5); INSERT INTO Item VALUES(35,8,0,1,1.5); INSERT INTO Item VALUES(35,7,22,15,1.5); INSERT INTO Item VALUES(35,6,5,4,1.5); INSERT INTO Item VALUES(35,5,33,5,1.5); INSERT INTO Item VALUES(35,4,14,17,1.5); INSERT INTO Item VALUES(35,3,27,10,1.5); INSERT INTO Item VALUES(35,2,14,4,1.5); INSERT INTO Item VALUES(35,1,3,9,1.5); INSERT INTO Item VALUES(35,0,20,17,1.5); INSERT INTO Item VALUES(36,11,44,9,1.5); INSERT INTO Item VALUES(36,10,47,11,1.5); INSERT INTO Item VALUES(36,9,31,18,1.5); INSERT INTO Item VALUES(36,8,4,21,1.5); INSERT INTO Item VALUES(36,7,39,19,1.5); INSERT INTO Item VALUES(36,6,39,20,1.5); INSERT INTO Item VALUES(36,5,25,8,1.5); INSERT INTO Item VALUES(36,4,40,5,1.5); INSERT INTO Item VALUES(36,3,10,8,1.5); INSERT INTO Item VALUES(36,2,1,6,1.5); INSERT INTO Item VALUES(36,1,15,23,1.5); INSERT INTO Item VALUES(36,0,18,13,1.5); INSERT INTO Item VALUES(37,21,6,9,1.5); INSERT INTO Item VALUES(37,20,14,1,1.5); INSERT INTO Item VALUES(37,19,19,20,1.5); INSERT INTO Item VALUES(37,18,26,22,1.5); INSERT INTO Item VALUES(37,17,38,18,1.5); INSERT INTO Item VALUES(37,16,27,8,1.5); INSERT INTO Item VALUES(37,15,32,12,1.5); INSERT INTO Item VALUES(37,14,12,3,1.5); INSERT INTO Item VALUES(37,13,32,3,1.5); INSERT INTO Item VALUES(37,12,24,23,1.5); INSERT INTO Item VALUES(37,11,30,5,1.5); INSERT INTO Item VALUES(37,10,1,18,1.5); INSERT INTO Item VALUES(37,9,47,16,1.5); INSERT INTO Item VALUES(37,8,46,9,1.5); INSERT INTO Item VALUES(37,7,24,19,1.5); INSERT INTO Item VALUES(37,6,34,12,1.5); INSERT INTO Item VALUES(37,5,1,14,1.5); INSERT INTO Item VALUES(37,4,13,20,1.5); INSERT INTO Item VALUES(37,3,26,7,1.5); INSERT INTO Item VALUES(37,2,36,8,1.5); INSERT INTO Item VALUES(37,1,15,20,1.5); INSERT INTO Item VALUES(37,0,41,24,1.5); INSERT INTO Item VALUES(38,19,4,7,1.5); INSERT INTO Item VALUES(38,18,28,20,1.5); INSERT INTO Item VALUES(38,17,32,4,1.5); INSERT INTO Item VALUES(38,16,40,18,1.5); INSERT INTO Item VALUES(38,15,47,10,1.5); INSERT INTO Item VALUES(38,14,20,7,1.5); INSERT INTO Item VALUES(38,13,8,7,1.5); INSERT INTO Item VALUES(38,12,1,18,1.5); INSERT INTO Item VALUES(38,11,19,18,1.5); INSERT INTO Item VALUES(38,10,4,18,1.5); INSERT INTO Item VALUES(38,9,27,20,1.5); INSERT INTO Item VALUES(38,8,40,10,1.5); INSERT INTO Item VALUES(38,7,15,1,1.5); INSERT INTO Item VALUES(38,6,5,19,1.5); INSERT INTO Item VALUES(38,5,48,17,1.5); INSERT INTO Item VALUES(38,4,45,14,1.5); INSERT INTO Item VALUES(38,3,27,19,1.5); INSERT INTO Item VALUES(38,2,4,8,1.5); INSERT INTO Item VALUES(38,1,45,13,1.5); INSERT INTO Item VALUES(38,0,48,14,1.5); INSERT INTO Item VALUES(39,3,20,17,1.5); INSERT INTO Item VALUES(39,2,39,16,1.5); INSERT INTO Item VALUES(39,1,24,6,1.5); INSERT INTO Item VALUES(39,0,10,12,1.5); INSERT INTO Item VALUES(40,20,4,16,1.5); INSERT INTO Item VALUES(40,19,7,23,1.5); INSERT INTO Item VALUES(40,18,33,11,1.5); INSERT INTO Item VALUES(40,17,4,20,1.5); INSERT INTO Item VALUES(40,16,27,16,1.5); INSERT INTO Item VALUES(40,15,22,12,1.5); INSERT INTO Item VALUES(40,14,4,24,1.5); INSERT INTO Item VALUES(40,13,6,8,1.5); INSERT INTO Item VALUES(40,12,35,13,1.5); INSERT INTO Item VALUES(40,11,27,2,1.5); INSERT INTO Item VALUES(40,10,6,11,1.5); INSERT INTO Item VALUES(40,9,40,17,1.5); INSERT INTO Item VALUES(40,8,11,4,1.5); INSERT INTO Item VALUES(40,7,31,1,1.5); INSERT INTO Item VALUES(40,6,28,12,1.5); INSERT INTO Item VALUES(40,5,32,18,1.5); INSERT INTO Item VALUES(40,4,18,13,1.5); INSERT INTO Item VALUES(40,3,26,10,1.5); INSERT INTO Item VALUES(40,2,4,5,1.5); INSERT INTO Item VALUES(40,1,45,24,1.5); INSERT INTO Item VALUES(40,0,46,24,1.5); INSERT INTO Item VALUES(41,11,48,15,1.5); INSERT INTO Item VALUES(41,10,24,20,1.5); INSERT INTO Item VALUES(41,9,26,21,1.5); INSERT INTO Item VALUES(41,8,9,22,1.5); INSERT INTO Item VALUES(41,7,22,18,1.5); INSERT INTO Item VALUES(41,6,17,11,1.5); INSERT INTO Item VALUES(41,5,9,21,1.5); INSERT INTO Item VALUES(41,4,16,22,1.5); INSERT INTO Item VALUES(41,3,29,20,1.5); INSERT INTO Item VALUES(41,2,36,2,1.5); INSERT INTO Item VALUES(41,1,47,19,1.5); INSERT INTO Item VALUES(41,0,5,24,1.5); INSERT INTO Item VALUES(42,4,48,15,1.5); INSERT INTO Item VALUES(42,3,40,14,1.5); INSERT INTO Item VALUES(42,2,40,19,1.5); INSERT INTO Item VALUES(42,1,18,21,1.5); INSERT INTO Item VALUES(42,0,48,9,1.5); INSERT INTO Item VALUES(43,16,38,12,1.5); INSERT INTO Item VALUES(43,15,48,7,1.5); INSERT INTO Item VALUES(43,14,3,18,1.5); INSERT INTO Item VALUES(43,13,44,22,1.5); INSERT INTO Item VALUES(43,12,40,24,1.5); INSERT INTO Item VALUES(43,11,49,23,1.5); INSERT INTO Item VALUES(43,10,35,1,1.5); INSERT INTO Item VALUES(43,9,7,23,1.5); INSERT INTO Item VALUES(43,8,44,8,1.5); INSERT INTO Item VALUES(43,7,11,15,1.5); INSERT INTO Item VALUES(43,6,24,1,1.5); INSERT INTO Item VALUES(43,5,33,6,1.5); INSERT INTO Item VALUES(43,4,32,22,1.5); INSERT INTO Item VALUES(43,3,6,18,1.5); INSERT INTO Item VALUES(43,2,2,15,1.5); INSERT INTO Item VALUES(43,1,18,19,1.5); INSERT INTO Item VALUES(43,0,15,22,1.5); INSERT INTO Item VALUES(44,8,28,23,1.5); INSERT INTO Item VALUES(44,7,49,17,1.5); INSERT INTO Item VALUES(44,6,14,15,1.5); INSERT INTO Item VALUES(44,5,41,22,1.5); INSERT INTO Item VALUES(44,4,12,3,1.5); INSERT INTO Item VALUES(44,3,3,14,1.5); INSERT INTO Item VALUES(44,2,17,14,1.5); INSERT INTO Item VALUES(44,1,34,17,1.5); INSERT INTO Item VALUES(44,0,33,20,1.5); INSERT INTO Item VALUES(45,14,3,16,1.5); INSERT INTO Item VALUES(45,13,47,8,1.5); INSERT INTO Item VALUES(45,12,32,13,1.5); INSERT INTO Item VALUES(45,11,31,22,1.5); INSERT INTO Item VALUES(45,10,41,24,1.5); INSERT INTO Item VALUES(45,9,26,18,1.5); INSERT INTO Item VALUES(45,8,9,2,1.5); INSERT INTO Item VALUES(45,7,6,24,1.5); INSERT INTO Item VALUES(45,6,39,5,1.5); INSERT INTO Item VALUES(45,5,45,17,1.5); INSERT INTO Item VALUES(45,4,3,14,1.5); INSERT INTO Item VALUES(45,3,14,11,1.5); INSERT INTO Item VALUES(45,2,46,8,1.5); INSERT INTO Item VALUES(45,1,11,6,1.5); INSERT INTO Item VALUES(45,0,44,6,1.5); INSERT INTO Item VALUES(46,17,12,23,1.5); INSERT INTO Item VALUES(46,16,46,21,1.5); INSERT INTO Item VALUES(46,15,40,11,1.5); INSERT INTO Item VALUES(46,14,24,10,1.5); INSERT INTO Item VALUES(46,13,36,20,1.5); INSERT INTO Item VALUES(46,12,21,24,1.5); INSERT INTO Item VALUES(46,11,1,4,1.5); INSERT INTO Item VALUES(46,10,11,24,1.5); INSERT INTO Item VALUES(46,9,7,4,1.5); INSERT INTO Item VALUES(46,8,8,22,1.5); INSERT INTO Item VALUES(46,7,49,9,1.5); INSERT INTO Item VALUES(46,6,41,18,1.5); INSERT INTO Item VALUES(46,5,25,9,1.5); INSERT INTO Item VALUES(46,4,17,5,1.5); INSERT INTO Item VALUES(46,3,21,19,1.5); INSERT INTO Item VALUES(46,2,30,14,1.5); INSERT INTO Item VALUES(46,1,12,24,1.5); INSERT INTO Item VALUES(46,0,5,21,1.5); INSERT INTO Item VALUES(47,13,33,8,1.5); INSERT INTO Item VALUES(47,12,12,20,1.5); INSERT INTO Item VALUES(47,11,35,10,1.5); INSERT INTO Item VALUES(47,10,45,2,1.5); INSERT INTO Item VALUES(47,9,32,9,1.5); INSERT INTO Item VALUES(47,8,16,2,1.5); INSERT INTO Item VALUES(47,7,28,14,1.5); INSERT INTO Item VALUES(47,6,8,10,1.5); INSERT INTO Item VALUES(47,5,40,8,1.5); INSERT INTO Item VALUES(47,4,15,1,1.5); INSERT INTO Item VALUES(47,3,1,4,1.5); INSERT INTO Item VALUES(47,2,17,6,1.5); INSERT INTO Item VALUES(47,1,23,13,1.5); INSERT INTO Item VALUES(47,0,23,15,1.5); INSERT INTO Item VALUES(48,10,41,10,1.5); INSERT INTO Item VALUES(48,9,35,17,1.5); INSERT INTO Item VALUES(48,8,5,12,1.5); INSERT INTO Item VALUES(48,7,30,19,1.5); INSERT INTO Item VALUES(48,6,11,17,1.5); INSERT INTO Item VALUES(48,5,24,16,1.5); INSERT INTO Item VALUES(48,4,48,4,1.5); INSERT INTO Item VALUES(48,3,10,2,1.5); INSERT INTO Item VALUES(48,2,23,10,1.5); INSERT INTO Item VALUES(48,1,26,23,1.5); INSERT INTO Item VALUES(48,0,6,23,1.5); INSERT INTO Item VALUES(49,16,24,18,1.5); INSERT INTO Item VALUES(49,15,19,24,1.5); INSERT INTO Item VALUES(49,14,23,5,1.5); INSERT INTO Item VALUES(49,13,6,22,1.5); INSERT INTO Item VALUES(49,12,21,17,1.5); INSERT INTO Item VALUES(49,11,40,15,1.5); INSERT INTO Item VALUES(49,10,30,16,1.5); INSERT INTO Item VALUES(49,9,7,24,1.5); INSERT INTO Item VALUES(49,8,48,24,1.5); INSERT INTO Item VALUES(49,7,6,21,1.5); INSERT INTO Item VALUES(49,6,29,15,1.5); INSERT INTO Item VALUES(49,5,16,1,1.5); INSERT INTO Item VALUES(49,4,47,14,1.5); INSERT INTO Item VALUES(49,3,17,19,1.5); INSERT INTO Item VALUES(49,2,29,6,1.5); INSERT INTO Item VALUES(49,1,22,16,1.5); INSERT INTO Item VALUES(49,0,18,6,1.5); UPDATE Product SET Price=ROUND(Price*.1,2); UPDATE Item SET Cost=Cost*(SELECT Price FROM Product prod WHERE ProductID=prod.ID); UPDATE Invoice SET Total=SELECT SUM(Cost*Quantity) FROM Item WHERE InvoiceID=Invoice.ID; COMMIT; hsqldb2.2-2.2.9.orig/hsqldb/doc/verbatim/sample/sample.sql0000644000175000017500000000224512007570374021754 0ustar renerene/* $Id: sample.sql 3637 2010-06-07 00:59:13Z unsaved $ Exemplifies use of SqlTool. PCTASK Table creation */ /* Ignore error for these two statements */ \c true DROP TABLE pctasklist; DROP TABLE pctask; \c false \p Creating table pctask CREATE TABLE pctask ( id integer identity, name varchar(40), description varchar(256), url varchar(80), UNIQUE (name) ); \p Creating table pctasklist CREATE TABLE pctasklist ( id integer identity, host varchar(20) not null, tasksequence int not null, pctask integer, assigndate timestamp default current_timestamp, completedate timestamp, show boolean default true, FOREIGN KEY (pctask) REFERENCES pctask, UNIQUE (host, tasksequence) ); \p Granting privileges GRANT select ON pctask TO public; GRANT all ON pctask TO tomcat; GRANT select ON pctasklist TO public; GRANT all ON pctasklist TO tomcat; \p Inserting test records INSERT INTO pctask (name, description, url) VALUES ( 'task one', 'Description for task 1', 'http://cnn.com'); INSERT INTO pctasklist (host, tasksequence, pctask) VALUES ( 'admc-masq', 101, (SELECT id FROM pctask WHERE name = 'task one')); commit; hsqldb2.2-2.2.9.orig/hsqldb/doc/images/0000755000175000017500000000000012007570374016122 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/images/hypersql_logo.png0000644000175000017500000001235312007570374021523 0ustar renerene‰PNG  IHDRß/ck5sBIT|dˆ pHYs : :ðd’JtEXtSoftwarewww.inkscape.org›î<hIDATxœí{”U™ÀÕ=ÏÌ+“d’yå’RÞ AØ0¢ˆ¼D6¸@PX­£3.z<îÑõ¨«–ú…ëc…sP°PP"ì.òE4DäYD$éÌd&“Ìdz¦{¦»kÿ¸5¤§ûÞꪞ™dþ3''uoÕ½Ý]_Ýï~¯Ò\×¥D‰7ݽ±eÀ…À;€V h}@Ÿ÷¶÷wu´™ÙªÑJÂWâ@wo¬øpp* …8=< Ü ÜÜÕÑÚ?û3 OIøJnXQàX­:bå™úëwl39“1º{cMÀOU3š°` ø>ðí®ŽÖ}³p½¢ÑVøß"’¶'ÛütØ ê†u+ð6ISܱÍ÷„½^‰ù…nX À€§ |ºOz½¿{ÛL§»7V|ø P;“9+þ¸¦«£5МtúX#iwlóÝa'P†øeÂ7öb'§HŽ,òz%æºaE€« Xð´rÄýu:Bˆ­\Þžî. #üLS\ ¼»»7¶±«£u0À9Ç#>K.ñb& º%¦¡Vpð_¼\úÛœ,Ô©»7¶ø#Ïu]†“)F'Ø5œà•¡qv'ˆO0’HáhKuð‡îÞØÉA:Ï&e‡{ÀoHlàŠ^cg¡7?¶û -Âqµ…ª>® ý£IúG“ Ä“¤Òj+j4ÕT²¬¶’¥µhšÒF³ èíî]ÒÕÑú…æ9[”V¾¾è†µ`‚çý@BÑî+|Ý[bš¦ÝŠ«íòŒ4..»‡<ºcÛbÃìIø ÀdÚ%6’à©Ø0î"6’Àg1¬îìî½Õ÷¢³HIøJâ? ´ßœT;¶ÙìØf5°a˜èîÆ×T¸©wÏ -ÂÝ@ ¯’%ģɽ²Ÿ¿ô0>™.êCŒO¦yzϽ¯î#>¡¼FpOwoL¹òÎ&%µ³„ݰŽC¸T|˱Í/ætlsÊÕðgàݰjP쯆H;îÝ.,Í—pYÞ?š¬z:6LE.0“i~÷Ú'·4ÐTS!ë¢?ë«£µ8IHIøJøq¾OÛÀ—‚\ıÍ8 ‹àòÞ=W¸°.¯Áeõ+ûÇömŒW< ¨*2‘Ê.à»N¥]¶î>ÀñKëX¾°ZÖå|à£ÀÍ…G.ž#*|ºaU•Šæ„c›ªýƒìZ•€ô›†Ût³úªÔŠÜ~õÀ{òvïp?ð pŸc›ûƒÎO…nXˆûh  á7€íÀÃŽmއ¼f ÂÌ? Ç6äôkE¨Œ§yc?íØæµY]Vø ³%û»*†›¶n-Òüo²`•=# ^Ø;ºØïü¥µ,^PA]eõUe”E"àB|2ÅH"Åp"El$ÁD:“² Ïí¥¦¢ŒE ò¾*€¯w÷Æ~ÒÕÑø Ë‘^ù>ܤh{¿”–8fê?ºa-TB³Ø©V b¯sj'ò¤nX÷ŸulóåóœšÇ:ààlü‡qݰ®vlóO/ÿ3DVî˜åSNnݰ>…p2gë^²…¯Ùg 'à\””%š»\´£sÇ“)þ²Gín®­¤½±š% $j£5eÔT”ÑRG/^Àsýé;˜hãº.Ûbì_ÙHuy4·¹Uó½pŸ*8GÚàr'jëØ9>+Ô4¼UïbEó­ažÐºal ü£7ʽ1ÿ¢VgˆëGuúkx…€ÕÀàIݰ®Ó KºQ 1~™nXw×3]ðdŒú´6“y¸h†ìø q2³d4¢qRK=kÚä‚'¡"aMkkÛ¨Œæ é Ïö+?æ—º{cs]aáslsa “Q¼?à¥.@D,ä’~bJ'¿dúæ¿ €é†õB=gõÀ§ÿÝGO?Ö +LPq.×öÝåÓöQݰüö„¾Ü²¥¯ I´ÈñIâòpÐc/p[ë‹ ï\V[Éé+•øúãI†Æ&d§-!œöŠ#½òpàªz“¨nü‡ÛTš¸%ÜFqq„ÀÖ «è:‚&D„xÃYÀçBôÔ§- ܧÖ7¼xÏPd"é ‘Ü;‡åŠÐªÆjŽZT3“‡ Ê£¼u©üç}iP!–§¾Ï~*O³nX,âš!û?ìE¾Úœ«ÖÂ\CA6žÑæïÍ·„œKöÜ'½ß»{³s• ±‡’þXºa½±‡1„¨?Ï#ök‚rœ¤ÿçtú¹ˆ½æÇ—гá_®h_þY7¬ëÛô[-_Ç%r¶&Q-÷Žæ _DÓx[SòZ©L†‘dб‰45eÔW–È?æò…ÕôL²/g¥Û?>I|"MMEžjzawo,ÒÕÑ*±ÚÌ ?á;¡"Í)Žm¦túx›ËÔ¾ÊOu¼ùjuøï"§.pló±¬c7y‚þàïç½O7¬cÛ|^Òöä7þcÀåŽmîÉ:6lóöf=Àå9ç”_>Rð“L'û!åÏ!V·}ˆ¤ÔUÙÛtuÃúðó×m¾|V7¬_×:¶ù¤ß šD Ç&ÒLJü -õÒoÎÅeÏH’gûNs/D#okª¥}auÞipbsî"“ã’ˆ'©©ÈÛæ/Ö#²2f•ù v‚¿ê™{ãm¿#Œ«"‹°!GððLþáoéËÓtÃ:¹"ücŽàeGD‰ì•4_âšÂ0ugïqlóÇ6?騿WÛì’¥|9¶y'pCÀë—!>ÿºaõê†õ>uW·5÷H"%_\V,¬Q\CãµýÉ<¿^:ãòlÿAžë—[L«Ê£ÔWå¯;£ÊÔÃT 3a^Ÿc›OÏ(š•VOÏm ÒÉ{ŠœÎMŽmþFÕèEo|Þç|™âCо×Ú“zx¤©8×ï\.p±c›¿ qÎ'o†ç à^ݰþ –, G"|ò€’òÛTN_¡ŒTaçqâRC õ•ùÂ7œT¦õµ¨f¼>ÕêWÚprwÀ3Žmþ±Èyü0@ŸaEÛ‰^î[6ë}ƒFÐ?¥8þ΀çgó¤c›…9Á±M×±Í/# 6÷㞜ϩÀfݰ.Í9xï©ùtÕ48¥}!KkåJÀŽ!¹!E¶ò¥Ònž*êáçï,¿=ßjg´‹ \WÅOŽmÙa#ò}ŸÊÊY쪷ձÍ url3©Öo‘»B öN/ƒpl#Ï~κaÉÚrQÙ×eƘBÜUÄ98¶ùðˆnX' ŒAW"‰¤‘Pܩֻ^Wç5öà²:»SYD¾Ä'R4T©‡Ñ€SZx¶ÿ ;‡§$S¸äKzâzÉTFæpŸ“•ÏOHqló¼°Ô k+òLv_ÛŒé†õk„ã9—<«§nXµˆÐ¯\&Ÿ„ßã¯!úîöi[„'|_‘L/Š¿1ž ¿ gwÏpLÛ|øˆnX&ÂPvr?k6Sî˜ÛsqcÚ4á«*—¯pÛ÷ÅY×V ÞBƒã›ë˜ÈdèÏŠfÉd‰ø¥£ “æœD‚Í'µ„ŸM†LõÜ€<–ó>Ç6‹-÷Jˆ¾R#‰G¶ß«ØÌï „ qo혭ÁÛÜíØæç–Kaaöã(à\-Ï%QWYNDæ¬ç®mi ¹îг®®²Lª¶Ž$äû»ª¨T$úŠù&|w£iÊuN«¬œÅªœ *[E¾“d?)UÁÞ³_ø›ŒÇ6gÝ_娿ˆc›× ‚Ãï/ÐýJ\-ϯ5㊠¼0°'·6Ðâí[ëå{Á‘d~E‹hDSùý´E3¯„ϱÍ1Ô{’s§")¼lƒ $}úÙÅÒ6K}³13Î|ð!ÒÝ0—sÁËòØ€¿!é$€Šhú>YãÊEr·Â«Cã ,ÍÉm ¬j¬aE£üù$³lÖV(µË7ÅÊÁ¬ž#OEº-hi:í…»ê›-|ªªXiàíˆH–™ü»#s*|Žm¦ñwÅ4ë†Uf¬oßÄŠÛ^_EET¾÷{rç~v Ë®ŠO¤Ù7žÈì<0ž§±Æ'ˆK„o‰Âe¼hÐé”"›Q‡4mD§ÊÊ6œ,—ÓtêplÓO¥œ*£§r¤ÉÚW9¶9¬Ö Âð’M˜plóé™L8$*÷Èlãg1ŽàY?\×ý©¦iks;»´Ž?ï9ˆÌ£ñLßA¶ŽqJ[ƒðÕeÉ©¨Ù2Nl$Á°ØÓE^Ne\`åÂj „;á™~yUÌ&¹»b xÄçóͼ[ù¼=‰ÊZyžnX«;—¯ë Ãb‚Ò¾ ‰“ØãEIdÍfEß·œ×l1ëû=ù™é‡š*!ØuˆxŸÂ4Zê«h©S§ %Riuˆ_9{yè¥6ÿu‡œÞ>Àó{G§OôLG^Þ×^;0æÇ6_@DøË•åGdoÏøçÌ}uŠyÜŽ^Î¥ ¸Ý “+ˆnXݰ.Ö ëQæ¶šs6ßÕ ëOºa}\7,uj¯g˜ô ‘ULó3¦ªúºQ¨©«Óèã\C[C5+- ±ºç½ˆdàØæ¨nXײ§ü9€£ÖW[æ Ð kÂ?öDu­ÃI°sB@dá?H…*C”ß8QÆÃÏ>AN¦ÌUëÖMÞ²¥ï’L$ó;rõpúÊF^eÇЙ"*ÆTF£»¬–æºJí”¶žŠ¤‡Æ&¢ Ž[V§ `ûAÀ7U놵9äÔÒóYø~†¨ŸäÑ7ßžŠË¼¿4â ¨ ­Ïæ >~´o#"rδµ!ÔæëuÃÚŽ(œ4†pЃüÅ3‡‹l—J-ÂèUlB°åØæ+¹?zfósÝï¾W»‰6¶zI-oY\à qv “ …шƊ…Õ³¸fšï®<ÑÖ¶ÖGžÚs03OFŽ[VÇÂjé-6Bð`ò†ô¼T;Û¤°ÃÄbó, +sðG &x=Žm*UÏ‚ú ;“Q‹ˆ½ ¡º]Ä‘7s×m÷iš«tQD4ã–Örîê&Nn©gY]%õUåT•G¨ˆF¨ˆjÔT”ÑZ_ÅiËrÎê&ÞÚT+uš—G#ÚÚ–:MoªmoPÆ@|w®_!6o…ÏCn–M¨Iø>°©ˆóþßè‹c›{ªôƒEŒqØñø¹.’b¸‘Æäë“ì<£í{®Ë•®Pó¥hkèÚÖÎXÙÈYG/áìc–pö1MœyÔ"Nj©gÑ‚ ß”‰Œ / Œj»$ÜŒëÊ¢Wžc«–M1ß…ï—ø;†]ÂH*Dþô]‚9¯Ç–ÏK=çrAÛBdßwQœóv"k»s|†.ÜÔ¹fˬN^Á|v5Lqªâø­s°2Ìé[iJO×úö!DµƒŸ^ ‘–-¯.Ó¢eË"™H3‹p"êö§S“}}+÷nÜ8ý·ÜÔ¹f|c϶ Àÿ¢®}S <°±gÛ…›:×øÕ,æµðy¡M2ó³ËܼAæpÅ>–˜_‡ g®ÜCÈ<»TUi¨îߨ³í¢Mk6Ïl¦þÌ k§nX'è†u¬·¯B7¬ OÝü=òlíÛœ‹4ÒÊ÷7ΦÎ5 DJÚ¯|ºÕ÷mìÙvâ\Îe^ð-„o%®V?bOö[äæáJž‡¡´ò½ ððýø'^ß<;—ó˜/·ÌûWC¬t~êðõŽmÎÕ—RZùÞ$lê\“DDÉ¢¨n>²©sÍœ>Œç‹ð­‹x/ð¯s8ÒÊ÷&"K³Ó†ºÎ¹<˜Âç¥îªÂ•FX.›cßWiå{“±©sÍp)"šêFàŸ6u®9,þ·ù`í,~€HI9‘C/=EDÙl¾åØæŒß„ê1‰ØcÊPU†.ñ7̦Î5{¶] ¤—àü?S É ð=¹IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/hypersql_logo2.png0000644000175000017500000000677412007570374021617 0ustar renerene‰PNG  IHDR” ôgQ·sBIT|dˆ pHYs''MTØÇtEXtSoftwarewww.inkscape.org›î< yIDATxœíœ{pÕ}Ç?{ïÕÛz[–u‘y¯ñk'ŒƒMM ÒI¶”ðH3}$ChÙ€ÝÀ¦Éš0™D‚n„QJBB<”¦q,ˆ—,_ɶ^–î½’önÿ8{¥³«½=;dôÙ‘ÏïwÎoÏÞóÝßùß9kÅq–ðÎG{Wì"àƒÀ6à 1àð<ð$°·­9:¾PýP–õÿU3Фeê3Œö®˜|ø æÙìpp_[s4>£ŽæeÍÇî~I²ï[¦þ£lTÍhÞ'‰NX¦þéùîÜ+TÍ8ø °X ¬là$pxø…eê?ÈdÃõH›fÙðé¶æè3ô±ø¦Oü ËÔ»²×ã%Ôo¬„Bü×Kå#À¡r@ÕŒà~@Cüö2Âb­@d;H¨ö®ØÕÀÃÀ²L÷ŠÛØ)‡²¢0 JP•(ðŸí]±;Úš£F€¾ï<ä$Ôªf„€Ÿ;òlr4HØÑuôPîJdùȸMl0Á`bœÁÄãv €pH¡¢(BEqõË ©)-”›)ÀÝí]±³Úš£7Îô™‚°D¨ÅÃM“©Ø œ Àz Ç_±}ï±+P”ûÅyEq”µ@¡¼Õ?ŠÕ7‚Û)‡þø8ýñqÞêeUU kë–y¼Ö'Û»b¿kkŽ~m®¹D¨ÅÃͲVà!0®jÆ: Z–}w_o½¢8ßBŠ£\ü61n¯ïîŠ å·hs€·âôŒ±qeµ¥²ú+í]±ýmÍÑÿÉÿ‘¦ãO(U3 ˆ[¦>ªf„z ×2õ U3ª }Õž²LýÁ ö–©¿ê—…Æ'nwªÒåäDêÂ$OÙž1,‡¨*‰PY\@Q8ÌpRLC‰ oãã6/ég˪j™Taàþö®Ø…mÍÑÔlŸ}Þ ¥jF)Љè`{,Sÿb–67×H¢–©ßêên®•t–©·«š±±Rº 7žP5ãm÷Þw[¦þvŽ~Ö·-À¹’üðsàÛ–©ïÍж±ÂJãËÔïq‰óp"`6€Ï f~“­2:ºŽD%|“,{±g€ÓI»D ¤(°fygV—Vä鬀Ď 22fÂ[ýïñ!.9»Fžþ6É·o~„rW™,SE$ÔÞ/]ŸU5#y?ã«/¤k}ºµªfÜ< \‰78­G¬6_Q5ãO3ÝLÕŒíÀkÀmHdr±ø(°GÕŒû\èG©¯O¹${ ±2ò¯¾6®É`{R„/ŠÒåØP‚áäĤ>Rœm«—sNM™LS¨*ŽpñÙ5D+¦~®ø¸Íë'Oû«ÞžOŸ2aÞ åâa_¹xoPEU3.ÖH¢ àÑ,¶¯B$ò² F-ð¤ªu÷Û„È×fikÿï€ÉQ/³3èzÿÈüHÕŒÆ\†CÐ$—­>¯©­gV+EáÜCV6¬\FYÁÔäñ‡þ8ƒ O ¶¾½+v^Ncä5v¨šQ —ñ®úÇ®_ö×ÿP·ÅW~Ê2õÞ,¶×»`/pðq`•To9p ‚|2 _¿^ELK/¹m®>Ça?§jÆ}–©ŸÌÒ§uÀŸdRZ¦>¦jÆ£€iþ!à2U3¾ |=Ó=‰P)Ç!aO…85¥,+ŠÈu952ÆñÓ ìÔ–rFEñäÓ„… å¼ðÖ€ˆ¨8>œ¤²Ø _ &:DÊ?sl(Al8Á–ÆÊÉgMI!%ãbÚNLàÃÅÌ’P 5åÁôi¯¸D¨š±áúÓ8…Hþå—$2`™úAÄÀøïÙ,•oòé¿aU÷b$OæÑ§8p¹eêOX¦Þg™úyµf™ú àR„G BðÀ!U3pWž´?×SƒD¤7EPRèÂp¶¯®E‘Ä'GÆ82à ã*Ц<ÒPr¡‚ya! µèóÉþÒWö{§ï[¦>–î|7ƒ®3@&Oƒk|º_±L}8(‰ÎOpìvI–©¿\üp CµBDÎêçªfDz¶6#ieDñY<9}… +\~^‡T}#IOÊâ©ÉiÌN‘˜ðØ™WBÝ…Hªe»Úsvå1ŸøZßÊÆ?å3Ý·LýX†{ö!ýø.ä wµO÷†ªNÐøW‰+sô+ÏŠeê¶eêßCÄ}žÍPuðO;!…Ø_ Ú›Œäð©ÑÀÆaEaÇêºÉö'Ñí”Wà;u2kGC%,SÈÖHÕŒd6½„‡ñn7ïö¹Ùàõ’î÷–©?Ÿ‡Íi[>ô#¦4êa2y™‹ÙЀˆ±2áÈLŒ¹Ùñ'«Ñà[ˆEŒ[TÍøâm7üe¶”† )æÃ‰øvÊño¥ )l?¯Žÿ>ØG­wÁ„=ùï‚BIœ6$ð…Í 9åa™ú>àuŸ8=ÍÍÆ;oK"ý)÷ï´@a†È5 œÊ¡ÏËÔ;IEÿ‹ÎRPöËÂê‰ì}ó¤'P— +4ŸSí4Tzö’LLEåÅÓüJl&ý÷Üo¶ g€G€]RùZD†ZŽŸRLâ3¡QՌ XKÕŒåx½¸ÍÝ*$Ý™–©ÏȳdAÿ\[¦Þ«jÆ#ÀßúTu!ÅþµíL½ûÊÙsèÔÔVÊXЧž`˪*ª%r$m›ÁÄ/TêK‹F/XY^ …èŒOfÌ*ЦÑà…Ù>Ç‚z(~¢œ«jÆ ˆà4g–Ê™PŒHnáê™lwŸO—1w4 äZL䃠dmÿßlm<€Ø $f]½7o§Rì{ó»_ë噃}>:aOé+‹©)ñÄWo´5G—Ï3a±N< ¼G*ËÁç03O¢5?Q5ã. Û-ïbú¹êËÔ‡¤r;p‡tÿuÀ/UÍø,ð«ô1—@[€¿GxÃó™ßÌBdÝ_~ Xˆ ¿ ¸‘E÷ïþ0=µâ’†îö®Ø]H¹¶+Ë©*‰ðjïéi«6?Ω)eÍòe„J BÊÈ˱¡²¢Hˆµ+ÊýUïÉbæcªf¼;Û}‹P_ t?p7”gŠmî• Ià>Y`™úˆªmˆ#Îéée ðK`DՌÈ£0þlö|à ÷ï»È½ubkɳQÛÖÝÕÞul38“S~ce gTóZïoŸN2f§„wr à եœU]FMÉÔP×——]e$¤(eÞÕáa²§„®p¯ŒXŒ*%ÞA=ÓéîÎZKp€6ËÔôå ÄÁ6ê£ ØÈ ¦•Ž;,S÷v*Bv ŠâIà*(œ¿bÛέåÏÖÔñþ5u\±¶Žíç-gS´ÒC&)‡¾Óce!EyY¶ üã\?±ZB¹ZÅöÌÐÎâÓ¡; „÷—Y¦žñLeê!¦É‡˜~ ‘¬ü Äžß\±È›Dlh¯¶L½;¨BËÖÆxÛÅ ×ã8w0ý¥@Ép„`tÜæù#ýĆt÷ l:9:–NImÍÑç|ŠX´ïòÜ/>zñÆ ;-S÷Ÿð·»q^*g-SovuD|³±al¹Û3éW±ùEx©ˆóXG|ñ×¼@ÕŒeˆœV"ÑG$E{\Ož7Ü[e‡Ù©ˆlZ0ä…óFÏ@bÿ+½Ã×ú‡|ÝŠò§Îª.ùó¹œÔLc1 ¥ ðtž(œ+@¨½–©_º0½|ÇBé芩Êf6£° Rý ¡n;D·“¤ûÆ÷6œhéØð¥»:[›ò=û•‹y¦ü*¼IÇݳL*Îù-ú#„ÓÚ} q 5ÛáD:[›¾ÜÒ±¿±g+cWKÇþ‰ÎÖ¦ oôòÆ‚JÕŒ"Nœ¶2ý Ûý³4½ôíüÑÙÚt·K*ÿqŸ-ûëlmÊzj"ÒC}ï6‡Œ§-SŸm6vÉCÍ:[›vº¤úgW4|x.d‚Z婚QDf2B×-–5Oèlmºø bãü†ÎÖ¦\ÿAN,TÚ ‘ –wø¯uq@~%bˆOŽÒ׌VqKÈŽÎÖ¦[-­Mχ½ÿDÁ‰¥[ÄžIEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/0000755000175000017500000000000012007570374016507 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/tip.tif0000644000175000017500000000064412007570374020013 0ustar renereneII*€?àP8#ž ‚BaP';J”RÄb ç¼.÷^ÄÜïxÜ5(”gE¡‘ô‰‹=ҋج‰þçR­aR¥ì*`ç…Já,å,¶÷=ˆMsˆ*–K RÑ s˜@µJÏ*3([z •Q*ð¤aì÷T…-d3 ôBì°7:R_=…¥6›\ŽßPŸ˜î»m¾êÿ{Þ­WËtÞ±‚¿·­Ïû÷ RÈ_õlv†ÀdfxˆRök«^)‚Ý®yxˆÂ›Ìl”­‚-R—ˆS;_"‡±¯î}“]“J#(Ðyõ ­”hûšäÖaïCL!¦­=CCLCLÕmoIßœÁLˆétˆi}WÐÓv<Æ|ˆéRˆiW]ÛØAÿ6œWs~<ÄTvr¡®¯wàÞ…˜Îbs›ßxbjWÂP“9h¡Ø7\À•"Ï~tºÃj‘gs˜k¢½.é[Äe\lõ')…–hSMr«2#ý—i°Ì)ŒëÃÜûôt¡HÇ$kIEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/important.gif0000644000175000017500000000175312007570374021221 0ustar renereneGIF89aöC)))999BB1ZZ)ccBBBRRRkkBccRssRccckkk{{{ŒŒŒŒ9½½­­!­­9œœZŒŒ{œœcœœ{µµJµµR½½Z¥¥c­­k­­{ÞÞÖÖÞÞ!ÞÞ1ÞÞ9ççïïïïÿÿÿÿÿÿçç)çç1ïï1ÿÿ!ÆÆZÖÖRÎÎsÖÖcÖÖkïïBççcçç{„„„ŒŒŒ”””¥¥„­­Œ¥¥”¥¥œ½½„½½œ¥¥¥­­¥­­­µµµ½½½ÆÆÆÎÎÎÖÖÖÞÞÞçççïïï÷÷÷½½½!ùK,þ€KKKKKKKKKKHHHHHKKKKKKKKKKKKKKKKHD?8???8?EJKKKKKKKKKKKJC79"&&&&&>7EKKKKKKKKKH84'''''''''/?JKKKKKKJ8=&'''''''''''&BKKKKKJ8='€''''% ''''''BKKKKE&'''''&'''''&GKKH<4'''''' "''''''/@KKE:'''''''6 ,'''''''HK?#''''''')''''''':EH?&'''''''þ€''''''''$8H?&''''''' ''''''''$8H?&'''''''!''''''''$8H?&'''''''*1''''''''$8H?&'''''''375''''''''$?KB"'''''''+ )'''€'''':EKF9''''''' +''''''3;HKJ ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/caution.png0000644000175000017500000000234212007570374020660 0ustar renerene‰PNG  IHDRשÍÊPLTE!!11BBZZcckkss{{„„„„sŒŒŒŒsŒŒŒ””””s””{œœœœsœœ{œœ”œœœ¥¥¥¥c¥¥œ¥¥¥µµµµZµµcµµµ½½½½cÎÎÎÎÎÖÖÖÖÎÖÖÖÞÞÞÞ1ÞÞ9ÞÞBçççç1çç9çççïïïïï÷÷÷÷÷÷÷÷1÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_§ä\bKGDˆHñIDATxÚu’ÛŽ‚@ †ñÀ®bÌ®ÊIc¹APÛ`bxÿ³sBEíU§_çïOh¿<Îô`Ó'€á1û§wpŽÜä õW–Èt:%suá&³w,ÀHêéȯøf Øþ“Èü‚—²59 ævÀ:€Ç\^ F;`çªHãJ'Ê8‰ƒ71€›íZJ²Æ+ïçb²2B‘¢8·ÀŸ›¤Q§$×wŠéRKÕ ´v)ÎnR˜Áp¯t¤ß} Ì²ŽÅîéŸVb¢Tšz·Dç ±·vã@Ïí=”rPºþ—§¥duõ—Ÿvz{Nël;—a*CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturec70387830aa4ecd5a4a32a852283b3d6øP¶tEXtPage24x24+0+0r[ 1IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/note.svg0000644000175000017500000000333312007570374020177 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/0000755000175000017500000000000012007570374020335 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/8.svg0000644000175000017500000000230012007570374021220 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/19.svg0000644000175000017500000000225512007570374021313 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/8.gif0000644000175000017500000000162612007570374021200 0ustar renereneGIF89a çÿ  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ùþ, sý l%%E)¥*T„ s(Ò°”7k½ ˆá¯TC%÷4ž›ÓCBB"x·¦a Ô:wAC0h¹'E Ë›'KõjØjèFæ¼3xŽPIP:÷Ž’MŽOÆ QaG%!BI(0 ;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/4.svg0000644000175000017500000000141712007570374021224 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/27.svg0000644000175000017500000000207312007570374021310 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/24.svg0000644000175000017500000000215112007570374021302 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/30.svg0000644000175000017500000000255312007570374021305 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/2.gif0000644000175000017500000000161312007570374021166 0ustar renereneGIF89a çÿ  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ùÿ, hÿ ¤”„œ*Œ@Š c,ÂÚ¹wÆ È¨a)kïuÀˆ!É= ½ÕŠˆ ¡Ë÷æ4DÐÒ¥’sµj"0IòÊ—#×Ü#††Œþ1ät®é9”ò|©P`Iš9() ;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/10.svg0000644000175000017500000000202612007570374021276 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/28.svg0000644000175000017500000000303212007570374021305 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/18.svg0000644000175000017500000000247312007570374021314 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/2.svg0000644000175000017500000000163612007570374021225 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/6.svg0000644000175000017500000000213612007570374021225 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/15.svg0000644000175000017500000000207612007570374021310 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/1.svg0000644000175000017500000000127712007570374021225 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/13.gif0000644000175000017500000000032112007570374021243 0ustar renereneGIF89a „ ///555<<CPJ‡dB4pB“ ÑÂ]¹>ÕjŒ0UcÀôô¡4¶|;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/5.svg0000644000175000017500000000170712007570374021227 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/5.gif0000644000175000017500000000162412007570374021173 0ustar renereneGIF89a çÿ  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ùþ, qý 䔄Œ*Ì EŠ)ÄX Ç¿w•HᯀŠÿ|ÉH#ÈVΉÃG‹„”œãôK!}dô®¦IZ>R:÷1†G–ÿ”„ðFi§¿ ½»W ÂFЬä¨Ð%† ;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/26.svg0000644000175000017500000000266312007570374021314 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/7.png0000644000175000017500000000053012007570374021207 0ustar renerene‰PNG  IHDR s;bKGDª#2rIDATxÚ%Ž­…0 „OV"Y!²²‰¬ìL•O¾•¬Á Hdä‘+‰H¾äò’£ší‡“ ×e _ÊÐpD—²ã„l½ðC›0T+ÈÊ«+¤® ’VA†jÝ“ ƒ{ŒO•9ølsLGÉIÉz¼ó>61¿GVSCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature298368142ac43cebd2586d8d1137c8df&9é™tEXtPage12x12+0+0„m»}IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/12.svg0000644000175000017500000000203312007570374021276 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/25.svg0000644000175000017500000000243212007570374021305 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/15.png0000644000175000017500000000120012007570374021261 0ustar renerene‰PNG  IHDR Ù˰ pHYsttÞfxtIMEÒ0 ÏJtEXtAuthor©®ÌH tEXtDescription !# tEXtCopyright¬Ì:tEXtCreation time5÷ tEXtSoftware]pÿ: tEXtDisclaimer·À´tEXtWarningÀæ‡tEXtSourceõÿƒëtEXtCommentöÌ–¿tEXtTitle¨îÒ'IDATxœu1Ë‚`…¯E`59¶‰-A´ôZ[… ¦ÖœªÅ¡Æhr ¢ŸÑ/h1A¤-§—‚"Éè6B||g¼çœËáˆ":Çã1›Í6›ÍB¡€TDDDžç5ô˜ÉdæóùûýN\ˆ8纮ëº.Ëòv»µ,KÅË墪ªeYßOƒÁ`8FQ´\.kµZÇ‹Åb2™H’äº.1"Úl6Š¢ì÷{†a0ÆF£Q¹\~½^»Ý{<×ëu6›Aà|>O§ÓV«ešf©T Óe¹X,¦“Ûív§ÓÉårq?ŸÏjµ € ‚Ðï÷xžçû¾ã8·ÛmÈ”‘L?IDATµZÇãûýÞëõ¾Ã9皦álÛN|9N§n·+ŠbbW*•õzýÃ)­rÎ]×Íçóõz=-ø ý§Ç!®¬’H¨IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/21.svg0000644000175000017500000000203512007570374021300 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/3.png0000644000175000017500000000053612007570374021211 0ustar renerene‰PNG  IHDR s;bKGDª#2xIDATxÚ%N«Ã@ 4ô†^¥´0°+ ì »F``¨a ¡+§&–ÞÓU¹¹ª² qXÒ çqî K ࢵ‚Ð]pêÁ›qðËŸø3×&”=èÛ¿-#—ùõž™S:ºbÁmìRÎ&jçüQ¸5cüëLCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature80bbda2726ddace8ab8a01f59de2ebdbýutEXtPage12x12+0+0„m»}IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/11.svg0000644000175000017500000000147312007570374021304 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/13.png0000644000175000017500000000115712007570374021272 0ustar renerene‰PNG  IHDR Ù˰ pHYsttÞfxtIMEÒ.1ã ŒtEXtAuthor©®ÌH tEXtDescription !# tEXtCopyright¬Ì:tEXtCreation time5÷ tEXtSoftware]pÿ: tEXtDisclaimer·À´tEXtWarningÀæ‡tEXtSourceõÿƒëtEXtCommentöÌ–¿tEXtTitle¨îÒ'IDATxœ…!‚p†_ð‚Å9”¯ÌÍH┢3±‰lŒïÃFâ#Ht&EÆþéït÷»ÀÝÜ]¸{òÞçˆeY–¦iUUŠ¢Ìf3Û¶A@ 5M³^¯ñ“ÕjÕ4 ˆ(Š"Y–‡ƒã8“É„1Æ›N§a¶’À9‡ÇãQQ”Åbaš&ç\UÕ^¯çyÞét’$IÌóüv»¹®[–%€ ƒÁn·«ëú~¿ï÷{âãñçy;Ŷí$I–˥뺞Ï'€Ã0:Îëõj%ÇqÆã1c¬( Qu]ÿªÛn·æóùh4êv»žçù¾ßï÷7›Í»îhª§.IDAT|>kšöëMÓ8ço‰ˆ®×kÇ–e©ªjYVÇ—Ë…¾ÚÇÿFü×ð ‘÷¬ÊäC3IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/8.png0000644000175000017500000000054512007570374021216 0ustar renerene‰PNG  IHDR s;bKGDª#2IDATxÚŽ¡Ã0  –†v…¬Ð¼‚a` × 544T¥ é?Ý»/TõÜ—¸W[Б!Dغ…õ¹[`TÈ3Ð(”fñ•põçï¹g¿ˆcµÁÙ3Á1–Ø¿.0µ”>Џú_ê³ +U­9Æäïü£Ÿ9ºFbíCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature57be19505c03f92f3847f535e9b114e9Ù4kCtEXtPage12x12+0+0„m»}IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/5.png0000644000175000017500000000053412007570374021211 0ustar renerene‰PNG  IHDR s;bKGDª#2vIDATxÚŽ¡Ä0  †ª—ðõ†~+_Bh  áýIlgvö’—ÅÏM‚áÖZmÖÃmã†Àwb$|SÜq$Ìñ^€%Ô)%¤•°ÞÔèõYP3ö]2­QÙjµ%—›õ|ç#[7/B_ûCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturefe690463379eb25e562fcc8cc9b3c7e0ß²9žtEXtPage12x12+0+0„m»}IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/2.png0000644000175000017500000000054112007570374021204 0ustar renerene‰PNG  IHDR s;bKGDª#2{IDATxÚŽ¡Ã0 D?44,5,ô ]£°°Ð+†f„¬ÐK UÉG¤{º÷u¸ÛÖkí»¹ãSàÞ@¦cB»æïSCá¸hS‰øž¤{ë2y–4Cm¬s^ö¹% Ðû D¯§+O£ŽJ)}‹:TÙ5`Ÿ/£CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature80eae529c94a7f47deccfada28acb9dfåo± tEXtPage12x12+0+0„m»}IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/14.png0000644000175000017500000000063312007570374021271 0ustar renerene‰PNG  IHDR Ù˰bKGDÿÿÿ ½§“ pHYsssŒ"¹tIMEÒ ¨xœ8(IDATxœ}=ªÂ@…O2…ˆ¤Ð¬\ÁÂìÀÙ‚ˆÛ°ÄX¤Ð"¸†Y€;@Æ)l”T!H!„ûŠø¢ðà}ååÜË=ŸCD‘µÖZ;9ç­V DDDqÏf3Çqê¡ïû§Ó‰~qXk¥”ÓéTQ‡¤”Çãñp8|.)¥¶ÛmUUËåçüõz­×ë~¿Ÿç9¹EQh­ƒ 0Æh·ÛQEàù|j­¸Ç£,ËÅb‘¦)€Ýn×étn·›¢ÛíÞïwîx<þ.’çùù|ö¡øƒŠ§’q~IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/22.svg0000644000175000017500000000237212007570374021305 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/10.png0000644000175000017500000000055112007570374021264 0ustar renerene‰PNG  IHDR s;bKGDª#2ƒIDATxÚ%Ž¡!C#‘H,‰œN^ [¶p‰\»%Œ¤${‰Ì;‹û/yI@ò’à¥l\â\òyˆSM³}ßi㎋ªŠs¢à×uœÈŒèºËÿaˆXÌ  ÷eøÚ­ÀÜvù¶G¶j…É!=£dçRµ;?Ý¢CbË kCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature386e83bb9bdfba3227f58bb897e2c8a5Ÿ+ tEXtPage12x12+0+0„m»}IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/3.gif0000644000175000017500000000162212007570374021167 0ustar renereneGIF89a çÿ  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ùþ, oý ¤”„œ*ŒAŽÄX‚7kÞœAèsÎ!€ðoÍGF +¦¨XòcŒˆ´:g &˜sŒ¹g²aJ-8«å2(£w1r¼#tÒC­îÝkq¢À• cZUˆrd J ;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/13.svg0000644000175000017500000000224612007570374021305 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/15.gif0000644000175000017500000000032212007570374021246 0ustar renereneGIF89a „ 333999AAANNNTTTeeekkksss}}}ƒƒƒŒŒŒ“““™™™¨¨¨´´´¼¼¼ÂÂÂÔÔÔÙÙÙàààíííôôôþþþÿÿÿÿÿÿÿÿÿÿÿÿ!ù, Oà'~–4èU,à ß€$@Ó,¯¸,4là" 4(ÄFq‰X‘‡ÁQÐ" ʨ¬ÀX&—ÅpDhµr" ¢5ˆÀFË} ;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/6.gif0000644000175000017500000000033212007570374021167 0ustar renereneGIF89a „!!!)))111999JJJRRRkkksss„„„ŒŒŒ”””œœœ¥¥¥­­­½½½ÆÆÆÎÎÎÞÞÞçççïïï÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù, Wà'FIQ ¨"0í±¶ÐeM Gír ƒË¡å`&Â!×2 Z– e*hž€ ¸,¬F ¤Ea4ÇÅ…@ÀŸ!ÀÁ˜•<ÀÌ«>Kp"!;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/9.png0000644000175000017500000000054512007570374021217 0ustar renerene‰PNG  IHDR s;bKGDª#2IDATxÚŽ!„0 GFVb‘ÈJ,²¹WX‰ä È^Y¹’kTb++#³©É{“?/ù˜YÙ—y/j†é!ÀÚRj»”Ç+“~ “àöEœ#y@„§·öà·‘š!âî¦s².Ôg±þ…E±‡íÒëOÍr /¯óŒP8bÙÒûCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature34623e5e4d48310e409b280afe247602Ô14$tEXtPage12x12+0+0„m»}IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/4.gif0000644000175000017500000000161312007570374021170 0ustar renereneGIF89a çÿ  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ùþ, hý l%%E %¥*T a r,l@É¿9 %¶¢áÜEŠ”6lUêƆ104Ôr½“¨ a2Å=F*c2ó¯gÏR(Rð’"#9†z[ãPaÒ¡R(È)1Ž ;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/14.gif0000644000175000017500000000031512007570374021247 0ustar renereneGIF89a „ 555999FFFLLL[[[```{{{ƒƒƒ‹‹‹•••œœœ¥¥¥²²²½½½ÆÆÆÊÊÊÕÕÕÚÚÚãããíííñññþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù, Jà'~$hUìð¤B°ˆáŒÇ’%)àQI(ÅÄŠ$ $À5‹‡…"x}€°0Ž*–:Œ¢ÌZ^Ô‡b’Ûí!;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/6.png0000644000175000017500000000054312007570374021212 0ustar renerene‰PNG  IHDR s;bKGDª#2}IDATxÚ!Ã0  š ú ýFa¾PXXj˜'”ú ¡†‚‚ªÌnçnöˆˆó©ºµ „oPêHÈÜl\BuNØ­«ð!‹«i`¥À°ÞûdÂÝÛ'äì× ¿ç,ÃË–eøÔ¸g¡NL©¤Lï< ÿV‘õðˆ?³s8ê ¸YCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignatured25d7176d67a038afc1c56558e3dfb1aýõµtEXtPage12x12+0+0„m»}IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/10.gif0000644000175000017500000000164112007570374021246 0ustar renereneGIF89a çÿ  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ùþ, ~ý 䔄Œ*Ì) ÄXˆ V­Þz“’Â_©ïþY¬`Ž7Œ” ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/29.svg0000644000175000017500000000260712007570374021315 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/7.svg0000644000175000017500000000134212007570374021224 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/11.png0000644000175000017500000000106512007570374021266 0ustar renerene‰PNG  IHDR Ù˰ pHYsttÞfxtIMEÒ-'<Ùj€tEXtAuthor©®ÌH tEXtDescription !# tEXtCopyright¬Ì:tEXtCreation time5÷ tEXtSoftware]pÿ: tEXtDisclaimer·À´tEXtWarningÀæ‡tEXtSourceõÿƒëtEXtCommentöÌ–¿tEXtTitle¨îÒ'IDATxœu­ª„pÅÏ_ š?‚}‹I6 ‚XEabƒ¯ad@ƒÙlÛ´ÍlŒ êÜ ë•ûñ‹3ç̜ÈÖuíºNMÓp†ˆˆhš¦$ITU݆†aTUE@DëºÞn7]×mÛÀó|EÇ=ŸÏoQ–e×ëõý~E¡ëzY–}ß¡m["â¤iz¿ß§i¢(ÛÓqó<ß3I’Ä{<EQ0Æ,ËÚ.ˆãx¿$IÒÑñ\v[àxž‡ð}·v]'Ëòo…ëºË²ì툨išËårV„a8 öeGˆyžëº~½^¢(:Žcšæa`?’þÉ,¬”红IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/23.svg0000644000175000017500000000260312007570374021303 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/9.gif0000644000175000017500000000163312007570374021177 0ustar renereneGIF89a çÿ  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ùþ, xý l%%E)­* s(TA+kçJEôתáo0ÜÓÒE¥:°¦@ ÷€Ù«aȆz½;w®–M†6 °F©aŒ–Bî…Pò/GCFþœhõïÝš†)ưÙ@ o ýQŠA ¨;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/14.svg0000644000175000017500000000161212007570374021302 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/9.svg0000644000175000017500000000206212007570374021226 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/20.svg0000644000175000017500000000234112007570374021277 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/4.png0000644000175000017500000000053112007570374021205 0ustar renerene‰PNG  IHDR s;bKGDª#2sIDATxÚ!…0C#‘•Xdee¯P‰Ä"‘\£òËo+{%leåʰ!bç½ÙÌ$ûci 1 qá dCwC‚ôèmJVàÁ$‹Ë6ïhu•œTšj~<_­Â²ä¹|ËÀù™ó㣴 KªF¾ê6Ž[ê¼ÃCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature9f82fcac9e039cbdb72380a4591324f5€»øvtEXtPage12x12+0+0„m»}IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/7.gif0000644000175000017500000000161312007570374021173 0ustar renereneGIF89a çÿ  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ùþ, hý ¬%%E %­*”CCr(Ô Õ¿‹ÿ¬ˆá¯€1œ£€Iµ<~Ì$)÷Z~D ó£µZ.œÌñOŠË8?2º‡À%#J>Ö ú1…B!.›*È))Ž ;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/12.png0000644000175000017500000000115112007570374021263 0ustar renerene‰PNG  IHDR Ù˰ pHYsttÞfxtIMEÒ.UF¡/tEXtAuthor©®ÌH tEXtDescription !# tEXtCopyright¬Ì:tEXtCreation time5÷ tEXtSoftware]pÿ: tEXtDisclaimer·À´tEXtWarningÀæ‡tEXtSourceõÿƒëtEXtCommentöÌ–¿tEXtTitle¨îÒ'IDATxœ…!«Â`…ÏÆa`R†,/É+V5¶¡¬ì¬ 3,ü+KV-¶™-³òeƒÅmç†ÝëåÞpïSÏyyB€óùœeYQÝnw<{ž×jµš$IFQ„ŸŒF£ÇãѤ ¹ÝnÛíöápX,Ãáðv»=ŸÏù|îûþg©®k˲N§“”2‚8Ž×ëµïû×ë@žç$!„àºîn· ‚@§Ó9išX.—$5)esÑLÑu}¿ßkšæy€×ë@ ½^ï½7Š"Çq„I’4($W«U†Óéô~¿†a€ªª.—Kžçªª‚dY–³Ùì—'ð^E(IDAT‚~¿_Å·’RÊÍf3™LLÓ´m; C!¿PÞÆÿ@ý·àk«uˆO4ºIEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/17.svg0000644000175000017500000000154212007570374021307 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/12.gif0000644000175000017500000000032212007570374021243 0ustar renereneGIF89a „ +++222:::DDDOOOSSS^^^cccmmmttt‚‚‚ŒŒŒ“““ššš¥¥¥³³³»»»ÄÄÄÌÌÌÛÛÛãããòòòþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù, Oà'ZM²Hbú9@ÛêP eL’þD‰ ÀòÁ 4@ "<Š-šÀb¢€ÑLšÑp è‚ áj .ªOä0(40ñ¼~ÿ ;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/1.png0000644000175000017500000000051112007570374021200 0ustar renerene‰PNG  IHDR s;bKGDª#2cIDATxÚUޱ À0¿¤ô.)½Bf£té6#d¬Á”H¢(ð'¤ÿ‡»ÍÑÚXæW¨¬ 9c±A€M-!d>°0(Ï* ?ðœ/Èc}ÜÖ®5u„‰ÆŒ:Àx,ìÁT´CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature58a072e070da22f6135cbd3e414546f9hj!ítEXtPage12x12+0+0„m»}IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/16.svg0000644000175000017500000000232412007570374021305 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/callouts/1.gif0000644000175000017500000000157112007570374021170 0ustar renereneGIF89a çÿ  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ùÿ, Vÿ ¤”„œ*Œ‚ c,l€‘3Š5TrîÞEŠŒR,õ1"Š8•tx’¢J”D6|‰Q£Ë•ŒþÉdT £Bˆ(HTø/$9() ;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/important.tif0000644000175000017500000000374412007570374021240 0ustar renereneII*6€àP8!. ‚BaE²XØDDb‚´.V…ƒälv:2‡h`d²¥UDÂýKnßk[;Ò»?0n!¿œqCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturec42b7d2d564aab588891979703f02b45Oß“tEXtPage24x24+0+0r[ 1IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/important.svg0000644000175000017500000000233412007570374021247 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/warning.tif0000644000175000017500000000370612007570374020666 0ustar renereneII*€ P1àÈa„BHd Râ10Øl9 †ÀÄAa¸æ=Š"ñ‘À¤+JG"€¼b) J%R‘@f\<IåAÐxºU,Œ c’¡ ™Hbã &>€@“éø„`™ŽC@ c3„êȘS£Ö½db‚ë6Ë$Ìfƒ®v*Åd ^ìu‘È(Á_fb0mRUt¬ŒÁ€ŒE€ 2ÅJCUôÌZ0è Ê…á1óC£ƒEZ ¾¶8 𒑦^:n·c‘xBoÜl+"ý¬go¢Œú=1˜·}΄>çw¸ÛA !)1BJRZks{„Œ””œœœ¥¥¥¥¥¥­­­µµµµµµ½½½ÆÆÆÆÎÎÎÎÖÖÖÞÞçççïïï÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{RZ{9J„”¥1”)Œœ¥µ­µÆ))ÖÞ!çï÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{RZ{9J„”¥1”)Œœ¥µ­µÆ))ÖÞ!çï÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿKKþ=@hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/home.png0000644000175000017500000000275312007570374020154 0ustar renerene‰PNG  IHDR&@lnsBIT|dˆ pHYsŒŒçg™tEXtSoftwarewww.inkscape.org›î<hIDATX…½—kˆUU€¿sî¹¹ÞÇ<ÇÑÑQC3-6v†ðU ü6˜`$Ÿî*ì6uõä¼`šaޯׅý ÛzÛq\—‚+¸Ï20‘Åãx=¥”/—Rž+¸ü|eœ¢ëN7µ=¦®ž˜L3¬—¦ qo+Ñ@éì[7ÜLÙ¸å;ØÚâ¥#èc‰ÏCÆvÏÚŒgji»sy˜žh ×YþJ5Ú‡˜ºZõ]Ó ë%à£é3–‡ý¨+JUb(™ÇŠ%xe¶ö´±¤œÚz‰¥rœž¤à¸(²Äƒk;(28s5ÎxÖn𦩫G \`5Ãzø°‘e%Rý7k»½§§µ!@w8€Ú è Î —æI@WØ7ÀaͰöxúWïÚ|Y®íôzp\ÁÅÑÒ+¯3ìgMk°äØ ijüU ù=H’DÐç![pHå‹dl‡µíAdIBƒ‰Ü\p;ͳC¿*”:„Y+zÔ¯0QwÝÛ뢨x$òE‡±ŒÍXÆ&]²ai€ea?ƒÉHå‹´¶x û•ÙÞãÀ5à:°FöeuO'Ð(HÒ‹@¸þ¦òSß(—…ñy$.Œf¸žÈ±¾#„$A¤¼)€dL‘%º"¾ç‡’ö†€ë¦®fê×TL]µÁò3CŽº±x¬-X‹R©…§Ø­ë‘+ Æ26’TÒÙNm7rE l]ùvÏ“= ýUí炳Š,U«zÁq¹‘œyN6u…émo©Ò$sµôGÕèìÙ67TS`²$~ªüÞØY‹Òï±$}C)lG €±LËiþ͸£é‚p\ÁåñRv$ BµlÍç@™Ï@ß¾ò‡c§nœžêŽø¹™+Gk0‘e0‘>ÅÓ?œ sI@d ް*ÚRKe9óIS¢ìÊûQ€-ÝÖ´gµõ+2[º£ÜÖ¿×mñz¸½3TÎ;é³f|6ÝZ§cOÁW ¼ù¢ËÅÑI’ù"¶#(2]!?«[[ðÈ¥è¤m§˜-8é¥K|år$Ü»½ûíÿ àÓÓƒª$ä/$Ä]óÙŽgmúb)YŠmïmó Y´WÜwäavÓ¥éž`ß+­hÛĽñH±Y̆Sùãg®ÆE¹òwŸ¾ÏÇâÙƒÍBÁ"?x?ÿqd¹ëuîv…»Nâ<Š8»w[Ï8€fXû(µä•vxÈÔÕk·l>Ñ ëJ_êéTSWg4eÓeA©\¨˜ºú1°¿ü7¼Ú ÜâˆU¤ÜÊüiêê÷ÍÎùð Bø_8(IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/annot-close.png0000644000175000017500000000031712007570374021440 0ustar renerene‰PNG  IHDR oó‘G pHYs  šœtIMEÔ 0ÜT€›tEXtCommentCreated with The GIMPïd%nEIDATxÚuÁ ‘8t7 cûÀÔc_„ƒ#ŒªŠOfDxÉTåÝ.6Ð-’Ҥƻ?]¥í‹iÃñ¹çòóƒ{< !C-ðvùIEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/prev.gif0000644000175000017500000000213612007570374020154 0ustar renereneGIF87a&'÷€€€€€€€€€ÀÀÀÀÜÀ¦Êððûÿ@€€€ÿ@@ðʦÿ€¤  €@€ÿ€@@€ÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ,&'þH° Áƒ*\Ȱ¡Ã‡#@±¢Å‹3R<àŸÇ CŠùƒHª\YÒ$JâsY€Ç˜ñÑ$À#NƒøvNôø³ >¡xŒ¹‘ >¤xŒ¸ñ_A|Px|ØôÀ¿‚ø²zlØUà¿‚øÄþ[Xvà¿‚øÔ&lKð_A|rQXø¯ ¾¼4üW`º ÿÄøÄñøÏá¿‚øüÇð_A|€ þSø¯ >Àÿ!üW`…ÿ þ+ˆ0ÃÿÄØá?ÿ â ÑcA|€‹ÀX9>ÀÎGð>|øðáÇ>|øðDáÇ>|øðáÇ>|ø²âÇ>|øðáÇ>|øàƒ>øàƒ>øàƒ>øàƒTQi$ᄈ)§œrÊÅ;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/prev.svg0000644000175000017500000000202012007570374020176 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/draft.png0000644000175000017500000003742612007570374020331 0ustar renerene‰PNG  IHDRŒ¶K°ZJ pHYsÊ&ó? IDATxÚíÝÛv㸕€axíJVÞÿ³¦K²xæb·µËå²E€Éÿ»˜Õɤ]eùðkƒ ¨¼÷陦)Ïó#¿šo@‚º®kš¦ïû#¿†ï@‚…nÛvš&ç\–eEQ0IP¡³,DZmÛÃÎÓLÒ€D -†a8à<­Ø8H¶Ðÿ›))˲,K&i*t–eã8fY¦”:ÔŸé4‘|OŒëÐtšHzµpÒi" H±Ðt: å½çU€‹}ú³Æ(õòòb g1I>š¡Uhæi&i@Š34ó4“4 ÑšyšH~[褢H§‰4 ÅBÓé»qMv%‘ëп­×§™¤€B§‰yšHÀ¥³Sì+†/‘€£ÌÐO½÷2" ˆUèï®rø꺶ÖÞýèô—^g–»àh…þÊ^î/F”}dD(tKV¹éôúXî ½h._ç|ïcî÷f’€äüõ×_ÁÓ…fžf’ t¡oçé¨ûÈ8OiHÈÏŸ?7WèÛN—eɺ7‘€}zסÿ8OÓi" :¡BÓi" :ÝBÓi" :ÝBÓi" :ÝB¯ÜéŸ?î¸ÓÜ' :îŸf’ ý¿ù5Bg<šI(t‚3ô¯ót×uÎ9æi&iHÚù|>N¡³Ï9Ùßõi" «rÎ?>3åBßv:ö>2¥ÔÎÖ½‰4¬ûkWkcL]×J©ƒzÍNgûº>Í5ix€išÆqlšfáeÚ­zÆ~o&iH]žçƘªª–Äus…fžf’€CÌÓ[,4ó4“4ìžNí~hæi&i`žþß ]UUìÂ1O3Iót.û½¿2Ï«Ü[/tÆùÞD¶ÕéÏïËÚôuèÏ;õ3ÚîýÓ,w@*¦i†¡mÛ×½÷Wè[MÓÄ^÷öÞÿøñc[ëÞDÒêô‡×§wsú±Î¶v}šåniáá$î÷>B¡³,«ëšýÞLÒËår‘‹¬ Ks;O¤ÐÌÓD"’§O†jªtºëº<ÏSh:M¤ V¡åŸCuÚ97MSžç»Ü)F§‰4¬]è°öÞ‡zXÞb§‰4.tØNfw7„/t–eÎ9¹é9vcvŒýÞDšN‡ítì«òÉvšH@”BÓé€.Ëò˜ç{sMbúó×§[çúôóósQLÒ°Uçóù[…fž5O¯p}úr¹ô}O¤`«…¾oQ”N‡êtìëÓIušH@ôBÓé€.Ër…}d‰tškÒ°F¡ÿ÷kW©¢(¸>½Äq®O3IÀŸÜúë½gž^>Oäú4‘€?ÏÐßÝ)ö9çÜ8Žã8²–I§‰4,*tðÛg•RÆcÌaÏåØé}ï#ãš4¬Zhiš®ëœsQÿ”G]Ÿf’ ½íyz…óȵߛH…Þ|§c_ŸVJ=¤Ó,w…Þƒ]Þ—Å$ šyú«VÞGÆ$ ÿóÝ'gPhæi&iXi†¦Ðû˜§ws_“4ü]hV¹™§S›§™¤ Ö‰%šyšI˜¡±ÏyšI…_hc …NdžÞô~o&iššy:ÑyšI…¦ÐûŸ§7z}šIÀq?4óô&æi&iGœ¡)ô1çéÍ]Ÿ&ÒWhV¹éôV:M¤Ph M§í4‘@¡)4N´ÓD…¾¿ÐܽÑN—e¹‰NiúJ)cL]×z‹ªªÚD§‰4 }Ï m­¥Ð[ïtúëÞD…þv¡™¡÷!ýëÓD…þV¹÷×é”×½‰4 ýB³Ê½?)_ŸæXP;éÔOfèkÛ¶ëºÔÎ e’°ÃšBcó4‘°·B³S »é4‘@¡?ÃN1:ýÀNiú³šbìt:÷e±q …þm¡™¡+‘}dLÒ(4…Æót ëÞD…¦ÐH´ÓD…¦Ðøm§{}šH Ð¿õØó½Ù8`“8S kzÔ>2&i›œ¡ƒšû¡ñ‰G]Ÿ&Ò¶WhžœƒtšH Ð‰všH8t¡9S ivZ¾Õ‰4€CÏÐ\‡F‚6Æxï½÷†—Àagh »;eY¤ýÞÖÚ²,­µJ)&iHež¾-tÆr7 ÜÝé°çœ¼+tÆa&(4°D¨sN~-4“4 ,§—¯{Xh" €Bîôï M¤Pè½™¦)ø«‡xþ¤ÐY–q  ½ã8Ã0 Ã8Žu]óí´r§³oÞ—õy¡‰4 ½·B7M“e™s.Ë2:r§ÿXèŒånz…–Hw]7ÿG¬Ù鯬{¥ÐLÒ(ô }ÛiæéGÍÓ}ßÿîª_,4‘@¡÷Yè¹Óò<%:ýNËWçîBiz·…Ó4Ñét:ý­Bi»-tUUzî4ëÞ)tú»…&Ò˜¡w^hÁº÷Ã;­”ún¡3Îî@¡w_èYžçEQÐéõõ}//ÿV¡‰4€½ºª*cv¾Fx_¡éôcyï¿[èŒû¤Pè-úz½Þ÷¯Ë>2îŸ^ß…f’°‡B+¥¬µÌÐßzOS–%ótú˜¤Pèͺïû»gè[²ŒyšH…6C·m{ߪé¯X÷&Ò@¡ƒ:xP§iš¦éwGW‚H Ð÷š½Ü c¬µ»‰4<`†®ëš½ÜK ]–eY–|‹¦ŒÝÝ6Yhfh Í$ Éšû¡)4‘€E.—KðBK`µÊj/·ðÞSh" €B_äqÁ9ç´Þù/®y•›BƒkÒ6Sh‘çùËËË^Sé:´÷^ž“H¡™¤—sN)µ Ó4Ïgç…þ: M¤ ÓZWUe­¥ÓéšUn" ËóœNShitz¦Ð ÒÓé°[”÷×iy¶…‘ð€NEA§?Ÿ¡Û¶ ûaån«¢((ôÖq €¸¦ijÛv†¨Ýâ}Y¬rƒI@ó4×§×)4'–i ÓKÿªœX‚¯`¹ÀzebÝ[^vŠIó4…‘:M¡A¤ÐévZ ün+ ½o\“ð˜bêú434˜¤0O§8O3CƒIótŠót¼Kä…f’€¸óô^Ï •û¡cÌКI˜§}^²Êü×,«ÜLÒ°ö<½§ëÓDN±ÓDN±ÓqM@BœsMÓl÷ú4…‘@§Sì´ÜmE¡ËÝû­¤u]×›[÷žŸ>I¡A¤Ðé„:éÔOï=…&Òn§Ó?ç$Þ©ŸÖZ }p\“®ô¯O³S DŽÛi­õ?¾Ûi ØXîö/©U®O;ç¾»îM¡A¤ Å}dóN±à…ÎóœBƒHØX§Óy^VÔçCól+Üâš4€ÍXmÙóósžçŸ:Æ*wQUUñ…“4€MÎÓë¬{_.—ßD*´÷^V¹)4˜¤ìažîû>꯯_çéH'–dì“4€ÍÓEQ¬0OOÓ»Ðì“4€}ÎÓë\ŸÎ²ŒD’ë´Rª,Ë®ëØ)" ßîtìëÓ1Ph|פlùWØÛõé¨÷OSh<ì[…—À:eYìuo &i¸³Ó±ïŸ¦Ð Ò°ÛNShit:ÅßlDN±ÓDRì4…‘€;M¡A¤àãN?öþi ¥ßB¼vÜéìq÷OSh0I@Šó4…‘€/uzåsC)4ˆ4¤Øi ßN¼Òél•ëÓÆ &iøv§W¸/«ïûišxÁA¤ ¹N;çÎç3‘€;;õú4F(Ê{Ï«àPœsMÓľ>­µ~yyÉóœLÒðíyšuoi ÓÀ=Xîp\ι¶mû¾gÝLÒÜ<]UUQÌÓ Òn§Ùï±Ü ¬{ƒI’Ÿ§Y÷‘: i`kÆqŒýÐilפ„\.—¾ï‹¢ÇJ6xYV¶Îõi¥Ô?¸> " l©Ðó4Æäy^–¥ÖšTï²Óì#‘6Yè[eYcä™Qo‘ðBgYæ½WJYk1eY’êušuoi`«…¾í´+Ö±¶æii€Bÿ¹Ðbs‘b¡ÿþéUJk]…µ6Ïsë­wšuoi`'…¾å½¯ë:Ïs¬©5‘D¡gZk¹kKžÁøF;ͺ7ˆ4°·BߎbY–UU•ç¹µ–ÁšNƒHøª×××®ëÖù³äkÖÀé4ˆ4€´ -wmi­•R2X³¹ŒNƒHx|¡?$©f°¦Ó ÒÒ*ôŸÏ[ÿ“SPd›Ëè4ˆ4°Ó45MÓuÝÂ&ëÞu]Ëb8©¦Ó ÒÀæu]÷úúzç§RÖÚtï½—BËY(ì§Ó ÒÀæ‡éëõ: Ã}Q¬ªÊÓ¶­÷>ê¯ûï’=eUUi­Ù\F§A¤­jšF*{G¤1§ÓIk= Cß÷Ó4¥óë½—uoIµ<tDØïýÏŸ?ï»KX–¥RÊ{ßuÝ0 ã8ÊyaI ÖÆÙ Îæ²_;= CÔ›ñ”R///tšH¸'Ò2Lßý^^^æ9U"}ßhûÓ”«Ôu]+¥ó4ˆ4° ã8þüùóîÝóôôt{n³¤ºëºiš[çm±¹lÍyšNi÷ÓMÓÜW,O‹¢ÐZßþÞϲ¬išišR[—¿ŒÜ`-kà<‚NƒHéêûþõõõî·_‡é9‡Ó4 ÃÐu]RÛ¿oßacäHðƒÇƒëÓ Ò@ºÃôëëkß÷w„²,Ÿžž~÷ÿ•_ý]×¥v³Ö%TœN§ªª¾ò¿Çqš¦O+»MµµvNõ¡kæii 9Ë2­”z~~þâñ^’g¹*;ÀS;eþ¤ä~-kíqež‘’#÷b-ù+g}w‰Xnª^r¦Ê ƒµÜfV×u–eGX§Ó Ò@Z†a¸^¯K†é<ÏŸŸŸï˜8½÷²§LªìÀªµžïÚÚýø:βìÇtšHøó/åëõÚuÝ’PÅóóó}•Àsã8¦ðx÷eåy.»£‰4€ß’ì]¯×…!©ëz¼¢6Ã{?MSß÷rÑ:ñþi­«ª’-f‰¿«ø¼Óa×½)ô¶°Ü <²"yž/Ç0 òtЏïèßXk%òˆ­dßèËýßóÓ;ä®­m¥z^÷õ(3 Í$ à{^__—œ*¿ÁŸŸŸ%Bky²ô-›ÀÿM"§•ÉVpc̶Rjž¦ÐDÀ·ÿÊ#7ÎIòÔõOÍ”»«Û¶•»«Ó|æmª³›#ÁÿÛ†í´Öút:QèÍa¹xp6䯡…‘–››×ß'%œl·ÖÊ&ðdßúË_¬m[¥Tß÷ò¬-¥TúÝZ¸ß›šIÀ¢aúr¹,}ÇmÌ?û¹8ç¼÷òˆ-©u⃵ֺ( ¹¢Ÿþ`}ßÙï-G­Qh&i!É Y²Ój‰Ô®Lø™ÎØJg™["]–¥LÕ‰ü…§µÖu]Sh&iÉĶ<ÒòH¨”GÏØ’õùad !ÙT+¥ä#rźª*¹Á=µyšUn&iMÓÔ4M×u sUUÕétÚÐg-wWËÛ‹Müe¸1F6Ç=öí…ÌÓÓ4EA¡‰4€ˆ‚Ü‹¥µ~zzJaÔû:Ù\Ý÷}×u)OÕså÷qåñ—›{J•<`[â)Ç¡0Ñ‚HûŒtQòD©…sžLx[ Þ0 rau‹×àäE–TÏ›Ë´ÖÆ˜Í½ç@ZßZ\“œÌš¦iÛváDZÖ>??o¢›.ôネö¬gj0I;¦åúâÂ!lǮ몪J¿ÐrÏôξˆ2X÷}/¯–³Áùö“4À0ý·¢(žžžRžáö7Cÿ®Ùr×– Ö¬ƒIØüïô…ÛDz,ëû¾( 93Ùz÷…ÎÞ†A"-wm±¹ LÒÀ†­ŸÏçå‹ÀeYÖu`2CH–¾åHpk0I›T–åò† Ãàeéà3´œã±• ÛÎ9yʈܯU–%ƒ5˜¤™¦ér¹,<)Sž¯•Ô•éy§XÀBEQUÕ4M²WKÎrÙÊ:“Ë@¤|£¯}ß_.—…}Íóüùù9‘ßþRèaB}À¹Ð2‰Ê³>»®“[–7ôµÖZ[k1EQ¤ó -iŸ%íz½Žã¸ðWv]×óã’v\èÛæÉC«$Õé~KžÛ!O c°&ÒDHÚëëk×uËïŸN§Çï£ÐÖÚÏ·ÅÉ1æMÓÈeà }ÝåÀ²ªª8”ûÈøÚ©“íc ·DÉã0Cÿú?“g‚É#¶ä€‘M|Ýå]…<%š¥o" ݉jùïh9Åó-ÄóÝV+úÝkx:Æq”‡v{ï_G”­dÆ M¤$麮—ï…–‡5YkWþ¥ü~èïZÈgmÞÈP2ª¦ùE¯ªÊZË}YGÿñç%Ò'§y/Œœ¬÷®_èà÷CßQè_‡TyúHUUeYf‰=ý"Ïóº®)426Ž[ÑuÝò{±”ROOO«šÈ ý•†išº®Kaª–… " l‰sîõõuùÆ«ªªêº^apŒwbIŒzÉ%júxwµ\‡¦Ð ÒÀÆHBš¦Yú3¯Ôóó³µ–Bÿ.Õr­ZŽ-[sœBƒHÛ¦þü¹ðN*¥”\ˆW‚ú–,ÑË`½Î8…ÆÇßü¼À†È‘ ‡Å¨ÛÇ‚Z)µr¡%™rüËÓÓÓ Ç‰Ph0I{0Žãù|^~/Öét’Ç90CÿñµRJÉ(² | œBãÜ' l‰Öº,˶mΦã8:çž ½ú׿C–eƹkË9'kࡎo£Ð ÒÀ®"¤¬}ß[kFz3ô¯µÎó\kýüü<ï,[xl…‘ö¦,˾ï—ß&4 C¨N?ê\îG Ör£¹µv>aôîB?ê ViQxïå‘KV\•RòÇåƒÏ3ôî ý.Õòìgkí0 òL̯×z.4O¢Ä~x €m‘u× {—Ú¶]¸:½ûUî¯|-ʲ|zz:NEQ|åu˜Ïå¦Ðøó÷»»-Ó}ß¿¾¾.ü8yžËC¦ïKþÁ ý+¹©Z¦êq?|U9õßÂr7°ÉaZ“îºNŽÔ¸o,–yZB%3eö¶êP/æù|^xz¶÷¾ªªªªnßîPh€I‡‡aCæTKV\«vÎ Ã ‡pÉ©‡º!Õ{oŒ‘Õˆûß°+Õ÷ýí$M¡&iˆ\õìºN"uÞ-Šb^¼=Â`=Žãù|^øãì½/ŠâééIkM¡" вXJ\m·—}³û©Ú{ß¶íõz]øÂæyþôô$BDû'anšæ!·QÉE뺮ç'ìUß÷—Ëeù ¹®O¡"ý뺮뺅{š‚¤Zn)®ªjÇÃôõzýʱ$k¢ÐÀlC¬`ȃue€~øUaï½<åWîÝÊó|—ªå^,Ù‹—Ä …˜¤‘\¡û¾ïû~ùÍ»1ÈUê²,÷×içÜåryøº34À$t Ý4Mß÷éÌsïÈÞòišö×­uY–)DšBa~”x 0ÏÞûËå"O¹O|â”mVròèž¾ )Ü N¡PXîF°ì ñï&ít:i­÷tVÓ4MÓPh€IȲ,“=brgíæþærwš¦Ý|9äÀ5 i Çñz½6M³ÑÎÉEô=uÚZkŒY‘ŒBDÉZèÄ/BÎ9·³N—e¹òÉ- ÒHË0 ×ëu†ìlØY§åœ5 iTß÷òxÄÝì=ÜS§ó<¯ªj/ '–DÉúr¹ìïórÎ]¯×}Ü—•çyY–±?­uQ Ò ÐkðÞ¿¾¾î#Ò±÷x³Ê i¤¥išzž§Ïçó¦·Â‰²,å‘V ÒØ?¹Õ꟩\ŸÞú<­”Š´Ç›ëБFr…nÛö Ÿ¬<5«ëºMwZ)ã9"J)®CDÇ-´~û¦û¾ßúöuétÈ_ìVÄS°J¡¥…Zkùí¯”ÒZ{ïsZkçÜ4MJ)çÜjwã8 C¼Ëºk¼ ×ÚŠz:¹¼IDAT£T˜Sú¹ i¨ÐÞ{‰qžçù·gqÈÿFn‹’UhyФô;v°›¦ÑZWUµárcŠ¢èº.È\N¡"CZJ\U•1FΚþð·¿dx¾›ÈZ+SµŒ¹Rë¨/Â0 yžowž–aºïûå/”÷¾ïûM¿e¶…GUâ…VJÉQyžß½ýX¾uåá˜}ßÇ{¼÷OOO›.“<ç»ïûå eYžN§5ψ4°^¡åM²ëxùïzYïû¾ïûaâÅã_ÿú×vŸ9-/Ñõz òóþòò²éëôÀ†°Ü Ý4MØàyïóÙ`Ï @¤±j¡ÃæÙZ+›ŒV¾~iŒyyy û‡zï»®Ût™¼÷²£>ȺÂÖ×ÿ"-:ì*·ï|:Ö ?ìôóósÀNËh¾éHÏçÆ„zËB§"•fè€ëÃrm¸ªªÇÞ³”çy]×a'ÑH»Ç×û×:Èk"gÀÉ1püD›™¡1u]?¼ÐÙÛƒî÷–2mýZ¬\†ò¡Ú¶ÝÁS·"£ÌÐEcL"7ÑÊÙOÞñqÓ_ô€Gœî`i ÒHºÐagè¤ =ÿ­äÖ¯PYšÿïvYkƒtÚ97 ‘ˆ4R/´œ•‘Z¡EQŸ©õœð•~ìm˲l𦼠‘FZ…Žq:ÍBϳc¨¿›<:sÓßòÄÉPÛ¼åÉ¡üXDÁ ½ãëÐ6ÉZ›çy…YyJæÖ¿ ¼÷EQù6hÛ–HDa ½ïb+ÌŽû¸ïHŽf õѶ~Ì @¤‘J¡~À­zîtw'òqvÐi¹=È "¦²ƒ Ò Ð÷ÏŽAš$·Joý²tzûXðg› Òú(…ÎÞÅ\þÞSŠÊ² r/– Ólóˆ4(ô¢¿y¨HïciW¹äm‡snGV¼" ½(± Câ½ßÁîîùÕÈó<ÔÚ@ß÷»ye" ý€&ÙÒjZ äš °¼}á4o€Hã…NùL±¯ÇuùeéfòëW6È{ï}Û¶¬xD˜¡?Sìë^ú3£u¨sQa­ x¼y×ut ÒXµÐ[Ÿ¡o»°Ór˜Éž†i|ÈäCÉ=ÓüDúÎ,ùw÷tAz^]Èó<ÔòÀ0 ]×ñ“iPè;›”HÏ’zMªª u¶É0 lóˆ4(ôÚ“tö¶µ{§k…Úúže{¼" }çÜ’~Èr÷.¯¹æyäô1y•š¦á‘‘F”Bïàn«O"½ä“’åîý½,ó;³P§„r@¤k†ÞÇÝVNxÓ4-Ÿ¤÷ú$‰€—Û½÷]×ñÈ €HShV¹¿QŽ…wOåyð–âÉW?ȇÇ‘mÞ‘>®¦i(ô·ÈS&f~÷ßWß…°ƒ ÒÇ-tÓ4ú»cô’HË3£öúúüýAkkm¨÷"]×q/@¤)4…þj3–7l÷×YeÛ`¨Ö÷=Û¼"} ×ë•Bß7/\z {Æu²ä†éPß Ã0°} Òš¡¹}÷H·déÕ{¿û—hVE¨ícrÏ4÷bDú…f†¾Ïò-cJ©²,3ZkC}²Ó4qÏ4@¤)4…þ¬K.H{ïó<ßñÒ¿¾#±Öj­C=rƒEo€HSh ýÛB/_q ¸¼•NÜÊ.æ ÒšB¿‚å”±%“œµ6Ô¹ÖŠt¨ï¥Ô8Žý…{ì"„f者Þñó¡?1 Ãò$TUu´-c·ä®³€Ï¯ ò¶ Òxp¡~À?ú]×]¯×å/]À3=6*Ï󀧸 ÃÀ#7"½áB/OË»Ìs†²á.àöæmÿšÐ:àëÀ#7"½ášëÐË änYàÛR^Š€¹Èm뼪‘f†>\¡çÍb ¯¡j­uR÷•eªÓι¶m¹ ÒÌЇ+ô8Ž}ß/€ÌŽDz&ÛÇB}(k-‘ˆôAgh¥”4}¨B;çÆq¼^¯Ë—RåØêÃÞvõ»×¤ªªåïZ”Ru]Ëí×¼ª‘NœúvbóÞ;ç5©È§ê¹Å§ÓéPÏÒøÖ{— …æ ðEü&zð öÔÏY×u2©ä·¡÷þõõuù í½—ú÷MÞ{ùïåq·oä?ÎÿåüPËù_™ÿaÃïèµ–K÷½¢Ð‘Þ’®ëÂÞý.'óßýïDçÜårY~W÷Þóë#)ç• çœlI›ÿ,ï½÷^Δ¿Ožçò_*¥´Ö·tåäÿµ¹lËãwœîI¡"½±ÉOæ’x;¤ÓRèP/cQEQÌaβ¬ï{i³tz"ßÍÍó/ÿüë;éñm³å‹"oä¿LÚ–çW~÷8t ÜÿCÇËvzǶm‡aˆú[uǿú,˺®åë2Ÿ2½ðAÔŸ|õç6KªµÖózrÊÍöÞÿüùó[ë§Ó‰BDšNë·dØBgYVUÕ8ŽÎÁ+|'ÜÎÙ’j™éç'ly˜ÕõzýʯÙ~ä'” ±ÜýзHJÉ ÍY–EíôþÖ½ƒZ^¥G…pþse]Þ%È(/‡‡ËÁœ·Ïºxà_õëßE¬rLÒ;™§›¦‰úà=­{Ç(tÊß2OÏûä44ù²Û¶ýüæ~®CDzoæú4…þã÷‰\«–¯ ì!7ÆÈ=c2d¯ìa®×ë'׸ Árwï•VY÷ÞÁ~oçÜù|>ì3”æ¹YVÅçýçò›-ÁŽºõÌZkŒùð Á 0I3Oqž>ò ý•ožìfÝ»( Ùz&wcË Üƒ-Ûë.—Ë»d(4À$Í<}ÄyšBeÈž¿Ä2^Ëÿ½½¿Kkd뙄_k=MÓüq(4À$Í<ìwú†î9ø*wÀ![ž@%_ýù@´»ƒ= Ãù|¦Ð‘¦ÓQ:½‰ßªÞûóùÌ êÅœk=_º–­gw ÙÓ45MÓ÷=…ˆ4Ž"ñ]¸z¥_JI¤å†ììmëø·žÉCb(4@¤éôáæi ½þ=WYù,kãó&¿[ã=E€HÓéCtšB?<Øs•o‡lY÷d‘­?… Ò Óßû¬¿ûDýrÜ–X†lÙu(ûÎDÂ-XÉ¿:Þ}Y2CS褾 o¿:Ã0Ü>m‘¦ÓGé4«Üé7Îë.ŒÑ‘Æ:M¡7ñ­È^n`5¼Þ^§å™x™¼^¯Ã0<ä™Ê:ýoBù¤Ð“43OgxþôC -7;çdÙöv{Ô|$µü»—™¡"T:½òº÷:{¹å¶"yH”\OõÞËÝD·÷ÏÿÑ9çßÈßmGùÇüÞc†ˆ4×éØ{¹¥Ä²N›e™üóׇã9É’my¤Ä4MRn ù8ŽQŸ ™Â·Ü†NzvõÓÇ}Òµû§c¯rË©ÔUU©7¡&òy¤–ZËIY–É?ïlà®ëšBD‰v:Ò¯ÐroQÆcÌj_Žìí¶snùÉÎ €HÓéÍü¦ŽWè<Ï˲”úQëÏ·¶•RÃ08ç¤Ü2mg[ØŒF¡"#v:^¡1ÏÏÏ¡V¶ƒ¥$Û2^˨-ÁNðl i±Ó‘ ç¹1æt:mb÷–[k-·¤ã(µNä0T i±Ó‘î¶’+вAl‹_¾ùJ¶ì7d¯üIQh€H㈎4C[k­µeYîã¨ygø¼õL®gOÓ´Â'H¡"¸îº®ïû¨Ð÷äD*tQ²Ml—÷(K°•R²>o=›Z ûYSh€Hãˆó4…ØìùÎì¾ïeÈž‡ï%¯…ˆ4ö3Oýw:…ŽlÙz&‹áó=ÙwüPSh M ºÇw^JÍ'xÄë´÷¾m[‰å'¿Ù)t¼¯²|îòT´yȾ½¿kž³?²)4À$#ÎÓúCö|%[H°³_¶‹Sh€H㈦Ðé|dY6§Z¶‹Ï§¡Qh€HãÁ^…NyȾ½ [ÎO啈4Ž2OSè Mؼ˜@ÊØ8v€7bëî#³Ö^¯W ½‰o ^€IÇš§•RÁŸÌH¡0Iƒy:À[àoû(4" :" €HƒNSh Ò Óˆ4¶Ûi DšN§Øi DšN§Øi D)všB‘Æ–çRhH‡æ%€tºª*y21…€T~?s,(Ä:ç†Rhø:–»ñyZþyÍNSh ÒøF§W»>M¡à\“þØü ˆÛ˜îôëÿwg–'CGÿæÓÚC¡€Iú³Ïÿ7˲iš¼÷J©išæÿfî±ÖZ)•ç¹üïµÖZki›ÖZþÅ­'gµuïišœsÓ4Í€HÿÍ9'»¥œsR )ñ»Ç!Kzoÿá]Òf2JÅç~ÓéOþ”¶må%¥Ó@¤3çœÖºëºiš†aXfåßMÀóÿáÿàvÅÛ{ßuÝœgkmžçƘyÚ¦Ó¿jšFþ¸<Ïù€ü*>Â-X2ãè½ïû~š¦yhŽNya空( ­µüsÔ?7øg±Â}YJ)¹ N§à@‘–ËÐ<Ž£tú!”?ÔZ«µ.Ër^!§Ó³º®é4%Ò2.7MãœÇ1KfÁ9Ïs™å6¦Óp HËè,Ós²Ÿ ÷Þc­•K׉Ötˆt]× ÃÐu]¶‘½Z2OWU•øæ©5;m­e¿7ì'ÒrßÔõz•[ª¶÷•PÊZ[…µ6Ù÷tÖ´“_‚Ã0ô}?Žã|ÉæÈÎóaŠ¢0Æ”e™à&ð•ïËʸ‘Þú=Žãëëë>–äNëq‡a¨ëZH¡Óü 8¦m/wãØ÷ý|ÆÎ¾6yžËx‚•ZgÝÛ{:X÷@¤·G ±ÎÚ;¹žN'cLj{Êè4ͽ_|r¥öz½ðÝ+Ð_çœ{}}•ç9–e™Ô»‡uÎ÷fÝ‘ÞL¡§ijÛ6öîâ¤Z8/LÓt:ÒÙP¶æõiYò¡Óˆtº…†¡m[9>ìhœsmÛNÓ$·i%²¡lµNó¼,D:éDÉ)%Ç,ô|×7÷eÀ#ݶí|¼Ô:-QJE!QÉóÜ{/…»÷<7˪²RÊ9'ÙÇQÎAsÎÍÿÖc_@çœ#zœNs"½“BËÇ—qS¯°ñÛ9'ç«Ði Òq ]Åóósj¤º#WJ©———¶m‡aˆjùøÆ˜ãœJ§éÇ:{ÄA%1h­çB¯Ðé¾ï¥‘éôõz=Nt‘Ž^h¥”µV ½'rB™µ6öJÙñž—Å>2Dú}¡cìå–GGÌCçþ:=?VK.Óé€è4€Íä êa&‘fh9´«ªª}mäK#ïrbÿYUUÉ:p Ÿõ:眜N'k-pÐI:Þ }„BgoWÙeµ v§åaÌ)tzµuo®O8n¤#Ý=? ùP_¤Õ:-—ÃÕiù|é4€EšUîž&‹ôGxïÛ¶•CÐŽÓiYB ÓŽi IY–•HVJ9纮SJEqNgoKýtÀþ#M¡£’vFíô0 rüY Åb¿7"M¡éô?ºØuÖZ)•ÂsJX÷@¤)4~ÿÕ4Æ$ò019µf…yšNHM˜ÇQPèõ;-üŠôñ½÷—Ëe§\‘µ¶,ËØË›¦éû>©O“4…Þð<= CŒ“Âd³·<Ÿ;NÇž§Y÷°«HSèÇvZîD4ùÉ&²²,Óy(ëÞˆ4…ÞŒ¨÷eyïû¾—·éÏó¹ñ»NË_u+o,œŽqêçíoð{űäSØÛ¦Ó|Èô'ò<§Ð6éÿûßñ>º mt:J)­µµ6ÔòFعðHgYöŸÿü‡NèK®uY–¿[¹ 6i:}4yžŸN§P_Ž íñ€MFzNG½þ¯SJåyp{sðb²w'ŽÅîô0 t:rßp%7Ló’@ÜH3OJÀÛ¦™¤`HÇî´sŽyz‘†=Þ°F¤3Ö½AŽ„ u/_MX)Òtú(_~­1A¾ }ßs#¬éŒëÓLjtƒM”RÞ{¾”°^¤3®OïRÊä^,öxÀÚ‘fžÞ=cŒÖzùëïßð’Àz‘fžÞ½¢(‚ÔŽn¥T]×\"M§Ã|j]×…ú€u]³©ˆ4 l¡‹¢ Ð@¤étmÛ^¯×PM)e­å¤n Òt:­BgYV–%'u‘¦ÓKõ}¶ÐEQPh Òtz©a^‡Î²Lkm­eG7i:½´ÐmÛ†ºáJ ]EQÜ DšN(tÀãÀ´Öu]Sh ÒÉuºëº­t:R¡ŸŸŸ)4é;í½ßÄ<©Ð§Ó‰B‘NzžN¼ÓRèaZ)%OŒ&Ò@¤éôÒ:ì‡5ÆXk9_ ˆ4^Zè°Ž”ÇESh ÒtúþB7M¶ÐÞ{Yè¶ÖòDšNß?COÓv†VJN' DšN/*tðUî,Ëžžž8þR ‚ÿŠOÊÿû߈¯ReYVUµþa™˜¤™§?ó¨û§ãº®ë¢(ø©"½‡N˺wÓ4«u:^¡Ë²ätn Ò{ë´l±^¡Ó± Í W@¤étZ…–'\±R³ócïDÝG&O\®ë:Æ>²Ø34…&iæi Ò{é4…"M§Sì4…€#;Ö5é[é_ŸžŸ>ü¯G¡€Išyúþy:ÒÓ')4i:½¨Ó¬r²#/wÏR[÷f•À$âM…0I'4OË M¡D:­N³Ê ø–»?¶Îº÷4M@¤“ëtžçÞ{örˆtr–W^)E¡D:¹N3C>ÁƱ?ˆºŒBˆôþ;M¡€HÓi ÒtšB‘Æv;M¡€H#ÅNSh ÒH±Óˆ4Rì4…";M¡€H#ÅNSh ÒH±Óˆ4RìtQˆ4’ëtQeYRh8ž‚L¼çe±Ê LÒHqž¦Ð@¤‘b§)4i¤ØivŠ‘FŠf§€H§Øi Ò)všBˆtЦÐ"b§)4€H§Øi Ò)všBˆtŠ–Bcx•D:¡NÏ…VJñˆt*¦Ð"b§)4às<ªò1.— …|îÿ`uüÝÀ¡œIEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/note.png0000644000175000017500000000075212007570374020166 0ustar renerene‰PNG  IHDRÅb$bKGDª#2IDATxÚe’!’Ã0 E}¾……K C ÿtAQCACQAÁ+g“4m¥ÉŒãçoKß.ã Ÿqþ•c ¢üô D«Ô="¼ú²s ˆÇ%‚äd¼ÇœH ô1Ÿ›à²ÿy%ØM8ÓöfÈK ¢wª¬Öµ>i6g-NpÖ‹˜Y‡tL#÷ßŸÛ a–Žb;UÍ#2ÇØV} °Ô£rßVŠx¬]ÛzTîT÷1úºÜO HËè4Ý]o žíÕzÌÎ§Ïæ™gç"Ó’NþåHl¶ó§‹U÷‹Äuýœß¯–Ñä9¾<†t‘,×tÓß_‰)2Håž•÷d úkBCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature3bd747c5e45807006b090dd3e7a26c44Ó“útEXtPage24x24+0+0r[ 1IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/caution.tif0000644000175000017500000000367212007570374020665 0ustar renereneII* € P8$ „ Æ0ˆdH Âá° HV Ä¢pAx4V2Ѩܤ¥¦§§tˆ¨®®ª¡U¯´¥±¢¬¶›µ·S³¤Ä­ÅÉÂŒÀ_¶ÉǧҾÌoÎÂФԥԿ×ǾÄÂÛÓË«âÃÅÑçÕ鲨ãíÛÉäð—¸ÁôÄâ¯ßîŒÊV¯V@Gûëu0—§‡›¬ eÅ K,hŒ€é¢Ç+BŠI²¤I ;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/draft.svg0000644000175000017500000000073712007570374020337 0ustar renerene Draft hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/toc-blank.png0000644000175000017500000000047612007570374021076 0ustar renerene‰PNG  IHDR ¡kd0PLTE€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿO&IbKGDˆHIDATxÚcøÿ¿ÿ?|`ø h  Ì”ÐBÒh±àCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturef7e388dabd4ef0097714b5643fdd3cfbb†œÒ tEXtPage15x9+0+07vð¸IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/colorsvg/0000755000175000017500000000000012007570374020345 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/colorsvg/next.svg0000644000175000017500000007466012007570374022061 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/colorsvg/note.svg0000644000175000017500000004327112007570374022042 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/colorsvg/important.svg0000644000175000017500000004655112007570374023116 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/colorsvg/prev.svg0000644000175000017500000007436612007570374022062 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/colorsvg/caution.svg0000644000175000017500000002610712007570374022536 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/colorsvg/up.svg0000644000175000017500000007472012007570374021524 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/colorsvg/home.svg0000644000175000017500000014747112007570374022034 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/colorsvg/tip.svg0000644000175000017500000010111612007570374021662 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/colorsvg/warning.svg0000644000175000017500000004132212007570374022535 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/tip.gif0000644000175000017500000000112612007570374017772 0ustar renereneGIF89aô !!!999ZZZccckkksss{{{ŒŒŒ”””¥¥¥µµµ½½½ÆÆÆÎÎÎÞÞÞççç÷÷÷ÿÿÿ½½½!ù,þ EQEQEEQEEQEQEQE9‹²,‹²<EQEQEQ”Ô(ËFR$EŽ¢<EQEQ) 4MÓ4M8M²PEQEIJ#MÓ4MÓ4MÓ- CQEQ’ÒLÓ4MS´DÓ4MÓ¤4Eõ,Ò4MÓ$!‚MÓ4MÑQ-ÑNÓ4MÒÑ4MÓ4= EQ3MÓ4M8A 4MÓ4M“¤Dµ@Ó4MÓ4%ÂLà4MÓ4MÌCE‹4MÓ4M“@Q†4MÓ4Ó)T´HÓ4MÓ4)eHÓ4MÓ4E FK4MÓ4M“TP†4MÓ4MS¤PÑ"ÔM8MÓ4IeHÓ4MÓ4E -Ñ4MÓ4M TP†4MÓ4M¤PóLÓ4MÓ$”!Ó4MÓ4-EAË4MÓ4MRAÒ4MÓNÑQ”´<Ó4MÓ$”!MÓ4MSÓPHQÐMÓ4MÒ! Ò4MÓô,EQµ,à4MÓ4AÎ3MÓ4MÉCQEQ£DÓ4Ó4MÓ4MOòPEQEQ‹âHÓ4MÓN£8EQEQEAJ²@Q=вDHQEQEQEE¢(ÊòDEQEQ!;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/toc-plus.png0000644000175000017500000000041012007570374020756 0ustar renerene‰PNG  IHDR Èä)‹bKGDª#2#IDATxÚchÿ`À¥ÿ#óðò@ÈC"Ô£™j?RJl²d™:4CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignatureab17802e1ddae3211b1ce6bc3b08aec7{ú¦( tEXtPage15x9+0+07vð¸IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/tip.png0000644000175000017500000000070112007570374020007 0ustar renerene‰PNG  IHDR*Þ bKGDª#2ÛIDATxÚu’»à @!+xŒ¬’6¥K—¬àR+hJ·”–TaK >ßžþRh~j?ïg0qF@”Ÿøƒð!¢ÊòeH,î…0܆x˜”0‘&p „^—µªJéÄ5y»=ôJØ % P<†*ÄŸ{Œ®”¨…Š–×Âj÷ #û7±^ñóŸÍL~Ù!=™ ä&Ṳ; ‘&rgߊFâm‰¬Í©×Pý•¬Ö;Ùä óot6BöJäqC ìXduÀê³Ýi]}OLð4+|) -íCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignatureee9d877396ce267aeb0179d35f81b2ac3ú'tEXtPage25x24+0+0¾ñ ¯IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/up.png0000644000175000017500000000275312007570374017650 0ustar renerene‰PNG  IHDR&@lnsBIT|dˆ pHYsŒŒçg™tEXtSoftwarewww.inkscape.org›î<hIDATX…½—kˆUU€¿sî¹¹ÞÇ<ÇÑÑQC3-6v†ðU ü6˜`$Ÿî*ì6uõä¼`šaޯׅý ÛzÛq\—‚+¸Ï20‘Åãx=¥”/—Rž+¸ü|eœ¢ëN7µ=¦®ž˜L3¬—¦ qo+Ñ@éì[7ÜLÙ¸å;ØÚâ¥#èc‰ÏCÆvÏÚŒgji»sy˜žh ×YþJ5Ú‡˜ºZõ]Ó ë%à£é3–‡ý¨+JUb(™ÇŠ%xe¶ö´±¤œÚz‰¥rœž¤à¸(²Äƒk;(28s5ÎxÖn𦩫G \`5Ãzø°‘e%Rý7k»½§§µ!@w8€Ú è Î —æI@WØ7ÀaͰöxúWïÚ|Y®íôzp\ÁÅÑÒ+¯3ìgMk°äØ ijüU ù=H’DÐç![pHå‹dl‡µíAdIBƒ‰Ü\p;ͳC¿*”:„Y+zÔ¯0QwÝÛ뢨x$òE‡±ŒÍXÆ&]²ai€ea?ƒÉHå‹´¶x û•ÙÞãÀ5à:°FöeuO'Ð(HÒ‹@¸þ¦òSß(—…ñy$.Œf¸žÈ±¾#„$A¤¼)€dL‘%º"¾ç‡’ö†€ë¦®fê×TL]µÁò3CŽº±x¬-X‹R©…§Ø­ë‘+ Æ26’TÒÙNm7rE l]ùvÏ“= ýUí炳Š,U«zÁq¹‘œyN6u…émo©Ò$sµôGÕèìÙ67TS`²$~ªüÞØY‹Òï±$}C)lG €±LËiþ͸£é‚p\ÁåñRv$ BµlÍç@™Ï@ß¾ò‡c§nœžêŽø¹™+Gk0‘e0‘>ÅÓ?œ sI@d ް*ÚRKe9óIS¢ìÊûQ€-ÝÖ´gµõ+2[º£ÜÖ¿×mñz¸½3TÎ;é³f|6ÝZ§cOÁW ¼ù¢ËÅÑI’ù"¶#(2]!?«[[ðÈ¥è¤m§˜-8é¥K|år$Ü»½ûíÿ àÓÓƒª$ä/$Ä]óÙŽgmúb)YŠmïmó Y´WÜwäavÓ¥éž`ß+­hÛĽñH±Y̆Sùãg®ÆE¹òwŸ¾ÏÇâÙƒÍBÁ"?x?ÿqd¹ëuîv…»Nâ<Š8»w[Ï8€fXû(µä•vxÈÔÕk·l>Ñ ëJ_êéTSWg4eÓeA©\¨˜ºú1°¿ü7¼Ú ÜâˆU¤ÜÊüiêê÷ÍÎùð Bø_8(IEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/up.gif0000644000175000017500000000210112007570374017614 0ustar renereneGIF87a''÷€€€€€€€€€ÀÀÀÀÜÀ¦Êððûÿ@€€€ÿ@@ðʦÿ€¤  €@€ÿ€@@€ÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ,''þH° Áƒ*\Ȱ¡Ã‡#@±¢Å‹3RDàŸÇ CŠù€‰$Sª,iå?‰ñµ4À#̃øfàñ¦A|: ðÈÀ?†ø‚à±hC|Jð¸€À ñE=ÀcU‡ø¶ð¨Á ñ‰õXö!¾µÿ0ø/!>¸r!âÃ;á?„øøÒŒˆO°P…ÿâ3¼T">Æ\þ3ˆ2˜øpø¯ >Í7ññA|£WŠ$ˆòM|®aâ‹-íˆønCÄ·>|øðáÇ>|øðáÇ>|øðáÇ>|øÄâÇ>|øð'áÇ>|øðáÇ>|øðáǾ­\5ê߿ѧÿÿhP@;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/note.gif0000644000175000017500000000110412007570374020137 0ustar renereneGIF89aô JJJRRRZZZccckkksss{{{„„„ŒŒŒ”””¥¥¥µµµ½½½ÆÆÆÎÎÎÖÖÖÞÞÞçççïïïÿÿÿ½½½!ù,þ`UUUUUUUI’$IUUUUUUUUUUUUÕ,ʲ,ÊòTUUUUUUUUMN²@ÒN“ä(ÊSUUUUUUIÊQEQEQ¨0UUUUUM CQEQEQ5-MUU`UMJCQEQEQEQ”ÒTUU= EEQEQEQ5-UUUKDQEQREQEQÏRUÏBQE9 Ó0M$I(IµHÔM´$ÌAO‚,˲(ŠÄ< ´HŠÂ<%=ŠóMEòDŠ´@ŠD5)ćÒ0LãL’-"QÕOF‹BMÔDQT¤HK”H5)†Â4ÉBÂQHQ%)Ò)Ç2MÅ=ÎQEQ%-`Å@Å(OÑ$ÑPEQE-O-5Î! âPEQEMËTUËCQT$ERREQEQMSU´HEQEQEQHQÏ2UUU1 EQEQEQEQÉSU`UUU£LEQEQE=ÉSUUUUUÅ€Š3QEQ%1ŠSUUUUUUUÐ’,QJѳ$ŒTUUUUUUUUUE¢(ÊòLXUUUU!;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/caution.svg0000644000175000017500000000233412007570374020674 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/next.gif0000644000175000017500000000207312007570374020156 0ustar renereneGIF87a&%÷€€€€€€€€€ÀÀÀÀÜÀ¦Êððûÿ@€€€ÿ@@ðʦÿ€¤  €@€ÿ€@@€ÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ,&%þH° Áƒ*\ÈP €‡#JœHñáAÿ2jÜȱ£Çøð±¤I!GflØ_Ê‚2²dˆï%Ag.Ägs €Œ:âëé0#LAâ#z@F˜ƒâc #TŸ3ñQÍxõfC|[ÿu{_X²hâ;ëu!€ƒøØbm  >¹uˆoÓ™âó  aÆ‚ø/ÌxŸb„â{\0ãB|”flˆrÆ™øg Šð¿¤ðùE-ßjÖø^£Æ';)¾­øðáÇ>|øðáÇ>|øðáÇ>|øðáÃG>|øðáÇ>|øð!áÇ>|øðáÇ>|øð1mZ±¾}‹¬Y³fÍ:h@;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/up.svg0000644000175000017500000000202012007570374017646 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/note.tif0000644000175000017500000000071412007570374020162 0ustar renereneII**€?àP8#ž ‚BaP%ê•(¥ˆCÙиK½ŒŒRµœîøãŒ”JDâŽx{z(ÿg%°·z–W'KW±T¤ÎašÁÊY¼UK&Oç°™Ü ‹c/V´¥ëz©\õó½¬ÖR£¬æóYœŒBD")G=mÏRVàNyKœs¦·«²õ’3d»Ò†2Ñ(¤{š­ilg|‘½w©ÃuÌ:QþïÇÀî¶vò3z9Ê—±ˆ\“(”=©c†³ÝyŒ{ Blïõ«Zµšóg3Ú¥‰Ö&:r–eÆŠKrþÇ“¯vÕŒMwÃ×Ï(oôg½Jt"•þ´a„Î÷æˆÅÉÎÞÖ¹³D‚A¸í@à KK þ"=hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/home.svg0000644000175000017500000000400312007570374020155 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/prev.png0000644000175000017500000000107412007570374020173 0ustar renerene‰PNG  IHDRÍ%sBIT|dˆ pHYs±±5kÅBtEXtSoftwarewww.inkscape.org›î<¹IDATH‰ÅÖ?ŒLQÇñÏŒU Ø%YÉ*$«°Å6× ÑˆB©Ù„…Dâ¡YC%Ñ °•M($¯ˆâ’(´4jÉkhihDT4þŒbßlvǼÌß¿æ%÷ž“ï¹÷æœ÷«5›M£T– ˜K1<­Š™hçpûñ•ÐÚ0'Íòb7q[Û¶w¥¾uÊè¤Y^Lá:®`{EؼšåÅ6,ávv Ÿ_ÍòbÇR ¯z‚fyQÇyÜžkÜQæÎX½•3˜Îòbºë›fyqq¨GXKwñW[”:Q -ßí6.¡Þ'¾·ÁZjt¼Þ,/Îâvk©&7@³¼˜·z•G‡€uÓÔ4Ë‹E _S Ìâ>–ëïûr}þO—R +mù ø2]éÑ9O1ttÿÅ# ]ÿÇ ¦öUÅÚV@WßûñH– +EÀIEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/important.png0000644000175000017500000000132212007570374021230 0ustar renerene‰PNG  IHDRשÍÊäPLTE)))999BB1ZZ)ccBBBRRRkkBccRssRccckkk{{{ŒŒŒŒ9½½­­!­­9œœZŒŒ{œœcœœ{µµJµµR½½Z¥¥c­­k­­{ÞÞÖÖÞÞ!ÞÞ1ÞÞ9ççïïïïÿÿÿÿÿÿçç)çç1ïï1ÿÿ!ÆÆZÖÖRÎÎsÖÖcÖÖkïïBççcçç{„„„ŒŒŒ”””¥¥„­­Œ¥¥”¥¥œ½½„½½œ¥¥¥­­¥­­­µµµ½½½ÆÆÆÎÎÎÖÖÖÞÞÞçççïïï÷÷÷ÿÿÿ­ÒÃÞbKGDCgÐ bIDATxÚm’ SÂ0 Ç3Eñ1•¡ÀÔÉKÜPT”•‰F'µûþßÇ®Qïö¿ë]’_iÈK±B¥&ºF‚(å6àßñrúðcºŒ/‘Ñ´…\NÞÃh£°›* â2pã¹=…:©ôJí÷v•?°•¾ÿ 6Ôï| @}÷`ÿ^Û>ƒ¯µs P¿ÕvB¡É¨é@Ãd6"èo;g•`PsÎ+ÁÝÞÖs%˜Çǯ%@ÈS{4ñܾ•Už-µs"þ1чßÄ?øjª<`g ­ñeZÔ* Ô+½ƒÃ¦Ú2Ã_Yvì*ÿÁ¤è•lv¬~Œg Z¶[s“ôY[Ãa; =ùí/öoJĘ!¤f€þcl¯RmÌRCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturec3ecc1fc5135d1e959695e569d213122riðIEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/tip.svg0000644000175000017500000000464212007570374020032 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/caution.gif0000644000175000017500000000134712007570374020645 0ustar renereneGIF89aõ-!!11BBZZcckkss{{„„ŒŒ””œœ¥¥µµ½½„„s””s””{œœ{µµZ¥¥cµµcÎÎÖÖÞÞ9ççïï÷÷÷÷ÿÿçç1çç9÷÷1ÞÞBŒŒŒœœ”œœœ¥¥œ¥¥¥µµµÎÎÎçççïïï½½½!ù.,þ@—Ëår¹\.—Ëår¹\.—Ëår¹\.—Ëår¹\.—Ëåbµ\.—Ëår¹\.—Ëår¹\.—˵’ €-—Ëår¹\.—Ëår¹\.—˵š,¦–Ëår¹\.—Ëår¹\.—‹%!y>˜TËår¹\.—Ëår].—k%y<Õr¹\.—Ëår¹\.×j²ñx8ÏÇ’j¹\.—Ëår¹\®eãñ@Žd¦Z.—Ëår¹\®ÕDäñxÄãYN-—Ëår¹\, ÉãñxÄãñ|0©–Ëår¹V’‘Çôx<ŽAãñx< ªår¹V“Çãñx<@ãñx<žþ%Õr±$$Çãñx<ãñx<ÏxQ¹Z)ËÇãñx<ŽÑñx<gCY¹\-Æãñx<Îáñx<Oh²r¹\®V óñx< PÑàx<O¨´r¹\.—«…²€<Ï0ˆx<žÍdår¹\.—ËÕJY@ÏcPÐx<¢ÊÊår¹\. ËårµR–Ç£áx<›ÊÊår¹\.—Ëår¹Z(ŒÇãñxB“•Ëår¹\.—Ëår¹\­æãñ„JÀ•Ëår¹\.—Ëår¹\.W em&+—Ëår¹\.—Ëår¹\.—«•ºPV.—Ëår¹\.—Ëår¹€.—Ëåj©V.—Ëår¹\.W;hsqldb2.2-2.2.9.orig/hsqldb/doc/images/db/warning.svg0000644000175000017500000000217512007570374020702 0ustar renerene ]> hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/0000755000175000017500000000000012007570422016271 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/0000755000175000017500000000000012007570402017056 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/0000755000175000017500000000000012007570406020337 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/0000755000175000017500000000000012007570406021241 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCBlobFile.html0000644000175000017500000015376612007570402024246 0ustar renerene JDBCBlobFile (HSQLDB 2.2.9 API)



                  org.hsqldb.jdbc
                  Class JDBCBlobFile

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCBlobFile
                  
                  All Implemented Interfaces:
                  Blob

                  public class JDBCBlobFile
                  extends Object
                  implements Blob

                  HSQLDB-Specific Information:

                  Starting with 2.1, in addition to HSQLDB driver support for both client-side in-memory and remote SQL CLOB data implementations, this class is provided to expose efficient, relatively high-performance BLOB operations over client accessible files.

                  Design Notes

                  Although it is possible to implement a transactional version of this class, the present implementation directly propagates changes to the underlying file such that changes become visible as soon as they are either implicitly or explicitly flushed to disk.

                  Since:
                  HSQLDB 2.1
                  Author:
                  boucherb@users

                  Field Summary
                  static String TEMP_FILE_PREFIX
                             
                  static String TEMP_FILE_SUFFIX
                             
                   
                  Constructor Summary
                  JDBCBlobFile()
                            Convenience constructor; equivalent to JDBCBlobFile(true);
                  JDBCBlobFile(boolean deleteOnFree)
                            Constructs a new instance backed by a File object created in response to invoking File.createTempFile(TEMP_FILE_PREFIX,TEMP_FILE_SUFFIX)
                  JDBCBlobFile(File file)
                            Convenience constructor; equivalent to JDBCBlobFile(file, false);
                  JDBCBlobFile(File file, boolean deleteOnFree)
                            Constructs a new instance backed by the given File object.
                   
                  Method Summary
                   void free()
                            This method frees the Blob object and releases the resources that it holds.
                   InputStream getBinaryStream()
                            Retrieves the BLOB value designated by this Blob instance as a stream.
                   InputStream getBinaryStream(long pos, long length)
                            Returns an InputStream object that contains a partial Blob value, starting with the byte specified by pos, which is length bytes in length.
                   byte[] getBytes(long pos, int length)
                            Retrieves all or part of the BLOB value that this Blob object represents, as an array of bytes.
                   File getFile()
                            Retrieves the canonical File object denoting the file that backs this BLOB.
                   boolean isDeleteOnFree()
                            Retrieves whether an attempt to delete the backing file is made in response to invocation of free().
                   long length()
                            Returns the number of bytes in the BLOB value designated by this Blob object.
                   long position(Blob pattern, long start)
                            Retrieves the byte position in the BLOB value designated by this Blob object at which pattern begins.
                   long position(byte[] pattern, long start)
                            Retrieves the byte position at which the specified byte array pattern begins within the BLOB value that this Blob object represents.
                   OutputStream setBinaryStream(long pos)
                            Retrieves a stream that can be used to write to the BLOB value that this Blob object represents.
                   int setBytes(long pos, byte[] bytes)
                            Writes the given array of bytes to the BLOB value that this Blob object represents, starting at position pos, and returns the number of bytes written.
                   int setBytes(long pos, byte[] bytes, int offset, int len)
                            Writes all or part of the given byte array to the BLOB value that this Blob object represents and returns the number of bytes written.
                   void setDeleteOnFree(boolean deleteOnFree)
                            Assigns whether an attempt to delete the backing file is made in response to invocation of free().
                   void truncate(long len)
                            Truncates the BLOB value that this Blob object represents to be len bytes in length.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Field Detail

                  TEMP_FILE_PREFIX

                  public static final String TEMP_FILE_PREFIX
                  See Also:
                  Constant Field Values

                  TEMP_FILE_SUFFIX

                  public static final String TEMP_FILE_SUFFIX
                  See Also:
                  Constant Field Values
                  Constructor Detail

                  JDBCBlobFile

                  public JDBCBlobFile()
                               throws SQLException
                  Convenience constructor; equivalent to JDBCBlobFile(true);

                  Throws:
                  SQLException - If a file could not be created or if a security manager exists and its SecurityManager.checkWrite(java.lang.String) method does not allow a file to be created.

                  JDBCBlobFile

                  public JDBCBlobFile(boolean deleteOnFree)
                               throws SQLException
                  Constructs a new instance backed by a File object created in response to invoking File.createTempFile(TEMP_FILE_PREFIX,TEMP_FILE_SUFFIX)

                  Parameters:
                  deleteOnFree - Assigns whether an attempt to delete the backing file is to be made in response to invocation of free().
                  Throws:
                  SQLException - If a file could not be created or if a security manager exists and its SecurityManager.checkWrite(java.lang.String) method does not allow a file to be created.

                  JDBCBlobFile

                  public JDBCBlobFile(File file)
                               throws SQLException
                  Convenience constructor; equivalent to JDBCBlobFile(file, false);

                  Parameters:
                  file - used to back this BLOB instance.
                  Throws:
                  SQLException - If an I/O error occurs, which is possible because the construction of the canonical pathname may require file system queries; if a required system property value cannot be accessed, or if a security manager exists and its SecurityManager.checkRead(java.io.FileDescriptor) method denies read access to the file

                  JDBCBlobFile

                  public JDBCBlobFile(File file,
                                      boolean deleteOnFree)
                               throws SQLException
                  Constructs a new instance backed by the given File object.

                  Parameters:
                  file - used to back this BLOB instance.
                  deleteOnFree - Assigns whether an attempt to delete the backing file is to be made in response to invocation of free().
                  Throws:
                  SQLException - If an I/O error occurs, which is possible because the construction of the canonical pathname may require file system queries; if a required system property value cannot be accessed, or if a security manager exists and its SecurityManager.checkRead(java.io.FileDescriptor) method denies read access to the file
                  Method Detail

                  length

                  public long length()
                              throws SQLException
                  Returns the number of bytes in the BLOB value designated by this Blob object.

                  Specified by:
                  length in interface Blob
                  Returns:
                  length of the BLOB in bytes
                  Throws:
                  SQLException - if there is an error accessing the length of the BLOB
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getBytes

                  public byte[] getBytes(long pos,
                                         int length)
                                  throws SQLException
                  Retrieves all or part of the BLOB value that this Blob object represents, as an array of bytes. This byte array contains up to length consecutive bytes starting at position pos.

                  Specified by:
                  getBytes in interface Blob
                  Parameters:
                  pos - the ordinal position of the first byte in the BLOB value to be extracted; the first byte is at position 1
                  length - the number of consecutive bytes to be copied; the value for length must be 0 or greater
                  Returns:
                  a byte array containing up to length consecutive bytes from the BLOB value designated by this Blob object, starting with the byte at position pos
                  Throws:
                  SQLException - if there is an error accessing the BLOB value; if pos is less than 1 or length is less than 0
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2
                  See Also:
                  setBytes(long, byte[])

                  getBinaryStream

                  public InputStream getBinaryStream()
                                              throws SQLException
                  Retrieves the BLOB value designated by this Blob instance as a stream.

                  Specified by:
                  getBinaryStream in interface Blob
                  Returns:
                  a stream containing the BLOB data
                  Throws:
                  SQLException - if there is an error accessing the BLOB value
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2
                  See Also:
                  setBinaryStream(long)

                  position

                  public long position(byte[] pattern,
                                       long start)
                                throws SQLException
                  Retrieves the byte position at which the specified byte array pattern begins within the BLOB value that this Blob object represents. The search for pattern begins at position start.

                  Specified by:
                  position in interface Blob
                  Parameters:
                  pattern - the byte array for which to search
                  start - the position at which to begin searching; the first position is 1
                  Returns:
                  the position at which the pattern appears, else -1
                  Throws:
                  SQLException - if there is an error accessing the BLOB or if start is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  position

                  public long position(Blob pattern,
                                       long start)
                                throws SQLException
                  Retrieves the byte position in the BLOB value designated by this Blob object at which pattern begins. The search begins at position start.

                  Specified by:
                  position in interface Blob
                  Parameters:
                  pattern - the Blob object designating the BLOB value for which to search
                  start - the position in the BLOB value at which to begin searching; the first position is 1
                  Returns:
                  the position at which the pattern begins, else -1
                  Throws:
                  SQLException - if there is an error accessing the BLOB value or if start is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  setBytes

                  public int setBytes(long pos,
                                      byte[] bytes)
                               throws SQLException
                  Writes the given array of bytes to the BLOB value that this Blob object represents, starting at position pos, and returns the number of bytes written. The array of bytes will overwrite the existing bytes in the Blob object starting at the position pos. If the end of the Blob value is reached while writing the array of bytes, then the length of the Blob value will be increased to accommodate the extra bytes.

                  Note: If the value specified for pos is greater then the length+1 of the BLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  This operation affects only the content of the underlying file; it has no effect upon a value stored in a database. To propagate the updated Blob value to a database, it is required to supply the Blob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updateable ResultSet.

                  Specified by:
                  setBytes in interface Blob
                  Parameters:
                  pos - the position in the BLOB object at which to start writing; the first position is 1
                  bytes - the array of bytes to be written to the BLOB value that this Blob object represents
                  Returns:
                  the number of bytes written
                  Throws:
                  SQLException - if there is an error accessing the BLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4
                  See Also:
                  getBytes(long, int)

                  setBytes

                  public int setBytes(long pos,
                                      byte[] bytes,
                                      int offset,
                                      int len)
                               throws SQLException
                  Writes all or part of the given byte array to the BLOB value that this Blob object represents and returns the number of bytes written. Writing starts at position pos in the BLOB value; len bytes from the given byte array are written. The array of bytes will overwrite the existing bytes in the Blob object starting at the position pos. If the end of the Blob value is reached while writing the array of bytes, then the length of the Blob value will be increased to accommodate the extra bytes.

                  Note: If the value specified for pos is greater then the length+1 of the BLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  This operation affects only the content of the underlying file; it has no effect upon a value stored in a database. To propagate the updated Blob value to a database, it is required to supply the Blob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updateable ResultSet.

                  Specified by:
                  setBytes in interface Blob
                  Parameters:
                  pos - the position in the BLOB object at which to start writing; the first position is 1
                  bytes - the array of bytes to be written to this BLOB object
                  offset - the offset into the array bytes at which to start reading the bytes to be set
                  len - the number of bytes to be written to the BLOB value from the array of bytes bytes
                  Returns:
                  the number of bytes written
                  Throws:
                  SQLException - if there is an error accessing the BLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4
                  See Also:
                  getBytes(long, int)

                  setBinaryStream

                  public OutputStream setBinaryStream(long pos)
                                               throws SQLException
                  Retrieves a stream that can be used to write to the BLOB value that this Blob object represents. The stream begins at position pos. The bytes written to the stream will overwrite the existing bytes in the Blob object starting at the position pos. If the end of the Blob value is reached while writing to the stream, then the length of the Blob value will be increased to accommodate the extra bytes.

                  Note: If the value specified for pos is greater then the length+1 of the BLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  Data written to the returned stream affects only the content of the underlying file; it has no effect upon a value stored in a database. To propagate the updated Blob value to a database, it is required to supply the Blob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updateable ResultSet.

                  Specified by:
                  setBinaryStream in interface Blob
                  Parameters:
                  pos - the position in the BLOB value at which to start writing; the first position is 1
                  Returns:
                  a java.io.OutputStream object to which data can be written
                  Throws:
                  SQLException - if there is an error accessing the BLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4
                  See Also:
                  getBinaryStream()

                  truncate

                  public void truncate(long len)
                                throws SQLException
                  Truncates the BLOB value that this Blob object represents to be len bytes in length.

                  Note: If the value specified for pos is greater then the length+1 of the BLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  This operation affects only the length of the underlying file; it has no effect upon a value stored in a database. To propagate the truncated Blob value to a database, it is required to supply the Blob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updateable ResultSet.

                  Specified by:
                  truncate in interface Blob
                  Parameters:
                  len - the length, in bytes, to which the BLOB value that this Blob object represents should be truncated
                  Throws:
                  SQLException - if there is an error accessing the BLOB value or if len is less than 0
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4

                  free

                  public void free()
                            throws SQLException
                  This method frees the Blob object and releases the resources that it holds. The object is invalid once the free method is called.

                  After free has been called, any attempt to invoke a method other than free will result in a SQLException being thrown. If free is called multiple times, the subsequent calls to free are treated as a no-op.

                  HSQLDB-Specific Information:

                  This operation closes any input and/or output streams obtained via getBinaryStream(), getBinaryStream(long, long) or setBinaryStream(long).

                  Additionally, if the property isDeleteOnFree() is true, then an attempt is made to delete the backing file.

                  Specified by:
                  free in interface Blob
                  Throws:
                  SQLException - if an error occurs releasing the Blob's resources
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6
                  See Also:
                  setDeleteOnFree(boolean), isDeleteOnFree()

                  getBinaryStream

                  public InputStream getBinaryStream(long pos,
                                                     long length)
                                              throws SQLException
                  Returns an InputStream object that contains a partial Blob value, starting with the byte specified by pos, which is length bytes in length.

                  Specified by:
                  getBinaryStream in interface Blob
                  Parameters:
                  pos - the offset to the first byte of the partial value to be retrieved. The first byte in the Blob is at position 1
                  length - the length in bytes of the partial value to be retrieved
                  Returns:
                  InputStream through which the partial Blob value can be read.
                  Throws:
                  SQLException - if pos is less than 1 or if pos is greater than the number of bytes in the Blob or if pos + length is greater than the number of bytes in the Blob
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6

                  getFile

                  public File getFile()
                  Retrieves the canonical File object denoting the file that backs this BLOB.

                  Returns:
                  the file that backs this BLOB.

                  isDeleteOnFree

                  public boolean isDeleteOnFree()
                  Retrieves whether an attempt to delete the backing file is made in response to invocation of free().

                  Returns:
                  true if backing file deletion is attempted; otherwise false.

                  setDeleteOnFree

                  public void setDeleteOnFree(boolean deleteOnFree)
                  Assigns whether an attempt to delete the backing file is made in response to invocation of free().

                  Parameters:
                  deleteOnFree - the new value to assign


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCCommonDataSource.html0000644000175000017500000011040412007570402025751 0ustar renerene JDBCCommonDataSource (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCCommonDataSource

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCCommonDataSource
                  
                  All Implemented Interfaces:
                  Serializable, CommonDataSource
                  Direct Known Subclasses:
                  JDBCDataSource

                  public abstract class JDBCCommonDataSource
                  extends Object
                  implements CommonDataSource, Serializable

                  Common base for DataSource implementations.

                  Since:
                  JDK 1.2, HSQLDB 2.0
                  Author:
                  Fred Toussi (fredt@users dot sourceforge.net)
                  See Also:
                  Serialized Form

                  Constructor Summary
                  JDBCCommonDataSource()
                             
                   
                  Method Summary
                   String getDatabase()
                            Synonym for getUrl().
                   String getDatabaseName()
                            Synonym for getUrl().
                   String getDataSourceName()
                            Retrieves the name of the data source.
                   String getDescription()
                            Retrieves the description of the data source.
                   int getLoginTimeout()
                            Gets the maximum time in seconds that this data source can wait while attempting to connect to a database.
                   PrintWriter getLogWriter()
                            Retrieves the log writer for this DataSource object.
                   String getNetworkProtocol()
                            Retrieves the network protocol of the data source.
                   Logger getParentLogger()
                            Return the parent Logger of all the Loggers used by this data source.
                   String getServerName()
                            Retrieves the server name attribute.
                   String getUrl()
                            Retrieves the jdbc database connection url attribute.
                   String getUser()
                            Retrieves the user name for the connection.
                   void setDatabase(String database)
                            Synonym for setUrl(String).
                   void setDatabaseName(String databaseName)
                            Synonym for setUrl(String).
                   void setLoginTimeout(int seconds)
                            Sets the maximum time in seconds that this data source will wait while attempting to connect to a database.
                   void setLogWriter(PrintWriter out)
                            Sets the log writer for this DataSource object to the given java.io.PrintWriter object.
                   void setPassword(String password)
                            Sets the password for the user name.
                   void setProperties(Properties props)
                            Sets connection properties.
                   void setUrl(String url)
                            Sets the jdbc database URL.
                   void setUser(String user)
                            Sets the user name.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  JDBCCommonDataSource

                  public JDBCCommonDataSource()
                  Method Detail

                  getLogWriter

                  public PrintWriter getLogWriter()
                                           throws SQLException

                  Retrieves the log writer for this DataSource object.

                  The log writer is a character output stream to which all logging and tracing messages for this data source will be printed. This includes messages printed by the methods of this object, messages printed by methods of other objects manufactured by this object, and so on. Messages printed to a data source specific log writer are not printed to the log writer associated with the java.sql.DriverManager class. When a DataSource object is created, the log writer is initially null; in other words, the default is for logging to be disabled.

                  Specified by:
                  getLogWriter in interface CommonDataSource
                  Returns:
                  the log writer for this data source or null if logging is disabled
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  1.4
                  See Also:
                  setLogWriter(java.io.PrintWriter)

                  setLogWriter

                  public void setLogWriter(PrintWriter out)
                                    throws SQLException

                  Sets the log writer for this DataSource object to the given java.io.PrintWriter object.

                  The log writer is a character output stream to which all logging and tracing messages for this data source will be printed. This includes messages printed by the methods of this object, messages printed by methods of other objects manufactured by this object, and so on. Messages printed to a data source- specific log writer are not printed to the log writer associated with the java.sql.DriverManager class. When a DataSource object is created the log writer is initially null; in other words, the default is for logging to be disabled.

                  Specified by:
                  setLogWriter in interface CommonDataSource
                  Parameters:
                  out - the new log writer; to disable logging, set to null
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  1.4
                  See Also:
                  getLogWriter()

                  setLoginTimeout

                  public void setLoginTimeout(int seconds)
                                       throws SQLException

                  Sets the maximum time in seconds that this data source will wait while attempting to connect to a database. A value of zero specifies that the timeout is the default system timeout if there is one; otherwise, it specifies that there is no timeout. When a DataSource object is created, the login timeout is initially zero.

                  Specified by:
                  setLoginTimeout in interface CommonDataSource
                  Parameters:
                  seconds - the data source login time limit
                  Throws:
                  SQLException - if a database access error occurs.
                  Since:
                  1.4
                  See Also:
                  getLoginTimeout()

                  getLoginTimeout

                  public int getLoginTimeout()
                                      throws SQLException
                  Gets the maximum time in seconds that this data source can wait while attempting to connect to a database. A value of zero means that the timeout is the default system timeout if there is one; otherwise, it means that there is no timeout. When a DataSource object is created, the login timeout is initially zero.

                  Specified by:
                  getLoginTimeout in interface CommonDataSource
                  Returns:
                  the data source login time limit
                  Throws:
                  SQLException - if a database access error occurs.
                  Since:
                  1.4
                  See Also:
                  setLoginTimeout(int)

                  getDescription

                  public String getDescription()
                  Retrieves the description of the data source.

                  Returns:
                  the description

                  getDataSourceName

                  public String getDataSourceName()
                  Retrieves the name of the data source.

                  Returns:
                  the description

                  getNetworkProtocol

                  public String getNetworkProtocol()
                  Retrieves the network protocol of the data source.

                  Returns:
                  the network protocol

                  getServerName

                  public String getServerName()
                  Retrieves the server name attribute.

                  Returns:
                  the server name attribute

                  getDatabaseName

                  public String getDatabaseName()
                  Synonym for getUrl().

                  Returns:
                  the jdbc database connection url attribute

                  getDatabase

                  public String getDatabase()
                  Synonym for getUrl().

                  Returns:
                  the jdbc database connection url attribute

                  getUrl

                  public String getUrl()
                  Retrieves the jdbc database connection url attribute.

                  Returns:
                  the jdbc database connection url attribute

                  getUser

                  public String getUser()
                  Retrieves the user name for the connection.

                  Returns:
                  the username for the connection

                  setDatabaseName

                  public void setDatabaseName(String databaseName)
                  Synonym for setUrl(String).

                  Parameters:
                  databaseName - the new value for the attribute

                  setDatabase

                  public void setDatabase(String database)
                  Synonym for setUrl(String).

                  Parameters:
                  database - the new value for the attribute

                  setUrl

                  public void setUrl(String url)
                  Sets the jdbc database URL.

                  Parameters:
                  url - the new value of this object's jdbc database connection url attribute

                  setPassword

                  public void setPassword(String password)
                  Sets the password for the user name.

                  Parameters:
                  password - the password

                  setUser

                  public void setUser(String user)
                  Sets the user name.

                  Parameters:
                  user - the user id

                  setProperties

                  public void setProperties(Properties props)
                  Sets connection properties. If user / password / logginTimeout has been set with one of the setXXX() methods it will be added to the Properties object.

                  Parameters:
                  props - properties. If null, then existing properties will be cleared/replaced.

                  getParentLogger

                  public Logger getParentLogger()
                                         throws SQLFeatureNotSupportedException
                  Return the parent Logger of all the Loggers used by this data source. This should be the Logger farthest from the root Logger that is still an ancestor of all of the Loggers used by this data source. Configuring this Logger will affect all of the log messages generated by the data source. In the worst case, this may be the root Logger.

                  Returns:
                  the parent Logger for this data source
                  Throws:
                  SQLFeatureNotSupportedException - if the data source does not use java.util.logging.
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCDatabaseMetaData.html0000644000175000017500000174375412007570404025702 0ustar renerene JDBCDatabaseMetaData (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCDatabaseMetaData

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCDatabaseMetaData
                  
                  All Implemented Interfaces:
                  DatabaseMetaData, Wrapper

                  public class JDBCDatabaseMetaData
                  extends Object
                  implements DatabaseMetaData, Wrapper

                  Comprehensive information about the database as a whole.

                  This interface is implemented by driver vendors to let users know the capabilities of a Database Management System (DBMS) in combination with the driver based on JDBCTM technology ("JDBC driver") that is used with it. Different relational DBMSs often support different features, implement features in different ways, and use different data types. In addition, a driver may implement a feature on top of what the DBMS offers. Information returned by methods in this interface applies to the capabilities of a particular driver and a particular DBMS working together. Note that as used in this documentation, the term "database" is used generically to refer to both the driver and DBMS.

                  A user for this interface is commonly a tool that needs to discover how to deal with the underlying DBMS. This is especially true for applications that are intended to be used with more than one DBMS. For example, a tool might use the method getTypeInfo to find out what data types can be used in a CREATE TABLE statement. Or a user might call the method supportsCorrelatedSubqueries to see if it is possible to use a correlated subquery or supportsBatchUpdates to see if it is possible to use batch updates.

                  Some DatabaseMetaData methods return lists of information in the form of ResultSet objects. Regular ResultSet methods, such as getString and getInt, can be used to retrieve the data from these ResultSet objects. If a given form of metadata is not available, an empty ResultSet will be returned. Additional columns beyond the columns defined to be returned by the ResultSet object for a given method can be defined by the JDBC driver vendor and must be accessed by their column label.

                  Some DatabaseMetaData methods take arguments that are String patterns. These arguments all have names such as fooPattern. Within a pattern String, "%" means match any substring of 0 or more characters, and "_" means match any one character. Only metadata entries matching the search pattern are returned. If a search pattern argument is set to null, that argument's criterion will be dropped from the search.

                  A method that gets information about a feature that the driver does not support will throw an SQLException. In the case of methods that return a ResultSet object, either a ResultSet object (which may be empty) is returned or an SQLException is thrown.

                  HSQLDB-Specific Information:

                  Metadata Table Production

                  Starting with HSQLDB 1.7.2, the metadata table (a.k.a system table) production implementation provided in the default build filters metadata based on each SQL session user's access rights which in turn lifts the pre-HSQLDB 1.7.2 restriction that only users with the DBA role ('admin' users in older HSQLDB parlance) could expect trouble-free access to all metadata.

                  Also starting with HSQLDB 1.7.2, the metadata table production implementation classes are loaded dynamically, using a precedence policy to find and load the richest producer available at runtime. In the event that no better alternative is found, the default minimal (completely restricted) provider is selected. Under this scheme, it is possible for third party packagers to create custom distributions targeted at supporting full (design-time), custom-written (proprietary / micro environment), minimal (production-time) or completely-restricted (space-constrained | device embedded | real-time | hostile environment) metadata table production scenarios. To learn more about this option, interested parties can review the documentation and source code for the org.hsqldb.dbinfo.DatabaseInformation class.

                  Please also note that in addition to the metadata tables produced to directly support this class, starting with HSQLDB 1.7.2, the default build provides many additional tables covering all or most HSQLDB features, such as descriptions of the triggers and aliases defined in the database.

                  For instance, in the default build, a fairly comprehensive description of each INFORMATION_SCHEMA table and each INFORMATION_SCHEMA table column is included in the REMARKS column of the getTables(...) and getColumns(...) results, which derive from INFORMATION_SCHEMA.SYSTEM_TABLES and INFORMATION_SCHEMA.SYSTEM_COLUMNS, respectively.

                  Schema Metadata

                  The SQL SCHEMA concept became fully supported in the HSQLDB 1.8.x series and this fact is reflected in the all subsequent versions of this class.

                  Catalog Metadata

                  Starting with HSQLDB 2.0, SQL standards compliance up to SQL:2008 and beyond is a major theme which is reflected in the provision of the majority of the standard-defined full-name INFORMATION_SCHEMA views.

                  However, just as CATALOG semantics and handling are still considered to be implementation defined by the most recent SQL standard (SQL:2008), so is the HSQLDB CATALOG concept still in the process of being defined and refined in HSQLDB 2.x. and beyond.

                  Previous to HSQLDB 2.x, there were, at various points in time, experimental features provided to turn on pseudo catalog (and before that, pseudo-schema) reporting in the system tables, using the database properties 'hsqldb.catalogs' and 'hsqldb.schemas', respectively.

                  However, once the engine fully supported the SQL SCHEMA concept, the experimental 'hsqldb.schemas' * database property was retired.

                  Similarly, starting with HSQLDB 2.x, the 'hsqldb.catalogs' database property has been retired and replaced with the convention that, from the perspective of SQL identification, an HSQLDB JDBC URL connects to a single HSQLDB database instance which consists of a single, default CATALOG named PUBLIC in which each SCHEMA instance of the database resides. The name of this catalog can be changed with the ALTER CATALOG RENAME TO statement. As of version 2.1.0, HSQLDB supports qualification by the containing CATALOG of database objects at the syntactic level, but does not yet support operations such as opening, manipulating or querying against multiple database catalogs within a single session, not even in a one-at-a-time fashion.

                  Index Metadata

                  It must still be noted that as of the most recent release, HSQLDB continues to ignore the approximate argument of getIndexInfo() which continues to be simply indicative of absence of a fully statistics-driven cost-based SQL plan optimization facility. When, such a facility is implemented, corresponding improvements to getIndexInfo will be provided.

                  Notes for developers extending metadata table production

                  Note that in the absence of an ORDER BY clause, queries against the metadata tables that directly support this class are expected to return rows in JDBC contract order. The reason for this is that results typically come back much faster when no "ORDER BY" clause is used.

                  As such, when adding, extending or replacing a JDBC database metadata table production routine, developers need to be aware of this fact and either add the contract "ORDER BY" clause to the driving SQL or, when possible, preferably maintain rows in the contract order by correctly coding the primary index definition in the table producer class.


                  JRE 1.1.x Notes:

                  In general, JDBC 2 support requires Java 1.2 and above, and JDBC3 requires Java 1.4 and above. In HSQLDB, support for methods introduced in different versions of JDBC depends on the JDK version used for compiling and building HSQLDB.

                  Since 1.7.0, it is possible to build the product so that all JDBC 2 methods can be called while executing under the version 1.1.x Java Runtime EnvironmentTM. However, some of these method calls require int values that are defined only in the JDBC 2 or greater version of the ResultSet interface. For this reason, when the product is compiled under JDK 1.1.x, these values are defined in JDBCResultSet.

                  In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the JDBC2-only ResultSet values can be achieved by referring to them in parameter specifications and return value comparisons, respectively, as follows:

                   JDBCResultSet.FETCH_FORWARD
                   JDBCResultSet.TYPE_FORWARD_ONLY
                   JDBCResultSet.TYPE_SCROLL_INSENSITIVE
                   JDBCResultSet.CONCUR_READ_ONLY
                   // etc
                   
                  However, please note that code written in such a manner will not be compatible for use with other JDBC 2 drivers, since they expect and use ResultSet, rather than JDBCResultSet. Also note, this feature is offered solely as a convenience to developers who must work under JDK 1.1.x due to operating constraints, yet wish to use some of the more advanced features available under the JDBC 2 specification.

                  (fredt@users)
                  (boucherb@users)

                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)
                  See Also:
                  DatabaseInformation, DatabaseInformationMain, DatabaseInformationFull

                  Field Summary
                  static int JDBC_MAJOR
                             
                   
                  Fields inherited from interface java.sql.DatabaseMetaData
                  attributeNoNulls, attributeNullable, attributeNullableUnknown, bestRowNotPseudo, bestRowPseudo, bestRowSession, bestRowTemporary, bestRowTransaction, bestRowUnknown, columnNoNulls, columnNullable, columnNullableUnknown, functionColumnIn, functionColumnInOut, functionColumnOut, functionColumnResult, functionColumnUnknown, functionNoNulls, functionNoTable, functionNullable, functionNullableUnknown, functionResultUnknown, functionReturn, functionReturnsTable, importedKeyCascade, importedKeyInitiallyDeferred, importedKeyInitiallyImmediate, importedKeyNoAction, importedKeyNotDeferrable, importedKeyRestrict, importedKeySetDefault, importedKeySetNull, procedureColumnIn, procedureColumnInOut, procedureColumnOut, procedureColumnResult, procedureColumnReturn, procedureColumnUnknown, procedureNoNulls, procedureNoResult, procedureNullable, procedureNullableUnknown, procedureResultUnknown, procedureReturnsResult, sqlStateSQL, sqlStateSQL99, sqlStateXOpen, tableIndexClustered, tableIndexHashed, tableIndexOther, tableIndexStatistic, typeNoNulls, typeNullable, typeNullableUnknown, typePredBasic, typePredChar, typePredNone, typeSearchable, versionColumnNotPseudo, versionColumnPseudo, versionColumnUnknown
                   
                  Method Summary
                   boolean allProceduresAreCallable()
                            Retrieves whether the current user can call all the procedures returned by the method getProcedures.
                   boolean allTablesAreSelectable()
                            Retrieves whether the current user can use all the tables returned by the method getTables in a SELECT statement.
                   boolean autoCommitFailureClosesAllResultSets()
                            Retrieves whether a SQLException while autoCommit is true inidcates that all open ResultSets are closed, even ones that are holdable.
                   boolean dataDefinitionCausesTransactionCommit()
                            Retrieves whether a data definition statement within a transaction forces the transaction to commit.
                   boolean dataDefinitionIgnoredInTransactions()
                            Retrieves whether this database ignores a data definition statement within a transaction.
                   boolean deletesAreDetected(int type)
                            Retrieves whether or not a visible row delete can be detected by calling the method ResultSet.rowDeleted.
                   boolean doesMaxRowSizeIncludeBlobs()
                            Retrieves whether the return value for the method getMaxRowSize includes the SQL data types LONGVARCHAR and LONGVARBINARY.
                   boolean generatedKeyAlwaysReturned()
                            Retrieves whether a generated key will always be returned if the column name(s) or index(es) specified for the auto generated key column(s) are valid and the statement succeeds.
                   ResultSet getAttributes(String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern)
                            Retrieves a description of the given attribute of the given type for a user-defined type (UDT) that is available in the given schema and catalog.
                   ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable)
                            Retrieves a description of a table's optimal set of columns that uniquely identifies a row.
                   ResultSet getCatalogs()
                            Retrieves the catalog names available in this database.
                   String getCatalogSeparator()
                            Retrieves the String that this database uses as the separator between a catalog and table name.
                   String getCatalogTerm()
                            Retrieves the database vendor's preferred term for "catalog".
                   ResultSet getClientInfoProperties()
                            Retrieves a list of the client info properties that the driver supports.
                   ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern)
                            Retrieves a description of the access rights for a table's columns.
                   ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)
                            Retrieves a description of table columns available in the specified catalog.
                   Connection getConnection()
                            Retrieves the connection that produced this metadata object.
                   ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable)
                            (JDBC4 clarification:) Retrieves a description of the foreign key columns in the given foreign key table that reference the primary key or the columns representing a unique constraint of the parent table (could be the same or a different table).
                   int getDatabaseMajorVersion()
                            Retrieves the major version number of the underlying database.
                   int getDatabaseMinorVersion()
                            Retrieves the minor version number of the underlying database.
                   String getDatabaseProductName()
                            Retrieves the name of this database product.
                   String getDatabaseProductVersion()
                            Retrieves the version number of this database product.
                   int getDefaultTransactionIsolation()
                            Retrieves this database's default transaction isolation level.
                   int getDriverMajorVersion()
                            Retrieves this JDBC driver's major version number.
                   int getDriverMinorVersion()
                            Retrieves this JDBC driver's minor version number.
                   String getDriverName()
                            Retrieves the name of this JDBC driver.
                   String getDriverVersion()
                            Retrieves the version number of this JDBC driver as a String.
                   ResultSet getExportedKeys(String catalog, String schema, String table)
                            Retrieves a description of the foreign key columns that reference the given table's primary key columns (the foreign keys exported by a table).
                   String getExtraNameCharacters()
                            Retrieves all the "extra" characters that can be used in unquoted identifier names (those beyond a-z, A-Z, 0-9 and _).
                   ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern)
                            Retrieves a description of the given catalog's system or user function parameters and return type.
                   ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern)
                            Retrieves a description of the JDBC 4.1[ system and ]user functions available in the given catalog.
                   String getIdentifierQuoteString()
                            Retrieves the string used to quote SQL identifiers.
                   ResultSet getImportedKeys(String catalog, String schema, String table)
                            Retrieves a description of the primary key columns that are referenced by the given table's foreign key columns (the primary keys imported by a table).
                   ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate)
                            Retrieves a description of the given table's indices and statistics.
                   int getJDBCMajorVersion()
                            Retrieves the major JDBC version number for this driver.
                   int getJDBCMinorVersion()
                            Retrieves the minor JDBC version number for this driver.
                   int getMaxBinaryLiteralLength()
                            Retrieves the maximum number of hex characters this database allows in an inline binary literal.
                   int getMaxCatalogNameLength()
                            Retrieves the maximum number of characters that this database allows in a catalog name.
                   int getMaxCharLiteralLength()
                            Retrieves the maximum number of characters this database allows for a character literal.
                   int getMaxColumnNameLength()
                            Retrieves the maximum number of characters this database allows for a column name.
                   int getMaxColumnsInGroupBy()
                            Retrieves the maximum number of columns this database allows in a GROUP BY clause.
                   int getMaxColumnsInIndex()
                            Retrieves the maximum number of columns this database allows in an index.
                   int getMaxColumnsInOrderBy()
                            Retrieves the maximum number of columns this database allows in an ORDER BY clause.
                   int getMaxColumnsInSelect()
                            Retrieves the maximum number of columns this database allows in a SELECT list.
                   int getMaxColumnsInTable()
                            Retrieves the maximum number of columns this database allows in a table.
                   int getMaxConnections()
                            Retrieves the maximum number of concurrent connections to this database that are possible.
                   int getMaxCursorNameLength()
                            Retrieves the maximum number of characters that this database allows in a cursor name.
                   int getMaxIndexLength()
                            Retrieves the maximum number of bytes this database allows for an index, including all of the parts of the index.
                   int getMaxProcedureNameLength()
                            Retrieves the maximum number of characters that this database allows in a procedure name.
                   int getMaxRowSize()
                            Retrieves the maximum number of bytes this database allows in a single row.
                   int getMaxSchemaNameLength()
                            Retrieves the maximum number of characters that this database allows in a schema name.
                   int getMaxStatementLength()
                            Retrieves the maximum number of characters this database allows in an SQL statement.
                   int getMaxStatements()
                            Retrieves the maximum number of active statements to this database that can be open at the same time.
                   int getMaxTableNameLength()
                            Retrieves the maximum number of characters this database allows in a table name.
                   int getMaxTablesInSelect()
                            Retrieves the maximum number of tables this database allows in a SELECT statement.
                   int getMaxUserNameLength()
                            Retrieves the maximum number of characters this database allows in a user name.
                   String getNumericFunctions()
                            Retrieves a comma-separated list of math functions available with this database.
                   ResultSet getPrimaryKeys(String catalog, String schema, String table)
                            Retrieves a description of the given table's primary key columns.
                   ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern)
                            Retrieves a description of the given catalog's stored procedure parameter and result columns.
                   ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern)
                            Retrieves a description of the stored procedures available in the given catalog.
                   String getProcedureTerm()
                            Retrieves the database vendor's preferred term for "procedure".
                   ResultSet getPseudoColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)
                            Retrieves a description of the pseudo or hidden columns available in a given table within the specified catalog and schema.
                   int getResultSetHoldability()
                            (JDBC4 clarification:) Retrieves this database's default holdability for ResultSet objects.
                   RowIdLifetime getRowIdLifetime()
                            Indicates whether or not this data source supports the SQL ROWID type, and if so the lifetime for which a RowId object remains valid.
                   ResultSet getSchemas()
                            Retrieves the schema names available in this database.
                   ResultSet getSchemas(String catalog, String schemaPattern)
                            Retrieves the schema names available in this database.
                   String getSchemaTerm()
                            Retrieves the database vendor's preferred term for "schema".
                   String getSearchStringEscape()
                            Retrieves the string that can be used to escape wildcard characters.
                   String getSQLKeywords()
                            Retrieves a comma-separated list of all of this database's SQL keywords that are NOT also SQL:2003 keywords.
                   int getSQLStateType()
                            (JDBC4 modified:) Indicates whether the SQLSTATE returned by SQLException.getSQLState is X/Open (now known as Open Group) SQL CLI or SQL:2003.
                   String getStringFunctions()
                            Retrieves a comma-separated list of string functions available with this database.
                   ResultSet getSuperTables(String catalog, String schemaPattern, String tableNamePattern)
                            Retrieves a description of the table hierarchies defined in a particular schema in this database.
                   ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern)
                            Retrieves a description of the user-defined type (UDT) hierarchies defined in a particular schema in this database.
                   String getSystemFunctions()
                            Retrieves a comma-separated list of system functions available with this database.
                   ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern)
                            Retrieves a description of the access rights for each table available in a catalog.
                   ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types)
                            Retrieves a description of the tables available in the given catalog.
                   ResultSet getTableTypes()
                            Retrieves the table types available in this database.
                   String getTimeDateFunctions()
                            Retrieves a comma-separated list of the time and date functions available with this database.
                   ResultSet getTypeInfo()
                            Retrieves a description of all the (JDBC4 clarification:) data types supported by this database.
                   ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types)
                            Retrieves a description of the user-defined types (UDTs) defined in a particular schema.
                   String getURL()
                            Retrieves the URL for this DBMS.
                   String getUserName()
                            Retrieves the user name as known to this database.
                   ResultSet getVersionColumns(String catalog, String schema, String table)
                            Retrieves a description of a table's columns that are automatically updated when any value in a row is updated.
                   boolean insertsAreDetected(int type)
                            Retrieves whether or not a visible row insert can be detected by calling the method ResultSet.rowInserted.
                   boolean isCatalogAtStart()
                            Retrieves whether a catalog appears at the start of a fully qualified table name.
                   boolean isReadOnly()
                            Retrieves whether this database is in read-only mode.
                   boolean isWrapperFor(Class<?> iface)
                            Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                   boolean locatorsUpdateCopy()
                            Indicates whether updates made to a LOB are made on a copy or directly to the LOB.
                   boolean nullPlusNonNullIsNull()
                            Retrieves whether this database supports concatenations between NULL and non-NULL values being NULL.
                   boolean nullsAreSortedAtEnd()
                            Retrieves whether NULL values are sorted at the end regardless of sort order.
                   boolean nullsAreSortedAtStart()
                            Retrieves whether NULL values are sorted at the start regardless of sort order.
                   boolean nullsAreSortedHigh()
                            Retrieves whether NULL values are sorted high.
                   boolean nullsAreSortedLow()
                            Retrieves whether NULL values are sorted low.
                   boolean othersDeletesAreVisible(int type)
                            Retrieves whether deletes made by others are visible.
                   boolean othersInsertsAreVisible(int type)
                            Retrieves whether inserts made by others are visible.
                   boolean othersUpdatesAreVisible(int type)
                            Retrieves whether updates made by others are visible.
                   boolean ownDeletesAreVisible(int type)
                            Retrieves whether a result set's own deletes are visible.
                   boolean ownInsertsAreVisible(int type)
                            Retrieves whether a result set's own inserts are visible.
                   boolean ownUpdatesAreVisible(int type)
                            Retrieves whether for the given type of ResultSet object, the result set's own updates are visible.
                   boolean storesLowerCaseIdentifiers()
                            Retrieves whether this database treats mixed case unquoted SQL identifiers as case insensitive and stores them in lower case.
                   boolean storesLowerCaseQuotedIdentifiers()
                            Retrieves whether this database treats mixed case quoted SQL identifiers as case insensitive and stores them in lower case.
                   boolean storesMixedCaseIdentifiers()
                            Retrieves whether this database treats mixed case unquoted SQL identifiers as case insensitive and stores them in mixed case.
                   boolean storesMixedCaseQuotedIdentifiers()
                            Retrieves whether this database treats mixed case quoted SQL identifiers as case insensitive and stores them in mixed case.
                   boolean storesUpperCaseIdentifiers()
                            Retrieves whether this database treats mixed case unquoted SQL identifiers as case insensitive and stores them in upper case.
                   boolean storesUpperCaseQuotedIdentifiers()
                            Retrieves whether this database treats mixed case quoted SQL identifiers as case insensitive and stores them in upper case.
                   boolean supportsAlterTableWithAddColumn()
                            Retrieves whether this database supports ALTER TABLE with add column.
                   boolean supportsAlterTableWithDropColumn()
                            Retrieves whether this database supports ALTER TABLE with drop column.
                   boolean supportsANSI92EntryLevelSQL()
                            Retrieves whether this database supports the ANSI92 entry level SQL grammar.
                   boolean supportsANSI92FullSQL()
                            Retrieves whether this database supports the ANSI92 full SQL grammar supported.
                   boolean supportsANSI92IntermediateSQL()
                            Retrieves whether this database supports the ANSI92 intermediate SQL grammar supported.
                   boolean supportsBatchUpdates()
                            Retrieves whether this database supports batch updates.
                   boolean supportsCatalogsInDataManipulation()
                            Retrieves whether a catalog name can be used in a data manipulation statement.
                   boolean supportsCatalogsInIndexDefinitions()
                            Retrieves whether a catalog name can be used in an index definition statement.
                   boolean supportsCatalogsInPrivilegeDefinitions()
                            Retrieves whether a catalog name can be used in a privilege definition statement.
                   boolean supportsCatalogsInProcedureCalls()
                            Retrieves whether a catalog name can be used in a procedure call statement.
                   boolean supportsCatalogsInTableDefinitions()
                            Retrieves whether a catalog name can be used in a table definition statement.
                   boolean supportsColumnAliasing()
                            Retrieves whether this database supports column aliasing.
                   boolean supportsConvert()
                            (JDBC4 clarification:) Retrieves whether this database supports the JDBC scalar function CONVERT for the conversion of one JDBC type to another.
                   boolean supportsConvert(int fromType, int toType)
                            (JDBC4 clarification:) Retrieves whether this database supports the JDBC scalar function CONVERT for conversions between the JDBC types fromType and toType.
                   boolean supportsCoreSQLGrammar()
                            Retrieves whether this database supports the ODBC Core SQL grammar.
                   boolean supportsCorrelatedSubqueries()
                            Retrieves whether this database supports correlated subqueries.
                   boolean supportsDataDefinitionAndDataManipulationTransactions()
                            Retrieves whether this database supports both data definition and data manipulation statements within a transaction.
                   boolean supportsDataManipulationTransactionsOnly()
                            Retrieves whether this database supports only data manipulation statements within a transaction.
                   boolean supportsDifferentTableCorrelationNames()
                            Retrieves whether, when table correlation names are supported, they are restricted to being different from the names of the tables.
                   boolean supportsExpressionsInOrderBy()
                            Retrieves whether this database supports expressions in ORDER BY lists.
                   boolean supportsExtendedSQLGrammar()
                            Retrieves whether this database supports the ODBC Extended SQL grammar.
                   boolean supportsFullOuterJoins()
                            Retrieves whether this database supports full nested outer joins.
                   boolean supportsGetGeneratedKeys()
                            Retrieves whether auto-generated keys can be retrieved after a statement has been executed
                   boolean supportsGroupBy()
                            Retrieves whether this database supports some form of GROUP BY clause.
                   boolean supportsGroupByBeyondSelect()
                            Retrieves whether this database supports using columns not included in the SELECT statement in a GROUP BY clause provided that all of the columns in the SELECT statement are included in the GROUP BY clause.
                   boolean supportsGroupByUnrelated()
                            Retrieves whether this database supports using a column that is not in the SELECT statement in a GROUP BY clause.
                   boolean supportsIntegrityEnhancementFacility()
                            Retrieves whether this database supports the SQL Integrity Enhancement Facility.
                   boolean supportsLikeEscapeClause()
                            Retrieves whether this database supports specifying a LIKE escape clause.
                   boolean supportsLimitedOuterJoins()
                            Retrieves whether this database provides limited support for outer joins.
                   boolean supportsMinimumSQLGrammar()
                            Retrieves whether this database supports the ODBC Minimum SQL grammar.
                   boolean supportsMixedCaseIdentifiers()
                            Retrieves whether this database treats mixed case unquoted SQL identifiers as case sensitive and as a result stores them in mixed case.
                   boolean supportsMixedCaseQuotedIdentifiers()
                            Retrieves whether this database treats mixed case quoted SQL identifiers as case sensitive and as a result stores them in mixed case.
                   boolean supportsMultipleOpenResults()
                            Retrieves whether it is possible to have multiple ResultSet objects returned from a CallableStatement object simultaneously.
                   boolean supportsMultipleResultSets()
                            Retrieves whether this database supports getting multiple ResultSet objects from a single call to the method execute.
                   boolean supportsMultipleTransactions()
                            Retrieves whether this database allows having multiple transactions open at once (on different connections).
                   boolean supportsNamedParameters()
                            Retrieves whether this database supports named parameters to callable statements.
                   boolean supportsNonNullableColumns()
                            Retrieves whether columns in this database may be defined as non-nullable.
                   boolean supportsOpenCursorsAcrossCommit()
                            Retrieves whether this database supports keeping cursors open across commits.
                   boolean supportsOpenCursorsAcrossRollback()
                            Retrieves whether this database supports keeping cursors open across rollbacks.
                   boolean supportsOpenStatementsAcrossCommit()
                            Retrieves whether this database supports keeping statements open across commits.
                   boolean supportsOpenStatementsAcrossRollback()
                            Retrieves whether this database supports keeping statements open across rollbacks.
                   boolean supportsOrderByUnrelated()
                            Retrieves whether this database supports using a column that is not in the SELECT statement in an ORDER BY clause.
                   boolean supportsOuterJoins()
                            Retrieves whether this database supports some form of outer join.
                   boolean supportsPositionedDelete()
                            Retrieves whether this database supports positioned DELETE statements.
                   boolean supportsPositionedUpdate()
                            Retrieves whether this database supports positioned UPDATE statements.
                   boolean supportsResultSetConcurrency(int type, int concurrency)
                            Retrieves whether this database supports the given concurrency type in combination with the given result set type.
                   boolean supportsResultSetHoldability(int holdability)
                            Retrieves whether this database supports the given result set holdability.
                   boolean supportsResultSetType(int type)
                            Retrieves whether this database supports the given result set type.
                   boolean supportsSavepoints()
                            Retrieves whether this database supports savepoints.
                   boolean supportsSchemasInDataManipulation()
                            Retrieves whether a schema name can be used in a data manipulation statement.
                   boolean supportsSchemasInIndexDefinitions()
                            Retrieves whether a schema name can be used in an index definition statement.
                   boolean supportsSchemasInPrivilegeDefinitions()
                            Retrieves whether a schema name can be used in a privilege definition statement.
                   boolean supportsSchemasInProcedureCalls()
                            Retrieves whether a schema name can be used in a procedure call statement.
                   boolean supportsSchemasInTableDefinitions()
                            Retrieves whether a schema name can be used in a table definition statement.
                   boolean supportsSelectForUpdate()
                            Retrieves whether this database supports SELECT FOR UPDATE statements.
                   boolean supportsStatementPooling()
                            Retrieves whether this database supports statement pooling.
                   boolean supportsStoredFunctionsUsingCallSyntax()
                            Retrieves whether this database supports invoking user-defined or vendor functions using the stored procedure escape syntax.
                   boolean supportsStoredProcedures()
                            Retrieves whether this database supports stored procedure calls that use the stored procedure escape syntax.
                   boolean supportsSubqueriesInComparisons()
                            Retrieves whether this database supports subqueries in comparison expressions.
                   boolean supportsSubqueriesInExists()
                            Retrieves whether this database supports subqueries in EXISTS expressions.
                   boolean supportsSubqueriesInIns()
                            (JDBC4 correction:) Retrieves whether this database supports subqueries in IN expressions.
                   boolean supportsSubqueriesInQuantifieds()
                            Retrieves whether this database supports subqueries in quantified expressions.
                   boolean supportsTableCorrelationNames()
                            Retrieves whether this database supports table correlation names.
                   boolean supportsTransactionIsolationLevel(int level)
                            Retrieves whether this database supports the given transaction isolation level.
                   boolean supportsTransactions()
                            Retrieves whether this database supports transactions.
                   boolean supportsUnion()
                            Retrieves whether this database supports SQL UNION.
                   boolean supportsUnionAll()
                            Retrieves whether this database supports SQL UNION ALL.
                  <T> T
                  unwrap(Class<T> iface)
                            Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                   boolean updatesAreDetected(int type)
                            Retrieves whether or not a visible row update can be detected by calling the method ResultSet.rowUpdated.
                   boolean usesLocalFilePerTable()
                            Retrieves whether this database uses a file for each table.
                   boolean usesLocalFiles()
                            Retrieves whether this database stores tables in a local file.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Field Detail

                  JDBC_MAJOR

                  public static final int JDBC_MAJOR
                  See Also:
                  Constant Field Values
                  Method Detail

                  allProceduresAreCallable

                  public boolean allProceduresAreCallable()
                                                   throws SQLException
                  Retrieves whether the current user can call all the procedures returned by the method getProcedures.

                  HSQLDB-Specific Information:

                  This method still always returns true.

                  In a future release, the plugin interface may be modified to allow implementors to report different values here, based on their implementations.

                  Specified by:
                  allProceduresAreCallable in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  allTablesAreSelectable

                  public boolean allTablesAreSelectable()
                                                 throws SQLException
                  Retrieves whether the current user can use all the tables returned by the method getTables in a SELECT statement.

                  HSQLDB-Specific Information:

                  HSQLDB always reports true.

                  Please note that the default HSQLDB getTables behaviour is omit from the list of requested tables only those to which the invoking user has no access of any kind.

                  Specified by:
                  allTablesAreSelectable in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  getURL

                  public String getURL()
                                throws SQLException
                  Retrieves the URL for this DBMS.

                  Specified by:
                  getURL in interface DatabaseMetaData
                  Returns:
                  the URL for this DBMS or null if it cannot be generated
                  Throws:
                  SQLException - if a database access error occurs

                  getUserName

                  public String getUserName()
                                     throws SQLException
                  Retrieves the user name as known to this database.

                  Specified by:
                  getUserName in interface DatabaseMetaData
                  Returns:
                  the database user name
                  Throws:
                  SQLException - if a database access error occurs

                  isReadOnly

                  public boolean isReadOnly()
                                     throws SQLException
                  Retrieves whether this database is in read-only mode.

                  HSQLDB-Specific Information:

                  Starting with 1.7.2, this makes an SQL call to the new isReadOnlyDatabase function which provides correct determination of the read-only status for both local and remote database instances.

                  Specified by:
                  isReadOnly in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  nullsAreSortedHigh

                  public boolean nullsAreSortedHigh()
                                             throws SQLException
                  Retrieves whether NULL values are sorted high. Sorted high means that NULL values sort higher than any other value in a domain. In an ascending order, if this method returns true, NULL values will appear at the end. By contrast, the method nullsAreSortedAtEnd indicates whether NULL values are sorted at the end regardless of sort order.

                  HSQLDB-Specific Information:

                  By default HSQLDB sorts null at start; this method always returns false.

                  Specified by:
                  nullsAreSortedHigh in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  nullsAreSortedLow

                  public boolean nullsAreSortedLow()
                                            throws SQLException
                  Retrieves whether NULL values are sorted low. Sorted low means that NULL values sort lower than any other value in a domain. In an ascending order, if this method returns true, NULL values will appear at the beginning. By contrast, the method nullsAreSortedAtStart indicates whether NULL values are sorted at the beginning regardless of sort order.

                  HSQLDB-Specific Information:

                  By default HSQLDB sorts null at the start; this method always returns false.

                  Specified by:
                  nullsAreSortedLow in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  nullsAreSortedAtStart

                  public boolean nullsAreSortedAtStart()
                                                throws SQLException
                  Retrieves whether NULL values are sorted at the start regardless of sort order.

                  HSQLDB-Specific Information:

                  By default HSQLDB sorts null at the start; this method always returns true. Use NULLS LAST in the ORDER BY clause to sort null at the end.

                  Specified by:
                  nullsAreSortedAtStart in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  nullsAreSortedAtEnd

                  public boolean nullsAreSortedAtEnd()
                                              throws SQLException
                  Retrieves whether NULL values are sorted at the end regardless of sort order.

                  HSQLDB-Specific Information:

                  By default HSQLDB sorts null at the start; this method always returns true.

                  Specified by:
                  nullsAreSortedAtEnd in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  getDatabaseProductName

                  public String getDatabaseProductName()
                                                throws SQLException
                  Retrieves the name of this database product.

                  HSQLDB-Specific Information:

                  Returns the name of the HSQLDB engine.

                  Specified by:
                  getDatabaseProductName in interface DatabaseMetaData
                  Returns:
                  database product name
                  Throws:
                  SQLException - if a database access error occurs

                  getDatabaseProductVersion

                  public String getDatabaseProductVersion()
                                                   throws SQLException
                  Retrieves the version number of this database product.

                  HSQLDB-Specific Information:

                  Returns the full version string.

                  Specified by:
                  getDatabaseProductVersion in interface DatabaseMetaData
                  Returns:
                  database version number
                  Throws:
                  SQLException - if a database access error occurs

                  getDriverName

                  public String getDriverName()
                                       throws SQLException
                  Retrieves the name of this JDBC driver.

                  Specified by:
                  getDriverName in interface DatabaseMetaData
                  Returns:
                  JDBC driver name
                  Throws:
                  SQLException - if a database access error occurs

                  getDriverVersion

                  public String getDriverVersion()
                                          throws SQLException
                  Retrieves the version number of this JDBC driver as a String.

                  Specified by:
                  getDriverVersion in interface DatabaseMetaData
                  Returns:
                  JDBC driver version
                  Throws:
                  SQLException - if a database access error occurs

                  getDriverMajorVersion

                  public int getDriverMajorVersion()
                  Retrieves this JDBC driver's major version number.

                  Specified by:
                  getDriverMajorVersion in interface DatabaseMetaData
                  Returns:
                  JDBC driver major version

                  getDriverMinorVersion

                  public int getDriverMinorVersion()
                  Retrieves this JDBC driver's minor version number.

                  Specified by:
                  getDriverMinorVersion in interface DatabaseMetaData
                  Returns:
                  JDBC driver minor version number

                  usesLocalFiles

                  public boolean usesLocalFiles()
                                         throws SQLException
                  Retrieves whether this database stores tables in a local file.

                  HSQLDB-Specific Information:

                  From HSQLDB 1.7.2 it is assumed that this refers to data being stored by the JDBC client. This method always returns false.

                  Specified by:
                  usesLocalFiles in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  usesLocalFilePerTable

                  public boolean usesLocalFilePerTable()
                                                throws SQLException
                  Retrieves whether this database uses a file for each table.

                  HSQLDB-Specific Information:

                  HSQLDB does not use a file for each table. This method always returns false.

                  Specified by:
                  usesLocalFilePerTable in interface DatabaseMetaData
                  Returns:
                  true if this database uses a local file for each table; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsMixedCaseIdentifiers

                  public boolean supportsMixedCaseIdentifiers()
                                                       throws SQLException
                  Retrieves whether this database treats mixed case unquoted SQL identifiers as case sensitive and as a result stores them in mixed case.

                  HSQLDB-Specific Information:

                  HSQLDB treats unquoted identifiers as case insensitive and stores them in upper case. It treats quoted identifiers as case sensitive and stores them verbatim; this method always returns false.

                  Specified by:
                  supportsMixedCaseIdentifiers in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  storesUpperCaseIdentifiers

                  public boolean storesUpperCaseIdentifiers()
                                                     throws SQLException
                  Retrieves whether this database treats mixed case unquoted SQL identifiers as case insensitive and stores them in upper case.

                  HSQLDB-Specific Information:

                  HSQLDB treats unquoted identifiers as case insensitive and stores them in upper case. It treats quoted identifiers as case sensitive and stores them verbatim; this method always returns true.

                  Specified by:
                  storesUpperCaseIdentifiers in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  storesLowerCaseIdentifiers

                  public boolean storesLowerCaseIdentifiers()
                                                     throws SQLException
                  Retrieves whether this database treats mixed case unquoted SQL identifiers as case insensitive and stores them in lower case.

                  HSQLDB-Specific Information:

                  HSQLDB treats unquoted identifiers as case insensitive and stores them in upper case. It treats quoted identifiers as case sensitive and stores them verbatim; this method always returns false.

                  Specified by:
                  storesLowerCaseIdentifiers in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  storesMixedCaseIdentifiers

                  public boolean storesMixedCaseIdentifiers()
                                                     throws SQLException
                  Retrieves whether this database treats mixed case unquoted SQL identifiers as case insensitive and stores them in mixed case.

                  HSQLDB-Specific Information:

                  HSQLDB treats unquoted identifiers as case insensitive and stores them in upper case. It treats quoted identifiers as case sensitive and stores them verbatim; this method always returns false.

                  Specified by:
                  storesMixedCaseIdentifiers in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsMixedCaseQuotedIdentifiers

                  public boolean supportsMixedCaseQuotedIdentifiers()
                                                             throws SQLException
                  Retrieves whether this database treats mixed case quoted SQL identifiers as case sensitive and as a result stores them in mixed case.

                  HSQLDB-Specific Information:

                  HSQLDB treats unquoted identifiers as case insensitive and stores them in upper case. It treats quoted identifiers as case sensitive and stores them verbatim; this method always returns true.

                  Specified by:
                  supportsMixedCaseQuotedIdentifiers in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  storesUpperCaseQuotedIdentifiers

                  public boolean storesUpperCaseQuotedIdentifiers()
                                                           throws SQLException
                  Retrieves whether this database treats mixed case quoted SQL identifiers as case insensitive and stores them in upper case.

                  HSQLDB-Specific Information:

                  HSQLDB treats unquoted identifiers as case insensitive and stores them in upper case. It treats quoted identifiers as case sensitive and stores them verbatim; this method always returns false.

                  Specified by:
                  storesUpperCaseQuotedIdentifiers in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  storesLowerCaseQuotedIdentifiers

                  public boolean storesLowerCaseQuotedIdentifiers()
                                                           throws SQLException
                  Retrieves whether this database treats mixed case quoted SQL identifiers as case insensitive and stores them in lower case.

                  HSQLDB-Specific Information:

                  HSQLDB treats unquoted identifiers as case insensitive and stores them in upper case. It treats quoted identifiers as case sensitive and stores them verbatim; this method always returns false.

                  Specified by:
                  storesLowerCaseQuotedIdentifiers in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  storesMixedCaseQuotedIdentifiers

                  public boolean storesMixedCaseQuotedIdentifiers()
                                                           throws SQLException
                  Retrieves whether this database treats mixed case quoted SQL identifiers as case insensitive and stores them in mixed case.

                  HSQLDB-Specific Information:

                  HSQLDB treats unquoted identifiers as case insensitive and stores them in upper case. It treats quoted identifiers as case sensitive and stores them verbatim; this method always returns false.

                  Specified by:
                  storesMixedCaseQuotedIdentifiers in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  getIdentifierQuoteString

                  public String getIdentifierQuoteString()
                                                  throws SQLException
                  Retrieves the string used to quote SQL identifiers. This method returns a space " " if identifier quoting is not supported.

                  HSQLDB-Specific Information:

                  HSQLDB uses the standard SQL identifier quote character (the double quote character); this method always returns ".

                  Specified by:
                  getIdentifierQuoteString in interface DatabaseMetaData
                  Returns:
                  the quoting string or a space if quoting is not supported
                  Throws:
                  SQLException - if a database access error occurs

                  getSQLKeywords

                  public String getSQLKeywords()
                                        throws SQLException
                  Retrieves a comma-separated list of all of this database's SQL keywords that are NOT also SQL:2003 keywords. (JDBC4 modified => SQL:2003)

                  HSQLDB-Specific Information:

                  The list is empty. However, HSQLDB also supports SQL:2008 keywords and disallows them for database object names without double quoting.

                  Specified by:
                  getSQLKeywords in interface DatabaseMetaData
                  Returns:
                  the list of this database's keywords that are not also SQL:2003 keywords (JDBC4 modified => SQL:2003)
                  Throws:
                  SQLException - if a database access error occurs

                  getNumericFunctions

                  public String getNumericFunctions()
                                             throws SQLException
                  Retrieves a comma-separated list of math functions available with this database. These are the Open /Open CLI math function names used in the JDBC function escape clause.

                  Specified by:
                  getNumericFunctions in interface DatabaseMetaData
                  Returns:
                  the list of math functions supported by this database
                  Throws:
                  SQLException - if a database access error occurs

                  getStringFunctions

                  public String getStringFunctions()
                                            throws SQLException
                  Retrieves a comma-separated list of string functions available with this database. These are the Open Group CLI string function names used in the JDBC function escape clause.

                  Specified by:
                  getStringFunctions in interface DatabaseMetaData
                  Returns:
                  the list of string functions supported by this database
                  Throws:
                  SQLException - if a database access error occurs

                  getSystemFunctions

                  public String getSystemFunctions()
                                            throws SQLException
                  Retrieves a comma-separated list of system functions available with this database. These are the Open Group CLI system function names used in the JDBC function escape clause.

                  Specified by:
                  getSystemFunctions in interface DatabaseMetaData
                  Returns:
                  a list of system functions supported by this database
                  Throws:
                  SQLException - if a database access error occurs

                  getTimeDateFunctions

                  public String getTimeDateFunctions()
                                              throws SQLException
                  Retrieves a comma-separated list of the time and date functions available with this database.

                  Specified by:
                  getTimeDateFunctions in interface DatabaseMetaData
                  Returns:
                  the list of time and date functions supported by this database
                  Throws:
                  SQLException - if a database access error occurs

                  getSearchStringEscape

                  public String getSearchStringEscape()
                                               throws SQLException
                  Retrieves the string that can be used to escape wildcard characters. This is the string that can be used to escape '_' or '%' in the catalog search parameters that are a pattern (and therefore use one of the wildcard characters).

                  The '_' character represents any single character; the '%' character represents any sequence of zero or more characters.

                  HSQLDB-Specific Information:

                  HSQLDB uses the "\" character to escape wildcard characters.

                  Specified by:
                  getSearchStringEscape in interface DatabaseMetaData
                  Returns:
                  the string used to escape wildcard characters
                  Throws:
                  SQLException - if a database access error occurs

                  getExtraNameCharacters

                  public String getExtraNameCharacters()
                                                throws SQLException
                  Retrieves all the "extra" characters that can be used in unquoted identifier names (those beyond a-z, A-Z, 0-9 and _).

                  HSQLDB-Specific Information:

                  HSQLDB does not support using any "extra" characters in unquoted identifier names; this method always returns the empty String.

                  Specified by:
                  getExtraNameCharacters in interface DatabaseMetaData
                  Returns:
                  the string containing the extra characters
                  Throws:
                  SQLException - if a database access error occurs

                  supportsAlterTableWithAddColumn

                  public boolean supportsAlterTableWithAddColumn()
                                                          throws SQLException
                  Retrieves whether this database supports ALTER TABLE with add column.

                  HSQLDB-Specific Information:

                  From 1.7.0, HSQLDB supports this type of ALTER TABLE statement; this method always returns true.

                  Specified by:
                  supportsAlterTableWithAddColumn in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsAlterTableWithDropColumn

                  public boolean supportsAlterTableWithDropColumn()
                                                           throws SQLException
                  Retrieves whether this database supports ALTER TABLE with drop column.

                  HSQLDB-Specific Information:

                  From 1.7.0, HSQLDB supports this type of ALTER TABLE statement; this method always returns true.

                  Specified by:
                  supportsAlterTableWithDropColumn in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsColumnAliasing

                  public boolean supportsColumnAliasing()
                                                 throws SQLException
                  Retrieves whether this database supports column aliasing.

                  If so, the SQL AS clause can be used to provide names for computed columns or to provide alias names for columns as required.

                  HSQLDB-Specific Information:

                  HSQLDB supports column aliasing; this method always returns true.

                  Specified by:
                  supportsColumnAliasing in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  nullPlusNonNullIsNull

                  public boolean nullPlusNonNullIsNull()
                                                throws SQLException
                  Retrieves whether this database supports concatenations between NULL and non-NULL values being NULL.

                  HSQLDB-Specific Information:

                  HSQLDB supports this; this method always returns true.

                  Specified by:
                  nullPlusNonNullIsNull in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsConvert

                  public boolean supportsConvert()
                                          throws SQLException
                  (JDBC4 clarification:) Retrieves whether this database supports the JDBC scalar function CONVERT for the conversion of one JDBC type to another. The JDBC types are the generic SQL data types defined in java.sql.Types.

                  HSQLDB-Specific Information:

                  HSQLDB supports conversions; this method always returns true.

                  Specified by:
                  supportsConvert in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsConvert

                  public boolean supportsConvert(int fromType,
                                                 int toType)
                                          throws SQLException
                  (JDBC4 clarification:) Retrieves whether this database supports the JDBC scalar function CONVERT for conversions between the JDBC types fromType and toType. The JDBC types are the generic SQL data types defined in java.sql.Types.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports conversion according to SQL standards. In addition, it supports conversion between values of BOOLEAN and BIT types.

                  Specified by:
                  supportsConvert in interface DatabaseMetaData
                  Parameters:
                  fromType - the type to convert from; one of the type codes from the class java.sql.Types
                  toType - the type to convert to; one of the type codes from the class java.sql.Types
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  Types

                  supportsTableCorrelationNames

                  public boolean supportsTableCorrelationNames()
                                                        throws SQLException
                  Retrieves whether this database supports table correlation names.

                  HSQLDB-Specific Information:

                  HSQLDB supports table correlation names; this method always returns true.

                  Specified by:
                  supportsTableCorrelationNames in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsDifferentTableCorrelationNames

                  public boolean supportsDifferentTableCorrelationNames()
                                                                 throws SQLException
                  Retrieves whether, when table correlation names are supported, they are restricted to being different from the names of the tables.

                  HSQLDB-Specific Information:

                  HSQLDB requires that table correlation names are different from the names of the tables; this method always returns true.

                  Specified by:
                  supportsDifferentTableCorrelationNames in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsExpressionsInOrderBy

                  public boolean supportsExpressionsInOrderBy()
                                                       throws SQLException
                  Retrieves whether this database supports expressions in ORDER BY lists.

                  HSQLDB-Specific Information:

                  HSQLDB supports expressions in ORDER BY lists; this method always returns true.

                  Specified by:
                  supportsExpressionsInOrderBy in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsOrderByUnrelated

                  public boolean supportsOrderByUnrelated()
                                                   throws SQLException
                  Retrieves whether this database supports using a column that is not in the SELECT statement in an ORDER BY clause.

                  HSQLDB-Specific Information:

                  HSQLDB supports using a column that is not in the SELECT statement in an ORDER BY clause; this method always returns true.

                  Specified by:
                  supportsOrderByUnrelated in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsGroupBy

                  public boolean supportsGroupBy()
                                          throws SQLException
                  Retrieves whether this database supports some form of GROUP BY clause.

                  HSQLDB-Specific Information:

                  HSQLDB supports using the GROUP BY clause; this method always returns true.

                  Specified by:
                  supportsGroupBy in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsGroupByUnrelated

                  public boolean supportsGroupByUnrelated()
                                                   throws SQLException
                  Retrieves whether this database supports using a column that is not in the SELECT statement in a GROUP BY clause.

                  HSQLDB-Specific Information:

                  HSQLDB supports using a column that is not in the SELECT statement in a GROUP BY clause; this method always returns true.

                  Specified by:
                  supportsGroupByUnrelated in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsGroupByBeyondSelect

                  public boolean supportsGroupByBeyondSelect()
                                                      throws SQLException
                  Retrieves whether this database supports using columns not included in the SELECT statement in a GROUP BY clause provided that all of the columns in the SELECT statement are included in the GROUP BY clause.

                  HSQLDB-Specific Information:

                  HSQLDB supports using columns not included in the SELECT statement in a GROUP BY clause provided that all of the columns in the SELECT statement are included in the GROUP BY clause; this method always returns true.

                  Specified by:
                  supportsGroupByBeyondSelect in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsLikeEscapeClause

                  public boolean supportsLikeEscapeClause()
                                                   throws SQLException
                  Retrieves whether this database supports specifying a LIKE escape clause.

                  HSQLDB-Specific Information:

                  HSQLDB supports specifying a LIKE escape clause; this method always returns true.

                  Specified by:
                  supportsLikeEscapeClause in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsMultipleResultSets

                  public boolean supportsMultipleResultSets()
                                                     throws SQLException
                  Retrieves whether this database supports getting multiple ResultSet objects from a single call to the method execute.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports getting multiple ResultSet objects from a single call to the method execute of the CallableStatement interface; this method returns true.

                  Specified by:
                  supportsMultipleResultSets in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsMultipleTransactions

                  public boolean supportsMultipleTransactions()
                                                       throws SQLException
                  Retrieves whether this database allows having multiple transactions open at once (on different connections).

                  HSQLDB-Specific Information:

                  HSQLDB allows having multiple transactions open at once (on different connections); this method always returns true.

                  Specified by:
                  supportsMultipleTransactions in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsNonNullableColumns

                  public boolean supportsNonNullableColumns()
                                                     throws SQLException
                  Retrieves whether columns in this database may be defined as non-nullable.

                  HSQLDB-Specific Information:

                  HSQLDB supports the specification of non-nullable columns; this method always returns true.

                  Specified by:
                  supportsNonNullableColumns in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsMinimumSQLGrammar

                  public boolean supportsMinimumSQLGrammar()
                                                    throws SQLException
                  Retrieves whether this database supports the ODBC Minimum SQL grammar.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports the ODBC Minimum SQL grammar; this method always returns true.

                  Specified by:
                  supportsMinimumSQLGrammar in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsCoreSQLGrammar

                  public boolean supportsCoreSQLGrammar()
                                                 throws SQLException
                  Retrieves whether this database supports the ODBC Core SQL grammar.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports the ODBC Core SQL grammar; this method always returns true.

                  Specified by:
                  supportsCoreSQLGrammar in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsExtendedSQLGrammar

                  public boolean supportsExtendedSQLGrammar()
                                                     throws SQLException
                  Retrieves whether this database supports the ODBC Extended SQL grammar.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports the ODBC Extended SQL grammar; this method always returns true.

                  Specified by:
                  supportsExtendedSQLGrammar in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsANSI92EntryLevelSQL

                  public boolean supportsANSI92EntryLevelSQL()
                                                      throws SQLException
                  Retrieves whether this database supports the ANSI92 entry level SQL grammar.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports the ANSI92 entry level SQL grammar; this method always returns true.

                  Specified by:
                  supportsANSI92EntryLevelSQL in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsANSI92IntermediateSQL

                  public boolean supportsANSI92IntermediateSQL()
                                                        throws SQLException
                  Retrieves whether this database supports the ANSI92 intermediate SQL grammar supported.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports the ANSI92 intermediate SQL grammar; this method always returns true.

                  Specified by:
                  supportsANSI92IntermediateSQL in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsANSI92FullSQL

                  public boolean supportsANSI92FullSQL()
                                                throws SQLException
                  Retrieves whether this database supports the ANSI92 full SQL grammar supported.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports the ANSI92 full SQL grammar. The exceptions, such as support for ASSERTION, are not considered grammer issues. This method always returns true.

                  Specified by:
                  supportsANSI92FullSQL in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsIntegrityEnhancementFacility

                  public boolean supportsIntegrityEnhancementFacility()
                                                               throws SQLException
                  Retrieves whether this database supports the SQL Integrity Enhancement Facility.

                  HSQLDB-Specific Information:

                  This method always returns true.

                  Specified by:
                  supportsIntegrityEnhancementFacility in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsOuterJoins

                  public boolean supportsOuterJoins()
                                             throws SQLException
                  Retrieves whether this database supports some form of outer join.

                  HSQLDB-Specific Information:

                  HSQLDB supports outer joins; this method always returns true.

                  Specified by:
                  supportsOuterJoins in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsFullOuterJoins

                  public boolean supportsFullOuterJoins()
                                                 throws SQLException
                  Retrieves whether this database supports full nested outer joins.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports full nested outer joins; this method always returns true.

                  Specified by:
                  supportsFullOuterJoins in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsLimitedOuterJoins

                  public boolean supportsLimitedOuterJoins()
                                                    throws SQLException
                  Retrieves whether this database provides limited support for outer joins. (This will be true if the method supportsFullOuterJoins returns true).

                  HSQLDB-Specific Information:

                  HSQLDB supports the LEFT OUTER join syntax; this method always returns true.

                  Specified by:
                  supportsLimitedOuterJoins in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  getSchemaTerm

                  public String getSchemaTerm()
                                       throws SQLException
                  Retrieves the database vendor's preferred term for "schema".

                  HSQLDB-Specific Information:

                  Starting with 1.8.0, HSQLDB supports schemas.

                  Specified by:
                  getSchemaTerm in interface DatabaseMetaData
                  Returns:
                  the vendor term for "schema"
                  Throws:
                  SQLException - if a database access error occurs

                  getProcedureTerm

                  public String getProcedureTerm()
                                          throws SQLException
                  Retrieves the database vendor's preferred term for "procedure".

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports declaration of functions or procedures directly in SQL.

                  Specified by:
                  getProcedureTerm in interface DatabaseMetaData
                  Returns:
                  the vendor term for "procedure"
                  Throws:
                  SQLException - if a database access error occurs

                  getCatalogTerm

                  public String getCatalogTerm()
                                        throws SQLException
                  Retrieves the database vendor's preferred term for "catalog".

                  HSQLDB-Specific Information:

                  HSQLDB uses the standard name CATALOG.

                  Specified by:
                  getCatalogTerm in interface DatabaseMetaData
                  Returns:
                  the vendor term for "catalog"
                  Throws:
                  SQLException - if a database access error occurs

                  isCatalogAtStart

                  public boolean isCatalogAtStart()
                                           throws SQLException
                  Retrieves whether a catalog appears at the start of a fully qualified table name. If not, the catalog appears at the end.

                  HSQLDB-Specific Information:

                  When allowed, a catalog appears at the start of a fully qualified table name; this method always returns true.

                  Specified by:
                  isCatalogAtStart in interface DatabaseMetaData
                  Returns:
                  true if the catalog name appears at the beginning of a fully qualified table name; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  getCatalogSeparator

                  public String getCatalogSeparator()
                                             throws SQLException
                  Retrieves the String that this database uses as the separator between a catalog and table name.

                  HSQLDB-Specific Information:

                  When used, a catalog name is separated with period; this method always returns a period

                  Specified by:
                  getCatalogSeparator in interface DatabaseMetaData
                  Returns:
                  the separator string
                  Throws:
                  SQLException - if a database access error occurs

                  supportsSchemasInDataManipulation

                  public boolean supportsSchemasInDataManipulation()
                                                            throws SQLException
                  Retrieves whether a schema name can be used in a data manipulation statement.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports schemas where allowed by the standard; this method always returns true.

                  Specified by:
                  supportsSchemasInDataManipulation in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsSchemasInProcedureCalls

                  public boolean supportsSchemasInProcedureCalls()
                                                          throws SQLException
                  Retrieves whether a schema name can be used in a procedure call statement.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports schemas where allowed by the standard; this method always returns true.

                  Specified by:
                  supportsSchemasInProcedureCalls in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsSchemasInTableDefinitions

                  public boolean supportsSchemasInTableDefinitions()
                                                            throws SQLException
                  Retrieves whether a schema name can be used in a table definition statement.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports schemas where allowed by the standard; this method always returns true.

                  Specified by:
                  supportsSchemasInTableDefinitions in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsSchemasInIndexDefinitions

                  public boolean supportsSchemasInIndexDefinitions()
                                                            throws SQLException
                  Retrieves whether a schema name can be used in an index definition statement.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports schemas where allowed by the standard; this method always returns true.

                  Specified by:
                  supportsSchemasInIndexDefinitions in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsSchemasInPrivilegeDefinitions

                  public boolean supportsSchemasInPrivilegeDefinitions()
                                                                throws SQLException
                  Retrieves whether a schema name can be used in a privilege definition statement.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports schemas where allowed by the standard; this method always returns true.

                  Specified by:
                  supportsSchemasInPrivilegeDefinitions in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsCatalogsInDataManipulation

                  public boolean supportsCatalogsInDataManipulation()
                                                             throws SQLException
                  Retrieves whether a catalog name can be used in a data manipulation statement.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports catalog names where allowed by the standard; this method always returns true.

                  Specified by:
                  supportsCatalogsInDataManipulation in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsCatalogsInProcedureCalls

                  public boolean supportsCatalogsInProcedureCalls()
                                                           throws SQLException
                  Retrieves whether a catalog name can be used in a procedure call statement.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports catalog names where allowed by the standard; this method always returns true.

                  Specified by:
                  supportsCatalogsInProcedureCalls in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsCatalogsInTableDefinitions

                  public boolean supportsCatalogsInTableDefinitions()
                                                             throws SQLException
                  Retrieves whether a catalog name can be used in a table definition statement.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports catalog names where allowed by the standard; this method always returns true.

                  Specified by:
                  supportsCatalogsInTableDefinitions in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsCatalogsInIndexDefinitions

                  public boolean supportsCatalogsInIndexDefinitions()
                                                             throws SQLException
                  Retrieves whether a catalog name can be used in an index definition statement.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports catalog names where allowed by the standard; this method always returns true.

                  Specified by:
                  supportsCatalogsInIndexDefinitions in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsCatalogsInPrivilegeDefinitions

                  public boolean supportsCatalogsInPrivilegeDefinitions()
                                                                 throws SQLException
                  Retrieves whether a catalog name can be used in a privilege definition statement.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports catalog names where allowed by the standard; this method always returns true.

                  Specified by:
                  supportsCatalogsInPrivilegeDefinitions in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsPositionedDelete

                  public boolean supportsPositionedDelete()
                                                   throws SQLException
                  Retrieves whether this database supports positioned DELETE statements.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports updateable result sets; this method always returns true.

                  Specified by:
                  supportsPositionedDelete in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsPositionedUpdate

                  public boolean supportsPositionedUpdate()
                                                   throws SQLException
                  Retrieves whether this database supports positioned UPDATE statements.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports updateable result sets; this method always returns true.

                  Specified by:
                  supportsPositionedUpdate in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsSelectForUpdate

                  public boolean supportsSelectForUpdate()
                                                  throws SQLException
                  Retrieves whether this database supports SELECT FOR UPDATE statements.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports updateable result sets; this method always returns true.

                  Specified by:
                  supportsSelectForUpdate in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsStoredProcedures

                  public boolean supportsStoredProcedures()
                                                   throws SQLException
                  Retrieves whether this database supports stored procedure calls that use the stored procedure escape syntax.

                  HSQLDB-Specific Information:

                  HSQLDB supports calling public static Java methods in the context of SQL Stored Procedures; this method always returns true.

                  Specified by:
                  supportsStoredProcedures in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  JDBCParameterMetaData, JDBCConnection.prepareCall(java.lang.String)

                  supportsSubqueriesInComparisons

                  public boolean supportsSubqueriesInComparisons()
                                                          throws SQLException
                  Retrieves whether this database supports subqueries in comparison expressions.

                  HSQLDB-Specific Information:

                  HSQLDB has always supported subqueries in comparison expressions; this method always returns true.

                  Specified by:
                  supportsSubqueriesInComparisons in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsSubqueriesInExists

                  public boolean supportsSubqueriesInExists()
                                                     throws SQLException
                  Retrieves whether this database supports subqueries in EXISTS expressions.

                  HSQLDB-Specific Information:

                  HSQLDB has always supported subqueries in EXISTS expressions; this method always returns true.

                  Specified by:
                  supportsSubqueriesInExists in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsSubqueriesInIns

                  public boolean supportsSubqueriesInIns()
                                                  throws SQLException
                  (JDBC4 correction:) Retrieves whether this database supports subqueries in IN expressions.

                  HSQLDB-Specific Information:

                  HSQLDB has always supported subqueries in IN statements; this method always returns true.

                  Specified by:
                  supportsSubqueriesInIns in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsSubqueriesInQuantifieds

                  public boolean supportsSubqueriesInQuantifieds()
                                                          throws SQLException
                  Retrieves whether this database supports subqueries in quantified expressions.

                  HSQLDB-Specific Information:

                  HSQLDB has always supported subqueries in quantified expressions; this method always returns true.

                  Specified by:
                  supportsSubqueriesInQuantifieds in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsCorrelatedSubqueries

                  public boolean supportsCorrelatedSubqueries()
                                                       throws SQLException
                  Retrieves whether this database supports correlated subqueries.

                  HSQLDB-Specific Information:

                  HSQLDB has always supported correlated subqueries; this method always returns true.

                  Specified by:
                  supportsCorrelatedSubqueries in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsUnion

                  public boolean supportsUnion()
                                        throws SQLException
                  Retrieves whether this database supports SQL UNION.

                  HSQLDB-Specific Information:

                  HSQLDB supports SQL UNION; this method always returns true.

                  Specified by:
                  supportsUnion in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsUnionAll

                  public boolean supportsUnionAll()
                                           throws SQLException
                  Retrieves whether this database supports SQL UNION ALL.

                  HSQLDB-Specific Information:

                  HSQLDB supports SQL UNION ALL; this method always returns true.

                  Specified by:
                  supportsUnionAll in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsOpenCursorsAcrossCommit

                  public boolean supportsOpenCursorsAcrossCommit()
                                                          throws SQLException
                  Retrieves whether this database supports keeping cursors open across commits.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports keeping cursors open across commits. This method always returns true.

                  Specified by:
                  supportsOpenCursorsAcrossCommit in interface DatabaseMetaData
                  Returns:
                  true if cursors always remain open; false if they might not remain open
                  Throws:
                  SQLException - if a database access error occurs

                  supportsOpenCursorsAcrossRollback

                  public boolean supportsOpenCursorsAcrossRollback()
                                                            throws SQLException
                  Retrieves whether this database supports keeping cursors open across rollbacks.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 closes open cursors at rollback. This method always returns false.

                  Specified by:
                  supportsOpenCursorsAcrossRollback in interface DatabaseMetaData
                  Returns:
                  true if cursors always remain open; false if they might not remain open
                  Throws:
                  SQLException - if a database access error occurs

                  supportsOpenStatementsAcrossCommit

                  public boolean supportsOpenStatementsAcrossCommit()
                                                             throws SQLException
                  Retrieves whether this database supports keeping statements open across commits.

                  HSQLDB-Specific Information:

                  HSQLDB supports keeping statements open across commits; this method always returns true.

                  Specified by:
                  supportsOpenStatementsAcrossCommit in interface DatabaseMetaData
                  Returns:
                  true if statements always remain open; false if they might not remain open
                  Throws:
                  SQLException - if a database access error occurs

                  supportsOpenStatementsAcrossRollback

                  public boolean supportsOpenStatementsAcrossRollback()
                                                               throws SQLException
                  Retrieves whether this database supports keeping statements open across rollbacks.

                  HSQLDB-Specific Information:

                  HSQLDB supports keeping statements open across rollbacks; this method always returns true.

                  Specified by:
                  supportsOpenStatementsAcrossRollback in interface DatabaseMetaData
                  Returns:
                  true if statements always remain open; false if they might not remain open
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxBinaryLiteralLength

                  public int getMaxBinaryLiteralLength()
                                                throws SQLException
                  Retrieves the maximum number of hex characters this database allows in an inline binary literal.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory availabily; this method always returns 0.

                  Specified by:
                  getMaxBinaryLiteralLength in interface DatabaseMetaData
                  Returns:
                  max the maximum length (in hex characters) for a binary literal; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxCharLiteralLength

                  public int getMaxCharLiteralLength()
                                              throws SQLException
                  Retrieves the maximum number of characters this database allows for a character literal.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory availabily; this method always returns 0.

                  Specified by:
                  getMaxCharLiteralLength in interface DatabaseMetaData
                  Returns:
                  the maximum number of characters allowed for a character literal; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxColumnNameLength

                  public int getMaxColumnNameLength()
                                             throws SQLException
                  Retrieves the maximum number of characters this database allows for a column name.

                  HSQLDB-Specific Information:

                  Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for all names.

                  Specified by:
                  getMaxColumnNameLength in interface DatabaseMetaData
                  Returns:
                  the maximum number of characters allowed for a column name; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxColumnsInGroupBy

                  public int getMaxColumnsInGroupBy()
                                             throws SQLException
                  Retrieves the maximum number of columns this database allows in a GROUP BY clause.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory availabily; this method always returns 0.

                  Specified by:
                  getMaxColumnsInGroupBy in interface DatabaseMetaData
                  Returns:
                  the maximum number of columns allowed; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxColumnsInIndex

                  public int getMaxColumnsInIndex()
                                           throws SQLException
                  Retrieves the maximum number of columns this database allows in an index.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory availabily; this method always returns 0.

                  Specified by:
                  getMaxColumnsInIndex in interface DatabaseMetaData
                  Returns:
                  the maximum number of columns allowed; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxColumnsInOrderBy

                  public int getMaxColumnsInOrderBy()
                                             throws SQLException
                  Retrieves the maximum number of columns this database allows in an ORDER BY clause.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory availabily; this method always returns 0.

                  Specified by:
                  getMaxColumnsInOrderBy in interface DatabaseMetaData
                  Returns:
                  the maximum number of columns allowed; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxColumnsInSelect

                  public int getMaxColumnsInSelect()
                                            throws SQLException
                  Retrieves the maximum number of columns this database allows in a SELECT list.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory availabily; this method always returns 0.

                  Specified by:
                  getMaxColumnsInSelect in interface DatabaseMetaData
                  Returns:
                  the maximum number of columns allowed; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxColumnsInTable

                  public int getMaxColumnsInTable()
                                           throws SQLException
                  Retrieves the maximum number of columns this database allows in a table.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory availabily; this method always returns 0.

                  Specified by:
                  getMaxColumnsInTable in interface DatabaseMetaData
                  Returns:
                  the maximum number of columns allowed; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxConnections

                  public int getMaxConnections()
                                        throws SQLException
                  Retrieves the maximum number of concurrent connections to this database that are possible.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory availabily; this method always returns 0.

                  Specified by:
                  getMaxConnections in interface DatabaseMetaData
                  Returns:
                  the maximum number of active connections possible at one time; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxCursorNameLength

                  public int getMaxCursorNameLength()
                                             throws SQLException
                  Retrieves the maximum number of characters that this database allows in a cursor name.

                  HSQLDB-Specific Information:

                  Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for all names.

                  Specified by:
                  getMaxCursorNameLength in interface DatabaseMetaData
                  Returns:
                  the maximum number of characters allowed in a cursor name; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxIndexLength

                  public int getMaxIndexLength()
                                        throws SQLException
                  Retrieves the maximum number of bytes this database allows for an index, including all of the parts of the index.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory and disk availabily; this method always returns 0.

                  Specified by:
                  getMaxIndexLength in interface DatabaseMetaData
                  Returns:
                  the maximum number of bytes allowed; this limit includes the composite of all the constituent parts of the index; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxSchemaNameLength

                  public int getMaxSchemaNameLength()
                                             throws SQLException
                  Retrieves the maximum number of characters that this database allows in a schema name.

                  HSQLDB-Specific Information:

                  Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for all names.

                  Specified by:
                  getMaxSchemaNameLength in interface DatabaseMetaData
                  Returns:
                  the maximum number of characters allowed in a schema name; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxProcedureNameLength

                  public int getMaxProcedureNameLength()
                                                throws SQLException
                  Retrieves the maximum number of characters that this database allows in a procedure name.

                  HSQLDB-Specific Information:

                  Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for all names.

                  Specified by:
                  getMaxProcedureNameLength in interface DatabaseMetaData
                  Returns:
                  the maximum number of characters allowed in a procedure name; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxCatalogNameLength

                  public int getMaxCatalogNameLength()
                                              throws SQLException
                  Retrieves the maximum number of characters that this database allows in a catalog name.

                  HSQLDB-Specific Information:

                  Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for all names.

                  Specified by:
                  getMaxCatalogNameLength in interface DatabaseMetaData
                  Returns:
                  the maximum number of characters allowed in a catalog name; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxRowSize

                  public int getMaxRowSize()
                                    throws SQLException
                  Retrieves the maximum number of bytes this database allows in a single row.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory and disk availabily; this method always returns 0.

                  Specified by:
                  getMaxRowSize in interface DatabaseMetaData
                  Returns:
                  the maximum number of bytes allowed for a row; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  doesMaxRowSizeIncludeBlobs

                  public boolean doesMaxRowSizeIncludeBlobs()
                                                     throws SQLException
                  Retrieves whether the return value for the method getMaxRowSize includes the SQL data types LONGVARCHAR and LONGVARBINARY.

                  HSQLDB-Specific Indormation:

                  Including 2.0, getMaxRowSize() always returns 0, indicating that the maximum row size is unknown or has no limit. This applies to the above types as well; this method always returns true.

                  Specified by:
                  doesMaxRowSizeIncludeBlobs in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxStatementLength

                  public int getMaxStatementLength()
                                            throws SQLException
                  Retrieves the maximum number of characters this database allows in an SQL statement.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory availabily; this method always returns 0.

                  Specified by:
                  getMaxStatementLength in interface DatabaseMetaData
                  Returns:
                  the maximum number of characters allowed for an SQL statement; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxStatements

                  public int getMaxStatements()
                                       throws SQLException
                  Retrieves the maximum number of active statements to this database that can be open at the same time.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory availabily; this method always returns 0.

                  Specified by:
                  getMaxStatements in interface DatabaseMetaData
                  Returns:
                  the maximum number of statements that can be open at one time; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxTableNameLength

                  public int getMaxTableNameLength()
                                            throws SQLException
                  Retrieves the maximum number of characters this database allows in a table name.

                  HSQLDB-Specific Information:

                  Up to and including 1.8.0.x, HSQLDB did not impose a "known" limit. Th hard limit was the maximum length of a java.lang.String (java.lang.Integer.MAX_VALUE); this method always returned 0. Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for all names.

                  Specified by:
                  getMaxTableNameLength in interface DatabaseMetaData
                  Returns:
                  the maximum number of characters allowed for a table name; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxTablesInSelect

                  public int getMaxTablesInSelect()
                                           throws SQLException
                  Retrieves the maximum number of tables this database allows in a SELECT statement.

                  HSQLDB-Specific Information:

                  HSQLDB does not impose a "known" limit. The limit is subject to memory availabily; this method always returns 0.

                  Specified by:
                  getMaxTablesInSelect in interface DatabaseMetaData
                  Returns:
                  the maximum number of tables allowed in a SELECT statement; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxUserNameLength

                  public int getMaxUserNameLength()
                                           throws SQLException
                  Retrieves the maximum number of characters this database allows in a user name.

                  HSQLDB-Specific Information:

                  Starting with 2.0, HSQLDB implements the SQL standard, which is 128 for all names.

                  Specified by:
                  getMaxUserNameLength in interface DatabaseMetaData
                  Returns:
                  the maximum number of characters allowed for a user name; a result of zero means that there is no limit or the limit is not known
                  Throws:
                  SQLException - if a database access error occurs

                  getDefaultTransactionIsolation

                  public int getDefaultTransactionIsolation()
                                                     throws SQLException
                  Retrieves this database's default transaction isolation level. The possible values are defined in java.sql.Connection.

                  HSQLDB-Specific Information

                  Default isolation mode in version 2.0 is TRANSACTION_READ_COMMITED.

                  Specified by:
                  getDefaultTransactionIsolation in interface DatabaseMetaData
                  Returns:
                  the default isolation level
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  JDBCConnection

                  supportsTransactions

                  public boolean supportsTransactions()
                                               throws SQLException
                  Retrieves whether this database supports transactions. If not, invoking the method commit is a noop, and the isolation level is TRANSACTION_NONE.

                  HSQLDB-Specific Information:

                  HSQLDB supports transactions; this method always returns true.

                  Specified by:
                  supportsTransactions in interface DatabaseMetaData
                  Returns:
                  true if transactions are supported; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsTransactionIsolationLevel

                  public boolean supportsTransactionIsolationLevel(int level)
                                                            throws SQLException
                  Retrieves whether this database supports the given transaction isolation level.

                  HSQLDB-Specific Information

                  HSQLDB supports all levels.

                  Specified by:
                  supportsTransactionIsolationLevel in interface DatabaseMetaData
                  Parameters:
                  level - one of the transaction isolation levels defined in java.sql.Connection
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  JDBCConnection

                  supportsDataDefinitionAndDataManipulationTransactions

                  public boolean supportsDataDefinitionAndDataManipulationTransactions()
                                                                                throws SQLException
                  Retrieves whether this database supports both data definition and data manipulation statements within a transaction.

                  HSQLDB-Specific Information:

                  HSQLDB does not support a mix of both data definition and data manipulation statements within a transaction. DDL commits the current transaction before proceding; this method always returns false.

                  Specified by:
                  supportsDataDefinitionAndDataManipulationTransactions in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  supportsDataManipulationTransactionsOnly

                  public boolean supportsDataManipulationTransactionsOnly()
                                                                   throws SQLException
                  Retrieves whether this database supports only data manipulation statements within a transaction.

                  HSQLDB-Specific Information:

                  HSQLDB supports only data manipulation statements within a transaction. DDL commits the current transaction before proceeding, while DML does not; this method always returns true.

                  Specified by:
                  supportsDataManipulationTransactionsOnly in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  dataDefinitionCausesTransactionCommit

                  public boolean dataDefinitionCausesTransactionCommit()
                                                                throws SQLException
                  Retrieves whether a data definition statement within a transaction forces the transaction to commit.

                  HSQLDB-Specific Information:

                  Including 2.0, a data definition statement within a transaction forces the transaction to commit; this method always returns true.

                  Specified by:
                  dataDefinitionCausesTransactionCommit in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  dataDefinitionIgnoredInTransactions

                  public boolean dataDefinitionIgnoredInTransactions()
                                                              throws SQLException
                  Retrieves whether this database ignores a data definition statement within a transaction.

                  HSQLDB-Specific Information:

                  Including 2.0, a data definition statement is not ignored within a transaction. Rather, a data definition statement within a transaction forces the transaction to commit; this method always returns false.

                  Specified by:
                  dataDefinitionIgnoredInTransactions in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  getProcedures

                  public ResultSet getProcedures(String catalog,
                                                 String schemaPattern,
                                                 String procedureNamePattern)
                                          throws SQLException
                  Retrieves a description of the stored procedures available in the given catalog.

                  Only procedure descriptions matching the schema and procedure name criteria are returned. They are ordered by JDBC 4.1[PROCEDURE_CAT,] PROCEDURE_SCHEM, PROCEDURE_NAME and (new to JDBC4)[SPECIFIC_ NAME].

                  Each procedure description has the the following columns:

                  1. PROCEDURE_CAT String => procedure catalog (may be null)
                  2. PROCEDURE_SCHEM String => procedure schema (may be null)
                  3. PROCEDURE_NAME String => procedure name
                  4. reserved for future use (HSQLDB-specific: NUM_INPUT_PARAMS)
                  5. reserved for future use (HSQLDB-specific: NUM_OUTPUT_PARAMS)
                  6. reserved for future use (HSQLDB-specific: NUM_RESULT_SETS)
                  7. REMARKS String => explanatory comment on the procedure
                  8. PROCEDURE_TYPE short => kind of procedure:
                    • procedureResultUnknown - (JDBC4 clarification:) Cannot determine if a return value will be returned
                    • procedureNoResult - (JDBC4 clarification:) Does not return a return value
                    • procedureReturnsResult - (JDBC4 clarification:) Returns a return value
                  9. SPECIFIC_NAME String => (JDBC4 new:) The name which uniquely identifies this procedure within its schema.

                  A user may not have permissions to execute any of the procedures that are returned by getProcedures

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  In version 1.9, the rows returned by this method are based on rows in the INFORMATION_SCHEMA.ROUTINES table.

                  Specified by:
                  getProcedures in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schemaPattern - a schema name pattern; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  procedureNamePattern - a procedure name pattern; must match the procedure name as it is stored in the database
                  Returns:
                  ResultSet - each row is a procedure description
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  getSearchStringEscape()

                  getProcedureColumns

                  public ResultSet getProcedureColumns(String catalog,
                                                       String schemaPattern,
                                                       String procedureNamePattern,
                                                       String columnNamePattern)
                                                throws SQLException
                  Retrieves a description of the given catalog's stored procedure parameter and result columns.

                  Only descriptions matching the schema, procedure and parameter name criteria are returned. They are ordered by JDBC 4.1[PROCEDURE_CAT,] PROCEDURE_SCHEM, PROCEDURE_NAME and SPECIFIC_NAME. Within this, the return value, if any, is first. Next are the parameter descriptions in call order. The column descriptions follow in column number order.

                  Each row in the ResultSet is a parameter description or column description with the following fields:

                  1. PROCEDURE_CAT String => procedure catalog (may be null)
                  2. PROCEDURE_SCHEM String => procedure schema (may be null)
                  3. PROCEDURE_NAME String => procedure name
                  4. COLUMN_NAME String => column/parameter name
                  5. COLUMN_TYPE Short => kind of column/parameter:
                    • procedureColumnUnknown - nobody knows
                    • procedureColumnIn - IN parameter
                    • procedureColumnInOut - INOUT parameter
                    • procedureColumnOut - OUT parameter
                    • procedureColumnReturn - procedure return value
                    • procedureColumnResult - result column in ResultSet
                  6. DATA_TYPE int => SQL type from java.sql.Types
                  7. TYPE_NAME String => SQL type name, for a UDT type the type name is fully qualified
                  8. PRECISION int => precision
                  9. LENGTH int => length in bytes of data
                  10. SCALE short => scale - null is returned for data types where SCALE is not applicable.
                  11. RADIX short => radix
                  12. NULLABLE short => can it contain NULL.
                    • procedureNoNulls - does not allow NULL values
                    • procedureNullable - allows NULL values
                    • procedureNullableUnknown - nullability unknown
                  13. REMARKS String => comment describing parameter/column
                  14. COLUMN_DEF String => default value for the column, which should be interpreted as a string when the value is enclosed in single quotes (may be null)
                    • The string NULL (not enclosed in quotes) - if NULL was specified as the default value
                    • TRUNCATE (not enclosed in quotes) - if the specified default value cannot be represented without truncation
                    • NULL - if a default value was not specified
                  15. SQL_DATA_TYPE int => (JDBC4 new:) Reserved for future use

                    HSQLDB-specific: CLI type from SQL 2003 Table 37, tables 6-9 Annex A1, and/or addendums in other documents, such as:
                    SQL 2003 Part 9: Management of External Data (SQL/MED) : DATALINK
                    SQL 2003 Part 14: XML-Related Specifications (SQL/XML) : XML

                  16. SQL_DATETIME_SUB int => (JDBC4 new:) reserved for future use

                    HSQLDB-specific: CLI SQL_DATETIME_SUB from SQL 2003 Table 37

                  17. CHAR_OCTET_LENGTH int => (JDBC4 new:) the maximum length of binary and character based columns. For any other datatype the returned value is a NULL
                  18. ORDINAL_POSITION int => (JDBC4 new:) the ordinal position, starting from 1, for the input and output parameters for a procedure. A value of 0 is returned if this row describes the procedure's return value. JDBC 4.1[For result set columns, it is the ordinal position of the column in the result set starting from 1. If there are multiple result sets, the column ordinal positions are implementation defined.]
                  19. IS_NULLABLE String => ISO rules are used to determine the nullability for a column.
                    • YES --- if the parameter or result column can include NULLs
                    • NO --- if the parameter or result column cannot include NULLs
                    • empty string --- if the nullability for the parameter or result column is unknown
                  20. SPECIFIC_NAME String => (JDBC4 new:) the name which uniquely identifies this procedure within its schema.

                  Note: Some databases may not return the column descriptions for a procedure. Additional columns beyond (JDBC4 modified:) SPECIFIC_NAME can be defined by the database and must be accessed by their column name.

                  (JDBC4 clarification:)

                  The PRECISION column represents the specified column size for the given column. For numeric data, this is the maximum precision. For character data, this is the [declared or implicit maximum] length in characters. For datetime datatypes, this is the [maximum] length in characters of the String representation (assuming the maximum allowed precision of the fractional seconds component). For binary data, this is the [maximum] length in bytes. For the ROWID datatype, this is the length in bytes[, as returned by the implementation-specific java.sql.RowId.getBytes() method]. JDBC 4.1 Deleted[0] JDBC 4.1 Added[Null] is returned for data types where the column size is not applicable.

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationFull.

                  Specified by:
                  getProcedureColumns in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schemaPattern - a schema name pattern; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  procedureNamePattern - a procedure name pattern; must match the procedure name as it is stored in the database
                  columnNamePattern - a column name pattern; must match the column name as it is stored in the database
                  Returns:
                  ResultSet - each row describes a stored procedure parameter or column
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  getSearchStringEscape()

                  getTables

                  public ResultSet getTables(String catalog,
                                             String schemaPattern,
                                             String tableNamePattern,
                                             String[] types)
                                      throws SQLException
                  Retrieves a description of the tables available in the given catalog. Only table descriptions matching the catalog, schema, table name and type criteria are returned. They are ordered by TABLE_TYPE, JDBC 4.1[TABLE_CAT,] TABLE_SCHEM and TABLE_NAME.

                  Each table description has the following columns:

                  1. TABLE_CAT String => table catalog (may be null)
                  2. TABLE_SCHEM String => table schema (may be null)
                  3. TABLE_NAME String => table name
                  4. TABLE_TYPE String => table type. Typical types are "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM".
                  5. REMARKS String => explanatory comment on the table
                  6. TYPE_CAT String => the types catalog (may be null)
                  7. TYPE_SCHEM String => the types schema (may be null)
                  8. TYPE_NAME String => type name (may be null)
                  9. SELF_REFERENCING_COL_NAME String => name of the designated "identifier" column of a typed table (may be null)
                  10. REF_GENERATION String => specifies how values in SELF_REFERENCING_COL_NAME are created. Values are "SYSTEM", "USER", "DERIVED". (may be null)

                  Note: Some databases may not return information for all tables.

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  HSQLDB returns extra information on TEXT tables in the REMARKS column.

                  HSQLDB includes the JDBC3 columns TYPE_CAT, TYPE_SCHEM, TYPE_NAME and SELF_REFERENCING_COL_NAME in anticipation of JDBC3 compliant tools.

                  Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getTables in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schemaPattern - a schema name pattern; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  tableNamePattern - a table name pattern; must match the table name as it is stored in the database
                  types - a list of table types, which must be from the list of table types returned from getTableTypes(),to include; null returns all types
                  Returns:
                  ResultSet - each row is a table description
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  getSearchStringEscape()

                  getSchemas

                  public ResultSet getSchemas()
                                       throws SQLException
                  Retrieves the schema names available in this database. The results are ordered by JDBC 4.1[TABLE_CATALOG] and TABLE_SCHEM.

                  The schema columns are:

                  1. TABLE_SCHEM String => schema name
                  2. TABLE_CATALOG String => catalog name (may be null)

                  HSQLDB-Specific Information:

                  Starting with 1.8.0, the list of schemas is returned.

                  Specified by:
                  getSchemas in interface DatabaseMetaData
                  Returns:
                  a ResultSet object in which each row is a schema description
                  Throws:
                  SQLException - if a database access error occurs

                  getCatalogs

                  public ResultSet getCatalogs()
                                        throws SQLException
                  Retrieves the catalog names available in this database. The results are ordered by catalog name.

                  The catalog column is:

                  1. TABLE_CAT String => catalog name

                  HSQLDB-Specific Information:

                  Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getCatalogs in interface DatabaseMetaData
                  Returns:
                  a ResultSet object in which each row has a single String column that is a catalog name
                  Throws:
                  SQLException - if a database access error occurs

                  getTableTypes

                  public ResultSet getTableTypes()
                                          throws SQLException
                  Retrieves the table types available in this database. The results are ordered by table type.

                  The table type is:

                  1. TABLE_TYPE String => table type. Typical types are "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM".

                  HSQLDB-Specific Information:

                  Since 1.7.1, HSQLDB reports: "TABLE", "VIEW" and "GLOBAL TEMPORARY" types. Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getTableTypes in interface DatabaseMetaData
                  Returns:
                  a ResultSet object in which each row has a single String column that is a table type
                  Throws:
                  SQLException - if a database access error occurs

                  getColumns

                  public ResultSet getColumns(String catalog,
                                              String schemaPattern,
                                              String tableNamePattern,
                                              String columnNamePattern)
                                       throws SQLException
                  Retrieves a description of table columns available in the specified catalog.

                  Only column descriptions matching the catalog, schema, table and column name criteria are returned. They are ordered by JDBC 4.1[TABLE_CAT, ]TABLE_SCHEM, TABLE_NAME, and ORDINAL_POSITION.

                  Each column description has the following columns:

                  1. TABLE_CAT String => table catalog (may be null)
                  2. TABLE_SCHEM String => table schema (may be null)
                  3. TABLE_NAME String => table name
                  4. COLUMN_NAME String => column name
                  5. DATA_TYPE int => SQL type from java.sql.Types
                  6. TYPE_NAME String => Data source dependent type name, for a UDT the type name is fully qualified
                  7. COLUMN_SIZE int => column size.
                  8. BUFFER_LENGTH is not used.
                  9. DECIMAL_DIGITS int => the number of fractional digits. Null is returned for data types where DECIMAL_DIGITS is not applicable.
                  10. NUM_PREC_RADIX int => Radix (typically either 10 or 2)
                  11. NULLABLE int => is NULL allowed.
                    • columnNoNulls - might not allow NULL values
                    • columnNullable - definitely allows NULL values
                    • columnNullableUnknown - nullability unknown
                  12. REMARKS String => comment describing column (may be null)
                  13. COLUMN_DEF String => (JDBC4 clarification:) default value for the column, which should be interpreted as a string when the value is enclosed in quotes (may be null)
                  14. SQL_DATA_TYPE int => unused

                    HSQLDB-specific: CLI type from SQL 2003 Table 37, tables 6-9 Annex A1, and/or addendums in other documents, such as:
                    SQL 2003 Part 9: Management of External Data (SQL/MED) : DATALINK
                    SQL 2003 Part 14: XML-Related Specifications (SQL/XML) : XML

                  15. SQL_DATETIME_SUB int => unused (HSQLDB-specific: SQL 2003 CLI datetime/interval subcode)
                  16. CHAR_OCTET_LENGTH int => for char types the maximum number of bytes in the column
                  17. ORDINAL_POSITION int => index of column in table (starting at 1)
                  18. IS_NULLABLE String => ISO rules are used to determine the nullability for a column.
                    • YES --- if the column can include NULLs
                    • NO --- if the column cannot include NULLs
                    • empty string --- if the nullability for the column is unknown
                  19. JDBC 4.1 Deleted[SCOPE_CATLOG] JDBC 4.1 Added[SCOPE_CATALOG] String => catalog of table that is the scope of a reference attribute (null if DATA_TYPE isn't REF)
                  20. SCOPE_SCHEMA String => schema of table that is the scope of a reference attribute (null if the DATA_TYPE isn't REF)
                  21. SCOPE_TABLE String => table name that this the scope of a reference attribute (null if the DATA_TYPE isn't REF)
                  22. SOURCE_DATA_TYPE short => source type of a distinct type or user-generated Ref type, SQL type from java.sql.Types (null if DATA_TYPE isn't DISTINCT or user-generated REF)
                  23. IS_AUTOINCREMENT String => Indicates whether this column is auto incremented
                    • YES --- if the column is auto incremented
                    • NO --- if the column is not auto incremented
                    • empty string --- if it cannot be determined whether the column is auto incremented
                    IS_GENERATEDCOLUMN
                    String => Indicates whether this is a generated column
                    • YES --- if this a generated column
                    • NO --- if this not a generated column
                    • empty string --- if it cannot be determined whether this is a generated column

                  (JDBC4 clarification:) The COLUMN_SIZE column represents the specified column size for the given column. For numeric data, this is the maximum precision. For character data, this is the [declared or implicit maximum] length in characters. For datetime datatypes, this is the [maximum] length in characters of the String representation (assuming the maximum allowed precision of the fractional seconds component). For binary data, this is the [maximum] length in bytes. For the ROWID datatype, this is the length in bytes[, as returned by the implementation-specific java.sql.RowId.getBytes() method]. JDBC 4.1 Deleted[0] JDBC 4.1 Added[Null] is returned for data types where the column size is not applicable.

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  This feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getColumns in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schemaPattern - a schema name pattern; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  tableNamePattern - a table name pattern; must match the table name as it is stored in the database
                  columnNamePattern - a column name pattern; must match the column name as it is stored in the database
                  Returns:
                  ResultSet - each row is a column description
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  getSearchStringEscape()

                  getColumnPrivileges

                  public ResultSet getColumnPrivileges(String catalog,
                                                       String schema,
                                                       String table,
                                                       String columnNamePattern)
                                                throws SQLException
                  Retrieves a description of the access rights for a table's columns.

                  Only privileges matching the column name criteria are returned. They are ordered by COLUMN_NAME and PRIVILEGE.

                  Each privilige description has the following columns:

                  1. TABLE_CAT String => table catalog (may be null)
                  2. TABLE_SCHEM String => table schema (may be null)
                  3. TABLE_NAME String => table name
                  4. COLUMN_NAME String => column name
                  5. GRANTOR String => grantor of access (may be null)
                  6. GRANTEE String => grantee of access
                  7. PRIVILEGE String => name of access (SELECT, INSERT, UPDATE, REFRENCES, ...)
                  8. IS_GRANTABLE String => "YES" if grantee is permitted to grant to others; "NO" if not; null if unknown

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getColumnPrivileges in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schema - a schema name; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  table - a table name; must match the table name as it is stored in the database
                  columnNamePattern - a column name pattern; must match the column name as it is stored in the database
                  Returns:
                  ResultSet - each row is a column privilege description
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  getSearchStringEscape()

                  getTablePrivileges

                  public ResultSet getTablePrivileges(String catalog,
                                                      String schemaPattern,
                                                      String tableNamePattern)
                                               throws SQLException
                  Retrieves a description of the access rights for each table available in a catalog. Note that a table privilege applies to one or more columns in the table. It would be wrong to assume that this privilege applies to all columns (this may be true for some systems but is not true for all.)

                  Only privileges matching the schema and table name criteria are returned. They are ordered by JDBC 4.1[TABLE_CAT,] TABLE_SCHEM, TABLE_NAME, and PRIVILEGE.

                  Each privilege description has the following columns:

                  1. TABLE_CAT String => table catalog (may be null)
                  2. TABLE_SCHEM String => table schema (may be null)
                  3. TABLE_NAME String => table name
                  4. GRANTOR String => grantor of access (may be null)
                  5. GRANTEE String => grantee of access
                  6. PRIVILEGE String => name of access (SELECT, INSERT, UPDATE, REFRENCES, ...)
                  7. IS_GRANTABLE String => "YES" if grantee is permitted to grant to others; "NO" if not; null if unknown

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getTablePrivileges in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schemaPattern - a schema name pattern; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  tableNamePattern - a table name pattern; must match the table name as it is stored in the database
                  Returns:
                  ResultSet - each row is a table privilege description
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  getSearchStringEscape()

                  getBestRowIdentifier

                  public ResultSet getBestRowIdentifier(String catalog,
                                                        String schema,
                                                        String table,
                                                        int scope,
                                                        boolean nullable)
                                                 throws SQLException
                  Retrieves a description of a table's optimal set of columns that uniquely identifies a row. They are ordered by SCOPE.

                  Each column description has the following columns:

                  1. SCOPE short => actual scope of result
                    • bestRowTemporary - very temporary, while using row
                    • bestRowTransaction - valid for remainder of current transaction
                    • bestRowSession - valid for remainder of current session
                  2. COLUMN_NAME String => column name
                  3. DATA_TYPE int => SQL data type from java.sql.Types
                  4. TYPE_NAME String => Data source dependent type name, for a UDT the type name is fully qualified
                  5. COLUMN_SIZE int => precision
                  6. BUFFER_LENGTH int => not used
                  7. DECIMAL_DIGITS short => scale - Null is returned for data types where DECIMAL_DIGITS is not applicable.
                  8. PSEUDO_COLUMN short => is this a pseudo column like an Oracle ROWID
                    • bestRowUnknown - may or may not be pseudo column
                    • bestRowNotPseudo - is NOT a pseudo column
                    • bestRowPseudo - is a pseudo column

                  (JDBC4 clarification:)

                  The COLUMN_SIZE column represents the specified column size for the given column. For numeric data, this is the maximum precision. For character data, this is the [declared or implicit maximum] length in characters. For datetime datatypes, this is the [maximum] length in characters of the String representation (assuming the maximum allowed precision of the fractional seconds component). For binary data, this is the [maximum] length in bytes. For the ROWID datatype, this is the length in bytes[, as returned by the implementation-specific java.sql.RowId.getBytes() method]. JDBC 4.1 Deleted[0] JDBC 4.1 Added[Null] is returned for data types where the column size is not applicable.

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  If the name of a column is defined in the database without double quotes, an all-uppercase name must be specified when calling this method. Otherwise, the name must be specified in the exact case of the column definition in the database.

                  Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getBestRowIdentifier in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schema - a schema name; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  table - a table name; must match the table name as it is stored in the database
                  scope - the scope of interest; use same values as SCOPE
                  nullable - include columns that are nullable.
                  Returns:
                  ResultSet - each row is a column description
                  Throws:
                  SQLException - if a database access error occurs

                  getVersionColumns

                  public ResultSet getVersionColumns(String catalog,
                                                     String schema,
                                                     String table)
                                              throws SQLException
                  Retrieves a description of a table's columns that are automatically updated when any value in a row is updated. They are unordered.

                  Each column description has the following columns:

                  1. SCOPE short => is not used
                  2. COLUMN_NAME String => column name
                  3. DATA_TYPE int => SQL data type from java.sql.Types
                  4. TYPE_NAME String => Data source-dependent type name
                  5. COLUMN_SIZE int => precision
                  6. BUFFER_LENGTH int => length of column value in bytes
                  7. DECIMAL_DIGITS short => scale - Null is returned for data types where DECIMAL_DIGITS is not applicable.
                  8. PSEUDO_COLUMN short => whether this is pseudo column like an Oracle ROWID
                    • versionColumnUnknown - may or may not be pseudo column
                    • versionColumnNotPseudo - is NOT a pseudo column
                    • versionColumnPseudo - is a pseudo column

                  (JDBC4 clarification:)

                  The COLUMN_SIZE column represents the specified column size for the given column. For numeric data, this is the maximum precision. For character data, this is the [declared or implicit maximum] length in characters. For datetime datatypes, this is the [maximum] length in characters of the String representation (assuming the maximum allowed precision of the fractional seconds component). For binary data, this is the [maximum] length in bytes. For the ROWID datatype, this is the length in bytes[, as returned by the implementation-specific java.sql.RowId.getBytes() method]. JDBC 4.1 Deleted[0], JDBC 4.1 Added[Null] is returned for data types where the column size is not applicable.

                  HSQLDB-Specific Information:

                  HSQLDB does not support version columns. This returns an empty result set.

                  Specified by:
                  getVersionColumns in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schema - a schema name; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  table - a table name; must match the table name as it is stored in the database
                  Returns:
                  a ResultSet object in which each row is a column description
                  Throws:
                  SQLException - if a database access error occurs

                  getPrimaryKeys

                  public ResultSet getPrimaryKeys(String catalog,
                                                  String schema,
                                                  String table)
                                           throws SQLException
                  Retrieves a description of the given table's primary key columns. They are ordered by COLUMN_NAME.

                  Each primary key column description has the following columns:

                  1. TABLE_CAT String => table catalog (may be null)
                  2. TABLE_SCHEM String => table schema (may be null)
                  3. TABLE_NAME String => table name
                  4. COLUMN_NAME String => column name
                  5. KEY_SEQ short => (JDBC4 Clarification:) sequence number within primary key( a value of 1 represents the first column of the primary key, a value of 2 would represent the second column within the primary key).
                  6. PK_NAME String => primary key name (may be null)

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getPrimaryKeys in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schema - a schema name; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  table - a table name; must match the table name as it is stored in the database
                  Returns:
                  ResultSet - each row is a primary key column description
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  supportsMixedCaseQuotedIdentifiers(), storesUpperCaseIdentifiers()

                  getImportedKeys

                  public ResultSet getImportedKeys(String catalog,
                                                   String schema,
                                                   String table)
                                            throws SQLException
                  Retrieves a description of the primary key columns that are referenced by the given table's foreign key columns (the primary keys imported by a table). They are ordered by PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME, and KEY_SEQ.

                  Each primary key column description has the following columns:

                  1. PKTABLE_CAT String => primary key table catalog being imported (may be null)
                  2. PKTABLE_SCHEM String => primary key table schema being imported (may be null)
                  3. PKTABLE_NAME String => primary key table name being imported
                  4. PKCOLUMN_NAME String => primary key column name being imported
                  5. FKTABLE_CAT String => foreign key table catalog (may be null)
                  6. FKTABLE_SCHEM String => foreign key table schema (may be null)
                  7. FKTABLE_NAME String => foreign key table name
                  8. FKCOLUMN_NAME String => foreign key column name
                  9. KEY_SEQ short => (JDBC4 clarification) sequence number within a foreign key (a value of 1 represents the first column of the foreign key, a value of 2 would represent the second column within the foreign key).
                  10. UPDATE_RULE short => What happens to a foreign key when the primary key is updated:
                    • importedNoAction - do not allow update of primary key if it has been imported
                    • importedKeyCascade - change imported key to agree with primary key update
                    • importedKeySetNull - change imported key to NULL if its primary key has been updated
                    • importedKeySetDefault - change imported key to default values if its primary key has been updated
                    • importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x compatibility)
                  11. DELETE_RULE short => What happens to the foreign key when primary is deleted.
                    • importedKeyNoAction - do not allow delete of primary key if it has been imported
                    • importedKeyCascade - delete rows that import a deleted key
                    • importedKeySetNull - change imported key to NULL if its primary key has been deleted
                    • importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x compatibility)
                    • importedKeySetDefault - change imported key to default if its primary key has been deleted
                  12. FK_NAME String => foreign key name (may be null)
                  13. PK_NAME String => primary key name (may be null)
                  14. DEFERRABILITY short => can the evaluation of foreign key constraints be deferred until commit
                    • importedKeyInitiallyDeferred - see SQL92 for definition
                    • importedKeyInitiallyImmediate - see SQL92 for definition
                    • importedKeyNotDeferrable - see SQL92 for definition

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getImportedKeys in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schema - a schema name; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  table - a table name; must match the table name as it is stored in the database
                  Returns:
                  ResultSet - each row is a primary key column description
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  getExportedKeys(java.lang.String, java.lang.String, java.lang.String), supportsMixedCaseQuotedIdentifiers(), storesUpperCaseIdentifiers()

                  getExportedKeys

                  public ResultSet getExportedKeys(String catalog,
                                                   String schema,
                                                   String table)
                                            throws SQLException
                  Retrieves a description of the foreign key columns that reference the given table's primary key columns (the foreign keys exported by a table). They are ordered by FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, and KEY_SEQ.

                  Each foreign key column description has the following columns:

                  1. PKTABLE_CAT String => primary key table catalog (may be null)
                  2. PKTABLE_SCHEM String => primary key table schema (may be null)
                  3. PKTABLE_NAME String => primary key table name
                  4. PKCOLUMN_NAME String => primary key column name
                  5. FKTABLE_CAT String => foreign key table catalog (may be null) being exported (may be null)
                  6. FKTABLE_SCHEM String => foreign key table schema (may be null) being exported (may be null)
                  7. FKTABLE_NAME String => foreign key table name being exported
                  8. FKCOLUMN_NAME String => foreign key column name being exported
                  9. KEY_SEQ short => (JDBC4 clarification:) sequence number within foreign key( a value of 1 represents the first column of the foreign key, a value of 2 would represent the second column within the foreign key).
                  10. UPDATE_RULE short => What happens to foreign key when primary is updated:
                    • importedNoAction - do not allow update of primary key if it has been imported
                    • importedKeyCascade - change imported key to agree with primary key update
                    • importedKeySetNull - change imported key to NULL if its primary key has been updated
                    • importedKeySetDefault - change imported key to default values if its primary key has been updated
                    • importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x compatibility)
                  11. DELETE_RULE short => What happens to the foreign key when primary is deleted.
                    • importedKeyNoAction - do not allow delete of primary key if it has been imported
                    • importedKeyCascade - delete rows that import a deleted key
                    • importedKeySetNull - change imported key to NULL if its primary key has been deleted
                    • importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x compatibility)
                    • importedKeySetDefault - change imported key to default if its primary key has been deleted
                  12. FK_NAME String => foreign key name (may be null)
                  13. PK_NAME String => primary key name (may be null)
                  14. DEFERRABILITY short => can the evaluation of foreign key constraints be deferred until commit
                    • importedKeyInitiallyDeferred - see SQL92 for definition
                    • importedKeyInitiallyImmediate - see SQL92 for definition
                    • importedKeyNotDeferrable - see SQL92 for definition

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getExportedKeys in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in this database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schema - a schema name; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  table - a table name; must match the table name as it is stored in this database
                  Returns:
                  a ResultSet object in which each row is a foreign key column description
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  getImportedKeys(java.lang.String, java.lang.String, java.lang.String), supportsMixedCaseQuotedIdentifiers(), storesUpperCaseIdentifiers()

                  getCrossReference

                  public ResultSet getCrossReference(String parentCatalog,
                                                     String parentSchema,
                                                     String parentTable,
                                                     String foreignCatalog,
                                                     String foreignSchema,
                                                     String foreignTable)
                                              throws SQLException
                  (JDBC4 clarification:) Retrieves a description of the foreign key columns in the given foreign key table that reference the primary key or the columns representing a unique constraint of the parent table (could be the same or a different table). The number of columns returned from the parent table must match the number of columns that make up the foreign key. They are ordered by FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, and KEY_SEQ.

                  Each foreign key column description has the following columns:

                  1. PKTABLE_CAT String => parent key table catalog (may be null)
                  2. PKTABLE_SCHEM String => parent key table schema (may be null)
                  3. PKTABLE_NAME String => parent key table name
                  4. PKCOLUMN_NAME String => parent key column name
                  5. FKTABLE_CAT String => foreign key table catalog (may be null) being exported (may be null)
                  6. FKTABLE_SCHEM String => foreign key table schema (may be null) being exported (may be null)
                  7. FKTABLE_NAME String => foreign key table name being exported
                  8. FKCOLUMN_NAME String => foreign key column name being exported
                  9. KEY_SEQ short => sequence number within foreign key( a value of 1 represents the first column of the foreign key, a value of 2 would represent the second column within the foreign key).
                  10. UPDATE_RULE short => What happens to foreign key when parent key is updated:
                    • importedNoAction - do not allow update of parent key if it has been imported
                    • importedKeyCascade - change imported key to agree with parent key update
                    • importedKeySetNull - change imported key to NULL if its parent key has been updated
                    • importedKeySetDefault - change imported key to default values if its parent key has been updated
                    • importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x compatibility)
                  11. DELETE_RULE short => What happens to the foreign key when parent key is deleted.
                    • importedKeyNoAction - do not allow delete of parent key if it has been imported
                    • importedKeyCascade - delete rows that import a deleted key
                    • importedKeySetNull - change imported key to NULL if its primary key has been deleted
                    • importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x compatibility)
                    • importedKeySetDefault - change imported key to default if its parent key has been deleted
                  12. FK_NAME String => foreign key name (may be null)
                  13. PK_NAME String => parent key name (may be null)
                  14. DEFERRABILITY short => can the evaluation of foreign key constraints be deferred until commit
                    • importedKeyInitiallyDeferred - see SQL92 for definition
                    • importedKeyInitiallyImmediate - see SQL92 for definition
                    • importedKeyNotDeferrable - see SQL92 for definition

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getCrossReference in interface DatabaseMetaData
                  Parameters:
                  parentCatalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means drop catalog name from the selection criteria
                  parentSchema - a schema name; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means drop schema name from the selection criteria
                  parentTable - the name of the table that exports the key; must match the table name as it is stored in the database
                  foreignCatalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means drop catalog name from the selection criteria
                  foreignSchema - a schema name; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means drop schema name from the selection criteria
                  foreignTable - the name of the table that imports the key; must match the table name as it is stored in the database
                  Returns:
                  ResultSet - each row is a foreign key column description
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  getImportedKeys(java.lang.String, java.lang.String, java.lang.String), supportsMixedCaseQuotedIdentifiers(), storesUpperCaseIdentifiers()

                  getTypeInfo

                  public ResultSet getTypeInfo()
                                        throws SQLException
                  Retrieves a description of all the (JDBC4 clarification:) data types supported by this database. They are ordered by DATA_TYPE and then by how closely the data type maps to the corresponding JDBC SQL type.

                  (JDBC4 clarification:) If the database supports SQL distinct types, then getTypeInfo() will return a single row with a TYPE_NAME of DISTINCT and a DATA_TYPE of Types.DISTINCT. If the database supports SQL structured types, then getTypeInfo() will return a single row with a TYPE_NAME of STRUCT and a DATA_TYPE of Types.STRUCT.

                  (JDBC4 clarification:)

                  If SQL distinct or structured types are supported, then information on the individual types may be obtained from the getUDTs() method.

                  Each type description has the following columns:

                  1. TYPE_NAME String => Type name
                  2. DATA_TYPE int => SQL data type from java.sql.Types
                  3. PRECISION int => maximum precision
                  4. LITERAL_PREFIX String => prefix used to quote a literal (may be null)
                  5. LITERAL_SUFFIX String => suffix used to quote a literal (may be null)
                  6. CREATE_PARAMS String => parameters used in creating the type (may be null)
                  7. NULLABLE short => can you use NULL for this type.
                    • typeNoNulls - does not allow NULL values
                    • typeNullable - allows NULL values
                    • typeNullableUnknown - nullability unknown
                  8. CASE_SENSITIVE boolean=> is it case sensitive.
                  9. SEARCHABLE short => can you use "WHERE" based on this type:
                    • typePredNone - No support
                    • typePredChar - Only supported with WHERE .. LIKE
                    • typePredBasic - Supported except for WHERE .. LIKE
                    • typeSearchable - Supported for all WHERE ..
                  10. UNSIGNED_ATTRIBUTE boolean => is it unsigned.
                  11. FIXED_PREC_SCALE boolean => can it be a money value.
                  12. AUTO_INCREMENT boolean => can it be used for an auto-increment value.
                  13. LOCAL_TYPE_NAME String => localized version of type name (may be null)
                  14. MINIMUM_SCALE short => minimum scale supported
                  15. MAXIMUM_SCALE short => maximum scale supported
                  16. SQL_DATA_TYPE int => unused
                  17. SQL_DATETIME_SUB int => unused
                  18. NUM_PREC_RADIX int => usually 2 or 10

                  (JDBC4 clarification:) The PRECISION column represents the maximum column size that the server supports for the given datatype. For numeric data, this is the maximum precision. For character data, this is the [maximum] length in characters. For datetime datatypes, this is the [maximum] length in characters of the String representation (assuming the maximum allowed precision of the fractional seconds component). For binary data, this is the [maximum] length in bytes. For the ROWID datatype, this is the length in bytes[, as returned by the implementation-specific java.sql.RowId.getBytes() method]. JDBC 4.1 Deleted[0] JDBC 4.1 Added[Null] is returned for data types where the column size is not applicable.

                  HSQLDB-Specific Information:

                  Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getTypeInfo in interface DatabaseMetaData
                  Returns:
                  a ResultSet object in which each row is an SQL type description
                  Throws:
                  SQLException - if a database access error occurs

                  getIndexInfo

                  public ResultSet getIndexInfo(String catalog,
                                                String schema,
                                                String table,
                                                boolean unique,
                                                boolean approximate)
                                         throws SQLException
                  Retrieves a description of the given table's indices and statistics. They are ordered by NON_UNIQUE, TYPE, INDEX_NAME, and ORDINAL_POSITION.

                  Each index column description has the following columns:

                  1. TABLE_CAT String => table catalog (may be null)
                  2. TABLE_SCHEM String => table schema (may be null)
                  3. TABLE_NAME String => table name
                  4. NON_UNIQUE boolean => Can index values be non-unique. false when TYPE is tableIndexStatistic
                  5. INDEX_QUALIFIER String => index catalog (may be null); null when TYPE is tableIndexStatistic
                  6. INDEX_NAME String => index name; null when TYPE is tableIndexStatistic
                  7. TYPE short => index type:
                    • tableIndexStatistic - this identifies table statistics that are returned in conjuction with a table's index descriptions
                    • tableIndexClustered - this is a clustered index
                    • tableIndexHashed - this is a hashed index
                    • tableIndexOther - this is some other style of index
                  8. ORDINAL_POSITION short => column sequence number within index; zero when TYPE is tableIndexStatistic
                  9. COLUMN_NAME String => column name; null when TYPE is tableIndexStatistic
                  10. ASC_OR_DESC String => column sort sequence, "A" => ascending, "D" => descending, may be null if sort sequence is not supported; null when TYPE is tableIndexStatistic
                  11. CARDINALITY int => When TYPE is tableIndexStatistic, then this is the number of rows in the table; otherwise, it is the number of unique values in the index.
                  12. PAGES int => When TYPE is tableIndexStatisic then this is the number of pages used for the table, otherwise it is the number of pages used for the current index.
                  13. FILTER_CONDITION String => Filter condition, if any. (may be null)

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  Since 1.7.2, this feature is supported by default. If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getIndexInfo in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in this database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schema - a schema name; must match the schema name as it is stored in this database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  table - a table name; must match the table name as it is stored in this database
                  unique - when true, return only indices for unique values; when false, return indices regardless of whether unique or not
                  approximate - when true, result is allowed to reflect approximate or out of data values; when false, results are requested to be accurate
                  Returns:
                  ResultSet - each row is an index column description
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  supportsMixedCaseQuotedIdentifiers(), storesUpperCaseIdentifiers()

                  supportsResultSetType

                  public boolean supportsResultSetType(int type)
                                                throws SQLException
                  Retrieves whether this database supports the given result set type.

                  Specified by:
                  supportsResultSetType in interface DatabaseMetaData
                  Parameters:
                  type - defined in java.sql.ResultSet
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)
                  See Also:
                  JDBCConnection

                  supportsResultSetConcurrency

                  public boolean supportsResultSetConcurrency(int type,
                                                              int concurrency)
                                                       throws SQLException
                  Retrieves whether this database supports the given concurrency type in combination with the given result set type.

                  Specified by:
                  supportsResultSetConcurrency in interface DatabaseMetaData
                  Parameters:
                  type - defined in java.sql.ResultSet
                  concurrency - type defined in java.sql.ResultSet
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)
                  See Also:
                  JDBCConnection

                  ownUpdatesAreVisible

                  public boolean ownUpdatesAreVisible(int type)
                                               throws SQLException
                  Retrieves whether for the given type of ResultSet object, the result set's own updates are visible.

                  HSQLDB-Specific Information:

                  Updates to ResultSet rows are not visible after moving from the updated row.

                  Specified by:
                  ownUpdatesAreVisible in interface DatabaseMetaData
                  Parameters:
                  type - the ResultSet type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  Returns:
                  true if updates are visible for the given result set type; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)

                  ownDeletesAreVisible

                  public boolean ownDeletesAreVisible(int type)
                                               throws SQLException
                  Retrieves whether a result set's own deletes are visible.

                  HSQLDB-Specific Information:

                  Rows deleted from the ResultSet are still visible after moving from the deleted row.

                  Specified by:
                  ownDeletesAreVisible in interface DatabaseMetaData
                  Parameters:
                  type - the ResultSet type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  Returns:
                  true if deletes are visible for the given result set type; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)

                  ownInsertsAreVisible

                  public boolean ownInsertsAreVisible(int type)
                                               throws SQLException
                  Retrieves whether a result set's own inserts are visible.

                  HSQLDB-Specific Information:

                  Rows added to a ResultSet are not visible after moving from the insert row; this method always returns false.

                  Specified by:
                  ownInsertsAreVisible in interface DatabaseMetaData
                  Parameters:
                  type - the ResultSet type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  Returns:
                  true if inserts are visible for the given result set type; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)

                  othersUpdatesAreVisible

                  public boolean othersUpdatesAreVisible(int type)
                                                  throws SQLException
                  Retrieves whether updates made by others are visible.

                  HSQLDB-Specific Information:

                  Updates made by other connections or the same connection while the ResultSet is open are not visible in the ResultSet.

                  Specified by:
                  othersUpdatesAreVisible in interface DatabaseMetaData
                  Parameters:
                  type - the ResultSet type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  Returns:
                  true if updates made by others are visible for the given result set type; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)

                  othersDeletesAreVisible

                  public boolean othersDeletesAreVisible(int type)
                                                  throws SQLException
                  Retrieves whether deletes made by others are visible.

                  HSQLDB-Specific Information:

                  Deletes made by other connections or the same connection while the ResultSet is open are not visible in the ResultSet.

                  Specified by:
                  othersDeletesAreVisible in interface DatabaseMetaData
                  Parameters:
                  type - the ResultSet type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  Returns:
                  true if deletes made by others are visible for the given result set type; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)

                  othersInsertsAreVisible

                  public boolean othersInsertsAreVisible(int type)
                                                  throws SQLException
                  Retrieves whether inserts made by others are visible.

                  HSQLDB-Specific Information:

                  Inserts made by other connections or the same connection while the ResultSet is open are not visible in the ResultSet.

                  Specified by:
                  othersInsertsAreVisible in interface DatabaseMetaData
                  Parameters:
                  type - the ResultSet type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  Returns:
                  true if inserts made by others are visible for the given result set type; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)

                  updatesAreDetected

                  public boolean updatesAreDetected(int type)
                                             throws SQLException
                  Retrieves whether or not a visible row update can be detected by calling the method ResultSet.rowUpdated.

                  HSQLDB-Specific Information:

                  Updates made to the rows of the ResultSet are not detected by calling the ResultSet.rowUpdated.

                  Specified by:
                  updatesAreDetected in interface DatabaseMetaData
                  Parameters:
                  type - the ResultSet type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  Returns:
                  true if changes are detected by the result set type; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)

                  deletesAreDetected

                  public boolean deletesAreDetected(int type)
                                             throws SQLException
                  Retrieves whether or not a visible row delete can be detected by calling the method ResultSet.rowDeleted. If the method deletesAreDetected returns false, it means that deleted rows are removed from the result set.

                  HSQLDB-Specific Information:

                  Deletes made to the rows of the ResultSet are not detected by calling the ResultSet.rowDeleted.

                  Specified by:
                  deletesAreDetected in interface DatabaseMetaData
                  Parameters:
                  type - the ResultSet type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  Returns:
                  true if deletes are detected by the given result set type; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)

                  insertsAreDetected

                  public boolean insertsAreDetected(int type)
                                             throws SQLException
                  Retrieves whether or not a visible row insert can be detected by calling the method ResultSet.rowInserted.

                  HSQLDB-Specific Information:

                  Inserts made into the ResultSet are not visible and thus not detected by calling the ResultSet.rowInserted.

                  Specified by:
                  insertsAreDetected in interface DatabaseMetaData
                  Parameters:
                  type - the ResultSet type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  Returns:
                  true if changes are detected by the specified result set type; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)

                  supportsBatchUpdates

                  public boolean supportsBatchUpdates()
                                               throws SQLException
                  Retrieves whether this database supports batch updates.

                  HSQLDB-Specific Information:

                  HSQLDB supports batch updates; this method always returns true.

                  Specified by:
                  supportsBatchUpdates in interface DatabaseMetaData
                  Returns:
                  true if this database supports batch upcates; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)

                  getUDTs

                  public ResultSet getUDTs(String catalog,
                                           String schemaPattern,
                                           String typeNamePattern,
                                           int[] types)
                                    throws SQLException
                  Retrieves a description of the user-defined types (UDTs) defined in a particular schema. Schema-specific UDTs may have type JAVA_OBJECT, STRUCT, or DISTINCT.

                  Only types matching the catalog, schema, type name and type criteria are returned. They are ordered by DATA_TYPE, JDBC 4.1[TYPE_CAT,] TYPE_SCHEM and TYPE_NAME. The type name parameter may be a fully-qualified name. In this case, the catalog and schemaPattern parameters are ignored.

                  Each type description has the following columns:

                  1. TYPE_CAT String => the type's catalog (may be null)
                  2. TYPE_SCHEM String => type's schema (may be null)
                  3. TYPE_NAME String => type name
                  4. CLASS_NAME String => Java class name
                  5. DATA_TYPE int => type value defined in java.sql.Types. One of JAVA_OBJECT, STRUCT, or DISTINCT
                  6. REMARKS String => explanatory comment on the type
                  7. BASE_TYPE short => type code of the source type of a DISTINCT type or the type that implements the user-generated reference type of the SELF_REFERENCING_COLUMN of a structured type as defined in java.sql.Types (null if DATA_TYPE is not DISTINCT or not STRUCT with REFERENCE_GENERATION = USER_DEFINED)

                  Note: If the driver does not support UDTs, an empty result set is returned.

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  Starting with 2.0, DISTICT types are supported and are reported by this method.

                  Specified by:
                  getUDTs in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schemaPattern - a schema pattern name; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  typeNamePattern - a type name pattern; must match the type name as it is stored in the database; may be a fully qualified name
                  types - a list of user-defined types (JAVA_OBJECT, STRUCT, or DISTINCT) to include; null returns all types
                  Returns:
                  ResultSet object in which each row describes a UDT
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)
                  See Also:
                  (JDBC4 clarification)

                  getConnection

                  public Connection getConnection()
                                           throws SQLException
                  Retrieves the connection that produced this metadata object.

                  Specified by:
                  getConnection in interface DatabaseMetaData
                  Returns:
                  the connection that produced this metadata object
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCDatabaseMetaData)

                  supportsSavepoints

                  public boolean supportsSavepoints()
                                             throws SQLException
                  Retrieves whether this database supports savepoints.

                  HSQLDB-Specific Information:

                  Beginning with 1.7.2, this SQL feature is supported through JDBC as well as SQL.

                  Specified by:
                  supportsSavepoints in interface DatabaseMetaData
                  Returns:
                  true if savepoints are supported; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  supportsNamedParameters

                  public boolean supportsNamedParameters()
                                                  throws SQLException
                  Retrieves whether this database supports named parameters to callable statements.

                  HSQLDB-Specific Information:

                  Starting with 1.7.2, HSQLDB supports JDBC named parameters to callable statements; this method returns true.

                  Specified by:
                  supportsNamedParameters in interface DatabaseMetaData
                  Returns:
                  true if named parameters are supported; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  supportsMultipleOpenResults

                  public boolean supportsMultipleOpenResults()
                                                      throws SQLException
                  Retrieves whether it is possible to have multiple ResultSet objects returned from a CallableStatement object simultaneously.

                  HSQLDB-Specific Information:

                  HSQLDB supports multiple ResultSet objects returned from a CallableStatement; this method always returns true.

                  Specified by:
                  supportsMultipleOpenResults in interface DatabaseMetaData
                  Returns:
                  true if a CallableStatement object can return multiple ResultSet objects simultaneously; false otherwise
                  Throws:
                  SQLException - if a datanase access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  supportsGetGeneratedKeys

                  public boolean supportsGetGeneratedKeys()
                                                   throws SQLException
                  Retrieves whether auto-generated keys can be retrieved after a statement has been executed

                  HSQLDB-Specific Information:

                  HSQLDB supports retrieval of autogenerated keys through the JDBC interface; this method always returns true.

                  Specified by:
                  supportsGetGeneratedKeys in interface DatabaseMetaData
                  Returns:
                  true if auto-generated keys can be retrieved after a statement has executed; false otherwise

                  (JDBC4 Clarification:)

                  If true is returned, the JDBC driver must support the returning of auto-generated keys for at least SQL INSERT statements

                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  getSuperTypes

                  public ResultSet getSuperTypes(String catalog,
                                                 String schemaPattern,
                                                 String typeNamePattern)
                                          throws SQLException
                  Retrieves a description of the user-defined type (UDT) hierarchies defined in a particular schema in this database. Only the immediate super type sub type relationship is modeled.

                  Only supertype information for UDTs matching the catalog, schema, and type name is returned. The type name parameter may be a fully-qualified name. When the UDT name supplied is a fully-qualified name, the catalog and schemaPattern parameters are ignored.

                  If a UDT does not have a direct super type, it is not listed here. A row of the ResultSet object returned by this method describes the designated UDT and a direct supertype. A row has the following columns:

                  1. TYPE_CAT String => the UDT's catalog (may be null)
                  2. TYPE_SCHEM String => UDT's schema (may be null)
                  3. TYPE_NAME String => type name of the UDT
                  4. SUPERTYPE_CAT String => the direct super type's catalog (may be null)
                  5. SUPERTYPE_SCHEM String => the direct super type's schema (may be null)
                  6. SUPERTYPE_NAME String => the direct super type's name

                  Note: If the driver does not support type hierarchies, an empty result set is returned.

                  HSQLDB-Specific Information:

                  HSQLDB supports the SQL Standard. It treats unquoted identifiers as case insensitive in SQL and stores them in upper case; it treats quoted identifiers as case sensitive and stores them verbatim. All JDBCDatabaseMetaData methods perform case-sensitive comparison between name (pattern) arguments and the corresponding identifier values as they are stored in the database. Therefore, care must be taken to specify name arguments precisely (including case) as they are stored in the database.

                  From 2.0, this feature is supported by default and return supertypes for DOMAIN and DISTINCT types.

                  If the jar is compiled without org.hsqldb.dbinfo.DatabaseInformationMain, the feature is not supported. The default implementation is DatabaseInformationMain.

                  Specified by:
                  getSuperTypes in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; "" retrieves those without a catalog; null means drop catalog name from the selection criteria
                  schemaPattern - a schema name pattern; "" retrieves those without a schema
                  typeNamePattern - a UDT name pattern; may be a fully-qualified name
                  Returns:
                  a ResultSet object in which a row gives information about the designated UDT
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7
                  See Also:
                  (JDBC4 clarification)

                  getSuperTables

                  public ResultSet getSuperTables(String catalog,
                                                  String schemaPattern,
                                                  String tableNamePattern)
                                           throws SQLException
                  Retrieves a description of the table hierarchies defined in a particular schema in this database.

                  Only supertable information for tables matching the catalog, schema and table name are returned. The table name parameter may be a fully- qualified name, in which case, the catalog and schemaPattern parameters are ignored. If a table does not have a super table, it is not listed here. Supertables have to be defined in the same catalog and schema as the sub tables. Therefore, the type description does not need to include this information for the supertable.

                  Each type description has the following columns:

                  1. TABLE_CAT String => the type's catalog (may be null)
                  2. TABLE_SCHEM String => type's schema (may be null)
                  3. TABLE_NAME String => type name
                  4. SUPERTABLE_NAME String => the direct super type's name

                  Note: If the driver does not support type hierarchies, an empty result set is returned.

                  HSQLDB-Specific Information:

                  This method is intended for tables of structured types. From 2.0 this method returns an empty ResultSet. DatabaseInformationMain.

                  Specified by:
                  getSuperTables in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; "" retrieves those without a catalog; null means drop catalog name from the selection criteria
                  schemaPattern - a schema name pattern; "" retrieves those without a schema
                  tableNamePattern - a table name pattern; may be a fully-qualified name
                  Returns:
                  a ResultSet object in which each row is a type description
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7
                  See Also:
                  (JDBC4 clarification)

                  getAttributes

                  public ResultSet getAttributes(String catalog,
                                                 String schemaPattern,
                                                 String typeNamePattern,
                                                 String attributeNamePattern)
                                          throws SQLException
                  Retrieves a description of the given attribute of the given type for a user-defined type (UDT) that is available in the given schema and catalog.

                  Descriptions are returned only for attributes of UDTs matching the catalog, schema, type, and attribute name criteria. They are ordered by JDBC 4.1[TYPE_CAT, ]TYPE_SCHEM, TYPE_NAME and ORDINAL_POSITION. This description does not contain inherited attributes.

                  The ResultSet object that is returned has the following columns:

                  1. TYPE_CAT String => type catalog (may be null)
                  2. TYPE_SCHEM String => type schema (may be null)
                  3. TYPE_NAME String => type name
                  4. ATTR_NAME String => attribute name
                  5. DATA_TYPE int => attribute type SQL type from java.sql.Types
                  6. ATTR_TYPE_NAME String => Data source dependent type name. For a UDT, the type name is fully qualified. For a REF, the type name is fully qualified and represents the target type of the reference type.
                  7. ATTR_SIZE int => column size. For char or date types this is the maximum number of characters; for numeric or decimal types this is precision.
                  8. DECIMAL_DIGITS int => the number of fractional digits. Null is returned for data types where DECIMAL_DIGITS is not applicable.
                  9. NUM_PREC_RADIX int => Radix (typically either 10 or 2)
                  10. NULLABLE int => whether NULL is allowed
                    • attributeNoNulls - might not allow NULL values
                    • attributeNullable - definitely allows NULL values
                    • attributeNullableUnknown - nullability unknown
                  11. REMARKS String => comment describing column (may be null)
                  12. ATTR_DEF String => default value (may be null)
                  13. SQL_DATA_TYPE int => unused
                  14. SQL_DATETIME_SUB int => unused
                  15. CHAR_OCTET_LENGTH int => for char types the maximum number of bytes in the column
                  16. ORDINAL_POSITION int => index of JDBC 4.1 correction[the attribute in the UDT] (starting at 1)
                  17. IS_NULLABLE String => ISO rules are used to determine the nullability for a column.
                    • YES --- if the JDBC 4.1 correction[attribute] can include NULLs
                    • NO --- if the JDBC 4.1 correction[attribute] cannot include NULLs
                    • empty string --- if the nullability for the JDBC 4.1 correction[attribute] is unknown
                  18. SCOPE_CATALOG String => catalog of table that is the scope of a reference attribute (null if DATA_TYPE isn't REF)
                  19. SCOPE_SCHEMA String => schema of table that is the scope of a reference attribute (null if DATA_TYPE isn't REF)
                  20. SCOPE_TABLE String => table name that is the scope of a reference attribute (null if the DATA_TYPE isn't REF)
                  21. SOURCE_DATA_TYPE short => source type of a distinct type or user-generated Ref type,SQL type from java.sql.Types (null if DATA_TYPE isn't DISTINCT or user-generated REF)

                  HSQLDB-Specific Information:

                  This method is intended for attributes of structured types. From 2.0 this method returns an empty ResultSet.

                  Specified by:
                  getAttributes in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schemaPattern - a schema name pattern; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  typeNamePattern - a type name pattern; must match the type name as it is stored in the database
                  attributeNamePattern - an attribute name pattern; must match the attribute name as it is declared in the database
                  Returns:
                  a ResultSet object in which each row is an attribute description
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7
                  See Also:
                  getSearchStringEscape()

                  supportsResultSetHoldability

                  public boolean supportsResultSetHoldability(int holdability)
                                                       throws SQLException
                  Retrieves whether this database supports the given result set holdability.

                  HSQLDB-Specific Information:

                  HSQLDB returns true for both alternatives.

                  Specified by:
                  supportsResultSetHoldability in interface DatabaseMetaData
                  Parameters:
                  holdability - one of the following constants: ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7
                  See Also:
                  JDBCConnection

                  getResultSetHoldability

                  public int getResultSetHoldability()
                                              throws SQLException
                  (JDBC4 clarification:) Retrieves this database's default holdability for ResultSet objects.

                  HSQLDB-Specific Information:

                  HSQLDB defaults to HOLD_CURSORS_OVER_COMMIT for CONSUR_READ_ONLY ResultSet objects. If the ResultSet concurrency is CONCUR_UPDATABLE, then holdability is is enforced as CLOSE_CURSORS_AT_COMMIT.

                  Specified by:
                  getResultSetHoldability in interface DatabaseMetaData
                  Returns:
                  the default holdability; either ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  getDatabaseMajorVersion

                  public int getDatabaseMajorVersion()
                                              throws SQLException
                  Retrieves the major version number of the underlying database.

                  HSQLDB-Specific Information:

                  Returns the major version

                  Specified by:
                  getDatabaseMajorVersion in interface DatabaseMetaData
                  Returns:
                  the underlying database's major version
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  getDatabaseMinorVersion

                  public int getDatabaseMinorVersion()
                                              throws SQLException
                  Retrieves the minor version number of the underlying database.

                  HSQLDB-Specific Information:

                  This returns the digit after the first point in version.

                  Specified by:
                  getDatabaseMinorVersion in interface DatabaseMetaData
                  Returns:
                  underlying database's minor version
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  getJDBCMajorVersion

                  public int getJDBCMajorVersion()
                                          throws SQLException
                  Retrieves the major JDBC version number for this driver.

                  HSQLDB-Specific Information:

                  Specified by:
                  getJDBCMajorVersion in interface DatabaseMetaData
                  Returns:
                  JDBC version major number
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  getJDBCMinorVersion

                  public int getJDBCMinorVersion()
                                          throws SQLException
                  Retrieves the minor JDBC version number for this driver.

                  HSQLDB-Specific Information:

                  Specified by:
                  getJDBCMinorVersion in interface DatabaseMetaData
                  Returns:
                  JDBC version minor number
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  getSQLStateType

                  public int getSQLStateType()
                                      throws SQLException
                  (JDBC4 modified:) Indicates whether the SQLSTATE returned by SQLException.getSQLState is X/Open (now known as Open Group) SQL CLI or SQL:2003.

                  HSQLDB-Specific Information:

                  HSQLDB returns sqlStateSQL under JDBC4 which is equivalent to JDBC3 value of sqlStateSQL99.

                  Specified by:
                  getSQLStateType in interface DatabaseMetaData
                  Returns:
                  the type of SQLSTATE; one of: sqlStateXOpen or sqlStateSQL

                  sqlStateSQL is new in JDBC4 and its value is the same as JDBC3 sqlStateSQL99

                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  locatorsUpdateCopy

                  public boolean locatorsUpdateCopy()
                                             throws SQLException
                  Indicates whether updates made to a LOB are made on a copy or directly to the LOB.

                  HSQLDB-Specific Information:

                  Updates to a LOB are made directly. This means the lobs in an updatable ResultSet can be updated and the change is applied when the updateRow() method is applied. Lobs created by calling the Connection methods createClob() and createBlob() can be updated. The lob can then be sent to the database in a PreparedStatement with an UPDATE or INSERT SQL statement.

                  Specified by:
                  locatorsUpdateCopy in interface DatabaseMetaData
                  Returns:
                  true if updates are made to a copy of the LOB; false if updates are made directly to the LOB
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  supportsStatementPooling

                  public boolean supportsStatementPooling()
                                                   throws SQLException
                  Retrieves whether this database supports statement pooling.

                  HSQLDB-Specific Information:

                  Starting with 2.0, HSQLDB supports statement pooling when built under JDK 1.6+.

                  Specified by:
                  supportsStatementPooling in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  getRowIdLifetime

                  public RowIdLifetime getRowIdLifetime()
                                                 throws SQLException
                  Indicates whether or not this data source supports the SQL ROWID type, and if so the lifetime for which a RowId object remains valid.

                  The returned int values have the following relationship:

                       ROWID_UNSUPPORTED < ROWID_VALID_OTHER < ROWID_VALID_TRANSACTION
                           < ROWID_VALID_SESSION < ROWID_VALID_FOREVER
                   
                  so conditional logic such as
                       if (metadata.getRowIdLifetime() > DatabaseMetaData.ROWID_VALID_TRANSACTION)
                   
                  can be used. Valid Forever means valid across all Sessions, and valid for a Session means valid across all its contained Transactions.

                  Specified by:
                  getRowIdLifetime in interface DatabaseMetaData
                  Returns:
                  the status indicating the lifetime of a RowId
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.6, HSQLDB 1.9

                  getSchemas

                  public ResultSet getSchemas(String catalog,
                                              String schemaPattern)
                                       throws SQLException
                  Retrieves the schema names available in this database. The results are ordered by JDBC 4.1[TABLE_CATALOG] and TABLE_SCHEM.

                  The schema columns are:

                  1. TABLE_SCHEM String => schema name
                  2. TABLE_CATALOG String => catalog name (may be null)

                  Specified by:
                  getSchemas in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database;"" retrieves those without a catalog; null means catalog name should not be used to narrow down the search.
                  schemaPattern - a schema name; must match the schema name as it is stored in the database; null means schema name should not be used to narrow down the search.
                  Returns:
                  a ResultSet object in which each row is a schema description
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.6, HSQLDB 1.9
                  See Also:
                  getSearchStringEscape()

                  supportsStoredFunctionsUsingCallSyntax

                  public boolean supportsStoredFunctionsUsingCallSyntax()
                                                                 throws SQLException
                  Retrieves whether this database supports invoking user-defined or vendor functions using the stored procedure escape syntax.

                  Specified by:
                  supportsStoredFunctionsUsingCallSyntax in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.6, HSQLDB 1.9

                  autoCommitFailureClosesAllResultSets

                  public boolean autoCommitFailureClosesAllResultSets()
                                                               throws SQLException
                  Retrieves whether a SQLException while autoCommit is true inidcates that all open ResultSets are closed, even ones that are holdable. When a SQLException occurs while autocommit is true, it is vendor specific whether the JDBC driver responds with a commit operation, a rollback operation, or by doing neither a commit nor a rollback. A potential result of this difference is in whether or not holdable ResultSets are closed.

                  Specified by:
                  autoCommitFailureClosesAllResultSets in interface DatabaseMetaData
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.6, HSQLDB 1.9

                  getClientInfoProperties

                  public ResultSet getClientInfoProperties()
                                                    throws SQLException
                  Retrieves a list of the client info properties that the driver supports. The result set contains the following columns

                  1. NAME String=> The name of the client info property
                  2. MAX_LEN int=> The maximum length of the value for the property
                  3. DEFAULT_VALUE String=> The default value of the property
                  4. DESCRIPTION String=> A description of the property. This will typically contain information as to where this property is stored in the database.

                  The ResultSet is sorted by the NAME column

                  Specified by:
                  getClientInfoProperties in interface DatabaseMetaData
                  Returns:
                  A ResultSet object; each row is a supported client info property

                  Throws:
                  SQLException - if a database access error occurs

                  Since:
                  JDK 1.6, HSQLDB 1.9

                  getFunctions

                  public ResultSet getFunctions(String catalog,
                                                String schemaPattern,
                                                String functionNamePattern)
                                         throws SQLException
                  Retrieves a description of the JDBC 4.1[ system and ]user functions available in the given catalog.

                  Only system and user function descriptions matching the schema and function name criteria are returned. They are ordered by FUNCTION_CAT, FUNCTION_SCHEM, FUNCTION_NAME and SPECIFIC_ NAME.

                  Each function description has the the following columns:

                  1. FUNCTION_CAT String => function catalog (may be null)
                  2. FUNCTION_SCHEM String => function schema (may be null)
                  3. FUNCTION_NAME String => function name. This is the name used to invoke the function
                  4. REMARKS String => explanatory comment on the function
                  5. FUNCTION_TYPE short => kind of function:
                    • functionResultUnknown - Cannot determine if a return value or table will be returned
                    • functionNoTable- Does not return a table
                    • functionReturnsTable - Returns a table
                  6. SPECIFIC_NAME String => the name which uniquely identifies this function within its schema. This is a user specified, or DBMS generated, name that may be different then the FUNCTION_NAME for example with overload functions

                  A user may not have permission to execute any of the functions that are returned by getFunctions

                  Specified by:
                  getFunctions in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schemaPattern - a schema name pattern; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  functionNamePattern - a function name pattern; must match the function name as it is stored in the database
                  Returns:
                  ResultSet - each row is a function description
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.6, HSQLDB 1.9
                  See Also:
                  getSearchStringEscape()

                  getFunctionColumns

                  public ResultSet getFunctionColumns(String catalog,
                                                      String schemaPattern,
                                                      String functionNamePattern,
                                                      String columnNamePattern)
                                               throws SQLException
                  Retrieves a description of the given catalog's system or user function parameters and return type.

                  Only descriptions matching the schema, function and parameter name criteria are returned. They are ordered by FUNCTION_CAT, FUNCTION_SCHEM, FUNCTION_NAME and SPECIFIC_ NAME. Within this, the return value, if any, is first. Next are the parameter descriptions in call order. The column descriptions follow in column number order.

                  Each row in the ResultSet is a parameter description, column description or return type description with the following fields:

                  1. FUNCTION_CAT String => function catalog (may be null)
                  2. FUNCTION_SCHEM String => function schema (may be null)
                  3. FUNCTION_NAME String => function name. This is the name used to invoke the function
                  4. COLUMN_NAME String => column/parameter name
                  5. COLUMN_TYPE Short => kind of column/parameter:
                    • functionColumnUnknown - nobody knows
                    • functionColumnIn - IN parameter
                    • functionColumnInOut - INOUT parameter
                    • functionColumnOut - OUT parameter
                    • functionColumnReturn - function return value
                    • functionColumnResult - Indicates that the parameter or column is a column in the ResultSet
                  6. DATA_TYPE int => SQL type from java.sql.Types
                  7. TYPE_NAME String => SQL type name, for a UDT type the type name is fully qualified
                  8. PRECISION int => precision
                  9. LENGTH int => length in bytes of data
                  10. SCALE short => scale - null is returned for data types where SCALE is not applicable.
                  11. RADIX short => radix
                  12. NULLABLE short => can it contain NULL.
                    • functionNoNulls - does not allow NULL values
                    • functionNullable - allows NULL values
                    • functionNullableUnknown - nullability unknown
                  13. REMARKS String => comment describing column/parameter
                  14. CHAR_OCTET_LENGTH int => the maximum length of binary and character based parameters or columns. For any other datatype the returned value is a NULL
                  15. ORDINAL_POSITION int => the ordinal position, starting from 1, for the input and output parameters. A value of 0 is returned if this row describes the function's return value. For result set columns, it is the ordinal position of the column in the result set starting from 1.
                  16. IS_NULLABLE String => ISO rules are used to determine the nullability for a parameter or column.
                    • YES --- if the parameter or column can include NULLs
                    • NO --- if the parameter or column cannot include NULLs
                    • empty string --- if the nullability for the parameter or column is unknown
                  17. SPECIFIC_NAME String => the name which uniquely identifies this function within its schema. This is a user specified, or DBMS generated, name that may be different then the FUNCTION_NAME for example with overload functions

                  The PRECISION column represents the specified column size for the given parameter or column. For numeric data, this is the maximum precision. For character data, this is the length in characters. For datetime datatypes, this is the length in characters of the String representation (assuming the maximum allowed precision of the fractional seconds component). For binary data, this is the length in bytes. For the ROWID datatype, this is the length in bytes. Null is returned for data types where the column size is not applicable.

                  Specified by:
                  getFunctionColumns in interface DatabaseMetaData
                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schemaPattern - a schema name pattern; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  functionNamePattern - a procedure name pattern; must match the function name as it is stored in the database
                  columnNamePattern - a parameter name pattern; must match the parameter or column name as it is stored in the database
                  Returns:
                  ResultSet - each row describes a user function parameter, column or return type
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.6, HSQLDB 1.9
                  See Also:
                  getSearchStringEscape()

                  unwrap

                  public <T> T unwrap(Class<T> iface)
                           throws SQLException
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy. The result may be either the object found to implement the interface or a proxy for that object. If the receiver implements the interface then that is the object. If the receiver is a wrapper and the wrapped object implements the interface then that is the object. Otherwise the object is the result of calling unwrap recursively on the wrapped object. If the receiver is not a wrapper and does not implement the interface, then an SQLException is thrown.

                  Specified by:
                  unwrap in interface Wrapper
                  Parameters:
                  iface - A Class defining an interface that the result must implement.
                  Returns:
                  an object that implements the interface. May be a proxy for the actual implementing object.
                  Throws:
                  SQLException - If no object found that implements the interface
                  Since:
                  JDK 1.6, HSQLDB 1.9

                  isWrapperFor

                  public boolean isWrapperFor(Class<?> iface)
                                       throws SQLException
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does. Returns false otherwise. If this implements the interface then return true, else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped object. If this does not implement the interface and is not a wrapper, return false. This method should be implemented as a low-cost operation compared to unwrap so that callers can use this method to avoid expensive unwrap calls that may fail. If this method returns true then calling unwrap with the same argument should succeed.

                  Specified by:
                  isWrapperFor in interface Wrapper
                  Parameters:
                  iface - a Class defining an interface.
                  Returns:
                  true if this implements the interface or directly or indirectly wraps an object that does.
                  Throws:
                  SQLException - if an error occurs while determining whether this is a wrapper for an object with the given interface.
                  Since:
                  JDK 1.6, HSQLDB 1.9

                  getPseudoColumns

                  public ResultSet getPseudoColumns(String catalog,
                                                    String schemaPattern,
                                                    String tableNamePattern,
                                                    String columnNamePattern)
                                             throws SQLException
                  Retrieves a description of the pseudo or hidden columns available in a given table within the specified catalog and schema. Pseudo or hidden columns may not always be stored within a table and are not visible in a ResultSet unless they are specified in the query's outermost SELECT list. Pseudo or hidden columns may not necessarily be able to be modified. If there are no pseudo or hidden columns, an empty ResultSet is returned.

                  Only column descriptions matching the catalog, schema, table and column name criteria are returned. They are ordered by TABLE_CAT,TABLE_SCHEM, TABLE_NAME and COLUMN_NAME.

                  Each column description has the following columns:

                  1. TABLE_CAT String => table catalog (may be null)
                  2. TABLE_SCHEM String => table schema (may be null)
                  3. TABLE_NAME String => table name
                  4. COLUMN_NAME String => column name
                  5. DATA_TYPE int => SQL type from java.sql.Types
                  6. COLUMN_SIZE int => column size.
                  7. DECIMAL_DIGITS int => the number of fractional digits. Null is returned for data types where DECIMAL_DIGITS is not applicable.
                  8. NUM_PREC_RADIX int => Radix (typically either 10 or 2)
                  9. COLUMN_USAGE String => The allowed usage for the column. The value returned will correspond to the enum name returned by PseudoColumnUsage.name()
                  10. REMARKS String => comment describing column (may be null)
                  11. CHAR_OCTET_LENGTH int => for char types the maximum number of bytes in the column
                  12. IS_NULLABLE String => ISO rules are used to determine the nullability for a column.
                    • YES --- if the column can include NULLs
                    • NO --- if the column cannot include NULLs
                    • empty string --- if the nullability for the column is unknown

                  The COLUMN_SIZE column specifies the column size for the given column. For numeric data, this is the maximum precision. For character data, this is the length in characters. For datetime datatypes, this is the length in characters of the String representation (assuming the maximum allowed precision of the fractional seconds component). For binary data, this is the length in bytes. For the ROWID datatype, this is the length in bytes. Null is returned for data types where the column size is not applicable.

                  Parameters:
                  catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
                  schemaPattern - a schema name pattern; must match the schema name as it is stored in the database; "" retrieves those without a schema; null means that the schema name should not be used to narrow the search
                  tableNamePattern - a table name pattern; must match the table name as it is stored in the database
                  columnNamePattern - a column name pattern; must match the column name as it is stored in the database
                  Returns:
                  ResultSet - each row is a column description
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1
                  See Also:
                  PseudoColumnUsage

                  generatedKeyAlwaysReturned

                  public boolean generatedKeyAlwaysReturned()
                                                     throws SQLException
                  Retrieves whether a generated key will always be returned if the column name(s) or index(es) specified for the auto generated key column(s) are valid and the statement succeeds. The key that is returned may or may not be based on the column(s) for the auto generated key. Consult your JDBC driver documentation for additional details.

                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCPool.html0000644000175000017500000015676112007570404023501 0ustar renerene JDBCPool (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCPool

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCPool
                  
                  All Implemented Interfaces:
                  Serializable, Wrapper, EventListener, Referenceable, CommonDataSource, ConnectionEventListener, DataSource, StatementEventListener

                  public class JDBCPool
                  extends Object
                  implements DataSource, Serializable, Referenceable, ConnectionEventListener, StatementEventListener, Wrapper

                  HSQLDB-Specific Information:

                  A connection pool for HyperSQL connections. This implementation of DataSource is dedicated to HyperSQL and guarantees all connection states are automatically reset when a connection is reused.

                  The methods of the parent class, JDBCCommonDataSource are used to specify the database URL, user, password, and / or connection properties.

                  Since:
                  2.2.9
                  Author:
                  Fred Toussi (fredt@users dot sourceforge.net)
                  See Also:
                  Serialized Form

                  Constructor Summary
                  JDBCPool()
                            Creates a connection pool with the maximum size of 8.
                  JDBCPool(int size)
                            Creates a connection pool with the given maximum size.
                   
                  Method Summary
                   void close(int wait)
                            Closes the pool immediately.
                   void connectionClosed(ConnectionEvent event)
                             
                   void connectionErrorOccurred(ConnectionEvent event)
                             
                   Connection getConnection()
                            Retrieves a new connection using the properties that have already been set.
                   Connection getConnection(String username, String password)
                            Retrieves a new connection using the given username and password, and the database url that has been set.
                   String getDatabase()
                            Synonym for getUrl().
                   String getDatabaseName()
                            Synonym for getUrl().
                   String getDataSourceName()
                            Retrieves the name of the data source.
                   String getDescription()
                            Retrieves the description of the data source.
                   int getLoginTimeout()
                            Gets the maximum time in seconds that this data source can wait while attempting to connect to a database.
                   PrintWriter getLogWriter()
                            Retrieves the log writer for this DataSource object.
                   Logger getParentLogger()
                            Return the parent Logger of all the Loggers used by this data source.
                   Reference getReference()
                            Retrieves the Reference of this object.
                   String getUrl()
                            Retrieves the jdbc database connection url attribute.
                   String getUser()
                            Retrieves the user name for the connection.
                   boolean isWrapperFor(Class<?> iface)
                            Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                   void setDatabase(String database)
                            Synonym for setUrl(String).
                   void setDatabaseName(String databaseName)
                            Synonym for setUrl(String).
                   void setLoginTimeout(int seconds)
                            Sets the maximum time in seconds that this data source will wait while attempting to connect to a database.
                   void setLogWriter(PrintWriter out)
                            Sets the log writer for this DataSource object to the given java.io.PrintWriter object.
                   void setPassword(String password)
                            Sets the password for the user name.
                   void setProperties(Properties props)
                            Sets connection properties.
                   void setUrl(String url)
                            Sets the jdbc database URL.
                   void setUser(String user)
                            Sets the user name.
                   void statementClosed(StatementEvent event)
                             
                   void statementErrorOccurred(StatementEvent event)
                             
                  <T> T
                  unwrap(Class<T> iface)
                            Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  JDBCPool

                  public JDBCPool()
                  Creates a connection pool with the maximum size of 8. The database and connection settings are made before the getConnection() is called.


                  JDBCPool

                  public JDBCPool(int size)
                  Creates a connection pool with the given maximum size. The database and connection settings are made before the getConnection() is called.

                  Parameters:
                  size - int maximum size of the pool
                  Method Detail

                  getConnection

                  public Connection getConnection()
                                           throws SQLException
                  Retrieves a new connection using the properties that have already been set.

                  Specified by:
                  getConnection in interface DataSource
                  Returns:
                  a connection to the data source
                  Throws:
                  SQLException - if a database access error occurs

                  getConnection

                  public Connection getConnection(String username,
                                                  String password)
                                           throws SQLException
                  Retrieves a new connection using the given username and password, and the database url that has been set. No other properties are used for the connection

                  Specified by:
                  getConnection in interface DataSource
                  Parameters:
                  username - the database user on whose behalf the connection is being made
                  password - the user's password
                  Returns:
                  a connection to the data source
                  Throws:
                  SQLException - if a database access error occurs

                  unwrap

                  public <T> T unwrap(Class<T> iface)
                           throws SQLException
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy. If the receiver implements the interface then the result is the receiver or a proxy for the receiver. If the receiver is a wrapper and the wrapped object implements the interface then the result is the wrapped object or a proxy for the wrapped object. Otherwise return the the result of calling unwrap recursively on the wrapped object or a proxy for that result. If the receiver is not a wrapper and does not implement the interface, then an SQLException is thrown.

                  Specified by:
                  unwrap in interface Wrapper
                  Parameters:
                  iface - A Class defining an interface that the result must implement.
                  Returns:
                  an object that implements the interface. May be a proxy for the actual implementing object.
                  Throws:
                  SQLException - If no object found that implements the interface
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  isWrapperFor

                  public boolean isWrapperFor(Class<?> iface)
                                       throws SQLException
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does. Returns false otherwise. If this implements the interface then return true, else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped object. If this does not implement the interface and is not a wrapper, return false. This method should be implemented as a low-cost operation compared to unwrap so that callers can use this method to avoid expensive unwrap calls that may fail. If this method returns true then calling unwrap with the same argument should succeed.

                  Specified by:
                  isWrapperFor in interface Wrapper
                  Parameters:
                  iface - a Class defining an interface.
                  Returns:
                  true if this implements the interface or directly or indirectly wraps an object that does.
                  Throws:
                  SQLException - if an error occurs while determining whether this is a wrapper for an object with the given interface.
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getReference

                  public Reference getReference()
                                         throws NamingException
                  Retrieves the Reference of this object.

                  Specified by:
                  getReference in interface Referenceable
                  Returns:
                  The non-null Reference of this object.
                  Throws:
                  NamingException - If a naming exception was encountered while retrieving the reference.

                  connectionClosed

                  public void connectionClosed(ConnectionEvent event)
                  Specified by:
                  connectionClosed in interface ConnectionEventListener

                  connectionErrorOccurred

                  public void connectionErrorOccurred(ConnectionEvent event)
                  Specified by:
                  connectionErrorOccurred in interface ConnectionEventListener

                  statementClosed

                  public void statementClosed(StatementEvent event)
                  Specified by:
                  statementClosed in interface StatementEventListener

                  statementErrorOccurred

                  public void statementErrorOccurred(StatementEvent event)
                  Specified by:
                  statementErrorOccurred in interface StatementEventListener

                  getLogWriter

                  public PrintWriter getLogWriter()
                                           throws SQLException

                  Retrieves the log writer for this DataSource object.

                  The log writer is a character output stream to which all logging and tracing messages for this data source will be printed. This includes messages printed by the methods of this object, messages printed by methods of other objects manufactured by this object, and so on. Messages printed to a data source specific log writer are not printed to the log writer associated with the java.sql.DriverManager class. When a DataSource object is created, the log writer is initially null; in other words, the default is for logging to be disabled.

                  Specified by:
                  getLogWriter in interface CommonDataSource
                  Returns:
                  the log writer for this data source or null if logging is disabled
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  1.4
                  See Also:
                  setLogWriter(java.io.PrintWriter)

                  setLogWriter

                  public void setLogWriter(PrintWriter out)
                                    throws SQLException

                  Sets the log writer for this DataSource object to the given java.io.PrintWriter object.

                  The log writer is a character output stream to which all logging and tracing messages for this data source will be printed. This includes messages printed by the methods of this object, messages printed by methods of other objects manufactured by this object, and so on. Messages printed to a data source- specific log writer are not printed to the log writer associated with the java.sql.DriverManager class. When a DataSource object is created the log writer is initially null; in other words, the default is for logging to be disabled.

                  Specified by:
                  setLogWriter in interface CommonDataSource
                  Parameters:
                  out - the new log writer; to disable logging, set to null
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  1.4
                  See Also:
                  getLogWriter()

                  setLoginTimeout

                  public void setLoginTimeout(int seconds)
                                       throws SQLException

                  Sets the maximum time in seconds that this data source will wait while attempting to connect to a database. A value of zero specifies that the timeout is the default system timeout if there is one; otherwise, it specifies that there is no timeout. When a DataSource object is created, the login timeout is initially zero.

                  Specified by:
                  setLoginTimeout in interface CommonDataSource
                  Parameters:
                  seconds - the data source login time limit
                  Throws:
                  SQLException - if a database access error occurs.
                  Since:
                  1.4
                  See Also:
                  getLoginTimeout()

                  getLoginTimeout

                  public int getLoginTimeout()
                                      throws SQLException
                  Gets the maximum time in seconds that this data source can wait while attempting to connect to a database. A value of zero means that the timeout is the default system timeout if there is one; otherwise, it means that there is no timeout. When a DataSource object is created, the login timeout is initially zero.

                  Specified by:
                  getLoginTimeout in interface CommonDataSource
                  Returns:
                  the data source login time limit
                  Throws:
                  SQLException - if a database access error occurs.
                  Since:
                  1.4
                  See Also:
                  setLoginTimeout(int)

                  getDescription

                  public String getDescription()
                  Retrieves the description of the data source.

                  Returns:
                  the description

                  getDataSourceName

                  public String getDataSourceName()
                  Retrieves the name of the data source.

                  Returns:
                  the description

                  getDatabaseName

                  public String getDatabaseName()
                  Synonym for getUrl().

                  Returns:
                  the jdbc database connection url attribute

                  getDatabase

                  public String getDatabase()
                  Synonym for getUrl().

                  Returns:
                  the jdbc database connection url attribute

                  getUrl

                  public String getUrl()
                  Retrieves the jdbc database connection url attribute.

                  Returns:
                  the jdbc database connection url attribute

                  getUser

                  public String getUser()
                  Retrieves the user name for the connection.

                  Returns:
                  the username for the connection

                  setDatabaseName

                  public void setDatabaseName(String databaseName)
                  Synonym for setUrl(String).

                  Parameters:
                  databaseName - the new value for the attribute

                  setDatabase

                  public void setDatabase(String database)
                  Synonym for setUrl(String).

                  Parameters:
                  database - the new value for the attribute

                  setUrl

                  public void setUrl(String url)
                  Sets the jdbc database URL.

                  Parameters:
                  url - the new value of this object's jdbc database connection url attribute

                  setPassword

                  public void setPassword(String password)
                  Sets the password for the user name.

                  Parameters:
                  password - the password

                  setUser

                  public void setUser(String user)
                  Sets the user name.

                  Parameters:
                  user - the user id

                  setProperties

                  public void setProperties(Properties props)
                  Sets connection properties. If user / password / logginTimeout has been set with one of the setXXX() methods it will be added to the Properties object.

                  Parameters:
                  props - properties. If null, then existing properties will be cleared/replaced.

                  getParentLogger

                  public Logger getParentLogger()
                                         throws SQLFeatureNotSupportedException
                  Return the parent Logger of all the Loggers used by this data source. This should be the Logger farthest from the root Logger that is still an ancestor of all of the Loggers used by this data source. Configuring this Logger will affect all of the log messages generated by the data source. In the worst case, this may be the root Logger.

                  Returns:
                  the parent Logger for this data source
                  Throws:
                  SQLFeatureNotSupportedException - if the data source does not use java.util.logging.
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.2.9

                  close

                  public void close(int wait)
                             throws SQLException
                  Closes the pool immediately. Waits the given number of seconds before closing all existing connections in the pool.

                  Parameters:
                  wait - int number of seconds to wait before closing the connections, maximum 60 seconds
                  Throws:
                  SQLException


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/Util.html0000644000175000017500000007066412007570404023057 0ustar renerene Util (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class Util

                  java.lang.Object
                    extended by org.hsqldb.jdbc.Util
                  

                  public class Util
                  extends Object

                  Provides driver constants and a gateway from internal HsqlExceptions to external SQLExceptions.

                  Since:
                  1.7.2
                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)

                  Constructor Summary
                  Util()
                             
                   
                  Method Summary
                  static SQLException connectionClosedException()
                             
                  static SQLException invalidArgument()
                             
                  static SQLException invalidArgument(String name)
                             
                  static SQLException nullArgument()
                             
                  static SQLException outOfRangeArgument()
                             
                  static SQLException outOfRangeArgument(String name)
                             
                  static SQLException sqlException(org.hsqldb.HsqlException e)
                             
                  static SQLException sqlException(org.hsqldb.HsqlException e, Throwable cause)
                             
                  static SQLException sqlException(int id)
                             
                  static SQLException sqlException(int id, int add)
                             
                  static SQLException sqlException(int id, String message)
                             
                  static SQLException sqlException(int id, String message, Throwable cause)
                             
                  static SQLException sqlException(org.hsqldb.result.Result r)
                             
                  static SQLException sqlException(String msg, String sqlstate, int code, Throwable cause)
                             
                  static SQLException sqlException(Throwable t)
                             
                  static SQLException sqlExceptionSQL(int id)
                             
                  static SQLWarning sqlWarning(org.hsqldb.result.Result r)
                             
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  Util

                  public Util()
                  Method Detail

                  sqlException

                  public static final SQLException sqlException(org.hsqldb.HsqlException e)

                  sqlException

                  public static final SQLException sqlException(org.hsqldb.HsqlException e,
                                                                Throwable cause)

                  sqlException

                  public static final SQLException sqlException(int id)

                  sqlExceptionSQL

                  public static final SQLException sqlExceptionSQL(int id)

                  sqlException

                  public static final SQLException sqlException(int id,
                                                                String message)

                  sqlException

                  public static final SQLException sqlException(int id,
                                                                String message,
                                                                Throwable cause)

                  sqlException

                  public static final SQLException sqlException(int id,
                                                                int add)

                  nullArgument

                  public static SQLException nullArgument()

                  invalidArgument

                  public static SQLException invalidArgument()

                  invalidArgument

                  public static SQLException invalidArgument(String name)

                  outOfRangeArgument

                  public static SQLException outOfRangeArgument()

                  outOfRangeArgument

                  public static SQLException outOfRangeArgument(String name)

                  connectionClosedException

                  public static SQLException connectionClosedException()

                  sqlWarning

                  public static SQLWarning sqlWarning(org.hsqldb.result.Result r)

                  sqlException

                  public static SQLException sqlException(Throwable t)

                  sqlException

                  public static SQLException sqlException(org.hsqldb.result.Result r)

                  sqlException

                  public static final SQLException sqlException(String msg,
                                                                String sqlstate,
                                                                int code,
                                                                Throwable cause)


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCResultSet.html0000644000175000017500000220133612007570404024511 0ustar renerene JDBCResultSet (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCResultSet

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCResultSet
                  
                  All Implemented Interfaces:
                  ResultSet, Wrapper

                  public class JDBCResultSet
                  extends Object
                  implements ResultSet

                  A table of data representing a database result set, which is usually generated by executing a statement that queries the database.

                  A ResultSet object maintains a cursor pointing to its current row of data. Initially the cursor is positioned before the first row. The next method moves the cursor to the next row, and because it returns false when there are no more rows in the ResultSet object, it can be used in a while loop to iterate through the result set.

                  A default ResultSet object is not updatable and has a cursor that moves forward only. Thus, you can iterate through it only once and only from the first row to the last row. It is possible to produce ResultSet objects that are scrollable and/or updatable. The following code fragment, in which con is a valid Connection object, illustrates how to make a result set that is scrollable and insensitive to updates by others, and that is updatable. See ResultSet fields for other options.

                  
                         Statement stmt = con.createStatement(
                                                        ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                        ResultSet.CONCUR_UPDATABLE);
                         ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
                         // rs will be scrollable, will not show changes made by others,
                         // and will be updatable
                  
                   
                  The ResultSet interface provides getter methods (getBoolean, getLong, and so on) for retrieving column values from the current row. Values can be retrieved using either the index number of the column or the name of the column. In general, using the column index will be more efficient. Columns are numbered from 1. For maximum portability, result set columns within each row should be read in left-to-right order, and each column should be read only once.

                  For the getter methods, a JDBC driver attempts to convert the underlying data to the Java type specified in the getter method and returns a suitable Java value. The JDBC specification has a table showing the allowable mappings from SQL types to Java types that can be used by the ResultSet getter methods.

                  Column names used as input to getter methods are case insensitive. When a getter method is called with a column name and several columns have the same name, the value of the first matching column will be returned. The column name option is designed to be used when column names are used in the SQL query that generated the result set. For columns that are NOT explicitly named in the query, it is best to use column numbers. (JDBC4 clarification:) If column names are used, the programmer should take care to guarantee that they uniquely refer to the intended columns, which can be assured with the SQL AS clause.

                  A set of updater methods were added to this interface in the JDBC 2.0 API (JavaTM 2 SDK, Standard Edition, version 1.2). The comments regarding parameters to the getter methods also apply to parameters to the updater methods.

                  The updater methods may be used in two ways:

                  1. to update a column value in the current row. In a scrollable ResultSet object, the cursor can be moved backwards and forwards, to an absolute position, or to a position relative to the current row. The following code fragment updates the NAME column in the fifth row of the ResultSet object rs and then uses the method updateRow to update the data source table from which rs was derived.
                    
                           rs.absolute(5); // moves the cursor to the fifth row of rs
                           rs.updateString("NAME", "AINSWORTH"); // updates the
                              // NAME column of row 5 to be AINSWORTH
                           rs.updateRow(); // updates the row in the data source
                    
                     
                  2. to insert column values into the insert row. An updatable ResultSet object has a special row associated with it that serves as a staging area for building a row to be inserted. The following code fragment moves the cursor to the insert row, builds a three-column row, and inserts it into rs and into the data source table using the method insertRow.
                    
                           rs.moveToInsertRow(); // moves cursor to the insert row
                           rs.updateString(1, "AINSWORTH"); // updates the
                              // first column of the insert row to be AINSWORTH
                           rs.updateInt(2,35); // updates the second column to be 35
                           rs.updateBoolean(3, true); // updates the third column to true
                           rs.insertRow();
                           rs.moveToCurrentRow();
                    
                     

                  A ResultSet object is automatically closed when the Statement object that generated it is closed, re-executed, or used to retrieve the next result from a sequence of multiple results.

                  The number, types and properties of a ResultSet object's columns are provided by the ResulSetMetaData object returned by the ResultSet.getMetaData method.

                  HSQLDB-Specific Information:

                  A ResultSet object generated by HSQLDB is by default of ResultSet.TYPE_FORWARD_ONLY (as is standard JDBC behavior) and does not allow the use of absolute and relative positioning methods. If a statement is created with:

                   Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
                   
                  then the ResultSet objects it produces support using all of the absolute and relative positioning methods of JDBC2 to set the position of the current row, for example:

                   rs.absolute(5);
                   String fifthRowValue = rs.getString(1);
                   rs.relative(4);
                   String ninthRowValue = rs.getString(1);
                   
                  Note: An HSQLDB ResultSet object persists, even after its connection is closed. This is regardless of the operational mode of the Database from which it came. That is, they persist whether originating from a Server, WebServer or in-process mode Database.

                  From HSQLDB 2.0, there is full support for updatable result sets. Supported methods include all updateXXX methods for the supported types, as well as the insertRow(), updateRow(), deleteRow(), moveToInsertRow() methods.

                  The Statement must be created with ResultSet.CONCUR_UPDATABLE instead of CONCUR_READ_ONLY.

                  Updatability of a result set follows the SQL standards. Some or all columns of an updatable result set can be updated. The current row in such result sets can be deleted using the deleteRow() method. Some updatable result set can also be inserted into and support moveToInsertRow().

                  A result set is updatable if the SELECT statement is updatable. This includes SELECT from TABLE and updatable VIEW objects. An updatable SELECT statement has a single uderlying table or view. HSQLDB supports both scrollable and forward-only result sets for updatability.

                   -- In the SELECT below, columns A and B are updatable, any row can be
                   -- deleted, but it is not insertable-into as column C is not directly from
                   -- the table.
                   SELECT A, B, A + B AS C FROM T WHERE ...
                  
                   -- The SELECT below can be insertable-into so long as other columns of the
                   -- table that do not appear in the SELECT list have a default value.
                   SELECT A, B FROM T WHERE ...
                   
                  JRE 1.1.x Notes:

                  In general, JDBC 2 support requires Java 1.2 and above, and JDBC 3 requires Java 1.4 and above. In HSQLDB, support for methods introduced in different versions of JDBC depends on the JDK version used for compiling and building HSQLDB.

                  Since 1.7.0, it is possible to build the product so that all JDBC 2 methods can be called while executing under the version 1.1.x Java Runtime EnvironmentTM. However, some of these method calls require int values that are defined only in the JDBC 2 or greater version of the ResultSet interface. For this reason, when the product is compiled under JDK 1.1.x, these values are defined here, in this class.

                  In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the JDBC2-only ResultSet values can be achieved by referring to them in parameter specifications and return value comparisons, respectively, as follows:

                   JDBCResultSet.FETCH_FORWARD
                   JDBCResultSet.TYPE_FORWARD_ONLY
                   JDBCResultSet.TYPE_SCROLL_INSENSITIVE
                   JDBCResultSet.CONCUR_READ_ONLY
                   // etc.
                   
                  However, please note that code written in such a manner will not be compatible for use with other JDBC 2 drivers, since they expect and use ResultSet, rather than JDBCResultSet. Also note, this feature is offered solely as a convenience to developers who must work under JDK 1.1.x due to operating constraints, yet wish to use some of the more advanced features available under the JDBC 2 specification.

                  (fredt@users)
                  (boucherb@users)

                  Since:
                  HSQLDB 1.9.0
                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)
                  See Also:
                  JDBCStatement.executeQuery(java.lang.String), JDBCStatement.getResultSet(), ResultSetMetaData

                  Field Summary
                  static int CLOSE_CURSORS_AT_COMMIT
                            Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  static int CONCUR_READ_ONLY
                            Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  static int CONCUR_UPDATABLE
                            Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  static int FETCH_FORWARD
                            Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  static int FETCH_REVERSE
                            Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  static int FETCH_UNKNOWN
                            Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  static int HOLD_CURSORS_OVER_COMMIT
                            Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                   org.hsqldb.result.Result result
                            The underlying result.
                  static int TYPE_FORWARD_ONLY
                            Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  static int TYPE_SCROLL_INSENSITIVE
                            Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  static int TYPE_SCROLL_SENSITIVE
                            Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                   
                  Constructor Summary
                  JDBCResultSet(JDBCConnection conn, org.hsqldb.jdbc.JDBCStatementBase s, org.hsqldb.result.Result r, org.hsqldb.result.ResultMetaData metaData)
                            Constructs a new JDBCResultSet object using the specified navigator and org.hsqldb.result.ResultMetaData.
                  JDBCResultSet(JDBCConnection conn, org.hsqldb.result.Result r, org.hsqldb.result.ResultMetaData metaData)
                             
                   
                  Method Summary
                   boolean absolute(int row)
                            Moves the cursor to the given row number in this ResultSet object.
                   void afterLast()
                            Moves the cursor to the end of this ResultSet object, just after the last row.
                   void beforeFirst()
                            Moves the cursor to the front of this ResultSet object, just before the first row.
                   void cancelRowUpdates()
                            Cancels the updates made to the current row in this ResultSet object.
                   void clearWarnings()
                            Clears all warnings reported on this ResultSet object.
                   void close()
                            Releases this ResultSet object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed.
                   void deleteRow()
                            Deletes the current row from this ResultSet object and from the underlying database.
                   int findColumn(String columnLabel)
                            Maps the given ResultSet column label to its ResultSet column index.
                   boolean first()
                            Moves the cursor to the first row in this ResultSet object.
                   Array getArray(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as an Array object in the Java programming language.
                   Array getArray(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as an Array object in the Java programming language.
                   InputStream getAsciiStream(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a stream of ASCII characters.
                   InputStream getAsciiStream(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a stream of ASCII characters.
                   BigDecimal getBigDecimal(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.math.BigDecimal with full precision.
                   BigDecimal getBigDecimal(int columnIndex, int scale)
                            Deprecated. by java.sun.com as of JDK 1.2
                   BigDecimal getBigDecimal(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.math.BigDecimal with full precision.
                   BigDecimal getBigDecimal(String columnLabel, int scale)
                            Deprecated. by java.sun.com as of JDK 1.2
                   InputStream getBinaryStream(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a stream of uninterpreted bytes.
                   InputStream getBinaryStream(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a stream of uninterpreted bytes.
                   Blob getBlob(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a Blob object in the Java programming language.
                   Blob getBlob(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a Blob object in the Java programming language.
                   boolean getBoolean(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a boolean in the Java programming language.
                   boolean getBoolean(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a boolean in the Java programming language.
                   byte getByte(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a byte in the Java programming language.
                   byte getByte(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a byte in the Java programming language.
                   byte[] getBytes(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a byte array in the Java programming language.
                   byte[] getBytes(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a byte array in the Java programming language.
                   Reader getCharacterStream(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader object.
                   Reader getCharacterStream(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader object.
                   Clob getClob(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a Clob object in the Java programming language.
                   Clob getClob(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a Clob object in the Java programming language.
                   int getConcurrency()
                            Retrieves the concurrency mode of this ResultSet object.
                   String getCursorName()
                            Retrieves the name of the SQL cursor used by this ResultSet object.
                   Date getDate(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object in the Java programming language.
                   Date getDate(int columnIndex, Calendar cal)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object in the Java programming language.
                   Date getDate(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object in the Java programming language.
                   Date getDate(String columnLabel, Calendar cal)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object in the Java programming language.
                   double getDouble(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a double in the Java programming language.
                   double getDouble(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a double in the Java programming language.
                   int getFetchDirection()
                            Retrieves the fetch direction for this ResultSet object.
                   int getFetchSize()
                            Retrieves the fetch size for this ResultSet object.
                   float getFloat(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a float in the Java programming language.
                   float getFloat(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a float in the Java programming language.
                   int getHoldability()
                            Retrieves the holdability of this ResultSet object
                   int getInt(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as an int in the Java programming language.
                   int getInt(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as an int in the Java programming language.
                   long getLong(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a long in the Java programming language.
                   long getLong(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a long in the Java programming language.
                   ResultSetMetaData getMetaData()
                            Retrieves the number, types and properties of this ResultSet object's columns.
                   Reader getNCharacterStream(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader object.
                   Reader getNCharacterStream(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader object.
                   NClob getNClob(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a NClob object in the Java programming language.
                   NClob getNClob(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a NClob object in the Java programming language.
                   String getNString(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language.
                   String getNString(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language.
                   Object getObject(int columnIndex)
                             
                  <T> T
                  getObject(int columnIndex, Class<T> type)
                            Retrieves the value of the designated column in the current row of this ResultSet object and will convert from the SQL type of the column to the requested Java data type, if the conversion is supported.
                   Object getObject(int columnIndex, Map map)
                            Retrieves the value of the designated column in the current row of this ResultSet object as an Object in the Java programming language.
                   Object getObject(String columnLabel)
                             
                  <T> T
                  getObject(String columnLabel, Class<T> type)
                            Retrieves the value of the designated column in the current row of this ResultSet object and will convert from the SQL type of the column to the requested Java data type, if the conversion is supported.
                   Object getObject(String columnLabel, Map map)
                            Retrieves the value of the designated column in the current row of this ResultSet object as an Object in the Java programming language.
                   Ref getRef(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a Ref object in the Java programming language.
                   Ref getRef(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a Ref object in the Java programming language.
                   int getRow()
                            Retrieves the current row number.
                   RowId getRowId(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.RowId object in the Java programming language.
                   RowId getRowId(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.RowId object in the Java programming language.
                   short getShort(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a short in the Java programming language.
                   short getShort(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a short in the Java programming language.
                   SQLXML getSQLXML(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet as a java.sql.SQLXML object in the Java programming language.
                   SQLXML getSQLXML(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet as a java.sql.SQLXML object in the Java programming language.
                   Statement getStatement()
                            Retrieves the Statement object that produced this ResultSet object.
                   String getString(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language.
                   String getString(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language.
                   Time getTime(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object in the Java programming language.
                   Time getTime(int columnIndex, Calendar cal)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object in the Java programming language.
                   Time getTime(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object in the Java programming language.
                   Time getTime(String columnLabel, Calendar cal)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object in the Java programming language.
                   Timestamp getTimestamp(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp object in the Java programming language.
                   Timestamp getTimestamp(int columnIndex, Calendar cal)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp object in the Java programming language.
                   Timestamp getTimestamp(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp object in the Java programming language.
                   Timestamp getTimestamp(String columnLabel, Calendar cal)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp object in the Java programming language.
                   int getType()
                            Retrieves the type of this ResultSet object.
                   InputStream getUnicodeStream(int columnIndex)
                            Deprecated. use getCharacterStream in place of getUnicodeStream
                   InputStream getUnicodeStream(String columnLabel)
                            Deprecated. use getCharacterStream instead
                   URL getURL(int columnIndex)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.net.URL object in the Java programming language.
                   URL getURL(String columnLabel)
                            Retrieves the value of the designated column in the current row of this ResultSet object as a java.net.URL object in the Java programming language.
                   SQLWarning getWarnings()
                            Retrieves the first warning reported by calls on this ResultSet object.
                   void insertRow()
                            Inserts the contents of the insert row into this ResultSet object and into the database.
                   boolean isAfterLast()
                            Retrieves whether the cursor is after the last row in this ResultSet object.
                   boolean isBeforeFirst()
                            Retrieves whether the cursor is before the first row in this ResultSet object.
                   boolean isClosed()
                            Retrieves whether this ResultSet object has been closed.
                   boolean isFirst()
                            Retrieves whether the cursor is on the first row of this ResultSet object.
                   boolean isLast()
                            Retrieves whether the cursor is on the last row of this ResultSet object.
                   boolean isWrapperFor(Class<?> iface)
                            Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                   boolean last()
                            Moves the cursor to the last row in this ResultSet object.
                   void moveToCurrentRow()
                            Moves the cursor to the remembered cursor position, usually the current row.
                   void moveToInsertRow()
                            Moves the cursor to the insert row.
                  static JDBCResultSet newJDBCResultSet(org.hsqldb.result.Result r, org.hsqldb.result.ResultMetaData metaData)
                            Factory method returns a new JDBCResultSet object for use with user defined functions that retrun a ResultSet object.
                   boolean next()
                            Moves the cursor froward one row from its current position.
                   boolean previous()
                            Moves the cursor to the previous row in this ResultSet object.
                   void refreshRow()
                            Refreshes the current row with its most recent value in the database.
                   boolean relative(int rows)
                            Moves the cursor a relative number of rows, either positive or negative.
                   boolean rowDeleted()
                            Retrieves whether a row has been deleted.
                   boolean rowInserted()
                            Retrieves whether the current row has had an insertion.
                   boolean rowUpdated()
                            Retrieves whether the current row has been updated.
                   void setFetchDirection(int direction)
                            Gives a hint as to the direction in which the rows in this ResultSet object will be processed.
                   void setFetchSize(int rows)
                            Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for this ResultSet object.
                  <T> T
                  unwrap(Class<T> iface)
                            Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                   void updateArray(int columnIndex, Array x)
                            Updates the designated column with a java.sql.Array value.
                   void updateArray(String columnLabel, Array x)
                            Updates the designated column with a java.sql.Array value.
                   void updateAsciiStream(int columnIndex, InputStream x)
                            Updates the designated column with an ascii stream value.
                   void updateAsciiStream(int columnIndex, InputStream x, int length)
                            (JDBC4 clarification:) Updates the designated column with an ascii stream value, which will have the specified number of bytes.
                   void updateAsciiStream(int columnIndex, InputStream x, long length)
                            Updates the designated column with an ascii stream value, which will have the specified number of bytes.
                   void updateAsciiStream(String columnLabel, InputStream x)
                            Updates the designated column with an ascii stream value.
                   void updateAsciiStream(String columnLabel, InputStream x, int length)
                            (JDBC4 clarification:) Updates the designated column with an ascii stream value, which will have the specified number of bytes.
                   void updateAsciiStream(String columnLabel, InputStream x, long length)
                            Updates the designated column with an ascii stream value, which will have the specified number of bytes..
                   void updateBigDecimal(int columnIndex, BigDecimal x)
                            Updates the designated column with a java.math.BigDecimal value.
                   void updateBigDecimal(String columnLabel, BigDecimal x)
                            Updates the designated column with a java.sql.BigDecimal value.
                   void updateBinaryStream(int columnIndex, InputStream x)
                            Updates the designated column with a binary stream value.
                   void updateBinaryStream(int columnIndex, InputStream x, int length)
                            (JDBC4 clarification:) Updates the designated column with a binary stream value, which will have the specified number of bytes.
                   void updateBinaryStream(int columnIndex, InputStream x, long length)
                            Updates the designated column with a binary stream value, which will have the specified number of bytes.
                   void updateBinaryStream(String columnLabel, InputStream x)
                            Updates the designated column with a binary stream value.
                   void updateBinaryStream(String columnLabel, InputStream x, int length)
                            (JDBC4 clarification:) Updates the designated column with a binary stream value, which will have the specified number of bytes.
                   void updateBinaryStream(String columnLabel, InputStream x, long length)
                            Updates the designated column with a binary stream value, which will have the specified number of bytes.
                   void updateBlob(int columnIndex, Blob x)
                            Updates the designated column with a java.sql.Blob value.
                   void updateBlob(int columnIndex, InputStream inputStream)
                            Updates the designated column using the given input stream.
                   void updateBlob(int columnIndex, InputStream inputStream, long length)
                            Updates the designated column using the given input stream, which will have the specified number of bytes.
                   void updateBlob(String columnLabel, Blob x)
                            Updates the designated column with a java.sql.Blob value.
                   void updateBlob(String columnLabel, InputStream inputStream)
                            Updates the designated column using the given input stream.
                   void updateBlob(String columnLabel, InputStream inputStream, long length)
                            Updates the designated column using the given input stream, which will have the specified number of bytes.
                   void updateBoolean(int columnIndex, boolean x)
                            Updates the designated column with a boolean value.
                   void updateBoolean(String columnLabel, boolean x)
                            Updates the designated column with a boolean value.
                   void updateByte(int columnIndex, byte x)
                            Updates the designated column with a byte value.
                   void updateByte(String columnLabel, byte x)
                            Updates the designated column with a byte value.
                   void updateBytes(int columnIndex, byte[] x)
                            Updates the designated column with a byte array value.
                   void updateBytes(String columnLabel, byte[] x)
                            Updates the designated column with a byte array value.
                   void updateCharacterStream(int columnIndex, Reader x)
                            Updates the designated column with a character stream value.
                   void updateCharacterStream(int columnIndex, Reader x, int length)
                            (JDBC4 clarification:) Updates the designated column with a character stream value, which will have the specified number of (CHECKME: characters?) bytes.
                   void updateCharacterStream(int columnIndex, Reader x, long length)
                            Updates the designated column with a character stream value, which will have the specified number of bytes.
                   void updateCharacterStream(String columnLabel, Reader reader)
                            Updates the designated column with a character stream value.
                   void updateCharacterStream(String columnLabel, Reader reader, int length)
                            (JDBC4 clarification) Updates the designated column with a character stream value, which will have the specified number of (CHECKME: characters?) bytes.
                   void updateCharacterStream(String columnLabel, Reader reader, long length)
                            Updates the designated column with a character stream value, which will have the specified number of bytes.
                   void updateClob(int columnIndex, Clob x)
                            Updates the designated column with a java.sql.Clob value.
                   void updateClob(int columnIndex, Reader reader)
                            Updates the designated column using the given Reader object.
                   void updateClob(int columnIndex, Reader reader, long length)
                            Updates the designated column using the given Reader object, which is the given number of characters long.
                   void updateClob(String columnLabel, Clob x)
                            Updates the designated column with a java.sql.Clob value.
                   void updateClob(String columnLabel, Reader reader)
                            Updates the designated column using the given Reader object.
                   void updateClob(String columnLabel, Reader reader, long length)
                            Updates the designated column using the given Reader object, which is the given number of characters long.
                   void updateDate(int columnIndex, Date x)
                            Updates the designated column with a java.sql.Date value.
                   void updateDate(String columnLabel, Date x)
                            Updates the designated column with a java.sql.Date value.
                   void updateDouble(int columnIndex, double x)
                            Updates the designated column with a double value.
                   void updateDouble(String columnLabel, double x)
                            Updates the designated column with a double value.
                   void updateFloat(int columnIndex, float x)
                            Updates the designated column with a float value.
                   void updateFloat(String columnLabel, float x)
                            Updates the designated column with a float value.
                   void updateInt(int columnIndex, int x)
                            Updates the designated column with an int value.
                   void updateInt(String columnLabel, int x)
                            Updates the designated column with an int value.
                   void updateLong(int columnIndex, long x)
                            Updates the designated column with a long value.
                   void updateLong(String columnLabel, long x)
                            Updates the designated column with a long value.
                   void updateNCharacterStream(int columnIndex, Reader reader)
                            Updates the designated column with a character stream value.
                   void updateNCharacterStream(int columnIndex, Reader x, long length)
                            Updates the designated column with a character stream value, which will have the specified number of bytes.
                   void updateNCharacterStream(String columnLabel, Reader reader)
                            Updates the designated column with a character stream value.
                   void updateNCharacterStream(String columnLabel, Reader reader, long length)
                            Updates the designated column with a character stream value, which will have the specified number of bytes.
                   void updateNClob(int columnIndex, NClob nClob)
                            Updates the designated column with a java.sql.NClob value.
                   void updateNClob(int columnIndex, Reader reader)
                            Updates the designated column using the given Reader The data will be read from the stream as needed until end-of-stream is reached.
                   void updateNClob(int columnIndex, Reader reader, long length)
                            Updates the designated column using the given Reader object, which is the given number of characters long.
                   void updateNClob(String columnLabel, NClob nClob)
                            Updates the designated column with a java.sql.NClob value.
                   void updateNClob(String columnLabel, Reader reader)
                            Updates the designated column using the given Reader object.
                   void updateNClob(String columnLabel, Reader reader, long length)
                            Updates the designated column using the given Reader object, which is the given number of characters long.
                   void updateNString(int columnIndex, String nString)
                            Updates the designated column with a String value.
                   void updateNString(String columnLabel, String nString)
                            Updates the designated column with a String value.
                   void updateNull(int columnIndex)
                            (JDBC4 clarification:) Updates the designated column with a null value.
                   void updateNull(String columnLabel)
                            Updates the designated column with a null value.
                   void updateObject(int columnIndex, Object x)
                            Updates the designated column with an Object value.
                   void updateObject(int columnIndex, Object x, int scaleOrLength)
                            Updates the designated column with an Object value.
                   void updateObject(String columnLabel, Object x)
                            Updates the designated column with an Object value.
                   void updateObject(String columnLabel, Object x, int scaleOrLength)
                            Updates the designated column with an Object value.
                   void updateRef(int columnIndex, Ref x)
                            Updates the designated column with a java.sql.Ref value.
                   void updateRef(String columnLabel, Ref x)
                            Updates the designated column with a java.sql.Ref value.
                   void updateRow()
                            Updates the underlying database with the new contents of the current row of this ResultSet object.
                   void updateRowId(int columnIndex, RowId x)
                            Updates the designated column with a RowId value.
                   void updateRowId(String columnLabel, RowId x)
                            Updates the designated column with a RowId value.
                   void updateShort(int columnIndex, short x)
                            Updates the designated column with a short value.
                   void updateShort(String columnLabel, short x)
                            Updates the designated column with a short value.
                   void updateSQLXML(int columnIndex, SQLXML xmlObject)
                            Updates the designated column with a java.sql.SQLXML value.
                   void updateSQLXML(String columnLabel, SQLXML xmlObject)
                            Updates the designated column with a java.sql.SQLXML value.
                   void updateString(int columnIndex, String x)
                            Updates the designated column with a String value.
                   void updateString(String columnLabel, String x)
                            Updates the designated column with a String value.
                   void updateTime(int columnIndex, Time x)
                            Updates the designated column with a java.sql.Time value.
                   void updateTime(String columnLabel, Time x)
                            Updates the designated column with a java.sql.Time value.
                   void updateTimestamp(int columnIndex, Timestamp x)
                            Updates the designated column with a java.sql.Timestamp value.
                   void updateTimestamp(String columnLabel, Timestamp x)
                            Updates the designated column with a java.sql.Timestamp value.
                   boolean wasNull()
                            Reports whether the last column read had a value of SQL NULL.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Field Detail

                  result

                  public org.hsqldb.result.Result result
                  The underlying result.


                  FETCH_FORWARD

                  public static final int FETCH_FORWARD
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

                  See Also:
                  Constant Field Values

                  FETCH_REVERSE

                  public static final int FETCH_REVERSE
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

                  See Also:
                  Constant Field Values

                  FETCH_UNKNOWN

                  public static final int FETCH_UNKNOWN
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

                  See Also:
                  Constant Field Values

                  TYPE_FORWARD_ONLY

                  public static final int TYPE_FORWARD_ONLY
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

                  See Also:
                  Constant Field Values

                  TYPE_SCROLL_INSENSITIVE

                  public static final int TYPE_SCROLL_INSENSITIVE
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

                  (JDBC4 clarification:) scrollable but generally not sensitive to changes to the data that underlies the ResultSet.

                  See Also:
                  Constant Field Values

                  TYPE_SCROLL_SENSITIVE

                  public static final int TYPE_SCROLL_SENSITIVE
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

                  (JDBC4 clarification:) scrollable and generally sensitive to changes to the data that underlies the ResultSet.

                  See Also:
                  Constant Field Values

                  CONCUR_READ_ONLY

                  public static final int CONCUR_READ_ONLY
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

                  See Also:
                  Constant Field Values

                  CONCUR_UPDATABLE

                  public static final int CONCUR_UPDATABLE
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

                  See Also:
                  Constant Field Values

                  HOLD_CURSORS_OVER_COMMIT

                  public static final int HOLD_CURSORS_OVER_COMMIT
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

                  See Also:
                  Constant Field Values

                  CLOSE_CURSORS_AT_COMMIT

                  public static final int CLOSE_CURSORS_AT_COMMIT
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

                  See Also:
                  Constant Field Values
                  Constructor Detail

                  JDBCResultSet

                  public JDBCResultSet(JDBCConnection conn,
                                       org.hsqldb.jdbc.JDBCStatementBase s,
                                       org.hsqldb.result.Result r,
                                       org.hsqldb.result.ResultMetaData metaData)
                  Constructs a new JDBCResultSet object using the specified navigator and org.hsqldb.result.ResultMetaData.

                  Parameters:
                  conn - JDBCConnection
                  s - the statement
                  r - the internal result form that the new JDBCResultSet represents
                  metaData - the connection properties

                  JDBCResultSet

                  public JDBCResultSet(JDBCConnection conn,
                                       org.hsqldb.result.Result r,
                                       org.hsqldb.result.ResultMetaData metaData)
                  Method Detail

                  next

                  public boolean next()
                               throws SQLException
                  Moves the cursor froward one row from its current position. A ResultSet cursor is initially positioned before the first row; the first call to the method next makes the first row the current row; the second call makes the second row the current row, and so on.

                  (JDBC4 clarification:) When a call to the next method returns false, the cursor is positioned after the last row. Any invocation of a ResultSet method which requires a current row will result in a SQLException being thrown. If the result set type is TYPE_FORWARD_ONLY, it is vendor specified whether their JDBC driver implementation will return false or throw an SQLException on a subsequent call to next.

                  If an input stream is open for the current row, a call to the method next will implicitly close it. A ResultSet object's warning chain is cleared when a new row is read.

                  Specified by:
                  next in interface ResultSet
                  Returns:
                  true if the new current row is valid; false if there are no more rows
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  close

                  public void close()
                             throws SQLException
                  Releases this ResultSet object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed.

                  (JDBC4 clarification:) The closing of a ResultSet object does not close the Blob, Clob or NClob objects created by the ResultSet. Blob, Clob or NClob objects remain valid for at least the duration of the transaction in which they are created, unless their free method is invoked.

                  (JDBC4 clarification:) When a ResultSet is closed, any ResultSetMetaData instances that were created by calling the getMetaData method remain accessible.

                  Note: A ResultSet object is automatically closed by the Statement object that generated it when that Statement object is closed, re-executed, or is used to retrieve the next result from a sequence of multiple results. (JDBC4 deleted:) [A ResultSet object is also automatically closed when it is garbage collected.]

                  Calling the method close on a ResultSet object that is already closed is a no-op.

                  Specified by:
                  close in interface ResultSet
                  Throws:
                  SQLException - if a database access error occurs

                  wasNull

                  public boolean wasNull()
                                  throws SQLException
                  Reports whether the last column read had a value of SQL NULL. Note that you must first call one of the getter methods on a column to try to read its value and then call the method wasNull to see if the value read was SQL NULL.

                  Specified by:
                  wasNull in interface ResultSet
                  Returns:
                  true if the last column value read was SQL NULL and false otherwise
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getString

                  public String getString(int columnIndex)
                                   throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language.

                  Specified by:
                  getString in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getBoolean

                  public boolean getBoolean(int columnIndex)
                                     throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a boolean in the Java programming language.

                  (JDBC4 clarification:)

                  If the designated column has a datatype of CHAR or VARCHAR and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 0, a value of false is returned. If the designated column has a datatype of CHAR or VARCHAR and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 1, a value of true is returned.

                  Specified by:
                  getBoolean in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is false
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getByte

                  public byte getByte(int columnIndex)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a byte in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB converts the numeric value to the return type. If the value is out of the range for the return type, an error is returned. For example, this can happen if getByte() or getShort() is used to retrieve a value of type INTEGER or BIGINT and the value is beyond the range covered by the return type.

                  Specified by:
                  getByte in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is 0
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getShort

                  public short getShort(int columnIndex)
                                 throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a short in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB converts the numeric value to the return type. If the value is out of the range for the return type, an error is returned. For example, this can happen if getByte() or getShort() is used to retrieve a value of type INTEGER or BIGINT and the value is beyond the range covered by the return type.

                  Specified by:
                  getShort in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is 0
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getInt

                  public int getInt(int columnIndex)
                             throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as an int in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB converts the numeric value to the return type. If the value is out of the range for the return type, an error is returned. For example, this can happen if getInt() or getLong() is used to retrieve a value of type DECIMAL or NUMERIC with a large precision and the value is beyond the range covered by the return type.

                  Specified by:
                  getInt in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is 0
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getLong

                  public long getLong(int columnIndex)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a long in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB converts the numeric value to the return type. If the value is out of the range for the return type, an error is returned. For example, this can happen if getInt() or getLong() is used to retrieve a value of type DECIMAL or NUMERIC with a large precision and the value is beyond the range covered by the return type.

                  Specified by:
                  getLong in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is 0
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getFloat

                  public float getFloat(int columnIndex)
                                 throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a float in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB converts the numeric value to the return type. If the value is out of the range for the return type, an error is returned. For example, this can happen if getFloat() or getDouble() is used to retrieve a value of type DECIMAL or NUMERIC with a large precision and the value is beyond the range covered by the return type.

                  Specified by:
                  getFloat in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is 0
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getDouble

                  public double getDouble(int columnIndex)
                                   throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a double in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB converts the numeric value to the return type. If the value is out of the range for the return type, an error is returned. For example, this can happen if getFloat() or getDouble() is used to retrieve a value of type DECIMAL or NUMERIC with a large precision and the value is beyond the range covered by the return type.

                  Specified by:
                  getDouble in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is 0
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getBigDecimal

                  public BigDecimal getBigDecimal(int columnIndex,
                                                  int scale)
                                           throws SQLException
                  Deprecated. by java.sun.com as of JDK 1.2

                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.BigDecimal in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB converts the result and sets the scale with BigDecimal.ROUND_HALF_DOWN.

                  Specified by:
                  getBigDecimal in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  scale - the number of digits to the right of the decimal point
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method

                  getBytes

                  public byte[] getBytes(int columnIndex)
                                  throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a byte array in the Java programming language. The bytes represent the raw values returned by the driver.

                  HSQLDB-Specific Information:

                  HSQLDB returns correct values for columns of binary types BINARY, BIT, BLOB

                  Specified by:
                  getBytes in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getDate

                  public Date getDate(int columnIndex)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object in the Java programming language.

                  Specified by:
                  getDate in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getTime

                  public Time getTime(int columnIndex)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object in the Java programming language.

                  Specified by:
                  getTime in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getTimestamp

                  public Timestamp getTimestamp(int columnIndex)
                                         throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp object in the Java programming language.

                  Specified by:
                  getTimestamp in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getAsciiStream

                  public InputStream getAsciiStream(int columnIndex)
                                             throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a stream of ASCII characters. The value can then be read in chunks from the stream. This method is particularly suitable for retrieving large LONGVARCHAR values. The JDBC driver will do any necessary conversion from the database format into ASCII.

                  Note: All the data in the returned stream must be read prior to getting the value of any other column. The next call to a getter method implicitly closes the stream. Also, a stream may return 0 when the method InputStream.available is called whether there is data available or not.

                  HSQLDB-Specific Information:

                  The limitation noted above does not apply to HSQLDB.

                  When the column is of type CHAR and its variations, it requires no conversion since it is represented internally already as a Java String object. When the column is not of type CHAR and its variations, the returned stream is based on a conversion to the Java String representation of the value. In either case, the obtained stream is always equivalent to a stream of the low order bytes from the value's String representation.

                  HSQLDB SQL CHAR and its variations are all Unicode strings internally, so the recommended alternatives to this method are getString, getUnicodeStream (deprecated) and new to 1.7.0: getCharacterStream (now prefered over the deprecated getUnicodeStream alternative).

                  Specified by:
                  getAsciiStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  a Java input stream that delivers the database column value as a stream of one-byte ASCII characters; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getUnicodeStream

                  public InputStream getUnicodeStream(int columnIndex)
                                               throws SQLException
                  Deprecated. use getCharacterStream in place of getUnicodeStream

                  Retrieves the value of the designated column in the current row of this ResultSet object as as a stream of two-byte Unicode characters. The first byte is the high byte; the second byte is the low byte. The value can then be read in chunks from the stream. This method is particularly suitable for retrieving large LONGVARCHARvalues. The JDBC driver will do any necessary conversion from the database format into Unicode.

                  Note: All the data in the returned stream must be read prior to getting the value of any other column. The next call to a getter method implicitly closes the stream. Also, a stream may return 0 when the method InputStream.available is called, whether there is data available or not.

                  HSQLDB-Specific Information:

                  The limitation noted above does not apply to HSQLDB.

                  When the column is of type CHAR and its variations, it requires no conversion since it is represented internally already as Java Strings. When the column is not of type CHAR and its variations, the returned stream is based on a conversion to the Java String representation of the value. In either case, the obtained stream is always equivalent to a stream of bytes from the value's String representation, with high-byte first.

                  Specified by:
                  getUnicodeStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  a Java input stream that delivers the database column value as a stream of two-byte Unicode characters; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method

                  getBinaryStream

                  public InputStream getBinaryStream(int columnIndex)
                                              throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a stream of uninterpreted bytes. The value can then be read in chunks from the stream. This method is particularly suitable for retrieving large LONGVARBINARY values.

                  Note: All the data in the returned stream must be read prior to getting the value of any other column. The next call to a getter method implicitly closes the stream. Also, a stream may return 0 when the method InputStream.available is called whether there is data available or not.

                  Specified by:
                  getBinaryStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  a Java input stream that delivers the database column value as a stream of uninterpreted bytes; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getString

                  public String getString(String columnLabel)
                                   throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language.

                  Specified by:
                  getString in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getBoolean

                  public boolean getBoolean(String columnLabel)
                                     throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a boolean in the Java programming language.

                  (JDBC4 clarification:) If the designated column has a datatype of CHAR or VARCHAR and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 0, a value of false is returned. If the designated column has a datatype of CHAR or VARCHAR and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 1, a value of true is returned.

                  Specified by:
                  getBoolean in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is false
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getByte

                  public byte getByte(String columnLabel)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a byte in the Java programming language.

                  Specified by:
                  getByte in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is 0
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getShort

                  public short getShort(String columnLabel)
                                 throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a short in the Java programming language.

                  Specified by:
                  getShort in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is 0
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getInt

                  public int getInt(String columnLabel)
                             throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as an int in the Java programming language.

                  Specified by:
                  getInt in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is 0
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getLong

                  public long getLong(String columnLabel)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a long in the Java programming language.

                  Specified by:
                  getLong in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is 0
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getFloat

                  public float getFloat(String columnLabel)
                                 throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a float in the Java programming language.

                  Specified by:
                  getFloat in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is 0
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getDouble

                  public double getDouble(String columnLabel)
                                   throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a double in the Java programming language.

                  Specified by:
                  getDouble in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is 0
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getBigDecimal

                  public BigDecimal getBigDecimal(String columnLabel,
                                                  int scale)
                                           throws SQLException
                  Deprecated. by java.sun.com as of JDK 1.2

                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.math.BigDecimal in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB converts the result and sets the scale with BigDecimal.ROUND_HALF_DOWN.

                  Specified by:
                  getBigDecimal in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  scale - the number of digits to the right of the decimal point
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method

                  getBytes

                  public byte[] getBytes(String columnLabel)
                                  throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a byte array in the Java programming language. The bytes represent the raw values returned by the driver.

                  Specified by:
                  getBytes in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getDate

                  public Date getDate(String columnLabel)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object in the Java programming language.

                  Specified by:
                  getDate in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getTime

                  public Time getTime(String columnLabel)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object in the Java programming language.

                  Specified by:
                  getTime in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getTimestamp

                  public Timestamp getTimestamp(String columnLabel)
                                         throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp object in the Java programming language.

                  Specified by:
                  getTimestamp in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getAsciiStream

                  public InputStream getAsciiStream(String columnLabel)
                                             throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a stream of ASCII characters. The value can then be read in chunks from the stream. This method is particularly suitable for retrieving large LONGVARCHAR values. The JDBC driver will do any necessary conversion from the database format into ASCII.

                  Note: All the data in the returned stream must be read prior to getting the value of any other column. The next call to a getter method implicitly closes the stream. Also, a stream may return 0 when the method available is called whether there is data available or not.

                  Specified by:
                  getAsciiStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  a Java input stream that delivers the database column value as a stream of one-byte ASCII characters. If the value is SQL NULL, the value returned is null.
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  See Also:
                  getAsciiStream(int)

                  getUnicodeStream

                  public InputStream getUnicodeStream(String columnLabel)
                                               throws SQLException
                  Deprecated. use getCharacterStream instead

                  Retrieves the value of the designated column in the current row of this ResultSet object as a stream of two-byte Unicode characters. The first byte is the high byte; the second byte is the low byte. The value can then be read in chunks from the stream. This method is particularly suitable for retrieving large LONGVARCHAR values. The JDBC technology-enabled driver will do any necessary conversion from the database format into Unicode.

                  Note: All the data in the returned stream must be read prior to getting the value of any other column. The next call to a getter method implicitly closes the stream. Also, a stream may return 0 when the method InputStream.available is called, whether there is data available or not.

                  Specified by:
                  getUnicodeStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  a Java input stream that delivers the database column value as a stream of two-byte Unicode characters. If the value is SQL NULL, the value returned is null.
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  See Also:
                  getUnicodeStream(int)

                  getBinaryStream

                  public InputStream getBinaryStream(String columnLabel)
                                              throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a stream of uninterpreted bytes. The value can then be read in chunks from the stream. This method is particularly suitable for retrieving large LONGVARBINARY values.

                  Note: All the data in the returned stream must be read prior to getting the value of any other column. The next call to a getter method implicitly closes the stream. Also, a stream may return 0 when the method available is called whether there is data available or not.

                  Specified by:
                  getBinaryStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  a Java input stream that delivers the database column value as a stream of uninterpreted bytes; if the value is SQL NULL, the result is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getWarnings

                  public SQLWarning getWarnings()
                                         throws SQLException
                  Retrieves the first warning reported by calls on this ResultSet object. Subsequent warnings on this ResultSet object will be chained to the SQLWarning object that this method returns.

                  The warning chain is automatically cleared each time a new row is read. This method may not be called on a ResultSet object that has been closed; doing so will cause an SQLException to be thrown.

                  Note: This warning chain only covers warnings caused by ResultSet methods. Any warning caused by Statement methods (such as reading OUT parameters) will be chained on the Statement object.

                  HSQLDB-Specific Information:

                  HSQLDB does not produce SQLWarning objects on any ResultSet object warning chain; this method always returns null.

                  Specified by:
                  getWarnings in interface ResultSet
                  Returns:
                  the first SQLWarning object reported or null if there are none
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  clearWarnings

                  public void clearWarnings()
                                     throws SQLException
                  Clears all warnings reported on this ResultSet object. After this method is called, the method getWarnings returns null until a new warning is reported for this ResultSet object.

                  HSQLDB-Specific Information:

                  HSQLDB does not produce SQLWarning objects on any ResultSet object warning chain; calls to this method are ignored.

                  Specified by:
                  clearWarnings in interface ResultSet
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getCursorName

                  public String getCursorName()
                                       throws SQLException
                  Retrieves the name of the SQL cursor used by this ResultSet object.

                  In SQL, a result table is retrieved through a cursor that is named. The current row of a result set can be updated or deleted using a positioned update/delete statement that references the cursor name. To insure that the cursor has the proper isolation level to support update, the cursor's SELECT statement should be of the form SELECT FOR UPDATE. If FOR UPDATE is omitted, the positioned updates may fail.

                  The JDBC API supports this SQL feature by providing the name of the SQL cursor used by a ResultSet object. The current row of a ResultSet object is also the current row of this SQL cursor.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature when the cursor has a name.

                  Specified by:
                  getCursorName in interface ResultSet
                  Returns:
                  the SQL name for this ResultSet object's cursor
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method

                  getMetaData

                  public ResultSetMetaData getMetaData()
                                                throws SQLException
                  Retrieves the number, types and properties of this ResultSet object's columns.

                  HSQLDB-Specific Information:

                  Example:

                  The following code fragment creates a ResultSet object rs, creates a ResultSetMetaData object rsmd, and uses rsmd to find out how many columns rs has and whether the first column in rs can be used in a WHERE clause.

                   ResultSet rs   = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
                   ResultSetMetaData rsmd = rs.getMetaData();
                  int numberOfColumns = rsmd.getColumnCount();
                  boolean b = rsmd.isSearchable(1);

                  Changes:

                  With version 2.0, the engine's SQL implementation has been completely rewritten. Changes to this class and the implementation of ResultSetMetaData reflect the engine's new capabilities and provide more accurate information.

                  changes to consider:

                  1. isAutoIncrement(int) always returned false
                  2. isNullable(int) returns the nullability of a real table or view column in the ResultSet and returns columnNoNulls for non-base-column ResultSet columns (columns of the ResultSet that are based on expressions or aggregates).
                  3. getColumnDisplaySize(int) returns correct results even for expression columns.
                  4. getPrecision(int) returns the correct precision even for expression columns.
                  5. getScale(int) returns the correct precision even for expression columns.
                  6. getCatalogName(int) returns the catalog name of the database.


                  Specified by:
                  getMetaData in interface ResultSet
                  Returns:
                  the description of this ResultSet object's columns
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  See Also:
                  JDBCResultSetMetaData

                  getObject

                  public Object getObject(int columnIndex)
                                   throws SQLException

                  Gets the value of the designated column in the current row of this ResultSet object as an Object in the Java programming language.

                  This method will return the value of the given column as a Java object. The type of the Java object will be the default Java object type corresponding to the column's SQL type, following the mapping for built-in types specified in the JDBC specification. If the value is an SQL NULL, the driver returns a Java null.

                  This method may also be used to read database-specific abstract data types. In the JDBC 2.0 API, the behavior of method getObject is extended to materialize data of SQL user-defined types.

                  If Connection.getTypeMap does not throw a SQLFeatureNotSupportedException, then when a column contains a structured or distinct value, the behavior of this method is as if it were a call to: getObject(columnIndex, this.getStatement().getConnection().getTypeMap()). If Connection.getTypeMap does throw a SQLFeatureNotSupportedException, then structured values are not supported, and distinct values are mapped to the default Java class as determined by the underlying SQL type of the DISTINCT type.

                  Specified by:
                  getObject in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  a java.lang.Object holding the column value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  getObject

                  public Object getObject(String columnLabel)
                                   throws SQLException

                  Gets the value of the designated column in the current row of this ResultSet object as an Object in the Java programming language.

                  This method will return the value of the given column as a Java object. The type of the Java object will be the default Java object type corresponding to the column's SQL type, following the mapping for built-in types specified in the JDBC specification. If the value is an SQL NULL, the driver returns a Java null.

                  This method may also be used to read database-specific abstract data types.

                  In the JDBC 2.0 API, the behavior of the method getObject is extended to materialize data of SQL user-defined types. When a column contains a structured or distinct value, the behavior of this method is as if it were a call to: getObject(columnIndex, this.getStatement().getConnection().getTypeMap()).

                  Specified by:
                  getObject in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  a java.lang.Object holding the column value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set

                  findColumn

                  public int findColumn(String columnLabel)
                                 throws SQLException
                  Maps the given ResultSet column label to its ResultSet column index.

                  HSQLDB-Specific Information:

                  Starting with 1.9.x, HSQLDB does an exhaustive search, backed by a cache lookup (to improve performance for subsequent invocations with a given input).

                  This is in response to an observation posted here:

                  http://sourceforge.net/forum/forum.php?thread_id=1388727&forum_id=73674

                  Upon careful investigation of the JDBC specification and the behaviour of existing JDBC drivers, there is actually nothing preventing the findColumn method from doing an exhaustive search, as long as it conforms to the following rules (which describe the new implementation):

                  1. the entire search is case insensitive
                  2. each search iteration occurs from leftmost to rightmost column, returning the first match encountered
                  3. the first pass matches only bare column labels
                  4. the second pass matches only simple column names
                  5. further passes conform to the identifier qualification and identifier quoting rules of the engine
                  In this implementation, the SQL tokenizer is not employed, both because it does not yet correctly handle greater than two part qualification and also because is is not immediately considered important to do a truly exhaustive search, handling the full range of possibly mixed quoted and unquoted identifier components.

                  Instead:

                  • a third pass matches simple table-dot-column qualified names
                  • a fourth pass matches simple schema-dot-table-dot-column qualified column names

                  Specified by:
                  findColumn in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column index of the given column name
                  Throws:
                  SQLException - if the ResultSet object does not contain a column labeled columnLabel, a database access error occurs or this method is called on a closed result set

                  getCharacterStream

                  public Reader getCharacterStream(int columnIndex)
                                            throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader object.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getCharacterStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  a java.io.Reader object that contains the column value; if the value is SQL NULL, the value returned is null in the Java programming language.
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2

                  getCharacterStream

                  public Reader getCharacterStream(String columnLabel)
                                            throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader object.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getCharacterStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  a java.io.Reader object that contains the column value; if the value is SQL NULL, the value returned is null in the Java programming language
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2

                  getBigDecimal

                  public BigDecimal getBigDecimal(int columnIndex)
                                           throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.math.BigDecimal with full precision.

                  Specified by:
                  getBigDecimal in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value (full precision); if the value is SQL NULL, the value returned is null in the Java programming language.
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getBigDecimal

                  public BigDecimal getBigDecimal(String columnLabel)
                                           throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.math.BigDecimal with full precision.

                  Specified by:
                  getBigDecimal in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value (full precision); if the value is SQL NULL, the value returned is null in the Java programming language.
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  isBeforeFirst

                  public boolean isBeforeFirst()
                                        throws SQLException
                  Retrieves whether the cursor is before the first row in this ResultSet object.

                  (JDBC4 Clarification:)

                  Note:Support for the isBeforeFirst method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY

                  Specified by:
                  isBeforeFirst in interface ResultSet
                  Returns:
                  true if the cursor is before the first row; false if the cursor is at any other position or the result set contains no rows
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  isAfterLast

                  public boolean isAfterLast()
                                      throws SQLException
                  Retrieves whether the cursor is after the last row in this ResultSet object.

                  (JDBC4 Clarification:)

                  Note:Support for the isAfterLast method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY

                  Specified by:
                  isAfterLast in interface ResultSet
                  Returns:
                  true if the cursor is after the last row; false if the cursor is at any other position or the result set contains no rows
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  isFirst

                  public boolean isFirst()
                                  throws SQLException
                  Retrieves whether the cursor is on the first row of this ResultSet object.

                  (JDBC4 Clarification:)

                  Note:Support for the isFirst method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY

                  Specified by:
                  isFirst in interface ResultSet
                  Returns:
                  true if the cursor is on the first row; false otherwise
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  isLast

                  public boolean isLast()
                                 throws SQLException
                  Retrieves whether the cursor is on the last row of this ResultSet object. Note: Calling the method isLast may be expensive because the JDBC driver might need to fetch ahead one row in order to determine whether the current row is the last row in the result set.

                  (JDBC4 Clarification:)

                  Note: Support for the isLast method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY

                  Specified by:
                  isLast in interface ResultSet
                  Returns:
                  true if the cursor is on the last row; false otherwise
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  beforeFirst

                  public void beforeFirst()
                                   throws SQLException
                  Moves the cursor to the front of this ResultSet object, just before the first row. This method has no effect if the result set contains no rows.

                  Specified by:
                  beforeFirst in interface ResultSet
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed result set or the result set type is TYPE_FORWARD_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  afterLast

                  public void afterLast()
                                 throws SQLException
                  Moves the cursor to the end of this ResultSet object, just after the last row. This method has no effect if the result set contains no rows.

                  Specified by:
                  afterLast in interface ResultSet
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed result set or the result set type is TYPE_FORWARD_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  first

                  public boolean first()
                                throws SQLException
                  Moves the cursor to the first row in this ResultSet object.

                  Specified by:
                  first in interface ResultSet
                  Returns:
                  true if the cursor is on a valid row; false if there are no rows in the result set
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed result set or the result set type is TYPE_FORWARD_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  last

                  public boolean last()
                               throws SQLException
                  Moves the cursor to the last row in this ResultSet object.

                  Specified by:
                  last in interface ResultSet
                  Returns:
                  true if the cursor is on a valid row; false if there are no rows in the result set
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed result set or the result set type is TYPE_FORWARD_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getRow

                  public int getRow()
                             throws SQLException
                  Retrieves the current row number. The first row is number 1, the second number 2, and so on.

                  (JDBC4 Clarification:)

                  Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY

                  Specified by:
                  getRow in interface ResultSet
                  Returns:
                  the current row number; 0 if there is no current row
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  absolute

                  public boolean absolute(int row)
                                   throws SQLException
                  Moves the cursor to the given row number in this ResultSet object.

                  If the row number is positive, the cursor moves to the given row number with respect to the beginning of the result set. The first row is row 1, the second is row 2, and so on.

                  If the given row number is negative, the cursor moves to an absolute row position with respect to the end of the result set. For example, calling the method absolute(-1) positions the cursor on the last row; calling the method absolute(-2) moves the cursor to the next-to-last row, and so on.

                  An attempt to position the cursor beyond the first/last row in the result set leaves the cursor before the first row or after the last row.

                  Note: Calling absolute(1) is the same as calling first(). Calling absolute(-1) is the same as calling last().

                  Specified by:
                  absolute in interface ResultSet
                  Parameters:
                  row - the number of the row to which the cursor should move. A positive number indicates the row number counting from the beginning of the result set; a negative number indicates the row number counting from the end of the result set
                  Returns:
                  true if the cursor is moved to a position in this ResultSet object; false if the cursor is before the first row or after the last row
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed result set or the result set type is TYPE_FORWARD_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  relative

                  public boolean relative(int rows)
                                   throws SQLException
                  Moves the cursor a relative number of rows, either positive or negative. Attempting to move beyond the first/last row in the result set positions the cursor before/after the the first/last row. Calling relative(0) is valid, but does not change the cursor position.

                  Note: Calling the method relative(1) is identical to calling the method next() and calling the method relative(-1) is identical to calling the method previous().

                  Specified by:
                  relative in interface ResultSet
                  Parameters:
                  rows - an int specifying the number of rows to move from the current row; a positive number moves the cursor forward; a negative number moves the cursor backward
                  Returns:
                  true if the cursor is on a row; false otherwise
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed result set, there is no current row, or the result set type is TYPE_FORWARD_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  previous

                  public boolean previous()
                                   throws SQLException
                  Moves the cursor to the previous row in this ResultSet object.

                  (JDBC4 clarification:) When a call to the previous method returns false, the cursor is positioned before the first row. Any invocation of a ResultSet method which requires a current row will result in a SQLException being thrown.

                  (JDBC4 clarification:) If an input stream is open for the current row, a call to the method previous will implicitly close it. A ResultSet object's warning change is cleared when a new row is read.

                  Specified by:
                  previous in interface ResultSet
                  Returns:
                  (JDBC4 clarification:) true if the cursor is now positioned on a valid row; false if the cursor is positioned before the first row
                  Throws:
                  SQLException - if a database access error occurs; this method is called on a closed result set or the result set type is TYPE_FORWARD_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  setFetchDirection

                  public void setFetchDirection(int direction)
                                         throws SQLException
                  Gives a hint as to the direction in which the rows in this ResultSet object will be processed. The initial value is determined by the Statement object that produced this ResultSet object. The fetch direction may be changed at any time.

                  HSQLDB-Specific Information:

                  HSQLDB does not need this hint. However, as mandated by the JDBC standard, an SQLException is thrown if the result set type is TYPE_FORWARD_ONLY and a fetch direction other than FETCH_FORWARD is requested.

                  Specified by:
                  setFetchDirection in interface ResultSet
                  Parameters:
                  direction - an int specifying the suggested fetch direction; one of ResultSet.FETCH_FORWARD, ResultSet.FETCH_REVERSE, or ResultSet.FETCH_UNKNOWN
                  Throws:
                  SQLException - if a database access error occurs; this method is called on a closed result set or the result set type is TYPE_FORWARD_ONLY and the fetch direction is not FETCH_FORWARD
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)
                  See Also:
                  JDBCStatement.setFetchDirection(int), getFetchDirection()

                  getFetchDirection

                  public int getFetchDirection()
                                        throws SQLException
                  Retrieves the fetch direction for this ResultSet object.

                  HSQLDB-Specific Information:

                  HSQLDB does not depend on fetch direction and always returns FETCH_FORWARD, but the value has no real meaning.

                  Specified by:
                  getFetchDirection in interface ResultSet
                  Returns:
                  the current fetch direction for this ResultSet object
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)
                  See Also:
                  setFetchDirection(int)

                  setFetchSize

                  public void setFetchSize(int rows)
                                    throws SQLException
                  Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for this ResultSet object. If the fetch size specified is zero, the JDBC driver ignores the value and is free to make its own best guess as to what the fetch size should be. The default value is set by the Statement object that created the result set. The fetch size may be changed at any time.

                  HSQLDB-Specific Information:

                  HSQLDB may not build and return a result set as a whole. Therefore the supplied, non-zero, fetch size value is used for some ResultSet objects.

                  Specified by:
                  setFetchSize in interface ResultSet
                  Parameters:
                  rows - the number of rows to fetch
                  Throws:
                  SQLException - if a database access error occurs; this method (JDBC4 Clarification:) is called on a closed result set or the (JDBC4 clarification:) condition rows >= 0 is not satisfied
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)
                  See Also:
                  getFetchSize(), JDBCStatement.setFetchSize(int), JDBCStatement.getFetchSize()

                  getFetchSize

                  public int getFetchSize()
                                   throws SQLException
                  Retrieves the fetch size for this ResultSet object.

                  HSQLDB-Specific Information:

                  HSQLDB may not build and return a result set as a whole. The acutal fetch size for this result set is returned.

                  Specified by:
                  getFetchSize in interface ResultSet
                  Returns:
                  the current fetch size for this ResultSet object
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)
                  See Also:
                  setFetchSize(int), JDBCStatement.getFetchSize(), JDBCStatement.setFetchSize(int)

                  getType

                  public int getType()
                              throws SQLException
                  Retrieves the type of this ResultSet object. The type is determined by the Statement object that created the result set.

                  HSQLDB-Specific Information:

                  HSQLDB accurately reports the actual runtime scrollability of this result set instance.

                  Specified by:
                  getType in interface ResultSet
                  Returns:
                  ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getConcurrency

                  public int getConcurrency()
                                     throws SQLException
                  Retrieves the concurrency mode of this ResultSet object. The concurrency used is determined by the Statement object that created the result set.

                  HSQLDB-Specific Information:

                  HSQLDB supports updatable result sets and accurately reports the actual runtime concurrency of this result set instance.

                  Specified by:
                  getConcurrency in interface ResultSet
                  Returns:
                  the concurrency type, either ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  rowUpdated

                  public boolean rowUpdated()
                                     throws SQLException
                  Retrieves whether the current row has been updated. The value returned depends on whether or not the result set can detect updates.

                  HSQLDB-Specific Information:

                  HSQLDB supports updatable result sets and accurately reports the actual value.

                  Specified by:
                  rowUpdated in interface ResultSet
                  Returns:
                  true if the current row is detected to have been visibly updated by the owner or another; false otherwise
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)
                  See Also:
                  JDBCDatabaseMetaData.updatesAreDetected(int)

                  rowInserted

                  public boolean rowInserted()
                                      throws SQLException
                  Retrieves whether the current row has had an insertion. The value returned depends on whether or not this ResultSet object can detect visible inserts.

                  HSQLDB-Specific Information:

                  HSQLDB supports updatable result sets and accurately reports the actual value.

                  Specified by:
                  rowInserted in interface ResultSet
                  Returns:
                  true if the current row is detected to have been inserted; false otherwise
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)
                  See Also:
                  JDBCDatabaseMetaData.insertsAreDetected(int)

                  rowDeleted

                  public boolean rowDeleted()
                                     throws SQLException
                  Retrieves whether a row has been deleted. A deleted row may leave a visible "hole" in a result set. This method can be used to detect holes in a result set. The value returned depends on whether or not this ResultSet object can detect deletions.

                  (JDBC4 Clarification:)

                  Note: Support for the rowDeleted method is optional with a result set concurrency of CONCUR_READ_ONLY

                  HSQLDB-Specific Information:

                  HSQLDB supports updatable result sets and accurately reports the actual value.

                  Specified by:
                  rowDeleted in interface ResultSet
                  Returns:
                  true if the current row is detected to have been deleted by the owner or another; false otherwise
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)
                  See Also:
                  JDBCDatabaseMetaData.deletesAreDetected(int)

                  updateNull

                  public void updateNull(int columnIndex)
                                  throws SQLException
                  (JDBC4 clarification:) Updates the designated column with a null value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateNull in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateBoolean

                  public void updateBoolean(int columnIndex,
                                            boolean x)
                                     throws SQLException
                  Updates the designated column with a boolean value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateBoolean in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateByte

                  public void updateByte(int columnIndex,
                                         byte x)
                                  throws SQLException
                  Updates the designated column with a byte value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateByte in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateShort

                  public void updateShort(int columnIndex,
                                          short x)
                                   throws SQLException
                  Updates the designated column with a short value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateShort in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateInt

                  public void updateInt(int columnIndex,
                                        int x)
                                 throws SQLException
                  Updates the designated column with an int value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateInt in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateLong

                  public void updateLong(int columnIndex,
                                         long x)
                                  throws SQLException
                  Updates the designated column with a long value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateLong in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateFloat

                  public void updateFloat(int columnIndex,
                                          float x)
                                   throws SQLException
                  Updates the designated column with a float value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateFloat in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateDouble

                  public void updateDouble(int columnIndex,
                                           double x)
                                    throws SQLException
                  Updates the designated column with a double value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateDouble in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateBigDecimal

                  public void updateBigDecimal(int columnIndex,
                                               BigDecimal x)
                                        throws SQLException
                  Updates the designated column with a java.math.BigDecimal value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateBigDecimal in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateString

                  public void updateString(int columnIndex,
                                           String x)
                                    throws SQLException
                  Updates the designated column with a String value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateString in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateBytes

                  public void updateBytes(int columnIndex,
                                          byte[] x)
                                   throws SQLException
                  Updates the designated column with a byte array value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateBytes in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateDate

                  public void updateDate(int columnIndex,
                                         Date x)
                                  throws SQLException
                  Updates the designated column with a java.sql.Date value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateDate in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateTime

                  public void updateTime(int columnIndex,
                                         Time x)
                                  throws SQLException
                  Updates the designated column with a java.sql.Time value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateTime in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateTimestamp

                  public void updateTimestamp(int columnIndex,
                                              Timestamp x)
                                       throws SQLException
                  Updates the designated column with a java.sql.Timestamp value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateTimestamp in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateAsciiStream

                  public void updateAsciiStream(int columnIndex,
                                                InputStream x,
                                                int length)
                                         throws SQLException
                  (JDBC4 clarification:) Updates the designated column with an ascii stream value, which will have the specified number of bytes. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateAsciiStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateBinaryStream

                  public void updateBinaryStream(int columnIndex,
                                                 InputStream x,
                                                 int length)
                                          throws SQLException
                  (JDBC4 clarification:) Updates the designated column with a binary stream value, which will have the specified number of bytes. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateBinaryStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateCharacterStream

                  public void updateCharacterStream(int columnIndex,
                                                    Reader x,
                                                    int length)
                                             throws SQLException
                  (JDBC4 clarification:) Updates the designated column with a character stream value, which will have the specified number of (CHECKME: characters?) bytes. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateCharacterStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateObject

                  public void updateObject(int columnIndex,
                                           Object x,
                                           int scaleOrLength)
                                    throws SQLException
                  Updates the designated column with an Object value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  (JDBC clarification:) If the second argument is an InputStream then the stream must contain the number of bytes specified by scaleOrLength. If the second argument is a Reader then the reader must contain the number of characters specified by scaleOrLength. If these conditions are not true the driver will generate a SQLException when the statement is executed.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateObject in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  scaleOrLength - for an object of java.math.BigDecimal , this is the number of digits after the decimal point. For Java Object types InputStream and Reader, this is the length of the data in the stream or reader. For all other types, this value will be ignored.
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateObject

                  public void updateObject(int columnIndex,
                                           Object x)
                                    throws SQLException
                  Updates the designated column with an Object value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateObject in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateNull

                  public void updateNull(String columnLabel)
                                  throws SQLException
                  Updates the designated column with a null value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateNull in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateBoolean

                  public void updateBoolean(String columnLabel,
                                            boolean x)
                                     throws SQLException
                  Updates the designated column with a boolean value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateBoolean in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateByte

                  public void updateByte(String columnLabel,
                                         byte x)
                                  throws SQLException
                  Updates the designated column with a byte value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateByte in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateShort

                  public void updateShort(String columnLabel,
                                          short x)
                                   throws SQLException
                  Updates the designated column with a short value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateShort in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateInt

                  public void updateInt(String columnLabel,
                                        int x)
                                 throws SQLException
                  Updates the designated column with an int value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateInt in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateLong

                  public void updateLong(String columnLabel,
                                         long x)
                                  throws SQLException
                  Updates the designated column with a long value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateLong in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateFloat

                  public void updateFloat(String columnLabel,
                                          float x)
                                   throws SQLException
                  Updates the designated column with a float value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateFloat in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateDouble

                  public void updateDouble(String columnLabel,
                                           double x)
                                    throws SQLException
                  Updates the designated column with a double value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateDouble in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateBigDecimal

                  public void updateBigDecimal(String columnLabel,
                                               BigDecimal x)
                                        throws SQLException
                  Updates the designated column with a java.sql.BigDecimal value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateBigDecimal in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateString

                  public void updateString(String columnLabel,
                                           String x)
                                    throws SQLException
                  Updates the designated column with a String value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateString in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateBytes

                  public void updateBytes(String columnLabel,
                                          byte[] x)
                                   throws SQLException
                  Updates the designated column with a byte array value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateBytes in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateDate

                  public void updateDate(String columnLabel,
                                         Date x)
                                  throws SQLException
                  Updates the designated column with a java.sql.Date value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateDate in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateTime

                  public void updateTime(String columnLabel,
                                         Time x)
                                  throws SQLException
                  Updates the designated column with a java.sql.Time value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateTime in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateTimestamp

                  public void updateTimestamp(String columnLabel,
                                              Timestamp x)
                                       throws SQLException
                  Updates the designated column with a java.sql.Timestamp value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateTimestamp in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateAsciiStream

                  public void updateAsciiStream(String columnLabel,
                                                InputStream x,
                                                int length)
                                         throws SQLException
                  (JDBC4 clarification:) Updates the designated column with an ascii stream value, which will have the specified number of bytes. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateAsciiStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateBinaryStream

                  public void updateBinaryStream(String columnLabel,
                                                 InputStream x,
                                                 int length)
                                          throws SQLException
                  (JDBC4 clarification:) Updates the designated column with a binary stream value, which will have the specified number of bytes. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateBinaryStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateCharacterStream

                  public void updateCharacterStream(String columnLabel,
                                                    Reader reader,
                                                    int length)
                                             throws SQLException
                  (JDBC4 clarification) Updates the designated column with a character stream value, which will have the specified number of (CHECKME: characters?) bytes. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateCharacterStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  reader - the java.io.Reader object containing the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateObject

                  public void updateObject(String columnLabel,
                                           Object x,
                                           int scaleOrLength)
                                    throws SQLException
                  Updates the designated column with an Object value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  (JDBC4 Clarification:) If the second argument is an InputStream then the stream must contain the number of bytes specified by scaleOrLength. If the second argument is a Reader then the reader must contain the number of characters specified by scaleOrLength. If these conditions are not true the driver will generate a SQLException when the statement is executed.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateObject in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  scaleOrLength - for an object of java.math.BigDecimal , this is the number of digits after the decimal point. For Java Object types InputStream and Reader, this is the length of the data in the stream or reader. For all other types, this value will be ignored.
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateObject

                  public void updateObject(String columnLabel,
                                           Object x)
                                    throws SQLException
                  Updates the designated column with an Object value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  updateObject in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  insertRow

                  public void insertRow()
                                 throws SQLException
                  Inserts the contents of the insert row into this ResultSet object and into the database. The cursor must be on the insert row when this method is called.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  insertRow in interface ResultSet
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY, this method is called on a closed result set, if this method is called when the cursor is not on the insert row, or if not all of non-nullable columns in the insert row have been given a non-null value
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  updateRow

                  public void updateRow()
                                 throws SQLException
                  Updates the underlying database with the new contents of the current row of this ResultSet object. This method cannot be called when the cursor is on the insert row.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  After updating any values in the current row, it is not possible to move the cursor position without calling this method, or alternatively calling cancelRowUpdates() to abandon the row update.

                  Specified by:
                  updateRow in interface ResultSet
                  Throws:
                  SQLException - if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY; this method is called on a closed result set or if this method is called when the cursor is on the insert row
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  deleteRow

                  public void deleteRow()
                                 throws SQLException
                  Deletes the current row from this ResultSet object and from the underlying database. This method cannot be called when the cursor is on the insert row.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  After a successful call to this method, the row is deleted.

                  Specified by:
                  deleteRow in interface ResultSet
                  Throws:
                  SQLException - if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY; this method is called on a closed result set or if this method is called when the cursor is on the insert row
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  refreshRow

                  public void refreshRow()
                                  throws SQLException
                  Refreshes the current row with its most recent value in the database. This method cannot be called when the cursor is on the insert row.

                  The refreshRow method provides a way for an application to explicitly tell the JDBC driver to refetch a row(s) from the database. An application may want to call refreshRow when caching or prefetching is being done by the JDBC driver to fetch the latest value of a row from the database. The JDBC driver may actually refresh multiple rows at once if the fetch size is greater than one.

                  All values are refetched subject to the transaction isolation level and cursor sensitivity. If refreshRow is called after calling an updater method, but before calling the method updateRow, then the updates made to the row are lost. Calling the method refreshRow frequently will likely slow performance.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  refreshRow in interface ResultSet
                  Throws:
                  SQLException - if a database access error occurs; this method is called on a closed result set; the result set type is TYPE_FORWARD_ONLY or if this method is called when the cursor is on the insert row
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method or this method is not supported for the specified result set type and result set concurrency.
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  cancelRowUpdates

                  public void cancelRowUpdates()
                                        throws SQLException
                  Cancels the updates made to the current row in this ResultSet object. This method may be called after calling an updater method(s) and before calling the method updateRow to roll back the updates made to a row. If no updates have been made or updateRow has already been called, this method has no effect.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  cancelRowUpdates in interface ResultSet
                  Throws:
                  SQLException - if a database access error occurs; this method is called on a closed result set; the result set concurrency is CONCUR_READ_ONLY or if this method is called when the cursor is on the insert row
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  moveToInsertRow

                  public void moveToInsertRow()
                                       throws SQLException
                  Moves the cursor to the insert row. The current cursor position is remembered while the cursor is positioned on the insert row. The insert row is a special row associated with an updatable result set. It is essentially a buffer where a new row may be constructed by calling the updater methods prior to inserting the row into the result set. Only the updater, getter, and insertRow methods may be called when the cursor is on the insert row. All of the columns in a result set must be given a value each time this method is called before calling insertRow. An updater method must be called before a getter method can be called on a column value.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  moveToInsertRow in interface ResultSet
                  Throws:
                  SQLException - if a database access error occurs; this method is called on a closed result set or the result set concurrency is CONCUR_READ_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  moveToCurrentRow

                  public void moveToCurrentRow()
                                        throws SQLException
                  Moves the cursor to the remembered cursor position, usually the current row. This method has no effect if the cursor is not on the insert row.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  moveToCurrentRow in interface ResultSet
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed result set or the result set concurrency is CONCUR_READ_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getStatement

                  public Statement getStatement()
                                         throws SQLException
                  Retrieves the Statement object that produced this ResultSet object. If the result set was generated some other way, such as by a DatabaseMetaData method, this method may return null.

                  Specified by:
                  getStatement in interface ResultSet
                  Returns:
                  the Statment object that produced this ResultSet object or null if the result set was produced some other way
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getObject

                  public Object getObject(int columnIndex,
                                          Map map)
                                   throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as an Object in the Java programming language. If the value is an SQL NULL, the driver returns a Java null. This method uses the given Map object for the custom mapping of the SQL structured or distinct type that is being retrieved.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature, but ignores the map.

                  Specified by:
                  getObject in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  map - a java.util.Map object that contains the mapping from SQL type names to classes in the Java programming language
                  Returns:
                  an Object in the Java programming language representing the SQL value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getRef

                  public Ref getRef(int columnIndex)
                             throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a Ref object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB does not support this feature; this method always throws an SQLException stating that the operation is not supported.

                  Specified by:
                  getRef in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  a Ref object representing an SQL REF value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getBlob

                  public Blob getBlob(int columnIndex)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a Blob object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports this feature for objects of type BLOB and BINARY. The Blob returned for BINARY objects is a memory object. The Blob return for BLOB objects is not held entirely in memory. Its contents are fetched from the database when its getXXX() methods are called.

                  Specified by:
                  getBlob in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  a Blob object representing the SQL BLOB value in the specified column
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getClob

                  public Clob getClob(int columnIndex)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a Clob object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports this feature for objects of type CLOB and the variations of CHAR. The Clob returned for CHAR objects is a memory object. The Clob return for CLOB objects is not held entirely in memory. Its contents are fetched from the database when its getXXX() methods are called.

                  Specified by:
                  getClob in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  a Clob object representing the SQL CLOB value in the specified column
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getArray

                  public Array getArray(int columnIndex)
                                 throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as an Array object in the Java programming language.

                  HSQLDB-Specific Information:

                  From version 2.0, HSQLDB supports array types.

                  Specified by:
                  getArray in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  an Array object representing the SQL ARRAY value in the specified column
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getObject

                  public Object getObject(String columnLabel,
                                          Map map)
                                   throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as an Object in the Java programming language. If the value is an SQL NULL, the driver returns a Java null. This method uses the specified Map object for custom mapping if appropriate.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature. But the Map parameter is ignored.

                  Specified by:
                  getObject in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  map - a java.util.Map object that contains the mapping from SQL type names to classes in the Java programming language
                  Returns:
                  an Object representing the SQL value in the specified column
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getRef

                  public Ref getRef(String columnLabel)
                             throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a Ref object in the Java programming language.

                  HSQLDB-Specific Information:

                  Including 2.0, HSQLDB does not support reference types; this method always throws an SQLException stating that the operation is not supported.

                  Specified by:
                  getRef in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  a Ref object representing the SQL REF value in the specified column
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getBlob

                  public Blob getBlob(String columnLabel)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a Blob object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports this feature for objects of type BLOB and BINARY. The Blob returned for BINARY objects is a memory object. The Blob return for BLOB objects is not held entirely in memory. Its contents are fetched from the database when its getXXX() methods are called.

                  Specified by:
                  getBlob in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  a Blob object representing the SQL BLOB value in the specified column
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getClob

                  public Clob getClob(String columnLabel)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a Clob object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports this feature for objects of type CLOB and the variations of CHAR. The Clob returned for CHAR objects is a memory object. The Clob return for CLOB objects is not held entirely in memory. Its contents are fetched from the database when its getXXX() methods are called.

                  Specified by:
                  getClob in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  a Clob object representing the SQL CLOB value in the specified column
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getArray

                  public Array getArray(String columnLabel)
                                 throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as an Array object in the Java programming language.

                  HSQLDB-Specific Information:

                  From version 2.0, HSQLDB supports array types.

                  Specified by:
                  getArray in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  an Array object representing the SQL ARRAY value in the specified column
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getDate

                  public Date getDate(int columnIndex,
                                      Calendar cal)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object in the Java programming language. This method uses the given calendar to construct an appropriate millisecond value for the date if the underlying database does not store timezone information.

                  Specified by:
                  getDate in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  cal - the java.util.Calendar object to use in constructing the date
                  Returns:
                  the column value as a java.sql.Date object; if the value is SQL NULL, the value returned is null in the Java programming language
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getDate

                  public Date getDate(String columnLabel,
                                      Calendar cal)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object in the Java programming language. This method uses the given calendar to construct an appropriate millisecond value for the date if the underlying database does not store timezone information.

                  Specified by:
                  getDate in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  cal - the java.util.Calendar object to use in constructing the date
                  Returns:
                  the column value as a java.sql.Date object; if the value is SQL NULL, the value returned is null in the Java programming language
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getTime

                  public Time getTime(int columnIndex,
                                      Calendar cal)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object in the Java programming language. This method uses the given calendar to construct an appropriate millisecond value for the time if the underlying database does not store timezone information.

                  HSQLDB-Specific Information:

                  The JDBC specification for this method is vague. HSQLDB interprets the specification as follows:

                  1. If the SQL type of the column is WITH TIME ZONE, then the UTC value of the returned java.sql.Time object is the UTC of the SQL value without modification. In other words, the Calendar object is not used.
                  2. If the SQL type of the column is WITHOUT TIME ZONE, then the UTC value of the returned java.sql.Time is correct for the given Calendar object.
                  3. If the cal argument is null, it it ignored and the method returns the same Object as the method without the Calendar parameter.

                  Specified by:
                  getTime in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  cal - the java.util.Calendar object to use in constructing the time
                  Returns:
                  the column value as a java.sql.Time object; if the value is SQL NULL, the value returned is null in the Java programming language
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getTime

                  public Time getTime(String columnLabel,
                                      Calendar cal)
                               throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object in the Java programming language. This method uses the given calendar to construct an appropriate millisecond value for the time if the underlying database does not store timezone information.

                  HSQLDB-Specific Information:

                  The JDBC specification for this method is vague. HSQLDB interprets the specification as follows:

                  1. If the SQL type of the column is WITH TIME ZONE, then the UTC value of the returned java.sql.Time object is the UTC of the SQL value without modification. In other words, the Calendar object is not used.
                  2. If the SQL type of the column is WITHOUT TIME ZONE, then the UTC value of the returned java.sql.Time is correct for the given Calendar object.
                  3. If the cal argument is null, it it ignored and the method returns the same Object as the method without the Calendar parameter.

                  Specified by:
                  getTime in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  cal - the java.util.Calendar object to use in constructing the time
                  Returns:
                  the column value as a java.sql.Time object; if the value is SQL NULL, the value returned is null in the Java programming language
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getTimestamp

                  public Timestamp getTimestamp(int columnIndex,
                                                Calendar cal)
                                         throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp object in the Java programming language. This method uses the given calendar to construct an appropriate millisecond value for the timestamp if the underlying database does not store timezone information.

                  HSQLDB-Specific Information:

                  The JDBC specification for this method is vague. HSQLDB interprets the specification as follows:

                  1. If the SQL type of the column is WITH TIME ZONE, then the UTC value of the returned java.sql.Timestamp object is the UTC of the SQL value without modification. In other words, the Calendar object is not used.
                  2. If the SQL type of the column is WITHOUT TIME ZONE, then the UTC value of the returned java.sql.Timestamp will represent the correct timestamp for the time zone (including daylight saving time) of the given Calendar object.
                  3. In this case, if the cal argument is null, then the default Calendar of the JVM is used, which results in the same Object as one returned by the getTimestamp() methods without the Calendar parameter.

                  Specified by:
                  getTimestamp in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  cal - the java.util.Calendar object to use in constructing the timestamp
                  Returns:
                  the column value as a java.sql.Timestamp object; if the value is SQL NULL, the value returned is null in the Java programming language
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getTimestamp

                  public Timestamp getTimestamp(String columnLabel,
                                                Calendar cal)
                                         throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp object in the Java programming language. This method uses the given calendar to construct an appropriate millisecond value for the timestamp if the underlying database does not store timezone information.

                  HSQLDB-Specific Information:

                  The JDBC specification for this method is vague. HSQLDB interprets the specification as follows:

                  1. If the SQL type of the column is WITH TIME ZONE, then the UTC value of the returned java.sql.Timestamp object is the UTC of the SQL value without modification. In other words, the Calendar object is not used.
                  2. If the SQL type of the column is WITHOUT TIME ZONE, then the UTC value of the returned java.sql.Timestamp is correct for the given Calendar object.
                  3. If the cal argument is null, it it ignored and the method returns the same Object as the method without the Calendar parameter.

                  Specified by:
                  getTimestamp in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  cal - the java.util.Calendar object to use in constructing the date
                  Returns:
                  the column value as a java.sql.Timestamp object; if the value is SQL NULL, the value returned is null in the Java programming language
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  getURL

                  public URL getURL(int columnIndex)
                             throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.net.URL object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB does not support the datalink type; this method always throws an SQLException stating that the operation is not supported.

                  Specified by:
                  getURL in interface ResultSet
                  Parameters:
                  columnIndex - the index of the column 1 is the first, 2 is the second,...
                  Returns:
                  the column value as a java.net.URL object; if the value is SQL NULL, the value returned is null in the Java programming language
                  Throws:
                  SQLException - if a database access error occurs; this method is called on a closed result set or if a URL is malformed
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  getURL

                  public URL getURL(String columnLabel)
                             throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.net.URL object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB does not support the datalink type; this method always throws an SQLException stating that the operation is not supported.

                  Specified by:
                  getURL in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value as a java.net.URL object; if the value is SQL NULL, the value returned is null in the Java programming language
                  Throws:
                  SQLException - if a database access error occur; this method is called on a closed result set or if a URL is malformed
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  updateRef

                  public void updateRef(int columnIndex,
                                        Ref x)
                                 throws SQLException
                  Updates the designated column with a java.sql.Ref value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB does not support reference types; this method always throws an SQLException stating that the operation is not supported.

                  Specified by:
                  updateRef in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  updateRef

                  public void updateRef(String columnLabel,
                                        Ref x)
                                 throws SQLException
                  Updates the designated column with a java.sql.Ref value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB does not support reference types; this method always throws an SQLException stating that the operation is not supported.

                  Specified by:
                  updateRef in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  updateBlob

                  public void updateBlob(int columnIndex,
                                         Blob x)
                                  throws SQLException
                  Updates the designated column with a java.sql.Blob value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports this feature for columns of type BLOB.

                  Specified by:
                  updateBlob in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  updateBlob

                  public void updateBlob(String columnLabel,
                                         Blob x)
                                  throws SQLException
                  Updates the designated column with a java.sql.Blob value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports this feature for columns of type BLOB.

                  Specified by:
                  updateBlob in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  updateClob

                  public void updateClob(int columnIndex,
                                         Clob x)
                                  throws SQLException
                  Updates the designated column with a java.sql.Clob value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports this feature for columns of type CLOB.

                  Specified by:
                  updateClob in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  updateClob

                  public void updateClob(String columnLabel,
                                         Clob x)
                                  throws SQLException
                  Updates the designated column with a java.sql.Clob value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports this feature for columns of type CLOB.

                  Specified by:
                  updateClob in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  updateArray

                  public void updateArray(int columnIndex,
                                          Array x)
                                   throws SQLException
                  Updates the designated column with a java.sql.Array value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB does not support array types; this method always throws an SQLException stating that the operation is not supported.

                  Specified by:
                  updateArray in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  updateArray

                  public void updateArray(String columnLabel,
                                          Array x)
                                   throws SQLException
                  Updates the designated column with a java.sql.Array value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB does not support array types; this method always throws an SQLException stating that the operation is not supported.

                  Specified by:
                  updateArray in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  getRowId

                  public RowId getRowId(int columnIndex)
                                 throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.RowId object in the Java programming language.

                  Specified by:
                  getRowId in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second 2, ...
                  Returns:
                  the column value; if the value is a SQL NULL the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getRowId

                  public RowId getRowId(String columnLabel)
                                 throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.RowId object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB does not support the RowId type; this method always throws an SQLException stating that the operation is not supported.

                  Specified by:
                  getRowId in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value ; if the value is a SQL NULL the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateRowId

                  public void updateRowId(int columnIndex,
                                          RowId x)
                                   throws SQLException
                  Updates the designated column with a RowId value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB does not support the RowId type; this method always throws an SQLException stating that the operation is not supported.

                  Specified by:
                  updateRowId in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second 2, ...
                  x - the column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateRowId

                  public void updateRowId(String columnLabel,
                                          RowId x)
                                   throws SQLException
                  Updates the designated column with a RowId value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  HSQLDB-Specific Information:

                  HSQLDB does not support the RowId type; this method always throws an SQLException stating that the operation is not supported.

                  Specified by:
                  updateRowId in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the column value
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getHoldability

                  public int getHoldability()
                                     throws SQLException
                  Retrieves the holdability of this ResultSet object

                  Specified by:
                  getHoldability in interface ResultSet
                  Returns:
                  either ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  isClosed

                  public boolean isClosed()
                                   throws SQLException
                  Retrieves whether this ResultSet object has been closed. A ResultSet is closed if the method close has been called on it, or if it is automatically closed.

                  Specified by:
                  isClosed in interface ResultSet
                  Returns:
                  true if this ResultSet object is closed; false if it is still open
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateNString

                  public void updateNString(int columnIndex,
                                            String nString)
                                     throws SQLException
                  Updates the designated column with a String value. It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateNString in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second 2, ...
                  nString - the value for the column to be updated
                  Throws:
                  SQLException - if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; this method is called on a closed result set, the result set concurrency is CONCUR_READ_ONLY or if a database access error occurs
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateNString

                  public void updateNString(String columnLabel,
                                            String nString)
                                     throws SQLException
                  Updates the designated column with a String value. It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateNString in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  nString - the value for the column to be updated
                  Throws:
                  SQLException - if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; this method is called on a closed result set; the result set concurrency is CONCUR_READ_ONLY or if a database access error occurs
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateNClob

                  public void updateNClob(int columnIndex,
                                          NClob nClob)
                                   throws SQLException
                  Updates the designated column with a java.sql.NClob value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateNClob in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second 2, ...
                  nClob - the value for the column to be updated
                  Throws:
                  SQLException - if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; this method is called on a closed result set, if a database access error occurs or the result set concurrency is CONCUR_READ_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateNClob

                  public void updateNClob(String columnLabel,
                                          NClob nClob)
                                   throws SQLException
                  Updates the designated column with a java.sql.NClob value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateNClob in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  nClob - the value for the column to be updated
                  Throws:
                  SQLException - if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; this method is called on a closed result set; if a database access error occurs or the result set concurrency is CONCUR_READ_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getNClob

                  public NClob getNClob(int columnIndex)
                                 throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a NClob object in the Java programming language.

                  Specified by:
                  getNClob in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  a NClob object representing the SQL NCLOB value in the specified column
                  Throws:
                  SQLException - if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; this method is called on a closed result set or if a database access error occurs
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getNClob

                  public NClob getNClob(String columnLabel)
                                 throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a NClob object in the Java programming language.

                  Specified by:
                  getNClob in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  a NClob object representing the SQL NCLOB value in the specified column
                  Throws:
                  SQLException - if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; this method is called on a closed result set or if a database access error occurs
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getSQLXML

                  public SQLXML getSQLXML(int columnIndex)
                                   throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet as a java.sql.SQLXML object in the Java programming language.

                  Specified by:
                  getSQLXML in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  a SQLXML object that maps an SQL XML value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getSQLXML

                  public SQLXML getSQLXML(String columnLabel)
                                   throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet as a java.sql.SQLXML object in the Java programming language.

                  Specified by:
                  getSQLXML in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  a SQLXML object that maps an SQL XML value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateSQLXML

                  public void updateSQLXML(int columnIndex,
                                           SQLXML xmlObject)
                                    throws SQLException
                  Updates the designated column with a java.sql.SQLXML value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateSQLXML in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second 2, ...
                  xmlObject - the value for the column to be updated
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed result set, the java.xml.transform.Result, Writer or OutputStream has not been closed for the SQLXML object, if there is an error processing the XML value or the result set concurrency is CONCUR_READ_ONLY. The getCause method of the exception may provide a more detailed exception, for example, if the stream does not contain valid XML.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateSQLXML

                  public void updateSQLXML(String columnLabel,
                                           SQLXML xmlObject)
                                    throws SQLException
                  Updates the designated column with a java.sql.SQLXML value. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateSQLXML in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  xmlObject - the column value
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed result set, the java.xml.transform.Result, Writer or OutputStream has not been closed for the SQLXML object, if there is an error processing the XML value or the result set concurrency is CONCUR_READ_ONLY. The getCause method of the exception may provide a more detailed exception, for example, if the stream does not contain valid XML.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getNString

                  public String getNString(int columnIndex)
                                    throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language. It is intended for use when accessing NCHAR,NVARCHAR and LONGNVARCHAR columns.

                  Specified by:
                  getNString in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getNString

                  public String getNString(String columnLabel)
                                    throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language. It is intended for use when accessing NCHAR,NVARCHAR and LONGNVARCHAR columns.

                  Specified by:
                  getNString in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  the column value; if the value is SQL NULL, the value returned is null
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getNCharacterStream

                  public Reader getNCharacterStream(int columnIndex)
                                             throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader object. It is intended for use when accessing NCHAR,NVARCHAR and LONGNVARCHAR columns.

                  Specified by:
                  getNCharacterStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  Returns:
                  a java.io.Reader object that contains the column value; if the value is SQL NULL, the value returned is null in the Java programming language.
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getNCharacterStream

                  public Reader getNCharacterStream(String columnLabel)
                                             throws SQLException
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader object. It is intended for use when accessing NCHAR,NVARCHAR and LONGNVARCHAR columns.

                  Specified by:
                  getNCharacterStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  Returns:
                  a java.io.Reader object that contains the column value; if the value is SQL NULL, the value returned is null in the Java programming language
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateNCharacterStream

                  public void updateNCharacterStream(int columnIndex,
                                                     Reader x,
                                                     long length)
                                              throws SQLException
                  Updates the designated column with a character stream value, which will have the specified number of bytes. The driver does the necessary conversion from Java character format to the national character set in the database. It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateNCharacterStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateNCharacterStream

                  public void updateNCharacterStream(String columnLabel,
                                                     Reader reader,
                                                     long length)
                                              throws SQLException
                  Updates the designated column with a character stream value, which will have the specified number of bytes. The driver does the necessary conversion from Java character format to the national character set in the database. It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateNCharacterStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  reader - the java.io.Reader object containing the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateAsciiStream

                  public void updateAsciiStream(int columnIndex,
                                                InputStream x,
                                                long length)
                                         throws SQLException
                  Updates the designated column with an ascii stream value, which will have the specified number of bytes. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateAsciiStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateBinaryStream

                  public void updateBinaryStream(int columnIndex,
                                                 InputStream x,
                                                 long length)
                                          throws SQLException
                  Updates the designated column with a binary stream value, which will have the specified number of bytes. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateBinaryStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateCharacterStream

                  public void updateCharacterStream(int columnIndex,
                                                    Reader x,
                                                    long length)
                                             throws SQLException
                  Updates the designated column with a character stream value, which will have the specified number of bytes. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateCharacterStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateAsciiStream

                  public void updateAsciiStream(String columnLabel,
                                                InputStream x,
                                                long length)
                                         throws SQLException
                  Updates the designated column with an ascii stream value, which will have the specified number of bytes.. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateAsciiStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateBinaryStream

                  public void updateBinaryStream(String columnLabel,
                                                 InputStream x,
                                                 long length)
                                          throws SQLException
                  Updates the designated column with a binary stream value, which will have the specified number of bytes. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateBinaryStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateCharacterStream

                  public void updateCharacterStream(String columnLabel,
                                                    Reader reader,
                                                    long length)
                                             throws SQLException
                  Updates the designated column with a character stream value, which will have the specified number of bytes. The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateCharacterStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  reader - the java.io.Reader object containing the new column value
                  length - the length of the stream
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateBlob

                  public void updateBlob(int columnIndex,
                                         InputStream inputStream,
                                         long length)
                                  throws SQLException
                  Updates the designated column using the given input stream, which will have the specified number of bytes. When a very large ASCII value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.InputStream. Data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from ASCII to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateBlob in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  inputStream - An object that contains the data to set the parameter value to.
                  length - the number of bytes in the parameter data.
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateBlob

                  public void updateBlob(String columnLabel,
                                         InputStream inputStream,
                                         long length)
                                  throws SQLException
                  Updates the designated column using the given input stream, which will have the specified number of bytes. When a very large ASCII value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.InputStream. Data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from ASCII to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateBlob in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  inputStream - An object that contains the data to set the parameter value to.
                  length - the number of bytes in the parameter data.
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateClob

                  public void updateClob(int columnIndex,
                                         Reader reader,
                                         long length)
                                  throws SQLException
                  Updates the designated column using the given Reader object, which is the given number of characters long. When a very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.Reader object. The data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateClob in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  reader - An object that contains the data to set the parameter value to.
                  length - the number of characters in the parameter data.
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateClob

                  public void updateClob(String columnLabel,
                                         Reader reader,
                                         long length)
                                  throws SQLException
                  Updates the designated column using the given Reader object, which is the given number of characters long. When a very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.Reader object. The data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateClob in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  reader - An object that contains the data to set the parameter value to.
                  length - the number of characters in the parameter data.
                  Throws:
                  SQLException - if a database access error occurs, the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateNClob

                  public void updateNClob(int columnIndex,
                                          Reader reader,
                                          long length)
                                   throws SQLException
                  Updates the designated column using the given Reader object, which is the given number of characters long. When a very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.Reader object. The data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateNClob in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second 2, ...
                  reader - An object that contains the data to set the parameter value to.
                  length - the number of characters in the parameter data.
                  Throws:
                  SQLException - if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; this method is called on a closed result set, if a database access error occurs or the result set concurrency is CONCUR_READ_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateNClob

                  public void updateNClob(String columnLabel,
                                          Reader reader,
                                          long length)
                                   throws SQLException
                  Updates the designated column using the given Reader object, which is the given number of characters long. When a very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.Reader object. The data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Specified by:
                  updateNClob in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  reader - An object that contains the data to set the parameter value to.
                  length - the number of characters in the parameter data.
                  Throws:
                  SQLException - if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; this method is called on a closed result set; if a database access error occurs or the result set concurrency is CONCUR_READ_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  updateNCharacterStream

                  public void updateNCharacterStream(int columnIndex,
                                                     Reader reader)
                                              throws SQLException
                  Updates the designated column with a character stream value. The data will be read from the stream as needed until end-of-stream is reached. The driver does the necessary conversion from Java character format to the national character set in the database. It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateNCharacterStream which takes a length parameter.

                  Specified by:
                  updateNCharacterStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  reader - the new column value
                  Throws:
                  SQLException - if the columnIndex is not valid; if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateNCharacterStream

                  public void updateNCharacterStream(String columnLabel,
                                                     Reader reader)
                                              throws SQLException
                  Updates the designated column with a character stream value. The data will be read from the stream as needed until end-of-stream is reached. The driver does the necessary conversion from Java character format to the national character set in the database. It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateNCharacterStream which takes a length parameter.

                  Specified by:
                  updateNCharacterStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  reader - the java.io.Reader object containing the new column value
                  Throws:
                  SQLException - if the columnLabel is not valid; if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateAsciiStream

                  public void updateAsciiStream(int columnIndex,
                                                InputStream x)
                                         throws SQLException
                  Updates the designated column with an ascii stream value. The data will be read from the stream as needed until end-of-stream is reached.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateAsciiStream which takes a length parameter.

                  Specified by:
                  updateAsciiStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if the columnIndex is not valid; if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateBinaryStream

                  public void updateBinaryStream(int columnIndex,
                                                 InputStream x)
                                          throws SQLException
                  Updates the designated column with a binary stream value. The data will be read from the stream as needed until end-of-stream is reached.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateBinaryStream which takes a length parameter.

                  Specified by:
                  updateBinaryStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if the columnIndex is not valid; if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateCharacterStream

                  public void updateCharacterStream(int columnIndex,
                                                    Reader x)
                                             throws SQLException
                  Updates the designated column with a character stream value. The data will be read from the stream as needed until end-of-stream is reached.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateCharacterStream which takes a length parameter.

                  Specified by:
                  updateCharacterStream in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  x - the new column value
                  Throws:
                  SQLException - if the columnIndex is not valid; if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateAsciiStream

                  public void updateAsciiStream(String columnLabel,
                                                InputStream x)
                                         throws SQLException
                  Updates the designated column with an ascii stream value. The data will be read from the stream as needed until end-of-stream is reached.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateAsciiStream which takes a length parameter.

                  Specified by:
                  updateAsciiStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if the columnLabel is not valid; if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateBinaryStream

                  public void updateBinaryStream(String columnLabel,
                                                 InputStream x)
                                          throws SQLException
                  Updates the designated column with a binary stream value. The data will be read from the stream as needed until end-of-stream is reached.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateBinaryStream which takes a length parameter.

                  Specified by:
                  updateBinaryStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  x - the new column value
                  Throws:
                  SQLException - if the columnLabel is not valid; if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateCharacterStream

                  public void updateCharacterStream(String columnLabel,
                                                    Reader reader)
                                             throws SQLException
                  Updates the designated column with a character stream value. The data will be read from the stream as needed until end-of-stream is reached.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateCharacterStream which takes a length parameter.

                  Specified by:
                  updateCharacterStream in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  reader - the java.io.Reader object containing the new column value
                  Throws:
                  SQLException - if the columnLabel is not valid; if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateBlob

                  public void updateBlob(int columnIndex,
                                         InputStream inputStream)
                                  throws SQLException
                  Updates the designated column using the given input stream. The data will be read from the stream as needed until end-of-stream is reached.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateBlob which takes a length parameter.

                  Specified by:
                  updateBlob in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  inputStream - An object that contains the data to set the parameter value to.
                  Throws:
                  SQLException - if the columnIndex is not valid; if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateBlob

                  public void updateBlob(String columnLabel,
                                         InputStream inputStream)
                                  throws SQLException
                  Updates the designated column using the given input stream. The data will be read from the stream as needed until end-of-stream is reached.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateBlob which takes a length parameter.

                  Specified by:
                  updateBlob in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  inputStream - An object that contains the data to set the parameter value to.
                  Throws:
                  SQLException - if the columnLabel is not valid; if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateClob

                  public void updateClob(int columnIndex,
                                         Reader reader)
                                  throws SQLException
                  Updates the designated column using the given Reader object. The data will be read from the stream as needed until end-of-stream is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateClob which takes a length parameter.

                  Specified by:
                  updateClob in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  reader - An object that contains the data to set the parameter value to.
                  Throws:
                  SQLException - if the columnIndex is not valid; if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateClob

                  public void updateClob(String columnLabel,
                                         Reader reader)
                                  throws SQLException
                  Updates the designated column using the given Reader object. The data will be read from the stream as needed until end-of-stream is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateClob which takes a length parameter.

                  Specified by:
                  updateClob in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  reader - An object that contains the data to set the parameter value to.
                  Throws:
                  SQLException - if the columnLabel is not valid; if a database access error occurs; the result set concurrency is CONCUR_READ_ONLY or this method is called on a closed result set
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateNClob

                  public void updateNClob(int columnIndex,
                                          Reader reader)
                                   throws SQLException
                  Updates the designated column using the given Reader The data will be read from the stream as needed until end-of-stream is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateNClob which takes a length parameter.

                  Specified by:
                  updateNClob in interface ResultSet
                  Parameters:
                  columnIndex - the first column is 1, the second 2, ...
                  reader - An object that contains the data to set the parameter value to.
                  Throws:
                  SQLException - if the columnIndex is not valid; if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; this method is called on a closed result set, if a database access error occurs or the result set concurrency is CONCUR_READ_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  updateNClob

                  public void updateNClob(String columnLabel,
                                          Reader reader)
                                   throws SQLException
                  Updates the designated column using the given Reader object. The data will be read from the stream as needed until end-of-stream is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  The updater methods are used to update column values in the current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called to update the database.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of updateNClob which takes a length parameter.

                  Specified by:
                  updateNClob in interface ResultSet
                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  reader - An object that contains the data to set the parameter value to.
                  Throws:
                  SQLException - if the columnLabel is not valid; if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; this method is called on a closed result set; if a database access error occurs or the result set concurrency is CONCUR_READ_ONLY
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  unwrap

                  public <T> T unwrap(Class<T> iface)
                           throws SQLException
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy. If the receiver implements the interface then the result is the receiver or a proxy for the receiver. If the receiver is a wrapper and the wrapped object implements the interface then the result is the wrapped object or a proxy for the wrapped object. Otherwise return the the result of calling unwrap recursively on the wrapped object or a proxy for that result. If the receiver is not a wrapper and does not implement the interface, then an SQLException is thrown.

                  Specified by:
                  unwrap in interface Wrapper
                  Parameters:
                  iface - A Class defining an interface that the result must implement.
                  Returns:
                  an object that implements the interface. May be a proxy for the actual implementing object.
                  Throws:
                  SQLException - If no object found that implements the interface
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  isWrapperFor

                  public boolean isWrapperFor(Class<?> iface)
                                       throws SQLException
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does. Returns false otherwise. If this implements the interface then return true, else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped object. If this does not implement the interface and is not a wrapper, return false. This method should be implemented as a low-cost operation compared to unwrap so that callers can use this method to avoid expensive unwrap calls that may fail. If this method returns true then calling unwrap with the same argument should succeed.

                  Specified by:
                  isWrapperFor in interface Wrapper
                  Parameters:
                  iface - a Class defining an interface.
                  Returns:
                  true if this implements the interface or directly or indirectly wraps an object that does.
                  Throws:
                  SQLException - if an error occurs while determining whether this is a wrapper for an object with the given interface.
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getObject

                  public <T> T getObject(int columnIndex,
                                         Class<T> type)
                              throws SQLException

                  Retrieves the value of the designated column in the current row of this ResultSet object and will convert from the SQL type of the column to the requested Java data type, if the conversion is supported. If the conversion is not supported or null is specified for the type, a SQLException is thrown.

                  At a minimum, an implementation must support the conversions defined in Appendix B, Table B-3 and conversion of appropriate user defined SQL types to a Java type which implements SQLData, or Struct. Additional conversions may be supported and are vendor defined.

                  Parameters:
                  columnIndex - the first column is 1, the second is 2, ...
                  type - Class representing the Java data type to convert the designated column to.
                  Returns:
                  an instance of type holding the column value
                  Throws:
                  SQLException - if conversion is not supported, type is null or another error occurs. The getCause() method of the exception may provide a more detailed exception, for example, if a conversion error occurs
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1

                  getObject

                  public <T> T getObject(String columnLabel,
                                         Class<T> type)
                              throws SQLException

                  Retrieves the value of the designated column in the current row of this ResultSet object and will convert from the SQL type of the column to the requested Java data type, if the conversion is supported. If the conversion is not supported or null is specified for the type, a SQLException is thrown.

                  At a minimum, an implementation must support the conversions defined in Appendix B, Table B-3 and conversion of appropriate user defined SQL types to a Java type which implements SQLData, or Struct. Additional conversions may be supported and are vendor defined.

                  Parameters:
                  columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
                  type - Class representing the Java data type to convert the designated column to.
                  Returns:
                  an instance of type holding the column value
                  Throws:
                  SQLException - if conversion is not supported, type is null or another error occurs. The getCause() method of the exception may provide a more detailed exception, for example, if a conversion error occurs
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1

                  newJDBCResultSet

                  public static JDBCResultSet newJDBCResultSet(org.hsqldb.result.Result r,
                                                               org.hsqldb.result.ResultMetaData metaData)
                  Factory method returns a new JDBCResultSet object for use with user defined functions that retrun a ResultSet object. See org.hsqldb.jdbc.JDBCArrayBasic for usage example.

                  Parameters:
                  r - the internal result form that the new JDBCResultSet represents
                  metaData - the connection properties


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCCallableStatement.html0000644000175000017500000147722512007570402026154 0ustar renerene JDBCCallableStatement (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCCallableStatement

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCPreparedStatement
                        extended by org.hsqldb.jdbc.JDBCCallableStatement
                  
                  All Implemented Interfaces:
                  CallableStatement, PreparedStatement, Statement, Wrapper

                  public class JDBCCallableStatement
                  extends JDBCPreparedStatement
                  implements CallableStatement

                  The interface used to execute SQL stored procedures. The JDBC API provides a stored procedure SQL escape syntax that allows stored procedures to be called in a standard way for all RDBMSs. This escape syntax has one form that includes a result parameter and one that does not. If used, the result parameter must be registered as an OUT parameter. The other parameters can be used for input, output or both. Parameters are referred to sequentially, by number, with the first parameter being 1.

                  (JDBC4 clarification:)

                     {?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
                     {call <procedure-name>[(<arg1>,<arg2>, ...)]}
                   

                  IN parameter values are set using the set methods inherited from PreparedStatement. The type of all OUT parameters must be registered prior to executing the stored procedure; their values are retrieved after execution via the get methods provided here.

                  A CallableStatement can return one ResultSet object or multiple ResultSet objects. Multiple ResultSet objects are handled using operations inherited from Statement.

                  For maximum portability, a call's ResultSet objects and update counts should be processed prior to getting the values of output parameters.

                  HSQLDB-Specific Information:

                  As with many DBMS, HSQLDB support for stored procedures is not provided in a completely standard fashion.

                  Beyond the XOpen/ODBC extended scalar functions, stored procedures are typically supported in ways that vary greatly from one DBMS implementation to the next. So, it is almost guaranteed that the code for a stored procedure written under a specific DBMS product will not work without at least some modification in the context of another vendor's product or even across a single vendor's product lines. Moving stored procedures from one DBMS product line to another almost invariably involves complex porting issues and often may not be possible at all. Be warned.

                  One kind of HSQLDB stored procedures and functions is Java routines that map directly onto the static methods of compiled Java classes found on the class path of the engine at runtime. The CREATE PROCEDURE or CREATE FUNCTION statements are used in SQL to support the Java methods.

                  The other kind of HSQLDB stored procedures is SQL routines that are created as part of schemas. Overloaded methods are supported and resolved according to the type of parameters. With procedures, OUT and IN OUT parameters are also supported.

                  In addition, HSQLDB stored procedure call mechanism allows the more general HSQLDB SQL expression evaluation mechanism. This extension provides the ability to evaluate simple SQL expressions, possibly containing Java method invocations.

                  With HSQLDB, executing a CALL statement that produces an opaque (OTHER) or known scalar object reference has virtually the same effect as:

                   CREATE TABLE DUAL (dummy VARCHAR);
                   INSERT INTO DUAL VALUES(NULL);
                   SELECT <simple-expression> FROM DUAL;
                   
                  HSQLDB functions can return a single result set. Procedures that return one or more result sets. Here is a very simple example of an HSQLDB stored procedure generating a user-defined result set:
                   package mypackage;
                  
                   import java.sql.ResultSet;
                   import java.sql.SQLException;
                  
                   class MyLibraryClass {
                  
                        public static ResultSet mySp() throws SQLException {
                            return ctx.getConnection().createStatement().executeQuery("select * from my_table");
                        }
                   }
                  
                   
                  (boucherb@users)

                  Since:
                  1.7.2
                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)
                  See Also:
                  JDBCConnection.prepareCall(java.lang.String), JDBCResultSet

                  Field Summary
                   
                  Fields inherited from interface java.sql.Statement
                  CLOSE_ALL_RESULTS, CLOSE_CURRENT_RESULT, EXECUTE_FAILED, KEEP_CURRENT_RESULT, NO_GENERATED_KEYS, RETURN_GENERATED_KEYS, SUCCESS_NO_INFO
                   
                  Constructor Summary
                  JDBCCallableStatement(JDBCConnection c, String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
                            Constructs a new JDBCCallableStatement with the specified connection and result type.
                   
                  Method Summary
                   void close()
                            Does the specialized work required to free this object's resources and that of it's parent classes.
                   void closeOnCompletion()
                            Specifies that this Statement will be closed when all its dependent result sets are closed.
                   ResultSet executeQuery()
                            Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query.
                   Array getArray(int parameterIndex)
                            Retrieves the value of the designated JDBC ARRAY parameter as an Array object in the Java programming language.
                   Array getArray(String parameterName)
                            Retrieves the value of a JDBC ARRAY parameter as an Array object in the Java programming language.
                   BigDecimal getBigDecimal(int parameterIndex)
                            Retrieves the value of the designated JDBC NUMERIC parameter as a java.math.BigDecimal object with as many digits to the right of the decimal point as the value contains.
                   BigDecimal getBigDecimal(int parameterIndex, int scale)
                            Deprecated. use getBigDecimal(int parameterIndex) or getBigDecimal(String parameterName)
                   BigDecimal getBigDecimal(String parameterName)
                            Retrieves the value of a JDBC NUMERIC parameter as a java.math.BigDecimal object with as many digits to the right of the decimal point as the value contains.
                   Blob getBlob(int parameterIndex)
                            Retrieves the value of the designated JDBC BLOB parameter as a Blob object in the Java programming language.
                   Blob getBlob(String parameterName)
                            Retrieves the value of a JDBC BLOB parameter as a Blob object in the Java programming language.
                   boolean getBoolean(int parameterIndex)
                            (JDBC4 modified:) Retrieves the value of the designated JDBC BIT or BOOLEAN parameter as a boolean in the Java programming language.
                   boolean getBoolean(String parameterName)
                            (JDBC4 modified:)
                   byte getByte(int parameterIndex)
                            Retrieves the value of the designated JDBC TINYINT parameter as a byte in the Java programming language.
                   byte getByte(String parameterName)
                            Retrieves the value of a JDBC TINYINT parameter as a byte in the Java programming language.
                   byte[] getBytes(int parameterIndex)
                            Retrieves the value of the designated JDBC BINARY or VARBINARY parameter as an array of byte values in the Java programming language.
                   byte[] getBytes(String parameterName)
                            Retrieves the value of a JDBC BINARY or VARBINARY parameter as an array of byte values in the Java programming language.
                   Reader getCharacterStream(int parameterIndex)
                            Retrieves the value of the designated parameter as a java.io.Reader object in the Java programming language.
                   Reader getCharacterStream(String parameterName)
                            Retrieves the value of the designated parameter as a java.io.Reader object in the Java programming language.
                   Clob getClob(int parameterIndex)
                            Retrieves the value of the designated JDBC CLOB parameter as a java.sql.Clob object in the Java programming language.
                   Clob getClob(String parameterName)
                            Retrieves the value of a JDBC CLOB parameter as a Clob object in the Java programming language.
                   Date getDate(int parameterIndex)
                            Retrieves the value of the designated JDBC DATE parameter as a java.sql.Date object.
                   Date getDate(int parameterIndex, Calendar cal)
                            Retrieves the value of the designated JDBC DATE parameter as a java.sql.Date object, using the given Calendar object to construct the date.
                   Date getDate(String parameterName)
                            Retrieves the value of a JDBC DATE parameter as a java.sql.Date object.
                   Date getDate(String parameterName, Calendar cal)
                            Retrieves the value of a JDBC DATE parameter as a java.sql.Date object, using the given Calendar object to construct the date.
                   double getDouble(int parameterIndex)
                            Retrieves the value of the designated JDBC DOUBLE parameter as a double in the Java programming language.
                   double getDouble(String parameterName)
                            Retrieves the value of a JDBC DOUBLE parameter as a double in the Java programming language.
                   float getFloat(int parameterIndex)
                            Retrieves the value of the designated JDBC FLOAT parameter as a float in the Java programming language.
                   float getFloat(String parameterName)
                            Retrieves the value of a JDBC FLOAT parameter as a float in the Java programming language.
                   int getInt(int parameterIndex)
                            Retrieves the value of the designated JDBC INTEGER parameter as an int in the Java programming language.
                   int getInt(String parameterName)
                            Retrieves the value of a JDBC INTEGER parameter as an int in the Java programming language.
                   long getLong(int parameterIndex)
                            Retrieves the value of the designated JDBC BIGINT parameter as a long in the Java programming language.
                   long getLong(String parameterName)
                            Retrieves the value of a JDBC BIGINT parameter as a long in the Java programming language.
                   Reader getNCharacterStream(int parameterIndex)
                            Retrieves the value of the designated parameter as a java.io.Reader object in the Java programming language.
                   Reader getNCharacterStream(String parameterName)
                            Retrieves the value of the designated parameter as a java.io.Reader object in the Java programming language.
                   NClob getNClob(int parameterIndex)
                            Retrieves the value of the designated JDBC NCLOB parameter as a java.sql.NClob object in the Java programming language.
                   NClob getNClob(String parameterName)
                            Retrieves the value of a JDBC NCLOB parameter as a java.sql.NClob object in the Java programming language.
                   String getNString(int parameterIndex)
                            Retrieves the value of the designated NCHAR, NVARCHAR or LONGNVARCHAR parameter as a String in the Java programming language.
                   String getNString(String parameterName)
                            Retrieves the value of the designated NCHAR, NVARCHAR or LONGNVARCHAR parameter as a String in the Java programming language.
                   Object getObject(int parameterIndex)
                            Retrieves the value of the designated parameter as an Object in the Java programming language.
                  <T> T
                  getObject(int parameterIndex, Class<T> type)
                            Returns an object representing the value of OUT parameter parameterIndex and will convert from the SQL type of the parameter to the requested Java data type, if the conversion is supported.
                   Object getObject(int parameterIndex, Map<String,Class<?>> map)
                            Returns an object representing the value of OUT parameter parameterIndex and uses map for the custom mapping of the parameter value.
                   Object getObject(String parameterName)
                            Retrieves the value of a parameter as an Object in the Java programming language.
                  <T> T
                  getObject(String parameterName, Class<T> type)
                            Returns an object representing the value of OUT parameter parameterName and will convert from the SQL type of the parameter to the requested Java data type, if the conversion is supported.
                   Object getObject(String parameterName, Map map)
                             
                   Ref getRef(int parameterIndex)
                            Retrieves the value of the designated JDBC REF(<structured-type>) parameter as a Ref object in the Java programming language.
                   Ref getRef(String parameterName)
                            Retrieves the value of a JDBC REF(<structured-type>) parameter as a Ref object in the Java programming language.
                   RowId getRowId(int parameterIndex)
                            Retrieves the value of the designated JDBC ROWID parameter as a java.sql.RowId object.
                   RowId getRowId(String parameterName)
                            Retrieves the value of the designated JDBC ROWID parameter as a java.sql.RowId object.
                   short getShort(int parameterIndex)
                            Retrieves the value of the designated JDBC SMALLINT parameter as a short in the Java programming language.
                   short getShort(String parameterName)
                            Retrieves the value of a JDBC SMALLINT parameter as a short in the Java programming language.
                   SQLXML getSQLXML(int parameterIndex)
                            Retrieves the value of the designated SQL XML parameter as a java.sql.SQLXML object in the Java programming language.
                   SQLXML getSQLXML(String parameterName)
                            Retrieves the value of the designated SQL XML parameter as a java.sql.SQLXML object in the Java programming language.
                   String getString(int parameterIndex)
                            Retrieves the value of the designated JDBC CHAR, VARCHAR, or LONGVARCHAR parameter as a String in the Java programming language.
                   String getString(String parameterName)
                            Retrieves the value of a JDBC CHAR, VARCHAR, or LONGVARCHAR parameter as a String in the Java programming language.
                   Time getTime(int parameterIndex)
                            Retrieves the value of the designated JDBC TIME parameter as a java.sql.Time object.
                   Time getTime(int parameterIndex, Calendar cal)
                            Retrieves the value of the designated JDBC TIME parameter as a java.sql.Time object, using the given Calendar object to construct the time.
                   Time getTime(String parameterName)
                            Retrieves the value of a JDBC TIME parameter as a java.sql.Time object.
                   Time getTime(String parameterName, Calendar cal)
                            Retrieves the value of a JDBC TIME parameter as a java.sql.Time object, using the given Calendar object to construct the time.
                   Timestamp getTimestamp(int parameterIndex)
                            Retrieves the value of the designated JDBC TIMESTAMP parameter as a java.sql.Timestamp object.
                   Timestamp getTimestamp(int parameterIndex, Calendar cal)
                            Retrieves the value of the designated JDBC TIMESTAMP parameter as a java.sql.Timestamp object, using the given Calendar object to construct the Timestamp object.
                   Timestamp getTimestamp(String parameterName)
                            Retrieves the value of a JDBC TIMESTAMP parameter as a java.sql.Timestamp object.
                   Timestamp getTimestamp(String parameterName, Calendar cal)
                            Retrieves the value of a JDBC TIMESTAMP parameter as a java.sql.Timestamp object, using the given Calendar object to construct the Timestamp object.
                   URL getURL(int parameterIndex)
                            Retrieves the value of the designated JDBC DATALINK parameter as a java.net.URL object.
                   URL getURL(String parameterName)
                            Retrieves the value of a JDBC DATALINK parameter as a java.net.URL object.
                   boolean isCloseOnCompletion()
                            Returns a value indicating whether this Statement will be closed when all its dependent result sets are closed.
                   void registerOutParameter(int parameterIndex, int sqlType)
                            Registers the OUT parameter in ordinal position parameterIndex to the JDBC type sqlType.
                   void registerOutParameter(int parameterIndex, int sqlType, int scale)
                            Registers the parameter in ordinal position parameterIndex to be of JDBC type sqlType.
                   void registerOutParameter(int parameterIndex, int sqlType, String typeName)
                            Registers the designated output parameter.
                   void registerOutParameter(String parameterName, int sqlType)
                            Registers the OUT parameter named parameterName to the JDBC type sqlType.
                   void registerOutParameter(String parameterName, int sqlType, int scale)
                            Registers the parameter named parameterName to be of JDBC type sqlType.
                   void registerOutParameter(String parameterName, int sqlType, String typeName)
                            Registers the designated output parameter.
                   void setAsciiStream(String parameterName, InputStream x)
                            Sets the designated parameter to the given input stream.
                   void setAsciiStream(String parameterName, InputStream x, int length)
                            Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                   void setAsciiStream(String parameterName, InputStream x, long length)
                            Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                   void setBigDecimal(String parameterName, BigDecimal x)
                            Sets the designated parameter to the given java.math.BigDecimal value.
                   void setBinaryStream(String parameterName, InputStream x)
                            Sets the designated parameter to the given input stream.
                   void setBinaryStream(String parameterName, InputStream x, int length)
                            Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                   void setBinaryStream(String parameterName, InputStream x, long length)
                            Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                   void setBlob(String parameterName, Blob x)
                            Sets the designated parameter to the given java.sql.Blob object.
                   void setBlob(String parameterName, InputStream inputStream)
                            Sets the designated parameter to a InputStream object.
                   void setBlob(String parameterName, InputStream inputStream, long length)
                            Sets the designated parameter to a InputStream object.
                   void setBoolean(String parameterName, boolean x)
                            Sets the designated parameter to the given Java boolean value.
                   void setByte(String parameterName, byte x)
                            Sets the designated parameter to the given Java byte value.
                   void setBytes(String parameterName, byte[] x)
                            Sets the designated parameter to the given Java array of bytes.
                   void setCharacterStream(String parameterName, Reader reader)
                            Sets the designated parameter to the given Reader object.
                   void setCharacterStream(String parameterName, Reader reader, int length)
                            Sets the designated parameter to the given Reader object, which is the given number of characters long.
                   void setCharacterStream(String parameterName, Reader reader, long length)
                            Sets the designated parameter to the given Reader object, which is the given number of characters long.
                   void setClob(String parameterName, Clob x)
                            Sets the designated parameter to the given java.sql.Clob object.
                   void setClob(String parameterName, Reader reader)
                            Sets the designated parameter to a Reader object.
                   void setClob(String parameterName, Reader reader, long length)
                            Sets the designated parameter to a Reader object.
                   void setDate(String parameterName, Date x)
                            Sets the designated parameter to the given java.sql.Date value (JDBC4 clarification:)
                   void setDate(String parameterName, Date x, Calendar cal)
                            Sets the designated parameter to the given java.sql.Date value, using the given Calendar object.
                   void setDouble(String parameterName, double x)
                            Sets the designated parameter to the given Java double value.
                   void setFloat(String parameterName, float x)
                            Sets the designated parameter to the given Java float value.
                   void setInt(String parameterName, int x)
                            Sets the designated parameter to the given Java int value.
                   void setLong(String parameterName, long x)
                            Sets the designated parameter to the given Java long value.
                   void setNCharacterStream(String parameterName, Reader value)
                            Sets the designated parameter to a Reader object.
                   void setNCharacterStream(String parameterName, Reader value, long length)
                            Sets the designated parameter to a Reader object.
                   void setNClob(String parameterName, NClob value)
                            Sets the designated parameter to a java.sql.NClob object.
                   void setNClob(String parameterName, Reader reader)
                            Sets the designated parameter to a Reader object.
                   void setNClob(String parameterName, Reader reader, long length)
                            Sets the designated parameter to a Reader object.
                   void setNString(String parameterName, String value)
                            Sets the designated parameter to the given String object.
                   void setNull(String parameterName, int sqlType)
                            Sets the designated parameter to SQL NULL.
                   void setNull(String parameterName, int sqlType, String typeName)
                            Sets the designated parameter to SQL NULL.
                   void setObject(String parameterName, Object x)
                            Sets the value of the designated parameter with the given object.
                   void setObject(String parameterName, Object x, int targetSqlType)
                            Sets the value of the designated parameter with the given object.
                   void setObject(String parameterName, Object x, int targetSqlType, int scale)
                            Sets the value of the designated parameter with the given object.
                   void setRowId(String parameterName, RowId x)
                            Sets the designated parameter to the given java.sql.RowId object.
                   void setShort(String parameterName, short x)
                            Sets the designated parameter to the given Java short value.
                   void setSQLXML(String parameterName, SQLXML xmlObject)
                            Sets the designated parameter to the given java.sql.SQLXML object.
                   void setString(String parameterName, String x)
                            Sets the designated parameter to the given Java String value.
                   void setTime(String parameterName, Time x)
                            Sets the designated parameter to the given java.sql.Time value.
                   void setTime(String parameterName, Time x, Calendar cal)
                            Sets the designated parameter to the given java.sql.Time value, using the given Calendar object.
                   void setTimestamp(String parameterName, Timestamp x)
                            Sets the designated parameter to the given java.sql.Timestamp value.
                   void setTimestamp(String parameterName, Timestamp x, Calendar cal)
                            Sets the designated parameter to the given java.sql.Timestamp value, using the given Calendar object.
                   void setURL(String parameterName, URL val)
                            Sets the designated parameter to the given java.net.URL object.
                   boolean wasNull()
                            Retrieves whether the last OUT parameter read had the value of SQL NULL.
                   
                  Methods inherited from class org.hsqldb.jdbc.JDBCPreparedStatement
                  addBatch, addBatch, cancel, clearBatch, clearParameters, clearWarnings, execute, execute, execute, execute, execute, executeBatch, executeQuery, executeUpdate, executeUpdate, executeUpdate, executeUpdate, executeUpdate, getConnection, getFetchDirection, getFetchSize, getGeneratedKeys, getMaxFieldSize, getMaxRows, getMetaData, getMoreResults, getMoreResults, getParameterMetaData, getQueryTimeout, getResultSet, getResultSetConcurrency, getResultSetHoldability, getResultSetType, getUpdateCount, getWarnings, isClosed, isPoolable, isWrapperFor, setArray, setAsciiStream, setAsciiStream, setAsciiStream, setBigDecimal, setBinaryStream, setBinaryStream, setBinaryStream, setBlob, setBlob, setBlob, setBoolean, setByte, setBytes, setCharacterStream, setCharacterStream, setCharacterStream, setClob, setClob, setClob, setCursorName, setDate, setDate, setDouble, setEscapeProcessing, setFetchDirection, setFetchSize, setFloat, setInt, setLong, setMaxFieldSize, setMaxRows, setNCharacterStream, setNCharacterStream, setNClob, setNClob, setNClob, setNString, setNull, setNull, setObject, setObject, setObject, setPoolable, setQueryTimeout, setRef, setRowId, setShort, setSQLXML, setString, setTime, setTime, setTimestamp, setTimestamp, setUnicodeStream, setURL, toString, unwrap
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
                   
                  Methods inherited from interface java.sql.PreparedStatement
                  addBatch, clearParameters, execute, executeUpdate, getMetaData, getParameterMetaData, setArray, setAsciiStream, setAsciiStream, setAsciiStream, setBigDecimal, setBinaryStream, setBinaryStream, setBinaryStream, setBlob, setBlob, setBlob, setBoolean, setByte, setBytes, setCharacterStream, setCharacterStream, setCharacterStream, setClob, setClob, setClob, setDate, setDate, setDouble, setFloat, setInt, setLong, setNCharacterStream, setNCharacterStream, setNClob, setNClob, setNClob, setNString, setNull, setNull, setObject, setObject, setObject, setRef, setRowId, setShort, setSQLXML, setString, setTime, setTime, setTimestamp, setTimestamp, setUnicodeStream, setURL
                   
                  Methods inherited from interface java.sql.Statement
                  addBatch, cancel, clearBatch, clearWarnings, execute, execute, execute, execute, executeBatch, executeQuery, executeUpdate, executeUpdate, executeUpdate, executeUpdate, getConnection, getFetchDirection, getFetchSize, getGeneratedKeys, getMaxFieldSize, getMaxRows, getMoreResults, getMoreResults, getQueryTimeout, getResultSet, getResultSetConcurrency, getResultSetHoldability, getResultSetType, getUpdateCount, getWarnings, isClosed, isPoolable, setCursorName, setEscapeProcessing, setFetchDirection, setFetchSize, setMaxFieldSize, setMaxRows, setPoolable, setQueryTimeout
                   
                  Methods inherited from interface java.sql.Wrapper
                  isWrapperFor, unwrap
                   

                  Constructor Detail

                  JDBCCallableStatement

                  public JDBCCallableStatement(JDBCConnection c,
                                               String sql,
                                               int resultSetType,
                                               int resultSetConcurrency,
                                               int resultSetHoldability)
                                        throws org.hsqldb.HsqlException,
                                               SQLException
                  Constructs a new JDBCCallableStatement with the specified connection and result type.

                  Parameters:
                  c - the connection on which this statement will execute
                  sql - the SQL statement this object represents
                  resultSetType - the type of result this statement will produce
                  Throws:
                  org.hsqldb.HsqlException - if the statement is not accepted by the database
                  SQLException - if preprocessing by driver fails
                  Method Detail

                  registerOutParameter

                  public void registerOutParameter(int parameterIndex,
                                                   int sqlType)
                                            throws SQLException
                  Registers the OUT parameter in ordinal position parameterIndex to the JDBC type sqlType. All OUT parameters must be registered before a stored procedure is executed.

                  The JDBC type specified by sqlType for an OUT parameter determines the Java type that must be used in the get method to read the value of that parameter.

                  If the JDBC type expected to be returned to this output parameter is specific to this particular database, sqlType should be java.sql.Types.OTHER. The method getObject(int) retrieves the value.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature. This method can be called after a PrepareCall method. HSQLDB has already determined which parameters are OUT or INOUT parameters, therefore this method only checks and throws an exception if the parameter is not of the correct form. The data type argument is ignored

                  The get method to read the value of the parameter is determined by the engine based on the data type of the parameter. Furthermore, HSQLDB supports multiple OUT and INOUT parameters for stored procedures.

                  Specified by:
                  registerOutParameter in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  sqlType - the JDBC type code defined by java.sql.Types. If the parameter is of JDBC type NUMERIC or DECIMAL, the version of registerOutParameter that accepts a scale value should be used.
                  Throws:
                  SQLException - JDBC 4.1 [if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if sqlType is a ARRAY, BLOB, CLOB, DATALINK, JAVA_OBJECT, NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, REF, ROWID, SQLXML or STRUCT data type and the JDBC driver does not support this data type
                  See Also:
                  Types

                  registerOutParameter

                  public void registerOutParameter(int parameterIndex,
                                                   int sqlType,
                                                   int scale)
                                            throws SQLException
                  Registers the parameter in ordinal position parameterIndex to be of JDBC type sqlType. (JDBC4 clarification:) All OUT parameters must be registered before a stored procedure is executed.

                  The JDBC type specified by sqlType for an OUT parameter determines the Java type that must be used in the get method to read the value of that parameter.

                  This version of registerOutParameter should be used when the parameter is of JDBC type NUMERIC or DECIMAL.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  registerOutParameter in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  sqlType - the SQL type code defined by java.sql.Types.
                  scale - the desired number of digits to the right of the decimal point. It must be greater than or equal to zero.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if sqlType is a ARRAY, BLOB, CLOB, DATALINK, JAVA_OBJECT, NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, REF, ROWID, SQLXML or STRUCT data type and the JDBC driver does not support this data type
                  See Also:
                  Types

                  wasNull

                  public boolean wasNull()
                                  throws SQLException
                  Retrieves whether the last OUT parameter read had the value of SQL NULL. Note that this method should be called only after calling a getter method; otherwise, there is no value to use in determining whether it is null or not.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  wasNull in interface CallableStatement
                  Returns:
                  true if the last parameter read was SQL NULL; false otherwise
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed CallableStatement

                  getString

                  public String getString(int parameterIndex)
                                   throws SQLException
                  Retrieves the value of the designated JDBC CHAR, VARCHAR, or LONGVARCHAR parameter as a String in the Java programming language.

                  For the fixed-length type JDBC CHAR, the String object returned has exactly the same value the (JDBC4 clarification:) SQL CHAR value had in the database, including any padding added by the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getString in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  setString(java.lang.String, java.lang.String)

                  getBoolean

                  public boolean getBoolean(int parameterIndex)
                                     throws SQLException
                  (JDBC4 modified:) Retrieves the value of the designated JDBC BIT or BOOLEAN parameter as a boolean in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getBoolean in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is false.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  setBoolean(java.lang.String, boolean)

                  getByte

                  public byte getByte(int parameterIndex)
                               throws SQLException
                  Retrieves the value of the designated JDBC TINYINT parameter as a byte in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getByte in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is 0.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  setByte(java.lang.String, byte)

                  getShort

                  public short getShort(int parameterIndex)
                                 throws SQLException
                  Retrieves the value of the designated JDBC SMALLINT parameter as a short in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getShort in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is 0.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  setShort(java.lang.String, short)

                  getInt

                  public int getInt(int parameterIndex)
                             throws SQLException
                  Retrieves the value of the designated JDBC INTEGER parameter as an int in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getInt in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is 0.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  setInt(java.lang.String, int)

                  getLong

                  public long getLong(int parameterIndex)
                               throws SQLException
                  Retrieves the value of the designated JDBC BIGINT parameter as a long in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getLong in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is 0.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  setLong(java.lang.String, long)

                  getFloat

                  public float getFloat(int parameterIndex)
                                 throws SQLException
                  Retrieves the value of the designated JDBC FLOAT parameter as a float in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getFloat in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is 0.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  setFloat(java.lang.String, float)

                  getDouble

                  public double getDouble(int parameterIndex)
                                   throws SQLException
                  Retrieves the value of the designated JDBC DOUBLE parameter as a double in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getDouble in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is 0.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  setDouble(java.lang.String, double)

                  getBigDecimal

                  public BigDecimal getBigDecimal(int parameterIndex,
                                                  int scale)
                                           throws SQLException
                  Deprecated. use getBigDecimal(int parameterIndex) or getBigDecimal(String parameterName)

                  Retrieves the value of the designated JDBC NUMERIC parameter as a java.math.BigDecimal object with scale digits to the right of the decimal point.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getBigDecimal in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  scale - the number of digits to the right of the decimal point
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  See Also:
                  setBigDecimal(java.lang.String, java.math.BigDecimal)

                  getBytes

                  public byte[] getBytes(int parameterIndex)
                                  throws SQLException
                  Retrieves the value of the designated JDBC BINARY or VARBINARY parameter as an array of byte values in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getBytes in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  setBytes(java.lang.String, byte[])

                  getDate

                  public Date getDate(int parameterIndex)
                               throws SQLException
                  Retrieves the value of the designated JDBC DATE parameter as a java.sql.Date object.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getDate in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  setDate(java.lang.String, java.sql.Date)

                  getTime

                  public Time getTime(int parameterIndex)
                               throws SQLException
                  Retrieves the value of the designated JDBC TIME parameter as a java.sql.Time object.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getTime in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  setTime(java.lang.String, java.sql.Time)

                  getTimestamp

                  public Timestamp getTimestamp(int parameterIndex)
                                         throws SQLException
                  Retrieves the value of the designated JDBC TIMESTAMP parameter as a java.sql.Timestamp object.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getTimestamp in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  setTimestamp(java.lang.String, java.sql.Timestamp)

                  getObject

                  public Object getObject(int parameterIndex)
                                   throws SQLException
                  Retrieves the value of the designated parameter as an Object in the Java programming language. If the value is an SQL NULL, the driver returns a Java null.

                  This method returns a Java object whose type corresponds to the JDBC type that was registered for this parameter using the method registerOutParameter. By registering the target JDBC type as java.sql.Types.OTHER, this method can be used to read database-specific abstract data types.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getObject in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  A java.lang.Object holding the OUT parameter value
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  See Also:
                  Types, setObject(java.lang.String, java.lang.Object, int, int)

                  getBigDecimal

                  public BigDecimal getBigDecimal(int parameterIndex)
                                           throws SQLException
                  Retrieves the value of the designated JDBC NUMERIC parameter as a java.math.BigDecimal object with as many digits to the right of the decimal point as the value contains.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getBigDecimal in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value in full precision. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)
                  See Also:
                  setBigDecimal(java.lang.String, java.math.BigDecimal)

                  getObject

                  public Object getObject(int parameterIndex,
                                          Map<String,Class<?>> map)
                                   throws SQLException
                  Returns an object representing the value of OUT parameter parameterIndex and uses map for the custom mapping of the parameter value.

                  This method returns a Java object whose type corresponds to the JDBC type that was registered for this parameter using the method registerOutParameter. By registering the target JDBC type as java.sql.Types.OTHER, this method can be used to read database-specific abstract data types.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getObject in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  map - the mapping from SQL type names to Java classes
                  Returns:
                  a java.lang.Object holding the OUT parameter value
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)
                  See Also:
                  setObject(java.lang.String, java.lang.Object, int, int)

                  getRef

                  public Ref getRef(int parameterIndex)
                             throws SQLException
                  Retrieves the value of the designated JDBC REF(<structured-type>) parameter as a Ref object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getRef in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value as a Ref object in the Java programming language. If the value was SQL NULL, the value null is returned.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  getBlob

                  public Blob getBlob(int parameterIndex)
                               throws SQLException
                  Retrieves the value of the designated JDBC BLOB parameter as a Blob object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getBlob in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value as a Blob object in the Java programming language. If the value was SQL NULL, the value null is returned.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  getClob

                  public Clob getClob(int parameterIndex)
                               throws SQLException
                  Retrieves the value of the designated JDBC CLOB parameter as a java.sql.Clob object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getClob in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value as a Clob object in the Java programming language. If the value was SQL NULL, the value null is returned.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  getArray

                  public Array getArray(int parameterIndex)
                                 throws SQLException
                  Retrieves the value of the designated JDBC ARRAY parameter as an Array object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getArray in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value as an Array object in the Java programming language. If the value was SQL NULL, the value null is returned.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  getDate

                  public Date getDate(int parameterIndex,
                                      Calendar cal)
                               throws SQLException
                  Retrieves the value of the designated JDBC DATE parameter as a java.sql.Date object, using the given Calendar object to construct the date. With a Calendar object, the driver can calculate the date taking into account a custom timezone and locale. If no Calendar object is specified, the driver uses the default timezone and locale.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getDate in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  cal - the Calendar object the driver will use to construct the date
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)
                  See Also:
                  setDate(java.lang.String, java.sql.Date)

                  getTime

                  public Time getTime(int parameterIndex,
                                      Calendar cal)
                               throws SQLException
                  Retrieves the value of the designated JDBC TIME parameter as a java.sql.Time object, using the given Calendar object to construct the time. With a Calendar object, the driver can calculate the time taking into account a custom timezone and locale. If no Calendar object is specified, the driver uses the default timezone and locale.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getTime in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  cal - the Calendar object the driver will use to construct the time
                  Returns:
                  the parameter value; if the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)
                  See Also:
                  setTime(java.lang.String, java.sql.Time)

                  getTimestamp

                  public Timestamp getTimestamp(int parameterIndex,
                                                Calendar cal)
                                         throws SQLException
                  Retrieves the value of the designated JDBC TIMESTAMP parameter as a java.sql.Timestamp object, using the given Calendar object to construct the Timestamp object. With a Calendar object, the driver can calculate the timestamp taking into account a custom timezone and locale. If no Calendar object is specified, the driver uses the default timezone and locale.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getTimestamp in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  cal - the Calendar object the driver will use to construct the timestamp
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)
                  See Also:
                  setTimestamp(java.lang.String, java.sql.Timestamp)

                  registerOutParameter

                  public void registerOutParameter(int parameterIndex,
                                                   int sqlType,
                                                   String typeName)
                                            throws SQLException
                  Registers the designated output parameter. This version of the method registerOutParameter should be used for a user-defined or REF output parameter. Examples of user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and named array types.

                  All OUT parameters must be registered before a stored procedure is executed.

                  For a user-defined parameter, the fully-qualified SQL type name of the parameter should also be given, while a REF parameter requires that the fully-qualified type name of the referenced type be given. A JDBC driver that does not need the type code and type name information may ignore it. To be portable, however, applications should always provide these values for user-defined and REF parameters. Although it is intended for user-defined and REF parameters, this method may be used to register a parameter of any JDBC type. If the parameter does not have a user-defined or REF type, the typeName parameter is ignored.

                  Note: When reading the value of an out parameter, you must use the getter method whose Java type corresponds to the parameter's registered SQL type.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  registerOutParameter in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2,...
                  sqlType - a value from Types
                  typeName - the fully-qualified name of an SQL structured type
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if sqlType is a ARRAY, BLOB, CLOB, DATALINK, JAVA_OBJECT, NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, REF, ROWID, SQLXML or STRUCT data type and the JDBC driver does not support this data type
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)
                  See Also:
                  Types

                  registerOutParameter

                  public void registerOutParameter(String parameterName,
                                                   int sqlType)
                                            throws SQLException
                  Registers the OUT parameter named parameterName to the JDBC type sqlType. All OUT parameters must be registered before a stored procedure is executed.

                  The JDBC type specified by sqlType for an OUT parameter determines the Java type that must be used in the get method to read the value of that parameter.

                  If the JDBC type expected to be returned to this output parameter is specific to this particular database, sqlType should be java.sql.Types.OTHER. The method getObject(int) retrieves the value.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  registerOutParameter in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  sqlType - the JDBC type code defined by java.sql.Types. If the parameter is of JDBC type NUMERIC or DECIMAL, the version of registerOutParameter that accepts a scale value should be used.
                  Throws:
                  SQLException - JDBC 41.[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if sqlType is a ARRAY, BLOB, CLOB, DATALINK, JAVA_OBJECT, NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, REF, ROWID, SQLXML or STRUCT data type and the JDBC driver does not support this data type or if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQL 1.7.0
                  See Also:
                  Types

                  registerOutParameter

                  public void registerOutParameter(String parameterName,
                                                   int sqlType,
                                                   int scale)
                                            throws SQLException
                  Registers the parameter named parameterName to be of JDBC type sqlType. (JDBC4 clarification:) All OUT parameters must be registered before a stored procedure is executed.

                  The JDBC type specified by sqlType for an OUT parameter determines the Java type that must be used in the get method to read the value of that parameter.

                  This version of registerOutParameter should be used when the parameter is of JDBC type NUMERIC or DECIMAL.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  registerOutParameter in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  sqlType - SQL type code defined by java.sql.Types.
                  scale - the desired number of digits to the right of the decimal point. It must be greater than or equal to zero.
                  Throws:
                  SQLException - JDBC 41.[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if sqlType is a ARRAY, BLOB, CLOB, DATALINK, JAVA_OBJECT, NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, REF, ROWID, SQLXML or STRUCT data type and the JDBC driver does not support this data type or if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  Types

                  registerOutParameter

                  public void registerOutParameter(String parameterName,
                                                   int sqlType,
                                                   String typeName)
                                            throws SQLException
                  Registers the designated output parameter. This version of the method registerOutParameter should be used for a user-named or REF output parameter. Examples of user-named types include: STRUCT, DISTINCT, JAVA_OBJECT, and named array types.

                  (JDBC4 clarification:)

                  All OUT parameters must be registered before a stored procedure is executed.

                  For a user-named parameter the fully-qualified SQL type name of the parameter should also be given, while a REF parameter requires that the fully-qualified type name of the referenced type be given. A JDBC driver that does not need the type code and type name information may ignore it. To be portable, however, applications should always provide these values for user-named and REF parameters. Although it is intended for user-named and REF parameters, this method may be used to register a parameter of any JDBC type. If the parameter does not have a user-named or REF type, the typeName parameter is ignored.

                  Note: When reading the value of an out parameter, you must use the getXXX method whose Java type XXX corresponds to the parameter's registered SQL type.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  registerOutParameter in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  sqlType - a value from Types
                  typeName - the fully-qualified name of an SQL structured type
                  Throws:
                  SQLException - JDBC 41.[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if sqlType is a ARRAY, BLOB, CLOB, DATALINK, JAVA_OBJECT, NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, REF, ROWID, SQLXML or STRUCT data type and the JDBC driver does not support this data type or if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQL 1.7.0
                  See Also:
                  Types

                  getURL

                  public URL getURL(int parameterIndex)
                             throws SQLException
                  Retrieves the value of the designated JDBC DATALINK parameter as a java.net.URL object.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getURL in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2,...
                  Returns:
                  a java.net.URL object that represents the JDBC DATALINK value used as the designated parameter
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs, this method is called on a closed CallableStatement, or if the URL being returned is not a valid URL on the Java platform
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setURL(java.lang.String, java.net.URL)

                  setURL

                  public void setURL(String parameterName,
                                     URL val)
                              throws SQLException
                  Sets the designated parameter to the given java.net.URL object. The driver converts this to an SQL DATALINK value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  setURL in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  val - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs, this method is called on a closed CallableStatement, or if a URL is malformed
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getURL(int)

                  setNull

                  public void setNull(String parameterName,
                                      int sqlType)
                               throws SQLException
                  Sets the designated parameter to SQL NULL.

                  Note: You must specify the parameter's SQL type.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setNull in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  sqlType - the SQL type code defined in java.sql.Types
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  setBoolean

                  public void setBoolean(String parameterName,
                                         boolean x)
                                  throws SQLException
                  Sets the designated parameter to the given Java boolean value.

                  (JDBC4 clarification:)

                  The driver converts this to an SQL BIT or BOOLEAN value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setBoolean in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getBoolean(int), getBoolean(int)

                  setByte

                  public void setByte(String parameterName,
                                      byte x)
                               throws SQLException
                  Sets the designated parameter to the given Java byte value. The driver converts this to an SQL TINYINT value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setByte in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getByte(int)

                  setShort

                  public void setShort(String parameterName,
                                       short x)
                                throws SQLException
                  Sets the designated parameter to the given Java short value. The driver converts this to an SQL SMALLINT value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setShort in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getShort(int)

                  setInt

                  public void setInt(String parameterName,
                                     int x)
                              throws SQLException
                  Sets the designated parameter to the given Java int value. The driver converts this to an SQL INTEGER value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setInt in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getInt(int)

                  setLong

                  public void setLong(String parameterName,
                                      long x)
                               throws SQLException
                  Sets the designated parameter to the given Java long value. The driver converts this to an SQL BIGINT value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setLong in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getLong(int)

                  setFloat

                  public void setFloat(String parameterName,
                                       float x)
                                throws SQLException
                  Sets the designated parameter to the given Java float value. The driver converts this to an SQL FLOAT value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setFloat in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getFloat(int)

                  setDouble

                  public void setDouble(String parameterName,
                                        double x)
                                 throws SQLException
                  Sets the designated parameter to the given Java double value. The driver converts this to an SQL DOUBLE value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setDouble in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getDouble(int)

                  setBigDecimal

                  public void setBigDecimal(String parameterName,
                                            BigDecimal x)
                                     throws SQLException
                  Sets the designated parameter to the given java.math.BigDecimal value. The driver converts this to an SQL NUMERIC value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setBigDecimal in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getBigDecimal(int, int)

                  setString

                  public void setString(String parameterName,
                                        String x)
                                 throws SQLException
                  Sets the designated parameter to the given Java String value. The driver converts this to an SQL VARCHAR or LONGVARCHAR value (depending on the argument's size relative to the driver's limits on VARCHAR values) when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setString in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getString(int)

                  setBytes

                  public void setBytes(String parameterName,
                                       byte[] x)
                                throws SQLException
                  Sets the designated parameter to the given Java array of bytes. The driver converts this to an SQL VARBINARY or LONGVARBINARY (depending on the argument's size relative to the driver's limits on VARBINARY values) when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setBytes in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getBytes(int)

                  setDate

                  public void setDate(String parameterName,
                                      Date x)
                               throws SQLException
                  Sets the designated parameter to the given java.sql.Date value (JDBC4 clarification:)

                  using the default time zone of the virtual machine that is running the application. The driver converts this to an SQL DATE value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setDate in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getDate(int)

                  setTime

                  public void setTime(String parameterName,
                                      Time x)
                               throws SQLException
                  Sets the designated parameter to the given java.sql.Time value. The driver converts this to an SQL TIME value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setTime in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getTime(int)

                  setTimestamp

                  public void setTimestamp(String parameterName,
                                           Timestamp x)
                                    throws SQLException
                  Sets the designated parameter to the given java.sql.Timestamp value. The driver converts this to an SQL TIMESTAMP value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setTimestamp in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getTimestamp(int)

                  setAsciiStream

                  public void setAsciiStream(String parameterName,
                                             InputStream x,
                                             int length)
                                      throws SQLException
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes. When a very large ASCII value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.InputStream. Data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from ASCII to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setAsciiStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the Java input stream that contains the ASCII parameter value
                  length - the number of bytes in the stream
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  setBinaryStream

                  public void setBinaryStream(String parameterName,
                                              InputStream x,
                                              int length)
                                       throws SQLException
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes. When a very large binary value is input to a LONGVARBINARY parameter, it may be more practical to send it via a java.io.InputStream object. The data will be read from the stream as needed until end-of-file is reached.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setBinaryStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the java input stream which contains the binary parameter value
                  length - the number of bytes in the stream
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  setObject

                  public void setObject(String parameterName,
                                        Object x,
                                        int targetSqlType,
                                        int scale)
                                 throws SQLException
                  Sets the value of the designated parameter with the given object. The second argument must be an object type; for integral values, the java.lang equivalent objects should be used.

                  The given Java object will be converted to the given targetSqlType before being sent to the database. If the object has a custom mapping (is of a class implementing the interface SQLData), the JDBC driver should call the method SQLData.writeSQL to write it to the SQL data stream. If, on the other hand, the object is of a class implementing Ref, Blob, Clob, NClob, Struct, java.net.URL, or Array, the driver should pass it to the database as a value of the corresponding SQL type.

                  Note that this method may be used to pass datatabase- specific abstract data types.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setObject in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the object containing the input parameter value
                  targetSqlType - the SQL type (as defined in java.sql.Types) to be sent to the database. The scale argument may further qualify this type.
                  scale - for java.sql.Types.DECIMAL or java.sql.Types.NUMERIC types, this is the number of digits after the decimal point. For all other types, this value will be ignored.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if targetSqlType is a ARRAY, BLOB, CLOB, DATALINK, JAVA_OBJECT, NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, REF, ROWID, SQLXML or STRUCT data type and the JDBC driver does not support this data type
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  Types, getObject(int)

                  setObject

                  public void setObject(String parameterName,
                                        Object x,
                                        int targetSqlType)
                                 throws SQLException
                  Sets the value of the designated parameter with the given object. This method is like the method setObject above, except that it assumes a scale of zero.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setObject in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the object containing the input parameter value
                  targetSqlType - the SQL type (as defined in java.sql.Types) to be sent to the database
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if targetSqlType is a ARRAY, BLOB, CLOB, DATALINK, JAVA_OBJECT, NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, REF, ROWID, SQLXML or STRUCT data type and the JDBC driver does not support this data type
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getObject(int)

                  setObject

                  public void setObject(String parameterName,
                                        Object x)
                                 throws SQLException
                  Sets the value of the designated parameter with the given object. The second parameter must be of type Object; therefore, the java.lang equivalent objects should be used for built-in types.

                  The JDBC specification specifies a standard mapping from Java Object types to SQL types. The given argument will be converted to the corresponding SQL type before being sent to the database.

                  Note that this method may be used to pass datatabase- specific abstract data types, by using a driver-specific Java type. If the object is of a class implementing the interface SQLData, the JDBC driver should call the method SQLData.writeSQL to write it to the SQL data stream. If, on the other hand, the object is of a class implementing Ref, Blob, Clob, NClob, Struct, java.net.URL, or Array, the driver should pass it to the database as a value of the corresponding SQL type.

                  This method throws an exception if there is an ambiguity, for example, if the object is of a class implementing more than one of the interfaces named above.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setObject in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the object containing the input parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs, this method is called on a closed CallableStatement or if the given Object parameter is ambiguous
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getObject(int)

                  setCharacterStream

                  public void setCharacterStream(String parameterName,
                                                 Reader reader,
                                                 int length)
                                          throws SQLException
                  Sets the designated parameter to the given Reader object, which is the given number of characters long. When a very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.Reader object. The data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setCharacterStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  reader - the java.io.Reader object that contains the UNICODE data used as the designated parameter
                  length - the number of characters in the stream
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  setDate

                  public void setDate(String parameterName,
                                      Date x,
                                      Calendar cal)
                               throws SQLException
                  Sets the designated parameter to the given java.sql.Date value, using the given Calendar object. The driver uses the Calendar object to construct an SQL DATE value, which the driver then sends to the database. With a a Calendar object, the driver can calculate the date taking into account a custom timezone. If no Calendar object is specified, the driver uses the default timezone, which is that of the virtual machine running the application.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setDate in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  cal - the Calendar object the driver will use to construct the date
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getDate(int)

                  setTime

                  public void setTime(String parameterName,
                                      Time x,
                                      Calendar cal)
                               throws SQLException
                  Sets the designated parameter to the given java.sql.Time value, using the given Calendar object. The driver uses the Calendar object to construct an SQL TIME value, which the driver then sends to the database. With a a Calendar object, the driver can calculate the time taking into account a custom timezone. If no Calendar object is specified, the driver uses the default timezone, which is that of the virtual machine running the application.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setTime in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  cal - the Calendar object the driver will use to construct the time
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getTime(int)

                  setTimestamp

                  public void setTimestamp(String parameterName,
                                           Timestamp x,
                                           Calendar cal)
                                    throws SQLException
                  Sets the designated parameter to the given java.sql.Timestamp value, using the given Calendar object. The driver uses the Calendar object to construct an SQL TIMESTAMP value, which the driver then sends to the database. With a a Calendar object, the driver can calculate the timestamp taking into account a custom timezone. If no Calendar object is specified, the driver uses the default timezone, which is that of the virtual machine running the application.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setTimestamp in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  cal - the Calendar object the driver will use to construct the timestamp
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  getTimestamp(int)

                  setNull

                  public void setNull(String parameterName,
                                      int sqlType,
                                      String typeName)
                               throws SQLException
                  Sets the designated parameter to SQL NULL. This version of the method setNull should be used for user-defined types and REF type parameters. Examples of user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and named array types.

                  Note: To be portable, applications must give the SQL type code and the fully-qualified SQL type name when specifying a NULL user-defined or REF parameter. In the case of a user-defined type the name is the type name of the parameter itself. For a REF parameter, the name is the type name of the referenced type. If a JDBC driver does not need the type code or type name information, it may ignore it. Although it is intended for user-defined and Ref parameters, this method may be used to set a null parameter of any JDBC type. If the parameter does not have a user-defined or REF type, the given typeName is ignored.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setNull in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  sqlType - a value from java.sql.Types
                  typeName - the fully-qualified name of an SQL user-defined type; ignored if the parameter is not a user-defined type or SQL REF value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  getString

                  public String getString(String parameterName)
                                   throws SQLException
                  Retrieves the value of a JDBC CHAR, VARCHAR, or LONGVARCHAR parameter as a String in the Java programming language.

                  For the fixed-length type JDBC CHAR, the String object returned has exactly the same value the (JDBC4 clarification:) SQL CHAR value had in the database, including any padding added by the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getString in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setString(java.lang.String, java.lang.String)

                  getBoolean

                  public boolean getBoolean(String parameterName)
                                     throws SQLException
                  (JDBC4 modified:)

                  Retrieves the value of a JDBC BIT or BOOLEAN parameter as a boolean in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getBoolean in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is false.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setBoolean(java.lang.String, boolean)

                  getByte

                  public byte getByte(String parameterName)
                               throws SQLException
                  Retrieves the value of a JDBC TINYINT parameter as a byte in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getByte in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is 0.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setByte(java.lang.String, byte)

                  getShort

                  public short getShort(String parameterName)
                                 throws SQLException
                  Retrieves the value of a JDBC SMALLINT parameter as a short in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getShort in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is 0.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setShort(java.lang.String, short)

                  getInt

                  public int getInt(String parameterName)
                             throws SQLException
                  Retrieves the value of a JDBC INTEGER parameter as an int in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getInt in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is 0.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setInt(java.lang.String, int)

                  getLong

                  public long getLong(String parameterName)
                               throws SQLException
                  Retrieves the value of a JDBC BIGINT parameter as a long in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getLong in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is 0.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setLong(java.lang.String, long)

                  getFloat

                  public float getFloat(String parameterName)
                                 throws SQLException
                  Retrieves the value of a JDBC FLOAT parameter as a float in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getFloat in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is 0.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setFloat(java.lang.String, float)

                  getDouble

                  public double getDouble(String parameterName)
                                   throws SQLException
                  Retrieves the value of a JDBC DOUBLE parameter as a double in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getDouble in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is 0.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setDouble(java.lang.String, double)

                  getBytes

                  public byte[] getBytes(String parameterName)
                                  throws SQLException
                  Retrieves the value of a JDBC BINARY or VARBINARY parameter as an array of byte values in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getBytes in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setBytes(java.lang.String, byte[])

                  getDate

                  public Date getDate(String parameterName)
                               throws SQLException
                  Retrieves the value of a JDBC DATE parameter as a java.sql.Date object.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getDate in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setDate(java.lang.String, java.sql.Date)

                  getTime

                  public Time getTime(String parameterName)
                               throws SQLException
                  Retrieves the value of a JDBC TIME parameter as a java.sql.Time object.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getTime in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setTime(java.lang.String, java.sql.Time)

                  getTimestamp

                  public Timestamp getTimestamp(String parameterName)
                                         throws SQLException
                  Retrieves the value of a JDBC TIMESTAMP parameter as a java.sql.Timestamp object.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getTimestamp in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setTimestamp(java.lang.String, java.sql.Timestamp)

                  getObject

                  public Object getObject(String parameterName)
                                   throws SQLException
                  Retrieves the value of a parameter as an Object in the Java programming language. If the value is an SQL NULL, the driver returns a Java null.

                  This method returns a Java object whose type corresponds to the JDBC type that was registered for this parameter using the method registerOutParameter. By registering the target JDBC type as java.sql.Types.OTHER, this method can be used to read database-specific abstract data types.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getObject in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  A java.lang.Object holding the OUT parameter value.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  Types, setObject(java.lang.String, java.lang.Object, int, int)

                  getBigDecimal

                  public BigDecimal getBigDecimal(String parameterName)
                                           throws SQLException
                  Retrieves the value of a JDBC NUMERIC parameter as a java.math.BigDecimal object with as many digits to the right of the decimal point as the value contains.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getBigDecimal in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value in full precision. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setBigDecimal(java.lang.String, java.math.BigDecimal)

                  getObject

                  public Object getObject(String parameterName,
                                          Map map)
                                   throws SQLException
                  Specified by:
                  getObject in interface CallableStatement
                  Throws:
                  SQLException

                  getRef

                  public Ref getRef(String parameterName)
                             throws SQLException
                  Retrieves the value of a JDBC REF(<structured-type>) parameter as a Ref object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getRef in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value as a Ref object in the Java programming language. If the value was SQL NULL, the value null is returned.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  getBlob

                  public Blob getBlob(String parameterName)
                               throws SQLException
                  Retrieves the value of a JDBC BLOB parameter as a Blob object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getBlob in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value as a Blob object in the Java programming language. If the value was SQL NULL, the value null is returned.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  getClob

                  public Clob getClob(String parameterName)
                               throws SQLException
                  Retrieves the value of a JDBC CLOB parameter as a Clob object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getClob in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value as a Clob object in the Java programming language. If the value was SQL NULL, the value null is returned.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  getArray

                  public Array getArray(String parameterName)
                                 throws SQLException
                  Retrieves the value of a JDBC ARRAY parameter as an Array object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getArray in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value as an Array object in Java programming language. If the value was SQL NULL, the value null is returned.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0

                  getDate

                  public Date getDate(String parameterName,
                                      Calendar cal)
                               throws SQLException
                  Retrieves the value of a JDBC DATE parameter as a java.sql.Date object, using the given Calendar object to construct the date. With a Calendar object, the driver can calculate the date taking into account a custom timezone and locale. If no Calendar object is specified, the driver uses the default timezone and locale.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getDate in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  cal - the Calendar object the driver will use to construct the date
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setDate(java.lang.String, java.sql.Date)

                  getTime

                  public Time getTime(String parameterName,
                                      Calendar cal)
                               throws SQLException
                  Retrieves the value of a JDBC TIME parameter as a java.sql.Time object, using the given Calendar object to construct the time. With a Calendar object, the driver can calculate the time taking into account a custom timezone and locale. If no Calendar object is specified, the driver uses the default timezone and locale.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getTime in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  cal - the Calendar object the driver will use to construct the time
                  Returns:
                  the parameter value; if the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setTime(java.lang.String, java.sql.Time)

                  getTimestamp

                  public Timestamp getTimestamp(String parameterName,
                                                Calendar cal)
                                         throws SQLException
                  Retrieves the value of a JDBC TIMESTAMP parameter as a java.sql.Timestamp object, using the given Calendar object to construct the Timestamp object. With a Calendar object, the driver can calculate the timestamp taking into account a custom timezone and locale. If no Calendar object is specified, the driver uses the default timezone and locale.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getTimestamp in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  cal - the Calendar object the driver will use to construct the timestamp
                  Returns:
                  the parameter value. If the value is SQL NULL, the result is null.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setTimestamp(java.lang.String, java.sql.Timestamp)

                  getURL

                  public URL getURL(String parameterName)
                             throws SQLException
                  Retrieves the value of a JDBC DATALINK parameter as a java.net.URL object.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getURL in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value as a java.net.URL object in the Java programming language. If the value was SQL NULL, the value null is returned.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs, this method is called on a closed CallableStatement, or if there is a problem with the URL
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.0
                  See Also:
                  setURL(java.lang.String, java.net.URL)

                  getRowId

                  public RowId getRowId(int parameterIndex)
                                 throws SQLException
                  Retrieves the value of the designated JDBC ROWID parameter as a java.sql.RowId object.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getRowId in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2,...
                  Returns:
                  a RowId object that represents the JDBC ROWID value is used as the designated parameter. If the parameter contains a SQL NULL, then a null value is returned.
                  Throws:
                  SQLException - JDBC 4.1[ if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getRowId

                  public RowId getRowId(String parameterName)
                                 throws SQLException
                  Retrieves the value of the designated JDBC ROWID parameter as a java.sql.RowId object.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getRowId in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  a RowId object that represents the JDBC ROWID value is used as the designated parameter. If the parameter contains a SQL NULL, then a null value is returned.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setRowId

                  public void setRowId(String parameterName,
                                       RowId x)
                                throws SQLException
                  Sets the designated parameter to the given java.sql.RowId object. The driver converts this to a SQL ROWID when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setRowId in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setNString

                  public void setNString(String parameterName,
                                         String value)
                                  throws SQLException
                  Sets the designated parameter to the given String object. The driver converts this to a SQL NCHAR or NVARCHAR or LONGNVARCHAR

                  Specified by:
                  setNString in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter to be set
                  value - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setNCharacterStream

                  public void setNCharacterStream(String parameterName,
                                                  Reader value,
                                                  long length)
                                           throws SQLException
                  Sets the designated parameter to a Reader object. The Reader reads the data till end-of-file is reached. The driver does the necessary conversion from Java character format to the national character set in the database.

                  Specified by:
                  setNCharacterStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter to be set
                  value - the parameter value
                  length - the number of characters in the parameter data.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setNClob

                  public void setNClob(String parameterName,
                                       NClob value)
                                throws SQLException
                  Sets the designated parameter to a java.sql.NClob object. The object implements the java.sql.NClob interface. This NClob object maps to a SQL NCLOB.

                  Specified by:
                  setNClob in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter to be set
                  value - the parameter value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setClob

                  public void setClob(String parameterName,
                                      Reader reader,
                                      long length)
                               throws SQLException
                  Sets the designated parameter to a Reader object. The reader must contain the number of characters specified by length otherwise a SQLException will be generated when the CallableStatement is executed. This method differs from the setCharacterStream (int, Reader, int) method because it informs the driver that the parameter value should be sent to the server as a CLOB. When the setCharacterStream method is used, the driver may have to do extra work to determine whether the parameter data should be send to the server as a LONGVARCHAR or a CLOB

                  Specified by:
                  setClob in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter to be set
                  reader - An object that contains the data to set the parameter value to.
                  length - the number of characters in the parameter data.
                  Throws:
                  SQLException - if parameterName does not correspond to a named parameter; if the length specified is less than zero; a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setBlob

                  public void setBlob(String parameterName,
                                      InputStream inputStream,
                                      long length)
                               throws SQLException
                  Sets the designated parameter to a InputStream object. The inputstream must contain the number of characters specified by length, otherwise a SQLException will be generated when the CallableStatement is executed. This method differs from the setBinaryStream (int, InputStream, int) method because it informs the driver that the parameter value should be sent to the server as a BLOB. When the setBinaryStream method is used, the driver may have to do extra work to determine whether the parameter data should be sent to the server as a LONGVARBINARY or a BLOB

                  Specified by:
                  setBlob in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter to be set the second is 2, ...
                  inputStream - An object that contains the data to set the parameter value to.
                  length - the number of bytes in the parameter data.
                  Throws:
                  SQLException - if parameterName does not correspond to a named parameter; if the length specified is less than zero; if the number of bytes in the input stream does not match the specified length; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setNClob

                  public void setNClob(String parameterName,
                                       Reader reader,
                                       long length)
                                throws SQLException
                  Sets the designated parameter to a Reader object. The reader must contain the number of characters specified by length otherwise a SQLException will be generated when the CallableStatement is executed. This method differs from the setCharacterStream (int, Reader, int) method because it informs the driver that the parameter value should be sent to the server as a NCLOB. When the setCharacterStream method is used, the driver may have to do extra work to determine whether the parameter data should be send to the server as a LONGNVARCHAR or a NCLOB

                  Specified by:
                  setNClob in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter to be set
                  reader - An object that contains the data to set the parameter value to.
                  length - the number of characters in the parameter data.
                  Throws:
                  SQLException - if parameterName does not correspond to a named parameter; if the length specified is less than zero; if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getNClob

                  public NClob getNClob(int parameterIndex)
                                 throws SQLException
                  Retrieves the value of the designated JDBC NCLOB parameter as a java.sql.NClob object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getNClob in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  Returns:
                  the parameter value as a NClob object in the Java programming language. If the value was SQL NULL, the value null is returned.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getNClob

                  public NClob getNClob(String parameterName)
                                 throws SQLException
                  Retrieves the value of a JDBC NCLOB parameter as a java.sql.NClob object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getNClob in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  the parameter value as a NClob object in the Java programming language. If the value was SQL NULL, the value null is returned.
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setSQLXML

                  public void setSQLXML(String parameterName,
                                        SQLXML xmlObject)
                                 throws SQLException
                  Sets the designated parameter to the given java.sql.SQLXML object. The driver converts this to an SQL XML value when it sends it to the database.

                  Specified by:
                  setSQLXML in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  xmlObject - a SQLXML object that maps an SQL XML value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs; this method is called on a closed CallableStatement or the java.xml.transform.Result, Writer or OutputStream has not been closed for the SQLXML object
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getSQLXML

                  public SQLXML getSQLXML(int parameterIndex)
                                   throws SQLException
                  Retrieves the value of the designated SQL XML parameter as a java.sql.SQLXML object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getSQLXML in interface CallableStatement
                  Parameters:
                  parameterIndex - index of the first parameter is 1, the second is 2, ...
                  Returns:
                  a SQLXML object that maps an SQL XML value
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getSQLXML

                  public SQLXML getSQLXML(String parameterName)
                                   throws SQLException
                  Retrieves the value of the designated SQL XML parameter as a java.sql.SQLXML object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getSQLXML in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  a SQLXML object that maps an SQL XML value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getNString

                  public String getNString(int parameterIndex)
                                    throws SQLException
                  Retrieves the value of the designated NCHAR, NVARCHAR or LONGNVARCHAR parameter as a String in the Java programming language.

                  For the fixed-length type JDBC NCHAR, the String object returned has exactly the same value the SQL NCHAR value had in the database, including any padding added by the database.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getNString in interface CallableStatement
                  Parameters:
                  parameterIndex - index of the first parameter is 1, the second is 2, ...
                  Returns:
                  a String object that maps an NCHAR, NVARCHAR or LONGNVARCHAR value
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0
                  See Also:
                  setNString(java.lang.String, java.lang.String)

                  getNString

                  public String getNString(String parameterName)
                                    throws SQLException
                  Retrieves the value of the designated NCHAR, NVARCHAR or LONGNVARCHAR parameter as a String in the Java programming language.

                  For the fixed-length type JDBC NCHAR, the String object returned has exactly the same value the SQL NCHAR value had in the database, including any padding added by the database.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getNString in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  a String object that maps an NCHAR, NVARCHAR or LONGNVARCHAR value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0
                  See Also:
                  setNString(java.lang.String, java.lang.String)

                  getNCharacterStream

                  public Reader getNCharacterStream(int parameterIndex)
                                             throws SQLException
                  Retrieves the value of the designated parameter as a java.io.Reader object in the Java programming language. It is intended for use when accessing NCHAR,NVARCHAR and LONGNVARCHAR parameters.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getNCharacterStream in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  Returns:
                  a java.io.Reader object that contains the parameter value; if the value is SQL NULL, the value returned is null in the Java programming language.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getNCharacterStream

                  public Reader getNCharacterStream(String parameterName)
                                             throws SQLException
                  Retrieves the value of the designated parameter as a java.io.Reader object in the Java programming language. It is intended for use when accessing NCHAR,NVARCHAR and LONGNVARCHAR parameters.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getNCharacterStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  a java.io.Reader object that contains the parameter value; if the value is SQL NULL, the value returned is null in the Java programming language
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getCharacterStream

                  public Reader getCharacterStream(int parameterIndex)
                                            throws SQLException
                  Retrieves the value of the designated parameter as a java.io.Reader object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature.

                  Calling this method always throws an SQLException.

                  Specified by:
                  getCharacterStream in interface CallableStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  Returns:
                  a java.io.Reader object that contains the parameter value; if the value is SQL NULL, the value returned is null in the Java programming language.
                  Throws:
                  SQLException - JDBC 4.1[if the parameterIndex is not valid;] if a database access error occurs or this method is called on a closed CallableStatement
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getCharacterStream

                  public Reader getCharacterStream(String parameterName)
                                            throws SQLException
                  Retrieves the value of the designated parameter as a java.io.Reader object in the Java programming language.

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  getCharacterStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  Returns:
                  a java.io.Reader object that contains the parameter value; if the value is SQL NULL, the value returned is null in the Java programming language
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setBlob

                  public void setBlob(String parameterName,
                                      Blob x)
                               throws SQLException
                  Sets the designated parameter to the given java.sql.Blob object. The driver converts this to an SQL BLOB value when it sends it to the database.

                  Specified by:
                  setBlob in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - a Blob object that maps an SQL BLOB value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setClob

                  public void setClob(String parameterName,
                                      Clob x)
                               throws SQLException
                  Sets the designated parameter to the given java.sql.Clob object. The driver converts this to an SQL CLOB value when it sends it to the database.

                  Specified by:
                  setClob in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - a Clob object that maps an SQL CLOB value
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setAsciiStream

                  public void setAsciiStream(String parameterName,
                                             InputStream x,
                                             long length)
                                      throws SQLException
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes. When a very large ASCII value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.InputStream. Data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from ASCII to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  Specified by:
                  setAsciiStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the Java input stream that contains the ASCII parameter value
                  length - the number of bytes in the stream
                  Throws:
                  SQLException - if parameterName does not correspond to a named parameter; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setBinaryStream

                  public void setBinaryStream(String parameterName,
                                              InputStream x,
                                              long length)
                                       throws SQLException
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes. When a very large binary value is input to a LONGVARBINARY parameter, it may be more practical to send it via a java.io.InputStream object. The data will be read from the stream as needed until end-of-file is reached.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  Specified by:
                  setBinaryStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the java input stream which contains the binary parameter value
                  length - the number of bytes in the stream
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setCharacterStream

                  public void setCharacterStream(String parameterName,
                                                 Reader reader,
                                                 long length)
                                          throws SQLException
                  Sets the designated parameter to the given Reader object, which is the given number of characters long. When a very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.Reader object. The data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  Specified by:
                  setCharacterStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  reader - the java.io.Reader object that contains the UNICODE data used as the designated parameter
                  length - the number of characters in the stream
                  Throws:
                  SQLException - JDBC 4.1[if parameterName does not correspond to a named parameter;] if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setAsciiStream

                  public void setAsciiStream(String parameterName,
                                             InputStream x)
                                      throws SQLException
                  Sets the designated parameter to the given input stream. When a very large ASCII value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.InputStream. Data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from ASCII to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setAsciiStream which takes a length parameter.

                  Specified by:
                  setAsciiStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the Java input stream that contains the ASCII parameter value
                  Throws:
                  SQLException - if parameterName does not correspond to a named parameter; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setBinaryStream

                  public void setBinaryStream(String parameterName,
                                              InputStream x)
                                       throws SQLException
                  Sets the designated parameter to the given input stream. When a very large binary value is input to a LONGVARBINARY parameter, it may be more practical to send it via a java.io.InputStream object. The data will be read from the stream as needed until end-of-file is reached.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setBinaryStream which takes a length parameter.

                  Specified by:
                  setBinaryStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  x - the java input stream which contains the binary parameter value
                  Throws:
                  SQLException - if parameterName does not correspond to a named parameter; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setCharacterStream

                  public void setCharacterStream(String parameterName,
                                                 Reader reader)
                                          throws SQLException
                  Sets the designated parameter to the given Reader object. When a very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.Reader object. The data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setCharacterStream which takes a length parameter.

                  Specified by:
                  setCharacterStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  reader - the java.io.Reader object that contains the Unicode data
                  Throws:
                  SQLException - if parameterName does not correspond to a named parameter; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method JDK 1.6, HSQLDB 2.0

                  setNCharacterStream

                  public void setNCharacterStream(String parameterName,
                                                  Reader value)
                                           throws SQLException
                  Sets the designated parameter to a Reader object. The Reader reads the data till end-of-file is reached. The driver does the necessary conversion from Java character format to the national character set in the database.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setNCharacterStream which takes a length parameter.

                  Specified by:
                  setNCharacterStream in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  value - the parameter value
                  Throws:
                  SQLException - if parameterName does not correspond to a named parameter; if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; if a database access error occurs; or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method JDK 1.6, HSQLDB 2.0

                  setClob

                  public void setClob(String parameterName,
                                      Reader reader)
                               throws SQLException
                  Sets the designated parameter to a Reader object. This method differs from the setCharacterStream (int, Reader) method because it informs the driver that the parameter value should be sent to the server as a CLOB. When the setCharacterStream method is used, the driver may have to do extra work to determine whether the parameter data should be send to the server as a LONGVARCHAR or a CLOB

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setClob which takes a length parameter.

                  Specified by:
                  setClob in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  reader - An object that contains the data to set the parameter value to.
                  Throws:
                  SQLException - if parameterName does not correspond to a named parameter; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method JDK 1.6, HSQLDB 2.0

                  setBlob

                  public void setBlob(String parameterName,
                                      InputStream inputStream)
                               throws SQLException
                  Sets the designated parameter to a InputStream object. This method differs from the setBinaryStream (int, InputStream) method because it informs the driver that the parameter value should be sent to the server as a BLOB. When the setBinaryStream method is used, the driver may have to do extra work to determine whether the parameter data should be send to the server as a LONGVARBINARY or a BLOB

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setBlob which takes a length parameter.

                  Specified by:
                  setBlob in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  inputStream - An object that contains the data to set the parameter value to.
                  Throws:
                  SQLException - if parameterName does not correspond to a named parameter; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method JDK 1.6, HSQLDB 2.0

                  setNClob

                  public void setNClob(String parameterName,
                                       Reader reader)
                                throws SQLException
                  Sets the designated parameter to a Reader object. This method differs from the setCharacterStream (int, Reader) method because it informs the driver that the parameter value should be sent to the server as a NCLOB. When the setCharacterStream method is used, the driver may have to do extra work to determine whether the parameter data should be send to the server as a LONGNVARCHAR or a NCLOB

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setNClob which takes a length parameter.

                  Specified by:
                  setNClob in interface CallableStatement
                  Parameters:
                  parameterName - the name of the parameter
                  reader - An object that contains the data to set the parameter value to.
                  Throws:
                  SQLException - if parameterName does not correspond to a named parameter; if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; if a database access error occurs or this method is called on a closed CallableStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method JDK 1.6, HSQLDB 2.0

                  getObject

                  public <T> T getObject(int parameterIndex,
                                         Class<T> type)
                              throws SQLException

                  Returns an object representing the value of OUT parameter parameterIndex and will convert from the SQL type of the parameter to the requested Java data type, if the conversion is supported. If the conversion is not supported or null is specified for the type, a SQLException is thrown.

                  At a minimum, an implementation must support the conversions defined in Appendix B, Table B-3 and conversion of appropriate user defined SQL types to a Java type which implements SQLData, or Struct. Additional conversions may be supported and are vendor defined.

                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, and so on
                  type - Class representing the Java data type to convert the designated parameter to.
                  Returns:
                  an instance of type holding the OUT parameter value
                  Throws:
                  SQLException - if conversion is not supported, type is null or another error occurs. The getCause() method of the exception may provide a more detailed exception, for example, if a conversion error occurs
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1

                  getObject

                  public <T> T getObject(String parameterName,
                                         Class<T> type)
                              throws SQLException

                  Returns an object representing the value of OUT parameter parameterName and will convert from the SQL type of the parameter to the requested Java data type, if the conversion is supported. If the conversion is not supported or null is specified for the type, a SQLException is thrown.

                  At a minimum, an implementation must support the conversions defined in Appendix B, Table B-3 and conversion of appropriate user defined SQL types to a Java type which implements SQLData, or Struct. Additional conversions may be supported and are vendor defined.

                  Parameters:
                  parameterName - the name of the parameter
                  type - Class representing the Java data type to convert the designated parameter to.
                  Returns:
                  an instance of type holding the OUT parameter value
                  Throws:
                  SQLException - if conversion is not supported, type is null or another error occurs. The getCause() method of the exception may provide a more detailed exception, for example, if a conversion error occurs
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1

                  close

                  public void close()
                             throws SQLException
                  Does the specialized work required to free this object's resources and that of it's parent classes.

                  Specified by:
                  close in interface Statement
                  Overrides:
                  close in class JDBCPreparedStatement
                  Throws:
                  SQLException - if a database access error occurs

                  closeOnCompletion

                  public void closeOnCompletion()
                                         throws SQLException
                  Specifies that this Statement will be closed when all its dependent result sets are closed. If execution of the Statement does not produce any result sets, this method has no effect.

                  Note: Multiple calls to closeOnCompletion do not toggle the effect on this Statement. However, a call to closeOnCompletion does effect both the subsequent execution of statements, and statements that currently have open, dependent, result sets.

                  Throws:
                  SQLException - if this method is called on a closed Statement

                  isCloseOnCompletion

                  public boolean isCloseOnCompletion()
                                              throws SQLException
                  Returns a value indicating whether this Statement will be closed when all its dependent result sets are closed.

                  Returns:
                  true if the Statement will be closed when all of its dependent result sets are closed; false otherwise
                  Throws:
                  SQLException - if this method is called on a closed Statement

                  executeQuery

                  public ResultSet executeQuery()
                                         throws SQLException
                  Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query.

                  HSQLDB-Specific Information:

                  HSQLDB supports this method for a call to a FUNCTION that returns a result. For a PROCEDURE that returns one or more results, the first result is returned.

                  If the FUNCTION or PROCEDURE does not return a ResultSet, an SQLException if thrown.

                  Specified by:
                  executeQuery in interface PreparedStatement
                  Overrides:
                  executeQuery in class JDBCPreparedStatement
                  Returns:
                  a ResultSet object that contains the data produced by the query; never null
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed PreparedStatement or the SQL statement does not return a ResultSet object


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/package-frame.html0000644000175000017500000001011212007570404024603 0ustar renerene org.hsqldb.jdbc (HSQLDB 2.2.9 API) org.hsqldb.jdbc
                  Interfaces 
                  JDBCConnectionEventListener
                  Classes 
                  JDBCArray
                  JDBCArrayBasic
                  JDBCBlob
                  JDBCBlobClient
                  JDBCBlobFile
                  JDBCCallableStatement
                  JDBCClob
                  JDBCClobClient
                  JDBCClobFile
                  JDBCColumnMetaData
                  JDBCCommonDataSource
                  JDBCConnection
                  JDBCDatabaseMetaData
                  JDBCDataSource
                  JDBCDataSourceFactory
                  JDBCDriver
                  JDBCNClob
                  JDBCParameterMetaData
                  JDBCPool
                  JDBCPreparedStatement
                  JDBCResultSet
                  JDBCResultSetMetaData
                  JDBCRowId
                  JDBCSavepoint
                  JDBCSQLXML
                  JDBCSQLXML.SAX2XMLStreamWriter
                  JDBCStatement
                  Util
                  hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCParameterMetaData.html0000644000175000017500000011207312007570404026075 0ustar renerene JDBCParameterMetaData (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCParameterMetaData

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCParameterMetaData
                  
                  All Implemented Interfaces:
                  ParameterMetaData, Wrapper

                  public class JDBCParameterMetaData
                  extends Object
                  implements ParameterMetaData, Wrapper

                  An object that can be used to get information about the types and properties for each parameter marker in a PreparedStatement object. (JDBC4 Clarification:) For some queries and driver implementations, the data that would be returned by a ParameterMetaData object may not be available until the PreparedStatement has been executed.

                  Some driver implementations may not be able to provide information about the types and properties for each parameter marker in a CallableStatement object.

                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net)

                  Field Summary
                   
                  Fields inherited from interface java.sql.ParameterMetaData
                  parameterModeIn, parameterModeInOut, parameterModeOut, parameterModeUnknown, parameterNoNulls, parameterNullable, parameterNullableUnknown
                   
                  Method Summary
                   String getParameterClassName(int param)
                            Retrieves the fully-qualified name of the Java class whose instances should be passed to the method PreparedStatement.setObject.
                   int getParameterCount()
                            Retrieves the number of parameters in the PreparedStatement object for which this ParameterMetaData object contains information.
                   int getParameterMode(int param)
                            Retrieves the designated parameter's mode.
                   int getParameterType(int param)
                            Retrieves the designated parameter's SQL type.
                   String getParameterTypeName(int param)
                            Retrieves the designated parameter's database-specific type name.
                   int getPrecision(int param)
                            Retrieves the designated parameter's specified column size.
                   int getScale(int param)
                            Retrieves the designated parameter's number of digits to right of the decimal point.
                   int isNullable(int param)
                            Retrieves whether null values are allowed in the designated parameter.
                   boolean isSigned(int param)
                            Retrieves whether values for the designated parameter can be signed numbers.
                   boolean isWrapperFor(Class<?> iface)
                            Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                   String toString()
                            Retrieves a String repsentation of this object.
                  <T> T
                  unwrap(Class<T> iface)
                            Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
                   

                  Method Detail

                  getParameterCount

                  public int getParameterCount()
                                        throws SQLException
                  Retrieves the number of parameters in the PreparedStatement object for which this ParameterMetaData object contains information.

                  Specified by:
                  getParameterCount in interface ParameterMetaData
                  Returns:
                  the number of parameters
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  isNullable

                  public int isNullable(int param)
                                 throws SQLException
                  Retrieves whether null values are allowed in the designated parameter.

                  Specified by:
                  isNullable in interface ParameterMetaData
                  Parameters:
                  param - the first parameter is 1, the second is 2, ...
                  Returns:
                  the nullability status of the given parameter; one of ParameterMetaData.parameterNoNulls, ParameterMetaData.parameterNullable, or ParameterMetaData.parameterNullableUnknown
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  isSigned

                  public boolean isSigned(int param)
                                   throws SQLException
                  Retrieves whether values for the designated parameter can be signed numbers.

                  Specified by:
                  isSigned in interface ParameterMetaData
                  Parameters:
                  param - the first parameter is 1, the second is 2, ...
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  getPrecision

                  public int getPrecision(int param)
                                   throws SQLException
                  Retrieves the designated parameter's specified column size.

                  The returned value represents the maximum column size for the given parameter. For numeric data, this is the maximum precision. For character data, this is the length in characters. For datetime datatypes, this is the length in characters of the String representation (assuming the maximum allowed precision of the fractional seconds component). For binary data, this is the length in bytes. For the ROWID datatype, this is the length in bytes. 0 is returned for data types where the column size is not applicable.

                  Specified by:
                  getPrecision in interface ParameterMetaData
                  Parameters:
                  param - the first parameter is 1, the second is 2, ...
                  Returns:
                  precision
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  getScale

                  public int getScale(int param)
                               throws SQLException
                  Retrieves the designated parameter's number of digits to right of the decimal point. 0 is returned for data types where the scale is not applicable.

                  Specified by:
                  getScale in interface ParameterMetaData
                  Parameters:
                  param - the first parameter is 1, the second is 2, ...
                  Returns:
                  scale
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  getParameterType

                  public int getParameterType(int param)
                                       throws SQLException
                  Retrieves the designated parameter's SQL type.

                  Specified by:
                  getParameterType in interface ParameterMetaData
                  Parameters:
                  param - the first parameter is 1, the second is 2, ...
                  Returns:
                  SQL type from java.sql.Types
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  Types

                  getParameterTypeName

                  public String getParameterTypeName(int param)
                                              throws SQLException
                  Retrieves the designated parameter's database-specific type name.

                  Specified by:
                  getParameterTypeName in interface ParameterMetaData
                  Parameters:
                  param - the first parameter is 1, the second is 2, ...
                  Returns:
                  type the name used by the database. If the parameter type is a user-defined type, then a fully-qualified type name is returned.
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  getParameterClassName

                  public String getParameterClassName(int param)
                                               throws SQLException
                  Retrieves the fully-qualified name of the Java class whose instances should be passed to the method PreparedStatement.setObject.

                  Specified by:
                  getParameterClassName in interface ParameterMetaData
                  Parameters:
                  param - the first parameter is 1, the second is 2, ...
                  Returns:
                  the fully-qualified name of the class in the Java programming language that would be used by the method PreparedStatement.setObject to set the value in the specified parameter. This is the class name used for custom mapping.
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  getParameterMode

                  public int getParameterMode(int param)
                                       throws SQLException
                  Retrieves the designated parameter's mode.

                  Specified by:
                  getParameterMode in interface ParameterMetaData
                  Parameters:
                  param - the first parameter is 1, the second is 2, ...
                  Returns:
                  mode of the parameter; one of ParameterMetaData.parameterModeIn, ParameterMetaData.parameterModeOut, or ParameterMetaData.parameterModeInOut ParameterMetaData.parameterModeUnknown.
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  unwrap

                  public <T> T unwrap(Class<T> iface)
                           throws SQLException
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy. If the receiver implements the interface then the result is the receiver or a proxy for the receiver. If the receiver is a wrapper and the wrapped object implements the interface then the result is the wrapped object or a proxy for the wrapped object. Otherwise return the the result of calling unwrap recursively on the wrapped object or a proxy for that result. If the receiver is not a wrapper and does not implement the interface, then an SQLException is thrown.

                  Specified by:
                  unwrap in interface Wrapper
                  Parameters:
                  iface - A Class defining an interface that the result must implement.
                  Returns:
                  an object that implements the interface. May be a proxy for the actual implementing object.
                  Throws:
                  SQLException - If no object found that implements the interface
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  isWrapperFor

                  public boolean isWrapperFor(Class<?> iface)
                                       throws SQLException
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does. Returns false otherwise. If this implements the interface then return true, else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped object. If this does not implement the interface and is not a wrapper, return false. This method should be implemented as a low-cost operation compared to unwrap so that callers can use this method to avoid expensive unwrap calls that may fail. If this method returns true then calling unwrap with the same argument should succeed.

                  Specified by:
                  isWrapperFor in interface Wrapper
                  Parameters:
                  iface - a Class defining an interface.
                  Returns:
                  true if this implements the interface or directly or indirectly wraps an object that does.
                  Throws:
                  SQLException - if an error occurs while determining whether this is a wrapper for an object with the given interface.
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  toString

                  public String toString()
                  Retrieves a String repsentation of this object.

                  Overrides:
                  toString in class Object
                  Returns:
                  a String repsentation of this object


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCArrayBasic.html0000644000175000017500000014325112007570402024574 0ustar renerene JDBCArrayBasic (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCArrayBasic

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCArrayBasic
                  
                  All Implemented Interfaces:
                  Array

                  public class JDBCArrayBasic
                  extends Object
                  implements Array

                  The mapping in the Java programming language for the SQL type ARRAY. By default, an Array value is a transaction-duration reference to an SQL ARRAY value. By default, an Array object is implemented using an SQL LOCATOR(array) internally, which means that an Array object contains a logical pointer to the data in the SQL ARRAY value rather than containing the ARRAY value's data.

                  The Array interface provides methods for bringing an SQL ARRAY value's data to the client as either an array or a ResultSet object. If the elements of the SQL ARRAY are a UDT, they may be custom mapped. To create a custom mapping, a programmer must do two things:

                  • create a class that implements the SQLData interface for the UDT to be custom mapped.
                  • make an entry in a type map that contains
                    • the fully-qualified SQL type name of the UDT
                    • the Class object for the class implementing SQLData

                  When a type map with an entry for the base type is supplied to the methods getArray and getResultSet, the mapping it contains will be used to map the elements of the ARRAY value. If no type map is supplied, which would typically be the case, the connection's type map is used by default. If the connection's type map or a type map supplied to a method has no entry for the base type, the elements are mapped according to the standard mapping.

                  All methods on the Array interface must be fully implemented if the JDBC driver supports the data type.

                  Since:
                  JDK 1.2, HSQLDB 2.0.1
                  Author:
                  Fred Toussi (fredt@users dot sourceforge.net)

                  Constructor Summary
                  JDBCArrayBasic(Object[] data, org.hsqldb.types.Type type)
                             
                   
                  Method Summary
                   void free()
                            This method frees the Array object and releases the resources that it holds.
                   Object getArray()
                            Retrieves the contents of the SQL ARRAY value designated by this Array object in the form of an array in the Java programming language.
                   Object getArray(long index, int count)
                            Retrieves a slice of the SQL ARRAY value designated by this Array object, beginning with the specified index and containing up to count successive elements of the SQL array.
                   Object getArray(long index, int count, Map<String,Class<?>> map)
                            Retreives a slice of the SQL ARRAY value designated by this Array object, beginning with the specified index and containing up to count successive elements of the SQL array.
                   Object getArray(Map<String,Class<?>> map)
                            Retrieves the contents of the SQL ARRAY value designated by this Array object.
                   int getBaseType()
                            Retrieves the JDBC type of the elements in the array designated by this Array object.
                   String getBaseTypeName()
                            Retrieves the SQL type name of the elements in the array designated by this Array object.
                   ResultSet getResultSet()
                            Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object.
                   ResultSet getResultSet(long index, int count)
                            Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements.
                   ResultSet getResultSet(long index, int count, Map<String,Class<?>> map)
                            Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements.
                   ResultSet getResultSet(Map<String,Class<?>> map)
                            Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object.
                   String toString()
                            Returns a string representation in the form ARRAY[..., ...]
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
                   

                  Constructor Detail

                  JDBCArrayBasic

                  public JDBCArrayBasic(Object[] data,
                                        org.hsqldb.types.Type type)
                  Method Detail

                  getBaseTypeName

                  public String getBaseTypeName()
                                         throws SQLException
                  Retrieves the SQL type name of the elements in the array designated by this Array object. If the elements are a built-in type, it returns the database-specific type name of the elements. If the elements are a user-defined type (UDT), this method returns the fully-qualified SQL type name.

                  Specified by:
                  getBaseTypeName in interface Array
                  Returns:
                  a String that is the database-specific name for a built-in base type; or the fully-qualified SQL type name for a base type that is a UDT
                  Throws:
                  SQLException - if an error occurs while attempting to access the type name
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getBaseType

                  public int getBaseType()
                                  throws SQLException
                  Retrieves the JDBC type of the elements in the array designated by this Array object.

                  Specified by:
                  getBaseType in interface Array
                  Returns:
                  a constant from the class Types that is the type code for the elements in the array designated by this Array object
                  Throws:
                  SQLException - if an error occurs while attempting to access the base type
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getArray

                  public Object getArray()
                  Retrieves the contents of the SQL ARRAY value designated by this Array object in the form of an array in the Java programming language. This version of the method getArray uses the type map associated with the connection for customizations of the type mappings.

                  Note: When getArray is used to materialize a base type that maps to a primitive data type, then it is implementation-defined whether the array returned is an array of that primitive data type or an array of Object.

                  HSQLDB-Specific Information:

                  HSQLDB always returns an array of Object.

                  Specified by:
                  getArray in interface Array
                  Returns:
                  an array in the Java programming language that contains the ordered elements of the SQL ARRAY value designated by this Array object
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getArray

                  public Object getArray(Map<String,Class<?>> map)
                                  throws SQLException
                  Retrieves the contents of the SQL ARRAY value designated by this Array object. This method uses the specified map for type map customizations unless the base type of the array does not match a user-defined type in map, in which case it uses the standard mapping. This version of the method getArray uses either the given type map or the standard mapping; it never uses the type map associated with the connection.

                  Note: When getArray is used to materialize a base type that maps to a primitive data type, then it is implementation-defined whether the array returned is an array of that primitive data type or an array of Object.

                  HSQLDB-Specific Information:

                  HSQLDB always returns an array of Object.

                  Specified by:
                  getArray in interface Array
                  Parameters:
                  map - a java.util.Map object that contains mappings of SQL type names to classes in the Java programming language
                  Returns:
                  an array in the Java programming language that contains the ordered elements of the SQL array designated by this object
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getArray

                  public Object getArray(long index,
                                         int count)
                                  throws SQLException
                  Retrieves a slice of the SQL ARRAY value designated by this Array object, beginning with the specified index and containing up to count successive elements of the SQL array. This method uses the type map associated with the connection for customizations of the type mappings.

                  Note: When getArray is used to materialize a base type that maps to a primitive data type, then it is implementation-defined whether the array returned is an array of that primitive data type or an array of Object.

                  HSQLDB-Specific Information:

                  HSQLDB always returns an array of Object.

                  Specified by:
                  getArray in interface Array
                  Parameters:
                  index - the array index of the first element to retrieve; the first element is at index 1
                  count - the number of successive SQL array elements to retrieve
                  Returns:
                  an array containing up to count consecutive elements of the SQL array, beginning with element index
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getArray

                  public Object getArray(long index,
                                         int count,
                                         Map<String,Class<?>> map)
                                  throws SQLException
                  Retreives a slice of the SQL ARRAY value designated by this Array object, beginning with the specified index and containing up to count successive elements of the SQL array.

                  This method uses the specified map for type map customizations unless the base type of the array does not match a user-defined type in map, in which case it uses the standard mapping. This version of the method getArray uses either the given type map or the standard mapping; it never uses the type map associated with the connection.

                  Note: When getArray is used to materialize a base type that maps to a primitive data type, then it is implementation-defined whether the array returned is an array of that primitive data type or an array of Object.

                  HSQLDB-Specific Information:

                  HSQLDB always returns an array of Object.

                  Specified by:
                  getArray in interface Array
                  Parameters:
                  index - the array index of the first element to retrieve; the first element is at index 1
                  count - the number of successive SQL array elements to retrieve
                  map - a java.util.Map object that contains SQL type names and the classes in the Java programming language to which they are mapped
                  Returns:
                  an array containing up to count consecutive elements of the SQL ARRAY value designated by this Array object, beginning with element index
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getResultSet

                  public ResultSet getResultSet()
                                         throws SQLException
                  Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object. If appropriate, the elements of the array are mapped using the connection's type map; otherwise, the standard mapping is used.

                  The result set contains one row for each array element, with two columns in each row. The second column stores the element value; the first column stores the index into the array for that element (with the first array element being at index 1). The rows are in ascending order corresponding to the order of the indices.

                  Specified by:
                  getResultSet in interface Array
                  Returns:
                  a ResultSet object containing one row for each of the elements in the array designated by this Array object, with the rows in ascending order based on the indices.
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getResultSet

                  public ResultSet getResultSet(Map<String,Class<?>> map)
                                         throws SQLException
                  Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object. This method uses the specified map for type map customizations unless the base type of the array does not match a user-defined type in map, in which case it uses the standard mapping. This version of the method getResultSet uses either the given type map or the standard mapping; it never uses the type map associated with the connection.

                  The result set contains one row for each array element, with two columns in each row. The second column stores the element value; the first column stores the index into the array for that element (with the first array element being at index 1). The rows are in ascending order corresponding to the order of the indices.

                  Specified by:
                  getResultSet in interface Array
                  Parameters:
                  map - contains the mapping of SQL user-defined types to classes in the Java programming language
                  Returns:
                  a ResultSet object containing one row for each of the elements in the array designated by this Array object, with the rows in ascending order based on the indices.
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getResultSet

                  public ResultSet getResultSet(long index,
                                                int count)
                                         throws SQLException
                  Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements. This method uses the connection's type map to map the elements of the array if the map contains an entry for the base type. Otherwise, the standard mapping is used.

                  The result set has one row for each element of the SQL array designated by this object, with the first row containing the element at index index. The result set has up to count rows in ascending order based on the indices. Each row has two columns: The second column stores the element value; the first column stores the index into the array for that element.

                  Specified by:
                  getResultSet in interface Array
                  Parameters:
                  index - the array index of the first element to retrieve; the first element is at index 1
                  count - the number of successive SQL array elements to retrieve
                  Returns:
                  a ResultSet object containing up to count consecutive elements of the SQL array designated by this Array object, starting at index index.
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getResultSet

                  public ResultSet getResultSet(long index,
                                                int count,
                                                Map<String,Class<?>> map)
                                         throws SQLException
                  Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements. This method uses the specified map for type map customizations unless the base type of the array does not match a user-defined type in map, in which case it uses the standard mapping. This version of the method getResultSet uses either the given type map or the standard mapping; it never uses the type map associated with the connection.

                  The result set has one row for each element of the SQL array designated by this object, with the first row containing the element at index index. The result set has up to count rows in ascending order based on the indices. Each row has two columns: The second column stores the element value; the first column stores the index into the array for that element.

                  Specified by:
                  getResultSet in interface Array
                  Parameters:
                  index - the array index of the first element to retrieve; the first element is at index 1
                  count - the number of successive SQL array elements to retrieve
                  map - the Map object that contains the mapping of SQL type names to classes in the Java(tm) programming language
                  Returns:
                  a ResultSet object containing up to count consecutive elements of the SQL array designated by this Array object, starting at index index.
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  toString

                  public String toString()
                  Returns a string representation in the form ARRAY[..., ...]

                  Overrides:
                  toString in class Object

                  free

                  public void free()
                            throws SQLException
                  This method frees the Array object and releases the resources that it holds. The object is invalid once the free method is called.

                  After free has been called, any attempt to invoke a method other than free will result in a SQLException being thrown. If free is called multiple times, the subsequent calls to free are treated as a no-op.

                  Specified by:
                  free in interface Array
                  Throws:
                  SQLException - if an error occurs releasing the Array's resources
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCDataSourceFactory.html0000644000175000017500000004407412007570404026143 0ustar renerene JDBCDataSourceFactory (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCDataSourceFactory

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCDataSourceFactory
                  
                  All Implemented Interfaces:
                  ObjectFactory

                  public class JDBCDataSourceFactory
                  extends Object
                  implements ObjectFactory

                  A JNDI ObjectFactory for creating data sources supported by HyperSQL JDBCDataSource for plain connections for the end user. JDBCPool for pooled plain connections for the end user. JDBCPooledDataSource for PooleConnection objects used by external connection pooling software. JDBCXADataSource for XAConnection objects used by external connection pooling software.

                  Author:
                  Darin DeForest (deforest@users dot sourceforge.net) original version, Fred Toussi (fredt@users dot sourceforge.net)

                  Constructor Summary
                  JDBCDataSourceFactory()
                             
                   
                  Method Summary
                  static DataSource createDataSource(Properties props)
                            Static method to create a JDBCDataSource instance using the given properties for url, user, password, etc.
                   Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment)
                            Creates a DataSource object using the javax.naming.Reference object specified.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  JDBCDataSourceFactory

                  public JDBCDataSourceFactory()
                  Method Detail

                  createDataSource

                  public static DataSource createDataSource(Properties props)
                                                     throws Exception
                  Static method to create a JDBCDataSource instance using the given properties for url, user, password, etc.

                  Throws:
                  Exception

                  getObjectInstance

                  public Object getObjectInstance(Object obj,
                                                  Name name,
                                                  Context nameCtx,
                                                  Hashtable environment)
                                           throws Exception
                  Creates a DataSource object using the javax.naming.Reference object specified.

                  The Reference object's class name should be one of the four supported data source class names and it must support the properties, database, user and password. It may optionally support the logingTimeout property. HyperSQL's JDBCPooledDataSource and JDBCXADataSource object are intended as factories used by a connection pooling DataSource.

                  JDBCDataSource is a factory for normal connections and can be accessed directly by user applications.

                  JDBCPool is a connection pool accessed directly by user applications.

                  Specified by:
                  getObjectInstance in interface ObjectFactory
                  Parameters:
                  obj - The reference information used in creating a Datasource object.
                  name - ignored
                  nameCtx - ignored
                  environment - ignored
                  Returns:
                  A newly created JDBCDataSource object; null if an object cannot be created.
                  Throws:
                  Exception - is thrown if database or user is null or invalid


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCRowId.html0000644000175000017500000005751112007570404023605 0ustar renerene JDBCRowId (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCRowId

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCRowId
                  
                  All Implemented Interfaces:
                  RowId

                  public final class JDBCRowId
                  extends Object
                  implements RowId

                  The representation (mapping) in the Java programming language of an SQL ROWID value. An SQL ROWID is a built-in type, a value of which can be thought of as an address for its identified row in a database table. Whether that address is logical or, in any respects, physical is determined by its originating data source.

                  Methods in the interfaces ResultSet, CallableStatement, and PreparedStatement, such as getRowId and setRowId allow a programmer to access a SQL ROWID value. The RowId interface provides a method for representing the value of the ROWID as a byte array or as a String.

                  The method getRowIdLifetime in the interface DatabaseMetaData, can be used to determine if a RowId object remains valid for the duration of the transaction in which the RowId was created, the duration of the session in which the RowId was created, or, effectively, for as long as its identified row is not deleted. In addition to specifying the duration of its valid lifetime outside its originating data source, getRowIdLifetime specifies the duration of a ROWID value's valid lifetime within its originating data source. In this, it differs from a large object, because there is no limit on the valid lifetime of a large object within its originating data source.

                  All methods on the RowId interface must be fully implemented if the JDBC driver supports the data type.

                  Since:
                  JDK 1.6, HSQLDB 2.0
                  Author:
                  boucherb@users
                  See Also:
                  DatabaseMetaData

                  Constructor Summary
                  JDBCRowId(byte[] id)
                            Constructs a new JDBCRowId instance wrapping the given octet sequence.
                  JDBCRowId(RowId id)
                            Constructs a new JDBCRowId instance whose internal octet sequence is is a copy of the octet sequence of the given RowId object.
                  JDBCRowId(String hex)
                            Constructs a new JDBCRowId instance whose internal octet sequence is is that represented by the given hexidecimal character sequence.
                   
                  Method Summary
                   boolean equals(Object obj)
                            Compares this RowId to the specified object.
                   byte[] getBytes()
                            Returns an array of bytes representing the value of the SQL ROWID designated by this java.sql.RowId object.
                   int hashCode()
                            Returns a hash code value of this RowId object.
                   String toString()
                            Returns a String representing the value of the SQL ROWID designated by this java.sql.RowId object.
                   
                  Methods inherited from class java.lang.Object
                  getClass, notify, notifyAll, wait, wait, wait
                   

                  Constructor Detail

                  JDBCRowId

                  public JDBCRowId(byte[] id)
                            throws SQLException
                  Constructs a new JDBCRowId instance wrapping the given octet sequence.

                  This constructor may be used internally to retrieve result set values as RowId objects, yet it also may need to be public to allow access from other packages. As such (in the interest of efficiency) this object maintains a reference to the given octet sequence rather than making a copy; special care should be taken by extenal clients never to use this constructor with a byte array object that may later be modified extenally.

                  Parameters:
                  id - the octet sequence representing the Rowid value
                  Throws:
                  SQLException - if the argument is null

                  JDBCRowId

                  public JDBCRowId(RowId id)
                            throws SQLException
                  Constructs a new JDBCRowId instance whose internal octet sequence is is a copy of the octet sequence of the given RowId object.

                  Parameters:
                  id - the octet sequence representing the Rowid value
                  Throws:
                  SQLException - if the argument is null

                  JDBCRowId

                  public JDBCRowId(String hex)
                            throws SQLException
                  Constructs a new JDBCRowId instance whose internal octet sequence is is that represented by the given hexidecimal character sequence.

                  Parameters:
                  hex - the hexadecimal character sequence from which to derive the internal octet sequence
                  Throws:
                  SQLException - if the argument is null or is not a valid hexadecimal character sequence
                  Method Detail

                  equals

                  public boolean equals(Object obj)
                  Compares this RowId to the specified object. The result is true if and only if the argument is not null and is a RowId object that represents the same ROWID as this object.

                  It is important to consider both the origin and the valid lifetime of a RowId when comparing it to another RowId. If both are valid, and both are from the same table on the same data source, then if they are equal they identify the same row; if one or more is no longer guaranteed to be valid, or if they originate from different data sources, or different tables on the same data source, they may be equal but still not identify the same row.

                  Specified by:
                  equals in interface RowId
                  Overrides:
                  equals in class Object
                  Parameters:
                  obj - the Object to compare this RowId object against.
                  Returns:
                  true if the RowIds are equal; false otherwise
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getBytes

                  public byte[] getBytes()
                  Returns an array of bytes representing the value of the SQL ROWID designated by this java.sql.RowId object.

                  Specified by:
                  getBytes in interface RowId
                  Returns:
                  an array of bytes, whose length is determined by the driver supplying the connection, representing the value of the ROWID designated by this java.sql.RowId object.

                  toString

                  public String toString()
                  Returns a String representing the value of the SQL ROWID designated by this java.sql.RowId object.

                  Like java.sql.Date.toString() returns the contents of its DATE as the String "2004-03-17" rather than as DATE literal in SQL (which would have been the String DATE "2004-03-17"), toString() returns the contents of its ROWID in a form specific to the driver supplying the connection, and possibly not as a ROWID literal.

                  Specified by:
                  toString in interface RowId
                  Overrides:
                  toString in class Object
                  Returns:
                  a String whose format is determined by the driver supplying the connection, representing the value of the ROWID designated by this java.sql.RowId object.

                  hashCode

                  public int hashCode()
                  Returns a hash code value of this RowId object.

                  Specified by:
                  hashCode in interface RowId
                  Overrides:
                  hashCode in class Object
                  Returns:
                  a hash code for the RowId


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCColumnMetaData.html0000644000175000017500000006237112007570402025415 0ustar renerene JDBCColumnMetaData (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCColumnMetaData

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCColumnMetaData
                  

                  public final class JDBCColumnMetaData
                  extends Object

                  Provides a site for holding the ResultSetMetaData for individual ResultSet columns. In 2.0 it is implemented as a simple data structure derived from calls to JDBCResultSetMetaData methods. purposes.

                  Since:
                  HSQLDB 1.7.2
                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)

                  Field Summary
                   String catalogName
                            The column's table's catalog name.
                   String columnClassName
                            The fully-qualified name of the Java class whose instances are manufactured if the method ResultSet.getObject is called to retrieve a value from the column.
                   int columnDisplaySize
                            The column's normal max width in chars.
                   String columnLabel
                            The suggested column title for use in printouts and displays.
                   String columnName
                            The column's name.
                   int columnType
                            The column's SQL type.
                   boolean isAutoIncrement
                            Whether the value of the column are automatically numbered.
                   boolean isCaseSensitive
                            Whether the column's value's case matters.
                   boolean isCurrency
                            Whether the values in the column are cash values.
                   boolean isDefinitelyWritable
                            Whether a write on the column will definitely succeed.
                   int isNullable
                            The nullability of values in the column.
                   boolean isReadOnly
                            Whether the column's values are definitely not writable.
                   boolean isSearchable
                            Whether the column's values can be used in a where clause.
                   boolean isSigned
                            Whether values in the column are signed numbers.
                   boolean isWritable
                            Whether it is possible for a write on the column to succeed.
                   int precision
                            The column's value's number of decimal digits.
                   int scale
                            The column's value's number of digits to right of the decimal point.
                   String schemaName
                            The column's table's schema.
                   String tableName
                            The column's table's name.
                   
                  Constructor Summary
                  JDBCColumnMetaData()
                             
                   
                  Method Summary
                   String toString()
                            Retrieves a String representation of this object.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
                   

                  Field Detail

                  catalogName

                  public String catalogName
                  The column's table's catalog name.


                  columnClassName

                  public String columnClassName
                  The fully-qualified name of the Java class whose instances are manufactured if the method ResultSet.getObject is called to retrieve a value from the column.


                  columnDisplaySize

                  public int columnDisplaySize
                  The column's normal max width in chars.


                  columnLabel

                  public String columnLabel
                  The suggested column title for use in printouts and displays.


                  columnName

                  public String columnName
                  The column's name.


                  columnType

                  public int columnType
                  The column's SQL type.


                  precision

                  public int precision
                  The column's value's number of decimal digits.


                  scale

                  public int scale
                  The column's value's number of digits to right of the decimal point.


                  schemaName

                  public String schemaName
                  The column's table's schema.


                  tableName

                  public String tableName
                  The column's table's name.


                  isAutoIncrement

                  public boolean isAutoIncrement
                  Whether the value of the column are automatically numbered.


                  isCaseSensitive

                  public boolean isCaseSensitive
                  Whether the column's value's case matters.


                  isCurrency

                  public boolean isCurrency
                  Whether the values in the column are cash values.


                  isDefinitelyWritable

                  public boolean isDefinitelyWritable
                  Whether a write on the column will definitely succeed.


                  isNullable

                  public int isNullable
                  The nullability of values in the column.


                  isReadOnly

                  public boolean isReadOnly
                  Whether the column's values are definitely not writable.


                  isSearchable

                  public boolean isSearchable
                  Whether the column's values can be used in a where clause.


                  isSigned

                  public boolean isSigned
                  Whether values in the column are signed numbers.


                  isWritable

                  public boolean isWritable
                  Whether it is possible for a write on the column to succeed.

                  Constructor Detail

                  JDBCColumnMetaData

                  public JDBCColumnMetaData()
                  Method Detail

                  toString

                  public String toString()
                  Retrieves a String representation of this object.

                  Overrides:
                  toString in class Object
                  Returns:
                  a Sring representation of this object


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCClobFile.html0000644000175000017500000017145212007570402024237 0ustar renerene JDBCClobFile (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCClobFile

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCClobFile
                  
                  All Implemented Interfaces:
                  Clob

                  public class JDBCClobFile
                  extends Object
                  implements Clob

                  HSQLDB-Specific Information:

                  Starting with 2.1, in addition to HSQLDB driver support for both client-side in-memory and remote SQL CLOB data implementations, this class is provided to expose efficient, relatively high-performance CLOB operations over client accessible files.

                  Design Notes

                  Although it is possible to implement a transactional version of this class, the present implementation directly propagates changes to the underlying file such that changes become visible as soon as they are either implicitly or explicitly flushed to disk.

                  Since:
                  HSQLDB 2.1
                  Author:
                  boucherb@users

                  Field Summary
                  static String TEMP_FILE_PREFIX
                             
                  static String TEMP_FILE_SUFFIX
                             
                   
                  Constructor Summary
                  JDBCClobFile()
                            Convenience constructor for JDBCClobFile((String)null).
                  JDBCClobFile(File file)
                            Convenience constructor for JDBCClobFile(file,null).
                  JDBCClobFile(File file, String encoding)
                            Constructs a new JDBCClobFile instance backed by the given File object using the given encoding to read and write file content.
                  JDBCClobFile(String encoding)
                            Constructs a new JDBCClobFile instance backed by an File object created by File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_SUFFIX), using the given encoding to read and write file content.
                   
                  Method Summary
                   void free()
                            This method frees the Clob object and releases the resources the resources that it holds.
                   InputStream getAsciiStream()
                            Retrieves the CLOB value designated by this Clob object as an ascii stream.
                   Reader getCharacterStream()
                            Retrieves the CLOB value designated by this Clob object as a java.io.Reader object (or as a stream of characters).
                   Reader getCharacterStream(long pos, long length)
                            Returns a Reader object that contains a partial Clob value, starting with the character specified by pos, which is length characters in length.
                   String getEncoding()
                             
                   File getFile()
                            Retrieves the canonical File object denoting the file that backs this CLOB.
                   String getSubString(long pos, int length)
                            Retrieves a copy of the specified substring in the CLOB value designated by this Clob object.
                   boolean isDeleteOnFree()
                            Retrieves whether an attempt to delete the backing file is made in response to invocation of free().
                   long length()
                            Retrieves the number of characters in the CLOB value designated by this Clob object.
                   long position(char[] pattern, long start)
                            Retrieves the character position at which the specified char[] pattern appears in the CLOB value represented by this Clob object.
                   long position(Clob pattern, long start)
                            Retrieves the character position at which the specified Clob object searchstr appears in this Clob object.
                   long position(String searchstr, long start)
                            Retrieves the character position at which the specified Clob object searchstr appears in this Clob object.
                   OutputStream setAsciiStream(long pos)
                            Retrieves a stream to be used to write Ascii characters to the CLOB value that this Clob object represents, starting at position pos.
                   Writer setCharacterStream(long pos)
                            Retrieves a stream to be used to write a stream of Unicode characters to the CLOB value that this Clob object represents, at position pos.
                   void setDeleteOnFree(boolean deleteOnFree)
                            Assigns whether an attempt to delete the backing file is made in response to invocation of free().
                   int setString(long pos, String str)
                            Writes the given Java String to the CLOB value that this Clob object designates at the position pos.
                   int setString(long pos, String str, int offset, int len)
                            Writes len characters of str, starting at character offset, to the CLOB value that this Clob represents.
                   void truncate(long len)
                            Truncates the CLOB value that this Clob designates to have a length of len characters.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Field Detail

                  TEMP_FILE_PREFIX

                  public static final String TEMP_FILE_PREFIX
                  See Also:
                  Constant Field Values

                  TEMP_FILE_SUFFIX

                  public static final String TEMP_FILE_SUFFIX
                  See Also:
                  Constant Field Values
                  Constructor Detail

                  JDBCClobFile

                  public JDBCClobFile()
                               throws SQLException
                  Convenience constructor for JDBCClobFile((String)null).

                  Throws:
                  SQLException - if the platform encoding is unsupported, the temp file cannot be created or some other error occurs that prevents the construction of a valid instance of this class.

                  JDBCClobFile

                  public JDBCClobFile(String encoding)
                               throws SQLException
                  Constructs a new JDBCClobFile instance backed by an File object created by File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_SUFFIX), using the given encoding to read and write file content.

                  Parameters:
                  encoding - the name of the character encoding used to read and write character data in the underlying file, as well as to determine the character length of and character offsets into the underlying file. Specify null to denote the platform encoding.
                  Throws:
                  SQLException - if the given encoding is unsupported, the backing temp file could not be created or if a security manager exists and its SecurityManager.checkWrite(java.lang.String) method does not allow a file to be created.

                  JDBCClobFile

                  public JDBCClobFile(File file)
                               throws SQLException
                  Convenience constructor for JDBCClobFile(file,null).

                  Parameters:
                  file - that is to back the new CLOB instance.
                  Throws:
                  SQLException - if an I/O error occurs, which is possible because the construction of the canonical pathname may require file-system queries; a required system property value cannot be accessed; a security manager exists and its SecurityManager.checkRead(java.io.FileDescriptor) method denies read access to the file

                  JDBCClobFile

                  public JDBCClobFile(File file,
                                      String encoding)
                               throws SQLException
                  Constructs a new JDBCClobFile instance backed by the given File object using the given encoding to read and write file content.

                  Parameters:
                  file - that is to back the new CLOB instance.
                  encoding - the name of the character encoding used to read and write character data in the underlying file, as well as to determine the character length of and character offsets into the underlying file. Specify null to denote the platform encoding.
                  Throws:
                  SQLException - if the given encoding is unsupported; an I/O error occurs, which is possible because the construction of the canonical pathname may require file-system queries; a required system property value cannot be accessed; a security manager exists and its SecurityManager.checkRead(java.io.FileDescriptor) method denies read access to the file
                  Method Detail

                  length

                  public long length()
                              throws SQLException
                  Retrieves the number of characters in the CLOB value designated by this Clob object.

                  Specified by:
                  length in interface Clob
                  Returns:
                  length of the CLOB in characters
                  Throws:
                  SQLException - if there is an error accessing the length of the CLOB value
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getSubString

                  public String getSubString(long pos,
                                             int length)
                                      throws SQLException
                  Retrieves a copy of the specified substring in the CLOB value designated by this Clob object. The substring begins at position pos and has up to length consecutive characters.

                  Specified by:
                  getSubString in interface Clob
                  Parameters:
                  pos - the first character of the substring to be extracted. The first character is at position 1.
                  length - the number of consecutive characters to be copied; the value for length must be 0 or greater
                  Returns:
                  a String that is the specified substring in the CLOB value designated by this Clob object
                  Throws:
                  SQLException - if there is an error accessing the CLOB value; if pos is less than 1 or length is less than 0
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getCharacterStream

                  public Reader getCharacterStream()
                                            throws SQLException
                  Retrieves the CLOB value designated by this Clob object as a java.io.Reader object (or as a stream of characters).

                  Specified by:
                  getCharacterStream in interface Clob
                  Returns:
                  a java.io.Reader object containing the CLOB data
                  Throws:
                  SQLException - if there is an error accessing the CLOB value
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2
                  See Also:
                  setCharacterStream(long)

                  getAsciiStream

                  public InputStream getAsciiStream()
                                             throws SQLException
                  Retrieves the CLOB value designated by this Clob object as an ascii stream.

                  Specified by:
                  getAsciiStream in interface Clob
                  Returns:
                  a java.io.InputStream object containing the CLOB data
                  Throws:
                  SQLException - if there is an error accessing the CLOB value
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2
                  See Also:
                  setAsciiStream(long)

                  position

                  public long position(char[] pattern,
                                       long start)
                                throws SQLException
                  Retrieves the character position at which the specified char[] pattern appears in the CLOB value represented by this Clob object. The search begins at position start.

                  Parameters:
                  pattern - the substring for which to search
                  start - the position at which to begin searching; the first position is 1
                  Returns:
                  the position at which the substring appears or -1 if it is not present; the first position is 1
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method

                  position

                  public long position(String searchstr,
                                       long start)
                                throws SQLException
                  Retrieves the character position at which the specified Clob object searchstr appears in this Clob object. The search begins at position start.

                  Specified by:
                  position in interface Clob
                  Parameters:
                  searchstr - the Clob object for which to search
                  start - the position at which to begin searching; the first position is 1
                  Returns:
                  the position at which the Clob object appears or -1 if it is not present; the first position is 1
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if start is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  position

                  public long position(Clob pattern,
                                       long start)
                                throws SQLException
                  Retrieves the character position at which the specified Clob object searchstr appears in this Clob object. The search begins at position start.

                  Specified by:
                  position in interface Clob
                  Parameters:
                  pattern - the Clob object for which to search
                  start - the position at which to begin searching; the first position is 1
                  Returns:
                  the position at which the Clob object appears or -1 if it is not present; the first position is 1
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if start is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  setString

                  public int setString(long pos,
                                       String str)
                                throws SQLException
                  Writes the given Java String to the CLOB value that this Clob object designates at the position pos. The string will overwrite the existing characters in the Clob object starting at the position pos. If the end of the Clob value is reached while writing the given string, then the length of the Clob value will be increased to accommodate the extra characters.

                  Note: If the value specified for pos is greater then the length+1 of the CLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  Specified by:
                  setString in interface Clob
                  Parameters:
                  pos - the position at which to start writing to the CLOB value that this Clob object represents; The first position is 1
                  str - the string to be written to the CLOB value that this Clob designates
                  Returns:
                  the number of characters written
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4

                  setString

                  public int setString(long pos,
                                       String str,
                                       int offset,
                                       int len)
                                throws SQLException
                  Writes len characters of str, starting at character offset, to the CLOB value that this Clob represents. The string will overwrite the existing characters in the Clob object starting at the position pos. If the end of the Clob value is reached while writing the given string, then the length of the Clob value will be increased to accommodate the extra characters.

                  Note: If the value specified for pos is greater then the length+1 of the CLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  Specified by:
                  setString in interface Clob
                  Parameters:
                  pos - the position at which to start writing to this CLOB object; The first position is 1
                  str - the string to be written to the CLOB value that this Clob object represents
                  offset - the offset into str to start reading the characters to be written
                  len - the number of characters to be written
                  Returns:
                  the number of characters written
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4

                  setAsciiStream

                  public OutputStream setAsciiStream(long pos)
                                              throws SQLException
                  Retrieves a stream to be used to write Ascii characters to the CLOB value that this Clob object represents, starting at position pos. Characters written to the stream will overwrite the existing characters in the Clob object starting at the position pos. If the end of the Clob value is reached while writing characters to the stream, then the length of the Clob value will be increased to accommodate the extra characters.

                  Note: If the value specified for pos is greater then the length+1 of the CLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  Specified by:
                  setAsciiStream in interface Clob
                  Parameters:
                  pos - the position at which to start writing to this CLOB object; The first position is 1
                  Returns:
                  the stream to which ASCII encoded characters can be written
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4
                  See Also:
                  getAsciiStream()

                  setCharacterStream

                  public Writer setCharacterStream(long pos)
                                            throws SQLException
                  Retrieves a stream to be used to write a stream of Unicode characters to the CLOB value that this Clob object represents, at position pos. Characters written to the stream will overwrite the existing characters in the Clob object starting at the position pos. If the end of the Clob value is reached while writing characters to the stream, then the length of the Clob value will be increased to accommodate the extra characters.

                  Note: If the value specified for pos is greater then the length+1 of the CLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  Specified by:
                  setCharacterStream in interface Clob
                  Parameters:
                  pos - the position at which to start writing to the CLOB value; The first position is 1
                  Returns:
                  a stream to which Unicode encoded characters can be written
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4
                  See Also:
                  getCharacterStream()

                  truncate

                  public void truncate(long len)
                                throws SQLException
                  Truncates the CLOB value that this Clob designates to have a length of len characters.

                  Note: If the value specified for pos is greater then the length+1 of the CLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  Specified by:
                  truncate in interface Clob
                  Parameters:
                  len - the length, in characters, to which the CLOB value should be truncated
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if len is less than 0
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4

                  free

                  public void free()
                            throws SQLException
                  This method frees the Clob object and releases the resources the resources that it holds. The object is invalid once the free method is called.

                  After free has been called, any attempt to invoke a method other than free will result in a SQLException being thrown. If free is called multiple times, the subsequent calls to free are treated as a no-op.

                  Specified by:
                  free in interface Clob
                  Throws:
                  SQLException - if an error occurs releasing the Clob's resources
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4

                  getCharacterStream

                  public Reader getCharacterStream(long pos,
                                                   long length)
                                            throws SQLException
                  Returns a Reader object that contains a partial Clob value, starting with the character specified by pos, which is length characters in length.

                  Specified by:
                  getCharacterStream in interface Clob
                  Parameters:
                  pos - the offset to the first character of the partial value to be retrieved. The first character in the Clob is at position 1.
                  length - the length in characters of the partial value to be retrieved.
                  Returns:
                  Reader through which the partial Clob value can be read.
                  Throws:
                  SQLException - if pos is less than 1 or if pos is greater than the number of characters in the Clob or if pos + length is greater than the number of characters in the Clob
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  getFile

                  public File getFile()
                  Retrieves the canonical File object denoting the file that backs this CLOB.

                  Returns:
                  the file that backs this CLOB.

                  getEncoding

                  public String getEncoding()
                  Returns:
                  the name of the character encoding used to read and write character data in the underlying files, as well as to determine the character length and character offsets into the underlying file

                  isDeleteOnFree

                  public boolean isDeleteOnFree()
                  Retrieves whether an attempt to delete the backing file is made in response to invocation of free().

                  Returns:
                  true if backing file deletion is attempted; otherwise false.

                  setDeleteOnFree

                  public void setDeleteOnFree(boolean deleteOnFree)
                  Assigns whether an attempt to delete the backing file is made in response to invocation of free().

                  Parameters:
                  deleteOnFree - the new value to assign


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/package-use.html0000644000175000017500000002070512007570404024316 0ustar renerene Uses of Package org.hsqldb.jdbc (HSQLDB 2.2.9 API)

                  Uses of Package
                  org.hsqldb.jdbc

                  Packages that use org.hsqldb.jdbc
                  org.hsqldb.jdbc Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support. 
                   

                  Classes in org.hsqldb.jdbc used by org.hsqldb.jdbc
                  JDBCClob
                            The mapping in the JavaTM programming language for the SQL CLOB type.
                  JDBCCommonDataSource
                            Common base for DataSource implementations.
                  JDBCConnection
                             
                  JDBCConnectionEventListener
                             
                  JDBCDriver
                            Provides the java.sql.Driver interface implementation required by the JDBC specification.
                  JDBCPreparedStatement
                            An object that represents a precompiled SQL statement.
                  JDBCResultSet
                            A table of data representing a database result set, which is usually generated by executing a statement that queries the database.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCPreparedStatement.html0000644000175000017500000106437212007570404026214 0ustar renerene JDBCPreparedStatement (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCPreparedStatement

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCPreparedStatement
                  
                  All Implemented Interfaces:
                  PreparedStatement, Statement, Wrapper
                  Direct Known Subclasses:
                  JDBCCallableStatement

                  public class JDBCPreparedStatement
                  extends Object
                  implements PreparedStatement

                  An object that represents a precompiled SQL statement.

                  A SQL statement is precompiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.

                  Note: The setter methods (setShort, setString, and so on) for setting IN parameter values must specify types that are compatible with the defined SQL type of the input parameter. For instance, if the IN parameter has SQL type INTEGER, then the method setInt should be used.

                  If arbitrary parameter type conversions are required, the method setObject should be used with a target SQL type.

                  In the following example of setting a parameter, con represents an active connection:

                     PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                                       SET SALARY = ? WHERE ID = ?");
                     pstmt.setBigDecimal(1, 153833.00)
                     pstmt.setInt(2, 110592)
                   

                  HSQLDB-Specific Information:

                  From version 2.0, the implementation meets the JDBC specification requirment that any existing ResultSet is closed when execute() or executeQuery() methods are called.

                  JDBCPreparedStatement objects are backed by a true compiled parameteric representation. Hence, there are now significant performance gains to be had by using a JDBCPreparedStatement object in preference to a JDBCStatement object when a short-running SQL statement is to be executed more than once.

                  When it can be otherwise avoided, it should be considered poor practice to fully prepare (construct), parameterize, execute, fetch and close a JDBCParameterMetaData object for each execution cycle. Indeed, because the prepare and execute phases both represent a round-trip to the engine, this practice is likely to be noticably less performant for short-running statements (and possibly even orders of magnitude less performant over network connections for short-running statements) than the equivalent process using JDBCStatement objects, albeit far more convenient, less error prone and certainly much less resource-intensive, especially when large binary and character values are involved, due to the optimized parameterization facility.

                  Instead, when developing an application that is not totally oriented toward the execution of ad hoc SQL, it is recommended to expend some effort toward identifing the SQL statements that are good candidates for regular reuse and adapting the structure of the application accordingly. Often, this is done by recording the text of candidate SQL statements in an application resource object (which has the nice side-benefit of isolating and hiding differences in SQL dialects across different drivers) and caching for possible reuse the PreparedStatement objects derived from the recorded text.

                  Starting with 2.0, when built under a JDBC 4 environment, statement caching can be transparently enabled or disabled on a statement-by-statement basis by invoking setPoolable(true | false), respectively, upon Statement objects of interest.

                  Multi thread use:

                  A PreparedStatement object is stateful and should not normally be shared by multiple threads. If it has to be shared, the calls to set the parameters, calls to add batch statements, the execute call and any post-execute calls should be made within a block synchronized on the PreparedStatement Object.

                  JRE 1.1.x Notes:

                  In general, JDBC 2 support requires Java 1.2 and above, and JDBC3 requires Java 1.4 and above. In HSQLDB, support for methods introduced in different versions of JDBC depends on the JDK version used for compiling and building HSQLDB.

                  Since 1.7.0, all JDBC 2 methods can be called while executing under the version 1.1.x Java Runtime EnvironmentTM. However, in addition to this technique requiring explicit casts to the org.hsqldb.jdbc.* classes, some of these method calls require int values that are defined only in the JDBC 2 or greater version of the ResultSet interface. For this reason these values are defined in JDBCResultSet.

                  In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the JDBC2-only ResultSet values can be achieved by referring to them in parameter specifications and return value comparisons, respectively, as follows:

                   JDBCResultSet.FETCH_FORWARD
                   JDBCResultSet.TYPE_FORWARD_ONLY
                   JDBCResultSet.TYPE_SCROLL_INSENSITIVE
                   JDBCResultSet.CONCUR_READ_ONLY
                   //etc.
                   

                  However, please note that code written to use HSQLDB JDBC 2 features under JDK 1.1.x will not be compatible for use with other JDBC 2 drivers. Please also note that this feature is offered solely as a convenience to developers who must work under JDK 1.1.x due to operating constraints, yet wish to use some of the more advanced features available under the JDBC 2 specification.

                  (fredt@users)
                  (boucherb@users)

                  Since:
                  1.7.2
                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)
                  See Also:
                  JDBCConnection.prepareStatement(java.lang.String), JDBCResultSet

                  Field Summary
                   
                  Fields inherited from interface java.sql.Statement
                  CLOSE_ALL_RESULTS, CLOSE_CURRENT_RESULT, EXECUTE_FAILED, KEEP_CURRENT_RESULT, NO_GENERATED_KEYS, RETURN_GENERATED_KEYS, SUCCESS_NO_INFO
                   
                  Method Summary
                   void addBatch()
                            Adds a set of parameters to this PreparedStatement object's batch of commands.
                   void addBatch(String sql)
                            This method should always throw if called for a PreparedStatement or CallableStatment.
                   void cancel()
                            Cancels this Statement object if both the DBMS and driver support aborting an SQL statement.
                   void clearBatch()
                            Empties this Statement object's current list of SQL commands.
                   void clearParameters()
                            Clears the current parameter values immediately.
                   void clearWarnings()
                            Clears all the warnings reported on this Statement object.
                   void close()
                            Does the specialized work required to free this object's resources and that of it's parent class.
                   void closeOnCompletion()
                            Specifies that this Statement will be closed when all its dependent result sets are closed.
                   boolean execute()
                            Executes the SQL statement in this PreparedStatement object, which may be any kind of SQL statement.
                   boolean execute(String sql)
                            This method should always throw if called for a PreparedStatement or CallableStatment.
                   boolean execute(String sql, int autoGeneratedKeys)
                             
                   boolean execute(String sql, int[] columnIndexes)
                             
                   boolean execute(String sql, String[] columnNames)
                             
                   int[] executeBatch()
                            Submits a batch of commands to the database for execution and if all commands execute successfully, returns an array of update counts.
                   ResultSet executeQuery()
                            Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query.
                   ResultSet executeQuery(String sql)
                            This method should always throw if called for a PreparedStatement or CallableStatment.
                   int executeUpdate()
                            Executes the SQL statement in this PreparedStatement object, (JDBC4 clarification:) which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement.
                   int executeUpdate(String sql)
                            This method should always throw if called for a PreparedStatement or CallableStatment.
                   int executeUpdate(String sql, int autoGeneratedKeys)
                            Statement methods that must be overridden in this class and throw an exception.
                   int executeUpdate(String sql, int[] columnIndexes)
                             
                   int executeUpdate(String sql, String[] columnNames)
                             
                   Connection getConnection()
                            Retrieves the Connection object that produced this Statement object.
                   int getFetchDirection()
                            Retrieves the direction for fetching rows from database tables that is the default for result sets generated from this Statement object.
                   int getFetchSize()
                            Retrieves the number of result set rows that is the default fetch size for ResultSet objects generated from this Statement object.
                   ResultSet getGeneratedKeys()
                            Retrieves any auto-generated keys created as a result of executing this Statement object.
                   int getMaxFieldSize()
                            Retrieves the maximum number of bytes that can be returned for character and binary column values in a ResultSet object produced by this Statement object.
                   int getMaxRows()
                            Retrieves the maximum number of rows that a ResultSet object produced by this Statement object can contain.
                   ResultSetMetaData getMetaData()
                            Retrieves a ResultSetMetaData object that contains information about the columns of the ResultSet object that will be returned when this PreparedStatement object is executed.
                   boolean getMoreResults()
                            Moves to this Statement object's next result, returns true if it is a ResultSet object, and implicitly closes any current ResultSet object(s) obtained with the method getResultSet.
                   boolean getMoreResults(int current)
                            Moves to this Statement object's next result, deals with any current ResultSet object(s) according to the instructions specified by the given flag, and returns true if the next result is a ResultSet object.
                   ParameterMetaData getParameterMetaData()
                            Retrieves the number, types and properties of this PreparedStatement object's parameters.
                   int getQueryTimeout()
                            Retrieves the number of seconds the driver will wait for a Statement object to execute.
                   ResultSet getResultSet()
                            Retrieves the current result as a ResultSet object.
                   int getResultSetConcurrency()
                            Retrieves the result set concurrency for ResultSet objects generated by this Statement object.
                   int getResultSetHoldability()
                            Retrieves the result set holdability for ResultSet objects generated by this Statement object.
                   int getResultSetType()
                            Retrieves the result set type for ResultSet objects generated by this Statement object.
                   int getUpdateCount()
                            Retrieves the current result as an update count; if the result is a ResultSet object or there are no more results, -1 is returned.
                   SQLWarning getWarnings()
                            Retrieves the first warning reported by calls on this Statement object.
                   boolean isClosed()
                            Retrieves whether this Statement object has been closed.
                   boolean isCloseOnCompletion()
                            Returns a value indicating whether this Statement will be closed when all its dependent result sets are closed.
                   boolean isPoolable()
                            Returns a value indicating whether the Statement is poolable or not.
                   boolean isWrapperFor(Class<?> iface)
                            Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                   void setArray(int parameterIndex, Array x)
                            Sets the designated parameter to the given java.sql.Array object.
                   void setAsciiStream(int parameterIndex, InputStream x)
                            Sets the designated parameter to the given input stream.
                   void setAsciiStream(int parameterIndex, InputStream x, int length)
                            Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                   void setAsciiStream(int parameterIndex, InputStream x, long length)
                            Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                   void setBigDecimal(int parameterIndex, BigDecimal x)
                            Sets the designated parameter to the given java.math.BigDecimal value.
                   void setBinaryStream(int parameterIndex, InputStream x)
                            Sets the designated parameter to the given input stream.
                   void setBinaryStream(int parameterIndex, InputStream x, int length)
                            Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                   void setBinaryStream(int parameterIndex, InputStream x, long length)
                            Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                   void setBlob(int parameterIndex, Blob x)
                            Sets the designated parameter to the given java.sql.Blob object.
                   void setBlob(int parameterIndex, InputStream inputStream)
                            Sets the designated parameter to a InputStream object.
                   void setBlob(int parameterIndex, InputStream inputStream, long length)
                            Sets the designated parameter to a InputStream object.
                   void setBoolean(int parameterIndex, boolean x)
                            Sets the designated parameter to the given Java boolean value.
                   void setByte(int parameterIndex, byte x)
                            Sets the designated parameter to the given Java byte value.
                   void setBytes(int parameterIndex, byte[] x)
                            Sets the designated parameter to the given Java array of bytes.
                   void setCharacterStream(int parameterIndex, Reader reader)
                            Sets the designated parameter to the given Reader object.
                   void setCharacterStream(int parameterIndex, Reader reader, int length)
                            Sets the designated parameter to the given Reader object, which is the given number of characters long.
                   void setCharacterStream(int parameterIndex, Reader reader, long length)
                            Sets the designated parameter to the given Reader object, which is the given number of characters long.
                   void setClob(int parameterIndex, Clob x)
                            Sets the designated parameter to the given java.sql.Clob object.
                   void setClob(int parameterIndex, Reader reader)
                            Sets the designated parameter to a Reader object.
                   void setClob(int parameterIndex, Reader reader, long length)
                            Sets the designated parameter to a Reader object.
                   void setCursorName(String name)
                            Sets the SQL cursor name to the given String, which will be used by subsequent Statement object execute methods.
                   void setDate(int parameterIndex, Date x)
                            (JDBC4 clarification:) Sets the designated parameter to the given java.sql.Date value using the default time zone of the virtual machine that is running the application.
                   void setDate(int parameterIndex, Date x, Calendar cal)
                            Sets the designated parameter to the given java.sql.Date value, using the given Calendar object.
                   void setDouble(int parameterIndex, double x)
                            Sets the designated parameter to the given Java double value.
                   void setEscapeProcessing(boolean enable)
                            Sets escape processing on or off.
                   void setFetchDirection(int direction)
                            Gives the driver a hint as to the direction in which rows will be processed in ResultSet objects created using this Statement object.
                   void setFetchSize(int rows)
                            (JDBC4 clarification:) Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for ResultSet objects genrated by this Statement.
                   void setFloat(int parameterIndex, float x)
                            Sets the designated parameter to the given Java float value.
                   void setInt(int parameterIndex, int x)
                            Sets the designated parameter to the given Java int value.
                   void setLong(int parameterIndex, long x)
                            Sets the designated parameter to the given Java long value.
                   void setMaxFieldSize(int max)
                            (JDBC4 clarification:) Sets the limit for the maximum number of bytes in a ResultSet Sets the limit for the maximum number of bytes that can be returned for character and binary column values in a ResultSet object produced by this Statement object.
                   void setMaxRows(int max)
                            (JDBC4 clarification:) Sets the limit for the maximum number of rows that any ResultSet object generated by this Statement object can contain to the given number.
                   void setNCharacterStream(int parameterIndex, Reader value)
                            Sets the designated parameter to a Reader object.
                   void setNCharacterStream(int parameterIndex, Reader value, long length)
                            Sets the designated parameter to a Reader object.
                   void setNClob(int parameterIndex, NClob value)
                            Sets the designated parameter to a java.sql.NClob object.
                   void setNClob(int parameterIndex, Reader reader)
                            Sets the designated parameter to a Reader object.
                   void setNClob(int parameterIndex, Reader reader, long length)
                            Sets the designated parameter to a Reader object.
                   void setNString(int parameterIndex, String value)
                            Sets the designated paramter to the given String object.
                   void setNull(int parameterIndex, int sqlType)
                            Sets the designated parameter to SQL NULL.
                   void setNull(int parameterIndex, int sqlType, String typeName)
                            Sets the designated parameter to SQL NULL.
                   void setObject(int parameterIndex, Object x)
                             
                   void setObject(int parameterIndex, Object x, int targetSqlType)
                            Sets the value of the designated parameter with the given object.
                   void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength)
                            Sets the value of the designated parameter with the given object.
                   void setPoolable(boolean poolable)
                            Requests that a Statement be pooled or not pooled.
                   void setQueryTimeout(int seconds)
                            Sets the number of seconds the driver will wait for a Statement object to execute to the given number of seconds.
                   void setRef(int parameterIndex, Ref x)
                            Sets the designated parameter to the given REF(<structured-type>) value.
                   void setRowId(int parameterIndex, RowId x)
                            Sets the designated parameter to the given java.sql.RowId object.
                   void setShort(int parameterIndex, short x)
                            Sets the designated parameter to the given Java short value.
                   void setSQLXML(int parameterIndex, SQLXML xmlObject)
                            Sets the designated parameter to the given java.sql.SQLXML object.
                   void setString(int parameterIndex, String x)
                            Sets the designated parameter to the given Java String value.
                   void setTime(int parameterIndex, Time x)
                            Sets the designated parameter to the given java.sql.Time value.
                   void setTime(int parameterIndex, Time x, Calendar cal)
                            Sets the designated parameter to the given java.sql.Time value, using the given Calendar object.
                   void setTimestamp(int parameterIndex, Timestamp x)
                            Sets the designated parameter to the given java.sql.Timestamp value.
                   void setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
                            Sets the designated parameter to the given java.sql.Timestamp value, using the given Calendar object.
                   void setUnicodeStream(int parameterIndex, InputStream x, int length)
                            Deprecated. Sun does not include a reason, but presumably this is because setCharacterStream is now prefered
                   void setURL(int parameterIndex, URL x)
                            Sets the designated parameter to the given java.net.URL value.
                   String toString()
                            Retrieves a String representation of this object.
                  <T> T
                  unwrap(Class<T> iface)
                            Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
                   

                  Method Detail

                  executeQuery

                  public ResultSet executeQuery()
                                         throws SQLException
                  Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query.

                  Specified by:
                  executeQuery in interface PreparedStatement
                  Returns:
                  a ResultSet object that contains the data produced by the query; never null
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed PreparedStatement or the SQL statement does not return a ResultSet object

                  executeUpdate

                  public int executeUpdate()
                                    throws SQLException
                  Executes the SQL statement in this PreparedStatement object, (JDBC4 clarification:) which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement.

                  Specified by:
                  executeUpdate in interface PreparedStatement
                  Returns:
                  (JDBC4 clarification:) either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed PreparedStatement or the SQL statement returns a ResultSet object

                  setNull

                  public void setNull(int parameterIndex,
                                      int sqlType)
                               throws SQLException
                  Sets the designated parameter to SQL NULL.

                  Note: You must specify the parameter's SQL type.

                  HSQLDB-Specific Information:

                  HSQLDB currently ignores the sqlType argument.

                  Specified by:
                  setNull in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  sqlType - the SQL type code defined in java.sql.Types
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if sqlType is a ARRAY, BLOB, CLOB, DATALINK, JAVA_OBJECT, NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, REF, ROWID, SQLXML or STRUCT data type and the JDBC driver does not support this data type

                  setBoolean

                  public void setBoolean(int parameterIndex,
                                         boolean x)
                                  throws SQLException
                  Sets the designated parameter to the given Java boolean value. The driver converts this (JDBC4 Modified:) to an SQL BIT or BOOLEAN value when it sends it to the database.

                  HSQLDB-Specific Information:

                  HSQLDB supports BOOLEAN type for boolean values. This method can also be used to set the value of a parameter of the SQL type BIT(1), which is a bit string consisting of a 0 or 1.

                  Specified by:
                  setBoolean in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setByte

                  public void setByte(int parameterIndex,
                                      byte x)
                               throws SQLException
                  Sets the designated parameter to the given Java byte value. The driver converts this to an SQL TINYINT value when it sends it to the database.

                  Specified by:
                  setByte in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setShort

                  public void setShort(int parameterIndex,
                                       short x)
                                throws SQLException
                  Sets the designated parameter to the given Java short value. The driver converts this to an SQL SMALLINT value when it sends it to the database.

                  Specified by:
                  setShort in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setInt

                  public void setInt(int parameterIndex,
                                     int x)
                              throws SQLException
                  Sets the designated parameter to the given Java int value. The driver converts this to an SQL INTEGER value when it sends it to the database.

                  Specified by:
                  setInt in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setLong

                  public void setLong(int parameterIndex,
                                      long x)
                               throws SQLException
                  Sets the designated parameter to the given Java long value. The driver converts this to an SQL BIGINT value when it sends it to the database.

                  Specified by:
                  setLong in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setFloat

                  public void setFloat(int parameterIndex,
                                       float x)
                                throws SQLException
                  Sets the designated parameter to the given Java float value. The driver converts this (JDBC4 correction:) to an SQL REAL value when it sends it to the database.

                  HSQLDB-Specific Information:

                  Since 1.7.1, HSQLDB handles Java positive/negative Infinity and NaN float values consistent with the Java Language Specification; these special values are now correctly stored to and retrieved from the database.

                  Specified by:
                  setFloat in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setDouble

                  public void setDouble(int parameterIndex,
                                        double x)
                                 throws SQLException
                  Sets the designated parameter to the given Java double value. The driver converts this to an SQL DOUBLE value when it sends it to the database.

                  HSQLDB-Specific Information:

                  Since 1.7.1, HSQLDB handles Java positive/negative Infinity and NaN double values consistent with the Java Language Specification; these special values are now correctly stored to and retrieved from the database.

                  Specified by:
                  setDouble in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setBigDecimal

                  public void setBigDecimal(int parameterIndex,
                                            BigDecimal x)
                                     throws SQLException
                  Sets the designated parameter to the given java.math.BigDecimal value. The driver converts this to an SQL NUMERIC value when it sends it to the database.

                  Specified by:
                  setBigDecimal in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setString

                  public void setString(int parameterIndex,
                                        String x)
                                 throws SQLException
                  Sets the designated parameter to the given Java String value. The driver converts this to an SQL VARCHAR or LONGVARCHAR value (depending on the argument's size relative to the driver's limits on VARCHAR values) when it sends it to the database.

                  HSQLDB-Specific Information:

                  Including 2.0, HSQLDB represents all XXXCHAR values internally as java.lang.String objects; there is no appreciable difference between CHAR, VARCHAR and LONGVARCHAR.

                  Specified by:
                  setString in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setBytes

                  public void setBytes(int parameterIndex,
                                       byte[] x)
                                throws SQLException
                  Sets the designated parameter to the given Java array of bytes. The driver converts this to an SQL VARBINARY or LONGVARBINARY (depending on the argument's size relative to the driver's limits on VARBINARY values) when it sends it to the database.

                  HSQLDB-Specific Information:

                  Including 2.0, HSQLDB represents all XXXBINARY values the same way internally; there is no appreciable difference between BINARY, VARBINARY and LONGVARBINARY as far as JDBC is concerned.

                  Specified by:
                  setBytes in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setDate

                  public void setDate(int parameterIndex,
                                      Date x)
                               throws SQLException
                  (JDBC4 clarification:) Sets the designated parameter to the given java.sql.Date value using the default time zone of the virtual machine that is running the application. The driver converts this to an SQL DATE value when it sends it to the database.

                  HSQLDB-Specific Information:

                  When a setXXX method is used to set a parameter of type TIMESTAMP WITH TIME ZONE or TIME WITH TIME ZONE the time zone of the client application is used as time zone

                  Specified by:
                  setDate in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setTime

                  public void setTime(int parameterIndex,
                                      Time x)
                               throws SQLException
                  Sets the designated parameter to the given java.sql.Time value. The driver converts this to an SQL TIME value when it sends it to the database.

                  HSQLDB-Specific Information:

                  When a setXXX method is used to set a parameter of type TIMESTAMP WITH TIME ZONE or TIME WITH TIME ZONE the time zone of the client application is used as time zone

                  Specified by:
                  setTime in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setTimestamp

                  public void setTimestamp(int parameterIndex,
                                           Timestamp x)
                                    throws SQLException
                  Sets the designated parameter to the given java.sql.Timestamp value. The driver converts this to an SQL TIMESTAMP value when it sends it to the database.

                  HSQLDB-Specific Information:

                  When a setXXX method is used to set a parameter of type TIMESTAMP WITH TIME ZONE or TIME WITH TIME ZONE the time zone of the client application is used as time zone.

                  When this method is used to set a parameter of type TIME or TIME WITH TIME ZONE, then the nanosecond value of the Timestamp object will be used if the TIME parameter accpets fractional seconds.

                  Specified by:
                  setTimestamp in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setAsciiStream

                  public void setAsciiStream(int parameterIndex,
                                             InputStream x,
                                             int length)
                                      throws SQLException
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes. When a very large ASCII value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.InputStream. Data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from ASCII to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  HSQLDB-Specific Information:

                  From HSQLDB 2.0 this method uses the US-ASCII character encoding to convert bytes from the stream into the characters of a String.

                  This method does not use streaming to send the data, whether the target is a CLOB or other binary object.

                  For long streams (larger than a few megabytes) with CLOB targets, it is more efficient to use a version of setCharacterStream which takes the a length parameter.

                  Specified by:
                  setAsciiStream in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the Java input stream that contains the ASCII parameter value
                  length - the number of bytes in the stream
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setUnicodeStream

                  public void setUnicodeStream(int parameterIndex,
                                               InputStream x,
                                               int length)
                                        throws SQLException
                  Deprecated. Sun does not include a reason, but presumably this is because setCharacterStream is now prefered

                  Sets the designated parameter to the given input stream, which will have the specified number of bytes. (JDBC4 deleted:) [A Unicode character has two bytes, with the first byte being the high byte, and the second being the low byte.]

                  When a very large Unicode value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.InputStream object. The data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from Unicode to the database char format. (JDBC4 added:) The byte format of the Unicode stream must be a Java UTF-8, as defined in the Java Virtual Machine Specification.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  HSQLDB-Specific Information:

                  From 1.7.0 to 1.8.0.x, this method complies with behavior as defined by the JDBC3 specification (the stream is treated as though it has UTF16 encoding).

                  Starting with 2.0, this method behaves according to the JDBC4 specification (the stream is treated as though it has UTF-8 encoding, as defined in the Java Virtual Machine Specification) when built under JDK 1.6+; otherwise, it behaves as defined by the JDBC3 specification. Regardless, this method is deprecated: please use setCharacterStream(...) instead.

                  Specified by:
                  setUnicodeStream in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - a java.io.InputStream object that contains the Unicode parameter value (JDBC4 deleted:) [as two-byte Unicode characters]
                  length - the number of bytes in the stream
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method

                  setBinaryStream

                  public void setBinaryStream(int parameterIndex,
                                              InputStream x,
                                              int length)
                                       throws SQLException
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes. When a very large binary value is input to a LONGVARBINARY parameter, it may be more practical to send it via a java.io.InputStream object. The data will be read from the stream as needed until end-of-file is reached.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  HSQLDB-Specific Information:

                  Since 1.7.2, this method works according to the standard.

                  Specified by:
                  setBinaryStream in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the java input stream which contains the binary parameter value
                  length - the number of bytes in the stream
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  clearParameters

                  public void clearParameters()
                                       throws SQLException
                  Clears the current parameter values immediately.

                  In general, parameter values remain in force for repeated use of a statement. Setting a parameter value automatically clears its previous value. However, in some cases it is useful to immediately release the resources used by the current parameter values; this can be done by calling the method clearParameters.

                  Specified by:
                  clearParameters in interface PreparedStatement
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement

                  setObject

                  public void setObject(int parameterIndex,
                                        Object x,
                                        int targetSqlType,
                                        int scaleOrLength)
                                 throws SQLException

                  Sets the value of the designated parameter with the given object. The second argument must be an object type; for integral values, the java.lang equivalent objects should be used. If the second argument is an InputStream then the stream must contain the number of bytes specified by scaleOrLength. If the second argument is a Reader then the reader must contain the number of characters specified by scaleOrLength. If these conditions are not true the driver will generate a SQLException when the prepared statement is executed.

                  The given Java object will be converted to the given targetSqlType before being sent to the database. If the object has a custom mapping (is of a class implementing the interface SQLData), the JDBC driver should call the method SQLData.writeSQL to write it to the SQL data stream. If, on the other hand, the object is of a class implementing Ref, Blob, Clob, NClob, Struct, java.net.URL, or Array, the driver should pass it to the database as a value of the corresponding SQL type.

                  Note that this method may be used to pass database-specific abstract data types.

                  Specified by:
                  setObject in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the object containing the input parameter value
                  targetSqlType - the SQL type (as defined in java.sql.Types) to be sent to the database. The scale argument may further qualify this type.
                  scaleOrLength - for java.sql.Types.DECIMAL or java.sql.Types.NUMERIC types, this is the number of digits after the decimal point. For Java Object types InputStream and Reader, this is the length of the data in the stream or reader. For all other types, this value will be ignored.
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed PreparedStatement or if the Java Object specified by x is an InputStream or Reader object and the value of the scale parameter is less than zero
                  SQLFeatureNotSupportedException - if targetSqlType is a ARRAY, BLOB, CLOB, DATALINK, JAVA_OBJECT, NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, REF, ROWID, SQLXML or STRUCT data type and the JDBC driver does not support this data type
                  See Also:
                  Types

                  setObject

                  public void setObject(int parameterIndex,
                                        Object x,
                                        int targetSqlType)
                                 throws SQLException
                  Sets the value of the designated parameter with the given object. This method is like the method setObject above, except that it assumes a scale of zero.

                  HSQLDB-Specific Information:

                  Since 1.7.2, this method supports conversions listed in the conversion table B-5 of the JDBC 3 specification.

                  Specified by:
                  setObject in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the object containing the input parameter value
                  targetSqlType - the SQL type (as defined in java.sql.Types) to be sent to the database
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if targetSqlType is a ARRAY, BLOB, CLOB, DATALINK, JAVA_OBJECT, NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, REF, ROWID, SQLXML or STRUCT data type and the JDBC driver does not support this data type
                  See Also:
                  setObject(int,Object)

                  setObject

                  public void setObject(int parameterIndex,
                                        Object x)
                                 throws SQLException

                  Sets the value of the designated parameter using the given object. The second parameter must be of type Object; therefore, the java.lang equivalent objects should be used for built-in types.

                  The JDBC specification specifies a standard mapping from Java Object types to SQL types. The given argument will be converted to the corresponding SQL type before being sent to the database.

                  Note that this method may be used to pass datatabase- specific abstract data types, by using a driver-specific Java type. If the object is of a class implementing the interface SQLData, the JDBC driver should call the method SQLData.writeSQL to write it to the SQL data stream. If, on the other hand, the object is of a class implementing Ref, Blob, Clob, (JDBC4 new:) [ NClob ], Struct, java.net.URL, (JDBC4 new:) [ RowId, SQLXML ] or Array, the driver should pass it to the database as a value of the corresponding SQL type.

                  Note: Not all databases allow for a non-typed Null to be sent to the backend. For maximum portability, the setNull or the setObject(int parameterIndex, Object x, int sqlType) method should be used instead of setObject(int parameterIndex, Object x).

                  Note: This method throws an exception if there is an ambiguity, for example, if the object is of a class implementing more than one of the interfaces named above.

                  HSQLDB-Specific Information:

                  Since 1.7.2, this method supports conversions listed in the conversion table B-5 of the JDBC 3 specification.

                  Specified by:
                  setObject in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the object containing the input parameter value
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed PreparedStatement or the type of the given object is ambiguous

                  execute

                  public boolean execute()
                                  throws SQLException
                  Executes the SQL statement in this PreparedStatement object, which may be any kind of SQL statement. Some prepared statements return multiple results; the execute method handles these complex statements as well as the simpler form of statements handled by the methods executeQuery and executeUpdate.

                  The execute method returns a boolean to indicate the form of the first result. You must call either the method getResultSet or getUpdateCount to retrieve the result; you must call getMoreResults to move to any subsequent result(s).

                  HSQLDB-Specific Information:

                  If the statatement is a call to a PROCEDURE, it may return multiple multiple fetchable results.

                  Specified by:
                  execute in interface PreparedStatement
                  Returns:
                  true if the first result is a ResultSet object; false if the first result is an update count or there is no result
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed PreparedStatement or an argument is supplied to this method
                  See Also:
                  JDBCStatement.execute(java.lang.String), JDBCStatement.getResultSet(), JDBCStatement.getUpdateCount(), JDBCStatement.getMoreResults()

                  addBatch

                  public void addBatch()
                                throws SQLException
                  Adds a set of parameters to this PreparedStatement object's batch of commands.

                  HSQLDB-Specific Information:

                  Since 1.7.2, this feature is supported.

                  Specified by:
                  addBatch in interface PreparedStatement
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)
                  See Also:
                  JDBCStatement.addBatch(java.lang.String)

                  setCharacterStream

                  public void setCharacterStream(int parameterIndex,
                                                 Reader reader,
                                                 int length)
                                          throws SQLException
                  Sets the designated parameter to the given Reader object, which is the given number of characters long. When a very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.Reader object. The data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  HSQLDB-Specific Information:

                  From HSQLDB 2.0 this method uses streaming to send data when the target is a CLOB.

                  HSQLDB represents CHARACTER and related SQL types as UTF16 Unicode internally, so this method does not perform any conversion.

                  Specified by:
                  setCharacterStream in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  reader - the java.io.Reader object that contains the Unicode data
                  length - the number of characters in the stream
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  setRef

                  public void setRef(int parameterIndex,
                                     Ref x)
                              throws SQLException
                  Sets the designated parameter to the given REF(<structured-type>) value. The driver converts this to an SQL REF value when it sends it to the database.

                  HSQLDB-Specific Information:

                  Including 2.0 HSQLDB does not support the SQL REF type. Calling this method throws an exception.

                  Specified by:
                  setRef in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - an SQL REF value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  setBlob

                  public void setBlob(int parameterIndex,
                                      Blob x)
                               throws SQLException
                  Sets the designated parameter to the given java.sql.Blob object. The driver converts this to an SQL BLOB value when it sends it to the database.

                  HSQLDB-Specific Information:

                  For parameters of type Blob, setBlob works normally.

                  In addition since 1.7.2, setBlob is supported for BINARY and VARBINARY parameters. In this context, the Blob object is hard-limited to those of length less than or equal to Integer.MAX_VALUE. In practice, soft limits such as available heap and maximum disk usage per file (such as the transaction log) dictate a much smaller maximum length.

                  For BINARY and VARBINARY parameter types setBlob(i,x) is roughly equivalent (null and length handling not shown) to:

                   setBinaryStream(i, x.getBinaryStream(), (int) x.length());
                   

                  Specified by:
                  setBlob in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - a Blob object that maps an SQL BLOB value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  setClob

                  public void setClob(int parameterIndex,
                                      Clob x)
                               throws SQLException
                  Sets the designated parameter to the given java.sql.Clob object. The driver converts this to an SQL CLOB value when it sends it to the database.

                  HSQLDB-Specific Information:

                  For parameters of type Clob, setClob works normally.

                  In addition since 1.7.2, setClob is supported for CHARACTER and VARCHAR parameters. In this context, the Clob object is hard-limited to those of length less than or equal to Integer.MAX_VALUE. In practice, soft limits such as available heap and maximum disk usage per file (such as the transaction log) dictate a much smaller maximum length.

                  For CHARACTER and VARCHAR parameter types setClob(i,x) is roughly equivalent (null and length handling not shown) to:

                   setCharacterStream(i, x.getCharacterStream(), (int) x.length());
                   

                  Specified by:
                  setClob in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - a Clob object that maps an SQL CLOB value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  setArray

                  public void setArray(int parameterIndex,
                                       Array x)
                                throws SQLException
                  Sets the designated parameter to the given java.sql.Array object. The driver converts this to an SQL ARRAY value when it sends it to the database.

                  HSQLDB-Specific Information:

                  From version 2.0, HSQLDB supports the SQL ARRAY type.

                  Specified by:
                  setArray in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - an Array object that maps an SQL ARRAY value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  getMetaData

                  public ResultSetMetaData getMetaData()
                                                throws SQLException
                  Retrieves a ResultSetMetaData object that contains information about the columns of the ResultSet object that will be returned when this PreparedStatement object is executed.

                  Because a PreparedStatement object is precompiled, it is possible to know about the ResultSet object that it will return without having to execute it. Consequently, it is possible to invoke the method getMetaData on a PreparedStatement object rather than waiting to execute it and then invoking the ResultSet.getMetaData method on the ResultSet object that is returned.

                  NOTE: Using this method may be expensive for some drivers due to the lack of underlying DBMS support.

                  HSQLDB-Specific Information:

                  Since 1.7.2, this feature is supported and is inexpensive as it is backed by underlying DBMS support. If the statement generates an update count, then null is returned.

                  Specified by:
                  getMetaData in interface PreparedStatement
                  Returns:
                  the description of a ResultSet object's columns or null if the driver cannot return a ResultSetMetaData object
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  setDate

                  public void setDate(int parameterIndex,
                                      Date x,
                                      Calendar cal)
                               throws SQLException
                  Sets the designated parameter to the given java.sql.Date value, using the given Calendar object. The driver uses the Calendar object to construct an SQL DATE value, which the driver then sends to the database. With a Calendar object, the driver can calculate the date taking into account a custom timezone. If no Calendar object is specified, the driver uses the default timezone, which is that of the virtual machine running the application.

                  Specified by:
                  setDate in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  cal - the Calendar object the driver will use to construct the date
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  setTime

                  public void setTime(int parameterIndex,
                                      Time x,
                                      Calendar cal)
                               throws SQLException
                  Sets the designated parameter to the given java.sql.Time value, using the given Calendar object. The driver uses the Calendar object to construct an SQL TIME value, which the driver then sends to the database. With a Calendar object, the driver can calculate the time taking into account a custom timezone. If no Calendar object is specified, the driver uses the default timezone, which is that of the virtual machine running the application.

                  HSQLDB-Specific Information:

                  When a setXXX method is used to set a parameter of type TIMESTAMP WITH TIME ZONE or TIME WITH TIME ZONE the time zone (including Daylight Saving Time) of the Calendar is used as time zone for the value.

                  Specified by:
                  setTime in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  cal - the Calendar object the driver will use to construct the time
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  setTimestamp

                  public void setTimestamp(int parameterIndex,
                                           Timestamp x,
                                           Calendar cal)
                                    throws SQLException
                  Sets the designated parameter to the given java.sql.Timestamp value, using the given Calendar object. The driver uses the Calendar object to construct an SQL TIMESTAMP value, which the driver then sends to the database. With a Calendar object, the driver can calculate the timestamp taking into account a custom timezone. If no Calendar object is specified, the driver uses the default timezone, which is that of the virtual machine running the application.

                  HSQLDB-Specific Information:

                  When a setXXX method is used to set a parameter of type TIMESTAMP WITH TIME ZONE or TIME WITH TIME ZONE the time zone (including Daylight Saving Time) of the Calendar is used as time zone.

                  In this case, if the Calendar argument is null, then the default Calendar for the clients JVM is used as the Calendar

                  When this method is used to set a parameter of type TIME or TIME WITH TIME ZONE, then the nanosecond value of the Timestamp object is used if the TIME parameter accepts fractional seconds.

                  Specified by:
                  setTimestamp in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  cal - the Calendar object the driver will use to construct the timestamp
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  setNull

                  public void setNull(int parameterIndex,
                                      int sqlType,
                                      String typeName)
                               throws SQLException
                  Sets the designated parameter to SQL NULL. This version of the method setNull should be used for user-defined types and REF type parameters. Examples of user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and named array types.

                  Note: To be portable, applications must give the SQL type code and the fully-qualified SQL type name when specifying a NULL user-defined or REF parameter. In the case of a user-defined type the name is the type name of the parameter itself. For a REF parameter, the name is the type name of the referenced type. If a JDBC driver does not need the type code or type name information, it may ignore it. Although it is intended for user-defined and Ref parameters, this method may be used to set a null parameter of any JDBC type. If the parameter does not have a user-defined or REF type, the given typeName is ignored.

                  HSQLDB-Specific Information:

                  HSQLDB simply ignores the sqlType and typeName arguments.

                  Specified by:
                  setNull in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  sqlType - a value from java.sql.Types
                  typeName - the fully-qualified name of an SQL user-defined type; ignored if the parameter is not a user-defined type or REF
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if sqlType is a ARRAY, BLOB, CLOB, DATALINK, JAVA_OBJECT, NCHAR, NCLOB, NVARCHAR, LONGNVARCHAR, REF, ROWID, SQLXML or STRUCT data type and the JDBC driver does not support this data type or if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCParameterMetaData)

                  executeBatch

                  public int[] executeBatch()
                                     throws SQLException
                  Submits a batch of commands to the database for execution and if all commands execute successfully, returns an array of update counts. The int elements of the array that is returned are ordered to correspond to the commands in the batch, which are ordered according to the order in which they were added to the batch. The elements in the array returned by the method executeBatch may be one of the following:
                  1. A number greater than or equal to zero -- indicates that the command was processed successfully and is an update count giving the number of rows in the database that were affected by the command's execution
                  2. A value of SUCCESS_NO_INFO -- indicates that the command was processed successfully but that the number of rows affected is unknown

                    If one of the commands in a batch update fails to execute properly, this method throws a BatchUpdateException, and a JDBC driver may or may not continue to process the remaining commands in the batch. However, the driver's behavior must be consistent with a particular DBMS, either always continuing to process commands or never continuing to process commands. If the driver continues processing after a failure, the array returned by the method BatchUpdateException.getUpdateCounts will contain as many elements as there are commands in the batch, and at least one of the elements will be the following:

                  3. A value of EXECUTE_FAILED -- indicates that the command failed to execute successfully and occurs only if a driver continues to process commands after a command fails

                  A driver is not required to implement this method. The possible implementations and return values have been modified in the Java 2 SDK, Standard Edition, version 1.3 to accommodate the option of continuing to proccess commands in a batch update after a BatchUpdateException obejct has been thrown.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 1.7.2, this feature is supported.

                  HSQLDB stops execution of commands in a batch when one of the commands results in an exception. The size of the returned array equals the number of commands that were executed successfully.

                  When the product is built under the JAVA1 target, an exception is never thrown and it is the responsibility of the client software to check the size of the returned update count array to determine if any batch items failed. To build and run under the JAVA2 target, JDK/JRE 1.3 or higher must be used.

                  Specified by:
                  executeBatch in interface Statement
                  Returns:
                  an array of update counts containing one element for each command in the batch. The elements of the array are ordered according to the order in which commands were added to the batch.
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the driver does not support batch statements. Throws BatchUpdateException (a subclass of SQLException) if one of the commands sent to the database fails to execute properly or attempts to return a result set.
                  Since:
                  JDK 1.3 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  addBatch(), DatabaseMetaData.supportsBatchUpdates()

                  setEscapeProcessing

                  public void setEscapeProcessing(boolean enable)
                                           throws SQLException
                  Sets escape processing on or off.

                  HSQLDB-Specific Information:

                  As per JDBC spec, calling this method has no effect.

                  Specified by:
                  setEscapeProcessing in interface Statement
                  Parameters:
                  enable - true to enable escape processing; false to disable it
                  Throws:
                  SQLException - if a database access error occurs

                  addBatch

                  public void addBatch(String sql)
                                throws SQLException
                  This method should always throw if called for a PreparedStatement or CallableStatment.

                  Specified by:
                  addBatch in interface Statement
                  Parameters:
                  sql - ignored
                  Throws:
                  SQLException - always

                  executeQuery

                  public ResultSet executeQuery(String sql)
                                         throws SQLException
                  This method should always throw if called for a PreparedStatement or CallableStatment.

                  Specified by:
                  executeQuery in interface Statement
                  Parameters:
                  sql - ignored
                  Returns:
                  nothing
                  Throws:
                  SQLException - always

                  execute

                  public boolean execute(String sql)
                                  throws SQLException
                  This method should always throw if called for a PreparedStatement or CallableStatment.

                  Specified by:
                  execute in interface Statement
                  Parameters:
                  sql - ignored
                  Returns:
                  nothing
                  Throws:
                  SQLException - always

                  executeUpdate

                  public int executeUpdate(String sql)
                                    throws SQLException
                  This method should always throw if called for a PreparedStatement or CallableStatment.

                  Specified by:
                  executeUpdate in interface Statement
                  Parameters:
                  sql - ignored
                  Returns:
                  nothing
                  Throws:
                  SQLException - always

                  close

                  public void close()
                             throws SQLException
                  Does the specialized work required to free this object's resources and that of it's parent class.

                  Specified by:
                  close in interface Statement
                  Throws:
                  SQLException - if a database access error occurs

                  toString

                  public String toString()
                  Retrieves a String representation of this object.

                  The representation is of the form:

                  class-name@hash[sql=[char-sequence], parameters=[p1, ...pi, ...pn]]

                  p1, ...pi, ...pn are the String representations of the currently set parameter values that will be used with the non-batch execution methods.

                  Overrides:
                  toString in class Object
                  Returns:
                  a String representation of this object

                  setURL

                  public void setURL(int parameterIndex,
                                     URL x)
                              throws SQLException
                  Sets the designated parameter to the given java.net.URL value. The driver converts this to an SQL DATALINK value when it sends it to the database.

                  HSQLDB-Specific Information:

                  Including 2.0, HSQLDB does not support the DATALINK SQL type for which this method is intended. Calling this method throws an exception.

                  Specified by:
                  setURL in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the java.net.URL object to be set
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQL 1.7.0

                  getParameterMetaData

                  public ParameterMetaData getParameterMetaData()
                                                         throws SQLException
                  Retrieves the number, types and properties of this PreparedStatement object's parameters.

                  HSQLDB-Specific Information:

                  Since 1.7.2, this feature is supported.

                  Specified by:
                  getParameterMetaData in interface PreparedStatement
                  Returns:
                  a ParameterMetaData object that contains information about the number, types and properties for each parameter marker of this PreparedStatement object
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  Since:
                  JDK 1.4, HSQL 1.7.0
                  See Also:
                  ParameterMetaData

                  executeUpdate

                  public int executeUpdate(String sql,
                                           int autoGeneratedKeys)
                                    throws SQLException
                  Statement methods that must be overridden in this class and throw an exception.

                  Specified by:
                  executeUpdate in interface Statement
                  Throws:
                  SQLException

                  execute

                  public boolean execute(String sql,
                                         int autoGeneratedKeys)
                                  throws SQLException
                  Specified by:
                  execute in interface Statement
                  Throws:
                  SQLException

                  executeUpdate

                  public int executeUpdate(String sql,
                                           int[] columnIndexes)
                                    throws SQLException
                  Specified by:
                  executeUpdate in interface Statement
                  Throws:
                  SQLException

                  execute

                  public boolean execute(String sql,
                                         int[] columnIndexes)
                                  throws SQLException
                  Specified by:
                  execute in interface Statement
                  Throws:
                  SQLException

                  executeUpdate

                  public int executeUpdate(String sql,
                                           String[] columnNames)
                                    throws SQLException
                  Specified by:
                  executeUpdate in interface Statement
                  Throws:
                  SQLException

                  execute

                  public boolean execute(String sql,
                                         String[] columnNames)
                                  throws SQLException
                  Specified by:
                  execute in interface Statement
                  Throws:
                  SQLException

                  getMoreResults

                  public boolean getMoreResults(int current)
                                         throws SQLException
                  Moves to this Statement object's next result, deals with any current ResultSet object(s) according to the instructions specified by the given flag, and returns true if the next result is a ResultSet object.

                  There are no more results when the following is true:

                       // stmt is a Statement object
                       ((stmt.getMoreResults(current) == false) && (stmt.getUpdateCount() == -1))
                   

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  This is used with CallableStatement objects that return multiple ResultSet objects.

                  Specified by:
                  getMoreResults in interface Statement
                  Parameters:
                  current - one of the following Statement constants indicating what should happen to current ResultSet objects obtained using the method getResultSet: Statement.CLOSE_CURRENT_RESULT, Statement.KEEP_CURRENT_RESULT, or Statement.CLOSE_ALL_RESULTS
                  Returns:
                  true if the next result is a ResultSet object; false if it is an update count or there are no more results
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the argument supplied is not one of the following: Statement.CLOSE_CURRENT_RESULT, Statement.KEEP_CURRENT_RESULT, or Statement.CLOSE_ALL_RESULTS
                  Since:
                  JDK 1.4, HSQLDB 1.7
                  See Also:
                  execute()

                  getGeneratedKeys

                  public ResultSet getGeneratedKeys()
                                             throws SQLException
                  Retrieves any auto-generated keys created as a result of executing this Statement object. If this Statement object did not generate any keys, an empty ResultSet object is returned.

                  (JDBC4 clarification:)

                  Note:If the columns which represent the auto-generated keys were not specified, the JDBC driver implementation will determine the columns which best represent the auto-generated keys.

                  HSQLDB-Specific Information:

                  Starting with version 2.0, HSQLDB supports this feature with single-row and multi-row insert, update and merge statements.

                  This method returns a result set only if the executeUpdate methods that was used is one of the three methods that have the extra parameter indicating return of generated keys

                  If the executeUpaged method did not specify the columns which represent the auto-generated keys the IDENTITY column or GENERATED column(s) of the table are returned.

                  The executeUpdate methods with column indexes or column names return the post-insert or post-update values of the specified columns, whether the columns are generated or not. This allows values that have been modified by execution of triggers to be returned.

                  If column names or indexes provided by the user in the executeUpdate() method calls do not correspond to table columns (incorrect names or indexes larger than the coloum count), an empty result is returned.

                  Specified by:
                  getGeneratedKeys in interface Statement
                  Returns:
                  a ResultSet object containing the auto-generated key(s) generated by the execution of this Statement object
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  getResultSetHoldability

                  public int getResultSetHoldability()
                                              throws SQLException
                  Retrieves the result set holdability for ResultSet objects generated by this Statement object.

                  HSQLDB-Specific Information:

                  Starting with 1.7.2, this method returns HOLD_CURSORS_OVER_COMMIT

                  Specified by:
                  getResultSetHoldability in interface Statement
                  Returns:
                  either ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  isClosed

                  public boolean isClosed()
                  Retrieves whether this Statement object has been closed. A Statement is closed if the method close has been called on it, or if it is automatically closed.

                  Specified by:
                  isClosed in interface Statement
                  Returns:
                  true if this Statement object is closed; false if it is still open
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setRowId

                  public void setRowId(int parameterIndex,
                                       RowId x)
                                throws SQLException
                  Sets the designated parameter to the given java.sql.RowId object. The driver converts this to a SQL ROWID value when it sends it to the database

                  Specified by:
                  setRowId in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the parameter value
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setNString

                  public void setNString(int parameterIndex,
                                         String value)
                                  throws SQLException
                  Sets the designated paramter to the given String object. The driver converts this to a SQL NCHAR or NVARCHAR or LONGNVARCHAR value (depending on the argument's size relative to the driver's limits on NVARCHAR values) when it sends it to the database.

                  Specified by:
                  setNString in interface PreparedStatement
                  Parameters:
                  parameterIndex - of the first parameter is 1, the second is 2, ...
                  value - the parameter value
                  Throws:
                  SQLException - if the driver does not support national character sets; if the driver can detect that a data conversion error could occur ; if a database access error occurs; or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setNCharacterStream

                  public void setNCharacterStream(int parameterIndex,
                                                  Reader value,
                                                  long length)
                                           throws SQLException
                  Sets the designated parameter to a Reader object. The Reader reads the data till end-of-file is reached. The driver does the necessary conversion from Java character format to the national character set in the database.

                  Specified by:
                  setNCharacterStream in interface PreparedStatement
                  Parameters:
                  parameterIndex - of the first parameter is 1, the second is 2, ...
                  value - the parameter value
                  length - the number of characters in the parameter data.
                  Throws:
                  SQLException - if the driver does not support national character sets; if the driver can detect that a data conversion error could occur ; if a database access error occurs; or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setNClob

                  public void setNClob(int parameterIndex,
                                       NClob value)
                                throws SQLException
                  Sets the designated parameter to a java.sql.NClob object. The driver converts this to a SQL NCLOB value when it sends it to the database.

                  Specified by:
                  setNClob in interface PreparedStatement
                  Parameters:
                  parameterIndex - of the first parameter is 1, the second is 2, ...
                  value - the parameter value
                  Throws:
                  SQLException - if the driver does not support national character sets; if the driver can detect that a data conversion error could occur ; if a database access error occurs; or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setClob

                  public void setClob(int parameterIndex,
                                      Reader reader,
                                      long length)
                               throws SQLException
                  Sets the designated parameter to a Reader object. The reader must contain the number of characters specified by length otherwise a SQLException will be generated when the PreparedStatement is executed. This method differs from the setCharacterStream (int, Reader, int) method because it informs the driver that the parameter value should be sent to the server as a CLOB. When the setCharacterStream method is used, the driver may have to do extra work to determine whether the parameter data should be send to the server as a LONGVARCHAR or a CLOB

                  Specified by:
                  setClob in interface PreparedStatement
                  Parameters:
                  parameterIndex - index of the first parameter is 1, the second is 2, ...
                  reader - An object that contains the data to set the parameter value to.
                  length - the number of characters in the parameter data.
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed PreparedStatement, if parameterIndex does not correspond to a parameter marker in the SQL statement, or if the length specified is less than zero.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setBlob

                  public void setBlob(int parameterIndex,
                                      InputStream inputStream,
                                      long length)
                               throws SQLException
                  Sets the designated parameter to a InputStream object. The inputstream must contain the number of characters specified by length otherwise a SQLException will be generated when the PreparedStatement is executed. This method differs from the setBinaryStream (int, InputStream, int) method because it informs the driver that the parameter value should be sent to the server as a BLOB. When the setBinaryStream method is used, the driver may have to do extra work to determine whether the parameter data should be send to the server as a LONGVARBINARY or a BLOB

                  HSQLDB-Specific Information:

                  In HSQLDB 2.0, this method uses streaming to send the data when the stream is assigned to a BLOB target. For other binary targets the stream is read on the client side and a byte array is sent.

                  Specified by:
                  setBlob in interface PreparedStatement
                  Parameters:
                  parameterIndex - index of the first parameter is 1, the second is 2, ...
                  inputStream - An object that contains the data to set the parameter value to.
                  length - the number of bytes in the parameter data.
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed PreparedStatement, if parameterIndex does not correspond to a parameter marker in the SQL statement, if the length specified is less than zero or if the number of bytes in the inputstream does not match the specfied length.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setNClob

                  public void setNClob(int parameterIndex,
                                       Reader reader,
                                       long length)
                                throws SQLException
                  Sets the designated parameter to a Reader object. The reader must contain the number of characters specified by length otherwise a SQLException will be generated when the PreparedStatement is executed. This method differs from the setCharacterStream (int, Reader, int) method because it informs the driver that the parameter value should be sent to the server as a NCLOB. When the setCharacterStream method is used, the driver may have to do extra work to determine whether the parameter data should be send to the server as a LONGNVARCHAR or a NCLOB

                  Specified by:
                  setNClob in interface PreparedStatement
                  Parameters:
                  parameterIndex - index of the first parameter is 1, the second is 2, ...
                  reader - An object that contains the data to set the parameter value to.
                  length - the number of characters in the parameter data.
                  Throws:
                  SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if the length specified is less than zero; if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setSQLXML

                  public void setSQLXML(int parameterIndex,
                                        SQLXML xmlObject)
                                 throws SQLException
                  Sets the designated parameter to the given java.sql.SQLXML object. The driver converts this to an SQL XML value when it sends it to the database.

                  Specified by:
                  setSQLXML in interface PreparedStatement
                  Parameters:
                  parameterIndex - index of the first parameter is 1, the second is 2, ...
                  xmlObject - a SQLXML object that maps an SQL XML value
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed PreparedStatement or the java.xml.transform.Result, Writer or OutputStream has not been closed for the SQLXML object
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setAsciiStream

                  public void setAsciiStream(int parameterIndex,
                                             InputStream x,
                                             long length)
                                      throws SQLException
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes. When a very large ASCII value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.InputStream. Data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from ASCII to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  HSQLDB-Specific Information:

                  From HSQLDB 2.0 this method uses the US-ASCII character encoding to convert bytes from the stream into the characters of a String.

                  This method does not use streaming to send the data, whether the target is a CLOB or other binary object.

                  For long streams (larger than a few megabytes) with CLOB targets, it is more efficient to use a version of setCharacterStream which takes the a length parameter.

                  Specified by:
                  setAsciiStream in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the Java input stream that contains the ASCII parameter value
                  length - the number of bytes in the stream
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  Since:
                  JDK 1.6 b86, HSQLDB 2.0

                  setBinaryStream

                  public void setBinaryStream(int parameterIndex,
                                              InputStream x,
                                              long length)
                                       throws SQLException
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes. When a very large binary value is input to a LONGVARBINARY parameter, it may be more practical to send it via a java.io.InputStream object. The data will be read from the stream as needed until end-of-file is reached.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  HSQLDB-Specific Information:

                  This method uses streaming to send the data when the stream is assigned to a BLOB target. For other binary targets the stream is read on the client side and a byte array is sent.

                  Specified by:
                  setBinaryStream in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the java input stream which contains the binary parameter value
                  length - the number of bytes in the stream
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  Since:
                  JDK 1.6 b86, HSQLDB 2.0

                  setCharacterStream

                  public void setCharacterStream(int parameterIndex,
                                                 Reader reader,
                                                 long length)
                                          throws SQLException
                  Sets the designated parameter to the given Reader object, which is the given number of characters long. When a very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.Reader object. The data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  HSQLDB-Specific Information:

                  This method uses streaming to send data when the target is a CLOB.

                  Specified by:
                  setCharacterStream in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  reader - the java.io.Reader object that contains the Unicode data
                  length - the number of characters in the stream
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed PreparedStatement
                  Since:
                  JDK 1.6 b86, HSQLDB 2.0

                  setAsciiStream

                  public void setAsciiStream(int parameterIndex,
                                             InputStream x)
                                      throws SQLException
                  Sets the designated parameter to the given input stream. When a very large ASCII value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.InputStream. Data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from ASCII to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setAsciiStream which takes a length parameter.

                  HSQLDB-Specific Information:

                  In HSQLDB 2.0, this method does not use streaming to send the data, whether the target is a CLOB or other binary object. For long streams (larger than a few megabytes), it is more efficient to use a version of setCharacterStream which takes the a length parameter.

                  Specified by:
                  setAsciiStream in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the Java input stream that contains the ASCII parameter value
                  Throws:
                  SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  setBinaryStream

                  public void setBinaryStream(int parameterIndex,
                                              InputStream x)
                                       throws SQLException
                  Sets the designated parameter to the given input stream. When a very large binary value is input to a LONGVARBINARY parameter, it may be more practical to send it via a java.io.InputStream object. The data will be read from the stream as needed until end-of-file is reached.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setBinaryStream which takes a length parameter.

                  HSQLDB-Specific Information:

                  This method does not use streaming to send the data, whether the target is a CLOB or other binary object.

                  For long streams (larger than a few megabytes) with CLOB targets, it is more efficient to use a version of setCharacterStream which takes the a length parameter.

                  Specified by:
                  setBinaryStream in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  x - the java input stream which contains the binary parameter value
                  Throws:
                  SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  setCharacterStream

                  public void setCharacterStream(int parameterIndex,
                                                 Reader reader)
                                          throws SQLException
                  Sets the designated parameter to the given Reader object. When a very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a java.io.Reader object. The data will be read from the stream as needed until end-of-file is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char format.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setCharacterStream which takes a length parameter.

                  HSQLDB-Specific Information:

                  In HSQLDB 2.0, this method does not use streaming to send the data, whether the target is a CLOB or other binary object. For long streams (larger than a few megabytes), it is more efficient to use a version of setCharacterStream which takes the a length parameter.

                  Specified by:
                  setCharacterStream in interface PreparedStatement
                  Parameters:
                  parameterIndex - the first parameter is 1, the second is 2, ...
                  reader - the java.io.Reader object that contains the Unicode data
                  Throws:
                  SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  setNCharacterStream

                  public void setNCharacterStream(int parameterIndex,
                                                  Reader value)
                                           throws SQLException
                  Sets the designated parameter to a Reader object. The Reader reads the data till end-of-file is reached. The driver does the necessary conversion from Java character format to the national character set in the database.

                  Note: This stream object can either be a standard Java stream object or your own subclass that implements the standard interface.

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setNCharacterStream which takes a length parameter.

                  Specified by:
                  setNCharacterStream in interface PreparedStatement
                  Parameters:
                  parameterIndex - of the first parameter is 1, the second is 2, ...
                  value - the parameter value
                  Throws:
                  SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; if a database access error occurs; or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  setClob

                  public void setClob(int parameterIndex,
                                      Reader reader)
                               throws SQLException
                  Sets the designated parameter to a Reader object. This method differs from the setCharacterStream (int, Reader) method because it informs the driver that the parameter value should be sent to the server as a CLOB. When the setCharacterStream method is used, the driver may have to do extra work to determine whether the parameter data should be sent to the server as a LONGVARCHAR or a CLOB

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setClob which takes a length parameter.

                  Specified by:
                  setClob in interface PreparedStatement
                  Parameters:
                  parameterIndex - index of the first parameter is 1, the second is 2, ...
                  reader - An object that contains the data to set the parameter value to.
                  Throws:
                  SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs; this method is called on a closed PreparedStatementor if parameterIndex does not correspond to a parameter marker in the SQL statement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  setBlob

                  public void setBlob(int parameterIndex,
                                      InputStream inputStream)
                               throws SQLException
                  Sets the designated parameter to a InputStream object. This method differs from the setBinaryStream (int, InputStream) method because it informs the driver that the parameter value should be sent to the server as a BLOB. When the setBinaryStream method is used, the driver may have to do extra work to determine whether the parameter data should be sent to the server as a LONGVARBINARY or a BLOB

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setBlob which takes a length parameter.

                  Specified by:
                  setBlob in interface PreparedStatement
                  Parameters:
                  parameterIndex - index of the first parameter is 1, the second is 2, ...
                  inputStream - An object that contains the data to set the parameter value to.
                  Throws:
                  SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs; this method is called on a closed PreparedStatement or if parameterIndex does not correspond to a parameter marker in the SQL statement,
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  setNClob

                  public void setNClob(int parameterIndex,
                                       Reader reader)
                                throws SQLException
                  Sets the designated parameter to a Reader object. This method differs from the setCharacterStream (int, Reader) method because it informs the driver that the parameter value should be sent to the server as a NCLOB. When the setCharacterStream method is used, the driver may have to do extra work to determine whether the parameter data should be sent to the server as a LONGNVARCHAR or a NCLOB

                  Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of setNClob which takes a length parameter.

                  Specified by:
                  setNClob in interface PreparedStatement
                  Parameters:
                  parameterIndex - index of the first parameter is 1, the second is 2, ...
                  reader - An object that contains the data to set the parameter value to.
                  Throws:
                  SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if the driver does not support national character sets; if the driver can detect that a data conversion error could occur; if a database access error occurs or this method is called on a closed PreparedStatement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  1.6

                  getMaxFieldSize

                  public int getMaxFieldSize()
                                      throws SQLException
                  Retrieves the maximum number of bytes that can be returned for character and binary column values in a ResultSet object produced by this Statement object. This limit applies only to BINARY, VARBINARY, LONGVARBINARY, CHAR, VARCHAR, (JDBC4 new:) NCHAR, NVARCHAR, LONGNVARCHAR and LONGVARCHAR columns. If the limit is exceeded, the excess data is silently discarded.

                  HSQLDB-Specific Information:

                  HSQLDB always returns zero, meaning there is no limit.

                  Specified by:
                  getMaxFieldSize in interface Statement
                  Returns:
                  the current column size limit for columns storing character and binary values; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  setMaxFieldSize(int)

                  setMaxFieldSize

                  public void setMaxFieldSize(int max)
                                       throws SQLException
                  (JDBC4 clarification:) Sets the limit for the maximum number of bytes in a ResultSet Sets the limit for the maximum number of bytes that can be returned for character and binary column values in a ResultSet object produced by this Statement object. This limit applies only to BINARY, VARBINARY, LONGVARBINARY, CHAR, VARCHAR, (JDBC4 new:) NCHAR, NVARCHAR, LONGNVARCHAR and LONGVARCHAR fields. If the limit is exceeded, the excess data is silently discarded. For maximum portability, use values greater than 256.

                  HSQLDB-Specific Information:

                  To present, calls to this method are simply ignored; HSQLDB always stores the full number of bytes when dealing with any of the field types mentioned above. These types all have an absolute maximum element upper bound determined by the Java array index limit java.lang.Integer.MAX_VALUE. For XXXBINARY types, this translates to Integer.MAX_VALUE bytes. For XXXCHAR types, this translates to 2 * Integer.MAX_VALUE bytes (2 bytes / character).

                  In practice, field sizes are limited to values much smaller than the absolute maximum element upper bound, in particular due to limits imposed on the maximum available Java heap memory.

                  Specified by:
                  setMaxFieldSize in interface Statement
                  Parameters:
                  max - the new column size limit in bytes; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the condition max >= 0 is not satisfied
                  See Also:
                  getMaxFieldSize()

                  getMaxRows

                  public int getMaxRows()
                                 throws SQLException
                  Retrieves the maximum number of rows that a ResultSet object produced by this Statement object can contain. If this limit is exceeded, the excess rows are silently dropped.

                  Specified by:
                  getMaxRows in interface Statement
                  Returns:
                  the current maximum number of rows for a ResultSet object produced by this Statement object; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  setMaxRows(int)

                  setMaxRows

                  public void setMaxRows(int max)
                                  throws SQLException
                  (JDBC4 clarification:) Sets the limit for the maximum number of rows that any ResultSet object generated by this Statement object can contain to the given number. If the limit is exceeded, the excess rows are silently dropped.

                  Specified by:
                  setMaxRows in interface Statement
                  Parameters:
                  max - the new max rows limit; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the condition max >= 0 is not satisfied
                  See Also:
                  getMaxRows()

                  getQueryTimeout

                  public int getQueryTimeout()
                                      throws SQLException
                  Retrieves the number of seconds the driver will wait for a Statement object to execute. If the limit is exceeded, a SQLException is thrown.

                  HSQLDB-Specific Information:

                  To present, HSQLDB always returns zero, meaning there is no limit.

                  Specified by:
                  getQueryTimeout in interface Statement
                  Returns:
                  the current query timeout limit in seconds; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  setQueryTimeout(int)

                  setQueryTimeout

                  public void setQueryTimeout(int seconds)
                                       throws SQLException
                  Sets the number of seconds the driver will wait for a Statement object to execute to the given number of seconds. If the limit is exceeded, an SQLException is thrown. A JDBC (JDBC4 clarification:) driver must apply this limit to the execute, executeQuery and executeUpdate methods. JDBC driver implementations may also apply this limit to ResultSet methods (consult your driver vendor documentation for details).

                  HSQLDB-Specific Information:

                  The maximum value is Short.MAX_VALUE. The minimum is 0, indicating no limit. In 2.0, calls to this method are ignored; HSQLDB waits an unlimited amount of time for statement execution requests to return.

                  Specified by:
                  setQueryTimeout in interface Statement
                  Parameters:
                  seconds - the new query timeout limit in seconds; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the condition seconds >= 0 is not satisfied
                  See Also:
                  getQueryTimeout()

                  cancel

                  public void cancel()
                              throws SQLException
                  Cancels this Statement object if both the DBMS and driver support aborting an SQL statement. This method can be used by one thread to cancel a statement that is being executed by another thread.

                  HSQLDB-Specific Information:

                  Including 2.0, HSQLDB does not support aborting an SQL statement; calls to this method are ignored.

                  Specified by:
                  cancel in interface Statement
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method

                  getWarnings

                  public SQLWarning getWarnings()
                                         throws SQLException
                  Retrieves the first warning reported by calls on this Statement object. Subsequent Statement object warnings will be chained to this SQLWarning object.

                  The warning chain is automatically cleared each time a statement is (re)executed. This method may not be called on a closed Statement object; doing so will cause an SQLException to be thrown.

                  Note: If you are processing a ResultSet object, any warnings associated with reads on that ResultSet object will be chained on it rather than on the Statement object that produced it.

                  HSQLDB-Specific Information:

                  From 1.9 HSQLDB, produces Statement warnings.

                  Specified by:
                  getWarnings in interface Statement
                  Returns:
                  the first SQLWarning object or null if there are no warnings
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement

                  clearWarnings

                  public void clearWarnings()
                                     throws SQLException
                  Clears all the warnings reported on this Statement object. After a call to this method, the method getWarnings will return null until a new warning is reported for this Statement object.

                  HSQLDB-Specific Information:

                  Supported in HSQLDB 1.9.

                  Specified by:
                  clearWarnings in interface Statement
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement

                  setCursorName

                  public void setCursorName(String name)
                                     throws SQLException
                  Sets the SQL cursor name to the given String, which will be used by subsequent Statement object execute methods. This name can then be used in SQL positioned update or delete statements to identify the current row in the ResultSet object generated by this statement. If the database does not support positioned update/delete, this method is a noop. To insure that a cursor has the proper isolation level to support updates, the cursor's SELECT statement should have the form SELECT FOR UPDATE. If FOR UPDATE is not present, positioned updates may fail.

                  Note: By definition, the execution of positioned updates and deletes must be done by a different Statement object than the one that generated the ResultSet object being used for positioning. Also, cursor names must be unique within a connection.

                  HSQLDB-Specific Information:

                  Including 2.0, HSQLDB does not support named cursors; calls to this method are ignored.

                  Specified by:
                  setCursorName in interface Statement
                  Parameters:
                  name - the new cursor name, which must be unique within a connection
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method

                  getResultSet

                  public ResultSet getResultSet()
                                         throws SQLException
                  Retrieves the current result as a ResultSet object. This method should be called only once per result.

                  HSQLDB-Specific Information:

                  Without an interceding call to executeXXX, each invocation of this method will produce a new, initialized ResultSet instance referring to the current result, if any.

                  Specified by:
                  getResultSet in interface Statement
                  Returns:
                  the current result as a ResultSet object or null if the result is an update count or there are no more results
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  execute()

                  getUpdateCount

                  public int getUpdateCount()
                                     throws SQLException
                  Retrieves the current result as an update count; if the result is a ResultSet object or there are no more results, -1 is returned. This method should be called only once per result.

                  Specified by:
                  getUpdateCount in interface Statement
                  Returns:
                  the current result as an update count; -1 if the current result is a ResultSet object or there are no more results
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  execute()

                  getMoreResults

                  public boolean getMoreResults()
                                         throws SQLException
                  Moves to this Statement object's next result, returns true if it is a ResultSet object, and implicitly closes any current ResultSet object(s) obtained with the method getResultSet.

                  There are no more results when the following is true:

                       // stmt is a Statement object
                       ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
                   

                  Specified by:
                  getMoreResults in interface Statement
                  Returns:
                  true if the next result is a ResultSet object; false if it is an update count or there are no more results
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  execute()

                  setFetchDirection

                  public void setFetchDirection(int direction)
                                         throws SQLException
                  Gives the driver a hint as to the direction in which rows will be processed in ResultSet objects created using this Statement object. The default value is ResultSet.FETCH_FORWARD.

                  Note that this method sets the default fetch direction for result sets generated by this Statement object. Each result set has its own methods for getting and setting its own fetch direction.

                  HSQLDB-Specific Information:

                  Up to 1.8.0.x, HSQLDB supports only FETCH_FORWARD; Setting any other value would throw an SQLException stating that the operation is not supported.

                  Starting with 2.0, HSQLDB accepts any valid value.

                  Specified by:
                  setFetchDirection in interface Statement
                  Parameters:
                  direction - the initial direction for processing rows
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the given direction is not one of ResultSet.FETCH_FORWARD, ResultSet.FETCH_REVERSE, or ResultSet.FETCH_UNKNOWN
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  getFetchDirection()

                  getFetchDirection

                  public int getFetchDirection()
                                        throws SQLException
                  Retrieves the direction for fetching rows from database tables that is the default for result sets generated from this Statement object. If this Statement object has not set a fetch direction by calling the method setFetchDirection, the return value is implementation-specific.

                  HSQLDB-Specific Information:

                  Up to 1.8.0.x, HSQLDB always returned FETCH_FORWARD. Starting with 2.0, HSQLDB returns FETCH_FORWARD by default, or whatever value has been explicitly assigned by invoking setFetchDirection. .

                  Specified by:
                  getFetchDirection in interface Statement
                  Returns:
                  the default fetch direction for result sets generated from this Statement object
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  setFetchDirection(int)

                  setFetchSize

                  public void setFetchSize(int rows)
                                    throws SQLException
                  (JDBC4 clarification:) Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for ResultSet objects genrated by this Statement. If the value specified is zero, then the hint is ignored. The default value is zero.

                  HSQLDB-Specific Information:

                  HSQLDB uses the specified value as a hint, but may process more or fewer rows than specified.

                  Specified by:
                  setFetchSize in interface Statement
                  Parameters:
                  rows - the number of rows to fetch
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the (JDBC4 modified:) condition rows >= 0 is not satisfied.
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  getFetchSize()

                  getFetchSize

                  public int getFetchSize()
                                   throws SQLException
                  Retrieves the number of result set rows that is the default fetch size for ResultSet objects generated from this Statement object. If this Statement object has not set a fetch size by calling the method setFetchSize, the return value is implementation-specific.
                  HSQLDB-Specific Information

                  HSQLDB returns 0 by default, or the fetch size specified by setFetchSize

                  Specified by:
                  getFetchSize in interface Statement
                  Returns:
                  the default fetch size for result sets generated from this Statement object
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  setFetchSize(int)

                  getResultSetConcurrency

                  public int getResultSetConcurrency()
                                              throws SQLException
                  Retrieves the result set concurrency for ResultSet objects generated by this Statement object.

                  HSQLDB-Specific Information:

                  HSQLDB supports CONCUR_READ_ONLY and CONCUR_READ_UPDATEBLE concurrency.

                  Specified by:
                  getResultSetConcurrency in interface Statement
                  Returns:
                  either ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)

                  getResultSetType

                  public int getResultSetType()
                                       throws SQLException
                  Retrieves the result set type for ResultSet objects generated by this Statement object.

                  HSQLDB-Specific Information:

                  HSQLDB 1.7.0 and later versions support TYPE_FORWARD_ONLY and TYPE_SCROLL_INSENSITIVE.

                  Specified by:
                  getResultSetType in interface Statement
                  Returns:
                  one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)

                  clearBatch

                  public void clearBatch()
                                  throws SQLException
                  Empties this Statement object's current list of SQL commands.

                  (JDBC4 clarification:)

                  NOTE: Support of an ability to batch updates is optional.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 1.7.2, this feature is supported.

                  Specified by:
                  clearBatch in interface Statement
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the driver does not support batch updates
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  addBatch()

                  getConnection

                  public Connection getConnection()
                                           throws SQLException
                  Retrieves the Connection object that produced this Statement object.

                  Specified by:
                  getConnection in interface Statement
                  Returns:
                  the connection that produced this statement
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)

                  setPoolable

                  public void setPoolable(boolean poolable)
                                   throws SQLException
                  Requests that a Statement be pooled or not pooled. The value specified is a hint to the statement pool implementation indicating whether the application wants the statement to be pooled. It is up to the statement pool manager as to whether the hint is used.

                  The poolable value of a statement is applicable to both internal statement caches implemented by the driver and external statement caches implemented by application servers and other applications.

                  By default, a Statement is not poolable when created, and a PreparedStatement and CallableStatement are poolable when created.

                  Specified by:
                  setPoolable in interface Statement
                  Parameters:
                  poolable - requests that the statement be pooled if true and that the statement not be pooled if false

                  Throws:
                  SQLException - if this method is called on a closed Statement

                  Since:
                  JDK 1.6 Build 81, HSQLDB 2.0

                  isPoolable

                  public boolean isPoolable()
                                     throws SQLException
                  Returns a value indicating whether the Statement is poolable or not.

                  Specified by:
                  isPoolable in interface Statement
                  Returns:
                  true if the Statement is poolable; false otherwise
                  Throws:
                  SQLException - if this method is called on a closed Statement

                  Since:
                  JDK 1.6 Build 81, HSQLDB 2.0

                  See Also:
                  setPoolable(boolean)

                  unwrap

                  public <T> T unwrap(Class<T> iface)
                           throws SQLException
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy. If the receiver implements the interface then the result is the receiver or a proxy for the receiver. If the receiver is a wrapper and the wrapped object implements the interface then the result is the wrapped object or a proxy for the wrapped object. Otherwise return the the result of calling unwrap recursively on the wrapped object or a proxy for that result. If the receiver is not a wrapper and does not implement the interface, then an SQLException is thrown.

                  Specified by:
                  unwrap in interface Wrapper
                  Parameters:
                  iface - A Class defining an interface that the result must implement.
                  Returns:
                  an object that implements the interface. May be a proxy for the actual implementing object.
                  Throws:
                  SQLException - If no object found that implements the interface
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  isWrapperFor

                  public boolean isWrapperFor(Class<?> iface)
                                       throws SQLException
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does. Returns false otherwise. If this implements the interface then return true, else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped object. If this does not implement the interface and is not a wrapper, return false. This method should be implemented as a low-cost operation compared to unwrap so that callers can use this method to avoid expensive unwrap calls that may fail. If this method returns true then calling unwrap with the same argument should succeed.

                  Specified by:
                  isWrapperFor in interface Wrapper
                  Parameters:
                  iface - a Class defining an interface.
                  Returns:
                  true if this implements the interface or directly or indirectly wraps an object that does.
                  Throws:
                  SQLException - if an error occurs while determining whether this is a wrapper for an object with the given interface.
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  closeOnCompletion

                  public void closeOnCompletion()
                                         throws SQLException
                  Specifies that this Statement will be closed when all its dependent result sets are closed. If execution of the Statement does not produce any result sets, this method has no effect.

                  Note: Multiple calls to closeOnCompletion do not toggle the effect on this Statement. However, a call to closeOnCompletion does effect both the subsequent execution of statements, and statements that currently have open, dependent, result sets.

                  Throws:
                  SQLException - if this method is called on a closed Statement
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1

                  isCloseOnCompletion

                  public boolean isCloseOnCompletion()
                                              throws SQLException
                  Returns a value indicating whether this Statement will be closed when all its dependent result sets are closed.

                  Returns:
                  true if the Statement will be closed when all of its dependent result sets are closed; false otherwise
                  Throws:
                  SQLException - if this method is called on a closed Statement
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCConnection.html0000644000175000017500000067134712007570402024667 0ustar renerene JDBCConnection (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCConnection

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCConnection
                  
                  All Implemented Interfaces:
                  Connection, Wrapper

                  public class JDBCConnection
                  extends Object
                  implements Connection

                  A connection (session) with a specific database. SQL statements are executed and results are returned within the context of a connection.

                  A Connection object's database is able to provide information describing its tables, its supported SQL grammar, its stored procedures, the capabilities of this connection, and so on. This information is obtained with the getMetaData method.

                  (JDBC4 clarification:)

                  Note: When configuring a Connection, JDBC applications should use the appropritate Connection method such as setAutoCommit or setTransactionIsolation. Applications should not invoke SQL commands directly to change the connection's configuration when there is a JDBC method available. By default a Connection object is in auto-commit mode, which means that it automatically commits changes after executing each statement. If auto-commit mode has been disabled, the method commit must be called explicitly in order to commit changes; otherwise, database changes will not be saved.

                  A new Connection object created using the JDBC 2.1 core API has an initially empty type map associated with it. A user may enter a custom mapping for a UDT in this type map. When a UDT is retrieved from a data source with the method ResultSet.getObject, the getObject method will check the connection's type map to see if there is an entry for that UDT. If so, the getObject method will map the UDT to the class indicated. If there is no entry, the UDT will be mapped using the standard mapping.

                  A user may create a new type map, which is a java.util.Map object, make an entry in it, and pass it to the java.sql methods that can perform custom mapping. In this case, the method will use the given type map instead of the one associated with the connection.

                  For example, the following code fragment specifies that the SQL type ATHLETES will be mapped to the class Athletes in the Java programming language. The code fragment retrieves the type map for the Connection object con, inserts the entry into it, and then sets the type map with the new entry as the connection's type map.

                        java.util.Map map = con.getTypeMap();
                        map.put("mySchemaName.ATHLETES", Class.forName("Athletes"));
                        con.setTypeMap(map);
                   

                  HSQLDB-Specific Information:

                  To get a Connection to an HSQLDB database, the following code may be used (updated to reflect the most recent recommendations):


                  When using HSQLDB, the database connection <url> must start with 'jdbc:hsqldb:'

                  Since 1.7.2, connection properties (<key-value-pairs>) may be appended to the database connection <url>, using the form:

                  '<url>[;key=value]*'

                  Also since 1.7.2, the allowable forms of the HSQLDB database connection <url> have been extended. However, all legacy forms continue to work, with unchanged semantics. The extensions are as described in the following material.


                  Network Server Database Connections:

                  The Server database connection <url> takes one of the two following forms:

                  1. 'jdbc:hsqldb:hsql://host[:port][/<alias>][<key-value-pairs>]'
                  2. 'jdbc:hsqldb:hsqls://host[:port][/<alias>][<key-value-pairs>]' (with TLS).

                  The WebServer database connection <url> takes one of two following forms:

                  1. 'jdbc:hsqldb:http://host[:port][/<alias>][<key-value-pairs>]'
                  2. 'jdbc:hsqldb:https://host[:port][/<alias>][<key-value-pairs>]' (with TLS).

                  In both network server database connection <url> forms, the optional <alias> component is used to identify one of possibly several database instances available at the indicated host and port. If the <alias> component is omitted, then a connection is made to the network server's default database instance, if such an instance is available.

                  For more information on server configuration regarding mounting multiple databases and assigning them <alias> values, please read the Java API documentation for Server and related chapters in the general documentation, especially the Advanced Users Guide.


                  Transient, In-Process Database Connections:

                  The 100% in-memory (transient, in-process) database connection <url> takes one of the two following forms:

                  1. 'jdbc:hsqldb:.[<key-value-pairs>]' (the legacy form, extended)
                  2. 'jdbc:hsqldb:mem:<alias>[<key-value-pairs>]' (the new form)

                  The driver converts the supplied <alias> component to Local.ENGLISH lower case and uses the resulting character sequence as the key used to look up a mem: protocol database instance amongst the collection of all such instances already in existence within the current class loading context in the current JVM. If no such instance exists, one may be automatically created and mapped to the <alias>, as governed by the 'ifexists=true|false' connection property.

                  The rationale for converting the supplied <alias> component to lower case is to provide consistency with the behavior of res: protocol database connection <url>s, explained further on in this overview.


                  Persistent, In-Process Database Connections:

                  The standalone (persistent, in-process) database connection <url> takes one of the three following forms:

                  1. 'jdbc:hsqldb:<path>[<key-value-pairs>]' (the legacy form, extended)
                  2. 'jdbc:hsqldb:file:<path>[<key-value-pairs>]' (same semantics as the legacy form)
                  3. 'jdbc:hsqldb:res:<path>[<key-value-pairs>]' (new form with 'files_in_jar' semantics)

                  For the persistent, in-process database connection <url>, the <path> component is the path prefix common to all of the files that compose the database.

                  From 1.7.2, although other files may be involved (such as transient working files and/or TEXT table CSV data source files), the essential set that may, at any particular point in time, compose an HSQLDB database is:

                  • <path>.properties
                  • <path>.script
                  • <path>.log
                  • <path>.data
                  • <path>.backup
                  • <path>.lck

                  For example: 'jdbc:hsqldb:file:test' connects to a database composed of some subset of the files listed above, where the expansion of <path> is 'test' prefixed with the canonical path of the JVM's effective working directory at the time the designated database is first opened in-process.

                  Be careful to note that this canonical expansion of <path> is cached by the driver until JVM exit. So, although legacy JVMs tend to fix the reported effective working directory at the one noted upon JVM startup, there is no guarantee that modern JVMs will continue to uphold this behaviour. What this means is there is effectively no guarantee into the future that a relative file: protocol database connection <url> will connect to the same database instance for the life of the JVM. To avoid any future ambigutity issues, it is probably a best practice for clients to attempt to pre-canonicalize the <path> component of file: protocol database connection* <url>s.

                  Under Windows TM , 'jdbc:hsqldb:file:c:\databases\test' connects to a database located on drive 'C:' in the directory 'databases', composed of some subset of the files:

                   C:\
                   +--databases\
                      +--test.properties
                      +--test.script
                      +--test.log
                      +--test.data
                      +--test.backup
                      +--test.lck
                   
                  Under most variations of UNIX, 'jdbc:hsqldb:file:/databases/test' connects to a database located in the directory 'databases' directly under root, once again composed of some subset of the files:

                  
                   +--databases
                      +--test.properties
                      +--test.script
                      +--test.log
                      +--test.data
                      +--test.backup
                      +--test.lck
                   
                  Some Guidelines:

                  1. Both relative and absolute database file paths are supported.

                  2. Relative database file paths can be specified in a platform independent manner as: '[dir1/dir2/.../dirn/]<file-name-prefix>'.

                  3. Specification of absolute file paths is operating-system specific.
                    Please read your OS file system documentation.

                  4. Specification of network mounts may be operating-system specific.
                    Please read your OS file system documentation.

                  5. Special care may be needed w.r.t. file path specifications containing whitespace, mixed-case, special characters and/or reserved file names.
                    Please read your OS file system documentation.

                  Note: Versions of HSQLDB previous to 1.7.0 did not support creating directories along the file path specified in the persistent, in-process mode database connection <url> form, in the case that they did not already exist. Starting with HSQLDB 1.7.0, directories will be created if they do not already exist., but only if HSQLDB is built under a version of the compiler greater than JDK 1.1.x.


                  res: protocol Connections:

                  The 'jdbc:hsqldb:res:<path>' database connection <url> has different semantics than the 'jdbc:hsqldb:file:<path>' form. The semantics are similar to those of a 'files_readonly' database, but with some additional points to consider.

                  Specifically, the '<path>' component of a res: protocol database connection <url> is first converted to lower case with Locale.ENGLISH and only then used to obtain resource URL objects, which in turn are used to read the database files as resources on the class path.

                  Due to lower case conversion by the driver, res: '<path>' components never find jar resources stored with Locale.ENGLISH mixed case paths. The rationale for converting to lower case is that not all pkzip implementations guarantee path case is preserved when archiving resources, and conversion to lower case seems to be the most common occurrence (although there is also no actual guarantee that the conversion is Locale.ENGLISH).

                  More importantly, res: '<path>' components must point only to resources contained in one or more jars on the class path. That is, only resources having the jar sub-protocol are considered valid.

                  This restriction is enforced to avoid the unfortunate situation in which, because res: database instances do not create a <path>.lck file (they are strictly files-read-only) and because the <path> components of res: and file: database URIs are not checked for file system equivalence, it is possible for the same database files to be accessed concurrently by both file: and res: database instances. That is, without this restriction, it is possible that <path>.data and <path>.properties file content may be written by a file: database instance without the knowlege or cooperation of a res: database instance open on the same files, potentially resulting in unexpected database errors, inconsistent operation and/or data corruption.

                  In short, a res: type database connection <url> is designed specifically to connect to a 'files_in_jar' mode database instance, which in turn is designed specifically to operate under Java WebStartTM and Java AppletTMconfigurations, where co-locating the database files in the jars that make up the WebStart application or Applet avoids the need for special security configuration or code signing.

                  Note: Since it is difficult and often nearly impossible to determine or control at runtime from where all classes are being loaded or which class loader is doing the loading (and hence how relative path specifications are resolved) under 'files_in_jar' semantics, the <path> component of the res: database connection <url> is always taken to be relative to the default package and resource URL resolution is always performed using the ClassLoader that loads the org.hsqldb.persist.Logger class. That is, if the <path> component does not start with '/', then'/' is prepended when obtaining the resource URLs used to read the database files, and only the effective class path of org.hsqldb.persist.Logger's ClassLoader is searched.


                  For more information about HSQLDB file structure, various database modes and other attributes such as those controlled through the HSQLDB properties files, please read the general documentation, especially the Advanced Users Guide.


                  JRE 1.1.x Notes:

                  In general, JDBC 2 support requires Java 1.2 and above, and JDBC3 requires Java 1.4 and above. In HSQLDB, support for methods introduced in different versions of JDBC depends on the JDK version used for compiling and building HSQLDB.

                  Since 1.7.0, it is possible to build the product so that all JDBC 2 methods can be called while executing under the version 1.1.x Java Runtime EnvironmentTM. However, in addition to this technique requiring explicit casts to the org.hsqldb.jdbc.* classes, some of the method calls also require int values that are defined only in the JDBC 2 or greater version of the ResultSet interface. For this reason, when the product is compiled under JDK 1.1.x, these values are defined in JDBCResultSet.

                  In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the JDBC 2+ ResultSet values can be achieved by referring to them in parameter specifications and return value comparisons, respectively, as follows:

                   JDBCResultSet.FETCH_FORWARD
                   JDBCResultSet.TYPE_FORWARD_ONLY
                   JDBCResultSet.TYPE_SCROLL_INSENSITIVE
                   JDBCResultSet.CONCUR_READ_ONLY
                   // etc.
                   
                  However, please note that code written to use HSQLDB JDBC 2 features under JDK 1.1.x will not be compatible for use with other JDBC 2 drivers. Please also note that this feature is offered solely as a convenience to developers who must work under JDK 1.1.x due to operating constraints, yet wish to use some of the more advanced features available under the JDBC 2 specification.


                  JDBC 4.0 Notes:

                  Starting with JDBC 4.0 (JDK 1.6), the DriverManager methods getConnection and getDrivers have been enhanced to support the Java Standard Edition Service Provider mechanism. When built under a Java runtime that supports JDBC 4.0, HSQLDB distribution jars containing the Driver implementation also include the file META-INF/services/java.sql.Driver. This file contains the fully qualified class name ('org.hsqldb.jdbc.JDBCDriver') of the HSQLDB implementation of java.sql.Driver.

                  Hence, under JDBC 4.0 or greater, applications no longer need to explictly load the HSQLDB JDBC driver using Class.forName(). Of course, existing programs which do load JDBC drivers using Class.forName() will continue to work without modification.


                  (fredt@users)
                  (boucherb@users)

                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)
                  See Also:
                  JDBCDriver, JDBCStatement, JDBCParameterMetaData, JDBCCallableStatement, JDBCResultSet, JDBCDatabaseMetaData, DriverManager.getConnection(java.lang.String, java.util.Properties), Statement, ResultSet, DatabaseMetaData

                  Field Summary
                   
                  Fields inherited from interface java.sql.Connection
                  TRANSACTION_NONE, TRANSACTION_READ_COMMITTED, TRANSACTION_READ_UNCOMMITTED, TRANSACTION_REPEATABLE_READ, TRANSACTION_SERIALIZABLE
                   
                  Constructor Summary
                  JDBCConnection(org.hsqldb.persist.HsqlProperties props)
                            Constructs a new external Connection to an HSQLDB Database.
                  JDBCConnection(JDBCConnection c, JDBCConnectionEventListener eventListener)
                            Constructor for use with connection pooling and XA.
                  JDBCConnection(org.hsqldb.SessionInterface c)
                            Constructs an INTERNAL Connection, using the specified SessionInterface.
                   
                  Method Summary
                   void abort(Executor executor)
                            Terminates an open connection.
                   void clearWarnings()
                            Clears all warnings reported for this Connection object.
                   void close()
                            Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be automatically released.
                   void closeFully()
                            Completely closes a pooled connection
                   void commit()
                            Makes all changes made since the previous commit/rollback permanent and releases any database locks currently held by this Connection object.
                   Array createArrayOf(String typeName, Object[] elements)
                            Factory method for creating Array objects.
                   Blob createBlob()
                            Constructs an object that implements the Blob interface.
                   Clob createClob()
                            Constructs an object that implements the Clob interface.
                   NClob createNClob()
                            Constructs an object that implements the NClob interface.
                   SQLXML createSQLXML()
                            Constructs an object that implements the SQLXML interface.
                   Statement createStatement()
                            Creates a Statement object for sending SQL statements to the database.
                   Statement createStatement(int resultSetType, int resultSetConcurrency)
                            Creates a Statement object that will generate ResultSet objects with the given type and concurrency.
                   Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
                            Creates a Statement object that will generate ResultSet objects with the given type, concurrency, and holdability.
                   Struct createStruct(String typeName, Object[] attributes)
                            Factory method for creating Struct objects.
                   boolean getAutoCommit()
                            Retrieves the current auto-commit mode for this Connection object.
                   String getCatalog()
                            Retrieves this Connection object's current catalog name.
                   Properties getClientInfo()
                            Returns a list containing the name and current value of each client info property supported by the driver.
                   String getClientInfo(String name)
                            Returns the value of the client info property specified by name.
                   int getHoldability()
                            Retrieves the current holdability of ResultSet objects created using this Connection object.
                   DatabaseMetaData getMetaData()
                            Retrieves a DatabaseMetaData object that contains metadata about the database to which this Connection object represents a connection.
                   int getNetworkTimeout()
                            Retrieves the number of milliseconds the driver will wait for a database request to complete.
                   String getSchema()
                            Retrieves this Connection object's current schema name.
                   org.hsqldb.SessionInterface getSession()
                            provides cross-package access to the proprietary (i.e.
                   int getTransactionIsolation()
                            Retrieves this Connection object's current transaction isolation level.
                   Map<String,Class<?>> getTypeMap()
                            Retrieves the Map object associated with this Connection object.
                   SQLWarning getWarnings()
                            Retrieves the first warning reported by calls on this Connection object.
                   boolean isClosed()
                            Retrieves whether this Connection object has been closed.
                   boolean isReadOnly()
                            Retrieves whether this Connection object is in read-only mode.
                   boolean isValid(int timeout)
                            Returns true if the connection has not been closed and is still valid.
                   boolean isWrapperFor(Class<?> iface)
                            Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                   String nativeSQL(String sql)
                            Converts the given SQL statement into the system's native SQL grammar.
                   CallableStatement prepareCall(String sql)
                            Creates a CallableStatement object for calling database stored procedures.
                   CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency)
                            Creates a CallableStatement object that will generate ResultSet objects with the given type and concurrency.
                   CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
                            Creates a CallableStatement object that will generate ResultSet objects with the given type and concurrency.
                   PreparedStatement prepareStatement(String sql)
                            Creates a PreparedStatement object for sending parameterized SQL statements to the database.
                   PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
                            Creates a default PreparedStatement object that has the capability to retrieve auto-generated keys.
                   PreparedStatement prepareStatement(String sql, int[] columnIndexes)
                            Creates a default PreparedStatement object capable of returning the auto-generated keys designated by the given array.
                   PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
                            Creates a PreparedStatement object that will generate ResultSet objects with the given type and concurrency.
                   PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
                            Creates a PreparedStatement object that will generate ResultSet objects with the given type, concurrency, and holdability.
                   PreparedStatement prepareStatement(String sql, String[] columnNames)
                            Creates a default PreparedStatement object capable of returning the auto-generated keys designated by the given array.
                   void releaseSavepoint(Savepoint savepoint)
                            Removes the specified Savepoint (JDBC4 Clarification:) and subsequent Savepoint objects from the current transaction.
                   void reset()
                            Resets this connection so it can be used again.
                   void rollback()
                            Undoes all changes made in the current transaction and releases any database locks currently held by this Connection object.
                   void rollback(Savepoint savepoint)
                            Undoes all changes made after the given Savepoint object was set.
                   void setAutoCommit(boolean autoCommit)
                            Sets this connection's auto-commit mode to the given state.
                   void setCatalog(String catalog)
                            Sets the given catalog name in order to select a subspace of this Connection object's database in which to work.
                   void setClientInfo(Properties properties)
                            Sets the value of the connection's client info properties.
                   void setClientInfo(String name, String value)
                            Sets the value of the client info property specified by name to the value specified by value.
                   void setHoldability(int holdability)
                            (JDBC4 Clarification:) Changes the default holdability of ResultSet objects created using this Connection object to the given holdability.
                   void setNetworkTimeout(Executor executor, int milliseconds)
                            Sets the maximum period a Connection or objects created from the Connection will wait for the database to reply to any one request.
                   void setReadOnly(boolean readOnly)
                            Puts this connection in read-only mode as a hint to the driver to enable database optimizations.
                   Savepoint setSavepoint()
                            Creates an unnamed savepoint in the current transaction and returns the new Savepoint object that represents it.
                   Savepoint setSavepoint(String name)
                            Creates a savepoint with the given name in the current transaction and returns the new Savepoint object that represents it.
                   void setSchema(String schema)
                            Sets the given schema name to access.
                   void setTransactionIsolation(int level)
                            Attempts to change the transaction isolation level for this Connection object to the one given.
                   void setTypeMap(Map<String,Class<?>> map)
                            Installs the given TypeMap object as the type map for this Connection object.
                  <T> T
                  unwrap(Class<T> iface)
                            Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  JDBCConnection

                  public JDBCConnection(org.hsqldb.persist.HsqlProperties props)
                                 throws SQLException
                  Constructs a new external Connection to an HSQLDB Database.

                  This constructor is called on behalf of the java.sql.DriverManager when getting a Connection for use in normal (external) client code.

                  Internal client code, that being code located in HSQLDB SQL functions and stored procedures, receives an INTERNAL connection constructed by the JDBCConnection(SessionInterface) constructor.

                  Parameters:
                  props - A Properties object containing the connection properties
                  Throws:
                  SQLException - when the user/password combination is invalid, the connection url is invalid, or the Database is unavailable.

                  The Database may be unavailable for a number of reasons, including network problems or the fact that it may already be in use by another process.


                  JDBCConnection

                  public JDBCConnection(org.hsqldb.SessionInterface c)
                  Constructs an INTERNAL Connection, using the specified SessionInterface.

                  This constructor is called only on behalf of an existing Session (the internal parallel of a Connection), to be used as a parameter to a SQL function or stored procedure that needs to execute in the context of that Session.

                  When a Java SQL function or stored procedure is called and its first parameter is of type Connection, HSQLDB automatically notices this and constructs an INTERNAL Connection using the current Session. HSQLDB then passes this Connection in the first parameter position, moving any other parameter values specified in the SQL statement to the right by one position.

                  To read more about this, see Routine.

                  Notes:

                  Starting with HSQLDB 1.7.2, INTERNAL connections are not closed by a call to close() or by a SQL DISCONNECT. For HSQLDB developers not involved with writing database internals, this change only applies to connections obtained automatically from the database as the first parameter to Java stored procedures and functions. This is mainly an issue to developers writing custom SQL function and stored procedure libraries for HSQLDB. Presently, it is recommended that SQL function and stored procedure code avoid depending on closing or issuing a DISCONNECT on a connection obtained in this manner.

                  Parameters:
                  c - the Session requesting the construction of this Connection
                  Throws:
                  org.hsqldb.HsqlException - never (reserved for future use);
                  See Also:
                  Routine

                  JDBCConnection

                  public JDBCConnection(JDBCConnection c,
                                        JDBCConnectionEventListener eventListener)
                  Constructor for use with connection pooling and XA.

                  Method Detail

                  createStatement

                  public Statement createStatement()
                                            throws SQLException
                  Creates a Statement object for sending SQL statements to the database. SQL statements without parameters are normally executed using Statement objects. If the same SQL statement is executed many times, it may be more efficient to use a PreparedStatement object.

                  Result sets created using the returned Statement object will by default be type TYPE_FORWARD_ONLY and have a concurrency level of CONCUR_READ_ONLY. The holdability of the created result sets can be determined by calling getHoldability().

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 1.7.2, support for precompilation at the engine level has been implemented, so it is now much more efficient and performant to use a PreparedStatement object if the same short-running SQL statement is to be executed many times.

                  HSQLDB supports TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE and CONCUR_READ_ONLY results.

                  Specified by:
                  createStatement in interface Connection
                  Returns:
                  a new default Statement object
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 clarification:) or this method is called on a closed connection
                  See Also:
                  createStatement(int,int), createStatement(int,int,int)

                  prepareStatement

                  public PreparedStatement prepareStatement(String sql)
                                                     throws SQLException
                  Creates a PreparedStatement object for sending parameterized SQL statements to the database.

                  A SQL statement with or without IN parameters can be pre-compiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.

                  Note: This method is optimized for handling parametric SQL statements that benefit from precompilation. If the driver supports precompilation, the method prepareStatement will send the statement to the database for precompilation. Some drivers may not support precompilation. In this case, the statement may not be sent to the database until the PreparedStatement object is executed. This has no direct effect on users; however, it does affect which methods throw certain SQLException objects.

                  Result sets created using the returned PreparedStatement object will by default be type TYPE_FORWARD_ONLY and have a concurrency level of CONCUR_READ_ONLY. The holdability of the created result sets can be determined by calling getHoldability().

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 1.7.2, support for precompilation at the engine level has been implemented, so it is now much more efficient and performant to use a PreparedStatement object if the same short-running SQL statement is to be executed many times.

                  The support for and behaviour of PreparedStatment complies with SQL and JDBC standards. Please read the introductory section of the documentation for ${link JDBCParameterMetaData}.

                  Specified by:
                  prepareStatement in interface Connection
                  Parameters:
                  sql - an SQL statement that may contain one or more '?' IN parameter placeholders
                  Returns:
                  a new default PreparedStatement object containing the pre-compiled SQL statement
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 clarification:) or this method is called on a closed connection
                  See Also:
                  prepareStatement(String,int,int)

                  prepareCall

                  public CallableStatement prepareCall(String sql)
                                                throws SQLException
                  Creates a CallableStatement object for calling database stored procedures. The CallableStatement object provides methods for setting up its IN and OUT parameters, and methods for executing the call to a stored procedure.

                  Note: This method is optimized for handling stored procedure call statements. Some drivers may send the call statement to the database when the method prepareCall is done; others may wait until the CallableStatement object is executed. This has no direct effect on users; however, it does affect which method throws certain SQLExceptions.

                  Result sets created using the returned CallableStatement object will by default be type TYPE_FORWARD_ONLY and have a concurrency level of CONCUR_READ_ONLY. The holdability of the created result sets can be determined by calling getHoldability().

                  HSQLDB-Specific Information:

                  Starting with 1.7.2, the support for and behaviour of CallableStatement has changed. Please read the introductory section of the documentation for org.hsqldb.jdbc.JDBCCallableStatement.

                  Specified by:
                  prepareCall in interface Connection
                  Parameters:
                  sql - an SQL statement that may contain one or more '?' parameter placeholders. (JDBC4 clarification:) Typically this statement is specified using JDBC call escape syntax.
                  Returns:
                  a new default CallableStatement object containing the pre-compiled SQL statement
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 clarification:) or this method is called on a closed connection
                  See Also:
                  prepareCall(String,int,int)

                  nativeSQL

                  public String nativeSQL(String sql)
                                   throws SQLException
                  Converts the given SQL statement into the system's native SQL grammar. A driver may convert the JDBC SQL grammar into its system's native SQL grammar prior to sending it. This method returns the native form of the statement that the driver would have sent.

                  HSQLDB-Specific Information:

                  HSQLDB converts the JDBC SQL grammar into the system's native SQL grammar prior to sending it, if escape processing is set true; this method returns the native form of the statement that the driver would send in place of client-specified JDBC SQL grammar.

                  Before 1.7.2, escape processing was incomplete and also broken in terms of support for nested escapes.

                  Starting with 1.7.2, escape processing is complete and handles nesting to arbitrary depth, but enforces a very strict interpretation of the syntax and does not detect or process SQL comments.

                  In essence, the HSQLDB engine directly handles the prescribed syntax and date / time formats specified internal to the JDBC escapes. It also directly offers the XOpen / ODBC extended scalar functions specified available internal to the {fn ...} JDBC escape. As such, the driver simply removes the curly braces and JDBC escape codes in the simplest and fastest fashion possible, by replacing them with whitespace. But to avoid a great deal of complexity, certain forms of input whitespace are currently not recognised. For instance, the driver handles "{?= call ...}" but not "{ ?= call ...} or "{? = call ...}"

                  Also, comments embedded in SQL are currently not detected or processed and thus may have unexpected effects on the output of this method, for instance causing otherwise valid SQL to become invalid. It is especially important to be aware of this because escape processing is set true by default for Statement objects and is always set true when producing a PreparedStatement from prepareStatement() or CallableStatement from prepareCall(). Currently, it is simply recommended to avoid submitting SQL having comments containing JDBC escape sequence patterns and/or single or double quotation marks, as this will avoid any potential problems. It is intended to implement a less strict handling of whitespace and proper processing of SQL comments at some point in the near future. In any event, 1.7.2 now correctly processes the following JDBC escape forms to arbitrary nesting depth, but only if the exact whitespace layout described below is used:

                  1. {call ...}
                  2. {?= call ...}
                  3. {fn ...}
                  4. {oj ...}
                  5. {d ...}
                  6. {t ...}
                  7. {ts ...}

                  Specified by:
                  nativeSQL in interface Connection
                  Parameters:
                  sql - an SQL statement that may contain one or more '?' parameter placeholders
                  Returns:
                  the native form of this statement
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 clarification:) or this method is called on a closed connection

                  setAutoCommit

                  public void setAutoCommit(boolean autoCommit)
                                     throws SQLException
                  Sets this connection's auto-commit mode to the given state. If a connection is in auto-commit mode, 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 a call to either the method commit or the method rollback. By default, new connections are in auto-commit mode.

                  The commit occurs when the statement completes. The time when the statement completes depends on the type of SQL Statement:

                  • For DML statements, such as Insert, Update or Delete, and DDL statements, the statement is complete as soon as it has finished executing.
                  • For Select statements, the statement is complete when the associated result set is closed.
                  • For CallableStatement objects or for statements that return multiple results, the statement is complete when all of the associated result sets have been closed, and all update counts and output parameters have been retrieved.

                  NOTE: If this method is called during a transaction and the auto-commit mode is changed, the transaction is committed. If setAutoCommit is called and the auto-commit mode is not changed, the call is a no-op.

                  HSQLDB-Specific Information:

                  Up to and including HSQLDB 2.0,

                  1. All rows of a result set are retrieved internally before the first row can actually be fetched.
                    Therefore, a statement can be considered complete as soon as any XXXStatement.executeXXX method returns.
                  2. Multiple result sets and output parameters are not yet supported.

                  Starting with 2.0, HSQLDB may not return a result set to the network client as a whole; the generic documentation will apply. The fetch size is taken into account (boucherb@users)

                  Specified by:
                  setAutoCommit in interface Connection
                  Parameters:
                  autoCommit - true to enable auto-commit mode; false to disable it
                  Throws:
                  SQLException - if a database access error occurs, (JDBC4 Clarification:) setAutoCommit(true) is called while participating in a distributed transaction, or this method is called on a closed connection
                  See Also:
                  getAutoCommit()

                  getAutoCommit

                  public boolean getAutoCommit()
                                        throws SQLException
                  Retrieves the current auto-commit mode for this Connection object.

                  Specified by:
                  getAutoCommit in interface Connection
                  Returns:
                  the current state of this Connection object's auto-commit mode
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 Clarification:) or this method is called on a closed connection
                  See Also:
                  setAutoCommit(boolean)

                  commit

                  public void commit()
                              throws SQLException
                  Makes all changes made since the previous commit/rollback permanent and releases any database locks currently held by this Connection object. This method should be used only when auto-commit mode has been disabled.

                  HSQLDB-Specific Information:

                  Specified by:
                  commit in interface Connection
                  Throws:
                  SQLException - if a database access error occurs, (JDBC4 Clarification:) this method is called while participating in a distributed transaction, if this method is called on a closed connection or this Connection object is in auto-commit mode
                  See Also:
                  setAutoCommit(boolean)

                  rollback

                  public void rollback()
                                throws SQLException
                  Undoes all changes made in the current transaction and releases any database locks currently held by this Connection object. This method should be used only when auto-commit mode has been disabled.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 1.7.2, savepoints are fully supported both in SQL and via the JDBC interface.

                  Using SQL, savepoints may be set, released and used in rollback as follows:

                   SAVEPOINT <savepoint-name>
                   RELEASE SAVEPOINT <savepoint-name>
                   ROLLBACK TO SAVEPOINT <savepoint-name>
                   

                  Specified by:
                  rollback in interface Connection
                  Throws:
                  SQLException - if a database access error occurs, (JDBC4 Clarification:) this method is called while participating in a distributed transaction, this method is called on a closed connection or this Connection object is in auto-commit mode
                  See Also:
                  setAutoCommit(boolean)

                  close

                  public void close()
                             throws SQLException
                  Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be automatically released.

                  Calling the method close on a Connection object that is already closed is a no-op.

                  It is strongly recommended that an application explicitly commits or rolls back an active transaction prior to calling the close method. If the close method is called and there is an active transaction, the results are implementation-defined.

                  HSQLDB-Specific Information:

                  From 1.7.2, HSQLDB INTERNAL Connection objects are not closable from JDBC client code.

                  Specified by:
                  close in interface Connection
                  Throws:
                  SQLException - SQLException if a database access error occurs

                  isClosed

                  public boolean isClosed()
                                   throws SQLException
                  Retrieves whether this Connection object has been closed. A connection is closed if the method close has been called on it or if certain fatal errors have occurred. This method is guaranteed to return true only when it is called after the method Connection.close has been called.

                  This method generally cannot be called to determine whether a connection to a database is valid or invalid. A typical client can determine that a connection is invalid by catching any exceptions that might be thrown when an operation is attempted.

                  Specified by:
                  isClosed in interface Connection
                  Returns:
                  true if this Connection object is closed; false if it is still open
                  Throws:
                  SQLException - if a database access error occurs

                  getMetaData

                  public DatabaseMetaData getMetaData()
                                               throws SQLException
                  Retrieves a DatabaseMetaData object that contains metadata about the database to which this Connection object represents a connection. The metadata includes information about the database's tables, its supported SQL grammar, its stored procedures, the capabilities of this connection, and so on.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 essentially supports full database metadata.

                  For discussion in greater detail, please follow the link to the overview for JDBCDatabaseMetaData, below.

                  Specified by:
                  getMetaData in interface Connection
                  Returns:
                  a DatabaseMetaData object for this Connection object
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 Clarification) or this method is called on a closed connection
                  See Also:
                  JDBCDatabaseMetaData

                  setReadOnly

                  public void setReadOnly(boolean readOnly)
                                   throws SQLException
                  Puts this connection in read-only mode as a hint to the driver to enable database optimizations.

                  Note: This method cannot be called during a transaction.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports the SQL standard, which will not allow calls to this method to succeed during a transaction.

                  Additionally, HSQLDB provides a way to put a whole database in read-only mode. This is done by manually adding the line 'readonly=true' to the database's .properties file while the database is offline. Upon restart, all connections will be readonly, since the entire database will be readonly. To take a database out of readonly mode, simply take the database offline and remove the line 'readonly=true' from the database's .properties file. Upon restart, the database will be in regular (read-write) mode.

                  When a database is put in readonly mode, its files are opened in readonly mode, making it possible to create CD-based readonly databases. To create a CD-based readonly database that has CACHED tables and whose .data file is suspected of being highly fragmented, it is recommended that the database first be SHUTDOWN COMPACTed before copying the database files to CD. This will reduce the space required and may improve access times against the .data file which holds the CACHED table data.

                  Starting with 1.7.2, an alternate approach to opimizing the .data file before creating a CD-based readonly database is to issue the CHECKPOINT DEFRAG command followed by SHUTDOWN to take the database offline in preparation to burn the database files to CD.

                  Specified by:
                  setReadOnly in interface Connection
                  Parameters:
                  readOnly - true enables read-only mode; false disables it
                  Throws:
                  SQLException - if a database access error occurs, this (JDBC4 Clarification:) method is called on a closed connection or this method is called during a transaction

                  isReadOnly

                  public boolean isReadOnly()
                                     throws SQLException
                  Retrieves whether this Connection object is in read-only mode.

                  Specified by:
                  isReadOnly in interface Connection
                  Returns:
                  true if this Connection object is read-only; false otherwise
                  Throws:
                  SQLException - SQLException if a database access error occurs (JDBC4 Clarification:) or this method is called on a closed connection

                  setCatalog

                  public void setCatalog(String catalog)
                                  throws SQLException
                  Sets the given catalog name in order to select a subspace of this Connection object's database in which to work.

                  (JDBC4 Clarification:)

                  If the driver does not support catalogs, it will silently ignore this request. JDBC 4.1[

                  Calling setCatalog has no effect on previously created or prepared Statement objects. It is implementation defined whether a DBMS prepare operation takes place immediately when the Connection method prepareStatement or prepareCall is invoked. For maximum portability, setCatalog should be called before a Statement is created or prepared.]

                  HSQLDB-Specific Information:

                  HSQLDB supports a single catalog per database. If the given catalog name is not the same as the database catalog name, this method throws an error.

                  Specified by:
                  setCatalog in interface Connection
                  Parameters:
                  catalog - the name of a catalog (subspace in this Connection object's database) in which to work
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 Clarification) or this method is called on a closed connection
                  See Also:
                  getCatalog()

                  getCatalog

                  public String getCatalog()
                                    throws SQLException
                  Retrieves this Connection object's current catalog name.

                  HSQLDB-Specific Information:

                  HSQLDB supports a single catalog per database. This method returns the catalog name for the current database error.

                  Specified by:
                  getCatalog in interface Connection
                  Returns:
                  the current catalog name or null if there is none
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 Clarification:) or this method is called on a closed connection
                  See Also:
                  setCatalog(java.lang.String)

                  setTransactionIsolation

                  public void setTransactionIsolation(int level)
                                               throws SQLException
                  Attempts to change the transaction isolation level for this Connection object to the one given. The constants defined in the interface Connection are the possible transaction isolation levels.

                  Note: If this method is called during a transaction, the result is implementation-defined.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 accepts all isolation levels. Connection.TRANSACTION_READ_UNCOMMITED is promoted to Connection.TRANSACTION_READ_COMMITED, but the transactions become read only. Calling this method during a transaction always succeeds and the selected isolation level is used from the next transaction.

                  Specified by:
                  setTransactionIsolation in interface Connection
                  Parameters:
                  level - one of the following Connection constants: Connection.TRANSACTION_READ_UNCOMMITTED, Connection.TRANSACTION_READ_COMMITTED, Connection.TRANSACTION_REPEATABLE_READ, or Connection.TRANSACTION_SERIALIZABLE. (Note that Connection.TRANSACTION_NONE cannot be used because it specifies that transactions are not supported.)
                  Throws:
                  SQLException - if a database access error occurs, this (JDBC4 Clarification:) method is called on a closed connection (:JDBC4 End Clarification) or the given parameter is not one of the Connection constants
                  See Also:
                  JDBCDatabaseMetaData.supportsTransactionIsolationLevel(int), getTransactionIsolation()

                  getTransactionIsolation

                  public int getTransactionIsolation()
                                              throws SQLException
                  Retrieves this Connection object's current transaction isolation level.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 supports all isolation levels. Connection.TRANSACTION_READ_UNCOMMITED is promoted to Connection.TRANSACTION_READ_COMMITED.

                  Specified by:
                  getTransactionIsolation in interface Connection
                  Returns:
                  the current transaction isolation level, which will be one of the following constants: Connection.TRANSACTION_READ_UNCOMMITTED, Connection.TRANSACTION_READ_COMMITTED, Connection.TRANSACTION_REPEATABLE_READ, Connection.TRANSACTION_SERIALIZABLE, or Connection.TRANSACTION_NONE.
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 Clarification:) or this method is called on a closed connection
                  See Also:
                  JDBCDatabaseMetaData.supportsTransactionIsolationLevel(int), setTransactionIsolation(int)

                  getWarnings

                  public SQLWarning getWarnings()
                                         throws SQLException
                  Retrieves the first warning reported by calls on this Connection object. If there is more than one warning, subsequent warnings will be chained to the first one and can be retrieved by calling the method SQLWarning.getNextWarning on the warning that was retrieved previously.

                  This method may not be called on a closed connection; doing so will cause an SQLException to be thrown.

                  Note: Subsequent warnings will be chained to this SQLWarning.

                  HSQLDB-Specific Information:

                  HSQLDB produces warnings whenever a createStatement(), prepareStatement() or prepareCall() invocation requests an unsupported but defined combination of result set type, concurrency and holdability, such that another set is substituted.

                  Other warnings are typically raised during the execution of data change and query statements.

                  Only the warnings caused by the last operation on this connection are returned by this method. A single operation may return up to 10 chained warnings.

                  Specified by:
                  getWarnings in interface Connection
                  Returns:
                  the first SQLWarning object or null if there are none
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed connection
                  See Also:
                  SQLWarning

                  clearWarnings

                  public void clearWarnings()
                                     throws SQLException
                  Clears all warnings reported for this Connection object. After a call to this method, the method getWarnings returns null until a new warning is reported for this Connection object.

                  HSQLDB-Specific Information:

                  The standard behaviour is implemented.

                  Specified by:
                  clearWarnings in interface Connection
                  Throws:
                  SQLException - SQLException if a database access error occurs (JDBC4 Clarification:) or this method is called on a closed connection

                  createStatement

                  public Statement createStatement(int resultSetType,
                                                   int resultSetConcurrency)
                                            throws SQLException
                  Creates a Statement object that will generate ResultSet objects with the given type and concurrency. This method is the same as the createStatement method above, but it allows the default result set type and concurrency to be overridden. The holdability of the created result sets can be determined by calling getHoldability().

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 adheres closely to SQL and JDBC standards. The interpretation of of resultSetType and resultSetConcurrency has changed in this version.

                  HSQLDB supports TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY, CONCUR_UPDATABLE results.

                  If an unsupported combination is requested, a SQLWarning is issued on this Connection and the closest supported combination is used instead.

                  Specified by:
                  createStatement in interface Connection
                  Parameters:
                  resultSetType - a result set type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  resultSetConcurrency - a concurrency type; one of ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE
                  Returns:
                  a new Statement object that will generate ResultSet objects with the given type and concurrency
                  Throws:
                  SQLException - if a database access error occurs, this (JDBC4 Clarification:) method is called on a closed connection (:JDBC4 Clarification) or the given parameters are not ResultSet constants indicating type and concurrency
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method or this method is not supported for the specified result set type and result set concurrency.
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCConnection)

                  prepareStatement

                  public PreparedStatement prepareStatement(String sql,
                                                            int resultSetType,
                                                            int resultSetConcurrency)
                                                     throws SQLException
                  Creates a PreparedStatement object that will generate ResultSet objects with the given type and concurrency. This method is the same as the prepareStatement method above, but it allows the default result set type and concurrency to be overridden. (JDBC4 Clarification:) The holdability of the created result sets can be determined by calling getHoldability().

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 adheres closely to SQL and JDBC standards. The interpretation of of resultSetType and resultSetConcurrency has changed in this version.

                  HSQLDB supports TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY, CONCUR_UPDATABLE results.

                  If an unsupported combination is requested, a SQLWarning is issued on this Connection and the closest supported combination is used instead.

                  Specified by:
                  prepareStatement in interface Connection
                  Parameters:
                  sql - a String object that is the SQL statement to be sent to the database; may contain one or more '?' IN parameters
                  resultSetType - a result set type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  resultSetConcurrency - a concurrency type; one of ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE
                  Returns:
                  a new PreparedStatement object containing the pre-compiled SQL statement that will produce ResultSet objects with the given type and concurrency
                  Throws:
                  SQLException - if a database access error occurs, this (JDBC4 Clarification:) method is called on a closed connection (:JDBC4 Clarification) or the given parameters are not ResultSet constants indicating type and concurrency
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method or this method is not supported for the specified result set type and result set concurrency.
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCConnection)

                  prepareCall

                  public CallableStatement prepareCall(String sql,
                                                       int resultSetType,
                                                       int resultSetConcurrency)
                                                throws SQLException
                  Creates a CallableStatement object that will generate ResultSet objects with the given type and concurrency. This method is the same as the prepareCall method above, but it allows the default result set type and concurrency to be overridden. (JDBC4 Clarification:) The holdability of the created result sets can be determined by calling getHoldability().

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 adheres closely to SQL and JDBC standards. The interpretation of of resultSetType and resultSetConcurrency has changed in this version.

                  HSQLDB supports TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY, CONCUR_UPDATABLE results.

                  If an unsupported combination is requested, a SQLWarning is issued on this Connection and the closest supported combination is used instead.

                  Specified by:
                  prepareCall in interface Connection
                  Parameters:
                  sql - a String object that is the SQL statement to be sent to the database; may contain on or more '?' parameters
                  resultSetType - a result set type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  resultSetConcurrency - a concurrency type; one of ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE
                  Returns:
                  a new CallableStatement object containing the pre-compiled SQL statement that will produce ResultSet objects with the given type and concurrency
                  Throws:
                  SQLException - if a database access error occurs, this method (JDBC4 Clarification:) is called on a closed connection (:JDBC4 Clarification) or the given parameters are not ResultSet constants indicating type and concurrency
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method or this method is not supported for the specified result set type and result set concurrency.
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCConnection)

                  getTypeMap

                  public Map<String,Class<?>> getTypeMap()
                                                  throws SQLException
                  Retrieves the Map object associated with this Connection object. Unless the application has added an entry, the type map returned will be empty. JDBC 4.1[

                  You must invoke setTypeMap after making changes to the Map object returned from getTypeMap as a JDBC driver may create an internal copy of the Map object passed to setTypeMap:

                        Map<String,Class<?>> myMap = con.getTypeMap();
                        myMap.put("mySchemaName.ATHLETES", Athletes.class);
                        con.setTypeMap(myMap);
                   
                  ]

                  HSQLDB-Specific Information:

                  For compatibility, HSQLDB returns an empty map.

                  Specified by:
                  getTypeMap in interface Connection
                  Returns:
                  the java.util.Map object associated with this Connection object
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 Clarification:) or this method is called on a closed connection
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCConnection)
                  See Also:
                  setTypeMap(java.util.Map>)

                  setTypeMap

                  public void setTypeMap(Map<String,Class<?>> map)
                                  throws SQLException
                  Installs the given TypeMap object as the type map for this Connection object. The type map will be used for the custom mapping of SQL structured types and distinct types. JDBC4.1[

                  You must set the the values for the TypeMap prior to calling setMap as a JDBC driver may create an internal copy of the TypeMap:

                        Map myMap<String,Class<?>> = new HashMap<String,Class<?>>();
                        myMap.put("mySchemaName.ATHLETES", Athletes.class);
                        con.setTypeMap(myMap);
                   
                  ]

                  HSQLDB-Specific Information:

                  HSQLDB does not yet support this feature. Calling this method always throws a SQLException, stating that the function is not supported.

                  Specified by:
                  setTypeMap in interface Connection
                  Parameters:
                  map - the java.util.Map object to install as the replacement for this Connection object's default type map
                  Throws:
                  SQLException - if a database access error occurs, this (JDBC4 Clarification:) method is called on a closed connection or (:JDBC4 Clarification) the given parameter is not a java.util.Map object
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCConnection)
                  See Also:
                  getTypeMap()

                  setHoldability

                  public void setHoldability(int holdability)
                                      throws SQLException
                  (JDBC4 Clarification:) Changes the default holdability of ResultSet objects created using this Connection object to the given holdability. The default holdability of ResultSet objects can be be determined by invoking DatabaseMetaData.getResultSetHoldability().

                  HSQLDB-Specific Information:

                  HSQLDB supports this feature.

                  Specified by:
                  setHoldability in interface Connection
                  Parameters:
                  holdability - a ResultSet holdability constant; one of ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT
                  Throws:
                  SQLException - if a database access occurs, this method is called (JDBC4 Clarification:) on a closed connection, or the given parameter (:JDBC4 Clarification) is not a ResultSet constant indicating holdability
                  SQLFeatureNotSupportedException - if the given holdability is not supported
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  getHoldability(), DatabaseMetaData.getResultSetHoldability(), JDBCResultSet

                  getHoldability

                  public int getHoldability()
                                     throws SQLException
                  Retrieves the current holdability of ResultSet objects created using this Connection object.

                  HSQLDB-Specific Information:

                  HSQLDB returns the current holdability.

                  The default is HOLD_CURSORS_OVER_COMMIT.

                  Specified by:
                  getHoldability in interface Connection
                  Returns:
                  the holdability, one of ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 Clarification:) or this method is called on a closed connection
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  setHoldability(int), DatabaseMetaData.getResultSetHoldability(), JDBCResultSet

                  setSavepoint

                  public Savepoint setSavepoint()
                                         throws SQLException
                  Creates an unnamed savepoint in the current transaction and returns the new Savepoint object that represents it.

                  (JDBC4 clarification:) if setSavepoint is invoked outside of an active transaction, a transaction will be started at this newly created savepoint.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB supports this feature.

                  Note: Unnamed savepoints are not part of the SQL:2003 standard. Use setSavepoint(String name) instead.

                  Specified by:
                  setSavepoint in interface Connection
                  Returns:
                  the new Savepoint object
                  Throws:
                  SQLException - if a database access error occurs, (JDBC4 Clarification:) this method is called while participating in a distributed transaction, this method is called on a closed connection or this Connection object is currently in auto-commit mode
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  JDBCSavepoint, Savepoint

                  setSavepoint

                  public Savepoint setSavepoint(String name)
                                         throws SQLException
                  Creates a savepoint with the given name in the current transaction and returns the new Savepoint object that represents it.

                  if setSavepoint is invoked outside of an active transaction, a transaction will be started at this newly created savepoint.

                  HSQLDB-Specific Information:

                  Previous to JDBC 4, if the connection is autoCommit, setting a savepoint has no effect, as it is cleared upon the execution of the next transactional statement. When built for JDBC 4, this method throws an SQLException when this Connection object is currently in auto-commit mode, as per the JDBC 4 standard.

                  Specified by:
                  setSavepoint in interface Connection
                  Parameters:
                  name - a String containing the name of the savepoint
                  Returns:
                  the new Savepoint object
                  Throws:
                  SQLException - if a database access error occurs, (JDBC4 Clarification:) this method is called while participating in a distributed transaction, this method is called on a closed connection or this Connection object is currently in auto-commit mode
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  JDBCSavepoint, Savepoint

                  rollback

                  public void rollback(Savepoint savepoint)
                                throws SQLException
                  Undoes all changes made after the given Savepoint object was set.

                  This method should be used only when auto-commit has been disabled.

                  HSQLDB-Specific Information:

                  Previous to JDBC 4, JDBCSavepoint objects are valid for the life of the originating Connection object and hence can be used interchangeably, as long as they have equal savepoint names.

                  When built for JDBC 4, JDBCConnection objects invalidate JDBCSavepoint objects when auto-commit mode is entered as well as when they are used to successfully release or roll back to a named SQL savepoint. As per the JDBC 4 standard, when built for JDBC 4, this method throws an SQLException when this Connection object is currently in auto-commit mode and an invalidated JDBCSavepoint is specified.

                  Specified by:
                  rollback in interface Connection
                  Parameters:
                  savepoint - the Savepoint object to roll back to
                  Throws:
                  SQLException - if a database access error occurs, this method is called while participating in a distributed transaction, this method is called on a closed connection, the Savepoint object is no longer valid, or this Connection object is currently in auto-commit mode
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  JDBCSavepoint, Savepoint, rollback()

                  releaseSavepoint

                  public void releaseSavepoint(Savepoint savepoint)
                                        throws SQLException
                  Removes the specified Savepoint (JDBC4 Clarification:) and subsequent Savepoint objects from the current transaction. Any reference to the savepoint after it have been removed will cause an SQLException to be thrown. HSLQDB Note:

                  Previous to JDBC 4, JDBCSavepoint objects are valid for the life of the originating Connection object and hence can be used interchangeably, as long as they have equal savepoint names.

                  When built for JDBC 4, JDBCConnection objects invalidate JDBCSavepoint objects when auto-commit mode is entered as well as when they are used to successfully release or roll back to a named SQL savepoint. As per the JDBC 4 standard, when built for JDBC 4, this method throws an SQLException when this Connection object is currently in auto-commit mode and when an invalidated JDBCSavepoint is specified.

                  Specified by:
                  releaseSavepoint in interface Connection
                  Parameters:
                  savepoint - the Savepoint object to be removed
                  Throws:
                  SQLException - if a database access error occurs, this (JDBC4 Clarification:) method is called on a closed connection or the given Savepoint object is not a valid savepoint in the current transaction
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  JDBCSavepoint, Savepoint

                  createStatement

                  public Statement createStatement(int resultSetType,
                                                   int resultSetConcurrency,
                                                   int resultSetHoldability)
                                            throws SQLException
                  Creates a Statement object that will generate ResultSet objects with the given type, concurrency, and holdability. This method is the same as the createStatement method above, but it allows the default result set type, concurrency, and holdability to be overridden.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 adheres closely to SQL and JDBC standards. The interpretation of of resultSetType and resultSetConcurrency has changed in this version.

                  HSQLDB supports TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY, CONCUR_UPDATABLE results.

                  If an unsupported combination is requested, a SQLWarning is issued on this Connection and the closest supported combination is used instead.

                  Specified by:
                  createStatement in interface Connection
                  Parameters:
                  resultSetType - one of the following ResultSet constants: ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  resultSetConcurrency - one of the following ResultSet constants: ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE
                  resultSetHoldability - one of the following ResultSet constants: ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT
                  Returns:
                  a new Statement object that will generate ResultSet objects with the given type, concurrency, and holdability
                  Throws:
                  SQLException - if a database access error occurs, this (JDBC4 Clarification:) method is called on a closed connection (:JDBC4 Clarification) or the given parameters are not ResultSet constants indicating type, concurrency, and holdability
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method or this method is not supported for the specified result set type, result set holdability and result set concurrency.
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  JDBCResultSet

                  prepareStatement

                  public PreparedStatement prepareStatement(String sql,
                                                            int resultSetType,
                                                            int resultSetConcurrency,
                                                            int resultSetHoldability)
                                                     throws SQLException
                  Creates a PreparedStatement object that will generate ResultSet objects with the given type, concurrency, and holdability.

                  This method is the same as the prepareStatement method above, but it allows the default result set type, concurrency, and holdability to be overridden.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 adheres closely to SQL and JDBC standards. The interpretation of of resultSetType and resultSetConcurrency has changed in this version.

                  HSQLDB supports TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY, CONCUR_UPDATABLE results.

                  HOLD_CURSORS_OVER_COMMIT is supported only when CONCUR_READ_ONLY is requested.

                  If an unsupported combination is requested, a SQLWarning is issued on this Connection and the closest supported combination is used instead.

                  Specified by:
                  prepareStatement in interface Connection
                  Parameters:
                  sql - a String object that is the SQL statement to be sent to the database; may contain one or more '?' IN parameters
                  resultSetType - one of the following ResultSet constants: ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  resultSetConcurrency - one of the following ResultSet constants: ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE
                  resultSetHoldability - one of the following ResultSet constants: ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT
                  Returns:
                  a new PreparedStatement object, containing the pre-compiled SQL statement, that will generate ResultSet objects with the given type, concurrency, and holdability
                  Throws:
                  SQLException - if a database access error occurs, this (JDBC4 Clarification:) method is called on a closed connection (:JDBC4 Clarification) or the given parameters are not ResultSet constants indicating type, concurrency, and holdability
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method or this method is not supported for the specified result set type, result set holdability and result set concurrency.
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  JDBCResultSet

                  prepareCall

                  public CallableStatement prepareCall(String sql,
                                                       int resultSetType,
                                                       int resultSetConcurrency,
                                                       int resultSetHoldability)
                                                throws SQLException
                  Creates a CallableStatement object that will generate ResultSet objects with the given type and concurrency. This method is the same as the prepareCall method above, but it allows the default result set type, result set concurrency type and holdability to be overridden.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 adheres closely to SQL and JDBC standards. The interpretation of of resultSetType and resultSetConcurrency has changed in this version.

                  HSQLDB supports TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY, CONCUR_UPDATABLE results.

                  If an unsupported combination is requested, a SQLWarning is issued on this Connection and the closest supported combination is used instead.

                  Specified by:
                  prepareCall in interface Connection
                  Parameters:
                  sql - a String object that is the SQL statement to be sent to the database; may contain on or more '?' parameters
                  resultSetType - one of the following ResultSet constants: ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  resultSetConcurrency - one of the following ResultSet constants: ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE
                  resultSetHoldability - one of the following ResultSet constants: ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT
                  Returns:
                  a new CallableStatement object, containing the pre-compiled SQL statement, that will generate ResultSet objects with the given type, concurrency, and holdability
                  Throws:
                  SQLException - if a database access error occurs, this (JDBC4 Clarification:) method is called on a closed connection (:JDBC4 Clarification) or the given parameters are not ResultSet constants indicating type, concurrency, and holdability
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method or this method is not supported for the specified result set type, result set holdability and result set concurrency.
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  JDBCResultSet

                  prepareStatement

                  public PreparedStatement prepareStatement(String sql,
                                                            int autoGeneratedKeys)
                                                     throws SQLException
                  Creates a default PreparedStatement object that has the capability to retrieve auto-generated keys. The given constant tells the driver whether it should make auto-generated keys available for retrieval. This parameter is ignored if the SQL statement is not an INSERT statement, or an SQL statement able to return auto-generated keys (the list of such statements is vendor-specific).

                  Note: This method is optimized for handling parametric SQL statements that benefit from pre-compilation. If the driver supports pre-compilation, the method prepareStatement will send the statement to the database for pre-compilation. Some drivers may not support pre-compilation. In this case, the statement may not be sent to the database until the PreparedStatement object is executed. This has no direct effect on users; however, it does affect which methods throw certain SQLExceptions.

                  Result sets created using the returned PreparedStatement object will by default be type TYPE_FORWARD_ONLY and have a concurrency level of CONCUR_READ_ONLY. (JDBC4 Clarification:) The holdability of the created result sets can be determined by calling getHoldability().

                  HSQLDB-Specific Information:

                  Starting with version 2.0, HSQLDB supports returning generated columns with single-row and multi-row INSERT, UPDATE and MERGE statements.

                  If the table has an IDENTITY or GENERATED column(s) the values for these columns are returned in the next call to getGeneratedKeys() after each execution of the PreparedStatement.

                  Specified by:
                  prepareStatement in interface Connection
                  Parameters:
                  sql - an SQL statement that may contain one or more '?' IN parameter placeholders
                  autoGeneratedKeys - a flag indicating whether auto-generated keys should be returned; one of Statement.RETURN_GENERATED_KEYS or Statement.NO_GENERATED_KEYS
                  Returns:
                  a new PreparedStatement object, containing the pre-compiled SQL statement, that will have the capability of returning auto-generated keys
                  Throws:
                  SQLException - if a database access error occurs, this (JDBC4 Clarification:) method is called on a closed connection (:JDBC4 Clarification) or the given parameter is not a Statement constant indicating whether auto-generated keys should be returned
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method with a constant of Statement.RETURN_GENERATED_KEYS
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  prepareStatement

                  public PreparedStatement prepareStatement(String sql,
                                                            int[] columnIndexes)
                                                     throws SQLException
                  Creates a default PreparedStatement object capable of returning the auto-generated keys designated by the given array. This array contains the indexes of the columns in the target table that contain the auto-generated keys that should be made available. The driver will ignore the array if the SQL statement is not an INSERT statement, or an SQL statement able to return auto-generated keys (the list of such statements is vendor-specific).

                  An SQL statement with or without IN parameters can be pre-compiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.

                  Note: This method is optimized for handling parametric SQL statements that benefit from pre-compilation. If the driver supports pre-compilation, the method prepareStatement will send the statement to the database for pre-compilation. Some drivers may not support pre-compilation. In this case, the statement may not be sent to the database until the PreparedStatement object is executed. This has no direct effect on users; however, it does affect which methods throw certain SQLExceptions.

                  Result sets created using the returned PreparedStatement object will by default be type TYPE_FORWARD_ONLY and have a concurrency level of CONCUR_READ_ONLY. (JDBC4 Clarification:) The holdability of the created result sets can be determined by calling getHoldability().

                  HSQLDB-Specific Information:

                  Starting with version 2.0, HSQLDB supports returning generated columns with single-row and multi-row INSERT, UPDATE and MERGE statements.

                  The columnIndexes may specify any set of columns of the table.

                  Specified by:
                  prepareStatement in interface Connection
                  Parameters:
                  sql - an SQL statement that may contain one or more '?' IN parameter placeholders
                  columnIndexes - an array of column indexes indicating the columns that should be returned from the inserted row or rows
                  Returns:
                  a new PreparedStatement object, containing the pre-compiled statement, that is capable of returning the auto-generated keys designated by the given array of column indexes
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 Clarification:) or this method is called on a closed connection
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  prepareStatement

                  public PreparedStatement prepareStatement(String sql,
                                                            String[] columnNames)
                                                     throws SQLException
                  Creates a default PreparedStatement object capable of returning the auto-generated keys designated by the given array. This array contains the names of the columns in the target table that contain the auto-generated keys that should be returned. The driver will ignore the array if the SQL statement is not an INSERT statement, or an SQL statement able to return auto-generated keys (the list of such statements is vendor-specific).

                  An SQL statement with or without IN parameters can be pre-compiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.

                  Note: This method is optimized for handling parametric SQL statements that benefit from pre-compilation. If the driver supports pre-compilation, the method prepareStatement will send the statement to the database for pre-compilation. Some drivers may not support pre-compilation. In this case, the statement may not be sent to the database until the PreparedStatement object is executed. This has no direct effect on users; however, it does affect which methods throw certain SQLExceptions.

                  Result sets created using the returned PreparedStatement object will by default be type TYPE_FORWARD_ONLY and have a concurrency level of CONCUR_READ_ONLY. (JDBC4 Clarification:) The holdability of the created result sets can be determined by calling getHoldability().

                  HSQLDB-Specific Information:

                  Starting with version 2.0, HSQLDB supports returning generated columns with single-row and multi-row INSERT, UPDATE and MERGE statements.

                  The columnNames may specify any set of columns of the table.

                  Specified by:
                  prepareStatement in interface Connection
                  Parameters:
                  sql - an SQL statement that may contain one or more '?' IN parameter placeholders
                  columnNames - an array of column names indicating the columns that should be returned from the inserted row or rows
                  Returns:
                  a new PreparedStatement object, containing the pre-compiled statement, that is capable of returning the auto-generated keys designated by the given array of column names
                  Throws:
                  SQLException - if a database access error occurs (JDBC4 Clarification:) or this method is called on a closed connection
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  createClob

                  public Clob createClob()
                                  throws SQLException
                  Constructs an object that implements the Clob interface. The object returned initially contains no data. The setAsciiStream, setCharacterStream and setString methods of the Clob interface may be used to add data to the Clob.

                  Specified by:
                  createClob in interface Connection
                  Returns:
                  An object that implements the Clob interface
                  Throws:
                  SQLException - if an object that implements the Clob interface can not be constructed, this method is called on a closed connection or a database access error occurs.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this data type
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  createBlob

                  public Blob createBlob()
                                  throws SQLException
                  Constructs an object that implements the Blob interface. The object returned initially contains no data. The setBinaryStream and setBytes methods of the Blob interface may be used to add data to the Blob.

                  Specified by:
                  createBlob in interface Connection
                  Returns:
                  An object that implements the Blob interface
                  Throws:
                  SQLException - if an object that implements the Blob interface can not be constructed, this method is called on a closed connection or a database access error occurs.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this data type
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  createNClob

                  public NClob createNClob()
                                    throws SQLException
                  Constructs an object that implements the NClob interface. The object returned initially contains no data. The setAsciiStream, setCharacterStream and setString methods of the NClob interface may be used to add data to the NClob.

                  Specified by:
                  createNClob in interface Connection
                  Returns:
                  An object that implements the NClob interface
                  Throws:
                  SQLException - if an object that implements the NClob interface can not be constructed, this method is called on a closed connection or a database access error occurs.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this data type
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  createSQLXML

                  public SQLXML createSQLXML()
                                      throws SQLException
                  Constructs an object that implements the SQLXML interface. The object returned initially contains no data. The createXmlStreamWriter object and setString method of the SQLXML interface may be used to add data to the SQLXML object.

                  Specified by:
                  createSQLXML in interface Connection
                  Returns:
                  An object that implements the SQLXML interface
                  Throws:
                  SQLException - if an object that implements the SQLXML interface can not be constructed, this method is called on a closed connection or a database access error occurs.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this data type
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  isValid

                  public boolean isValid(int timeout)
                                  throws SQLException
                  Returns true if the connection has not been closed and is still valid. The driver shall submit a query on the connection or use some other mechanism that positively verifies the connection is still valid when this method is called.

                  The query submitted by the driver to validate the connection shall be executed in the context of the current transaction.

                  HSQLDB-Specific Information:

                  HSQLDB uses a maximum timeout of 60 seconds if timeout has be specified as zero.

                  Specified by:
                  isValid in interface Connection
                  Parameters:
                  timeout - - The time in seconds to wait for the database operation used to validate the connection to complete. If the timeout period expires before the operation completes, this method returns false. A value of 0 indicates a timeout is not applied to the database operation.

                  Returns:
                  true if the connection is valid, false otherwise
                  Throws:
                  SQLException - if the value supplied for timeout is less then 0
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  See Also:
                  JDBCDatabaseMetaData.getClientInfoProperties()

                  setClientInfo

                  public void setClientInfo(String name,
                                            String value)
                                     throws SQLClientInfoException
                  Sets the value of the client info property specified by name to the value specified by value.

                  Applications may use the DatabaseMetaData.getClientInfoProperties method to determine the client info properties supported by the driver and the maximum length that may be specified for each property.

                  The driver stores the value specified in a suitable location in the database. For example in a special register, session parameter, or system table column. For efficiency the driver may defer setting the value in the database until the next time a statement is executed or prepared. Other than storing the client information in the appropriate place in the database, these methods shall not alter the behavior of the connection in anyway. The values supplied to these methods are used for accounting, diagnostics and debugging purposes only.

                  The driver shall generate a warning if the client info name specified is not recognized by the driver.

                  If the value specified to this method is greater than the maximum length for the property the driver may either truncate the value and generate a warning or generate a SQLClientInfoException. If the driver generates a SQLClientInfoException, the value specified was not set on the connection.

                  The following are standard client info properties. Drivers are not required to support these properties however if the driver supports a client info property that can be described by one of the standard properties, the standard property name should be used.

                  • ApplicationName - The name of the application currently utilizing the connection
                  • ClientUser - The name of the user that the application using the connection is performing work for. This may not be the same as the user name that was used in establishing the connection.
                  • ClientHostname - The host name of the computer the application using the connection is running on.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0, throws an SQLClientInfoException when this method is called.

                  Specified by:
                  setClientInfo in interface Connection
                  Parameters:
                  name - The name of the client info property to set
                  value - The value to set the client info property to. If the value is null, the current value of the specified property is cleared.

                  Throws:
                  SQLClientInfoException - if the database server returns an error while setting the client info value on the database server or this method is called on a closed connection

                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setClientInfo

                  public void setClientInfo(Properties properties)
                                     throws SQLClientInfoException
                  Sets the value of the connection's client info properties. The Properties object contains the names and values of the client info properties to be set. The set of client info properties contained in the properties list replaces the current set of client info properties on the connection. If a property that is currently set on the connection is not present in the properties list, that property is cleared. Specifying an empty properties list will clear all of the properties on the connection. See setClientInfo (String, String) for more information.

                  If an error occurs in setting any of the client info properties, a SQLClientInfoException is thrown. The SQLClientInfoException contains information indicating which client info properties were not set. The state of the client information is unknown because some databases do not allow multiple client info properties to be set atomically. For those databases, one or more properties may have been set before the error occurred.

                  Specified by:
                  setClientInfo in interface Connection
                  Parameters:
                  properties - the list of client info properties to set

                  Throws:
                  SQLClientInfoException - if the database server returns an error while setting the clientInfo values on the database server or this method is called on a closed connection

                  Since:
                  JDK 1.6, HSQLDB 2.0

                  See Also:
                  setClientInfo(String, String)

                  getClientInfo

                  public String getClientInfo(String name)
                                       throws SQLException
                  Returns the value of the client info property specified by name. This method may return null if the specified client info property has not been set and does not have a default value. This method will also return null if the specified client info property name is not supported by the driver.

                  Applications may use the DatabaseMetaData.getClientInfoProperties method to determine the client info properties supported by the driver.

                  Specified by:
                  getClientInfo in interface Connection
                  Parameters:
                  name - The name of the client info property to retrieve

                  Returns:
                  The value of the client info property specified

                  Throws:
                  SQLException - if the database server returns an error when fetching the client info value from the database or this method is called on a closed connection

                  Since:
                  JDK 1.6, HSQLDB 2.0

                  See Also:
                  DatabaseMetaData.getClientInfoProperties()

                  getClientInfo

                  public Properties getClientInfo()
                                           throws SQLException
                  Returns a list containing the name and current value of each client info property supported by the driver. The value of a client info property may be null if the property has not been set and does not have a default value.

                  Specified by:
                  getClientInfo in interface Connection
                  Returns:
                  A Properties object that contains the name and current value of each of the client info properties supported by the driver.

                  Throws:
                  SQLException - if the database server returns an error when fetching the client info values from the database or this method is called on a closed connection

                  Since:
                  JDK 1.6, HSQLDB 2.0

                  createArrayOf

                  public Array createArrayOf(String typeName,
                                             Object[] elements)
                                      throws SQLException
                  Factory method for creating Array objects.

                  Note: When createArrayOf is used to create an array object that maps to a primitive data type, then it is implementation-defined whether the Array object is an array of that primitive data type or an array of Object.

                  Note: The JDBC driver is responsible for mapping the elements Object array to the default JDBC SQL type defined in java.sql.Types for the given class of Object. The default mapping is specified in Appendix B of the JDBC specification. If the resulting JDBC type is not the appropriate type for the given typeName then it is implementation defined whether an SQLException is thrown or the driver supports the resulting conversion.

                  Specified by:
                  createArrayOf in interface Connection
                  Parameters:
                  typeName - the SQL name of the type the elements of the array map to. The typeName is a database-specific name which may be the name of a built-in type, a user-defined type or a standard SQL type supported by this database. This is the value returned by Array.getBaseTypeName
                  elements - the elements that populate the returned object
                  Returns:
                  an Array object whose elements map to the specified SQL type
                  Throws:
                  SQLException - if a database error occurs, the JDBC type is not appropriate for the typeName and the conversion is not supported, the typeName is null or this method is called on a closed connection
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this data type
                  Since:
                  1.6

                  createStruct

                  public Struct createStruct(String typeName,
                                             Object[] attributes)
                                      throws SQLException
                  Factory method for creating Struct objects.

                  Specified by:
                  createStruct in interface Connection
                  Parameters:
                  typeName - the SQL type name of the SQL structured type that this Struct object maps to. The typeName is the name of a user-defined type that has been defined for this database. It is the value returned by Struct.getSQLTypeName.
                  attributes - the attributes that populate the returned object
                  Returns:
                  a Struct object that maps to the given SQL type and is populated with the given attributes
                  Throws:
                  SQLException - if a database error occurs, the typeName is null or this method is called on a closed connection
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this data type
                  Since:
                  JDK 1.6_b80, HSQLDB 2.0

                  unwrap

                  public <T> T unwrap(Class<T> iface)
                           throws SQLException
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy. If the receiver implements the interface then the result is the receiver or a proxy for the receiver. If the receiver is a wrapper and the wrapped object implements the interface then the result is the wrapped object or a proxy for the wrapped object. Otherwise return the the result of calling unwrap recursively on the wrapped object or a proxy for that result. If the receiver is not a wrapper and does not implement the interface, then an SQLException is thrown.

                  Specified by:
                  unwrap in interface Wrapper
                  Type Parameters:
                  T - by which the return type is inferred from input parameter.
                  Parameters:
                  iface - A Class defining an interface that the result must implement.
                  Returns:
                  an object that implements the interface. May be a proxy for the actual implementing object.
                  Throws:
                  SQLException - If no object found that implements the interface
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  isWrapperFor

                  public boolean isWrapperFor(Class<?> iface)
                                       throws SQLException
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does. Returns false otherwise. If this implements the interface then return true, else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped object. If this does not implement the interface and is not a wrapper, return false. This method should be implemented as a low-cost operation compared to unwrap so that callers can use this method to avoid expensive unwrap calls that may fail. If this method returns true then calling unwrap with the same argument should succeed.

                  Specified by:
                  isWrapperFor in interface Wrapper
                  Parameters:
                  iface - a Class defining an interface.
                  Returns:
                  true if this implements the interface or directly or indirectly wraps an object that does.
                  Throws:
                  SQLException - if an error occurs while determining whether this is a wrapper for an object with the given interface.
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setSchema

                  public void setSchema(String schema)
                                 throws SQLException
                  Sets the given schema name to access.

                  If the driver does not support schemas, it will silently ignore this request.

                  Calling setSchema has no effect on previously created or prepared Statement objects. It is implementation defined whether a DBMS prepare operation takes place immediately when the Connection method prepareStatement or prepareCall is invoked. For maximum portability, setSchema should be called before a Statement is created or prepared.

                  Parameters:
                  schema - the name of a schema in which to work
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed connection
                  Since:
                  JDK 1.7, HSQLDB 2.0.1
                  See Also:
                  getSchema()

                  getSchema

                  public String getSchema()
                                   throws SQLException
                  Retrieves this Connection object's current schema name.

                  Returns:
                  the current schema name or null if there is none
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed connection
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1
                  See Also:
                  setSchema(java.lang.String)

                  abort

                  public void abort(Executor executor)
                             throws SQLException
                  Terminates an open connection. Calling abort results in:
                  • The connection marked as closed
                  • Closes any physical connection to the database
                  • Releases resources used by the connection
                  • Insures that any thread that is currently accessing the connection will either progress to completion or throw an SQLException.

                  Calling abort marks the connection closed and releases any resources. Calling abort on a closed connection is a no-op.

                  It is possible that the aborting and releasing of the resources that are held by the connection can take an extended period of time. When the abort method returns, the connection will have been marked as closed and the Executor that was passed as a parameter to abort may still be executing tasks to release resources.

                  This method checks to see that there is an SQLPermission object before allowing the method to proceed. If a SecurityManager exists and its checkPermission method denies calling abort, this method throws a java.lang.SecurityException.

                  Parameters:
                  executor - The Executor implementation which will be used by abort.
                  Throws:
                  SQLException - if a database access error occurs or the executor is null,
                  SecurityException - if a security manager exists and its checkPermission method denies calling abort
                  Since:
                  JDK 1.7, HSQLDB 2.0.1
                  See Also:
                  SecurityManager.checkPermission(java.security.Permission), Executor

                  setNetworkTimeout

                  public void setNetworkTimeout(Executor executor,
                                                int milliseconds)
                                         throws SQLException
                  Sets the maximum period a Connection or objects created from the Connection will wait for the database to reply to any one request. If any request remains unanswered, the waiting method will return with a SQLException, and the Connection or objects created from the Connection will be marked as closed. Any subsequent use of the objects, with the exception of the close, isClosed or Connection.isValid methods, will result in a SQLException.

                  Note: This method is intended to address a rare but serious condition where network partitions can cause threads issuing JDBC calls to hang uninterruptedly in socket reads, until the OS TCP-TIMEOUT (typically 10 minutes). This method is related to the abort() method which provides an administrator thread a means to free any such threads in cases where the JDBC connection is accessible to the administrator thread. The setNetworkTimeout method will cover cases where there is no administrator thread, or it has no access to the connection. This method is severe in it's effects, and should be given a high enough value so it is never triggered before any more normal timeouts, such as transaction timeouts.

                  JDBC driver implementations may also choose to support the setNetworkTimeout method to impose a limit on database response time, in environments where no network is present.

                  Drivers may internally implement some or all of their API calls with multiple internal driver-database transmissions, and it is left to the driver implementation to determine whether the limit will be applied always to the response to the API call, or to any single request made during the API call.

                  This method can be invoked more than once, such as to set a limit for an area of JDBC code, and to reset to the default on exit from this area. Invocation of this method has no impact on already outstanding requests.

                  The Statement.setQueryTimeout() timeout value is independent of the timeout value specified in setNetworkTimeout. If the query timeout expires before the network timeout then the statement execution will be canceled. If the network is still active the result will be that both the statement and connection are still usable. However if the network timeout expires before the query timeout or if the statement timeout fails due to network problems, the connection will be marked as closed, any resources held by the connection will be released and both the connection and statement will be unusable.

                  When the driver determines that the setNetworkTimeout timeout value has expired, the JDBC driver marks the connection closed and releases any resources held by the connection.

                  This method checks to see that there is an SQLPermission object before allowing the method to proceed. If a SecurityManager exists and its checkPermission method denies calling setNetworkTimeout, this method throws a java.lang.SecurityException.

                  Parameters:
                  executor - The Executor implementation which will be used by setNetworkTimeout.
                  milliseconds - The time in milliseconds to wait for the database operation to complete. If the JDBC driver does not support milliseconds, the JDBC driver will round the value up to the nearest second. If the timeout period expires before the operation completes, a SQLException will be thrown. A value of 0 indicates that there is not timeout for database operations.
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed connection, the executor is null, or the value specified for seconds is less than 0.
                  SecurityException - if a security manager exists and its checkPermission method denies calling setNetworkTimeout.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1
                  See Also:
                  SecurityManager.checkPermission(java.security.Permission), Statement.setQueryTimeout(int), getNetworkTimeout(), abort(java.util.concurrent.Executor), Executor

                  getNetworkTimeout

                  public int getNetworkTimeout()
                                        throws SQLException
                  Retrieves the number of milliseconds the driver will wait for a database request to complete. If the limit is exceeded, a SQLException is thrown.

                  Returns:
                  the current timeout limit in milliseconds; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Connection
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1
                  See Also:
                  setNetworkTimeout(java.util.concurrent.Executor, int)

                  reset

                  public void reset()
                             throws SQLException
                  Resets this connection so it can be used again. Used when connections are returned to a connection pool.

                  Throws:
                  SQLException - if a database access error occurs

                  closeFully

                  public void closeFully()
                  Completely closes a pooled connection


                  getSession

                  public org.hsqldb.SessionInterface getSession()
                  provides cross-package access to the proprietary (i.e. non-JDBC) HSQLDB session interface.

                  Returns:
                  the underlying sessionProxy for this connection


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCSQLXML.html0000644000175000017500000014304512007570404023577 0ustar renerene JDBCSQLXML (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCSQLXML

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCSQLXML
                  
                  All Implemented Interfaces:
                  SQLXML

                  public class JDBCSQLXML
                  extends Object
                  implements SQLXML

                  The mapping in the JavaTM programming language for the SQL XML type. XML is a built-in type that stores an XML value as a column value in a row of a database table. By default drivers implement an SQLXML object as a logical pointer to the XML data rather than the data itself. An SQLXML object is valid for the duration of the transaction in which it was created.

                  The SQLXML interface provides methods for accessing the XML value as a String, a Reader or Writer, or as a Stream. The XML value may also be accessed through a Source or set as a Result, which are used with XML Parser APIs such as DOM, SAX, and StAX, as well as with XSLT transforms and XPath evaluations.

                  Methods in the interfaces ResultSet, CallableStatement, and PreparedStatement, such as getSQLXML allow a programmer to access an XML value. In addition, this interface has methods for updating an XML value.

                  The XML value of the SQLXML instance may be obtained as a BinaryStream using

                     SQLXML sqlxml = resultSet.getSQLXML(column);
                     InputStream binaryStream = sqlxml.getBinaryStream();
                   
                  For example, to parse an XML value with a DOM parser:
                     DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                     Document result = parser.parse(binaryStream);
                   
                  or to parse an XML value with a SAX parser to your handler:
                     SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
                     parser.parse(binaryStream, myHandler);
                   
                  or to parse an XML value with a StAX parser:
                     XMLInputFactory factory = XMLInputFactory.newInstance();
                     XMLStreamReader streamReader = factory.createXMLStreamReader(binaryStream);
                   

                  Because databases may use an optimized representation for the XML, accessing the value through getSource() and setResult() can lead to improved processing performance without serializing to a stream representation and parsing the XML.

                  For example, to obtain a DOM Document Node:

                     DOMSource domSource = sqlxml.getSource(DOMSource.class);
                     Document document = (Document) domSource.getNode();
                   
                  or to set the value to a DOM Document Node to myNode:
                     DOMResult domResult = sqlxml.setResult(DOMResult.class);
                     domResult.setNode(myNode);
                   
                  or, to send SAX events to your handler:
                     SAXSource saxSource = sqlxml.getSource(SAXSource.class);
                     XMLReader xmlReader = saxSource.getXMLReader();
                     xmlReader.setContentHandler(myHandler);
                     xmlReader.parse(saxSource.getInputSource());
                   
                  or, to set the result value from SAX events:
                     SAXResult saxResult = sqlxml.setResult(SAXResult.class);
                     ContentHandler contentHandler = saxResult.getXMLReader().getContentHandler();
                     contentHandler.startDocument();
                     // set the XML elements and attributes into the result
                     contentHandler.endDocument();
                   
                  or, to obtain StAX events:
                     StAXSource staxSource = sqlxml.getSource(StAXSource.class);
                     XMLStreamReader streamReader = staxSource.getXMLStreamReader();
                   
                  or, to set the result value from StAX events:
                     StAXResult staxResult = sqlxml.getResult(StAXResult.class);
                     XMLStreamWriter streamWriter = staxResult.getXMLStreamWriter();
                   
                  or, to perform XSLT transformations on the XML value using the XSLT in xsltFile output to file resultFile:
                     File xsltFile = new File("a.xslt");
                     File myFile = new File("result.xml");
                     Transformer xslt = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltFile));
                     Source source = sqlxml.getSource(null);
                     Result result = new StreamResult(myFile);
                     xslt.transform(source, result);
                   
                  or, to evaluate an XPath expression on the XML value:
                     XPath xpath = XPathFactory.newInstance().newXPath();
                     DOMSource domSource = sqlxml.getSource(DOMSource.class);
                     Document document = (Document) domSource.getNode();
                     String expression = "/foo/@bar";
                     String barValue = xpath.evaluate(expression, document);
                   
                  To set the XML value to be the result of an XSLT transform:
                     File sourceFile = new File("source.xml");
                     Transformer xslt = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltFile));
                     Source streamSource = new StreamSource(sourceFile);
                     Result result = sqlxml.setResult(null);
                     xslt.transform(streamSource, result);
                   
                  Any Source can be transformed to a Result using the identity transform specified by calling newTransformer():
                     Transformer identity = TransformerFactory.newInstance().newTransformer();
                     Source source = sqlxml.getSource(null);
                     File myFile = new File("result.xml");
                     Result result = new StreamResult(myFile);
                     identity.transform(source, result);
                   
                  To write the contents of a Source to standard output:
                     Transformer identity = TransformerFactory.newInstance().newTransformer();
                     Source source = sqlxml.getSource(null);
                     Result result = new StreamResult(System.out);
                     identity.transform(source, result);
                   
                  To create a DOMSource from a DOMResult:
                      DOMSource domSource = new DOMSource(domResult.getNode());
                   

                  Incomplete or invalid XML values may cause an SQLException when set or the exception may occur when execute() occurs. All streams must be closed before execute() occurs or an SQLException will be thrown.

                  Reading and writing XML values to or from an SQLXML object can happen at most once. The conceptual states of readable and not readable determine if one of the reading APIs will return a value or throw an exception. The conceptual states of writable and not writable determine if one of the writing APIs will set a value or throw an exception.

                  The state moves from readable to not readable once free() or any of the reading APIs are called: getBinaryStream(), getCharacterStream(), getSource(), and getString(). Implementations may also change the state to not writable when this occurs.

                  The state moves from writable to not writeable once free() or any of the writing APIs are called: setBinaryStream(), setCharacterStream(), setResult(), and setString(). Implementations may also change the state to not readable when this occurs.

                  All methods on the SQLXML interface must be fully implemented if the JDBC driver supports the data type.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 2.0, a rudimentary client-side SQLXML interface implementation (this class) is supported for local use when the product is built and run under JDK 1.6+ and the SQLXML instance is constructed as the result of calling JDBCConnection.createSQLXML().

                  SQLXML instances retrieved in such a fashion are initially write-only, with the lifecycle of read and write availability constrained in accordance with the documentation of the interface methods.

                  When build and run under JDK 1.6+, it is also possible to retrieve read-only SQLXML instances from JDBCResultSet.getSQLXML(...), given that the underlying data can be converted to an XML Document Object Model (DOM).

                  However, at the time of this writing (2007-06-12) it is not yet possible to store SQLXML objects directly into an HSQLDB database or to use them directly for HSQLDB statement parameterization purposes. This is because the SQLXML data type is not yet natively supported by the HSQLDB engine. Instead, a JDBCSQLXML instance must first be read as a string, binary input stream, character input stream and so on, which can then be used for such purposes.

                  Here is the current read/write availability lifecycle for JDBCSQLXML:
                  Origin Initially After 1st Write After 1st Read After 1st Free
                  org.hsqldb.jdbc.JDBCConnection.createSQLXML() Write-only Read-only Not readable or writable Not readable or writable
                  org.hsqldb.jdbc.JDBCResultSet.getSQLXML(...) Read-only N/A Not readable or writable Not readable or writable

                  Since:
                  JDK 1.6, HSQLDB 2.0
                  Author:
                  boucherb@users
                  See Also:
                  javax.xml.parsers, javax.xml.stream, javax.xml.transform, javax.xml.xpath

                  Nested Class Summary
                  static class JDBCSQLXML.SAX2XMLStreamWriter
                            Writes to a XMLStreamWriter from SAX events.
                   
                  Constructor Summary
                  JDBCSQLXML(Source source)
                            Constructs a new read-only JDBCSQLXML object from the given Source object.
                   
                  Method Summary
                   void free()
                            This method closes this object and releases the resources that it held.
                   InputStream getBinaryStream()
                            Retrieves the XML value designated by this SQLXML instance as a stream.
                   Reader getCharacterStream()
                            Retrieves the XML value designated by this SQLXML instance as a java.io.Reader object.
                  <T extends Source>
                  T
                  getSource(Class<T> sourceClass)
                            Returns a Source for reading the XML value designated by this SQLXML instance.
                   String getString()
                            Returns a string representation of the XML value designated by this SQLXML instance.
                   boolean isReadable()
                            Retrieves the object's readability status.
                   boolean isWritable()
                            Retrieves the object's readability status.
                   OutputStream setBinaryStream()
                            Retrieves a stream that can be used to write the XML value that this SQLXML instance represents.
                   Writer setCharacterStream()
                            Retrieves a stream to be used to write the XML value that this SQLXML instance represents.
                  <T extends Result>
                  T
                  setResult(Class<T> resultClass)
                            Returns a Result for setting the XML value designated by this SQLXML instance.
                   void setString(String value)
                            Sets the XML value designated by this SQLXML instance to the given String representation.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  JDBCSQLXML

                  public JDBCSQLXML(Source source)
                             throws SQLException
                  Constructs a new read-only JDBCSQLXML object from the given Source object.

                  Parameters:
                  source - a Source representing an SQLXML value
                  Throws:
                  SQLException - if the argument does not represent a valid SQLXML value
                  Method Detail

                  free

                  public void free()
                            throws SQLException
                  This method closes this object and releases the resources that it held. The SQL XML object becomes invalid and neither readable or writeable when this method is called. After free has been called, any attempt to invoke a method other than free will result in a SQLException being thrown. If free is called multiple times, the subsequent calls to free are treated as a no-op.

                  Specified by:
                  free in interface SQLXML
                  Throws:
                  SQLException - if there is an error freeing the XML value.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6

                  getBinaryStream

                  public InputStream getBinaryStream()
                                              throws SQLException
                  Retrieves the XML value designated by this SQLXML instance as a stream. The bytes of the input stream are interpreted according to appendix F of the XML 1.0 specification. The behavior of this method is the same as ResultSet.getBinaryStream() when the designated column of the ResultSet has a type java.sql.Types of SQLXML.

                  The SQL XML object becomes not readable when this method is called and may also become not writable depending on implementation.

                  Specified by:
                  getBinaryStream in interface SQLXML
                  Returns:
                  a stream containing the XML data.
                  Throws:
                  SQLException - if there is an error processing the XML value. An exception is thrown if the state is not readable.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6

                  setBinaryStream

                  public OutputStream setBinaryStream()
                                               throws SQLException
                  Retrieves a stream that can be used to write the XML value that this SQLXML instance represents. The stream begins at position 0. The bytes of the stream are interpreted according to appendix F of the XML 1.0 specification The behavior of this method is the same as ResultSet.updateBinaryStream() when the designated column of the ResultSet has a type java.sql.Types of SQLXML.

                  The SQL XML object becomes not writeable when this method is called and may also become not readable depending on implementation.

                  Specified by:
                  setBinaryStream in interface SQLXML
                  Returns:
                  a stream to which data can be written.
                  Throws:
                  SQLException - if there is an error processing the XML value. An exception is thrown if the state is not writable.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6

                  getCharacterStream

                  public Reader getCharacterStream()
                                            throws SQLException
                  Retrieves the XML value designated by this SQLXML instance as a java.io.Reader object. The format of this stream is defined by org.xml.sax.InputSource, where the characters in the stream represent the unicode code points for XML according to section 2 and appendix B of the XML 1.0 specification. Although an encoding declaration other than unicode may be present, the encoding of the stream is unicode. The behavior of this method is the same as ResultSet.getCharacterStream() when the designated column of the ResultSet has a type java.sql.Types of SQLXML.

                  The SQL XML object becomes not readable when this method is called and may also become not writable depending on implementation.

                  Specified by:
                  getCharacterStream in interface SQLXML
                  Returns:
                  a stream containing the XML data.
                  Throws:
                  SQLException - if there is an error processing the XML value. The getCause() method of the exception may provide a more detailed exception, for example, if the stream does not contain valid characters. An exception is thrown if the state is not readable.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6

                  setCharacterStream

                  public Writer setCharacterStream()
                                            throws SQLException
                  Retrieves a stream to be used to write the XML value that this SQLXML instance represents. The format of this stream is defined by org.xml.sax.InputSource, where the characters in the stream represent the unicode code points for XML according to section 2 and appendix B of the XML 1.0 specification. Although an encoding declaration other than unicode may be present, the encoding of the stream is unicode. The behavior of this method is the same as ResultSet.updateCharacterStream() when the designated column of the ResultSet has a type java.sql.Types of SQLXML.

                  The SQL XML object becomes not writeable when this method is called and may also become not readable depending on implementation.

                  Specified by:
                  setCharacterStream in interface SQLXML
                  Returns:
                  a stream to which data can be written.
                  Throws:
                  SQLException - if there is an error processing the XML value. The getCause() method of the exception may provide a more detailed exception, for example, if the stream does not contain valid characters. An exception is thrown if the state is not writable.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6 Build 79

                  getString

                  public String getString()
                                   throws SQLException
                  Returns a string representation of the XML value designated by this SQLXML instance. The format of this String is defined by org.xml.sax.InputSource, where the characters in the stream represent the unicode code points for XML according to section 2 and appendix B of the XML 1.0 specification. Although an encoding declaration other than unicode may be present, the encoding of the String is unicode. The behavior of this method is the same as ResultSet.getString() when the designated column of the ResultSet has a type java.sql.Types of SQLXML.

                  The SQL XML object becomes not readable when this method is called and may also become not writable depending on implementation.

                  Specified by:
                  getString in interface SQLXML
                  Returns:
                  a string representation of the XML value designated by this SQLXML instance.
                  Throws:
                  SQLException - if there is an error processing the XML value. The getCause() method of the exception may provide a more detailed exception, for example, if the stream does not contain valid characters. An exception is thrown if the state is not readable.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6

                  setString

                  public void setString(String value)
                                 throws SQLException
                  Sets the XML value designated by this SQLXML instance to the given String representation. The format of this String is defined by org.xml.sax.InputSource, where the characters in the stream represent the unicode code points for XML according to section 2 and appendix B of the XML 1.0 specification. Although an encoding declaration other than unicode may be present, the encoding of the String is unicode. The behavior of this method is the same as ResultSet.updateString() when the designated column of the ResultSet has a type java.sql.Types of SQLXML.

                  The SQL XML object becomes not writeable when this method is called and may also become not readable depending on implementation.

                  Specified by:
                  setString in interface SQLXML
                  Parameters:
                  value - the XML value
                  Throws:
                  SQLException - if there is an error processing the XML value. The getCause() method of the exception may provide a more detailed exception, for example, if the stream does not contain valid characters. An exception is thrown if the state is not writable.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6

                  getSource

                  public <T extends Source> T getSource(Class<T> sourceClass)
                                             throws SQLException
                  Returns a Source for reading the XML value designated by this SQLXML instance. Sources are used as inputs to XML parsers and XSLT transformers.

                  Sources for XML parsers will have namespace processing on by default. The systemID of the Source is implementation dependent.

                  The SQL XML object becomes not readable when this method is called and may also become not writable depending on implementation.

                  Note that SAX is a callback architecture, so a returned SAXSource should then be set with a content handler that will receive the SAX events from parsing. The content handler will receive callbacks based on the contents of the XML.

                     SAXSource saxSource = sqlxml.getSource(SAXSource.class);
                     XMLReader xmlReader = saxSource.getXMLReader();
                     xmlReader.setContentHandler(myHandler);
                     xmlReader.parse(saxSource.getInputSource());
                   

                  Specified by:
                  getSource in interface SQLXML
                  Parameters:
                  sourceClass - The class of the source, or null. If the class is null, a vendor specifc Source implementation will be returned. The following classes are supported at a minimum:
                     javax.xml.transform.dom.DOMSource - returns a DOMSource
                     javax.xml.transform.sax.SAXSource - returns a SAXSource
                     javax.xml.transform.stax.StAXSource - returns a StAXSource
                     javax.xml.transform.stream.StreamSource - returns a StreamSource
                   
                  Returns:
                  a Source for reading the XML value.
                  Throws:
                  SQLException - if there is an error processing the XML value or if this feature is not supported. The getCause() method of the exception may provide a more detailed exception, for example, if an XML parser exception occurs. An exception is thrown if the state is not readable.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6 Build 79

                  setResult

                  public <T extends Result> T setResult(Class<T> resultClass)
                                             throws SQLException
                  Returns a Result for setting the XML value designated by this SQLXML instance.

                  The systemID of the Result is implementation dependent.

                  The SQL XML object becomes not writeable when this method is called and may also become not readable depending on implementation.

                  Note that SAX is a callback architecture and the returned SAXResult has a content handler assigned that will receive the SAX events based on the contents of the XML. Call the content handler with the contents of the XML document to assign the values.

                     SAXResult saxResult = sqlxml.getResult(SAXResult.class);
                     ContentHandler contentHandler = saxResult.getXMLReader().getContentHandler();
                     contentHandler.startDocument();
                     // set the XML elements and attributes into the result
                     contentHandler.endDocument();
                   

                  Specified by:
                  setResult in interface SQLXML
                  Parameters:
                  resultClass - The class of the result, or null. If resultClass is null, a vendor specific Result implementation will be returned. The following classes are supported at a minimum:
                     javax.xml.transform.dom.DOMResult - returns a DOMResult
                     javax.xml.transform.sax.SAXResult - returns a SAXResult
                     javax.xml.transform.stax.StAXResult - returns a StAXResult
                     javax.xml.transform.stream.StreamResult - returns a StreamResult
                   
                  Returns:
                  Returns a Result for setting the XML value.
                  Throws:
                  SQLException - if there is an error processing the XML value or if this feature is not supported. The getCause() method of the exception may provide a more detailed exception, for example, if an XML parser exception occurs. An exception is thrown if the state is not writable.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6 Build 79

                  isReadable

                  public boolean isReadable()
                  Retrieves the object's readability status.

                  Returns:
                  if true, then readable; else not readable

                  isWritable

                  public boolean isWritable()
                  Retrieves the object's readability status.

                  Returns:
                  if true, then writable; else not writable


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCResultSetMetaData.html0000644000175000017500000021356112007570404026113 0ustar renerene JDBCResultSetMetaData (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCResultSetMetaData

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCResultSetMetaData
                  
                  All Implemented Interfaces:
                  ResultSetMetaData, Wrapper

                  public class JDBCResultSetMetaData
                  extends Object
                  implements ResultSetMetaData

                  An object that can be used to get information about the types and properties of the columns in a ResultSet object. The following code fragment creates the ResultSet object rs, creates the ResultSetMetaData object rsmd, and uses rsmd to find out how many columns rs has and whether the first column in rs can be used in a WHERE clause.

                  
                       ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
                       ResultSetMetaData rsmd = rs.getMetaData();
                       int numberOfColumns = rsmd.getColumnCount();
                       boolean b = rsmd.isSearchable(1);
                  
                   

                  HSQLDB-Specific Information:

                  HSQLDB supports a subset of the ResultSetMetaData interface.

                  The JDBC specification for ResultSetMetaData is in part very vague. This causes potential incompatibility between interpretations of the specification as realized in different JDBC driver implementations. As such, deciding to what degree reporting ResultSetMetaData is accurate has been considered very carefully. Hopefully, the design decisions made in light of these considerations have yeilded precisely the subset of full ResultSetMetaData support that is most commonly needed and that is most important, while also providing, under the most common use-cases, the fastest access with the least overhead and the best comprimise between speed, accuracy, jar-footprint and retention of JDBC resources.

                  (fredt@users)
                  (boucherb@users)

                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)
                  See Also:
                  JDBCStatement.executeQuery(java.lang.String), JDBCStatement.getResultSet(), ResultSetMetaData

                  Field Summary
                   
                  Fields inherited from interface java.sql.ResultSetMetaData
                  columnNoNulls, columnNullable, columnNullableUnknown
                   
                  Method Summary
                   String getCatalogName(int column)
                            Gets the designated column's table's catalog name.
                   String getColumnClassName(int column)
                             
                   int getColumnCount()
                            Returns the number of columns in this ResultSet object.
                   int getColumnDisplaySize(int column)
                            Indicates the designated column's normal maximum width in characters.
                   String getColumnLabel(int column)
                            Gets the designated column's suggested title for use in printouts and displays.
                   String getColumnName(int column)
                            Get the designated column's name.
                   int getColumnType(int column)
                            Retrieves the designated column's SQL type.
                   String getColumnTypeName(int column)
                            Retrieves the designated column's database-specific type name.
                   int getPrecision(int column)
                            (JDBC4 clarification:) Get the designated column's specified column size.
                   int getScale(int column)
                            Gets the designated column's number of digits to right of the decimal point.
                   String getSchemaName(int column)
                            Get the designated column's table's schema.
                   String getTableName(int column)
                            Gets the designated column's table name.
                   boolean isAutoIncrement(int column)
                            Indicates whether the designated column is automatically numbered.
                   boolean isCaseSensitive(int column)
                            Indicates whether a column's case matters.
                   boolean isCurrency(int column)
                            Indicates whether the designated column is a cash value.
                   boolean isDefinitelyWritable(int column)
                            Indicates whether a write on the designated column will definitely succeed.
                   int isNullable(int column)
                            Indicates the nullability of values in the designated column.
                   boolean isReadOnly(int column)
                            Indicates whether the designated column is definitely not writable.
                   boolean isSearchable(int column)
                            Indicates whether the designated column can be used in a where clause.
                   boolean isSigned(int column)
                            Indicates whether values in the designated column are signed numbers.
                   boolean isWrapperFor(Class<?> iface)
                            Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                   boolean isWritable(int column)
                            Indicates whether it is possible for a write on the designated column to succeed.
                   String toString()
                            Returns a string representation of the object.
                  <T> T
                  unwrap(Class<T> iface)
                            Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
                   

                  Method Detail

                  getColumnCount

                  public int getColumnCount()
                                     throws SQLException
                  Returns the number of columns in this ResultSet object.

                  Specified by:
                  getColumnCount in interface ResultSetMetaData
                  Returns:
                  the number of columns
                  Throws:
                  SQLException - if a database access error occurs

                  isAutoIncrement

                  public boolean isAutoIncrement(int column)
                                          throws SQLException
                  Indicates whether the designated column is automatically numbered.

                  (JDBC4 deleted:)[, thus read-only.]

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 fully supports SQL Satandard features T174 and T176 that define identity column support.


                  However, it must be stated here that contrary to the generic documentation previous to the JDBC4 specification, HSQLDB automatically numbered columns (IDENTITY columns, in HSQLDB parlance) are not read-only.

                  In fact, the generic documentation previous to the JDBC4 specification seems to contradict the general definition of what, at minimum, an auto-increment column is:

                  Simply, an auto-increment column is one that guarantees it has a autogenerated value after a successful insert or update operation, even if no value is supplied, or DEFAULT is specified.

                  Specified by:
                  isAutoIncrement in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  isCaseSensitive

                  public boolean isCaseSensitive(int column)
                                          throws SQLException
                  Indicates whether a column's case matters.

                  HSQLDB-Specific Information:

                  HSQLDB 1.7.1 did not report this value accurately.

                  Starting with 1.7.2, this feature is better supported.

                  This method returns true for any column whose data type is a character type, with the exception of VARCHAR_IGNORECASE for which it returns false. It also returns false for any column whose data type is a not a character data type.

                  Specified by:
                  isCaseSensitive in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  isSearchable

                  public boolean isSearchable(int column)
                                       throws SQLException
                  Indicates whether the designated column can be used in a where clause.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 handles this differently from previous versions.

                  If the column in question is a database table or view column, and the type of the column allows searching, then returns true, otherwise false.

                  Specified by:
                  isSearchable in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  isCurrency

                  public boolean isCurrency(int column)
                                     throws SQLException
                  Indicates whether the designated column is a cash value.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 fully supports this feature and returns true for NUMERIC and DECIMAL columns.

                  Specified by:
                  isCurrency in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  isNullable

                  public int isNullable(int column)
                                 throws SQLException
                  Indicates the nullability of values in the designated column.

                  HSQLDB-Specific Information:

                  HSQLDB 2.2 fully supports this feature.

                  columnNoNulls is always returned for result set columns that represent constants, sequences or table columns known to be not null. columnNullable is returned for NULL constants, or nullable table columns. columnNullableUnknown is returned for all other columns such as aggregates and computed values.

                  To determine the nullable status of a table column in isolation from ResultSetMetaData and in a DBMS-independent fashion, the DatabaseMetaData.getColumns() method can be invoked with the appropriate filter values and the result should be inspected at the position described in the DatabaseMetaData.getColumns() API documentation.

                  Specified by:
                  isNullable in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  the nullability status of the given column; one of columnNoNulls, columnNullable or columnNullableUnknown
                  Throws:
                  SQLException - if a database access error occurs

                  isSigned

                  public boolean isSigned(int column)
                                   throws SQLException
                  Indicates whether values in the designated column are signed numbers.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 fully supports this feature.

                  Specified by:
                  isSigned in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  getColumnDisplaySize

                  public int getColumnDisplaySize(int column)
                                           throws SQLException
                  Indicates the designated column's normal maximum width in characters.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 fully supports this feature.

                  The current calculation follows these rules:

                  1. Long character types and datetime types:

                    The maximum length/precision, repectively.

                  2. CHAR and VARCHAR types:

                    • If the result set column is a direct pass through of a table column value and column size was declared, then the declared value is returned.

                    • Otherwise, the computed length according to SQL Standard is returned. For very large values, the value of the system property hsqldb.max_xxxchar_display_size or the magic value 32766 (0x7FFE) (tested usable/accepted by most tools and compatible with assumptions made by java.io read/write UTF) when the system property is not defined or is not accessible, due to security constraints.

                    It must be noted that the latter value in no way affects the ability of the HSQLDB JDBC driver to retrieve longer values and serves only as the current best effort at providing a value that maximizes usability across a wide range of tools, given that the HSQLDB database engine allows very large lengths to be declared.

                  3. Number types:

                    The max precision, plus the length of the negation character (1), plus (if applicable) the maximum number of characters that may occupy the exponent character sequence. Note that some legacy tools do not correctly handle BIGINT values of greater than 18 digits.

                  4. BOOLEAN type:

                    The length of the character sequence "false" (5), the longer of the two boolean value String representations.

                  5. Remaining types:

                    The maximum length/precision, respectively, as reported by DatabaseMetaData.getTypeInfo(), when applicable. If the maximum display size is unknown, unknowable or inapplicable, then zero is returned.

                  Specified by:
                  getColumnDisplaySize in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  the normal maximum number of characters allowed as the width of the designated column
                  Throws:
                  SQLException - if a database access error occurs

                  getColumnLabel

                  public String getColumnLabel(int column)
                                        throws SQLException
                  Gets the designated column's suggested title for use in printouts and displays. (JDBC4 clarification:) The suggested title is usually specified by the SQL AS clause. If a SQL AS is not specified, the value returned from getColumnLabel will be the same as the value returned by the getColumnName method.

                  HSQLDB-Specific Information:

                  In HSQLDB, a ResultSet column label is determined using the following order of precedence:

                  1. The label (alias) specified in the generating query.
                  2. The name of the underlying column, if no label is specified.
                    C1, C2, etc. for computed columns that have no label.

                  Specified by:
                  getColumnLabel in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  the suggested column title
                  Throws:
                  SQLException - if a database access error occurs

                  getColumnName

                  public String getColumnName(int column)
                                       throws SQLException
                  Get the designated column's name.

                  HSQLDB-Specific Information:

                  In HSQLDB, a ResultSet column name is determined using the following order of prcedence:

                  1. The name of the underlying columnm, if the ResultSet column represents a column in a table.
                  2. The label or alias specified in the generating query.
                  3. C1, C2, etc. for computed columns that have no label.

                  If the jdbc.get_column_name property of the JDBC Connection has been set to false, this method returns the same value as getColumnLabel(int).

                  Specified by:
                  getColumnName in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  column name
                  Throws:
                  SQLException - if a database access error occurs

                  getSchemaName

                  public String getSchemaName(int column)
                                       throws SQLException
                  Get the designated column's table's schema.

                  HSQLDB-Specific Information:

                  Since 1.8.0.x, HSQLDB implements standard SQL SCHEMA support; this method returns the actual schema of the column's table. Columns generated in queries have no schema name.

                  Specified by:
                  getSchemaName in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  schema name or "" if not applicable
                  Throws:
                  SQLException - if a database access error occurs

                  getPrecision

                  public int getPrecision(int column)
                                   throws SQLException
                  (JDBC4 clarification:) Get the designated column's specified column size. For numeric data, this is the maximum precision. For character data, this is the [maximum] length in characters. For datetime datatypes, this is the [maximim] length in characters of the String representation (assuming the maximum allowed precision of the fractional seconds component). For binary data, this is the [maximum] length in bytes. For the ROWID datatype, this is the length in bytes[, as returned by the implementation-specific java.sql.RowId.getBytes() method]. 0 is returned for data types where the column size is not applicable.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 reports the correct length or precision for all columns. For DOUBLE, the binary precision of 64 is returned, while for other numeric types the decimal precision is returned.

                  Specified by:
                  getPrecision in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  precision
                  Throws:
                  SQLException - if a database access error occurs

                  getScale

                  public int getScale(int column)
                               throws SQLException
                  Gets the designated column's number of digits to right of the decimal point. 0 is returned for data types where the scale is not applicable.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 reports the correct scale for all columns.

                  For datetime and interval types such as Timestamp or Time, the fractional second precision is reported.

                  The reported scale for INTEGER, BIGINT and DOUBLE is 0

                  Specified by:
                  getScale in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  scale
                  Throws:
                  SQLException - if a database access error occurs

                  getTableName

                  public String getTableName(int column)
                                      throws SQLException
                  Gets the designated column's table name.

                  Specified by:
                  getTableName in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  table name or "" if not applicable
                  Throws:
                  SQLException - if a database access error occurs

                  getCatalogName

                  public String getCatalogName(int column)
                                        throws SQLException
                  Gets the designated column's table's catalog name.

                  HSQLDB-Specific Information:

                  From 2.0, HSQLDB returns the name of the catalog. The default name is PUBLIC. This value can be changed for the database using an SQL command.

                  HSQLDB supports use of catalog qualification in DLL or DML when it is allowed by the Standard.

                  However, not all clients respect the SQL Standard and may use a catalog qualifier in a context where it is not suppoted by the Standard.

                  For greater detail, see discussion at: JDBCDatabaseMetaData.

                  Specified by:
                  getCatalogName in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  the name of the catalog for the table in which the given column appears or "" if not applicable
                  Throws:
                  SQLException - if a database access error occurs

                  getColumnType

                  public int getColumnType(int column)
                                    throws SQLException
                  Retrieves the designated column's SQL type.

                  HSQLDB-Specific Information:

                  This reports the SQL type code of the column. For time and timestamp types that are WITH TIME ZONE, the values as the SQL Standarc CLI codes.

                  Specified by:
                  getColumnType in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  SQL type from java.sql.Types
                  Throws:
                  SQLException - if a database access error occurs
                  See Also:
                  Types

                  getColumnTypeName

                  public String getColumnTypeName(int column)
                                           throws SQLException
                  Retrieves the designated column's database-specific type name.

                  Specified by:
                  getColumnTypeName in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  type name used by the database. If the column type is a user-defined type, then a fully-qualified type name is returned.
                  Throws:
                  SQLException - if a database access error occurs

                  isReadOnly

                  public boolean isReadOnly(int column)
                                     throws SQLException
                  Indicates whether the designated column is definitely not writable.

                  HSQLDB-Specific Information:

                  From 2.0 this method returns true if the ResuleSet is not updatable or the column in question is not updatable.

                  Specified by:
                  isReadOnly in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  isWritable

                  public boolean isWritable(int column)
                                     throws SQLException
                  Indicates whether it is possible for a write on the designated column to succeed.

                  HSQLDB-Specific Information:

                  From 2.0 this method returns false if the ResuleSet is not updatable or the column in question is not updatable.

                  Specified by:
                  isWritable in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  isDefinitelyWritable

                  public boolean isDefinitelyWritable(int column)
                                               throws SQLException
                  Indicates whether a write on the designated column will definitely succeed.

                  HSQLDB-Specific Information:

                  From 2.0 this method returns false if the ResuleSet is not updatable or the column in question is not updatable.

                  Specified by:
                  isDefinitelyWritable in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  true if so; false otherwise
                  Throws:
                  SQLException - if a database access error occurs

                  getColumnClassName

                  public String getColumnClassName(int column)
                                            throws SQLException

                  Returns the fully-qualified name of the Java class whose instances are manufactured if the method ResultSet.getObject is called to retrieve a value from the column. ResultSet.getObject may return a subclass of the class returned by this method.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 fully supports this feature.

                  For columns of type OTHER, there is no specific class name and java.lang.Object is returned.

                  Specified by:
                  getColumnClassName in interface ResultSetMetaData
                  Parameters:
                  column - the first column is 1, the second is 2, ...
                  Returns:
                  the fully-qualified name of the class in the Java programming language that would be used by the method ResultSet.getObject to retrieve the value in the specified column. This is the class name used for custom mapping.
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCResultSet)

                  unwrap

                  public <T> T unwrap(Class<T> iface)
                           throws SQLException
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy. If the receiver implements the interface then the result is the receiver or a proxy for the receiver. If the receiver is a wrapper and the wrapped object implements the interface then the result is the wrapped object or a proxy for the wrapped object. Otherwise return the the result of calling unwrap recursively on the wrapped object or a proxy for that result. If the receiver is not a wrapper and does not implement the interface, then an SQLException is thrown.

                  Specified by:
                  unwrap in interface Wrapper
                  Parameters:
                  iface - A Class defining an interface that the result must implement.
                  Returns:
                  an object that implements the interface. May be a proxy for the actual implementing object.
                  Throws:
                  SQLException - If no object found that implements the interface
                  Since:
                  JDK 1.6, HSQLDB 1.8.x

                  isWrapperFor

                  public boolean isWrapperFor(Class<?> iface)
                                       throws SQLException
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does. Returns false otherwise. If this implements the interface then return true, else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped object. If this does not implement the interface and is not a wrapper, return false. This method should be implemented as a low-cost operation compared to unwrap so that callers can use this method to avoid expensive unwrap calls that may fail. If this method returns true then calling unwrap with the same argument should succeed.

                  Specified by:
                  isWrapperFor in interface Wrapper
                  Parameters:
                  iface - a Class defining an interface.
                  Returns:
                  true if this implements the interface or directly or indirectly wraps an object that does.
                  Throws:
                  SQLException - if an error occurs while determining whether this is a wrapper for an object with the given interface.
                  Since:
                  JDK 1.6, HSQLDB 1.8.x

                  toString

                  public String toString()
                  Returns a string representation of the object.

                  The string consists of the name of the class of which the object is an instance, the at-sign character `@', the unsigned hexadecimal representation of the hash code of the object and a comma-delimited list of this object's indexed attributes, enclosed in square brakets.

                  Overrides:
                  toString in class Object
                  Returns:
                  a string representation of the object.


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCSavepoint.html0000644000175000017500000003641012007570404024524 0ustar renerene JDBCSavepoint (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCSavepoint

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCSavepoint
                  
                  All Implemented Interfaces:
                  Savepoint

                  public class JDBCSavepoint
                  extends Object
                  implements Savepoint

                  The representation of a savepoint, which is a point within the current transaction that can be referenced from the Connection.rollback method. When a transaction is rolled back to a savepoint all changes made after that savepoint are undone.

                  Savepoints can be either named or unnamed. Unnamed savepoints are identified by an ID generated by the underlying data source.

                  HSQLDB-Specific Information:

                  SQL 2003 standard does not support unnamed savepoints. However, this feature is supported from version 2.0.

                  If the connection is autoCommit, setting savepoints has no effect as any such savepoint is cleared upon the execution of the first transactional statement.

                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  Author:
                  boucherb@users

                  Method Summary
                   int getSavepointId()
                            Retrieves the generated ID for the savepoint that this Savepoint object represents.
                   String getSavepointName()
                            Retrieves the name of the savepoint that this Savepoint object represents.
                   String toString()
                             
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
                   

                  Method Detail

                  getSavepointId

                  public int getSavepointId()
                                     throws SQLException
                  Retrieves the generated ID for the savepoint that this Savepoint object represents.

                  Specified by:
                  getSavepointId in interface Savepoint
                  Returns:
                  the numeric ID of this savepoint
                  Throws:
                  SQLException - if this is a named savepoint
                  Since:
                  1.4

                  getSavepointName

                  public String getSavepointName()
                                          throws SQLException
                  Retrieves the name of the savepoint that this Savepoint object represents.

                  Specified by:
                  getSavepointName in interface Savepoint
                  Returns:
                  the name of this savepoint
                  Throws:
                  SQLException - if this is an un-named savepoint
                  Since:
                  1.4

                  toString

                  public String toString()
                  Overrides:
                  toString in class Object


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCDriver.html0000644000175000017500000011254012007570404024006 0ustar renerene JDBCDriver (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCDriver

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCDriver
                  
                  All Implemented Interfaces:
                  Driver

                  public class JDBCDriver
                  extends Object
                  implements Driver

                  Provides the java.sql.Driver interface implementation required by the JDBC specification.

                  The Java SQL framework allows for multiple database drivers.

                  The DriverManager will try to load as many drivers as it can find and then for any given connection request, it will ask each driver in turn to try to connect to the target URL.

                  The application developer will normally not need to call any function of the Driver directly. All required calls are made by the DriverManager.

                  HSQLDB-Specific Information:

                  When the HSQL Database Engine Driver class is loaded, it creates an instance of itself and register it with the DriverManager. This means that a user can load and register the HSQL Database Engine driver by calling:

                    Class.forName("org.hsqldb.jdbc.JDBCDriver")
                    
                  For detailed information about how to obtain HSQLDB JDBC Connections, please see JDBCConnection.


                  JRE 1.1.x Notes:

                  In general, JDBC 2 support requires Java 1.2 and above, and JDBC3 requires Java 1.4 and above. In HSQLDB, support for methods introduced in different versions of JDBC depends on the JDK version used for compiling and building HSQLDB.

                  Since 1.7.0, it is possible to build the product so that all JDBC 2 methods can be called while executing under the version 1.1.x Java Runtime EnvironmentTM. However, in addition to this technique requiring explicit casts to the org.hsqldb.jdbc.* classes, some of the method calls also require int values that are defined only in the JDBC 2 or greater version of the ResultSet interface. For this reason, when the product is compiled under JDK 1.1.x, these values are defined in JDBCResultSet.

                  In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the JDBC2-only ResultSet values can be achieved by referring to them in parameter specifications and return value comparisons, respectively, as follows:

                   JDBCResultSet.FETCH_FORWARD
                   JDBCResultSet.TYPE_FORWARD_ONLY
                   JDBCResultSet.TYPE_SCROLL_INSENSITIVE
                   JDBCResultSet.CONCUR_READ_ONLY
                   // etc.
                   
                  However, please note that code written to use HSQLDB JDBC 2 features under JDK 1.1.x will not be compatible for use with other JDBC 2 drivers. Please also note that this feature is offered solely as a convenience to developers who must work under JDK 1.1.x due to operating constraints, yet wish to use some of the more advanced features available under the JDBC 2 specification.


                  JDBC 4.0 notes:

                  Starting with JDBC 4.0 (JDK 1.6), the DriverManager methods getConnection and getDrivers have been enhanced to support the Java Standard Edition Service Provider mechanism. When built under a Java runtime that supports JDBC 4.0, HSQLDB distribution jars containing the Driver implementation also include the file META-INF/services/java.sql.Driver. This file contains the fully qualified class name ('org.hsqldb.jdbc.JDBCDriver') of the HSQLDB implementation of java.sql.Driver.

                  Hence, under JDBC 4.0 or greater, applications no longer need to explictly load the HSQLDB JDBC driver using Class.forName(). Of course, existing programs which do load JDBC drivers using Class.forName() will continue to work without modification.


                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)
                  See Also:
                  JDBCConnection

                  Field Summary
                  static JDBCDriver driverInstance
                             
                   ThreadLocal<JDBCConnection> threadConnection
                            As a separate instance of this class is registered with DriverManager for each class loader, the threadConnection is not declared as static.
                   
                  Constructor Summary
                  JDBCDriver()
                            Default constructor
                   
                  Method Summary
                   boolean acceptsURL(String url)
                            Returns true if the driver thinks that it can open a connection to the given URL.
                   Connection connect(String url, Properties info)
                            Attempts to make a database connection to the given URL.
                  static Connection getConnection(String url, Properties info)
                            The static equivalent of the connect(String,Properties) method.
                   int getMajorVersion()
                            Gets the driver's major version number.
                   int getMinorVersion()
                            Gets the driver's minor version number.
                   Logger getParentLogger()
                            Return the parent Logger of all the Loggers used by this driver.
                   DriverPropertyInfo[] getPropertyInfo(String url, Properties info)
                            Gets information about the possible properties for this driver.
                   boolean jdbcCompliant()
                            Reports whether this driver is a genuine JDBC CompliantTM driver.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Field Detail

                  driverInstance

                  public static JDBCDriver driverInstance

                  threadConnection

                  public final ThreadLocal<JDBCConnection> threadConnection
                  As a separate instance of this class is registered with DriverManager for each class loader, the threadConnection is not declared as static. The registered instance is kept to allow access to the its threadConnection.

                  Constructor Detail

                  JDBCDriver

                  public JDBCDriver()
                  Default constructor

                  Method Detail

                  connect

                  public Connection connect(String url,
                                            Properties info)
                                     throws SQLException
                  Attempts to make a database connection to the given URL.

                  Returns "null" if this is the wrong kind of driver to connect to the given URL. This will be common, as when the JDBC driver manager is asked to connect to a given URL it passes the URL to each loaded driver in turn.

                  The driver throws an SQLException if it is the right driver to connect to the given URL but has trouble connecting to the database.

                  The java.util.Properties argument can be used to pass arbitrary string tag/value pairs as connection arguments. Normally at least "user" and "password" properties should be included in the Properties object.

                  HSQLDB-Specific Information:

                  For the HSQL Database Engine, at least "user" and "password" properties should be included in the Properties.

                  From version 1.7.1, two optional properties are supported:

                  • get_column_name (default true) - if set to false, a ResultSetMetaData.getColumnName() call will return the user defined label (getColumnLabel()) instead of the column name.
                    This property is available in order to achieve compatibility with certain non-HSQLDB JDBC driver implementations.
                  • strict_md if set to true, some ResultSetMetaData methods return more strict values for compatibility reasons.

                  From version 1.8.0.x, strict_md is deprecated (ignored) because metadata reporting is always strict (JDBC-compliant), and three new optional properties are supported:

                  • ifexits (default false) - when true, an exception is raised when attempting to connect to an in-process file: or mem: scheme database instance if it has not yet been created. When false, an in-process file: or mem: scheme database instance is created automatically if it has not yet been created. This property does not apply to requests for network or res: (i.e. files_in_jar) scheme connections.
                  • shutdown (default false) - when true, the the target database mimics the behaviour of 1.7.1 and older versions. When the last connection to a database is closed, the database is automatically shut down. The property takes effect only when the first connection is made to the database. This means the connection that opens the database. It has no effect if used with subsequent, simultaneous connections.
                    This command has two uses. One is for test suites, where connections to the database are made from one JVM context, immediately followed by another context. The other use is for applications where it is not easy to configure the environment to shutdown the database. Examples reported by users include web application servers, where the closing of the last connection coincides with the web application being shut down.
                  • default_schema - backwards compatibility feature. To be used for clients written before HSQLDB schema support. Denotes whether to use the default schema when a schema qualifier is not included in a database object's SQL identifier character sequence. Also affects the semantics of DatabaseMetaData calls that supply null-valued schemaNamePattern parameter values.

                  Specified by:
                  connect in interface Driver
                  Parameters:
                  url - the URL of the database to which to connect
                  info - a list of arbitrary string tag/value pairs as connection arguments. Normally at least a "user" and "password" property should be included.
                  Returns:
                  a Connection object that represents a connection to the URL
                  Throws:
                  SQLException - if a database access error occurs

                  getConnection

                  public static Connection getConnection(String url,
                                                         Properties info)
                                                  throws SQLException
                  The static equivalent of the connect(String,Properties) method.

                  Parameters:
                  url - the URL of the database to which to connect
                  info - a list of arbitrary string tag/value pairs as connection arguments including at least at a "user" and a "password" property
                  Returns:
                  a Connection object that represents a connection to the URL
                  Throws:
                  SQLException - if a database access error occurs

                  acceptsURL

                  public boolean acceptsURL(String url)
                  Returns true if the driver thinks that it can open a connection to the given URL. Typically drivers will return true if they understand the subprotocol specified in the URL and false if they don't.

                  Specified by:
                  acceptsURL in interface Driver
                  Parameters:
                  url - the URL of the database
                  Returns:
                  true if this driver can connect to the given URL

                  getPropertyInfo

                  public DriverPropertyInfo[] getPropertyInfo(String url,
                                                              Properties info)
                  Gets information about the possible properties for this driver.

                  The getPropertyInfo method is intended to allow a generic GUI tool to discover what properties it should prompt a human for in order to get enough information to connect to a database. Note that depending on the values the human has supplied so far, additional values may become necessary, so it may be necessary to iterate though several calls to getPropertyInfo.

                  HSQLDB-Specific Information:

                  HSQLDB uses the values submitted in info to set the value for each DriverPropertyInfo object returned. It does not use the default value that it would use for the property if the value is null.

                  Specified by:
                  getPropertyInfo in interface Driver
                  Parameters:
                  url - the URL of the database to which to connect
                  info - a proposed list of tag/value pairs that will be sent on connect open
                  Returns:
                  an array of DriverPropertyInfo objects describing possible properties. This array may be an empty array if no properties are required.

                  getMajorVersion

                  public int getMajorVersion()
                  Gets the driver's major version number.

                  Specified by:
                  getMajorVersion in interface Driver
                  Returns:
                  this driver's major version number

                  getMinorVersion

                  public int getMinorVersion()
                  Gets the driver's minor version number.

                  Specified by:
                  getMinorVersion in interface Driver
                  Returns:
                  this driver's minor version number

                  jdbcCompliant

                  public boolean jdbcCompliant()
                  Reports whether this driver is a genuine JDBC CompliantTM driver. A driver may only report true here if it passes the JDBC compliance tests; otherwise it is required to return false.

                  JDBC compliance requires full support for the JDBC API and full support for SQL 92 Entry Level.

                  HSQLDB-Specific Information:

                  HSQLDB 2.0 is aimed to be compliant with JDBC 4.0 specification. It supports SQL 92 Entry Level and beyond.

                  This method is not intended to encourage the development of non-JDBC compliant drivers, but is a recognition of the fact that some vendors are interested in using the JDBC API and framework for lightweight databases that do not support full database functionality, or for special databases such as document information retrieval where a SQL implementation may not be feasible.

                  Specified by:
                  jdbcCompliant in interface Driver
                  Returns:
                  true if this driver is JDBC Compliant; false otherwise

                  getParentLogger

                  public Logger getParentLogger()
                                         throws SQLFeatureNotSupportedException
                  Return the parent Logger of all the Loggers used by this driver. This should be the Logger farthest from the root Logger that is still an ancestor of all of the Loggers used by this driver. Configuring this Logger will affect all of the log messages generated by the driver. In the worst case, this may be the root Logger.

                  Returns:
                  the parent Logger for this driver
                  Throws:
                  SQLFeatureNotSupportedException - if the driver does not use java.util.logging.
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCConnectionEventListener.html0000644000175000017500000002156612007570402027367 0ustar renerene JDBCConnectionEventListener (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Interface JDBCConnectionEventListener


                  public interface JDBCConnectionEventListener


                  Method Summary
                   void connectionClosed()
                             
                   void connectionErrorOccured(SQLException e)
                             
                   

                  Method Detail

                  connectionClosed

                  void connectionClosed()

                  connectionErrorOccured

                  void connectionErrorOccured(SQLException e)


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCNClob.html0000644000175000017500000004461112007570404023553 0ustar renerene JDBCNClob (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCNClob

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCClob
                        extended by org.hsqldb.jdbc.JDBCNClob
                  
                  All Implemented Interfaces:
                  Clob, NClob

                  public class JDBCNClob
                  extends JDBCClob
                  implements NClob

                  The mapping in the JavaTM programming language for the SQL NCLOB type. An SQL NCLOB is a built-in type that stores a Character Large Object using the National Character Set as a column value in a row of a database table.

                  The NClob interface extends the Clob interface which provides provides methods for getting the length of an SQL NCLOB value, for materializing a NCLOB value on the client, and for searching for a substring or NCLOB object within a NCLOB value. A NClob object, just like a Clob object, is valid for the duration of the transaction in which it was created. Methods in the interfaces ResultSet, CallableStatement, and PreparedStatement, such as getNClob and setNClob allow a programmer to access an SQL NCLOB value. In addition, this interface has methods for updating a NCLOB value.

                  HSQLDB-Specific Information:

                  First, it should be noted that since HSQLDB represents all character data internally as Java UNICODE (UTF16) String objects, there is not currently any appreciable difference between the HSQLDB XXXCHAR types and the SQL 2003 NXXXCHAR and NCLOB types.

                  See JDBCClob for further information.

                  Since:
                  JDK 1.6, HSQLDB 2.0
                  Author:
                  boucherb@users
                  See Also:
                  JDBCClob, JDBCClobClient

                  Constructor Summary
                  JDBCNClob(String data)
                             
                   
                  Method Summary
                   
                  Methods inherited from class org.hsqldb.jdbc.JDBCClob
                  free, getAsciiStream, getCharacterStream, getCharacterStream, getSubString, length, position, position, setAsciiStream, setCharacterStream, setString, setString, truncate
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   
                  Methods inherited from interface java.sql.Clob
                  free, getAsciiStream, getCharacterStream, getCharacterStream, getSubString, length, position, position, setAsciiStream, setCharacterStream, setString, setString, truncate
                   

                  Constructor Detail

                  JDBCNClob

                  public JDBCNClob(String data)
                            throws SQLException
                  Throws:
                  SQLException


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/0000755000175000017500000000000012007570406023140 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCBlobFile.html0000644000175000017500000001342712007570404026134 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCBlobFile (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCBlobFile

                  No usage of org.hsqldb.jdbc.JDBCBlobFile



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCCommonDataSource.html0000644000175000017500000001724112007570404027657 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCCommonDataSource (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCCommonDataSource

                  Packages that use JDBCCommonDataSource
                  org.hsqldb.jdbc Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support. 
                   

                  Uses of JDBCCommonDataSource in org.hsqldb.jdbc
                   

                  Subclasses of JDBCCommonDataSource in org.hsqldb.jdbc
                   class JDBCDataSource
                            A factory for connections to the physical data source that this DataSource object represents.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCDatabaseMetaData.html0000644000175000017500000001354712007570404027566 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCDatabaseMetaData (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCDatabaseMetaData

                  No usage of org.hsqldb.jdbc.JDBCDatabaseMetaData



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCPool.html0000644000175000017500000001335712007570404025371 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCPool (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCPool

                  No usage of org.hsqldb.jdbc.JDBCPool



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/Util.html0000644000175000017500000001330712007570404024745 0ustar renerene Uses of Class org.hsqldb.jdbc.Util (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.Util

                  No usage of org.hsqldb.jdbc.Util



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCResultSet.html0000644000175000017500000002247512007570404026413 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCResultSet (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCResultSet

                  Packages that use JDBCResultSet
                  org.hsqldb.jdbc Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support. 
                   

                  Uses of JDBCResultSet in org.hsqldb.jdbc
                   

                  Methods in org.hsqldb.jdbc that return JDBCResultSet
                  static JDBCResultSet JDBCResultSet.newJDBCResultSet(org.hsqldb.result.Result r, org.hsqldb.result.ResultMetaData metaData)
                            Factory method returns a new JDBCResultSet object for use with user defined functions that retrun a ResultSet object.
                   

                  Methods in org.hsqldb.jdbc with parameters of type JDBCResultSet
                   void JDBCClobClient.setWritable(JDBCResultSet result, int index)
                             
                   void JDBCBlobClient.setWritable(JDBCResultSet result, int index)
                             
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCCallableStatement.html0000644000175000017500000001356112007570404030041 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCCallableStatement (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCCallableStatement

                  No usage of org.hsqldb.jdbc.JDBCCallableStatement



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCParameterMetaData.html0000644000175000017500000001356112007570404027776 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCParameterMetaData (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCParameterMetaData

                  No usage of org.hsqldb.jdbc.JDBCParameterMetaData



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCArrayBasic.html0000644000175000017500000001345312007570404026475 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCArrayBasic (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCArrayBasic

                  No usage of org.hsqldb.jdbc.JDBCArrayBasic



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCDataSourceFactory.html0000644000175000017500000001356112007570404030037 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCDataSourceFactory (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCDataSourceFactory

                  No usage of org.hsqldb.jdbc.JDBCDataSourceFactory



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCRowId.html0000644000175000017500000001337112007570404025500 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCRowId (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCRowId

                  No usage of org.hsqldb.jdbc.JDBCRowId



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCColumnMetaData.html0000644000175000017500000001352312007570404027311 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCColumnMetaData (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCColumnMetaData

                  No usage of org.hsqldb.jdbc.JDBCColumnMetaData



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCClobFile.html0000644000175000017500000001342712007570404026135 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCClobFile (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCClobFile

                  No usage of org.hsqldb.jdbc.JDBCClobFile



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCPreparedStatement.html0000644000175000017500000001720712007570404030105 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCPreparedStatement (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCPreparedStatement

                  Packages that use JDBCPreparedStatement
                  org.hsqldb.jdbc Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support. 
                   

                  Uses of JDBCPreparedStatement in org.hsqldb.jdbc
                   

                  Subclasses of JDBCPreparedStatement in org.hsqldb.jdbc
                   class JDBCCallableStatement
                            The interface used to execute SQL stored procedures.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCConnection.html0000644000175000017500000002751612007570404026561 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCConnection (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCConnection

                  Packages that use JDBCConnection
                  org.hsqldb.jdbc Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support. 
                   

                  Uses of JDBCConnection in org.hsqldb.jdbc
                   

                  Fields in org.hsqldb.jdbc with type parameters of type JDBCConnection
                   ThreadLocal<JDBCConnection> JDBCDriver.threadConnection
                            As a separate instance of this class is registered with DriverManager for each class loader, the threadConnection is not declared as static.
                   ThreadLocal<JDBCConnection> JDBCDriver.threadConnection
                            As a separate instance of this class is registered with DriverManager for each class loader, the threadConnection is not declared as static.
                   

                  Constructors in org.hsqldb.jdbc with parameters of type JDBCConnection
                  JDBCCallableStatement(JDBCConnection c, String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
                            Constructs a new JDBCCallableStatement with the specified connection and result type.
                  JDBCConnection(JDBCConnection c, JDBCConnectionEventListener eventListener)
                            Constructor for use with connection pooling and XA.
                  JDBCResultSet(JDBCConnection conn, org.hsqldb.jdbc.JDBCStatementBase s, org.hsqldb.result.Result r, org.hsqldb.result.ResultMetaData metaData)
                            Constructs a new JDBCResultSet object using the specified navigator and org.hsqldb.result.ResultMetaData.
                  JDBCResultSet(JDBCConnection conn, org.hsqldb.result.Result r, org.hsqldb.result.ResultMetaData metaData)
                             
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCSQLXML.html0000644000175000017500000001340312007570404025470 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCSQLXML (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCSQLXML

                  No usage of org.hsqldb.jdbc.JDBCSQLXML



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCResultSetMetaData.html0000644000175000017500000001356112007570404030010 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCResultSetMetaData (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCResultSetMetaData

                  No usage of org.hsqldb.jdbc.JDBCResultSetMetaData



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCSavepoint.html0000644000175000017500000001344112007570404026422 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCSavepoint (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCSavepoint

                  No usage of org.hsqldb.jdbc.JDBCSavepoint



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCDriver.html0000644000175000017500000001772412007570404025715 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCDriver (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCDriver

                  Packages that use JDBCDriver
                  org.hsqldb.jdbc Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support. 
                   

                  Uses of JDBCDriver in org.hsqldb.jdbc
                   

                  Fields in org.hsqldb.jdbc declared as JDBCDriver
                  static JDBCDriver JDBCDriver.driverInstance
                             
                  static JDBCDriver JDBCDriver.driverInstance
                             
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCConnectionEventListener.html0000644000175000017500000002001112007570404031250 0ustar renerene Uses of Interface org.hsqldb.jdbc.JDBCConnectionEventListener (HSQLDB 2.2.9 API)

                  Uses of Interface
                  org.hsqldb.jdbc.JDBCConnectionEventListener

                  Packages that use JDBCConnectionEventListener
                  org.hsqldb.jdbc Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support. 
                   

                  Uses of JDBCConnectionEventListener in org.hsqldb.jdbc
                   

                  Constructors in org.hsqldb.jdbc with parameters of type JDBCConnectionEventListener
                  JDBCConnection(JDBCConnection c, JDBCConnectionEventListener eventListener)
                            Constructor for use with connection pooling and XA.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCNClob.html0000644000175000017500000001337112007570404025451 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCNClob (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCNClob

                  No usage of org.hsqldb.jdbc.JDBCNClob



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCBlobClient.html0000644000175000017500000001345312007570404026472 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCBlobClient (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCBlobClient

                  No usage of org.hsqldb.jdbc.JDBCBlobClient



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCDataSource.html0000644000175000017500000001345312007570404026507 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCDataSource (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCDataSource

                  No usage of org.hsqldb.jdbc.JDBCDataSource



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCBlob.html0000644000175000017500000001335712007570404025336 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCBlob (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCBlob

                  No usage of org.hsqldb.jdbc.JDBCBlob



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCClob.html0000644000175000017500000001675412007570404025343 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCClob (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCClob

                  Packages that use JDBCClob
                  org.hsqldb.jdbc Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support. 
                   

                  Uses of JDBCClob in org.hsqldb.jdbc
                   

                  Subclasses of JDBCClob in org.hsqldb.jdbc
                   class JDBCNClob
                            The mapping in the JavaTM programming language for the SQL NCLOB type.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCStatement.html0000644000175000017500000001344112007570404026416 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCStatement (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCStatement

                  No usage of org.hsqldb.jdbc.JDBCStatement



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCClobClient.html0000644000175000017500000001345312007570404026473 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCClobClient (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCClobClient

                  No usage of org.hsqldb.jdbc.JDBCClobClient



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCArray.html0000644000175000017500000001337112007570404025532 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCArray (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCArray

                  No usage of org.hsqldb.jdbc.JDBCArray



                  Copyright © 2001 - 2010 HSQL Development Group. ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootroothsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCSQLXML.SAX2XMLStreamWriter.htmlhsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/class-use/JDBCSQLXML.SAX2XMLStreamWriter.htm0000644000175000017500000001371312007570404030766 0ustar renerene Uses of Class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter

                  No usage of org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCBlobClient.html0000644000175000017500000011043612007570402024570 0ustar renerene JDBCBlobClient (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCBlobClient

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCBlobClient
                  
                  All Implemented Interfaces:
                  Blob

                  public class JDBCBlobClient
                  extends Object
                  implements Blob

                  A wrapper for HSQLDB BlobData objects. Instances of this class are returnd by calls to ResultSet methods.

                  Since:
                  1.9.0
                  Author:
                  Fred Toussi (fredt@users dot sourceforge.net)

                  Constructor Summary
                  JDBCBlobClient(org.hsqldb.SessionInterface session, org.hsqldb.types.BlobDataID blob)
                             
                   
                  Method Summary
                   void clearUpdates()
                             
                   void free()
                            This method frees the Blob object and releases the resources that it holds.
                   InputStream getBinaryStream()
                            Retrieves the BLOB value designated by this Blob instance as a stream.
                   InputStream getBinaryStream(long pos, long length)
                            Returns an InputStream object that contains a partial Blob value, starting with the byte specified by pos, which is length bytes in length.
                   org.hsqldb.types.BlobDataID getBlob()
                             
                   byte[] getBytes(long pos, int length)
                            Retrieves all or part of the BLOB value that this Blob object represents, as an array of bytes.
                   boolean isClosed()
                             
                   long length()
                            Returns the number of bytes in the BLOB value designated by this Blob object.
                   long position(Blob pattern, long start)
                            Retrieves the byte position in the BLOB value designated by this Blob object at which pattern begins.
                   long position(byte[] pattern, long start)
                            Retrieves the byte position at which the specified byte array pattern begins within the BLOB value that this Blob object represents.
                   OutputStream setBinaryStream(long pos)
                            Retrieves a stream that can be used to write to the BLOB value that this Blob object represents.
                   int setBytes(long pos, byte[] bytes)
                            Writes the given array of bytes to the BLOB value that this Blob object represents, starting at position pos, and returns the number of bytes written.
                   int setBytes(long pos, byte[] bytes, int offset, int len)
                            Writes all or part of the given byte array to the BLOB value that this Blob object represents and returns the number of bytes written.
                   void setWritable(JDBCResultSet result, int index)
                             
                   void truncate(long len)
                            Truncates the BLOB value that this Blob object represents to be len bytes in length.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  JDBCBlobClient

                  public JDBCBlobClient(org.hsqldb.SessionInterface session,
                                        org.hsqldb.types.BlobDataID blob)
                  Method Detail

                  length

                  public long length()
                              throws SQLException
                  Returns the number of bytes in the BLOB value designated by this Blob object.

                  Specified by:
                  length in interface Blob
                  Returns:
                  length of the BLOB in bytes
                  Throws:
                  SQLException - if there is an error accessing the length of the BLOB

                  getBytes

                  public byte[] getBytes(long pos,
                                         int length)
                                  throws SQLException
                  Retrieves all or part of the BLOB value that this Blob object represents, as an array of bytes.

                  Specified by:
                  getBytes in interface Blob
                  Parameters:
                  pos - the ordinal position of the first byte in the BLOB value to be extracted; the first byte is at position 1
                  length - the number of consecutive bytes to be copied
                  Returns:
                  a byte array containing up to length consecutive bytes from the BLOB value designated by this Blob object, starting with the byte at position pos
                  Throws:
                  SQLException - if there is an error accessing the BLOB value

                  getBinaryStream

                  public InputStream getBinaryStream()
                                              throws SQLException
                  Retrieves the BLOB value designated by this Blob instance as a stream.

                  Specified by:
                  getBinaryStream in interface Blob
                  Returns:
                  a stream containing the BLOB data
                  Throws:
                  SQLException - if there is an error accessing the BLOB value

                  position

                  public long position(byte[] pattern,
                                       long start)
                                throws SQLException
                  Retrieves the byte position at which the specified byte array pattern begins within the BLOB value that this Blob object represents.

                  Specified by:
                  position in interface Blob
                  Parameters:
                  pattern - the byte array for which to search
                  start - the position at which to begin searching; the first position is 1
                  Returns:
                  the position at which the pattern appears, else -1
                  Throws:
                  SQLException - if there is an error accessing the BLOB

                  position

                  public long position(Blob pattern,
                                       long start)
                                throws SQLException
                  Retrieves the byte position in the BLOB value designated by this Blob object at which pattern begins.

                  Specified by:
                  position in interface Blob
                  Parameters:
                  pattern - the Blob object designating the BLOB value for which to search
                  start - the position in the BLOB value at which to begin searching; the first position is 1
                  Returns:
                  the position at which the pattern begins, else -1
                  Throws:
                  SQLException - if there is an error accessing the BLOB value

                  setBytes

                  public int setBytes(long pos,
                                      byte[] bytes)
                               throws SQLException
                  Writes the given array of bytes to the BLOB value that this Blob object represents, starting at position pos, and returns the number of bytes written.

                  Specified by:
                  setBytes in interface Blob
                  Parameters:
                  pos - the position in the BLOB object at which to start writing
                  bytes - the array of bytes to be written to the BLOB value that this Blob object represents
                  Returns:
                  the number of bytes written
                  Throws:
                  SQLException - if there is an error accessing the BLOB value

                  setBytes

                  public int setBytes(long pos,
                                      byte[] bytes,
                                      int offset,
                                      int len)
                               throws SQLException
                  Writes all or part of the given byte array to the BLOB value that this Blob object represents and returns the number of bytes written.

                  Specified by:
                  setBytes in interface Blob
                  Parameters:
                  pos - the position in the BLOB object at which to start writing
                  bytes - the array of bytes to be written to this BLOB object
                  offset - the offset into the array bytes at which to start reading the bytes to be set
                  len - the number of bytes to be written to the BLOB value from the array of bytes bytes
                  Returns:
                  the number of bytes written
                  Throws:
                  SQLException - if there is an error accessing the BLOB value

                  setBinaryStream

                  public OutputStream setBinaryStream(long pos)
                                               throws SQLException
                  Retrieves a stream that can be used to write to the BLOB value that this Blob object represents.

                  Specified by:
                  setBinaryStream in interface Blob
                  Parameters:
                  pos - the position in the BLOB value at which to start writing
                  Returns:
                  a java.io.OutputStream object to which data can be written
                  Throws:
                  SQLException - if there is an error accessing the BLOB value

                  truncate

                  public void truncate(long len)
                                throws SQLException
                  Truncates the BLOB value that this Blob object represents to be len bytes in length.

                  Specified by:
                  truncate in interface Blob
                  Parameters:
                  len - the length, in bytes, to which the BLOB value that this Blob object represents should be truncated
                  Throws:
                  SQLException - if there is an error accessing the BLOB value

                  free

                  public void free()
                            throws SQLException
                  This method frees the Blob object and releases the resources that it holds. The object is invalid once the free method is called.

                  After free has been called, any attempt to invoke a method other than free will result in a SQLException being thrown. If free is called multiple times, the subsequent calls to free are treated as a no-op.

                  Specified by:
                  free in interface Blob
                  Throws:
                  SQLException - if an error occurs releasing the Blob's resources
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getBinaryStream

                  public InputStream getBinaryStream(long pos,
                                                     long length)
                                              throws SQLException
                  Returns an InputStream object that contains a partial Blob value, starting with the byte specified by pos, which is length bytes in length.

                  Specified by:
                  getBinaryStream in interface Blob
                  Parameters:
                  pos - the offset to the first byte of the partial value to be retrieved. The first byte in the Blob is at position 1
                  length - the length in bytes of the partial value to be retrieved
                  Returns:
                  InputStream through which the partial Blob value can be read.
                  Throws:
                  SQLException - if pos is less than 1 or if pos is greater than the number of bytes in the Blob or if pos + length is greater than the number of bytes in the Blob
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  isClosed

                  public boolean isClosed()

                  getBlob

                  public org.hsqldb.types.BlobDataID getBlob()

                  setWritable

                  public void setWritable(JDBCResultSet result,
                                          int index)

                  clearUpdates

                  public void clearUpdates()


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCDataSource.html0000644000175000017500000007531612007570404024616 0ustar renerene JDBCDataSource (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCDataSource

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCCommonDataSource
                        extended by org.hsqldb.jdbc.JDBCDataSource
                  
                  All Implemented Interfaces:
                  Serializable, Wrapper, Referenceable, CommonDataSource, DataSource

                  public class JDBCDataSource
                  extends JDBCCommonDataSource
                  implements DataSource, Serializable, Referenceable, Wrapper

                  A factory for connections to the physical data source that this DataSource object represents. An alternative to the DriverManager facility, a DataSource object is the preferred means of getting a connection. An object that implements the DataSource interface will typically be registered with a naming service based on the JavaTM Naming and Directory (JNDI) API.

                  The DataSource interface is implemented by a driver vendor. There are three types of implementations:

                  1. Basic implementation -- produces a standard Connection object
                  2. Connection pooling implementation -- produces a Connection object that will automatically participate in connection pooling. This implementation works with a middle-tier connection pooling manager.
                  3. Distributed transaction implementation -- produces a Connection object that may be used for distributed transactions and almost always participates in connection pooling. This implementation works with a middle-tier transaction manager and almost always with a connection pooling manager.

                  A DataSource object has properties that can be modified when necessary. For example, if the data source is moved to a different server, the property for the server can be changed. The benefit is that because the data source's properties can be changed, any code accessing that data source does not need to be changed.

                  A driver that is accessed via a DataSource object does not register itself with the DriverManager. Rather, a DataSource object is retrieved though a lookup operation and then used to create a Connection object. With a basic implementation, the connection obtained through a DataSource object is identical to a connection obtained through the DriverManager facility.

                  HSQLDB-Specific Information:

                  This implementation of data source is a basic implementation and does not perform connection pooling.

                  The getter and setter methods of the parent class, JDBCCommonDataSource, can be used.

                  Since:
                  JDK 1.4, 1.7.2
                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)
                  See Also:
                  Serialized Form

                  Constructor Summary
                  JDBCDataSource()
                             
                   
                  Method Summary
                   Connection getConnection()
                            Retrieves a new connection using the properties that have already been set.
                   Connection getConnection(String username, String password)
                            Retrieves a new connection using the given username and password, and the database url that has been set.
                   Reference getReference()
                            Retrieves the Reference of this object.
                   boolean isWrapperFor(Class<?> iface)
                            Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                  <T> T
                  unwrap(Class<T> iface)
                            Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                   
                  Methods inherited from class org.hsqldb.jdbc.JDBCCommonDataSource
                  getDatabase, getDatabaseName, getDataSourceName, getDescription, getLoginTimeout, getLogWriter, getNetworkProtocol, getParentLogger, getServerName, getUrl, getUser, setDatabase, setDatabaseName, setLoginTimeout, setLogWriter, setPassword, setProperties, setUrl, setUser
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   
                  Methods inherited from interface javax.sql.CommonDataSource
                  getLoginTimeout, getLogWriter, setLoginTimeout, setLogWriter
                   

                  Constructor Detail

                  JDBCDataSource

                  public JDBCDataSource()
                  Method Detail

                  getConnection

                  public Connection getConnection()
                                           throws SQLException
                  Retrieves a new connection using the properties that have already been set.

                  Specified by:
                  getConnection in interface DataSource
                  Returns:
                  a connection to the data source
                  Throws:
                  SQLException - if a database access error occurs

                  getConnection

                  public Connection getConnection(String username,
                                                  String password)
                                           throws SQLException
                  Retrieves a new connection using the given username and password, and the database url that has been set. No other properties are used for the connection

                  Specified by:
                  getConnection in interface DataSource
                  Parameters:
                  username - the database user on whose behalf the connection is being made
                  password - the user's password
                  Returns:
                  a connection to the data source
                  Throws:
                  SQLException - if a database access error occurs

                  unwrap

                  public <T> T unwrap(Class<T> iface)
                           throws SQLException
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy. If the receiver implements the interface then the result is the receiver or a proxy for the receiver. If the receiver is a wrapper and the wrapped object implements the interface then the result is the wrapped object or a proxy for the wrapped object. Otherwise return the the result of calling unwrap recursively on the wrapped object or a proxy for that result. If the receiver is not a wrapper and does not implement the interface, then an SQLException is thrown.

                  Specified by:
                  unwrap in interface Wrapper
                  Parameters:
                  iface - A Class defining an interface that the result must implement.
                  Returns:
                  an object that implements the interface. May be a proxy for the actual implementing object.
                  Throws:
                  SQLException - If no object found that implements the interface
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  isWrapperFor

                  public boolean isWrapperFor(Class<?> iface)
                                       throws SQLException
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does. Returns false otherwise. If this implements the interface then return true, else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped object. If this does not implement the interface and is not a wrapper, return false. This method should be implemented as a low-cost operation compared to unwrap so that callers can use this method to avoid expensive unwrap calls that may fail. If this method returns true then calling unwrap with the same argument should succeed.

                  Specified by:
                  isWrapperFor in interface Wrapper
                  Parameters:
                  iface - a Class defining an interface.
                  Returns:
                  true if this implements the interface or directly or indirectly wraps an object that does.
                  Throws:
                  SQLException - if an error occurs while determining whether this is a wrapper for an object with the given interface.
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getReference

                  public Reference getReference()
                                         throws NamingException
                  Retrieves the Reference of this object.

                  Specified by:
                  getReference in interface Referenceable
                  Returns:
                  The non-null Reference of this object.
                  Throws:
                  NamingException - If a naming exception was encountered while retrieving the reference.


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCBlob.html0000644000175000017500000014547212007570402023441 0ustar renerene JDBCBlob (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCBlob

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCBlob
                  
                  All Implemented Interfaces:
                  Blob

                  public class JDBCBlob
                  extends Object
                  implements Blob

                  The representation (mapping) in the JavaTM programming language of an SQL BLOB value. An SQL BLOB is a built-in type that stores a Binary Large Object as a column value in a row of a database table. By default drivers implement Blob using an SQL locator(BLOB), which means that a Blob object contains a logical pointer to the SQL BLOB data rather than the data itself. A Blob object is valid for the duration of the transaction in which is was created.

                  Methods in the interfaces ResultSet, CallableStatement, and PreparedStatement, such as getBlob and setBlob allow a programmer to access an SQL BLOB value. The Blob interface provides methods for getting the length of an SQL BLOB (Binary Large Object) value, for materializing a BLOB value on the client, and for determining the position of a pattern of bytes within a BLOB value. In addition, this interface has methods for updating a BLOB value.

                  All methods on the Blob interface must be fully implemented if the JDBC driver supports the data type.

                  HSQLDB-Specific Information:

                  Previous to 2.0, the HSQLDB driver did not implement Blob using an SQL locator(BLOB). That is, an HSQLDB Blob object did not contain a logical pointer to SQL BLOB data; rather it directly contained a representation of the data (a byte array). As a result, an HSQLDB Blob object was itself valid beyond the duration of the transaction in which is was created, although it did not necessarily represent a corresponding value on the database. Also, the interface methods for updating a BLOB value were unsupported, with the exception of the truncate method, in that it could be used to truncate the local value.

                  Starting with 2.0, the HSQLDB driver fully supports both local and remote SQL BLOB data implementations, meaning that an HSQLDB Blob object may contain a logical pointer to remote SQL BLOB data (see JDBCBlobClient) or it may directly contain a local representation of the data (as implemented in this class). In particular, when the product is built under JDK 1.6+ and the Blob instance is constructed as a result of calling JDBCConnection.createBlob(), then the resulting Blob instance is initially disconnected (is not bound to the transaction scope of the vending Connection object), the data is contained directly and all interface methods for updating the BLOB value are supported for local use until the first invocation of free(); otherwise, an HSQLDB Blob's implementation is determined at runtime by the driver, it is typically not valid beyond the duration of the transaction in which is was created, and there no standard way to query whether it represents a local or remote value.

                  Since:
                  JDK 1.2, HSQLDB 1.7.2
                  Author:
                  james house jhouse@part.net, boucherb@users

                  Field Summary
                  static long MAX_POS
                             
                  static long MIN_POS
                             
                   
                  Constructor Summary
                  JDBCBlob(byte[] data)
                            Constructs a new JDBCBlob instance wrapping the given octet sequence.
                   
                  Method Summary
                   void free()
                            This method frees the Blob object and releases the resources that it holds.
                   InputStream getBinaryStream()
                            Retrieves the BLOB value designated by this Blob instance as a stream.
                   InputStream getBinaryStream(long pos, long length)
                            Returns an InputStream object that contains a partial Blob value, starting with the byte specified by pos, which is length bytes in length.
                   byte[] getBytes(long pos, int length)
                            Retrieves all or part of the BLOB value that this Blob object represents, as an array of bytes.
                   long length()
                            Returns the number of bytes in the BLOB value designated by this Blob object.
                   long position(Blob pattern, long start)
                            Retrieves the byte position in the BLOB value designated by this Blob object at which pattern begins.
                   long position(byte[] pattern, long start)
                            Retrieves the byte position at which the specified byte array pattern begins within the BLOB value that this Blob object represents.
                   OutputStream setBinaryStream(long pos)
                            Retrieves a stream that can be used to write to the BLOB value that this Blob object represents.
                   int setBytes(long pos, byte[] bytes)
                            Writes the given array of bytes to the BLOB value that this Blob object represents, starting at position pos, and returns the number of bytes written.
                   int setBytes(long pos, byte[] bytes, int offset, int len)
                            Writes all or part of the given byte array to the BLOB value that this Blob object represents and returns the number of bytes written.
                   void truncate(long len)
                            Truncates the BLOB value that this Blob object represents to be len bytes in length.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Field Detail

                  MIN_POS

                  public static final long MIN_POS
                  See Also:
                  Constant Field Values

                  MAX_POS

                  public static final long MAX_POS
                  See Also:
                  Constant Field Values
                  Constructor Detail

                  JDBCBlob

                  public JDBCBlob(byte[] data)
                           throws SQLException
                  Constructs a new JDBCBlob instance wrapping the given octet sequence.

                  This constructor is used internally to retrieve result set values as Blob objects, yet it must be public to allow access from other packages. As such (in the interest of efficiency) this object maintains a reference to the given octet sequence rather than making a copy; special care should be taken by external clients never to use this constructor with a byte array object that may later be modified externally.

                  Parameters:
                  data - the octet sequence representing the Blob value
                  Throws:
                  SQLException - if the argument is null
                  Method Detail

                  length

                  public long length()
                              throws SQLException
                  Returns the number of bytes in the BLOB value designated by this Blob object.

                  Specified by:
                  length in interface Blob
                  Returns:
                  length of the BLOB in bytes
                  Throws:
                  SQLException - if there is an error accessing the length of the BLOB
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2, HSQLDB 1.7.2

                  getBytes

                  public byte[] getBytes(long pos,
                                         int length)
                                  throws SQLException
                  Retrieves all or part of the BLOB value that this Blob object represents, as an array of bytes. This byte array contains up to length consecutive bytes starting at position pos.

                  HSQLDB-Specific Information:

                  The official specification above is ambiguous in that it does not precisely indicate the policy to be observed when pos > this.length() - length. One policy would be to retrieve the octets from pos to this.length(). Another would be to throw an exception. HSQLDB observes the second policy.

                  Specified by:
                  getBytes in interface Blob
                  Parameters:
                  pos - the ordinal position of the first byte in the BLOB value to be extracted; the first byte is at position 1
                  length - the number of consecutive bytes to be copied; JDBC 4.1[the value for length must be 0 or greater]
                  Returns:
                  a byte array containing up to length consecutive bytes from the BLOB value designated by this Blob object, starting with the byte at position pos
                  Throws:
                  SQLException - if there is an error accessing the BLOB value; if pos is less than 1 or length is less than 0
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2, HSQLDB 1.7.2
                  See Also:
                  setBytes(long, byte[])

                  getBinaryStream

                  public InputStream getBinaryStream()
                                              throws SQLException
                  Retrieves the BLOB value designated by this Blob instance as a stream.

                  Specified by:
                  getBinaryStream in interface Blob
                  Returns:
                  a stream containing the BLOB data
                  Throws:
                  SQLException - if there is an error accessing the BLOB value
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2, HSQLDB 1.7.2
                  See Also:
                  setBinaryStream(long)

                  position

                  public long position(byte[] pattern,
                                       long start)
                                throws SQLException
                  Retrieves the byte position at which the specified byte array pattern begins within the BLOB value that this Blob object represents. The search for pattern begins at position start.

                  Specified by:
                  position in interface Blob
                  Parameters:
                  pattern - the byte array for which to search
                  start - the position at which to begin searching; the first position is 1
                  Returns:
                  the position at which the pattern appears, else -1
                  Throws:
                  SQLException - if there is an error accessing the BLOB or if start is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2, HSQLDB 1.7.2

                  position

                  public long position(Blob pattern,
                                       long start)
                                throws SQLException
                  Retrieves the byte position in the BLOB value designated by this Blob object at which pattern begins. The search begins at position start.

                  Specified by:
                  position in interface Blob
                  Parameters:
                  pattern - the Blob object designating the BLOB value for which to search
                  start - the position in the BLOB value at which to begin searching; the first position is 1
                  Returns:
                  the position at which the pattern begins, else -1
                  Throws:
                  SQLException - if there is an error accessing the BLOB value or if start is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2, HSQLDB 1.7.2

                  setBytes

                  public int setBytes(long pos,
                                      byte[] bytes)
                               throws SQLException
                  Writes the given array of bytes to the BLOB value that this Blob object represents, starting at position pos, and returns the number of bytes written. The array of bytes will overwrite the existing bytes in the Blob object starting at the position pos. If the end of the Blob value is reached while writing the array of bytes, then the length of the Blob value will be increased to accommodate the extra bytes.

                  Note: If the value specified for pos is greater then the length+1 of the BLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 2.0 this feature is supported.

                  When built under JDK 1.6+ and the Blob instance is constructed as a result of calling JDBCConnection.createBlob(), this operation affects only the client-side value; it has no effect upon a value stored in a database because JDBCConnection.createBlob() constructs disconnected, initially empty Blob instances. To propagate the Blob value to a database in this case, it is required to supply the Blob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updateable ResultSet.

                  Implementation Notes:

                  Starting with HSQLDB 2.1, JDBCBlob no longer utilizes volatile fields and is effectively thread safe, but still uses local variable snapshot isolation.

                  As such, the synchronization policy still does not strictly enforce serialized read/write access to the underlying data

                  So, if an application may perform concurrent JDBCBlob modifications and the integrity of the application depends on total order Blob modification semantics, then such operations should be synchronized on an appropriate monitor.

                  Specified by:
                  setBytes in interface Blob
                  Parameters:
                  pos - the position in the BLOB object at which to start writing; the first position is 1
                  bytes - the array of bytes to be written to the BLOB value that this Blob object represents
                  Returns:
                  the number of bytes written
                  Throws:
                  SQLException - if there is an error accessing the BLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  getBytes(long, int)

                  setBytes

                  public int setBytes(long pos,
                                      byte[] bytes,
                                      int offset,
                                      int len)
                               throws SQLException
                  Writes all or part of the given byte array to the BLOB value that this Blob object represents and returns the number of bytes written. Writing starts at position pos in the BLOB value; len bytes from the given byte array are written. The array of bytes will overwrite the existing bytes in the Blob object starting at the position pos. If the end of the Blob value is reached while writing the array of bytes, then the length of the Blob value will be increased to accommodate the extra bytes.

                  Note: If the value specified for pos is greater then the length+1 of the BLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 2.0 this feature is supported.

                  When built under JDK 1.6+ and the Blob instance is constructed as a result of calling JDBCConnection.createBlob(), this operation affects only the client-side value; it has no effect upon a value stored in a database because JDBCConnection.createBlob() constructs disconnected, initially empty Blob instances. To propagate the Blob value to a database in this case, it is required to supply the Blob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updateable ResultSet.

                  Implementation Notes:

                  If the value specified for pos is greater than the length of the BLOB value, then the BLOB value is extended in length to accept the written octets and the undefined region up to pos is filled with (byte)0.

                  Starting with HSQLDB 2.1, JDBCBlob no longer utilizes volatile fields and is effectively thread safe, but still uses local variable snapshot isolation.

                  As such, the synchronization policy still does not strictly enforce serialized read/write access to the underlying data

                  So, if an application may perform concurrent JDBCBlob modifications and the integrity of the application depends on total order Blob modification semantics, then such operations should be synchronized on an appropriate monitor.

                  Specified by:
                  setBytes in interface Blob
                  Parameters:
                  pos - the position in the BLOB object at which to start writing; the first position is 1
                  bytes - the array of bytes to be written to this BLOB object
                  offset - the offset into the array bytes at which to start reading the bytes to be set
                  len - the number of bytes to be written to the BLOB value from the array of bytes bytes
                  Returns:
                  the number of bytes written
                  Throws:
                  SQLException - if there is an error accessing the BLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  getBytes(long, int)

                  setBinaryStream

                  public OutputStream setBinaryStream(long pos)
                                               throws SQLException
                  Retrieves a stream that can be used to write to the BLOB value that this Blob object represents. The stream begins at position pos. The bytes written to the stream will overwrite the existing bytes in the Blob object starting at the position pos. If the end of the Blob value is reached while writing to the stream, then the length of the Blob value will be increased to accommodate the extra bytes.

                  Note: If the value specified for pos is greater then the length+1 of the BLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 2.0 this feature is supported.

                  When built under JDK 1.6+ and the Blob instance is constructed as a result of calling JDBCConnection.createBlob(), this operation affects only the client-side value; it has no effect upon a value stored in a database because JDBCConnection.createBlob() constructs disconnected, initially empty Blob instances. To propagate the Blob value to a database in this case, it is required to supply the Blob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updateable ResultSet.

                  Implementation Notes:

                  The data written to the stream does not appear in this Blob until the stream is closed

                  When the stream is closed, if the value specified for pos is greater than the length of the BLOB value, then the BLOB value is extended in length to accept the written octets and the undefined region up to pos is filled with (byte)0.

                  Starting with HSQLDB 2.1, JDBCBlob no longer utilizes volatile fields and is effectively thread safe, but still uses local variable snapshot isolation.

                  As such, the synchronization policy still does not strictly enforce serialized read/write access to the underlying data

                  So, if an application may perform concurrent JDBCBlob modifications and the integrity of the application depends on total order Blob modification semantics, then such operations should be synchronized on an appropriate monitor.

                  Specified by:
                  setBinaryStream in interface Blob
                  Parameters:
                  pos - the position in the BLOB value at which to start writing; the first position is 1
                  Returns:
                  a java.io.OutputStream object to which data can be written
                  Throws:
                  SQLException - if there is an error accessing the BLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  getBinaryStream()

                  truncate

                  public void truncate(long len)
                                throws SQLException
                  Truncates the BLOB value that this Blob object represents to be len bytes in length.

                  Note: If the value specified for pos is greater then the length+1 of the BLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 2.0 this feature is fully supported.

                  When built under JDK 1.6+ and the Blob instance is constructed as a result of calling JDBCConnection.createBlob(), this operation affects only the client-side value; it has no effect upon a value stored in a database because JDBCConnection.createBlob() constructs disconnected, initially empty Blob instances. To propagate the truncated Blob value to a database in this case, it is required to supply the Blob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updateable ResultSet.

                  Specified by:
                  truncate in interface Blob
                  Parameters:
                  len - the length, in bytes, to which the BLOB value that this Blob object represents should be truncated
                  Throws:
                  SQLException - if there is an error accessing the BLOB value or if len is less than 0
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  free

                  public void free()
                            throws SQLException
                  This method frees the Blob object and releases the resources that it holds. The object is invalid once the free method is called.

                  After free has been called, any attempt to invoke a method other than free will result in a SQLException being thrown. If free is called multiple times, the subsequent calls to free are treated as a no-op.

                  Specified by:
                  free in interface Blob
                  Throws:
                  SQLException - if an error occurs releasing the Blob's resources
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getBinaryStream

                  public InputStream getBinaryStream(long pos,
                                                     long length)
                                              throws SQLException
                  Returns an InputStream object that contains a partial Blob value, starting with the byte specified by pos, which is length bytes in length.

                  Specified by:
                  getBinaryStream in interface Blob
                  Parameters:
                  pos - the offset to the first byte of the partial value to be retrieved. The first byte in the Blob is at position 1
                  length - the length in bytes of the partial value to be retrieved
                  Returns:
                  InputStream through which the partial Blob value can be read.
                  Throws:
                  SQLException - if pos is less than 1 or if pos is greater than the number of bytes in the Blob or if pos + length is greater than the number of bytes in the Blob
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/package-summary.html0000644000175000017500000003504112007570404025216 0ustar renerene org.hsqldb.jdbc (HSQLDB 2.2.9 API)

                  Package org.hsqldb.jdbc

                  Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support.

                  See:
                            Description

                  Interface Summary
                  JDBCConnectionEventListener  
                   

                  Class Summary
                  JDBCArray The mapping in the Java programming language for the SQL type ARRAY.
                  JDBCArrayBasic The mapping in the Java programming language for the SQL type ARRAY.
                  JDBCBlob The representation (mapping) in the JavaTM programming language of an SQL BLOB value.
                  JDBCBlobClient A wrapper for HSQLDB BlobData objects.
                  JDBCBlobFile
                  JDBCCallableStatement The interface used to execute SQL stored procedures.
                  JDBCClob The mapping in the JavaTM programming language for the SQL CLOB type.
                  JDBCClobClient A wrapper for HSQLDB ClobData objects.
                  JDBCClobFile
                  JDBCColumnMetaData Provides a site for holding the ResultSetMetaData for individual ResultSet columns.
                  JDBCCommonDataSource Common base for DataSource implementations.
                  JDBCConnection  
                  JDBCDatabaseMetaData Comprehensive information about the database as a whole.
                  JDBCDataSource A factory for connections to the physical data source that this DataSource object represents.
                  JDBCDataSourceFactory A JNDI ObjectFactory for creating data sources supported by HyperSQL JDBCDataSource for plain connections for the end user.
                  JDBCDriver Provides the java.sql.Driver interface implementation required by the JDBC specification.
                  JDBCNClob The mapping in the JavaTM programming language for the SQL NCLOB type.
                  JDBCParameterMetaData An object that can be used to get information about the types and properties for each parameter marker in a PreparedStatement object.
                  JDBCPool
                  JDBCPreparedStatement An object that represents a precompiled SQL statement.
                  JDBCResultSet A table of data representing a database result set, which is usually generated by executing a statement that queries the database.
                  JDBCResultSetMetaData An object that can be used to get information about the types and properties of the columns in a ResultSet object.
                  JDBCRowId The representation (mapping) in the Java programming language of an SQL ROWID value.
                  JDBCSavepoint The representation of a savepoint, which is a point within the current transaction that can be referenced from the Connection.rollback method.
                  JDBCSQLXML The mapping in the JavaTM programming language for the SQL XML type.
                  JDBCSQLXML.SAX2XMLStreamWriter Writes to a XMLStreamWriter from SAX events.
                  JDBCStatement  
                  Util Provides driver constants and a gateway from internal HsqlExceptions to external SQLExceptions.
                   

                  Package org.hsqldb.jdbc Description

                  Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support.



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/package-tree.html0000644000175000017500000004135512007570404024465 0ustar renerene org.hsqldb.jdbc Class Hierarchy (HSQLDB 2.2.9 API)

                  Hierarchy For Package org.hsqldb.jdbc

                  Package Hierarchies:
                  All Packages

                  Class Hierarchy

                  Interface Hierarchy



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCClob.html0000644000175000017500000016456312007570402023444 0ustar renerene JDBCClob (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCClob

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCClob
                  
                  All Implemented Interfaces:
                  Clob
                  Direct Known Subclasses:
                  JDBCNClob

                  public class JDBCClob
                  extends Object
                  implements Clob

                  The mapping in the JavaTM programming language for the SQL CLOB type. An SQL CLOB is a built-in type that stores a Character Large Object as a column value in a row of a database table. By default drivers implement a Clob object using an SQL locator(CLOB), which means that a Clob object contains a logical pointer to the SQL CLOB data rather than the data itself. A Clob object is valid for the duration of the transaction in which it was created.

                  The Clob interface provides methods for getting the length of an SQL CLOB (Character Large Object) value, for materializing a CLOB value on the client, and for searching for a substring or CLOB object within a CLOB value. Methods in the interfaces ResultSet, CallableStatement, and PreparedStatement, such as getClob and setClob allow a programmer to access an SQL CLOB value. In addition, this interface has methods for updating a CLOB value.

                  All methods on the Clob interface must be fully implemented if the JDBC driver supports the data type.

                  HSQLDB-Specific Information:

                  Previous to 2.0, the HSQLDB driver did not implement Clob using an SQL locator(CLOB). That is, an HSQLDB Clob object did not contain a logical pointer to SQL CLOB data; rather it directly contained a representation of the data (a String). As a result, an HSQLDB Clob object was itself valid beyond the duration of the transaction in which is was created, although it did not necessarily represent a corresponding value on the database. Also, the interface methods for updating a CLOB value were unsupported, with the exception of the truncate method, in that it could be used to truncate the local value.

                  Starting with 2.0, the HSQLDB driver fully supports both local and remote SQL CLOB data implementations, meaning that an HSQLDB Clob object may contain a logical pointer to remote SQL CLOB data (see JDBCClobClient) or it may directly contain a local representation of the data (as implemented in this class). In particular, when the product is built under JDK 1.6+ and the Clob instance is constructed as a result of calling JDBCConnection.createClob(), then the resulting Clob instance is initially disconnected (is not bound to the transaction scope of the vending Connection object), the data is contained directly and all interface methods for updating the CLOB value are supported for local use until the first invocation of free(); otherwise, an HSQLDB Clob's implementation is determined at runtime by the driver, it is typically not valid beyond the duration of the transaction in which is was created, and there no standard way to query whether it represents a local or remote value.

                  Since:
                  JDK 1.2, HSQLDB 1.7.2
                  Author:
                  boucherb@users

                  Constructor Summary
                  JDBCClob(String data)
                            Constructs a new JDBCClob object wrapping the given character sequence.
                   
                  Method Summary
                   void free()
                            This method frees the Clob object and releases the resources the resources that it holds.
                   InputStream getAsciiStream()
                            Retrieves the CLOB value designated by this Clob object as an ASCII stream.
                   Reader getCharacterStream()
                            Retrieves the CLOB value designated by this Clob object as a java.io.Reader object (or as a stream of characters).
                   Reader getCharacterStream(long pos, long length)
                            Returns a Reader object that contains a partial Clob value, starting with the character specified by pos, which is length characters in length.
                   String getSubString(long pos, int length)
                            Retrieves a copy of the specified substring in the CLOB value designated by this Clob object.
                   long length()
                            Retrieves the number of characters in the CLOB value designated by this Clob object.
                   long position(Clob searchstr, long start)
                            Retrieves the character position at which the specified Clob object searchstr appears in this Clob object.
                   long position(String searchstr, long start)
                            Retrieves the character position at which the specified substring searchstr appears in the SQL CLOB value represented by this Clob object.
                   OutputStream setAsciiStream(long pos)
                            Retrieves a stream to be used to write ASCII characters to the CLOB value that this Clob object represents, starting at position pos.
                   Writer setCharacterStream(long pos)
                            Retrieves a stream to be used to write a stream of Unicode characters to the CLOB value that this Clob object represents, at position pos.
                   int setString(long pos, String str)
                            Writes the given Java String to the CLOB value that this Clob object designates at the position pos.
                   int setString(long pos, String str, int offset, int len)
                            Writes len characters of str, starting at character offset, to the CLOB value that this Clob represents.
                   void truncate(long len)
                            Truncates the CLOB value that this Clob designates to have a length of len characters.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  JDBCClob

                  public JDBCClob(String data)
                           throws SQLException
                  Constructs a new JDBCClob object wrapping the given character sequence.

                  This constructor is used internally to retrieve result set values as Clob objects, yet it must be public to allow access from other packages. As such (in the interest of efficiency) this object maintains a reference to the given String object rather than making a copy and so it is gently suggested (in the interest of effective memory management) that external clients using this constructor either take pause to consider the implications or at least take care to provide a String object whose internal character buffer is not much larger than required to represent the value.

                  Parameters:
                  data - the character sequence representing the Clob value
                  Throws:
                  SQLException - if the argument is null
                  Method Detail

                  length

                  public long length()
                              throws SQLException
                  Retrieves the number of characters in the CLOB value designated by this Clob object.

                  Specified by:
                  length in interface Clob
                  Returns:
                  length of the CLOB in characters
                  Throws:
                  SQLException - if there is an error accessing the length of the CLOB value
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2, HSQLDB 1.7.2

                  getSubString

                  public String getSubString(long pos,
                                             int length)
                                      throws SQLException
                  Retrieves a copy of the specified substring in the CLOB value designated by this Clob object. The substring begins at position pos and has up to length consecutive characters.

                  HSQLDB-Specific Information:

                  The official specification above is ambiguous in that it does not precisely indicate the policy to be observed when pos > this.length() - length. One policy would be to retrieve the characters from pos to this.length(). Another would be to throw an exception. HSQLDB observes the second policy.

                  Note

                  Depending java.lang.String implementation, the returned value may be sharing the underlying (and possibly much larger) character buffer. This facilitates much faster operation and will save memory if many transient substrings are to be retrieved during processing, but it has memory management implications should retrieved substrings be required to survive for any non-trivial duration. It is left up to the client to decide how to handle the trade-off (whether to make an isolated copy of the returned substring or risk that more memory remains allocated than is absolutely required).

                  Specified by:
                  getSubString in interface Clob
                  Parameters:
                  pos - the first character of the substring to be extracted. The first character is at position 1.
                  length - the number of consecutive characters to be copied; JDBC 4.1[ the value for length must be 0 or greater]
                  Returns:
                  a String that is the specified substring in the CLOB value designated by this Clob object
                  Throws:
                  SQLException - if there is an error accessing the CLOB value; if pos is less than 1 JDBC 4.1[or length is less than 0]
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2, HSQLDB 1.7.2

                  getCharacterStream

                  public Reader getCharacterStream()
                                            throws SQLException
                  Retrieves the CLOB value designated by this Clob object as a java.io.Reader object (or as a stream of characters).

                  Specified by:
                  getCharacterStream in interface Clob
                  Returns:
                  a java.io.Reader object containing the CLOB data
                  Throws:
                  SQLException - if there is an error accessing the CLOB value
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2, HSQLDB 1.7.2
                  See Also:
                  setCharacterStream(long)

                  getAsciiStream

                  public InputStream getAsciiStream()
                                             throws SQLException
                  Retrieves the CLOB value designated by this Clob object as an ASCII stream.

                  Specified by:
                  getAsciiStream in interface Clob
                  Returns:
                  a java.io.InputStream object containing the CLOB data
                  Throws:
                  SQLException - if there is an error accessing the CLOB value
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2, HSQLDB 1.7.2
                  See Also:
                  setAsciiStream(long)

                  position

                  public long position(String searchstr,
                                       long start)
                                throws SQLException
                  Retrieves the character position at which the specified substring searchstr appears in the SQL CLOB value represented by this Clob object. The search begins at position start.

                  Specified by:
                  position in interface Clob
                  Parameters:
                  searchstr - the substring for which to search
                  start - the position at which to begin searching; the first position is 1
                  Returns:
                  the position at which the substring appears or -1 if it is not present; the first position is 1
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if start is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2, HSQLDB 1.7.2

                  position

                  public long position(Clob searchstr,
                                       long start)
                                throws SQLException
                  Retrieves the character position at which the specified Clob object searchstr appears in this Clob object. The search begins at position start.

                  Specified by:
                  position in interface Clob
                  Parameters:
                  searchstr - the Clob object for which to search
                  start - the position at which to begin searching; the first position is 1
                  Returns:
                  the position at which the Clob object appears or -1 if it is not present; the first position is 1
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if start is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2, HSQLDB 1.7.2

                  setString

                  public int setString(long pos,
                                       String str)
                                throws SQLException
                  Writes the given Java String to the CLOB value that this Clob object designates at the position pos. The string will overwrite the existing characters in the Clob object starting at the position pos. If the end of the Clob value is reached while writing the given string, then the length of the Clob value will be increased to accommodate the extra characters.

                  Note: If the value specified for pos is greater then the length+1 of the CLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 2.0 this feature is supported.

                  When built under JDK 1.6+ and the Clob instance is constructed as a result of calling JDBCConnection.createClob(), this operation affects only the client-side value; it has no effect upon a value stored in the database because JDBCConnection.createClob() constructs disconnected, initially empty Clob instances. To propagate the Clob value to a database in this case, it is required to supply the Clob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Clob instance to an updateXXX method of an updateable ResultSet.

                  Implementation Notes:

                  No attempt is made to ensure precise thread safety. Instead, volatile member field and local variable snapshot isolation semantics are implemented. This is expected to eliminate most issues related to race conditions, with the possible exception of concurrent invocation of free().

                  In general, however, if an application may perform concurrent JDBCClob modifications and the integrity of the application depends on total order Clob modification semantics, then such operations should be synchronized on an appropriate monitor.

                  Specified by:
                  setString in interface Clob
                  Parameters:
                  pos - the position at which to start writing to the CLOB value that this Clob object represents; The first position is 1
                  str - the string to be written to the CLOB value that this Clob designates
                  Returns:
                  the number of characters written
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  setString

                  public int setString(long pos,
                                       String str,
                                       int offset,
                                       int len)
                                throws SQLException
                  Writes len characters of str, starting at character offset, to the CLOB value that this Clob represents. The string will overwrite the existing characters in the Clob object starting at the position pos. If the end of the Clob value is reached while writing the given string, then the length of the Clob value will be increased to accommodate the extra characters.

                  Note: If the value specified for pos is greater then the length+1 of the CLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 2.0 this feature is supported.

                  When built under JDK 1.6+ and the Clob instance is constructed as a result of calling JDBCConnection.createClob(), this operation affects only the client-side value; it has no effect upon a value stored in a database because JDBCConnection.createClob() constructs disconnected, initially empty Clob instances. To propagate the Clob value to a database in this case, it is required to supply the Clob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Clob instance to an updateXXX method of an updateable ResultSet.

                  Implementation Notes:

                  If the value specified for pos is greater than the length of the CLOB value, then the CLOB value is extended in length to accept the written characters and the undefined region up to pos is filled with (char)0.

                  No attempt is made to ensure precise thread safety. Instead, volatile member field and local variable snapshot isolation semantics are implemented. This is expected to eliminate most issues related to race conditions, with the possible exception of concurrent invocation of free().

                  In general, however, if an application may perform concurrent JDBCClob modifications and the integrity of the application depends on total order Clob modification semantics, then such operations should be synchronized on an appropriate monitor.

                  Specified by:
                  setString in interface Clob
                  Parameters:
                  pos - the position at which to start writing to this CLOB object; The first position is 1
                  str - the string to be written to the CLOB value that this Clob object represents
                  offset - the offset into str to start reading the characters to be written
                  len - the number of characters to be written
                  Returns:
                  the number of characters written
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  setAsciiStream

                  public OutputStream setAsciiStream(long pos)
                                              throws SQLException
                  Retrieves a stream to be used to write ASCII characters to the CLOB value that this Clob object represents, starting at position pos. Characters written to the stream will overwrite the existing characters in the Clob object starting at the position pos. If the end of the Clob value is reached while writing characters to the stream, then the length of the Clob value will be increased to accommodate the extra characters.

                  Note: If the value specified for pos is greater than the length of the CLOB value, then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 2.0 this feature is supported.

                  When built under JDK 1.6+ and the Clob instance is constructed as a result of calling JDBCConnection.createClob(), this operation affects only the client-side value; it has no effect upon a value stored in a database because JDBCConnection.createClob() constructs disconnected, initially empty Clob instances. To propagate the Clob value to a database in this case, it is required to supply the Clob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Clob instance to an updateXXX method of an updateable ResultSet.

                  Implementation Notes:

                  The data written to the stream does not appear in this Clob until the stream is closed.

                  When the stream is closed, if the value specified for pos is greater than the length of the CLOB value, then the CLOB value is extended in length to accept the written characters and the undefined region up to pos is filled with (char)0.

                  Also, no attempt is made to ensure precise thread safety. Instead, volatile member field and local variable snapshot isolation semantics are implemented. This is expected to eliminate most issues related to race conditions, with the possible exception of concurrent invocation of free().

                  In general, however, if an application may perform concurrent JDBCClob modifications and the integrity of the application depends on total order Clob modification semantics, then such operations should be synchronized on an appropriate monitor.

                  Specified by:
                  setAsciiStream in interface Clob
                  Parameters:
                  pos - the position at which to start writing to this CLOB object; The first position is 1
                  Returns:
                  the stream to which ASCII encoded characters can be written
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  getAsciiStream()

                  setCharacterStream

                  public Writer setCharacterStream(long pos)
                                            throws SQLException
                  Retrieves a stream to be used to write a stream of Unicode characters to the CLOB value that this Clob object represents, at position pos. Characters written to the stream will overwrite the existing characters in the Clob object starting at the position pos. If the end of the Clob value is reached while writing characters to the stream, then the length of the Clob value will be increased to accommodate the extra characters.

                  Note: If the value specified for pos is greater then the length+1 of the CLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 2.0 this feature is supported.

                  When built under JDK 1.6+ and the Clob instance is constructed as a result of calling JDBCConnection.createClob(), this operation affects only the client-side value; it has no effect upon a value stored in a database because JDBCConnection.createClob() constructs disconnected, initially empty Clob instances. To propagate the Clob value to a database in this case, it is required to supply the Clob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Clob instance to an updateXXX method of an updateable ResultSet.

                  Implementation Notes:

                  The data written to the stream does not appear in this Clob until the stream is closed.

                  When the stream is closed, if the value specified for pos is greater than the length of the CLOB value, then the CLOB value is extended in length to accept the written characters and the undefined region up to pos is filled with (char)0.

                  Also, no attempt is made to ensure precise thread safety. Instead, volatile member field and local variable snapshot isolation semantics are implemented. This is expected to eliminate most issues related to race conditions, with the possible exception of concurrent invocation of free().

                  In general, however, if an application may perform concurrent JDBCClob modifications and the integrity of the application depends on total order Clob modification semantics, then such operations should be synchronized on an appropriate monitor.

                  Specified by:
                  setCharacterStream in interface Clob
                  Parameters:
                  pos - the position at which to start writing to the CLOB value; The first position is 1
                  Returns:
                  a stream to which Unicode encoded characters can be written
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if pos is less than 1
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2
                  See Also:
                  getCharacterStream()

                  truncate

                  public void truncate(long len)
                                throws SQLException
                  Truncates the CLOB value that this Clob designates to have a length of len characters.

                  Note: If the value specified for len is greater than the length of the CLOB value, then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 2.0 this feature is fully supported.

                  When built under JDK 1.6+ and the Clob instance is constructed as a result of calling JDBCConnection.createClob(), this operation affects only the client-side value; it has no effect upon a value stored in a database because JDBCConnection.createClob() constructs disconnected, initially empty Blob instances. To propagate the truncated Clob value to a database in this case, it is required to supply the Clob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updateable ResultSet.

                  Implementation Notes:

                  HSQLDB throws an SQLException if the specified len is greater than the value returned by length.

                  Specified by:
                  truncate in interface Clob
                  Parameters:
                  len - the length, in characters, to which the CLOB value should be truncated
                  Throws:
                  SQLException - if there is an error accessing the CLOB value or if len is less than 0
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7.2

                  free

                  public void free()
                            throws SQLException
                  This method frees the Clob object and releases the resources the resources that it holds. The object is invalid once the free method is called.

                  After free has been called, any attempt to invoke a method other than free will result in a SQLException being thrown. If free is called multiple times, the subsequent calls to free are treated as a no-op.

                  Specified by:
                  free in interface Clob
                  Throws:
                  SQLException - if an error occurs releasing the Clob's resources
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getCharacterStream

                  public Reader getCharacterStream(long pos,
                                                   long length)
                                            throws SQLException
                  Returns a Reader object that contains a partial Clob value, starting with the character specified by pos, which is length characters in length.

                  Specified by:
                  getCharacterStream in interface Clob
                  Parameters:
                  pos - the offset to the first character of the partial value to be retrieved. The first character in the Clob is at position 1.
                  length - the length in characters of the partial value to be retrieved.
                  Returns:
                  Reader through which the partial Clob value can be read.
                  Throws:
                  SQLException - if pos is less than 1 or if pos is greater than the number of characters in the Clob or if pos + length is greater than the number of characters in the Clob
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCStatement.html0000644000175000017500000041777212007570404024536 0ustar renerene JDBCStatement (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCStatement

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCStatement
                  
                  All Implemented Interfaces:
                  Statement, Wrapper

                  public class JDBCStatement
                  extends Object
                  implements Statement, Wrapper

                  The object used for executing a static SQL statement and returning the results it produces.

                  By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists.

                  HSQLDB-Specific Information:

                  From version 2.0, the implementation meets the JDBC specification requirment that any existing ResultSet is closed when execute() or executeQuery() methods are called.

                  JRE 1.1.x Notes:

                  In general, JDBC 2 support requires Java 1.2 and above, and JDBC3 requires Java 1.4 and above. In HSQLDB, support for methods introduced in different versions of JDBC depends on the JDK version used for compiling and building HSQLDB.

                  Since 1.7.0, all JDBC 2 methods can be called while executing under the version 1.1.x Java Runtime EnvironmentTM. However, in addition to this technique requiring explicit casts to the org.hsqldb.jdbc.* classes, some of these method calls require int values that are defined only in the JDBC 2 or greater version of the ResultSet interface. For this reason these values are defined in JDBCResultSet.

                  In a JRE 1.1.x environment, calling JDBC 2 methods that take or return the JDBC2-only ResultSet values can be achieved by referring to them in parameter specifications and return value comparisons, respectively, as follows:

                   JDBCResultSet.FETCH_FORWARD
                   JDBCResultSet.TYPE_FORWARD_ONLY
                   JDBCResultSet.TYPE_SCROLL_INSENSITIVE
                   JDBCResultSet.CONCUR_READ_ONLY
                   //etc.
                   

                  However, please note that code written to use HSQLDB JDBC 2 features under JDK 1.1.x will not be compatible for use with other JDBC 2 drivers. Please also note that this feature is offered solely as a convenience to developers who must work under JDK 1.1.x due to operating constraints, yet wish to use some of the more advanced features available under the JDBC 2 specification.

                  (fredt@users)
                  (boucherb@users)

                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)
                  See Also:
                  JDBCConnection.createStatement(), JDBCResultSet

                  Field Summary
                   
                  Fields inherited from interface java.sql.Statement
                  CLOSE_ALL_RESULTS, CLOSE_CURRENT_RESULT, EXECUTE_FAILED, KEEP_CURRENT_RESULT, NO_GENERATED_KEYS, RETURN_GENERATED_KEYS, SUCCESS_NO_INFO
                   
                  Method Summary
                   void addBatch(String sql)
                            Adds the given SQL command to the current list of commmands for this Statement object.
                   void cancel()
                            Cancels this Statement object if both the DBMS and driver support aborting an SQL statement.
                   void clearBatch()
                            Empties this Statement object's current list of SQL commands.
                   void clearWarnings()
                            Clears all the warnings reported on this Statement object.
                   void close()
                            Releases this Statement object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed.
                   void closeOnCompletion()
                            Specifies that this Statement will be closed when all its dependent result sets are closed.
                   boolean execute(String sql)
                            Executes the given SQL statement, which may return multiple results.
                   boolean execute(String sql, int autoGeneratedKeys)
                            Executes the given SQL statement, which may return multiple results, and signals the driver that any auto-generated keys should be made available for retrieval.
                   boolean execute(String sql, int[] columnIndexes)
                            Executes the given SQL statement, which may return multiple results, and signals the driver that the auto-generated keys indicated in the given array should be made available for retrieval.
                   boolean execute(String sql, String[] columnNames)
                            Executes the given SQL statement, which may return multiple results, and signals the driver that the auto-generated keys indicated in the given array should be made available for retrieval.
                   int[] executeBatch()
                            Submits a batch of commands to the database for execution and if all commands execute successfully, returns an array of update counts.
                   ResultSet executeQuery(String sql)
                            Executes the given SQL statement, which returns a single ResultSet object.
                   int executeUpdate(String sql)
                            Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement.
                   int executeUpdate(String sql, int autoGeneratedKeys)
                            Executes the given SQL statement and signals the driver with the given flag about whether the auto-generated keys produced by this Statement object should be made available for retrieval.
                   int executeUpdate(String sql, int[] columnIndexes)
                            Executes the given SQL statement and signals the driver that the auto-generated keys indicated in the given array should be made available for retrieval.
                   int executeUpdate(String sql, String[] columnNames)
                            Executes the given SQL statement and signals the driver that the auto-generated keys indicated in the given array should be made available for retrieval.
                   Connection getConnection()
                            Retrieves the Connection object that produced this Statement object.
                   int getFetchDirection()
                            Retrieves the direction for fetching rows from database tables that is the default for result sets generated from this Statement object.
                   int getFetchSize()
                            Retrieves the number of result set rows that is the default fetch size for ResultSet objects generated from this Statement object.
                   ResultSet getGeneratedKeys()
                            Retrieves any auto-generated keys created as a result of executing this Statement object.
                   int getMaxFieldSize()
                            Retrieves the maximum number of bytes that can be returned for character and binary column values in a ResultSet object produced by this Statement object.
                   int getMaxRows()
                            Retrieves the maximum number of rows that a ResultSet object produced by this Statement object can contain.
                   boolean getMoreResults()
                            Moves to this Statement object's next result, returns true if it is a ResultSet object, and implicitly closes any current ResultSet object(s) obtained with the method getResultSet.
                   boolean getMoreResults(int current)
                            Moves to this Statement object's next result, deals with any current ResultSet object(s) according to the instructions specified by the given flag, and returns true if the next result is a ResultSet object.
                   int getQueryTimeout()
                            Retrieves the number of seconds the driver will wait for a Statement object to execute.
                   ResultSet getResultSet()
                            Retrieves the current result as a ResultSet object.
                   int getResultSetConcurrency()
                            Retrieves the result set concurrency for ResultSet objects generated by this Statement object.
                   int getResultSetHoldability()
                            Retrieves the result set holdability for ResultSet objects generated by this Statement object.
                   int getResultSetType()
                            Retrieves the result set type for ResultSet objects generated by this Statement object.
                   int getUpdateCount()
                            Retrieves the current result as an update count; if the result is a ResultSet object or there are no more results, -1 is returned.
                   SQLWarning getWarnings()
                            Retrieves the first warning reported by calls on this Statement object.
                   boolean isClosed()
                            Retrieves whether this Statement object has been closed.
                   boolean isCloseOnCompletion()
                            Returns a value indicating whether this Statement will be closed when all its dependent result sets are closed.
                   boolean isPoolable()
                            Returns a value indicating whether the Statement is poolable or not.
                   boolean isWrapperFor(Class<?> iface)
                            Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                   void setCursorName(String name)
                            Sets the SQL cursor name to the given String, which will be used by subsequent Statement object execute methods.
                   void setEscapeProcessing(boolean enable)
                            Sets escape processing on or off.
                   void setFetchDirection(int direction)
                            Gives the driver a hint as to the direction in which rows will be processed in ResultSet objects created using this Statement object.
                   void setFetchSize(int rows)
                            (JDBC4 clarification:) Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for ResultSet objects genrated by this Statement.
                   void setMaxFieldSize(int max)
                            (JDBC4 clarification:) Sets the limit for the maximum number of bytes in a ResultSet Sets the limit for the maximum number of bytes that can be returned for character and binary column values in a ResultSet object produced by this Statement object.
                   void setMaxRows(int max)
                            (JDBC4 clarification:) Sets the limit for the maximum number of rows that any ResultSet object generated by this Statement object can contain to the given number.
                   void setPoolable(boolean poolable)
                            Requests that a Statement be pooled or not pooled.
                   void setQueryTimeout(int seconds)
                            Sets the number of seconds the driver will wait for a Statement object to execute to the given number of seconds.
                  <T> T
                  unwrap(Class<T> iface)
                            Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Method Detail

                  executeQuery

                  public ResultSet executeQuery(String sql)
                                         throws SQLException
                  Executes the given SQL statement, which returns a single ResultSet object.

                  HSQLDB-Specific Information:

                  This method should not be used for statements other than SELECT queries.

                  From 2.0, HSQLDB throws an exception when the statement is a DDL statement or an UPDATE or DELETE statement.

                  Specified by:
                  executeQuery in interface Statement
                  Parameters:
                  sql - an SQL statement to be sent to the database, typically a static SQL SELECT statement
                  Returns:
                  a ResultSet object that contains the data produced by the given query; never null
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the given SQL statement produces anything other than a single ResultSet object

                  executeUpdate

                  public int executeUpdate(String sql)
                                    throws SQLException
                  Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement.

                  Specified by:
                  executeUpdate in interface Statement
                  Parameters:
                  sql - (JDBC4 clarification:) an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement.
                  Returns:
                  (JDBC4 clarification:) either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the given SQL statement produces a ResultSet object

                  close

                  public void close()
                             throws SQLException
                  Releases this Statement object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed. It is generally good practice to release resources as soon as you are finished with them to avoid tying up database resources.

                  Calling the method close on a Statement object that is already closed has no effect.

                  Note:When a Statement object is closed, its current ResultSet object, if one exists, is also closed. (JDBC4 deleted:) [A Statement object is automatically closed when it is garbage collected.]

                  Specified by:
                  close in interface Statement
                  Throws:
                  SQLException - if a database access error occurs

                  getMaxFieldSize

                  public int getMaxFieldSize()
                                      throws SQLException
                  Retrieves the maximum number of bytes that can be returned for character and binary column values in a ResultSet object produced by this Statement object. This limit applies only to BINARY, VARBINARY, LONGVARBINARY, CHAR, VARCHAR, (JDBC4 new:) NCHAR, NVARCHAR, LONGNVARCHAR and LONGVARCHAR columns. If the limit is exceeded, the excess data is silently discarded.

                  HSQLDB-Specific Information:

                  Including 1.7.2, HSQLDB always returns zero, meaning there is no limit.

                  Specified by:
                  getMaxFieldSize in interface Statement
                  Returns:
                  the current column size limit for columns storing character and binary values; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  setMaxFieldSize(int)

                  setMaxFieldSize

                  public void setMaxFieldSize(int max)
                                       throws SQLException
                  (JDBC4 clarification:) Sets the limit for the maximum number of bytes in a ResultSet Sets the limit for the maximum number of bytes that can be returned for character and binary column values in a ResultSet object produced by this Statement object. This limit applies only to BINARY, VARBINARY, LONGVARBINARY, CHAR, VARCHAR, (JDBC4 new:) NCHAR, NVARCHAR, LONGNVARCHAR and LONGVARCHAR fields. If the limit is exceeded, the excess data is silently discarded. For maximum portability, use values greater than 256.

                  HSQLDB-Specific Information:

                  To present, calls to this method are simply ignored; HSQLDB always stores the full number of bytes when dealing with any of the field types mentioned above. These types all have an absolute maximum element upper bound determined by the Java array index limit java.lang.Integer.MAX_VALUE. For XXXBINARY types, this translates to Integer.MAX_VALUE bytes. For XXXCHAR types, this translates to 2 * Integer.MAX_VALUE bytes (2 bytes / character).

                  In practice, field sizes are limited to values much smaller than the absolute maximum element upper bound, in particular due to limits imposed on the maximum available Java heap memory.

                  Specified by:
                  setMaxFieldSize in interface Statement
                  Parameters:
                  max - the new column size limit in bytes; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the condition max >= 0 is not satisfied
                  See Also:
                  getMaxFieldSize()

                  getMaxRows

                  public int getMaxRows()
                                 throws SQLException
                  Retrieves the maximum number of rows that a ResultSet object produced by this Statement object can contain. If this limit is exceeded, the excess rows are silently dropped.

                  Specified by:
                  getMaxRows in interface Statement
                  Returns:
                  the current maximum number of rows for a ResultSet object produced by this Statement object; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  setMaxRows(int)

                  setMaxRows

                  public void setMaxRows(int max)
                                  throws SQLException
                  (JDBC4 clarification:) Sets the limit for the maximum number of rows that any ResultSet object generated by this Statement object can contain to the given number. If the limit is exceeded, the excess rows are silently dropped.

                  Specified by:
                  setMaxRows in interface Statement
                  Parameters:
                  max - the new max rows limit; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the condition max >= 0 is not satisfied
                  See Also:
                  getMaxRows()

                  setEscapeProcessing

                  public void setEscapeProcessing(boolean enable)
                                           throws SQLException
                  Sets escape processing on or off. If escape scanning is on (the default), the driver will do escape substitution before sending the SQL statement to the database. Note: Since prepared statements have usually been parsed prior to making this call, disabling escape processing for PreparedStatements objects will have no effect.

                  Specified by:
                  setEscapeProcessing in interface Statement
                  Parameters:
                  enable - true to enable escape processing; false to disable it
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement

                  getQueryTimeout

                  public int getQueryTimeout()
                                      throws SQLException
                  Retrieves the number of seconds the driver will wait for a Statement object to execute. If the limit is exceeded, a SQLException is thrown.

                  HSQLDB-Specific Information:

                  To present, HSQLDB always returns zero, meaning there is no limit.

                  Specified by:
                  getQueryTimeout in interface Statement
                  Returns:
                  the current query timeout limit in seconds; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  setQueryTimeout(int)

                  setQueryTimeout

                  public void setQueryTimeout(int seconds)
                                       throws SQLException
                  Sets the number of seconds the driver will wait for a Statement object to execute to the given number of seconds. If the limit is exceeded, an SQLException is thrown. A JDBC (JDBC4 clarification:) driver must apply this limit to the execute, executeQuery and executeUpdate methods. JDBC driver implementations may also apply this limit to ResultSet methods (consult your driver vendor documentation for details).

                  HSQLDB-Specific Information:

                  The maximum value is Short.MAX_VALUE. The minimum is 0, indicating no limit. In version 2.0, calls to this method are ignored; HSQLDB waits an unlimited amount of time for statement execution requests to return.

                  Specified by:
                  setQueryTimeout in interface Statement
                  Parameters:
                  seconds - the new query timeout limit in seconds; zero means there is no limit
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the condition seconds >= 0 is not satisfied
                  See Also:
                  getQueryTimeout()

                  cancel

                  public void cancel()
                              throws SQLException
                  Cancels this Statement object if both the DBMS and driver support aborting an SQL statement. This method can be used by one thread to cancel a statement that is being executed by another thread.

                  HSQLDB-Specific Information:

                  Including 2.0, HSQLDB does not support aborting an SQL statement; calls to this method are ignored.

                  Specified by:
                  cancel in interface Statement
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method

                  getWarnings

                  public SQLWarning getWarnings()
                                         throws SQLException
                  Retrieves the first warning reported by calls on this Statement object. Subsequent Statement object warnings will be chained to this SQLWarning object.

                  The warning chain is automatically cleared each time a statement is (re)executed. This method may not be called on a closed Statement object; doing so will cause an SQLException to be thrown.

                  Note: If you are processing a ResultSet object, any warnings associated with reads on that ResultSet object will be chained on it rather than on the Statement object that produced it.

                  HSQLDB-Specific Information:

                  In 2.0, HSQLDB may produces Statement warnings; this method always returns null.

                  Specified by:
                  getWarnings in interface Statement
                  Returns:
                  the first SQLWarning object or null if there are no warnings
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement

                  clearWarnings

                  public void clearWarnings()
                                     throws SQLException
                  Clears all the warnings reported on this Statement object. After a call to this method, the method getWarnings will return null until a new warning is reported for this Statement object.

                  HSQLDB-Specific Information:

                  In HSQLDB 2.0, SQLWarning objects may be produced for Statement Objects; calls to this method clear the warnings.

                  Specified by:
                  clearWarnings in interface Statement
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement

                  setCursorName

                  public void setCursorName(String name)
                                     throws SQLException
                  Sets the SQL cursor name to the given String, which will be used by subsequent Statement object execute methods. This name can then be used in SQL positioned update or delete statements to identify the current row in the ResultSet object generated by this statement. If the database does not support positioned update/delete, this method is a noop. To insure that a cursor has the proper isolation level to support updates, the cursor's SELECT statement should have the form SELECT FOR UPDATE. If FOR UPDATE is not present, positioned updates may fail.

                  Note: By definition, the execution of positioned updates and deletes must be done by a different Statement object than the one that generated the ResultSet object being used for positioning. Also, cursor names must be unique within a connection.

                  HSQLDB-Specific Information:

                  Including 2.0, HSQLDB does not support named cursors; calls to this method are ignored.

                  Specified by:
                  setCursorName in interface Statement
                  Parameters:
                  name - the new cursor name, which must be unique within a connection
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method

                  execute

                  public boolean execute(String sql)
                                  throws SQLException
                  Executes the given SQL statement, which may return multiple results. In some (uncommon) situations, a single SQL statement may return multiple result sets and/or update counts. Normally you can ignore this unless you are (1) executing a stored procedure that you know may return multiple results or (2) you are dynamically executing an unknown SQL string.

                  The execute method executes an SQL statement and indicates the form of the first result. You must then use the methods getResultSet or getUpdateCount to retrieve the result, and getMoreResults to move to any subsequent result(s).

                  Specified by:
                  execute in interface Statement
                  Parameters:
                  sql - any SQL statement
                  Returns:
                  true if the first result is a ResultSet object; false if it is an update count or there are no results
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  getResultSet(), getUpdateCount(), getMoreResults()

                  getResultSet

                  public ResultSet getResultSet()
                                         throws SQLException
                  Retrieves the current result as a ResultSet object. This method should be called only once per result.

                  HSQLDB-Specific Information:

                  Specified by:
                  getResultSet in interface Statement
                  Returns:
                  the current result as a ResultSet object or null if the result is an update count or there are no more results
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  execute(java.lang.String)

                  getUpdateCount

                  public int getUpdateCount()
                                     throws SQLException
                  Retrieves the current result as an update count; if the result is a ResultSet object or there are no more results, -1 is returned. This method should be called only once per result.

                  Specified by:
                  getUpdateCount in interface Statement
                  Returns:
                  the current result as an update count; -1 if the current result is a ResultSet object or there are no more results
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  execute(java.lang.String)

                  getMoreResults

                  public boolean getMoreResults()
                                         throws SQLException
                  Moves to this Statement object's next result, returns true if it is a ResultSet object, and implicitly closes any current ResultSet object(s) obtained with the method getResultSet.

                  There are no more results when the following is true:

                       // stmt is a Statement object
                       ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
                   

                  Specified by:
                  getMoreResults in interface Statement
                  Returns:
                  true if the next result is a ResultSet object; false if it is an update count or there are no more results
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  See Also:
                  execute(java.lang.String)

                  setFetchDirection

                  public void setFetchDirection(int direction)
                                         throws SQLException
                  Gives the driver a hint as to the direction in which rows will be processed in ResultSet objects created using this Statement object. The default value is ResultSet.FETCH_FORWARD.

                  Note that this method sets the default fetch direction for result sets generated by this Statement object. Each result set has its own methods for getting and setting its own fetch direction.

                  HSQLDB-Specific Information:

                  HSQLDB accepts all valid parameters.

                  Specified by:
                  setFetchDirection in interface Statement
                  Parameters:
                  direction - the initial direction for processing rows
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the given direction is not one of ResultSet.FETCH_FORWARD, ResultSet.FETCH_REVERSE, or ResultSet.FETCH_UNKNOWN
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  getFetchDirection()

                  getFetchDirection

                  public int getFetchDirection()
                                        throws SQLException
                  Retrieves the direction for fetching rows from database tables that is the default for result sets generated from this Statement object. If this Statement object has not set a fetch direction by calling the method setFetchDirection, the return value is implementation-specific.

                  HSQLDB-Specific Information:

                  HSQLDB returns the fetch direction.

                  Specified by:
                  getFetchDirection in interface Statement
                  Returns:
                  the default fetch direction for result sets generated from this Statement object
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  setFetchDirection(int)

                  setFetchSize

                  public void setFetchSize(int rows)
                                    throws SQLException
                  (JDBC4 clarification:) Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for ResultSet objects genrated by this Statement. If the value specified is zero, then the hint is ignored. The default value is zero.

                  HSQLDB-Specific Information:

                  HSQLDB uses the specified value as a hint, but may process more or fewer rows than specified.

                  Specified by:
                  setFetchSize in interface Statement
                  Parameters:
                  rows - the number of rows to fetch
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the (JDBC4 modified:) condition rows >= 0 is not satisfied.
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  getFetchSize()

                  getFetchSize

                  public int getFetchSize()
                                   throws SQLException
                  Retrieves the number of result set rows that is the default fetch size for ResultSet objects generated from this Statement object. If this Statement object has not set a fetch size by calling the method setFetchSize, the return value is implementation-specific.
                  HSQLDB-Specific Information

                  HSQLDB returns 0 by default, or the fetch size specified by setFetchSize

                  Specified by:
                  getFetchSize in interface Statement
                  Returns:
                  the default fetch size for result sets generated from this Statement object
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  setFetchSize(int)

                  getResultSetConcurrency

                  public int getResultSetConcurrency()
                                              throws SQLException
                  Retrieves the result set concurrency for ResultSet objects generated by this Statement object.

                  HSQLDB-Specific Information:

                  HSQLDB supports CONCUR_READ_ONLY and CONCUR_UPDATABLE concurrency.

                  Specified by:
                  getResultSetConcurrency in interface Statement
                  Returns:
                  either ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)

                  getResultSetType

                  public int getResultSetType()
                                       throws SQLException
                  Retrieves the result set type for ResultSet objects generated by this Statement object.

                  HSQLDB-Specific Information:

                  HSQLDB 1.7.0 and later versions support TYPE_FORWARD_ONLY and TYPE_SCROLL_INSENSITIVE.

                  Specified by:
                  getResultSetType in interface Statement
                  Returns:
                  one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)

                  addBatch

                  public void addBatch(String sql)
                                throws SQLException
                  Adds the given SQL command to the current list of commmands for this Statement object. The commands in this list can be executed as a batch by calling the method executeBatch.

                  (JDBC4 clarification:)

                  NOTE: Support of an ability to batch updates is optional.

                  HSQLDB-Specific Information:

                  Starting with 1.7.2, this feature is supported.

                  Specified by:
                  addBatch in interface Statement
                  Parameters:
                  sql - typically this is a SQL INSERT or UPDATE statement (:JDBC4 modified)
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the driver does not support batch updates
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  executeBatch()

                  clearBatch

                  public void clearBatch()
                                  throws SQLException
                  Empties this Statement object's current list of SQL commands.

                  (JDBC4 clarification:)

                  NOTE: Support of an ability to batch updates is optional.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 1.7.2, this feature is supported.

                  Specified by:
                  clearBatch in interface Statement
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the driver does not support batch updates
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  addBatch(java.lang.String)

                  executeBatch

                  public int[] executeBatch()
                                     throws SQLException
                  Submits a batch of commands to the database for execution and if all commands execute successfully, returns an array of update counts. The int elements of the array that is returned are ordered to correspond to the commands in the batch, which are ordered according to the order in which they were added to the batch. The elements in the array returned by the method executeBatch may be one of the following:
                  1. A number greater than or equal to zero -- indicates that the command was processed successfully and is an update count giving the number of rows in the database that were affected by the command's execution
                  2. A value of SUCCESS_NO_INFO -- indicates that the command was processed successfully but that the number of rows affected is unknown

                    If one of the commands in a batch update fails to execute properly, this method throws a BatchUpdateException, and a JDBC driver may or may not continue to process the remaining commands in the batch. However, the driver's behavior must be consistent with a particular DBMS, either always continuing to process commands or never continuing to process commands. If the driver continues processing after a failure, the array returned by the method BatchUpdateException.getUpdateCounts will contain as many elements as there are commands in the batch, and at least one of the elements will be the following:

                  3. A value of EXECUTE_FAILED -- indicates that the command failed to execute successfully and occurs only if a driver continues to process commands after a command fails

                  (JDBC4 clarification:)

                  NOTE: Support of an ability to batch updates is optional.

                  The possible implementations and return values have been modified in the Java 2 SDK, Standard Edition, version 1.3 to accommodate the option of continuing to proccess commands in a batch update after a BatchUpdateException obejct has been thrown.

                  HSQLDB-Specific Information:

                  Starting with HSQLDB 1.7.2, this feature is supported.

                  HSQLDB stops execution of commands in a batch when one of the commands results in an exception. The size of the returned array equals the number of commands that were executed successfully.

                  When the product is built under the JAVA1 target, an exception is never thrown and it is the responsibility of the client software to check the size of the returned update count array to determine if any batch items failed. To build and run under the JAVA2 target, JDK/JRE 1.3 or higher must be used.

                  Specified by:
                  executeBatch in interface Statement
                  Returns:
                  an array of update counts containing one element for each command in the batch. The elements of the array are ordered according to the order in which commands were added to the batch.
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the driver does not support batch statements. Throws BatchUpdateException (a subclass of SQLException) if one of the commands sent to the database fails to execute properly or attempts to return a result set.
                  Since:
                  JDK 1.3 (JDK 1.1.x developers: read the overview for JDBCStatement)
                  See Also:
                  addBatch(java.lang.String), DatabaseMetaData.supportsBatchUpdates()

                  getConnection

                  public Connection getConnection()
                                           throws SQLException
                  Retrieves the Connection object that produced this Statement object.

                  Specified by:
                  getConnection in interface Statement
                  Returns:
                  the connection that produced this statement
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  Since:
                  JDK 1.2 (JDK 1.1.x developers: read the overview for JDBCStatement)

                  getMoreResults

                  public boolean getMoreResults(int current)
                                         throws SQLException
                  Moves to this Statement object's next result, deals with any current ResultSet object(s) according to the instructions specified by the given flag, and returns true if the next result is a ResultSet object.

                  There are no more results when the following is true:

                       // stmt is a Statement object
                       ((stmt.getMoreResults(current) == false) && (stmt.getUpdateCount() == -1))
                   

                  HSQLDB-Specific Information:

                  HSQLDB moves to the next ResultSet and returns the correct result.

                  Specified by:
                  getMoreResults in interface Statement
                  Parameters:
                  current - one of the following Statement constants indicating what should happen to current ResultSet objects obtained using the method getResultSet: Statement.CLOSE_CURRENT_RESULT, Statement.KEEP_CURRENT_RESULT, or Statement.CLOSE_ALL_RESULTS
                  Returns:
                  true if the next result is a ResultSet object; false if it is an update count or there are no more results
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the argument supplied is not one of the following: Statement.CLOSE_CURRENT_RESULT, Statement.KEEP_CURRENT_RESULT, or Statement.CLOSE_ALL_RESULTS
                  Since:
                  JDK 1.4, HSQLDB 1.7
                  See Also:
                  execute(java.lang.String)

                  getGeneratedKeys

                  public ResultSet getGeneratedKeys()
                                             throws SQLException
                  Retrieves any auto-generated keys created as a result of executing this Statement object. If this Statement object did not generate any keys, an empty ResultSet object is returned.

                  (JDBC4 clarification:)

                  Note:If the columns which represent the auto-generated keys were not specified, the JDBC driver implementation will determine the columns which best represent the auto-generated keys.

                  HSQLDB-Specific Information:

                  Starting with version 2.0, HSQLDB supports this feature with single-row and multi-row insert, update and merge statements.

                  This method returns a result set only if the executeUpdate methods that was used is one of the three methods that have the extra parameter indicating return of generated keys

                  If the executeUpaged method did not specify the columns which represent the auto-generated keys the IDENTITY column or GENERATED column(s) of the table are returned.

                  The executeUpdate methods with column indexes or column names return the post-insert or post-update values of the specified columns, whether the columns are generated or not. This allows values that have been modified by execution of triggers to be returned.

                  If column names or indexes provided by the user in the executeUpdate() method calls do not correspond to table columns (incorrect names or indexes larger than the coloum count), an empty result is returned.

                  Specified by:
                  getGeneratedKeys in interface Statement
                  Returns:
                  a ResultSet object containing the auto-generated key(s) generated by the execution of this Statement object
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  executeUpdate

                  public int executeUpdate(String sql,
                                           int autoGeneratedKeys)
                                    throws SQLException
                  Executes the given SQL statement and signals the driver with the given flag about whether the auto-generated keys produced by this Statement object should be made available for retrieval. The driver will ignore the flag if the SQL statement is not an INSERT statement, or an SQL statement able to return auto-generated keys (the list of such statements is vendor-specific).

                  HSQLDB-Specific Information:

                  Starting with version 2.0, HSQLDB supports returning generated columns with single-row and multi-row INSERT, UPDATE and MERGE statements.

                  If the table has an IDENTITY or GENERATED column(s) the values for these columns are returned in the next call to getGeneratedKeys().

                  Specified by:
                  executeUpdate in interface Statement
                  Parameters:
                  sql - an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement. (:JDBC4 clarification)
                  autoGeneratedKeys - a flag indicating whether auto-generated keys should be made available for retrieval; one of the following constants: Statement.RETURN_GENERATED_KEYS Statement.NO_GENERATED_KEYS
                  Returns:
                  either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing (:JDBC4 clarification)
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement, the given SQL statement returns a ResultSet object, or the given constant is not one of those allowed
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method with a constant of Statement.RETURN_GENERATED_KEYS
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  executeUpdate

                  public int executeUpdate(String sql,
                                           int[] columnIndexes)
                                    throws SQLException
                  Executes the given SQL statement and signals the driver that the auto-generated keys indicated in the given array should be made available for retrieval. The driver will ignore the array if the SQL statement is not an INSERT statement, or an SQL statement able to return (JDBC 4 clarification) auto-generated keys (the list of such statements is vendor-specific).

                  HSQLDB-Specific Information:

                  Starting with version 2.0, HSQLDB supports returning generated columns with single-row and multi-row INSERT, UPDATE and MERGE statements.

                  The columnIndexes may specify any set of columns of the table.

                  Specified by:
                  executeUpdate in interface Statement
                  Parameters:
                  sql - an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement. (:JDBC4 clarification)
                  columnIndexes - an array of column indexes indicating the columns that should be returned from the inserted row
                  Returns:
                  either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing (:JDBC 4 clarification)
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement, the SQL statement returns a ResultSet object, or the second argument supplied to this method is not an int array whose elements are valid column indexes
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  executeUpdate

                  public int executeUpdate(String sql,
                                           String[] columnNames)
                                    throws SQLException
                  Executes the given SQL statement and signals the driver that the auto-generated keys indicated in the given array should be made available for retrieval. The driver will ignore the array if the SQL statement (JDBC4 clarification:) is not an INSERT statement, or an SQL statement able to return auto-generated keys (the list of such statements is vendor-specific).

                  HSQLDB-Specific Information:

                  Starting with version 2.0, HSQLDB supports returning generated columns with single-row and multi-row INSERT, UPDATE and MERGE statements.

                  The columnNames may specify any set of columns of the table.

                  Specified by:
                  executeUpdate in interface Statement
                  Parameters:
                  sql - an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement. (:JDBC4 clarification)
                  columnNames - an array of the names of the columns that should be returned from the inserted row
                  Returns:
                  either the row count for INSERT, UPDATE, or DELETE statements, or 0 for SQL statements that return nothing
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement, the SQL statement returns a ResultSet object, or the second argument supplied to this method is not a String array whose elements are valid column names
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  execute

                  public boolean execute(String sql,
                                         int autoGeneratedKeys)
                                  throws SQLException
                  Executes the given SQL statement, which may return multiple results, and signals the driver that any auto-generated keys should be made available for retrieval. The driver will ignore this signal if the SQL statement is not an INSERT statement, or an SQL statement able to return (JDBC4 clarification) auto-generated keys (the list of such statements is vendor-specific).

                  In some (uncommon) situations, a single SQL statement may return multiple result sets and/or update counts. Normally you can ignore this unless you are (1) executing a stored procedure that you know may return multiple results or (2) you are dynamically executing an unknown SQL string.

                  The execute method executes an SQL statement and indicates the form of the first result. You must then use the methods getResultSet or getUpdateCount to retrieve the result, and getMoreResults to move to any subsequent result(s).

                  HSQLDB-Specific Information:

                  Starting with 2.0, HSQLDB supports this feature.

                  Specified by:
                  execute in interface Statement
                  Parameters:
                  sql - any SQL statement
                  autoGeneratedKeys - a constant indicating whether auto-generated keys should be made available for retrieval using the method getGeneratedKeys; one of the following constants: Statement.RETURN_GENERATED_KEYS or Statement.NO_GENERATED_KEYS
                  Returns:
                  true if the first result is a ResultSet object; false if it is an update count or there are no results
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the second parameter supplied to this method is not Statement.RETURN_GENERATED_KEYS or Statement.NO_GENERATED_KEYS.
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method with a constant of Statement.RETURN_GENERATED_KEYS
                  Since:
                  JDK 1.4, HSQLDB 1.7
                  See Also:
                  getResultSet(), getUpdateCount(), getMoreResults(), getGeneratedKeys()

                  execute

                  public boolean execute(String sql,
                                         int[] columnIndexes)
                                  throws SQLException
                  Executes the given SQL statement, which may return multiple results, and signals the driver that the auto-generated keys indicated in the given array should be made available for retrieval. This array contains the indexes of the columns in the target table that contain the auto-generated keys that should be made available. The driver will ignore the array if the SQL statement (JDBC4 clarification) is not an INSERT statement, or an SQL statement able to return auto-generated keys (the list of such statements is vendor-specific).

                  Under some (uncommon) situations, a single SQL statement may return multiple result sets and/or update counts. Normally you can ignore this unless you are (1) executing a stored procedure that you know may return multiple results or (2) you are dynamically executing an unknown SQL string.

                  The execute method executes an SQL statement and indicates the form of the first result. You must then use the methods getResultSet or getUpdateCount to retrieve the result, and getMoreResults to move to any subsequent result(s).

                  HSQLDB-Specific Information:

                  Starting with 2.0, HSQLDB supports this feature.

                  Specified by:
                  execute in interface Statement
                  Parameters:
                  sql - any SQL statement
                  columnIndexes - an array of the indexes of the columns in the inserted row that should be made available for retrieval by a call to the method getGeneratedKeys
                  Returns:
                  true if the first result is a ResultSet object; false if it is an update count or there are no results
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the elements in the int array passed to this method are not valid column indexes
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7
                  See Also:
                  getResultSet(), getUpdateCount(), getMoreResults()

                  execute

                  public boolean execute(String sql,
                                         String[] columnNames)
                                  throws SQLException
                  Executes the given SQL statement, which may return multiple results, and signals the driver that the auto-generated keys indicated in the given array should be made available for retrieval. This array contains the names of the columns in the target table that contain the auto-generated keys that should be made available. The driver will ignore the array if the SQL statement is not an INSERT statement, or an SQL statement able to return auto-generated keys (the list of such statements is vendor-specific).

                  In some (uncommon) situations, a single SQL statement may return multiple result sets and/or update counts. Normally you can ignore this unless you are (1) executing a stored procedure that you know may return multiple results or (2) you are dynamically executing an unknown SQL string.

                  The execute method executes an SQL statement and indicates the form of the first result. You must then use the methods getResultSet or getUpdateCount to retrieve the result, and getMoreResults to move to any subsequent result(s).

                  HSQLDB-Specific Information:

                  Starting with 2.0, HSQLDB supports this feature.

                  Specified by:
                  execute in interface Statement
                  Parameters:
                  sql - any SQL statement
                  columnNames - an array of the names of the columns in the inserted row that should be made available for retrieval by a call to the method getGeneratedKeys
                  Returns:
                  true if the next result is a ResultSet object; false if it is an update count or there are no more results
                  Throws:
                  SQLException - if a database access error occurs, this method is called on a closed Statement or the elements of the String array passed to this method are not valid column names
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.4, HSQLDB 1.7
                  See Also:
                  getResultSet(), getUpdateCount(), getMoreResults(), getGeneratedKeys()

                  getResultSetHoldability

                  public int getResultSetHoldability()
                                              throws SQLException
                  Retrieves the result set holdability for ResultSet objects generated by this Statement object.

                  HSQLDB-Specific Information:

                  Starting with 1.7.2, this method returns HOLD_CURSORS_OVER_COMMIT

                  Specified by:
                  getResultSetHoldability in interface Statement
                  Returns:
                  either ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT
                  Throws:
                  SQLException - if a database access error occurs or this method is called on a closed Statement
                  Since:
                  JDK 1.4, HSQLDB 1.7

                  isClosed

                  public boolean isClosed()
                                   throws SQLException
                  Retrieves whether this Statement object has been closed. A Statement is closed if the method close has been called on it, or if it is automatically closed.

                  Specified by:
                  isClosed in interface Statement
                  Returns:
                  true if this Statement object is closed; false if it is still open
                  Throws:
                  SQLException - if a database access error occurs
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  setPoolable

                  public void setPoolable(boolean poolable)
                                   throws SQLException
                  Requests that a Statement be pooled or not pooled. The value specified is a hint to the statement pool implementation indicating whether the applicaiton wants the statement to be pooled. It is up to the statement pool manager as to whether the hint is used.

                  The poolable value of a statement is applicable to both internal statement caches implemented by the driver and external statement caches implemented by application servers and other applications.

                  By default, a Statement is not poolable when created, and a PreparedStatement and CallableStatement are poolable when created.

                  Specified by:
                  setPoolable in interface Statement
                  Parameters:
                  poolable - requests that the statement be pooled if true and that the statement not be pooled if false

                  Throws:
                  SQLException - if this method is called on a closed Statement

                  Since:
                  JDK 1.6 Build 81, HSQLDB 2.0

                  isPoolable

                  public boolean isPoolable()
                                     throws SQLException
                  Returns a value indicating whether the Statement is poolable or not.

                  Specified by:
                  isPoolable in interface Statement
                  Returns:
                  true if the Statement is poolable; false otherwise
                  Throws:
                  SQLException - if this method is called on a closed Statement

                  Since:
                  JDK 1.6 Build 81, HSQLDB 2.0

                  See Also:
                  setPoolable(boolean)

                  unwrap

                  public <T> T unwrap(Class<T> iface)
                           throws SQLException
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy. If the receiver implements the interface then the result is the receiver or a proxy for the receiver. If the receiver is a wrapper and the wrapped object implements the interface then the result is the wrapped object or a proxy for the wrapped object. Otherwise return the the result of calling unwrap recursively on the wrapped object or a proxy for that result. If the receiver is not a wrapper and does not implement the interface, then an SQLException is thrown.

                  Specified by:
                  unwrap in interface Wrapper
                  Parameters:
                  iface - A Class defining an interface that the result must implement.
                  Returns:
                  an object that implements the interface. May be a proxy for the actual implementing object.
                  Throws:
                  SQLException - If no object found that implements the interface
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  isWrapperFor

                  public boolean isWrapperFor(Class<?> iface)
                                       throws SQLException
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does. Returns false otherwise. If this implements the interface then return true, else if this is a wrapper then return the result of recursively calling isWrapperFor on the wrapped object. If this does not implement the interface and is not a wrapper, return false. This method should be implemented as a low-cost operation compared to unwrap so that callers can use this method to avoid expensive unwrap calls that may fail. If this method returns true then calling unwrap with the same argument should succeed.

                  Specified by:
                  isWrapperFor in interface Wrapper
                  Parameters:
                  iface - a Class defining an interface.
                  Returns:
                  true if this implements the interface or directly or indirectly wraps an object that does.
                  Throws:
                  SQLException - if an error occurs while determining whether this is a wrapper for an object with the given interface.
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  closeOnCompletion

                  public void closeOnCompletion()
                                         throws SQLException
                  Specifies that this Statement will be closed when all its dependent result sets are closed. If execution of the Statement does not produce any result sets, this method has no effect.

                  Note: Multiple calls to closeOnCompletion do not toggle the effect on this Statement. However, a call to closeOnCompletion does effect both the subsequent execution of statements, and statements that currently have open, dependent, result sets.

                  Throws:
                  SQLException - if this method is called on a closed Statement
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1

                  isCloseOnCompletion

                  public boolean isCloseOnCompletion()
                                              throws SQLException
                  Returns a value indicating whether this Statement will be closed when all its dependent result sets are closed.

                  Returns:
                  true if the Statement will be closed when all of its dependent result sets are closed; false otherwise
                  Throws:
                  SQLException - if this method is called on a closed Statement
                  Since:
                  JDK 1.7 M11 2010/09/10 (b123), HSQLDB 2.0.1


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCClobClient.html0000644000175000017500000012332212007570402024567 0ustar renerene JDBCClobClient (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCClobClient

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCClobClient
                  
                  All Implemented Interfaces:
                  Clob

                  public class JDBCClobClient
                  extends Object
                  implements Clob

                  A wrapper for HSQLDB ClobData objects. Instances of this class are returned by calls to ResultSet methods.

                  Since:
                  JDK 1.2, HSQLDB 1.9.0
                  Author:
                  Fred Toussi (fredt@users dot sourceforge.net)

                  Constructor Summary
                  JDBCClobClient(org.hsqldb.SessionInterface session, org.hsqldb.types.ClobDataID clob)
                             
                   
                  Method Summary
                   void clearUpdates()
                             
                   void free()
                            This method frees the Clob object and releases the resources the resources that it holds.
                   InputStream getAsciiStream()
                            Retrieves the CLOB value designated by this Clob object as an ascii stream.
                   Reader getCharacterStream()
                            Retrieves the CLOB value designated by this Clob object as a java.io.Reader object (or as a stream of characters).
                   Reader getCharacterStream(long pos, long length)
                            Returns a Reader object that contains a partial Clob value, starting with the character specified by pos, which is length characters in length.
                   org.hsqldb.types.ClobDataID getClob()
                             
                   String getSubString(long pos, int length)
                            Retrieves a copy of the specified substring in the CLOB value designated by this Clob object.
                   boolean isClosed()
                             
                   long length()
                            Retrieves the number of characters in the CLOB value designated by this Clob object.
                   long position(Clob searchstr, long start)
                            Retrieves the character position at which the specified Clob object searchstr appears in this Clob object.
                   long position(String searchstr, long start)
                            Retrieves the character position at which the specified substring searchstr appears in the SQL CLOB value represented by this Clob object.
                   OutputStream setAsciiStream(long pos)
                            Retrieves a stream to be used to write Ascii characters to the CLOB value that this Clob object represents, starting at position pos.
                   Writer setCharacterStream(long pos)
                            Retrieves a stream to be used to write a stream of Unicode characters to the CLOB value that this Clob object represents, at position pos.
                   int setString(long pos, String str)
                            Writes the given Java String to the CLOB value that this Clob object designates at the position pos.
                   int setString(long pos, String str, int offset, int len)
                            Writes len characters of str, starting at character offset, to the CLOB value that this Clob represents.
                   void setWritable(JDBCResultSet result, int index)
                             
                   void truncate(long len)
                            Truncates the CLOB value that this Clob designates to have a length of len characters.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  JDBCClobClient

                  public JDBCClobClient(org.hsqldb.SessionInterface session,
                                        org.hsqldb.types.ClobDataID clob)
                  Method Detail

                  getAsciiStream

                  public InputStream getAsciiStream()
                                             throws SQLException
                  Retrieves the CLOB value designated by this Clob object as an ascii stream.

                  Specified by:
                  getAsciiStream in interface Clob
                  Returns:
                  a java.io.InputStream object containing the CLOB data
                  Throws:
                  SQLException - if there is an error accessing the CLOB value

                  getCharacterStream

                  public Reader getCharacterStream()
                                            throws SQLException
                  Retrieves the CLOB value designated by this Clob object as a java.io.Reader object (or as a stream of characters).

                  Specified by:
                  getCharacterStream in interface Clob
                  Returns:
                  a java.io.Reader object containing the CLOB data
                  Throws:
                  SQLException - if there is an error accessing the CLOB value

                  getSubString

                  public String getSubString(long pos,
                                             int length)
                                      throws SQLException
                  Retrieves a copy of the specified substring in the CLOB value designated by this Clob object.

                  Specified by:
                  getSubString in interface Clob
                  Parameters:
                  pos - the first character of the substring to be extracted. The first character is at position 1.
                  length - the number of consecutive characters to be copied
                  Returns:
                  a String that is the specified substring in the CLOB value designated by this Clob object
                  Throws:
                  SQLException - if there is an error accessing the CLOB value

                  length

                  public long length()
                              throws SQLException
                  Retrieves the number of characters in the CLOB value designated by this Clob object.

                  Specified by:
                  length in interface Clob
                  Returns:
                  length of the CLOB in characters
                  Throws:
                  SQLException - if there is an error accessing the length of the CLOB value

                  position

                  public long position(String searchstr,
                                       long start)
                                throws SQLException
                  Retrieves the character position at which the specified substring searchstr appears in the SQL CLOB value represented by this Clob object.

                  Specified by:
                  position in interface Clob
                  Parameters:
                  searchstr - the substring for which to search
                  start - the position at which to begin searching; the first position is 1
                  Returns:
                  the position at which the substring appears or -1 if it is not present; the first position is 1
                  Throws:
                  SQLException - if there is an error accessing the CLOB value

                  position

                  public long position(Clob searchstr,
                                       long start)
                                throws SQLException
                  Retrieves the character position at which the specified Clob object searchstr appears in this Clob object.

                  Specified by:
                  position in interface Clob
                  Parameters:
                  searchstr - the Clob object for which to search
                  start - the position at which to begin searching; the first position is 1
                  Returns:
                  the position at which the Clob object appears or -1 if it is not present; the first position is 1
                  Throws:
                  SQLException - if there is an error accessing the CLOB value

                  setAsciiStream

                  public OutputStream setAsciiStream(long pos)
                                              throws SQLException
                  Retrieves a stream to be used to write Ascii characters to the CLOB value that this Clob object represents, starting at position pos.

                  Specified by:
                  setAsciiStream in interface Clob
                  Parameters:
                  pos - the position at which to start writing to this CLOB object
                  Returns:
                  the stream to which ASCII encoded characters can be written
                  Throws:
                  SQLException - if there is an error accessing the CLOB value

                  setCharacterStream

                  public Writer setCharacterStream(long pos)
                                            throws SQLException
                  Retrieves a stream to be used to write a stream of Unicode characters to the CLOB value that this Clob object represents, at position pos.

                  Specified by:
                  setCharacterStream in interface Clob
                  Parameters:
                  pos - the position at which to start writing to the CLOB value
                  Returns:
                  a stream to which Unicode encoded characters can be written
                  Throws:
                  SQLException - if there is an error accessing the CLOB value

                  setString

                  public int setString(long pos,
                                       String str)
                                throws SQLException
                  Writes the given Java String to the CLOB value that this Clob object designates at the position pos.

                  Specified by:
                  setString in interface Clob
                  Parameters:
                  pos - the position at which to start writing to the CLOB value that this Clob object represents
                  str - the string to be written to the CLOB value that this Clob designates
                  Returns:
                  the number of characters written
                  Throws:
                  SQLException - if there is an error accessing the CLOB value

                  setString

                  public int setString(long pos,
                                       String str,
                                       int offset,
                                       int len)
                                throws SQLException
                  Writes len characters of str, starting at character offset, to the CLOB value that this Clob represents.

                  Specified by:
                  setString in interface Clob
                  Parameters:
                  pos - the position at which to start writing to this CLOB object
                  str - the string to be written to the CLOB value that this Clob object represents
                  offset - the offset into str to start reading the characters to be written
                  len - the number of characters to be written
                  Returns:
                  the number of characters written
                  Throws:
                  SQLException - if there is an error accessing the CLOB value

                  truncate

                  public void truncate(long len)
                                throws SQLException
                  Truncates the CLOB value that this Clob designates to have a length of len characters.

                  Specified by:
                  truncate in interface Clob
                  Parameters:
                  len - the length, in bytes, to which the CLOB value should be truncated
                  Throws:
                  SQLException - if there is an error accessing the CLOB value

                  free

                  public void free()
                            throws SQLException
                  This method frees the Clob object and releases the resources the resources that it holds. The object is invalid once the free method is called.

                  After free has been called, any attempt to invoke a method other than free will result in a SQLException being thrown. If free is called multiple times, the subsequent calls to free are treated as a no-op.

                  Specified by:
                  free in interface Clob
                  Throws:
                  SQLException - if an error occurs releasing the Clob's resources
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getCharacterStream

                  public Reader getCharacterStream(long pos,
                                                   long length)
                                            throws SQLException
                  Returns a Reader object that contains a partial Clob value, starting with the character specified by pos, which is length characters in length.

                  Specified by:
                  getCharacterStream in interface Clob
                  Parameters:
                  pos - the offset to the first character of the partial value to be retrieved. The first character in the Clob is at position 1.
                  length - the length in characters of the partial value to be retrieved.
                  Returns:
                  Reader through which the partial Clob value can be read.
                  Throws:
                  SQLException - if pos is less than 1 or if pos is greater than the number of characters in the Clob or if pos + length is greater than the number of characters in the Clob
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6, HSQLDB 2.0

                  getClob

                  public org.hsqldb.types.ClobDataID getClob()

                  isClosed

                  public boolean isClosed()

                  setWritable

                  public void setWritable(JDBCResultSet result,
                                          int index)

                  clearUpdates

                  public void clearUpdates()


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCArray.html0000644000175000017500000014515312007570402023635 0ustar renerene JDBCArray (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCArray

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCArray
                  
                  All Implemented Interfaces:
                  Array

                  public class JDBCArray
                  extends Object
                  implements Array

                  The mapping in the Java programming language for the SQL type ARRAY. By default, an Array value is a transaction-duration reference to an SQL ARRAY value. By default, an Array object is implemented using an SQL LOCATOR(array) internally, which means that an Array object contains a logical pointer to the data in the SQL ARRAY value rather than containing the ARRAY value's data.

                  The Array interface provides methods for bringing an SQL ARRAY value's data to the client as either an array or a ResultSet object. If the elements of the SQL ARRAY are a UDT, they may be custom mapped. To create a custom mapping, a programmer must do two things:

                  • create a class that implements the SQLData interface for the UDT to be custom mapped.
                  • make an entry in a type map that contains
                    • the fully-qualified SQL type name of the UDT
                    • the Class object for the class implementing SQLData

                  When a type map with an entry for the base type is supplied to the methods getArray and getResultSet, the mapping it contains will be used to map the elements of the ARRAY value. If no type map is supplied, which would typically be the case, the connection's type map is used by default. If the connection's type map or a type map supplied to a method has no entry for the base type, the elements are mapped according to the standard mapping.

                  All methods on the Array interface must be fully implemented if the JDBC driver supports the data type.

                  Since:
                  JDK 1.2, HSQLDB 2.0
                  Author:
                  Fred Toussi (fredt@users dot sourceforge.net)

                  Constructor Summary
                  JDBCArray(Object[] data, org.hsqldb.types.Type type, org.hsqldb.types.Type arrayType, org.hsqldb.SessionInterface session)
                             
                   
                  Method Summary
                   void free()
                            This method frees the Array object and releases the resources that it holds.
                   Object getArray()
                            Retrieves the contents of the SQL ARRAY value designated by this Array object in the form of an array in the Java programming language.
                   Object getArray(long index, int count)
                            Retrieves a slice of the SQL ARRAY value designated by this Array object, beginning with the specified index and containing up to count successive elements of the SQL array.
                   Object getArray(long index, int count, Map<String,Class<?>> map)
                            Retreives a slice of the SQL ARRAY value designated by this Array object, beginning with the specified index and containing up to count successive elements of the SQL array.
                   Object getArray(Map<String,Class<?>> map)
                            Retrieves the contents of the SQL ARRAY value designated by this Array object.
                   Object[] getArrayInternal()
                             
                   int getBaseType()
                            Retrieves the JDBC type of the elements in the array designated by this Array object.
                   String getBaseTypeName()
                            Retrieves the SQL type name of the elements in the array designated by this Array object.
                   ResultSet getResultSet()
                            Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object.
                   ResultSet getResultSet(long index, int count)
                            Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements.
                   ResultSet getResultSet(long index, int count, Map<String,Class<?>> map)
                            Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements.
                   ResultSet getResultSet(Map<String,Class<?>> map)
                            Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object.
                   String toString()
                            Returns a string representation in the form ARRAY[..., ...]
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
                   

                  Constructor Detail

                  JDBCArray

                  public JDBCArray(Object[] data,
                                   org.hsqldb.types.Type type,
                                   org.hsqldb.types.Type arrayType,
                                   org.hsqldb.SessionInterface session)
                  Method Detail

                  getBaseTypeName

                  public String getBaseTypeName()
                                         throws SQLException
                  Retrieves the SQL type name of the elements in the array designated by this Array object. If the elements are a built-in type, it returns the database-specific type name of the elements. If the elements are a user-defined type (UDT), this method returns the fully-qualified SQL type name.

                  Specified by:
                  getBaseTypeName in interface Array
                  Returns:
                  a String that is the database-specific name for a built-in base type; or the fully-qualified SQL type name for a base type that is a UDT
                  Throws:
                  SQLException - if an error occurs while attempting to access the type name
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getBaseType

                  public int getBaseType()
                                  throws SQLException
                  Retrieves the JDBC type of the elements in the array designated by this Array object.

                  Specified by:
                  getBaseType in interface Array
                  Returns:
                  a constant from the class Types that is the type code for the elements in the array designated by this Array object
                  Throws:
                  SQLException - if an error occurs while attempting to access the base type
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getArray

                  public Object getArray()
                                  throws SQLException
                  Retrieves the contents of the SQL ARRAY value designated by this Array object in the form of an array in the Java programming language. This version of the method getArray uses the type map associated with the connection for customizations of the type mappings.

                  Note: When getArray is used to materialize a base type that maps to a primitive data type, then it is implementation-defined whether the array returned is an array of that primitive data type or an array of Object.

                  HSQLDB-Specific Information:

                  HSQLDB always returns an array of Object.

                  Specified by:
                  getArray in interface Array
                  Returns:
                  an array in the Java programming language that contains the ordered elements of the SQL ARRAY value designated by this Array object
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getArray

                  public Object getArray(Map<String,Class<?>> map)
                                  throws SQLException
                  Retrieves the contents of the SQL ARRAY value designated by this Array object. This method uses the specified map for type map customizations unless the base type of the array does not match a user-defined type in map, in which case it uses the standard mapping. This version of the method getArray uses either the given type map or the standard mapping; it never uses the type map associated with the connection.

                  Note: When getArray is used to materialize a base type that maps to a primitive data type, then it is implementation-defined whether the array returned is an array of that primitive data type or an array of Object.

                  HSQLDB-Specific Information:

                  HSQLDB always returns an array of Object.

                  Specified by:
                  getArray in interface Array
                  Parameters:
                  map - a java.util.Map object that contains mappings of SQL type names to classes in the Java programming language
                  Returns:
                  an array in the Java programming language that contains the ordered elements of the SQL array designated by this object
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getArray

                  public Object getArray(long index,
                                         int count)
                                  throws SQLException
                  Retrieves a slice of the SQL ARRAY value designated by this Array object, beginning with the specified index and containing up to count successive elements of the SQL array. This method uses the type map associated with the connection for customizations of the type mappings.

                  Note: When getArray is used to materialize a base type that maps to a primitive data type, then it is implementation-defined whether the array returned is an array of that primitive data type or an array of Object.

                  HSQLDB-Specific Information:

                  HSQLDB always returns an array of Object.

                  Specified by:
                  getArray in interface Array
                  Parameters:
                  index - the array index of the first element to retrieve; the first element is at index 1
                  count - the number of successive SQL array elements to retrieve
                  Returns:
                  an array containing up to count consecutive elements of the SQL array, beginning with element index
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getArray

                  public Object getArray(long index,
                                         int count,
                                         Map<String,Class<?>> map)
                                  throws SQLException
                  Retreives a slice of the SQL ARRAY value designated by this Array object, beginning with the specified index and containing up to count successive elements of the SQL array.

                  This method uses the specified map for type map customizations unless the base type of the array does not match a user-defined type in map, in which case it uses the standard mapping. This version of the method getArray uses either the given type map or the standard mapping; it never uses the type map associated with the connection.

                  Note: When getArray is used to materialize a base type that maps to a primitive data type, then it is implementation-defined whether the array returned is an array of that primitive data type or an array of Object.

                  HSQLDB-Specific Information:

                  HSQLDB always returns an array of Object.

                  Specified by:
                  getArray in interface Array
                  Parameters:
                  index - the array index of the first element to retrieve; the first element is at index 1
                  count - the number of successive SQL array elements to retrieve
                  map - a java.util.Map object that contains SQL type names and the classes in the Java programming language to which they are mapped
                  Returns:
                  an array containing up to count consecutive elements of the SQL ARRAY value designated by this Array object, beginning with element index
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getResultSet

                  public ResultSet getResultSet()
                                         throws SQLException
                  Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object. If appropriate, the elements of the array are mapped using the connection's type map; otherwise, the standard mapping is used.

                  The result set contains one row for each array element, with two columns in each row. The second column stores the element value; the first column stores the index into the array for that element (with the first array element being at index 1). The rows are in ascending order corresponding to the order of the indices.

                  Specified by:
                  getResultSet in interface Array
                  Returns:
                  a ResultSet object containing one row for each of the elements in the array designated by this Array object, with the rows in ascending order based on the indices.
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getResultSet

                  public ResultSet getResultSet(Map<String,Class<?>> map)
                                         throws SQLException
                  Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object. This method uses the specified map for type map customizations unless the base type of the array does not match a user-defined type in map, in which case it uses the standard mapping. This version of the method getResultSet uses either the given type map or the standard mapping; it never uses the type map associated with the connection.

                  The result set contains one row for each array element, with two columns in each row. The second column stores the element value; the first column stores the index into the array for that element (with the first array element being at index 1). The rows are in ascending order corresponding to the order of the indices.

                  Specified by:
                  getResultSet in interface Array
                  Parameters:
                  map - contains the mapping of SQL user-defined types to classes in the Java programming language
                  Returns:
                  a ResultSet object containing one row for each of the elements in the array designated by this Array object, with the rows in ascending order based on the indices.
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getResultSet

                  public ResultSet getResultSet(long index,
                                                int count)
                                         throws SQLException
                  Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements. This method uses the connection's type map to map the elements of the array if the map contains an entry for the base type. Otherwise, the standard mapping is used.

                  The result set has one row for each element of the SQL array designated by this object, with the first row containing the element at index index. The result set has up to count rows in ascending order based on the indices. Each row has two columns: The second column stores the element value; the first column stores the index into the array for that element.

                  Specified by:
                  getResultSet in interface Array
                  Parameters:
                  index - the array index of the first element to retrieve; the first element is at index 1
                  count - the number of successive SQL array elements to retrieve
                  Returns:
                  a ResultSet object containing up to count consecutive elements of the SQL array designated by this Array object, starting at index index.
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  getResultSet

                  public ResultSet getResultSet(long index,
                                                int count,
                                                Map<String,Class<?>> map)
                                         throws SQLException
                  Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements. This method uses the specified map for type map customizations unless the base type of the array does not match a user-defined type in map, in which case it uses the standard mapping. This version of the method getResultSet uses either the given type map or the standard mapping; it never uses the type map associated with the connection.

                  The result set has one row for each element of the SQL array designated by this object, with the first row containing the element at index index. The result set has up to count rows in ascending order based on the indices. Each row has two columns: The second column stores the element value; the first column stroes the index into the array for that element.

                  Specified by:
                  getResultSet in interface Array
                  Parameters:
                  index - the array index of the first element to retrieve; the first element is at index 1
                  count - the number of successive SQL array elements to retrieve
                  map - the Map object that contains the mapping of SQL type names to classes in the Java(tm) programming language
                  Returns:
                  a ResultSet object containing up to count consecutive elements of the SQL array designated by this Array object, starting at index index.
                  Throws:
                  SQLException - if an error occurs while attempting to access the array
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.2

                  toString

                  public String toString()
                  Returns a string representation in the form ARRAY[..., ...]

                  Overrides:
                  toString in class Object

                  free

                  public void free()
                            throws SQLException
                  This method frees the Array object and releases the resources that it holds. The object is invalid once the free method is called.

                  After free has been called, any attempt to invoke a method other than free will result in a SQLException being thrown. If free is called multiple times, the subsequent calls to free are treated as a no-op.

                  Specified by:
                  free in interface Array
                  Throws:
                  SQLException - if an error occurs releasing the Array's resources
                  SQLFeatureNotSupportedException - if the JDBC driver does not support this method
                  Since:
                  JDK 1.6

                  getArrayInternal

                  public Object[] getArrayInternal()


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/jdbc/JDBCSQLXML.SAX2XMLStreamWriter.html0000644000175000017500000015373212007570404027251 0ustar renerene JDBCSQLXML.SAX2XMLStreamWriter (HSQLDB 2.2.9 API)

                  org.hsqldb.jdbc
                  Class JDBCSQLXML.SAX2XMLStreamWriter

                  java.lang.Object
                    extended by org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  
                  All Implemented Interfaces:
                  Closeable, ContentHandler
                  Enclosing class:
                  JDBCSQLXML

                  public static class JDBCSQLXML.SAX2XMLStreamWriter
                  extends Object
                  implements ContentHandler, Closeable

                  Writes to a XMLStreamWriter from SAX events.


                  Constructor Summary
                  JDBCSQLXML.SAX2XMLStreamWriter(XMLStreamWriter writer)
                            Constructs a new SAX2XMLStreamWriter that writes SAX events to the designated XMLStreamWriter.
                   
                  Method Summary
                   void characters(char[] ch, int start, int length)
                            Receive notification of character data.
                   void close()
                            Closes this object.
                   void comment(char[] ch, int start, int length)
                             
                   void endDocument()
                            Receive notification of the end of a document.
                   void endElement(String namespaceURI, String localName, String qName)
                            Receive notification of the end of an element.
                   void endPrefixMapping(String prefix)
                            End the scope of a prefix-URI mapping.
                   Locator getDocumentLocator()
                            Retrieves the Locator.
                   XMLStreamWriter getWriter()
                             
                   void ignorableWhitespace(char[] ch, int start, int length)
                            Receive notification of ignorable whitespace in element content.
                   boolean isClosed()
                            Retrieves whether this object is closed.
                   void processingInstruction(String target, String data)
                            Receive notification of a processing instruction.
                   void setDocumentLocator(Locator locator)
                            Receive an object for locating the origin of SAX document events.
                   void skippedEntity(String name)
                            Receive notification of a skipped entity.
                   void startDocument()
                            Receive notification of the beginning of a document.
                   void startElement(String namespaceURI, String localName, String qName, Attributes atts)
                            Receive notification of the beginning of an element.
                   void startPrefixMapping(String prefix, String uri)
                            Begin the scope of a prefix-URI Namespace mapping.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  JDBCSQLXML.SAX2XMLStreamWriter

                  public JDBCSQLXML.SAX2XMLStreamWriter(XMLStreamWriter writer)
                  Constructs a new SAX2XMLStreamWriter that writes SAX events to the designated XMLStreamWriter.

                  Parameters:
                  writer - the writer to which to write SAX events
                  Method Detail

                  startDocument

                  public void startDocument()
                                     throws SAXException
                  Receive notification of the beginning of a document.

                  The SAX parser will invoke this method only once, before any other event callbacks (except for setDocumentLocator).

                  Specified by:
                  startDocument in interface ContentHandler
                  Throws:
                  SAXException - any SAX exception, possibly wrapping another exception
                  See Also:
                  endDocument()

                  endDocument

                  public void endDocument()
                                   throws SAXException
                  Receive notification of the end of a document.

                  There is an apparent contradiction between the documentation for this method and the documentation for ErrorHandler.fatalError(org.xml.sax.SAXParseException). Until this ambiguity is resolved in a future major release, clients should make no assumptions about whether endDocument() will or will not be invoked when the parser has reported a fatalError() or thrown an exception.

                  The SAX parser will invoke this method only once, and it will be the last method invoked during the parse. The parser shall not invoke this method until it has either abandoned parsing (because of an unrecoverable error) or reached the end of input.

                  Specified by:
                  endDocument in interface ContentHandler
                  Throws:
                  SAXException - any SAX exception, possibly wrapping another exception
                  See Also:
                  startDocument()

                  characters

                  public void characters(char[] ch,
                                         int start,
                                         int length)
                                  throws SAXException
                  Receive notification of character data.

                  The Parser will call this method to report each chunk of character data. SAX parsers may return all contiguous character data in a single chunk, or they may split it into several chunks; however, all of the characters in any single event must come from the same external entity so that the Locator provides useful information.

                  The application must not attempt to read from the array outside of the specified range.

                  Individual characters may consist of more than one Java char value. There are two important cases where this happens, because characters can't be represented in just sixteen bits. In one case, characters are represented in a Surrogate Pair, using two special Unicode values. Such characters are in the so-called "Astral Planes", with a code point above U+FFFF. A second case involves composite characters, such as a base character combining with one or more accent characters.

                  Your code should not assume that algorithms using char-at-a-time idioms will be working in character units; in some cases they will split characters. This is relevant wherever XML permits arbitrary characters, such as attribute values, processing instruction data, and comments as well as in data reported from this method. It's also generally relevant whenever Java code manipulates internationalized text; the issue isn't unique to XML.

                  Note that some parsers will report whitespace in element content using the ignorableWhitespace method rather than this one (validating parsers must do so).

                  Specified by:
                  characters in interface ContentHandler
                  Parameters:
                  ch - the characters from the XML document
                  start - the start position in the array
                  length - the number of characters to read from the array
                  Throws:
                  SAXException - any SAX exception, possibly wrapping another exception
                  See Also:
                  ignorableWhitespace(char[], int, int), Locator

                  startElement

                  public void startElement(String namespaceURI,
                                           String localName,
                                           String qName,
                                           Attributes atts)
                                    throws SAXException
                  Receive notification of the beginning of an element.

                  The Parser will invoke this method at the beginning of every element in the XML document; there will be a corresponding endElement event for every startElement event (even when the element is empty). All of the element's content will be reported, in order, before the corresponding endElement event.

                  This event allows up to three name components for each element:

                  1. the Namespace URI;
                  2. the local name; and
                  3. the qualified (prefixed) name.

                  Any or all of these may be provided, depending on the values of the http://xml.org/sax/features/namespaces and the http://xml.org/sax/features/namespace-prefixes properties:

                  • the Namespace URI and local name are required when the namespaces property is true (the default), and are optional when the namespaces property is false (if one is specified, both must be);
                  • the qualified name is required when the namespace-prefixes property is true, and is optional when the namespace-prefixes property is false (the default).

                  Note that the attribute list provided will contain only attributes with explicit values (specified or defaulted): #IMPLIED attributes will be omitted. The attribute list will contain attributes used for Namespace declarations (xmlns* attributes) only if the http://xml.org/sax/features/namespace-prefixes property is true (it is false by default, and support for a true value is optional).

                  Like characters(), attribute values may have characters that need more than one char value.

                  Specified by:
                  startElement in interface ContentHandler
                  Parameters:
                  namespaceURI - the Namespace URI, or the empty string if the element has no Namespace URI or if Namespace processing is not being performed
                  localName - the local name (without prefix), or the empty string if Namespace processing is not being performed
                  qName - the qualified name (with prefix), or the empty string if qualified names are not available
                  atts - the attributes attached to the element. If there are no attributes, it shall be an empty Attributes object. The value of this object after startElement returns is undefined
                  Throws:
                  SAXException - any SAX exception, possibly wrapping another exception
                  See Also:
                  endElement(java.lang.String, java.lang.String, java.lang.String), Attributes, AttributesImpl

                  endElement

                  public void endElement(String namespaceURI,
                                         String localName,
                                         String qName)
                                  throws SAXException
                  Receive notification of the end of an element.

                  The SAX parser will invoke this method at the end of every element in the XML document; there will be a corresponding startElement event for every endElement event (even when the element is empty).

                  For information on the names, see startElement.

                  Specified by:
                  endElement in interface ContentHandler
                  Parameters:
                  namespaceURI - the Namespace URI, or the empty string if the element has no Namespace URI or if Namespace processing is not being performed
                  localName - the local name (without prefix), or the empty string if Namespace processing is not being performed
                  qName - the qualified XML name (with prefix), or the empty string if qualified names are not available
                  Throws:
                  SAXException - any SAX exception, possibly wrapping another exception

                  startPrefixMapping

                  public void startPrefixMapping(String prefix,
                                                 String uri)
                                          throws SAXException
                  Begin the scope of a prefix-URI Namespace mapping.

                  The information from this event is not necessary for normal Namespace processing: the SAX XML reader will automatically replace prefixes for element and attribute names when the http://xml.org/sax/features/namespaces feature is true (the default).

                  There are cases, however, when applications need to use prefixes in character data or in attribute values, where they cannot safely be expanded automatically; the start/endPrefixMapping event supplies the information to the application to expand prefixes in those contexts itself, if necessary.

                  Note that start/endPrefixMapping events are not guaranteed to be properly nested relative to each other: all startPrefixMapping events will occur immediately before the corresponding startElement event, and all endPrefixMapping events will occur immediately after the corresponding endElement event, but their order is not otherwise guaranteed.

                  There should never be start/endPrefixMapping events for the "xml" prefix, since it is predeclared and immutable.

                  Specified by:
                  startPrefixMapping in interface ContentHandler
                  Parameters:
                  prefix - the Namespace prefix being declared. An empty string is used for the default element namespace, which has no prefix.
                  uri - the Namespace URI the prefix is mapped to
                  Throws:
                  SAXException - the client may throw an exception during processing
                  See Also:
                  endPrefixMapping(java.lang.String), startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)

                  endPrefixMapping

                  public void endPrefixMapping(String prefix)
                                        throws SAXException
                  End the scope of a prefix-URI mapping.

                  See startPrefixMapping for details. These events will always occur immediately after the corresponding endElement event, but the order of endPrefixMapping events is not otherwise guaranteed.

                  Specified by:
                  endPrefixMapping in interface ContentHandler
                  Parameters:
                  prefix - the prefix that was being mapped. This is the empty string when a default mapping scope ends.
                  Throws:
                  SAXException - the client may throw an exception during processing
                  See Also:
                  startPrefixMapping(java.lang.String, java.lang.String), endElement(java.lang.String, java.lang.String, java.lang.String)

                  ignorableWhitespace

                  public void ignorableWhitespace(char[] ch,
                                                  int start,
                                                  int length)
                                           throws SAXException
                  Receive notification of ignorable whitespace in element content.

                  Validating Parsers must use this method to report each chunk of whitespace in element content (see the W3C XML 1.0 recommendation, section 2.10): non-validating parsers may also use this method if they are capable of parsing and using content models.

                  SAX parsers may return all contiguous whitespace in a single chunk, or they may split it into several chunks; however, all of the characters in any single event must come from the same external entity, so that the Locator provides useful information.

                  The application must not attempt to read from the array outside of the specified range.

                  Specified by:
                  ignorableWhitespace in interface ContentHandler
                  Parameters:
                  ch - the characters from the XML document
                  start - the start position in the array
                  length - the number of characters to read from the array
                  Throws:
                  SAXException - any SAX exception, possibly wrapping another exception
                  See Also:
                  characters(char[], int, int)

                  processingInstruction

                  public void processingInstruction(String target,
                                                    String data)
                                             throws SAXException
                  Receive notification of a processing instruction.

                  The Parser will invoke this method once for each processing instruction found: note that processing instructions may occur before or after the main document element.

                  A SAX parser must never report an XML declaration (XML 1.0, section 2.8) or a text declaration (XML 1.0, section 4.3.1) using this method.

                  Like characters(), processing instruction data may have characters that need more than one char value.

                  Specified by:
                  processingInstruction in interface ContentHandler
                  Parameters:
                  target - the processing instruction target
                  data - the processing instruction data, or null if none was supplied. The data does not include any whitespace separating it from the target
                  Throws:
                  SAXException - any SAX exception, possibly wrapping another exception

                  setDocumentLocator

                  public void setDocumentLocator(Locator locator)
                  Receive an object for locating the origin of SAX document events.

                  SAX parsers are strongly encouraged (though not absolutely required) to supply a locator: if it does so, it must supply the locator to the application by invoking this method before invoking any of the other methods in the ContentHandler interface.

                  The locator allows the application to determine the end position of any document-related event, even if the parser is not reporting an error. Typically, the application will use this information for reporting its own errors (such as character content that does not match an application's business rules). The information returned by the locator is probably not sufficient for use with a search engine.

                  Note that the locator will return correct information only during the invocation SAX event callbacks after startDocument returns and before endDocument is called. The application should not attempt to use it at any other time.

                  Specified by:
                  setDocumentLocator in interface ContentHandler
                  Parameters:
                  locator - an object that can return the location of any SAX document event
                  See Also:
                  Locator

                  getDocumentLocator

                  public Locator getDocumentLocator()
                  Retrieves the Locator.

                  Returns:
                  the Locator

                  skippedEntity

                  public void skippedEntity(String name)
                                     throws SAXException
                  Receive notification of a skipped entity. This is not called for entity references within markup constructs such as element start tags or markup declarations. (The XML recommendation requires reporting skipped external entities. SAX also reports internal entity expansion/non-expansion, except within markup constructs.)

                  The Parser will invoke this method each time the entity is skipped. Non-validating processors may skip entities if they have not seen the declarations (because, for example, the entity was declared in an external DTD subset). All processors may skip external entities, depending on the values of the http://xml.org/sax/features/external-general-entities and the http://xml.org/sax/features/external-parameter-entities properties.

                  Specified by:
                  skippedEntity in interface ContentHandler
                  Parameters:
                  name - the name of the skipped entity. If it is a parameter entity, the name will begin with '%', and if it is the external DTD subset, it will be the string "[dtd]"
                  Throws:
                  SAXException - any SAX exception, possibly wrapping another exception

                  comment

                  public void comment(char[] ch,
                                      int start,
                                      int length)
                               throws SAXException
                  Throws:
                  SAXException

                  getWriter

                  public XMLStreamWriter getWriter()

                  close

                  public void close()
                             throws IOException
                  Closes this object.

                  Specified by:
                  close in interface Closeable
                  Throws:
                  IOException

                  isClosed

                  public boolean isClosed()
                  Retrieves whether this object is closed.



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/package-frame.html0000644000175000017500000000161612007570404023712 0ustar renerene org.hsqldb (HSQLDB 2.2.9 API) org.hsqldb
                  Interfaces 
                  Trigger
                  hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/package-use.html0000644000175000017500000002077212007570404023420 0ustar renerene Uses of Package org.hsqldb (HSQLDB 2.2.9 API)

                  Uses of Package
                  org.hsqldb

                  Packages that use org.hsqldb
                  org.hsqldb Contains basic HyperSQL engine classes. 
                  org.hsqldb.jdbc Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support. 
                  org.hsqldb.sample Contains examples for hooking into HyperSQL from your own Java code. 
                   

                  Classes in org.hsqldb used by org.hsqldb
                  HsqlException
                            Class encapsulating all exceptions that can be thrown within the engine.
                   

                  Classes in org.hsqldb used by org.hsqldb.jdbc
                  HsqlException
                            Class encapsulating all exceptions that can be thrown within the engine.
                  SessionInterface
                            Interface to Session and its remote proxy objects.
                   

                  Classes in org.hsqldb used by org.hsqldb.sample
                  Trigger
                            The interface an HSQLDB TRIGGER must implement.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/0000755000175000017500000000000012007570406021105 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/tar/0000755000175000017500000000000012007570406021673 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/tar/DbBackup.html0000644000175000017500000005316312007570402024240 0ustar renerene DbBackup (HSQLDB 2.2.9 API)

                  org.hsqldb.lib.tar
                  Class DbBackup

                  java.lang.Object
                    extended by org.hsqldb.lib.tar.DbBackup
                  

                  public class DbBackup
                  extends Object

                  Works with tar archives containing HSQLDB database instance backups. Viz, creating, examining, or extracting these archives.

                  This class provides OO Tar backup-creation control. The extraction and listing features are implemented only in static fashion in the Main method, which provides a consistent interface for all three features from the command-line.

                  For tar creation, the default behavior is to fail if the target archive exists, and to abort if any database change is detected. Use the JavaBean setters to changes this behavior. See the main(String[]) method for details about command-line usage.

                  Since:
                  2.0.0
                  Author:
                  Blaine Simpson (blaine dot simpson at admc dot com)
                  See Also:
                  The database backup section of the HyperSQL User Guide, main(String[]), setOverWrite(boolean), setAbortUponModify(boolean)

                  Constructor Summary
                  DbBackup(File archiveFile, String dbPath)
                            Instantiate a DbBackup instance for creating a Database Instance backup.
                  DbBackup(File archiveFile, String dbPath, boolean script)
                            Used for SCRIPT backup
                   
                  Method Summary
                   boolean getAbortUponModify()
                             
                   boolean getOverWrite()
                             
                  static void main(String[] sa)
                            Command line invocation to create, examine, or extract HSQLDB database backup tar archives.
                   void setAbortUponModify(boolean abortUponModify)
                            Defaults to true.
                   void setFileIgnore(String fileExtension)
                             
                   void setOverWrite(boolean overWrite)
                            Defaults to false.
                   void setStream(String fileExtension, org.hsqldb.lib.InputStreamInterface is)
                            Overrides file with stream.
                   void write()
                            This method always backs up the .properties and .script files.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  DbBackup

                  public DbBackup(File archiveFile,
                                  String dbPath)
                  Instantiate a DbBackup instance for creating a Database Instance backup. Much validation is deferred until the write() method, to prevent problems with files changing between the constructor and the write call.


                  DbBackup

                  public DbBackup(File archiveFile,
                                  String dbPath,
                                  boolean script)
                  Used for SCRIPT backup

                  Method Detail

                  main

                  public static void main(String[] sa)
                                   throws IOException,
                                          org.hsqldb.lib.tar.TarMalformatException
                  Command line invocation to create, examine, or extract HSQLDB database backup tar archives.

                  This class stores tar entries as relative files without specifying parent directories, in what is commonly referred to as tar bomb format. The set of files is small, with known extensions, and the potential inconvenience of messing up the user's current directory is more than compensated by making it easier for the user to restore to a new database URL location at a peer level to the original.

                  Automatically calculates buffer sizes based on the largest component file (for "save" mode) or tar file size (for other modes).

                  Run

                       java -cp path/to/hsqldb.jar org.hsqldb.lib.tar.DbBackup
                   
                  for syntax help.

                  Throws:
                  IOException
                  org.hsqldb.lib.tar.TarMalformatException

                  setStream

                  public void setStream(String fileExtension,
                                        org.hsqldb.lib.InputStreamInterface is)
                  Overrides file with stream.


                  setFileIgnore

                  public void setFileIgnore(String fileExtension)

                  setOverWrite

                  public void setOverWrite(boolean overWrite)
                  Defaults to false. If false, then attempts to write a tar file that already exist will abort.


                  setAbortUponModify

                  public void setAbortUponModify(boolean abortUponModify)
                  Defaults to true. If true, then the write() method will validate that the database is closed, and it will verify that no DB file changes between when we start writing the tar, and when we finish.


                  getOverWrite

                  public boolean getOverWrite()

                  getAbortUponModify

                  public boolean getAbortUponModify()

                  write

                  public void write()
                             throws IOException,
                                    org.hsqldb.lib.tar.TarMalformatException
                  This method always backs up the .properties and .script files. It will back up all of .backup, .data, and .log which exist. If abortUponModify is set, no tar file will be created, and this method will throw.

                  Throws:
                  IOException - for any of many possible I/O problems
                  IllegalStateException - only if abortUponModify is set, and database is open or is modified.
                  org.hsqldb.lib.tar.TarMalformatException


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/tar/package-frame.html0000644000175000017500000000165612007570404025252 0ustar renerene org.hsqldb.lib.tar (HSQLDB 2.2.9 API) org.hsqldb.lib.tar
                  Classes 
                  DbBackup
                  hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/tar/package-use.html0000644000175000017500000001535412007570404024754 0ustar renerene Uses of Package org.hsqldb.lib.tar (HSQLDB 2.2.9 API)

                  Uses of Package
                  org.hsqldb.lib.tar

                  Packages that use org.hsqldb.lib.tar
                  org.hsqldb.lib.tar Contains the DbBackup class, for backing up HyperSQL databases, and support classes for handling files in tar and pax format. 
                   

                  Classes in org.hsqldb.lib.tar used by org.hsqldb.lib.tar
                  TarMalformatException
                             
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/tar/class-use/0000755000175000017500000000000012007570406023572 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/tar/class-use/DbBackup.html0000644000175000017500000001353212007570404026135 0ustar renerene Uses of Class org.hsqldb.lib.tar.DbBackup (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.lib.tar.DbBackup

                  No usage of org.hsqldb.lib.tar.DbBackup



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/tar/package-summary.html0000644000175000017500000001556312007570404025657 0ustar renerene org.hsqldb.lib.tar (HSQLDB 2.2.9 API)

                  Package org.hsqldb.lib.tar

                  Contains the DbBackup class, for backing up HyperSQL databases, and support classes for handling files in tar and pax format.

                  See:
                            Description

                  Class Summary
                  DbBackup Works with tar archives containing HSQLDB database instance backups.
                   

                  Package org.hsqldb.lib.tar Description

                  Contains the DbBackup class, for backing up HyperSQL databases, and support classes for handling files in tar and pax format. See the database backup section of the HyperSQL User Guide



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/tar/package-tree.html0000644000175000017500000001422012007570404025106 0ustar renerene org.hsqldb.lib.tar Class Hierarchy (HSQLDB 2.2.9 API)

                  Hierarchy For Package org.hsqldb.lib.tar

                  Package Hierarchies:
                  All Packages

                  Class Hierarchy



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/package-frame.html0000644000175000017500000000200012007570404024444 0ustar renerene org.hsqldb.lib (HSQLDB 2.2.9 API) org.hsqldb.lib
                  Classes 
                  FrameworkLogger
                  RCData
                  hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/RCData.html0000644000175000017500000012603512007570402023074 0ustar renerene RCData (HSQLDB 2.2.9 API)

                  org.hsqldb.lib
                  Class RCData

                  java.lang.Object
                    extended by org.hsqldb.lib.RCData
                  

                  public class RCData
                  extends Object

                  Manages all the details we need to connect up to JDBC database(s), in a declarative way.

                  The file src/org/hsqldb/sample/SqlFileEmbedder.java in the HSQLDB distribution provides an example of how to use RCData for your own programs.

                  Author:
                  Blaine Simpson (blaine dot simpson at admc dot com)
                  See Also:
                  The RC File section of the HyperSQL Utilities Guide, SqlFileEmbedder

                  Field Summary
                   String charset
                             
                  static String DEFAULT_JDBC_DRIVER
                             
                   String driver
                             
                   String id
                             
                   String libpath
                             
                   String password
                             
                   String ti
                             
                   String truststore
                             
                   String url
                             
                   String username
                             
                   
                  Constructor Summary
                  RCData(File file, String dbKey)
                            Creates a RCDataObject by looking up the given key in the given authentication file.
                  RCData(String id, String url, String username, String password, String driver, String charset, String truststore)
                            Convenience constructor for backward compatibility.
                  RCData(String id, String url, String username, String password, String driver, String charset, String truststore, String libpath)
                            Wrapper for unset Transaction Isolation.
                  RCData(String id, String url, String username, String password, String driver, String charset, String truststore, String libpath, String ti)
                            Creates a new RCData object.
                   
                  Method Summary
                  static String expandSysPropVars(String inString)
                            Returns a copy of the given String with System property names in the format ${system.property} replaced by the corresponding Java System Properties.
                   Connection getConnection()
                            Gets a JDBC Connection using the data of this RCData object.
                   Connection getConnection(String curDriverIn, String curTrustStoreIn)
                            Gets a JDBC Connection using the data of this RCData object with specified override elements
                   String getDefaultJdbcDriverName()
                             
                   void setDefaultJdbcDriver(String defaultJdbcDriverName)
                             
                  static void setTI(Connection c, String tiString)
                            Set Transaction Isolation level on the specified JDBC Connection
                  static String tiToString(int ti)
                            Return a String representation for the given numerical java.sql.Connection Transaction level.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Field Detail

                  DEFAULT_JDBC_DRIVER

                  public static final String DEFAULT_JDBC_DRIVER
                  See Also:
                  Constant Field Values

                  id

                  public String id

                  url

                  public String url

                  username

                  public String username

                  password

                  public String password

                  ti

                  public String ti

                  driver

                  public String driver

                  charset

                  public String charset

                  truststore

                  public String truststore

                  libpath

                  public String libpath
                  Constructor Detail

                  RCData

                  public RCData(File file,
                                String dbKey)
                         throws Exception
                  Creates a RCDataObject by looking up the given key in the given authentication file.

                  Parameters:
                  dbKey - Key to look up in the file. If null, then will echo all urlids in the file to stdout. (A rather ill-conceived design).
                  file - File containing the authentication information.
                  Throws:
                  Exception

                  RCData

                  public RCData(String id,
                                String url,
                                String username,
                                String password,
                                String driver,
                                String charset,
                                String truststore)
                         throws Exception
                  Convenience constructor for backward compatibility.

                  Throws:
                  Exception
                  See Also:
                  RCData(String,String,String,String,String,String,String,String)

                  RCData

                  public RCData(String id,
                                String url,
                                String username,
                                String password,
                                String driver,
                                String charset,
                                String truststore,
                                String libpath)
                         throws Exception
                  Wrapper for unset Transaction Isolation.

                  Throws:
                  Exception

                  RCData

                  public RCData(String id,
                                String url,
                                String username,
                                String password,
                                String driver,
                                String charset,
                                String truststore,
                                String libpath,
                                String ti)
                         throws Exception
                  Creates a new RCData object.

                  The parameters driver, charset, truststore, and libpath are optional. Setting these parameters to NULL will set them to their default values.

                  Parameters:
                  id - The identifier for these connection settings
                  url - The URL of the database to connect to
                  username - The username to log in as
                  password - The password of the username
                  driver - The JDBC driver to use
                  charset - The character set to use
                  truststore - The trust store to use
                  libpath - The JDBC library to add to CLASSPATH
                  Throws:
                  Exception - if the a non-optional parameter is set to NULL
                  Method Detail

                  setDefaultJdbcDriver

                  public void setDefaultJdbcDriver(String defaultJdbcDriverName)

                  getDefaultJdbcDriverName

                  public String getDefaultJdbcDriverName()

                  getConnection

                  public Connection getConnection()
                                           throws ClassNotFoundException,
                                                  SQLException,
                                                  MalformedURLException
                  Gets a JDBC Connection using the data of this RCData object.

                  Returns:
                  New JDBC Connection
                  Throws:
                  ClassNotFoundException
                  SQLException
                  MalformedURLException

                  getConnection

                  public Connection getConnection(String curDriverIn,
                                                  String curTrustStoreIn)
                                           throws ClassNotFoundException,
                                                  MalformedURLException,
                                                  SQLException
                  Gets a JDBC Connection using the data of this RCData object with specified override elements

                  Returns:
                  New JDBC Connection
                  Throws:
                  ClassNotFoundException
                  MalformedURLException
                  SQLException

                  expandSysPropVars

                  public static String expandSysPropVars(String inString)
                  Returns a copy of the given String with System property names in the format ${system.property} replaced by the corresponding Java System Properties.


                  setTI

                  public static void setTI(Connection c,
                                           String tiString)
                                    throws SQLException
                  Set Transaction Isolation level on the specified JDBC Connection

                  Throws:
                  SQLException

                  tiToString

                  public static String tiToString(int ti)
                  Return a String representation for the given numerical java.sql.Connection Transaction level.

                  Database implementations are free to provide their own transaction isolation levels, so you can't depend upon this method to much.

                  Returns null, since DB implementations are free to provide



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/package-use.html0000644000175000017500000001700712007570404024163 0ustar renerene Uses of Package org.hsqldb.lib (HSQLDB 2.2.9 API)

                  Uses of Package
                  org.hsqldb.lib

                  Packages that use org.hsqldb.lib
                  org.hsqldb.lib Shared classes used by other HyperSQL classes. 
                  org.hsqldb.lib.tar Contains the DbBackup class, for backing up HyperSQL databases, and support classes for handling files in tar and pax format. 
                   

                  Classes in org.hsqldb.lib used by org.hsqldb.lib
                  FrameworkLogger
                            A logging framework wrapper that supports java.util.logging and log4j.
                   

                  Classes in org.hsqldb.lib used by org.hsqldb.lib.tar
                  InputStreamInterface
                             
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/FrameworkLogger.html0000644000175000017500000012752212007570402025075 0ustar renerene FrameworkLogger (HSQLDB 2.2.9 API)

                  org.hsqldb.lib
                  Class FrameworkLogger

                  java.lang.Object
                    extended by org.hsqldb.lib.FrameworkLogger
                  

                  public class FrameworkLogger
                  extends Object

                  A logging framework wrapper that supports java.util.logging and log4j.

                  Logger hierarchies are stored at the Class level. Log4j will be used if the Log4j system (not necessarily config files) are found in the runtime classpath. Otherwise, java.util.logging will be used.

                  This is pretty safe because for use cases where multiple hierarchies are desired, classloader hierarchies will effectively isolate multiple class-level Logger hierarchies.

                  Sad as it is, the java.util.logging facility lacks the most basic developer-side and configuration-side capabilities. Besides having a non-scalable discovery system, the designers didn't comprehend the need for a level between WARNING and SEVERE! Since we don't want to require log4j in Classpath, we have to live with these constraints.

                  As with all the popular logging frameworks, if you want to capture a stack trace, you must use the two-parameters logging methods. I.e., you must also pass a String, or only toString() from your throwable will be captured.

                  Usage example:

                   private static FrameworkLogger logger =
                          FrameworkLogger.getLog(SqlTool.class);
                   ...
                     logger.finer("Doing something log-worthy");
                   

                  The system level property hsqldb.reconfig_logging=false is required to avoid configuration of java.util.logging. Otherwise configuration takes place.

                  Since:
                  1.9.0
                  Author:
                  Blaine Simpson (blaine dot simpson at admc dot com)

                  Method Summary
                  static void clearLoggers(String prefixToZap)
                            Frees Logger(s), if any, with the specified category, or that begins with the specified prefix + dot.
                   void enduserlog(Level level, String message)
                             
                   void error(String message)
                            This is just a wrapper for FrameworkLogger.warning(), because java.util.logging lacks a method for this critical purpose.
                   void error(String message, Throwable t)
                            Just like FrameworkLogger.error(String), but also logs a stack trace.
                   void finer(String message)
                             
                   void finer(String message, Throwable t)
                            Just like FrameworkLogger.finer(String), but also logs a stack trace.
                   void finest(String message)
                             
                   void finest(String message, Throwable t)
                            Just like FrameworkLogger.finest(String), but also logs a stack trace.
                  static FrameworkLogger getLog(Class c)
                            User's entry-point into this logging system.
                  static FrameworkLogger getLog(Class c, String contextId)
                            This method just defers to the getLog(Class) method unless default (no local configuration) JDK logging is being used; In that case, this method assures that the returned logger has an associated FileHander using the supplied String identifier.
                  static FrameworkLogger getLog(String s)
                            Alternative entry-point into this logging system, for cases where you want to share a single logger instance among multiple classes, or you want to use multiple logger instances from a single class.
                  static FrameworkLogger getLog(String baseId, String contextId)
                            This method just defers to the getLog(String) method unless default (no local configuration) JDK logging is being used; In that case, this method assures that the returned logger has an associated FileHander using the supplied String identifier.
                   void info(String message)
                             
                   void info(String message, Throwable t)
                            Just like FrameworkLogger.info(String), but also logs a stack trace.
                  static boolean isDefaultJdkConfig()
                            Whether this JVM is configured with java.util.logging defaults.
                   void log(Level level, String message)
                             
                   void log(Level level, String message, Throwable t)
                            Just like FrameworkLogger.log(Level, String), but also logs a stack trace.
                   void privlog(Level level, String message, Throwable t, int revertMethods, Class skipClass)
                            The "priv" prefix is historical.
                  static String report()
                            Utility method for integrators.
                   void severe(String message)
                             
                   void severe(String message, Throwable t)
                            Just like FrameworkLogger.severe(String), but also logs a stack trace.
                   void warning(String message)
                             
                   void warning(String message, Throwable t)
                            Just like FrameworkLogger.warning(String), but also logs a stack trace.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Method Detail

                  report

                  public static String report()
                  Utility method for integrators. Returns a string representation of the active Logger instance keys.

                  Not named similar to 'toString' to avoid ambiguity with instance method toString.


                  clearLoggers

                  public static void clearLoggers(String prefixToZap)
                  Frees Logger(s), if any, with the specified category, or that begins with the specified prefix + dot.

                  Note that as of today, this depends on the underlying logging framework implementation to release the underlying Logger instances. JUL in Sun's JVM uses weak references, so that should be fine. Log4j as of today seems to use strong references (and no API hooks to free anything), so this method will probably have little benefit for Log4j.


                  getLog

                  public static FrameworkLogger getLog(Class c)
                  User's entry-point into this logging system.

                  You normally want to work with static (class-level) pointers to logger instances, for performance efficiency. See the class-level JavaDoc for a usage example.

                  See Also:
                  FrameworkLogger

                  getLog

                  public static FrameworkLogger getLog(Class c,
                                                       String contextId)
                  This method just defers to the getLog(Class) method unless default (no local configuration) JDK logging is being used; In that case, this method assures that the returned logger has an associated FileHander using the supplied String identifier.


                  getLog

                  public static FrameworkLogger getLog(String baseId,
                                                       String contextId)
                  This method just defers to the getLog(String) method unless default (no local configuration) JDK logging is being used; In that case, this method assures that the returned logger has an associated FileHander using the supplied String identifier.


                  getLog

                  public static FrameworkLogger getLog(String s)
                  Alternative entry-point into this logging system, for cases where you want to share a single logger instance among multiple classes, or you want to use multiple logger instances from a single class.

                  See Also:
                  getLog(Class)

                  log

                  public void log(Level level,
                                  String message,
                                  Throwable t)
                  Just like FrameworkLogger.log(Level, String), but also logs a stack trace.

                  Parameters:
                  level - java.util.logging.Level level to filter and log at
                  message - Message to be logged
                  t - Throwable whose stack trace will be logged.
                  See Also:
                  log(Level, String), Logger.log(Level, String), Level

                  privlog

                  public void privlog(Level level,
                                      String message,
                                      Throwable t,
                                      int revertMethods,
                                      Class skipClass)
                  The "priv" prefix is historical. This is for special usage when you need to modify the reported call stack. If you don't know that you want to do this, then you should not use this method.


                  enduserlog

                  public void enduserlog(Level level,
                                         String message)

                  log

                  public void log(Level level,
                                  String message)
                  Parameters:
                  level - java.util.logging.Level level to filter and log at
                  message - Message to be logged
                  See Also:
                  Logger.log(Level, String), Level

                  finer

                  public void finer(String message)
                  Parameters:
                  message - Message to be logged
                  See Also:
                  Logger.finer(String)

                  warning

                  public void warning(String message)
                  Parameters:
                  message - Message to be logged
                  See Also:
                  Logger.warning(String)

                  severe

                  public void severe(String message)
                  Parameters:
                  message - Message to be logged
                  See Also:
                  Logger.severe(String)

                  info

                  public void info(String message)
                  Parameters:
                  message - Message to be logged
                  See Also:
                  Logger.info(String)

                  finest

                  public void finest(String message)
                  Parameters:
                  message - Message to be logged
                  See Also:
                  Logger.finest(String)

                  error

                  public void error(String message)
                  This is just a wrapper for FrameworkLogger.warning(), because java.util.logging lacks a method for this critical purpose.

                  Parameters:
                  message - Message to be logged
                  See Also:
                  warning(String)

                  finer

                  public void finer(String message,
                                    Throwable t)
                  Just like FrameworkLogger.finer(String), but also logs a stack trace.

                  Parameters:
                  t - Throwable whose stack trace will be logged.
                  See Also:
                  finer(String)

                  warning

                  public void warning(String message,
                                      Throwable t)
                  Just like FrameworkLogger.warning(String), but also logs a stack trace.

                  Parameters:
                  t - Throwable whose stack trace will be logged.
                  See Also:
                  warning(String)

                  severe

                  public void severe(String message,
                                     Throwable t)
                  Just like FrameworkLogger.severe(String), but also logs a stack trace.

                  Parameters:
                  t - Throwable whose stack trace will be logged.
                  See Also:
                  severe(String)

                  info

                  public void info(String message,
                                   Throwable t)
                  Just like FrameworkLogger.info(String), but also logs a stack trace.

                  Parameters:
                  t - Throwable whose stack trace will be logged.
                  See Also:
                  info(String)

                  finest

                  public void finest(String message,
                                     Throwable t)
                  Just like FrameworkLogger.finest(String), but also logs a stack trace.

                  Parameters:
                  t - Throwable whose stack trace will be logged.
                  See Also:
                  finest(String)

                  error

                  public void error(String message,
                                    Throwable t)
                  Just like FrameworkLogger.error(String), but also logs a stack trace.

                  Parameters:
                  t - Throwable whose stack trace will be logged.
                  See Also:
                  error(String)

                  isDefaultJdkConfig

                  public static boolean isDefaultJdkConfig()
                  Whether this JVM is configured with java.util.logging defaults. If the JRE-provided config file is not in the expected place, then we return false.



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/class-use/0000755000175000017500000000000012007570406023004 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/class-use/RCData.html0000644000175000017500000001334512007570404024774 0ustar renerene Uses of Class org.hsqldb.lib.RCData (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.lib.RCData

                  No usage of org.hsqldb.lib.RCData



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/class-use/FrameworkLogger.html0000644000175000017500000002515012007570404026770 0ustar renerene Uses of Class org.hsqldb.lib.FrameworkLogger (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.lib.FrameworkLogger

                  Packages that use FrameworkLogger
                  org.hsqldb.lib Shared classes used by other HyperSQL classes. 
                   

                  Uses of FrameworkLogger in org.hsqldb.lib
                   

                  Methods in org.hsqldb.lib that return FrameworkLogger
                  static FrameworkLogger FrameworkLogger.getLog(Class c)
                            User's entry-point into this logging system.
                  static FrameworkLogger FrameworkLogger.getLog(Class c, String contextId)
                            This method just defers to the getLog(Class) method unless default (no local configuration) JDK logging is being used; In that case, this method assures that the returned logger has an associated FileHander using the supplied String identifier.
                  static FrameworkLogger FrameworkLogger.getLog(String s)
                            Alternative entry-point into this logging system, for cases where you want to share a single logger instance among multiple classes, or you want to use multiple logger instances from a single class.
                  static FrameworkLogger FrameworkLogger.getLog(String baseId, String contextId)
                            This method just defers to the getLog(String) method unless default (no local configuration) JDK logging is being used; In that case, this method assures that the returned logger has an associated FileHander using the supplied String identifier.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/package-summary.html0000644000175000017500000001536312007570404025067 0ustar renerene org.hsqldb.lib (HSQLDB 2.2.9 API)

                  Package org.hsqldb.lib

                  Shared classes used by other HyperSQL classes.

                  See:
                            Description

                  Class Summary
                  FrameworkLogger A logging framework wrapper that supports java.util.logging and log4j.
                  RCData Manages all the details we need to connect up to JDBC database(s), in a declarative way.
                   

                  Package org.hsqldb.lib Description

                  Shared classes used by other HyperSQL classes.



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/lib/package-tree.html0000644000175000017500000001430312007570404024322 0ustar renerene org.hsqldb.lib Class Hierarchy (HSQLDB 2.2.9 API)

                  Hierarchy For Package org.hsqldb.lib

                  Package Hierarchies:
                  All Packages

                  Class Hierarchy



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/util/0000755000175000017500000000000012007570406021314 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/util/MainInvoker.html0000644000175000017500000004051112007570402024421 0ustar renerene MainInvoker (HSQLDB 2.2.9 API)

                  org.hsqldb.util
                  Class MainInvoker

                  java.lang.Object
                    extended by org.hsqldb.util.MainInvoker
                  

                  public class MainInvoker
                  extends Object

                  Invokes the static main(String[]) method from each class specified. This class will System.exit() if any invocation fails.

                  Since:
                  HSQLDB 1.8.0
                  Author:
                  Blaine Simpson (blaine dot simpson at admc dot com)

                  Field Summary
                  static String LS
                             
                   
                  Constructor Summary
                  MainInvoker()
                             
                   
                  Method Summary
                  static void invoke(String className, String[] args)
                            Invokes the static main(String[]) method from each specified class.
                  static void main(String[] sa)
                            Invokes the static main(String[]) method from each specified class.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Field Detail

                  LS

                  public static String LS
                  Constructor Detail

                  MainInvoker

                  public MainInvoker()
                  Method Detail

                  main

                  public static void main(String[] sa)
                  Invokes the static main(String[]) method from each specified class. This method will System.exit() if any invocation fails. Note that multiple class invocations are delimited by empty-string parameters. How the user supplies these empty strings is determined entirely by the caller's environment. From Windows this can generally be accomplished with double-quotes like "". From all popular UNIX shells, this can be accomplished with single or double-quotes: '' or "".

                  Parameters:
                  sa - Run java org.hsqldb.util.MainInvoker --help for syntax help

                  invoke

                  public static void invoke(String className,
                                            String[] args)
                                     throws ClassNotFoundException,
                                            NoSuchMethodException,
                                            IllegalAccessException,
                                            InvocationTargetException
                  Invokes the static main(String[]) method from each specified class.

                  Throws:
                  ClassNotFoundException
                  NoSuchMethodException
                  IllegalAccessException
                  InvocationTargetException


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/util/package-frame.html0000644000175000017500000000164212007570404024666 0ustar renerene org.hsqldb.util (HSQLDB 2.2.9 API) org.hsqldb.util
                  Classes 
                  MainInvoker
                  hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/util/package-use.html0000644000175000017500000001272012007570404024367 0ustar renerene Uses of Package org.hsqldb.util (HSQLDB 2.2.9 API)

                  Uses of Package
                  org.hsqldb.util

                  No usage of org.hsqldb.util



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/util/class-use/0000755000175000017500000000000012007570406023213 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/util/class-use/MainInvoker.html0000644000175000017500000001344112007570404026324 0ustar renerene Uses of Class org.hsqldb.util.MainInvoker (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.util.MainInvoker

                  No usage of org.hsqldb.util.MainInvoker



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/util/package-summary.html0000644000175000017500000001401712007570404025271 0ustar renerene org.hsqldb.util (HSQLDB 2.2.9 API)

                  Package org.hsqldb.util

                  Class Summary
                  MainInvoker Invokes the static main(String[]) method from each class specified.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/util/package-tree.html0000644000175000017500000001370112007570404024532 0ustar renerene org.hsqldb.util Class Hierarchy (HSQLDB 2.2.9 API)

                  Hierarchy For Package org.hsqldb.util

                  Package Hierarchies:
                  All Packages

                  Class Hierarchy



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/0000755000175000017500000000000012007570406021645 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/ServerAcl.AclFormatException.html0000644000175000017500000003442112007570402030147 0ustar renerene ServerAcl.AclFormatException (HSQLDB 2.2.9 API)

                  org.hsqldb.server
                  Class ServerAcl.AclFormatException

                  java.lang.Object
                    extended by java.lang.Throwable
                        extended by java.lang.Exception
                            extended by org.hsqldb.server.ServerAcl.AclFormatException
                  
                  All Implemented Interfaces:
                  Serializable
                  Enclosing class:
                  ServerAcl

                  public static final class ServerAcl.AclFormatException
                  extends Exception

                  See Also:
                  Serialized Form

                  Constructor Summary
                  ServerAcl.AclFormatException(String s)
                             
                   
                  Method Summary
                   
                  Methods inherited from class java.lang.Throwable
                  fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
                   

                  Constructor Detail

                  ServerAcl.AclFormatException

                  public ServerAcl.AclFormatException(String s)


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/package-frame.html0000644000175000017500000000264612007570404025224 0ustar renerene org.hsqldb.server (HSQLDB 2.2.9 API) org.hsqldb.server
                  Classes 
                  Server
                  ServerAcl
                  WebServer
                  Exceptions 
                  ServerAcl.AclFormatException
                  hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/package-use.html0000644000175000017500000001555412007570404024730 0ustar renerene Uses of Package org.hsqldb.server (HSQLDB 2.2.9 API)

                  Uses of Package
                  org.hsqldb.server

                  Packages that use org.hsqldb.server
                  org.hsqldb.server The HyperSQL network listener classes. 
                   

                  Classes in org.hsqldb.server used by org.hsqldb.server
                  Server
                            The HSQLDB HSQL protocol network database server.
                  ServerAcl.AclFormatException
                             
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/ServerAcl.html0000644000175000017500000005274712007570402024434 0ustar renerene ServerAcl (HSQLDB 2.2.9 API)

                  org.hsqldb.server
                  Class ServerAcl

                  java.lang.Object
                    extended by org.hsqldb.server.ServerAcl
                  

                  public final class ServerAcl
                  extends Object

                  A list of ACL permit and deny entries with a permitAccess method which tells whether candidate addresses are permitted or denied by this ACL list.

                  The ACL file is reloaded whenever a modification to it is detected. If you copy in a file with an older file date, you will need to touch it.

                  The public runtime method is permitAccess(). The public setup method is the constructor.

                  Each non-comment line in the ACL file must be a rule of the format:

                  
                       {allow|deny} [/significant-bits]
                   
                  For example
                  
                       allow ahostname
                       deny ahost.domain.com
                       allow 127.0.0.1
                       allow 2001:db8::/32
                   

                  In order to detect bit specification mistakes, we require that non-significant bits be zero in the values. An undesirable consequence of this is, you can't use a specification like the following to mean "all of the hosts on the same network as x.admc.com":

                  
                       allow x.admc.com/24
                   

                  See Also:
                  ServerAcl(File), permitAccess(java.lang.String)

                  Nested Class Summary
                  static class ServerAcl.AclFormatException
                             
                   
                  Constructor Summary
                  ServerAcl(File aclFile)
                             
                   
                  Method Summary
                  static String colonNotation(byte[] uba)
                             
                  static String dottedNotation(byte[] uba)
                             
                  static void main(String[] sa)
                            Utility method that allows interactive testing of individal ACL records, as well as the net effect of the ACL record list.
                   boolean permitAccess(byte[] addr)
                             
                   boolean permitAccess(String s)
                            Uses system network libraries to resolve the given String to an IP addr, then determine whether this address is permitted or denied.
                   void setPrintWriter(PrintWriter pw)
                             
                   String toString()
                             
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
                   

                  Constructor Detail

                  ServerAcl

                  public ServerAcl(File aclFile)
                            throws IOException,
                                   ServerAcl.AclFormatException
                  Throws:
                  IOException
                  ServerAcl.AclFormatException
                  Method Detail

                  dottedNotation

                  public static String dottedNotation(byte[] uba)
                  Parameters:
                  uba - Unsigned byte array

                  colonNotation

                  public static String colonNotation(byte[] uba)
                  Parameters:
                  uba - Unsigned byte array

                  setPrintWriter

                  public void setPrintWriter(PrintWriter pw)

                  toString

                  public String toString()
                  Overrides:
                  toString in class Object

                  permitAccess

                  public boolean permitAccess(String s)
                  Uses system network libraries to resolve the given String to an IP addr, then determine whether this address is permitted or denied. Specified name may be a numerical-based String like "1.2.3.4", a constant known to the networking libraries, or a host name to be resolved by the systems name resolution system. If the given String can't be resolved to an IP addr, false is returned.

                  See Also:
                  permitAccess(byte[])

                  permitAccess

                  public boolean permitAccess(byte[] addr)
                  Returns:
                  true if access for the candidate address should be permitted, false if access should be denied.
                  Throws:
                  RuntimeException - if no rule covers the candidate address. This would be the case if this class is applied to some network protocol other than ipv4 or ipv6, without adding a default rule for it.

                  main

                  public static void main(String[] sa)
                                   throws ServerAcl.AclFormatException,
                                          IOException
                  Utility method that allows interactive testing of individal ACL records, as well as the net effect of the ACL record list. Run "java -cp path/to/hsqldb.jar org.hsqldb.server.ServerAcl --help" for Syntax help.

                  Throws:
                  ServerAcl.AclFormatException
                  IOException


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/class-use/0000755000175000017500000000000012007570406023544 5ustar renerene././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootroothsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/class-use/ServerAcl.AclFormatException.htmlhsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/class-use/ServerAcl.AclFormatException.htm0000644000175000017500000002237212007570404031676 0ustar renerene Uses of Class org.hsqldb.server.ServerAcl.AclFormatException (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.server.ServerAcl.AclFormatException

                  Packages that use ServerAcl.AclFormatException
                  org.hsqldb.server The HyperSQL network listener classes. 
                   

                  Uses of ServerAcl.AclFormatException in org.hsqldb.server
                   

                  Methods in org.hsqldb.server that throw ServerAcl.AclFormatException
                  static void ServerAcl.main(String[] sa)
                            Utility method that allows interactive testing of individal ACL records, as well as the net effect of the ACL record list.
                   void Server.setProperties(org.hsqldb.persist.HsqlProperties props)
                            Sets server properties using the specified properties object
                   

                  Constructors in org.hsqldb.server that throw ServerAcl.AclFormatException
                  ServerAcl(File aclFile)
                             
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/class-use/ServerAcl.html0000644000175000017500000001344112007570404026321 0ustar renerene Uses of Class org.hsqldb.server.ServerAcl (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.server.ServerAcl

                  No usage of org.hsqldb.server.ServerAcl



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/class-use/Server.html0000644000175000017500000001662512007570404025710 0ustar renerene Uses of Class org.hsqldb.server.Server (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.server.Server

                  Packages that use Server
                  org.hsqldb.server The HyperSQL network listener classes. 
                   

                  Uses of Server in org.hsqldb.server
                   

                  Subclasses of Server in org.hsqldb.server
                   class WebServer
                            The HSQLDB HTTP protocol network database server.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/class-use/WebServer.html0000644000175000017500000001344112007570404026337 0ustar renerene Uses of Class org.hsqldb.server.WebServer (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.server.WebServer

                  No usage of org.hsqldb.server.WebServer



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/Server.html0000644000175000017500000021113012007570402023773 0ustar renerene Server (HSQLDB 2.2.9 API)

                  org.hsqldb.server
                  Class Server

                  java.lang.Object
                    extended by org.hsqldb.server.Server
                  
                  All Implemented Interfaces:
                  org.hsqldb.server.HsqlSocketRequestHandler
                  Direct Known Subclasses:
                  WebServer

                  public class Server
                  extends Object
                  implements org.hsqldb.server.HsqlSocketRequestHandler

                  The HSQLDB HSQL protocol network database server.

                  A Server object acts as a network database server and is one way of using the client-server mode of HSQLDB Database Engine. Instances of this class handle native HSQL protocol connections exclusively, allowing database queries to be performed efficienly across the network. Server's direct descendent, WebServer, handles HTTP protocol connections exclusively, allowing HSQL protocol to be tunneled over HTTP to avoid sandbox and firewall issues, albeit less efficiently.

                  There are a number of ways to configure and start a Server instance.

                  When started from the command line or programatically via the main(String[]) method, configuration occurs in three phases, with later phases overriding properties set by previous phases:

                  1. Upon construction, a Server object is assigned a set of default properties.

                  2. If it exists, properties are loaded from a file named 'server.properties' in the present working directory.

                  3. The command line arguments (alternatively, the String[] passed to main()) are parsed and used to further configure the Server's properties.

                  From the command line, the options are as follows:

                   +-----------------+-------------+----------+------------------------------+
                   |    OPTION       |    TYPE     | DEFAULT  |         DESCRIPTION          |
                   +-----------------+-------------+----------+------------------------------|
                   | --help          |             |          | prints this message          |
                   | --address       | name|number | any      | server inet address          |
                   | --port          | number      | 9001/544 | port at which server listens |
                   | --database.i    | [type]spec  | 0=test   | path of database i           |
                   | --dbname.i      | alias       |          | url alias for database i     |
                   | --silent        | true|false  | true     | false => display all queries |
                   | --trace         | true|false  | false    | display JDBC trace messages  |
                   | --tls           | true|false  | false    | TLS/SSL (secure) sockets     |
                   | --no_system_exit| true|false  | false    | do not issue System.exit()   |
                   | --remote_open   | true|false  | false    | can open databases remotely  |
                   | --props         | filepath    |          | file path of properties file |
                   +-----------------+-------------+----------+------------------------------+
                   
                  The database.i and dbname.i options need further explanation:
                  • Multiple databases can be served by each instance of the Server. The value of i is currently limited to the range 0..9, allowing up to 10 different databases. Any number is this range can be used.

                  • The value assigned to database.i is interpreted using the format '[type]spec', where the optional type component is one of 'file:', 'res:' or 'mem:' and the spec component is interpreted in the context of the type component.

                    If omitted, the type component is taken to be 'file:'.

                    A full description of how '[type]spec' values are interpreted appears in the overview for JDBCConnection.

                  • The value assigned to dbname.i is taken to be the key used to look up the desired database instance and thus corresponds to the <alias> component of the HSQLDB HSQL protocol database connection url: 'jdbc:hsqldb:hsql[s]://host[port][/<alias>]'.

                  • The value of database.0 is special. If dbname.0 is not specified, then this defaults to an empty string and a connection is made to database.0 path when the <alias> component of an HSQLDB HSQL protocol database connection url is omitted. If a database key/value pair is found in the properties when the main method is called, this pair is supersedes the database.0 setting

                    This behaviour allows the previous database connection url format to work with essentially unchanged semantics.

                  • When the remote_open property is true, a connection attempt to an unopened database results in the database being opened. The URL for connection should include the property filepath to specify the path. 'jdbc:hsqldb:hsql[s]://host[port]/<alias>;filepath=hsqldb:file:<database path>'. the given alias and filepath value will be associated together. The database user and password to start this connection must be valid. If this form of connection is used again, after the database has been opened, the filepath property is ignored.

                  • Once an alias such as "mydb" has been associated with a path, it cannot be reassigned to a different path.

                  • If a database is closed with the SHUTDOWN command, its alias is removed. It is then possible to connect to this database again with a different (or the same) alias.

                  • If the same database is connected to via two different aliases, and then one of the is closed with the SHUTDOWN command, the other is also closed.

                  From the 'server.properties' file, options can be set similarly, using a slightly different format.

                  Here is an example 'server.properties' file:

                   server.port=9001
                   server.database.0=test
                   server.dbname.0=...
                   ...
                   server.database.n=...
                   server.dbname.n=...
                   server.silent=true
                   
                  Starting with 1.7.2, Server has been refactored to become a simple JavaBean with non-blocking start() and stop() service methods. It is possible to configure a Server instance through the JavaBean API as well, but this part of the public interface is still under review and will not be finalized or documented fully until the final 1.7.2 release.

                  Note:

                  The 'no_system_exit' property is of particular interest.

                  If a Server instance is to run embedded in, say, an application server, such as when the JDBCDataSource or HsqlServerFactory classes are used, it is typically necessary to avoid calling System.exit() when the Server instance shuts down.

                  By default, 'no_system_exit' is set:

                  1. true when a Server is started directly from the start() method.

                  2. false when a Server is started from the main(String[]) method.

                  These values are natural to their context because the first case allows the JVM to exit by default on Server shutdown when a Server instance is started from a command line environment, whereas the second case prevents a typically unwanted JVM exit on Server shutdown when a Server intance is started as part of a larger framework.

                  Since:
                  1.7.2
                  Author:
                  Fred Toussi (fredt@users dot sourceforge.net)

                  Constructor Summary
                  Server()
                            Creates a new Server instance handling HSQL protocol connections.
                   
                  Method Summary
                   void checkRunning(boolean running)
                            Checks if this Server object is or is not running and throws if the current state does not match the specified value.
                   String getAddress()
                            Retrieves, in string form, this server's host address.
                   String getDatabaseName(int index, boolean asconfigured)
                            Retrieves the url alias (network name) of the i'th database that this Server hosts.
                   String getDatabasePath(int index, boolean asconfigured)
                            Retrieves the HSQLDB path descriptor (uri) of the i'th Database that this Server hosts.
                   String getDatabaseType(int index)
                             
                   String getDefaultWebPage()
                            Retrieves the name of the web page served when no page is specified.
                   PrintWriter getErrWriter()
                            Retrieves the PrintWriter to which server errors are printed.
                   String getHelpString()
                            Retrieves a String object describing the command line and properties options for this Server.
                   PrintWriter getLogWriter()
                            Retrieves the PrintWriter to which server messages are printed.
                   int getPort()
                            Retrieves this server's host port.
                   String getProductName()
                            Retrieves this server's product name.
                   String getProductVersion()
                            Retrieves the server's product version, as a String.
                   String getProtocol()
                            Retrieves a string respresentaion of the network protocol this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'.
                   Throwable getServerError()
                            Retrieves a Throwable indicating the last server error, if any.
                   String getServerId()
                            Retrieves a String identifying this Server object.
                   Thread getServerThread()
                            Returns thread object for "HSQLDB Server" thread
                   int getState()
                            Retrieves current state of this server in numerically coded form.
                   String getStateDescriptor()
                            Retrieves a character sequence describing this server's current state, including the message of the last exception, if there is one and it is still in context.
                   String getWebRoot()
                            Retrieves the root context (directory) from which web content is served.
                   void handleConnection(Socket s)
                            Assigns the specified socket to a new conection handler and starts the handler in a new Thread.
                   boolean isNoSystemExit()
                            Retrieves whether this server calls System.exit() when shutdown.
                   boolean isRestartOnShutdown()
                            Retrieves whether this server restarts on shutdown.
                   boolean isSilent()
                            Retrieves whether silent mode operation was requested in the server properties.
                   boolean isTls()
                            Retrieves whether the use of secure sockets was requested in the server properties.
                   boolean isTrace()
                            Retrieves whether JDBC trace messages are to go to System.out or the DriverManger PrintStream/PrintWriter, if any.
                  static void main(String[] args)
                            Creates and starts a new Server.
                   void notify(int action, int id)
                            This is called from org.hsqldb.DatabaseManager when a database is shutdown.
                   boolean putPropertiesFromFile(String path)
                            Attempts to put properties from the file with the specified path.
                   boolean putPropertiesFromFile(String path, String extension)
                            Attempts to put properties from the file with given extension.
                   void putPropertiesFromString(String s)
                            Puts properties from the supplied string argument.
                   void setAddress(String address)
                            Sets the InetAddress with which this server's ServerSocket will be constructed.
                   void setDaemon(boolean daemon)
                            Sets whether server thread is a daemon.
                   void setDatabaseName(int index, String name)
                            Sets the external name (url alias) of the i'th hosted database.
                   void setDatabasePath(int index, String path)
                            Sets the path of the hosted database.
                   void setDefaultWebPage(String file)
                            Sets the name of the web page served when no page is specified.
                   void setErrWriter(PrintWriter pw)
                            Sets the PrintWriter to which server errors are logged.
                   void setLogWriter(PrintWriter pw)
                            Sets the PrintWriter to which server messages are logged.
                   void setNoSystemExit(boolean noExit)
                            Sets whether this server calls System.exit() when shutdown.
                   void setPort(int port)
                            Sets the server listen port.
                   void setProperties(org.hsqldb.persist.HsqlProperties props)
                            Sets server properties using the specified properties object
                   void setRestartOnShutdown(boolean restart)
                            Sets whether this server restarts on shutdown.
                   void setSilent(boolean silent)
                            Sets silent mode operation
                   void setTls(boolean tls)
                            Sets whether to use secure sockets
                   void setTrace(boolean trace)
                            Sets whether trace messages go to System.out or the DriverManger PrintStream/PrintWriter, if any.
                   void setWebRoot(String root)
                            Sets the path of the root directory from which web content is served.
                   void shutdown()
                            External method to shut down this server.
                   void shutdownCatalogs(int shutdownMode)
                            Shuts down all the database served by this server.
                   void shutdownWithCatalogs(int shutdownMode)
                            Shuts down this server and all the database served by this server.
                   void signalCloseAllServerConnections()
                            Closes all connections to this Server.
                   int start()
                            Starts this server synchronously.
                   int stop()
                            Stops this server asynchronously.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  Server

                  public Server()
                  Creates a new Server instance handling HSQL protocol connections.

                  Method Detail

                  getServerThread

                  public Thread getServerThread()
                  Returns thread object for "HSQLDB Server" thread


                  checkRunning

                  public void checkRunning(boolean running)
                  Checks if this Server object is or is not running and throws if the current state does not match the specified value.

                  Parameters:
                  running - if true, ensure the server is running, else ensure the server is not running
                  Throws:
                  org.hsqldb.HsqlException - if the supplied value does not match the current running status

                  signalCloseAllServerConnections

                  public void signalCloseAllServerConnections()
                  Closes all connections to this Server.

                  Specified by:
                  signalCloseAllServerConnections in interface org.hsqldb.server.HsqlSocketRequestHandler

                  getAddress

                  public String getAddress()
                  Retrieves, in string form, this server's host address.

                  Returns:
                  this server's host address

                  getDatabaseName

                  public String getDatabaseName(int index,
                                                boolean asconfigured)
                  Retrieves the url alias (network name) of the i'th database that this Server hosts.

                  Parameters:
                  index - the index of the url alias upon which to report
                  asconfigured - if true, report the configured value, else the live value
                  Returns:
                  the url alias component of the i'th database that this Server hosts, or null if no such name exists.

                  getDatabasePath

                  public String getDatabasePath(int index,
                                                boolean asconfigured)
                  Retrieves the HSQLDB path descriptor (uri) of the i'th Database that this Server hosts.

                  Parameters:
                  index - the index of the uri upon which to report
                  asconfigured - if true, report the configured value, else the live value
                  Returns:
                  the HSQLDB database path descriptor of the i'th database that this Server hosts, or null if no such path descriptor exists

                  getDatabaseType

                  public String getDatabaseType(int index)

                  getDefaultWebPage

                  public String getDefaultWebPage()
                  Retrieves the name of the web page served when no page is specified. This attribute is relevant only when server protocol is HTTP(S).

                  Returns:
                  the name of the web page served when no page is specified

                  getHelpString

                  public String getHelpString()
                  Retrieves a String object describing the command line and properties options for this Server.

                  Returns:
                  the command line and properties options help for this Server

                  getErrWriter

                  public PrintWriter getErrWriter()
                  Retrieves the PrintWriter to which server errors are printed.

                  Returns:
                  the PrintWriter to which server errors are printed.

                  getLogWriter

                  public PrintWriter getLogWriter()
                  Retrieves the PrintWriter to which server messages are printed.

                  Returns:
                  the PrintWriter to which server messages are printed.

                  getPort

                  public int getPort()
                  Retrieves this server's host port.

                  Returns:
                  this server's host port

                  getProductName

                  public String getProductName()
                  Retrieves this server's product name.

                  Typically, this will be something like: "HSQLDB xxx server".

                  Returns:
                  the product name of this server

                  getProductVersion

                  public String getProductVersion()
                  Retrieves the server's product version, as a String.

                  Typically, this will be something like: "1.x.x" or "2.x.x" and so on.

                  Returns:
                  the product version of the server

                  getProtocol

                  public String getProtocol()
                  Retrieves a string respresentaion of the network protocol this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'.

                  Returns:
                  string respresentation of this server's protocol

                  getServerError

                  public Throwable getServerError()
                  Retrieves a Throwable indicating the last server error, if any.

                  Returns:
                  a Throwable indicating the last server error

                  getServerId

                  public String getServerId()
                  Retrieves a String identifying this Server object.

                  Returns:
                  a String identifying this Server object

                  getState

                  public int getState()
                  Retrieves current state of this server in numerically coded form.

                  Typically, this will be one of:

                  1. ServerProperties.SERVER_STATE_ONLINE (1)
                  2. ServerProperties.SERVER_STATE_OPENING (4)
                  3. ServerProperties.SERVER_STATE_CLOSING (8)
                  4. ServerProperties.SERVER_STATE_SHUTDOWN (16)

                  Returns:
                  this server's state code.

                  getStateDescriptor

                  public String getStateDescriptor()
                  Retrieves a character sequence describing this server's current state, including the message of the last exception, if there is one and it is still in context.

                  Returns:
                  this server's state represented as a character sequence.

                  getWebRoot

                  public String getWebRoot()
                  Retrieves the root context (directory) from which web content is served. This property is relevant only when the server protocol is HTTP(S). Although unlikely, it may be that in the future other contexts, such as jar urls may be supported, so that pages can be served from the contents of a jar or from the JVM class path.

                  Returns:
                  the root context (directory) from which web content is served

                  handleConnection

                  public void handleConnection(Socket s)
                  Assigns the specified socket to a new conection handler and starts the handler in a new Thread.

                  Specified by:
                  handleConnection in interface org.hsqldb.server.HsqlSocketRequestHandler
                  Parameters:
                  s - the socket to connect

                  isNoSystemExit

                  public boolean isNoSystemExit()
                  Retrieves whether this server calls System.exit() when shutdown.

                  Returns:
                  true if this server does not call System.exit()

                  isRestartOnShutdown

                  public boolean isRestartOnShutdown()
                  Retrieves whether this server restarts on shutdown.

                  Returns:
                  true this server restarts on shutdown

                  isSilent

                  public boolean isSilent()
                  Retrieves whether silent mode operation was requested in the server properties.

                  Returns:
                  if true, silent mode was requested, else trace messages are to be printed

                  isTls

                  public boolean isTls()
                  Retrieves whether the use of secure sockets was requested in the server properties.

                  Returns:
                  if true, secure sockets are requested, else not

                  isTrace

                  public boolean isTrace()
                  Retrieves whether JDBC trace messages are to go to System.out or the DriverManger PrintStream/PrintWriter, if any.

                  Returns:
                  true if tracing is on (JDBC trace messages to system out)

                  putPropertiesFromFile

                  public boolean putPropertiesFromFile(String path)
                  Attempts to put properties from the file with the specified path. The file extension '.properties' is implicit and should not be included in the path specification.

                  Parameters:
                  path - the path of the desired properties file, without the '.properties' file extension
                  Returns:
                  true if the indicated file was read sucessfully, else false
                  Throws:
                  org.hsqldb.HsqlException - if this server is running

                  putPropertiesFromFile

                  public boolean putPropertiesFromFile(String path,
                                                       String extension)
                  Attempts to put properties from the file with given extension.

                  Parameters:
                  path - the path of the desired properties file.
                  extension - extension to add to parth
                  Returns:
                  true if the indicated file was read sucessfully, else false
                  Throws:
                  org.hsqldb.HsqlException - if this server is running

                  putPropertiesFromString

                  public void putPropertiesFromString(String s)
                  Puts properties from the supplied string argument. The relevant key value pairs are the same as those for the (web)server.properties file format, except that the 'server.' prefix should not be specified.

                  Parameters:
                  s - semicolon-delimited key=value pair string, e.g. silent=false;port=8080;...
                  Throws:
                  org.hsqldb.HsqlException - if this server is running

                  setAddress

                  public void setAddress(String address)
                  Sets the InetAddress with which this server's ServerSocket will be constructed. A null or empty string or the special value "0.0.0.0" can be used to bypass explicit selection, causing the ServerSocket to be constructed without specifying an InetAddress.

                  Parameters:
                  address - A string representing the desired InetAddress as would be retrieved by InetAddres.getByName(), or a null or empty string or "0.0.0.0" to signify that the server socket should be constructed using the signature that does not specify the InetAddress.
                  Throws:
                  org.hsqldb.HsqlException - if this server is running

                  setDatabaseName

                  public void setDatabaseName(int index,
                                              String name)
                  Sets the external name (url alias) of the i'th hosted database.

                  Parameters:
                  name - external name (url alias) of the i'th HSQLDB database instance this server is to host.
                  Throws:
                  org.hsqldb.HsqlException - if this server is running

                  setDatabasePath

                  public void setDatabasePath(int index,
                                              String path)
                  Sets the path of the hosted database. The path always starts with the catalog type. Examples of the path include: "file:mydir/mydb", "mem:mymemdb", "res:org/mydomain/mydbs/settingsdb".

                  Parameters:
                  path - The path of the i'th HSQLDB database instance this server is to host.

                  setDefaultWebPage

                  public void setDefaultWebPage(String file)
                  Sets the name of the web page served when no page is specified.

                  Parameters:
                  file - the name of the web page served when no page is specified

                  setPort

                  public void setPort(int port)
                  Sets the server listen port.

                  Parameters:
                  port - the port at which this server listens

                  setErrWriter

                  public void setErrWriter(PrintWriter pw)
                  Sets the PrintWriter to which server errors are logged.

                  Setting this attribute to null disables server error logging

                  Parameters:
                  pw - the PrintWriter to which server messages are logged

                  setLogWriter

                  public void setLogWriter(PrintWriter pw)
                  Sets the PrintWriter to which server messages are logged.

                  Setting this attribute to null disables server message logging

                  Parameters:
                  pw - the PrintWriter to which server messages are logged

                  setNoSystemExit

                  public void setNoSystemExit(boolean noExit)
                  Sets whether this server calls System.exit() when shutdown.

                  Parameters:
                  noExit - if true, System.exit() will not be called.

                  setRestartOnShutdown

                  public void setRestartOnShutdown(boolean restart)
                  Sets whether this server restarts on shutdown.

                  Parameters:
                  restart - if true, this server restarts on shutdown

                  setSilent

                  public void setSilent(boolean silent)
                  Sets silent mode operation

                  Parameters:
                  silent - if true, then silent mode, else trace messages are to be printed

                  setTls

                  public void setTls(boolean tls)
                  Sets whether to use secure sockets

                  Parameters:
                  tls - true for secure sockets, else false
                  Throws:
                  org.hsqldb.HsqlException - if this server is running

                  setTrace

                  public void setTrace(boolean trace)
                  Sets whether trace messages go to System.out or the DriverManger PrintStream/PrintWriter, if any.

                  Parameters:
                  trace - if true, route JDBC trace messages to System.out

                  setDaemon

                  public void setDaemon(boolean daemon)
                  Sets whether server thread is a daemon. Used before starting. The default is false.

                  Parameters:
                  daemon - if true, start the thread as a daemon thread

                  setWebRoot

                  public void setWebRoot(String root)
                  Sets the path of the root directory from which web content is served.

                  Parameters:
                  root - the root (context) directory from which web content is served

                  setProperties

                  public void setProperties(org.hsqldb.persist.HsqlProperties props)
                                     throws IOException,
                                            ServerAcl.AclFormatException
                  Sets server properties using the specified properties object

                  Parameters:
                  props - The object containing properties to set
                  Throws:
                  ServerAcl.AclFormatException - ACL list was requested but problem loading ACL.
                  IOException - ACL list was requested but I/O problem loading ACL.

                  start

                  public int start()
                  Starts this server synchronously.

                  This method waits for current state to change from SERVER_STATE_OPENNING. In order to discover the success or failure of this operation, server state must be polled or a subclass of Server must be used that overrides the setState method to provide state change notification.

                  Returns:
                  the server state noted at entry to this method

                  stop

                  public int stop()
                  Stops this server asynchronously.

                  This method returns immediately, regardless of current state. In order to discover the success or failure of this operation, server state must be polled or a subclass of Server must be used that overrides the setState method to provide state change notification.

                  Returns:
                  the server state noted at entry to this method

                  notify

                  public final void notify(int action,
                                           int id)
                  This is called from org.hsqldb.DatabaseManager when a database is shutdown. This shuts the server down if it is the last database

                  Parameters:
                  action - a code indicating what has happend

                  shutdownCatalogs

                  public void shutdownCatalogs(int shutdownMode)
                  Shuts down all the database served by this server. As a consequence, this server and any other server that is serving a subset of the databases will be shutdown, unless the server was started with server.remote_open property. The shutdownMode must be one of:
                  • org.hsqldb.Database.CLOSEMODE_IMMEDIATELY
                  • org.hsqldb.Database.CLOSEMODE_NORMAL
                  • org.hsqldb.Database.CLOSEMODE_COMPACT
                  • org.hsqldb.Database.CLOSEMODE_SCRIPT

                  Parameters:
                  shutdownMode - a value between 0-4, usually 0 or 1.

                  shutdownWithCatalogs

                  public void shutdownWithCatalogs(int shutdownMode)
                  Shuts down this server and all the database served by this server. As a consequence, any other server that is serving a subset of the databases will be shutdown, unless the server was started with server.remote_open property. The shutdownMode must be one of:
                  • org.hsqldb.Database.CLOSEMODE_IMMEDIATELY
                  • org.hsqldb.Database.CLOSEMODE_NORMAL
                  • org.hsqldb.Database.CLOSEMODE_COMPACT
                  • org.hsqldb.Database.CLOSEMODE_SCRIPT

                  Parameters:
                  shutdownMode - a value between 0-4, usually 0 or 1.

                  shutdown

                  public void shutdown()
                  External method to shut down this server.


                  main

                  public static void main(String[] args)
                  Creates and starts a new Server.

                  Allows starting a Server via the command line interface.

                  Parameters:
                  args - the command line arguments for the Server instance


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/package-summary.html0000644000175000017500000001673112007570404025627 0ustar renerene org.hsqldb.server (HSQLDB 2.2.9 API)

                  Package org.hsqldb.server

                  The HyperSQL network listener classes.

                  See:
                            Description

                  Class Summary
                  Server The HSQLDB HSQL protocol network database server.
                  ServerAcl A list of ACL permit and deny entries with a permitAccess method which tells whether candidate addresses are permitted or denied by this ACL list.
                  WebServer The HSQLDB HTTP protocol network database server.
                   

                  Exception Summary
                  ServerAcl.AclFormatException  
                   

                  Package org.hsqldb.server Description

                  The HyperSQL network listener classes.



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/package-tree.html0000644000175000017500000001622512007570404025067 0ustar renerene org.hsqldb.server Class Hierarchy (HSQLDB 2.2.9 API)

                  Hierarchy For Package org.hsqldb.server

                  Package Hierarchies:
                  All Packages

                  Class Hierarchy



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/server/WebServer.html0000644000175000017500000006353312007570402024445 0ustar renerene WebServer (HSQLDB 2.2.9 API)

                  org.hsqldb.server
                  Class WebServer

                  java.lang.Object
                    extended by org.hsqldb.server.Server
                        extended by org.hsqldb.server.WebServer
                  
                  All Implemented Interfaces:
                  org.hsqldb.server.HsqlSocketRequestHandler

                  public class WebServer
                  extends Server

                  The HSQLDB HTTP protocol network database server.

                  WebServer has two distinct functions:

                  The primary function is to allow client/server access to HSQLDB databases via the HTTP protocol. This protocol is less efficient than the HSQL protocol used by the Server class and should be used only in situations where sandboxes or firewalls between the client and the server do not allow the use of the HSQL protocol. One example is client/server access by an applet running in browsers on remote hosts and accessing the database engine on the HTTP server from which the applet originated. From version 1.7.2, HTTP database connections are persistent and support transactions. Similar to HSQL connections, they should be explicitly closed to free the server resources.

                  The secondary function of WebServer is to act as a simple general purpose HTTP server. It is aimed to support the minimum requirements set out by the HTTP/1.0 standard. The HEAD and GET methods can be used to query and retreive static files from the HTTP server.

                  Both the database server and HTTP server functions of WebServer can be configured with the webserver.properties file. It contains entries for the database server similar to those for the HSQL protocol Server class. In addition, a list mapping different file endings to their mime types may be included in this file. (fredt@users)

                  From the command line, the options are as follows:

                   +-----------------+-------------+----------+------------------------------+
                   |    OPTION       |    TYPE     | DEFAULT  |         DESCRIPTION          |
                   +-----------------+-------------+----------+------------------------------|
                   | --help          |             |          | prints this message          |
                   | --address       | name|number | any      | server inet address          |
                   | --port          | number      | 80       | port at which server listens |
                   | --database.i    | [type]spec  | 0=test   | path of database i           |
                   | --dbname.i      | alias       |          | url alias for database i     |
                   | --silent        | true|false  | true     | false => display all queries |
                   | --trace         | true|false  | false    | display JDBC trace messages  |
                   | --no_system_exit| true|false  | false    | do not issue System.exit()   |
                   +-----------------+-------------+----------+------------------------------+
                   
                  Example of the webserver.properties file:
                   server.port=80
                   server.database.0=test
                   server.dbname.0=...
                   ...
                   server.database.n=...
                   server.dbname.n=...
                   server.silent=true
                  
                   .htm=text/html
                   .html=text/html
                   .txt=text/plain
                   .gif=image/gif
                   .class=application/octet-stream
                   .jpg=image/jpeg
                   .jgep=image/jpeg
                   .zip=application/x-zip-compressed
                   
                  • For server.root, use '/' as the separator, even for DOS/Windows.
                  • File extensions for mime types must be lowercase and start with '.'

                  Since:
                  1.7.2
                  Author:
                  Campbell Boucher-Burnet (boucherb@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)

                  Constructor Summary
                  WebServer()
                             
                   
                  Method Summary
                   String getDefaultWebPage()
                            Retrieves the name of the web page served when no page is specified.
                   String getHelpString()
                            Retrieves a String object describing the command line and properties options for this Server.
                   String getProductName()
                            Retrieves this server's product name.
                   String getProtocol()
                            Retrieves a string respresentaion of the network protocol this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'.
                   String getWebRoot()
                            Retrieves the root context (directory) from which web content is served.
                  static void main(String[] args)
                            Starts a new WebServer.
                   
                  Methods inherited from class org.hsqldb.server.Server
                  checkRunning, getAddress, getDatabaseName, getDatabasePath, getDatabaseType, getErrWriter, getLogWriter, getPort, getProductVersion, getServerError, getServerId, getServerThread, getState, getStateDescriptor, handleConnection, isNoSystemExit, isRestartOnShutdown, isSilent, isTls, isTrace, notify, putPropertiesFromFile, putPropertiesFromFile, putPropertiesFromString, setAddress, setDaemon, setDatabaseName, setDatabasePath, setDefaultWebPage, setErrWriter, setLogWriter, setNoSystemExit, setPort, setProperties, setRestartOnShutdown, setSilent, setTls, setTrace, setWebRoot, shutdown, shutdownCatalogs, shutdownWithCatalogs, signalCloseAllServerConnections, start, stop
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  WebServer

                  public WebServer()
                  Method Detail

                  main

                  public static void main(String[] args)
                  Starts a new WebServer.

                  Parameters:
                  args - the "command line" parameters with which to start the WebServer. "-?" will cause the command line arguments help to be printed to the standard output

                  getDefaultWebPage

                  public String getDefaultWebPage()
                  Retrieves the name of the web page served when no page is specified. This attribute is relevant only when server protocol is HTTP(S).

                  Overrides:
                  getDefaultWebPage in class Server
                  Returns:
                  the name of the web page served when no page is specified

                  getHelpString

                  public String getHelpString()
                  Retrieves a String object describing the command line and properties options for this Server.

                  Overrides:
                  getHelpString in class Server
                  Returns:
                  the command line and properties options help for this Server

                  getProductName

                  public String getProductName()
                  Retrieves this server's product name.

                  Typically, this will be something like: "HSQLDB xxx server".

                  Overrides:
                  getProductName in class Server
                  Returns:
                  the product name of this server

                  getProtocol

                  public String getProtocol()
                  Retrieves a string respresentaion of the network protocol this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'.

                  Overrides:
                  getProtocol in class Server
                  Returns:
                  string respresentation of this server's protocol

                  getWebRoot

                  public String getWebRoot()
                  Retrieves the root context (directory) from which web content is served. This property is relevant only when the server protocol is HTTP(S). Although unlikely, it may be that in the future other contexts, such as jar urls may be supported, so that pages can be served from the contents of a jar or from the JVM class path.

                  Overrides:
                  getWebRoot in class Server
                  Returns:
                  the root context (directory) from which web content is served


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/0000755000175000017500000000000012007570406021300 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/AuthFunctionBean.html0000644000175000017500000002643312007570402025367 0ustar renerene AuthFunctionBean (HSQLDB 2.2.9 API)

                  org.hsqldb.auth
                  Interface AuthFunctionBean

                  All Known Implementing Classes:
                  HsqldbSlaveAuthBean, JaasAuthBean, LdapAuthBean

                  public interface AuthFunctionBean

                  N.b. AuthFunctionBeans are NOT directly usable as HyperSQL Authentication Function methods, they are POJO beans to be managed by AuthBeanMultiplexer (which does have a real HyperSQL Authentication Function static method).

                  Since:
                  2.0.1
                  Author:
                  Blaine Simpson (blaine dot simpson at admc dot com)
                  See Also:
                  for how these beans are used.

                  Method Summary
                   String[] authenticate(String userName, String password)
                            Return a list of authorized roles or null to indicate that the implementation does not intend to produce a specific role list but only to indicate whether to allow access or not.
                   

                  Method Detail

                  authenticate

                  String[] authenticate(String userName,
                                        String password)
                                        throws Exception
                  Return a list of authorized roles or null to indicate that the implementation does not intend to produce a specific role list but only to indicate whether to allow access or not. A return value of String[0] is different from returning null, and means that the user should not be granted any roles.

                  Returns:
                  null or String[] according to the contract of HyperSQL authentication function contract, except that the role/schema list is returned as a String[] instead of a java.sql.Array.
                  Throws:
                  Exception - If user should not be allowed access to the specified database. Other registed AuthFunctionBeans will not be attempted.
                  RuntimeException - Upon system problem. The exception will be logged to the HyperSQL application logger and other registered AuthFunctionBeans (if any) will be attempted.


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/package-frame.html0000644000175000017500000000326112007570404024651 0ustar renerene org.hsqldb.auth (HSQLDB 2.2.9 API) org.hsqldb.auth
                  Interfaces 
                  AuthFunctionBean
                  Classes 
                  AuthBeanMultiplexer
                  HsqldbSlaveAuthBean
                  JaasAuthBean
                  JaasAuthBean.UPCallbackHandler
                  LdapAuthBean
                  hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/package-use.html0000644000175000017500000001611512007570404024355 0ustar renerene Uses of Package org.hsqldb.auth (HSQLDB 2.2.9 API)

                  Uses of Package
                  org.hsqldb.auth

                  Packages that use org.hsqldb.auth
                  org.hsqldb.auth   
                   

                  Classes in org.hsqldb.auth used by org.hsqldb.auth
                  AuthBeanMultiplexer
                            This class provides a method which can be used directly as a HyperSQL static Java function method.
                  AuthFunctionBean
                            N.b.
                  DenyException
                             
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/LdapAuthBean.html0000644000175000017500000012631112007570402024456 0ustar renerene LdapAuthBean (HSQLDB 2.2.9 API)

                  org.hsqldb.auth
                  Class LdapAuthBean

                  java.lang.Object
                    extended by org.hsqldb.auth.LdapAuthBean
                  
                  All Implemented Interfaces:
                  AuthFunctionBean

                  public class LdapAuthBean
                  extends Object
                  implements AuthFunctionBean

                  Authenticates to a HyperSQL catalog according to entries in a LDAP database. If using LDAP StartTLS and your server has a certificate not trusted by default by your JRE, then set system property 'javax.net.ssl.trustStore' to the path to a trust store containing the cert (as well as any other certs that your app needs for other purposes).

                  This class with authenticate login attempts against LDAP entries with RDN of the HyperSQL account name (the precise attribute name defaults to 'uid', but you may change that).

                  This class purposefully does not support LDAPS, because LDAPS is deprecated in favor of StartTLS, which we do support. If you need to support LDAPS and are using SE 1.6, use our JaasAuthBean with Sun's LdapLoginModule.

                  This class does not support SASL/External authentication, because the work involved with securely obtaining user-specific certs would be more complex than everything else here combined. Another AuthFunctionBean would have to be written if SASL/External is needed.

                  To use instances of this class, you must use at least the methods setLdapHost, setParentDn, initialize, plus rolesSchemaAttribute and/or accessAttribute.

                  For a user to be given HyperSQL catalog access, that user must either have a value for accessAttribute if that property is set (optionally requiring a match with accessValuePattern); or, if the accessAttribute is not set then must have some (any) value for rolesSchemaAttribute (optionally requiring a match with roleSchemaValuePattern). Consequently, if you have set both accessAttribute and rolesSchemaAttribute, the latter attribute will only be consulted if the check of the former attribute succeeds.

                  If you want roles assigned according to the local HyperSQL database instead of according to LDAP, then set accessAttribute but not rolesSchemaAttribute.

                  If what is wanted is to grant access but with no roles (overriding local roles if there are any), then set both accessAttribute and rolesSchemaAttribute, but do not set any rolesSchemaAttribute attribute values for these no-role users. (I hesitate to mention it, but you could accomplish the same thing with only a rolesSchemaAttribute attribute, by setting only a dummy role/schema value for non-role users, because HyperSQL will ignore unknown roles or schemas but still give access since a list was still supplied).

                  Since:
                  2.0.1
                  Author:
                  Blaine Simpson (blaine dot simpson at admc dot com)
                  See Also:
                  AuthFunctionBean, setLdapHost(String), setParentDn(String), init()

                  Constructor Summary
                  LdapAuthBean()
                             
                   
                  Method Summary
                   String[] authenticate(String userName, String password)
                            Return a list of authorized roles or null to indicate that the implementation does not intend to produce a specific role list but only to indicate whether to allow access or not.
                   void init()
                             
                  static void main(String[] sa)
                            Run this method to try and test configuration settings for LdapAuthBeans, or to troubleshoot.
                   void setAccessAttribute(String attribute)
                            Set the attribute name of the RDN + parentDn entries which will be consulted to decide whether the user can access the HyperSQL database.
                   void setAccessValuePattern(Pattern accessValuePattern)
                            Assign a pattern to detect honored accessAttribute values.
                   void setAccessValuePatternString(String patternString)
                            String wrapper for method setAccessValuePattern(Pattern) Use the (x?) Pattern constructs to set options.
                   void setInitialContextFactory(String initialContextFactory)
                            Most users should not call this, and will get the default of "com.sun.jndi.ldap.LdapCtxFactory".
                   void setLdapHost(String ldapHost)
                            Do not specify URL scheme ("ldap:") because that is implied.
                   void setLdapPort(int ldapPort)
                             
                   void setParentDn(String parentDn)
                            Set DN which is parent of the user DNs.
                   void setPrincipalTemplate(String principalTemplate)
                            A template String containing place-holder token '${username}'.
                   void setRdnAttribute(String rdnAttribute)
                            rdnAttribute must hold the user name exactly as the HyperSQL login will be made with.
                   void setRoleSchemaValuePattern(Pattern roleSchemaValuePattern)
                            Assign a pattern to both detect honored values, and to map from a single value of "rolesSchemaAttribute"s to a HyperSQL role or schema string.
                   void setRoleSchemaValuePatternString(String patternString)
                            String wrapper for method setRoleSchemaValuePattern(Pattern) Use the (x?) Pattern constructs to set options.
                   void setRolesSchemaAttribute(String attribute)
                            Set the attribute name of the RDN + parentDn entries in which is stored the list of roles and optional schema for the authenticating user.
                   void setSaslRealm(String saslRealm)
                            Some LDAP servers using a SASL mechanism require a realm to be specified, and some mechanisms allow a realm to be specified if you wish to use that feature.
                   void setSecurityMechanism(String mechanism)
                            Defaults to "SIMPLE".
                   void setStartTls(boolean isTls)
                            If this is set, then the entire (brief) transaction with the LDAP server will be encrypted.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  LdapAuthBean

                  public LdapAuthBean()
                  Method Detail

                  setStartTls

                  public void setStartTls(boolean isTls)
                  If this is set, then the entire (brief) transaction with the LDAP server will be encrypted.


                  setLdapPort

                  public void setLdapPort(int ldapPort)

                  init

                  public void init()
                  Throws:
                  IllegalStateException - if any required setting has not been set.

                  setAccessValuePattern

                  public void setAccessValuePattern(Pattern accessValuePattern)
                  Assign a pattern to detect honored accessAttribute values. If you set accessAttribute but not accessValuePattern, then all that will be checked for access is if the RDN + parentDN entry has the accessAttribute attribute. (I.e. the specific value will not matter whatsoever).

                  You may only use this property if you have set property accessAttribute. If you have set accessAttribute but not this property, then access will be decided based solely upon existence of this attribute.

                  Capture groups in the pattern will be ignored and serve no purpose.

                  N.b. this Pattern will be used for the matches() operation, therefore it must match the entire candidate value strings (this is different than the find operation which does not need to satisfy the entire candidate value).

                  Example1 :

                       TRUE
                   
                  This will match true values per OpenLDAP's boolean OID.

                  See Also:
                  Matcher.matches()

                  setAccessValuePatternString

                  public void setAccessValuePatternString(String patternString)
                  String wrapper for method setAccessValuePattern(Pattern) Use the (x?) Pattern constructs to set options.

                  Throws:
                  PatternSyntaxException
                  See Also:
                  setAccessValuePattern(Pattern)

                  setRoleSchemaValuePattern

                  public void setRoleSchemaValuePattern(Pattern roleSchemaValuePattern)
                  Assign a pattern to both detect honored values, and to map from a single value of "rolesSchemaAttribute"s to a HyperSQL role or schema string. If your rolesSchemaAttribute holds only the String values precisely as HyperSQL needs them, then don't use this method at all and all matching attribute values will be passed directly.

                  You may only use this property if you have set property rolesSchemaAttribute. If rolesSchemaAttribute is set but this property is not set, then the value will directly determine the user's roles and schema.

                  Unlike the rolesSchemaAttribute, the property at-hand uses the singular for "role", because whereas rolesSchemaAttribute is the attribute for listing multiple roles, roleSchemaValuePattern is used to evaluate single role values.

                  These are two distinct and important purposes for the specified Pattern.

                  1. Values that do not successfully match the pattern will be ignored.
                  2. Optionally uses parentheses to specify a single capture group (if you use parentheses to specify more than one matching group, we will only capture for the first). What is captured by this group is exactly the role or schema that HyperSQL will attempt to assign. If no capture parens are given then the Pattern is only used for the acceptance decision, and the LDAP-provided value will be returned verbatim.

                  Together, these two features work great to extract just the needed role and schema names from 'memberof' DNs, and will have no problem if you also use 'memberof' for unrelated purposes.

                  N.b. this Pattern will be used for the matches() operation, therefore it must match the entire candidate value strings (this is different than the find operation which does not need to satisfy the entire candidate value).

                  Example1 :

                       cn=([^,]+),ou=dbRole,dc=admc,dc=com
                   
                  will extract the CN value from matching attribute values.

                  Example1 :

                       cn=[^,]+,ou=dbRole,dc=admc,dc=com
                   
                  will return the entire cn...com string for matching attribute values.

                  See Also:
                  Matcher.matches()

                  setRoleSchemaValuePatternString

                  public void setRoleSchemaValuePatternString(String patternString)
                  String wrapper for method setRoleSchemaValuePattern(Pattern) Use the (x?) Pattern constructs to set options.

                  Throws:
                  PatternSyntaxException
                  See Also:
                  setRoleSchemaValuePattern(Pattern)

                  setSecurityMechanism

                  public void setSecurityMechanism(String mechanism)
                  Defaults to "SIMPLE".

                  Parameters:
                  mechanism - Either 'SIMPLE' (the default) for LDAP Simple, or one of the LDAP SASL mechamisms, such as 'DIGEST-MD5'.

                  setLdapHost

                  public void setLdapHost(String ldapHost)
                  Do not specify URL scheme ("ldap:") because that is implied. (Since we purposefully don't support LDAPS, there would be no reason to change that).

                  If using StartTLS, then this host name must match the cn of the LDAP server's certificate.

                  If you need to support LDAPS and are using SE 1.6, use our JaasAuthBean with Sun's LdapLoginModule instead of this class.

                  See Also:
                  JaasAuthBean

                  setPrincipalTemplate

                  public void setPrincipalTemplate(String principalTemplate)
                  A template String containing place-holder token '${username}'. All occurrences of '${username}' (without the quotes) will be translated to the username that authentication is being attempted with.

                  If you supply a principalTemplate that does not contain '${username}', then authentication will be user-independent.

                  It is common to authenticate to LDAP servers with the DN of the user's LDAP entry. In this situation, set principalTemplate to <RDN_ATTR=>${username},<PARENT_DN>. For example if you use parentDn of "ou=people,dc=admc,dc=com" and rdnAttribute of uid, then you would set

                       "uid=${username},ou=people,dc=admc,dc=com"
                   

                  By default the user name will be passed exactly as it is, so don't use this setter if that is what you want. (This works great for OpenLDAP with DIGEST-MD5 SASL, for example).


                  setInitialContextFactory

                  public void setInitialContextFactory(String initialContextFactory)
                  Most users should not call this, and will get the default of "com.sun.jndi.ldap.LdapCtxFactory". Use this method if you prefer to use a context factory provided by your framework or container, for example, or if you are using a non-Sun JRE.


                  setSaslRealm

                  public void setSaslRealm(String saslRealm)
                  Some LDAP servers using a SASL mechanism require a realm to be specified, and some mechanisms allow a realm to be specified if you wish to use that feature. By default no realm will be sent to the LDAP server.

                  Don't use this setter if you are not setting a SASL mechanism.


                  setParentDn

                  public void setParentDn(String parentDn)
                  Set DN which is parent of the user DNs. E.g. "ou=people,dc=admc,dc=com"


                  setRdnAttribute

                  public void setRdnAttribute(String rdnAttribute)
                  rdnAttribute must hold the user name exactly as the HyperSQL login will be made with.

                  This is the RDN relative to the Parent DN specified with setParentDN. Defaults to 'uid'.

                  See Also:
                  setParentDn(String)

                  setRolesSchemaAttribute

                  public void setRolesSchemaAttribute(String attribute)
                  Set the attribute name of the RDN + parentDn entries in which is stored the list of roles and optional schema for the authenticating user.

                  There is no default. You must set this attribute if you want LDAP instead of the local HyperSQL database to determine the user's roles! You must set the rolesSchemaAttribute property and/or the accessAttribute property. Consequently, if you do no tset this property, then you must set the accessAttribute property, and this LdapAuthBean will only determine access not roles.

                  To use the nice reverse group membership feature of LDAP, set this value to "memberof".

                  If you have set both rolesSchemaAttribute and this value, then the attribute set here will only be consulted if the accessAttribute check succeeds.


                  setAccessAttribute

                  public void setAccessAttribute(String attribute)
                  Set the attribute name of the RDN + parentDn entries which will be consulted to decide whether the user can access the HyperSQL database.

                  There is no default. If you set this attribute, then the attribute will determine whether the user can access the HyperSQL database, regardless of whether the rolesSchemaAttribute attribute is set.

                  If you set just this property, then the local HyperSQL database will decide all roles for the user. If you set this property and propety rolesSchemaAttribute then this attribute will determine access, and if this attribute grants access then the rolesSchemaAttribute value will determine the user's roles.


                  authenticate

                  public String[] authenticate(String userName,
                                               String password)
                                        throws org.hsqldb.auth.DenyException
                  Description copied from interface: AuthFunctionBean
                  Return a list of authorized roles or null to indicate that the implementation does not intend to produce a specific role list but only to indicate whether to allow access or not. A return value of String[0] is different from returning null, and means that the user should not be granted any roles.

                  Specified by:
                  authenticate in interface AuthFunctionBean
                  Returns:
                  null or String[] according to the contract of HyperSQL authentication function contract, except that the role/schema list is returned as a String[] instead of a java.sql.Array.
                  Throws:
                  org.hsqldb.auth.DenyException
                  See Also:
                  AuthFunctionBean.authenticate(String, String)

                  main

                  public static void main(String[] sa)
                                   throws IOException
                  Run this method to try and test configuration settings for LdapAuthBeans, or to troubleshoot. It purposefully does not test the Java Function or the JDBC layer at all. This program will attempt to retrieve and display the schema/roles list for the specified user and with the specified password from the LDAP server according to the specified properties.

                  Passwords typed on the command line are inherently not secure, so only use this program when the computer it is run on is secured and where your command line may not be observed, directly or indirectly, by others.

                  Set the properties in a properties file to match your LDAP security and Directory Information Tree structure and use this program to check everything between the LdapAuthBean and your LDAP server. You then know the exact settings to use for an LdapAuthBean that you can plug into AuthBeanMultiplexer.

                  Run with no arguments to see required syntax.

                  The property file may contain any of the following properties, which exactly match the corresponding setter methods in this class.

                  • trustStore. This is the only property without a corresponding setter method. Setting this property has the same effect as setting Java system property 'javax.net.ssl.trustStore'.
                  • startTls. Takes a boolean value according to method java.util.Boolean.parseBoolean.
                  • roleSchemaValuePattern. Correponds to method setRoleSchemaValuePatternString
                  • accessValuePattern. Correponds to method setAccessValuePatternString
                  • ldapPort
                  • securityMechanism
                  • ldapHost
                  • principalTemplate
                  • initialContextFactory
                  • saslRealm
                  • parentDn
                  • rdnAttribute
                  • rolesSchemaAttribute
                  • accessAttribute
                  Tokens like ${this} will not be expanded to system property values, and your bean will get the values exactly as you type them in.

                  The file sample/ldap-exerciser.properties in the HyperSQL distribution may be used as a template or example.

                  Throws:
                  IOException


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/JaasAuthBean.html0000644000175000017500000006107112007570402024455 0ustar renerene JaasAuthBean (HSQLDB 2.2.9 API)

                  org.hsqldb.auth
                  Class JaasAuthBean

                  java.lang.Object
                    extended by org.hsqldb.auth.JaasAuthBean
                  
                  All Implemented Interfaces:
                  AuthFunctionBean

                  public class JaasAuthBean
                  extends Object
                  implements AuthFunctionBean

                  Provides authentication and authorization (roles and initial schema) according to JAAS modules configured by the runtime JAAS implementation.

                  JAAS modules used must have both a NameCallback and a PasswordCallback. This is how we pass the JDBC-provided user name and password to the module.

                  JAAS setup is Java-implementation-specific. For Sun Java, you set up a JAAS configuration file which resides at $HOME/.java.login.config or at the location that you set with Java system property java.security.auth.login.config.

                  You can use this bean to manage just access, or also to manage roles or initial schemas. To use for roles or initial schemas, you must set the roleSchemaValuePattern property to distinguish which of the JAAS-module-provided values to use. By default, all JAAS-module-provided Principles will be candidates. If you set property roleSchemaViaCredential to true, then all JAAS-module-provided public Credentials will be candidates instead.

                  Since:
                  2.0.1
                  Author:
                  Blaine Simpson (blaine dot simpson at admc dot com)
                  See Also:
                  AuthFunctionBean, NameCallback, PasswordCallback

                  Nested Class Summary
                  static class JaasAuthBean.UPCallbackHandler
                             
                   
                  Constructor Summary
                  JaasAuthBean()
                             
                   
                  Method Summary
                   String[] authenticate(String userName, String password)
                            Return a list of authorized roles or null to indicate that the implementation does not intend to produce a specific role list but only to indicate whether to allow access or not.
                   void init()
                             
                   void setApplicationKey(String applicationKey)
                            Set the key into the JAAS runtime configuration.
                   void setRoleSchemaValuePattern(Pattern roleSchemaValuePattern)
                            Assign a pattern to both detect honored values, and optionally to map from a single principal name or public credential string to a single HyperSQL role or schema string.
                   void setRoleSchemaValuePatternString(String patternString)
                            String wrapper for method setRoleSchemaValuePattern(Pattern) Use the (x?) Pattern constructs to set options.
                   void setRoleSchemaViaCredential(boolean roleSchemaViaCredential)
                            By default, If roleSchemaValuePattern is set, then role and schema values are obtained from principle values; otherwise existing account privileges are used (if any).
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  JaasAuthBean

                  public JaasAuthBean()
                  Method Detail

                  setRoleSchemaViaCredential

                  public void setRoleSchemaViaCredential(boolean roleSchemaViaCredential)
                  By default, If roleSchemaValuePattern is set, then role and schema values are obtained from principle values; otherwise existing account privileges are used (if any). If roleSchemaViaCredential is set to true and roleSchemaValuePattern is set, then credential values will be used instead.

                  Do not set roleSchemaViaCredential to true unless roleSchemaValuePattern is set.


                  init

                  public void init()
                  Throws:
                  IllegalStateException - if any required setting has not been set.

                  setApplicationKey

                  public void setApplicationKey(String applicationKey)
                  Set the key into the JAAS runtime configuration. For Sun's JAAS implementation, this is the "application" identifier for a stanza in the JAAS configuration file.


                  setRoleSchemaValuePattern

                  public void setRoleSchemaValuePattern(Pattern roleSchemaValuePattern)
                  Assign a pattern to both detect honored values, and optionally to map from a single principal name or public credential string to a single HyperSQL role or schema string. Do not use this method if you are using this JaasAuthBean only to permit or reject access (with roles and schema being determined by pre-existing local HyperSQL accounts). On that case, simple success of the login() method method will allow access as the specified user.

                  If every principal name or public credentials holds only the String values precisely as HyperSQL needs them, then set the pattern to ".+". For example, if the JAAS module returns principals (or credentials) with values "one", "two", "three", then if you set this pattern to ".+", HyperSQL will attempt to assign initial schema and roles for the values "one", "two", and "three".

                  These are two distinct and important purposes for the specified Pattern.

                  1. Values that do not successfully match the pattern will be ignored. If the pattern does match, then the entire principal or credential value will be used to assign initial schema or role (as long as it is a valid schema name or role name in the local database).
                  2. Optionally uses parentheses to specify a single capture group (if you use parentheses to specify more than one matching group, we will only capture for the first). What is captured by this group is exactly the role or schema that HyperSQL will attempt to assign. If no capture parens are given then the Pattern is only used for the acceptance decision, and the JAAS-provided value will be returned verbatim.

                  N.b. this Pattern will be used for the matches() operation, therefore it must match the entire candidate value strings (this is different than the find operation which does not need to satisfy the entire candidate value).

                  Example1 :

                       cn=([^,]+),ou=dbRole,dc=admc,dc=com
                   
                  will extract the CN value from matching attribute values.

                  Example1 :

                       cn=[^,]+,ou=dbRole,dc=admc,dc=com
                   
                  will return the entire cn...com string for matching attribute values.

                  See Also:
                  Matcher.matches()

                  setRoleSchemaValuePatternString

                  public void setRoleSchemaValuePatternString(String patternString)
                  String wrapper for method setRoleSchemaValuePattern(Pattern) Use the (x?) Pattern constructs to set options.

                  Throws:
                  PatternSyntaxException
                  See Also:
                  setRoleSchemaValuePattern(Pattern)

                  authenticate

                  public String[] authenticate(String userName,
                                               String password)
                                        throws org.hsqldb.auth.DenyException
                  Description copied from interface: AuthFunctionBean
                  Return a list of authorized roles or null to indicate that the implementation does not intend to produce a specific role list but only to indicate whether to allow access or not. A return value of String[0] is different from returning null, and means that the user should not be granted any roles.

                  Specified by:
                  authenticate in interface AuthFunctionBean
                  Returns:
                  null or String[] according to the contract of HyperSQL authentication function contract, except that the role/schema list is returned as a String[] instead of a java.sql.Array.
                  Throws:
                  org.hsqldb.auth.DenyException
                  See Also:
                  AuthFunctionBean.authenticate(String, String)


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/JaasAuthBean.UPCallbackHandler.html0000644000175000017500000003447712007570402027725 0ustar renerene JaasAuthBean.UPCallbackHandler (HSQLDB 2.2.9 API)

                  org.hsqldb.auth
                  Class JaasAuthBean.UPCallbackHandler

                  java.lang.Object
                    extended by org.hsqldb.auth.JaasAuthBean.UPCallbackHandler
                  
                  All Implemented Interfaces:
                  CallbackHandler
                  Enclosing class:
                  JaasAuthBean

                  public static class JaasAuthBean.UPCallbackHandler
                  extends Object
                  implements CallbackHandler


                  Constructor Summary
                  JaasAuthBean.UPCallbackHandler(String u, String pString)
                             
                   
                  Method Summary
                   void handle(Callback[] callbacks)
                             
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  JaasAuthBean.UPCallbackHandler

                  public JaasAuthBean.UPCallbackHandler(String u,
                                                        String pString)
                  Method Detail

                  handle

                  public void handle(Callback[] callbacks)
                              throws UnsupportedCallbackException
                  Specified by:
                  handle in interface CallbackHandler
                  Throws:
                  UnsupportedCallbackException


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/class-use/0000755000175000017500000000000012007570406023177 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/class-use/AuthFunctionBean.html0000644000175000017500000003424112007570404027264 0ustar renerene Uses of Interface org.hsqldb.auth.AuthFunctionBean (HSQLDB 2.2.9 API)

                  Uses of Interface
                  org.hsqldb.auth.AuthFunctionBean

                  Packages that use AuthFunctionBean
                  org.hsqldb.auth   
                   

                  Uses of AuthFunctionBean in org.hsqldb.auth
                   

                  Classes in org.hsqldb.auth that implement AuthFunctionBean
                   class HsqldbSlaveAuthBean
                            Delegates authentication decisions, and optionally determination of user roles and schema, to a different HyperSQL catalog, which may be in the same JVM or remote.
                   class JaasAuthBean
                            Provides authentication and authorization (roles and initial schema) according to JAAS modules configured by the runtime JAAS implementation.
                   class LdapAuthBean
                            Authenticates to a HyperSQL catalog according to entries in a LDAP database.
                   

                  Methods in org.hsqldb.auth with parameters of type AuthFunctionBean
                   void AuthBeanMultiplexer.setAuthFunctionBean(Connection c, AuthFunctionBean authFunctionBean)
                            Exactly the same as setAuthFunctionBeans(String, List) other than taking an open Connection to identify the database.
                   void AuthBeanMultiplexer.setAuthFunctionBean(String dbName, AuthFunctionBean authFunctionBean)
                            This is not an "adder" function, but a "setter" function for the specified dbName , so do not use this to add to a database's FunctionBeans, but to assign ths single given AuthFunctionBean as the specified database's authenticator.
                   

                  Method parameters in org.hsqldb.auth with type arguments of type AuthFunctionBean
                   void AuthBeanMultiplexer.setAuthFunctionBeans(Connection c, List<AuthFunctionBean> authFunctionBeans)
                            Wrapper for setAuthFunctioNBeans(String, List)
                   void AuthBeanMultiplexer.setAuthFunctionBeans(Map<String,List<AuthFunctionBean>> authFunctionBeanMap)
                            Primary purpose of this class is to manage this static map.
                   void AuthBeanMultiplexer.setAuthFunctionBeans(String dbName, List<AuthFunctionBean> authFunctionBeans)
                            This is not an "adder" function, but a "setter" function for the specified dbName , so do not use this to add to a database's FunctionBeans, but to assign the entire list for that database.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/class-use/LdapAuthBean.html0000644000175000017500000001345312007570404026361 0ustar renerene Uses of Class org.hsqldb.auth.LdapAuthBean (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.auth.LdapAuthBean

                  No usage of org.hsqldb.auth.LdapAuthBean



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/class-use/JaasAuthBean.html0000644000175000017500000001345312007570404026357 0ustar renerene Uses of Class org.hsqldb.auth.JaasAuthBean (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.auth.JaasAuthBean

                  No usage of org.hsqldb.auth.JaasAuthBean



                  Copyright © 2001 - 2010 HSQL Development Group. ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootroothsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/class-use/JaasAuthBean.UPCallbackHandler.htmlhsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/class-use/JaasAuthBean.UPCallbackHandler.htm0000644000175000017500000001373712007570404031446 0ustar renerene Uses of Class org.hsqldb.auth.JaasAuthBean.UPCallbackHandler (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.auth.JaasAuthBean.UPCallbackHandler

                  No usage of org.hsqldb.auth.JaasAuthBean.UPCallbackHandler



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/class-use/HsqldbSlaveAuthBean.html0000644000175000017500000001356112007570404027711 0ustar renerene Uses of Class org.hsqldb.auth.HsqldbSlaveAuthBean (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.auth.HsqldbSlaveAuthBean

                  No usage of org.hsqldb.auth.HsqldbSlaveAuthBean



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/class-use/AuthBeanMultiplexer.html0000644000175000017500000001716312007570404030015 0ustar renerene Uses of Class org.hsqldb.auth.AuthBeanMultiplexer (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.auth.AuthBeanMultiplexer

                  Packages that use AuthBeanMultiplexer
                  org.hsqldb.auth   
                   

                  Uses of AuthBeanMultiplexer in org.hsqldb.auth
                   

                  Methods in org.hsqldb.auth that return AuthBeanMultiplexer
                  static AuthBeanMultiplexer AuthBeanMultiplexer.getSingleton()
                             
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/HsqldbSlaveAuthBean.html0000644000175000017500000004737612007570402026023 0ustar renerene HsqldbSlaveAuthBean (HSQLDB 2.2.9 API)

                  org.hsqldb.auth
                  Class HsqldbSlaveAuthBean

                  java.lang.Object
                    extended by org.hsqldb.auth.HsqldbSlaveAuthBean
                  
                  All Implemented Interfaces:
                  AuthFunctionBean

                  public class HsqldbSlaveAuthBean
                  extends Object
                  implements AuthFunctionBean

                  Delegates authentication decisions, and optionally determination of user roles and schema, to a different HyperSQL catalog, which may be in the same JVM or remote. For now, at least, this class uses DriverManager to make the ephemeral database connections.

                  Since:
                  2.0.1
                  Author:
                  Blaine Simpson (blaine dot simpson at admc dot com)
                  See Also:
                  AuthFunctionBean

                  Constructor Summary
                  HsqldbSlaveAuthBean()
                             
                   
                  Method Summary
                   String[] authenticate(String userName, String password)
                            Return a list of authorized roles or null to indicate that the implementation does not intend to produce a specific role list but only to indicate whether to allow access or not.
                   void init()
                             
                   void setDelegateRolesSchema(boolean doDelegateRolesSchema)
                            Defaults to true.
                   void setMasterJdbcUrl(String masterJdbcUrl)
                             
                   void setValidationPassword(String validationPassword)
                            Use this method and setValidationUser if you want access to the master database to be verified upon instance initialization.
                   void setValidationUser(String validationUser)
                            Use this method and setValidationPassword if you want access to the master database to be verified upon instance initialization.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  HsqldbSlaveAuthBean

                  public HsqldbSlaveAuthBean()
                  Method Detail

                  setValidationUser

                  public void setValidationUser(String validationUser)
                  Use this method and setValidationPassword if you want access to the master database to be verified upon instance initialization.


                  setValidationPassword

                  public void setValidationPassword(String validationPassword)
                  Use this method and setValidationUser if you want access to the master database to be verified upon instance initialization.


                  setMasterJdbcUrl

                  public void setMasterJdbcUrl(String masterJdbcUrl)

                  setDelegateRolesSchema

                  public void setDelegateRolesSchema(boolean doDelegateRolesSchema)
                  Defaults to true. Whether roles and initial schema for the new session will be determined by what they are for this user in the master database.


                  init

                  public void init()
                            throws SQLException
                  Throws:
                  IllegalStateException - if any required setting has not been set.
                  SQLException - if properties 'validationUser' and 'validationPassword' have been set, but we fail to connect to the master database.

                  authenticate

                  public String[] authenticate(String userName,
                                               String password)
                                        throws org.hsqldb.auth.DenyException
                  Description copied from interface: AuthFunctionBean
                  Return a list of authorized roles or null to indicate that the implementation does not intend to produce a specific role list but only to indicate whether to allow access or not. A return value of String[0] is different from returning null, and means that the user should not be granted any roles.

                  Specified by:
                  authenticate in interface AuthFunctionBean
                  Returns:
                  null or String[] according to the contract of HyperSQL authentication function contract, except that the role/schema list is returned as a String[] instead of a java.sql.Array.
                  Throws:
                  org.hsqldb.auth.DenyException
                  See Also:
                  AuthFunctionBean.authenticate(String, String)


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/package-summary.html0000644000175000017500000001744612007570404025266 0ustar renerene org.hsqldb.auth (HSQLDB 2.2.9 API)

                  Package org.hsqldb.auth

                  Interface Summary
                  AuthFunctionBean N.b.
                   

                  Class Summary
                  AuthBeanMultiplexer This class provides a method which can be used directly as a HyperSQL static Java function method.
                  HsqldbSlaveAuthBean Delegates authentication decisions, and optionally determination of user roles and schema, to a different HyperSQL catalog, which may be in the same JVM or remote.
                  JaasAuthBean Provides authentication and authorization (roles and initial schema) according to JAAS modules configured by the runtime JAAS implementation.
                  JaasAuthBean.UPCallbackHandler  
                  LdapAuthBean Authenticates to a HyperSQL catalog according to entries in a LDAP database.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/package-tree.html0000644000175000017500000001704312007570404024521 0ustar renerene org.hsqldb.auth Class Hierarchy (HSQLDB 2.2.9 API)

                  Hierarchy For Package org.hsqldb.auth

                  Package Hierarchies:
                  All Packages

                  Class Hierarchy

                  Interface Hierarchy



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/auth/AuthBeanMultiplexer.html0000644000175000017500000006400612007570402026112 0ustar renerene AuthBeanMultiplexer (HSQLDB 2.2.9 API)

                  org.hsqldb.auth
                  Class AuthBeanMultiplexer

                  java.lang.Object
                    extended by org.hsqldb.auth.AuthBeanMultiplexer
                  

                  public class AuthBeanMultiplexer
                  extends Object

                  This class provides a method which can be used directly as a HyperSQL static Java function method. Manages a set of AuthFunctionBean implementations

                  Since:
                  2.0.1
                  Author:
                  Blaine Simpson (blaine dot simpson at admc dot com)

                  Method Summary
                  static Array authenticate(String database, String user, String password)
                            HyperSQL Java Function Method.
                   void clear()
                            Clear the set of AuthFunctionBeans
                  static AuthBeanMultiplexer getSingleton()
                             
                   void setAuthFunctionBean(Connection c, AuthFunctionBean authFunctionBean)
                            Exactly the same as setAuthFunctionBeans(String, List) other than taking an open Connection to identify the database.
                   void setAuthFunctionBean(String dbName, AuthFunctionBean authFunctionBean)
                            This is not an "adder" function, but a "setter" function for the specified dbName , so do not use this to add to a database's FunctionBeans, but to assign ths single given AuthFunctionBean as the specified database's authenticator.
                   void setAuthFunctionBeans(Connection c, List<AuthFunctionBean> authFunctionBeans)
                            Wrapper for setAuthFunctioNBeans(String, List)
                   void setAuthFunctionBeans(Map<String,List<AuthFunctionBean>> authFunctionBeanMap)
                            Primary purpose of this class is to manage this static map.
                   void setAuthFunctionBeans(String dbName, List<AuthFunctionBean> authFunctionBeans)
                            This is not an "adder" function, but a "setter" function for the specified dbName , so do not use this to add to a database's FunctionBeans, but to assign the entire list for that database.
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Method Detail

                  getSingleton

                  public static AuthBeanMultiplexer getSingleton()

                  clear

                  public void clear()
                  Clear the set of AuthFunctionBeans


                  setAuthFunctionBeans

                  public void setAuthFunctionBeans(Map<String,List<AuthFunctionBean>> authFunctionBeanMap)
                  Primary purpose of this class is to manage this static map. From dbNames to ordered-lists-of-AuthFunctionBeans. This is not an "adder" function, but a "setter" function, so do not use this to add to a partial set, but to assign the entire set.

                  The given entries are copied, to limit side-effects and concurrency issues.


                  setAuthFunctionBeans

                  public void setAuthFunctionBeans(Connection c,
                                                   List<AuthFunctionBean> authFunctionBeans)
                                            throws SQLException
                  Wrapper for setAuthFunctioNBeans(String, List)

                  Parameters:
                  c - An open Connection to the desired database.
                  Throws:
                  SQLException - if failed to obtain unique name from given Connection.

                  setAuthFunctionBeans

                  public void setAuthFunctionBeans(String dbName,
                                                   List<AuthFunctionBean> authFunctionBeans)
                  This is not an "adder" function, but a "setter" function for the specified dbName , so do not use this to add to a database's FunctionBeans, but to assign the entire list for that database.

                  The given entries are copied, to limit side-effects and concurrency issues.

                  Use this method instead of setAuthFunctionBean(String, AuthFunctionBean) in order to set up multiple authenticators for a single database for redundancy purposes.

                  See Also:
                  setAuthFunctionBeans(Map), setAuthFunctionBean(String, AuthFunctionBean)

                  setAuthFunctionBean

                  public void setAuthFunctionBean(Connection c,
                                                  AuthFunctionBean authFunctionBean)
                                           throws SQLException
                  Exactly the same as setAuthFunctionBeans(String, List) other than taking an open Connection to identify the database.

                  Throws:
                  SQLException

                  setAuthFunctionBean

                  public void setAuthFunctionBean(String dbName,
                                                  AuthFunctionBean authFunctionBean)
                  This is not an "adder" function, but a "setter" function for the specified dbName , so do not use this to add to a database's FunctionBeans, but to assign ths single given AuthFunctionBean as the specified database's authenticator.

                  To set up multiple authenticators for a single database for redundancy purposes, use the method setAuthFunctionBeans(String, List) instead.

                  See Also:
                  setAuthFunctionBeans(String, List)

                  authenticate

                  public static Array authenticate(String database,
                                                   String user,
                                                   String password)
                                            throws Exception
                  HyperSQL Java Function Method.

                  Registered AuthFunctionBeans matching the specified database and password will be tried in order.

                  1. If the AuthFunctionBean being tried throws a non-runtime Exception, then that RuntimeException is passed through (re-thrown), resulting in a SQLException for the authenticating application.
                  2. If the AuthFunctionBean being tried doesn't throw anything, then the return value is passed through (returned) and HyperSQL will allow access and set roles according to HyperSQL's authentication function contract.
                  3. If the AuthFunctionBean being tried throws a RuntimeException, then the next AuthFunctionBean in turn will be tried. If all matching AuthFunctionBeans throw RuntimeExceptions, then the first RuntimeException that was thrown will be passed through (re-thrown), resulting in a SQLException for the authenticating application.
                  4. If there are no AuthFunctionBeans registered for the specified dbName, then this method will throw an IllegalArgumentException, resulting in a SQLException for the authenticating application.

                  Returns:
                  Null or java.sql.Array to indicate successful authentication according to the contract for HyperSQL authentication functions.
                  Throws:
                  IllegalArgumentException - if no AuthFunctionBean has been set for specified dbName.
                  RuntimeException - if all matching AuthFunctionBeans threw RuntimeExceptions. (This indicates that no matching AuthFunctionBean functioned properly, not that authentication was purposefully denied by any AuthFunctionBean).
                  Exception - (non-runtime). A matching AuthFunctionBean threw this Exception.
                  See Also:
                  User Guide, System Management chapter, Authentication Settings subsection.


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/cmdline/0000755000175000017500000000000012007570406021752 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/cmdline/SqlTool.html0000644000175000017500000005561212007570402024242 0ustar renerene SqlTool (HSQLDB 2.2.9 API)

                  org.hsqldb.cmdline
                  Class SqlTool

                  java.lang.Object
                    extended by org.hsqldb.cmdline.SqlTool
                  

                  public class SqlTool
                  extends Object

                  A command-line JDBC SQL tool supporting both interactive and non-interactive usage.

                  See JavaDocs for the main method for syntax of how to run from the command-line.

                  Programmatic users will usually want to use the objectMain(String[]) method if they want arguments and behavior exactly like command-line SqlTool. But in many cases, you will have better control and efficiency by using the SqlFile class directly. The file src/org/hsqldb/sample/SqlFileEmbedder.java in the HSQLDB distribution provides an example for this latter strategy.

                  Author:
                  Blaine Simpson (blaine dot simpson at admc dot com)
                  See Also:
                  The SqlTool chapter of the HyperSQL Utilities Guide, main(String[]), objectMain(String[]), SqlFile, SqlFileEmbedder

                  Nested Class Summary
                  static class SqlTool.SqlToolException
                             
                   
                  Field Summary
                  static int CONNECTERR_EXITVAL
                             
                  static String DEFAULT_RCFILE
                             
                  static int FILEERR_EXITVAL
                             
                  static int INPUTERR_EXITVAL
                             
                  static int IOERR_EXITVAL
                             
                  static String LS
                            Platform-specific line separator
                  static int RCERR_EXITVAL
                             
                  static int SQLERR_EXITVAL
                             
                  static int SQLTOOLERR_EXITVAL
                             
                  static int SYNTAXERR_EXITVAL
                             
                   
                  Constructor Summary
                  SqlTool()
                             
                   
                  Method Summary
                  static void main(String[] args)
                            A static wrapper for objectMain, so that that method may be executed as a Java "program".
                  static void objectMain(String[] arg)
                            Connect to a JDBC Database and execute the commands given on stdin or in SQL file(s).
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Field Detail

                  DEFAULT_RCFILE

                  public static final String DEFAULT_RCFILE

                  SQLTOOLERR_EXITVAL

                  public static final int SQLTOOLERR_EXITVAL
                  See Also:
                  Constant Field Values

                  SYNTAXERR_EXITVAL

                  public static final int SYNTAXERR_EXITVAL
                  See Also:
                  Constant Field Values

                  RCERR_EXITVAL

                  public static final int RCERR_EXITVAL
                  See Also:
                  Constant Field Values

                  SQLERR_EXITVAL

                  public static final int SQLERR_EXITVAL
                  See Also:
                  Constant Field Values

                  IOERR_EXITVAL

                  public static final int IOERR_EXITVAL
                  See Also:
                  Constant Field Values

                  FILEERR_EXITVAL

                  public static final int FILEERR_EXITVAL
                  See Also:
                  Constant Field Values

                  INPUTERR_EXITVAL

                  public static final int INPUTERR_EXITVAL
                  See Also:
                  Constant Field Values

                  CONNECTERR_EXITVAL

                  public static final int CONNECTERR_EXITVAL
                  See Also:
                  Constant Field Values

                  LS

                  public static String LS
                  Platform-specific line separator

                  Constructor Detail

                  SqlTool

                  public SqlTool()
                  Method Detail

                  main

                  public static void main(String[] args)
                  A static wrapper for objectMain, so that that method may be executed as a Java "program".

                  Throws only RuntimeExceptions or Errors, because this method is intended to System.exit() for all but disastrous system problems, for which the inconvenience of a stack trace would be the least of your worries.

                  If you don't want SqlTool to System.exit(), then use the method objectMain() instead of this method.

                  See Also:
                  objectMain(String[])

                  objectMain

                  public static void objectMain(String[] arg)
                                         throws SqlTool.SqlToolException
                  Connect to a JDBC Database and execute the commands given on stdin or in SQL file(s).

                  This method is changed for HSQLDB 1.8.0.8 and later to never System.exit(). Developers may catch Throwables to handle all fatal situations.

                  Parameters:
                  arg - Run "java... org.hsqldb.cmdline.SqlTool --help" for syntax.
                  Throws:
                  SqlTool.SqlToolException - Upon any fatal error, with useful reason as the exception's message.


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/cmdline/package-frame.html0000644000175000017500000000247712007570404025333 0ustar renerene org.hsqldb.cmdline (HSQLDB 2.2.9 API) org.hsqldb.cmdline
                  Classes 
                  SqlFile
                  SqlTool
                  Exceptions 
                  SqlTool.SqlToolException
                  hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/cmdline/SqlFile.html0000644000175000017500000015220212007570402024175 0ustar renerene SqlFile (HSQLDB 2.2.9 API)

                  org.hsqldb.cmdline
                  Class SqlFile

                  java.lang.Object
                    extended by org.hsqldb.cmdline.SqlFile
                  

                  public class SqlFile
                  extends Object

                  Encapsulation of SQL text and the environment under which it will executed with a JDBC Connection. 'SqlInputStream' would be a more precise name, but the content we are talking about here is what is colloqially known as the contents of "SQL file"s.

                  The file src/org/hsqldb/sample/SqlFileEmbedder.java in the HSQLDB distribution provides an example for using SqlFile to execute SQL files directly from your own Java classes.

                  The complexities of passing userVars and macros maps are to facilitate strong scoping (among blocks and nested scripts).

                  Some implementation comments and variable names use keywords based on the following definitions.

                  • COMMAND = Statement || SpecialCommand || BufferCommand
                  • Statement = SQL statement like "SQL Statement;"
                  • SpecialCommand = Special Command like "\x arg..."
                  • BufferCommand = Editing/buffer command like ":s/this/that/"

                  When entering SQL statements, you are always "appending" to the "immediate" command (not the "buffer", which is a different thing). All you can do to the immediate command is append new lines to it, execute it, or save it to buffer. When you are entering a buffer edit command like ":s/this/that/", your immediate command is the buffer-edit-command. The buffer is the command string that you are editing. The buffer usually contains either an exact copy of the last command executed or sent to buffer by entering a blank line, but BUFFER commands can change the contents of the buffer.

                  In general, the special commands mirror those of Postgresql's psql, but SqlFile handles command editing very differently than Postgresql does, in part because of Java's lack of support for raw tty I/O. The \p special command, in particular, is very different from psql's.

                  Buffer commands are unique to SQLFile. The ":" commands allow you to edit the buffer and to execute the buffer.

                  \d commands are very poorly supported for Mysql because (a) Mysql lacks most of the most basic JDBC support elements, and the most basic role and schema features, and (b) to access the Mysql data dictionary, one must change the database instance (to do that would require work to restore the original state and could have disastrous effects upon transactions).

                  The process*() methods, other than processBuffHist() ALWAYS execute on "buffer", and expect it to contain the method specific prefix (if any).

                  The input/output Reader/Stream are generally managed by the caller. An exception is that the input reader may be closed automatically or on demand by the user, since in some cases this class builds the Reader. There is no corresponding functionality for output since the user always has control over that object (which may be null or System.out).

                  Author:
                  Blaine Simpson (blaine dot simpson at admc dot com)
                  See Also:
                  The SqlTool chapter of the HyperSQL Utilities Guide, SqlFileEmbedder

                  Field Summary
                  static String LS
                            Platform-specific line separator
                   
                  Constructor Summary
                  SqlFile(File inputFile)
                            Convenience wrapper for the SqlFile(File, String) constructor
                  SqlFile(File inputFile, String encoding)
                            Convenience wrapper for the SqlFile(File, String, boolean) constructor
                  SqlFile(File inputFile, String encoding, boolean interactive)
                            Constructor for non-interactive usage with a SQL file, using the specified encoding and sending normal output to stdout.
                  SqlFile(Reader reader, String inputStreamLabel, PrintStream psStd, String encoding, boolean interactive, File baseDir)
                            Instantiate a SqlFile instance for SQL input from 'reader'.
                  SqlFile(String encoding, boolean interactive)
                            Constructor for interactive usage with stdin/stdout
                   
                  Method Summary
                   void addMacros(Map<String,org.hsqldb.cmdline.sqltool.Token> newMacros)
                             
                   void addUserVars(Map<String,String> newUserVars)
                             
                  static byte[] bitCharsToBytes(String hexChars)
                            Just a stub for now.
                  static boolean canDisplayType(int i)
                            This method is used to tell SqlFile whether this Sql Type must ALWAYS be loaded to the binary buffer without displaying.
                   void closeReader()
                            Close the reader.
                  static String convertEscapes(String inString)
                            Translates user-supplied escapes into the traditionaly corresponding corresponding binary characters.
                   void dsvSafe(String s)
                            Validate that String is safe to write TO DSV file.
                  static String escapeHtml(String s)
                            Escaping rules taken from 'Reserved Characters in HTML table at http://www.w3schools.com/tags/ref_entities.asp
                   void execute()
                            Process all the commands from the file or Reader associated with "this" object.
                  static String getBanner(Connection c)
                            Returns a String report for the specified JDBC Connection.
                   Connection getConnection()
                             
                   String getCurrentSchema()
                             
                   Map<String,org.hsqldb.cmdline.sqltool.Token> getMacros()
                             
                   Map<String,String> getUserVars()
                            Get a reference to the user variable map.
                  static byte[] hexCharOctetsToBytes(String hexChars)
                            Convert a String to a byte array by interpreting every 2 characters as an octal byte value.
                   void importDsv(String filePath, String skipPrefix)
                            Name is self-explanatory.
                  static byte[] loadBinary(File binFile)
                            Binary file load
                   void setAutoClose(boolean autoClose)
                            Specify whether the supplied or generated input Reader should automatically be closed by the execute() method.
                   void setConnection(Connection jdbcConn)
                             
                   void setContinueOnError(boolean continueOnError)
                             
                   void setMaxHistoryLength(int maxHistoryLength)
                             
                  static String sqlTypeToString(int i)
                            Return a String representation of the specified java.sql.Types type.
                  static byte[] streamToBytes(InputStream is)
                            As the name says...
                   String streamToString(InputStream isIn, String cs)
                            As the name says...
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Field Detail

                  LS

                  public static String LS
                  Platform-specific line separator

                  Constructor Detail

                  SqlFile

                  public SqlFile(File inputFile)
                          throws IOException
                  Convenience wrapper for the SqlFile(File, String) constructor

                  Throws:
                  IOException
                  See Also:
                  SqlFile(File, String)

                  SqlFile

                  public SqlFile(File inputFile,
                                 String encoding)
                          throws IOException
                  Convenience wrapper for the SqlFile(File, String, boolean) constructor

                  Parameters:
                  encoding - is applied to both the given File and other files read in or written out. Null will use your env+JVM settings.
                  Throws:
                  IOException
                  See Also:
                  SqlFile(File, String, boolean)

                  SqlFile

                  public SqlFile(File inputFile,
                                 String encoding,
                                 boolean interactive)
                          throws IOException
                  Constructor for non-interactive usage with a SQL file, using the specified encoding and sending normal output to stdout.

                  Parameters:
                  encoding - is applied to the given File and other files read in or written out. Null will use your env+JVM settings.
                  interactive - If true, prompts are printed, the interactive Special commands are enabled, and continueOnError defaults to true.
                  Throws:
                  IOException
                  See Also:
                  SqlFile(Reader, String, PrintStream, String, boolean, File)

                  SqlFile

                  public SqlFile(String encoding,
                                 boolean interactive)
                          throws IOException
                  Constructor for interactive usage with stdin/stdout

                  Parameters:
                  encoding - is applied to other files read in or written out (but not to stdin or stdout). Null will use your env+JVM settings.
                  interactive - If true, prompts are printed, the interactive Special commands are enabled, and continueOnError defaults to true.
                  Throws:
                  IOException
                  See Also:
                  SqlFile(Reader, String, PrintStream, String, boolean, File)

                  SqlFile

                  public SqlFile(Reader reader,
                                 String inputStreamLabel,
                                 PrintStream psStd,
                                 String encoding,
                                 boolean interactive,
                                 File baseDir)
                          throws IOException
                  Instantiate a SqlFile instance for SQL input from 'reader'. After any needed customization, the SQL can be executed by the execute method.

                  Most Special Commands and many Buffer commands are only for interactive use.

                  This program never writes to an error stream (stderr or alternative). All meta messages and error messages are written using the logging facility.

                  Parameters:
                  reader - Source for the SQL to be executed. Caller is responsible for setting up encoding. (the 'encoding' parameter will NOT be applied to this reader).
                  psStd - PrintStream for normal output. If null, normal output will be discarded. Caller is responsible for settingup encoding (the 'encoding' parameter will NOT be applied to this stream).
                  interactive - If true, prompts are printed, the interactive Special commands are enabled, and continueOnError defaults to true.
                  Throws:
                  IOException
                  See Also:
                  execute()
                  Method Detail

                  setConnection

                  public void setConnection(Connection jdbcConn)

                  getConnection

                  public Connection getConnection()

                  setContinueOnError

                  public void setContinueOnError(boolean continueOnError)

                  setMaxHistoryLength

                  public void setMaxHistoryLength(int maxHistoryLength)

                  addMacros

                  public void addMacros(Map<String,org.hsqldb.cmdline.sqltool.Token> newMacros)

                  addUserVars

                  public void addUserVars(Map<String,String> newUserVars)

                  getUserVars

                  public Map<String,String> getUserVars()
                  Get a reference to the user variable map. Since you are getting a reference to the private map used inside this class, update this map with great caution and attention to lifecycle handling of the variable map.


                  getMacros

                  public Map<String,org.hsqldb.cmdline.sqltool.Token> getMacros()

                  setAutoClose

                  public void setAutoClose(boolean autoClose)
                  Specify whether the supplied or generated input Reader should automatically be closed by the execute() method.

                  execute() will close the Reader by default (i.e. 'autoClose' defaults to true). You may want to set this to false if you want to stop execution with \q or similar, then continue using the Reader or underlying Stream.

                  The caller is always responsible for closing the output object (if any) used by SqlFile.


                  execute

                  public void execute()
                               throws org.hsqldb.cmdline.SqlToolError,
                                      SQLException
                  Process all the commands from the file or Reader associated with "this" object. SQL commands in the content get executed against the current JDBC data source connection.

                  Throws:
                  SQLExceptions - thrown by JDBC driver. Only possible if in "\c false" mode.
                  org.hsqldb.cmdline.SqlToolError - all other errors. This includes including QuitNow, BreakException, ContinueException for recursive calls only.
                  SQLException

                  closeReader

                  public void closeReader()
                  Close the reader. The execute method will run this automatically, by default.


                  getCurrentSchema

                  public String getCurrentSchema()
                                          throws org.hsqldb.cmdline.SqlFile.BadSpecial,
                                                 org.hsqldb.cmdline.SqlToolError
                  Throws:
                  org.hsqldb.cmdline.SqlFile.BadSpecial
                  org.hsqldb.cmdline.SqlToolError

                  streamToString

                  public String streamToString(InputStream isIn,
                                               String cs)
                                        throws IOException
                  As the name says... This method always closes the input stream.

                  Throws:
                  IOException

                  streamToBytes

                  public static byte[] streamToBytes(InputStream is)
                                              throws IOException
                  As the name says...

                  Throws:
                  IOException

                  loadBinary

                  public static byte[] loadBinary(File binFile)
                                           throws IOException
                  Binary file load

                  Returns:
                  The bytes which are the content of the fil
                  Throws:
                  IOException

                  canDisplayType

                  public static boolean canDisplayType(int i)
                  This method is used to tell SqlFile whether this Sql Type must ALWAYS be loaded to the binary buffer without displaying.

                  N.b.: If this returns "true" for a type, then the user can never "see" values for these columns. Therefore, if a type may-or-may-not-be displayable, better to return false here and let the user choose. In general, if there is a toString() operator for this Sql Type then return false, since the JDBC driver should know how to make the value displayable.

                  See Also:
                  http://java.sun.com/docs/books/tutorial/jdbc/basics/retrieving.html The table on this page lists the most common SqlTypes, all of which must implement toString(), Types

                  sqlTypeToString

                  public static String sqlTypeToString(int i)
                  Return a String representation of the specified java.sql.Types type.


                  dsvSafe

                  public void dsvSafe(String s)
                               throws org.hsqldb.cmdline.SqlToolError
                  Validate that String is safe to write TO DSV file.

                  Throws:
                  org.hsqldb.cmdline.SqlToolError - if validation fails.

                  convertEscapes

                  public static String convertEscapes(String inString)
                  Translates user-supplied escapes into the traditionaly corresponding corresponding binary characters. Allowed sequences:
                  • \0\d+ (an octal digit)
                  • \[0-9]\d* (a decimal digit)
                  • \[Xx][0-9]{2} (a hex digit)
                  • \n Newline (Ctrl-J)
                  • \r Carriage return (Ctrl-M)
                  • \t Horizontal tab (Ctrl-I)
                  • \f Form feed (Ctrl-L)
                  Java 1.4 String methods will make this into a 1 or 2 line task.


                  importDsv

                  public void importDsv(String filePath,
                                        String skipPrefix)
                                 throws org.hsqldb.cmdline.SqlToolError
                  Name is self-explanatory.

                  Throws:
                  org.hsqldb.cmdline.SqlToolError - Would prefer to throw an internal exception, but we want this method to have external visibility.

                  hexCharOctetsToBytes

                  public static byte[] hexCharOctetsToBytes(String hexChars)
                  Convert a String to a byte array by interpreting every 2 characters as an octal byte value.


                  bitCharsToBytes

                  public static byte[] bitCharsToBytes(String hexChars)
                  Just a stub for now.


                  getBanner

                  public static String getBanner(Connection c)
                  Returns a String report for the specified JDBC Connection. For databases with poor JDBC support, you won't get much detail.


                  escapeHtml

                  public static String escapeHtml(String s)
                  Escaping rules taken from 'Reserved Characters in HTML table at http://www.w3schools.com/tags/ref_entities.asp



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/cmdline/package-use.html0000644000175000017500000001745512007570404025037 0ustar renerene Uses of Package org.hsqldb.cmdline (HSQLDB 2.2.9 API)

                  Uses of Package
                  org.hsqldb.cmdline

                  Packages that use org.hsqldb.cmdline
                  org.hsqldb.cmdline Contains command-line utilities. 
                  org.hsqldb.sample Contains examples for hooking into HyperSQL from your own Java code. 
                   

                  Classes in org.hsqldb.cmdline used by org.hsqldb.cmdline
                  SqlTool.SqlToolException
                             
                  SqlToolError
                            Exceptions thrown by the SqlTool system externally to SqlFile.
                   

                  Classes in org.hsqldb.cmdline used by org.hsqldb.sample
                  SqlToolError
                            Exceptions thrown by the SqlTool system externally to SqlFile.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/cmdline/class-use/0000755000175000017500000000000012007570406023651 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/cmdline/class-use/SqlTool.html0000644000175000017500000001342712007570404026141 0ustar renerene Uses of Class org.hsqldb.cmdline.SqlTool (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.cmdline.SqlTool

                  No usage of org.hsqldb.cmdline.SqlTool



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/cmdline/class-use/SqlFile.html0000644000175000017500000001342712007570404026103 0ustar renerene Uses of Class org.hsqldb.cmdline.SqlFile (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.cmdline.SqlFile

                  No usage of org.hsqldb.cmdline.SqlFile



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/cmdline/class-use/SqlTool.SqlToolException.html0000644000175000017500000001761212007570404031414 0ustar renerene Uses of Class org.hsqldb.cmdline.SqlTool.SqlToolException (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.cmdline.SqlTool.SqlToolException

                  Packages that use SqlTool.SqlToolException
                  org.hsqldb.cmdline Contains command-line utilities. 
                   

                  Uses of SqlTool.SqlToolException in org.hsqldb.cmdline
                   

                  Methods in org.hsqldb.cmdline that throw SqlTool.SqlToolException
                  static void SqlTool.objectMain(String[] arg)
                            Connect to a JDBC Database and execute the commands given on stdin or in SQL file(s).
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/cmdline/SqlTool.SqlToolException.html0000644000175000017500000003100512007570402027503 0ustar renerene SqlTool.SqlToolException (HSQLDB 2.2.9 API)

                  org.hsqldb.cmdline
                  Class SqlTool.SqlToolException

                  java.lang.Object
                    extended by java.lang.Throwable
                        extended by java.lang.Exception
                            extended by org.hsqldb.cmdline.SqlTool.SqlToolException
                  
                  All Implemented Interfaces:
                  Serializable
                  Enclosing class:
                  SqlTool

                  public static class SqlTool.SqlToolException
                  extends Exception

                  See Also:
                  Serialized Form

                  Method Summary
                   
                  Methods inherited from class java.lang.Throwable
                  fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/cmdline/package-summary.html0000644000175000017500000001652412007570404025734 0ustar renerene org.hsqldb.cmdline (HSQLDB 2.2.9 API)

                  Package org.hsqldb.cmdline

                  Contains command-line utilities.

                  See:
                            Description

                  Class Summary
                  SqlFile Encapsulation of SQL text and the environment under which it will executed with a JDBC Connection.
                  SqlTool A command-line JDBC SQL tool supporting both interactive and non-interactive usage.
                   

                  Exception Summary
                  SqlTool.SqlToolException  
                   

                  Package org.hsqldb.cmdline Description

                  Contains command-line utilities. See the SqlTool chapter of the HyperSQL Utilities Guide



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/cmdline/package-tree.html0000644000175000017500000001570212007570404025173 0ustar renerene org.hsqldb.cmdline Class Hierarchy (HSQLDB 2.2.9 API)

                  Hierarchy For Package org.hsqldb.cmdline

                  Package Hierarchies:
                  All Packages

                  Class Hierarchy



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/Trigger.html0000644000175000017500000004050312007570402022626 0ustar renerene Trigger (HSQLDB 2.2.9 API)

                  org.hsqldb
                  Interface Trigger

                  All Known Implementing Classes:
                  TriggerSample

                  public interface Trigger

                  The interface an HSQLDB TRIGGER must implement. The user-supplied class that implements this must have a default constructor.

                  Since:
                  1.7.0
                  Author:
                  Peter Hudson (peterhudson@users dot sourceforge.net)

                  Field Summary
                  static int DELETE_AFTER
                             
                  static int DELETE_AFTER_ROW
                             
                  static int DELETE_BEFORE_ROW
                             
                  static int INSERT_AFTER
                             
                  static int INSERT_AFTER_ROW
                             
                  static int INSERT_BEFORE_ROW
                             
                  static int UPDATE_AFTER
                             
                  static int UPDATE_AFTER_ROW
                             
                  static int UPDATE_BEFORE_ROW
                             
                   
                  Method Summary
                   void fire(int type, String trigName, String tabName, Object[] oldRow, Object[] newRow)
                            The method invoked upon each triggered action.
                   

                  Field Detail

                  INSERT_AFTER

                  static final int INSERT_AFTER
                  See Also:
                  Constant Field Values

                  DELETE_AFTER

                  static final int DELETE_AFTER
                  See Also:
                  Constant Field Values

                  UPDATE_AFTER

                  static final int UPDATE_AFTER
                  See Also:
                  Constant Field Values

                  INSERT_AFTER_ROW

                  static final int INSERT_AFTER_ROW
                  See Also:
                  Constant Field Values

                  DELETE_AFTER_ROW

                  static final int DELETE_AFTER_ROW
                  See Also:
                  Constant Field Values

                  UPDATE_AFTER_ROW

                  static final int UPDATE_AFTER_ROW
                  See Also:
                  Constant Field Values

                  INSERT_BEFORE_ROW

                  static final int INSERT_BEFORE_ROW
                  See Also:
                  Constant Field Values

                  DELETE_BEFORE_ROW

                  static final int DELETE_BEFORE_ROW
                  See Also:
                  Constant Field Values

                  UPDATE_BEFORE_ROW

                  static final int UPDATE_BEFORE_ROW
                  See Also:
                  Constant Field Values
                  Method Detail

                  fire

                  void fire(int type,
                            String trigName,
                            String tabName,
                            Object[] oldRow,
                            Object[] newRow)
                            throws org.hsqldb.HsqlException
                  The method invoked upon each triggered action.

                  type contains the integer index id for trigger type, e.g. TriggerDef.INSERT_AFTER

                  For all triggers defined as default FOR EACH STATEMENT both oldRow and newRow are null.

                  For triggers defined as FOR EACH ROW, the following will apply:

                  When UPDATE triggers are fired, oldRow contains the existing values of the table row and newRow contains the new values.

                  For INSERT triggers, oldRow is null and newRow contains the table row to be inserted. For DELETE triggers, newRow is null and oldRow contains the table row to be deleted.

                  For error conditions, users can construct an HsqlException using one of the static methods of org.hsqldb.error.Error with a predefined SQL State from org.hsqldb.error.ErrorCode.

                  Parameters:
                  type - the type as one of the int values defined in the interface
                  trigName - the name of the trigger
                  tabName - the name of the table upon which the triggered action is occuring
                  oldRow - the old row
                  newRow - the new row
                  Throws:
                  org.hsqldb.HsqlException


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/class-use/0000755000175000017500000000000012007570406022236 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/class-use/Trigger.html0000644000175000017500000001647012007570404024535 0ustar renerene Uses of Interface org.hsqldb.Trigger (HSQLDB 2.2.9 API)

                  Uses of Interface
                  org.hsqldb.Trigger

                  Packages that use Trigger
                  org.hsqldb.sample Contains examples for hooking into HyperSQL from your own Java code. 
                   

                  Uses of Trigger in org.hsqldb.sample
                   

                  Classes in org.hsqldb.sample that implement Trigger
                   class TriggerSample
                            Sample code for use of triggers in hsqldb.
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/package-summary.html0000644000175000017500000001453012007570404024314 0ustar renerene org.hsqldb (HSQLDB 2.2.9 API)

                  Package org.hsqldb

                  Contains basic HyperSQL engine classes.

                  See:
                            Description

                  Interface Summary
                  Trigger The interface an HSQLDB TRIGGER must implement.
                   

                  Package org.hsqldb Description

                  Contains basic HyperSQL engine classes. See the HyperSQL User Guide for details about HyperSQL database



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/package-tree.html0000644000175000017500000001323612007570404023560 0ustar renerene org.hsqldb Class Hierarchy (HSQLDB 2.2.9 API)

                  Hierarchy For Package org.hsqldb

                  Package Hierarchies:
                  All Packages

                  Interface Hierarchy



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/sample/0000755000175000017500000000000012007570406021620 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/sample/TriggerSample.html0000644000175000017500000006524112007570402025257 0ustar renerene TriggerSample (HSQLDB 2.2.9 API)

                  org.hsqldb.sample
                  Class TriggerSample

                  java.lang.Object
                    extended by org.hsqldb.sample.TriggerSample
                  
                  All Implemented Interfaces:
                  Trigger

                  public class TriggerSample
                  extends Object
                  implements Trigger

                  Sample code for use of triggers in hsqldb. This class org.hsqldb.sample package, but a typical implementation is in users's class hierarchy. SQL to invoke is:

                  CREATE TRIGGER triggerSample BEFORE|AFTER INSERT|UPDATE|DELETE ON myTable [FOR EACH ROW] [QUEUE n] [NOWAIT] CALL "myPackage.trigClass"
                  This will create a thread that will wait for its firing event to occur; when this happens, the trigger's thread runs the 'trigClass.fire' Note that this is still in the same Java Virtual Machine as the database, so make sure the fired method does not hang.

                  There is a queue of events waiting to be run by each trigger thread. This is particularly useful for 'FOR EACH ROW' triggers, when a large number of trigger events occur in rapid succession, without the trigger thread getting a chance to run. If the queue becomes full, subsequent additions to it cause the database engine to suspend awaiting space in the queue. Take great care to avoid this situation if the trigger action involves accessing the database, as deadlock will occur. This can be avoided either by ensuring the QUEUE parameter makes a large enough queue, or by using the NOWAIT parameter, which causes a new trigger event to overwrite the most recent event in the queue. The default queue size is 1024.

                  Ensure that "myPackage.trigClass" is present in the classpath which you use to start hsql.

                  If the method wants to access the database, it must establish a JDBC connection.

                  When the 'fire' method is called, it is passed the following arguments:

                  fire (int type, String trigName, String tabName, Object oldRow[], Object[] newRow)

                  where 'type' is one of the values enumerated in the Trigger interface and the 'oldRow'/'newRow' pair represents the rows acted on. The first length - 1 array slots contain column values and the final slot contains either null or the value of the internally assigned row identity, if the concerned table has no primary key. The final slot must _never_ be modified.

                  The mapping of row classes to database types is specified in /doc/hsqlSyntax.html#Datatypes.

                  To be done:

                  1. Implement the "jdbc:default:connection: URL to provide transparent and portable access to internal connections for use in triggers and stored procedures.

                  2. Implement declaritive column to trigger method argument mapping, conditional execution (WHEN clause), etc.

                  3. Investigate and refine synchronous and asynchronous trigger models.

                    Because certain combinations of trigger create parameters cause the individual triggered actions of a multirow update to run in different threads, it is possible for an 'after' trigger to run before its corresponding 'before' trigger; the acceptability and implications of this needs to be investigated, documented and the behaviour of the engine fully specified.

                  4. Investigate and implement the SQL 200n specified execution stack under arbitrary triggered action and SQL-invoked routine call graphs.

                  Since:
                  1.7.0
                  Author:
                  Peter Hudson, boucherb@users

                  Field Summary
                   
                  Fields inherited from interface org.hsqldb.Trigger
                  DELETE_AFTER, DELETE_AFTER_ROW, DELETE_BEFORE_ROW, INSERT_AFTER, INSERT_AFTER_ROW, INSERT_BEFORE_ROW, UPDATE_AFTER, UPDATE_AFTER_ROW, UPDATE_BEFORE_ROW
                   
                  Constructor Summary
                  TriggerSample()
                             
                   
                  Method Summary
                   void fire(int typ, String trn, String tn, Object[] or, Object[] nr)
                            A sample HSQLDB Trigger interface implementation.
                  static String getForEachSpec(int type)
                             
                  static String getOperationSpec(int type)
                             
                  static String getQueueSpec(int qs)
                             
                  static String getTriggerDDL(String trn, int typ, String tab, int qs, String impl)
                             
                  static String getTriggerDescriptor(String trn, int typ, String tab)
                             
                  static String getWhenSpec(int type)
                             
                  static void main(String[] args)
                             
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  TriggerSample

                  public TriggerSample()
                  Method Detail

                  fire

                  public void fire(int typ,
                                   String trn,
                                   String tn,
                                   Object[] or,
                                   Object[] nr)
                  A sample HSQLDB Trigger interface implementation.

                  This sample prints information about the firing trigger and records actions in an audit table.

                  The techniques used here are simplified dramatically for demonstration purposes and are in no way recommended as a model upon which to build actual installations involving triggered actions.

                  Specified by:
                  fire in interface Trigger
                  Parameters:
                  typ - trigger type
                  trn - trigger name
                  tn - table name
                  or - old row
                  nr - new row

                  getWhenSpec

                  public static String getWhenSpec(int type)

                  getOperationSpec

                  public static String getOperationSpec(int type)

                  getQueueSpec

                  public static String getQueueSpec(int qs)

                  getForEachSpec

                  public static String getForEachSpec(int type)

                  getTriggerDDL

                  public static String getTriggerDDL(String trn,
                                                     int typ,
                                                     String tab,
                                                     int qs,
                                                     String impl)
                                              throws SQLException
                  Throws:
                  SQLException

                  getTriggerDescriptor

                  public static String getTriggerDescriptor(String trn,
                                                            int typ,
                                                            String tab)

                  main

                  public static void main(String[] args)
                                   throws SQLException
                  Throws:
                  SQLException


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/sample/package-frame.html0000644000175000017500000000203512007570404025167 0ustar renerene org.hsqldb.sample (HSQLDB 2.2.9 API) org.hsqldb.sample
                  Classes 
                  SqlFileEmbedder
                  TriggerSample
                  hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/sample/SqlFileEmbedder.html0000644000175000017500000004175112007570402025501 0ustar renerene SqlFileEmbedder (HSQLDB 2.2.9 API)

                  org.hsqldb.sample
                  Class SqlFileEmbedder

                  java.lang.Object
                    extended by org.hsqldb.sample.SqlFileEmbedder
                  

                  public class SqlFileEmbedder
                  extends Object

                  Sample class which executes SQL files, by embedding SqlFile.

                  Suitable for using as a template.

                  This class also serves as an example of using RCData to allow your application users to store JDBC access information in a convenient text file.

                  Author:
                  Blaine Simpson (blaine dot simpson at admc dot com)
                  See Also:
                  main(String[]), SqlFile, RCData

                  Constructor Summary
                  SqlFileEmbedder(File rcFile, String urlid)
                            Instantiates SqlFileEmbedder object and connects to specified database.
                   
                  Method Summary
                   void executeFiles(String[] fileStrings)
                            Your own classes can use this method to execute SQL files.
                   Connection getConn()
                            For applications that use a persistent JDBC connection, this class can be used to encapsulate that connection.
                  static void main(String[] sa)
                            Run
                   
                  Methods inherited from class java.lang.Object
                  equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
                   

                  Constructor Detail

                  SqlFileEmbedder

                  public SqlFileEmbedder(File rcFile,
                                         String urlid)
                                  throws Exception
                  Instantiates SqlFileEmbedder object and connects to specified database.

                  N.b., you do not need to use RCData to use SqlFile. All SqlFile needs is a live Connection. I'm using RCData because it is a convenient way for a non-contained app (i.e. one that doesn't run in a 3rd party container) to get a Connection.

                  Throws:
                  Exception
                  Method Detail

                  getConn

                  public Connection getConn()
                  For applications that use a persistent JDBC connection, this class can be used to encapsulate that connection. (Just strip out the SqlFile stuff if you don't need that).

                  Returns:
                  The encapsulated JDBC Connection.

                  main

                  public static void main(String[] sa)
                                   throws Exception
                  Run
                       java SqlFileEmbedder
                  to see Syntax message.

                  Throws:
                  Exception

                  executeFiles

                  public void executeFiles(String[] fileStrings)
                                    throws IOException,
                                           org.hsqldb.cmdline.SqlToolError,
                                           SQLException
                  Your own classes can use this method to execute SQL files.

                  See source code for the main(String[]) method for an example of calling this method.

                  Throws:
                  IOException
                  org.hsqldb.cmdline.SqlToolError
                  SQLException
                  See Also:
                  main(String[])


                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/sample/package-use.html0000644000175000017500000001273412007570404024700 0ustar renerene Uses of Package org.hsqldb.sample (HSQLDB 2.2.9 API)

                  Uses of Package
                  org.hsqldb.sample

                  No usage of org.hsqldb.sample



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/sample/class-use/0000755000175000017500000000000012007570406023517 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/sample/class-use/TriggerSample.html0000644000175000017500000001351112007570404027151 0ustar renerene Uses of Class org.hsqldb.sample.TriggerSample (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.sample.TriggerSample

                  No usage of org.hsqldb.sample.TriggerSample



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/sample/class-use/SqlFileEmbedder.html0000644000175000017500000001353512007570404027401 0ustar renerene Uses of Class org.hsqldb.sample.SqlFileEmbedder (HSQLDB 2.2.9 API)

                  Uses of Class
                  org.hsqldb.sample.SqlFileEmbedder

                  No usage of org.hsqldb.sample.SqlFileEmbedder



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/sample/package-summary.html0000644000175000017500000001560412007570404025600 0ustar renerene org.hsqldb.sample (HSQLDB 2.2.9 API)

                  Package org.hsqldb.sample

                  Contains examples for hooking into HyperSQL from your own Java code.

                  See:
                            Description

                  Class Summary
                  SqlFileEmbedder Sample class which executes SQL files, by embedding SqlFile.
                  TriggerSample Sample code for use of triggers in hsqldb.
                   

                  Package org.hsqldb.sample Description

                  Contains examples for hooking into HyperSQL from your own Java code.

                  Other examples may be found in the sample/ subdirectory of your HyperSQL distribution



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/org/hsqldb/sample/package-tree.html0000644000175000017500000001454612007570404025046 0ustar renerene org.hsqldb.sample Class Hierarchy (HSQLDB 2.2.9 API)

                  Hierarchy For Package org.hsqldb.sample

                  Package Hierarchies:
                  All Packages

                  Class Hierarchy



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/overview-frame.html0000644000175000017500000000401312007570404022113 0ustar renerene Overview List (HSQLDB 2.2.9 API)
                  All Classes

                  Packages
                  org.hsqldb
                  org.hsqldb.auth
                  org.hsqldb.cmdline
                  org.hsqldb.jdbc
                  org.hsqldb.lib
                  org.hsqldb.lib.tar
                  org.hsqldb.sample
                  org.hsqldb.server
                  org.hsqldb.util

                    hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/allclasses-frame.html0000644000175000017500000001541212007570406022402 0ustar renerene All Classes (HSQLDB 2.2.9 API) All Classes
                  AuthBeanMultiplexer
                  AuthFunctionBean
                  DbBackup
                  FrameworkLogger
                  HsqldbSlaveAuthBean
                  JaasAuthBean
                  JaasAuthBean.UPCallbackHandler
                  JDBCArray
                  JDBCArrayBasic
                  JDBCBlob
                  JDBCBlobClient
                  JDBCBlobFile
                  JDBCCallableStatement
                  JDBCClob
                  JDBCClobClient
                  JDBCClobFile
                  JDBCColumnMetaData
                  JDBCCommonDataSource
                  JDBCConnection
                  JDBCConnectionEventListener
                  JDBCDatabaseMetaData
                  JDBCDataSource
                  JDBCDataSourceFactory
                  JDBCDriver
                  JDBCDriver
                  JDBCNClob
                  JDBCParameterMetaData
                  JDBCPool
                  JDBCPreparedStatement
                  JDBCResultSet
                  JDBCResultSetMetaData
                  JDBCRowId
                  JDBCSavepoint
                  JDBCSQLXML
                  JDBCSQLXML.SAX2XMLStreamWriter
                  JDBCStatement
                  LdapAuthBean
                  MainInvoker
                  RCData
                  Server
                  ServerAcl
                  ServerAcl.AclFormatException
                  SqlFile
                  SqlFileEmbedder
                  SqlTool
                  SqlTool.SqlToolException
                  Trigger
                  TriggerSample
                  Util
                  WebServer
                  hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/overview-summary.html0000644000175000017500000001611012007570406022521 0ustar renerene Overview (HSQLDB 2.2.9 API)



                  HSQLDB 2.2.9

                  Packages
                  org.hsqldb Contains basic HyperSQL engine classes.
                  org.hsqldb.auth  
                  org.hsqldb.cmdline Contains command-line utilities.
                  org.hsqldb.jdbc Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support.
                  org.hsqldb.lib Shared classes used by other HyperSQL classes.
                  org.hsqldb.lib.tar Contains the DbBackup class, for backing up HyperSQL databases, and support classes for handling files in tar and pax format.
                  org.hsqldb.sample Contains examples for hooking into HyperSQL from your own Java code.
                  org.hsqldb.server The HyperSQL network listener classes.
                  org.hsqldb.util  

                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/help-doc.html0000644000175000017500000002320612007570406020657 0ustar renerene API Help (HSQLDB 2.2.9 API)

                  How This API Document Is Organized

                  This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

                  Overview

                  The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

                  Package

                  Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

                  • Interfaces (italic)
                  • Classes
                  • Enums
                  • Exceptions
                  • Errors
                  • Annotation Types

                  Class/Interface

                  Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

                  • Class inheritance diagram
                  • Direct Subclasses
                  • All Known Subinterfaces
                  • All Known Implementing Classes
                  • Class/interface declaration
                  • Class/interface description

                  • Nested Class Summary
                  • Field Summary
                  • Constructor Summary
                  • Method Summary

                  • Field Detail
                  • Constructor Detail
                  • Method Detail
                  Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

                  Annotation Type

                  Each annotation type has its own separate page with the following sections:

                  • Annotation Type declaration
                  • Annotation Type description
                  • Required Element Summary
                  • Optional Element Summary
                  • Element Detail

                  Enum

                  Each enum has its own separate page with the following sections:

                  • Enum declaration
                  • Enum description
                  • Enum Constant Summary
                  • Enum Constant Detail

                  Use

                  Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.

                  Tree (Class Hierarchy)

                  There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
                  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
                  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.

                  Deprecated API

                  The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

                  Index

                  The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

                  Prev/Next

                  These links take you to the next or previous class, interface, package, or related page.

                  Frames/No Frames

                  These links show and hide the HTML frames. All pages are available with or without frames.

                  Serialized Form

                  Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

                  Constant Field Values

                  The Constant Field Values page lists the static final fields and their values.

                  This help file applies to API documentation generated using the standard doclet.



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/hsqldb.gif0000644000175000017500000000054112007570374020243 0ustar renereneGIF89a-/¢™ÌÌfÌÌf™Ì3f™3ff33f!ùÿ,-/ÿhºÌ50ÊIë(-+"ºÿ`(vƒÖp ®lëªainÝkß(›(]¦÷+²H¼.dÌ DàÈø= ÑÖt„{fWÛ°Mø……Å®]9w>§i)W{W•Öô9ë¢Ônmnvu~"?h„`\FSU‰RLMl†…’“#–G†“‹1ƒr˜Ÿ”:¢—€7"œf¤ ¬‘¯¦³©ª£§Šž¹T´$¨²¸¾ÆA𠫱ˊÇ¿Á¶·}ÁÕÖÊϺ͊ÞÜáSKáâרß/U.Ò¡çh…»¼ày„ïðíô÷ΉçÄé)0 º{Ì4×O büä©ÈW§`6vaöùÙ3(&¡ŠpœVJÊH’%e­°è1¥¿,}š¡Í rêÜ9¡@;hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/deprecated-list.html0000644000175000017500000001671612007570406022245 0ustar renerene Deprecated List (HSQLDB 2.2.9 API)

                  Deprecated API


                  Contents
                  Deprecated Methods
                  org.hsqldb.jdbc.JDBCResultSet.getBigDecimal(int, int)
                            by java.sun.com as of JDK 1.2 
                  org.hsqldb.jdbc.JDBCCallableStatement.getBigDecimal(int, int)
                            use getBigDecimal(int parameterIndex) or getBigDecimal(String parameterName) 
                  org.hsqldb.jdbc.JDBCResultSet.getBigDecimal(String, int)
                            by java.sun.com as of JDK 1.2 
                  org.hsqldb.jdbc.JDBCResultSet.getUnicodeStream(int)
                            use getCharacterStream in place of getUnicodeStream 
                  org.hsqldb.jdbc.JDBCResultSet.getUnicodeStream(String)
                            use getCharacterStream instead 
                  org.hsqldb.jdbc.JDBCPreparedStatement.setUnicodeStream(int, InputStream, int)
                            Sun does not include a reason, but presumably this is because setCharacterStream is now prefered 
                   



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/constant-values.html0000644000175000017500000005203112007570404022306 0ustar renerene Constant Field Values (HSQLDB 2.2.9 API)

                  Constant Field Values


                  Contents
                  org.hsqldb.*

                  org.hsqldb.Trigger
                  public static final int DELETE_AFTER 1
                  public static final int DELETE_AFTER_ROW 4
                  public static final int DELETE_BEFORE_ROW 7
                  public static final int INSERT_AFTER 0
                  public static final int INSERT_AFTER_ROW 3
                  public static final int INSERT_BEFORE_ROW 6
                  public static final int UPDATE_AFTER 2
                  public static final int UPDATE_AFTER_ROW 5
                  public static final int UPDATE_BEFORE_ROW 8

                  org.hsqldb.cmdline.SqlTool
                  public static final int CONNECTERR_EXITVAL 7
                  public static final int FILEERR_EXITVAL 5
                  public static final int INPUTERR_EXITVAL 6
                  public static final int IOERR_EXITVAL 4
                  public static final int RCERR_EXITVAL 2
                  public static final int SQLERR_EXITVAL 3
                  public static final int SQLTOOLERR_EXITVAL 1
                  public static final int SYNTAXERR_EXITVAL 11

                  org.hsqldb.jdbc.JDBCBlob
                  public static final long MAX_POS 2147483648L
                  public static final long MIN_POS 1L

                  org.hsqldb.jdbc.JDBCBlobFile
                  public static final String TEMP_FILE_PREFIX "hsql_jdbc_blob_file_"
                  public static final String TEMP_FILE_SUFFIX ".tmp"

                  org.hsqldb.jdbc.JDBCClobFile
                  public static final String TEMP_FILE_PREFIX "hsql_jdbc_clob_file_"
                  public static final String TEMP_FILE_SUFFIX ".tmp"

                  org.hsqldb.jdbc.JDBCDatabaseMetaData
                  public static final int JDBC_MAJOR 4

                  org.hsqldb.jdbc.JDBCResultSet
                  public static final int CLOSE_CURSORS_AT_COMMIT 2
                  public static final int CONCUR_READ_ONLY 1007
                  public static final int CONCUR_UPDATABLE 1008
                  public static final int FETCH_FORWARD 1000
                  public static final int FETCH_REVERSE 1001
                  public static final int FETCH_UNKNOWN 1002
                  public static final int HOLD_CURSORS_OVER_COMMIT 1
                  public static final int TYPE_FORWARD_ONLY 1003
                  public static final int TYPE_SCROLL_INSENSITIVE 1004
                  public static final int TYPE_SCROLL_SENSITIVE 1005

                  org.hsqldb.lib.RCData
                  public static final String DEFAULT_JDBC_DRIVER "org.hsqldb.jdbc.JDBCDriver"



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/index-all.html0000644000175000017500000160447212007570406021054 0ustar renerene Index (HSQLDB 2.2.9 API)
                  A B C D E F G H I J L M N O P R S T U W

                  A

                  abort(Executor) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Terminates an open connection.
                  absolute(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Moves the cursor to the given row number in this ResultSet object.
                  acceptsURL(String) - Method in class org.hsqldb.jdbc.JDBCDriver
                  Returns true if the driver thinks that it can open a connection to the given URL.
                  acceptsURL(String) - Method in class org.hsqldb.jdbc.JDBCDriver
                  Returns true if the driver thinks that it can open a connection to the given URL.
                  addBatch() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Adds a set of parameters to this PreparedStatement object's batch of commands.
                  addBatch(String) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  This method should always throw if called for a PreparedStatement or CallableStatment.
                  addBatch(String) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Adds the given SQL command to the current list of commmands for this Statement object.
                  addMacros(Map<String, Token>) - Method in class org.hsqldb.cmdline.SqlFile
                   
                  addUserVars(Map<String, String>) - Method in class org.hsqldb.cmdline.SqlFile
                   
                  afterLast() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Moves the cursor to the end of this ResultSet object, just after the last row.
                  allProceduresAreCallable() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether the current user can call all the procedures returned by the method getProcedures.
                  allTablesAreSelectable() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether the current user can use all the tables returned by the method getTables in a SELECT statement.
                  AuthBeanMultiplexer - Class in org.hsqldb.auth
                  This class provides a method which can be used directly as a HyperSQL static Java function method.
                  authenticate(String, String, String) - Static method in class org.hsqldb.auth.AuthBeanMultiplexer
                  HyperSQL Java Function Method.
                  authenticate(String, String) - Method in interface org.hsqldb.auth.AuthFunctionBean
                  Return a list of authorized roles or null to indicate that the implementation does not intend to produce a specific role list but only to indicate whether to allow access or not.
                  authenticate(String, String) - Method in class org.hsqldb.auth.HsqldbSlaveAuthBean
                   
                  authenticate(String, String) - Method in class org.hsqldb.auth.JaasAuthBean
                   
                  authenticate(String, String) - Method in class org.hsqldb.auth.LdapAuthBean
                   
                  AuthFunctionBean - Interface in org.hsqldb.auth
                  N.b.
                  autoCommitFailureClosesAllResultSets() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a SQLException while autoCommit is true inidcates that all open ResultSets are closed, even ones that are holdable.

                  B

                  beforeFirst() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Moves the cursor to the front of this ResultSet object, just before the first row.
                  bitCharsToBytes(String) - Static method in class org.hsqldb.cmdline.SqlFile
                  Just a stub for now.

                  C

                  cancel() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Cancels this Statement object if both the DBMS and driver support aborting an SQL statement.
                  cancel() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Cancels this Statement object if both the DBMS and driver support aborting an SQL statement.
                  cancelRowUpdates() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Cancels the updates made to the current row in this ResultSet object.
                  canDisplayType(int) - Static method in class org.hsqldb.cmdline.SqlFile
                  This method is used to tell SqlFile whether this Sql Type must ALWAYS be loaded to the binary buffer without displaying.
                  catalogName - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  The column's table's catalog name.
                  characters(char[], int, int) - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Receive notification of character data.
                  charset - Variable in class org.hsqldb.lib.RCData
                   
                  checkRunning(boolean) - Method in class org.hsqldb.server.Server
                  Checks if this Server object is or is not running and throws if the current state does not match the specified value.
                  clear() - Method in class org.hsqldb.auth.AuthBeanMultiplexer
                  Clear the set of AuthFunctionBeans
                  clearBatch() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Empties this Statement object's current list of SQL commands.
                  clearBatch() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Empties this Statement object's current list of SQL commands.
                  clearLoggers(String) - Static method in class org.hsqldb.lib.FrameworkLogger
                  Frees Logger(s), if any, with the specified category, or that begins with the specified prefix + dot.
                  clearParameters() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Clears the current parameter values immediately.
                  clearUpdates() - Method in class org.hsqldb.jdbc.JDBCBlobClient
                   
                  clearUpdates() - Method in class org.hsqldb.jdbc.JDBCClobClient
                   
                  clearWarnings() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Clears all warnings reported for this Connection object.
                  clearWarnings() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Clears all the warnings reported on this Statement object.
                  clearWarnings() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Clears all warnings reported on this ResultSet object.
                  clearWarnings() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Clears all the warnings reported on this Statement object.
                  close() - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Does the specialized work required to free this object's resources and that of it's parent classes.
                  close() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be automatically released.
                  close(int) - Method in class org.hsqldb.jdbc.JDBCPool
                  Closes the pool immediately.
                  close() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Does the specialized work required to free this object's resources and that of it's parent class.
                  close() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Releases this ResultSet object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed.
                  close() - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Closes this object.
                  close() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Releases this Statement object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed.
                  CLOSE_CURSORS_AT_COMMIT - Static variable in class org.hsqldb.jdbc.JDBCResultSet
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  closeFully() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Completely closes a pooled connection
                  closeOnCompletion() - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                   
                  closeReader() - Method in class org.hsqldb.cmdline.SqlFile
                  Close the reader.
                  colonNotation(byte[]) - Static method in class org.hsqldb.server.ServerAcl
                   
                  columnClassName - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  The fully-qualified name of the Java class whose instances are manufactured if the method ResultSet.getObject is called to retrieve a value from the column.
                  columnDisplaySize - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  The column's normal max width in chars.
                  columnLabel - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  The suggested column title for use in printouts and displays.
                  columnName - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  The column's name.
                  columnType - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  The column's SQL type.
                  comment(char[], int, int) - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                   
                  commit() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Makes all changes made since the previous commit/rollback permanent and releases any database locks currently held by this Connection object.
                  CONCUR_READ_ONLY - Static variable in class org.hsqldb.jdbc.JDBCResultSet
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  CONCUR_UPDATABLE - Static variable in class org.hsqldb.jdbc.JDBCResultSet
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  connect(String, Properties) - Method in class org.hsqldb.jdbc.JDBCDriver
                  Attempts to make a database connection to the given URL.
                  connect(String, Properties) - Method in class org.hsqldb.jdbc.JDBCDriver
                  Attempts to make a database connection to the given URL.
                  CONNECTERR_EXITVAL - Static variable in class org.hsqldb.cmdline.SqlTool
                   
                  connectionClosed() - Method in interface org.hsqldb.jdbc.JDBCConnectionEventListener
                   
                  connectionClosed(ConnectionEvent) - Method in class org.hsqldb.jdbc.JDBCPool
                   
                  connectionClosedException() - Static method in class org.hsqldb.jdbc.Util
                   
                  connectionErrorOccured(SQLException) - Method in interface org.hsqldb.jdbc.JDBCConnectionEventListener
                   
                  connectionErrorOccurred(ConnectionEvent) - Method in class org.hsqldb.jdbc.JDBCPool
                   
                  convertEscapes(String) - Static method in class org.hsqldb.cmdline.SqlFile
                  Translates user-supplied escapes into the traditionaly corresponding corresponding binary characters.
                  createArrayOf(String, Object[]) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Factory method for creating Array objects.
                  createBlob() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Constructs an object that implements the Blob interface.
                  createClob() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Constructs an object that implements the Clob interface.
                  createDataSource(Properties) - Static method in class org.hsqldb.jdbc.JDBCDataSourceFactory
                  Static method to create a JDBCDataSource instance using the given properties for url, user, password, etc.
                  createNClob() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Constructs an object that implements the NClob interface.
                  createSQLXML() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Constructs an object that implements the SQLXML interface.
                  createStatement() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a Statement object for sending SQL statements to the database.
                  createStatement(int, int) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a Statement object that will generate ResultSet objects with the given type and concurrency.
                  createStatement(int, int, int) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a Statement object that will generate ResultSet objects with the given type, concurrency, and holdability.
                  createStruct(String, Object[]) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Factory method for creating Struct objects.

                  D

                  dataDefinitionCausesTransactionCommit() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a data definition statement within a transaction forces the transaction to commit.
                  dataDefinitionIgnoredInTransactions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database ignores a data definition statement within a transaction.
                  DbBackup - Class in org.hsqldb.lib.tar
                  Works with tar archives containing HSQLDB database instance backups.
                  DbBackup(File, String) - Constructor for class org.hsqldb.lib.tar.DbBackup
                  Instantiate a DbBackup instance for creating a Database Instance backup.
                  DbBackup(File, String, boolean) - Constructor for class org.hsqldb.lib.tar.DbBackup
                  Used for SCRIPT backup
                  DEFAULT_JDBC_DRIVER - Static variable in class org.hsqldb.lib.RCData
                   
                  DEFAULT_RCFILE - Static variable in class org.hsqldb.cmdline.SqlTool
                   
                  DELETE_AFTER - Static variable in interface org.hsqldb.Trigger
                   
                  DELETE_AFTER_ROW - Static variable in interface org.hsqldb.Trigger
                   
                  DELETE_BEFORE_ROW - Static variable in interface org.hsqldb.Trigger
                   
                  deleteRow() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Deletes the current row from this ResultSet object and from the underlying database.
                  deletesAreDetected(int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether or not a visible row delete can be detected by calling the method ResultSet.rowDeleted.
                  doesMaxRowSizeIncludeBlobs() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether the return value for the method getMaxRowSize includes the SQL data types LONGVARCHAR and LONGVARBINARY.
                  dottedNotation(byte[]) - Static method in class org.hsqldb.server.ServerAcl
                   
                  driver - Variable in class org.hsqldb.lib.RCData
                   
                  driverInstance - Static variable in class org.hsqldb.jdbc.JDBCDriver
                   
                  driverInstance - Static variable in class org.hsqldb.jdbc.JDBCDriver
                   
                  dsvSafe(String) - Method in class org.hsqldb.cmdline.SqlFile
                  Validate that String is safe to write TO DSV file.

                  E

                  endDocument() - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Receive notification of the end of a document.
                  endElement(String, String, String) - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Receive notification of the end of an element.
                  endPrefixMapping(String) - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  End the scope of a prefix-URI mapping.
                  enduserlog(Level, String) - Method in class org.hsqldb.lib.FrameworkLogger
                   
                  equals(Object) - Method in class org.hsqldb.jdbc.JDBCRowId
                  Compares this RowId to the specified object.
                  error(String) - Method in class org.hsqldb.lib.FrameworkLogger
                  This is just a wrapper for FrameworkLogger.warning(), because java.util.logging lacks a method for this critical purpose.
                  error(String, Throwable) - Method in class org.hsqldb.lib.FrameworkLogger
                  Just like FrameworkLogger.error(String), but also logs a stack trace.
                  escapeHtml(String) - Static method in class org.hsqldb.cmdline.SqlFile
                  Escaping rules taken from 'Reserved Characters in HTML table at http://www.w3schools.com/tags/ref_entities.asp
                  execute() - Method in class org.hsqldb.cmdline.SqlFile
                  Process all the commands from the file or Reader associated with "this" object.
                  execute() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Executes the SQL statement in this PreparedStatement object, which may be any kind of SQL statement.
                  execute(String) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  This method should always throw if called for a PreparedStatement or CallableStatment.
                  execute(String, int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                   
                  execute(String, int[]) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                   
                  execute(String, String[]) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                   
                  execute(String) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Executes the given SQL statement, which may return multiple results.
                  execute(String, int) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Executes the given SQL statement, which may return multiple results, and signals the driver that any auto-generated keys should be made available for retrieval.
                  execute(String, int[]) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Executes the given SQL statement, which may return multiple results, and signals the driver that the auto-generated keys indicated in the given array should be made available for retrieval.
                  execute(String, String[]) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Executes the given SQL statement, which may return multiple results, and signals the driver that the auto-generated keys indicated in the given array should be made available for retrieval.
                  executeBatch() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Submits a batch of commands to the database for execution and if all commands execute successfully, returns an array of update counts.
                  executeBatch() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Submits a batch of commands to the database for execution and if all commands execute successfully, returns an array of update counts.
                  executeFiles(String[]) - Method in class org.hsqldb.sample.SqlFileEmbedder
                  Your own classes can use this method to execute SQL files.
                  executeQuery() - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query.
                  executeQuery() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query.
                  executeQuery(String) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  This method should always throw if called for a PreparedStatement or CallableStatment.
                  executeQuery(String) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Executes the given SQL statement, which returns a single ResultSet object.
                  executeUpdate() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Executes the SQL statement in this PreparedStatement object, (JDBC4 clarification:) which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement.
                  executeUpdate(String) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  This method should always throw if called for a PreparedStatement or CallableStatment.
                  executeUpdate(String, int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Statement methods that must be overridden in this class and throw an exception.
                  executeUpdate(String, int[]) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                   
                  executeUpdate(String, String[]) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                   
                  executeUpdate(String) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement.
                  executeUpdate(String, int) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Executes the given SQL statement and signals the driver with the given flag about whether the auto-generated keys produced by this Statement object should be made available for retrieval.
                  executeUpdate(String, int[]) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Executes the given SQL statement and signals the driver that the auto-generated keys indicated in the given array should be made available for retrieval.
                  executeUpdate(String, String[]) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Executes the given SQL statement and signals the driver that the auto-generated keys indicated in the given array should be made available for retrieval.
                  expandSysPropVars(String) - Static method in class org.hsqldb.lib.RCData
                  Returns a copy of the given String with System property names in the format ${system.property} replaced by the corresponding Java System Properties.

                  F

                  FETCH_FORWARD - Static variable in class org.hsqldb.jdbc.JDBCResultSet
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  FETCH_REVERSE - Static variable in class org.hsqldb.jdbc.JDBCResultSet
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  FETCH_UNKNOWN - Static variable in class org.hsqldb.jdbc.JDBCResultSet
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  FILEERR_EXITVAL - Static variable in class org.hsqldb.cmdline.SqlTool
                   
                  findColumn(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Maps the given ResultSet column label to its ResultSet column index.
                  finer(String) - Method in class org.hsqldb.lib.FrameworkLogger
                   
                  finer(String, Throwable) - Method in class org.hsqldb.lib.FrameworkLogger
                  Just like FrameworkLogger.finer(String), but also logs a stack trace.
                  finest(String) - Method in class org.hsqldb.lib.FrameworkLogger
                   
                  finest(String, Throwable) - Method in class org.hsqldb.lib.FrameworkLogger
                  Just like FrameworkLogger.finest(String), but also logs a stack trace.
                  fire(int, String, String, Object[], Object[]) - Method in class org.hsqldb.sample.TriggerSample
                  A sample HSQLDB Trigger interface implementation.
                  fire(int, String, String, Object[], Object[]) - Method in interface org.hsqldb.Trigger
                  The method invoked upon each triggered action.
                  first() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Moves the cursor to the first row in this ResultSet object.
                  FrameworkLogger - Class in org.hsqldb.lib
                  A logging framework wrapper that supports java.util.logging and log4j.
                  free() - Method in class org.hsqldb.jdbc.JDBCArray
                  This method frees the Array object and releases the resources that it holds.
                  free() - Method in class org.hsqldb.jdbc.JDBCArrayBasic
                  This method frees the Array object and releases the resources that it holds.
                  free() - Method in class org.hsqldb.jdbc.JDBCBlob
                  This method frees the Blob object and releases the resources that it holds.
                  free() - Method in class org.hsqldb.jdbc.JDBCBlobClient
                  This method frees the Blob object and releases the resources that it holds.
                  free() - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  This method frees the Blob object and releases the resources that it holds.
                  free() - Method in class org.hsqldb.jdbc.JDBCClob
                  This method frees the Clob object and releases the resources the resources that it holds.
                  free() - Method in class org.hsqldb.jdbc.JDBCClobClient
                  This method frees the Clob object and releases the resources the resources that it holds.
                  free() - Method in class org.hsqldb.jdbc.JDBCClobFile
                  This method frees the Clob object and releases the resources the resources that it holds.
                  free() - Method in class org.hsqldb.jdbc.JDBCSQLXML
                  This method closes this object and releases the resources that it held.

                  G

                  generatedKeyAlwaysReturned() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a generated key will always be returned if the column name(s) or index(es) specified for the auto generated key column(s) are valid and the statement succeeds.
                  getAbortUponModify() - Method in class org.hsqldb.lib.tar.DbBackup
                   
                  getAddress() - Method in class org.hsqldb.server.Server
                  Retrieves, in string form, this server's host address.
                  getArray() - Method in class org.hsqldb.jdbc.JDBCArray
                  Retrieves the contents of the SQL ARRAY value designated by this Array object in the form of an array in the Java programming language.
                  getArray(Map<String, Class<?>>) - Method in class org.hsqldb.jdbc.JDBCArray
                  Retrieves the contents of the SQL ARRAY value designated by this Array object.
                  getArray(long, int) - Method in class org.hsqldb.jdbc.JDBCArray
                  Retrieves a slice of the SQL ARRAY value designated by this Array object, beginning with the specified index and containing up to count successive elements of the SQL array.
                  getArray(long, int, Map<String, Class<?>>) - Method in class org.hsqldb.jdbc.JDBCArray
                  Retreives a slice of the SQL ARRAY value designated by this Array object, beginning with the specified index and containing up to count successive elements of the SQL array.
                  getArray() - Method in class org.hsqldb.jdbc.JDBCArrayBasic
                  Retrieves the contents of the SQL ARRAY value designated by this Array object in the form of an array in the Java programming language.
                  getArray(Map<String, Class<?>>) - Method in class org.hsqldb.jdbc.JDBCArrayBasic
                  Retrieves the contents of the SQL ARRAY value designated by this Array object.
                  getArray(long, int) - Method in class org.hsqldb.jdbc.JDBCArrayBasic
                  Retrieves a slice of the SQL ARRAY value designated by this Array object, beginning with the specified index and containing up to count successive elements of the SQL array.
                  getArray(long, int, Map<String, Class<?>>) - Method in class org.hsqldb.jdbc.JDBCArrayBasic
                  Retreives a slice of the SQL ARRAY value designated by this Array object, beginning with the specified index and containing up to count successive elements of the SQL array.
                  getArray(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC ARRAY parameter as an Array object in the Java programming language.
                  getArray(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC ARRAY parameter as an Array object in the Java programming language.
                  getArray(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as an Array object in the Java programming language.
                  getArray(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as an Array object in the Java programming language.
                  getArrayInternal() - Method in class org.hsqldb.jdbc.JDBCArray
                   
                  getAsciiStream() - Method in class org.hsqldb.jdbc.JDBCClob
                  Retrieves the CLOB value designated by this Clob object as an ASCII stream.
                  getAsciiStream() - Method in class org.hsqldb.jdbc.JDBCClobClient
                  Retrieves the CLOB value designated by this Clob object as an ascii stream.
                  getAsciiStream() - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Retrieves the CLOB value designated by this Clob object as an ascii stream.
                  getAsciiStream(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a stream of ASCII characters.
                  getAsciiStream(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a stream of ASCII characters.
                  getAttributes(String, String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the given attribute of the given type for a user-defined type (UDT) that is available in the given schema and catalog.
                  getAutoCommit() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Retrieves the current auto-commit mode for this Connection object.
                  getBanner(Connection) - Static method in class org.hsqldb.cmdline.SqlFile
                  Returns a String report for the specified JDBC Connection.
                  getBaseType() - Method in class org.hsqldb.jdbc.JDBCArray
                  Retrieves the JDBC type of the elements in the array designated by this Array object.
                  getBaseType() - Method in class org.hsqldb.jdbc.JDBCArrayBasic
                  Retrieves the JDBC type of the elements in the array designated by this Array object.
                  getBaseTypeName() - Method in class org.hsqldb.jdbc.JDBCArray
                  Retrieves the SQL type name of the elements in the array designated by this Array object.
                  getBaseTypeName() - Method in class org.hsqldb.jdbc.JDBCArrayBasic
                  Retrieves the SQL type name of the elements in the array designated by this Array object.
                  getBestRowIdentifier(String, String, String, int, boolean) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of a table's optimal set of columns that uniquely identifies a row.
                  getBigDecimal(int, int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Deprecated. use getBigDecimal(int parameterIndex) or getBigDecimal(String parameterName)
                  getBigDecimal(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC NUMERIC parameter as a java.math.BigDecimal object with as many digits to the right of the decimal point as the value contains.
                  getBigDecimal(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC NUMERIC parameter as a java.math.BigDecimal object with as many digits to the right of the decimal point as the value contains.
                  getBigDecimal(int, int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Deprecated. by java.sun.com as of JDK 1.2
                  getBigDecimal(String, int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Deprecated. by java.sun.com as of JDK 1.2
                  getBigDecimal(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.math.BigDecimal with full precision.
                  getBigDecimal(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.math.BigDecimal with full precision.
                  getBinaryStream() - Method in class org.hsqldb.jdbc.JDBCBlob
                  Retrieves the BLOB value designated by this Blob instance as a stream.
                  getBinaryStream(long, long) - Method in class org.hsqldb.jdbc.JDBCBlob
                  Returns an InputStream object that contains a partial Blob value, starting with the byte specified by pos, which is length bytes in length.
                  getBinaryStream() - Method in class org.hsqldb.jdbc.JDBCBlobClient
                  Retrieves the BLOB value designated by this Blob instance as a stream.
                  getBinaryStream(long, long) - Method in class org.hsqldb.jdbc.JDBCBlobClient
                  Returns an InputStream object that contains a partial Blob value, starting with the byte specified by pos, which is length bytes in length.
                  getBinaryStream() - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Retrieves the BLOB value designated by this Blob instance as a stream.
                  getBinaryStream(long, long) - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Returns an InputStream object that contains a partial Blob value, starting with the byte specified by pos, which is length bytes in length.
                  getBinaryStream(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a stream of uninterpreted bytes.
                  getBinaryStream(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a stream of uninterpreted bytes.
                  getBinaryStream() - Method in class org.hsqldb.jdbc.JDBCSQLXML
                  Retrieves the XML value designated by this SQLXML instance as a stream.
                  getBlob() - Method in class org.hsqldb.jdbc.JDBCBlobClient
                   
                  getBlob(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC BLOB parameter as a Blob object in the Java programming language.
                  getBlob(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC BLOB parameter as a Blob object in the Java programming language.
                  getBlob(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a Blob object in the Java programming language.
                  getBlob(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a Blob object in the Java programming language.
                  getBoolean(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  (JDBC4 modified:) Retrieves the value of the designated JDBC BIT or BOOLEAN parameter as a boolean in the Java programming language.
                  getBoolean(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  (JDBC4 modified:)
                  getBoolean(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a boolean in the Java programming language.
                  getBoolean(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a boolean in the Java programming language.
                  getByte(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC TINYINT parameter as a byte in the Java programming language.
                  getByte(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC TINYINT parameter as a byte in the Java programming language.
                  getByte(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a byte in the Java programming language.
                  getByte(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a byte in the Java programming language.
                  getBytes(long, int) - Method in class org.hsqldb.jdbc.JDBCBlob
                  Retrieves all or part of the BLOB value that this Blob object represents, as an array of bytes.
                  getBytes(long, int) - Method in class org.hsqldb.jdbc.JDBCBlobClient
                  Retrieves all or part of the BLOB value that this Blob object represents, as an array of bytes.
                  getBytes(long, int) - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Retrieves all or part of the BLOB value that this Blob object represents, as an array of bytes.
                  getBytes(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC BINARY or VARBINARY parameter as an array of byte values in the Java programming language.
                  getBytes(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC BINARY or VARBINARY parameter as an array of byte values in the Java programming language.
                  getBytes(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a byte array in the Java programming language.
                  getBytes(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a byte array in the Java programming language.
                  getBytes() - Method in class org.hsqldb.jdbc.JDBCRowId
                  Returns an array of bytes representing the value of the SQL ROWID designated by this java.sql.RowId object.
                  getCatalog() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Retrieves this Connection object's current catalog name.
                  getCatalogName(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Gets the designated column's table's catalog name.
                  getCatalogs() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the catalog names available in this database.
                  getCatalogSeparator() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the String that this database uses as the separator between a catalog and table name.
                  getCatalogTerm() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the database vendor's preferred term for "catalog".
                  getCharacterStream(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated parameter as a java.io.Reader object in the Java programming language.
                  getCharacterStream(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated parameter as a java.io.Reader object in the Java programming language.
                  getCharacterStream() - Method in class org.hsqldb.jdbc.JDBCClob
                  Retrieves the CLOB value designated by this Clob object as a java.io.Reader object (or as a stream of characters).
                  getCharacterStream(long, long) - Method in class org.hsqldb.jdbc.JDBCClob
                  Returns a Reader object that contains a partial Clob value, starting with the character specified by pos, which is length characters in length.
                  getCharacterStream() - Method in class org.hsqldb.jdbc.JDBCClobClient
                  Retrieves the CLOB value designated by this Clob object as a java.io.Reader object (or as a stream of characters).
                  getCharacterStream(long, long) - Method in class org.hsqldb.jdbc.JDBCClobClient
                  Returns a Reader object that contains a partial Clob value, starting with the character specified by pos, which is length characters in length.
                  getCharacterStream() - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Retrieves the CLOB value designated by this Clob object as a java.io.Reader object (or as a stream of characters).
                  getCharacterStream(long, long) - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Returns a Reader object that contains a partial Clob value, starting with the character specified by pos, which is length characters in length.
                  getCharacterStream(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader object.
                  getCharacterStream(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader object.
                  getCharacterStream() - Method in class org.hsqldb.jdbc.JDBCSQLXML
                  Retrieves the XML value designated by this SQLXML instance as a java.io.Reader object.
                  getClientInfo(String) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Returns the value of the client info property specified by name.
                  getClientInfo() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Returns a list containing the name and current value of each client info property supported by the driver.
                  getClientInfoProperties() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a list of the client info properties that the driver supports.
                  getClob(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC CLOB parameter as a java.sql.Clob object in the Java programming language.
                  getClob(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC CLOB parameter as a Clob object in the Java programming language.
                  getClob() - Method in class org.hsqldb.jdbc.JDBCClobClient
                   
                  getClob(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a Clob object in the Java programming language.
                  getClob(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a Clob object in the Java programming language.
                  getColumnClassName(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                   
                  getColumnCount() - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Returns the number of columns in this ResultSet object.
                  getColumnDisplaySize(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Indicates the designated column's normal maximum width in characters.
                  getColumnLabel(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Gets the designated column's suggested title for use in printouts and displays.
                  getColumnName(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Get the designated column's name.
                  getColumnPrivileges(String, String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the access rights for a table's columns.
                  getColumns(String, String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of table columns available in the specified catalog.
                  getColumnType(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Retrieves the designated column's SQL type.
                  getColumnTypeName(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Retrieves the designated column's database-specific type name.
                  getConcurrency() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the concurrency mode of this ResultSet object.
                  getConn() - Method in class org.hsqldb.sample.SqlFileEmbedder
                  For applications that use a persistent JDBC connection, this class can be used to encapsulate that connection.
                  getConnection() - Method in class org.hsqldb.cmdline.SqlFile
                   
                  getConnection() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the connection that produced this metadata object.
                  getConnection() - Method in class org.hsqldb.jdbc.JDBCDataSource
                  Retrieves a new connection using the properties that have already been set.
                  getConnection(String, String) - Method in class org.hsqldb.jdbc.JDBCDataSource
                  Retrieves a new connection using the given username and password, and the database url that has been set.
                  getConnection(String, Properties) - Static method in class org.hsqldb.jdbc.JDBCDriver
                  The static equivalent of the connect(String,Properties) method.
                  getConnection(String, Properties) - Static method in class org.hsqldb.jdbc.JDBCDriver
                  The static equivalent of the connect(String,Properties) method.
                  getConnection() - Method in class org.hsqldb.jdbc.JDBCPool
                  Retrieves a new connection using the properties that have already been set.
                  getConnection(String, String) - Method in class org.hsqldb.jdbc.JDBCPool
                  Retrieves a new connection using the given username and password, and the database url that has been set.
                  getConnection() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the Connection object that produced this Statement object.
                  getConnection() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves the Connection object that produced this Statement object.
                  getConnection() - Method in class org.hsqldb.lib.RCData
                  Gets a JDBC Connection using the data of this RCData object.
                  getConnection(String, String) - Method in class org.hsqldb.lib.RCData
                  Gets a JDBC Connection using the data of this RCData object with specified override elements
                  getCrossReference(String, String, String, String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  (JDBC4 clarification:) Retrieves a description of the foreign key columns in the given foreign key table that reference the primary key or the columns representing a unique constraint of the parent table (could be the same or a different table).
                  getCurrentSchema() - Method in class org.hsqldb.cmdline.SqlFile
                   
                  getCursorName() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the name of the SQL cursor used by this ResultSet object.
                  getDatabase() - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Synonym for getUrl().
                  getDatabase() - Method in class org.hsqldb.jdbc.JDBCPool
                  Synonym for getUrl().
                  getDatabaseMajorVersion() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the major version number of the underlying database.
                  getDatabaseMinorVersion() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the minor version number of the underlying database.
                  getDatabaseName() - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Synonym for getUrl().
                  getDatabaseName() - Method in class org.hsqldb.jdbc.JDBCPool
                  Synonym for getUrl().
                  getDatabaseName(int, boolean) - Method in class org.hsqldb.server.Server
                  Retrieves the url alias (network name) of the i'th database that this Server hosts.
                  getDatabasePath(int, boolean) - Method in class org.hsqldb.server.Server
                  Retrieves the HSQLDB path descriptor (uri) of the i'th Database that this Server hosts.
                  getDatabaseProductName() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the name of this database product.
                  getDatabaseProductVersion() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the version number of this database product.
                  getDatabaseType(int) - Method in class org.hsqldb.server.Server
                   
                  getDataSourceName() - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Retrieves the name of the data source.
                  getDataSourceName() - Method in class org.hsqldb.jdbc.JDBCPool
                  Retrieves the name of the data source.
                  getDate(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC DATE parameter as a java.sql.Date object.
                  getDate(int, Calendar) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC DATE parameter as a java.sql.Date object, using the given Calendar object to construct the date.
                  getDate(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC DATE parameter as a java.sql.Date object.
                  getDate(String, Calendar) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC DATE parameter as a java.sql.Date object, using the given Calendar object to construct the date.
                  getDate(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object in the Java programming language.
                  getDate(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object in the Java programming language.
                  getDate(int, Calendar) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object in the Java programming language.
                  getDate(String, Calendar) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object in the Java programming language.
                  getDefaultJdbcDriverName() - Method in class org.hsqldb.lib.RCData
                   
                  getDefaultTransactionIsolation() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves this database's default transaction isolation level.
                  getDefaultWebPage() - Method in class org.hsqldb.server.Server
                  Retrieves the name of the web page served when no page is specified.
                  getDefaultWebPage() - Method in class org.hsqldb.server.WebServer
                  Retrieves the name of the web page served when no page is specified.
                  getDescription() - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Retrieves the description of the data source.
                  getDescription() - Method in class org.hsqldb.jdbc.JDBCPool
                  Retrieves the description of the data source.
                  getDocumentLocator() - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Retrieves the Locator.
                  getDouble(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC DOUBLE parameter as a double in the Java programming language.
                  getDouble(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC DOUBLE parameter as a double in the Java programming language.
                  getDouble(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a double in the Java programming language.
                  getDouble(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a double in the Java programming language.
                  getDriverMajorVersion() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves this JDBC driver's major version number.
                  getDriverMinorVersion() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves this JDBC driver's minor version number.
                  getDriverName() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the name of this JDBC driver.
                  getDriverVersion() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the version number of this JDBC driver as a String.
                  getEncoding() - Method in class org.hsqldb.jdbc.JDBCClobFile
                   
                  getErrWriter() - Method in class org.hsqldb.server.Server
                  Retrieves the PrintWriter to which server errors are printed.
                  getExportedKeys(String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the foreign key columns that reference the given table's primary key columns (the foreign keys exported by a table).
                  getExtraNameCharacters() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves all the "extra" characters that can be used in unquoted identifier names (those beyond a-z, A-Z, 0-9 and _).
                  getFetchDirection() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the direction for fetching rows from database tables that is the default for result sets generated from this Statement object.
                  getFetchDirection() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the fetch direction for this ResultSet object.
                  getFetchDirection() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves the direction for fetching rows from database tables that is the default for result sets generated from this Statement object.
                  getFetchSize() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the number of result set rows that is the default fetch size for ResultSet objects generated from this Statement object.
                  getFetchSize() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the fetch size for this ResultSet object.
                  getFetchSize() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves the number of result set rows that is the default fetch size for ResultSet objects generated from this Statement object.
                  getFile() - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Retrieves the canonical File object denoting the file that backs this BLOB.
                  getFile() - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Retrieves the canonical File object denoting the file that backs this CLOB.
                  getFloat(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC FLOAT parameter as a float in the Java programming language.
                  getFloat(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC FLOAT parameter as a float in the Java programming language.
                  getFloat(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a float in the Java programming language.
                  getFloat(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a float in the Java programming language.
                  getForEachSpec(int) - Static method in class org.hsqldb.sample.TriggerSample
                   
                  getFunctionColumns(String, String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the given catalog's system or user function parameters and return type.
                  getFunctions(String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the JDBC 4.1[ system and ]user functions available in the given catalog.
                  getGeneratedKeys() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves any auto-generated keys created as a result of executing this Statement object.
                  getGeneratedKeys() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves any auto-generated keys created as a result of executing this Statement object.
                  getHelpString() - Method in class org.hsqldb.server.Server
                  Retrieves a String object describing the command line and properties options for this Server.
                  getHelpString() - Method in class org.hsqldb.server.WebServer
                  Retrieves a String object describing the command line and properties options for this Server.
                  getHoldability() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Retrieves the current holdability of ResultSet objects created using this Connection object.
                  getHoldability() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the holdability of this ResultSet object
                  getIdentifierQuoteString() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the string used to quote SQL identifiers.
                  getImportedKeys(String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the primary key columns that are referenced by the given table's foreign key columns (the primary keys imported by a table).
                  getIndexInfo(String, String, String, boolean, boolean) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the given table's indices and statistics.
                  getInt(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC INTEGER parameter as an int in the Java programming language.
                  getInt(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC INTEGER parameter as an int in the Java programming language.
                  getInt(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as an int in the Java programming language.
                  getInt(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as an int in the Java programming language.
                  getJDBCMajorVersion() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the major JDBC version number for this driver.
                  getJDBCMinorVersion() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the minor JDBC version number for this driver.
                  getLog(Class) - Static method in class org.hsqldb.lib.FrameworkLogger
                  User's entry-point into this logging system.
                  getLog(Class, String) - Static method in class org.hsqldb.lib.FrameworkLogger
                  This method just defers to the getLog(Class) method unless default (no local configuration) JDK logging is being used; In that case, this method assures that the returned logger has an associated FileHander using the supplied String identifier.
                  getLog(String, String) - Static method in class org.hsqldb.lib.FrameworkLogger
                  This method just defers to the getLog(String) method unless default (no local configuration) JDK logging is being used; In that case, this method assures that the returned logger has an associated FileHander using the supplied String identifier.
                  getLog(String) - Static method in class org.hsqldb.lib.FrameworkLogger
                  Alternative entry-point into this logging system, for cases where you want to share a single logger instance among multiple classes, or you want to use multiple logger instances from a single class.
                  getLoginTimeout() - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Gets the maximum time in seconds that this data source can wait while attempting to connect to a database.
                  getLoginTimeout() - Method in class org.hsqldb.jdbc.JDBCPool
                  Gets the maximum time in seconds that this data source can wait while attempting to connect to a database.
                  getLogWriter() - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Retrieves the log writer for this DataSource object.
                  getLogWriter() - Method in class org.hsqldb.jdbc.JDBCPool
                  Retrieves the log writer for this DataSource object.
                  getLogWriter() - Method in class org.hsqldb.server.Server
                  Retrieves the PrintWriter to which server messages are printed.
                  getLong(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC BIGINT parameter as a long in the Java programming language.
                  getLong(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC BIGINT parameter as a long in the Java programming language.
                  getLong(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a long in the Java programming language.
                  getLong(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a long in the Java programming language.
                  getMacros() - Method in class org.hsqldb.cmdline.SqlFile
                   
                  getMajorVersion() - Method in class org.hsqldb.jdbc.JDBCDriver
                  Gets the driver's major version number.
                  getMajorVersion() - Method in class org.hsqldb.jdbc.JDBCDriver
                  Gets the driver's major version number.
                  getMaxBinaryLiteralLength() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of hex characters this database allows in an inline binary literal.
                  getMaxCatalogNameLength() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of characters that this database allows in a catalog name.
                  getMaxCharLiteralLength() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of characters this database allows for a character literal.
                  getMaxColumnNameLength() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of characters this database allows for a column name.
                  getMaxColumnsInGroupBy() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of columns this database allows in a GROUP BY clause.
                  getMaxColumnsInIndex() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of columns this database allows in an index.
                  getMaxColumnsInOrderBy() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of columns this database allows in an ORDER BY clause.
                  getMaxColumnsInSelect() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of columns this database allows in a SELECT list.
                  getMaxColumnsInTable() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of columns this database allows in a table.
                  getMaxConnections() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of concurrent connections to this database that are possible.
                  getMaxCursorNameLength() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of characters that this database allows in a cursor name.
                  getMaxFieldSize() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the maximum number of bytes that can be returned for character and binary column values in a ResultSet object produced by this Statement object.
                  getMaxFieldSize() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves the maximum number of bytes that can be returned for character and binary column values in a ResultSet object produced by this Statement object.
                  getMaxIndexLength() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of bytes this database allows for an index, including all of the parts of the index.
                  getMaxProcedureNameLength() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of characters that this database allows in a procedure name.
                  getMaxRows() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the maximum number of rows that a ResultSet object produced by this Statement object can contain.
                  getMaxRows() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves the maximum number of rows that a ResultSet object produced by this Statement object can contain.
                  getMaxRowSize() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of bytes this database allows in a single row.
                  getMaxSchemaNameLength() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of characters that this database allows in a schema name.
                  getMaxStatementLength() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of characters this database allows in an SQL statement.
                  getMaxStatements() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of active statements to this database that can be open at the same time.
                  getMaxTableNameLength() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of characters this database allows in a table name.
                  getMaxTablesInSelect() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of tables this database allows in a SELECT statement.
                  getMaxUserNameLength() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the maximum number of characters this database allows in a user name.
                  getMetaData() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Retrieves a DatabaseMetaData object that contains metadata about the database to which this Connection object represents a connection.
                  getMetaData() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves a ResultSetMetaData object that contains information about the columns of the ResultSet object that will be returned when this PreparedStatement object is executed.
                  getMetaData() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the number, types and properties of this ResultSet object's columns.
                  getMinorVersion() - Method in class org.hsqldb.jdbc.JDBCDriver
                  Gets the driver's minor version number.
                  getMinorVersion() - Method in class org.hsqldb.jdbc.JDBCDriver
                  Gets the driver's minor version number.
                  getMoreResults(int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Moves to this Statement object's next result, deals with any current ResultSet object(s) according to the instructions specified by the given flag, and returns true if the next result is a ResultSet object.
                  getMoreResults() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Moves to this Statement object's next result, returns true if it is a ResultSet object, and implicitly closes any current ResultSet object(s) obtained with the method getResultSet.
                  getMoreResults() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Moves to this Statement object's next result, returns true if it is a ResultSet object, and implicitly closes any current ResultSet object(s) obtained with the method getResultSet.
                  getMoreResults(int) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Moves to this Statement object's next result, deals with any current ResultSet object(s) according to the instructions specified by the given flag, and returns true if the next result is a ResultSet object.
                  getNCharacterStream(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated parameter as a java.io.Reader object in the Java programming language.
                  getNCharacterStream(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated parameter as a java.io.Reader object in the Java programming language.
                  getNCharacterStream(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader object.
                  getNCharacterStream(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader object.
                  getNClob(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC NCLOB parameter as a java.sql.NClob object in the Java programming language.
                  getNClob(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC NCLOB parameter as a java.sql.NClob object in the Java programming language.
                  getNClob(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a NClob object in the Java programming language.
                  getNClob(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a NClob object in the Java programming language.
                  getNetworkProtocol() - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Retrieves the network protocol of the data source.
                  getNetworkTimeout() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Retrieves the number of milliseconds the driver will wait for a database request to complete.
                  getNString(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated NCHAR, NVARCHAR or LONGNVARCHAR parameter as a String in the Java programming language.
                  getNString(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated NCHAR, NVARCHAR or LONGNVARCHAR parameter as a String in the Java programming language.
                  getNString(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language.
                  getNString(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language.
                  getNumericFunctions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a comma-separated list of math functions available with this database.
                  getObject(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated parameter as an Object in the Java programming language.
                  getObject(int, Map<String, Class<?>>) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Returns an object representing the value of OUT parameter parameterIndex and uses map for the custom mapping of the parameter value.
                  getObject(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a parameter as an Object in the Java programming language.
                  getObject(String, Map) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                   
                  getObject(int, Class<T>) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Returns an object representing the value of OUT parameter parameterIndex and will convert from the SQL type of the parameter to the requested Java data type, if the conversion is supported.
                  getObject(String, Class<T>) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Returns an object representing the value of OUT parameter parameterName and will convert from the SQL type of the parameter to the requested Java data type, if the conversion is supported.
                  getObject(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                   
                  getObject(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                   
                  getObject(int, Map) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as an Object in the Java programming language.
                  getObject(String, Map) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as an Object in the Java programming language.
                  getObject(int, Class<T>) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object and will convert from the SQL type of the column to the requested Java data type, if the conversion is supported.
                  getObject(String, Class<T>) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object and will convert from the SQL type of the column to the requested Java data type, if the conversion is supported.
                  getObjectInstance(Object, Name, Context, Hashtable) - Method in class org.hsqldb.jdbc.JDBCDataSourceFactory
                  Creates a DataSource object using the javax.naming.Reference object specified.
                  getOperationSpec(int) - Static method in class org.hsqldb.sample.TriggerSample
                   
                  getOverWrite() - Method in class org.hsqldb.lib.tar.DbBackup
                   
                  getParameterClassName(int) - Method in class org.hsqldb.jdbc.JDBCParameterMetaData
                  Retrieves the fully-qualified name of the Java class whose instances should be passed to the method PreparedStatement.setObject.
                  getParameterCount() - Method in class org.hsqldb.jdbc.JDBCParameterMetaData
                  Retrieves the number of parameters in the PreparedStatement object for which this ParameterMetaData object contains information.
                  getParameterMetaData() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the number, types and properties of this PreparedStatement object's parameters.
                  getParameterMode(int) - Method in class org.hsqldb.jdbc.JDBCParameterMetaData
                  Retrieves the designated parameter's mode.
                  getParameterType(int) - Method in class org.hsqldb.jdbc.JDBCParameterMetaData
                  Retrieves the designated parameter's SQL type.
                  getParameterTypeName(int) - Method in class org.hsqldb.jdbc.JDBCParameterMetaData
                  Retrieves the designated parameter's database-specific type name.
                  getParentLogger() - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Return the parent Logger of all the Loggers used by this data source.
                  getParentLogger() - Method in class org.hsqldb.jdbc.JDBCDriver
                  Return the parent Logger of all the Loggers used by this driver.
                  getParentLogger() - Method in class org.hsqldb.jdbc.JDBCDriver
                  Return the parent Logger of all the Loggers used by this driver.
                  getParentLogger() - Method in class org.hsqldb.jdbc.JDBCPool
                  Return the parent Logger of all the Loggers used by this data source.
                  getPort() - Method in class org.hsqldb.server.Server
                  Retrieves this server's host port.
                  getPrecision(int) - Method in class org.hsqldb.jdbc.JDBCParameterMetaData
                  Retrieves the designated parameter's specified column size.
                  getPrecision(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  (JDBC4 clarification:) Get the designated column's specified column size.
                  getPrimaryKeys(String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the given table's primary key columns.
                  getProcedureColumns(String, String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the given catalog's stored procedure parameter and result columns.
                  getProcedures(String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the stored procedures available in the given catalog.
                  getProcedureTerm() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the database vendor's preferred term for "procedure".
                  getProductName() - Method in class org.hsqldb.server.Server
                  Retrieves this server's product name.
                  getProductName() - Method in class org.hsqldb.server.WebServer
                  Retrieves this server's product name.
                  getProductVersion() - Method in class org.hsqldb.server.Server
                  Retrieves the server's product version, as a String.
                  getPropertyInfo(String, Properties) - Method in class org.hsqldb.jdbc.JDBCDriver
                  Gets information about the possible properties for this driver.
                  getPropertyInfo(String, Properties) - Method in class org.hsqldb.jdbc.JDBCDriver
                  Gets information about the possible properties for this driver.
                  getProtocol() - Method in class org.hsqldb.server.Server
                  Retrieves a string respresentaion of the network protocol this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'.
                  getProtocol() - Method in class org.hsqldb.server.WebServer
                  Retrieves a string respresentaion of the network protocol this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'.
                  getPseudoColumns(String, String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the pseudo or hidden columns available in a given table within the specified catalog and schema.
                  getQueryTimeout() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the number of seconds the driver will wait for a Statement object to execute.
                  getQueryTimeout() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves the number of seconds the driver will wait for a Statement object to execute.
                  getQueueSpec(int) - Static method in class org.hsqldb.sample.TriggerSample
                   
                  getRef(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC REF(<structured-type>) parameter as a Ref object in the Java programming language.
                  getRef(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC REF(<structured-type>) parameter as a Ref object in the Java programming language.
                  getRef(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a Ref object in the Java programming language.
                  getRef(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a Ref object in the Java programming language.
                  getReference() - Method in class org.hsqldb.jdbc.JDBCDataSource
                  Retrieves the Reference of this object.
                  getReference() - Method in class org.hsqldb.jdbc.JDBCPool
                  Retrieves the Reference of this object.
                  getResultSet() - Method in class org.hsqldb.jdbc.JDBCArray
                  Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object.
                  getResultSet(Map<String, Class<?>>) - Method in class org.hsqldb.jdbc.JDBCArray
                  Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object.
                  getResultSet(long, int) - Method in class org.hsqldb.jdbc.JDBCArray
                  Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements.
                  getResultSet(long, int, Map<String, Class<?>>) - Method in class org.hsqldb.jdbc.JDBCArray
                  Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements.
                  getResultSet() - Method in class org.hsqldb.jdbc.JDBCArrayBasic
                  Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object.
                  getResultSet(Map<String, Class<?>>) - Method in class org.hsqldb.jdbc.JDBCArrayBasic
                  Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object.
                  getResultSet(long, int) - Method in class org.hsqldb.jdbc.JDBCArrayBasic
                  Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements.
                  getResultSet(long, int, Map<String, Class<?>>) - Method in class org.hsqldb.jdbc.JDBCArrayBasic
                  Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements.
                  getResultSet() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the current result as a ResultSet object.
                  getResultSet() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves the current result as a ResultSet object.
                  getResultSetConcurrency() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the result set concurrency for ResultSet objects generated by this Statement object.
                  getResultSetConcurrency() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves the result set concurrency for ResultSet objects generated by this Statement object.
                  getResultSetHoldability() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  (JDBC4 clarification:) Retrieves this database's default holdability for ResultSet objects.
                  getResultSetHoldability() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the result set holdability for ResultSet objects generated by this Statement object.
                  getResultSetHoldability() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves the result set holdability for ResultSet objects generated by this Statement object.
                  getResultSetType() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the result set type for ResultSet objects generated by this Statement object.
                  getResultSetType() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves the result set type for ResultSet objects generated by this Statement object.
                  getRow() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the current row number.
                  getRowId(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC ROWID parameter as a java.sql.RowId object.
                  getRowId(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC ROWID parameter as a java.sql.RowId object.
                  getRowId(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.RowId object in the Java programming language.
                  getRowId(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.RowId object in the Java programming language.
                  getRowIdLifetime() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Indicates whether or not this data source supports the SQL ROWID type, and if so the lifetime for which a RowId object remains valid.
                  getSavepointId() - Method in class org.hsqldb.jdbc.JDBCSavepoint
                  Retrieves the generated ID for the savepoint that this Savepoint object represents.
                  getSavepointName() - Method in class org.hsqldb.jdbc.JDBCSavepoint
                  Retrieves the name of the savepoint that this Savepoint object represents.
                  getScale(int) - Method in class org.hsqldb.jdbc.JDBCParameterMetaData
                  Retrieves the designated parameter's number of digits to right of the decimal point.
                  getScale(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Gets the designated column's number of digits to right of the decimal point.
                  getSchema() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Retrieves this Connection object's current schema name.
                  getSchemaName(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Get the designated column's table's schema.
                  getSchemas() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the schema names available in this database.
                  getSchemas(String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the schema names available in this database.
                  getSchemaTerm() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the database vendor's preferred term for "schema".
                  getSearchStringEscape() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the string that can be used to escape wildcard characters.
                  getServerError() - Method in class org.hsqldb.server.Server
                  Retrieves a Throwable indicating the last server error, if any.
                  getServerId() - Method in class org.hsqldb.server.Server
                  Retrieves a String identifying this Server object.
                  getServerName() - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Retrieves the server name attribute.
                  getServerThread() - Method in class org.hsqldb.server.Server
                  Returns thread object for "HSQLDB Server" thread
                  getSession() - Method in class org.hsqldb.jdbc.JDBCConnection
                  provides cross-package access to the proprietary (i.e.
                  getShort(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC SMALLINT parameter as a short in the Java programming language.
                  getShort(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC SMALLINT parameter as a short in the Java programming language.
                  getShort(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a short in the Java programming language.
                  getShort(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a short in the Java programming language.
                  getSingleton() - Static method in class org.hsqldb.auth.AuthBeanMultiplexer
                   
                  getSource(Class<T>) - Method in class org.hsqldb.jdbc.JDBCSQLXML
                  Returns a Source for reading the XML value designated by this SQLXML instance.
                  getSQLKeywords() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a comma-separated list of all of this database's SQL keywords that are NOT also SQL:2003 keywords.
                  getSQLStateType() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  (JDBC4 modified:) Indicates whether the SQLSTATE returned by SQLException.getSQLState is X/Open (now known as Open Group) SQL CLI or SQL:2003.
                  getSQLXML(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated SQL XML parameter as a java.sql.SQLXML object in the Java programming language.
                  getSQLXML(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated SQL XML parameter as a java.sql.SQLXML object in the Java programming language.
                  getSQLXML(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet as a java.sql.SQLXML object in the Java programming language.
                  getSQLXML(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet as a java.sql.SQLXML object in the Java programming language.
                  getState() - Method in class org.hsqldb.server.Server
                  Retrieves current state of this server in numerically coded form.
                  getStateDescriptor() - Method in class org.hsqldb.server.Server
                  Retrieves a character sequence describing this server's current state, including the message of the last exception, if there is one and it is still in context.
                  getStatement() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the Statement object that produced this ResultSet object.
                  getString(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC CHAR, VARCHAR, or LONGVARCHAR parameter as a String in the Java programming language.
                  getString(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC CHAR, VARCHAR, or LONGVARCHAR parameter as a String in the Java programming language.
                  getString(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language.
                  getString(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language.
                  getString() - Method in class org.hsqldb.jdbc.JDBCSQLXML
                  Returns a string representation of the XML value designated by this SQLXML instance.
                  getStringFunctions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a comma-separated list of string functions available with this database.
                  getSubString(long, int) - Method in class org.hsqldb.jdbc.JDBCClob
                  Retrieves a copy of the specified substring in the CLOB value designated by this Clob object.
                  getSubString(long, int) - Method in class org.hsqldb.jdbc.JDBCClobClient
                  Retrieves a copy of the specified substring in the CLOB value designated by this Clob object.
                  getSubString(long, int) - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Retrieves a copy of the specified substring in the CLOB value designated by this Clob object.
                  getSuperTables(String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the table hierarchies defined in a particular schema in this database.
                  getSuperTypes(String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the user-defined type (UDT) hierarchies defined in a particular schema in this database.
                  getSystemFunctions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a comma-separated list of system functions available with this database.
                  getTableName(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Gets the designated column's table name.
                  getTablePrivileges(String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the access rights for each table available in a catalog.
                  getTables(String, String, String, String[]) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the tables available in the given catalog.
                  getTableTypes() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the table types available in this database.
                  getTime(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC TIME parameter as a java.sql.Time object.
                  getTime(int, Calendar) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC TIME parameter as a java.sql.Time object, using the given Calendar object to construct the time.
                  getTime(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC TIME parameter as a java.sql.Time object.
                  getTime(String, Calendar) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC TIME parameter as a java.sql.Time object, using the given Calendar object to construct the time.
                  getTime(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object in the Java programming language.
                  getTime(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object in the Java programming language.
                  getTime(int, Calendar) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object in the Java programming language.
                  getTime(String, Calendar) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object in the Java programming language.
                  getTimeDateFunctions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a comma-separated list of the time and date functions available with this database.
                  getTimestamp(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC TIMESTAMP parameter as a java.sql.Timestamp object.
                  getTimestamp(int, Calendar) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC TIMESTAMP parameter as a java.sql.Timestamp object, using the given Calendar object to construct the Timestamp object.
                  getTimestamp(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC TIMESTAMP parameter as a java.sql.Timestamp object.
                  getTimestamp(String, Calendar) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC TIMESTAMP parameter as a java.sql.Timestamp object, using the given Calendar object to construct the Timestamp object.
                  getTimestamp(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp object in the Java programming language.
                  getTimestamp(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp object in the Java programming language.
                  getTimestamp(int, Calendar) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp object in the Java programming language.
                  getTimestamp(String, Calendar) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp object in the Java programming language.
                  getTransactionIsolation() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Retrieves this Connection object's current transaction isolation level.
                  getTriggerDDL(String, int, String, int, String) - Static method in class org.hsqldb.sample.TriggerSample
                   
                  getTriggerDescriptor(String, int, String) - Static method in class org.hsqldb.sample.TriggerSample
                   
                  getType() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the type of this ResultSet object.
                  getTypeInfo() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of all the (JDBC4 clarification:) data types supported by this database.
                  getTypeMap() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Retrieves the Map object associated with this Connection object.
                  getUDTs(String, String, String, int[]) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of the user-defined types (UDTs) defined in a particular schema.
                  getUnicodeStream(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Deprecated. use getCharacterStream in place of getUnicodeStream
                  getUnicodeStream(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Deprecated. use getCharacterStream instead
                  getUpdateCount() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the current result as an update count; if the result is a ResultSet object or there are no more results, -1 is returned.
                  getUpdateCount() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves the current result as an update count; if the result is a ResultSet object or there are no more results, -1 is returned.
                  getURL(int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of the designated JDBC DATALINK parameter as a java.net.URL object.
                  getURL(String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves the value of a JDBC DATALINK parameter as a java.net.URL object.
                  getUrl() - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Retrieves the jdbc database connection url attribute.
                  getURL() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the URL for this DBMS.
                  getUrl() - Method in class org.hsqldb.jdbc.JDBCPool
                  Retrieves the jdbc database connection url attribute.
                  getURL(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.net.URL object in the Java programming language.
                  getURL(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the value of the designated column in the current row of this ResultSet object as a java.net.URL object in the Java programming language.
                  getUser() - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Retrieves the user name for the connection.
                  getUser() - Method in class org.hsqldb.jdbc.JDBCPool
                  Retrieves the user name for the connection.
                  getUserName() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves the user name as known to this database.
                  getUserVars() - Method in class org.hsqldb.cmdline.SqlFile
                  Get a reference to the user variable map.
                  getVersionColumns(String, String, String) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves a description of a table's columns that are automatically updated when any value in a row is updated.
                  getWarnings() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Retrieves the first warning reported by calls on this Connection object.
                  getWarnings() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves the first warning reported by calls on this Statement object.
                  getWarnings() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves the first warning reported by calls on this ResultSet object.
                  getWarnings() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves the first warning reported by calls on this Statement object.
                  getWebRoot() - Method in class org.hsqldb.server.Server
                  Retrieves the root context (directory) from which web content is served.
                  getWebRoot() - Method in class org.hsqldb.server.WebServer
                  Retrieves the root context (directory) from which web content is served.
                  getWhenSpec(int) - Static method in class org.hsqldb.sample.TriggerSample
                   
                  getWriter() - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                   

                  H

                  handle(Callback[]) - Method in class org.hsqldb.auth.JaasAuthBean.UPCallbackHandler
                   
                  handleConnection(Socket) - Method in class org.hsqldb.server.Server
                  Assigns the specified socket to a new conection handler and starts the handler in a new Thread.
                  hashCode() - Method in class org.hsqldb.jdbc.JDBCRowId
                  Returns a hash code value of this RowId object.
                  hexCharOctetsToBytes(String) - Static method in class org.hsqldb.cmdline.SqlFile
                  Convert a String to a byte array by interpreting every 2 characters as an octal byte value.
                  HOLD_CURSORS_OVER_COMMIT - Static variable in class org.hsqldb.jdbc.JDBCResultSet
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  HsqldbSlaveAuthBean - Class in org.hsqldb.auth
                  Delegates authentication decisions, and optionally determination of user roles and schema, to a different HyperSQL catalog, which may be in the same JVM or remote.
                  HsqldbSlaveAuthBean() - Constructor for class org.hsqldb.auth.HsqldbSlaveAuthBean
                   

                  I

                  id - Variable in class org.hsqldb.lib.RCData
                   
                  ignorableWhitespace(char[], int, int) - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Receive notification of ignorable whitespace in element content.
                  importDsv(String, String) - Method in class org.hsqldb.cmdline.SqlFile
                  Name is self-explanatory.
                  info(String) - Method in class org.hsqldb.lib.FrameworkLogger
                   
                  info(String, Throwable) - Method in class org.hsqldb.lib.FrameworkLogger
                  Just like FrameworkLogger.info(String), but also logs a stack trace.
                  init() - Method in class org.hsqldb.auth.HsqldbSlaveAuthBean
                   
                  init() - Method in class org.hsqldb.auth.JaasAuthBean
                   
                  init() - Method in class org.hsqldb.auth.LdapAuthBean
                   
                  INPUTERR_EXITVAL - Static variable in class org.hsqldb.cmdline.SqlTool
                   
                  INSERT_AFTER - Static variable in interface org.hsqldb.Trigger
                   
                  INSERT_AFTER_ROW - Static variable in interface org.hsqldb.Trigger
                   
                  INSERT_BEFORE_ROW - Static variable in interface org.hsqldb.Trigger
                   
                  insertRow() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Inserts the contents of the insert row into this ResultSet object and into the database.
                  insertsAreDetected(int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether or not a visible row insert can be detected by calling the method ResultSet.rowInserted.
                  invalidArgument() - Static method in class org.hsqldb.jdbc.Util
                   
                  invalidArgument(String) - Static method in class org.hsqldb.jdbc.Util
                   
                  invoke(String, String[]) - Static method in class org.hsqldb.util.MainInvoker
                  Invokes the static main(String[]) method from each specified class.
                  IOERR_EXITVAL - Static variable in class org.hsqldb.cmdline.SqlTool
                   
                  isAfterLast() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves whether the cursor is after the last row in this ResultSet object.
                  isAutoIncrement - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  Whether the value of the column are automatically numbered.
                  isAutoIncrement(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Indicates whether the designated column is automatically numbered.
                  isBeforeFirst() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves whether the cursor is before the first row in this ResultSet object.
                  isCaseSensitive - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  Whether the column's value's case matters.
                  isCaseSensitive(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Indicates whether a column's case matters.
                  isCatalogAtStart() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a catalog appears at the start of a fully qualified table name.
                  isClosed() - Method in class org.hsqldb.jdbc.JDBCBlobClient
                   
                  isClosed() - Method in class org.hsqldb.jdbc.JDBCClobClient
                   
                  isClosed() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Retrieves whether this Connection object has been closed.
                  isClosed() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves whether this Statement object has been closed.
                  isClosed() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves whether this ResultSet object has been closed.
                  isClosed() - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Retrieves whether this object is closed.
                  isClosed() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Retrieves whether this Statement object has been closed.
                  isCloseOnCompletion() - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                   
                  isCurrency - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  Whether the values in the column are cash values.
                  isCurrency(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Indicates whether the designated column is a cash value.
                  isDefaultJdkConfig() - Static method in class org.hsqldb.lib.FrameworkLogger
                  Whether this JVM is configured with java.util.logging defaults.
                  isDefinitelyWritable - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  Whether a write on the column will definitely succeed.
                  isDefinitelyWritable(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Indicates whether a write on the designated column will definitely succeed.
                  isDeleteOnFree() - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Retrieves whether an attempt to delete the backing file is made in response to invocation of JDBCBlobFile.free().
                  isDeleteOnFree() - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Retrieves whether an attempt to delete the backing file is made in response to invocation of JDBCClobFile.free().
                  isFirst() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves whether the cursor is on the first row of this ResultSet object.
                  isLast() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves whether the cursor is on the last row of this ResultSet object.
                  isNoSystemExit() - Method in class org.hsqldb.server.Server
                  Retrieves whether this server calls System.exit() when shutdown.
                  isNullable - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  The nullability of values in the column.
                  isNullable(int) - Method in class org.hsqldb.jdbc.JDBCParameterMetaData
                  Retrieves whether null values are allowed in the designated parameter.
                  isNullable(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Indicates the nullability of values in the designated column.
                  isPoolable() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Returns a value indicating whether the Statement is poolable or not.
                  isPoolable() - Method in class org.hsqldb.jdbc.JDBCStatement
                  Returns a value indicating whether the Statement is poolable or not.
                  isReadable() - Method in class org.hsqldb.jdbc.JDBCSQLXML
                  Retrieves the object's readability status.
                  isReadOnly - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  Whether the column's values are definitely not writable.
                  isReadOnly() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Retrieves whether this Connection object is in read-only mode.
                  isReadOnly() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database is in read-only mode.
                  isReadOnly(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Indicates whether the designated column is definitely not writable.
                  isRestartOnShutdown() - Method in class org.hsqldb.server.Server
                  Retrieves whether this server restarts on shutdown.
                  isSearchable - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  Whether the column's values can be used in a where clause.
                  isSearchable(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Indicates whether the designated column can be used in a where clause.
                  isSigned - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  Whether values in the column are signed numbers.
                  isSigned(int) - Method in class org.hsqldb.jdbc.JDBCParameterMetaData
                  Retrieves whether values for the designated parameter can be signed numbers.
                  isSigned(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Indicates whether values in the designated column are signed numbers.
                  isSilent() - Method in class org.hsqldb.server.Server
                  Retrieves whether silent mode operation was requested in the server properties.
                  isTls() - Method in class org.hsqldb.server.Server
                  Retrieves whether the use of secure sockets was requested in the server properties.
                  isTrace() - Method in class org.hsqldb.server.Server
                  Retrieves whether JDBC trace messages are to go to System.out or the DriverManger PrintStream/PrintWriter, if any.
                  isValid(int) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Returns true if the connection has not been closed and is still valid.
                  isWrapperFor(Class<?>) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                  isWrapperFor(Class<?>) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                  isWrapperFor(Class<?>) - Method in class org.hsqldb.jdbc.JDBCDataSource
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                  isWrapperFor(Class<?>) - Method in class org.hsqldb.jdbc.JDBCParameterMetaData
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                  isWrapperFor(Class<?>) - Method in class org.hsqldb.jdbc.JDBCPool
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                  isWrapperFor(Class<?>) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                  isWrapperFor(Class<?>) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                  isWrapperFor(Class<?>) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                  isWrapperFor(Class<?>) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Returns true if this either implements the interface argument or is directly or indirectly a wrapper for an object that does.
                  isWritable - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  Whether it is possible for a write on the column to succeed.
                  isWritable(int) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Indicates whether it is possible for a write on the designated column to succeed.
                  isWritable() - Method in class org.hsqldb.jdbc.JDBCSQLXML
                  Retrieves the object's readability status.

                  J

                  JaasAuthBean - Class in org.hsqldb.auth
                  Provides authentication and authorization (roles and initial schema) according to JAAS modules configured by the runtime JAAS implementation.
                  JaasAuthBean() - Constructor for class org.hsqldb.auth.JaasAuthBean
                   
                  JaasAuthBean.UPCallbackHandler - Class in org.hsqldb.auth
                   
                  JaasAuthBean.UPCallbackHandler(String, String) - Constructor for class org.hsqldb.auth.JaasAuthBean.UPCallbackHandler
                   
                  JDBC_MAJOR - Static variable in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                   
                  JDBCArray - Class in org.hsqldb.jdbc
                  The mapping in the Java programming language for the SQL type ARRAY.
                  JDBCArray(Object[], Type, Type, SessionInterface) - Constructor for class org.hsqldb.jdbc.JDBCArray
                   
                  JDBCArrayBasic - Class in org.hsqldb.jdbc
                  The mapping in the Java programming language for the SQL type ARRAY.
                  JDBCArrayBasic(Object[], Type) - Constructor for class org.hsqldb.jdbc.JDBCArrayBasic
                   
                  JDBCBlob - Class in org.hsqldb.jdbc
                  The representation (mapping) in the JavaTM programming language of an SQL BLOB value.
                  JDBCBlob(byte[]) - Constructor for class org.hsqldb.jdbc.JDBCBlob
                  Constructs a new JDBCBlob instance wrapping the given octet sequence.
                  JDBCBlobClient - Class in org.hsqldb.jdbc
                  A wrapper for HSQLDB BlobData objects.
                  JDBCBlobClient(SessionInterface, BlobDataID) - Constructor for class org.hsqldb.jdbc.JDBCBlobClient
                   
                  JDBCBlobFile - Class in org.hsqldb.jdbc
                  JDBCBlobFile() - Constructor for class org.hsqldb.jdbc.JDBCBlobFile
                  Convenience constructor; equivalent to JDBCBlobFile(true);
                  JDBCBlobFile(boolean) - Constructor for class org.hsqldb.jdbc.JDBCBlobFile
                  Constructs a new instance backed by a File object created in response to invoking File.createTempFile(TEMP_FILE_PREFIX,TEMP_FILE_SUFFIX)
                  JDBCBlobFile(File) - Constructor for class org.hsqldb.jdbc.JDBCBlobFile
                  Convenience constructor; equivalent to JDBCBlobFile(file, false);
                  JDBCBlobFile(File, boolean) - Constructor for class org.hsqldb.jdbc.JDBCBlobFile
                  Constructs a new instance backed by the given File object.
                  JDBCCallableStatement - Class in org.hsqldb.jdbc
                  The interface used to execute SQL stored procedures.
                  JDBCCallableStatement(JDBCConnection, String, int, int, int) - Constructor for class org.hsqldb.jdbc.JDBCCallableStatement
                  Constructs a new JDBCCallableStatement with the specified connection and result type.
                  JDBCClob - Class in org.hsqldb.jdbc
                  The mapping in the JavaTM programming language for the SQL CLOB type.
                  JDBCClob(String) - Constructor for class org.hsqldb.jdbc.JDBCClob
                  Constructs a new JDBCClob object wrapping the given character sequence.
                  JDBCClobClient - Class in org.hsqldb.jdbc
                  A wrapper for HSQLDB ClobData objects.
                  JDBCClobClient(SessionInterface, ClobDataID) - Constructor for class org.hsqldb.jdbc.JDBCClobClient
                   
                  JDBCClobFile - Class in org.hsqldb.jdbc
                  JDBCClobFile() - Constructor for class org.hsqldb.jdbc.JDBCClobFile
                  Convenience constructor for JDBCClobFile((String)null).
                  JDBCClobFile(String) - Constructor for class org.hsqldb.jdbc.JDBCClobFile
                  Constructs a new JDBCClobFile instance backed by an File object created by File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_SUFFIX), using the given encoding to read and write file content.
                  JDBCClobFile(File) - Constructor for class org.hsqldb.jdbc.JDBCClobFile
                  Convenience constructor for JDBCClobFile(file,null).
                  JDBCClobFile(File, String) - Constructor for class org.hsqldb.jdbc.JDBCClobFile
                  Constructs a new JDBCClobFile instance backed by the given File object using the given encoding to read and write file content.
                  JDBCColumnMetaData - Class in org.hsqldb.jdbc
                  Provides a site for holding the ResultSetMetaData for individual ResultSet columns.
                  JDBCColumnMetaData() - Constructor for class org.hsqldb.jdbc.JDBCColumnMetaData
                   
                  JDBCCommonDataSource - Class in org.hsqldb.jdbc
                  Common base for DataSource implementations.
                  JDBCCommonDataSource() - Constructor for class org.hsqldb.jdbc.JDBCCommonDataSource
                   
                  jdbcCompliant() - Method in class org.hsqldb.jdbc.JDBCDriver
                  Reports whether this driver is a genuine JDBC CompliantTM driver.
                  jdbcCompliant() - Method in class org.hsqldb.jdbc.JDBCDriver
                  Reports whether this driver is a genuine JDBC CompliantTM driver.
                  JDBCConnection - Class in org.hsqldb.jdbc
                   
                  JDBCConnection(HsqlProperties) - Constructor for class org.hsqldb.jdbc.JDBCConnection
                  Constructs a new external Connection to an HSQLDB Database.
                  JDBCConnection(SessionInterface) - Constructor for class org.hsqldb.jdbc.JDBCConnection
                  Constructs an INTERNAL Connection, using the specified SessionInterface.
                  JDBCConnection(JDBCConnection, JDBCConnectionEventListener) - Constructor for class org.hsqldb.jdbc.JDBCConnection
                  Constructor for use with connection pooling and XA.
                  JDBCConnectionEventListener - Interface in org.hsqldb.jdbc
                   
                  JDBCDatabaseMetaData - Class in org.hsqldb.jdbc
                  Comprehensive information about the database as a whole.
                  JDBCDataSource - Class in org.hsqldb.jdbc
                  A factory for connections to the physical data source that this DataSource object represents.
                  JDBCDataSource() - Constructor for class org.hsqldb.jdbc.JDBCDataSource
                   
                  JDBCDataSourceFactory - Class in org.hsqldb.jdbc
                  A JNDI ObjectFactory for creating data sources supported by HyperSQL JDBCDataSource for plain connections for the end user.
                  JDBCDataSourceFactory() - Constructor for class org.hsqldb.jdbc.JDBCDataSourceFactory
                   
                  JDBCDriver - Class in org.hsqldb.jdbc
                  Provides the java.sql.Driver interface implementation required by the JDBC specification.
                  JDBCDriver - Class in org.hsqldb.jdbc
                  Provides the java.sql.Driver interface implementation required by the JDBC specification.
                  JDBCDriver() - Constructor for class org.hsqldb.jdbc.JDBCDriver
                  Default constructor
                  JDBCDriver() - Constructor for class org.hsqldb.jdbc.JDBCDriver
                  Default constructor
                  JDBCNClob - Class in org.hsqldb.jdbc
                  The mapping in the JavaTM programming language for the SQL NCLOB type.
                  JDBCNClob(String) - Constructor for class org.hsqldb.jdbc.JDBCNClob
                   
                  JDBCParameterMetaData - Class in org.hsqldb.jdbc
                  An object that can be used to get information about the types and properties for each parameter marker in a PreparedStatement object.
                  JDBCPool - Class in org.hsqldb.jdbc
                  JDBCPool() - Constructor for class org.hsqldb.jdbc.JDBCPool
                  Creates a connection pool with the maximum size of 8.
                  JDBCPool(int) - Constructor for class org.hsqldb.jdbc.JDBCPool
                  Creates a connection pool with the given maximum size.
                  JDBCPreparedStatement - Class in org.hsqldb.jdbc
                  An object that represents a precompiled SQL statement.
                  JDBCResultSet - Class in org.hsqldb.jdbc
                  A table of data representing a database result set, which is usually generated by executing a statement that queries the database.
                  JDBCResultSet(JDBCConnection, JDBCStatementBase, Result, ResultMetaData) - Constructor for class org.hsqldb.jdbc.JDBCResultSet
                  Constructs a new JDBCResultSet object using the specified navigator and org.hsqldb.result.ResultMetaData.
                  JDBCResultSet(JDBCConnection, Result, ResultMetaData) - Constructor for class org.hsqldb.jdbc.JDBCResultSet
                   
                  JDBCResultSetMetaData - Class in org.hsqldb.jdbc
                  An object that can be used to get information about the types and properties of the columns in a ResultSet object.
                  JDBCRowId - Class in org.hsqldb.jdbc
                  The representation (mapping) in the Java programming language of an SQL ROWID value.
                  JDBCRowId(byte[]) - Constructor for class org.hsqldb.jdbc.JDBCRowId
                  Constructs a new JDBCRowId instance wrapping the given octet sequence.
                  JDBCRowId(RowId) - Constructor for class org.hsqldb.jdbc.JDBCRowId
                  Constructs a new JDBCRowId instance whose internal octet sequence is is a copy of the octet sequence of the given RowId object.
                  JDBCRowId(String) - Constructor for class org.hsqldb.jdbc.JDBCRowId
                  Constructs a new JDBCRowId instance whose internal octet sequence is is that represented by the given hexidecimal character sequence.
                  JDBCSavepoint - Class in org.hsqldb.jdbc
                  The representation of a savepoint, which is a point within the current transaction that can be referenced from the Connection.rollback method.
                  JDBCSQLXML - Class in org.hsqldb.jdbc
                  The mapping in the JavaTM programming language for the SQL XML type.
                  JDBCSQLXML(Source) - Constructor for class org.hsqldb.jdbc.JDBCSQLXML
                  Constructs a new read-only JDBCSQLXML object from the given Source object.
                  JDBCSQLXML.SAX2XMLStreamWriter - Class in org.hsqldb.jdbc
                  Writes to a XMLStreamWriter from SAX events.
                  JDBCSQLXML.SAX2XMLStreamWriter(XMLStreamWriter) - Constructor for class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Constructs a new SAX2XMLStreamWriter that writes SAX events to the designated XMLStreamWriter.
                  JDBCStatement - Class in org.hsqldb.jdbc
                   

                  L

                  last() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Moves the cursor to the last row in this ResultSet object.
                  LdapAuthBean - Class in org.hsqldb.auth
                  Authenticates to a HyperSQL catalog according to entries in a LDAP database.
                  LdapAuthBean() - Constructor for class org.hsqldb.auth.LdapAuthBean
                   
                  length() - Method in class org.hsqldb.jdbc.JDBCBlob
                  Returns the number of bytes in the BLOB value designated by this Blob object.
                  length() - Method in class org.hsqldb.jdbc.JDBCBlobClient
                  Returns the number of bytes in the BLOB value designated by this Blob object.
                  length() - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Returns the number of bytes in the BLOB value designated by this Blob object.
                  length() - Method in class org.hsqldb.jdbc.JDBCClob
                  Retrieves the number of characters in the CLOB value designated by this Clob object.
                  length() - Method in class org.hsqldb.jdbc.JDBCClobClient
                  Retrieves the number of characters in the CLOB value designated by this Clob object.
                  length() - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Retrieves the number of characters in the CLOB value designated by this Clob object.
                  libpath - Variable in class org.hsqldb.lib.RCData
                   
                  loadBinary(File) - Static method in class org.hsqldb.cmdline.SqlFile
                  Binary file load
                  locatorsUpdateCopy() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Indicates whether updates made to a LOB are made on a copy or directly to the LOB.
                  log(Level, String, Throwable) - Method in class org.hsqldb.lib.FrameworkLogger
                  Just like FrameworkLogger.log(Level, String), but also logs a stack trace.
                  log(Level, String) - Method in class org.hsqldb.lib.FrameworkLogger
                   
                  LS - Static variable in class org.hsqldb.cmdline.SqlFile
                  Platform-specific line separator
                  LS - Static variable in class org.hsqldb.cmdline.SqlTool
                  Platform-specific line separator
                  LS - Static variable in class org.hsqldb.util.MainInvoker
                   

                  M

                  main(String[]) - Static method in class org.hsqldb.auth.LdapAuthBean
                  Run this method to try and test configuration settings for LdapAuthBeans, or to troubleshoot.
                  main(String[]) - Static method in class org.hsqldb.cmdline.SqlTool
                  A static wrapper for objectMain, so that that method may be executed as a Java "program".
                  main(String[]) - Static method in class org.hsqldb.lib.tar.DbBackup
                  Command line invocation to create, examine, or extract HSQLDB database backup tar archives.
                  main(String[]) - Static method in class org.hsqldb.sample.SqlFileEmbedder
                  Run
                  main(String[]) - Static method in class org.hsqldb.sample.TriggerSample
                   
                  main(String[]) - Static method in class org.hsqldb.server.Server
                  Creates and starts a new Server.
                  main(String[]) - Static method in class org.hsqldb.server.ServerAcl
                  Utility method that allows interactive testing of individal ACL records, as well as the net effect of the ACL record list.
                  main(String[]) - Static method in class org.hsqldb.server.WebServer
                  Starts a new WebServer.
                  main(String[]) - Static method in class org.hsqldb.util.MainInvoker
                  Invokes the static main(String[]) method from each specified class.
                  MainInvoker - Class in org.hsqldb.util
                  Invokes the static main(String[]) method from each class specified.
                  MainInvoker() - Constructor for class org.hsqldb.util.MainInvoker
                   
                  MAX_POS - Static variable in class org.hsqldb.jdbc.JDBCBlob
                   
                  MIN_POS - Static variable in class org.hsqldb.jdbc.JDBCBlob
                   
                  moveToCurrentRow() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Moves the cursor to the remembered cursor position, usually the current row.
                  moveToInsertRow() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Moves the cursor to the insert row.

                  N

                  nativeSQL(String) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Converts the given SQL statement into the system's native SQL grammar.
                  newJDBCResultSet(Result, ResultMetaData) - Static method in class org.hsqldb.jdbc.JDBCResultSet
                  Factory method returns a new JDBCResultSet object for use with user defined functions that retrun a ResultSet object.
                  next() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Moves the cursor froward one row from its current position.
                  notify(int, int) - Method in class org.hsqldb.server.Server
                  This is called from org.hsqldb.DatabaseManager when a database is shutdown.
                  nullArgument() - Static method in class org.hsqldb.jdbc.Util
                   
                  nullPlusNonNullIsNull() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports concatenations between NULL and non-NULL values being NULL.
                  nullsAreSortedAtEnd() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether NULL values are sorted at the end regardless of sort order.
                  nullsAreSortedAtStart() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether NULL values are sorted at the start regardless of sort order.
                  nullsAreSortedHigh() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether NULL values are sorted high.
                  nullsAreSortedLow() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether NULL values are sorted low.

                  O

                  objectMain(String[]) - Static method in class org.hsqldb.cmdline.SqlTool
                  Connect to a JDBC Database and execute the commands given on stdin or in SQL file(s).
                  org.hsqldb.jdbc - package org.hsqldb.jdbc
                  Contains the HyperSQL JDBC Driver, and other classes providing JDBC functionality and support.
                  othersDeletesAreVisible(int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether deletes made by others are visible.
                  othersInsertsAreVisible(int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether inserts made by others are visible.
                  othersUpdatesAreVisible(int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether updates made by others are visible.
                  outOfRangeArgument() - Static method in class org.hsqldb.jdbc.Util
                   
                  outOfRangeArgument(String) - Static method in class org.hsqldb.jdbc.Util
                   
                  ownDeletesAreVisible(int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a result set's own deletes are visible.
                  ownInsertsAreVisible(int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a result set's own inserts are visible.
                  ownUpdatesAreVisible(int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether for the given type of ResultSet object, the result set's own updates are visible.

                  P

                  password - Variable in class org.hsqldb.lib.RCData
                   
                  permitAccess(String) - Method in class org.hsqldb.server.ServerAcl
                  Uses system network libraries to resolve the given String to an IP addr, then determine whether this address is permitted or denied.
                  permitAccess(byte[]) - Method in class org.hsqldb.server.ServerAcl
                   
                  position(byte[], long) - Method in class org.hsqldb.jdbc.JDBCBlob
                  Retrieves the byte position at which the specified byte array pattern begins within the BLOB value that this Blob object represents.
                  position(Blob, long) - Method in class org.hsqldb.jdbc.JDBCBlob
                  Retrieves the byte position in the BLOB value designated by this Blob object at which pattern begins.
                  position(byte[], long) - Method in class org.hsqldb.jdbc.JDBCBlobClient
                  Retrieves the byte position at which the specified byte array pattern begins within the BLOB value that this Blob object represents.
                  position(Blob, long) - Method in class org.hsqldb.jdbc.JDBCBlobClient
                  Retrieves the byte position in the BLOB value designated by this Blob object at which pattern begins.
                  position(byte[], long) - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Retrieves the byte position at which the specified byte array pattern begins within the BLOB value that this Blob object represents.
                  position(Blob, long) - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Retrieves the byte position in the BLOB value designated by this Blob object at which pattern begins.
                  position(String, long) - Method in class org.hsqldb.jdbc.JDBCClob
                  Retrieves the character position at which the specified substring searchstr appears in the SQL CLOB value represented by this Clob object.
                  position(Clob, long) - Method in class org.hsqldb.jdbc.JDBCClob
                  Retrieves the character position at which the specified Clob object searchstr appears in this Clob object.
                  position(String, long) - Method in class org.hsqldb.jdbc.JDBCClobClient
                  Retrieves the character position at which the specified substring searchstr appears in the SQL CLOB value represented by this Clob object.
                  position(Clob, long) - Method in class org.hsqldb.jdbc.JDBCClobClient
                  Retrieves the character position at which the specified Clob object searchstr appears in this Clob object.
                  position(char[], long) - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Retrieves the character position at which the specified char[] pattern appears in the CLOB value represented by this Clob object.
                  position(String, long) - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Retrieves the character position at which the specified Clob object searchstr appears in this Clob object.
                  position(Clob, long) - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Retrieves the character position at which the specified Clob object searchstr appears in this Clob object.
                  precision - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  The column's value's number of decimal digits.
                  prepareCall(String) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a CallableStatement object for calling database stored procedures.
                  prepareCall(String, int, int) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a CallableStatement object that will generate ResultSet objects with the given type and concurrency.
                  prepareCall(String, int, int, int) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a CallableStatement object that will generate ResultSet objects with the given type and concurrency.
                  prepareStatement(String) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a PreparedStatement object for sending parameterized SQL statements to the database.
                  prepareStatement(String, int, int) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a PreparedStatement object that will generate ResultSet objects with the given type and concurrency.
                  prepareStatement(String, int, int, int) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a PreparedStatement object that will generate ResultSet objects with the given type, concurrency, and holdability.
                  prepareStatement(String, int) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a default PreparedStatement object that has the capability to retrieve auto-generated keys.
                  prepareStatement(String, int[]) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a default PreparedStatement object capable of returning the auto-generated keys designated by the given array.
                  prepareStatement(String, String[]) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a default PreparedStatement object capable of returning the auto-generated keys designated by the given array.
                  previous() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Moves the cursor to the previous row in this ResultSet object.
                  privlog(Level, String, Throwable, int, Class) - Method in class org.hsqldb.lib.FrameworkLogger
                  The "priv" prefix is historical.
                  processingInstruction(String, String) - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Receive notification of a processing instruction.
                  putPropertiesFromFile(String) - Method in class org.hsqldb.server.Server
                  Attempts to put properties from the file with the specified path.
                  putPropertiesFromFile(String, String) - Method in class org.hsqldb.server.Server
                  Attempts to put properties from the file with given extension.
                  putPropertiesFromString(String) - Method in class org.hsqldb.server.Server
                  Puts properties from the supplied string argument.

                  R

                  RCData - Class in org.hsqldb.lib
                  Manages all the details we need to connect up to JDBC database(s), in a declarative way.
                  RCData(File, String) - Constructor for class org.hsqldb.lib.RCData
                  Creates a RCDataObject by looking up the given key in the given authentication file.
                  RCData(String, String, String, String, String, String, String) - Constructor for class org.hsqldb.lib.RCData
                  Convenience constructor for backward compatibility.
                  RCData(String, String, String, String, String, String, String, String) - Constructor for class org.hsqldb.lib.RCData
                  Wrapper for unset Transaction Isolation.
                  RCData(String, String, String, String, String, String, String, String, String) - Constructor for class org.hsqldb.lib.RCData
                  Creates a new RCData object.
                  RCERR_EXITVAL - Static variable in class org.hsqldb.cmdline.SqlTool
                   
                  refreshRow() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Refreshes the current row with its most recent value in the database.
                  registerOutParameter(int, int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Registers the OUT parameter in ordinal position parameterIndex to the JDBC type sqlType.
                  registerOutParameter(int, int, int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Registers the parameter in ordinal position parameterIndex to be of JDBC type sqlType.
                  registerOutParameter(int, int, String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Registers the designated output parameter.
                  registerOutParameter(String, int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Registers the OUT parameter named parameterName to the JDBC type sqlType.
                  registerOutParameter(String, int, int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Registers the parameter named parameterName to be of JDBC type sqlType.
                  registerOutParameter(String, int, String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Registers the designated output parameter.
                  relative(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Moves the cursor a relative number of rows, either positive or negative.
                  releaseSavepoint(Savepoint) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Removes the specified Savepoint (JDBC4 Clarification:) and subsequent Savepoint objects from the current transaction.
                  report() - Static method in class org.hsqldb.lib.FrameworkLogger
                  Utility method for integrators.
                  reset() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Resets this connection so it can be used again.
                  result - Variable in class org.hsqldb.jdbc.JDBCResultSet
                  The underlying result.
                  rollback() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Undoes all changes made in the current transaction and releases any database locks currently held by this Connection object.
                  rollback(Savepoint) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Undoes all changes made after the given Savepoint object was set.
                  rowDeleted() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves whether a row has been deleted.
                  rowInserted() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves whether the current row has had an insertion.
                  rowUpdated() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Retrieves whether the current row has been updated.

                  S

                  scale - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  The column's value's number of digits to right of the decimal point.
                  schemaName - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  The column's table's schema.
                  Server - Class in org.hsqldb.server
                  The HSQLDB HSQL protocol network database server.
                  Server() - Constructor for class org.hsqldb.server.Server
                  Creates a new Server instance handling HSQL protocol connections.
                  ServerAcl - Class in org.hsqldb.server
                  A list of ACL permit and deny entries with a permitAccess method which tells whether candidate addresses are permitted or denied by this ACL list.
                  ServerAcl(File) - Constructor for class org.hsqldb.server.ServerAcl
                   
                  ServerAcl.AclFormatException - Exception in org.hsqldb.server
                   
                  ServerAcl.AclFormatException(String) - Constructor for exception org.hsqldb.server.ServerAcl.AclFormatException
                   
                  setAbortUponModify(boolean) - Method in class org.hsqldb.lib.tar.DbBackup
                  Defaults to true.
                  setAccessAttribute(String) - Method in class org.hsqldb.auth.LdapAuthBean
                  Set the attribute name of the RDN + parentDn entries which will be consulted to decide whether the user can access the HyperSQL database.
                  setAccessValuePattern(Pattern) - Method in class org.hsqldb.auth.LdapAuthBean
                  Assign a pattern to detect honored accessAttribute values.
                  setAccessValuePatternString(String) - Method in class org.hsqldb.auth.LdapAuthBean
                  String wrapper for method setAccessValuePattern(Pattern) Use the (x?) Pattern constructs to set options.
                  setAddress(String) - Method in class org.hsqldb.server.Server
                  Sets the InetAddress with which this server's ServerSocket will be constructed.
                  setApplicationKey(String) - Method in class org.hsqldb.auth.JaasAuthBean
                  Set the key into the JAAS runtime configuration.
                  setArray(int, Array) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given java.sql.Array object.
                  setAsciiStream(String, InputStream, int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                  setAsciiStream(String, InputStream, long) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                  setAsciiStream(String, InputStream) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given input stream.
                  setAsciiStream(long) - Method in class org.hsqldb.jdbc.JDBCClob
                  Retrieves a stream to be used to write ASCII characters to the CLOB value that this Clob object represents, starting at position pos.
                  setAsciiStream(long) - Method in class org.hsqldb.jdbc.JDBCClobClient
                  Retrieves a stream to be used to write Ascii characters to the CLOB value that this Clob object represents, starting at position pos.
                  setAsciiStream(long) - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Retrieves a stream to be used to write Ascii characters to the CLOB value that this Clob object represents, starting at position pos.
                  setAsciiStream(int, InputStream, int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                  setAsciiStream(int, InputStream, long) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                  setAsciiStream(int, InputStream) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given input stream.
                  setAuthFunctionBean(Connection, AuthFunctionBean) - Method in class org.hsqldb.auth.AuthBeanMultiplexer
                  Exactly the same as setAuthFunctionBeans(String, List) other than taking an open Connection to identify the database.
                  setAuthFunctionBean(String, AuthFunctionBean) - Method in class org.hsqldb.auth.AuthBeanMultiplexer
                  This is not an "adder" function, but a "setter" function for the specified dbName , so do not use this to add to a database's FunctionBeans, but to assign ths single given AuthFunctionBean as the specified database's authenticator.
                  setAuthFunctionBeans(Map<String, List<AuthFunctionBean>>) - Method in class org.hsqldb.auth.AuthBeanMultiplexer
                  Primary purpose of this class is to manage this static map.
                  setAuthFunctionBeans(Connection, List<AuthFunctionBean>) - Method in class org.hsqldb.auth.AuthBeanMultiplexer
                  Wrapper for setAuthFunctioNBeans(String, List)
                  setAuthFunctionBeans(String, List<AuthFunctionBean>) - Method in class org.hsqldb.auth.AuthBeanMultiplexer
                  This is not an "adder" function, but a "setter" function for the specified dbName , so do not use this to add to a database's FunctionBeans, but to assign the entire list for that database.
                  setAutoClose(boolean) - Method in class org.hsqldb.cmdline.SqlFile
                  Specify whether the supplied or generated input Reader should automatically be closed by the execute() method.
                  setAutoCommit(boolean) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Sets this connection's auto-commit mode to the given state.
                  setBigDecimal(String, BigDecimal) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given java.math.BigDecimal value.
                  setBigDecimal(int, BigDecimal) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given java.math.BigDecimal value.
                  setBinaryStream(long) - Method in class org.hsqldb.jdbc.JDBCBlob
                  Retrieves a stream that can be used to write to the BLOB value that this Blob object represents.
                  setBinaryStream(long) - Method in class org.hsqldb.jdbc.JDBCBlobClient
                  Retrieves a stream that can be used to write to the BLOB value that this Blob object represents.
                  setBinaryStream(long) - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Retrieves a stream that can be used to write to the BLOB value that this Blob object represents.
                  setBinaryStream(String, InputStream, int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                  setBinaryStream(String, InputStream, long) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                  setBinaryStream(String, InputStream) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given input stream.
                  setBinaryStream(int, InputStream, int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                  setBinaryStream(int, InputStream, long) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given input stream, which will have the specified number of bytes.
                  setBinaryStream(int, InputStream) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given input stream.
                  setBinaryStream() - Method in class org.hsqldb.jdbc.JDBCSQLXML
                  Retrieves a stream that can be used to write the XML value that this SQLXML instance represents.
                  setBlob(String, InputStream, long) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to a InputStream object.
                  setBlob(String, Blob) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given java.sql.Blob object.
                  setBlob(String, InputStream) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to a InputStream object.
                  setBlob(int, Blob) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given java.sql.Blob object.
                  setBlob(int, InputStream, long) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to a InputStream object.
                  setBlob(int, InputStream) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to a InputStream object.
                  setBoolean(String, boolean) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given Java boolean value.
                  setBoolean(int, boolean) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given Java boolean value.
                  setByte(String, byte) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given Java byte value.
                  setByte(int, byte) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given Java byte value.
                  setBytes(long, byte[]) - Method in class org.hsqldb.jdbc.JDBCBlob
                  Writes the given array of bytes to the BLOB value that this Blob object represents, starting at position pos, and returns the number of bytes written.
                  setBytes(long, byte[], int, int) - Method in class org.hsqldb.jdbc.JDBCBlob
                  Writes all or part of the given byte array to the BLOB value that this Blob object represents and returns the number of bytes written.
                  setBytes(long, byte[]) - Method in class org.hsqldb.jdbc.JDBCBlobClient
                  Writes the given array of bytes to the BLOB value that this Blob object represents, starting at position pos, and returns the number of bytes written.
                  setBytes(long, byte[], int, int) - Method in class org.hsqldb.jdbc.JDBCBlobClient
                  Writes all or part of the given byte array to the BLOB value that this Blob object represents and returns the number of bytes written.
                  setBytes(long, byte[]) - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Writes the given array of bytes to the BLOB value that this Blob object represents, starting at position pos, and returns the number of bytes written.
                  setBytes(long, byte[], int, int) - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Writes all or part of the given byte array to the BLOB value that this Blob object represents and returns the number of bytes written.
                  setBytes(String, byte[]) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given Java array of bytes.
                  setBytes(int, byte[]) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given Java array of bytes.
                  setCatalog(String) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Sets the given catalog name in order to select a subspace of this Connection object's database in which to work.
                  setCharacterStream(String, Reader, int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given Reader object, which is the given number of characters long.
                  setCharacterStream(String, Reader, long) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given Reader object, which is the given number of characters long.
                  setCharacterStream(String, Reader) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given Reader object.
                  setCharacterStream(long) - Method in class org.hsqldb.jdbc.JDBCClob
                  Retrieves a stream to be used to write a stream of Unicode characters to the CLOB value that this Clob object represents, at position pos.
                  setCharacterStream(long) - Method in class org.hsqldb.jdbc.JDBCClobClient
                  Retrieves a stream to be used to write a stream of Unicode characters to the CLOB value that this Clob object represents, at position pos.
                  setCharacterStream(long) - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Retrieves a stream to be used to write a stream of Unicode characters to the CLOB value that this Clob object represents, at position pos.
                  setCharacterStream(int, Reader, int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given Reader object, which is the given number of characters long.
                  setCharacterStream(int, Reader, long) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given Reader object, which is the given number of characters long.
                  setCharacterStream(int, Reader) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given Reader object.
                  setCharacterStream() - Method in class org.hsqldb.jdbc.JDBCSQLXML
                  Retrieves a stream to be used to write the XML value that this SQLXML instance represents.
                  setClientInfo(String, String) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Sets the value of the client info property specified by name to the value specified by value.
                  setClientInfo(Properties) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Sets the value of the connection's client info properties.
                  setClob(String, Reader, long) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to a Reader object.
                  setClob(String, Clob) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given java.sql.Clob object.
                  setClob(String, Reader) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to a Reader object.
                  setClob(int, Clob) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given java.sql.Clob object.
                  setClob(int, Reader, long) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to a Reader object.
                  setClob(int, Reader) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to a Reader object.
                  setConnection(Connection) - Method in class org.hsqldb.cmdline.SqlFile
                   
                  setContinueOnError(boolean) - Method in class org.hsqldb.cmdline.SqlFile
                   
                  setCursorName(String) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the SQL cursor name to the given String, which will be used by subsequent Statement object execute methods.
                  setCursorName(String) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Sets the SQL cursor name to the given String, which will be used by subsequent Statement object execute methods.
                  setDaemon(boolean) - Method in class org.hsqldb.server.Server
                  Sets whether server thread is a daemon.
                  setDatabase(String) - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Synonym for setUrl(String).
                  setDatabase(String) - Method in class org.hsqldb.jdbc.JDBCPool
                  Synonym for setUrl(String).
                  setDatabaseName(String) - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Synonym for setUrl(String).
                  setDatabaseName(String) - Method in class org.hsqldb.jdbc.JDBCPool
                  Synonym for setUrl(String).
                  setDatabaseName(int, String) - Method in class org.hsqldb.server.Server
                  Sets the external name (url alias) of the i'th hosted database.
                  setDatabasePath(int, String) - Method in class org.hsqldb.server.Server
                  Sets the path of the hosted database.
                  setDate(String, Date) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given java.sql.Date value (JDBC4 clarification:)
                  setDate(String, Date, Calendar) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given java.sql.Date value, using the given Calendar object.
                  setDate(int, Date) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  (JDBC4 clarification:) Sets the designated parameter to the given java.sql.Date value using the default time zone of the virtual machine that is running the application.
                  setDate(int, Date, Calendar) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given java.sql.Date value, using the given Calendar object.
                  setDefaultJdbcDriver(String) - Method in class org.hsqldb.lib.RCData
                   
                  setDefaultWebPage(String) - Method in class org.hsqldb.server.Server
                  Sets the name of the web page served when no page is specified.
                  setDelegateRolesSchema(boolean) - Method in class org.hsqldb.auth.HsqldbSlaveAuthBean
                  Defaults to true.
                  setDeleteOnFree(boolean) - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Assigns whether an attempt to delete the backing file is made in response to invocation of JDBCBlobFile.free().
                  setDeleteOnFree(boolean) - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Assigns whether an attempt to delete the backing file is made in response to invocation of JDBCClobFile.free().
                  setDocumentLocator(Locator) - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Receive an object for locating the origin of SAX document events.
                  setDouble(String, double) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given Java double value.
                  setDouble(int, double) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given Java double value.
                  setErrWriter(PrintWriter) - Method in class org.hsqldb.server.Server
                  Sets the PrintWriter to which server errors are logged.
                  setEscapeProcessing(boolean) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets escape processing on or off.
                  setEscapeProcessing(boolean) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Sets escape processing on or off.
                  setFetchDirection(int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Gives the driver a hint as to the direction in which rows will be processed in ResultSet objects created using this Statement object.
                  setFetchDirection(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Gives a hint as to the direction in which the rows in this ResultSet object will be processed.
                  setFetchDirection(int) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Gives the driver a hint as to the direction in which rows will be processed in ResultSet objects created using this Statement object.
                  setFetchSize(int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  (JDBC4 clarification:) Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for ResultSet objects genrated by this Statement.
                  setFetchSize(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for this ResultSet object.
                  setFetchSize(int) - Method in class org.hsqldb.jdbc.JDBCStatement
                  (JDBC4 clarification:) Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for ResultSet objects genrated by this Statement.
                  setFileIgnore(String) - Method in class org.hsqldb.lib.tar.DbBackup
                   
                  setFloat(String, float) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given Java float value.
                  setFloat(int, float) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given Java float value.
                  setHoldability(int) - Method in class org.hsqldb.jdbc.JDBCConnection
                  (JDBC4 Clarification:) Changes the default holdability of ResultSet objects created using this Connection object to the given holdability.
                  setInitialContextFactory(String) - Method in class org.hsqldb.auth.LdapAuthBean
                  Most users should not call this, and will get the default of "com.sun.jndi.ldap.LdapCtxFactory".
                  setInt(String, int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given Java int value.
                  setInt(int, int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given Java int value.
                  setLdapHost(String) - Method in class org.hsqldb.auth.LdapAuthBean
                  Do not specify URL scheme ("ldap:") because that is implied.
                  setLdapPort(int) - Method in class org.hsqldb.auth.LdapAuthBean
                   
                  setLoginTimeout(int) - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Sets the maximum time in seconds that this data source will wait while attempting to connect to a database.
                  setLoginTimeout(int) - Method in class org.hsqldb.jdbc.JDBCPool
                  Sets the maximum time in seconds that this data source will wait while attempting to connect to a database.
                  setLogWriter(PrintWriter) - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Sets the log writer for this DataSource object to the given java.io.PrintWriter object.
                  setLogWriter(PrintWriter) - Method in class org.hsqldb.jdbc.JDBCPool
                  Sets the log writer for this DataSource object to the given java.io.PrintWriter object.
                  setLogWriter(PrintWriter) - Method in class org.hsqldb.server.Server
                  Sets the PrintWriter to which server messages are logged.
                  setLong(String, long) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given Java long value.
                  setLong(int, long) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given Java long value.
                  setMasterJdbcUrl(String) - Method in class org.hsqldb.auth.HsqldbSlaveAuthBean
                   
                  setMaxFieldSize(int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  (JDBC4 clarification:) Sets the limit for the maximum number of bytes in a ResultSet Sets the limit for the maximum number of bytes that can be returned for character and binary column values in a ResultSet object produced by this Statement object.
                  setMaxFieldSize(int) - Method in class org.hsqldb.jdbc.JDBCStatement
                  (JDBC4 clarification:) Sets the limit for the maximum number of bytes in a ResultSet Sets the limit for the maximum number of bytes that can be returned for character and binary column values in a ResultSet object produced by this Statement object.
                  setMaxHistoryLength(int) - Method in class org.hsqldb.cmdline.SqlFile
                   
                  setMaxRows(int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  (JDBC4 clarification:) Sets the limit for the maximum number of rows that any ResultSet object generated by this Statement object can contain to the given number.
                  setMaxRows(int) - Method in class org.hsqldb.jdbc.JDBCStatement
                  (JDBC4 clarification:) Sets the limit for the maximum number of rows that any ResultSet object generated by this Statement object can contain to the given number.
                  setNCharacterStream(String, Reader, long) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to a Reader object.
                  setNCharacterStream(String, Reader) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to a Reader object.
                  setNCharacterStream(int, Reader, long) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to a Reader object.
                  setNCharacterStream(int, Reader) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to a Reader object.
                  setNClob(String, NClob) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to a java.sql.NClob object.
                  setNClob(String, Reader, long) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to a Reader object.
                  setNClob(String, Reader) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to a Reader object.
                  setNClob(int, NClob) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to a java.sql.NClob object.
                  setNClob(int, Reader, long) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to a Reader object.
                  setNClob(int, Reader) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to a Reader object.
                  setNetworkTimeout(Executor, int) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Sets the maximum period a Connection or objects created from the Connection will wait for the database to reply to any one request.
                  setNoSystemExit(boolean) - Method in class org.hsqldb.server.Server
                  Sets whether this server calls System.exit() when shutdown.
                  setNString(String, String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given String object.
                  setNString(int, String) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated paramter to the given String object.
                  setNull(String, int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to SQL NULL.
                  setNull(String, int, String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to SQL NULL.
                  setNull(int, int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to SQL NULL.
                  setNull(int, int, String) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to SQL NULL.
                  setObject(String, Object, int, int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the value of the designated parameter with the given object.
                  setObject(String, Object, int) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the value of the designated parameter with the given object.
                  setObject(String, Object) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the value of the designated parameter with the given object.
                  setObject(int, Object, int, int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the value of the designated parameter with the given object.
                  setObject(int, Object, int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the value of the designated parameter with the given object.
                  setObject(int, Object) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                   
                  setOverWrite(boolean) - Method in class org.hsqldb.lib.tar.DbBackup
                  Defaults to false.
                  setParentDn(String) - Method in class org.hsqldb.auth.LdapAuthBean
                  Set DN which is parent of the user DNs.
                  setPassword(String) - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Sets the password for the user name.
                  setPassword(String) - Method in class org.hsqldb.jdbc.JDBCPool
                  Sets the password for the user name.
                  setPoolable(boolean) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Requests that a Statement be pooled or not pooled.
                  setPoolable(boolean) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Requests that a Statement be pooled or not pooled.
                  setPort(int) - Method in class org.hsqldb.server.Server
                  Sets the server listen port.
                  setPrincipalTemplate(String) - Method in class org.hsqldb.auth.LdapAuthBean
                  A template String containing place-holder token '${username}'.
                  setPrintWriter(PrintWriter) - Method in class org.hsqldb.server.ServerAcl
                   
                  setProperties(Properties) - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Sets connection properties.
                  setProperties(Properties) - Method in class org.hsqldb.jdbc.JDBCPool
                  Sets connection properties.
                  setProperties(HsqlProperties) - Method in class org.hsqldb.server.Server
                  Sets server properties using the specified properties object
                  setQueryTimeout(int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the number of seconds the driver will wait for a Statement object to execute to the given number of seconds.
                  setQueryTimeout(int) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Sets the number of seconds the driver will wait for a Statement object to execute to the given number of seconds.
                  setRdnAttribute(String) - Method in class org.hsqldb.auth.LdapAuthBean
                  rdnAttribute must hold the user name exactly as the HyperSQL login will be made with.
                  setReadOnly(boolean) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Puts this connection in read-only mode as a hint to the driver to enable database optimizations.
                  setRef(int, Ref) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given REF(<structured-type>) value.
                  setRestartOnShutdown(boolean) - Method in class org.hsqldb.server.Server
                  Sets whether this server restarts on shutdown.
                  setResult(Class<T>) - Method in class org.hsqldb.jdbc.JDBCSQLXML
                  Returns a Result for setting the XML value designated by this SQLXML instance.
                  setRoleSchemaValuePattern(Pattern) - Method in class org.hsqldb.auth.JaasAuthBean
                  Assign a pattern to both detect honored values, and optionally to map from a single principal name or public credential string to a single HyperSQL role or schema string.
                  setRoleSchemaValuePattern(Pattern) - Method in class org.hsqldb.auth.LdapAuthBean
                  Assign a pattern to both detect honored values, and to map from a single value of "rolesSchemaAttribute"s to a HyperSQL role or schema string.
                  setRoleSchemaValuePatternString(String) - Method in class org.hsqldb.auth.JaasAuthBean
                  String wrapper for method setRoleSchemaValuePattern(Pattern) Use the (x?) Pattern constructs to set options.
                  setRoleSchemaValuePatternString(String) - Method in class org.hsqldb.auth.LdapAuthBean
                  String wrapper for method setRoleSchemaValuePattern(Pattern) Use the (x?) Pattern constructs to set options.
                  setRoleSchemaViaCredential(boolean) - Method in class org.hsqldb.auth.JaasAuthBean
                  By default, If roleSchemaValuePattern is set, then role and schema values are obtained from principle values; otherwise existing account privileges are used (if any).
                  setRolesSchemaAttribute(String) - Method in class org.hsqldb.auth.LdapAuthBean
                  Set the attribute name of the RDN + parentDn entries in which is stored the list of roles and optional schema for the authenticating user.
                  setRowId(String, RowId) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given java.sql.RowId object.
                  setRowId(int, RowId) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given java.sql.RowId object.
                  setSaslRealm(String) - Method in class org.hsqldb.auth.LdapAuthBean
                  Some LDAP servers using a SASL mechanism require a realm to be specified, and some mechanisms allow a realm to be specified if you wish to use that feature.
                  setSavepoint() - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates an unnamed savepoint in the current transaction and returns the new Savepoint object that represents it.
                  setSavepoint(String) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Creates a savepoint with the given name in the current transaction and returns the new Savepoint object that represents it.
                  setSchema(String) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Sets the given schema name to access.
                  setSecurityMechanism(String) - Method in class org.hsqldb.auth.LdapAuthBean
                  Defaults to "SIMPLE".
                  setShort(String, short) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given Java short value.
                  setShort(int, short) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given Java short value.
                  setSilent(boolean) - Method in class org.hsqldb.server.Server
                  Sets silent mode operation
                  setSQLXML(String, SQLXML) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given java.sql.SQLXML object.
                  setSQLXML(int, SQLXML) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given java.sql.SQLXML object.
                  setStartTls(boolean) - Method in class org.hsqldb.auth.LdapAuthBean
                  If this is set, then the entire (brief) transaction with the LDAP server will be encrypted.
                  setStream(String, InputStreamInterface) - Method in class org.hsqldb.lib.tar.DbBackup
                  Overrides file with stream.
                  setString(String, String) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given Java String value.
                  setString(long, String) - Method in class org.hsqldb.jdbc.JDBCClob
                  Writes the given Java String to the CLOB value that this Clob object designates at the position pos.
                  setString(long, String, int, int) - Method in class org.hsqldb.jdbc.JDBCClob
                  Writes len characters of str, starting at character offset, to the CLOB value that this Clob represents.
                  setString(long, String) - Method in class org.hsqldb.jdbc.JDBCClobClient
                  Writes the given Java String to the CLOB value that this Clob object designates at the position pos.
                  setString(long, String, int, int) - Method in class org.hsqldb.jdbc.JDBCClobClient
                  Writes len characters of str, starting at character offset, to the CLOB value that this Clob represents.
                  setString(long, String) - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Writes the given Java String to the CLOB value that this Clob object designates at the position pos.
                  setString(long, String, int, int) - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Writes len characters of str, starting at character offset, to the CLOB value that this Clob represents.
                  setString(int, String) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given Java String value.
                  setString(String) - Method in class org.hsqldb.jdbc.JDBCSQLXML
                  Sets the XML value designated by this SQLXML instance to the given String representation.
                  setTI(Connection, String) - Static method in class org.hsqldb.lib.RCData
                  Set Transaction Isolation level on the specified JDBC Connection
                  setTime(String, Time) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given java.sql.Time value.
                  setTime(String, Time, Calendar) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given java.sql.Time value, using the given Calendar object.
                  setTime(int, Time) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given java.sql.Time value.
                  setTime(int, Time, Calendar) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given java.sql.Time value, using the given Calendar object.
                  setTimestamp(String, Timestamp) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given java.sql.Timestamp value.
                  setTimestamp(String, Timestamp, Calendar) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given java.sql.Timestamp value, using the given Calendar object.
                  setTimestamp(int, Timestamp) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given java.sql.Timestamp value.
                  setTimestamp(int, Timestamp, Calendar) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given java.sql.Timestamp value, using the given Calendar object.
                  setTls(boolean) - Method in class org.hsqldb.server.Server
                  Sets whether to use secure sockets
                  setTrace(boolean) - Method in class org.hsqldb.server.Server
                  Sets whether trace messages go to System.out or the DriverManger PrintStream/PrintWriter, if any.
                  setTransactionIsolation(int) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Attempts to change the transaction isolation level for this Connection object to the one given.
                  setTypeMap(Map<String, Class<?>>) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Installs the given TypeMap object as the type map for this Connection object.
                  setUnicodeStream(int, InputStream, int) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Deprecated. Sun does not include a reason, but presumably this is because setCharacterStream is now prefered
                  setURL(String, URL) - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Sets the designated parameter to the given java.net.URL object.
                  setUrl(String) - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Sets the jdbc database URL.
                  setUrl(String) - Method in class org.hsqldb.jdbc.JDBCPool
                  Sets the jdbc database URL.
                  setURL(int, URL) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Sets the designated parameter to the given java.net.URL value.
                  setUser(String) - Method in class org.hsqldb.jdbc.JDBCCommonDataSource
                  Sets the user name.
                  setUser(String) - Method in class org.hsqldb.jdbc.JDBCPool
                  Sets the user name.
                  setValidationPassword(String) - Method in class org.hsqldb.auth.HsqldbSlaveAuthBean
                  Use this method and setValidationUser if you want access to the master database to be verified upon instance initialization.
                  setValidationUser(String) - Method in class org.hsqldb.auth.HsqldbSlaveAuthBean
                  Use this method and setValidationPassword if you want access to the master database to be verified upon instance initialization.
                  setWebRoot(String) - Method in class org.hsqldb.server.Server
                  Sets the path of the root directory from which web content is served.
                  setWritable(JDBCResultSet, int) - Method in class org.hsqldb.jdbc.JDBCBlobClient
                   
                  setWritable(JDBCResultSet, int) - Method in class org.hsqldb.jdbc.JDBCClobClient
                   
                  severe(String) - Method in class org.hsqldb.lib.FrameworkLogger
                   
                  severe(String, Throwable) - Method in class org.hsqldb.lib.FrameworkLogger
                  Just like FrameworkLogger.severe(String), but also logs a stack trace.
                  shutdown() - Method in class org.hsqldb.server.Server
                  External method to shut down this server.
                  shutdownCatalogs(int) - Method in class org.hsqldb.server.Server
                  Shuts down all the database served by this server.
                  shutdownWithCatalogs(int) - Method in class org.hsqldb.server.Server
                  Shuts down this server and all the database served by this server.
                  signalCloseAllServerConnections() - Method in class org.hsqldb.server.Server
                  Closes all connections to this Server.
                  skippedEntity(String) - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Receive notification of a skipped entity.
                  SQLERR_EXITVAL - Static variable in class org.hsqldb.cmdline.SqlTool
                   
                  sqlException(HsqlException) - Static method in class org.hsqldb.jdbc.Util
                   
                  sqlException(HsqlException, Throwable) - Static method in class org.hsqldb.jdbc.Util
                   
                  sqlException(int) - Static method in class org.hsqldb.jdbc.Util
                   
                  sqlException(int, String) - Static method in class org.hsqldb.jdbc.Util
                   
                  sqlException(int, String, Throwable) - Static method in class org.hsqldb.jdbc.Util
                   
                  sqlException(int, int) - Static method in class org.hsqldb.jdbc.Util
                   
                  sqlException(Throwable) - Static method in class org.hsqldb.jdbc.Util
                   
                  sqlException(Result) - Static method in class org.hsqldb.jdbc.Util
                   
                  sqlException(String, String, int, Throwable) - Static method in class org.hsqldb.jdbc.Util
                   
                  sqlExceptionSQL(int) - Static method in class org.hsqldb.jdbc.Util
                   
                  SqlFile - Class in org.hsqldb.cmdline
                  Encapsulation of SQL text and the environment under which it will executed with a JDBC Connection.
                  SqlFile(File) - Constructor for class org.hsqldb.cmdline.SqlFile
                  Convenience wrapper for the SqlFile(File, String) constructor
                  SqlFile(File, String) - Constructor for class org.hsqldb.cmdline.SqlFile
                  Convenience wrapper for the SqlFile(File, String, boolean) constructor
                  SqlFile(File, String, boolean) - Constructor for class org.hsqldb.cmdline.SqlFile
                  Constructor for non-interactive usage with a SQL file, using the specified encoding and sending normal output to stdout.
                  SqlFile(String, boolean) - Constructor for class org.hsqldb.cmdline.SqlFile
                  Constructor for interactive usage with stdin/stdout
                  SqlFile(Reader, String, PrintStream, String, boolean, File) - Constructor for class org.hsqldb.cmdline.SqlFile
                  Instantiate a SqlFile instance for SQL input from 'reader'.
                  SqlFileEmbedder - Class in org.hsqldb.sample
                  Sample class which executes SQL files, by embedding SqlFile.
                  SqlFileEmbedder(File, String) - Constructor for class org.hsqldb.sample.SqlFileEmbedder
                  Instantiates SqlFileEmbedder object and connects to specified database.
                  SqlTool - Class in org.hsqldb.cmdline
                  A command-line JDBC SQL tool supporting both interactive and non-interactive usage.
                  SqlTool() - Constructor for class org.hsqldb.cmdline.SqlTool
                   
                  SqlTool.SqlToolException - Exception in org.hsqldb.cmdline
                   
                  SQLTOOLERR_EXITVAL - Static variable in class org.hsqldb.cmdline.SqlTool
                   
                  sqlTypeToString(int) - Static method in class org.hsqldb.cmdline.SqlFile
                  Return a String representation of the specified java.sql.Types type.
                  sqlWarning(Result) - Static method in class org.hsqldb.jdbc.Util
                   
                  start() - Method in class org.hsqldb.server.Server
                  Starts this server synchronously.
                  startDocument() - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Receive notification of the beginning of a document.
                  startElement(String, String, String, Attributes) - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Receive notification of the beginning of an element.
                  startPrefixMapping(String, String) - Method in class org.hsqldb.jdbc.JDBCSQLXML.SAX2XMLStreamWriter
                  Begin the scope of a prefix-URI Namespace mapping.
                  statementClosed(StatementEvent) - Method in class org.hsqldb.jdbc.JDBCPool
                   
                  statementErrorOccurred(StatementEvent) - Method in class org.hsqldb.jdbc.JDBCPool
                   
                  stop() - Method in class org.hsqldb.server.Server
                  Stops this server asynchronously.
                  storesLowerCaseIdentifiers() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database treats mixed case unquoted SQL identifiers as case insensitive and stores them in lower case.
                  storesLowerCaseQuotedIdentifiers() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database treats mixed case quoted SQL identifiers as case insensitive and stores them in lower case.
                  storesMixedCaseIdentifiers() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database treats mixed case unquoted SQL identifiers as case insensitive and stores them in mixed case.
                  storesMixedCaseQuotedIdentifiers() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database treats mixed case quoted SQL identifiers as case insensitive and stores them in mixed case.
                  storesUpperCaseIdentifiers() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database treats mixed case unquoted SQL identifiers as case insensitive and stores them in upper case.
                  storesUpperCaseQuotedIdentifiers() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database treats mixed case quoted SQL identifiers as case insensitive and stores them in upper case.
                  streamToBytes(InputStream) - Static method in class org.hsqldb.cmdline.SqlFile
                  As the name says...
                  streamToString(InputStream, String) - Method in class org.hsqldb.cmdline.SqlFile
                  As the name says...
                  supportsAlterTableWithAddColumn() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports ALTER TABLE with add column.
                  supportsAlterTableWithDropColumn() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports ALTER TABLE with drop column.
                  supportsANSI92EntryLevelSQL() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports the ANSI92 entry level SQL grammar.
                  supportsANSI92FullSQL() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports the ANSI92 full SQL grammar supported.
                  supportsANSI92IntermediateSQL() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports the ANSI92 intermediate SQL grammar supported.
                  supportsBatchUpdates() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports batch updates.
                  supportsCatalogsInDataManipulation() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a catalog name can be used in a data manipulation statement.
                  supportsCatalogsInIndexDefinitions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a catalog name can be used in an index definition statement.
                  supportsCatalogsInPrivilegeDefinitions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a catalog name can be used in a privilege definition statement.
                  supportsCatalogsInProcedureCalls() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a catalog name can be used in a procedure call statement.
                  supportsCatalogsInTableDefinitions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a catalog name can be used in a table definition statement.
                  supportsColumnAliasing() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports column aliasing.
                  supportsConvert() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  (JDBC4 clarification:) Retrieves whether this database supports the JDBC scalar function CONVERT for the conversion of one JDBC type to another.
                  supportsConvert(int, int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  (JDBC4 clarification:) Retrieves whether this database supports the JDBC scalar function CONVERT for conversions between the JDBC types fromType and toType.
                  supportsCoreSQLGrammar() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports the ODBC Core SQL grammar.
                  supportsCorrelatedSubqueries() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports correlated subqueries.
                  supportsDataDefinitionAndDataManipulationTransactions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports both data definition and data manipulation statements within a transaction.
                  supportsDataManipulationTransactionsOnly() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports only data manipulation statements within a transaction.
                  supportsDifferentTableCorrelationNames() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether, when table correlation names are supported, they are restricted to being different from the names of the tables.
                  supportsExpressionsInOrderBy() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports expressions in ORDER BY lists.
                  supportsExtendedSQLGrammar() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports the ODBC Extended SQL grammar.
                  supportsFullOuterJoins() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports full nested outer joins.
                  supportsGetGeneratedKeys() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether auto-generated keys can be retrieved after a statement has been executed
                  supportsGroupBy() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports some form of GROUP BY clause.
                  supportsGroupByBeyondSelect() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports using columns not included in the SELECT statement in a GROUP BY clause provided that all of the columns in the SELECT statement are included in the GROUP BY clause.
                  supportsGroupByUnrelated() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports using a column that is not in the SELECT statement in a GROUP BY clause.
                  supportsIntegrityEnhancementFacility() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports the SQL Integrity Enhancement Facility.
                  supportsLikeEscapeClause() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports specifying a LIKE escape clause.
                  supportsLimitedOuterJoins() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database provides limited support for outer joins.
                  supportsMinimumSQLGrammar() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports the ODBC Minimum SQL grammar.
                  supportsMixedCaseIdentifiers() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database treats mixed case unquoted SQL identifiers as case sensitive and as a result stores them in mixed case.
                  supportsMixedCaseQuotedIdentifiers() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database treats mixed case quoted SQL identifiers as case sensitive and as a result stores them in mixed case.
                  supportsMultipleOpenResults() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether it is possible to have multiple ResultSet objects returned from a CallableStatement object simultaneously.
                  supportsMultipleResultSets() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports getting multiple ResultSet objects from a single call to the method execute.
                  supportsMultipleTransactions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database allows having multiple transactions open at once (on different connections).
                  supportsNamedParameters() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports named parameters to callable statements.
                  supportsNonNullableColumns() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether columns in this database may be defined as non-nullable.
                  supportsOpenCursorsAcrossCommit() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports keeping cursors open across commits.
                  supportsOpenCursorsAcrossRollback() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports keeping cursors open across rollbacks.
                  supportsOpenStatementsAcrossCommit() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports keeping statements open across commits.
                  supportsOpenStatementsAcrossRollback() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports keeping statements open across rollbacks.
                  supportsOrderByUnrelated() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports using a column that is not in the SELECT statement in an ORDER BY clause.
                  supportsOuterJoins() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports some form of outer join.
                  supportsPositionedDelete() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports positioned DELETE statements.
                  supportsPositionedUpdate() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports positioned UPDATE statements.
                  supportsResultSetConcurrency(int, int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports the given concurrency type in combination with the given result set type.
                  supportsResultSetHoldability(int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports the given result set holdability.
                  supportsResultSetType(int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports the given result set type.
                  supportsSavepoints() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports savepoints.
                  supportsSchemasInDataManipulation() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a schema name can be used in a data manipulation statement.
                  supportsSchemasInIndexDefinitions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a schema name can be used in an index definition statement.
                  supportsSchemasInPrivilegeDefinitions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a schema name can be used in a privilege definition statement.
                  supportsSchemasInProcedureCalls() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a schema name can be used in a procedure call statement.
                  supportsSchemasInTableDefinitions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether a schema name can be used in a table definition statement.
                  supportsSelectForUpdate() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports SELECT FOR UPDATE statements.
                  supportsStatementPooling() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports statement pooling.
                  supportsStoredFunctionsUsingCallSyntax() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports invoking user-defined or vendor functions using the stored procedure escape syntax.
                  supportsStoredProcedures() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports stored procedure calls that use the stored procedure escape syntax.
                  supportsSubqueriesInComparisons() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports subqueries in comparison expressions.
                  supportsSubqueriesInExists() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports subqueries in EXISTS expressions.
                  supportsSubqueriesInIns() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  (JDBC4 correction:) Retrieves whether this database supports subqueries in IN expressions.
                  supportsSubqueriesInQuantifieds() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports subqueries in quantified expressions.
                  supportsTableCorrelationNames() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports table correlation names.
                  supportsTransactionIsolationLevel(int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports the given transaction isolation level.
                  supportsTransactions() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports transactions.
                  supportsUnion() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports SQL UNION.
                  supportsUnionAll() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database supports SQL UNION ALL.
                  SYNTAXERR_EXITVAL - Static variable in class org.hsqldb.cmdline.SqlTool
                   

                  T

                  tableName - Variable in class org.hsqldb.jdbc.JDBCColumnMetaData
                  The column's table's name.
                  TEMP_FILE_PREFIX - Static variable in class org.hsqldb.jdbc.JDBCBlobFile
                   
                  TEMP_FILE_PREFIX - Static variable in class org.hsqldb.jdbc.JDBCClobFile
                   
                  TEMP_FILE_SUFFIX - Static variable in class org.hsqldb.jdbc.JDBCBlobFile
                   
                  TEMP_FILE_SUFFIX - Static variable in class org.hsqldb.jdbc.JDBCClobFile
                   
                  threadConnection - Variable in class org.hsqldb.jdbc.JDBCDriver
                  As a separate instance of this class is registered with DriverManager for each class loader, the threadConnection is not declared as static.
                  threadConnection - Variable in class org.hsqldb.jdbc.JDBCDriver
                  As a separate instance of this class is registered with DriverManager for each class loader, the threadConnection is not declared as static.
                  ti - Variable in class org.hsqldb.lib.RCData
                   
                  tiToString(int) - Static method in class org.hsqldb.lib.RCData
                  Return a String representation for the given numerical java.sql.Connection Transaction level.
                  toString() - Method in class org.hsqldb.jdbc.JDBCArray
                  Returns a string representation in the form ARRAY[..., ...]
                  toString() - Method in class org.hsqldb.jdbc.JDBCArrayBasic
                  Returns a string representation in the form ARRAY[..., ...]
                  toString() - Method in class org.hsqldb.jdbc.JDBCColumnMetaData
                  Retrieves a String representation of this object.
                  toString() - Method in class org.hsqldb.jdbc.JDBCParameterMetaData
                  Retrieves a String repsentation of this object.
                  toString() - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Retrieves a String representation of this object.
                  toString() - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Returns a string representation of the object.
                  toString() - Method in class org.hsqldb.jdbc.JDBCRowId
                  Returns a String representing the value of the SQL ROWID designated by this java.sql.RowId object.
                  toString() - Method in class org.hsqldb.jdbc.JDBCSavepoint
                   
                  toString() - Method in class org.hsqldb.server.ServerAcl
                   
                  Trigger - Interface in org.hsqldb
                  The interface an HSQLDB TRIGGER must implement.
                  TriggerSample - Class in org.hsqldb.sample
                  Sample code for use of triggers in hsqldb.
                  TriggerSample() - Constructor for class org.hsqldb.sample.TriggerSample
                   
                  truncate(long) - Method in class org.hsqldb.jdbc.JDBCBlob
                  Truncates the BLOB value that this Blob object represents to be len bytes in length.
                  truncate(long) - Method in class org.hsqldb.jdbc.JDBCBlobClient
                  Truncates the BLOB value that this Blob object represents to be len bytes in length.
                  truncate(long) - Method in class org.hsqldb.jdbc.JDBCBlobFile
                  Truncates the BLOB value that this Blob object represents to be len bytes in length.
                  truncate(long) - Method in class org.hsqldb.jdbc.JDBCClob
                  Truncates the CLOB value that this Clob designates to have a length of len characters.
                  truncate(long) - Method in class org.hsqldb.jdbc.JDBCClobClient
                  Truncates the CLOB value that this Clob designates to have a length of len characters.
                  truncate(long) - Method in class org.hsqldb.jdbc.JDBCClobFile
                  Truncates the CLOB value that this Clob designates to have a length of len characters.
                  truststore - Variable in class org.hsqldb.lib.RCData
                   
                  TYPE_FORWARD_ONLY - Static variable in class org.hsqldb.jdbc.JDBCResultSet
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  TYPE_SCROLL_INSENSITIVE - Static variable in class org.hsqldb.jdbc.JDBCResultSet
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.
                  TYPE_SCROLL_SENSITIVE - Static variable in class org.hsqldb.jdbc.JDBCResultSet
                  Copy of java.sql.ResultSet constant, for JDK 1.1 clients.

                  U

                  unwrap(Class<T>) - Method in class org.hsqldb.jdbc.JDBCConnection
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                  unwrap(Class<T>) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                  unwrap(Class<T>) - Method in class org.hsqldb.jdbc.JDBCDataSource
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                  unwrap(Class<T>) - Method in class org.hsqldb.jdbc.JDBCParameterMetaData
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                  unwrap(Class<T>) - Method in class org.hsqldb.jdbc.JDBCPool
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                  unwrap(Class<T>) - Method in class org.hsqldb.jdbc.JDBCPreparedStatement
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                  unwrap(Class<T>) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                  unwrap(Class<T>) - Method in class org.hsqldb.jdbc.JDBCResultSetMetaData
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                  unwrap(Class<T>) - Method in class org.hsqldb.jdbc.JDBCStatement
                  Returns an object that implements the given interface to allow access to non-standard methods, or standard methods not exposed by the proxy.
                  UPDATE_AFTER - Static variable in interface org.hsqldb.Trigger
                   
                  UPDATE_AFTER_ROW - Static variable in interface org.hsqldb.Trigger
                   
                  UPDATE_BEFORE_ROW - Static variable in interface org.hsqldb.Trigger
                   
                  updateArray(int, Array) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Array value.
                  updateArray(String, Array) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Array value.
                  updateAsciiStream(int, InputStream, int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  (JDBC4 clarification:) Updates the designated column with an ascii stream value, which will have the specified number of bytes.
                  updateAsciiStream(String, InputStream, int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  (JDBC4 clarification:) Updates the designated column with an ascii stream value, which will have the specified number of bytes.
                  updateAsciiStream(int, InputStream, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with an ascii stream value, which will have the specified number of bytes.
                  updateAsciiStream(String, InputStream, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with an ascii stream value, which will have the specified number of bytes..
                  updateAsciiStream(int, InputStream) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with an ascii stream value.
                  updateAsciiStream(String, InputStream) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with an ascii stream value.
                  updateBigDecimal(int, BigDecimal) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.math.BigDecimal value.
                  updateBigDecimal(String, BigDecimal) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.BigDecimal value.
                  updateBinaryStream(int, InputStream, int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  (JDBC4 clarification:) Updates the designated column with a binary stream value, which will have the specified number of bytes.
                  updateBinaryStream(String, InputStream, int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  (JDBC4 clarification:) Updates the designated column with a binary stream value, which will have the specified number of bytes.
                  updateBinaryStream(int, InputStream, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a binary stream value, which will have the specified number of bytes.
                  updateBinaryStream(String, InputStream, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a binary stream value, which will have the specified number of bytes.
                  updateBinaryStream(int, InputStream) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a binary stream value.
                  updateBinaryStream(String, InputStream) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a binary stream value.
                  updateBlob(int, Blob) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Blob value.
                  updateBlob(String, Blob) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Blob value.
                  updateBlob(int, InputStream, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column using the given input stream, which will have the specified number of bytes.
                  updateBlob(String, InputStream, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column using the given input stream, which will have the specified number of bytes.
                  updateBlob(int, InputStream) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column using the given input stream.
                  updateBlob(String, InputStream) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column using the given input stream.
                  updateBoolean(int, boolean) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a boolean value.
                  updateBoolean(String, boolean) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a boolean value.
                  updateByte(int, byte) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a byte value.
                  updateByte(String, byte) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a byte value.
                  updateBytes(int, byte[]) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a byte array value.
                  updateBytes(String, byte[]) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a byte array value.
                  updateCharacterStream(int, Reader, int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  (JDBC4 clarification:) Updates the designated column with a character stream value, which will have the specified number of (CHECKME: characters?) bytes.
                  updateCharacterStream(String, Reader, int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  (JDBC4 clarification) Updates the designated column with a character stream value, which will have the specified number of (CHECKME: characters?) bytes.
                  updateCharacterStream(int, Reader, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a character stream value, which will have the specified number of bytes.
                  updateCharacterStream(String, Reader, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a character stream value, which will have the specified number of bytes.
                  updateCharacterStream(int, Reader) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a character stream value.
                  updateCharacterStream(String, Reader) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a character stream value.
                  updateClob(int, Clob) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Clob value.
                  updateClob(String, Clob) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Clob value.
                  updateClob(int, Reader, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column using the given Reader object, which is the given number of characters long.
                  updateClob(String, Reader, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column using the given Reader object, which is the given number of characters long.
                  updateClob(int, Reader) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column using the given Reader object.
                  updateClob(String, Reader) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column using the given Reader object.
                  updateDate(int, Date) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Date value.
                  updateDate(String, Date) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Date value.
                  updateDouble(int, double) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a double value.
                  updateDouble(String, double) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a double value.
                  updateFloat(int, float) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a float value.
                  updateFloat(String, float) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a float value.
                  updateInt(int, int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with an int value.
                  updateInt(String, int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with an int value.
                  updateLong(int, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a long value.
                  updateLong(String, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a long value.
                  updateNCharacterStream(int, Reader, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a character stream value, which will have the specified number of bytes.
                  updateNCharacterStream(String, Reader, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a character stream value, which will have the specified number of bytes.
                  updateNCharacterStream(int, Reader) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a character stream value.
                  updateNCharacterStream(String, Reader) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a character stream value.
                  updateNClob(int, NClob) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.NClob value.
                  updateNClob(String, NClob) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.NClob value.
                  updateNClob(int, Reader, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column using the given Reader object, which is the given number of characters long.
                  updateNClob(String, Reader, long) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column using the given Reader object, which is the given number of characters long.
                  updateNClob(int, Reader) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column using the given Reader The data will be read from the stream as needed until end-of-stream is reached.
                  updateNClob(String, Reader) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column using the given Reader object.
                  updateNString(int, String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a String value.
                  updateNString(String, String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a String value.
                  updateNull(int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  (JDBC4 clarification:) Updates the designated column with a null value.
                  updateNull(String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a null value.
                  updateObject(int, Object, int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with an Object value.
                  updateObject(int, Object) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with an Object value.
                  updateObject(String, Object, int) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with an Object value.
                  updateObject(String, Object) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with an Object value.
                  updateRef(int, Ref) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Ref value.
                  updateRef(String, Ref) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Ref value.
                  updateRow() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the underlying database with the new contents of the current row of this ResultSet object.
                  updateRowId(int, RowId) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a RowId value.
                  updateRowId(String, RowId) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a RowId value.
                  updatesAreDetected(int) - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether or not a visible row update can be detected by calling the method ResultSet.rowUpdated.
                  updateShort(int, short) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a short value.
                  updateShort(String, short) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a short value.
                  updateSQLXML(int, SQLXML) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.SQLXML value.
                  updateSQLXML(String, SQLXML) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.SQLXML value.
                  updateString(int, String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a String value.
                  updateString(String, String) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a String value.
                  updateTime(int, Time) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Time value.
                  updateTime(String, Time) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Time value.
                  updateTimestamp(int, Timestamp) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Timestamp value.
                  updateTimestamp(String, Timestamp) - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Updates the designated column with a java.sql.Timestamp value.
                  url - Variable in class org.hsqldb.lib.RCData
                   
                  username - Variable in class org.hsqldb.lib.RCData
                   
                  usesLocalFilePerTable() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database uses a file for each table.
                  usesLocalFiles() - Method in class org.hsqldb.jdbc.JDBCDatabaseMetaData
                  Retrieves whether this database stores tables in a local file.
                  Util - Class in org.hsqldb.jdbc
                  Provides driver constants and a gateway from internal HsqlExceptions to external SQLExceptions.
                  Util() - Constructor for class org.hsqldb.jdbc.Util
                   

                  W

                  warning(String) - Method in class org.hsqldb.lib.FrameworkLogger
                   
                  warning(String, Throwable) - Method in class org.hsqldb.lib.FrameworkLogger
                  Just like FrameworkLogger.warning(String), but also logs a stack trace.
                  wasNull() - Method in class org.hsqldb.jdbc.JDBCCallableStatement
                  Retrieves whether the last OUT parameter read had the value of SQL NULL.
                  wasNull() - Method in class org.hsqldb.jdbc.JDBCResultSet
                  Reports whether the last column read had a value of SQL NULL.
                  WebServer - Class in org.hsqldb.server
                  The HSQLDB HTTP protocol network database server.
                  WebServer() - Constructor for class org.hsqldb.server.WebServer
                   
                  write() - Method in class org.hsqldb.lib.tar.DbBackup
                  This method always backs up the .properties and .script files.

                  A B C D E F G H I J L M N O P R S T U W

                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/javadoc.css0000644000175000017500000000623312007570404020416 0ustar renerene/* Javadoc style sheet */ /* Define colors, fonts and other style attributes here to override the defaults */ /* Page background color, width % */ body { background-color: #FFFFFF; padding-right: 1em; } /* Table colors */ .TableHeadingColor { background: #CCCCFF } /* Dark mauve */ .TableSubHeadingColor { background: #EEEEFF } /* Light mauve */ .TableRowColor { background: #FFFFFF } /* White */ /* Font used in left-hand frame lists */ .FrameTitleFont { font-size: 10pts; font-family: Helvetica, Arial, san-serif } .FrameHeadingFont { font-size: 10pts; font-family: Helvetica, Arial, san-serif } .FrameItemFont { font-size: 10pts; font-family: Helvetica, Arial, san-serif } /* Example of smaller, sans-serif font in frames */ /* .FrameItemFont { font-size: 10pt; font-family: Helvetica, Arial, sans-serif } */ /* Navigation bar fonts and colors */ .NavBarCell1 { background-color: #EEEEFF;}/* Light mauve */ .NavBarCell1Rev { background-color: #00008B;}/* Dark Blue */ .NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color: #000000;} .NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color: #FFFFFF;} .NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color: #FFFFFF;} .NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color: #FFFFFF;} .GenericDocumentation { color: #000000; } DIV.ReleaseSpecificDocumentation { color: #006A00; background-color: #EEEEFF; border: 2px ridge white; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; text-align: justify; } DIV.ReleaseSpecificDocumentation h3 { margin-top: 0px; margin-left: 0px; margin-right: 0px; padding-top: 14px; padding-right: 0px; padding-bottom: 15px; padding-left: 50px; border-top: 1px dashed rgb(120,172,255); border-bottom: 1px dashed rgb(120,172,255); background: url(hsqldb.gif) #E6E6FF no-repeat left center; } PRE.JavaCodeExample { color: #000000; background-color: #EEEEEE; border: 1px ridge white; padding-top: 1em; padding-right: 1em; padding-bottom: 0em; padding-left: 1em; } .JavaStringLiteral { color: #99006B; } .JavaNumericLiteral { color: #780000; } .JavaKeyWord { color: #000099; font-weight: bold; } PRE.SqlCodeExample { /*color: #550022;*/ color: #601030; background-color: #EEEEEE; border: 1px ridge white; font-weight: bold; padding-top: 1em; padding-right: 1em; padding-bottom: 0em; padding-left: 1em; line-height: 150%; } PRE.GeneralExample { color: #000000; background-color: #EEEEEE; border: 1px ridge white; padding-top: 1em; padding-right: 1em; padding-bottom: 0em; padding-left: 1em; } hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/serialized-form.html0000644000175000017500000017023412007570404022262 0ustar renerene Serialized Form (HSQLDB 2.2.9 API)

                  Serialized Form


                  Package org.hsqldb

                  Class org.hsqldb.HsqlException extends RuntimeException implements Serializable

                  Serialized Fields

                  message

                  String message

                  state

                  String state

                  code

                  int code

                  level

                  int level

                  statementGroup

                  int statementGroup

                  statementCode

                  int statementCode

                  Class org.hsqldb.HsqlException.HsqlRuntimeMemoryError extends OutOfMemoryError implements Serializable

                  Class org.hsqldb.SetFunction extends Object implements Serializable

                  Serialized Fields

                  distinctValues

                  org.hsqldb.lib.HashSet distinctValues

                  isDistinct

                  boolean isDistinct

                  setType

                  int setType

                  typeCode

                  int typeCode

                  type

                  org.hsqldb.types.Type type

                  arrayType

                  org.hsqldb.types.ArrayType arrayType

                  returnType

                  org.hsqldb.types.Type returnType

                  count

                  long count

                  hasNull

                  boolean hasNull

                  every

                  boolean every

                  some

                  boolean some

                  currentLong

                  long currentLong

                  currentDouble

                  double currentDouble

                  currentBigDecimal

                  BigDecimal currentBigDecimal

                  currentValue

                  Object currentValue

                  hi

                  long hi

                  lo

                  long lo

                  sk

                  double sk

                  vk

                  double vk

                  n

                  long n

                  initialized

                  boolean initialized

                  sample

                  boolean sample

                  Package org.hsqldb.auth

                  Class org.hsqldb.auth.DenyException extends Exception implements Serializable


                  Package org.hsqldb.cmdline

                  Class org.hsqldb.cmdline.SqlTool.SqlToolException extends Exception implements Serializable

                  serialVersionUID: 1424909871915188519L

                  Serialized Fields

                  exitValue

                  int exitValue

                  Class org.hsqldb.cmdline.SqlToolError extends org.hsqldb.lib.AppendableException implements Serializable

                  serialVersionUID: 1792522673702223649L


                  Package org.hsqldb.jdbc

                  Class org.hsqldb.jdbc.JDBCCommonDataSource extends Object implements Serializable

                  Serialized Fields

                  connectionProps

                  Properties connectionProps

                  description

                  String description
                  description of data source - informational


                  dataSourceName

                  String dataSourceName
                  name of data source - informational


                  serverName

                  String serverName
                  name of server - informational


                  networkProtocol

                  String networkProtocol
                  network protocol - informational


                  loginTimeout

                  int loginTimeout
                  login timeout


                  user

                  String user
                  connection user


                  password

                  String password
                  connection password


                  url

                  String url
                  database URL

                  Class org.hsqldb.jdbc.JDBCDataSource extends JDBCCommonDataSource implements Serializable

                  Class org.hsqldb.jdbc.JDBCPool extends Object implements Serializable

                  Serialized Fields

                  states

                  AtomicIntegerArray states

                  connections

                  org.hsqldb.jdbc.pool.JDBCPooledConnection[] connections

                  source

                  org.hsqldb.jdbc.pool.JDBCPooledDataSource source

                  closed

                  boolean closed

                  Package org.hsqldb.lib

                  Class org.hsqldb.lib.AppendableException extends Exception implements Serializable

                  serialVersionUID: -1002629580611098803L

                  Serialized Fields

                  appendages

                  List<E> appendages

                  Package org.hsqldb.lib.tar

                  Class org.hsqldb.lib.tar.PIFData extends HashMap<String,String> implements Serializable

                  serialVersionUID: 3086795680582315773L

                  Serialized Fields

                  sizeObject

                  Long sizeObject

                  Class org.hsqldb.lib.tar.TarMalformatException extends Exception implements Serializable

                  Class org.hsqldb.lib.tar.TarReader.TarEntryHeader.MissingField extends Exception implements Serializable

                  Serialized Fields

                  field

                  org.hsqldb.lib.tar.TarHeaderField field

                  Package org.hsqldb.sample

                  Class org.hsqldb.sample.ConnectionTypesSample extends Vector implements Serializable

                  Class org.hsqldb.sample.DatabaseManagerSample extends org.hsqldb.util.DatabaseManager implements Serializable


                  Package org.hsqldb.server

                  Class org.hsqldb.server.ServerAcl.AclFormatException extends Exception implements Serializable

                  Class org.hsqldb.server.Servlet extends HttpServlet implements Serializable

                  Serialized Fields

                  dbType

                  String dbType

                  dbPath

                  String dbPath

                  errorStr

                  String errorStr

                  rowOut

                  org.hsqldb.rowio.RowOutputBinary rowOut

                  rowIn

                  org.hsqldb.rowio.RowInputBinary rowIn

                  iQueries

                  int iQueries

                  Package org.hsqldb.util

                  Class org.hsqldb.util.ConnectionSetting extends Object implements Serializable

                  Serialized Fields

                  name

                  String name

                  driver

                  String driver

                  url

                  String url

                  user

                  String user

                  pw

                  String pw

                  Class org.hsqldb.util.DatabaseManager extends Applet implements Serializable

                  Serialized Fields

                  cConn

                  Connection cConn

                  dMeta

                  DatabaseMetaData dMeta

                  sStatement

                  Statement sStatement

                  mRecent

                  Menu mRecent

                  sRecent

                  String[] sRecent

                  iRecent

                  int iRecent

                  txtCommand

                  TextArea txtCommand

                  butExecute

                  Button butExecute

                  butClear

                  Button butClear

                  tTree

                  org.hsqldb.util.Tree tTree

                  pResult

                  Panel pResult

                  lTime

                  long lTime

                  iResult

                  int iResult

                  gResult

                  org.hsqldb.util.Grid gResult

                  txtResult

                  TextArea txtResult

                  bHelp

                  boolean bHelp

                  fMain

                  Frame fMain

                  imgEmpty

                  Image imgEmpty

                  ifHuge

                  String ifHuge

                  Class org.hsqldb.util.DatabaseManagerSwing extends JApplet implements Serializable

                  Serialized Fields

                  isOracle

                  boolean isOracle

                  localActionList

                  ArrayList<E> localActionList

                  jframe

                  JFrame jframe

                  cConn

                  Connection cConn

                  rowConn

                  Connection rowConn

                  dMeta

                  DatabaseMetaData dMeta

                  sStatement

                  Statement sStatement

                  mRecent

                  JMenu mRecent

                  sRecent

                  String[] sRecent

                  iRecent

                  int iRecent

                  txtCommand

                  JTextArea txtCommand

                  txtCommandScroll

                  JScrollPane txtCommandScroll

                  butExecute

                  JButton butExecute

                  tTree

                  JTree tTree

                  tScrollPane

                  JScrollPane tScrollPane

                  treeModel

                  DefaultTreeModel treeModel

                  tableModel

                  TableModel tableModel

                  rootNode

                  DefaultMutableTreeNode rootNode

                  pResult

                  JPanel pResult

                  lTime

                  long lTime

                  gResult

                  org.hsqldb.util.GridSwing gResult

                  gResultTable

                  JTable gResultTable
                  I think this is used to store model info whether we're using Grid output or not (this object is queried for data to display for text output mode). If so, the presentation-independent model part should be moved to an appropriately-named class instead of storing pure data in a Swing-specific class.


                  gScrollPane

                  JScrollPane gScrollPane

                  txtResult

                  JTextArea txtResult

                  txtResultScroll

                  JScrollPane txtResultScroll

                  nsSplitPane

                  JSplitPane nsSplitPane

                  ewSplitPane

                  JSplitPane ewSplitPane

                  bHelp

                  boolean bHelp

                  fMain

                  RootPaneContainer fMain

                  sqlScriptBuffer

                  String sqlScriptBuffer
                  Value of this variable only retained if huge input script read in.


                  jtoolbar

                  JToolBar jtoolbar

                  showSchemas

                  boolean showSchemas

                  showTooltips

                  boolean showTooltips

                  autoRefresh

                  boolean autoRefresh

                  gridFormat

                  boolean gridFormat

                  displayRowCounts

                  boolean displayRowCounts

                  showSys

                  boolean showSys

                  showIndexDetails

                  boolean showIndexDetails

                  currentLAF

                  String currentLAF

                  pStatus

                  JPanel pStatus

                  rbAllSchemas

                  JRadioButtonMenuItem rbAllSchemas

                  mitemAbout

                  JMenuItem mitemAbout

                  mitemHelp

                  JMenuItem mitemHelp

                  mitemUpdateSchemas

                  JMenuItem mitemUpdateSchemas

                  boxAutoCommit

                  JCheckBoxMenuItem boxAutoCommit

                  boxLogging

                  JCheckBoxMenuItem boxLogging

                  boxShowSchemas

                  JCheckBoxMenuItem boxShowSchemas

                  boxAutoRefresh

                  JCheckBoxMenuItem boxAutoRefresh

                  boxTooltips

                  JCheckBoxMenuItem boxTooltips

                  boxRowCounts

                  JCheckBoxMenuItem boxRowCounts

                  boxShowGrid

                  JCheckBoxMenuItem boxShowGrid

                  boxShowSys

                  JCheckBoxMenuItem boxShowSys

                  rbNativeLF

                  JRadioButtonMenuItem rbNativeLF

                  rbJavaLF

                  JRadioButtonMenuItem rbJavaLF

                  rbMotifLF

                  JRadioButtonMenuItem rbMotifLF

                  jStatusLine

                  JLabel jStatusLine

                  fMainCursor

                  Cursor fMainCursor

                  txtCommandCursor

                  Cursor txtCommandCursor

                  txtResultCursor

                  Cursor txtResultCursor

                  tipMap

                  HashMap<K,V> tipMap

                  mnuSchemas

                  JMenu mnuSchemas

                  waitCursor

                  Cursor waitCursor
                  Wait Cursor


                  schemaFilter

                  String schemaFilter

                  prefs

                  org.hsqldb.util.DatabaseManagerSwing.DBMPrefs prefs

                  dummyThread

                  Thread dummyThread

                  busyText

                  String busyText

                  enableButtonRunnable

                  Runnable enableButtonRunnable

                  disableButtonRunnable

                  Runnable disableButtonRunnable

                  buttonUpdaterThread

                  Thread buttonUpdaterThread

                  buttonUpdater

                  Runnable buttonUpdater

                  jbuttonClear

                  JButton jbuttonClear

                  jbuttonExecute

                  JButton jbuttonExecute

                  treeRefreshRunnable

                  Runnable treeRefreshRunnable

                  alreadyHandled

                  MouseEvent alreadyHandled

                  schemaListListener

                  ActionListener schemaListListener

                  Class org.hsqldb.util.FontDialogSwing extends JDialog implements Serializable

                  Class org.hsqldb.util.TableSorter extends AbstractTableModel implements Serializable

                  Serialized Fields

                  tableModel

                  TableModel tableModel

                  viewToModel

                  org.hsqldb.util.TableSorter.Row[] viewToModel

                  modelToView

                  int[] modelToView

                  tableHeader

                  JTableHeader tableHeader

                  mouseListener

                  MouseListener mouseListener

                  tableModelListener

                  TableModelListener tableModelListener

                  columnComparators

                  Map<K,V> columnComparators

                  sortingColumns

                  List<E> sortingColumns

                  Class org.hsqldb.util.Transfer extends Applet implements Serializable

                  Serialized Fields

                  fMain

                  Frame fMain

                  imgEmpty

                  Image imgEmpty

                  sourceDb

                  org.hsqldb.util.DataAccessPoint sourceDb

                  targetDb

                  org.hsqldb.util.DataAccessPoint targetDb

                  tCurrent

                  org.hsqldb.util.TransferTable tCurrent

                  iMaxRows

                  int iMaxRows

                  iSelectionStep

                  int iSelectionStep

                  tTable

                  Vector<E> tTable

                  lTable

                  List lTable

                  sSourceSchemas

                  String[] sSourceSchemas

                  sSourceCatalog

                  String sSourceCatalog

                  sDestSchema

                  String sDestSchema

                  sDestCatalog

                  String sDestCatalog

                  tSourceTable

                  TextField tSourceTable

                  tDestTable

                  TextField tDestTable

                  tDestDropIndex

                  TextField tDestDropIndex

                  tDestCreateIndex

                  TextField tDestCreateIndex

                  tDestDrop

                  TextField tDestDrop

                  tDestCreate

                  TextField tDestCreate

                  tDestDelete

                  TextField tDestDelete

                  tDestAlter

                  TextField tDestAlter

                  tSourceSelect

                  TextField tSourceSelect

                  tDestInsert

                  TextField tDestInsert

                  cTransfer

                  Checkbox cTransfer

                  cDrop

                  Checkbox cDrop

                  cCreate

                  Checkbox cCreate

                  cDelete

                  Checkbox cDelete

                  cInsert

                  Checkbox cInsert

                  cAlter

                  Checkbox cAlter

                  cCreateIndex

                  Checkbox cCreateIndex

                  cDropIndex

                  Checkbox cDropIndex

                  cFKForced

                  Checkbox cFKForced

                  cIdxForced

                  Checkbox cIdxForced

                  bStart

                  Button bStart

                  bContinue

                  Button bContinue

                  tMessage

                  TextField tMessage

                  iTransferMode

                  int iTransferMode

                  CurrentTransfer

                  int CurrentTransfer

                  CurrentAlter

                  int CurrentAlter



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/index.html0000644000175000017500000000267112007570406020276 0ustar renerene HSQLDB 2.2.9 API <H2> Frame Alert</H2> <P> This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. <BR> Link to<A HREF="overview-summary.html">Non-frame version.</A> hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/overview-tree.html0000644000175000017500000005107512007570404021772 0ustar renerene Class Hierarchy (HSQLDB 2.2.9 API)

                  Hierarchy For All Packages

                  Package Hierarchies:
                  org.hsqldb, org.hsqldb.auth, org.hsqldb.cmdline, org.hsqldb.jdbc, org.hsqldb.lib, org.hsqldb.lib.tar, org.hsqldb.sample, org.hsqldb.server, org.hsqldb.util

                  Class Hierarchy

                  Interface Hierarchy



                  Copyright © 2001 - 2010 HSQL Development Group. hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/resources/0000755000175000017500000000000012007570404020303 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/resources/inherit.gif0000644000175000017500000000007112007570404022432 0ustar renereneGIF89a€ÿÿÿ,„ ¡½®DršjñÔ;߀Q@–¦…N;hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/allclasses-noframe.html0000644000175000017500000001344212007570406022740 0ustar renerene All Classes (HSQLDB 2.2.9 API) All Classes
                  AuthBeanMultiplexer
                  AuthFunctionBean
                  DbBackup
                  FrameworkLogger
                  HsqldbSlaveAuthBean
                  JaasAuthBean
                  JaasAuthBean.UPCallbackHandler
                  JDBCArray
                  JDBCArrayBasic
                  JDBCBlob
                  JDBCBlobClient
                  JDBCBlobFile
                  JDBCCallableStatement
                  JDBCClob
                  JDBCClobClient
                  JDBCClobFile
                  JDBCColumnMetaData
                  JDBCCommonDataSource
                  JDBCConnection
                  JDBCConnectionEventListener
                  JDBCDatabaseMetaData
                  JDBCDataSource
                  JDBCDataSourceFactory
                  JDBCDriver
                  JDBCDriver
                  JDBCNClob
                  JDBCParameterMetaData
                  JDBCPool
                  JDBCPreparedStatement
                  JDBCResultSet
                  JDBCResultSetMetaData
                  JDBCRowId
                  JDBCSavepoint
                  JDBCSQLXML
                  JDBCSQLXML.SAX2XMLStreamWriter
                  JDBCStatement
                  LdapAuthBean
                  MainInvoker
                  RCData
                  Server
                  ServerAcl
                  ServerAcl.AclFormatException
                  SqlFile
                  SqlFileEmbedder
                  SqlTool
                  SqlTool.SqlToolException
                  Trigger
                  TriggerSample
                  Util
                  WebServer
                  hsqldb2.2-2.2.9.orig/hsqldb/doc/apidocs/package-list0000644000175000017500000000022412007570404020556 0ustar renereneorg.hsqldb org.hsqldb.auth org.hsqldb.cmdline org.hsqldb.jdbc org.hsqldb.lib org.hsqldb.lib.tar org.hsqldb.sample org.hsqldb.server org.hsqldb.util hsqldb2.2-2.2.9.orig/hsqldb/doc/hypersonic_lic.txt0000644000175000017500000000666112007570374020441 0ustar renerene/* * For work developed by the HSQL Development Group: * * Copyright (c) 2001-2012, The HSQL Development Group * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the HSQL Development Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * For work originally developed by the Hypersonic SQL Group: * * Copyright (c) 1995-2000, The Hypersonic SQL Group. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Hypersonic SQL Group nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Hypersonic SQL Group. */ hsqldb2.2-2.2.9.orig/hsqldb/doc/index.html0000644000175000017500000000354612007570374016662 0ustar renerene HSQLDB

                  HyperSQL version 2.2.9 Documentation

                  HSQLDB (HyperSQL Database) is a relational database engine written in Java. Version 2.2.9 is the result of over 6 years development since the last major version, 1.8.0. It offers many features and adheres closely to the latest SQL and JDBC 4 standards.

                  A set of HTML, PDF and text documents covering different aspects of HSQLDB and some of its utilities.

                  HyperSQL User Guide in HTML format.
                  HyperSQL User Guide in PDF format.

                  HyperSQL Utilities Guide in HTML format.
                  HyperSQL Utilities Guide in PDF format.

                  The JavaDoc for public classes, including the JDBC documentation.

                  Chronological list of changes and bug fixes since the release of version 2.0 changelist_2_0.txt

                  The license texts for the source and binaries, based on the BSD license. hsqldb_lic.txt is for sources developed entirely by the HSQL Development Group. hypersonic_lic.txt is for sources that contain code from the closed HypersonicSQL project.

                  Additional Resources

                  Support for HyperSQL is available from http://hsqldb.org/support in various forms, including a mailing list and user forums. The web site features the latest bugfix versions of the software, FAQ and other useful resources.

                  $Date: 2012-07-28 17:21:09 +0100 (Sat, 28 Jul 2012) $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/odbc.txt0000644000175000017500000002506512007570374016335 0ustar renerene$Id: odbc.txt 2850 2009-02-23 22:27:10Z unsaved $ This file documents various aspects of HyerSQL's ODBC support. It does not document driver-side issues (at least once we can discriminate), since those issues will be documented with the dedicated ODBC driver product. Critical server-side todo items. + Support passing of size/precision/scale values for columns to the ODBC client. I guess the client uses this for display formatting purposes (I don't know any other reason why the client would want the value, since the database, not the client, enforces conformance). It's quite possible that no real purpose is served. In that case we can greatly improve efficiency of the PgType class by sharing a static list of elements instead of making tons of PgType instances. + Support binary database data types (BINARY, OBJECT, etc.) + Support TIME and DATETIME database data types (DATEs already supported) (May want to postpone *INTERVAL* types for another iteration). + Verify tactic used to generate numeric "object identifiers" for tables is adequate: Java hash of String "schema.tablename". + Fix column oid (numeric object identifier) generation tactic. I am just returning the sequence in the generated result set. The problem with this tactic is that the number for a column is dependent upon the query instead of on the table definition. KNOWN LIMITATIONS Limitations corresponding to the TODO items above. Can't fetch the same column (or virtual column) twice from JDBC, even with different getters like rs.getInt() and rs.getObject(). I don't know what product is responsible for this limitation. No metadata querying ability, other than the ones implicit with setting up prepared statements (including the 'D'). Don't know if it is a bug with Sun's jdbc:odbc or with psqlodbc, but all fetchsize settings are rejected with a message saying that the value is unacceptable. psqlodbc can handle compound commands (*;*) only in SIMPLE (Q) mode; and even that needs to be tested to see if server will generate the expected number of reply packets. POSTGRESQL DEPENDENCIES TO BE ELIMINATED (uncertain whether will handle these on client or server side). Search ServerConnection.java (from odbcproto1 branch) for comments about "stub" and "swallow", ignoring stuff about client side swallowing. Over-the-wire Postgresql-specific SQL commands that must be handled. SELECT PREPARE/EXECUTE/DEALLOCATE SET/SHOW DECLARE/FETCH/MOVE/CLOSE psqlodbc source code locations The info30.c file seems to be good (ODBC v.3 metadata) connect.c select oid,... upon startup. current_schema() convert.c Uses ctid pseudo-column convert_escape() generates queries. Func. should probably be eliminated. copy_statement_with_parameters looks dependent upon PostgresQL PREPARE SQL statements. (this calls Prepare_and_convert(), which also depends on them). multibyte.c CC_lookup_cs_new() Not run from Linux driver. Test whether called from CC_lookup_characterset() from Windows ANSI client. parse.c CheckHasOids() getCOLIfromTable() results.c tupleExists() uses ctid pseudo-column Literal commands known to be sent over the wire: select n.nspname, c.relname, a.attname, a.atttypid,t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull, c.relhasrules, c.relkind, c.oid, d.adsrc from (((pg_catalog.pg_class c inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace and c.oid = 3411470544) inner join pg_catalog.pg_attribute a on (not a.attisdropped) and a.attnum > 0 and a.attrelid = c.oid) inner join pg_catalog.pg_type t on t.oid = a.atttypid) left outer join pg_attrdef d on a.atthasdef and d.adrelid = a.attrelid and d.adnum = a.attnum order by n.nspname, c.relname, attnum select current_schema() select oid, typbasetype from pg_type where typname = 'lo' deallocate (all cases I've encountered so far seem to be an over-zealous attempt by the driver to free cursors managed completely EXTENDED protocol, and therefore my server code can handle these). set client_encoding to... Literal commands I see in code, but have not yet taken the time to confirm or reject as will ever be sent to our server. Repeat: THESE STATEMENTS MAY NEVER BE SENT. I will have a definitive answer about several of these shortly.: "select oid, 0 from pg_type where typname='" PG_TYPE_LO_NAME "'" Dynamic queries with: " where ctid = '(0,0)';select \"ctid"... from... All sorts of metadata/data-dictionary stuff in "info.c" file. select relhasoids, c.oid from pg_class c, pg_namespace n where relname = '%s' and nspname = '%s' and c.relnamespace = n.oid" "select a.attname, a.atttypid from pg_index i, pg_attribute a where indrelid=%u and indnatts=1 and indisunique and indexprs is null and indpred is null and i.indrelid = a.attrelid and a.attnum=i.indkey[0] and attnotnull and atttypid in (%d, %d)" "select nspname from pg_namespace n, pg_class c" "select 1 from \"%s\" where ctid = '(%d,%d)'" Complex dynamic parsing or genereration code in convert.c:convert_escape(). SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL * show max_identifier_length Show Client_Encoding DATA TYPE SUPPORT MATRIX (type synonyms not listed) @=Yet-to-be-Implemented HyperSQL type wid prec scale | Driver type oid adtsz atttypm --------------------------- --- ---- ----- - ----------- --- --- --- TINYINT 8 3 0 | HSQL_TINYINT 9999 1 -1 SMALLINT 16 5 0 | int2 21 2 -1 INTEGER 32 10 0 | int4 23 4 -1 BIGINT 64 19 0 | int8 20 8 -1 NUMERIC(p?,s?) [100] [0] | numeric 1700 -1 [-1]** FLOAT(p?) 128 [0] 0 | float8 701 8 -1** DOUBLE 128 0 0 | float8 701 8 -1 BOOLEAN 0 0 | bool 16 1 -1 CHAR(1l)* = [1]++ 0 | bpchar 1042 -1 [1] VARCHAR(1l) [0] 0 | varchar 1043 -1 [-1] If precision unlimited/0: | text 25 -1 -1 LITERAL, simple atomic str+:CHARACTER len 0 | unknown 705 -2 -1 DERIVED, compound str+: VARCHAR prtlen 0 | text 25 -1 -1 CLOB(1l) [0] 0 | @ BINARY(1l)* [0] 0 | bytea 17 -1 -1 VARBINARY(1l) [0] 0 | bytea 17 -1 -1 BLOB(1l) [0] 0 | @ BIT(1l)* [1] 0 | bit 1560 -1 -1 BIT VARYING(1l) [0] 0 | varbit 1562 -1 -1 OTHER 0 0 | @ DATE 0 0 | date 1082 4 -1 TIME(p0) 0 [0] | time 1083 8 [-1] TIME(p0) WITH TIME ZONE 0 [0] | time_with_tmzone 1266 12 [-1] TIMESTAMP(p0) 0 [6] | timestamp_no_tmzone 1114 8[-1] TIMESTAMP (p0) WITH TIME ZONE 0 [6] | datetime ?1184 8 [-1]***** INTERVAL...(p2,p0) [2] [6] | tinterval 1186 16 [-1]**** * these types present at least a facade of data values always padded to the specified length. ** atttypmod for numerics determines column size and scale. atttypmod = (precision << 16) + scale + 4 (but there seems to be a bug in psqlodbc where this still does not work). *** Postgresql seems to use the FLOAT(x) precisions specifier just to decide whether to create a float4 or float8 column. **** I get atttypmod value of 2147418111 for INTERVAL(3) = short of 32767 + short of -1 and 217418110 for INTERVAL(2) So far unsuccessful to reverse engineer atttypmods for INTERVALs. As of today, support for following HyperSQL INTERVAL variants: DAY TO SECOND, HOUR TO SECOND, MINUTE TO SECOND, SECOND. ***** Seems to be a driver bug here. Should return 1296 for TIMESTAMP, not 1184 for DATETIME. +: If HyperSQL determines the output is a known constant size, it sets the precision to that. That seems to be the intention of Postgresql, but PG is not as smart about figuring out when expressions will resolve to a constant. When combining a constant and a col., HyperSQL confusingly some really crazy lengths. I haven't figured out the method or intention. ++: This defaults to 1 instead of 0 if sql.enforce_strict_size is set. Interval types seem to be wildly different between PG and HyperSQL. I believe that for all interval literals, precisions will automatically be set to preserve the specified value (unless you specify the precisions). Therefore, in practice, precision specs are usually only useful in col. defs. PG: INTERVAL(p); Where [0] <= p <= 6 (sub-sec. resolution, trunk/round vary!) Resolution years to microsecond. Literals: '1 12:59:10 ago' == '1 day 12 hours 59 min 10 sec ago' '1.234' = '1.234 sec' '-8 days - 12:59:10.472' HS: Resolution is either in months or (sub)seconds. Can't mix. p1 [2], p2[0]. INTERVAL NON_SECOND(p1) TO NON_SECOND Or INTERVAL NON_SECOND(p1) TO SECOND(p2) Or INTERVAL NON_SECOND(p1) Or INTERVAL SECOND(p1,p2) Literals INTERVAL '145 23:12:19.345' DAY(3) TO SECOND(3) = INTERVAL '3503:12:19.345' HOUR TO SECOND(3) INTERVAL '19.345' SECOND(4,3) REFERENCES JDBC type mapping tables. Section "Tables for Type Mapping" of Sun's "Getting Started with the JDBC API", which is section 9.9 of the current version, but this section number changes with document revisions. http://java.sun.com/javase/6/docs/technotes/guides/jdbc/getstart/mapping.html#1038075 psqlodbc code repository. Module "psqlodbc" at :pserver:anonymous@cvs.pgfoundry.org:/cvsroot/psqlodbc This is the code base that our odbc driver forked from. Protocol specification: http://www.postgresql.org/docs/8.3/interactive/protocol.html Article on ODBC escape sequences. May support these some day. http://www.ibprovider.com/eng/documentation/odbc_escape_sequences_eng.html hsqldb2.2-2.2.9.orig/hsqldb/doc/readme-docauthors.txt0000644000175000017500000000327012007570374021026 0ustar renerene$Id: readme-docauthors.txt 844 2009-01-19 15:02:56Z unsaved $ BUILDING You need JDK 1.5 or later and Ant 1.7 or later. Run "ant gen-docs" from the build subdirectory. Error messages should be self-explanatory. SYSTEM See http://pub.admc.com/howtos/ant-docbook-howto/system-chapt.html#system-features-sect and http://pub.admc.com/howtos/ant-docbook-howto/tips-app.html for important tips. This HOWTO document explains the build system used here. EDITING Use DocBook v. 5 syntax in your DocBook source XML files. Because of the amount of extra infrastructure needed for DocBook olinking, we are not supporting direct inter-document linking. If you want to refer from one DocBook document to content in another one, then add a link to the canonical document (like using a &distro_bseurl;/guide/index.html link) and just describe the location referred to. Top-level DocBook source files for individual DocBook documents reside at doc-src/X/X.xml. Other files may be xincluded into these files, and lots of other resources are referenced or pulled in from under doc-src. Please use the product name HyperSQL in major titles. Where introducing HyperSQL, use a subtitle like "aka HSQLDB". In the text, use "HyperSQL" as the product name. In filepaths and package names you code as required for the filepath or package name, of course. Don't capitalize words or phrases to emphasize them (including in section titles or headings). If you want to emphasize something a certain way, then use a DocBook emphasis role, and leave the presentation decisions to the style sheets. It is very easy to set a CSS style to capitalize headings if you want them to appear that way. hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/0000755000175000017500000000000012007570422015744 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/doc/guide/management-chapt.html0000644000175000017500000035443412007567744022075 0ustar renerene Chapter 11. System Management

                  Chapter 11. System Management

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5039 $

                  Copyright 2002-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  Mode of Operation and Tables

                  HyperSQL has many modes of operation and features that allow it to be used in very different scenarios. Levels of memory usage, speed and accessibility by different applications are influenced by how HyperSQL is deployed.

                  Mode of Operation

                  The decision to run HyperSQL as a separate server process or as an in-process database should be based on the following:

                  • When HyperSQL is run as a server on a separate machine, it is isolated from hardware failures and crashes on the hosts running the application.

                  • When HyperSQL is run as a server on the same machine, it is isolated from application crashes and memory leaks.

                  • Server connections are slower than in-process connections due to the overhead of streaming the data for each JDBC call.

                  • You can reduce client/server traffic using SQL Stored procedures to reduce the number of JDBC execute calls.

                  • During development, it is better to use a Server with server.silent=false, which displays the statements sent to the server on the console window.

                  • To improve speed of execution for statements that are executed repeatedly, reuse a parameterized PreparedStatement for the lifetime of the connections.

                  Tables

                  TEXT tables are designed for special applications where the data has to be in an interchangeable format, such as CSV (comma separated values). TEXT tables should not be used for routine storage of data.

                  MEMORY tables and CACHED tables are generally used for data storage. The difference between the two is as follows:

                  • The data for all MEMORY tables is read from the *.script file when the database is started and stored in memory. In contrast the data for cached tables is not read into memory until the table is accessed. Furthermore, only part of the data for each CACHED table is held in memory, allowing tables with more data than can be held in memory.

                  • When the database is shutdown in the normal way, all the data for MEMORY tables is written out to the disk. In comparison, the data in CACHED tables that has changed is written out during operation and at shutdown.

                  • The size and capacity of the data cache for all the CACHED tables is configurable. This makes it possible to allow all the data in CACHED tables to be cached in memory. In this case, speed of access is good, but slightly slower than MEMORY tables.

                  • For normal applications it is recommended that MEMORY tables are used for small amounts of data, leaving CACHED tables for large data sets. For special applications in which speed is paramount and a large amount of free memory is available, MEMORY tables can be used for large tables as well.

                  • You can change the type of the table with the SET TABLE <table name> TYPE { CACHED | MEMORY }statement.

                  Large Objects

                  HyperSQL 2.0 supports dedicated storage and access to BLOB and CLOB objects. These objects can have huge sizes. BLOB or CLOB is specified as the type of a column of the table. Afterwards, rows can be inserted into the table using a PreparedStatement for efficient transfer of large LOB data to the database. In mem: catalogs, CLOB and BLOB data is stored in memory. In file: catalogs, this data is stored in a single separate file which has the extension *.lobs. The size of this file can grow to huge, terabyte figures. By default, a minimum 32 KB is allocated to each LOB. You can reduced this if your LOBs are generally smaller.

                  LOB data should be store in the database using a JDBC PreparedStatement object. The streaming methods send the LOB to the database in one operation as a binary or character stream. Inside the database, the disk space is allocated as needed and the data is saved as it is being received. LOB data should be retrieved from the database using a JDBC ResultSet method. When a streaming method is used to retrieve a LOB, it is retrieved in large chunks in a transparent manner. LOB data can also be retrieved as String or byte[], but these methods use more memory and may not be practical for large objects.

                  LOB data is not duplicated in the database when a lob is copied from one table to another. The disk space is reused when a LOB is deleted and is no longer contained in any table. This happens only at the time of a CHECKPOINT.

                  By using a dedicated LOB store, HyperSQL achieves consistently high speeds (usually over 20MB / s) for both storage and retrieval of LOBs.

                  There is an internal LOBS schema in the database to store the id's, sizes and addresses of the LOBs (but not the actual LOBS) in a few system tables. This schema is stored in the database as MEMORY tables. Therefore the amount of JVM memory should be increased when more than tens of thousands of LOBs are stored in the database. If your database contains more than a few hundreds of thousands of LOBs and memory use becomes an issue, you can change one or all LOB schema tables to CACHED tables. See statements below:

                  Example 11.1. Using CACHED tables for the LOB schema

                    SET TABLE SYSTEM_LOBS.BLOCKS TYPE CACHED
                    SET TABLE SYSTEM_LOBS.LOBS TYPE CACHED
                    SET TABLE SYSTEM_LOBS.LOB_IDS TYPE CACHED
                  

                  Deployment context

                  The files used for storing HyperSQL database data are all in the same directory. New files are always created and deleted by the database engine. Two simple principles must be observed:

                  • The Java process running HyperSQL must have full privileges on the directory where the files are stored. This include create and delete privileges.

                  • The file system must have enough spare room both for the 'permanent' and 'temporary' files. The default maximum size of the *.log file is 50MB. The *.data file can grow to up to 16GB (more if the default has been increased). The .backup file can be up to the size of the *.data file. The *.lobs file can grow to several terabytes. The temporary files created at the time of a SHUTDOWN can be equal in size to the *.script file and the .data file.

                  Readonly Databases

                  A file: catalog can be made readonly permanently, or it can be opened as readonly. To make the database readonly, the property, value pair, readonly=true can be added to the .properties file of the database.

                  It is also possible to open a normal database as readonly. For this, the property can be included in the URL of the first connection to the database.

                  There is another option which allows MEMORY tables to be writeable, but without persisting the changes at SHUTDOWN. This option is activated with the property, value pair, files_readonly=true, which can be added to the .properties file of the database, or included in the URL of the first connection to the database. This option is useful for running application tests which operate on a predefined dataset.

                  ACID, Persistence and Reliability

                  HyperSQL 2.0 uses the same persistence mechanism as version 1.8, but with important enhancements. The code has proven reliable, as the last critical issue was fixed 2 years before the release of version 2.0.

                  There are further enhancements in version 2.2

                  • More extensive locking mechanism has been added to code to support multithreaded access.

                  • Incremental backup (an internal mechanism for crash protection) allows fast checkpoint and shutdown.

                  • All files are synced at checkpoints and also just before closing.

                  • The data file is enlarged in block increments

                  • The NIO file access implementation has been improved

                  Persistence relies on the JVM, the operating system, and the computer hardware. A database system like HSQLDB can perform millions of read and write operations in an hour. As system hardware and software can go wrong, it is impossible to achieve zero failure rate. Therefore regular backups are recommended. HyperSQL 2.2 has built-in database backup and restore features, discussed elsewhere in this chapter.

                  A note regarding the NIO file access implementation: This implementation applies only to CACHED table data in the .data file. Other files are not accessed via NIO. There has been an issue with some JVM implementations of nio not releasing the file buffers after they were closed. HyperSQL uses a workaround which is recommended for Sun JVM's. This does not apply to other JVM's. In such environments, it is therefore recommended to test the CHECKPOINT DEFRAG operation and the shutting down and restarting the database inside the same Java process extensively with NIO. Use of NIO can be turned off if necessary.

                  Atomicity, Consistency, Isolation, Durability

                  Atomicity means a transaction either fails without changing the data, or succeeds. HyperSQL ensures atomicity both during operations and in the event of a system crash.

                  Consistency means all the implicit and explicit integrity constraints are always enforced. HyperSQL always enforces the constraints and at the same time does not allow unenforceable constraints (illegal forms of CHECK constraints) to be created.

                  Isolation means transactions do not interfere with each other. HyperSQL enforces isolation according to strict rules of the database isolation model (MVCC or LOCKS).

                  Durability means a committed transaction is protected in case of a system crash. HyperSQL ensures durability according to the setting for WRITE DELAY MILLIS. A zero delay setting results in an FileDescriptor#sync() call each time a transaction commits. A timed delay means the FileDescriptor#sync() call is executed in the given intervals and only the last transactions committed in the interval may be lost. The sync() call is also made at all critical points, including when a file is about to be closed. Durability of files requires a reliable JVM and disk storage system that stores the data safely with a sync() call. In practice, many systems are generally reliable in this respect.

                  Backing Up Database Catalogs

                  The database engine saves the files containing all the data in a file catalog when a shutdown takes place. It automatically recovers from an abnormal termination and preserves the data when the catalog is opened next time. In an ideal operating environment, where there is no OS crash, disk failure, bugs in code, etc. there would be no need regularly to backup a database. This is meant to say, the engine performs the routine shutdown procedure internally, therefore backing up catalogs is an insurance policy against all sorts of misadventure that are not under the control of the database engine.

                  The data for each catalog consists of up to 5 files in the same directory with the endings such as *.properties, *.script, etc., as detailed in previous chapters.

                  HyperSQL 2.2 includes commands to backup the database files into a single .tar or .tar.gz file archive. The backup can be performed by a command given in a JDBC session if the target database catalog is running, or on the command-line if the target catalog has been shutdown.

                  Making Online Backups

                  To back up a running catalog, obtain a JDBC connection and issue a BACKUP DATABASE command in SQL. In its most simple form, the command format below will backup the database as a single .tar.gz file to the given directory.

                    BACKUP DATABASE TO <directory name> BLOCKING

                  The directory name must end with a slash to distinguish it as a directory, and the whole string must be in single quotes like so: 'subdir/nesteddir/'.

                  See the next section under Statements for details about the command and its options. See the sections below about restoring a backup.

                  Making Offline Backups

                  To back up an offline catalog, the catalog must be in shut down state. You will run a Java command like this. In this example, the database is named dbname and is in the dbdir directory. The backup is saved to a file named backup.tar in the tardir directory.

                  Example 11.2. Offline Backup Example

                    java -cp hsqldb.jar org.hsqldb.lib.tar.DbBackup --save tardir/backup.tar dbdir/dbname


                  where tardir/backup.tar is a file path to the *.tar or *.tar.gz file to be created in your file system, and dbdir/dbname is the file path to the catalog file base name (in same fashion as in server.database.* settings and JDBC URLs with catalog type file:.

                  Examining Backups

                  You can list the contents of backup tar files with DbBackup on your operating system command line, or with any Pax-compliant tar or pax client (this includes GNU tar),

                  Example 11.3. Listing a Backup with DbBackup

                    java -cp hsqldb.jar org.hsqldb.lib.tar.DbBackup --list tardir/backup.tar


                  You can also give regular expressions at the end of the command line if you are only interested in some of the file entries in the backup. Note that these are real regular expressions, not shell globbing patterns, so you would use .+script to match entries ending in "script", not *script.

                  You can examine the contents of the backup in their entirety by restoring the backup, as explained in the following section, to a temporary directory.

                  Restoring a Backup

                  You use DbBackup on your operating system command line to restore a catalog from a backup.

                  Example 11.4. Restoring a Backup with DbBackup

                    java -cp hsqldb.jar org.hsqldb.lib.tar.DbBackup --extract tardir/backup.tar dbdir


                  where tardir/backup.tar is a file path to the *.tar or *.tar.gz file to be read, and dbdir is the target directory to extract the catalog files into. Note that dbdir specifies a directory path, without the catalog file base name. The files will be created with the names stored in the tar file (and which you can see as described in the preceding section).

                  Encrypted Databases

                  HyperSQL supports encrypted databases. Encryption services use the Java Cryptography Extensions (JCE) and uses the ciphers installed with the JRE. HyperSQL itself does not contain any cryptography code.

                  Three elements are involved in specifying the encryption method and key. A cipher, together with its configuration is identified by a string which includes the name of the cipher and optional parameters. A provider is the fully qualified class name of the cipher provider. A key is represented as a hexadecimal string.

                  Creating and Accessing an Encrypted Database

                  First, a key must be created for the desired cipher and configuration. This is done by calling the function CRYPT_KEY(<cipher spec>, <provider>). If the default provider (the built-in JVM ciphers) is used, then NULL should be specified as the provider. The CRYPT_KEY function returns a hexadecimal key. The function call can be made in any HyperSQL database, so long as the provider class is on the classpath. This key can be used to create a new encrypted database. Calls to this function always return different keys, based on a generated random values.

                  As an example, a call to CRYPT_KEY('Blowfish', null) returned the string, '604a6105889da65326bf35790a923932'. To create a new database, the URL below is used:

                  jdbc:hsqldb:file:<database path>;crypt_key=604a6105889da65326bf35790a923932;crypt_type=blowfish

                  The third property name is crypt_provider. This is specified only when the provider is not the default provider.

                  HyperSQL works with any symmetric cipher that may be available from the JVM.

                  The files that are encrypted include the .script, .data, .backup and .log files. The .lobs file is not encrypted by default. The property crypt_lobs=true must be specified to encrypt the .lobs file.

                  Speed Considerations

                  General operations on an encrypted database are performed the same as with any database. However, some operations are significantly slower than with the equivalent cleartext database. With MEMORY tables, there is no difference to the speed of SELECT statements, but data change statements are slower. With CACHED tables, the speed of all statements is slower.

                  Security Considerations

                  Security considerations for encrypted databases have been discussed at length in HSQLDB discussion groups. Development team members have commented that encryption is not a panacea for all security needs. The following issues should be taken into account:

                  • Encrypted files are relatively safe in transport, but because databases contain many repeated values and words, especially known tokens such as CREATE, INSERT, etc., breaking the encryption of a database may be simpler than an unknown file.

                  • Only the files are encrypted, not the memory image. Poking into computer memory, while the database is open, will expose the contents of the database.

                  • HyperSQL is open source. Someone who has the key, can compile and use a modified version of the program that saves a full cleartext dump of an encrypted database

                  Therefore encryption is generally effective only when the users who have access to the crypt key are trusted.

                  Monitoring Database Operations

                  Database operations can be monitored at different levels using internal HyperSQL capabilities or add-ons.

                  External Statement Level Monitoring

                  Statement level monitoring allows you to gather statistics about executed statements. HyperSQL is supported by the monitoring tool JAMon (Java Application Monitor). JAMon is currently developed as the SourceForge project, jamonapi.

                  JAMon works at the JDBC level. It can monitor and gather statistics on different types of executed statements or other JDBC calls.

                  Early versions of JAMon were developed with HSQLDB and had to be integrated into HSQLDB at code level. The latest versions can be added on as a proxy in a much simpler fashion.

                  Internal Statement Level Monitoring

                  The internally-generated, individual sql log for the database can be enabled with the SET DATABASE EVENT LOG SQL LEVEL statement, described in this chapter. As all the executed statements are logged, there is an impact on speed. So you should only use this for debugging. Two levels of sql logging are supported.

                  Internal Event Monitoring

                  HyperSQL can log important internal events of the engine. These events occur during the operation of the engine, and are not always coupled with the exact type of statement being executed. Normal events such as opening and closing of files, or errors such as OutOfMemory conditions are examples of logged events.

                  HyperSQL supports two methods of logging. One method is specific to the individual database and is managed internally by HyperSQL. The other method is specific to JVM and is managed by a logging framework.

                  The internally-generated, individual log for the database can be enabled with the SET DATABASE EVENT LOG LEVEL statement, described in this chapter. This method of logging is very useful for desktop application deployment, as it provides an ongoing record of database operations.

                  Log4J and JDK logging

                  HyperSQL also supports log4J and JDK logging. The same event information that is passed to the internal log, is passed to external logging frameworks. These frameworks are typically configured outside HyperSQL. The log messages include the string "hsqldb.db." followed by the unique id (a 16 character string) of the database that generated the message, so they can be identified in a multi-database server context.

                  As the default JDK logging framework has several shortcomings, HyperSQL configures this logging framework for better operation. If you do not want HyperSQL to configure the JDK logging framework, you should include the system level property hsqldb.reconfig_logging=false in your environment.

                  Server Operation Monitoring

                  A Server or WebServer instance can be started with the property server.silent=false. This causes all the connections and their executed statements to be printed to stdout as the statements are submitted to the server.

                  Database Security

                  HyperSQL has extensive security features which are implemented at different levels and covered in different chapters of this guide.

                  1. The server can use SSL and IP address access control lists. See the HyperSQL Network Listeners (Servers) chapter.

                  2. You can define a system property to stop the database engine accessing the Java static functions that are on the classpath, apart from a limited set that you allow. See Securing Access to Classes in the SQL-Invoked Routines chapter.

                  3. You can define a system property to allow access to files on the file system outside the database directory and its children. This access is only necessary if you use TEXT tables. See the Text Tables chapter.

                  4. The database files can be encrypted. Discussed in this chapter.

                  5. Within the database, the DBA privileges are required for system and maintenance jobs.

                  6. You can define users and roles and grant them access on different database objects. Each user has a password and is granted a set of privileges. See the Access Control chapter.

                  7. You can define a password complexity check function for new and changed passwords. This is covered below under Authentication Settings.

                  8. You can use external authentication instead of internally stored password to authenticate users for each database. This is covered below under Authentication Settings.

                  HyperSQL security is multi-layered and avoids any loopholes to circumvent security. It is however the user's responsibility to enable the required level of security.

                  Security Defaults

                  The default setting are generally adequate for most embedded use of the database or for servers on the host that are accessed from the same machine. For servers accessed within a network, and especially for those accessed from outside the network, additional security settings must be used.

                  The default settings for server and web server do not use SSL or IP access control lists. These features are enabled programatically, or with the properties used to start the server.

                  The default settings allow a database user with the DBA role or with schema creation role to access static functions on the classpath. You can disable this feature or limit it to specific classes and methods. This can be done programatically or by setting a system property when you start a server.

                  If access to specific static functions is granted, then these functions must be considered as part of the database program and checked for any security flaws before inclusion in the classpath.

                  The default settings do not allow a user to access files outside the database directory. This access is for TEXT table source files. You can override this programatically or with a system property when you start a server.

                  The encryption of database file does not utilise any user-supplied information for encryption keys. This level of security is outside the realm of users and passwords.

                  The first user for a new database has the DBA role. This user name need was always SA in older versions of HSQLDB, but not in the latest versions. The name of the first DBA user and its password can be specified when the database is created by the first connection to the database. These settings are then stored in the database.

                  The initial user with the DBA role should be used for admin purposes only. At least one additional role should be created for normal database use in the application and at least one additional user should be created and granted this role. The new role should not be given the DBA role. It can be given the CREATE_SCHEMA role, which allows it to create and access multiple schemas. Alternatively, the user with the DBA role can create the schemas and their objects and then grant specific privileges on the objects to the non-DBA role.

                  Authentication Control

                  Authentication is the mechanism that determines if a user can access the database at all. Once authentication is performed, the authorization mechanism is used to determine which database objects the particular user can access. The default authentication mechanism is password authentication. Each user is created with a password, which is stored in the database and checked each time a new database connection is created.

                  Password Complexity Check

                  HyperSQL allows you to define a function that checks the quality of the passwords defined in the database. The passwords are stored in the database. Each time a user connects, the user's name and password are checked against the stored list of users and passwords. The connection attempt is rejected if there is no match.

                  External Authentication

                  You can use an external authentication mechanism instead of the internal authentication mechanism. HyperSQL allows you to define a function that checks the combination of database unique name, user name, and password for each connection attempt. The function can use external resources to authenticate the user. For example, a directory server may be used. The password may be ignored if the external resource can verify the user's credential without it.

                  You can override external authentication for a user with the ALTER USER statement. See the Access Control chapter

                  Compatibility with Other RDBMS

                  HyperSQL is used more than any other database engine for application testing and development targeted at other databases. Over the years, this usage resulted in developers finding and reporting many obscure bugs in HyperSQL, which have all been fixed in the latest version. Also, HyperSQL 2.0 has been written to the SQL Standard and avoids the traps caused by superficial imitation of existing RDBMS.

                  HyperSQL has many property settings that relax conformance to the Standard in order to allow compatibility with other RDBMS, without breaking the core integrity of the database. These properties are modified with SET DATABASE SQL statements described in the SQL Conformance Settings section of this chapter

                  The SQL Standard has existed since 1989 and has been expanded over the years in several revisions. Also, the X-Open specification has defined a number of SQL functions which are implemented by most RDBMS.

                  Each RDBMS supports additional functions that are not covered by the standard. Some RDBMS use non-standard syntax for some operations. Fortunately, most popular RDBMS products have introduced better compatibility with the Standard in their recent versions, but there are still some portability issues. HyperSQL overcomes the potability issues using these strategies

                  • An extensive set of functions cover the SQL Standard, X-Open, and most of the useful functions that other RDBMS may support.

                  • Database properties, which can be specified on the URL or as SQL statements, relax conformance to the Standard in order to allow non-standard comparisons and assignments allowed by other RDBMS.

                  • Specific SQL syntax compatibility modes allow syntax and type names that are supported by some popular RDBMS.

                  • User-defined types and functions, including aggregate functions, allow any type or function that is supported by some RDBMS to be defined and used.

                  In the future, the supported compatibility modes with other RDBMS will be expanded further.

                  PostgreSQL Compatibility

                  PostgreSQL is fairly compatible with the Standard, but uses some non-standard features.

                  • Use <set database sql syntax PGS statement> to enable the PostgreSQL's non-standard features. References to SERIAL, BIGSERIAL and TEXT data types, as well as sequence functions, are translated into HSQLDB equivalents.

                  • Use MVCC if your application is multi-user

                  • PostgreSQL functions are generally supported

                  • For identity columns, PostgreSQL uses a non-standard linkage with an external identity sequence. In most cases, this can be converted to GENERATED BY DEFAULT AS IDENTITY. In those cases where the identity sequence needs to be shared by multiple tables, you can use a new HyperSQL 2.2 feature GENERATED BY DEFAULT AS SEQUENCE <sequence name>, which is the equivalent of the PostgreSQL implementation.

                  • In CREATE TABLE statements, the SERIAL and BIGSERIAL types are translated into INTEGER or BIGINT, with GENERATED BY DEFAULT AS IDENTITY. Usage of DEFAULT NEXTVAL(<sequence name>) is supported so long as the <sequence name> refers to an existing sequence. This usage is translated into GENERATED BY DEFAULT AS SEQUENCE <sequence name>.

                  • In SELECT and other statements, the NEXTVAL(<sequence name>) and LASTVAL() functions are supported and translated into HyperSQL's NEXT VALUE FOR <sequence name> and IDENTITY() expressions.

                  • PostgreSQL uses a non-standard expression, SELECT 'A Test String' to return a single row table. The standard form is VALUES('A Test String'). In PGS syntax mode, this type of SELECT is supported.

                  • HyperSQL supports SQL Standard ARRAY types. PostgreSQL also supports this, but not entirely according to the Standard.

                  • SQL routines are portable, but some syntax elements are different and require changes.

                  • You may need to use SET DATABASE SQL TDC { DELETE | UPDATE } FALSE statements, as PostgreSQL does not enforce the subtle rules of the Standard for foreign key cascading deletes and updates.

                  MySQL Compatibility

                  MySQL had many incompatibilities with the Standard. The latest versions have introduced much greater compatibly, but some of these features have to be turned on via properties. You should therefore check the current Standard compatibility settings of your MySQL database and use the available HyperSQL properties to achieve closer results. If you avoid the few anti-Standard features of MySQL you can port your databases to HyperSQL.

                  HyperSQL does not have the following non-standard limitations of MySQL.

                  • Win HyperSQL, an UPDATE statement can update UNIQUE and PRIMARY KEY columns of a table without causing an exception due to temporary violation of constraints. These constraints are checked at the end of execution, therefore there is no need for an ORDER BY clause in an UPDATE statement.

                  • MySQL foreign key constraints are not enforced by the default MyISAM engine. Be aware of the possibility of data being rejected by HyperSQL due to these constraints.

                  • With HyperSQL INSERT or UPDATE statements either succeed or fail due to constraint violation. MySQL has the non-standard IGNORE overrides to ignore violations, which is not accepted by HyperSQL.

                  • Unlike MySQL, HyperSQL allows you to modify a table with an INSERT, UPDATE or DELETE statement which selects from the same table in a subquery.

                  Follow the guidelines below for converting MySQL databases and applications.

                  • Use <set database sql syntax MYS statement> to enable support for AUTO_INCREMENT and TEXT data types. These type definitions are translated into HSQLDB equivalents.

                  • Use MVCC with <set database transaction control statement> if your application is multi-user.

                  • Avoid storing invalid values, for example invalid dates such as '0000-00-00' or '2001-00-00' which are rejected by HyperSQL.

                  • Avoid the MySQL feature that trims spaces at the end of CHAR values.

                  • In MySQL, a database is the same as a schema. In HyperSQL several schemas can exist in the same database and accessed transparently. In addition a HyperSQL server supports multiple separate databases.

                  • In MySQL, older, non-standard, forms of database object name case-sensitivity make is difficult to port applications. Use the latest form which encloses case-sensitive names in double quotes.

                  • MySQL functions are generally supported, including GROUP_CONCAT.

                  • For fine control over type conversion, check the settings for <set database sql convert truncate statement>

                  • If you use concatenation of possibly NULL values in your select statements, you may need to change the setting with the <set database sql concat nulls statement>

                  • MySQL supports most SQL Standard types (except INTERVAL types), as well as non-standard types, which are also supported by HyperSQL. Supported types include SMALLINT, INT, BIGINT, DOUBLE, FLOAT, DECIMAL, NUMERIC, VARCHAR, CHAR, BINARY, VARBINARY, BLOB, DATE, TIMESTAMP (all Standard SQL) and TINYINT, DATETIME (non Standard).

                  • MySQL uses a non-standard expression, SELECT 'A Test String' to return a single row table. The standard form is VALUES('A Test String'). In MYS syntax mode, this type of SELECT is supported.

                  • SQL user-defined function and procedure syntax is very similar to SQL Standard syntax. A few changes may still be required.

                  Firebird Compatibility

                  Firebird generally follows the SQL Standard. Applications can be ported to HyperSQL without difficulty.

                  Apache Derby Compatibility

                  Apache Derby supports a smaller subset of the SQL Standard compared to HyperSQL. Applications can be ported to HyperSQL without difficulty.

                  • Use MVCC with <set database transaction control statement> if your application is multi-user.

                  • HyperSQL supports Java language functions and stored procedures with the standard syntax, which is similar to the way Derby supports these features.

                  Oracle Compatibility

                  Recent versions of Oracle support Standard SQL syntax for outer joins and many other operations. In addition, HyperSQL features a setting to support Oracle syntax and semantics for the most widely used non-standard features.

                  • Use <set database sql syntax ORA statement> to enable support for some non-standard syntax of Oracle.

                  • Use MVCC with <set database transaction control statement> if your application is multi-user.

                  • Fine control over MVCC deadlock avoidance is provided by the <set database transaction rollback on conflict statement> and the corresponding hsqldb.tx_conflict_rollback connection property.

                  • If your application relies on Oracle behaviour for nulls in multi-column UNIQUE constraints, use <set database sql unique nulls statement> to change the default.

                  • If you use the non-standard concatenation of possibly NULL values in your select statements, you may need to change the setting for <set database sql concat nulls statement>.

                  • Many Oracle functions are supported, including no-arg functions such as SYSDATE and SYSTIMESTAMP and more complex ones such as TO_DATE and TO_CHAR.

                  • Non-standard data type definitions such as NUMBER, VARCHAR2, NVARCHAR2, BINARY_DOUBLE, BINARY_FLOAT, LONG, RAW are translated into the closest HyperSQL / SQL Standard equivalent in ORA mode.

                  • The DATE type is interpreted as TIMESTAMP(0) in ORA syntax mode.

                  • The DUAL table and the expressions, ROWNUM, CURRVAL, NEXTVAL are supported in ORA syntax mode.

                  • HyperSQL natively supports operations involving datetime and interval values. These features are based on the SQL Standard.

                  • Many subtle automatic type conversions, syntax refinements and other common features are supported.

                  • SQL routines are generally portable, but some changes may be required.

                  DB2 Compatibility

                  DB2 is highly compatible with the SQL Standard (except its lack of support for the INFORMATION_SCHEMA). Applications can be ported to HyperSQL without difficulty.

                  • Use <set database sql syntax DB2 statement> to enable support for some non-standard syntax of DB2.

                  • Use MVCC with <set database transaction control statement> if your application is multi-user.

                  • HyperSQL supports almost the entire syntax of DB2 together with many of the functions. Even local temporary tables using the SESSION pseudo schema are supported.

                  • The DB2 binary type definition FOR BIT DATA, as well as empty definition of column default values are supported in DB2 syntax mode.

                  • Many DB2 functions are supported.

                  • The DUAL table and the expressions, ROWNUM, CURRVAL, NEXTVAL are supported in DB2 syntax mode.

                  • SQL routines are highly portable with minimal change.

                  MS SQLServer and Sybase Compatibility

                  SQLServer has some incompatibilities with the Standard syntax. The most significant is the use of square brackets instead of double quotes for case-sensitive column names.

                  • Use <set database sql syntax MSS statement> to enable support for the CONVERT(<type definition>, <expression) function with switched order of arguments

                  • Use MVCC with <set database transaction control statement> if your application is multi-user.

                  • If you use the non-standard concatenation of possibly NULL values in your select statements, you may need to change the setting for <set database sql concat nulls statement>.

                  • HyperSQL supports + for string concatenation. It also supports many functions supported by these dialects.

                  • SQLServer uses a non-standard expression, SELECT 'A Test String' to return a single row table. The standard form is VALUES('A Test String'). In MSS syntax mode, this type of SELECT is supported.

                  • SQL routines need quite a lot of changes.

                  Statements

                  System level statements are listed in this section. Statements that begin with SET DATABASE or SET FILES are for properties that have an effect on the normal operation of HyperSQL. The effects of these statements are also discussed in different chapters.

                  System Operations

                  These statements perform a system level action.

                  SHUTDOWN

                  shutdown statement

                  <shutdown statement> ::= SHUTDOWN [IMMEDIATELY | COMPACT | SCRIPT]

                  Shutdown the database. If the optional qualifier is not used, a normal SHUTDOWN is performed. A normal SHUTDOWN ensures all data is saved correctly and the database opens without delay on next use.

                  SHUTDOWN

                  Normal shutdown saves all the database files, then deletes the .log file (and the .backup file in the default mode). This does the same thing as CHECKPOINT, but closes the database when it completes. The database opens without delay on next used.

                  SHUTDOWN IMMEDIATELY

                  Saves the *.log file and closes the database files. This is the quickest form of shutdown. This command should not be used as the routine method of closing the database, because when the database is accessed next time, it may take a long time to start.

                  SHUTDOWN COMPACT

                  This is similar to normal SHUTDOWN, but reduces the *.data file to its minimum size. It can take much longer than normal SHUTDOWN. This shouldn't be used as routine.

                  SHUTDOWN SCRIPT

                  This is similar to SHUTDOWN COMPACT, but it does not rewrite the *.data and text table files. After SHUTDOWN SCRIPT, only the *.script and *.properties files remain. At the next startup, these files are processed and the *.data file is created if there are cached tables. This command in effect performs part of the job of SHUTDOWN COMPACT, leaving the other part to be performed automatically at the next startup.

                  This command produces a full script of the database which can be edited for special purposes prior to the next startup.

                  Only a user with the DBA role can execute this statement.

                  BACKUP DATABASE

                  backup database statement

                  <backup database statement> ::= BACKUP DATABASE TO <file path> [SCRIPT] {[NOT] COMPRESSED} {[NOT] BLOCKING}

                  Backup the database to specified <file path> for archiving purposes.

                  The <file path> can be in two forms. If the <file path> ends with a forward slash, it specifies a directory. In this case, an automatic name for the archive is generated that includes the date, time and the base name of the database. The database is backed up to this archive file in the specified directory. The archive is in .tar.gz or .tar format depending on whether it is compressed or not.

                  If the <file path> does not end with a forward slash, it specifies a user-defined file name for the backup archive. The file extension must be either .tar.gz or .tar and this must match the compression option.

                  The default set of options is COMPRESSED BLOCKING.

                  If SCRIPT is specified, the backup will contain a *.script file, which contain all the data and settings of the database. Otherwise, it consists of the current snapshot of all database files.

                  If NOT COMPRESSED is specified, the backup is a tar file, without compression. Otherwise, it is in gzip format.

                  The qualifier, BLOCKING, means all database operations are suspended during backup. During backup, a CHECKPOINT command is silently executed. This mode is always used when SCRIPT is specified.

                  Hot backup is performed if NOT BLOCKING is specified. In this mode, the database can be used during backup. This mode should only be used with very large databases. A hot backup set is less compact and takes longer to restore and use than a normal backup set produced with the BLOCKING option. You can perform a CHECKPOINT just before a hot backup in order to reduce the size of the backup set.

                  The HyperSQL jar also contains a program that creates an archive of an offline database. It also contains a program to expand an archive into database files. These programs are documented in this chapter under Backing up Database Catalogs.

                  Only a user with the DBA role can execute this statement.

                  CHECKPOINT

                  checkpoint statement

                  <checkpoint statement> ::= CHECKPOINT [DEFRAG]

                  Closes the database files, rewrites the script file, deletes the log file and opens the database. If DEFRAG is specified, also shrinks the *.data file to its minimum size.

                  Only a user with the DBA role can execute this statement.

                  Only a user with the DBA role can execute this statement.

                  SCRIPT

                  script statement

                  <script statement> ::= SCRIPT [<file name>]

                  Returns a script containing SQL statements that define the database, its users, and its schema objects. If <file name> is not specified, the statements are returned in a ResultSet, with each row containing an SQL statement. No data statements are included in this form. The optional file name is a single-quoted string. If <file name> is specified, then the script is written to the named file. In this case, all the data in all tables of the database is included in the script as INSERT statements.

                  Only a user with the DBA role can execute this statement.

                  Database Settings

                  These statements change the database settings.

                  SET DATABASE COLLATION

                  set database collation statement

                  <set database collation statement> ::= SET DATABASE COLLATION <collation name> [ NO PAD | PAD SPACE ]

                  Each database can have its own default collation. Sets the collation from the set of collations supported by HyperSQL. Once this command has been issued, the database can be opened in any JVM and will retain its collation.

                  All collations pad the shorter string with spaces when two strings are compared. If NO PAD is specified, comparison is performed without padding. The default system collation is named SQL_TEXT. To use the default without padding use SET DATABASE COLLATION SQL_TEXT NO PAD.

                  Only a user with the DBA role can execute this statement.

                  SET DATABASE DEFAULT RESULT MEMORY ROWS

                  set database default result memory rows statement

                  <set database default result memory rows> ::= SET DATABASE DEFAULT RESULT MEMORY ROWS <unsigned integer literal>

                  Sets the maximum number of rows of each result set and internal temporary table that is held in memory. Temporary tables includes views, schema-based and session-based TEMPORARY tables, transient tables for subqueries, and INFORMATION_SCHEMA tables.

                  This setting applies to all sessions. Individual sessions can change the value with the SET SESSION RESULT MEMORY ROWS statement. The default is 0, meaning all result sets are held in memory.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.result_max_memory_rows.

                  SET DATABASE DEFAULT TABLE TYPE

                  set database default table type statement

                  <set database default table type> ::= SET DATABASE DEFAULT TABLE TYPE { CACHED | MEMORY }

                  Sets the type of table created when the next CREATE TABLE statement is executed. The default is MEMORY.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.default_table_type.

                  SET DATABASE EVENT LOG LEVEL

                  set database event log level statement

                  <set database event log level> ::= SET DATABASE EVENT LOG [ SQL ] LEVEL { 0 | 1 | 2 | 3 }

                  When the SQL option is not used, this statement sets the amount of information logged in the internal, database-specific event log. Level 0 means no log. Level 1 means only important (error) events. Level 2 means more events, including both important and less important (normal) events. Level 3 includes even more details. For readonly and mem: databases, if the level is set above 0, the log messages are directed to stderr.

                  The events are logged in a file with the extension .app.log alongside the main database files.

                  This is equivalent to the connection property hsqldb.applog.

                  When the SQL option is used, this statement logs the SQL statements as they are executed. Each log line contains the timestamp and the session number, followed by the SQL statement and JDBC arguments if any.

                  Levels 1 and 2 are supported. Level 1 only logs commits and rollbacks, while Level 2 logs all statements.

                  The logged lines are stored in a file with the extension .sql.log alongside the main database files.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.sqllog.

                  SET DATABASE GC

                  set database gc statement

                  <set database gc statement> ::= SET DATABASE GC <unsigned integer literal>

                  An optional property which forces calls to System.gc() after the specified number of row operations. The default value for this property is 0, which means no System.gc() calls. Usual values for this property range from 10000 depending on the system and the memory allocation. This property may be useful in some in-process deployments, especially with older JVM implementations.

                  Only a user with the DBA role can execute this statement.

                  SET DATABASE UNIQUE NAME

                  set database unique name

                  <set database unique name statement> ::= SET DATABASE UNIQUE NAME <identifier>

                  Each HyperSQL catalog (database) has an engine-generated internal name. This name is a 16 character long string, beginning with HSQLDB and based on the time of creation of the database. The name is used for the log events that are sent to external logging frameworks. The new name must be exactly 16 characters long with no spaces.

                  Only a user with the DBA role can execute this statement.

                  SET DATABASE TRANSACTION CONTROL

                  set database transaction control statement

                  <set database transaction control statement> ::= SET DATABASE TRANSACTION CONTROL { LOCKS | MVLOCKS | MVCC }

                  Set the concurrency control system for the database. It can be issued only when all sessions have been committed or rolled back. This command and its modes is discussed in the Sessions and Transactions chapter.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.tx.

                  SET DATABASE TRANSACTION ROLLBACK ON CONFLICT

                  set database transaction rollback on conflict statement

                  <set database transaction rollback on conflict statement> ::= SET DATABASE TRANSACTION ROLLBACK ON CONFLICT { TRUE | FALSE }

                  When a transaction deadlock or conflict is about to happen, the current transaction is rolled back and an exception is raised. When this property is set false, the transaction is not rolled back. Only the latest statement that would cause the conflict is undone and an exception is raised. The property should not be changed unless the application can quickly perform an alternative statement and complete the transaction. It is provided for compatibility with other database engines which do not roll back the transaction upon deadlock. This command is also discussed in the Sessions and Transactions chapter.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.tx_conflict_rollback.

                  SET DATABASE DEFAULT ISOLATION LEVEL

                  set database default isolation level statement

                  <set database default isolation level> ::= SET DATABASE DEFAULT ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE }

                  Sets the transaction isolation level for new sessions. The default is READ COMMITTED. Each session can also set its isolation level.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.tx_level.

                  SET DATABASE TEXT TABLE DEFAULTS

                  set database text table defaults statement

                  <set database text table defaults statement> ::= SET DATABASE TEXT TABLE DEFAULTS <character literal>

                  An optional property to override default text table settings. The string literal has the same format as the string used for setting the data source of a text table, but without the file name. See the Text Tables chapter.

                  Only a user with the DBA role can execute this statement.

                  SQL Conformance Settings

                  These statements modify the level of conformance to the SQL Standard in different areas. The settings that specify SQL SYNTAX are for compatibility with other database engines and are FALSE by default. For all the rest of the settings, TRUE means better conformance to the Standard (unless the Standard defines the behaviour as implementation dependent). The default value of a few of these settings is FALSE, due to widespread non-conforming statements that are already in use in user applications or statements generated by object relational tools. So long as it is practical, it is best to set the non-conforming defaults to TRUE in order to improve the quality of the database application.

                  SET DATABASE SQL SIZE

                  set database sql size statement

                  <set database sql size statement> ::= SET DATABASE SQL SIZE { TRUE | FALSE }

                  Enable or disable enforcement of column sizes for CHAR and VARCHAR columns. The default is TRUE, meaning table definition must contain VARCHAR(n) instead of VARCHAR.

                  SQL Standard requires enforcement.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.enforce_size.

                  SET DATABASE SQL NAMES

                  set database sql names statement

                  <set database sql names statement> ::= SET DATABASE SQL NAMES { TRUE | FALSE }

                  Enable or disable full enforcement of the rule that prevents SQL keywords being used for database object names such as columns and tables. The default is FALSE, meaning disabled.

                  SQL Standard requires enforcement. It is better to enable this check, in order to improve the quality and correctness of SQL statements.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.enforce_names.

                  SET DATABASE SQL REGULAR NAMES

                  set database sql regular names statement

                  <set database sql regular names statement> ::= SET DATABASE SQL REGULAR NAMES { TRUE | FALSE }

                  Enable or disable use of the underscore character at the beginning, or the dollar character anywhere in database object names such as columns and tables. The default is TRUE, meaning disabled.

                  SQL Standard does not allow the underscore character at the start of names, and does not allow the dollar character anywhere in a name. This setting can be changed for compatibility with existing database or for porting databases which include names that do not conform to the Standard.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.regular_names.

                  SET DATABASE SQL REFERENCES

                  set database sql references statement

                  <set database sql references statement> ::= SET DATABASE SQL REFERENCES { TRUE | FALSE }

                  This command can enable or disable full enforcement of the rule that prevents ambiguous column references in SQL statements (usually SELECT statements). A column reference is ambiguous when it is not qualified by a table name or table alias and can refer to more than one column in a JOIN list.

                  The property is FALSE by default.

                  SQL Standard requires enforcement. It is better to enable this check, in order to improve the quality and correctness of SQL statements. When false, the first matching table is used to resolve the column reference.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.enforce_refs.

                  SET DATABASE SQL TYPES

                  set database sql types statement

                  <set database sql types statement> ::= SET DATABASE SQL TYPES { TRUE | FALSE }

                  This command can enable or disable full enforcement of the rules that prevents illegal type conversions and parameters or nulls without type in SQL statements (usually SELECT statements). For example an INTEGER column or a DATE column cannot be compared to a character string or searched with a LIKE expression when the property is TRUE.

                  The property is FALSE by default.

                  SQL Standard requires enforcement. It is better to enable this check, in order to improve the quality and correctness of SQL statements.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.enforce_type.

                  SET DATABASE SQL TDC DELETE

                  set database sql tdc delete statement

                  <set database sql tdc delete statement> ::= SET DATABASE SQL TDC DELETE { TRUE | FALSE }

                  This command can enable or disable full enforcement of the SQL Standard rules that prevents triggered data change exceptions caused by ON DELETE CASCADE clauses of foreign key constraint.

                  When there are multiple constraints, a row may be updated by one constraint and deleted by another constraint in the same operation. This is not allowed by default. Changing this to false allows such violations of the Standard to pass without an exception.

                  The property is TRUE by default.

                  SQL Standard requires enforcement, therefore this property shouldn't be changed unless an application written for a non-conforming RDBMS needs it.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.enforce_tdc_delete.

                  SET DATABASE SQL TDC UPDATE

                  set database sql tdc update statement

                  <set database sql tdc update statement> ::= SET DATABASE SQL TDC UPDATE { TRUE | FALSE }

                  This command can enable or disable full enforcement of the SQL Standard rules that prevents triggered data change exceptions caused by multiple ON UPDATE or ON DELETE SET clauses of foreign key constraint. When there are multiple constraints, a field in a row may be updated by two constraints to different values in the same operation. This is not allowed by default. Changing this to FALSE allows such violations of the Standard to pass without an exception.

                  The property is TRUE by default.

                  SQL Standard requires enforcement, therefore this property shouldn't be changed unless an application written for a non-conforming RDBMS needs it.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.enforce_tdc_update.

                  SET DATABASE SQL TRANSLATE TTI TYPES

                  set database sql translate tti types statement

                  <set database sql translate tti types statement> ::= SET DATABASE SQL TRANSLATE TTI TYPES { TRUE | FALSE }

                  The JDBC Specification up to version 4.1 does not support some SQL Standard built-in types, therefore these types must be translated to a supported type when accessed through JDBC ResultSet and PreparedStatement methods.

                  If the property is true, the TIME / TIMESTAMP WITH TIME ZONE types and INTERVAL types are represented in JDBC methods of ResultSetMetaData and DatabaseMetaData as JDBC datetime types without time zone and the VARCHAR type respectively. The original type names are preserved.

                  The property is TRUE by default. If set to FALSE, the type codes for WITH TIME ZONE types will be SQL type codes as opposed to JDBC type codes.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property jdbc.translate_tti_types.

                  SET DATABASE SQL CONCAT NULLS

                  set database sql concat nulls statement

                  <set database sql concat nulls statement> ::= SET DATABASE SQL CONCAT NULLS { TRUE | FALSE }

                  When the property is TRUE, concatenation of a null value with a not-null value results in a null value. When the property is FALSE this type of concatenation result in the not-null value.

                  Setting this property FALSE results in concatenation behaviour similar to Oracle or MS SQL Server.

                  SQL Standard requires a NULL result..

                  The property is TRUE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.concat_nulls.

                  SET DATABASE SQL UNIQUE NULLS

                  set database sql unique nulls statement

                  <set database sql unique nulls statement> ::= SET DATABASE SQL UNIQUE NULLS { TRUE | FALSE }

                  When the property is TRUE, with multi-column UNIQUE constraints, it is possible to insert multiple rows for which one or more of the values for the constraint columns is NULL. When the property is FALSE, if there is any not-null value in the columns, then the set of values is compared to the existing rows and if there is a match, an exception is thrown. The setting FALSE, makes the behaviour more restrictive. For example, inserting (1, null) twice is possible by default, but not possible when the property is FALSE.

                  Setting this property FALSE results in UNIQUE constraint behaviour similar to Oracle.

                  SQL Standard requires the default (TRUE) behaviour.

                  The property is TRUE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.unique_nulls.

                  SET DATABASE SQL CONVERT TRUNCATE

                  set database sql unique convert truncate

                  <set database sql convert truncate statement> ::= SET DATABASE SQL CONVERT TRUNCATE { TRUE | FALSE }

                  When the property is TRUE, conversion from a floating point value (a DOUBLE value) to an integral type always truncates the fractional part. When the property is FALSE, rounding takes place instead of truncation. For example, assigning the value 123456E-2 to an integer column will result in 1234 by default, but 1235 when the property is FALSE.

                  Standard SQL considers this behaviour implementation dependent.

                  The property is TRUE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.convert_trunc.

                  SET DATABASE SQL AVG SCALE

                  set database sql avg scale

                  <set database sql avg scale> ::= SET DATABASE SQL AVG SCALE <numeric value>

                  By default, the result of division and the AVG and MEDIAN aggregate functions has the same type as the aggregated type of the values. This includes the scale. The scale specified with this property is used if it is larger than the scale of the operation. For example, the average of 5 and 10 is 7 by default, but 7.50 if the scale is specified as 2. The result of 7/3 is 2 by default but 2.33 if the scale is specified as 2.

                  Standard SQL considers this behaviour implementation dependent. Some databases use a default scale larger than zero.

                  The property is 0 by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.avg_scale.

                  SET DATABASE SQL DOUBLE NAN

                  set database sql double nan

                  <set database sql double nan> ::= SET DATABASE SQL DOUBLE NAN { TRUE | FALSE }

                  When the property is TRUE, division of a floating point value (a DOUBLE value) by zero raises an exception. When the property is FALSE, a Java Double.NaN, POSITIVE_INFINITY or NEGATIVE_INFINITY value is returned.

                  Standard SQL requires an exception to be raised.

                  The property is TRUE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.double_nan.

                  SET DATABASE SQL NULLS FIRST

                  set database sql nulls first

                  <set database sql nulls first> ::= SET DATABASE SQL NULLS FIRST { TRUE | FALSE }

                  When the property is TRUE, nulls appear before values in result sets with ORDER BY. When set FALSE, nulls appear after the values. Some databases, including PostgreSQL, Oracle and MS SQL Server, return nulls after the values.

                  The property is TRUE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.nulls_first.

                  SET DATABASE SQL SYNTAX DB2

                  set database sql syntax DB2

                  <set database sql syntax DB2 statement> ::= SET DATABASE SQL SYNTAX DB2 { TRUE | FALSE }

                  This property, when set TRUE, enables support for some elements of DB2 syntax. Single-row SELECT statements (SELECT <expression list> without the FROM clause) are supported and treated as the SQL Standard equivalent, VALUES <expression list>. The DUAL table is supported, as well as the ROWNUM pseudo-column. BINARY type definitions such as VARCHAR(L) FOR BIT DATA are supported. Empty DEFAULT clauses in column definitions are supported.

                  The property is FALSE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.syntax_db2.

                  SET DATABASE SQL SYNTAX MSS

                  set database sql syntax MSS

                  <set database sql syntax MSS statement> ::= SET DATABASE SQL SYNTAX MSS { TRUE | FALSE }

                  This property, when set TRUE, enables support for some elements of SQLServer syntax. Single-row SELECT statements (SELECT <expression list> without the FROM clause) are supported and treated as the SQL Standard equivalent, VALUES <expression list>. The parameters of CONVERT() function are switched in this mode.

                  The property is FALSE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.syntax_mss.

                  SET DATABASE SQL SYNTAX MYS

                  set database sql syntax MYS

                  <set database sql syntax MYS statement> ::= SET DATABASE SQL SYNTAX MYS { TRUE | FALSE }

                  This property, when set TRUE, enables support for some elements of MySQL syntax. The TEXT data type is translated to LONGVARCHAR.

                  In CREATE TABLE statements, [NOT NULL | NULL] can be used immediately after the column type name and before the DEFAULT clause. AUTO_INCREMENT is translated to the GENERATED BY DEFAULT AS IDENTITY clause.

                  Single-row SELECT statements (SELECT <expression list> without the FROM clause) are supported and treated as the SQL Standard equivalent, VALUES <expression list>.

                  The property is FALSE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.syntax_mys.

                  SET DATABASE SQL SYNTAX ORA

                  set database sql syntax ORA

                  <set database sql syntax ORA statement> ::= SET DATABASE SQL SYNTAX ORA { TRUE | FALSE }

                  This property, when set TRUE, enables support for some elements of Oracle syntax. The DUAL table is supported, together with ROWNUM, NEXTVAL and CURRVAL syntax and semantics.

                  The non-standard types are translated to supported standard types. BINARY_DOUBLE and BINARY_FLOAT are translated to DOUBLE. LONG RAW and RAW are translated to VARBINARY with long or medium length limits. LONG and VARCHAR2 are translated to VARCHAR with long or medium length limits. NUMBER is translated to DECIMAL. Some extra type conversions and no-arg functions are also allowed in this mode.

                  The property is FALSE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.syntax_ora.

                  SET DATABASE SQL SYNTAX PGS

                  set database sql syntax PGS

                  <set database sql syntax PGS statement> ::= SET DATABASE SQL SYNTAX PGS { TRUE | FALSE }

                  This property, when set TRUE, enables support for some elements of PosgtreSQL syntax. The TEXT data type is translated to LONGVARCHAR, while the SERIAL data types is translated to BIGINT together with GENERATED BY DEFAULT AS IDENTITY.

                  Single-row SELECT statements (SELECT <expression list> without the FROM clause) are supported and treated as the SQL Standard equivalent, VALUES <expression list>.

                  The functions NEXTVAL(<sequence name string>), CURRVAL(<sequence name string>) and LASTVAL() are supported in this compatibility mode.

                  The property is FALSE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.syntax_pgs.

                  SET DATABASE REFERENTIAL INTEGRITY

                  set database referential integrity statement

                  <set database referential integrity statement> ::= SET DATABASE REFERENTIAL INTEGRITY { TRUE | FALSE }

                  This command enables or disables the enforcement of referential integrity constraints (foreign key constraints), check constraints apart from NOT NULL and execution of triggers. By default, all constraints are checked.

                  The only legitimate use of this statement is before importing large amounts of external data into tables that have existing FOREIGN KEY constraints. After import, the statement must be used again to enable constraint enforcement.

                  If you are not sure the data conforms to the constraints, run queries to verify all rows conform to the FOREIGN KEY constraints and take appropriate actions for the rows that do not conform.

                  A query example to return the rows in a foreign key table that have no parent is given below:

                  Example 11.5. Finding foreign key rows with no parents after a bulk import

                    SELECT * FROM foreign_key_table LEFT OUTER JOIN primary_key_table 
                      ON foreign_key_table.fk_col = primary_key_table.pk_col WHERE primary_key_table.pk_col IS NULL

                  Only a user with the DBA role can execute this statement.

                  Cache, Persistence and Files Settings

                  These statements control the memory and other settings for database persistence.

                  SET FILES BACKUP INCREMENT

                  set files backup increment statement

                  <set files backup increment statement> ::= SET FILES BACKUP INCREMENT { TRUE | FALSE }

                  Older versions of HSQLDB perform a backup of the .data file before its contents are modified and the whole .data file is saved in a compressed form when a CHECKPOINT or SHUTDOWN is performed. This takes a long time when the size of the database exceeds 100 MB or so (on an average 2010 computer, you can expect a backup speed of 20MB per second or more).

                  The alternative is backup in increments, just before some part of the .data file is modified. In this mode, no backup is performed at CHECKPOINT or SHUTDOWN. This mode is preferred for large databases which are opened and closed frequently.

                  The default mode is TRUE. If the old method of backup is preferred, the mode can be set FALSE.

                  Warning: The old, non-incremental setting, FALSE, shouldn't be used at all when the data file is larger than 4GB. If it is used, the data file is not fully backed up and can result in corruption. The zip compression method is used in this mode and it is limited to 4GB size.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.inc_backup.

                  SET FILES CACHE ROWS

                  set files cache rows statement

                  <set files cache rows statement> ::= SET FILES CACHE ROWS <unsigned integer literal>

                  Sets the maximum number of rows (of CACHED tables) held in the memory cache. The default is 50000 rows.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.cache_rows.

                  SET FILES CACHE SIZE

                  set files cache size statement

                  <set files cache size statement> ::= SET FILES CACHE SIZE <unsigned integer literal>

                  Sets maximum amount of data (of CACHED tables) in kilobytes held in the memory cache. The default is 10000 kilobytes. Note the amount of memory used is larger than this amount, which does not account for Java object size overheads.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.cache_size.

                  SET FILES DEFRAG

                  set files defrag statement

                  <set files defrag statement> ::= SET FILES DEFRAG <unsigned integer literal>

                  Sets the threshold for performing a DEFRAG during a checkpoint. The <unsigned integer literal> is the percentage of abandoned space in the *.data file. When a CHECKPOINT is performed either as a result of the .log file reaching the limit set by SET FILES LOG SIZE m, or by the user issuing a CHECKPOINT command, the amount of space abandoned since the database was opened is checked and if it is larger than specified percentage, a CHECKPOINT DEFRAG is performed instead of a CHECKPOINT.

                  The default is 0, which indicates no DEFRAG. Useful values are between 10 to 50.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.defrag_limit.

                  SET FILES LOG

                  set files log statement

                  <set files log statement> ::= SET FILES LOG { TRUE | FALSE }

                  Sets logging of database operations on or off. Turning logging off is for special usage, such as temporary cache usage. The default is TRUE.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.log_data.

                  SET FILES LOG SIZE

                  set files log size statement

                  <set files log size statement> ::= SET FILES LOG SIZE <unsigned integer literal>

                  Sets the maximum size in MB of the *.log file to the specified value. The default maximum size is 50 MB. If the value is zero, no limit is used for the size of the file. When the size of the file reaches this value, a CHECKPOINT is performed and the the *.log file is cleared to size 0.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.log_size.

                  SET FILES NIO

                  set files nio

                  <set files nio statement> ::= SET FILES NIO { TRUE | FALSE }

                  Sets the access method of the .data file. The default is TRUE and uses the Java nio classes to access the file via memory-mapped buffers.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.nio_data_file.

                  SET FILES NIO SIZE

                  set files nio size

                  <set files nio size statement> ::= SET FILES NIO SIZE <unsigned integer literal>

                  Sets The maximum size of .data file in megabytes that can use the nio access method. When the file gets larger than this limit, non-nio access methods are used. Values 64, 128, 256, 512, 1024 and larger multiples of 512 can be used. The default is 256MB.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.nio_max_size.

                  SET FILES WRITE DELAY

                  set files write delay statement

                  <set files write delay statement> ::= SET FILES WRITE DELAY {{ TRUE | FALSE } | <seconds value> | <milliseconds value> MILLIS}

                  Set the WRITE DELAY property of the database. The WRITE DELAY controls the frequency of file sync for the log file. When WRITE_DELAY is set to FALSE or 0, the sync takes place immediately at each COMMIT. WRITE DELAY TRUE performs the sync once every 0.5 seconds (which is the default). A numeric value can be specified instead.

                  The purpose of this command is to control the amount of data loss in case of a total system crash. A delay of 1 second means at most the data written to disk during the last second before the crash is lost. All data written prior to this has been synced and should be recoverable.

                  A write delay of 0 impacts performance in high load situations, as the engine has to wait for the file system to catch up.

                  To avoid this, you can set write delay down to 10 milliseconds.

                  Each time the SET FILES WRITE DELAY statement is executed with any value, a sync is immediately performed.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection properties hsqldb.write_delay and hsqldb.write_delay_millis.

                  SET FILES SCALE

                  set files scale

                  <set files scale statement> ::= SET FILES SCALE <scale value>

                  Changes the scale factor for the .data file. The default scale is 8 and allows 16GB of data storage capacity. The scale can be increased in order to increase the maximum data storage capacity. The scale values 8, 16, 32, 64, 128, 256, 512, 1024 are allowed. Scale value 1024 allows a maximum capacity of 2 TB.

                  This command can be used only when there is no data in CACHED tables. This is equivalent to the connection property hsqldb.cache_file_scale.

                  The scale factor indicates the size of the unit of storage of data in bytes. For example, with a scale factor of 128, a row containing a small amount of data will use 128 bytes. Larger rows may use multiple units of 128 bytes.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.cache_file_scale.

                  SET FILES LOB SCALE

                  set files lob scale

                  <set files lob scale statement> ::= SET FILES LOB SCALE <scale value>

                  Changes the scale factor for the .lobs file. The scale is interpreted in kilobytes. The default scale is 32 and allows 64TB of lob data storage capacity. The scale can be reduced in order to improve storage efficiency. If the lobs are a lot smaller than 32 kilobytes, reducing the scale will reduce wasted space. The scale values 1, 2, 4, 8, 16, 32 are allowed. For example if the average size of lobs is 4 kilobytes, the default scale of 32 will result in 28KB wasted space for each lob. Reducing the lob scale to 2 will result in average 1KB wasted space for each lob.

                  This command can be used only when there is no lob in the database.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.lob_file_scale.

                  SET FILES SCRIPT FORMAT

                  set files script format

                  <set files script format statement> ::= SET FILES SCRIPT FORMAT { TEXT | COMPRESSED }

                  Changes the compression setting for database scripts. The default is text. Using COMPRESSED results in the storage of the .script file in gzip compressed form. Using this command causes a CHECKPOINT.

                  Only a user with the DBA role can execute this statement.

                  SET TABLE TYPE

                  set table type

                  <set table type statement> ::= SET TABLE <table name> TYPE { MEMORY | CACHED }

                  Changes the storage type of an existing table between CACHED and MEMORY types.

                  Only a user with the DBA role can execute this statement.

                  Authentication Settings

                  Two settings are available for authentication control.

                  When the default password authentication is used, the passwords can be checked for complexity according to administrative rules

                  SET DATABASE PASSWORD CHECK FUNCTION

                  set database password check function

                  <set database password check function statement> ::= SET DATABASE PASSWORD CHECK FUNCTION { <routine body> | NONE }

                  The routine body is the body of a function that has a VARCHAR parameter and returns a BOOLEAN. This function checks the PASSWORD submitted as parameter and returns TRUE if it conforms to complexity checks, or FALSE, if it does not.

                  The <routine body> can be an SQL block or an external Java function reference. This is covered in the SQL-Invoked Routines chapter

                  To disable this mechanism, the token NONE can be specified instead of the <routine body>.

                  Only a user with the DBA role can execute this statement.

                  In the examples below, an SQL function and a Java function are used.

                  SET DATABASE PASSWORD CHECK FUNCTION
                    BEGIN ATOMIC
                      IF CHAR_LENGTH(PASSWORD) > 6 THEN
                        RETURN TRUE;
                      ELSE 
                        RETURN FALSE;
                      END IF;
                    END
                  
                  SET DATABASE PASSWORD CHECK FUNCTION EXTERNAL NAME 'CLASSPATH:org.anorg.access.AccessClass.accessMethod'
                  
                  // the Java method is defined like this
                  public static boolean accessMethod(String param) {
                      return param != null && param.length > 6;
                  }
                  

                  It is possible to replace the default password authentication completely with a function that uses external authentication servers, such as LDAP. This function is called each time a user connects to the database.

                  SET DATABASE AUTHENTICATION FUNCTION

                  set database authentication function

                  <set database authentication function statement> ::= SET DATABASE AUTHENTICATION FUNCTION { <external body reference> | NONE }

                  The routine body is an external Java function reference. This function has three String parameters. The first parameter is the unique name of the database, the second parameter the user name, and the third parameter the password.

                  External authentication can be used in two different patterns. In the first pattern, user names must be stored in the database. In the second pattern, user names shouldn't be stored in the database and any names that are stored in the database are ignored.

                  In both patterns, the username and password are checked by the authentication function. If the function throws a runtime exception then authentication fails.

                  In the first pattern, the function always returns null if authentication is successful.

                  In the second pattern, the function returns a list of role names that have been granted to the user. These roles must match the ROLE objects that have been defined in the database.

                  The Java function should return an instance of org.hsqldb.jdbc.JDBCArrayBasic constructed with a String[] argument that contains the role names.

                  Only a user with the DBA role can execute this statement.

                  SET DATABASE AUTHENTICATION FUNCTION EXTERNAL NAME 'CLASSPATH:org.anorg.access.AccessClass.accessExernalMethod'
                  
                  // the Java method is defined like this
                  public static java.sql.Array accessExternalMethod(String database, String user, String password) {
                      if (externalCheck(database, user, password) {
                          return null;
                      }
                      throw new RuntimeException("failed to authenticate");
                  }
                  

                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/book-pref.html0000644000175000017500000001567312007567744020547 0ustar renerene Preface

                  Preface

                  HSQLDB (HyperSQL DataBase) is a modern relational database manager that conforms closely to the SQL:2008 Standard and JDBC 4 specifications. It supports all core features and many of the optional features of SQL:2008.

                  The first versions of HSQLDB were released in 2001. Version 2.0, first released in 2010, includes a complete rewrite of most parts of the database engine.

                  This documentation covers the latest HyperSQL version 2.2. This documentation is regularly improved and updated. The latest, updated version can be found at http://hsqldb.org/doc/2.0/

                  If you notice any mistakes in this document, or if you have problems with the procedures themselves, please use the HSQLDB support facilities which are listed at http://hsqldb.org/support

                  Available formats for this document

                  This document is available in several formats.

                  You may be reading this document right now at http://hsqldb.org/doc/2.0, or in a distribution somewhere else. I hereby call the document distribution from which you are reading this, your current distro.

                  http://hsqldb.org/doc/2.0 hosts the latest production versions of all available formats. If you want a different format of the same version of the document you are reading now, then you should try your current distro. If you want the latest production version, you should try http://hsqldb.org/doc/2.0.

                  Sometimes, distributions other than http://hsqldb.org/doc/2.0 do not host all available formats. So, if you can't access the format that you want in your current distro, you have no choice but to use the newest production version at http://hsqldb.org/doc/2.0.

                  Table 1. Available formats of this document


                  If you are reading this document now with a standalone PDF reader, the your distro links may not work.


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/dummy.html0000644000175000017500000000000112007567744017771 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/sqlroutines-chapt.html0000644000175000017500000031035212007567744022340 0ustar renerene Chapter 8. SQL-Invoked Routines

                  Chapter 8. SQL-Invoked Routines

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 4987 $

                  Copyright 2010-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  SQL-invoked routines are functions and procedures called from SQL. HyperSQL 2.0 supports routines conforming to two parts of the SQL Standard. Routines written in the SQL language are supported in conformance to SQL/PSM (Persistent Stored Modules) specification. Routines written in Java are supported in broad conformance to SQL/JRT specification. In addition, HyperSQL's previous non-standard support for calling Java routines without prior method definition is retained and enhanced in the latest version by extending the SQL/JRT specification.

                  HyperSQL also supports user defined aggregate functions written in the SQL language or Java. This feature is an extension to the SQL Standard.

                  SQL-invoked routines are schema objects. Naming and referencing follows conventions common to all schema objects. The same routine name can be defined in two different schemas and used with schema-qualified references.

                  A routine is either a procedure or a function.

                  A function:

                  • is defined with CREATE FUNCTION

                  • always returns a single value or a single table

                  • does not modify the data in the database

                  • is used as part of an SQL statement

                  • can have parameters

                  • can be polymorphic

                  A procedure:

                  • is defined with CREATE PROCEDURE

                  • can return zero to multiple values or result sets

                  • can modify the data in the database

                  • is called separately, using the CALL statement

                  • can have parameters

                  • can be polymorphic

                  Definition of routine signature and characteristics, name resolution and invocation are all implemented uniformly for routines written in SQL or Java.

                  Routine Definition

                  SQL-Invoked Routines, whether PSM or JRT, are defined using a SQL statement with the same syntax. The part that is different is the <routine body> which consists of SQL statements in PSM routines or a reference to a Java method in JRT routines.

                  Details of Routine definition are discussed in this section. You may start by reading the next two sections which provide several examples before reading this section for the details.

                  Routine definition has several mandatory or optional clauses. The complete BNF supported by HyperSQL and the remaining clauses are documented in this section.

                  CREATE FUNCTION

                  CREATE PROCEDURE

                  routine definition

                  Routine definition is similar for procedures and functions. A function definition has the mandatory <returns clause> which is discussed later. The description given so far covers the essential elements of the specification with the BNF given below.

                  <schema procedure> ::= CREATE PROCEDURE <schema qualified routine name> <SQL parameter declaration list> <routine characteristics> <routine body>

                  <schema function> ::= CREATE FUNCTION <schema qualified routine name> <SQL parameter declaration list> <returns clause> <routine characteristics> <routine body>

                  Parameter declaration list has been described above. For SQL/JRT routines, the <SQL parameter name> is optional while for SQL/PSM routines, it is required. If the <parameter mode> of a parameter is OUT or INOUT, it must be specified. The BNF is given below:

                  <SQL parameter declaration list> ::= <left paren> [ <SQL parameter declaration> [ { <comma> <SQL parameter declaration> }... ] ] <right paren>

                  <SQL parameter declaration> ::= [ <parameter mode> ] [ <SQL parameter name> ] <parameter type>

                  <parameter mode> ::= IN | OUT | INOUT

                  <parameter type> ::= <data type>

                  Return Value and Table Functions

                  RETURNS

                  returns clause

                  The <returns clause> specifies the type of the return value of a function (not a procedure). For all SQL/PSM functions and ordinary SQL/JRT functions, this is simply a type definition which can be a built-in type, a DOMAIN type or a DISTINCT type, or alternatively, a TABLE definition. For example, RETURNS INTEGER.

                  For a SQL/JRT function, it is possible to define a <returns table type> for a Java method that returns a java.sql.ResultSet object. Such SQL/JRT functions are called table functions. Table functions are used differently from normal functions. A table function can be used in an SQL query expression exactly where a normal table or view is allowed. At the time of invocation, the Java method is called and the returned ResultSet is transformed into an SQL table. The column types of the declared TABLE must match those of the ResultSet, otherwise an exception is raised at the time of invocation.

                  If a <returns table type> is defined for an SQL/PSM function, the following expression is used inside the function to return a table: RETURN TABLE ( <query expression> ); In the example blow, a table with two columns is returned.

                  RETURN TABLE ( SELECT a, b FROM atable WHERE e = 10 );

                  Functions that return a table are designed to be used in SELECT statements using the TABLE keyword to form a joined table.

                  When a JDBC CallableStatement is used to CALL the function, the table returned from the function call is returned and can be accessed with the getResultSet() method of the CallableStatement.

                  <returns clause> ::= RETURNS <returns type>

                  <returns type> ::= <returns data type> | <returns table type>

                  <returns table type> ::= TABLE <table function column list>

                  <table function column list> ::= <left paren> <table function column list element> [ { <comma> <table function column list element> } ... ] <right paren>

                  <table function column list element> ::= <column name> <data type>

                  <returns data type> ::= <data type>

                  routine body

                  routine body

                  Routine body is either one or more SQL statements or a Java reference. The user that defines the routine by issuing the CREATE FUNCTION or CREATE SCHEMA command must have the relevant access rights to all tables, sequences, routines, etc. that are accessed by the routine. If another user is given EXECUTE privilege on the routine, then there are two possibilities, depending on the <rights clause>. This clause refers to the access rights that are checked when a routine is invoked. The default is SQL SECURITY DEFINER, which means access rights of the definer are used; therefore no extra checks are performed when the other user invokes the routine. The alternative SQL SECURITY INVOKER means access rights on all the database objects referenced by the routine are checked for the invoker. This alternative is not supported by HyperSQL.

                  <routine body> ::= <SQL routine spec> | <external body reference>

                  <SQL routine spec> ::= [ <rights clause> ] <SQL routine body>

                  <rights clause> ::= SQL SECURITY INVOKER | SQL SECURITY DEFINER

                  SQL routine body

                  SQL routine body

                  The routine body of a an SQL routine consists of an statement.

                  <SQL routine body> ::= <SQL procedure statement>

                  EXTERNAL NAME

                  external body reference

                  External name specifies the qualified name of the Java method associated with this routine. Early releases of HyperSQL 2.0 only supports Java methods within the classpath. The <external Java reference string> is a quoted string which starts with CLASSPATH: and is followed by the Java package, class and method names separated with dots. HyperSQL does not currently support the optional <Java parameter declaration list>.

                  <external body reference> ::= EXTERNAL NAME <external Java reference string>

                  <external Java reference string> ::= <jar and class name> <period> <Java method name> [ <Java parameter declaration list> ]

                  Routine Characteristics

                  The <routine characteristics> clause covers several sub-clauses

                  <routine characteristics> ::= [ <routine characteristic>... ]

                  <routine characteristic> ::= <language clause> | <parameter style clause> | SPECIFIC <specific name> | <deterministic characteristic> | <SQL-data access indication> | <null-call clause> | <returned result sets characteristic> | <savepoint level indication>

                  LANGUAGE

                  language clause

                  The <language clause> refers to the language in which the routine body is written. It is either SQL or Java. The default is SQL, so JAVA must be specified for SQL/JRT routines.

                  <language clause> ::= LANGUAGE <language name>

                  <language name> ::= SQL | JAVA

                  The parameter style is not allowed for SQL routines. It is optional for Java routines and, in HyperSQL, the only value allowed is JAVA.

                  <parameter style> ::= JAVA

                  SPECIFIC NAME

                  specific name

                  The SPECIFIC <specific name> clause is optional but the engine will creates an automatic name if it is not present. When there are several versions of the same routine, the <specific name> is used in schema manipulation statements to drop or alter a specific version. The <specific name> is a user-defined name. It applies to both functions and procedures. In the examples below, a specific name is specified for each function.

                  CREATE FUNCTION an_hour_before_or_now(t TIMESTAMP)
                    RETURNS TIMESTAMP
                    NO SQL
                    LANGUAGE JAVA PARAMETER STYLE JAVA
                    SPECIFIC an_hour_before_or_now_with_timestamp
                    EXTERNAL NAME 'CLASSPATH:org.npo.lib.nowLessAnHour'
                  
                  CREATE FUNCTION an_hour_before_max (e_type INT)
                    RETURNS TIMESTAMP SPECIFIC an_hour_before_max_with_int
                    RETURN (SELECT MAX(event_time) FROM atable WHERE event_type = e_type) - 1 HOUR
                  
                  

                  DETERMINISTIC

                  deterministic characteristic

                  The <deterministic characteristic> clause indicates that a routine is deterministic or not. Deterministic means the routine does not reference random values, external variables, or time of invocation. The default is NOT DETERMINISTIC. It is essential to declare this characteristics correctly for an SQL/JRT routine, as the engine does not know the contents of the Java code, which could include calls to methods returning random or time sensitive values.

                  <deterministic characteristic> ::= DETERMINISTIC | NOT DETERMINISTIC

                  SQL DATA access

                  SQL DATA access characteristic

                  The <SQL-data access indication>  clause indicates the extent to which a routine interacts with the database or the data stored in the database tables in different schemas (SQL DATA).

                  NO SQL means no SQL command is issued in the routine body and can be used only for SQL/JRT functions.

                  CONTAINS SQL means some SQL commands are used, but they do not read or modify the SQL data. READS SQL DATA and MODIFIES SQL DATA are self explanatory.

                  A CREATE PROCEDURE definition can use MODIFIES SQL DATA. This is not allowed in CREATE FUNCTION. Note that a PROCEDURE or a FUNCTION may have internal tables or return a table which are populated by the routine's statements. These tables are not considered SQL DATA, therefore there is no need to specify MODIFIES SQL DATA for such routines.

                  <SQL-data access indication> ::= NO SQL | CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA

                  NULL INPUT

                  null call clause

                  Null Arguments

                  The <null-call clause> is used only for functions. If a function returns NULL when any of the calling arguments is null, then by specifying RETURNS NULL ON NULL INPUT, calls to the function are known to be redundant and do not take place when an argument is null. This simplifies the coding of the SQL/JRT Java methods and improves performance at the same time.

                  <null-call clause> ::= RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT

                  SAVEPOINT LEVEL

                  transaction impact

                  The <savepoint level indication> is used only for procedures and refers to the visibility of existing savepoints within the body of the procedure. If NEW SAVEPOINT LEVEL is specified, savepoints that have been declared prior to calling the procedure become invisible within the body of the procedure. HyperSQL’s implementation accepts only NEW SAVEPOINT LEVEL, which must be specified.

                  <savepoint level indication> ::= NEW SAVEPOINT LEVEL | OLD SAVEPOINT LEVEL

                  DYNAMIC RESULT SETS

                  returned result sets characteristic

                  The <returned result sets characteristic> is used with SQL/PSM and SQL/JRT procedures (not with functions). The maximum number of result sets that a procedure may return can be specified with the clause below. The default is zero. If you want your procedure to return result sets, you must specify the maximum number of result sets that your procedure may return. Details are discussed in the next sections.

                  <returned result sets characteristic> ::= DYNAMIC RESULT SETS <maximum returned result sets>

                  SQL Language Routines (PSM)

                  The PSM (Persistent Stored Module) specification extends the SQL language with structures and control statements such as conditional and loop statements. Both SQL Function and SQL procedure bodies use the same syntax, with minor exceptions.

                  The routine body is a SQL statement. In its simplest form, the body is a single SQL statement. A simple example of a function is given below:

                  CREATE FUNCTION an_hour_before (t TIMESTAMP)
                    RETURNS TIMESTAMP
                    RETURN t - 1 HOUR
                  
                  

                  An example of the use of the function in an SQL statement is given below:

                  SELECT an_hour_before(event_timestamp) AS notification_timestamp, event_name FROM events;

                  A simple example of a procedure is given below:

                  CREATE PROCEDURE new_customer(firstname VARCHAR(50), lastname VARCHAR(50))
                    MODIFIES SQL DATA
                    INSERT INTO CUSTOMERS VALUES (DEFAULT, firstname, lastname, CURRENT_TIMESTAMP)
                  
                  

                  The procedure inserts a row into an existing table with the definition given below:

                  CREATE TABLE customers(id INTEGER GENERATED BY DEFAULT AS IDENTITY, firstname VARCHAR(50), lastname VARCHAR(50), added TIMESTAMP);

                  An example of the use of the procedure is given below:

                  CALL new_customer('JOHN', 'SMITH');

                  The routine body is often a compound statement. A compound statement can contain one or more SQL statements, which can include control statements, as well as nested compound statements.

                  Please note carefully the use of <semicolon>, which is required at the end of some statements but not accepted at the end of others.

                  Advantages and Disadvantages

                  SQL Language Routines (PSM) have certain advantages over Java Language Routines (SQL/JRT) and a couple of disadvantages.

                  • SQL language routines (PSM) do not rely on custom Java classes to be present on the classpath. The databases that use them are therefore more portable.

                  • For a routine that accesses SQL DATA, all the SQL statements in an SQL routine are known and monitored by the engine. The engine will not allow a table, routine or sequence that is referenced in an SQL routine to be dropped, or its structure modified in a way that will break the routine execution. The engine does not keep this information about a Java routine.

                  • Because the statements in an SQL routine are known to the engine, the execution of an SQL routine locks all the database objects it needs to access before the actual execution. With Java routines, locks are obtained during execution and this may cause additional delays in multi threaded access to the database.

                  • For routines that do not access SQL DATA, Java routines (SQL/JRT) may be faster if they perform extensive calculations.

                  • Only Java routines can access external programs and resources directly.

                  Routine Statements

                  The following SQL Statements can be used only in routines. These statements are covered in this section.

                  <handler declaration>

                  <table variable declaration>

                  <variable declaration>

                  <declare cursor>

                  <assignment statement>

                  <compound statement>

                  <case statement>

                  <if statement>

                  <while statement>

                  <repeat statement>

                  <for statement>

                  <loop statement>

                  <iterate statement

                  <leave statement>

                  <signal statement>

                  <resignal statement>

                  <return statement>

                  <select statement: single row>

                  <open statement>

                  The following SQL Statements can be used in procedures but not in generally in functions (they can be used in functions only to change the data in a local table variable) . These statements are covered in other chapters of this Guide.

                  <call statement>

                  <delete statement>

                  <insert statement>

                  <update statement>

                  <merge statement>

                  As shown in the examples below, the formal parameters and the variables of the routine can be used in statements, similar to the way a column reference is used.

                  Compound Statement

                  A compound statement is enclosed in a BEGIN / END block with optional labels. It can contain one or more <SQL variable declaration>, <declare cursor> or <handler declaration> before at least one SQL statement. The BNF is given below:

                  <compound statement> ::= [ <beginning label> <colon> ] BEGIN [[NOT] ATOMIC]

                  [{<SQL variable declaration> <semicolon>} ...]

                  [{<declare cursor> <semicolon>} ...]

                  [{<handler declaration> <semicolon>}...]

                  {<SQL procedure statement> <semicolon>} ...

                  END [ <ending label> ]

                  An example of a simple compound statement body is given below. It performs the common task of inserting related data into two table. The IDENTITY value that is automatically inserted in the first table is retrieved using the IDENTITY() function and inserted into the second table.

                  CREATE PROCEDURE new_customer(firstname VARCHAR(50), lastname  VARCHAR(50), address VARCHAR(100))
                    MODIFIES SQL DATA
                      BEGIN ATOMIC
                      INSERT INTO customers VALUES (DEFAULT, firstname, lastname, CURRENT_TIMESTAMP);
                      INSERT INTO addresses VALUES (DEFAULT, IDENTITY(), address);
                    END
                  
                  

                  Table Variables

                  A <table variable declaration> defines the name and columns of a local table, that can be used in the routine body. The table cannot have constraints. Table variable declarations are made before scalar variable declarations.

                    BEGIN ATOMIC
                      DECLARE TABLE temp_table (col_a INT, col_b VARCHAR(20);
                      DECLARE temp_id INTEGER;
                      -- more statements
                    END
                  
                  

                  Variables

                  A <variable declaration> defines the name and data type of the variable and, optionally, its default value. In the next example, a variable is used to hold the IDENTITY value. In addition, the formal parameters of the procedure are identified as input parameters with the use of the optional IN keyword. This procedure does exactly the same job as the procedure in the previous example.

                  CREATE PROCEDURE new_customer(IN firstname VARCHAR(50), IN lastname VARCHAR(50), IN address VARCHAR(100))
                    MODIFIES SQL DATA
                    BEGIN ATOMIC
                      DECLARE temp_id INTEGER;
                      INSERT INTO CUSTOMERS VALUES (DEFAULT, firstname, lastname, CURRENT_TIMESTAMP);
                      SET temp_id = IDENTITY();
                      INSERT INTO ADDRESSES VALUES (DEFAULT, temp_id, address);
                    END
                  
                  

                  The BNF for variable declaration is given below:

                  DECLARE variable

                  SQL variable declaration

                  <SQL variable declaration> ::= DECLARE <variable name list> <data type> [DEFAULT <default value>]

                  <variable name list> ::= <variable name> [ { <comma> <variable name> }... ]

                  Examples of variable declaration are given below. Note that in a DECLARE statement with multiple comma-separated variable names, the type and the default value applies to all the variables in the list:

                    BEGIN ATOMIC
                      DECLARE temp_zero DATE;
                      DECLARE temp_one, temp_two INTEGER DEFAULT 2;
                      DECLARE temp_three VARCHAR(20) DEFAULT 'no name';
                      -- more statements ...
                      SET temp_zero = DATE '2010-03-18';
                      SET temp_two = 5;
                      -- more statements ...
                    END

                  Cursors

                  A <declare cursor> statement is used to declare a SELECT statement. The current usage of this statement in early versions of HyperSQL 2.0 is exclusively to return a result set from a procedure. The result set is returned to the JDBC CallableStatement object that calls the procedure. The getResultSet() method of CallableStatement is then used to retrieve the JDBC ResultSet.

                  In the <routine definition>, the DYNAMIC RESULT SETS clause must be used to specify a value above zero. The DECLARE CURSOR statement is used after any variable declaration in compound statement block. The SELECT statement should be followed with FOR READ ONLY to avoid possible error messages. The <open statement> is then executed for the cursor at the point where the result set should be populated.

                  After the procedure is executed with a JDBC CallableStatement execute() method, all the result sets that were opened are returned to the JDBC CallableStatement.

                  Calling getResultSet() will return the first ResultSet. When there are multiple result sets, the getMoreResults() method of the Callable statement is called to move to the next ResultSet, before getResultSet() is called to return the next ResultSet. See the Data Access and Change chapter on the syntax for declaring the cursor.

                    BEGIN ATOMIC
                      DECLARE temp_zero DATE;
                      DECLARE result CURSOR WITH RETURN FOR SELECT * FROM INFORMATION_SCHEMA.TABLES FOR READ ONLY;
                      -- more statements ...
                      OPEN result;
                    END
                  

                  Handlers

                  A <handler declaration> defines the course of action when an exception or warning is raised during the execution of the compound statement. A compound statement may have one or more handler declarations. These handlers become active when code execution enters the compound statement block and remain active in any sub-block and statement within the block. The handlers become inactive when code execution leaves the block.

                  In the previous example, if an exception is thrown during the execution of either SQL statement, the execution of the compound statement is terminated and the exception is propagated and thrown by the CALL statement for the procedure. A handler declaration can resolve the thrown exception within the compound statement without propagating it, and allow the execution of the <compound statement> to continue.

                  In the example below, the UNDO handler declaration catches any exception that is thrown during the execution of the compound statement inside the BEGIN / END block. As it is an UNDO handler, all the changes to data performed within the compound statement (BEGIN / END) block are rolled back. The procedure then returns without throwing an exception.

                  CREATE PROCEDURE NEW_CUSTOMER(IN firstname VARCHAR(50), IN lastname VARCHAR(50), IN address VARCHAR(100))
                      MODIFIES SQL DATA
                    label_one: BEGIN ATOMIC
                      DECLARE temp_id INTEGER;
                      DECLARE UNDO HANDLER FOR SQLEXCEPTION LEAVE label_one;
                      INSERT INTO CUSTOMERS VALUES (DEFAULT, firstname, lastname, CURRENT_TIMESTAMP);
                      SET temp_id = IDENTITY();
                      INSERT INTO ADDRESSES VALUES (DEFAULT, temp_id, address);
                    END
                  
                  

                  Other types of hander are CONTINUE and EXIT handlers. A CONTINUE handler ignores any exception and proceeds to the next statement in the block. An EXIT handler terminates execution without undoing the data changes performed by the previous (successful) statements.

                  The conditions can be general conditions, or specific conditions. Among general conditions that can be specified, SQLEXCEPTION covers all exceptions, SQLWARNING covers all warnings, while NOT FOUND covers the not-found condition, which is raised when a DELETE, UPDATE, INSERT or MERGE statement completes without actually affecting any row. Alternatively, one or more specific conditions can be specified (separated with commas) which apply to specific exceptions or warnings or classes or exceptions or warnings. A specific condition is specified with SQLSTATE <value>, for example SQLSTATE 'W_01003' specifies the warning raised after a SQL statement is executed which contains an aggregate function which encounters a null value during execution. An example is given below which activates the handler when either of the two warnings is raised:

                  DECLARE UNDO HANDLER FOR SQLSTATE 'W_01003', 'W_01004' LEAVE label_one;

                  The BNF for <handler declaration> is given below:

                  DECLARE HANDLER

                  declare handler statement

                  <handler declaration> ::= DECLARE {UNDO | CONTINUE | EXIT} HANDLER FOR {SQLEXCEPTION | SQLWARNING | NOT FOUND} | { SQLSTATE <state value> [, ...]} [<SQL procedure statement>];

                  A handler declaration may specify an SQL procedure statement to be performed when the handler is activated. When an exception occurs, the example below performs the UNDO as in the previous example, then inserts the (invalid) data into a separate table.

                  DECLARE UNDO HANDLER FOR SQLEXCEPTION
                      INSERT INTO invalid_customers VALUES(firstanme, lastname, address);

                  The <SQL procedure statement> is required by the SQL Standard but is optional in HyperSQL. If the execution of the <SQL procedure statement> specified in the handler declaration throws an exception itself, then it is handled by the handlers that are currently active. The <SQL procedure statement> can itself be a compound statement with its own handlers.

                  Assignment Statement

                  The SET statement is used for assignment. It can be used flexibly with rows or single values. The BNF is given below:

                  <assignment statement> ::= <singleton variable assignment> | <multiple variable assignment>

                  <singleton variable assignment> ::= SET <assignment target> <equals operator> <assignment source>

                  <multiple variable assignment> ::= SET (<variable or parameter>, ...) = <row value expression>

                  In the example below, the result of the SELECT is assigned to two OUT or INOUT arguments. The SELECT must return one row. If it returns more than one, an exception is raised. If it returns no row, no change is made to ARG1 and ARG2.

                  SET (arg1, arg2) = (SELECT col1, col2 FROM atable WHERE id = 10);

                  In the example below, the result of a function call is assigned to VAR1.

                  SET var1 = SQRT(var2);

                  Select Statement : Single Row

                  A special form of SELECT can also be used for assigning values from a query to one or more arguments or variables. This works similar to a SET statement that has a SELECT statement as the source.

                  SELECT : SINGLE ROW

                  select statement: single row

                  <select statement: single row> ::= SELECT [ <set quantifier> ] <select list> INTO <select target list> <table expression>

                  <select target list> ::= <target specification> [ { <comma> <target specification> }... ]

                  Retrieve values from a specified row of a table and assign the fields to the specified targets. The example below has an identical effect to the example of SET statement given above.

                  SELECT col1, col2 INTO arg1, arg2 FROM atable WHERE id = 10;

                  Formal Parameters

                  Each parameter of a procedure can be defined as IN, OUT or INOUT. An IN parameter is an input to the procedure and is passed by value. The value cannot be modified inside the procedure body. An OUT parameter is a reference for output. An INOUT parameter is a reference for both input and output. An OUT or INOUT parameter argument is passed by reference, therefore only a dynamic parameter argument or a variable within an enclosing procedure can be passed for it. The assignment statement is used to assign a value to an OUT or INOUT parameter.

                  In the example below, the procedure is declared with an OUT parameter. It assigns the auto-generated IDENTITY value from the INSERT statement to the OUT argument.

                  CREATE PROCEDURE new_customer(OUT newid INT, IN firstname VARCHAR(50), IN lastname VARCHAR(50), IN address VARCHAR(100))
                    MODIFIES SQL DATA
                    BEGIN ATOMIC
                      DECLARE temp_id INTEGER;
                      INSERT INTO CUSTOMERS VALUES (DEFAULT, firstname, lastname, CURRENT_TIMESTAMP);
                      SET temp_id = IDENTITY();
                      INSERT INTO ADDRESSES VALUES (DEFAULT, temp_id, address);
                      SET newid = temp_id;
                    END
                  
                  

                  In the SQL session, or in the body of another stored procedure, a variable must be assigned to the OUT parameter. After the procedure call, this variable will hold the new identity value that was generated inside the procedure. If the procedure is called directly, using the JDBC CallableStatement interface, then the value of the first, OUT argument can be retrieved with a call to getInt(1)after calling the execute() method.

                  In the example below, a session variable, the_new_id is declared. After the call to new_customer, the value for the identity is stored in the_new_id variable. This is returned via the next CALL statement. Alternatively, the_new_id can be used as an argument to another CALL statement.

                  DECLARE the_new_id INT DEFAULT NULL;
                  CALL new_customer(the_new_id, 'John', 'Smith', '10 Parliament Square'); 
                  CALL the_new_id;
                  
                  

                  Iterated Statements

                  Various iterated statements can be used in routines. In these statements, the <SQL statement list> consists of one or more SQL statements. The <search condition> can be any valid SQL expression of BOOLEAN type.

                  LOOP

                  loop statement

                  <loop statement> ::= [ <beginning label> <colon> ] LOOP <SQL statement list> END LOOP [ <ending label> ]

                  WHILE

                  while statement

                  <while statement> ::= [ <beginning label> <colon> ] WHILE <search condition> DO <SQL statement list> END WHILE [ <ending label> ]

                  REPEAT

                  repeat statement

                  <repeat statement> ::= [ <beginning label> <colon> ]

                  REPEAT <SQL statement list> UNTIL <search condition> END REPEAT [ <ending label>

                  In the example below, a multiple rows are inserted into a table in a WHILE loop:

                  loop_label: WHILE my_var > 0 DO
                    INSERT INTO CUSTOMERS VALUES (DEFAULT, my_var);
                    SET my_var = my_var - 1;
                    IF my_var = 10 THEN SET my_var = 8; END IF;
                    IF my_var = 22 THEN LEAVE loop_label; END IF;
                  END WHILE loop_label;
                  
                  

                  Iterated FOR Statement

                  The <for statement> is similar to other iterated statement, but it is always used with a cursor declaration to iterate over the rows of the result set of the cursor and perform operations using the values of each row.

                  FOR

                  for statement

                  <for statement> ::= [ <beginning label> <colon> ] FOR <query expression> DO <SQL statement list> END FOR [ <ending label> ]

                  The <query expression> is a SELECT statement. When the FOR statement is executed, the query expression is executed first and the result set is formed. Then for each row of the result set, the <SQL statement list> is executed. What is special about the FOR statement is that all the columns of the current row can be accessed by name in the statements in the <SQL statement list>. The columns are read only and cannot be updated. For example, if the column names for the select statement are ID, FIRSTNAME, LASTNAME, then these can be accessed as a variable name. The column names must be unique and not equivalent to any parameter or variable name in scope.

                  The FOR statement is useful for computing values over multiple rows of the result set, or for calling a procedure for some row of the result set. In the example below, the procedure uses a FOR statement to iterate over the rows for a customer with lastname equal to name_p. No action is performed for the first row, but for all the subsequent rows, the row is deleted from the table.

                  Note the following: The result set for the SELECT statement is built only once, before processing the statements inside the FOR block begins. For all the rows of the SELECT statement apart from the first row, the row is deleted from the customer table. The WHERE condition uses the automatic variable id, which holds the customer.id value for the current row of the result set, to delete the row. The procedure updates the val_p argument and when it returns, the val_p represents the total count of rows with the given lastname before the duplicates were deleted.

                  CREATE PROCEDURE test_proc(INOUT val_p INT, IN lastname_p VARCHAR(20)) 
                  MODIFIES SQL DATA
                  BEGIN ATOMIC
                    SET val_p = 0;
                    for_label: FOR SELECT * FROM customer WHERE lastname = lastname_p DO
                      IF  val_p > 0 THEN
                        DELETE FROM customer WHERE customer.id = id;
                      END IF;
                      SET val_p = val_p + 1;
                    END FOR for_label;
                  END
                  

                  Conditional Statements

                  There are two types of CASE ... WHEN statement and the IF ... THEN statement.

                  CASE WHEN

                  case when statement

                  The simple case statement uses a <case operand> as the predicand of one or more predicates. For the right part of each predicate, it specifies one or more SQL statements to execute if the predicate evaluates TRUE. If the ELSE clause is not specified, at least one of the search conditions must be true, otherwise an exception is raised.

                  <simple case statement> ::= CASE <case operand> <simple case statement when clause>... [ <case statement else clause> ] END CASE

                  <simple case statement when clause> ::= WHEN <when operand list> THEN <SQL statement list>

                  <case statement else clause> ::= ELSE <SQL statement list>

                  A skeletal example is given below. The variable var_one is first tested for equality with 22 or 23 and if the test evaluates to TRUE, then the INSERT statement is performed and the statement ends. If the test does not evaluate to TRUE, the next condition test, which is an IN predicate, is performed with var_one and so on. The statement after the ELSE clause is performed if none the previous tests returns TRUE.

                  CASE var_one
                    WHEN 22, 23 THEN INSERT INTO t_one ...;
                    WHEN IN (2, 4, 5) THEN DELETE FROM t_one WHERE ...;
                    ELSE UPDATE t_one ...;
                    END CASE
                  
                  

                  The searched case statement uses one or more search conditions, and for each search condition, it specifies one or more SQL statements to execute if the search condition evaluates TRUE. An exception is raised if there is no ELSE clause and none of the search conditions evaluates TRUE.

                  <searched case statement> ::= CASE <searched case statement when clause>... [ <case statement else clause> ] END CASE

                  <searched case statement when clause> ::= WHEN <search condition> THEN <SQL statement list>

                  The example below is partly a rewrite of the previous example, but a new condition is added:

                  CASE WHEN var_one = 22 OR var_one = 23 THEN INSERT INTO t_one ...;
                    WHEN var_one IN (2, 4, 5) THEN DELETE FROM t_one WHERE ...;
                    WHEN var_two IS NULL THEN UPDATE t_one ...;
                    ELSE UPDATE t_one ...;
                    END CASE
                  
                  

                  IF

                  if statement

                  The if statement is very similar to the searched case statement. The difference is that no exception is raised if there is no ELSE clause and no search condition evaluates TRUE.

                  <if statement> ::= IF <search condition> <if statement then clause> [ <if statement elseif clause>... ] [ <if statement else clause> ] END IF

                  <if statement then clause> ::= THEN <SQL statement list>

                  <if statement elseif clause> ::= ELSEIF <search condition> THEN <SQL statement list>

                  <if statement else clause> ::= ELSE <SQL statement list>

                  Return Statement

                  The RETURN statement is required and used only in functions. The body of a function is either a RETURN statement, or a compound statement that contains a RETURN statement.

                  The return value of a FUNCTION can be assigned to a variable, or used inside an SQL statement.

                  An SQL/PSM function or an SQL/JRT function can return a single result when the function is defined as RETURNS TABLE ( .. )

                  To return a table from a SELECT statement, you should use a return statement such as RETURN TABLE( SELECT ...) in an SQL/PSM function. For an SQL/JRT function, the Java method should return a JDBCResultSet instance.

                  To call a function from JDBC, use a java.sql.CallableStatement instance. The getResultSet() call can be used to access the ResultSet returned from a function that returns a result set. If the function returns a scalar value, the returned result has a single column and a single row which contains the scalar returned value.

                  RETURN

                  return statement

                  <return statement> ::= RETURN <return value>

                  <return value> ::= <value expression> | NULL

                  Return a value from an SQL function. If the function is defined as RETURNS TABLE, then the value is a TABLE expression such as RETURN TABLE(SELECT ...) otherwise, the value expression can be any scalar expression. In the examples below, the same function is written with or without a BEGIN END block. In both versions, the RETURN value is a scalar expression.

                  CREATE FUNCTION an_hour_before_max (e_type INT)
                    RETURNS TIMESTAMP
                    RETURN (SELECT MAX(event_time) FROM atable WHERE event_type = e_type) - 1 HOUR
                  
                  CREATE FUNCTION an_hour_before_max (e_type INT)
                    RETURNS TIMESTAMP
                    BEGIN ATOMIC
                      DECLARE max_event TIMESTAMP;
                      SET max_event = SELECT MAX(event_time) FROM atable WHERE event_type = e_type;
                      RETURN max_event - 1 HOUR;
                    END
                  
                  

                  Control Statements

                  In addition to the RETURN statement, the following statements can be used in specific contexts.

                  ITERATE STATEMENT

                  The ITERATE statement can be used to cause the next iteration of a labelled iterated statement (a WHILE, REPEAT or LOOP statement). It is similar to the "continue" statement in C and Java.

                  <iterate statement> ::= ITERATE <statement label>

                  LEAVE STATEMENT

                  The LEAVE statement can be used to leave a labelled block. When used in an iterated statement, it is similar to the "break" statement is C and Java. But it can be used in compound statements as well.

                  <leave statement> ::= LEAVE <statement label>

                  Raising Exceptions

                  Signal and Resignal Statements allow the routine to throw an exception. If used with the IF or CASE conditions, the exception is thrown conditionally.

                  SIGNAL

                  signal statement

                  The SIGNAL statement is used to throw an exception (or force an exception). When invoked, any exception handler for the given exception is in turn invoked. If there is no handler, the exception is propagated to the enclosing context. In its simplest form, when there is no exception handler for the given exception, routine execution is halted, any change of data is rolled back and the routine throws the exception. By default, the message for the exception is taken from the predefined exception message for the specified SQLSTATE. A custom message can be specified with the optional SET clause.

                  <signal statement> ::= SIGNAL SQLSTATE <state value> [ SET MESSAGE_TEXT = <character string literal> ]

                  RESIGNAL

                  resignal statement

                  The RESIGNAL statement is used to throw an exception from an exception handler's <SQL procedure statement>, in effect propagating the exception to the enclosing context without further action by the currently active handlers. By default, the message for the exception is taken from the predefined exception message for the specified SQLSTATE. A custom message can be specified with the optional SET clause.

                  <resignal statement> ::= RESIGNAL SQLSTATE <state value> [ SET MESSAGE_TEXT = <character string literal> ]

                  Routine Polymorphism

                  More than one version of a routine can be created.

                  For procedures, the different versions must have different parameter counts. When the procedure is called, the parameter count determines which version is called.

                  For functions, the different versions can have the same or different parameter counts. When the parameter count of two versions of a function is the same, the type of parameters must be different. When the function is called, the best matching version of the function is used, according to both the parameter count and parameter types. The return type of different versions of a function can be the same or different.

                  Two versions of an overloaded function are given below. One version accepts TIMESTAMP while the other accepts TIME arguments.

                  CREATE FUNCTION an_hour_before_or_now(t TIMESTAMP)
                    RETURNS TIMESTAMP
                    IF t > CURRENT_TIMESTAMP THEN
                      RETURN CURRENT_TIMESTAMP;
                    ELSE
                      RETURN t - 1 HOUR;
                    END IF
                  
                  CREATE FUNCTION an_hour_before_or_now(t TIME)
                    RETURNS TIME
                    CASE t
                      WHEN > CURRENT_TIME THEN
                        RETURN CURRENT_TIME;
                      WHEN >= TIME'01:00:00' THEN
                        RETURN t - 1 HOUR;
                      ELSE
                        RETURN CURRENT_TIME;
                    END CASE
                  
                  

                  It is perfectly possible to have different versions of the routine as SQL/JRT or SQL/PSM routines.

                  Returning Data From Procedures

                  The OUT or INOUT parameters of a PROCEDURE are used to assign simple values to dynamic parameters or to variables in the calling context.

                  According to the Standard, an SQL/PSM or SQL/JRT procedure may also return result sets to the calling context. These result sets are dynamic in the sense that a procedure may return a different number of result sets or none at all in different invocations. The SQL Standard uses a mechanism called CURSORS for accessing and modifying rows of a result set one by one. This mechanism is necessary when the database is accessed from an external application program. The JDBC ResultSet interface allows this method of access from Java programs and is supported by HyperSQL.

                  HyperSQL support this method of returning single or multiple result sets from SQL/PSM procedures only via the JDBC CallableStatement interface. Cursors are declared and opened within the body of the procedure. No further operation is performed on the cursors within the procedure. When the execution of the procedure is complete, the cursors become available as Java ResultSet objects via the CallableStatement instance that called the SQL/PSM procedure.

                  The JDBC CallableStatement class is used with the SQL statement CALL <routine name> ( <argument 1>, ... ) to call procedures (also to call functions). After the call to execute(), the getXXX() methods can be used to retrieve INOUT or OUT arguments after the call. The getMoreResults() method and the getResultSet() method can be used to access the ResultSet(s) returned by a procedure that returns one or more results. If the procedure returns more than one result set, the getMoreResults() call moves to the next result.

                  In the example below, the procedure inserts a row into the customer table. It then performs the SELECT statement to return the latest inserted row as a result set. Therefore the definition includes the DYNAMIC RESULT SETS 1 clause. You must specify correctly the maximum number of result sets that the procedure may return.

                  CREATE PROCEDURE new_customer(firstname VARCHAR(50), lastname VARCHAR(50))
                    MODIFIES SQL DATA DYNAMIC RESULT SETS 1
                    BEGIN ATOMIC
                      DECLARE result CURSOR FOR SELECT * FROM CUSTOMERS WHERE ID = IDENTITY();
                      INSERT INTO CUSTOMERS VALUES (DEFAULT, firstname, lastname, CURRENT_TIMESTAMP);
                      OPEN result;    
                    END
                  
                  

                  The above procedure is called in Java using a CallableStatement

                  Connection conn = ...;
                  CallableStatement call = conn.prepareCall("call new_customer(?, ?)");
                  call.setString(1, "Paul");
                  call.setString(2, "Smith");
                  call.execute();
                  if (call.getMoreResults())
                      ResultSet result = call.getResultSet();
                  
                  

                  In the example below a procedure has one IN argument and two OUT arguments. The JDBC CallableStatement is used to retrieve the values returned in the OUT arguments.

                  CREATE PROCEDURE get_customer(IN id INT, OUT firstname VARCHAR(50), OUT lastname VARCHAR(50)) 
                    READS SQL DATA
                    BEGIN ATOMIC
                      -- this statement uses the id to get firstname and lastname
                      SELECT first_name, last_name INTO firstname, lastname FROM customers WHERE cust_id = id;
                    END
                  
                  Connection conn = ...;
                  CallableStatement call = conn.prepareCall("call get_customer(?, ?, ?)");
                  call.setInt(1, 121); // only the IN (or INOUT) arguments should be set before the call
                  call.execute();
                  String firstname = call.getString(2); // the OUT (or INOUT) arguments are retrieved after the call
                  String lastname = call.getString(3);
                  
                  

                  SQL/JRT procedures are discussed in the Java Language Procedures section below. Those routines are called exactly the same way as SQL/PSM procedures, using the JDBC CallableStatement interface.

                  It is also possible to use a JDBC Statement or PreparedStatement object to call a procedure if the procedure arguments are constant. If the procedure returns one or more result sets, the Statement#getMoreResults() method should be called before retrieving the ResultSet.

                  Java functions are called from JDBC similar to procedures. With functions, the getMoreResuls() method should not be called at all.

                  Recursive Routines

                  Routines can be recursive. Recursive functions are often functions that return arrays or tables. To create a recursive routine, the routine definition must be created first with a dummy body. Then the ALTER ROUTINE statement is used to define the routine body.

                  In the example below, the table contains a tree of rows each with a parent. The routine returns an array containing the id list of all the direct and indirect children of the given parent. The routine appends the array variable id_list with the id of each direct child and for each child appends the array with the id array of its children by calling the routine recursively.

                  The routine can be used in a SELECT statement as the example shows.

                  CREATE TABLE ptree (pid INT, id INT);
                  INSERT INTO ptree VALUES (NULL, 1) ,(1,2), (1,3),(2,4),(4,5),(3,6),(3,7);
                  
                  -- the function is created and always throws an exception when used
                  CREATE FUNCTION child_arr(p_pid INT) RETURNS INT ARRAY
                    SPECIFIC child_arr_one
                    READS SQL DATA
                    SIGNAL SQLSTATE '45000'
                  
                  -- the actual body of the function is defined, replacing the statement that throws the exception
                  ALTER SPECIFIC ROUTINE child_arr_one
                    BEGIN ATOMIC
                      DECLARE id_list INT ARRAY DEFAULT ARRAY[];
                      for_loop:
                      FOR SELECT id FROM ptree WHERE pid = p_pid DO
                        SET id_list[CARDINALITY(id_list) + 1] = id;
                        SET id_list = id_list || child_arr(id);
                      END FOR for_loop;
                      RETURN id_list;
                    END
                  
                  -- the function can now be used in SQL statements
                  SELECT * FROM TABLE(child_arr(2))
                  

                  In the next example, a table with two columns is returned instead of an array. In this example, a local table variable is declared and filled with the children and the children's children.

                  CREATE FUNCTION child_table(p_pid INT) RETURNS TABLE(r_pid INT, r_id INT)
                    SPECIFIC child_table_one
                    READS SQL DATA
                    SIGNAL SQLSTATE '45000'
                  
                  ALTER SPECIFIC ROUTINE child_table_one
                    BEGIN ATOMIC
                      DECLARE TABLE child_tree (pid INT, id INT);
                      for_loop:
                      FOR SELECT pid, id FROM ptree WHERE pid = p_pid DO
                        INSERT INTO child_tree VALUES pid, id;
                        INSERT INTO child_tree SELECT r_pid, r_id FROM TABLE(child_table(id));
                      END FOR for_loop;
                      RETURN TABLE(SELECT * FROM child_tree);
                    END
                  
                  SELECT * FROM TABLE(child_table(1))
                  

                  Infinite recursion is not possible as the routine is terminated when a given depth is reached.

                  Java Language Routines (SQL/JRT)

                  The general features of SQL-Invoked Routines are shared between PSM and JRT routines. These features are covered in the previous section. This section deals with specific aspects of JRT routines.

                  The body of a Java language routine is a static method of a Java class, specified with a fully qualified method name in the routine definition. A simple CREATE FUNCTION example is given below, which defines the function to call the java.lang.Math.sinh(double d) Java method. The function can be called in SQL statements just like any built-in function.

                  CREATE FUNCTION sinh(v DOUBLE) RETURNS DOUBLE
                    LANGUAGE JAVA DETERMINISTIC NO SQL
                    EXTERNAL NAME 'CLASSPATH:java.lang.Math.sinh'
                  
                  SELECT sinh(doublecolumn) FROM mytable
                  

                  In the example below, the static method named toZeroPaddedString is specified to be called when the function is invoked.

                  CREATE FUNCTION zero_pad(x BIGINT, digits INT, maxsize INT)
                    RETURNS CHAR VARYING(100)
                    LANGUAGE JAVA DETERMINISTIC NO SQL
                    EXTERNAL NAME 'CLASSPATH:org.hsqldb.lib.StringUtil.toZeroPaddedString'
                  

                  The signature of the Java method (used in the Java code but not in SQL code to create the function) is given below:

                  public static String toZeroPaddedString(long value, int precision, int maxSize)

                  The parameter and return types of the SQL routine definition must match those of the Java method according to the table below:

                  SMALLINT  

                  short or Short

                  INT

                  int or Integer

                  BIGINT

                  long or Long

                  NUMERIC  or DECIMAL

                  BigDecimal

                  FLOAT  or DOUBLE

                  double or Double

                  CHAR or VARCHAR

                  String

                  DATE

                  java.sql.Date

                  TIME

                  java.sql.Time

                  TIMESTAMP

                  java.sql.Timestamp

                  BINARY

                  Byte[]

                  BOOLEAN

                  boolean or Boolean

                  ARRAY of any typejava.sql.Array

                  TABLE

                  java.sql.ResultSet

                  If the specified Java method is not found or its parameters and return types do not match the definition, an exception is raised. If more than one version of the Java method exist, then the one with matching parameter and return types is found and registered. If two “equivalent” methods exist, the first one is registered. (This situation arises only when a parameter is a primitive in one version and an Object in another version, e.g. long and java.lang.Long.).

                  When the Java method of an SQL/JRT routine returns a value, it should be within the size and precision limits defined in the return type of the SQL-invoked routine, otherwise an exception is raised. The scale difference are ignored and corrected. For example, in the above example, the RETURNS CHAR VARYING(100) clause limits the length of the strings returned from the Java method to 100. But if the number of digits after the decimal point (scale) of a returned BigDecimal value is larger than the scale specified in the RETURNS clause, the decimal fraction is silently truncated and no exception of warning is raised.

                  When the function is specified as RETURNS TABLE(...) the static Java method should return a JDBCResultSet instance. For an example of how to construct a JDBCResultSet for this purpose, see the source code for the org.hsqldb.jdbc.JDBCArray class.

                  Polymorphism

                  If two versions of the same SQL invoked routine with different parameter types are required, they can be defined to point to the same method name or different method names, or even methods in different classes. In the example below, the first two definitions refer to the same method name in the same class. In the Java class, the two static methods are defined with corresponding method signatures.

                  In the third example, the Java function returns a result set and the SQL declaration includes RETURNS TABLE.

                  CREATE FUNCTION an_hour_before_or_now(t TIME)
                    RETURNS TIME
                    NO SQL
                    LANGUAGE JAVA PARAMETER STYLE JAVA
                    EXTERNAL NAME 'CLASSPATH:org.npo.lib.nowLessAnHour'
                  
                  CREATE FUNCTION an_hour_before_or_now(t TIMESTAMP)
                    RETURNS TIMESTAMP
                    NO SQL
                    LANGUAGE JAVA PARAMETER STYLE JAVA
                    EXTERNAL NAME 'CLASSPATH:org.npo.lib.nowLessAnHour'
                  
                  CREATE FUNCTION testquery(i INTEGER) 
                    RETURNS TABLE(n VARCHAR(20), i INT) 
                    READS SQL DATA
                    LANGUAGE JAVA
                    EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.TestJavaFunctions.getQueryResult'
                  
                  

                  In the Java class the definitions are as follows. Note the definition of the getQueryResult method begins with a java.sql.Connection parameter. This parameter is ignored when choosing the Java method. The parameter is used to pass the current JDBC connection to the Java method.

                      public static java.sql.Time nowLessAnHour(java.sql.Time value) {
                          ...
                      }
                      public static java.sql.Timestamp nowLessAnHour(java.sql.Timestamp value)
                          ...
                      }
                  
                      public static ResultSet getQueryResult(Connection connection, int i) throws SQLException {
                          Statement st = connection.createStatement();
                          return st.executeQuery("SELECT * FROM T WHERE I < " + i);
                      }
                  
                  

                  Java Language Procedures

                  Java procedures are defined similarly to functions. The differences are:

                  • The return type of the Java static method must be void.

                  • If a parameter is defined as OUT or INOUT, the corresponding Java static method parameter must be defined as an array of the JDBC non-primitive type.

                  • When the Java static method is invoked, the OUT and INOUT arguments are passed as a single-element array.

                  • The static method can modify the OUT or INOUT argument by assigning a value to the sole element of the argument array.

                  • A procedure can return one or more result sets. These are instantiated as JDBC ResultSet objects by the Java static and returned in array arguments of the method. The signature of the Java method for a procedure that has N declared parameters and returns M result sets has the following pattern. The N parameters corresponding to the signature of the declared SQL procedure are defined first, followed by M parameters as ResultSet arrays.

                    When the SQL procedure is executed, the Java method is called with single element array arguments passed for OUT and INOUT SQL parameters, and single element arrays of ResultSet for the returned ResultSet objects. The Java method may call the execute() or executeQuery() methods of JDBC Statement or PreparedStatement objects that are declared within the method and assign the ResultSet objects to the first element of each ResultSet[] argument. For the returned ResultSet objects, the Java method should not call the methods of java.sql.ResultSet before returning.

                    void methodName(<arg1>, ... <argN>, ResultSet[] r1, ..., ResultSet[] rM)

                  • If the procedure contains SQL statements, only statements for data access and manipulation are allowed. The Java method should not perform commit or rollback. The SQL statements should not change the session settings and should not include statements that create or alter tables or other database objects. These rules are generally enforced by the engine, but additional enforcement may be added in future versions

                  An example of a procedure definition, together with its Java signature, is given below. This procedure is the SQL/JRT version of the example discussed above for SQL/PSM.

                  CREATE PROCEDURE get_customer(IN id INT, OUT firstname VARCHAR(50), OUT lastname VARCHAR(50)) 
                    READS SQL DATA
                    LANGUAGE JAVA
                    EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.Test01.getCustomerProcedure'
                  
                    public static void getCustomerProcedure(int id, String[] firstn, String[] lastn)
                        throws java.sql.SQLException {
                        firstn[0] = somevalue;
                        lastn[0] = somevalue;
                    }
                  
                  

                  In the next example a procedure is defined to return a result set. The signature of the Java method is also given. The Java method assigns a ResultSet object to the zero element of the result parameter.

                  CREATE PROCEDURE new_customer(firstname VARCHAR(50), lastname VARCHAR(50))
                    MODIFIES SQL DATA 
                    LANGUAGE JAVA
                    DYNAMIC RESULT SETS 1
                    EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.Test01.newCustomerProcedure'
                  
                    public static void newCustomerProcedure(String firstn, String lastn, String addr,
                                         ResultSet[] result) throws java.sql.SQLException {
                        result[0] = someresultset;
                    }
                  
                  

                  Java language procedures SQL/JRT are used in an identical manner to SQL/PSM routines. See the section under SQL/PSM routines, Returning Data From Procedures, on how to use the JDBC CallableStatement interface to call the procedure and to get the OUT and INOUT arguments and to use the ResultSet objects returned by the procedure.

                  Java Static Methods

                  The static methods that are used for procedures and functions must be declared in a public class. The methods must be declared as public static. For functions, the method return type must be one of the JDBC supported types. The IN parameters of the method must be declared as one of the supported types. The OUT and INOUT parameters must be declared as Java arrays of supported types. If the SQL definition of a function includes RETURNS NULL ON NULL INPUT, then the IN parameters of the Java static function can be int or long primitives, otherwise, they must be Integer or Long. The declared Java arrays for OUT and INOUT parameters for SQL INTEGER or BIGINT must be Integer[] or Long[] respectively.

                  If the SQL definition of the routine includes NO SQL, then no JDBC method call is allowed to execute in the method body. Otherwise, a JDBC Connection can be used within the Java method to access the database. If the definition includes CONTAINS SQL, then no table data can be read. If the definition includes READS SQL DATA, then no table data can be modified. If the definition includes MODIFIES SQL DATA, then data can be modified. In all modes, it is not allowed to execute DDL statements that change the schema definition.

                  It is possible to use DECLARE LOCAL TEMPORARY TABLE in a Java method, as this is in the session scope.

                  There are two ways to use the JDBC Connection object.

                  1. Define the Java method with a Connection parameter as the first parameter. This parameter is "hidden" and only visible to the engine. The rest of the parameters, if any, are used to choose the method according to the required types of parameters.

                  2. Use the SQL/JRT Standard "jdbc:default:connection" method. With this approach, the Java method does not include a Connection parameter. In the method body, the connection is established with a method call to DriverManager, as in the example below:

                    Connection con = DriverManager.getConnection("jdbc:default:connection");

                  Both methods return a connection that is based on the current session. This connection has some extra properties, for example, the Close() method does not actually close it.

                  An example of an SQL PROCEDURE with its Java method definition is given below. The CREATE PROCEDURE statement is the same with or without the Connection parameter:

                  CREATE PROCEDURE proc1(IN P1 INT, IN P2 INT, OUT P3 INT)
                  SPECIFIC P2 LANGUAGE JAVA DETERMINISTIC MODIFIES SQL DATA EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.TestStoredProcedure.procTest2'");
                  

                  In the first example, the "jdbc:default:connection" method is used. In the second example, a connection parameter is used

                      public static void procTest2(int p1, int p2,
                                         Integer[] p3) throws java.sql.SQLException {
                  
                          Connection conn =
                              DriverManager.getConnection("jdbc:default:connection");
                          java.sql.Statement stmt = conn.createStatement();
                  
                          stmt.execute("INSERT INTO MYTABLE VALUES(" + p1 + ",'test1')");
                          stmt.execute("INSERT INTO MYTABLE VALUES(" + p2 + ",'test2')");
                  
                          java.sql.ResultSet rs = stmt.executeQuery("select * from MYTABLE");
                          java.sql.ResultSetMetaData meta = rs.getMetaData();
                  
                          int cols  = meta.getColumnCount();
                          p3[0] = Integer.valueOf(cols);
                  
                          rs.close();
                          stmt.close();
                      }
                  
                  //  alternative declaration with Connection parameter
                  //  public static void procTest2(Connection conn, int p1, int p2,
                  //                    Integer[] p3) throws java.sql.SQLException {
                  

                  When the stored procedure is called by the user's program, the value of the OUT parameter can be read after the call.

                      // a CallableStatement is used to prepare the call
                      // the OUT parameter contains the return value
                      CallableStatement c = conn.prepareCall("call proc1(1,2,?)");
                      c.execute();
                      int value = c.getInt(1);
                  

                  Legacy Support

                  The legacy HyperSQL statement, CREATE ALIAS <name> FOR <fully qualified Java method name> is no longer supported directly. It is supported when importing databases and translates to a special CREATE FUNCTION <name> statement that creates the function in the PUBLIC schema.

                  The direct use of a Java method as a function is still supported but deprecated. It is internally translated to a special CREATE FUNCTION statement where the name of the function is the double quoted, fully qualified name of the Java method used.

                  Securing Access to Classes

                  By default, the static methods of any class that is on the classpath are available to be used. This can compromise security in some systems. The optional Java system property hsqldb.method_class_names allows preventing access to classes other than java.lang.Math or specifying a semicolon-separated list of allowed classes. A property value that ends with .* is treated as a wild card and allows access to all class or method names formed by substitution of the * (asterisk).

                  In the example below, the property has been included as an argument to the Java command.

                      java -Dhsqldb.method_class_names="org.me.MyClass;org.you.YourClass;org.you.lib.*" [the rest of the command line]
                  

                  The above example allows access to the methods in the two classes: org.me.MyClass and org.you.YourClass together with all the classes in the org.you.lib package. Note that if the property is not defined, no access control is performed at this level.

                  Once the routine has been defined, the normal database access control still applies. The routine can be executed only by the users who have been granted EXECUTE privileges on it. The user who executes a Java routine must also have the relevant access privileges on the tables that are used inside the Java method.

                  User Defined Aggregate Functions

                  HyperSQL adds an extension to the SQL Standard to allow user-defined aggregate functions. A user-defined aggregate function has a single parameter when it is used in SQL statements. Unlike the predefined aggregate functions, the keyword DISTINCT cannot be used when a user defined aggregate function is invoked. Like all user-defined functions, an aggregate function belongs to a schema and can be polymorphic (using multiple function definitions with the same name but different parameter types).

                  A user defined aggregate function can be used in SQL statements where a predefined aggregate function is allowed.

                  Definition of Aggregate Functions

                  An aggregate function is always defined with 4 parameters. The first parameter is the parameter that is used when the function is invoked in SQL statements, the rest of the parameter are invisible to the invoking SQL statement. The type of the first parameter is user defined. The type of the second parameter must be BOOLEAN. The third and fourth parameters have user defined types and must be defined as INOUT parameters. The defined return type of the function determines the type of the value returned when the function is invoked.

                  CREATE AGGREGATE FUNCTION

                  user defined aggregate function definition

                  Aggregate function definition is similar to normal function definition and has the mandatory <returns clause>. The BNF is given below.

                  <user defined aggregate function> ::= CREATE AGGREGATE FUNCTION <schema qualified routine name> <SQL aggregate parameter declaration list> <returns clause> <routine characteristics> <routine body>

                  The parameter declaration list BNF is given below. The type of the first parameter is used when the function is invoked as part of an SQL statement. When multiple versions of a function are required, each version will have the first parameter of a different type.

                  <SQL aggregate declaration list> ::= <left paren> [IN] [ <SQL parameter name> ] <parameter type> <comma> [IN] [ <SQL parameter name> ] BOOLEAN <comma> INOUT [ <SQL parameter name> ] <parameter type> <comma> INOUT [ <SQL parameter name> ] <parameter type> <right paren>

                  The return type is user defined. This is the type of the resulting value when the function is called. Usually an aggregate function is defined with CONTAINS SQL, as it normally does not read the data in database tables, but it is possible to define the function with READS SQL DATA and access the database tables.

                  When a SQL statement that uses the aggregate function is executed, HyperSQL invokes the aggregate function, with all the arguments set, once per each row in order to compute the values. Finally, it invokes the function once more to return the final result.

                  In the computation phase, the first argument is the value of the user argument as specified in the SQL statement, computed for the current row. The second argument is the boolean FALSE. The third and fourth argument values can have any type and are initially null, but they can be updated in the body of the function during each invocation. The third and fourth arguments act as registers and hold their values between invocations. The return value of the function is ignored during the computation phase (when the second parameter is FALSE).

                  After the computation phase, the function is invoked once more to get the final result. In this invocation, the first argument is NULL and the second argument is boolean TRUE. The third and fourth arguments hold the values they held at the end of the last invocation. The value returned by the function in this invocation is used as the result of the aggregate function computation in the invoking SQL statement. In SQL queries with GROUP BY, the call sequence is repeated separately for each separate group.

                  SQL PSM Aggregate Functions

                  The example below features a user defined version of the Standard AVG(<value expression>) aggregate function for INTEGER input and output types. This function behaves differently from the Standard AVG function as it returns 0 when all the input values are null.

                  CREATE AGGREGATE FUNCTION udavg(IN x INTEGER, IN flag BOOLEAN, INOUT addup BIGINT, INOUT counter INT)
                    RETURNS INTEGER
                    CONTAINS SQL
                    BEGIN ATOMIC
                      IF flag THEN
                        RETURN addup / counter;
                      ELSE
                        SET counter = COALESCE(counter, 0) + 1;
                        SET addup = COALESCE(addup, 0) || COALESCE(x, 0);
                        RETURN NULL;
                      END IF;
                    END
                  
                  

                  The user defined aggregate function is used in a select statement in the example below. Only the first parameter is visible and utilised in the select statement.

                  SELECT udavg(id) FROM customers GROUP BY lastname;

                  In the example below, the function returns an array that contains all the values passed for the aggregated column. For use with longer arrays, you can optimise the function by defining a larger array in the first iteration, and using the TRIM_ARRAY function on the RETURN to cut the array to size. This function is similar to the built-in ARRAY_AGG function

                  CREATE AGGREGATE FUNCTION array_aggregate(IN val VARCHAR(100), IN flag boolean, INOUT buffer VARCHAR(100) ARRAY, INOUT counter INT)
                    RETURNS VARCHAR(100) ARRAY
                    CONTAINS SQL
                    BEGIN ATOMIC
                      IF flag THEN
                        RETURN buffer;
                      ELSE
                        IF val IS NULL THEN RETURN NULL; END IF;
                        IF counter IS NULL THEN SET counter = 0; END IF;
                        SET counter = counter + 1;
                        IF counter = 1 THEN SET buffer = ARRAY[val];
                        ELSE SET buffer[counter] = val; END IF;
                        RETURN NULL;
                      END IF;
                    END
                  

                  The tables and data for the select statement below are created with the DatabaseManager or DatabaseManagerSwing GUI apps. (You can find the SQL in the TestSelf.txt file in the zip). Part of the output is shown. Each row of the output includes an array containing the values for the invoices for each customer.

                  SELECT ID, FIRSTNAME, LASTNAME, ARRAY_AGGREGATE(CAST(INVOICE.TOTAL AS VARCHAR(100))) 
                    FROM customer JOIN INVOICE ON ID =CUSTOMERID
                    GROUP BY ID, FIRSTNAME, LASTNAME
                  
                  11 Susanne   Karsen    ARRAY['3988.20']                               
                  12 John      Peterson  ARRAY['2903.10','4382.10','4139.70','3316.50'] 
                  13 Michael   Clancy    ARRAY['6525.30']                               
                  14 James     King      ARRAY['3665.40','905.10','498.00']             
                  18 Sylvia    Clancy    ARRAY['634.20','4883.10']                      
                  20 Bob       Clancy    ARRAY['3414.60','744.60']
                  

                  In the example below, the function returns a string that contains the comma-separated list of all the values passed for the aggregated column. This function is similar to the built in GROUP_CONCAT function.

                  CREATE AGGREGATE FUNCTION group_concatenate(IN val VARCHAR(100), IN flag BOOLEAN, INOUT buffer VARCHAR(1000), INOUT counter INT
                   RETURNS VARCHAR(1000)
                   CONTAINS SQL
                   BEGIN ATOMIC
                   IF FLAG THEN
                    RETURN BUFFER;
                   ELSE
                    IF val IS NULL THEN RETURN NULL; END IF;
                    IF buffer IS NULL THEN SET BUFFER = ''; END IF;
                    IF counter IS NULL THEN SET COUNTER = 0; END IF;
                    IF counter > 0 THEN SET buffer = buffer || ','; END IF;
                    SET buffer = buffer + val;
                    SET counter = counter + 1;
                    RETURN NULL;
                   END IF;
                   END
                  

                  The same tables and data as for the previous example is used. Part of the output is shown. Each row of the output is a comma-separated list of names.

                  SELECT group_concatenate(firstname || ' ' || lastname) FROM customer GROUP BY lastname
                    
                  Laura Steel,John Steel,John Steel,Robert Steel                                   
                  Robert King,Robert King,James King,George King,Julia King,George King            
                  Robert Sommer,Janet Sommer                                                       
                  Michael Smith,Anne Smith,Andrew Smith                                            
                  Bill Fuller,Anne Fuller                                                          
                  Laura White,Sylvia White                                                         
                  Susanne Clancy,Michael Clancy,Sylvia Clancy,Bob Clancy,Susanne Clancy,John Clancy
                  

                  Java Aggregate Functions

                  A Java aggregate function is defined similarly to PSM functions, apart from the routine body, which is defined as EXTERNAL NAME ... The Java function signature must follow the rules for both nullable and INOUT parameters, therefore:

                  No argument is defined as a primitive or primitive array type. This allows nulls to be passed to the function. The second and third arguments must be defined as arrays of the JDBC non-primitive types listed in the table in the previous section.

                  In the example below, a user-defined aggregate function for geometric mean is defined.

                  CREATE AGGREGATE FUNCTION geometric_mean(IN val DOUBLE, IN flag BOOLEAN, INOUT register DOUBLE, INOUT counter INT)
                    RETURNS DOUBLE
                    NO SQL
                    LANGUAGE JAVA
                    EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.Test01.geometricMean'
                  

                  The Java function definition is given below:

                      public static Double geometricMean(Double in, Boolean flag,
                              Double[] register, Integer[] counter) {
                          if (flag) {
                              if (register[0] == null) { return null; }
                              double a = register[0].doubleValue();
                              double b = 1 / (double) counter[0];
                              return Double.valueOf(java.lang.Math.pow(a, b));
                          }
                          if (in == null) { return null; }
                          if (in.doubleValue() == 0) { return null; }
                          if (register[0] == null) {
                              register[0] = in;
                              counter[0]  = Integer.valueOf(1);
                          } else {
                              register[0] = Double.valueOf(register[0].doubleValue() * in.doubleValue());
                              counter[0] = Integer.valueOf(counter[0].intValue() + 1);
                          }
                          return null;
                      }
                  

                  In a select statement, the function is used exactly like the built-in aggregate functions:

                  SELECT geometric_mean(age) FROM  FROM customer
                  

                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/filelinks-app.html0000644000175000017500000003037012007567744021410 0ustar renerene Appendix D. HyperSQL File Links

                  Appendix D. HyperSQL File Links

                  HyperSQL Files referred to in this Guide

                  HyperSQL files referred to in the text may be retrieved from the canonical HyperSQL documentation site, http://hsqldb.org/doc/2.0, or from the same location you are reading this page from.

                  [Note]Note

                  If you are reading this document with a standalone PDF reader, only the http://hsqldb.org/doc/2.0/... links will function.

                  Pairs of local + http://hsqldb.org/doc/2.0 links for referenced files.


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/unix-chapt.html0000644000175000017500000016516412007570422020727 0ustar renerene Chapter 14. HyperSQL on UNIX

                  Chapter 14. HyperSQL on UNIX

                  How to quickly get a HyperSQL (aka HSQLDB) Listener up and running on UNIX, including Mac OS X

                  Blaine Simpson

                  The HSQL Development Group

                  $Revision: 4907 $

                  2012-08-06 00:10:58+0100

                  Purpose

                  This chapter explains how to quickly install, run, and use a HyperSQL Listener (aka Server) on UNIX.

                  Note that, unlike a traditional database server, there are many use cases where it makes sense to run HyperSQL without any listener. This type of setup is called in-process, and is not covered here, since there is no UNIX-specific setup in that case.

                  I intend to cover what I think is the most common UNIX setup: To run a multi-user, externally-accessible catalog with permanent data persistence. (By the latter I mean that data is stored to disk so that the catalog data will persist across process shutdowns and startups). I also cover how to run the Listener as a system daemon.

                  When I give sample shell commands below, I use commands which will work in Bourne-compatible shells, including Bash and Korn. Users who insist on using the inferior C-shells will need to convert.

                  Installation

                  Go to http://sourceforge.net/projects/hsqldb and click on the "files" link. You want the current version. I can't be more specific because SourceForge/Geeknet are likely to continue changing their interface. See if there's a distribution for the current HSQLDB version in the format that you want.

                  If you want a binary package and we either don't provide it, or you prefer somebody else's build, you should still find out the current version of HyperSQL available at SourceForge. It's very likely that you can find a binary package for your UNIX variant with your OS distributor, http://www.jpackage.org/, http://sunfreeware.com/, etc. Nowadays, most UNIXes have software package management systems which check Internet repositories. Just search the repositories for "hsqldb" and "hypersql". The challenge is to find an up-to-date package. You will get better features and support if you work with the current stable release of HyperSQL. (In particular, HyperSQL version 2.0.0 added tons of new features). Pay attention to what JVM versions your binary package supports. Our builds (version 2.0 and later) document the Java version it was built with in the file doc/index.html, but you can't depend on this if somebody else assembled your distribution. Java jar files are generally compatible with the same or greater major versions. For example,if your hsqldb.jar was built with Java 1.3.6-11, then it is compatible with Java versions 1.3.* and greater.

                  [Note]Note

                  It could very well happen that some of the file formats which I discuss below are not in fact offered. If so, then we have not gotten around to building them.

                  Binary installation depends on the package format that you downloaded.

                  Installing from a .pkg.Z file

                  This package is only for use by a Solaris super-user. It's a System V package. Download then uncompress the package with uncompress or gunzip

                      uncompress filename.pkg.Z

                  You can read about the package by running

                      pkginfo -l -d filename.pkg

                  Run pkgadd as root to install.

                      pkgadd -d filename.pkg

                  Installing from a BSD Port or Package

                  You're on your own. I find everything much easier when I install software to BSD without their package management systems.

                  Installing from a .rpm file

                  Just skip this section if you know how to install an RPM. If you found the RPM using a software management system, then just have it install it. The remainder of item explains a generic command-line method which should work with any Linux variant. After you download the rpm, you can read about it by running

                      rpm -qip /path/to/file.rpm

                  Rpms can be installed or upgraded by running

                      rpm -Uvh /path/to/file.rpm

                  as root. Suse users may want to keep Yast aware of installed packages by running rpm through Yast: yast2 -i /path/to/file.rpm.

                  Installing from a .zip file

                  Extract the zip file in an ancestor directory of the new HSQLDB home. You don't need to create the HSQLDB_HOME directory because the extraction will create a version-labelled directory, and the subdirectory "hsqldb". This "hsqldb" directory is your HSQLDB_HOME, and you can move it to wherever you wish. If you will be upgrading or maintaining multiple versions of HyperSQL, you will want to retain the version number in the directory tree somehow.

                      cd ancestor/of/new/hsqldb/home
                      unzip /path/to/file.zip

                  All the files in the zip archive will be extracted to underneath a new subdirectory named like hsqldb-2.0.2a/hsqldb.

                  Take a look at the files you installed. (Under hsqldb for zip file installations. Otherwise, use the utilities for your packaging system). The most important file of the HyperSQL system is hsqldb.jar, which resides in the subdirectory lib. Depending on who built your distribution, your file name may have a version label in it, like hsqldb-1.2.3.4.jar.

                  [Important]Important

                  For the purposes of this chapter, I define HSQLDB_HOME to be the parent directory of the lib directory that contains hsqldb.jar. E.g., if your path to hsqldb.jar is /a/b/hsqldb/lib/hsqldb.jar, then your HSQLDB_HOME is /a/b/hsqldb.

                  Furthermore, unless I state otherwise, all local file paths that I give are relative to the HSQLDB_HOME.

                  If the description of your distribution says that the hsqldb.jar file will work for your Java version, then you are finished with installation. Otherwise you need to build a new hsqldb.jar file.

                  If you followed the instructions above and you still don't know what Java version your hsqldb.jar supports, then try reading documentation files like readme.txt, README.TXT, INSTALL.txt etc. (As I said above, our newer distributions always document the Java version for the build, in the file doc/index.html). If that still doesn't help, then you can just try your hsqldb.jar and see if it works, or build your own.

                  To use the supplied hsqldb.jar, just skip to the next section of this document. Otherwise build a new hsqldb.jar.

                  Procedure 14.1. Building hsqldb.jar

                  1. If you don't already have Ant, download the latest stable binary version from http://ant.apache.org. cd to where you want Ant to live, and extract from the archive with

                        unzip /path/to/file.zip

                    or

                        tar -xzf /path/to/file.tar.gz

                    or

                        bunzip2 -c /path/to/file.tar.bz2 | tar -xzf -

                    Everything will be installed into a new subdirectory named apache-ant- + version. You can rename the directory after the extraction if you wish.

                  2. Set the environmental variable JAVA_HOME to the base directory of your Java JRE or SDK, like

                        export JAVA_HOME; JAVA_HOME=/usr/java/j2sdk1.4.0

                    The location is entirely dependent upon your variety of UNIX. Sun's rpm distributions of Java normally install to /usr/java/something. Sun's System V package distributions of Java (including those that come with Solaris) normally install to /usr/something, with a sym-link from /usr/java to the default version (so for Solaris you will usually set JAVA_HOME to /usr/java).

                  3. Remove the existing file HSQLDB_HOME /lib/hsqldb.jar.

                  4. cd to HSQLDB_HOME/build. Make sure that the bin directory under your Ant home is in your search path. Run the following command.

                        ant hsqldb

                    This will build a new HSQLDB_HOME/lib/hsqldb.jar.

                  See the Building HyperSQL Jars appendix if you want to build anything other than hsqldb.jar with all default settings.

                  Setting up a HyperSQL Persistent Database Catalog and a HyperSQL Network Listener

                  If you installed from an OS-specific package, you may already have a catalog and listener pre-configured. See if your package includes a file named server.properties (make use of your packaging utilities). If you do, then I suggest that you still read this section while you poke around, in order to understand your setup.

                  1. Select a UNIX user to run the database process (JVM) as. If this database is for the use of multiple users, or is a production system (or to emulate a production system), you should dedicate a UNIX user for this purpose. In my examples, I use the user name hsqldb. In this chapter, I refer to this user as the HSQLDB_OWNER, since that user will own the database catalog files and the JVM processes.

                    If the account doesn't exist, then create it. On all system-5 UNIXes and most hybrids (including Linux), you can run (as root) something like

                        useradd -c 'HSQLDB Database Owner' -s /bin/bash -m hsqldb

                    (BSD-variant users can use a similar pw useradd hsqldb... command).

                  2. Become the HSQLDB_OWNER. Copy the sample file sample/server.properties to the HSQLDB_OWNER's home directory and rename it to server.properties. (As a final reminder, "sampleserver.properties" is a relative path, so it is understood to be relative to your HSQLDB_HOME).

                    # Hsqldb Server cfg file.
                    # See the HyperSQL Network Listeners chapter of the HyperSQL User Guide.
                    
                    # Each server.database.X setting defines a database "catalog".
                    # I.e., an independent set of data.
                    # Each server.database.X setting corresponds exactly to the jdbc:hsqldb:*
                    # JDBC URL you would use if you wanted to get a direct (In-Process)
                    # Connection to the catalog instead of "serving" it.
                    
                    server.database.0=file:db0/db0
                    # I suggest that, for every file: catalog you define, you add the
                    # connection property "ifexists=true" after the database instance
                    # is created (which happens simply by starting the Server one time).
                    # Just append ";ifexists=true" to the file: URL, like so:
                    # server.database.0=file:db0/db0;ifexists=true
                    
                    # server.dbname.0 defaults to "" (i.e. server.dbname.n for n==0), but
                    # the catalog definition n will be entirely ignored for n > 0 if you do not
                    # set server.dbname.n.  I.e. dbname setting is required for n > 0, though it
                    # may be set to blank (e.g. "server.dbname.3=")
                    

                    Since the value of the first database (server.database.0) begins with file:, the catalog will be persisted to a set of files in the specified directory with names beginning with the specified name. Set the path to whatever you want (relative paths will be relative to the directory containing the properties file). You can read about how to specify other catalogs of various types, and how to make settings for the listen port and many other things in other chapters of this guide.

                  3. Set and export the environmental variable CLASSPATH to the value of HSQLDB_HOME (as described above) plus "/lib/hsqldb.jar", like

                        export CLASSPATH; CLASSPATH=/path/to/hsqldb/lib/hsqldb.jar

                    In HSQLDB_OWNER's home directory, run

                        nohup java org.hsqldb.server.Server &

                    This will start the Listener process in the background, and will create your new database catalog "db0". Continue on when you see the message containing HSQLDB server... is online. nohup just makes sure that the command will not quit when you exit the current shell (omit it if that's what you want to do).

                  Accessing your Database

                  We're going to use SqlTool to access the database, so you will need the file sqltool.jar in addition to hsqldb.jar. If sqltool.jar isn't already sitting there beside hsqldb.jar (they both come pre-built), build it exactly as you would build hsqldb.jar, except use ant target sqltool. If your distribution came with a sqltool jar file with a version label, like sqltool-1.2.3.4.jar, that's fine-- use that file whenever I say sqltool.jar below.

                  Copy the file sample/sqltool.rc to the HSQLDB_OWNER's home directory. Use chmod to make the file readable and writable only to HSQLDB_OWNER.

                  # $Id: sqltool.rc 4313 2011-06-06 02:19:38Z unsaved $
                  
                  # This is a sample RC configuration file used by SqlTool, DatabaseManager,
                  # and any other program that uses the org.hsqldb.lib.RCData class.
                  # See the documentation for SqlTool for various ways to use this file.
                  
                  # If you have the least concerns about security, then secure access to
                  # your RC file.
                  
                  # You can run SqlTool right now by copying this file to your home directory
                  # and running
                  #    java -jar /path/to/sqltool.jar mem
                  # This will access the first urlid definition below in order to use a 
                  # personal Memory-Only database.
                  # "url" values may, of course, contain JDBC connection properties, delimited
                  # with semicolons.
                  # As of revision 3347 of SqlFile, you can also connect to datasources defined
                  # here from within an SqlTool session/file with the command "\j urlid".
                  
                  # You can use Java system property values in this file like this:  ${user.home}
                  
                  # The only feature added recently is the optional "transiso" setting,
                  # which may be set to an all-caps transaction isolation level as listed
                  # in the Java API Spec for java.sql.Connection.
                  # Windows users are advised to use forward slashes instead of reverse slashes,
                  # and to avoid paths containing spaces or other funny characters.  (This
                  # recommendation applies to any Java app, not just SqlTool).
                  
                  # A personal Memory-Only (non-persistent) database.
                  urlid mem
                  url jdbc:hsqldb:mem:memdbid
                  username SA
                  password
                  
                  # A personal, local, persistent database.
                  urlid personal
                  url jdbc:hsqldb:file:${user.home}/db/personal;shutdown=true
                  username SA
                  password
                  transiso TRANSACTION_READ_COMMITTED
                  # When connecting directly to a file database like this, you should 
                  # use the shutdown connection property like this to shut down the DB
                  # properly when you exit the JVM.
                  
                  # This is for a hsqldb Server running with default settings on your local
                  # computer (and for which you have not changed the password for "SA").
                  urlid localhost-sa
                  url jdbc:hsqldb:hsql://localhost
                  username SA
                  password
                  
                  
                  
                  # Template for a urlid for an Oracle database.
                  # You will need to put the oracle.jdbc.OracleDriver class into your 
                  # classpath.
                  # In the great majority of cases, you want to use the file classes12.zip
                  # (which you can get from the directory $ORACLE_HOME/jdbc/lib of any
                  # Oracle installation compatible with your server).
                  # Since you need to add to the classpath, you can't invoke SqlTool with
                  # the jar switch, like "java -jar .../sqltool.jar...".
                  # Put both the SqlTool jar and classes12.zip in your classpath (and export!)
                  # and run something like "java org.hsqldb.util.SqlTool...".
                  
                  #urlid cardiff2
                  #url jdbc:oracle:thin:@aegir.admc.com:1522:TRAFFIC_SID
                  #username blaine
                  #password secretpassword
                  #driver oracle.jdbc.OracleDriver
                  
                  
                  
                  # Template for a TLS-encrypted HSQLDB Server.
                  # Remember that the hostname in hsqls (and https) JDBC URLs must match the
                  # CN of the server certificate (the port and instance alias that follows 
                  # are not part of the certificate at all).
                  # You only need to set "truststore" if the server cert is not approved by
                  # your system default truststore (which a commercial certificate probably
                  # would be).
                  
                  #urlid tls
                  #url jdbc:hsqldb:hsqls://db.admc.com:9001/lm2
                  #username BLAINE
                  #password asecret
                  #truststore ${user.home}/ca/db/db-trust.store
                  
                  
                  # Template for a Postgresql database
                  #urlid blainedb
                  #url jdbc:postgresql://idun.africawork.org/blainedb
                  #username blaine
                  #password losung1
                  #driver org.postgresql.Driver
                  
                  # Template for a MySQL database.  MySQL has poor JDBC support.
                  #urlid mysql-testdb
                  #url jdbc:mysql://hostname:3306/dbname
                  #username root
                  #password hiddenpwd
                  #driver com.mysql.jdbc.Driver
                  
                  # Note that "databases" in SQL Server and Sybase are traditionally used for
                  # the same purpose as "schemas" with more SQL-compliant databases.
                  
                  # Template for a Microsoft SQL Server database using Microsoft's Driver
                  # (I find that the JTDS driver is much more responsive than Microsoft's).
                  # OLDER JDBC Driver:
                  #urlid msprojsvr
                  #url jdbc:microsoft:sqlserver://hostname;DatabaseName=DbName;SelectMethod=Cursor
                  # The SelectMethod setting is required to do more than one thing on a JDBC
                  # session (I guess Microsoft thought nobody would really use Java for 
                  # anything other than a "hello world" program).
                  # This is for Microsoft's SQL Server 2000 driver (requires mssqlserver.jar
                  # and msutil.jar).
                  #driver com.microsoft.jdbc.sqlserver.SQLServerDriver
                  #username myuser
                  #password hiddenpwd
                  # Current 2011 JDBC Driver for Microsoft SQL Server:
                  # Requires just the new sqljdbc4.jar.  (Microsoft just loves back-slashes)
                  #url jdbc:sqlserver://hostname\instanceName;DatabaseName=dbname
                  #driver com.microsoft.jdbc.sqlserver.SQLServerDriver
                  
                  # Template for Microsoft SQL Server database using the JTDS Driver
                  # http://jtds.sourceforge.net  Jar file has name like "jtds-1.2.5.jar".
                  #urlid nlyte
                  #username myuser
                  #password hiddenpwd
                  #url jdbc:jtds:sqlserver://myhost/nlyte;instance=MSSQLSERVER
                  #driver net.sourceforge.jtds.jdbc.Driver
                  
                  # Template for a Sybase database
                  #urlid sybase
                  #url jdbc:sybase:Tds:hostname:4100/dbname
                  #username blaine
                  #password hiddenpwd
                  # This is for the jConnect driver (requires jconn3.jar).
                  #driver com.sybase.jdbc3.jdbc.SybDriver
                  
                  # Template for Embedded Derby / Java DB.
                  #urlid derby1
                  #url jdbc:derby:path/to/derby/directory;create=true
                  #username ${user.name}
                  #password any_noauthbydefault
                  #driver org.apache.derby.jdbc.EmbeddedDriver
                  # The embedded Derby driver requires derby.jar.
                  # There'a also the org.apache.derby.jdbc.ClientDriver driver with URL
                  # like jdbc:derby://<server>[:<port>]/databaseName, which requires
                  # derbyclient.jar.
                  # You can use \= to commit, since the Derby team decided (why???)
                  # not to implement the SQL standard statement "commit"!!
                  # Note that SqlTool can not shut down an embedded Derby database properly,
                  # since that requires an additional SQL connection just for that purpose.
                  # However, I've never lost data by not shutting it down properly.
                  # Other than not supporting this quirk of Derby, SqlTool is miles ahead of ij.
                  

                  We will be using the "localhost-sa" sample urlid definition from the config file. The JDBC URL for this urlid is jdbc:hsqldb:hsql://localhost. That is the URL for the default catalog of a HyperSQL Listener running on the default port of the local host. You can read about URLs to connect to other catalogs with and without listeners in other chapters of this guide.

                  Run SqlTool.

                      java -jar path/to/sqltool.jar localhost-sa

                  If you get a prompt, then all is well. If security is of any concern to you at all, then you should change the privileged password in the database. Use the command SET PASSWORD command to change SA's password.

                      SET PASSWORD 'newpassword';

                  Set a strong password!

                  [Note]Note

                  If, like most UNIX System Administrators, you often need to make up strong passwords, I highly suggest the great little program pwgen. You can probably get it where you get your other OS packages. The command pwgen -1 is usually all you need.

                  Note that with SQL-conformant databases like HyperSQL 2.0, user names and passwords are case sensitive. If you don't quote the name, it will be interpreted as upper-case, like any named SQL object. (Only for backwards compatibility, we do make an exception for the special user name SA, but you should always use upper-case "SA" nevertheless).

                  When you're finished playing, exit with the command \q.

                  If you changed the SA password, then you need to update the password in the sqltool.rc file accordingly.

                  You can, of course, also access the database with any JDBC client program. You will need to modify your classpath to include hsqldb.jar as well as your client class(es). You can also use the other HSQLDB client programs, such as org.hsqldb.util.DatabasManagerSwing, a graphical client with a similar purpose to SqlTool.

                  You can use any normal UNIX account to run the JDBC clients, including SqlTool, as long as the account has read access to the sqltool.jar file and to an sqltool.rc file. See the Utilities Guide about where to put sqltool.rc, how to execute sql files, and other SqlTool features.

                  Create additional Accounts

                  Connect to the database as SA (or any other Administrative user) and run CREATE USER to create new accounts for your catalog. HSQLDB accounts are database-catalog-specific, not Listener-specific.

                  In SQL-compliant databases, all database objects are created in a schema. If you don't specify a schema, then the new object will be created in the default schema. To create a database object, your account (the account that you connected with) must have the role DBA, or your account must have authorization for the target schema (see the CREATE SCHEMA command about this last). When you first create a HyperSQL catalog, it has only one database user-- SA, a DBA account, with an empty string password. You should set a password (as described above). You can create as many additional users as you wish. To make a user a DBA, you can use the "ADMIN" option to the CREATE USER command, command, or GRANT the DBA Role to the account after creating it.

                  Once an object is created, the object creator and users with the DBA role will have all privileges to work with that object. Other users will have only the rights which the pseudo-user PUBLIC has. To give specific users more permissions, even rights to read objects, you can GRANT permissions for specific objects, grant Roles (which encompass a set of permissions), or grant the DBA Role itself.

                  Since only people with a database account may do anything at all with the database, it is often useful to permit other database users to view the data in your tables. To optimize performance, reduce contention, and minimize administration, it is often best to grant SELECT to PUBLIC on table-like objects that need to be accessed by multiple database users, with the significant exception of any data which you want to keep secret. (Similarly with EXECUTE priv for routines and USAGE priv for other object types). Note that this is not at all equivalent to giving the world or the Internet read access to your tables-- you are giving read access to people that have been given accounts for the target database catalog.

                  Shutdown

                  Do a clean database shutdown when you are finished with the database catalog. You need to connect up as SA or some other Admin user, of course. With SqlTool, you can run

                      java -jar path/to/sqltool.jar --sql 'shutdown;' localhost-sa

                  You don't have to worry about stopping the Listener because it shuts down automatically when all served database catalogs are shut down.

                  Running Hsqldb as a System Daemon

                  You can, of course, run HSQLDB through inittab on System V UNIXes, but usually an init script is more convenient and manageable. This section explains how to set up and use our UNIX init script. Our init script is only for use by root. (That is not to say that the Listener will run as root-- it usually should not).

                  The main purpose of the init script is to start up a Listener for the database catalogs specified in your server.properties file; and to gracefully shut down these same catalogs. For each catalog defined by a server.database.X setting in your .properties file, you must define an administrative "urlid" in your sqltool.rc (these are used to access the catalogs for validation and shutdown purposes). Finally, you list the urlid names in your init script config file. If, due to firewall issues, you want to run a WebServer instead of a Server, then make sure you have a healthy WebServer with a webserver.properties set up, adjust your URLs in sqltool.rc, and set TARGET_CLASS in the config file.

                  By following the commented examples in the config file, you can start up any number of Server and/or WebServer listener instances with or without TLS encryption, and each listener instance can serve any number of HyperSQL catalogs (independent data sets), all with optimal efficiency from a single JVM process. There are instructions in the init script itself about how to run multiple, independently-configured JVM processes. Most UNIX installations, however, will run a single JVM with a single Listener instance which serves multiple catalogs, for easier management and more efficient resource usage.

                  After you have the init script set up, root can use it anytime to start or stop HSQLDB. (I.e., not just at system bootup or shutdown).

                  Portability of hsqldb init script

                  The primary design criterion of the init script is portability. It does not print pretty color startup/shutdown messages as is common in late-model Linuxes and HPUX; and it does not keep subsystem state files or use the startup/shutdown functions supplied by many UNIXes, because these features are all non-portable.

                  Offsetting these limitations, this one script does it's intended job great on the UNIX varieties I have tested, and can easily be modified to accommodate other UNIXes. While you don't have tight integration with OS-specific daemon administration guis, etc., you do have a well tested and well behaved script that gives good, utilitarian feedback.

                  Init script Setup Procedure

                  The strategy taken here is to get the init script to run your single Server or WebServer first (as specified by TARGET_CLASS). After that's working, you can customize the JVM that is run by running additional Listener instances in it, running your own application in it (embedding), or even overriding HSQLDB behavior with your own overriding classes.

                  1. Copy the init script sample/hsqldb.init to hsqldb in the directory where init scripts live on your variety of UNIX. The most common locations are /etc/init.d or /etc/rc.d/init.d on System V style UNIXes, /usr/local/etc/rc.d on BSD style UNIXes, and /Library/StartupItems/hsqldb on OS X (you'll need to create the directory for the last).

                  2. View your server.properties file. Make a note of every catalog define by a server.database.X setting. A couple steps down, you will need to set up administrative access for each of these catalogs. If you are using our sample server.properties file, you will just need to set up access for the catalog specified with file:db0/dbo.

                    [Note]Note

                    Pre-2.0 versions of the hsqldb init script required use of .properties settings of the formserver.urlid.X. These settings are obsolete and should be removed.

                  3. Either copy HSQLDB_OWNER's sqltool.rc file into root's home directory, or set the value of AUTH_FILE to the absolute path of HSQLDB_OWNER's sqltool.rc file. This file is read directly by root, even if you run hsqldb as non-root (by setting HSQLDB_OWNER in the config file). If you copy the file, make sure to use chmod to restrict permissions on the new copy. The init script will abort with an appropriate exhortation if you have the permissions set incorrectly.

                    You need to set up a urlid stanza in your sqltool.rc file for network access (i.e. JDBC URL with hsql:, hsqls:, http:, or https:) for each catalog in your server.properties file. For our example, you need to define a stanza for the file:db0/db0 catalog. You must supply for this catalog, a hsql: JDBC URL, an administrative user name, and the password.

                    Example 14.1. example sqltool.rc stanza

                        urlid localhostdb1
                        url jdbc:hsqldb:hsql://localhost
                        username SA
                        password secret

                  4. Look at the comment towards the top of the init script which lists recommended locations for the configuration file for various UNIX platforms. Copy the sample config file sample/hsqldb.cfg to one of the listed locations (your choice). Edit the config file according to the instructions in it. For our example, you will set the value of URLIDS to localhostdb1, since that is the urlid name that we used in the sqltool.rc file.

                    # $Id: hsqldb.cfg 3583 2010-05-16 01:49:52Z unsaved $
                    
                    # Sample configuration file for HyperSQL Server Listener.
                    # See the "HyperSQL on UNIX" chapter of the HyperSQL User Guide.
                    
                    # N.b.!!!!  You must place this in the right location for your type of UNIX.
                    # See the init script "hsqldb" to see where this must be placed and
                    # what it should be renamed to.
                    
                    # This file is "sourced" by a Bourne shell, so use Bourne shell syntax.
                    
                    # This file WILL NOT WORK until you set (at least) the non-commented
                    # variables to the appropriate values for your system.
                    # Life will be easier if you avoid all filepaths with spaces or any other
                    # funny characters.  Don't ask for support if you ignore this advice.
                    
                    # The URLIDS setting below is new and REQUIRED.  This setting replaces the
                    # server.urlid.X settings which used to be needed in your Server's
                    # properties file.
                    
                    # -- Blaine (blaine dot simpson at admc dot com)
                    
                    JAVA_EXECUTABLE=/usr/bin/java
                    
                    # Unless you copied the jar files from another system, this typically
                    # resides at $HSQLDB_HOME/lib/sqltool.jar, where $HSQLDB_HOME is your HSQLDB
                    # software base directory.
                    # The file name may actually have a version label in it, like
                    # sqltool-1.2.3.jar (in which case, you must specify the full name here).
                    # A 'hsqldb.jar' file (with or without version label) must reside in the same
                    # directory as the specified sqltool.jar file.
                    SQLTOOL_JAR_PATH=/opt/hsqldb-2.0.0/hsqldb/lib/sqltool.jar
                    # For the sample value above, there must also exist a file
                    # /opt/hsqldb-2.0.0/hsqldb/lib/hsqldb*.jar.
                    
                    # Where the file "server.properties" or "webserver.properties" resides.
                    SERVER_HOME=/opt/hsqldb-2.0.0/hsqldb/data
                    
                    # What UNIX user the server will run as.
                    # (The shutdown client is always run as root or the invoker of the init script).
                    # Runs as root by default, but you should take the time to set database file
                    # ownerships to another user and set that user name here.
                    HSQLDB_OWNER=hsqldb
                    
                    # The HSQLDB jar file specified in HSQLDB_JAR_PATH above will automatically
                    # be in the class path.  This arg specifies additional classpath elements.
                    # To embed your own application, add your jar file(s) or class base
                    # directories here, and add your main class to the INVOC_ADDL_ARGS setting
                    # below.  Another common use-case for adding to your class path is to make
                    # classes available to the DB engines for SQL/JRT functions and procedures.
                    #SERVER_ADDL_CLASSPATH=/usr/local/dist/currencybank.jar
                    
                    # For startup or shutdown failures, you can save a lot of debugging time by
                    # temporarily adjusting down MAX_START_SECS and MAX_TERMINATE_SECS to a
                    # little over what it should take for successful startup and shutdown on
                    # your system.
                    
                    # We require all Server/WebServer instances to be accessible within 
                    # $MAX_START_SECS from when the Server/WebServer is started.
                    # Defaults to 60.
                    # Raise this is you are running lots of DB instances or have a slow server.
                    #MAX_START_SECS=200
                    
                    # Max time to allow for JVM to die after all HSQLDB instances stopped.
                    # Defaults to 60.  Set high because the script will always continue as soon as
                    # the process has stopped.  The importance of this setting is, how long until
                    # a non-stopping-JVM-problem will be detected.
                    #MAX_TERMINATE_SECS=0
                    
                    # NEW AND IMPORTANT!!!
                    # As noted at the top of this file, this setting replaces the old property
                    # settings server.urlid.X.
                    # Simply list the URLIDs for all DB instances which your *Server starts.
                    # Usually, these will exactly mirror the server.database.X settings in your
                    # server.properties or webserver.properties file.
                    # Each urlid listed here must be defined to a NETWORK url with Admin privileges
                    # in the AUTH_FILE specified below.  (Network type because we use this for
                    # inter-process communication)
                    # Separate multiple values with white space.  NO OTHER SPECIAL CHARACTERS!
                    # Make sure to quote the entire value if it contains white space separator(s).
                    URLIDS='localhostdb1'
                    
                    # These are urlids # ** IN ADDITION TO URLIDS **, for instances which the init
                    # script should stop but not start.
                    # Most users will not need this setting.  If you need it, you'll know it.
                    # Defaults to none (i.e., only URLIDS will be stopped).
                    #SHUTDOWN_URLIDS='ondemand'
                    
                    # SqlTool authentication file used only for shutdown.
                    # The default value will be sqltool.rc in root's home directory, since it is 
                    # root who runs the init script.
                    # (See the SqlTool chapter of the HyperSQL Utilities Guide if you don't
                    # understand this).
                    #AUTH_FILE=/home/blaine/sqltool.rc
                    
                    # Typical users will leave this unset and it will default to
                    # org.hsqldb.server.Server.  If you need to run the HSQLDB WebServer class
                    # instead, due to a firewall or routing impediment, set this to
                    # org.hsqldb.server.WebServer, see the docs about running WebServr, and
                    # set up a "webserver.properties" file instead of a "server.properties".
                    # The JVM that is started can invoke many classes (see the following item
                    # about that), but this is the server that is used (1) to check status,
                    # (2) to shut down the JVM.
                    #TARGET_CLASS=org.hsqldb.server.WebServer
                    
                    # This is where you may specify both command-line parameters to TARGET_CLASS,
                    # plus any number of additional progams to run (along with their command-line
                    # parameters).  The MainInvoker program is used to embed these multiple
                    # static main invocations into a single JVM, so see the API spec for
                    # org.hsqldb.util.MainInvoker if you want to learn more.
                    # N.b. You should only use this setting to set HSQLDB Server or WebServer
                    # parameters if you run multiple instances of this class, since you can use the
                    # server/webserver.properties file for a single instance.
                    # Every additional class (in addition to the TARGET_CLASS)
                    # must be preceded with an empty string, so that MainInvoker will know
                    # you are giving a class name.  MainInvoker will invoke the normal 
                    # static main(String[]) method of each such class.  
                    # By default, MainInvoker will just run TARGET_CLASS with no args.
                    # Example that runs just the TARGET_CLASS with the specified arguments:
                    #INVOC_ADDL_ARGS='-silent false'   #but use server.properties property instead!
                    # Example that runs the TARGET_CLASS plus a WebServer:
                    #INVOC_ADDL_ARGS='"" org.hsqldb.server.WebServer'
                    # Note the empty string preceding the class name.
                    # Example that starts TARGET_CLASS with an argument + a WebServer +
                    # your own application with its args (i.e., the HSQLDB Servers are
                    # "embedded" in your application).  (Set SERVER_ADDL_CLASSPATH too).:
                    #INVOC_ADDL_ARGS='-silent false "" org.hsqldb.server.WebServer "" com.acme.Stone --env prod localhost'
                    #   but use server.properties for -silent option instead!
                    # Example to run a non-TLS server in same JVM with a TLS server.  In this
                    # case, TARGET_CLASS is Server which will run both in TLS mode by virtue of 
                    # setting the tls, keyStore, and keyStorePassword settings in
                    # server*.properties, as described below; plus an "additional" Server with
                    # overridden 'tls' and 'port' settings:
                    #INVOC_ADDL_ARGS="'' org.hsqldb.server.Server --port 9002 --tls false"
                    # This is an important use case.  If you run more than one Server instance,
                    # you can specify different parameters for each here, even though only one
                    # server.properties file is supported.
                    # Note that you use nested quotes to group arguments and to specify the
                    # empty-string delimiter.
                    
                    # The TLS_* settings have been obsoleted.
                    # To get your server running with TLS, set
                    # system.javax.net.ssl.keyStore=/path/to/your/private.keystore
                    # system.javax.net.ssl.keyStorePassword=secretPassword
                    # server.ssl=true
                    # IN server.properties or webserver.properties, and
                    # MAKE THE FILE OWNER-READ-ONLY!
                    # See the TLS Encryption section of the HyperSQL User Guide, paying attention
                    # to the security warning(s).
                    # If you are running with a private server cert, then you will also need to 
                    # set "truststore" in the your SqlTool config file (location is set by the
                    # AUTH_FILE variable in this file, or it must be at the default location for 
                    # HSQLDB_OWNER).
                    
                    # Any JVM args for the invocation of the JDBC client used to verify DB
                    # instances and to shut them down (SqlToolSprayer).
                    # Server-side System Properties should normally be set with system.*
                    # settings in the server/webserver.properties file.
                    # This example specifies the location of a private trust store for TLS 
                    # encryption.
                    # For multiple args, put quotes around entire value.
                    # If you are starting just a TLS_encrypted Listener, you need to uncomment
                    # this so the init scripts uses TLS to connect.
                    # If using a private keystore, you also need to set "truststore" settings in
                    # the sqltool.rc file.
                    #CLIENT_JVMARGS=-Djavax.net.debug=ssl
                    # This sample value displays useful debugging information about TLS/SSL.
                    
                    # Any JVM args for the server.
                    # For multiple args, put quotes around entire value.
                    #SERVER_JVMARGS=-Xmx512m
                    # You can set the "javax.net.debug" property on the server side here, in the
                    # same exact way as shown for the client side above.
                    

                    Verify that the init script works.

                    Just run

                        /path/to/hsqldb

                    as root to see the arguments you may use. Notice that you can run

                        /path/to/hsqldb status

                    at any time to see whether your HSQLDB Listener is running.

                    Re-run the script with each of the possible arguments to really test it good. If anything doesn't work right, then see the Troubleshooting the Init Script section.

                  5. Tell your OS to run the init script upon system startup and shutdown. If you are using a UNIX variant that has /etc/rc.conf or /etc/rc.conf.local (like BSD variants and Gentoo), you must set "hsqldb_enable" to "YES" in either of those files. (Just run cd /etc; ls rc.conf rc.conf.local to see if you have one of these files). For good UNIXes that use System V style init, you must set up hard links or soft links either manually or with management tools (such as chkconfig or insserv) or Gui's (like run level editors).

                    This paragraph is for Mac OS X users only. If you followed the instructions above, your init script should reside at /Library/StartupItems/hsqldb/hsqldb. Now copy the file StartupParameters.plist from the directory src/org.hsqldb/sample of your HSQLDB distribution to the same directory as the init script. As long as these two files reside in /Library/StartupItems/hsqldb, your init script is active (for portability reasons, it doesn't check for a setting in /etc/hostconfig). You can run it as a Startup Item by running

                        SystemStarter {start|stop|restart} Hsqldb

                    Hsqldb is the service name. See the man page for SystemStarter. To disable the init script, wipe out the /Library/StartupItems/hsqldb directory. Hard to believe, but the Mac people tell me that during system shutdown the Startup Items don't run at all. Therefore, if you don't want your data corrupted, make sure to run "SystemStarter stop Hsqldb" before shutting down your Mac.

                  Follow the examples in the config file to add additional classes to the server JVM's classpath and to execute additional classes in your JVM. (See the SERVER_ADDL_CLASSPATH and INVOC_ADDL_ARGS items).

                  Troubleshooting the Init Script

                  Definitely look at the init script log file, which is at an OS-sependent location, but is usually at /var/log/hsqldb.log.

                  Do a ps to look for processes containing the string hsqldb, and try to connect to the database from any client. If the init script starts up your database successfully, but incorrectly reports that it has not, then your problem is with specification of urlid(s) or SqlTool setup. If your database really did not start, then skip to the next paragraph. Verify that your config file assigns a urlid for each catalog defined in server.properties or webserver.properties, then verify that you can run SqlTool as root to connect to the catalogs with these urlids. (For the latter test, use the --rcfile switch if you are setting AUTH_FILE in the init script config file).

                  If your database really is not starting, then verify that you can su to the database owner account and start the database. The command su USERNAME -c ... won't work on most UNIXes unless the target user has a real login shell. Therefore, if you try to tighten up security by disabling this user's login shell, you will break the init script. If these possibilities don't pan out, then debug the init script or seek help, as described below.

                  To debug the init script, run it in verbose mode to see exactly what is happening (and perhaps manually run the steps that are suspect). To run an init script (in fact, any sh shell script) in verbose mode, use sh with the -x or -v switch, like

                      sh -x path/to/hsqldb start

                  See the man page for sh if you don't know the difference between -v and -x.

                  If you want troubleshooting help, use the HSQLDB lists/forums. Make sure to include the revision number from your hsqldb init script (it's towards the top in the line that starts like "# $Id:"), and the output of a run of

                      sh -x path/to/hsqldb start > /tmp/hstart.log 2>&1

                  Upgrading

                  This section is for users who are using our UNIX init script, and who are upgrading their HyperSQL installation.

                  Most users will not have customized the init script itself, and your customizations will all be encapsulated in the init script configuration file. These users should just overwrite their init script with a new one from the HyperSQL installation, and manually merge config file settings. First, just copy the file /sample/hsqldb.init over top of of your init script (wherever it runs from). Then update your old config file according to the instructions in the new config file template at sample/hsqldb.cfg. You will have to change very few settings. If you are upgrading from a pre-2.0 installation to a post-2.0 installation, you will need to (1) add the setting URLIDS, as described above and in the inline comments, and (2) replace variable HSQLDB_JAR_PATH with SQLTOOL_JAR_PATH which (if you haven't guessed) should be set to the path to your sqltool.jar file.

                  Users who customized their init script will need to merge their customizations into the new init script.


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/databaseobjects-chapt.html0000644000175000017500000045401612007567744023074 0ustar renerene Chapter 4. Schemas and Database Objects

                  Chapter 4. Schemas and Database Objects

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5039 $

                  Copyright 2009-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  Overview

                  The persistent elements of an SQL environment are database objects. The database consists of catalogs plus authorizations.

                  A catalog contains schemas, while schemas contain the objects that contain data or govern the data.

                  Each catalog contains a special schema called INFORMATION_SCHEMA. This schema is read-only and contains some views and other schema objects. The views contain lists of all the database objects that exist within the catalog, plus all authorizations.

                  Each database object has a name. A name is an identifier and is unique within its name-space.

                  Schemas and Schema Objects

                  In HyperSQL, there is only one catalog per database. The name of the catalog is PUBLIC. You can rename the catalog with the ALTER CATALOG RENAME TO statement. All schemas belong the this catalog. The catalog name has no relation to the file name of the database.

                  Each database has also an internal "unique" name which is automatically generated when the database is created. This name is used for event logging. You can also change this unique name.

                  Schema objects are database objects that contain data or govern or perform operations on data. By definition, each schema object belongs to a specific schema.

                  Schema objects can be divided into groups according to their characteristics.

                  • Some kinds of schema objects can exist independently from other schema object. Other kinds can exist only as an element of another schema object. These dependent objects are automatically destroyed when the parent object is dropped.

                  • Separate name-spaces exists for different kinds of schema object. Some name-spaces are shared between two similar kinds of schema objects.

                  • There can be dependencies between various schema objects, as a schema object can include references to other schema objects. These references can cross schema boundaries. Interdependence and cross referencing between schema objects is allowed in some circumstances and disallowed in some others.

                  • Schema objects can be destroyed with the DROP statement. If dependent schema objects exist, a DROP statement will succeed only if it has a CASCADE clause. In this case, dependent objects are also destroyed in most cases. In some cases, such as dropping DOMAIN objects, the dependent objects are not destroyed, but modified to remove the dependency.

                  A new HyperSQL catalog contains an empty schema called PUBLIC. By default, this schema is the initial schema when a new session is started. New schemas and schema objects can be defined and used in the PUBLIC schema, as well as any new schema that is created by the user. You can rename the PUBLIC schema.

                  HyperSQL allows all schemas to be dropped, except the schema that is the default initial schema for new sessions (by default, the PUBLIC schema). For this schema, a DROP SCHEMA ... CASCADE statement will succeed but will result in an empty schema, rather than no schema.

                  The statements for setting the initial schema for users are described in the Statements for Authorization and Access Control chapter.

                  Names and References

                  The name of a schema object is an <identifier>. The name belongs to the name-space for the particular kind of schema object. The name is unique within its name-space. For example, each schema has a separate name-space for TRIGGER objects.

                  In addition to the name-spaces in the schema. Each table has a name-space for the names of its columns.

                  Because a schema object is always in a schema and a schema always in a catalog, it is possible, and sometimes necessary, to qualify the name of the schema object that is being referenced in an SQL statement. This is done by forming an <identifier chain>. In some contexts, only a simple <identifier> can be used and the <identifier chain> is prohibited. While in some other contexts, the use of <identifier chain> is optional. An identifier chain is formed by qualifying each object with the name of the object that owns its name-space. Therefore a column name is prefixed with a table name, a table name is prefixed with a schema name, and a schema name is prefixed with a catalog name. A fully qualified column name is in the form <catalog name>.<schema name>.<table name>.<column name>, likewise, a fully qualified sequence name is in the form <catalog name>.<schema name>.<sequence name>.

                  HyperSQL extends the SQL standard to allow renaming all database objects. The ALTER ... RENAME TO command has slightly different forms depending on the type of object. If an object is referenced in a VIEW or ROUTINE definition, it is not always possible to rename it.

                  Character Sets

                  A CHARACTER SET is the whole or a subset of the UNICODE character set.

                  A character set name can only be a <regular identifier>. There is a separate name-space for character sets.

                  There are several predefined character sets. These character sets belong to INFORMATION_SCHEMA. However, when they are referenced in a statement, no schema prefix is necessary.

                  The following character sets, together with some others, have been specified by the SQL Standard:

                  SQL_TEXT, SQL_IDENTIFIER, SQL_CHARACTER

                  The SQL_CHARACTER consists of ASCII letters, digits and the symbols used in the SQL language. SQL_TEXT and SQL_IDENTIFIER are implementation defined. HyperSQL defines SQL_TEXT as the UNICODE character set and SQL_IDENTIFIER as the UNICODE character set minus the SQL language special characters.

                  SQL_TEXT consists of the full set of Unicode characters. These characters can be used in strings and clobs stored in the database. The character repertoire of HyperSQL is the UTF16 character set, which covers all possible character sets.

                  If a predefined character set is specified for a table column, then any string stored in the column must contain only characters from the specified character set. HyperSQL does not enforce the CHARACTER SET that is specified for a column and may accept any character string supported by SQL_TEXT.

                  Collations

                  A COLLATION is the method used for ordering character strings in ordered sets and to determine equivalence of two character strings.

                  The system default collation is called SQL_TEXT. This collation sorts according to the Unicode code of the characters, UNICODE_SIMPLE.

                  There are several predefined collations. These collations belong to INFORMATION_SCHEMA. However, when they are referenced in a statement, there is no need for a schema prefix.

                  There is a separate name-space for collations..

                  Collations for a large number of languages are supported by HyperSQL.

                  HyperSQL support a default collation for the whole database. Optionally, a different collation can be specified for each table column that is defined as CHAR or VARCHAR. Also, a different collation can be used in an ORDER BY clause.

                  When comparing two strings, all collation pad the shorter string with spaces before comparing the two strings of equal length. You can change the default database collation with one that does not pad the string with spaces before comparison. See SET DATABASE COLLATION statement in the System Management chapter.

                  Distinct Types

                  A distinct, user-defined TYPE is simply based on a built-in type. A distinct TYPE is used in table definitions and in CAST statements.

                  Distinct types share a name-space with domains.

                  Domains

                  A DOMAIN is a user-defined type, simply based on a built-in type. A DOMAIN can have constraints that limit the values that the DOMAIN can represent. A DOMAIN can be used in table definitions and in CAST statements.

                  Distinct types share a name-space with domains.

                  Number Sequences

                  A SEQUENCE object produces INTEGER values in sequence. The SEQUENCE can be referenced in special contexts only within certain SQL statements. For each row where the object is referenced, its value is incremented.

                  There is a separate name-space for SEQUENCE objects.

                  IDENTITY columns are columns of tables which have an internal, unnamed SEQUENCE object. HyperSQL also supports IDENTITY columns that use a named SEQUENCE object.

                  SEQUENCE objects and IDENTITY columns are supported fully according to the latest SQL 2008 Standard syntax.

                  Sequences

                  The SQL:2008 syntax and usage is different from what is supported by many existing database engines. Sequences are created with the CREATE SEQUENCE command and their current value can be modified at any time with ALTER SEQUENCE. The next value for a sequence is retrieved with the NEXT VALUE FOR <name> expression. This expression can be used for inserting and updating table rows.

                  Example 4.1. inserting the next sequence value into a table row

                  INSERT INTO mytable VALUES 2, 'John', NEXT VALUE FOR mysequence;

                  You can also use it in select statements. For example, if you want to number the returned rows of a SELECT in sequential order, you can use:

                  Example 4.2. numbering returned rows of a SELECT in sequential order

                  SELECT NEXT VALUE FOR mysequence, col1, col2 FROM mytable WHERE ...

                  In version 2.0, the semantics of sequences is exactly as defined by SQL:2008. If you use the same sequence twice in the same row in an INSERT statement, you will get the same value as required by the Standard.

                  The correct way to use a sequence value is the NEXT VALUE FOR expression.

                  HyperSQL adds an extension to Standard SQL to return the last value returned by the NEXT VALUE FOR expression in the current session. After a statement containing NEXT VALUE FOR is executed, the value that was returned for NEXT VALUE FOR is available using the CURRENT VALUE FOR expression. In the example below, the NEXT VALUE FOR expression is used to insert a new row. The value that was returned by NEXT VALUE FOR is retrieved with the CURRENT VALUE FOR in the next insert statements to populate two new rows in a different table that has a parent child relationship with the first table. For example if the value 15 was returned by the sequence, the same value 15 is inserted in the three rows.

                  Example 4.3. using the last value of a sequence

                  INSERT INTO mytable VALUES 2, 'John', NEXT VALUE FOR mysequence;
                  INSERT INTO childtable VALUES 4, CURRENT VALUE FOR mysequence;
                  INSERT INTO childtable VALUES 5, CURRENT VALUE FOR mysequence;


                  The INFORMATION_SCHEMA.SEQUENCES table contains the next value that will be returned from any of the defined sequences. The SEQUENCE_NAME column contains the name and the NEXT_VALUE column contains the next value to be returned. Note that this is only for getting information and you should not use it for accessing the next sequence value. When multiple sessions access the same sequence, the value returned from this table by one session could also be used by a different session, causing a sequence value to be used twice unintentionally.

                  Identity Auto-Increment Columns

                  Each table can contain a single auto-increment column, known as the IDENTITY column. An IDENTITY column is a SMALLINT, INTEGER, BIGINT, DECIMAL or NUMERIC column with its value generated by a sequence generator.

                  In HyperSQL 2.0, an IDENTITY column is not by default treated as the primary key for the table (as a result, multi-column primary keys are possible with an IDENTITY column present).

                  The SQL standard syntax is used, which allows the initial value and other options to be specified.

                  <colname> [ INTEGER | BIGINT | DECIMAL | NUMERIC ] GENERATED { BY DEFAULT | ALWAYS} AS IDENTITY [( <options> )]

                  When you add a new row to such a table using an INSERT INTO <tablename> ... statement, you can use the DEFAULT keyword for the IDENTITY column, which results in an auto-generated value for the column.

                  The IDENTITY() function returns the last value inserted into any IDENTITY column by this session. Each session manages this function call separately and is not affected by inserts in other sessions. Use CALL IDENTITY() as an SQL statement to retrieve this value. If you want to use the value for a field in a child table, you can use INSERT INTO <childtable> VALUES (...,IDENTITY(),...);. Both types of call to IDENTITY() must be made before any additional update or insert statements are issued by the session.

                  In triggers and routines, the value returned by the IDENTITY() function is correct for the given context. For example, if a call to a stored procedure inserts a row into a table, causing a new identity value to be generated, a call to IDENTITY() inside the procedure will return the new identity, but a call outside the procedure will return the last identity value that was generated before a call was made to the procedure.

                  The last inserted IDENTITY value can also be retrieved via JDBC, by specifying the Statement or PreparedStatement object to return the generated value.

                  The next IDENTITY value to be used can be changed with the following statement. Note that this statement is not used in normal operation and is only for special purposes, for example resetting the identity generator:

                  ALTER TABLE ALTER COLUMN <column name> RESTART WITH <new value>;

                  For backward compatibility, support has been retained for CREATE TABLE <tablename>(<colname> IDENTITY, ...) as a shortcut which defines the column both as an IDENTITY column and a PRIMARY KEY column. Also, for backward compatibility, it is possible to use NULL as the value of an IDENTITY column in an INSERT statement and the value will be generated automatically. You should avoid these compatibility features as they may be removed from future versions of HyperSQL.

                  In the following example, the identity value for the first INSERT statement is generated automatically using the DEFAULT keyword. The second INSERT statement uses a call to the IDENTITY() function to populate a row in the child table with the generated identity value.

                  CREATE TABLE star (id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
                     firstname VARCHAR(20),
                     lastname VARCHAR(20))
                  CREATE TABLE movies (starid INTEGER, movieid INTEGER PRIMARY KEY, title VARCHAR(40)) 
                  INSERT INTO star (id, firstname, lastname) VALUES (DEFAULT, 'Felix', 'the Cat')
                  INSERT INTO movies (starid, movieid, title) VALUES (IDENTITY(), 10, 'Felix in Hollywood')
                  

                  HyperSQL 2.1 also supports IDENTITY columns that use an external, named SEQUENCE object. This feature is not part of the SQL Standard. The example below uses this type of IDENTITY. Note the use of CURRENT VALUE FOR seq here is multi-session safe. The returned value is the last value used by this session when the row was inserted into the star table. This value is available until the transaction is committed. After commit, NULL is returned by the CURRENT VALUE FOR expression until the SEQUENCE is used again.

                  CREATE SEQUENCE seq
                  CREATE TABLE star (id INTEGER GENERATED BY DEFAULT AS SEQUENCE seq PRIMARY KEY, 
                     firstname VARCHAR(20),
                     lastname VARCHAR(20))
                  CREATE TABLE movies (starid INTEGER, movieid INTEGER PRIMARY KEY, title VARCHAR(40)) 
                  INSERT INTO star (id, firstname, lastname) VALUES (DEFAULT, 'Felix', 'the Cat')
                  INSERT INTO movies (starid, movieid, title) VALUES (CURRENT VALUE FOR seq, 10, 'Felix in Hollywood')
                  

                  Tables

                  In the SQL environment, tables are the most essential components, as they hold all persistent data.

                  If TABLE is considered as metadata (i.e. without its actual data) it is called a relation in relational theory. It has one or more columns, with each column having a distinct name and a data type. A table usually has one or more constraints which limit the values that can potentially be stored in the TABLE. These constraints are discussed in the next section.

                  A single column of the table can be defined as IDENTITY. The values stored in this column are auto-generated and are based on an (unnamed) identity sequence, or optionally, a named SEQUENCE object.

                  Views

                  A VIEW is similar to a TABLE but it does not permanently contain rows of data. A view is defined as a QUERY EXPRESSION, which is often a SELECT statement that references views and tables, but it can also consist of a TABLE CONSTRUCTOR that does not reference any tables or views.

                  A view has many uses:

                  • Hide the structure and column names of tables. The view can represent one or more tables or views as a separate table. This can include aggregate data, such as sums and averages, from other tables.

                  • Allow access to specific rows in a table. For example, allow access to records that were added since a given date, while hiding older records.

                  • Allow access to specific columns. For example allow access to columns that contain non-confidential information. Note that this can also be achieved with the GRANT SELECT statement, using column-level privileges

                  A VIEW that returns the columns of a single ordinary TABLE is updatable if the query expression of the view is an updatable query expression as discussed in the Data Access and Change chapter. Some updatable views are insertable-into because the query expression is insertable-into. In these views, each column of the query expressions must be a column of the underlying table and those columns of the underlying table that are not in the view must have a default clause, or be an IDENTITY or GENERATED column. When rows of an updatable view are updated, or new rows are inserted, or rows are deleted, these changes are reflected in the base table. A VIEW definition may specify that the inserted or updated rows conform to the search condition of the view. This is done with the CHECK OPTION clause.

                  A view that is not updatable according to the above paragraph can be made updatable or insertable-into by adding INSTEAD OF triggers to the view. These triggers contain statements to use the submitted data to modify the contents of the underlying tables of the view separately. For example, a view that represents a SELECT statements that joins two tables can have an INSTEAD OF DELETE trigger with two DELETE statements, one for each table. Views that have an INSTEAD OF trigger are called TRIGGER INSERTABLE, TRIGGER UPDATABLE, etc. according to the triggers that have been defined.

                  Views share a name-space with tables.

                  Constraints

                  A CONSTRAINT is a child schema object and can belong to a DOMAIN or a TABLE. CONSTRAINT objects can be defined without specifying a name. In this case the system generates a name for the new object beginning with "SYS_".

                  In a DOMAIN, CHECK constraints can be defined that limits the value represented by the DOMAIN. These constraints work exactly like a CHECK constraint on a single column of a table as described below.

                  In a TABLE, a constraint takes three basic forms.

                  CHECK

                  A CHECK constraint consists of a <search condition> that must not be false (can be unknown) for each row of the table. The <search condition> can reference all the columns of the current row, and if it contains a <subquery>, other tables and views in the database (excluding its own table).

                  NOT NULL

                  A simple form of check constraint is the NOT NULL constraint, which applies to a single column.

                  UNIQUE

                  A UNIQUE constraint is based on an equality comparison of values of specific columns (taken together) of one row with the same values from each of the other rows. The result of the comparison must never be true (can be false or unknown). If a row of the table has NULL in any of the columns of the constraint, it conforms to the constraint. A unique constraint on multiple columns (c1, c2, c3, ..) means that in no two rows, the sets of values for the columns can be equal unless at lease one of them is NULL. Each single column taken by itself can have repeat values in different rows. The following example satisfies a UNIQUE constraint on the two columns

                  Example 4.4. Column values which satisfy a 2-column UNIQUE constraint

                  1,2
                  2,1
                  2,2
                  NULL,1
                  NULL,1
                  1,NULL
                  NULL,NULL
                  NULL,NULL

                  If the SET DATABASE SQL UNIQUE NULLS FALSE has been set, then if not all the values set of columns are null, the not null values are compared and it is disallowed to insert identical rows that contain at least one not-null value.

                  PRIMARY KEY

                  A PRIMARY KEY constraint is equivalent to a UNIQUE constraint on one or more NOT NULL columns. Only one PRIMARY KEY can be defined in each table.

                  FOREIGN KEY

                  A FOREIGN key constraint is based on an equality comparison between values of specific columns (taken together) of each row with the values of the columns of a UNIQUE constraint on another table or the same table. The result of the comparison must never be false (can be unknown). A special form of FOREIGN KEY constraint, based on its CHECK clause, allows the result to be unknown only if the values for all columns are NULL. A FOREIGN key can be declared only if a UNIQUE constraint exists on the referenced columns.

                  Constraints share a name space with assertions.

                  Assertions

                  An ASSERTION is a top-level schema objects. It consists of a <search condition> that must not be false (can be unknown).

                  Assertions share a name-space with constraints

                  Triggers

                  A TRIGGER is a child schema object that always belongs to a TABLE or a VIEW.

                  Each time a DELETE, UPDATE or INSERT is performed on the table or view, additional actions are taken by the triggers that have been declared on the table or view.

                  Triggers are discussed in detail in Triggers chapter.

                  Routines

                  Routines are user-defined functions or procedures. The names and usage of functions and procedures are different. FUNCTION is a routine that can be referenced in many types of statements. PROCEDURE is a routine that can be referenced only in a CALL statement.

                  There is a separate name-space for routines.

                  Because of the possibility of overloading, each routine can have more than one name. The name of the routine is the same for all overloaded variants, but each variant has a specific name, different from all other routine names and specific names in the schema. The specific name can be specified in the routine definition statement. Otherwise it is assigned by the engine. The specific name is used only for schema manipulation statements, which need to reference a specific variant of the routine. For example, if a routine has two signatures, each signature has its own specific name. This allows the user to drop one of the signatures while keeping the other.

                  Routines are discussed in detail in chapter SQL-Invoked Routines .

                  Indexes

                  Indexes are an implementation-defined extension to the SQL Standard. HyperSQL has a dedicated name-space for indexes in each schema.

                  Statements for Schema Definition and Manipulation

                  Schemas and schema objects can be created, modified and dropped. The SQL Standard defines a range of statements for this purpose. HyperSQL supports many additional statements, especially for changing the properties of existing schema objects.

                  Common Elements and Statements

                  These elements and statements are used for different types of object. They are described here, before the statements that can use them.

                  identifier

                  definition of identifier

                  <identifier> ::= <regular identifier> | <delimited identifier> | <SQL language identifier>

                  <delimited identifier> ::= <double quote> <character sequence> <double quote>

                  <regular identifier> ::= <special character sequence>

                  <SQL language identifier> ::= <special character sequence>

                  A <delimited identifier> is a sequence of characters enclosed with double-quote symbols. All characters are allowed in the character sequence.

                  A <regular identifier> is a special sequence of characters. It consists of letters, digits and the underscore characters. It must begin with a letter. All the letters are translated to their upper-case version.

                  The database setting, SET DATABASE SQL REGULAR NAMES FALSE can be used to relax the rules for regular identifier. With this setting, an underscore character can appear at the start of the regular identifier, and the dollar sign character can be used in the identifier.

                  A <SQL language identifier> is similar to <regular identifier> but the letters can range only from A-Z in the ASCII character set. This type of identifier is used for names of CHARACTER SET objects.

                  If the character sequence of a delimited identifier is the same as an undelimited identifier, it represents the same identifier. For example "JOHN" is the same identifier as JOHN. In a <regular identifier> the case-normal form is considered for comparison. This form consists of the upper-case equivalent of all the letters. When a database object is created with one of the CREATE statements or renamed with the ALTER statement, if the name is enclosed in double quotes, the exact name is used as the case-normal form. But if it is not enclosed in double quotes, the name is converted to uppercase and this uppercase version is stored in the database as the case-normal form.

                  The character sequence length of all identifiers must be between 1 and 128 characters.

                  A reserved word is one that is used by the SQL Standard for special purposes. It is similar to a <regular identifier> but it cannot be used as an identifier for user objects. If a reserved word is enclosed in double quote characters, it becomes a quoted identifier and can be used for database objects.

                  Case sensitivity rules for identifiers can be described simply as follows:

                  • all parts of SQL statements are converted to upper case before processing, except identifiers in double quotes and strings in single quotes

                  • identifiers, both unquoted and double quoted, are then treated as case-sensitive

                  • most database engines follow the same rule, except MySQL, and in some respects, MS SQLServer.

                  CASCADE or RESTRICT

                  drop behavior

                  <drop behavior> ::= CASCADE | RESTRICT

                  The <drop behavior> is a required element of statements that drop a SCHEMA or a schema object. If <drop behavior> is not specified then RESTRICT is implicit. It determines the effect of the statement if there are other objects in the catalog that reference the SCHEMA or the schema object. If RESTRICT is specified, the statement fails if there are referencing objects. If CASCADE is specified, all the referencing objects are modified or dropped with cascading effect. Whether a referencing object is modified or dropped, depends on the kind of schema object that is dropped.

                  IF EXISTS

                  drop condition (HyperSQL)

                  <if exists clause> ::= IF EXISTS

                  This clause is not part of the SQL standard and is a HyperSQL extension to some commands that drop objects (schemas, tables, views, sequences and indexes). If it is specified, then the statement does not return an error if the drop statement is issued on a non-existent object.

                  SPECIFIC

                  specific routine designator

                  <specific routine designator> ::= SPECIFIC <routine type> <specific name>

                  <routine type> ::= ROUTINE | FUNCTION | PROCEDURE

                  This clause is used in statements that need to specify one of the multiple versions of an overloaded routine. The <specific name> is the one specified in the <routine definition> statement.

                  Renaming Objects

                  RENAME

                  rename statement (HyperSQL)

                  <rename statement> ::= ALTER <object type> <name> RENAME TO <new name>

                  <object type> ::= CATALOG | SCHEMA | DOMAIN | TYPE | TABLE | CONSTRAINT | INDEX | ROUTINE | SPECIFIC ROUTINE

                  <column rename statement> ::= ALTER TABLE <table name> ALTER COLUMN <name> RENAME TO <new name>

                  This statement is used to rename an existing object. It is not part of the SQL Standard. The specified <name> is the existing name, which can be qualified with a schema name, while the <new name> is the new name for the object.

                  Commenting Objects

                  COMMENT

                  comment statement (HyperSQL)

                  <comment statement> ::= COMMENT ON { TABLE | COLUMN | ROUTINE } <name> IS <character string literal>

                  Adds a comment to the object metadata, which can later be read from an INFORMATION_SCHEMA view. This command is not part of the SQL Standard. The strange syntax is due to compatibility with other database engines that support the statement. The <name> is the name of a table, view, column or routine. The name of the column consists of dot-separated <table name> . <column name>. The name of the table, view or routine can be a simple name. All names can be qualified with a schema name. If there is already a comment on the object, the new comment will replace it.

                  The comments appear in the results returned by JDBC DatabaseMetaData methods, getTables() and getColumns(). The INFORMATION_SCHEMA.SYSTEM_COMMENTS view contains the comments. You can query this view using the schema, table, and column names to retrieve the comments.

                  Schema Creation

                  CREATE SCHEMA

                  schema definition

                  The CREATE_SCHEMA or DBA role is required in order to create a schema. A schema can be created with or without schema objects. Schema objects can always be added after creating the schema, or existing ones can be dropped. Within the <schema definition> statement, all schema object creation takes place inside the newly created schema. Therefore, if a schema name is specified for the schema objects, the name must match that of the new schema. In addition to statements for creating schema objects, the statement can include instances of <grant statement> and <role definition>. This is a curious aspect of the SQL standard, as these elements do not really belong to schema creation.

                  <schema definition> ::= CREATE SCHEMA <schema name clause> [ <schema character set specification> ] [ <schema element>... ]

                  <schema name clause> ::= <schema name> | AUTHORIZATION <authorization identifier> | <schema name> AUTHORIZATION <authorization identifier>

                  If the name of the schema is specified simply as <schema name>, then the AUTHORIZATION is the current user. Otherwise, the specified <authorization identifier> is used as the AUTHORIZATION for the schema. If <schema name> is omitted, then the name of the schema is the same as the specified <authorization identifier>.

                  <schema element> ::= <table definition> | <view definition> | <domain definition> | <character set definition> | <collation definition> | <transliteration definition> | <assertion definition> | <trigger definition> | <user-defined type definition> | <user-defined cast definition> | <user-defined ordering definition> | <transform definition> | <schema routine> | <sequence generator definition> | <grant statement> | <role definition>

                  An example of the command is given below. Note that a single semicolon appears at the end, there should be no semicolon between the statements:

                      CREATE SCHEMA ACCOUNTS AUTHORIZATION DBA
                          CREATE TABLE AB(A INTEGER, ...)
                          CREATE TABLE CD(C CHAR(10), ...)
                          CREATE VIEW VI AS SELECT ...
                          GRANT SELECT ON AB TO PUBLIC
                          GRANT SELECT ON CD TO JOE;
                  

                  It is not really necessary to create a schema and all its objects as one command. The schema can be created first, and its objects can be created one by one.

                  DROP SCHEMA

                  drop schema statement

                  <drop schema statement> ::= DROP SCHEMA [ IF EXISTS ] <schema name> [ IF EXISTS ] <drop behavior>

                  This command destroys an existing schema. If <drop behavior> is RESTRICT, the schema must be empty, otherwise an error is raised. If CASCADE is specified, then all the objects contained in the schema are destroyed with a CASCADE option.

                  Table Creation

                  CREATE TABLE

                  table definition

                  <table definition> ::= CREATE [ { <table scope> | <table type> } ] TABLE <table name> <table contents source> [ ON COMMIT { PRESERVE | DELETE } ROWS ]

                  <table scope> ::= { GLOBAL | LOCAL } TEMPORARY

                  <table type> :: = MEMORY | CACHED

                  <table contents source> ::= <table element list> | <as subquery clause>

                  <table element list> ::= <left paren> <table element> [ { <comma> <table element> }... ] <right paren>

                  <table element> ::= <column definition> | <table constraint definition> | <like clause>

                  like clause

                  A <like clause> copies all column definitions from another table into the newly created table. Its three options indicate if the <default clause>, <identity column specification> and <generation clause> associated with the column definitions are copied or not. If an option is not specified, it defaults to EXCLUDING. The <generation clause> refers to columns that are generated by an expression but not to identity columns. All NOT NULL constraints are copied with the original columns, other constraints are not. The <like clause> can be used multiple times, allowing the new table to have copies of the column definitions of one or more other tables.

                  CREATE TABLE t (id INTEGER PRIMARY KEY, LIKE atable INCLUDING DEFAULTS EXCLUDING IDENTITY)
                  

                  <like clause> ::= LIKE <table name> [ <like options> ]

                  <like options> ::= <like option>...

                  <like option> ::= <identity option> | <column default option> | <generation option>

                  <identity option> ::= INCLUDING IDENTITY | EXCLUDING IDENTITY

                  <column default option> ::= INCLUDING DEFAULTS | EXCLUDING DEFAULTS

                  <generation option> ::= INCLUDING GENERATED | EXCLUDING GENERATED

                  as subquery clause

                  <as subquery clause> ::= [ <left paren> <column name list> <right paren> ] AS <table subquery> { WITH NO DATA | WITH DATA }

                  An <as subquery clause> used in table definition creates a table based on a <table subquery>. This kind of table definition is similar to a view definition. If WITH DATA is specified, then the new table will contain the rows of data returned by the <table subquery>.

                  CREATE TABLE t (a, b, c) AS (SELECT * FROM atable) WITH DATA
                  

                  column definition

                  A column definition consists of a <column name> and in most cases a <data type> or <domain name> as minimum. The other elements of <column definition> are optional. Each <column name> in a table is unique.

                  <column definition> ::= <column name> [ <data type or domain name> ] [ <default clause> | <identity column specification> | <identity column sequence specification> | <generation clause> ] [ <column constraint definition>... ] [ <collate clause> ]

                  <data type or domain name> ::= <data type> | <domain name>

                  <column constraint definition> ::= [ <constraint name definition> ] <column constraint> [ <constraint characteristics> ]

                  <column constraint> ::= NOT NULL | <unique specification> | <references specification> | <check constraint definition>

                  A <column constraint definition> is a shortcut for a <table constraint definition>. A constraint that is defined in this way is automatically turned into a table constraint. A name is automatically generated for the constraint and assigned to it.

                  If a <collate clause> is specified, then a UNIQUE or PRIMARY KEY constraint or an INDEX on the column will use the specified collation. Otherwise the default collation for the database is used.

                  generated columns

                  The value of a column can be autogenerated in two ways.

                  One way is specific to columns of integral types (INTEGER, BIGINT, etc.) and associates a sequence generator with the column. When a new row is inserted into the table, the value of the column is generated as the next available value in the sequence.

                  The SQL Standard supports the use of unnamed sequences with the IDENTITY keyword. In addition, HyperSQL supports the use of a named SEQUENCE object, which must be in the same schema as the table.

                  <identity column specification> ::= GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ <left paren> <common sequence generator options> <right paren> ]

                  <identity column sequence specification ::= GENERATED BY DEFAULT AS SEQUENCE <sequence name>

                  The <identity column specification> or <identity column sequence specification> can be specified for only a single column of the table.

                  The <identity column specification> is used for columns which represent values based on an unnamed sequence generator. It is possible to insert a row into the table without specifying a value for the column. The value is then generated by the sequence generators according to its rules. An identity column may or may not be the primary key. Example below:

                  CREATE TABLE t (id INTEGER GENERATED ALWAYS AS IDENTITY(START WITH 100), name VARCHAR(20) PRIMARY KEY)
                  

                  The <identity column sequence specification> is used when the column values are based on a named SEQUENCE object (which must already exist). Example below:

                  CREATE TABLE t (id INTEGER GENERATED BY DEFAULT AS SEQUENCE s, name VARCHAR(20) PRIMARY KEY)
                  

                  Inserting rows is done in the same way for a named or unnamed sequence generator. In both cases, if no value is specified to be inserted, or the DEFAULT keyword is used for the column, the value is generated by the sequence generator. If a value is specified, this value is used if the column definition has the BY DEFAULT specification. If the column definition has the ALWAYS specification, a value can be specified but the OVERRIDING SYSTEM VALUES must be specified in the INSERT statement.

                  The other way in which the column value is autogenerated is by using the values of other columns in the same row. This method is often used to create an index on a value that is derived from other column values.

                  <generation clause> ::= GENERATED ALWAYS AS <generation expression>

                  <generation expression> ::= <left paren> <value expression> <right paren>

                  The <generation clause> is used for special columns which represent values based on the values held in other columns in the same row. The <value expression> must reference only other, non-generated, columns of the table in the same row. Any function used in the expression must be deterministic and must not access SQL-data. No <query expression> is allowed. When <generation clause> is used, <data type> must be specified.

                  A generated column can be part of a foreign key or unique constraints or a column of an index. This capability is the main reason for using generated columns. A generated column may contain a formula that computes a value based on the values of other columns. Fast searches of the computed value can be performed when an index is declared on the generated column. Or the computed values can be declared to be unique, using a UNIQUE constraint on the table. The computed column cannot be overridden by user supplied values. When a row is updated and the column values change, the generated columns are computed with the new values.

                  When a row is inserted into a table, or an existing row is updated, no value except DEFAULT can be specified for a generated column. In the example below, data is inserted into the non-generated columns and the generated column will contain 'Felix the Cat' or 'Pink Panther'.

                  CREATE TABLE t (id INTEGER PRIMARY KEY, 
                     firstname VARCHAR(20),
                     lastname VARCHAR(20), 
                     fullname VARCHAR(40) GENERATED ALWAYS AS (firstname || ' ' || lastname)) 
                  INSERT INTO t (id, firstname, lastname) VALUES (1, 'Felix', 'the Cat')
                  INSERT INTO t (id, firstname, lastname, fullname) VALUES (2, 'Pink', 'Panther', DEFAULT)
                  

                  DEFAULT

                  default clause

                  A default clause can be used if GENERATED is not specified. If a column has a <default clause> then it is possible to insert a row into the table without specifying a value for the column.

                  <default clause> ::= DEFAULT <default option>

                  <default option> ::= <literal> | <datetime value function> | USER | CURRENT_USER | CURRENT_ROLE | SESSION_USER | SYSTEM_USER | CURRENT_CATALOG | CURRENT_SCHEMA | CURRENT_PATH | NULL

                  The type of the <default option> must match the type of the column.

                  In PGS (PostgreSQL) compatibility mode, a NEXTVAL function can be used. Also, in MSS compatibility mode, the default value can be enclosed in parentheses.

                  CONSTRAINT

                  constraint name and characteristics

                  <constraint name definition> ::= CONSTRAINT <constraint name>

                  <constraint characteristics> ::= <constraint check time> [ [ NOT ] DEFERRABLE [ <constraint check time> ] ]

                  <constraint check time> ::= INITIALLY DEFERRED | INITIALLY IMMEDIATE

                  Specify the name of a constraint and its characteristics. By default the constraint is NOT DEFERRABLE and INITIALLY IMMEDIATE. This means the constraint is enforced as soon as a data change statement is executed. If INITIALLY DEFERRED is specified, then the constraint is enforced when the session commits. The characteristics must be compatible. The constraint check time can be changed temporarily for an SQL session. HyperSQL does not support deferring constraint enforcement. This feature of the SQL Standard has been criticised because it allows a session to read uncommitted data that violates database integrity constraints but has not yet been checked.

                  CONSTRAINT

                  table constraint definition

                  <table constraint definition> ::= [ <constraint name definition> ] <table constraint> [ <constraint characteristics> ]

                  <table constraint> ::= <unique constraint definition> | <referential constraint definition> | <check constraint definition>

                  Three kinds of constraint can be defined on a table: UNIQUE (including PRIMARY KEY), FOREIGN KEY and CHECK. Each kind has its own rules to limit the values that can be specified for different columns in each row of the table.

                  UNIQUE

                  unique constraint definition

                  <unique constraint definition> ::= <unique specification> <left paren> <unique column list> <right paren> | UNIQUE ( VALUE )

                  <unique specification> ::= UNIQUE | PRIMARY KEY

                  <unique column list> ::= <column name list>

                  A unique constraint is specified on a single column or on multiple columns. On each set of columns taken together, only one UNIQUE constraint can be specified. Each column of a PRIMARY KEY constraint has an implicit NOT NULL constraint.

                  If UNIQUE( VALUE ) is specified, the constraint created on all columns of the table.

                  FOREIGN KEY

                  referential constraint definition

                  <referential constraint definition> ::= FOREIGN KEY <left paren> <referencing columns> <right paren> <references specification>

                  <references specification> ::= REFERENCES <referenced table and columns> [ MATCH <match type> ] [ <referential triggered action> ]

                  <match type> ::= FULL | PARTIAL | SIMPLE

                  <referencing columns> ::= <reference column list>

                  <referenced table and columns> ::= <table name> [ <left paren> <reference column list> <right paren> ]

                  <reference column list> ::= <column name list>

                  <referential triggered action> ::= <update rule> [ <delete rule> ] | <delete rule> [ <update rule> ]

                  <update rule> ::= ON UPDATE <referential action>

                  <delete rule> ::= ON DELETE <referential action>

                  <referential action> ::= CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION

                  A referential constraint allows links to be established between the rows of two tables. The specified list of <referencing columns> corresponds one by one to the columns of the specified list of <referenced columns> in another table (or sometimes in the same table). For each row in the table, a row must exist in the referenced table with equivalent values in the two column lists. There must exist a single unique constraint in the referenced table on all the <referenced columns>.

                  The [ MATCH match type ] clause is optional and has an effect only on multi-column foreign keys and only on rows containing at least a NULL in one of the <referencing columns>. If the clause is not specified, MATCH SIMPLE is the default. If MATCH SIMPLE is specified, then any NULL means the row can exist (without a corresponding row in the referenced table). If MATCH FULL is specified then either all the column values must be NULL or none of them. MATCH PARTIAL allows any NULL but the non NULL values must match those of a row in the referenced table. HyperSQL does not support MATCH PARTIAL.

                  Referential actions are specified with ON UPDATE and ON DELETE clauses. These actions take place when a row in the referenced table (the parent table) has referencing rows in the referencing table and it is deleted or modified with any SQL statement. The default is NO ACTION. This means the SQL statement that causes the DELETE or UPDATE is terminated with an exception. The RESTRICT option is similar and works exactly the same without deferrable constraints (which are not allowed by HyperSQL). The other three options, CASCADE, SET NULL and SET DEFAULT all allow the DELETE or UPDATE statement to complete. With DELETE statements the CASCADE option results in the referencing rows to be deleted. With UPDATE statements, the changes to the values of the referenced columns are copied to the referencing rows. With both DELETE or UPDATE statement, the SET NULL option results in the columns of the referencing rows to be set to NULL. Similarly, the SET DEFAULT option results in the columns of the referencing rows to be set to their default values.

                  CHECK

                  check constraint definition

                  <check constraint definition> ::= CHECK <left paren> <search condition> <right paren>

                  A CHECK constraint can exist for a TABLE or for a DOMAIN. The <search condition> evaluates to an SQL BOOLEAN value for each row of the table. Within the <search condition> all columns of the table row can be referenced. For all rows of the table, the <search condition> evaluates to TRUE or UNKNOWN. When a new row is inserted, or an existing row is updated, the <search condition> is evaluated and if it is FALSE, the insert or update fails.

                  A CHECK constraint for a DOMAIN is similar. In its <search condition>, the term VALUE is used to represents the value to which the DOMAIN applies.

                  CREATE TABLE t (a VARCHAR(20) CHECK (a IS NOT NULL AND CHARACTER_LENGTH(a) > 2))
                  

                  The search condition of a CHECK constraint cannot contain any function that is not deterministic. A check constraint is a data integrity constraint, therefore it must hold with respect to the rest of the data in the database. It cannot use values that are temporal or ephemeral. For example CURRENT_USER is a function that returns different values depending on who is using the database, or CURRENT_DATE changes day-to-day. Some temporal expressions are retrospectively deterministic and are allowed in check constraints. For example, (CHECK VALUE < CURRENT_DATE) is valid, because CURRENT_DATE will not move backwards in time, but (CHECK VALUE > CURRENT_DATE) is not acceptable.

                  If you want to enforce the condition that a date value that is inserted into the database belongs to the future (at the time of insertion), or any similar constraint, then use a TRIGGER with the desired condition.

                  DROP TABLE

                  drop table statement

                  <drop table statement> ::= DROP TABLE [ IF EXISTS ] <table name> [ IF EXISTS ] <drop behavior>

                  Destroy a table. The default drop behaviour is RESTRICT and will cause the statement to fail if there is any view, routine or foreign key constraint that references the table. If <drop behavior> is CASCADE, it causes all schema objects that reference the table to drop. Referencing views are dropped. In the case of foreign key constraints that reference the table, the constraint is dropped, rather than the TABLE or DOMAIN that contains it.

                  Table Manipulation

                  Table manipulation statements change the attributes of tables or modify the objects such as columns and constraints.

                  SET TABLE CLUSTERED

                  set table clustered property

                  <set table clustered statement> ::= SET TABLE <table name> CLUSTERED ON <left paren> <column name list> <right paren>

                  Set the row clustering property of a table. The <column name list> is a list of column names that must correspond to the columns of an existing PRIMARY KEY, UNIQUE or FOREIGN KEY index, or to the columns of a user defined index. This statement is only valid for CACHED or TEXT tables.

                  Tables rows are stored in the database files as they are created, sometimes at the end of the file, sometimes in the middle of the file. After a CHECKPOINT DEFRAG or SHUTDOWN COMPACT, the rows are reordered according to the primary key of the table, or if there is no primary key, in no particular order.

                  When several consecutive rows of a table are retrieved during query execution it is more efficient to retrieve rows that are stored adjacent to one another. After executing this command, nothing changes until a CHECKPOINT DEFRAG or SHUTDOWN COMPACT or SHUTDOWN SCRIPT is performed. After these operations, the rows are stored in the specified clustered order. The property is stored in the database and applies to all future reordering of rows. Note that if extensive inserts or updates are performed on the tables, the rows will get out of order until the next reordering.

                  SET TABLE TYPE

                  set table type

                  <set table type statement> ::= SET TABLE <table name> TYPE { MEMORY | CACHED }

                  Changes the storage type of an existing table between CACHED and MEMORY types.

                  Only a user with the DBA role can execute this statement.

                  SET TABLE writeability

                  set table write property

                  <set table read only statement> ::= SET TABLE <table name> { READ ONLY | READ WRITE }

                  Set the writeability property of a table. Tables are writeable by default. This statement can be used to change the property between READ ONLY and READ WRITE. This is a feature of HyperSQL.

                  SET TABLE SOURCE

                  set table source statement

                  <set table source statement> ::= SET TABLE <table name> SOURCE <file and options> [DESC]

                  <file and options>::= <doublequote> <file path> [<semicolon> <property>...] <doublequote>

                  Set the text source for a text table. This statement cannot be used for tables that are not defined as TEXT TABLE.

                  Supported Properties

                  quoted = { true | false }

                  default is true. If false, treats double quotes as normal characters

                  all_quoted = { true | false }

                  default is false. If true, adds double quotes around all fields.

                  encoding = <encoding name>

                  character encoding for text and character fields, for example, encoding=UTF-8

                  ignore_first = { true | false }

                  default is false. If true ignores the first line of the file

                  cache_scale= <numeric value>

                  exponent to calculate rows of the text file in cache. Default is 8, equivalent to nearly 800 rows

                  cache_size_scale = <numeric value>r

                  exponent to calculate average size of each row in cache. Default is 8, equivalent to 256 bytes per row.

                  fs = <unquoted character>

                  field separator

                  vs = <unquoted character>

                  varchar separator

                  Special indicators for HyperSQL Text Table separators

                  \semi

                  semicolon

                  \quote

                  quote

                  \space

                  space character

                  \apos

                  apostrophe

                  \n

                  newline - Used as an end anchor (like $ in regular expressions)

                  \r

                  carriage return

                  \t

                  tab

                  \\

                  backslash

                  \u####

                  a Unicode character specified in hexadecimal

                  In the example below, the text source of the table is set to "myfile", the field separator to the pipe symbol, and the long varchar separator to the tilde symbol.

                      SET TABLE mytable SOURCE 'myfile;fs=|;vs=.;lvs=~'

                  Only a user with the DBA role can execute this statement.

                  SET TABLE SOURCE HEADER

                  set table source header statement

                  <set table source header statement> ::= SET TABLE <table name> SOURCE HEADER <header string>

                  Set the header for the text source for a text table. If this command is used, the <header string> is used as the first line of the source file of the text table. This line is not part of the table data. Only a user with the DBA role can execute this statement.

                  SET TABLE SOURCE on-off

                  set table source on-off statement

                  <set table source on-off statement> ::= SET TABLE <table name> SOURCE { ON | OFF }

                  Attach or detach a text table from its text source. This command does not change the properties or the name of the file that is the source of a text table. When OFF is specified, the command detaches the table from its source and closes the file for the source. In this state, it is not possible to read or write to the table. This allows the user to replace the file with a different file, or delete it. When ON is specified, the source file is read. Only a user with the DBA role can execute this statement

                  ALTER TABLE

                  alter table statement

                  <alter table statement> ::= ALTER TABLE <table name> <alter table action>

                  <alter table action> ::= <add column definition> | <alter column definition> | <drop column definition> | <add table constraint definition> | <drop table constraint definition>

                  Change the definition of a table. Specific types of this statement are covered below.

                  ADD COLUMN

                  add column definition

                  <add column definition> ::= ADD [ COLUMN ] <column definition> [ BEFORE <other column name> ]

                  Add a column to an existing table. The <column definition> is specified the same way as it is used in <table definition>. HyperSQL allows the use of [ BEFORE <other column name> ] to specify at which position the new column is added to the table.

                  If the table contains rows, the new column must have a <default clause> or use one of the forms of GENERATED. The column values for each row is then filled with the result of the <default clause> or the generated value.

                  DROP COLUMN

                  drop column definition

                  <drop column definition> ::= DROP [ COLUMN ] <column name> <drop behavior>

                  Destroy a column of a base table. The <drop behavior> is either RESTRICT or CASCADE. If the column is referenced in a table constraint that references other columns as well as this column, or if the column is referenced in a VIEW, or the column is referenced in a TRIGGER, then the statement will fail if RESTRICT is specified. If CASCADE is specified, then any CONSTRAINT, VIEW or TRIGGER object that references the column is dropped with a cascading effect.

                  ADD CONSTRAINT

                  add table constraint definition

                  <add table constraint definition> ::= ADD <table constraint definition>

                  Add a constraint to a table. The existing rows of the table must conform to the added constraint, otherwise the statement will not succeed.

                  DROP CONSTRAINT

                  drop table constraint definition

                  <drop table constraint definition> ::= DROP CONSTRAINT <constraint name> <drop behavior>

                  Destroy a constraint on a table. The <drop behavior> has an effect only on UNIQUE and PRIMARY KEY constraints. If such a constraint is referenced by a FOREIGN KEY constraint, the FOREIGN KEY constraint will be dropped if CASCADE is specified. If the columns of such a constraint are used in a GROUP BY clause in the query expression of a VIEW or another kind of schema object, and a functional dependency relationship exists between these columns and the other columns in that query expression, then the VIEW or other schema object will be dropped when CASCADE is specified.

                  ALTER COLUMN

                  alter column definition

                  <alter column definition> ::= ALTER [ COLUMN ] <column name> <alter column action>

                  <alter column action> ::= <set column default clause> | <drop column default clause> | <alter column data type clause> | <alter identity column specification> | <alter column nullability> | <alter column name> | <add column identity specification> | <drop column identity specification>

                  Change a column and its definition. Specific types of this statement are covered below. See also the RENAME statement above.

                  SET DEFAULT

                  set column default clause

                  <set column default clause> ::= SET <default clause>

                  Set the default clause for a column. This can be used if the column is not defined as GENERATED.

                  DROP DEFAULT

                  drop column default clause

                  <drop column default clause> ::= DROP DEFAULT

                  Drop the default clause from a column.

                  SET DATA TYPE

                  alter column data type clause

                  <alter column data type clause> ::= SET DATA TYPE <data type>

                  Change the declared type of a column. The (proposed) SQL Standard allows only changes to type properties such as maximum length, precision, or scale, and only changes that cause the property to enlarge. HyperSQL allows changing the type if all the existing values can be cast into the new type without string truncation or loss of significant digits.

                  alter column add identity generator

                  alter column add identity generator

                  <add column identity generator> ::= <identity column specification>

                  Adds an identity specification to the column. The type of the column must be an integral type and the existing values must not include nulls. This option is specific to HyperSQL

                    ALTER TABLE mytable ALTER COLUMN id GENERATED ALWAYS AS IDENTITY (START WITH 20000)

                  alter column identity generator

                  alter identity column specification

                  <alter identity column specification> ::= <alter identity column option>...

                  <alter identity column option> ::= <alter sequence generator restart option> | SET <basic sequence generator option>

                  Change the properties of an identity column. This command is similar to the commands used for changing the properties of named SEQUENCE objects discussed earlier and can use the same options.

                    ALTER TABLE mytable ALTER COLUMN id RESTART WITH 1000
                    ALTER TABLE mytable ALTER COLUMN id SET INCREMENT BY 5
                  

                  DROP GENERATED

                  drop column identity generator

                  <drop column identity specification> ::= DROP GENERATED

                  Removes the identity generator from a column. After executing this statement, the column values are no longer generated automatically. This option is specific to HyperSQL

                    ALTER TABLE mytable ALTER COLUMN id DROP GENERATED
                  

                  SET [ NOT ] NULL

                  alter column nullability

                  <alter column nullability> ::= SET [ NOT ] NULL

                  Adds or removes a NOT NULL constraint from a column. This option is specific to HyperSQL

                  View Creation and Manipulation

                  CREATE VIEW

                  view definition

                  <view definition> ::= CREATE VIEW <table name> <view specification> AS <query expression> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

                  <view specification> ::= [ <left paren> <view column list> <right paren> ]

                  <view column list> ::= <column name list>

                  Define a view. The <query expression> is a SELECT or similar statement. The <view column list> is the list of unique names for the columns of the view. The number of columns in the <view column list> must match the number of columns returned by the <query expression>. If <view column list> is not specified, then the columns of the <query expression> should have unique names and are used as the names of the view column.

                  Some views are updatable. As covered elsewhere, an updatable view is based on a single table or updatable view. For updatable views, the optional CHECK OPTION clause can be specified. If this option is specified, then if a row of the view is updated or a new row is inserted into the view, then it should contain such values that the row would be included in the view after the change. If WITH CASCADED CHECK OPTION is specified, then if the <query expression> of the view references another view, then the search condition of the underlying view should also be satisfied by the update or insert operation.

                  DROP VIEW

                  drop view statement

                  <drop view statement> ::= DROP VIEW [ IF EXISTS ] <table name> [ IF EXISTS ] <drop behavior>

                  Destroy a view. The <drop behavior> is similar to dropping a table.

                  ALTER VIEW

                  alter view statement

                  <alter view statement> ::= ALTER VIEW <table name> <view specification> AS <query expression> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

                  Alter a view. The statement is otherwise identical to CREATE VIEW. The new definition replaces the old. If there are database objects such as routines or views that reference the view, then these objects are recompiled with the new view definition. If the new definition is not compatible, the statement fails.

                  Domain Creation and Manipulation

                  CREATE DOMAIN

                  domain definition

                  <domain definition> ::= CREATE DOMAIN <domain name> [ AS ] <predefined type> [ <default clause> ] [ <domain constraint>... ] [ <collate clause> ]

                  <domain constraint> ::= [ <constraint name definition> ] <check constraint definition> [ <constraint characteristics> ]

                  Define a domain. Although a DOMAIN is not strictly a type in the SQL Standard, it can be informally considered as a type. A DOMAIN is based on a <predefined type>, which is a base type defined by the Standard. It can have a <default clause>, similar to a column default clause. It can also have one or more CHECK constraints which limit the values that can be assigned to a column or variable that has the DOMAIN as its type.

                  CREATE DOMAIN valid_string AS VARCHAR(20) DEFAULT 'NO VALUE' CHECK (value IS NOT NULL AND CHARACTER_LENGTH(value) > 2) 
                  

                  ALTER DOMAIN

                  alter domain statement

                  <alter domain statement> ::= ALTER DOMAIN <domain name> <alter domain action>

                  <alter domain action> ::= <set domain default clause> | <drop domain default clause> | <add domain constraint definition> | <drop domain constraint definition>

                  Change a domain and its definition.

                  SET DEFAULT

                  set domain default clause

                  <set domain default clause> ::= SET <default clause>

                  Set the default value in a domain.

                  DROP DEFAULT

                  drop domain default clause

                  <drop domain default clause> ::= DROP DEFAULT

                  Remove the default clause of a domain.

                  ADD CONSTRAINT

                  add domain constraint definition

                  <add domain constraint definition> ::= ADD <domain constraint>

                  Add a constraint to a domain.

                  DROP CONSTRAINT

                  drop domain constraint definition

                  <drop domain constraint definition> ::= DROP CONSTRAINT <constraint name>

                  Destroy a constraint on a domain. If the <drop behavior> is CASCADE, and the constraint is a UNIQUE constraint which is referenced by a FOREIGN KEY constraint on another table, then the FOREIGN KEY constraint is also dropped.

                  DROP DOMAIN

                  drop domain statement

                  <drop domain statement> ::= DROP DOMAIN <domain name> <drop behavior>

                  Destroy a domain. If <drop behavior> is CASCADE, it works differently from most other objects. If a table features a column of the specified DOMAIN, the column survives and inherits the DEFAULT CLAUSE, and the CHECK CONSTRAINT of the DOMAIN.

                  Trigger Creation

                  CREATE TRIGGER

                  trigger definition

                  <trigger definition> ::= CREATE TRIGGER <trigger name> <trigger action time> <trigger event> ON <table name> [ REFERENCING <transition table or variable list> ] <triggered action>

                  <trigger action time> ::= BEFORE | AFTER | INSTEAD OF

                  <trigger event> ::= INSERT | DELETE | UPDATE [ OF <trigger column list> ]

                  <trigger column list> ::= <column name list>

                  <triggered action> ::= [ FOR EACH { ROW | STATEMENT } ] [ <triggered when clause> ] <triggered SQL statement>

                  <triggered when clause> ::= WHEN <left paren> <search condition> <right paren>

                  <triggered SQL statement> ::= <SQL procedure statement> | BEGIN ATOMIC { <SQL procedure statement> <semicolon> }... END | [QUEUE <integer literal>] [NOWAIT] CALL <HSQLDB trigger class FQN>

                  <transition table or variable list> ::= <transition table or variable>...

                  <transition table or variable> ::= OLD [ ROW ] [ AS ] <old transition variable name> | NEW [ ROW ] [ AS ] <new transition variable name> | OLD TABLE [ AS ] <old transition table name> | NEW TABLE [ AS ] <new transition table name>

                  <old transition table name> ::= <transition table name>

                  <new transition table name> ::= <transition table name>

                  <transition table name> ::= <identifier>

                  <old transition variable name> ::= <correlation name>

                  <new transition variable name> ::= <correlation name>

                  Trigger definition is a relatively complex statement. The combination of <trigger action time> and <trigger event> determines the type of the trigger. Examples include BEFORE DELETE, AFTER UPDATE, INSTEAD OF INSERT. If the optional [ OF <trigger column list> ] is specified for an UPDATE trigger, then the trigger is activated only if one of the columns that is in the <trigger column list> is specified in the UPDATE statement that activates the trigger.

                  If a trigger is FOR EACH ROW, which is the default option, then the trigger is activated for each row of the table that is affected by the execution of an SQL statement. Otherwise, it is activated once only per statement execution. In the first case, there is a before and after state for each row. For UPDATE triggers, both before and after states exist, representing the row before the update, and after the update. For DELETE, triggers, there is only a before state. For INSERT triggers, there is only an after state. If a trigger is FOR EACH STATEMENT, then a transient table is created containing all the rows for the before state and another transient table is created for the after state.

                  The [ REFERENCING <transition table or variable> ] is used to give a name to the before and after data row or table. This name can be referenced in the <SQL procedure statement> to access the data.

                  The optional <triggered when clause> is a search condition, similar to the search condition of a DELETE or UPDATE statement. If the search condition is not TRUE for a row, then the trigger is not activated for that row.

                  The <SQL procedure statement> is limited to INSERT, DELETE, UPDATE and MERGE statements.

                  The <HSQLDB trigger class FQN> is a delimited identifier that contains the fully qualified name of a Java class that implements the org.hsqldb.Trigger interface.

                  Early releases of HyperSQL version 2.0 do not allow the use of OLD TABLE or NEW TABLE in statement level trigger definitions.

                  DROP TRIGGER

                  drop trigger statement

                  <drop trigger statement> ::= DROP TRIGGER <trigger name>

                  Destroy a trigger.

                  Routine Creation

                  schema routine

                  SQL-invoked routine

                  <SQL-invoked routine> ::= <schema routine>

                  <schema routine> ::= <schema procedure> | <schema function>

                  <schema procedure> ::= CREATE <SQL-invoked procedure>

                  <schema function> ::= CREATE <SQL-invoked function>

                  <SQL-invoked procedure> ::= PROCEDURE <schema qualified routine name> <SQL parameter declaration list> <routine characteristics> <routine body>

                  <SQL-invoked function> ::= { <function specification> | <method specification designator> } <routine body>

                  <SQL parameter declaration list> ::= <left paren> [ <SQL parameter declaration> [ { <comma> <SQL parameter declaration> }... ] ] <right paren>

                  <SQL parameter declaration> ::= [ <parameter mode> ] [ <SQL parameter name> ] <parameter type> [ RESULT ]

                  <parameter mode> ::= IN | OUT | INOUT

                  <parameter type> ::= <data type>

                  <function specification> ::= FUNCTION <schema qualified routine name> <SQL parameter declaration list> <returns clause> <routine characteristics> [ <dispatch clause> ]

                  <method specification designator> ::= SPECIFIC METHOD <specific method name> | [ INSTANCE | STATIC | CONSTRUCTOR ] METHOD <method name> <SQL parameter declaration list> [ <returns clause> ] FOR <schema-resolved user-defined type name>

                  <routine characteristics> ::= [ <routine characteristic>... ]

                  <routine characteristic> ::= <language clause> | <parameter style clause> | SPECIFIC <specific name> | <deterministic characteristic> | <SQL-data access indication> | <null-call clause> | <returned result sets characteristic> | <savepoint level indication>

                  <savepoint level indication> ::= NEW SAVEPOINT LEVEL | OLD SAVEPOINT LEVEL

                  <returned result sets characteristic> ::= DYNAMIC RESULT SETS <maximum returned result sets>

                  <parameter style clause> ::= PARAMETER STYLE <parameter style>

                  <dispatch clause> ::= STATIC DISPATCH

                  <returns clause> ::= RETURNS <returns type>

                  <returns type> ::= <returns data type> [ <result cast> ] | <returns table type>

                  <returns table type> ::= TABLE <table function column list>

                  <table function column list> ::= <left paren> <table function column list element> [ { <comma> <table function column list element> }... ] <right paren>

                  <table function column list element> ::= <column name> <data type>

                  <result cast> ::= CAST FROM <result cast from type>

                  <result cast from type> ::= <data type> [ <locator indication> ]

                  <returns data type> ::= <data type> [ <locator indication> ]

                  <routine body> ::= <SQL routine spec> | <external body reference>

                  <SQL routine spec> ::= [ <rights clause> ] <SQL routine body>

                  <rights clause> ::= SQL SECURITY INVOKER | SQL SECURITY DEFINER

                  <SQL routine body> ::= <SQL procedure statement>

                  <external body reference> ::= EXTERNAL [ NAME <external routine name> ] [ <parameter style clause> ]

                  <parameter style> ::= SQL | GENERAL

                  <deterministic characteristic> ::= DETERMINISTIC | NOT DETERMINISTIC

                  <SQL-data access indication> ::= NO SQL | CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA

                  <null-call clause> ::= RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT

                  <maximum returned result sets> ::= <unsigned integer>

                  Define an SQL-invoked routine. A few of the options are not used by HyperSQL and have default behaviours. See the SQL-Invoked Routines chapter for more details of various options and examples.

                  ALTER routine

                  alter routine statement

                  <alter routine statement> ::= ALTER <specific routine designator> [ <alter routine characteristics> ] [ RESTRICT ] <routine body>

                  <alter routine characteristics> ::= <alter routine characteristic>...

                  <alter routine characteristic> ::= <language clause> | <parameter style clause> | <SQL-data access indication> | <null-call clause> | <returned result sets characteristic>

                  <alter routine body> ::= <SQL routine body>

                  Alter the characteristic and the body of an SQL-invoked routine. If RESTRICT is specified and the routine is already used in a a different routine or view definition, an exception is raised. Altering the routine changes the implementation without changing the parameters. Defining recursive SQL/PSM SQL functions is only possible by altering a non-recursive routine body. An example is given in the SQL-Invoked Routines chapter.

                  An example is given below for a function defined as a Java method, then redefined as an SQL function.

                  create function zero_pad(x bigint, digits int, maxsize int)
                   returns char varying(100)
                   specific zero_pad_01
                   no sql deterministic
                   language java parameter style java
                   external name 'CLASSPATH:org.hsqldb.lib.StringUtil.toZeroPaddedString';
                  
                  alter specific routine zero_pad_01
                   language sql
                   begin atomic
                   declare str varchar(128);
                   set str = cast(x as varchar(128));
                   set str = substring('0000000000000' from 1 for digits - char_length(str)) + str;
                   return str;
                   end
                  

                  DROP

                  drop routine statement

                  <drop routine statement> ::= DROP <specific routine designator> <drop behavior>

                  Destroy an SQL-invoked routine.

                  Sequence Creation

                  CREATE SEQUENCE

                  sequence generator definition

                  <sequence generator definition> ::= CREATE SEQUENCE <sequence generator name> [ <sequence generator options> ]

                  <sequence generator options> ::= <sequence generator option> ...

                  <sequence generator option> ::= <sequence generator data type option> | <common sequence generator options>

                  <common sequence generator options> ::= <common sequence generator option> ...

                  <common sequence generator option> ::= <sequence generator start with option> | <basic sequence generator option>

                  <basic sequence generator option> ::= <sequence generator increment by option> | <sequence generator maxvalue option> | <sequence generator minvalue option> | <sequence generator cycle option>

                  <sequence generator data type option> ::= AS <data type>

                  <sequence generator start with option> ::= START WITH <sequence generator start value>

                  <sequence generator start value> ::= <signed numeric literal>

                  <sequence generator increment by option> ::= INCREMENT BY <sequence generator increment>

                  <sequence generator increment> ::= <signed numeric literal>

                  <sequence generator maxvalue option> ::= MAXVALUE <sequence generator max value> | NO MAXVALUE

                  <sequence generator max value> ::= <signed numeric literal>

                  <sequence generator minvalue option> ::= MINVALUE <sequence generator min value> | NO MINVALUE

                  <sequence generator min value> ::= <signed numeric literal>

                  <sequence generator cycle option> ::= CYCLE | NO CYCLE

                  Define a named sequence generator. A SEQUENCE object generates a sequence of integers according to the specified rules. The simple definition without the options defines a sequence of numbers in INTEGER type starting at 1 and incrementing by 1. By default the CYCLE property is set and the minimum and maximum limits are the minimum and maximum limits of the type of returned values. There are self-explanatory options for changing various properties of the sequence. The MAXVALUE and MINVALUE specify the upper and lower limits. If CYCLE is specified, after the sequence returns the highest or lowest value in range, the next value will respectively be the lowest or highest value in range. If NO CYCLE is specified, the use of the sequence generator results in an error once the limit has been reached.

                  The integer types: SMALLINT, INTEGER, BIGINT, DECIMAL and NUMERIC can be used as the type of the sequence. DECIMAL and NUMERIC types must have a scale of 0 and a precision not exceeding 18.

                  ALTER SEQUENCE

                  alter sequence generator statement

                  <alter sequence generator statement> ::= ALTER SEQUENCE <sequence generator name> <alter sequence generator options>

                  <alter sequence generator options> ::= <alter sequence generator option>...

                  <alter sequence generator option> ::= <alter sequence generator restart option> | <basic sequence generator option>

                  <alter sequence generator restart option> ::= RESTART [ WITH <sequence generator restart value> ]

                  <sequence generator restart value> ::= <signed numeric literal>

                  Change the definition of a named sequence generator. The same options that are used in the definition of the SEQUENCE can be used to alter it. The exception is the option for the start value which is RESTART WITH for the ALTER SEQUENCE statement.

                  If RESTART is used by itself (without a value), then the current value of the sequence is reset to the start value. Otherwise, the current value is reset to the given restart value.

                  DROP SEQUENCE

                  drop sequence generator statement

                  <drop sequence generator statement> ::= DROP SEQUENCE [ IF EXISTS ] <sequence generator name> [ IF EXISTS ] <drop behavior>

                  Destroy an external sequence generator. If the <drop behavior> is CASCADE, then all objects that reference the sequence are dropped. These objects can be VIEW, ROUTINE or TRIGGER objects.

                  SQL Procedure Statement

                  SQL procedure statement

                  SQL procedure statement

                  The definition of CREATE TRIGGER and CREATE PROCEDURE statements refers to <SQL procedure statement>. The definition of this element is given below. However, only a subset of these statements are allowed in trigger or routine definition.

                  <SQL procedure statement> ::= <SQL executable statement>

                  <SQL executable statement> ::= <SQL schema statement> | <SQL data statement> | <SQL control statement> | <SQL transaction statement> | <SQL connection statement> | <SQL session statement> | <SQL diagnostics statement> | <SQL dynamic statement>

                  <SQL schema statement> ::= <SQL schema definition statement> | <SQL schema manipulation statement>

                  <SQL schema definition statement> ::= <schema definition> | <table definition> | <view definition> | <SQL-invoked routine> | <grant statement> | <role definition> | <domain definition> | <character set definition> | <collation definition> | <transliteration definition> | <assertion definition> | <trigger definition> | <user-defined type definition> | <user-defined cast definition> | <user-defined ordering definition> | <transform definition> | <sequence generator definition>

                  <SQL schema manipulation statement> ::= <drop schema statement> | <alter table statement> | <drop table statement> | <drop view statement> | <alter routine statement> | <drop routine statement> | <drop user-defined cast statement> | <revoke statement> | <drop role statement> | <alter domain statement> | <drop domain statement> | <drop character set statement> | <drop collation statement> | <drop transliteration statement> | <drop assertion statement> | <drop trigger statement> | <alter type statement> | <drop data type statement> | <alter sequence generator statement> | <drop sequence generator statement>

                  Other Schema Object Creation

                  CREATE INDEX

                  create index statement

                  <create index statement> ::= CREATE INDEX <index name> ON <table name> <left paren> {<column name> [ASC | DESC]}, ... <right paren>

                  Creates an index on a group of columns of a table. The optional [ASC | DESC] specifies if the column is indexed in the ascending or descending order, but has no effect on how the index is created (it is allowed for compatibility with other database engines). HyperSQL can use all indexes in ascending or descending order as needed. Indexes should not duplicate the columns of PRIMARY KEY, UNIQUE or FOREIGN key constraints as each of these constraints creates an index automatically.

                  DROP INDEX

                  drop index statement

                  <drop index statement> ::= DROP INDEX [ IF EXISTS ] <index name> [ IF EXISTS ]

                  Destroy an index.

                  ALTER INDEX

                  change the columns of an index

                  <alter index statement> ::= ALTER INDEX <index name> <left paren> {<column name>} , ... <right paren>

                  Redefine an index with a new column list. This statement is more efficient than dropping an existing index and creating a new one.

                  CREATE TYPE

                  user-defined type definition

                  <user-defined type definition> ::= CREATE TYPE <user-defined type body>

                  <user-defined type body> ::= <schema-resolved user-defined type name> [ AS <representation> ]

                  <representation> ::= <predefined type>

                  Define a user-defined type. Currently only simple distinct types can be defined without further attributes.

                  CREATE CAST

                  user-defined cast definition

                  <user-defined cast definition> ::= CREATE CAST <left paren> <source data type> AS <target data type> <right paren> WITH <cast function> [ AS ASSIGNMENT ]

                  <cast function> ::= <specific routine designator>

                  <source data type> ::= <data type>

                  <target data type> ::= <data type>

                  Define a user-defined cast. This feature may be supported in a future versions of HyperSQL.

                  DROP CAST

                  drop user-defined cast statement

                  <drop user-defined cast statement> ::= DROP CAST <left paren> <source data type> AS <target data type> <right paren> <drop behavior>

                  Destroy a user-defined cast. This feature may be supported in a future versions of HyperSQL.

                  CREATE CHARACTER SET

                  character set definition

                  <character set definition> ::= CREATE CHARACTER SET <character set name> [ AS ] <character set source> [ <collate clause> ]

                  <character set source> ::= GET <character set specification>

                  Define a character set. A new CHARACTER SET is based on an existing CHARACTER SET. The optional <collate clause> specifies the collation to be used, otherwise the collation is inherited from the default collation for the source CHARACTER SET. Currently this statement has no effect, as the character set used by HSQLDB is Unicode and there is no need for subset character sets.

                  DROP CHARACTER SET

                  drop character set statement

                  <drop character set statement> ::= DROP CHARACTER SET <character set name>

                  Destroy a character set. If the character set name is referenced in any database object, the command fails. Note that CASCADE or RESTRICT cannot be specified for this command.

                  CREATE COLLATION

                  collation definition

                  <collation definition> ::= CREATE COLLATION <collation name> FOR <character set specification> FROM <existing collation name> [ <pad characteristic> ]

                  <existing collation name> ::= <collation name>

                  <pad characteristic> ::= NO PAD | PAD SPACE

                  Define a collation. A new collation is based on an existing COLLATION and applies to an existing CHARACTER SET. The <character set specification> is always SQL_TEXT. The <existing collation name> is either SQL_TEXT or one of the language collations supported by HSQLDB. The <pad characteristic> specifies whether strings are padded with spaces for comparison.

                  This statement is typically used when a collation is required that does not pad spaces before comparing two strings. For example, CREATE COLLATION FRENCH_NOPAD FOR SQL_TEXT FROM SQL_TEXT NO PAD, results in a French collation without padding. This collation can be used for sorting or for individual columns of tables.

                  DROP COLLATION

                  drop collation statement

                  <drop collation statement> ::= DROP COLLATION <collation name> <drop behavior>

                  Destroy a collation. If the <drop behavior> is CASCADE, then all references to the collation revert to the default collation that would be in force if the dropped collation was not specified.

                  CREATE TRANSLATION

                  transliteration definition

                  <transliteration definition> ::= CREATE TRANSLATION <transliteration name> FOR <source character set specification> TO <target character set specification> FROM <transliteration source>

                  <source character set specification> ::= <character set specification>

                  <target character set specification> ::= <character set specification>

                  <transliteration source> ::= <existing transliteration name> | <transliteration routine>

                  <existing transliteration name> ::= <transliteration name>

                  <transliteration routine> ::= <specific routine designator>

                  Define a character transliteration. This feature may be supported in a future versions of HyperSQL.

                  DROP TRANSLATION

                  drop transliteration statement

                  <drop transliteration statement> ::= DROP TRANSLATION <transliteration name>

                  Destroy a character transliteration. This feature may be supported in a future versions of HyperSQL.

                  CREATE ASSERTION

                  assertion definition

                  <assertion definition> ::= CREATE ASSERTION <constraint name> CHECK <left paren> <search condition> <right paren> [ <constraint characteristics> ]

                  Specify an integrity constraint. This feature may be supported in a future versions of HyperSQL.

                  DROP ASSERTION

                  drop assertion statement

                  <drop assertion statement> ::= DROP ASSERTION <constraint name> [ <drop behavior> ]

                  Destroy an assertion. This feature may be supported in a future versions of HyperSQL.

                  The Information Schema

                  The Information Schema is a special schema in each catalog. The SQL Standard defines a number of character sets and domains in this schema. In addition, all the implementation-defined collations belong to the Information Schema.

                  The SQL Standard defines many views in the Information Schema. These views show the properties of the database objects that currently exist in the database. When a user accesses one these views, only the properties of database objects that the user can access are included.

                  HyperSQL supports all the views defined by the Standard, apart from a few views that report on extended user-defined types and other optional features of the Standard that are not supported by HyperSQL.

                  HyperSQL also adds some views to the Information Schema. These views are for features that are not reported in any of the views defined by the Standard, or for use by JDBC DatabaseMetaData.

                  Predefined Character Sets, Collations and Domains

                  The SQL Standard defines a number of character sets and domains in the INFORMATION SCHEMA.

                  These domains are used in the INFORMATION SCHEMA views:

                  CARDINAL_NUMBER, YES_OR_NO, CHARACTER_DATA, SQL_IDENTIFIER, TIME_STAMP

                  All available collations are in the INFORMATION SCHEMA.

                  Views in INFORMATION SCHEMA

                  HyperSQL supports a vast range of views in the INFORMATION_SCHEMA. These include views specified by the SQL Standard, SQL/Schemata part, plus views that are specific to HyperSQL and are used for JDBC DatabaseMetaData queries, which are based on SQL/CLI part, or other information that is not covered by the SQL Standard. The names of views that are not part of SQL/Schemata start with SYSTEM_.

                  The views cover different types of information. These are covered in the next sections.

                  Visibility of Information

                  Users with the special ADMIN role can see the full information on all database objects. Ordinary, non-admin users can see information on the objects for which they have some privileges.

                  The rows returned to a non-admin user exclude objects on which the user has no privilege. The extent of the information in visible rows varies with the user's privilege. For example, the owner of a VIEW can see the text of the view query, but a user of the view cannot see this text. When a user cannot see the contents of some column, null is returned for that column.

                  Name Information

                  The names of database objects are stored in hierarchical views. The top level view is INFORMATION_SCHEMA_CATALOG_NAME.

                  Below this level, there is a group of views that covers authorizations and roles, without referencing schema objects. These are AUTHORIZATIONS and ADMINSTRABLE_ROLE_AUTHORIZATIONS.

                  Also below the top level, there is the SCHEMATA view, which lists the schemas in the catalog.

                  The views that refer to top-level schema objects are divided by object type. These includes ASSERTIONS, CHARACTER_SETS, COLLATIONS, DOMAINS, ROUTINES, SEQUENCES, TABLES, USER_DEFINED_TYPES and VIEWS.

                  There are views that refer to objects that are dependent on the top-level schema objects. These include COLUMNS and PARAMETERS, views for constraints, including CHECK_CONSTRAINTS, REFERENTIAL_CONSTRAINTS and TABLE_CONSTRAINTS, and finally the TRIGGERS view.

                  The usage of each type of top-level object by another is covered by several views. For example TRIGGER_SEQUENCE_USAGE or ROUTINE_TABLE_USAGE.

                  Several other views list the individual privileges owned or granted to each AUTHORIZATION. For example ROLE_ROUTINE_GRANTS or TABLE_PRIVILEGES.

                  Data Type Information

                  The INFORMATION_SCHEMA contains comprehensive information on the data types of each schema object and its elements. For example, the ROUTINES view includes the return data type for each FUNCTION definition. The columns for this information contain nulls for rows that cover PROCEDURE definitions.

                  The COLUMNS, PARAMETERS and SEQUENCES views contain the type information in columns with similar names.

                  The type information for ARRAY types is returned in the ELEMENT_TYPES view. When a row of the COLUMNS or other view indicates that the type of the object is an ARRAY type, then there is a corresponding entry for this row in the ELEMENT_TYPES view. The following columns in the ELEMENTS_TYPES view identify the database object whose data type is being described: OBJECT_CATALOG, OBJECT_SCHEMA, OBJECT_NAME, OBJECT_TYPE, COLLECTION_TYPE_IDENTIFIER. The last column's counterpart in the COLUMNS view is named differently as DTD_IDENTIFIER. So in order to determine the array element type of a column, an equi-join between the COLUMNS and ELEMENT_TYPES tables on the six listed columns in the ELEMENT_TYPES view and their counterparts in the COLUMNS view is needed.

                  Product Information

                  A group of views, including SQL_IMPLEMENTATION_INFO, SQL_FEATURES, SQL_SIZING and others cover the capabilities of HyperSQL in detail. These views hold static data and can be explored even when the database is empty.

                  Operations Information

                  There are some HyperSQL custom views cover the current state of operation of the database. These include SYSTEM_CACHEINFO, SYSTEM_SESSIONINFO and SYSTEM_SESSIONS views.

                  SQL Standard Views

                  The following views are defined by the SQL Standard and supported by HyperSQL. The columns and contents exactly match the Standard requirements.

                  ADMINISTRABLE_ROLE_AUTHORIZATIONS

                  Information on ROLE authorizations, all granted by the admin role.

                  APPLICABLE_ROLES

                  Information on ROLE authorizations for the current user

                  ASSERTIONS

                  Empty view as ASSERTION objects are not yet supported.

                  AUTHORIZATIONS

                  Top level information on USER and ROLE objects in the database

                  CHARACTER_SETS

                  List of supported CHARACTER SET objects

                  CHECK_CONSTRAINTS

                  Additional information specific to each CHECK constraint, including the search condition

                  CHECK_CONSTRAINT_ROUTINE_USAGE

                  Information on FUNCTION objects referenced in CHECK constraints search conditions

                  COLLATIONS

                  Information on collations supported by the database.

                  COLUMNS

                  Information on COLUMN objects in TABLE and VIEW definitions

                  COLUMN_COLUMN_USAGE

                  Information on references to COLUMN objects from other, GENERATED, COLUMN objects

                  COLUMN_DOMAIN_USAGE

                  Information on DOMAIN objects used in type definition of COLUMN objects

                  COLUMN_PRIVILEGES

                  Information on privileges on each COLUMN object, granted to different ROLE and USER authorizations

                  COLUMN_UDT_USAGE

                  Information on distinct TYPE objects used in type definition of COLUMN objects

                  CONSTRAINT_COLUMN_USAGE

                  Information on COLUMN objects referenced by CONSTRAINT objects in the database

                  CONSTRAINT_TABLE_USAGE

                  Information on TABLE and VIEW objects referenced by CONSTRAINT objects in the database

                  DATA_TYPE_PRIVILEGES

                  Information on top level schema objects of various kinds that reference TYPE objects

                  DOMAINS

                  Top level information on DOMAIN objects in the database.

                  DOMAIN_CONSTRAINTS

                  Information on CONSTRAINT definitions used for DOMAIN objects

                  ELEMENT_TYPES

                  Information on the type of elements of ARRAY used in database columns or routine parameters and return values

                  ENABLED_ROLES

                  Information on ROLE privileges enabled for the current session

                  INFORMATION_SCHEMA_CATALOG_NAME

                  Information on the single CATALOG object of the database

                  KEY_COLUMN_USAGE

                  Information on COLUMN objects of tables that are used by PRIMARY KEY, UNIQUE and FOREIGN KEY constraints

                  PARAMETERS

                  Information on parameters of each FUNCTION or PROCEDURE

                  REFERENTIAL_CONSTRAINTS

                  Additional information on FOREIGN KEY constraints, including triggered action and name of UNIQUE constraint they refer to

                  ROLE_AUTHORIZATION_DESCRIPTORS

                  ROLE_COLUMN_GRANTS

                  Information on privileges on COLUMN objects granted to or by the current session roles

                  ROLE_ROUTINE_GRANTS

                  Information on privileges on FUNCTION and PROCEDURE objects granted to or by the current session roles

                  ROLE_TABLE_GRANTS

                  Information on privileges on TABLE and VIEW objects granted to or by the current session roles

                  ROLE_UDT_GRANTS

                  Information on privileges on TYPE objects granted to or by the current session roles

                  ROLE_USAGE_GRANTS

                  Information on privileges on USAGE privileges granted to or by the current session roles

                  ROUTINE_COLUMN_USAGE

                  Information on COLUMN objects of different tables that are referenced in FUNCTION and PROCEDURE definitions

                  ROUTINE_JAR_USAGE

                  Information on JAR usage by Java language FUNCTION and PROCEDURE objects.

                  ROUTINE_PRIVILEGES

                  Information on EXECUTE privileges granted on PROCEDURE and FUNCTION objects

                  ROUTINE_ROUTINE_USAGE

                  Information on PROCEDURE and FUNCTION objects that are referenced in FUNCTION and PROCEDURE definitions

                  ROUTINE_SEQUENCE_USAGE

                  Information on SEQUENCE objects that are referenced in FUNCTION and PROCEDURE definitions

                  ROUTINE_TABLE_USAGE

                  Information on TABLE and VIEW objects that are referenced in FUNCTION and PROCEDURE definitions

                  ROUTINES

                  Top level information on all PROCEDURE and FUNCTION objects in the database

                  SCHEMATA

                  Information on all the SCHEMA objects in the database

                  SEQUENCES

                  Information on SEQUENCE objects

                  SQL_FEATURES

                  List of all SQL:2008 standard features, including information on whether they are supported or not supported by HyperSQL

                  SQL_IMPLEMENTATION_INFO

                  Information on name, capabilities and defaults of the database engine software.

                  SQL_PACKAGES

                  List of the SQL:2008 Standard packages, including information on whether they are supported or not supported by HyperSQL

                  SQL_PARTS

                  List of the SQL:2008 Standard parts, including information on whether they are supported or not supported by HyperSQL

                  SQL_SIZING

                  List of the SQL:2008 Standard maximum supported sizes for different features as supported by HyperSQL

                  SQL_SIZING_PROFILES

                  TABLES

                  Information on all TABLE and VIEW object, including the INFORMATION_SCHEMA views themselves

                  TABLE_CONSTRAINTS

                  Information on all table level constraints, including PRIMARY KEY, UNIQUE, FOREIGN KEY and CHECK constraints

                  TABLE_PRIVILEGES

                  Information on privileges on TABLE and VIEW objects owned or given to the current user

                  TRANSLATIONS

                  TRIGGERED_UPDATE_COLUMNS

                  Information on columns that have been used in TRIGGER definitions in the ON UPDATE clause

                  TRIGGERS

                  Top level information on the TRIGGER definitions in the databases

                  TRIGGER_COLUMN_USAGE

                  Information on COLUMN objects that have been referenced in the body of TRIGGER definitions

                  TRIGGER_ROUTINE_USAGE

                  Information on FUNCTION and PROCEDURE objects that have been used in TRIGGER definitions

                  TRIGGER_SEQUENCE_USAGE

                  Information on SEQUENCE objects that been referenced in TRIGGER definitions

                  TRIGGER_TABLE_USAGE

                  Information on TABLE and VIEW objects that have been referenced in TRIGGER definitions

                  USAGE_PRIVILEGES

                  Information on USAGE privileges granted to or owned by the current user

                  USER_DEFINED_TYPES

                  Top level information on TYPE objects in the database

                  VIEWS

                  Top Level information on VIEW objects in the database

                  VIEW_COLUMN_USAGE

                  Information on COLUMN objects referenced in the query expressions of the VIEW objects

                  VIEW_ROUTINE_USAGE

                  Information on FUNCTION and PROCEDURE objects that have been used in the query expressions of the VIEW objects

                  VIEW_TABLE_USAGE

                  Information on TABLE and VIEW objects that have been referenced in the query expressions of the VIEW objects

                  HyperSQL Custom Views

                  The following views are specific to HyperSQL. Most of these views are used directly by JDBC DatabaseMetaData method calls and are indicated as such. Some views contain information that is specific to HyperSQL and is not covered by the SQL Standard views.

                  SYSTEM_BESTROWIDENTIFIER

                  For DatabaseMetaData.getBestRowIdentifier

                  SYSTEM_CACHEINFO

                  Contains the current settings and variables of the data cache used for all CACHED tables, and the data cache of each TEXT table.

                  SYSTEM_COLUMN_SEQUENCE_USAGE

                  Contains a row for each column that is defined as GENERATED BY DEFAULT AS SEQUENCE with the column name and sequence name

                  SYSTEM_COLUMNS

                  For DatabaseMetaData.getColumns, contains a row for each column

                  SYSTEM_COMMENTS

                  Contains the user-defined comments added to tables and their columns.

                  SYSTEM_CONNECTION_PROPERTIES

                  For DatabaseMetaData.getClientInfoProperties

                  SYSTEM_CROSSREFERENCE

                  Full list of all columns referenced by FOREIGN KEY constraints. For DatabaseMetaData.getCrossReference, getExportedKeys and getImportedKeys.

                  SYSTEM_INDEXINFO

                  For DatabaseMetaData.getIndexInfo

                  SYSTEM_PRIMARYKEYS

                  For DatabaseMetaData.getPrimaryKeys

                  SYSTEM_PROCEDURECOLUMNS

                  For DatabaseMetaData.getProcedureColumns

                  SYSTEM_PROCEDURES

                  For DatabaseMetaData.getFunctionColumns, getFunctions and getProcedures

                  SYSTEM_PROPERTIES

                  Contains the current values of all the database level properties. Settings such as SQL rule enforcement, database transaction model and default transaction level are all reported in this view. The names of the properties are listed in the Properties chapter together with the corresponding SQL statements used to change the properties.

                  SYSTEM_SCHEMAS

                  For DatabaseMetaData.getSchemas

                  SYSTEM_SEQUENCES

                  SYSTEM_SESSIONINFO

                  Information on the settings and properties of the current session.

                  SYSTEM_SESSIONS

                  Information on all open sessions in the database (when used by a DBA user), or just the current session.

                  SYSTEM_TABLES

                  Information on tables and views for DatabaseMetaData.getTables

                  SYSTEM_TABLETYPES

                  For DatabaseMetaData.getTableTypes

                  SYSTEM_TEXTTABLES

                  Information on the settings of each text table.

                  SYSTEM_TYPEINFO

                  For DatabaseMetaData.getTypeInfo

                  SYSTEM_UDTS

                  For DatabaseMetaData.getUDTs

                  SYSTEM_USERS

                  Contains the list of all users in the database (when used by a DBA user), or just the current user.

                  SYSTEM_VERSIONCOLUMNS

                  For DatabaseMetaData.getVersionColumns


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/eclipse-gradle-invoke.png0000644000175000017500000005246512007570374022645 0ustar renerene‰PNG  IHDRX*¼ÌmsBITÛáOà€PLTE¶Ø|…Î.r¯A’RB«æ3f3üþë333æãá›`{Äîw‡žÞÞÞ±¯®(b–‚GŒ‹ÈçøÍí›Ó󇃂N[pµ’#ÌÌÌÚ×Ö¥¢¡Ñ­yæææ);]sx~>—Ê][ZÅÀ½ôòñ$" ºy(¾Ú»øè˜LJJ™™fYWU°¯¤÷Ï€ãw€ïïï]_”¸Ø”Ž›°²b­r/RQPBA@ìÑ‹(F³×h`×¹˜ÔÏÍ»¶µ«§¥ûïÉÚ²Ï6|¤–‘©Öøâš¥ØBOfffÆð°Î±øØˆ.I°í¹Poä¢9X™d+)({[‘oNÊÆÅxusp˜À³›…™™™rq“O~©ŸÎ²Üïù‘¾Œ7^–-‡E¶¶¶)D{”Íïìéè«m"IFDûì±äàß÷÷÷ÿÿÿtsrDRkÃ…6““’І°ÀØ*jº×ÔÑÀH8#(MªÔìNF{ðØöß–¹ßõ[s£9gA—lKï·¹ÁŽ@¾»¹:97»¥x‹Ÿ6= pHYsØØH‘¦!tEXtSoftwareMacromedia Fireworks 4.0ê&'u IDATxœíƒÒFÞǹÛUñ–ÛVâ®òR¥[EO =;๭œž§tÖ­ÚÝv]7d+xÛÞÕÚú¯?óšLBBä ˜/K’™Ì„ùì/3a~3±¯~íìN¬Ónµf¯ýqT­‚³:HP“¤å⾄±¾Ðãºp'çg¿óŸØWå)\'cp²”ŠÀÃýýØùŽS cd|œ˜ŠÀ™Gpl'LfÖLgއñ°¦&ðn ïîÄ>v 0+¯áofMÎÎ>"8…“§0=€Á˜°ÆÃ†n7c°ÃÛÀ¿ÿýï·¡jdž8Ú•ç§BpÄ¥Žà :€8å‰Ýä=(]hƒ‡a·nï²ùáÝÙlöÍíÛ;;;7ÏÉZœDŸ]Ry¿oq#vM gF0 ú¤ÀœÖ&òÖxXSc “N`öoÞ¼{÷îæÍ›;I–÷µäöeÌÈ"¨(#TØvG ÄFvD€9È‚(æÃn“Šƒd§“É)~pbvÔŒ'£àéL†ÇC£†îNPjLÜ—ÞÐwëÂ[ð›7·1€ÿýïmZøÖee#† ªŒ4ƒ ºUj:Ü4«£eYÕ|تír² qŠ–C¼Ým•ó­ ø @„Ça£‘áñ ÔHJ×@  â­DºÉ…æ „Þ&þp“ž*›€7Š'eÐñ·*¾‰i¸û¹ÕèG|–QÜ$£PKèò2Æür¦åÏ®ÿ‹\¿lGBß·†IÛÍh£L­ÞíuëµÌ˜zÁ Oꪣ˜ðNn’!?,‡€ßüA~²»ÚMöŽ˜Æ ÇŒ,ã»öØÏ {Ëî~AFãäzÜoÄOþÐ3–¬ ž˜Æ!Óø ºäp‹ã~峃¢ŸàÆÏe‘¸*Þ!.Æ!j\'eÐ%ŠÞ28…A’8n¾&½þIù›ªÇãi|§frB'§qÜâöÇIsáunñó•7ß.NÉà$&qR&rú'¸LçïÎ[ã7=;˜@·}Ï…„r«Z,IöÇí£Ã}Ç VÙ±ŠiÒ Eø®†Nጓb'48´a–2üÁª KÝQ'±;ŸQG¹¤,•&‰÷î哤 wÕ1[ðx]6Z.ó3BˆdK µkíÒ 1GÒ¾¯ÕA<r6Q•Œ“°õÆ Þ’ñ'O¢p=`‘-“j2[DÒ(@é ´³™†Û«ƒf®f•É~“…\­VWñ’pdËŒ“˜ û¬NΜVÒ8ƒ|úÐôâ5ÐWò ·ü¹Ì S¤ãñUsV@¶«õZ%mŽÄʬW­×«öwaÐHã’\˵@U@ª¢½ ‘­“Êå’€?ªE)AûÓ­JùÚ†«!›…,Y®AC✮.‰E¶Ê8´%@ËÓWÛ ÒØíCöÐôà.ö@Ú[ûŠYfÐ)P”Þpnæ]õÀœ@rè&Èê•6üG˜Ëì@¿Òl¤ÑŽŠDâÑ$ŒuRr+Þ<Êâ(¨¶Ñ& AHóM‹LâÚ‰sZ1\‹l‘q¨¦¬hyzx5Mh7Ò†0ì¡éµs rT’åÈe‚fqÑ„ ¼ok›ŠÝm GZ-bŠè$r1Ÿ/â‚eñèÙ:)¨~.§5F‘õìØfR )7 —ÄGŠ™´u-ƒå‹É*¨&‹²! »2š^&.åf&n®\h_1Ë ú£Y\49¸Q·ŠÄŠÃÉÂè#ƒ®ejè>ÎÞ²8²uRH¨ÎÅŽ£pfl4œ dgaá»Ö”›Ðô&m •Ò8*U€@“ ¥V ¾‡,›ö³ÌhG T•äÏl¾@C=p0Ì µ™ƒËjO®—ÐÉâq ðõ@vG¶Nª$ɸEËŽ²(8 |Un4=ZÉâ.‰F¶É8¼½æyéÀžÀUE‚°u@C=¦—.¦ñÛ2o\f½hO rÅjÛI{ØcmaØ´FG½T¬¢OqÚ8½x¼UÔÈ–II¥bÕÙQ…¤Ö=h¦]È·…Y:$²]Æ¥j-×Ô“&Þ_á; ²o„¥WƒĤbÙN7d¶…@+ƒQ{tŠHÅ0u'«*ð"h˜@Å®E` 1:ŒÊ*¼¿U&É®»¤mCJU÷i¸;½«¼ØF6ìÿ~@8ÇJÌA¸¹D*BL3`Š^‚Ô¬h PUý4SÎú›~ðé}=¼f@# d}M?øô‚¾N³  p†Ïo¯P8Ãç·Õ,è‚À‹61×™F?€¯>ÜZ3L¢—aGà%&c$Súïò~¼´¼»»»tlwüáÒòòòÒUÛøC×ûÑÊ6°¿àG¬˜Ïßÿmç7‡!‘¬õdëÎKÎÁ4¹%ÐþJ”#OÙä³Ñ©'’*~%ê†ñ`"ÙIv¶¼£"O Є )}äÕ1ŠÂ¥Ý?ÿùÅ‹O——lŽ/ÿùO/^,=}hwk­/ø°<òôéòòÓ„Íwd:çÖ­[;vÞ¾}Û.ŸO¿z•¿cwtX®´+Z‹‘7• ß!mßúõ׋0›Öù”!v$~AeãÁ4Ú¿öé1‡ %%–$ …6ZZ~ñg!øÂÁ奇§þô)DÐÎ Z8|ÁÜÚúò÷á#0奥gí¾#ÓùÛºýæé®ÕÿĹ7oÞØ |÷ê­{\Aú~û?öE볌Úxé?¿>¿xÉ2Ÿ»L½ƒ_™aHpßGàø¿}®ó…A.ý÷ïßVV0„6:Þ]Zºªª† ,íZ݈Ÿ>} ÿ ®ll¤™Kû­¬Y\ð/¿üòÒÓÃG^ì.=¼zÕ*ŠÅù_¿Þ¹yóæÎ›]ø/³k@ðõë×’tI’,rI|»esÃr"ðßgÏþã_}4¢hý–A'øòåµ—/-O#K…FAÂ/¸²—3ò?u¬màúd¼p‘ %–\Y» ÿW‰Ÿ»…–a꟟Ú0ë€U‚ õL^RUd‡/øÎ—¯Þ~¹õêÔБeô/e÷ñ穪ˆÀÛÈj.--s¡PÌ6ý6†\öÉ-øø‰ÍE ÉñÌl }Ñú,W6ðÿžu:/½¼w4°‡+oé.¤ ­/pGväõ¬T¨¤Ž”]—wè^³ ¼½½}î=`åêÉÄñÕ•d²úÞ*ý]J Bpi×"Äîû÷ˆÀ«ËOYy›CpéµÛíW¯NA×Öà›Uw¾| üòÕ=x„ßÿôé xú/Ô2=0âüŸ\»ö¿þMxÞ]FÚÕÏ‚Ž|q›8tF Àá2°’#ŸÃrý®éz‚’»zàÿ=gFêÔ£Sˆ@Po×%/•kŸâW£,å¹#°†x¹€m`á²^C˾`b-q"Hö˜Óߥ6Z¹eL 9l&ÃãWww5Í!xoß;õÑööÊ6¼1Y3š¢;—¾üòoà"{ưùé35 ðÓ‡gž9œÿtÇëC8L :bGàLFîoip¨ ¬äŽ@œÜ™qØ~ɆÀ;<8Ÿ™ªR5¸™_(· ~%ÚeÞ^èÔ©u<®wØž@}î>[X­®¿¸ú§?­ÏæôwOž<‰ ¼zòäÓ]‹KˆÐ‡¨¼µ{´)ŸÞ9Hàý•íSˆ‡s†oèÃÔ7ß|³µUÿÒ0fïîî 8z tuÉáüŸÀ[é+tîÈvï¾Ðá#·é·a"ØOn±[ðPXȹ!¼Ë–Ú÷•Kÿä†@Ò Ë—ò†˜ùö>÷âå¥Âe@_z ‘#ðÛò›õÛåÛë´ÖãïÂñ•«W¯>ýÓ‹Z4¥¿Klœú® æËËW! ËË7îÞ½{X„0øêÂá•‘@°…Z"ß Å·†ýmu þìÙÓåe‡óòê¥&.>ò‰&>x–óµdrK«šËÀBî½wÐö½ûˆél‹´DÞš „¡%Ô ~ÿÅÓ]Ë{#wþ3³GT G*š@UÝJÖ='–íê HÜHN];uJµ&ðÄëBv'ÛÈà-þÈá9îea7]ˆÀqôÜÀ.çÐ=D>µýQëç½q¾>d ðíÛw¿2[¨%BÆø/`âK/–Œõ:ëóŸ¹þò:•@þÈõaÕ{[cè†ÀœN`nœSû$·žþ®‚+믠îô¹þ¹µsÙËx‹?rÁð¢{ Þ^¿ ¼m_hòû'ÒèW9ÀÒÓåÝQ‚Ÿÿúó_ÿ ߎÚþØbúÃt‚%Ô¬€Úd€;ÿ_ìäŽ\ÿ‹áÀu àµ-¯„ªê9b`"Là§Ÿ~š{íÕ½?>Eß¼eÌŸ}[ûtí§5dó~âŽìôof´Wßây`û¹&þÁÇÃ\/íŽì™€õ3Óð!ïþÃôn8$ù]xX2lƒ,?•-ÏF“9”Ý‘·ÀëãÝ(]Èi¬“û£É{g%~Úã_ü¡n?'°Ë‰‹fNß±sŒÝ :Ô!‚L^¤:|þ@”UgÏé øñ¢öìøœžßçVvÝ!Û‚ÀÙ<ÿ°f”À+,Û›¾:T:èeú‚é¹ 6±ü>ÿ €nƒzöEO­,½mî¼5ý,æk 3‘08a50ñ÷+/ Ž;Ç.CFÁ9µ~·aÊ8 Š ‚|=p>„þ»c>Ž66ÚŒÉAx6˜1&0ìLD]Àˆ œ¿p@ÂuÀ˜zBh¤Á°K Ì!µANÂFÂf 6~“ÿfdÄõÔD¯ÖÈŠ4ƒNÚŒå#bíü¦óYg$‚Ù¤|A¦Fª%#ó6›jaGRÑ'0ÿY糑=Â[õúzç·Cø²µxúèolNã`c]‡1 ~¯yF 6lB¸ÅAAóÑ&Û@ ˜…Ëê7a›ëeøߨÖåGNsay”8¯êÃ&T° þ›Qí:–¨‘6pT-Öáq¨­ ,¯ç×Ëߨ֤å?s—»PFqrÃ&p_¾¢(ú¶¶\ù¥¸~®ïÿRüå¾~DQâëWÈFó‡+4Ö•õ& <$E8®+Xø¶ðM#fSËKæ¢Ië>¢›õ õ-dJóøe8†'¬ÏN#9ÕF-ÄÈ ›`øúÓ\þñº¿á*®\Y)^áŽÜ_§¯üð‰tá‡KŽ+kûßô¿-| —š ìב þH¢:ºQwŽ,CÔ7ë[uˆ¾¾1Åe¯¼UÜo:¦ˆÃéÛ‰#6Áðõ+¦-¸lRû¶²?¬ðÖñÄú:Ù¸R$aÖ`±ïÇf<Ž"¸× y슮¢Nà‡òøõÙ@báò€¼º¯E$åñøDÀ2¬ v¾Õ_œ±Ó”`Ögç>»xõa _¿bÚReAr'^7x¿Im 5{MvVP$xϾ²¾‚nßW®ü¢³ùË}¼+Š:Á;ðõ€uDvÕê}µ ÝoóŒ«:³æPý?Êú‹³:ÐÂ’WçÛ¾UÜèÜ…oÉÒ2„­8¹a _¿¢oÁ­•fsòDÌ\Ñ@ ¾·B¯èÑq$…¡xe°{_!8ß'»"¬Èˆ„¶píÊw::°Ž†¨‚554z›U¤þ²öâï  h¯Vqûúñ?XÄ¡³[ËÐæ‡Mп~Å´E–WÖ×™ üÅ… TèÑ+ëqŒcQßYdXGWÑ'°óZ@Í‚c£Btõ¥‚tø[Á&Ô ´÷¿ ûÑmþC¿lÎNŽBã©‘;|vKñÏ Ã&è_¿bÚ¢Ÿ¯4Y=ðõ@……¦óŠb´¬Ñ]EŸÀz[@X¬Û<µÄV’ŽÞf~ˆ ¥£#Œ½gµ’PFñž0›À¾~å„qKÁüà¶.n 7-ÛÂ'˜ ¼RD g…†ùµ‹s=PÜ…ÝʆÀ#:6%zYÇ$6ý&R5¤Ýž C¬Éty” biÃ&ü-RaKÈÙ/øyßý_劊X\ןñó@ÆŒ#maòP1ºŠ<©¾^GµÀßí,¶.Rس ôÁ @+Ù° .K'âÍXOy… ò6F¯uL\Å "‹cÊ‚@&üIÑÛ¿6ºRŒ~=nZEž@Y¿ ›‡ˆÖdn]DDÃjÃ&„UÜTä œa (4,A ºQĤÏÙü3!( Ý(:s·aç"êú'A  ý“ Ðþi˜ÀÞÎŽ]à…• Ð? دV'šÖwž%ôOVm TFïVlCŒ:ƒbhhÿô˜L‚@ÿd"° ÀÎÎNŸ›G*«-úÕ€¢ÐOµJ3¾i}Å=Š=_P¹AÝûÆ5AäS¿yT«ålÏàšÀñ2à1=¤˜@Èß8€ ~üïÀùñ·û'ä\Vä½^¿ Wû½Ã^ß41X¿IÖÊê ™«P¯4(±ÕA]~::.òéþŠÐ;c&°º‡žHs÷àt\¯ü0*IyµêºØåïÂôx®‘—†êðOBõÀ¤.2à1‰5hË¡šA\´¢Ë… ds xòSÇ<¸È&”> <°ÙcI`•>‘Ö$ôIC‚Ð4+È0öô¦hOoŠöø˜hîÓž(Òãµ\s°ª·…õtÑ#H']dÀkOŸÞ÷AwfCà'¯Ï¼~í‚höÓÝQ¹‡@Ö×/ȴdž@óó@'yZÒ“$d³ßkkûÁ²Oº+0;_y5Š@H1·²GðéÓ¥§îlà3äZn9OïÝØÀ!1O%û£2ì¥ìò`½ÛëßD øÅ¡|@Ð]ñÒ¼\†:sæÃ™3ôs–Vµ•-ó‚'±eyÔ5 Õ¶Tô<Р»‡‚‘wa76p|F`˜ØŒe¡õ€2½GÐ]Yß/¡ ü\#°\Î4ŽÌª1¼àvZ^Ãe`ÄPá–`,-.ÑB›1Xt…ºS hŽ8H3s¾_~~æóÏéç}¾A|ß z®˜a§Õ5\65GFÚÀ»wïþ~ãî . ú£ÍØ4$§×ÖÖFŸ·ƒ@ƒ rãÈ´36  å5À[º¡92ú.üÒw—þ«‚§y}Gp _£¶°F ¢ ŽŽÝhq —MÍ­  UA¡ß:¸Ft¾_£¶0ý¼¦¬ ‹Ý…Íû‡®Á¶h pé… 0X‘»pBgкø¼•§‰´¶0ý|Z9=$½%b>b¾†Ë¦LXølw€]x§“À‰žÆ!Ñ–H‚0h[|ÞÊîiÌ-ðý9j &0Æ–£tgwŸ^}±»é{~¿Á£4ËŽ@á©4¬Í@Oc‰C¬€4g- ÷)$/‡—áûsÔ¦Ÿ•Ã!Aй•QÆkpÙ~ñté\ý~ãÁßñŽ~ÜM×dA ðT²Ðf,ƒLRÁÅçs&иM L]NL)Ã5˜ÛÂVy°|”s b}2KýôT²9‹bhh¿7™Oˆ@…]|þŠm!ö±‘ÀéÅ_ƒ¹-l™‡as{NA¬Ofó»°ÇžJDv˜)î Ë[ ˜ÇY+ƒCxÞkùk0×-óà"›n/ÈEÏ„j7ßoС‰Ç5?ü§ÕêÌ\8^&<$P†M† ™À¬wrÝé1ˆþÞ{*aÉñšÆÈìy+¡®‡àdÅ7m&ðÒáE¸»†´òTÊ7˜¯åDžJX´ŽÑìy+!3AkAÐW]þùN ¥§’¢ÄY=p"O%¤z•Ãhö¼• A+ 1ƒf=–WÎ là°§è7(SŒ™ñ<•ª5£ÙóV"s¬£­iŠoÚLॺ¹ŠöT‚ª±z ¶ÇS oqÝ\gÐ[‰¨Í±„f}J%@‘äVW{#=•*Iù3èʸžJæ†î z+¹7Æ÷óŸÀåÒS©]-– Ï•q=•†œ=o¥HŒ\¤È}œeÍš§Ò¨Älö ÒdƒúÏš§Nl,Ô¼üMÄ–À–­¼JËôà IDAT\Ë^F“À‰zWÍ‹§’ß™E`ÌF Ï3—‚À…ÔHëÖ:Æ‚@·Ž– Ðo 9]¼8´Kè·‚&p•Œ—W_åwF„À‹§&$pÈ'_è^C>ÙºsçÞ"þk»~uiywyéªmùdòä^nßur««Á:\ó™ÀË`¬é2¹xÊÀn"èZž4fp¼Ž#3O¿z•¿ƒ7© ü×öÒ³5uíÙÒ‹!sÉeÐÊ6ä“Ã&´ßÀ«†é×¼Õlvu5ÙE«¤¾7PŸ3™„žºHÄíåìf»kÝDÛò¬1€ÂSi ™„¾{õÖ@à‹m“ÿðg/Læö ðõÞŒ`#Ø€kÃþz:›m§ÛÙlºÎí –ÀÛº¸ýïézÉeM'Z@h ÝÄe KãžJcÈH ðíþ@|¸ÔVÞ„;¥‡ÛÉF¦§B3ÌIÓ¸’9êooô2ã$5Ý4îô•6”aÀjV'¼|õêÕK">k:Aéã£ãËkØf-Œñ±€ ÷Tÿ솃=¼6ˆnÁÀÇOð'BàÒ³ÎÃmÛðÃγ%ò{ùýé$D®åœñ´™J¦‘¯äpmJ0½šmµWÑÀ³mí·•  dCþ/¯]{9œ#0 màš”Hg/Ã×èD\z*>F¦Ý¦òõÉSÉâ˜btt¹ÌáŒþ#ð %p9qjéÙ¿¶Ÿ>[ê$– žÌ¿ÏCˆÌ7’¦óöä| MŸÑʶҭv« L3£A DhWl'Ú©ÓM´2Gó &¹î™0ÒLjß=daøOžy*8ì”Ï!Û sIà¸ìoéRwËå嵓Р.Ÿ:µk ¶‚O&’Áµ“™“æïUò¹|ÅÔXoIR+]O£Ë^†N xI ääÛÂõÄQþ(ÑN´àíxt"n=•x£(x*‘Äã5ÐWò ‡ûhωv©™ÖòH÷­V«,)=³IŽ“eÌÀ½ä– f;KÏžB‡m`òd2<}2ùÞlá×ËçÌŽa°å ïÁGívï¨×†k– ¼ ŽÀˆ†$ºxŠC'0q!»“½¼œ±~(£Çî<•x£(x*‘ÄáùÒÅH74»Ö­ÂÌéyÄûðIWM=`ÛÍ6—9–1WÂ;°œ¯%“[€\=péÙ¼›ë@lp7ÛÀälÃ¥q7¼óvá¥u‘i-xªUK`ë‡[ÂvЭ§’ÁÇ( žJ$ñvTŽ*`CÒÜhò¨h9¬s˜n~ÆeN˘+Ÿ\»w§V«×·ôC„@Xÿë\Emaô\Ð@`nïý´‰÷{ïûæÇ1ÀJ²b *¼F«×ëµz&ð2@©L^|¥‹!Șÿi¾ò.qé©dð1¢‹P=•H♸\”›™xF;Ü4Î8¡í£Ii9ŒÜ﵌¹!¨ª[I ë/žuHyýkÛøÒ~K8Z‚@¿%-Uè³Fh;6®ç™ÀËH8™î¡Q;xý(Ég ÇÑf¬‡~ TgF`hx“„ páY½ ¨³\ˆe8ëvĬ ó?<²R^hø—¶$0ìlFR‚@/äŽ@![Í(+AdÌ•€ p:E˜@yDœ(X£_¨ p,E˜Àâ‚— È–5ùRÊÇ|Z 0“õÚ1Ž­a/Dž@ì]L Tš&/i +{~æÓZ€X«×ëy4ï€ p<9è;‘¶Ê<‚½^ïÚµ·_|q©§~gG âwV-}ü{¥,[Q¶*àoÛlT„!0Ӫƻ¸Q ¤”š‚ :óš ÜÇŸöÅ]ØŽ¸íÍØa¹¬HƒæQB+IUío $ˆdJ(ˆÈT;>¥xè‡<-C;ÕnSOj‡¹±©oVVná]¥~9Ñ說TÊdP0xþD[x")œ[Çf¬ ¬ä[-R’°÷Jr"'Á­dp±¦‡«ÅÆa·¡ò´ ÝØ@õæ5&Cìʪæúð?c Te`ßNS<>MG[Š¢'´«@3ÎZ“”d c|v–(•lB-£wQ?äiº©ªê¿PojB{²GƒT šÊfY…œAa¦Ñ°>oGuë#s ø¯wÀ:ÃlÆŠ@TLé%Ù„!PÉâ¥%Kßì§eè®-üøÞcõW&L`®›è$R°ü¯ãˆf¸ÖÜpéÐ1XvégÃÈÌ—wÌ€ºþã–#•dƒ½Qω'-CkMÏ¿xôáÑêWDßã]RYÞH…_šneXÒ ¤Ã²`5ûýfFFf΄´Jd{3¶¡ÈJ²_Ê29KÙ!OËК@ë!Õ±þIvÉÅAfª# âÝbˆ6×xõ@hèué°,H]X>¥®6ŒÌœÉhë:°$i[¸Q<س$ò´ ­ 4êÒãGO=¾ô¤Zœeoài¦\ LWLÚÆÁ0¨\žbµ¢ #3g2Ö~•ëý/C7>~týÃõëÿ†4t°µ–?èùOkéµ¦Ì òÂÌObl&ÐH.s&c[ØÀ~Éÿ2tCàëkÿ»ó¿k¯­O!Åê!ý° ¦$l¤¹A^Ä›?—f#¹Ì™ŒÏŒ'ý/C7~ùéK¿33¶À´JUnFà@‡Ú02ó%ão"‘êcO`TÄo"Ó):f¸zº(: ³ŠòÂ(„$œR@8S §“ pJAàtN) œN3J`}åØ*K&pÖ¼5Ù*K&p|oM{¥Lkï$pÔ£Cw¥Aä?jre䪘&ñ͵ŽcGàøÞš)ÇÑ"ÐøDÚ™ ~¢shÓçúAq`1Âó䜎ó žÊ=©TªÚ:­}œÄ7×:Ž-c{kÎ#> oÔ¸«ß<ê›'TCr1õBÐã§A ª&ŽŽ´“ôÔ·ŽcK koMÚ‘zkÖPGòA !Ũ÷ çè‘Àô’WµyTé <Ôƒ÷KmÆ×Æ Þ’MÒ e¸‰e¸ýiöÛ?;ªÏ˪§ !=Qj4BŠë—ÃÀf¬=´S„@ê¬ÉŠKÿ–ÓRx§›¬Ió^Ú‡:uýÜÛhJ†'q \"ŒÀý!Ýzkò=iÕ:rø«ÓZ}§ÇÞ~`zÙŒ«h»]­×*hú¢R]ï¶ ɵ\ËH ›\•›d•ëÑ_‘ÈZ;ÊÍËŠ"hÓ|Qÿ€º)e8®O›±ƒ~ÿ E;éË2rÖdÅE$·âð¿’ÚÀ Ý“S5yuêä5äú™<ȯµŒžâѱ'Э·¦@ìð—ã,9<`r𧋇Þ~Àƒz qíÊIÈü€åønûý’‘@6± 7Á ×£ŸN†©åæeU mž@æ–§¥¢ ÇõÉa`3–,—“)ÍQ 9k²âB:jVW³¨xY÷äTM^ÚˆÏ>´• Réã <Å¢%bK ÀD–Þš±Ã_“~ÐBè;=ööÔõWASÑï‚Ú¢–è;é>6¹*7É*×£ŸÙ@î¨æ æŽÕý ©(Ãq}rØŒeËåÓ)ƒ³&+.Bà#~ÛÕ=ƒ'§Á«Óìâ‰Î¦ <Å¢%bK ¡-üàÆ×w¿¾ñÀÒ[³¹Ï’¢õL†¸Â‡0Ù@< PŸqlÔ¹Cš5J×256è=úY=ÐpT'Ù@ƒ€!e8.wz/…mà^Êà¬ÉÛ@zŸD³À{r¼:Í.žœ dr´ûöÏ|­Â×KoÍ££5¹×UX ?ÔéÝóK’Þ~`z錫ØC]ªJògÕž\/™d“«r“¬r=úY[˜;ÊÈêÿ– ·2—žžžÂ³&óf¬ÔÏkõ@êvK‹KS†µDÔ†Ä{r¼:Í.ž´ÈxŠDgÂŽ@£­zpx÷¥·f⨉×õrø£Mü…@퉵…=õöÓ×錫dÎT ÞëÚ&륢ޟn ó=úëUò<›‚•#ôâñVÑ0 ¬ž ·2—žÞ{õ¶0sÖdÅe&+_5xròÛfO5Y!ma½ÀÑÞ×&LØh%ÐÖ[3,YýU®<ò<0ü¯rúCG—’»°µ·fˆS÷Òø 0¼ûVœƒ¡Ù!µD¾~`Ý Ì¤ ì5««ç`Ahv$ 0‡îf’À)B}cFU)ÆÎ‚À©¦;K§ÌokhúeA { §N'Aà”‚Àé$œR@8"Eà­E#Pª«Žã•[=±v|’­x÷³™ÏŠÛ® Œ–¯Ü¤¢þGÍIzݹ¡Kè¾ ÷GôL0j>Ä}¨ŽÒ´—<ë:¯õɧ½ãfñh~$B ™ÄÄ“ZOÜÁ{ýGwLþèì­éäÄÈæ` q?R©B{ɳ.SZoy®g=èå´üH„@õ•ª\¯úº~f‘¢;&„ töÖ—@?ˆSˆûÒãnȨ2Ⱥ"áÞò\ÏúúAFëÀ¤×aÈô XïQJû÷zýGwLþ(èè­9?6}b]çͽåá_~Ð×;ðÓÝ@ )óù¢lÙ#_‹Ý1ù£L £·¦…¦æ©Ô$À“z úÄl ¹·<º1#³¶Áµš ,d.zù[õÈç#EtLþHèä­iáƒÉ<õ›¤LÓ.¶p±Ïªz´hè“×9\ûcøén ‡”âqi¸W½¡×¿O]ì=P¤”‚v7ôÉW¸¶0íÀ´,$‡ÓÔ«ÞÐëß§.ö(ÊçÖ¼ùöí͛ƹ5-|0yO½@&ižþ&•®ó*b’I„,ÛÂß?zôè¦qnM LFZ`“4ëülÉófMÏÿyýú÷_}eðÖ´ðÁd¤6I#ðŽÀuP&Ðd¢þyýŸ?2Qg9 LÍS/¨Iè™0"L Iÿüç?˜&ôÖôe’F œN³C ú7M&äË$@8fˆÀ©åË$ÀÀM!-¾È‰@!Gí §Ñ3Á|¿VKνÒä@‰ÄÚ>P8™FˆŒ Bpî•&ïÄ$Zc7aAàdr !8ÿJ“÷é ´M`9\ç˜@Šàü«GÞkh?t8·Šà0H ,O¢B(œP#Ôœ{õÈ»0‘:a8Ç"‚ÁUòž‚¿0œg1‚  UòîL®Ëp~ \7É{F‡@ô#N ys– !z½3 àöîÝ»÷Ez¼³ûí/Sès¹*CWöz½³gOœ¸òïVàÙ´j×vYL*·ýoýªk›t¤þ–™\sÔVDÌm3Åypz;«&˽ pATw¾Òµƒ÷0Ë’TÎ6´sÛLé›ϪÉr/\orbG%Íß²ÚÅ3oÓsÛLqs-z;«&˽ pa<¯‹Èü-³bIÖVDœcˆæÁéí¬š,÷‚ÀE!ðûèÒm U²Ê¯TK=žU“å^¸(þ“#6D¨¿eî¸P/i+" =žU“å^¸0ÞÒE½å¨¿å^µ™ÚŠÈ‚@gÕd¹Î kãAà<¸6ŠÀïþö·©6½. .•Âò,wN‚@A`¨‚@A`¨‚@A`¨‚@A`¨‚@A`¨‚@A`¨‚@A`¨‚@A`¨‚À…$pf6 ‘ˆ 5Gö~-³>·fˆD­ù °o&ÐýÜš&qÓÍùÿëÎ-îçÖ4Ɇ@Ó¯Åoè‚Àù%ÐõÜš&ÙÚ@þS½$ôLóJ óÜšÔ “¹iÒù4SÜ&}“ˆc®O=ÓÜè8·&uänšl>Í·Igß$â˜;êzTG‚À9&ÐqnMê†IÝ4Ù|š)n“Î0έIÌMSÒÛÂ’Þfƒ1³'ô\sJ Q”@ǹ5ƒóQ"‚À¹!ðôhÉ]ØÑUS‚ƒ@ÔùúãÙ!h1$ >{‚À!0ª‚Ày"ð´ p&% Q@8—ž˜A  0TA  0TA  0TAà"¨®¨àåB@( U@8WÖèõX—6òÖÄ”@ U}í?¨@8/Ö $Þš'Ðra4ºõQçùÇÞð'ÄšGï¢â}RÒfoÍñ Ô>u¾:{öWA ‡šGOÜÇ}ôå&ð„Ù[õñóBé,5j?þ#ÅŽmþøœ3w„À_=£OH5—buOœ0ykb¢>:‹yzþã dÔ>~~öìsB ¶‰Ö‚„Àç_=~^è¥æ“@ˆ`—ð„Ñ[“u.:)äñÄYB ¶‰Ö „ÜžýÈ3 pn „rš½55¢àâì¯çg1‹¬òÇmâ*f–ØAT>z¨y%Ð ³·&Oà tÛum?z­Å Ðè­©ExCº¬žwa¯µ¼59¢Ð]øy6‡¶0N mœ-µHoÍDýs. œ·æ("!h1$ÞšŽDCÐbH0_΂À!0ª‚@A`¨‚@A`¨‚À¹!ð#0ì<¹ C C C C. £æÚ O@¸0ϵIõÁƒLX½êf”ËNç™{}íÚÿ¾øâÞ_¾¸ôá‹K˜@2_HªÈR¼¸™5òtþÍAB]K­©Ù¤‹N/²·Ñ”ôi:Õþ™€„NÎI§íLI…5ç^8':ß…sm¾ÆÎÃßüeëÇ[ÁuA2ÃMãpµØ8ì6ô™5÷‹:ÿfKR%¾[Ú]8y_kéÓtî•äDNÒ'ç¤Óv¦*-¨9÷‚À9!Ðù.l²Øyø¼ 0Ü…S µŒÞE}V¹zƒÍ¿Ùo¨éœÚèk6öHT:Mg¦ÝÐ'ç¤Óv¦d=¨9÷‚À9!Ý…Ǩ~òêsMh—6Ó!}³™5u6ÿfgP(–›xG#ÍÂÉEm*Š’RôÉ9é´|PsîsB º &ÐØùüÑ£GŸ¿¥ú¨ O µÅ}Í¿¹ÑÝÀotg6.4 69'Æ›KsîsB ¼ o$Ðô<ð%ðP­ÂÊš@2³fþ@ÕæßlÛj¾ÑaœÕU¥_Ê29}rN¯2šs/œá]x4¦§g®~ŠÛ¯)#dfÍË«ª6ÿf"u¬Ãj":Œƒ«É n «4Z¿Q<@¶ŽNÎI£QkXmaKÍ5§»°IpHôyÞàØ«¬Z•@õŒ&»AÌr K ³I¢€ Pª€ pŽÝަ€ Pª€ pŽwá• 0DA  0TA  0TA  0TAàÂ(¼5#«!ÐÖ[SS¿Â™ C µ·&¯”i„€ pq´òÖ|Éï60$- VÞš—^s–yg¦8ïKÿs/\-¼5±4©wfJ÷¾ ÷‚ÀÅ!ÐÂ[‹uQežI)Ýû2€Ü †@goMê™âü>üϽ patôÖäm þìæH B ³·&õέ!ÐÙ[“zg ƒÖ‚h’ oÍ ‹J  oÍ  K`4‚ÀP‚ÀP‚ÀP‚ÀP‚ÀP‚ÀP‚ÀP‚ÀPsD 7fFµ  oÍÈjn<ë½·¦ïîs@8Gzå­É}¡E!poMA`ZÇñÖdmÒi2ýʽ pqÃ[“#M“éWî‹CàÞšlšL¿r/\ÇñÖädÓdú•{AàÂèÚ[³¹Ïj°}A ŸZÝ{k­ÉC=°$ôS B {oÍÄQsP×ÛÂ’h û¬!Ð$á­-&Â[3:ZP£! †* †* †* †* †* †* †* †* †* \…·fd5'&¦ž[+àÉå€ patöÖįE!ÐÑ[K¼…@GoMÍ/³~p€¼6Õ½¦ä{î‹C “·&óˬS¯ÍäA~Íïù5 p®w28ì­Éü2ñ:§ª=ŸñÍüõNT´ðÖd~™M굉ւÀ4ó×;Q[ØÂ[“ùe °èõ¶fS‰ ŸZxk2¿LIÔƒ#ÐðÍÄ|ýÞcõ)d<O`b:oMæ—ÙamádE´…ƒF ¿/¦Ú÷"Åé4œÉ5& oÍèh1 ޚё‰À>ÞuìL A ™ÀZ}ÌÊF†œI8û2˜$%}•jçC<µų́”€ p>d°ý™!PØÀ¹‘ÀãüŒ(êó#S[Xž E[xŽd~8maíL‚ÀÙׂ>‘ކ€ #p“SÌðÉkMG áL‚ÀÙ#0 ¦!Ðx¦I{&DD@¨]obFå–@á­YÍüõº#PxkFV3½. œ1oÍEÒÌ_¯;§ñÖÌ䚃$šqd xëÄiK Ð¬ÉSxk–¤r¶ ¬d<î¼ó"Hàý±làXÞšÕîi´J¡xêÀó"g'õÖL¥Rj¶Q,É´’è©'I`?ìú“úc8¥·f²J ÌBþ:ÓÈðýx¡Í‰ólÅ'ªþ;8•·fî¸P/Qƒªö7ŸO-¯!œ¢Pg*æ8QÙ7ìHàTÞš{Õf°G5^:q[½@è%ƒ³R :hRÔ½5!€y"È @Ðß¨ä †nÏ“·¦gB½4ƒ³ÅQÀž«¾1ÀO‘¾•>K&ß¼ñÁ ^¤ò«db~dšÿ/õåÿMÕMйëõü×_ýô#µŒ¤¾)—ßü:…¬¼HÚÌ—ÆBÌwÿÖõÝX1±~€>¾ví±;Í0<ÙºsçÒ¸1/>¾þêÑãÇ®/V‹ªwIJÛ3×ßxpã肌À±¤óþ=^‘þío?@Ož<~üd"Ÿ<~õ*gܘ?Fžqª¡³Û3Ÿ~D¼q¾Ô7”QÆÌŸc1n…ô‘‚ŸÃ³®t:_\ºô¹cy(¦‚ù÷Mí&?6ÛÀ—ס |9VL"à»WoÇ&ýñ—̃Ñ.„ ü諯¾‚>€ú™ø¼ìæ…[_3†_[RY ø9I'PQŠƒœ…½´ =ùÖ¬]ç"ý¬8åVµX’œcbßnóßË÷k÷}…-µ+ã¶ Q-î¬øæžÀ$ðîÝ»otØnýô“3j /ô}ÃêêõsÈÝ\±6T”¾{wóûï9ûÍ£~rÃÝ‘8rIY*9ÆÄB·`àã'cÅü”êí“!uÙ8¬…"0 ëYDà-¶[)¸>WŒ}uþ\³yîüùó±¥xî¼ AÕ ‚Ÿ#·WVŒBåGíÒ ÁëfÚ‚ÀÍîPÓG4ÈjµºŠNµ:hæ8–M6ðŒN`gLn¢Ašy-IÙÃ(@SÏm½1ˆ·d˜vo ð1?%YZQä÷IDATµ"þÕ+ÍÁ&‡ƒgpá ü‚ÕJ¢ç0D·ÎÅΟ‡6®ãÛç!€ÛÛÁ]ëÂ_Rì¼A¿šü¼\^Ámí²^©ÂeÐŽÃwµ^«@ºU)ß°$ðÝ;lËŒÀŠDÖ½j½ŽTJ0föHÏ<~ÌÚ¹\­-¤Š¦ÌǼ“ÉÈý-@SËí$×r-”vÝóÓÌì÷vVÓ0–°V";sÕ;·4´b±âOðS x~Rwn~ ëÑšÜBBX~©7p)ä‹°l!OIxÛhs¦ÌÊÎGìw¿²«)“uÆhW`G¾i.Òõõõp[ _ȹoåA ‚ßèjñhÊ À~rKÅÔr‹Ô‡k¥nŒ©ÙÀOX[X!"¶ú†k4Dµcý*{üñÇËÀÓ¯!‚oÔÛ?RÅøuêÖ?ÞJÁt­‰Ý…4ʈàÖóç+˜¡—§4q)t! MZ@”«!Ïiž£2ˆbÈM…+UóoWNœ=ûã¯?˜ µŸƒFhc 2ZSü*7VU oÍû P`$7!ׯ_Gj<û®Ù|wöìÙØ;Eyw–#0ãVvbÏ\ÃÒÔžJðÖ„¬P÷Àª-ŒôNV½Jž²¶°^Ð\Ì-r÷6(•ŠUT›í&¤ÌbbÕ{[¨Å¤¹­—ŠƒUK±llšXù\¸l ›å’@GoÍhÙÀó,Hàøò¨nŸõFç5· îÜA ‚G×Çþ±ê;³ t³Ažâ4,ƒht,b^Ç^ÛÚ² âÛbyw&ˆê6èØžJÃÞšÔJñA½cu?FÈë¶Gr2qàÔýT.PY…yû˜oUà£±Ô ¤š ªÛ .tòÖ¤Ò>úÁŒ$Ð'ýhFðŒ{ý쬧(½ÀÓô$êd6pØ[“ˆü•rÀ‡l üÑ?!‚“÷Y ƒ†9!ÐÑ[“H}5ƒ…@Øf™ÁÙâ(R:zkFË~ì'ÁIÍàlq%½5õz`Éï 5°„šÌ•s¶8ŠÎÞšz[XŠ@[Øw'„p¶8 –Àùš[3 „BÓj£î­BÓk>{g…ý­ ¹×¼8yF(H …• 0,)ÎABsL êzÔ’G]¼­ZÍfËU@YœËÜñj¡5Ç´óÉ w ™´o·ãS< s:— ÓˆÔg®>Ô»!_DÖ} þ†šzôðf¼ú ö2x22—H…óªì âiÍwÑê\,Mêâ£{UêY3E^Í9]êÆÜ±"^èN‘uÍß©™ IØm¤AºØé†Ñ“‘¹D*úfïžPu.=MôÅ3dÍy.er™o“qú«sGÄnˆx¡9¡ÔßIAîjä.ÙÎÊQlHø“æÉÈ\"}ùºµ•Qç29!Ñx†¬™"ϲº‰tÂzæ‰H>Í5Rœ9Ï4uïVº08ERC&ÎneârQnfâ£'#[pŸ›5ûsY8b*¦¬™"ϰºÙîZ7Ѷ>:¾¼†-aÖA @׺œ[s¤&Œ+ARwDî9ïIý µ$Ü3¼¬¯%•šÉ“Ñ‚@ЋÇ[Å‘çbib¿F-Ÿ5y”…6pMJ¤³—ákT@׺›[s¤&p|Mýˆ®­ßAýq_;Ñ.Hn¢•9Ê\Ð5ŽÞštÍL«ï níø@–â {p"û^v`QúU®‘—ªÖ» ©zâ(”h'Zðv<*œ{¼5隥~9ÑèB܇«ÅÆa·¡{pB÷Jr"ç]'~%{Íêj&ðT#«Ä…ìNöDðrfÄȰ“ÛÀaoM:&Òaâ–PËè]Ô½— xŽìÆ|(dБÜ@¯òåã‘NZ´ðÖ¤hf©”Bn¹ôÍ<8ÑÄ›°m€Ž ç^ùŸöàËz^¶…-¼5U2f®›è$RF6ÐCA`du¡_Žá&|há­I'Ð<Êò†‰@êÁ 7û¥|!ã;1FV‰ŸàMø§„c¸ ±ðÖ¤hÊÅAÝD õàÄmáFñÀ»† 0ºJ\Ø»à ि å­é߈n@8óš´gÂ8Þš‚@!{Ñ7F(d¯¹î%4 …+A P¸ …«ù%0ì¡„܉˜;ÃΛ;Í1AßN„&’ P(\ …• P(\ …ÂÕÄNà­é½€ pæåŠ@¹H'u×û©Nâ­é½€ pæåÎ'ÎUÄÞ[3% UÝÛh1­ p$PŸð×^ŠisÑ]}ƒG`vÄ]ÁÇû*Ù{k¦*UMä×ZÑ ÈÝ\±f{ý& ø—K!~]wÞš)ªá]Gü‘.„Êmm H6Fd»„ç>ÇÃQÂu:×Ç–ú˜l˜I!¿ä–@Õ­·&îŽÚ,ûOpG`;®ILjìV¥|ƒ G ÿøqŒ~|K2̤orM jkÃÞ[1˜/êEÒ1"7ÈÈv ÅJ1«¦³F‡™òMî 4ÈÞ[¥z @ êEÒ1"›²~X¡#rcK5)ä“tïC ½·&q IV¢ÒF‹\N(1"™ ¤ [¨òI:Ûã8skjmáv®Ù×ФcD²z £ÕÙØ’=S½PÈ7Mxž¹5ÍÏé@‘lŒÈîn ã0¤- ÓÇ–äÇ·ú©I Œ†€W¿‰ÈB“ KšX‚ÀÐ$ W‚@¡p% WsL`ØŽ°B®4¿Æ„fBóK`Øyr'A P¸ …+A P¸òŒÀP¼7³¯‰ŒŒ÷¦óçü~÷îÏ?ßý=èœ Ùi2èÆ{S­à5±ûf}0‚Ýž—û÷ŸïÞøúÆÝŸ'A°;ö„xÝ ’Y0Mxvá½Yg3j"÷M M«€è=xðàîÏtF ª,à…¡ú@G‚@diÐä†ÇfÓvs“z³hÇUϯyÞ¤xvš§1Þ›’>³zxõÀ!x÷Áï„@ÍÒz ®,h5­úÀÍÛ]¤(ƒø!ʼ£é´ÝܤÞ,Z¡èù5Ï›tœ†@ ïÍ»™áÒ Þõ¾4&¨þ®Þ…w‡ê)ma¨>Б Çx•gô($¶››N”E;x~Íó&l ïÍ=ïKc‚¶0¤"ȵ…ùµVcЪ* ï¯ãOñcU‚§‹gÓvs²h¢è¨ÉëF9yo¶Öò=ëCSh’ç¨1ò@8L ¡ú@G‚@j#šÚñ„ÊE­"{ȦíædÑD[ØQ·…ǔǷd5Ño"~~Àý&¢Õñ´0TèHx?zH‚“‚)ô ›¶›#F;nŠçNšôy`4ìïÂâ7?$úÆ…+¯êáH8ûò¨-’³/q W‚@¡p% W‚@¡p% W‚@¡p6}³¸ßeÇï½%œ}ùFà÷¦ PÈJžèÊ{S(d%ol ïÍT}ÐfŒeGàCø"ðI¯TMA`2Þ'wáJ±Vi·K ¹ ¬ÿµ+<Š—õu½JŽcä†À” p΄ x ¸mK Ö¤ £©(xÿþöÊ­í•wÛ6õÀé$Œ¦ ÷£B ¸¿‚uGÀ³‘!“ pQ¥»0/Aà¢H(®BáJ(®x77#G É’7 xw*! üøXŒÚ!šøçD~Î=†ÂúB„ ^µãÿ\û*fÆIEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/dataaccess-chapt.html0000644000175000017500000053145312007567744022052 0ustar renerene Chapter 7. Data Access and Change

                  Chapter 7. Data Access and Change

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5039 $

                  Copyright 2010-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  Overview

                  HyperSQL data access and data change statements are fully compatible with the latest SQL:2008 Standard. There are a few extensions and some relaxation of rules, but these do not affect statements that are written to the Standard syntax. There is full support for classic SQL, as specified by SQL-92, and many enhancements added in later versions of the standard.

                  Cursors And Result Sets

                  An SQL statement can executed in two ways. One way is to use the java.sql.Statement interface. The Statement object can be reused to execute completely different SQL statements. Alternatively a PreparedStatment can be used to execute an SQL statement repeatedly, and the statements can be parameterized. Using either form, if the SQL statement is a query expression, a ResultSet is returned.

                  In SQL, when a query expression (SELECT or similar SQL statement) is executed, an ephemeral table is created. When this table is returned to the application program, it is returned as a result set, which is accessed row-by-row by a cursor. A JDBC ResultSet represents an SQL result set and its cursor.

                  The minimal definition of a cursor is a list of rows with a position that can move forward. Some cursors also allow the position to move backwards or jump to any position in the list.

                  An SQL cursor has several attributes. These attributes depend on the query expression. Some of these attributes can be overridden by specifying qualifiers in the SQL statement or by specifying values for the parameters of the JDBC Statement or PreparedStatement.

                  Columns and Rows

                  The columns of the rows of the result set are determined by the query expression. The number of columns and the type and name characteristics of each column are known when the query expression is compiled and before its execution. This metadata information remains constant regardless of changes to the contents of the tables used in the query expression. The metadata for the JDBC ResultSet is in the form of a ResultSetMetaData object. Various methods of the ResultSetMetaData interface return different properties of each column of the ResultSet.

                  A result set may contain 0 or more rows. The rows are determined by the execution of the query expression.

                  The setMaxRows(int) method of JDBC Statement allows limiting the number of rows returned by the statement. This limit is conceptually applied after the result has been built, and the excess rows are discarded.

                  Navigation

                  A cursor is either scrollable or not. Scrollable cursors allow accessing rows by absolute or relative positioning. No-scroll cursors only allow moving to the next row. The cursor can be optionally declared with the SQL qualifiers SCROLL, or NO SCROLL. The JDBC statement parameter can be specified as: TYPE_FORWARD_ONLY and TYPE_SCROLL_INSENSITIVE. The JDBC type TYPE_SCROLL_SENSITIVE is not supported by HSQLDB.

                  The default is NO SCROLL or TYPE_FORWARD_ONLY.

                  When a JDBC ResultSet is opened, it is positioned before the first row. Using the next() method the position is moved to the first row. While the ResultSet is positioned on a row, various getter methods can be used to access the columns of the row.

                  Updatability

                  The result returned by some query expressions is updatable. HSQLDB supports core SQL updatability features, plus some enhancements from the SQL optional features.

                  A query expression is updatable if it is a SELECT from a single underlying base table (or updatable view) either directly or indirectly. A SELECT statement featuring DISTINCT or GROUP BY or FETCH, LIMIT, OFFSET is not updatable. In an updatable query expression, one or more columns are updatable. An updatable column is a column that can be traced directly to the underlying table. Therefore, columns that contain expressions are not updatable. Examples of updatable query expressions are given below. The view V is updatable when its query expression is updatable. The SELECT statement from this view is also updatable:

                  SELECT A, B FROM T WHERE C > 5
                  SELECT A, B FROM (SELECT * FROM T WHERE C > 10) AS TT WHERE TT.B <10
                  CREATE VIEW V(X,Y) AS SELECT A, B FROM T WHERE C > 0 AND B < 10
                  SELECT X FROM V WHERE Y = 5
                  

                  If a cursor is declared with the SQL qualifier, FOR UPDATE OF <column name list>, then only the stated columns in the result set become updatable. If any of the stated columns is not actually updatable, then the cursor declaration will not succeed.

                  If the SQL qualifier, FOR UPDATE is used, then all the updatable columns of the result set become updatable.

                  If a cursor is declared with FOR READ ONLY, then it is not updatable.

                  In HSQLDB, if FOR READ ONLY or FOR UPDATE is not used then all the updatable columns of the result set become updatable. This relaxes the SQL standard rule that in this case limits updatability to only simply updatable SELECT statements (where all columns are updatable).

                  In JDBC, CONCUR_READ_ONLY or CONCUR_UPDATABLE can be specified for the Statement parameter. CONCUR_UPDATABLE is required if the returning ResultSet is to be updatable. If CONCUR_READ_ONLY, which is the default, is used, then even an updatable ResultSet becomes read-only.

                  When a ResultSet is updatable, various setter methods can be used to modify the column values. The names of the setter methods begin with "update". After all the updates on a row are done, the updateRow() method must be called to finalise the row update.

                  An updatable ResultSet may or may not be insertable-into. In an insertable ResultSet, all columns of the result are updatable and any column of the base table that is not in the result must be a generated column or have a default value.

                  In the ResultSet object, a special pseudo-row, called the insert row, is used to populate values for insertion into the ResultSet (and consequently, into the base table). The setter methods must be used on all the columns, followed by a call to insertRow().

                  Individual rows from all updatable result sets can be deleted one at a time. The deleteRow() is called when the ResultSet is positioned on a row.

                  While using an updatable ResultSet to modify data, it is recommended not to change the same data using another ResultSet and not to execute SQL data change statements that modify the same data.

                  Sensitivity

                  The sensitivity of the cursor relates to visibility of changes made to the data by the same transaction but without using the given cursor. While the result set is open, the same transaction may use statements such as INSERT or UPDATE, and change the data of the tables from which the result set data is derived. A cursor is SENSITIVE if it reflects those changes. It is INSENSITIVE if it ignores such changes. It is ASENSITIVE if behaviour is implementation dependent.

                  The SQL default is ASENSITIVE, i.e., implantation dependent.

                  In HSQLDB all cursors are INSENSITIVE. They do not reflect changes to the data made by other statements.

                  Holdability

                  A cursor is holdable if the result set is not automatically closed when the current transaction is committed. Holdability can be specified in the cursor declaration using the SQL qualifiers WITH HOLD or WITHOUT HOLD.

                  In JDBC, holdability is specified using either of the following values for the Statement parameter: HOLD_CURSORS_OVER_COMMIT, or CLOSE_CURSORS_AT_COMMIT.

                  The SQL default is WITHOUT HOLD.

                  The JDBC default for HSQLDB result sets is WITH HOLD for read-only result sets and WITHOUT HOLD for updatable result sets.

                  If the holdability of a ResultSet is specified in a conflicting manner in the SQL statement and the JDBC Statement object, the JDBC setting takes precedence.

                  Autocommit

                  The autocommit property of a connection is a feature of JDBC and ODBC and is not part of the SQL Standard. In autocommit mode, all transactional statements are followed by an implicit commit. In autocommit mode, all ResultSet objects are read-only and holdable.

                  JDBC Overview

                  The JDBC settings, ResultSet.CONCUR_READONLY and ResultSet.CONCUR_UPDATABLE are the available alternatives for read-only or updatability. The default is ResultSet.CONCUR_READONLY.

                  The JDBC settings, ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.TYPE_SCROLL_SENSITIVE are the available alternatives for both scrollability (navigation) and sensitivity. HyperSQL does not support ResultSet.TYPE_SCROLL_SENSITIVE. The two other alternatives can be used for both updatable and read-only result sets.

                  The JDBC settings ResultSet.CLOSE_CURSORS_AT_COMMIT and ResultSet.HOLD_CURSORS_OVER_COMMIT are the alternatives for the lifetime of the result set. The default is ResultSet.CLOSE_CURSORS_AT_COMMIT. The other setting can only be used for read-only result sets.

                  Examples of creating statements for updatable result sets are given below:

                  Connection c = newConnection();
                  Statement st;
                  c.setAutoCommit(false);
                  st = c.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
                  st = c.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

                  JDBC Parameters

                  When a JDBC PreparedStatement or CallableStatement is used with an SQL statement that contains dynamic parameters, the data types of the parameters are resolved and determined by the engine when the statement is prepared. The SQL Standard has detailed rules to determine the data types and imposes limits on the maximum length or precision of the parameter. HyperSQL applies the standard rules with two exceptions for parameters with String and BigDecimal Java types. HyperSQL ignores the limits when the parameter value is set, and only enforces the necessary limits when the PreparedStatement is executed. In all other cases, parameter type limits are checked and enforce when the parameter is set.

                  In the example below the setString() calls do not raise an exception, but one of the execute() statements does.

                  // table definition: CREATE TABLE T (NAME VARCHAR(12), ...)
                  Connection c = newConnection();
                  PreparedStatement st = c.prepareStatement("SELECT * FROM T WHERE NAME = ?");
                  // type of the parameter is VARCHAR(12), which limits length to 12 characters
                  st.setString(1, "Eyjafjallajokull"); // string is longer than type, but no exception is raised here
                  set.execute(); // executes with no exception and does not find any rows
                  
                  // but if an UPDATE is attempted, an exception is raised
                  st = c.prepareStatement("UPDATE T SET NAME = ? WHERE ID = 10");
                  st.setString(1, "Eyjafjallajokull"); // string is longer than type, but no exception is raised here
                  st.execute(); // exception is thrown when HyperSQL checks the value for update
                  
                  

                  All of the above also applies to setting the values in new and updated rows in updatable ResultSet objects.

                  JDBC parameters can be set with any compatible type, as supported by the JDBC specification. For CLOB and BLOB types, you can use streams, or create instances of BLOB or CLOB before assigning them to the parameters. You can even use CLOB or BLOB objects returned from connections to other RDBMS servers. The Connection.createBlob() and createClob() methods can be used to create the new LOBs. For very large LOB's the stream methods are preferable as they use less memory.

                  For array parameters, you must use a java.sql.Array object that contains the array elements before assigning to JDBC parameters. The Connection.createArrayOf(...) method can be used to create a new object, or you can use an Array returned from connections to other RDBMS servers.

                  JDBC and Data Change Statements

                  Data change statements, also called data manipulation statements (DML) such as INSERT, UPDATE, MERGE can be called with different executeUpdate() methods of java.sql.Statement and java.sql.PreparedStatement. Some of these methods allow you to specify how values for generated columns of the table are returned. These methods are documented in the JavaDoc for org.hsqldb.jdbc.JDBCStatement and org.hsqldb.jdbc.JDBCPreparedStatement. HyperSQL can return not just the generated columns, but any set of columns of the table. You can use this to retrieve the columns values that may be modified by a BEFORE TRIGGER on the table.

                  JDBC Callable Statement

                  The JDBC CallableStatement interface is used to call Java or SQL procedures that have been defined in the database. The SQL statement in the form of CALL procedureName ( ... ) with constant value arguments or with parameter markers. Note that you must use a parameter marker for OUT and INOUT arguments of the procedure you are calling. The OUT arguments should not be set before executing the callable statement.

                  After executing the statement, you can retrieve the OUT and INOUT parameters with the appropriate getXXX() method.

                  Procedures can also return one or more result sets. You should call the getResultSet() and getMoreResults() methods to retrieve the result sets one by one.

                  SQL functions can also return a table. You can call such functions the same way as procedures and retrieve the table as a ResultSet.

                  JDBC Returned Values

                  The methods of the JDBC ResultSet interface can be used to return values and to convert value to different types as supported by the JDBC specification.

                  When a CLOB and BLOB object is returned from a ResultSet, no data is transferred until the data is read by various methods of java.sql.CLOB and java.sql.BLOB. Data is streamed in large blocks to avoid excessive memory use.

                  Array objects are returned as instances of java.sql.Array.

                  Cursor Declaration

                  The DECLARE CURSOR statement is used within an SQL PROCEDURE body. In the early releases of HyperSQL 2.0, the cursor is used only to return a result set from the procedure. Therefore the cursor must be declared WITH RETURN and can only be READ ONLY.

                  DECLARE CURSOR

                  declare cursor statement

                  <declare cursor> ::= DECLARE <cursor name>

                  [ { SENSITIVE | INSENSITIVE | ASENSITIVE } ] [ { SCROLL | NO SCROLL } ]

                  CURSOR [ { WITH HOLD | WITHOUT HOLD } ] [ { WITH RETURN | WITHOUT RETURN } ]

                  FOR <query expression>

                  [ FOR { READ ONLY | UPDATE [ OF <column name list> ] } ]

                  The query expression is a SELECT statement or similar, and is discussed in the rest of this chapter. In the example below a cursor is declared for a SELECT statement. It is later opened to create the result set. The cursor is specified WITHOUT HOLD, so the result set is not kept after a commit. Use WITH HOLD to keep the result set. Note that you need to declare the cursor WITH RETURN as it is returned by the CallableStatement.

                  DECLARE thiscursor SCROLL CURSOR WITHOUT HOLD WITH RETURN FOR SELECT * FROM INFORMATION_SCHEMA.TABLES;
                  --
                  OPEN thiscursor;
                  

                  Syntax Elements

                  The syntax elements that can be used in data access and data change statements are described in this section. The SQL Standard has a very extensive set of definitions for these elements. The BNF definitions given here are sometimes simplified.

                  Literals

                  Literals are used to express constant values. The general type of a literal is known by its format. The specific type is based on conventions.

                  unicode escape elements

                  unicode escape elements

                  <Unicode escape specifier> ::= [ UESCAPE <quote><Unicode escape character><quote> ]

                  <Unicode escape value> ::= <Unicode 4 digit escape value> | <Unicode 6 digit escape value> | <Unicode character escape value>

                  <Unicode 4 digit escape value> ::= <Unicode escape character><hexit><hexit><hexit><hexit>

                  <Unicode 6 digit escape value> ::= <Unicode escape character><plus sign> <hexit><hexit><hexit><hexit><hexit><hexit>

                  <Unicode character escape value> ::= <Unicode escape character><Unicode escape character>

                  <Unicode escape character> ::= a single character than a <hexit> (a-f, A-F, 0-9), <plus sign>, <quote>, <double quote>, or <white space>

                  character literal

                  character literal

                  <character string literal> ::= [ <introducer><character set specification> ] <quote> [ <character representation>... ] <quote> [ { <separator> <quote> [ <character representation>... ] <quote> }... ]

                  <introducer> ::= <underscore>

                  <character representation> ::= <nonquote character> | <quote symbol>

                  <nonquote character> ::= any character apart from the quote symbol.

                  <quote symbol> ::= <quote><quote>

                  <national character string literal> ::= N <quote> [ <character representation>... ] <quote> [ { <separator> <quote> [ <character representation>... ] <quote> }... ]

                  <Unicode character string literal> ::= [ <introducer><character set specification> ] U<ampersand><quote> [ <Unicode representation>... ] <quote> [ { <separator> <quote> [ <Unicode representation>... ] <quote> }... ] <Unicode escape specifier>

                  <Unicode representation> ::= <character representation> | <Unicode escape value>

                  The type of a character literal is CHARACTER. The length of the string literal is the character length of the type. If the quote character is used in a string, it is represented with two quote characters. Long literals can be divided into multiple quoted strings, separated with a space or end-of-line character.

                  Unicode literals start with U& and can contain ordinary characters and unicode escapes. A unicode escape begins with the backslash ( \ ) character and is followed by four hexadecimal characters which specify the character code.

                  Example of character literals are given below:

                  'a literal'  ' string seperated'  ' into parts'
                  'a string''s literal form with quote character'
                  U&'Unicode string with Greek delta \0394 and phi \03a6 letters'
                  

                  binary literal

                  binary literal

                  <binary string literal> ::= X <quote> [ <space>... ] [ { <hexit> [ <space>... ] <hexit> [ <space>... ] }... ] <quote> [ { <separator> <quote> [ <space>... ] [ { <hexit> [ <space>... ] <hexit> [ <space>... ] }... ] <quote> }... ]

                  <hexit> ::= <digit> | A | B | C | D | E | F | a | b | c | d | e | f

                  The type of a binary literal is BINARY. The octet length of the binary literal is the length of the type. Case-insensitive hexadecimal characters are used in the binary string. Each pair of characters in the literal represents a byte in the binary string. Long literals can be divided into multiple quoted strings, separated with a space or end-of-line character.

                  X'1abACD34' 'Af'

                  bit literal

                  bit literal

                  <bit string literal> ::= B <quote> [ <bit> ... ] <quote> [ { <separator> <quote> [ <bit>... ] <quote> }... ]

                  <bit> ::= 0 | 1

                  The type of a binary literal is BIT. The bit length of the bit literal is the length of the type. Digits 0 and 1 are used to represent the bits. Long literals can be divided into multiple quoted strings, separated with a space or end-of-line character.

                  B'10001001' '00010'

                  numeric literal

                  numeric literal

                  <signed numeric literal> ::= [ <sign> ] <unsigned numeric literal>

                  <unsigned numeric literal> ::= <exact numeric literal> | <approximate numeric literal>

                  <exact numeric literal> ::= <unsigned integer> [ <period> [ <unsigned integer> ] ] | <period> <unsigned integer>

                  <sign> ::= <plus sign> | <minus sign>

                  <approximate numeric literal> ::= <mantissa> E <exponent>

                  <mantissa> ::= <exact numeric literal>

                  <exponent> ::= <signed integer>

                  <signed integer> ::= [ <sign> ] <unsigned integer>

                  <unsigned integer> ::= <digit>...

                  The type of an exact numeric literal without a decimal point is INTEGER, BIGINT, or DECIMAL, depending on the value of the literal (the smallest type that can represent the value is the type).

                  The type of an exact numeric literal with a decimal point is DECIMAL. The precision of a decimal literal is the total number of digits of the literal. The scale of the literal is the total number of digits to the right of the decimal point.

                  The type of an approximate numeric literal is DOUBLE. An approximate numeric literal always includes the mantissa and exponent, separated by E.

                  12
                  34.35
                  +12E-2
                  

                  boolean literal

                  boolean literal

                  <boolean literal> ::= TRUE | FALSE | UNKNOWN

                  The boolean literal is one of the specified keywords.

                  datetime and interval literal

                  datetime and interval literal

                  <datetime literal> ::= <date literal> | <time literal> | <timestamp literal>

                  <date literal> ::= DATE <date string>

                  <time literal> ::= TIME <time string>

                  <timestamp literal> ::= TIMESTAMP <timestamp string>

                  <date string> ::= <quote> <unquoted date string> <quote>

                  <time string> ::= <quote> <unquoted time string> <quote>

                  <timestamp string> ::= <quote> <unquoted timestamp string> <quote>

                  <time zone interval> ::= <sign> <hours value> <colon> <minutes value>

                  <date value> ::= <years value> <minus sign> <months value> <minus sign> <days value>

                  <time value> ::= <hours value> <colon> <minutes value> <colon> <seconds value>

                  <interval literal> ::= INTERVAL [ <sign> ] <interval string> <interval qualifier>

                  <interval string> ::= <quote> <unquoted interval string> <quote>

                  <unquoted date string> ::= <date value>

                  <unquoted time string> ::= <time value> [ <time zone interval> ]

                  <unquoted timestamp string> ::= <unquoted date string> <space> <unquoted time string>

                  <unquoted interval string> ::= [ <sign> ] { <year-month literal> | <day-time literal> }

                  <year-month literal> ::= <years value> [ <minus sign> <months value> ] | <months value>

                  <day-time literal> ::= <day-time interval> | <time interval>

                  <day-time interval> ::= <days value> [ <space> <hours value> [ <colon> <minutes value> [ <colon> <seconds value> ] ] ]

                  <time interval> ::= <hours value> [ <colon> <minutes value> [ <colon> <seconds value> ] ] | <minutes value> [ <colon> <seconds value> ] | <seconds value>

                  <years value> ::= <datetime value>

                  <months value> ::= <datetime value>

                  <days value> ::= <datetime value>

                  <hours value> ::= <datetime value>

                  <minutes value> ::= <datetime value>

                  <seconds value> ::= <seconds integer value> [ <period> [ <seconds fraction> ] ]

                  <seconds integer value> ::= <unsigned integer>

                  <seconds fraction> ::= <unsigned integer>

                  <datetime value> ::= <unsigned integer>

                  The type of a datetime or interval type is specified in the literal. The fractional second precision is the number of digits in the fractional part of the literal. Details are described in the SQL Language chapter

                  DATE '2008-08-08'
                  TIME '20:08:08'
                  TIMESTAMP '2008-08-08 20:08:08.235'
                  
                  INTERVAL '10' DAY
                  INTERVAL -'08:08' MINUTE TO SECOND
                  

                  References, etc.

                  References are identifier chains, which can be a single identifiers or identifiers chains composed of single identifiers chained together with the period symbol.

                  identifier chain

                  identifier chain

                  <identifier chain> ::= <identifier> [ { <period> <identifier> }... ]

                  <basic identifier chain> ::= <identifier chain>

                  A period-separated chain of identifiers. The identifiers in an identifier chain can refer to database objects in a hierarchy. The possible hierarchies are as follows. In each hierarchy, elements from the start or the end can be missing, but the order of elements cannot be changed.

                  catalog, schema, database object

                  catalog, schema, table, column

                  correlation name, column

                  Examples of identifier chain are given below:

                  SELECT MYCAT.MYSCHEMA.MYTABLE.MYCOL FROM MYCAT.MYSCHEMA.MYTABLE
                  DROP TABLE MYCAT.MYSCHEMA.MYTABLE CASCADE
                  ALTER SEQUENCE MYCAT.MYSCHEMA.MYSEQUENCE RESTART WITH 100
                  

                  column reference

                  column reference

                  <column reference> ::= <basic identifier chain> | MODULE <period> <qualified identifier> <period> <column name>

                  Reference a column or a routine variable.

                  SQL parameter reference

                  SQL parameter reference

                  <SQL parameter reference> ::= <basic identifier chain>

                  Reference an SQL routine parameter.

                  contextually typed value specification

                  contextually typed value specification

                  <contextually typed value specification> ::= <null specification> | <default specification>

                  <null specification> ::= NULL

                  <default specification> ::= DEFAULT

                  Specify a value whose data type or value is inferred from its context. DEFAULT is used for assignments to table columns that have a default value, or to table columns that are generated either as an IDENTITY value or as an expression. NULL can be used only in a context where the type of the value is known. For example, a NULL can be assigned to a column of the table in an INSERT or UPDATE statement, because the type of the column is known. But if NULL is used in a SELECT list, it must be used in a CAST statement.

                  Value Expression

                  Value expression is a general name for all expressions that return a value. Different types of expressions are allowed in different contexts.

                  value expression primary

                  value expression primary

                  <value expression primary> ::= <parenthesized value expression> | <nonparenthesized value expression primary>

                  <parenthesized value expression> ::= <left paren> <value expression> <right paren>

                  <nonparenthesized value expression primary> ::= <unsigned value specification> | <column reference> | <set function specification> | <scalar subquery> | <case expression> | <cast specification> | <next value expression> | <current value expression> | <routine invocation>

                  Specify a value that is syntactically self-delimited.

                  value specification

                  value specification

                  <value specification> ::= <literal> | <general value specification>

                  <unsigned value specification> ::= <unsigned literal> | <general value specification>

                  <target specification> ::= <host parameter specification> | <SQL parameter reference> | <column reference> | <dynamic parameter specification>

                  <simple target specification> ::= <host parameter specification> | <SQL parameter reference> | <column reference> | <embedded variable name>

                  <host parameter specification> ::= <host parameter name> [ <indicator parameter> ]

                  <dynamic parameter specification> ::= <question mark>

                  Specify one or more values, host parameters, SQL parameters, dynamic parameters, or host variables.

                  row value expression

                  row value expression

                  <row value expression> ::= <row value special case> | <explicit row value constructor>

                  <row value predicand> ::= <row value special case> | <row value constructor predicand>

                  <row value special case> ::= <nonparenthesized value expression primary>

                  <explicit row value constructor> ::= <left paren> <row value constructor element> <comma> <row value constructor element list> <right paren> |

                  ROW <left paren> <row value constructor element list> <right paren> | <row subquery>

                  Specify a row consisting of one or more elements. A comma separated list of expressions, enclosed in brackets, with the optional keyword ROW. In SQL, a row containing a single element can often be used where a single value is expected.

                  set function specification

                  set function specification

                  <set function specification> ::= <aggregate function> | <grouping operation>

                  <grouping operation> ::= GROUPING <left paren> <column reference> [ { <comma> <column reference> }... ] <right paren>

                  Specify a value derived by the application of a function to an argument. Early releases of HyperSQL 2.0 do not support <grouping operation> .

                  COALESCE

                  coalesce expression

                  <coalesce expression> := COALESCE <left paren> <value expression> { <comma> <value expression> }... <right paren>

                  Replace null values with another value. The coalesce expression has two or more instances of <value expression>. If the first <value expression> evaluates to a non-null value, it is returned as the result of the coalesce expression. If it is null, the next <value expression> is evaluated and if it evaluates to a non-non value, it is returned, and so on.

                  The type of the return value of a COALESCE expression is the aggregate type of the types of all the <value expression> instances. Therefore, any value returned is implicitly cast to this type. HyperSQL also features built-in functions with similar functionality.

                  NULLIF

                  nullif expression

                  <nullif expression> := NULLIF <left paren> <value expression> <comma> <value expression> <right paren>

                  Return NULL if two values are equal. If the result of the first <value expression> is not equal to the result of the second, then it is returned, otherwise NULL is returned. The type of the return value is the type of the first <value expression>.

                  SELECT i, NULLIF(n, 'not defined') FROM t

                  CASE

                  case specification

                  <case specification> ::= <simple case> | <searched case>

                  <simple case> ::= CASE <case operand> <simple when clause>... [ <else clause> ] END

                  <searched case> ::= CASE <searched when clause>... [ <else clause> ] END

                  <simple when clause> ::= WHEN <when operand list> THEN <result>

                  <searched when clause> ::= WHEN <search condition> THEN <result>

                  <else clause> ::= ELSE <result>

                  <case operand> ::= <row value predicand> | <overlaps predicate part 1>

                  <when operand list> ::= <when operand> [ { <comma> <when operand> }... ]

                  <when operand> ::= <row value predicand> | <comparison predicate part 2> | <between predicate part 2> | <in predicate part 2> | <character like predicate part 2> | <octet like predicate part 2> | <similar predicate part 2> | <regex like predicate part 2> | <null predicate part 2> | <quantified comparison predicate part 2> | <match predicate part 2> | <overlaps predicate part 2> | <distinct predicate part 2>

                  <result> ::= <result expression> | NULL

                  <result expression> ::= <value expression>

                  Specify a conditional value. The result of a case expression is always a value. All the values introduced with THEN must be of the same type.

                  Some simple examples of the CASE expression are given below. The first two examples return 'Britain', 'Germany', or 'Other country' depending on the value of dialcode. The third example uses IN and smaller-than predicates.

                  CASE dialcode WHEN 44 THEN 'Britain' WHEN 49 THEN 'Germany' ELSE 'Other country' END
                  CASE WHEN dialcode=44 THEN 'Britain' WHEN dialcode=49 THEN 'Germany' WHEN dialcode < 0 THEN 'bad dial code' ELSE 'Other country' END
                  CASE dialcode WHEN IN (44, 49,30) THEN 'Europe' WHEN IN (86,91,91) THEN 'Asia' WHEN < 0 THEN 'bad dial code' ELSE 'Other continent' END
                  

                  The case statement can be far more complex and involve several conditions.

                  CAST

                  cast specification

                  <cast specification> ::= CAST <left paren> <cast operand> AS <cast target> <right paren>

                  <cast operand> ::= <value expression> | <implicitly typed value specification>

                  <cast target> ::= <domain name> | <data type>

                  Specify a data conversion. Data conversion takes place automatically among variants of a general type. For example numeric values are freely converted from one type to another in expressions.

                  Explicit type conversion is necessary in two cases. One case is to determine the type of a NULL value. The other case is to force conversion for special purposes. Values of data types can be cast to a character type. The exception is BINARY and OTHER types. The result of the cast is the literal expression of the value. Conversely, a value of a character type can be converted to another type if the character value is a literal representation of the value in the target type. Special conversions are possible between numeric and interval types, which are described in the section covering interval types.

                  The examples below show examples of cast with their result:

                  CAST (NULL AS TIMESTAMP)
                  CAST ('   199  ' AS INTEGER) = 199
                  CAST ('tRue ' AS BOOLEAN) = TRUE
                  CAST (INTERVAL '2' DAY AS INTEGER) = 2
                  CAST ('1992-04-21' AS DATE) = DATE '1992-04-21'
                  

                  NEXT VALUE FOR

                  next value expression

                  <next value expression> ::= NEXT VALUE FOR <sequence generator name>

                  Return the next value of a sequence generator. This expression can be used as a select list element in queries, or in assignments to table columns in data change statements. If the expression is used more than once in a single row that is being evaluated, the same value is returned for each invocation. After evaluation of the particular row is complete, the sequence generator will return a different value from the old value. The new value is generated by the sequence generator by adding the increment to the last value it generated. In the example below the expression is used in an insert statement:

                  INSERT INTO MYTABLE(COL1, COL2) VALUES 2, NEXT VALUE FOR MYSEQUENCE
                  

                  CURRENT VALUE FOR

                  current value expression

                  <current value expression> ::= CURRENT VALUE FOR <sequence generator name>

                  Return the latest value that was returned by the NEXT VALUE FOR expression for a sequence generator. In the example below, the value that was generated by the sequence for the first insert, is reused for the second insert:

                  INSERT INTO MYTABLE(COL1, COL2) VALUES 2, NEXT VALUE FOR MYSEQUENCE;
                  INSERT INTO CHILDTABLE(COL1, COL2) VALUES 10, CURRENT VALUE FOR MYSEQUENCE;
                  

                  value expression

                  value expression

                  <value expression> ::= <numeric value expression> | <string value expression> | <datetime value expression> | <interval value expression> | <boolean value expression> | <row value expression>

                  An expression that returns a value. The value can be a single value, or a row consisting more than one value.

                  numeric value expression

                  numeric value expression

                  <numeric value expression> ::= <term> | <numeric value expression> <plus sign> <term> | <numeric value expression> <minus sign> <term>

                  <term> ::= <factor> | <term> <asterisk> <factor> | <term> <solidus> <factor>

                  <factor> ::= [ <sign> ] <numeric primary>

                  <numeric primary> ::= <value expression primary> | <numeric value function>

                  Specify a numeric value. The BNF indicates that <asterisk> and <solidus> (the operators for multiplication and division) have precedence over <minus sign> and <plus sign>.

                  numeric value function

                  numeric value function

                  <numeric value function> ::= <position expression> | <extract expression> | <length expression> ...

                  Specify a function yielding a value of type numeric. The supported numeric value functions are listed and described in the Built In Functions chapter.

                  string value expression

                  string value expression

                  <string value expression> ::= <string concatenation> | <string factor>

                  <string factor> ::= <value expression primary> | <string value function>

                  <string concatenation> ::= <string value expression> <concatenation operator> <string factor>

                  <concatenation operator> ::= ||

                  Specify a character string value, a binary string value, or a bit string value. The BNF indicates that a string value expression can be formed by concatenation of two or more <value expression primary>. The types of the <value expression primary> elements must be compatible, that is, all must be string, or binary or bit string values.

                  character value function

                  string value function

                  <string value function> ::= ...

                  Specify a function that returns a character string or binary string. The supported character value functions are listed and described in the Built In Functions chapter.

                  datetime value expression

                  datetime value expression

                  <datetime value expression> ::= <datetime term> | <interval value expression> <plus sign> <datetime term> | <datetime value expression> <plus sign> <interval term> | <datetime value expression> <minus sign> <interval term>

                  <datetime term> ::= <datetime factor>

                  <datetime factor> ::= <datetime primary> [ <time zone> ]

                  <datetime primary> ::= <value expression primary> | <datetime value function>

                  <time zone> ::= AT <time zone specifier>

                  <time zone specifier> ::= LOCAL | TIME ZONE <interval primary>

                  Specify a datetime value. Details are described in the SQL Language chapter.

                  datetime value function

                  datetime value function

                  <datetime value function> ::= ...

                  Specify a function that returns a datetime value. The supported datetime value functions are listed and described in the Built In Functions chapter.

                  interval term

                  interval value expression

                  <interval value expression> ::= <interval term> | <interval value expression 1> <plus sign> <interval term 1> | <interval value expression 1> <minus sign> <interval term 1> | <left paren> <datetime value expression> <minus sign> <datetime term> <right paren> <interval qualifier>

                  <interval term> ::= <interval factor> | <interval term 2> <asterisk> <factor> | <interval term 2> <solidus> <factor> | <term> <asterisk> <interval factor>

                  <interval factor> ::= [ <sign> ] <interval primary>

                  <interval primary> ::= <value expression primary> [ <interval qualifier> ] | <interval value function>

                  <interval value expression 1> ::= <interval value expression>

                  <interval term 1> ::= <interval term>

                  <interval term 2> ::= <interval term>

                  Specify an interval value. Details are described in the SQL Language chapter.

                  interval absolute value function

                  interval value function

                  <interval value function> ::= <interval absolute value function>

                  <interval absolute value function> ::= ABS <left paren> <interval value expression> <right paren>

                  Specify a function that returns the absolute value of an interval. If the interval is negative, it is negated, otherwise the original value is returned.

                  boolean value expression

                  boolean value expression

                  <boolean value expression> ::= <boolean term> | <boolean value expression> OR <boolean term>

                  <boolean term> ::= <boolean factor> | <boolean term> AND <boolean factor>

                  <boolean factor> ::= [ NOT ] <boolean test>

                  <boolean test> ::= <boolean primary> [ IS [ NOT ] <truth value> ]

                  <truth value> ::= TRUE | FALSE | UNKNOWN

                  <boolean primary> ::= <predicate> | <boolean predicand>

                  <boolean predicand> ::= <parenthesized boolean value expression> | <nonparenthesized value expression primary>

                  <parenthesized boolean value expression> ::= <left paren> <boolean value expression> <right paren>

                  Specify a boolean value.

                  Predicates

                  Predicates are conditions with two sides and evaluate to a boolean value. The left side of the predicate, the <row value predicand>, is the common element of all predicates. This element is a generalisation of both <value expression>, which is a scalar, and of <explicit row value constructor>, which is a row. The two sides of a predicate can be split in CASE statements where the <row value predicand> is part of multiple predicates.

                  The number of fields in all <row value predicand> used in predicates must be the same and the types of the fields in the same position must be compatible for comparison. If either of these conditions does not hold, an exception is raised. The number of fields in a row is called the degree.

                  In many types of predicates (but not all of them), if the <row value predicand> evaluates to NULL, the result of the predicate is UNKNOWN. If the <row value predicand> has more than one element, and one or more of the fields evaluate to NULL, the result depends on the particular predicate.

                  comparison predicand

                  comparison predicate

                  <comparison predicate> ::= <row value predicand> <comp op> <row value predicand>

                  <comp op> ::= <equals operator> | <not equals operator> | <less than operator> | <greater than operator> | <less than or equals operator> | <greater than or equals operator>

                  Specify a comparison of two row values. If either <row value predicand> evaluates to NULL, the result of <comparison predicate> is UNKNOWN. Otherwise, the result is TRUE, FALSE or UNKNOWN.

                  If the degree of <row value predicand> is larger than one, comparison is performed between each field and the corresponding field in the other <row value predicand> from left to right, one by one.

                  When comparing two elements, if either field is NULL then the result is UNKNOWN.

                  For <equals operator>, if the result of comparison is TRUE for all field, the result of the predicate is TRUE. If the result of comparison is FALSE for one field, the result of predicate is FALSE. Otherwise the result is UNKNOWN.

                  The <not equals operator> is translated to NOT (<row value predicand> = <row value predicand>).

                  The <less than or equals operator> is translated to (<row value predicand> = <row value predicand>) OR (<row value predicand> < <row value predicand>). The <greater than or equals operator> is translated similarly.

                  For the <less than operator> and <greater than operator>, if two fields at a given position are equal, then comparison continues to the next field. Otherwise, the result of the last performed comparison is returned as the result of the predicate. This means that if the first field is NULL, the result is always UNKNOWN.

                  The logic that governs NULL values and UNKNOWN result is as follows: Suppose the NULL values were substituted by arbitrary real values. If substitution cannot change the result of the predicate, then the result is TRUE or FALSE, based on the existing non-NULL values, otherwise the result of the predicate is UNKNOWN.

                  The examples of comparison given below use literals, but the literals actually represent the result of evaluation of some expression.

                  ((1, 2, 3, 4) = (1, 2, 3, 4)) IS TRUE
                  ((1, 2, 3, 4) = (1, 2, 3, 5)) IS FALSE
                  ((1, 2, 3, 4) < (1, 2, 3, 4)) IS FALSE
                  ((1, 2, 3, 4) < (1, 2, 3, 5)) IS TRUE
                  ((NULL, 1, NULL) = (NULL, 1, NULL)) IS UNKNOWN  
                  ((NULL, 1, NULL) = (NULL, 2, NULL)) IS FALSE  
                  ((NULL, 1, NULL) <> (NULL, 2, NULL)) IS TRUE  
                  ((NULL, 1, 2) <all operators> (NULL, 1, 2)) IS UNKNOWN
                  ((1, NULL, ...) < (1, 2, ...)) IS UNKNOWN  
                  ((1, NULL, ...) < (2, NULL, ...)) IS TRUE
                  ((2, NULL, ...) < (1, NULL, ...)) IS FALSE
                  

                  BETWEEN

                  between predicate

                  <between predicate> ::= <row value predicand> <between predicate part 2>

                  <between predicate part 2> ::= [ NOT ] BETWEEN [ ASYMMETRIC | SYMMETRIC ] <row value predicand> AND <row value predicand>

                  Specify a range comparison. The default is ASYMMETRIC. The expression X BETWEEN Y AND Z is equivalent to (X >= Y AND X <= Z). Therefore if Y > Z, the BETWEEN expression is never true. The expression X BETWEEN SYMMETRIC Y AND Z is equivalent to (X >= Y AND X <= Z) OR (X >= Z AND X <= Y). The expression Z NOT BETWEEN ... is equivalent to NOT (Z BETWEEN ...). If any of the three <row value predicand> evaluates to NULL, the result is UNKNOWN.

                  IN

                  in predicate

                  <in predicate> ::= <row value predicand> [ NOT ] IN <in predicate value>

                  <in predicate value> ::= <table subquery> | <left paren> <in value list> <right paren>

                  | <left paren> UNNEST <left paren> <array value expression> <right paren> <right paren>

                  <in value list> ::= <row value expression> [ { <comma> <row value expression> }... ]

                  Specify a quantified comparison. The expression X NOT IN Y is equivalent to NOT (X IN Y). The ( <in value list> ) is converted into a table with one or more rows. The expression X IN Y is equivalent to X = ANY Y, which is a <quantified comparison predicate>.

                  If the <table subquery> returns no rows, the result is FALSE. Otherwise the <row value predicand> is compared one by one with each row of the <table subquery>.

                  If the comparison is TRUE for at least one row, the result is TRUE. If the comparison is FALSE for all rows, the result is FALSE. Otherwise the result is UNKNOWN.

                  HyperSQL supports an extension to the SQL Standard to allow an array to be used in the <in predicate value>. This is intended to be used with prepared statements where a variable length array of values can be used as the parameter value for each call. The example below shows how this is used in SQL. The JDBC code must create a new java.sql.Array object that contains the values and set the parameter with this array.

                  SELECT * FROM customer WHERE firstname IN ( UNNEST(?) )
                  
                  Connection conn;
                  PreparedStatement ps;
                  // conn and ps are instantiated here
                  Array arr = conn.createArrayOf("INTEGER", new Integer[] {1, 2, 3});
                  ps.setArray(1, arr);
                  ResultSet rs = ps.executeQuery();
                  

                  LIKE

                  like predicate

                  <like predicate> ::= <character like predicate> | <octet like predicate>

                  <character like predicate> ::= <row value predicand> [ NOT ] LIKE <character pattern> [ ESCAPE <escape character> ]

                  <character pattern> ::= <character value expression>

                  <escape character> ::= <character value expression>

                  <octet like predicate> ::= <row value predicand> [ NOT ] LIKE <octet pattern> [ ESCAPE <escape octet> ]

                  <octet pattern> ::= <binary value expression>

                  <escape octet> ::= <binary value expression>

                  Specify a pattern-match comparison for character or binary strings. The <row value predicand> is always a <string value expression> of character or binary type. The <character pattern> or <octet pattern> is a <string value expression> in which the underscore and percent characters have special meanings. The underscore means match any one character, while the percent means match a sequence of zero or more characters. The <escape character> or <escape octet> is also a <string value expression> that evaluates to a string of exactly one character length. If the underscore or the percent is required as normal characters in the pattern, the specified <escape character> or <escape octet> can be used in the pattern before the underscore or the percent. The <row value predicand> is compared with the <character pattern> and the result of comparison is returned. If any of the expressions in the predicate evaluates to NULL, the result of the predicate is UNKNOWN. The expression A NOT LIKE B is equivalent to NOT (A LIKE B). If the length of the escape is not 1 or it is used in the pattern not immediately before an underscore or a percent character, an exception is raised.

                  IS NULL

                  null predicate

                  <null predicate> ::= <row value predicand> IS [ NOT ] NULL

                  Specify a test for a null value. The expression X IS NOT NULL is NOT equivalent to NOT (X IS NULL)if the degree of the <row value predicand> is larger than 1. The rules are: If all fields are null, X IS NULL is TRUE and X IS NOT NULL is FALSE. If only some fields are null, both X IS NULL and X IS NOT NULL are FALSE. If all fields are not null, X IS NULL is FALSE and X IS NOT NULL is TRUE.

                  ALL and ANY

                  quantified comparison predicate

                  <quantified comparison predicate> ::= <row value predicand> <comp op> <quantifier> <table subquery>

                  <quantifier> ::= <all> | <some>

                  <all> ::= ALL

                  <some> ::= SOME | ANY

                  Specify a quantified comparison. For a quantified comparison, the <row value predicand> is compared one by one with each row of the <table sub query>.

                  If the <table subquery> returns no rows, then if ALL is specified the result is TRUE, but if SOME or ANY is specified the result is FALSE.

                  If ALL is specified, if the comparison is TRUE for all rows, the result of the predicate is TRUE. If the comparison is FALSE for at least one row, the result is FALSE. Otherwise the result is UNKNOWN.

                  If SOME or ANY is specified, if the comparison is TRUE for at least one row, the result is TRUE. If the comparison is FALSE for all rows, the result is FALSE. Otherwise the result is UNKNOWN. Note that the IN predicate is equivalent to the SOME or ANY predicate using the <equals operator>.

                  In the examples below, the date of an invoice is compared to holidays in a given year. In the first example the invoice date must equal one of the holidays, in the second example it must be later than all holidays (later than the last holiday), in the third example it must be on or after some holiday (on or after the first holiday), and in the fourth example, it must be before all holidays (before the first holiday).

                  invoice_date = SOME (SELECT holiday_date FROM holidays)
                  invoice_date > ALL (SELECT holiday_date FROM holidays)
                  invoice_date >= ANY (SELECT holiday_date FROM holidays)
                  invoice_date < ALL (SELECT holiday_date FROM holidays)
                  

                  EXISTS

                  exists predicate

                  <exists predicate> ::= EXISTS <table subquery>

                  Specify a test for a non-empty set. If the evaluation of <table subquery> results in one or more rows, then the expression is TRUE, otherwise FALSE.

                  UNIQUE

                  unique predicate

                  <unique predicate> ::= UNIQUE <table subquery>

                  Specify a test for the absence of duplicate rows. The result of the test is either TRUE or FALSE (never UNKNOWN). The rows of the <table subquery> that contain one or more NULL values are not considered for this test. If the rest of the rows are distinct from each other, the result of the test is TRUE, otherwise it is FALSE. The distinctness of rows X and Y is tested with the predicate X IS DISTINCT FROM Y.

                  MATCH

                  match predicate

                  <match predicate> ::= <row value predicand> MATCH [ UNIQUE ] [ SIMPLE | PARTIAL | FULL ] <table subquery>

                  Specify a test for matching rows. The default is MATCH SIMPLE without UNIQUE. The result of the test is either TRUE or FALSE (never UNKNOWN).

                  The interpretation of NULL values is different from other predicates and quite counter-intuitive. If the <row value predicand> is NULL, or all of its fields are NULL, the result is TRUE.

                  Otherwise, the <row value predicand> is compared with each row of the <table subquery>.

                  If SIMPLE is specified, if some field of <row value predicate> is NULL, the result is TRUE. Otherwise if <row value predicate> is equal to one or more rows of <table subquery> the result is TRUE if UNIQUE is not specified, or if UNIQUE is specified and only one row matches. Otherwise the result is FALSE.

                  If PARTIAL is specified, if the non-null values <row value predicate> are equal to those in one or more rows of <table subquery> the result is TRUE if UNIQUE is not specified, or if UNIQUE is specified and only one row matches. Otherwise the result is FALSE.

                  If FULL is specified, if some field of <row value predicate> is NULL, the result is FALSE. Otherwise if <row value predicate> is equal to one or more rows of <table subquery> the result is TRUE if UNIQUE is not specified, or if UNIQUE is specified and only one row matches.

                  Note that MATCH can also used be used in FOREIGN KEY constraint definitions. The exact meaning is described in the Schemas and Database Objects chapter.

                  OVERLAPS

                  overlaps predicate

                  <overlaps predicate> ::= <row value predicand> OVERLAPS <row value predicand>

                  Specify a test for an overlap between two datetime periods. Each <row value predicand> must have two fields and the fields together represent a datetime period. So the predicates is always in the form (X1, X2) OVERLAPS (Y1, Y2). The first field is always a datetime value, while the second field is either a datetime value or an interval value.

                  If the second value is an interval value, it is replaced with the sum of the datetime value and itself, for example (X1, X1 + X2) OVERLAPS (Y1, Y1 + Y 2).

                  If any of the values is NULL, the result is UNKNOWN.

                  The expression is true if there is there is any overlap between the two datetime periods. In the example below, the period is compared with a week long period ending yesterday.

                  (startdate, enddate) OVERLAPS (CURRENT_DATE - 7 DAY, CURRENT_DATE - 1 DAY)

                  IS DISTINCT

                  is distinct predicate

                  <distinct predicate> ::= <row value predicand> IS [ NOT ] DISTINCT FROM <row value predicand>

                  Specify a test of whether two row values are distinct. The result of the test is either TRUE or FALSE (never UNKNOWN). The degree the two <row value predicand> must be the same. Each field of the first <row value predicand> is compared to the field of the second <row value predicand> at the same position. If one field is NULL and the other is not NULL, or if the elements are NOT equal, then the result of the expression is TRUE. If no comparison result is TRUE, then the result of the predicate is FALSE. The expression X IS NOT DISTINCT FROM Y is equivalent to NOT (X IS DISTINCT FORM Y). The following check returns true if startdate is not equal to enddate. It also returns true if either startdate or enddate is NULL. It returns false in other cases.

                  startdate IS DISTINCT FROM enddate

                  Aggregate Functions

                  aggregate function

                  aggregate function

                  <aggregate function> ::= COUNT <left paren> <asterisk> <right paren> [ <filter clause> ] | <general set function> [ <filter clause> ] | <array aggregate function> [ <filter clause> ]

                  <general set function> ::= <set function type> <left paren> [ <set quantifier> ] <value expression> <right paren>

                  <set function type> ::= <computational operation>

                  <computational operation> ::= AVG | MAX | MIN | SUM | EVERY | ANY | SOME | COUNT | STDDEV_POP | STDDEV_SAMP | VAR_SAMP | VAR_POP | MEDIAN

                  <set quantifier> ::= DISTINCT | ALL

                  <filter clause> ::= FILTER <left paren> WHERE <search condition> <right paren>

                  <array aggregate function> ::= { ARRAY_AGG | GROUP_CONCAT } <left paren> [ <set quantifier> ] <value expression> [ <order by clause> ] [ SEPARATOR <separator> ] <right paren>

                  <separator> ::= <character string literal>

                  Specify a value computed from a collection of rows.

                  An aggregate function is used exclusively in a <query specification> and its use transforms a normal query into an aggregate query returning a single row instead of the multiple rows that the original query returns. For example, SELECT acolumn <table expression> is a query that returns the value of acolumn for all the rows the satisfy the given condition. But SELECT MAX(acolumn) <table expression> returns only one row, containing the largest value in that column. The query SELECT COUNT(*) <table expression> returns the count of rows, while SELECT COUNT(acolumn) <table expression> returns the count of rows where acolumn IS NOT NULL.

                  If the <table expression> is a grouped table (has a GROUP BY clause), the aggregate function returns the result of the COUNT or <computational operation> for each group. In this case the result has the same number of rows as the original grouped query. For example SELECT SUM(acolumn) <table expression> when <table expression> has a GROUP BY clause, returns the sum of values for acolumn in each group.

                  The SUM operations can be performed on numeric and interval expressions only. AVG and MEDIAN can be performed on numeric, interval or datetime expressions. AVG returns the average value, while SUM returns the sum of all values. If all values are NULL, the operations return NULL. MEDIAN returns the middle value in the sorted list of values.

                  MAX and MIN can be performed on all types of expressions and return the minimum or the maximum value. If all values are NULL, the operations return NULL.

                  COUNT(*) returns the count of all values, including nulls, while COUNT(<value expression>) returns the count of non-NULL values. COUNT with DISTINCT also accepts multiple arguments. In this usage the distinct combinations of the arguments are counted. Examples below:

                  SELECT COUNT(DISTINCT firstname, lastname) FROM customer
                  SELECT COUNT(DISTINCT (firstname, lastname)) FROM customer
                  

                  The EVERY, ANY and SOME operations can be performed on boolean expressions only. EVERY returns TRUE if all the values are TRUE, otherwise FALSE. ANY and SOME are the same operation and return TRUE if one of the values is TRUE, otherwise it returns FALSE.

                  The other operations perform the statistical functions STDDEV_POP, STDDEV_SAMP, VAR_SAMP, VAR_POP on numeric values. NULL values are ignored in calculations.

                  User defined aggregate functions can be defined and used instead of the built-in aggregate functions. Syntax and examples are given in the SQL-Invoked Routines chapter.

                  The <filter clause> allows you to add a search condition. When the search condition evaluates to TRUE for a row, the row is included in aggregation. Otherwise the row is not included. In the example below a single query returns two different filtered counts:

                  SELECT COUNT(ITEM) FILTER (WHERE GENDER = 'F') AS "FEMALE COUNT", COUNT(ITEM) FILTER (WHERE GENDER = 'M') AS "MALE COUNT" FROM PEOPLE
                  

                  ARRAY_AGG is different from all other aggregate functions, as it does not ignore the NULL values. This set function returns an array that contains all the values, for different rows, for the <value expression>. For example, if the <value expression> is a column reference, the SUM function adds the values for all the row together, while the ARRAY_AGG function adds the value for each row as a separate element of the array. ARRAY_AGG can include an optional <order by clause>. If this is used, the elements of the returned array are sorted according to the <order by clause>, which can reference all the available columns of the query, not just the <value expression> that is used as the ARRAY_AGG argument. The <order by clause> can have multiple elements and each element can include NULLS LAST or DESC qualifiers. No <separator> is used with this function.

                  GROUP_CONCAT is a specialised function derived from ARRAY_AGG. This function computes the array in the same way as ARRAY_AGG, removes all the NULL elements, then returns a string that is a concatenation of the elements of the array. If <separator> has been specified, it is used to separate the elements of the array. Otherwise the comma is used to separate the elements.

                  The example below shows a grouped query with ARRAY_AGG and GROUP_CONCAT. The CUSTOMER table that is included for tests in the DatabaseManager GUI app is the source of the data.

                  SELECT LASTNAME, ARRAY_AGG(FIRSTNAME ORDER BY FIRSTNAME) FROM Customer  GROUP BY LASTNAME
                  
                  LASTNAME  C2                                                         
                  --------- ---------------------------------------------------------- 
                  Steel     ARRAY['John','John','Laura','Robert']                      
                  King      ARRAY['George','George','James','Julia','Robert','Robert'] 
                  Sommer    ARRAY['Janet','Robert']                                    
                  
                  SELECT LASTNAME, GROUP_CONCAT(DISTINCT FIRSTNAME ORDER BY FIRSTNAME DESC SEPARATOR ' * ') FROM Customer  GROUP BY LASTNAME
                  
                  LASTNAME  C2                                                
                  --------- ------------------------------------------------- 
                  Steel     Robert * Laura * John                   
                  King      Robert * Julia * James * George         
                  Sommer    Robert * Janet

                  Other Syntax Elements

                  search condition

                  search condition

                  <search condition> ::= <boolean value expression>

                  Specify a condition that is TRUE, FALSE, or UNKNOWN. A search condition is often a predicate.

                  PATH

                  path specification

                  <path specification> ::= PATH <schema name list>

                  <schema name list> ::= <schema name> [ { <comma> <schema name> }... ]

                  Specify an order for searching for a user-defined SQL-invoked routine. This is not currently supported by HyperSQL.

                  routine invocation

                  routine invocation

                  <routine invocation> ::= <routine name> <SQL argument list>

                  <routine name> ::= [ <schema name> <period> ] <qualified identifier>

                  <SQL argument list> ::= <left paren> [ <SQL argument> [ { <comma> <SQL argument> }... ] ] <right paren>

                  <SQL argument> ::= <value expression> | <target specification>

                  Invoke an SQL-invoked routine. Examples are given in the SQL-Invoked Routines chapter.

                  COLLATE

                  collate clause

                  <collate clause> ::= COLLATE <collation name>

                  Specify a collation for a column or for an ORDER BY expression. This collation is used for comparing the values of the column in different rows. Comparison can happens during the execution of SELECT, UPDATE or DELETE statements, when a UNIQUE constraint or index is defined on the column, or when the the rows are sorted by an ORDER BY clause.

                  CONSTRAINT

                  constraint name definition

                  <constraint name definition> ::= CONSTRAINT <constraint name>

                  <constraint characteristics> ::= <constraint check time> [ [ NOT ] DEFERRABLE ] | [ NOT ] DEFERRABLE [ <constraint check time> ]

                  <constraint check time> ::= INITIALLY DEFERRED | INITIALLY IMMEDIATE

                  Specify the name of a constraint and its characteristics. This is an optional element of CONSTRAINT definition, not yet supported by HyperSQL.

                  Data Access Statements

                  HyperSQL fully supports all of SQL-92 data access statements, plus some additions from SQL:2008. Due to time constraints, the current version of this Guide does not cover the subject fully. You are advised to consult an SQL book such as the recent O'Reilly title "SQL and Relational Theory" by C. J. Date.

                  Database queries are data access statements. The most commonly used data access statement is the SELECT statement, but there are other statements that perform a similar role. Data access statements access tables and return result tables. The returned result tables are falsely called result sets, as they are not necessarily sets of rows, but multisets of rows.

                  Result tables are formed by performing the following operations on base tables and views. These operations are loosely based on Relational Algebra.

                  JOIN operations

                  SET and MULTISET operations

                  SELECTION

                  PROJECTION

                  COMPUTING

                  COLUMN NAMING

                  GROUPING and AGGREGATION

                  SELECTION AFTER GROUPING OR AGGREGATION

                  SET and MULTISET (COLLECTION) OPERATIONS

                  ORDERING

                  SLICING

                  Conceptually, the operations are performed one by one in the above order if they apply to the given data access statement. In the example below a simple select statement is made more complex by adding various operations.

                  CREATE TABLE atable (a INT, b INT, c INT, d INT, e INT, f INT);
                  /* in the next SELECT, no join is performed and no further operation takes place */
                  SELECT * FROM atable
                  /* in the next SELECT, selection is performed by the WHERE clause, with no further action */
                  SELECT * FROM atable WHERE a + b = c
                  /* in the next SELECT, projection is performed after the other operations */
                  SELECT d, e, f FROM atable WHERE a + b = c
                  /* in the next SELECT, computation is performed after projection */
                  SELECT (d + e) / f FROM atable WHERE a + b = c
                  /* in the next two SELECT statements, column naming is performed in different ways*/
                  SELECT (a + e) / f AS calc, f AS div FROM atable WHERE a + b = c
                  SELECT dcol, ecol, fcol FROM atable(acol, bcol, ccol, dcol, ecol, fcol) WHERE acol + bcol = ccol
                  /* in the next SELECT, both grouping and aggregation is performed */
                  SELECT d, e, SUM(f) FROM atable GROUP BY d, e
                  /* in the next SELECT, selection is performed after grouping and aggregation is performed */
                  SELECT d, e, SUM(f) FROM atable GROUP BY d, e HAVING SUM(f) > 10
                  /* in the next SELECT, a UNION is performed on two selects from the same table */
                  SELECT d, e, f FROM atable WHERE d = 3 UNION SELECT a, b, c FROM atable WHERE a = 30
                  /* in the next SELECT, ordering is performed */
                  SELECT (a + e) / f AS calc, f AS div FROM atable WHERE a + b = c ORDER BY calc DESC, div NULLS LAST
                  /* in the next SELECT, slicing is performed after ordering */
                  SELECT * FROM atable WHERE a + b = c ORDER BY a FETCH 5 ROWS ONLY
                  
                  

                  The next sections discuss various types of tables and operations involved in data access statements.

                  Select Statement

                  The SELECT statement itself does not cover all types of data access statements, which may combine multiple SELECT statements. The <query specification> is the most common data access statement and begins with the SELECT keyword.

                  SELECT STATEMENT

                  select statement (general)

                  Users generally refer to the SELECT statement when they mean a <query specification> or <query expression>. If a statement begins with SELECT and has no UNION or other set operations, then it is a <query specification>. Otherwise it is a <query expression>.

                  Table

                  In data access statements, a table can be a database table (or view) or an ephemeral table formed for the duration of the query. Some types of table are <table primary> and can participate in joins without the use of extra parentheses. The BNF in the Table Primary section below lists different types of <table primary>:

                  Tables can also be formed by specifying the values that are contained in them:

                  <table value constructor> ::= VALUES <row value expression list>

                  <row value expression list> ::= <table row value expression> [ { <comma> <table row value expression> }... ]

                  In the example below a table with two rows and 3 columns is constructed out of some values:

                  VALUES (12, 14, null), (10, 11, CURRENT_DATE)

                  When a table is used directly in a UNION or similar operation, the keyword TABLE is used with the name:

                  <explicit table> ::= TABLE <table or query name>

                  In the examples below, all rows of the two tables are included in the union. The keyword TABLE is used in the first example. The two examples below are equivalent.

                  TABLE atable UNION TABLE anothertable
                  SELECT * FROM atable UNION SELECT * FROM anothertable
                  

                  Subquery

                  A subquery is simply a query expression in brackets. A query expression is usually a complete SELECT statement and is discussed in the rest of this chapter. A scalar subquery returns one row with one column. A row subquery returns one row with one or more columns. A table subquery returns zero or more rows with one or more columns. The distinction between different forms of subquery is syntactic. Different forms are allowed in different contexts. If a scalar subquery or a row subquery return more than one row, an exception is raised. If a scalar or row subquery returns no row, it is usually treated as returning a NULL. Depending on the context, this has different consequences.

                  <scalar subquery> ::= <subquery>

                  <row subquery> ::= <subquery>

                  <table subquery> ::= <subquery>

                  <subquery> ::= <left paren> <query expression> <right paren>

                  Query Specification

                  A query specification is also known as a SELECT statement. It is the most common form of <derived table> . A <table expression> is a base table, a view or any form of allowed derived table. The SELECT statement performs projection, naming, computing or aggregation on the rows of the <table expression> .

                  <query specification> ::= SELECT [ DISTINCT | ALL ] <select list> <table expression>

                  <select list> ::= <asterisk> | <select sublist> [ { <comma> <select sublist> }... ]

                  <select sublist> ::= <derived column> | <qualified asterisk>

                  <qualified asterisk> ::= <asterisked identifier chain> <period> <asterisk>

                  <asterisked identifier chain> ::= <asterisked identifier> [ { <period> <asterisked identifier> }... ]

                  <asterisked identifier> ::= <identifier>

                  <derived column> ::= <value expression> [ <as clause> ]

                  <as clause> ::= [ AS ] <column name>

                  The qualifier DISTINCT or ALL apply to the results of the SELECT statement after all other operations have been performed. ALL simply returns the rows, while DISTINCT compares the rows and removes the duplicate ones.

                  Projection is performed by the <select list>.

                  A single <asterisk> means all columns of the <table expression> are included, in the same order as they appear in the <table expression>. An asterisk qualified by a table name means all the columns of the qualifier table name are included. If an unqualified asterisk is used, then no other items are allowed in the <select list>. When the the <table expression> is the direct result of NATURAL or USING joins, the use of <asterisk> includes the columns used for the join before the other columns. A qualified asterisk does not cover the join columns.

                  A derived column is a <value expression>, optionally named with the <as clause>. A <value expression> can be many things. Common types include: the name of a column in the <table expression>; an expression based on different columns or constant values; a function call; an aggregate function; a CASE WHEN expression.

                  Table Expression

                  A table expression is part of the SELECT statement and consists of the FROM clause with optional other clauses that performs selection (of rows) and grouping from the table(s) in the FROM clause.

                  <table expression> ::= <from clause> [ <where clause> ] [ <group by clause> ] [ <having clause> ]

                  <from clause> ::= FROM <table reference> [ { <comma> <table reference> }... ]

                  <table reference> ::= <table primary> | <joined table>

                  <table primary> ::= <table or query name> [ [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ] ]

                  | <derived table> [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]

                  | <lateral derived table> [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]

                  | <collection derived table> [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]

                  | <table function derived table> [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]

                  | <parenthesized joined table> [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]

                  <where clause> ::= WHERE <boolean value expression>

                  <group by clause> ::= GROUP BY [ <set quantifier> ] <grouping element> [ { <comma> <grouping element> }... ]

                  <having clause> ::= HAVING <boolean value expression>

                  The <from clause> contains one or more <table reference> separated by commas. A table reference is often a table or view name or a joined table.

                  The <where clause> filters the rows of the table in the <from clause> and removes the rows for which the search condition is not TRUE.

                  The <group by clause> is a comma separated list of columns of the table in the <from clause> or expressions based on the columns.

                  When a <group by clause> is used, only the columns used in the <group by clause> or expressions used there, can be used in the <select list>, together with any <aggregate function> on other columns. A <group by clause> compares the rows and groups together the rows that have the same values in the columns of the <group by clause>. Then any <aggregate function> in the <select list> is performed on each group, and for each group, a row is formed that contains the values of the columns of the <group by clause> and the values returned from each <aggregate function>. In the first example below, a simple column reference is used in GROUP BY, while in the second example, an expression is used.

                  CREATE TABLE atable (a INT, b INT, c INT, d INT, e INT, f INT);
                  SELECT d, e, f FROM atable WHERE a + b = c GROUP BY d, e, f
                  SELECT d + e, SUM(f) FROM atable WHERE a + b = c GROUP BY d + e HAVING SUM(f) > 2 AND d + e > 4
                  

                  A <having clause> filters the rows of the table that is formed after applying the <group by clause> using its search condition. The search condition must be an expression based on the expressions in the GROUP BY list or the aggregate functions used.

                  Table Primary

                  Table primary refers to different forms of table reference in the FROM clause.

                  The simplest form of reference is simply a name. This is the name of a table, a view, a transition table in a trigger definition, or a query name specified in the WITH clause of a query expression.

                  <table or query name> ::= <table name> | <transition table name> | <query name>

                  derived table

                  A query expression that is enclosed in parentheses and returns from zero to many rows is a <table subquery>. In a <derived table> the query expression is self contained and cannot reference the columns of other table references. This is the traditional and most common form of use of a <table subquery>.

                  <derived table> ::= <table subquery>

                  LATERAL

                  When the word LATERAL is used before a <table subquery>, it means the query expression can reference the columns of other table references that go before it.

                  <lateral derived table> ::= LATERAL <table subquery>

                  The use of <lateral derived table> completely transforms the way a query is written. For example, the two queries below are equivalent, but with different forms. The query with LATERAL is evaluated separately for each row of the first table that satisfies the WHERE condition. The example below uses the tables that are created and populated in DatabaseManagerSwing with the "Insert test data" menu option. The first query uses a scalar subquery to compute the sum of invoice values for each customer. The second query is equivalent and uses a join with a LATERAL table.

                  SELECT firstname, lastname, (SELECT SUM(total) FROM invoice WHERE customerid = customer.id) s FROM customer
                  
                  SELECT firstname, lastname, a.c FROM customer, LATERAL(SELECT SUM(total) FROM invoice WHERE customerid = customer.id) a (c)
                  

                  UNNEST

                  UNNEST is similar to LATERAL, but instead of a query expression, one or more expressions that return an array are used. These expressions are converted into a table which has one column for each expression and contains the elements of the array. If WITH ORDINALITY is used, an extra column that contains the index of each element is added to this table. The number or rows in the table equals the length of the largest arrays. The smaller arrays are padded with NULL values. If an <array value expression> evaluates to NULL, an empty array is used in its place. The array expression can contain references to any column of the table references preceding the current table reference.

                  <collection derived table> ::= UNNEST <left paren> <array value expression>, ... <right paren> [ WITH ORDINALITY ]

                  The <array value expression> can be the result of a function call. If the arguments of the function call are values from the tables on the left of the UNNEST, then the function is called for each row of table.

                  In the first example below, UNNEST is used with the built in-function SEQUENCE_ARRAY to build a table containing dates for the last seven days and their ordinal position. In the second example, a select statement returns costs for the last seven days . In the third example, the WITH clause turns the two selects into named subqueries which are used in a SELECT statement that uses a LEFT join.

                  SELECT * FROM UNNEST(SEQUENCE_ARRAY(CURRENT_DATE - 7 DAY, CURRENT_DATE - 1 DAY, 1 DAY)) WITH ORDINALITY AS T(D, I)  
                  
                  D          I 
                  ---------- - 
                  2010-07-25 1 
                  2010-07-26 2 
                  2010-07-27 3 
                  2010-07-28 4 
                  2010-07-29 5 
                  2010-07-30 6 
                  2010-07-31 7 
                  
                  CREATE TABLE expenses (item_date DATE, cost DECIMAL(8,2))
                  --
                  SELECT item_date, SUM(cost) AS s FROM expenses WHERE item_date >= CURRENT_DATE - 7 DAY GROUP BY item_date
                  
                  ITEM_DATE  S      
                  ---------- ------ 
                  2010-07-27 100.12 
                  2010-07-29 50.45  
                  
                  WITH costs(i_d, s) AS (SELECT item_date, SUM(cost) AS s FROM expenses WHERE item_date >= CURRENT_DATE - 7 DAY GROUP BY item_date),
                  dates(d, i) AS (SELECT * FROM UNNEST(SEQUENCE_ARRAY(CURRENT_DATE - 7 DAY, CURRENT_DATE - 1 DAY, 1 DAY)) WITH ORDINALITY)   
                  SELECT i, d, s FROM dates LEFT OUTER JOIN costs ON dates.d = costs.i_d
                  
                  I D          S      
                  - ---------- ------ 
                  1 2010-07-25 (null) 
                  2 2010-07-26 (null) 
                  3 2010-07-27 100.12 
                  4 2010-07-28 (null) 
                  5 2010-07-29 50.45  
                  6 2010-07-30 (null) 
                  7 2010-07-31 (null) 
                  
                  

                  TABLE

                  When TABLE is used in this context, the <collection value expression> must be the result of a function call to a built-in function or user-defined function that returns an array or a table. When the function returns an array, this array is converted into a table, similar to the way UNNEST operates. When the function returns a table, the result is a MULTISET and is used as is.

                  <table function derived table> ::= TABLE <left paren> <collection value expression> <right paren>

                  column name list

                  The column list that is specified for the table reference must contain names that are unique within the list

                  <derived column list> ::= <column name list>

                  <column name list> ::= <column name> [ { <comma> <column name> }... ]

                  A parenthesized joined table is simply a joined table contained in parentheses. Joined tables are discussed below.

                  <parenthesized joined table> ::= <left paren> <parenthesized joined table> <right paren> | <left paren> <joined table> <right paren>

                  Joined Table

                  Joins are operators with two table as the operands, resulting in a third table, called joined table. All join operators are evaluated left to right, therefore, with multiple joins, the table resulting from the first join operator becomes an operand of the next join operator. Parentheses can be used to group sequences of joined tables and change the evaluation order. So if more than two tables are joined together with join operators, the end result is also a joined table. There are different types of join, each producing the result table in a different way.

                  <joined table> ::= <cross join> | <qualified join> | <natural join>

                  <cross join> ::= <table reference> CROSS JOIN <table factor>

                  <qualified join> ::= <table reference> | [ <join type> ] JOIN <table reference> <join specification>

                  <natural join> ::= <table reference> NATURAL [ <join type> ] JOIN <table factor>

                  <join specification> ::= <join condition> | <named columns join>

                  <join condition> ::= ON <search condition>

                  <named columns join> ::= USING <left paren> <join column list> <right paren>

                  <join type> ::= INNER | <outer join type> [ OUTER ]

                  <outer join type> ::= LEFT | RIGHT | FULL

                  <join column list> ::= <column name list>

                  CROSS JOIN

                  The simplest form of join is CROSS JOIN. The CROSS JOIN of two tables is a table that has all the columns of the first table, followed by all the columns of the second table, in the original order. Each row of the first table is combined with each row of the second table to fill the rows of the new table. If the rows of each table form a set, then the rows of the CROSS JOIN table form the Cartesian product of the rows of the two table operands.

                  Conditions are not allowed as part of a cross join, which is simply A CROSS JOIN B. Any conditions in a WHERE clause are later applied to the table resulting from the cross join.

                  Tables in the FROM CLAUSE separated with commas, are equivalent to cross joins between the tables. Two joined tables separated with a comma, such as A, B, is equivalent to (A) CROSS JOIN (B), which means the joined tables A and B are populated separately before they are joined.

                  CROSS JOIN is not is not generally very useful, as it returns large result tables unless WHERE conditions are used.

                  UNION JOIN

                  The UNION JOIN has limited use in queries. The result table has the same columns as that of CROSS JOIN. Each row of the first table is extended to the right with nulls and added to the new table. Each row of the second table is extended to the left with nulls and added to the new table. The UNION JOIN is expressed as A UNION JOIN B. This should not be confused with A UNION B, which is a set operation. Union join is for special applications and is not commonly used.

                  JOIN ... ON

                  The condition join is similar to CROSS JOIN, but a condition is tested for each row of the new table and the row is created only if the condition is true. This form of join is expressed as A JOIN B ON (<search condition>).

                  Equijoin is a condition join in which the search condition is an equality condition between on or more pairs of columns from the two table. Equijoin is the most commonly used type of join.

                  SELECT a.*, b.* FROM a INNER JOIN b ON a.col_one = b.col_two
                  

                  JOIN ... USING

                  NATURAL JOIN

                  Joins with USING or NATURAL keywords joins are similar to an equijoin but they cannot be replaced simply with an equijoin. The new table is formed with the specified or implied shared columns of the two tables, followed by the rest of the columns from each table. In NATURAL JOIN, the shared columns are all the column pairs that have the same name in the first and second table. In JOIN USING, only columns names that are specified by the USING clause are shared. The joins are expressed as A NATURAL JOIN B, and A JOIN B USING (<comma separated column name list>).

                  The columns of the joined table are formed by the following procedures: In JOIN ... USING the shared columns are added to the joined table in the same order as they appear in the column name list. In NATURAL JOIN the shared columns are added to the joined table in the same order as they appear in the first table. In both forms of join, the non-shared columns of the first table are added in the order they appear in the first table, finally the non-shared columns of the second table are added in the order they appear in the second table.

                  The type of each shared column of the joined table is based on the type of the columns in the original tables. If the original types are not exactly the same, the type of the shared column is formed by type aggregation. Type aggregations selects a type that can represent values of both aggregated types. Simple type aggregation picks one of the types. For example SMALLINT and INTEGER, results in INTEGER, or VARCHAR(10) and VARCHAR(20) results in VARCHAR(20). More complex type aggregation inherits properties from both types. For example DECIMAL(8) and DECIMAL (6,2) results in DECIMAL (8,2).

                  In the examples below, the rows are joined exactly the same way, but the first query contains a.col_two and b.col_two together with all the rest of the columns of both tables, while the second query returns only one copy of col_two.

                  SELECT * FROM a INNER JOIN b ON a.col_two = b.col_two
                  SELECT * FROM a INNER JOIN b USING (col_two)
                  

                  OUTER JOIN

                  LEFT, RIGHT and FULL OUTER JOIN

                  The three qualifiers can be added to all types of JOIN except CROSS JOIN and UNION JOIN. First the new table is populated with the rows from the original join. If LEFT is specified, all the rows from the first table that did not make it into the new table are extended to the right with nulls and added to the table. If RIGHT is specified, all the rows from the second table that did not make it into the new table are extended to the left with nulls and added to the table. If FULL is specified, the addition of leftover rows is performed from both the first and the second table. These forms are expressed by prefixing the join specification with the given keyword. For example A LEFT OUTER JOIN B ON (<search condition>) or A NATURAL FULL OUTER JOIN B or A FULL OUTER JOIN B USING (<comma separated column name list>).

                  SELECT a.*, b.* FROM a LEFT OUTER JOIN b ON a.col_one = b.col_two
                  

                  Selection

                  Despite the name, selection has nothing to do with the list of columns in a SELECT statement. In fact, it refers to the search condition used to limit the rows that from a result table (selection of rows, not columns). In SQL, simple selection is expressed with a WHERE condition appended to a single table or a joined table. In some cases, this method of selection is the only method available. For example in DELETE and UPDATE statements. But when it is possible to perform the selection with join conditions, this is the better method, as it results in a clearer expression of the query.

                  Projection

                  Projection is selection of the columns from a simple or joined table to form a result table. Explicit projection is performed in the SELECT statement by specifying the select column list. Some form of projection is also performed in JOIN ... USING and NATURAL JOIN.

                  The joined table has columns that are formed according to the rules mentioned above. But in many cases, not all the columns are necessary for the intended operation. If the statement is in the form, SELECT * FROM <joined table>, then all the columns of <joined table> are returned. But normally, the columns to be returned are specified after the SELECT keyword, separated from each other with commas.

                  Computed Columns

                  In the select list, it is possible to use expressions that reference any columns of <joined table>. Each of these expressions forms a computed column. It is computed for each row of the result table, using the values of the columns of the <joined table> for that row.

                  Naming

                  Naming is used to hide the original names of tables or table columns and to replace them with new names in the scope of the query. Naming is also used for defining names for computed columns.

                  Without explicit naming, the name of a column is a predefined name. If the column is a column of a table, or is a named parameter, the name is of the table column or parameter is used. Otherwise it is generated by the database engine. HyperSQL generates column names such as C1, C2, etc. As generated naming is implementation defined according to the SQL Standard, it is better to explicitly name the computed and derived columns in your applications.

                  Naming in Joined Table

                  Naming is performed by adding a new name after a table's real name and by adding a list of column names after the new table name. Both table naming and column naming are optional, but table naming is required for column naming. The expression A [AS] X (<comma separated column name list>) means table A is used in the query expression as table X and its columns are named as in the given list. The original name A, or its original column names, are not visible in the scope of the query. The BNF is given below. The <correlation name> can be the same or different from the name of the table. The <derived column list> is a comma separated list of column names. The degree of this list must be equal to the degree of the table. The column names in the list must be distinct. They can be the same or different from the names of the table's columns.

                  <table or query name> [ [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ] ]

                  In the examples below, the columns of the original tables are named (a, b, c, d, e, f). The two queries are equivalent. In the second query, the table and its columns are renamed and the new names are used in the WHERE clauses:

                  CREATE TABLE atable (a INT, b INT, c INT, d INT, e INT, f INT);
                  SELECT d, e, f FROM atable WHERE a + b = c
                  SELECT x, y, z FROM atable AS t (u, v, w, x, y, z)  WHERE u + v = w

                  Naming in Select List

                  Naming in the SELECT list logically takes place after naming in the joined table. The new names for columns are not visible in the immediate query expression or query expression. They become visible in the ORDER BY clause and in the result table that is returned to the user. Or if the query expression is used as a derived table in an enclosing query expression.

                  In the example below, the query is on the same table but with column renaming in the Select list. The new names are used in the ORDER BY clause:

                  SELECT x + y AS xysum, y + z AS yzsum FROM atable AS t (u, v, w, x, y, z)  WHERE u + v = w ORDER BY xysum, yzsum

                  If the names xysum or yzsum are not used, the computed columns cannot be referenced in the ORDER BY list.

                  Name Resolution

                  In a joined table, if a column name appears in tables on both sides then any reference to the name must use the table name in order to specify which table is being referred to.

                  Grouping Operations

                  Grouping Operations

                  Grouping results in the elimination of duplicate rows. A grouping operation is performed after the operations discussed above. A simple form of grouping is performed by the use of DISTINCT after SELECT. This eliminates all the duplicate rows (rows that have the same value in each of their columns when compared to another row). The other form of grouping is performed with the GROUP BY clause. This form is usually used together with aggregation.

                  Aggregation

                  Aggregation is an operation that computes a single value from the values of a column over several rows. The operation is performed with an aggregate function. The simplest form of aggregation is counting, performed by the COUNT function.

                  Other common aggregate functions return the maximum, minimum and average value among the values in different rows.

                  Set Operations

                  Set and Multiset Operations

                  While join operations generally result in laterally expanded tables, SET and COLLECTION operations are performed on two tables that have the same degree and result in a table of the same degree. The SET operations are UNION, INTERSECT and EXCEPT (difference). When each of these operations is performed on two tables, the collection of rows in each table and in the result is reduced to a set of rows, by eliminating duplicates. The set operations are then performed on the two tables, resulting in the new table which itself is a set of rows. Collection operations are similar but the tables are not reduced to sets before or after the operation and the result is not necessarily a set, but a collection of rows.

                  The set operations on two tables A and B are: A UNION [DISTINCT] B, A INTERSECT [DISTINCT] B and A EXCEPT [DISTINCT] B. The result table is formed in the following way: The UNION operation adds all the rows from A and B into the new table, but avoids copying duplicate rows. The INTERSECT operation copies only those rows from each table that also exist in the other table, but avoids copying duplicate rows. The EXCEPT operation copies those rows from the first table which do not exist in the second table, but avoids copying duplicate rows.

                  The collection operations are similar to the set operations, but can return duplicate rows. They are A UNION ALL B, A INTERSECT ALL B and A EXCEPT ALL B. The UNION ALL operation adds all the rows from A and B into the new table. The INTERSECT operation copies only those rows from each table that also exist in the other table. If n copies of a rows exists in one table, and m copies in the other table, the number of copies in the result table is the smaller of n and m. The EXCEPT operation copies those rows from the first table which do not exist in the second table. If n copies of a row exist in the first table and m copies in the second table the number of copies in the result table is n-m, or if n < m, then zero.

                  With Clause and Recursive Queries

                  The optional WITH clause can be used in a query expression. The WITH clause lists one or more named ephemeral tables that can be referenced in the query expression body. The ephemeral tables are created and populated before the rest of the query expression is executed. Their contents do not change during the execution of the <query expression body>.

                  <with clause> ::= WITH [ RECURSIVE ] <with list>

                  <with list> ::= <with list element> [ { <comma> <with list element> }... ]

                  <with list element> ::= <query name> [ <left paren> <with column list> <right paren> ] AS <left paren> <query expression> <right paren>

                  <with column list> ::= <column name list>

                  An example of the use of the WITH clause is given above under UNNEST. The <query expression> in the WITH clause is evaluated once and its result table can be referenced in the body of the main <query expression body> using the specified <query name>.

                  The RECURSIVE keyword changes the way the elements of the <with list> are interpreted. The <query expression> contained in the <with list element> must be the UNION or UNION ALL of two <query expression body> elements (simple VALUES or SELECT statements). The left element of the UNION is evaluated first and its result becomes the result of the <with list element>. After this step, the current result of the <with list element> is referenced in the right element (a SELECT statement) of the UNION, the UNION is performed between the result and previous result of the <with list element>, which is enlarged by this operation. The UNION operation is performed again and again, until the result of the <with list element> stops changing. The result of the <with list element> is now complete and is later used in the execution of the <query expression body>. When RECURSIVE is used, the <with column list> must be defined.

                  HyperSQL limits recursion to 265 rounds. If this is exceeded, an error is raised.

                  A trivial example of a recursive query is given below. Note the first column GEN. For example, if each row of the table represents a member of a family of dogs, together with its parent, the first column of the result indicates the calculated generation of each dog, ranging from first to fourth generation.

                  CREATE TABLE pptree (pid INT, id INT);
                  INSERT INTO pptree VALUES (NULL, 1) ,(1,2), (1,3),(2,4),(4,5),(3,6),(3,7);
                  
                  WITH RECURSIVE tree (gen, par, child) AS (
                    VALUES(1, CAST(null as int), 1)
                    UNION
                    SELECT gen + 1, pid, id FROM pptree, tree WHERE pid = child
                    ) SELECT * FROM tree;
                  
                  GEN PAR    CHILD 
                  --- ------ ----- 
                  1   (null) 1     
                  2   1      2     
                  2   1      3     
                  3   2      4     
                  3   3      6     
                  3   3      7     
                  4   4      5

                  if recursive queries become complex they also become very difficult to develop and debug. HyperSQL provides an alternative to this with user-defined SQL functions which return tables. Functions can perform any complex, repetitive task with better control, using loops, variables and, if necessary, recursion.

                  Query Expression

                  A query expression consists of an optional WITH clause and a query expression body. The optional WITH clause lists one or more named ephemeral tables that can be referenced, just like the database tables in the query expression body.

                  <query expression> ::= [ <with clause> ] <query expression body>

                  A query expression body refers to a table formed by using UNION and other set operations. The query expression body is evaluated from left to right and the INTERSECT operator has precedence over the UNION and EXCEPT operators. A simplified BNF is given below:

                  <query expression body> ::= <query term> | <query expression body> UNION | EXCEPT [ ALL | DISTINCT ] [ <corresponding spec> ] <query term>

                  <query term> ::= <query primary> | <query term> INTERSECT [ ALL | DISTINCT ] [ <corresponding spec> ] <query term>

                  <query primary> ::= <simple table> | <left paren> <query expression body> [ <order by clause> ] [ <result offset clause> ] [ <fetch first clause> ] <right paren>

                  <simple table> ::= <query specification> | <table value constructor> | <explicit table> <explicit table> ::= TABLE <table or query name>

                  <corresponding spec> ::= CORRESPONDING [ BY <left paren> <column name list> <right paren> ]

                  A <query term> and a <query primary> can be a SELECT statement, an <explicit table>, or a <table value constructor>.

                  The CORRESPONDING clause is optional. If it is not specified, then the <query term> and the <query primary> must have the same number of columns. If CORRESPONDING is specified, the two sides need not have the same number of columns. If no column list is used with CORRESPONDING, then all the column names that are common in the tables on two sides are used in the order in which they appear in the first table. If a columns list is used, it allows you to select only some columns of the tables on the left and right side to create the new table. In the example below the columns named u and v from the two SELECT statements are used to create the UNION table.

                  SELECT * FROM atable UNION CORRESPONDING BY (u, v) SELECT * FROM anothertable
                  

                  The type of each column of the query expression is determined by combining the types of the corresponding columns from the two participating tables.

                  Ordering

                  When the rows of the result table have been formed, it is possible to specify the order in which they are returned to the user. The ORDER BY clause is used to specify the columns used for ordering, and whether ascending or descending ordering is used. It can also specify whether NULL values are returned first or last.

                  SELECT x + y AS xysum, y + z AS yzsum FROM atable AS t (u, v, w, x, y, z)  WHERE u + v = w ORDER BY xysum NULLS LAST, yzsum NULLS FIRST

                  The ORDER BY clause specifies one or more <value expressions>. The list of rows is sorted according to the first <value expression>. When some rows are sorted equal then they are sorted according to the next <value expression> and so on.

                  <order by clause> ::= ORDER BY <sort specification> [ { <comma> <sort specification> }... ]

                  <sort specification> ::= <value expression> [ <collate clause> ] [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ]

                  The defaults are ASC and NULLS FIRST.

                  A collation is used for columns of an ORDER BY expression that are of the type CHAR or VARCHAR. If a <collate clause> is not specified then the collation of the column, or the default collation of the database is used.

                  An ORDER BY operation can sometimes be optimised by the engine when it can use the same index for accessing the table data and ordering. Optimisation can happen both with DESC + NULLS LAST and ASC + NULLS FIRST.

                  sort specification list

                  sort specification list

                  <sort specification list> ::= <value expression> [ASC | DESC] [NULLS FIRST | NULLS LAST]

                  Specify a sort order. A sort operation is performed on the result of a <query expression> or <query specification> and sorts the result according to one or more <value expression>. The <value expression> is usually a single column of the result, but in some cases it can be a column of the <table expression> that is not used in the select list. The default is ASC and NULLS FIRST.

                  Slicing

                  A different form of limiting the rows can be performed on the result table after it has been formed according to all the other operations (selection, grouping, ordering etc.). This is specified by the FETCH ... ROWS and OFFSET clauses of a SELECT statement. In this form, the specified OFFSET rows are removed from start of the table, then up to the specified FETCH rows are kept and the rest of the rows are discarded.

                  <result offset clause> ::= OFFSET <offset row count> { ROW | ROWS }

                  <fetch first clause> ::= FETCH { FIRST | NEXT } [ <fetch first row count> ] { ROW | ROWS } ONLY [ USING INDEX ]

                  <limit clause> ::= LIMIT <fetch first row count> [ USING INDEX ]

                  A slicing operation takes the result set that has been already processed and ordered. It then discards the specified number of rows from the start of the result set and returns the specified number of rows after the discarded rows. The <offset row count> and <fetch first row count> can be constants, dynamic variables, routine parameters, or routine variables. The type of the constants must be INTEGER.

                  SELECT a, b FROM atable WHERE d < 5 ORDER BY absum OFFSET 3 FETCH 2 ROWS ONLY 
                  SELECT a, b FROM atable WHERE d < 5 ORDER BY absum OFFSET 3 LIMIT 2 /* alternative keyword */ 

                  When the FETCH keyword is used, the specified number of rows must be at least 1, otherwise an error is returned. This behaviour is consistent with the SQL Standard. When the LIMIT keyword is used, the specified number of rows can be zero, which means return all rows (no LIMIT). In MySQL and PostgreSQL syntax modes, zero limit means no rows (empty result).

                  If there is an index on all the columns specified in the ORDER BY clause, it is normally used for slicing. In some queries, an index on another column may take precedence. It is possible to add USING INDEX to the end of the slicing clause to force the use of the index for ordering and slicing.

                  Data Change Statements

                  Delete Statement

                  DELETE FROM

                  delete statement: searched

                  <delete statement: searched> ::= DELETE FROM <target table> [ [ AS ] <correlation name> ] [ WHERE <search condition> ]

                  Delete rows of a table. The search condition is a <boolean value expression> that is evaluated for each row of the table. If the condition is true, the row is deleted. If the condition is not specified, all the rows of the table are deleted. In fact, an implicit SELECT is performed in the form of SELECT * FROM <target table> [ WHERE <search condition>] and the selected rows are deleted. When used in JDBC, the number of rows returned by the implicit SELECT is returned as the update count.

                  If there are FOREIGN KEY constraints on other tables that reference the subject table, and the FOREIGN KEY constraints have referential actions, then rows from those other tables that reference the deleted rows are either deleted, or updated, according to the specified referential actions.

                  In the second example below the rows that have the maximum value for column A are deleted;

                  DELETE FROM T WHERE C > 5
                  DELETE FROM T AS TT WHERE TT.A = (SELECT MAX(A) FROM T)
                  

                  Truncate Statement

                  TRUNCATE TABLE

                  truncate table statement

                  <truncate table statement> ::= TRUNCATE TABLE <target table> [ <identity column restart option> ] [ <truncate options> ]

                  <identity column restart option> ::= CONTINUE IDENTITY | RESTART IDENTITY

                  <truncate options> ::= AND COMMIT [ NO CHECK ]

                  Delete all rows of a table without firing its triggers. This statement can only be used on base tables (not views). If the table is referenced in a FOREIGN KEY constraint defined on another table, the statement causes an exception. Triggers defined on the table are not executed with this statement. The default for <identity column restart option> is CONTINUE IDENTITY. This means no change to the IDENTITY sequence of the table. If RESTART IDENTITY is specified, then the sequence is reset to its start value.

                  TRUNCATE is faster than ordinary DELETE. The TRUNCATE statement is an SQL Standard data change statement, therefore it is performed under transaction control and can be rolled back if the connection is not in the auto-commit mode.

                  HyperSQL also supports the optional AND COMMIT and NO CHECK options. If AND COMMIT is used, then the transaction is committed with the execution of the TRUNCATE statement. The action cannot be rolled back. If the additional NO CHECK option is also specified, then the TRUNCATE statement is executed even if the table is referenced in a FOREIGN KEY constraint defined on another, non-empty table. This form of TRUNCATE is faster than the default form and does not use much memory.

                  TRUNCATE SCHEMA

                  truncate schema statement

                  <truncate schema statement> ::= TRUNCATE SCHEMA <target schema> [ <identity column restart option> ] AND COMMIT [ NO CHECK ]

                  Performs the equivalent of a TRUNCATE TABLE ... AND COMMIT on all the table in the schema. If the additional NO CHECK option is also specified, then the TRUNCATE statement is executed even if any of the tables in the schema is referenced in a FOREIGN KEY constraint defined on a non-empty table in a different schema.

                  If RESTART IDENTITY is specified, all table IDENTITY sequences and all SEQUENCE objects in the schema are reset to their start values.

                  Use of this statement requires schema ownership or administrative privileges.

                  Insert Statement

                  INSERT INTO

                  insert statement

                  <insert statement> ::= INSERT INTO <target table> <insert columns and source>

                  <insert columns and source> ::= <from subquery> | <from constructor> | <from default>

                  <from subquery> ::= [ <left paren> <insert column list> <right paren> ] [ <override clause> ] <query expression>

                  <from constructor> ::= [ <left paren> <insert column list> <right paren> ] [ <override clause> ] <contextually typed table value constructor>

                  <override clause> ::= OVERRIDING USER VALUE | OVERRIDING SYSTEM VALUE

                  <from default> ::= DEFAULT VALUES

                  <insert column list> ::= <column name list>

                  Insert new rows in a table. An INSERT statement inserts one or more rows into the table.

                  The special form, INSERT INTO <target table> DEFAULT VALUES can be used with tables which have a default value for each column.

                  With the other forms of INSERT, the optional (<insert column list>) specifies to which columns of the table the new values are assigned.

                  In one form, the inserted values are from a <query expression> and all the rows that are returned by the <query expression> are inserted into the table. If the <query expression> returns no rows, nothing is inserted.

                  In the other form, a comma separated list of values called <contextually typed table value constructor> is used to insert one or more rows into the table. This list is contextually typed, because the keywords NULL and DEFAULT can be used for the values that are assigned to each column of the table. The keyword DEFAULT means the default value of the column and can be used only if the target column has a default value or is an IDENTITY or GENERATED column of the table.

                  The <override clause> must be used when a value is explicitly assigned to a column that has been defined as GENERATED ALWAYS AS IDENTITY. The clause, OVERRIDE SYSTEM VALUE means the provided values are used for the insert, while OVERRIDING USER VALUE means the provided values are simply ignored and the values generated by the system are used instead.

                  An array can be inserted into a column of the array type by using literals, by specifying a parameter in a prepared statement or an existing array returned by query expression. The last example below inserts an array.

                  The rows that are inserted into the table are checked against all the constraints that have been declared on the table. The whole INSERT operation fails if any row fails to inserted due to constraint violation. Examples:

                  INSERT INTO T DEFAULT VALUES /* all columns of T have DEFAULT clauses */
                  INSERT INTO T (SELECT * FROM Z) /* table Z has the same columns as table T */
                  INSERT INTO T (A,B) VALUES ((1,2),(3,NULL), (DEFAULT,6)) /* three rows are inserted into table T */
                  INSERT INTO T VALUES 3, ARRAY['hot','cold']
                  

                  If the table contains an IDENTITY column, the value for this column for the last row inserted by a session can be retrieved using a call to the IDENTITY() function. This call returns the last value inserted by the calling session. When the insert statement is executed with a JDBC Statement or PreparedStatement method, the getGeneratedKeys() method of Statement can be used to retrieve not only the IDENTITY column, but also any GENERATED computed column, or any other column. The getGeneratedKeys() returns a ResultSet with one or more columns. This contains one row per inserted row, and can therefore return all the generated columns for a multi-row insert.

                  There are three methods of specifying which generated keys should be returned. The first method does not specify the columns of the table. With this method, the returned ResultSet will have a column for each column of the table that is defined as GENERATED ... AS IDENTITY or GENERATED ... AS (<expression>). The two other methods require the user to specify which columns should be returned, either by column indexes, or by column names. With these methods, there is no restriction on which columns of the inserted values to be returned. This is especially useful when some columns have a default clause which is a function, or when there are BEFORE triggers on the table that may provide the inserted value for some of the columns.

                  Update Statement

                  UPDATE

                  update statement: searched

                  <update statement: searched> ::= UPDATE <target table> [ [ AS ] <correlation name> ] SET <set clause list> [ WHERE <search condition> ]

                  Update rows of a table. An UPDATE statement selects rows from the <target table> using an implicit SELECT statement formed in the following manner:

                  SELECT * FROM <target table> [ [ AS ] <correlation name> ] [ WHERE <search condition> ]

                  Then it applies the SET <set clause list> expression to each selected row.

                  If the implicit SELECT returns no rows, no update takes place. When used in JDBC, the number of rows returned by the implicit SELECT is returned as the update count.

                  If there are FOREIGN KEY constraints on other tables that reference the subject table, and the FOREIGN KEY constraints have referential actions, then rows from those other tables that reference the updated rows are updated, according to the specified referential actions.

                  The rows that are updated are checked against all the constraints that have been declared on the table. The whole UPDATE operation fails if any row violates any constraint.

                  set clause list

                  set clause list

                  <set clause list> ::= <set clause> [ { <comma> <set clause> }... ]

                  <set clause> ::= <multiple column assignment> | <set target> <equals operator> <update source>

                  <multiple column assignment> ::= <set target list> <equals operator> <assigned row>

                  <set target list> ::= <left paren> <set target> [ { <comma> <set target> }... ] <right paren>

                  <assigned row> ::= <contextually typed row value expression>

                  <set target> ::= <column name>

                  <update source> ::= <value expression> | <contextually typed value specification>

                  Specify a list of assignments. This is used in UPDATE, MERGE and SET statements to assign values to a scalar or row target.

                  Apart from setting a whole target to a value, a SET statement can set individual elements of an array to new values. The last example below shows this form of assignment to the array in the column named B.

                  In the examples given below, UPDATE statements with single and multiple assignments are shown. Note in the third example, a SELECT statement is used to provide the update values for columns A and C, while the update value for column B is given separately. The SELECT statement must return exactly one row . In this example the SELECT statement refers to the existing value for column C in its search condition.

                  UPDATE T SET A = 5 WHERE ...
                  UPDATE T SET (A, B) = (1, NULL) WHERE ...
                  UPDATE T SET (A, C) = (SELECT X, Y FROM U WHERE Z = C), B = 10 WHERE ...
                  UPDATE T SET A = 3, B[3] = 'warm'
                  

                  Merge Statement

                  MERGE INTO

                  merge statement

                  <merge statement> ::= MERGE INTO <target table> [ [ AS ] <merge correlation name> ] USING <table reference> ON <search condition> <merge operation specification>

                  <merge correlation name> ::= <correlation name>

                  <merge operation specification> ::= <merge when clause>...

                  <merge when clause> ::= <merge when matched clause> | <merge when not matched clause>

                  <merge when matched clause> ::= WHEN MATCHED THEN <merge update specification>

                  <merge when not matched clause> ::= WHEN NOT MATCHED THEN <merge insert specification>

                  <merge update specification> ::= UPDATE SET <set clause list>

                  <merge insert specification> ::= INSERT [ <left paren> <insert column list> <right paren> ] [ <override clause> ] VALUES <merge insert value list>

                  <merge insert value list> ::= <left paren> <merge insert value element> [ { <comma> <merge insert value element> }... ] <right paren>

                  <merge insert value element> ::= <value expression> | <contextually typed value specification>

                  Update rows, or insert new rows into the <target table>. The MERGE statement uses a second table, specified by <table reference>, to determine the rows to be updated or inserted. It is possible to use the statement only to update rows or to insert rows, but usually both update and insert are specified.

                  The <search condition> matches each row of the <table reference> with each row of the <target table>. If the two rows match then the UPDATE clause is used to update the matching row of the target table. Those rows of <table reference> that have no matching rows are then used to insert new rows into the <target table>. Therefore, a MERGE statement can update between 0 and all the rows of the <target table> and can insert between 0 and the number of the rows in <table reference> into the <target table>. If any row in the <target table> matches more than one row in <table reference> a cardinality error is raised. On the other hand, several rows in the <target table> can match a single row in <table reference> without any error. The constraints and referential actions specified on the database tables are enforced the same way as for an update and an insert statement.

                  The MERGE statement can be used with only the WHEN NOT MATCHED clause as a conditional INSERT statement that inserts a row if no existing rows match a condition.

                  In the first example below, the table originally contains two rows for different furniture. The <table reference> is the (VALUES(1, 'conference table'), (14, 'sofa'), (5, 'coffee table')) expression, which evaluates to a table with 3 rows. When the x value for a row matches an existing row, then the existing row is updated. When the x value does not match, the row is inserted. Therefore one row of table t is updated from 'dining table' to 'conference table', and two rows are inserted into table t. The second example uses a SELECT statement as the source of the values for the MERGE.

                  In the third example, a new row in inserted into the table only when the primary key for the new row does not exist. This example uses parameters and should be executed as a JDBC PreparedStatement.

                  CREATE TABLE t (id INT PRIMARY KEY, description VARCHAR(100))
                  INSERT INTO t VALUES (1, 'dining table'), (2, 'deck chair')
                  MERGE INTO t USING (VALUES(1, 'conference table'), (14, 'sofa'), (5, 'coffee table')) 
                     AS vals(x,y) ON t.id = vals.x
                     WHEN MATCHED THEN UPDATE SET t.description = vals.y
                     WHEN NOT MATCHED THEN INSERT VALUES vals.x, vals.y
                  
                  MERGE INTO t USING (SELECT * FROM tt WHERE acol = 2) AS vals(x,y) ON t.id = vals.x
                     WHEN MATCHED THEN UPDATE SET t.description = vals.y
                     WHEN NOT MATCHED THEN INSERT VALUES vals.x, vals.y
                  
                  MERGE INTO t USING (VALUES(CAST(? AS INT))) AS vals(x) ON t.id = vals.x
                     WHEN NOT MATCHED THEN INSERT VALUES vals.x, ?
                  

                  Diagnostics and State

                  HyperSQL supports some SQL statements, expressions, functions and Java methods that report on the most recently executed statement.

                  The IDENTITY() function returns the last inserted identity value for the current session.

                  The GET DIAGNOSTICS statement is supported to a limited extent. The built-in function DIAGNOSTICS() is an alternative. These are normally used in SQL/PSM routines to check the result of the last data update operation.

                  GET DIAGNOSTICS

                  get diagnostics statement

                  <get diagnostics statement> ::= GET DIAGNOSTICS <simple target value specification> = ROW_COUNT

                  The <simple target value specification> is a session variable, or a routine variable or OUT parameter.

                  The keyword ROW_COUNT specifies the row count returned by the last executed statement. For INSERT, UPDATE, DELETE and MERGE statements, this is the number of rows affected by the statement. This is the same value as returned by JDBC execute() methods. For all other statements, zero is returned.

                  The value of ROW_COUNT is stored in the specified target.

                  In future versions, more options will be supported for diagnostics values.


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/book-ind.html0000644000175000017500000022156712007567744020366 0ustar renerene General Index

                  General Index

                  Symbols

                  _SYSTEM ROLE, Built-In Roles and Users

                  A

                  ABS function, Numeric Functions
                  ACL, Network Access Control
                  ACOS function, Numeric Functions
                  ACTION_ID function, System Functions
                  ADD COLUMN, Table Manipulation
                  add column identity generator, Table Manipulation
                  ADD CONSTRAINT, Table Manipulation
                  ADD DOMAIN CONSTRAINT, Domain Creation and Manipulation
                  ADMINISTRABLE_ROLE_AUTHORIZATIONS, SQL Standard Views
                  aggregate function, Aggregate Functions
                  ALL and ANY predicates, Predicates
                  ALTER COLUMN, Table Manipulation
                  alter column identity generator, Table Manipulation
                  alter column nullability, Table Manipulation
                  ALTER DOMAIN, Domain Creation and Manipulation
                  ALTER INDEX, Other Schema Object Creation
                  ALTER routine, Routine Creation
                  ALTER SEQUENCE, Sequence Creation
                  ALTER SESSION, Session and Transaction Control Statements
                  ALTER TABLE, Table Manipulation
                  ALTER USER ... SET INITIAL SCHEMA, Statements for Authorization and Access Control
                  ALTER USER ... SET LOCAL, Statements for Authorization and Access Control
                  ALTER USER ... SET PASSWORD, Statements for Authorization and Access Control
                  ALTER view, View Creation and Manipulation
                  Ant, Building with Apache Ant
                  APPLICABLE_ROLES, SQL Standard Views
                  ASCII function, String and Binary String Functions
                  ASIN function, Numeric Functions
                  ASSERTIONS, SQL Standard Views
                  ATAN2 function, Numeric Functions
                  ATAN function, Numeric Functions
                  AUTHORIZATION IDENTIFIER, Authorizations and Access Control
                  AUTHORIZATIONS, SQL Standard Views

                  B

                  backup, Backing Up Database Catalogs
                  BACKUP DATABASE, System Operations
                  BETWEEN predicate, Predicates
                  binary literal, Literals
                  BINARY types, Binary String Types
                  BIT_LENGTH function, String and Binary String Functions
                  BITAND function, Numeric Functions
                  BITANDNOT function, Numeric Functions
                  bit literal, Literals
                  BITNOT function, Numeric Functions
                  BITOR function, Numeric Functions
                  BIT types, Bit String Types
                  BITXOR function, Numeric Functions
                  boolean literal, Literals
                  BOOLEAN types, Boolean Type
                  boolean value expression, Value Expression

                  C

                  CARDINALITY function, Array Functions
                  CASCADE or RESTRICT, Common Elements and Statements
                  case expression, Value Expression
                  CASEWHEN function, General Functions
                  CASE WHEN in routines, Conditional Statements
                  CAST, Value Expression
                  CEIL function, Numeric Functions
                  CHANGE_AUTHORIZATION, Built-In Roles and Users
                  CHAR_LENGTH, String and Binary String Functions
                  CHARACTER_LENGTH, String and Binary String Functions
                  CHARACTER_SETS, SQL Standard Views
                  character literal, Literals
                  CHARACTER types, Character String Types
                  character value function, Value Expression
                  CHAR function, String and Binary String Functions
                  CHECK_CONSTRAINT_ROUTINE_USAGE, SQL Standard Views
                  CHECK_CONSTRAINTS, SQL Standard Views
                  CHECK constraint, Table Creation
                  CHECKPOINT, System Operations
                  COALESCE expression, Value Expression
                  COALESCE function, General Functions
                  COLLATE, Other Syntax Elements
                  COLLATIONS, SQL Standard Views
                  COLUMN_COLUMN_USAGE, SQL Standard Views
                  COLUMN_DOMAIN_USAGE, SQL Standard Views
                  COLUMN_PRIVILEGES, SQL Standard Views
                  COLUMN_UDT_USAGE, SQL Standard Views
                  column definition, Table Creation
                  column name list, Table Primary
                  column reference, References, etc.
                  COLUMNS, SQL Standard Views
                  COMMENT, Commenting Objects
                  COMMIT, Session and Transaction Control Statements
                  comparison predicate, Predicates
                  CONCAT function, String and Binary String Functions
                  CONSTRAINT, Other Syntax Elements
                  CONSTRAINT_COLUMN_USAGE, SQL Standard Views
                  CONSTRAINT_TABLE_USAGE, SQL Standard Views
                  CONSTRAINT (table constraint), Table Creation
                  CONSTRAINT name and characteristics, Table Creation
                  contextually typed value specification, References, etc.
                  CONVERT function, General Functions
                  COS function, Numeric Functions
                  COT function, Numeric Functions
                  CREATE_SCHEMA ROLE, Built-In Roles and Users
                  CREATE AGGREGATE FUNCTION, Definition of Aggregate Functions
                  CREATE ASSERTION, Other Schema Object Creation
                  CREATE CAST, Other Schema Object Creation
                  CREATE CHARACTER SET, Other Schema Object Creation
                  CREATE COLLATION, Other Schema Object Creation
                  CREATE DOMAIN, Domain Creation and Manipulation
                  CREATE FUNCTION, Routine Definition
                  CREATE INDEX, Other Schema Object Creation
                  CREATE PROCEDURE, Routine Definition
                  CREATE ROLE, Statements for Authorization and Access Control
                  CREATE SCHEMA, Schema Creation
                  CREATE SEQUENCE, Sequence Creation
                  CREATE TABLE, Table Creation
                  CREATE TRANSLATION, Other Schema Object Creation
                  CREATE TRIGGER, Trigger Creation, Trigger Creation
                  CREATE TYPE, Other Schema Object Creation
                  CREATE USER, Statements for Authorization and Access Control
                  CREATE VIEW, View Creation and Manipulation
                  CROSS JOIN, Joined Table
                  CRYPT_KEY function, System Functions
                  CURDATE function, Functions to Report the Current Datetime
                  CURRENT_CATALOG function, System Functions
                  CURRENT_DATE function, Functions to Report the Current Datetime
                  CURRENT_ROLE function, System Functions
                  CURRENT_SCHEMA function, System Functions
                  CURRENT_TIME function, Functions to Report the Current Datetime
                  CURRENT_TIMESTAMP function, Functions to Report the Current Datetime
                  CURRENT_USER function, System Functions
                  CURRENT VALUE FOR, Value Expression
                  CURTIME function, Functions to Report the Current Datetime

                  D

                  DATA_TYPE_PRIVILEGES, SQL Standard Views
                  DATABASE_ISOLATION_LEVEL function, System Functions
                  DATABASE_NAME function, System Functions
                  DATABASE_TIMEZONE function, Functions to Report the Time Zone.
                  DATABASE_VERSION function, System Functions
                  DATABASE function, System Functions
                  DATE_ADD function, Functions for Datetime Arithmetic
                  DATE_SUB function, Functions for Datetime Arithmetic
                  DATEADD function, Functions for Datetime Arithmetic
                  DATEDIFF function, Functions for Datetime Arithmetic
                  datetime and interval literal, Literals
                  Datetime Operations, Datetime types
                  DATETIME types, Datetime types
                  datetime value expression, Value Expression
                  datetime value function, Value Expression
                  DAYNAME function, Functions to Extract an Element of a Datetime
                  DAYOFMONTH function, Functions to Extract an Element of a Datetime
                  DAYOFWEEK function, Functions to Extract an Element of a Datetime
                  DAYOFYEAR function, Functions to Extract an Element of a Datetime
                  DAYS function datetime, Functions to Extract an Element of a Datetime
                  DBA ROLE, Built-In Roles and Users
                  DECLARE CURSOR, Cursor Declaration
                  DECLARE HANDLER, Handlers
                  DECLARE variable, Variables
                  DECODE function, General Functions
                  DEFAULT clause, Table Creation
                  DEGREES function, Numeric Functions
                  DELETE FROM, Delete Statement
                  derived table, Table Primary
                  DETERMINISTIC characteristic, Routine Characteristics
                  DIAGNOSTICS function, System Functions
                  DIFFERENCE function, String and Binary String Functions
                  DISCONNECT, Session and Transaction Control Statements
                  DOMAIN_CONSTRAINTS, SQL Standard Views
                  DOMAINS, SQL Standard Views
                  DROP ASSERTION, Other Schema Object Creation
                  DROP CAST, Other Schema Object Creation
                  DROP CHARACTER SET, Other Schema Object Creation
                  DROP COLLATION, Other Schema Object Creation
                  DROP COLUMN, Table Manipulation
                  drop column idenitty generator, Table Manipulation
                  DROP CONSTRAINT, Table Manipulation
                  DROP DEFAULT (table), Table Manipulation
                  DROP DOMAIN, Domain Creation and Manipulation
                  DROP DOMAIN CONSTRAINT, Domain Creation and Manipulation
                  DROP DOMAIN DEFAULT, Domain Creation and Manipulation
                  DROP INDEX, Other Schema Object Creation
                  DROP ROLE, Statements for Authorization and Access Control
                  DROP routine, Routine Creation
                  DROP SCHEMA, Schema Creation
                  DROP SEQUENCE, Sequence Creation
                  DROP TABLE, Table Creation
                  DROP TRANSLATION, Other Schema Object Creation
                  DROP TRIGGER, Trigger Creation, Trigger Creation
                  DROP USER, Statements for Authorization and Access Control
                  DROP VIEW, View Creation and Manipulation
                  DYNAMIC RESULT SETS, Routine Characteristics

                  E

                  ELEMENT_TYPES, SQL Standard Views
                  ENABLED_ROLES, SQL Standard Views
                  EXISTS predicate, Predicates
                  EXP function, Numeric Functions
                  expression, Value Expression
                  external authentication, Authentication Control
                  EXTERNAL NAME, Routine Definition
                  EXTRACT function, Functions to Extract an Element of a Datetime

                  F

                  FLOOR function, Numeric Functions
                  FOREIGN KEY constraint, Table Creation
                  FOR loop in routines, Iterated FOR Statement

                  I

                  identifier chain, References, etc.
                  identifier definition, Common Elements and Statements
                  IDENTITY function, System Functions
                  IF EXISTS, Common Elements and Statements
                  IFNULL function, General Functions
                  IF STATEMENT, Conditional Statements
                  INFORMATION_SCHEMA_CATALOG_NAME, SQL Standard Views
                  init script, Running Hsqldb as a System Daemon
                  IN predicate, Predicates
                  INSERT function, String and Binary String Functions
                  INSERT INTO, Insert Statement
                  interval absolute value function, Value Expression
                  interval term, Value Expression
                  INTERVAL types, Interval Types
                  IS_AUTOCOMMIT function, System Functions
                  IS_READONLY_DATABASE_FILES function, System Functions
                  IS_READONLY_DATABASE function, System Functions
                  IS_READONLY_SESSION function, System Functions
                  IS DISTINCT predicate, Predicates
                  ISNULL function, General Functions
                  IS NULL predicate, Predicates
                  ISOLATION_LEVEL function, System Functions

                  J

                  JOIN USING, Joined Table
                  JOIN with condition, Joined Table

                  K

                  KEY_COLUMN_USAGE, SQL Standard Views

                  M

                  MATCH predicate, Predicates
                  MAX_CARDINALITY function, Array Functions
                  memory use, Memory and Disk Use
                  MERGE INTO, Merge Statement
                  MINUTE function, Functions to Extract an Element of a Datetime
                  MOD function, Numeric Functions
                  MONTH function, Functions to Extract an Element of a Datetime
                  MONTHNAME function, Functions to Extract an Element of a Datetime

                  N

                  name resolution, Naming
                  naming in joined table, Naming
                  naming in select list, Naming
                  NATURAL JOIN, Joined Table
                  NEXT VALUE FOR, Value Expression
                  NOW function, Functions to Report the Current Datetime
                  NULLIF function, General Functions
                  NULL INPUT, Routine Characteristics
                  numeric literal, Literals
                  NUMERIC types, Numeric Types
                  numeric value expression, Value Expression
                  numeric value function, Value Expression
                  NVL2 function, General Functions
                  NVL function, General Functions

                  O

                  OCTET_LENGTH function, String and Binary String Functions
                  OTHER type, Storage and Handling of Java Objects
                  OUTER JOIN, Joined Table
                  OVERLAPS predicate, Predicates
                  OVERLAY function, String and Binary String Functions

                  P

                  PARAMETERS, SQL Standard Views
                  password complexity, Authentication Control
                  PATH, Other Syntax Elements
                  PI function, Numeric Functions
                  POSITION_ARRAY function, Array Functions
                  POSITION function, String and Binary String Functions
                  POWER function, Numeric Functions
                  PRIMARY KEY constraint, Table Creation
                  PUBLIC ROLE, Built-In Roles and Users

                  R

                  RADIANS function, Numeric Functions
                  RAND function, Numeric Functions
                  RAWTOHEX function, String and Binary String Functions
                  REFERENTIAL_CONSTRAINTS, SQL Standard Views
                  REGEXP_MATCHES function, String and Binary String Functions
                  REGEXP_SUBSTRING_ARRAY function, String and Binary String Functions
                  REGEXP_SUBSTRING function, String and Binary String Functions
                  RELEASE SAVEPOINT, Session and Transaction Control Statements
                  RENAME, Renaming Objects
                  REPEAT ... UNTIL loop in routines, Iterated Statements
                  REPEAT function, String and Binary String Functions
                  REPLACE function, String and Binary String Functions
                  RESIGNAL STATEMENT, Raising Exceptions
                  RETURN, Return Statement
                  RETURNS, Routine Definition
                  REVERSE function, String and Binary String Functions
                  REVOKE, Statements for Authorization and Access Control
                  REVOKE ROLE, Statements for Authorization and Access Control
                  RIGHT function, String and Binary String Functions
                  ROLE_AUTHORIZATION_DESCRIPTORS, SQL Standard Views
                  ROLE_COLUMN_GRANTS, SQL Standard Views
                  ROLE_ROUTINE_GRANTS, SQL Standard Views
                  ROLE_TABLE_GRANTS, SQL Standard Views
                  ROLE_UDT_GRANTS, SQL Standard Views
                  ROLE_USAGE_GRANTS, SQL Standard Views
                  ROLLBACK, Session and Transaction Control Statements
                  ROLLBACK TO SAVEPOINT, Session and Transaction Control Statements
                  ROUND function datetime, Functions for Datetime Arithmetic
                  ROUND number function, Numeric Functions
                  ROUTINE_COLUMN_USAGE, SQL Standard Views
                  ROUTINE_JAR_USAGE, SQL Standard Views
                  ROUTINE_PRIVILEGES, SQL Standard Views
                  ROUTINE_ROUTINE_USAGE, SQL Standard Views
                  ROUTINE_SEQUENCE_USAGE, SQL Standard Views
                  ROUTINE_TABLE_USAGE, SQL Standard Views
                  routine body, Routine Definition
                  routine invocation, Other Syntax Elements
                  ROUTINES, SQL Standard Views
                  ROW_NUMBER function, System Functions
                  ROWNUM function, System Functions
                  row value expression, Value Expression
                  RPAD function, String and Binary String Functions
                  RTRIM function, String and Binary String Functions

                  S

                  SAVEPOINT, Session and Transaction Control Statements
                  SAVEPOINT LEVEL, Routine Characteristics
                  schema routine, Routine Creation
                  SCHEMATA, SQL Standard Views
                  SCRIPT, System Operations
                  search condition, Other Syntax Elements
                  SECOND function, Functions to Extract an Element of a Datetime
                  SECONDS_SINCE_MIDNIGHT function, Functions to Extract an Element of a Datetime
                  security, Security Considerations, TLS Encryption, Network Access Control
                  SELECT, Select Statement
                  SELECT : SINGLE ROW, Select Statement : Single Row
                  SEQUENCE_ARRAY function, Array Functions
                  SEQUENCES, SQL Standard Views
                  SESSION_ID function, System Functions
                  SESSION_ISOLATION_LEVEL function, System Functions
                  SESSION_TIMEZONE function, Functions to Report the Time Zone.
                  SESSION_USER function, System Functions
                  SET AUTOCOMMIT, Session and Transaction Control Statements
                  SET CATALOG, Session and Transaction Control Statements
                  set clause in UPDATE and MERGE statements, Update Statement
                  SET CONSTRAINTS, Session and Transaction Control Statements
                  SET DATABASE AUTHENTICATION FUNCTION, Authentication Settings
                  SET DATABASE COLLATION, Database Settings
                  SET DATABASE DEFAULT INITIAL SCHEMA, Statements for Authorization and Access Control
                  SET DATABASE DEFAULT ISOLATION LEVEL, Database Settings
                  SET DATABASE DEFAULT RESULT MEMORY ROWS, Database Settings
                  SET DATABASE DEFAULT TABLE TYPE, Database Settings
                  SET DATABASE EVENT LOG LEVEL, Database Settings
                  SET DATABASE GC, Database Settings
                  SET DATABASE PASSWORD CHECK FUNCTION, Authentication Settings
                  SET DATABASE SQL AVG SCALE, SQL Conformance Settings
                  SET DATABASE SQL CONCAT NULLS, SQL Conformance Settings
                  SET DATABASE SQL CONVERT TRUNCATE, SQL Conformance Settings
                  SET DATABASE SQL DOUBLE NAN, SQL Conformance Settings
                  SET DATABASE SQL NAMES, SQL Conformance Settings
                  SET DATABASE SQL NULLS FIRST, SQL Conformance Settings
                  SET DATABASE SQL REFERENCES, SQL Conformance Settings
                  SET DATABASE SQL REGULAR NAMES, SQL Conformance Settings
                  SET DATABASE SQL SIZE, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX DB2, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX MSS, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX MYS, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX ORA, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX PGS, SQL Conformance Settings
                  SET DATABASE SQL TDC DELETE, SQL Conformance Settings
                  SET DATABASE SQL TRANSLATE TTI TYPES, SQL Conformance Settings
                  SET DATABASE SQL TYPES, SQL Conformance Settings
                  SET DATABASE SQL UNIQUE NULLS, SQL Conformance Settings
                  SET DATABASE TEXT TABLE DEFAULTS, Database Settings
                  SET DATABASE TRANSACTION CONTROL, Database Settings
                  SET DATABASE TRANSACTION ROLLBACK ON CONFLICT, Database Settings
                  SET DATABASE UNIQUE NAME, Database Settings
                  SET DATA TYPE, Table Manipulation
                  SET DEFAULT, Table Manipulation
                  SET DOMAIN DEFAULT, Domain Creation and Manipulation
                  SET FILES BACKUP INCREMENT, Cache, Persistence and Files Settings
                  SET FILES CACHE ROWS, Cache, Persistence and Files Settings
                  SET FILES CACHE SIZE, Cache, Persistence and Files Settings
                  SET FILES DEFRAG, Cache, Persistence and Files Settings
                  SET FILES LOB SCALE, Cache, Persistence and Files Settings
                  SET FILES LOG, Cache, Persistence and Files Settings
                  SET FILES LOG SIZE, Cache, Persistence and Files Settings
                  SET FILES NIO, Cache, Persistence and Files Settings
                  SET FILES NIO SIZE, Cache, Persistence and Files Settings
                  SET FILES SCALE, Cache, Persistence and Files Settings
                  SET FILES SCRIPT FORMAT, Cache, Persistence and Files Settings
                  SET FILES WRITE DELAY, Cache, Persistence and Files Settings
                  set function specification, Value Expression
                  SET IGNORECASE, Session and Transaction Control Statements
                  SET INITIAL SCHEMA*, Statements for Authorization and Access Control
                  SET MAXROWS, Session and Transaction Control Statements
                  SET OPERATIONS, Set Operations
                  SET PASSWORD, Statements for Authorization and Access Control
                  SET PATH, Session and Transaction Control Statements
                  SET REFERENTIAL INTEGRITY, SQL Conformance Settings
                  SET ROLE, Session and Transaction Control Statements
                  SET SCHEMA, Session and Transaction Control Statements
                  SET SESSION AUTHORIZATION, Session and Transaction Control Statements
                  SET SESSION CHARACTERISTICS, Session and Transaction Control Statements
                  SET SESSION RESULT MEMORY ROWS, Session and Transaction Control Statements
                  SET TABLE CLUSTERED, Table Manipulation
                  SET TABLE read-write property, Table Manipulation
                  SET TABLE SOURCE, Table Manipulation
                  SET TABLE SOURCE HEADER, Table Manipulation
                  SET TABLE SOURCE on-off, Table Manipulation
                  SET TABLE TYPE, Table Manipulation, Cache, Persistence and Files Settings
                  SET TIME ZONE, Session and Transaction Control Statements
                  SET TRANSACTION, Session and Transaction Control Statements
                  SHUTDOWN, System Operations
                  SIGNAL STATEMENT, Raising Exceptions
                  SIGN function, Numeric Functions
                  SIN function, Numeric Functions
                  SORT_ARRAY function, Array Functions
                  sort specification list, Ordering
                  SOUNDEX function, String and Binary String Functions
                  SPACE function, String and Binary String Functions
                  SPECIFIC, Common Elements and Statements
                  SPECIFIC NAME, Routine Characteristics
                  SQL_FEATURES, SQL Standard Views
                  SQL_IMPLEMENTATION_INFO, SQL Standard Views
                  SQL_PACKAGES, SQL Standard Views
                  SQL_PARTS, SQL Standard Views
                  SQL_SIZING, SQL Standard Views
                  SQL_SIZING_PROFILES, SQL Standard Views
                  SQL DATA access characteristic, Routine Characteristics
                  SQL parameter reference, References, etc.
                  SQL procedure statement, SQL Procedure Statement
                  SQL routine body, Routine Definition
                  SQRT function, Numeric Functions
                  START TRANSACTION, Session and Transaction Control Statements
                  string value expression, Value Expression
                  SUBSTR function, String and Binary String Functions
                  SUBSTRING function, String and Binary String Functions
                  SYSDATE function, Functions to Report the Current Datetime
                  SYSTEM_BESTROWIDENTIFIER, HyperSQL Custom Views
                  SYSTEM_CACHEINFO, HyperSQL Custom Views
                  SYSTEM_COLUMN_SEQUENCE_USAGE, HyperSQL Custom Views
                  SYSTEM_COLUMNS, HyperSQL Custom Views
                  SYSTEM_COMMENTS, HyperSQL Custom Views
                  SYSTEM_CONNECTION_PROPERTIES, HyperSQL Custom Views
                  SYSTEM_CROSSREFERENCE, HyperSQL Custom Views
                  SYSTEM_INDEXINFO, HyperSQL Custom Views
                  SYSTEM_PRIMARYKEYS, HyperSQL Custom Views
                  SYSTEM_PROCEDURECOLUMNS, HyperSQL Custom Views
                  SYSTEM_PROCEDURES, HyperSQL Custom Views
                  SYSTEM_PROPERTIES, HyperSQL Custom Views
                  SYSTEM_SCHEMAS, HyperSQL Custom Views
                  SYSTEM_SEQUENCES, HyperSQL Custom Views
                  SYSTEM_SESSIONINFO, HyperSQL Custom Views
                  SYSTEM_SESSIONS, HyperSQL Custom Views
                  SYSTEM_TABLES, HyperSQL Custom Views
                  SYSTEM_TABLETYPES, HyperSQL Custom Views
                  SYSTEM_TEXTTABLES, HyperSQL Custom Views
                  SYSTEM_TYPEINFO, HyperSQL Custom Views
                  SYSTEM_UDTS, HyperSQL Custom Views
                  SYSTEM_USER function, System Functions
                  SYSTEM_USERS, HyperSQL Custom Views
                  SYSTEM_VERSIONCOLUMNS, HyperSQL Custom Views
                  SYSTIMESTAMP function, Functions to Report the Current Datetime
                  SYS USER, Built-In Roles and Users

                  T

                  TABLE, Table Primary
                  TABLE_CONSTRAINTS, SQL Standard Views
                  TABLE_PRIVILEGES, SQL Standard Views
                  TABLES, SQL Standard Views
                  TAN function, Numeric Functions
                  TIMESTAMPADD function, Functions for Datetime Arithmetic
                  TIMESTAMPDIFF function, Functions for Datetime Arithmetic
                  TIMESTAMP function, Functions to Convert or Format a Datetime
                  Time Zone, Datetime types
                  TIMEZONE function, Functions to Report the Time Zone.
                  TO_CHAR function, Functions to Convert or Format a Datetime
                  TO_DATE function, Functions to Convert or Format a Datetime
                  TO_NUMBER function, Numeric Functions
                  TO_TIMESTAMP function, Functions to Convert or Format a Datetime
                  TODAY function, Functions to Report the Current Datetime
                  TRANSACTION_CONTROL function, System Functions
                  TRANSACTION_ID function, System Functions
                  TRANSACTION_SIZE function, System Functions
                  transaction characteristics, Session and Transaction Control Statements
                  TRANSLATIONS, SQL Standard Views
                  TRIGGER_COLUMN_USAGE, SQL Standard Views
                  TRIGGER_ROUTINE_USAGE, SQL Standard Views
                  TRIGGER_SEQUENCE_USAGE, SQL Standard Views
                  TRIGGER_TABLE_USAGE, SQL Standard Views
                  TRIGGERED_UPDATE_COLUMNS, SQL Standard Views
                  TRIGGERED SQL STATEMENT, Trigger Creation
                  TRIGGER EXECUTION ORDER, Trigger Creation
                  TRIGGERS, SQL Standard Views
                  TRIM_ARRAY function, Array Functions
                  TRIM function, String and Binary String Functions
                  TRUNCATE function, Numeric Functions
                  TRUNCATE SCHEMA, Truncate Statement
                  TRUNCATE TABLE, Truncate Statement
                  TRUNC function datetime, Functions for Datetime Arithmetic
                  TRUNC function numeric, Numeric Functions

                  U

                  UCASE function, String and Binary String Functions
                  unicode escape elements, Literals
                  UNION JOIN, Joined Table
                  UNIQUE constraint, Table Creation
                  UNIQUE predicate, Predicates
                  UNIX_TIMESTAMP function, Functions to Extract an Element of a Datetime
                  UNNEST, Table Primary
                  UPDATE, Update Statement
                  upgrading, Upgrading Databases
                  UPPER function, String and Binary String Functions
                  USAGE_PRIVILEGES, SQL Standard Views
                  USER_DEFINED_TYPES, SQL Standard Views
                  USER function, System Functions
                  UUID function, General Functions

                  V

                  value expression, Value Expression
                  value expression primary, Value Expression
                  value specification, Value Expression
                  VIEW_COLUMN_USAGE, SQL Standard Views
                  VIEW_ROUTINE_USAGE, SQL Standard Views
                  VIEW_TABLE_USAGE, SQL Standard Views
                  VIEWS, SQL Standard Views

                  W

                  WEEK function, Functions to Extract an Element of a Datetime
                  WHILE loop in routines, Iterated Statements
                  WIDTH_BUCKET function, Numeric Functions

                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/eclipse-gradle-cfg.png0000644000175000017500000004304112007570374022077 0ustar renerene‰PNG  IHDR€Zˆ¶XsBITÛáOà€PLTE­Ü†}É=3f™+B„KJIC¬èëðû3¦rµ´´îï»”‘ÔÏÍ«§¥_¸ëTªÆ ,}vrÍðæææ‚¢ŸÁ}~_\K™™™®bbÙii$"!CB@ÌÌ̵Þö‡„ƒÃppÞÞÞõ÷ò•SS:ˆ= ¸Ð™™™<:9ÅÀ½Ì™™J}{{qonØíùÝÜÜÙ°FEÿÿÿ1eßæös‚™ªjj°Î±Ú×Öqqˆ£Õò¶¨­¤‚Z[¤cïïŠÄ³sÈÎݶbHæßßùå•” ¸Æï[l‰ñÑuX€´i~8ÊÆÄ¹¹¼ÌffËÜÅSRQ¡yrÁÉÖQ##ìîå½XXܦ fffÃGTf‚‡73‚ÃVñøÿëèç333滯⋦¥¥çïø·„†“®Éæ÷ð?QŒ‹Š¹ÒÔ±ÎM—V‡´nççÐqˆ±qö÷÷XW܃qê——™Ìfõððf¾®ª¨ªsc*(&][Z¼´‰àa[»¶µæãá/,+·9. pHYsØØH‘¦!tEXtSoftwareMacromedia Fireworks 4.0ê&'u IDATxœíŸÚ6ž°§Û:m90éN&ti1!L6û’©Ûiif—nÞî$Û˜7½,—4p%MŽnÓ×ë”Ýeø×_I–lÙØ`ƒAÀ|Ÿ–_²$ËöYòXòÞ÷ß?ׇ†¬ÑÇ5ˆþæµ;{ß»Õ(>ŸÇy\Bè&£ƒ³Pý$ÜIk=袆oOœ=‘p熟Øw®&‘‚u‡wö"ƒ€Ë˜peLÀj·»7Œ^J ¬Êe¹!r¨±Ë¸Í.¡`Ò5mŸÕÖ£ÔÃg ' ÂÁGn€¾§Ï°Z=2È®90ŽBÜ8WcàB.°’Ôü[›€œ¼¼5 7¸Á‚†\ øÏþó¢Õð%q7\k,c`Ø&Š3p“H¸PöÁ2Šõ/–€G¼ž~k<™´é`OÀF£ñÏÓŸÿûâ‘—Fs7¦Ùl-!`Uà2¦P Æq™\cé·ÿ®}zhnýtä·Æ•©ì øÏÏ?té‡8.³$år×][Ó0DŸ„—6ÐÄÌsÐ$o˜©PJFtºþDË#,Ëöm‡ç~=ÊÌ \eÖx2u;5V±½`W@tþ½ûè”ø÷Ƨ®³¾d+¬#²F)xvfâjŠb%JAb‹®›þ sHSäÃþ~ QsUÿ)ÃÈEúE?ÞÖ¯Í?¬ÇçeR••9=¨53çXsäÉô¹ÜÛ¯Ö&e/˜ðæMêßÿ˔˜70y?Ï„œƒ˜ŠË)Hj¿®bŠmš ©$ÉM«VjZËÒ†µII3ÕÐÇQÝ’dún3’Õ.ã%’† Vqø¡ÕÇ)T]šÃ²bJ$½yˆrÅùµÇÓìšN&gÎjÜŒU~+Òo™0Ö£ÓFjØ6§Ç±¦h­œc 'ÓAµ'M]/Øðá&Õ€Ñç2¦NÞ?5B\@ÈeEŒw$Â,tNÁ²RUª¨†;lg†ýö¡™C [®÷Ê*'à~nXlÓws¨–‡#/±š$ ')Qn(†T<«˜Ž€Cœ«Žósñ‘iFSæEªÓ½dö-(w¨‰U©]¶•*§ .–ZC£4 Á¼Lç5³~ {Áž€'?±úïÃ?tl”1]òÞ iVcàJºÄA É)øì¬`µp%uh!K‡f5›XM*™&' Ú6-únûJE#çRËiÿÑð3•ü_j»®€(G7?“E&«é+5MO¹â[WÇ—?ÒDFSš(ÍÑÃi°‘àZ«[>0jž5T¦úDëu8™f×€GƒCc•éf¸HEh:µ@¾«‡¸IˆÏËΫ7BÁœ€È´®JßÑσ‘]#§àÌzè„Dgy'—Þåê,â"âŒÄU}iù÷¹£‡Ü”º GÚaÀÁÝ.zÃ} ×{«½º̵_¸õ߇/XPËÉCÎiìl¾¼ëUÐuÐP“ΤòY©zV«Ûœ€’qP±ŽL§‡Œd±sÍ\¾£l¡Ù˜`ó Õhfl7ÜP)6Ñ)Øj5Ž€N~¥sôƒDf«ÁÍ—/¶}kÓ/øG7G².;ẕ£V¡Ö¨æ¼`WÀÆ?OŽ™OÜË0ò(oŒ´þHfÁc`RI°«4Îd¥;²ÎÎkÅ V:f”•^¦R¢×iÐGC²êÕ¡óŽNÐj©7"u_F)ÙÕá ÷ÔzV®4l)¨crˆÃQ~ãJi„~8YQIF³Ý[¡}éù‡ÎÁ¼9ÖààjÊç^0wHýk¹¢UBAŸœœŒµb‘ÿ³Ê7RA¹Z|†Û_úÙ5‡øR ú<#/ŠÒæ‰E.Åwý²NzÄÎÿÚù°ÐÁá(6Éʼn@~ë?º“/N˜Š|BõC->OBÓ#š°`îOqò?ÿyú¿~øÆ‹r•CË×úHÚB-ïÿ³^•`Z &rpÖ'LwNcS±¬Ž<;ÊÜÕ'Ù–vÕÂú…ÞóR5°Z+¨‡áZ£…Êägß ƒ(G¹An4.¤Q ¦¦`"cX¸ ‰¸j[Ì»¤î-d_ÊúaåÑ£%ûõ(·B­™–i¾€¨yX6ŒFP¿.¡àŒ«áÂ2Æ“nõÒ´o)ýˆ‚øâJˆÖƒãÍ\—øCÉ"»x š˜* vÁ³€vså£ .ÃrÆ”0¶áÿFWõç:q".Z¾%­‹­_’cº¤>Ë `ISsp)W`ãREYlë´ož~éú’º€+SpÑsòr.îcJ«]t«£öâféç˜øfsHƒgo¾ ‚xöæsˆà™£àÒïMÃ3Ç?ÓðÌóÖÍ3Þ?X3>ýxD— ¸< øG<Ú"³Ù4r‘;%”Q²¼ÒYó…fÊ¿PåŽR*õìY <é¬ÚÎŽäåÄCyøêæ³ÆÜ˜Ï¦ý píÈÃêHš•ÕÖ hf“Ì´êEò㫯~Aüç>xu8;j˜!¶² K‘ͶÚÚ÷ {Ò«Á‹Y³W¢YrL¼º—f¤–$#§NêU/ ÖÚ–Z;à‚ô±RR2Qù„¥Ì¸ ¸Òyµ“p^WQ|ô¥Ü¶¬vYçbd|1øœœ ÷o.Y>—Þ¬´K½z9î!Û)~|ðÍk„_¾ù݃?Ίê_ˆ€ílŽ%ÉfÕR@6£jgñ¡”›¹lŸ+nî¥i7 ø­˜­û¨£æ [ã‚YEÓTœSX>!)I…”Ž×Æ]æ¨4)veÔ’(›8Yæcx©¼bøsNm.~Ë«’íŸUû3Ï»Ê ÿ>üñLJ£ëÀgáþ…8ɺ'ã,i(!%5rœœÀaÖfGÄ¿€¥ÑôCüÖÌ–| PVþ áœÂò IYqð¥ËšÎà:P3þKj;éÚ| O)¯œ¦6×)êt^“l+úí6¯þó—×~|øÚCôzí—ÿüõÁ«¨ˆQþÍm9g+txºÉ$_œ#â-ðÈf‡î›/AS©Ytú:ÇAaù„¤ôð¥ãµa1u§tGì Igñ1<¥¼\ùœe`KÂòªg³%©ÖØv†Æƒß½öÉ Úï—‡ä$ükäI8Ê¿y§`òáI½–­4‡Þñóx%î[ /ˆp:Ÿ”Szgþ˜´ØUöÅ“†Å0SXÂòêМ48.¯~ýÝ/ŸüøÚk‡¯¡šø[X´áp˜@@_'„|¸ç2T;6Ñò,îDúxÝD¿€nïp¹AÜè#ç¾°|BRN‚ÉG ×V£COÁ, fÅæÜÜà)˜[[³Ì>V;É$àk¨òC‘o~ý øëŸCb ]§ý » SÁ—aÎ3’»wæ¤vÔWðɦØp¨”-ûD è&ð—„}†ÓúË'$åT'„|Ô²¹fF wBšŽ¿ãÀbør¥ÅæÜÜ`'„å eÎGÙÁ2GrKyðë¯ß ª ¨¾ö+âÓ‘†Iô.D³cyÔé™*¾ÎP­[j‡fØ‚ƒ@­é¾¹ ¼Ãå‘ë}Òð É'$åÔeòqPSKR+D@”Åôeƒ‹ë#˜SpsIhH^åN¯Ô4“¿­ ø»o~ù ¨?üõ_ß p˜\ÀääJ‹ÞÊñõ}ÏgI2Ó]p`>HÀ_÷»ß!ÿã—wp8-àp-*£ùq¦±ËÍŒ”/Ï’Lˆ ñÚð¡óåw¦Ú€süÈAÌÍ-©4ikk_í†cyõÑî—oÞ¡þ=ø,e–€¹lÓÝ0Àæ =p¼cþ½ó`ꎄH?â…øó";Ó¿„hšF§gT~âÇ´èÔþî½ÿÕW_íïïÿñ5â­·Þ*{âN¤ƒF |‡øçü!îo}íñ§?½…9a:½^H T>x‡ðàÏôÁ_¿õõgZ]Ú/üáõ“?ü¡r²ÿ§·*Ž€ÏŸƒ€@Êh&wD¿bä·ø?‹“.HùO_óú€@º4Ü]0õ¯ùENX{«åž~A@`•|þVàZ 9ù~-€À 9ùøåé×OoLóôköíãH™³§Oo¼÷q$ïq ŸVA@ U¾zúÞ¿ÿWÿÀü»Ë»7ž~©òôÆÿý#È¿ysqãé|³Ù¬R;µ=À–qõ½ÿóó-åöíÛï:\çÎÈWc¨ëGõ}A›lW¯‡˜ç¹wý=?ñÔÏ-=K¿gGªU§÷Š–÷Õ^ŽÞþ›-ôÔ<þ쫦®$‰Œ¦í«½B–²ØÙâD5 ½¶¼ÆÝ¬ GÀwÇãñ»×©|Ž~øŒËzŸ!n$°Zo{¶ƒ½¾-µšÕî“•Êe ÜÆ7©÷éò™¥,v¶sž+¡Wg½{X TÀáp˜ÿò6ã:±ï1㽪>lÄ1iz¢Š«ky‹ÏÛ4ZK×[xðˆ~Øô‡­á¡u4ÅÎVõ&~Y:°{¿E6O¾äìûò1°Ù¸ñøË/¿ŒYÊJÆ~bŽêª;†ÍÆN‘EýA>Y";«{/`׸Jøx8ìæ¯Fñ´:oÝ@þ}ûîª,L”|’ pmçêu|éåãFóà+"àã§Ü½17nt±€3Íñ(0èßÂÆðñ¯>~Jü»îh÷}‰†ïßøê«ø*áÿ€@Ê8^¿þøþÒó—.ׯ_ÿùçŸÑ;®¿ýØ<,– øî»üßÝ×}°?Ð}ûí·ï]­e¸z\`æáÜC‹nsþ! °ú ½}s†€Ë\4ò/-б½7R©­¡ï†T’ oI¶¤Ö«äKvB¾`ª‰y 0K ˆB>"àÔ2™žzßÿ}èŸâd9TÀåÿbJø×"Vê¦ÖÖõs«R­XçÞ’ÃL§T%?Ïku§ÈçVÝhí°= &"–€EWÀ¢ï1r†pŸ€3ÿ²¸€™žLÌwÔ^Í@_k“^¡2‘F¸ÀR¯Âõ¨ýNœ]R¨ ·J[¢ëŽóåÀrâÔ©ˆz¶¯šzy_íåšèW^U TÀ–­à1¡ó‰' Ç”³–Mɲ†»aL¹S#*clã¯ö¸VB/duQéÛ¯~ô Ø©;s2ÙøÌªÙ>ñC·I h;»MmÑý—m—u]j5«œ®÷¥rYrÌHFÕ.¬óHn)±L‹uÜhÊÚÄ`Š%0– ü²dÙîËrF è€Û€=«‚ê1 ×eÍ’O@òauÝf6ÉoôfÐyŽÎÇ6Ò²åØAáÐS4àc”kuüž±{¦i:¶Ñ—Eþ¬Ç¥õÕ€ˆs|juj@%¬ìVh ØkÑEdéQ]ÍfMGݦˆW…ƒ€9좀å^ ½·kãrÆ/ ¤ ¨ŸOt½HÚ€õÐ6`—¶;ûtYjçªÃ£ìT Ä`”s6nŒ¾ä°€Ú…£vT°­5ê5ÜÜzGÞ’a¦c9½àf¥ã춪U/5& ÒG=⬯ ¨IÚYÙrH·‹p}¿ÓC_“€²‚ÞûRIø” ¶¥£ÔÚ%¥†Ûx†dfË:m¢wS­Ÿ;?­úÝoG¶eáë€$µÑ.©yü­¯öÜ^pÇR2ë?ž[ÇZ\«ùKˆ 3t®‰™n~MÆrVYwX13]¸8lÜß‚D€€€P@@@(\Àéq¡]x@×ç (º—;%6‹Eþ똸;€€€P@@@( ÊâvÇ#ü1Z¥i€€»Ã 稥uI”QTÄдdw‡Å¹ °0ÑŽÃ<Êðd8:ÉðìmLoϰTÎ'[4ªÒS3ŠkË®Fƒ@@ÀcN (7°9úHëv5dà¹Ö=Ó˜ºïÌ´¦·œ…6Ǻ>>[i ¨‰þë ‹à¤Ss<Ìèzùs}t€ê2C× T“5µPÙ¢»«Ój4ò*OÁH¿[1 Ù ©±øƒñVñH½u­)QŽÁ½?¯ h|®£Úk„ÎÄÃt2y§Ñ€€'î)™…žQ¸:µØú­ÚÁÅîúÚé¯)QŽþ}?OÀ¦ÖE5©5§Bã Ô€n*Ï_ªU«åÕ ˆýÓßxÝáÖ÷˜ùÎR0æ\Õ¡»W@JñkZÜÀމ<¹Ü¢5›¸ ØÕºÃéS0‰È¹’ñ¡]ÜlÒSP˽|ùòâòe¤ÞëØ¯ï_Îe†Ág£$‚ì7FÒ”_¸ü„X¼ ó×$*G~×ÏÐéΞãq†n/¸kœŒÏƒ:é"W@>T;'}ÚA^‰€o°ðõ×±‹ó|Y ♪#ëÀ‚>öÉ uÒ‡YÌ4Ðä>™€—ïÝ»wåÊ;×®½|ùÓ¬Ä ÃÊxsL˜š.j±ãEŽ' Ã‘¬‹ùsÇ bÿ^¾í;þMÛ;Æï§{žt{~C üîoxªê¿3MÓT;-w©1“§%-™+ g ÊjÒûÒðÒ”a5`ø¨¿xÒ…%¡e<½{÷ÑÍG­VëæÍ›LÀ¼RR¨!“8õ5RÀá_ Üp¯!Þ¾õ&ÇÛ8èÚÞ¿÷ö®Ejàwÿ†ˆ§œéxŒ(EìÓÉ$Šøi*¿yqZ;4'àŸ?äøs0÷%ñ xß™*ïClYu-c‡'žÅŠÈ™w;Ä¡#ûÒðÉñµk/l$à©]*ÝGç4ôu︔mßœeàÛÿÛÛøåü‡¬e±yIEdz¦;ñà¨máÃÌ©–=ævéoφ N@Y³¨¦[z½ /ào¼¡ÓÉÜßè¬åO‡(÷NpzR”œ¢äd¯ !Ó#ÒE¬¥e|væ]ºS©€•:Û«4O//>ÛÀWWn$±kÀ›¥k×&7‘u½wnJ÷ÕÓ›¶^ÒJïí¿¿M^ìØ;’ožASÊ{*צÔלŠÒЙHû§ŸžùjÀvPÀ’Ï+¼€Ož<ÑÑëWM¿¹)Og-j7FIz\’ÃÀ+CØôˆl‘ï°¿¸ëAlœO7O//îkp ൾð#à5å§ê5z ¾Ùsü}͆Ÿ…q׿ðdélÂt\iL ß<ƒ&úî¨5Ò@4GNíæ èýspDXZP@|È‹¼€÷ïë¨opz|ÿõ׿øÍKIæsÖRAÆÛ’¾O¥)¶½2„M8â*__ øˆîT* e8Ÿnž^^Ü×àSpà lÃă[CòX!ùx€ƒîìÝyaY/ÐÇïÛ¥½½=‚ÿ§o¼øú‹{ ÆkŽÔ¢;Ï ›óÈ ÈØ–Ò÷¤rK–÷d3Ä¡ÅZ}ªćÜà<>ÖO_¼Ž¯g¾~Wv3–Ý”FIÓJ†Û‰!9øOíÁéùE^_<òÔ€|žæt¶5¦-à†! y±ÓêbÞ)•ȇzÿû;߇ ÈøÝá¿}‡_üλw<1Ø<ƒ®€Üă95äPÞl}xúæé‡wñ§—׸E×€/tÔ1h}ñ®ÌúÂMé~âYk5ÛÊ­èÒéÃ<Ö½NÌÚ€|žÓ×b9\é‡u|åE/B@Î@ç Œw ÆÝ½í ?Ï bí‘1PÂ|þáÝŸßýð.þt³ÒêøìÙÑØ4†!mÀ¯NudÞ£×K1¯{…½µz½‚'”Û"“§LñMˆÞÔ<Ø[­¾ ƒ¡²^0Ÿç´€Á5‚€ÿÙW:Ž3ðmr æïüórÛT~žAGPT­ö(äPCDM@;ƒ*Tuœ#{Áû¤ûˆ]Vg)}gR¹×ó¤À>`ÂôMˆÍéñe ©Ýë€\žÓ×xÁ¼‚øƒ_À+‰ðþ(‚ŸW÷÷xÏkš³w_L /å>â³ß~{ý ¬­Ó†]äI%ÇÄ‘wH@>FB‘‚\%¸œ®€~xú&Jép÷ |~ãîr…‰³&ž$S-ÆËqNdúµ¹×¤¿EI•„Pý$Ыc>¯nîÞ}á>Í磛ÉRRî¾þƯ¯Æ?áw#L}Ýnï¥B.¥»™€Ñ…š“r €€K±Órpñƒ ^t•³c&ùÇl‹ 8øôÓõ86pËYXÀ–ò£Òšc-€€[Î*‹ ˜ |.¸å,( ¢ËŸ~úi }º¨j˜dþ'Ýë¾'Šƒ€@ ½"^➉Äû·=˪Z{Ò}`Ä©‰á¾{¶?Z\XÏå°fÙ‘j¡ Ïy4³ ?é>KÐ>ݼèÄ9c÷þ¡6à@pmÀ¡up` ñ3ìƒZ=XÚAÙ“MAÀ‹N¬6 1)ê?ÔÁm@ôIC2m]og\²óXg¾ Hžtï=Ûy•Îü+º97°âuB¦ê?]´ÐÞOL÷WtT@ú¤{¿€ìéöbij< øÖ`ðé§Þ9¸kâšÎ캞™œ€¤Jĵ ,¢¤£å¢4©Èr¾£öj†ìÝÓ95¨X+‹^TÈ…h·R$ýÜzÑPa]bö¤ûz­Kžk¿¾6 »Cعc<§´Ž,+cl׸ۂƒÃW¸¯¾è\ˆf*äm(®€y•õ‚é“î«uKy½`útûÕ ÈÆÌ´½y4Æ’'àÔ0ÆUìd š… ^D¨€ø& ºÄF ÒA®»çQ1=¨PÞø‘¨;‚¾Œ€C¸€:~ch Ø®Ë3¤ô”EoÓÅ`–€å­ÐÓ)Ød$“2¨NÁëâètué¨A9GzÁ}©¤ؘÄA… àºØ}fç\pL!°&v^@`³¡€€€P@@@( ”Ô3LÜVÒPÐ0ÍYŠþc'ÁŠô Óœ7ð(þ0!1¹Ìg ¸l"ú œ¦™TÀh!CbÆ0ÁëB^€Û³6£Œ½`}̰Œ4’Ÿ‚ƒÃ4³…žš×WZ¶Zº#6½!™,¼¯š¤^+NT£ÐkËÞ¢`NÓã:AÀ­cŽ€Æb‡ifñ=÷}âJF2ªvÁ±ÉnÇ÷ÂËŽVó\ ½:Þ¢@N!ã:AÀ­cNÓÌâQGÎ`¸Ž¡ë¶7b“ HrÃñíüX«ªÞÄ/Ë[È)d\gJ.0: ~«5œ¿ºÙÍŽ¹iÓë°:VT†ifñ¸Kg|0~BOÖô bC2ƒáYÝ}±EŒb IDATœBÆuÆŒTŠ*}zÊjBÝ9$ª¶Õ…çàïxá3Ë5gkð Å‰¸‡N®FÀÀ0Í` H‚è_òᜀlŸSø¸ÎùRVuö¶”™]ê®$ɶÎL2¨%®_“ÊÑQ'2^@cf¹æoÍ0#ͳ*V#``˜&ßrÓ$í¬ÌCYó-Î Èñ9…ëœ/ 4ÊV;:]‡®éÙýÕ!#Iq} yRÔ˶…eeýžò¾ÚË¡ªVÏ´'¸EÊuœÜhl9Yæö¶hn¬¿ÄuØ ¼œðöq9ÌìxálX!)½[NnM|YY\nG{·×ÎJ Ó$»°?¤û¢c)oûÝ!™pN@¶ˆÏ)|\ç|']Z! ñ>¯ô‚‰^5Gá¾ÛjYh}R¡‰+!æ¼ÔjV;h7Œ­»ïïyÿ úîr¼žnièö¶hnìß ÷φ­ÀÍ ¡ÖT5wHs˜ÙñÂ1ÜœpéY9¹5ñeå‚9#Ï«fE.7LsÙ:›Ã|jV#«(â–S«£Û[ï´œ“¸Íú@… I¯äÎqTvÖÇœ£¾PgL¾ò]#¯`»ËÉ¿ ì/ímÑÜXkk8ð+`šv£ai3;^8†­ÑœXc—“[_V7®—ò½(ÊÀuB–£µh“$F'¤‘•ðÙ-K<ö­¦5ì nŒÛ¹éUðÇQÝ’ ¯ßsTW³¸/„£êþ®‘ײÜå˜WoÑÜX)Ë}eëβ*ÕÔ tlšÃÌŽŽÁeê/'[ëá¡5øâ²Ïëû¬°—Y0a¬^pw‚Þ‹¤z¶sm½³½êË9,*ÝÜ‘âU@v®:<Êúj@éSâ&£¹Å¬ÛT@’ÃÌŽŽá«ÕX95 ƒÅårCÕsñpÁ]¾,)àÂ̰~ž‘ú•´õb©¨çJE¯Gu!ÚòY^òšhJ¿Iú=#‰´ñø®‘¿ (±6 &鞀4·˜mÀŒs vr˜Õñ"1 |»Ž•“[_V—Ëmçڀ˜/`¾‡'‰Kv|5Û@'eÔGæ%)?ôtéª=£X¶ìõ{ŒvIÍãå¬ìuH–]ŽBjÝË‘æÆwBÙWº‘Í&[ìáNˆ“쎉1Dßs%º.·œÜš¸²²¸\n;× F’ Ñ3®úY¼u¤FÍë;ËȦcdf]ˆ»{×E‘DÀ‘óŸý šç©g¹ßÕ¤ÁühqÍI>"îê¹x&f¶-Ù¬7{JY.@a¢äã6ã’Ä]=óìîu/º€À*¡\$e`Y‘€›7,s+þ]DV"àË6™ô – ë}Æé†ÄÉú?AÀm%]#‡eFëÃÇ\Öh,㓃€;BÚF ËŒ' ÿW^ŠPw†”OÁSÃ2º+˜Ðì¹–;3Õ• à¶’z00,s¡»‚ õœWÍͼ3!'Pô¤H™íåÕ³†Bí¥/`È°Ì…î Æ”%î<;óÎ`LB—Øm©ÃŒ(«r«/TnêÓÃ2é[²»‚1Ò'àÌ;ƒ1ILuW.E$Üò¾ €SÃ2Ý·$w“oÜßúgß ¦ÏÖ 85,“¾%»+8Øû=$ýo,  ¹ÿ€)_† ˤoÉî žpæÌlâ^ðž¾)ÏB2AÀÕ^ c÷yÂ)8e¶UÀXl†€PÎLˆØp™Ó0ÍR h>c®âÜ8 «MÓœtÆ1wB¡7 ½Fª/|ñC?]&-}èô>}¥$¦Öi¶ói"ò“×€h_µ:v̆¨ud9o" ;5_xš5`Ò2y+”¢nŸ)*òÜRù …™ãIyN9@@9~ ˆ^ªÑLòØàœ¢ t½Œ¬™šœéÉ£¶¥âŒŠR¯âìõ1Š[3‘|V‹Æv’¢Ä£I…%0+½®&òµW3HøÅ\>üQ 0Q™è§5 >ÑÈq´ð‡¥9 éƒCi,³6é*ii¿÷;ø½³Ï6‹m¹û›n6·VÚP.º€ô¨µ:mô)å݇¦w*r¥4+Y©T•þ¸]q(¹ïë8©)­¢Ì˜t‘R0ÆvMfiçóñ‡0I™xùpÛÎcP m·l8ˆÅ2íq­„^íH;ø¨Yñ™mÝrw3Mï¡ólt¥á\tiÐÄ5„ÙG?Ú¨½TlË[–êmÙ.Èj­E$Z˜¡§²Š*–‰lWXl'©Y™àZ„&0é"Ì%lå`>.¡mÀdeâÛ€|¸±?±ê:g" snÙøÔæX6ðËŠ´Ã·±ÊµŽ»YΖ{›É6›+]i8]@z8´z›îFç¸\î–a•{e9c[ Ú“÷Äk­4RdeT2Xl'©Ù«ãšÀ¤‹2v$´œýh…?9;¤LV&¾ ¬cl£ú§“½„&_Ö iµ… ˆUF A¶Y&]­ûÛÛ#lt¥áÄP£1¶€%Û€8ÕiRM"/’êíÚy.¥$ÕåºÔöb;‡AëÑ^ N€«‚ŽR—3¦Wòù0f´ã–‰0¸Žrf¤äm¯l|I ˆTÎq›ÅtÓÍö#ç¿^0½Š(µ]î>­ÎZF¬UW)ÕäZ µ`Ú#c  Š9#ÖLÊ¡Ý\0s^lzˆ4Û}ÉtÛ€,ŸÀa­“”‰— ¨VG_Ôre U¬FHI‚.† ˜Wqr¶YL@÷··GØ Ø‘ÃD_•€›7,s® hᦺ³g ÞòØ<‘OPÓH.ªV7í èDR¤) töE'C/6; šºÏ°î`_*©¼<çô‚i>¾ÃÚLV&_/˜ / Õ×ñ!,Nd7!éZ‡”$–€Hen³Ø–»¿¹^0]Û!òÜŠa™«ý[pÜ a«ÿS\¥ž<ø?Å-.à Ë\íß‚“伨߂MJ¬ÈFOK5%¦€qË0cé ¸%Ã2/R hšƒù‘¦ØÖpK†eÂÝ0óØV·dX&Ü=­pK†enÐÑny_HÀí–™Û@@òÁ- ï‹Ö€Û1,s³ eÚ¤ˆ5j%nɰÌÍbË´ŽB­BÀí– li_†ÙŠa™Àæ°âë€aˆ”lî†ÊNßl;, èB±Ø]í„B¡€€€P@@@(;9,ئ<Ø;Øöa™3ÙŒ1!%ES–9@&ZÀ9“JFxhš%ÕÏX{ϱHIÀ´†eVm«7 ÏazHæl›TÒ”œ]Šž¨L™ÔLeXæÁ¤r„Ç0EäHÀ9“Jâ9%rªEj»A¯Wá+FÛ™¢Å™*’MýHf›¤£Â¹üè<+:<»OZ§àt†eÖkœms‡djQwD;ÌžT &õµN‡ÎÄ XìÑåyoÎE:Óoê Á™*ÆEI¯ ˜Æ°Lµ¦ª¹C2wH¦:*3œ=©$läLˆ†xµ’³Ggs.Ò¹Ö|“§áÎ< ࢤ#`ZÃ2M»Ñ°‹4dîÌN±X‰¼KŸ3©$7ÍYÌ ˜ëyËÙœ‹t¶I'ŒÏÏ™rãF·m>QwÃ,X¦2,sÒ@uxþÌŒÚ;Џ!•Üë3sRI~¦Å` ÈÚ€ä;s1´Ä?Üy í. eÓ–Ùæœ;$³Ý/ÖgÝ=sRIN@Ð(ÚÖØ[Îæ\¤m@2Ñ£/?2$œ‚“²€é ËÌð§à¹C2U|†Ûºm3'•äĽàZÉÉn{ì: c›úÑ™mÒ™è‘ÏÌ &&]S–©{^'dîÌLŠã‚qÇwA™H]Àm–ÙÑ J|3MIXhH íSp6VÀÁDD=ˆj‹Í €€€X¸ @Àm„B¡D x¾w¾#Šþc'Á…pµó| ¢_E—A‘Äp9üå›W¯~Ø€:Ü:–ð/ù 2ïôñÊ Ìf³Jí`-àÜ:’ h”èJ%à @í?|ò}í/ùÁË•Ü}_›ZÙÊ·ŽÄ5 11ÜwÌÿøG,àÃ?þàP?Ÿ Ï¾jêúH’Fø^Sv÷(,﫽\ý(NT£Ðk§3†Ü:’Ÿ‚±{žTÀOþÔ€Ùv™Þ7ßçîŸÇR«Yí <³ó\ ½:©l ¸u,Ð4&EÏ?ýð“þ6 ŠÛ€YϦã‰lŽ?b‰ÏÛèGUoâ—•ÊÖ€€[Ç"®þýà>!õßí÷ßÿ6 ôÍšaÑ•Ü`L\AªÙ¬éüÈêiÝž n õ‚‡|Ÿü€zÀùááÕ³³³«4Ì'àT HsÕáQ¼ð,!Zøê‡þˆë¿÷Ý:Ð' k¼1”º®ô›lx%x‘IA@Âß^ýö[ôú€üò 8ÌKRUšCÔ Î•h Ñ.©yHMÀ«\½Š^ÌŽ–QÓ+z àÖ‘š€?xü½f ¸ßÕ¤ÁŒåËni xû‡Û3â&J~8cùò€€[GZn àÖB¹HÊÀrq]8 œD^Úl`\ð¶B‰ðÖA”€•*¬(fré0ÍU˸­¤x v‡i®\·i’ ¸îîÞlö6°Lë(ÔÞL“Ÿ‚¹ašKûtïVÂs~B#Â…@/SnT™ÖQ¨Ül“Ÿ‚¹aš^ ~‹¼'³éÒ¥[÷æ'ÒùœAÀt/àÉç{Ÿ'¦ÉYòòÞ"ÆIà‹¦‹x“Ÿ‚¹ašœ%—ŸSWî½|~åÒ¥ç—/]ÖÑë9‹pïå3|éÊ­[øC¿òüٵ˗t¶Ê+ÏŸ_ѽÊ-Ö/]¾vëÍ;—.91tšLñ¢Sp¦ÉWS×®Mîݺwùåü늎^ט(øvèòel ª0/_»æx¥Ó`^À——Ééùòµ;^ ‰¦‹xljOÁÜ0M^ÀËoM®¡Sñå——î]»ôòÎËKäÄŒ¡_ðǽ—¸ÂD±ž¹’`^@–ìòK/DÓeôÓt¼tç~Fsy~éúïM–èÙe烾¹¦9ϸŸîçåkÏݳ¯ L—mð’o˜¦' j÷ÑÔu¸þC¯ˆÐ/ «±¦—™s/ï\ö~lF ¸Ô3 S;Öi>)qB™Ï˜«HQÀKþaš®€÷®9m@r⼂úwH¿ƒlúdmÀk×.ß{ÉœCñÈ[—¹H‹ hšæ¤3޹Ã*~ƺ…^#Õž¦€IËä<×Î{ª§‹±¯”¤B0òb…B œ§!˶ï‘dæôWÜa𮀗n9>ÃW÷HX¿ìF¿wË× ö ˆ{Áwžá³î3¯7ŒúÍäî/Ù FûªÕ±cî0D­#ËyYØ©ùÂS0a™¼•JQ·OŒ‚9Y¡0¢Ãxõ4½ ÓŒb6÷žÏ³hï+ Õh&yüoNÁîedÍÔäLOµ-gT”zg¯QÜš‰ä³Z4¶“%M*,Yéõp5‘悔šA2Àæò ;‹–‰pZrá2Å·aáKsÒ€ÒXfmÒ+T&Òhn¡0ûüÞÙg›Å¶ÜýM7›[+m(+ Ó\X9tê½u'NÄ%jÀ6ú”òîóÏ;¹RÈ•Ž¬TŒ ªŠŠJÜ®8 ”‚ÜF ŠŠ÷´tœÔ”‹VQf LºH)c»&³‡¬óùÌ8Ö‰ËÄ È‡Ûv†ƒJPh»eÃA,–ik%ôjÏ-F³ â3Û,ºåîfšÞóãÙ èJÃY•€î0ÍÙÑôX¹^yóÖ•yq ·M\C˜}ô£ÚKŶ\°e©Þ–킬ÖZä@¢…z*«Ø¨b™Èv…Åv’š• ®Eh“."»%lå`>3Žuâ2ñm@>ÜØŸXu 3‘„9·l|js,øeÍ-«\븛ål¹·™l³¹bЕ†³*Űp ¨ÕÛt7:ÿÀårϰ «Ü+ËÛRО´¸'Wk¥‘"+£’Áb;IÍ^Ð&]”±{$!Ž*ûó 9 —‰¯ëÛ¨þiçd/¡É—Ä”½×ìB9¹MHCm–IWëþöö[]i8 ×ÞÂ?X&Õ$ò"9 Þ®çRJR]®Km/¶s´í•à¸*(à(µq9cz5 ŸÏôX¸L¼€Áu´3#%o{eãK’P@¤rŽÛ,& û›n¶¿9ÿõ‚éU\tµ:k±V]¥T“k%Ô‚iŒ‚v*jäŒX3)‡vsÁÌy±éa Ònp`ô%Óm²|‚‡=¬LR&^@>\* X}QPË•%T±!%™S(‡¼Š“³Íbº¿½=ÂVÀvˆ&:HšOnª;{f àý'Íù5ä¢jµqÓ®€N$EšÂ@g_t2ôb³Ã ©û,ëö¥’:ÀËsN/˜æ3OÀ¤eòõ‚¹ðZ}w‹ÙMHºÖ!%‰% R™Û,¶åîo®LWÀvˆœ‚€Î&ý).áUÁ•ÿÕ«ROžfóþ·á>¿Âý™,õªµÑÓ˜)*2«(@ÀU±Yšæ`~¤) LÈ& ˜¸†|p È;¸.@@òÁ- ï àºÉ·€¼ƒ€ë$Üò¾Ûæ6‰½ ,Ó: uÜÛ,6±Lë(ÔÅØ@@@(  e§¶€Pt¡€X쮀ÀöB¡€€€P¦¬îUA@`]€€€P@@@( ”°×[d—$Ü,Å. ˜ïõ"¦e™ ¸NvYÀNL*æÌø8èõ*ܼülÚÆœjÙc:—ãÌ)ôØe-Mó¹x3>òzs4ºÓ6J}­Ó¡Qøy²Ãæ$Y–rÜŒ^@oŽFwÚÆ7??¯#°BvR@çfŸ6ú‘óÍøÈ (»/~ÚF¶ˆ›bqÃF­íQwÃì‚€h¬9sæhÞŒ¸Ä“àŽüòÓ6ºâ\è‹¢7qGÙmÑ[Lj׸±mÍe‘¾øiñ™Ë‘›bX ;/ JΠ}•ÍøØëÕJxödÔ» LÌÈMÛ(›t.GnŠE`%ì¼€Óº. ¬†00qbG+(õÕîR ;/`€ÁDD=l ÀEØ0@@@(  å(úÀlv_@Ñ…fB¡€€€P@@@(  „B¡€€€P@@@(  „B¡€€€P@@@(  „B¡€€€P@@@(  „B¡€€€P@@@(  „B¡€€€P@@@( J„€G{G °v_@`£ÙyE— ˜ÍÎ l29 „BeYòØ‘<@@`aÒØÍ °0 (  …‚€BA@¡$ÙÍfà“ Ãíæí|Ú>‚9ýRƒßÍ"ÍxRŽˆ ©Ãïæý~ïìç;j¯f Ñ=Ûæþ®ôz¸vÄ¥^…‰  ÃïfÍB––¦Œ±]C¢Iyb›û[Éç• **ýq»BÓ€ÀÂøvsYV#Õ <–h}Ù=ß’ßd^›ÙhQF¢É@@`a|»y©ðÉäQÛRsþ„ˆÓȃ^¯Â0k“^¡2‘F^>4-Wÿ:kf«õ-w3÷ÖÉ}ek“½Ò²A,!Ëœ®œm“ì‘% ÏÖýÎJÇ6,bʃÀöG‚ÝŒ–Æ2xC²¼ùÁº¦Ô×:¼§ ZÇ—L©Û?¢ß›ÀIäËÓ´¼€ö¸VB¯6WšÖ­èšÝÒòËÝÌ}áì+[‰é”– Cc iælå4/ Kž-ûîÛ—þánü nè!Ø}µ‰A§zÃò½ù®x´ hŽð(r‘–L­µø„ 2àŸ&ò…áIpÚ/àX6ðËâ @ÓºÒ5»¥ .;¥æÂÝ2ÓµahiÙT,!Íœ­œÆâd ó%¥ îKSŽšò€EwLJ‚ÝP®ÕÉX|oX~``¾Ì‰HßpdïN–±-¥ïOœ`*Œ¤å”ݡ_$³4r ´l9—9ΗÙp‹AJkº…w²ÌéÊi,~ÃYÂðlÙ÷©ÒMOy€ß‚Ûuv]Àr¯5õϘ"àt ˆ³Tý ƒL…±ÊÃÒPãÊ/ ËgJÀ` È/ç2¯ªhiÙT,!«ó¾XDZD–0<Û` ènXø”,:‹uv]@9gs  8—‹%àØI³Yv@À±qŽG]yó4Û àjØ43Îß8Mp5l˜€ã¸y,x,b=ÃkÃÄ‚€›ÆÜcÑ }ÐeZš¦©vZ³2™½¦dm@m3„6à ò½^>$85Qˬә•IšÊÆ& ½àYtj5ì‡ûDiöiXú o‘ÄPnY²\”z•ò ©l{'Î/´pУÏŸ· .€¼G^ÜÄ^0\œ…¥ivAÉçñÃÊÝOd¦,Ú3ÓÆpÜ‘ä¢Ò·+²Z@y*ì—lJù”k@šÜ拜$ËÚ7&R£Øæ>åñU³÷Z¼6 91d»NÅ’\±eÙ®°_²Ù—SŸÊhOšähAЛ\  ·sX85 ,î“,êÍ~u¼p¤eË9Õ%M+ì—ã^:î­–E¤ÉAÀ(4¢‚©‘š¯@k@ò‰ÄQòöì¼c¶Çæ»VÕ`Þ[˜Ž€ÕÍŒ¢F³k!m@YV”Âì¼c (·+¥`Œ×…^4_d¡Ö ®‚ ï0&dk˜- Š[ar_î£Wq2'ï¸T¹`[JQfWé/²õ„篂 ï àÖ³Ch>1•úœD›ó— œKˆ€FoæE@yÍy—ý¢VÁwpkXX@ÓÌK5`L@ÀÕÆ\ `L@ÀÕ°‰š :šnFfZ;Áš@ÀÕ°A’Þ ÆLà ñ=H2·ü‹Úãée‘ë¾Ð¦ügQÿßH×µ (9gR“©ø•ôÐe `Õþt]«ð˜) ±Ô…ºÞ²ÕÂýî«tY±§…^[ÖõrMQsg,bÆîÐâ‘bÕ«^:}¤ªN'é€~IÒhÈÒú—M­›­ò" ¸kÌÐùž‘ŒªÅj—iŒÎyΪŸç:èô©5«œQëÖp<ã V÷Òõ¥rYòkÕéž÷Uuu³U‚€»CÜ6`ÇÐõ†~ÌŽªÞÄ/Ú^;o³ˆ-g1ª»/‚[\%wD¿pÛ' »ljÝl• àî·œ8Jú‡ìuTWM³Ä"6½ L/…‚›nb¬œ ·x½eaë&/pwˆ+`§Ì/ð h«Ã#3PÒ7–Î_Jeömºô–…­Ü1b¨àã¯IÚ™l‡ (õ›F›Edm@‡¥óµ5ÉÕ„÷¹|¹eaëwŒ;ÿóIDATŽH¿W«[Ò8\@ö”‘1Ó&½`‡¦Óû\/˜]ôÃ8½`/_nYغAÀþ„B¡€€€P@@@( Ê”€[ÁÖ˜K@@„B¡€€€P@@@(  „B¡€€€P@@@(  Ü>V:êfo}ë €€ÛÇ:æ²_Û|ù3l?AŸ®°0@r.Š€­û/5‡Ãaãô (¸I\O?m ûªUôvðâx…år1<=nN§Ãá)¸9\[Ÿ"ÿŽ)¨|ñb…%q!¼Î¿§÷￸{„ÞOQSðþ K$â"Ø:FM¿û÷«‡‡‡èãàð0‘MaƒLôÌôà:¾x„Ìk>zÔ=;;ž@¸)Ä‘Ã4MµÓJžw\óJIÍ­PÀûMJù>:w›Íá§Ú"+Ò'–€²œét’çSÀ–U×2ö |2ì:´ž°bÖ€#µè H?ç’¼Ä.ÈíŒm)H>‹<_2Ö:Q—a^œ9ÚU«UòÙlÁ•èM!np<1,Ôn­@@® Èj@œXE5`>ö:‘¢ï’>ðÝû÷NoÎÀC\åvÅîh}ir½`ÖlŒ"Ë¥`ŒÚ±ÖAˆ0sL´C§àSü  Þ b XPÇ6êš®@@þ:à@ÁþÉEÕjðJÑ©¸k„È›މxžÜ„ý{—¡7‡ úKÈRë Dߎu||pˆÜ;À—¤OÁ¿ "†¦9¿/Ê (Ÿ>9Å72÷áü»I\PÆ÷¤>9>¾ÿ´±ÂÒ‰¹8ʲ†XaQ€E¸H„¢¯òn{ë[Ü>öVÊúÖA¡€€€P€2c,ƒ€€@@@@( ”qyÏaŒ  ¨€€0ÆäDR)ïA@@F ‚8÷Z¢ \PNÆ'ãæÞÑå.&Ⱦ±Ñ¸²wåÊMÑE.$†<¾yåÊÿ … ‹ãÀòIEND®B`‚hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/builtinfunctions-chapt.html0000644000175000017500000030323712007567744023353 0ustar renerene Chapter 10. Built In Functions

                  Chapter 10. Built In Functions

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5049 $

                  Copyright 2010-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  Overview

                  HyperSQL supports a wide range of built-in functions and allows user-defined functions written in SQL and Java languages. User-defined functions are covered in the SQL-Invoked Routines chapter. If a built-in function is not available, you can write your own using procedural SQL or Java. Built-in aggregate functions are discussed in chapters that cover SQL in general.

                  The built-in functions fall into three groups:

                  • SQL Standard Functions

                    A wide rang of functions defined by SQL/Foundation are supported. SQL/Foundation functions that have no parameter are called without empty parentheses. Functions with multiple parameters often use keywords instead of commas to separate the parameters. Many functions are overloaded. Among these, some have one or more optional parameters that can be omitted, while the return type of some functions is dependent upon the type of one of the parameters. The usage of SQL Standard Functions (where they can be used) is covered more extensively in the Data Access and Change chapter

                  • JDBC Open Group CLI Functions

                    These functions were defined as an extension to the CLI standard, which is the basis for ODBC and JDBC and supported by many database products. JDBC supports an escape mechanism to specify function calls in SQL statements in a manner that is independent of the function names supported by the target database engine. For example SELECT {fn DAYOFMONTH (dateColumn)} FROM myTable can be used in JDBC and is translated to Standard SQL as SELECT EXTRACT (DAY_OF_MONTH FROM dateColumn) FROM myTable if a database engine supports the Standard syntax. If a database engine does not support Standard SQL, then the translation will be different. HyperSQL supports all the function names specified in the JDBC specifications as native functions. Therefore, there is no need to use the {fn FUNC_NAME ( ... ) } escape with HyperSQL. If a JDBC function is supported by the SQL Standard in a different form, the SQL Standard form is the preferred form to use.

                  • HyperSQL Built-In Functions

                    Many additional built-in functions are available for some useful operations. Some of these functions return the current setting for the session and the database. The General Functions accept arguments of different types and return values based on comparison between the arguments.

                  In the BNF specification used here, words in capital letters are actual tokens. Syntactic elements such as expressions are enclosed in angle brackets. The <left paren> and <right paren> tokens are represented with the actual symbol. Optional elements are enclosed with square brackets ( <left bracket> and <right bracket> ). Multiple options for a required element are enclosed with braces ( <left brace> and <right brace> ). Alternative tokens are separated with the vertical bar ( <vertical bar> ). At the end of each function definition, the standard which specifies the function is noted in parentheses as JDBC or HyperSQL, or the SQL/Foundation part of the SQL Standard.

                  String and Binary String Functions

                  In SQL, there are three kinds of string: character, binary and bit. The units are respectively characters, octets, and bits. Each kind of string can be in different data types. CHAR, VARCHAR and CLOB are the character data types. BINARY, VARBINARY and BLOB are the binary data types. BIT and BIT VARYING are the bit string types. In all string functions, the position of a unit of the string within the whole string is specified from 1 to the length of the whole string. In the BNF, <char value expr> indicates any valid SQL expression that evaluates to a character type. Likewise, <binary value expr> indicates a binary type and <num value expr> indicates a numeric type.

                  ASCII

                  ASCII ( <char value expr> )

                  Returns an INTEGER equal to the ASCII code value of the first character of <char value expr>. (JDBC)

                  BIT_LENGTH

                  BIT_LENGTH ( <string value expression> )

                  BIT_LENGTH can be used with character, binary and bit strings. It return a BIGINT value that measures the bit length of the string. (Foundation)

                  See also CHARACTER_LENGTH and OCTET_LENGTH.

                  CHAR

                  CHAR ( <UNICODE code> )

                  The argument is an INTEGER. Returns a character string containing a single character that has the specified <UNICODE code>, which is an integer. ASCII codes are a subset of the allowed values for <UNICODE code>. (JDBC)

                  CHARACTER_LENGTH

                  { CHAR_LENGTH | CHARACTER_LENGTH } ( <char value expression> [ USING { CHARACTERS | OCTETS } ] )

                  The CHAR_LENGTH or CHARACTER_LENGTH function can be used with character strings, while OCTET_LENGTH can be used with character or binary strings and BIT_LENGTH can be used with character, binary and bit strings.

                  All functions return a BIGINT value that measures the length of the string in the given unit. CHAR_LENGTH counts characters, OCTET_LENGTH counts octets and BIT_LENGTH counts bits in the string. For CHAR_LENGTH, if [ USING OCTETS ] is specified, the octet count is returned, which is twice the normal length. (Foundation)

                  CONCAT

                  CONCAT ( <char value expr 1>, <char value expr 2> [, ...] )

                  CONCAT ( <binary value expr 1>, <binary value expr 2> [, ...] )

                  The arguments are character strings or binary strings. Returns a string formed by concatenation of the arguments. Minimum number of arguments is 2. Equivalent to the SQL concatenation expression <value expr 1> || <value expr 2> [ || ...] . (JDBC)

                  DIFFERENCE

                  DIFFERENCE ( <char value expr 1>, <char value expr 2> )

                  The arguments are character strings. Converts the arguments into SOUNDEX codes, and returns an INTEGER between 0-4 which indicates how similar the two SOUNDEX value are. If the values are the same, it returns 4, if the values have no similarity, it returns 0. In-between values are returned for partial similarity. (JDBC)

                  INSERT

                  INSERT ( <char value expr 1>, <offset>, <length>, <char value expr 2> )

                  Returns a character string based on <char value expr 1> in which <length> characters have been removed from the <offset> position and in their place, the whole <char value expr 2> is copied. Equivalent to SQL/Foundation OVERLAY( <char value expr1> PLACING < char value expr2> FROM <offset> FOR <length> ) . (JDBC)

                  HEXTORAW

                  HEXTORAW( <char value expr> )

                  Returns a BINARY string formed by translation of hexadecimal digits and letters in the <char value expr>. Each character of the <char value expr> must be a digit or a letter in the A | B | C | D | E | F set. Each byte of the retired binary string is formed by translating two hex digits into one byte. (HyperSQL)

                  LCASE

                  LCASE ( <char value expr> )

                  Returns a character string that is the lower case version of the <char value expr>. Equivalent to SQL/Foundation LOWER (<char value expr>). (JDBC)

                  LEFT

                  LEFT ( <char value expr>, <count> )

                  Returns a character string consisting of the first <count> characters of <char value expr>. Equivalent to SQL/Foundation SUBSTRING(<char value expr> FROM 0 FOR <count>). (JDBC)

                  LENGTH

                  LENGTH ( <char value expr> )

                  Returns as a BIGINT value the number of characters in <char value expr>. Equivalent to SQL/Foundation CHAR_LENGTH(<char value expr>). (JDBC)

                  LOCATE

                  LOCATE ( <char value expr 1>, <char value expr 2> [ , <offset> ] )

                  Returns as a BIGINT value the starting position of the first occurrence of <char value expr 1> within <char value expr 2>. If <offset> is specified, the search begins with the position indicated by <offset>. If the search is not successful, 0 is returned. Equivalent to SQL/Foundation POSITION(<char value expr 1> IN <char value expr 2>). Without the third argument, LOCATE is equivalent to the SQL Standard POSITION function. (JDBC)

                  LPAD

                  LPAD ( <char value expr 1>, <length> [, <char value expr 2> ] )

                  Returns a character string with the length of <length> characters. The string contains the characters of <char value expr 1> padded to the left with spaces. If <length> is smaller than the length of the string argument, the argument is truncated. If the optional <char value expr 2> is specified, this string is used for padding, instead of spaces. (HyperSQL)

                  LTRIM

                  LTRIM ( <char value expr> )

                  Returns a character string based on <char value expr> with the leading space characters removed. Equivalent to SQL/Foundation TRIM( LEADING ' ' FROM <char value expr> ). (JDBC)

                  OCTET_LENGTH

                  OCTET_LENGTH ( <string value expression> )

                  The OCTET_LENGTH function can be used with character or binary strings.

                  Return a BIGINT value that measures the length of the string in octets. When used with character strings, the octet count is returned, which is twice the normal length. (Foundation)

                  OVERLAY

                  OVERLAY ( <char value expr 1> PLACING <char value expr 2>

                  FROM <start position> [ FOR <string length> ] [ USING CHARACTERS ] )

                  OVERLAY ( <binary value expr 1> PLACING <binary value expr 2>

                  FROM <start position> [ FOR <string length> ] )

                  The character version of OVERLAY returns a character string based on <char value expr 1> in which <string length> characters have been removed from the <start position> and in their place, the whole <char value expr 2> is copied.

                  The binary version of OVERLAY returns a binary string formed in the same manner as the character version. (Foundation)

                  POSITION

                  POSITION ( <char value expr 1> IN <char value expr 2> [ USING CHARACTERS ] )

                  POSITION ( <binary value expr 1> IN <binary value expr 2> )

                  The character and binary versions of POSITION search the string value of the second argument for the first occurrence of the first argument string. If the search is successful, the position in the string is returned as a BIGINT. Otherwise zero is returned. (Foundation)

                  RAWTOHEX

                  RAWTOHEX( <binary value expr> )

                  Returns a character string composed of hexadecimal digits representing the bytes in the <binary value expr>. Each byte of the <binary value expr> is translated into two hex digits. (HyperSQL)

                  REGEXP_MATCHES

                  REGEXP_MATCHES ( <char value expr>, <regular expression> )

                  Returns true if the <char value expr> matches the <regular expression> as a whole. The <regular expression> is defined according to Java language regular expression rules. (HyperSQL)

                  REGEXP_SUBSTRING

                  REGEXP_SUBSTRING ( <char value expr>, <regular expression> )

                  Returns the first region in the <char value expr> that matches the <regular expression>. The <regular expression> is defined according to Java language regular expression rules. (HyperSQL)

                  REGEXP_SUBSTRING_ARRAY

                  REGEXP_SUBSTRING_ARRAY ( <char value expr>, <regular expression> )

                  Returns all the regions in the the <char value expr> that match the <regular expression>. The <regular expression> is defined according to Java language regular expression rules. Returns an array containing the matching regions (HyperSQL)

                  REPEAT

                  REPEAT ( <char value expr>, <count> )

                  Returns a character string based on <char value expr>, repeated <count> times. (JDBC)

                  REPLACE

                  REPLACE ( <char value expr 1>, <char value expr 2> [, <char value expr 3> ] )

                  Returns a character string based on <char value expr 1> where each occurrence of <char value expr 2> has been replaced with a copy of <char value expr 3>. If the function is called with just two arguments, the <char value expr 3> defaults to the empty string and calling the function simply removes the occurrences of <char value expr 2> from the first string.(JDBC)

                  REVERSE

                  REVERSE ( <char value expr> )

                  Returns a character string based on <char value expr> with characters in the reverse order. (HyperSQL)

                  RIGHT

                  RIGHT ( <char value expr>, <count> )

                  Returns a character string consisting of the last <count> characters of <char value expr>. (JDBC)

                  RPAD

                  RPAD ( <char value expr 1>, <length> [, <char value expr 2> ] )

                  Returns a character string with the length of <length> characters. The string begins with the characters of <char value expr 1> padded to the right with spaces. If <length> is smaller than the length of the string argument, the argument is truncated. If the optional <char value expr 2> is specified, this string is used for padding, instead of spaces. (HyperSQL)

                  RTRIM

                  RTRIM ( <char value expr> )

                  Returns a character string based on <char value expr> with the trailing space characters removed. Equivalent to SQL/Foundation TRIM(TRAILING ' ' FROM <character string>). (JDBC)

                  SOUNDEX

                  SOUNDEX ( <char value expr> )

                  Returns a four character code representing the sound of <char value expr>. The US census algorithm is used. For example the soundex value for Washington is W252. (JDBC)

                  SPACE

                  SPACE ( <count> )

                  Returns a character string consisting of <count> spaces. (JDBC)

                  SUBSTR

                  { SUBSTR | SUBSTRING } ( <char value expr>, <offset>, <length> )

                  The JDBC version of SQL/Foundation SUBSTRING returns a character string that consists of <length> characters from <char value expr> starting at the <offset> position. (JDBC)

                  SUBSTRING

                  SUBSTRING ( <char value expr> FROM <start position> [ FOR <string length> ] [ USING CHARACTERS ] )

                  SUBSTRING ( <binary value expr> FROM <start position> [ FOR <string length> ] )

                  The character version of SUBSTRING returns a character string that consists of the characters of the <char value expr> from <start position>. If the optional <string length> is specified, only <string length> characters are returned.

                  The binary version of SUBSTRING returns a binary string in the same manner. (Foundation)

                  TRIM

                  TRIM ([ [ LEADING | TRAILING | BOTH ] [ <trim character> ] FROM ] <char value expr> )

                  TRIM ([ [ LEADING | TRAILING | BOTH ] [ <trim octet> ] FROM ] <binary value expr> )

                  The character version of TRIM returns a character string based on <char value expr>. Consecutive instances of <trim character> are removed from the beginning, the end or both ends of the<char value expr> depending on the value of the optional first qualifier [ LEADING | TRAILING | BOTH ]. If no qualifier is specified, BOTH is used as default. If [ <trim character> ] is not specified, the space character is used as default.

                  The binary version of TRIM returns a binary string based on <binary value expr>. Consecutive instances of <trim octet> are removed in the same manner as in the character version. If [ <trim octet> ] is not specified, the 0 octet is used as default. (Foundation)

                  UCASE

                  UCASE ( <char value expr> )

                  Returns a character string that is the upper case version of the <char value expr>. Equivalent to SQL/Foundation UPPER( <char value expr> ) . (JDBC)

                  UPPER

                  UPPER ( <char value expr> )

                  Returns a character string that is the upper case version of the <char value expr> . (Foundation)

                  Numeric Functions

                  ABS

                  ABS ( <num value expr> | <interval value expr> )

                  Returns the absolute value of the argument as a value of the same type. (JDBC and Foundation)

                  ACOS

                  ACOS ( <num value expr> )

                  Returns the arc-cosine of the argument in radians as a value of DOUBLE type. (JDBC)

                  ASIN

                  ASIN ( <num value expr> )

                  Returns the arc-sine of the argument in radians as a value of DOUBLE type. (JDBC)

                  ATAN

                  ATAN ( <num value expr> )

                  Returns the arc-tangent of the argument in radians as a value of DOUBLE type. (JDBC)

                  ATAN2

                  ATAN2 ( <num value expr 1>, <num value expr 2> )

                  The <num value expr 1> and <num value expr 2> express the x and y coordinates of a point. Returns the angle, in radians, representing the angle coordinate of the point in polar coordinates, as a value of DOUBLE type. (JDBC)

                  CEILING

                  { CEIL | CEILING } ( <num value expr> )

                  Returns the smallest integer greater than or equal to the argument. If the argument is exact numeric then the result is exact numeric with a scale of 0. If the argument is approximate numeric, then the result is of DOUBLE type. (JDBC and Foundation)

                  BITAND

                  BITAND ( <num value expr 1>, <num value expr 2> )

                  BITAND ( <bit value expr 1>, <bit value expr 2> )

                  BITANDNOT

                  BITANDNOT ( <num value expr 1>, <num value expr 2> )

                  BITANDNOT ( <bit value expr 1>, <bit value expr 2> )

                  BITNOT

                  BITNOT ( <num value expr 1> )

                  BITNOT ( <bit value expr 1> )

                  BITOR

                  BITOR ( <num value expr 1>, <num value expr 2> )

                  BITOR ( <bit value expr 1>, <bit value expr 2> )

                  BITXOR

                  BITXOR ( <num value expr 1>, <num value expr 2> )

                  BITXOR ( <bit value expr 1>, <bit value expr 2> )

                  These functions bit operations on two values, or in the case of BITNOT on a single values. The values are either integer values, or bit strings. The result is an integer value of the same type as the arguments, or a bit string of the same length as the argument. Each bit of the result is formed by performing the operation on corresponding bits of the arguments. The names of the function indicate NOT, OR, AND, XOR operations. The BITANDNOT performs NOT on the second argument, then performs AND on result and the first argument. (HyperSQL)

                  COS

                  COS ( <num value expr> )

                  Returns the cosine of the argument (an angle expressed in radians) as a value of DOUBLE type. (JDBC)

                  COT

                  COT ( <num value expr> )

                  Returns the cotangent of the argument as a value of DOUBLE type. The <num value expr> represents an angle expressed in radians. (JDBC)

                  DEGREES

                  DEGREES ( <num value expr> )

                  Converts the argument (an angle expressed in radians) into degrees and returns the value in the DOUBLE type. (JDBC)

                  EXP

                  EXP ( <num value expr> )

                  Returns the exponential value of the argument as a value of DOUBLE type. (JDBC and Foundation)

                  FLOOR

                  FLOOR ( <num value expr> )

                  Returns the largest integer that is less than or equal to the argument. If the argument is exact numeric then the result is exact numeric with a scale of 0. If the argument is approximate numeric, then the result is of DOUBLE type. (JDBC and Foundation)

                  LN

                  LN ( <num value expr> )

                  Returns the natural logarithm of the argument, as a value of DOUBLE type. (Foundation)

                  LOG

                  LOG ( <num value expr> )

                  Returns the natural logarithm of the argument, as a value of DOUBLE type. (JDBC)

                  LOG10

                  LOG10 ( <num value expr> )

                  Returns the base 10 logarithm of the argument as a value of DOUBLE type. (JDBC)

                  MOD ( <num value expr 1>, <num value expr 2> )

                  MOD

                  Returns the remainder (modulus) of <num value expr 1> divided by <num value expr 2>. The data type of the returned value is the same as the second argument. (JDBC and Foundation)

                  PI

                  PI ()

                  Returns the constant pi as a value of DOUBLE type. (JDBC)

                  POWER

                  POWER ( <num value expr 1>, <num value expr 2> )

                  Returns the value of <num value expr 1> raised to the power of <int value expr 2> as a value of DOUBLE type. (JDBC and Foundation)

                  RADIANS

                  RADIANS ( <num value expr> )

                  Converts the argument (an angle expressed in degrees) into radians and returns the value in the DOUBLE type. (JDBC)

                  RAND

                  RAND ( [ <int value expr> ] )

                  Returns a random value in the DOUBLE type. The optional [ <int value expr> ] is used as seed value. In HyperSQL each session has a separate random number generator. The first call that uses a seed parameter sets the seed for subsequent calls that do not include a parameter. (JDBC)

                  ROUND

                  ROUND ( <num value expr>, <int value expr> )

                  The <num value expr> is of the DOUBLE type or DECIMAL type. The function returns a DOUBLE or DECIMAL value which is the value of the argument rounded to <int value expr> places right of the decimal point. If <int value expr> is negative, the first argument is rounded to <int value expr> places to the left of the decimal point.

                  This function rounds values ending with .5 or larger away from zero for DECIMAL arguments and results. When the value ends with .5 or larger and the argument and result are DOUBLE, It rounds the value towards the closest even value.

                  The datetime version is discussed in the next section. (JDBC)

                  SIGN

                  SIGN ( <num value expr> )

                  Returns an INTEGER, indicating the sign of the argument. If the argument is negative then -1 is returned. If it is equal to zero then 0 is returned. If the argument is positive then 1 is returned. (JDBC)

                  SIN

                  SIN ( <num value expr> )

                  Returns the sine of the argument (an angle expressed in radians) as a value of DOUBLE type. (JDBC)

                  SQRT

                  SQRT ( <num value expr> )

                  Returns the square root of the argument as a value of DOUBLE type. (JDBC and Foundation)

                  TAN

                  TAN ( <num value expr> )

                  Returns the tangent of the argument (an angle expressed in radians) as a value of DOUBLE type. (JDBC)

                  TO_NUMBER

                  TO_NUMBER ( <char value expr> )

                  Performs a cast from character to DECIMAL number. The character string must consist of digits and can have a decimal point. Use the SQL Standard CAST expression instead of this non-standard function. (HyperSQL)

                  TRUNC

                  TRUNC ( <num value expr> [, <int value expr>] )

                  This is a similar to the TRUNCATE function when the first argument is numeric. If the second argument is omitted, zero is used in its place.

                  The datetime version is discussed in the next section. (HyperSQL)

                  TRUNCATE

                  TRUNCATE ( <num value expr> [, <int value expr>] )

                  Returns a value in the same type as <num value expr> but may reduce the scale of DECIMAL and NUMERIC values. The value is rounded by replacing digits with zeros from <int value expr> places right of the decimal point to the end. If <int value expr> is negative, ABS( <int value expr> ) digits to left of the decimal point and all digits to the right of the decimal points are replaced with zeros. Results of calling TRUNCATE with 12345.6789 with (-2, 0, 2, 4) are (12300, 12345, 12345.67, 12345.6789). The function does not change the number if the second argument is larger than or equal to the scale of the first argument.

                  If the second argument is not a constant (when it is a parameter or column reference) then the type of the return value is always the same as the type of the first argument. In this case, the discarded digits are replaced with zeros. (JDBC)

                  WIDTH_BUCKET

                  WIDTH_BUCKET ( <value expr 1> , <value expr 2>, <value expr 3>, <int value expr> )

                  Returns an integer value between 0 and <int value expr> + 1. The initial three parameters are of the same numeric or datetime type. The range, ( <value expr 2> , <value expr 3> ) is divided into <int value expr> equal sections (buckets). The returned integer value indicates the index of the bucket where <value expr 1> can be placed. If the <value expr 1> falls before or after the range, the return value is 0 or <value expr 1> + 1 respectively.

                  This function can be used with numeric or datetime values. Invalid arguments, including <int value expr> smaller than 1, or equal values for <value expr 2> and <value expr 3> will cause an exception. (Foundation)

                  An example is given below:

                  WIDTH_BUCKET( 5, 10, 110, 10)
                  0
                  
                  WIDTH_BUCKET( 23, 10, 110, 10)
                  2
                  
                  WIDTH_BUCKET( 100, 10, 110, 10)
                  10
                  
                  WIDTH_BUCKET( 200, 10, 110, 10)
                  11
                  

                  Date Time and Interval Functions

                  Functions to report the time zone.

                  Functions to Report the Time Zone.

                  TIMEZONE

                  TIMEZONE()

                  Returns the current time zone for the session. Returns an INTERVAL HOUR TO MINUTE value. (HyperSQL)

                  SESSION_TIMEZONE

                  SESSION_TIMEZONE()

                  Returns the default time zone for the current session. Returns an INTERVAL HOUR TO MINUTE value. (HyperSQL)

                  DATABASE_TIMEZONE

                  DATABASE_TIMEZONE()

                  Returns the time zone for the database engine. This is based on where the database server process is located. Returns an INTERVAL HOUR TO MINUTE value. (HyperSQL)

                  Functions to Report the Current Datetime

                  CURRENT_DATE

                  CURRENT_DATE

                  CURRENT_TIME

                  CURRENT_TIME [ ( <time precision> ) ]

                  LOCALTIME

                  LOCALTIME [ ( <time precision> ) ]

                  CURRENT_TIMESTAMP

                  CURRENT_TIMESTAMP [ ( <timestamp precision> ) ]

                  LOCALTIMESTAMP

                  LOCALTIMESTAMP [ ( <timestamp precision> ) ]

                  These datetime functions return the datetime value representing the moment the function is called. CURRENT_DATE returns a value of DATE type. CURRENT_TIME returns a value of TIME WITH TIME ZONE type. LOCALTIME returns a value of TIME type. CURRENT_TIMESTAMP returns a value of TIMESTAMP WITH TIME ZONE type. LOCALTIMESTAMP returns a value of TIMESTAMP type. If the optional [ ( <time precision> ) ] or [ ( <timestamp precision> ) ] is used, then the returned value has the specified fraction of the second precision. (Foundation)

                  NOW

                  NOW ()

                  This function is equivalent to LOCALTIMESTAMP. It can be used as a no-arg function as the parens are optional. (HyperSQL)

                  CURDATE

                  CURDATE ()

                  This function is equivalent to CURRENT_DATE. (JDBC)

                  CURTIME

                  CURTIME ()

                  This function is equivalent to LOCALTIME. (JDBC)

                  SYSDATE

                  SYSDATE

                  This function is equivalent to LOCALTIMESTAMP. (HyperSQL)

                  SYSTIMESTAMP

                  SYSTIMESTAMP

                  This no-arg function is equivalent to CURRENT_TIMESTAMP and is enabled in ORA syntax mode only. (HyperSQL)

                  TODAY

                  TODAY

                  This no-arg function is equivalent to CURRENT_DATE. (HyperSQL)

                  Functions to Extract an Element of a Datetime

                  DAYNAME

                  DAYNAME ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( DAY_NAME FROM ... ) Returns a string in the range of Sunday - Saturday. (JDBC)

                  DAYOFMONTH

                  DAYOFMONTH ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( DAY_OF_MONTH FROM ... ) Returns an integer value in the range of 1-31. (JDBC)

                  DAYOFWEEK

                  DAYOFWEEK ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( DAY_OF_WEEK FROM ... ) Returns an integer value in the range of 1-7. The first day of the week is Sunday. (JDBC)

                  DAYOFYEAR

                  DAYOFYEAR ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( DAY_OF_YEAR FROM ... ) Returns an integer value in the range of 1-366. (JDBC)

                  DAYS

                  DAYS ( <datetime value expr> )

                  The <datetime value expr> is of DATE or TIMESTAMP type. This function returns the DAY number since the first day of the calendar. The first day is numbered 1. (HyperSQL)

                  HOUR

                  HOUR ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( HOUR FROM ... ) Returns an integer value in the range of 0-23. (JDBC)

                  MINUTE

                  MINUTE ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( MINUTE FROM ... ) Returns an integer value in the range of 0 - 59. (JDBC)

                  MONTH

                  MONTH ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( MONTH FROM ... ) Returns an integer value in the range of 1-12. (JDBC)

                  MONTHNAME

                  MONTHNAME ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( NAME_OF_MONTH FROM ... ) Returns a string in the range of January - December. (JDBC)

                  QUARTER

                  QUARTER ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( QUARTER FROM ... ) Returns an integer in the range of 1 - 4. (JDBC)

                  SECOND

                  SECOND ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( SECOND FROM ... ) Returns an integer or decimal in the range of 0 - 59, with the same precision as the <datetime value expr>. (JDBC)

                  SECONDS_SINCE_MIDNIGHT

                  SECONDS_SINCE_MIDNIGHT ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( SECONDS_SINCE_MIDNIGHT FROM ... ) Returns an integer in the range of 0 - 86399. (HyperSQL)

                  UNIX_TIMESTAMP

                  UNIX_TIMESTAMP ( [ <datetime value expression> ] )

                  This function returns a BIGINT value. With no parameter, it returns the number of seconds since 1970-01-01. With a DATE or TIMESTAMP parameter, it converts the argument into number of seconds since 1970-01-01. The TIMESTAMP ( <num value expression> function returns a TIMESTAMP from a Unix timestamp. (HyperSQL)

                  WEEK

                  WEEK ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( WEEK_OF_YEAR FROM ... ) Returns an integer in the range of 1 - 54. (JDBC)

                  YEAR

                  YEAR ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( YEAR FROM ... ) Returns an integer in the range of 1 - 9999. (JDBC)

                  EXTRACT

                  EXTRACT ( <extract field> FROM <extract source> )

                  <extract field> ::= YEAR | MONTH | DAY | HOUR | MINUTE | DAY_OF_WEEK | WEEK_OF_YEAR | QUARTER | DAY_OF_YEAR | DAY_OF_MONTH |

                  TIMEZONE_HOUR | TIMEZONE_MINUTE | SECOND | SECONDS_SINCE_MIDNIGHT |

                  DAY_NAME | MONTH_NAME

                  <extract source> ::= <datetime value expr> | <interval value expr>

                  The EXTRACT function returns a field or element of the <extract source>. The <extract source> is a datetime or interval expression. The type of the return value is BIGINT for most of the <extract field> options. The exceptions is SECOND where a DECIMAL value is returned which has the same precision as the datetime or interval expression. The field values DAY_NAME or MONTH_NAME result in a character string. When MONTH_NAME is specified, a string in the range January - December is returned. When DAY_NAME is specified, a string in the range Sunday -Saturday is returned.

                  If the <extract source> is FROM <datetime value expr>, different groups of <extract source> can be used depending on the data type of the expression. The TIMEZONE_HOUR | TIMEZONE_MINUTE options are valid only for TIME WITH TIMEZONE and TIMESTAMP WITH TIMEZONE data types. The HOUR | MINUTE | SECOND | SECONDS_MIDNIGHT options, are valid for TIME and TIMESTAMP types. The rest of the fields are valid for DATE and TIMESTAMP types.

                  If the <extract source> is FROM <interval value expr>, the <extract field> must be one of the fields of the INTERVAL type of the expressions. The YEAR | MONTH options may be valid for INTERVAL types based on months. The DAY | HOUR | MINUTE | SECOND | SECONDS_MIDNIGHT options may be valid for INTERVAL types based on seconds. For example, DAY | HOUR | MINUTE are the only valid fields for the INTERVAL DAY TO MINUTE data type. (Foundation with HyperSQL extensions)

                  Functions for Datetime Arithmetic

                  TIMESTAMPADD

                  TIMESTAMPADD ( <tsi datetime field>, <numeric value expression>, <datetime value expr>)

                  TIMESTAMPDIFF

                  TIMESTAMPDIFF ( <tsi datetime field>, <datetime value expr 1>, <datetime value expr 2>)

                  <tsi datetime field> ::= SQL_TSI_FRAC_SECOND | SQL_TSI_SECOND | SQL_TSI_MINUTE | SQL_TSI_HOUR | SQL_TSI_DAY | SQL_TSI_WEEK | SQL_TSI_MONTH | SQL_TSI_QUARTER | SQL_TSI_YEAR

                  HyperSQL supports full SQL Standard datetime features. It supports adding integers representing units of time directly to datetime values using the arithmetic plus operator. It also supports subtracting one <datetime value expr> from another in the given units of date or time using the minus operator. An example of <datetime value expr> + <numeric value expression> <datetime field> is LOCALTIMESTAMP + 5 DAY. An example of ( <datetime value expr> - <numeric value expression> ) <datetime field> is (CURRENT_DATE - DATE '2008-08-8') MONTH which returns the number of calendar months between the two dates.

                  The two JDBC functions, TIMESTAMPADD and TIMESTAMPDIFF perform the same function as above SQL expressions. The field names are keywords and are different from those used in the EXTRACT functions. These names are valid for use only when calling these two functions. The return value for TIMESTAMPADD is of the same type as the datetime argument used. The return type for TIMESTAMPDIFF is always BIGINT, regardless of the type of arguments. The two datetime arguments of TIMESTAMPDIFF should be of the same type.

                  TIMESTAMPDIFF is evaluated as <datetime value expr 2> - <datetime value expr 1>. (JDBC)

                  TIMESTAMPADD ( SQL_TSI_MONTH, 3, DATE '2008-11-22' )
                  
                  TIMESTAMPDIFF ( SQL_TSI_HOUR, TIMESTAMP '2008-11-20 20:30:40', TIMESTAMP '2008-11-21 21:30:40' )
                  

                  DATE_ADD

                  DATE_ADD ( <datetime value expr> , <interval value expr> )

                  DATE_SUB

                  DATE_SUB ( <datetime value expr> , <interval value expr> )

                  These functions are equivalent to arithmetic addition and subtraction, <datetime value expr> + <interval value expr> and <datetime value expr> - <interval value expr>. The functions are provided for compatibility with other databases. The supported interval units are the standard SQL interval unit listed in other chapters of this guide. (HyperSQL)

                  DATE_ADD ( DATE '2008-11-22', INTERVAL 3 MONTH )
                  
                  DATE_SUB ( TIMESTAMP '2008-11-22 20:30:40', INTERVAL 20 HOUR )
                  

                  DATEADD

                  DATEADD ( <field>, <numeric value expr>, <datetime value expr> )

                  DATEDIFF

                  DATEDIFF ( <field>, <datetime value expr 1>, <datetime value expr 2> )

                  <field> ::= 'yy' | 'year' | 'mm' | 'month' | 'dd' | 'day' | 'hh' | 'hour' | 'mi' | 'minute' | 'ss' | 'second' | 'ms' | 'millisecond'

                  The DATEADD and DATEDIFF functions are alternatives to TIMESTAMPADD and TIMESTAMPDIFF, with fewer available field options. The field names are specified as strings, rather than keywords. The fields translate to YEAR, MONTH, DAY, HOUR, MINUTE, SECOND and MILLISECOND. DATEDIFF is evaluated as <datetime value expr 2> - <datetime value expr 1>. (HyperSQL}

                  DATEDIFF ( <datetime value expr 1>, <datetime value expr 2> )

                  This special form of DATEDIFF does not have a field parameter and return the number of days between two dates. This form is evaluated as <datetime value expr 1> - <datetime value expr 2>, which is different from the main form. This form is compatible with some other database engines. (HyperSQL}

                  DATEADD ( 'month', 3, DATE '2008-11-22' )
                  
                  DATEDIFF ( 'hour', TIMESTAMP '2008-11-22 20:30:40', TIMESTAMP '2008-11-22 00:30:40' )
                  

                  ROUND

                  ROUND ( <datetime value expr> [ , <char value expr> ] )

                  The <datetime value expr> is of DATE, TIME or TIMESTAMP type. The <char value expr> is a format string for YEAR, MONTH, WEEK OF YEAR, DAY, HOUR, MINUTE or SECOND as listed in the table for TO_CHAR and TO_DATE format elements (see below). The datetime value is rounded up or down after the specified field and the rest of the fields to the right are set to one for MONTH and DAY, or zero, for the rest of the fields. For example rounding a timestamp value on the DAY field results in midnight the same date or midnight the next day if the time is at or after 12 noon. If the second argument is omitted, the datetime value is rounded to the nearest day. (HyperSQL)

                  TRUNC

                  TRUNC ( <datetime value expr> [ , <char value expr> ] )

                  Similar to the ROUND function, the <num value expr> is of DATE, TIME or TIMESTAMP type. The <char value expr> is a format string (such as 'YY' or 'MM') for YEAR, MONTH, WEEK OF YEAR, DAY, HOUR, MINUTE or SECOND as listed in the table for TO_CHAR and TO_DATE format elements (see below). The datetime value is truncated after the specified field and the rest of the fields to the right are set to one for MONTH and DAY, or zero, for the rest of the fields. For example applying TRUNC to a timestamp value on the DAY field results in midnight the same date. Examples of ROUND and TRUNC functions are given below. If the second argument is omitted, the datetime value is truncated to midnight the same date. (HyperSQL)

                  ROUND ( TIMESTAMP'2008-08-01 20:30:40', 'YYYY' )
                  
                  '2009-01-01 00:00:00'
                  
                  TRUNC ( TIMESTAMP'2008-08-01 20:30:40', 'YYYY' )
                  
                  '2008-01-01 00:00:00'
                  

                  Functions to Convert or Format a Datetime

                  TIMESTAMP

                  TIMESTAMP ( <num value expr> )

                  TIMESTAMP ( <char value expr> )

                  TIMESTAMP ( <char value expr>, <char value expr> )

                  TIMESTAMP ( <date value expr>, <time value expr> )

                  This function translates the arguments into a TIMESTAMP value. When the single argument is a numeric value, it is interpreted as a Unix timestamp in seconds. A single formatted date or timestamp string is translated to a TIMESTAMP.

                  When two arguments are used, the first argument is the date part and the second argument is the time part of the returned TIMESTAMP value. An example, including the result, is given below:

                  TIMESTAMP ( '2008-11-22', '20:30:40' )
                  
                  TIMESTAMP '2008-11-22 20:30:40.000000'
                  

                  TO_CHAR

                  TO_CHAR ( <datetime value expr>, <char value expr> )

                  This function formats a datetime or numeric value to the format given in the second argument. The format string can contain pattern elements from the list given below, plus punctuation and space characters. An example, including the result, is given below:

                  TO_CHAR ( TIMESTAMP'2008-02-01 20:30:40', 'YYYY BC MONTH, DAY HH' )
                  
                  2008 AD February, Friday 8
                  
                  TO_CHAR ( TIMESTAMP'2008-02-01 20:30:40', '"The Date is" YYYY BC MONTH, DAY HH' )
                  
                  The Date is 2008 AD February, Friday 8
                  

                  The format is internally translated to a java.text.SimpleDateFormat format string. Separator characters (space, comma, period, hyphen, colon, semicolon, forward slash) can be included between the pattern elements. Unsupported format strings should not be used. You can include a string literal inside the format string by enclosing it in double quotes (see the second example above). (HyperSQL)

                  TO_DATE

                  TO_DATE ( <char value expr>, <char value expr> )

                  This function translates a formatted datetime sting to a TIMESTAMP(0) according to the format given in the second argument. See TO_TIMESTAMP below for further details.

                  TO_TIMESTAMP

                  TO_TIMESTAMP ( <char value expr>, <char value expr> )

                  This function translates a formatted datetime sting to a TIMESTAMP(6) according to the format given in the second argument. The format string can contain pattern elements from the list given below, plus punctuation and space characters. The pattern should contain all the necessary fields to construct a date, including, year, month, day of month, etc. The returned timestamp can then be cast into DATE or TIME types if necessary. An example, including the result, is given below:

                  TO_TIMESTAMP ( '22/11/2008 20:30:40', 'DD/MM/YYYY HH:MI:SS' )
                  
                  TIMESTAMP '2008-11-22 20:30:40.000000'
                  

                  The format strings that can be used for TO_DATE and TO_TIMESTAMP are more restrictive than those used for TO_CHAR, because the format string must contain the elements needed to build a full DATE or TIMESTAMP value. For example, you cannot use the 'WW', 'W', 'HH' or 'HH12' format elements with TO_DATE or TO_TIMESTAMP

                  The format is internally translated to a java.text.SimpleDateFormat format string. Unsupported format strings should not be used. With TO_CHAR, you can include a string literal inside the format string by enclosing it in double quotes. (HyperSQL)

                  The supported format components are all uppercase as follows:

                  Table 10.1. TO_CHAR, TO_DATE and TO_TIMESTAMP format elements

                  BC | B.C. | AD | A.D.Returns AD for common era and BC for before common era
                  RRRR

                  4-digit year

                  YYYY

                  4-digit year

                  IYYY

                  4-digit year, corresponding to ISO week of the year. The reported year for the last few days of the calendar year may be the next year.

                  YY

                  2 digit year

                  IY

                  2 digit year, corresponding to ISO week of the year

                  MM

                  Month (01-12)

                  MON

                  Short three-letter name of month

                  MONTH

                  Name of month

                  WW

                  Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year (not a calendar week).

                  W

                  Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh (not a calendar week).

                  IW

                  Week of year (1-52 or 1-53) based on the ISO standard. Week starts on Monday. The first week may start near the end of previous year.

                  DAY

                  Name of day.

                  DD

                  Day of month (01-31).

                  DDD

                  Day of year (1-366).

                  DY

                  Short three-letter name of day.

                  HH

                  Hour of day (00-11).

                  HH12

                  Hour of day (00-11).

                  HH24

                  Hour of day (00-23).

                  MI

                  Minute (00-59).

                  SS

                  Second (00-59).

                  FF

                  Fractional seconds.


                  Array Functions

                  Array functions are specialised functions with ARRAY parameters or return values. For the ARRAY_AGG aggregate function, see the Data Access and Change chapter.

                  CARDINALITY

                  CARDINALITY( <array value expr> )

                  Returns the element count for the given array argument. (Foundation)

                  MAX_CARDINALITY

                  MAX_CARDINALITY( <array value expr> )

                  Returns the maximum allowed element count for the given array argument. (Foundation)

                  POSITION_ARRAY

                  POSITION_ARRAY( <value expression> IN <array value expr> [ FROM <int value expr> ] )

                  Returns the position of the first match for the <value expression> in the array. By default the search starts from the beginning of the array. The optional <int value expr> specifies the start position. Positions are counted from 1. Returns zero if no match is found. (HyperSQL)

                  SORT_ARRAY

                  SORT_ARRAY( <array value expr> [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ] )

                  Returns a sorted copy of the array. By default, sort is performed in ascending order and NULL elements are sorted first. (HyperSQL)

                  TRIM_ARRAY

                  TRIM_ARRAY( <array value expr>, <num value expr> )

                  Returns a new array that contains the elements of the <array value expr> minus the number of elements specified by the <num value expr>. Elements are discarded from the end of the array. (Foundation)

                  SEQUENCE_ARRAY

                  SEQUENCE_ARRAY( <value expr 1>, <value expr 2>, <value expr 3 )

                  Returns a new array that contains a sequence of values. The <value expr 1> is the lower bound of the range. The <value expr 2> is the upper bound of the range. The <value expr 3> is the increment. The elments of the array are within the inclusive range. The first element is <value expr 1> and each subsequent element is the sum of the previous element and the increment. If the increment is zero, only the first element is returned. When the increment is negative, the lower bound should be larger than the upper bound. The type of the arguments can be all number types, or a datetime range and an interval for the third argument (HyperSQL)

                  In the examples below, a number sequence and a date sequence are shown. The UNNEST table expression is used to form a table from the array.

                  SEQUENCE_ARRAY(0, 100, 5)
                  
                  ARRAY[0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100] 
                  
                  SELECT * FROM UNNEST(SEQUENCE_ARRAY(10, 12, 1))
                  
                  C1 
                  -- 
                  10 
                  11 
                  12 
                  
                  SELECT * FROM UNNEST(SEQUENCE_ARRAY(CURRENT_DATE, CURRENT_DATE + 6 DAY, 1 DAY)) WITH ORDINALITY AS T(D, I) 
                  
                  D          I 
                  ---------- - 
                  2010-08-01 1 
                  2010-08-02 2 
                  2010-08-03 3 
                  2010-08-04 4 
                  2010-08-05 5 
                  2010-08-06 6 
                  2010-08-07 7
                  
                  

                  General Functions

                  General functions can take different types of arguments. Some General Functions accept a variable number of arguments.

                  Also see the Data Access and Change chapter for SQL expressions that are similar to functions, for example CAST and NULLIF.

                  CASEWHEN

                  CASEWHEN( <boolean value expr>, <value expr 2>, <value expr 3> )

                  If the <boolean value expr> is true, returns <value expr 2> otherwise returns <value expr 3>. Use a CASE WHEN expression instead for more extensive capabilities and options. CASE WHEN is documented in the Data Access and Change chapter. (HyperSQL)

                  COALESCE

                  COALESCE( <value expr 1>, <value expr 2> [, ...] )

                  Returns <value expr 1> if it is not null, otherwise returns <value expr 2> if not null and so on. The type of both arguments must be comparable. (Foundation)

                  CONVERT

                  CONVERT ( <value expr> , <data type> )

                  <data type> ::= { SQL_BIGINT | SQL_BINARY | SQL_BIT |SQL_BLOB | SQL_BOOLEAN | SQL_CHAR | SQL_CLOB | SQL_DATE | SQL_DECIMAL | SQL_DATALINK |SQL_DOUBLE | SQL_FLOAT | SQL_INTEGER | SQL_LONGVARBINARY | SQL_LONGNVARCHAR | SQL_LONGVARCHAR | SQL_NCHAR | SQL_NCLOB | SQL_NUMERIC | SQL_NVARCHAR | SQL_REAL | SQL_ROWID | SQL_SQLXML | SQL_SMALLINT | SQL_TIME | SQL_TIMESTAMP | SQL_TINYINT | SQL_VARBINARY | SQL_VARCHAR} [ ( <precision, length or scale parameters> ) ]

                  The CONVERT function is a JDBC escape function, equivalent to the SQL standard CAST expression. It converts the <value expr> into the given <data type> and returns the value. The <data type> options are synthetic names made by prefixing type names with SQL_. Some of the <data type> options represent valid SQL types, but some are based on non-standard type names, namely { SQL_LONGNVARCHAR | SQL_LONGVARBINARY |SQL_LONGVARCHAR | SQL_TINYINT }. None of the synthetic names can be used in any other context than the CONVERT function.

                  The definition of CONVERT in the JDBC Standard does not allow the precision, scale or length to be specified. This is required by the SQL standard for BINARY, BIT, BLOB, CHAR, CLOB, VARBINARY and VARCHAR types and is often needed for DECIMAL and NUMERIC. Defaults are used for precision.

                  HyperSQL also allows the use of real type names (without the SQL_ prefix). In this usage, HyperSQL allows the use of precision, scale or length for the type definition when they are valid for the type definition.

                  When MS SQL Server compatibility mode is on, the parameters of CONVERT are switched and only the real type names with required precision, scale or length are allowed. (JDBC)

                  DECODE

                  DECODE( <value expr main>, <value expr match 1>, <value expr result 1> [...,] [, <value expr default>] )

                  DECODE takes at least 3 arguments. The <value expr main> is compared with <value expr match 1> and if it matches, <value expr result 1> is returned. If there are additional pairs of <value expr match n> and <value expr result n>, comparison is repeated until a match is found the result is returned. If no match is found, the <value expr default> is returned if it is specified, otherwise NULL is returned. The type of the return value is a combination of the types of the <value expr result ... > arguments. (HyperSQL)

                  GREATEST

                  GREATEST( <value expr 1>, [<value expr ...>, ...] )

                  The GREATEST function takes one or more arguments. It compares the arguments with each other and returns the greatest argument. The return type is the combined type of the arguments. Arguments can be of any type, so long as they are comparable. (HyperSQL)

                  IFNULL

                  ISNULL

                  IFNULL | ISNULL ( <value expr 1>, <value expr 2> )

                  Returns <value expr 1> if it is not null, otherwise returns <value expr 2>. The type of the return value is the type of <value expr 1>. Almost equivalent to SQL Standard COALESCE(<value expr 1>, <value expr 2>) function, but without type modification. (JDBC)

                  LEAST

                  LEAST( <value expr 1>, [<value expr ...>, ...] )

                  The LEAST function takes one or more arguments. It compares the arguments with each other and returns the smallest argument. The return type is the combined type of the arguments. Arguments can be of any type, so long as they are comparable. (HyperSQL)

                  LOAD_FILE

                  LOAD_FILE ( <char value expr 1> [, <char value expr 2>] )

                  Returns a BLOB or CLOB containing the URL or file path specified in the first argument. If used with a single argument, the function returns a BLOB. If used with two arguments, the function returns a CLOB and the second argument is the character encoding of the file. (HyperSQL)

                  NULLIF

                  NULLIF( <value expr 1>, <value expr 2> )

                  Returns <value expr 1> if it is not equal to <value expr 2>, otherwise returns null. The type of both arguments must be the same. This function is a shorthand for a specific CASE expression. (Foundation)

                  NVL

                  NVL( <value expr 1>, <value expr 2> )

                  Returns <value expr 1> if it is not null, otherwise returns <value expr 2>. The type of the return value is the type of <value expr 1>. For example, if <value expr 1> is an INTEGER column and <value expr 2> is a DOUBLE constant, the return type is cast into INTEGER. This function is similar to IFNULL. (HyperSQL)

                  NVL2

                  NVL2( <value expr 1>, <value expr 2>, <value expr 3> )

                  If <value expr 1> is not null, returns <value expr 2>, otherwise returns <value expr 3>. The type of the return value is the type of <value expr 2> unless it is null. (HyperSQL)

                  UUID

                  UUID ( [ { <char value expr> | <binary value expr> ] } )

                  With no parameter, this function returns a new UUID value as a 16 byte binary value. With a UUID hexadecimal string argument, it returns the 16 byte binary value of the UUID. With a 16 byte binary argument, it returns the formatted UUID character representation. (HyperSQL)

                  System Functions

                  CRYPT_KEY

                  CRYPT_KEY( <value expr 1>, <value expr 2> )

                  Returns a binary string representation of a cryptography key for the given cipher and cryptography provider. The cipher specification is specified by <value expr 1> and the provider by <value expr 2>. To use the default provider, specify null for <value expr 2>. (HyperSQL)

                  DIAGNOSTICS

                  DIAGNOSTICS ( ROW_COUNT )

                  This is a convenience function for use instead of the GET DIAGNOSTICS ... statement. The argument specifies the name of the diagnostics variable. Currently the only supported variable is the ROW_COUNT variable. The function returns the row count returned by the last executed statement. The return value is 0 after most statements. Calling this function immediately after executing an INSERT, UPDATE, DELETE or MERGE statement returns the row count for the last statement, as it is returned by the JDBC statement. (HyperSQL)

                  IDENTITY

                  IDENTITY ()

                  Returns the last IDENTITY value inserted into a row by the current session. The statement, CALL IDENTITY() can be made after an INSERT statement that inserts a row into a table with an IDENTITY column. The CALL IDENTITY() statement returns the last IDENTITY value that was inserted into a table by the current session. Each session manages this function call separately and is not affected by inserts in other sessions. The statement can be executed as a direct statement or a prepared statement. (HyperSQL)

                  DATABASE

                  DATABASE ()

                  Returns the file name (without directory information) of the database. (JDBC)

                  DATABASE_NAME

                  DATABASE_NAME ()

                  Returns the database name. This name is a 16 character, uppercase string. It is generated as a string based on the timestamp of the creation of the database, for example HSQLDB32438AEAFB. The name can be redefined by an admin user but the new name must be all uppercase and 16 characters long. This name is used in log messages with external logging frameworks. (HyperSQL)

                  DATABASE_VERSION

                  DATABASE_VERSION ()

                  Returns the full version string for the database engine. For example, 2.0.1. (JDBC)

                  USER

                  USER ()

                  Equivalent to the SQL function CURRENT_USER. (JDBC)

                  CURRENT_USER

                  CURRENT_USER

                  CURRENT_ROLE

                  CURRENT_ROLE

                  SESSION_USER

                  SESSION_USER

                  SYSTEM_USER

                  SYSTEM_USER

                  CURRENT_SCHEMA

                  CURRENT_SCHEMA

                  CURRENT_CATALOG

                  CURRENT_CATALOG

                  These functions return the named current session attribute. They are all SQL Standard functions.

                  The CURRENT_USER is the user that connected to the database, or a user subsequently set by the SET AUTHORIZATION statement.

                  SESSION_USER is the same as CURRENT_USER

                  SYSTEM_USER is the user that connected to the database. It is not changed with any command until the session is closed.

                  CURRENT_SCHEMA is default schema of the user, or a schema subsequently set by the SET SCHEMA command.

                  CURRENT_CATALOG is always the same within a given HyperSQL database and indicates the name of the catalog.

                  IS_AUTOCOMMIT

                  IS_AUTOCOMMIT()

                  Returns TRUE if the session is in autocommit mode. (HyperSQL)

                  IS_READONLY_SESSION

                  IS_READONLY_SESSION()

                  Returns TRUE if the session is in read only mode. (HyperSQL)

                  IS_READONLY_DATABASE

                  IS_READONLY_DATABASE()

                  Returns TRUE if the database is a read only database. (HyperSQL)

                  IS_READONLY_DATABASE_FILES

                  IS_READONLY_DATABASE_FILES()

                  Returns TRUE if the database is a read-only files database. In this kind of database, it is possible to modify the data, but the changes are not persisted to the database files. (HyperSQL)

                  ISOLATION_LEVEL

                  ISOLATION_LEVEL()

                  Returns the current transaction isolation level for the session. Returns either READ COMMITTED or SERIALIZABLE as a string. (HyperSQL)

                  SESSION_ID

                  SESSION_ID()

                  Returns the id of the session as a BIGINT value. Each session id is unique during the operational lifetime of the database. Id's are restarted after a shutdown and restart. (HyperSQL)

                  SESSION_ISOLATION_LEVEL

                  SESSION_ISOLATION_LEVEL()

                  Returns the default transaction isolation level for the current session. Returns either READ COMMITTED or SERIALIZABLE as a string. (HyperSQL)

                  DATABASE_ISOLATION_LEVEL

                  DATABASE_ISOLATION_LEVEL()

                  Returns the default transaction isolation level for the database. Returns either READ COMMITTED or SERIALIZABLE as a string. (HyperSQL)

                  TRANSACTION_SIZE

                  TRANSACTION_SIZE()

                  Returns the row change count for the current transaction. Each row change represents a row INSERT or a row DELETE operation. There will be a pair of row change operations for each row that is updated.

                  TRANSACTION_ID

                  TRANSACTION_ID()

                  Returns the current transaction ID for the session as a BIGINT value. The database maintains a global incremental id which is allocated to new transactions and new actions (statement executions) in different sessions. This value is unique to the current transaction. (HyperSQL)

                  ACTION_ID

                  ACTION_ID()

                  Returns the current action ID for the session as a BIGINT value. The database maintains a global incremental id which is allocated to new transactions and new actions (statement executions) in different sessions. This value is unique to the current action. (HyperSQL)

                  TRANSACTION_CONTROL

                  TRANSACTION_CONTROL()

                  Returns the current transaction model for the database. Returns LOCKS, MVLOCKS or MVCC as a string. (HyperSQL)

                  LOB_ID

                  LOB_ID( <column reference> )

                  Returns internal ID of a lob as a BIGINT value. Lob ID's are unique and never reused. The <column reference> is the name of the column (or variable, or argument) which is a CLOB or BLOB. Returns null if the value is null. (HyperSQL)

                  ROWNUM

                  ROWNUM()

                  ROW_NUMBER

                  ROW_NUMBER() OVER()

                  Returns the current row number (from 1) being processed in a select statement. This has the same semantics as the ROWNUM pseudo-column in Oracle syntax mode, but can be used in any syntax mode. The function is used in a SELECT of DELETE statement. The ROWNUM of a row is incremented as the rows are added to the result set. It is therefore possible to use a condition such as WHERE ROWNUM() < 10, but not ROWNUM() > 10 or ROWNUM = 10. The ROW_NUMBER() OVER() alternative performs the same function and is included for compatibility with other database engines.(HyperSQL)


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/guide.html0000644000175000017500000530444512007570422017746 0ustar renerene HyperSQL User Guide

                  HyperSQL User Guide

                  HyperSQL Database Engine (HSQLDB) 2.2

                  Edited by

                  The HSQL Development Group

                  Edited by

                  Blaine Simpson

                  The HSQL Development Group

                  Edited by

                  Fred Toussi

                  The HSQL Development Group

                  Copyright 2002-2011 The HSQL Development Group. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. You are not allowed to distribute or display this document on the web in an altered form.

                  2012-08-06 00:09:15+0100


                  Table of Contents

                  Preface
                  Available formats for this document
                  1. Running and Using HyperSQL
                  The HSQLDB Jar
                  Running Database Access Tools
                  A HyperSQL Database
                  In-Process Access to Database Catalogs
                  Server Modes
                  HyperSQL HSQL Server
                  HyperSQL HTTP Server
                  HyperSQL HTTP Servlet
                  Connecting to a Database Server
                  Security Considerations
                  Using Multiple Databases
                  Accessing the Data
                  Closing the Database
                  Creating a New Database
                  2. SQL Language
                  Standards Support
                  SQL Data and Tables
                  Temporary Tables
                  Persistent Tables
                  Lob Data
                  Short Guide to Data Types
                  Data Types and Operations
                  Numeric Types
                  Boolean Type
                  Character String Types
                  Binary String Types
                  Bit String Types
                  Storage and Handling of Java Objects
                  Type Length, Precision and Scale
                  Datetime types
                  Interval Types
                  Arrays
                  Array Definition
                  Array Reference
                  Array Operations
                  Indexes and Query Speed
                  Query Processing and Optimisation
                  Indexes and Conditions
                  Indexes and Operations
                  Indexes and ORDER BY, OFFSET and LIMIT
                  3. Sessions and Transactions
                  Overview
                  Session Attributes and Variables
                  Session Attributes
                  Session Variables
                  Session Tables
                  Transactions and Concurrency Control
                  Two Phase Locking
                  Two Phase Locking with Snapshot Isolation
                  Lock Contention in 2PL
                  Locks in SQL Routines and Triggers
                  MVCC
                  Choosing the Transaction Model
                  Schema and Database Change
                  Simultaneous Access to Tables
                  Viewing Sessions
                  Session and Transaction Control Statements
                  4. Schemas and Database Objects
                  Overview
                  Schemas and Schema Objects
                  Names and References
                  Character Sets
                  Collations
                  Distinct Types
                  Domains
                  Number Sequences
                  Tables
                  Views
                  Constraints
                  Assertions
                  Triggers
                  Routines
                  Indexes
                  Statements for Schema Definition and Manipulation
                  Common Elements and Statements
                  Renaming Objects
                  Commenting Objects
                  Schema Creation
                  Table Creation
                  Table Manipulation
                  View Creation and Manipulation
                  Domain Creation and Manipulation
                  Trigger Creation
                  Routine Creation
                  Sequence Creation
                  SQL Procedure Statement
                  Other Schema Object Creation
                  The Information Schema
                  Predefined Character Sets, Collations and Domains
                  Views in INFORMATION SCHEMA
                  Visibility of Information
                  Name Information
                  Data Type Information
                  Product Information
                  Operations Information
                  SQL Standard Views
                  5. Text Tables
                  Overview
                  The Implementation
                  Definition of Tables
                  Scope and Reassignment
                  Null Values in Columns of Text Tables
                  Configuration
                  Disconnecting Text Tables
                  Text File Usage
                  Text File Global Properties
                  Transactions
                  6. Access Control
                  Overview
                  Authorizations and Access Control
                  Built-In Roles and Users
                  Listing Users and Roles
                  Access Rights
                  Statements for Authorization and Access Control
                  7. Data Access and Change
                  Overview
                  Cursors And Result Sets
                  Columns and Rows
                  Navigation
                  Updatability
                  Sensitivity
                  Holdability
                  Autocommit
                  JDBC Overview
                  JDBC Parameters
                  JDBC and Data Change Statements
                  JDBC Callable Statement
                  JDBC Returned Values
                  Cursor Declaration
                  Syntax Elements
                  Literals
                  References, etc.
                  Value Expression
                  Predicates
                  Aggregate Functions
                  Other Syntax Elements
                  Data Access Statements
                  Select Statement
                  Table
                  Subquery
                  Query Specification
                  Table Expression
                  Table Primary
                  Joined Table
                  Selection
                  Projection
                  Computed Columns
                  Naming
                  Grouping Operations
                  Aggregation
                  Set Operations
                  With Clause and Recursive Queries
                  Query Expression
                  Ordering
                  Slicing
                  Data Change Statements
                  Delete Statement
                  Truncate Statement
                  Insert Statement
                  Update Statement
                  Merge Statement
                  Diagnostics and State
                  8. SQL-Invoked Routines
                  Routine Definition
                  Routine Characteristics
                  SQL Language Routines (PSM)
                  Advantages and Disadvantages
                  Routine Statements
                  Compound Statement
                  Table Variables
                  Variables
                  Cursors
                  Handlers
                  Assignment Statement
                  Select Statement : Single Row
                  Formal Parameters
                  Iterated Statements
                  Iterated FOR Statement
                  Conditional Statements
                  Return Statement
                  Control Statements
                  Raising Exceptions
                  Routine Polymorphism
                  Returning Data From Procedures
                  Recursive Routines
                  Java Language Routines (SQL/JRT)
                  Polymorphism
                  Java Language Procedures
                  Java Static Methods
                  Legacy Support
                  Securing Access to Classes
                  User Defined Aggregate Functions
                  Definition of Aggregate Functions
                  SQL PSM Aggregate Functions
                  Java Aggregate Functions
                  9. Triggers
                  Overview
                  BEFORE Triggers
                  AFTER Triggers
                  INSTEAD OF Triggers
                  Trigger Properties
                  Trigger Event
                  Granularity
                  Trigger Action Time
                  References to Rows
                  Trigger Condition
                  Trigger Action in SQL
                  Trigger Action in Java
                  Trigger Creation
                  10. Built In Functions
                  Overview
                  String and Binary String Functions
                  Numeric Functions
                  Date Time and Interval Functions
                  Functions to Report the Time Zone.
                  Functions to Report the Current Datetime
                  Functions to Extract an Element of a Datetime
                  Functions for Datetime Arithmetic
                  Functions to Convert or Format a Datetime
                  Array Functions
                  General Functions
                  System Functions
                  11. System Management
                  Mode of Operation and Tables
                  Mode of Operation
                  Tables
                  Large Objects
                  Deployment context
                  Readonly Databases
                  ACID, Persistence and Reliability
                  Atomicity, Consistency, Isolation, Durability
                  Backing Up Database Catalogs
                  Making Online Backups
                  Making Offline Backups
                  Examining Backups
                  Restoring a Backup
                  Encrypted Databases
                  Creating and Accessing an Encrypted Database
                  Speed Considerations
                  Security Considerations
                  Monitoring Database Operations
                  External Statement Level Monitoring
                  Internal Statement Level Monitoring
                  Internal Event Monitoring
                  Log4J and JDK logging
                  Server Operation Monitoring
                  Database Security
                  Security Defaults
                  Authentication Control
                  Compatibility with Other RDBMS
                  PostgreSQL Compatibility
                  MySQL Compatibility
                  Firebird Compatibility
                  Apache Derby Compatibility
                  Oracle Compatibility
                  DB2 Compatibility
                  MS SQLServer and Sybase Compatibility
                  Statements
                  System Operations
                  Database Settings
                  SQL Conformance Settings
                  Cache, Persistence and Files Settings
                  Authentication Settings
                  12. Properties
                  Connection URL
                  Variables In Connection URL
                  Connection properties
                  Database Properties in Connection URL and Properties
                  SQL Conformance Properties
                  Database Operations Properties
                  Database File and Memory Properties
                  Crypt Properties
                  System Properties
                  13. HyperSQL Network Listeners (Servers)
                  Listeners
                  HyperSQL Server
                  HyperSQL HTTP Server
                  HyperSQL HTTP Servlet
                  Server and Web Server Properties
                  Starting a Server from your Application
                  Allowing a Connection to Open or Create a Database
                  Specifying Database Properties at Server Start
                  TLS Encryption
                  Requirements
                  Encrypting your JDBC connection
                  JSSE
                  Making a Private-key Keystore
                  Automatic Server or WebServer startup on UNIX
                  Network Access Control
                  14. HyperSQL on UNIX
                  Purpose
                  Installation
                  Setting up Database Catalog and Listener
                  Accessing your Database
                  Create additional Accounts
                  Shutdown
                  Running Hsqldb as a System Daemon
                  Portability of hsqldb init script
                  Init script Setup Procedure
                  Troubleshooting the Init Script
                  Upgrading
                  15. Deployment Guide
                  Memory and Disk Use
                  Table Memory Allocation
                  Result Set Memory Allocation
                  Temporary Memory Use During Operations
                  Data Cache Memory Allocation
                  Object Pool Memory Allocation
                  Lob Memory Usage
                  Disk Space
                  Managing Database Connections
                  Tweaking the Mode of Operation
                  Application Development and Testing
                  Embedded Databases in Desktop Applications
                  Embedded Databases in Server Applications
                  Mixed Mode : Embedding a HyperSQL Server (Listener)
                  Using HyperSQL Without Logging Data Change
                  Bulk Inserts, Updates and Deletes
                  Using NIO File Access
                  Server Databases
                  Upgrading Databases
                  Upgrading From Older Versions
                  Manual Changes to the *.script File
                  Backward Compatibility Issues
                  HyperSQL Dependency Settings for Applications
                  What version to Pull
                  Using the HyperSQL Snapshot Repository
                  Range Versioning
                  A. Lists of Keywords
                  List of SQL Standard Keywords
                  List of SQL Keywords Disallowed as HyperSQL Identifiers
                  Special Function Keywords
                  B. Building HyperSQL Jars
                  Purpose
                  Building with Gradle
                  Invoking a Gradle Build Graphically
                  Invoking a Gradle Build from the Command Line
                  Using Gradle
                  Building with Ant
                  Obtaining Ant
                  Building Hsqldb with Ant
                  Building for Older JDKs
                  Building with IDE Compilers
                  Hsqldb CodeSwitcher
                  Building Documentation
                  C. HyperSQL with OpenOffice
                  HyperSQL with OpenOffice
                  Using OpenOffice / LibreOffice as a Database Tool
                  Converting .odb files to use with HyperSQL Server
                  D. HyperSQL File Links
                  SQL Index
                  General Index

                  List of Tables

                  1. Available formats of this document
                  10.1. TO_CHAR, TO_DATE and TO_TIMESTAMP format elements
                  12.1. Memory Database URL
                  12.2. File Database URL
                  12.3. Resource Database URL
                  12.4. Server Database URL
                  12.5. User and Password
                  12.6. Column Names in JDBC ResultSet
                  12.7. Creating New Database
                  12.8. Automatic Shutdown
                  12.9. Validity Check Property
                  12.10. SQL Keyword Use as Identifier
                  12.11. SQL Keyword Starting with the Underscore or Containing Dollar Characters
                  12.12. Reference to Columns Names
                  12.13. String Size Declaration
                  12.14. Type Enforcement in Comparison and Assignment
                  12.15. Foreign Key Triggered Data Change
                  12.16. Use of LOB for LONGVAR Types
                  12.17. Concatenation with NULL
                  12.18. NULL in Multi-Column UNIQUE Constraints
                  12.19. Truncation or Rounding in Type Conversion
                  12.20. Decimal Scale of Division and AVG Values
                  12.21. Support for NaN values
                  12.22. Sort order of NULL values
                  12.23. String comparison with padding
                  12.24. DB2 Style Syntax
                  12.25. MSSQL Style Syntax
                  12.26. MySQL Style Syntax
                  12.27. Oracle Style Syntax
                  12.28. PostgreSQL Style Syntax
                  12.29. Default Table Type
                  12.30. Transaction Control Mode
                  12.31. Default Isolation Level for Sessions
                  12.32. Transaction Rollback in Deadlock
                  12.33. Time Zone and Interval Types
                  12.34. Opening Database as Read Only
                  12.35. Opening Database Without Modifying the Files
                  12.36. Huge database files and tables
                  12.37. Temporary Result Rows in Memory
                  12.38. Event Logging
                  12.39. SQL Logging
                  12.40. Rows Cached In Memory
                  12.41. Rows Cached In Memory
                  12.42. Size of Rows Cached in Memory
                  12.43. Size Scale of Disk Table Storage
                  12.44. Size Scale of LOB Storage
                  12.45. Internal Backup of Database Files
                  12.46. Use of Lock File
                  12.47. Logging Data Change Statements
                  12.48. Automatic Checkpoint Frequency
                  12.49. Automatic Defrag at Checkpoint
                  12.50. Logging Data Change Statements Frequency
                  12.51. Logging Data Change Statements Frequency
                  12.52. Use of NIO for Disk Table Storage
                  12.53. Use of NIO for Disk Table Storage
                  12.54. Recovery Log Processing
                  12.55. Default Properties for TEXT Tables
                  12.56. Forcing Garbage Collection
                  12.57. Crypt Property For LOBs
                  12.58. Cipher Key for Encrypted Database
                  12.59. Crypt Provider Encrypted Database
                  12.60. Cipher Specification for Encrypted Database
                  12.61. Logging Framework
                  12.62. Text Tables
                  12.63. Java Functions
                  13.1. common server and webserver properties
                  13.2. server properties
                  13.3. webserver properties

                  List of Examples

                  1.1. Java code to connect to the local hsql Server
                  1.2. Java code to connect to the local http Server
                  1.3. Java code to connect to the local secure SSL hsql and http Servers
                  1.4. specifying a connection property to shutdown the database when the last connection is closed
                  1.5. specifying a connection property to disallow creating a new database
                  3.1. User-defined Session Variables
                  3.2. User-defined Temporary Session Tables
                  3.3. Setting Transaction Characteristics
                  3.4. Locking Tables
                  3.5. Rollback
                  3.6. Setting Session Characteristics
                  3.7. Setting Session Authorization
                  3.8. Setting Session Time Zone
                  4.1. inserting the next sequence value into a table row
                  4.2. numbering returned rows of a SELECT in sequential order
                  4.3. using the last value of a sequence
                  4.4. Column values which satisfy a 2-column UNIQUE constraint
                  11.1. Using CACHED tables for the LOB schema
                  11.2. Offline Backup Example
                  11.3. Listing a Backup with DbBackup
                  11.4. Restoring a Backup with DbBackup
                  11.5. Finding foreign key rows with no parents after a bulk import
                  13.1. Exporting certificate from the server's keystore
                  13.2. Adding a certificate to the client keystore
                  13.3. Specifying your own trust store to a JDBC client
                  13.4. Getting a pem-style private key into a JKS keystore
                  13.5. Validating and Testing an ACL file
                  14.1. example sqltool.rc stanza
                  15.1. Using CACHED tables for the LOB schema
                  15.2. MainInvoker Example
                  15.3. HyperSQL Snapshot Repository Definition
                  15.4. Sample Snapshot Ivy Dependency
                  15.5. Sample Snapshot Maven Dependency
                  15.6. Sample Snapshot Gradle Dependency
                  15.7. Sample Snapshot ivy.xml loaded by Ivyxml plugin
                  15.8. Sample Snapshot Groovy Dependency, using Grape
                  15.9. Sample Range Ivy Dependency
                  15.10. Sample Range Maven Dependency
                  15.11. Sample Range Gradle Dependency
                  15.12. Sample Range ivy.xml loaded by Ivyxml plugin
                  15.13. Sample Range Groovy Dependency, using Grape
                  B.1. Buiding the standard Hsqldb jar file with Ant
                  B.2. Example source code before CodeSwitcher is run
                  B.3. CodeSwitcher command line invocation
                  B.4. Source code after CodeSwitcher processing

                  Preface

                  HSQLDB (HyperSQL DataBase) is a modern relational database manager that conforms closely to the SQL:2008 Standard and JDBC 4 specifications. It supports all core features and many of the optional features of SQL:2008.

                  The first versions of HSQLDB were released in 2001. Version 2.0, first released in 2010, includes a complete rewrite of most parts of the database engine.

                  This documentation covers the latest HyperSQL version 2.2. This documentation is regularly improved and updated. The latest, updated version can be found at http://hsqldb.org/doc/2.0/

                  If you notice any mistakes in this document, or if you have problems with the procedures themselves, please use the HSQLDB support facilities which are listed at http://hsqldb.org/support

                  Available formats for this document

                  This document is available in several formats.

                  You may be reading this document right now at http://hsqldb.org/doc/2.0, or in a distribution somewhere else. I hereby call the document distribution from which you are reading this, your current distro.

                  http://hsqldb.org/doc/2.0 hosts the latest production versions of all available formats. If you want a different format of the same version of the document you are reading now, then you should try your current distro. If you want the latest production version, you should try http://hsqldb.org/doc/2.0.

                  Sometimes, distributions other than http://hsqldb.org/doc/2.0 do not host all available formats. So, if you can't access the format that you want in your current distro, you have no choice but to use the newest production version at http://hsqldb.org/doc/2.0.

                  Table 1. Available formats of this document


                  If you are reading this document now with a standalone PDF reader, the your distro links may not work.

                  Chapter 1. Running and Using HyperSQL

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5039 $

                  Copyright 2002-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  The HSQLDB Jar

                  The HSQLDB jar package is located in the /lib directory of the ZIP package and contains several components and programs.

                  Components of the Hsqldb jar package

                  • HyperSQL RDBMS Engine (HSQLDB)

                  • HyperSQL JDBC Driver

                  • Database Manager (GUI database access tool, with Swing and AWT versions)

                  • Sql Tool (command line database access tool)

                  The HyperSQL RDBMS and JDBC Driver provide the core functionality. An additional jar contains Sql Tool (command line database access tool). SqlTool and the DatabaseManagers are general-purpose database tools that can be used with any database engine that has a JDBC driver.

                  Running Database Access Tools

                  The tools are used for interactive user access to databases, including creation of a database, inserting or modifying data, or querying the database. All tools are run in the normal way for Java programs. In the following example the Swing version of the Database Manager is executed. The hsqldb.jar is located in the directory ../lib relative to the current directory.

                  java -cp ../lib/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing

                  If hsqldb.jar is in the current directory, the command would change to:

                  java -cp hsqldb.jar org.hsqldb.util.DatabaseManagerSwing

                  Main classes for the Hsqldb tools

                  • org.hsqldb.util.DatabaseManager

                  • org.hsqldb.util.DatabaseManagerSwing

                  When a tool is up and running, you can connect to a database (may be a new database) and use SQL commands to access and modify the data.

                  Tools can use command line arguments. You can add the command line argument --help to get a list of available arguments for these tools.

                  Double clicking the HSQLDB jar will start the DatabaseManagerSwing application.

                  A HyperSQL Database

                  Each HyperSQL database is called a catalog. There are three types of catalog depending on how the data is stored.

                  Types of catalog data

                  • mem: stored entirely in RAM - without any persistence beyond the JVM process's life

                  • file: stored in filesystem files

                  • res: stored in a Java resource, such as a Jar and always read-only

                  All-in-memory, mem: catalogs can be used for test data or as sophisticated caches for an application. These databases do not have any files.

                  A file: catalog consists of between 2 to 6 files, all named the same but with different extensions, located in the same directory. For example, the database named "test" consists of the following files:

                  • test.properties

                  • test.script

                  • test.log

                  • test.data

                  • test.backup

                  • test.lobs

                  The properties file contains a few settings about the database. The script file contains the definition of tables and other database objects, plus the data for non-cached tables. The log file contains recent changes to the database. The data file contains the data for cached tables and the backup file is a compressed backup of the last known consistent state of the data file. All these files are essential and should never be deleted. For some catalogs, the test.data and test.backup files will not be present. In addition to those files, a HyperSQL database may link to any formatted text files, such as CSV lists, anywhere on the disk.

                  While the "test" catalog is open, a test.log file is used to write the changes made to data. This file is removed at a normal SHUTDOWN. Otherwise (with abnormal shutdown) this file is used at the next startup to redo the changes. A test.lck file is also used to record the fact that the database is open. This is deleted at a normal SHUTDOWN.

                  [Note]Note

                  When the engine closes the database at a shutdown, it creates temporary files with the extension .new which it then renames to those listed above. These files should not be deleted by the user. At the time of the next startup, all such files will be deleted by the database engine. In some circumstances, a test.data.xxx.old is created and deleted afterwards by the database engine. The user can delete these test.data.xxx.old files.

                  A res: catalog consists of the files for a small, read-only database that can be stored inside a Java resource such as a ZIP or JAR archive and distributed as part of a Java application program.

                  In-Process Access to Database Catalogs

                  In general, JDBC is used for all access to databases. This is done by making a connection to the database, then using various methods of the java.sql.Connection object that is returned to access the data. Access to an in-process database is started from JDBC, with the database path specified in the connection URL. For example, if the file: database name is "testdb" and its files are located in the same directory as where the command to run your application was issued, the following code is used for the connection:

                    Connection c = DriverManager.getConnection("jdbc:hsqldb:file:testdb", "SA", "");

                  The database file path format can be specified using forward slashes in Windows hosts as well as Linux hosts. So relative paths or paths that refer to the same directory on the same drive can be identical. For example if your database directory in Linux is /opt/db/ containing a database testdb (with files named testdb.*), then the database file path is /opt/db/testdb. If you create an identical directory structure on the C: drive of a Windows host, you can use the same URL in both Windows and Linux:

                    Connection c = DriverManager.getConnection("jdbc:hsqldb:file:/opt/db/testdb", "SA", "");

                  When using relative paths, these paths will be taken relative to the directory in which the shell command to start the Java Virtual Machine was executed. Refer to the Javadoc for JDBCConnection for more details.

                  Paths and database names for file databases are treated as case-sensitive when the database is created or the first connection is made to the database. But if a second connection is made to an open database, using a path and name that differs only in case, then the connection is made to the existing open database. This measure is necessary because in Windows the two paths are equivalent.

                  A mem: database is specified by the mem: protocol. For mem: databases, the path is simply a name. Several mem: databases can exist at the same time and distinguished by their names. In the example below, the database is called "mymemdb":

                    Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:mymemdb", "SA", "");

                  A res: database, is specified by the res: protocol. As it is a Java resource, the database path is a Java URL (similar to the path to a class). In the example below, "resdb" is the root name of the database files, which exists in the directory "org/my/path" within the classpath (probably in a Jar). A Java resource is stored in a compressed format and is decompressed in memory when it is used. For this reason, a res: database should not contain large amounts of data and is always read-only.

                    Connection c = DriverManager.getConnection("jdbc:hsqldb:res:org.my.path.resdb", "SA", "");

                  The first time in-process connection is made to a database, some general data structures are initialised and a few helper threads are started. After this, creation of connections and calls to JDBC methods of the connections execute as if they are part of the Java application that is making the calls. When the SQL command "SHUTDOWN" is executed, the global structures and helper threads for the database are destroyed.

                  Note that only one Java process at a time can make in-process connections to a given file: database. However, if the file: database has been made read-only, or if connections are made to a res: database, then it is possible to make in-process connections from multiple Java processes.

                  Server Modes

                  For most applications, in-process access is faster, as the data is not converted and sent over the network. The main drawback is that it is not possible by default to connect to the database from outside your application. As a result you cannot check the contents of the database with external tools such as Database Manager while your application is running.

                  Server modes provide the maximum accessibility. The database engine runs in a JVM and opens one or more in-process catalogs. It listens for connections from programs on the same computer or other computers on the network. It translates these connections into in-process connections to the databases.

                  Several different programs can connect to the server and retrieve or update information. Applications programs (clients) connect to the server using the HyperSQL JDBC driver. In most server modes, the server can serve an unlimited number of databases that are specified at the time of running the server, or optionally, as a connection request is received.

                  A Sever mode is also the preferred mode of running the database during development. It allows you to query the database from a separate database access utility while your application is running.

                  There are three server modes, based on the protocol used for communications between the client and server. They are briefly discussed below. More details on servers is provided in the HyperSQL Network Listeners (Servers) chapter.

                  HyperSQL HSQL Server

                  This is the preferred way of running a database server and the fastest one. A proprietary communications protocol is used for this mode. A command similar to those used for running tools and described above is used for running the server. The following example of the command for starting the server starts the server with one (default) database with files named "mydb.*" and the public name of "xdb". The public name hides the file names from users.

                    java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:mydb --dbname.0 xdb

                  The command line argument --help can be used to get a list of available arguments.

                  HyperSQL HTTP Server

                  This method of access is used when the computer hosting the database server is restricted to the HTTP protocol. The only reason for using this method of access is restrictions imposed by firewalls on the client or server machines and it should not be used where there are no such restrictions. The HyperSQL HTTP Server is a special web server that allows JDBC clients to connect via HTTP. The server can also act as a small general-purpose web server for static pages.

                  To run an HTTP server, replace the main class for the server in the example command line above with the following:

                    org.hsqldb.server.WebServer

                  The command line argument --help can be used to get a list of available arguments.

                  HyperSQL HTTP Servlet

                  This method of access also uses the HTTP protocol. It is used when a separate servlet engine (or application server) such as Tomcat or Resin provides access to the database. The Servlet Mode cannot be started independently from the servlet engine. The Servlet class, in the HSQLDB jar, should be installed on the application server to provide the connection. The database is specified using an application server property. Refer to the source file src/org/hsqldb/server/Servlet.java to see the details.

                  Both HTTP Server and Servlet modes can only be accessed using the JDBC driver at the client end. They do not provide a web front end to the database. The Servlet mode can serve only a single database.

                  Please note that you do not normally use this mode if you are using the database engine in an application server. In this situation, connections to a catalog are usually made in-process, or using a separate Server

                  Connecting to a Database Server

                  When a HyperSQL server is running, client programs can connect to it using the HSQLDB JDBC Driver contained in hsqldb.jar. Full information on how to connect to a server is provided in the Java Documentation for JDBCConnection (located in the /doc/apidocs directory of HSQLDB distribution). A common example is connection to the default port (9001) used for the hsql: protocol on the same machine:

                  Example 1.1. Java code to connect to the local hsql Server

                    try {
                        Class.forName("org.hsqldb.jdbc.JDBCDriver" );
                    } catch (Exception e) {
                        System.err.println("ERROR: failed to load HSQLDB JDBC driver.");
                        e.printStackTrace();
                        return;
                    }
                  
                    Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb", "SA", "");

                  If the HyperSQL HTTP server is used, the protocol is http: and the URL will be different:

                  Example 1.2. Java code to connect to the local http Server

                    Connection c = DriverManager.getConnection("jdbc:hsqldb:http://localhost/xdb", "SA", "");

                  Note in the above connection URL, there is no mention of the database file, as this was specified when running the server. Instead, the public name defined for dbname.0 is used. Also, see the HyperSQL Network Listeners (Servers) chapter for the connection URL when there is more than one database per server instance.

                  Security Considerations

                  When a HyperSQL server is run, network access should be adequately protected. Source IP addresses may be restricted by use of our Access Control List feature, network filtering software, firewall software, or standalone firewalls. Only secure passwords should be used-- most importantly, the password for the default system user should be changed from the default empty string. If you are purposefully providing data to the public, then the wide-open public network connection should be used exclusively to access the public data via read-only accounts. (i.e., neither secure data nor privileged accounts should use this connection). These considerations also apply to HyperSQL servers run with the HTTP protocol.

                  HyperSQL provides two optional security mechanisms. The encrypted SSL protocol, and Access Control Lists. Both mechanisms can be specified when running the Server or WebServer. On the client, the URL to connect to an SSL server is slightly different:

                  Example 1.3. Java code to connect to the local secure SSL hsql and http Servers

                    Connection c = DriverManager.getConnection("jdbc:hsqldb:hsqls://localhost/xdb", "SA", "");
                    Connection c = DriverManager.getConnection("jdbc:hsqldb:https://localhost/xdb", "SA", "");
                  


                  The security features are discussed in detail in the HyperSQL Network Listeners (Servers) chapter.

                  Using Multiple Databases

                  A server can provide connections to more than one database. In the examples above, more than one set of database names can be specified on the command line. It is also possible to specify all the databases in a .properties file, instead of the command line. These capabilities are covered in the HyperSQL Network Listeners (Servers) chapter

                  Accessing the Data

                  As shown so far, a java.sql.Connection object is always used to access the database. But the speed and performance depends on the type of connection.

                  Establishing a connection and closing it has some overheads, therefore it is not good practice to create a new connection to perform a small number of operations. A connection should be reused as much as possible and closed only when it is not going to be used again for a long while.

                  Reuse is more important for server connections. A server connection uses a TCP port for communications. Each time a connection is made, a port is allocated by the operating system and deallocated after the connection is closed. If many connections are made from a single client, the operating system may not be able to keep up and may refuse the connection attempt.

                  A java.sql.Connection object has some methods that return further java.sql.* objects. All these objects belong to the connection that returned them and are closed when the connection is closed. These objects can be reused, but if they are not needed after performing the operations, they should be closed.

                  A java.sql.DatabaseMetaData object is used to get metadata for the database.

                  A java.sql.Statement object is used to execute queries and data change statements. A java.sql.Statement can be reused to execute a different statement each time.

                  A java.sql.PreparedStatement object is used to execute a single statement repeatedly. The SQL statement usually contains parameters, which can be set to new values before each reuse. When a java.sql.PreparedStatement object is created, the engine keeps the compiled SQL statement for reuse, until the java.sql.PreparedStatement object is closed. As a result, repeated use of a java.sql.PreparedStatement is much faster than using a java.sql.Statement object.

                  A java.sql.CallableStatement object is used to execute an SQL CALL statement. The SQL CALL statement may contain parameters, which should be set to new values before each reuse. Similar to java.sql.PreparedStatement, the engine keeps the compiled SQL statement for reuse, until the java.sql.CallableStatement object is closed.

                  A java.sql.Connection object also has some methods for transaction control.

                  The commit() method performs a COMMIT while the rollback() method performs a ROLLBACK SQL statement.

                  The setSavepoint(String name) method performs a SAVEPOINT <name> SQL statement and returns a java.sql.Savepoint object. The rollback(Savepoint name) method performs a ROLLBACK TO SAVEPOINT <name> SQL statement.

                  The Javadoc for JDBCConnection, JDBCDriver, JDBCDatabaseMetadata JDBCResultSet, JDBCStatement, JDBCPreparedStatement list all the supported JDBC methods together with information that is specific to HSQLDB.

                  Closing the Database

                  All databases running in different modes can be closed with the SHUTDOWN command, issued as an SQL statement.

                  When SHUTDOWN is issued, all active transactions are rolled back. The catalog files are then saved in a form that can be opened quickly the next time the catalog is opened.

                  A special form of closing the database is via the SHUTDOWN COMPACT command. This command rewrites the .data file that contains the information stored in CACHED tables and compacts it to its minimum size. This command should be issued periodically, especially when lots of inserts, updates or deletes have been performed on the cached tables. Changes to the structure of the database, such as dropping or modifying populated CACHED tables or indexes also create large amounts of unused file space that can be reclaimed using this command.

                  Databases are not closed when the last connection to the database is explicitly closed via JDBC. A connection property, shutdown=true, can be specified on the first connection to the database (the connection that opens the database) to force a shutdown when the last connection closes.

                  Example 1.4. specifying a connection property to shutdown the database when the last connection is closed

                    Connection c = DriverManager.getConnection(
                            "jdbc:hsqldb:file:/opt/db/testdb;shutdown=true", "SA", "");


                  This feature is useful for running tests, where it may not be practical to shutdown the database after each test. But it is not recommended for application programs.

                  Creating a New Database

                  When a server instance is started, or when a connection is made to an in-process database, a new, empty database is created if no database exists at the given path.

                  With HyperSQL 2.0 the username and password that are specified for the connection are used for the new database. Both the username and password are case-sensitive. (The exception is the default SA user, which is not case-sensitive). If no username or password is specified, the default SA user and an empty password are used.

                  This feature has a side effect that can confuse new users. If a mistake is made in specifying the path for connecting to an existing database, a connection is nevertheless established to a new database. For troubleshooting purposes, you can specify a connection property ifexists=true to allow connection to an existing database only and avoid creating a new database. In this case, if the database does not exist, the getConnection() method will throw an exception.

                  Example 1.5. specifying a connection property to disallow creating a new database

                    Connection c = DriverManager.getConnection(
                            "jdbc:hsqldb:file:/opt/db/testdb;ifexists=true", "SA", "");


                  A database has many optional properties, described in the System Management chapter. You can specify most of these properties on the URL or in the connection properties for the first connection that creates the database. See the Properties chapter.

                  Chapter 2. SQL Language

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5039 $

                  Copyright 2002-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  Standards Support

                  HyperSQL 2.0 supports the dialect of SQL defined by SQL standards 92, 1999, 2003 and 2008. This means where a feature of the standard is supported, e.g. left outer join, the syntax is that specified by the standard text. Almost all syntactic features of SQL-92 up to Advanced Level are supported, as well as SQL:2008 core and many optional features of this standard. Work is in progress for a formal declaration of conformance.

                  At the time of this release, HyperSQL supports the widest range of SQL standard features among all open source RDBMS.

                  Various chapters of this guide list the supported syntax. When writing or converting existing SQL DDL (Data Definition Language), DML (Data Manipulation Language) or DQL (Data Query Language) statements for HSQLDB, you should consult the supported syntax and modify the statements accordingly. Some statements written for older versions may have to be modified.

                  Over 300 words are reserved by the standard and should not be used as table or column names. For example, the word POSITION is reserved as it is a function defined by the Standards with a similar role as String.indexOf() in Java. HyperSQL does not currently prevent you from using a reserved word if it does not support its use or can distinguish it. For example CUBE is a reserved words that is not currently supported by HyperSQL and is allowed as a table or column name. You should avoid using such names as future versions of HyperSQL are likely to support the reserved words and may reject your table definitions or queries. The full list of SQL reserved words is in the appendix Lists of Keywords .

                  If you have to use a reserved keyword as the name of a database object, you can enclose it in double quotes.

                  HyperSQL also supports enhancements with keywords and expressions that are not part of the SQL standard. Expressions such as SELECT TOP 5 FROM .., SELECT LIMIT 0 10 FROM ... or DROP TABLE mytable IF EXISTS are among such constructs.

                  Many print books cover SQL Standard syntax and can be consulted. For a well-written basic guide to SQL with examples, you can also consult PostgreSQL: Introduction and Concepts by Bruce Momjian, which is available on the web. Most of the core SQL coverage in the book applies also to HyperSQL. There are some differences in keywords supported by one and not the other engine (OUTER, OID's, etc.) or used differently (IDENTITY/SERIAL, TRIGGER, SEQUENCE, etc.).

                  In HyperSQL version 2.0, all features of JDBC4 that apply to the capabilities of HSQLDB are fully supported. The relevant JDBC classes are thoroughly documented with additional clarifications and HyperSQL specific comments. See the JavaDoc for the org.hsqldb.jdbc.* classes.

                  SQL Data and Tables

                  In an SQL system, all significant data is stored in tables and sequence generators. Therefore, the first step in creating a database is defining the tables and their columns. The SQL standard supports temporary tables, which are for temporary data, and permanent base tables, which are for persistent data.

                  Temporary Tables

                  Data in TEMPORARY tables is not saved and lasts only for the lifetime of the session. The contents of each TEMP table is visible only from the session that is used to populate it.

                  HyperSQL supports two types of temporary tables.

                  The GLOBAL TEMPORARY type is a schema object. It is created with the CREATE GLOBAL TEMPORARY TABLE statement. The definition of the table persists, and each session has access to the table. But each session sees its own copy of the table, which is empty at the beginning of the session.

                  The LOCAL TEMPORARY type is not a schema object. It is created with the DECLARE LOCAL TEMPORARY TABLE statement. The table definition lasts only for the duration of the session and is not persisted in the database. The table can be declared in the middle of a transaction without committing the transaction.

                  When the session commits, the contents of all temporary tables are cleared by default. If the table definition statements includes ON COMMIT PRESERVE ROWS, then the contents are kept when a commit takes place.

                  The rows in temporary tables are stored in memory by default. If the hsqldb.result_max_memory_rows ( SET SESSION RESULT MEMORY ROWS <row count> ) has been specified, tables with row count above the setting are stored on disk.

                  Persistent Tables

                  HyperSQL supports the Standard definition of persistent base table, but defines three types according to the way the data is stored. These are MEMORY tables, CACHED tables and TEXT tables.

                  Memory tables are the default type when the CREATE TABLE command is used. Their data is held entirely in memory but any change to their structure or contents is written to the *.log and *.script files. The *.script file and the *.log file are read the next time the database is opened, and the MEMORY tables are recreated with all their contents. So unlike TEMPORARY tables, MEMORY tables are persistent. When the database is opened, all the data for the memory tables is read and inserted. This process may take a long time if the database is larger than tens of megabytes. When the database is shutdown, all the data is saved. This can also take a long time.

                  CACHED tables are created with the CREATE CACHED TABLE command. Only part of their data or indexes is held in memory, allowing large tables that would otherwise take up to several hundred megabytes of memory. Another advantage of cached tables is that the database engine takes less time to start up when a cached table is used for large amounts of data. The disadvantage of cached tables is a reduction in speed. Do not use cached tables if your data set is relatively small. In an application with some small tables and some large ones, it is better to use the default, MEMORY mode for the small tables.

                  TEXT tables use a CSV (Comma Separated Value) or other delimited text file as the source of their data. You can specify an existing CSV file, such as a dump from another database or program, as the source of a TEXT table. Alternatively, you can specify an empty file to be filled with data by the database engine. TEXT tables are efficient in memory usage as they cache only part of the text data and all of the indexes. The Text table data source can always be reassigned to a different file if necessary. The commands are needed to set up a TEXT table as detailed in the Text Tables chapter.

                  With all-in-memory databases, both MEMORY table and CACHED table declarations are treated as declarations for non-persistent memory tables. In the latest versions of HyperSQL, TEXT table declarations are allowed in all-in-memory databases.

                  The default type of tables resulting from future CREATE TABLE statements can be specified with the SQL command:

                      SET DATABASE DEFAULT TABLE TYPE { CACHED | MEMORY };

                  The type of an existing table can be changed with the SQL command:

                      SET TABLE <table name> TYPE { CACHED | MEMORY };

                  SQL statements access different types of tables uniformly. No change to statements is needed to access different types of table.

                  Lob Data

                  Lobs are logically stored in columns of tables. Their physical storage is a separate *.lobs file. This file is created as soon as a BLOB or CLOB is inserted into the database. The file will grow as new lobs are inserted into the database. In version 2.x, the *.lobs file is never deleted even if all lobs are deleted from the database (In this case you can delete the .lobs file after a SHUTDOWN).

                  Short Guide to Data Types

                  Most other RDBMS do not conform to the SQL Standard in all areas, but they are gradually moving towards Standard conformance. When switching from another SQL dialect, the following should be considered:

                  • Numeric types TINYINT, SMALLINT, INTEGER and BIGINT are types with fixed binary precision. These types are more efficient to store and retrieve. NUMERIC and DECIMAL are types with user-defined decimal precision. They can be used with zero scale to store very large integers, or with a non-zero scale to store decimal fractions. The DOUBLE type is a 64 bit, approximate floating point types. HyperSQL even allows you to store infinity in this type.

                  • The BOOLEAN type is for logical values and can hold TRUE, FALSE or UNKNOWN. Although HyperSQL allows you to use one and zero in assignment or comparison, you should use the standard values for this type.

                  • Character string types are CHAR(L), VARCHAR(L) and CLOB. CHAR is for fixed width strings and any string that is assigned to this type is padded with spaces at the end. Do not use this type for general storage of strings. If you use CHAR without the length L, then it is interpreted as a single character string. Use VARCHAR(L) for general strings. There are only memory limits and performance implications for the maximum length of VARCHAR(L). If the strings are larger than a few kilobytes, consider using CLOB. The CLOB types is for very large strings. Do not use this type for short strings as there are performance implications. The CLOB type is a better choice for the storage of long strings. By default LONGVARCHAR is a synonym for a long VARCHAR and can be used without specifying the size. You can set LONGVARCHAR to map to CLOB, with the sql.longvar_is_lob connection property or the SET DATABASE SQL LONGVAR IS LOB TRUE statement.

                  • Binary string types are BINARY(L), VARBINARY(L) and BLOB. Do not use BINARY(L) unless you are storing keys such as UUID. This type pads short binary strings with zero bytes. BINARY without the length L means a single byte. Use VARBINARY(L) for general binary strings, and BLOB for large binary objects. You should apply the same considerations as with the character string types. By default LONGVARBINARY is a synonym for a long VARCHAR and can be used without specifying the size. You can set LONGVARBINARY to map to BLOB, with the sql.longvar_is_lob connection property or the SET DATABASE SQL LONGVAR IS LOB TRUE statement.

                  • The BIT(L) and BITVARYING(L) types are for bit maps. Do not use them for other types of data. BIT without the length L argument means a single bit and is sometimes used as a logical type. Use BOOLEAN instead of this type.

                  • The datetime types DATE, TIME and TIMESTAMP, together with their WITH TIME ZONE variations are available. Read the details in this chapter on how to use these types.

                  • The INTERVAL type is very powerful when used together with the datetime types. This is very easy to use, but is supported mainly by "big iron" database systems. Note that functions that add days or months to datetime values are not really a substitute for the INTERVAL type. Expressions such as (datecol - 7 DAY) > CURRENT_DATE are optimised to use indexes when it is possible, while the equivalent function calls are not optimised.

                  • The OTHER type is for storage of Java objects. If your objects are large, serialize them in your application and store them as BLOB in the database.

                  • The ARRAY type supports all base types except LOB and OTHER types. ARRAY data objects are held in memory while being processed. It is therefore not recommended to store more than about a thousand objects in an ARRAY in normal operations with disk based databases. For specialised applications, use ARRAY with as many elements as your memory allocation can support.

                  HyperSQL 2.2.x has several compatibility modes which allow the type names that are used by other RDBMS to be accepted and translated into the closest SQL Standard type. For example the type TEXT, supported by MySQL and PostgreSQL is translated in these compatibility modes.

                  Data Types and Operations

                  HyperSQL supports all the types defined by SQL-92, plus BOOLEAN, BINARY and LOB types that were added later to the SQL Standard. It also supports the non-standard OTHER type to store serializable Java objects.

                  SQL is a strongly typed language. All data stored in specific columns of tables and other objects (such as sequence generators) have specific types. Each data item conforms to the type limits such as precision and scale for the column. It also conforms to any additional integrity constraints that are defined as CHECK constraints in domains or tables. Types can be explicitly converted using the CAST expression, but in most expressions they are converted automatically.

                  Data is returned to the user (or the application program) as a result of executing SQL statements such as query expressions or function calls. All statements are compiled prior to execution and the return type of the data is known after compilation and before execution. Therefore, once a statement is prepared, the data type of each column of the returned result is known, including any precision or scale property. The type does not change when the same query that returned one row, returns many rows as a result of adding more data to the tables.

                  Some SQL functions used within SQL statements are polymorphic, but the exact type of the argument and the return value is determined at compile time.

                  When a statement is prepared, using a JDBC PreparedStatement object, it is compiled by the engine and the type of the columns of its ResultSet and / or its parameters are accessible through the methods of PreparedStatement.

                  Numeric Types

                  TINYINT, SMALLINT, INTEGER, BIGINT, NUMERIC and DECIMAL (without a decimal point) are the supported integral types. They correspond respectively to byte, short, int, long, BigDecimal and BigDecimal Java types in the range of values that they can represent (NUMERIC and DECIMAL are equivalent). The type TINYINT is an HSQLDB extension to the SQL Standard, while the others conform to the Standard definition. The SQL type dictates the maximum and minimum values that can be held in a field of each type. For example the value range for TINYINT is -128 to +127. The bit precision of TINYINT, SMALLINT, INTEGER and BIGINT is respectively 8, 16, 32 and 64. For NUMERIC and DECIMAL, decimal precision is used.

                  DECIMAL and NUMERIC with decimal fractions are mapped to java.math.BigDecimal and can have very large numbers of digits. In HyperSQL the two types are equivalent. These types, together with integral types, are called exact numeric types.

                  In HyperSQL, REAL, FLOAT, DOUBLE are equivalent and all mapped to double in Java. These types are defined by the SQL Standard as approximate numeric types. The bit-precision of all these types is 64 bits.

                  The decimal precision and scale of NUMERIC and DECIMAL types can be optionally defined. For example, DECIMAL(10,2) means maximum total number of digits is 10 and there are always 2 digits after the decimal point, while DECIMAL(10) means 10 digits without a decimal point. The bit-precision of FLOAT can also be defined, but in this case, it is ignored and the default bit-precision of 64 is used. The default precision of NUMERIC and DECIMAL (when not defined) is 100.

                  Note: If a database has been set to ignore type precision limits with the SET DATABASE SQL SIZE FALSE command, then a type definition of DECIMAL with no precision and scale is treated as DECIMAL(100,10). In normal operation, it is treated as DECIMAL(100).

                  Integral Types

                  In expressions, TINYINT, SMALLINT, INTEGER, BIGINT, NUMERIC and DECIMAL (without a decimal point) are fully interchangeable, and no data narrowing takes place.

                  If the SELECT statement refers to a simple column or function, then the return type is the type corresponding to the column or the return type of the function. For example:

                      CREATE TABLE t(a INTEGER, b BIGINT);
                      SELECT MAX(a), MAX(b) FROM t;

                  will return a ResultSet where the type of the first column is java.lang.Integer and the second column is java.lang.Long. However,

                      SELECT MAX(a) + 1, MAX(b) + 1 FROM t;

                  will return java.lang.Long and BigDecimal values, generated as a result of uniform type promotion for all the return values. Note that type promotion to BigDecimal ensures the correct value is returned if MAX(b) evaluates to Long.MAX_VALUE.

                  There is no built-in limit on the size of intermediate integral values in expressions. As a result, you should check for the type of the ResultSet column and choose an appropriate getXXXX() method to retrieve it. Alternatively, you can use the getObject() method, then cast the result to java.lang.Number and use the intValue() or longValue() methods on the result.

                  When the result of an expression is stored in a column of a database table, it has to fit in the target column, otherwise an error is returned. For example when 1234567890123456789012 / 12345687901234567890 is evaluated, the result can be stored in any integral type column, even a TINYINT column, as it is a small value.

                  In SQL Statements, an integer literal is treated as INTEGER, unless its value does not fit. In this case it is treated as BIGINT or DECIMAL, depending on the value.

                  Depending on the types of the operands, the result of the operations is returned in a JDBC ResultSet in any of related Java types: Integer, Long or BigDecimal. The ResultSet.getXXXX() methods can be used to retrieve the values so long as the returned value can be represented by the resulting type. This type is deterministically based on the query, not on the actual rows returned.

                  Other Numeric Types

                  In SQL statements, number literals with a decimal point are treated as DECIMAL unless they are written with an exponent. Thus 0.2 is considered a DECIMAL value but 0.2E0 is considered a DOUBLE value.

                  When an approximate numeric type, REAL, FLOAT or DOUBLE (all synonymous) is part of an expression involving different numeric types, the type of the result is DOUBLE. DECIMAL values can be converted to DOUBLE unless they are beyond the Double.MIN_VALUE - Double.MAX_VALUE range. For example, A * B, A / B, A + B, etc. will return a DOUBLE value if either A or B is a DOUBLE.

                  Otherwise, when no DOUBLE value exists, if a DECIMAL or NUMERIC value is part an expression, the type of the result is DECIMAL or NUMERIC. Similar to integral values, when the result of an expression is assigned to a table column, the value has to fit in the target column, otherwise an error is returned. This means a small, 4 digit value of DECIMAL type can be assigned to a column of SMALLINT or INTEGER, but a value with 15 digits cannot.

                  When a DECIMAL values is multiplied by a DECIMAL or integral type, the resulting scale is the sum of the scales of the two terms. When they are divided, the result is a value with a scale (number of digits to the right of the decimal point) equal to the larger of the scales of the two terms. The precision for both operations is calculated (usually increased) to allow all possible results.

                  The distinction between DOUBLE and DECIMAL is important when a division takes place. For example, 10.0/8.0 (DECIMAL) equals 1.2 but 10.0E0/8.0E0 (DOUBLE) equals 1.25. Without division operations, DECIMAL values represent exact arithmetic.

                  REAL, FLOAT and DOUBLE values are all stored in the database as java.lang.Double objects. Special values such as NaN and +-Infinity are also stored and supported. These values can be submitted to the database via JDBC PreparedStatement methods and are returned in ResultSet objects. In order to allow division by zero of DOUBLE values in SQL statements (which returns NaN or +-Infinity) you should set the property hsqldb.double_nan as false (SET DATABASE SQL DOUBLE NAN FALSE). The double values can be retrieved from a ResultSet in the required type so long as they can be represented. For setting the values, when PreparedStatement.setDouble() or setFloat() is used, the value is treated as a DOUBLE automatically.

                  In short,

                  <numeric type> ::= <exact numeric type> | <approximate numeric type>

                  <exact numeric type> ::= NUMERIC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ] | { DECIMAL | DEC } [ <left paren> <precision> [ <comma> <scale> ] <right paren> ] | SMALLINT | INTEGER | INT | BIGINT

                  <approximate numeric type> ::= FLOAT [ <left paren> <precision> <right paren> ] | REAL | DOUBLE PRECISION

                  <precision> ::= <unsigned integer>

                  <scale> ::= <unsigned integer>

                  Boolean Type

                  The BOOLEAN type conforms to the SQL Standard and represents the values TRUE, FALSE and UNKNOWN. This type of column can be initialised with Java boolean values, or with NULL for the UNKNOWN value.

                  The three-value logic is sometimes misunderstood. For example, x IN (1, 2, NULL) does not return true if x is NULL.

                  In previous versions of HyperSQL, BIT was simply an alias for BOOLEAN. In version 2.0, BIT is a single-bit bit map.

                  <boolean type> ::= BOOLEAN

                  The SQL Standard does not support type conversion to BOOLEAN apart from character strings that consists of boolean literals. Because the BOOLEAN type is relatively new to the Standard, several database products used other types to represent boolean values. For improved compatibility, HyperSQL allows some type conversions to boolean.

                  Values of BIT and BIT VARYING types with length 1 can be converted to BOOLEAN. If the bit is set, the result of conversion is the TRUE value, otherwise it is FALSE.

                  Values of TINYINT, SMALLINT, INTEGER and BIGINT types can be converted to BOOLEAN. If the value is zero, the result is the FALSE value, otherwise it is TRUE.

                  Character String Types

                  The CHARACTER, CHARACTER VARYING and CLOB types are the SQL Standard character string types. CHAR, VARCHAR and CHARACTER LARGE OBJECT are synonyms for these types. HyperSQL also supports LONGVARCHAR as a synonym for VARCHAR. If LONGVARCHAR is used without a length, then a length of 16M is assigned. You can set LONGVARCHAR to map to CLOB, with the sql.longvar_is_lob connection property or the SET DATABASE SQL LONGVAR IS LOB TRUE statement..

                  HyperSQL's default character set is Unicode, therefore all possible character strings can be represented by these types.

                  The SQL Standard behaviour of the CHARACTER type is a remnant of legacy systems in which character strings are padded with spaces to fill a fixed width. These spaces are sometimes significant while in other cases they are silently discarded. It would be best to avoid the CHARACTER type altogether. With the rest of the types, the strings are not padded when assigned to columns or variables of the given type. The trailing spaces are still considered discardable for all character types. Therefore if a string with trailing spaces is too long to assign to a column or variable of a given length, the spaces beyond the type length are discarded and the assignment succeeds (provided all the characters beyond the type length are spaces).

                  The VARCHAR and CLOB types have length limits, but the strings are not padded by the system. Note that if you use a large length for a VARCHAR or CLOB type, no extra space is used in the database. The space used for each stored item is proportional to its actual length.

                  If CHARACTER is used without specifying the length, the length defaults to 1. For the CLOB type, the length limit can be defined in units of kilobyte (K, 1024), megabyte (M, 1024 * 1024) or gigabyte (G, 1024 * 1024 * 1024), using the <multiplier>. If CLOB is used without specifying the length, the length defaults to 16M.

                  <character string type> ::= { CHARACTER | CHAR } [ <left paren> <character length> <right paren> ] | { CHARACTER VARYING | CHAR VARYING | VARCHAR } <left paren> <character length> <right paren> | LONGVARCHAR [ <left paren> <character length> <right paren> ] | <character large object type>

                  <character large object type> ::= { CHARACTER LARGE OBJECT | CHAR LARGE OBJECT | CLOB } [ <left paren> <character large object length> <right paren> ]

                  <character length> ::= <unsigned integer> [ <char length units> ]

                  <large object length> ::= <length> [ <multiplier> ] | <large object length token>

                  <character large object length> ::= <large object length> [ <char length units> ]

                  <large object length token> ::= <digit>... <multiplier>

                  <multiplier> ::= K | M | G

                  <char length units> ::= CHARACTERS | OCTETS

                  CHAR(10)
                  CHARACTER(10)
                  VARCHAR(2)
                  CHAR VARYING(2)
                  CLOB(1000)
                  CLOB(30K)
                  CHARACTER LARGE OBJECT(1M)
                  LONGVARCHAR
                  

                  Binary String Types

                  The BINARY, BINARY VARYING and BLOB types are the SQL Standard binary string types. VARBINARY and BINARY LARGE OBJECT are synonyms for BINARY VARYING and BLOB types. HyperSQL also supports LONGVARBINARY as a synonym for VARBINARY. You can set LONGVARBINARY to map to BLOB, with the sql.longvar_is_lob connection property or the SET DATABASE SQL LONGVAR IS LOB TRUE statement.

                  Binary string types are used in a similar way to character string types. There are several built-in functions that are overloaded to support character, binary and bit strings.

                  The BINARY type represents a fixed width-string. Each shorter string is padded with zeros to fill the fixed width. Similar to the CHARACTER type, the trailing zeros in the BINARY string are simply discarded in some operations. For the same reason, it is best to avoid this particular type and use VARBINARY instead.

                  When two binary values are compared, if one is of BINARY type, then zero padding is performed to extend the length of the shorter string to the longer one before comparison. No padding is performed with other binary types. If the bytes compare equal to the end of the shorter value, then the longer string is considered larger than the shorter string.

                  If BINARY is used without specifying the length, the length defaults to 1. For the BLOB type, the length limit can be defined in units of kilobyte (K, 1024), megabyte (M, 1024 * 1024) or gigabyte (G, 1024 * 1024 * 1024), using the <multiplier>. If BLOB is used without specifying the length, the length defaults to 16M.

                  <binary string type> ::= BINARY [ <left paren> <length> <right paren> ] | { BINARY VARYING | VARBINARY } <left paren> <length> <right paren> | LONGVARBINARY [ <left paren> <length> <right paren> ] | <binary large object string type>

                  <binary large object string type> ::= { BINARY LARGE OBJECT | BLOB } [ <left paren> <large object length> <right paren> ]

                  <length> ::= <unsigned integer>

                  BINARY(10)
                  VARBINARY(2)
                  BINARY VARYING(2)
                  BLOB(1000)
                  BLOB(30K)
                  BINARY LARGE OBJECT(1M)
                  LONGVARBINARY
                  

                  Bit String Types

                  The BIT and BIT VARYING types are the supported bit string types. These types were defined by SQL:1999 but were later removed from the Standard. Bit types represent bit maps of given lengths. Each bit is 0 or 1. The BIT type represents a fixed width-string. Each shorter string is padded with zeros to fill the fixed with. If BIT is used without specifying the length, the length defaults to 1. The BIT VARYING type has a maximum width and shorter strings are not padded.

                  Before the introduction of the BOOLEAN type to the SQL Standard, a single-bit string of the type BIT(1) was commonly used. For compatibility with other products that do not conform to, or extend, the SQL Standard, HyperSQL allows values of BIT and BIT VARYING types with length 1 to be converted to and from the BOOLEAN type. BOOLEAN TRUE is considered equal to B'1', BOOLEAN FALSE is considered equal to B'0'.

                  For the same reason, numeric values can be assigned to columns and variables of the type BIT(1). For assignment, the numeric value zero is converted to B'0', while all other values are converted to B'1'. For comparison, numeric values 1 is considered equal to B'1' and numeric value zero is considered equal to B'0'.

                  It is not allowed to perform other arithmetic or boolean operations involving BIT(1) and BIT VARYING(1). The kid of operations allowed on bit strings are analogous to those allowed on BINARY and CHARACTER strings. Several built-in functions support all three types of string.

                  <bit string type> ::= BIT [ <left paren> <length> <right paren> ] | BIT VARYING <left paren> <length> <right paren>

                  BIT
                  BIT(10)
                  BIT VARYING(2)
                  

                  Storage and Handling of Java Objects

                  Any serializable JAVA Object can be inserted directly into a column of type OTHER using any variation of PreparedStatement.setObject() methods.

                  For comparison purposes and in indexes, any two Java Objects are considered equal unless one of them is NULL. You cannot search for a specific object or perform a join on a column of type OTHER.

                  Please note that HSQLDB is not an object-relational database. Java Objects can simply be stored internally and no operations should be performed on them other than assignment between columns of type OTHER or tests for NULL. Tests such as WHERE object1 = object2 do not mean what you might expect, as any non-null object would satisfy such a tests. But WHERE object1 IS NOT NULL is perfectly acceptable.

                  The engine does not allow normal column values to be assigned to Java Object columns (for example, assigning an INTEGER or STRING to such a column with an SQL statement such as UPDATE mytable SET objectcol = intcol WHERE ...).

                  <java object type> ::= OTHER

                  Type Length, Precision and Scale

                  In older version of HyperSQL, all table column type definitions with a column length, precision or scale qualifier were accepted and ignored. HSQLDB 1.8 enforced correctness but included an option to enforce the length, precision or scale.

                  In HyperSQL 2.0, length, precision and scale qualifiers are always enforced. For backward compatibility, when older databases which had the property hsqldb.enforce_strict_size=false are converted to version 2.0, this property is retained. However, this is a temporary measure. You should test your application to ensure the length, precision and scale that is used for column definitions is appropriate for the application data. You can test with the default database setting, which enforces the sizes.

                  String types, including all BIT, BINARY and CHAR string types plus CLOB and BLOB, are generally defined with a length. If no length is specified for BIT, BINARY and CHAR, the default length is 1. For CLOB and BLOB an implementation defined length of 1M is used.

                  TIME and TIMESTAMP types can be defined with a fractional second precision between 0 and 9. INTERVAL type definition may have precision and, in some cases, fraction second precision. DECIMAL and NUMERIC types may be defined with precision and scale. For all of these types a default precision or scale value is used if one is not specified. The default scale is 0. The default fractional precision for TIME is 0, while it is 6 for TIMESTAMP.

                  Values can be converted from one type to another in two different ways: by using explicit CAST expression or by implicit conversion used in assignment, comparison and aggregation.

                  String values cannot be assigned to VARCHAR columns if they are longer than the defined type length. For CHARACTER columns, a long string can be assigned (with truncation) only if all the characters after the length are spaces. Shorter strings are padded with the space character when inserted into a CHARACTER column. Similar rules are applied to VARBINARY and BINARY columns. For BINARY columns, the padding and truncation rules are applied with zero bytes, instead of spaces.

                  Explicit CAST of a value to a CHARACTER or VARCHAR type will result in forced truncation or padding. So a test such as CAST (mycol AS VARCHAR(2)) = 'xy' will find the values beginning with 'xy'. This is the equivalent of SUBSTRING(mycol FROM 1 FOR 2)= 'xy'.

                  For all numeric types, the rules of explicit cast and implicit conversion are the same. If cast or conversion causes any digits to be lost from the fractional part, it can take place. If the non-fractional part of the value cannot be represented in the new type, cast or conversion cannot take place and will result in a data exception.

                  There are special rules for DATE, TIME, TIMESTAMP and INTERVAL casts and conversions.

                  Datetime types

                  HSQLDB fully supports datetime and interval types and operations, including all relevant optional features, as specified by the SQL Standard since SQL-92. The two groups of types are complementary.

                  The DATE type represents a calendar date with YEAR, MONTH and DAY fields.

                  The TIME type represents time of day with HOUR, MINUTE and SECOND fields, plus an optional SECOND FRACTION field.

                  The TIMESTAMP type represents the combination of DATE and TIME types.

                  TIME and TIMESTAMP types can include WITH TIME ZONE or WITHOUT TIME ZONE (the default) qualifiers. They can have fractional second parts. For example, TIME(6) has six fractional digits for the second field.

                  If fractional second precision is not specified, it defaults to 0 for TIME and to 6 for TIMESTAMP.

                  <datetime type> ::= DATE | TIME [ <left paren> <time precision> <right paren> ] [ <with or without time zone> ] | TIMESTAMP [ <left paren> <timestamp precision> <right paren> ] [ <with or without time zone> ]

                  <with or without time zone> ::= WITH TIME ZONE | WITHOUT TIME ZONE

                  <time precision> ::= <time fractional seconds precision>

                  <timestamp precision> ::= <time fractional seconds precision>

                  <time fractional seconds precision> ::= <unsigned integer>

                  DATE
                  TIME(6)
                  TIMESTAMP(2) WITH TIME ZONE
                  

                  Examples of the string literals used to represent date time values, some with time zone, some without, are below:

                  DATE '2008-08-22'
                  TIMESTAMP '2008-08-08 20:08:08'
                  TIMESTAMP '2008-08-08 20:08:08+8:00' /* Beijing */
                  TIME '20:08:08.034900'
                  TIME '20:08:08.034900-8:00' /* US Pacific */

                  Time Zone

                  DATE values do not take time zones. For example United Nations designates 5 June as World Environment Day, which was observed on DATE '2008-06-05' in different time zones.

                  TIME and TIMESTAMP values without time zone, usually have a context that indicates some local time zone. For example, a database for college course timetables usually stores class dates and times without time zones. This works because the location of the college is fixed and the time zone displacement is the same for all the values. Even when the events take place in different time zones, for example international flight times, it is possible to store all the datetime information as references to a single time zone, usually GMT. For some databases it may be useful to store the time zone displacement together with each datetime value. SQL’s TIME WITH TIME ZONE and TIMESTAMP WITH TIME ZONE values include a time zone displacement value.

                  The time zone displacement is of the type INTERVAL HOUR TO MINUTE. This data type is described in the next section. The legal values are between '–14:00' and   '+14:00'.

                  Operations on Datetime Types

                  The expression <datetime expression> AT TIME ZONE <time displacement> evaluates to a datetime value representing exactly the same point of time in the specified <time displacement>. The expression, AT LOCAL is equivalent to AT TIME ZONE <local time displacement>. If AT TIME ZONE is used with a datetime operand of type WITHOUT TIME ZONE, the operand is first converted to a value of type WITH TIME ZONE at the session’s time displacement, then the specified time zone displacement is set for the value. Therefore, in these cases, the final value depends on the time zone of the session in which the statement was used.

                  AT TIME ZONE, modifies the field values of the datetime operand. This is done by the following procedure:

                  1. determine the corresponding datetime at UTC.

                  2. find the datetime value at the given time zone that corresponds with the UTC value from step 1.

                  Example a:

                  TIME '12:00:00' AT TIME ZONE INTERVAL '1:00' HOUR TO MINUTE
                  

                  If the session’s time zone displacement is -'8:00', then in step 1, TIME '12:00:00' is converted to UTC, which is TIME '20:00:00+0:00'. In step 2, this value is expressed as TIME '21:00:00+1:00'.

                  Example b:

                  TIME '12:00:00-5:00' AT TIME ZONE INTERVAL '1:00' HOUR TO MINUTE
                  

                  Because the operand has a time zone, the result is independent of the session  time zone displacement. Step 1 results in TIME '17:00:00+0:00', and step 2 results in TIME '18:00:00+1:00'

                  Note that the operand is not limited to datetime literals used in these examples. Any valid expression that evaluates to a datetime value can be the operand.

                  Type Conversion

                  CAST is used to for all other conversions. Examples:

                  CAST (<value> AS TIME WITHOUT TIME ZONE)
                  CAST (<value> AS TIME WITH TIME ZONE)

                  In the first example, if <value> has a time zone component, it is simply dropped. For example TIME '12:00:00-5:00' is converted to TIME '12:00:00'

                  In the second example, if <value> has no time zone component, the current time zone displacement of the session is added. For example TIME '12:00:00' is converted to TIME '12:00:00-8:00' when the session time zone displacement is '-8:00'.

                  Conversion between DATE and TIMESTAMP is performed by removing the TIME component of a TIMESTAMP value or by setting the hour, minute and second fields to zero. TIMESTAMP '2008-08-08 20:08:08+8:00' becomes DATE '2008-08-08', while DATE '2008-08-22' becomes TIMESTAMP '2008-08-22 00:00:00'.

                  Conversion between TIME and TIMESTAMP is performed by removing the DATE field values of a TIMESTAMP value or by appending the fields of the TIME value to the fields of the current session date value.

                  Assignment

                  When a value is assigned to a datetime target, e.g., a value is used to update a row of a table, the type of the value must be the same as the target, but the WITH TIME ZONE or WITHOUT TIME ZONE characteristics can be different. If the types are not the same, an explicit CAST must be used to convert the value into the target type.

                  Comparison

                  When values WITH TIME ZONE are compared, they are converted to UTC values before comparison. If a value WITH TIME ZONE is compared to another WITHOUT TIME ZONE, then the WITH TIME ZONE value is converted to AT LOCAL, then converted to WITHOUT TIME ZONE before comparison.

                  It is not recommended to design applications that rely on comparisons and conversions between TIME values WITH TIME ZONE. The conversions may involve normalisation of the time value, resulting in unexpected results. For example, the expression: BETWEEN(TIME '12:00:00-8:00', TIME '22:00:00-8:00') is converted to BETWEEN(TIME '20:00:00+0:00', TIME '06:00:00+0:00') when it is evaluated in the UTC zone, which is always FALSE.

                  Functions

                  Several functions return the current session timestamp in different datetime types:

                  CURRENT_DATE

                  DATE

                  CURRENT_TIME

                  TIME WITH TIME ZONE

                  CURRENT_TIMESTAMP

                  TIMESTAMP WITH TIME ZONE

                  LOCALTIME

                  TIMESTAMP WITHOUT TIME ZONE

                  LOCALTIMESTAMP

                  TIMESTAMP WITHOUT TIME ZONE

                  Session Time Zone Displacement

                  When an SQL session is started (with a JDBC connection) the local time zone of the client JVM (including any seasonal time adjustments such as daylight saving time) is used as the session time zone displacement. Note that the SQL session time displacement is not changed when a seasonal time adjustment takes place while the session is open. To change the SQL session time zone displacement use the following commands:

                  SET TIME ZONE <time displacement>

                  SET TIME ZONE LOCAL

                  The first command sets the displacement to the given value. The second command restores the original, real time zone displacement of the session.

                  Datetime Values and Java

                  When datetime values are sent to the database using the PreparedStatement or CallableStatement interfaces, the Java object is converted to the type of the prepared or callable statement parameter. This type may be DATE, TIME, or TIMESTAMP (with or without time zone). The time zone displacement is the time zone of the JDBC session.

                  When datetime values are retrieved from the database using the ResultSet interface, there are two representations. The getString(…) methods of the ResultSet interface, return an exact representation of the value in the SQL type as it is stored in the database. This includes the correct number of digits for the fractional second field, and for values with time zone displacement, the time zone displacement. Therefore if TIME '12:00:00' is stored in the database, all users in different time zones will get '12:00:00' when they retrieve the value as a string. The getTime(…) and getTimestamp(…) methods of the ResultSet interface return Java objects that are corrected for the session time zone. The UTC millisecond value contained the java.sql.Time or java.sql.Timestamp objects will be adjusted to the time zone of the session, therefore the toString() method of these objects return the same values in different time zones.

                  If you want to store and retrieve UTC values that are independent of any session's time zone, you can use a TIMESTAMP WITH TIME ZONE column. The setTime(...) and setTimestamp(...) methods of the PreparedStatement interface which have a Calendar parameter can be used to assign the values. The time zone of the given Calendar argument is used as the time zone. Conversely, the getTime(...) and getTimestamp(...) methods of the ResultSet interface which have a Calendar parameter can be used with a Calendar argument to retrieve the values.

                  JDBC has an unfortunate limitation and does not include type codes for SQL datetime types that have a TIME ZONE property. Therefore, for compatibility with database tools that are limited to the JDBC type codes, HyperSQL reports these types by default as datetime types without TIME ZONE. You can use the URL property hsqldb.translate_dti_types=false to override the default behaviour.

                  Interval Types

                  Interval types are used to represent differences between date time values. The difference between two date time values can be measured in seconds or in months. For measurements in months, the units YEAR and MONTH are available, while for measurements in seconds, the units DAY, HOUR, MINUTE, SECOND are available. The units can be used individually, or as a range. An interval type can specify the precision of the most significant field and the second fraction digits of the SECOND field (if it has a SECOND field). The default precision is 2. The default second precision is 0.

                  <interval type> ::= INTERVAL <interval qualifier>

                  <interval qualifier> ::= <start field> TO <end field> | <single datetime field>

                  <start field> ::= <non-second primary datetime field> [ <left paren> <interval leading field precision> <right paren> ]

                  <end field> ::= <non-second primary datetime field> | SECOND [ <left paren> <interval fractional seconds precision> <right paren> ]

                  <single datetime field> ::= <non-second primary datetime field> [ <left paren> <interval leading field precision> <right paren> ] | SECOND [ <left paren> <interval leading field precision> [ <comma> <interval fractional seconds precision> ] <right paren> ]

                  <primary datetime field> ::= <non-second primary datetime field> | SECOND

                  <non-second primary datetime field> ::= YEAR | MONTH | DAY | HOUR | MINUTE

                  <interval fractional seconds precision> ::= <unsigned integer>

                  <interval leading field precision> ::= <unsigned integer>

                  Examples of INTERVAL type definition:

                  INTERVAL YEAR TO MONTH
                  INTERVAL YEAR(3)
                  INTERVAL DAY(4) TO HOUR
                  INTERVAL MINUTE(4) TO SECOND(6)
                  INTERVAL SECOND(4,6)
                  

                  The word INTERVAL indicates the general type name. The rest of the definition is called an <interval qualifier>. This designation is important, as in most expressions <interval qualifier> is used without the word INTERVAL.

                  Interval Values

                  An interval value can be negative, positive or zero. An interval type has all the datetime fields in the specified range. These fields are similar to those in the TIMESTAMP type. The differences are as follows:

                  The first field of an interval value can hold any numeric value up to the specified precision. For example, the hour field in HOUR(2) TO SECOND can hold values above 23 (up to 99). The year and month fields can hold zero (unlike a TIMESTAMP value) and the maximum value of a month field that is not the most significant field, is 11.

                  The standard function ABS(<interval value expression>) can be used to convert a negative interval value to a positive one.

                  The literal representation of interval values consists of the type definition, with a string representing the interval value inserted after the word INTERVAL. Some examples of interval literal below:

                  INTERVAL '145 23:12:19.345' DAY(3) TO SECOND(3)
                  INTERVAL '3503:12:19.345' HOUR TO SECOND(3) /* equal to the first value */
                  INTERVAL '19.345' SECOND(4,3) /* maximum number of digits for the second value is 4, and each value is expressed with three fraction digits. */
                  INTERVAL '-23-10' YEAR(2) TO MONTH
                  

                  Interval values of the types that are based on seconds can be cast into one another. Similarly those that are based on months can be cast into one another. It is not possible to cast or convert a value based on seconds to one based on months, or vice versa.

                  When a cast is performed to a type with a smaller least-significant field, nothing is lost from the interval value. Otherwise, the values for the missing least-significant fields are discarded. Examples:

                  CAST ( INTERVAL '145 23:12:19' DAY TO SECOND AS INTERVAL DAY TO HOUR ) = INTERVAL '145 23' DAY TO HOUR
                  CAST(INTERVAL '145 23' DAY TO HOUR AS INTERVAL DAY TO SECOND) = INTERVAL '145 23:00:00' DAY TO SECOND
                  

                  A numeric value can be cast to an interval type. In this case the numeric value is first converted to a single-field INTERVAL type with the same field as the least significant field of the target interval type. This value is then converted to the target interval type For example CAST( 22 AS INTERVAL YEAR TO MONTH) evaluates to INTERVAL '22' MONTH and then INTERVAL '1 10' YEAR TO MONTH. Note that SQL Standard only supports casts to single-field INTERVAL types, while HyperSQL allows casting to multi-field types as well.

                  An interval value can be cast to a numeric type. In this case the interval value is first converted to a single-field INTERVAL type with the same field as the least significant filed of the interval value. The value is then converted to the target type. For example CAST (INTERVAL '1-11' YEAR TO MONTH AS INT) evaluates to INTERVAL '23' MONTH, and then 23.

                  An interval value can be cast into a character type, which results in an INTERVAL literal. A character value can be cast into an INTERVAL type so long as it is a string with a format compatible with an INTERVAL literal.

                  Two interval values can be added or subtracted so long as the types of both are based on the same field, i.e., both are based on MONTH or SECOND. The values are both converted to a single-field interval type with same field as the least-significant field between the two types. After addition or subtraction, the result is converted to an interval type that contains all the fields of the two original types.

                  An interval value can be multiplied or divided by a numeric value. Again, the value is converted to a numeric, which is then multiplied or divided, before converting back to the original interval type.

                  An interval value is negated by simply prefixing with the minus sign.

                  Interval values used in expressions are either typed values, including interval literals, or are interval casts. The expression: <expression> <interval qualifier> is a cast of the result of the <expression> into the INTERVAL type specified by the <interval qualifier>. The cast can be formed by adding the keywords and parentheses as follows: CAST ( <expression> AS INTERVAL <interval qualifier> ).

                  The examples below feature different forms of expression that represent an interval value, which is then added to the given date literal.

                  DATE '2000-01-01' + INTERVAL '1-10' YEAR TO MONTH /* interval literal */
                  DATE '2000-01-01' + '1-10' YEAR TO MONTH /* the string '1-10' is cast into INTERVAL YEAR TO MONTH */
                  DATE '2000-01-01' + 22 MONTH /* the integer 22 is cast into INTERVAL MONTH, same value as above */
                  DATE '2000-01-01' - 22 DAY /* the integer 22 is cast into INTERVAL DAY */
                  DATE '2000-01-01' + COL2 /* the type of COL2 must be an INTERVAL type */
                  DATE '2000-01-01' + COL2 MONTH /* COL2 may be a number, it is cast into a MONTH interval */
                  

                  Datetime and Interval Operations

                  An interval can be added to or subtracted from a datetime value so long as they have some fields in common. For example, an INTERVAL MONTH cannot be added to a TIME value, while an INTERVAL HOUR TO SECOND can. The interval is first converted to a numeric value, then the value is added to, or subtracted from, the corresponding field of the datetime value.

                  If the result of addition or subtraction is beyond the permissible range for the field, the field value is normalised and carried over to the next significant field until all the fields are normalised. For example, adding 20 minutes to TIME '23:50:10' will result successively in '23:70:10', '24:10:10' and finally TIME '00:10:10'. Subtracting 20 minutes from the result is performed as follows: '00:-10:10', '-1:50:10', finally TIME '23:50:10'. Note that if DATE or TIMESTAMP normalisation results in the YEAR field value out of the range (1,1000), then an exception condition is raised.

                  If an interval value based on MONTH is added to, or subtracted from a DATE or TIMESTAMP value, the result may have an invalid day (30 or 31) for the given result month. In this case an exception condition is raised.

                  The result of subtraction of two datetime expressions is an interval value. The two datetime expressions must be of the same type. The type of the interval value must be specified in the expression, using only the interval field names. The two datetime expressions are enclosed in parentheses, followed by the <interval qualifier> fields. In the first example below, COL1 and COL2 are of the same datetime type, and the result is evaluated in INTERVAL YEAR TO MONTH type.

                  (COL1 – COL2) YEAR TO MONTH /* the difference between two DATE or two TIEMSTAMP values in years and months */
                  (CURRENT_DATE – COL3) DAY /* the number of days between the value of COL3 and the current date */
                  (CURRENT_DATE - DATE '2000-01-01') YEAR TO MONTH /* the number of years and months since the beginning of this century */
                  CURRENT_DATE - 2 DAY /* the date of the day before yesterday */
                  (CURRENT_TIMESTAMP - TIMESTAMP '2009-01-01 00:00:00') DAY(4) TO SECOND(2) /* days to seconds since the given date */
                  

                  The individual fields of both datetime and interval values can be extracted using the EXTRACT function. The same function can also be used to extract the time zone displacement fields of a datetime value.

                  EXTRACT ({YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | TIMEZONE_HOUR | TIMEZONE_MINUTE | DAY_OF_WEEK | WEEK_OF_YEAR } FROM {<datetime value> | <interval value>})

                  The dichotomy between interval types based on seconds, and those based on months, stems from the fact that the different calendar months have different numbers of days. For example, the expression, “nine months and nine days since an event” is not exact when the date of the event is unknown. It can represent a period of around 284 days give or take one. SQL interval values are independent of any start or end dates or times. However, when they are added to or subtracted from certain date or timestamp values, the result may be invalid and cause an exception (e.g. adding one month to January 30 results in February 30, which is invalid).

                  JDBC has an unfortunate limitation and does not include type codes for SQL INTERVAL types. Therefore, for compatibility with database tools that are limited to the JDBC type codes, HyperSQL reports these types by default as VARCHAR. You can use the URL property hsqldb.translate_dti_types=false to override the default behaviour.

                  Arrays

                  Array are a powerful feature of SQL:2008 and can help solve many common problems. Arrays should not be used as a substitute for tables.

                  HyperSQL supports arrays of values according to the SQL:2008 Standard.

                  Elements of the array are either NULL, or of the same data type. It is possible to define arrays of all supported types, including the types covered in this chapter and user defined types, except LOB types. An SQL array is one dimensional and is addressed from position 1. An empty array can also be used, which has no element.

                  Arrays can be stored in the database, as well as being used as temporary containers of values for simplifying SQL statements. They facilitate data exchange between the SQL engine and the user's application.

                  The full range of supported syntax allows array to be created, used in SELECT or other statements, combined with rows of tables and used in routine calls.

                  Array Definition

                  The type of a table column, a routine parameter, a variable, or the return value of a function can be defined as an array.

                  <array type> ::= <data type> ARRAY [ <left bracket or trigraph> <maximum cardinality> <right bracket or trigraph> ]

                  The word ARRAY is added to any valid type definition except BLOB and CLOB type definitions. If the optional <maximum cardinality> is not used, the default value is 1024. The size of the array cannot be extended beyond maximum cardinality.

                  In the example below, the table contains a column of integer arrays and a column of varchar arrays. The VARCHAR array has an explicit maximum size of 10, which means each array can have between 0 and 10 elements. The INTEGER array has the default maximum size of 1024. The scores column has a default clause with an empty array. The default clause can be defined only as DEFAULT NULL or DEFAULT ARRAY[] and does not allow arrays containing elements.

                  CREATE TABLE t (id INT PRIMARY KEY, scores INT ARRAY DEFAULT ARRAY[], names VARCHAR(20) ARRAY[10])

                  An array can be constructed from value expressions or a query expression.

                  <array value constructor by enumeration> ::= ARRAY <left bracket or trigraph> <array element list> <right bracket or trigraph>

                  <array element list> ::= <value expression> [ { <comma> <value expression> }... ]

                  <array value constructor by query> ::= ARRAY <left paren> <query expression> [ <order by clause> ] <right paren>

                  In the examples below, arrays are constructed from values, column references or variables, function calls, or query expressions.

                  ARRAY [ 1, 2, 3 ]
                  ARRAY [ 'HOT', 'COLD' ]
                  ARRAY [ var1, var2, CURRENT_DATE ]
                  ARRAY (SELECT lastname FROM namestable ORDER BY id)
                  

                  Inserting and updating a table with an ARRAY column can use array constructors, not only for updated column values, but also in equality search conditions:

                  INSERT INTO t VALUES 10, ARRAY[1,2,3], ARRAY['HOT', 'COLD']
                  UPDATE t SET names = ARRAY['LARGE', 'SMALL'] WHERE id = 12
                  UPDATE t SET names = ARRAY['LARGE', 'SMALL'] WHERE id < 12 AND scores = ARRAY[3,4]
                  

                  When using a PreparedStatement with an ARRAY parameter, an object of the type java.sql.Array must be used to set the parameter. The org.hsqldb.jdbc.JDBCArrayBasic class can be used for constructing a java.sql.Array object in the user's application. Code fragment below:

                      String sql = "UPDATE t SET names = ? WHERE id = ?";
                      PreparedStatement ps = connection.prepareStatement(sql)
                      Object[] data = new Object[]{"one", "two"};
                      // default types defined in org.hsqldb.types.Type can be used
                      org.hsqldb.types.Type type = org.hsqldb.types.Type.SQL_VARCHAR_DEFAULT;
                      JDBCArrayBasic array = new JDBCArrayBasic(data, type);
                      ps.setArray(1, array);
                      ps.setInt(2, 1000);
                      ps.executeUpdate();
                  

                  Array Reference

                  The most common operations on an array are element reference and assignment, which are used when reading or writing an element of the array. Unlike Java and many other languages, arrays are extended if an element is assigned to an index beyond the current length. This can result in gaps containing NULL elements. Array length cannot exceed the maximum cardinality.

                  Elements of all arrays, including those that are the result of function calls or other operations can be referenced for reading.

                  <array element reference> ::= <array value expression> <left bracket> <numeric value expression> <right bracket>

                  Elements of arrays that are table columns or routine variables can be referenced for writing. This is done in a SET statement, either inside an UPDATE statement, or as a separate statement in the case of routine variables, OUT and INOUT parameters.

                  <target array element specification> ::= <target array reference> <left bracket or trigraph> <simple value specification> <right bracket or trigraph>

                  <target array reference> ::= <SQL parameter reference> | <column reference>

                  Note that only simple values or variables are allowed for the array index when an assignment is performed. The examples below demonstrates how elements of the array are referenced in SELECT and an UPDATE statement.

                  SELECT scores[ranking], names[ranking] FROM t JOIN t1 on (t.id = t1.tid)
                  UPDATE t SET scores[2] = 123, names[2] = 'Reds' WHERE id = 10
                  

                  Array Operations

                  Several SQL operations and functions can be used with arrays.

                  CONCATENATION

                  Array concatenation is performed similar to string concatenation. All elements of the array on the right are appended to the array on left.

                  <array concatenation> ::= <array value expression 1> <concatenation operator> <array value expression 2>

                  <concatenation operator> ::= ||

                  FUNCTIONS

                  Four functions operate on arrays. Details are described in the Built In Functions chapter.

                  CARDINALITY <left paren> <array value expression> <right paren>

                  MAX_CARDINALITY <left paren> <array value expression> <right paren>

                  Array cardinality and max cardinality are functions that return an integer. CARDINALITY returns the element count, while MAX_CARDINALITY returns the maximum declared cardinality of an array.

                  TRIM_ARRAY <left paren> <array value expression> <comma> <numeric value expression> <right paren>

                  The TRIM_ARRAY function returns a copy of an array with the specified number of elements removed from the end of the array. The <array value expression> can be any expression that evaluates to an array.

                  ARRAY_SORT <left paren> <array value expression> <right paren>

                  The ARRAY_SORT function returns a sorted copy of an array. NULL elements appear at the beginning of the new array. This function is a HyperSQL extension and not part of the SQL Standard.

                  CAST

                  An array can be cast into an array of a different type. Each element of the array is cast into the element type of the target array type.

                  UNNEST

                  Arrays can be converted into table references with the UNNEST keyword.

                  UNNEST(<array value expression>) [ WITH ORDINALITY ]

                  The <array value expression> can be any expression that evaluates to an array. A table is returned that contains one column when WITH ORDINALITY is not used, or two columns when WITH ORDINALITY is used. The first column contains the elements of the array (including all the nulls). When the table has two columns, the second column contains the ordinal position of the element in the array. When UNNEST is used in the FROM clause of a query, it implies the LATERAL keyword, which means the array that is converted to table can belong to any table that precedes the UNNEST in the FROM clause. This is explained in the Data Access and Change chapter.

                  COMPARISON

                  Arrays can be compared for equality, but they cannot be compared for ordering or ranges. Array expressions are therefore not allowed in an ORDER BY clause, or in a comparison expression such as GREATER THAN. Two arrays are equal if they have the same length and the values at each index position are either equal or both NULL.

                  USER DEFINED FUNCTIONS and PROCEDURES

                  Array parameters, variables and return values can be specified in user defined functions and procedures, including aggregate functions. An aggregate function can return an array that contains all the scalar values that have been aggregated. These capabilities allow a wider range of applications to be covered by user defined functions and easier data exchange between the engine and the user's application.

                  Indexes and Query Speed

                  HyperSQL supports PRIMARY KEY, UNIQUE and FOREIGN KEY constraints, which can span multiple columns.

                  The engine creates indexes internally to support PRIMARY KEY, UNIQUE and FOREIGN KEY constraints: a unique index is created for each PRIMARY KEY or UNIQUE constraint; an ordinary index is created for each FOREIGN KEY constraint.

                  HyperSQL allows defining indexes on single or multiple columns. You should not create duplicate user-defined indexes on the same column sets covered by constraints. This would result in unnecessary memory and speed overheads. See the discussion in the Deployment Guide chapter for more information.

                  Indexes are crucial for adequate query speed. When range or equality conditions are used e.g. SELECT ... WHERE acol > 10 AND bcol = 0, an index should exist on one of the columns that has a condition. In this example, the bcol column is the best candidate. HyperSQL always uses the best condition and index. If there are two indexes, one on acol, and another on bcol, it will choose the index on bcol.

                  Queries always return results whether indexes exist or not, but they return much faster when an index exists. As a rule of thumb, HSQLDB is capable of internal processing of queries at over 100,000 rows per second. Any query that runs into several seconds is clearly accessing thousands of rows. The query should be checked and indexes should be added to the relevant columns of the tables if necessary. The EXPLAIN PLAN FOR <query> statement can be used to see which indexes are used to process the query.

                  When executing a DELETE or UPDATE statement, the engine needs to find the rows that are to be deleted or updated. If there is an index on one of the columns in the WHERE clause, it is often possible to start directly from the first candidate row. Otherwise all the rows of the table have to be examined.

                  Indexes are even more important in joins between multiple tables. SELECT ... FROM t1 JOIN t2 ON t1.c1 = t2.c2 is performed by taking rows of t1 one by one and finding a matching row in t2. If there is no index on t2.c2 then for each row of t1, all the rows of t2 must be checked. Whereas with an index, a matching row can be found in a fraction of the time. If the query also has a condition on t1, e.g., SELECT ... FROM t1 JOIN t2 ON t1.c1 = t2.c2 WHERE t1.c3 = 4 then an index on t1.c3 would eliminate the need for checking all the rows of t1 one by one, and will reduce query time to less than a millisecond per returned row. So if t1 and t2 each contain 10,000 rows, the query without indexes involves checking 100,000,000 row combinations. With an index on t2.c2, this is reduced to 10,000 row checks and index lookups. With the additional index on t2.c2, only about 4 rows are checked to get the first result row.

                  Note that in HSQLDB an index on multiple columns can be used internally as a non-unique index on the first column in the list. For example: CONSTRAINT name1 UNIQUE (c1, c2, c3); means there is the equivalent of CREATE INDEX name2 ON atable(c1);. So you do not need to specify an extra index if you require one on the first column of the list.

                  In HyperSQL 2.0, a multi-column index will speed up queries that contain joins or values on the first n columns of the index. You need NOT declare additional individual indexes on those columns unless you use queries that search only on a subset of the columns. For example, rows of a table that has a PRIMARY KEY or UNIQUE constraint on three columns or simply an ordinary index on those columns can be found efficiently when values for all three columns, or the first two columns, or the first column, are specified in the WHERE clause. For example, SELECT ... FROM t1 WHERE t1.c1 = 4 AND t1.c2 = 6 AND t1.c3 = 8 will use an index on t1(c1,c2,c3) if it exists.

                  A multi-column index will not speed up queries on the second or third column only. The first column must be specified in the JOIN .. ON or WHERE conditions.

                  Sometimes query speed depends on the order of the tables in the JOIN .. ON or FROM clauses. For example the second query below should be faster with large tables (provided there is an index on TB.COL3). The reason is that TB.COL3 can be evaluated very quickly if it applies to the first table (and there is an index on TB.COL3):

                      (TB is a very large table with only a few rows where TB.COL3 = 4)
                  
                      SELECT * FROM TA JOIN TB ON TA.COL1 = TB.COL2 AND TB.COL3 = 4;
                  
                      SELECT * FROM TB JOIN TA ON TA.COL1 = TB.COL2 AND TB.COL3 = 4;

                  The general rule is to put first the table that has a narrowing condition on one of its columns. In certain cases, HyperSQL 2.2.x reorders the joined tables if it is obvious that this will introduce a narrowing condition.

                  HyperSQL features automatic, on-the-fly indexes for views and subselects that are used in a query.

                  Indexes are used when a LIKE condition searches from the start of the string.

                  Indexes are used for ORDER BY clauses if the same index is used for selection and ordering of rows. It is possible to force the use of index for ORDER BY.

                  Query Processing and Optimisation

                  HyperSQL 2.2.x changes the order of tables in a query in order to optimise processing. This happens only when one of the tables has a narrowing condition and reordering does not change the result of the query.

                  Indexes and Conditions

                  HyperSQL optimises queries to use indexes, for all types of range and equality conditions, including IS NULL and NOT NULL conditions. Conditions can be in join or WHERE clauses, including all types of joins.

                  In addition, HyperSQL will use an index (if one exists) for IN conditions, whether constants, variable, or subqueries are used on the right hand side of the IN predicate. Multicolumn IN conditions can also use an index.

                  HyperSQL can always use indexes when several conditions are combined with the AND operator, choosing a conditions which can use an index. This now extended to all equality conditions on multiple columns that are part of an index.

                  HyperSQL will also use indexes when several conditions are combined with the OR operator and each condition can use an index (each condition may use a different index). For example, if a huge table has two separate columns for first name and last name, and both columns are indexed, a query such as the following example will use the indexes and complete in a short time:

                      -- TC is a very large table
                  
                      SELECT * FROM TC WHERE TC.FIRSTNAME = 'John' OR TC.LASTNAME = 'Smith' OR TC.LASTNAME = 'Williams'
                  

                  Each subquery is considered a separate SELECT statement and uses indexes when they are available.

                  In each SELECT statement, at least one index per table can be used if there is a query conditions that can use the index. When conditions on a table are combined with the OR operator, and each condition can use an index, multiple indexes per table are used.

                  Indexes and Operations

                  HyperSQL optimises simple row count queries in the form of SELECT COUNT(*) FROM <table> and returns the result immediately (this optimisation does not take place in MVCC mode).

                  HyperSQL can use an index on a column for SELECT MAX(<column>) FROM <table> and SELECT MIN(<column>) FROM <table> queries. There should be an index on the <column> and the query can have a WHERE condition on the same column. In the example below the maximum value for the TB.COL3 below 1000000 is returned.

                      SELECT MAX(TB.COL3) FROM TB WHERE TB.COL < 1000000
                  

                  HyperSQL can use an index for simple queries containing DISTINCT or GROUP BY to avoid checking all the rows of the table. Note that indexes are always used if the query has a condition, regardless of the use of DISTINCT or GROUP BY. This particular optimisation applies to cases in which all the columns in the SELECT list are from the same table and are covered by a single index, and any join or query condition uses this index.

                  For example, with the large table below, a DISTINCT or GROUP BY query to return all the last names, can use an the index on the TC.LASTNAME column. Similarly, a GROUP BY query on two columns can use an index that covers the two columns.

                      -- TC is a very large table
                  
                      SELECT DISTINCT LASTNAME FROM TC WHERE TC.LASTNAME > 'F'
                  
                      SELECT STATE, LASTNAME FROM TC GROUP BY STATE, LASTNAME
                  
                  

                  Indexes and ORDER BY, OFFSET and LIMIT

                  HyperSQL can use an index on an ORDER BY clause if all the columns in ORDER BY are in a single-column or multi-column index (in the exact order). This is important if there is a LIMIT n (or FETCH n ROWS ONLY) clause. In this situation, the use of index allows the query processor to access only the number of rows specified in the LIMIT clause, instead of building the whole result set, which can be huge. This also works for joined tables when the ORDER BY clause is on the columns of the first table in a join. Indexes are used in the same way when ORDER BY ... DESC is specified in the query. Note that unlike some other RDBMS, HyperSQL does not need or create DESC indexes. It can use any ordinary, ascending index for ORDER BY ... DESC.

                  If there is an equality or range condition (e.g. EQUALS, GREATER THAN) condition on the columns specified in the ORDER BY clause, the index is still used.

                  In the two examples below, the index on TA.COL3 is used and only up to 1000 rows are processed and returned.

                      (TA is a very large table with an index on TA.COL3
                  
                      SELECT * FROM TA JOIN TB ON TA.COL2 = TB.COL1 WHERE TA.COL3 > 40000 ORDER BY TA.COL3 LIMIT 1000;
                      SELECT * FROM TA JOIN TB ON TA.COL2 = TB.COL1 WHERE TA.COL3 > 40000 AND TA.COL3 < 100000 ORDER BY TA.COL3 DESC LIMIT 1000;
                  

                  But if the query contains an equality condition on another indexed column in the table, this may take precedence and no index may be used for ORDER BY. In this case USING INDEX can be added to the end of the query to force the use of the index for the LIMIT operation. In the example below there is an index on TA.COL1 as well as the index on TA.COL3. Normally the index on TA.COL1 is used, but the USING INDEX hint results in the index on TB.COL3 to be used for selecting the first 1000 rows.

                      (TA is a very large table with an index on TA.COL3 and a separate index on TA.COL1
                  
                      SELECT * FROM TA JOIN TB ON TA.COL2 = TB.COL1 WHERE TA.COL1 = 'SENT' AND TB.COL3 > 40000 ORDER BY TB.COL3 LIMIT 1000 USING INDEX;
                  

                  Chapter 3. Sessions and Transactions

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 4903 $

                  Copyright 2010-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  Overview

                  All SQL statements are executed in sessions. When a connection is established to the database, a session is started. The authorization of the session is the name of the user that started the session. A session has several properties. These properties are set by default at the start according to database settings.

                  SQL Statements are generally transactional statements. When a transactional statement is executed, it starts a transaction if no transaction is in progress. If SQL Data is modified during a transaction, the change can be undone with a ROLLBACK statement. When a COMMIT statement is executed, the transaction is ended. If a single statement fails, the transaction is not normally terminated. However, some failures are caused by execution of statements that are in conflict with statements executed in other concurrent sessions. Such failures result in an implicit ROLLBACK, in addition to the exception that is raised.

                  Schema definition and manipulation statements are also transactional according to the SQL Standard. HyperSQL 2.0 performs automatic commits before and after the execution of such transactions. Therefore, schema-related statements cannot be rolled back. This is likely to change in future versions.

                  Some statements are not transactional. Most of these statements are used to change the properties of the session. These statements begin with the SET keyword.

                  If the AUTOCOMMIT property of a session is TRUE, then each transactional statement is followed by an implicit COMMIT.

                  The default isolation level for a session is READ COMMITTED. This can be changed using the JDBC java.sql.Connection object and its setTransactionIsolation(int level) method. The session can be put in read-only mode using the setReadOnly(boolean readOnly) method. Both methods can be invoked only after a commit or a rollback, but not during a transaction.

                  The isolation level and / or the readonly mode of a transaction can also be modified using an SQL statement. You can use the statement to change only the isolation mode, only the read-only mode, or both at the same time. This command can be issued only after a commit or rollback.

                  SET TRANSACTION <transaction characteristic> [ <comma> <transaction characteristic> ]

                  Details of the statement is described later in this chapter.

                  Session Attributes and Variables

                  Each session has several system attributes. A session can also have user-defined session variables.

                  Session Attributes

                  The system attributes reflect the current mode of operation for the session. These attributes can be accessed with function calls and can be referenced in queries. For example, they can be returned using the VALUES <attribute function>, ... statement.

                  The named attributes such as CURRENT_USER, CURRENT_SCHEMA, etc. are SQL Standard functions. Other attributes of the session, such as auto-commit or read-only modes can be read using other built-in functions. All these functions are listed in the Built In Functions chapter.

                  Session Variables

                  Session variables are user-defined variables created the same way as the variables for stored procedures and functions. Currently, these variables cannot be used in general SQL statements. They can be assigned to IN, INOUT and OUT parameters of stored procedures. This allows calling stored procedures which have INOUT or OUT arguments and is useful for development and debugging. See the example in the SQL-Invoked Routines chapter, under Formal Parameters.

                  Example 3.1. User-defined Session Variables

                    DECLARE counter INTEGER DEFAULT 3;
                    DECLARE result VARCHAR(20) DEFAULT NULL;
                    SET counter=15;
                    CALL myroutine(counter, result)
                  

                  Session Tables

                  With necessary access privileges, sessions can access all table, including GLOBAL TEMPORARY tables, that are defined in schemas. Although GLOBAL TEMPORARY tables have a single name and definition which applies to all sessions that use them, the contents of the tables are different for each session. The contents are cleared either at the end of each transaction or when the session is closed.

                  Session tables are different because their definition is visible only within the session that defines a table. The definition is dropped when the session is closed. Session tables do not belong to schemas.

                  <temporary table declaration> ::= DECLARE LOCAL TEMPORARY TABLE <table name> <table element list> [ ON COMMIT { PRESERVE | DELETE } ROWS ]

                  The syntax for declaration is based on the SQL Standard. A session table cannot have FOREIGN KEY constraints, but it can have PRIMARY KEY, UNIQUE or CHECK constraints. A session table definition cannot be modified by adding or removing columns, indexes, etc.

                  It is possible to refer to a session table using its name, which takes precedence over a schema table of the same name. To distinguish a session table from schema tables, the pseudo schema names, MODULE or SESSION can be used. An example is given below:

                  Example 3.2. User-defined Temporary Session Tables

                    DECLARE LOCAL TEMPORARY TABLE buffer (id INTEGER PRIMARY KEY, textdata VARCHAR(100)) ON COMMIT PRESERVE ROWS
                    INSERT INTO module.buffer SELECT id, firstname || ' ' || lastname FROM customers
                    -- do some more work
                    DROP TABLE module.buffer
                    -- or use alternative pseudo schema name
                    DROP TABLE session.buffer
                  


                  Session tables can be created inside a transaction. Automatic indexes are created and used on session tables when necessary for a query or other statement. By default, session table data is held in memory. This can be changed with the SET SESSION RESULT MEMORY ROWS statement.

                  Transactions and Concurrency Control

                  HyperSQL 2.0 has been fully redesigned to support different transaction isolation models. It no longer supports the old 1.8.x model with "dirty read". Although it is perfectly possible to add an implementation of the transaction manager that supports the legacy model, we thought this is no longer necessary. The new system allows you to select the transaction isolation model while the engine is running. It also allows you to choose different isolation levels for different simultaneous sessions.

                  HyperSQL 2.0 supports three concurrency control models, two-phase-locking (2PL), which is the default, multiversion concurrency control (MVCC) and a hybrid model, which is 2PL plus multiversion rows. Within each model, it supports some of the 4 standard levels of transaction isolation: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ and SERIALIZABLE. The concurrency control model is a strategy that governs all the sessions and is set for the database, as opposed for individual sessions. The isolation level is a property of each SQL session, so different sessions can have different isolation levels. In the new implementation, all isolation levels avoid the "dirty read" phenomenon and do not read uncommitted changes made to rows by other transactions.

                  HyperSQL is fully multi threaded in all transaction models. Sessions continue to work simultaneously and can fully utilise multi-core processors.

                  To concurrency control model of a live database can be changed. The SET DATABASE TRANSACTION CONTROL { LOCKS | MVLOCKS | MVCC } can be used by a user with the DBA role.

                  Two Phase Locking

                  The two-phase locking model is the default mode. It is referred to by the keyword, LOCKS. In the 2PL model, each table that is read by a transaction is locked with a shared lock (read lock), and each table that is written to is locked with an exclusive lock (write lock). If two sessions read and modify different tables then both go through simultaneously. If one session tries to lock a table that has been locked by the other, if both locks are shared locks, it will go ahead. If either of the locks is an exclusive lock, the engine will put the session in wait until the other session commits or rolls back its transaction. In some cases the engine will invalidate the transaction of the current session, if the action would result in deadlock.

                  HyperSQL also supports explicit locking of a group of tables for the duration of the current transaction. Use of this command blocks access to the locked tables by other sessions and ensures the current session can complete the intended reads and writes on the locked tables.

                  If a table is read-only, it will not be locked by any transaction.

                  The READ UNCOMMITTED isolation level can be used in 2PL modes for read-only operations. It is the same as READ COMMITTED plus read only.

                  The READ COMMITTED isolation level is the default. It keeps write locks on tables until commit, but releases the read locks after each operation.

                  The REPEATABLE READ level is upgraded to SERIALIZABLE. These levels keep both read and write locks on tables until commit.

                  It is possible to perform some critical operations at the SERIALIZABLE level, while the rest of the operations are performed at the READ COMMITTED level.

                  Note: two phase locking refers to two periods in the life of a transaction. In the first period, locks are acquired, in the second period locks are released. No new lock is acquired after releasing a lock.

                  Two Phase Locking with Snapshot Isolation

                  This model is referred to as MVLOCKS. It works the same way as normal 2PL as far as updates are concerned.

                  SNAPSHOT ISOLATION is a multiversion concurrency strategy which uses the snapshot of the whole database at the time of the start of the transaction. In this model, read only transactions use SNAPSHOT ISOLATION. While other sessions are busy changing the database, the read only session sees a consistent view of the database and can access all the tables even when they are locked by other sessions for updates.

                  There are many applications for this mode of operation. In heavily updated data sets, this mode allows uninterrupted read access to the data.

                  Lock Contention in 2PL

                  When multiple connections are used to access the database, the transaction manager controls their activities. When each transaction performs only reads or writes on a single table, there is no contention. Each transaction waits until it can obtain a lock then performs the operation and commits. All contentions occur when transactions perform reads and writes on more than one table, or perform a read, followed by a write, on the same table.

                  For example, when sessions are working at the SERIALIZABLE level, when multiple sessions first read from a table in order to check if a row exists, then insert a row into the same table when it doesn't exist, there will be regular contention. Transaction A reads from the table, then does Transaction B. Now if either Transaction A or B attempts to insert a row, it will have to be terminated as the other transaction holds a shared lock on the table. If instead of two operations, a single MERGE statement is used to perform the read and write, no contention occurs because both locks are obtained at the same time.

                  Alternatively, there is the option of obtaining the necessary locks with an explicit LOCK TABLE statement. This statement should be executed before other statements and should include the names of all the tables and the locks needed. After this statement, all the other statements in the transaction can be executed and the transaction committed. The commit will remove all the locks.

                  HyperSQL detects deadlocks before attempting to execute a statement. When a lock is released after the completion of the statement, the first transaction that is waiting for the lock is allowed to continue.

                  HyperSQL is fully multi threaded. It therefore allows different transactions to execute concurrently so long as they are not waiting to lock the same table for write.

                  Locks in SQL Routines and Triggers

                  In both LOCKS and MVLOCKS models, SQL routines (functions and procedures) and triggers obtain all the read and write locks at the beginning of the routine execution. SQL statements contained in the routine or trigger are all executed without deadlock as all the locks have already been obtained. At the end of execution of the routine or trigger, read locks are released if the session isolation level is READ COMMITTED.

                  MVCC

                  In the MVCC model, there are no shared, read locks. Exclusive locks are used on individual rows, but their use is different. Transactions can read and modify the same table simultaneously, generally without waiting for other transactions. The SQL Standard isolation levels are used by the user's application, but these isolation levels are translated to the MVCC isolation levels READ CONSISTENCY or SNAPSHOT ISOLATION.

                  When transactions are running at READ COMMITTED level, no conflict will normally occur. If a transaction that runs at this level wants to modify a row that has been modified by another uncommitted transaction, then the engine puts the transaction in wait, until the other transaction has committed. The transaction then continues automatically. This isolation level is called READ CONSISTENCY.

                  Deadlock is completely avoided. In theory conflict is possible if each transaction is waiting for a different row modified by the other transaction. In this case, one of the transactions is immediately terminated (rolled back) unless the setting has been changed with the <set database transaction rollback on conflict statement>. When this setting is changed to FALSE, the session that avoided executing the deadlock-causing statement returns an error, but without rolling back the previous actions. This will cause the other transaction to wait for the current transaction. The property should not be changed unless the application can quickly perform an alternative statement to continue or roll back the transaction. This allows maximum flexibility and compatibility with other database engines which do not roll back the transaction upon deadlock.

                  When transactions are running in REPEATABLE READ or SERIALIZABLE isolation levels, conflict is more likely to happen. There is no difference in operation between these two isolation levels. This isolation level is called SNAPSHOT ISOLATION.

                  In this mode, when the duration of two transactions overlaps, if one of the transactions has modified a row and the second transaction wants to modify the same row, the action of the second transaction will fail. The engine will invalidate the second transaction and roll back all its changes. If the setting is changed to false with the <set database transaction rollback on conflict statement>, then the second transaction will just return an error without rolling back. The application must perform an alternative statement to continue or roll back the transaction.

                  In the MVCC model, READ UNCOMMITTED is promoted to READ COMMITTED, as the new architecture is based on multi-version rows for uncommitted data and more than one version may exist for some rows.

                  With MVCC, when a transaction only reads data, then it will go ahead and complete regardless of what other transactions may do. This does not depend on the transaction being read-only or the isolation modes.

                  Choosing the Transaction Model

                  The SQL Standard defines the isolation levels as modes of operation that avoid the three unwanted phenomena, "dirty read", "fuzzy read" and "phantom row". The "dirty read" phenomenon occurs when a session can read a row that has been changed by another session. The "fuzzy read" phenomenon occurs when a row that was read by a session is modified by another session, then the first session reads the row again. The "phantom row" phenomenon occurs when a session performs an operation that affects several rows, for example, counts the rows or modifies them using a search condition, then another session adds one or more rows that fulfil the same search condition, then the first session performs an operation that relies on the results of its last operation. According to the Standard, the SERIALIZABLE isolation level avoids all three phenomena and also ensures that all the changes performed during a transaction can be considered as a series of uninterrupted changes to the database without any other transaction changing the database at all for the duration of these actions. The changes made by other transactions are considered to occur before the SERIALIZABLE transaction starts, or after it ends. The READ COMMITTED level avoids "dirty read" only, while the REPEATABLE READ level avoids "dirty read" and "fuzzy read", but not "phantom row".

                  The Standard allows the engine to return a higher isolation level than requested by the application. HyperSQL promotes a READ UNCOMMITTED request to READ COMMITTED and promotes a REPEATABLE READ request to SERIALIZABLE.

                  The MVCC model is not covered directly by the Standard. Research has established that the READ CONSISTENCY level fulfils the requirements of (and is stronger than) the READ COMMITTED level. The SNAPSHOT ISOLATION level is stronger than the READ CONSISTENCY level. It avoids the three anomalies defined by the Standard, and is therefore stronger than the REPEATABLE READ level as defined by the Standard. When operating with the MVCC model, HyperSQL treats a REPEATABLE READ or SERIALIZABLE setting for a transaction as SNAPSHOT ISOLATION.

                  All modes can be used with as many simultaneous connections as required. The default 2PL model is fine for applications with a single connection, or applications that do not access the same tables heavily for writes. With multiple simultaneous connections, MVCC can be used for most applications. Both READ CONSISTENCY and SNAPSHOT ISOLATION levels are stronger than the corresponding READ COMMITTED level in the 2PL mode. Some applications require SERIALIZABLE transactions for at least some of their operations. For these applications, one of the 2PL modes can be used. It is possible to switch the concurrency model while the database is operational. Therefore, the model can be changed for the duration of some special operations, such as synchronization with another data source.

                  All concurrency models are very fast in operation. When data change operations are mainly on the same tables, the MVCC model may be faster, especially with multi-core processors.

                  Schema and Database Change

                  There are a few SQL statements that must access a consistent state of the database during their executions. These statements, which include CHECKPOINT and BACKUP, put an exclusive lock on all the tables of the database when they start.

                  Some schema manipulation statements put an exclusive lock on one or more tables. For example changing the columns of a table locks the table exclusively.

                  In the MVCC model, all statements that need an exclusive lock on one or more tables, put an exclusive lock on the database catalog until they complete.

                  The effect of these exclusive locks is similar to the execution of data manipulation statements with write locks. The session that is about to execute the schema change statement waits until no other session is holding a lock on any of the objects. At this point it starts its operation and locks the objects to prevents any other session from accessing the locked objects. As soon as the operation is complete, the locks are all removed.

                  Simultaneous Access to Tables

                  It was mentioned that there is no limit on the number of sessions that can access the tables and all sessions work simultaneously in multi threaded execution. However there are internal resources that are shared. Simultaneous access to these resources can reduce the overall efficiency of the system. MEMORY and TEXT tables do not share resources and do not block multi threaded access. With CACHED tables, each row change operation blocks the file and its cache momentarily until the operation is finished. This is done separately for each row, therefore a multi-row INSERT, UPDATE, or DELETE statement will allow other sessions to access the file during its execution. With CACHED tables, SELECT operations do not block each other, but selecting from different tables and different parts of a large table causes the row cache to be updated frequently and will reduce overall performance.

                  The new access pattern is the opposite of the access pattern of version 1.8.x. In the old version, even when 20 sessions are actively reading and writing, only a single session at a time performs an SQL statement completely, before the next session is allowed access. In the new version, while a session is performing a SELECT statement and reading rows of a CACHED table to build a result set, another session may perform an UPDATE statement that reads and writes rows of the same table. The two operations are performed without any conflict, but the row cache is updated more frequently than when one operation is performed after the other operation has finished.

                  Viewing Sessions

                  As HyperSQL is multithreaded, you can view the current sessions and their state from any admin session. The INFORMATION_SCHEMA.SYSTEM_SESSIONS table contains the list of open sessions, their unique ids and the statement currently executed or waiting to be executed by each session. For each session, it displays the list of sessions that are waiting for it to commit, or the session that this session is waiting for.

                  Session and Transaction Control Statements

                  ALTER SESSION

                  alter session statement

                  <alter session statement> ::= ALTER SESSION <numeric literal> { CLOSE | RELEASE }

                  <alter current session statement> ::= ALTER SESSION RESET { ALL | RESULT SETS | TABLE DATA }

                  The <alter session statement> is used by an administrator to close another session or to release the transaction in another session. When a session is released, its current transaction is terminated with a failure. The session remains open. This statement is different from the other statements discussed in this chapter as it is not used for changing the settings of the current session.

                  The session ID is used as a <numeric literal> in this statement. The administrator can use the INFORMATION_SCHEMA.SYSTEM_SESSIONS table to find the session IDs of other sessions.

                  The <alter current session statement> is used to clear and reset different states of the current session. When ALL is specified, the current transaction is rolled back, the session settings such as time zone, current schema etc. are restored to their original state at the time the session was opened and all open result sets are closed and temporary tables cleared. When RESULT SETS is specified, all currently open result sets are closed and the resources are released. When TABLE DATA is specified, the data in all temporary tables is cleared.

                  SET AUTOCOMMIT

                  set autocommit command

                  <set autocommit statement> ::= SET AUTOCOMMIT { TRUE | FALSE }

                  When an SQL session is started by creating a JDBC connection, it is in AUTOCOMMIT mode. In this mode, after each SQL statement a COMMIT is performed automatically. This statement changes the mode. It is equivalent to using the setAutoCommit( boolean autoCommit) method of the JDBC Connection object.

                  START TRANSACTION

                  start transaction statement

                  <start transaction statement> ::= START TRANSACTION [ <transaction characteristics> ]

                  Start an SQL transaction and set its characteristics. All transactional SQL statements start a transaction automatically, therefore using this statement is not necessary. If the statement is called in the middle of a transaction, an exception is thrown.

                  SET TRANSACTION

                  set next transaction characteristics

                  <set transaction statement> ::= SET [ LOCAL ] TRANSACTION <transaction characteristics>

                  Set the characteristics of the next transaction in the current session. This statement has an effect only on the next transactions and has no effect on the future transactions after the next.

                  transaction characteristics

                  transaction characteristics

                  <transaction characteristics> ::= [ <transaction mode> [ { <comma> <transaction mode> }... ] ]

                  <transaction mode> ::= <isolation level> | <transaction access mode> | <diagnostics size>

                  <transaction access mode> ::= READ ONLY | READ WRITE

                  <isolation level> ::= ISOLATION LEVEL <level of isolation>

                  <level of isolation> ::= READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE

                  <diagnostics size> ::= DIAGNOSTICS SIZE <number of conditions>

                  <number of conditions> ::= <simple value specification>

                  Specify transaction characteristics.

                  Example 3.3. Setting Transaction Characteristics

                    SET TRANSACTION READ ONLY
                    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
                    SET TRANSACTION READ WRITE, ISOLATION LEVEL READ COMMITTED
                  

                  SET CONSTRAINTS

                  set constraints mode statement

                  <set constraints mode statement> ::= SET CONSTRAINTS <constraint name list> { DEFERRED | IMMEDIATE }

                  <constraint name list> ::= ALL | <constraint name> [ { <comma> <constraint name> }... ]

                  If the statement is issued during a transaction, it applies to the rest of the current transaction. If the statement is issued when a transaction is not active then it applies only to the next transaction in the current session. HyperSQL does not yet support this feature.

                  LOCK TABLE

                  lock table statement

                  <lock table statement> ::= LOCK TABLE <table name> { READ | WRITE} [, <table name> { READ | WRITE} ...]}

                  In some circumstances, where multiple simultaneous transactions are in progress, it may be necessary to ensure a transaction consisting of several statements is completed, without being terminated due to possible deadlock. When this statement is executed, it waits until it can obtain all the listed locks, then returns. If obtaining the locks would result in a deadlock an error is raised. The SQL statements following this statements use the locks already obtained (and obtain new locks if necessary) and can proceed without waiting. All the locks are released when a COMMIT or ROLLBACK statement is issued.

                  When the isolation level of a session is READ COMMITTED, read locks are released immediately after the execution of the statement, therefore you should use only WRITE locks in this mode. Alternatively, you can switch to the SERIALIZABLE isolation mode before locking the tables for the specific transaction that needs to finish consistently and without a deadlock. It is best to execute this statement at the beginning of the transaction with the complete list of required read and write locks.

                  Currently, this command does not have any effect when the database transaction control model is MVCC.

                  Example 3.4. Locking Tables

                    LOCK TABLE table_a WRITE, table_b READ

                  SAVEPOINT

                  savepoint statement

                  <savepoint statement> ::= SAVEPOINT <savepoint specifier>

                  <savepoint specifier> ::= <savepoint name>

                  Establish a savepoint. This command is used during an SQL transaction. It establishes a milestone for the current transaction. The SAVEPOINT can be used at a later point in the transaction to rollback the transaction to the milestone.

                  RELEASE SAVEPOINT

                  release savepoint statement

                  <release savepoint statement> ::= RELEASE SAVEPOINT <savepoint specifier>

                  Destroy a savepoint. This command is rarely used as it is not very useful. It removes a SAVEPOINT that has already been defined.

                  COMMIT

                  commit statement

                  <commit statement> ::= COMMIT [ WORK ] [ AND [ NO ] CHAIN ]

                  Terminate the current SQL-transaction with commit. This make all the changes to the database permanent.

                  ROLLBACK

                  rollback statement

                  <rollback statement> ::= ROLLBACK [ WORK ] [ AND [ NO ] CHAIN ]

                  Rollback the current SQL transaction and terminate it. The statement rolls back all the actions performed during the transaction. If NO CHAIN is specified, a new SQL transaction is started just after the rollback. The new transaction inherits the properties of the old transaction.

                  ROLLBACK TO SAVEPOINT

                  rollback statement

                  <rollback statement> ::= ROLLBACK [ WORK ] TO SAVEPOINT <savepoint specifier>

                  Rollback part of the current SQL transaction and continue the transaction. The statement rolls back all the actions performed after the specified SAVEPOINT was created. The same effect can be achieved with the rollback( Savepoint savepoint) method of the JDBC Connection object.

                  Example 3.5. Rollback

                    -- perform some inserts, deletes, etc.
                    SAVEPOINT A
                    -- perform some inserts, deletes, selects etc.
                    ROLLBACK WORK TO SAVEPOINT A
                    -- all the work after the declaration of SAVEPOINT A is rolled back
                  

                  DISCONNECT

                  disconnect statement

                  <disconnect statement> ::= DISCONNECT

                  Terminate the current SQL session. Closing a JDBC connection has the same effect as this command.

                  SET SESSION CHARACTERISTICS

                  set session characteristics statement

                  <set session characteristics statement> ::= SET SESSION CHARACTERISTICS AS <session characteristic list>

                  <session characteristic list> ::= <session characteristic> [ { <comma> <session characteristic> }... ]

                  <session characteristic> ::= <session transaction characteristics>

                  <session transaction characteristics> ::= TRANSACTION <transaction mode> [ { <comma> <transaction mode> }... ]

                  Set one or more characteristics for the current SQL-session. This command is used to set the transaction mode for the session. This endures for all transactions until the session is closed or the next use of this command. The current read-only mode can be accessed with the ISREADONLY() function.

                  Example 3.6. Setting Session Characteristics

                    SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY
                    SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE
                    SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE, ISOLATION LEVEL READ COMMITTED
                  

                  SET SESSION AUTHORIZATION

                  set session user identifier statement

                  <set session user identifier statement> ::= SET SESSION AUTHORIZATION <value specification>

                  Set the SQL-session user identifier. This statement changes the current user. The user that executes this command must have the CHANGE_AUTHORIZATION role, or the DBA role. After this statement is executed, all SQL statements are executed with the privileges of the new user. The current authorisation can be accessed with the CURRENT_USER and SESSION_USER functions.

                  Example 3.7. Setting Session Authorization

                    SET SESSION AUTHORIZATION 'FELIX'
                    SET SESSION AUTHORIZATION SESSION_USER
                  

                  SET ROLE

                  set role statement

                  <set role statement> ::= SET ROLE <role specification>

                  <role specification> ::= <value specification> | NONE

                  Set the SQL-session role name and the current role name for the current SQL-session context. The user that executes this command must have the specified role. If NONE is specified, then the previous CURRENT_ROLE is eliminated. The effect of this lasts for the lifetime of the session. The current role can be accessed with the CURRENT_ROLE function.

                  SET TIME ZONE

                  set local time zone statement

                  <set local time zone statement> ::= SET TIME ZONE <set time zone value>

                  <set time zone value> ::= <interval value expression> | LOCAL

                  Set the current default time zone displacement for the current SQL-session. When the session starts, the time zone displacement is set to the time zone of the client. This command changes the time zone displacement. The effect of this lasts for the lifetime of the session. If LOCAL is specified, the time zone displacement reverts to the local time zone of the session.

                  Example 3.8. Setting Session Time Zone

                    SET TIME ZONE LOCAL
                    SET TIME ZONE INTERVAL '+6:00' HOUR TO MINUTE
                  

                  SET CATALOG

                  set catalog statement

                  <set catalog statement> ::= SET <catalog name characteristic>

                  <catalog name characteristic> ::= CATALOG <value specification>

                  Set the default schema name for unqualified names used in SQL statements that are prepared or executed directly in the current sessions. As there is only one catalog in the database, only the name of this catalog can be used. The current catalog can be accessed with the CURRENT_CATALOG function.

                  SET SCHEMA

                  set schema statement

                  <set schema statement> ::= SET <schema name characteristic>

                  <schema name characteristic> ::= SCHEMA <value specification> | <schema name>

                  Set the default schema name for unqualified names used in SQL statements that are prepared or executed directly in the current sessions. The effect of this lasts for the lifetime of the session. The SQL Standard form requires the schema name as a single-quoted string. HyperSQL also allows the use of the identifier for the schema. The current schema can be accessed with the CURRENT_SCHEMA function.

                  SET PATH

                  set path statement

                  <set path statement> ::= SET <SQL-path characteristic>

                  <SQL-path characteristic> ::= PATH <value specification>

                  Set the SQL-path used to determine the subject routine of routine invocations with unqualified routine names used in SQL statements that are prepared or executed directly in the current sessions. The effect of this lasts for the lifetime of the session.

                  SET MAXROWS

                  set max rows statement

                  <set max rows statement> ::= SET MAXROWS <unsigned integer literal>

                  The normal operation of the session has no limit on the number of rows returned from a SELECT statement. This command set the maximum number of rows of the result returned by executing queries.

                  This statement has a similar effect to the setMaxRows(int max) method of the JDBC Statement interface, but it affects the results returned from the next statement execution only. After the execution of the next statement, the MAXROWS limit is removed.

                  Only zero or positive values can be used with this command. The value overrides any value specified with setMaxRows(int max) method of a JDBC statement. The statement SET MAXROWS 0 means no limit.

                  It is possible to limit the number of rows returned from SELECT statements with the FETCH <n> ROWS ONLY, or its alternative, LIMIT <n>. Therefore this command is not recommended for general use. The only legitimate use of this command is for checking and testing queries that may return very large numbers of rows.

                  SET SESSION RESULT MEMORY ROWS

                  set session result memory rows statement

                  <set session result memory rows statement> ::= SET SESSION RESULT MEMORY ROWS <unsigned integer literal>

                  By default the session uses memory to build result sets, subquery results and temporary tables. This command sets the maximum number of rows of the result (and temporary tables) that should be kept in memory. If the row count of the result or temporary table exceeds the setting, the result is stored on disk. The default is 0, meaning all result sets are held in memory.

                  This statement applies to the current session only. The general database setting is:

                  SET DATABASE DEFAULT RESULT MEMORY ROWS <unsigned integer literal>

                  SET IGNORECASE

                  set ignore case statement

                  <set ignore case statement> ::= SET IGNORECASE { TRUE | FALSE }

                  Sets the type used for new VARCHAR table columns. By default, character columns in new databases are case sensitive. If SET IGNORECASE TRUE is used, all VARCHAR columns in new tables are set to VARCHAR_IGNORECASE. It is possible to specify the VARCHAR_IGNORECASE type for the definition of individual columns. So it is possible to have some columns case sensitive and some not, even in the same table. This statement must be switched before creating tables. Existing tables and their data are not affected.

                  Chapter 4. Schemas and Database Objects

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5039 $

                  Copyright 2009-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  Overview

                  The persistent elements of an SQL environment are database objects. The database consists of catalogs plus authorizations.

                  A catalog contains schemas, while schemas contain the objects that contain data or govern the data.

                  Each catalog contains a special schema called INFORMATION_SCHEMA. This schema is read-only and contains some views and other schema objects. The views contain lists of all the database objects that exist within the catalog, plus all authorizations.

                  Each database object has a name. A name is an identifier and is unique within its name-space.

                  Schemas and Schema Objects

                  In HyperSQL, there is only one catalog per database. The name of the catalog is PUBLIC. You can rename the catalog with the ALTER CATALOG RENAME TO statement. All schemas belong the this catalog. The catalog name has no relation to the file name of the database.

                  Each database has also an internal "unique" name which is automatically generated when the database is created. This name is used for event logging. You can also change this unique name.

                  Schema objects are database objects that contain data or govern or perform operations on data. By definition, each schema object belongs to a specific schema.

                  Schema objects can be divided into groups according to their characteristics.

                  • Some kinds of schema objects can exist independently from other schema object. Other kinds can exist only as an element of another schema object. These dependent objects are automatically destroyed when the parent object is dropped.

                  • Separate name-spaces exists for different kinds of schema object. Some name-spaces are shared between two similar kinds of schema objects.

                  • There can be dependencies between various schema objects, as a schema object can include references to other schema objects. These references can cross schema boundaries. Interdependence and cross referencing between schema objects is allowed in some circumstances and disallowed in some others.

                  • Schema objects can be destroyed with the DROP statement. If dependent schema objects exist, a DROP statement will succeed only if it has a CASCADE clause. In this case, dependent objects are also destroyed in most cases. In some cases, such as dropping DOMAIN objects, the dependent objects are not destroyed, but modified to remove the dependency.

                  A new HyperSQL catalog contains an empty schema called PUBLIC. By default, this schema is the initial schema when a new session is started. New schemas and schema objects can be defined and used in the PUBLIC schema, as well as any new schema that is created by the user. You can rename the PUBLIC schema.

                  HyperSQL allows all schemas to be dropped, except the schema that is the default initial schema for new sessions (by default, the PUBLIC schema). For this schema, a DROP SCHEMA ... CASCADE statement will succeed but will result in an empty schema, rather than no schema.

                  The statements for setting the initial schema for users are described in the Statements for Authorization and Access Control chapter.

                  Names and References

                  The name of a schema object is an <identifier>. The name belongs to the name-space for the particular kind of schema object. The name is unique within its name-space. For example, each schema has a separate name-space for TRIGGER objects.

                  In addition to the name-spaces in the schema. Each table has a name-space for the names of its columns.

                  Because a schema object is always in a schema and a schema always in a catalog, it is possible, and sometimes necessary, to qualify the name of the schema object that is being referenced in an SQL statement. This is done by forming an <identifier chain>. In some contexts, only a simple <identifier> can be used and the <identifier chain> is prohibited. While in some other contexts, the use of <identifier chain> is optional. An identifier chain is formed by qualifying each object with the name of the object that owns its name-space. Therefore a column name is prefixed with a table name, a table name is prefixed with a schema name, and a schema name is prefixed with a catalog name. A fully qualified column name is in the form <catalog name>.<schema name>.<table name>.<column name>, likewise, a fully qualified sequence name is in the form <catalog name>.<schema name>.<sequence name>.

                  HyperSQL extends the SQL standard to allow renaming all database objects. The ALTER ... RENAME TO command has slightly different forms depending on the type of object. If an object is referenced in a VIEW or ROUTINE definition, it is not always possible to rename it.

                  Character Sets

                  A CHARACTER SET is the whole or a subset of the UNICODE character set.

                  A character set name can only be a <regular identifier>. There is a separate name-space for character sets.

                  There are several predefined character sets. These character sets belong to INFORMATION_SCHEMA. However, when they are referenced in a statement, no schema prefix is necessary.

                  The following character sets, together with some others, have been specified by the SQL Standard:

                  SQL_TEXT, SQL_IDENTIFIER, SQL_CHARACTER

                  The SQL_CHARACTER consists of ASCII letters, digits and the symbols used in the SQL language. SQL_TEXT and SQL_IDENTIFIER are implementation defined. HyperSQL defines SQL_TEXT as the UNICODE character set and SQL_IDENTIFIER as the UNICODE character set minus the SQL language special characters.

                  SQL_TEXT consists of the full set of Unicode characters. These characters can be used in strings and clobs stored in the database. The character repertoire of HyperSQL is the UTF16 character set, which covers all possible character sets.

                  If a predefined character set is specified for a table column, then any string stored in the column must contain only characters from the specified character set. HyperSQL does not enforce the CHARACTER SET that is specified for a column and may accept any character string supported by SQL_TEXT.

                  Collations

                  A COLLATION is the method used for ordering character strings in ordered sets and to determine equivalence of two character strings.

                  The system default collation is called SQL_TEXT. This collation sorts according to the Unicode code of the characters, UNICODE_SIMPLE.

                  There are several predefined collations. These collations belong to INFORMATION_SCHEMA. However, when they are referenced in a statement, there is no need for a schema prefix.

                  There is a separate name-space for collations..

                  Collations for a large number of languages are supported by HyperSQL.

                  HyperSQL support a default collation for the whole database. Optionally, a different collation can be specified for each table column that is defined as CHAR or VARCHAR. Also, a different collation can be used in an ORDER BY clause.

                  When comparing two strings, all collation pad the shorter string with spaces before comparing the two strings of equal length. You can change the default database collation with one that does not pad the string with spaces before comparison. See SET DATABASE COLLATION statement in the System Management chapter.

                  Distinct Types

                  A distinct, user-defined TYPE is simply based on a built-in type. A distinct TYPE is used in table definitions and in CAST statements.

                  Distinct types share a name-space with domains.

                  Domains

                  A DOMAIN is a user-defined type, simply based on a built-in type. A DOMAIN can have constraints that limit the values that the DOMAIN can represent. A DOMAIN can be used in table definitions and in CAST statements.

                  Distinct types share a name-space with domains.

                  Number Sequences

                  A SEQUENCE object produces INTEGER values in sequence. The SEQUENCE can be referenced in special contexts only within certain SQL statements. For each row where the object is referenced, its value is incremented.

                  There is a separate name-space for SEQUENCE objects.

                  IDENTITY columns are columns of tables which have an internal, unnamed SEQUENCE object. HyperSQL also supports IDENTITY columns that use a named SEQUENCE object.

                  SEQUENCE objects and IDENTITY columns are supported fully according to the latest SQL 2008 Standard syntax.

                  Sequences

                  The SQL:2008 syntax and usage is different from what is supported by many existing database engines. Sequences are created with the CREATE SEQUENCE command and their current value can be modified at any time with ALTER SEQUENCE. The next value for a sequence is retrieved with the NEXT VALUE FOR <name> expression. This expression can be used for inserting and updating table rows.

                  Example 4.1. inserting the next sequence value into a table row

                  INSERT INTO mytable VALUES 2, 'John', NEXT VALUE FOR mysequence;

                  You can also use it in select statements. For example, if you want to number the returned rows of a SELECT in sequential order, you can use:

                  Example 4.2. numbering returned rows of a SELECT in sequential order

                  SELECT NEXT VALUE FOR mysequence, col1, col2 FROM mytable WHERE ...

                  In version 2.0, the semantics of sequences is exactly as defined by SQL:2008. If you use the same sequence twice in the same row in an INSERT statement, you will get the same value as required by the Standard.

                  The correct way to use a sequence value is the NEXT VALUE FOR expression.

                  HyperSQL adds an extension to Standard SQL to return the last value returned by the NEXT VALUE FOR expression in the current session. After a statement containing NEXT VALUE FOR is executed, the value that was returned for NEXT VALUE FOR is available using the CURRENT VALUE FOR expression. In the example below, the NEXT VALUE FOR expression is used to insert a new row. The value that was returned by NEXT VALUE FOR is retrieved with the CURRENT VALUE FOR in the next insert statements to populate two new rows in a different table that has a parent child relationship with the first table. For example if the value 15 was returned by the sequence, the same value 15 is inserted in the three rows.

                  Example 4.3. using the last value of a sequence

                  INSERT INTO mytable VALUES 2, 'John', NEXT VALUE FOR mysequence;
                  INSERT INTO childtable VALUES 4, CURRENT VALUE FOR mysequence;
                  INSERT INTO childtable VALUES 5, CURRENT VALUE FOR mysequence;


                  The INFORMATION_SCHEMA.SEQUENCES table contains the next value that will be returned from any of the defined sequences. The SEQUENCE_NAME column contains the name and the NEXT_VALUE column contains the next value to be returned. Note that this is only for getting information and you should not use it for accessing the next sequence value. When multiple sessions access the same sequence, the value returned from this table by one session could also be used by a different session, causing a sequence value to be used twice unintentionally.

                  Identity Auto-Increment Columns

                  Each table can contain a single auto-increment column, known as the IDENTITY column. An IDENTITY column is a SMALLINT, INTEGER, BIGINT, DECIMAL or NUMERIC column with its value generated by a sequence generator.

                  In HyperSQL 2.0, an IDENTITY column is not by default treated as the primary key for the table (as a result, multi-column primary keys are possible with an IDENTITY column present).

                  The SQL standard syntax is used, which allows the initial value and other options to be specified.

                  <colname> [ INTEGER | BIGINT | DECIMAL | NUMERIC ] GENERATED { BY DEFAULT | ALWAYS} AS IDENTITY [( <options> )]

                  When you add a new row to such a table using an INSERT INTO <tablename> ... statement, you can use the DEFAULT keyword for the IDENTITY column, which results in an auto-generated value for the column.

                  The IDENTITY() function returns the last value inserted into any IDENTITY column by this session. Each session manages this function call separately and is not affected by inserts in other sessions. Use CALL IDENTITY() as an SQL statement to retrieve this value. If you want to use the value for a field in a child table, you can use INSERT INTO <childtable> VALUES (...,IDENTITY(),...);. Both types of call to IDENTITY() must be made before any additional update or insert statements are issued by the session.

                  In triggers and routines, the value returned by the IDENTITY() function is correct for the given context. For example, if a call to a stored procedure inserts a row into a table, causing a new identity value to be generated, a call to IDENTITY() inside the procedure will return the new identity, but a call outside the procedure will return the last identity value that was generated before a call was made to the procedure.

                  The last inserted IDENTITY value can also be retrieved via JDBC, by specifying the Statement or PreparedStatement object to return the generated value.

                  The next IDENTITY value to be used can be changed with the following statement. Note that this statement is not used in normal operation and is only for special purposes, for example resetting the identity generator:

                  ALTER TABLE ALTER COLUMN <column name> RESTART WITH <new value>;

                  For backward compatibility, support has been retained for CREATE TABLE <tablename>(<colname> IDENTITY, ...) as a shortcut which defines the column both as an IDENTITY column and a PRIMARY KEY column. Also, for backward compatibility, it is possible to use NULL as the value of an IDENTITY column in an INSERT statement and the value will be generated automatically. You should avoid these compatibility features as they may be removed from future versions of HyperSQL.

                  In the following example, the identity value for the first INSERT statement is generated automatically using the DEFAULT keyword. The second INSERT statement uses a call to the IDENTITY() function to populate a row in the child table with the generated identity value.

                  CREATE TABLE star (id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
                     firstname VARCHAR(20),
                     lastname VARCHAR(20))
                  CREATE TABLE movies (starid INTEGER, movieid INTEGER PRIMARY KEY, title VARCHAR(40)) 
                  INSERT INTO star (id, firstname, lastname) VALUES (DEFAULT, 'Felix', 'the Cat')
                  INSERT INTO movies (starid, movieid, title) VALUES (IDENTITY(), 10, 'Felix in Hollywood')
                  

                  HyperSQL 2.1 also supports IDENTITY columns that use an external, named SEQUENCE object. This feature is not part of the SQL Standard. The example below uses this type of IDENTITY. Note the use of CURRENT VALUE FOR seq here is multi-session safe. The returned value is the last value used by this session when the row was inserted into the star table. This value is available until the transaction is committed. After commit, NULL is returned by the CURRENT VALUE FOR expression until the SEQUENCE is used again.

                  CREATE SEQUENCE seq
                  CREATE TABLE star (id INTEGER GENERATED BY DEFAULT AS SEQUENCE seq PRIMARY KEY, 
                     firstname VARCHAR(20),
                     lastname VARCHAR(20))
                  CREATE TABLE movies (starid INTEGER, movieid INTEGER PRIMARY KEY, title VARCHAR(40)) 
                  INSERT INTO star (id, firstname, lastname) VALUES (DEFAULT, 'Felix', 'the Cat')
                  INSERT INTO movies (starid, movieid, title) VALUES (CURRENT VALUE FOR seq, 10, 'Felix in Hollywood')
                  

                  Tables

                  In the SQL environment, tables are the most essential components, as they hold all persistent data.

                  If TABLE is considered as metadata (i.e. without its actual data) it is called a relation in relational theory. It has one or more columns, with each column having a distinct name and a data type. A table usually has one or more constraints which limit the values that can potentially be stored in the TABLE. These constraints are discussed in the next section.

                  A single column of the table can be defined as IDENTITY. The values stored in this column are auto-generated and are based on an (unnamed) identity sequence, or optionally, a named SEQUENCE object.

                  Views

                  A VIEW is similar to a TABLE but it does not permanently contain rows of data. A view is defined as a QUERY EXPRESSION, which is often a SELECT statement that references views and tables, but it can also consist of a TABLE CONSTRUCTOR that does not reference any tables or views.

                  A view has many uses:

                  • Hide the structure and column names of tables. The view can represent one or more tables or views as a separate table. This can include aggregate data, such as sums and averages, from other tables.

                  • Allow access to specific rows in a table. For example, allow access to records that were added since a given date, while hiding older records.

                  • Allow access to specific columns. For example allow access to columns that contain non-confidential information. Note that this can also be achieved with the GRANT SELECT statement, using column-level privileges

                  A VIEW that returns the columns of a single ordinary TABLE is updatable if the query expression of the view is an updatable query expression as discussed in the Data Access and Change chapter. Some updatable views are insertable-into because the query expression is insertable-into. In these views, each column of the query expressions must be a column of the underlying table and those columns of the underlying table that are not in the view must have a default clause, or be an IDENTITY or GENERATED column. When rows of an updatable view are updated, or new rows are inserted, or rows are deleted, these changes are reflected in the base table. A VIEW definition may specify that the inserted or updated rows conform to the search condition of the view. This is done with the CHECK OPTION clause.

                  A view that is not updatable according to the above paragraph can be made updatable or insertable-into by adding INSTEAD OF triggers to the view. These triggers contain statements to use the submitted data to modify the contents of the underlying tables of the view separately. For example, a view that represents a SELECT statements that joins two tables can have an INSTEAD OF DELETE trigger with two DELETE statements, one for each table. Views that have an INSTEAD OF trigger are called TRIGGER INSERTABLE, TRIGGER UPDATABLE, etc. according to the triggers that have been defined.

                  Views share a name-space with tables.

                  Constraints

                  A CONSTRAINT is a child schema object and can belong to a DOMAIN or a TABLE. CONSTRAINT objects can be defined without specifying a name. In this case the system generates a name for the new object beginning with "SYS_".

                  In a DOMAIN, CHECK constraints can be defined that limits the value represented by the DOMAIN. These constraints work exactly like a CHECK constraint on a single column of a table as described below.

                  In a TABLE, a constraint takes three basic forms.

                  CHECK

                  A CHECK constraint consists of a <search condition> that must not be false (can be unknown) for each row of the table. The <search condition> can reference all the columns of the current row, and if it contains a <subquery>, other tables and views in the database (excluding its own table).

                  NOT NULL

                  A simple form of check constraint is the NOT NULL constraint, which applies to a single column.

                  UNIQUE

                  A UNIQUE constraint is based on an equality comparison of values of specific columns (taken together) of one row with the same values from each of the other rows. The result of the comparison must never be true (can be false or unknown). If a row of the table has NULL in any of the columns of the constraint, it conforms to the constraint. A unique constraint on multiple columns (c1, c2, c3, ..) means that in no two rows, the sets of values for the columns can be equal unless at lease one of them is NULL. Each single column taken by itself can have repeat values in different rows. The following example satisfies a UNIQUE constraint on the two columns

                  Example 4.4. Column values which satisfy a 2-column UNIQUE constraint

                  1,2
                  2,1
                  2,2
                  NULL,1
                  NULL,1
                  1,NULL
                  NULL,NULL
                  NULL,NULL

                  If the SET DATABASE SQL UNIQUE NULLS FALSE has been set, then if not all the values set of columns are null, the not null values are compared and it is disallowed to insert identical rows that contain at least one not-null value.

                  PRIMARY KEY

                  A PRIMARY KEY constraint is equivalent to a UNIQUE constraint on one or more NOT NULL columns. Only one PRIMARY KEY can be defined in each table.

                  FOREIGN KEY

                  A FOREIGN key constraint is based on an equality comparison between values of specific columns (taken together) of each row with the values of the columns of a UNIQUE constraint on another table or the same table. The result of the comparison must never be false (can be unknown). A special form of FOREIGN KEY constraint, based on its CHECK clause, allows the result to be unknown only if the values for all columns are NULL. A FOREIGN key can be declared only if a UNIQUE constraint exists on the referenced columns.

                  Constraints share a name space with assertions.

                  Assertions

                  An ASSERTION is a top-level schema objects. It consists of a <search condition> that must not be false (can be unknown).

                  Assertions share a name-space with constraints

                  Triggers

                  A TRIGGER is a child schema object that always belongs to a TABLE or a VIEW.

                  Each time a DELETE, UPDATE or INSERT is performed on the table or view, additional actions are taken by the triggers that have been declared on the table or view.

                  Triggers are discussed in detail in Triggers chapter.

                  Routines

                  Routines are user-defined functions or procedures. The names and usage of functions and procedures are different. FUNCTION is a routine that can be referenced in many types of statements. PROCEDURE is a routine that can be referenced only in a CALL statement.

                  There is a separate name-space for routines.

                  Because of the possibility of overloading, each routine can have more than one name. The name of the routine is the same for all overloaded variants, but each variant has a specific name, different from all other routine names and specific names in the schema. The specific name can be specified in the routine definition statement. Otherwise it is assigned by the engine. The specific name is used only for schema manipulation statements, which need to reference a specific variant of the routine. For example, if a routine has two signatures, each signature has its own specific name. This allows the user to drop one of the signatures while keeping the other.

                  Routines are discussed in detail in chapter SQL-Invoked Routines .

                  Indexes

                  Indexes are an implementation-defined extension to the SQL Standard. HyperSQL has a dedicated name-space for indexes in each schema.

                  Statements for Schema Definition and Manipulation

                  Schemas and schema objects can be created, modified and dropped. The SQL Standard defines a range of statements for this purpose. HyperSQL supports many additional statements, especially for changing the properties of existing schema objects.

                  Common Elements and Statements

                  These elements and statements are used for different types of object. They are described here, before the statements that can use them.

                  identifier

                  definition of identifier

                  <identifier> ::= <regular identifier> | <delimited identifier> | <SQL language identifier>

                  <delimited identifier> ::= <double quote> <character sequence> <double quote>

                  <regular identifier> ::= <special character sequence>

                  <SQL language identifier> ::= <special character sequence>

                  A <delimited identifier> is a sequence of characters enclosed with double-quote symbols. All characters are allowed in the character sequence.

                  A <regular identifier> is a special sequence of characters. It consists of letters, digits and the underscore characters. It must begin with a letter. All the letters are translated to their upper-case version.

                  The database setting, SET DATABASE SQL REGULAR NAMES FALSE can be used to relax the rules for regular identifier. With this setting, an underscore character can appear at the start of the regular identifier, and the dollar sign character can be used in the identifier.

                  A <SQL language identifier> is similar to <regular identifier> but the letters can range only from A-Z in the ASCII character set. This type of identifier is used for names of CHARACTER SET objects.

                  If the character sequence of a delimited identifier is the same as an undelimited identifier, it represents the same identifier. For example "JOHN" is the same identifier as JOHN. In a <regular identifier> the case-normal form is considered for comparison. This form consists of the upper-case equivalent of all the letters. When a database object is created with one of the CREATE statements or renamed with the ALTER statement, if the name is enclosed in double quotes, the exact name is used as the case-normal form. But if it is not enclosed in double quotes, the name is converted to uppercase and this uppercase version is stored in the database as the case-normal form.

                  The character sequence length of all identifiers must be between 1 and 128 characters.

                  A reserved word is one that is used by the SQL Standard for special purposes. It is similar to a <regular identifier> but it cannot be used as an identifier for user objects. If a reserved word is enclosed in double quote characters, it becomes a quoted identifier and can be used for database objects.

                  Case sensitivity rules for identifiers can be described simply as follows:

                  • all parts of SQL statements are converted to upper case before processing, except identifiers in double quotes and strings in single quotes

                  • identifiers, both unquoted and double quoted, are then treated as case-sensitive

                  • most database engines follow the same rule, except MySQL, and in some respects, MS SQLServer.

                  CASCADE or RESTRICT

                  drop behavior

                  <drop behavior> ::= CASCADE | RESTRICT

                  The <drop behavior> is a required element of statements that drop a SCHEMA or a schema object. If <drop behavior> is not specified then RESTRICT is implicit. It determines the effect of the statement if there are other objects in the catalog that reference the SCHEMA or the schema object. If RESTRICT is specified, the statement fails if there are referencing objects. If CASCADE is specified, all the referencing objects are modified or dropped with cascading effect. Whether a referencing object is modified or dropped, depends on the kind of schema object that is dropped.

                  IF EXISTS

                  drop condition (HyperSQL)

                  <if exists clause> ::= IF EXISTS

                  This clause is not part of the SQL standard and is a HyperSQL extension to some commands that drop objects (schemas, tables, views, sequences and indexes). If it is specified, then the statement does not return an error if the drop statement is issued on a non-existent object.

                  SPECIFIC

                  specific routine designator

                  <specific routine designator> ::= SPECIFIC <routine type> <specific name>

                  <routine type> ::= ROUTINE | FUNCTION | PROCEDURE

                  This clause is used in statements that need to specify one of the multiple versions of an overloaded routine. The <specific name> is the one specified in the <routine definition> statement.

                  Renaming Objects

                  RENAME

                  rename statement (HyperSQL)

                  <rename statement> ::= ALTER <object type> <name> RENAME TO <new name>

                  <object type> ::= CATALOG | SCHEMA | DOMAIN | TYPE | TABLE | CONSTRAINT | INDEX | ROUTINE | SPECIFIC ROUTINE

                  <column rename statement> ::= ALTER TABLE <table name> ALTER COLUMN <name> RENAME TO <new name>

                  This statement is used to rename an existing object. It is not part of the SQL Standard. The specified <name> is the existing name, which can be qualified with a schema name, while the <new name> is the new name for the object.

                  Commenting Objects

                  COMMENT

                  comment statement (HyperSQL)

                  <comment statement> ::= COMMENT ON { TABLE | COLUMN | ROUTINE } <name> IS <character string literal>

                  Adds a comment to the object metadata, which can later be read from an INFORMATION_SCHEMA view. This command is not part of the SQL Standard. The strange syntax is due to compatibility with other database engines that support the statement. The <name> is the name of a table, view, column or routine. The name of the column consists of dot-separated <table name> . <column name>. The name of the table, view or routine can be a simple name. All names can be qualified with a schema name. If there is already a comment on the object, the new comment will replace it.

                  The comments appear in the results returned by JDBC DatabaseMetaData methods, getTables() and getColumns(). The INFORMATION_SCHEMA.SYSTEM_COMMENTS view contains the comments. You can query this view using the schema, table, and column names to retrieve the comments.

                  Schema Creation

                  CREATE SCHEMA

                  schema definition

                  The CREATE_SCHEMA or DBA role is required in order to create a schema. A schema can be created with or without schema objects. Schema objects can always be added after creating the schema, or existing ones can be dropped. Within the <schema definition> statement, all schema object creation takes place inside the newly created schema. Therefore, if a schema name is specified for the schema objects, the name must match that of the new schema. In addition to statements for creating schema objects, the statement can include instances of <grant statement> and <role definition>. This is a curious aspect of the SQL standard, as these elements do not really belong to schema creation.

                  <schema definition> ::= CREATE SCHEMA <schema name clause> [ <schema character set specification> ] [ <schema element>... ]

                  <schema name clause> ::= <schema name> | AUTHORIZATION <authorization identifier> | <schema name> AUTHORIZATION <authorization identifier>

                  If the name of the schema is specified simply as <schema name>, then the AUTHORIZATION is the current user. Otherwise, the specified <authorization identifier> is used as the AUTHORIZATION for the schema. If <schema name> is omitted, then the name of the schema is the same as the specified <authorization identifier>.

                  <schema element> ::= <table definition> | <view definition> | <domain definition> | <character set definition> | <collation definition> | <transliteration definition> | <assertion definition> | <trigger definition> | <user-defined type definition> | <user-defined cast definition> | <user-defined ordering definition> | <transform definition> | <schema routine> | <sequence generator definition> | <grant statement> | <role definition>

                  An example of the command is given below. Note that a single semicolon appears at the end, there should be no semicolon between the statements:

                      CREATE SCHEMA ACCOUNTS AUTHORIZATION DBA
                          CREATE TABLE AB(A INTEGER, ...)
                          CREATE TABLE CD(C CHAR(10), ...)
                          CREATE VIEW VI AS SELECT ...
                          GRANT SELECT ON AB TO PUBLIC
                          GRANT SELECT ON CD TO JOE;
                  

                  It is not really necessary to create a schema and all its objects as one command. The schema can be created first, and its objects can be created one by one.

                  DROP SCHEMA

                  drop schema statement

                  <drop schema statement> ::= DROP SCHEMA [ IF EXISTS ] <schema name> [ IF EXISTS ] <drop behavior>

                  This command destroys an existing schema. If <drop behavior> is RESTRICT, the schema must be empty, otherwise an error is raised. If CASCADE is specified, then all the objects contained in the schema are destroyed with a CASCADE option.

                  Table Creation

                  CREATE TABLE

                  table definition

                  <table definition> ::= CREATE [ { <table scope> | <table type> } ] TABLE <table name> <table contents source> [ ON COMMIT { PRESERVE | DELETE } ROWS ]

                  <table scope> ::= { GLOBAL | LOCAL } TEMPORARY

                  <table type> :: = MEMORY | CACHED

                  <table contents source> ::= <table element list> | <as subquery clause>

                  <table element list> ::= <left paren> <table element> [ { <comma> <table element> }... ] <right paren>

                  <table element> ::= <column definition> | <table constraint definition> | <like clause>

                  like clause

                  A <like clause> copies all column definitions from another table into the newly created table. Its three options indicate if the <default clause>, <identity column specification> and <generation clause> associated with the column definitions are copied or not. If an option is not specified, it defaults to EXCLUDING. The <generation clause> refers to columns that are generated by an expression but not to identity columns. All NOT NULL constraints are copied with the original columns, other constraints are not. The <like clause> can be used multiple times, allowing the new table to have copies of the column definitions of one or more other tables.

                  CREATE TABLE t (id INTEGER PRIMARY KEY, LIKE atable INCLUDING DEFAULTS EXCLUDING IDENTITY)
                  

                  <like clause> ::= LIKE <table name> [ <like options> ]

                  <like options> ::= <like option>...

                  <like option> ::= <identity option> | <column default option> | <generation option>

                  <identity option> ::= INCLUDING IDENTITY | EXCLUDING IDENTITY

                  <column default option> ::= INCLUDING DEFAULTS | EXCLUDING DEFAULTS

                  <generation option> ::= INCLUDING GENERATED | EXCLUDING GENERATED

                  as subquery clause

                  <as subquery clause> ::= [ <left paren> <column name list> <right paren> ] AS <table subquery> { WITH NO DATA | WITH DATA }

                  An <as subquery clause> used in table definition creates a table based on a <table subquery>. This kind of table definition is similar to a view definition. If WITH DATA is specified, then the new table will contain the rows of data returned by the <table subquery>.

                  CREATE TABLE t (a, b, c) AS (SELECT * FROM atable) WITH DATA
                  

                  column definition

                  A column definition consists of a <column name> and in most cases a <data type> or <domain name> as minimum. The other elements of <column definition> are optional. Each <column name> in a table is unique.

                  <column definition> ::= <column name> [ <data type or domain name> ] [ <default clause> | <identity column specification> | <identity column sequence specification> | <generation clause> ] [ <column constraint definition>... ] [ <collate clause> ]

                  <data type or domain name> ::= <data type> | <domain name>

                  <column constraint definition> ::= [ <constraint name definition> ] <column constraint> [ <constraint characteristics> ]

                  <column constraint> ::= NOT NULL | <unique specification> | <references specification> | <check constraint definition>

                  A <column constraint definition> is a shortcut for a <table constraint definition>. A constraint that is defined in this way is automatically turned into a table constraint. A name is automatically generated for the constraint and assigned to it.

                  If a <collate clause> is specified, then a UNIQUE or PRIMARY KEY constraint or an INDEX on the column will use the specified collation. Otherwise the default collation for the database is used.

                  generated columns

                  The value of a column can be autogenerated in two ways.

                  One way is specific to columns of integral types (INTEGER, BIGINT, etc.) and associates a sequence generator with the column. When a new row is inserted into the table, the value of the column is generated as the next available value in the sequence.

                  The SQL Standard supports the use of unnamed sequences with the IDENTITY keyword. In addition, HyperSQL supports the use of a named SEQUENCE object, which must be in the same schema as the table.

                  <identity column specification> ::= GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ <left paren> <common sequence generator options> <right paren> ]

                  <identity column sequence specification ::= GENERATED BY DEFAULT AS SEQUENCE <sequence name>

                  The <identity column specification> or <identity column sequence specification> can be specified for only a single column of the table.

                  The <identity column specification> is used for columns which represent values based on an unnamed sequence generator. It is possible to insert a row into the table without specifying a value for the column. The value is then generated by the sequence generators according to its rules. An identity column may or may not be the primary key. Example below:

                  CREATE TABLE t (id INTEGER GENERATED ALWAYS AS IDENTITY(START WITH 100), name VARCHAR(20) PRIMARY KEY)
                  

                  The <identity column sequence specification> is used when the column values are based on a named SEQUENCE object (which must already exist). Example below:

                  CREATE TABLE t (id INTEGER GENERATED BY DEFAULT AS SEQUENCE s, name VARCHAR(20) PRIMARY KEY)
                  

                  Inserting rows is done in the same way for a named or unnamed sequence generator. In both cases, if no value is specified to be inserted, or the DEFAULT keyword is used for the column, the value is generated by the sequence generator. If a value is specified, this value is used if the column definition has the BY DEFAULT specification. If the column definition has the ALWAYS specification, a value can be specified but the OVERRIDING SYSTEM VALUES must be specified in the INSERT statement.

                  The other way in which the column value is autogenerated is by using the values of other columns in the same row. This method is often used to create an index on a value that is derived from other column values.

                  <generation clause> ::= GENERATED ALWAYS AS <generation expression>

                  <generation expression> ::= <left paren> <value expression> <right paren>

                  The <generation clause> is used for special columns which represent values based on the values held in other columns in the same row. The <value expression> must reference only other, non-generated, columns of the table in the same row. Any function used in the expression must be deterministic and must not access SQL-data. No <query expression> is allowed. When <generation clause> is used, <data type> must be specified.

                  A generated column can be part of a foreign key or unique constraints or a column of an index. This capability is the main reason for using generated columns. A generated column may contain a formula that computes a value based on the values of other columns. Fast searches of the computed value can be performed when an index is declared on the generated column. Or the computed values can be declared to be unique, using a UNIQUE constraint on the table. The computed column cannot be overridden by user supplied values. When a row is updated and the column values change, the generated columns are computed with the new values.

                  When a row is inserted into a table, or an existing row is updated, no value except DEFAULT can be specified for a generated column. In the example below, data is inserted into the non-generated columns and the generated column will contain 'Felix the Cat' or 'Pink Panther'.

                  CREATE TABLE t (id INTEGER PRIMARY KEY, 
                     firstname VARCHAR(20),
                     lastname VARCHAR(20), 
                     fullname VARCHAR(40) GENERATED ALWAYS AS (firstname || ' ' || lastname)) 
                  INSERT INTO t (id, firstname, lastname) VALUES (1, 'Felix', 'the Cat')
                  INSERT INTO t (id, firstname, lastname, fullname) VALUES (2, 'Pink', 'Panther', DEFAULT)
                  

                  DEFAULT

                  default clause

                  A default clause can be used if GENERATED is not specified. If a column has a <default clause> then it is possible to insert a row into the table without specifying a value for the column.

                  <default clause> ::= DEFAULT <default option>

                  <default option> ::= <literal> | <datetime value function> | USER | CURRENT_USER | CURRENT_ROLE | SESSION_USER | SYSTEM_USER | CURRENT_CATALOG | CURRENT_SCHEMA | CURRENT_PATH | NULL

                  The type of the <default option> must match the type of the column.

                  In PGS (PostgreSQL) compatibility mode, a NEXTVAL function can be used. Also, in MSS compatibility mode, the default value can be enclosed in parentheses.

                  CONSTRAINT

                  constraint name and characteristics

                  <constraint name definition> ::= CONSTRAINT <constraint name>

                  <constraint characteristics> ::= <constraint check time> [ [ NOT ] DEFERRABLE [ <constraint check time> ] ]

                  <constraint check time> ::= INITIALLY DEFERRED | INITIALLY IMMEDIATE

                  Specify the name of a constraint and its characteristics. By default the constraint is NOT DEFERRABLE and INITIALLY IMMEDIATE. This means the constraint is enforced as soon as a data change statement is executed. If INITIALLY DEFERRED is specified, then the constraint is enforced when the session commits. The characteristics must be compatible. The constraint check time can be changed temporarily for an SQL session. HyperSQL does not support deferring constraint enforcement. This feature of the SQL Standard has been criticised because it allows a session to read uncommitted data that violates database integrity constraints but has not yet been checked.

                  CONSTRAINT

                  table constraint definition

                  <table constraint definition> ::= [ <constraint name definition> ] <table constraint> [ <constraint characteristics> ]

                  <table constraint> ::= <unique constraint definition> | <referential constraint definition> | <check constraint definition>

                  Three kinds of constraint can be defined on a table: UNIQUE (including PRIMARY KEY), FOREIGN KEY and CHECK. Each kind has its own rules to limit the values that can be specified for different columns in each row of the table.

                  UNIQUE

                  unique constraint definition

                  <unique constraint definition> ::= <unique specification> <left paren> <unique column list> <right paren> | UNIQUE ( VALUE )

                  <unique specification> ::= UNIQUE | PRIMARY KEY

                  <unique column list> ::= <column name list>

                  A unique constraint is specified on a single column or on multiple columns. On each set of columns taken together, only one UNIQUE constraint can be specified. Each column of a PRIMARY KEY constraint has an implicit NOT NULL constraint.

                  If UNIQUE( VALUE ) is specified, the constraint created on all columns of the table.

                  FOREIGN KEY

                  referential constraint definition

                  <referential constraint definition> ::= FOREIGN KEY <left paren> <referencing columns> <right paren> <references specification>

                  <references specification> ::= REFERENCES <referenced table and columns> [ MATCH <match type> ] [ <referential triggered action> ]

                  <match type> ::= FULL | PARTIAL | SIMPLE

                  <referencing columns> ::= <reference column list>

                  <referenced table and columns> ::= <table name> [ <left paren> <reference column list> <right paren> ]

                  <reference column list> ::= <column name list>

                  <referential triggered action> ::= <update rule> [ <delete rule> ] | <delete rule> [ <update rule> ]

                  <update rule> ::= ON UPDATE <referential action>

                  <delete rule> ::= ON DELETE <referential action>

                  <referential action> ::= CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION

                  A referential constraint allows links to be established between the rows of two tables. The specified list of <referencing columns> corresponds one by one to the columns of the specified list of <referenced columns> in another table (or sometimes in the same table). For each row in the table, a row must exist in the referenced table with equivalent values in the two column lists. There must exist a single unique constraint in the referenced table on all the <referenced columns>.

                  The [ MATCH match type ] clause is optional and has an effect only on multi-column foreign keys and only on rows containing at least a NULL in one of the <referencing columns>. If the clause is not specified, MATCH SIMPLE is the default. If MATCH SIMPLE is specified, then any NULL means the row can exist (without a corresponding row in the referenced table). If MATCH FULL is specified then either all the column values must be NULL or none of them. MATCH PARTIAL allows any NULL but the non NULL values must match those of a row in the referenced table. HyperSQL does not support MATCH PARTIAL.

                  Referential actions are specified with ON UPDATE and ON DELETE clauses. These actions take place when a row in the referenced table (the parent table) has referencing rows in the referencing table and it is deleted or modified with any SQL statement. The default is NO ACTION. This means the SQL statement that causes the DELETE or UPDATE is terminated with an exception. The RESTRICT option is similar and works exactly the same without deferrable constraints (which are not allowed by HyperSQL). The other three options, CASCADE, SET NULL and SET DEFAULT all allow the DELETE or UPDATE statement to complete. With DELETE statements the CASCADE option results in the referencing rows to be deleted. With UPDATE statements, the changes to the values of the referenced columns are copied to the referencing rows. With both DELETE or UPDATE statement, the SET NULL option results in the columns of the referencing rows to be set to NULL. Similarly, the SET DEFAULT option results in the columns of the referencing rows to be set to their default values.

                  CHECK

                  check constraint definition

                  <check constraint definition> ::= CHECK <left paren> <search condition> <right paren>

                  A CHECK constraint can exist for a TABLE or for a DOMAIN. The <search condition> evaluates to an SQL BOOLEAN value for each row of the table. Within the <search condition> all columns of the table row can be referenced. For all rows of the table, the <search condition> evaluates to TRUE or UNKNOWN. When a new row is inserted, or an existing row is updated, the <search condition> is evaluated and if it is FALSE, the insert or update fails.

                  A CHECK constraint for a DOMAIN is similar. In its <search condition>, the term VALUE is used to represents the value to which the DOMAIN applies.

                  CREATE TABLE t (a VARCHAR(20) CHECK (a IS NOT NULL AND CHARACTER_LENGTH(a) > 2))
                  

                  The search condition of a CHECK constraint cannot contain any function that is not deterministic. A check constraint is a data integrity constraint, therefore it must hold with respect to the rest of the data in the database. It cannot use values that are temporal or ephemeral. For example CURRENT_USER is a function that returns different values depending on who is using the database, or CURRENT_DATE changes day-to-day. Some temporal expressions are retrospectively deterministic and are allowed in check constraints. For example, (CHECK VALUE < CURRENT_DATE) is valid, because CURRENT_DATE will not move backwards in time, but (CHECK VALUE > CURRENT_DATE) is not acceptable.

                  If you want to enforce the condition that a date value that is inserted into the database belongs to the future (at the time of insertion), or any similar constraint, then use a TRIGGER with the desired condition.

                  DROP TABLE

                  drop table statement

                  <drop table statement> ::= DROP TABLE [ IF EXISTS ] <table name> [ IF EXISTS ] <drop behavior>

                  Destroy a table. The default drop behaviour is RESTRICT and will cause the statement to fail if there is any view, routine or foreign key constraint that references the table. If <drop behavior> is CASCADE, it causes all schema objects that reference the table to drop. Referencing views are dropped. In the case of foreign key constraints that reference the table, the constraint is dropped, rather than the TABLE or DOMAIN that contains it.

                  Table Manipulation

                  Table manipulation statements change the attributes of tables or modify the objects such as columns and constraints.

                  SET TABLE CLUSTERED

                  set table clustered property

                  <set table clustered statement> ::= SET TABLE <table name> CLUSTERED ON <left paren> <column name list> <right paren>

                  Set the row clustering property of a table. The <column name list> is a list of column names that must correspond to the columns of an existing PRIMARY KEY, UNIQUE or FOREIGN KEY index, or to the columns of a user defined index. This statement is only valid for CACHED or TEXT tables.

                  Tables rows are stored in the database files as they are created, sometimes at the end of the file, sometimes in the middle of the file. After a CHECKPOINT DEFRAG or SHUTDOWN COMPACT, the rows are reordered according to the primary key of the table, or if there is no primary key, in no particular order.

                  When several consecutive rows of a table are retrieved during query execution it is more efficient to retrieve rows that are stored adjacent to one another. After executing this command, nothing changes until a CHECKPOINT DEFRAG or SHUTDOWN COMPACT or SHUTDOWN SCRIPT is performed. After these operations, the rows are stored in the specified clustered order. The property is stored in the database and applies to all future reordering of rows. Note that if extensive inserts or updates are performed on the tables, the rows will get out of order until the next reordering.

                  SET TABLE TYPE

                  set table type

                  <set table type statement> ::= SET TABLE <table name> TYPE { MEMORY | CACHED }

                  Changes the storage type of an existing table between CACHED and MEMORY types.

                  Only a user with the DBA role can execute this statement.

                  SET TABLE writeability

                  set table write property

                  <set table read only statement> ::= SET TABLE <table name> { READ ONLY | READ WRITE }

                  Set the writeability property of a table. Tables are writeable by default. This statement can be used to change the property between READ ONLY and READ WRITE. This is a feature of HyperSQL.

                  SET TABLE SOURCE

                  set table source statement

                  <set table source statement> ::= SET TABLE <table name> SOURCE <file and options> [DESC]

                  <file and options>::= <doublequote> <file path> [<semicolon> <property>...] <doublequote>

                  Set the text source for a text table. This statement cannot be used for tables that are not defined as TEXT TABLE.

                  Supported Properties

                  quoted = { true | false }

                  default is true. If false, treats double quotes as normal characters

                  all_quoted = { true | false }

                  default is false. If true, adds double quotes around all fields.

                  encoding = <encoding name>

                  character encoding for text and character fields, for example, encoding=UTF-8

                  ignore_first = { true | false }

                  default is false. If true ignores the first line of the file

                  cache_scale= <numeric value>

                  exponent to calculate rows of the text file in cache. Default is 8, equivalent to nearly 800 rows

                  cache_size_scale = <numeric value>r

                  exponent to calculate average size of each row in cache. Default is 8, equivalent to 256 bytes per row.

                  fs = <unquoted character>

                  field separator

                  vs = <unquoted character>

                  varchar separator

                  Special indicators for HyperSQL Text Table separators

                  \semi

                  semicolon

                  \quote

                  quote

                  \space

                  space character

                  \apos

                  apostrophe

                  \n

                  newline - Used as an end anchor (like $ in regular expressions)

                  \r

                  carriage return

                  \t

                  tab

                  \\

                  backslash

                  \u####

                  a Unicode character specified in hexadecimal

                  In the example below, the text source of the table is set to "myfile", the field separator to the pipe symbol, and the long varchar separator to the tilde symbol.

                      SET TABLE mytable SOURCE 'myfile;fs=|;vs=.;lvs=~'

                  Only a user with the DBA role can execute this statement.

                  SET TABLE SOURCE HEADER

                  set table source header statement

                  <set table source header statement> ::= SET TABLE <table name> SOURCE HEADER <header string>

                  Set the header for the text source for a text table. If this command is used, the <header string> is used as the first line of the source file of the text table. This line is not part of the table data. Only a user with the DBA role can execute this statement.

                  SET TABLE SOURCE on-off

                  set table source on-off statement

                  <set table source on-off statement> ::= SET TABLE <table name> SOURCE { ON | OFF }

                  Attach or detach a text table from its text source. This command does not change the properties or the name of the file that is the source of a text table. When OFF is specified, the command detaches the table from its source and closes the file for the source. In this state, it is not possible to read or write to the table. This allows the user to replace the file with a different file, or delete it. When ON is specified, the source file is read. Only a user with the DBA role can execute this statement

                  ALTER TABLE

                  alter table statement

                  <alter table statement> ::= ALTER TABLE <table name> <alter table action>

                  <alter table action> ::= <add column definition> | <alter column definition> | <drop column definition> | <add table constraint definition> | <drop table constraint definition>

                  Change the definition of a table. Specific types of this statement are covered below.

                  ADD COLUMN

                  add column definition

                  <add column definition> ::= ADD [ COLUMN ] <column definition> [ BEFORE <other column name> ]

                  Add a column to an existing table. The <column definition> is specified the same way as it is used in <table definition>. HyperSQL allows the use of [ BEFORE <other column name> ] to specify at which position the new column is added to the table.

                  If the table contains rows, the new column must have a <default clause> or use one of the forms of GENERATED. The column values for each row is then filled with the result of the <default clause> or the generated value.

                  DROP COLUMN

                  drop column definition

                  <drop column definition> ::= DROP [ COLUMN ] <column name> <drop behavior>

                  Destroy a column of a base table. The <drop behavior> is either RESTRICT or CASCADE. If the column is referenced in a table constraint that references other columns as well as this column, or if the column is referenced in a VIEW, or the column is referenced in a TRIGGER, then the statement will fail if RESTRICT is specified. If CASCADE is specified, then any CONSTRAINT, VIEW or TRIGGER object that references the column is dropped with a cascading effect.

                  ADD CONSTRAINT

                  add table constraint definition

                  <add table constraint definition> ::= ADD <table constraint definition>

                  Add a constraint to a table. The existing rows of the table must conform to the added constraint, otherwise the statement will not succeed.

                  DROP CONSTRAINT

                  drop table constraint definition

                  <drop table constraint definition> ::= DROP CONSTRAINT <constraint name> <drop behavior>

                  Destroy a constraint on a table. The <drop behavior> has an effect only on UNIQUE and PRIMARY KEY constraints. If such a constraint is referenced by a FOREIGN KEY constraint, the FOREIGN KEY constraint will be dropped if CASCADE is specified. If the columns of such a constraint are used in a GROUP BY clause in the query expression of a VIEW or another kind of schema object, and a functional dependency relationship exists between these columns and the other columns in that query expression, then the VIEW or other schema object will be dropped when CASCADE is specified.

                  ALTER COLUMN

                  alter column definition

                  <alter column definition> ::= ALTER [ COLUMN ] <column name> <alter column action>

                  <alter column action> ::= <set column default clause> | <drop column default clause> | <alter column data type clause> | <alter identity column specification> | <alter column nullability> | <alter column name> | <add column identity specification> | <drop column identity specification>

                  Change a column and its definition. Specific types of this statement are covered below. See also the RENAME statement above.

                  SET DEFAULT

                  set column default clause

                  <set column default clause> ::= SET <default clause>

                  Set the default clause for a column. This can be used if the column is not defined as GENERATED.

                  DROP DEFAULT

                  drop column default clause

                  <drop column default clause> ::= DROP DEFAULT

                  Drop the default clause from a column.

                  SET DATA TYPE

                  alter column data type clause

                  <alter column data type clause> ::= SET DATA TYPE <data type>

                  Change the declared type of a column. The (proposed) SQL Standard allows only changes to type properties such as maximum length, precision, or scale, and only changes that cause the property to enlarge. HyperSQL allows changing the type if all the existing values can be cast into the new type without string truncation or loss of significant digits.

                  alter column add identity generator

                  alter column add identity generator

                  <add column identity generator> ::= <identity column specification>

                  Adds an identity specification to the column. The type of the column must be an integral type and the existing values must not include nulls. This option is specific to HyperSQL

                    ALTER TABLE mytable ALTER COLUMN id GENERATED ALWAYS AS IDENTITY (START WITH 20000)

                  alter column identity generator

                  alter identity column specification

                  <alter identity column specification> ::= <alter identity column option>...

                  <alter identity column option> ::= <alter sequence generator restart option> | SET <basic sequence generator option>

                  Change the properties of an identity column. This command is similar to the commands used for changing the properties of named SEQUENCE objects discussed earlier and can use the same options.

                    ALTER TABLE mytable ALTER COLUMN id RESTART WITH 1000
                    ALTER TABLE mytable ALTER COLUMN id SET INCREMENT BY 5
                  

                  DROP GENERATED

                  drop column identity generator

                  <drop column identity specification> ::= DROP GENERATED

                  Removes the identity generator from a column. After executing this statement, the column values are no longer generated automatically. This option is specific to HyperSQL

                    ALTER TABLE mytable ALTER COLUMN id DROP GENERATED
                  

                  SET [ NOT ] NULL

                  alter column nullability

                  <alter column nullability> ::= SET [ NOT ] NULL

                  Adds or removes a NOT NULL constraint from a column. This option is specific to HyperSQL

                  View Creation and Manipulation

                  CREATE VIEW

                  view definition

                  <view definition> ::= CREATE VIEW <table name> <view specification> AS <query expression> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

                  <view specification> ::= [ <left paren> <view column list> <right paren> ]

                  <view column list> ::= <column name list>

                  Define a view. The <query expression> is a SELECT or similar statement. The <view column list> is the list of unique names for the columns of the view. The number of columns in the <view column list> must match the number of columns returned by the <query expression>. If <view column list> is not specified, then the columns of the <query expression> should have unique names and are used as the names of the view column.

                  Some views are updatable. As covered elsewhere, an updatable view is based on a single table or updatable view. For updatable views, the optional CHECK OPTION clause can be specified. If this option is specified, then if a row of the view is updated or a new row is inserted into the view, then it should contain such values that the row would be included in the view after the change. If WITH CASCADED CHECK OPTION is specified, then if the <query expression> of the view references another view, then the search condition of the underlying view should also be satisfied by the update or insert operation.

                  DROP VIEW

                  drop view statement

                  <drop view statement> ::= DROP VIEW [ IF EXISTS ] <table name> [ IF EXISTS ] <drop behavior>

                  Destroy a view. The <drop behavior> is similar to dropping a table.

                  ALTER VIEW

                  alter view statement

                  <alter view statement> ::= ALTER VIEW <table name> <view specification> AS <query expression> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

                  Alter a view. The statement is otherwise identical to CREATE VIEW. The new definition replaces the old. If there are database objects such as routines or views that reference the view, then these objects are recompiled with the new view definition. If the new definition is not compatible, the statement fails.

                  Domain Creation and Manipulation

                  CREATE DOMAIN

                  domain definition

                  <domain definition> ::= CREATE DOMAIN <domain name> [ AS ] <predefined type> [ <default clause> ] [ <domain constraint>... ] [ <collate clause> ]

                  <domain constraint> ::= [ <constraint name definition> ] <check constraint definition> [ <constraint characteristics> ]

                  Define a domain. Although a DOMAIN is not strictly a type in the SQL Standard, it can be informally considered as a type. A DOMAIN is based on a <predefined type>, which is a base type defined by the Standard. It can have a <default clause>, similar to a column default clause. It can also have one or more CHECK constraints which limit the values that can be assigned to a column or variable that has the DOMAIN as its type.

                  CREATE DOMAIN valid_string AS VARCHAR(20) DEFAULT 'NO VALUE' CHECK (value IS NOT NULL AND CHARACTER_LENGTH(value) > 2) 
                  

                  ALTER DOMAIN

                  alter domain statement

                  <alter domain statement> ::= ALTER DOMAIN <domain name> <alter domain action>

                  <alter domain action> ::= <set domain default clause> | <drop domain default clause> | <add domain constraint definition> | <drop domain constraint definition>

                  Change a domain and its definition.

                  SET DEFAULT

                  set domain default clause

                  <set domain default clause> ::= SET <default clause>

                  Set the default value in a domain.

                  DROP DEFAULT

                  drop domain default clause

                  <drop domain default clause> ::= DROP DEFAULT

                  Remove the default clause of a domain.

                  ADD CONSTRAINT

                  add domain constraint definition

                  <add domain constraint definition> ::= ADD <domain constraint>

                  Add a constraint to a domain.

                  DROP CONSTRAINT

                  drop domain constraint definition

                  <drop domain constraint definition> ::= DROP CONSTRAINT <constraint name>

                  Destroy a constraint on a domain. If the <drop behavior> is CASCADE, and the constraint is a UNIQUE constraint which is referenced by a FOREIGN KEY constraint on another table, then the FOREIGN KEY constraint is also dropped.

                  DROP DOMAIN

                  drop domain statement

                  <drop domain statement> ::= DROP DOMAIN <domain name> <drop behavior>

                  Destroy a domain. If <drop behavior> is CASCADE, it works differently from most other objects. If a table features a column of the specified DOMAIN, the column survives and inherits the DEFAULT CLAUSE, and the CHECK CONSTRAINT of the DOMAIN.

                  Trigger Creation

                  CREATE TRIGGER

                  trigger definition

                  <trigger definition> ::= CREATE TRIGGER <trigger name> <trigger action time> <trigger event> ON <table name> [ REFERENCING <transition table or variable list> ] <triggered action>

                  <trigger action time> ::= BEFORE | AFTER | INSTEAD OF

                  <trigger event> ::= INSERT | DELETE | UPDATE [ OF <trigger column list> ]

                  <trigger column list> ::= <column name list>

                  <triggered action> ::= [ FOR EACH { ROW | STATEMENT } ] [ <triggered when clause> ] <triggered SQL statement>

                  <triggered when clause> ::= WHEN <left paren> <search condition> <right paren>

                  <triggered SQL statement> ::= <SQL procedure statement> | BEGIN ATOMIC { <SQL procedure statement> <semicolon> }... END | [QUEUE <integer literal>] [NOWAIT] CALL <HSQLDB trigger class FQN>

                  <transition table or variable list> ::= <transition table or variable>...

                  <transition table or variable> ::= OLD [ ROW ] [ AS ] <old transition variable name> | NEW [ ROW ] [ AS ] <new transition variable name> | OLD TABLE [ AS ] <old transition table name> | NEW TABLE [ AS ] <new transition table name>

                  <old transition table name> ::= <transition table name>

                  <new transition table name> ::= <transition table name>

                  <transition table name> ::= <identifier>

                  <old transition variable name> ::= <correlation name>

                  <new transition variable name> ::= <correlation name>

                  Trigger definition is a relatively complex statement. The combination of <trigger action time> and <trigger event> determines the type of the trigger. Examples include BEFORE DELETE, AFTER UPDATE, INSTEAD OF INSERT. If the optional [ OF <trigger column list> ] is specified for an UPDATE trigger, then the trigger is activated only if one of the columns that is in the <trigger column list> is specified in the UPDATE statement that activates the trigger.

                  If a trigger is FOR EACH ROW, which is the default option, then the trigger is activated for each row of the table that is affected by the execution of an SQL statement. Otherwise, it is activated once only per statement execution. In the first case, there is a before and after state for each row. For UPDATE triggers, both before and after states exist, representing the row before the update, and after the update. For DELETE, triggers, there is only a before state. For INSERT triggers, there is only an after state. If a trigger is FOR EACH STATEMENT, then a transient table is created containing all the rows for the before state and another transient table is created for the after state.

                  The [ REFERENCING <transition table or variable> ] is used to give a name to the before and after data row or table. This name can be referenced in the <SQL procedure statement> to access the data.

                  The optional <triggered when clause> is a search condition, similar to the search condition of a DELETE or UPDATE statement. If the search condition is not TRUE for a row, then the trigger is not activated for that row.

                  The <SQL procedure statement> is limited to INSERT, DELETE, UPDATE and MERGE statements.

                  The <HSQLDB trigger class FQN> is a delimited identifier that contains the fully qualified name of a Java class that implements the org.hsqldb.Trigger interface.

                  Early releases of HyperSQL version 2.0 do not allow the use of OLD TABLE or NEW TABLE in statement level trigger definitions.

                  DROP TRIGGER

                  drop trigger statement

                  <drop trigger statement> ::= DROP TRIGGER <trigger name>

                  Destroy a trigger.

                  Routine Creation

                  schema routine

                  SQL-invoked routine

                  <SQL-invoked routine> ::= <schema routine>

                  <schema routine> ::= <schema procedure> | <schema function>

                  <schema procedure> ::= CREATE <SQL-invoked procedure>

                  <schema function> ::= CREATE <SQL-invoked function>

                  <SQL-invoked procedure> ::= PROCEDURE <schema qualified routine name> <SQL parameter declaration list> <routine characteristics> <routine body>

                  <SQL-invoked function> ::= { <function specification> | <method specification designator> } <routine body>

                  <SQL parameter declaration list> ::= <left paren> [ <SQL parameter declaration> [ { <comma> <SQL parameter declaration> }... ] ] <right paren>

                  <SQL parameter declaration> ::= [ <parameter mode> ] [ <SQL parameter name> ] <parameter type> [ RESULT ]

                  <parameter mode> ::= IN | OUT | INOUT

                  <parameter type> ::= <data type>

                  <function specification> ::= FUNCTION <schema qualified routine name> <SQL parameter declaration list> <returns clause> <routine characteristics> [ <dispatch clause> ]

                  <method specification designator> ::= SPECIFIC METHOD <specific method name> | [ INSTANCE | STATIC | CONSTRUCTOR ] METHOD <method name> <SQL parameter declaration list> [ <returns clause> ] FOR <schema-resolved user-defined type name>

                  <routine characteristics> ::= [ <routine characteristic>... ]

                  <routine characteristic> ::= <language clause> | <parameter style clause> | SPECIFIC <specific name> | <deterministic characteristic> | <SQL-data access indication> | <null-call clause> | <returned result sets characteristic> | <savepoint level indication>

                  <savepoint level indication> ::= NEW SAVEPOINT LEVEL | OLD SAVEPOINT LEVEL

                  <returned result sets characteristic> ::= DYNAMIC RESULT SETS <maximum returned result sets>

                  <parameter style clause> ::= PARAMETER STYLE <parameter style>

                  <dispatch clause> ::= STATIC DISPATCH

                  <returns clause> ::= RETURNS <returns type>

                  <returns type> ::= <returns data type> [ <result cast> ] | <returns table type>

                  <returns table type> ::= TABLE <table function column list>

                  <table function column list> ::= <left paren> <table function column list element> [ { <comma> <table function column list element> }... ] <right paren>

                  <table function column list element> ::= <column name> <data type>

                  <result cast> ::= CAST FROM <result cast from type>

                  <result cast from type> ::= <data type> [ <locator indication> ]

                  <returns data type> ::= <data type> [ <locator indication> ]

                  <routine body> ::= <SQL routine spec> | <external body reference>

                  <SQL routine spec> ::= [ <rights clause> ] <SQL routine body>

                  <rights clause> ::= SQL SECURITY INVOKER | SQL SECURITY DEFINER

                  <SQL routine body> ::= <SQL procedure statement>

                  <external body reference> ::= EXTERNAL [ NAME <external routine name> ] [ <parameter style clause> ]

                  <parameter style> ::= SQL | GENERAL

                  <deterministic characteristic> ::= DETERMINISTIC | NOT DETERMINISTIC

                  <SQL-data access indication> ::= NO SQL | CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA

                  <null-call clause> ::= RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT

                  <maximum returned result sets> ::= <unsigned integer>

                  Define an SQL-invoked routine. A few of the options are not used by HyperSQL and have default behaviours. See the SQL-Invoked Routines chapter for more details of various options and examples.

                  ALTER routine

                  alter routine statement

                  <alter routine statement> ::= ALTER <specific routine designator> [ <alter routine characteristics> ] [ RESTRICT ] <routine body>

                  <alter routine characteristics> ::= <alter routine characteristic>...

                  <alter routine characteristic> ::= <language clause> | <parameter style clause> | <SQL-data access indication> | <null-call clause> | <returned result sets characteristic>

                  <alter routine body> ::= <SQL routine body>

                  Alter the characteristic and the body of an SQL-invoked routine. If RESTRICT is specified and the routine is already used in a a different routine or view definition, an exception is raised. Altering the routine changes the implementation without changing the parameters. Defining recursive SQL/PSM SQL functions is only possible by altering a non-recursive routine body. An example is given in the SQL-Invoked Routines chapter.

                  An example is given below for a function defined as a Java method, then redefined as an SQL function.

                  create function zero_pad(x bigint, digits int, maxsize int)
                   returns char varying(100)
                   specific zero_pad_01
                   no sql deterministic
                   language java parameter style java
                   external name 'CLASSPATH:org.hsqldb.lib.StringUtil.toZeroPaddedString';
                  
                  alter specific routine zero_pad_01
                   language sql
                   begin atomic
                   declare str varchar(128);
                   set str = cast(x as varchar(128));
                   set str = substring('0000000000000' from 1 for digits - char_length(str)) + str;
                   return str;
                   end
                  

                  DROP

                  drop routine statement

                  <drop routine statement> ::= DROP <specific routine designator> <drop behavior>

                  Destroy an SQL-invoked routine.

                  Sequence Creation

                  CREATE SEQUENCE

                  sequence generator definition

                  <sequence generator definition> ::= CREATE SEQUENCE <sequence generator name> [ <sequence generator options> ]

                  <sequence generator options> ::= <sequence generator option> ...

                  <sequence generator option> ::= <sequence generator data type option> | <common sequence generator options>

                  <common sequence generator options> ::= <common sequence generator option> ...

                  <common sequence generator option> ::= <sequence generator start with option> | <basic sequence generator option>

                  <basic sequence generator option> ::= <sequence generator increment by option> | <sequence generator maxvalue option> | <sequence generator minvalue option> | <sequence generator cycle option>

                  <sequence generator data type option> ::= AS <data type>

                  <sequence generator start with option> ::= START WITH <sequence generator start value>

                  <sequence generator start value> ::= <signed numeric literal>

                  <sequence generator increment by option> ::= INCREMENT BY <sequence generator increment>

                  <sequence generator increment> ::= <signed numeric literal>

                  <sequence generator maxvalue option> ::= MAXVALUE <sequence generator max value> | NO MAXVALUE

                  <sequence generator max value> ::= <signed numeric literal>

                  <sequence generator minvalue option> ::= MINVALUE <sequence generator min value> | NO MINVALUE

                  <sequence generator min value> ::= <signed numeric literal>

                  <sequence generator cycle option> ::= CYCLE | NO CYCLE

                  Define a named sequence generator. A SEQUENCE object generates a sequence of integers according to the specified rules. The simple definition without the options defines a sequence of numbers in INTEGER type starting at 1 and incrementing by 1. By default the CYCLE property is set and the minimum and maximum limits are the minimum and maximum limits of the type of returned values. There are self-explanatory options for changing various properties of the sequence. The MAXVALUE and MINVALUE specify the upper and lower limits. If CYCLE is specified, after the sequence returns the highest or lowest value in range, the next value will respectively be the lowest or highest value in range. If NO CYCLE is specified, the use of the sequence generator results in an error once the limit has been reached.

                  The integer types: SMALLINT, INTEGER, BIGINT, DECIMAL and NUMERIC can be used as the type of the sequence. DECIMAL and NUMERIC types must have a scale of 0 and a precision not exceeding 18.

                  ALTER SEQUENCE

                  alter sequence generator statement

                  <alter sequence generator statement> ::= ALTER SEQUENCE <sequence generator name> <alter sequence generator options>

                  <alter sequence generator options> ::= <alter sequence generator option>...

                  <alter sequence generator option> ::= <alter sequence generator restart option> | <basic sequence generator option>

                  <alter sequence generator restart option> ::= RESTART [ WITH <sequence generator restart value> ]

                  <sequence generator restart value> ::= <signed numeric literal>

                  Change the definition of a named sequence generator. The same options that are used in the definition of the SEQUENCE can be used to alter it. The exception is the option for the start value which is RESTART WITH for the ALTER SEQUENCE statement.

                  If RESTART is used by itself (without a value), then the current value of the sequence is reset to the start value. Otherwise, the current value is reset to the given restart value.

                  DROP SEQUENCE

                  drop sequence generator statement

                  <drop sequence generator statement> ::= DROP SEQUENCE [ IF EXISTS ] <sequence generator name> [ IF EXISTS ] <drop behavior>

                  Destroy an external sequence generator. If the <drop behavior> is CASCADE, then all objects that reference the sequence are dropped. These objects can be VIEW, ROUTINE or TRIGGER objects.

                  SQL Procedure Statement

                  SQL procedure statement

                  SQL procedure statement

                  The definition of CREATE TRIGGER and CREATE PROCEDURE statements refers to <SQL procedure statement>. The definition of this element is given below. However, only a subset of these statements are allowed in trigger or routine definition.

                  <SQL procedure statement> ::= <SQL executable statement>

                  <SQL executable statement> ::= <SQL schema statement> | <SQL data statement> | <SQL control statement> | <SQL transaction statement> | <SQL connection statement> | <SQL session statement> | <SQL diagnostics statement> | <SQL dynamic statement>

                  <SQL schema statement> ::= <SQL schema definition statement> | <SQL schema manipulation statement>

                  <SQL schema definition statement> ::= <schema definition> | <table definition> | <view definition> | <SQL-invoked routine> | <grant statement> | <role definition> | <domain definition> | <character set definition> | <collation definition> | <transliteration definition> | <assertion definition> | <trigger definition> | <user-defined type definition> | <user-defined cast definition> | <user-defined ordering definition> | <transform definition> | <sequence generator definition>

                  <SQL schema manipulation statement> ::= <drop schema statement> | <alter table statement> | <drop table statement> | <drop view statement> | <alter routine statement> | <drop routine statement> | <drop user-defined cast statement> | <revoke statement> | <drop role statement> | <alter domain statement> | <drop domain statement> | <drop character set statement> | <drop collation statement> | <drop transliteration statement> | <drop assertion statement> | <drop trigger statement> | <alter type statement> | <drop data type statement> | <alter sequence generator statement> | <drop sequence generator statement>

                  Other Schema Object Creation

                  CREATE INDEX

                  create index statement

                  <create index statement> ::= CREATE INDEX <index name> ON <table name> <left paren> {<column name> [ASC | DESC]}, ... <right paren>

                  Creates an index on a group of columns of a table. The optional [ASC | DESC] specifies if the column is indexed in the ascending or descending order, but has no effect on how the index is created (it is allowed for compatibility with other database engines). HyperSQL can use all indexes in ascending or descending order as needed. Indexes should not duplicate the columns of PRIMARY KEY, UNIQUE or FOREIGN key constraints as each of these constraints creates an index automatically.

                  DROP INDEX

                  drop index statement

                  <drop index statement> ::= DROP INDEX [ IF EXISTS ] <index name> [ IF EXISTS ]

                  Destroy an index.

                  ALTER INDEX

                  change the columns of an index

                  <alter index statement> ::= ALTER INDEX <index name> <left paren> {<column name>} , ... <right paren>

                  Redefine an index with a new column list. This statement is more efficient than dropping an existing index and creating a new one.

                  CREATE TYPE

                  user-defined type definition

                  <user-defined type definition> ::= CREATE TYPE <user-defined type body>

                  <user-defined type body> ::= <schema-resolved user-defined type name> [ AS <representation> ]

                  <representation> ::= <predefined type>

                  Define a user-defined type. Currently only simple distinct types can be defined without further attributes.

                  CREATE CAST

                  user-defined cast definition

                  <user-defined cast definition> ::= CREATE CAST <left paren> <source data type> AS <target data type> <right paren> WITH <cast function> [ AS ASSIGNMENT ]

                  <cast function> ::= <specific routine designator>

                  <source data type> ::= <data type>

                  <target data type> ::= <data type>

                  Define a user-defined cast. This feature may be supported in a future versions of HyperSQL.

                  DROP CAST

                  drop user-defined cast statement

                  <drop user-defined cast statement> ::= DROP CAST <left paren> <source data type> AS <target data type> <right paren> <drop behavior>

                  Destroy a user-defined cast. This feature may be supported in a future versions of HyperSQL.

                  CREATE CHARACTER SET

                  character set definition

                  <character set definition> ::= CREATE CHARACTER SET <character set name> [ AS ] <character set source> [ <collate clause> ]

                  <character set source> ::= GET <character set specification>

                  Define a character set. A new CHARACTER SET is based on an existing CHARACTER SET. The optional <collate clause> specifies the collation to be used, otherwise the collation is inherited from the default collation for the source CHARACTER SET. Currently this statement has no effect, as the character set used by HSQLDB is Unicode and there is no need for subset character sets.

                  DROP CHARACTER SET

                  drop character set statement

                  <drop character set statement> ::= DROP CHARACTER SET <character set name>

                  Destroy a character set. If the character set name is referenced in any database object, the command fails. Note that CASCADE or RESTRICT cannot be specified for this command.

                  CREATE COLLATION

                  collation definition

                  <collation definition> ::= CREATE COLLATION <collation name> FOR <character set specification> FROM <existing collation name> [ <pad characteristic> ]

                  <existing collation name> ::= <collation name>

                  <pad characteristic> ::= NO PAD | PAD SPACE

                  Define a collation. A new collation is based on an existing COLLATION and applies to an existing CHARACTER SET. The <character set specification> is always SQL_TEXT. The <existing collation name> is either SQL_TEXT or one of the language collations supported by HSQLDB. The <pad characteristic> specifies whether strings are padded with spaces for comparison.

                  This statement is typically used when a collation is required that does not pad spaces before comparing two strings. For example, CREATE COLLATION FRENCH_NOPAD FOR SQL_TEXT FROM SQL_TEXT NO PAD, results in a French collation without padding. This collation can be used for sorting or for individual columns of tables.

                  DROP COLLATION

                  drop collation statement

                  <drop collation statement> ::= DROP COLLATION <collation name> <drop behavior>

                  Destroy a collation. If the <drop behavior> is CASCADE, then all references to the collation revert to the default collation that would be in force if the dropped collation was not specified.

                  CREATE TRANSLATION

                  transliteration definition

                  <transliteration definition> ::= CREATE TRANSLATION <transliteration name> FOR <source character set specification> TO <target character set specification> FROM <transliteration source>

                  <source character set specification> ::= <character set specification>

                  <target character set specification> ::= <character set specification>

                  <transliteration source> ::= <existing transliteration name> | <transliteration routine>

                  <existing transliteration name> ::= <transliteration name>

                  <transliteration routine> ::= <specific routine designator>

                  Define a character transliteration. This feature may be supported in a future versions of HyperSQL.

                  DROP TRANSLATION

                  drop transliteration statement

                  <drop transliteration statement> ::= DROP TRANSLATION <transliteration name>

                  Destroy a character transliteration. This feature may be supported in a future versions of HyperSQL.

                  CREATE ASSERTION

                  assertion definition

                  <assertion definition> ::= CREATE ASSERTION <constraint name> CHECK <left paren> <search condition> <right paren> [ <constraint characteristics> ]

                  Specify an integrity constraint. This feature may be supported in a future versions of HyperSQL.

                  DROP ASSERTION

                  drop assertion statement

                  <drop assertion statement> ::= DROP ASSERTION <constraint name> [ <drop behavior> ]

                  Destroy an assertion. This feature may be supported in a future versions of HyperSQL.

                  The Information Schema

                  The Information Schema is a special schema in each catalog. The SQL Standard defines a number of character sets and domains in this schema. In addition, all the implementation-defined collations belong to the Information Schema.

                  The SQL Standard defines many views in the Information Schema. These views show the properties of the database objects that currently exist in the database. When a user accesses one these views, only the properties of database objects that the user can access are included.

                  HyperSQL supports all the views defined by the Standard, apart from a few views that report on extended user-defined types and other optional features of the Standard that are not supported by HyperSQL.

                  HyperSQL also adds some views to the Information Schema. These views are for features that are not reported in any of the views defined by the Standard, or for use by JDBC DatabaseMetaData.

                  Predefined Character Sets, Collations and Domains

                  The SQL Standard defines a number of character sets and domains in the INFORMATION SCHEMA.

                  These domains are used in the INFORMATION SCHEMA views:

                  CARDINAL_NUMBER, YES_OR_NO, CHARACTER_DATA, SQL_IDENTIFIER, TIME_STAMP

                  All available collations are in the INFORMATION SCHEMA.

                  Views in INFORMATION SCHEMA

                  HyperSQL supports a vast range of views in the INFORMATION_SCHEMA. These include views specified by the SQL Standard, SQL/Schemata part, plus views that are specific to HyperSQL and are used for JDBC DatabaseMetaData queries, which are based on SQL/CLI part, or other information that is not covered by the SQL Standard. The names of views that are not part of SQL/Schemata start with SYSTEM_.

                  The views cover different types of information. These are covered in the next sections.

                  Visibility of Information

                  Users with the special ADMIN role can see the full information on all database objects. Ordinary, non-admin users can see information on the objects for which they have some privileges.

                  The rows returned to a non-admin user exclude objects on which the user has no privilege. The extent of the information in visible rows varies with the user's privilege. For example, the owner of a VIEW can see the text of the view query, but a user of the view cannot see this text. When a user cannot see the contents of some column, null is returned for that column.

                  Name Information

                  The names of database objects are stored in hierarchical views. The top level view is INFORMATION_SCHEMA_CATALOG_NAME.

                  Below this level, there is a group of views that covers authorizations and roles, without referencing schema objects. These are AUTHORIZATIONS and ADMINSTRABLE_ROLE_AUTHORIZATIONS.

                  Also below the top level, there is the SCHEMATA view, which lists the schemas in the catalog.

                  The views that refer to top-level schema objects are divided by object type. These includes ASSERTIONS, CHARACTER_SETS, COLLATIONS, DOMAINS, ROUTINES, SEQUENCES, TABLES, USER_DEFINED_TYPES and VIEWS.

                  There are views that refer to objects that are dependent on the top-level schema objects. These include COLUMNS and PARAMETERS, views for constraints, including CHECK_CONSTRAINTS, REFERENTIAL_CONSTRAINTS and TABLE_CONSTRAINTS, and finally the TRIGGERS view.

                  The usage of each type of top-level object by another is covered by several views. For example TRIGGER_SEQUENCE_USAGE or ROUTINE_TABLE_USAGE.

                  Several other views list the individual privileges owned or granted to each AUTHORIZATION. For example ROLE_ROUTINE_GRANTS or TABLE_PRIVILEGES.

                  Data Type Information

                  The INFORMATION_SCHEMA contains comprehensive information on the data types of each schema object and its elements. For example, the ROUTINES view includes the return data type for each FUNCTION definition. The columns for this information contain nulls for rows that cover PROCEDURE definitions.

                  The COLUMNS, PARAMETERS and SEQUENCES views contain the type information in columns with similar names.

                  The type information for ARRAY types is returned in the ELEMENT_TYPES view. When a row of the COLUMNS or other view indicates that the type of the object is an ARRAY type, then there is a corresponding entry for this row in the ELEMENT_TYPES view. The following columns in the ELEMENTS_TYPES view identify the database object whose data type is being described: OBJECT_CATALOG, OBJECT_SCHEMA, OBJECT_NAME, OBJECT_TYPE, COLLECTION_TYPE_IDENTIFIER. The last column's counterpart in the COLUMNS view is named differently as DTD_IDENTIFIER. So in order to determine the array element type of a column, an equi-join between the COLUMNS and ELEMENT_TYPES tables on the six listed columns in the ELEMENT_TYPES view and their counterparts in the COLUMNS view is needed.

                  Product Information

                  A group of views, including SQL_IMPLEMENTATION_INFO, SQL_FEATURES, SQL_SIZING and others cover the capabilities of HyperSQL in detail. These views hold static data and can be explored even when the database is empty.

                  Operations Information

                  There are some HyperSQL custom views cover the current state of operation of the database. These include SYSTEM_CACHEINFO, SYSTEM_SESSIONINFO and SYSTEM_SESSIONS views.

                  SQL Standard Views

                  The following views are defined by the SQL Standard and supported by HyperSQL. The columns and contents exactly match the Standard requirements.

                  ADMINISTRABLE_ROLE_AUTHORIZATIONS

                  Information on ROLE authorizations, all granted by the admin role.

                  APPLICABLE_ROLES

                  Information on ROLE authorizations for the current user

                  ASSERTIONS

                  Empty view as ASSERTION objects are not yet supported.

                  AUTHORIZATIONS

                  Top level information on USER and ROLE objects in the database

                  CHARACTER_SETS

                  List of supported CHARACTER SET objects

                  CHECK_CONSTRAINTS

                  Additional information specific to each CHECK constraint, including the search condition

                  CHECK_CONSTRAINT_ROUTINE_USAGE

                  Information on FUNCTION objects referenced in CHECK constraints search conditions

                  COLLATIONS

                  Information on collations supported by the database.

                  COLUMNS

                  Information on COLUMN objects in TABLE and VIEW definitions

                  COLUMN_COLUMN_USAGE

                  Information on references to COLUMN objects from other, GENERATED, COLUMN objects

                  COLUMN_DOMAIN_USAGE

                  Information on DOMAIN objects used in type definition of COLUMN objects

                  COLUMN_PRIVILEGES

                  Information on privileges on each COLUMN object, granted to different ROLE and USER authorizations

                  COLUMN_UDT_USAGE

                  Information on distinct TYPE objects used in type definition of COLUMN objects

                  CONSTRAINT_COLUMN_USAGE

                  Information on COLUMN objects referenced by CONSTRAINT objects in the database

                  CONSTRAINT_TABLE_USAGE

                  Information on TABLE and VIEW objects referenced by CONSTRAINT objects in the database

                  DATA_TYPE_PRIVILEGES

                  Information on top level schema objects of various kinds that reference TYPE objects

                  DOMAINS

                  Top level information on DOMAIN objects in the database.

                  DOMAIN_CONSTRAINTS

                  Information on CONSTRAINT definitions used for DOMAIN objects

                  ELEMENT_TYPES

                  Information on the type of elements of ARRAY used in database columns or routine parameters and return values

                  ENABLED_ROLES

                  Information on ROLE privileges enabled for the current session

                  INFORMATION_SCHEMA_CATALOG_NAME

                  Information on the single CATALOG object of the database

                  KEY_COLUMN_USAGE

                  Information on COLUMN objects of tables that are used by PRIMARY KEY, UNIQUE and FOREIGN KEY constraints

                  PARAMETERS

                  Information on parameters of each FUNCTION or PROCEDURE

                  REFERENTIAL_CONSTRAINTS

                  Additional information on FOREIGN KEY constraints, including triggered action and name of UNIQUE constraint they refer to

                  ROLE_AUTHORIZATION_DESCRIPTORS

                  ROLE_COLUMN_GRANTS

                  Information on privileges on COLUMN objects granted to or by the current session roles

                  ROLE_ROUTINE_GRANTS

                  Information on privileges on FUNCTION and PROCEDURE objects granted to or by the current session roles

                  ROLE_TABLE_GRANTS

                  Information on privileges on TABLE and VIEW objects granted to or by the current session roles

                  ROLE_UDT_GRANTS

                  Information on privileges on TYPE objects granted to or by the current session roles

                  ROLE_USAGE_GRANTS

                  Information on privileges on USAGE privileges granted to or by the current session roles

                  ROUTINE_COLUMN_USAGE

                  Information on COLUMN objects of different tables that are referenced in FUNCTION and PROCEDURE definitions

                  ROUTINE_JAR_USAGE

                  Information on JAR usage by Java language FUNCTION and PROCEDURE objects.

                  ROUTINE_PRIVILEGES

                  Information on EXECUTE privileges granted on PROCEDURE and FUNCTION objects

                  ROUTINE_ROUTINE_USAGE

                  Information on PROCEDURE and FUNCTION objects that are referenced in FUNCTION and PROCEDURE definitions

                  ROUTINE_SEQUENCE_USAGE

                  Information on SEQUENCE objects that are referenced in FUNCTION and PROCEDURE definitions

                  ROUTINE_TABLE_USAGE

                  Information on TABLE and VIEW objects that are referenced in FUNCTION and PROCEDURE definitions

                  ROUTINES

                  Top level information on all PROCEDURE and FUNCTION objects in the database

                  SCHEMATA

                  Information on all the SCHEMA objects in the database

                  SEQUENCES

                  Information on SEQUENCE objects

                  SQL_FEATURES

                  List of all SQL:2008 standard features, including information on whether they are supported or not supported by HyperSQL

                  SQL_IMPLEMENTATION_INFO

                  Information on name, capabilities and defaults of the database engine software.

                  SQL_PACKAGES

                  List of the SQL:2008 Standard packages, including information on whether they are supported or not supported by HyperSQL

                  SQL_PARTS

                  List of the SQL:2008 Standard parts, including information on whether they are supported or not supported by HyperSQL

                  SQL_SIZING

                  List of the SQL:2008 Standard maximum supported sizes for different features as supported by HyperSQL

                  SQL_SIZING_PROFILES

                  TABLES

                  Information on all TABLE and VIEW object, including the INFORMATION_SCHEMA views themselves

                  TABLE_CONSTRAINTS

                  Information on all table level constraints, including PRIMARY KEY, UNIQUE, FOREIGN KEY and CHECK constraints

                  TABLE_PRIVILEGES

                  Information on privileges on TABLE and VIEW objects owned or given to the current user

                  TRANSLATIONS

                  TRIGGERED_UPDATE_COLUMNS

                  Information on columns that have been used in TRIGGER definitions in the ON UPDATE clause

                  TRIGGERS

                  Top level information on the TRIGGER definitions in the databases

                  TRIGGER_COLUMN_USAGE

                  Information on COLUMN objects that have been referenced in the body of TRIGGER definitions

                  TRIGGER_ROUTINE_USAGE

                  Information on FUNCTION and PROCEDURE objects that have been used in TRIGGER definitions

                  TRIGGER_SEQUENCE_USAGE

                  Information on SEQUENCE objects that been referenced in TRIGGER definitions

                  TRIGGER_TABLE_USAGE

                  Information on TABLE and VIEW objects that have been referenced in TRIGGER definitions

                  USAGE_PRIVILEGES

                  Information on USAGE privileges granted to or owned by the current user

                  USER_DEFINED_TYPES

                  Top level information on TYPE objects in the database

                  VIEWS

                  Top Level information on VIEW objects in the database

                  VIEW_COLUMN_USAGE

                  Information on COLUMN objects referenced in the query expressions of the VIEW objects

                  VIEW_ROUTINE_USAGE

                  Information on FUNCTION and PROCEDURE objects that have been used in the query expressions of the VIEW objects

                  VIEW_TABLE_USAGE

                  Information on TABLE and VIEW objects that have been referenced in the query expressions of the VIEW objects

                  HyperSQL Custom Views

                  The following views are specific to HyperSQL. Most of these views are used directly by JDBC DatabaseMetaData method calls and are indicated as such. Some views contain information that is specific to HyperSQL and is not covered by the SQL Standard views.

                  SYSTEM_BESTROWIDENTIFIER

                  For DatabaseMetaData.getBestRowIdentifier

                  SYSTEM_CACHEINFO

                  Contains the current settings and variables of the data cache used for all CACHED tables, and the data cache of each TEXT table.

                  SYSTEM_COLUMN_SEQUENCE_USAGE

                  Contains a row for each column that is defined as GENERATED BY DEFAULT AS SEQUENCE with the column name and sequence name

                  SYSTEM_COLUMNS

                  For DatabaseMetaData.getColumns, contains a row for each column

                  SYSTEM_COMMENTS

                  Contains the user-defined comments added to tables and their columns.

                  SYSTEM_CONNECTION_PROPERTIES

                  For DatabaseMetaData.getClientInfoProperties

                  SYSTEM_CROSSREFERENCE

                  Full list of all columns referenced by FOREIGN KEY constraints. For DatabaseMetaData.getCrossReference, getExportedKeys and getImportedKeys.

                  SYSTEM_INDEXINFO

                  For DatabaseMetaData.getIndexInfo

                  SYSTEM_PRIMARYKEYS

                  For DatabaseMetaData.getPrimaryKeys

                  SYSTEM_PROCEDURECOLUMNS

                  For DatabaseMetaData.getProcedureColumns

                  SYSTEM_PROCEDURES

                  For DatabaseMetaData.getFunctionColumns, getFunctions and getProcedures

                  SYSTEM_PROPERTIES

                  Contains the current values of all the database level properties. Settings such as SQL rule enforcement, database transaction model and default transaction level are all reported in this view. The names of the properties are listed in the Properties chapter together with the corresponding SQL statements used to change the properties.

                  SYSTEM_SCHEMAS

                  For DatabaseMetaData.getSchemas

                  SYSTEM_SEQUENCES

                  SYSTEM_SESSIONINFO

                  Information on the settings and properties of the current session.

                  SYSTEM_SESSIONS

                  Information on all open sessions in the database (when used by a DBA user), or just the current session.

                  SYSTEM_TABLES

                  Information on tables and views for DatabaseMetaData.getTables

                  SYSTEM_TABLETYPES

                  For DatabaseMetaData.getTableTypes

                  SYSTEM_TEXTTABLES

                  Information on the settings of each text table.

                  SYSTEM_TYPEINFO

                  For DatabaseMetaData.getTypeInfo

                  SYSTEM_UDTS

                  For DatabaseMetaData.getUDTs

                  SYSTEM_USERS

                  Contains the list of all users in the database (when used by a DBA user), or just the current user.

                  SYSTEM_VERSIONCOLUMNS

                  For DatabaseMetaData.getVersionColumns

                  Chapter 5. Text Tables

                  Text Tables as a Standard Feature of Hsqldb

                  Bob Preston

                  The HSQL Development Group

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 4903 $

                  Copyright 2002-2012 Bob Preston and Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  Overview

                  Text Table support for HSQLDB was originally developed by Bob Preston independently from the Project. Subsequently Bob joined the Project and incorporated this feature into version 1.7.0, with a number of enhancements, especially the use of conventional SQL commands for specifying the files used for Text Tables.

                  In a nutshell, Text Tables are CSV or other delimited files treated as SQL tables. Any ordinary CSV or other delimited file can be used. The full range of SQL queries can be performed on these files, including SELECT, INSERT, UPDATE and DELETE. Indexes and unique constraints can be set up, and foreign key constraints can be used to enforce referential integrity between Text Tables themselves or with conventional tables.

                  The delimited file can be created by the engine, or an existing file can be used.

                  HyperSQL with Text Table support is the only comprehensive solution that employs the power of SQL and the universal reach of JDBC to handle data stored in text files.

                  The Implementation

                  Definition of Tables

                  Text Tables are defined similarly to conventional tables with the added TEXT keyword:

                      CREATE TEXT TABLE <tablename> (<column definition> [<constraint definition>])

                  The table is at first empty and cannot be written to. An additional SET command specifies the file and the separator character that the Text table uses:

                     SET TABLE <tablename> SOURCE <quoted_filename_and_options> [DESC]

                  Scope and Reassignment

                  • A Text table without a file assigned to it is READ ONLY and EMPTY.

                  • Reassigning a Text Table definition to a new file has implications in the following areas:

                    1. The user is required to be an administrator.

                    2. Existing transactions are committed at this point.

                    3. Constraints, including foreign keys referencing this table, are kept intact. It is the responsibility of the administrator to ensure their integrity.

                    The new source file is scanned and indexes are built when it is assigned to the table. At this point any violation of NOT NULL, UNIQUE or PRIMARY KEY constraints are caught and the assignment is aborted. However, foreign key constraints are not checked at the time of assignment or reassignment of the source file.

                  Null Values in Columns of Text Tables

                  • Empty fields are treated as NULL. These are fields where there is nothing or just spaces between the separators.

                  • Quoted empty strings are treated as empty strings.

                  Configuration

                  The default field separator is a comma (,). A different field separator can be specified within the SET TABLE SOURCE statement. For example, to change the field separator for the table mytable to a vertical bar, place the following in the SET TABLE SOURCE statement, for example:

                      SET TABLE mytable SOURCE "myfile;fs=|"

                  Since HSQLDB treats CHAR and VARCHAR strings the same, the ability to assign a different separator to the latter is provided. When a different separator is assigned to a VARCHAR, it will terminate any CSV field of that type. For example, if the first field is CHAR, and the second field VARCHAR, and the separator fs has been defined as the pipe (|) and vs as the period (.) then the data in the CSV file for a row will look like:

                      First field data|Second field data.Third field data

                  This facility in effect offers an extra, special separator which can be used in addition to the global separator. The following example shows how to change the default separator to the pipe (|), VARCHAR separator to the period (.) within a SET TABLE SOURCE statement:

                      SET TABLE mytable SOURCE "myfile;fs=|;vs=."

                  HSQLDB also recognises the following special indicators for separators:

                  special indicators for separators

                  \semi

                  semicolon

                  \quote

                  single-quote

                  \space

                  space character

                  \apos

                  apostrophe

                  \n

                  newline - Used as an end anchor (like $ in regular expressions)

                  \r

                  carriage return

                  \t

                  tab

                  \\

                  backslash

                  \u####

                  a Unicode character specified in hexadecimal

                  Furthermore, HSQLDB provides csv file support with three additional boolean options: ignore_first, quoted and all_quoted. The ignore_first option (default false) tells HSQLDB to ignore the first line in a file. This option is used when the first line of the file contains column headings. The all_quoted option (default false) tells the program that it should use quotes around all character fields when writing to the source file. The quoted option (default true) uses quotes only when necessary to distinguish a field that contains the separator character. It can be set to false to prevent the use of quoting altogether and treat quote characters as normal characters. These options may be specified within the SET TABLE SOURCE statement:

                      SET TABLE mytable SOURCE "myfile;ignore_first=true;all_quoted=true"

                  When the default options all_quoted= false and quoted=true are in force, fields that are written to a line of the csv file will be quoted only if they contain the separator or the quote character. The quote character is doubled when used inside a string. When all_quoted=false and quoted=false the quote character is not doubled. With this option, it is not possible to insert any string containing the separator into the table, as it would become impossible to distinguish from a separator. While reading an existing data source file, the program treats each individual field separately. It determines that a field is quoted only if the first character is the quote character. It interprets the rest of the field on this basis.

                  The character encoding for the source file is ASCII by default. To support UNICODE or source files prepared with different encodings this can be changed to UTF-8 or any other encoding. The default is encoding=ASCII and the option encoding=UTF-8 or other supported encodings can be used.

                  Finally, HSQLDB provides the ability to read a text file as READ ONLY, by placing the keyword "DESC" at the end of the SET TABLE SOURCE statement:

                      SET TABLE mytable SOURCE "myfile" DESC

                  Text table source files are cached in memory. The maximum number of rows of data that are in memory at any time is controlled by the cache_rows property. The default value for cache_rows is 1000 and can be changed by setting the default database property .The cache_size property sets the maximum amount of memory used for each text table. The default is 100 KB. The properties can be set for individual text tables. These properties do not control the maximum size of each text table, which can be much larger. An example is given below:

                      SET TABLE mytable SOURCE "myfile;ignore_first=true;all_quoted=true;cache_rows=10000;cache_size=1000"

                  The properties used in earlier versions, namely the textdb.cache_scale and the textdb.cache_size_scale can still be used.

                  Disconnecting Text Tables

                  Text tables may be disconnected from their underlying data source, i.e. the text file.

                  You can explicitly disconnect a text table from its file by issuing the following statement:

                      SET TABLE mytable SOURCE OFF

                  Subsequently, mytable will be empty and read-only. However, the data source description will be preserved, and the table can be re-connected to it with

                      SET TABLE mytable SOURCE ON

                  When a database is opened, if the source file for an existing text table is missing the table remains disconnected from its data source, but the source description is preserved. This allows the missing source file to be added to the directory and the table re-connected to it with the above command.

                  Disconnecting text tables from their source has several uses. While disconnected, the text source can be edited outside HSQLDB provided data integrity is respected. When large text sources are used, and several constraints or indexes need to be created on the table, it is possible to disconnect the source during the creation of constraints and indexes and reduce the time it takes to perform the operation.

                  Text File Usage

                  The following information applies to the usage of text tables.

                  Text File Issues

                  • File locations are restricted to below the directory that contains the database, unless the textdb.allow_full_path property is set true as a Java system property. This feature is for security, otherwise an admin database user may be able to open random files. The specified text source path is interpreted differently according to this property. By default, the path is interpreted as a relative path to the directory path of database files, it therefore cannot contain the double dot notation for parent directory. This path is then appended by the engine to the directory path to form a full path. When the property is true, the path is not appended to the directory path and is used as it is to open the file. In this usage the path can be relative or absolute.

                  • All-in-memory databases can use text tables. In this usage, the path must be an absolute path. These text tables are always read only. To disable this capability for access control reasons, the textdb.allow_full_path property can be set false as a Java system property.

                  • Blank lines are allowed anywhere in the text file, and are ignored.

                  • It is possible to define a primary key, identity column, unique, foreign key and check constraints for text tables.

                  • When a table source file is used with the ignore_first=true option, the first, ignored line is replaced with a blank line after a SHUTDOWN COMPACT, unless the SOURCE HEADER statement has been used.

                  • An existing table source file may include CHARACTER fields that do not begin with the quote character but contain instances of the quote character. These fields are read as literal strings. Alternatively, if any field begins with the quote character, then it is interpreted as a quoted string that should end with the quote character and any instances of the quote character within the string is doubled. When any field containing the quote character or the separator is written out to the source file by the program, the field is enclosed in quote character and any instance of the quote character inside the field is doubled.

                  • Inserts or updates of CHARACTER type field values are allowed with strings that contains the linefeed or the carriage return character. This feature is disabled when both quoted and all_quoted properties are false.

                  • ALTER TABLE commands that add or drop columns or constraints (apart from check constraints) are not supported with text tables that are connected to a source. First use the SET TABLE <name> SOURCE OFF, make the changes, then turn the source ON.

                  Text File Global Properties

                  The database engine uses a set of defaults for text table properties. Each table's data source may override these defaults. It is also possible to override the defaults globally, so they apply to all text tables. The statement SET DATABASE TEXT TABLE DEFAULTS <properties string> can be used to override the default global properties. An example is given below:

                      SET DATABASE TEXT TABLE DEFAULTS 'all_quoted=true;encoding=UTF-8;cache_rows=10000;cache_size=2000'

                  List of supported global properties

                  • fs=,

                  • vs=,

                  • quoted=false

                  • all_quoted=false

                  • ignore_first=false

                  • encoding=ASCII

                  • cache_rows=1000

                  • cache_size=100

                  • textdb.allow_full_path=false (a system property)

                  Transactions

                  Text tables fully support transactions. New or changed rows that have not been committed are not updated in the source file. Therefore the source file always contains committed rows.

                  However, text tables are not as resilient to machine crashes as other types of tables. If the crash happens while the text source is being written to, the text source may contain only some of the changes made during a committed transaction. With other types of tables, additional mechanisms ensure the integrity of the data and this situation will not arise.

                  Chapter 6. Access Control

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 3096 $

                  Copyright 2010-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  Overview

                  This chapter is about access control to database objects such as tables, inside the database engine. Other issues related to security include user authentication, password complexity and secure connections are covered in the System Management chapter and the HyperSQL Network Listeners (Servers) chapter.

                  Apart from schemas and their object, each HyperSQL catalog has USER and ROLE objects. These objects are collectively called authorizations. Each AUTHORIZATION has some access rights on some of the schemas or the objects they contain. The persistent elements of an SQL environment are database objects

                  Authorizations names are stored in the database in the case-normal form. When connecting to a database via JDBC, the user name and password must match the case of this case-normal form.

                  When a user is created with the CREATE USER statement, if the user name is enclosed in double quotes, the exact name is used as the case-normal form. But if it is not enclosed in double quotes, the name is converted to uppercase and this uppercase version is stored in the database as the case-normal form.

                  Authorizations and Access Control

                  In general, ROLE and USER objects simply control access to schema objects. This is the scope of the SQL Standard. However, there are special roles that allow the creation of USER and ROLE objects and also allow some special operations on the database as a whole. These roles are not defined by the Standard, which has left it to implementers to define such roles as they are needed for the particular SQL implementation.

                  A ROLE has a name a collection of zero or more other roles, plus some privileges (access rights). A USER has a name and a password. It similarly has a collection of zero or more roles plus some privileges.

                  USER objects existed in the SQL-92, but ROLE objects were introduced in SQL:1999. Originally it was intended that USER objects would normally be the same as the operating system USER objects and their authentication would be handled outside the SQL environment. The co-existence of ROLE and USER objects results in complexity. With the addition of ROLE objects, there is no rationale, other than legacy support, for granting privileges to USER objects directly. It is better to create roles and grant privileges to them, then grant the roles to USER objects.

                  The Standard effectively defines a special ROLE, named PUBLIC. All authorization have the PUBLIC role, which cannot be removed from them. Therefore any access right assigned to the PUBLIC role applies to all authorizations in the database. For many simple databases, it is adequate to create a single, non-admin user, then assign access rights to the pre-existing PUBLIC role. Access to INFORMATION_SCHEMA views is granted to PUBLIC, therefore these views are accessible to all. However, the contents of each view depends on the ROLE or USER (AUTHORIZATION) that is in force while accessing the view.

                  Each schema has a single AUTHORIZATION. This is commonly known as the owner of the schema. All the objects in the schema inherit the schema owner. The schema owner can add objects to the schema, drop them or alter them.

                  By default, the objects in a schema can only be accessed by the schema owner. The schema owner can grant access rights on the objects to other users or roles.

                  authorization identifier

                  authorization identifier

                  <authorization identifier> ::= <role name> | <user name>

                  Authorization identifiers share the same name-space within the database. The same name cannot be used for a USER and a ROLE.

                  Built-In Roles and Users

                  There are some pre-defined roles in each database; some defined by the SQL Standard, some by HyperSQL. These roles can be assigned to users (directly or via other, user-defined roles). In addition, there is the initial SYS user created with each new database. The initial user name and password is defined in the connection properties when the first connection to the database is made. In older versions of HSQLDB, this name was always SA. But in the latest version, the name can be defined as a different string.

                  PUBLIC

                  the PUBLIC role

                  The role that is assigned to all authorizations (roles and users) in the database. This role has access rights to all objects in the INFORMATION_SCHEMA. Any roles or rights granted to this role, are in effect granted to all users of the database.

                  _SYSTEM

                  the _SYSTEM role

                  This role is the authorization for the pre-defined (system) objects in the database, including the INFORMATION_SCHEMA. This role cannot be assigned to any authorization.

                  DBA

                  the DBA role (HyperSQL-specific)

                  This is a special role in HyperSQL. A user that has this role can perform all possible administrative tasks on the database. The DBA role can also act as a proxy for all the roles and users in the database. This means it can do everything the authorization for a schema can do, including dropping the schema or its objects, or granting rights on the schema objects to a grantee.

                  CREATE_SCHEMA

                  the CREATE_SCHEMA role (HyperSQL-specific)

                  An authorization that has this role, can create schemas. The DBA authorization has this role and can grant it to other authorizations.

                  CHANGE_AUTHORIZATION

                  the CHANGE_AUTHORIZATION role (HyperSQL-specific)

                  A user that has this role, can change the authorization for the current session to another user. The other user cannot have the DBA role (otherwise, the original user would gain DBA privileges). The DBA authorization has this role and can grant it to other authorizations.

                  SYS User

                  the SYS user (HyperSQL-specific)

                  This user is automatically created with a new database and has the DBA role. This user name and its password are defined in the connection properties when connecting to the new database to create the database. As this user, it is possible to change the password, create other users and created new schema objects. The initial SYS user can be dropped by another user that has the DBA role. As a result, there is always at least one SYS user in the database.

                  Listing Users and Roles

                  Tables in the INFORMATION_SCHEMA contain the list of users and roles for the database.

                  The SYSTEM_USERS tables contains the list of users, with some extra settings for each user. The AUTHORIZATIONS table contains a list of both users and roles.

                  Several other INFORMATION_SCHEMA tables list the privileges granted to users and roles on different database objects. Refer to the Schemas and Database Objects chapter for a list and description of the tables. Example below:

                  SELECT * FROM INFORMATION_SCHEMA.SYSTEM_USERS 
                  SELECT * FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES
                  

                  Access Rights

                  By default, the objects in a schema can only be accessed by the schema owner. But the schema owner can grant privileges (access rights) on the objects to other users or roles.

                  Things can get far more complex, because the grant of privileges can be made WITH GRANT OPTION. In this case, the role or user that has been granted the privilege can grant the privilege to other roles and users.

                  Privileges can also be revoked from users or roles.

                  The statements for granting and revoking privileges normally specify which privileges are granted or revoked. However, there is a shortcut, ALL PRIVILEGES, which means all the privileges that the <grantor> has on the schema object. The <grantor> is normally the CURRENT_USER of the session that issues the statement.

                  The user or role that is granted privileges is referred to as <grantee> for the granted privileges.

                  Table

                  For tables, including views, privileges can be granted with different degrees of granularity. It is possible to grant a privilege on all columns of a table, or on specific columns of the table.

                  The DELETE privilege applies to the table, rather than its columns. It applies to all DELETE statements.

                  The SELECT, INSERT and UPDATE privileges may apply to all columns or to individual columns. These privileges determine whether the <grantee> can execute SQL data statements on the table.

                  The SELECT privilege designates the columns that can be referenced in SELECT statements, as well as the columns that are read in a DELETE or UPDATE statement, including the search condition.

                  The INSERT privilege designates the columns into which explicit values can be inserted. To be able to insert a row into the table, the user must therefore have the INSERT privilege on the table, or at least all the columns that do not have a default value.

                  The UPDATE privilege simply designates the table or the specific columns that can be updated.

                  The REFERENCES privilege allows the <grantee> to define a FOREIGN KEY constraint on a different table, which references the table or the specific columns designated for the REFERENCES privilege.

                  The TRIGGER privilege allows adding a trigger to the table.

                  Sequence, Type, Domain, Character Set, Collation, Transliteration,

                  For these objects, only USAGE can be granted. The USAGE privilege is needed when object is referenced directly in an SQL statement.

                  Routine

                  For routines, including procedures or functions, only EXECUTE privilege can be granted. This privilege is needed when the routine is used directly in an SQL statement.

                  Other Objects

                  Other objects such as constraints and assertions are not used directly and there is no grantable privilege that refers to them.

                  Statements for Authorization and Access Control

                  The statements listed below allow creation and destruction of USER and ROLE objects. The GRANT and REVOKE statements allow roles to be assigned to other roles or to users. The same statements are also used in a different form to assign privileges on schema objects to users and roles.

                  CREATE USER

                  user definition (HyperSQL)

                  <user definition> ::= CREATE USER <user name> PASSWORD <password> [ ADMIN ]

                  Define a new user and its password. <user name> is an SQL identifier. If it is double-quoted it is case-sensitive, otherwise it is turned to uppercase. <password> is a string enclosed with single quote characters and is case-sensitive. If ADMIN is specified, the DBA role is granted to the new user. Only a user with the DBA role can execute this statement.

                  DROP USER

                  drop user statement (HyperSQL)

                  <drop user statement> ::= DROP USER <user name>

                  Drop (destroy) an existing user. If the specified user is the authorization for a schema, the schema is destroyed.

                  Only a user with the DBA role can execute this statement.

                  ALTER USER ... SET PASSWORD

                  set the password for a user (HyperSQL)

                  <alter user set password statement> ::= ALTER USER <user name> SET PASSWORD <password>

                  Change the password of an existing user. <user name> is an SQL identifier. If it is double-quoted it is case-sensitive, otherwise it is turned to uppercase. <password> is a string enclosed with single quote characters and is case-sensitive.

                  Only a user with the DBA role can execute this command.

                  ALTER USER ... SET INITIAL SCHEMA

                  set the initial schema for a user (HyperSQL)

                  <alter user set initial schema statement> ::= ALTER USER <user name> SET INITIAL SCHEMA <schema name> | DEFAULT

                  Change the initial schema for a user. The initial schema is the schema used by default for SQL statements issued during a session. If DEFAULT is used, the default initial schema for all users is used as the initial schema for the user. The SET SCHEMA command allows the user to change the schema for the duration of the session.

                  Only a user with the DBA role can execute this statement.

                  ALTER USER ... SET LOCAL

                  set the user authentication as local (HyperSQL)

                  <alter user set local> ::= ALTER USER <user name> SET LOCAL { TRUE | FALSE }

                  Sets the authentication method for the user as local. This statement has an effect only when external authentication with role names is enabled. In this method of authentication, users created in the database are ignored and an external authentication mechanism, such as LDAP is used. This statement is used if you want to use local, password authentication for a specific user.

                  Only a user with the DBA role can execute this statement.

                  SET PASSWORD

                  set password statement (HyperSQL)

                  <set password statement> ::= SET PASSWORD <password>

                  Set the password for the current user. <password> is a string enclosed with single quote characters and is case-sensitive.

                  SET INITIAL SCHEMA

                  set the initial schema for the current user (HyperSQL)

                  <set initial schema statement> ::= SET INITIAL SCHEMA <schema name> | DEFAULT

                  Change the initial schema for the current user. The initial schema is the schema used by default for SQL statements issued during a session. If DEFAULT is used, the default initial schema for all users is used as the initial schema for the current user. The separate SET SCHEMA command allows the user to change the schema for the duration of the session. See also the Sessions and Transactions chapter.

                  SET DATABASE DEFAULT INITIAL SCHEMA

                  set the default initial schema for all users (HyperSQL)

                  <set database default initial schema statement> ::= SET DATABASE DEFAULT INITIAL SCHEMA <schema name>

                  Sets the initial schema for new users. This schema can later be changed with the <set initial schema statement> command.

                  CREATE ROLE

                  role definition

                  <role definition> ::= CREATE ROLE <role name> [ WITH ADMIN <grantor> ]

                  Defines a new role. Initially the role has no rights, except those of the PUBLIC role. Only a user with the DBA role can execute this command.

                  DROP ROLE

                  drop role statement

                  <drop role statement> ::= DROP ROLE <role name>

                  Drop (destroy) a role. If the specified role is the authorization for a schema, the schema is destroyed. Only a user with the DBA role can execute this statement.

                  GRANTED BY

                  grantor determination

                  GRANTED BY <grantor>

                  <grantor> ::= CURRENT_USER | CURRENT_ROLE

                  The authorization that is granting or revoking a role or privileges. The optional GRANTED BY <grantor> clause can be used in various statements that perform GRANT or REVOKE actions. If the clause is not used, the authorization is CURRENT_USER. Otherwise, it is the specified authorization.

                  GRANT

                  grant privilege statement

                  <grant privilege statement> ::= GRANT <privileges> TO <grantee> [ { <comma> <grantee> }... ] [ WITH GRANT OPTION ] [ GRANTED BY <grantor> ]

                  Assign privileges on schema objects to roles or users. Each <grantee> is a role or a user. If [ WITH GRANT OPTION ] is specified, then the <grantee> can assign the privileges to other <grantee> objects.

                  <privileges> ::= <object privileges> ON <object name>

                  <object name> ::= [ TABLE ] <table name> | DOMAIN <domain name> | COLLATION <collation name> | CHARACTER SET <character set name> | TRANSLATION <transliteration name> | TYPE <user-defined type name> | SEQUENCE <sequence generator name> | <specific routine designator> | ROUTINE <routine name> | FUNCTION <function name> | PROCEDURE <procedure name>

                  <object privileges> ::= ALL PRIVILEGES | <action> [ { <comma> <action> }... ]

                  <action> ::= SELECT | SELECT <left paren> <privilege column list> <right paren> | DELETE | INSERT [ <left paren> <privilege column list> <right paren> ] | UPDATE [ <left paren> <privilege column list> <right paren> ] | REFERENCES [ <left paren> <privilege column list> <right paren> ] | USAGE | TRIGGER | EXECUTE

                  <privilege column list> ::= <column name list>

                  <grantee> ::= PUBLIC | <authorization identifier>

                  The <object privileges> that can be used depend on the type of the <object name>. These are discussed in the previous section. For a table, if <privilege column list> is not specified, then the privilege is granted on the table, which includes all of its columns and any column that may be added to it in the future. For routines, the name of the routine can be specified in two ways, either as the generic name as the specific name. HyperSQL allows referencing all overloaded versions of a routine at the same time, using its name. This differs from the SQL Standard which requires the use of <specific routine designator> to grant privileges separately on each different signature of the routine.

                  Each <grantee> is the name of a role or a user. Examples of GRANT statement are given below:

                  GRANT ALL ON SEQUENCE aSequence TO roleOrUser 
                  GRANT SELECT ON aTable TO roleOrUser  
                  GRANT SELECT, UPDATE ON aTABLE TO roleOrUser1, roleOrUser2
                  GRANT SELECT(columnA, columnB), UPDATE(columnA, columnB) ON TABLE aTable TO roleOrUser
                  GRANT EXECUTE ON SPECIFIC ROUTINE aroutine_1234 TO rolOrUser
                  

                  As mentioned in the general discussion, it is better to define a role for the collection of all the privileges required by an application. This role is then granted to any user. If further changes are made to the privileges of this role, they are automatically reflected in all the users that have the role.

                  GRANT

                  grant role statement

                  <grant role statement> ::= GRANT <role name> [ { <comma> <role name> }... ] TO <grantee> [ { <comma> <grantee> }... ] [ WITH ADMIN OPTION ] [ GRANTED BY <grantor> ]

                  Assign roles to roles or users. One or more roles can be assigned to one or more <grantee> objects. A <grantee> is a user or a role. If the [ WITH ADMIN OPTION ] is specified, then each <grantee> can grant the newly assigned roles to other grantees. An example of user and role creation with grants is given below:

                  CREATE USER appuser
                  CREATE ROLE approle
                  GRANT approle TO appuser
                  GRANT SELECT, UPDATE ON TABLE atable TO approle
                  GRANT USAGE ON SEQUENCE asequence to approle
                  GRANT EXECUTE ON ROUTINE aroutine TO approle
                  

                  REVOKE privilege

                  revoke statement

                  <revoke privilege statement> ::= REVOKE [ GRANT OPTION FOR ] <privileges> FROM <grantee> [ { <comma> <grantee> }... ] [ GRANTED BY <grantor> ] RESTRICT | CASCADE

                  Revoke privileges from a user or role.

                  REVOKE role

                  revoke role statement

                  <revoke role statement> ::= REVOKE [ ADMIN OPTION FOR ] <role revoked> [ { <comma> <role revoked> }... ] FROM <grantee> [ { <comma> <grantee> }... ] [ GRANTED BY <grantor> ] RESTRICT | CASCADE

                  <role revoked> ::= <role name>

                  Revoke a role from users or roles.

                  Chapter 7. Data Access and Change

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5039 $

                  Copyright 2010-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  Overview

                  HyperSQL data access and data change statements are fully compatible with the latest SQL:2008 Standard. There are a few extensions and some relaxation of rules, but these do not affect statements that are written to the Standard syntax. There is full support for classic SQL, as specified by SQL-92, and many enhancements added in later versions of the standard.

                  Cursors And Result Sets

                  An SQL statement can executed in two ways. One way is to use the java.sql.Statement interface. The Statement object can be reused to execute completely different SQL statements. Alternatively a PreparedStatment can be used to execute an SQL statement repeatedly, and the statements can be parameterized. Using either form, if the SQL statement is a query expression, a ResultSet is returned.

                  In SQL, when a query expression (SELECT or similar SQL statement) is executed, an ephemeral table is created. When this table is returned to the application program, it is returned as a result set, which is accessed row-by-row by a cursor. A JDBC ResultSet represents an SQL result set and its cursor.

                  The minimal definition of a cursor is a list of rows with a position that can move forward. Some cursors also allow the position to move backwards or jump to any position in the list.

                  An SQL cursor has several attributes. These attributes depend on the query expression. Some of these attributes can be overridden by specifying qualifiers in the SQL statement or by specifying values for the parameters of the JDBC Statement or PreparedStatement.

                  Columns and Rows

                  The columns of the rows of the result set are determined by the query expression. The number of columns and the type and name characteristics of each column are known when the query expression is compiled and before its execution. This metadata information remains constant regardless of changes to the contents of the tables used in the query expression. The metadata for the JDBC ResultSet is in the form of a ResultSetMetaData object. Various methods of the ResultSetMetaData interface return different properties of each column of the ResultSet.

                  A result set may contain 0 or more rows. The rows are determined by the execution of the query expression.

                  The setMaxRows(int) method of JDBC Statement allows limiting the number of rows returned by the statement. This limit is conceptually applied after the result has been built, and the excess rows are discarded.

                  Navigation

                  A cursor is either scrollable or not. Scrollable cursors allow accessing rows by absolute or relative positioning. No-scroll cursors only allow moving to the next row. The cursor can be optionally declared with the SQL qualifiers SCROLL, or NO SCROLL. The JDBC statement parameter can be specified as: TYPE_FORWARD_ONLY and TYPE_SCROLL_INSENSITIVE. The JDBC type TYPE_SCROLL_SENSITIVE is not supported by HSQLDB.

                  The default is NO SCROLL or TYPE_FORWARD_ONLY.

                  When a JDBC ResultSet is opened, it is positioned before the first row. Using the next() method the position is moved to the first row. While the ResultSet is positioned on a row, various getter methods can be used to access the columns of the row.

                  Updatability

                  The result returned by some query expressions is updatable. HSQLDB supports core SQL updatability features, plus some enhancements from the SQL optional features.

                  A query expression is updatable if it is a SELECT from a single underlying base table (or updatable view) either directly or indirectly. A SELECT statement featuring DISTINCT or GROUP BY or FETCH, LIMIT, OFFSET is not updatable. In an updatable query expression, one or more columns are updatable. An updatable column is a column that can be traced directly to the underlying table. Therefore, columns that contain expressions are not updatable. Examples of updatable query expressions are given below. The view V is updatable when its query expression is updatable. The SELECT statement from this view is also updatable:

                  SELECT A, B FROM T WHERE C > 5
                  SELECT A, B FROM (SELECT * FROM T WHERE C > 10) AS TT WHERE TT.B <10
                  CREATE VIEW V(X,Y) AS SELECT A, B FROM T WHERE C > 0 AND B < 10
                  SELECT X FROM V WHERE Y = 5
                  

                  If a cursor is declared with the SQL qualifier, FOR UPDATE OF <column name list>, then only the stated columns in the result set become updatable. If any of the stated columns is not actually updatable, then the cursor declaration will not succeed.

                  If the SQL qualifier, FOR UPDATE is used, then all the updatable columns of the result set become updatable.

                  If a cursor is declared with FOR READ ONLY, then it is not updatable.

                  In HSQLDB, if FOR READ ONLY or FOR UPDATE is not used then all the updatable columns of the result set become updatable. This relaxes the SQL standard rule that in this case limits updatability to only simply updatable SELECT statements (where all columns are updatable).

                  In JDBC, CONCUR_READ_ONLY or CONCUR_UPDATABLE can be specified for the Statement parameter. CONCUR_UPDATABLE is required if the returning ResultSet is to be updatable. If CONCUR_READ_ONLY, which is the default, is used, then even an updatable ResultSet becomes read-only.

                  When a ResultSet is updatable, various setter methods can be used to modify the column values. The names of the setter methods begin with "update". After all the updates on a row are done, the updateRow() method must be called to finalise the row update.

                  An updatable ResultSet may or may not be insertable-into. In an insertable ResultSet, all columns of the result are updatable and any column of the base table that is not in the result must be a generated column or have a default value.

                  In the ResultSet object, a special pseudo-row, called the insert row, is used to populate values for insertion into the ResultSet (and consequently, into the base table). The setter methods must be used on all the columns, followed by a call to insertRow().

                  Individual rows from all updatable result sets can be deleted one at a time. The deleteRow() is called when the ResultSet is positioned on a row.

                  While using an updatable ResultSet to modify data, it is recommended not to change the same data using another ResultSet and not to execute SQL data change statements that modify the same data.

                  Sensitivity

                  The sensitivity of the cursor relates to visibility of changes made to the data by the same transaction but without using the given cursor. While the result set is open, the same transaction may use statements such as INSERT or UPDATE, and change the data of the tables from which the result set data is derived. A cursor is SENSITIVE if it reflects those changes. It is INSENSITIVE if it ignores such changes. It is ASENSITIVE if behaviour is implementation dependent.

                  The SQL default is ASENSITIVE, i.e., implantation dependent.

                  In HSQLDB all cursors are INSENSITIVE. They do not reflect changes to the data made by other statements.

                  Holdability

                  A cursor is holdable if the result set is not automatically closed when the current transaction is committed. Holdability can be specified in the cursor declaration using the SQL qualifiers WITH HOLD or WITHOUT HOLD.

                  In JDBC, holdability is specified using either of the following values for the Statement parameter: HOLD_CURSORS_OVER_COMMIT, or CLOSE_CURSORS_AT_COMMIT.

                  The SQL default is WITHOUT HOLD.

                  The JDBC default for HSQLDB result sets is WITH HOLD for read-only result sets and WITHOUT HOLD for updatable result sets.

                  If the holdability of a ResultSet is specified in a conflicting manner in the SQL statement and the JDBC Statement object, the JDBC setting takes precedence.

                  Autocommit

                  The autocommit property of a connection is a feature of JDBC and ODBC and is not part of the SQL Standard. In autocommit mode, all transactional statements are followed by an implicit commit. In autocommit mode, all ResultSet objects are read-only and holdable.

                  JDBC Overview

                  The JDBC settings, ResultSet.CONCUR_READONLY and ResultSet.CONCUR_UPDATABLE are the available alternatives for read-only or updatability. The default is ResultSet.CONCUR_READONLY.

                  The JDBC settings, ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.TYPE_SCROLL_SENSITIVE are the available alternatives for both scrollability (navigation) and sensitivity. HyperSQL does not support ResultSet.TYPE_SCROLL_SENSITIVE. The two other alternatives can be used for both updatable and read-only result sets.

                  The JDBC settings ResultSet.CLOSE_CURSORS_AT_COMMIT and ResultSet.HOLD_CURSORS_OVER_COMMIT are the alternatives for the lifetime of the result set. The default is ResultSet.CLOSE_CURSORS_AT_COMMIT. The other setting can only be used for read-only result sets.

                  Examples of creating statements for updatable result sets are given below:

                  Connection c = newConnection();
                  Statement st;
                  c.setAutoCommit(false);
                  st = c.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
                  st = c.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

                  JDBC Parameters

                  When a JDBC PreparedStatement or CallableStatement is used with an SQL statement that contains dynamic parameters, the data types of the parameters are resolved and determined by the engine when the statement is prepared. The SQL Standard has detailed rules to determine the data types and imposes limits on the maximum length or precision of the parameter. HyperSQL applies the standard rules with two exceptions for parameters with String and BigDecimal Java types. HyperSQL ignores the limits when the parameter value is set, and only enforces the necessary limits when the PreparedStatement is executed. In all other cases, parameter type limits are checked and enforce when the parameter is set.

                  In the example below the setString() calls do not raise an exception, but one of the execute() statements does.

                  // table definition: CREATE TABLE T (NAME VARCHAR(12), ...)
                  Connection c = newConnection();
                  PreparedStatement st = c.prepareStatement("SELECT * FROM T WHERE NAME = ?");
                  // type of the parameter is VARCHAR(12), which limits length to 12 characters
                  st.setString(1, "Eyjafjallajokull"); // string is longer than type, but no exception is raised here
                  set.execute(); // executes with no exception and does not find any rows
                  
                  // but if an UPDATE is attempted, an exception is raised
                  st = c.prepareStatement("UPDATE T SET NAME = ? WHERE ID = 10");
                  st.setString(1, "Eyjafjallajokull"); // string is longer than type, but no exception is raised here
                  st.execute(); // exception is thrown when HyperSQL checks the value for update
                  
                  

                  All of the above also applies to setting the values in new and updated rows in updatable ResultSet objects.

                  JDBC parameters can be set with any compatible type, as supported by the JDBC specification. For CLOB and BLOB types, you can use streams, or create instances of BLOB or CLOB before assigning them to the parameters. You can even use CLOB or BLOB objects returned from connections to other RDBMS servers. The Connection.createBlob() and createClob() methods can be used to create the new LOBs. For very large LOB's the stream methods are preferable as they use less memory.

                  For array parameters, you must use a java.sql.Array object that contains the array elements before assigning to JDBC parameters. The Connection.createArrayOf(...) method can be used to create a new object, or you can use an Array returned from connections to other RDBMS servers.

                  JDBC and Data Change Statements

                  Data change statements, also called data manipulation statements (DML) such as INSERT, UPDATE, MERGE can be called with different executeUpdate() methods of java.sql.Statement and java.sql.PreparedStatement. Some of these methods allow you to specify how values for generated columns of the table are returned. These methods are documented in the JavaDoc for org.hsqldb.jdbc.JDBCStatement and org.hsqldb.jdbc.JDBCPreparedStatement. HyperSQL can return not just the generated columns, but any set of columns of the table. You can use this to retrieve the columns values that may be modified by a BEFORE TRIGGER on the table.

                  JDBC Callable Statement

                  The JDBC CallableStatement interface is used to call Java or SQL procedures that have been defined in the database. The SQL statement in the form of CALL procedureName ( ... ) with constant value arguments or with parameter markers. Note that you must use a parameter marker for OUT and INOUT arguments of the procedure you are calling. The OUT arguments should not be set before executing the callable statement.

                  After executing the statement, you can retrieve the OUT and INOUT parameters with the appropriate getXXX() method.

                  Procedures can also return one or more result sets. You should call the getResultSet() and getMoreResults() methods to retrieve the result sets one by one.

                  SQL functions can also return a table. You can call such functions the same way as procedures and retrieve the table as a ResultSet.

                  JDBC Returned Values

                  The methods of the JDBC ResultSet interface can be used to return values and to convert value to different types as supported by the JDBC specification.

                  When a CLOB and BLOB object is returned from a ResultSet, no data is transferred until the data is read by various methods of java.sql.CLOB and java.sql.BLOB. Data is streamed in large blocks to avoid excessive memory use.

                  Array objects are returned as instances of java.sql.Array.

                  Cursor Declaration

                  The DECLARE CURSOR statement is used within an SQL PROCEDURE body. In the early releases of HyperSQL 2.0, the cursor is used only to return a result set from the procedure. Therefore the cursor must be declared WITH RETURN and can only be READ ONLY.

                  DECLARE CURSOR

                  declare cursor statement

                  <declare cursor> ::= DECLARE <cursor name>

                  [ { SENSITIVE | INSENSITIVE | ASENSITIVE } ] [ { SCROLL | NO SCROLL } ]

                  CURSOR [ { WITH HOLD | WITHOUT HOLD } ] [ { WITH RETURN | WITHOUT RETURN } ]

                  FOR <query expression>

                  [ FOR { READ ONLY | UPDATE [ OF <column name list> ] } ]

                  The query expression is a SELECT statement or similar, and is discussed in the rest of this chapter. In the example below a cursor is declared for a SELECT statement. It is later opened to create the result set. The cursor is specified WITHOUT HOLD, so the result set is not kept after a commit. Use WITH HOLD to keep the result set. Note that you need to declare the cursor WITH RETURN as it is returned by the CallableStatement.

                  DECLARE thiscursor SCROLL CURSOR WITHOUT HOLD WITH RETURN FOR SELECT * FROM INFORMATION_SCHEMA.TABLES;
                  --
                  OPEN thiscursor;
                  

                  Syntax Elements

                  The syntax elements that can be used in data access and data change statements are described in this section. The SQL Standard has a very extensive set of definitions for these elements. The BNF definitions given here are sometimes simplified.

                  Literals

                  Literals are used to express constant values. The general type of a literal is known by its format. The specific type is based on conventions.

                  unicode escape elements

                  unicode escape elements

                  <Unicode escape specifier> ::= [ UESCAPE <quote><Unicode escape character><quote> ]

                  <Unicode escape value> ::= <Unicode 4 digit escape value> | <Unicode 6 digit escape value> | <Unicode character escape value>

                  <Unicode 4 digit escape value> ::= <Unicode escape character><hexit><hexit><hexit><hexit>

                  <Unicode 6 digit escape value> ::= <Unicode escape character><plus sign> <hexit><hexit><hexit><hexit><hexit><hexit>

                  <Unicode character escape value> ::= <Unicode escape character><Unicode escape character>

                  <Unicode escape character> ::= a single character than a <hexit> (a-f, A-F, 0-9), <plus sign>, <quote>, <double quote>, or <white space>

                  character literal

                  character literal

                  <character string literal> ::= [ <introducer><character set specification> ] <quote> [ <character representation>... ] <quote> [ { <separator> <quote> [ <character representation>... ] <quote> }... ]

                  <introducer> ::= <underscore>

                  <character representation> ::= <nonquote character> | <quote symbol>

                  <nonquote character> ::= any character apart from the quote symbol.

                  <quote symbol> ::= <quote><quote>

                  <national character string literal> ::= N <quote> [ <character representation>... ] <quote> [ { <separator> <quote> [ <character representation>... ] <quote> }... ]

                  <Unicode character string literal> ::= [ <introducer><character set specification> ] U<ampersand><quote> [ <Unicode representation>... ] <quote> [ { <separator> <quote> [ <Unicode representation>... ] <quote> }... ] <Unicode escape specifier>

                  <Unicode representation> ::= <character representation> | <Unicode escape value>

                  The type of a character literal is CHARACTER. The length of the string literal is the character length of the type. If the quote character is used in a string, it is represented with two quote characters. Long literals can be divided into multiple quoted strings, separated with a space or end-of-line character.

                  Unicode literals start with U& and can contain ordinary characters and unicode escapes. A unicode escape begins with the backslash ( \ ) character and is followed by four hexadecimal characters which specify the character code.

                  Example of character literals are given below:

                  'a literal'  ' string seperated'  ' into parts'
                  'a string''s literal form with quote character'
                  U&'Unicode string with Greek delta \0394 and phi \03a6 letters'
                  

                  binary literal

                  binary literal

                  <binary string literal> ::= X <quote> [ <space>... ] [ { <hexit> [ <space>... ] <hexit> [ <space>... ] }... ] <quote> [ { <separator> <quote> [ <space>... ] [ { <hexit> [ <space>... ] <hexit> [ <space>... ] }... ] <quote> }... ]

                  <hexit> ::= <digit> | A | B | C | D | E | F | a | b | c | d | e | f

                  The type of a binary literal is BINARY. The octet length of the binary literal is the length of the type. Case-insensitive hexadecimal characters are used in the binary string. Each pair of characters in the literal represents a byte in the binary string. Long literals can be divided into multiple quoted strings, separated with a space or end-of-line character.

                  X'1abACD34' 'Af'

                  bit literal

                  bit literal

                  <bit string literal> ::= B <quote> [ <bit> ... ] <quote> [ { <separator> <quote> [ <bit>... ] <quote> }... ]

                  <bit> ::= 0 | 1

                  The type of a binary literal is BIT. The bit length of the bit literal is the length of the type. Digits 0 and 1 are used to represent the bits. Long literals can be divided into multiple quoted strings, separated with a space or end-of-line character.

                  B'10001001' '00010'

                  numeric literal

                  numeric literal

                  <signed numeric literal> ::= [ <sign> ] <unsigned numeric literal>

                  <unsigned numeric literal> ::= <exact numeric literal> | <approximate numeric literal>

                  <exact numeric literal> ::= <unsigned integer> [ <period> [ <unsigned integer> ] ] | <period> <unsigned integer>

                  <sign> ::= <plus sign> | <minus sign>

                  <approximate numeric literal> ::= <mantissa> E <exponent>

                  <mantissa> ::= <exact numeric literal>

                  <exponent> ::= <signed integer>

                  <signed integer> ::= [ <sign> ] <unsigned integer>

                  <unsigned integer> ::= <digit>...

                  The type of an exact numeric literal without a decimal point is INTEGER, BIGINT, or DECIMAL, depending on the value of the literal (the smallest type that can represent the value is the type).

                  The type of an exact numeric literal with a decimal point is DECIMAL. The precision of a decimal literal is the total number of digits of the literal. The scale of the literal is the total number of digits to the right of the decimal point.

                  The type of an approximate numeric literal is DOUBLE. An approximate numeric literal always includes the mantissa and exponent, separated by E.

                  12
                  34.35
                  +12E-2
                  

                  boolean literal

                  boolean literal

                  <boolean literal> ::= TRUE | FALSE | UNKNOWN

                  The boolean literal is one of the specified keywords.

                  datetime and interval literal

                  datetime and interval literal

                  <datetime literal> ::= <date literal> | <time literal> | <timestamp literal>

                  <date literal> ::= DATE <date string>

                  <time literal> ::= TIME <time string>

                  <timestamp literal> ::= TIMESTAMP <timestamp string>

                  <date string> ::= <quote> <unquoted date string> <quote>

                  <time string> ::= <quote> <unquoted time string> <quote>

                  <timestamp string> ::= <quote> <unquoted timestamp string> <quote>

                  <time zone interval> ::= <sign> <hours value> <colon> <minutes value>

                  <date value> ::= <years value> <minus sign> <months value> <minus sign> <days value>

                  <time value> ::= <hours value> <colon> <minutes value> <colon> <seconds value>

                  <interval literal> ::= INTERVAL [ <sign> ] <interval string> <interval qualifier>

                  <interval string> ::= <quote> <unquoted interval string> <quote>

                  <unquoted date string> ::= <date value>

                  <unquoted time string> ::= <time value> [ <time zone interval> ]

                  <unquoted timestamp string> ::= <unquoted date string> <space> <unquoted time string>

                  <unquoted interval string> ::= [ <sign> ] { <year-month literal> | <day-time literal> }

                  <year-month literal> ::= <years value> [ <minus sign> <months value> ] | <months value>

                  <day-time literal> ::= <day-time interval> | <time interval>

                  <day-time interval> ::= <days value> [ <space> <hours value> [ <colon> <minutes value> [ <colon> <seconds value> ] ] ]

                  <time interval> ::= <hours value> [ <colon> <minutes value> [ <colon> <seconds value> ] ] | <minutes value> [ <colon> <seconds value> ] | <seconds value>

                  <years value> ::= <datetime value>

                  <months value> ::= <datetime value>

                  <days value> ::= <datetime value>

                  <hours value> ::= <datetime value>

                  <minutes value> ::= <datetime value>

                  <seconds value> ::= <seconds integer value> [ <period> [ <seconds fraction> ] ]

                  <seconds integer value> ::= <unsigned integer>

                  <seconds fraction> ::= <unsigned integer>

                  <datetime value> ::= <unsigned integer>

                  The type of a datetime or interval type is specified in the literal. The fractional second precision is the number of digits in the fractional part of the literal. Details are described in the SQL Language chapter

                  DATE '2008-08-08'
                  TIME '20:08:08'
                  TIMESTAMP '2008-08-08 20:08:08.235'
                  
                  INTERVAL '10' DAY
                  INTERVAL -'08:08' MINUTE TO SECOND
                  

                  References, etc.

                  References are identifier chains, which can be a single identifiers or identifiers chains composed of single identifiers chained together with the period symbol.

                  identifier chain

                  identifier chain

                  <identifier chain> ::= <identifier> [ { <period> <identifier> }... ]

                  <basic identifier chain> ::= <identifier chain>

                  A period-separated chain of identifiers. The identifiers in an identifier chain can refer to database objects in a hierarchy. The possible hierarchies are as follows. In each hierarchy, elements from the start or the end can be missing, but the order of elements cannot be changed.

                  catalog, schema, database object

                  catalog, schema, table, column

                  correlation name, column

                  Examples of identifier chain are given below:

                  SELECT MYCAT.MYSCHEMA.MYTABLE.MYCOL FROM MYCAT.MYSCHEMA.MYTABLE
                  DROP TABLE MYCAT.MYSCHEMA.MYTABLE CASCADE
                  ALTER SEQUENCE MYCAT.MYSCHEMA.MYSEQUENCE RESTART WITH 100
                  

                  column reference

                  column reference

                  <column reference> ::= <basic identifier chain> | MODULE <period> <qualified identifier> <period> <column name>

                  Reference a column or a routine variable.

                  SQL parameter reference

                  SQL parameter reference

                  <SQL parameter reference> ::= <basic identifier chain>

                  Reference an SQL routine parameter.

                  contextually typed value specification

                  contextually typed value specification

                  <contextually typed value specification> ::= <null specification> | <default specification>

                  <null specification> ::= NULL

                  <default specification> ::= DEFAULT

                  Specify a value whose data type or value is inferred from its context. DEFAULT is used for assignments to table columns that have a default value, or to table columns that are generated either as an IDENTITY value or as an expression. NULL can be used only in a context where the type of the value is known. For example, a NULL can be assigned to a column of the table in an INSERT or UPDATE statement, because the type of the column is known. But if NULL is used in a SELECT list, it must be used in a CAST statement.

                  Value Expression

                  Value expression is a general name for all expressions that return a value. Different types of expressions are allowed in different contexts.

                  value expression primary

                  value expression primary

                  <value expression primary> ::= <parenthesized value expression> | <nonparenthesized value expression primary>

                  <parenthesized value expression> ::= <left paren> <value expression> <right paren>

                  <nonparenthesized value expression primary> ::= <unsigned value specification> | <column reference> | <set function specification> | <scalar subquery> | <case expression> | <cast specification> | <next value expression> | <current value expression> | <routine invocation>

                  Specify a value that is syntactically self-delimited.

                  value specification

                  value specification

                  <value specification> ::= <literal> | <general value specification>

                  <unsigned value specification> ::= <unsigned literal> | <general value specification>

                  <target specification> ::= <host parameter specification> | <SQL parameter reference> | <column reference> | <dynamic parameter specification>

                  <simple target specification> ::= <host parameter specification> | <SQL parameter reference> | <column reference> | <embedded variable name>

                  <host parameter specification> ::= <host parameter name> [ <indicator parameter> ]

                  <dynamic parameter specification> ::= <question mark>

                  Specify one or more values, host parameters, SQL parameters, dynamic parameters, or host variables.

                  row value expression

                  row value expression

                  <row value expression> ::= <row value special case> | <explicit row value constructor>

                  <row value predicand> ::= <row value special case> | <row value constructor predicand>

                  <row value special case> ::= <nonparenthesized value expression primary>

                  <explicit row value constructor> ::= <left paren> <row value constructor element> <comma> <row value constructor element list> <right paren> |

                  ROW <left paren> <row value constructor element list> <right paren> | <row subquery>

                  Specify a row consisting of one or more elements. A comma separated list of expressions, enclosed in brackets, with the optional keyword ROW. In SQL, a row containing a single element can often be used where a single value is expected.

                  set function specification

                  set function specification

                  <set function specification> ::= <aggregate function> | <grouping operation>

                  <grouping operation> ::= GROUPING <left paren> <column reference> [ { <comma> <column reference> }... ] <right paren>

                  Specify a value derived by the application of a function to an argument. Early releases of HyperSQL 2.0 do not support <grouping operation> .

                  COALESCE

                  coalesce expression

                  <coalesce expression> := COALESCE <left paren> <value expression> { <comma> <value expression> }... <right paren>

                  Replace null values with another value. The coalesce expression has two or more instances of <value expression>. If the first <value expression> evaluates to a non-null value, it is returned as the result of the coalesce expression. If it is null, the next <value expression> is evaluated and if it evaluates to a non-non value, it is returned, and so on.

                  The type of the return value of a COALESCE expression is the aggregate type of the types of all the <value expression> instances. Therefore, any value returned is implicitly cast to this type. HyperSQL also features built-in functions with similar functionality.

                  NULLIF

                  nullif expression

                  <nullif expression> := NULLIF <left paren> <value expression> <comma> <value expression> <right paren>

                  Return NULL if two values are equal. If the result of the first <value expression> is not equal to the result of the second, then it is returned, otherwise NULL is returned. The type of the return value is the type of the first <value expression>.

                  SELECT i, NULLIF(n, 'not defined') FROM t

                  CASE

                  case specification

                  <case specification> ::= <simple case> | <searched case>

                  <simple case> ::= CASE <case operand> <simple when clause>... [ <else clause> ] END

                  <searched case> ::= CASE <searched when clause>... [ <else clause> ] END

                  <simple when clause> ::= WHEN <when operand list> THEN <result>

                  <searched when clause> ::= WHEN <search condition> THEN <result>

                  <else clause> ::= ELSE <result>

                  <case operand> ::= <row value predicand> | <overlaps predicate part 1>

                  <when operand list> ::= <when operand> [ { <comma> <when operand> }... ]

                  <when operand> ::= <row value predicand> | <comparison predicate part 2> | <between predicate part 2> | <in predicate part 2> | <character like predicate part 2> | <octet like predicate part 2> | <similar predicate part 2> | <regex like predicate part 2> | <null predicate part 2> | <quantified comparison predicate part 2> | <match predicate part 2> | <overlaps predicate part 2> | <distinct predicate part 2>

                  <result> ::= <result expression> | NULL

                  <result expression> ::= <value expression>

                  Specify a conditional value. The result of a case expression is always a value. All the values introduced with THEN must be of the same type.

                  Some simple examples of the CASE expression are given below. The first two examples return 'Britain', 'Germany', or 'Other country' depending on the value of dialcode. The third example uses IN and smaller-than predicates.

                  CASE dialcode WHEN 44 THEN 'Britain' WHEN 49 THEN 'Germany' ELSE 'Other country' END
                  CASE WHEN dialcode=44 THEN 'Britain' WHEN dialcode=49 THEN 'Germany' WHEN dialcode < 0 THEN 'bad dial code' ELSE 'Other country' END
                  CASE dialcode WHEN IN (44, 49,30) THEN 'Europe' WHEN IN (86,91,91) THEN 'Asia' WHEN < 0 THEN 'bad dial code' ELSE 'Other continent' END
                  

                  The case statement can be far more complex and involve several conditions.

                  CAST

                  cast specification

                  <cast specification> ::= CAST <left paren> <cast operand> AS <cast target> <right paren>

                  <cast operand> ::= <value expression> | <implicitly typed value specification>

                  <cast target> ::= <domain name> | <data type>

                  Specify a data conversion. Data conversion takes place automatically among variants of a general type. For example numeric values are freely converted from one type to another in expressions.

                  Explicit type conversion is necessary in two cases. One case is to determine the type of a NULL value. The other case is to force conversion for special purposes. Values of data types can be cast to a character type. The exception is BINARY and OTHER types. The result of the cast is the literal expression of the value. Conversely, a value of a character type can be converted to another type if the character value is a literal representation of the value in the target type. Special conversions are possible between numeric and interval types, which are described in the section covering interval types.

                  The examples below show examples of cast with their result:

                  CAST (NULL AS TIMESTAMP)
                  CAST ('   199  ' AS INTEGER) = 199
                  CAST ('tRue ' AS BOOLEAN) = TRUE
                  CAST (INTERVAL '2' DAY AS INTEGER) = 2
                  CAST ('1992-04-21' AS DATE) = DATE '1992-04-21'
                  

                  NEXT VALUE FOR

                  next value expression

                  <next value expression> ::= NEXT VALUE FOR <sequence generator name>

                  Return the next value of a sequence generator. This expression can be used as a select list element in queries, or in assignments to table columns in data change statements. If the expression is used more than once in a single row that is being evaluated, the same value is returned for each invocation. After evaluation of the particular row is complete, the sequence generator will return a different value from the old value. The new value is generated by the sequence generator by adding the increment to the last value it generated. In the example below the expression is used in an insert statement:

                  INSERT INTO MYTABLE(COL1, COL2) VALUES 2, NEXT VALUE FOR MYSEQUENCE
                  

                  CURRENT VALUE FOR

                  current value expression

                  <current value expression> ::= CURRENT VALUE FOR <sequence generator name>

                  Return the latest value that was returned by the NEXT VALUE FOR expression for a sequence generator. In the example below, the value that was generated by the sequence for the first insert, is reused for the second insert:

                  INSERT INTO MYTABLE(COL1, COL2) VALUES 2, NEXT VALUE FOR MYSEQUENCE;
                  INSERT INTO CHILDTABLE(COL1, COL2) VALUES 10, CURRENT VALUE FOR MYSEQUENCE;
                  

                  value expression

                  value expression

                  <value expression> ::= <numeric value expression> | <string value expression> | <datetime value expression> | <interval value expression> | <boolean value expression> | <row value expression>

                  An expression that returns a value. The value can be a single value, or a row consisting more than one value.

                  numeric value expression

                  numeric value expression

                  <numeric value expression> ::= <term> | <numeric value expression> <plus sign> <term> | <numeric value expression> <minus sign> <term>

                  <term> ::= <factor> | <term> <asterisk> <factor> | <term> <solidus> <factor>

                  <factor> ::= [ <sign> ] <numeric primary>

                  <numeric primary> ::= <value expression primary> | <numeric value function>

                  Specify a numeric value. The BNF indicates that <asterisk> and <solidus> (the operators for multiplication and division) have precedence over <minus sign> and <plus sign>.

                  numeric value function

                  numeric value function

                  <numeric value function> ::= <position expression> | <extract expression> | <length expression> ...

                  Specify a function yielding a value of type numeric. The supported numeric value functions are listed and described in the Built In Functions chapter.

                  string value expression

                  string value expression

                  <string value expression> ::= <string concatenation> | <string factor>

                  <string factor> ::= <value expression primary> | <string value function>

                  <string concatenation> ::= <string value expression> <concatenation operator> <string factor>

                  <concatenation operator> ::= ||

                  Specify a character string value, a binary string value, or a bit string value. The BNF indicates that a string value expression can be formed by concatenation of two or more <value expression primary>. The types of the <value expression primary> elements must be compatible, that is, all must be string, or binary or bit string values.

                  character value function

                  string value function

                  <string value function> ::= ...

                  Specify a function that returns a character string or binary string. The supported character value functions are listed and described in the Built In Functions chapter.

                  datetime value expression

                  datetime value expression

                  <datetime value expression> ::= <datetime term> | <interval value expression> <plus sign> <datetime term> | <datetime value expression> <plus sign> <interval term> | <datetime value expression> <minus sign> <interval term>

                  <datetime term> ::= <datetime factor>

                  <datetime factor> ::= <datetime primary> [ <time zone> ]

                  <datetime primary> ::= <value expression primary> | <datetime value function>

                  <time zone> ::= AT <time zone specifier>

                  <time zone specifier> ::= LOCAL | TIME ZONE <interval primary>

                  Specify a datetime value. Details are described in the SQL Language chapter.

                  datetime value function

                  datetime value function

                  <datetime value function> ::= ...

                  Specify a function that returns a datetime value. The supported datetime value functions are listed and described in the Built In Functions chapter.

                  interval term

                  interval value expression

                  <interval value expression> ::= <interval term> | <interval value expression 1> <plus sign> <interval term 1> | <interval value expression 1> <minus sign> <interval term 1> | <left paren> <datetime value expression> <minus sign> <datetime term> <right paren> <interval qualifier>

                  <interval term> ::= <interval factor> | <interval term 2> <asterisk> <factor> | <interval term 2> <solidus> <factor> | <term> <asterisk> <interval factor>

                  <interval factor> ::= [ <sign> ] <interval primary>

                  <interval primary> ::= <value expression primary> [ <interval qualifier> ] | <interval value function>

                  <interval value expression 1> ::= <interval value expression>

                  <interval term 1> ::= <interval term>

                  <interval term 2> ::= <interval term>

                  Specify an interval value. Details are described in the SQL Language chapter.

                  interval absolute value function

                  interval value function

                  <interval value function> ::= <interval absolute value function>

                  <interval absolute value function> ::= ABS <left paren> <interval value expression> <right paren>

                  Specify a function that returns the absolute value of an interval. If the interval is negative, it is negated, otherwise the original value is returned.

                  boolean value expression

                  boolean value expression

                  <boolean value expression> ::= <boolean term> | <boolean value expression> OR <boolean term>

                  <boolean term> ::= <boolean factor> | <boolean term> AND <boolean factor>

                  <boolean factor> ::= [ NOT ] <boolean test>

                  <boolean test> ::= <boolean primary> [ IS [ NOT ] <truth value> ]

                  <truth value> ::= TRUE | FALSE | UNKNOWN

                  <boolean primary> ::= <predicate> | <boolean predicand>

                  <boolean predicand> ::= <parenthesized boolean value expression> | <nonparenthesized value expression primary>

                  <parenthesized boolean value expression> ::= <left paren> <boolean value expression> <right paren>

                  Specify a boolean value.

                  Predicates

                  Predicates are conditions with two sides and evaluate to a boolean value. The left side of the predicate, the <row value predicand>, is the common element of all predicates. This element is a generalisation of both <value expression>, which is a scalar, and of <explicit row value constructor>, which is a row. The two sides of a predicate can be split in CASE statements where the <row value predicand> is part of multiple predicates.

                  The number of fields in all <row value predicand> used in predicates must be the same and the types of the fields in the same position must be compatible for comparison. If either of these conditions does not hold, an exception is raised. The number of fields in a row is called the degree.

                  In many types of predicates (but not all of them), if the <row value predicand> evaluates to NULL, the result of the predicate is UNKNOWN. If the <row value predicand> has more than one element, and one or more of the fields evaluate to NULL, the result depends on the particular predicate.

                  comparison predicand

                  comparison predicate

                  <comparison predicate> ::= <row value predicand> <comp op> <row value predicand>

                  <comp op> ::= <equals operator> | <not equals operator> | <less than operator> | <greater than operator> | <less than or equals operator> | <greater than or equals operator>

                  Specify a comparison of two row values. If either <row value predicand> evaluates to NULL, the result of <comparison predicate> is UNKNOWN. Otherwise, the result is TRUE, FALSE or UNKNOWN.

                  If the degree of <row value predicand> is larger than one, comparison is performed between each field and the corresponding field in the other <row value predicand> from left to right, one by one.

                  When comparing two elements, if either field is NULL then the result is UNKNOWN.

                  For <equals operator>, if the result of comparison is TRUE for all field, the result of the predicate is TRUE. If the result of comparison is FALSE for one field, the result of predicate is FALSE. Otherwise the result is UNKNOWN.

                  The <not equals operator> is translated to NOT (<row value predicand> = <row value predicand>).

                  The <less than or equals operator> is translated to (<row value predicand> = <row value predicand>) OR (<row value predicand> < <row value predicand>). The <greater than or equals operator> is translated similarly.

                  For the <less than operator> and <greater than operator>, if two fields at a given position are equal, then comparison continues to the next field. Otherwise, the result of the last performed comparison is returned as the result of the predicate. This means that if the first field is NULL, the result is always UNKNOWN.

                  The logic that governs NULL values and UNKNOWN result is as follows: Suppose the NULL values were substituted by arbitrary real values. If substitution cannot change the result of the predicate, then the result is TRUE or FALSE, based on the existing non-NULL values, otherwise the result of the predicate is UNKNOWN.

                  The examples of comparison given below use literals, but the literals actually represent the result of evaluation of some expression.

                  ((1, 2, 3, 4) = (1, 2, 3, 4)) IS TRUE
                  ((1, 2, 3, 4) = (1, 2, 3, 5)) IS FALSE
                  ((1, 2, 3, 4) < (1, 2, 3, 4)) IS FALSE
                  ((1, 2, 3, 4) < (1, 2, 3, 5)) IS TRUE
                  ((NULL, 1, NULL) = (NULL, 1, NULL)) IS UNKNOWN  
                  ((NULL, 1, NULL) = (NULL, 2, NULL)) IS FALSE  
                  ((NULL, 1, NULL) <> (NULL, 2, NULL)) IS TRUE  
                  ((NULL, 1, 2) <all operators> (NULL, 1, 2)) IS UNKNOWN
                  ((1, NULL, ...) < (1, 2, ...)) IS UNKNOWN  
                  ((1, NULL, ...) < (2, NULL, ...)) IS TRUE
                  ((2, NULL, ...) < (1, NULL, ...)) IS FALSE
                  

                  BETWEEN

                  between predicate

                  <between predicate> ::= <row value predicand> <between predicate part 2>

                  <between predicate part 2> ::= [ NOT ] BETWEEN [ ASYMMETRIC | SYMMETRIC ] <row value predicand> AND <row value predicand>

                  Specify a range comparison. The default is ASYMMETRIC. The expression X BETWEEN Y AND Z is equivalent to (X >= Y AND X <= Z). Therefore if Y > Z, the BETWEEN expression is never true. The expression X BETWEEN SYMMETRIC Y AND Z is equivalent to (X >= Y AND X <= Z) OR (X >= Z AND X <= Y). The expression Z NOT BETWEEN ... is equivalent to NOT (Z BETWEEN ...). If any of the three <row value predicand> evaluates to NULL, the result is UNKNOWN.

                  IN

                  in predicate

                  <in predicate> ::= <row value predicand> [ NOT ] IN <in predicate value>

                  <in predicate value> ::= <table subquery> | <left paren> <in value list> <right paren>

                  | <left paren> UNNEST <left paren> <array value expression> <right paren> <right paren>

                  <in value list> ::= <row value expression> [ { <comma> <row value expression> }... ]

                  Specify a quantified comparison. The expression X NOT IN Y is equivalent to NOT (X IN Y). The ( <in value list> ) is converted into a table with one or more rows. The expression X IN Y is equivalent to X = ANY Y, which is a <quantified comparison predicate>.

                  If the <table subquery> returns no rows, the result is FALSE. Otherwise the <row value predicand> is compared one by one with each row of the <table subquery>.

                  If the comparison is TRUE for at least one row, the result is TRUE. If the comparison is FALSE for all rows, the result is FALSE. Otherwise the result is UNKNOWN.

                  HyperSQL supports an extension to the SQL Standard to allow an array to be used in the <in predicate value>. This is intended to be used with prepared statements where a variable length array of values can be used as the parameter value for each call. The example below shows how this is used in SQL. The JDBC code must create a new java.sql.Array object that contains the values and set the parameter with this array.

                  SELECT * FROM customer WHERE firstname IN ( UNNEST(?) )
                  
                  Connection conn;
                  PreparedStatement ps;
                  // conn and ps are instantiated here
                  Array arr = conn.createArrayOf("INTEGER", new Integer[] {1, 2, 3});
                  ps.setArray(1, arr);
                  ResultSet rs = ps.executeQuery();
                  

                  LIKE

                  like predicate

                  <like predicate> ::= <character like predicate> | <octet like predicate>

                  <character like predicate> ::= <row value predicand> [ NOT ] LIKE <character pattern> [ ESCAPE <escape character> ]

                  <character pattern> ::= <character value expression>

                  <escape character> ::= <character value expression>

                  <octet like predicate> ::= <row value predicand> [ NOT ] LIKE <octet pattern> [ ESCAPE <escape octet> ]

                  <octet pattern> ::= <binary value expression>

                  <escape octet> ::= <binary value expression>

                  Specify a pattern-match comparison for character or binary strings. The <row value predicand> is always a <string value expression> of character or binary type. The <character pattern> or <octet pattern> is a <string value expression> in which the underscore and percent characters have special meanings. The underscore means match any one character, while the percent means match a sequence of zero or more characters. The <escape character> or <escape octet> is also a <string value expression> that evaluates to a string of exactly one character length. If the underscore or the percent is required as normal characters in the pattern, the specified <escape character> or <escape octet> can be used in the pattern before the underscore or the percent. The <row value predicand> is compared with the <character pattern> and the result of comparison is returned. If any of the expressions in the predicate evaluates to NULL, the result of the predicate is UNKNOWN. The expression A NOT LIKE B is equivalent to NOT (A LIKE B). If the length of the escape is not 1 or it is used in the pattern not immediately before an underscore or a percent character, an exception is raised.

                  IS NULL

                  null predicate

                  <null predicate> ::= <row value predicand> IS [ NOT ] NULL

                  Specify a test for a null value. The expression X IS NOT NULL is NOT equivalent to NOT (X IS NULL)if the degree of the <row value predicand> is larger than 1. The rules are: If all fields are null, X IS NULL is TRUE and X IS NOT NULL is FALSE. If only some fields are null, both X IS NULL and X IS NOT NULL are FALSE. If all fields are not null, X IS NULL is FALSE and X IS NOT NULL is TRUE.

                  ALL and ANY

                  quantified comparison predicate

                  <quantified comparison predicate> ::= <row value predicand> <comp op> <quantifier> <table subquery>

                  <quantifier> ::= <all> | <some>

                  <all> ::= ALL

                  <some> ::= SOME | ANY

                  Specify a quantified comparison. For a quantified comparison, the <row value predicand> is compared one by one with each row of the <table sub query>.

                  If the <table subquery> returns no rows, then if ALL is specified the result is TRUE, but if SOME or ANY is specified the result is FALSE.

                  If ALL is specified, if the comparison is TRUE for all rows, the result of the predicate is TRUE. If the comparison is FALSE for at least one row, the result is FALSE. Otherwise the result is UNKNOWN.

                  If SOME or ANY is specified, if the comparison is TRUE for at least one row, the result is TRUE. If the comparison is FALSE for all rows, the result is FALSE. Otherwise the result is UNKNOWN. Note that the IN predicate is equivalent to the SOME or ANY predicate using the <equals operator>.

                  In the examples below, the date of an invoice is compared to holidays in a given year. In the first example the invoice date must equal one of the holidays, in the second example it must be later than all holidays (later than the last holiday), in the third example it must be on or after some holiday (on or after the first holiday), and in the fourth example, it must be before all holidays (before the first holiday).

                  invoice_date = SOME (SELECT holiday_date FROM holidays)
                  invoice_date > ALL (SELECT holiday_date FROM holidays)
                  invoice_date >= ANY (SELECT holiday_date FROM holidays)
                  invoice_date < ALL (SELECT holiday_date FROM holidays)
                  

                  EXISTS

                  exists predicate

                  <exists predicate> ::= EXISTS <table subquery>

                  Specify a test for a non-empty set. If the evaluation of <table subquery> results in one or more rows, then the expression is TRUE, otherwise FALSE.

                  UNIQUE

                  unique predicate

                  <unique predicate> ::= UNIQUE <table subquery>

                  Specify a test for the absence of duplicate rows. The result of the test is either TRUE or FALSE (never UNKNOWN). The rows of the <table subquery> that contain one or more NULL values are not considered for this test. If the rest of the rows are distinct from each other, the result of the test is TRUE, otherwise it is FALSE. The distinctness of rows X and Y is tested with the predicate X IS DISTINCT FROM Y.

                  MATCH

                  match predicate

                  <match predicate> ::= <row value predicand> MATCH [ UNIQUE ] [ SIMPLE | PARTIAL | FULL ] <table subquery>

                  Specify a test for matching rows. The default is MATCH SIMPLE without UNIQUE. The result of the test is either TRUE or FALSE (never UNKNOWN).

                  The interpretation of NULL values is different from other predicates and quite counter-intuitive. If the <row value predicand> is NULL, or all of its fields are NULL, the result is TRUE.

                  Otherwise, the <row value predicand> is compared with each row of the <table subquery>.

                  If SIMPLE is specified, if some field of <row value predicate> is NULL, the result is TRUE. Otherwise if <row value predicate> is equal to one or more rows of <table subquery> the result is TRUE if UNIQUE is not specified, or if UNIQUE is specified and only one row matches. Otherwise the result is FALSE.

                  If PARTIAL is specified, if the non-null values <row value predicate> are equal to those in one or more rows of <table subquery> the result is TRUE if UNIQUE is not specified, or if UNIQUE is specified and only one row matches. Otherwise the result is FALSE.

                  If FULL is specified, if some field of <row value predicate> is NULL, the result is FALSE. Otherwise if <row value predicate> is equal to one or more rows of <table subquery> the result is TRUE if UNIQUE is not specified, or if UNIQUE is specified and only one row matches.

                  Note that MATCH can also used be used in FOREIGN KEY constraint definitions. The exact meaning is described in the Schemas and Database Objects chapter.

                  OVERLAPS

                  overlaps predicate

                  <overlaps predicate> ::= <row value predicand> OVERLAPS <row value predicand>

                  Specify a test for an overlap between two datetime periods. Each <row value predicand> must have two fields and the fields together represent a datetime period. So the predicates is always in the form (X1, X2) OVERLAPS (Y1, Y2). The first field is always a datetime value, while the second field is either a datetime value or an interval value.

                  If the second value is an interval value, it is replaced with the sum of the datetime value and itself, for example (X1, X1 + X2) OVERLAPS (Y1, Y1 + Y 2).

                  If any of the values is NULL, the result is UNKNOWN.

                  The expression is true if there is there is any overlap between the two datetime periods. In the example below, the period is compared with a week long period ending yesterday.

                  (startdate, enddate) OVERLAPS (CURRENT_DATE - 7 DAY, CURRENT_DATE - 1 DAY)

                  IS DISTINCT

                  is distinct predicate

                  <distinct predicate> ::= <row value predicand> IS [ NOT ] DISTINCT FROM <row value predicand>

                  Specify a test of whether two row values are distinct. The result of the test is either TRUE or FALSE (never UNKNOWN). The degree the two <row value predicand> must be the same. Each field of the first <row value predicand> is compared to the field of the second <row value predicand> at the same position. If one field is NULL and the other is not NULL, or if the elements are NOT equal, then the result of the expression is TRUE. If no comparison result is TRUE, then the result of the predicate is FALSE. The expression X IS NOT DISTINCT FROM Y is equivalent to NOT (X IS DISTINCT FORM Y). The following check returns true if startdate is not equal to enddate. It also returns true if either startdate or enddate is NULL. It returns false in other cases.

                  startdate IS DISTINCT FROM enddate

                  Aggregate Functions

                  aggregate function

                  aggregate function

                  <aggregate function> ::= COUNT <left paren> <asterisk> <right paren> [ <filter clause> ] | <general set function> [ <filter clause> ] | <array aggregate function> [ <filter clause> ]

                  <general set function> ::= <set function type> <left paren> [ <set quantifier> ] <value expression> <right paren>

                  <set function type> ::= <computational operation>

                  <computational operation> ::= AVG | MAX | MIN | SUM | EVERY | ANY | SOME | COUNT | STDDEV_POP | STDDEV_SAMP | VAR_SAMP | VAR_POP | MEDIAN

                  <set quantifier> ::= DISTINCT | ALL

                  <filter clause> ::= FILTER <left paren> WHERE <search condition> <right paren>

                  <array aggregate function> ::= { ARRAY_AGG | GROUP_CONCAT } <left paren> [ <set quantifier> ] <value expression> [ <order by clause> ] [ SEPARATOR <separator> ] <right paren>

                  <separator> ::= <character string literal>

                  Specify a value computed from a collection of rows.

                  An aggregate function is used exclusively in a <query specification> and its use transforms a normal query into an aggregate query returning a single row instead of the multiple rows that the original query returns. For example, SELECT acolumn <table expression> is a query that returns the value of acolumn for all the rows the satisfy the given condition. But SELECT MAX(acolumn) <table expression> returns only one row, containing the largest value in that column. The query SELECT COUNT(*) <table expression> returns the count of rows, while SELECT COUNT(acolumn) <table expression> returns the count of rows where acolumn IS NOT NULL.

                  If the <table expression> is a grouped table (has a GROUP BY clause), the aggregate function returns the result of the COUNT or <computational operation> for each group. In this case the result has the same number of rows as the original grouped query. For example SELECT SUM(acolumn) <table expression> when <table expression> has a GROUP BY clause, returns the sum of values for acolumn in each group.

                  The SUM operations can be performed on numeric and interval expressions only. AVG and MEDIAN can be performed on numeric, interval or datetime expressions. AVG returns the average value, while SUM returns the sum of all values. If all values are NULL, the operations return NULL. MEDIAN returns the middle value in the sorted list of values.

                  MAX and MIN can be performed on all types of expressions and return the minimum or the maximum value. If all values are NULL, the operations return NULL.

                  COUNT(*) returns the count of all values, including nulls, while COUNT(<value expression>) returns the count of non-NULL values. COUNT with DISTINCT also accepts multiple arguments. In this usage the distinct combinations of the arguments are counted. Examples below:

                  SELECT COUNT(DISTINCT firstname, lastname) FROM customer
                  SELECT COUNT(DISTINCT (firstname, lastname)) FROM customer
                  

                  The EVERY, ANY and SOME operations can be performed on boolean expressions only. EVERY returns TRUE if all the values are TRUE, otherwise FALSE. ANY and SOME are the same operation and return TRUE if one of the values is TRUE, otherwise it returns FALSE.

                  The other operations perform the statistical functions STDDEV_POP, STDDEV_SAMP, VAR_SAMP, VAR_POP on numeric values. NULL values are ignored in calculations.

                  User defined aggregate functions can be defined and used instead of the built-in aggregate functions. Syntax and examples are given in the SQL-Invoked Routines chapter.

                  The <filter clause> allows you to add a search condition. When the search condition evaluates to TRUE for a row, the row is included in aggregation. Otherwise the row is not included. In the example below a single query returns two different filtered counts:

                  SELECT COUNT(ITEM) FILTER (WHERE GENDER = 'F') AS "FEMALE COUNT", COUNT(ITEM) FILTER (WHERE GENDER = 'M') AS "MALE COUNT" FROM PEOPLE
                  

                  ARRAY_AGG is different from all other aggregate functions, as it does not ignore the NULL values. This set function returns an array that contains all the values, for different rows, for the <value expression>. For example, if the <value expression> is a column reference, the SUM function adds the values for all the row together, while the ARRAY_AGG function adds the value for each row as a separate element of the array. ARRAY_AGG can include an optional <order by clause>. If this is used, the elements of the returned array are sorted according to the <order by clause>, which can reference all the available columns of the query, not just the <value expression> that is used as the ARRAY_AGG argument. The <order by clause> can have multiple elements and each element can include NULLS LAST or DESC qualifiers. No <separator> is used with this function.

                  GROUP_CONCAT is a specialised function derived from ARRAY_AGG. This function computes the array in the same way as ARRAY_AGG, removes all the NULL elements, then returns a string that is a concatenation of the elements of the array. If <separator> has been specified, it is used to separate the elements of the array. Otherwise the comma is used to separate the elements.

                  The example below shows a grouped query with ARRAY_AGG and GROUP_CONCAT. The CUSTOMER table that is included for tests in the DatabaseManager GUI app is the source of the data.

                  SELECT LASTNAME, ARRAY_AGG(FIRSTNAME ORDER BY FIRSTNAME) FROM Customer  GROUP BY LASTNAME
                  
                  LASTNAME  C2                                                         
                  --------- ---------------------------------------------------------- 
                  Steel     ARRAY['John','John','Laura','Robert']                      
                  King      ARRAY['George','George','James','Julia','Robert','Robert'] 
                  Sommer    ARRAY['Janet','Robert']                                    
                  
                  SELECT LASTNAME, GROUP_CONCAT(DISTINCT FIRSTNAME ORDER BY FIRSTNAME DESC SEPARATOR ' * ') FROM Customer  GROUP BY LASTNAME
                  
                  LASTNAME  C2                                                
                  --------- ------------------------------------------------- 
                  Steel     Robert * Laura * John                   
                  King      Robert * Julia * James * George         
                  Sommer    Robert * Janet

                  Other Syntax Elements

                  search condition

                  search condition

                  <search condition> ::= <boolean value expression>

                  Specify a condition that is TRUE, FALSE, or UNKNOWN. A search condition is often a predicate.

                  PATH

                  path specification

                  <path specification> ::= PATH <schema name list>

                  <schema name list> ::= <schema name> [ { <comma> <schema name> }... ]

                  Specify an order for searching for a user-defined SQL-invoked routine. This is not currently supported by HyperSQL.

                  routine invocation

                  routine invocation

                  <routine invocation> ::= <routine name> <SQL argument list>

                  <routine name> ::= [ <schema name> <period> ] <qualified identifier>

                  <SQL argument list> ::= <left paren> [ <SQL argument> [ { <comma> <SQL argument> }... ] ] <right paren>

                  <SQL argument> ::= <value expression> | <target specification>

                  Invoke an SQL-invoked routine. Examples are given in the SQL-Invoked Routines chapter.

                  COLLATE

                  collate clause

                  <collate clause> ::= COLLATE <collation name>

                  Specify a collation for a column or for an ORDER BY expression. This collation is used for comparing the values of the column in different rows. Comparison can happens during the execution of SELECT, UPDATE or DELETE statements, when a UNIQUE constraint or index is defined on the column, or when the the rows are sorted by an ORDER BY clause.

                  CONSTRAINT

                  constraint name definition

                  <constraint name definition> ::= CONSTRAINT <constraint name>

                  <constraint characteristics> ::= <constraint check time> [ [ NOT ] DEFERRABLE ] | [ NOT ] DEFERRABLE [ <constraint check time> ]

                  <constraint check time> ::= INITIALLY DEFERRED | INITIALLY IMMEDIATE

                  Specify the name of a constraint and its characteristics. This is an optional element of CONSTRAINT definition, not yet supported by HyperSQL.

                  Data Access Statements

                  HyperSQL fully supports all of SQL-92 data access statements, plus some additions from SQL:2008. Due to time constraints, the current version of this Guide does not cover the subject fully. You are advised to consult an SQL book such as the recent O'Reilly title "SQL and Relational Theory" by C. J. Date.

                  Database queries are data access statements. The most commonly used data access statement is the SELECT statement, but there are other statements that perform a similar role. Data access statements access tables and return result tables. The returned result tables are falsely called result sets, as they are not necessarily sets of rows, but multisets of rows.

                  Result tables are formed by performing the following operations on base tables and views. These operations are loosely based on Relational Algebra.

                  JOIN operations

                  SET and MULTISET operations

                  SELECTION

                  PROJECTION

                  COMPUTING

                  COLUMN NAMING

                  GROUPING and AGGREGATION

                  SELECTION AFTER GROUPING OR AGGREGATION

                  SET and MULTISET (COLLECTION) OPERATIONS

                  ORDERING

                  SLICING

                  Conceptually, the operations are performed one by one in the above order if they apply to the given data access statement. In the example below a simple select statement is made more complex by adding various operations.

                  CREATE TABLE atable (a INT, b INT, c INT, d INT, e INT, f INT);
                  /* in the next SELECT, no join is performed and no further operation takes place */
                  SELECT * FROM atable
                  /* in the next SELECT, selection is performed by the WHERE clause, with no further action */
                  SELECT * FROM atable WHERE a + b = c
                  /* in the next SELECT, projection is performed after the other operations */
                  SELECT d, e, f FROM atable WHERE a + b = c
                  /* in the next SELECT, computation is performed after projection */
                  SELECT (d + e) / f FROM atable WHERE a + b = c
                  /* in the next two SELECT statements, column naming is performed in different ways*/
                  SELECT (a + e) / f AS calc, f AS div FROM atable WHERE a + b = c
                  SELECT dcol, ecol, fcol FROM atable(acol, bcol, ccol, dcol, ecol, fcol) WHERE acol + bcol = ccol
                  /* in the next SELECT, both grouping and aggregation is performed */
                  SELECT d, e, SUM(f) FROM atable GROUP BY d, e
                  /* in the next SELECT, selection is performed after grouping and aggregation is performed */
                  SELECT d, e, SUM(f) FROM atable GROUP BY d, e HAVING SUM(f) > 10
                  /* in the next SELECT, a UNION is performed on two selects from the same table */
                  SELECT d, e, f FROM atable WHERE d = 3 UNION SELECT a, b, c FROM atable WHERE a = 30
                  /* in the next SELECT, ordering is performed */
                  SELECT (a + e) / f AS calc, f AS div FROM atable WHERE a + b = c ORDER BY calc DESC, div NULLS LAST
                  /* in the next SELECT, slicing is performed after ordering */
                  SELECT * FROM atable WHERE a + b = c ORDER BY a FETCH 5 ROWS ONLY
                  
                  

                  The next sections discuss various types of tables and operations involved in data access statements.

                  Select Statement

                  The SELECT statement itself does not cover all types of data access statements, which may combine multiple SELECT statements. The <query specification> is the most common data access statement and begins with the SELECT keyword.

                  SELECT STATEMENT

                  select statement (general)

                  Users generally refer to the SELECT statement when they mean a <query specification> or <query expression>. If a statement begins with SELECT and has no UNION or other set operations, then it is a <query specification>. Otherwise it is a <query expression>.

                  Table

                  In data access statements, a table can be a database table (or view) or an ephemeral table formed for the duration of the query. Some types of table are <table primary> and can participate in joins without the use of extra parentheses. The BNF in the Table Primary section below lists different types of <table primary>:

                  Tables can also be formed by specifying the values that are contained in them:

                  <table value constructor> ::= VALUES <row value expression list>

                  <row value expression list> ::= <table row value expression> [ { <comma> <table row value expression> }... ]

                  In the example below a table with two rows and 3 columns is constructed out of some values:

                  VALUES (12, 14, null), (10, 11, CURRENT_DATE)

                  When a table is used directly in a UNION or similar operation, the keyword TABLE is used with the name:

                  <explicit table> ::= TABLE <table or query name>

                  In the examples below, all rows of the two tables are included in the union. The keyword TABLE is used in the first example. The two examples below are equivalent.

                  TABLE atable UNION TABLE anothertable
                  SELECT * FROM atable UNION SELECT * FROM anothertable
                  

                  Subquery

                  A subquery is simply a query expression in brackets. A query expression is usually a complete SELECT statement and is discussed in the rest of this chapter. A scalar subquery returns one row with one column. A row subquery returns one row with one or more columns. A table subquery returns zero or more rows with one or more columns. The distinction between different forms of subquery is syntactic. Different forms are allowed in different contexts. If a scalar subquery or a row subquery return more than one row, an exception is raised. If a scalar or row subquery returns no row, it is usually treated as returning a NULL. Depending on the context, this has different consequences.

                  <scalar subquery> ::= <subquery>

                  <row subquery> ::= <subquery>

                  <table subquery> ::= <subquery>

                  <subquery> ::= <left paren> <query expression> <right paren>

                  Query Specification

                  A query specification is also known as a SELECT statement. It is the most common form of <derived table> . A <table expression> is a base table, a view or any form of allowed derived table. The SELECT statement performs projection, naming, computing or aggregation on the rows of the <table expression> .

                  <query specification> ::= SELECT [ DISTINCT | ALL ] <select list> <table expression>

                  <select list> ::= <asterisk> | <select sublist> [ { <comma> <select sublist> }... ]

                  <select sublist> ::= <derived column> | <qualified asterisk>

                  <qualified asterisk> ::= <asterisked identifier chain> <period> <asterisk>

                  <asterisked identifier chain> ::= <asterisked identifier> [ { <period> <asterisked identifier> }... ]

                  <asterisked identifier> ::= <identifier>

                  <derived column> ::= <value expression> [ <as clause> ]

                  <as clause> ::= [ AS ] <column name>

                  The qualifier DISTINCT or ALL apply to the results of the SELECT statement after all other operations have been performed. ALL simply returns the rows, while DISTINCT compares the rows and removes the duplicate ones.

                  Projection is performed by the <select list>.

                  A single <asterisk> means all columns of the <table expression> are included, in the same order as they appear in the <table expression>. An asterisk qualified by a table name means all the columns of the qualifier table name are included. If an unqualified asterisk is used, then no other items are allowed in the <select list>. When the the <table expression> is the direct result of NATURAL or USING joins, the use of <asterisk> includes the columns used for the join before the other columns. A qualified asterisk does not cover the join columns.

                  A derived column is a <value expression>, optionally named with the <as clause>. A <value expression> can be many things. Common types include: the name of a column in the <table expression>; an expression based on different columns or constant values; a function call; an aggregate function; a CASE WHEN expression.

                  Table Expression

                  A table expression is part of the SELECT statement and consists of the FROM clause with optional other clauses that performs selection (of rows) and grouping from the table(s) in the FROM clause.

                  <table expression> ::= <from clause> [ <where clause> ] [ <group by clause> ] [ <having clause> ]

                  <from clause> ::= FROM <table reference> [ { <comma> <table reference> }... ]

                  <table reference> ::= <table primary> | <joined table>

                  <table primary> ::= <table or query name> [ [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ] ]

                  | <derived table> [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]

                  | <lateral derived table> [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]

                  | <collection derived table> [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]

                  | <table function derived table> [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]

                  | <parenthesized joined table> [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]

                  <where clause> ::= WHERE <boolean value expression>

                  <group by clause> ::= GROUP BY [ <set quantifier> ] <grouping element> [ { <comma> <grouping element> }... ]

                  <having clause> ::= HAVING <boolean value expression>

                  The <from clause> contains one or more <table reference> separated by commas. A table reference is often a table or view name or a joined table.

                  The <where clause> filters the rows of the table in the <from clause> and removes the rows for which the search condition is not TRUE.

                  The <group by clause> is a comma separated list of columns of the table in the <from clause> or expressions based on the columns.

                  When a <group by clause> is used, only the columns used in the <group by clause> or expressions used there, can be used in the <select list>, together with any <aggregate function> on other columns. A <group by clause> compares the rows and groups together the rows that have the same values in the columns of the <group by clause>. Then any <aggregate function> in the <select list> is performed on each group, and for each group, a row is formed that contains the values of the columns of the <group by clause> and the values returned from each <aggregate function>. In the first example below, a simple column reference is used in GROUP BY, while in the second example, an expression is used.

                  CREATE TABLE atable (a INT, b INT, c INT, d INT, e INT, f INT);
                  SELECT d, e, f FROM atable WHERE a + b = c GROUP BY d, e, f
                  SELECT d + e, SUM(f) FROM atable WHERE a + b = c GROUP BY d + e HAVING SUM(f) > 2 AND d + e > 4
                  

                  A <having clause> filters the rows of the table that is formed after applying the <group by clause> using its search condition. The search condition must be an expression based on the expressions in the GROUP BY list or the aggregate functions used.

                  Table Primary

                  Table primary refers to different forms of table reference in the FROM clause.

                  The simplest form of reference is simply a name. This is the name of a table, a view, a transition table in a trigger definition, or a query name specified in the WITH clause of a query expression.

                  <table or query name> ::= <table name> | <transition table name> | <query name>

                  derived table

                  A query expression that is enclosed in parentheses and returns from zero to many rows is a <table subquery>. In a <derived table> the query expression is self contained and cannot reference the columns of other table references. This is the traditional and most common form of use of a <table subquery>.

                  <derived table> ::= <table subquery>

                  LATERAL

                  When the word LATERAL is used before a <table subquery>, it means the query expression can reference the columns of other table references that go before it.

                  <lateral derived table> ::= LATERAL <table subquery>

                  The use of <lateral derived table> completely transforms the way a query is written. For example, the two queries below are equivalent, but with different forms. The query with LATERAL is evaluated separately for each row of the first table that satisfies the WHERE condition. The example below uses the tables that are created and populated in DatabaseManagerSwing with the "Insert test data" menu option. The first query uses a scalar subquery to compute the sum of invoice values for each customer. The second query is equivalent and uses a join with a LATERAL table.

                  SELECT firstname, lastname, (SELECT SUM(total) FROM invoice WHERE customerid = customer.id) s FROM customer
                  
                  SELECT firstname, lastname, a.c FROM customer, LATERAL(SELECT SUM(total) FROM invoice WHERE customerid = customer.id) a (c)
                  

                  UNNEST

                  UNNEST is similar to LATERAL, but instead of a query expression, one or more expressions that return an array are used. These expressions are converted into a table which has one column for each expression and contains the elements of the array. If WITH ORDINALITY is used, an extra column that contains the index of each element is added to this table. The number or rows in the table equals the length of the largest arrays. The smaller arrays are padded with NULL values. If an <array value expression> evaluates to NULL, an empty array is used in its place. The array expression can contain references to any column of the table references preceding the current table reference.

                  <collection derived table> ::= UNNEST <left paren> <array value expression>, ... <right paren> [ WITH ORDINALITY ]

                  The <array value expression> can be the result of a function call. If the arguments of the function call are values from the tables on the left of the UNNEST, then the function is called for each row of table.

                  In the first example below, UNNEST is used with the built in-function SEQUENCE_ARRAY to build a table containing dates for the last seven days and their ordinal position. In the second example, a select statement returns costs for the last seven days . In the third example, the WITH clause turns the two selects into named subqueries which are used in a SELECT statement that uses a LEFT join.

                  SELECT * FROM UNNEST(SEQUENCE_ARRAY(CURRENT_DATE - 7 DAY, CURRENT_DATE - 1 DAY, 1 DAY)) WITH ORDINALITY AS T(D, I)  
                  
                  D          I 
                  ---------- - 
                  2010-07-25 1 
                  2010-07-26 2 
                  2010-07-27 3 
                  2010-07-28 4 
                  2010-07-29 5 
                  2010-07-30 6 
                  2010-07-31 7 
                  
                  CREATE TABLE expenses (item_date DATE, cost DECIMAL(8,2))
                  --
                  SELECT item_date, SUM(cost) AS s FROM expenses WHERE item_date >= CURRENT_DATE - 7 DAY GROUP BY item_date
                  
                  ITEM_DATE  S      
                  ---------- ------ 
                  2010-07-27 100.12 
                  2010-07-29 50.45  
                  
                  WITH costs(i_d, s) AS (SELECT item_date, SUM(cost) AS s FROM expenses WHERE item_date >= CURRENT_DATE - 7 DAY GROUP BY item_date),
                  dates(d, i) AS (SELECT * FROM UNNEST(SEQUENCE_ARRAY(CURRENT_DATE - 7 DAY, CURRENT_DATE - 1 DAY, 1 DAY)) WITH ORDINALITY)   
                  SELECT i, d, s FROM dates LEFT OUTER JOIN costs ON dates.d = costs.i_d
                  
                  I D          S      
                  - ---------- ------ 
                  1 2010-07-25 (null) 
                  2 2010-07-26 (null) 
                  3 2010-07-27 100.12 
                  4 2010-07-28 (null) 
                  5 2010-07-29 50.45  
                  6 2010-07-30 (null) 
                  7 2010-07-31 (null) 
                  
                  

                  TABLE

                  When TABLE is used in this context, the <collection value expression> must be the result of a function call to a built-in function or user-defined function that returns an array or a table. When the function returns an array, this array is converted into a table, similar to the way UNNEST operates. When the function returns a table, the result is a MULTISET and is used as is.

                  <table function derived table> ::= TABLE <left paren> <collection value expression> <right paren>

                  column name list

                  The column list that is specified for the table reference must contain names that are unique within the list

                  <derived column list> ::= <column name list>

                  <column name list> ::= <column name> [ { <comma> <column name> }... ]

                  A parenthesized joined table is simply a joined table contained in parentheses. Joined tables are discussed below.

                  <parenthesized joined table> ::= <left paren> <parenthesized joined table> <right paren> | <left paren> <joined table> <right paren>

                  Joined Table

                  Joins are operators with two table as the operands, resulting in a third table, called joined table. All join operators are evaluated left to right, therefore, with multiple joins, the table resulting from the first join operator becomes an operand of the next join operator. Parentheses can be used to group sequences of joined tables and change the evaluation order. So if more than two tables are joined together with join operators, the end result is also a joined table. There are different types of join, each producing the result table in a different way.

                  <joined table> ::= <cross join> | <qualified join> | <natural join>

                  <cross join> ::= <table reference> CROSS JOIN <table factor>

                  <qualified join> ::= <table reference> | [ <join type> ] JOIN <table reference> <join specification>

                  <natural join> ::= <table reference> NATURAL [ <join type> ] JOIN <table factor>

                  <join specification> ::= <join condition> | <named columns join>

                  <join condition> ::= ON <search condition>

                  <named columns join> ::= USING <left paren> <join column list> <right paren>

                  <join type> ::= INNER | <outer join type> [ OUTER ]

                  <outer join type> ::= LEFT | RIGHT | FULL

                  <join column list> ::= <column name list>

                  CROSS JOIN

                  The simplest form of join is CROSS JOIN. The CROSS JOIN of two tables is a table that has all the columns of the first table, followed by all the columns of the second table, in the original order. Each row of the first table is combined with each row of the second table to fill the rows of the new table. If the rows of each table form a set, then the rows of the CROSS JOIN table form the Cartesian product of the rows of the two table operands.

                  Conditions are not allowed as part of a cross join, which is simply A CROSS JOIN B. Any conditions in a WHERE clause are later applied to the table resulting from the cross join.

                  Tables in the FROM CLAUSE separated with commas, are equivalent to cross joins between the tables. Two joined tables separated with a comma, such as A, B, is equivalent to (A) CROSS JOIN (B), which means the joined tables A and B are populated separately before they are joined.

                  CROSS JOIN is not is not generally very useful, as it returns large result tables unless WHERE conditions are used.

                  UNION JOIN

                  The UNION JOIN has limited use in queries. The result table has the same columns as that of CROSS JOIN. Each row of the first table is extended to the right with nulls and added to the new table. Each row of the second table is extended to the left with nulls and added to the new table. The UNION JOIN is expressed as A UNION JOIN B. This should not be confused with A UNION B, which is a set operation. Union join is for special applications and is not commonly used.

                  JOIN ... ON

                  The condition join is similar to CROSS JOIN, but a condition is tested for each row of the new table and the row is created only if the condition is true. This form of join is expressed as A JOIN B ON (<search condition>).

                  Equijoin is a condition join in which the search condition is an equality condition between on or more pairs of columns from the two table. Equijoin is the most commonly used type of join.

                  SELECT a.*, b.* FROM a INNER JOIN b ON a.col_one = b.col_two
                  

                  JOIN ... USING

                  NATURAL JOIN

                  Joins with USING or NATURAL keywords joins are similar to an equijoin but they cannot be replaced simply with an equijoin. The new table is formed with the specified or implied shared columns of the two tables, followed by the rest of the columns from each table. In NATURAL JOIN, the shared columns are all the column pairs that have the same name in the first and second table. In JOIN USING, only columns names that are specified by the USING clause are shared. The joins are expressed as A NATURAL JOIN B, and A JOIN B USING (<comma separated column name list>).

                  The columns of the joined table are formed by the following procedures: In JOIN ... USING the shared columns are added to the joined table in the same order as they appear in the column name list. In NATURAL JOIN the shared columns are added to the joined table in the same order as they appear in the first table. In both forms of join, the non-shared columns of the first table are added in the order they appear in the first table, finally the non-shared columns of the second table are added in the order they appear in the second table.

                  The type of each shared column of the joined table is based on the type of the columns in the original tables. If the original types are not exactly the same, the type of the shared column is formed by type aggregation. Type aggregations selects a type that can represent values of both aggregated types. Simple type aggregation picks one of the types. For example SMALLINT and INTEGER, results in INTEGER, or VARCHAR(10) and VARCHAR(20) results in VARCHAR(20). More complex type aggregation inherits properties from both types. For example DECIMAL(8) and DECIMAL (6,2) results in DECIMAL (8,2).

                  In the examples below, the rows are joined exactly the same way, but the first query contains a.col_two and b.col_two together with all the rest of the columns of both tables, while the second query returns only one copy of col_two.

                  SELECT * FROM a INNER JOIN b ON a.col_two = b.col_two
                  SELECT * FROM a INNER JOIN b USING (col_two)
                  

                  OUTER JOIN

                  LEFT, RIGHT and FULL OUTER JOIN

                  The three qualifiers can be added to all types of JOIN except CROSS JOIN and UNION JOIN. First the new table is populated with the rows from the original join. If LEFT is specified, all the rows from the first table that did not make it into the new table are extended to the right with nulls and added to the table. If RIGHT is specified, all the rows from the second table that did not make it into the new table are extended to the left with nulls and added to the table. If FULL is specified, the addition of leftover rows is performed from both the first and the second table. These forms are expressed by prefixing the join specification with the given keyword. For example A LEFT OUTER JOIN B ON (<search condition>) or A NATURAL FULL OUTER JOIN B or A FULL OUTER JOIN B USING (<comma separated column name list>).

                  SELECT a.*, b.* FROM a LEFT OUTER JOIN b ON a.col_one = b.col_two
                  

                  Selection

                  Despite the name, selection has nothing to do with the list of columns in a SELECT statement. In fact, it refers to the search condition used to limit the rows that from a result table (selection of rows, not columns). In SQL, simple selection is expressed with a WHERE condition appended to a single table or a joined table. In some cases, this method of selection is the only method available. For example in DELETE and UPDATE statements. But when it is possible to perform the selection with join conditions, this is the better method, as it results in a clearer expression of the query.

                  Projection

                  Projection is selection of the columns from a simple or joined table to form a result table. Explicit projection is performed in the SELECT statement by specifying the select column list. Some form of projection is also performed in JOIN ... USING and NATURAL JOIN.

                  The joined table has columns that are formed according to the rules mentioned above. But in many cases, not all the columns are necessary for the intended operation. If the statement is in the form, SELECT * FROM <joined table>, then all the columns of <joined table> are returned. But normally, the columns to be returned are specified after the SELECT keyword, separated from each other with commas.

                  Computed Columns

                  In the select list, it is possible to use expressions that reference any columns of <joined table>. Each of these expressions forms a computed column. It is computed for each row of the result table, using the values of the columns of the <joined table> for that row.

                  Naming

                  Naming is used to hide the original names of tables or table columns and to replace them with new names in the scope of the query. Naming is also used for defining names for computed columns.

                  Without explicit naming, the name of a column is a predefined name. If the column is a column of a table, or is a named parameter, the name is of the table column or parameter is used. Otherwise it is generated by the database engine. HyperSQL generates column names such as C1, C2, etc. As generated naming is implementation defined according to the SQL Standard, it is better to explicitly name the computed and derived columns in your applications.

                  Naming in Joined Table

                  Naming is performed by adding a new name after a table's real name and by adding a list of column names after the new table name. Both table naming and column naming are optional, but table naming is required for column naming. The expression A [AS] X (<comma separated column name list>) means table A is used in the query expression as table X and its columns are named as in the given list. The original name A, or its original column names, are not visible in the scope of the query. The BNF is given below. The <correlation name> can be the same or different from the name of the table. The <derived column list> is a comma separated list of column names. The degree of this list must be equal to the degree of the table. The column names in the list must be distinct. They can be the same or different from the names of the table's columns.

                  <table or query name> [ [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ] ]

                  In the examples below, the columns of the original tables are named (a, b, c, d, e, f). The two queries are equivalent. In the second query, the table and its columns are renamed and the new names are used in the WHERE clauses:

                  CREATE TABLE atable (a INT, b INT, c INT, d INT, e INT, f INT);
                  SELECT d, e, f FROM atable WHERE a + b = c
                  SELECT x, y, z FROM atable AS t (u, v, w, x, y, z)  WHERE u + v = w

                  Naming in Select List

                  Naming in the SELECT list logically takes place after naming in the joined table. The new names for columns are not visible in the immediate query expression or query expression. They become visible in the ORDER BY clause and in the result table that is returned to the user. Or if the query expression is used as a derived table in an enclosing query expression.

                  In the example below, the query is on the same table but with column renaming in the Select list. The new names are used in the ORDER BY clause:

                  SELECT x + y AS xysum, y + z AS yzsum FROM atable AS t (u, v, w, x, y, z)  WHERE u + v = w ORDER BY xysum, yzsum

                  If the names xysum or yzsum are not used, the computed columns cannot be referenced in the ORDER BY list.

                  Name Resolution

                  In a joined table, if a column name appears in tables on both sides then any reference to the name must use the table name in order to specify which table is being referred to.

                  Grouping Operations

                  Grouping Operations

                  Grouping results in the elimination of duplicate rows. A grouping operation is performed after the operations discussed above. A simple form of grouping is performed by the use of DISTINCT after SELECT. This eliminates all the duplicate rows (rows that have the same value in each of their columns when compared to another row). The other form of grouping is performed with the GROUP BY clause. This form is usually used together with aggregation.

                  Aggregation

                  Aggregation is an operation that computes a single value from the values of a column over several rows. The operation is performed with an aggregate function. The simplest form of aggregation is counting, performed by the COUNT function.

                  Other common aggregate functions return the maximum, minimum and average value among the values in different rows.

                  Set Operations

                  Set and Multiset Operations

                  While join operations generally result in laterally expanded tables, SET and COLLECTION operations are performed on two tables that have the same degree and result in a table of the same degree. The SET operations are UNION, INTERSECT and EXCEPT (difference). When each of these operations is performed on two tables, the collection of rows in each table and in the result is reduced to a set of rows, by eliminating duplicates. The set operations are then performed on the two tables, resulting in the new table which itself is a set of rows. Collection operations are similar but the tables are not reduced to sets before or after the operation and the result is not necessarily a set, but a collection of rows.

                  The set operations on two tables A and B are: A UNION [DISTINCT] B, A INTERSECT [DISTINCT] B and A EXCEPT [DISTINCT] B. The result table is formed in the following way: The UNION operation adds all the rows from A and B into the new table, but avoids copying duplicate rows. The INTERSECT operation copies only those rows from each table that also exist in the other table, but avoids copying duplicate rows. The EXCEPT operation copies those rows from the first table which do not exist in the second table, but avoids copying duplicate rows.

                  The collection operations are similar to the set operations, but can return duplicate rows. They are A UNION ALL B, A INTERSECT ALL B and A EXCEPT ALL B. The UNION ALL operation adds all the rows from A and B into the new table. The INTERSECT operation copies only those rows from each table that also exist in the other table. If n copies of a rows exists in one table, and m copies in the other table, the number of copies in the result table is the smaller of n and m. The EXCEPT operation copies those rows from the first table which do not exist in the second table. If n copies of a row exist in the first table and m copies in the second table the number of copies in the result table is n-m, or if n < m, then zero.

                  With Clause and Recursive Queries

                  The optional WITH clause can be used in a query expression. The WITH clause lists one or more named ephemeral tables that can be referenced in the query expression body. The ephemeral tables are created and populated before the rest of the query expression is executed. Their contents do not change during the execution of the <query expression body>.

                  <with clause> ::= WITH [ RECURSIVE ] <with list>

                  <with list> ::= <with list element> [ { <comma> <with list element> }... ]

                  <with list element> ::= <query name> [ <left paren> <with column list> <right paren> ] AS <left paren> <query expression> <right paren>

                  <with column list> ::= <column name list>

                  An example of the use of the WITH clause is given above under UNNEST. The <query expression> in the WITH clause is evaluated once and its result table can be referenced in the body of the main <query expression body> using the specified <query name>.

                  The RECURSIVE keyword changes the way the elements of the <with list> are interpreted. The <query expression> contained in the <with list element> must be the UNION or UNION ALL of two <query expression body> elements (simple VALUES or SELECT statements). The left element of the UNION is evaluated first and its result becomes the result of the <with list element>. After this step, the current result of the <with list element> is referenced in the right element (a SELECT statement) of the UNION, the UNION is performed between the result and previous result of the <with list element>, which is enlarged by this operation. The UNION operation is performed again and again, until the result of the <with list element> stops changing. The result of the <with list element> is now complete and is later used in the execution of the <query expression body>. When RECURSIVE is used, the <with column list> must be defined.

                  HyperSQL limits recursion to 265 rounds. If this is exceeded, an error is raised.

                  A trivial example of a recursive query is given below. Note the first column GEN. For example, if each row of the table represents a member of a family of dogs, together with its parent, the first column of the result indicates the calculated generation of each dog, ranging from first to fourth generation.

                  CREATE TABLE pptree (pid INT, id INT);
                  INSERT INTO pptree VALUES (NULL, 1) ,(1,2), (1,3),(2,4),(4,5),(3,6),(3,7);
                  
                  WITH RECURSIVE tree (gen, par, child) AS (
                    VALUES(1, CAST(null as int), 1)
                    UNION
                    SELECT gen + 1, pid, id FROM pptree, tree WHERE pid = child
                    ) SELECT * FROM tree;
                  
                  GEN PAR    CHILD 
                  --- ------ ----- 
                  1   (null) 1     
                  2   1      2     
                  2   1      3     
                  3   2      4     
                  3   3      6     
                  3   3      7     
                  4   4      5

                  if recursive queries become complex they also become very difficult to develop and debug. HyperSQL provides an alternative to this with user-defined SQL functions which return tables. Functions can perform any complex, repetitive task with better control, using loops, variables and, if necessary, recursion.

                  Query Expression

                  A query expression consists of an optional WITH clause and a query expression body. The optional WITH clause lists one or more named ephemeral tables that can be referenced, just like the database tables in the query expression body.

                  <query expression> ::= [ <with clause> ] <query expression body>

                  A query expression body refers to a table formed by using UNION and other set operations. The query expression body is evaluated from left to right and the INTERSECT operator has precedence over the UNION and EXCEPT operators. A simplified BNF is given below:

                  <query expression body> ::= <query term> | <query expression body> UNION | EXCEPT [ ALL | DISTINCT ] [ <corresponding spec> ] <query term>

                  <query term> ::= <query primary> | <query term> INTERSECT [ ALL | DISTINCT ] [ <corresponding spec> ] <query term>

                  <query primary> ::= <simple table> | <left paren> <query expression body> [ <order by clause> ] [ <result offset clause> ] [ <fetch first clause> ] <right paren>

                  <simple table> ::= <query specification> | <table value constructor> | <explicit table> <explicit table> ::= TABLE <table or query name>

                  <corresponding spec> ::= CORRESPONDING [ BY <left paren> <column name list> <right paren> ]

                  A <query term> and a <query primary> can be a SELECT statement, an <explicit table>, or a <table value constructor>.

                  The CORRESPONDING clause is optional. If it is not specified, then the <query term> and the <query primary> must have the same number of columns. If CORRESPONDING is specified, the two sides need not have the same number of columns. If no column list is used with CORRESPONDING, then all the column names that are common in the tables on two sides are used in the order in which they appear in the first table. If a columns list is used, it allows you to select only some columns of the tables on the left and right side to create the new table. In the example below the columns named u and v from the two SELECT statements are used to create the UNION table.

                  SELECT * FROM atable UNION CORRESPONDING BY (u, v) SELECT * FROM anothertable
                  

                  The type of each column of the query expression is determined by combining the types of the corresponding columns from the two participating tables.

                  Ordering

                  When the rows of the result table have been formed, it is possible to specify the order in which they are returned to the user. The ORDER BY clause is used to specify the columns used for ordering, and whether ascending or descending ordering is used. It can also specify whether NULL values are returned first or last.

                  SELECT x + y AS xysum, y + z AS yzsum FROM atable AS t (u, v, w, x, y, z)  WHERE u + v = w ORDER BY xysum NULLS LAST, yzsum NULLS FIRST

                  The ORDER BY clause specifies one or more <value expressions>. The list of rows is sorted according to the first <value expression>. When some rows are sorted equal then they are sorted according to the next <value expression> and so on.

                  <order by clause> ::= ORDER BY <sort specification> [ { <comma> <sort specification> }... ]

                  <sort specification> ::= <value expression> [ <collate clause> ] [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ]

                  The defaults are ASC and NULLS FIRST.

                  A collation is used for columns of an ORDER BY expression that are of the type CHAR or VARCHAR. If a <collate clause> is not specified then the collation of the column, or the default collation of the database is used.

                  An ORDER BY operation can sometimes be optimised by the engine when it can use the same index for accessing the table data and ordering. Optimisation can happen both with DESC + NULLS LAST and ASC + NULLS FIRST.

                  sort specification list

                  sort specification list

                  <sort specification list> ::= <value expression> [ASC | DESC] [NULLS FIRST | NULLS LAST]

                  Specify a sort order. A sort operation is performed on the result of a <query expression> or <query specification> and sorts the result according to one or more <value expression>. The <value expression> is usually a single column of the result, but in some cases it can be a column of the <table expression> that is not used in the select list. The default is ASC and NULLS FIRST.

                  Slicing

                  A different form of limiting the rows can be performed on the result table after it has been formed according to all the other operations (selection, grouping, ordering etc.). This is specified by the FETCH ... ROWS and OFFSET clauses of a SELECT statement. In this form, the specified OFFSET rows are removed from start of the table, then up to the specified FETCH rows are kept and the rest of the rows are discarded.

                  <result offset clause> ::= OFFSET <offset row count> { ROW | ROWS }

                  <fetch first clause> ::= FETCH { FIRST | NEXT } [ <fetch first row count> ] { ROW | ROWS } ONLY [ USING INDEX ]

                  <limit clause> ::= LIMIT <fetch first row count> [ USING INDEX ]

                  A slicing operation takes the result set that has been already processed and ordered. It then discards the specified number of rows from the start of the result set and returns the specified number of rows after the discarded rows. The <offset row count> and <fetch first row count> can be constants, dynamic variables, routine parameters, or routine variables. The type of the constants must be INTEGER.

                  SELECT a, b FROM atable WHERE d < 5 ORDER BY absum OFFSET 3 FETCH 2 ROWS ONLY 
                  SELECT a, b FROM atable WHERE d < 5 ORDER BY absum OFFSET 3 LIMIT 2 /* alternative keyword */ 

                  When the FETCH keyword is used, the specified number of rows must be at least 1, otherwise an error is returned. This behaviour is consistent with the SQL Standard. When the LIMIT keyword is used, the specified number of rows can be zero, which means return all rows (no LIMIT). In MySQL and PostgreSQL syntax modes, zero limit means no rows (empty result).

                  If there is an index on all the columns specified in the ORDER BY clause, it is normally used for slicing. In some queries, an index on another column may take precedence. It is possible to add USING INDEX to the end of the slicing clause to force the use of the index for ordering and slicing.

                  Data Change Statements

                  Delete Statement

                  DELETE FROM

                  delete statement: searched

                  <delete statement: searched> ::= DELETE FROM <target table> [ [ AS ] <correlation name> ] [ WHERE <search condition> ]

                  Delete rows of a table. The search condition is a <boolean value expression> that is evaluated for each row of the table. If the condition is true, the row is deleted. If the condition is not specified, all the rows of the table are deleted. In fact, an implicit SELECT is performed in the form of SELECT * FROM <target table> [ WHERE <search condition>] and the selected rows are deleted. When used in JDBC, the number of rows returned by the implicit SELECT is returned as the update count.

                  If there are FOREIGN KEY constraints on other tables that reference the subject table, and the FOREIGN KEY constraints have referential actions, then rows from those other tables that reference the deleted rows are either deleted, or updated, according to the specified referential actions.

                  In the second example below the rows that have the maximum value for column A are deleted;

                  DELETE FROM T WHERE C > 5
                  DELETE FROM T AS TT WHERE TT.A = (SELECT MAX(A) FROM T)
                  

                  Truncate Statement

                  TRUNCATE TABLE

                  truncate table statement

                  <truncate table statement> ::= TRUNCATE TABLE <target table> [ <identity column restart option> ] [ <truncate options> ]

                  <identity column restart option> ::= CONTINUE IDENTITY | RESTART IDENTITY

                  <truncate options> ::= AND COMMIT [ NO CHECK ]

                  Delete all rows of a table without firing its triggers. This statement can only be used on base tables (not views). If the table is referenced in a FOREIGN KEY constraint defined on another table, the statement causes an exception. Triggers defined on the table are not executed with this statement. The default for <identity column restart option> is CONTINUE IDENTITY. This means no change to the IDENTITY sequence of the table. If RESTART IDENTITY is specified, then the sequence is reset to its start value.

                  TRUNCATE is faster than ordinary DELETE. The TRUNCATE statement is an SQL Standard data change statement, therefore it is performed under transaction control and can be rolled back if the connection is not in the auto-commit mode.

                  HyperSQL also supports the optional AND COMMIT and NO CHECK options. If AND COMMIT is used, then the transaction is committed with the execution of the TRUNCATE statement. The action cannot be rolled back. If the additional NO CHECK option is also specified, then the TRUNCATE statement is executed even if the table is referenced in a FOREIGN KEY constraint defined on another, non-empty table. This form of TRUNCATE is faster than the default form and does not use much memory.

                  TRUNCATE SCHEMA

                  truncate schema statement

                  <truncate schema statement> ::= TRUNCATE SCHEMA <target schema> [ <identity column restart option> ] AND COMMIT [ NO CHECK ]

                  Performs the equivalent of a TRUNCATE TABLE ... AND COMMIT on all the table in the schema. If the additional NO CHECK option is also specified, then the TRUNCATE statement is executed even if any of the tables in the schema is referenced in a FOREIGN KEY constraint defined on a non-empty table in a different schema.

                  If RESTART IDENTITY is specified, all table IDENTITY sequences and all SEQUENCE objects in the schema are reset to their start values.

                  Use of this statement requires schema ownership or administrative privileges.

                  Insert Statement

                  INSERT INTO

                  insert statement

                  <insert statement> ::= INSERT INTO <target table> <insert columns and source>

                  <insert columns and source> ::= <from subquery> | <from constructor> | <from default>

                  <from subquery> ::= [ <left paren> <insert column list> <right paren> ] [ <override clause> ] <query expression>

                  <from constructor> ::= [ <left paren> <insert column list> <right paren> ] [ <override clause> ] <contextually typed table value constructor>

                  <override clause> ::= OVERRIDING USER VALUE | OVERRIDING SYSTEM VALUE

                  <from default> ::= DEFAULT VALUES

                  <insert column list> ::= <column name list>

                  Insert new rows in a table. An INSERT statement inserts one or more rows into the table.

                  The special form, INSERT INTO <target table> DEFAULT VALUES can be used with tables which have a default value for each column.

                  With the other forms of INSERT, the optional (<insert column list>) specifies to which columns of the table the new values are assigned.

                  In one form, the inserted values are from a <query expression> and all the rows that are returned by the <query expression> are inserted into the table. If the <query expression> returns no rows, nothing is inserted.

                  In the other form, a comma separated list of values called <contextually typed table value constructor> is used to insert one or more rows into the table. This list is contextually typed, because the keywords NULL and DEFAULT can be used for the values that are assigned to each column of the table. The keyword DEFAULT means the default value of the column and can be used only if the target column has a default value or is an IDENTITY or GENERATED column of the table.

                  The <override clause> must be used when a value is explicitly assigned to a column that has been defined as GENERATED ALWAYS AS IDENTITY. The clause, OVERRIDE SYSTEM VALUE means the provided values are used for the insert, while OVERRIDING USER VALUE means the provided values are simply ignored and the values generated by the system are used instead.

                  An array can be inserted into a column of the array type by using literals, by specifying a parameter in a prepared statement or an existing array returned by query expression. The last example below inserts an array.

                  The rows that are inserted into the table are checked against all the constraints that have been declared on the table. The whole INSERT operation fails if any row fails to inserted due to constraint violation. Examples:

                  INSERT INTO T DEFAULT VALUES /* all columns of T have DEFAULT clauses */
                  INSERT INTO T (SELECT * FROM Z) /* table Z has the same columns as table T */
                  INSERT INTO T (A,B) VALUES ((1,2),(3,NULL), (DEFAULT,6)) /* three rows are inserted into table T */
                  INSERT INTO T VALUES 3, ARRAY['hot','cold']
                  

                  If the table contains an IDENTITY column, the value for this column for the last row inserted by a session can be retrieved using a call to the IDENTITY() function. This call returns the last value inserted by the calling session. When the insert statement is executed with a JDBC Statement or PreparedStatement method, the getGeneratedKeys() method of Statement can be used to retrieve not only the IDENTITY column, but also any GENERATED computed column, or any other column. The getGeneratedKeys() returns a ResultSet with one or more columns. This contains one row per inserted row, and can therefore return all the generated columns for a multi-row insert.

                  There are three methods of specifying which generated keys should be returned. The first method does not specify the columns of the table. With this method, the returned ResultSet will have a column for each column of the table that is defined as GENERATED ... AS IDENTITY or GENERATED ... AS (<expression>). The two other methods require the user to specify which columns should be returned, either by column indexes, or by column names. With these methods, there is no restriction on which columns of the inserted values to be returned. This is especially useful when some columns have a default clause which is a function, or when there are BEFORE triggers on the table that may provide the inserted value for some of the columns.

                  Update Statement

                  UPDATE

                  update statement: searched

                  <update statement: searched> ::= UPDATE <target table> [ [ AS ] <correlation name> ] SET <set clause list> [ WHERE <search condition> ]

                  Update rows of a table. An UPDATE statement selects rows from the <target table> using an implicit SELECT statement formed in the following manner:

                  SELECT * FROM <target table> [ [ AS ] <correlation name> ] [ WHERE <search condition> ]

                  Then it applies the SET <set clause list> expression to each selected row.

                  If the implicit SELECT returns no rows, no update takes place. When used in JDBC, the number of rows returned by the implicit SELECT is returned as the update count.

                  If there are FOREIGN KEY constraints on other tables that reference the subject table, and the FOREIGN KEY constraints have referential actions, then rows from those other tables that reference the updated rows are updated, according to the specified referential actions.

                  The rows that are updated are checked against all the constraints that have been declared on the table. The whole UPDATE operation fails if any row violates any constraint.

                  set clause list

                  set clause list

                  <set clause list> ::= <set clause> [ { <comma> <set clause> }... ]

                  <set clause> ::= <multiple column assignment> | <set target> <equals operator> <update source>

                  <multiple column assignment> ::= <set target list> <equals operator> <assigned row>

                  <set target list> ::= <left paren> <set target> [ { <comma> <set target> }... ] <right paren>

                  <assigned row> ::= <contextually typed row value expression>

                  <set target> ::= <column name>

                  <update source> ::= <value expression> | <contextually typed value specification>

                  Specify a list of assignments. This is used in UPDATE, MERGE and SET statements to assign values to a scalar or row target.

                  Apart from setting a whole target to a value, a SET statement can set individual elements of an array to new values. The last example below shows this form of assignment to the array in the column named B.

                  In the examples given below, UPDATE statements with single and multiple assignments are shown. Note in the third example, a SELECT statement is used to provide the update values for columns A and C, while the update value for column B is given separately. The SELECT statement must return exactly one row . In this example the SELECT statement refers to the existing value for column C in its search condition.

                  UPDATE T SET A = 5 WHERE ...
                  UPDATE T SET (A, B) = (1, NULL) WHERE ...
                  UPDATE T SET (A, C) = (SELECT X, Y FROM U WHERE Z = C), B = 10 WHERE ...
                  UPDATE T SET A = 3, B[3] = 'warm'
                  

                  Merge Statement

                  MERGE INTO

                  merge statement

                  <merge statement> ::= MERGE INTO <target table> [ [ AS ] <merge correlation name> ] USING <table reference> ON <search condition> <merge operation specification>

                  <merge correlation name> ::= <correlation name>

                  <merge operation specification> ::= <merge when clause>...

                  <merge when clause> ::= <merge when matched clause> | <merge when not matched clause>

                  <merge when matched clause> ::= WHEN MATCHED THEN <merge update specification>

                  <merge when not matched clause> ::= WHEN NOT MATCHED THEN <merge insert specification>

                  <merge update specification> ::= UPDATE SET <set clause list>

                  <merge insert specification> ::= INSERT [ <left paren> <insert column list> <right paren> ] [ <override clause> ] VALUES <merge insert value list>

                  <merge insert value list> ::= <left paren> <merge insert value element> [ { <comma> <merge insert value element> }... ] <right paren>

                  <merge insert value element> ::= <value expression> | <contextually typed value specification>

                  Update rows, or insert new rows into the <target table>. The MERGE statement uses a second table, specified by <table reference>, to determine the rows to be updated or inserted. It is possible to use the statement only to update rows or to insert rows, but usually both update and insert are specified.

                  The <search condition> matches each row of the <table reference> with each row of the <target table>. If the two rows match then the UPDATE clause is used to update the matching row of the target table. Those rows of <table reference> that have no matching rows are then used to insert new rows into the <target table>. Therefore, a MERGE statement can update between 0 and all the rows of the <target table> and can insert between 0 and the number of the rows in <table reference> into the <target table>. If any row in the <target table> matches more than one row in <table reference> a cardinality error is raised. On the other hand, several rows in the <target table> can match a single row in <table reference> without any error. The constraints and referential actions specified on the database tables are enforced the same way as for an update and an insert statement.

                  The MERGE statement can be used with only the WHEN NOT MATCHED clause as a conditional INSERT statement that inserts a row if no existing rows match a condition.

                  In the first example below, the table originally contains two rows for different furniture. The <table reference> is the (VALUES(1, 'conference table'), (14, 'sofa'), (5, 'coffee table')) expression, which evaluates to a table with 3 rows. When the x value for a row matches an existing row, then the existing row is updated. When the x value does not match, the row is inserted. Therefore one row of table t is updated from 'dining table' to 'conference table', and two rows are inserted into table t. The second example uses a SELECT statement as the source of the values for the MERGE.

                  In the third example, a new row in inserted into the table only when the primary key for the new row does not exist. This example uses parameters and should be executed as a JDBC PreparedStatement.

                  CREATE TABLE t (id INT PRIMARY KEY, description VARCHAR(100))
                  INSERT INTO t VALUES (1, 'dining table'), (2, 'deck chair')
                  MERGE INTO t USING (VALUES(1, 'conference table'), (14, 'sofa'), (5, 'coffee table')) 
                     AS vals(x,y) ON t.id = vals.x
                     WHEN MATCHED THEN UPDATE SET t.description = vals.y
                     WHEN NOT MATCHED THEN INSERT VALUES vals.x, vals.y
                  
                  MERGE INTO t USING (SELECT * FROM tt WHERE acol = 2) AS vals(x,y) ON t.id = vals.x
                     WHEN MATCHED THEN UPDATE SET t.description = vals.y
                     WHEN NOT MATCHED THEN INSERT VALUES vals.x, vals.y
                  
                  MERGE INTO t USING (VALUES(CAST(? AS INT))) AS vals(x) ON t.id = vals.x
                     WHEN NOT MATCHED THEN INSERT VALUES vals.x, ?
                  

                  Diagnostics and State

                  HyperSQL supports some SQL statements, expressions, functions and Java methods that report on the most recently executed statement.

                  The IDENTITY() function returns the last inserted identity value for the current session.

                  The GET DIAGNOSTICS statement is supported to a limited extent. The built-in function DIAGNOSTICS() is an alternative. These are normally used in SQL/PSM routines to check the result of the last data update operation.

                  GET DIAGNOSTICS

                  get diagnostics statement

                  <get diagnostics statement> ::= GET DIAGNOSTICS <simple target value specification> = ROW_COUNT

                  The <simple target value specification> is a session variable, or a routine variable or OUT parameter.

                  The keyword ROW_COUNT specifies the row count returned by the last executed statement. For INSERT, UPDATE, DELETE and MERGE statements, this is the number of rows affected by the statement. This is the same value as returned by JDBC execute() methods. For all other statements, zero is returned.

                  The value of ROW_COUNT is stored in the specified target.

                  In future versions, more options will be supported for diagnostics values.

                  Chapter 8. SQL-Invoked Routines

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 4987 $

                  Copyright 2010-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  SQL-invoked routines are functions and procedures called from SQL. HyperSQL 2.0 supports routines conforming to two parts of the SQL Standard. Routines written in the SQL language are supported in conformance to SQL/PSM (Persistent Stored Modules) specification. Routines written in Java are supported in broad conformance to SQL/JRT specification. In addition, HyperSQL's previous non-standard support for calling Java routines without prior method definition is retained and enhanced in the latest version by extending the SQL/JRT specification.

                  HyperSQL also supports user defined aggregate functions written in the SQL language or Java. This feature is an extension to the SQL Standard.

                  SQL-invoked routines are schema objects. Naming and referencing follows conventions common to all schema objects. The same routine name can be defined in two different schemas and used with schema-qualified references.

                  A routine is either a procedure or a function.

                  A function:

                  • is defined with CREATE FUNCTION

                  • always returns a single value or a single table

                  • does not modify the data in the database

                  • is used as part of an SQL statement

                  • can have parameters

                  • can be polymorphic

                  A procedure:

                  • is defined with CREATE PROCEDURE

                  • can return zero to multiple values or result sets

                  • can modify the data in the database

                  • is called separately, using the CALL statement

                  • can have parameters

                  • can be polymorphic

                  Definition of routine signature and characteristics, name resolution and invocation are all implemented uniformly for routines written in SQL or Java.

                  Routine Definition

                  SQL-Invoked Routines, whether PSM or JRT, are defined using a SQL statement with the same syntax. The part that is different is the <routine body> which consists of SQL statements in PSM routines or a reference to a Java method in JRT routines.

                  Details of Routine definition are discussed in this section. You may start by reading the next two sections which provide several examples before reading this section for the details.

                  Routine definition has several mandatory or optional clauses. The complete BNF supported by HyperSQL and the remaining clauses are documented in this section.

                  CREATE FUNCTION

                  CREATE PROCEDURE

                  routine definition

                  Routine definition is similar for procedures and functions. A function definition has the mandatory <returns clause> which is discussed later. The description given so far covers the essential elements of the specification with the BNF given below.

                  <schema procedure> ::= CREATE PROCEDURE <schema qualified routine name> <SQL parameter declaration list> <routine characteristics> <routine body>

                  <schema function> ::= CREATE FUNCTION <schema qualified routine name> <SQL parameter declaration list> <returns clause> <routine characteristics> <routine body>

                  Parameter declaration list has been described above. For SQL/JRT routines, the <SQL parameter name> is optional while for SQL/PSM routines, it is required. If the <parameter mode> of a parameter is OUT or INOUT, it must be specified. The BNF is given below:

                  <SQL parameter declaration list> ::= <left paren> [ <SQL parameter declaration> [ { <comma> <SQL parameter declaration> }... ] ] <right paren>

                  <SQL parameter declaration> ::= [ <parameter mode> ] [ <SQL parameter name> ] <parameter type>

                  <parameter mode> ::= IN | OUT | INOUT

                  <parameter type> ::= <data type>

                  Return Value and Table Functions

                  RETURNS

                  returns clause

                  The <returns clause> specifies the type of the return value of a function (not a procedure). For all SQL/PSM functions and ordinary SQL/JRT functions, this is simply a type definition which can be a built-in type, a DOMAIN type or a DISTINCT type, or alternatively, a TABLE definition. For example, RETURNS INTEGER.

                  For a SQL/JRT function, it is possible to define a <returns table type> for a Java method that returns a java.sql.ResultSet object. Such SQL/JRT functions are called table functions. Table functions are used differently from normal functions. A table function can be used in an SQL query expression exactly where a normal table or view is allowed. At the time of invocation, the Java method is called and the returned ResultSet is transformed into an SQL table. The column types of the declared TABLE must match those of the ResultSet, otherwise an exception is raised at the time of invocation.

                  If a <returns table type> is defined for an SQL/PSM function, the following expression is used inside the function to return a table: RETURN TABLE ( <query expression> ); In the example blow, a table with two columns is returned.

                  RETURN TABLE ( SELECT a, b FROM atable WHERE e = 10 );

                  Functions that return a table are designed to be used in SELECT statements using the TABLE keyword to form a joined table.

                  When a JDBC CallableStatement is used to CALL the function, the table returned from the function call is returned and can be accessed with the getResultSet() method of the CallableStatement.

                  <returns clause> ::= RETURNS <returns type>

                  <returns type> ::= <returns data type> | <returns table type>

                  <returns table type> ::= TABLE <table function column list>

                  <table function column list> ::= <left paren> <table function column list element> [ { <comma> <table function column list element> } ... ] <right paren>

                  <table function column list element> ::= <column name> <data type>

                  <returns data type> ::= <data type>

                  routine body

                  routine body

                  Routine body is either one or more SQL statements or a Java reference. The user that defines the routine by issuing the CREATE FUNCTION or CREATE SCHEMA command must have the relevant access rights to all tables, sequences, routines, etc. that are accessed by the routine. If another user is given EXECUTE privilege on the routine, then there are two possibilities, depending on the <rights clause>. This clause refers to the access rights that are checked when a routine is invoked. The default is SQL SECURITY DEFINER, which means access rights of the definer are used; therefore no extra checks are performed when the other user invokes the routine. The alternative SQL SECURITY INVOKER means access rights on all the database objects referenced by the routine are checked for the invoker. This alternative is not supported by HyperSQL.

                  <routine body> ::= <SQL routine spec> | <external body reference>

                  <SQL routine spec> ::= [ <rights clause> ] <SQL routine body>

                  <rights clause> ::= SQL SECURITY INVOKER | SQL SECURITY DEFINER

                  SQL routine body

                  SQL routine body

                  The routine body of a an SQL routine consists of an statement.

                  <SQL routine body> ::= <SQL procedure statement>

                  EXTERNAL NAME

                  external body reference

                  External name specifies the qualified name of the Java method associated with this routine. Early releases of HyperSQL 2.0 only supports Java methods within the classpath. The <external Java reference string> is a quoted string which starts with CLASSPATH: and is followed by the Java package, class and method names separated with dots. HyperSQL does not currently support the optional <Java parameter declaration list>.

                  <external body reference> ::= EXTERNAL NAME <external Java reference string>

                  <external Java reference string> ::= <jar and class name> <period> <Java method name> [ <Java parameter declaration list> ]

                  Routine Characteristics

                  The <routine characteristics> clause covers several sub-clauses

                  <routine characteristics> ::= [ <routine characteristic>... ]

                  <routine characteristic> ::= <language clause> | <parameter style clause> | SPECIFIC <specific name> | <deterministic characteristic> | <SQL-data access indication> | <null-call clause> | <returned result sets characteristic> | <savepoint level indication>

                  LANGUAGE

                  language clause

                  The <language clause> refers to the language in which the routine body is written. It is either SQL or Java. The default is SQL, so JAVA must be specified for SQL/JRT routines.

                  <language clause> ::= LANGUAGE <language name>

                  <language name> ::= SQL | JAVA

                  The parameter style is not allowed for SQL routines. It is optional for Java routines and, in HyperSQL, the only value allowed is JAVA.

                  <parameter style> ::= JAVA

                  SPECIFIC NAME

                  specific name

                  The SPECIFIC <specific name> clause is optional but the engine will creates an automatic name if it is not present. When there are several versions of the same routine, the <specific name> is used in schema manipulation statements to drop or alter a specific version. The <specific name> is a user-defined name. It applies to both functions and procedures. In the examples below, a specific name is specified for each function.

                  CREATE FUNCTION an_hour_before_or_now(t TIMESTAMP)
                    RETURNS TIMESTAMP
                    NO SQL
                    LANGUAGE JAVA PARAMETER STYLE JAVA
                    SPECIFIC an_hour_before_or_now_with_timestamp
                    EXTERNAL NAME 'CLASSPATH:org.npo.lib.nowLessAnHour'
                  
                  CREATE FUNCTION an_hour_before_max (e_type INT)
                    RETURNS TIMESTAMP SPECIFIC an_hour_before_max_with_int
                    RETURN (SELECT MAX(event_time) FROM atable WHERE event_type = e_type) - 1 HOUR
                  
                  

                  DETERMINISTIC

                  deterministic characteristic

                  The <deterministic characteristic> clause indicates that a routine is deterministic or not. Deterministic means the routine does not reference random values, external variables, or time of invocation. The default is NOT DETERMINISTIC. It is essential to declare this characteristics correctly for an SQL/JRT routine, as the engine does not know the contents of the Java code, which could include calls to methods returning random or time sensitive values.

                  <deterministic characteristic> ::= DETERMINISTIC | NOT DETERMINISTIC

                  SQL DATA access

                  SQL DATA access characteristic

                  The <SQL-data access indication>  clause indicates the extent to which a routine interacts with the database or the data stored in the database tables in different schemas (SQL DATA).

                  NO SQL means no SQL command is issued in the routine body and can be used only for SQL/JRT functions.

                  CONTAINS SQL means some SQL commands are used, but they do not read or modify the SQL data. READS SQL DATA and MODIFIES SQL DATA are self explanatory.

                  A CREATE PROCEDURE definition can use MODIFIES SQL DATA. This is not allowed in CREATE FUNCTION. Note that a PROCEDURE or a FUNCTION may have internal tables or return a table which are populated by the routine's statements. These tables are not considered SQL DATA, therefore there is no need to specify MODIFIES SQL DATA for such routines.

                  <SQL-data access indication> ::= NO SQL | CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA

                  NULL INPUT

                  null call clause

                  Null Arguments

                  The <null-call clause> is used only for functions. If a function returns NULL when any of the calling arguments is null, then by specifying RETURNS NULL ON NULL INPUT, calls to the function are known to be redundant and do not take place when an argument is null. This simplifies the coding of the SQL/JRT Java methods and improves performance at the same time.

                  <null-call clause> ::= RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT

                  SAVEPOINT LEVEL

                  transaction impact

                  The <savepoint level indication> is used only for procedures and refers to the visibility of existing savepoints within the body of the procedure. If NEW SAVEPOINT LEVEL is specified, savepoints that have been declared prior to calling the procedure become invisible within the body of the procedure. HyperSQL’s implementation accepts only NEW SAVEPOINT LEVEL, which must be specified.

                  <savepoint level indication> ::= NEW SAVEPOINT LEVEL | OLD SAVEPOINT LEVEL

                  DYNAMIC RESULT SETS

                  returned result sets characteristic

                  The <returned result sets characteristic> is used with SQL/PSM and SQL/JRT procedures (not with functions). The maximum number of result sets that a procedure may return can be specified with the clause below. The default is zero. If you want your procedure to return result sets, you must specify the maximum number of result sets that your procedure may return. Details are discussed in the next sections.

                  <returned result sets characteristic> ::= DYNAMIC RESULT SETS <maximum returned result sets>

                  SQL Language Routines (PSM)

                  The PSM (Persistent Stored Module) specification extends the SQL language with structures and control statements such as conditional and loop statements. Both SQL Function and SQL procedure bodies use the same syntax, with minor exceptions.

                  The routine body is a SQL statement. In its simplest form, the body is a single SQL statement. A simple example of a function is given below:

                  CREATE FUNCTION an_hour_before (t TIMESTAMP)
                    RETURNS TIMESTAMP
                    RETURN t - 1 HOUR
                  
                  

                  An example of the use of the function in an SQL statement is given below:

                  SELECT an_hour_before(event_timestamp) AS notification_timestamp, event_name FROM events;

                  A simple example of a procedure is given below:

                  CREATE PROCEDURE new_customer(firstname VARCHAR(50), lastname VARCHAR(50))
                    MODIFIES SQL DATA
                    INSERT INTO CUSTOMERS VALUES (DEFAULT, firstname, lastname, CURRENT_TIMESTAMP)
                  
                  

                  The procedure inserts a row into an existing table with the definition given below:

                  CREATE TABLE customers(id INTEGER GENERATED BY DEFAULT AS IDENTITY, firstname VARCHAR(50), lastname VARCHAR(50), added TIMESTAMP);

                  An example of the use of the procedure is given below:

                  CALL new_customer('JOHN', 'SMITH');

                  The routine body is often a compound statement. A compound statement can contain one or more SQL statements, which can include control statements, as well as nested compound statements.

                  Please note carefully the use of <semicolon>, which is required at the end of some statements but not accepted at the end of others.

                  Advantages and Disadvantages

                  SQL Language Routines (PSM) have certain advantages over Java Language Routines (SQL/JRT) and a couple of disadvantages.

                  • SQL language routines (PSM) do not rely on custom Java classes to be present on the classpath. The databases that use them are therefore more portable.

                  • For a routine that accesses SQL DATA, all the SQL statements in an SQL routine are known and monitored by the engine. The engine will not allow a table, routine or sequence that is referenced in an SQL routine to be dropped, or its structure modified in a way that will break the routine execution. The engine does not keep this information about a Java routine.

                  • Because the statements in an SQL routine are known to the engine, the execution of an SQL routine locks all the database objects it needs to access before the actual execution. With Java routines, locks are obtained during execution and this may cause additional delays in multi threaded access to the database.

                  • For routines that do not access SQL DATA, Java routines (SQL/JRT) may be faster if they perform extensive calculations.

                  • Only Java routines can access external programs and resources directly.

                  Routine Statements

                  The following SQL Statements can be used only in routines. These statements are covered in this section.

                  <handler declaration>

                  <table variable declaration>

                  <variable declaration>

                  <declare cursor>

                  <assignment statement>

                  <compound statement>

                  <case statement>

                  <if statement>

                  <while statement>

                  <repeat statement>

                  <for statement>

                  <loop statement>

                  <iterate statement

                  <leave statement>

                  <signal statement>

                  <resignal statement>

                  <return statement>

                  <select statement: single row>

                  <open statement>

                  The following SQL Statements can be used in procedures but not in generally in functions (they can be used in functions only to change the data in a local table variable) . These statements are covered in other chapters of this Guide.

                  <call statement>

                  <delete statement>

                  <insert statement>

                  <update statement>

                  <merge statement>

                  As shown in the examples below, the formal parameters and the variables of the routine can be used in statements, similar to the way a column reference is used.

                  Compound Statement

                  A compound statement is enclosed in a BEGIN / END block with optional labels. It can contain one or more <SQL variable declaration>, <declare cursor> or <handler declaration> before at least one SQL statement. The BNF is given below:

                  <compound statement> ::= [ <beginning label> <colon> ] BEGIN [[NOT] ATOMIC]

                  [{<SQL variable declaration> <semicolon>} ...]

                  [{<declare cursor> <semicolon>} ...]

                  [{<handler declaration> <semicolon>}...]

                  {<SQL procedure statement> <semicolon>} ...

                  END [ <ending label> ]

                  An example of a simple compound statement body is given below. It performs the common task of inserting related data into two table. The IDENTITY value that is automatically inserted in the first table is retrieved using the IDENTITY() function and inserted into the second table.

                  CREATE PROCEDURE new_customer(firstname VARCHAR(50), lastname  VARCHAR(50), address VARCHAR(100))
                    MODIFIES SQL DATA
                      BEGIN ATOMIC
                      INSERT INTO customers VALUES (DEFAULT, firstname, lastname, CURRENT_TIMESTAMP);
                      INSERT INTO addresses VALUES (DEFAULT, IDENTITY(), address);
                    END
                  
                  

                  Table Variables

                  A <table variable declaration> defines the name and columns of a local table, that can be used in the routine body. The table cannot have constraints. Table variable declarations are made before scalar variable declarations.

                    BEGIN ATOMIC
                      DECLARE TABLE temp_table (col_a INT, col_b VARCHAR(20);
                      DECLARE temp_id INTEGER;
                      -- more statements
                    END
                  
                  

                  Variables

                  A <variable declaration> defines the name and data type of the variable and, optionally, its default value. In the next example, a variable is used to hold the IDENTITY value. In addition, the formal parameters of the procedure are identified as input parameters with the use of the optional IN keyword. This procedure does exactly the same job as the procedure in the previous example.

                  CREATE PROCEDURE new_customer(IN firstname VARCHAR(50), IN lastname VARCHAR(50), IN address VARCHAR(100))
                    MODIFIES SQL DATA
                    BEGIN ATOMIC
                      DECLARE temp_id INTEGER;
                      INSERT INTO CUSTOMERS VALUES (DEFAULT, firstname, lastname, CURRENT_TIMESTAMP);
                      SET temp_id = IDENTITY();
                      INSERT INTO ADDRESSES VALUES (DEFAULT, temp_id, address);
                    END
                  
                  

                  The BNF for variable declaration is given below:

                  DECLARE variable

                  SQL variable declaration

                  <SQL variable declaration> ::= DECLARE <variable name list> <data type> [DEFAULT <default value>]

                  <variable name list> ::= <variable name> [ { <comma> <variable name> }... ]

                  Examples of variable declaration are given below. Note that in a DECLARE statement with multiple comma-separated variable names, the type and the default value applies to all the variables in the list:

                    BEGIN ATOMIC
                      DECLARE temp_zero DATE;
                      DECLARE temp_one, temp_two INTEGER DEFAULT 2;
                      DECLARE temp_three VARCHAR(20) DEFAULT 'no name';
                      -- more statements ...
                      SET temp_zero = DATE '2010-03-18';
                      SET temp_two = 5;
                      -- more statements ...
                    END

                  Cursors

                  A <declare cursor> statement is used to declare a SELECT statement. The current usage of this statement in early versions of HyperSQL 2.0 is exclusively to return a result set from a procedure. The result set is returned to the JDBC CallableStatement object that calls the procedure. The getResultSet() method of CallableStatement is then used to retrieve the JDBC ResultSet.

                  In the <routine definition>, the DYNAMIC RESULT SETS clause must be used to specify a value above zero. The DECLARE CURSOR statement is used after any variable declaration in compound statement block. The SELECT statement should be followed with FOR READ ONLY to avoid possible error messages. The <open statement> is then executed for the cursor at the point where the result set should be populated.

                  After the procedure is executed with a JDBC CallableStatement execute() method, all the result sets that were opened are returned to the JDBC CallableStatement.

                  Calling getResultSet() will return the first ResultSet. When there are multiple result sets, the getMoreResults() method of the Callable statement is called to move to the next ResultSet, before getResultSet() is called to return the next ResultSet. See the Data Access and Change chapter on the syntax for declaring the cursor.

                    BEGIN ATOMIC
                      DECLARE temp_zero DATE;
                      DECLARE result CURSOR WITH RETURN FOR SELECT * FROM INFORMATION_SCHEMA.TABLES FOR READ ONLY;
                      -- more statements ...
                      OPEN result;
                    END
                  

                  Handlers

                  A <handler declaration> defines the course of action when an exception or warning is raised during the execution of the compound statement. A compound statement may have one or more handler declarations. These handlers become active when code execution enters the compound statement block and remain active in any sub-block and statement within the block. The handlers become inactive when code execution leaves the block.

                  In the previous example, if an exception is thrown during the execution of either SQL statement, the execution of the compound statement is terminated and the exception is propagated and thrown by the CALL statement for the procedure. A handler declaration can resolve the thrown exception within the compound statement without propagating it, and allow the execution of the <compound statement> to continue.

                  In the example below, the UNDO handler declaration catches any exception that is thrown during the execution of the compound statement inside the BEGIN / END block. As it is an UNDO handler, all the changes to data performed within the compound statement (BEGIN / END) block are rolled back. The procedure then returns without throwing an exception.

                  CREATE PROCEDURE NEW_CUSTOMER(IN firstname VARCHAR(50), IN lastname VARCHAR(50), IN address VARCHAR(100))
                      MODIFIES SQL DATA
                    label_one: BEGIN ATOMIC
                      DECLARE temp_id INTEGER;
                      DECLARE UNDO HANDLER FOR SQLEXCEPTION LEAVE label_one;
                      INSERT INTO CUSTOMERS VALUES (DEFAULT, firstname, lastname, CURRENT_TIMESTAMP);
                      SET temp_id = IDENTITY();
                      INSERT INTO ADDRESSES VALUES (DEFAULT, temp_id, address);
                    END
                  
                  

                  Other types of hander are CONTINUE and EXIT handlers. A CONTINUE handler ignores any exception and proceeds to the next statement in the block. An EXIT handler terminates execution without undoing the data changes performed by the previous (successful) statements.

                  The conditions can be general conditions, or specific conditions. Among general conditions that can be specified, SQLEXCEPTION covers all exceptions, SQLWARNING covers all warnings, while NOT FOUND covers the not-found condition, which is raised when a DELETE, UPDATE, INSERT or MERGE statement completes without actually affecting any row. Alternatively, one or more specific conditions can be specified (separated with commas) which apply to specific exceptions or warnings or classes or exceptions or warnings. A specific condition is specified with SQLSTATE <value>, for example SQLSTATE 'W_01003' specifies the warning raised after a SQL statement is executed which contains an aggregate function which encounters a null value during execution. An example is given below which activates the handler when either of the two warnings is raised:

                  DECLARE UNDO HANDLER FOR SQLSTATE 'W_01003', 'W_01004' LEAVE label_one;

                  The BNF for <handler declaration> is given below:

                  DECLARE HANDLER

                  declare handler statement

                  <handler declaration> ::= DECLARE {UNDO | CONTINUE | EXIT} HANDLER FOR {SQLEXCEPTION | SQLWARNING | NOT FOUND} | { SQLSTATE <state value> [, ...]} [<SQL procedure statement>];

                  A handler declaration may specify an SQL procedure statement to be performed when the handler is activated. When an exception occurs, the example below performs the UNDO as in the previous example, then inserts the (invalid) data into a separate table.

                  DECLARE UNDO HANDLER FOR SQLEXCEPTION
                      INSERT INTO invalid_customers VALUES(firstanme, lastname, address);

                  The <SQL procedure statement> is required by the SQL Standard but is optional in HyperSQL. If the execution of the <SQL procedure statement> specified in the handler declaration throws an exception itself, then it is handled by the handlers that are currently active. The <SQL procedure statement> can itself be a compound statement with its own handlers.

                  Assignment Statement

                  The SET statement is used for assignment. It can be used flexibly with rows or single values. The BNF is given below:

                  <assignment statement> ::= <singleton variable assignment> | <multiple variable assignment>

                  <singleton variable assignment> ::= SET <assignment target> <equals operator> <assignment source>

                  <multiple variable assignment> ::= SET (<variable or parameter>, ...) = <row value expression>

                  In the example below, the result of the SELECT is assigned to two OUT or INOUT arguments. The SELECT must return one row. If it returns more than one, an exception is raised. If it returns no row, no change is made to ARG1 and ARG2.

                  SET (arg1, arg2) = (SELECT col1, col2 FROM atable WHERE id = 10);

                  In the example below, the result of a function call is assigned to VAR1.

                  SET var1 = SQRT(var2);

                  Select Statement : Single Row

                  A special form of SELECT can also be used for assigning values from a query to one or more arguments or variables. This works similar to a SET statement that has a SELECT statement as the source.

                  SELECT : SINGLE ROW

                  select statement: single row

                  <select statement: single row> ::= SELECT [ <set quantifier> ] <select list> INTO <select target list> <table expression>

                  <select target list> ::= <target specification> [ { <comma> <target specification> }... ]

                  Retrieve values from a specified row of a table and assign the fields to the specified targets. The example below has an identical effect to the example of SET statement given above.

                  SELECT col1, col2 INTO arg1, arg2 FROM atable WHERE id = 10;

                  Formal Parameters

                  Each parameter of a procedure can be defined as IN, OUT or INOUT. An IN parameter is an input to the procedure and is passed by value. The value cannot be modified inside the procedure body. An OUT parameter is a reference for output. An INOUT parameter is a reference for both input and output. An OUT or INOUT parameter argument is passed by reference, therefore only a dynamic parameter argument or a variable within an enclosing procedure can be passed for it. The assignment statement is used to assign a value to an OUT or INOUT parameter.

                  In the example below, the procedure is declared with an OUT parameter. It assigns the auto-generated IDENTITY value from the INSERT statement to the OUT argument.

                  CREATE PROCEDURE new_customer(OUT newid INT, IN firstname VARCHAR(50), IN lastname VARCHAR(50), IN address VARCHAR(100))
                    MODIFIES SQL DATA
                    BEGIN ATOMIC
                      DECLARE temp_id INTEGER;
                      INSERT INTO CUSTOMERS VALUES (DEFAULT, firstname, lastname, CURRENT_TIMESTAMP);
                      SET temp_id = IDENTITY();
                      INSERT INTO ADDRESSES VALUES (DEFAULT, temp_id, address);
                      SET newid = temp_id;
                    END
                  
                  

                  In the SQL session, or in the body of another stored procedure, a variable must be assigned to the OUT parameter. After the procedure call, this variable will hold the new identity value that was generated inside the procedure. If the procedure is called directly, using the JDBC CallableStatement interface, then the value of the first, OUT argument can be retrieved with a call to getInt(1)after calling the execute() method.

                  In the example below, a session variable, the_new_id is declared. After the call to new_customer, the value for the identity is stored in the_new_id variable. This is returned via the next CALL statement. Alternatively, the_new_id can be used as an argument to another CALL statement.

                  DECLARE the_new_id INT DEFAULT NULL;
                  CALL new_customer(the_new_id, 'John', 'Smith', '10 Parliament Square'); 
                  CALL the_new_id;
                  
                  

                  Iterated Statements

                  Various iterated statements can be used in routines. In these statements, the <SQL statement list> consists of one or more SQL statements. The <search condition> can be any valid SQL expression of BOOLEAN type.

                  LOOP

                  loop statement

                  <loop statement> ::= [ <beginning label> <colon> ] LOOP <SQL statement list> END LOOP [ <ending label> ]

                  WHILE

                  while statement

                  <while statement> ::= [ <beginning label> <colon> ] WHILE <search condition> DO <SQL statement list> END WHILE [ <ending label> ]

                  REPEAT

                  repeat statement

                  <repeat statement> ::= [ <beginning label> <colon> ]

                  REPEAT <SQL statement list> UNTIL <search condition> END REPEAT [ <ending label>

                  In the example below, a multiple rows are inserted into a table in a WHILE loop:

                  loop_label: WHILE my_var > 0 DO
                    INSERT INTO CUSTOMERS VALUES (DEFAULT, my_var);
                    SET my_var = my_var - 1;
                    IF my_var = 10 THEN SET my_var = 8; END IF;
                    IF my_var = 22 THEN LEAVE loop_label; END IF;
                  END WHILE loop_label;
                  
                  

                  Iterated FOR Statement

                  The <for statement> is similar to other iterated statement, but it is always used with a cursor declaration to iterate over the rows of the result set of the cursor and perform operations using the values of each row.

                  FOR

                  for statement

                  <for statement> ::= [ <beginning label> <colon> ] FOR <query expression> DO <SQL statement list> END FOR [ <ending label> ]

                  The <query expression> is a SELECT statement. When the FOR statement is executed, the query expression is executed first and the result set is formed. Then for each row of the result set, the <SQL statement list> is executed. What is special about the FOR statement is that all the columns of the current row can be accessed by name in the statements in the <SQL statement list>. The columns are read only and cannot be updated. For example, if the column names for the select statement are ID, FIRSTNAME, LASTNAME, then these can be accessed as a variable name. The column names must be unique and not equivalent to any parameter or variable name in scope.

                  The FOR statement is useful for computing values over multiple rows of the result set, or for calling a procedure for some row of the result set. In the example below, the procedure uses a FOR statement to iterate over the rows for a customer with lastname equal to name_p. No action is performed for the first row, but for all the subsequent rows, the row is deleted from the table.

                  Note the following: The result set for the SELECT statement is built only once, before processing the statements inside the FOR block begins. For all the rows of the SELECT statement apart from the first row, the row is deleted from the customer table. The WHERE condition uses the automatic variable id, which holds the customer.id value for the current row of the result set, to delete the row. The procedure updates the val_p argument and when it returns, the val_p represents the total count of rows with the given lastname before the duplicates were deleted.

                  CREATE PROCEDURE test_proc(INOUT val_p INT, IN lastname_p VARCHAR(20)) 
                  MODIFIES SQL DATA
                  BEGIN ATOMIC
                    SET val_p = 0;
                    for_label: FOR SELECT * FROM customer WHERE lastname = lastname_p DO
                      IF  val_p > 0 THEN
                        DELETE FROM customer WHERE customer.id = id;
                      END IF;
                      SET val_p = val_p + 1;
                    END FOR for_label;
                  END
                  

                  Conditional Statements

                  There are two types of CASE ... WHEN statement and the IF ... THEN statement.

                  CASE WHEN

                  case when statement

                  The simple case statement uses a <case operand> as the predicand of one or more predicates. For the right part of each predicate, it specifies one or more SQL statements to execute if the predicate evaluates TRUE. If the ELSE clause is not specified, at least one of the search conditions must be true, otherwise an exception is raised.

                  <simple case statement> ::= CASE <case operand> <simple case statement when clause>... [ <case statement else clause> ] END CASE

                  <simple case statement when clause> ::= WHEN <when operand list> THEN <SQL statement list>

                  <case statement else clause> ::= ELSE <SQL statement list>

                  A skeletal example is given below. The variable var_one is first tested for equality with 22 or 23 and if the test evaluates to TRUE, then the INSERT statement is performed and the statement ends. If the test does not evaluate to TRUE, the next condition test, which is an IN predicate, is performed with var_one and so on. The statement after the ELSE clause is performed if none the previous tests returns TRUE.

                  CASE var_one
                    WHEN 22, 23 THEN INSERT INTO t_one ...;
                    WHEN IN (2, 4, 5) THEN DELETE FROM t_one WHERE ...;
                    ELSE UPDATE t_one ...;
                    END CASE
                  
                  

                  The searched case statement uses one or more search conditions, and for each search condition, it specifies one or more SQL statements to execute if the search condition evaluates TRUE. An exception is raised if there is no ELSE clause and none of the search conditions evaluates TRUE.

                  <searched case statement> ::= CASE <searched case statement when clause>... [ <case statement else clause> ] END CASE

                  <searched case statement when clause> ::= WHEN <search condition> THEN <SQL statement list>

                  The example below is partly a rewrite of the previous example, but a new condition is added:

                  CASE WHEN var_one = 22 OR var_one = 23 THEN INSERT INTO t_one ...;
                    WHEN var_one IN (2, 4, 5) THEN DELETE FROM t_one WHERE ...;
                    WHEN var_two IS NULL THEN UPDATE t_one ...;
                    ELSE UPDATE t_one ...;
                    END CASE
                  
                  

                  IF

                  if statement

                  The if statement is very similar to the searched case statement. The difference is that no exception is raised if there is no ELSE clause and no search condition evaluates TRUE.

                  <if statement> ::= IF <search condition> <if statement then clause> [ <if statement elseif clause>... ] [ <if statement else clause> ] END IF

                  <if statement then clause> ::= THEN <SQL statement list>

                  <if statement elseif clause> ::= ELSEIF <search condition> THEN <SQL statement list>

                  <if statement else clause> ::= ELSE <SQL statement list>

                  Return Statement

                  The RETURN statement is required and used only in functions. The body of a function is either a RETURN statement, or a compound statement that contains a RETURN statement.

                  The return value of a FUNCTION can be assigned to a variable, or used inside an SQL statement.

                  An SQL/PSM function or an SQL/JRT function can return a single result when the function is defined as RETURNS TABLE ( .. )

                  To return a table from a SELECT statement, you should use a return statement such as RETURN TABLE( SELECT ...) in an SQL/PSM function. For an SQL/JRT function, the Java method should return a JDBCResultSet instance.

                  To call a function from JDBC, use a java.sql.CallableStatement instance. The getResultSet() call can be used to access the ResultSet returned from a function that returns a result set. If the function returns a scalar value, the returned result has a single column and a single row which contains the scalar returned value.

                  RETURN

                  return statement

                  <return statement> ::= RETURN <return value>

                  <return value> ::= <value expression> | NULL

                  Return a value from an SQL function. If the function is defined as RETURNS TABLE, then the value is a TABLE expression such as RETURN TABLE(SELECT ...) otherwise, the value expression can be any scalar expression. In the examples below, the same function is written with or without a BEGIN END block. In both versions, the RETURN value is a scalar expression.

                  CREATE FUNCTION an_hour_before_max (e_type INT)
                    RETURNS TIMESTAMP
                    RETURN (SELECT MAX(event_time) FROM atable WHERE event_type = e_type) - 1 HOUR
                  
                  CREATE FUNCTION an_hour_before_max (e_type INT)
                    RETURNS TIMESTAMP
                    BEGIN ATOMIC
                      DECLARE max_event TIMESTAMP;
                      SET max_event = SELECT MAX(event_time) FROM atable WHERE event_type = e_type;
                      RETURN max_event - 1 HOUR;
                    END
                  
                  

                  Control Statements

                  In addition to the RETURN statement, the following statements can be used in specific contexts.

                  ITERATE STATEMENT

                  The ITERATE statement can be used to cause the next iteration of a labelled iterated statement (a WHILE, REPEAT or LOOP statement). It is similar to the "continue" statement in C and Java.

                  <iterate statement> ::= ITERATE <statement label>

                  LEAVE STATEMENT

                  The LEAVE statement can be used to leave a labelled block. When used in an iterated statement, it is similar to the "break" statement is C and Java. But it can be used in compound statements as well.

                  <leave statement> ::= LEAVE <statement label>

                  Raising Exceptions

                  Signal and Resignal Statements allow the routine to throw an exception. If used with the IF or CASE conditions, the exception is thrown conditionally.

                  SIGNAL

                  signal statement

                  The SIGNAL statement is used to throw an exception (or force an exception). When invoked, any exception handler for the given exception is in turn invoked. If there is no handler, the exception is propagated to the enclosing context. In its simplest form, when there is no exception handler for the given exception, routine execution is halted, any change of data is rolled back and the routine throws the exception. By default, the message for the exception is taken from the predefined exception message for the specified SQLSTATE. A custom message can be specified with the optional SET clause.

                  <signal statement> ::= SIGNAL SQLSTATE <state value> [ SET MESSAGE_TEXT = <character string literal> ]

                  RESIGNAL

                  resignal statement

                  The RESIGNAL statement is used to throw an exception from an exception handler's <SQL procedure statement>, in effect propagating the exception to the enclosing context without further action by the currently active handlers. By default, the message for the exception is taken from the predefined exception message for the specified SQLSTATE. A custom message can be specified with the optional SET clause.

                  <resignal statement> ::= RESIGNAL SQLSTATE <state value> [ SET MESSAGE_TEXT = <character string literal> ]

                  Routine Polymorphism

                  More than one version of a routine can be created.

                  For procedures, the different versions must have different parameter counts. When the procedure is called, the parameter count determines which version is called.

                  For functions, the different versions can have the same or different parameter counts. When the parameter count of two versions of a function is the same, the type of parameters must be different. When the function is called, the best matching version of the function is used, according to both the parameter count and parameter types. The return type of different versions of a function can be the same or different.

                  Two versions of an overloaded function are given below. One version accepts TIMESTAMP while the other accepts TIME arguments.

                  CREATE FUNCTION an_hour_before_or_now(t TIMESTAMP)
                    RETURNS TIMESTAMP
                    IF t > CURRENT_TIMESTAMP THEN
                      RETURN CURRENT_TIMESTAMP;
                    ELSE
                      RETURN t - 1 HOUR;
                    END IF
                  
                  CREATE FUNCTION an_hour_before_or_now(t TIME)
                    RETURNS TIME
                    CASE t
                      WHEN > CURRENT_TIME THEN
                        RETURN CURRENT_TIME;
                      WHEN >= TIME'01:00:00' THEN
                        RETURN t - 1 HOUR;
                      ELSE
                        RETURN CURRENT_TIME;
                    END CASE
                  
                  

                  It is perfectly possible to have different versions of the routine as SQL/JRT or SQL/PSM routines.

                  Returning Data From Procedures

                  The OUT or INOUT parameters of a PROCEDURE are used to assign simple values to dynamic parameters or to variables in the calling context.

                  According to the Standard, an SQL/PSM or SQL/JRT procedure may also return result sets to the calling context. These result sets are dynamic in the sense that a procedure may return a different number of result sets or none at all in different invocations. The SQL Standard uses a mechanism called CURSORS for accessing and modifying rows of a result set one by one. This mechanism is necessary when the database is accessed from an external application program. The JDBC ResultSet interface allows this method of access from Java programs and is supported by HyperSQL.

                  HyperSQL support this method of returning single or multiple result sets from SQL/PSM procedures only via the JDBC CallableStatement interface. Cursors are declared and opened within the body of the procedure. No further operation is performed on the cursors within the procedure. When the execution of the procedure is complete, the cursors become available as Java ResultSet objects via the CallableStatement instance that called the SQL/PSM procedure.

                  The JDBC CallableStatement class is used with the SQL statement CALL <routine name> ( <argument 1>, ... ) to call procedures (also to call functions). After the call to execute(), the getXXX() methods can be used to retrieve INOUT or OUT arguments after the call. The getMoreResults() method and the getResultSet() method can be used to access the ResultSet(s) returned by a procedure that returns one or more results. If the procedure returns more than one result set, the getMoreResults() call moves to the next result.

                  In the example below, the procedure inserts a row into the customer table. It then performs the SELECT statement to return the latest inserted row as a result set. Therefore the definition includes the DYNAMIC RESULT SETS 1 clause. You must specify correctly the maximum number of result sets that the procedure may return.

                  CREATE PROCEDURE new_customer(firstname VARCHAR(50), lastname VARCHAR(50))
                    MODIFIES SQL DATA DYNAMIC RESULT SETS 1
                    BEGIN ATOMIC
                      DECLARE result CURSOR FOR SELECT * FROM CUSTOMERS WHERE ID = IDENTITY();
                      INSERT INTO CUSTOMERS VALUES (DEFAULT, firstname, lastname, CURRENT_TIMESTAMP);
                      OPEN result;    
                    END
                  
                  

                  The above procedure is called in Java using a CallableStatement

                  Connection conn = ...;
                  CallableStatement call = conn.prepareCall("call new_customer(?, ?)");
                  call.setString(1, "Paul");
                  call.setString(2, "Smith");
                  call.execute();
                  if (call.getMoreResults())
                      ResultSet result = call.getResultSet();
                  
                  

                  In the example below a procedure has one IN argument and two OUT arguments. The JDBC CallableStatement is used to retrieve the values returned in the OUT arguments.

                  CREATE PROCEDURE get_customer(IN id INT, OUT firstname VARCHAR(50), OUT lastname VARCHAR(50)) 
                    READS SQL DATA
                    BEGIN ATOMIC
                      -- this statement uses the id to get firstname and lastname
                      SELECT first_name, last_name INTO firstname, lastname FROM customers WHERE cust_id = id;
                    END
                  
                  Connection conn = ...;
                  CallableStatement call = conn.prepareCall("call get_customer(?, ?, ?)");
                  call.setInt(1, 121); // only the IN (or INOUT) arguments should be set before the call
                  call.execute();
                  String firstname = call.getString(2); // the OUT (or INOUT) arguments are retrieved after the call
                  String lastname = call.getString(3);
                  
                  

                  SQL/JRT procedures are discussed in the Java Language Procedures section below. Those routines are called exactly the same way as SQL/PSM procedures, using the JDBC CallableStatement interface.

                  It is also possible to use a JDBC Statement or PreparedStatement object to call a procedure if the procedure arguments are constant. If the procedure returns one or more result sets, the Statement#getMoreResults() method should be called before retrieving the ResultSet.

                  Java functions are called from JDBC similar to procedures. With functions, the getMoreResuls() method should not be called at all.

                  Recursive Routines

                  Routines can be recursive. Recursive functions are often functions that return arrays or tables. To create a recursive routine, the routine definition must be created first with a dummy body. Then the ALTER ROUTINE statement is used to define the routine body.

                  In the example below, the table contains a tree of rows each with a parent. The routine returns an array containing the id list of all the direct and indirect children of the given parent. The routine appends the array variable id_list with the id of each direct child and for each child appends the array with the id array of its children by calling the routine recursively.

                  The routine can be used in a SELECT statement as the example shows.

                  CREATE TABLE ptree (pid INT, id INT);
                  INSERT INTO ptree VALUES (NULL, 1) ,(1,2), (1,3),(2,4),(4,5),(3,6),(3,7);
                  
                  -- the function is created and always throws an exception when used
                  CREATE FUNCTION child_arr(p_pid INT) RETURNS INT ARRAY
                    SPECIFIC child_arr_one
                    READS SQL DATA
                    SIGNAL SQLSTATE '45000'
                  
                  -- the actual body of the function is defined, replacing the statement that throws the exception
                  ALTER SPECIFIC ROUTINE child_arr_one
                    BEGIN ATOMIC
                      DECLARE id_list INT ARRAY DEFAULT ARRAY[];
                      for_loop:
                      FOR SELECT id FROM ptree WHERE pid = p_pid DO
                        SET id_list[CARDINALITY(id_list) + 1] = id;
                        SET id_list = id_list || child_arr(id);
                      END FOR for_loop;
                      RETURN id_list;
                    END
                  
                  -- the function can now be used in SQL statements
                  SELECT * FROM TABLE(child_arr(2))
                  

                  In the next example, a table with two columns is returned instead of an array. In this example, a local table variable is declared and filled with the children and the children's children.

                  CREATE FUNCTION child_table(p_pid INT) RETURNS TABLE(r_pid INT, r_id INT)
                    SPECIFIC child_table_one
                    READS SQL DATA
                    SIGNAL SQLSTATE '45000'
                  
                  ALTER SPECIFIC ROUTINE child_table_one
                    BEGIN ATOMIC
                      DECLARE TABLE child_tree (pid INT, id INT);
                      for_loop:
                      FOR SELECT pid, id FROM ptree WHERE pid = p_pid DO
                        INSERT INTO child_tree VALUES pid, id;
                        INSERT INTO child_tree SELECT r_pid, r_id FROM TABLE(child_table(id));
                      END FOR for_loop;
                      RETURN TABLE(SELECT * FROM child_tree);
                    END
                  
                  SELECT * FROM TABLE(child_table(1))
                  

                  Infinite recursion is not possible as the routine is terminated when a given depth is reached.

                  Java Language Routines (SQL/JRT)

                  The general features of SQL-Invoked Routines are shared between PSM and JRT routines. These features are covered in the previous section. This section deals with specific aspects of JRT routines.

                  The body of a Java language routine is a static method of a Java class, specified with a fully qualified method name in the routine definition. A simple CREATE FUNCTION example is given below, which defines the function to call the java.lang.Math.sinh(double d) Java method. The function can be called in SQL statements just like any built-in function.

                  CREATE FUNCTION sinh(v DOUBLE) RETURNS DOUBLE
                    LANGUAGE JAVA DETERMINISTIC NO SQL
                    EXTERNAL NAME 'CLASSPATH:java.lang.Math.sinh'
                  
                  SELECT sinh(doublecolumn) FROM mytable
                  

                  In the example below, the static method named toZeroPaddedString is specified to be called when the function is invoked.

                  CREATE FUNCTION zero_pad(x BIGINT, digits INT, maxsize INT)
                    RETURNS CHAR VARYING(100)
                    LANGUAGE JAVA DETERMINISTIC NO SQL
                    EXTERNAL NAME 'CLASSPATH:org.hsqldb.lib.StringUtil.toZeroPaddedString'
                  

                  The signature of the Java method (used in the Java code but not in SQL code to create the function) is given below:

                  public static String toZeroPaddedString(long value, int precision, int maxSize)

                  The parameter and return types of the SQL routine definition must match those of the Java method according to the table below:

                  SMALLINT  

                  short or Short

                  INT

                  int or Integer

                  BIGINT

                  long or Long

                  NUMERIC  or DECIMAL

                  BigDecimal

                  FLOAT  or DOUBLE

                  double or Double

                  CHAR or VARCHAR

                  String

                  DATE

                  java.sql.Date

                  TIME

                  java.sql.Time

                  TIMESTAMP

                  java.sql.Timestamp

                  BINARY

                  Byte[]

                  BOOLEAN

                  boolean or Boolean

                  ARRAY of any typejava.sql.Array

                  TABLE

                  java.sql.ResultSet

                  If the specified Java method is not found or its parameters and return types do not match the definition, an exception is raised. If more than one version of the Java method exist, then the one with matching parameter and return types is found and registered. If two “equivalent” methods exist, the first one is registered. (This situation arises only when a parameter is a primitive in one version and an Object in another version, e.g. long and java.lang.Long.).

                  When the Java method of an SQL/JRT routine returns a value, it should be within the size and precision limits defined in the return type of the SQL-invoked routine, otherwise an exception is raised. The scale difference are ignored and corrected. For example, in the above example, the RETURNS CHAR VARYING(100) clause limits the length of the strings returned from the Java method to 100. But if the number of digits after the decimal point (scale) of a returned BigDecimal value is larger than the scale specified in the RETURNS clause, the decimal fraction is silently truncated and no exception of warning is raised.

                  When the function is specified as RETURNS TABLE(...) the static Java method should return a JDBCResultSet instance. For an example of how to construct a JDBCResultSet for this purpose, see the source code for the org.hsqldb.jdbc.JDBCArray class.

                  Polymorphism

                  If two versions of the same SQL invoked routine with different parameter types are required, they can be defined to point to the same method name or different method names, or even methods in different classes. In the example below, the first two definitions refer to the same method name in the same class. In the Java class, the two static methods are defined with corresponding method signatures.

                  In the third example, the Java function returns a result set and the SQL declaration includes RETURNS TABLE.

                  CREATE FUNCTION an_hour_before_or_now(t TIME)
                    RETURNS TIME
                    NO SQL
                    LANGUAGE JAVA PARAMETER STYLE JAVA
                    EXTERNAL NAME 'CLASSPATH:org.npo.lib.nowLessAnHour'
                  
                  CREATE FUNCTION an_hour_before_or_now(t TIMESTAMP)
                    RETURNS TIMESTAMP
                    NO SQL
                    LANGUAGE JAVA PARAMETER STYLE JAVA
                    EXTERNAL NAME 'CLASSPATH:org.npo.lib.nowLessAnHour'
                  
                  CREATE FUNCTION testquery(i INTEGER) 
                    RETURNS TABLE(n VARCHAR(20), i INT) 
                    READS SQL DATA
                    LANGUAGE JAVA
                    EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.TestJavaFunctions.getQueryResult'
                  
                  

                  In the Java class the definitions are as follows. Note the definition of the getQueryResult method begins with a java.sql.Connection parameter. This parameter is ignored when choosing the Java method. The parameter is used to pass the current JDBC connection to the Java method.

                      public static java.sql.Time nowLessAnHour(java.sql.Time value) {
                          ...
                      }
                      public static java.sql.Timestamp nowLessAnHour(java.sql.Timestamp value)
                          ...
                      }
                  
                      public static ResultSet getQueryResult(Connection connection, int i) throws SQLException {
                          Statement st = connection.createStatement();
                          return st.executeQuery("SELECT * FROM T WHERE I < " + i);
                      }
                  
                  

                  Java Language Procedures

                  Java procedures are defined similarly to functions. The differences are:

                  • The return type of the Java static method must be void.

                  • If a parameter is defined as OUT or INOUT, the corresponding Java static method parameter must be defined as an array of the JDBC non-primitive type.

                  • When the Java static method is invoked, the OUT and INOUT arguments are passed as a single-element array.

                  • The static method can modify the OUT or INOUT argument by assigning a value to the sole element of the argument array.

                  • A procedure can return one or more result sets. These are instantiated as JDBC ResultSet objects by the Java static and returned in array arguments of the method. The signature of the Java method for a procedure that has N declared parameters and returns M result sets has the following pattern. The N parameters corresponding to the signature of the declared SQL procedure are defined first, followed by M parameters as ResultSet arrays.

                    When the SQL procedure is executed, the Java method is called with single element array arguments passed for OUT and INOUT SQL parameters, and single element arrays of ResultSet for the returned ResultSet objects. The Java method may call the execute() or executeQuery() methods of JDBC Statement or PreparedStatement objects that are declared within the method and assign the ResultSet objects to the first element of each ResultSet[] argument. For the returned ResultSet objects, the Java method should not call the methods of java.sql.ResultSet before returning.

                    void methodName(<arg1>, ... <argN>, ResultSet[] r1, ..., ResultSet[] rM)

                  • If the procedure contains SQL statements, only statements for data access and manipulation are allowed. The Java method should not perform commit or rollback. The SQL statements should not change the session settings and should not include statements that create or alter tables or other database objects. These rules are generally enforced by the engine, but additional enforcement may be added in future versions

                  An example of a procedure definition, together with its Java signature, is given below. This procedure is the SQL/JRT version of the example discussed above for SQL/PSM.

                  CREATE PROCEDURE get_customer(IN id INT, OUT firstname VARCHAR(50), OUT lastname VARCHAR(50)) 
                    READS SQL DATA
                    LANGUAGE JAVA
                    EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.Test01.getCustomerProcedure'
                  
                    public static void getCustomerProcedure(int id, String[] firstn, String[] lastn)
                        throws java.sql.SQLException {
                        firstn[0] = somevalue;
                        lastn[0] = somevalue;
                    }
                  
                  

                  In the next example a procedure is defined to return a result set. The signature of the Java method is also given. The Java method assigns a ResultSet object to the zero element of the result parameter.

                  CREATE PROCEDURE new_customer(firstname VARCHAR(50), lastname VARCHAR(50))
                    MODIFIES SQL DATA 
                    LANGUAGE JAVA
                    DYNAMIC RESULT SETS 1
                    EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.Test01.newCustomerProcedure'
                  
                    public static void newCustomerProcedure(String firstn, String lastn, String addr,
                                         ResultSet[] result) throws java.sql.SQLException {
                        result[0] = someresultset;
                    }
                  
                  

                  Java language procedures SQL/JRT are used in an identical manner to SQL/PSM routines. See the section under SQL/PSM routines, Returning Data From Procedures, on how to use the JDBC CallableStatement interface to call the procedure and to get the OUT and INOUT arguments and to use the ResultSet objects returned by the procedure.

                  Java Static Methods

                  The static methods that are used for procedures and functions must be declared in a public class. The methods must be declared as public static. For functions, the method return type must be one of the JDBC supported types. The IN parameters of the method must be declared as one of the supported types. The OUT and INOUT parameters must be declared as Java arrays of supported types. If the SQL definition of a function includes RETURNS NULL ON NULL INPUT, then the IN parameters of the Java static function can be int or long primitives, otherwise, they must be Integer or Long. The declared Java arrays for OUT and INOUT parameters for SQL INTEGER or BIGINT must be Integer[] or Long[] respectively.

                  If the SQL definition of the routine includes NO SQL, then no JDBC method call is allowed to execute in the method body. Otherwise, a JDBC Connection can be used within the Java method to access the database. If the definition includes CONTAINS SQL, then no table data can be read. If the definition includes READS SQL DATA, then no table data can be modified. If the definition includes MODIFIES SQL DATA, then data can be modified. In all modes, it is not allowed to execute DDL statements that change the schema definition.

                  It is possible to use DECLARE LOCAL TEMPORARY TABLE in a Java method, as this is in the session scope.

                  There are two ways to use the JDBC Connection object.

                  1. Define the Java method with a Connection parameter as the first parameter. This parameter is "hidden" and only visible to the engine. The rest of the parameters, if any, are used to choose the method according to the required types of parameters.

                  2. Use the SQL/JRT Standard "jdbc:default:connection" method. With this approach, the Java method does not include a Connection parameter. In the method body, the connection is established with a method call to DriverManager, as in the example below:

                    Connection con = DriverManager.getConnection("jdbc:default:connection");

                  Both methods return a connection that is based on the current session. This connection has some extra properties, for example, the Close() method does not actually close it.

                  An example of an SQL PROCEDURE with its Java method definition is given below. The CREATE PROCEDURE statement is the same with or without the Connection parameter:

                  CREATE PROCEDURE proc1(IN P1 INT, IN P2 INT, OUT P3 INT)
                  SPECIFIC P2 LANGUAGE JAVA DETERMINISTIC MODIFIES SQL DATA EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.TestStoredProcedure.procTest2'");
                  

                  In the first example, the "jdbc:default:connection" method is used. In the second example, a connection parameter is used

                      public static void procTest2(int p1, int p2,
                                         Integer[] p3) throws java.sql.SQLException {
                  
                          Connection conn =
                              DriverManager.getConnection("jdbc:default:connection");
                          java.sql.Statement stmt = conn.createStatement();
                  
                          stmt.execute("INSERT INTO MYTABLE VALUES(" + p1 + ",'test1')");
                          stmt.execute("INSERT INTO MYTABLE VALUES(" + p2 + ",'test2')");
                  
                          java.sql.ResultSet rs = stmt.executeQuery("select * from MYTABLE");
                          java.sql.ResultSetMetaData meta = rs.getMetaData();
                  
                          int cols  = meta.getColumnCount();
                          p3[0] = Integer.valueOf(cols);
                  
                          rs.close();
                          stmt.close();
                      }
                  
                  //  alternative declaration with Connection parameter
                  //  public static void procTest2(Connection conn, int p1, int p2,
                  //                    Integer[] p3) throws java.sql.SQLException {
                  

                  When the stored procedure is called by the user's program, the value of the OUT parameter can be read after the call.

                      // a CallableStatement is used to prepare the call
                      // the OUT parameter contains the return value
                      CallableStatement c = conn.prepareCall("call proc1(1,2,?)");
                      c.execute();
                      int value = c.getInt(1);
                  

                  Legacy Support

                  The legacy HyperSQL statement, CREATE ALIAS <name> FOR <fully qualified Java method name> is no longer supported directly. It is supported when importing databases and translates to a special CREATE FUNCTION <name> statement that creates the function in the PUBLIC schema.

                  The direct use of a Java method as a function is still supported but deprecated. It is internally translated to a special CREATE FUNCTION statement where the name of the function is the double quoted, fully qualified name of the Java method used.

                  Securing Access to Classes

                  By default, the static methods of any class that is on the classpath are available to be used. This can compromise security in some systems. The optional Java system property hsqldb.method_class_names allows preventing access to classes other than java.lang.Math or specifying a semicolon-separated list of allowed classes. A property value that ends with .* is treated as a wild card and allows access to all class or method names formed by substitution of the * (asterisk).

                  In the example below, the property has been included as an argument to the Java command.

                      java -Dhsqldb.method_class_names="org.me.MyClass;org.you.YourClass;org.you.lib.*" [the rest of the command line]
                  

                  The above example allows access to the methods in the two classes: org.me.MyClass and org.you.YourClass together with all the classes in the org.you.lib package. Note that if the property is not defined, no access control is performed at this level.

                  Once the routine has been defined, the normal database access control still applies. The routine can be executed only by the users who have been granted EXECUTE privileges on it. The user who executes a Java routine must also have the relevant access privileges on the tables that are used inside the Java method.

                  User Defined Aggregate Functions

                  HyperSQL adds an extension to the SQL Standard to allow user-defined aggregate functions. A user-defined aggregate function has a single parameter when it is used in SQL statements. Unlike the predefined aggregate functions, the keyword DISTINCT cannot be used when a user defined aggregate function is invoked. Like all user-defined functions, an aggregate function belongs to a schema and can be polymorphic (using multiple function definitions with the same name but different parameter types).

                  A user defined aggregate function can be used in SQL statements where a predefined aggregate function is allowed.

                  Definition of Aggregate Functions

                  An aggregate function is always defined with 4 parameters. The first parameter is the parameter that is used when the function is invoked in SQL statements, the rest of the parameter are invisible to the invoking SQL statement. The type of the first parameter is user defined. The type of the second parameter must be BOOLEAN. The third and fourth parameters have user defined types and must be defined as INOUT parameters. The defined return type of the function determines the type of the value returned when the function is invoked.

                  CREATE AGGREGATE FUNCTION

                  user defined aggregate function definition

                  Aggregate function definition is similar to normal function definition and has the mandatory <returns clause>. The BNF is given below.

                  <user defined aggregate function> ::= CREATE AGGREGATE FUNCTION <schema qualified routine name> <SQL aggregate parameter declaration list> <returns clause> <routine characteristics> <routine body>

                  The parameter declaration list BNF is given below. The type of the first parameter is used when the function is invoked as part of an SQL statement. When multiple versions of a function are required, each version will have the first parameter of a different type.

                  <SQL aggregate declaration list> ::= <left paren> [IN] [ <SQL parameter name> ] <parameter type> <comma> [IN] [ <SQL parameter name> ] BOOLEAN <comma> INOUT [ <SQL parameter name> ] <parameter type> <comma> INOUT [ <SQL parameter name> ] <parameter type> <right paren>

                  The return type is user defined. This is the type of the resulting value when the function is called. Usually an aggregate function is defined with CONTAINS SQL, as it normally does not read the data in database tables, but it is possible to define the function with READS SQL DATA and access the database tables.

                  When a SQL statement that uses the aggregate function is executed, HyperSQL invokes the aggregate function, with all the arguments set, once per each row in order to compute the values. Finally, it invokes the function once more to return the final result.

                  In the computation phase, the first argument is the value of the user argument as specified in the SQL statement, computed for the current row. The second argument is the boolean FALSE. The third and fourth argument values can have any type and are initially null, but they can be updated in the body of the function during each invocation. The third and fourth arguments act as registers and hold their values between invocations. The return value of the function is ignored during the computation phase (when the second parameter is FALSE).

                  After the computation phase, the function is invoked once more to get the final result. In this invocation, the first argument is NULL and the second argument is boolean TRUE. The third and fourth arguments hold the values they held at the end of the last invocation. The value returned by the function in this invocation is used as the result of the aggregate function computation in the invoking SQL statement. In SQL queries with GROUP BY, the call sequence is repeated separately for each separate group.

                  SQL PSM Aggregate Functions

                  The example below features a user defined version of the Standard AVG(<value expression>) aggregate function for INTEGER input and output types. This function behaves differently from the Standard AVG function as it returns 0 when all the input values are null.

                  CREATE AGGREGATE FUNCTION udavg(IN x INTEGER, IN flag BOOLEAN, INOUT addup BIGINT, INOUT counter INT)
                    RETURNS INTEGER
                    CONTAINS SQL
                    BEGIN ATOMIC
                      IF flag THEN
                        RETURN addup / counter;
                      ELSE
                        SET counter = COALESCE(counter, 0) + 1;
                        SET addup = COALESCE(addup, 0) || COALESCE(x, 0);
                        RETURN NULL;
                      END IF;
                    END
                  
                  

                  The user defined aggregate function is used in a select statement in the example below. Only the first parameter is visible and utilised in the select statement.

                  SELECT udavg(id) FROM customers GROUP BY lastname;

                  In the example below, the function returns an array that contains all the values passed for the aggregated column. For use with longer arrays, you can optimise the function by defining a larger array in the first iteration, and using the TRIM_ARRAY function on the RETURN to cut the array to size. This function is similar to the built-in ARRAY_AGG function

                  CREATE AGGREGATE FUNCTION array_aggregate(IN val VARCHAR(100), IN flag boolean, INOUT buffer VARCHAR(100) ARRAY, INOUT counter INT)
                    RETURNS VARCHAR(100) ARRAY
                    CONTAINS SQL
                    BEGIN ATOMIC
                      IF flag THEN
                        RETURN buffer;
                      ELSE
                        IF val IS NULL THEN RETURN NULL; END IF;
                        IF counter IS NULL THEN SET counter = 0; END IF;
                        SET counter = counter + 1;
                        IF counter = 1 THEN SET buffer = ARRAY[val];
                        ELSE SET buffer[counter] = val; END IF;
                        RETURN NULL;
                      END IF;
                    END
                  

                  The tables and data for the select statement below are created with the DatabaseManager or DatabaseManagerSwing GUI apps. (You can find the SQL in the TestSelf.txt file in the zip). Part of the output is shown. Each row of the output includes an array containing the values for the invoices for each customer.

                  SELECT ID, FIRSTNAME, LASTNAME, ARRAY_AGGREGATE(CAST(INVOICE.TOTAL AS VARCHAR(100))) 
                    FROM customer JOIN INVOICE ON ID =CUSTOMERID
                    GROUP BY ID, FIRSTNAME, LASTNAME
                  
                  11 Susanne   Karsen    ARRAY['3988.20']                               
                  12 John      Peterson  ARRAY['2903.10','4382.10','4139.70','3316.50'] 
                  13 Michael   Clancy    ARRAY['6525.30']                               
                  14 James     King      ARRAY['3665.40','905.10','498.00']             
                  18 Sylvia    Clancy    ARRAY['634.20','4883.10']                      
                  20 Bob       Clancy    ARRAY['3414.60','744.60']
                  

                  In the example below, the function returns a string that contains the comma-separated list of all the values passed for the aggregated column. This function is similar to the built in GROUP_CONCAT function.

                  CREATE AGGREGATE FUNCTION group_concatenate(IN val VARCHAR(100), IN flag BOOLEAN, INOUT buffer VARCHAR(1000), INOUT counter INT
                   RETURNS VARCHAR(1000)
                   CONTAINS SQL
                   BEGIN ATOMIC
                   IF FLAG THEN
                    RETURN BUFFER;
                   ELSE
                    IF val IS NULL THEN RETURN NULL; END IF;
                    IF buffer IS NULL THEN SET BUFFER = ''; END IF;
                    IF counter IS NULL THEN SET COUNTER = 0; END IF;
                    IF counter > 0 THEN SET buffer = buffer || ','; END IF;
                    SET buffer = buffer + val;
                    SET counter = counter + 1;
                    RETURN NULL;
                   END IF;
                   END
                  

                  The same tables and data as for the previous example is used. Part of the output is shown. Each row of the output is a comma-separated list of names.

                  SELECT group_concatenate(firstname || ' ' || lastname) FROM customer GROUP BY lastname
                    
                  Laura Steel,John Steel,John Steel,Robert Steel                                   
                  Robert King,Robert King,James King,George King,Julia King,George King            
                  Robert Sommer,Janet Sommer                                                       
                  Michael Smith,Anne Smith,Andrew Smith                                            
                  Bill Fuller,Anne Fuller                                                          
                  Laura White,Sylvia White                                                         
                  Susanne Clancy,Michael Clancy,Sylvia Clancy,Bob Clancy,Susanne Clancy,John Clancy
                  

                  Java Aggregate Functions

                  A Java aggregate function is defined similarly to PSM functions, apart from the routine body, which is defined as EXTERNAL NAME ... The Java function signature must follow the rules for both nullable and INOUT parameters, therefore:

                  No argument is defined as a primitive or primitive array type. This allows nulls to be passed to the function. The second and third arguments must be defined as arrays of the JDBC non-primitive types listed in the table in the previous section.

                  In the example below, a user-defined aggregate function for geometric mean is defined.

                  CREATE AGGREGATE FUNCTION geometric_mean(IN val DOUBLE, IN flag BOOLEAN, INOUT register DOUBLE, INOUT counter INT)
                    RETURNS DOUBLE
                    NO SQL
                    LANGUAGE JAVA
                    EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.Test01.geometricMean'
                  

                  The Java function definition is given below:

                      public static Double geometricMean(Double in, Boolean flag,
                              Double[] register, Integer[] counter) {
                          if (flag) {
                              if (register[0] == null) { return null; }
                              double a = register[0].doubleValue();
                              double b = 1 / (double) counter[0];
                              return Double.valueOf(java.lang.Math.pow(a, b));
                          }
                          if (in == null) { return null; }
                          if (in.doubleValue() == 0) { return null; }
                          if (register[0] == null) {
                              register[0] = in;
                              counter[0]  = Integer.valueOf(1);
                          } else {
                              register[0] = Double.valueOf(register[0].doubleValue() * in.doubleValue());
                              counter[0] = Integer.valueOf(counter[0].intValue() + 1);
                          }
                          return null;
                      }
                  

                  In a select statement, the function is used exactly like the built-in aggregate functions:

                  SELECT geometric_mean(age) FROM  FROM customer
                  

                  Chapter 9. Triggers

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 3042 $

                  Copyright 2010-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  Overview

                  Trigger functionality first appeared in SQL:1999. Triggers embody the live database concept, where changes in SQL data can be monitored and acted upon. This means each time a DELETE, UPDATE or INSERT is performed, additional actions are taken by the declared triggers. SQL Standard triggers are imperative while the relational aspects of SQL are declarative. Triggers allow performing an arbitrary transformation of data that is being updated or inserted, or to prevent insert, updated or deletes, or to perform additional operations.

                  Some bad examples of SQL triggers in effect enforce an “integrity constraint” which would better be expressed as a CHECK constraint. A trigger that causes an exception if the value inserted in a column is negative is such an example. A check constraint that declares CHECK VALUE >= 0 (declarative) is a better way of expressing an integrity constraint than a trigger that throws an exception if the same condition is false.

                  Usage constraints cannot always be expressed by SQL’s integrity constraint statements. Triggers can enforce these constraints. For example, it is not possible to use a check constraint to prevent inserts or deletes on weekends. A trigger can be used to enforce the time when each operation is allowed.

                  A trigger is declared to activate when an UPDATE, INSERT or DELETE action is performed on a table. These actions may be direct or indirect. Indirect actions may arise from CASCADE actions of FOREIGN KEY constraints, or from data change statements performed on a VIEW that is based on the table that in.

                  It is possible to declare multiple triggers on a single table. The triggers activate one by one according to the order in which they were defined. HyperSQL supports an extension to the CREATE TRIGGER statement, which allows the user to specify the execution order of the new trigger.

                  A row level trigger allows access to the deleted or inserted rows. For UPDATE actions there is both an old and new version of each row. A trigger can be specified to activate before or after the action has been performed.

                  BEFORE Triggers

                  A trigger that is declared as BEFORE DELETE cannot modify the deleted row. In other words, it cannot decide to delete a different row by changing the column values of the row. A trigger that is declared as BEFORE INSERT and BEFORE UPDATE can modify the values that are inserted into the database. For example, a badly formatted string can be cleaned up by a trigger before INSERT or UPDATE.

                  BEFORE triggers cannot modify the other tables of the database. All BEFORE triggers can veto the action by throwing an exception.

                  Because BEFORE triggers can modify the inserted or updated rows, all constraint checks are performed after the execution of the BEFORE triggers. The checks include NOT NULL constraints, length of strings, CHECK constraints, and FOREIGN key constraints.

                  AFTER Triggers

                  AFTER triggers can also perform additional data changes, for example inserting an additional row into a different table for data audits. These triggers cannot modify the rows that have been modified by the INSERT or UPDATE action.

                  INSTEAD OF Triggers

                  A trigger that is declared on a VIEW, is an INSTEAD OF trigger. This term means when an INSERT, UPDATE or DELETE statement is executed with the view as the target, the trigger action is all that is performed, and no further data change takes place on the view. The trigger action can include all the statements that are necessary to change the data in the tables that underlie the view, or even other tables, such as audit tables. With the use of INSTEAD OF triggers a read-only view can effectively become updatable or insertable-into.

                  Trigger Properties

                  A trigger is declared on a specific table or view. Various trigger properties determine when the trigger is executed and how.

                  Trigger Event

                  The trigger event specifies the type of SQL statement that causes the trigger to execute. Each trigger is specified to execute when an INSERT, DELETE or UPDATE takes place.

                  The event can be filtered by two separate means. For all triggers, the WHEN clause can specify a condition against the rows that are the subject of the trigger, together with the data in the database. For example, a trigger can activate when the size of a table becomes larger than a certain amount. Or it can activate when the values in the rows being modified satisfy certain conditions.

                  An UPDATE trigger can be declared to execute only when certain columns are the subject of an update statement. For example, a trigger declared as AFTER UPDATE OF (datecolumn) will activate only when the UPDATE statement that is executed includes the column, datecolumn, as one of the columns specified in its SET statements.

                  Granularity

                  A statement level trigger is performed once for the executed SQL statement and is declared as FOR EACH STATEMENT.

                  A row level trigger is performed once for each row that is modified during the execution of an SQL statement and is declared as FOR EACH ROW. Note that an SQL statement can INSERT, UPDATE or DELETE zero or more rows.

                  If a statement does not apply to any row, then the trigger is not executed.

                  If FOR EACH ROW or FOR EACH STATEMENT is not specified, then the default is FOR EACH STATEMENT.

                  The granularity dictates whether the REFERENCING clause can specify OLD ROW, NEW ROW, or OLD TABLE, NEW TABLE.

                  A trigger declared as FOR EACH STATEMENT can only be an AFTER trigger.

                  Trigger Action Time

                  A trigger is executed BEFORE, AFTER or INSTEAD OF the trigger event.

                  INSTEAD OF triggers are allowed only when the trigger is declared on a VIEW. With this type of trigger, the event (SQL statement) itself is not executed, only the trigger.

                  BEFORE or AFTER triggers are executed just before or just after the execution of the event. For example, just before a row is inserted into a table, the BEFORE trigger is activated, and just after the row is inserted, the AFTER trigger is executed.

                  BEFORE triggers can modify the row that is being inserted or updated. AFTER triggers cannot modify rows. They are usually used to perform additional operations, such as inserting rows into other tables.

                  A trigger declared as FOR EACH STATEMENT can only be an AFTER trigger.

                  References to Rows

                  If the old rows or new rows are referenced in the SQL statements in the trigger action, they must have names. The REFERENCING clause is used to give names to the old and new rows. The clause, REFERENCING OLD | NEW TABLE is used for statement level triggers. The clause, REFERENCING OLD | NEW ROW is used for row level triggers. If the old rows or new rows are referenced in the SQL statements in the trigger action, they must have names. In the SQL statements, the columns of the old or new rows are qualified with the specified names.

                  Trigger Condition

                  The WHEN clause can specify a condition for the columns of the row that is being changed. Using this clause you can simply avoid unnecessary trigger activation for rows that do not need it.

                  For UPDATE trigger, you can specify a list of columns of the table. If a list of columns is specified, then if the UPDATE statement does not change the columns with SET clauses, then the trigger is not activated at all.

                  Trigger Action in SQL

                  The trigger action specifies what the trigger does when it is activated. This is usually written as one or more SQL statements.

                  When a row level trigger is activated, there is an OLD ROW, or a NEW ROW, or both. An INSERT statement supplies a NEW ROW row to be inserted into a table. A DELETE statement supplies an OLD ROW be deleted. An UPDATE statement supplies both OLD ROW and NEW ROW that represent the updated rows before and after the update. The REFERENCING clause gives names to these rows, so that the rows can be referenced in the trigger action.

                  In the example below, a name is given to the NEW ROW and it is used both in the WHEN clause and in the trigger action SQL to insert a row into a triglog table after each row insert into the testtrig table.

                    CREATE TRIGGER trig AFTER INSERT ON testtrig 
                      REFERENCING NEW ROW AS newrow
                      FOR EACH ROW WHEN (newrow.id > 1)
                      INSERT INTO TRIGLOG VALUES (newrow.id, newrow.data, 'inserted')
                  

                  In the example blow, the trigger code modifies the updated data if a condition is true. This type of trigger is useful when the application does not perform the necessary checks and modifications to data. The statement block that starts with BEGIN ATOMIC is similar to an SQL/PSM block and can contain all the SQL statements that are allowed in an SQL/PSM block.

                    CREATE TRIGGER t BEFORE UPDATE ON customer
                      REFERENCING NEW AS newrow FOR EACH ROW
                      BEGIN ATOMIC
                        IF LENGTH(newrow.firstname) > 10 THEN
                          SET newrow.firstname = LOWER(newrow.firstname);
                        END IF;
                      END
                  

                  Trigger Action in Java

                  A trigger action can be written as a Java class that implements the org.hsqldb.Trigger interface. This interface has a single method which is called when the trigger is activated, either before or after the event. When the method is called by the engine, it supplies the type of trigger as an int value defined by the interface(as type argument), the name of the trigger (as trigName argument), the name of the table (as tabName argument), the OLD ROW (as oldRow argument) and the NEW ROW (as newRow argument). The oldRow argument is null for row level INSERT triggers. The newRow argument is null for row level DELETE triggers. For table level triggers, both arguments are null (that is, there is no access to the data). The triggerType argument is one of the constants in the org.hsqldb.Trigger interface which indicate the type of trigger, for example, INSERT_BEFORE_ROW or UPDATE_AFTER_ROW.

                  The Java class for the trigger can be reused for several triggers on different tables. The method code can distinguish between the different tables and triggers using the supplied arguments and take appropriate action.

                      fire (int triggerType, String name, String table, Object row1[], Object row2[])
                  

                  The Java method for a synchronous trigger (see below) can modify the values in newRow2 in a BEFORE trigger. Such modifications are reflected in the row that is being inserted or updated. Any other modifications are ignored by the engine.

                  A Java trigger that uses an instance of org.hsqldb.Trigger has two forms, synchronous, or asynchronous (immediate or queued). By default, or when QUEUE 0 is specified, the action is performed immediately by calling the Java method. This is similar to SQL trigger actions.

                  When QUEUE n is specified with n larger than 0, the engine uses a separate thread to execute the Java method, using a queue with the size n. For certain applications, such as real-time systems this allows asynchronous notifications to be sent by the trigger event, without introducing delays in the engine. With asynchronous triggers, an extra parameter, NOWAIT can be used in trigger definition. This overcomes the queue full condition. In this mode, old calls that are still in the queue are discarded one by one and replaced with new calls.

                  Java row level triggers that are declared with BEFORE trigger action time can modify the row data. Triggers with AFTER trigger action time can modify the database, e.g. insert new rows. If the trigger needs to access the database, the same method as in Java Language Routines SQL/JRT can be used. The Java code should connect to the URL "jdbc:default:connection" and use this connection to access the database.

                  For sample trigger classes and test code see, org.hsqldb.sample.TriggerSample, org.hsqldb.test.TestTriggers, org.hsqldb.test.TriggerClass and the associated text script TestTriggers.txt in the /testrun/hsqldb/ directory. In the example below, the trigger is activated only if the update statement includes SET clauses that modify any of the specified columns (c1, c2, c3). Furthermore, the trigger is not activated if the c2 column in the updated row is null.

                    CREATE TRIGGER TRIGBUR BEFORE UPDATE OF c1, c2, c3 ON testtrig 
                      referencing NEW ROW AS newrow
                      FOR EACH ROW WHEN (newrow.c2 IS NOT NULL)
                      CALL "org.hsqldb.test.TriggerClass"
                  

                  Java functions can be called from an SQL trigger. So it is possible to define the Java function to perform any external communication that are necessary for the trigger, and use SQL code for checks and alterations to data.

                    CREATE TRIGGER t BEFORE UPDATE ON customer
                      REFERENCING NEW AS newrow FOR EACH ROW
                      BEGIN ATOMIC
                        IF LENGTH(newrow.firstname) > 10 THEN
                          CALL my_java_function(newrow.firstname, newrow.lastname);
                        END IF;
                      END
                  

                  Trigger Creation

                  CREATE TRIGGER

                  trigger definition

                  <trigger definition> ::= CREATE TRIGGER <trigger name> <trigger action time> <trigger event> ON <table name> [BEFORE <other trigger name>] [ REFERENCING <transition table or variable list> ] <triggered action>

                  <trigger action time> ::= BEFORE | AFTER | INSTEAD OF

                  <trigger event> ::= INSERT | DELETE | UPDATE [ OF <trigger column list> ]

                  <trigger column list> ::= <column name list>

                  <triggered action> ::= [ FOR EACH { ROW | STATEMENT } ] [ <triggered when clause> ] <triggered SQL statement>

                  <triggered when clause> ::= WHEN <left paren> <search condition> <right paren>

                  <triggered SQL statement> ::= <SQL procedure statement> | BEGIN ATOMIC { <SQL procedure statement> <semicolon> }... END | [QUEUE <integer literal>] [NOWAIT] CALL <HSQLDB trigger class FQN>

                  <transition table or variable list> ::= <transition table or variable>...

                  <transition table or variable> ::= OLD [ ROW ] [ AS ] <old transition variable name> | NEW [ ROW ] [ AS ] <new transition variable name> | OLD TABLE [ AS ] <old transition table name> | NEW TABLE [ AS ] <new transition table name>

                  <old transition table name> ::= <transition table name>

                  <new transition table name> ::= <transition table name>

                  <transition table name> ::= <identifier>

                  <old transition variable name> ::= <correlation name>

                  <new transition variable name> ::= <correlation name>

                  Trigger definition is a relatively complex statement. The combination of <trigger action time> and <trigger event> determines the type of the trigger. Examples include BEFORE DELETE, AFTER UPDATE, INSTEAD OF INSERT. If the optional [ OF <trigger column list> ] is specified for an UPDATE trigger, then the trigger is activated only if one of the columns that is in the <trigger column list> is specified in the UPDATE statement that activates the trigger.

                  If a trigger is FOR EACH ROW, which is the default option, then the trigger is activated for each row of the table that is affected by the execution of an SQL statement. Otherwise, it is activated once only per statement execution. For FOR EACH ROW triggers, there is an OLD and NEW state for each row. For UPDATE triggers, both OLD and NEW states exist, representing the row before the update, and after the update. For DELETE, triggers, there is only an OLD state. For INSERT triggers, there is only the NEW state. If a trigger is FOR EACH STATEMENT, then a transient table is created containing all the rows for the OLD state and another transient table is created for the NEW state.

                  The [ REFERENCING <transition table or variable> ] is used to give a name to the OLD and NEW data row or table. This name can be referenced in the <SQL procedure statement> to access the data.

                  The optional <triggered when clause> is a search condition, similar to the search condition of a DELETE or UPDATE statement. If the search condition is not TRUE for a row, then the trigger is not activated for that row.

                  The <SQL procedure statement> is limited to INSERT, DELETE, UPDATE and MERGE statements.

                  The <HSQLDB trigger class FQN> is a delimited identifier that contains the fully qualified name of a Java class that implements the org.hsqldb.Trigger interface.

                  Early releases of HyperSQL version 2.0 do not allow the use of OLD TABLE or NEW TABLE in statement level triggers.

                  TRIGGERED SQL STATEMENT

                  triggered SQL statement

                  The <triggered SQL statement> has three forms.

                  The first form is a single SQL procedure statement. This statement can reference the OLD ROW and NEW ROW variables. For example, it can reference these variables and insert a row into a separate table.

                  The second form is enclosed in a BEGIN ... END block and can include one or more SQL procedure statements. In BEFORE triggers, you can include SET statements to modify the inserted or updated rows. In AFTER triggers, you can include INSERT, DELETE and UPDATE statements to change the data in other database tables. SELECT and CALL statements are allowed in BEFORE and AFTER triggers. CALL statements in BEFORE triggers should not modify data.

                  The third form specifies a call to a Java method.

                  Two examples of a trigger with a block are given below. The block can include elements discussed in the SQL-Invoked Routines chapter, including local variables, loops and conditionals. You can also raise an exception in such blocks in order to terminate the execution of the SQL statement that caused the trigger to execute.

                  /* the trigger throws an exception if a customer with the given last name already exists */
                    CREATE TRIGGER trigone BEFORE INSERT ON customer 
                      REFERENCING NEW ROW AS newrow
                      FOR EACH ROW WHEN (newrow.id > 100)
                      BEGIN ATOMIC
                        IF EXISTS (SELECT * FROM CUSTOMER WHERE CUSTOMER.LASTNAME = NEW.LASTNAME) THEN
                          SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'already exists';
                        END IF;
                      END
                  
                  /* for each row inserted into the target, the trigger insert a row into the table used for logging */
                    CREATE TRIGGER trig AFTER INSERT ON testtrig 
                      BEFORE othertrigger  
                      REFERENCING NEW ROW AS newrow
                      FOR EACH ROW WHEN (newrow.id > 1)
                      BEGIN ATOMIC
                        INSERT INTO triglog VALUES (newrow.id, newrow.data, 'inserted');
                        /* more statements can be included */
                      END
                  

                  TRIGGER EXECUTION ORDER

                  trigger execution order

                  <trigger execution order> ::= BEFORE <other trigger name>

                  HyperSQL extends the SQL Standard to allow the order of execution of a trigger to be specified by using [BEFORE <other trigger name>] in the definition. The newly defined trigger will be executed before the specified other trigger. If this clause is not used, the new trigger is executed after all the previously defined triggers of the same scope (BEFORE, AFTER, EACH ROW, EACH STATEMENT).

                  DROP TRIGGER

                  drop trigger statement

                  <drop trigger statement> ::= DROP TRIGGER <trigger name>

                  Destroy a trigger.

                  Chapter 10. Built In Functions

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5049 $

                  Copyright 2010-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  Overview

                  HyperSQL supports a wide range of built-in functions and allows user-defined functions written in SQL and Java languages. User-defined functions are covered in the SQL-Invoked Routines chapter. If a built-in function is not available, you can write your own using procedural SQL or Java. Built-in aggregate functions are discussed in chapters that cover SQL in general.

                  The built-in functions fall into three groups:

                  • SQL Standard Functions

                    A wide rang of functions defined by SQL/Foundation are supported. SQL/Foundation functions that have no parameter are called without empty parentheses. Functions with multiple parameters often use keywords instead of commas to separate the parameters. Many functions are overloaded. Among these, some have one or more optional parameters that can be omitted, while the return type of some functions is dependent upon the type of one of the parameters. The usage of SQL Standard Functions (where they can be used) is covered more extensively in the Data Access and Change chapter

                  • JDBC Open Group CLI Functions

                    These functions were defined as an extension to the CLI standard, which is the basis for ODBC and JDBC and supported by many database products. JDBC supports an escape mechanism to specify function calls in SQL statements in a manner that is independent of the function names supported by the target database engine. For example SELECT {fn DAYOFMONTH (dateColumn)} FROM myTable can be used in JDBC and is translated to Standard SQL as SELECT EXTRACT (DAY_OF_MONTH FROM dateColumn) FROM myTable if a database engine supports the Standard syntax. If a database engine does not support Standard SQL, then the translation will be different. HyperSQL supports all the function names specified in the JDBC specifications as native functions. Therefore, there is no need to use the {fn FUNC_NAME ( ... ) } escape with HyperSQL. If a JDBC function is supported by the SQL Standard in a different form, the SQL Standard form is the preferred form to use.

                  • HyperSQL Built-In Functions

                    Many additional built-in functions are available for some useful operations. Some of these functions return the current setting for the session and the database. The General Functions accept arguments of different types and return values based on comparison between the arguments.

                  In the BNF specification used here, words in capital letters are actual tokens. Syntactic elements such as expressions are enclosed in angle brackets. The <left paren> and <right paren> tokens are represented with the actual symbol. Optional elements are enclosed with square brackets ( <left bracket> and <right bracket> ). Multiple options for a required element are enclosed with braces ( <left brace> and <right brace> ). Alternative tokens are separated with the vertical bar ( <vertical bar> ). At the end of each function definition, the standard which specifies the function is noted in parentheses as JDBC or HyperSQL, or the SQL/Foundation part of the SQL Standard.

                  String and Binary String Functions

                  In SQL, there are three kinds of string: character, binary and bit. The units are respectively characters, octets, and bits. Each kind of string can be in different data types. CHAR, VARCHAR and CLOB are the character data types. BINARY, VARBINARY and BLOB are the binary data types. BIT and BIT VARYING are the bit string types. In all string functions, the position of a unit of the string within the whole string is specified from 1 to the length of the whole string. In the BNF, <char value expr> indicates any valid SQL expression that evaluates to a character type. Likewise, <binary value expr> indicates a binary type and <num value expr> indicates a numeric type.

                  ASCII

                  ASCII ( <char value expr> )

                  Returns an INTEGER equal to the ASCII code value of the first character of <char value expr>. (JDBC)

                  BIT_LENGTH

                  BIT_LENGTH ( <string value expression> )

                  BIT_LENGTH can be used with character, binary and bit strings. It return a BIGINT value that measures the bit length of the string. (Foundation)

                  See also CHARACTER_LENGTH and OCTET_LENGTH.

                  CHAR

                  CHAR ( <UNICODE code> )

                  The argument is an INTEGER. Returns a character string containing a single character that has the specified <UNICODE code>, which is an integer. ASCII codes are a subset of the allowed values for <UNICODE code>. (JDBC)

                  CHARACTER_LENGTH

                  { CHAR_LENGTH | CHARACTER_LENGTH } ( <char value expression> [ USING { CHARACTERS | OCTETS } ] )

                  The CHAR_LENGTH or CHARACTER_LENGTH function can be used with character strings, while OCTET_LENGTH can be used with character or binary strings and BIT_LENGTH can be used with character, binary and bit strings.

                  All functions return a BIGINT value that measures the length of the string in the given unit. CHAR_LENGTH counts characters, OCTET_LENGTH counts octets and BIT_LENGTH counts bits in the string. For CHAR_LENGTH, if [ USING OCTETS ] is specified, the octet count is returned, which is twice the normal length. (Foundation)

                  CONCAT

                  CONCAT ( <char value expr 1>, <char value expr 2> [, ...] )

                  CONCAT ( <binary value expr 1>, <binary value expr 2> [, ...] )

                  The arguments are character strings or binary strings. Returns a string formed by concatenation of the arguments. Minimum number of arguments is 2. Equivalent to the SQL concatenation expression <value expr 1> || <value expr 2> [ || ...] . (JDBC)

                  DIFFERENCE

                  DIFFERENCE ( <char value expr 1>, <char value expr 2> )

                  The arguments are character strings. Converts the arguments into SOUNDEX codes, and returns an INTEGER between 0-4 which indicates how similar the two SOUNDEX value are. If the values are the same, it returns 4, if the values have no similarity, it returns 0. In-between values are returned for partial similarity. (JDBC)

                  INSERT

                  INSERT ( <char value expr 1>, <offset>, <length>, <char value expr 2> )

                  Returns a character string based on <char value expr 1> in which <length> characters have been removed from the <offset> position and in their place, the whole <char value expr 2> is copied. Equivalent to SQL/Foundation OVERLAY( <char value expr1> PLACING < char value expr2> FROM <offset> FOR <length> ) . (JDBC)

                  HEXTORAW

                  HEXTORAW( <char value expr> )

                  Returns a BINARY string formed by translation of hexadecimal digits and letters in the <char value expr>. Each character of the <char value expr> must be a digit or a letter in the A | B | C | D | E | F set. Each byte of the retired binary string is formed by translating two hex digits into one byte. (HyperSQL)

                  LCASE

                  LCASE ( <char value expr> )

                  Returns a character string that is the lower case version of the <char value expr>. Equivalent to SQL/Foundation LOWER (<char value expr>). (JDBC)

                  LEFT

                  LEFT ( <char value expr>, <count> )

                  Returns a character string consisting of the first <count> characters of <char value expr>. Equivalent to SQL/Foundation SUBSTRING(<char value expr> FROM 0 FOR <count>). (JDBC)

                  LENGTH

                  LENGTH ( <char value expr> )

                  Returns as a BIGINT value the number of characters in <char value expr>. Equivalent to SQL/Foundation CHAR_LENGTH(<char value expr>). (JDBC)

                  LOCATE

                  LOCATE ( <char value expr 1>, <char value expr 2> [ , <offset> ] )

                  Returns as a BIGINT value the starting position of the first occurrence of <char value expr 1> within <char value expr 2>. If <offset> is specified, the search begins with the position indicated by <offset>. If the search is not successful, 0 is returned. Equivalent to SQL/Foundation POSITION(<char value expr 1> IN <char value expr 2>). Without the third argument, LOCATE is equivalent to the SQL Standard POSITION function. (JDBC)

                  LPAD

                  LPAD ( <char value expr 1>, <length> [, <char value expr 2> ] )

                  Returns a character string with the length of <length> characters. The string contains the characters of <char value expr 1> padded to the left with spaces. If <length> is smaller than the length of the string argument, the argument is truncated. If the optional <char value expr 2> is specified, this string is used for padding, instead of spaces. (HyperSQL)

                  LTRIM

                  LTRIM ( <char value expr> )

                  Returns a character string based on <char value expr> with the leading space characters removed. Equivalent to SQL/Foundation TRIM( LEADING ' ' FROM <char value expr> ). (JDBC)

                  OCTET_LENGTH

                  OCTET_LENGTH ( <string value expression> )

                  The OCTET_LENGTH function can be used with character or binary strings.

                  Return a BIGINT value that measures the length of the string in octets. When used with character strings, the octet count is returned, which is twice the normal length. (Foundation)

                  OVERLAY

                  OVERLAY ( <char value expr 1> PLACING <char value expr 2>

                  FROM <start position> [ FOR <string length> ] [ USING CHARACTERS ] )

                  OVERLAY ( <binary value expr 1> PLACING <binary value expr 2>

                  FROM <start position> [ FOR <string length> ] )

                  The character version of OVERLAY returns a character string based on <char value expr 1> in which <string length> characters have been removed from the <start position> and in their place, the whole <char value expr 2> is copied.

                  The binary version of OVERLAY returns a binary string formed in the same manner as the character version. (Foundation)

                  POSITION

                  POSITION ( <char value expr 1> IN <char value expr 2> [ USING CHARACTERS ] )

                  POSITION ( <binary value expr 1> IN <binary value expr 2> )

                  The character and binary versions of POSITION search the string value of the second argument for the first occurrence of the first argument string. If the search is successful, the position in the string is returned as a BIGINT. Otherwise zero is returned. (Foundation)

                  RAWTOHEX

                  RAWTOHEX( <binary value expr> )

                  Returns a character string composed of hexadecimal digits representing the bytes in the <binary value expr>. Each byte of the <binary value expr> is translated into two hex digits. (HyperSQL)

                  REGEXP_MATCHES

                  REGEXP_MATCHES ( <char value expr>, <regular expression> )

                  Returns true if the <char value expr> matches the <regular expression> as a whole. The <regular expression> is defined according to Java language regular expression rules. (HyperSQL)

                  REGEXP_SUBSTRING

                  REGEXP_SUBSTRING ( <char value expr>, <regular expression> )

                  Returns the first region in the <char value expr> that matches the <regular expression>. The <regular expression> is defined according to Java language regular expression rules. (HyperSQL)

                  REGEXP_SUBSTRING_ARRAY

                  REGEXP_SUBSTRING_ARRAY ( <char value expr>, <regular expression> )

                  Returns all the regions in the the <char value expr> that match the <regular expression>. The <regular expression> is defined according to Java language regular expression rules. Returns an array containing the matching regions (HyperSQL)

                  REPEAT

                  REPEAT ( <char value expr>, <count> )

                  Returns a character string based on <char value expr>, repeated <count> times. (JDBC)

                  REPLACE

                  REPLACE ( <char value expr 1>, <char value expr 2> [, <char value expr 3> ] )

                  Returns a character string based on <char value expr 1> where each occurrence of <char value expr 2> has been replaced with a copy of <char value expr 3>. If the function is called with just two arguments, the <char value expr 3> defaults to the empty string and calling the function simply removes the occurrences of <char value expr 2> from the first string.(JDBC)

                  REVERSE

                  REVERSE ( <char value expr> )

                  Returns a character string based on <char value expr> with characters in the reverse order. (HyperSQL)

                  RIGHT

                  RIGHT ( <char value expr>, <count> )

                  Returns a character string consisting of the last <count> characters of <char value expr>. (JDBC)

                  RPAD

                  RPAD ( <char value expr 1>, <length> [, <char value expr 2> ] )

                  Returns a character string with the length of <length> characters. The string begins with the characters of <char value expr 1> padded to the right with spaces. If <length> is smaller than the length of the string argument, the argument is truncated. If the optional <char value expr 2> is specified, this string is used for padding, instead of spaces. (HyperSQL)

                  RTRIM

                  RTRIM ( <char value expr> )

                  Returns a character string based on <char value expr> with the trailing space characters removed. Equivalent to SQL/Foundation TRIM(TRAILING ' ' FROM <character string>). (JDBC)

                  SOUNDEX

                  SOUNDEX ( <char value expr> )

                  Returns a four character code representing the sound of <char value expr>. The US census algorithm is used. For example the soundex value for Washington is W252. (JDBC)

                  SPACE

                  SPACE ( <count> )

                  Returns a character string consisting of <count> spaces. (JDBC)

                  SUBSTR

                  { SUBSTR | SUBSTRING } ( <char value expr>, <offset>, <length> )

                  The JDBC version of SQL/Foundation SUBSTRING returns a character string that consists of <length> characters from <char value expr> starting at the <offset> position. (JDBC)

                  SUBSTRING

                  SUBSTRING ( <char value expr> FROM <start position> [ FOR <string length> ] [ USING CHARACTERS ] )

                  SUBSTRING ( <binary value expr> FROM <start position> [ FOR <string length> ] )

                  The character version of SUBSTRING returns a character string that consists of the characters of the <char value expr> from <start position>. If the optional <string length> is specified, only <string length> characters are returned.

                  The binary version of SUBSTRING returns a binary string in the same manner. (Foundation)

                  TRIM

                  TRIM ([ [ LEADING | TRAILING | BOTH ] [ <trim character> ] FROM ] <char value expr> )

                  TRIM ([ [ LEADING | TRAILING | BOTH ] [ <trim octet> ] FROM ] <binary value expr> )

                  The character version of TRIM returns a character string based on <char value expr>. Consecutive instances of <trim character> are removed from the beginning, the end or both ends of the<char value expr> depending on the value of the optional first qualifier [ LEADING | TRAILING | BOTH ]. If no qualifier is specified, BOTH is used as default. If [ <trim character> ] is not specified, the space character is used as default.

                  The binary version of TRIM returns a binary string based on <binary value expr>. Consecutive instances of <trim octet> are removed in the same manner as in the character version. If [ <trim octet> ] is not specified, the 0 octet is used as default. (Foundation)

                  UCASE

                  UCASE ( <char value expr> )

                  Returns a character string that is the upper case version of the <char value expr>. Equivalent to SQL/Foundation UPPER( <char value expr> ) . (JDBC)

                  UPPER

                  UPPER ( <char value expr> )

                  Returns a character string that is the upper case version of the <char value expr> . (Foundation)

                  Numeric Functions

                  ABS

                  ABS ( <num value expr> | <interval value expr> )

                  Returns the absolute value of the argument as a value of the same type. (JDBC and Foundation)

                  ACOS

                  ACOS ( <num value expr> )

                  Returns the arc-cosine of the argument in radians as a value of DOUBLE type. (JDBC)

                  ASIN

                  ASIN ( <num value expr> )

                  Returns the arc-sine of the argument in radians as a value of DOUBLE type. (JDBC)

                  ATAN

                  ATAN ( <num value expr> )

                  Returns the arc-tangent of the argument in radians as a value of DOUBLE type. (JDBC)

                  ATAN2

                  ATAN2 ( <num value expr 1>, <num value expr 2> )

                  The <num value expr 1> and <num value expr 2> express the x and y coordinates of a point. Returns the angle, in radians, representing the angle coordinate of the point in polar coordinates, as a value of DOUBLE type. (JDBC)

                  CEILING

                  { CEIL | CEILING } ( <num value expr> )

                  Returns the smallest integer greater than or equal to the argument. If the argument is exact numeric then the result is exact numeric with a scale of 0. If the argument is approximate numeric, then the result is of DOUBLE type. (JDBC and Foundation)

                  BITAND

                  BITAND ( <num value expr 1>, <num value expr 2> )

                  BITAND ( <bit value expr 1>, <bit value expr 2> )

                  BITANDNOT

                  BITANDNOT ( <num value expr 1>, <num value expr 2> )

                  BITANDNOT ( <bit value expr 1>, <bit value expr 2> )

                  BITNOT

                  BITNOT ( <num value expr 1> )

                  BITNOT ( <bit value expr 1> )

                  BITOR

                  BITOR ( <num value expr 1>, <num value expr 2> )

                  BITOR ( <bit value expr 1>, <bit value expr 2> )

                  BITXOR

                  BITXOR ( <num value expr 1>, <num value expr 2> )

                  BITXOR ( <bit value expr 1>, <bit value expr 2> )

                  These functions bit operations on two values, or in the case of BITNOT on a single values. The values are either integer values, or bit strings. The result is an integer value of the same type as the arguments, or a bit string of the same length as the argument. Each bit of the result is formed by performing the operation on corresponding bits of the arguments. The names of the function indicate NOT, OR, AND, XOR operations. The BITANDNOT performs NOT on the second argument, then performs AND on result and the first argument. (HyperSQL)

                  COS

                  COS ( <num value expr> )

                  Returns the cosine of the argument (an angle expressed in radians) as a value of DOUBLE type. (JDBC)

                  COT

                  COT ( <num value expr> )

                  Returns the cotangent of the argument as a value of DOUBLE type. The <num value expr> represents an angle expressed in radians. (JDBC)

                  DEGREES

                  DEGREES ( <num value expr> )

                  Converts the argument (an angle expressed in radians) into degrees and returns the value in the DOUBLE type. (JDBC)

                  EXP

                  EXP ( <num value expr> )

                  Returns the exponential value of the argument as a value of DOUBLE type. (JDBC and Foundation)

                  FLOOR

                  FLOOR ( <num value expr> )

                  Returns the largest integer that is less than or equal to the argument. If the argument is exact numeric then the result is exact numeric with a scale of 0. If the argument is approximate numeric, then the result is of DOUBLE type. (JDBC and Foundation)

                  LN

                  LN ( <num value expr> )

                  Returns the natural logarithm of the argument, as a value of DOUBLE type. (Foundation)

                  LOG

                  LOG ( <num value expr> )

                  Returns the natural logarithm of the argument, as a value of DOUBLE type. (JDBC)

                  LOG10

                  LOG10 ( <num value expr> )

                  Returns the base 10 logarithm of the argument as a value of DOUBLE type. (JDBC)

                  MOD ( <num value expr 1>, <num value expr 2> )

                  MOD

                  Returns the remainder (modulus) of <num value expr 1> divided by <num value expr 2>. The data type of the returned value is the same as the second argument. (JDBC and Foundation)

                  PI

                  PI ()

                  Returns the constant pi as a value of DOUBLE type. (JDBC)

                  POWER

                  POWER ( <num value expr 1>, <num value expr 2> )

                  Returns the value of <num value expr 1> raised to the power of <int value expr 2> as a value of DOUBLE type. (JDBC and Foundation)

                  RADIANS

                  RADIANS ( <num value expr> )

                  Converts the argument (an angle expressed in degrees) into radians and returns the value in the DOUBLE type. (JDBC)

                  RAND

                  RAND ( [ <int value expr> ] )

                  Returns a random value in the DOUBLE type. The optional [ <int value expr> ] is used as seed value. In HyperSQL each session has a separate random number generator. The first call that uses a seed parameter sets the seed for subsequent calls that do not include a parameter. (JDBC)

                  ROUND

                  ROUND ( <num value expr>, <int value expr> )

                  The <num value expr> is of the DOUBLE type or DECIMAL type. The function returns a DOUBLE or DECIMAL value which is the value of the argument rounded to <int value expr> places right of the decimal point. If <int value expr> is negative, the first argument is rounded to <int value expr> places to the left of the decimal point.

                  This function rounds values ending with .5 or larger away from zero for DECIMAL arguments and results. When the value ends with .5 or larger and the argument and result are DOUBLE, It rounds the value towards the closest even value.

                  The datetime version is discussed in the next section. (JDBC)

                  SIGN

                  SIGN ( <num value expr> )

                  Returns an INTEGER, indicating the sign of the argument. If the argument is negative then -1 is returned. If it is equal to zero then 0 is returned. If the argument is positive then 1 is returned. (JDBC)

                  SIN

                  SIN ( <num value expr> )

                  Returns the sine of the argument (an angle expressed in radians) as a value of DOUBLE type. (JDBC)

                  SQRT

                  SQRT ( <num value expr> )

                  Returns the square root of the argument as a value of DOUBLE type. (JDBC and Foundation)

                  TAN

                  TAN ( <num value expr> )

                  Returns the tangent of the argument (an angle expressed in radians) as a value of DOUBLE type. (JDBC)

                  TO_NUMBER

                  TO_NUMBER ( <char value expr> )

                  Performs a cast from character to DECIMAL number. The character string must consist of digits and can have a decimal point. Use the SQL Standard CAST expression instead of this non-standard function. (HyperSQL)

                  TRUNC

                  TRUNC ( <num value expr> [, <int value expr>] )

                  This is a similar to the TRUNCATE function when the first argument is numeric. If the second argument is omitted, zero is used in its place.

                  The datetime version is discussed in the next section. (HyperSQL)

                  TRUNCATE

                  TRUNCATE ( <num value expr> [, <int value expr>] )

                  Returns a value in the same type as <num value expr> but may reduce the scale of DECIMAL and NUMERIC values. The value is rounded by replacing digits with zeros from <int value expr> places right of the decimal point to the end. If <int value expr> is negative, ABS( <int value expr> ) digits to left of the decimal point and all digits to the right of the decimal points are replaced with zeros. Results of calling TRUNCATE with 12345.6789 with (-2, 0, 2, 4) are (12300, 12345, 12345.67, 12345.6789). The function does not change the number if the second argument is larger than or equal to the scale of the first argument.

                  If the second argument is not a constant (when it is a parameter or column reference) then the type of the return value is always the same as the type of the first argument. In this case, the discarded digits are replaced with zeros. (JDBC)

                  WIDTH_BUCKET

                  WIDTH_BUCKET ( <value expr 1> , <value expr 2>, <value expr 3>, <int value expr> )

                  Returns an integer value between 0 and <int value expr> + 1. The initial three parameters are of the same numeric or datetime type. The range, ( <value expr 2> , <value expr 3> ) is divided into <int value expr> equal sections (buckets). The returned integer value indicates the index of the bucket where <value expr 1> can be placed. If the <value expr 1> falls before or after the range, the return value is 0 or <value expr 1> + 1 respectively.

                  This function can be used with numeric or datetime values. Invalid arguments, including <int value expr> smaller than 1, or equal values for <value expr 2> and <value expr 3> will cause an exception. (Foundation)

                  An example is given below:

                  WIDTH_BUCKET( 5, 10, 110, 10)
                  0
                  
                  WIDTH_BUCKET( 23, 10, 110, 10)
                  2
                  
                  WIDTH_BUCKET( 100, 10, 110, 10)
                  10
                  
                  WIDTH_BUCKET( 200, 10, 110, 10)
                  11
                  

                  Date Time and Interval Functions

                  Functions to report the time zone.

                  Functions to Report the Time Zone.

                  TIMEZONE

                  TIMEZONE()

                  Returns the current time zone for the session. Returns an INTERVAL HOUR TO MINUTE value. (HyperSQL)

                  SESSION_TIMEZONE

                  SESSION_TIMEZONE()

                  Returns the default time zone for the current session. Returns an INTERVAL HOUR TO MINUTE value. (HyperSQL)

                  DATABASE_TIMEZONE

                  DATABASE_TIMEZONE()

                  Returns the time zone for the database engine. This is based on where the database server process is located. Returns an INTERVAL HOUR TO MINUTE value. (HyperSQL)

                  Functions to Report the Current Datetime

                  CURRENT_DATE

                  CURRENT_DATE

                  CURRENT_TIME

                  CURRENT_TIME [ ( <time precision> ) ]

                  LOCALTIME

                  LOCALTIME [ ( <time precision> ) ]

                  CURRENT_TIMESTAMP

                  CURRENT_TIMESTAMP [ ( <timestamp precision> ) ]

                  LOCALTIMESTAMP

                  LOCALTIMESTAMP [ ( <timestamp precision> ) ]

                  These datetime functions return the datetime value representing the moment the function is called. CURRENT_DATE returns a value of DATE type. CURRENT_TIME returns a value of TIME WITH TIME ZONE type. LOCALTIME returns a value of TIME type. CURRENT_TIMESTAMP returns a value of TIMESTAMP WITH TIME ZONE type. LOCALTIMESTAMP returns a value of TIMESTAMP type. If the optional [ ( <time precision> ) ] or [ ( <timestamp precision> ) ] is used, then the returned value has the specified fraction of the second precision. (Foundation)

                  NOW

                  NOW ()

                  This function is equivalent to LOCALTIMESTAMP. It can be used as a no-arg function as the parens are optional. (HyperSQL)

                  CURDATE

                  CURDATE ()

                  This function is equivalent to CURRENT_DATE. (JDBC)

                  CURTIME

                  CURTIME ()

                  This function is equivalent to LOCALTIME. (JDBC)

                  SYSDATE

                  SYSDATE

                  This function is equivalent to LOCALTIMESTAMP. (HyperSQL)

                  SYSTIMESTAMP

                  SYSTIMESTAMP

                  This no-arg function is equivalent to CURRENT_TIMESTAMP and is enabled in ORA syntax mode only. (HyperSQL)

                  TODAY

                  TODAY

                  This no-arg function is equivalent to CURRENT_DATE. (HyperSQL)

                  Functions to Extract an Element of a Datetime

                  DAYNAME

                  DAYNAME ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( DAY_NAME FROM ... ) Returns a string in the range of Sunday - Saturday. (JDBC)

                  DAYOFMONTH

                  DAYOFMONTH ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( DAY_OF_MONTH FROM ... ) Returns an integer value in the range of 1-31. (JDBC)

                  DAYOFWEEK

                  DAYOFWEEK ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( DAY_OF_WEEK FROM ... ) Returns an integer value in the range of 1-7. The first day of the week is Sunday. (JDBC)

                  DAYOFYEAR

                  DAYOFYEAR ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( DAY_OF_YEAR FROM ... ) Returns an integer value in the range of 1-366. (JDBC)

                  DAYS

                  DAYS ( <datetime value expr> )

                  The <datetime value expr> is of DATE or TIMESTAMP type. This function returns the DAY number since the first day of the calendar. The first day is numbered 1. (HyperSQL)

                  HOUR

                  HOUR ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( HOUR FROM ... ) Returns an integer value in the range of 0-23. (JDBC)

                  MINUTE

                  MINUTE ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( MINUTE FROM ... ) Returns an integer value in the range of 0 - 59. (JDBC)

                  MONTH

                  MONTH ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( MONTH FROM ... ) Returns an integer value in the range of 1-12. (JDBC)

                  MONTHNAME

                  MONTHNAME ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( NAME_OF_MONTH FROM ... ) Returns a string in the range of January - December. (JDBC)

                  QUARTER

                  QUARTER ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( QUARTER FROM ... ) Returns an integer in the range of 1 - 4. (JDBC)

                  SECOND

                  SECOND ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( SECOND FROM ... ) Returns an integer or decimal in the range of 0 - 59, with the same precision as the <datetime value expr>. (JDBC)

                  SECONDS_SINCE_MIDNIGHT

                  SECONDS_SINCE_MIDNIGHT ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( SECONDS_SINCE_MIDNIGHT FROM ... ) Returns an integer in the range of 0 - 86399. (HyperSQL)

                  UNIX_TIMESTAMP

                  UNIX_TIMESTAMP ( [ <datetime value expression> ] )

                  This function returns a BIGINT value. With no parameter, it returns the number of seconds since 1970-01-01. With a DATE or TIMESTAMP parameter, it converts the argument into number of seconds since 1970-01-01. The TIMESTAMP ( <num value expression> function returns a TIMESTAMP from a Unix timestamp. (HyperSQL)

                  WEEK

                  WEEK ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( WEEK_OF_YEAR FROM ... ) Returns an integer in the range of 1 - 54. (JDBC)

                  YEAR

                  YEAR ( <datetime value expr> )

                  This function is equivalent to EXTRACT ( YEAR FROM ... ) Returns an integer in the range of 1 - 9999. (JDBC)

                  EXTRACT

                  EXTRACT ( <extract field> FROM <extract source> )

                  <extract field> ::= YEAR | MONTH | DAY | HOUR | MINUTE | DAY_OF_WEEK | WEEK_OF_YEAR | QUARTER | DAY_OF_YEAR | DAY_OF_MONTH |

                  TIMEZONE_HOUR | TIMEZONE_MINUTE | SECOND | SECONDS_SINCE_MIDNIGHT |

                  DAY_NAME | MONTH_NAME

                  <extract source> ::= <datetime value expr> | <interval value expr>

                  The EXTRACT function returns a field or element of the <extract source>. The <extract source> is a datetime or interval expression. The type of the return value is BIGINT for most of the <extract field> options. The exceptions is SECOND where a DECIMAL value is returned which has the same precision as the datetime or interval expression. The field values DAY_NAME or MONTH_NAME result in a character string. When MONTH_NAME is specified, a string in the range January - December is returned. When DAY_NAME is specified, a string in the range Sunday -Saturday is returned.

                  If the <extract source> is FROM <datetime value expr>, different groups of <extract source> can be used depending on the data type of the expression. The TIMEZONE_HOUR | TIMEZONE_MINUTE options are valid only for TIME WITH TIMEZONE and TIMESTAMP WITH TIMEZONE data types. The HOUR | MINUTE | SECOND | SECONDS_MIDNIGHT options, are valid for TIME and TIMESTAMP types. The rest of the fields are valid for DATE and TIMESTAMP types.

                  If the <extract source> is FROM <interval value expr>, the <extract field> must be one of the fields of the INTERVAL type of the expressions. The YEAR | MONTH options may be valid for INTERVAL types based on months. The DAY | HOUR | MINUTE | SECOND | SECONDS_MIDNIGHT options may be valid for INTERVAL types based on seconds. For example, DAY | HOUR | MINUTE are the only valid fields for the INTERVAL DAY TO MINUTE data type. (Foundation with HyperSQL extensions)

                  Functions for Datetime Arithmetic

                  TIMESTAMPADD

                  TIMESTAMPADD ( <tsi datetime field>, <numeric value expression>, <datetime value expr>)

                  TIMESTAMPDIFF

                  TIMESTAMPDIFF ( <tsi datetime field>, <datetime value expr 1>, <datetime value expr 2>)

                  <tsi datetime field> ::= SQL_TSI_FRAC_SECOND | SQL_TSI_SECOND | SQL_TSI_MINUTE | SQL_TSI_HOUR | SQL_TSI_DAY | SQL_TSI_WEEK | SQL_TSI_MONTH | SQL_TSI_QUARTER | SQL_TSI_YEAR

                  HyperSQL supports full SQL Standard datetime features. It supports adding integers representing units of time directly to datetime values using the arithmetic plus operator. It also supports subtracting one <datetime value expr> from another in the given units of date or time using the minus operator. An example of <datetime value expr> + <numeric value expression> <datetime field> is LOCALTIMESTAMP + 5 DAY. An example of ( <datetime value expr> - <numeric value expression> ) <datetime field> is (CURRENT_DATE - DATE '2008-08-8') MONTH which returns the number of calendar months between the two dates.

                  The two JDBC functions, TIMESTAMPADD and TIMESTAMPDIFF perform the same function as above SQL expressions. The field names are keywords and are different from those used in the EXTRACT functions. These names are valid for use only when calling these two functions. The return value for TIMESTAMPADD is of the same type as the datetime argument used. The return type for TIMESTAMPDIFF is always BIGINT, regardless of the type of arguments. The two datetime arguments of TIMESTAMPDIFF should be of the same type.

                  TIMESTAMPDIFF is evaluated as <datetime value expr 2> - <datetime value expr 1>. (JDBC)

                  TIMESTAMPADD ( SQL_TSI_MONTH, 3, DATE '2008-11-22' )
                  
                  TIMESTAMPDIFF ( SQL_TSI_HOUR, TIMESTAMP '2008-11-20 20:30:40', TIMESTAMP '2008-11-21 21:30:40' )
                  

                  DATE_ADD

                  DATE_ADD ( <datetime value expr> , <interval value expr> )

                  DATE_SUB

                  DATE_SUB ( <datetime value expr> , <interval value expr> )

                  These functions are equivalent to arithmetic addition and subtraction, <datetime value expr> + <interval value expr> and <datetime value expr> - <interval value expr>. The functions are provided for compatibility with other databases. The supported interval units are the standard SQL interval unit listed in other chapters of this guide. (HyperSQL)

                  DATE_ADD ( DATE '2008-11-22', INTERVAL 3 MONTH )
                  
                  DATE_SUB ( TIMESTAMP '2008-11-22 20:30:40', INTERVAL 20 HOUR )
                  

                  DATEADD

                  DATEADD ( <field>, <numeric value expr>, <datetime value expr> )

                  DATEDIFF

                  DATEDIFF ( <field>, <datetime value expr 1>, <datetime value expr 2> )

                  <field> ::= 'yy' | 'year' | 'mm' | 'month' | 'dd' | 'day' | 'hh' | 'hour' | 'mi' | 'minute' | 'ss' | 'second' | 'ms' | 'millisecond'

                  The DATEADD and DATEDIFF functions are alternatives to TIMESTAMPADD and TIMESTAMPDIFF, with fewer available field options. The field names are specified as strings, rather than keywords. The fields translate to YEAR, MONTH, DAY, HOUR, MINUTE, SECOND and MILLISECOND. DATEDIFF is evaluated as <datetime value expr 2> - <datetime value expr 1>. (HyperSQL}

                  DATEDIFF ( <datetime value expr 1>, <datetime value expr 2> )

                  This special form of DATEDIFF does not have a field parameter and return the number of days between two dates. This form is evaluated as <datetime value expr 1> - <datetime value expr 2>, which is different from the main form. This form is compatible with some other database engines. (HyperSQL}

                  DATEADD ( 'month', 3, DATE '2008-11-22' )
                  
                  DATEDIFF ( 'hour', TIMESTAMP '2008-11-22 20:30:40', TIMESTAMP '2008-11-22 00:30:40' )
                  

                  ROUND

                  ROUND ( <datetime value expr> [ , <char value expr> ] )

                  The <datetime value expr> is of DATE, TIME or TIMESTAMP type. The <char value expr> is a format string for YEAR, MONTH, WEEK OF YEAR, DAY, HOUR, MINUTE or SECOND as listed in the table for TO_CHAR and TO_DATE format elements (see below). The datetime value is rounded up or down after the specified field and the rest of the fields to the right are set to one for MONTH and DAY, or zero, for the rest of the fields. For example rounding a timestamp value on the DAY field results in midnight the same date or midnight the next day if the time is at or after 12 noon. If the second argument is omitted, the datetime value is rounded to the nearest day. (HyperSQL)

                  TRUNC

                  TRUNC ( <datetime value expr> [ , <char value expr> ] )

                  Similar to the ROUND function, the <num value expr> is of DATE, TIME or TIMESTAMP type. The <char value expr> is a format string (such as 'YY' or 'MM') for YEAR, MONTH, WEEK OF YEAR, DAY, HOUR, MINUTE or SECOND as listed in the table for TO_CHAR and TO_DATE format elements (see below). The datetime value is truncated after the specified field and the rest of the fields to the right are set to one for MONTH and DAY, or zero, for the rest of the fields. For example applying TRUNC to a timestamp value on the DAY field results in midnight the same date. Examples of ROUND and TRUNC functions are given below. If the second argument is omitted, the datetime value is truncated to midnight the same date. (HyperSQL)

                  ROUND ( TIMESTAMP'2008-08-01 20:30:40', 'YYYY' )
                  
                  '2009-01-01 00:00:00'
                  
                  TRUNC ( TIMESTAMP'2008-08-01 20:30:40', 'YYYY' )
                  
                  '2008-01-01 00:00:00'
                  

                  Functions to Convert or Format a Datetime

                  TIMESTAMP

                  TIMESTAMP ( <num value expr> )

                  TIMESTAMP ( <char value expr> )

                  TIMESTAMP ( <char value expr>, <char value expr> )

                  TIMESTAMP ( <date value expr>, <time value expr> )

                  This function translates the arguments into a TIMESTAMP value. When the single argument is a numeric value, it is interpreted as a Unix timestamp in seconds. A single formatted date or timestamp string is translated to a TIMESTAMP.

                  When two arguments are used, the first argument is the date part and the second argument is the time part of the returned TIMESTAMP value. An example, including the result, is given below:

                  TIMESTAMP ( '2008-11-22', '20:30:40' )
                  
                  TIMESTAMP '2008-11-22 20:30:40.000000'
                  

                  TO_CHAR

                  TO_CHAR ( <datetime value expr>, <char value expr> )

                  This function formats a datetime or numeric value to the format given in the second argument. The format string can contain pattern elements from the list given below, plus punctuation and space characters. An example, including the result, is given below:

                  TO_CHAR ( TIMESTAMP'2008-02-01 20:30:40', 'YYYY BC MONTH, DAY HH' )
                  
                  2008 AD February, Friday 8
                  
                  TO_CHAR ( TIMESTAMP'2008-02-01 20:30:40', '"The Date is" YYYY BC MONTH, DAY HH' )
                  
                  The Date is 2008 AD February, Friday 8
                  

                  The format is internally translated to a java.text.SimpleDateFormat format string. Separator characters (space, comma, period, hyphen, colon, semicolon, forward slash) can be included between the pattern elements. Unsupported format strings should not be used. You can include a string literal inside the format string by enclosing it in double quotes (see the second example above). (HyperSQL)

                  TO_DATE

                  TO_DATE ( <char value expr>, <char value expr> )

                  This function translates a formatted datetime sting to a TIMESTAMP(0) according to the format given in the second argument. See TO_TIMESTAMP below for further details.

                  TO_TIMESTAMP

                  TO_TIMESTAMP ( <char value expr>, <char value expr> )

                  This function translates a formatted datetime sting to a TIMESTAMP(6) according to the format given in the second argument. The format string can contain pattern elements from the list given below, plus punctuation and space characters. The pattern should contain all the necessary fields to construct a date, including, year, month, day of month, etc. The returned timestamp can then be cast into DATE or TIME types if necessary. An example, including the result, is given below:

                  TO_TIMESTAMP ( '22/11/2008 20:30:40', 'DD/MM/YYYY HH:MI:SS' )
                  
                  TIMESTAMP '2008-11-22 20:30:40.000000'
                  

                  The format strings that can be used for TO_DATE and TO_TIMESTAMP are more restrictive than those used for TO_CHAR, because the format string must contain the elements needed to build a full DATE or TIMESTAMP value. For example, you cannot use the 'WW', 'W', 'HH' or 'HH12' format elements with TO_DATE or TO_TIMESTAMP

                  The format is internally translated to a java.text.SimpleDateFormat format string. Unsupported format strings should not be used. With TO_CHAR, you can include a string literal inside the format string by enclosing it in double quotes. (HyperSQL)

                  The supported format components are all uppercase as follows:

                  Table 10.1. TO_CHAR, TO_DATE and TO_TIMESTAMP format elements

                  BC | B.C. | AD | A.D.Returns AD for common era and BC for before common era
                  RRRR

                  4-digit year

                  YYYY

                  4-digit year

                  IYYY

                  4-digit year, corresponding to ISO week of the year. The reported year for the last few days of the calendar year may be the next year.

                  YY

                  2 digit year

                  IY

                  2 digit year, corresponding to ISO week of the year

                  MM

                  Month (01-12)

                  MON

                  Short three-letter name of month

                  MONTH

                  Name of month

                  WW

                  Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year (not a calendar week).

                  W

                  Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh (not a calendar week).

                  IW

                  Week of year (1-52 or 1-53) based on the ISO standard. Week starts on Monday. The first week may start near the end of previous year.

                  DAY

                  Name of day.

                  DD

                  Day of month (01-31).

                  DDD

                  Day of year (1-366).

                  DY

                  Short three-letter name of day.

                  HH

                  Hour of day (00-11).

                  HH12

                  Hour of day (00-11).

                  HH24

                  Hour of day (00-23).

                  MI

                  Minute (00-59).

                  SS

                  Second (00-59).

                  FF

                  Fractional seconds.


                  Array Functions

                  Array functions are specialised functions with ARRAY parameters or return values. For the ARRAY_AGG aggregate function, see the Data Access and Change chapter.

                  CARDINALITY

                  CARDINALITY( <array value expr> )

                  Returns the element count for the given array argument. (Foundation)

                  MAX_CARDINALITY

                  MAX_CARDINALITY( <array value expr> )

                  Returns the maximum allowed element count for the given array argument. (Foundation)

                  POSITION_ARRAY

                  POSITION_ARRAY( <value expression> IN <array value expr> [ FROM <int value expr> ] )

                  Returns the position of the first match for the <value expression> in the array. By default the search starts from the beginning of the array. The optional <int value expr> specifies the start position. Positions are counted from 1. Returns zero if no match is found. (HyperSQL)

                  SORT_ARRAY

                  SORT_ARRAY( <array value expr> [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ] )

                  Returns a sorted copy of the array. By default, sort is performed in ascending order and NULL elements are sorted first. (HyperSQL)

                  TRIM_ARRAY

                  TRIM_ARRAY( <array value expr>, <num value expr> )

                  Returns a new array that contains the elements of the <array value expr> minus the number of elements specified by the <num value expr>. Elements are discarded from the end of the array. (Foundation)

                  SEQUENCE_ARRAY

                  SEQUENCE_ARRAY( <value expr 1>, <value expr 2>, <value expr 3 )

                  Returns a new array that contains a sequence of values. The <value expr 1> is the lower bound of the range. The <value expr 2> is the upper bound of the range. The <value expr 3> is the increment. The elments of the array are within the inclusive range. The first element is <value expr 1> and each subsequent element is the sum of the previous element and the increment. If the increment is zero, only the first element is returned. When the increment is negative, the lower bound should be larger than the upper bound. The type of the arguments can be all number types, or a datetime range and an interval for the third argument (HyperSQL)

                  In the examples below, a number sequence and a date sequence are shown. The UNNEST table expression is used to form a table from the array.

                  SEQUENCE_ARRAY(0, 100, 5)
                  
                  ARRAY[0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100] 
                  
                  SELECT * FROM UNNEST(SEQUENCE_ARRAY(10, 12, 1))
                  
                  C1 
                  -- 
                  10 
                  11 
                  12 
                  
                  SELECT * FROM UNNEST(SEQUENCE_ARRAY(CURRENT_DATE, CURRENT_DATE + 6 DAY, 1 DAY)) WITH ORDINALITY AS T(D, I) 
                  
                  D          I 
                  ---------- - 
                  2010-08-01 1 
                  2010-08-02 2 
                  2010-08-03 3 
                  2010-08-04 4 
                  2010-08-05 5 
                  2010-08-06 6 
                  2010-08-07 7
                  
                  

                  General Functions

                  General functions can take different types of arguments. Some General Functions accept a variable number of arguments.

                  Also see the Data Access and Change chapter for SQL expressions that are similar to functions, for example CAST and NULLIF.

                  CASEWHEN

                  CASEWHEN( <boolean value expr>, <value expr 2>, <value expr 3> )

                  If the <boolean value expr> is true, returns <value expr 2> otherwise returns <value expr 3>. Use a CASE WHEN expression instead for more extensive capabilities and options. CASE WHEN is documented in the Data Access and Change chapter. (HyperSQL)

                  COALESCE

                  COALESCE( <value expr 1>, <value expr 2> [, ...] )

                  Returns <value expr 1> if it is not null, otherwise returns <value expr 2> if not null and so on. The type of both arguments must be comparable. (Foundation)

                  CONVERT

                  CONVERT ( <value expr> , <data type> )

                  <data type> ::= { SQL_BIGINT | SQL_BINARY | SQL_BIT |SQL_BLOB | SQL_BOOLEAN | SQL_CHAR | SQL_CLOB | SQL_DATE | SQL_DECIMAL | SQL_DATALINK |SQL_DOUBLE | SQL_FLOAT | SQL_INTEGER | SQL_LONGVARBINARY | SQL_LONGNVARCHAR | SQL_LONGVARCHAR | SQL_NCHAR | SQL_NCLOB | SQL_NUMERIC | SQL_NVARCHAR | SQL_REAL | SQL_ROWID | SQL_SQLXML | SQL_SMALLINT | SQL_TIME | SQL_TIMESTAMP | SQL_TINYINT | SQL_VARBINARY | SQL_VARCHAR} [ ( <precision, length or scale parameters> ) ]

                  The CONVERT function is a JDBC escape function, equivalent to the SQL standard CAST expression. It converts the <value expr> into the given <data type> and returns the value. The <data type> options are synthetic names made by prefixing type names with SQL_. Some of the <data type> options represent valid SQL types, but some are based on non-standard type names, namely { SQL_LONGNVARCHAR | SQL_LONGVARBINARY |SQL_LONGVARCHAR | SQL_TINYINT }. None of the synthetic names can be used in any other context than the CONVERT function.

                  The definition of CONVERT in the JDBC Standard does not allow the precision, scale or length to be specified. This is required by the SQL standard for BINARY, BIT, BLOB, CHAR, CLOB, VARBINARY and VARCHAR types and is often needed for DECIMAL and NUMERIC. Defaults are used for precision.

                  HyperSQL also allows the use of real type names (without the SQL_ prefix). In this usage, HyperSQL allows the use of precision, scale or length for the type definition when they are valid for the type definition.

                  When MS SQL Server compatibility mode is on, the parameters of CONVERT are switched and only the real type names with required precision, scale or length are allowed. (JDBC)

                  DECODE

                  DECODE( <value expr main>, <value expr match 1>, <value expr result 1> [...,] [, <value expr default>] )

                  DECODE takes at least 3 arguments. The <value expr main> is compared with <value expr match 1> and if it matches, <value expr result 1> is returned. If there are additional pairs of <value expr match n> and <value expr result n>, comparison is repeated until a match is found the result is returned. If no match is found, the <value expr default> is returned if it is specified, otherwise NULL is returned. The type of the return value is a combination of the types of the <value expr result ... > arguments. (HyperSQL)

                  GREATEST

                  GREATEST( <value expr 1>, [<value expr ...>, ...] )

                  The GREATEST function takes one or more arguments. It compares the arguments with each other and returns the greatest argument. The return type is the combined type of the arguments. Arguments can be of any type, so long as they are comparable. (HyperSQL)

                  IFNULL

                  ISNULL

                  IFNULL | ISNULL ( <value expr 1>, <value expr 2> )

                  Returns <value expr 1> if it is not null, otherwise returns <value expr 2>. The type of the return value is the type of <value expr 1>. Almost equivalent to SQL Standard COALESCE(<value expr 1>, <value expr 2>) function, but without type modification. (JDBC)

                  LEAST

                  LEAST( <value expr 1>, [<value expr ...>, ...] )

                  The LEAST function takes one or more arguments. It compares the arguments with each other and returns the smallest argument. The return type is the combined type of the arguments. Arguments can be of any type, so long as they are comparable. (HyperSQL)

                  LOAD_FILE

                  LOAD_FILE ( <char value expr 1> [, <char value expr 2>] )

                  Returns a BLOB or CLOB containing the URL or file path specified in the first argument. If used with a single argument, the function returns a BLOB. If used with two arguments, the function returns a CLOB and the second argument is the character encoding of the file. (HyperSQL)

                  NULLIF

                  NULLIF( <value expr 1>, <value expr 2> )

                  Returns <value expr 1> if it is not equal to <value expr 2>, otherwise returns null. The type of both arguments must be the same. This function is a shorthand for a specific CASE expression. (Foundation)

                  NVL

                  NVL( <value expr 1>, <value expr 2> )

                  Returns <value expr 1> if it is not null, otherwise returns <value expr 2>. The type of the return value is the type of <value expr 1>. For example, if <value expr 1> is an INTEGER column and <value expr 2> is a DOUBLE constant, the return type is cast into INTEGER. This function is similar to IFNULL. (HyperSQL)

                  NVL2

                  NVL2( <value expr 1>, <value expr 2>, <value expr 3> )

                  If <value expr 1> is not null, returns <value expr 2>, otherwise returns <value expr 3>. The type of the return value is the type of <value expr 2> unless it is null. (HyperSQL)

                  UUID

                  UUID ( [ { <char value expr> | <binary value expr> ] } )

                  With no parameter, this function returns a new UUID value as a 16 byte binary value. With a UUID hexadecimal string argument, it returns the 16 byte binary value of the UUID. With a 16 byte binary argument, it returns the formatted UUID character representation. (HyperSQL)

                  System Functions

                  CRYPT_KEY

                  CRYPT_KEY( <value expr 1>, <value expr 2> )

                  Returns a binary string representation of a cryptography key for the given cipher and cryptography provider. The cipher specification is specified by <value expr 1> and the provider by <value expr 2>. To use the default provider, specify null for <value expr 2>. (HyperSQL)

                  DIAGNOSTICS

                  DIAGNOSTICS ( ROW_COUNT )

                  This is a convenience function for use instead of the GET DIAGNOSTICS ... statement. The argument specifies the name of the diagnostics variable. Currently the only supported variable is the ROW_COUNT variable. The function returns the row count returned by the last executed statement. The return value is 0 after most statements. Calling this function immediately after executing an INSERT, UPDATE, DELETE or MERGE statement returns the row count for the last statement, as it is returned by the JDBC statement. (HyperSQL)

                  IDENTITY

                  IDENTITY ()

                  Returns the last IDENTITY value inserted into a row by the current session. The statement, CALL IDENTITY() can be made after an INSERT statement that inserts a row into a table with an IDENTITY column. The CALL IDENTITY() statement returns the last IDENTITY value that was inserted into a table by the current session. Each session manages this function call separately and is not affected by inserts in other sessions. The statement can be executed as a direct statement or a prepared statement. (HyperSQL)

                  DATABASE

                  DATABASE ()

                  Returns the file name (without directory information) of the database. (JDBC)

                  DATABASE_NAME

                  DATABASE_NAME ()

                  Returns the database name. This name is a 16 character, uppercase string. It is generated as a string based on the timestamp of the creation of the database, for example HSQLDB32438AEAFB. The name can be redefined by an admin user but the new name must be all uppercase and 16 characters long. This name is used in log messages with external logging frameworks. (HyperSQL)

                  DATABASE_VERSION

                  DATABASE_VERSION ()

                  Returns the full version string for the database engine. For example, 2.0.1. (JDBC)

                  USER

                  USER ()

                  Equivalent to the SQL function CURRENT_USER. (JDBC)

                  CURRENT_USER

                  CURRENT_USER

                  CURRENT_ROLE

                  CURRENT_ROLE

                  SESSION_USER

                  SESSION_USER

                  SYSTEM_USER

                  SYSTEM_USER

                  CURRENT_SCHEMA

                  CURRENT_SCHEMA

                  CURRENT_CATALOG

                  CURRENT_CATALOG

                  These functions return the named current session attribute. They are all SQL Standard functions.

                  The CURRENT_USER is the user that connected to the database, or a user subsequently set by the SET AUTHORIZATION statement.

                  SESSION_USER is the same as CURRENT_USER

                  SYSTEM_USER is the user that connected to the database. It is not changed with any command until the session is closed.

                  CURRENT_SCHEMA is default schema of the user, or a schema subsequently set by the SET SCHEMA command.

                  CURRENT_CATALOG is always the same within a given HyperSQL database and indicates the name of the catalog.

                  IS_AUTOCOMMIT

                  IS_AUTOCOMMIT()

                  Returns TRUE if the session is in autocommit mode. (HyperSQL)

                  IS_READONLY_SESSION

                  IS_READONLY_SESSION()

                  Returns TRUE if the session is in read only mode. (HyperSQL)

                  IS_READONLY_DATABASE

                  IS_READONLY_DATABASE()

                  Returns TRUE if the database is a read only database. (HyperSQL)

                  IS_READONLY_DATABASE_FILES

                  IS_READONLY_DATABASE_FILES()

                  Returns TRUE if the database is a read-only files database. In this kind of database, it is possible to modify the data, but the changes are not persisted to the database files. (HyperSQL)

                  ISOLATION_LEVEL

                  ISOLATION_LEVEL()

                  Returns the current transaction isolation level for the session. Returns either READ COMMITTED or SERIALIZABLE as a string. (HyperSQL)

                  SESSION_ID

                  SESSION_ID()

                  Returns the id of the session as a BIGINT value. Each session id is unique during the operational lifetime of the database. Id's are restarted after a shutdown and restart. (HyperSQL)

                  SESSION_ISOLATION_LEVEL

                  SESSION_ISOLATION_LEVEL()

                  Returns the default transaction isolation level for the current session. Returns either READ COMMITTED or SERIALIZABLE as a string. (HyperSQL)

                  DATABASE_ISOLATION_LEVEL

                  DATABASE_ISOLATION_LEVEL()

                  Returns the default transaction isolation level for the database. Returns either READ COMMITTED or SERIALIZABLE as a string. (HyperSQL)

                  TRANSACTION_SIZE

                  TRANSACTION_SIZE()

                  Returns the row change count for the current transaction. Each row change represents a row INSERT or a row DELETE operation. There will be a pair of row change operations for each row that is updated.

                  TRANSACTION_ID

                  TRANSACTION_ID()

                  Returns the current transaction ID for the session as a BIGINT value. The database maintains a global incremental id which is allocated to new transactions and new actions (statement executions) in different sessions. This value is unique to the current transaction. (HyperSQL)

                  ACTION_ID

                  ACTION_ID()

                  Returns the current action ID for the session as a BIGINT value. The database maintains a global incremental id which is allocated to new transactions and new actions (statement executions) in different sessions. This value is unique to the current action. (HyperSQL)

                  TRANSACTION_CONTROL

                  TRANSACTION_CONTROL()

                  Returns the current transaction model for the database. Returns LOCKS, MVLOCKS or MVCC as a string. (HyperSQL)

                  LOB_ID

                  LOB_ID( <column reference> )

                  Returns internal ID of a lob as a BIGINT value. Lob ID's are unique and never reused. The <column reference> is the name of the column (or variable, or argument) which is a CLOB or BLOB. Returns null if the value is null. (HyperSQL)

                  ROWNUM

                  ROWNUM()

                  ROW_NUMBER

                  ROW_NUMBER() OVER()

                  Returns the current row number (from 1) being processed in a select statement. This has the same semantics as the ROWNUM pseudo-column in Oracle syntax mode, but can be used in any syntax mode. The function is used in a SELECT of DELETE statement. The ROWNUM of a row is incremented as the rows are added to the result set. It is therefore possible to use a condition such as WHERE ROWNUM() < 10, but not ROWNUM() > 10 or ROWNUM = 10. The ROW_NUMBER() OVER() alternative performs the same function and is included for compatibility with other database engines.(HyperSQL)

                  Chapter 11. System Management

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5039 $

                  Copyright 2002-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  Mode of Operation and Tables

                  HyperSQL has many modes of operation and features that allow it to be used in very different scenarios. Levels of memory usage, speed and accessibility by different applications are influenced by how HyperSQL is deployed.

                  Mode of Operation

                  The decision to run HyperSQL as a separate server process or as an in-process database should be based on the following:

                  • When HyperSQL is run as a server on a separate machine, it is isolated from hardware failures and crashes on the hosts running the application.

                  • When HyperSQL is run as a server on the same machine, it is isolated from application crashes and memory leaks.

                  • Server connections are slower than in-process connections due to the overhead of streaming the data for each JDBC call.

                  • You can reduce client/server traffic using SQL Stored procedures to reduce the number of JDBC execute calls.

                  • During development, it is better to use a Server with server.silent=false, which displays the statements sent to the server on the console window.

                  • To improve speed of execution for statements that are executed repeatedly, reuse a parameterized PreparedStatement for the lifetime of the connections.

                  Tables

                  TEXT tables are designed for special applications where the data has to be in an interchangeable format, such as CSV (comma separated values). TEXT tables should not be used for routine storage of data.

                  MEMORY tables and CACHED tables are generally used for data storage. The difference between the two is as follows:

                  • The data for all MEMORY tables is read from the *.script file when the database is started and stored in memory. In contrast the data for cached tables is not read into memory until the table is accessed. Furthermore, only part of the data for each CACHED table is held in memory, allowing tables with more data than can be held in memory.

                  • When the database is shutdown in the normal way, all the data for MEMORY tables is written out to the disk. In comparison, the data in CACHED tables that has changed is written out during operation and at shutdown.

                  • The size and capacity of the data cache for all the CACHED tables is configurable. This makes it possible to allow all the data in CACHED tables to be cached in memory. In this case, speed of access is good, but slightly slower than MEMORY tables.

                  • For normal applications it is recommended that MEMORY tables are used for small amounts of data, leaving CACHED tables for large data sets. For special applications in which speed is paramount and a large amount of free memory is available, MEMORY tables can be used for large tables as well.

                  • You can change the type of the table with the SET TABLE <table name> TYPE { CACHED | MEMORY }statement.

                  Large Objects

                  HyperSQL 2.0 supports dedicated storage and access to BLOB and CLOB objects. These objects can have huge sizes. BLOB or CLOB is specified as the type of a column of the table. Afterwards, rows can be inserted into the table using a PreparedStatement for efficient transfer of large LOB data to the database. In mem: catalogs, CLOB and BLOB data is stored in memory. In file: catalogs, this data is stored in a single separate file which has the extension *.lobs. The size of this file can grow to huge, terabyte figures. By default, a minimum 32 KB is allocated to each LOB. You can reduced this if your LOBs are generally smaller.

                  LOB data should be store in the database using a JDBC PreparedStatement object. The streaming methods send the LOB to the database in one operation as a binary or character stream. Inside the database, the disk space is allocated as needed and the data is saved as it is being received. LOB data should be retrieved from the database using a JDBC ResultSet method. When a streaming method is used to retrieve a LOB, it is retrieved in large chunks in a transparent manner. LOB data can also be retrieved as String or byte[], but these methods use more memory and may not be practical for large objects.

                  LOB data is not duplicated in the database when a lob is copied from one table to another. The disk space is reused when a LOB is deleted and is no longer contained in any table. This happens only at the time of a CHECKPOINT.

                  By using a dedicated LOB store, HyperSQL achieves consistently high speeds (usually over 20MB / s) for both storage and retrieval of LOBs.

                  There is an internal LOBS schema in the database to store the id's, sizes and addresses of the LOBs (but not the actual LOBS) in a few system tables. This schema is stored in the database as MEMORY tables. Therefore the amount of JVM memory should be increased when more than tens of thousands of LOBs are stored in the database. If your database contains more than a few hundreds of thousands of LOBs and memory use becomes an issue, you can change one or all LOB schema tables to CACHED tables. See statements below:

                  Example 11.1. Using CACHED tables for the LOB schema

                    SET TABLE SYSTEM_LOBS.BLOCKS TYPE CACHED
                    SET TABLE SYSTEM_LOBS.LOBS TYPE CACHED
                    SET TABLE SYSTEM_LOBS.LOB_IDS TYPE CACHED
                  

                  Deployment context

                  The files used for storing HyperSQL database data are all in the same directory. New files are always created and deleted by the database engine. Two simple principles must be observed:

                  • The Java process running HyperSQL must have full privileges on the directory where the files are stored. This include create and delete privileges.

                  • The file system must have enough spare room both for the 'permanent' and 'temporary' files. The default maximum size of the *.log file is 50MB. The *.data file can grow to up to 16GB (more if the default has been increased). The .backup file can be up to the size of the *.data file. The *.lobs file can grow to several terabytes. The temporary files created at the time of a SHUTDOWN can be equal in size to the *.script file and the .data file.

                  Readonly Databases

                  A file: catalog can be made readonly permanently, or it can be opened as readonly. To make the database readonly, the property, value pair, readonly=true can be added to the .properties file of the database.

                  It is also possible to open a normal database as readonly. For this, the property can be included in the URL of the first connection to the database.

                  There is another option which allows MEMORY tables to be writeable, but without persisting the changes at SHUTDOWN. This option is activated with the property, value pair, files_readonly=true, which can be added to the .properties file of the database, or included in the URL of the first connection to the database. This option is useful for running application tests which operate on a predefined dataset.

                  ACID, Persistence and Reliability

                  HyperSQL 2.0 uses the same persistence mechanism as version 1.8, but with important enhancements. The code has proven reliable, as the last critical issue was fixed 2 years before the release of version 2.0.

                  There are further enhancements in version 2.2

                  • More extensive locking mechanism has been added to code to support multithreaded access.

                  • Incremental backup (an internal mechanism for crash protection) allows fast checkpoint and shutdown.

                  • All files are synced at checkpoints and also just before closing.

                  • The data file is enlarged in block increments

                  • The NIO file access implementation has been improved

                  Persistence relies on the JVM, the operating system, and the computer hardware. A database system like HSQLDB can perform millions of read and write operations in an hour. As system hardware and software can go wrong, it is impossible to achieve zero failure rate. Therefore regular backups are recommended. HyperSQL 2.2 has built-in database backup and restore features, discussed elsewhere in this chapter.

                  A note regarding the NIO file access implementation: This implementation applies only to CACHED table data in the .data file. Other files are not accessed via NIO. There has been an issue with some JVM implementations of nio not releasing the file buffers after they were closed. HyperSQL uses a workaround which is recommended for Sun JVM's. This does not apply to other JVM's. In such environments, it is therefore recommended to test the CHECKPOINT DEFRAG operation and the shutting down and restarting the database inside the same Java process extensively with NIO. Use of NIO can be turned off if necessary.

                  Atomicity, Consistency, Isolation, Durability

                  Atomicity means a transaction either fails without changing the data, or succeeds. HyperSQL ensures atomicity both during operations and in the event of a system crash.

                  Consistency means all the implicit and explicit integrity constraints are always enforced. HyperSQL always enforces the constraints and at the same time does not allow unenforceable constraints (illegal forms of CHECK constraints) to be created.

                  Isolation means transactions do not interfere with each other. HyperSQL enforces isolation according to strict rules of the database isolation model (MVCC or LOCKS).

                  Durability means a committed transaction is protected in case of a system crash. HyperSQL ensures durability according to the setting for WRITE DELAY MILLIS. A zero delay setting results in an FileDescriptor#sync() call each time a transaction commits. A timed delay means the FileDescriptor#sync() call is executed in the given intervals and only the last transactions committed in the interval may be lost. The sync() call is also made at all critical points, including when a file is about to be closed. Durability of files requires a reliable JVM and disk storage system that stores the data safely with a sync() call. In practice, many systems are generally reliable in this respect.

                  Backing Up Database Catalogs

                  The database engine saves the files containing all the data in a file catalog when a shutdown takes place. It automatically recovers from an abnormal termination and preserves the data when the catalog is opened next time. In an ideal operating environment, where there is no OS crash, disk failure, bugs in code, etc. there would be no need regularly to backup a database. This is meant to say, the engine performs the routine shutdown procedure internally, therefore backing up catalogs is an insurance policy against all sorts of misadventure that are not under the control of the database engine.

                  The data for each catalog consists of up to 5 files in the same directory with the endings such as *.properties, *.script, etc., as detailed in previous chapters.

                  HyperSQL 2.2 includes commands to backup the database files into a single .tar or .tar.gz file archive. The backup can be performed by a command given in a JDBC session if the target database catalog is running, or on the command-line if the target catalog has been shutdown.

                  Making Online Backups

                  To back up a running catalog, obtain a JDBC connection and issue a BACKUP DATABASE command in SQL. In its most simple form, the command format below will backup the database as a single .tar.gz file to the given directory.

                    BACKUP DATABASE TO <directory name> BLOCKING

                  The directory name must end with a slash to distinguish it as a directory, and the whole string must be in single quotes like so: 'subdir/nesteddir/'.

                  See the next section under Statements for details about the command and its options. See the sections below about restoring a backup.

                  Making Offline Backups

                  To back up an offline catalog, the catalog must be in shut down state. You will run a Java command like this. In this example, the database is named dbname and is in the dbdir directory. The backup is saved to a file named backup.tar in the tardir directory.

                  Example 11.2. Offline Backup Example

                    java -cp hsqldb.jar org.hsqldb.lib.tar.DbBackup --save tardir/backup.tar dbdir/dbname


                  where tardir/backup.tar is a file path to the *.tar or *.tar.gz file to be created in your file system, and dbdir/dbname is the file path to the catalog file base name (in same fashion as in server.database.* settings and JDBC URLs with catalog type file:.

                  Examining Backups

                  You can list the contents of backup tar files with DbBackup on your operating system command line, or with any Pax-compliant tar or pax client (this includes GNU tar),

                  Example 11.3. Listing a Backup with DbBackup

                    java -cp hsqldb.jar org.hsqldb.lib.tar.DbBackup --list tardir/backup.tar


                  You can also give regular expressions at the end of the command line if you are only interested in some of the file entries in the backup. Note that these are real regular expressions, not shell globbing patterns, so you would use .+script to match entries ending in "script", not *script.

                  You can examine the contents of the backup in their entirety by restoring the backup, as explained in the following section, to a temporary directory.

                  Restoring a Backup

                  You use DbBackup on your operating system command line to restore a catalog from a backup.

                  Example 11.4. Restoring a Backup with DbBackup

                    java -cp hsqldb.jar org.hsqldb.lib.tar.DbBackup --extract tardir/backup.tar dbdir


                  where tardir/backup.tar is a file path to the *.tar or *.tar.gz file to be read, and dbdir is the target directory to extract the catalog files into. Note that dbdir specifies a directory path, without the catalog file base name. The files will be created with the names stored in the tar file (and which you can see as described in the preceding section).

                  Encrypted Databases

                  HyperSQL supports encrypted databases. Encryption services use the Java Cryptography Extensions (JCE) and uses the ciphers installed with the JRE. HyperSQL itself does not contain any cryptography code.

                  Three elements are involved in specifying the encryption method and key. A cipher, together with its configuration is identified by a string which includes the name of the cipher and optional parameters. A provider is the fully qualified class name of the cipher provider. A key is represented as a hexadecimal string.

                  Creating and Accessing an Encrypted Database

                  First, a key must be created for the desired cipher and configuration. This is done by calling the function CRYPT_KEY(<cipher spec>, <provider>). If the default provider (the built-in JVM ciphers) is used, then NULL should be specified as the provider. The CRYPT_KEY function returns a hexadecimal key. The function call can be made in any HyperSQL database, so long as the provider class is on the classpath. This key can be used to create a new encrypted database. Calls to this function always return different keys, based on a generated random values.

                  As an example, a call to CRYPT_KEY('Blowfish', null) returned the string, '604a6105889da65326bf35790a923932'. To create a new database, the URL below is used:

                  jdbc:hsqldb:file:<database path>;crypt_key=604a6105889da65326bf35790a923932;crypt_type=blowfish

                  The third property name is crypt_provider. This is specified only when the provider is not the default provider.

                  HyperSQL works with any symmetric cipher that may be available from the JVM.

                  The files that are encrypted include the .script, .data, .backup and .log files. The .lobs file is not encrypted by default. The property crypt_lobs=true must be specified to encrypt the .lobs file.

                  Speed Considerations

                  General operations on an encrypted database are performed the same as with any database. However, some operations are significantly slower than with the equivalent cleartext database. With MEMORY tables, there is no difference to the speed of SELECT statements, but data change statements are slower. With CACHED tables, the speed of all statements is slower.

                  Security Considerations

                  Security considerations for encrypted databases have been discussed at length in HSQLDB discussion groups. Development team members have commented that encryption is not a panacea for all security needs. The following issues should be taken into account:

                  • Encrypted files are relatively safe in transport, but because databases contain many repeated values and words, especially known tokens such as CREATE, INSERT, etc., breaking the encryption of a database may be simpler than an unknown file.

                  • Only the files are encrypted, not the memory image. Poking into computer memory, while the database is open, will expose the contents of the database.

                  • HyperSQL is open source. Someone who has the key, can compile and use a modified version of the program that saves a full cleartext dump of an encrypted database

                  Therefore encryption is generally effective only when the users who have access to the crypt key are trusted.

                  Monitoring Database Operations

                  Database operations can be monitored at different levels using internal HyperSQL capabilities or add-ons.

                  External Statement Level Monitoring

                  Statement level monitoring allows you to gather statistics about executed statements. HyperSQL is supported by the monitoring tool JAMon (Java Application Monitor). JAMon is currently developed as the SourceForge project, jamonapi.

                  JAMon works at the JDBC level. It can monitor and gather statistics on different types of executed statements or other JDBC calls.

                  Early versions of JAMon were developed with HSQLDB and had to be integrated into HSQLDB at code level. The latest versions can be added on as a proxy in a much simpler fashion.

                  Internal Statement Level Monitoring

                  The internally-generated, individual sql log for the database can be enabled with the SET DATABASE EVENT LOG SQL LEVEL statement, described in this chapter. As all the executed statements are logged, there is an impact on speed. So you should only use this for debugging. Two levels of sql logging are supported.

                  Internal Event Monitoring

                  HyperSQL can log important internal events of the engine. These events occur during the operation of the engine, and are not always coupled with the exact type of statement being executed. Normal events such as opening and closing of files, or errors such as OutOfMemory conditions are examples of logged events.

                  HyperSQL supports two methods of logging. One method is specific to the individual database and is managed internally by HyperSQL. The other method is specific to JVM and is managed by a logging framework.

                  The internally-generated, individual log for the database can be enabled with the SET DATABASE EVENT LOG LEVEL statement, described in this chapter. This method of logging is very useful for desktop application deployment, as it provides an ongoing record of database operations.

                  Log4J and JDK logging

                  HyperSQL also supports log4J and JDK logging. The same event information that is passed to the internal log, is passed to external logging frameworks. These frameworks are typically configured outside HyperSQL. The log messages include the string "hsqldb.db." followed by the unique id (a 16 character string) of the database that generated the message, so they can be identified in a multi-database server context.

                  As the default JDK logging framework has several shortcomings, HyperSQL configures this logging framework for better operation. If you do not want HyperSQL to configure the JDK logging framework, you should include the system level property hsqldb.reconfig_logging=false in your environment.

                  Server Operation Monitoring

                  A Server or WebServer instance can be started with the property server.silent=false. This causes all the connections and their executed statements to be printed to stdout as the statements are submitted to the server.

                  Database Security

                  HyperSQL has extensive security features which are implemented at different levels and covered in different chapters of this guide.

                  1. The server can use SSL and IP address access control lists. See the HyperSQL Network Listeners (Servers) chapter.

                  2. You can define a system property to stop the database engine accessing the Java static functions that are on the classpath, apart from a limited set that you allow. See Securing Access to Classes in the SQL-Invoked Routines chapter.

                  3. You can define a system property to allow access to files on the file system outside the database directory and its children. This access is only necessary if you use TEXT tables. See the Text Tables chapter.

                  4. The database files can be encrypted. Discussed in this chapter.

                  5. Within the database, the DBA privileges are required for system and maintenance jobs.

                  6. You can define users and roles and grant them access on different database objects. Each user has a password and is granted a set of privileges. See the Access Control chapter.

                  7. You can define a password complexity check function for new and changed passwords. This is covered below under Authentication Settings.

                  8. You can use external authentication instead of internally stored password to authenticate users for each database. This is covered below under Authentication Settings.

                  HyperSQL security is multi-layered and avoids any loopholes to circumvent security. It is however the user's responsibility to enable the required level of security.

                  Security Defaults

                  The default setting are generally adequate for most embedded use of the database or for servers on the host that are accessed from the same machine. For servers accessed within a network, and especially for those accessed from outside the network, additional security settings must be used.

                  The default settings for server and web server do not use SSL or IP access control lists. These features are enabled programatically, or with the properties used to start the server.

                  The default settings allow a database user with the DBA role or with schema creation role to access static functions on the classpath. You can disable this feature or limit it to specific classes and methods. This can be done programatically or by setting a system property when you start a server.

                  If access to specific static functions is granted, then these functions must be considered as part of the database program and checked for any security flaws before inclusion in the classpath.

                  The default settings do not allow a user to access files outside the database directory. This access is for TEXT table source files. You can override this programatically or with a system property when you start a server.

                  The encryption of database file does not utilise any user-supplied information for encryption keys. This level of security is outside the realm of users and passwords.

                  The first user for a new database has the DBA role. This user name need was always SA in older versions of HSQLDB, but not in the latest versions. The name of the first DBA user and its password can be specified when the database is created by the first connection to the database. These settings are then stored in the database.

                  The initial user with the DBA role should be used for admin purposes only. At least one additional role should be created for normal database use in the application and at least one additional user should be created and granted this role. The new role should not be given the DBA role. It can be given the CREATE_SCHEMA role, which allows it to create and access multiple schemas. Alternatively, the user with the DBA role can create the schemas and their objects and then grant specific privileges on the objects to the non-DBA role.

                  Authentication Control

                  Authentication is the mechanism that determines if a user can access the database at all. Once authentication is performed, the authorization mechanism is used to determine which database objects the particular user can access. The default authentication mechanism is password authentication. Each user is created with a password, which is stored in the database and checked each time a new database connection is created.

                  Password Complexity Check

                  HyperSQL allows you to define a function that checks the quality of the passwords defined in the database. The passwords are stored in the database. Each time a user connects, the user's name and password are checked against the stored list of users and passwords. The connection attempt is rejected if there is no match.

                  External Authentication

                  You can use an external authentication mechanism instead of the internal authentication mechanism. HyperSQL allows you to define a function that checks the combination of database unique name, user name, and password for each connection attempt. The function can use external resources to authenticate the user. For example, a directory server may be used. The password may be ignored if the external resource can verify the user's credential without it.

                  You can override external authentication for a user with the ALTER USER statement. See the Access Control chapter

                  Compatibility with Other RDBMS

                  HyperSQL is used more than any other database engine for application testing and development targeted at other databases. Over the years, this usage resulted in developers finding and reporting many obscure bugs in HyperSQL, which have all been fixed in the latest version. Also, HyperSQL 2.0 has been written to the SQL Standard and avoids the traps caused by superficial imitation of existing RDBMS.

                  HyperSQL has many property settings that relax conformance to the Standard in order to allow compatibility with other RDBMS, without breaking the core integrity of the database. These properties are modified with SET DATABASE SQL statements described in the SQL Conformance Settings section of this chapter

                  The SQL Standard has existed since 1989 and has been expanded over the years in several revisions. Also, the X-Open specification has defined a number of SQL functions which are implemented by most RDBMS.

                  Each RDBMS supports additional functions that are not covered by the standard. Some RDBMS use non-standard syntax for some operations. Fortunately, most popular RDBMS products have introduced better compatibility with the Standard in their recent versions, but there are still some portability issues. HyperSQL overcomes the potability issues using these strategies

                  • An extensive set of functions cover the SQL Standard, X-Open, and most of the useful functions that other RDBMS may support.

                  • Database properties, which can be specified on the URL or as SQL statements, relax conformance to the Standard in order to allow non-standard comparisons and assignments allowed by other RDBMS.

                  • Specific SQL syntax compatibility modes allow syntax and type names that are supported by some popular RDBMS.

                  • User-defined types and functions, including aggregate functions, allow any type or function that is supported by some RDBMS to be defined and used.

                  In the future, the supported compatibility modes with other RDBMS will be expanded further.

                  PostgreSQL Compatibility

                  PostgreSQL is fairly compatible with the Standard, but uses some non-standard features.

                  • Use <set database sql syntax PGS statement> to enable the PostgreSQL's non-standard features. References to SERIAL, BIGSERIAL and TEXT data types, as well as sequence functions, are translated into HSQLDB equivalents.

                  • Use MVCC if your application is multi-user

                  • PostgreSQL functions are generally supported

                  • For identity columns, PostgreSQL uses a non-standard linkage with an external identity sequence. In most cases, this can be converted to GENERATED BY DEFAULT AS IDENTITY. In those cases where the identity sequence needs to be shared by multiple tables, you can use a new HyperSQL 2.2 feature GENERATED BY DEFAULT AS SEQUENCE <sequence name>, which is the equivalent of the PostgreSQL implementation.

                  • In CREATE TABLE statements, the SERIAL and BIGSERIAL types are translated into INTEGER or BIGINT, with GENERATED BY DEFAULT AS IDENTITY. Usage of DEFAULT NEXTVAL(<sequence name>) is supported so long as the <sequence name> refers to an existing sequence. This usage is translated into GENERATED BY DEFAULT AS SEQUENCE <sequence name>.

                  • In SELECT and other statements, the NEXTVAL(<sequence name>) and LASTVAL() functions are supported and translated into HyperSQL's NEXT VALUE FOR <sequence name> and IDENTITY() expressions.

                  • PostgreSQL uses a non-standard expression, SELECT 'A Test String' to return a single row table. The standard form is VALUES('A Test String'). In PGS syntax mode, this type of SELECT is supported.

                  • HyperSQL supports SQL Standard ARRAY types. PostgreSQL also supports this, but not entirely according to the Standard.

                  • SQL routines are portable, but some syntax elements are different and require changes.

                  • You may need to use SET DATABASE SQL TDC { DELETE | UPDATE } FALSE statements, as PostgreSQL does not enforce the subtle rules of the Standard for foreign key cascading deletes and updates.

                  MySQL Compatibility

                  MySQL had many incompatibilities with the Standard. The latest versions have introduced much greater compatibly, but some of these features have to be turned on via properties. You should therefore check the current Standard compatibility settings of your MySQL database and use the available HyperSQL properties to achieve closer results. If you avoid the few anti-Standard features of MySQL you can port your databases to HyperSQL.

                  HyperSQL does not have the following non-standard limitations of MySQL.

                  • Win HyperSQL, an UPDATE statement can update UNIQUE and PRIMARY KEY columns of a table without causing an exception due to temporary violation of constraints. These constraints are checked at the end of execution, therefore there is no need for an ORDER BY clause in an UPDATE statement.

                  • MySQL foreign key constraints are not enforced by the default MyISAM engine. Be aware of the possibility of data being rejected by HyperSQL due to these constraints.

                  • With HyperSQL INSERT or UPDATE statements either succeed or fail due to constraint violation. MySQL has the non-standard IGNORE overrides to ignore violations, which is not accepted by HyperSQL.

                  • Unlike MySQL, HyperSQL allows you to modify a table with an INSERT, UPDATE or DELETE statement which selects from the same table in a subquery.

                  Follow the guidelines below for converting MySQL databases and applications.

                  • Use <set database sql syntax MYS statement> to enable support for AUTO_INCREMENT and TEXT data types. These type definitions are translated into HSQLDB equivalents.

                  • Use MVCC with <set database transaction control statement> if your application is multi-user.

                  • Avoid storing invalid values, for example invalid dates such as '0000-00-00' or '2001-00-00' which are rejected by HyperSQL.

                  • Avoid the MySQL feature that trims spaces at the end of CHAR values.

                  • In MySQL, a database is the same as a schema. In HyperSQL several schemas can exist in the same database and accessed transparently. In addition a HyperSQL server supports multiple separate databases.

                  • In MySQL, older, non-standard, forms of database object name case-sensitivity make is difficult to port applications. Use the latest form which encloses case-sensitive names in double quotes.

                  • MySQL functions are generally supported, including GROUP_CONCAT.

                  • For fine control over type conversion, check the settings for <set database sql convert truncate statement>

                  • If you use concatenation of possibly NULL values in your select statements, you may need to change the setting with the <set database sql concat nulls statement>

                  • MySQL supports most SQL Standard types (except INTERVAL types), as well as non-standard types, which are also supported by HyperSQL. Supported types include SMALLINT, INT, BIGINT, DOUBLE, FLOAT, DECIMAL, NUMERIC, VARCHAR, CHAR, BINARY, VARBINARY, BLOB, DATE, TIMESTAMP (all Standard SQL) and TINYINT, DATETIME (non Standard).

                  • MySQL uses a non-standard expression, SELECT 'A Test String' to return a single row table. The standard form is VALUES('A Test String'). In MYS syntax mode, this type of SELECT is supported.

                  • SQL user-defined function and procedure syntax is very similar to SQL Standard syntax. A few changes may still be required.

                  Firebird Compatibility

                  Firebird generally follows the SQL Standard. Applications can be ported to HyperSQL without difficulty.

                  Apache Derby Compatibility

                  Apache Derby supports a smaller subset of the SQL Standard compared to HyperSQL. Applications can be ported to HyperSQL without difficulty.

                  • Use MVCC with <set database transaction control statement> if your application is multi-user.

                  • HyperSQL supports Java language functions and stored procedures with the standard syntax, which is similar to the way Derby supports these features.

                  Oracle Compatibility

                  Recent versions of Oracle support Standard SQL syntax for outer joins and many other operations. In addition, HyperSQL features a setting to support Oracle syntax and semantics for the most widely used non-standard features.

                  • Use <set database sql syntax ORA statement> to enable support for some non-standard syntax of Oracle.

                  • Use MVCC with <set database transaction control statement> if your application is multi-user.

                  • Fine control over MVCC deadlock avoidance is provided by the <set database transaction rollback on conflict statement> and the corresponding hsqldb.tx_conflict_rollback connection property.

                  • If your application relies on Oracle behaviour for nulls in multi-column UNIQUE constraints, use <set database sql unique nulls statement> to change the default.

                  • If you use the non-standard concatenation of possibly NULL values in your select statements, you may need to change the setting for <set database sql concat nulls statement>.

                  • Many Oracle functions are supported, including no-arg functions such as SYSDATE and SYSTIMESTAMP and more complex ones such as TO_DATE and TO_CHAR.

                  • Non-standard data type definitions such as NUMBER, VARCHAR2, NVARCHAR2, BINARY_DOUBLE, BINARY_FLOAT, LONG, RAW are translated into the closest HyperSQL / SQL Standard equivalent in ORA mode.

                  • The DATE type is interpreted as TIMESTAMP(0) in ORA syntax mode.

                  • The DUAL table and the expressions, ROWNUM, CURRVAL, NEXTVAL are supported in ORA syntax mode.

                  • HyperSQL natively supports operations involving datetime and interval values. These features are based on the SQL Standard.

                  • Many subtle automatic type conversions, syntax refinements and other common features are supported.

                  • SQL routines are generally portable, but some changes may be required.

                  DB2 Compatibility

                  DB2 is highly compatible with the SQL Standard (except its lack of support for the INFORMATION_SCHEMA). Applications can be ported to HyperSQL without difficulty.

                  • Use <set database sql syntax DB2 statement> to enable support for some non-standard syntax of DB2.

                  • Use MVCC with <set database transaction control statement> if your application is multi-user.

                  • HyperSQL supports almost the entire syntax of DB2 together with many of the functions. Even local temporary tables using the SESSION pseudo schema are supported.

                  • The DB2 binary type definition FOR BIT DATA, as well as empty definition of column default values are supported in DB2 syntax mode.

                  • Many DB2 functions are supported.

                  • The DUAL table and the expressions, ROWNUM, CURRVAL, NEXTVAL are supported in DB2 syntax mode.

                  • SQL routines are highly portable with minimal change.

                  MS SQLServer and Sybase Compatibility

                  SQLServer has some incompatibilities with the Standard syntax. The most significant is the use of square brackets instead of double quotes for case-sensitive column names.

                  • Use <set database sql syntax MSS statement> to enable support for the CONVERT(<type definition>, <expression) function with switched order of arguments

                  • Use MVCC with <set database transaction control statement> if your application is multi-user.

                  • If you use the non-standard concatenation of possibly NULL values in your select statements, you may need to change the setting for <set database sql concat nulls statement>.

                  • HyperSQL supports + for string concatenation. It also supports many functions supported by these dialects.

                  • SQLServer uses a non-standard expression, SELECT 'A Test String' to return a single row table. The standard form is VALUES('A Test String'). In MSS syntax mode, this type of SELECT is supported.

                  • SQL routines need quite a lot of changes.

                  Statements

                  System level statements are listed in this section. Statements that begin with SET DATABASE or SET FILES are for properties that have an effect on the normal operation of HyperSQL. The effects of these statements are also discussed in different chapters.

                  System Operations

                  These statements perform a system level action.

                  SHUTDOWN

                  shutdown statement

                  <shutdown statement> ::= SHUTDOWN [IMMEDIATELY | COMPACT | SCRIPT]

                  Shutdown the database. If the optional qualifier is not used, a normal SHUTDOWN is performed. A normal SHUTDOWN ensures all data is saved correctly and the database opens without delay on next use.

                  SHUTDOWN

                  Normal shutdown saves all the database files, then deletes the .log file (and the .backup file in the default mode). This does the same thing as CHECKPOINT, but closes the database when it completes. The database opens without delay on next used.

                  SHUTDOWN IMMEDIATELY

                  Saves the *.log file and closes the database files. This is the quickest form of shutdown. This command should not be used as the routine method of closing the database, because when the database is accessed next time, it may take a long time to start.

                  SHUTDOWN COMPACT

                  This is similar to normal SHUTDOWN, but reduces the *.data file to its minimum size. It can take much longer than normal SHUTDOWN. This shouldn't be used as routine.

                  SHUTDOWN SCRIPT

                  This is similar to SHUTDOWN COMPACT, but it does not rewrite the *.data and text table files. After SHUTDOWN SCRIPT, only the *.script and *.properties files remain. At the next startup, these files are processed and the *.data file is created if there are cached tables. This command in effect performs part of the job of SHUTDOWN COMPACT, leaving the other part to be performed automatically at the next startup.

                  This command produces a full script of the database which can be edited for special purposes prior to the next startup.

                  Only a user with the DBA role can execute this statement.

                  BACKUP DATABASE

                  backup database statement

                  <backup database statement> ::= BACKUP DATABASE TO <file path> [SCRIPT] {[NOT] COMPRESSED} {[NOT] BLOCKING}

                  Backup the database to specified <file path> for archiving purposes.

                  The <file path> can be in two forms. If the <file path> ends with a forward slash, it specifies a directory. In this case, an automatic name for the archive is generated that includes the date, time and the base name of the database. The database is backed up to this archive file in the specified directory. The archive is in .tar.gz or .tar format depending on whether it is compressed or not.

                  If the <file path> does not end with a forward slash, it specifies a user-defined file name for the backup archive. The file extension must be either .tar.gz or .tar and this must match the compression option.

                  The default set of options is COMPRESSED BLOCKING.

                  If SCRIPT is specified, the backup will contain a *.script file, which contain all the data and settings of the database. Otherwise, it consists of the current snapshot of all database files.

                  If NOT COMPRESSED is specified, the backup is a tar file, without compression. Otherwise, it is in gzip format.

                  The qualifier, BLOCKING, means all database operations are suspended during backup. During backup, a CHECKPOINT command is silently executed. This mode is always used when SCRIPT is specified.

                  Hot backup is performed if NOT BLOCKING is specified. In this mode, the database can be used during backup. This mode should only be used with very large databases. A hot backup set is less compact and takes longer to restore and use than a normal backup set produced with the BLOCKING option. You can perform a CHECKPOINT just before a hot backup in order to reduce the size of the backup set.

                  The HyperSQL jar also contains a program that creates an archive of an offline database. It also contains a program to expand an archive into database files. These programs are documented in this chapter under Backing up Database Catalogs.

                  Only a user with the DBA role can execute this statement.

                  CHECKPOINT

                  checkpoint statement

                  <checkpoint statement> ::= CHECKPOINT [DEFRAG]

                  Closes the database files, rewrites the script file, deletes the log file and opens the database. If DEFRAG is specified, also shrinks the *.data file to its minimum size.

                  Only a user with the DBA role can execute this statement.

                  Only a user with the DBA role can execute this statement.

                  SCRIPT

                  script statement

                  <script statement> ::= SCRIPT [<file name>]

                  Returns a script containing SQL statements that define the database, its users, and its schema objects. If <file name> is not specified, the statements are returned in a ResultSet, with each row containing an SQL statement. No data statements are included in this form. The optional file name is a single-quoted string. If <file name> is specified, then the script is written to the named file. In this case, all the data in all tables of the database is included in the script as INSERT statements.

                  Only a user with the DBA role can execute this statement.

                  Database Settings

                  These statements change the database settings.

                  SET DATABASE COLLATION

                  set database collation statement

                  <set database collation statement> ::= SET DATABASE COLLATION <collation name> [ NO PAD | PAD SPACE ]

                  Each database can have its own default collation. Sets the collation from the set of collations supported by HyperSQL. Once this command has been issued, the database can be opened in any JVM and will retain its collation.

                  All collations pad the shorter string with spaces when two strings are compared. If NO PAD is specified, comparison is performed without padding. The default system collation is named SQL_TEXT. To use the default without padding use SET DATABASE COLLATION SQL_TEXT NO PAD.

                  Only a user with the DBA role can execute this statement.

                  SET DATABASE DEFAULT RESULT MEMORY ROWS

                  set database default result memory rows statement

                  <set database default result memory rows> ::= SET DATABASE DEFAULT RESULT MEMORY ROWS <unsigned integer literal>

                  Sets the maximum number of rows of each result set and internal temporary table that is held in memory. Temporary tables includes views, schema-based and session-based TEMPORARY tables, transient tables for subqueries, and INFORMATION_SCHEMA tables.

                  This setting applies to all sessions. Individual sessions can change the value with the SET SESSION RESULT MEMORY ROWS statement. The default is 0, meaning all result sets are held in memory.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.result_max_memory_rows.

                  SET DATABASE DEFAULT TABLE TYPE

                  set database default table type statement

                  <set database default table type> ::= SET DATABASE DEFAULT TABLE TYPE { CACHED | MEMORY }

                  Sets the type of table created when the next CREATE TABLE statement is executed. The default is MEMORY.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.default_table_type.

                  SET DATABASE EVENT LOG LEVEL

                  set database event log level statement

                  <set database event log level> ::= SET DATABASE EVENT LOG [ SQL ] LEVEL { 0 | 1 | 2 | 3 }

                  When the SQL option is not used, this statement sets the amount of information logged in the internal, database-specific event log. Level 0 means no log. Level 1 means only important (error) events. Level 2 means more events, including both important and less important (normal) events. Level 3 includes even more details. For readonly and mem: databases, if the level is set above 0, the log messages are directed to stderr.

                  The events are logged in a file with the extension .app.log alongside the main database files.

                  This is equivalent to the connection property hsqldb.applog.

                  When the SQL option is used, this statement logs the SQL statements as they are executed. Each log line contains the timestamp and the session number, followed by the SQL statement and JDBC arguments if any.

                  Levels 1 and 2 are supported. Level 1 only logs commits and rollbacks, while Level 2 logs all statements.

                  The logged lines are stored in a file with the extension .sql.log alongside the main database files.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.sqllog.

                  SET DATABASE GC

                  set database gc statement

                  <set database gc statement> ::= SET DATABASE GC <unsigned integer literal>

                  An optional property which forces calls to System.gc() after the specified number of row operations. The default value for this property is 0, which means no System.gc() calls. Usual values for this property range from 10000 depending on the system and the memory allocation. This property may be useful in some in-process deployments, especially with older JVM implementations.

                  Only a user with the DBA role can execute this statement.

                  SET DATABASE UNIQUE NAME

                  set database unique name

                  <set database unique name statement> ::= SET DATABASE UNIQUE NAME <identifier>

                  Each HyperSQL catalog (database) has an engine-generated internal name. This name is a 16 character long string, beginning with HSQLDB and based on the time of creation of the database. The name is used for the log events that are sent to external logging frameworks. The new name must be exactly 16 characters long with no spaces.

                  Only a user with the DBA role can execute this statement.

                  SET DATABASE TRANSACTION CONTROL

                  set database transaction control statement

                  <set database transaction control statement> ::= SET DATABASE TRANSACTION CONTROL { LOCKS | MVLOCKS | MVCC }

                  Set the concurrency control system for the database. It can be issued only when all sessions have been committed or rolled back. This command and its modes is discussed in the Sessions and Transactions chapter.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.tx.

                  SET DATABASE TRANSACTION ROLLBACK ON CONFLICT

                  set database transaction rollback on conflict statement

                  <set database transaction rollback on conflict statement> ::= SET DATABASE TRANSACTION ROLLBACK ON CONFLICT { TRUE | FALSE }

                  When a transaction deadlock or conflict is about to happen, the current transaction is rolled back and an exception is raised. When this property is set false, the transaction is not rolled back. Only the latest statement that would cause the conflict is undone and an exception is raised. The property should not be changed unless the application can quickly perform an alternative statement and complete the transaction. It is provided for compatibility with other database engines which do not roll back the transaction upon deadlock. This command is also discussed in the Sessions and Transactions chapter.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.tx_conflict_rollback.

                  SET DATABASE DEFAULT ISOLATION LEVEL

                  set database default isolation level statement

                  <set database default isolation level> ::= SET DATABASE DEFAULT ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE }

                  Sets the transaction isolation level for new sessions. The default is READ COMMITTED. Each session can also set its isolation level.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.tx_level.

                  SET DATABASE TEXT TABLE DEFAULTS

                  set database text table defaults statement

                  <set database text table defaults statement> ::= SET DATABASE TEXT TABLE DEFAULTS <character literal>

                  An optional property to override default text table settings. The string literal has the same format as the string used for setting the data source of a text table, but without the file name. See the Text Tables chapter.

                  Only a user with the DBA role can execute this statement.

                  SQL Conformance Settings

                  These statements modify the level of conformance to the SQL Standard in different areas. The settings that specify SQL SYNTAX are for compatibility with other database engines and are FALSE by default. For all the rest of the settings, TRUE means better conformance to the Standard (unless the Standard defines the behaviour as implementation dependent). The default value of a few of these settings is FALSE, due to widespread non-conforming statements that are already in use in user applications or statements generated by object relational tools. So long as it is practical, it is best to set the non-conforming defaults to TRUE in order to improve the quality of the database application.

                  SET DATABASE SQL SIZE

                  set database sql size statement

                  <set database sql size statement> ::= SET DATABASE SQL SIZE { TRUE | FALSE }

                  Enable or disable enforcement of column sizes for CHAR and VARCHAR columns. The default is TRUE, meaning table definition must contain VARCHAR(n) instead of VARCHAR.

                  SQL Standard requires enforcement.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.enforce_size.

                  SET DATABASE SQL NAMES

                  set database sql names statement

                  <set database sql names statement> ::= SET DATABASE SQL NAMES { TRUE | FALSE }

                  Enable or disable full enforcement of the rule that prevents SQL keywords being used for database object names such as columns and tables. The default is FALSE, meaning disabled.

                  SQL Standard requires enforcement. It is better to enable this check, in order to improve the quality and correctness of SQL statements.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.enforce_names.

                  SET DATABASE SQL REGULAR NAMES

                  set database sql regular names statement

                  <set database sql regular names statement> ::= SET DATABASE SQL REGULAR NAMES { TRUE | FALSE }

                  Enable or disable use of the underscore character at the beginning, or the dollar character anywhere in database object names such as columns and tables. The default is TRUE, meaning disabled.

                  SQL Standard does not allow the underscore character at the start of names, and does not allow the dollar character anywhere in a name. This setting can be changed for compatibility with existing database or for porting databases which include names that do not conform to the Standard.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.regular_names.

                  SET DATABASE SQL REFERENCES

                  set database sql references statement

                  <set database sql references statement> ::= SET DATABASE SQL REFERENCES { TRUE | FALSE }

                  This command can enable or disable full enforcement of the rule that prevents ambiguous column references in SQL statements (usually SELECT statements). A column reference is ambiguous when it is not qualified by a table name or table alias and can refer to more than one column in a JOIN list.

                  The property is FALSE by default.

                  SQL Standard requires enforcement. It is better to enable this check, in order to improve the quality and correctness of SQL statements. When false, the first matching table is used to resolve the column reference.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.enforce_refs.

                  SET DATABASE SQL TYPES

                  set database sql types statement

                  <set database sql types statement> ::= SET DATABASE SQL TYPES { TRUE | FALSE }

                  This command can enable or disable full enforcement of the rules that prevents illegal type conversions and parameters or nulls without type in SQL statements (usually SELECT statements). For example an INTEGER column or a DATE column cannot be compared to a character string or searched with a LIKE expression when the property is TRUE.

                  The property is FALSE by default.

                  SQL Standard requires enforcement. It is better to enable this check, in order to improve the quality and correctness of SQL statements.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.enforce_type.

                  SET DATABASE SQL TDC DELETE

                  set database sql tdc delete statement

                  <set database sql tdc delete statement> ::= SET DATABASE SQL TDC DELETE { TRUE | FALSE }

                  This command can enable or disable full enforcement of the SQL Standard rules that prevents triggered data change exceptions caused by ON DELETE CASCADE clauses of foreign key constraint.

                  When there are multiple constraints, a row may be updated by one constraint and deleted by another constraint in the same operation. This is not allowed by default. Changing this to false allows such violations of the Standard to pass without an exception.

                  The property is TRUE by default.

                  SQL Standard requires enforcement, therefore this property shouldn't be changed unless an application written for a non-conforming RDBMS needs it.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.enforce_tdc_delete.

                  SET DATABASE SQL TDC UPDATE

                  set database sql tdc update statement

                  <set database sql tdc update statement> ::= SET DATABASE SQL TDC UPDATE { TRUE | FALSE }

                  This command can enable or disable full enforcement of the SQL Standard rules that prevents triggered data change exceptions caused by multiple ON UPDATE or ON DELETE SET clauses of foreign key constraint. When there are multiple constraints, a field in a row may be updated by two constraints to different values in the same operation. This is not allowed by default. Changing this to FALSE allows such violations of the Standard to pass without an exception.

                  The property is TRUE by default.

                  SQL Standard requires enforcement, therefore this property shouldn't be changed unless an application written for a non-conforming RDBMS needs it.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.enforce_tdc_update.

                  SET DATABASE SQL TRANSLATE TTI TYPES

                  set database sql translate tti types statement

                  <set database sql translate tti types statement> ::= SET DATABASE SQL TRANSLATE TTI TYPES { TRUE | FALSE }

                  The JDBC Specification up to version 4.1 does not support some SQL Standard built-in types, therefore these types must be translated to a supported type when accessed through JDBC ResultSet and PreparedStatement methods.

                  If the property is true, the TIME / TIMESTAMP WITH TIME ZONE types and INTERVAL types are represented in JDBC methods of ResultSetMetaData and DatabaseMetaData as JDBC datetime types without time zone and the VARCHAR type respectively. The original type names are preserved.

                  The property is TRUE by default. If set to FALSE, the type codes for WITH TIME ZONE types will be SQL type codes as opposed to JDBC type codes.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property jdbc.translate_tti_types.

                  SET DATABASE SQL CONCAT NULLS

                  set database sql concat nulls statement

                  <set database sql concat nulls statement> ::= SET DATABASE SQL CONCAT NULLS { TRUE | FALSE }

                  When the property is TRUE, concatenation of a null value with a not-null value results in a null value. When the property is FALSE this type of concatenation result in the not-null value.

                  Setting this property FALSE results in concatenation behaviour similar to Oracle or MS SQL Server.

                  SQL Standard requires a NULL result..

                  The property is TRUE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.concat_nulls.

                  SET DATABASE SQL UNIQUE NULLS

                  set database sql unique nulls statement

                  <set database sql unique nulls statement> ::= SET DATABASE SQL UNIQUE NULLS { TRUE | FALSE }

                  When the property is TRUE, with multi-column UNIQUE constraints, it is possible to insert multiple rows for which one or more of the values for the constraint columns is NULL. When the property is FALSE, if there is any not-null value in the columns, then the set of values is compared to the existing rows and if there is a match, an exception is thrown. The setting FALSE, makes the behaviour more restrictive. For example, inserting (1, null) twice is possible by default, but not possible when the property is FALSE.

                  Setting this property FALSE results in UNIQUE constraint behaviour similar to Oracle.

                  SQL Standard requires the default (TRUE) behaviour.

                  The property is TRUE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.unique_nulls.

                  SET DATABASE SQL CONVERT TRUNCATE

                  set database sql unique convert truncate

                  <set database sql convert truncate statement> ::= SET DATABASE SQL CONVERT TRUNCATE { TRUE | FALSE }

                  When the property is TRUE, conversion from a floating point value (a DOUBLE value) to an integral type always truncates the fractional part. When the property is FALSE, rounding takes place instead of truncation. For example, assigning the value 123456E-2 to an integer column will result in 1234 by default, but 1235 when the property is FALSE.

                  Standard SQL considers this behaviour implementation dependent.

                  The property is TRUE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.convert_trunc.

                  SET DATABASE SQL AVG SCALE

                  set database sql avg scale

                  <set database sql avg scale> ::= SET DATABASE SQL AVG SCALE <numeric value>

                  By default, the result of division and the AVG and MEDIAN aggregate functions has the same type as the aggregated type of the values. This includes the scale. The scale specified with this property is used if it is larger than the scale of the operation. For example, the average of 5 and 10 is 7 by default, but 7.50 if the scale is specified as 2. The result of 7/3 is 2 by default but 2.33 if the scale is specified as 2.

                  Standard SQL considers this behaviour implementation dependent. Some databases use a default scale larger than zero.

                  The property is 0 by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.avg_scale.

                  SET DATABASE SQL DOUBLE NAN

                  set database sql double nan

                  <set database sql double nan> ::= SET DATABASE SQL DOUBLE NAN { TRUE | FALSE }

                  When the property is TRUE, division of a floating point value (a DOUBLE value) by zero raises an exception. When the property is FALSE, a Java Double.NaN, POSITIVE_INFINITY or NEGATIVE_INFINITY value is returned.

                  Standard SQL requires an exception to be raised.

                  The property is TRUE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.double_nan.

                  SET DATABASE SQL NULLS FIRST

                  set database sql nulls first

                  <set database sql nulls first> ::= SET DATABASE SQL NULLS FIRST { TRUE | FALSE }

                  When the property is TRUE, nulls appear before values in result sets with ORDER BY. When set FALSE, nulls appear after the values. Some databases, including PostgreSQL, Oracle and MS SQL Server, return nulls after the values.

                  The property is TRUE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.nulls_first.

                  SET DATABASE SQL SYNTAX DB2

                  set database sql syntax DB2

                  <set database sql syntax DB2 statement> ::= SET DATABASE SQL SYNTAX DB2 { TRUE | FALSE }

                  This property, when set TRUE, enables support for some elements of DB2 syntax. Single-row SELECT statements (SELECT <expression list> without the FROM clause) are supported and treated as the SQL Standard equivalent, VALUES <expression list>. The DUAL table is supported, as well as the ROWNUM pseudo-column. BINARY type definitions such as VARCHAR(L) FOR BIT DATA are supported. Empty DEFAULT clauses in column definitions are supported.

                  The property is FALSE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.syntax_db2.

                  SET DATABASE SQL SYNTAX MSS

                  set database sql syntax MSS

                  <set database sql syntax MSS statement> ::= SET DATABASE SQL SYNTAX MSS { TRUE | FALSE }

                  This property, when set TRUE, enables support for some elements of SQLServer syntax. Single-row SELECT statements (SELECT <expression list> without the FROM clause) are supported and treated as the SQL Standard equivalent, VALUES <expression list>. The parameters of CONVERT() function are switched in this mode.

                  The property is FALSE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.syntax_mss.

                  SET DATABASE SQL SYNTAX MYS

                  set database sql syntax MYS

                  <set database sql syntax MYS statement> ::= SET DATABASE SQL SYNTAX MYS { TRUE | FALSE }

                  This property, when set TRUE, enables support for some elements of MySQL syntax. The TEXT data type is translated to LONGVARCHAR.

                  In CREATE TABLE statements, [NOT NULL | NULL] can be used immediately after the column type name and before the DEFAULT clause. AUTO_INCREMENT is translated to the GENERATED BY DEFAULT AS IDENTITY clause.

                  Single-row SELECT statements (SELECT <expression list> without the FROM clause) are supported and treated as the SQL Standard equivalent, VALUES <expression list>.

                  The property is FALSE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.syntax_mys.

                  SET DATABASE SQL SYNTAX ORA

                  set database sql syntax ORA

                  <set database sql syntax ORA statement> ::= SET DATABASE SQL SYNTAX ORA { TRUE | FALSE }

                  This property, when set TRUE, enables support for some elements of Oracle syntax. The DUAL table is supported, together with ROWNUM, NEXTVAL and CURRVAL syntax and semantics.

                  The non-standard types are translated to supported standard types. BINARY_DOUBLE and BINARY_FLOAT are translated to DOUBLE. LONG RAW and RAW are translated to VARBINARY with long or medium length limits. LONG and VARCHAR2 are translated to VARCHAR with long or medium length limits. NUMBER is translated to DECIMAL. Some extra type conversions and no-arg functions are also allowed in this mode.

                  The property is FALSE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.syntax_ora.

                  SET DATABASE SQL SYNTAX PGS

                  set database sql syntax PGS

                  <set database sql syntax PGS statement> ::= SET DATABASE SQL SYNTAX PGS { TRUE | FALSE }

                  This property, when set TRUE, enables support for some elements of PosgtreSQL syntax. The TEXT data type is translated to LONGVARCHAR, while the SERIAL data types is translated to BIGINT together with GENERATED BY DEFAULT AS IDENTITY.

                  Single-row SELECT statements (SELECT <expression list> without the FROM clause) are supported and treated as the SQL Standard equivalent, VALUES <expression list>.

                  The functions NEXTVAL(<sequence name string>), CURRVAL(<sequence name string>) and LASTVAL() are supported in this compatibility mode.

                  The property is FALSE by default.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property sql.syntax_pgs.

                  SET DATABASE REFERENTIAL INTEGRITY

                  set database referential integrity statement

                  <set database referential integrity statement> ::= SET DATABASE REFERENTIAL INTEGRITY { TRUE | FALSE }

                  This command enables or disables the enforcement of referential integrity constraints (foreign key constraints), check constraints apart from NOT NULL and execution of triggers. By default, all constraints are checked.

                  The only legitimate use of this statement is before importing large amounts of external data into tables that have existing FOREIGN KEY constraints. After import, the statement must be used again to enable constraint enforcement.

                  If you are not sure the data conforms to the constraints, run queries to verify all rows conform to the FOREIGN KEY constraints and take appropriate actions for the rows that do not conform.

                  A query example to return the rows in a foreign key table that have no parent is given below:

                  Example 11.5. Finding foreign key rows with no parents after a bulk import

                    SELECT * FROM foreign_key_table LEFT OUTER JOIN primary_key_table 
                      ON foreign_key_table.fk_col = primary_key_table.pk_col WHERE primary_key_table.pk_col IS NULL

                  Only a user with the DBA role can execute this statement.

                  Cache, Persistence and Files Settings

                  These statements control the memory and other settings for database persistence.

                  SET FILES BACKUP INCREMENT

                  set files backup increment statement

                  <set files backup increment statement> ::= SET FILES BACKUP INCREMENT { TRUE | FALSE }

                  Older versions of HSQLDB perform a backup of the .data file before its contents are modified and the whole .data file is saved in a compressed form when a CHECKPOINT or SHUTDOWN is performed. This takes a long time when the size of the database exceeds 100 MB or so (on an average 2010 computer, you can expect a backup speed of 20MB per second or more).

                  The alternative is backup in increments, just before some part of the .data file is modified. In this mode, no backup is performed at CHECKPOINT or SHUTDOWN. This mode is preferred for large databases which are opened and closed frequently.

                  The default mode is TRUE. If the old method of backup is preferred, the mode can be set FALSE.

                  Warning: The old, non-incremental setting, FALSE, shouldn't be used at all when the data file is larger than 4GB. If it is used, the data file is not fully backed up and can result in corruption. The zip compression method is used in this mode and it is limited to 4GB size.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.inc_backup.

                  SET FILES CACHE ROWS

                  set files cache rows statement

                  <set files cache rows statement> ::= SET FILES CACHE ROWS <unsigned integer literal>

                  Sets the maximum number of rows (of CACHED tables) held in the memory cache. The default is 50000 rows.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.cache_rows.

                  SET FILES CACHE SIZE

                  set files cache size statement

                  <set files cache size statement> ::= SET FILES CACHE SIZE <unsigned integer literal>

                  Sets maximum amount of data (of CACHED tables) in kilobytes held in the memory cache. The default is 10000 kilobytes. Note the amount of memory used is larger than this amount, which does not account for Java object size overheads.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.cache_size.

                  SET FILES DEFRAG

                  set files defrag statement

                  <set files defrag statement> ::= SET FILES DEFRAG <unsigned integer literal>

                  Sets the threshold for performing a DEFRAG during a checkpoint. The <unsigned integer literal> is the percentage of abandoned space in the *.data file. When a CHECKPOINT is performed either as a result of the .log file reaching the limit set by SET FILES LOG SIZE m, or by the user issuing a CHECKPOINT command, the amount of space abandoned since the database was opened is checked and if it is larger than specified percentage, a CHECKPOINT DEFRAG is performed instead of a CHECKPOINT.

                  The default is 0, which indicates no DEFRAG. Useful values are between 10 to 50.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.defrag_limit.

                  SET FILES LOG

                  set files log statement

                  <set files log statement> ::= SET FILES LOG { TRUE | FALSE }

                  Sets logging of database operations on or off. Turning logging off is for special usage, such as temporary cache usage. The default is TRUE.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.log_data.

                  SET FILES LOG SIZE

                  set files log size statement

                  <set files log size statement> ::= SET FILES LOG SIZE <unsigned integer literal>

                  Sets the maximum size in MB of the *.log file to the specified value. The default maximum size is 50 MB. If the value is zero, no limit is used for the size of the file. When the size of the file reaches this value, a CHECKPOINT is performed and the the *.log file is cleared to size 0.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.log_size.

                  SET FILES NIO

                  set files nio

                  <set files nio statement> ::= SET FILES NIO { TRUE | FALSE }

                  Sets the access method of the .data file. The default is TRUE and uses the Java nio classes to access the file via memory-mapped buffers.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.nio_data_file.

                  SET FILES NIO SIZE

                  set files nio size

                  <set files nio size statement> ::= SET FILES NIO SIZE <unsigned integer literal>

                  Sets The maximum size of .data file in megabytes that can use the nio access method. When the file gets larger than this limit, non-nio access methods are used. Values 64, 128, 256, 512, 1024 and larger multiples of 512 can be used. The default is 256MB.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.nio_max_size.

                  SET FILES WRITE DELAY

                  set files write delay statement

                  <set files write delay statement> ::= SET FILES WRITE DELAY {{ TRUE | FALSE } | <seconds value> | <milliseconds value> MILLIS}

                  Set the WRITE DELAY property of the database. The WRITE DELAY controls the frequency of file sync for the log file. When WRITE_DELAY is set to FALSE or 0, the sync takes place immediately at each COMMIT. WRITE DELAY TRUE performs the sync once every 0.5 seconds (which is the default). A numeric value can be specified instead.

                  The purpose of this command is to control the amount of data loss in case of a total system crash. A delay of 1 second means at most the data written to disk during the last second before the crash is lost. All data written prior to this has been synced and should be recoverable.

                  A write delay of 0 impacts performance in high load situations, as the engine has to wait for the file system to catch up.

                  To avoid this, you can set write delay down to 10 milliseconds.

                  Each time the SET FILES WRITE DELAY statement is executed with any value, a sync is immediately performed.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection properties hsqldb.write_delay and hsqldb.write_delay_millis.

                  SET FILES SCALE

                  set files scale

                  <set files scale statement> ::= SET FILES SCALE <scale value>

                  Changes the scale factor for the .data file. The default scale is 8 and allows 16GB of data storage capacity. The scale can be increased in order to increase the maximum data storage capacity. The scale values 8, 16, 32, 64, 128, 256, 512, 1024 are allowed. Scale value 1024 allows a maximum capacity of 2 TB.

                  This command can be used only when there is no data in CACHED tables. This is equivalent to the connection property hsqldb.cache_file_scale.

                  The scale factor indicates the size of the unit of storage of data in bytes. For example, with a scale factor of 128, a row containing a small amount of data will use 128 bytes. Larger rows may use multiple units of 128 bytes.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.cache_file_scale.

                  SET FILES LOB SCALE

                  set files lob scale

                  <set files lob scale statement> ::= SET FILES LOB SCALE <scale value>

                  Changes the scale factor for the .lobs file. The scale is interpreted in kilobytes. The default scale is 32 and allows 64TB of lob data storage capacity. The scale can be reduced in order to improve storage efficiency. If the lobs are a lot smaller than 32 kilobytes, reducing the scale will reduce wasted space. The scale values 1, 2, 4, 8, 16, 32 are allowed. For example if the average size of lobs is 4 kilobytes, the default scale of 32 will result in 28KB wasted space for each lob. Reducing the lob scale to 2 will result in average 1KB wasted space for each lob.

                  This command can be used only when there is no lob in the database.

                  Only a user with the DBA role can execute this statement.

                  This is equivalent to the connection property hsqldb.lob_file_scale.

                  SET FILES SCRIPT FORMAT

                  set files script format

                  <set files script format statement> ::= SET FILES SCRIPT FORMAT { TEXT | COMPRESSED }

                  Changes the compression setting for database scripts. The default is text. Using COMPRESSED results in the storage of the .script file in gzip compressed form. Using this command causes a CHECKPOINT.

                  Only a user with the DBA role can execute this statement.

                  SET TABLE TYPE

                  set table type

                  <set table type statement> ::= SET TABLE <table name> TYPE { MEMORY | CACHED }

                  Changes the storage type of an existing table between CACHED and MEMORY types.

                  Only a user with the DBA role can execute this statement.

                  Authentication Settings

                  Two settings are available for authentication control.

                  When the default password authentication is used, the passwords can be checked for complexity according to administrative rules

                  SET DATABASE PASSWORD CHECK FUNCTION

                  set database password check function

                  <set database password check function statement> ::= SET DATABASE PASSWORD CHECK FUNCTION { <routine body> | NONE }

                  The routine body is the body of a function that has a VARCHAR parameter and returns a BOOLEAN. This function checks the PASSWORD submitted as parameter and returns TRUE if it conforms to complexity checks, or FALSE, if it does not.

                  The <routine body> can be an SQL block or an external Java function reference. This is covered in the SQL-Invoked Routines chapter

                  To disable this mechanism, the token NONE can be specified instead of the <routine body>.

                  Only a user with the DBA role can execute this statement.

                  In the examples below, an SQL function and a Java function are used.

                  SET DATABASE PASSWORD CHECK FUNCTION
                    BEGIN ATOMIC
                      IF CHAR_LENGTH(PASSWORD) > 6 THEN
                        RETURN TRUE;
                      ELSE 
                        RETURN FALSE;
                      END IF;
                    END
                  
                  SET DATABASE PASSWORD CHECK FUNCTION EXTERNAL NAME 'CLASSPATH:org.anorg.access.AccessClass.accessMethod'
                  
                  // the Java method is defined like this
                  public static boolean accessMethod(String param) {
                      return param != null && param.length > 6;
                  }
                  

                  It is possible to replace the default password authentication completely with a function that uses external authentication servers, such as LDAP. This function is called each time a user connects to the database.

                  SET DATABASE AUTHENTICATION FUNCTION

                  set database authentication function

                  <set database authentication function statement> ::= SET DATABASE AUTHENTICATION FUNCTION { <external body reference> | NONE }

                  The routine body is an external Java function reference. This function has three String parameters. The first parameter is the unique name of the database, the second parameter the user name, and the third parameter the password.

                  External authentication can be used in two different patterns. In the first pattern, user names must be stored in the database. In the second pattern, user names shouldn't be stored in the database and any names that are stored in the database are ignored.

                  In both patterns, the username and password are checked by the authentication function. If the function throws a runtime exception then authentication fails.

                  In the first pattern, the function always returns null if authentication is successful.

                  In the second pattern, the function returns a list of role names that have been granted to the user. These roles must match the ROLE objects that have been defined in the database.

                  The Java function should return an instance of org.hsqldb.jdbc.JDBCArrayBasic constructed with a String[] argument that contains the role names.

                  Only a user with the DBA role can execute this statement.

                  SET DATABASE AUTHENTICATION FUNCTION EXTERNAL NAME 'CLASSPATH:org.anorg.access.AccessClass.accessExernalMethod'
                  
                  // the Java method is defined like this
                  public static java.sql.Array accessExternalMethod(String database, String user, String password) {
                      if (externalCheck(database, user, password) {
                          return null;
                      }
                      throw new RuntimeException("failed to authenticate");
                  }
                  

                  Chapter 12. Properties

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5039 $

                  Copyright 2002-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  Connection URL

                  The normal method of accessing a HyperSQL catalog is via the JDBC Connection interface. An introduction to different methods of providing database services and accessing them can be found in the SQL Language chapter. Details and examples of how to connect via JDBC are provided in our JavaDoc for JDBCConnection.

                  A uniform method is used to distinguish between different types of connection. The common driver identifier is jdbc:hsqldb: followed by a protocol identifier (mem: file: res: hsql: http: hsqls: https:) then followed by host and port identifiers in the case of servers, then followed by database identifier. Additional property / value pairs can be appended to the end of the URL, separated with semicolons.

                  Table 12.1. Memory Database URL

                  Driver and ProtocolHost and Port ExampleDatabase Example
                  jdbc:hsqldb:mem:
                  not available
                  accounts

                  Lowercase, single-word identifier creates the in-memory database when the first connection is made. Subsequent use of the same Connection URL connects to the existing DB.

                  The old form for the URL, jdbc:hsqldb:. creates or connects to the same database as the new form for the URL, jdbc:hsqldb:mem:.


                  Table 12.2. File Database URL

                  Driver and ProtocolHost and Port ExampleDatabase Example
                  jdbc:hsqldb:file:
                  not available
                  accounts
                  /opt/db/accounts
                  C:/data/mydb

                  The file path specifies the database files. It should consist of a relative or absolute path to the directory containing the database files, followed by a '/' and the database name. In the above examples the first one refers to a set of mydb.* files in the directory where the javacommand for running the application was issued. The second and third examples refer to absolute paths on the host machine: For example, files named accounts.* in the directory /opt/db for the accounts database.


                  Table 12.3. Resource Database URL

                  Driver and ProtocolHost and Port ExampleDatabase Example
                  jdbc:hsqldb:res:
                  not available
                  /adirectory/dbname
                  Database files can be loaded from one of the jars specified as part of the Java command the same way as resource files are accessed in Java programs. The /adirectory above stands for a directory in one of the jars.

                  Table 12.4. Server Database URL

                  Driver and ProtocolHost and Port ExampleDatabase Example
                  jdbc:hsqldb:hsql:
                  jdbc:hsqldb:hsqls:
                  jdbc:hsqldb:http:
                  jdbc:hsqldb:https:
                  //localhost
                  //192.0.0.10:9500
                  //dbserver.somedomain.com
                  /an_alias
                  /enrolments
                  /quickdb

                  The host and port specify the IP address or host name of the server and an optional port number. The database to connect to is specified by an alias. This alias is a lowercase string defined in the server.properties file to refer to an actual database on the file system of the server or a transient, in-memory database on the server. The following example lines in server.properties or webserver.properties define the database aliases listed above and accessible to clients to refer to different file and in-memory databases.

                  The old form for the server URL, e.g., jdbc:hsqldb:hsql//localhost connects to the same database as the new form for the URL, jdbc:hsqldb:hsql//localhost/ where the alias is a zero length string.


                  Variables In Connection URL

                  Two types of variables are allowed for mem: and file: database URLs.

                  If the database part of a file: database begins with ~/ or ~\ the tilde character is replaced with the value of the system property "user.home" resulting in the database being created or accessed in this directory, or one of its subdirectories. In the example below, the database files for mydb are located in the user's home directory.

                      jdbc:hsqldb:file:~/mydb;shutdown=true

                  If the database URL contains a string in the form of ${propname} then the sequence of characters is replaced with the system property with the given name. For example you can use this in the URL of a database that is used in a web application and define the system property, "propname" in the web application properties. In the example below, the string ${mydbpath} is replaced with the value of the property, mydbpath

                      jdbc:hsqldb:file:${mydbpath};sql.enforce_types=true

                  Connection properties

                  Each JDBC Connection to a database can specify connection properties. The properties user and password are always required. The following optional properties can also be used.

                  Connection properties are specified either by establishing the connection via the method call below, or the property can be appended to the full Connection URL.

                      DriverManager.getConnection (String url, Properties info);

                  Table 12.5. User and Password

                  NameDefaultDescription
                  userSAuser name

                  Standard property. This property is case sensitive. Example below:

                      jdbc:hsqldb:file:enrolments;user=aUserName;ifexists=true
                  passwordempty stringpassword for the user

                  Standard property. This property is case sensitive. Example below:

                      jdbc:hsqldb:file:enrolments;user=aUserName;password=3xLVz

                  For compatibility with other engines, a non-standard form of specifying user and password is also supported. In this form, user name and password appear at the end of the URL string, prefixed respectively with the question mark and the ampersand:

                      jdbc:hsqldb:file:enrolments;create=false?user=aUserName&password=3xLVz

                  Table 12.6. Column Names in JDBC ResultSet

                  NameDefaultDescription
                  get_column_nametruecolumn name in ResultSet

                  This property is used for compatibility with other JDBC driver implementations. When true (the default), ResultSet.getColumnName(int c) returns the underlying column name. This property can be specified differently for different connections to the same database.

                  The default is true. When the property is false, the above method returns the same value as ResultSet.getColumnLabel(int column) Example below:

                      jdbc:hsqldb:hsql://localhost/enrolments;get_column_name=false

                  When a ResultSet is used inside a user-defined stored procedure, the default, true, is always used for this property.


                  Table 12.7. Creating New Database

                  NameDefaultDescription
                  ifexistsfalseconnect only if database already exists

                  Has an effect only with mem: and file: database. When true, will not create a new database if one does not already exist for the URL.

                  When the property is false (the default), a new mem: or file: database will be created if it does not exist.

                  Setting the property to true is useful when troubleshooting as no database is created if the URL is malformed. Example below:

                      jdbc:hsqldb:file:enrolments;ifexists=true
                  createtruecreate the database if it does not exist

                  Similar to the ifexists property, but with opposite meaning.

                  Has an effect only with mem: and file: database. When false, will not create a new database if one does not already exist for the URL.

                  When the property is true (the default), a new mem: or file: database will be created if it does not exist.

                  Setting the property to true is useful when troubleshooting as no database is created if the URL is malformed. Example below:

                      jdbc:hsqldb:file:enrolments;create=false

                  Table 12.8. Automatic Shutdown

                  NameDefaultDescription
                  shutdownfalseshut down the database when the last connection is closed

                  If this property is true, when the last connection to a database is closed, the database is automatically shut down. The property takes effect only when the first connection is made to the database. This means the connection that opens the database. It has no effect if used with subsequent connections.

                  This command has two uses. One is for test suites, where connections to the database are made from one JVM context, immediately followed by another context. The other use is for applications where it is not easy to configure the environment to shutdown the database. Examples reported by users include web application servers, where the closing of the last connection coincides with the web app being shut down.

                      jdbc:hsqldb:file:enrolments;shutdown=true

                  In addition, when the first connection to an in-process file: or mem: database creates a new database all the user-defined database properties can be specified as URL properties. See the next section for details.

                  Database Properties in Connection URL and Properties

                  The database engine has several properties that are listed in the System Management chapter. These properties can be changed via SQL commands after a connection is made to the database. It is possible to specify most of these properties in the connection properties or as part of the URL string when the first connection is made to a new file: or mem: database. This allows the properties to be set without using any SQL commands. The corresponding SQL command is given for each property.

                  If the properties are used for connection to an existing database, they are ignored. The exceptions are the following property settings that are allowed for the first connection to an existing database: readonly=true, files_readonly=true, hsqldb.lock_file=false, hsqldb.sqllog=1-3. These specific property / value pairs override the existing database properties. For example a normal database is opened as readonly, or the lock file is not created, or the sqllog level is set to a value between 1 and 3.

                  Management of properties has changed since version 1.8. The old SET PROPERTY statement does not change a property and is ignored. The statement is retained to simplify application upgrades.

                  In the example URL below, two properties are set for the first connection to a new database.

                      jdbc:hsqldb:file:enrolments;hsqldb.cache_rows=10000;hsqldb.nio_data_file=false

                  In the table below, database properties that can be used as part of the URL or in connection properties are listed. For each property that can also be set with an SQL statement, the statement is also given. These statements are described more extensively in the System Management chapter.

                  Table 12.9. Validity Check Property

                  NameDefaultDescription
                  check_propsfalsechecks the validity of the connection properties

                  If the property is true, every database property that is specified on the URL or in connection properties is checked and if it is not used correctly, an error is returned.

                  this property cannot be set with an SQL statement

                  SQL Conformance Properties

                  Table 12.10. SQL Keyword Use as Identifier

                  NameDefaultDescription
                  sql.enforce_namesfalseenforcing SQL keywords

                  This property, when set true, prevents SQL keywords being used for database object names such as columns and tables.

                  SET DATABASE SQL NAMES { TRUE | FALSE }

                  Table 12.11. SQL Keyword Starting with the Underscore or Containing Dollar Characters

                  NameDefaultDescription
                  sql.regular_namestrueenforcing SQL keywords

                  This property, when set true, prevents database object names such as columns and tables beginning with the underscore or containing the dollar character.

                  SET DATABASE SQL REGULAR NAMES { TRUE | FALSE }

                  Table 12.12. Reference to Columns Names

                  NameDefaultDescription
                  sql.enforce_refsfalseenforcing column reference disambiguation

                  This property, when set true, causes an error when an SQL statement (usually a select statement) contains column references that can be resolved by more than one table name or alias. In effect forces such column references to have a table name or table alias qualifier.

                  SET DATABASE SQL REFERENCES { TRUE | FALSE }

                  Table 12.13. String Size Declaration

                  NameDefaultDescription
                  sql.enforce_sizetruesize enforcement of string columns

                  Conforms to SQL standards for size and precision of data types. When true, all VARCHAR column type declarations require a size. When the property is false and there is no size in the declaration, a default size is used. Note that all other types accept a declaration without a size, which is interpreted as a default size.

                  SET DATABASE SQL SIZE { TRUE | FALSE }

                  Table 12.14. Type Enforcement in Comparison and Assignment

                  NameDefaultDescription
                  sql.enforce_typesfalseenforcing type compatibility

                  This property, when set true, causes an error when an SQL statements contains comparisons or assignments that are non-standard due to type mismatch. Most illegal comparisons and assignments will cause an exception regardless of this setting. This setting applies to a small number of comparisons and assignments that are possible, but not standard conformant, and were allowed in previous versions of HSQLDB.

                  SET DATABASE SQL TYPES { TRUE | FALSE }

                  Table 12.15. Foreign Key Triggered Data Change

                  NameDefaultDescription
                  sql.enforce_tdc_deletetrueenforcing triggered data change violation for deletes

                  The ON DELETE and ON UPDATE clauses of constraints cause data changes in rows in different tables or the same table. When there are multiple constraints, a row may be updated by one constraint and deleted by another constraint in the same operation. This is not allowed by default. Changing this property to false allows such violations of the Standard to pass without an exception. Used for porting from database engines that do not enforce the constraints.

                  SET DATABASE SQL TDC DELETE { TRUE | FALSE }
                   
                  sql.enforce_tdc_updatetrueenforcing triggered data change violation for updates

                  The ON DELETE and ON UPDATE clauses of foreign key constraints cause data changes in rows in different tables or the same table. With multiple constraint, a field may be updated by two constraints and set to different values. This is not allowed by default. Changing this property to false allows such violations of the Standard to pass without an exception. Used for porting from database engines that do not enforce the constraints properly.

                  SET DATABASE SQL TDC UPDATE { TRUE | FALSE }

                  Table 12.16. Use of LOB for LONGVAR Types

                  NameDefaultDescription
                  sql.longvar_is_lobfalsetranslating longvarchar and longvarbinary to lob

                  This property, when set true, causes type declarations using LONGVARCHAR and LONGVARBINARY to be translated to CLOB and BLOB respectively. By default, they are translated to VARCHAR and VARBINARY.

                  SET DATABASE SQL LONGVAR IS LOB { TRUE | FALSE }

                  Table 12.17. Concatenation with NULL

                  NameDefaultDescription
                  sql.concat_nullstruebehaviour of concatenation involving one null

                  This property, when set false, causes the concatenation of a null and a not null value to return the not null value. By default, it returns null.

                  SET DATABASE SQL CONCAT NULLS { TRUE | FALSE }

                  Table 12.18. NULL in Multi-Column UNIQUE Constraints

                  NameDefaultDescription
                  sql.unique_nullstruebehaviour of multi-column UNIQUE constraints with null values

                  This property, when set false, causes multi-column unique constrains to be more restrictive for value sets that contain a mix of null and not null values.

                  SET DATABASE SQL UNIQUE NULLS { TRUE | FALSE }

                  Table 12.19. Truncation or Rounding in Type Conversion

                  NameDefaultDescription
                  sql.convert_trunctruebehaviour of type conversion from DOUBLE to integral types

                  This property, when set false, causes type conversions from DOUBLE to any integral type to use rounding. By default truncation is used.

                  SET DATABASE SQL CONVERT TRUNCATE { TRUE | FALSE }

                  Table 12.20. Decimal Scale of Division and AVG Values

                  NameDefaultDescription
                  sql.avg_scale0decimal scale of values returned by division and the AVG and MEDIAN aggregate functions

                  By default, the result of a division or an AVG or MEDIAN aggregate has the same type and scale as the aggregated value. For INTEGER types, the scale is 0. When this property is set to a value other than the default 0, then the scale is used if it is greater than the scale of the divisor or aggregated value. This property does not affect DOUBLE values. Values between 0 - 10 can be used for this property.

                  SET DATABASE SQL AVG SCALE <numeric value>

                  Table 12.21. Support for NaN values

                  NameDefaultDescription
                  sql.double_nantruebehaviour of expressions returning DOUBLE NaN

                  This property, when set false, causes division of DOUBLE values by Zero to return a Double.NaN value. By default an exception is thrown.

                  SET DATABASE SQL DOUBLE NAN { TRUE | FALSE }

                  Table 12.22. Sort order of NULL values

                  NameDefaultDescription
                  sql.nulls_firsttrueordering of NULL values

                  By default, nulls appear before not-null values when a result set is ordered without specifying NULLS FIRST or NULLS LAST. This property, when set false, causes nulls to appear by default after not-null values in result sets with ORDER BY

                  SET DATABASE SQL NULLS FIRST { TRUE | FALSE }

                  Table 12.23. String comparison with padding

                  NameDefaultDescription
                  sql.pad_spacetrueordering of strings with trailing spaces

                  By default, when two strings are compared, he shorter string is padded with spaces before comparison. When this property is set false, no padding takes place before comparison. Without padding, the shorter string is never equal to the longer one.

                  Before version 2.0, HSQLDB used NO PAD comparison. If you need the old behaviour, use this property when opening an older database.

                  SET DEFAULT COLLATION <collation name> [ NO PAD | PAD SPACE ]

                  Table 12.24. DB2 Style Syntax

                  NameDefaultDescription
                  sql.syntax_db2falsesupport for DB2 style syntax

                  This property, when set true, allows compatibility with some aspects of this dialect.

                  SET DATABASE SQL SYNTAX DB2 { TRUE | FALSE }

                  Table 12.25. MSSQL Style Syntax

                  NameDefaultDescription
                  sql.syntax_mssfalsesupport for MS SQL Server style syntax

                  This property, when set true, switches the arguments of the CONVERT function and also allow compatibility with some other aspects of this dialect.

                  SET DATABASE SQL SYNTAX MSS { TRUE | FALSE }

                  Table 12.26. MySQL Style Syntax

                  NameDefaultDescription
                  sql.syntax_mysfalsesupport for MySQL style syntax

                  This property, when set true, enables support for TEXT and AUTO_INCREMENT types and also allow compatibility with some other aspects of this dialect.

                  SET DATABASE SQL SYNTAX MYS { TRUE | FALSE }

                  Table 12.27. Oracle Style Syntax

                  NameDefaultDescription
                  sql.syntax_orafalsesupport for Oracle style syntax

                  This property, when set true, enables support for non-standard types. It also enables DUAL, ROWNUM, NEXTVAL and CURRVAL syntax and and also allow compatibility with some other aspects of this dialect.

                  SET DATABASE SQL SYNTAX ORA { TRUE | FALSE }

                  Table 12.28. PostgreSQL Style Syntax

                  NameDefaultDescription
                  sql.syntax_pgsfalsesupport for PostgreSQL style syntax

                  This property, when set true, enables support for TEXT and SERIAL types. It also enables NEXTVAL, CURRVAL and LASTVAL syntax and also allow compatibility with some other aspects of this dialect.

                  SET DATABASE SQL SYNTAX PGS { TRUE | FALSE }

                  Database Operations Properties

                  Table 12.29. Default Table Type

                  NameDefaultDescription
                  hsqldb.default_table_typememorytype of table created with unqualified CREATE TABLE

                  The CREATE TABLE command results in a MEMORY table by default. Setting the value cached for this property will result in a cached table by default. The qualified forms such as CREATE MEMORY TABLE or CREATE CACHED TABLE are not affected at all by this property.

                  SET DATABASE DEFAULT TABLE TYPE { CACHED | MEMORY }

                  Table 12.30. Transaction Control Mode

                  NameDefaultDescription
                  hsqldb.txlocksdatabase transaction control mode

                  Indicates the transaction control mode for the database. The values, locks, mvlocks and mvcc are allowed.

                  SET DATABASE TRANSACTION CONTROL { LOCKS | MVLOCKS | MVCC }

                  Table 12.31. Default Isolation Level for Sessions

                  NameDefaultDescription
                  hsqldb.tx_levelread_commiteddatabase default transaction isolation level

                  Indicates the default transaction isolation level for each new session. The values, read_committed and serializable are allowed. Individual sessions can change their isolation level.

                  SET DATABASE DEFAULT ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE }

                  Table 12.32. Transaction Rollback in Deadlock

                  NameDefaultDescription
                  hsqldb.tx_conflict_rollbacktrueeffect of deadlock or other conflicts on transaction

                  When a transaction deadlock or other unresolvable conflict is about to happen, the current transaction is rolled back and an exception is raised. When this property is set false, the transaction is not rolled back. Only the latest action that would cause the conflict is undone and an error is returned. The property should not be changed unless the application can quickly perform an alternative statement and complete the transaction. It is provided for compatibility with other database engines which do not roll back the transaction upon deadlock.

                  SET DATABASE TRANSACTION ROLLBACK ON CONFLICT { TRUE | FALSE }

                  Table 12.33. Time Zone and Interval Types

                  NameDefaultDescription
                  hsqldb.translate_tti_typestrueusage of type codes for advanced datetime and interval types

                  If the property is true, the TIME / TIMESTAMP WITH TIME ZONE types and INTERVAL types are represented in JDBC methods of ResultSetMetaData and DatabaseMetaData as JDBC datetime types without time zone and the VARCHAR type respectively. The original type names are preserved.

                  SET DATABASE SQL TRANSLATE TTI TYPES { TRUE | FALSE }

                  Database File and Memory Properties

                  Table 12.34. Opening Database as Read Only

                  NameDefaultDescription
                  readonlyfalsereadonly database - is used to open an existing file: database

                  This property is a special property that can be added manually to the .properties file, or included in the URL or connection properties. When this property is true, the database becomes readonly. This can be used with an existing database to open it for readonly operation.

                  this property cannot be set with an SQL statement - it can be used in the .properties file

                  Table 12.35. Opening Database Without Modifying the Files

                  NameDefaultDescription
                  files_readonlyfalsereadonly files database - is used to open an existing file: database

                  This property is used similarly to the hsqldb.readonly property. When this property is true, CACHED and TEXT tables are readonly but memory tables are not. Any change to the data is not persisted to database files.

                  this property cannot be set with an SQL statement - it can be used in the .properties file

                  Table 12.36. Huge database files and tables

                  NameDefaultDescription
                  hsqldb.large_datafalseenable huge database files

                  By default, up to 2 billion rows can be stored in disk-based CACHED tables. Setting this property to true increases the limit to 512 billion rows. This property is used as a connection property.

                  this property cannot be set with an SQL statement - it can be used as a connection property for the connection that opens the database

                  Table 12.37. Temporary Result Rows in Memory

                  NameDefaultDescription
                  hsqldb.result_max_memory_rows0storage of temporary results and tables in memory or on disk

                  This property can be set to specify how many rows of each results or temporary table are stored in memory before the table is written to disk. The default is zero and means data is always stored in memory. If this setting is used, it should be set above 1000.

                  SET DATABASE DEFAULT RESULT MEMORY ROWS <numeric value>

                  Table 12.38. Event Logging

                  NameDefaultDescription
                  hsqldb.applog0application logging level

                  The default level 0 indicates no logging. Level 1 results in minimal logging, including any failures. Level 2 indicates all events, including ordinary events. LEVEL 3 adds details of some of the normal operations. The events are logged in a file ending with ".app.log".

                  SET DATABASE EVENT LOG LEVEL { 0 | 1 | 2 | 3}

                  Table 12.39. SQL Logging

                  NameDefaultDescription
                  hsqldb.sqllog0sql logging level - can also be used to open an existing file: database

                  The default level 0 indicates no logging. Level 1 currently logs only commits and rollbacks. Level 2 currently logs all the SQL statements executed, together with their parameter values. Level 3 will be supported in the future. The events are logged in a file ending with ".sql.log". This property applies to existing file: databases as well as new databases.

                  SET DATABASE EVENT LOG SQL LEVEL { 0 | 1 | 2 }

                  Table 12.40. Rows Cached In Memory

                  NameDefaultDescription
                  hsqldb.cache_free_count512maximum number of unused space recovery

                  The default indicates 512 unused spaces are kept for later use. The value can range between 0 - 8096.

                  When rows are deleted, the space is recovered and kept for reuse for new rows. If too many rows are deleted, the smaller recovered spaces are lost and the largest ones are retained for later use. Normally there is no need to set this property.

                  this property cannot be set with an SQL statement

                  Table 12.41. Rows Cached In Memory

                  NameDefaultDescription
                  hsqldb.cache_rows50000maximum number of rows in memory cache

                  Indicates the maximum number of rows of cached tables that are held in memory.

                  The value can range between 100- 4 billion. If the value is set via SET FILES then it becomes effective after the next database SHUTDOWN or CHECKPOINT.

                  SET FILES CACHE ROWS <numeric value>

                  Table 12.42. Size of Rows Cached in Memory

                  NameDefaultDescription
                  hsqldb.cache_size10000memory cache size

                  Indicates the total size (in kilobytes) of rows in the memory cache used with cached tables. This size is calculated as the binary size of the rows, for example an INTEGER is 4 bytes. The actual memory size used by the objects is 2 to 4 times this value. This depends on the types of objects in database rows, for example with binary objects the factor is less than 2, with character strings, the factor is just over 2 and with date and timestamp objects the factor is over 3.

                  The value can range between 100 KB - 4 GB. The default is 10,000, representing 10,000 kilobytes. If the value is set via SET FILES then it becomes effective after the next database SHUTDOWN or CHECKPOINT.

                  SET FILES CACHE SIZE <numeric value>

                  Table 12.43. Size Scale of Disk Table Storage

                  NameDefaultDescription
                  hsqldb.cache_file_scale32unit used for storage of rows in the .data file

                  The default value corresponds to a maximum size of 64 GB for the .data file. This can be increased to 64, 128, 256, 512, or 1024 resulting in up to 2 TB GB storage. Settings below 32 in older databases are preserved until a SHUTDOWN COMPACT.

                  SET FILES SCALE <numeric value>

                  Table 12.44. Size Scale of LOB Storage

                  NameDefaultDescription
                  hsqldb.lob_file_scale32unit used for storage of lobs in the .lobs file

                  The default value represents units of 32KB. When the average size of individual lobs in the database is smaller, a smaller unit can be used to reduce the overall size of the .lobs file. Values 1, 2, 4, 8, 16, 32 can be used.

                  SET FILES LOB SCALE <numeric value>

                  Table 12.45. Internal Backup of Database Files

                  NameDefaultDescription
                  hsqldb.inc_backuptrueincremental backup of data file

                  During updates, the contents of the .data file are modified. When this property is true, the modified contents are backed up gradually. This causes a marginal slowdown in operations, but allows fast checkpoint and shutdown.

                  When the property is false, the .data file is backed up entirely at the time of checkpoint and shutdown. Up to version 1.8, HSQLDB supported only full backup.

                  SET FILES BACKUP INCREMENT { TRUE | FALSE }

                  Table 12.46. Use of Lock File

                  NameDefaultDescription
                  hsqldb.lock_filetrueuse of lock file - can also be used with an existing database

                  By default, a lock file is created for each file database that is opened for read and write. This property can be specified with the value false to prevent the lock file from being created. This usage is not recommended but may be desirable when flash type storage is used. This property applies to existing file: databases as well as new databases.

                  this property cannot be set with an SQL statement

                  Table 12.47. Logging Data Change Statements

                  NameDefaultDescription
                  hsqldb.log_datatruelogging data change

                  This property can be set to false when database recovery in the event of an unexpected crash is not necessary. A database that is used as a temporary cache is an example. Regardless of the value of this property, if there is a proper shutdown of the database, all the changed data is stored. A checkpoint or shutdown still rewrites the .script file and saves the .backup file according to the other settings.

                  SET FILES LOG  { TRUE | FALSE }

                  Table 12.48. Automatic Checkpoint Frequency

                  NameDefaultDescription
                  hsqldb.log_size50size of log when checkpoint is performed

                  The value is the size (in megabytes) that the .log file can reach before an automatic checkpoint occurs. A checkpoint rewrites the .script file and clears the .log file.

                  SET FILES LOG SIZE <numeric value>

                  Table 12.49. Automatic Defrag at Checkpoint

                  NameDefaultDescription
                  hsqldb.defrag_limit0percentage of unused space causing a defrag at checkpoint

                  When a checkpoint is performed, the percentage of wasted space in the .data file is calculated. If the wasted space is above the specified limit, a defrag operation is performed. The default is 0, which means no automatic checkpoint. The numeric value must be between 0 and 100 and is interpreted as a percentage of the current size of the .data file.

                  SET FILES DEFRAG <numeric value>

                  Table 12.50. Logging Data Change Statements Frequency

                  NameDefaultDescription
                  hsqldb.write_delaytruewrite delay for writing and performing sync() of log file entries

                  If the property is true, the default WRITE DELAY property of the database is used, which is 500 milliseconds. If the property is false, the WRITE DELAY is set to 0 seconds. The SQL command for this property allows more precise control over the property.

                  SET FILES WRITE DELAY {{ TRUE | FALSE } | <seconds value> | <milliseconds value> MILLIS

                  Table 12.51. Logging Data Change Statements Frequency

                  NameDefaultDescription
                  hsqldb.write_delay_millis500write delay for writing log file entries

                  If the property is used, the WRITE DELAY property of the database is set the given value in milliseconds. The SQL command for this property allows the same level of control over the property.

                  SET FILES WRITE DELAY {{ TRUE | FALSE } | <seconds value> | <milliseconds value> MILLIS

                  Table 12.52. Use of NIO for Disk Table Storage

                  NameDefaultDescription
                  hsqldb.nio_data_filetrueuse of nio access methods for the .data file

                  Setting this property to false will avoid the use of nio access methods, resulting in somewhat reduced speed. If the data file is larger than hsqldb.nio_max_size (default 256MB) when it is first opened (or when its size is increased), nio access methods are not used. Also, if the file gets larger than the amount of available computer memory that needs to be allocated for nio access, non-nio access methods are used.

                  SET FILES NIO { TRUE | FALSE }

                  Table 12.53. Use of NIO for Disk Table Storage

                  NameDefaultDescription
                  hsqldb.nio_max_size256nio buffer size limit

                  The maximum size of .data file in mega bytes that can use the nio access method. When the file gets larger than this limit, non-nio access methods are used. Values 64, 128, 256, 512, 1024, and larger multiples of 512 can be used. The default is 256MB.

                  SET FILES NIO SIZE <numeric value>

                  Table 12.54. Recovery Log Processing

                  NameDefaultDescription
                  hsqldb.full_log_replayfalserecovery log processing

                  The .log file is processed during recovery after a forced shutdwon. Out of memory conditions always abort the startup. Any other exception stops the processing of the .log file and by default, continues the startup process. If this property is true, the startup process is stopped if any exception occurs. Exceptions are usually caused by incomplete lines of SQL statements near the end of the .log file, which were not fully synced to disk when an abnormal shutdown occurred.

                  This property cannot be set with an SQL statement

                  Table 12.55. Default Properties for TEXT Tables

                  NameDefaultDescription
                  textdb.*0default properties for new text tables

                  Properties that override the database engine defaults for newly created text tables. Settings in the text table SET <tablename> SOURCE <source string> command override both the engine defaults and the database properties defaults. Individual textdb.* properties are listed in the Text Tables chapter.


                  Table 12.56. Forcing Garbage Collection

                  NameDefaultDescription
                  runtime.gc_interval0forced garbage collection

                  This setting forces garbage collection each time a set number of result set row or cache row objects are created. The default, "0" means no garbage collection is forced by the program.

                  SET DATABASE GC <numeric value>

                  Crypt Properties

                  Table 12.57. Crypt Property For LOBs

                  NameDefaultDescription
                  crypt_lobsfalseencryption of lobs

                  If the property is true, the contents of the .lobs file is encrypted as well.

                  this property cannot be set with an SQL statement

                  Table 12.58. Cipher Key for Encrypted Database

                  NameDefaultDescription
                  crypt_keynoneencryption

                  The cipher key for an encrypted database.

                  this property cannot be set with an SQL statement

                  Table 12.59. Crypt Provider Encrypted Database

                  NameDefaultDescription
                  crypt_providernoneencryption

                  The fully-qualified class name of the cryptography provider. This property is not used for the default security provider.

                  this property cannot be set with an SQL statement

                  Table 12.60. Cipher Specification for Encrypted Database

                  NameDefaultDescription
                  crypt_typenoneencryption

                  The cipher specification.

                  this property cannot be set with an SQL statement

                  When connecting to an in-process database creates a new database, or opens an existing database (i.e. it is the first connection made to the database by the application), all the user-defined database properties listed in this section can be specified as URL properties.

                  When HSQLDB is used with OpenOffice.org as an external database, the property "default_schema=true" must be set on the URL, otherwise the program will not operate correctly as it does with its built-in hsqldb instance.

                  System Properties

                  A few system properties are used by HyperSQL. These are set on the Java command line or by calling System.setProperty() from the user's program. They are not valid as URL or connection properties.

                  Table 12.61. Logging Framework

                  NameDefaultDescription
                  hsqldb.reconfig_loggingtrueconfiguring the framework logging

                  Setting this system property false avoids reconfiguring the framework logging system such as Log4J or java.util.Logging. If the property does not exist or is true, reconfiguration takes place.


                  Table 12.62. Text Tables

                  NameDefaultDescription
                  textdb.allow_full_pathfalsetext table file locations

                  Setting this system property true allows text table sources to be opened on all available paths. By default, only the database directory and its subdirectories are allowed. See the Text Tables chapter.


                  Table 12.63. Java Functions

                  NameDefaultDescription
                  hsqldb.method_class_namesnoneallowed Java classes

                  This property needs to be set with the names (including wildcards) of Java classes that can be used for routines based on Java static methods. See the SQL Invoked Routines chapter.


                  Chapter 13. HyperSQL Network Listeners (Servers)

                  Server, WebServer, and Servlet

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 4903 $

                  Copyright 2002-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  Listeners

                  As described in the Running and Using HyperSQL chapter, network listeners (servers) provide connectivity to catalogs from different JVM processes. The HyperSQL listeners support both ipv4 and ipv6 network addressing.

                  HyperSQL Server

                  This is the preferred way of running a database server and the fastest one. This mode uses the proprietary hsql: communications protocol. The following example of the command for starting the server starts the server with one (default) database with files named "mydb.*" and the public name (alias) of "xdb".

                      java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:mydb --dbname.0 xdb

                  Alternatively, a server.properties file can be used for passing the arguments to the server. This file must be located in the directory where the command is issued.

                      java -cp ../lib/hsqldb.jar org.hsqldb.server.Server

                  Alternatively, you can specify the path of the server.properties file on the command line. In this case, the properties file can have any name or extension, but it should be a valid properties file.

                      java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --props myserver.props

                  Use the --help argument to see the list of available arguments.

                      java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --help

                  The contents of the server.properties file is described in the next section.

                  HyperSQL HTTP Server

                  This method of access is used when the computer hosting the database server is restricted to the HTTP protocol. The only reason for using this method of access is restrictions imposed by firewalls on the client or server machines and it should not be used where there are no such restrictions. The HyperSQL HTTP Server is a special web server that allows JDBC clients to connect via HTTP. The server can also act as a small general-purpose web server for static pages.

                  To run an HTTP server, replace the main class for the server in the example command line above with the following:

                      java -cp ../lib/hsqldb.jar org.hsqldb.server.WebServer

                  The contents of the server.properties file is described in the next section.

                  HyperSQL HTTP Servlet

                  This method of access also uses the HTTP protocol. It is used when a separate servlet engine (or application server) such as Tomcat or Resin provides access to the database. The Servlet Mode cannot be started independently from the servlet engine. The Servlet class, in the HSQLDB jar, should be installed on the application server to provide the connection. The database is specified using an application server property. Refer to the source file src/org/hsqldb/server/Servlet.java to see the details.

                  Both HTTP Server and Servlet modes can only be accessed using the JDBC driver at the client end. They do not provide a web front end to the database. The Servlet mode can serve only a single database.

                  Please note that you do not normally use this mode if you are using the database engine in an application server. In this situation, connections to a catalog are usually made in-process, or using an external HSQL Server instance.

                  Server and Web Server Properties

                  Properties files for running the servers are not created automatically. You should create your own files that contain server.property=value pairs for each property. The server.properties or webserver.properties files must be located in the directory where the command to run the org.hsqldb.server.Server class is issued.

                  In all properties files, values are case-sensitive. All values apart from names of files or pages are required in lowercase (e.g. server.silent=FALSE will have no effect, but server.silent=false will work). Supported properties and their default values (if any) are as follows:

                  Table 13.1. common server and webserver properties

                  ValueDefaultDescription
                  server.database.0file:testthe catalog type, path and file name of the first database file to use
                  server.dbname.0""lowercase server alias for the first database file
                  server.database.nNO DEFAULTthe catalog type, path and file name of the n'th database file in use
                  server.dbname.nNO DEFAULTlowercase server alias for the n'th database file
                  server.silenttrueno extensive messages displayed on console
                  server.tracefalseJDBC trace messages displayed on console
                  server.addressNO DEFAULTIP address of server
                  server.tlsfalseWhether to encrypt network stream. If this is set to true, then in normal situations you will also need to set properties system.javax.net.ssl.keyStore and system.javax.net.ssl.keyStorePassword, as documented elsewhere. The value of server.tls impacts the default value of server.port.
                  server.daemonfalseWhether the server is run as a daemon
                  server.remote_openfalseAllows opening a database path remotely when the first connection is made

                  In HyperSQL version 2.0, each server can serve an unlimited number of databases simultaneously. The server.database.0 property defines the filename / path whereas the server.dbname.0 defines the lowercase alias used by clients to connect to that database. The digit 0 is incremented for the second database and so on. Values for the server.database.n property can use the mem:, file: or res: prefixes and connection properties as discussed under CONNECTIONS. For example,

                      database.0=mem:temp;sql.enforce_strict_size=true;

                  Properties or default values specific to server.properties are:

                  Table 13.2. server properties

                  ValueDefaultDescription
                  server.port9001 (normal) or 554 (if TLS encrypted)TCP/IP port used for talking to clients. All databases are served on the same port.
                  server.no_system_exittrueno System.exit() call when the database is closed

                  Properties or default values specific to webserver.properties are:

                  Table 13.3. webserver properties

                  ValueDefaultDescription
                  server.port80 (normal) or 443 (if TLS encrypted)TCP/IP port used for talking to clients
                  server.default_pageindex.htmlthe default web page for server
                  server.root./the location of served pages
                  .<extension>NO DEFAULTmultiple entries such as .html=text/html define the mime types of the static files served by the web server. See the source for src/org/hsqldb/server/WebServer.java for a list.

                  An example of the contents of a server.properties file is given below:

                      server.database.0=file:/opt/db/accounts
                      server.dbname.0=accounts
                  
                      server.database.1=file:/opt/db/mydb
                      server.dbname.1=enrolments
                  
                      server.database.2=mem:adatabase
                      server.dbname.2=quickdb

                  In the above example, the server.properties file indicates that the server provides access to 3 different databases. Two of the databases are file-based, while the third is all-in-memory. The aliases for the databases that the users connect to are accounts, enrolments and quickdb.

                  All the above properties and their values can be specified on the command line to start the server by omitting the server. prefix. If a property/value pair is specified on the command line, it overrides the property value specified in the server.properties or webserver.properties file.

                  [Note]Note

                  Upgrading: If you have existing custom properties files, change the values to the new naming convention. Note the use of digits at the end of server.database.n and server.dbname.n properties.

                  Starting a Server from your Application

                  If you want to start the server from within your application, as opposed to the command line or batch files, you should create an instance of Server or Web Server, then assign the properties and start the Server. An working example of this can be found in the org.hsqldb.test.TestBase source. The example below sets the same properties as in the server.properties file example.

                      HsqlProperties p = new HsqlProperties();
                      p.setProperty("server.database.0","file:/opt/db/accounts");
                      p.setProperty("server.dbname.0","an_alias");
                      // set up the rest of properties
                  
                      // alternative to the above is
                      Server server = new Server();
                      server.setProperties(p);
                      server.setLogWriter(null); // can use custom writer
                      server.setErrWriter(null); // can use custom writer
                      server.start();
                  

                  The Server object has several alternative methods for setting databases and their public names. The server should be shutdown using the shutdown() method.

                  Allowing a Connection to Open or Create a Database

                  If the server.remote_open property is true, the Server works differently from the normal mode. In this mode, it is not necessary to have any databases listed as server.database.0 etc. in the Server startup properties. If there are databases listed, they are opened as normal. The server does not shutdown when the last database is closed.

                  In this mode, a connection can be established to a database that is not open or does not exist. The server will open the database or create it, then return a connection to the database.

                  The connection URL must include the path to the database, separated with a semicolon from the alias. In the example below, the database path specified as file:C:/files/mydatabase is opened and the database alias xdb is assigned to the database. After this, the next connection to the specified alias will connect to the same database. The database path can also point to a mem: database. If you use database properties on the URL, these properties are used when the new database is created. If no database properties are used on the URL, you can also specify the path with filepath=<path>. Examples below:

                  Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb;file:C:/files/mydatabase", "SA", "");
                  Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb;mem:test;sql.enforce_types=true", "SA", "");
                  Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb;filepath=file:C:/files/mydatabase", "SA", "");
                  

                  The path can be a file: or mem: database.

                  Specifying Database Properties at Server Start

                  Each database started by a Server has its own URL. When new databases are created by the server, the database properties for each of the new database can be appended to the database URL. Examples below:

                  // example in server.propertie file
                      server.database.0=file:/opt/db/accounts;hsqldb.default_table_type=cached;sql.enforce_names=true
                      server.dbname.0=accounts
                  
                  // example for setting the property programatically
                      HsqlProperties p = new HsqlProperties();
                      p.setProperty("server.database.0","file:/opt/db/accounts;hsqldb.default_table_type=cached;sql.enforce_names=true");
                  

                  The specified properties apply only to a new database. They have no effect on an existing database apart from a few properties such as readonly listed in the Properties chapter.

                  TLS Encryption

                  Listener TLS Support (a. k. a. SSL)

                  Blaine Simpson

                  The HSQL Development Group

                  $Revision: 4903 $

                  2012-08-06 00:09:15+0100

                  This section explains how to encrypt the stream between JDBC network clients and HyperSQL Listeners. If you are running an in-process (non-Listener) setup, this chapter does not apply to you.

                  Requirements

                  Hsqldb TLS Support Requirements

                  • Sun Java 2.x and up. (This is probably possible with IBM's Java, but I don't think anybody has attempted to run HSQLDB with TLS under IBM's Java, and I'm sure that nobody in the HSQLDB Development Group has documented how to set up the environment).

                  • If Java 2.x or 3.x, then you will need to install JSSE. Your server and/or client will start up much slower than that of Java 4.x users. Client-side users will not be able to use the https: JDBC protocol (because the https protocol handler is not implemented in 2.x/3.x Java JSSE; if there is demand, we could work around this).

                  • A JKS keystore containing a private key, in order to run a Listener.

                  • If you are running the listener side, then you'll need to run a HSQLDB Server or WebServer Listener instance. It doesn't matter if the underlying database catalogs are new, and it doesn't matter if you are making a new Listener configuration or encrypting an existing Listener configuration. (You can turn encryption on and off at will).

                  • You need a HSQLDB jar file that was built with JSSE present. If you obtained your HSQLDB 1.7.2-or-later distribution from us, you are all set, because we build with Java 1.4 or later (which contains JSSE). If you build your own jar file with Java 1.3, make sure to install JSSE first.

                  Encrypting your JDBC connection

                  At this time, only 1-way, server-cert encryption is tested.

                  Client-Side

                  Just use one of the following protocol prefixes.

                  Hsqldb TLS URL Prefixes

                  • jdbc:hsqldb:hsqls://

                  • jdbc:hsqldb:https://

                  At this time, the latter will only work for clients running with Java 1.4 or later.

                  If the listener you wish to connect to is using a certificate approved by your default trust keystore, then there is nothing else to do. If not, then you need to tell Java to "trust" the server cert. (It's a slight over-simplification to say that if the server certificate was purchased, then you are all set; if somebody "signed their own" certificate by self-signing or using a private ca certificate, then you need to set up trust).

                  First, you need to obtain the cert (only the "public" part of it). Since this cert is passed to all clients, you could obtain it by writing a Java client that dumps it to file, or perhaps by using openssl s_client. Since in most cases, if you want to trust a non-commercial cert, you probably have access to the server keystore, I'll show an example of how to get what you need from the server-side JKS keystore.

                  You may already have an X509 cert for your server. If you have a server keystore, then you can generate a X509 cert like this.

                  Example 13.1. Exporting certificate from the server's keystore

                      keytool -export -keystore server.store -alias existing_alias -file server.cer


                  In this example, server.cer is the X509 certificate that you need for the next step.

                  Now, you need to add this cert to one of the system trust keystores or to a keystore of your own. See the Customizing Stores section in JSSERefGuide.html to see where your system trust keystores are. You can put private keystores anywhere you want to. The following command will add the cert to an existing keystore, or create a new keystore if client.store doesn't exist.

                  Example 13.2. Adding a certificate to the client keystore

                      keytool -import -trustcacerts -keystore trust.store -alias new_alias -file server.cer

                  If you are making a new keystore, you probably want to start with a copy of your system default keystore which you can find somewhere under your JAVA_HOME directory (typically jre/lib/security/cacerts for a JDK, but I forget exactly where it is for a JRE).

                  Unless your OS can't stop other people from writing to your files, you probably do not want to set a password on the trust keystore.

                  If you added the cert to a system trust store, then you are finished. Otherwise you will need to specify your custom trust keystore to your client program. The generic way to set the trust keystore is to set the system property javax.net.ssl.trustStore every time that you run your client program. For example

                  Example 13.3. Specifying your own trust store to a JDBC client

                      java -Djavax.net.ssl.trustStore=/home/blaine/trust.store -jar /path/to/hsqldb.jar dest-urlid


                  This example runs the program SqlTool. SqlTool has built-in TLS support however, so, for SqlTool you can set truststore on a per-urlid basis in the SqlTool configuration file.

                  Note: The hostname in your database URL must match the Common Name of the server's certificate exactly. That means that if a site certificate is admc.com, you can not use jdbc:hsqldb:hsqls://localhost or jdbc:hsqldb:hsqls://www.admc.com:1100 to connect to it.

                  If you want more details on anything, see JSSERefGuide.html on Sun's site, or in the subdirectory docs/guide/security/jsse of your Java SE docs.

                  Server-Side (Listener-Side)

                  Get yourself a JKS keystore containing a private key. Then set properties server.tls, system.javax.net.ssl.keyStore and system.javax.net.ssl.keyStorePassword in your server.properties or webserver.properties file. Set server.tls to true, system.javax.net.ssl.keyStore to the path of the private key JKS keystore, and system.javax.net.ssl.keyStorePassword to the password (of both the keystore and the private key record-- they must be the same). If you specify relative file path values, they will be resolved relative to the ${user.dir} when the JRE is started.

                  [Caution]Caution

                  If you set any password in a .properties (or any other) file, you need to restrict access to the file. On a good operating system, you can do this like so:

                      chmod 600 path/to/server.properties

                  The values and behavior of the system.* settings above match the usage documented for javax.net.ssl.keyStorePassword and javax.net.ssl.keyStore in the JSSE docs.

                  [Note]Note

                  Before version 2.0, HyperSQL depended on directly setting the corresponding JSSE properties. The new idiom is more secure and easier to manage. If you have an old password in a UNIX init script config file, you should remove it.

                  JSSE

                  If you are running Java 4.x or later, then you are all set. Java 1.x users, you are on your own (Sun does not provide a JSSE that will work with 1.x). Java 2.x and 3.x users continue...

                  Go to http://java.sun.com/products/jsse/index-103.html If you agree to the terms and meet the requirements, download the domestic or global JSSE software. All you need from the software distro is the three jar files. If you have a JDK installation, then move the 3 jar files into the directory $JAVA_HOME/jre/lib/ext. If you have a JRE installation, then move the 3 jar files into the directory $JAVA_HOME/lib/ext.

                  Pretty painless.

                  Making a Private-key Keystore

                  There are two main ways to do this. Either you can use a certificate signed by a certificate authority, or you can make your own. One thing that you need to know in both cases is, the Common Name of the cert has to be the exact hostname that JDBC clients will use in their database URL.

                  CA-Signed Cert

                  I'm not going to tell you how to get a CA-signed SSL certificate. That is well documented at many other places.

                  Assuming that you have a standard pem-style private key certificate, here's how you can use openssl and the program DERImport to get it into a JKS keystore.

                  Because I have spent a lot of time on this document already, I am just giving you an example.

                  Example 13.4. Getting a pem-style private key into a JKS keystore

                      openssl pkcs8 -topk8 -outform DER -in Xpvk.pem -inform PEM -out Xpvk.pk8 -nocrypt
                  
                      openssl x509 -in Xcert.pem -out Xcert.der -outform DER
                  
                      java DERImport new.keystore NEWALIAS Xpvk.pk8 Xcert.der

                  [Important]Important

                  Make sure to set the password of the key exactly the same as the password for the keystore!

                  You need the program DERImport.class of course. Do some internet searches to find DERImport.java or DERImport.class and download it.

                  If DERImport has become difficult to obtain, I can write a program to do the same thing-- just let me know.

                  Non-CA-Signed Cert

                  Run man keytool or see the Creating a Keystore section of JSSERefGuide.html.

                  Automatic Server or WebServer startup on UNIX

                  If you are on UNIX and want to automatically start and stop a Server or WebServer running with encryption, set the system.javax.net.ssl.keyStore and system.javax.net.ssl.keyStorePassword properties as instructed above, and follow the instructions in the HyperSQL on UNIX chapter, paying close attention to the TLS-related comments in the template config file.

                  If you are using a private server certificate, make sure to also set the trust store filepath for relevant urlids in your RC file, as explained in the sample config file.

                  Network Access Control

                  (Server ACLs)

                  JDBC connections will always be denied if the supplied user and password are not found in the target catalog. But an HyperSQL listener can also restrict access at the listener level, even protecting private catalogs which have insecure (or default) passwords. If you have an in-process setup, this section of the Guide doesn't apply to you.

                  Many (in fact, most) distributed database applications don't have application clients connect directly to the database, but instead encapsulate access in a controlling process. For example, a web app will usually access the data source on behalf of users, with end-user web browsers never accessing the database directly. In these cases and others, the security benefits of restricting listener access to specific source addresses is well worth the effort. ACLs work by restricting access according to the source address of the incoming connection request. This is efficient because the database engine never even gets the request until it is approved by the ACL filter code.

                  The sample file sample/acl.txt in your HyperSQL distribution explains how to write an ACL file.

                  # $Id: acl.txt 826 2009-01-17 05:04:52Z unsaved $
                  
                  # Sample HyperSQL Network Listener ACL file.
                  # Specify "allow" and "deny" rules
                  # For address specifications, individual addresses, host names, and
                  # network addresses with /bit suffix are allowed, but read the caveat about
                  # host names below, under the sample "localhost" rule.
                  
                  # Blank lines ignored.
                     # Lines with # as the first non-whitespace character are ignored.
                  
                  
                  allow 2001:db8::/32
                  # Allow this 32-bit ipv4 subnet
                  
                  allow localhost
                  # You should use numerical addresses in ACL files, unless you are certain that
                  # the name will always be known to your network address resolution system
                  # (assume that you will lose Internet connectivity at some time).
                  # With a default name resolution setup on UNIX, you are safe to use names
                  # defined in your /etc/hosts file.
                  
                  deny 192.168.101.253
                  # Deny a single IP address.
                  # In our example, 192.168.101.0/24 is our local, organizational network.
                  # 192.168.101.253 is the IP address of our Intern's PC.
                  # The Intern does not have permission to access our databases directly.
                  
                  allow 192.168.101.0/24
                  
                  # Any ipv4 or ipv6 candidate address not matched above will be denied
                  

                  You put your file wherever it is convenient for you, and specify that path with the property server.acl or webserver.acl in your server.properties or webserver.properties file (depending on whether your listener instance is a Server or WebServer). You can specify the ACL file path with an absolute or relative path. If you use a relative path, it must be relative to the .properties file. It's often convenient to name the ACL file acl.txt, in the same directory as your .properties file and specify the property value as just acl.txt. This file name is intuitive, and things will continue to work as expected if you move or copy the entire directory.

                  [Warning]Warning

                  If your Server or WebServer was started with a *.acl property, changes afterwards to the ACL file will be picked up immediately by your listener instance. You are advised to use the procedure below to prevent partial edits or mistakes from crippling your running server.

                  When you edit your ACL file, it is both more convenient and more secure to test it as explained here before activating it. You could, of course, test an ACL file by editing it in-place, then trying to connect to your listener with JDBC clients from various source addresses. Besides being mightily laborious and boring, with this method it is very easy to accidentally open access to all source addresses or to deny access to all users until you fix incorrect ACL entries.

                  The suggested method of creating or changing ACLs is to work with an inactive file (for new ACL files, just don't enable the *.acl property yet; for changing an existing file, just copy it to a temporary file and edit the temporary file). Then use the ServerAcl class to test it.

                  Example 13.5. Validating and Testing an ACL file

                      java -cp path/to/hsqldb.jar org.hsqldb.server.ServerAcl path/to/acl.txt


                  If the specified ACL file fails validation, you will be given details about the problem. Otherwise, the validated rules will be displayed (including the implicit, default deny rules). You then type in host names and addresses, one-per-line. Each name or address is tested as if it were a HyperSQL network client address, using the same exact method that the HyperSQL listener will use. (HyperSQL listeners use this same ServerAcl class to test incoming source addresses). ServerAcl will report the rule which matches and whether access is denied or allowed to that address.

                  If you have edited a copy of an existing ACL file (as suggested above), then overwrite your live ACL file with your new, validated ACL file. I.e., copy your temp file over top of your live ACL file.

                  ServerAcl can be run in the same exact way described above, to troubleshoot runtime access issues. If you use an ACL file and a user or application can't get a connection to the database, you can run ServerAcl to quickly and definitively find if the client is being prohibited by an ACL rule.

                  Chapter 14. HyperSQL on UNIX

                  How to quickly get a HyperSQL (aka HSQLDB) Listener up and running on UNIX, including Mac OS X

                  Blaine Simpson

                  The HSQL Development Group

                  $Revision: 4907 $

                  2012-08-06 00:09:15+0100

                  Purpose

                  This chapter explains how to quickly install, run, and use a HyperSQL Listener (aka Server) on UNIX.

                  Note that, unlike a traditional database server, there are many use cases where it makes sense to run HyperSQL without any listener. This type of setup is called in-process, and is not covered here, since there is no UNIX-specific setup in that case.

                  I intend to cover what I think is the most common UNIX setup: To run a multi-user, externally-accessible catalog with permanent data persistence. (By the latter I mean that data is stored to disk so that the catalog data will persist across process shutdowns and startups). I also cover how to run the Listener as a system daemon.

                  When I give sample shell commands below, I use commands which will work in Bourne-compatible shells, including Bash and Korn. Users who insist on using the inferior C-shells will need to convert.

                  Installation

                  Go to http://sourceforge.net/projects/hsqldb and click on the "files" link. You want the current version. I can't be more specific because SourceForge/Geeknet are likely to continue changing their interface. See if there's a distribution for the current HSQLDB version in the format that you want.

                  If you want a binary package and we either don't provide it, or you prefer somebody else's build, you should still find out the current version of HyperSQL available at SourceForge. It's very likely that you can find a binary package for your UNIX variant with your OS distributor, http://www.jpackage.org/, http://sunfreeware.com/, etc. Nowadays, most UNIXes have software package management systems which check Internet repositories. Just search the repositories for "hsqldb" and "hypersql". The challenge is to find an up-to-date package. You will get better features and support if you work with the current stable release of HyperSQL. (In particular, HyperSQL version 2.0.0 added tons of new features). Pay attention to what JVM versions your binary package supports. Our builds (version 2.0 and later) document the Java version it was built with in the file doc/index.html, but you can't depend on this if somebody else assembled your distribution. Java jar files are generally compatible with the same or greater major versions. For example,if your hsqldb.jar was built with Java 1.3.6-11, then it is compatible with Java versions 1.3.* and greater.

                  [Note]Note

                  It could very well happen that some of the file formats which I discuss below are not in fact offered. If so, then we have not gotten around to building them.

                  Binary installation depends on the package format that you downloaded.

                  Installing from a .pkg.Z file

                  This package is only for use by a Solaris super-user. It's a System V package. Download then uncompress the package with uncompress or gunzip

                      uncompress filename.pkg.Z

                  You can read about the package by running

                      pkginfo -l -d filename.pkg

                  Run pkgadd as root to install.

                      pkgadd -d filename.pkg

                  Installing from a BSD Port or Package

                  You're on your own. I find everything much easier when I install software to BSD without their package management systems.

                  Installing from a .rpm file

                  Just skip this section if you know how to install an RPM. If you found the RPM using a software management system, then just have it install it. The remainder of item explains a generic command-line method which should work with any Linux variant. After you download the rpm, you can read about it by running

                      rpm -qip /path/to/file.rpm

                  Rpms can be installed or upgraded by running

                      rpm -Uvh /path/to/file.rpm

                  as root. Suse users may want to keep Yast aware of installed packages by running rpm through Yast: yast2 -i /path/to/file.rpm.

                  Installing from a .zip file

                  Extract the zip file in an ancestor directory of the new HSQLDB home. You don't need to create the HSQLDB_HOME directory because the extraction will create a version-labelled directory, and the subdirectory "hsqldb". This "hsqldb" directory is your HSQLDB_HOME, and you can move it to wherever you wish. If you will be upgrading or maintaining multiple versions of HyperSQL, you will want to retain the version number in the directory tree somehow.

                      cd ancestor/of/new/hsqldb/home
                      unzip /path/to/file.zip

                  All the files in the zip archive will be extracted to underneath a new subdirectory named like hsqldb-2.0.2a/hsqldb.

                  Take a look at the files you installed. (Under hsqldb for zip file installations. Otherwise, use the utilities for your packaging system). The most important file of the HyperSQL system is hsqldb.jar, which resides in the subdirectory lib. Depending on who built your distribution, your file name may have a version label in it, like hsqldb-1.2.3.4.jar.

                  [Important]Important

                  For the purposes of this chapter, I define HSQLDB_HOME to be the parent directory of the lib directory that contains hsqldb.jar. E.g., if your path to hsqldb.jar is /a/b/hsqldb/lib/hsqldb.jar, then your HSQLDB_HOME is /a/b/hsqldb.

                  Furthermore, unless I state otherwise, all local file paths that I give are relative to the HSQLDB_HOME.

                  If the description of your distribution says that the hsqldb.jar file will work for your Java version, then you are finished with installation. Otherwise you need to build a new hsqldb.jar file.

                  If you followed the instructions above and you still don't know what Java version your hsqldb.jar supports, then try reading documentation files like readme.txt, README.TXT, INSTALL.txt etc. (As I said above, our newer distributions always document the Java version for the build, in the file doc/index.html). If that still doesn't help, then you can just try your hsqldb.jar and see if it works, or build your own.

                  To use the supplied hsqldb.jar, just skip to the next section of this document. Otherwise build a new hsqldb.jar.

                  Procedure 14.1. Building hsqldb.jar

                  1. If you don't already have Ant, download the latest stable binary version from http://ant.apache.org. cd to where you want Ant to live, and extract from the archive with

                        unzip /path/to/file.zip

                    or

                        tar -xzf /path/to/file.tar.gz

                    or

                        bunzip2 -c /path/to/file.tar.bz2 | tar -xzf -

                    Everything will be installed into a new subdirectory named apache-ant- + version. You can rename the directory after the extraction if you wish.

                  2. Set the environmental variable JAVA_HOME to the base directory of your Java JRE or SDK, like

                        export JAVA_HOME; JAVA_HOME=/usr/java/j2sdk1.4.0

                    The location is entirely dependent upon your variety of UNIX. Sun's rpm distributions of Java normally install to /usr/java/something. Sun's System V package distributions of Java (including those that come with Solaris) normally install to /usr/something, with a sym-link from /usr/java to the default version (so for Solaris you will usually set JAVA_HOME to /usr/java).

                  3. Remove the existing file HSQLDB_HOME /lib/hsqldb.jar.

                  4. cd to HSQLDB_HOME/build. Make sure that the bin directory under your Ant home is in your search path. Run the following command.

                        ant hsqldb

                    This will build a new HSQLDB_HOME/lib/hsqldb.jar.

                  See the Building HyperSQL Jars appendix if you want to build anything other than hsqldb.jar with all default settings.

                  Setting up a HyperSQL Persistent Database Catalog and a HyperSQL Network Listener

                  If you installed from an OS-specific package, you may already have a catalog and listener pre-configured. See if your package includes a file named server.properties (make use of your packaging utilities). If you do, then I suggest that you still read this section while you poke around, in order to understand your setup.

                  1. Select a UNIX user to run the database process (JVM) as. If this database is for the use of multiple users, or is a production system (or to emulate a production system), you should dedicate a UNIX user for this purpose. In my examples, I use the user name hsqldb. In this chapter, I refer to this user as the HSQLDB_OWNER, since that user will own the database catalog files and the JVM processes.

                    If the account doesn't exist, then create it. On all system-5 UNIXes and most hybrids (including Linux), you can run (as root) something like

                        useradd -c 'HSQLDB Database Owner' -s /bin/bash -m hsqldb

                    (BSD-variant users can use a similar pw useradd hsqldb... command).

                  2. Become the HSQLDB_OWNER. Copy the sample file sample/server.properties to the HSQLDB_OWNER's home directory and rename it to server.properties. (As a final reminder, "sampleserver.properties" is a relative path, so it is understood to be relative to your HSQLDB_HOME).

                    # Hsqldb Server cfg file.
                    # See the HyperSQL Network Listeners chapter of the HyperSQL User Guide.
                    
                    # Each server.database.X setting defines a database "catalog".
                    # I.e., an independent set of data.
                    # Each server.database.X setting corresponds exactly to the jdbc:hsqldb:*
                    # JDBC URL you would use if you wanted to get a direct (In-Process)
                    # Connection to the catalog instead of "serving" it.
                    
                    server.database.0=file:db0/db0
                    # I suggest that, for every file: catalog you define, you add the
                    # connection property "ifexists=true" after the database instance
                    # is created (which happens simply by starting the Server one time).
                    # Just append ";ifexists=true" to the file: URL, like so:
                    # server.database.0=file:db0/db0;ifexists=true
                    
                    # server.dbname.0 defaults to "" (i.e. server.dbname.n for n==0), but
                    # the catalog definition n will be entirely ignored for n > 0 if you do not
                    # set server.dbname.n.  I.e. dbname setting is required for n > 0, though it
                    # may be set to blank (e.g. "server.dbname.3=")
                    

                    Since the value of the first database (server.database.0) begins with file:, the catalog will be persisted to a set of files in the specified directory with names beginning with the specified name. Set the path to whatever you want (relative paths will be relative to the directory containing the properties file). You can read about how to specify other catalogs of various types, and how to make settings for the listen port and many other things in other chapters of this guide.

                  3. Set and export the environmental variable CLASSPATH to the value of HSQLDB_HOME (as described above) plus "/lib/hsqldb.jar", like

                        export CLASSPATH; CLASSPATH=/path/to/hsqldb/lib/hsqldb.jar

                    In HSQLDB_OWNER's home directory, run

                        nohup java org.hsqldb.server.Server &

                    This will start the Listener process in the background, and will create your new database catalog "db0". Continue on when you see the message containing HSQLDB server... is online. nohup just makes sure that the command will not quit when you exit the current shell (omit it if that's what you want to do).

                  Accessing your Database

                  We're going to use SqlTool to access the database, so you will need the file sqltool.jar in addition to hsqldb.jar. If sqltool.jar isn't already sitting there beside hsqldb.jar (they both come pre-built), build it exactly as you would build hsqldb.jar, except use ant target sqltool. If your distribution came with a sqltool jar file with a version label, like sqltool-1.2.3.4.jar, that's fine-- use that file whenever I say sqltool.jar below.

                  Copy the file sample/sqltool.rc to the HSQLDB_OWNER's home directory. Use chmod to make the file readable and writable only to HSQLDB_OWNER.

                  # $Id: sqltool.rc 4313 2011-06-06 02:19:38Z unsaved $
                  
                  # This is a sample RC configuration file used by SqlTool, DatabaseManager,
                  # and any other program that uses the org.hsqldb.lib.RCData class.
                  # See the documentation for SqlTool for various ways to use this file.
                  
                  # If you have the least concerns about security, then secure access to
                  # your RC file.
                  
                  # You can run SqlTool right now by copying this file to your home directory
                  # and running
                  #    java -jar /path/to/sqltool.jar mem
                  # This will access the first urlid definition below in order to use a 
                  # personal Memory-Only database.
                  # "url" values may, of course, contain JDBC connection properties, delimited
                  # with semicolons.
                  # As of revision 3347 of SqlFile, you can also connect to datasources defined
                  # here from within an SqlTool session/file with the command "\j urlid".
                  
                  # You can use Java system property values in this file like this:  ${user.home}
                  
                  # The only feature added recently is the optional "transiso" setting,
                  # which may be set to an all-caps transaction isolation level as listed
                  # in the Java API Spec for java.sql.Connection.
                  # Windows users are advised to use forward slashes instead of reverse slashes,
                  # and to avoid paths containing spaces or other funny characters.  (This
                  # recommendation applies to any Java app, not just SqlTool).
                  
                  # A personal Memory-Only (non-persistent) database.
                  urlid mem
                  url jdbc:hsqldb:mem:memdbid
                  username SA
                  password
                  
                  # A personal, local, persistent database.
                  urlid personal
                  url jdbc:hsqldb:file:${user.home}/db/personal;shutdown=true
                  username SA
                  password
                  transiso TRANSACTION_READ_COMMITTED
                  # When connecting directly to a file database like this, you should 
                  # use the shutdown connection property like this to shut down the DB
                  # properly when you exit the JVM.
                  
                  # This is for a hsqldb Server running with default settings on your local
                  # computer (and for which you have not changed the password for "SA").
                  urlid localhost-sa
                  url jdbc:hsqldb:hsql://localhost
                  username SA
                  password
                  
                  
                  
                  # Template for a urlid for an Oracle database.
                  # You will need to put the oracle.jdbc.OracleDriver class into your 
                  # classpath.
                  # In the great majority of cases, you want to use the file classes12.zip
                  # (which you can get from the directory $ORACLE_HOME/jdbc/lib of any
                  # Oracle installation compatible with your server).
                  # Since you need to add to the classpath, you can't invoke SqlTool with
                  # the jar switch, like "java -jar .../sqltool.jar...".
                  # Put both the SqlTool jar and classes12.zip in your classpath (and export!)
                  # and run something like "java org.hsqldb.util.SqlTool...".
                  
                  #urlid cardiff2
                  #url jdbc:oracle:thin:@aegir.admc.com:1522:TRAFFIC_SID
                  #username blaine
                  #password secretpassword
                  #driver oracle.jdbc.OracleDriver
                  
                  
                  
                  # Template for a TLS-encrypted HSQLDB Server.
                  # Remember that the hostname in hsqls (and https) JDBC URLs must match the
                  # CN of the server certificate (the port and instance alias that follows 
                  # are not part of the certificate at all).
                  # You only need to set "truststore" if the server cert is not approved by
                  # your system default truststore (which a commercial certificate probably
                  # would be).
                  
                  #urlid tls
                  #url jdbc:hsqldb:hsqls://db.admc.com:9001/lm2
                  #username BLAINE
                  #password asecret
                  #truststore ${user.home}/ca/db/db-trust.store
                  
                  
                  # Template for a Postgresql database
                  #urlid blainedb
                  #url jdbc:postgresql://idun.africawork.org/blainedb
                  #username blaine
                  #password losung1
                  #driver org.postgresql.Driver
                  
                  # Template for a MySQL database.  MySQL has poor JDBC support.
                  #urlid mysql-testdb
                  #url jdbc:mysql://hostname:3306/dbname
                  #username root
                  #password hiddenpwd
                  #driver com.mysql.jdbc.Driver
                  
                  # Note that "databases" in SQL Server and Sybase are traditionally used for
                  # the same purpose as "schemas" with more SQL-compliant databases.
                  
                  # Template for a Microsoft SQL Server database using Microsoft's Driver
                  # (I find that the JTDS driver is much more responsive than Microsoft's).
                  # OLDER JDBC Driver:
                  #urlid msprojsvr
                  #url jdbc:microsoft:sqlserver://hostname;DatabaseName=DbName;SelectMethod=Cursor
                  # The SelectMethod setting is required to do more than one thing on a JDBC
                  # session (I guess Microsoft thought nobody would really use Java for 
                  # anything other than a "hello world" program).
                  # This is for Microsoft's SQL Server 2000 driver (requires mssqlserver.jar
                  # and msutil.jar).
                  #driver com.microsoft.jdbc.sqlserver.SQLServerDriver
                  #username myuser
                  #password hiddenpwd
                  # Current 2011 JDBC Driver for Microsoft SQL Server:
                  # Requires just the new sqljdbc4.jar.  (Microsoft just loves back-slashes)
                  #url jdbc:sqlserver://hostname\instanceName;DatabaseName=dbname
                  #driver com.microsoft.jdbc.sqlserver.SQLServerDriver
                  
                  # Template for Microsoft SQL Server database using the JTDS Driver
                  # http://jtds.sourceforge.net  Jar file has name like "jtds-1.2.5.jar".
                  #urlid nlyte
                  #username myuser
                  #password hiddenpwd
                  #url jdbc:jtds:sqlserver://myhost/nlyte;instance=MSSQLSERVER
                  #driver net.sourceforge.jtds.jdbc.Driver
                  
                  # Template for a Sybase database
                  #urlid sybase
                  #url jdbc:sybase:Tds:hostname:4100/dbname
                  #username blaine
                  #password hiddenpwd
                  # This is for the jConnect driver (requires jconn3.jar).
                  #driver com.sybase.jdbc3.jdbc.SybDriver
                  
                  # Template for Embedded Derby / Java DB.
                  #urlid derby1
                  #url jdbc:derby:path/to/derby/directory;create=true
                  #username ${user.name}
                  #password any_noauthbydefault
                  #driver org.apache.derby.jdbc.EmbeddedDriver
                  # The embedded Derby driver requires derby.jar.
                  # There'a also the org.apache.derby.jdbc.ClientDriver driver with URL
                  # like jdbc:derby://<server>[:<port>]/databaseName, which requires
                  # derbyclient.jar.
                  # You can use \= to commit, since the Derby team decided (why???)
                  # not to implement the SQL standard statement "commit"!!
                  # Note that SqlTool can not shut down an embedded Derby database properly,
                  # since that requires an additional SQL connection just for that purpose.
                  # However, I've never lost data by not shutting it down properly.
                  # Other than not supporting this quirk of Derby, SqlTool is miles ahead of ij.
                  

                  We will be using the "localhost-sa" sample urlid definition from the config file. The JDBC URL for this urlid is jdbc:hsqldb:hsql://localhost. That is the URL for the default catalog of a HyperSQL Listener running on the default port of the local host. You can read about URLs to connect to other catalogs with and without listeners in other chapters of this guide.

                  Run SqlTool.

                      java -jar path/to/sqltool.jar localhost-sa

                  If you get a prompt, then all is well. If security is of any concern to you at all, then you should change the privileged password in the database. Use the command SET PASSWORD command to change SA's password.

                      SET PASSWORD 'newpassword';

                  Set a strong password!

                  [Note]Note

                  If, like most UNIX System Administrators, you often need to make up strong passwords, I highly suggest the great little program pwgen. You can probably get it where you get your other OS packages. The command pwgen -1 is usually all you need.

                  Note that with SQL-conformant databases like HyperSQL 2.0, user names and passwords are case sensitive. If you don't quote the name, it will be interpreted as upper-case, like any named SQL object. (Only for backwards compatibility, we do make an exception for the special user name SA, but you should always use upper-case "SA" nevertheless).

                  When you're finished playing, exit with the command \q.

                  If you changed the SA password, then you need to update the password in the sqltool.rc file accordingly.

                  You can, of course, also access the database with any JDBC client program. You will need to modify your classpath to include hsqldb.jar as well as your client class(es). You can also use the other HSQLDB client programs, such as org.hsqldb.util.DatabasManagerSwing, a graphical client with a similar purpose to SqlTool.

                  You can use any normal UNIX account to run the JDBC clients, including SqlTool, as long as the account has read access to the sqltool.jar file and to an sqltool.rc file. See the Utilities Guide about where to put sqltool.rc, how to execute sql files, and other SqlTool features.

                  Create additional Accounts

                  Connect to the database as SA (or any other Administrative user) and run CREATE USER to create new accounts for your catalog. HSQLDB accounts are database-catalog-specific, not Listener-specific.

                  In SQL-compliant databases, all database objects are created in a schema. If you don't specify a schema, then the new object will be created in the default schema. To create a database object, your account (the account that you connected with) must have the role DBA, or your account must have authorization for the target schema (see the CREATE SCHEMA command about this last). When you first create a HyperSQL catalog, it has only one database user-- SA, a DBA account, with an empty string password. You should set a password (as described above). You can create as many additional users as you wish. To make a user a DBA, you can use the "ADMIN" option to the CREATE USER command, command, or GRANT the DBA Role to the account after creating it.

                  Once an object is created, the object creator and users with the DBA role will have all privileges to work with that object. Other users will have only the rights which the pseudo-user PUBLIC has. To give specific users more permissions, even rights to read objects, you can GRANT permissions for specific objects, grant Roles (which encompass a set of permissions), or grant the DBA Role itself.

                  Since only people with a database account may do anything at all with the database, it is often useful to permit other database users to view the data in your tables. To optimize performance, reduce contention, and minimize administration, it is often best to grant SELECT to PUBLIC on table-like objects that need to be accessed by multiple database users, with the significant exception of any data which you want to keep secret. (Similarly with EXECUTE priv for routines and USAGE priv for other object types). Note that this is not at all equivalent to giving the world or the Internet read access to your tables-- you are giving read access to people that have been given accounts for the target database catalog.

                  Shutdown

                  Do a clean database shutdown when you are finished with the database catalog. You need to connect up as SA or some other Admin user, of course. With SqlTool, you can run

                      java -jar path/to/sqltool.jar --sql 'shutdown;' localhost-sa

                  You don't have to worry about stopping the Listener because it shuts down automatically when all served database catalogs are shut down.

                  Running Hsqldb as a System Daemon

                  You can, of course, run HSQLDB through inittab on System V UNIXes, but usually an init script is more convenient and manageable. This section explains how to set up and use our UNIX init script. Our init script is only for use by root. (That is not to say that the Listener will run as root-- it usually should not).

                  The main purpose of the init script is to start up a Listener for the database catalogs specified in your server.properties file; and to gracefully shut down these same catalogs. For each catalog defined by a server.database.X setting in your .properties file, you must define an administrative "urlid" in your sqltool.rc (these are used to access the catalogs for validation and shutdown purposes). Finally, you list the urlid names in your init script config file. If, due to firewall issues, you want to run a WebServer instead of a Server, then make sure you have a healthy WebServer with a webserver.properties set up, adjust your URLs in sqltool.rc, and set TARGET_CLASS in the config file.

                  By following the commented examples in the config file, you can start up any number of Server and/or WebServer listener instances with or without TLS encryption, and each listener instance can serve any number of HyperSQL catalogs (independent data sets), all with optimal efficiency from a single JVM process. There are instructions in the init script itself about how to run multiple, independently-configured JVM processes. Most UNIX installations, however, will run a single JVM with a single Listener instance which serves multiple catalogs, for easier management and more efficient resource usage.

                  After you have the init script set up, root can use it anytime to start or stop HSQLDB. (I.e., not just at system bootup or shutdown).

                  Portability of hsqldb init script

                  The primary design criterion of the init script is portability. It does not print pretty color startup/shutdown messages as is common in late-model Linuxes and HPUX; and it does not keep subsystem state files or use the startup/shutdown functions supplied by many UNIXes, because these features are all non-portable.

                  Offsetting these limitations, this one script does it's intended job great on the UNIX varieties I have tested, and can easily be modified to accommodate other UNIXes. While you don't have tight integration with OS-specific daemon administration guis, etc., you do have a well tested and well behaved script that gives good, utilitarian feedback.

                  Init script Setup Procedure

                  The strategy taken here is to get the init script to run your single Server or WebServer first (as specified by TARGET_CLASS). After that's working, you can customize the JVM that is run by running additional Listener instances in it, running your own application in it (embedding), or even overriding HSQLDB behavior with your own overriding classes.

                  1. Copy the init script sample/hsqldb.init to hsqldb in the directory where init scripts live on your variety of UNIX. The most common locations are /etc/init.d or /etc/rc.d/init.d on System V style UNIXes, /usr/local/etc/rc.d on BSD style UNIXes, and /Library/StartupItems/hsqldb on OS X (you'll need to create the directory for the last).

                  2. View your server.properties file. Make a note of every catalog define by a server.database.X setting. A couple steps down, you will need to set up administrative access for each of these catalogs. If you are using our sample server.properties file, you will just need to set up access for the catalog specified with file:db0/dbo.

                    [Note]Note

                    Pre-2.0 versions of the hsqldb init script required use of .properties settings of the formserver.urlid.X. These settings are obsolete and should be removed.

                  3. Either copy HSQLDB_OWNER's sqltool.rc file into root's home directory, or set the value of AUTH_FILE to the absolute path of HSQLDB_OWNER's sqltool.rc file. This file is read directly by root, even if you run hsqldb as non-root (by setting HSQLDB_OWNER in the config file). If you copy the file, make sure to use chmod to restrict permissions on the new copy. The init script will abort with an appropriate exhortation if you have the permissions set incorrectly.

                    You need to set up a urlid stanza in your sqltool.rc file for network access (i.e. JDBC URL with hsql:, hsqls:, http:, or https:) for each catalog in your server.properties file. For our example, you need to define a stanza for the file:db0/db0 catalog. You must supply for this catalog, a hsql: JDBC URL, an administrative user name, and the password.

                    Example 14.1. example sqltool.rc stanza

                        urlid localhostdb1
                        url jdbc:hsqldb:hsql://localhost
                        username SA
                        password secret

                  4. Look at the comment towards the top of the init script which lists recommended locations for the configuration file for various UNIX platforms. Copy the sample config file sample/hsqldb.cfg to one of the listed locations (your choice). Edit the config file according to the instructions in it. For our example, you will set the value of URLIDS to localhostdb1, since that is the urlid name that we used in the sqltool.rc file.

                    # $Id: hsqldb.cfg 3583 2010-05-16 01:49:52Z unsaved $
                    
                    # Sample configuration file for HyperSQL Server Listener.
                    # See the "HyperSQL on UNIX" chapter of the HyperSQL User Guide.
                    
                    # N.b.!!!!  You must place this in the right location for your type of UNIX.
                    # See the init script "hsqldb" to see where this must be placed and
                    # what it should be renamed to.
                    
                    # This file is "sourced" by a Bourne shell, so use Bourne shell syntax.
                    
                    # This file WILL NOT WORK until you set (at least) the non-commented
                    # variables to the appropriate values for your system.
                    # Life will be easier if you avoid all filepaths with spaces or any other
                    # funny characters.  Don't ask for support if you ignore this advice.
                    
                    # The URLIDS setting below is new and REQUIRED.  This setting replaces the
                    # server.urlid.X settings which used to be needed in your Server's
                    # properties file.
                    
                    # -- Blaine (blaine dot simpson at admc dot com)
                    
                    JAVA_EXECUTABLE=/usr/bin/java
                    
                    # Unless you copied the jar files from another system, this typically
                    # resides at $HSQLDB_HOME/lib/sqltool.jar, where $HSQLDB_HOME is your HSQLDB
                    # software base directory.
                    # The file name may actually have a version label in it, like
                    # sqltool-1.2.3.jar (in which case, you must specify the full name here).
                    # A 'hsqldb.jar' file (with or without version label) must reside in the same
                    # directory as the specified sqltool.jar file.
                    SQLTOOL_JAR_PATH=/opt/hsqldb-2.0.0/hsqldb/lib/sqltool.jar
                    # For the sample value above, there must also exist a file
                    # /opt/hsqldb-2.0.0/hsqldb/lib/hsqldb*.jar.
                    
                    # Where the file "server.properties" or "webserver.properties" resides.
                    SERVER_HOME=/opt/hsqldb-2.0.0/hsqldb/data
                    
                    # What UNIX user the server will run as.
                    # (The shutdown client is always run as root or the invoker of the init script).
                    # Runs as root by default, but you should take the time to set database file
                    # ownerships to another user and set that user name here.
                    HSQLDB_OWNER=hsqldb
                    
                    # The HSQLDB jar file specified in HSQLDB_JAR_PATH above will automatically
                    # be in the class path.  This arg specifies additional classpath elements.
                    # To embed your own application, add your jar file(s) or class base
                    # directories here, and add your main class to the INVOC_ADDL_ARGS setting
                    # below.  Another common use-case for adding to your class path is to make
                    # classes available to the DB engines for SQL/JRT functions and procedures.
                    #SERVER_ADDL_CLASSPATH=/usr/local/dist/currencybank.jar
                    
                    # For startup or shutdown failures, you can save a lot of debugging time by
                    # temporarily adjusting down MAX_START_SECS and MAX_TERMINATE_SECS to a
                    # little over what it should take for successful startup and shutdown on
                    # your system.
                    
                    # We require all Server/WebServer instances to be accessible within 
                    # $MAX_START_SECS from when the Server/WebServer is started.
                    # Defaults to 60.
                    # Raise this is you are running lots of DB instances or have a slow server.
                    #MAX_START_SECS=200
                    
                    # Max time to allow for JVM to die after all HSQLDB instances stopped.
                    # Defaults to 60.  Set high because the script will always continue as soon as
                    # the process has stopped.  The importance of this setting is, how long until
                    # a non-stopping-JVM-problem will be detected.
                    #MAX_TERMINATE_SECS=0
                    
                    # NEW AND IMPORTANT!!!
                    # As noted at the top of this file, this setting replaces the old property
                    # settings server.urlid.X.
                    # Simply list the URLIDs for all DB instances which your *Server starts.
                    # Usually, these will exactly mirror the server.database.X settings in your
                    # server.properties or webserver.properties file.
                    # Each urlid listed here must be defined to a NETWORK url with Admin privileges
                    # in the AUTH_FILE specified below.  (Network type because we use this for
                    # inter-process communication)
                    # Separate multiple values with white space.  NO OTHER SPECIAL CHARACTERS!
                    # Make sure to quote the entire value if it contains white space separator(s).
                    URLIDS='localhostdb1'
                    
                    # These are urlids # ** IN ADDITION TO URLIDS **, for instances which the init
                    # script should stop but not start.
                    # Most users will not need this setting.  If you need it, you'll know it.
                    # Defaults to none (i.e., only URLIDS will be stopped).
                    #SHUTDOWN_URLIDS='ondemand'
                    
                    # SqlTool authentication file used only for shutdown.
                    # The default value will be sqltool.rc in root's home directory, since it is 
                    # root who runs the init script.
                    # (See the SqlTool chapter of the HyperSQL Utilities Guide if you don't
                    # understand this).
                    #AUTH_FILE=/home/blaine/sqltool.rc
                    
                    # Typical users will leave this unset and it will default to
                    # org.hsqldb.server.Server.  If you need to run the HSQLDB WebServer class
                    # instead, due to a firewall or routing impediment, set this to
                    # org.hsqldb.server.WebServer, see the docs about running WebServr, and
                    # set up a "webserver.properties" file instead of a "server.properties".
                    # The JVM that is started can invoke many classes (see the following item
                    # about that), but this is the server that is used (1) to check status,
                    # (2) to shut down the JVM.
                    #TARGET_CLASS=org.hsqldb.server.WebServer
                    
                    # This is where you may specify both command-line parameters to TARGET_CLASS,
                    # plus any number of additional progams to run (along with their command-line
                    # parameters).  The MainInvoker program is used to embed these multiple
                    # static main invocations into a single JVM, so see the API spec for
                    # org.hsqldb.util.MainInvoker if you want to learn more.
                    # N.b. You should only use this setting to set HSQLDB Server or WebServer
                    # parameters if you run multiple instances of this class, since you can use the
                    # server/webserver.properties file for a single instance.
                    # Every additional class (in addition to the TARGET_CLASS)
                    # must be preceded with an empty string, so that MainInvoker will know
                    # you are giving a class name.  MainInvoker will invoke the normal 
                    # static main(String[]) method of each such class.  
                    # By default, MainInvoker will just run TARGET_CLASS with no args.
                    # Example that runs just the TARGET_CLASS with the specified arguments:
                    #INVOC_ADDL_ARGS='-silent false'   #but use server.properties property instead!
                    # Example that runs the TARGET_CLASS plus a WebServer:
                    #INVOC_ADDL_ARGS='"" org.hsqldb.server.WebServer'
                    # Note the empty string preceding the class name.
                    # Example that starts TARGET_CLASS with an argument + a WebServer +
                    # your own application with its args (i.e., the HSQLDB Servers are
                    # "embedded" in your application).  (Set SERVER_ADDL_CLASSPATH too).:
                    #INVOC_ADDL_ARGS='-silent false "" org.hsqldb.server.WebServer "" com.acme.Stone --env prod localhost'
                    #   but use server.properties for -silent option instead!
                    # Example to run a non-TLS server in same JVM with a TLS server.  In this
                    # case, TARGET_CLASS is Server which will run both in TLS mode by virtue of 
                    # setting the tls, keyStore, and keyStorePassword settings in
                    # server*.properties, as described below; plus an "additional" Server with
                    # overridden 'tls' and 'port' settings:
                    #INVOC_ADDL_ARGS="'' org.hsqldb.server.Server --port 9002 --tls false"
                    # This is an important use case.  If you run more than one Server instance,
                    # you can specify different parameters for each here, even though only one
                    # server.properties file is supported.
                    # Note that you use nested quotes to group arguments and to specify the
                    # empty-string delimiter.
                    
                    # The TLS_* settings have been obsoleted.
                    # To get your server running with TLS, set
                    # system.javax.net.ssl.keyStore=/path/to/your/private.keystore
                    # system.javax.net.ssl.keyStorePassword=secretPassword
                    # server.ssl=true
                    # IN server.properties or webserver.properties, and
                    # MAKE THE FILE OWNER-READ-ONLY!
                    # See the TLS Encryption section of the HyperSQL User Guide, paying attention
                    # to the security warning(s).
                    # If you are running with a private server cert, then you will also need to 
                    # set "truststore" in the your SqlTool config file (location is set by the
                    # AUTH_FILE variable in this file, or it must be at the default location for 
                    # HSQLDB_OWNER).
                    
                    # Any JVM args for the invocation of the JDBC client used to verify DB
                    # instances and to shut them down (SqlToolSprayer).
                    # Server-side System Properties should normally be set with system.*
                    # settings in the server/webserver.properties file.
                    # This example specifies the location of a private trust store for TLS 
                    # encryption.
                    # For multiple args, put quotes around entire value.
                    # If you are starting just a TLS_encrypted Listener, you need to uncomment
                    # this so the init scripts uses TLS to connect.
                    # If using a private keystore, you also need to set "truststore" settings in
                    # the sqltool.rc file.
                    #CLIENT_JVMARGS=-Djavax.net.debug=ssl
                    # This sample value displays useful debugging information about TLS/SSL.
                    
                    # Any JVM args for the server.
                    # For multiple args, put quotes around entire value.
                    #SERVER_JVMARGS=-Xmx512m
                    # You can set the "javax.net.debug" property on the server side here, in the
                    # same exact way as shown for the client side above.
                    

                    Verify that the init script works.

                    Just run

                        /path/to/hsqldb

                    as root to see the arguments you may use. Notice that you can run

                        /path/to/hsqldb status

                    at any time to see whether your HSQLDB Listener is running.

                    Re-run the script with each of the possible arguments to really test it good. If anything doesn't work right, then see the Troubleshooting the Init Script section.

                  5. Tell your OS to run the init script upon system startup and shutdown. If you are using a UNIX variant that has /etc/rc.conf or /etc/rc.conf.local (like BSD variants and Gentoo), you must set "hsqldb_enable" to "YES" in either of those files. (Just run cd /etc; ls rc.conf rc.conf.local to see if you have one of these files). For good UNIXes that use System V style init, you must set up hard links or soft links either manually or with management tools (such as chkconfig or insserv) or Gui's (like run level editors).

                    This paragraph is for Mac OS X users only. If you followed the instructions above, your init script should reside at /Library/StartupItems/hsqldb/hsqldb. Now copy the file StartupParameters.plist from the directory src/org.hsqldb/sample of your HSQLDB distribution to the same directory as the init script. As long as these two files reside in /Library/StartupItems/hsqldb, your init script is active (for portability reasons, it doesn't check for a setting in /etc/hostconfig). You can run it as a Startup Item by running

                        SystemStarter {start|stop|restart} Hsqldb

                    Hsqldb is the service name. See the man page for SystemStarter. To disable the init script, wipe out the /Library/StartupItems/hsqldb directory. Hard to believe, but the Mac people tell me that during system shutdown the Startup Items don't run at all. Therefore, if you don't want your data corrupted, make sure to run "SystemStarter stop Hsqldb" before shutting down your Mac.

                  Follow the examples in the config file to add additional classes to the server JVM's classpath and to execute additional classes in your JVM. (See the SERVER_ADDL_CLASSPATH and INVOC_ADDL_ARGS items).

                  Troubleshooting the Init Script

                  Definitely look at the init script log file, which is at an OS-sependent location, but is usually at /var/log/hsqldb.log.

                  Do a ps to look for processes containing the string hsqldb, and try to connect to the database from any client. If the init script starts up your database successfully, but incorrectly reports that it has not, then your problem is with specification of urlid(s) or SqlTool setup. If your database really did not start, then skip to the next paragraph. Verify that your config file assigns a urlid for each catalog defined in server.properties or webserver.properties, then verify that you can run SqlTool as root to connect to the catalogs with these urlids. (For the latter test, use the --rcfile switch if you are setting AUTH_FILE in the init script config file).

                  If your database really is not starting, then verify that you can su to the database owner account and start the database. The command su USERNAME -c ... won't work on most UNIXes unless the target user has a real login shell. Therefore, if you try to tighten up security by disabling this user's login shell, you will break the init script. If these possibilities don't pan out, then debug the init script or seek help, as described below.

                  To debug the init script, run it in verbose mode to see exactly what is happening (and perhaps manually run the steps that are suspect). To run an init script (in fact, any sh shell script) in verbose mode, use sh with the -x or -v switch, like

                      sh -x path/to/hsqldb start

                  See the man page for sh if you don't know the difference between -v and -x.

                  If you want troubleshooting help, use the HSQLDB lists/forums. Make sure to include the revision number from your hsqldb init script (it's towards the top in the line that starts like "# $Id:"), and the output of a run of

                      sh -x path/to/hsqldb start > /tmp/hstart.log 2>&1

                  Upgrading

                  This section is for users who are using our UNIX init script, and who are upgrading their HyperSQL installation.

                  Most users will not have customized the init script itself, and your customizations will all be encapsulated in the init script configuration file. These users should just overwrite their init script with a new one from the HyperSQL installation, and manually merge config file settings. First, just copy the file /sample/hsqldb.init over top of of your init script (wherever it runs from). Then update your old config file according to the instructions in the new config file template at sample/hsqldb.cfg. You will have to change very few settings. If you are upgrading from a pre-2.0 installation to a post-2.0 installation, you will need to (1) add the setting URLIDS, as described above and in the inline comments, and (2) replace variable HSQLDB_JAR_PATH with SQLTOOL_JAR_PATH which (if you haven't guessed) should be set to the path to your sqltool.jar file.

                  Users who customized their init script will need to merge their customizations into the new init script.

                  Chapter 15. Deployment Guide

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5035 $

                  Copyright 2002-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:09:15+0100

                  Memory and Disk Use

                  Memory used by the program can be thought of as two distinct pools: memory used for table data which is not released unless the data is deleted and memory that can be released or is released automatically, including memory used for caching, building result sets and other internal operations such as storing the information needed for a rollback a transaction.

                  Most JVM implementations allocate up to a maximum amount of memory (usually 64 MB by default). This amount is generally not adequate when large memory tables are used, or when the average size of rows in cached tables is larger than a few hundred bytes. The maximum amount of allocated memory can be set on the Java command line that is used for running HyperSQL. For example, with Sun JVM, parameter -Xmx256m increases the amount to 256 MB.

                  Table Memory Allocation

                  The memory used for a MEMORY table is the sum of memory used by each row. Each MEMORY table row is a Java object that has 2 int or reference variables. It contains an array of objects for the fields in the row. Each field is an object such as Integer, Long, String, etc. In addition each index on the table adds a node object to the row. Each node object has 6 int or reference variables. As a result, a table with just one column of type INTEGER will have four objects per row, with a total of 10 variables of 4 bytes each - currently taking up 80 bytes per row. Beyond this, each extra column in the table adds at least a few bytes to the size of each row.

                  Result Set Memory Allocation

                  By default, all the rows in the result set are built in memory, so very large result sets may not be possible to build. A server mode databases releases the result set from the server memory once the database server has returned the result set. An in-process database releases the memory when the application program closes the java.sql.ResultSet object. A server mode database requires additional memory for returning result sets, as it converts the full result set into an array of bytes which is then transmitted to the client.

                  HyperSQL 2.0 supports disk-based result sets. The commands, SET SESSION RESULT MEMORY ROWS <integer> and SET DATABASE DEFAULT RESULT MEMORY ROWS <integer> specify a threshold for the number of rows. Results with row counts above the threshold are stored on disk. These settings also apply to temporary tables, views and subquery tables.

                  Disk-based result sets slow down the database operations and should be used only when absolutely necessary, perhaps with result sets that are larger than tens of thousands of rows.

                  In a server mode database, when the setFetchSize() method of the Statement interface is used to limit the number rows fetched, the whole result is held by the engine and is returned to the JDBC ResultSet in blocks of rows of the specified fetch size.

                  Temporary Memory Use During Operations

                  When UPDATE and DELETE queries are performed on CACHED tables, the full set of rows that are affected, including those affected due to ON UPDATE actions, is held in memory for the duration of the operation. This means it may not be possible to perform deletes or updates involving very large numbers of rows of CACHED tables. Such operations should be performed in smaller sets. This memory is released as soon as the DELETE or UPDATE is performed.

                  When transactions support is enabled with SET AUTOCOMMIT FALSE, lists of all insert, delete or update operations are stored in memory so that they can be undone when ROLLBACK is issued. For CACHED tables, only the transaction information is held in memory, not the actual rows that have changed. Transactions that span thousands of modification to data will take up a lot of memory until the next COMMIT or ROLLBACK clears the list. Each row modification uses less than 100 bytes until COMMIT.

                  When subqueries or views are used in SELECT and other statements, transient tables are created and populated by the engine. If the SET SESSION RESULT MEMORY ROWS <integer> statement has been used, these transient tables are stored on disk when they are larger than the threshold.

                  Data Cache Memory Allocation

                  With CACHED tables, the data is stored on disk and only up to a maximum number of rows are held in memory at any time. The default is up to 50,000 rows. The SET FILES CACHE ROWS command or the hsqldb.cache_rows connection property can be set to alter this amount. As any random subset of the rows in any of the CACHED tables can be held in the cache, the amount of memory needed by cached rows can reach the sum of the rows containing the largest field data. For example if a table with 100,000 rows contains 40,000 rows with 1,000 bytes of data in each row and 60,000 rows with 100 bytes in each, the cache can grow to contain 50,000 of the smaller rows, but as explained further, only 10,000 or the large rows.

                  An additional property, hsqldb.cache_size is used in conjunction with the hsqldb.cache_rows property. This puts a limit in bytes on the total size of rows that are cached. The default values is 10,000KB. (This is the size of binary images of the rows and indexes. It translates to more actual memory, typically 2-4 times, used for the cache because the data is represented by Java objects.)

                  If memory is limited, the hsqldb.cache_rows or hsqldb.cache_size database properties can be reduced. In the example above, if the hsqldb.cache_size is reduced from 10,000 to 5,000, it will allow the number of cached rows to reach 50,000 small rows, but only 5,000 of the larger rows.

                  Data for CLOB and BLOB columns is not cached and does not affect the CACHED table memory cache.

                  The use of Java NIO file access method also increases memory usage. Access with NIO improves database update speed and is used by default for data files up to 256 MB. For minimal memory use, nio access should be disabled.

                  The operating system usually allocates a large amount of buffer memory for speed up file read operations. Therefore when a lot of memory is available to the operating system, all database operations perform faster.

                  Object Pool Memory Allocation

                  HyperSQL uses a set of fast pools for immutable objects such as Integer, Long and short String objects that are stored in the database. In most circumstances, this reduces the memory footprint still further as fewer copies of the most frequently-used objects are kept in memory. The object pools are shared among all databases in the JVM. The size of each pool can be modified only by altering and recompiling the org.hsqldb.store.ValuePool class.

                  Lob Memory Usage

                  Access to lobs is always performed in chunks, so it is perfectly possible to store and access a CLOB or BLOB that is larger than the JVM memory allocation. The actual total size of lobs is almost unlimited. We have tested with over 100 GB of lobs without any loss of performance.

                  By default, HyperSQL 2.0 uses memory-based tables for the lob schema (not the actual lob data). Therefore it is practical to store about 100,000 individual lobs in the database with the default JVM memory allocation. More lobs can be stored with larger JVM memory allocations. In order to store more than a few hundreds of thousands of lobs, you can change the lob schema storage to CACHED tables with the following statements:

                  Example 15.1. Using CACHED tables for the LOB schema

                    SET TABLE SYSTEM_LOBS.BLOCKS TYPE CACHED
                    SET TABLE SYSTEM_LOBS.LOBS TYPE CACHED
                    SET TABLE SYSTEM_LOBS.LOB_IDS TYPE CACHED
                  

                  Disk Space

                  With file: database, the engine uses the disk for storage of data and any change. For safely, the engine backs up the data internally during operation. Spare space, at least equal to the size of the .data and .script file is needed. The .lobs file is not backed up during operation as it is not necessary for safety.

                  Managing Database Connections

                  In all running modes (server or in-process) multiple connections to the database engine are supported. in-process (standalone) mode supports connections from the client in the same Java Virtual Machine, while server modes support connections over the network from several different clients.

                  Connection pooling software can be used to connect to the database but it is not generally necessary. Connection pools may be used for the following reasons.

                  • To allow new queries to be performed while a time-consuming query is being performed in the background. In HyperSQL, blocking depends on the transaction control model, the isolation level, and the current activity by other sessions.

                  • To limit the maximum number of simultaneous connections to the database for performance reasons. With HSQLDB this can be useful if your application is designed in a way that opens and closes connections for each small task. Also, the overall performance may be higher when fewer simultaneous connections are used. If you want to reduce the number of simultaneous sessions, you can use a connection pool with fewer pooled connections.

                  An application that is not both multi-threaded and transactional, such as an application for recording user login and logout actions, does not need more than one connection. The connection can stay open indefinitely and reopened only when it is dropped due to network problems.

                  When using an in-process database, when the last connection to the database is closed, the database still remains open, waiting for the next connection to be made. From version 2.2.9, each time the last connection is closed all the data changes are logged and synched to disk.

                  An explicit SHUTDOWN command, with or without an argument, is required to close the database. A connection property, shutdown=true, can be used on the connection URL or in a properties object to shutdown the database when the last connection is closed.

                  When using a server database (and to some extent, an in-process database), care must be taken to avoid creating and dropping JDBC Connections too frequently. Failure to observe this will result in poor performance when the application is under heavy load.

                  A common error made by users in load-test simulations is to use a single client machine to open and close thousands of connections to a HyperSQL server instance. The connection attempts will fail after a few thousand because of OS restrictions on opening sockets and the delay that is built into the OS in closing them.

                  Tweaking the Mode of Operation

                  Different modes of operation and settings are used for different purposes. Some scenarios are discussed below:

                  Application Development and Testing

                  First thing to be aware of is the SQL conformance settings of HyperSQL. By default version 2.0 applies stricter conformance rules than version 1.8 and catches long strings or decimal values that do not fit within the specified length or precision settings. However, there are several conformance settings that are turned off by default. This is to enable easier migration from earlier versions, and also greater compatibility with databases such as MySQL that are sometimes very liberal with type conversions. The conformance settings are listed in the System Management chapter and their connection property equivalents are listed in the Database Properties chapter. Ideally, all the settings should have a true value for best error checking.

                  For application unit testing you can use an all-in-memory, in-process database.

                  If the tests are all run in one process, then the contents of a mem: database survives between tests. To release the contents you can use the SHUTDOWN command (an SQL command). You can even use multiple mem: databases in your tests and SHUTDOWN each one separately.

                  If the tests are in different processes and you want to keep the data between the tests, the best solution is to use a Server instance that has a mem: database. After the tests are done, you can SHUTDOWN this database, which will shutdown the server.

                  The Server has an option that allows databases to be created as needed by making a connection (see the Listeners Chapter). This option is useful for testing, as your server is never shut down when a database is shutdown. Each time you connect to the mem: database that is served by the Server, the database is created if it does not exist (i.e. has been previously shut down).

                  If you do not want to run a Server instance, and you need persistence between tests in different processes, then you should use a file: database. From version 2.2.9 when the last existing connection to the database is closed, the latest changes to the database are persisted fully. The database is still in an open state until it is shut down. You can use the shutdown=true connection property to close the database automatically after the connections are closed. An alternative option is to use hsqldb.write_delay=false connection property, but this is slightly slower than the other option and should be used in situations where the test application does not close the connections.

                  It has been reported that some data access frameworks do not close all their connection to the database after the tests. In such situations, you need to use zero WRITE DELAY if you want the data to persist at the end of the tests

                  You may actually want to use a file: database, or a server instance that serves a file: database in preference to a mem: database. As HyperSQL logs the DDL and DML statements in the .log file, this file can be used to check what is being sent to the database. Note that UPDATE statements are represented by a DELETE followed by an INSERT statement. Statements are written out when the connection commits. The write delay also has an effect on how soon the statements are written out. By default, the write delay is 0.5 second.

                  The new SQL logging feature in version 2.2.x and later records all executed statements and can be used for debugging your application.

                  Some types of tests start with a database that already contains the tables and data, and perform various operations on it during the tests. You can create and populate the initial database then set the property "files_readonly=true" in the .properties file of the database. The tests can then modify the database, but these modifications are not persisted after the tests have completed.

                  Databases with "files_readonly=true" can be placed within the classpath and in a jar file. In this case, the connection URL must use the res: protocol, which treats the database as a resource.

                  Embedded Databases in Desktop Applications

                  In this usage, the amount of data change is often limited and there is often a requirement to persist the data immediately. The default write delay of 0.5 second is fine for many applications. You can also use the property hsqldb.write_delay_millis=100 to reduce it to 0.1 second, or the property hsqldb.write_delay=false to force a disk sync after each commit. Before the application is closed, you should perform the SHUTDOWN command to ensure the database is opened instantly when it is next opened. Note you don't need to use SHUTDOWN COMPACT as routine.

                  Embedded Databases in Server Applications

                  This usage involves a server application, such as a web application, connecting to an embedded HyperSQL instance. In this usage, the database is often accessed heavily, therefore performance and latency is a consideration. If the database is updated heavily, the default value of the WRITE DELAY property (0.5 sec) is often enough, as it is assumed the server or the application does not go down frequently. If it is necessary, you can reduce the WRITE DELAY to a small value (20 ms) without impacting the update speed. If you reduce WRITE DELAY to zero, performance drops to the speed of disk file sync operation.

                  Alternatively, a server application can use an all-in-mem database instance for fast access, while sending the data changes to a persistent, disk based instance either periodically or in real time.

                  Mixed Mode : Embedding a HyperSQL Server (Listener)

                  Since you won't be able to access in-process database instances from other processes, you will often want to run a Listener in your applications that use embedded databases. You can do this by starting up a Server or WebServer instance programmatically, but you could also use the class org.hsqldb.util.MainInvoker to start up your application and a HyperSQL Server or WebServer without any programming.

                  Example 15.2. MainInvoker Example

                    java -cp path/to/your/app.jar:path/to/hsqldb.jar your.App "" org.hsqldb.server.Server


                  (Use ; instead of : to delimit classpath elements on Windows). Specify the same in-process JDBC URL to your app and in the server.properties file. You can then connect to the database from outside using a JDBC URL like jdbc:hsqldb:hsql://hostname, while connecting from inside the application using something like jdbc:hsqldb:file:<filepath of database> .

                  This tactic can be used to run off-the-shelf server applications with an embedded HyperSQL Server, without doing any coding.

                  MainInvoker can be used to run any number of Java class main method invocations in a single JVM. See the API spec for MainInvoker for details on its usage.

                  Using HyperSQL Without Logging Data Change

                  All file database that are not readonly, write changes to the .log file. There are scenarios where writing to the .log file can be turned off to improve performance, especially with larger databases. For these applications you can set the property hsqldb.log_data=false to disable the recovery log and speed up data change performance. The equivalent SQL command is SET FILES LOG FALSE.

                  With this setting, no data is logged, but all the changes to cached tables are written to the .data file. To persist all the data changes up to date, you can use the CHECKPOINT command. If you perform SHUTDOWN, the data is also persisted correctly. If you do not use CHECKPOINT or SHUTDOWN when you terminate the application, all the changes are lost and the database reverts to its original state when it is opened without losing any of the original data.

                  Your server applications can use a database as a temporary disk data cache which is not persisted past the lifetime of the application. For this usage, delete the database files when the application ends.

                  On some platforms, such as embedded devices which have a reliable storage device, this is also a useful option. Your application issues CHECKPOINT to save the changes made so far. This method of use reduces write operations on SSD devices. For this usage, the lock file should also be disabled with the connection property hsqldb.lock_file=false.

                  Bulk Inserts, Updates and Deletes

                  Bulk inserts, deletes and updates are performed with the best performance with the following method. The database remains safe and consistent using this method. In the event of a machine crash during the operation, the database can be recovered to the point just before the bulk operation.

                  1. Before the operation, execute the SET FILES LOG FALSE statement.

                  2. Execute the CHECKPOINT statement.

                  3. Perform all the bulk operations, using batched prepared statements. A batch size of 1000 to 10000 is adequate.

                  4. After all the bulk operations are complete, execute the SET FILES LOG TRUE statement.

                  5. Finally execute the CHECKPOINT statement.

                  6. If you have performed many thousands of updates or deletes (not just inserts), it is a good idea to execute CHECKPOINT DEFRAG, instead of CHECKPOINT at the end.

                  7. If things go wrong during the bulk operation, for example when a unique constraint violation aborts the operation, and you want to redo the operation, just use SHUTDOWN IMMEDIATELY instead of CHECKPOINT. When you restart the database it will revert to the state at the first CHECKPOINT and the bulk operation can be redone.

                  Using NIO File Access

                  This method of file access uses the operating system's memory-mapped file buffer for the .data file. For larger databases with CACHED tables, use of nio improves database access speed significantly. Performance improvements can be tenfold or even higher. By default, NIO is used for .data files from 16 MB up to 256 MB. You can increase the limit with the SET FILES NIO SIZE <value> statement. There should be enough RAM available to accommodate the memory mapped buffers. For vary large nio usage, a 64 bit JVM must be used. The memory is not taken from the JVM memory allocation, therefore there is no need to increase the -Xmx parameter of the JVM. If not enough memory is available for the specified value, nio is not used.

                  Server Databases

                  Running databases in a HyperSQL server is the best overall method of access. As the JVM process is separate from the application, this method is the most reliable as well as the most accessible method of running databases.

                  Upgrading Databases

                  Any database that is not produced with the release version of HyperSQL 2.0 must be upgraded to this version.

                  Procedure 15.1. Upgrading Databases Created with Version 1.8.x

                  1. Open the database with the jar that created it and perform the SHUTDOWN statement as an SQL statement.

                  2. Open the database with the HyperSQL 2.0 jar.

                  3. Perform the SHUTDOWN COMPACT statement..

                  The first step is to guarantee there is no .log file for the database. When upgrading an application that has been deployed on a large scale, it is sometimes not practical to perform the first step of this procedure (with the old jar). You can ignore the first step but you may lose part of the database statements that are stored in the .log file. Therefore you need to test with databases created with your application to make sure typical statements that are logged in the .log file are compatible with the new version. Examples of known incompatible statements are some DDL statements used for changing the data type or default values of column.

                  A note about SHUTDOWN modes. SHUTDOWN COMPACT is equivalent to SHUTDOWN SCRIPT plus opening the database and then performing a simple SHUTDOWN.

                  After upgrading a database, you may want to change some of its settings. For example, the new SET FILES BACKUP INCREMENT TRUE statement can improve the shutdown and checkpoint times of larger databases.

                  Once a database is upgraded to 2.0, it can no longer be used with previous versions of HyperSQL.

                  Upgrading From Older Versions

                  To upgrade from version 1.8.x with the default TEXT format script files, follow the instructions above. If the 1.8.x files have database script format set to BINARY or COMPRESSED (ZIPPED) you must issue the SET SCRIPTFORMAT TEXT and SHUTDOWN SCRIPT commands with the old version, then open with the new version of the engine. In most cases the upgrade is successful and complete.

                  It is strongly recommended to execute SHUTDOWN COMPACT after an automatic upgrade from previous versions.

                  If your database has been created with version 1.7.2 or 1.7.3, first upgrade to version 1.8.1 and perform a SHUTDOWN SCRIPT with this version. You can then upgrade the database to version 2.0.

                  To upgrade from older version database files (1.7.1 and older) that contain CACHED tables, use the SCRIPT procedure below. In all versions of HyperSQL, the SCRIPT 'filename' command (used as an SQL statement) allows you to save a full record of your database, including database object definitions and data, to a file of your choice. You can export a script file using the old version of the database engine and open the script as a database with 2.0.

                  Procedure 15.2. Upgrade Using the SCRIPT Procedure for Very Old Versions

                  1. Open the original database in the old version of DatabaseManager

                  2. Issue the SCRIPT command, for example SCRIPT 'newversion.script' to create a script file containing a copy of the database.

                  3. SHUTDOWN this database.

                  4. Copy the original *.properties file into newversion.properties in the same directory as newversion.script

                  5. Try to open the new database newversion using DatabaseManager of version 1.8.1.

                  6. If there is any inconsistency in the data, the script line number is reported on the console and the opening process is aborted. Edit and correct any problems in the newversion.script before attempting to open again. Use the guidelines in the next section (Manual Changes to the .script File). Use a programming editor that is capable of handling very large files and does not wrap long lines of text.

                  Manual Changes to the *.script File

                  In HyperSQL 2.0 the full range of ALTER TABLE commands is available to change the data structures and their names. However, if an old database cannot be opened due to data inconsistencies, or it uses index or column names that are not compatible with 2.0, manual editing of the *.script file can be performed and can be faster.

                  • Version 2.0 does not accept duplicate names for indexes that were allowed before 1.7.2.

                  • Version 2.0 does not accept some table or column names that are SQL reserved keywords without double quoting.

                  • Version 2.0 does not accept unquoted table or column names which begin with an underscore, unless the connection sql.regular_names is set false.

                  • Version 2.0 is more strict with check conditions and default values.

                  Other manual changes are also possible. Note that the *.script file must be the result of a SHUTDOWN SCRIPT and must contain the full data for the database. The following changes can be applied so long as they do not affect the integrity of existing data.

                  • Names

                    Names of tables, columns and indexes can be changed. These changes must be consistent regarding foreign key constraint references.

                  • CHECK

                    A check constraint can always be removed.

                  • NOT NULL

                    A not-null constraint can always be removed.

                  • PRIMARY KEY

                    A primary key constraint can be removed. It cannot be removed if there is a foreign key referencing the column(s).

                  • UNIQUE

                    A UNIQUE constraint can be removed if there is no foreign key referencing the column(s).

                  • FOREIGN KEY

                    A FOREIGN KEY constraint can always be removed.

                  • COLUMN TYPES

                    Some changes to column types are possible. For example an INTEGER column can be changed to BIGINT.

                  After completing the changes and saving the modified .script file, you can open the database as normal.

                  Backward Compatibility Issues

                  HyperSQL 2.0 conforms to the SQL Standard better than previous versions and has many more features. For these reasons, there may be some compatibility issues when converting old database, or using applications that were written for version 1.8.x or earlier. Some of the potential issues (and enhancements) are listed here. See the full list of connection properties for alternatives.

                  • By default, when comparison strings, the shorter string is padded with spaces. This has an effect on comparing 'test' and 'test ' which are now considered equal, despite the length difference. This behaviour is controlled by the default PAD SPACE property of collations, which can be changed to NO PAD. See the statement SET DATABASE COLLATION <name> [ PAD SPACE | NO PAD ].

                  • User names and passwords are case-sensitive. Check the .script file of a database for the correct case of user name and password and use this form in the connection properties or on connection URL.

                  • It is now possible to specify the admin username and password for a new database (instead of SA and the empty password).

                  • HyperSQL 2.0 has several settings that relax its conformance to the SQL Standard in the areas of type conversion and object names. These settings can be turned on for maximum conformance.

                  • Check constraints must conform to the SQL Standard. A check constraint is rejected if it is not deterministic or retrospectively deterministic. When opening an old database, HyperSQL silently drops check constraints that no longer compile. See under check constraints for more detail about what is not allowed.

                  • Type declarations in column definition and in cast expressions must have the necessary size parameters.

                  • In connection with the above, an old database that did not have the enforce_strict_size property, is now converted to version 2.0 with the engine supplying the missing size parameters. For example, a VARCHAR column declaration that has no size, is given a 32K size, a LONGVARCHAR column is given a 16MB size. Check these sizes are adequate for your use, and change the column definition as necessary.

                  • Column names in a GROUP BY clause were previously resolved to the column label. They are now resolved to column name first, and if the name does not match, to the column label.

                  • If two or more tables in a join contain columns with the same name, the columns cannot be referenced in join and where conditions. Use table names before column names to qualify the references to such columns. The SET DATABASE SQL REFERENCES { TRUE | FALSE } statement enables or disables this check.

                  • If the unqualified wild card is used, as in the statement SELECT * FROM ... no additional column references are allowed. A table-qualified wild card allows additional column references in the SELECT list

                  • Table definitions containing GENERATED BY DEFAULT AS IDENTITY but with no PRIMARY KEY do not automatically create a primary key. Database .script files made with 1.8 are fine, as the PRIMARY KEY clause is always included. But the CREATE TABLE statements in your application program may assume an automatic primary key is created. The old shortcut, IDENTITY, is retained with the same meaning. So CREATE TABLE T (ID IDENTITY, DAT VARCHAR(20)) is translated into CREATE TABLE T(ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, DAT VARCHAR(20)). This last form is the correct way of defining both autoincrement and primary key in versions 1.8 and 2.0.

                  • CREATE ALIAS is now obsolete. Use the new function definition syntax. The org.hsqldb.Library class no longer exists. You should use the SQL form of the old library functions. For example, use LOG(x) rather than the direct form, "org.hsqldb.Library.log"(x).

                  • The names of some commands for changing database and session properties have changed. See the list of statements in this chapter.

                  • Computed columns in SELECT statements which did not have an alias: These columns had no ResultMetaData label in version 1.8, but in version 2.0, the engine generates labels such as C1, C2.

                  • The issue with the JDBC ResultSetMetaData methods, getColumnName(int column) and getColumnLabel(int column) has been clarified by the JDBC 4 specification. getColumName() returns the underlying column name, while getColumnLabel() returns any specified or generated alias. HyperSQL 1.8 and 2.0 have a connection property, get_column_name, which defaults to true in version 2.0, but defaulted to false in some releases of version 1.8.x. You have to explicitly specify this property as false if you want (non-standard behaviour) getColumnName() to return the same value as getColumnLabel().

                  HyperSQL Dependency Settings for Applications

                  Dependency settings using Gradle, Ivy, Maven, Groovy

                  This section is about building applications that have build-time dependencies upon HyperSQL, and for executions that use a dependency library system. Examples of the second type are unit test runs, job runs triggered by a build system, or systems like Grape that pull libraries from the network at end-user run time.

                  What version to Pull

                  The best option for most developers is to use our snapshot repository, or at least to depend upon the latest public version of HyperSQL with a range pattern like [2,). Here are exceptional cases where you should depend on a static version.

                  • Your application has code dependencies upon version-specific details of the HyperSQL distribution. In this case, the specific dependency specification should be checked in to your source code control system alongside the code that manifests the version-dependency. If your code is enhanced to use a newer version of HyperSQL, you should update the version specification so that whenever code + configs are checked out, the dependency will always match the code.
                  • Your organization only allows the use of vetted libraries. In this case, you vigorously maintain your configurations, updating your dependencies and regression testing as soon as new versions of HyperSQL are vetted. To get the best performance and reliability from HyperSQL, you should urge the appropriate parties to vet new versions as soon as they are publicly released.
                  • You need precisely reproducible builds.

                  If none of these situations apply to you, then follow the suggestions in the appropriate sections below. If you need to specify a specific version, follow the instructions in the range-versioning section but change the version range specifications to literal versions like 2.2.9.

                  Using the HyperSQL Snapshot Repository

                  Use the Latest & Greatest with Snapshots

                  The HyperSQL Snapshot repository resides at http://hsqldb.org/repos/

                  [Note]Limitation of Classifiers

                  Classifiers are incompatible with real repository snapshots. Builders can only publish one jar variant per product, and at this time our snapshot jars are always built debug-enabled with Java 6.

                  Where you insert the <repository> element depends on whether you want the definition to be personal, shared, or project-specific, so see the Maven documentation about that. But you can paste this element verbatim:

                  Example 15.3. HyperSQL Snapshot Repository Definition

                      <repository>
                        <releases>
                          <enabled>false</enabled>
                        </releases>
                        <snapshots>
                          <enabled>true</enabled>
                          <updatePolicy>always</updatePolicy>
                          <checksumPolicy>fail</checksumPolicy>
                        </snapshots>
                        <id>hsqldb_snapshots</id>
                        <name>HyperSQL Snapshots</name>
                        <url>http://hsqldb.org/repos</url>
                        <layout>default</layout>
                      </repository>

                  Snapshot Dependency Specification Examples

                  Example 15.4. Sample Snapshot Ivy Dependency

                         <dependency org="org.hsqldb" name="hsqldb" rev="SNAPSHOT" conf="buildOnly"/>

                  Example 15.5. Sample Snapshot Maven Dependency

                          <dependency>
                            <groupId>org.hsqldb<groupId>
                            <artifactId>hsqldb<artifactId>
                            <version>SNAPSHOT<version>
                            <!-- Scope defaults to "compile":
                            <scope>test<scope>
                            -->
                          <dependency>

                  Example 15.6. Sample Snapshot Gradle Dependency

                      dependencies.compile (group: 'org.hsqldb', name: 'hsqldb', version:'SNAPSHOT')
                      dependencies {
                          runtime 'org.hsqldb:hsqldb:SNAPSHOT',
                                  'org.hsqldb:sqltool:SNAPSHOT'
                      }

                  If you want to use an ivy.xml file with a Gradle build, you will need use the Ivyxml Gradle Plugin. It just takes a few links of code in your build.gradle file to hook in ivyxml. See the Ivyxml documentation to see exactly how.

                  Example 15.7. Sample Snapshot ivy.xml loaded by Ivyxml plugin

                      <ivy-module version="2.0">
                      ...
                      <dependency org="org.hsqldb" name="hsqldb" rev="SNAPSHOT"/>


                  Example 15.8. Sample Snapshot Groovy Dependency, using Grape

                  @Grab(group='org.hsqldb', module='hsqldb', version='SNAPSHOT')

                  Range Versioning

                  Keeping up-to-date with Range Dependencies

                  [Note]Limitation of Maven Version Range Specifiers

                  Note that Ivy (and the many systems that use Ivy underneath, like Grape and Gradle) supports the opening exclusive ] in addition to [, whereas Maven supports only the opening inclusive [ specifier. See the relevant Ivy or Maven documentation for details. There are special cases where you should depend on a specific version instead.

                  Range Dependency Specification Examples

                  [Important]Important

                  For all examples below, when a range pattern is given, it means the latest version equal or greater than version 2. If a classifier is shown, it is optional and you can skip it to get the default (no-classifier) jar.

                  Example 15.9. Sample Range Ivy Dependency

                         <dependency org="org.hsqldb" name="hsqldb" rev="[2,)" conf="j6->default"/>

                  I give no example here of specifying a classifier in ivy.xml because I have so far failed to get that to succeed. Classifiers in in ivy.xml are supported if using Gradle, as covered below.


                  Example 15.10. Sample Range Maven Dependency

                  See note above about Maven range specifications.

                          <dependency>
                            <groupId>org.hsqldb<groupId>
                            <artifactId>hsqldb<artifactId>
                            <version>[2,)<version>
                            <!-- Scope defaults to "compile":
                            <scope>test<scope>
                              Use a classifier to pull one of our alternative jars:
                            <classifier>jdk5<classifier>
                            -->
                          <dependency>

                  Example 15.11. Sample Range Gradle Dependency

                      dependencies.compile (group: 'org.hsqldb', name: 'hsqldb', version:'[2,)', classifier: 'jdk5')
                      dependencies {
                          runtime 'org.hsqldb:hsqldb:[2,):jdk6debug@jar',
                                  'org.hsqldb:sqltool:[2,):jdk6debug@jar'
                      }

                  If you want to use an ivy.xml file with a Gradle build, you will need use the Ivyxml Gradle Plugin. It just takes a few links of code in your build.gradle file to hook in ivyxml. See the Ivyxml documentation to see exactly how.

                  Example 15.12. Sample Range ivy.xml loaded by Ivyxml plugin

                      <ivy-module version="2.0" xmlns:m="http://ant.apache.org/ivy/maven">
                      ...
                      <dependency org="org.hsqldb" name="hsqldb" rev="[2,)" m:classifier="jdk5"/>


                  Example 15.13. Sample Range Groovy Dependency, using Grape

                  @Grab(group='org.hsqldb', module='hsqldb', version='[2,)', classifier='jdk6debug')

                  Lists of Keywords

                  List of SQL Keywords

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 847 $

                  2012-08-06 00:09:15+0100

                  List of SQL Standard Keywords

                  According to the SQL Standard, the SQL Language keywords cannot be used as identifiers (names of database objects such as columns and tables) without quoting.

                  HyperSQL has two modes of operation, which are selected with the SET DATABASE SQL NAMES { TRUE | FALSE } to allow or disallow the keywords as identifiers. The default mode is FALSE and allows the use of most keywords as identifiers. Even in this mode, keywords cannot be used as USER or ROLE identifiers. When the mode is TRUE, none of the keywords listed below can be used as identifiers.

                  All keywords can be used with double quotes as identifiers. For example

                    CREATE TABLE "ALL" ("AND" INT, "WHEN" INT)
                    SELECT "AND" FROM "ALL" WHERE "WHEN" = 2020
                  

                  ABS • ALL • ALLOCATE • ALTER • AND • ANY • ARE • ARRAY • AS • ASENSITIVE • ASYMMETRIC • AT • ATOMIC • AUTHORIZATION • AVG

                  BEGIN • BETWEEN • BIGINT • BINARY • BLOB • BOOLEAN • BOTH • BY

                  CALL • CALLED • CARDINALITY • CASCADED • CASE • CAST • CEIL • CEILING • CHAR • CHAR_LENGTH • CHARACTER • CHARACTER_LENGTH • CHECK • CLOB • CLOSE • COALESCE • COLLATE • COLLECT • COLUMN • COMMIT • COMPARABLE • CONDITION • CONNECT • CONSTRAINT • CONVERT • CORR • CORRESPONDING • COUNT • COVAR_POP • COVAR_SAMP • CREATE • CROSS • CUBE • CUME_DIST • CURRENT • CURRENT_CATALOG • CURRENT_DATE • CURRENT_DEFAULT_TRANSFORM_GROUP • CURRENT_PATH • CURRENT_ROLE • CURRENT_SCHEMA • CURRENT_TIME • CURRENT_TIMESTAMP • CURRENT_TRANSFORM_GROUP_FOR_TYPE • CURRENT_USER • CURSOR • CYCLE

                  DATE • DAY • DEALLOCATE • DEC • DECIMAL • DECLARE • DEFAULT • DELETE • DENSE_RANK • DEREF • DESCRIBE • DETERMINISTIC • DISCONNECT • DISTINCT • DO • DOUBLE • DROP • DYNAMIC

                  EACH • ELEMENT • ELSE • ELSEIF • END • END_EXEC • ESCAPE • EVERY • EXCEPT • EXEC • EXECUTE • EXISTS • EXIT • EXP • EXTERNAL • EXTRACT

                  FALSE • FETCH • FILTER • FIRST_VALUE • FLOAT • FLOOR • FOR • FOREIGN • FREE • FROM • FULL • FUNCTION • FUSION

                  GET • GLOBAL • GRANT • GROUP • GROUPING

                  HANDLER • HAVING • HOLD • HOUR

                  IDENTITY • IN • INDICATOR • INNER • INOUT • INSENSITIVE • INSERT • INT • INTEGER • INTERSECT • INTERSECTION • INTERVAL • INTO • IS • ITERATE

                  JOIN

                  LAG

                  LANGUAGE • LARGE • LAST_VALUE • LATERAL • LEAD • LEADING • LEAVE • LEFT • LIKE • LIKE_REGEX • LN • LOCAL • LOCALTIME • LOCALTIMESTAMP • LOOP • LOWER

                  MATCH • MAX • MAX_CARDINALITY • MEMBER • MERGE • METHOD • MIN • MINUTE • MOD • MODIFIES • MODULE • MONTH • MULTISET

                  NATIONAL • NATURAL • NCHAR • NCLOB • NEW • NO • NONE • NORMALIZE • NOT • NTH_VALUE • NTILE • NULL • NULLIF • NUMERIC

                  OCCURRENCES_REGEX • OCTET_LENGTH • OF • OFFSET • OLD • ON • ONLY • OPEN • OR • ORDER • OUT • OUTER • OVER • OVERLAPS • OVERLAY

                  PARAMETER • PARTITION • PERCENT_RANK • PERCENTILE_CONT • PERCENTILE_DISC • POSITION • POSITION_REGEX • POWER • PRECISION • PREPARE • PRIMARY • PROCEDURE

                  RANGE • RANK • READS • REAL • RECURSIVE • REF • REFERENCES • REFERENCING • REGR_AVGX • REGR_AVGY • REGR_COUNT • REGR_INTERCEPT • REGR_R2 • REGR_SLOPE • REGR_SXX • REGR_SXY • REGR_SYY • RELEASE • REPEAT • RESIGNAL • RESULT • RETURN • RETURNS • REVOKE • RIGHT • ROLLBACK • ROLLUP • ROW • ROW_NUMBER • ROWS

                  SAVEPOINT • SCOPE • SCROLL • SEARCH • SECOND • SELECT • SENSITIVE • SESSION_USER • SET • SIGNAL • SIMILAR • SMALLINT • SOME • SPECIFIC • SPECIFICTYPE • SQL • SQLEXCEPTION • SQLSTATE • SQLWARNING • SQRT • STACKED • START • STATIC • STDDEV_POP • STDDEV_SAMP • SUBMULTISET • SUBSTRING • SUBSTRING_REGEX • SUM • SYMMETRIC • SYSTEM • SYSTEM_USER

                  TABLE • TABLESAMPLE • THEN • TIME • TIMESTAMP • TIMEZONE_HOUR • TIMEZONE_MINUTE • TO • TRAILING • TRANSLATE • TRANSLATE_REGEX • TRANSLATION • TREAT • TRIGGER • TRIM • TRIM_ARRAY • TRUE • TRUNCATE

                  UESCAPE • UNDO • UNION • UNIQUE • UNKNOWN • UNNEST • UNTIL • UPDATE • UPPER • USER • USING

                  VALUE • VALUES • VAR_POP • VAR_SAMP • VARBINARY • VARCHAR • VARYING

                  WHEN • WHENEVER • WHERE • WIDTH_BUCKET • WINDOW • WITH • WITHIN • WITHOUT • WHILE

                  YEAR

                  List of SQL Keywords Disallowed as HyperSQL Identifiers

                  When the default SET DATABASE SQL NAMES FALSE mode is used, only a subset of SQL Standard keywords cannot be used as HyperSQL identifiers. The keywords are as follows:

                  ALL • AND • ANY • AS • AT • AVG

                  BETWEEN • BOTH • BY

                  CALL • CASE • CAST • COALESCE • CORRESPONDING • CONVERT • COUNT • CREATE • CROSS

                  DEFAULT • DISTINCT • DROP

                  ELSE • END • EVERY • EXISTS • EXCEPT

                  FOR • FROM • FULL

                  GRANT • GROUP

                  HAVING

                  IN • INNER • INTERSECT • INTO • IS

                  JOIN

                  LEFT • LEADING • LIKE

                  MAX • MIN

                  NATURAL • NOT • NULLIF

                  ON • ORDER • OR • OUTER

                  PRIMARY

                  REFERENCES • RIGHT

                  SELECT • SET • SOME • STDDEV_POP • STDDEV_SAMP • SUM

                  TABLE • THEN • TO • TRAILING • TRIGGER

                  UNION • UNIQUE • USING

                  VALUES • VAR_POP • VAR_SAMP

                  WHEN • WHERE • WITH

                  Special Function Keywords

                  HyperSQL supports SQL Standard functions that are called without parentheses. These functions include CURRENT_DATE, LOCALTIMESTAMP, TIMEZONE_HOUR, USER, etc. When the default SET DATABASE SQL NAMES FALSE mode is used, keywords that are names of SQL functions can be used as column names without double quotes in CREATE TABLE statements . But when the identifier is a column name and is referenced in SELECT or other statements, the keywords must be double quoted. Otherwise the result of the SQL function is returned instead of the column value.

                  HyperSQL also supports non-standard functions SYSTIMESTAMP, CURDATE, CURTIME, TODAY, SYSDATE and NOW which can be called with or without parentheses ( e.g. NOW() or NOW ). These names can be used as column names, but the names must be double quoted in SELECT and other statements.

                  Building HyperSQL Jars

                  How to build customized or specialized jar files

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 4909 $

                  2012-08-06 00:09:15+0100

                  Purpose

                  From version 2.0, the supplied hsqldb.jar file is built with Java 1.6. If you want to run with a 1.5 or older JVM, or if you want to use an alternative jar (hsqldb-min.jar, etc.) you must build the desired jar with a Java SDK.

                  The Gradle task / Ant target explainjars reports the versions of Java and Ant actually used.

                  Building with Gradle

                  As noted above, Java SDK 5 or later is required.

                  Unlike most software build systems, you do not need to have the Gradle system installed on your computer to use it. You don't need to understand the details to use it, but this is the purpose of the gradlew wrapper scripts that you can see in HyperSQL's build directory. If you want or need to learn more about Gradle, you can start on the Gradle Documentation page on the Gradle web site.

                  [Note]Gradle honors JAVA_HOME

                  Gradle can find the Java to use by finding out where java is available from, but if environmental variable JAVA_HOME is set, that will override. Therefore, if you have multiple JREs or JDKs installed, or don't know if multiple are installed, you should set environmental variable JAVA_HOME to definitively eliminate all ambiguity.

                  [Important]Rare Gotcha

                  Depending on your operating system, version, and how you installed your JDK, Gradle may not be able to find the JDK. Gradle will inform you if this happens. The easiest way to fix this problem is to set environmental variable JAVA_HOME to the root directory where your Java SDK is installed. (See previous note for justification). So as not to get bogged down in the details here, if you don't know how to set an environmental variable, I ask you to utilize a search engine.

                  Invoking a Gradle Build Graphically

                  Whether from an IDE, a shortcut or launch icon, to run a Gradle graphical build you just need to execute either the file gradle-gui.cmd (on Windows) or gradle-gui (all other platforms), both of which reside in the build directory of your HyperSQL distribution.

                  I will explain how to invoke a graphical Gradle build from Windows Explorer and from Eclipse IDE. Users of other operating systems should be able to infer how to use their own file manager in the same way as shown for Internet Explorer. Users who want a desktop shortcut, quick-launch icon should first get Gradle working from a file manager (like Windows Explorer), then seek out instructions for making shortcuts, etc. for your operating system or desktop manager. (Try a web search).

                  Some IDEs, like IntelliJ have direct support for Gradle. The Spring Framework team is working on a sophisticated plugin for using Gradle with their IDE. But I'm going to document a very basic setup done with Eclipse because it's serviceable and a very similar procedure is likely to work with all other IDEs.

                  If you do use and enjoy Gradle, then I urge you to make the product better by registering a free account for yourself at the Gradle Jira site and vote for critical usability issues like GRADLE-427, GRADLE-1855, GRADLE-1870, GRADLE-1871, to help to improve the product.

                  Procedure B.1. Invoking Gradle GUI from Windows Explorer

                  1. Start up Windows explorer. Depending on your Windows version, it will be in the Start Menu, or in the menu you get when you right-click Start.

                  2. Navigate Windows Explorer to the build directory within your HyperSQL installation.

                  3. Find an icon or line (depending on your Windows Explorer view) for the file gradle-gui.cmd. If there is no listing for gradle-gui.cmd, but two listings for gradle-gui, then you want the one signified by text, icon, or mouse-over tooltip, as a batch or CMD file. Double-click this item.

                  Procedure B.2. Setting up Gradle Graphical Builds from Eclipse IDE

                  1. From Eclipse, use pulldown menu Run / External Tools / External Tools Configurations....

                  2. Right-click on Program in the left navigator Right-click Project in the left navigator panel and select New. (Depending on the state of your workspace, instead of New in the context-sensitive menu, there may be a New_configuration or similar item nested under Program, in which case you should select that).

                  3. To the right, change the value in the Name: field to HSQLDB Gradle (or whatever name you want for this launcher config (this Gradle launcher is only for your HSQLDB project).

                  4. Make sure that the Main tab is selected.

                  5. For the Location: field, use the Browse Workspace... button to navigate to and select the gradle-gui.cmd (Windows) or gradle-gui (other) file in the build directory of your HyperSQL project.

                    Configuring Gradle GUI Launcher in Eclipse

                    Depending on your Eclipse version and workspace setup, the value populated into the Location: field after you select the program may appear very differently than in this screen shot.

                  6. Click the Run button. The Gradle Gui should run. (If you just Apply and Close here instead of Run, the new Gradle launch item will not be added to the pulldown and toolbar menus).

                  After doing the Eclipse setup, you can use pulldown menu Run / External Tools or the equivalent tool bar button button to launch the Gradle Gui.

                  Invoking Gradle GUI from Eclipse

                  You can do this and close it after each use, or, to avoid startup lag, minimize it when it's not in use.

                  Invoking a Gradle Build from the Command Line

                  You can invoke graphical and non-graphical Gradle builds from the command-line.

                  1. Get a command-line shell. Windows users can use either Start/Run... or Start/Start Search, and enter "cmd". Non-windows users will know how to get a shell.

                  2. In the shell, cd to the build directory under the root directory where you extracted or installed HyperSQL to. (Operating system search or find functions can be used if you can't find it quickly by poking around on the command line or with Windows Explorer, etc.).

                  3. Windows users can ignore this step. UNIX shell users should ensure that the current directory (.) is in their search path, or prefix their gradlew or gradle-gui command in the next step with ./ (e.g., like ./gradlew).

                  4. In the shell, run either gradle-gui for a graphical build; or gradlew for a text-based build.

                  The gradle-gui file is our own wrapper script for gradlew --gui. Be aware that both gradle-gui and gradlew --gui suffer from the limitation that the --gui switch is mutually exclusive with most or all other arguments (including tasks). I have registered GRADLE bugs 1861 and 1863 about this.

                  Using Gradle

                  Using Text-based Gradle

                  If you ran just gradlew or gradlew.bat, then you will be presented with simple instructions for how to do everything that you want to do. Basically, you will run the same gradlew or gradle.bat command repeatedly, with different switches and arguments.

                  [Note]Note

                  Gradle's -v switch reports version details more directly than the explainjars task does, from the operating system version to the Groovy version (the language interpreter used for Gradle instructions).

                  Using the Gradle GUI

                  Sample Gradle GUI Screen

                  Procedure B.3. First Time using Gradle Gui

                  1. It takes the Gradle gui a while to start up, because, similar to an IDE, it is generating a list of details about available tasks.

                  2. In the main window, in the top panel, with the Task Tree tab selected, you have the list of public tasks, sorted alphabetically. Down bottom is displayed the output of the last task(s) execution. (After startup it will show the output of the task tasks).

                  3. Scroll to the help task and click it once to select it, then click the green Execute toolbar button above. (You could also have double-clicked the item, but you can use the selection procedure to pick multiple tasks with Control or Shift keys to execute multiple tasks in a single run-- and the tasks will execute in the same order that you had selected them).

                  4. Scroll through and read the output of the help task in the bottom panel. Where this help screen speaks about verbosity switches, you can accomplish the same thing by using the Setup tab. Whenever Gradle output (in the bottom panel) talks about running gradlew <sometask>..., you can execute the specified task(s) by selecting and executing them like we just did.

                  [Note]Gradle GUI Limitations

                  The Gradle GUI is fairly new and lacks some of the power available to text-based users. Most significantly, in my opinion, is the following item for which I have opened Gradle issues 1855. There is no convenient way to set build properties. If you want to change Ant or Gradle build settings, edit the text file build.properties in the HyperSQL build directory (creating it if it doesn't exist yet), and enter your properties using Java properties file syntax. (You can also use local-docbook.properties in the same way for DocBook-specific properties).

                  Building with Apache Ant

                  You should use version 1.7.x of Ant (Another Neat Tool) to do Ant builds with HyperSQL.

                  Obtaining Ant

                  Ant is a part of the Jakarta/Apache Project.

                  Building Hsqldb with Ant

                  Once you have unpacked the zip package for hsqldb, under the /hsqldb folder, in /build there is a build.xml file that builds the hsqldb.jar with Ant (Ant must be already installed). To use it, change to /build then type:

                   ant -projecthelp

                  This displays the available ant targets, which you can supply as command line arguments to ant. These include

                  hsqldb

                  to build the hsqldb.jar file

                  explainjars

                  Lists all targets which build jar files, with an explanation of the purposes of the different jars.

                  clean

                  to clean up the /classes directory that is created

                  clean-all

                  to remove the old jar and doc files as well

                  javadoc

                  to build javadoc

                  hsqldbmain

                  to build a smaller jar for HSQLDB that does not contain utilities

                  hsqljdbc

                  to build an extremely small jar containing only the client-side JDBC driver (can connect only to a HyperSQL Server).

                  hsqldbmin

                  to build a small jar that supports in-process catalogs, but neither running nor connecting to HyperSQL Servers.

                  sqltool

                  to build sqltool.jar, which contains only the SqlTool classes.

                  ...

                  Many more targets are available. Run ant -p and ant explainjars.

                  HSQLDB can be built in any combination of two JRE (Java Runtime Environment) versions and many jar file sizes.

                  A jar built with an older JRE is compatible for use with a newer JRE (you can compile with Java 1.5 and run with 1.6). But the newer JDBC capabilities of the JRE will be not be available.

                  The client jar (hsqljdbc.jar) contains only the HSQLDB JDBC Driver client. The smallest engine jar (hsqldbmin.jar) contains the engine and the HSQLDB JDBC Driver client. The default size (hsqldb.jar) also contains server mode support and the utilities. The largest size (hsqldbtest.jar)includes some test classes as well. Before building the hsqldbtest.jar package, you should download the junit jar from http://www.junit.org and put it in the /lib directory, alongside servlet.jar, which is included in the .zip package.

                  If you want your code built for high performance, as opposed to debugging (in the same way that we make our production distributions), make a file named build.properties in your build directory with the contents

                  build.debug: false

                  The resulting Java binaries will be faster and smaller, at the cost of exception stack traces not identifying source code locations (which can be extremely useful for debugging).

                  After installing Ant on your system use the following command from the /build directory. Just run ant explainjars for a concise list of all available jar files.

                  ant explainjars

                  The command displays a list of different options for building different sizes of the HSQLDB Jar. The default is built using:

                  Example B.1. Buiding the standard Hsqldb jar file with Ant

                  ant hsqldb

                  The Ant method always builds a jar with the JDK that is used by Ant and specified in its JAVA_HOME environment variable.

                  Building for Older JDKs

                  HyperSQL version 2.0 cannot be directly compiled or used with JDK 1.4. It may be possible to use the RetroTranslator tool to achieve this. The suggested procedure is as follows: First use Gradle or Ant with JDK 1.5 and build the jar. Then translate the jar using RetroTranslator with backport (which bundles replacement classes for concurrency control). This translation should cover the concurrency features that are specific to version 1.5 and later.

                  ant switchtojdk14
                  ant hsqldb
                  -- translate the jar
                  

                  Building with IDE Compilers

                  All HyperSQL source files are supplied ready to compile. There is no complex pre-compile stage. It is therefore possible to compile the sources with an IDE, without using Gradle or Ant. Only if compilation with Java 1.5 is required, you should first run the Gradle task (or Ant target) before compiling and remove from the source directories a few source files that are specific to Java 6 (these are listed in the build.xml file).

                  Hsqldb CodeSwitcher

                  CodeSwitcher is a tool to manage different version of Java source code. It allows to compile HyperSQL for different JDKs. It is something like a precompiler in C but it works directly on the source code and does not create intermediate output or extra files.

                  CodeSwitcher is used internally in the Ant build. You do not have to invoke it separately to compile HyperSQL.

                  CodeSwitcher reads the source code of a file, removes comments where appropriate and comments out the blocks that are not used for a particular version of the file. This operation is done for all files of a defined directory, and all subdirectories.

                  Example B.2. Example source code before CodeSwitcher is run

                          ...
                  
                      //#ifdef JAVA2
                  
                          properties.store(out,"hsqldb database");
                  
                      //#else
                  
                      /*
                  
                          properties.save(out,"hsqldb database");
                  
                      */
                  
                      //#endif
                  
                          ...

                  The next step is to run CodeSwitcher.

                  Example B.3. CodeSwitcher command line invocation

                      java org.hsqldb.util.CodeSwitcher . -JAVA2

                  The '.' means the program works on the current directory (all subdirectories are processed recursively). -JAVA2 means the code labelled with JAVA2 must be switched off.

                  Example B.4. Source code after CodeSwitcher processing

                          ...
                  
                      //#ifdef JAVA2
                  
                      /*
                  
                          pProperties.store(out,"hsqldb database");
                  
                      */
                  
                      //#else
                  
                          pProperties.save(out,"hsqldb database");
                  
                      //#endif
                  
                          ...

                  For detailed information on the command line options run java org.hsqldb.util.CodeSwitcher. Usage examples can be found in the build.xml file in the /build directory.

                  Building Documentation

                  The JavaDoc can be built simply by invoking the javadoc task/target with Gradle or Ant.

                  The two Guides (the one you are reading now plus the Utilities user guide) are in DocBook XML source format. To rebuild to PDF or one of the HTML output formats from the XML source, run the Gradle target gen-docs (or the Ant target gen-docs). Instructions will be displayed. In particular

                  • Obtain the HyperSQL documentation source. We no longer include our Guide source files in our main distribution zip file, in order to keep it small. You may want to build from the trunk branch or the latest release tag. You can download a static snapshot tarball from http://hsqldb.svn.sourceforge.net/viewvc/hsqldb/base/trunk/ or under http://hsqldb.svn.sourceforge.net/viewvc/hsqldb/base/tags/ , or you can export a snapshot or check out a work area using a Subversion client.
                  • You must locally install the DocBook set of image files, which are available for download from Sourceforge. The gen-docs task/target will tell you of a Gradle task that you can use to download and install them automatically. This Gradle task, installDbImages, will tell you how to edit a properties text file to tell it what directory to install the files into. (Command-line, as opposed to GUI, builders, can use the Gradle -P switch to set the property, instead of editing, if they prefer).
                  • You can optionally install the entire DocBook style sheets (instead of just the DocBook images within it), character entity definitions, and RNG schema file, to speed up doc build times and minimize dependency of future builds upon network or Internet. An intermediate approach would be to install these resources onto an HTTP server or shared network drive of your own. See the comments at the top of the file build.xml in the HyperSQL build directory about where to obtain these things and how to hook them in. The same Gradle task installDbImages explained above can download and install the entire stylesheet bundle (this option is offered the first time that you run the installDbImages task).
                  [Tip]Tip

                  If running Gradle, you probably want to turn logging up to level info for generation and validation tasks, because the default warn/lifecycle level doesn't give much feedback.

                  The task/target validate-docs is also very useful to DocBook builders.

                  The documentation license does not allow you to post modifications to our guides, but you can modify them for internal use by your organization, and you can use our DocBook system to write new DocBook documents related or unrelated to HyperSQL. To create new DocBook documents, create a subdirectory off of doc-src for each new document, with the main DocBook source file within having same name as the directory plus .xml. See the peer directory util-guide or guide as an example. If you use the high-level tasks/target gen-docs or validate-docs, then copy and paste to add new stanzas to these targets in file build.xml.

                  Editors of DocBook documents (see previous paragraph for motive) may find it useful to have a standalone XML validator so you can do your primary editing without involvement of the build system. Use the Gradle target standaloneValidation for this. It will tell you how to set a build property to tell it where to install the validator, and will give instructions on how to use it.

                  There are several properties that can be used to dramatically decrease run times for partial doc builds. Read about these properties in comment at the top of the file build-docbook.xml in the build directory.

                  • validation.skip
                  • html.skip
                  • chunk.skip
                  • fo.skip
                  • pdf.skip
                  • doc.name
                  • doc.target

                  See the file doc-src/readme-docauthors.txt for details about our DocBook build system (though as I write this it is somewhat out of date).

                  HyperSQL with OpenOffice

                  How to use HyperSQL with OpenOffice.org

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5051 $

                  2012-08-06 00:09:15+0100

                  HyperSQL with OpenOffice

                  OpenOffice.org / LibreOffice / ApacheOpenOffice includes HyperSQL and uses it for embedded databases. Our collaboration with OpenOffice.org developers over the last few years has benefited the development and maturity of HyperSQL. Before integration into OOo, HSQLDB was intended solely for application-specific database access. The application developer was expected to resolve any integration issues. Because OpenOffice.org is used by a vast range of users, from schoolchildren to corporate developers, a much higher level of quality assurance has been required. We have achieved it with constant help and feedback from OOo users and developers.

                  Apart from embedded use, you may want to use OpenOffice / LibreOffice with a HyperSQL server instance. The typical use for this is to allow multiple office users access to the same database.

                  There is also a strong case for using OpenOffice to develop your database schema and application, even if the database is intended for your own application, rather than OpenOffice.

                  HSQLDB version 1.8.0 is included in OOo, ApacheOpenOffice and LibreOffice 3.x. You can simply replace the jar with an HSQLDB version 2.2.9 jar to use the latest capabilities with external databases. It is not yet possible to create and use embedded databases with this version.

                  HSQLDB version 2.x jar will hopefully be included in the future versions of ApacheOpenOffice and LibreOffice.

                  Using OpenOffice / LibreOffice as a Database Tool

                  OpenOffice is a powerful database front end. If you want to create schemas, edit tables, edit the database contents manually, design and produce well-formatted reports, then OpenOffice is probably the best open source tools currently available.

                  To connect from OpenOffice to your database, first run a local server instance for the database. This is describes in the Network Listeners chapter of this guide.

                  When you connect from OpenOffice.org, you must specify connection to an external database and use the URL property "default_schema=true". For example, the URL to connect the local database may be like

                   jdbc;hsqldb:hsql://localhost/mydb;default_schema=true 

                  The only current limitation is that OpenOffice only works with the PUBLIC schema. This limitation will hopefully disappear in the future versions of OOo.

                  There wil hopefuly be a version 2.x jar in the future versions of OpenOffice.

                  Converting .odb files to use with HyperSQL Server

                  You may already have an OOo database file, which you want to use outside OOo, or as a server database. The file is in fact in the standard ZIP format and contains the normal HyperSQL database files. Just use a utility such as 7Zip to expand the .odb file. In the /db directory, there are files such as .script, .data, etc. Just rename these files into mydb.script, mydb.data, etc. You can now open the mydb database directly with HyperSQL as an embedded database or as a server instance.

                  Appendix D. HyperSQL File Links

                  HyperSQL Files referred to in this Guide

                  HyperSQL files referred to in the text may be retrieved from the canonical HyperSQL documentation site, http://hsqldb.org/doc/2.0, or from the same location you are reading this page from.

                  [Note]Note

                  If you are reading this document with a standalone PDF reader, only the http://hsqldb.org/doc/2.0/... links will function.

                  Pairs of local + http://hsqldb.org/doc/2.0 links for referenced files.

                  SQL Index

                  Symbols

                  _SYSTEM ROLE, Built-In Roles and Users

                  A

                  ABS function, Numeric Functions
                  ACOS function, Numeric Functions
                  ACTION_ID function, System Functions
                  ADD COLUMN, Table Manipulation
                  add column identity generator, Table Manipulation
                  ADD CONSTRAINT, Table Manipulation
                  ADD DOMAIN CONSTRAINT, Domain Creation and Manipulation
                  ADMINISTRABLE_ROLE_AUTHORIZATIONS, SQL Standard Views
                  aggregate function, Aggregate Functions
                  ALL and ANY predicates, Predicates
                  ALTER COLUMN, Table Manipulation
                  alter column identity generator, Table Manipulation
                  alter column nullability, Table Manipulation
                  ALTER DOMAIN, Domain Creation and Manipulation
                  ALTER INDEX, Other Schema Object Creation
                  ALTER routine, Routine Creation
                  ALTER SEQUENCE, Sequence Creation
                  ALTER SESSION, Session and Transaction Control Statements
                  ALTER TABLE, Table Manipulation
                  ALTER USER ... SET INITIAL SCHEMA, Statements for Authorization and Access Control
                  ALTER USER ... SET LOCAL, Statements for Authorization and Access Control
                  ALTER USER ... SET PASSWORD, Statements for Authorization and Access Control
                  ALTER view, View Creation and Manipulation
                  APPLICABLE_ROLES, SQL Standard Views
                  ASCII function, String and Binary String Functions
                  ASIN function, Numeric Functions
                  ASSERTIONS, SQL Standard Views
                  ATAN2 function, Numeric Functions
                  ATAN function, Numeric Functions
                  AUTHORIZATION IDENTIFIER, Authorizations and Access Control
                  AUTHORIZATIONS, SQL Standard Views

                  B

                  BACKUP DATABASE, System Operations
                  BETWEEN predicate, Predicates
                  binary literal, Literals
                  BINARY types, Binary String Types
                  BIT_LENGTH function, String and Binary String Functions
                  BITAND function, Numeric Functions
                  BITANDNOT function, Numeric Functions
                  bit literal, Literals
                  BITNOT function, Numeric Functions
                  BITOR function, Numeric Functions
                  BIT types, Bit String Types
                  BITXOR function, Numeric Functions
                  boolean literal, Literals
                  BOOLEAN types, Boolean Type
                  boolean value expression, Value Expression

                  C

                  CARDINALITY function, Array Functions
                  CASCADE or RESTRICT, Common Elements and Statements
                  case expression, Value Expression
                  CASEWHEN function, General Functions
                  CASE WHEN in routines, Conditional Statements
                  CAST, Value Expression
                  CEIL function, Numeric Functions
                  CHANGE_AUTHORIZATION, Built-In Roles and Users
                  CHAR_LENGTH, String and Binary String Functions
                  CHARACTER_LENGTH, String and Binary String Functions
                  CHARACTER_SETS, SQL Standard Views
                  character literal, Literals
                  CHARACTER types, Character String Types
                  character value function, Value Expression
                  CHAR function, String and Binary String Functions
                  CHECK_CONSTRAINT_ROUTINE_USAGE, SQL Standard Views
                  CHECK_CONSTRAINTS, SQL Standard Views
                  CHECK constraint, Table Creation
                  CHECKPOINT, System Operations
                  COALESCE expression, Value Expression
                  COALESCE function, General Functions
                  COLLATE, Other Syntax Elements
                  COLLATIONS, SQL Standard Views
                  COLUMN_COLUMN_USAGE, SQL Standard Views
                  COLUMN_DOMAIN_USAGE, SQL Standard Views
                  COLUMN_PRIVILEGES, SQL Standard Views
                  COLUMN_UDT_USAGE, SQL Standard Views
                  column definition, Table Creation
                  column name list, Table Primary
                  column reference, References, etc.
                  COLUMNS, SQL Standard Views
                  COMMENT, Commenting Objects
                  COMMIT, Session and Transaction Control Statements
                  comparison predicate, Predicates
                  CONCAT function, String and Binary String Functions
                  CONSTRAINT, Other Syntax Elements
                  CONSTRAINT_COLUMN_USAGE, SQL Standard Views
                  CONSTRAINT_TABLE_USAGE, SQL Standard Views
                  CONSTRAINT (table constraint), Table Creation
                  CONSTRAINT name and characteristics, Table Creation
                  contextually typed value specification, References, etc.
                  CONVERT function, General Functions
                  COS function, Numeric Functions
                  COT function, Numeric Functions
                  CREATE_SCHEMA ROLE, Built-In Roles and Users
                  CREATE AGGREGATE FUNCTION, Definition of Aggregate Functions
                  CREATE ASSERTION, Other Schema Object Creation
                  CREATE CAST, Other Schema Object Creation
                  CREATE CHARACTER SET, Other Schema Object Creation
                  CREATE COLLATION, Other Schema Object Creation
                  CREATE DOMAIN, Domain Creation and Manipulation
                  CREATE FUNCTION, Routine Definition
                  CREATE INDEX, Other Schema Object Creation
                  CREATE PROCEDURE, Routine Definition
                  CREATE ROLE, Statements for Authorization and Access Control
                  CREATE SCHEMA, Schema Creation
                  CREATE SEQUENCE, Sequence Creation
                  CREATE TABLE, Table Creation
                  CREATE TRANSLATION, Other Schema Object Creation
                  CREATE TRIGGER, Trigger Creation, Trigger Creation
                  CREATE TYPE, Other Schema Object Creation
                  CREATE USER, Statements for Authorization and Access Control
                  CREATE VIEW, View Creation and Manipulation
                  CROSS JOIN, Joined Table
                  CRYPT_KEY function, System Functions
                  CURDATE function, Functions to Report the Current Datetime
                  CURRENT_CATALOG function, System Functions
                  CURRENT_DATE function, Functions to Report the Current Datetime
                  CURRENT_ROLE function, System Functions
                  CURRENT_SCHEMA function, System Functions
                  CURRENT_TIME function, Functions to Report the Current Datetime
                  CURRENT_TIMESTAMP function, Functions to Report the Current Datetime
                  CURRENT_USER function, System Functions
                  CURRENT VALUE FOR, Value Expression
                  CURTIME function, Functions to Report the Current Datetime

                  D

                  DATA_TYPE_PRIVILEGES, SQL Standard Views
                  DATABASE_ISOLATION_LEVEL function, System Functions
                  DATABASE_NAME function, System Functions
                  DATABASE_TIMEZONE function, Functions to Report the Time Zone.
                  DATABASE_VERSION function, System Functions
                  DATABASE function, System Functions
                  DATE_ADD function, Functions for Datetime Arithmetic
                  DATE_SUB function, Functions for Datetime Arithmetic
                  DATEADD function, Functions for Datetime Arithmetic
                  DATEDIFF function, Functions for Datetime Arithmetic
                  datetime and interval literal, Literals
                  Datetime Operations, Datetime types
                  DATETIME types, Datetime types
                  datetime value expression, Value Expression
                  datetime value function, Value Expression
                  DAYNAME function, Functions to Extract an Element of a Datetime
                  DAYOFMONTH function, Functions to Extract an Element of a Datetime
                  DAYOFWEEK function, Functions to Extract an Element of a Datetime
                  DAYOFYEAR function, Functions to Extract an Element of a Datetime
                  DAYS function datetime, Functions to Extract an Element of a Datetime
                  DBA ROLE, Built-In Roles and Users
                  DECLARE CURSOR, Cursor Declaration
                  DECLARE HANDLER, Handlers
                  DECLARE variable, Variables
                  DECODE function, General Functions
                  DEFAULT clause, Table Creation
                  DEGREES function, Numeric Functions
                  DELETE FROM, Delete Statement
                  derived table, Table Primary
                  DETERMINISTIC characteristic, Routine Characteristics
                  DIAGNOSTICS function, System Functions
                  DIFFERENCE function, String and Binary String Functions
                  DISCONNECT, Session and Transaction Control Statements
                  DOMAIN_CONSTRAINTS, SQL Standard Views
                  DOMAINS, SQL Standard Views
                  DROP ASSERTION, Other Schema Object Creation
                  DROP CAST, Other Schema Object Creation
                  DROP CHARACTER SET, Other Schema Object Creation
                  DROP COLLATION, Other Schema Object Creation
                  DROP COLUMN, Table Manipulation
                  drop column idenitty generator, Table Manipulation
                  DROP CONSTRAINT, Table Manipulation
                  DROP DEFAULT (table), Table Manipulation
                  DROP DOMAIN, Domain Creation and Manipulation
                  DROP DOMAIN CONSTRAINT, Domain Creation and Manipulation
                  DROP DOMAIN DEFAULT, Domain Creation and Manipulation
                  DROP INDEX, Other Schema Object Creation
                  DROP ROLE, Statements for Authorization and Access Control
                  DROP routine, Routine Creation
                  DROP SCHEMA, Schema Creation
                  DROP SEQUENCE, Sequence Creation
                  DROP TABLE, Table Creation
                  DROP TRANSLATION, Other Schema Object Creation
                  DROP TRIGGER, Trigger Creation, Trigger Creation
                  DROP USER, Statements for Authorization and Access Control
                  DROP VIEW, View Creation and Manipulation
                  DYNAMIC RESULT SETS, Routine Characteristics

                  E

                  ELEMENT_TYPES, SQL Standard Views
                  ENABLED_ROLES, SQL Standard Views
                  EXISTS predicate, Predicates
                  EXP function, Numeric Functions
                  expression, Value Expression
                  external authentication, Authentication Control
                  EXTERNAL NAME, Routine Definition
                  EXTRACT function, Functions to Extract an Element of a Datetime

                  F

                  FLOOR function, Numeric Functions
                  FOREIGN KEY constraint, Table Creation
                  FOR loop in routines, Iterated FOR Statement

                  I

                  identifier chain, References, etc.
                  identifier definition, Common Elements and Statements
                  IDENTITY function, System Functions
                  IF EXISTS, Common Elements and Statements
                  IFNULL function, General Functions
                  IF STATEMENT, Conditional Statements
                  INFORMATION_SCHEMA_CATALOG_NAME, SQL Standard Views
                  IN predicate, Predicates
                  INSERT function, String and Binary String Functions
                  INSERT INTO, Insert Statement
                  interval absolute value function, Value Expression
                  interval term, Value Expression
                  INTERVAL types, Interval Types
                  IS_AUTOCOMMIT function, System Functions
                  IS_READONLY_DATABASE_FILES function, System Functions
                  IS_READONLY_DATABASE function, System Functions
                  IS_READONLY_SESSION function, System Functions
                  IS DISTINCT predicate, Predicates
                  ISNULL function, General Functions
                  IS NULL predicate, Predicates
                  ISOLATION_LEVEL function, System Functions

                  J

                  JOIN USING, Joined Table
                  JOIN with condition, Joined Table

                  K

                  KEY_COLUMN_USAGE, SQL Standard Views

                  M

                  MATCH predicate, Predicates
                  MAX_CARDINALITY function, Array Functions
                  MERGE INTO, Merge Statement
                  MINUTE function, Functions to Extract an Element of a Datetime
                  MOD function, Numeric Functions
                  MONTH function, Functions to Extract an Element of a Datetime
                  MONTHNAME function, Functions to Extract an Element of a Datetime

                  N

                  name resolution, Naming
                  naming in joined table, Naming
                  naming in select list, Naming
                  NATURAL JOIN, Joined Table
                  NEXT VALUE FOR, Value Expression
                  NOW function, Functions to Report the Current Datetime
                  NULLIF function, General Functions
                  NULL INPUT, Routine Characteristics
                  numeric literal, Literals
                  NUMERIC types, Numeric Types
                  numeric value expression, Value Expression
                  numeric value function, Value Expression
                  NVL2 function, General Functions
                  NVL function, General Functions

                  O

                  OCTET_LENGTH function, String and Binary String Functions
                  OTHER type, Storage and Handling of Java Objects
                  OUTER JOIN, Joined Table
                  OVERLAPS predicate, Predicates
                  OVERLAY function, String and Binary String Functions

                  P

                  PARAMETERS, SQL Standard Views
                  password complexity, Authentication Control
                  PATH, Other Syntax Elements
                  PI function, Numeric Functions
                  POSITION_ARRAY function, Array Functions
                  POSITION function, String and Binary String Functions
                  POWER function, Numeric Functions
                  PRIMARY KEY constraint, Table Creation
                  PUBLIC ROLE, Built-In Roles and Users

                  R

                  RADIANS function, Numeric Functions
                  RAND function, Numeric Functions
                  RAWTOHEX function, String and Binary String Functions
                  REFERENTIAL_CONSTRAINTS, SQL Standard Views
                  REGEXP_MATCHES function, String and Binary String Functions
                  REGEXP_SUBSTRING_ARRAY function, String and Binary String Functions
                  REGEXP_SUBSTRING function, String and Binary String Functions
                  RELEASE SAVEPOINT, Session and Transaction Control Statements
                  RENAME, Renaming Objects
                  REPEAT ... UNTIL loop in routines, Iterated Statements
                  REPEAT function, String and Binary String Functions
                  REPLACE function, String and Binary String Functions
                  RESIGNAL STATEMENT, Raising Exceptions
                  RETURN, Return Statement
                  RETURNS, Routine Definition
                  REVERSE function, String and Binary String Functions
                  REVOKE, Statements for Authorization and Access Control
                  REVOKE ROLE, Statements for Authorization and Access Control
                  RIGHT function, String and Binary String Functions
                  ROLE_AUTHORIZATION_DESCRIPTORS, SQL Standard Views
                  ROLE_COLUMN_GRANTS, SQL Standard Views
                  ROLE_ROUTINE_GRANTS, SQL Standard Views
                  ROLE_TABLE_GRANTS, SQL Standard Views
                  ROLE_UDT_GRANTS, SQL Standard Views
                  ROLE_USAGE_GRANTS, SQL Standard Views
                  ROLLBACK, Session and Transaction Control Statements
                  ROLLBACK TO SAVEPOINT, Session and Transaction Control Statements
                  ROUND function datetime, Functions for Datetime Arithmetic
                  ROUND number function, Numeric Functions
                  ROUTINE_COLUMN_USAGE, SQL Standard Views
                  ROUTINE_JAR_USAGE, SQL Standard Views
                  ROUTINE_PRIVILEGES, SQL Standard Views
                  ROUTINE_ROUTINE_USAGE, SQL Standard Views
                  ROUTINE_SEQUENCE_USAGE, SQL Standard Views
                  ROUTINE_TABLE_USAGE, SQL Standard Views
                  routine body, Routine Definition
                  routine invocation, Other Syntax Elements
                  ROUTINES, SQL Standard Views
                  ROW_NUMBER function, System Functions
                  ROWNUM function, System Functions
                  row value expression, Value Expression
                  RPAD function, String and Binary String Functions
                  RTRIM function, String and Binary String Functions

                  S

                  SAVEPOINT, Session and Transaction Control Statements
                  SAVEPOINT LEVEL, Routine Characteristics
                  schema routine, Routine Creation
                  SCHEMATA, SQL Standard Views
                  SCRIPT, System Operations
                  search condition, Other Syntax Elements
                  SECOND function, Functions to Extract an Element of a Datetime
                  SECONDS_SINCE_MIDNIGHT function, Functions to Extract an Element of a Datetime
                  SELECT, Select Statement
                  SELECT : SINGLE ROW, Select Statement : Single Row
                  SEQUENCE_ARRAY function, Array Functions
                  SEQUENCES, SQL Standard Views
                  SESSION_ID function, System Functions
                  SESSION_ISOLATION_LEVEL function, System Functions
                  SESSION_TIMEZONE function, Functions to Report the Time Zone.
                  SESSION_USER function, System Functions
                  SET AUTOCOMMIT, Session and Transaction Control Statements
                  SET CATALOG, Session and Transaction Control Statements
                  set clause in UPDATE and MERGE statements, Update Statement
                  SET CONSTRAINTS, Session and Transaction Control Statements
                  SET DATABASE AUTHENTICATION FUNCTION, Authentication Settings
                  SET DATABASE COLLATION, Database Settings
                  SET DATABASE DEFAULT INITIAL SCHEMA, Statements for Authorization and Access Control
                  SET DATABASE DEFAULT ISOLATION LEVEL, Database Settings
                  SET DATABASE DEFAULT RESULT MEMORY ROWS, Database Settings
                  SET DATABASE DEFAULT TABLE TYPE, Database Settings
                  SET DATABASE EVENT LOG LEVEL, Database Settings
                  SET DATABASE GC, Database Settings
                  SET DATABASE PASSWORD CHECK FUNCTION, Authentication Settings
                  SET DATABASE SQL AVG SCALE, SQL Conformance Settings
                  SET DATABASE SQL CONCAT NULLS, SQL Conformance Settings
                  SET DATABASE SQL CONVERT TRUNCATE, SQL Conformance Settings
                  SET DATABASE SQL DOUBLE NAN, SQL Conformance Settings
                  SET DATABASE SQL NAMES, SQL Conformance Settings
                  SET DATABASE SQL NULLS FIRST, SQL Conformance Settings
                  SET DATABASE SQL REFERENCES, SQL Conformance Settings
                  SET DATABASE SQL REGULAR NAMES, SQL Conformance Settings
                  SET DATABASE SQL SIZE, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX DB2, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX MSS, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX MYS, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX ORA, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX PGS, SQL Conformance Settings
                  SET DATABASE SQL TDC DELETE, SQL Conformance Settings
                  SET DATABASE SQL TRANSLATE TTI TYPES, SQL Conformance Settings
                  SET DATABASE SQL TYPES, SQL Conformance Settings
                  SET DATABASE SQL UNIQUE NULLS, SQL Conformance Settings
                  SET DATABASE TEXT TABLE DEFAULTS, Database Settings
                  SET DATABASE TRANSACTION CONTROL, Database Settings
                  SET DATABASE TRANSACTION ROLLBACK ON CONFLICT, Database Settings
                  SET DATABASE UNIQUE NAME, Database Settings
                  SET DATA TYPE, Table Manipulation
                  SET DEFAULT, Table Manipulation
                  SET DOMAIN DEFAULT, Domain Creation and Manipulation
                  SET FILES BACKUP INCREMENT, Cache, Persistence and Files Settings
                  SET FILES CACHE ROWS, Cache, Persistence and Files Settings
                  SET FILES CACHE SIZE, Cache, Persistence and Files Settings
                  SET FILES DEFRAG, Cache, Persistence and Files Settings
                  SET FILES LOB SCALE, Cache, Persistence and Files Settings
                  SET FILES LOG, Cache, Persistence and Files Settings
                  SET FILES LOG SIZE, Cache, Persistence and Files Settings
                  SET FILES NIO, Cache, Persistence and Files Settings
                  SET FILES NIO SIZE, Cache, Persistence and Files Settings
                  SET FILES SCALE, Cache, Persistence and Files Settings
                  SET FILES SCRIPT FORMAT, Cache, Persistence and Files Settings
                  SET FILES WRITE DELAY, Cache, Persistence and Files Settings
                  set function specification, Value Expression
                  SET IGNORECASE, Session and Transaction Control Statements
                  SET INITIAL SCHEMA*, Statements for Authorization and Access Control
                  SET MAXROWS, Session and Transaction Control Statements
                  SET OPERATIONS, Set Operations
                  SET PASSWORD, Statements for Authorization and Access Control
                  SET PATH, Session and Transaction Control Statements
                  SET REFERENTIAL INTEGRITY, SQL Conformance Settings
                  SET ROLE, Session and Transaction Control Statements
                  SET SCHEMA, Session and Transaction Control Statements
                  SET SESSION AUTHORIZATION, Session and Transaction Control Statements
                  SET SESSION CHARACTERISTICS, Session and Transaction Control Statements
                  SET SESSION RESULT MEMORY ROWS, Session and Transaction Control Statements
                  SET TABLE CLUSTERED, Table Manipulation
                  SET TABLE read-write property, Table Manipulation
                  SET TABLE SOURCE, Table Manipulation
                  SET TABLE SOURCE HEADER, Table Manipulation
                  SET TABLE SOURCE on-off, Table Manipulation
                  SET TABLE TYPE, Table Manipulation, Cache, Persistence and Files Settings
                  SET TIME ZONE, Session and Transaction Control Statements
                  SET TRANSACTION, Session and Transaction Control Statements
                  SHUTDOWN, System Operations
                  SIGNAL STATEMENT, Raising Exceptions
                  SIGN function, Numeric Functions
                  SIN function, Numeric Functions
                  SORT_ARRAY function, Array Functions
                  sort specification list, Ordering
                  SOUNDEX function, String and Binary String Functions
                  SPACE function, String and Binary String Functions
                  SPECIFIC, Common Elements and Statements
                  SPECIFIC NAME, Routine Characteristics
                  SQL_FEATURES, SQL Standard Views
                  SQL_IMPLEMENTATION_INFO, SQL Standard Views
                  SQL_PACKAGES, SQL Standard Views
                  SQL_PARTS, SQL Standard Views
                  SQL_SIZING, SQL Standard Views
                  SQL_SIZING_PROFILES, SQL Standard Views
                  SQL DATA access characteristic, Routine Characteristics
                  SQL parameter reference, References, etc.
                  SQL procedure statement, SQL Procedure Statement
                  SQL routine body, Routine Definition
                  SQRT function, Numeric Functions
                  START TRANSACTION, Session and Transaction Control Statements
                  string value expression, Value Expression
                  SUBSTR function, String and Binary String Functions
                  SUBSTRING function, String and Binary String Functions
                  SYSDATE function, Functions to Report the Current Datetime
                  SYSTEM_BESTROWIDENTIFIER, HyperSQL Custom Views
                  SYSTEM_CACHEINFO, HyperSQL Custom Views
                  SYSTEM_COLUMN_SEQUENCE_USAGE, HyperSQL Custom Views
                  SYSTEM_COLUMNS, HyperSQL Custom Views
                  SYSTEM_COMMENTS, HyperSQL Custom Views
                  SYSTEM_CONNECTION_PROPERTIES, HyperSQL Custom Views
                  SYSTEM_CROSSREFERENCE, HyperSQL Custom Views
                  SYSTEM_INDEXINFO, HyperSQL Custom Views
                  SYSTEM_PRIMARYKEYS, HyperSQL Custom Views
                  SYSTEM_PROCEDURECOLUMNS, HyperSQL Custom Views
                  SYSTEM_PROCEDURES, HyperSQL Custom Views
                  SYSTEM_PROPERTIES, HyperSQL Custom Views
                  SYSTEM_SCHEMAS, HyperSQL Custom Views
                  SYSTEM_SEQUENCES, HyperSQL Custom Views
                  SYSTEM_SESSIONINFO, HyperSQL Custom Views
                  SYSTEM_SESSIONS, HyperSQL Custom Views
                  SYSTEM_TABLES, HyperSQL Custom Views
                  SYSTEM_TABLETYPES, HyperSQL Custom Views
                  SYSTEM_TEXTTABLES, HyperSQL Custom Views
                  SYSTEM_TYPEINFO, HyperSQL Custom Views
                  SYSTEM_UDTS, HyperSQL Custom Views
                  SYSTEM_USER function, System Functions
                  SYSTEM_USERS, HyperSQL Custom Views
                  SYSTEM_VERSIONCOLUMNS, HyperSQL Custom Views
                  SYSTIMESTAMP function, Functions to Report the Current Datetime
                  SYS USER, Built-In Roles and Users

                  T

                  TABLE, Table Primary
                  TABLE_CONSTRAINTS, SQL Standard Views
                  TABLE_PRIVILEGES, SQL Standard Views
                  TABLES, SQL Standard Views
                  TAN function, Numeric Functions
                  TIMESTAMPADD function, Functions for Datetime Arithmetic
                  TIMESTAMPDIFF function, Functions for Datetime Arithmetic
                  TIMESTAMP function, Functions to Convert or Format a Datetime
                  Time Zone, Datetime types
                  TIMEZONE function, Functions to Report the Time Zone.
                  TO_CHAR function, Functions to Convert or Format a Datetime
                  TO_DATE function, Functions to Convert or Format a Datetime
                  TO_NUMBER function, Numeric Functions
                  TO_TIMESTAMP function, Functions to Convert or Format a Datetime
                  TODAY function, Functions to Report the Current Datetime
                  TRANSACTION_CONTROL function, System Functions
                  TRANSACTION_ID function, System Functions
                  TRANSACTION_SIZE function, System Functions
                  transaction characteristics, Session and Transaction Control Statements
                  TRANSLATIONS, SQL Standard Views
                  TRIGGER_COLUMN_USAGE, SQL Standard Views
                  TRIGGER_ROUTINE_USAGE, SQL Standard Views
                  TRIGGER_SEQUENCE_USAGE, SQL Standard Views
                  TRIGGER_TABLE_USAGE, SQL Standard Views
                  TRIGGERED_UPDATE_COLUMNS, SQL Standard Views
                  TRIGGERED SQL STATEMENT, Trigger Creation
                  TRIGGER EXECUTION ORDER, Trigger Creation
                  TRIGGERS, SQL Standard Views
                  TRIM_ARRAY function, Array Functions
                  TRIM function, String and Binary String Functions
                  TRUNCATE function, Numeric Functions
                  TRUNCATE SCHEMA, Truncate Statement
                  TRUNCATE TABLE, Truncate Statement
                  TRUNC function datetime, Functions for Datetime Arithmetic
                  TRUNC function numeric, Numeric Functions

                  U

                  UCASE function, String and Binary String Functions
                  unicode escape elements, Literals
                  UNION JOIN, Joined Table
                  UNIQUE constraint, Table Creation
                  UNIQUE predicate, Predicates
                  UNIX_TIMESTAMP function, Functions to Extract an Element of a Datetime
                  UNNEST, Table Primary
                  UPDATE, Update Statement
                  UPPER function, String and Binary String Functions
                  USAGE_PRIVILEGES, SQL Standard Views
                  USER_DEFINED_TYPES, SQL Standard Views
                  USER function, System Functions
                  UUID function, General Functions

                  V

                  value expression, Value Expression
                  value expression primary, Value Expression
                  value specification, Value Expression
                  VIEW_COLUMN_USAGE, SQL Standard Views
                  VIEW_ROUTINE_USAGE, SQL Standard Views
                  VIEW_TABLE_USAGE, SQL Standard Views
                  VIEWS, SQL Standard Views

                  W

                  WEEK function, Functions to Extract an Element of a Datetime
                  WHILE loop in routines, Iterated Statements
                  WIDTH_BUCKET function, Numeric Functions

                  General Index

                  Symbols

                  _SYSTEM ROLE, Built-In Roles and Users

                  A

                  ABS function, Numeric Functions
                  ACL, Network Access Control
                  ACOS function, Numeric Functions
                  ACTION_ID function, System Functions
                  ADD COLUMN, Table Manipulation
                  add column identity generator, Table Manipulation
                  ADD CONSTRAINT, Table Manipulation
                  ADD DOMAIN CONSTRAINT, Domain Creation and Manipulation
                  ADMINISTRABLE_ROLE_AUTHORIZATIONS, SQL Standard Views
                  aggregate function, Aggregate Functions
                  ALL and ANY predicates, Predicates
                  ALTER COLUMN, Table Manipulation
                  alter column identity generator, Table Manipulation
                  alter column nullability, Table Manipulation
                  ALTER DOMAIN, Domain Creation and Manipulation
                  ALTER INDEX, Other Schema Object Creation
                  ALTER routine, Routine Creation
                  ALTER SEQUENCE, Sequence Creation
                  ALTER SESSION, Session and Transaction Control Statements
                  ALTER TABLE, Table Manipulation
                  ALTER USER ... SET INITIAL SCHEMA, Statements for Authorization and Access Control
                  ALTER USER ... SET LOCAL, Statements for Authorization and Access Control
                  ALTER USER ... SET PASSWORD, Statements for Authorization and Access Control
                  ALTER view, View Creation and Manipulation
                  Ant, Building with Apache Ant
                  APPLICABLE_ROLES, SQL Standard Views
                  ASCII function, String and Binary String Functions
                  ASIN function, Numeric Functions
                  ASSERTIONS, SQL Standard Views
                  ATAN2 function, Numeric Functions
                  ATAN function, Numeric Functions
                  AUTHORIZATION IDENTIFIER, Authorizations and Access Control
                  AUTHORIZATIONS, SQL Standard Views

                  B

                  backup, Backing Up Database Catalogs
                  BACKUP DATABASE, System Operations
                  BETWEEN predicate, Predicates
                  binary literal, Literals
                  BINARY types, Binary String Types
                  BIT_LENGTH function, String and Binary String Functions
                  BITAND function, Numeric Functions
                  BITANDNOT function, Numeric Functions
                  bit literal, Literals
                  BITNOT function, Numeric Functions
                  BITOR function, Numeric Functions
                  BIT types, Bit String Types
                  BITXOR function, Numeric Functions
                  boolean literal, Literals
                  BOOLEAN types, Boolean Type
                  boolean value expression, Value Expression

                  C

                  CARDINALITY function, Array Functions
                  CASCADE or RESTRICT, Common Elements and Statements
                  case expression, Value Expression
                  CASEWHEN function, General Functions
                  CASE WHEN in routines, Conditional Statements
                  CAST, Value Expression
                  CEIL function, Numeric Functions
                  CHANGE_AUTHORIZATION, Built-In Roles and Users
                  CHAR_LENGTH, String and Binary String Functions
                  CHARACTER_LENGTH, String and Binary String Functions
                  CHARACTER_SETS, SQL Standard Views
                  character literal, Literals
                  CHARACTER types, Character String Types
                  character value function, Value Expression
                  CHAR function, String and Binary String Functions
                  CHECK_CONSTRAINT_ROUTINE_USAGE, SQL Standard Views
                  CHECK_CONSTRAINTS, SQL Standard Views
                  CHECK constraint, Table Creation
                  CHECKPOINT, System Operations
                  COALESCE expression, Value Expression
                  COALESCE function, General Functions
                  COLLATE, Other Syntax Elements
                  COLLATIONS, SQL Standard Views
                  COLUMN_COLUMN_USAGE, SQL Standard Views
                  COLUMN_DOMAIN_USAGE, SQL Standard Views
                  COLUMN_PRIVILEGES, SQL Standard Views
                  COLUMN_UDT_USAGE, SQL Standard Views
                  column definition, Table Creation
                  column name list, Table Primary
                  column reference, References, etc.
                  COLUMNS, SQL Standard Views
                  COMMENT, Commenting Objects
                  COMMIT, Session and Transaction Control Statements
                  comparison predicate, Predicates
                  CONCAT function, String and Binary String Functions
                  CONSTRAINT, Other Syntax Elements
                  CONSTRAINT_COLUMN_USAGE, SQL Standard Views
                  CONSTRAINT_TABLE_USAGE, SQL Standard Views
                  CONSTRAINT (table constraint), Table Creation
                  CONSTRAINT name and characteristics, Table Creation
                  contextually typed value specification, References, etc.
                  CONVERT function, General Functions
                  COS function, Numeric Functions
                  COT function, Numeric Functions
                  CREATE_SCHEMA ROLE, Built-In Roles and Users
                  CREATE AGGREGATE FUNCTION, Definition of Aggregate Functions
                  CREATE ASSERTION, Other Schema Object Creation
                  CREATE CAST, Other Schema Object Creation
                  CREATE CHARACTER SET, Other Schema Object Creation
                  CREATE COLLATION, Other Schema Object Creation
                  CREATE DOMAIN, Domain Creation and Manipulation
                  CREATE FUNCTION, Routine Definition
                  CREATE INDEX, Other Schema Object Creation
                  CREATE PROCEDURE, Routine Definition
                  CREATE ROLE, Statements for Authorization and Access Control
                  CREATE SCHEMA, Schema Creation
                  CREATE SEQUENCE, Sequence Creation
                  CREATE TABLE, Table Creation
                  CREATE TRANSLATION, Other Schema Object Creation
                  CREATE TRIGGER, Trigger Creation, Trigger Creation
                  CREATE TYPE, Other Schema Object Creation
                  CREATE USER, Statements for Authorization and Access Control
                  CREATE VIEW, View Creation and Manipulation
                  CROSS JOIN, Joined Table
                  CRYPT_KEY function, System Functions
                  CURDATE function, Functions to Report the Current Datetime
                  CURRENT_CATALOG function, System Functions
                  CURRENT_DATE function, Functions to Report the Current Datetime
                  CURRENT_ROLE function, System Functions
                  CURRENT_SCHEMA function, System Functions
                  CURRENT_TIME function, Functions to Report the Current Datetime
                  CURRENT_TIMESTAMP function, Functions to Report the Current Datetime
                  CURRENT_USER function, System Functions
                  CURRENT VALUE FOR, Value Expression
                  CURTIME function, Functions to Report the Current Datetime

                  D

                  DATA_TYPE_PRIVILEGES, SQL Standard Views
                  DATABASE_ISOLATION_LEVEL function, System Functions
                  DATABASE_NAME function, System Functions
                  DATABASE_TIMEZONE function, Functions to Report the Time Zone.
                  DATABASE_VERSION function, System Functions
                  DATABASE function, System Functions
                  DATE_ADD function, Functions for Datetime Arithmetic
                  DATE_SUB function, Functions for Datetime Arithmetic
                  DATEADD function, Functions for Datetime Arithmetic
                  DATEDIFF function, Functions for Datetime Arithmetic
                  datetime and interval literal, Literals
                  Datetime Operations, Datetime types
                  DATETIME types, Datetime types
                  datetime value expression, Value Expression
                  datetime value function, Value Expression
                  DAYNAME function, Functions to Extract an Element of a Datetime
                  DAYOFMONTH function, Functions to Extract an Element of a Datetime
                  DAYOFWEEK function, Functions to Extract an Element of a Datetime
                  DAYOFYEAR function, Functions to Extract an Element of a Datetime
                  DAYS function datetime, Functions to Extract an Element of a Datetime
                  DBA ROLE, Built-In Roles and Users
                  DECLARE CURSOR, Cursor Declaration
                  DECLARE HANDLER, Handlers
                  DECLARE variable, Variables
                  DECODE function, General Functions
                  DEFAULT clause, Table Creation
                  DEGREES function, Numeric Functions
                  DELETE FROM, Delete Statement
                  derived table, Table Primary
                  DETERMINISTIC characteristic, Routine Characteristics
                  DIAGNOSTICS function, System Functions
                  DIFFERENCE function, String and Binary String Functions
                  DISCONNECT, Session and Transaction Control Statements
                  DOMAIN_CONSTRAINTS, SQL Standard Views
                  DOMAINS, SQL Standard Views
                  DROP ASSERTION, Other Schema Object Creation
                  DROP CAST, Other Schema Object Creation
                  DROP CHARACTER SET, Other Schema Object Creation
                  DROP COLLATION, Other Schema Object Creation
                  DROP COLUMN, Table Manipulation
                  drop column idenitty generator, Table Manipulation
                  DROP CONSTRAINT, Table Manipulation
                  DROP DEFAULT (table), Table Manipulation
                  DROP DOMAIN, Domain Creation and Manipulation
                  DROP DOMAIN CONSTRAINT, Domain Creation and Manipulation
                  DROP DOMAIN DEFAULT, Domain Creation and Manipulation
                  DROP INDEX, Other Schema Object Creation
                  DROP ROLE, Statements for Authorization and Access Control
                  DROP routine, Routine Creation
                  DROP SCHEMA, Schema Creation
                  DROP SEQUENCE, Sequence Creation
                  DROP TABLE, Table Creation
                  DROP TRANSLATION, Other Schema Object Creation
                  DROP TRIGGER, Trigger Creation, Trigger Creation
                  DROP USER, Statements for Authorization and Access Control
                  DROP VIEW, View Creation and Manipulation
                  DYNAMIC RESULT SETS, Routine Characteristics

                  E

                  ELEMENT_TYPES, SQL Standard Views
                  ENABLED_ROLES, SQL Standard Views
                  EXISTS predicate, Predicates
                  EXP function, Numeric Functions
                  expression, Value Expression
                  external authentication, Authentication Control
                  EXTERNAL NAME, Routine Definition
                  EXTRACT function, Functions to Extract an Element of a Datetime

                  F

                  FLOOR function, Numeric Functions
                  FOREIGN KEY constraint, Table Creation
                  FOR loop in routines, Iterated FOR Statement

                  I

                  identifier chain, References, etc.
                  identifier definition, Common Elements and Statements
                  IDENTITY function, System Functions
                  IF EXISTS, Common Elements and Statements
                  IFNULL function, General Functions
                  IF STATEMENT, Conditional Statements
                  INFORMATION_SCHEMA_CATALOG_NAME, SQL Standard Views
                  init script, Running Hsqldb as a System Daemon
                  IN predicate, Predicates
                  INSERT function, String and Binary String Functions
                  INSERT INTO, Insert Statement
                  interval absolute value function, Value Expression
                  interval term, Value Expression
                  INTERVAL types, Interval Types
                  IS_AUTOCOMMIT function, System Functions
                  IS_READONLY_DATABASE_FILES function, System Functions
                  IS_READONLY_DATABASE function, System Functions
                  IS_READONLY_SESSION function, System Functions
                  IS DISTINCT predicate, Predicates
                  ISNULL function, General Functions
                  IS NULL predicate, Predicates
                  ISOLATION_LEVEL function, System Functions

                  J

                  JOIN USING, Joined Table
                  JOIN with condition, Joined Table

                  K

                  KEY_COLUMN_USAGE, SQL Standard Views

                  M

                  MATCH predicate, Predicates
                  MAX_CARDINALITY function, Array Functions
                  memory use, Memory and Disk Use
                  MERGE INTO, Merge Statement
                  MINUTE function, Functions to Extract an Element of a Datetime
                  MOD function, Numeric Functions
                  MONTH function, Functions to Extract an Element of a Datetime
                  MONTHNAME function, Functions to Extract an Element of a Datetime

                  N

                  name resolution, Naming
                  naming in joined table, Naming
                  naming in select list, Naming
                  NATURAL JOIN, Joined Table
                  NEXT VALUE FOR, Value Expression
                  NOW function, Functions to Report the Current Datetime
                  NULLIF function, General Functions
                  NULL INPUT, Routine Characteristics
                  numeric literal, Literals
                  NUMERIC types, Numeric Types
                  numeric value expression, Value Expression
                  numeric value function, Value Expression
                  NVL2 function, General Functions
                  NVL function, General Functions

                  O

                  OCTET_LENGTH function, String and Binary String Functions
                  OTHER type, Storage and Handling of Java Objects
                  OUTER JOIN, Joined Table
                  OVERLAPS predicate, Predicates
                  OVERLAY function, String and Binary String Functions

                  P

                  PARAMETERS, SQL Standard Views
                  password complexity, Authentication Control
                  PATH, Other Syntax Elements
                  PI function, Numeric Functions
                  POSITION_ARRAY function, Array Functions
                  POSITION function, String and Binary String Functions
                  POWER function, Numeric Functions
                  PRIMARY KEY constraint, Table Creation
                  PUBLIC ROLE, Built-In Roles and Users

                  R

                  RADIANS function, Numeric Functions
                  RAND function, Numeric Functions
                  RAWTOHEX function, String and Binary String Functions
                  REFERENTIAL_CONSTRAINTS, SQL Standard Views
                  REGEXP_MATCHES function, String and Binary String Functions
                  REGEXP_SUBSTRING_ARRAY function, String and Binary String Functions
                  REGEXP_SUBSTRING function, String and Binary String Functions
                  RELEASE SAVEPOINT, Session and Transaction Control Statements
                  RENAME, Renaming Objects
                  REPEAT ... UNTIL loop in routines, Iterated Statements
                  REPEAT function, String and Binary String Functions
                  REPLACE function, String and Binary String Functions
                  RESIGNAL STATEMENT, Raising Exceptions
                  RETURN, Return Statement
                  RETURNS, Routine Definition
                  REVERSE function, String and Binary String Functions
                  REVOKE, Statements for Authorization and Access Control
                  REVOKE ROLE, Statements for Authorization and Access Control
                  RIGHT function, String and Binary String Functions
                  ROLE_AUTHORIZATION_DESCRIPTORS, SQL Standard Views
                  ROLE_COLUMN_GRANTS, SQL Standard Views
                  ROLE_ROUTINE_GRANTS, SQL Standard Views
                  ROLE_TABLE_GRANTS, SQL Standard Views
                  ROLE_UDT_GRANTS, SQL Standard Views
                  ROLE_USAGE_GRANTS, SQL Standard Views
                  ROLLBACK, Session and Transaction Control Statements
                  ROLLBACK TO SAVEPOINT, Session and Transaction Control Statements
                  ROUND function datetime, Functions for Datetime Arithmetic
                  ROUND number function, Numeric Functions
                  ROUTINE_COLUMN_USAGE, SQL Standard Views
                  ROUTINE_JAR_USAGE, SQL Standard Views
                  ROUTINE_PRIVILEGES, SQL Standard Views
                  ROUTINE_ROUTINE_USAGE, SQL Standard Views
                  ROUTINE_SEQUENCE_USAGE, SQL Standard Views
                  ROUTINE_TABLE_USAGE, SQL Standard Views
                  routine body, Routine Definition
                  routine invocation, Other Syntax Elements
                  ROUTINES, SQL Standard Views
                  ROW_NUMBER function, System Functions
                  ROWNUM function, System Functions
                  row value expression, Value Expression
                  RPAD function, String and Binary String Functions
                  RTRIM function, String and Binary String Functions

                  S

                  SAVEPOINT, Session and Transaction Control Statements
                  SAVEPOINT LEVEL, Routine Characteristics
                  schema routine, Routine Creation
                  SCHEMATA, SQL Standard Views
                  SCRIPT, System Operations
                  search condition, Other Syntax Elements
                  SECOND function, Functions to Extract an Element of a Datetime
                  SECONDS_SINCE_MIDNIGHT function, Functions to Extract an Element of a Datetime
                  security, Security Considerations, TLS Encryption, Network Access Control
                  SELECT, Select Statement
                  SELECT : SINGLE ROW, Select Statement : Single Row
                  SEQUENCE_ARRAY function, Array Functions
                  SEQUENCES, SQL Standard Views
                  SESSION_ID function, System Functions
                  SESSION_ISOLATION_LEVEL function, System Functions
                  SESSION_TIMEZONE function, Functions to Report the Time Zone.
                  SESSION_USER function, System Functions
                  SET AUTOCOMMIT, Session and Transaction Control Statements
                  SET CATALOG, Session and Transaction Control Statements
                  set clause in UPDATE and MERGE statements, Update Statement
                  SET CONSTRAINTS, Session and Transaction Control Statements
                  SET DATABASE AUTHENTICATION FUNCTION, Authentication Settings
                  SET DATABASE COLLATION, Database Settings
                  SET DATABASE DEFAULT INITIAL SCHEMA, Statements for Authorization and Access Control
                  SET DATABASE DEFAULT ISOLATION LEVEL, Database Settings
                  SET DATABASE DEFAULT RESULT MEMORY ROWS, Database Settings
                  SET DATABASE DEFAULT TABLE TYPE, Database Settings
                  SET DATABASE EVENT LOG LEVEL, Database Settings
                  SET DATABASE GC, Database Settings
                  SET DATABASE PASSWORD CHECK FUNCTION, Authentication Settings
                  SET DATABASE SQL AVG SCALE, SQL Conformance Settings
                  SET DATABASE SQL CONCAT NULLS, SQL Conformance Settings
                  SET DATABASE SQL CONVERT TRUNCATE, SQL Conformance Settings
                  SET DATABASE SQL DOUBLE NAN, SQL Conformance Settings
                  SET DATABASE SQL NAMES, SQL Conformance Settings
                  SET DATABASE SQL NULLS FIRST, SQL Conformance Settings
                  SET DATABASE SQL REFERENCES, SQL Conformance Settings
                  SET DATABASE SQL REGULAR NAMES, SQL Conformance Settings
                  SET DATABASE SQL SIZE, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX DB2, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX MSS, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX MYS, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX ORA, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX PGS, SQL Conformance Settings
                  SET DATABASE SQL TDC DELETE, SQL Conformance Settings
                  SET DATABASE SQL TRANSLATE TTI TYPES, SQL Conformance Settings
                  SET DATABASE SQL TYPES, SQL Conformance Settings
                  SET DATABASE SQL UNIQUE NULLS, SQL Conformance Settings
                  SET DATABASE TEXT TABLE DEFAULTS, Database Settings
                  SET DATABASE TRANSACTION CONTROL, Database Settings
                  SET DATABASE TRANSACTION ROLLBACK ON CONFLICT, Database Settings
                  SET DATABASE UNIQUE NAME, Database Settings
                  SET DATA TYPE, Table Manipulation
                  SET DEFAULT, Table Manipulation
                  SET DOMAIN DEFAULT, Domain Creation and Manipulation
                  SET FILES BACKUP INCREMENT, Cache, Persistence and Files Settings
                  SET FILES CACHE ROWS, Cache, Persistence and Files Settings
                  SET FILES CACHE SIZE, Cache, Persistence and Files Settings
                  SET FILES DEFRAG, Cache, Persistence and Files Settings
                  SET FILES LOB SCALE, Cache, Persistence and Files Settings
                  SET FILES LOG, Cache, Persistence and Files Settings
                  SET FILES LOG SIZE, Cache, Persistence and Files Settings
                  SET FILES NIO, Cache, Persistence and Files Settings
                  SET FILES NIO SIZE, Cache, Persistence and Files Settings
                  SET FILES SCALE, Cache, Persistence and Files Settings
                  SET FILES SCRIPT FORMAT, Cache, Persistence and Files Settings
                  SET FILES WRITE DELAY, Cache, Persistence and Files Settings
                  set function specification, Value Expression
                  SET IGNORECASE, Session and Transaction Control Statements
                  SET INITIAL SCHEMA*, Statements for Authorization and Access Control
                  SET MAXROWS, Session and Transaction Control Statements
                  SET OPERATIONS, Set Operations
                  SET PASSWORD, Statements for Authorization and Access Control
                  SET PATH, Session and Transaction Control Statements
                  SET REFERENTIAL INTEGRITY, SQL Conformance Settings
                  SET ROLE, Session and Transaction Control Statements
                  SET SCHEMA, Session and Transaction Control Statements
                  SET SESSION AUTHORIZATION, Session and Transaction Control Statements
                  SET SESSION CHARACTERISTICS, Session and Transaction Control Statements
                  SET SESSION RESULT MEMORY ROWS, Session and Transaction Control Statements
                  SET TABLE CLUSTERED, Table Manipulation
                  SET TABLE read-write property, Table Manipulation
                  SET TABLE SOURCE, Table Manipulation
                  SET TABLE SOURCE HEADER, Table Manipulation
                  SET TABLE SOURCE on-off, Table Manipulation
                  SET TABLE TYPE, Table Manipulation, Cache, Persistence and Files Settings
                  SET TIME ZONE, Session and Transaction Control Statements
                  SET TRANSACTION, Session and Transaction Control Statements
                  SHUTDOWN, System Operations
                  SIGNAL STATEMENT, Raising Exceptions
                  SIGN function, Numeric Functions
                  SIN function, Numeric Functions
                  SORT_ARRAY function, Array Functions
                  sort specification list, Ordering
                  SOUNDEX function, String and Binary String Functions
                  SPACE function, String and Binary String Functions
                  SPECIFIC, Common Elements and Statements
                  SPECIFIC NAME, Routine Characteristics
                  SQL_FEATURES, SQL Standard Views
                  SQL_IMPLEMENTATION_INFO, SQL Standard Views
                  SQL_PACKAGES, SQL Standard Views
                  SQL_PARTS, SQL Standard Views
                  SQL_SIZING, SQL Standard Views
                  SQL_SIZING_PROFILES, SQL Standard Views
                  SQL DATA access characteristic, Routine Characteristics
                  SQL parameter reference, References, etc.
                  SQL procedure statement, SQL Procedure Statement
                  SQL routine body, Routine Definition
                  SQRT function, Numeric Functions
                  START TRANSACTION, Session and Transaction Control Statements
                  string value expression, Value Expression
                  SUBSTR function, String and Binary String Functions
                  SUBSTRING function, String and Binary String Functions
                  SYSDATE function, Functions to Report the Current Datetime
                  SYSTEM_BESTROWIDENTIFIER, HyperSQL Custom Views
                  SYSTEM_CACHEINFO, HyperSQL Custom Views
                  SYSTEM_COLUMN_SEQUENCE_USAGE, HyperSQL Custom Views
                  SYSTEM_COLUMNS, HyperSQL Custom Views
                  SYSTEM_COMMENTS, HyperSQL Custom Views
                  SYSTEM_CONNECTION_PROPERTIES, HyperSQL Custom Views
                  SYSTEM_CROSSREFERENCE, HyperSQL Custom Views
                  SYSTEM_INDEXINFO, HyperSQL Custom Views
                  SYSTEM_PRIMARYKEYS, HyperSQL Custom Views
                  SYSTEM_PROCEDURECOLUMNS, HyperSQL Custom Views
                  SYSTEM_PROCEDURES, HyperSQL Custom Views
                  SYSTEM_PROPERTIES, HyperSQL Custom Views
                  SYSTEM_SCHEMAS, HyperSQL Custom Views
                  SYSTEM_SEQUENCES, HyperSQL Custom Views
                  SYSTEM_SESSIONINFO, HyperSQL Custom Views
                  SYSTEM_SESSIONS, HyperSQL Custom Views
                  SYSTEM_TABLES, HyperSQL Custom Views
                  SYSTEM_TABLETYPES, HyperSQL Custom Views
                  SYSTEM_TEXTTABLES, HyperSQL Custom Views
                  SYSTEM_TYPEINFO, HyperSQL Custom Views
                  SYSTEM_UDTS, HyperSQL Custom Views
                  SYSTEM_USER function, System Functions
                  SYSTEM_USERS, HyperSQL Custom Views
                  SYSTEM_VERSIONCOLUMNS, HyperSQL Custom Views
                  SYSTIMESTAMP function, Functions to Report the Current Datetime
                  SYS USER, Built-In Roles and Users

                  T

                  TABLE, Table Primary
                  TABLE_CONSTRAINTS, SQL Standard Views
                  TABLE_PRIVILEGES, SQL Standard Views
                  TABLES, SQL Standard Views
                  TAN function, Numeric Functions
                  TIMESTAMPADD function, Functions for Datetime Arithmetic
                  TIMESTAMPDIFF function, Functions for Datetime Arithmetic
                  TIMESTAMP function, Functions to Convert or Format a Datetime
                  Time Zone, Datetime types
                  TIMEZONE function, Functions to Report the Time Zone.
                  TO_CHAR function, Functions to Convert or Format a Datetime
                  TO_DATE function, Functions to Convert or Format a Datetime
                  TO_NUMBER function, Numeric Functions
                  TO_TIMESTAMP function, Functions to Convert or Format a Datetime
                  TODAY function, Functions to Report the Current Datetime
                  TRANSACTION_CONTROL function, System Functions
                  TRANSACTION_ID function, System Functions
                  TRANSACTION_SIZE function, System Functions
                  transaction characteristics, Session and Transaction Control Statements
                  TRANSLATIONS, SQL Standard Views
                  TRIGGER_COLUMN_USAGE, SQL Standard Views
                  TRIGGER_ROUTINE_USAGE, SQL Standard Views
                  TRIGGER_SEQUENCE_USAGE, SQL Standard Views
                  TRIGGER_TABLE_USAGE, SQL Standard Views
                  TRIGGERED_UPDATE_COLUMNS, SQL Standard Views
                  TRIGGERED SQL STATEMENT, Trigger Creation
                  TRIGGER EXECUTION ORDER, Trigger Creation
                  TRIGGERS, SQL Standard Views
                  TRIM_ARRAY function, Array Functions
                  TRIM function, String and Binary String Functions
                  TRUNCATE function, Numeric Functions
                  TRUNCATE SCHEMA, Truncate Statement
                  TRUNCATE TABLE, Truncate Statement
                  TRUNC function datetime, Functions for Datetime Arithmetic
                  TRUNC function numeric, Numeric Functions

                  U

                  UCASE function, String and Binary String Functions
                  unicode escape elements, Literals
                  UNION JOIN, Joined Table
                  UNIQUE constraint, Table Creation
                  UNIQUE predicate, Predicates
                  UNIX_TIMESTAMP function, Functions to Extract an Element of a Datetime
                  UNNEST, Table Primary
                  UPDATE, Update Statement
                  upgrading, Upgrading Databases
                  UPPER function, String and Binary String Functions
                  USAGE_PRIVILEGES, SQL Standard Views
                  USER_DEFINED_TYPES, SQL Standard Views
                  USER function, System Functions
                  UUID function, General Functions

                  V

                  value expression, Value Expression
                  value expression primary, Value Expression
                  value specification, Value Expression
                  VIEW_COLUMN_USAGE, SQL Standard Views
                  VIEW_ROUTINE_USAGE, SQL Standard Views
                  VIEW_TABLE_USAGE, SQL Standard Views
                  VIEWS, SQL Standard Views

                  W

                  WEEK function, Functions to Extract an Element of a Datetime
                  WHILE loop in routines, Iterated Statements
                  WIDTH_BUCKET function, Numeric Functions

                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/sql-ind.html0000644000175000017500000022031412007567744020220 0ustar renerene SQL Index

                  SQL Index

                  Symbols

                  _SYSTEM ROLE, Built-In Roles and Users

                  A

                  ABS function, Numeric Functions
                  ACOS function, Numeric Functions
                  ACTION_ID function, System Functions
                  ADD COLUMN, Table Manipulation
                  add column identity generator, Table Manipulation
                  ADD CONSTRAINT, Table Manipulation
                  ADD DOMAIN CONSTRAINT, Domain Creation and Manipulation
                  ADMINISTRABLE_ROLE_AUTHORIZATIONS, SQL Standard Views
                  aggregate function, Aggregate Functions
                  ALL and ANY predicates, Predicates
                  ALTER COLUMN, Table Manipulation
                  alter column identity generator, Table Manipulation
                  alter column nullability, Table Manipulation
                  ALTER DOMAIN, Domain Creation and Manipulation
                  ALTER INDEX, Other Schema Object Creation
                  ALTER routine, Routine Creation
                  ALTER SEQUENCE, Sequence Creation
                  ALTER SESSION, Session and Transaction Control Statements
                  ALTER TABLE, Table Manipulation
                  ALTER USER ... SET INITIAL SCHEMA, Statements for Authorization and Access Control
                  ALTER USER ... SET LOCAL, Statements for Authorization and Access Control
                  ALTER USER ... SET PASSWORD, Statements for Authorization and Access Control
                  ALTER view, View Creation and Manipulation
                  APPLICABLE_ROLES, SQL Standard Views
                  ASCII function, String and Binary String Functions
                  ASIN function, Numeric Functions
                  ASSERTIONS, SQL Standard Views
                  ATAN2 function, Numeric Functions
                  ATAN function, Numeric Functions
                  AUTHORIZATION IDENTIFIER, Authorizations and Access Control
                  AUTHORIZATIONS, SQL Standard Views

                  B

                  BACKUP DATABASE, System Operations
                  BETWEEN predicate, Predicates
                  binary literal, Literals
                  BINARY types, Binary String Types
                  BIT_LENGTH function, String and Binary String Functions
                  BITAND function, Numeric Functions
                  BITANDNOT function, Numeric Functions
                  bit literal, Literals
                  BITNOT function, Numeric Functions
                  BITOR function, Numeric Functions
                  BIT types, Bit String Types
                  BITXOR function, Numeric Functions
                  boolean literal, Literals
                  BOOLEAN types, Boolean Type
                  boolean value expression, Value Expression

                  C

                  CARDINALITY function, Array Functions
                  CASCADE or RESTRICT, Common Elements and Statements
                  case expression, Value Expression
                  CASEWHEN function, General Functions
                  CASE WHEN in routines, Conditional Statements
                  CAST, Value Expression
                  CEIL function, Numeric Functions
                  CHANGE_AUTHORIZATION, Built-In Roles and Users
                  CHAR_LENGTH, String and Binary String Functions
                  CHARACTER_LENGTH, String and Binary String Functions
                  CHARACTER_SETS, SQL Standard Views
                  character literal, Literals
                  CHARACTER types, Character String Types
                  character value function, Value Expression
                  CHAR function, String and Binary String Functions
                  CHECK_CONSTRAINT_ROUTINE_USAGE, SQL Standard Views
                  CHECK_CONSTRAINTS, SQL Standard Views
                  CHECK constraint, Table Creation
                  CHECKPOINT, System Operations
                  COALESCE expression, Value Expression
                  COALESCE function, General Functions
                  COLLATE, Other Syntax Elements
                  COLLATIONS, SQL Standard Views
                  COLUMN_COLUMN_USAGE, SQL Standard Views
                  COLUMN_DOMAIN_USAGE, SQL Standard Views
                  COLUMN_PRIVILEGES, SQL Standard Views
                  COLUMN_UDT_USAGE, SQL Standard Views
                  column definition, Table Creation
                  column name list, Table Primary
                  column reference, References, etc.
                  COLUMNS, SQL Standard Views
                  COMMENT, Commenting Objects
                  COMMIT, Session and Transaction Control Statements
                  comparison predicate, Predicates
                  CONCAT function, String and Binary String Functions
                  CONSTRAINT, Other Syntax Elements
                  CONSTRAINT_COLUMN_USAGE, SQL Standard Views
                  CONSTRAINT_TABLE_USAGE, SQL Standard Views
                  CONSTRAINT (table constraint), Table Creation
                  CONSTRAINT name and characteristics, Table Creation
                  contextually typed value specification, References, etc.
                  CONVERT function, General Functions
                  COS function, Numeric Functions
                  COT function, Numeric Functions
                  CREATE_SCHEMA ROLE, Built-In Roles and Users
                  CREATE AGGREGATE FUNCTION, Definition of Aggregate Functions
                  CREATE ASSERTION, Other Schema Object Creation
                  CREATE CAST, Other Schema Object Creation
                  CREATE CHARACTER SET, Other Schema Object Creation
                  CREATE COLLATION, Other Schema Object Creation
                  CREATE DOMAIN, Domain Creation and Manipulation
                  CREATE FUNCTION, Routine Definition
                  CREATE INDEX, Other Schema Object Creation
                  CREATE PROCEDURE, Routine Definition
                  CREATE ROLE, Statements for Authorization and Access Control
                  CREATE SCHEMA, Schema Creation
                  CREATE SEQUENCE, Sequence Creation
                  CREATE TABLE, Table Creation
                  CREATE TRANSLATION, Other Schema Object Creation
                  CREATE TRIGGER, Trigger Creation, Trigger Creation
                  CREATE TYPE, Other Schema Object Creation
                  CREATE USER, Statements for Authorization and Access Control
                  CREATE VIEW, View Creation and Manipulation
                  CROSS JOIN, Joined Table
                  CRYPT_KEY function, System Functions
                  CURDATE function, Functions to Report the Current Datetime
                  CURRENT_CATALOG function, System Functions
                  CURRENT_DATE function, Functions to Report the Current Datetime
                  CURRENT_ROLE function, System Functions
                  CURRENT_SCHEMA function, System Functions
                  CURRENT_TIME function, Functions to Report the Current Datetime
                  CURRENT_TIMESTAMP function, Functions to Report the Current Datetime
                  CURRENT_USER function, System Functions
                  CURRENT VALUE FOR, Value Expression
                  CURTIME function, Functions to Report the Current Datetime

                  D

                  DATA_TYPE_PRIVILEGES, SQL Standard Views
                  DATABASE_ISOLATION_LEVEL function, System Functions
                  DATABASE_NAME function, System Functions
                  DATABASE_TIMEZONE function, Functions to Report the Time Zone.
                  DATABASE_VERSION function, System Functions
                  DATABASE function, System Functions
                  DATE_ADD function, Functions for Datetime Arithmetic
                  DATE_SUB function, Functions for Datetime Arithmetic
                  DATEADD function, Functions for Datetime Arithmetic
                  DATEDIFF function, Functions for Datetime Arithmetic
                  datetime and interval literal, Literals
                  Datetime Operations, Datetime types
                  DATETIME types, Datetime types
                  datetime value expression, Value Expression
                  datetime value function, Value Expression
                  DAYNAME function, Functions to Extract an Element of a Datetime
                  DAYOFMONTH function, Functions to Extract an Element of a Datetime
                  DAYOFWEEK function, Functions to Extract an Element of a Datetime
                  DAYOFYEAR function, Functions to Extract an Element of a Datetime
                  DAYS function datetime, Functions to Extract an Element of a Datetime
                  DBA ROLE, Built-In Roles and Users
                  DECLARE CURSOR, Cursor Declaration
                  DECLARE HANDLER, Handlers
                  DECLARE variable, Variables
                  DECODE function, General Functions
                  DEFAULT clause, Table Creation
                  DEGREES function, Numeric Functions
                  DELETE FROM, Delete Statement
                  derived table, Table Primary
                  DETERMINISTIC characteristic, Routine Characteristics
                  DIAGNOSTICS function, System Functions
                  DIFFERENCE function, String and Binary String Functions
                  DISCONNECT, Session and Transaction Control Statements
                  DOMAIN_CONSTRAINTS, SQL Standard Views
                  DOMAINS, SQL Standard Views
                  DROP ASSERTION, Other Schema Object Creation
                  DROP CAST, Other Schema Object Creation
                  DROP CHARACTER SET, Other Schema Object Creation
                  DROP COLLATION, Other Schema Object Creation
                  DROP COLUMN, Table Manipulation
                  drop column idenitty generator, Table Manipulation
                  DROP CONSTRAINT, Table Manipulation
                  DROP DEFAULT (table), Table Manipulation
                  DROP DOMAIN, Domain Creation and Manipulation
                  DROP DOMAIN CONSTRAINT, Domain Creation and Manipulation
                  DROP DOMAIN DEFAULT, Domain Creation and Manipulation
                  DROP INDEX, Other Schema Object Creation
                  DROP ROLE, Statements for Authorization and Access Control
                  DROP routine, Routine Creation
                  DROP SCHEMA, Schema Creation
                  DROP SEQUENCE, Sequence Creation
                  DROP TABLE, Table Creation
                  DROP TRANSLATION, Other Schema Object Creation
                  DROP TRIGGER, Trigger Creation, Trigger Creation
                  DROP USER, Statements for Authorization and Access Control
                  DROP VIEW, View Creation and Manipulation
                  DYNAMIC RESULT SETS, Routine Characteristics

                  E

                  ELEMENT_TYPES, SQL Standard Views
                  ENABLED_ROLES, SQL Standard Views
                  EXISTS predicate, Predicates
                  EXP function, Numeric Functions
                  expression, Value Expression
                  external authentication, Authentication Control
                  EXTERNAL NAME, Routine Definition
                  EXTRACT function, Functions to Extract an Element of a Datetime

                  F

                  FLOOR function, Numeric Functions
                  FOREIGN KEY constraint, Table Creation
                  FOR loop in routines, Iterated FOR Statement

                  I

                  identifier chain, References, etc.
                  identifier definition, Common Elements and Statements
                  IDENTITY function, System Functions
                  IF EXISTS, Common Elements and Statements
                  IFNULL function, General Functions
                  IF STATEMENT, Conditional Statements
                  INFORMATION_SCHEMA_CATALOG_NAME, SQL Standard Views
                  IN predicate, Predicates
                  INSERT function, String and Binary String Functions
                  INSERT INTO, Insert Statement
                  interval absolute value function, Value Expression
                  interval term, Value Expression
                  INTERVAL types, Interval Types
                  IS_AUTOCOMMIT function, System Functions
                  IS_READONLY_DATABASE_FILES function, System Functions
                  IS_READONLY_DATABASE function, System Functions
                  IS_READONLY_SESSION function, System Functions
                  IS DISTINCT predicate, Predicates
                  ISNULL function, General Functions
                  IS NULL predicate, Predicates
                  ISOLATION_LEVEL function, System Functions

                  J

                  JOIN USING, Joined Table
                  JOIN with condition, Joined Table

                  K

                  KEY_COLUMN_USAGE, SQL Standard Views

                  M

                  MATCH predicate, Predicates
                  MAX_CARDINALITY function, Array Functions
                  MERGE INTO, Merge Statement
                  MINUTE function, Functions to Extract an Element of a Datetime
                  MOD function, Numeric Functions
                  MONTH function, Functions to Extract an Element of a Datetime
                  MONTHNAME function, Functions to Extract an Element of a Datetime

                  N

                  name resolution, Naming
                  naming in joined table, Naming
                  naming in select list, Naming
                  NATURAL JOIN, Joined Table
                  NEXT VALUE FOR, Value Expression
                  NOW function, Functions to Report the Current Datetime
                  NULLIF function, General Functions
                  NULL INPUT, Routine Characteristics
                  numeric literal, Literals
                  NUMERIC types, Numeric Types
                  numeric value expression, Value Expression
                  numeric value function, Value Expression
                  NVL2 function, General Functions
                  NVL function, General Functions

                  O

                  OCTET_LENGTH function, String and Binary String Functions
                  OTHER type, Storage and Handling of Java Objects
                  OUTER JOIN, Joined Table
                  OVERLAPS predicate, Predicates
                  OVERLAY function, String and Binary String Functions

                  P

                  PARAMETERS, SQL Standard Views
                  password complexity, Authentication Control
                  PATH, Other Syntax Elements
                  PI function, Numeric Functions
                  POSITION_ARRAY function, Array Functions
                  POSITION function, String and Binary String Functions
                  POWER function, Numeric Functions
                  PRIMARY KEY constraint, Table Creation
                  PUBLIC ROLE, Built-In Roles and Users

                  R

                  RADIANS function, Numeric Functions
                  RAND function, Numeric Functions
                  RAWTOHEX function, String and Binary String Functions
                  REFERENTIAL_CONSTRAINTS, SQL Standard Views
                  REGEXP_MATCHES function, String and Binary String Functions
                  REGEXP_SUBSTRING_ARRAY function, String and Binary String Functions
                  REGEXP_SUBSTRING function, String and Binary String Functions
                  RELEASE SAVEPOINT, Session and Transaction Control Statements
                  RENAME, Renaming Objects
                  REPEAT ... UNTIL loop in routines, Iterated Statements
                  REPEAT function, String and Binary String Functions
                  REPLACE function, String and Binary String Functions
                  RESIGNAL STATEMENT, Raising Exceptions
                  RETURN, Return Statement
                  RETURNS, Routine Definition
                  REVERSE function, String and Binary String Functions
                  REVOKE, Statements for Authorization and Access Control
                  REVOKE ROLE, Statements for Authorization and Access Control
                  RIGHT function, String and Binary String Functions
                  ROLE_AUTHORIZATION_DESCRIPTORS, SQL Standard Views
                  ROLE_COLUMN_GRANTS, SQL Standard Views
                  ROLE_ROUTINE_GRANTS, SQL Standard Views
                  ROLE_TABLE_GRANTS, SQL Standard Views
                  ROLE_UDT_GRANTS, SQL Standard Views
                  ROLE_USAGE_GRANTS, SQL Standard Views
                  ROLLBACK, Session and Transaction Control Statements
                  ROLLBACK TO SAVEPOINT, Session and Transaction Control Statements
                  ROUND function datetime, Functions for Datetime Arithmetic
                  ROUND number function, Numeric Functions
                  ROUTINE_COLUMN_USAGE, SQL Standard Views
                  ROUTINE_JAR_USAGE, SQL Standard Views
                  ROUTINE_PRIVILEGES, SQL Standard Views
                  ROUTINE_ROUTINE_USAGE, SQL Standard Views
                  ROUTINE_SEQUENCE_USAGE, SQL Standard Views
                  ROUTINE_TABLE_USAGE, SQL Standard Views
                  routine body, Routine Definition
                  routine invocation, Other Syntax Elements
                  ROUTINES, SQL Standard Views
                  ROW_NUMBER function, System Functions
                  ROWNUM function, System Functions
                  row value expression, Value Expression
                  RPAD function, String and Binary String Functions
                  RTRIM function, String and Binary String Functions

                  S

                  SAVEPOINT, Session and Transaction Control Statements
                  SAVEPOINT LEVEL, Routine Characteristics
                  schema routine, Routine Creation
                  SCHEMATA, SQL Standard Views
                  SCRIPT, System Operations
                  search condition, Other Syntax Elements
                  SECOND function, Functions to Extract an Element of a Datetime
                  SECONDS_SINCE_MIDNIGHT function, Functions to Extract an Element of a Datetime
                  SELECT, Select Statement
                  SELECT : SINGLE ROW, Select Statement : Single Row
                  SEQUENCE_ARRAY function, Array Functions
                  SEQUENCES, SQL Standard Views
                  SESSION_ID function, System Functions
                  SESSION_ISOLATION_LEVEL function, System Functions
                  SESSION_TIMEZONE function, Functions to Report the Time Zone.
                  SESSION_USER function, System Functions
                  SET AUTOCOMMIT, Session and Transaction Control Statements
                  SET CATALOG, Session and Transaction Control Statements
                  set clause in UPDATE and MERGE statements, Update Statement
                  SET CONSTRAINTS, Session and Transaction Control Statements
                  SET DATABASE AUTHENTICATION FUNCTION, Authentication Settings
                  SET DATABASE COLLATION, Database Settings
                  SET DATABASE DEFAULT INITIAL SCHEMA, Statements for Authorization and Access Control
                  SET DATABASE DEFAULT ISOLATION LEVEL, Database Settings
                  SET DATABASE DEFAULT RESULT MEMORY ROWS, Database Settings
                  SET DATABASE DEFAULT TABLE TYPE, Database Settings
                  SET DATABASE EVENT LOG LEVEL, Database Settings
                  SET DATABASE GC, Database Settings
                  SET DATABASE PASSWORD CHECK FUNCTION, Authentication Settings
                  SET DATABASE SQL AVG SCALE, SQL Conformance Settings
                  SET DATABASE SQL CONCAT NULLS, SQL Conformance Settings
                  SET DATABASE SQL CONVERT TRUNCATE, SQL Conformance Settings
                  SET DATABASE SQL DOUBLE NAN, SQL Conformance Settings
                  SET DATABASE SQL NAMES, SQL Conformance Settings
                  SET DATABASE SQL NULLS FIRST, SQL Conformance Settings
                  SET DATABASE SQL REFERENCES, SQL Conformance Settings
                  SET DATABASE SQL REGULAR NAMES, SQL Conformance Settings
                  SET DATABASE SQL SIZE, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX DB2, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX MSS, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX MYS, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX ORA, SQL Conformance Settings
                  SET DATABASE SQL SYNTAX PGS, SQL Conformance Settings
                  SET DATABASE SQL TDC DELETE, SQL Conformance Settings
                  SET DATABASE SQL TRANSLATE TTI TYPES, SQL Conformance Settings
                  SET DATABASE SQL TYPES, SQL Conformance Settings
                  SET DATABASE SQL UNIQUE NULLS, SQL Conformance Settings
                  SET DATABASE TEXT TABLE DEFAULTS, Database Settings
                  SET DATABASE TRANSACTION CONTROL, Database Settings
                  SET DATABASE TRANSACTION ROLLBACK ON CONFLICT, Database Settings
                  SET DATABASE UNIQUE NAME, Database Settings
                  SET DATA TYPE, Table Manipulation
                  SET DEFAULT, Table Manipulation
                  SET DOMAIN DEFAULT, Domain Creation and Manipulation
                  SET FILES BACKUP INCREMENT, Cache, Persistence and Files Settings
                  SET FILES CACHE ROWS, Cache, Persistence and Files Settings
                  SET FILES CACHE SIZE, Cache, Persistence and Files Settings
                  SET FILES DEFRAG, Cache, Persistence and Files Settings
                  SET FILES LOB SCALE, Cache, Persistence and Files Settings
                  SET FILES LOG, Cache, Persistence and Files Settings
                  SET FILES LOG SIZE, Cache, Persistence and Files Settings
                  SET FILES NIO, Cache, Persistence and Files Settings
                  SET FILES NIO SIZE, Cache, Persistence and Files Settings
                  SET FILES SCALE, Cache, Persistence and Files Settings
                  SET FILES SCRIPT FORMAT, Cache, Persistence and Files Settings
                  SET FILES WRITE DELAY, Cache, Persistence and Files Settings
                  set function specification, Value Expression
                  SET IGNORECASE, Session and Transaction Control Statements
                  SET INITIAL SCHEMA*, Statements for Authorization and Access Control
                  SET MAXROWS, Session and Transaction Control Statements
                  SET OPERATIONS, Set Operations
                  SET PASSWORD, Statements for Authorization and Access Control
                  SET PATH, Session and Transaction Control Statements
                  SET REFERENTIAL INTEGRITY, SQL Conformance Settings
                  SET ROLE, Session and Transaction Control Statements
                  SET SCHEMA, Session and Transaction Control Statements
                  SET SESSION AUTHORIZATION, Session and Transaction Control Statements
                  SET SESSION CHARACTERISTICS, Session and Transaction Control Statements
                  SET SESSION RESULT MEMORY ROWS, Session and Transaction Control Statements
                  SET TABLE CLUSTERED, Table Manipulation
                  SET TABLE read-write property, Table Manipulation
                  SET TABLE SOURCE, Table Manipulation
                  SET TABLE SOURCE HEADER, Table Manipulation
                  SET TABLE SOURCE on-off, Table Manipulation
                  SET TABLE TYPE, Table Manipulation, Cache, Persistence and Files Settings
                  SET TIME ZONE, Session and Transaction Control Statements
                  SET TRANSACTION, Session and Transaction Control Statements
                  SHUTDOWN, System Operations
                  SIGNAL STATEMENT, Raising Exceptions
                  SIGN function, Numeric Functions
                  SIN function, Numeric Functions
                  SORT_ARRAY function, Array Functions
                  sort specification list, Ordering
                  SOUNDEX function, String and Binary String Functions
                  SPACE function, String and Binary String Functions
                  SPECIFIC, Common Elements and Statements
                  SPECIFIC NAME, Routine Characteristics
                  SQL_FEATURES, SQL Standard Views
                  SQL_IMPLEMENTATION_INFO, SQL Standard Views
                  SQL_PACKAGES, SQL Standard Views
                  SQL_PARTS, SQL Standard Views
                  SQL_SIZING, SQL Standard Views
                  SQL_SIZING_PROFILES, SQL Standard Views
                  SQL DATA access characteristic, Routine Characteristics
                  SQL parameter reference, References, etc.
                  SQL procedure statement, SQL Procedure Statement
                  SQL routine body, Routine Definition
                  SQRT function, Numeric Functions
                  START TRANSACTION, Session and Transaction Control Statements
                  string value expression, Value Expression
                  SUBSTR function, String and Binary String Functions
                  SUBSTRING function, String and Binary String Functions
                  SYSDATE function, Functions to Report the Current Datetime
                  SYSTEM_BESTROWIDENTIFIER, HyperSQL Custom Views
                  SYSTEM_CACHEINFO, HyperSQL Custom Views
                  SYSTEM_COLUMN_SEQUENCE_USAGE, HyperSQL Custom Views
                  SYSTEM_COLUMNS, HyperSQL Custom Views
                  SYSTEM_COMMENTS, HyperSQL Custom Views
                  SYSTEM_CONNECTION_PROPERTIES, HyperSQL Custom Views
                  SYSTEM_CROSSREFERENCE, HyperSQL Custom Views
                  SYSTEM_INDEXINFO, HyperSQL Custom Views
                  SYSTEM_PRIMARYKEYS, HyperSQL Custom Views
                  SYSTEM_PROCEDURECOLUMNS, HyperSQL Custom Views
                  SYSTEM_PROCEDURES, HyperSQL Custom Views
                  SYSTEM_PROPERTIES, HyperSQL Custom Views
                  SYSTEM_SCHEMAS, HyperSQL Custom Views
                  SYSTEM_SEQUENCES, HyperSQL Custom Views
                  SYSTEM_SESSIONINFO, HyperSQL Custom Views
                  SYSTEM_SESSIONS, HyperSQL Custom Views
                  SYSTEM_TABLES, HyperSQL Custom Views
                  SYSTEM_TABLETYPES, HyperSQL Custom Views
                  SYSTEM_TEXTTABLES, HyperSQL Custom Views
                  SYSTEM_TYPEINFO, HyperSQL Custom Views
                  SYSTEM_UDTS, HyperSQL Custom Views
                  SYSTEM_USER function, System Functions
                  SYSTEM_USERS, HyperSQL Custom Views
                  SYSTEM_VERSIONCOLUMNS, HyperSQL Custom Views
                  SYSTIMESTAMP function, Functions to Report the Current Datetime
                  SYS USER, Built-In Roles and Users

                  T

                  TABLE, Table Primary
                  TABLE_CONSTRAINTS, SQL Standard Views
                  TABLE_PRIVILEGES, SQL Standard Views
                  TABLES, SQL Standard Views
                  TAN function, Numeric Functions
                  TIMESTAMPADD function, Functions for Datetime Arithmetic
                  TIMESTAMPDIFF function, Functions for Datetime Arithmetic
                  TIMESTAMP function, Functions to Convert or Format a Datetime
                  Time Zone, Datetime types
                  TIMEZONE function, Functions to Report the Time Zone.
                  TO_CHAR function, Functions to Convert or Format a Datetime
                  TO_DATE function, Functions to Convert or Format a Datetime
                  TO_NUMBER function, Numeric Functions
                  TO_TIMESTAMP function, Functions to Convert or Format a Datetime
                  TODAY function, Functions to Report the Current Datetime
                  TRANSACTION_CONTROL function, System Functions
                  TRANSACTION_ID function, System Functions
                  TRANSACTION_SIZE function, System Functions
                  transaction characteristics, Session and Transaction Control Statements
                  TRANSLATIONS, SQL Standard Views
                  TRIGGER_COLUMN_USAGE, SQL Standard Views
                  TRIGGER_ROUTINE_USAGE, SQL Standard Views
                  TRIGGER_SEQUENCE_USAGE, SQL Standard Views
                  TRIGGER_TABLE_USAGE, SQL Standard Views
                  TRIGGERED_UPDATE_COLUMNS, SQL Standard Views
                  TRIGGERED SQL STATEMENT, Trigger Creation
                  TRIGGER EXECUTION ORDER, Trigger Creation
                  TRIGGERS, SQL Standard Views
                  TRIM_ARRAY function, Array Functions
                  TRIM function, String and Binary String Functions
                  TRUNCATE function, Numeric Functions
                  TRUNCATE SCHEMA, Truncate Statement
                  TRUNCATE TABLE, Truncate Statement
                  TRUNC function datetime, Functions for Datetime Arithmetic
                  TRUNC function numeric, Numeric Functions

                  U

                  UCASE function, String and Binary String Functions
                  unicode escape elements, Literals
                  UNION JOIN, Joined Table
                  UNIQUE constraint, Table Creation
                  UNIQUE predicate, Predicates
                  UNIX_TIMESTAMP function, Functions to Extract an Element of a Datetime
                  UNNEST, Table Primary
                  UPDATE, Update Statement
                  UPPER function, String and Binary String Functions
                  USAGE_PRIVILEGES, SQL Standard Views
                  USER_DEFINED_TYPES, SQL Standard Views
                  USER function, System Functions
                  UUID function, General Functions

                  V

                  value expression, Value Expression
                  value expression primary, Value Expression
                  value specification, Value Expression
                  VIEW_COLUMN_USAGE, SQL Standard Views
                  VIEW_ROUTINE_USAGE, SQL Standard Views
                  VIEW_TABLE_USAGE, SQL Standard Views
                  VIEWS, SQL Standard Views

                  W

                  WEEK function, Functions to Extract an Element of a Datetime
                  WHILE loop in routines, Iterated Statements
                  WIDTH_BUCKET function, Numeric Functions

                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/guide.pdf0000644000175000017500000647664112007570176017572 0ustar renerene%PDF-1.4 %ª«¬­ 4 0 obj << /Title (HyperSQL User Guide - HyperSQL Database Engine \(HSQLDB\) 2.2) /Author (, Blaine Simpson, and Fred Toussi) /Keywords (Hsqldb, HyperSQL, Database, JDBC, Java, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, HyperSQL, HSQLDB, SQL, Text, Tables, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, Server, Listener, HyperSQL, HSQLDB, TLS, SSL, JSSE, Security, HSQLDB, HyperSQL, UNIX, Linux, HOWTO, Hsqldb, HyperSQL, SQL, HSQLDB, HyperSQL, SQL Keywords SQL STAT, HSQLDB, HyperSQL, Building, Ant, Gradle, HSQLDB, HyperSQL, OpenOffice, OpenOfficeOrg) /Creator (DocBook XSL Stylesheets with Apache FOP) /Producer (Apache FOP Version 1.0) /CreationDate (D:20120806001436+01'00') >> endobj 5 0 obj << /N 3 /Length 11 0 R /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 6 0 obj [/ICCBased 5 0 R] endobj 7 0 obj << /Type /Metadata /Subtype /XML /Length 12 0 R >> stream HyperSQL User Guide - HyperSQL Database Engine (HSQLDB) 2.2 , Blaine Simpson, and Fred Toussi 2012-08-06T00:14:36+01:00 2012-08-06T00:14:36+01:00 DocBook XSL Stylesheets with Apache FOP 2012-08-06T00:14:36+01:00 Hsqldb, HyperSQL, Database, JDBC, Java, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, HyperSQL, HSQLDB, SQL, Text, Tables, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, SQL, Hsqldb, HyperSQL, Server, Listener, HyperSQL, HSQLDB, TLS, SSL, JSSE, Security, HSQLDB, HyperSQL, UNIX, Linux, HOWTO, Hsqldb, HyperSQL, SQL, HSQLDB, HyperSQL, SQL Keywords SQL STAT, HSQLDB, HyperSQL, Building, Ant, Gradle, HSQLDB, HyperSQL, OpenOffice, OpenOfficeOrg 1.4 Apache FOP Version 1.0 endstream endobj 10 0 obj << /Length 13 0 R /Filter /FlateDecode >> stream xœuP=oÂ0Üó+n‰ºö3¶ã5"€ª.îT:„ÆE‘H€þ}m@‚R![òÓÝÓ}xŸðp^âc,á»IöWLÀ¤ŽPÀóÒyÂ5ŒþjÌÿ2w:Ïñr¬“Ì%¯S ³4%k-ÜÏ-œà’I)9ç" F© ³Öp >óÓÎw‹â½ï0;Ö•~Á½]93¡Å½iÆIn %*ê*ù 6)åªì=òv]·ËÁ<À“l91ºzˆšZc­V uTt2êš5¯êƒ¯°:a„lSFáEÝìúm;BÙV˜vuÛcß׋܅?+’_Waá endstream endobj 8 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 10 0 R >> endobj 11 0 obj 2596 endobj 12 0 obj 1599 endobj 13 0 obj 248 endobj 15 0 obj << /Name /Im1 /Type /XObject /Length 17 0 R /Filter /FlateDecode /Subtype /Image /Width 148 /Height 32 /BitsPerComponent 8 /ColorSpace /DeviceGray >> stream xœ½— LÔeÇwœxPº3›T¨EÎ2™ZZše&¶,­†5]ëe9åU]Z •€™Î²W—͵4‘)ŽÔFK¦‚5v$!" ÜÓïyûßÿåîü»N~ÛÝó}~Ïïù=ŸûÿŸ·lKÎ>ÔØÙÓ\]ôÈA[˜Ý¢®Yž"Šu¬ óÙåK—Ë•.+K±RDžø’c­¤¿õDÙ3‘|‚hìÂSÜ»¦ÉnزZVʰr.hDa÷ɱ›¸'í2Ñ™g kˆ£:óÖ3Y+½CW2Ïò=ÚöÁdZΆlý|Óîò)ų¿æêAd:IÇy‰Íð¤ñkä%BNö™ú§ÿ_&KÔ0­Ãc\Øt‰3ÓD-D]¢ÞøWtáê}êksLy([çÃ@¬Ât5”I'Mð2À¿XÄi†gLctLPJ½SîÕ?œ+^ù¶9&–þ9ü…‰ðØ2*çÄ"ÍÈ :co-ѸAõ+j¬É3ø8j:«˜jéùë ·×®á+±l áãz¦i“y9á  §Š|R-fï¯óø®p©šé˜^EÅtÝF‘IÅÕ阵Ïs—žé}R“·hêãEìŒù z&"ö‡,Ît`‹0¿LÎë,þP3IëeûÒ|öË»c[´i—*¾s:,ßû†:;„3)æÿþ´µ?¬bªÿFtòˆú¢êþa`úÑÛv‘¯Å°Ý(üÏàIÓLìrqÖ¢b:nÉa—×Z ÷ìä·þþ½é!z¦y8“%o}–lÃ%ª–¬=øµ0:\®¬Q¦£xèŒ_07Qe›œ–ùظá>3Üž˜úì“÷;Õ®¸]rä–=¬(·úG0˜_ö€²ÿP¦ê›èí?íÝ™E‡÷¬ž¨ï2¨¼›è<¨ïÓ”éH0˜Ô–Í Ö˜ ~~ö¤ôHxBÃTl&¾=\O¸q ðcƒ({¸d:t&x‘Òo†6”#5Ò2UŸ û2Ì:Oáë¥Q*×[uuu[o$]ÿ¦¼ endstream endobj 16 0 obj << /Name /Im2 /Type /XObject /Length 18 0 R /Filter /FlateDecode /Subtype /Image /Width 148 /Height 32 /BitsPerComponent 8 /ColorSpace [/ICCBased 5 0 R] /SMask 15 0 R >> stream xœíšyOAÀ?߈Q T0$¢ ¢x 5‘+R¶Û–C@N…"rH)m‰ÿµ…Öh9¶G⧨S¶ÌNw»»3³ ]J_æ¯Î{3oÞoßÌ›Ýf2eÑ_¬Þ”r+¶ƒ7EnU¿ GS™¾yÇ`Ó¨V2"Z/ÎòIÁÉáÜNª©Q­D™šÜòè ¸¸Ï¿Ïo_™à€“.Ÿ•pésqO¿6N‡«Á ÖZ¥=ð`2ôdá wýD_™P°³zÒ øŒ/‡ñ¦:—*m™´™Xÿãù¨eGŒ[ÁLo5ª]wQ%%ú…ùóÿ ‹«ÉQC[õØ^ÏúiA|×—ÅZ¼Bmñƒ…õ‘ÚNÔNì¡€À†ùè[øÙ×Î8ȵú¯!@° ¾«a‡9 ŽmÁш\R6QŽ(h¼°^ {ÝÄ>„b¶ù;–-ñÆøqó¬f|Í>ÑæIä†F5º¸)GžbLU+e¢'ƒÄüõÏ8$Ê’!wB®ª@›g£P¹m1jXvr DìHAèÈN!&,ó{£AˆÜ”ït_ÍØEöÙüŸ6óvNjv¤a!eG=/ÏDì”Õ¤¡ƒÑñ$žÅéü$fÏÚIë|¤y6òj%nEÇÞÓëöŃ¢°SÅGLœ^§#b'K8ÅÖOaÒõ ×7ËNÊlò±a:ŒÞÐë'sçcãTØ€ì躔ˆ¬0Ò€dÁí 'Úóå#¨;oÃv'Mv¡ò|áŒÁ®ÖùÜ©wÇ4>;L+-ìäð‚“.$ﺜB¡6Iééñ+ƒ`µƒVƒÛ‰¢°£‹3E Ð9LÁg¢ ®o‹ƒD`.ûv’f¾wZèíD²uÀÅigG§Vp:"ÌI©3 v «ã›Õ'Ð1_Ô* h‘¾ïâ7O€¯céþo Uö€.{&µZ ³“›—õ¥aÀ¦ÂÂ{<ˆ–”Hzžº¬ð’Ž–¦×‘¾ì Ž`GÊ•m}ßUi~ØŠ–!7÷ní¸Âáošù;¼“vm QC±£ÐÇT0»Lþg;PCJ?T9¢o M3‘¾­³ÛáGp×+.»‚«#eÓ‹¹4Õq¬Týai«ØG“®e.‚Ž€ïªTS‹švv8#(+à[‘.AÎ\t¨.•vÙwí‹#çGa÷jöZqw4øã]4©K:²Ó%é º׋Ý9¾¼ìc¼É¶…ƒê±½,Älý·opÒõnä]Û߬ƻ‹Ð‹Ü¼ÚÙQ›_;‘Õ (Z|i…GÉg kî(¸#DÞç_ä)"cpvDs];9¬2˜¤­ßÅÝŸ ‰Þê:Ñø0Pøv‹¢ÓæN1*à’]Θɖwv.Ǭø·­î‰|MåüÓ^úüoH %Yozd7mq¥ùÞ‚eLqÎ)mvªb|tò g—1>º“´Ì.#ÁwųSWAev¼pÃ$5¼W +Ôàþ4ÆG} endstream endobj 17 0 obj 1262 endobj 18 0 obj 1153 endobj 19 0 obj << /Length 20 0 R /Filter /FlateDecode >> stream xœÍSMsÚ0½ûWì!˜E’?°9RÒNI¡Óé$9,@3¶äø# ÿ>+[&¦×¦ƒí®´ï½Ý•^#³Œ#ëÌyµ1cn`C~lLBÖ ýRsðÄ4G¬é6Q{ºuvðÛQ…¹óô‚‡ Ä‡½C/À[˜…óˆä~@Ü Œ¢Èjå„…¡¡pI€ ¼ù–q˜éæt§ÞÑOWßWä2þ_(2šš™7SçøI3ú“ ߣ§;½kqŒDñï·a„pÉÍVj'aW³Ñ™~SY»þµ ÕK>ïkSâg‘›¡þcò‹an [gºtnî\#ǃå¦ÿ¶ñ͸,¢”rÜÉàipÈE±xü¿JQÀ¼–‰˜À18‹«x—nÕV*σ{ ϦÏCà„_`ù™|`ôŒ‡û$`HCÖò¬p Ó46( ™å¥V×«î ‘ÀR×e)[¼ŠÇÏP®~Š7YJ­&à…W)w–òP¯R¹Ž+L‚$®pÊøˆ†#ŠÝ¤Æ'>ýB1壚𬘓ÈózMûªóC!·» †0 `Àqk„¸Ìú˰–i—5gâM¤:Ï„êÒæ…®sbQd²4µÙ€,­±-bUa“Z¯ÒÖHdYrUWWµ;¦$z]÷ˆö²Úéºóbu謴EÛš6P«oAwFi²Þ\´<âÄ÷Ü( ñ6í1™í=l½P¥ ðG×”® NS½Ç‚°”^º0^žÆh*9Ö€ê â^¬@*¼3ÐÈÆü.2Òʹ]6ïá< endstream endobj 14 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 19 0 R >> endobj 20 0 obj 601 endobj 22 0 obj << /URI (index.html) /S /URI >> endobj 23 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.039 315.85 206.099 324.85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 22 0 R /H /I >> endobj 25 0 obj << /URI (http://hsqldb.org/doc/2.0/guide/) /S /URI >> endobj 26 0 obj << /Type /Annot /Subtype /Link /Rect [ 276.424 315.85 403.104 324.85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 25 0 R /H /I >> endobj 27 0 obj << /URI (guide.html) /S /URI >> endobj 28 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.039 298.85 206.099 307.85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 27 0 R /H /I >> endobj 29 0 obj << /URI (http://hsqldb.org/doc/2.0/guide/guide.html) /S /URI >> endobj 30 0 obj << /Type /Annot /Subtype /Link /Rect [ 276.424 298.85 446.164 307.85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 29 0 R /H /I >> endobj 31 0 obj << /Type /FileSpec /F (guide.pdf) >> endobj 32 0 obj << /S /GoToR /F 31 0 R /D [ 0 /XYZ null null null ] >> endobj 33 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.039 281.85 201.089 290.85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 34 0 obj << /URI (http://hsqldb.org/doc/2.0/guide/guide.pdf) /S /URI >> endobj 35 0 obj << /Type /Annot /Subtype /Link /Rect [ 276.424 281.85 441.154 290.85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 34 0 R /H /I >> endobj 36 0 obj << /Length 37 0 R /Filter /FlateDecode >> stream xœíZ[sÛ¶~ׯÀÛqflˆÅ[ÞšúäÄv¦{ΙNÓš„,NxQHÊŠÿ}‚ JN{ÚxÎI.#ìØ]ì~ؤôiå#þ^±8%(¯WŸ¤ÎG1AA$Ua„üG^‚j$…$LPÅ&ΆlŠ\+g a‡þ³jVú×ê×ß`R<¢ãʳŒ 3·«÷à<Œp%išÊX ö“„¹pƒ¼F뛚 ë–Ï£g†¼¯½Qà“‹‰×œWÀ¿óÒÏ.„o~Eƒ…ÒOZø¿ÁГœ³K•¬„üdÆaÈw&>w"Mi‹Í¼ò-þÎ=ô°zs·Z¿ ‘ï¡»ítŠbçy~À%œ”ý!è®F¿^|.ËòÕoèî‡Õ?ï,`üÍÙ³ Ê|{ž科:¹Ç¶G®4 Ù6C±³Ÿ;ºÍr*6DzãH‡6YB’8ËÞݾÿñú z…®ÒoÐŇ‹wO{ÚvÒ]gCö&ëé‡W“®ì§q6 ë¶ ]3É­²¡l›¬št˜»sÚª¬Éh7)†]6LRÞ6Û¶«5yÕö´zÒ´úbÍ4lä5ñ¼DäEËD™¸²¦ÈºÁúáúÍ÷hƒú=ÍËm™ó=ôÝ ¨?ì÷m7ô(«*”·E[š ‡Žö|!lå µ[Ä‚h÷rëj\ÂVDqlDtÇ7Zt±-»~…GÚõ,žQ«r¤ªÉ¥#í”(…œ£\6ã‚ññ(ü[˜V×°wé á”9ZS6yu(¨Š4y[ï+:há»r VN’ÔÈ ìµn!Ž}Æj ­E›‡²¡vj}ß·r+ ÇÙæ‡š6/³Òæ-K´%¬ø@My2„¨®xTi2Á+᮵ }8TY'À..ÖûB+”‚ánö Z8R@Ì£Ïà%6r‰ä24žg ºh·° gq7 û×ëõ®ÿT÷¸íÖøà±¶mÌ“uÃðyEX?¼xj“дC™ÓIfgG uÙÙGŽ©á “ãA&QHc/'UÛi —Øeš{Hë}EkÍî±vºÏùäœüTëjèK´×Ùó“2É]€vC³Èc-[‚>_VåP‚ëã®Ìw(ƒs^AºèB­ä‘æ ÃèÅOLzI"¦ì†Ï“ÌùÝcVVä±^œÁáƒOÄË0fÿ ÷8„>cæM¢Âq5‚q¦œ@­{ hdÝSø³!M‚À0ø /.0a¤ò¤Æ÷T ;šeó d $!¨XÔìòa7IM{TãlR/ŽK5…£Q 9Š¥É1T¯+ï² eßÖô¸M\hhÕS¬¤›)˜tÿd'®Î”3Öâ-sÜéÌó¶kk‰)vN®Æ|±<]2-ì„ûY¿Ì“8Â^ ÀÂØåüÐuÊe;Z±p‚•0V8ˆbcÎbE c„Ýå]ì€Dz%‰“-ƪ· ÎyqÈe]„Jã_¡à,†,¿j¬ÐfÍA¦FE¹ÝÒŽjׄA-;9qj$‡m¶Ïjº\Ç Æqì±Ûfß±^n±~P â{¬~ÇjÅÙ#M Á!»d3~¥ßµ‡ª@C÷$°7ÇÜ‘mù4ž°Aš…Ôì=Z]å†.M‡‹(²!øf+º…Ã;”µ¤GóCÞ+m awJ‚;ßF §`,M¶jd:-lûI”c ’B£AR(nÛ)bAœ|(y“áîàšý<§}o§„˜'Wœ2†[_¿i,üøÚ)àcÞ5Ç Ý8Ñ EŠK‡)Iô|Ü´jù®÷\‚¨€ÔÁÖþÔ$„ z=·Z„¯uˆQœv'+j'+°ZØêÖoc¸™3¸5ˆ<éc'q,¹•Wîìmâæ'Ðâmx žžGC‡Ð6/ùña®òQ„?'ÇI ¦$žsAAF“¯ÈégeaWø°Œ‰Q†ZŸçÇ3—~„]1X®}p|Ϊé”< 0—_‡Yî¤ÂéO-]ð¤]ç9‘NdÖµZh9bXÎ.[6œùãïbû†½= 7ÀÐÈ9¦€œïO ¿zAjBÆFŒÏŒ&¡çK”/V@Œš/mNäÓÔÏfò> endobj 37 0 obj 2201 endobj 39 0 obj << /Length 40 0 R /Filter /FlateDecode >> stream xœÍÙnÜ6ð}¿‚}ˆQ›&)‘’òæÔMê Úx‹­û ke¯R­´Öagÿ¾CñÔáÛms™3$çžáŒò°¢ˆÀï3ù#JÊv«£(b(Å¢$F;¤˜Ç¨”GKyD/ƒ«O+`‹>­ªAïV¿ý‡6ˆ`ŽžVdF\‘¹^ý ̹Àˆ“$Ѳ2LãX²°€E¶CçW;†.ëá´‘^"ÿ¹ô¾Deÿ ‰¤LƒÏ¯3øáÁõ£ ’ñŽï°ð7ÄÂ3ÌåV©=¡Ê ³äƒfê糚hRÞå©]ÿMæݯެWço9¢­ï\EKŽY"1´Þ¡ß^Ñ“ßÑúýêûõ,þe›ÍÜ(yEÐDPÔhÍÄèH³!¤Á !”+µ¾Û¦û.oÅèc_UEuÒjƒ~iåê‡Ã>o®þQ©.-vþ–J}à YA1X ÈrMöm“oкîÛ¶8EëmŽ~2è2ÌËz¿Ë«½kê~¯DÉ„dÌpDÃ$A¨H~ó1,Ú¢®^#N‚}£.ûÊŽcAA "´võþÐ÷Û 3)ö+F;cÜf0ƒ¨P"c ÿ”7»¢•\-ªhíò¾I«Î»ÝÕv¹)Ú®)nû.w»[ïê¦ÎúÁñTtÛºwpZܺ¥H1×YVš‘Î}µž  €ô¦¹[ƒ2­…ê»ÅCÒQ—o,XY^µ9¶ˆ‹Í¦’¤¥Eí}#)Táø8#ifõ³|-àŠÁyãëÏП@š†Òè{ÆŒn-Œêc;öHÙMФìöétà‚=Œæ„t"€Œ®3ŸCyMÙkN¾%à!“EãL•iJãYšQD#S~ÖN”÷iã'ä¬~Áõ$œE’ð´ÚëMB@qq.Öðç´qÀ>ÍþHï½Ó*hÕº¬³T¼Þ¬Üºóyœ—Å­ƒ6E“g]Ýj¿¥›¿^ýtDYœ,ÕU—•'` Ó ¡iìöu¾oG4fnd$™˜lßÔº»›"A°M ͯ²Ì=j Žegâ§}(7·HÚX+cè-8Ž ‚C(Ï”1Mð†1>–.3¥}¼|óá}_ÝUŽn´¯oNæ Çæ G9MYFï/ß|‡.› >#£jm…úõù¹Ë´KoÓ6GÒ lÕ€ ï~¹BƒN³,o[ÔÕuyªÒùúÉÃpb0I}  P‘«‡>oš„uË¥‘ÄEYÚcÆâÐö–˦¯Ì²¨hVu³K-•§ô`–wN¤÷écjÖöq4ˆ«%ªwuYÖOžù—t·/sïèÜB\L,tm(Àà¡WºÂ;„r›Z›:7—.;5Æ<*¡šµÎ¿ä´ŒìPkŸœy·“i°º5&’„Ç|AþíÐàϦm[È$–¥°,¯×ŒéÍêCŒÚ¯¯(õ‚B#Äé‚(ËÎîYE€»íø7y™ÊŸû_Ä“KÛR›¬oÙÃ[e°È NB„ä œDŒÃ³=@)Œ‘„(Œä¨„‚”¸ƒúŒBUcø6wÀ4ñàRÂöj‰<:v^7uv2¶[º‘Ó•°ù6æfOÁIi@HdH,Fˆ !é±)6á0ÅmìRÁ?*õŸÉâ#^b8 ÍÂpµ(#Δ·‘Æ:f䊩\_cd Omb¿ %hövÆ Ž !Ò¡ùY–ijlTZœ»T‡)ók°ïŠOšŒ¡¨™@FÌã8‰¦çú+(sÏ%m‚)—ߪ zÌ/¾ þ€?¨œc! ¨:P[“ðT¡u»öT÷åeÛ´‚™­«_¿ C9ƒ*Dúb)Iå>Uû&p<” FÆ#øÁ)χlÆC£Æ¹²$OãP„yÁFˆ— ¤suƆMøŒdr:cFG¥Efùˆ—˜΃LŠ…ãªQ£ü]ÆwØÔ?Sé^’Å#ëhÔÔ8G™0ˆªˆ˜&òßÌà…ozAEIsÝi€ÙeeÚBoŠdcå}è\·½\b ‹ å4œ¯ .ÝøŠBG¸ "ƒQ6ûZ°Ì}~ãD£FÀ FE6ç§m>4<œ@ÉP »ZvjâÓj™Ôºß{ÔH­€F A§s¨{ÀøæuUAñóù-Šá ‡sój§:kÞæ‹÷ªüiNäæäÉ{Ÿþˆ`äŠrë :k· $c³êÑJ2QșR×pÉÿ…ø©E±œ endstream endobj 38 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 39 0 R >> endobj 40 0 obj 2060 endobj 42 0 obj << /N 1 /Alternate /DeviceGray /Length 45 0 R /Filter /FlateDecode >> stream xœc``ªðvö fb``ÈÍ+)rrŒŒˆŒR`ˆg`gfdcàOL..õ *aôöwq©a@F†oWA$ÃemÒ[rAQ >Äö)©ÅÉ@#y€ìƔܼ {P^RTÃøÈÉ rf``b²ùRrS€j˜D€ì”’Ô 9 Îþ‘Ažî! Éš †––æ ®‰Å%¹‰y Þù)‰Ù: Ž99 E™é%Å E©Å©Ee©)z@Àvƒ:ÈŸÞ îE‰•Åɉ9© Îùye©EÅ™ùy º ¹‰ †z~¹±ÉLÿA`á¨Ãêg˜8ˆæ„! ¹ ì¼Vppv1<àèÂjLDßÐ`pÜ‚"Î’K‹Ê šQÝÀ*»_)q endstream endobj 43 0 obj [/ICCBased 42 0 R] endobj 44 0 obj << /Name /Im3 /Type /XObject /Length 46 0 R /Filter /FlateDecode /Subtype /Image /Width 24 /Height 24 /BitsPerComponent 8 /ColorSpace [/ICCBased 42 0 R] >> stream xœ]Q!¶Ä0¼ß—+¿]¹²2veä\# c#‘‘X$GÈ’nÓv¯¯- ½O³a}µB ŠGîA¯™š¹»UàÊHÏO4ñO1•ïeáú„Ö|o{ë}rÐ ¯…ÃõX‚,àÞem’ß4–€±À1³ ªlEUDaÔ`ûTÏÿ¿GBa.Õ zÄKUB÷ðÞ^³ ø.yŽl#ŽDî¯Ô¤¦9²QçÖ;C^%oÏsñµÑÐ3=6¼ëµ°ï¹ ²ð룰Ñz%ðè¾ —ÓøÏ‹1êÌX|_˜Ž4˜%üeSAɬûå9÷d endstream endobj 45 0 obj 317 endobj 46 0 obj 240 endobj 47 0 obj << /Length 48 0 R /Filter /FlateDecode >> stream xœÍÉ–Û6ò®¯ÀËeì÷ºaî‹oq<¶_œLl%~3q IŒIB&)Ëúû)ìà&÷\2ã¤Ý¨"jA¡P àÏyðß=ÿ•æ*šÍg…óQ 0Q¨8A~Š/C R@g¨æGC>E CU³%pD6íÆCÿØüþL*‘‡ctÙx3æ’ÍûÍ/ 9ܘ¨3‘¸<{çÛ;“¾ª&»šÊ v xË™£=ë,¬5pkâm`/H¢¦ }ÁÎ uU|âgš›àœéߣ?I‡.U]£~ Ý ¾¼ Ù‘ž¾%-9ÀÙ¿ˆ€p:5*Ö*žt#ÏÏuØÿùÙdÿS§yšø©TåÁ#G³;,»PÃj ^žZͤ8Z.¥â‚ª¤®i‰ R³FÛ#í("ð3; Y` Ô TÒmK¾BÖ¢#» pžœ_?°Ž–j½Ï^¦NÜX9ŸïSœA,M}åá3 ð[sXXž»•ưYQ¬8| ‚X$S‰¢¡ÍóUa€;ØoNªÖˆÀ³ªŽÖWTµèÝÃ[t^1Ùy€TpE`뜘¶E;zepb¸Þüö:Vоÿ[êj?÷c?‰pƒ3qüÈåÍ(öUM××$Ø÷y:7œÓêõÁ²8›þ «häp®k¬âÄóâ,y¤®3ŠŽö7T…è‰3-:ªôBfìÜôõgðyÒ‹ÈΤ¾kSHyÏÚúºAx'ÌÕ^?Ôõ}ÕÞƒ·°îzQJ¬=Y]`ã(€ ”ÄÁ·›N—A)†0;HhuFzÑšñŽš!¤†Ò<þéñ@Eh•€8¶p&Ë¿g§#82dÇ" í8ú¸!Ð ·"»ð`4÷­ÀÏ'F(jÙ€Žä gLøä<˜‘ã8€“Ç:„Bþ|ìߨºç!?ôi²À€KZ÷QXˆ8OQ´@úÜÊÖñÍ"X˃Do12ÕÉñŽJ[‹ìP&Q9NìPXäÎÂÝ-Ð’Fì f!³ºzøæH>àQÍBeµßC‚h ô+„¹öØ•\3í0 Qµ7DÏ÷0'v,!Øpܯ½o£_Isªáœëì#2š\âwÜÇ¿Cƺ`T>kÏꚉÔ,Ìô|.jÉ`!ææ qÌËÅaˆêó‡J{òbê òçDÛÌ{¬œ…Ö]unH ý '$®ÄË'iN!$ÃÞA6BH~ôH13 !æ9?L B‹|Èþc—3£rv¤øt>Ý’”…8 yò‡@ü8I3 e¸Ý-Wˆ<Èa g ª´­8Ðç%è‰õ&ƒâNkðíT­ýJì÷RÑG**Hæ1´¬½y®th…ÂØ"¶.3Ü/i#9FRg*ŒªGÒ¨«'»¡³Þª%5ìYµ8ùÄrZA8÷ÁXA‰Q2% í$!e'Eil¤èô¦*Xu‹ LåatØŽ4ª\®¢Í ʼÞ9e$Óè‚ÄšÈÆRBŸZviG&5»3š¼ažž"HóccJ‰)TF¢´á$ÄWˆ-ø ó³!ëéxjoAÞ‘€/ÚâP++K ‡>¤và–~¡w®~´¦¨¥^2gjÏg²®>ïV»&CHc”î^ž¦ Öûv ˆbVµ€ƒºbAô7²B’,Š &Õ¯Þ) ŠËñŠÕÒðrÌ6[ÌëÖŽIYꨩ0ªä“ã#ëéD;‡ØM×o0nÀ”˜†\-PWí§e¡¼ä¶"Y×g~6’ib BDJGÝ–ýýýoˆßò ø^Ä¥¬VTsUÿiáŠ$?Œó º$ÉöÃQ… ¨#·¨@•€—Þ&¸È1¤Úö΂Ä×Ó~˜ã$È ]È4ûfáäóno•ÜÊßVèê¬ú;½vfÇ—®ÖÌâä‰hHI—Ùp7ÁÜ]éëzuÐ*qU#Ã|+ó|²bnòHæ\p«ZCï_ýº}ñ󇟰FüÌ‹‚K%œW >êöD@d7¦ïç¡„ÿñ©Æ r‘“ ÅØb•a%¿ÁÒ™©-÷f-€_ŠÄ™ŒÉä^²Zeÿ¹wǾ?1 ïY^­ú x o=8fsré‚?Ê~Œ3ËfÜ °åPögáe$¡‰0’‘ºgz¬ &ƃÁBuÃ:‹?&{R M†…)N„šÈå'k@¹ädŠÊgFS#€èñ3/Ÿ7a"#~Ǽ‘ð"næ¢Ù<{Ý„òAM\ৈw1Ž5ãÅ!ä:HTY–ª+ÜŸ˜®!€=LÅt?~ÆYÆ!¿ †¿cHkHò!ÝÀOêã$ç‚ظçÏ}øŸÊI ÄÚ|Œª9ÊeT£1ãÕ' Ã<ŽgÌJ?;Τ깉a~í 6‘Š$>¤.â1šp^Áÿ`"ÀUÆùÐ ±”ÑT°ÁL•â–QøÄ4V¼µ8ƒ2o±Á¢£½™nÅT­u-Ò‰=$jfŽõ‡%î— ø[èç©ø:ƒÊë%?wz Ðö Þu$\ÔPqô+“Ý’BbÈàŒíPä;‹ªœ™EG¡Úv¥ÐæÄ:Ò]-Ê[Ô·SKKÐ÷RµK£hÉ>¸¥—Õ¸É-šŠË±*„>Q".½;”±%ÔQ~WÕ;Ÿ™;U•wäu’jB MüÕü Xߨ*ÐXH‚¶°*H%°sèläÔ¯#í-!¿sä? +ó†jvµÇ­–E«©v-†ªÞî¡„T¶Õ J¸wJÝqê giZo‘°®Í¸sE9ëן¯«z\^¢ä‘ÁFôZ3ÕI)°¨ºâÜÀzÚBÕîz=«NÊm}ÔØv¦uÂ_¿~Ŭ.׋Î8Y •šÇ«2NŒåI,-Bµ—p,¥¾î¨ËHW:,¤ñäX¡ÞÔtãXN"¶î|îmŽfò™ÚUdîb‰—MÍ$ÏÈšiÓ{1ÔR¡/?ÞÆÐ„Þ`´öd‘„Pc„Ês§úƒNëö{…xËü9õ7ŸÔæ$ZžÛ(…“ŠÐ¼O„vKÃQÿk®†øèAõV}§!ó§ãŽÔ”…JŸVwf‚zöSP*–t&T¼‘òYÐ0PQBÕç—fIÍôï×ÿD°À7ïéŠc%^¢JÞ²]µ;óCüNü€©Ô£¤ó ÆilµÉÿ‰ÈE! endstream endobj 41 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 47 0 R >> endobj 48 0 obj 2770 endobj 50 0 obj << /Length 51 0 R /Filter /FlateDecode >> stream xœÍZësÛ¸ÿî¿‚“ŽÌã›âµÓÙÖ%º*vÏ–›f.77°DIìñ¡T]Ûÿ½ ìâÁ‡]§¹Öwïo, ì ?¹–ÿó_qâYëâìñ\+ö,?"VYnlGÎÔ*,Ópjå¼c‡ä]ˆô—z#Ø[ïÏÊ3ÇzsöãOÐic9vh=ž9á(æîì˜<Œl?š&IBºz¶;ò)|;b]Xß, ϺªDo©=äüϵ75ò]ïÿ@#ÇÚ]¬Î¾ù.´\ÇZmõHB0¬?¾kMmßKøg­ ëÇWw?,­%+wG¶K_ÿd­¾?›¯hyb¬8@üÛâuÂÀé¶'Lñ5þ¶<àØ^ëàM9m*ýæ ’ …‘ð÷“F!QÆàþ ký–“?½±{ÚÙ×1lß=X¿±É»Èç~z1Îà@½ÏÚ½õÚ:ŸÂî¿by~ž•çEZTõIq7¬e¬I›‰b=Tƨwów7·„ÎyªE–E_Î.ßίžè¸I×9«Y›Ue£G׺C[§¬Mµ4Öó9H;bU[¼=à܃·šÿuÕWÀÀýE›L&QžWh4âde·™oøÀN¾gû>D wê£Èê(؃!a`q C܇¬„EB7hËŽy«p ËU@‚øÂÈ Öi£²r§8Ûº*48¶ÇZ˹¼ÏVsW³‹¥FM [RÀkékV*úA‹ié:ÛfÂhÈyD!eñh¬¤UE‡ý[; \7æ›Ä^$à¢õî ŒMí8ñy" bp\׎,XÆ\ù܇f› +ˆ’'çC@nuä©b‡Ž›Dn?HùaЗO™ëûóÊžS…œ“&€}¿\.ÏNáuç0µÑü 1;‚úº˜øfîQ@âÕ„Ä‘Šô¦%=ÌíémGO­«FÏ"ÈéDÅwXc/¼Ç‘L=Çñ¼½Ð‚Ÿ»ùʺš?ÌîæÖÕü»Ùýre¡{¬>üynýÝ¢Èü‹bù?Çx4…$Põ.”'§=]x4x2øTú¢)wZŒXÜÍÀ½Ö{([À©„3q'âÎóNãr? cn…Q¯áí.¶Ëý3Xx" bk:øG„÷œÁÄêžÖ1}<ߎC(í|©0¼ãå ‘³ ¦ñzóttÒ tt;]¹E™Œ—˜ú‡M¡g%VÇF´17¬¿?}í^âKë«oœg¼ rõawÝ ½çxÂKV¤ü\É  šsB#ÑbJñž;9 Yl½N 7Ùv›ÖX¹ ‡û¡n©•djEx,3(Šüd+Öu¥HtV=¶zN§L“ešnDâŒ{™âƒªÂåɵc X’XŠ-Í õyÔ7kœØ±+¶ÍÅQËêÁº‚â噽ð $Š’ÄqB×WƒDeå'ª¬âd^í²5TN'ÉhڪƋ#,°8µ®òcQ*Xðqʨ%9„ø™Õö§†‹7…³š<Ó©éתËïìÜP|›­ôLY§a(u­«l1ÉpK<7ìÙ©©*±æ®>T–#©¨‹åÍ…U­ÈK“Ÿé‘YÙ¤5©A q–P­-hY‘ÚŠ³2ZåxÌò\]]=Žé\¦š-͈}êô¿QohF¸pwÍ(îü†¢® {ö—‰(iµ×i½2Í/S¨Ð&ÍSÔ14ꩲ­"™°ÒiÐã¨Bª*M¡Í·{CݵÙíT†²7ñЮ~Ò³+WÍ$Ìö-Ø‚YwoïWW7ï¯?¾¦ÍqðŽéŠZú)Áƒò,q! MÀ"ö¾ª[ëÍ1Û@T‰(c­t0ãée<Þ$/™ÆÕjï*qg„ƒÁC7¨]+t{uñîN¡M¥È²ÒCÖUÉcºÂ­îF!hL1D·P~±z£"z!IÛÓ­’‰û?‡ckŠ>™ý½«ÙæHq9Eõ/sR¿G˜º(3¼Ž:aÏT´TV®Áóßïáü6PX®÷\¼8¬DòÅn2–§ëv"ÊÎmůļ_³¯ŽùFÔ¦p…†íƒ þíÈU8¶c^Ž;§žöº¹cý®EZgkXž(VUjF´Z\X\¯&Šq÷n¶\v8æoæ· ã[ Ò‹7Ь›„ÝÇæ¡Ë+‚mö%Õ2²’‰7„‡.¾<ìØZÉ}Úô¬<®»rù¥1ßt¥Ûm¶Îä[‹`aèDZ¤R éõA¶u±ÊÖ¬ëûwóÛÅ宿— 0ªÑjÊ–f"Hv"t„¾I·Y™7` S32´ÉF̺=³¬ÐSõöÈ—NÀ”"INþšÖ‘ T²s«˜d0NCŒ—òsVï$’Sºƒ„2!,òooF¿ù{Ø×L©-ˆ×¶ïQ61`Å#†‰üža®nîñ­&˜ÊQ@¤$™¢¢@‘Y;Ñ=‡ºúµZÀ6¯½!!ãPeâøéÉP_åCœbPr$ù°¦Év%¿ÎX Íº* ’ΚªœX|%>gŽFæJ2·•ØÀñ  Lq 6&Q8}nã†ý.÷Œ;’HÿçÏ‹BŸ8„UðBH ÁåÛÙíÇW˯'š÷—Ù­bÃ0ZÒ0¨Åí®2c2<#PF!ø˜m0Œšj7OÌÈÊS¿ëˆy|¯gžvÏð%™Ô ÅǾ‘ôfKÎ(ˆ½ê¢Þœa¶Ù¨Aê™—¿³uªd·J˜–›È+9Vb!Fòg§Grj—–i-\,ôÌ«^¨ŸÅ•å„ É‡#:b® è™ µ93†zWñW¢”#]]äi¹ÃÍDŒ'TÇR£ÌAWI¤!óÔ#å…R0™Ñi²5æÆìkÓ ¨‹0„­÷æÒúG¹tX¹G¬F=«F?c>Â)zBf‚ªÄ×DúÛâ<+2ñ^"‡¢ €°&+YÍÌŠC±W}ÛA.­mÍÈ é cJµw¤àVÓ¦¡Fê–n8][,èKUdÇÆ‡. 'Žúþ$¨CêÎpVš½ z‹WoB¿dpe;µôÕ‘˜²P7Xdž#aƯ:úÊ©ªg& s¢âª³°¡!Æì9íÇw2Îá¾È¨A€\ʼn0|"Õ4⪡Þd0SŒ<ÄÔd‚ÞID¦ymÍ&«"FÓÔ\ÓäCÚ’k#^ï«lÝ]àˆ%“a*câ˜WÆK2ðÐ#WxJdWíÝȹ8iZ­$Æòæú yfâÊf†èÔЧB3h¯» ÄS@€õc‰üÒ04Tèô“€é]õó$=ÇÓnͳ_éŽàƒ(qIJˆ.©Õ³ë© ÇãÒaÈäÇe"ºvuuï´IÿÝÄÆ–×|ÊmnÏϬþ9k~†ÈñäC/7ÛöWÊT\],¸@€#@¹.ª»´ûñLüù .ØZÜYüÜó ×R¯â#ßÅý©íN]Çw¼ø¹2pØïB_ÏÐu;¾ùó'ëÙíUù¹xª ®AÏø,k-‚'0"¹® G=Ѳ­Ìñ=Ÿ¼uµáÞ8ZÐ…¡Ó[è/é ßY]Q×{˜Ñr¿¸²5”ÙˆdØA…)RFH„êÝC6눉 y(Ñ}Xæ9ÉÐMÓKžFŠí ½t^F¼Ôd‘²ÒÐX.òz–SELFÝl…°:Bzp± i]‹’0i%„d¤‰bà1BšÞ÷‡BešY=ü œ®Ñc°¡ùðò¥f;òÓˆIâ g27ÿH BXa Y=èº ùÌ åÖ#êëT¤$_]˨¿|L ŒYi#« ƒ‰>@ÈÎLÍŒ©t^Aåê8bšiÔ3 eœÈ(%¤Ë¼(¼ñ.ÏI‘iESQ÷Ö `'—Dº4ÅFÊ%àöö'Á\"ȾEPZ%)Ì&=&?z“‘Õ'ýpJ;ëGRAN=™gàåÅü]}DÖ×äþ3N'J¢I¤‡‘€¡ÒB±×]ÕybBJ¥'jÀOÈ‘²'¡Åb_Å“×Ðv‘ÛÐÏä·ˆÿ­˜7u/yö}|ØkH7å×b¥²K¨ËÕ«ø°¸~Óí£Ò ލµ8ô ¤Äíi8AÂ=aÊ$%½ÐÖi§Ø§Å¨TùyfLQw"É?zÙæB­½HÍ4b48†]£©cò7®Ý±ÀõX§º\ÅÆÍ:–ƈ¥}啇÷ªŠ´ÍŠ” 9|LÑQKÓ¯‚t²‘Äl›O±øRÚ¦Œ$ »Äêf#ÇwþŽù_2§X endstream endobj 49 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 50 0 R >> endobj 51 0 obj 3451 endobj 53 0 obj << /Length 54 0 R /Filter /FlateDecode >> stream xœÍZYsÜF~ׯ`åI®Ó¼—­’,%Vbˉ4Ù¬7JmqfZ3LxLHޤÙ_¿èØ £òSvÃøÐ@£æüyæZüóVþ§žµ.Ïþ$žkÅžåGÄ #ËíÈI¬Ò"„‰UÈŽRv!ÒW\ê`gýrV9Öwg¿þ6–c‡Öó™3™§¹?û #Û’4MIVÏv“D.áÛëÒzwSzÖU­z÷Òˉœÿ¹ô\"ßõþ$r¬íÙåòìÝ·¡å:ÖòѸ@‚bøã»Vbû^*ÿxÖ²´~=¿ÿé£õ1«¶‡l+Þüf-¿?»^ÒöÔXå@üÛÊ‹ aà [˜‡i¾áÂí#8¶Â>dSAF¥¿eCO†JIø÷I¥ÐTlðØDJ[åâ§­ûÀ±“\—é~èX±Ê&V”kŸÞŒ3q¨Ï q3º“;íµÜ ë ´%Y盬]^rVwÜ‹–á«‹åõ‚áåͧk³j3j¼_^|ú‘èê­èv¢a¬ç¼Ûñ;‘óæ_n–N/ù¯Ï·>eMžuy]q©³FLuá9#edOY^d«BØÖÈ6ÈamDÌÖÊ+€yk­wÙ¾áëÊÚÕÏVW[‡VÈžòÿRWöh!Ç žº¡ã¸Qòši&ÝÈ6ßó›ÛåõÝ?.>j†\Kƒ¼Õä“hŽìëgÑ< ÍxÞ‰J|cæcVÁ®dle¢p'Ñ¢´¶†Ëç”d"klm.ÓBƒÕ¡cM5#µ‡ý¾n:µ-?•ÃÊ,¯Š£†+C~³Ê·äM]}£ì0[e­ÐŒöØv¢T{DÆmÝ™Ön—u<ªuï}3ÍÙfÖ9š^ucd®«nÇÆ×\°^õÈxÊŠƒ0]gÝ<Š@KAšÆI„Zªj%Oè¼YúQ0ÓT{Xµ]ÞpŸŠõˆ2*iæ›Ôaktý²oDÛö:¡Ù×;³¨á£ôï¾MÇñÍKà°&©ãÄa<ÝуÒ̺–ŽžÄvl¿ÕT¬©«‹/o4ú»¦Þÿ|ww}»ü· m½“ 0NFË‚º­zÉåI¢PWñ6QG-ï,8û¶ae̼PÑÂr°ž¨:«wk ¶h-9«4‘žyQÒÔNeá†þkeÒ"JìÃUvþyùáúÎÀ>  Âs‹4Ú@ÛÕ ¤(†Q?ú{ˆ ¬eõ»XwsÃúëC3ékR Y³Å¸@BˆñEþÖtZ2ñ«S eû}‘¯ÕÁ˜Õfª=×uGê“{WÖ+-ðÙËŸ/ñZ€[‚"ÆÔT®/“hé5aôš­¦ýÐX>¤(ÖùÅÝÝÅÈT(浚N¤é>Šéa¦›xY‹}§¡ÜŒžA]âH÷^¦°Oˆ%• 1(ÍÙAv¢0 (S!YвnŽ3º ‘nðýÛ…]мÚj´oê5Ä87šuÓi[‘òºuc&ÂȈtñ¤,œæQk}¡G%ð+ ²U}0“f¬S}h)[R vPP6‡!•Æg4Æ# áp/”z­ê¦Ì ƒë½hLŠ„¼þºG´ÉÛ? ’^´aäìx²‘÷-Æí^¬åùŒb¯]öA9(ÞŸfeʘ´eV …Cu3‚¥#½À,*  ¯YpXjŠkP3¦™cœºvË`àQ²øŽB#«6™¡òñlÏ~1p‡#h¤?hd€síaÝU^äÝѰËz#Ø0ðóõÎ@)í³}V† Oª²’ÏC9H?MÃzê,P¡“¥Öù ‚wW—ŸîÙ”55N;drí–­eÀÁÅüÐNu±€ k²ª-²A‡¼ÂU¨nÁº¨Á;à Sè`î¬áÓSNBüxÉÊ}!N¬Ô+ÑòúŸË…<ã$ªéOÇXÓ{å†#EýX·Ý¶r$D+¦¼làÀ Gù ¹¬ƒ§ã¦‘k5[Èd ÊMF¥¢Vó½ÀqB—n¶+º—ê~Fù¬D?ëv¾èô¢ÄŽ`"7ˆÂɱ€‚&ÜOÈÀû iT4Ñt=!ڈǼRjE¬´Š$Ìþ6õwùùóÇë‹[Ózys{q÷Ŭ^™9ñΛ[Î ¨¡Œ”À3©¤]š©I!YjÜXnUê¥wMÛ‚[)+ÚÚÒ’]ªºzÛöÞ‹—¯r@˜¯œ>÷‘uª¥®>ÏšÈá; ¤¤I§æ•IžÚP Oµ™¢3C¶CÛâh8R€=SÙ†uQP §©Ùh¼˜¨M^ùÚp ‡?” ÓK’Cî™ ]±yM´Bh®Sd<ôEG?˜µµ‹j=b¾Œ4¸•<uÓªZ" 孼˞„lSÈÐIÂëL‰€t… ïT‹`]W›”­™¦6äN f× €Š¡3ChÇ2Ç‚l·˜S£R%‚:ÄL‰Ùÿt]´”ÙÖM7Õž´§üFøxšúúJAïw¢7›\#u}" .±mðæÔ“ãBµß±ùðÓ,ê#m‚ µ™1ï?\¿ÿáÕY•Ó<µ|_0M¨*\[ùª­± ®S ùÉHC2 YAyø"³¥¼ƒc2@î ãÿ¡•y®4Âû‹û¥ìC…õÂ’O% X Wã«rT¥™%;t v—Ëjó84"Çöœ4M!z±ËA¾¥òÑ’ÂFt‡UÙ³ðÊî½/"‚\£að6ßwT¨’ûm“•êìéž\ l \{(:ÆÀ`Bªôõ¡£Êx Aî0³äLŠ"s‹C™Ô/ ÑØiT žDÞºŽ*Cë'ÍQo¶ÁqŒuXM£!a€Šic8û&ç ’ÑMŠá«÷Ϻ•Ú °FÊ–hO'†õw¢œÉýGU?WS&ÁH‡Ùc'úšÃíw¨ÝÅcQÀJ×zˆõ6mÃ[ö%áÂðj¸Ø”†ÔZ7¬¼54˜xFذ©Hý}éÖ|drâ}¡÷)Ãî|O˜~ª¸4)ŽYHS~Nç­¡•9¬­Z‡ dQ-†€_-ĪC÷w‹î-kÑîhÖrÇÚYQ“Êp+˜dT¬#XCͽe]õCwÀòy!+š?²“Œ´¦î­ººVS?/ˆÓZª N+_†2‹4 Æ‘—(K=(‹S*H÷ÃÌÇ‚ÔNS¨XC·ÿ2X£¼‘41(Eó§fäôµœ²zÆdk2r/‹Â…¢÷uq÷P|.4“ã#æÇ£lÍZÈ`‘ñÍɈ¬Ùúc±c:éˆÊª(pG*RÏà²XÚ ¥ºÛÁ\õ,ùd>£iy1Ç`ã$¦Ï¿ÓøžzL7äà¤# ÏÒƒ“Ž,¼ªçæúþêò½A?ÒÐûé ˜Á²9óËóàŽ*A=ö騶 &Wµ9ÑSW½(ËãT}q8RŸßçï`z™ˆÞ©sp/:UV¾³ H6l!˜ _»å˾ÃÑhêÃv§ŽôØÕ5×DMvÿPåm4*JC({RÏwœÀ¥òëü­Œœ%a³ål k¤,[ÞÜ~¹¹UÉ·¦ûO?8òóÇw×w†qyóÝ ÃíÏŸ®ïnÞkL%¨¢¯®ßß|RŸN?¨c‹O†Ô[Sˆ¬øŽ‡x_C^ª2!ê‰eª¢©°ŽØ ±˜¾=„~÷‹‰5>T¹aÿ®D‰‡ÂK™Qj´®ˆuûšòÅ“ ðÜüI¬'eŠ>ù™G>³¹I¦‹‚éVÇNœ4Ÿ|Hyeìâ+–÷ä'á<Çó½™)Ú¨ñôú᫃¿jý0„4rÖ*§—ýÙ1_µ^œØQ;®—Ω¬¨«íÉuåãÂ+c¿fy߉íÄõ!ûÑÌ—ùö ]þ´Ñ«32î §Jb;ŒäGonO_!P¼:ƒ‘A¾ÜLÏ#¸Ðpûù… û•¡û|Z¦ORÞ ¾ëqø¬g9´ÎØsá(Ó„¬̈¥ñ! g}kä2ß<ÞØ†½äÑõ6aø**òÆGDí0Œû¯%’ú9ÏÕeÄK'ª>3 uD ÍCº$)MR$=Ã-z†þê4£žžôúô¬ñú*ì}:ì$r]Œ„±ÖÊH&©ž©6â`¤M¾–7e_x¼ôP¿ŠxÉËCi¦P’­ Ê ÕxP?WÖD>ƒ`ÅV¡Ï|„rÖ+3äc>è¥ËoPøxì¡ùàä ðgv‹Ù¡†ú¨õô7LNä0Ì ÔWËV“o]/Ñ@YÉ¿¹^lk„æDz¥29¤y½„¥d²dðì9”}hŒ–D‘9™GW423«-¦JIÇÑ î9¹\Ø–4G$ÁÂꓳOã0û«†HÞ¾>donÓË“ 'QÀü EÑà'KˆLºDŒÇ&cõRÀ‚2ÛÓ;wÄ~–„ô+W¨c!UŠÓüaÞ.³ngÍm–¾:× 5ÐùC@/Ñ„žæjÛRúáÄêç0*ôÕ×âC¹Âp†Xù#’›|›ã:ßTšdß}GèçÚÐt£!B m®³ÂR}ïŒ]h~³† r,•Í—–¯k3ùq$?” T…ÕnEõÿÁý\÷¿â! endstream endobj 52 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 53 0 R >> endobj 54 0 obj 3496 endobj 56 0 obj << /Length 57 0 R /Filter /FlateDecode >> stream xœÍksÜ6î»?ÆsE¤Þí''¶[wœdowuçF»Ëõª§•Ik×÷ë$øÒk½szç$c$A€b¾žQâß·âW’1²ÞŸ}U4JF‚X‘¢˜ÐÄ‹ý”ì‰BÒ(%¥èØE’ªz#²#¿œUg>ùîì·ß¡Ó†ø^DžÏüsdswö#b/ˆÓ,Ë”®Ì£i*D^ ÀzOÞÝ칬eo­½`äÿϵw5 (û?ÐÈ'gï—gï®#B}²ÜZÈ"0¬?%©°Lü0²Ü“ßÞÜýxKnóêá?ðóßÉò‡³«¥šž+ˆÁßÄ“^ÔkˆB¿ßâx˜¡[*ü ½i@ñXóM¥ZTõ[4h0’FÂß³FQ¬œÁÃ%’Öú+…ϯFÅK{«@™cû¾cýÅ&­¢=?äP79'°•yóýË#oÀÁ†òåêÂÁ®o?_,-zùù§÷·WÍn`þõP<å%¯:Û\m,\–ÞçÜ6uµÑÄ﮳á$ŸyafYöÎgSV%×cG‚t~¬]X£ü?åžÁ–;ÞÚiv`°vÒ¾-*¾A5ë3 rõBº'b[ßu`£¼Ù¼%`”¦þ³Øç'ÕaÏ›bM¤4€ dUto¾.Ú¢®H½%Â¢Ô u*Z‡¢[ëtEÜ%Ò8FÇsò–ù¾G…êk[:+ÉÒp95Ö®a±4²È§Ÿ>^}¹ù0;øòêÃÍÇ‹[‡¢íªñuîŠ^õ$=v Lÿ¥7i}Ï!]׃ñ?óýcÉ#ÛDáÀ6J¹û7Ô_°ûsÉ#–~ËóªuÐVë°·„®î”% ‹¸âÅ•…$¼)`¡,^80¸¯µÙÿŽ7Üië!åsþâ0aó²òmçªÕí6®'HÂc]TÝØhq<0Úó®î†^B\J"UÛ19M†ˆ>Ý®>tÏmG£âR;Ï èÕ÷÷‹¦Ê5@P†6ƒ¡¿)ye[[>Ü‘.}laÛ%‹jd¤$©ÛÉuNQ`Ë):™ÅCU72LJ=A‚¸b©R)?”fôpÒ©™³„ >ŒÄZÜ5©5àç#\íf*ªÜ`d˜Ìæü‡W¤ª;¢Œ n:RØ»£Ñâ­Ä"W¢8üSÝño@hz1ys³5`n MÞå«\r$ìòÖÀ+Î+ƒ´¼3°<šÄå°-¯ â)e±GFTx´º³#ï®–¾¼X^¼¿¸»²?ÞZøæ¶áúâÖé¶®÷{0úx“R ÕíäDƒÄ Ñ8©É " èp6H’k Üˆ«™!RÕtM¢ÄI¿@XˆIgTš4Î?Û1o‡’ELñ"®x¦é¦rTh0@(Í!½ÉÅ\&¬Ä`Ò‚0EëÀ.U´ Ú òt†‘ŒS,Aåf¾ŸD‰N²:þЀ*Kq²Í&'¢\ȼ$„S* 2'?{Ë™Vý –l…!Û…¥.o>ýýæÓÒ¡Üž·}`Wß]}q(ïo¾ëwqÏéÀ=o$âžÒ’pï„f=À‚îÙ˜³ãþ|lùŒf,޲íAœè0‚7ë”;<‡¤nA„FàWbÿ’*ošú¹¨H—ÿ Ò…Ç2_óq€`PFYäû”éŒ^æžw¹»º½ú°´xÛÁÚï1‰U¤†oyÓ:ãk çÎÈB¤_×åa_Y\%#ÞªµtÊžVÕŒŽ ïÛˆ»UaE;3¬ßm]7àGuµ曜 Œ›’ESªyÁt„4¥›”QBôä<"0•v}cŠ'ßËBJQÓd ‹BHõIópÒXyA–@¸"a"VÑc¢"†f` 5Ï[ …ƒd>ÅN{ÆYŸT ’˨$}ƦÜò"Ÿf1V]JFæÑp ÃôÕÈH¸éSÏÏâ,´>10ïNWH°dbØ@NO'Û°'8#·«°ÈH#—pЉ *Zª!iu†²µ6î‚ ×g¨Ý«Ê ­£HCã˜9#é ³0ñüœ$Ý·Güƒt)QÕs!«é·aàF嘭¤#æÁ4a[A¯1ç/¼…¤ïŽw³úPæ—ø0¿˜M0ÐòŸu­"—$¨¢’€± tØMÛiÄQa¨;:;á:,„”‡M)÷‡(ìK8[TìD—pºB*ĎİœžN¶Aº^Wa‘‘F.áAÿ,P"´TCê…Ý mÜ®ÏP»SÂnÏ:Š44Α°@—Äà±™Og#%ù¡N´섈‘ă}ô"f@½Ì ™ˆÎîÈ0ðR˜~–Òp‚å‰{“2¨ |a¤,šàb´PåÑqhKä‡pÐet‚Ùûâá“ðYu˜”ƒQá)/\–ˆ?ðJTRÜ*‰¥‚Ži[¼4@ G ªb µ™ÁuÍ)‘ǦÞ׺䔔­Ì—{gí¦’ÔÎïþ4œ”9—8ÏÄź]Þ9˜Nœ#¼ µªéµ…ç—*$K¡È¡Ñ„†§,Up”ƒÕWí¡Q·§j>Îdæ¿îưhá D»ñÓº=a®A&ndàô ƒtBS½{gg²ôØxg¦BwðÂvìQ6%Vivq|<,³$˜)ö³Jÿóç‹ÛŸ®fµÎB{⎙ŒËÒ … Õ~šøö“$šêu¼F‘ÐêP”Ý[ùiBâòZI#µ!«õ`[üÛÀ˜_IÞ¢ªÞóM‘wÜ¥É …ã±­rn •võ¡Ühl½ãëivùØLY00NNØ@DNPÑ>ó¹on@M)BñHÌ ¹/ €·¡Á£€ÉùÅЮšvuÝr§É‚âûÏc£–è•™°(ðìC¹1¡Éï~…Ÿû7G6]à'À*¤äè\ö¼ÛÕVû„`Ñ`B!¯â¾(Á㪼+žxù²0dp‹ñÇ)ÈCúÂÕÇŸ4Wxi.…(OGdþàÎ0/ñajcî`œÏ«? $5¥Ñ1&V 4Т§££þ:ÇrfBsXêÆú„¹AUâ%„0¢zÙ¬ä“üü4¿ü¡È¾Ä^H’£óSEνA{,}ê'á„ C?‹Èst1Âè(«EÝ©¯BHNûKˆô¯K㉡×½%†ñ&L,æÄ§×‚Ü4 qà/葹¯‹˜ã ‘þP1¢Þ-°"ÈÃ"’–ê#Q¤¿aGê^2r/!ûlÕo盈Ô/\+­ ~'‰ô]¡¶¦±Ϥ˛Þõäkžµø€ù\ùø“8ußZ¼id&Cݳ–NT’XG^%j·• ,LD¡â@ÀbDBÞ¼36§‰ÛqÞ©aLŠú‚ec™ã9ëägâKOýÑÖ#‰¦+N”£ÀŠå^³ËÃ_ž§z™ ˜C3Q_ <?ä¤Ý‹d\¦ ®ž†^ÆBŸRÝèkëDÍÒˆ¾go–˜;½ ¼ ±„²€E}]`概íg#ÍÊiì}‘”CUÂnrXubÓc‰njî4Š/”Ùâ§Å8Ú«½ [ã3ÂNžÃØÂKûÆ‹Hq¯¾Ö,Ȇ?r¼æW¡if¹"šz àI)¯¹4#A‰8•)Veaï¢l¨~Û™~ò \µÁužh·‡à)ŒD!æH-Z—‘­]T«£{nÁ.ß°Øü¹•@ù/¾RG1°ÕëÙb(*ÿy3zV/®-Æ‹ø> /µßPJñõ’Aä*}cÐÙÉ&™‹z(†Ìx,âµÛRÊè±á‹×åã-I†·æcÇoX tk„ã¸WôˆEñ)>;‰5ñ:¥jgG9xFõë¸>L\׋Š%LÓ nÆ ½“2þ8>ÆÌh£3«t\Â+«´x9b­žxXÅF®j+†Ä>…@ØÔŸˆÊ'8Š,Í y;9ÚÙý;ƒá^¹£D^Ç3põ2#@˜ºp4{Ë3ØC¾m2ˆCßpQ‡UÑvÅZ¼`- FÚF‡ò¯Þ@9%Ž!EÉ×ݎŦ~n‰ÉŠŽ¼TˆÇ ¤€Ï"-#ŸÔ“Ãמ+D$ÚÕJ{ÏÒXäßêG¤íòH´¯âWçzk)êI‰Âr : 8]ñ2ç8U­ŽçelF FïøË ãç¦è:^Íê;NjcêLù|]qñtm¹;´ó÷TqèQK`çNpñ=6ÿIˆ)’¹5œ¤Å†‹¤0×ɦ D¾k› IAèùâ­:Mƒi¥®æs^3òñò+JNÒ Ïd0qÀ¼@<áI£~q¨¥° ó¸VÓô#[‹M»0˜~˜~,ˆÞM£'éшÞëËjÜ/U]½ìëC+_A"_;¡ÿæMg™n§ïU~ŠAõT—O…>]{„áÀ›b»Sâ.k¥î´Aæ ǃÉ6Z “³‰n6‹C3„ÑDžC°» öêquà ²rÄ€o<ñFmk¥F=”dqÜÕ½ÿ3ñbßÁ endstream endobj 55 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 56 0 R >> endobj 57 0 obj 3609 endobj 59 0 obj << /Length 60 0 R /Filter /FlateDecode >> stream xœÍZmsã¶þî_¾Ææñ]dæš;'_•:rbëríœo2”ÛLø¢#)ûÜ^ÿ{ØÅ EJîôCÚ´‰÷Y»‹Åb±ôùÈc.üïTü™¤>[•GŸ‰ç±‰Ï‚˜XQ̼‰» +$JX!öHÑ„È@r©5‚öá¨:rÙ»£Ÿ Ñš¹NÄžŽÜpssô3(b'ˆ“4MÉVßñ’D¨œˆUÉ^ÏJŸ½­eke½äþÏ­·- <ÿÿÀ"—Ý/Ž^_DÌsÙâ΄@c]ø'ðXâ~*þñÙ¢do~¾d—Yu¿Íîù«OlñÃÑtAÓ}eùðÿ‰#£¨÷! Ýþ+Â4ßpáßÐ Ç`âSA“JÅEFÒIøw¯SH”ÕywФ·þHåûgcÇIz³à–ïûõ»l0‹B÷þÁ¸ƒ€êø3{ÅNÃÐIÙqÖp–ü¹®ÖCSЯ/Ò]‰ï$Iìº^””½­·Ë‚;?Îæ¿þrvù~*ÄyîÄ™°ãS‹VÍÎþ†Í”®Áp|X*nè¦Iä —Š±µÃƒ/êÆþ%+7?1œ3CþÉçã-^¿Øâ»ÅšßÝ1›w+‡=åEÁÞm›ŠeìíÕûóË){ÌŠ-gùã9LEÃÎŒãœå­nâ ćž3IR˜0FñW¢ëSÞÊ‹%üôÀ+EWµ¢H'!TM€ÉÛ®ÕýÁ ¢2ÝyúýìdzK¥»%5ÿãôzöý¨XQ›¬é´ÌʨÝ4¼móºÒª1"‘|Þhº¾³ \;.©ÛB(<…ÉÉ¢ÍHˆ¡ƒ4Æ1œ›¼Ì‹ÌjÒՖܪã÷MVŽ¿ô$1h.Tg\pv­”ƒ$:³:7(ƒo÷_Û˜Yì áÀ{q´ã½U]lË ÇC¶ÒVK f˜àCÖZ kCßåyµGZ—5÷Üj8Ð]«è6¬ÌÆ›†æõXÆàbãkǰvƒ’g•3C¶eV–¡!×ù½=°oÔw÷N&;îU(ã{ƒYr¦§<˜1tƒx¸†—³ùBäø3}7½>aËmPó$ØC˜4«⪺&4uü*HªÒ†•¾LΙ¦ÌÚ@ŒÑ¬anÈ"7ß¹Œ:d-Ÿÿ‰r²HšY<È91H† Ò¸Ròê^sÚUVð1Ãìní¶4ŠïÆ›9­Õjà:Ïóú¾£5‘áûTš7eëhH.¦o¸'#À-éuþ˜¯ùúÄn©i b:¨XEJ'\‰d8 )o!º=®¶å’7šÙu¢ÃÛèéêqÃòû‡n¬»ÝhÍWy)§ñ¦†¿}5t°ôÌ?o1¥±œ®Ú¢1w (Dîh Æü9ÒPOòK q:PóIxa·„Œ¼ÊUJFÖ]mÙ²¬åD(…Þd´¶ŒÈ-ì[m‹¬Ã޼Ûãm ~(ž­.ÕªáYË×c^ ¢0…LRõ“ø/ÛÔ` ù3 ©v˜! u&îÎ(PK8Þ0ub-,¿U‡FÞ’wOœ¬ë „™,4é“Έå؉,7uÓeU§9´c’Ë„GåpdtÙïÜÈÙÙJV„± DÚª‘±·Ò ý1GÀaÁ}8îÞ¢:ÅÉN§[5èÛWb#qˆÀÈn Þ_rN qâü1 i¯-žëêjt‹]äeC<¨&^¦q’ŽY®™JçL÷»ÇK}ºn6é–bè¿r™? á,Z‚Ô÷YtàÔ‘êëõ Áֶ笰$ŽYì'†IÁ0\v‰»£Œö܆‹¢Ãº€ð]Á†ß€æ’wùj¸v}×w¼8÷ r==»”Ú½$ê/.¯ÎÆÅ©^¹Š¡÷}ÝO‘ ……Ú®n¸-‹=”_ ­3¨A³¶'ÌÖ³wv7p\ß7(“‘ñþ–=fN‡BOš{g"ùË”zù_u¸ëfI?+†þ÷Â9–¡0ôE)²z°`f›gsûM ¢oNgÕ]^åݳ݄fƒPÑÖ¶&3cÛíF$\*‹‰ ©¾µEÌ_aÍMhÉ{—eÞu=•mŠD*†N„ï;NÌeIîy‘Øü~x{þ½÷çðÀI“PìƒñˆÌŸ`]ûÖ7ì¶%,¯ýY+Œ@ÄK#‚,S`U>ÔëÖâ(—¢éB¤Ž%‹Ì óãÔ‰„ )¤Ñ¡A×rg¿áûG@¡u@€eC/ö‘5³m¬›5^„i¾i¸²ê0XeÈáŒÉŽ KŒòÄõâ?xS[‹6vÆòuÜZ •„$w¬µjîíö·Pwä´F‘ƒe·Q • j,`Ö)n^Ä~®·¶bØ:еÍÀ£/!*%Ú4b#鞇n‹Ü·=´Ÿ‹õÒYËÔ÷k…k•έ¡ï Spoo¦ ßž-ÎÎÏn¦†C^£ÏÚãˆçgs.Î.o`×v ‡Še: Hà 6“…xe[¼´Â49äë¡b‘º#¼'”N¸kjqÚƒƒxl®=Þ¿«„ŽïŠ‹y/‘øòŠJ’Cý- ÔýGl_!j ÂÉ)c«xó¥`[[ ¨å)X³í ~¶à*³µ.ûJ©ºÐ×#’}¡îRP/ïèÌ=n¹}×…Qºïu¶+K´¾‹éØ¥¸…ß«SÎXrž„#ÒÀ’D]N bU ûyœ$iñˆ°á¢¨³î  ~xP™ O:‚ضxÊOôŽ˜X×¥½¦òp?MT©Ð]lbßãJæ¶«K¨6Wâ¤8R¦`¤¡IÂ!5ÝÉ)‚²ÈqaûôB¨÷e¯7Õ¶äM¾’÷Uß±o¿ý3{ƒ%iÿÃWö&Û@Òú‡þŽ÷?ì õG¡¸%÷)‡‘ÌW,rÙ±êŒå#-Ô#e.žúHßüNI‘U©Žoô‰ý»Ý.«º,3ÝN^(ôih9dßËÕmˆ×S*Ñ'E|UÄ?aÎÄýÀWä¿ñQjx#ªúÜ馇èõÇèí$ä²ÑA’ÊO0Ûújò«º™D þ{>{ÄPj:®ëClytÚ‹ðx(’¾5ùëé—ˆ@ÒêTƒè£¦tHdÂ?öyj G{Œø'wFò•‰#ŒVçO×0½7³«ùÈûÍÄ c7…\’,‹äòÚVt,¯Hy3\?!¬ŸN1^Ò±QÍé!¯/& î­øPÜÿ1ÌuD©ë¼® {ÇàÎ2„%Hš‚1öÑi”°ãó««Ë)–ªMЫºº«›²ÕßjM™þT{H²ƒr:kÖ Sq-H½µ#"L•!ÐþÀ÷0‚á‹ ú‘1]x­ ÂøPß“—•G¾xît] C²®Ú¯=9ØyÄ_ûMpŽCùHˆz?ÿëüêÃ|¯%aêî(ýâýeøzçz;íe´@½Oï ôF"ªk8}ç°‘â³ÇpègK VUŒÀæ—à‡ŽQq ^óÃpD÷üýåå{¢àP_&®€eî¶È¡ÛDÀK~âÉ¡îè„a‰O¡_ê÷VªO?h8?U•òŠú^f`Dø¼"ɶwP%7œ2o·Û®®e1é[/òþîƒ<2¾hj6×äí±gZø†3"U×µ¥¼ª;MÓãºVcG¾hï궆%tŒøMÜ%D°¾ƒØ”P¯XˆOÚ Ìëm«àºâÍ£5’ˆn §hÎùl¡é§ÌtjspÕ³†™Q¡oµÃ×’…ÉÖÑ ËL²JcHãFäFvfYSÝüt)Ÿ<‘eÓe¶q“l-¡‘—¸j—RËÕ“dü&Jb'™@Š ÂÐß81§T¢ÍV ,HÓ5˜Æ´A!€ʸ¾×š4[âŒ~Ü€ˆŽ¡$è!k ª•w%¤´Õ½±©{È:[o+~ˆ¡2‚$Ç c4MvœSä Žú2ëÊw£s¾Ê¶xô·ß¼ð›Ù¨cõ«¾QÅxmUÀ1ã‘ã{”dUüÉt«G¥« 9ÑœŽóô‹ ‰íazY«×ÛUg4‹““òç=c[ˆáoĽzÞ1÷êýÃa"cÁâkêGÐóÆ»ÌÁ›Ï'L­_|Rk™Hƒô€¯c¥÷$t˜KâÀw‚ €ÔP™õ‹®O‘‚ð~K’¸,‘¦Ý{Àÿåìúï³ù;µ+$¢w`¯î-èiŠ.üi˜aË!Ñ. ¯ &× cf즙Gyø+‰D'Z$áh}2ÚÞü†¼1ô }ZëTi¢Zà …J@ÿrLﲘrz?±ü7–< endstream endobj 58 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 59 0 R >> endobj 60 0 obj 3247 endobj 62 0 obj << /Length 63 0 R /Filter /FlateDecode >> stream xœÍZësÛ6ÿ®¿ßιq‚ovr™qRÇMcÇS[m§g:´DI¸R¤BRNuuþ÷[`ñâCiî>ô.iÆû[ûÂb ûqƈŸŠIæ“ÅvöQñI|ÄŠÅ„%4öR²% ¤QJJ1±GŠ)Š $WÍF°!?Ϫ™G.fï?À¤%ñhD>ͼ‘ps;û”G1 â4Ë2e«OYš Xlɳ7[Ÿ|[ËÙÚz!ÈûŸ[ïZ0ÿÿÀ"¬g/ç³g¯#Â<2_ÙÈ"¬FRø™øã“ù–¼?¹ýá’\æÕzŸ¯‹'ÈüûÙù\¹'×Êòá¿„Ê,ê D¡×q2Ìð-þ…4@p¨b¨T›ª~ŠMF2HøóhP”(gñp‹d´þJåÇw# €CÓÞ.°Ð‰}?±þâvQè>îŒ7J¨Ÿòr_´ä Rš’“zeÈù›w¿¼y7?5ŒÛ«³ËËÀùÅùÁyµ4ôË70l`wØ9jyeèû²ëê¡hºÂJéj+ðúúòüìµÚ­­ÝÆ yÄ­ÒM}ŠçÄ÷²š¢Ý—Ž>»¼='Rî)©Ó|âmA¸œ0¿ùñœ¢Ôg¯!WâAÀÔ&Iäy, Pþ«MÞä‹®hÈm×ðjMæ"4ZÂÄ–%M¼Ðóü E séíSßó„[¯¾;»9{5?¿9b:¼ŸÎn`C/î—YsyýÒzÇÌäÆÕÚõleÉAÎWöÂ8my-º?ÐHG;”Fÿ…sÒÙ8¥Lú%8–¡ÜBЋ².Ïn.Î-¼~ùýù«¹³EЪº:l[ËYÕ†Ö™XüàFG /ÛÚ‘¾ßíê¦kG>gÉÀçËëwŽ£)ƒÂp’·mIe³e(“()ÔräARô¤îèÙ·òx*ô‰w›zßMšQÕºÛœZ«úÂL‹ëÕ( ÌËañ•XAvh ‘ÎÛ–¯«bI-ë—zoÚ¢³`à<2e Rô6ßMˆ³sj¡‹3Ï }гáAàåžÇTñ±»íÇ’–uµ~È›_yûkYß-¡Ï¾$ɉD]UÅ¢ãu5Ž7Èè/Û55$sw L£Ûó9ùöl~öò Š£¼—`ôÈ›["*‰(Œ¤íò®ØUGÇçš…!M2&.: ªÐÇåo²hÇ¢&,‹U.J±Æn!Aî ÒÜ.ü±â‹zYœ†¨Ûœ„Âpò²4ô®†¬¹/‹/)’õÊjPM,¶ML’M±ƒö.cÃáƒkFk')y,†Ëg—À(ëÕ|Ûj«h[k™²d“?ðzߎìé,¶Ui·02cŒ2”Hæ†jŠm•WÝ”è²Xç‹ƒí¡…·2xeÈO¾Ø䯙 â¬Ô7Å8@I6Ð._.±2™Âd@»ËØË°Õ†\q™OmERìß{²–݆8×5J¶j8To‹ŽoQQ˜øŠ/0†Jú†—vŒ’ò¦aÐ"o]6ÅaZ'«ºò0ŽXÆ[òv™£ %Ä:†VÐYúS½/—Þ.Ý:U<%?ÔÜY¤J‚^+Vã˜rzqÙÕëB¸í˜ô³ÞɱÀ¦g†LÆ©iò´Ù¦hœÑªî&nŒÁÑÜ ¼¢`K±Ñ!ÒýÈr0`H/êr¿­ZËÀ^4{žCUr‡WŽtÁš?¸Z…ÓÔ¹;µkr^ª»rl+›gzÛ©S¢-®Z¾„bêx¤rIØ:Ž‹ñR÷‘Œé,ÉÞ1ëݦš;õ[2øÊÑ„½R ¤k€”å¸,g‡¥(Cuu­IÑm-Ûè’»9Á7nÈ ÕÈzª÷ÒŒXóÇ!ó‡õ_ïnº+ÔÛ't|à¾8ÔøëÍQΊQ7\P¦,è‘ )Ñ×µêýbQK­üNܸ#[mOˆÙïñõ׆å]¹#VK”ñÂltûîɸú±O³8̲ô¹O§ø½‡2ÔÃ~!2¯!„ÐcAöþª0ßò+2îñЬD¹68åGÙÐ8£P~,°UF =“){/µŒwuW¸ssG*ž"¤õ~Ã$ÄpÝ/Œ¥¹–,ófíŒ8A‘XúÑ2w$Ãg6!Ö›pjaU[ºøN¸…2',Äó´~À¨‘Ê¿q–,ó.¿‡žK-kîŽ4ô¥ö|-òÅfÖ4„µíjQR9lø® ®Ûð4„»y^(3PNËFvœîó¨ÁcšeÊÄ—Kå¥×}SûjBZ;€Èy×!£Ý ¾:¨ Š<ÝG%p^{GG-V×zG¿ºDHšQK¿ÆPNÈÔ¹¡†tn|…vy>ÇáóýAøð†Ï|sýAŒçØÏs;k_qé"¼Kò7/¶Cg…ܼ=5€y~x÷Äâ-\¦³¯ú³ øû@ˆUÞrÍGâ.¾JÜQ-võ¾…œÇ2±”rìíËà%è‹OÞ~2±ôùR…ïJ^4/Ž>zá~ù|÷ÂÄ}aÐ7ßüÃÐjø9œ<öÆ øl¨÷†z^«Î 4˜Êê³ö÷0ÎÎ`@^ç _o:¢D} äbMÔß%ϺÒ&Ò¤±Â” cãž©Š¡ÍQÃh‚ÞÂGõ³ÿy'VAŠ–~)kª]pyc…~:Pøˆ‡å3y{¥9fÈ×Çš"FægiêO¸¦„žï+õjâUW¬áä SÄ\},e©Ô7–@|Ð2¥BßLX[ª,VÈæ„xü$ù|0ôÞ 8åHó>hâÑ.ÿ3¥uõo¬±YBÃ4?"6QKPÐçØW¯²>ËÈOš¯öAbäÔa%A–„1ëíG/uF÷~É×¼{A)%ãÒïJÇÌc^Ž;…õòÿ þ]ŒÇÐ0Â$K£4tÂ;È.!ì[t ÄüÖüúÏ£YÈX"~+—%~BO Íz¢$£Išz~ éñ½_ädBà~¿š}œÉÏ5b’“¶$„zÛc•‚å *I_°ù…! ÕAx¿74:¢`¤C±ô/÷GÊõÜ8Lh–&øˆöŒÿAB¤?¡ÆèA›¤ùK†ApOÒŸhh²F֘ߩf$4ý(…ƒš¸ÕSdÌܔÓN5t (€Ib'Ëô:²"öbƒx?ÒõLõ°»jºh0Ýó2ÇÝ…¬ñÅ0-Žbµª¿°Ç›´(ˆ†Ëé÷vjvó¸×•@Ý•^®þ§†½+RE endstream endobj 61 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 62 0 R >> endobj 63 0 obj 2555 endobj 65 0 obj << /Length 66 0 R /Filter /FlateDecode >> stream xœÍZY“ÔF~Ÿ_QoÀFPéÁ1c{€€é]„CÝ­éÖ®ŽFRÏ06þï›U™uèè}ñ.ÆÑùeUåUYWŠÏ'œ¹ðß©ø‰S­«“ÏÄã,ö˜+ŒÈMXÅ$aÂJÑq@Š.Dú’K½ìد'õ‰Ë^œ|ø6ÌuBv{âN„£˜«“· <Œ?JÒ4%[=‡'‰Pá;ëŠ=~YyìÇFöVÖ AîÿÜzÛ"Ÿ{ÿ¹l{r¾±'Ì­Øë/Ùd…n×IÎcÑ5½0H¡±ÝžÈÝ%ˆ]áOÄÚœ]Ãà JA… ²‘âÜá vCÒ5¶9¡ËÓˆM£=#ÈÓ’pï°„WU£H¤¦ÑCäýªp8ÌIh¬–H)3òI—‹ŠÜ¾o*!w²¼Ñ¹’²d*.‹ÄN+—òäòÍëÿ<{÷ÃOgï0a?‡lŠFƒ|H™8ÄçEµwìªo‹zË–wû¼S#'™ ¶(7} _îröÚˆ{xþòõÙ»÷‹ Çb€uï_¾~aq²zc¸|snÁ^dwnm}ý@»Øª,ԃଵe¯ÐWÃèÐë‘:gh.º€A±#ŸŽB¡üHxà·Ä—gï^\øæüç‹–+·$èîꦾ«:ùnÚã¢íˆ¢°!*žYþIüàVÅ —]c™rØï›¶ï&Þ'|ä=ež6.vÖiJ䜂è™$õhGqÞ7E®³ZKÈ{EÎ*íEUÙ~ÊY(p[ô;Ýe—«ÌO§™Ÿú#‡»Ï¥S6õö&k+ºßÊfutÝp8ƒ'ãA­ç.¸ÖÔu¾î‹¦Ö¬}ÛÀ¼ôwš!£„$æ<ÒWKMÿx¶<;?»º0rZ‘¦@iüòÊj:×ôòÝ?Ìø®Ïú¼ÊëÞ™Ì>ç¡ã§nš&I0ØF qb>\Yˆõ:FHùŽàÐ僊Úêf ,ª¢ÌZøÍ,urz‰^ï²6[÷yû kƒa³ X×å7y›•†±:ej›y}¨åüYö»¬œÆî?Ã6 ¨l² Dü¡¥Ç´; Fû—Xß«¢gèU73=Açpœ¦Qâ¶iytYb ƒÚ|ßæL{gx™!¯‹/8[o‹M¿;EKþÈÖ;ƒº8‚óA =ˆ K×>Ûl†zKÔïyÛXqÞ•eeiµØÏ=¶È…íÊ$] G8©CåKZ·g?,/Þ™Véb¶oßfEIÎK†öH"L«É(3ešøIHùŠMEµ/ï4ÜÝAô~¬¡k*3Pì8™Ìâ™ÈÄÞ(2ÏaGvˆhó¬kꃜ„™\å]/8»i Èä°öYÛ냥L6‘Á°ê™Ù»‹ºëól3£: œ0 á†Ð2ùu— |.´ÛFÓúxGx“•¹ç Ä !½n*0)ß,4§¸ÖdS›Ž…ߘz6ÈšlB¶ybr5™Ó6±‡“°’ÓDb̸üKŸ×[¦Ë¼Þö»IÐ<7MZW}€ mV&a•XÔµ™%Ž=k éU~ˆ. ;Í{m„šˆ –¡&+"È¡€t‚=Æ=ód«ÚÞ¾œ÷}u×çÓ‹Ç“Qè(YXþùÇ„D1•K€b(ómÁäü >E‰B ®ÁAß8i6 V‚hƒS¢È tj•09äðLÐ(éÓi0¸*§$¥NUA‹Ð5‡^ÁnŸ¯‹ë;ÚBS’Ä”ZmQh“_g‡²×úpowõï­#9êJXkç~]%ìÃÚz¸ NãzÃø¬„¤PZYÔ2!m}ð{¨ iwH«~ÿ]ÀÑLJ¿,â¨òmfwzeuBêoö(ÒÐâï¶~qßàiÔýÐᴅߺ°zQ!ñàÂéF“§ÌW±/‹¼}vô® úéH‡A¾Éiƒü’‰¥2ÊJ%™ó”<†f:O AxôʹÏä$tb¸q?ŠÉd½²9ܤkƒ",òç™Ožüݽ20äÓ2¿î ë»~6h¶Ûœ¶ØîîñÉ_ ùÇØ˜iâ¦ñÈeóœã¡KÒa¿s$ãOEhg0†Q“vDbíÆ´¯Ö4~UI懶‰¾›Žü áÚRMìOì+S“+7CÖ¬þ¯ µ]ÊyjSÏ÷B¸2Ç“9É[…¦!IÕØÜœ«ü!ˆùCàCšM±~Î#4ÏyÄ_­‘´Ù!úÓ y$¤?rV‡ÔØ‘øNÅÁªN¹—¦O{¤žáõÓN[±UuŸoõq±¼§ºçÇ‘‡ “Ë2Ü®¹(ZƪÖ'ka¢“‡TõÌbaÎ$+füÅ9Ñ?t':ˆ5¬ ÎØ‘„¾ëúdO„Nj3þ ƒ¨9QãôØ6Y TAt…ˆL,0¾#DB ç’ £•XƒJæÔšÁ„çglÝ÷Ô9ÑAÖ$8÷”=ý$p‚€»nRåWèG8,?>šæ><"ÜÀM“s½ËªÞÌ€ÀõÀ‚á¶|F»ó‘QÜw<1*öÕ(XýÂ&wΪÀóœD8ážÝÝw™ëí{³.3Ü‹p ]¯æÆÞÈÿÁO©X$JìÙ/¿s¸‰}gµ8H}¸HÄ.ì:Á ‹O?`ÿÒ*ZδXõMd˜ZŽl-™½­€J(¹%y…÷Hj7e!#Ø1¬íò£zos[±¹h*Mw†¾z{ùDìŒVëaºá‡n8 —RቪE™Q ÅÃ2MÕÜ >‰¯Û¦Ò€¢ iUw4çcà©ÚOg ¥Ú欬¾U¶7]åÅÉmq#Ÿ¼d¦DZlb–z" Í\Zzé(œÃ÷#ì¾]oóoÈ£­Û/IêÞš;†^ÚbÈ-Ö&A"LQÐ.³¤g†¬²/Eu¨ CνյÞ0,cújʧ5„0ࣈ‰=ªnÄíL$Âô}FžË“P}—S…”S˜-i¸ µÍæ > ×ã¤ïù›7—g¯M…A3;FG³v…ædš/Ñ2?¥%,ëƒÚq£FÀ4©%_ËȸÍf"£ø¬›ªjjY鄨y˜ÌŽFXy@ZpúbU”EoúÓD ÊIˆöÞN3¨š`ÓhRL©ÑR‹‚•Ó,Œx#‹y Kt®i <ÑVà‘£¾ÕMƒ“D£àdeÙÜâ÷CWwu-T1hf\ª./-¤>εÙß]]é¶«­ YëÄàöØÆ«ÜÌ›\Üs½‡FªÃOõÜÙ²ì%`lžYƒi2^ƒ4R~ðt1ðü°`ªçó³Ë«{ºº¦j#Ïu|x>§~šÚú#æ¦Ø‹´¬µ+ jî ׇ*o‹µÆzÆâ÷S¤WFJÖÑ£Oëk̦­üc QÕPUP·ìš÷º‹FA0Š¿/­åg%C*#ùíô¦"öGð„ endstream endobj 64 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 65 0 R >> endobj 66 0 obj 2896 endobj 68 0 obj << /Length 69 0 R /Filter /FlateDecode >> stream xœÍ]sÛFîÝ¿b“‡á7©NÓ;qwœ4µÕt:u§CI+‰=ŠTHÊŽ;÷ãX`?HJ¹>õ.mb‹°‹]úóY |øïþÈf¡XîÎ>3-Y(¢”II*‚ÌKý\ì#y’‹  ²0)*s²¿œÕg¾øþì·ßi%|/gþD8‰¹;û ”'©¥ùl6c[C/ÈsTy)Ëxy½ Å›FqkëQÿ?·Þµ( Âÿ‹|±9»œŸ½|›ˆÀóµMYŽõáOˆÜ‹Âþ Å|'~{v÷Ó¸)êÍ¡ØÈç¿‹ùgWs^žš«(„ÿ3OeÑ` ‰ýሓa†n©ð7ö"¢Å XUTþ‰L”“èçI§°(gò8DÊ[ÿ¤òÓÑÈ" xù Aêø~˜Xÿ°Ë&QDݧãOêºÏaÄËij²3`ÝXrQUÍ£\¼o ¸—íºiwoú­líĶì·;Ù—KË`GMSÉ¢¶C ¬è˦¶V”õCS=”õÆP.¯ç÷Ï‚ûçVG½r üéâö×ëß+fÏPç[ià•+ ¢ãœÐy§Y#?'Íñ 3Õ^”½Eº¾……¸S[é uQ5›æàŒ“›Þ6ü›Z/¯?ÀÚ]Ñãëw·¯çW·ꕳoâÁ4/PÅÒ¬œÈ¦ÒøÞ,‚ À, “(ÚÍ–¨Ü £#â ÂAT9, ÃÖP ß‘e^F<;§³¥BŠ#¥¡¦,y‰ÌÒ`\´üY>–ÏÝ@ŒõjÎÀ‡£h6ËØ$ø.áïƒé’p¤Å5ÈØ µ˜+žc{„¿áäsVaµ2I›3ÖÍÖ¸flÛ5eä¢L-\ÙMuعâùÌ"«¤kÙü×~Ÿ®Zð`µp‚«o ý+¶ËØê®/z¹“uïu²'ÿÜ?³±„"Èâ#ÒtÛfÕyÓ4šù^Š•5 øè~«z(öfè£XQvj%DÚÚ=ª!Ð9IpY;àJ~‘ݹÃ÷dàþ±1°Ê0p¦ÙIê°×ÆÔ]¹’­´úäçCQìPW²³s›ÚÎU±eÝ[¹³VZö?ßÜxûµ9ér‘¯ ?±ãëdÑ.·Z:Qˆn/—åz·†²ˆºÝ+ÄŸ ¸¼YN?0L¥šJ°ixÂ0öâ,ÄæU~„æzš‹vœÖo‹ÞbïàÖóæÒâÔ¨šy¡mF0™ý¢••Jaå_Z}±íž%qô³ácÂÒ•Ü•»=íNÂŽáÔÚÌljÝË”»üÜ‘iû§ÎŠÒ‘³ŽôÆÝ¶9T¶÷]ØÆ–£ätìí²9k޵ëàsËWt]¹©qÃ:*úG)- EÞZDu‡DqÕQˆ©9ã@/»ÞN_;#*‡§~‰ó‘_æFœ‰à“d¯Á gädÍJ/2ÅGäÿ–_¡”8¶ŽR*°„Wã±ÐN–¶Ð‡CTúYѹj¬Ùú¦¾-)ì‘waOÍÁaäÖ•Qùvr~Ü1\ðµºúE}¨*KiÌIÆZ1é¦T޳º½<¥Et­ÝúI¨ˆBEÚ—u*3è|õ€¾e*"¡p}'>ü8˜&§ÝU €"‚;…NÚb¹”ûOõ#i—ý't› ¾Fƾ€{ëMY;øªQ‡ cABÔ½ÍkwT–·'9áEupeQ @ðÂÑH{•öû”SW6Âlkâêt”ÜëÈ«ûR@±“çcmÜ60©ž:mœvýa~õ=¸$™J@ðÝüÚ=‹ó¬w5a…)ü±ì]Fg_ͬ<ÝŠœTÑYødº†¯³PŽèÈjþøæb®JG€§-lʧ^7L¹»š;¥6,izíöÓ‘ðWŽ`´+<Ï;ÝGùù÷Ï¿v ÂÜ ²d6‹sý“ˆ‹]¼ñ­*ûWÚóªk”'³<ôÎÁƒáF]sÏô†Ë²ÃöOÄ»eQɯ´æQ÷¸ØæiÂV]«çxÖW+:ÈymÇ=knÚa„ÞòRá\ *ušà䃖:wZh„Wr]Ö¥9‰‘¤³.×}ùTBÅ ftoÖ­M4¶wè`S˜l§)1 F¾x”ªÃ 0}U-Så 0ï?Á¶ÅæÄcÔtUˆpd$k(K3}Ù´x©©#EÊ«8 ¬—Õaåhb Ùó¥!Ð[Ù¬É[ Yï fœ3YtìG£Eƒß”æ5;†~sÁöLóØM– qòÀBÏ?7ˆ,…¢¥(úÍ1q¦0±Î2·v¸¨‹';¤=íÊ[î^Ë=­U¥.1}¹(«²²ö=nå_A 9\¿Ù"VÝw†ò¸-©*l[¬ L‘"xßb+Ú?YÆîsµZx¼”?ðnÙÿÑ•ÉWë¢êìLöƒ‚áô`.½¤£1 ³}®ƒÃ¶”ÝicÊnê识Žhe_ÀM^#H‡æ<Ï5®u l¡Â Ëݾi‹öI /ë­4ò~¥^ AÛ¤ÓÌ®×04l­½ßWåÒ^´#óøa’ pk›iñ éÍÕëë÷jqF­?üüþêöúµÁu§kYñGó‡ ox‘‰.!®ˆB–LÝšAiƒ0›ªw«–@ت‰`Œ-ç)²[ó”Ž&}ä¦.Ù+­t>ö˜n-¢çØ ;]ôYƒ.AGö`–Ž÷ Tm?™R}O¸tgŸØ¥a]SùÕù„s{DS3¨¶ð3f¹·»Y–êÏ8ŸÌc<¶/ž áNp›7"­Ûfg1r#úòÄXcá¢6ÏD(…ô°ÎȪ\¯ázCv"aýcß“…Í' Bål)Jgîë‹»ù`¼…» ×^A늞~Å ü‘ó°,+%ä%Må¬É¾¤ž ç;n‹b³iåF•òiˆRüÜ—ö0ÕOV¶‹ý m³DLàw|KàOM„¸ïDLÒ¿d O·º{ÐòìëSʵ;{+Ÿ\ù­«­jê …×póW03ÙÁœ3Cë/W,ÎvLê1uZœ6ü÷áúÜR ¢Ù³ýOÕòì›{è¼—ëÏxH¹7Çá}{¨©µ¥__ ùi^çS¿ð²v$Rêg{Ljmõ€o™Ì½îÙÙS~Û©0o;üÕ±ÿ`®¶ endstream endobj 67 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 68 0 R >> endobj 69 0 obj 3136 endobj 71 0 obj << /Length 72 0 R /Filter /FlateDecode >> stream xœÍkSGò»~Å|ç`™}»ìT ±® $H$å> ÒHڻծؠ”üõ\åÎÁ¦»w¦ßÝÓ3y¸ÃÇüW”4] ÍEA^¨HAˆÜÈ qŒVH!q£Œ/Üùz‚ªVKd‰þäŒ~|»‡E3„=p¹d3üƒÐñÂ8I¥+qÜ8æ"<'`ºB'£Ag…X­µçŒðÿ\{[#Ï%ÿa´œN'r1šÌÛHp,†?ž‹bÇ# ÿCÐd…¾Žû‚¾Ð|ÑÐ{w&ÿœO”yb¯H ?‘#²hëCàãí/V†zK…¿¾ãIP€üS¦‚ª~ó „“äï½NQ¬¬ÍÝ oýÂ÷G#ò€âÄ[Qp#Ë÷Û‰õ7»¬E.{¿1¸—PÕšNYå w”?/‹²f¥ÂªºLóE¥0Z2­élÆf yNë¥ë¥^!¸*xº¤%¶\Ÿ—,W`šW äÍ ZZ˜úýéóðføir~£™Y³Êºé*ͨf\6«d`,ƒ îX,í8އËY¯³T( Bÿ>¼9] o¾Zëskm÷£TN8SQ.Šò‡Ë,áKK5îepÿÙuÙäSZ§EÞÒ„¬õ%ëyÃ#ŽçAkqcOyC9@„ñ/VèaS3P bS3:CÅ©é1 {8Ib¢˜¿³iZƒAø†ã‰A€“©žhÖ0ƒ ïw—Ø9 8•„ñï-‡Íºe÷œf™AJV5Y«Zšp^”S‘Š…íÚž@ÇÆ»tÖ=…QÇ_U3åµã{"\•åΓ‹¤[¿v¢$€\¼>7ål{N„ïWȰ–0·°òÚÝ!¹{w÷®¥lÁƒ—ÍÖ£×G3‡Iâ‡;1v(ÿKdžŠü•ˆÌt ‹h`‹4Ïeæk6uë&®—c°É2mwZ ÍŸ=6)È`y?"QÒQçè>çÛÇ@oãøöt<¹]ý¢ý~qs} Mùâú“?¢øxëºìñîWž‹]'òÆ„„rê4.œ‡Tx]Ây³be:58¯Ùr$*;Ž€Mû˜¨V ²¶¬%aJ«QmIÀ骻²ÈŸXY©6%×—l§øŠ®˜c°Ñ|·4Ë̼§´©,h¾é»ÆÕm×ÍÒEZóM0ž©$ ¦¡¬x^+³vÉZ2œq  Í4eMËúH#©Ù?¥¹ÙNÿmö¯3豎Ƅõ]y‘ï£áb×6Ýaµô¼¨û–l ýJ„Íú#AÇcÐ;¹€œ=#žOGH„Bc…DI6 ãOÑT'.ÍhM{™²57kG¦û±ãó<•ðÉ’Añ,ªÖlš‚'dâBGgÃÉùšŒ.Õ¿ãÉðòW!xtÈïÃ/BÕJZeõÙ†å †Ý$tQ¹€J…á/îLPn; “DÕç­Y®˜pF¥Y-v`° ò“$ ”AŸa¨?;Iû¡‹Ü:~E u6Û16‘7ûã $­,î—À… ÒÖ jš‘ˆ¥ƒù®S€#ªcspF7V§§D>_ßÞìrtu;i¥é„àðøüÓõÕ™A¥-íÎuÖTÖ¾V;ô-Ÿ¾"ÒñÁŸñF×WÒm;¼×âÀ‹`äðâÖkm‘wÃÄs‚þær”ïˆpr#…Enôåx.”·—`ȆHÉ‘±fp¶¢A×—î…S(kˆiôäˆÅCÃ^_XœrfõõíäGîTÇÈŒÍ)4X1Ø ÂcC3^Då.{a¦ìØ»d޾ђ>1d8ƒ–9CüÄKŸ8Ø åe%›íÝa"—0ÇV鋽O°¼As-›=qöâ$>ŒBÄ÷¥>pîP¢„¾ ˜úøAc\]j¤\iPO.Yxއ(¡¡ˆ:{G>P' œÐ‡iÌ%®TçƒÕ{ýÐQUú³ÁÞ¿ÿh`‘qùn E‰|3ЇŒÍkƒ›YÞ²ý°%Ò˜o-(ÓÅrïöû¾£ã¨c×$×—ªi$íí'Q7ªzY4µÁ•Rù«È…$vo ï²kFR,™ÊúD]³”úê#TÕmí ゾiIÒ štŽâz¾!i"˜¦M¦HúÎòùµÎ'ØÅbøÊvž¢ÊEœE™~Gº ­/Çû´ÏoDU¢Œ¹kÎY{Q¡WâÃ-ò½$ޱo±–ýoðO°êc s¢­ú«\¤´&¯ÒEç;ŸX¬üÙ<­aè®ñ¯$"Õɇ2À åF>˜ƒüË[1ÿýÍ1ý˜8¡\´$Û¤Œ“lFÚflãô<Øy“32Ò“¡Húá¼'ܬõ|Çبôñ<°Õ&¼]!Î’ìC:r¶tj?¬äik)÷HO#›ðCB”ˆVª"iuº²µ6vÀºñéj÷CeºÞQ¤®sÌói‚º³ÀßB˜ýC=&ò߃ë¼Ë\bâxì/…äÅ!…HÜ®=R¼ÎtÉÞþçéA»~ ŸãÄé,'a~ðŠ÷\”¥p5 Y…à®,ŽC35ÉVT®|”9BU±R#®ipß‘¯XV<¿Ké†!Œ!&ž(Ýo×lȯšâ«I––¤°å sÀÆß’Àn“]ŠÔ©¾>¡nëà d¯‚o«Ù®Ò‘cëd}PU²µ<ÒÓh‹ðñõ~Ü3ÛßvQW¶®Y;`Ýøtµ{SÍÚÞ‘¤žs^«ÙÈã »®~OSÙÁ8>†BúUC-ÁT‡1éTe»Çp™cøÙÁ!NR‰§ÇØ×9üþÁèä'tÊÒñ2ýé¤ÿ€ Ý+µ’[jq~’‰ƒáî lú]_`cä‡î+·cô+åóôÔèqrõ›NèûÀ8Â$ôt«ãmâOh[ÿ{ò?y×\Í endstream endobj 70 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 71 0 R >> endobj 72 0 obj 2422 endobj 74 0 obj << /Length 75 0 R /Filter /FlateDecode >> stream xœÍksÛ6ò»~¾9™Z ¾3™Ì¸‰Óº“Ä×Z¹Ì\Ó´HYœR¤"JvÜ_ ìâÁ‡ÝÌMïÒGvÀ>ݨ¯3Î|øg.ÿJ2Á–›ÙW¢q–ÄDŠbÆ/öS¶a„¤QÊj9±Ê)ŠJ³Y³Ï³f泟f¿ÿ“ æ{{˜ù#æÈæfö+b/ˆÓ,ËHWáñ4•"/`¹a/®6‚½mÕl­½däÿϵw5 ¸ø?ÐÈgw³³ï"Æ}¶XÙ-EàXþœ¥^ 2ùG°Å†ýþìæ×÷ì}ÞÜò»òùlñËìrA橵j ø7ñÔ.ê D¡ßqv˜¡[*üzÒ€â‰ìC5•þ–Œ”“ðï£N!VÎâaˆ”·þNáÇ£‘@ñÒ^xêø¾¿±þf—¢(e7Æm¨·‹KöœÍÓˆ=»ÏëCÙi¬h5Ô´{ îó?KWÿÕ6eçiì]»Ó`ù-ßlk3ïSSíËBcó}Õ6VbÙUwM¾·:DøåйþÜîjÃì²¹¯vm³)£íÛüñ#åx@ø<¬«åš=Ûö¶+w÷ _Û0å˜3áûéÜç~tƪ†ÕjUî¤e¿Í»Rã+µ¿24¢®Ë»Ò¢‡'U‚•µ²!ë{G¡Ý¾ÝÙÁew#ÓŽ`È OC·¡ÉdÚêD(l±®ì¢v÷g7òF7BHú:ã¶\æeJ$¼TÇÂÒóòäB»šœgƒ¸ÒÁUõMCÄо12i‘AŠªÛÖù²¤ã6âïrér‡ ÆŽÄÖõä<žÁ/ïKkëÃÚA`ÕÈ“IÒ÷d «÷jGj ¥0…( V5´'ݬ£ýi_tçE£v21Ý—»FÅ ®¨«»uŸ¹Ã¯²#•Õ|Ûv]uë°Þ·T;Ù`èXš´¶t¹©¥¨‘ÏҬﳪ“6z“ÍEì…:ñ"¼+•{–¥CCuh®»ª¹C¥i91“¾uÒ~ú°ð,F•…·.#$…Ðor‡éméJ,W‡zÚ ãUZÌù‘û¼ïH:4óH¥ÁÁ©!ê¾½+õÎRd^±X™/LÇÐRÔqñ,Mâ!Dg)º!öùjñó±±]t0*UѸTYNcð ï%A1¦ÒV5ËúP”,·e”õ\ƒ9¡GЇIL¬)"ÂÙV¤*}.ix¨$¤2'®wX=n |õqqùÛ?/ÞküçëO¿ixq­¡W?-.=3°¶侜bìÌ(»å®ºÅ¾H 5J5P«Ç ãGºr)O­Ç¤k ûCÎ!¯ç°•oËýC ùó 6HÌ×¾Æd;ûQòú‹wɸyä1܉ôD± Ð^oË5q²gÒ[svvšÑD G/K#hÁÂÀ d ñ•t U¹Ã܃$Í+òŠ…ç‹š¸Ž¹¾r ‡-Ë]æ¯-ñbaa:„Ñy ìUŸ—»µ^57Hb/á‰ÏýhBEkµ 5HQ™ÁÜ@GS8„eÀZÅ]õ`™Lþ»RZªB>¶T(WË=õ‹™S/¡ÒMض­ð !Šg‡VUîDÜÀSü¶å²ZU¸Õ‘t4´"N½0Í|ÄÉ„u:sÎ3/:9©|­€®Ó‡®sÌÔ³z-\½í®9?Aó¶G–%À: '„\,ÆÁãb0éýõ›‹÷Ç͘Z¢2Ej›„˯‡ v‚Î~©m>jE–x"áhÙ„0udæq×]SBÓ%±W暀¸Žb' 4MNP6¥Šg¹Z`XBŠñ@þ§†Õ1ä±—Fp±„Ýurl ÷(,&«þxgˆpÀJU“ vû9KieBƪM„•…uùALïëO KÐÖ"&­=wÖ®Ÿ’‚F!¼ªvÝÞ¢pͼ/wtë'^­…kL¾:Eó¾Úc·ÁXßm&“{PLÕEA4 áϸîžh‚ÎùÞ ›8wy4Ó |7Áú”1kC¬:G9KÆ ÇXži…:ô°VÕªû*%` WÏ¥ì¦Ï™ä¿ªÝH°¢Ü–M¡ ¾²-Lȉò½ŸVq[UY&Zä¾·w"ñ=N GEÓ;ž³M[HWv¤PYº³!Áæ4Ðö”=øþ-¤z·¸.Å탬Û]»,‹Ã®|9V%ã^À¡LDõU|¨/³Š.{› ¤IQËvUcÛ6…gÔƒÍ÷iñflY#LL!Š˜:žÁ)úÀ@I½«äõÙ†I=óXÕ:¦nr&hEKW»v1+·ld7è@ 9ô\‚uIwÞü¥y…¢ržÈ÷Ê,QY˜íîf*ýBóB:X˜Èë´5К®f_a*yB£ƒãÆYŸTK’Ë£f}žæÕ‹|žÅ|ø˜jd¤ÙH‘ô‘p37‚Ú$ε>ôx=Âé I–bBŒÈééd6 -r§JŒ4r §¸æÃQDZª!iu†²µ6nÀ†ñj÷]e†Þ!ÒÐ9æÝ;céàÂÈç¢Ú‡ ŽœKépçQ· 7×0sé;ãjP]úඇ׼'.6AB§C‹8ÊQ‰6Q#<¨44k"TÔ$Vvåü,•Šž»²;Ñ‚êLk„ÛùTûqÜ2!Ë-è$¬5 ¤ËÓÿ‹É’¤ñÀwgÂG=~PÊxìªÁ¤$dU~˜¬ þt‚ê‚¡œÖrçZë¾Òû‰— ß÷³´ŸÅnOÉbÿ¼Ð—ߦ³XÈ¡¨â¸>> ¤Ã£f}ž'Q9ŸG†ÔÏSúÀH<ÔúÁïNWˆ2ÖHŒÈééd(oô¦JŒ4r §¸(¹‚DX©Dêe± mÜ€ ã3Ôî”,Öó‘†Îy"‹…"ñ|ù>©,6þ‹©,”]aƒ}ôìGóEb­d`®ˆ8W$¬ñ¹‘ÜY¥¯í 3Ï¿,áDê½Å+‡!´<ª ¥k-é°:©3ÏIDxJ‹¹Y׳äÌ¡„ñ¡Âão;aì÷] ™"—¸ î\½Åa†cČٹ©›ÐÆBRáñXþl ¦fôc»Ç'Œ@>V™¯{„9CN쀞F˜¾þ"RWý—ø´vo£z:´ÃyípÓ7^’Óô4ꜥô?*#é¢y´¤þªp§;o†“›÷µ±ç²pà9°*vÓ˼a·Ø×ëûÅO¥‘Ü"È’0¦b&ßDÙU;¥šOœ<¸MxašdIì'¸öÍÅÍB–9å=PN^ÿä7žV}6X¦à-*bÝ)5, ¡Ê¶PÕ0 Iþî„÷ ™œâ$Afe‡‘JŒ=ü„,-ç'ÁH‘úEcJø $k}€À{„Ó¢¢5#rz:Ù*½©Ò##\Â).‚ùa@"¬T"õ Ù„6nÀ†ñjwJ!ëy‡HCç7þ}…üÝœ›4Lc'¤Âw endstream endobj 73 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 74 0 R >> endobj 75 0 obj 3073 endobj 77 0 obj << /Length 78 0 R /Filter /FlateDecode >> stream xœíZmsÛ6þî_oN¦2C‚â[ææfǾs&/m­43m:7°IìQ¤JRvÝ__`Ä IÉöÝ¥Íe’81vì.žÝ@¿ÄOä¯$£d¾9úUñ’PÆŠÅ$H¼ØOɆ("RRȆNQ6QŸª5kòá¨<òÉ?Ž~úY4Zß‹Èí‘?Žb®Ž¾棯 ã4Ë2e+õ‚4•*B/…ù†<»ÜPò²‚ÖõRÿ—[o[ô3°È'«£³£g |2[šÈ"¬/þ„I½fò%³ ùéÉÕw¯ÉkV®vlÅŸþLf¯ŽÎgjxÐˆŠŸÄƒ(r*¢©ïÖX¦ù†+þM½y‚ãÑHŒCVʩ귬芀„¿÷‚¢DYû.´þLåû½‘„‚㥎‚ÌÂÞ ¬?²¥îýƒñuV•7¼nòª$OÉÉ4òbòäš··œ[Œ—§³sC±raˆÙå›ó«Ùé›o +oLyËëeUo¸ÕãúΔk¾©nòre8횻 5¯6ÛªäekXÕÒ2kÄ(t“5|ê÷ÆÊhŒ%ÔOªÚ”ÑP,7¼m•ÈPv"±®võÄ›¼ÜµVµ¬“4¯lz™óbÑX‚+SþוgHkdSßOOàÇ0©ÿÜOÅÏ7â?ÿØP½áÍ”za(æ› ð·%úxBn×yÁ‰[Aé1Q2‰±Íª&¾°Dþ{¥ÑÔKüÈRêF"Íz‘ˆŒ."RÀš*²0±ìD¢’~gÊv$"Gy‰.ŸbÈR…Q©L1p€E÷°À¨Á(LdÛ-/Ò4i‘ ¡BR6q3¬ŸïêZ&LÃvÁD\B{ågÉÈ‘y~jÇéè½*7BR×kdf ‚À›Fö(>¬Áuaàe–º”C |¤š€ð2 úÝåÚ|c$´¬^ñv¢iî­¼Écôîšq»-à5”TW·º Îî7hÙuÁ Jª|·åcí6®¥›]ÓB& aíkWß›êÐ…rÃ6†`Íhƒ Ò×»v´Ý‡ËÙ?5Ñ¥"?¾{kœDuwïgè4_³šÍ[^çM›ÏsV»Œ)‹|¹ä2¶=ͺ\Q £Jr8Ò a5'eÕBžH&Dhâ¿m‹|ž·äìôjF$òb†# "0æ0EaôQ^ª¼CAô¡Ô "±«tæÚ3±ª11èª<”[©Xõý‘Ü:IS/±g ¤;G!ÕŽT‡:RMÌÁ¾˜–ÛÝÞÖ€ΨªueÊïggû ¼æb2h–(x†y¹´4÷d ]Ñ>D‚Xû $`"Àb7~Í€ñ`‘‰XYóZÓ&²÷(˜)è+M82`a7ŒØ«<0²Ï™öÐC9‘×ïÎN_OXdü'êºá€ ]¹ÈòÌP ½ÈY).aâˆÄX-¾P”iÖ•k¹aKÉãx6P\p¹hR,~"Y+/#®]3[^q§‰Êô4v›Žj¿ ê»í†©·¶@w‰„ a %`C@´H'";Oô«gÑ3œ]Õ³Iq7ì΢òò¦*nì^¥ØÖ°"o%‹ÛE´Ž"µ~v$ mb1jÞìŠnë[Ä®3%Ÿ«äwz5öø.ªzRä÷@⿱ÍÌ8Ÿ¡]’@Y(ªqûò\ó^œÏ>œŸ¿ý¨“¸ÇÅíæ l|8·uZ}|ªk0³ hÏmʤj\ûpx1õ¢$ËÒ8JpxÇTmƒ¿ñÑ.°çØm®°ãVf¥X{„\º„Iýv‰†œM_?°Ÿ¯eVܲ»†\œ¾¾:?´æÐtêeÑÔ2èbWÎ!¥,9¡ŸÀ§’éuÅ$¬ Ë®7©y»«ËѦŒ°¦n•Ћ5Ñ›7XƒŸëÏhóyI$¾H¨‹Ï\ø>¡ò‹W} "‚ïh*6G‰[ÄcIA{IœÐÃ_Ö(E»bðÌËæéAbÔ±7P:ÐMû%9šIU¥€«BQ£:t¿1V%ŒZ‰WpZ [¨íûñ“Ý\›¥¾}烳”³÷ßþvö/ù…5zªB§þ î ‡O ƒF¹Ž‹ÿ DÐ¥@IÄLjûVpôcÖýˆ0z°Û{½ÓA˜yA:pœdC  >œ$#ý{朗£ q•N÷¡˜^¾{‘•=ï`¾ïUâ4P®Q*<“N‚–‡“~høA—ý“G•øfKüžçmDï÷±Þnf•'µ-ýƒpØã©‡ƒ ÃPpå?Ìã=älËåmØòÀ÷ŽþÂ8ïQü5ß¿ä|·ŽAÇ’¾çþ¯Iÿœôx$ÿàÌO¯™ÿ¥e>:^æ{nÿšñ_DÆ;Š’>óÿꤧÿ£¬ ³Ÿ´½ ¥¦óƒÁú\ʧ#³ýœ§…{v½èø\æ†G…Ìã&‡ûæÓÅK/\þ«éƒ~¢ùÄœtNiìù‰{f‰Ç‘3yæøcUrò2o¶›ó{n³§ÓÔ›:‡¦êÆ-ñ½TÞ$è¢|’Õ•»ÓÏŽ†eUÕ2užŒôÇ'·y»6uéÕËgš˜WeÉá´Ω‘‰§ãX.ª9+L žë#!‹5—Ãîó"Ç5J÷o,ór^ìx Ð ûÎ+kª’ƒðiì÷ SfÅÜ’/~Ù5­„¿Ñ¼f7_›†¿`wE¾Z·¦!S4”‚ñ?ÒwúXTwú‰êf…ioišPè);¬ ñ4÷mÕrK0kGµ`|8‡%t²šH¬mý†«ž·@Y]±!1_³r¥^ºãVÝ#ÅL±s¢á¸Š³¬ìßÜÒ †ÙªäC!ÓxÍmm~ß3Aµåxù‹ä¬êgˆZ:í£&´I¼í[¸6!‚"8ð±LUÕ­ (y'ÉÊEw#ñì"N ‘é¥5»œÛ¦m¶¢¿_=Ñ îeƒÄÏÆdÀšx`ZŠ¢îÎL¼A ©¼˜ZæuÓjJIÓ ‡ŒC¢µºõ¢K5¨FÛ®ò|Ô>%Ò¤m‹~ç6nLÍ›¶ªù¸AU¯r•«9Ĩjª^ÿ!½;„9{09cT¯£T”º;‹R‘·‘í¯—Ý Öx,õŠÝ°N‹ýØ!Ýë êÃË0ëISDzޔ!C=½PTÓe$’xÞkîÊf׬±Y»¦{è6ÖaoÐiìM“(Ëä õᘾ­9<ž¸jÅh®®¡\[“Ø dÙ‚/‰î3,”“k–ŠMĨag¬(ä{¬û ®’×ÖNï¼ly½‘Ót¯bt°*BzßPÕõ/bÁ6tÞ˜rÿÅ µ^Ìô¥ªwbÔåžf[…ºÕ´¶ª¡NÓ`‰`5Ûp1JÏðfkÛn×– »¾`ToH n×ݼŸàëɉ!åtg‘ÊɺÊ<â–Þ(4—5Õ®5 kõJpnøøÔ³Ä¯ù¡¶†Ypk¹Jì…íQê5h×iÝtÚƒv€îä¤^ùÿ`øJ endstream endobj 76 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 77 0 R >> endobj 78 0 obj 2663 endobj 80 0 obj << /Length 81 0 R /Filter /FlateDecode >> stream xœÍÙrÔHòÝ_¡7p„-tCf1Á1ƒ›!›˜P·ª»Eè0’Úoøã7«2ëÔ²Í>Ì.Ãàʬª¼+3«ä®åÀÇüGœzÖª:øA8׊=ËF–Û‘“X•E@&VɆ| }¥Õl­/õcýëàü,Ê-Ç­ëgBÉœüÌÃÈö£$MS’Õ³Ý$á,|;‚Áª²žœVžõª«¥ôœó?—Þ”Èw½ÿ‰ksðëâàÉëÐrk±Ö!†`Xþø®•ؾ—ò?žµ¨¬óÇg¿¿³Þeõf—mØá7kñöàdAꉽ"€<øÛ"Šaà gŒSx…ÿÛG`l/=øTIN¥Ÿ|BCa$ü9k"el»HXëŸd>ïØŒ ¼à9†í‡õ›lâEÎ{^gP_¶¬¶-7±ëqžõ¬/*¦WY¹c³VOµ¬o vÅr…Y·M¥€~ËL²Ù2ë4b×õfïR´ë“×éXr/ ìØƒCázÞD‰O¬Û•ýëåö‰â¾“ÌoWÜ‹ºgí:[±#S8CiÓýucã²e«û¬/šº³QÃìž3â¹JC¸Äwh ÔÝ4±Ã)… ëÏÀõæâñ…焇³Ê§P‰Ò4‰¦T´ë·MÞiD³Öãþa↡íyñ^qï÷‘礳»5ó±¸kk gƘý­zs©é©(+Ž€É~fdæ‰×}Ïö}t‰jô7—b‹À¹~œuz\ôÆØÀw}ÓŠ3&çj=&þÈCfkÔbkR*êU¹ËY7³Õ´-[RÔ»jÉZ £…ˆY±)zƒÒºigÈ®[0?X:+ ت© Ö+ó#Ã.ƒÉ¦Ø5FvUy*‚Úi=¾.ú­(¡!ðï¦Ö@^t—%DRáp¤×oÙOîµvÁ³H¬×k=yúþD\ï©ãÀßGz©V@yfê½ÒI—M Ä[µ²RØ?ˆ0ý²¶Ó †Žób½ê^£Èq#{¯ “0¤$ 4”˱ÚHÊ[v£!YPóPçÁÌ"ÓÃNdD[#&ÙÄåCŠ SZ®À›ÔZ€îͳAxCÞ:Ÿ•ı¢d?û®ÏªËäú)Î9IF9x¨qLæFàŽÛiýi¦SVÈò®{Ç~-€Êó¥Ó<Âo³«ÌPeùòWgê“õÂÒM%;L¬ˆ¢¶Çë:È`“C–8ãì.OJŒçÄ–€ B~^¼”à ÎN¡sa`›@ Uª¨™ší5™ù>‰_[xáôÓ©€ßÁ`v÷£´y<Í{. ³$¤h­;Eñ¡ov¡œ»~àß#‹ˆíùsÅÛ YBJ"íòÌ4qY:.ÈKnѺüû®Ã@DßèáV¯#/#@5q˜¦(~ŽÌIU%¦Ëç]ëy¶çðnî$MúFuƒóÙÁKî"¡DÀ41£Wg(¬Lް: {ŒVÃr=ñŽëŒë:”&]‘„áEý™ö×.\_öz>uŒ§ØÐ¥)o"nš]gXß~–€¨¼L½Af"h‚T#¢ˆS’äÄ‹:g— þÈÓ¬üoLé0” 8PÖ!èhVõµÆíºªS«úéȪ¼‡9[¼xÿìƒjÅìËéâ¨ÅAàÏ4°jÊ]UÛz¥ˆ w²¾Ú¶}q¨ÐhúÁªÃuº¨!,ì‡ÃÞàò´þ`þü ZѶMÕ Ý‘ºÃ"äÛoaŠÕVƒÛìʘÌôðeV‚g³Vc€;‚ž(rKƒx&×F(±€Ø»d©†Ÿ­ sVF B”º¢F`JrS\±zªÖÔx‘?2^Önv• mhÙy³!@êH`fΩ«B2ÄTµ•à—M}-+oŽfIlÆ1¦ØÖùtÙ(ÎäìàŠ,0òÚ¸‡ã¨2M‡³q†á%¢*³T éÐá"l'®9Æ*epˆ•©¸PSARþÆ ‰‹‚¼}õ+¦³ Åèî H^«°«¡‚õ»“-‹ª0¯Ö´/7 ¼a&Ñºé ˆ.©F^™ \5ù`;µmñçQƒ“~Î2©™ÛUz–ú^™«3cÌSÛžgtd@JzÇ>Ì€3ß6—¬íol§.‰GRÞ Z5Õ%XqY”Ecàéb+AãaM¢ú¦);& ¤úCð½.È탽æbrR>eH‰Á/Ó‹¨ç¹#½}-ù)õ±k¸„Hê4B6”>Cpy£Ç9[gpÈ4"3šîßK‰[³Ù»©|Ä]ikð+R(q#°H»5€ÏŸ =e,Üq÷ó|d®-´ÈùÒîÛ¬îJP诼/þzü²ÎÊn¾‹wSo9žH–m‘cj\2ˆý¢Ùµ”%|“vÜ4r­v|ËMÆâFüÓO ×9/¡®‹'2H7Ö‚‹(Imö¿E{p¿Jè>‚Èm?´üXûËW÷7>¢º!44PÏzË®q¥ö/YÍD%ó˜¶ ?6˧¯nmCj{‰áKð}d§¯ƒŽ3R_vgИËvÇ˺½"¦0Vâ²Óʉ“…Ü(·Ø âµ¹’˜ð ÒݵÿH#dÅÀ®.Ì_O^|Ò¬xÿñƒhå\kPkaQfËrÏ«–+†ƒjYŠùX|€Úàx¤ "….8$›)}…c© B¯^|ÕËÞ|üüICïO?|^œhøìäåǯHŸ p,õ²j1ËÇKcDþžGæ`d¸VWE¾ËJìˆW´Å­Š,IC5‚ ³Â!ø¢VÃBŸJDPîGeÅqwÉVÅúF/Üêup@WE‡I´Þ»°jº^S„f·X+¼²!N¼k ê|/õ²B›è!zj??Ù^·AýÅ:ý°8ùôÇ‹w–žüAæcíó©Þ‰ù=š‘;¦ w&ñø®·+g$ÇÏ On{ ;è•‹z!ûܾe·¹¢ÞˆóÊO²€›;§ŸœÐöb'M#'%MP0âÄE~V7õ±²{Qeí¥èÓºsëYÉÖ=ï¶Yý\[qÊŽãaɲœÓÄ(QŽ"m±Ù*’ßö|ÊplÇ÷TH%”luÌ/T‘a-‰@HÈÔKc¥†3è…g(ßc•É$âÜd*Ìd°ÚMu ½±n*ÂŒïB²|ýŒÕâÀŽù'ÍØ‰¥Ç1vÆ>ýï|?e˜Dc†Æa9öø ¥¥¢@cdª’°¡£F’¶Æ*Ô[#¾ã[c¬½Dˆs“¬ôÒ€êTµ4¹K5?Š X©% ¡Ru®FÏà.SezfJ|ô‰0V_§-Sè:#Y Þßî ›úá0La{‘ªsñðи¹¥"0åÅ?y^š&NH¼@޳Ó­…MÒ­íüËûŽ Ç”YœÚNš%aðs'M蹫y™…ö’oÚì+‘E4à_œIšÍ}wÑÞ{!ˆ •‰\(ÅPçËÉßYuY2QŒUyíÔÒz&`ôTý2ôÓëÆüwdÒØ ¨¤üî´#?¶ýÔs¼ri†´ÍÙúàÌBi‰  Hp¾²‚(¢JŽ2i”Ö¦úÍycýñˆm7ñP(ù[væjmÛ) œ@Ê3A<\ NÒÛÃÆñA™P|¯¬±Ñ¦á°Ié^Å!ÔXõËM©5¾ŽFA§ÀqÜX–e2âLAC"ÕàçþÂÀª endstream endobj 79 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 80 0 R >> endobj 81 0 obj 2894 endobj 83 0 obj << /Length 84 0 R /Filter /FlateDecode >> stream xœÍÙrä¶ñ]_7i]–ï­ÄU²½Ž•òîÆÖØ.—åjÒ°Â!e’Zyóõi É‘•<8Ù£ÔÝúШßNbÁß õ£¨ÛN~#ZÌ Á’œHYÎâ‚çQÉŒ2+Y«& šB`¢©4‘=ûé¤;‰ØßN~ù&íXÄ3öt-˜#›ë“ï@x–ó$/«ª"]ËR‰HxÀöÀ^_ûª×³öŠQô?×Þ×(‰ÅÿF»?ùbsòúëŒÅÛܹ#PeàØþ$1+y"*õG°ÍýrvýÝ·ìÛº»¬ïå«_Ùæï'o7dž^«€×§(ÈÒ(ñN˜¥;*üOy‚4 p‘j¨¥M¥ŸjÀ€™vþ<êbå-žo‘öÖŸ)üøn Px삈=߇ëOvÙb•ìˆWijjUˆ,­`p¸?ÑÑ%-"–T±!OŒ'sYp÷L8¨<—íãÏë`¸å±·‰b™‰%="”-ÕøC±d9BsÃíQ«Xœ´ˆå*ê©ú˜]½ß¼ýþÇËoÙÏo/¿¿9Kn^á±óVÄ9zIÏÖ|uùóÍYzóŠm>°o>üðýb©Èx©—Âù—¾»zÿÃæ­]}ýöË9ËWä'OË¢ªÊ*Ÿ11«Òs»nåvAP*yQå`@š ‡Í^²WìB¤àqvöÔ;µì©évͶžäèѦ€Ç½ìäP·þø§BW$÷ðP…AŽ“‡öwGíä]Ó5SÓw¾~¾bÛºm¥oPíO5nªænJãt騿4Ý$‡u»Ø•"‚©YU9¤ßë¶¹käðùÑÈW–iŸ@Ò‡  Þɱ¹ïjc¥"¹ÁæðÐSÝMç†R»1;ÿУG,ÀÍN<êQ ^àƒ¨*—ÚZ(>UÎcö»Ó(áE’CpÏâ%Ï¥…#Ÿšiß?N ÿ+56ê˜è“lÎ/7úËGZ1j„—ÊöcÝ>Êñ™ÛC¯D©N .½ÔNÏx¡üïÜ£ 7‹mk7õÖ‘;y{ýQž[ÊC?6Šb ý`ÁÉ¡ç{N¸¹‚Ùã)Ñ0Ü7iïæìàŽOÍÁ`_ÛÝèIX]6>È­:;K ~’|JU Ë’¢°‘h„‰bjÈ•cshÚz`SÏ`ãa d*Y›«wo¯7—ïþÁ”Uœ©ø±kîîä »­Äµ`á]ß¶ýÓøf%Š žV_’0f…:ÄwÍ€×Å  C1!L;¨áÀášâ¶[£[ö¾÷yÖÝ'‡t94Û£| Žq°oC¸ š×~Û¨{Ïík:J‘¿×‡‡–Þ’%ܼaéÉ" =i¼WöŒ ¨râÍ™€g(ê ˆÉË¢è*„ÉSˆhWŒ­o{}-‰oÐKˆh'!XU7¯¸S`ï’õàøvNä¡ï¦½ÅìøEÕ½ôµéÚæŸré½2½W{G[Û îRʨ8Ô¿7‡ÇÒÚ¡nèòi_O Âf×O8]Å|•9à€šN;WSâxyETñBhUd¹'Ô%…ã)fWëÊ wÝ–2Žæøªàš§ùŠË/®o‚DÍXéŽ24½ï>Êa²xm!©-Á3 ÚŒ¥«E<Ó ÄÕ̆ù¾[‰–"…®_@*. £õöG¤ªi›‰*.Ä©<&»É” HÖ± AOW$Ø«…(˜=6ã4®­<É”Vqõع¥©œm‘ÚBã44ÝýRaŸèËY×w¥ÈÎfnjº¶ö¶¾lY°ë’¿Q],+˸õVByc{ÐãýžÈK.Ò¢*sÝøe‘éøt‡#ò‚8jš#„í–ÇA÷Aþ‚þK1„“5—A¤°\Ñ'‰ËPEG|QSº#fr‚öÔ ˜þÔŸª:ùFá%-*ÌO«…Ùi袹lÒ&ذùþ̵{Iãx‡:عsžiaE‘ñ*Ÿæé¬#„zé.6ÜÛ]sßLªìÃk>Jb;’ i/=×¹TÖÛý²¯ŽRèJ ( Óí¹u”~ „èX6í  5&@Ê×ÌJÔã”bZf /^ˆä"ŽNé©Aà–¼ûð~óÍ3ÝF’kØtψ@äý±zr˜ª -r[SF;£=6TåÒB錱½ÏÑ›XC³—w”klÚO¾¶ªø¯”_nSZͼªë*mTóÜ…eÐ(ÄŒQˆ‘QˆøF!åÊ_èÉRõ›E &›ÛÖcäK¥c)O#¶h1òhÛ 2ÇøÇhí`os—ÂóL–NV#+N>g ÷Çf+(<ÖËÂ')SÕ\UÅ)UK?í¥V2¥5`ãBѯ„<È"Ãõ$´ÂÈtË„R³6s<¨'¦Á£´´¸ðKo7FE¸#¨s5ϪÒmt7ô_˽¯¤ßIïõŠO«|æÓêt>5#tŠ)I CPri™×¬ïšq -‚Üqö–Š©—”LiTò2íªdJ£Ù[¹ÎºjR‚“LÊöHXxŒZ2~QY ægåB‘Â*eMˆ"ENfô‚/Wˆª¤…1“èä¨V ¦*,4ò /q‘z6-I„“J¤ rZÑÆß°ùþ̵{Iåx‡Hsç{M8-¨zgKnmá}ßOÒ¤+zDÔoaXØ=E"¡ïtc€Èøø >ˆ– B…ÃÐ78ó¹+–An8rÅtÛtΞö ìñ7€ J»Zi`Jš*”@Îᱚ z›Õ­Ü©'Ù¶Ër,K*WP”UEâEŠ£ù³¢!Ù˜C8EJÂnÃ!ª #÷²iÚƒ½¸f¦šhIø•/ÃÄK'E£ò?3 `fæaîÇÍ?²ãù}Íâ™§ýÜiéÅNÂLåOc{oˆÂ'aö3¢ôv¹Ê„PÃ$l /úh(¶ð+¼|Ç" ~‡oüéÖé´:T±sØñð™åÉ̸EªêI9BL5¸9NˆÒ§'D\Ì$‚.Å,vlÒNã‹8>u8Ât”!ØD3BuÔ%ØêXjÔð‚©Ñºfk%–^)²™WNU%¦Ÿ›8TX+w¿*8~a7_Añî U\Œ»‡ˆšçÜôÜbøô«½iûZ=daÿŠ$µOç…@·Ý;t#¶Ñgí1öàà7G4…^Ó¹£\>«Èó¦.<™Ãý=©} M‡¥AgcÏÚ5\ÓF6«}‘оV­ï2ж?<Ô“~‚Á‘±g©I" PΪ²´_¶Ÿð;d Á½Øø++…qG5Xïv4F—GIy¼´ëÜèè¤i+-'Å\Uó Ç`´Añ=?\<¸ö½Wt«lM|Ôˆ{ø@'pÉÏÊYz4Mgµ$¹{¶BØÞwŒý wŠˆ¸@œ,FÄèˆX’„7ŒV:ÐÏGŽêZNi1“vˆy±«ÚÓÜü–ê¿È‰M endstream endobj 82 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 83 0 R >> endobj 84 0 obj 3162 endobj 86 0 obj << /Length 87 0 R /Filter /FlateDecode >> stream xœÍZësÜÆ ÿ®¿b¿YNO4ßO&3ª-7îØVc]Úf¢L‡wÇÓqÂ#’'ùú×X`|œ¬äC[Ç/À]ûÛ],€½ßÎ<áÂøO’ùb½?ûyžH|ÄÌŠbá%Nì¦b/˜H£TTØqÐÄ.Ü $—{±ÿ8«Ï\ñ—³ŸNá:‘xüM¹‹¢Ð~±v˜æ.ü:ñ€ãøÌ?U¼¨ü/~PÍH‚Dÿž…EYƒÇK$Ñúo*?½I'¬‚ï[Ø7Ö²É*¢îÓ“q'ª*ò®¿èÊ»ºÜ–ë¼îÅKqáǰηeQm ¹*úÇ¢¨ £ßñØXÄñ¾èC_nû¢5d¾Ù”}ÙX¢ëkwXõm¾Æ‹ÊÚ¢;T–¥egÚë¦~(Ú¾°,ï-ÓrKkYƒYy54œ–Ö‚ÌwG˜õ»¼ §Ï˺yU ´NÂÕ‰f+)Ä£iË»²ù„ÇDpèƒC ², =|IÆ9ÙÈ6d@ûPhj›®+ÃÞ,å}Uòì‘ÅÐbsS>”ëÓꨛ¹nÕ‡}Ñ–ë¡^G“—w0é…&Õ²L-ä5‘Æ–DkNk6Âwåz7A- G¨&0£ÖäaÒ<Ù…XÛ¦-QÖwb•¯`¯×HŽ‹5]«.¿ ¼²ûz­ôš9ØQw9ÎíÊý}u÷m±-¿ ÖDzßI•û²>tÜTM–:aàáVãɽ·öÇNÊ8wãдL–µE_À‚®ƒÃdÈÛÂî–ÑùdB°™h\ t¬«Ã§eó&¦V%°òj0´iO2#a î‰\ 3–»é õÀCa3Ó~-·S‚û‰Æ½z—Ýbˆ^"›4Jfd}k„}‡ÂâDœk›ŠŒßy´h¿SZ&Î×áþ3׃hF±“NbŽGBg¾ë ~F·Õ)”„åŸîxŽ öÁPÏõÜ$ü ''áS2¬ÉÖì ”ÓÕõýñ¡ø´¼úü÷Ë0.Nœ„6¬&ºûbK±Ñéè¸çÎt< €‡Æ‡ëFA2£Þ^|±²—ß1Ì¥Ôůž¦jC¬¬nà«öÒrõíhÚxoÊÇô,X`zø°ÉÒ¬ýµ8>6-ÜLy½÷pàj×É;±mªªyì^‹7—7Kq{.{ýòFh¤õœ§Ãx¤Ñ€!n_N}œƒ“‹cˆoCö¥KÞ–ŸÂÉÍÁq’“ŒU&jj[äý¡5Ý7åv[àœL@ÐŒæÝO’ÕÔ4KÞäŠh ün‹Êë©ñ©;2~x ,„¼µ„º”`Í`9ù²¹+€µ+B°gtt é:Yèy ÆwYâG!lJÑÞánÌð8BŠ0›(u(;Ãâ¿ ‚DìäQ§½ãlȪe ªÄP°=Èõ²ØG ZGèMt0K¥‰媯ŸxN®°=ÈmÆï0Eú3jü‘Û&ëÃ^È º¢‹[4`<"ìŸx¬Âhe–2g¬›­,Øx}ÆÖ}Õ˜1:Äš€£“…L¤£\Î4ä·n–%*ò}{¹¼/€ï^¸ü}!þd\Ä ïÂs_ˆŸ®.?‹åµøxýiù½xõ “xÏ‹o^ÍÄØ™“Ežë†°¯Oª:¥ÏV×·è¹ ?épåí¢- œÚàÁrátÃ4á[jÎR?s<´ÔÍÒÓ–úþÐ:Äàb,àÏ›&{/D—ï 'Á=ç«æa& R'A 7}ÂN j¾²xhÏÛËŸžm%öÓÁå ºÒ4INcòæúƒ¯4É |³äí .A¸µ&ÙaN\ÝÃE:©J/)ÉR‡€4cU´ QöÃIæ<@oW¥ýÕ»dšGûf…q–EiÄv€[ïË}!ïY¶_ßÖÇ\¶;*¹X8€œ&å‡ &®ã £bâpöG¥Ô¦ÛF“YQ›Ânj«Ûî»m›½%È47j^š£=–fi©J XJgÙ²+ކÚå ¶xN¤­ù[3oöû¦v ã]ÓNöHà‡#89¨À4$ dÞQë¦Lƒ¶¢ëºé5)Ñf 6Qkþ [Ë÷¯4Áñ"!N¨ŠgôýõŸÈkݼ¹zsýé­mé4Ø ‚x„[FJ ÌéL{[¶”r9Èã‰E;ŒÚ¹iZEb蹫q;ª$ijÔuÞ½½•rK"íoj÷7Ïö÷â„ÊuÓBäwßÔ_O!DO:€*c\éÑçƒ*%Óá°Qƒ,ÌÒÌU鋌Iñ¶ÑvaR7¢«£]4㯭i[E3Ã$訽*Ž0½zÁGíKˆŒW•mL^ßYäÖV7-ÑX<õÑzq§Ö·CÞ j4éz3Å3õGx®ó¶U%/ˆÎ™.7JŠóKjs¦!‰ºøÒj\•LS•ä¡îËÊXú›m|÷lm½z¦Ža¾k,“-¥¨Üiß5m,(õE7?ctAS ³p„á ?x¹¯1v¡æÇ%ÏORV]AÒÝa½Ætê¡¨Ž†KΚÚ(3‘263ÎPQN;“ˆ-–ãl‘ìDÕx×åñŽaÞ¨íÏI&C$Û6D¤ÜÁ´ ëÆ#XhQƒ ý«€H¹w© çGçíÄÉÍGc+ÎàÂÓ¸0óÂcü Ï A4Áô‚9š÷©é¹œÛ²±[Ý”ñ’"ä¦3Òo–—ÿ6…ÅKG°¨,#AÀt9I‡(£l:8tÜ›C¯œ%9•ÛsoôíËgɵ(¾¬‹{)n~X¶â6—çdjS»ÛO³4Š-§ŠqߥԴ+5’¡Q«œÜ Q§b–ÒÙ|E7nuspÿ‹Ã+¢[¼ z1††m´1©­7&‘éNáŠü!\2˱† ‚Ë ÜbGX–ÀÅÒyàݾèïMÍ‚U@ìÕïˆnáÏÅY»$¤<ÖO!IfÃ4]‚Ô]sÓü E„¹gT 'fiµsK®Ǽ…=°û¨–™¦V…=©)li<„MÅ0X ”‰£"䆦–»áMp—u{"ÃDdH)›#]ºd ¬²«4+ß ±Ð¼CÇ®› «ÉÿÝ4}?KªæÞÙðUef¿ET¦u#Â^7âŒÖ˜|sz]5¶‡'.ÛVÅua¸t)Øcè1.²ŠÔLœ.Ó»‰º L +ƒã9^(<,<둜„“d!=RL„ZŽcï§µÒËþ36ô¬Ô w)+¾ EAöî©6 Ìö5»ÕcÙxÂV¦G8Jge78‹ùÖpË#yÚ] Ùx0rÎ2B©bKåpSLð5ÁÆdX̲Ÿ¬ GøBeY> endobj 87 0 obj 3178 endobj 89 0 obj << /Length 90 0 R /Filter /FlateDecode >> stream xœÍZësÛ6ÿî¿ßΙQX>E²“vFI”Æ­_¥½\œÉP"dqJ‘ ±Õ^ÿ÷[`’ršO½Ëc¼¿°X,v ПÎ<æÂßÇâGœúl³?ûD<Å> æÄŠæÌ‹¹›°=#D +EÇ)ºH.õF°c¿žUg.ûáìýè”3׉ØÝ™;ŽbÞœý “Gs'˜'iš’®¾ã%‰˜"pæ@lö웋½Ïž×²·Ò^rÿçÚÛžÿ ‘ËnÏž®Î¾y1Ïe«­q4úð'ðXâ~*þølµgïÏßü|É.³ê¶Ïnù£lõãÙrEË“c¥ùð/v¤ ¢Ð¶X¦ù† ÿC'@p?‚uˆ¦’6•~ŠEFÒHøóA£(kðx‹¤µþÎÉÞ8Ž“ vÁ,Ûëo6ÙdÅÜz1éx1îÄ¡–ÿZ]/ž­Ø#ö8p]v~sþÇ»åâZãÿhêÕÕëÕËüç‹w'¸/¯Þžrñúíjy¢áÍòÙÕëç'V¯–ÿ¾z½ü8”ˆ`-ÌwG+ÓõœU(Y ÷Ç«].š´ ¦h$SHÞŸŠxq}õJÑ<ɳŽwÅž+Îç¬ìù÷‰OŠªã 4N|'€5¹^ â(áÏ›GØõ„OB(CŽðD.ZíNhð8‰”çÅfWwõþhXkÞÝq^†ÒÇpºã·Öˆ¬å¹µ5¶å›ºÊÛ™ád•ÕµÛÕ-ÿ*Aûºêv¶œ¶ã{K‡mSïm¹–Ôm¶éì¦l€øÄÌó,–BR%+çÅvË^Éa~ÂÎ7YÉ«U[‚/Ì»â£\ÿwÛ¬lùƒUU‡_’k­¢6t ‰´)ò‡ÖHæÚ4Fâ×JŒ¢î j/®—Î=ÖÜ‚ÂpIFe  8žÏ]wÆ(fÑ4úà÷€“գ硫›DišD¡5Luž,çnCàäh¶}i8[žu½Ý›NVIƒ~ë»på5²è¤õ,?A°ãåÁ ¶.?[B÷xì©qõ~_[CÁwÖ%ÔŽa¡,y»º/­©U ãamlhp×|z·½‘½ ‹f ޏ¶+ºò¥HZJHEÓÑóÀIâê¸mûl†ª‚ݨÈ6›º‘G 8šð&mÆ7]&*ÔüÄÉÜ™ÏC¸E„äOK°TX&Êóh«IUnÊSKí6mYsô‚}kOgw„+/x¦¨òŒÚPBqLwJäQb•´¾3¦š‰–VÀݲØÓÖOÍF#óA¡ÝaÚpØJÜà–-Š!QÊwÛeÕ-gê=òãÕ­ˆI±õ‚%\øàÐd#«Ç»šù!$¶0H!^ð{´,¢FΪ!éAdëö»7A}×ZX%=„t Çæ0@zÓÀé&ÜQsÔ.†ô†bè7ËË%¾£‘†E«DJÚi+[’áP[S GÔS£%îÈhXعRKPn¶Ø• ¬_L²Ž˜ ‚ÐMœ {IÙu{.’ŒÚ/¼E……P¦¤0Þ³÷Q§.bÈmC23=2Ìóˆ6uÙïåÛǸŸZ‡¬#¦Ã‹ì¸óç¬)„\Ó&7„f´ôk8Ô/•5"ëËúnûjC÷!R93ôÚ 6™›$´†4¤+:»`Þ(r7ISW½õ=ÑîÈW{iãï-üí·ßYè‰:|轸¾¦'\Äïí±%ßv^Õþ7nsÐϕ覸m²ÃÎÿdŸÝû~?qåp¶ÉDÝ“‰Û×÷ì ÈÚuLÍ( ,-ý×Ü1…²9ÓÔKÃáÛh Ÿ¨ ¶2H¯! H«§‚˜#¨ «Qê)Aõ£Û-¢\áé#›ðS<´µlKسAÓC¢±ðEîÅÖêo¯»–oêü>éi‘ë,§öĈ÷S6Ø¡÷Àó#ñç \¤¦BA˜é³Õ$Öã¾Î±3èv[·)U°NÄy®:­,mñ»2¼§Ó¨ðBÑmk·6ýø}'žèr«íXWÓëCä…`‚Äõ}U!)³Z朞QCRŽÁŠêx¾^dï-9”|MÖxÍá´›ìªr-"*3ZÍȬ&‘†5Äóc¤êø-g8F—\¶ÿ~µ8HÔPRŒÅ9¯,íéÝaj)¸l-¥¶pÊ»¥L½HËÔ‹$¿ÕIÑi†åí¡å,¤ÎHzîLÓX©j <«Ì\<³š†*m,=èÛó¡±kiž[˜IJU±)š iñböÃò„Éàº{Údž/L&CšX}Ê:‚ˆÉ“Éࣵ$UD"ZY[¸ír3™ö”©ÙƒZlJõj+!½ØÑ(# ïºAž¼'uzèÙ&Šƒ‘ÕôÌ=8Ï̓ÐÚn2âÔUy´ ½Í"x¾|±x{¹²8ânn¾Ø[mï?Øâ+{nýj‹P½ÚRWQ0ÛX¹Z&¦¸cL”D##iÕŸÍ]' =/_³Ó؇øeò‘ ÆÏÝÀ‰ÜÐõÆ®x•ôÅïB@3gÛ³OÐ.¤¢“‹öPG¤CV)X¶ ’ ëíê}mô½]Ïšç –ú¥˜Éäº/‚¾ÀɧôˆŒ¯WHˆôOLãæèdö Wdw™hd3¾ÆDÐ?h 5«f)uÆs+mì ïÏX»¿TflbcýjÄø-uîyŽ—ú®7§CúÙõr±Z²Õâéå’uìæÊ> endobj 90 0 obj 3072 endobj 92 0 obj << /Length 93 0 R /Filter /FlateDecode >> stream xœÍZëoÛFÿ®¿bá/veC.ߩ㱕Æj7²Ü °€’VSŠTHª¶Ñëÿ~³O.vu8 wnÏÌî¹5b&VÐ4¥šU(MÊêƒþºBÊ>~Þ¢K°z°Ä|»•Ûcƒ“†%+ìKF ’“Ç*]Béq[в” á¢[Eü©UæùfŸìmá/Œ±¢ï;Ãð]ì;,/NÔ®¦MÌrr®UO.›Õ¿ïhñt¢YYLNëjrN—“sÛ¸ Y­vÌÍhÖR'úÀoE‹ŽóbA QÍÓxWÒt¯ê*ü#=ËÔBQˆƒÈ¢Ð„¹‹Œ…á8€Éµ¦5CãÍ6¥e-™Ñ4ÖB<¸vÈ `!YØe[A¡%€Ñk‹u"¢Ó¹~Ô¥LdJQÓ°ÆAìYvK´‡Ú‡u|H‘:³tœë¾>Ì>& U< °‚ýb&IÒòÓˆ©nØ 1"³+ËH'"S°OŠ ¿IµW)Rá´}«hÌ‚µëÓŽîoƒigGŠÚÉ1v®°µ¼mÇÁ.ÛˆŠ™+PéÙCD†ÈA]|´][L' Z:‡¯¦‡Ctxv5>?ìÓô€Ll7liÂʇð7ø<»™LF—Ó¯ç§ÓQŸŸ`ÂÜ{pˆ0ŒÜ]Æ£³)Jã²Êâ E&W?#F•[õèjr>š ÷¿¡dq÷ê̳C8+)Ì+iQ%Ù €Àƒc @W¶Ðôn»ˆ›š~÷TkÂ&ÕF 8 j’5:v×úrORJzâÐ%¤Y^i:ÏÒºû’cš>]<ç_‚n· QÐLÒlW¡8-s”dˆ~ßÅiR=¡’ÆÅ| ¼EÂP¶|»¸Y  ÇÑÐaàÊ~hHlø[tRËЉ¥mâ««Áï±Ô™Át|HQyúâ…â°;*8!… ÁþIäë¸!-?˜ê‰?®,#ˆLÁ>)ƒ6‘.j¯RÔ@ÞhÌ‚µëÓŽn4ldGŠÚÉy ‰áÀät\y‚½¸¼M¦èârz…*ôëéøft €1D|ÍÞÚC2tî×€¿.phÁUßfÈ%­ßüÂ1®B×£©*ôNÙŸN~1k×?ŸŽÇ‡÷èËÇÑdÐ]lÒ5î„8ò ŒÜ'ÿñc0ŽN/ÏQ9Ï Cź÷/@&ñaYx‘e…„ƒ/kÊ@$Â6Ã-œ‰ñKAÙñsq]þÈ›o8)zk# %9Š0¢ŠÃnÇ|öε±|©(qZäÓVÓßâ?b\~Oñ©DT.ÝìJmbFëp 6rE•´êÖ#pZ ‘‡e¦£?®eS³ƒÊuç²DØgw,ÛszœäÅ ¯a0‹þ¶˜Íñ§ó÷g|\ïã2™?[@âUW\ºFë¨àþP–Ë“.™™½Ì“ä–ò:*tÔN%¦„”Æ5Ù¬G7±°9·Æ,ê ÛK1¸.Ko·i2ç7iŒÎòìE¼â³Œ_KöهंCËç›PöÉYz(èS¼ÀR¥Ï±¬fö@UÖÙóšvß„÷Ž÷àËò¢ÈU€€4{!7–¦ÒòÐ¥nØÞèÊÆß‰Åì“èïzÒEíUŠ;MO4º0R´ãÚg©“"ùvN^Ø` ¦,²0´\¹¶àçº*Øb€9p{ЋÛ?šðÿãÁeáØ!¶À2ÌeÃrb·Ì¬ÁŒò[/ÞŠºÃÝ„¡NǦ}`?bK€ö¯øÒƒ$Á2Ã}в?òŒ ÑAõüÕ±`Â,úŽW[|ó-è2Þ¥b ]2.ÉM`yàÆÛð”Á8¡_÷‹®×Ç!ø°‰køè·Ã÷„wýøúóøë¯§“³§“¯ç£§7ãiψ<¿§ºMFâÜ.RÕlº;bYò@î^õ˜‡{]·ÄÛÃþíÜÁŠÛïU¼ž õ Vx¸zÙÐÚ«  Û­èÒG:ßUô†ß!î›\ÔZ³ßµ øjÙp:”77žŒ‰z¶yá€áÂlñ\/â_J¸®Ü.#° Ûuηkɱç@ñ¢#ø|+UKCf´Ç&­Þúkx©_0¥@?8™¶S–É*c:ÃZø°Næëg<¨Sõ¤™é,^ÈMS¡è>ÁºQ+ME¢·Z}N¤1_•©+\ƒekö&K“ßëÖO°]ÆšÞÄÙSm šKå·ñÊV;) ¶ö@+š-hm9Yî3šÄ°ÆËЃ.[›éâ§:¸¨º ðÿ¨¹}Êù@+r%èù®(ä7çSš­ª5ÖütÍÃ’ pÖf˜W;Ôä*Þ*yVÅI& *D—7ã±fdÊÚ£:Õšñ˜ˆ7©ý8§}Y œv–`È›ø1Ùì6€¿LK~ÝÇ]ÕȃÍÑH äËèHFÈßTmìªi'è8M †Ï‰a-H²yºSk@ˆªu^R“+Ó@£É`tº{bh¼s 6:­&¶dH£´ S³F=†óžEíYA+‰ ð³·P‚Ûfèù–ZAï÷íý±¯²U|Ü0¿™ˆò°ü•ºK˜]»å°ÇVãkÒKß<ßÅ– cö§;q`Ù:¯8màçÕDP­Ôh’r’ï]¦Ù¢¦‹|èiôÖŸ „lã$”õ²¥i]b3®%$gÒ‹Ü #1\Æ5 GÆn]¿•ÉRöøÒr\Žž‰šÈ‚O²2YКc´<¡j¾Ï^nØŠKƒ6ÔØÉ4{ ™qÔ´\Á‚™Ç¥Á‰© h£fBÐüì#dW7Ssp]ÐóàÆ×LÛÅ%SÒ7÷ò¥ÕçÛ¶}X ú9渊‹ÿBËžçës†àêÍKðå–Γ¥¼Àžh±ø|(è— «[+È/Œ‚“k°ûõ“Väæ7_t\&ì+ŸÄ‰V˜ÿÉÇbßu±C ¿Žz@ViÃû7:÷fë¿Ð±|²®…ÄñoÏ€“ endstream endobj 91 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 92 0 R >> endobj 93 0 obj 2685 endobj 95 0 obj << /Length 96 0 R /Filter /FlateDecode >> stream xœÍZYs7~ׯèGikÄô}l*²-o”(R,+ëŠòÐêáhz·§{܇Ž>${÷!»²]ÂÇAÑþrä9.ü9¿’ÌwŠýÑjóœÄw‚˜š¢Øñ»©³w¤QêTbàˆCˆ d+F°s~;ª\çG¿ÿƒ6ŽË"çñÈ1G6>€ð(fAœfYFºúÌKS!"`1ÅÞùîbï;ï9Zi/¹ÿsímÏÿ?ÐÈuîÞ¬¾{9žë¬·Æ² ëÂOà9) üLüøÎzïü~üñÃ¥s™×÷C~ÏOþpÖ?¯iyr®t þ&LzѨ# ÝqåaºÝ´Â¿Ø-Ì`¢«¢M¥ß¢C‘‘4þ~Ñ(ÄÊš<Ý"i­¿RøË»‘ÐÂÒÑ.ø‰eû±cýÅ&›í¢­“MãÎêíÍùÙúÜ9Þ 8¾¸zwþO ×ùžû¾¾²@Þçw¿=.¼Û“ïÑ& &ôݤ‚KûY0S€ vQë<þØú¹ ØXuÓ[€óA½5¬;ð¢Ü>›†¼64êÛÜÀ²Þð' n_P£å_†²å¦¡©éZöÝÉ›ÚéwÜÙ–m×;ES ûÚi¶²­*»žÍ8„> ’'_­ýXûñùÀ[qþUƒÏÜ•¹¦öCÕ—§$H5ª%"z,«J°”4"¢á É/oKÞiÜïò^ƒ¢©û¼4þÕ”µÚ´š|È«ÁbÒÔ?®i´ŽBµ%F,Ú¾µ§ÏL…ÆtrÉ»Ræ9ÇŸåFJ’œFÒW×kEnxQårw%Ì7›²/›:¯T 0,ÊÍ0jáOrqʵIªß5ædÖ áPW¼ÓèÙè5˜)ÆôÄNZ^ÒÏÛbgDVÏ3+ı±‚Ôé"XŒ>Bd7Üu¼7XÚ•hܤ<3-ïåæàOùþPñ•ii›Çn™¯%^† [bné²Ë»ÅI¿Þ\ürvóÙ4ü|n[«OW>Û‹¨;8ñem¯¸¶å·|îLIjÌhöPÄw&©®„õ?+$ƒ Ø”uÞêu±SSŽ"ÁDHa¸Ýé1Ûf¨7 ðí¶,J^÷FƒÇ׳ôÑ£™Zé\R–>Q`e13J棣@rªÏ¯ýc£H‹£Ä¸Kñ²Ùdœ¡'à‰”$†ô#¾hágÊì·ÏoÎ5³*‡SÅ|oÄÛŽ+°º¼fWfÄÌ3×óÃh´úç—çoEô8Me´ äOܰµ[3¾4cUäðF‘Ã3‘Ã{-r¸!s£.‰–½~ÃÞ^_/Æ Œ_›~{´ xhnyÞYÚY‹¡ìæ+Z‡Õº®çº‰›þZÃCÏ ìy@ÞƒÝĆæø7$ ü èå‡C%b ¼Ì+Ó³[؆ƒ{Ëf¸b•/Úκ :¤I’-hôUÛCÎõÊôÛ“¿ë‡·Ë²ÐóñÎ? a¼ÓÞ‰RG³4€‹&ð&pXÀʧ\Í¢7ÀÞ½ÆÙ¸©M6‡ÊsÔot¹ÐìMŸêZFìÍdP“ª§Í„«±~˜ŒõñCKþLÁ×,ý1þDŽ­“Õ±wäŠFCE60ÕhÔð & =o¶lol¢©lÒf´aÓý™j÷Ue¦ÖÁ¦™q¬ªJ:9z>Dœ(òáøf*Å€Ÿ[pwypðÜapÄ£%£¦¸€¡sËùhz”'ŽˆóƒªäÆ–ä,‰à2…œF ¢Lôo޼@Ögx±‚p¸fÖg‚ì±ïˆ|Ðòý\Fè³LȈÒèE!oHÈÙ"d1nùqÄ’ì ¦ôÃ*䛩s|ÏkÞÊ7âv¨L§ ²HÊÚ’‡¡×´JehÅX=AUOn†áé\Sðšƒm*ë{Ý¢sÝ2" w™CÊ}gÍ×okl¸0Ó ÞR}…pÉÀJCU šo^’L¬é3Ÿ=A”iM'£¼(ÖÀu@4^`Ëæî¡l1Œ¹#¸¤ÈYáÙÜ6›¡àà¬Æzñó<ÍÏ2–¤ptâ(EtíjËó~hAh>ôÍ>ïËbçà”:ÝŠ;‰ *â­úPòGqëlY¬¨xÑ“jâM¹Ñ†ƒJ2™+øž¨ÚŠÕSµ4d®§Ë·rî\^ülåX„m³—æêú¼íUÍ®ë[Xþ‚¼0`)X>óUáïBW‡NƒT¾‡è-›ÒCicЖ^¦\ß¼;¿1ðÍgCSVh°X‰´zKÐå{ é'Áî›A«£ƒ«5ÔÖ`éRx"T‹¥ŽjÌÀ‹~Yþ¡éºqnÑ(šX9èŽ(V*^š W&ÔF³½ùL{ãbU£>dß½ ¥˜Ÿ Y–¦®GP?Ȭø×¶)8èk+¾>À+£ìra Åý~9œ….ÜeâÞˆ‚xâü¢Þ”‰$¤†Å.¯ïqS±AUà2û9¢àÖ§2lÂXA:7¤JôFM˜cºpÍ–&mf×»ÒÒ`ù$¯­yÉiDÕ)Ý7ßôŽíØ|tîh­"6/†!¹OåDǦÑâ™Ö•< ðÀ;]d;pH爧[¦,‹!Ñ$‚€¨·ú¡úÊÝ&>K£ÐuƒÌ›;ä¬ÚÊj0~ qG…•IR˜\)L‡VXÚé JóA·T+Í¡†ãq$ÿ2äUÙ?+l^â+#·¨† xÑpñQQWŸ./-¦ó}…ƒ6¶„(½ËYÖ“ß²ªC¯ðVq]Y +Çh#«…eÊ/óø¹BڔƩŽÏ䊉©ö¯LÓäØ&º‚ChÐG#Q_—Ö±á-ÅhD˜ÀJÓí‰i¡DpqeèÉnB;.žg£QpYÕ½=è!oKqv¬&[\®ärs“yéÄdúê¤Zmy¿ëáLŠK^öêd⇖oÊ^ÌùEÔÆ¨Š=Åx‹óªkd,WïË…­ Åc/Èâ, –B*ÞŒj ðšªóçÎjлe®Cn÷›ÈD7ߥš¿QÛÓòÑýL¬,¶XQPv‰°2«PKÊû¦]ÙwMÓÑyS"çæ‰ü‰yƺ&®Èw¥ülDÌ…€ŒƒÀîÐßЫ`¨–#ü©ç5w¨C1Å“CC­HCÚ,(ÜXzÈò*¼ô õ­DI£oH$¯µÆ }›[-'Vç}ÅÓ;¯¶}0¶ÃƒÒ­ ûÆ:: ëÅt†k ,·‹Ç§Þ0n¹ÕmŽT@w“€œMÒ×7šT~f8ֆϋÝ\ºiÉë¹eÀ/Ç–Q7UjÜ iÞjqˆGò°iŸ?0ækÈM¹ÝÂÓ¿îY’°TG-ôíýõ‡&lYï†{K¦þlIø¡’ú𣂎ƒÏAð³×¦ý¶ ×bϘRï~üÏÑÆ!¨òéÀÕ #ïtD–b4¶µD ·nlV†Ôy%Ân(,¾¹Å’<Á¶©*õަ&SΦu”Ѿ/ð¢Ã47¤ïO ),ǤôßÝ®Wøzð-EÅ8HXbEQ~4¶kŠq¹Ej*Y ciLM•¥)¾¡H&{Íñ¸Z7“&°øD”¯IYÃ7*Au±"ÁªÔYíT©3–­]›Ç·Ô茄§J¼R ‹Ãˆ¹ Dª4ILIëôÔY¿]®ÐþoÝŸoíó endstream endobj 94 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 95 0 R >> endobj 96 0 obj 3131 endobj 98 0 obj << /Length 99 0 R /Filter /FlateDecode >> stream xœÍZYs7~ׯà›å”Ìô}Ô&®’åQ,—Ž4Yo*Ê5ÓÒôº¹»ÇŠþý‚¯î9“—ìj7%d ‚(9ð™ÿ{#¥yÀVõÁ%óY°0Q¢8a~Ê/c5SLg¬’G¤œ¢È¥j61öé 9ðØO¿ý“ÖÌã1{:ðfÊIÍÍÁÏ`e<ÅåÅ}¶« ë·w_¶E÷ÌÊž­Ú¦/×EW¬™`}ñ(:1zUýL]4Íšmû¢ge³.þ€ßO›¢aæxfÒT|e%Ïeé©eWÂñè΀¯÷ކ DÌê-IA¶vÚf]%ÜUä.hä XœE6 &‘Å5søÈ‡*wøIî¢G¦QÒš1¡ ’v…ý¸¾+ òO²æ›™9¬uC´ÅÐvGFYc>V;>öÊ„!iõêkMáÖz[ åc5Lí $­ÌZ¥\žÜ^®Ü#Éô¼øÀóuê’¹ž+\¤ é7ΟAÍ0N•+žá;‰`kƒ¢5”u)Ï–õeýHJ|×>YfÕn›Á²2ÉJ÷ã²±4mbîÛ®vÌÞ[Z¯ Ÿ® ˆ=žDË8Lw,ÆX¸ùO®~¹\Þ~wûZK°&*ú üÛƒ )PŸyñSÖYJ&™bØvz ÜÀÇÙD EWô3¬¬ëb]Bm©žÙ- ÀñU›€ÊÖ-ijiÈ•Ï{¬Äª€ºÇ.þurÂêv]ܾž—9À„<%»Ó>œÕÈœoÅ©®¸Ñ©^ŠoÝAájl«míÂ&;Ü‹ëç)OÓ@¢Øt‡ïvc£0•õçâøß·‡?µ·´ÁjDï±bÿt›½Œç¾„ÏI²Ãð( ë}V…>‡¤ôøï¥•Ì·+&/Î.§+ B»˜:-ÁËð;€ŽNpßç‰ÆÞˆ5ƒPbGP‰Sp>!ŠÄˆW~Ž•¥ñtOìE!Ç5'Úhðd$ØÃ¸Âù®ê`¢{ä‚P€{4U®xæ…+Ø'0?‹• mÕˆFè‡7jLè§íÓè`(n‹o´A˜ÉW¨bX;½ÖJ•³PH¨1x§”³Æi¼< ¬TÞaYšÍ¯¨ß0JZãEI;b „%§®¤-Ê@Ö¤»mQ6eó`DïÏn–g— ¢K£í§ë«_þi¸w¿rh­[_Ûrm lŠÕgW½¨*ûÕÆzðg~Ãi8‰!š$q€b°3±üe;¸£ ‚§¡¢ÖLõ$žAÝ!¨o_rÀ”Wb7ÂÕoIS4¬¬+D·®ŠÞùäÅ…ª˜Ïr7Nvóˆfñ$¢fOñ À¦rË,7Ôõ}ãP®¶•è¬l„©ŒT<>V*ÍH@ùAôJôîPé|÷´)©WTj(W” ‚Ò—Ì ZF3-Ê!¾*©T:gê}×Ö#-óè¢G¯<ÕnÀ½+õ­Ú¯Øjß=Ënr¿*˜jjpJóÌþÓ‚¿p®(gì=ŠÝ7bUjóf„~ÎyÿE™ràgÈ3¤îÚ##P]1¢a,§›Bâð¶:„¡œ#cZgqXˆÔÇBYj I·¶5ƒ{½ËSÜ/bˆvo]£ÊH4 ¥«qU̓hrD ÅcÓ7+Z%1îûjÀc7p" ÀÕó‘• KšG,UQ¢M ÙáÇS;5Ù;áLÕ=GlkEO–©‹¢Ö i;/Á!ܘã`ɈHo”û ®0N¹ü³E!øŠH.!09)¤Iæ¡ÐŠ8ŠŒø}Þ"a~Íl(ÑäYtîOägÊ‘ÈO @ü Nè—Ø©ê@ëv…hPvBŽ]Mï±n9ÕA¤Šá/ÇÚ(ìÓ(;N샿FK%‘]é7ÐW˜ÀEèËR ¾Þ¼‘¯¯Pû*O •1,_óÄÍ"žf)³|3¥ÌçÙÓ®yË^¾š©¼ç&q>S³<^.ŽæÊéèÉŸLøÆUù“eŒ¨®ß/®Aá»:=½Y,Qx~vq¶üÖƒ1„6…#í{y>Çœ‰Ç3SPˆÑwÀbÛf÷4òÒ°Tñ”JŒ´+xE*èú'Fc úÊÖ?íÈ^Ö4Λ}#,I7öûè¢Ö6ÇRQšN∯•Χœ !w«ì"£…4\Þ«Ápm·.ºÛ×Ü4#•Y?¶Ý û)…PëïŠ]_ Ca²®qü$ÜÌébyòaǤë«O7†¹º<ÿU½I–vva¢,ŸD ÿX äB%Ù—ÃVh˜P')ÊI!ú œ‡’€@#´³¯ôÕ*éÇ®]ØÆâ·«pÔÞTÏ35Ͷ¾+º©ýÎZì‹Uy_bËh`:ÖáœO'.PD'q¡"ÜÉ(aû¡kãy"ï¶eµ¦6‹ B!ý´i+Ë©÷QÍöÅpäÌ$üMœ‚WdÀ*Øl°Ñ"Nå%1¢ê[«¬í>Û!jJ‰–ð·°ëÀúÝ;NÍÎuàÁžÇÍñï_™©›O|ŒQWäÐQ¤°PÅjÒdSThÎýŽ9÷e‡p4va3)7*…&ä2¹fÎLÏI“:ó¥ê/'Z£Øc(ZSCRœÖ5/6è)Îý÷‹›“yì‚x;ª~Âýq*+Õ.¢52F·¼n¿õT…4‘Û6UùÙíÛÚáZY´,{ýþÝÅÍ‘åG/î(Á—|ÃÉ'}Ë®ó­£vÕÂõP†Ç]&n–³ž³a¼0O™o²Åƒ^6¢ƒ@ô«¢ÁÃIeJž}o3¹CÒö¼NÆ€’å_¸üÔÓu’ {¤‚¯*;²ª´#M7/ÑÅ—­¨ÊáÙJTUGº̓£ÄýSÝü[~ñó/Çç´$øézHæÚ –Ž/Õ-ð’R—Ö7 šk®uŒ2P­´™G*õ'‘’ZMˆu•BÚˆV?”€.œ¿ºúr€v²Ë¹˜îzTÝ3Õ&[­°¬å1=bƒ<Õá5²}dpÉÈç@†w…<þêRÓþÊ#vâeØ@Á˜l§ÂœGò™1µSr’G“4ìwDÔA8ŠØø=Ú 9?Œf6”hÜÍìò'Òí”Cíï‚jœfŠ­Ùén¤@u7£(L-ù(Û³·YV¢hÞ&QÿÊ$ˆœÖáöpy¼»µaøŒÇzšg³ÌM˜GÐ,¤‰—ΚýÏWŽÙÇ«³KùZ}u©4ìGõhíëHeò[†©eO“Ø b’(æÞ¨k“9ÿÑ¿“û/«Y’{ endstream endobj 97 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 98 0 R >> endobj 99 0 obj 3052 endobj 101 0 obj << /Length 102 0 R /Filter /FlateDecode >> stream xœÍWmoÛ6þ®_qßš-Kê]è6 ŽÝÎ…k£±‡®èúA±iǘ,%’<7ÿ~ÇQ”ät0tS^|w<Þóðt$Ï÷Š?/ÅG”¸°>8÷ÚÆ rÁ µ)E$¤1@+qC&;¢pÑ¢'­Ú[)·ðÑÉ oÏ_Ði”prè ¸ ³t> x/Œ“$Ñ\]ÂâX@x$Da}€WÓƒ ãBz7ìE úŸ³·yÌý0¢°sF+çÕ›…Õ¶-$ÀÄR|<1ñÜD<.¬ðùbùa³4ßÓþVïœÉJ/OΕäâoDduŸvG¬ 3öÖŠ>ñ” -Ä pb(Ó/UŠF d’Ôç£IÑ¡¬ÉýW$³õ=Á‘‡wÞ‚›X¹ïÖwNÙà- lJŸ±H¸&‘ø –;Gž.~DÁÅ¢¾ÐÊa‹ü0AŠJB‡H9dÂbMP:m©’€²$d}Æ"ŽÛ†t»1ÕyÒÇ:`º{àH¹mëßæÐDóÞjKC¤«yP…O‡4þV¯\Iý…›RK îT…P¤èªË ðYNf“«üo®ïau ïÓ9¬F°Àÿ—äj1sá'Ô…Äàã/“뉶{ð3ø.çccû«Y<ª€-lW‚3¦Ñ×ãÉ5Œ>™¹ãÉò fÓ÷Ó• òZÅ8³g(x ¡bËÄQ¬¢Ž5<‡—>ñáb¿5b}Ë|äåƒÑÖE^§û¼2†47"¿?¦Ù¾î8oöõ¾h],1Í „)[ø|ÿò59;rkø,»:½Éø khßR;¤–ßí¤»’¯ù†çkn±Ù r°^¶òBøG„i¶FÓHR¾áF> endobj 102 0 obj 1140 endobj 104 0 obj << /Length 105 0 R /Filter /FlateDecode >> stream xœÍ]sÛ6ò]¿}Hæl„ß"37ql§q›Ô­¶s“ä’ ‹ E*$e×÷ëo]|”“ëKï’´Þ]û½‹üe²þžªó"b«Ýì ÑB6Xœ)ÍX8çY³#$OsV©…P-!0ÖTZÈ–ý>«gûaöá,Z³€§ìaL˜#›ÛÙ{žf<Îò¢(H׈‡y®DÄ<`µc/®v»hôj£½büϵ÷5ŠÃèÿB#¥“޹Žzÿæ\‡~ð!M‚á/-,ÝQá¿„ÇH R®>U ú©>0Õ–áÏ'-!VÞæ±_µ‰§ð€ÝÍ^-f/^§, Øbãªh…çQ¡þDl±cžÅÁóOlñãìr1Ɇ¿Ùe“(*Ùò Â" YK†Å, †éŒ*²4‚0E»Î·bßË–ÅœÝÊ®+›ºc¢^³E+êN¬zE@Ë•¿^¼•¹ÉˆkrðpM‰ëëV‹æ OØb+Ù›Û÷oÙ…¼—U³ßɺg?´ÍaŒ5Ó`Ä2øm»mª ¸,Åê3‡»"ä ü«ÊÏš„:>$ÙæÐCR3h˜ùS)ó”ϳ¢È‹ÀÌØDâ|2ñ" óal[R„[ò»¦skphËi>íþk9Ô©hgcA{´Yžöæ©ãÒloøÓ„ã#[œÏGžò”^Ê;ð¶î[Šõíå‚}–PS—'aȸýäóyŒp$Hc^ØâAäì×ŵ= ‰F†=:JãmôÆz$àƒðâæ×Ë“To¡:ÅÍ·qí{:› Ø@ŠÂµv”¥§²ðÕ¢>:uT…¾8âÒ$ã1ŒÓy–Îý»Èiœ[¢Ànn(e׸6H´J]¡=*ØÃ„{®µü<äæòìÂCQëÅå÷ˆ‹í` e„-}å1É×åÐQ×%¼ûãÅ«sóJTL/¼Iš|õ‡¸¼ûRñs{é4û'æ0LŽpPÒç™ÎÅåRä„ÓÙƒ6fBžT1„–”Y¤yvDÜs¼‡¶+Çp¦j¹až¨ÙMóãó' ‰Õ—­hä_µh'á&‹ç(µ¡L˜fä<q¤!M€Þã"¥·¨•b}ÚÔ8" nÞN›ˆR ò´{³”§E†GG´ïÞ€ØkúñÙ²i*‰jG!MEôí+ŽMB>Ïã¢ÈÒüˆÏçX$¼jôØ7øÜ9ÂÈS—çÑHVYß7Ÿ¡r´ñ¸ 'õ¤%ô9ªÑ¶„ ¨ÓŒ®X‚y]oÚoRè2èò4Ný~Òs§ë-H1%¤wʵ…_XH7›0q§ÂÊã”H  MÇÕmÜ6†Î£•8×!²”>gsÝD‚É/£¶qpCxpÕCÒ¿šƒ/xê>ý{ß}3 ÞÙ<:dèkcAÿôW­½4eâÇ)ʇ'ßÞèàÑ­—˜»ˆˆþ¸1bçYYî$·dd(äÈÔmQ1r›Š*°ìºÃÓin’œåPHaØ„Á&€ ±V#Œê¦Ð!Õ´pöóíÙùâêúgGüçèV‹TJ 4Ù–Ìåß»¼ÚÂﳚš%#ÝÆ2>=ÙŒ`wžóPmQAcÛ…ìÕ]ݼV»SÏÞ²[µåœ©æôVÐú9|…¿òááA:ƒŽ™†y‘‡…¹¥ÑÔpÖÓS;þÚè7Ñ–bYÉî/ÕY’ð8?̇.Õœffõ0i$»Çlb âìÌ.TI£[ÀVÜK¦LOõ•Œ6KîJÜû ÞûÙrÀw endstream endobj 103 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 104 0 R >> endobj 105 0 obj 2439 endobj 107 0 obj << /Length 108 0 R /Filter /FlateDecode >> stream xœÍZÝs㸠Ï_Á¹§ìŒ£Ó÷Gß²Ù\›6»Ù‹}wÓ^îA¶i[³²”•äõzÚþï P„${{O×öc?ˆH8Ÿ¯<áÂoÔ?Iæ‹Õþê3ñ<‘ø"ˆ‰ÅÂKœØMÅ^H£T”jà€TCˆ 4—F#؉_®ª+Wüùê×ß`ÐZ¸N$ŽWîD8Š™_ý棯 â4Ë2Z«ïxiªTN Äj/¾Øûâ]­G›Õ+Aîÿ|õ|Eçÿ¬ÈÛ«·‹«ïˆ„çŠÅƺ@ä9® fN_¤Nàgê?¾Xìů×sÙ¶E]µ"¯ÖbÑäU›¯:Åxó›Xüõê~A{Õ‚´7ùð¿ÄÑ.5ø…îð s·žo¹ðÿÐ Ç`SêSI'Lÿª†Œ´Åðß‹"Qlòø¼´éþHå—& €ã¤ƒ# |fû¡—ýÁ&›œ¢Ò}y3î%ïoÄM€²ë._–²µx•³KÉ>42ïäÚ2Šª-Öl@΄Z·u,÷öÐÕû¼+V\ÆZ~åêóæ[*Õ•èÁ¡åŸøžÚÿ¶ÉãNVx¤ÌT¾;²U%W (oNj¢—9±¸ÞÔ¹%?$ÆGÕÝN2Øv°¥½¬:ÇòÞ²©k¹Ée7c3ìn¡wÃfä[IÑZz'Ë5ûÂDìå¾nNl ‹ŸHN€`Ét­vyµ•Lè±èvK¾®ëzi€–õýÙØIá %>Œvýd:s~¿óûùüáéƒx¾Ÿÿô¸ïïß?=ÿ]@æ…“ÝÔZI2²Ö d¹¾ ~m½— bä$Ð_=B> ßß¾cð§wOïß?,÷ïf—GÙ1S3¤ÙÈ Ï÷ïo·oïABâCífÄ!@Ï@z~ÿüpûøð5Úé¹`‘º`Ï#Dl‚"í-¤ª§Z0Q'·V=6¶5øLÅæ•%hc"Ä™„ÜYüß·K"º•”¤ûL•*/áöÏ,+gRjp5**ÎH‚Z¥øR¬yÉõRt³¬W8ˆ®ÈÒNw~¹%_›b!%/¸¸¥ÍÍB„s¸¢©OùÞ8Üê‡%œtø2 Çì¬g`M€ô.ÿ"¿1—ï9xÓœ?ØOx@HãÃOB‰Ò¬ç£}[‘ü¥ÖQqª sé•üq¸ÖI£x…ŠÂNª”®kQÕPßÄ¡ZÕû}Ñ©Jë£Vìs¨Œá1V1R,O‹@Qμ‡~;~BäN‹› Oe~ t|6@½ |ÝÏ© …†ÃAÃÐx<×pn_cŠê { µ¡ŽuóÉÐüå·ë£[«ÅäÕ` S#D)!ÈÒ8¥*üÐeiŒÞåͪn¤€Ë¡òǺ9gÅ$s‚(ËÒ( Äd¡–ꇪÂƽžGq±‰{ˆô­C2全ÐîÀÄ+Pïé%ccéìô H_,Ž}x“"¡Ÿ…gö¦Êã7žÓ@\¿SïÃíü¾g,žo?Ìoïªv6¼»§‹ç§Ç©Ù2o$úŸâñéîosñ/ñþgKÝ݉_®º£øŒ ¡ †Ðý¸ ¹¢¡K5u#ß½½…{RJÇÈ…Ú;ÕÉjÕºà õX‹*‘˜È]\L]' Õcj˜èÔä„–e“CbØ23Àj˜Mç²(3Nt,|èÎ i$„Іžž ¯Ø‰^ž.¨û$OpýÖ3ËÑ'ÅV¦RÆÇ¶Ç¤¨÷eÚÕ‰ü‘M#*rQ¼~üèÍ!©ƒ¤z+Hævæ M¨ÓVÕøc!í.oØ(5©/ÃE¨o˜ì“Ê~£§•ö»6xlTð·K×G÷{v15qŽLL¸@’_W˜cì!í’Ћ^ÊèóËÇ26–¿·€=÷Ä!‹2•G@õo±9Y<¬+Qxßq%¼“l'ËÛ4ˆ¶5×˜Ž -lð¤Lã}Ä#“áƒDÍ®±ðFÀ©Èèš×H°¶´1,¢œ 2ÍW‚Ô^A„ :Ô¡céUƯ'.„IÔ©ÂÌâ‚mÇØÍŠdú¨uN{5·åRÙªe‰= ¹'8có4=kóH÷¦da:ÞëlE¼³… _Äúm똑<îövæì‚TÛn‰¨%ˆ»Côzè.ÌcÞAëaô1/ؼäBå1õpó©˜+²­ži­@8²/¼¥y.`Î2GïDDâŒzAnÿ °òÑ >>}ǾYS"6¦$µÕ—¼, ý‘¦;—ësNGcbÖ±uR%Ã4^š‹J¦vôÆ/Ö±>”kHÛ[õHïÁ¿•3M}”?7?Ëý©•—„Óú= £‘ •óãKgªX]š€0_©´¾‡:‰½7M÷‘”>{ÈSOš«ˆˆ½p¤-DVí¡aR¸>k› û=gt­ªÖNžTT%@i65T”Œ ¥_üMI¿è­}Jí÷|Æi“ÔÉ Mμ¤Ë9Ž^•Ô›º*O3N©o³ªb—½\•W'^§žÑ‘eN¦þFÄõ‡Ùt쩼Æ4¹±N˜eš"Èê›"©LD°dÒÍo¾$ˆ¢|Êg[ éŠ è`YªÕ’w}™˜ª›[ºã»mó=CùôDž7²–6µŠîµê\K­ijîâ›DYš&ɰxÑycnDcûÓþ¾oÛû|„¥;.›ŠÇr¨|Ñô')_ÙÌ>ó$æmGÈÕÛ†¸Mâ9³Œåimd)ûË,yj4ˆ> endobj 108 0 obj 3096 endobj 110 0 obj << /Type /Action /S /GoTo /D [21 0 R /XYZ 72.0 720.0 null] >> endobj 111 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 680.124 101.98 689.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 110 0 R /H /I >> endobj 113 0 obj << /Type /Annot /Subtype /Link /Rect [ 523.005 680.124 539.958 689.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 110 0 R /H /I >> endobj 114 0 obj << /Type /Action /S /GoTo /D [21 0 R /XYZ 72.0 558.8 null] >> endobj 115 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 668.124 243.974 677.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 114 0 R /H /I >> endobj 116 0 obj << /Type /Annot /Subtype /Link /Rect [ 523.206 668.124 539.794 677.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 114 0 R /H /I >> endobj 117 0 obj << /Type /Action /S /GoTo /D [38 0 R /XYZ 72.0 720.0 null] >> endobj 118 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 656.124 209.385 665.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 117 0 R /H /I >> endobj 119 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.383 656.124 539.689 665.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 117 0 R /H /I >> endobj 120 0 obj << /Type /Action /S /GoTo /D [38 0 R /XYZ 72.0 574.694 null] >> endobj 121 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 644.124 170.154 653.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 120 0 R /H /I >> endobj 122 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.33 644.124 539.802 653.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 120 0 R /H /I >> endobj 123 0 obj << /Type /Action /S /GoTo /D [38 0 R /XYZ 72.0 339.296 null] >> endobj 124 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 632.124 228.09 641.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 123 0 R /H /I >> endobj 125 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.436 632.124 539.732 641.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 123 0 R /H /I >> endobj 126 0 obj << /Type /Action /S /GoTo /D [41 0 R /XYZ 72.0 674.302 null] >> endobj 127 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 620.124 190.57 629.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 126 0 R /H /I >> endobj 128 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.391 620.124 539.801 629.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 126 0 R /H /I >> endobj 130 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 608.124 258.775 617.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 129 0 R /H /I >> endobj 131 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.466 608.124 539.669 617.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 129 0 R /H /I >> endobj 133 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 596.124 152.844 605.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 132 0 R /H /I >> endobj 134 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.341 596.124 539.865 605.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 132 0 R /H /I >> endobj 136 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 584.124 222.815 593.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 135 0 R /H /I >> endobj 137 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.424 584.124 539.786 593.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 135 0 R /H /I >> endobj 139 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 572.124 221.712 581.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 138 0 R /H /I >> endobj 140 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.422 572.124 539.788 581.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 138 0 R /H /I >> endobj 142 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 560.124 223.928 569.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 141 0 R /H /I >> endobj 143 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.43 560.124 539.789 569.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 141 0 R /H /I >> endobj 145 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 548.124 254.128 557.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 144 0 R /H /I >> endobj 146 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.389 548.124 539.651 557.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 144 0 R /H /I >> endobj 148 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 536.124 216.712 545.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 147 0 R /H /I >> endobj 149 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.474 536.124 539.856 545.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 147 0 R /H /I >> endobj 151 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 524.124 225.587 533.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 150 0 R /H /I >> endobj 152 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.433 524.124 539.786 533.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 150 0 R /H /I >> endobj 154 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 512.124 175.114 521.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 153 0 R /H /I >> endobj 155 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.345 512.124 539.802 521.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 153 0 R /H /I >> endobj 157 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 500.124 182.857 509.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 156 0 R /H /I >> endobj 158 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.367 500.124 539.8 509.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 156 0 R /H /I >> endobj 160 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 488.124 200.55 497.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 159 0 R /H /I >> endobj 161 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.355 488.124 539.735 497.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 159 0 R /H /I >> endobj 163 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 476.124 144.802 485.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 162 0 R /H /I >> endobj 164 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.32 476.124 539.811 485.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 162 0 R /H /I >> endobj 166 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 464.124 170.58 473.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 165 0 R /H /I >> endobj 167 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.394 464.124 539.864 473.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 165 0 R /H /I >> endobj 169 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 452.124 185.15 461.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 168 0 R /H /I >> endobj 170 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.308 452.124 539.734 461.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 168 0 R /H /I >> endobj 172 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 440.124 194.543 449.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 171 0 R /H /I >> endobj 173 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.402 440.124 539.855 449.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 171 0 R /H /I >> endobj 175 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 428.124 189.021 437.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 174 0 R /H /I >> endobj 176 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.385 428.124 539.856 437.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 174 0 R /H /I >> endobj 177 0 obj << /Type /Action /S /GoTo /D [49 0 R /XYZ 72.0 564.125 null] >> endobj 178 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 416.124 158.559 425.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 177 0 R /H /I >> endobj 179 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.321 416.124 539.89 425.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 177 0 R /H /I >> endobj 180 0 obj << /Type /Action /S /GoTo /D [49 0 R /XYZ 72.0 476.631 null] >> endobj 181 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 404.124 206.656 413.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 180 0 R /H /I >> endobj 182 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.384 404.124 539.745 413.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 180 0 R /H /I >> endobj 183 0 obj << /Type /Action /S /GoTo /D [52 0 R /XYZ 72.0 500.86 null] >> endobj 184 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 392.124 207.715 401.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 183 0 R /H /I >> endobj 185 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.436 392.124 539.794 401.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 183 0 R /H /I >> endobj 186 0 obj << /Type /Action /S /GoTo /D [52 0 R /XYZ 72.0 240.55 null] >> endobj 187 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 380.124 182.921 389.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 186 0 R /H /I >> endobj 188 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.399 380.124 539.89 389.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 186 0 R /H /I >> endobj 189 0 obj << /Type /Action /S /GoTo /D [58 0 R /XYZ 72.0 277.41 null] >> endobj 190 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 368.124 177.388 377.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 189 0 R /H /I >> endobj 191 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.378 368.124 539.886 377.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 189 0 R /H /I >> endobj 192 0 obj << /Type /Action /S /GoTo /D [61 0 R /XYZ 72.0 696.0 null] >> endobj 193 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 356.124 214.538 365.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 192 0 R /H /I >> endobj 194 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.447 356.124 539.836 365.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 192 0 R /H /I >> endobj 195 0 obj << /Type /Action /S /GoTo /D [64 0 R /XYZ 72.0 708.9 null] >> endobj 196 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 344.124 202.963 353.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 195 0 R /H /I >> endobj 197 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.41 344.124 539.836 353.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 195 0 R /H /I >> endobj 198 0 obj << /Type /Action /S /GoTo /D [64 0 R /XYZ 72.0 273.547 null] >> endobj 199 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 332.124 188.068 341.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 198 0 R /H /I >> endobj 200 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.362 332.124 539.836 341.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 198 0 R /H /I >> endobj 201 0 obj << /Type /Action /S /GoTo /D [67 0 R /XYZ 72.0 610.466 null] >> endobj 202 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 320.124 274.838 329.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 201 0 R /H /I >> endobj 203 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.482 320.124 539.677 329.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 201 0 R /H /I >> endobj 204 0 obj << /Type /Action /S /GoTo /D [67 0 R /XYZ 72.0 388.154 null] >> endobj 205 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 308.124 257.702 317.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 204 0 R /H /I >> endobj 206 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.478 308.124 539.728 317.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 204 0 R /H /I >> endobj 207 0 obj << /Type /Action /S /GoTo /D [70 0 R /XYZ 72.0 567.897 null] >> endobj 208 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 296.124 157.281 305.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 207 0 R /H /I >> endobj 209 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.386 296.124 539.897 305.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 207 0 R /H /I >> endobj 210 0 obj << /Type /Action /S /GoTo /D [79 0 R /XYZ 72.0 482.474 null] >> endobj 211 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 284.124 155.057 293.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 210 0 R /H /I >> endobj 212 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.377 284.124 539.894 293.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 210 0 R /H /I >> endobj 213 0 obj << /Type /Action /S /GoTo /D [88 0 R /XYZ 72.0 542.422 null] >> endobj 214 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 272.124 123.21 281.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 213 0 R /H /I >> endobj 215 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.333 272.124 539.947 281.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 213 0 R /H /I >> endobj 216 0 obj << /Type /Action /S /GoTo /D [88 0 R /XYZ 72.0 336.088 null] >> endobj 217 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 260.124 187.905 269.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 216 0 R /H /I >> endobj 218 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.415 260.124 539.89 269.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 216 0 R /H /I >> endobj 219 0 obj << /Type /Action /S /GoTo /D [91 0 R /XYZ 72.0 330.294 null] >> endobj 220 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 248.124 187.326 257.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 219 0 R /H /I >> endobj 221 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.411 248.124 539.887 257.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 219 0 R /H /I >> endobj 223 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 236.124 190.666 245.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 222 0 R /H /I >> endobj 224 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.425 236.124 539.891 245.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 222 0 R /H /I >> endobj 226 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 224.124 201.105 233.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 225 0 R /H /I >> endobj 227 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.416 224.124 539.794 233.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 225 0 R /H /I >> endobj 228 0 obj << /Type /Action /S /GoTo /D [94 0 R /XYZ 72.0 360.456 null] >> endobj 229 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 212.124 240.765 221.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 228 0 R /H /I >> endobj 230 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.536 212.124 539.794 221.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 228 0 R /H /I >> endobj 231 0 obj << /Type /Action /S /GoTo /D [94 0 R /XYZ 72.0 294.766 null] >> endobj 232 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 200.124 216.208 209.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 231 0 R /H /I >> endobj 233 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.454 200.124 539.838 209.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 231 0 R /H /I >> endobj 234 0 obj << /Type /Action /S /GoTo /D [97 0 R /XYZ 72.0 621.5 null] >> endobj 235 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 188.124 216.188 197.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 234 0 R /H /I >> endobj 236 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.454 188.124 539.838 197.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 234 0 R /H /I >> endobj 237 0 obj << /Type /Action /S /GoTo /D [97 0 R /XYZ 72.0 302.0 null] >> endobj 238 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 176.124 312.596 185.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 237 0 R /H /I >> endobj 239 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.554 176.124 539.628 185.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 237 0 R /H /I >> endobj 240 0 obj << /Type /Action /S /GoTo /D [103 0 R /XYZ 72.0 720.0 null] >> endobj 241 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 164.124 189.579 173.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 240 0 R /H /I >> endobj 242 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.446 164.124 539.809 173.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 240 0 R /H /I >> endobj 243 0 obj << /Type /Action /S /GoTo /D [103 0 R /XYZ 72.0 574.56 null] >> endobj 244 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 152.124 135.43 161.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 243 0 R /H /I >> endobj 245 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.37 152.124 539.947 161.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 243 0 R /H /I >> endobj 246 0 obj << /Type /Action /S /GoTo /D [103 0 R /XYZ 72.0 128.16 null] >> endobj 247 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 140.124 229.2 149.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 246 0 R /H /I >> endobj 248 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.501 140.124 539.794 149.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 246 0 R /H /I >> endobj 250 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 128.124 194.015 137.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 249 0 R /H /I >> endobj 251 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.435 128.124 539.89 137.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 249 0 R /H /I >> endobj 253 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 116.124 192.34 125.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 252 0 R /H /I >> endobj 254 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.428 116.124 539.888 125.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 252 0 R /H /I >> endobj 256 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 104.124 180.718 113.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 255 0 R /H /I >> endobj 257 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.393 104.124 539.891 113.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 255 0 R /H /I >> endobj 258 0 obj << /Type /Action /S /GoTo /D [106 0 R /XYZ 72.0 684.0 null] >> endobj 259 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 92.124 253.41 101.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 258 0 R /H /I >> endobj 260 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.575 92.124 539.795 101.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 258 0 R /H /I >> endobj 261 0 obj << /Type /Action /S /GoTo /D [106 0 R /XYZ 72.0 424.97 null] >> endobj 262 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 80.124 201.85 89.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 261 0 R /H /I >> endobj 263 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.407 80.124 539.837 89.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 261 0 R /H /I >> endobj 264 0 obj << /Length 265 0 R /Filter /FlateDecode >> stream xœÍÝ]“É•˜é{þ \¶Ì¤T„ûñ¯K~ÌH3F‰ätk×Ödº»‹$v›…9â¿ß8Q@PèÁs£]¤A¡_ÏDÕƒÌSîÿógû‹íøŸÿÿk¬òâÛ?ÿì¾ÿ¹ýÅ(/jÿS­¿ØÇ­oóÅŸ_¼ÿ`¶ùâû ?ùa&ïXÏŸ}_?~ð§ÿçÏ^ÿl{ñŸ~ößÿÇ}÷b»µÿú³íîÁæëŸýîxòÖoµÏµÖû_k¹ísæSÔ[?~ðíŸ_üÇúsyñ«7gýáWŸ´ýþ«ÿøWT÷òÿ‹_QþšNóS½ÿwÜNúOþC‹íÓÿòÑo‹þégÿ·úøsÇÏÜJ;ž<ÿÓ÷ï%Þÿïü~ØÎÏìñö3yÿP-~þu=?ÅÿO¾½øãÏ~ñÍÏþã?¶ûöâ›?<ý)õ6ë¶mû¬ÇºÍ²òÿ”ßüùÅÿêÕ«Wÿî¼øæŸößÜý¾øßüÅ»óÌçþñÓªù;¦Ìü<>ùìNãñþ“züœ¾yùûï^¼ùË_¾yýîáõ»?Ë/Íö¢ŽÛØúñ e>.þíÛ‡?¼üöáqÉaY·5òZÜ/yñïŽdo·ýÅWÏ–Õãoƒº¿æVhY~¦åHÛýªÛ³66h+´Úõåm+Ð6hç—·}‡6Žv_kôùñ€xlW‰»Ä âY$nOˆ×.±.<þdS-†û&ˆû&Šû.Œùw”Ô¹‘Ü‹Pî…,+YV²¬dYÉ2È2È2Ȳ‘e#ËF–,;Yv²ìd9Èrå ËI–“,'Y.²\d¹Èr‰eÙIJlbY6±,»X–],Ë.–¥ˆe)bYŠX–B–•,+YV² ² ² ²ldÙȲ=¾ùØËºx»u_/©{¡ºQ=¥;ÕAõznTWªÉr’å"ËE–K,ë&–u˺‰eÝŲîbYw±¬»XÖ"–µˆe-dYɲ’e%Ë Ë Ë Ë ËF–,Yv²ìdÙÉrå ËA–ƒ,'YN²œd¹Èr‘åËØÄ26±ŒM,cËØÅ2v±Œ],£ˆe±ŒB–•,+YV²¬ddùݹã÷íñ‡è¾þüw"¢í·mkÛóâuûO­‹[oGÛf¿_÷¿~ü®ÓGo>ò»Ÿf?ÿÛËWߟßË9žgÌÛxñÕÞ¼ýóËw?|òO¼ûÓ«þÓwo¾ýëŸ^¿»„ì·5êZk+÷Ïù´üjÚÒ÷#m‹–Í[‹y|÷v¿ìjì"uP=¤^Õ•êNõ‚:Ç.R7ªÅ2Ç.R‹eŽ] .b™c©Å2Ç.PW²¬dYÉ2È2È2Ȳ‘e#ËF–,;Yv²ìd9Èrå ËI–“,'YN²\d¹Èr‰eŽ]¤Ë»@½‹eŽ]¤Ë»@]Ä2Ç.R“e%ËJ–•,ƒ,ƒ,ƒ,ƒ,Y6²ldÙɲ“e'ËA–ƒ,Y²œd9Ér’å"ËE–K,sì"µXæØEj±Ì±‹Ôb™c¨‹XæØEj²¬dYɲ’e%Ë Ëãµý:ÞJo½^ÔŸäÔåxkºVí¶,n±Ž×D{ŒûeC—-¯„ü´ÚoùðÇ‹Çãáÿ寯_¿zýǧŸxùú»§þÛŸü·ÿü÷¿<¼ýúw¿~þîýø—·ÎXëøœîŸíiùóeÇ?Á£oýç¢UqÛóË]ëýª»¹Âaóåññ¶ â*q—xA|¼å‚¸IÞoA,‚C§Nœ"8Ep‰àÁ‚eÁ²`Ù@°ì Xv,;–KÁR@°¬"XE°Š`ˆ`ˆ`ˆ`ˆ`Á&‚-çšs‹/¨ûNuP=¤Õ•êNõ’zªÕd¹Èr‘å˺‰eÝIJnbY7±¬»XÖ],ë.–µˆe-bY YV²¬dYɲ’eeee#ËF–,;Yv²ìdÙÉrå ËA–“,'YN²\d¹Èr‘åËØÄ26±ŒM,cËØÅ2v±Œ"–QÄ2ŠXF!ËJ–•,+YYYY6²lý–×þ¬½È +ÚºÕ¼;½uZÖËm´‹ñÜÝ[™¼3øÓæ›?Låí¦9—ûúw¿þÕ/>ú‰~ùöÙƒä, åQÇ»–»Gûhåó¶ßúÊ+¢æ²uíVŽ—î«Ï‹ç»›Tä½N_^ç½NPÕCê¼× êJu§zI÷:AM–•,ƒ,ƒ,ƒ,Y6²ldÙȲ“e'ËN–ƒ,Y²œd9Ér’å$ËE–‹,—Xæ8Xj±Ì0Ô»XæHXj±Ì¡0ÔE,s,,5YV²¬dYÉ2È2È2È2Ȳ‘e#ËF–,;Yv²d9Èrå ËI–“,'Y.²\d¹Ä2'ÄR‹eNˆ¥ËœK-–9!†ºˆeNˆ¥&ËJ–•,+YV² ² ² ²ldÙȲ‘e'ËN–,;Y²d9Èr’å$ËI–‹,Y.²\b™b©Å2hî4÷ šûÍ}‚æ>AsŸ ¹OÐÜ'hî4÷ šûÍ}‚æ>AsŸ ¹O¯íÇÊHËyè9">–ÍÞl]/·ÙǶE½˜¿^LŠ×«Ÿ6Ÿ\àùâ«_½|÷ò÷/xøðñÏ¿ýöá‡>|ôÍ›7ßÿp1¼Úrä^/þÃÊ‹VD.ZíËå'»‹Fë÷‹®FYRO©ÇNuP=¤žÕ•êNõ’z‘å"Ë%–9Ê’Z,s”õ.–9Ê’Z,s”uËeIM–•,+YV² ² ² ² ²ldÙȲ‘e'ËN–,Y²d9Èr’å$ËI–‹,Y.±ÌQ–Ôb™£,©Å2GYR‹e޲ .b™£,©É²’e%ËJ–•,ƒ,ƒ,ƒ,Y6²ldÙɲ“e'ËN–ƒ,Y²œd9Ér’å"ËE–‹,—Xæ(Kj±ÌQÔ»Xæ(Kj±ÌQ–Ôb™£,©É²’e%ËJ–A–A–A–,s®3ÚšsŒ/Ñä+Ž¿Ë·è_> :/t\Ç3åé=w‹.†Xëùfr?ÏGÎ}žîA~ú™#­çS‚¼k¾¯suÿˆOËŸ/;Þìn9ºšû eí–÷2¯Þ/~ýwŒÜ5¥lÇ—±\<É]»¦@T©sר+Õê%uîšu£š,;Yv²ìd9Èrå ËA–“,'YN²\d¹Èr‰eÙIJlbY6±,›X–],Ë.–eËRIJ±,…,+YV²¬dYÉ2È2È2Ȳ‘e#Ëã]ïãž%Ûþõñ®WêJu§zI}¼ë•ºQ=¥ÎÝr¡ªÉr‘å"ËE–K,ë&–u˺‰eÝŲîbYw±¬E,kËZIJ²¬dYɲ’eeee#ËF–,Yv²ìdÙÉrå ËA–“,'YN²œd¹Èr‘åËØÄ26±ŒM,cËØÅ2v±Œ],£ˆe±ŒB–•,+YV² ² ² ² ²ldÙÚmímͶ_ÔŸý×ö­íñ®qXv^Ú×ÖõbY¹ŸŠæù¿ŸFÿôú?üöí›ðó&ó§ ú?~÷æéÇ_ü÷ø3¿<~æû7¼»æ/oX±V]Oû´ünh±ÝŽ·QÛ6¢Ùºz«ÛÚ¶6®>ÍûÙH·|Iž§KPÞ,Ÿ”/™)ËåÇ«fÊI5O™ ÜT«©VS­¦¦¦¦ÚLµ™jKÕ¹Öó‹òEy/–7Ë'åc·<,”ÏÍòj¹©NS]¦ºLu‘j?A9©æ’駱GPPNªy…ä…Tó ÊMµšj5ÕjªaªaªaªaªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕEªy>多'TPNªyF多§TH^H5Ï© ÜT«©VS­¦ZM5L5L5Lµ™jŒ°òÍÄ^e`p^†Ö´F¡uy%Z­G:ö‹uõbèRžoÏ÷õÃÛ¿=¼}¼esÞÖ‹¯þË›ïžPò®½ˆ|žqñ-~¾.nñxŸh·uó¶oÏ·º_=ßó/ûñªÔAõz?þ:¥¼ZÞ-_”RÞ,'Ò,('Ô½˜j5ÕjªÕT«©†©†©†©6Sm¦ÚLµ›j7ÕnªÝT‡©S¦:Mušê4ÕeªËT—©.RÍQ=多£zÉwRÍQ=多£zÊI5Gõ”›j5ÕjªÕTÃTÃTÃT›©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT©æ¨žrRÍQ½ä;©æ¨žrRÍQ½ä…TsTO¹©VS­¦ZM5L5L5L5Lµ™j3ÕfªÝT»©vS¦:Lu˜ê0ÕiªÓTm°Tm²Tm´Tm¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-;¶²í±Ûhú¼<2ö÷³zYx¼cxÜj±Ï‹…χõù ‡š;$¾?SûŒ>¹[¼Þödzrž>zæßÍŶÛ<þ¿íx7wñ˜O«/Æo%Ž_c)¶lÜúǧ¶Úź«1åÕònù¢|Ë›å“ò¹[–›ê2ÕeªËT©æŽrRÍ1œä;©æŽrRÍ1多c8ÊMµšj5ÕjªaªaªaªÍT›©6Sm¦ÚMµ›j7ÕaªÃT‡©NS¦:Mušê2Õeª‹Ts G9©æNòTs G9©æNòBª9†£ÜT«©VS­¦¦¦¦¦ÚLµ™j3ÕnªÝT»©S¦:Lu˜ê4ÕiªÓT—©.S]¤šc8ÊI5Çp”“jŽá('ÕÃI^H5Çp”›j5ÕjªÕT«©†©†©†©6SÍ{”×ñk!C¦óŠÙǺRi]Þ¥ÜÚ¶ok]¬‹‹!\´ŸÂå&Žß|óÛ§®‡pÇ¿ªc/ÛÖz¹x̧ÕwÓ´ãÓˆñ~¬)ëú­ÍÜjÔ‹uw#’ÜëòÜìCòfù¤<÷û<,”ç–’WËMušê2Õeª‹TóœÊI5O:‘|'Õ<ë„rRÍÓN$/¤šçPnªÕT«©VS S S S Sm¦ÚLµ™j7ÕnªÝT‡©S¦:Lušê4ÕiªËT—©.R̓P('Õ< …rRÍÃP('Õ<EòBªy å¦ZMµšj5ÕjªaªaªaªÍT›©6Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:Mu™ê2Õeª‹Tó¨ÊI5K‘|'Õ<.…rRÍS('Õ<2…rS­¦ZMµšj˜j˜j˜j3ÕœÂÍ<\¤í2dzœÂík†SS¸ãù¢_ýò®¦pmüÔîx¸¦pçG9…ûþáÝÝœk¿­<¹æìwú´ün]»Õ–×ÂÍÝÖÍÛ˜ÇßV½]}÷“¯Ýò°|P~¼‘¢¼ZÞ-_”o¤(o–›ê2Õeª‹T¿,'Õ<]ƒrRÍó5('ÕònÝÕ.ß|ýòÍë×ß¾{õúçiÉõà ù£—~ðñAùñõr³ÜörüjÚºz¢k/&7ÑÆñ¹·&«òı*êÕs]p ˇäÈ«åÝòEù9À¼YNªÈIõq€óåy5ÕjªÕT«©†©†©†©6Sm¦ÚLµ›j7ÕnªÝT‡©S¦:Mušê4ÕeªËT—©.R}à@Nªœ/ÏwR}à@NªÈIõq€¹©VS­¦ZM5L5L5Lµ™j3ÕfªÍT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu‘êãrR}à|y¾“êãrR}à|y^Hõq€¹©VS­¦ZM5L5L5L5Lµ™jpÚ‡ãB¾tqî(6×¶6`Uþã°Ï{\¬ºÞäkèO¢¯¾ýëÛWïþ~NˆZÞ.ùË7¯xõÝÃÛ—ï^?z>¨È©¼‡ñîÑžånÝ¼í½¼ÿ*º¼—t¯kÍØ/ÖÝÍQŽ·r”ÊsŸ2É«åÝòEyîS&y³|R>Mušê4ÕeªËT—©.R=÷)“œTÏ}Ê ßIõܧLrR=÷)“œTÏ}Ê$7ÕjªÕT«©†©†©†©6Sm¦šû”íÇëáÚÇå‹òܧLòfù¤<÷)“<,”ç>e’WËMušê2Õeª‹TÏ}Ê$'ÕsŸ2ÈwR=÷)“œTÏ}Ê /¤zîS&¹©VS­¦ZM5L5L5L5Lµ™j3ÕfªÝT»©vS¦:Lu˜ê0ÕiªÓT§©.S]¦ºHõܧLrR=÷)“œTÏ}Ê$'ÕsŸ2È ©žû”InªÕT«©VS­¦¦¦¦ÚLõŒ×öí|šwzøè£œ­=ŸAì.H¸Ìß-ì·^ó°Ð¶láñRqÏ›#Ç^/Þ IŽ—Š”wËåÇKEÊ›åóÈç¶Åñ{ô òã¥"åaù <6Ë«åÝòEy+–7ËMµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT©æÍÚ”“jÞ¬M9©æÍÚ”“jÞ¬-y!Õ¼Y›rS­¦ZMµšj5Õ0Õ0Õ0ÕfªÍTÛ8_ÌÕ¾¤îÕ•êNõ’zªÕSê¹ST“å"ËE–‹,—XæÝÙR‹eÞ› õ.–yg¶Ôb™÷eK-–yW¶ÔdYɲ’e%Ë Ë Ë ËF–,Y6²ìdÙɲ“å ËA–ƒ,'YN²œd9Ér‘å"Ë%–yóµÔb™·^C½‹eìb»XÆ.–QÄ2ŠXF!ËJ–•,+YYYYY6²lí6ËñêjnWùçg¢çÝÖѶm/ſ܏ãÍG½šÂ^Í÷ç[êýòû7?^”¹rG¾÷CãÇ>\y1ÅíxâRúÅc>­¿[·ÚŽÏ´V\7Žç;¾´}Ö‹u÷£ÔÍòjy·|Q^‹åÍòIùñ2ò°ÜT›©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT©æéÄ”“jžN,ùNªy:1多§K^H5O'¦ÜT«©VS­¦¦¦¦¦ÚLµ™j3ÕnªÝT»©S¦:Lu˜ê4ÕiªÓT—©.S]¤š§SNªy:1多§SNªy:±ä…TótbÊMµšj5ÕjªÕTÃTÃTÃT›©6Sm¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT©æéÄ”“jžN,ùNªy:1å¤6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–ÎQoŸkÎíj¦úÙ9æ9éýq` ëÎAoä-ûW¿¼~1è-wÇ¢¼}xùáP”¼áýa(?ü¯ÿúôÁ熾Ç;לÝn5çÛwÿ´þnæ¸ßÖŠúÚ²¼"|ËÚÕ§s5Ù”ü¼×ò°|P~Þë yµ¼[¾(?ïu…ÜT»©S¦:Lušê4ÕiªÓT—©.S]¤Z6R-©–TËNªe'Õ²“jÙIµR-…TK1ÕjªÕT«©†©†©†©†©6Sm¦zÞë:Ž—:e~I~Þë yX>(?ïu…¼ZÞ-_”Ÿ÷ºBÞ,7ÕeªËT©ÖTëFªu#Õº‘jÝIµî¤ZwR­…Tk!ÕZLµšj5ÕjªÕTÃTÃTÃT›©6Sm¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT©ÆFª±‘jl¤;©ÆNª±“jRBªQH5Š©VS­¦ZM5L5L5Lµ™êñî`íû¶oãêÝÁg§uçdóò.Ï ZkÛ÷r5ÏòíܤîӦܯmy…ì׿ûõGýúåë?þõåŸO2ó[V[Ù¶=¯ë½{¼Ö?_×Ï1ÏÎÎ/¥¬[·•éÌÏñnÝs‚ã…¿Ôê)õñª_ê zH½¯ù)¯–wËÉóø­m9‰î;‘î…L÷B¨{1Õšª}ÛÚì_”WË»å‹ò(–7Ë'åm·<,”wSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2ÕEª¹w2多{'K¾“jîL9©æÞÉ”“jîL¹©VS­¦ZM5L5L5Lµ™j3ÕfªÍT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu‘jîL9©æÞɒ駱{'SNª¹w²ä…TsïdÊMµšj5ÕjªaªaªaªaªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕEª±‘jl¤©ÆFª±“jì¤;©F!Õ(¤ÅTm¶6[ ›-…Í–ÂfKa³¥°ÙRØl)¿0ú<ò:.òÏÉÏï ”mÛF-¶0/ŽÇÊu9–Ÿwï¥Î7<ŸF_¿{ùú»—o¿ûáñiê­½øêë¿þå/oÞ¾{>·ž·ÜîoÛóBñ»ÇùhùÝиÜö=Öùe¤…íÖó²ë½]=ãýpzRž‡¤K–ÊótÉ«åÝòuËKîW^ªÿo×yF:Ôê)õñ'@ê zH§£C]©îT“e'ËN–,Y²d9Ér’å$ËI–‹,Y.±Ì«Ø¥˼†ê],ó v©Å2¯_‡ºˆe^½.5YV²¬dYÉ2È2È2È2Ȳ‘e#ËF–,;Yv²d9Èrå ËI–“,'Y.²\d¹Ä2/R—Z,óu©Å2/P—Z,óòt¨‹XæÅéR“e%ËJ–•,+YYYY6²ldÙȲ“e'ËN–,Y²d9Ér’å$ËE–‹,Y.±ÌKÐ¥˼ê],óòs©Å2/>—Z,óÒs©É’æ>AsŸ ¹OÐÜ'hî4÷ šûœ{i´µms\埌žãÛ^¢Ù¼ĤÌ5ÛÕ$öj^ÜŸo­üþ2óµwËøðã—¯¿ûðÃo^þþû‡î桹µõ‡äÝ£~X{·*Û[ï¿ _¼*©(yäai«®†©”wË×m?^o1ç—äyP…äÍòIùñ‹ò°|PžÇUH^-ï–›j7ÕnªÝT‡©S¦:Mušê4ÕiªËT—©.RÍ!+多cVÉwRÍA+多£VÉ ©æ°•rS­¦ZMµšj˜j˜j˜j˜j3ÕfªÍT»©vSí¦:Lu˜ê0ÕaªÓT§©NS]¦ºLu‘jNa)'ÕœÃRNª9‰¥œTs+y!ÕœÆRnªÕT«©VS­¦¦¦¦ÚLµ™j3ÕnªÝT»©vS¦:Lu˜ê4ÕiªÓT—©.S]¦ºH5ç´”“jNj%ßI5gµ”“jNk)'Õœ×Rnª6[ ›-…Í–ÂfKa³¥°ÙRØléÜîã(öþåcÉsj»Ím¯«Àªs›_”ç½ ’7Ë'åy¯‚äaù <ïU¼ZnªÓT—©.S]¤šÛÐRNª¹ ­ä;©æ6´”“jnC+y!Õ܆–rS­¦ZMµšj˜j˜j˜j˜j3ÕfªÍT»©vSí¦:Lu˜ê0ÕaªÓT§©NS]¦ºLu‘jnCK9©æ6´”“jnCK9©æ6´’RBªQLµšj5ÕjªÕTÃTÃTÃT›©æô5Ú¶íEæ“çÕ©óX¶Æe“×5Gîap·ìbòš/þ>~ýæ÷çÃïçh7wx¶*/Sks­¹ïË?Zûl]NLæ–·êw[Wos«ÇW0.–=ÿz¯.ñ‚8gÝR7ª§ÔûNuP=¤.Õ"™1K–å(Ž?0_×by³|R»åaù ¼m–WË»å¦ÚMµ›j7ÕaªÃT‡©NS¦:Mušê2Õeª‹TóÊeÊI5¯\–|'Õ¼r™rRÍ+—%/¤šW.SnªÕT«©VS S S S Sm¦ÚLµ½™´¶ú%yß-Ëåc³¼ZÞ-_”Ïby³ÜT—©.S]¤šW.SNªyå2多W.SNªyå²ä…TóÊeÊMµšj5ÕjªÕTÃTÃTÃT›©6Sm¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT©ÆFª±‘jl¤;©ÆNª±“jRBªQH5Š©VS­¦ZM5L5L5wØ]kÛÚ~•~¦ÇßôÇ?ùÛWýŸZ7n+·DȽîîÛÝÛ—óO«¯ÿôæíyYñÚ_|õŸþú껇¼{óáG?î¦{üø›¿ÿåþºã,½ nýß°ê0ŒÑ/Hº_u5¤|P~S^-ï–/Ê{±¼Y>)¦:Lu˜ê4ÕiªÓT§©.S]¦ºH5烔“jÎ%ßI5烔“jÎ%/¤šóAÊMµšj5ÕjªaªaªaªaªÍT›©¶Tíß›ÿ‚¼ï–‡åƒò±Y^-ï–/Êg±¼YnªËT—©.RÍù 多óAÊI5烔“jÎ%/¤šóAÊMµšj5ÕjªÕTÃTÃTÃT›©6Sm¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT©æ|rRÍù ä;©æ|rRÍù 多óAÊMµšj5Õjªaªaªaªm»­‘'LmW/÷?3;g‰3¶­ô%«Æm¬cU¯íbÕå$±<ßïõÇ)ávïç„O~8„ëüà7yxûòÝ«7¯ï‰Çƒî±V¯WÏðôwëÖm?ÞSŸB¡u¹³QYÇç½úźûé`³|Rž;I–Êsg#É«åÝòEù0ÕaªÃT§©NS¦ºLu™ê2ÕEªy£>多7êK¾“jÞ¨O9©æú”“jÞ¨O¹©VS­¦ZM5L5L5Lµ™j3ÕÜ5»ÌµöñEõ’:÷̆ºQ=¥Î ³¡ª‡Ô¹[6Ô•j²œd¹Èr‘åËü·Ôb™÷åC½‹e¾œ–Z,óž|¨‹Xf!5YV²¬dYÉ2È2È2È2Ȳ‘e#ËF–,;Yv²d9Èrå ËI–“,'Y.²\d¹Ä2o¼—Z,ó¶{©Å2oº—Z,ó–{¨‹Xæ ÷R“e%ËJ–•,+YYY¶ý¶}¶þìÀ*Ç{ǧ¼mÑi@–¾Ç ®±]½;Ø÷çý<ÿý´ú¯ýóÃÛWß¾¿ßþŸ¹ðxu´JîÖËŃ|´únáñ³ýÃðÎ[^¤ù8ó¼[x7w8þ`P–Ê?”WË»å‹òãÏåÍrSm¦ÚLµ™j7ÕnªÝT»©S¦:Lušê4ÕiªËT—©.S]¤šÓSÊI5§§’駱ÓSÊI5§§”“jNO)7ÕjªÕT«©†©†©†©6Sm¦ÚLµ™j7ÕnªÝT‡©S¦:Mušê4ÕiªËT—©.RÍa*多ãTÉwRÍ*多#UÉ ©æ[/ÊMµšj5ÕjªaªaªaªaªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕEª9m¥œTsÞJ9©æÄ•rR ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–òÚÊÙÚ¶oë*ÿü¨ñ¼¼rÍ5û´áæ§÷jß-¼ÀÆó-KñæÍ÷/_?>K¿½¿ûù`àxë^ϸZñÑâ»…óø%εF³uù-ýx¾’›SÞ-¼\ä÷<$Ÿ”çw=$ËåùÜä5ÚþEyµ¼[¾(Ïo~HÞ,Ÿ”祱’‡åƒònªÝT»©vS¦:Lu˜ê4ÕiªÓT—©.S]¦ºHõ¼4VrR=/…|'ÕóÒXÉIõ¼4VrR=/•ÜT«©VS­¦¦¦¦ÚLµ™j^›ÿÈçvó_’/Ê{±¼Y>)»åaù ¿~÷öÕë?>}|y¹m~-¿+WÔ«G}Z|1°[DzÕFµuëy«ýØÆÅºûÙZ±¼Y>)Ï=Î$Ëå¹Ç™äÕòn¹©NS¦:Mu™ê2ÕEªe#Õ²‘jÙHµl¤ZvR-;©–TK!ÕRHµS­¦ZMµšj5Õ0Õ0Õ0ÕfªÍT›©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2ÕEªu#Õº‘jÝHµî¤ZwR­;©ÖBªµj-¤Z‹©VS­¦ZM5L5L5Lµ™j3ÕfªÍT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu‘jl¤©ÆFª±“jì¤;©ÆNªQH5 ©F1ÕjªÕT«©†©†©†©ž÷ð¶m‹I³¬ó®øÈ³wÖÕÓüĺq›smÛhWëö¸˜Ûç›cþâÕë—oÿ~>Ǹ­O†vçÇ׿l·Õ‡#ü¹{ȧÅwëò-Û¶W\wülÙ¯miëîf±Y^-ï–/Ê[±¼Y>)?~OQ–›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕEª9p¤œTsàH9©æÀ‘rRÍ£ä…TsàH¹©VS­¦ZMµšj˜j˜j˜j3Õfªù¿ã7ý\yÉ¿÷Íòjy·|Q>ŠåÍòIùÜ-ËMu™ê2Õeª‹TsàH9©æÀQòTsàH9©æÀ‘rRÍ#å¦ZMµšj5Õ0Õ0Õ0ÕfªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:Mu™ê2ÕEª9p¤œTsà(ùNª9p¤œTsà(y!Õ8RnªÕT«©VS S S SÍjÞ4ºÌÓÎc^‘X;®ûxàx·noÇù|³Î_¼z÷x)bÉ>ŸÆïâzOÎ~ÛzÞ>ÖÅ#~´únẵնm/ů‡Ž5Ç£½_x7ô8^Qþñy?ÿv~¼¢¼Y>)?^Q–Ê?”WË»å¦ÚMµ›j7ÕaªÃT‡©NS¦:Mušê2Õeª‹TósÊI50—|'Õ<ÀœrR=JÊ ©ææ”›j5ÕjªÕTÃTÃTÃTÃT›©6Smóñ5Á*W/ƒîç™»åaù |l–WË»å‹òY,o–›ê2Õeª‹TósÊI50§œTósÊI50—¼j`N¹©VS­¦ZMµšj˜j˜j˜j3ÕfªÍT»©vSí¦ÚMu˜ê0ÕaªÓT§©NS]¦ºLu™ê"Õ<ÀœrRÍÌ%ßI50§œTósÊI5 ©F1ÕjªÕT«©†©†©†©æ}Ø5ÖÚ£Óìð¼»ïyoòŽ ?¯Þ-¼¯®ç[q~ýîÍÛ—|ÈgñÑÑåüçã£ïß\æÍž~üÏ/ÿöòé£ßüþÿ~øöÝóYlnÖ6ó†íóÚÏ»§Z~·®ß¶Ù¶­ÝÖ­[­%g¿õbÝýûby³|R~¼N¤<,”¯)¯–wËM5L5L5Lµ™j3ÕfªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu‘j^“E9©æ5Y’駱×dQNªyM多×dQnªÕT«©VS S S Sm¦ÚLµ™j3ÕnªÝT»©S¦:Lušê4ÕiªÓT—©.S]¤š×dQNªyM–ä;©æ5Y”“j^“%y!Õ¼&‹rS­¦ZMµšj˜j˜j˜êñî ÔX³Õ&ïsÏk²f~w±_=ÍO¬;ÒãõâV×Õûê½ß rÃO«¼è*ŸáøK¯¼øêׯÿøîOÿþé'~ûöáÛW?¼zóúé§ÞO?øúÛ—ßßãqÎ/ŽÏ§ÍvñŒO‹ïÖåA+u­qõ ýü²ü;/Ó¼î~Ýs¥¼î‚ò)y^wAyX>(Ï¿ó$¯–wËå…Tóº ÊMµšj5ÕjªaªaªaªaªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕEªyÝ多×]PNªyÝ多×]H^H5¯» ÜT«©VS­¦ZM5L5L5Lµ™j3ÕfªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu‘j^wA9©æu’駱×]PNªyÝ多×]PnªÕT«©VS S S SÍËðÆQÄ28(¹ý}ŸÕÖ[.[órâp7@)qž¤ðiõ«—ïÞ½úóÃG›ì¿»¸‘íxÍ[æv(Ͻ%¯–wËå…L÷B¨{1ÕjªÕT«©†©†©†©†©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT©–TÏs&$'Õóœ ÈwR=Ï™œTÏs&$'Õóœ È«©VS­¦ZM5L5L5Lµ™j3ÕïLœmÍ^mþ|žûᄊû…û¸˜‘×çÛÃýÓëwoÿöòûOó™ÍÞŽ¿æ¶v<Õ*ûŃ|´øùº~ë%¶mkÖå-Ùkß¶}®‹uwSïJu§zI÷RÞ,Ÿ”çýØ’‡åƒòB¤ç^’ê¹×ßñçfEé_’çýØ’7Ë'åy?¶äaù <÷ú“¼ZÞ-7ÕnªÝT»©S¦:Lušê4ÕiªÓT—©.S]¤zîõ'9©ž{ýA¾“ê¹×Ÿä¤zîõy!Õs¯?ÉMµšj5ÕjªaªaªaªaªÍT›©¶÷¯–V+_’÷Ýò°|P>6Ë«åÝòEù,–7ËMu™ê2ÕEªç^’“ê¹×Ÿä¤zîõ'9©ž{ýA^HõÜëOrS­¦ZMµšj5Õ0Õ0Õ0ÕfªÍT›©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2ÕEª±‘jl¤©ÆNª±“j줅T£jR=÷úƒ¼šj5Õjªaªaªaª9Q?ÏQiW/÷??<>'êcl{ìº0'ê9®¾œ•—íb¢ÏwüùÛ·/ÿþ|~žûä§²¶y±äüå7‘î~EÇg2LJù¹¬›·–ûÎr±ìùúxãqñ<¾BÛþ%õúxÓ#u¥ºS½¤>ÞðHݨžR¯j²\dyü1·œ4óÏ/åä¹ïºï$ºïDº2Ý ¡îÅTëöøwÅñËåÕònù¢<ŠåÍòIyÛ-ËåÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu‘jnhL9©–TËNªe'Õ²“j)¤Z ©–Bª¥˜j5ÕjªÕTÃTÃTÃT›©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT©ÖTëFªu#Õº“jÝIµî¤ZwR­…Tk!ÕZLµšj5ÕjªaªaªaªaªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕEª±‘jl¤©ÆFª±“jì¤;©F!Õ(¤ÅTm¶6[ ›-…Í–ÂfKa³¥üNHïkÛzµoœß ©uÛÆ¼šîýÔÂq[k<Ët¿°Ôçý|ܲç“êüNȇ“•拯~õð‡W¯_½{õæõÅumñ~·Ÿ»Çùè!î®[Ôr,ìݯƒVÏMZ\,¼Ÿ’6Ë'åÇë ÊÃòAùñ:ˆòjy·|QÞLµ™j3ÕnªÝT»©S¦:Lu˜ê4ÕiªÓT—©.S]¤š¶PNª¹a 多¶PNª¹a‹ä…TsÃÊMµšj5ÕjªÕTÃTÃTÃT›©6Sm¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT©æ†-”“jnØ"ùNª¹a 多¶PNª¹a å¦ZMµšj5Õ0Õ0Õ0ÕfªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:Mu™ê2ÕEª¹a 多¶H¾“jnØB9©æ†-’Ûl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØlé¼¼|ö£ˆf‡çžæ{Û¶ëçù©…yyùñ*­îWÓÊË¡j¾õù'CÕõâ«yøÃÃÛ‡×ßÞõ–‡¾”ce‹GùèîÖÍÛlÇgWk·…y,ØŒm;Þ\\,¼©R>)ÏcÁ$Ëåy,˜äÕònù¢¼™j3ÕfªÝT»©vS¦:Lu˜ê0ÕiªÓT§©.S]¦ºH5Gª”“jŽT)'Õ©RNª9R•¼jŽT)7ÕjªÕT«©VS S S Sm¦ÚLµ™j7ÕnªÝT»©S¦:Lušê4ÕiªËT—©.S]¤š#UÊI5Gª’駱#UÊI5Gª”“jŽT)7ÕjªÕT«©†©†©†©6Sm¦ÚLµ™j7ÕnªÝT‡©S¦:Mušê4ÕiªËT—©.RÍ‘*多#UÉwRÍ‘*多#UÉm¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶ô8RÝל­Òìðq¤ºoû6lZù8R=7ì¸ZXâb¤:Ÿï”ýÑHuÏçøÍ_Þ¾ÌËTŸï⑳ÑÞûñtu\<ÎGq1Ýg¼ßÊ„楷 P¯~åWSÒ±Õµb´/ÉënyX>(?~'S^-ï–/Ê[±¼YnªÝT»©vS¦:Lu˜ê0ÕiªÓT§©.S]¦ºH5§¤”“jNI)'Õœ’RNª9%•¼jNI)7ÕjªÕT«©VS S S Sm¦ÚLõüÎññÞbË-{þí¼o–WË»å‹òQ,o–OÊÏò°ÜT—©.S]¦ºH5§¤”“jNI%ßI5§¤”“jNI)'Õœ’RnªÕT«©VS S S Sm¦ÚLµ™j3ÕnªÝT»©S¦:Lušê4ÕiªÓT—©.S]¤šSRÊI5§¤’駱SRÊI5§¤’RBªQLµšj5ÕjªaªaªaªyÂÖ·­MžSÒkޱpáÇûß-,íîí΋XÏw?þ§×ß=ü¯‡òYòo_½|ýÝÓ¿ûëÃÛ¿?}øõ_¾»N®Ûžwù·Q/ÿiñÝ1÷VØ×}Úºv[m®µúÕóÝ+'åyk‹äaù <KI^-ï–/ÊóÖÉMµ›ê0ÕaªÃT§©NS¦:Mu™ê2ÕEªy 多ǰI¾“jÃF9©æ1l’RÍcØ(7ÕjªÕT«©†©†©†©†©6Sm¦šÛ¦´µí‘G³þÛyn›"yX>(ÏmS$¯–wËå¹mŠäÍrS]¦ºLu‘jÃF9©æ1l”“jÃF9©æ1l’RÍcØ(7ÕjªÕT«©VS S S Sm¦ÚLµ™j7ÕnªÝT»©S¦:Lušê4ÕiªËT—©.S]¤šÇ°QNªy ›ä;©æ1l”“jÃF9©æ1l”›j5ÕjªÕTÃTÃTÃTs¶4¼ö!ã·÷·É¯ÙöÝÖÛ<ôæØúźÒm{¾AéãÈü&Í‹¯~ûöÍ·?üðêõŸ~îýøòñƒßüåÝ«?¿úáåÕæ¤ù=ªÇÛº.žéé1î†=å¶²m½T[×nÇßíky±ì~¤4¥Î½ ª‡Ôy—Ô•êNõ‚:¦‘Z,óX¨w±ÌCi¤Ë<’Fj±Ìi¤&ËJ–•,+YYYY6²ldÙȲ‘e'ËN–,Y²d9Ér’å$ËI–‹,Y.±Ìsg¤ËÜïÎ¥uMrîוñ¼?>‰ýù®ˆ_vV?¾ììüà—o^÷êòVÝã=RÙÆZ¥µ‹G}z„»uãÖ£mÛñÛÖ_Ûm–mÛF½Xw7t8¾¤”Êûfyµ¼[¾(ϱ™äÍòIù4ÕiªÓT—©.S]¦ºH5Çf”“jÎ$ßI5Gg”“jÏ('ÕŸQnªÕT«©VS S S Sm¦ÚLµ™j3ÕnªÝT»©S¦:Lušê4ÕiªÓT—©.S]¤šs5ÊI5'k’駱³5ÊI5§k’RÍùå¦ZMµšj5Õ0Õ0Õ0Õ0ÕfªÍT›©vSí¦ÚMu˜ê0ÕaªÃT§©NS¦ºLu™ê"Õ¼QNª9z£œTsøF9©æøMòBª9€£ÜT«©VS­¦ZM5L5L5‡E{_k–%C¦ó’ªöþFSZ7nsmkíåjÝå ®<ßKï§qŸß3ïxŸµÏ¹mµÅÅ£þô ®4Z’_Ö¾ç‘'ýbÝå NòAyÎà$¯–wËå9ƒ“¼Y>)Ÿ¦:Mušê2ÕeªËT©ž38ÉIõœÁA¾“ê9ƒ“œTÏœä¤zÎà$7ÕjªÕT«©†©†©†©6Sm¦š3¸^¶ýøËò‹òEyÎà$o–OÊs'yX>(ÏœäÕrS¦ºLu™ê"Õs'9©ž38ÈwR=gp’“ê9ƒƒ¼ê9ƒ“ÜT«©VS­¦¦¦¦¦ÚLµ™j3ÕnªÝT»©S¦:Lu˜ê4ÕiªÓT—©.S]¤zÎà$'Õs'9©ž38ÉIõœÁA^HõœÁInªÕT«©VS­¦¦¦úÉ îˇLŸÎàdÝÇ3¸»ue^ÌàâùNmÍàŽ7ýÇÜã¿ù—_ýÿ<}ø‹ÿëßôßþñ¿þ‡o>³ð×ÿô_þé›»7[Û­­|ò-.~%O‹ïÖŸ}ÉQè^l]¿Í˜Û6®–Ý¿\Rÿ–KݨžG=×uõuºëµ[–ÊÉ)¯–wËå³XÞ,7ÕeªËT©æö6”“jnoC9©æö6”“jno#y!ÕÜÞ†rS­¦ZMµšj5Õ0Õ0Õ0ÕfªÍT›©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2ÕEª¹½ 多ÛÛH¾“jnoC9©æö6”“jnoC¹©VS­¦ZM5L5L5Lõøç ÊñjmUÞ¯œ7Eµºfë¶lÜúñ‹[¥_½Á»{¸½híù8õv¾ËÜ_|õunjóæõ>þpIÆñÃoÞ¾|ýÃËo¯1·6Öã¡‚÷ÿឯÊÝæ<Þ0Ç.«âvü t<×võ\Ï5ö¼Éò¼ËOòjy·|QžwúIÞ,Ÿ” (7ÕfªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu‘ê¹ë“ä¤zîûùNªçÎO’“ê¹÷“ä¤zîþ$¹©VS­¦ZM5L5L5Lµ™j3ÕÜjÍ5û,_”/Ês'(É›å“òÜ Jò°|PžûAI^-7ÕiªËT—©.R=·…’œTÏ¡ ßIõÜJrR=7‡‚¼ê¹=”ä¦ZMµšj5Õ0Õ0Õ0Õ0ÕfªÍT›©vSí¦ÚMu˜ê0ÕaªÃT§©NS¦ºLu™ê"Õsß(ÉIõÜ9JrR=÷Ž’œTÏÝ£ /¤zî%¹©VS­¦ZMµšj˜j˜j^:óã~P_: çEëÏ7šúÍßÞþíÕÿ>k{½ÆÇÿ©ûÅ¢ó4Åýjƒò¼Z²õáÚºãïþ>·Is¿Z÷ü‹|üÕ/u§zI}ü½/u£zJ}ü¥/uP=¤Þ7ÂÜ7ÒÜ7âÜ7òÌß”“è¾é^È4¿@¹©ÖT=þ9oãêï‘«o'PÞ-_”G±¼Y>)o»åaù ¼›j7ÕnªÝT‡©S¦:Mušê4ÕeªËT—©.RÍo'PNªùíÉwRÍo'PNªùíÊI5¿@¹©VS­¦ZM5L5L5Lµ™j3ÕöþÕÒ–×ÌA¾(ïÅòfù¤|ì–‡åƒò¹Y^-7ÕiªËT—©.RÍo'PNªùíÉwRÍo'PNªùíÉ ©æ·(7ÕjªÕT«©†©†©†©†©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT©ÆFª±‘jl¤©ÆNª±“j줅T£jS­¦ZMµšj5Õ0Õ0ÕãÝÁ8¾<ûƒêù…šƒø–·šÒÂq[klÛ*W¿ÀËï*Œç»æ½¿öú<ý"nåÅW?÷îí«ßÿõÝãý¹?÷áÑóƒÿãåÛW/ÿýÃÝõØÇ/g?>ÕW»x¢§¸lµ(Û6×ÕÛÌ÷W¥¯‹uW.Êåy‘äÍòIyÞE$yX>(Ï»ˆ$7Õeª‹TsÂE9©æ„KòTsÂE9©æ„‹rRÍ å¦ZMµšj5Õ0Õ0Õ0ÕfªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:Mu™ê2ÕEª9ᢜTsÂ%ùNª9ᢜTsÂ%y!ÕœpQnªÕT«©VS S S S Sm¦ÚLµ™j7ÕnªÝT‡©S¦:Lušê4ÕiªËT—©.RÍ 多.ÊI5'\”“jN¸$/¤š.ÊMµšj5ÕjªÕTÃTÃTÛ~ÛÛ\«·)ƒšsÜinl¸îãƒWïÖÝÍ·rL7ŸïH÷Ñ|+¯vœ¸žrÜ=Ö±z]<ÒGq·°ÝZ©ùu,¸pݶã…ÜÖf¿Xx7½ÈMÒ%o–OÊs“tÉÃòAyn’.yµ¼[nªÝT»©vS¦:Lu˜ê4ÕiªÓT§©.S]¦ºHµl¤Z6R-©–TËNªe'Õ²“j)¤Z ©–bªÕT«©VS S S S Sm¦ÚLµ™j7ÕnªÝT‡©S¦:Lušê4ÕiªËT—©.RÍ­U)'ÕÜZ•rRÍ­U)'ÕÜZUòBª¹µ*å¦ZMµšj5ÕjªaªaªaªÍT›©6Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:Mu™ê2Õeª‹TskUÊI5·V•|'ÕÜZ•rRÍ­U)'ÕÜZ•rSµÙRØl)l¶6[ ›-…Í–ò¾u¼Þö¼® ¦{çV5Öíêy~jḭÃoÕýjaÝïŸ}{¾ë'ƒÏýVâ½Üü®æ…{5.è£G¸[Xo³¿Î>+.·#;¾2u¿Xx?™Ü,¯–wË幇…äÍòIyî*yXnªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu‘ê¹?ªä¤zî ùNªçþ¨’“ê¹?ªä¤zî*¹©VS­¦ZM5L5L5Lµ™j3ÕfªÍT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu‘ê¹?ªä¤zî ùNªçþ¨’“ê¹?*ä…TÏýQ%7ÕjªÕT«©†©†©†©†©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT©æåž”“ê¹?ªä¤zî*9©žû£B^HõÜUrSµÙRØl)l¶6[ ›-…͖ιçÞ¶m6 žsÏgQÙœ{îÇÂV.^Î=÷盩~2÷l·> endobj 265 0 obj 18227 endobj 267 0 obj << /Length 268 0 R /Filter /FlateDecode >> stream xœÍÛvã6î=_Á·ÎœãQuµäÇL&m½›¹tâÓ9»mh‹Žu*K©DÇã¿_/º$³ÝÎ4H‚  ”?¯"ÂoÔ|³ÝñêO¢E,Y²$R¶dQ,Â!EV°ZM€j ‰¦ÒlDìËUs²¯~ý&•, 2v¾ 'Ì‘ÍýÕϰy¶ ’e±Z­HÖ8ˆŠBm‘KvGöýú³w­žm¤WŒÂÿ¹ô¾DIÿH²‡«·›«ïÈX²ÍÞ¹@aj.’˜A¯ÔŸ˜mŽì×W÷¢ï«¶éoJ¶éxÓóT„׿³Í?®n7tVÍH{S ó@»Ô` KÃáˆçn–î¨ð/ ¤%ˆ38”ªÉÂôS 0ÓßÏjˆXy‹ÇöÒªû;7Þ4y” ˜$I<ݽìoVÙÄŠjo{}98 ÝÜŽçÒgÙœ[öéÀ{ÁîÚÝUóÀΕ<°û†?ö‡V²ußÖ\ùyFC!Ī`-Ã0Š ÓCÕ³c[ŠšЉ½è:Q2Ù2Þ³÷¿Ü}¼ùç}ÀÖ’ÛîžÉƒ`=? væ5£i»#¯YüéNa{Þ©§Ç’K× l×6;Ñ5¢ P*O–,ò0‚.—t>\ºÿéㆽfé2ÈÙ«õýÇ»ëÍúãK È-t<Õ²zº|–¨6>ÁYšÝÅÒzÙ`Žp>T»ƒÅN½pìÕIí:£bCh÷³ó·¶v(o•¹¬ÄÒ_5ÑÇrúˆÃ0I Ô‡¬Žjñ›8ßÂ= ÆM é%ïä7Ì“."ŽºnüéZ¿„i¯X8¼¼ô¶iêË,oé÷¶÷¬k¶6æõÄùr¨jÿÐp‚n¢©"iª7‘W-,@Ó0àöÔ_ ¼;ðæA]Âz g¬Å̘=xá`ÚÕ¡Â `·©ª^ŠFÊS%ΖÛþQ,¯Æî¾ãv7¾ÛÁöÕ¬’‘jx]ë[ þTÕÞÞx Ò”ºÖ Ù/¾M Ðl{öFOMÕHŸ§Gà?ÕW¼éK»šQÅ[e$%K`Â÷\NÈ’ N f¦KŠß*°›¶Q¦|±jT0~!Dù2P LLØý¢¼N‘­ô­WÁôï RÀ…á®6ɺˆÀ=/gqÓðxnìà-ܹ™q/¨xòñ†?ˆn žìÚz¸IÕù2@v¨d^ìˆêÐSÅH7‚ëüð&Mƒb"ÁÁs½£˜˜2³?Ø9øÜUR :˜;°‡…!1ÔU^x¸¹xˆVǦuðÎzIàˆ·}À3¯¤Çò,ê‰ê äŒTW鈗٠¥¢ùVòÊ œ~ªðC 4ž8ÔªçÞ…7l0:jG8AÒ€Ðk|fÀܰkwP|v›Ž³˜“ƒ0mËéÙÕkkpv%=¶` ¹ Ä ~`xs¦ø. Þªˆ‚¡˜ãú…Zo‹.½tŠã¢B ÄTõþ l¤ì•øÊè-§ÓjØËšÇ;Ó ÚÃD‰#Ò@h Þß~^_ß­ÿ}ýöîÖÐjÈ/õìf^\™Ý|_u½Ý…2.tíÑÊaÅPš˜*"͆Š@g[-u¦èJ ˆb”Bxw胈V{svíÙ!â+duÌÄ܈X4½À¢ìe61Ú‡h‹»!u`‡ž‡»y;•­è›ïäHÒ¡ Ï©Â{‚ØÖéÄéæÓê+†Â} åQ`I`ífHéÚ6 *„¬«a:~ù!.ñt›Ðù^Øå­áê9±U¨t‰ó R¶vÖ[p)ÅñQÎ(ÝA£æáÐçWXx½IÆ*ˆø“p˜Ï|ëÓEw¬SÜÐf½7~ð&·F46ÔmÛÖe?+x࿉áÄ»yfSŒ__ïj’Tg—ýTÏPøõ|ÖºˆR//PùFÑB.*ìýíçoí…©éUÓDÙás{‚-„ù~S=<ˆ®¡•’.³ È!ûæ! ‹§§’üý/77/‘,Soš|UdEê‘(޽2‹0ÅËCÝ7»óçóFoDð ç/¶ïD±Òð·_¡Âì«'1žôì†ö…hë¬jÊê©*O¼öE€å‹´=Éáé°¯ëØO­¾LFê¤]˜ë–³ÉzGÜŒò‘©oI˜Õ¢æ‡¢Ú_<‚1b¦•cM/Ç W*»óF´§žž[4ò xÕR!@4wá-…R££˜O)ˆÍDËòl¤)?ÿ£~²DÕT: b/ r—¼+=’»?ަoR fÑíÅCäa4³ûnÀÈ}KZø,HC–G/þ §J+ò9¥ÕºëBqô%B>ܯï7·nþ¥Àö“¨û:ý*ªGT²*Ò¤}¯Éu't\´å®•KHw² “F¥ƒµ\³1ΑlK—pŒ"Cj܃ö=v¦qeæª_ ÒPSt#p8¶€H¬ÙSyD(çú‰Ã‘~à¸hÆ•9i´ò¾ä­èH9sÊözVk ïJ¯L+ie»·ÈÑq?pË‚2¤cR‘o¯¬cëÒË>ø å›y$ZöN ·¥ãmî…j{¨¯Ú3¿PÄ#Õ<ž$5O]/ß ã^¨"V¬¢Ì¡ú3Ð3¼ìÑ^`MCĽmó—Ò¹¶0ù¢~yylùI¶G¸…;åƒ3W+MGúÑ¿ 3“ÿ°Ìøƒ_ìúyþ1 endstream endobj 266 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 267 0 R >> endobj 268 0 obj 2989 endobj 270 0 obj << /Length 271 0 R /Filter /FlateDecode >> stream xœÍZÝsä¶ ÷_¡¹§dÆÖé[«™Ngœ‹¯qç>’xÛL›ä^q½êi%Ÿ¤õžó×$@åNú’6Mjü AÉý|üïJý)«$Ø/>/Ê$H båE—am‚c@`“o‚V5œ‘ª ‘©æRk‡à§‹î" þrñó¯Ð¨¢0Α'ÅÜ]üÊó"L‹MUUdkÆ›R‘†»cðúö˜ßöºµ±^ ŠþçÖs‹Ò8ù?°( .¾Ù^¼~›ql÷.ò8Œ"pó&M‚M˜&•ú' ¶Çàç¯îä86}7¢«ƒí ºQì&Åøú×`û׋›-U ÒÑ”À¿e¨Cjö!Ï¢ùn–ï¸ð_¦ÈN˜ä0(õ©¥¦¿êƒ!sí1üû¢‡H뼜/íº?RùËSS¦À 7³)I3æûy”ýÁ.ófQé~y0‘]ßJQ·ýîSðuPda|ÕŒ–ÜõÇÇVN²}¶,ñÔ7µ¬C˸í,9d?<³ÞݾmvÓšäÇbú¾•îÛÞ’RìN¦‹÷59gÑLM÷`ñ¾œ©–ª›ý^²s¦ ýÙÒǾ7²Æ)e®J¢…¯îÕà’H”¨ÈÁp­!±´w°‡¶Z‘;1ÊKÓ½³‚öžl&ÏôµBšãQÖ ¹Ñ­åpl:àÔÄøFÙ¶ދݧ_¾&pêZÈ*žÆQNÊž'Ò$LÓ(ŠâMŠž8Õ9Oà KÙY°;ˆîAëD|n¦ƒ¨iÔñúmµ Ñ8Ê!ÖQ”$…¯øO`"Ȉˆc˜X1‰{p§ãÌã…˜ÊjøŽÃ¿²8%Î8/6Vz )K«°È3ÈØåÆ·2´Ãüé ;ÏY¶hOÑ«p¤90Ð}p®Õpê õöúÝÝÍ¥åk'“(½s¸/b24­cå¹;qµLJMâj'N#kb½dƒœNCgíV±†~¸ôÜ Š‹™îOJÖ®lœža5‡¨1ÍçUæ¬EúqOM-ƒVPh[ô¶ÑÓ¶¨ÊU©f_­d%âõN&d% 0%ùw§R’'3ô\Ul®Ú’¤H ¸”Ãôlð~kkƒº~2ä½íâBIC› 4šœhñø+CØqêìeÉϧf÷©µzÁëÑöµíD ¹ 2SódóØA¥½UÐwˆ'éù`-| [bh EAQšA”^R.íô—ʰ¶?}_šãéˆ`ßÊ/Í}Ó6Ú«ªeW#¡¶D ÿF)®tARÎ2 Ù=4$MçC³£uï²Zæ5z„zpj\<úNðf…úqC9W¤©¥©|º3owŽ$éëp­h¨ý7ßß\o¯¿ywcðõ·Héy€¿w7?Þ^¿»ý§kÓŒ}k¢`+Ÿd;^"`i7£4—©ÍØÑ6Ÿ`sóG”óaäÄ%„ÎâUêiF ‹DKC„‹^“ëcjƒkØYR­,þšs/§3nxˆaBF×u:÷LŸfÓ Í×Ìß µ¯û®I7àØ9‹„bçîÃõ÷wß}Ü·wß]oo?~X ‘" £"­ª<%Þ¢ iµ§Ùš „bI/ŸrÞZ2TŸ˜ó¥ËÛš¼Eh¶Ç“Zñ8r­ —‚5Ôº‚™9/(ÀZ† PWƒŒ%…£ýÒ­ÌB™,üi¬ÈRÜ”!òkÆXl&Ä=‹ny«žmä3ÿ:W!Ž‚Í—/¶õ“WåþNÓiK%¸M2¼ÉÄÔè{q“-¼h¤æpFWkôI´ dYéxd,g+}œ›ŠLÁ[Ð6BÈÔÔp¦'n¥¸¨‘s»Ñ$SÙAžnpïè½hG&ˆvœ5/–ÕY–­8U•Ó¾ï«bÑŒífWÕfeæ‘Éêlâð¯,áçwÔÙi\„lˆq ‡0ß0×YÆÚ Ý 9àb>.Ê7Í´… Fÿ:¾c’h³Ð%¯vfJEéŠ×VÊ*È*Y•ÃBhmhaóÚK±Ž`”¡Yµ5W½¨¶kVm)ÅVæª-ƒÕv9¾7’寱(Nü½&çV©ºè*ù^G%ÇH¿ÿû›7¨=§½´ ûðæãû÷·Ûíã5£%¡6>ö“9šUµ"ÇJqzĸjZ'Ϯɰ;4“ÜAÈ5õjͬÜ+Àǹ`Чvj®`¯Ó'¶AÕ¥êäpê â<6“ƒZ…úPIpšëµ÷™>Gñ@Ù !¢:Ž=ìJÌÊ,”yXV›(Ê✪BJ(q™©C«òþ%Ãv“G(½ÜÛwx, 8@}:2¬ÂåOsùxx2ºÍf‚ð¡ç†@0ÇGæöjfȃjsØ1ÆîgC\»®è}nÊ…g¥…šˆº]ÞÕ=Ôýª†¯%Ô¦5̘WÃßK•”“®´ã`öTWª`æñõÛJ¶Å¥^ça”@–Œ2èÍ¡ïõa]Ib—ÆÁ{µ˜^L· ŠÈ2«*+fGÍ$ (ñxçè ü î´ŒZî锃xbyu‹,†-ŽÔõ/ÆdÕ¸Q¡§‹D¨;UíÓa:U\I×ôâ–K§ƒY¯êŽÔþEX-¼£¦í•fØœRè¸?ýöÛ³Ãú»ƒ¢ÔöÖðÔYëþü*t¶j­MzQ²m¹š×ïv§atØ,d²Å‘tÌwšV»Q5Œ@Í…ï°"Y8ŒÊí<㸕Ñxãð])hî:¬‹*,ççä x¤™³AJ.Ç$]‹Ø7³¾ŽaóùJ_r ™ñ œ Ä[Þ’G¿íûÊ¡ù !gÈwÕ¦X¸Š¦N] ³‘rCALUÔ蚺o³lS`Q‰Ù[î÷°ñL4lÄ¢µXí½—á- Òò‹P;“û¸ëO“D™ËJq94ý³NG Ì=-Yêû«Z&ùQªZF.9î]ÝL0È¢xAàâ ±ó+}¯u€ À:Ñ®]õ  qUÚÏö§vß´Ü §ϹƄÿj\މ÷ÙXü[ûx™ûYô\Å© ¢çwG) BƒlqM‡YKÉŽPò–{G7üC+ÆiÅ‚Ðñ®w»~¨éüAºúôšþò¥ïìÂÏwW²Ìü¼ˆõáßÜp!Òû÷è`ë>™ ‘ݯ][½­š~coìF¨ÍG&ß@V48ùt¦wúpž¥ÓQŸz IÍSc¼r#Bâ„£ïý«Ž,]æyˆÝ±©å@7ô¥Ž¬‘ÑŽå@1„#éS×@™3 §Ç‰Kr£#ݽ—üܬ?ö#‡¿Ê )Ý3SnIʵc¶Ónr^V¹òf¶Lñ¸”6QXÚûôâ‚€¤#à’ÈAÙ¦#kÌ߳岘‘q5ûŒ»1)1~!=‹{HR7pá³ n=“¨öA¦Lî{ÞôùÌ—9q_•äºVžÏ2ÇI ^Á"]Œ´ØO’A<¾! 't Br :âÇxbÙûoRcÒaW#¶YG)fðùд+N)—9]Å {êÐF¢!¤ŸÔ¢6•w¨Ð¤ƒ€zÃTÇ=[Ýè’ÞW\%a^©_VE ?f=ñìh… ÷R¹%ƒ4^ ºO½%íåɰԡy ‡* y^FŽñ¼Ñ&:&ôóIŽ˜P£#Ý·‹Ý_…–ùÝ3äRDðæã‡»Û»í͇7ÿðçð¹3LÈ‚—6¦h-F%H«¹±ªûP×@ïHþBA€¨qmÆiè!åLªèôOj|%4<Ì£­ -ܲžöÍÎ0ìÛÝÊ(’¼p¥ln4ͬ'­k‹¤&˜±™pL;·“£]ª^‘mj9ÓJ9a adáERítröeÍ*T#Ï¿qÍÕmÞÌQæQ³Ò»jw51…}ÅJàÊËÈ¢< €{ÂUH8¥lˆã=ù|±!ç'ûàZÙßó•{2’|WÀQyî JenÞwõ];Bž¯Ñû°ÍéeƒPXj扒ü±NÚ¼î@¦{C¼gSÏ‹úêÌ1kÇuµLžÿáE¼P?üS?Â(716¾¦;h{õB›bº+#„¿²!piŽÚÙ¡ë.åH¥4Á±Q/¢“ôS&£«ï:Éž°WQ~£˜™]¼‚à œq’ïß-ÈÜpñû¦ã²`ž|êÄq²be‹y´"ŒV7­d 7òKÆÅ:Ôô_×bOÝëžúy”°Û™·Ó•›`ßÕé#ll’·>HñÔÐËrö3ûÎC3ÑS1qÔËï>ýû@î>ý8ôhÜoñËø@6‹KƦ5n[QÄ&t&eÀF,B;úÝÕ4¹¿CÆÿ¦7Óª¡Íˆ»‰‘eÒ6ýžýß@b  endstream endobj 269 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 270 0 R >> endobj 271 0 obj 3481 endobj 273 0 obj << /Length 274 0 R /Filter /FlateDecode >> stream xœÍZÝsã6Ï_¡Çv&«•dÉ–½‰sëk²Ù®Õîõ:Ž,Ó±®úðJr¼é_ ’ÐGön¦wý˜à’ ‚HùË•ïxðïùg± œ¬¼úB<ßYÎlN¬hîø wîÅN鈣Ø)dÇ)»9S\êàè|¾ª®<çoW¿þöŽçFÎåÊ G1Û«aòhîÎæñr¹$]×c9ÅÌ‘•ÎÛM8·µê­µ—‚¼ÿ¹ö\£™ühä9OWï’«·w‘ã{Nr°.ù®ç™ãYàÄî,XÊ')_¿ÛжÍëªuÒjï$MZµiÖIÆ÷¿9Éß¯Ö ­U RÞÀ W¹T¯! ½~ s7÷\ø?tgÈŽD°(ÙTÐÓ_Ù ÉHY ÿ¾j!Å÷K™î¯œüõ­YÌ€ãÆ½-™EÌö}/û‹M6ÚE9÷ë‹ñÆÞõaõqûþ1q¾wÞÌ|wá|·Ù>Þ¯’ÍãË*ij(Z‹ÓFXÐvM]=‰ÆrºcZqÄ:guÓˆöTWû¼z²ìOëÕ­E7›$Yß4°0M~ðñÞ‚²Þ wŠY ð†&¨K%a ;ŠêÈŒÅzS—l¨ªEôhMÆö„J¯oO©>Ä;cÉU e3Ì“bœ¶«[êp­špá²Ì’¶eý °oT~3¨ü<¨üü`AY3—ÕcZ‰úÜ:+¬¦ÀB‰ ‰ß¨ýf³QfP»¹ T‚W— ÒõA{ŒèÈÒ§P#ªæl,¤ ˆDln„‘ÀÆœËnuºsÅÖGéîµ9/uóÇøž SCËöF]6f ™WÔÕIUùÔ‘î•‘aâ²kXïë ¸|ÃÆ í¥Œ†£*šJÝ$‘Ѽ̵l°²Ýxl{´·³ö¼Ì PæÛa>ØAØ $uU CÄ5BîŸnÝŸ3Á‡ŽIƒ{„2fžåtá¤.‡É‘í \)J×à‡õÃã§_ D/@:Yÿ#±2´» ÜÛ%ÁuÚJ?¢ËÛh l¤Ýoa¤â ìtXö܇ óâ๖ñ™’3¢›\Dn™[H!C¤ëÞÔ l–DÜ‹ñLÛ–ëÇúè‡åˇÜ1¶X¼X,ÝT-í¹²6©e˜J›\4äé´Œ¨c½¹²ÈQA ÉC^åíÝ9É‘53rO×ZqJA¨` àcÒdJ`Ék®>CNj—¥žÐðÈÙ|Ø®?%Ï„Ëa@ÿéãí*Y«ÝŒ#]?Kêv}¿NÖõÊɸäýb „¸éJ‚N§ñ *JŒi9î…ÝØ]Iê-—4»G¦Zˆ£AÌSí³’F?íùÃØË\y¨g XôMbqÿyyxî¦s‡Àœ;„úX$i6ÓîÌF¶¢€¢@?’+–®:hΪý†Ì,›šÓáxµÿI—^¤Ï µ$\žÆÕLŒ¢µºVfévX)Òûð°Áï„s>Á¥¢ÌA>©ƒ"àðRCå6³u|ƒcýaê 1 ‡Õ>Þ‚¹È+äÅÐÆ£žÒN¦6ƒsÛÔ1 õéT·xÿ Æa²ßÎFÁª¨€Dì»±ûÕ5pSMëQ쇮 CÖ¯\Ž ž!õY›0Öö˜B¼€ã=cÞÒ˜!™¨žµPeû®¢¹Z.‹­@½uLØn9|é‘&–Ãæ¾ÖH“ÿ ÐߨIZÒµ8á]»KÍöòè!™½Yò͆^Oh^£duu(ò wY;Þ¹§6‰4’j4‚9SIgÃozãRÞ0G°¬£¾O«˜)ë°Þ5Û®1=@4Ç{¸òÛí—\Së}ãÎAþìݹÎÅEšm/,O^³£ }Ð?XÒ›øJ™ÀŸ{òyáý (CßOˆ•óvUýéªþš5¼Ôg†èÒKè9ÇÀC6GwUßå:Æáu±È­­üR¢èo0„u9c¿p´/ój<›ËXæ!ðíÝr€óE߀›wŸÔ~ßB´yX¹Û_¶Éúá÷íz»îöÕí¼p,Oj,TIߥ9·-bùŠA߯ti€Ô ?IÆ,[_³Ñô­)—’üW£|oæ «Ó€ñIX,ûŠ÷ò£'c7m.¦mÅ¡‡Ï½aà×iEÊ7L*VÁIü¾=-aǤcŒ€í,2îØ\S=¯ #·KØçí©H_Z«ÕÑêB¦§•†DZ7Zú}›©h.ƒ¡^¼¼¡Áô°v(.ÊB\ÁBg5B½‚jl4úãù˹ï4OHâ/Ïpøe¼\„s¿÷›°áOœð¿¦.œ­y]×ÓHÑ‹ñ1™Óü…G_„W÷Éú“Cg¢÷³êh endstream endobj 272 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 273 0 R >> endobj 274 0 obj 3037 endobj 276 0 obj << /Length 277 0 R /Filter /FlateDecode >> stream xœÍYmoÛ8þž_Á-¨z—¼ÈpS÷. §ÁÆ*‡\°PdºÖ-¥’¼Ý^Ûÿ~C)%Ù—O{×dž!9o‡Êç3¹ð÷BüHf>+ögŸÏc‰Ï‚X±¢˜y‰»)Û3Ò(e;1Ñ"ÅE’«f#ز_Ϫ3—ýõìá&­™ëDìË™;ŽbVg¿€ò(v‚8ÍfÊVßñÒT¨œˆbÏÞÜì}ö®–³µõBû?·žZxþÿE.ûtö6;{ó>bžË²IÈs\œ>KÀŸ‰?>ËöìáÕŠ·mYW-Ë«5Ëš¼jó¢Œ×,ûùl‘)_¥ ™M>üK™RÖ@ºöI·žo¸ð?täÇñ#pJ íÔ«Ÿb@“‘Œþ<!%Š,î— ÝŸ©üøÖ$pœÔÚ’ &±·³ìOÙh…îÞ™xèŒ;Ê®|×ñ†µ˜c¬íòŽïyÕ¡oÞÏÆü™3 \øx(âe¼ë\öJ‹ÒPK¼ÒœŸ~ú‹&çËlq¯Áj±ZÝÜ}Ðð²:ìySïJP’ïz1ß4q½¼[-4ø®‰ûÅr17üèqŽ\$"‘&éÀ ± 84 X­¡ñêbäÕ…ñê‚zua{uf­™ßÌŠ¥&¿“™—™“­F.ÄÁÀ…ï,›¿].Ø»y6g?ôŽR² r<±2T’+³-ª<ׇ„#¡P â¾æXP̲%àÐò5O_ È©¨|½/«²íš¼«©Ò®& ØÕ-·$ÔÝö¿Øx\ZÃw<·äuV:Sf©{Õh fÉ Ä®Ðër4þuË+MçƒIb¥Ì\Ÿ÷C]?FTÀŶØL1lØZs¾”ÝvdÇ&/w‡†÷ƪ¤˜0±áû¼Ô7 ‡çÎñ¨Ÿ9zïyŽ©rD¢>‰ ‹¯Ë͆7Öð¦©÷éM“Àäƒ-ÛØ‡Vç%ꫨ8ª½ØæÏ•˜“ÁòˆÉ°û,M›º±„WŸÊê“åË8œ¾7gË»–µ¬Þ0á½Îgc¡ï$BD=êA uÜÚXŹyGú¦€öGÁœŽå„>zyxAìxQˆkl)ùi ½˜©úGk™&ŽÀ}&ñ„Hê uRoµŽ‚N‡0í@ª”âye‡ÈÒÂO\¤‰µ7ÞßÝßÎ3¸0~[]ÿmq;wV_e‹ÛßÔ5²:7œȺüiÇÔ¾M ݣȽá7ïdá©QÌv"xˆëÞKíü ='¡7b«* †U8$ú8§+• u’!ª­dC1$ªD;܃†ÃÉ0ЪD/Ѿ-Ô¥c.8†cª¸@êöÖ®ŒC˜¦ƒ¶Ï¼(7%öÀ7¥ ic³j;òdÈlêÝNÆ áS^ükZ®Ù U1é‡bÛƒÜð»ro¤ü»®øùQ[Ûb wCyW8Fbc¤À†Á9âëQ´|×DKßÜ3QÀŸ²!¸nJ¨£ùްäNœwözŠÐ±éA«¡œ/ê PªájÓ-*ª,´Û &îv¥¬£²1TÉæç¸&8OÏu“7_)Oüq.úð„·£+O_ËìŽáqk²‘éC‹NÔ <¹H[Y­x*T®ì¾– "%QEɘ(Y}HÔ`E€ÚÇ^h}h ~L’n²ÆµÏ÷ÃA°dhH ÚuÞå ®á¸ÙÜ 1]‡[òdâFÎL”q?V}½x3Ì?fw×w··7™^:ñºóÁ%ûI Êb~èê¢Þï¡i? T§žw)´pÂé0Õ£ RÁÅ«Ç6Ž}cÙýÇûÎÞÏ—ðþ:õ àa€*HÙ‰ïk¥¸¥=¹úeÙÓæX"–)¨†º¼Á&±|s Y4<ï°áRÒ{êçwo¯Í¼ºª¸,µçFC7¥¬4&÷5k_¯e#èÆÌU‡™eôä¼Kñ¼ØŽR2ðýAÈ04ÀžÙý4ròžêíC(@ò™7ЛîeÜÔ*Øì=„«€,þêôlÕ¼Ó%{Znfà)DZ‡ÑM7eÿ|(ÏwT¤,ýHZܽ^ö‰‚p%Há98u-3ø¯ØS]ÃA¬dZ+æë“½ÕX$Ûón[¯u'ŽYtÌ&æÁ r,äºO·£Úƒhz)«Ÿþ KOU’@|¿…rÆQ¢²%›ßgpBçVókÑgž(&A’ ê<_Œ¶#/ù`ÌfÃO-(_Öéôƒ;üÊ ¹ê[‹†èa÷(û‚K¢qtÊBoøqr»Éð:iáX´WìñD] ƒ`PBWÊ_/uBUØÄÓ‹´=uÝÓØá"ØæôsyùŽ„ç»IõÖƒ¹gQ³O[JkÆù8¤p©Ù1…L¾ã›3®`ÿH“ÈúX€,:¬^Þ p¸ï[¸yûÙPÉüÅ‚…CêÝ‹cÕ9ûr½Þ\…9Yc‚wN&©ü‚?O'f” ¢–vÛ¦þRªa’oÅK«@$úq«†ˆ<¬øv!$á‰rùÞ ¬\ª·[ç&ÕÅ|rE¦þêŠHZEô@èåÝõ|Ið#¡ÕBqOÖ1ÇvaXNT‡(Šœ6ßú<ÒûYD>i!H5˜Z+侘!;’È,«cÚÌÃôá‹ýùNÓƒƒ¬mNÆs¢‰Ãƒ¼ ë Ÿðg~ÑåÒ?ñ×dÂŒªfJ)HB7‡îÕÆž,[.1*4:CѨ/~AúOœ§X4½â<¹aòb9Ç(ð%ç%®:Ó—övDZRèªÀ£ƒôCOMÊÍÛÕÄäof™|W\MŠÿÚ" –£‚Žã°G}³ªßkþb› endstream endobj 275 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 276 0 R >> endobj 277 0 obj 2145 endobj 279 0 obj << /Length 280 0 R /Filter /FlateDecode >> stream xœÍYYs¹~ç¯À£\Ecç>¶WÑ4wÄ’²âd]Y¯FCPœÊô–Óÿ=3C)®\mIÛæuÕ¢´Ú¡¤I«6Í:Êxõ%™­+SÄN“ÿBÌŽÔ`Â÷¬áŒqÜ_sáÇÃ.ç;>E§ ±Ãâ7CŸeŒÿ~6CB•±x¼_,u¤ñç·&tƒ£Á–¸¡‘ûá)ûƒS6ÙEj[ƒ±&§ëºÓ' ½B¯}×…®ÊzGÞô?þÉ ®ó¶.ÒÑ’‚|&…¹æl®¸l&Í28Ý/Ø=óD8Ö8‚]ž>VuÛåY‹Úü_äÍdç`˳éýºµp‚›¦Þ¯ïÐÝíæèÌÇïï×Éj¢5pqWʲ©U§E$ƒj[oï6‹d}w‹6«_WtÍæP½GJ|êqäc/,Ëõ¤n¾ 2c[1º‚Õr¨µ(–Ø-6fHâï·Ë»››u’¬4ï|YôeÁ¿­Éâíf5X;‰"GQœÑvu¿^lÖ¿ÑÅyÛŽ±FRï¹½e)}·^ü|{·MÖË-Ú®[¡ëª/HC“šÕÕ.gø8ͪíÁM¦å,vcaàâBfäºÍËcAÐç´è j$Ë÷yfî×´ïX–/à›-ð„ mU°¤;cÛÒsÃÆû3öî?:3ÎŽ`“c”£htº+ÂNä‚,ôTìt#@ˆ%÷‹ÛíbÉPS¡ñ´Ð~-v‚ø¹Õcô}h‚<êŽë»/ºÃ Â|¢œÍ)à4nõ$ΑÆQh&ÀÌòîv ¦Ö·ÉV® .¬àþÒ è"g-é(zµ1yÕñJ†Ú.íHIªNªºÐ ¸`-ŒÐÞ<¤ºÓa_Ñ•©Sò˜nI(oK”6¦1ɱ›â]kŠW¥¥Ö_‚MQÜ…kèõWônõÓêþŠÕ­onVP ’ú6]ꃆÖl7¶EÀ#ìÛ†œd~´ ’S‹ÍÆ ÎÆøy妶ÆøëpuY¦o.뛆æE£Ð¸ocôñ…‚å†p…i•Ž}Q¥×´¹€'XìDÕn+NÞö';Eîú†–%I¦Z¡.Ts½X«LÇ"'ZoW_ô¥!­^S_ö7ë›ÆôÖ0ó¿uº‘3JäÓ@{9(ý ¦ª;D©ÏuT¢—Q×UBMù¨"_ºáÒŠñeX-bôçÓ‘4Û_6hW¦}êYì<;Á5oûã±nÀƜړ´ë‚_-ÏöqÝ™íËöls·ü+J4”^Ä+Ï¥  xe9T‹:û'êÒ‡âûPÊ£`i™-Ð5Ó÷"vè#«Rä•8OÜXN0·¥úXN^´©ÛÊɯz(ÛeNõU‡ošþ0«Ÿ¾PB{#·û•×”3:á2üöÂeöÀJlÓG‰' Ëš½·b™šÃ§²¼Éú²UÁûg®ùpjC¬ì‹.?c३ûVs£jpSSUnørlêG¸Å¦aÒjzÒă¡£"ôµ–6Æ4Ã1&UÛ›&ÓIª}Ë¥hô6õl–ƒ6Ð Å¿ºø¸…÷X“C»VóòÖTHÛöŽìæš÷”w‡ºï4ã B_æèÝiÞ®'†@­ÇÇAœ]!JÒ½*X³ÞâLSb㔸ëAÍÞ Ëœ&_HÖËÀÄ´!ú”æ!ÝW]^\–ÌÒJõC—æÆ*ŽÕ‚ å™gHÐr;z@WµXsX X›pÉÕmÄV÷Å´øN4Ê'œt¸2l\ìÈ›ÀÇ©Ê 3& AÒ4ucèhõz‚–ì°f$ÜiNÐâ ˆÑ9e¼}]õ“„Ö'aà‹õï¹7®§;$>6?rŽüBÅ)†•|˜ª‘èY %j(ª)'Ôj®XôiS"£BC 1•Oa¢,É.‡Ø‹“^°`½‡2pqšš(¥F|ƒsL”Jö|(Ò}ݘ‚§º7—(œ qÅźCM²–À õ1ã´¸'ÒxnÎÑg6èEBMiqš?ë ¼$Â]¸ÙÁ4RÃ&1ŽFI4ßã°Þ9þðlqŽxvrâAf‘“4nñ؈ôVˆ1í¶ZEî~NÅä×==9h ä‚´SDð õòW 7Õ£=(R´pŠÓô 2\äa:$¹ÃÞ€’© Š:e¬• ßb—õ­âò]¡#Q¨ÕÄA/”xfO¯?­ö1¯dutUG4’õS2˜ ’²'’4­äÓ,9Îôæ5äSŸ7pÏ.д=59(b—` lça×…·‹rKþŠ¢‡¥½µA‹|C¡C ï³´:!²ß“¬C –©ë»@Ìð‹n]uM]°O/EØ›_—K<øºÛ:™ endstream endobj 278 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 279 0 R >> endobj 280 0 obj 2277 endobj 282 0 obj << /Length 283 0 R /Filter /FlateDecode >> stream xœÍX_sܸ ßOÇd&æ‘II7×Ìlìmë‹/îÙ;ÍC.Ó‘w¹Y]V’O’“Þ·/(R%­·›{¸Öùc$Ä øÛ‚Å?æWœr؋ߜŒAÌ!RN$°˜(š@ŽId3qDš)ŽŒ:©›m™=¼_” [|øˆ“¶@‰„¯ :SnÕÜ/~FãR‘H%iš:_9aIbLDD!±)à»ë‚ÃUÕÍî½7ŠèÿÜûУˆñÿ(|Z¼Y/¾û«Fa½R@2B)†9‰8$$â©ùá°.àË{Ý4yU6•[X×YÙd›Ö^~„õ‹ÕÚíµSÔeÇ¿1éRj4 éæåƒÿ YJ—¸)3tp'ì~›ž”]Äìïg#äT‹§çÕ…îÏ4þüÑÄJH2:’( b?β?9d³S4¶ýfb@ÂÍP³ÊÅ·—Õ¿³âñ !"‚ÀMµùœ—Ÿ`=ô`”¤‚±ØØNc.EŠÖêO TÈ9‰£DŒšQPkØ¡K ýÆ1Žc•ìÁ°ýº :ü,Ul„^§HF: Û—«‘¡~N$H¥”2gù(äÏ4o”ñ‰r>Ö:1È è<'⦧^„üqÀé2qê½A'陘u~øc#?qè¿:²Ó8øL!™¤`D‰à±IAiSàæöò-¬—onVКÔûWïï®×«WŽ}€»ÕòÊæc—Öt¢Sa"(‰*™Óy¿üçê·×ïÖý"5_”ÂUdp-ì¢&û¢«¼l¡i³Vºlûåé|9£ŠPQI·þ‡# ^Ã÷ßÿ¼;ÎyÔ›|—ëúµµêÆrœ(†®I6×í×uºƒ‘2+ôëÞåY)3=%Ja§‘"qðoL„óf/á"eDÀ‹l ½f2ÈÖû¼¸MU¦1yA8øÔè`dûT›Ú2Ø)úþç›i‡&ؽnZ÷^ëæ¨ßEŽå«­J=ˆvUXØ#›§ºö'K±I°&ŽIiã¡==s/Ùt»´ôÃ0ÑEÆ2Y;ž:`þÔž³ÇÛsù ³ ¬î ²Ê“uu8£b—Àw«›Õò~ç “S‰EË ÇÒØ­®õAg†oƒ(GQãÅJ)£Š,œf~ž‚ìQ”q‘à=RaYQ‘µz…««ß1„ ¯Ý)wÄ_Ä¡«£luì0Pg¸ ¯Íå’Õìçäí|]Yyá]‡ vOﵟTë¢ú¢›™Ûašw‚vŸùEûÁ‡ìPëlûû Yx™èAë¶z——z{*­x‰’˜W2qzyûÓO×§r)¢‚¼³$JÆv‰‰k~^E\a"bˆ] øaºØ&õ>ÀûÛ»·ð‰å»+üÿÝ-2—_^¿ƒ'2&ÂŒ¡[IJ]@Öº.òm€ž+Q€eò"Dê׼݃õˆ@—:EöYCv8Øeû¬ü„ç‡@6ì6êirÿ•g%*<ꯉdi’Æ®§ÞÝÞܼY^¾=l,©J2Ä}êæ«Î9áøa)°3Îû¶7_ï`êœùÃ1Ö¼=¦¼¿Öß òÂô_ß',Ó‚¸¦å¦Ž ¨ºÎèfø#õ¢Ü6VˬCc~·ƒÈD¢ر§æÈ»í¾ž>6ÃB® ­Ù+˜Vˆx¯iŸæ¸òz×Sx ޲gá{?0T_K·¯zIÖ¥þÚ“}„x¬­ÍêÖí Ù_ŸšÖ«ÝÙVj•¸Ø$CCôί‡±ÀƒÀì<(2%/÷ºÎÛ¦CÜc]a´Û1Xí:IuØB· #T$” 6 ¬oÏj£’r’àçA"újùMh”\…;LñôÍh ]üæ*…"‚8:ŠM›Çxà[íÆ#`ŽÜ1tcw ^«£*Û¼|ÒÏ™¡!£ú¬§¸ž{Œìg‘)e2‰Vˆy¬È| z+paù~?–óð daãïe_³ÐÎ;>¢õX-~¢¬Þíô¦ ØÏÇ=„s³Í>×_Fu p´ƒSùÓIœútþåÜÚS¿¼|6EYrLºÝWÛë?^½¹„gýá*ÆÏ鹒˪,uPmŽXøñ¥P=üŠKâ2}ÿ‘©$©yý‚M€$fg<ý(šÅxŠcæù'J‰°ÏJá™Äì¤þ¡"Ù§@Q÷1âÏx 1ó#5³áDãg™cþ˜»‹zgÆÜù®¸÷ ™Zfz¡{–EeÃ{ç<ÎŒ¼p¢‘'žgS$¢Œškoÿ>sq®€@S!~ó²Á¶Ö¼Â+ûA· ÝnȬ0)n’-¼ BЖóùx%Ã|F·¥:ßtƒÄîq„$ ]`ó.øfÕµªQ£ZŽÕÿ_Ô endstream endobj 281 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 282 0 R >> endobj 283 0 obj 1814 endobj 285 0 obj << /Length 286 0 R /Filter /FlateDecode >> stream xœÍY[Û6~÷¯8oM€C‘ºEÀñ8­‹éÌÖVÚî¦A¡ÈšŒQ[N-9I·Øÿ¾‡‰”è8Fº› †ç燇Ÿ’ß'Pü}¥~d’A¹›ünud xjUI QFR*`V‰€­Z8ª%vȵ֮6Âü4©'¾™¼z‹Ö@I&4pnܬ&?`ð$%<RJ›+#‘*')ÊóB¼ clì1>3)cg!37«Ÿl#WÕ \SF¸b±È\¯Ru˜¾¿N7öÛOØÊÑã|9½]ay؊Ѻ§§¼íöëêDjY¤Ý:çÈöü~Ýbï´P:TÅú*Ä„Ñ&ûzû‡®@(‹ÞTP”%îSý°iô˳X-çÓë»Û›þòè—Çp¬5 þ«ÃÆ/yŒ i†1ÿXìÞm+À,X³­zèìğ5ÙÑO“>ÌŸÐi×ìS’i2ÛQ@M‘ð£†$fQGª<•agž#M¤òœM9Ìdê†TñT>ÏU´#¨\H"ŠË²$5ÃFq9¹ K,K"AF¾âˆÐ!•6„‹jU‚{"ÿÀÆç3Îîú;@ǪÆàœaÃßÊŒcS²¨#ÄgÈLWà?"êºEá­Ì°³+Ç™ø+Ž«»›©Ý̜ߠÙr1½YükúüfÆÈN1VÄ%û«›øi¹Èç_qõÜìîûïy>¿>ÃIã’q)RÁBN:}™{·Äô•ë3Œ4Ž#BCFšñ‘b=Àf qs¿Áá%Œ4N9‰b<ß8M†”4⿃}Rj5:Œ½€žÕ€¢Z¥¥V²4µ—z¢j5L<ýÓ÷Åö>}q–Œ6Ò¼«JÌ«ÔhÏΰŒXf$’ØQM|–‘$$îÞ+3öØ@¯³pÁAz}sÐÓk¡Ôo«æd<÷¾¹X¾ãêtíCálªUyl¼|{1òîØ´¶ •#€Š÷*öS½Æ¦l¼M·ßÌ ŽÏÌâWqõ¥5+8ååúùthDœ8Õ_àžÞ•|€­ÊŸ¶h¬½ ᱂úB }5!$,ARhÖ™¤Dº(½B‹N°'¬Çï›÷›me @«4 WÖÕ‡~Ü×–ro•W1Z.ŽíÉFaI¥]U¸ñgÜó Ï¦={¹\Îoó__bã ±Á‹:Â+ÌÞpmÒªæ£Jðí’)öLÉÒ1­ÊBZ55[ý·Þê¤*É""G­&Ux ª±â«è“*µˆ›EÝkî© CðéGz _ÀÔú”1¬jH`Nå#9IP%â.TÐâò„, °QœANnÂÒ˜ÁR…H‘¯¸"\tÁ„pQ­j@ªNdãØø|ÆÙ]BªèXÕœ3¤*É0ÿŒQÅâ¶Î/^Ìo?Þ2¤‚ÈʤÌhöy/þí;CSRÆK‘–ÑØû§³å]ǪNÿkdŒßýŒJÁ…t¬D5í1±ÿÓñ_ßÂkX endstream endobj 284 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 285 0 R >> endobj 286 0 obj 1946 endobj 288 0 obj << /Length 289 0 R /Filter /FlateDecode >> stream xœíYÝoÜ6 ¿¿Bom±F•mÉEV ënM†4YwZƒëó%l_bûÚtØ?êÃýq×ÛK·‡­+"RI‘ÔÏdz¿pƒ?GòG¹$-÷†çÀ%žoXÂ'N@}’’"!)¤à`)EÌÒS\#­‰[ònQ-yµøð„V„QA¾,ØD¹Vs½xÆ…O=?Œ¢ÈøêR' ¥ ú°HKòì¬tÉÏ%Ýy/±Ý{ì‘ç¸ÿ¹Yü/žý"ˆÃH¼¶% Ê„9ô\RÏä.‰KòáñuÖ4ù¦jHR­H\'U“¤­d<ùHâ_ËØÜU)RÕäÂÿU%5Øœ wP¹õ|Ë…¿œzšê ¸”Ü*L†ÍO¹Ñ-…Š˜þ¹3BF:<Η Ý÷4¾;5RŠý°Ê¾sÈ&Y”¶ûËDã˰Iu7YKêM‘‘¦Mڬ̪öyþüGr½ŒÉÕåù’ëÝ»,Í×yšÈÒ{¡¯Ôzà•˱gôΜRz?'Åv²ó¹¸¼Xjµ3I€ÚèqB0À¼îY´ä 9ò ÜÛÛ¬__¿9?jô“éyÊ—Ž¨’ÒòMÍiI·u ¡8@ÃzS¤aίtSµÙCK{FŒl› kN¬ªì!K·mÖL²àsRE¾k²ÛÞæ s¡€¥µ²Ô÷Õt¹mÚž¸M>g=¡ï¡×&Q™='cA{êlÝ/e {îU<ŪYswuö9ßlíá—o¯®–ñªg”gE^æ”îŠNâø£x˜øòr8¹^gikéÍÚ®Mà U$M‹H“òN©,òuÖæe¶K)Ú0µ@-gà*Íè*Ðl'•%>¡$MA±Ê–á|ÉÛÛ>àØN‚†£à­·•úðÐî™ÓgêV2ÇeÌaܼSÀ‘øìõ’¼GÜŸ9é94b>c"ôõI‰LÅ&M ¢Búç¦B Õiš8GxT#ävª²x×ûIÔ +«0kŠzN ¨IØs9²4>§q/‡·^C3Iö¥®J@¢ßùåË“ó=ðçD!d#à|€~Hƒ>«š@¥£«ll ,nJTSÊS+œ7wE’ªÈX®)ùC¬! £–ûN?ø9  £Mê¶yºC|êü$/.‹FÑߊ;DÔªÉzf»éWæ¥8Ö¤\wÑ’kó¸‡Âi‘ƒÚ‘ñ­µcX“·Iu“5ÿÀ ¾²Ðï#HSîM#ã:£ÈtHçA!¤Ód÷qSD÷uÓ‚é4GcFƒæœ!QUù–ÄÎ ¾sš‡tÒÔ8ãš _—¬Æ7Ôùž» ‚‹©i4=oMåDBªêîàÒ=kWDÔ fd,’ò Œxãm^Ý3XÞ÷}_ñÐ~2q@iÙF+8À!©o Ü O¹EáXr¨+1¶3²†®ñ A q-Tø9d’…d¨¸oX©`Nä;ã¾µ·áG†ÕMšã½l³&Üú>ã0œãp‡¤JwÆŒ;²3ðÉn”DߋʈL<ÂŒCBò^dLX«†Õ¹3¶Ýyƒ6ÎÏØ»o:3ŽŽaƒƒFŒp\ÓAD}OÀ(º¦ÉèãŠ>vø\yðx OÌŸ;»ˆ—W¿Z<úÁÎØ#rzùöŠÄ—äõÙÅÛx¹§-ñ ü}&¢0¶%/Oâ“óËW{šÃ·ÝL+I±¹9¨ ñ| äð´9îB&*l÷qÜí©ù>5 úY7mžÎL\! ì{¸ýûÎ++æÂó3ØžîƒÃ÷Ô ?üpØ}¸xìÑj64£Io³2±t7=¹x|ÒĶºß&E7m ùÉ4x3¯ìdµ‹oƒýL_IÜ€^ìH3öË \hw•×ð¡-¾bO&)âPuðéHqA]Ü8iÚ|.ÚsNš~ k{4·›J9ÑH½)†þL…•õëˆ}Jšìé¼F,jg¤ÖHù36«½þdË,Ú‹ÆÓ°Lƒ ßÚa0;SÒ¨î'5ðHÇ»ñ¦+ûC.e EØ¡—|š×/O—¯Oö‡QS¢5À…ç.ÆZ˜­ƒÀBÀ¬  o´ï>®m¨+ïüu >¿:w©/`| ÄÿÐq8tÁGaÓ‘‚ftð»%McèМI÷C&ÕËÕKór5ѵþšÒÁíĬ2Ô÷Ï¨ËÆ.Í{¤ÃmÖ-LDI½Â–Ëž¨³û-Ä«™·¡Êc;ßÅ®«* LÒ µ]6ÐiÙÑývcÒeØm Ô2N¿Þeµ)£¤h6˜*6_ S⚀´„ž˜f¤òdWÖrmy¦Úg¤u‡1ÞEó9ŸF-GQû&®ˆ8V}&÷™Ë„caõ·“øt¨ú® ¨úí · z—€‡@ªÏ9õ> endobj 289 0 obj 1864 endobj 291 0 obj << /Length 292 0 R /Filter /FlateDecode >> stream xœÍYësÛ¸ÿ®¿“‡¾ÉŒ›ÅQ.¾qâÆÒõzs¹é@d±áC!HÛê]ÿ÷.^DRª§¹6ñþ–Àb±Øào3aøûŠÿˆSeåì›â¹(ö)V!7v"œ )„ *øÀ#’Q¤/¸j´;ôÓ¬šaôýì—_aÐa'D3<.Å,gŸañ0rü(IÓTéê9n’ð%|'"+Ñw×¥‡ÞÕb´Öž Âÿsím|×û?УûÙÛÕì»÷!r1Zm „®ƒ1˜9ñ=”8¾—ò?Z•è—KÊX^W ‘jƒV ©ÉZÎxù+Zý0[¬Ô^… áMü‹áRG±ܭç.ü_ò€ãx!lŠ*Ô «Ÿüƒ&Ca1ùó¤…”(kòð¼„éþÈÅOMìÇIŽŽ$p-Û{Ùl²Ñ)òµûͤÃÍà‘w].?ß¼Ú“v‡²iÀ³h“³6Ïޠׯÿ„þ<_}@—¤è(b{šåÛ<#ÜùÞHLØ #<¸E펢~©ŽÑ jk´¡°\™WT|fÝúï4kQSw-çÕ۞̫‡Z.ÌÐcÎ%Tß:R€: HªHI™”WR?K«Às|cì&¾Òêó z‰^y zÁZÒÒ’V-ÓœvGZM“†jrßÐ=ÀÆu£)úD³®5_6y{)ç•݋˺¦U{5T¤;š±2CévËm£×Ýiy¯tA˜ÙÁÖèf­&£m^Ò‘yÂ``XBŠÔÉÑçÏ;ކ–]¬ÐÇù_ïnZêiÑxZš ¦1p“’<Áy>2Ô‰–0áË®‡".§eHg¶ÔB—]ÅòûJ¸JKïiƒŠ|‘çÛù: 8€0}QÕMI ƒë=ä>k±¶†ní¹Ê̆±#Ì–lè"/óÖ’XXuåš6ÓK ëDÛ®©¤ëJζ©Kƒˆ!—‹›ÅÕÊR[[Ø1¼xäȽܑeuYòŠÆTr€SËË®DJoü ¥rƲ®€Ô U]Œ¸¼ºGß:HZ”9ãUG®¹Rᤦú†¥ì.±†‚Ù Ò† H‰ÛÚ¢åAHpÒÝ" v1ö¼ MÁ.ÉÓØà $±ë&ÜÀ`©//Oº©—øN†}ãhB¬Ñ«¤í®Þ,db?¼{{õŒíø1,ìiê§ë.‡ñïd˜SÖ°\輞"â蘆j³œ”nÆ 4‘Á±Ž‹Á¬Š>õ²\Š3”›Ê8区*Žóm+ƒt r»ƒöƒa쉚—”a[ª^Q¬Ócµ ù®‚*È÷ãdB|¯º7¸êyÑ#•VmžÀ–‘¥ª'•-‹‹‘ØØ&kͰú\4ÄÞ@u¥Ì߯!9¾âdB?%ðûÉû“$…$iÝŸ$Cô’”·Úƒù´3ÃNßÝÔsÀnpÿ݆|/IQšÄþ„ £•ŒS dXŽÕ…€Ê«\=H–(¶ÊÕ&È7)ÆÑÃh°b×oOËÚÐò©hfhûžêZOƒ®z_|°¾°º´åŠ¡ÂQ ÖñhXªš´ ƒè­,u-Z¥B%‚Ø"„£[»×­¡{üx:¶d:LõeÇZ­ƒ{2\»6@‹›gÖP"j¥nCO9³òj¶£y#Ê«¨ìüæ)_ðú·*õ;Ðùÿ¨[ endstream endobj 290 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 291 0 R >> endobj 292 0 obj 2284 endobj 294 0 obj << /Length 295 0 R /Filter /FlateDecode >> stream xœÍksÛ¸ñ»~ææ>$S›Ÿ"óM±Ä7IœØºét®7š¢$´©”]÷×ß»xða§Ÿ®ãÑîØ7vò÷…Ï8üœËe°â°øN4Ÿ-&DŠæ/½„§ìÀIã”Urã”[ •v#²g]Ô Î>,~û6m÷bö¸àæÈænñ „lj&i–e¤kàùi*E„^@q`o®»lÔn­½dÄÿçÚ»…~ð¡‘ÔIÅ\E=€ÿKO…~°G|¸â¤…¡[*üF^ˆ4 xA ÂåRE‘ O¹ ÁXY†ŸÏZB¬œÃc¿*ÿLáœíïÖ‹7ïcæs¶ÞÚ[´ â¥A&ÿl}`¿½Š‚׿³õ/‹«õ$þd—M¢(esäÇý,ñYK†…,ð†©ŒÊ’˜sîÇh×Å>?öeË"Ýûòw,¯7ì2ïóû¼+ÙÍý?Ë¢ïÐxé²7ï}iq4bœø8 ÇÄø}[nغ9u8cë}É>Þ}ûÄ.ˇ²jއ²îÙ‡¶9‘±bÊG,ÓÀ[úQ–%a„,¾-D'šú-‹y˜±Ÿñ°kO<žùœ‡Åí¢9>µb·ïÙkv.Õ~pž§)JU ÊžÁ¿–íAtRª!‰Î€»6¯{çtßp#º¾÷§¾´«{çè¦)NÊšð(ú}s²x^?Y¸‚ å=h1µÙOG6Ÿê Dô5 C¸ß ´´0Ó¬ÙÎn’º|gÐJeÝ•ž!¬6!5É+C:ºNB’°r¬“HXó¬\ƒ¸‰¢iN¸ö‡|d?ðwœ¯œnœ-Ìš–ig[Çv ý&UB?zJ\ð‡öÃT() ³ëœ§ç®.ëocþô-ÞUyQýtrQ/ôáL”Pöß<”íƒ(Ý«8)]p0K½ÀO9BÒf­||D‰Ì$UΡÄ#bY•Ò;CRÉ¡‘¼v “9Z?ˆ¶©C†yëÊÜèjâ°Çºâ9¤¡ž3g ¨þ¬–©š»~¬NÝ$`T÷¡‹òdC+þƒ‰0 q ga–E>EcÅH­ú\@útX?ÏØã^T¥FõºJ%²à¼7 ÒR™’»"Œû$iF ˜¡²¥,Þé}•{im eÝØï´j†’[°;–…PwX”Â.»ªÂÒ†øõ—÷7·ŸWëë›/ÿ¸»øxõyåÙÅ5•¶yVîZ[æ›ó¦®ž­êÍTé©ùI:2¿k2?/e¯äÕè4‚ Ø€?[½pÉæ Â1§Üt ­(‘ÇÖȬ* ö–‘“Æ®L»3ï5\þkDÖ'+ÒaHA>›º'å#÷ÈägR­¥wÈa„‰ÎÓÐÉ+£:êÌör6`u~€^°RŸLÈi‰ \~±àgéx!+©ø~*!À^¹ý¼;æ…. ÿU ÃÈ[fÈ’˜¤Ñ ÇÕ§õÕ­äúòú_¬Ö«O7,áöêËêó•Å×7ZÐ$Êþ2ò‚ ä\>z'‚¬¦]Ÿ÷ªáy–¶R×Wo ,3„{FêÝ3†ë±1ò¥ÃzínvŠ4((„í]©u3HÌjËJÝkcTk+›bJó‹I¾ ³ˆÃ踌`h÷ÃAC BÏÖ.E@åΫ®±Hm@£^‹³!~Âbð“!Áˆ@¯t$ ‡ÿ©o`˜ìBO†º+k9®©¶¤”V8ÕÉyíæ4!`â‚l_S÷|ä]ôNh°…ž S*Ì=Ϩ!äòêÉ+§œSìózGó'DU<§r¢Ð‹bU¸UN&BÈD°]ƒ4_!âŽJÏì§>C˜mhçtkaJf× ÂÎâÑÌÒ–6ãYôÝ“³TnE­žg–XB6N½Ç#oQW§6…Wµ“×!gjÈÙŠ‚¦±ß/SxéÇP›–Ëïµ e8ïá‰hsÐÜj໓èAEÑ´<]=Ñʘ·y7Z¹(fZmÌžY§tÿñh›?·ï®¡:{1{õ/Qo:‹âŒ°¾hÍ&°)¢§Bmy,kÙÑqBCò¶mGš©^èYÂÍpÿH÷—ÔÑs"b¹s*¿„¥Ó|¨ÿ~’‚I꺽œ×Æ$XCh³5 PÉñš!j\5>Ò9BZçÀ¸¨>ðZmžpØF•5Â¨Ý r–S‘ŸT2é™ yfÓ6Ç#”Ài†F™/åë( _ÌÐɾ»TËÕ÷rØÂJC_gh*Àݪ‚‚ðFl·%Ù†)ˆ©Ø!h"E+&PˆÓ]y^ Œ ñ‚;«\è}Ù?–Êùˆ÷Ý*¢ÊÛg$þȨ:¨<¨Ns:z‡ÐÓ£ìEOö­iF=O—8YÔ¹wtšByÀìÐvá!oEsrvØë€8™pf)¹³;ÿÑÁg4uQ6Žºm©² p•ÅïÕˆ›¼´3þÉ’‘¬Y> endobj 295 0 obj 2235 endobj 297 0 obj << /Length 298 0 R /Filter /FlateDecode >> stream xœÍZmoÜ6þî_ÁoM‡•¨÷^P`ë(© ÇAíÍå‚$(äµìÕuWÚHÚlŒöþû 9ÃI»Îpèò²œ93’gFú|â3þ<“?I&Øb}ò™x>K bbE1ó{)[3"Ò(e+ÙqД]¨(.õFbÉÞÔ'{uòátºeØîÄ›G1×'¿‚ò(æAœfYF¶ î§©Tð‹5ûþ|-Ø‹FõÖÖKAÞÿÜz×¢Àÿyìþä§ùÉ÷/#æ{l~g·@àóÀ7gaÂRÙ„=1_³O®Ër]t¬¨oÙ‹¢/nŠ®donþY.úîé'6ÿå$ŸÓt•,µ¡üM¸ÚUƒQè Ÿ8;Îð-þ…<@p¸ˆ`^òÑŠ™~åÝŒ”Óð÷ “H”3x¼dÊ{¥òë“Àáé`UÂÈñýp£ýÅ.›¬¢Ô}x2ÞdƒÍ—%{Êž…)Ù“ë_/~lYÃéê¾øji¹ ±íŠ{gtÕÙömuwW¶eÝ[Ö]Û¬-µ[ýþ¡Ýv³iÚ¾tÝ<Øöº¨ªüZu}Uß;šõ)±}êûª.;î̳ü¼-ëEIGÈqðFþ)Z)Iž°'‹¶,Ð.¤wU¿4D¿´Qì÷/³±ÿSûRSX¨‰ª³«|6ÏAH*#ó_ßæ—g¹6YL?Îx,Ïóý©0kt³^ãª!í¶Á檵=·-­Ò_ŠÕÖ™|Q›öe¯XêÊqJÑ;ª¬ªj]îwÜAg…AÊ=Ox~èÇÓ Î.æùÕdýÁðˆç§è·¼¦ÓAj«¤>Ϙ>HÔå×ÞRÚ?DÞ5­% Ûìh³Yîvl·eßVåÜíÈ"ïÕ»ô•ˆcz‰ç‹,œÎç2ÿÇ\ ñ³Xzüﳋ·¹C¿|såPÏëb]þxÐ_AâÁööyΚZ~Ý´e×UM=ðf5=sa8b‡2¹ë`·m;ptpUwe«¼ÜÇÛ œvIÀ‘_•¬mv׆' Ðxˆ}  i’Á– RT”-ÖrŸ;¢¥ËÕR›¥Ã¥®ê¾a…Uf.g¡ï'›³DD!,kïOäàêðe &€Ñ>l”;@íg>@;<ðñš…pœ]ÎJr+6g. y°rþøÎÐò£d,Ÿ8:ÌëÕ=³ˆg’“%@‡.}¼)Rž˜ªC®5–¿fj"nGpÃØ—>Â-Ð=NH¼QHmÈH-Ùá.Ïh9Ff}ÓŒ‘G3vˆ¹ÊÁߣݜ=>ᇸ›Ï/¯ó«9;¿œ¿aëÜ¥ê¨_3qʾû¥YÖß2…ˆòܯô&ÿÛÁ#/7nÈÀ–, IÙûf«0ÃKy¨/M«®qÈ-^ÆDU½K¸Ãºra­Ëèáº]Õ„w7q_"ÎUâ>u…Þ9ÄÃÀÎ]Q» z×Ìz»¾)]Ñ„¼DPoÛqZ³o²qõNû:¿ÈÏæƒiO@ÐñÈø.}U¬XÓÞ–í)“s‘ž‡þðÌù‘àY q\‹1Î ÎpžçÌ”ÔDÀü‚‘©°.cõG€—ð"Ø’ûÑÎ#žàs}îždGÆŠ eu´¥À,šè ÖeöÙ“ÈÛ-̲@Û“@Z8`oÜDéØdä ºJL,rǸz©°Z‰5À¿=Ö¸ 6^Ÿ±uÇ`àÀ;Ä;çô€à ‡(Htħ¶ðAœ;e‹få«ÿ{yõæµËw?çW9ãœ?†„Y½,Û< »ˆap¬¿”­ ZˆÜ;Õm% æ ï«E§„¡ ͣʴçýêA“…yp[ÞU–B*É–Næ¸fœ=pÙX¬Ë±Q¦Û®²Ä$^6ò¬$ÎHh£»Ê <‚Û®Z­Ø}Ù33/˜m VT-Ì&(Ÿ^÷í-Ÿê`ŸF‰çÅihsÜEÉ Ü.»Æ7BíÆñ]§DvŽÈNuAªq«³û~~Ø”-¸éK+u{ÛY¢6Mˆ/Ëš¶ rÔm„M=;Ëp$:ýÁíµ‚Ø^]oª¸£J+]mš©JÐIR˜2è™hMýè0ôÝø ÷í†S„Í>‰Ñ9Ùrfw=]Њ,œ¾z9òšº/ªšjÈ3y¢l¤H)‚žj—_ËÅòþÓ–›¤15<]«@Àðè™jcæŒínÙlWöQÝX;0«&‘ý^ÍÅb!cTGw¿´ƒ¤—¦ÎŒ‚‘3¹yf<Ê-ýnYÖ–ZoW}Er(Ëê, ³´Îu°». Ð`'²ØÓÛfF™»’–£’[¹zõIG’ .çtSo¶½µP륪ÓúH-˜ 7IÖ)[Lj½‹…-¤˜½,”6u±Z=¸ñÏÓ„gÀy¦¡öVìØlÛ7ÏÎëE‹Iì™:iÝ#X —žú8'Mu‘%/2R „ʧÈwHaužÚxj ]˜–œ¯3¨&UÆ$;^švjèßëfçHë¬ K+ëüÜçó÷#)Üгú[} YYÅdÍ#·YœAà‘‹¯_Ï..à.“'*å"•_YÆOç¯^ägç0ÊÐêÐbóòíëüêüÌÐÆ6$uŽ…%L‡%¤î˺léKä¨Í˜ªF’¸Áx\ÓN QQòT~ xÙ ,)˜[’R´©K *H©–ãwE›©)ЦÐ0§št$…*B-šì͇¨Ä ÖèÍM[­‹ÖHø½4Mz‘>êoሎÌB7 çÌÔÖ=›z*ŠGž¢™jƒÀ’ŽÉÏ>6 €Tª–U-µ‹Ìˆ²ƒ³ññéžõH ÎÎ|Ï7ï`ä.¡Ó¥=ú´<+Ñä”í–œ`À™ˉWu¥^¿P n¡Ø-k6*O%(ê6åB}ÁÈŽ¢Ì§É«ôH@ÈëÉ7ïƒôHv °“ÐýŽ yè#’Ù?J':ˆ5ÌIöØû`Kè×ä’ṌÿÀ ʉ&jÄHk“ó€2“AWðÈÄ¢ãÉþ"%V+±yÒÔšÁ‚×glÝ1™ÒÀ;Èš8ç‘T ’;HÔÜrÂs8DêKö$³?b144ÿÉ4æ~b¯òËüj6Ï_°?ØOï¡ËËÙÛ Ùyvñnöþú_lvmÎèäDÆ^ÆáP@ª“Åô­Ê‡OØs:M?²O?=ráÆòSáeilèÈ*%6Ó+$ŠÛ[‡°M¬|!_†ßDc»Ûª›|:Ü@ ’¶˜‹k'äEÜ—ï†Eï™å~OÕ÷:©º+ßXê¹2Í09ç–8üÕPó0ˆ!Ã=z÷@û=ºpgx9]^ùÑ@¦„P½EÓwM‹ŸIþÉ5øâ ÒÑ;*Ù»aXK fð î¿%FÊ‘ endstream endobj 296 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 297 0 R >> endobj 298 0 obj 3315 endobj 300 0 obj << /Length 301 0 R /Filter /FlateDecode >> stream xœÍZmsÛ6þî_oqf–$øz—éŒâ({®ÓØr;™º ‰²xG‘*IÙÑ¿¿o$¤Ô¹ÎånšŽw—àîb±ž]ê³€øðß+þ'ÍC²Üžý!eICB)Ф^âgdK$“Å©øÀɇH’ ©̆üzVŸù䇳ß~‡A+â{1y:ó卿öì#&YžçÒ×Ð ²Œ› ^ÄrK¾»Ü†äm#F+ï¹"ÿî½í Âÿ|òpöf~öÝ»˜>™¯M ÐÀ£>„9R’y4ä$äÄ|K~;¿]nŠ-ë«Wä-ëÙ‚uù°øg±ì»—¿“ùg³¹œ®Ð%*„©'²jð Žüá+ã´ÜHáÿÈ£(‰Æ0/þ¨’‹,ÿòŠŒEÐðïÉ IUÖËã%Ñû–ÆO¯NJAâeƒU‰+öÃDûÆ!sV‘Û>=ßI°ù¦ /Ix99ÇI}÷.¿Æ·Fø¾‡Ž‚Ë·³ëùåüÓýùýKÐù^j49dÔ‹R oû®¦õ¾^öeSkڢ߷u§ùÞòµb]¯™GVíÍ£²îж/V– o4Ãꃦ•ïZ°lªýÖ8°8X¶KãHWt8êiÁŒ-7ã§+ô¡?šð–Õì¡àj_ÑØK´ÉYñ’%«*ÃuÅŽµ¬/ªƒ‘ñsB3¶²ºé­Që5 …5taéÀøu¶ÀÐ ,Bkû æÚyFt׆9™R4 ¼<Î|?Í72Ó«+®$‹!ÿÇ)&¥'s,Šs/IrßOhìªf³04ô(…ì2*Lj ÃõGÎo?^iºë!ÚÛ¢îµDä’¬mY<æ™\LÁˆ õ4{¹Öä¡Ùkú‰×½ïlµÅP«æÖM«if¤eQ­4WÖG†,7¥5.™ª˜õoiÆöéä*G4t£{y};»™;«Eθù±Ü ?R^ /…sßé/Ó«»Ù­áïÏ=Ï›Ø 3ÁýË¿ŸÌ–0Íà–ò,Oc×ÌëÄ ÈùH}Ãõ‡Ü¹‚mÖ†Ö»6_؉¹„ÑÓfRötNg=¥Íâ‚*WO %RÎËšÚ±}§<9?÷ж)x½Á9ƒ»›S -̳R´ÄBÃË «̘§!ƒÐg|X7UÕ<É“ˆ ô­é)ÉuÓOxÞiAåà-%0í»aÉÂQXÄtÖM»…˼Ùñ¸òk‡_± ¬©¡´à÷‹Xw±Û·»¦ã×-—ÊkÖ¦+úžO‡ÏQo¹NMû7],û^AÊkØ<…»N;Ò>œÉ»5ŠÁ¹ˆD)ß‹2°±ÖPÞ¾ àŽ r å‚x¾%Q’EÙ:*2Ô©+k/¨—ã[Úˆ¼ÐÙÐ"ÕsŒ«±¡h.öó<–þpo ¾Â!®2nf·óéÍœüz9O^óëNœߟ.2ÀXzY ¾†²Eö* yŸ-ÿõÄÚ•,›í¶â¢¬ÔÕ)ÄÝ~·kÚ^óÖ…€{ÈÀqÉJĺ(X[ÖNb0¦ž+àGYæ:|q3›Îg℉r^–`œ ÿZ.¢ûs1Aºm «cXÌ3 x EÔl§›H Ê&йÚDm hÑY´!» „p‰%O›r¹1ìªXóšÂäÑŒnI~¡ÊBצ5ʾjŽëQ›±»?ß\þ4½±^üÇì“Ó(Fµ‹ë$ågéùÀİ2±Ó%nþ¡¼ì-º34Ü ] ‹o$x}"-[È\ßak9f)‘aFFßÅÈb}-ß© mÇU¹®â*ݬí7ÝÈA 4ÌFÑiM=ç–"¹TȨ{]0AVARäÖbŒÖ}ßl!èJ<#ÿ„ éͦÙWöKM9t¦³¬ –ш×4….Õ¸M±PÔ 0 ûðö ®æmÃÑãºm¶d½çÚÈ#é¼H`­ÞKÜ~¼rÁY˜‡ü3  ì4°jýWA˜y‘ަä@IÊT±zò¥Aå†"S¹)½íi›e‹ É›|‚AB(›Å ÖVÊ‹kÉMAª}qÛ“~4 ÙÛÙ»éÝw*ç'¿ŠÃSÓ®<Å#ÜdW@å¿Rœž >³&"°O;E3EȪ,Ç^–¦Œ‰QwVȬÆèÅ]³ÛW¬/;XÖçX›ZfÜpÉ(Ø¿·{X& Ë8ïh”Rå4‡k£Ñpï gHÊE8Ha!K„øÊR$ ΀ÞâãÓȱ!ECøwÌŸ<ð|å "Ú©Ø‚ç;$á§c&ÙødH8Ê#âxd ž"ŸEÒ„²ªEHzÄ{ÁÆë3öî9t)ç ”ÒÌK²Ð÷“, .ÄZ°c[r'¹¼žÏ~|úÃìzvÞ’7Ÿˆ:¦·Dß‹ >j€#ÓÙKPr‡`/sÕ!"Dœ€»‘_¦7ï§7÷ç¡ÿÒmÒX|„ÉÆT¿Í{îË ÍÙo'©ÁÛy”Ð#s… ¦„ãèžS­™ñX!Ìöye™Ž„é#óNSÏçqöÓÁG "¾9è0OL,&zb O~u¸Wñ„¼xWTåç@ð³ç‚õ/ŽÍ8KF«k[MXOTNÊ6;ø¾èXÙçÅü{¸3á:hV/¾€ }ù¹§Ô¶©ôEÝÙpö”w%¡:Ò´l$!#ËN ìï¨B€ Ì - dJ½µ&‹Ï}ÑÖ¬šh öJs·³w³ë‹™`wÈÓü\~¢ŒÄ8š·kŽDa0 ÇŽ‰B‹†úó’xó!Ñ’t°á-Œ’¹5RõJ¿(*qß!'/^e ´X”c^¨ˆk²cä:‰áv4\ÜÝ܀͋äÒÜ»7nŒ(Ũ+þàZ4±7vc‘“Õ ·ûª/_ɯ?Fܱ5~EV6é±>ÖH‰)ý½ý¦ìK5ðÃÞJ‡­ÑñõiSÔ' Êïr³´¨Îí‘Oñ(’ê3FY52â428Êñ /“^rzºÈÚØ#++&k4íU'¬ö-«;¦àêƒÚb[ö0;Ë™éº/Úñ‰¨ÚÏÕf¯7Jpq´gn áòÆPe4f2d0)>ïZ¹’8W>E}Ž€}‘ì•õs`aUd #O,L¡rôy;u ù )>Î¥ cUаÐõf°`ãõ{÷X8ˆŠœà|F)Ä“F0–ƨ¤sNbw‡d ðVDÉ_“¶•?”à£q›iœ|= ŒýÌói [*I¾PÆü÷–üí> endobj 301 0 obj 3565 endobj 303 0 obj << /Length 304 0 R /Filter /FlateDecode >> stream xœÍÙŽÛFò}¾¢‘'ÐÐÍ›4¼&²f­ ¶“‘ /6ÎGjÍp—‡LRsûñ[ÝÕ/ÙOÙEOU±ºººîîñ· —Pøï’ÿˆSìÊ‹o’æ’Ø#~$IaDÜØ‰hBJ"‘$LHÁ{ g‘ /¨’‘{ò墺 äïü L{B<^Бp³¹ø6#Ç’4M¥®žã& ßÂw"v%yµ.=ò®ÜJ{.ˆþϵ·5ò]ïÿ@#Jî.~Þ^¼º‰KÉö`BÀwŸ‚™Ó &‰ã{„˜Ø–ä›Ý=+³–dÕž¼Ëºì6kùtû/¶ëÚ—’í/«­<®%ʃ?±#¢ª÷! hÿ‹qšn¨ðàøHŠã…p.þ©N–?ù†ÂhøsÖHR”µxè2a½¿róyïÄ>Pœ¤ç•Z¶ïÚ_l²‘ùÞ󇡣»"/‰ç: yGzu¥NH]X‘D£Õo6¿ÿ BÔ|QdÕÝ)»cšïYÕ凜5o•ð‘Fn˜8AâÃ$‰×ºå­ۼ̋¬ÑxWÿM„ÆüghØÝ %þ¸Ú Âñ (’ôŒÖ·§Î¨yÏ4\°®c9Ò.«4Ü€ g]Ï94u‰ YþôèС—ÿ$yEø~W›åzMv÷Y“í`CÒ²Î!Û{0f÷|d¤>sTÔSËöäP7¤ÊJÖòïË÷W7WËíê†lV[RcÝqFJ®Ä\‹0F%ÖÐúÒ…dÔÑfÔ1´–};±jg³Õ¶„Ì‚÷¬€è@SC³ŽaÛYZ8Ÿ-Þæ¾PÈ©:¿Ý¦vÒ°cÃZ`;¯ÄÈ’¡?°¤ÙËákýȉɋëº1{ÊÊcÁ á§_>½ÿø“ÁÑKQfl=#"-³–r©–ëÊb3à|&P¸Ò€ÒÈÇÇ´’ð2I~,ê:n »ž?–8sæ4Ð˪nʬ? 2 JXêRQZ îêª H:—¨Ïå1kò¶®Mig1—}amg¾ŠÐGUGøt<²æ’ë¯I6ùCV€©¦gE1)H–£Û—{V™UÚËycd§8Ø ,äÍ % ]Ã2L>æÝ½‚ëŠið  ÔR€Ë›ÕÕv¥°¶9¥L'\Ô(¨a¼\MnbÉ»ú•W±¡¸…ÖyJ‡ ócp((TE •rd–$ænEöõéróÛ©îX»Uòl%d«š iÆ¿X±ÉËp韡ƒ€jPZ€µª;¢6'Ó²«©šâÒayau¬áÎ*BKDŸ3;ª†lm^W\ƒ¶«Ü›o¦âcVý±&žçDn˜¦±ï¢&[¾ÎjP²@Hß!2x›bÐ’òÔvä–ÁŸî‘AغBe×KŒ˜‰å¾‡)¥^”š¹çÒËD<‚ZÖ<`‰—¤Çº±Q,¡ÁÐUXwŸusœÂ¹½}î­³¥à¥±•õ4Àú¢°öÈvyVX”ã©9B`ˆ¬V´õ¬bfˆÒêÔ’YðlA¼)»ªB>vAX¤ÆÃ¼6^ȵ‹à¶",„sÂ<ÅsEs1 *‡›‚•‘Ókƒ‚$m¯$D Dš€sŠÔ^‚ ‚ ÷3ZèäÖߌZ2Ù*’~lã(˜Ê$Å‚W‘[½ F» «ÆÞyñIÌ¥Aâ³£Ÿ›$NʯbÇ%g‡É§Í»ü!ïžIs*`G.ÍÎc¹Óžµ»&¿…í $0ìfœµ(êÇöõxÖ…¾DƒÆxW²¯žØÜ)>l…—^ÀGèÍ8–!Š“&Â* Òk:’–5Ì ¦†j’L#‹jqcç–Ø-‹Xø±©w¬móênaˆ*-¢ñ“çÐÐO¸ŽOËžvìØ1¶Ý ±2° .ı¥X§®†ÝŽ[Šyß¶k@ÿ–÷~Ý›f³„@¢Ôƒ³.ñY‡Zۺũ’AÍ#ÙnŽûá~ëø˜ÓÉ‘$k±_©H'“A»ç3~žUmÄWÖУtê@+Ë+¦ÂZtJ1xó¼Xé«Ïz ¡9·^Í¿3^å;8݇ ¯^DG3ž0f@{) |™þK¸^½[H¾›Õf{³^ngcŠBTA¥(¥i,=ºoê#¤é}ö×Íl'€•0\§Ô§nèJ÷¼é-}K^¿þQÚüg¤ÌDdøaá¦âRÏ |ŽOÎÞ3ÜÄ |°õâ ¨HI='åY(õ›Ÿ ©ŽÅ‘e,Ï($oY‰¹ °á3:^$…¢¨ „û5ijÂ@L`´Ófù~õáÊÛL²µâEÑb•Ý1„õᬠ&vRn/õæÌ<Ê(pË€ïûö‡t/•)Õ3 @²ßsPÌFPöŠÐáõFÀóaP'ö<ˆ×›Øñ»Ëûà™õcy»Ëw9ZžÖú{ »EÃAìpÀ»–Àdóê³è Ò{Ù\æË Xóc‡%Þàr âš.îE•¥ ˆì þõýñ†@ùæ3±ÜD3âu3ÃhâY2šxFÆ3ÂÊ–þÖYtä,æöR†[ JoßR‡,/„l_µ ÖN@4³e蟆hÏ™HY[âTY5{YûöÏ$7ÄiH+óc»Ï(\Ö{m’¿10¯lj»r@£½ä½ý2öp„owÙ^ª$ |ǾÜ3nICÈ 88õ3…ÄÑNÛÇÜ–dyŒ…EaGVí-ue`iSDþW¶ÔƒMèÚúM¼®Ë«H%Ð^ªun&€Q€Np÷÷#ù6{MVÿXo¶›3“@Q˜ix5‹}k€wÃõë‹÷Ï0ÝÂXòõ噹 HøÓCHi$ïûo Ø“xîÚÜ3p2é41„”?$ÔuƒX ƒ2b„8Z_°7 Ìg_ØC/ÒEæ&.c¬ÚOí‘iHÙEØSÇgLr³ÚȯK³1ÜÍÊ ƒJi•meã·CÅp~•ÁÔ.ÆOÊ®˜ Ó„¦2`0-ø‹ÑK„üŠÿ³G U¯0­¦à¡†hfO¬ýúÒÑ$QŒä×΀f}¯!I6e^«y!e_[ª 3nXwj*KK ²¦ÁBÔä0¹“4è`Û±ý¼h`?8YÞ¶'(àÔŒTuu)bš+-ÛÏ™Œ ƒ˜OÙiù2·6¿­–ëëõòLB†¿fûiªïZhÒiêS£¿IçwUÖÓÔ&L³T=¼Ÿ„¹©´#oÿíÑ[bVòWÇ·ã×t×uÜ”âºôpá7Ÿ>o×ù•àúóÇåvýé#€¿Ý|Z®Þ}¾Y©‘ïA…ò¡@%n¯\ºp‹ ­z ½¯ê!H}«,¤?ƒK¢š^$Z±Þz¼ö«õÂ.ÏE¾*ìГk*OE—Ë_æH’|~mçd¶ê5pu¶ï)'­îX$¸J‰’(¶ôõ„_ҩżSñcr+˜á\>"Ïä)\)ù£µ%S™p=ä•hJg~[ëž•E´ÇÞ¿©ø/€i´C endstream endobj 302 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 303 0 R >> endobj 304 0 obj 2665 endobj 306 0 obj << /Length 307 0 R /Filter /FlateDecode >> stream xœÍÙrÛFò]_1V• ã>RŠ«hŠŽ™’ÄD„+ëµ]©JØ £(«ý÷ôLÏ…ƒ\ïKv}”º{fº{úèñÄ!6ü}Í~D‰K6»“GAsHä/¤ $Nd…vLvD q“’mìl‹=N»¹'¿œT'6ùáäóWØ”Û ÈÓ‰=bŽlÖ'?ƒð ´¼0N’DèêZN3ž°Ù‘7ËK.j¾[jÏÙÿsíM<Çý?ÐÈ&w'ïÒ“7ïâØ$Ýêð˳Á̉‘Øò\BL¤;òùÕzsŸïhKh•‘ ÚÑ[Úæduû|Óµ§_IúãÉ"×å¼x@¹ð/²xTõßî¯§èš ÿ}ËCP,7€{±¥R8Yüd  ¸ÑðçA# VÆá¡Ë¸õþJᇽy@±âžWǰ}?Ðþb“¼Èd«Ë€êaï2"y#¸ Ü‹ßå&¯è®¨îúQõæ}44„ UÉ‚s¶í„8»¸ž]-ä‰p|"ˆ-?ômÛŽð@Äå¤íh—ïòª#_^}x~È›õÏ—_N%ŸdÌ'J¬„çH"£ó!§·ä»ï¾'³ËtqCÎk~Òë·äœm|KPW’®€?ND‰¦ulÈÅ$¶m7®–¼N $Ï+äˆ0“‡Ð|–Î.W?ìEü\Ï?,®fâÅêj¶¼ÓO?-†¤Ù»Ë!m¾º^§7p<,,¯/ß\Ý¿Ë ¹Y}L—× òBÖ?-æË÷˹${¾‡m~"L±©Ëý®¡¯]&V¸@¢†+$ M„0ºFbò~ˆCa+5'tØôÁùêòãÕµ>yÀ~8Pþ°û'r„P‰=—E®È“ô¾h™X'1®* zißæ™„»ZBÚT £•„òß‹¶cÉ'p 6K¢Ë U­ˆ´Qp½URï• H+vÐBh“)Þ©ÞÖ>ä›b[hÅf¢oGVäA€\œ°Ñùq³ú¾wìôø®p•±kc{pN‘I?#O÷ÅæžlÀÈ·9yÜÓ¯öTt÷„’–7T½ÂŽìÐ]Vz ×u&dC0yÞQ®Ë4ŒÈ¶n8AÄ‚ä;QË]ðtVcd6¯w,,¿­œ»ž Õ9´mÏb¾ººZ\§G º8P‰¡Æ¡¨Äùß×t7bõ þxº¾ìdR1Ý¢QMA¢¬*ˆ ÊêÚ@þeÀºè þÒc£êÊxQ–MMù·Ÿëz…„åzµn /{Oºéò,×0‡• ´a3վͺ{Š©çX¨¼x¨ƒ Ì!Ve^ZÜXubŠ̬ciŒWDe:DþCq f¸Ð?lßö0EÑš«‘…cèo„©q‚#ggAh Æ„\ 7õÊoniJúmâ{Z¢„±Ó|wèU ÝßÖ ,_òD8«»×m!ÞÊz*I¬ J`Nôâ <”¦”žÒWeQËØ©-dl=èU7‚§·çÛŽ'XúB–ˆH[Žïݙ۴3gÎ4Ž5¾ÓQè¹Ï"^àtåAñÖUìÐZeÊZ ›•eo¥U˜Éá[}\Ï1’"ëG ±8ßL‹]nÈê†f_hhÉÊöók£¥p¼®LnšÌûÉÙä 9c#†Ã¦&=`¦&(é&'…¬5æÑ˜Í"pĔ΄…‰( ŒM«ôá!§B‹Jq¬ÉÛ}iœjònßTÜòH¸}Vàïæ ‘ßg® 2X-@G½¯³öLîò.eQÙ~yõåT«WeæŽ9Ï!¾ÅRôtb"†÷õÀ ã†j­?­ÓÅÕ¯bZZ3À)Ñé€Ô“ŽU«)Â}rMjiÒ§zo¬cô"ò¸Ï›g“QÑ»oa_ÌqcÊ`„Ÿ‘×Ìj¢Ü`&A—5EþŽöJç#“4„LÒq’„Al~x#sH†®¨«#c´º0FGIÙb$žß,fé‚ å Ó>´èÄ-’ŸÙ›åÛ¢*L¹Ã``CY²á)K¹üAÌ*.ê Ç)¤òj‡àÅ;MnêRŸä^ôüq_4<ôÅZe°ÊrÍ.n˜É4;ª ¼œ¥ðÙ`Es ZÌm>`¬•pt3F‡J> §À‰À`NEß3÷)‰l= óàFÂzr]á¨'´|¢Ïz‰«-V²Œ+-°-ŽË‚/þþGfÂ2Еx}Îøn Öª|Z/C‘¬©¡fúz¿€¡Šñ”¸ÉÀN¢žù8à–ÀC×vœ çº39nÌé(?2ðÁŒ°‡¼9'˜j­ÔDz¦i»¬Ø Ä#®Ÿ=ˆoD¦kJGÿ‰QlC …"YdÞ³ô¹òyÀ{·©Ì¸¡¾3¸aÊúô¶np‚‰`D.¶¢0š~¬ç"¾¹U{Ì<Œ°Åч²EX‰ˆ?›ØhJÙíÛNÁ´Ã·"î§j¡ÞNqÁ. %[]N&¯oÈ­B: :I _P«˜h5MÜ#ýäu}ÄMªƒ‚'5´)ªM¹Ïr“GªMnh„vAø`ny!Lš±“ÄqàMØáü^œø-ÐqúNŽu0ÚßÌËÊÃáD‡:”á‹sÑL ËCþù–,wmþaÐö¼)––ÖI~…EÌ„©7û¦¨÷æ þNãhr„eÞrD<óiÅ3ÿÌdÔ;ØGóR‡R²ZÃâ›"u¥(.Ö貞‚hد ¸E€Êjuøý çöY$±8ú5Øð ÿµIo`!çÆ7R²)é¾…gÞgEV®F ‡ìe=mÞQx6å}5X ›½µ,‹|³óØøq{Œ=ªqXê)PüFÈÁ‰CjÛ‹fÓ«›åßù̬NÒ=LMñ‡l œ U¿êX%mÆ¿w} òKÏœoI_Ð@ˆµøåîŸ å¡Õ endstream endobj 305 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 306 0 R >> endobj 307 0 obj 2403 endobj 309 0 obj << /Length 310 0 R /Filter /FlateDecode >> stream xœÍY_sÛ6×§À£3c1 øßu;#ËJ¢Žmå$¦¹žíZ‚%Þ‰¤BRq}I¾{‚%ûæfz×6Õb¹Xü°»Xì"_&ÂðïýxAËdðEðLäd¹‚å¸Èô û(Abà;>Ú2ÁÉDiU\!Íôy0z?¸½¡†ƒžXSÎÕ,ƒÅ×°\?•¦ï³%,Ãb™ ·Ó„ Ë¬’®Ñ3EøŽ^Ed™äÿFëÁE8xûÎA&Fác–iXÌØò ‹0b"LÐíÉb¹¡IT (]¡Ë¨Œ¢‚¢ÙÃ?é²,ÞÜ£ð×Á$Û­tUEà?Ϩ¢ªõÁ±qû‹q’ßpámXœƒ8°/öi+œ,~Ù‡št*£ñ߃Fª”É]—UÖû+?ìÏŽá·¼âÅöí@û‹M¦y‘­}x3X °é#zƒàhÛè¤ÜPI§QÒ ²~™¢ŠM9Œ‹æËŽ.ãǘ®Nœì¶Ïr5²Ü’oß]¬f`¦ `mË×`ŸËÅI`ï/µ*mÛĺ66-W?b§êæÒÞŽ>…fóé?FátvÓ·aUx¹Ïsš–r¼/hnphŠîÀ˜Žü).(Ã3taïµZ1P*X‡m‡!§˜6ư„¾Ôy´/7Yÿ;*ãŒíxh:&ÚI¼àlüˆ-Ÿlblêªl•u &PPGÅvÍ,ØY~È$UèÆµˆaYú–åCÓôY¬±šaÙì |]EqCâ;pÈ_ˆ¹À4&ƒF]™‚†ÛI ²$.Kº:UX"(•¡2ÇTN<(Ù ï[·#ÛÖ‘Tcò%óZ¾eÀ-k÷Ø·”šKm»#ÿšXu]}žqyc0B†í8Ýô1:¡[šÀª¿Ôã³³Ÿkòîæ-­G+ú§1Ûˆ”ý.%¿ÆôéU‚«,‰â´GT³Žçw€3%CÛaZ–›(–%Í%« ¥¤Û8Oœm·2K¼fB™Gi±a¹~?¸ƒ´£Ÿë«¨ó¨€ôY¨X/L(óx½æ›}8ËÎÃJ†®4°&&´åó®Š)MuÅû.©–jÉ]FEù_)ÈòÍãt­ƒ…Òã¨i!º]¡Ÿ“ÜY^“†÷âœ&‘pFžíKxHš~ÙÓtIÖš¦,6²\ßé?Ìwt¾¸%*ʨÇxy§N;½¥iC=î±»Êõ¹þQUÃÒý#‚…6 žL9-²,³$aõ¸dðTÊéuü•*Zè6{2šñMVRUmT6£¨! p°Š¥ I G1S4G»reeUU /Mù…"?åªæM¶ß®TÀ fºœ cÃÚ-Ÿ(lž-.TœÉRmš«`™‹mHÀ(_ØÅëAùÁ.^È×ô)áð[>B…;dÕ Â\(A¶´Y[ÆRmQ[±,® ›kvkl¹†eikVÝk‹×²Z97€Û†<ŒaªŒÿSIz–!uTLʇU;j‰²ò­‹¨Åx…‰˜¼m‹%šU«†Ó][ i9¬ëŸ.ºÁt­ÃYšqd; ¿›<°§ÇâÙáŒàŸñ|2 'h1þ0¹¡Ñx<ût.P»<½¼é§Ã‡ÚØó1vE¢2]\MÐèâîd„¦7áäýd~Š Ã¸{£ë |ÃfÐ\Y4öé_ÞŒÑøÃh~wbâ»7‡Ô %ƒF‚~u¿M'Ÿáh´@‹ÉÕd2Eºö¦ÁPYž×Vó~>º ë©`ŸÑ gèã§‹«éXWÃ^4»÷©_25¿Î&?ÉìƬ8{VÝÖòdØ4"™f ;§Ñ¶êHÅ'º¤Eå §Ì$¹a‘·«FRÍeÈ?ˆ[¡¢·ÛBÙ`ÈøãM#§|J›5Ä%cHF¸¡‡–]F©¤huƒè1΋òT«ûÅ5;†dÐkÈlÐ_ëepžÙ¬©½ß@Õo¹àiÇ*/ç³âpÕó\}ž…CMiZ¶ØUžíغ¼_ŽTóÔaµ?©ßJkÌqëù‚šªBpDqÏÈ ± EV£Ûš˜¾«©Éß§ Èbt_çíõªæñõZô×ò{7÷@7Ñ×8;ÒÁ\ÝÀ|èâùÜp#ÚAŒ•àS8+Z”yö¬ ñ úG\@¸VX¢9W8¢ çƒ#ï>Ð]›,ŘnÔÚ‡Cbcƒ°€iÃÄ÷Sé L-#îcÙãJ`Bî"A¾ùdΧãð  ²Õ‘ù§ †ºÛV-ª0’=o&ÄðA¦É®|>ÕãÆ#õ²úᩚÌ6„gI󜿾T#aFæÌàé© ß2ò°g 1ÛdYŸôãÑåä ÝL׆éàHÏvz¦÷¡”ï§’%ßSªò$]´’¤«ñ2K˨nÃø"iïDÅE•þ¼ù$Ž¢ã).7ºƒ|»³± Ë lÇz™m-0IçhCmØ®ù‹¬Vïc–³e?Þ›¨mˆ]Íýj¡q$SÛ4v¦šáù[HÓ•IÒ¶ç$PÓ¼|I±‰áwRÎã©™Ód=¼•Ô7Iu4ËlGeßɱ^¿û!©{Iñ¬=]¹ pg‡<÷‹ÕXh±> Ù>_ÿ¶*{f××Ó}C!Læ¿M ×½„¢vúÍgŸH¿ð}൮¾„Ø0³Ú7ôþjv1ºuW³1üþ@áäúãl>šÿ®+´,ÃeWpà´}Ã-sv†~FדëÙüwP7ÁÅx©ëp ›³ä+£êо<ñM¼³¡-\*U—ER±ø²§PŸ-·Ñ¾ ú˜ã¹F§ CéÏ¡UýíVý~§pø ͘GV=:ßÒGUzç9UÅ­ ÊÜ*ô7unuËêÚôAWÑÞ˜\åÔèèçñzS"O›ïšØpÝêº1;†qÛš®,{\ñø·OR1jŸCW¼T¹êÓ'€[!ÍA®,_ž·ÿ¥ïÖ…K¢¶åðÞ ä²W^Û†àM Ó,¥õ·¤ô¢H= endstream endobj 308 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 309 0 R >> endobj 310 0 obj 2297 endobj 312 0 obj << /Length 313 0 R /Filter /FlateDecode >> stream xœÍZ[sÛ¸~÷¯ÀcÒqÜxÛq=£•T»^§u”Ùf?Ð2e±¡(G¤×õÔýï=¸ JÖNg¶ÍŽqsÃÁÁ@ß("ðßù'ÉZ¬¾E C<6¬(F4Á1IÑ"RTÉŽ½¦ìbš\qMoM¬Ð¯GõAŽ®®¡Ó-"8BG$®Å|:ú(bÌã4Ë2c+Ã4M¥ Žch,ÖèílÍÐÙFõ‚ÈÿÜzß"NÙÿEÝý8?zû>B” ùÒ¥§˜s&”bÎdrb¾FW¯>-VÅ:oP^ߢ³¼Íoò¦@oþQ,Úæõ5šÿt4w•,•P þ%XeUïC$Hÿ‹—q–ï¸ð¿À\ó€ƒY~ÉO•™dóW~èš‘ šþ»3HF”7x8e*z¤òݳ“pàà´7+÷bßO´?8dÁ,JÝ»!A‚MÐkøã ½Ò>½}Ÿ Ge8MS• Áð“ªüVHBZújQåMqÚI ô§)fϲ Šr†,6÷eÑ8:¯*ÿcõ°®}[,˺lËMíXn7ko|½iWÅÖ1`U…#˺ÝxWÞ§ºx¬ž<åÛ"o‹Û$ìèYÛø’¶…'ks¯¬ÔÁñ¦„‘A$Êú¶\€C­—¶©­ÓíE8J)!”¥¡ôˆXþPµ †F '/Ï&P<I£PÞñËöÐH`A9&1¨¼-ê¶lŸ<‹ºI6ts_,Ê¥ Dp·¡œCŽ9!q”…z¬²˜¾h3—AäÄ(Gl¾+êb«Ì9<Žq†9˜Ghʵœ¼i6‹Òäl¬ å±lW–ÐÓ­Û.(Šì'¾æå[¿;¬"'v³µMXس¥í„ë\µdÙøƒmÛLKq{ìz¶¾2ÏÜPµÊtswØ3¹›Bê&a´¦wþùlvñagˆ…HvwNÏWÅN  ìÏö JY64Â"‰³,ái(S Š©,šÛbYlGëb¤ÛzÎý«¼u”žoC#uyÒ¬›'¯oíÚÅ?ï·EÓLßO°žåƒ¼µÚ7;Τª‚"'ÁdÏÿ‹s9`Œ¸ø|~t»Í¡,7Ži\íz˜Ü6´Y3†2\›myWÖyåV{}ºíáPýfjîëÛÙ Ü ›i»‘ÆñË™%"€ŒD *BQž#yLDœºß”Ý¢5¬ÕòöŶ\Øu7e}‡d8aDzׄdXå¿ÈlÒ›¥únj“_“à˦.Ôõb§c¬d4ØÂ'‚ÁšHT“%,5´½;’PAà(†=‡#‘º¡P¬AÊðΙdð™èÏk$â¬Ç©$ÇP¡ž< ³pDhÓ!Úêäs:”o8Ýi¨·ë™Å8–j,šúôá¦Hy,TÁú:|k”#~G‰å¶øôaî‚ñV¡át† Ô;üéLÇÀ¬ÍDDs†± â=¨ïƒPh¦WÀ»Ëéd>EóÉçSÔ¢¯PäÐìb>ý0½D½œý2¹ü‚~ž~9F糟§(×ë`vaö"t6}?ù|>ÿ„ìö„fgÓ‹ùlþåëë=ÛŒÚHv°^0«ýðߵƭ±Î×À½Bº—A“§è:Xâ`P*á§±/Ø‘’}Ö)Æ8”ÃIC‚ž(Ö(š’"œZZ íÚ>¤ïýìúzˆ^Òž¾8ÒmË¡õPmûÖ9aÏLàXÈt`Ùvº¥on»ÙEÏ#SÂ{š8ô¬å»j©<×bÓÊ×Ò1C-<Ã"ŽaEˆˆ:®áÃôbz ™ÖSa¹]êÆaê2ØèÓ2Œ$¬²¨y¸ùþPlŸLïÉ|Ë—e*"›«­V@XÙ ²œnIX†I6M\¹æIU,[GÞî]{ü\Ó ¹¦U•Më÷è°Ú#íÚ5'#3ià¤^Ç{§è_è×Ùü/èâ#:›Ì'0 ŠTíï;EÐ'P³¨Ë¨‰t‰“½§x*Ï`pž!P,C zy{áÇ_3^Dºµ3ÈÀ,Ê’ÙÖ6…3:¢t6wçqM9aYúÜÝX:ß1T^9 ž€üåø*Â\–ã àÈH€:Mýíi 1ËÒN᡼©fS®Ë*ߺ±ÛÌmë·À^([ÞÌ)ßMF8¤+¯zÒûU¢¿ +}– ¿3Œ,J°1¡BŒÈu²w*Õ~®ŠÚ'l»ö\íò±T·Nš€A›—ã"¶›ÇðNªp8c·ĶÛ²ÎfJÌÎ[7މÜÀTqÃZ²{m¦Ù>9‡@q¥8ã°·DãX\~ú{‡ =–Æ™žŒ õeùiz>}7GBï/?þbP:|³[ê8#ÀÁ%fUÇÙ=»±`f"°Ö—»R‡pqÿ²ZÓ½êlûÔ àŽÆqTq7íÜ5wïì€ýùR—Ð,4ÇÇ×pøO4èÙ]0”5Á>Èã(”æY¦nQ Qz­7Më¹[róûü]§iDH–$#þ¨2ê¼iŸî÷xÃŽ#ˆKÂöy£®G_4,M"¤ÎÆ Û¬õ&qX !uxÜ¡QpÊT!SÖkì8æžIöÎJ“EU¬ sae:,]{(Ìàð@> ñ'S÷I.}÷¤OÁÂØ¥"”éL2÷iÆVu>É+ÏÙi¾XàüÍ3gy8ùàÂþ)L¾yËS#eûŒ×³lqMUs, DÚ—Xå¡.a߯û.¡!ã8‚8B¹:p½ùð¸æld¨p”¾Gpô•ß»[\†–‹Ë#õ*é´Ûtß!8¼™§¾SR9eò0ï=KIÚùùlûù¯Eª£}‘Tÿ¥èw.`VêÅÈÊK‚žá¢7”s™Ï^{øp ¹ÞiÖp®½ö•?ÞË_3ÖÞM{L/0ƾÜðžÄÁ H-•|oì ÆE&)3î—a•&t¨ë%ûùε'þ÷PxD±ÌÄ^„9¿!C¯kûŠg2_µ¯lëddtwîß)êÚ.myÑà«uMç©]¬òm¾h‹-lôåbôÒ9˜ J%öºÀ¿¬ˆåc¥¯Àqí]ˆ¢Ì»JG™‡C>{í]ƒÌ¢„ì=†RÀ¿Lþ¸&a#"ü4D–¬Aªhæ!Ò Nûòº'ÎâMž­eã¹×nV›m»Ð¯p†µÔw¤óîƒwy$Á |qÙþöá¿õXD'IByŒ=c'á+”|œíõïÙÁ¨þ­Cî6ÝTÖ©{ó©ö†xýó§±áùC ÕÖa^U®ƒ9•;™ênÄŒp½Lô4ålÆ–7±-ScÔo_oÃX 1ˆ•L ýêfc&ÑxÞ4åtL/[w²—?ú¦OdX endstream endobj 311 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 312 0 R >> endobj 313 0 obj 2753 endobj 315 0 obj << /Length 316 0 R /Filter /FlateDecode >> stream xœÍksÇí»~Å~”f¤ó½73tDÛl¹–踞ÈNäR¼–¼£ïŽ–5mÿ{±‹}औ|H;qFn `±˯'sá¿ ñ'É|¶Øž|U4%> bEŠbæ%Nì¦lË’F)ÛˆP Q` ©j4"köé¤}3½>×”W³7@2(oÎí™ÆDüÕ`ÓT‹T4¼r#$ÿºçåÂh¢Œ! U+ÚõÀYÚ³zÕEš8¡Vϱ„Oè÷ Ë-Xò‹ÔA¤5\6¼ûC(Ò˜ ë,¶áç>¢T~lœr’Qi¬»Xš|Jþ½%þåÅFˆ7°§ñºkP”T8¤8sj“†NéPâÄ0/õëî°bæ; ;½ùðŽ -¸D^/-¥ÙïvUÝ6–ÒÒÙâÈm¥>”e¾å”‘p~s€ïìrz5ŸÍ?[Ê?ùãCU/2¦´p¾\"Œœ[Ò[85h74Hö b”2•d@n¦z¯~š²JÖ'çìa],Öl»oZ´ùa,kdYÃrä#½Ì9˜v@Ž8vdâ Sµ£/‹%/Û¢‘‹\âdÓÑBÌ5õ‡þ¢Á7Ó«éõd>½Ô„i`òîÓäóÆþ­WŸ5t9}=ùøn®Ñÿ˜‰f’Þ’¡=“´§Çoì冯Z¶Ëk‚BÝn!Ä›@b#Hµº40¦.î×fÆ—‘Œã:®(Ûã ë ›®Ä.C¢V$t´£Æ¨)5MZK#Ö`š"M¥í6CEàÆÑSÄ)<îpmsƒÐq#°tàFô(P«p bÏdèHGXP;B£¡ Ñ®ÛÏw='‹¡*HÂpd#¦ÌOHìCÁ%¡ëF^ð‡D¶Ûþ»t#Ð!õàÒ­k‡Ò`¸±aÜ~GK!QßTåæKS”÷®Ë ˆ5ýpA¹Æ©ãz¢ÄIºÑÛ?^Ô¬DVhÑ‹Îщl¹aÐgo9DÒTlSŽ,cÄÄÜ(AQÒd%}a[ð ŽaVc5ßռᲜEŠÌ~v¸(-c<ؾ©vÕÚ˜“†6NÝžäļÀñHÍãÒ¬5 ÔÁ]Õ4ì¤!È*D “EŠAsaY£‘˜œS¶"wV{Ë wì”UKtãtÛÕÅ6¯ö à(uíæßóí¶ýŽoª‡ÌýÜu²ÐóqmÎ? áü³úþD¶]ÄɇHŸ°0ÙŠFq·e5g+¸V_xp¾ÈÚ²0κ¤ QFÖelnôNäzYìõ/öf Ñ_è­¡Hº7XÜŒ 2'IDÓòÁïž/`é,ã÷ÖéÈd?ljD‡ ‹ $¢„ç˜ÆG¾Z®ªHZœþÚZºaýýéK÷¤0}ë(Rß8¦“±´W›~ä$q ¹ PüÓõ (6Ÿ¼z7e-»…“ÆÔõ”ÙòJU¦P<éóöôf>¹ž³O³ù[È8îíÙ¹¬ŒØ¯“ëŸÞN®oO} 1Õüž$HÑây¡ÎC?O?ßž©«‚HØŽIø4ɆޓuU Îlä°èóP½&´œGœ¦EyfâBÑ„…sx#KÑ±Ó A•xyÀØŒHKt5"j’,¢PœX'\Ä*;'7Ðx¶ ·'nBîXù¦æùò‘ñïEÓÞžý‘˜B•EŠÉ(:tÝh˜NŒßÍ1´$u´-<]ÎQ†i6XC‘z‘gDž,vü€Dš ÅŸ/ŽŽ{ýEüî* ]Ç2P£/ ÁŸcž¥(h(Ý 8ƒnSWz‚=+R£(RÏ&Ç"`æAzƒCégÁp­Ô—Iˆ‚æ04Ç¢Þ“!-7(‘HÒD]Êg²úTõRšˆ2êÎÆb—UÉÉ—Ò¶y%î B@ƒa‹S!ª¶G$· i !JG‘ž‘bO A¤têpE›éî*l)!¶€Õœ=VDŽÊ´ç–·¡÷Ìiov0/¶Ý[c«–-6'Ï- ÕVÓÖd,i+ Aõ½·ÆÂú6…Øê W ëç¾õ‡ tÊv¥Ùã6z·†Æ ÒžñºÛ˜¥NÊðÍFÁ¹pˆ¢pw^O­]ÓG&kÓ©/+Ê‚L±wÄ—|U”…n!m7fcÇa²³ñ1×oþaäöO°ŒiÞhb…D¼+$Ò”#³MoPá¹Î-=· ±«Z?' Ýñ+´´ú,/­cr¼ÿuz}=»œ]½±´›Ï7óé/CÛÄ~Ï6¿NÞ}œÞ˜¶¬]X5hgW7S¨)›œy uÙˆ½!y„"é¸~Ðé´®|ïWU±Œêƒî[ ÚRdŸÜÎ[ƒbÓX¸ûê4:äŽH°oT`YÕvJ”&«ƒZ‘&ÌP³SùƒD2bPH}ƒ‚ü[Þ®«¥xÞ«V-”¡ò Bè\@×r®T”KþóæêU®]ç­˜°äuñMôÒêjËPteRÔñX·=‚û)×ó}Oèʾ☨w]&šÀcw:–½¨Æèt•ìáfYxáp2S®Ôí’£®tL§)~$ÙGpñ¢yû ÔÞñûKæŠ÷Óp„•û .UòvðÔëwU™.í‡,DØ/“  ȨÎThZò™q뚈ës†í"Åx=¢úº‚˜Ô Á–Xª7gÍ7vJa§HÏn}öô¥§É‡K‡>MÖ§I"æ4ILœ&‹ÍéÀÃ{釸øwˆòÒ„š$u|v:ðá±K&l:Üþ]7Îâ–V(t­ô|Åk]µ!Iö½-&Ìwnñ²*/L¨#ôùTàÒæî@÷dÔ=Ó ŸD3ŸF3¿Í|Í,6)-²Ú— W}yUßùø Öà–¦í†Ø½ä-¯·Ã›Vþ8@‘ñ½~t¶ê>ªq‹¬eñ›ï.Äï*ˆVWÕ±X JÏ ´«…bù>ð÷ñÜÄ TÄá¼üÄ< ˜oàJÏå/Ô¯9òØáÚ—§Ù;‘ x*’ù¸»›º^=WxáçO ø©ÈŠÀ9NÆ„ûdÄ?î8,dN„®üŽ ©<éfš"i˜»cñ Ÿ@ô—Ü ¹Mdð=ªNY’túZ Í-Œ^-AHc­Að,K07Ä^ÜÛÉp÷±jîËâëž“Õõoš±Ñù!1©–*‹Ç suŸPŠíò»b£ p¸ý:’bˆV];nsŒþ …çMEpu…CÄuÑðW%ù ¾l eòŒñWúcÙv„Ë;rm÷B%™ºÝíñ·Cù&õ *3ñÐPaØ3T¥_`bú„ÓzqÜGëzQj¤¼Î›Öb ÏëÅú³ÎªJÅeO2 'ß‘;^ óÑ©öm,ÖÞ‡0Ö¾%¢-9D­š²©Êίeÿ š¾È¥ endstream endobj 314 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 315 0 R >> endobj 316 0 obj 3202 endobj 318 0 obj << /Length 319 0 R /Filter /FlateDecode >> stream xœÍkoÛ8ò»¿%\VÔ[‹^7Q[ï%Nj;× šà Èt¢[Yr%yÓùñ7|I”h§½/{‡ìÂ3#ΓÙ!û}DoØOÙ(ÝŒ¾KA_’<‘ûVˆ6H"¡¢œ-ìl‰N•«òˆ¾ŽŠ‘…>¾ÝÁ¢²°‡žF–!\ˆYŒ¾€rÏÇŽFQ$mµ1 C¦ÂÁ>é½nltVòÕÊz&ÈúŸ[¯[äûÿÀ" =Œ>,Go?zˆXh¹îRÀ!ر Ì‘ ;6!'–ôíx‘>ÒMR£¤X¡³¤I¢ËûÓ´©OîÐò÷Q¼”îrY<¡lø/À<«z<×êÑ2®¥wTøßÅŽ ÛøÅ>år“å/û @Mü ’¥1·ŒGï¯T~xw(8ìíŠçi±ï'Ú_2c™îÃÎXF‚5€\¢ãZÐ*i誥¤e¾Û¸Å/«ÔÓr³Ýé|&ùŽÖÝ÷¤háûŽmEÓ<©4¶¦Ü·lWdßwtÜáuV<´XÒB׳é—ëX3ª¨›*ÉŠ¦%•Å^óáXå‹-ÕBe[ƒX-9χô<–8 T‹%EQ6 »o¹Ê?iUe«mWÞ?+hWÓJÁõn»Í³Nº'Vè×ÇN@¢€ª|R`V·B·«D³’U 6º/ºíB— ÇÆŽcY Œô1)`W˜ .q„,¨WEmŒž²æ‘¯+è’¾ <88! žŒ¶ò’DXù)@é©@„¯. †Ò]Eá)eÊà[>îð²Ò–ijé¬nDºýL»Œµ&´Ðts·u¹)Ý6~œ\Ÿ/;Bª[q¯qÖ[šfëL÷rݳވ¬}<„ã"°ú1ãøØ×Ϲ$L‹V©Âú#ÙlspOóòiÜᄤÃd* XÛEÛ³GOQoª U)mJ8Èm(ûzÊò²·h x £4Ï~ðô=Mš#±>ºÊŠ?ÐUR±:Âm/°pä°¶çFP”«‡èˆlÌD!rHõ{Çà”¬¡‚¿!Pæa#ÖlëG=JÎ(š”õ„¶{‰|2ìJ¾ç åKŠù†zÕJâÙ8b‡Ó•¦0‚«~Ý&Ñ6•Ø-ºAÚ‡ âÎô–²ñfhOð Ñaë}_ªè´J’2g¨[Z£oÔ`c†¶ýÔ”AhňLÛâ#:<,ÃnB©&"Oçñd£åäÃyŒt{œ­Ðt¶Œ?Åst5Ÿ^Læ7èïñ œááÁ 0ùXQ¦xòh „ÖYU7E²¡è“ùéçÉüöضnOÆ{¸#ì3îÐòZî<Ù˼G· 9ÁÜpIǽÞåyŸÛnô)žÅsðñ MοNnh²7;C_^ÐüÁR{l¦N'Ä!³XjœÎñ|É‚u)7îÜkÂÀžóë˜)%cY1ŽPEãöÄTå†ý]úE]ã6ºV{,ŠSªêÒɦ¢´¿ý˜ó !=È,Gm’äR<¾Éc[p´ C5­è:Ùå ‚yæźgü´mû‘*œV!j…´!MÃEOȽöV­:,[wp—Ý纃å”&¶³âŽ6Õd%š%íÈ$ðǤ޻NE"2î|0O¹6$@DfPÞi¡ D´.‹÷CëÚ¬©ÀÙw\ÛØYÔÈ©JÆ¢ÑãbNÀNЗ³-ë:ƒÉ Aßí%ˆMD¼“³t烟øÊ]ƒDHŸÙ•ˆÉ±a…-”#ÇÁvè“ä¥eGÎ .2è·ßþ¦²µËm“•Å{ÓHõÀs mÍ0+‚!P0*” —à»—Ö¯”×147(;|"߆Áã¬ÈÄÁfU¢³ ךeÈõ`¨bcwàù¦|(Ǿ…Žæ¾WtQ“8¸—‹¦(„¥–ï›Ì.— ¼S”Òx>gs¢iµo¬þÖóU¨:ïÐɺÆI8}®cz­s3§³ér:9?¿AÂ$èß/qzqŸM¡­¿R}<ËÇÄ'§RßBô"qS†ÒÖ^%Æw¶C˵†$Ü»ZP¬4,kj¡¿—XûôA7Goúû Ü«8Ó57|¸XPËI`Ff»ôfì›5  þšâúQyå y$ìsv "lV€~¾Ñ„¸Ø²]8­VhJ±FÐxdœ ÀѤP°Š¯Û6®è˜0±¤ò¹\Rôº,‹!-‘¿ê „ ùL¦x6t’4eOeÊÞéúµ¸9Öá¸[ma|v8h´Bv­ àniˆ).ޤuj'ã±¢È1RÁ ì…q D $ÇŸö‹€&Q‹F'%n6pœ°Â—š²}%½÷¢h÷ã힥–£® Rm0§X‘äC¯øª'§¨"Ë9ù‰âz2Î÷Õ®§›mY%U–?+’|½c`'ÆÊ€´Æ}†)¥Ò¾¯JþÒÎa¸Ï˜aðÜ~ØërYqñdG×ì]Z¼rò¥Lw[Ðä²üÅU-­iÒì*ÚD ôç9H$Ò@©HªUG‘7ª@¾1ŠK‹´­‚Ö›fòΧV¤ê®(™fx’çå“&Î|"õüASY·šŠ&+ãODöœÈOwó˜ÀÄ“•9œèš“ø?ÍAÀèCÅæ©.‚5º‡«sˆ]7Ÿiƒ¸?<àÈ¿2yaˆmâÀDü‘O,lûNêJ/.eÚžvÌ+uÆgoþăÒêÊyìÄÞS˜Ð‡i"‰útÔQåä"±oün¯ÕŽ_z§‹áÆ™¯ß®;ð¢S÷ ‡˜ÁÔu×û7Öÿ~0©y endstream endobj 317 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 318 0 R >> endobj 319 0 obj 2471 endobj 321 0 obj << /Length 322 0 R /Filter /FlateDecode >> stream xœÍY_SÛ8ϧÐ#̀벭ÇL.˜^®4´!ÜMx0‰B|uˆráÃßÊ’,Érhï¥wm´«ÝÕê§ÝÕÊ}xÈ…¿ÇìWL|4_žÏC±‚H°p„¼Ø‰Ü­‘ œ ‚ C&"†AÃÒœX¡?åÀEï7w ´@®ƒÑóÀµŒs3WƒO°8Žœ J!ÂWßñ’„-8 ækôf¼öÑÙ¦‘–Þ3Cîî½îQàùÿ\ô0øu6xsŽ‘ç¢ÙR…@à9 0“0F‰øl11[£›ƒ«ùŠ®³ eåeuvŸU]ÞÿEçuux‡f¿Ò™Ønc« (þÅNUÆ]sF‹¸–¯¸ð:çÇñ1ì‹MâÅo6!‡¸ÿÞ ’0¥)w¬Aïg.¾ÿtâ8Nbœ Ž4ìÍ@ûÉY§ÈÖn7Cº›q­;˜*(:D1FóMYÕÛ,/ëSÁyûö1:Ù•ùÓΖŒ]æe^ç›Rª¾HÅ-]Ò--ë<+,mŽ£æŸïvÔ ¿ ȇù¤-¯Ísc=gè¢Ðw"»®%Üìlµ¥l3Çr|ÉËE¥ÈÍR­J^V*â^³ÓxCš%M0SÃõ·Š¾žŒ?]§Š¾=ÈËy±[äåƒb~œŽ? §Ÿã}úùöðHÑç—ÓtünbhË— nvpý–ŽÞ;L)ò¡ ¤Ù|¥(“¢VY¥ˆ¼ÖˆÍs©ˆí® Ú\½Qã"_çµ6µ¢Šøš;Co•i¢â8q¯©Utž/sªù¹Ül±È—<5[›b·.õ½h¶©Àvó¬íriáE€gHHœDO¶¥æ°qOR&qᇮÅÃAjD¶†çyp³…°XH¤gofHC=õÀ 'ŒÙÚ¾¬¯Y:E¬"Hõ<ãS']Öè1tO¥Œ…â΂~T䔓mþ°j¼ ‘·èáڣ؉1q˜$æ:þ1×…½$“ RĶH\Ç  A)ê‚¢ùÚ@!8e¶¦œýJò¡‡ |8µˆ`nwÈ¢)€’ØV׆2kãä•μİQÖÊ@Ý(4k‹R|k+®wE?v5*GÒ—­¤L‡fÚºÇ ¦¦*É:ûB[åzó@!!¶GvÙ÷Ã2›²øÖ¤Zà$ÌUªU,9m¢%x¢>4Ľ¦ÜÂç(^[ä„9 —X{©Æ™jÕ˜3D±Ý—Ü’¶B¾~,òy®‰N.g6FAÔÁhr}q¡å©c«àZPB•1lf_5 އÙÍ›àEº•‡=qNÀN DQ‘ÜžÁbõQÃj¾¥Y ¡ ¡™’ÁGðC…ÔO U#!Iˆëñå䕨¦yo9 ÜÀñbÖtÈ{PoZþmM |(q;¨ åÃ쎭êØî¡ŽUÿÕ µË‘"Úš«©»‚•SN‰…çP¬è‚¸ã§À»[†[+´êÔTÛ&&PŒÍ]Ï›kœÝ4A›²&·|¾SALÓótšNFé•â)k Ŕݫ ³R›k7ÓrnÔðÃp6úÍö>ö”÷묆²P{¤§èÝ ãkè¨Êæ|'w¶5Â5‚y&Ø6ÙŽÏYÃe4œÎÆC6ºøx‘Z¦Bå>$UøpY‹Ønµ¹’Z Œëʶ°ÜÄ®ùÙ=°F—h3BÀˆ:¸ŒÇdž'†»[©›VF„lC´!˧”ûÆZ¶ÿØíøß×BØÇÆ> h@ÂÈ Ô¿àuƒCõ€ªǤ?ß9”mÈHŽ I‹lç0ìP [šuÑJòFÉ-hA÷Êݵ£—®†ýpãÎ6¸-ˆ|á §mD±O ¸®ï‘XöKºÛ×å]<ÎR3¶I ™Bmž x±QÃäYz‘þ°É˜¥#xI‚ÞSJ°ëgÂi~&|<^†giK¿´£«tÖŽ›[ùu‘³ô|x}1둚¦W³éxÔ75¹l‡ÃÑl|9y¥ÓÄê{Øùa¨uš>Tgè.:Ñ)¸æ…$˜p ož+QäåæÏ9AðFK´b… ¯V<â[‘ú™ò–PZXéZ[s9Þ|IÉg}±¦ÌðUpf†%£Qn½¯jÃú+×xä& šËzZâ³ÓµpïyxćG›m¶ÉLèû"fj»¥ÕãF|\Ñý êþÛÞ)~’XQÃrÛ—KÕå^a:Á“ÐõiïE1t=º?h¬ˆÿ Ôþ4±OA†ôwq“-^÷BvPü]/ˆ¬Ü°·ˆÆ‘÷–¤oÅ[IÕfMë|Í¿IôY” qvatŒß:ëÜ0/_V‚_¾¿NcøHߨ^+ë8B±âß¹Aw±$ð;à ÃqB¬ÁÈÉç¼^)Š>íò¯Y!¾¿pžúÒÃiî‡0¶ÒL‰üç„z¦qšÅ'¯œ†b°ÕtåÞ…rëœÌÔP=9­ærY½Jö:lã†ûqãp‰O³Ý}Éä¹PÔCö@ ã›z÷öÝTñ}°Únäõ˜rŒÿ[ø­Ixø endstream endobj 320 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 321 0 R >> endobj 322 0 obj 1918 endobj 324 0 obj << /Length 325 0 R /Filter /FlateDecode >> stream xœÍksÛ8î{~…>&3)W”D=vrñ&N›ÛlÒµíÍ4Ŧc]mË•äfóï$øÒÃnïËÞMÓ1’ ‚ êë õ|ø÷Fü$YàÍ7'_zIà…±"±Ø£ ‰ýÔÛx IYê­EÇ(º(0”TÕ‘•÷ñd{â{ïN>}†N Ï'Ì{9ñ{Ì‘Íôäw˜œÅ$ŒÓ,Ë”¬¡i*¦I À|ãýt³ ¼«RöÖÒ Fþÿ\zW¢ÿùÞóÉ/³“Ÿ®™G}o¶´.Rú`æ,J¼”„Á'fïÓét¾â›¼öòí»ʛü)¯¹wÿôo>oê³ÏÞìŸ'ã™RWò’À_B¤WµXä·[3tK…ÿ ‘0ÐK4­Õ"«_Ñ A&†¿¤X9ƒ»K&­÷wN~xu’($m­ KÛ·ío6YoÅ܇•ñ{6[qïLlîf:Eµ~ºÎºiF‚4‚a)ë±ø$Y,ü6š]¾wðMÞÌW޼~Öö$¥Œ±,‹ý¬7£#ñ|ïkW…¢vr×å6_;$±“,¶ÊëV›ƒðåv™Ël»~m¡²Ù¯›âͼ\ï7.yYV¼xv)_øk{ÆšÀY¢Àï¨k&Na‹êy%\•/µÅæå¶É‹m±}¶´¼±ðšçµƒæ¼{¸½µX±ugã²´p³rúMPâG©ïG”õ»¨ø’W|;W"G!I„ŠõÛƒ¾F ‰ÀS0%V¬›Cò:^ƒ;VÜ–ŽêŸË‚/Î{Ë$ }ß§iˆ߇“–vzóۇ۱ŵcÊm w@|™ƒûKQrÇ·$X+ˆ"ßÃ#²„>¡Z–ƒ (#,‚íÒ¤ÏkXk™–Z[‹åÛW‹“؆çÛC柶ȒØðjSlsµ"’d6 @Ô±/@þלË4ž’¾´x2žÎ&7—3CÀœhÒºØë¼r&qf/«/µ3'lM•tKq ë|Ã[Be 4L;¶XO®´çFIeÂ^7¤ìMm‰Ö¬ ŒùHP‘ •ªq¡ ‘ðôjaÎUš‚De9DJ}ô#Ú¬*î¶J;Öç–r9š^Ž®Æe:žYDhJ¶› eÝØ ¢XÎWãëÑíÅ11°LÒÃåУ”c"*·5‚Æûuý_±) 8/7; ˆ¡|DwœÄ°ªERvê«wc²ã«AJdªYCP¨Já6›DYunGMÕwB5¤t'w¸ ‰Ä!}Ô{Qgÿ"Á*~~Pªù*ß>óƒ"´;;É$ÔÓôí1é†äöùd¸³äÒÔ&Ò­»Âí*xåtìXXÁÀÄ¢Úfˆ=•.f£&â*ã•°5.âÆ¶ç„Q› ‘;sCpm“v#°q0ªŽSí^Ôž»Ô9v¶ÖC\.J¿[Û:Ô=×UçÒ€OvXÍ›¡B#b°)ÆêõëùàÔh „mÜPÒêÜ7VÖ Ñ*3ÖÚƒÖn¢,´”ÚÌ Ð èQTž>ÌщÎu“~ý- fxk—“^¾_þªÄ œ²$öýÈW#æ+>ÿâÙ³CÌ^l ¡ôÁDø@ª³$K3¦Š/Gø¼õ~þùžÍ»XóeãÉ”ï­wQó¼‚Ãi.nÐØó¢*žWý0Hâö|Èáà5FÀ‚$!\ü@i:‚Ed"ÃEIâH¬)2] ®Hd)÷Óé²f£_dUF"¶}¨ëÕýo£™y1•¼kðð…. ~–Æi0 6ø¦N”»Òˆ€ ±Úçhô®¤Ö¹³PcÈúe,êwXþr;É{M(wôj‹¢©ÂsLUB½û-‚¡eWóªQ¥R$™ë'Õ—„eü²·Ýc\÷»EÞfj¯ÎÇÖJlœ8L}8R²•œÅ¢,úÁ}ÃM€cgTŸã°øzÝ®!¤X:p3Ìãzt;”æ!o‹ ,ƒ«àåÑrÞ2/Öu¿ÀÆ)I £!°˜s®½ÌDˆµN"$apD87ž$•* ¨î¤Än¶¶[cû-ÁÅ¢d¥é€èΉ“¦ä—“2’DrÁÇs#º›‚áBo?F·rÓõ´Ý×r¹ÕÒ€ßAš&îýÕHýŽbZ<’€Þ•IÙ8ßíÖ…ÉÁƳŸd¥‰x8Í’"ŠG½êùDè™1Y•O™%¢ØCbÈö¼åÉWh±Â,"¶oàj—µIkAry¬½6OóœK˜O³˜v_uÕ°uXgCÒŸbô&×}#?îA–Q% ø.á¿H° ¦ :ó¸29 OjÔê éIÔ"ü€‰Dÿ€©)쬊¤Åéέ¤i-Xw}ºÒ}W˜®uÔ3Žy€Ï¼´“äÂÜÄÏ(äÿ‘z¯¼œŒÅ=óÒÆ{„°ñÇhrù~4y< üÇ3•† úÍÔ»»Ÿy²Ð2º»òD§Ñål<ùóv|÷nöú@ÿ·^ðxöxv$ÓŽDê$ž9RðÎg±ºŸ©ˆ«ôF C‘¹ƒª½HGF3ÈFÆX'8X¼2=Äcµå$K©/÷ÛykFU¨tʺº ‹ŠâüœCÙå}爄E?úDaÒ±”Ð8¢òÝ6o,|øsU4¯†b'874Qpãâ£;®1 zöAdU®Q¥QDÄû%~˜ x–.{·›í#W¬ß§£ÁÁ>â«#b(7–¯YSDñMa¼ <ÍfƒêµÍì+  ßìÊJ>ê A­òÝŠo84Cºv›ÿÊE=Ïà—“ÉønöçÃt<1Dô£L_ùr]¥pÅ«x³¯¶vÜ¢XâÛ“¡˜‚–êÀw\¿5+%úi~ÓŽM^VrQ•Œ‘°,ò°•F»2çˆbåÓꪋŸnENŽz}Ó”oà‡ aZnCÇà².ÎäZ=PEzm"i…ª”NX|ãë×¾>IØÑ§µ7EúÆì—8ÄêœmM›i¯”Þ¾ˆØÊ9Ñ4uõa̬ÿ¹ÆMx’¨ÎO$r¡×pø˜ÅÌ7 =ºø$J»Áô‰Ïõç%ÞĽ%QÔ—¯gˆ©Â>"›ò›3ü)ŸyÉ«EmIh„›bƒšªÞ{‡‘£8Œêˆ¾ÕWSÕ-!ûúg½9/6ò’ßÿ €Âþϸ*ÀMQö–ßNˆo ½Ó×roà—\î*DdŒCo!~ÊgQÕ´²°{TéÖÜrÉ $ÓèòÆÀ©»ÕÎ!8R¹Rè}iO|]nŸë!mÜqË=‹>ž:‚¸ýÄz÷í mm»BÌG™ÁgçâÞ#ÎXýæOòƒá±¹7›Ü¼{AR9bÖ¯‹ Ô6¶=VÝd,"~’fIi¶”âjrÿs›#5N–À…;¦>õ0ªr‡ß%x¦.~¤¸É²”Q¥~¦j¹C°¬iEò>y7×Þø_7ÓÙÔûì]`÷m¾áoÛMý¯*¨?8á_åߊ²:VçŒÅVä˜A@•‘ମJùvÇTR%[(cöù˜µ%*¦V°’`_i‚ `Iû©”Ù‡sêXÄô;°ÁNÚz@fºx/!q“6ó-±ï‹¡Íø­à/ýˆ‹šZªÊ}SÈO„lGBöK‰~á¯lçwXÉ ljgµm5ìÙ%&ãÓñêWù$ï•5ú¾ôj}h$_ˆ¾ë"a¸ÊrJŸ§¨¿+\2ˆåûp›é3j½S(=}nä0V5_8ÕG Öò3öÖëÿ1‚uá endstream endobj 323 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 324 0 R >> endobj 325 0 obj 3552 endobj 327 0 obj << /Length 328 0 R /Filter /FlateDecode >> stream xœÍYoÛFó]¿b[Àfx…kÀ±•Ä_cË‘e¤Aš\YlERáÇh¿ÿÞÙ½HJBŸÚ" <3Ü9v®q¾ÎbßSö#J\’•³¯‚æÈ%^(HAHœÈ 혔D q“-;8Ùzœ*N#²!gÕÌ&ogŸ¿À¡œØV@žgöD8йŸ}åAhyaœ$‰°Õµœ8f*<+ +É«ëÒ%W5?-­g‚ìÝzÓ"ÏqÿÙäiöz5{õ& ŽMVkžcy6¸9ñ#[žË@ȉUI>ÿpŸmh™¶$­rr•vécÚR²xüf]ûã²úßl¾×å²xB¹ð7²xV >¾=übdœ¢k*üó-i@±ÜîÅ>mEÅOöA‚wþ<è$!Ê`‡Œ{ïŸT~8:‘+D%ˆ ßívÙ$ŠL÷áËØ“«1—Èä4†'?t›´ÓXC×´¡UFÍ&’>nM´ÖpÞÔ;K£K!©¨ž4ñ[AŸ ÝiC‡ü;š"®«Vd¬*V¯5¼®Z<|¿Óƒ¯®Ú®I‹jì ¯á6×ùM;†YÂÝpÂA-“-—8!M 8‘VüØêâõû9©rµ¸¹¸¾%ÜíÀÛgKŠÎB^½ô G1ô¡¯xŽmÛ0fÅ£p“VŮߦ]QW’{ODŽå;!p{‘É]ܤíÒŽ–”ù%‹Ÿð–i×5ÅcßÑ–€ù[v…²Î‹õ ?"Ó©í³ ¾•ÕÛ¾¬°ÞV·‹¦ö%4ÙĶvoÞç+á®Ë÷÷«ùr~%ÙÃ)»ãÐN]àOäoi‡Æ’lÛ·„-';ˆ mº)(Ù#ȃŽèûI8ÂÍgLäIàCUêÔGTËV$åÅsMûé§Ÿ5Ân¦¼¢BÏFò«´¤†å MZÜÜ[ºžf±ã'£+í äªsr†q"L Ù-X|ÖO›Žà#éä@>Á\éø"^è%GW)›úY‚ÂU¢0Š ‡Ä±„”*QÌ–ÄVZ°´] ü Æ›¤h'2Ù÷©Ê©¼Vß'U e¯™³ºih»««\¬§Þ½‘§Ð=®K¥­D¹5J+ Ñï`.:ãwË뛋å'‰þ2ÿt"á‡Ûës%¬‘ЛÅr~ýöÖ`‘`QåôûÉ”ƒwt„þޱè[ªDät]T4Ÿú# FþàFXdµX©âam´®¶/ä[º-r\^\¾ƒÌh5ÿu%:‘5mÚ0€9l´ ÍNǃ…VÂsÒÀÄëƒHÛÕ¢–/* ‹¬F$—S™¢¬‹’´p¾P˜5.œŸ&Ô%íŠr «;`­ [1•÷œb–W0ºæÔ¥n2tiYä9oSžå ÍB½dZ-‰\¬;žI%á¼üånq}»’”«ù›åÅ[%W±Ü¿{X]->Þ*ÎÅÍÝÅåêd^]ÔÔh2­›\4jü–AùæPXÓÛúÎð¶P LÁ®)Ê´y!l˜`/¡žÀЂ@ämU›gO¸—‘Ò¦+2xkÂMÙ“¹¡gÙ‘/¼ã¡æÊAÀG¿Ñ&Ý*œ½¬4ë»âU4q{D°B9˜*H>0‚Þ¼zБ+JÞ‹vèמ6/ £ß¹òZXtÔV”µ¡ƒ®×EV°úVöÔößfÿ„#—‰òòXÒåÌÑ4ÿ-ÍP7ppå`]i¶´ªY,-E鋘¸8¾c(gƒÏŒ‡m²„© Kš˜4ó4ÎVš¡¯ºb«•+hPHÂú˜z!ŽF^à¥s e ŠGPDùhÂñã÷—Ëë;ã4^axÀ¡7—bbGšr¢àKl”B°ðy³=œÑˆlЈ‰€"¢#*L©¦ÎH’‘3„pVB;šë%$£ñU /L¬›9¨Èä><ª‰êæ;z%X±UòlºÛm *Å`2òv+ ußõä½Käjõ¢@¤¹·u7íÜžãLœÁŸVB°y­@ú½£U‹½D|„öÒð qž$ö;¸ÕŸ0F«ŒÐŒ•Ñ7æïòÉÞo"y.¸_y¢Úüº7àµahN [EyM•Tpg­Q9ùØšâyТ0Ib7ï)«Owó#+ Ì;VÀ.éøáxEé^vôÈRâ±§Ùöl'p|c)ѼÄX:Ø®¡ îÌBò¹™ß,`‚üSNTÿ?2è{IlÅ>,Ž±ÈŸKѽ˜#Yþ§OÂL­j\E½´{¦ð† M¬„vƳgzóaçŽb¶J/-ؘ>[>݆k¾z}Ašš-w\'kÈl[5'Ècaô}׊<'IüЇñ¹):š>ÛB/Š{Â釾F~GQ2'ñw¶M?­Ð‰aëõ£á¶éãô-·ADaXÌ5ÆÇc… ×N¤‰µ±v"¢ÖNDÏFŠÔÚ‰è\Î/®4¶¸}ÿIcMc ¹4¼íÇåõj~4ÿȇ ´“È—Ë«X4ðœîµ1#§©ƒæÍ)¢}r85d©]q½7ˆ£ÍT×Ö =*`ûIûmgJ3bzÏQ¤,­ Y†\Èüܰ²6Xð·4¦7&NÇ àíà rǬÐcÜ^rH;ÏŸƒê]û¨±rÂß”¬a c.¤Æ;hLÍý‡÷ÇúGÀ~ßbû¶{î¸Ü/–—Ç‚º¹ïG¶ëøñ¸s´ußdF;?Ò;¨&e0èN`ëÎÁ!Ubf§àìÄ.ÁAÙ#8r6(û²ð «ƒlñ“N<¬w|æ;Ÿ$hèØ£{|¾šß_~™„ÂûkÛQìˆ ]§nñß$ã€%0©QtAA=Ëënòµ‡qéܤdíÒnc~ÿ Þ-‹¬ÞÖÕ€MVÓ¹eY{löý±Í¦þÁæü^åÙŒ endstream endobj 326 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 327 0 R >> endobj 328 0 obj 2206 endobj 330 0 obj << /Length 331 0 R /Filter /FlateDecode >> stream xœÍXëoÔFÿ~Ũ­H‰Y¿m HЄB…D!µAhãÛ˹øqØ>’´´{gŸ~¬/…/´á‘Ý™ßÌÎìÎìøã‚ù¯8õ +Õœ ±~¤¦ÂÜØ‰H%(" (8ãhÈYÔгŠ[øuQ-ü´xû™V@œ®Ä—0§‹×¨<Œ?JÒ4U¶zŽ›$\…ïD8ÈJ¸ÿ¢ôà¸ÜÚzDþsë‡ù®÷?°ˆÀåâérqÿY.åº?¾ëøÝœ1$Žïñ!ž‰e oïžfVÒhµ‚cÚÑ Ú2xuñ;˺öÞ;Xþ¼8Yªí ,q <ü;âT€ŒW'ÎÌ÷³ø/p|9‡3Žâ¾øR¡‚¬~ó= …Óäï½NRPáiÈ„÷¾¥òýщ}œq’QTÂtàûñAûÆ.³¢Èuïß ±ë Û0èØum½k2ëº*gðÄÌå&o¡íhÇJVuѪª;¸`°kÙJð Æ¡h´aÀ×WlW¸ŽçwyòÛ–Ož¾¿[äü€‡v‰—¾Ì XÚ¼®Úó{¶)‰wÍ#˜Å)S?pS,¶Œ6MÎsHú]c: ^'Œ_xzÙØfÃ7Ÿ æEü®⥾;?ŸA³ø.hö¡-h»±11Åóøæ(î¾ÇŸX‹•ÂY…'|58<Ðò ˆ9cŽ¿Á§Â i|¸Ùš£ÔÁê‚RuT^ˆb&N_û$¡ÞýÄ+꫃=ܺVJJ=» -Ëëœ˜È †”%Sa° ,ãrü]yëñwûL‘©s€£Î<ÚHt›oT{S^ÔÅ@|¼õ‚¶wwì]LC—`åV@D‹’E©Æ1 qÒÓï‹ÒsmŠPs¹àÇ!õ0-˜C°”ñžá€5¶L‡.–6¾îËõRDz4Uð©!FcLÓ­áusSL}“¦Í興¥CMé/-–rÍò;‡S®2‡ÓÁ€þ s8 7£ÄkÔÏ— v3dDgL­Ò_àÎ ß+”3Ú‰ZeÇ(LÓ¨L ûWC¦N‘SSŸ˜ž:…dÚuÄ \l©]U¬NOTà 強§¯ÎÞüxwä…|¸n>?üÔ9 üÿï;·õµ™4&ž¨gÖ« Ÿ·”·ß \åÝF\ã§Oð¹…š2^k®Y¶Ã‡d7j݇ݷ¥%Sgúºý6{P¶??yr|òFcD3Q脞O\â…ú¡¾"è¯ †é¶éMÒhé >/S?LãÀUÏ•G*Ï¡ƒt(¨>‹ R©1«ZÝc3õàÁ‘óê±Ü±¦µˆ¶·“nÑäÐ=Ãm`O<Ù†qBƒ-éã[Ba÷ê¼¹!ƒ/6¨0ðœØäcIô[–´ì‡ç8uý‘Tï¹9ºOJ}2ô‹õP™¬M’Êê²TÅ@N ù¤ƒ=fî=ü}»ø¨#oÆE†ÁÇ«Ãû£—8±Ï‘(Lg÷›>pT;Ú…u "ß› Ê¾Ÿw¶ï´Ä{ÑPªÇcÝe ¢–¤M¯}»˜iÏ%e‚'é¥ Øœ%ÃþYÏXŸ»/Ѭ/$W´£Í"“ŠöC‘Û %’Ü<>O{†ùÏP˜í8`šÇáÖT©¾¯ÿò+r endstream endobj 329 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 330 0 R >> endobj 331 0 obj 1966 endobj 333 0 obj << /Length 334 0 R /Filter /FlateDecode >> stream xœÍYKsÛ8¾ëWà˜T9 _àcÊ›*Ç–³ÞÊÚ3¶fspåSPÄ-‰ôˆt×Îþ÷i (’²ç2»y”ûF£ß€›̇¿ïÔ4Y±ýFcKC%4Ĥ^âglËdmÈÈôS}0$×Jß“J"VÎâC“iíý•›O['`ÄËzVI|G÷}Gû‹U6°¢Ú»;Lzx˜–yIÃQÒ”0UÒ©Õ/,\½E¢h˺ú0PV†PýUíN‚Þ^oU{ïÔDĦÃXS‘>ËeŠzó´­:¸”«²*ûkwVö¶œ^;­/>rõsຄÚÔ!‡©‚‡©1g©9ŠVȧjÚ(1_ë'†f6Kö !5zG&Ì/HUKœ˜€¹¸`ç7Ÿýçõ‘x‰àò'ÊÛ£˜â”O沂‰—(R‘j¼wl1E ˆsO±¯ìtdÚ=û8¿¼¹…HªAo»¡¢8í¶¢ål_˜&J}ÈI¢$!Åh÷ s/§žNS‹"Ô†æØQù£lÚ²úf§™‚†p•¦'u¦r[C’Jƒ|D¼ÓN’4ðò‘9¦ò¿’V–¦c,;™°çÔdWfìYáê5Ø‹g« ËAw¾PK,˲zYqzP.|?…»ùˆ:ƃ6ʃ‰¯ÑÌ.Tæã‘’ñ»_>w]G‚5„4œ³£u£‹ä´Õ³Ø Ô»B’ŽÈp PTÂÞP tƒÁâÎ=w%„Ó±ñÔS¡žGùˆöuG¢<[u´¹_—úb„úF'O¸fÊãƒ}”+¹7i<’¸ l«>a@ øÄAURtQ[q¥/aZÃtÈÔ ÂÎ[Hæ3´³žL2Pò¹ËMñ¢íSÓ:p-¾»‹…COzƒª9A¢óu:r¸Spfñ´Ñ»ð2»ºXp¹i×VÉ1L³<Æ:2a»J½¸ûTõд†á†²mzS‡ ³>ͯç·g‹ù¶¤¡:Õ‚ºK ¬¢›'¼¯!¦{‰sB`O JgMkznäPn6:=îZ]3×á(2bÔÆÈÄIGqä¥AMA˜Œ¨Ãµq篱q^èCšOx:ÂÑv×vhœØ?XûMVrÇ’i­k5bà›øRvN=öÅíÍÏ/÷1d@hü N¨ˆëæìÏ4ÜO¡Ë¡:GZå=‡–k¤é ]/}¿e½;ÖÞqH­qâûaÓ«Ø…„±Ö·©ÌWZ–´nŒ=g0M?wÈÞŒS` ˜.*‰ïñ ™Æ|DJÛý桺±½|Ö‡¶2´"aŒ!-KªP/‰«šÔ̇׺î·ó»ÅíÕùb:ÇEù±õŽÊ_#MÄc/Uʃ^l„ÛùÙÝùÙÅ|Z˜<9¶Ü±å•ã­k×CO)‡GB¾Ïx'õ{DyŒãƒNeiaÉ®"ìßžh =íqzJ!Þ3íGÇDÉì|½—›Íøó8å29q6qv(Wî2y¸Ê™ØŒH¾ªG*DueÜF¤&ÿu5ÿrb!9wÍÆÌÆXàX6\ëÐ÷ñíÀ×?}šßžôv©&ö´×Ânh_¢²­Dé Ô!ÒG óü Éó,ÌG´ôb8Æ~rlý¸‚º{‡gÇ®VÇr~ÂÿddÆáÈ"µ[”©™ž5}ðŒ¬ÇŒ‰êÙ‚ó›kÐÉÙÕõ™¯ÜÆ"zÕ4YØù¨Sèn%Ô¾N ¬ã O¢Rýã˜÷§é&tÓ#X!šB,ÕeV®V Õ±’Ïór”˜ß—è×£#U? ÕMöÏ#ûÀ€‰iô™åØï¦âØ‹¸L„qì<8afŸNÍêýæö>ÿ~³ endstream endobj 332 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 333 0 R >> endobj 334 0 obj 2224 endobj 336 0 obj << /Length 337 0 R /Filter /FlateDecode >> stream xœÍYÝsÓ8Ï_¡G˜)ƶüÉô:š”Ë]iK’Ó”DI|çØÁvá¿Õ‡%9vRúÂЩv%íÇoWÒ®ùÚs _±_aì¢ù¦÷Uòº’åÈ ­ÀŽÐI"ò#”²…!["‡˜såjA¬ÑÇ^ֳѻާ/°hlËGûžÝ.ÄLz@¹X8ˆâ8–¶º–EL¶Ì7èõhã¢AÎW×Ö3Aön½ivÜÿE6ZõÞN{¯¯|äØhºÔ)€ Ûsì…(²°Ë†Ó úôb2_Ó )Éh@*2#%E·³¿é¼*_~AÓ?zét—Ëâ å¿ÐâYÕ˜ð=»9cdœâk.üx<àX®~±©TYþfõÐç ‰ßGA’¢ŒÍ‡!ãèýJåÇ£bàXQ#*c`ßL´_ Y+ŠL÷qgìV‚õ ô®å¡DæyVVI²J±ª¼c$dJ-EN×Té÷¤¬’l¥E¾/‘/µ c—§¨Í®¬L“–y±é²Ç”@ ºèðãL«†åÅ>)içþ²"ÝЬ6síèöIš¢,¯P¹›Ï)]XbËë«° »çZãÛ¶Dbó`|{‡.oo&Óqt3­·í­gÅ6üq|,¶.Š|‹RFœt™dI•äY-+îˆ~w¸Ç!ä—uþ”° ôæÍoèÀZtn¬ÍȆ^ .¨…Yè›Ñ5ù–äÅEmdGŠ:®cy!óØ•H((Ë!H¯@b(2P©*yyÖ¹Te«¤EºJâ(jŽïX1ø±ßa›@ĸ8†£ÿºÜ¶m»µIkR~>ÑåÓßô±Ûûû›Ñ‡û¡)e¡‰»ñè}ü Z!t0>0P#^r0¶u´TC8kE5jг’R º¤Íæüð Öì±CÊÕíx8zw£h0¹CÙ≳ýœ½ŠÅÏ·2†¶‘ñüdX*l…8°"pp©ÇG Ò!p˜(-Ú2/û“Ëþ`x4›¢vaرÛ0¥ÔãrKçÉ2+KóF†©4AÌót·ÉŒÝ¹±²Žµ ˆ¹ËÄSN†Ø]Ù*ë”òn|{§É·†‚”ìJÚ-¡aÿ×-ÛÁóèè÷mAË2áÇÇ·ÙY枊!Q£¿FÃzE¡WdüeQô? ?k-I%/éô /æÎ 1‹¥Ë]6g×1IkA·4[À‘yT¬‚¦„­*×ÉV1ùC\*rF«=¥ÚG°¹ìÈí nú: œˆG‰Û)Æo1®AÔá.¥z©Áƒ¤(Š3SGÖ©PÆCj/Ž¢P—“uEÊ£.ˆ™–­´\Fœx^èð2êôznÇ&gUÑU…kc+ô¡¬ð"YVô¯§Ã1¼Ô×÷ïoNÔ®X6†7 *±‘¤ %Âõsµ„ë±ZÒï¢x …ö\N}ƒaÖšË* M 4ýÉ Ç Æc|ÞR'JcE·íR/`µžÏ"âHxøé»h¯Œ °ƒæ-òq ÇŽM8)å(ZºÎÇç%­ŽíàÈ.5¦ùí§åüÐRêz䄘¶±wà†VàÐï r¨\”´R"é4ªšª·ÔXû ¹ ÜnUR=×$OÉœtGÛÁ['7tÙ“ndƒ`ù#Ù.MÉ,IÁ† ƒýL!* »vóöëèÞ¶g¿MÏšP ¢"¯O´‚² ±Î*{ÐõBÝŶ<—k’­øÃêxX=Ôrl$šœ•¦¤þÕ”¾,ƒ;‘¦,–;æFQzÔ“ëÄœS›iDA6~ƒÓ4kFÓ|ß°6L˼¡Ðœoúï‡íÈøînÚ02 N]è8ô-'d-fÝ'N†S4^õï¯Oõˆ8†j&`w1ö¤R¸KômÎïqôNÜèž]@} :Bf×ùÁĉlò ¶1¼T8àä3@›2ôøˆHÅš²Ï¡õ7™ŒPP³MuV—¼ÿæé“Ð.½Þ Çýépp²‡–»ðâ†Ø5ºñ§aöX±mû'ÏèÅŸ‹³oC1=½ã¾ÙDž€»ËÀ˜}ì@þ@ò…¡4pÀûûœ‹|£>–ïCÿ@³êÄ¡‘’ýiMî†'Ðò!™C’ÒwÜ®"ƒ½üqx°8‚ìbÜxdHҪ̄\­JÓ€}äaßi Go]z>ÍÖ±  °¾Q|㱓”¼®ø˜èaÝŠ15…~~±…˜åíŸ_jîäõATp»’ÂÐKÒT|^«5Ë/R!w˜®òc&3Ý´¨suÝäIUeëÎ °{Û†|O6;öµÎõÙe™ÒlU­Ï õý<© |Á⥻–s’R=#ž¹J8&í— eK!'eXOQC9÷QËápˆ!Í ¢+þ•H0~x ¾´¦†Ú°!ÉVmPØgž(ÌŽ6Üb …Kõ™ôIwT]vsRVšçœ/Êè^lÜ'Õ:ßUZk¶§* -ä/9ôÒ¼,¤\™¬2þijyÉ ž^«ñ_ÿŒj endstream endobj 335 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 336 0 R >> endobj 337 0 obj 1935 endobj 339 0 obj << /Length 340 0 R /Filter /FlateDecode >> stream xœÍXYoÛ8~÷¯˜Çز⡃E¶€ë¸ÛìºI«-Š4ŠM'ZèH%¹m€þøJ”uÆu€Ew{Àäp4óqfô ©/ þ}ª\É`O¾—wŒÈv€ºÄ±<ˆÁL<ÛƒH+v†ZÅ y)5ÚÕä>N’‰L.¯Pi ±áÛįÌ,'ïйíîxRJƒ•êyÚ'V1<;œ¤¥v^²þsômDœ²ÿ" n&/ýɳW6P üMSœna˜¥pÁ#œé!Ö„ÃåÑru«â ‡ YÃIP×A®àüúoµ*ò'Wàÿ9™ûf»¥­² þsIYU[XÝ•VÅíäÿ Â+J³q_z)2I6¿z¡ÚeЪ߃dLµŒÞ¯tþpv\Žâu²â°Vì»…ö‹C6È¢ö½ÛŒÛß ªa…yTïÅ­öD…Ê`•FÛ8`½†p­’",îáF%* Š4«6ûì•34',"8—Ò£ôÑæäМÈð ÿ8•¹cmÂXZzÏŸÿÇ»£˜ß©U¸ WA¦É‹ÚÝ ³x‚ØÜ³,fôÓõZ¿k«Ž)(R(n•qCÀÇqq§ Ý´äoó®Ui')ÔMD•š~‰µžúæE˜ÜÀ× Ú*ó·`I§«´˜¤Ú[EÛµ‚dE¹æÞ•ØpTƒÕ8_£Ãlùn±+T‹HA©«ëGºÌ}Èn&š,¸BZèM¸X!”8)Ø`i=¥Ä.×YµƒpdWiQÛF]›»ª&¶E¥CûŽó!äÀ‡Õià|§Ëðe¯2xPÀ;‚Ãi“lÄ ëùé`jb¨vÔVÕ j  êÛÒ¸h¼Q §ï»FÓNX??}t?ÓŽõƒ³ã! ^Ÿ†¨ƒÄáHéó¦LþüüéËÅâ{ìu‘2²Ùùâý›3|+áùÙübêÏOpåãôÓ¦K8=™Ÿù§þ'ø|´ô§>|<õ_Ó,òùIýöQ¡À–碧c\ø(¤˜΄eÙ”·mí¥¦=DH% \dB† nÐðá¸fÅ/!Âax¤Ì•’»î^oÆFÛM®¾lU²RM˜<ò"ÈŠö¡Cf÷.ç>ãéÙkÄ¢±´‡Ê&S Ai»&³Û ¹Qð<ì˜p¤‰·ße)²cª|'B ¯‡ÈÛõp·ÿZPS=/¸YŒcÍñ»§›¥<ŒÃ(È4é(0c¡yn›«ÆÞ&m ¬ôîtÙ¿¿aäm‰-_[«ìd9>h’““Z s±¹Hj: CÚÐo)í´­CKšæIÅœ•’»ÚÓxT« Ñ·_Iº¤>‚DrÂ%†nE2âuƒ1-¥ï„õ¼t5 †×;ª:g¸qmÇ¢¸ù‘+¾v×a„ܳ‡4…îs–g!{³Îizh¥¢Ê‡Ž¥MñÚ=›Û­Oå¡»"Í 4¤Í ¿$/² L (¹0h}¹8ž½âx·éƒ˜od ŠÍ©ñ!Tß`–©ê3‰>%¾ ’ðnuî9#Ù²‡PïM´¾bÄ Ã‡ÓùÇ=‰²±3Š÷#.LŒ¿jkµ “ð'w+‹Ÿ9x¶yÝÔʇ‘y Ž/j‘N’xf¦QÖããªpÍL©wÏwì÷z¥‘â=¶VÆÛOv? }G¿dÔêûÞ´òÒÊeu^¹„Ùt9›žàýø,ÎgÓ–Ôìõ|öœ¿õOÏÏàjh» ×çp—³v8Fzú%GjSÀv-Uz¦ª£0/P”…7·;…«Î'êèù endstream endobj 338 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 339 0 R >> endobj 340 0 obj 1809 endobj 342 0 obj << /Length 343 0 R /Filter /FlateDecode >> stream xœÍZmsÛ6þî_oMf\$øÚñyFg+z®ÝÆJs3ާCK”Å;ŠtH*>ÏÜ¿o|‘âûÒ»4©wÀâÁîb±ýåÄ# þû^üˆSŸ¬v'_”Ì#±Ox¤DaD¼˜F,!;¢˜$LH):öHÑE‘\JUod¶äÓIuÂÈO'w÷ÐiM Éó )G5·'¿ÁäaDy”¤iª°úÔK1§«ùa±óÉe-{kôBûŸ£wqÏÿ?@ÄÈãÉ_—'?¼ ‰ÇÈrcC€{”30sÄ$¡Ü$ÄÄrGîÞÜ®¶ù.kIV­ÉeÖeY›“›‡ä«®}{O–?ŸÌ—j¹R— (þÆTFU¯! X¿Å‰8#·RøPŽ2P?„u‰¦R9Yý š ¥ÑðçA#)UÎà¡Ë¤õþÌÉ{'æ ¡IÏ+wlß´?Ùd#/йÍbÒábØ(Àξù3YÕå~W‘²h»sòã!gJRe»Ÿâ 1À,üIPée¾)ªœ¼%ßG!,àMfI1µìrëtÓSŒ`'#Ÿ1ãÉξìóæEhñBØŸäMþ¯§&oÛ¢®ƒöRØtÔD±7Vi!íä*nçWó‹¥åëÆÒm±+ÊÌtY—ïòªû¯×Í!'X4=g—­êú@Œ÷'tY0«2ƒ°txô2NƒÙÿÔÊ0ÍéE£ûÜU[Þmëgc2··£7³dS?½Mýµ©³ãA½`ãN°qêq‡ÛpC²ršimEÕæMO]QuõP§½¶Ê×YÚæ$®¶_Õe…ӹݫƒõfå>o]ÅYwBo!Ïb–±•¡1ÅÝ.ôÐÊ*4Y]V«r¿Æk‰¥õnHtÝl¹lÓa 0ÑsµÍªGÌ=(PÁ–-5=8Qêð(š@ýi±|/·Ôr1»½˜]Î/‰ÙcÉ+öç ">ø“9æh-=ˆ~½pÇ`Åæ€I®:€ªZ“©ŸNÁ³rìT8 û_s† »ŽFÉÄÆiåvdš|‡Dµ’ቢ J­ ÛÿÔÕTMªmó¬‘A,l‰u¡òÎQ8ûj7å ÓÍ^Sèʶ6ÌC>6$dä¾=Ú¬+Zád«˜3 ¼‚ÙÔOy“ ¬T[:WÖ^‡òâ„7Ò7¿’ßóOzP4䳘z©ÈˆÊˆë¦~Â:ÁÜᆌ÷áä`¢ÒˆõM*€0L˜ÝÁ‚6êεD\º)±*Z@Öô&ï45ÿûâvy«¹{Mœ™sVp¢,:½’‘—üÀ›\×Cå]Q7Ç®8~ÐÈSźzh»¦~!Á‹¼Ï¼øsŠȈª^ ˪!eô¥Ž¡ôIDxF°Š;g~…ÓxA„ÊfWËù‡oE‡S–•"¡¿:Ô8÷áðL*[ ‘ò'Ø$Ó6)Rá&i„¬9q’±$YIØØŸÓóJîMÛiv;Š'Õú<ÞIœ,Jîˆô[và%½ï©Ùæ«Nâ/ƒGƒe¸ú¥% $¸¾4Ù ²tÑBmÏ&ø0Lh¥iÌâá—¨´U~—š¨U·]mDI3½$ÅÖ4à-V]ù2¡@„Œ^YùÖŠo»²t7kðbƒƒì<ê]AÒ®ÚMÝì²Ò ŒçŽzZBLãç°0f}“ Üž'Å75ÜÌPÆ ÈJƒ ©›Ãûƒ$­Ò#6! Ô“ðU+ú±|ì³[qêá®oær¤ïÔzÞxõ.&ë-«gÃXHªç‹í·µÝ´G­5!Ñ£H‹Ò±‹ÂE\8ô 5#ñ^/¾ëÅãá&1½%P7¦úíêHÁÌ|¸>qÐÆü±ºSƒÆ~êB^–8HZÈæ Y‹E5K,Ôð §)³ÃôUR2êY™ºrh‹eW7V®Ÿ'4"mZ#“Q1öDô×^Š;|>Æw"Y´ °73¨]Et€2ýM }ÍšBÖѲó6k¥µ«€+‡Ü{æ«2oày±øØ›Æ~€»Ióx"üìAåÄp(ß¡9'›“/Ð*;ÑÉÇN;8¯Ó¾¨"WQIúŠÍwh Ç\ WèÁçh3¾áôæP"ý;$£ÉM_ñ"¨rÎiÚ¼PéOLãæéa² ;‚+r» ‹Œ¹‚טz‘šÂΪDÎpnÆuØÐ?Ctß3´Ž ãüæ@28j#ŸÑ€ANПQzõ¢ØÅúq(ÂÍŠ«ßg.ÞÏ>|~ã³ÏoÉåüÝìãÕ’|w}-Wçß©KÜg|o%‹[r}³$ׯ®ÈìúrüUÙÌO¸¾µ õ³ ¸ºþq5¿þiù^©‚ÙΉÿïýzÌ+¹• endstream endobj 341 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 342 0 R >> endobj 343 0 obj 2734 endobj 345 0 obj << /Length 346 0 R /Filter /FlateDecode >> stream xœÍX]oÛ6}÷¯àc d,¿%^Ïvº¬]²&†¡èƒbÓ±6[j%%Eýø]J”DK²b@7$HŠ<¼÷ÜÃË«|QDàçû4CËÝè³£(`ˆ+7$¢V$D;ä:¡ ÑÖNÜkÚ)®ÉËQ7»êlÐï£dDЛч0i…–èˈôÀ+˜ÛÑ{Ø\*ÌU¨µv¶2LÃÐnÁ±‚Ær‡^^åìÚz Dþsë}‹8eÿ‹zý´½¼ˆ´X·às4k sf› ‰Å}8»]nÌ.ÊQ”¬Ð,*¢û(7èúþO³,òÑâ—Ñ|áÜ-±JA1ø p©ª½Rý7žâšñvþæÕŒ`&Á/ûjë‚ìžöEÝ”%iÕó IÊ[Ü YÉÞ÷Üüpt#8Ü‹Š÷ûBûΔõ¢h÷nœ ºÎžÀ&ïó4»þuryU9õòBõ—qR¦vYX­‹¶…ÉÐ*ÝEq‚ò"*ÌÎ$E û’á0„)+„ñ0ÄkôêÕÈ7 Ýœ$Ú™×h]´,â4y]mìgU‰©P„ð€ím÷^ÎÜòºë`𾵡nsSZ·2ëèqÛ¾^n£ÇÜ´8·(«,ýt¦çEt¼ðð%ç µj×G«•×m7qË4É‹ Æ –YÇIܸ?[›~·çÖ¼íjµôΨ™Q,h`T릛(y0(j1.rÔâáo@öTÀ¥¥A}L—Yç 4›_LîÞ-Žèž*‰µb Zåì·bp&ÔÁ¯‚rDûpobƹÖ\r§Æƒ0•þ­uã΋#t1HQ’H­•cëà‹i°Ÿ¢í£A–6·ë1²g8,ù¡;í³›ëßžÁ“ ,sây©œo¥‹pÏ2È6D;wƇq*¾† â ä(5BP'ƒ³KŸÌW.J×Ï" Å¡êN]JÍÐôúêvqÉë]\Ly| í²*œ_ç¥wV[‰!+'Ær¯TñN ¹T æŽ{ÓŽ©ƒœU‡B…ŽÅ ìù›é³Èƒ±†²즞ҞŞ€ÜÃÜJœ†}±}+}¤+t ¡š;Â_Çb4öæ–7Ö&(=PpÎt㿵éWH® tSÓÚKÞÕPš Ìs¬7ýËuÓ´*¯Û¹€„ÑePlô ¬/*B¨MÎîÍ&zŠÓì°—q1dqˆ°–xAq~Ú6›`8Ü& =:€5ÜN'³ùaS´-àa…äC¦œ·l&«AÒbà™ÝÆàîêòýÝ|`Yï~¡îXñe/7ör…\Uã»vfÖ&3ÉÒ¬Ú±û¯m;j›×7óË7WíÀÛùmg¿¨ÆJ1Õ@I ngí|yl͹×ߘd¯÷ovö]Œ¶yÚ#IÚ!ÉŠð“YË-’ LÜ"p“ø·Ø©RW øî¥ää•g•º ŽFXêl(—tJ]Ϫn¥[®:}Â`G Ÿ(2Ðm|mòT˜¤‡k·9¢)³DÝ9舕iû²=›:‘ Šõsr !°P—Lõ=“*œ²R ær §ÁÞÉüÀƒcËÏ}{ ¯ó%Íþòí[Åëò [?ë,ÝyÝ]šûÍ«ûÕGþÁùá,OgïÔ(Â:¬MT}ëßÒà£Ý­r¢I#ð­¯:GK †EXЏbt‘Å«it6U…û?Ì?Ö9¹4 endstream endobj 344 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 345 0 R >> endobj 346 0 obj 1385 endobj 348 0 obj << /Length 349 0 R /Filter /FlateDecode >> stream xœÍkOä8ò{ÿ œ‘XOÞUÀpb›Ȉˆ!톜Òi¶†-û߯ìrl'N­NÚ»}ˆªŠ]ï*—Ý¿/\âÀ¿¿ð?qê‘r»ø]Ò\{Ä$)ŒˆÓÈIÈ–H$ Ró…/‘ /¨r5"OävÑ,r¾¸»‡Ekâм.‹9²¹Y|áaDý(IÓTêêQ7I¸ŸF”[òébë‘ÓXÝkÏ9ÿsíM|×û?ÐÈ!‹ã|ñé,$®CòNߥ¾nNƒ˜$Ô÷89‘oÉ݇›ò‰m‹–Íšœ]ñP´Œ\=ü›•]ûñžäÿ\d¹4Wð åÁ1Y5øÎð‹‘qŠ®©ð@}¤…z!ØÅ?Õ2Èò/ÿЃ¡pþu’del‡Lxïï>Ø MQ‰BÃ÷ÃDû›]fE‘ËVÆÄcc+ÁN®³£<#ùõÅùyvf}:‹ì¾C?À,;»}õøÈödÍ6USuÕ®éw§öîУ}ðO/wÙoÿ |œöA3:4¨¿þú“êj‚TÜ LpnŠ-;|IQrÁ¡«`ZdØïÙ‘8äûÆšîP¡W+.¡|k¦P­Çîte×ÙêäbunlÝM[)9mÈm§5øVì+þÍR>ŽFÊ×U ªÞ“Þ¶&èÛð4¡Qá¢`d¸ôœðáÑ:Îή®3òFŽÎrˆÌ¹XÝäÙÑ)¹:³ØºžCãpÄQºó‚­Ùu„jÊìä—’ÂÃd›dA£Ø²B³’·¬µ¢lÄ%á¢Q œè•sPã ï'ÞHlǧE^4±8ù0O$bÔ˜ `Ï@˜—Û7hkMÚ5Ø3äâùÅ`»ÛÌÈC¿¶æ×¢›–^Íé<yN‹®n`¼;á†áu6á·Wæž`Üd¦Š“PÏž®çM˜¶Ã °2ÍŽZØQëoqªá®>.-ákúR·X†nD]šŽãÉ뜨­_"OôR šÍLP}„g½Â-‡?’$Q4!JÞÔÜС®¾©I†¸Y»¾ |¡|h•6ß­ÙëS÷›I¥e¾ gcñRwš€½ä`°¼™Ùü®o‚$,^‰°ÂTp¿{5tØÌ œC/9BNÌý)tP±Ù°øÃB!dßYù"ORAÊà~EÛ›s€ \·ýkÕ²¥Â”2†{PNS2 ×J·gì¼Y–²Jø…]=Pô–{ŒƒmSíÛN£eŠëƒso,®Œ#²ÐàƒÐËøS³F6Ç"58âwÆ·>'ƒœ0Îè3s¡ê÷Ã#½54ØuOÿ…††¡ì;4>û, Coä×={Þ³–ÙÍ#ßî«Ô ÌqjuFk^ž× ü G¥š앜ÜA{Tº‰ƒÆˆ"ö˜>’L´Y_' VXxÈi;&¿QÅg¸ü't¨¤Huú (BD¡¥GS:!*Ú¹\7:%dþàäo¹!\DÝØ0 {yà«>ÎAõŽ6? AQiÌßQ“ ®¯4“–ð+¶I‘·s˲rÏxŸ±CÏr×t\• {‹º(älKxrD&V0OÍ¢Ùñ¨­ jÒ¥Tµƒ…A²UIavpSðG‰ùí‹q~˜i¤0„¡ÍAŒ²žxî<†#møŽ´Þˆ‰2BP?òô”ù!—¿® ^ßÖI™$¢ƒàK+ŽDºá ªBAâIybyg8LÕªÜÜh" ö/®3T:JÁCÏŸ¸„[(ÉŸ@i!½„|€Ì`¨W8´Ö¦Q!¶„Ü€¦ü'#/Jlaâtêíq¾x¢÷øpKQ–¬ÅÛbg\ä‹ËV]3å\ŸÆƒ æ=ŸBúñû”;ÁsðHÌß[ñU\!ò•z~Þƒ«±Ÿúáp]³Ù+õ°ÚX(H¾q÷¨zë>Ð+ªmU{…‹|’ á9FÚ]› ñò×µf"í‚`dÐx¤§Ú8Weü^Ï; ô’_ÍD‹éz@D·4ÿ~ž¶°Áxȧ‹ÁÏßÿ¨K¯ endstream endobj 347 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 348 0 R >> endobj 349 0 obj 2369 endobj 351 0 obj << /Length 352 0 R /Filter /FlateDecode >> stream xœÍXÝSÛ8Ï_¡Gn¦I¶d»“ËL›J‡&Ìô!Ãqâ;'¦¶¡Ã´÷¿ßʲü™p÷Ô»¡4«Õ~þ´»Rø6¢ˆÀÏ©úp<†¢Ýè[Å£ÈaÈ‹ D,ˆ‹v¨Z¸ÜE‰ìJ¤"­’[IëÅ}íG]ŒV÷ ´Fsô}DƵ™ÛÑ 8ç[Âõ<¯Š•aêºÊ……Ñ]î𥥴‰^"ÿyôíˆ,Êþô8úŒÎÎ9¢›¦,Š-0{¶ƒ\l1EBM;´:¹¶ræ(ܯÑ,,‡0—hñð‡ŒŠü·{|ùA•ni«,(ÿ\VUgƒÛ¤»Óª¸šßpáׯ–æ3y©­¤:äêSm’— éÏ£ U¦ZÊý#+Ñû•ΟŽc»S¢…}·Ð~1dƒST¾'Cl%ÒÉœ{}qêbb—Âö@q|{s…ž²4’ëçL¢¼ ¹“ûbb¬ œSæ8!Ä"|`Å9Jâ]\È5*Rt9¿õ—Á;4ó¯üÀ‡î®g¿lƒ/þòÂoüåX;låhìQÕQV+GtjStòVª6Wñ@ÃöõÇŸ ×ÙGeÃs±@'E?>ʬaDI˜çÍòüfþ Žƒmê¨Ô+gœ*4ÄZ|ŒÌÒ7±DqŠmX:J÷Eïóf¯aóœ$¯fñí9L”‘Úì>ÜÕ’éfÆçð% n³n2œx÷”èƒBÅ›µF,lYPÔµöÒìoóoÉúû£ð2JÛAñ¾Ù&Œä°jǶG=O8ŽöÃLÃ;.:Éd"aúæ G££éO¯O2S-Qs^d–Çé¾a0LšÅ:mè}Z4‹0IÒïͲ:6½xÎåaï‹«Y³>|¼ò[rYCÏý¯GåâV¨uw5¬D¾Èdšªåh¦5Örïã0 zvî Ç%& 3¡40[.®Q°¼¼¸ð—FQPd n©£­Îv¥Oȸ¯8Zoêvã˜Yj Z5úaôþýï¨!Õ-Ç{œxVP˜,6U‚2/²ô…ÆQÜ4¢¯îqìpˆÑ†W©¾LŸ‹x/Ñ4“¡‚÷ p#¦ @dN'/Ÿ(Ó6Þ€—Aç8Ü#„ ¯z‰Ü\Æû—ôO˜=ýØ2(KŽ°ìæ¾èÐÀŽ»QMEÆ\{Œxå[Të©tìÔ—Òý¬™›ç}¤àZ·àzç„jSѵÞ2¤ìO—¾ºƒ:‰4"C»–…‰ “Èqi×nËQ³oDË9†ñf‹ÀB»‚GtÒ Ý°”/C_/Sv·ôkŽ‰Í¬;×BÉ©°®×eå7úÅ0X(þn°OajE9 à’Èʆ‹?‡&Ñ6"vå­‡týzÞD6†EÂ]xAÀG]b¦F3³¨*ËΩÔÜöh2¼ê˜JúöÚŸ^ž_NkÆ?ø´˜Õ˱1[sznçôÂý©Q2-WRðõ0ø0Ÿú5£‚@GÕÛ˜.@iy7 Ëšw_SMôå²…ëô1k·<ëôüðñz¹ôjHõm±.!½\5d»˜4§UKšqßç:±JU7Ìi&ó4yÑ]¢w@?;-Ÿçm®jëaŒö8|h¶±Eá Es½ËU ­ŽÝõ“rôwþ°õ7 *Q endstream endobj 350 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 351 0 R >> endobj 352 0 obj 1630 endobj 354 0 obj << /Length 355 0 R /Filter /FlateDecode >> stream xœÍYYoÛ8~÷¯àc4¬DÝ…7@’z»^$)š¸Û-Š>(2k¡Ã•ä&úãwxH¤(ÙqòÐݶAfFä‡3$û}b# þ³_ADP’O¾K™‚_Š<Ùö­åH2¡¢Œ ì‘lˆ$.•£³FŸ'ÅÄBï'_¿Á %²°‡î'Ö@¹Ps3ùÆ=;~E‘ô•`; ™ û@$9z3Ï zWòÑ­÷L‘õŸ{¯{äØäà‘…î&g‹É›ß=d[h±R)àØØ±æÈ PˆÂHȉE޾¾ºIÖ4kKô.nâÛ¸¦èÃí?4iê£ohñçd¶ár]<¡ü 0ϪÞϵú_´ŒëäJ ?.v„ $˜xû”ÉE–¿Ù‡–ô8hâ÷N¤*m²¹d½_i|÷êHpØ[?Ò°ï'Ú/†l°ŠÌvLdc lš”y^èû>öÑ«š~ßÒ"¡JrG ZÅMY)Q¹iÒ²8Q‚·oSÌô uWbïÓf=0 `ÖÜ'–áÿO4…=‘&¨³©LíRâÚ8r,øãØ„§T ßtä{Z$ÍiÑ ÛÇö<ǰ÷ó¹XåñÃ8ÛÒ=+ð|i1®sà¿ï üÃ"yL2º„0À[¹0%è#*–PâPó¸¡=àOoдû2Ôl[¶™ê6†¡úùV?zÆ·©Çh™wŒT˜2N¤4£n§× Iž/þäAV†ÞÛð–¯ÂHX.ÁèA Ú‰˜E¨YšÞt‰ŠmN+Hê,m`h6¢ß‡RÅ–Õú÷åJùN¹`i˜__Ï.gW %:ûrXæ|#€Îµ‘h£G MâïÉ?¥àyX;Ú™ÝGp`r )ô°”"m_K‰‚O |’¹<ýû¯Ó‹O3%9ØŽbväsH?†ŸèêjMÇCY³ün¸Qfù%ÙI 6wô,DUU; ÑùÕËM‹§ }#¨49ïX¢;‡¾ìA,¿QÐ|ÀèqnàüËùÅ qÏ9)œ”À„g¦Ð;ºJ †¤ãb½Š;ªˆspºå4È… sw¢ÓŽº™}ü4»:Ÿu‚’ˆÍÉ´±;°T®:2-zG+mZ’”Õ2-î:IS*r­”Ô𤫔.‡¨ûŽIµÍhÍÂ:öBVà\dê4ßd¿dø¥l1”Œu¬rÛ(A£kKW*¨&ˆ5sZ¹•ÓWІ”ºpHAªy1¿ZÌÞÏ®5/XÛVšY_ȵf5mM\Œ€xh]a* a¨ó¶#Hwä™’Bèñ6k:^%è6gdÛñàÚ[–]̇žìß¶¿wrg}S•Z5ÊÕ´îÈš*Ù½oÌ{(i¾ÍGÇAÉí}ËÒ­Í€¡}¼ÖâZ5z(ÁÈ=Öl·Z='«®bCÕ/7<§×éÝšÖMÇó}!H†£ö¥=Q Žw©¶}=ª½ »ܧY¦yÈ¢oÒ4{ì„·tT§á–æ°‹éñ;2èË,ÞF<ìÊTäžLÁ¡o³›±?¢Lp´1AOäLè`âF ÅóFÔtnˆÁÉ^‘ĉÓÛZÑåjtˆž)\ Ÿq…Vš§2*Ö“±"iUisJ]¥noÅŽ[ÇJí-¥…f3NÖt‰‡ëåzÆmC–P&ª³›&a=¦~« n.O/.àØòZ“ÉSŒ.:›¿7½›Ïa®&‘EGrWŸ.g×ósM’p€ZîVwÖFŸËè\î…Ô6IÉŠ6©F!ò"Õxژ㭻 ”oaÛ¬ãŨNbvø_260F› ò¬f§Ï¢l}H(åÇa;Äm6Ãk€„ƽçôbGÅöÜÞNõ‡S¡;W 8cupüå£áGÂÛÔÛ¼ó}€$!^ÿ̽1¤µs҉䓧Eh-§]M„`ºÛÂÈ;¡cxËnI'hºy¶yrôàè K@"§÷â6ùİŒ‡{Ó ÌÄëP¼)Ÿ•Ìg#ýÕH¾ =[”®ö‰oï˦F†ç/yO†À_êBË Œømbõæ|ï9 ”»œÕ^,H÷ÉÉëYûÉÙ¯-!_%9=Ýinè8!†ã­'òáÛpŠ+^ íÀ¼Ë¨¸ 5O¿SÈÿÅú¦&-Ë endstream endobj 353 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 354 0 R >> endobj 355 0 obj 1832 endobj 357 0 obj << /Length 358 0 R /Filter /FlateDecode >> stream xœÍÙnÛFð]_±àÐäò\®­$*‚8‘•&@’šZKl%Ò!);üñ=¸—”íH‹¦ÐÌpîcI›xÈ…ÿžÓŸ8Å(ßN¾ š‡bŒüHÂy±¹ Ú"$a‚6”Ñ)‹}FÜY£“râ¢W“Ï_i‰\'Dw×RÎÕ\NÞƒñ0rü(IÓTøŠ/I¨ ߉ȷèh¶Åè¼bÜ÷T‘ûŸ{¯{ä{øà‘‹V“ß“£—!ò\´¸V%à{ŽïBšÓ F‰ãc BM,¶èóÁe¾&Û¬AY¹DçY›]e AW‘¼mž}E‹?&Ó…—éb…á_ì°ª2„k>Ñ*NÒþŸÓ€âàâ¢6âÅ/}Ð!KÿM’P¥ ÷ŒeïW?ØŠ“§»ZîÍBûÅ)³N‘ÚƵ ìl•+‚žÁÓÔcíZÇ–äº(‹¶¨JX]kH¦Áe¶%K oÈ·)s]ኔ¤ÎÚªv4â°ـÝÚ 5ß.f­îA­³ïÃ…¢ü±??h-Øí·èôý‡éÛ³)•KœäY)á+"ÁÎ1†´•³MKj‰­#a‘“ï9¹é|åœÒ¦1V&×uU²5mV·»Í6;õìn]äë!;<G/Sk„E‘q 4°34Ÿ^.Nç ªžatðq¶xÝé²j4ð' ]×ÃØ³uf“ßwAMâsÉÓ7‹éÉÓ‚´dKÊÖ±DCßI©¨ë{\tÆŠ" ¡µõ`8ç‡ÃÝsìê‡ÆÕ6d£©ùrpW´ëj×*R¦@v_ž* „X˜Bò]]C=i…V×#‚z{Ú±Ô¤!šR^±CZºJÒŒÛ9Â^N/@I}W4äQu]Üwðƒ›«ô骸…ðÄlé&Ž^ÆC.vBZ5Iœpcçó‹wòè;ÁÈôÜÔñ¨d 3–I.ëêÉDÉé¥Êg´'èEÉubª-ŒE 3u«0èÏGNQSgéDÑ^¼øM!,8‰éãˆS>+pöRÁÓO³Ëť¿*ð¸sÌ:F/À½”ÇtúŸ ÏŒÝ_øŠ¬³Û¢ªOF›4GA¯aÏá¸ëŠõŸó¥Éw˜™e¶‘cÓ ìüµ»E@áÑôjn £' Ü“gé;1ô…ˆc:#H½&Xê¤?¼÷»†˜{AäzA0 êìôòìô|:ê pï‘>Ô³¤RžmT¶+~ÕÅB¦HM®ImœÅÐxö ¦]y„tŸÓÜÞ¥ƒ`·3HW+¬Ô?gÓ‡h~ña1{;EPz‹ùìÕ+˜î‚Oθ»E½:îïàNöŒXàïß wu•“å,_ö{`¾`õº€ê¸‘:¬á00jpôð€ŽžÁQê¤Ô‰Xø•!ˆè–5î7œÄVÏæÓÓÅT¢];œ¾pŒ°¾›_œMÏ?ÌEúÚH«…²íÁÁcg‡¨x-]'öÁ‰7ïóÈ£×óBÇi|ùq¸]óÞâÙ03Š ?ä G¢WdSÝ9 ]Ý‘[RjvÊÍ…e lvWb9D‹[±êiì4Õô ^j.k>¶u±Zñ›¤°TÛ Lý^k¸‚%4œÌ³g£ù^ØÛ¬Ç#U{‚èŽbOÉw’ïàÕu£?¶ïk~ìx´‚DWMgvéÄ—J:’¹IìEâ {Þ'z?,¸„—î1Ûý í¹ÏE)dH^•°Õ67]a¤ɶÎÊ&Ë»ú~¢4Ø- ¶}‡z1}7Ôz‘ïD\¯…b5¤i¸Oá)ÒË"[•UÓyó³~ÀÍ£Èí°b4,›9 œ˜á˜šå‡£~8j¤‘Dé1xŸ¨9¤Æ´ÝïÓe9¸QÏùmV7»MÆìì ;Àüƒ@…±¶Ù5¼tÏí6ҷј´d¾—¬]crÚŽnßñÛ‚ÜQÄÖ‘tÖ‘ÑçEy[ýÍF)£‰18À¼‚®k;Ì Ød„¦&æmÏCÜóœvDu,«m&fº#)Ö|Õ0 ÄÀ§¾‰-ó `µu±‡ÛöšÞÍ|³y´)ZzϦêt=÷è8kR=è•A¶ Ò ¢iÞ®ëçLŠ\L¯–?nˆÍ0(å^ü æYÓ>MÐö0é÷NU/I]”«‡³Ü]WõöaVíÕ&î½!ö$ínÿ~Ⱥ[4æÈŒà‹›¿÷rFí=Wö½Šu¬m÷/h½Më¦Ý¦¥|…b˜Úî{‚ hüÇÈÉm ]?ð¨MÚaÞ`5Jy×0D{uʉ¢RÇ•ÙîaÿØkBÇÚûQá^½ïb´=RVæ˜ãj¦=Þ´R÷B’j£~Zºqiù¥°>1ÕÀ|¼¸67M!Û[ë½lHa~>Á5[Ÿ $æ®í­õVջĘ~á¸×`uÆ‚ æp‡>¬ +0w×ìŸUÇü±#³^wö}ÉcÓíÁï}'{¾-DØu’$¡WÎTûʉø_ñÄßíÐYM2uüÀü«Œ»B‘xŸ½=Ÿ~2þð÷ƒq endstream endobj 356 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 357 0 R >> endobj 358 0 obj 1932 endobj 360 0 obj << /Length 361 0 R /Filter /FlateDecode >> stream xœÍXm“Ó6þž_±0~‰„Io&½ËÑ´pI`Žû ³•Ä­cÛáÈþ{Wo–l…¾ÐN)Ù]I«ÝGve>öJ›‚HšÂ¼¹CØ‚T†á26±%²)R ¸UÎÊÞöòž Ï{·w8)× á¡çZÎ…›Eï5nFN G£‘ŒÕw¼ám8 ñžÎ¶>\|¶Šž9rÿóè͈ÏÿDäº÷ë²÷ô*Ï…åJS ðœÀE˜Gý Àg"rb¹…Û³E¼¡[Rɸ$5¹'…›û?i\Wî`ù{oº”ér_œP>þ8œU­°ï¶G Æ5vmÅÿûN lhqüóbC™¤õÆi8ì€T`pÜO9CDC5“ÆBóušÓêÃ#GÛ~;ìh¹xýB[bÁZ¡ìÍõµVÄ9V¦Á˜i„0fhôØxbFO Ï9¥ MŒ gݽ«M±Ï "Ïu;å?0t" c¿ËÒXV6a’ç+ãÆ ƒ¸qB~5Ÿ½œÌßkÃÓ÷µöæzöúÍÔXZjùêf>=¿Ö†¿èÁÜ5¯ê’¤ymìL ™’xs<&Œ¾¢G=ÙÐxÝúËê…Ç/¨Möu±E.ÆxîGÂ]½ [ /ç7¯€—zµìH£òÂî5OÊb÷Êt¯Àø˜‡s`ýH‡·0»‚é»Ùb¹€;=H¶sèDí÷-f]Rĺ84ðÌ÷»àO^,§óEÌïwŽ7$_S`´UlEB¨N`çGïòÃ(HìHV‹èã+ÒèWLk7yn’MžË"|¥5=žkã¶§¦w‹AÖ»M¶h¥ªVm‘× ;Ás¯_áÇxàº7s,4+¬‘B¨úwh4o&³b¬ÆåoN¤Ôt>¦diU;R^nxõgbƒ¥r®¶E©vÆV”Æ©žSošXÅw¢t¶b¤Ÿq;m7Cfß2>vÉq’iÀêA ,­"§§˜°«ßZ&ß{Ë÷¯¦'˜„]úa§)Ÿô¨±+WRö^9õXµ¨0>åIÔ#F82ý¾HçöƒÒbK{)c-^*V†™­rw†®.ŽÐÆÿ|RÒªÈ>µü|Ÿ{}¡„~kÈ“…†uÐã’îpw$ÝÙ‹¬c¶±¬Æh2‘8‘ä×F ø=T3Và“1]ç¤.Ê# Èw€áÓÊZ¸=B$;ºáĆਓã‡Ö)§7KÞÞVXš÷ضäÀh\íw»¢dŸø²&üDË aâm^½ÝOÑ9êw—?„4™å¿.ý@ç endstream endobj 359 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 360 0 R >> endobj 361 0 obj 1529 endobj 363 0 obj << /Length 364 0 R /Filter /FlateDecode >> stream xœÍYmoÛ8þî_Á-ª©×…/€7q¶=ôâ®ãÅP ƦcdÉ•äfÜ¿¾H”d»¹/{‡íÖ3Cr8o>T¿M|Bá¿wø§Œ¬÷“oF擘Q?ö"š=1L&$lj=§’+©™­™ù}RL(ùeòå+LÚê…äyBGʵš‡É¯°yy[úfö°²ô4—ÛVÃAT²hWOëòX­¥e7pX,ݼäµvÄ1?€~@{KX¤ÍŸ=i#ª'ÙµZ-#Ó*{Ú5Äl¦]|”;ñ=+«kQÕPq/bPjí·²nªò…ˆq´=²Úe5ÙJÑ+Iöâv õñp(«æd¬ÚÕàwYÕYYԤܒ``õðë'ÏšŸÈwèÅIL) —7Ëùl5'7fËÙÍj¾$ó•]¢^|ŠM,‰¯¬w¢ëFV¤ÆH¡Y&]¨Ÿ¥^ÀBJ95јvZÞ’B9ÈÆPÆk#Ñ…”1Þ0­ šG uA{!öÒêýb~!ñšø:*?ðÏ[ŽZuÕ]“/dº.ójš¬s)¾&'´AQ° mü¢2tøðf8|ël›­… Î…Úó!ë4â°OØêÃr7ß1¸¾CòF8´-+ƒý<‡9t!ŸÎÍ‚•éLXJ»cðÛ8|Y¸F¹Œü3«›¬xúñ^®¡«ëeyÀP‰üRm¦ñ Vm"¡}À@€tFÏF< à‚Ó4 N¨5AâaÇÓé“u+i”±šÖ›f*f´lÉÇn²¹j¹TTÏY-_©3ë6Ï Xš5*Z²­ÊýI=p$Å1oÆzGÎh:p[ª² }«R‘m³V\/¯(°IUƒÇ Zo“¿tjtE)=ö±‚hÇŠÒRr»ÀteÙnŠcQï(Õ²Uz45‹ôckÇh½·?[.«ÇÁ`þ ¿ÙºÜHç0s’€+`g!aŒT}|Ä}{ç¾¾Ôß\cIÂ`81GïÎ×¶wÜi’ı}ç`€%‘úpÝ¥ÔwÑÀMºÇM¶<Õ®/t:NÐð¶µ·¸½g!-<ÅbÙ˱Ù>§¹ÛŽ6µqieÇ §ëSÓ•ÜBž‹µ® 3^8掭 ñ[I©°þÕ9³Êýk©lE–׎C÷e#ݵâ" ctLÀ^7³ÛùÙìÄ"‚'þÜ.a³3&üÄÒåüaµüx³:»¡Où¥õ§Š¢l|2ÝVŸ+Õ3L´.'ލ0ŒAe؇K‹OŸf«‹û g‰#ä‹#X›Å]ÿ}LâÖÒ0Uon÷*Ò<мh´L$M·ɰÖðVrB§Eš»[,ÉNákÔý¨Óq¸õú–÷± ¹[.þA¦í•Þ™ ·ôt›®Yà´õ)ø©Á«#¥ÌB¨³J1*Óp¬ç 00ýó¤%¨ë~A>ÏnÉ¿Õߟg7çÏèE¨ÂS‹ÆlÁ‚Àt%$Z=+™Y­Þ,+Ð-©Q!ÓM-å)äÝ’0SÛõâpÈ5BQ¬‚ ?Rgû÷8¶q8ˆ¹×YbR½CêW‘*בù³x± \Ƭæÿ<¥ß±y7–ÈÛêïé–ÞÏ݆-«±«I7Ðaì€: Å÷]t¤ÏÃÙÂç¤<OOèt\rÀ°=契¹ÓTµ1®‚ã?Ð sx¡o6¡gH4±ÕØù¡éÃÛ=«á€…ÐbF™oÿÊ`K°% º¡æåE™kLŠ‹‘? K Kôp_Y%¿³ª[·´¥7¥lçáÅfH“e¥vÕp|–ݦÊw}V•êç²óN÷DP8åÎ@xê!–þSì¹¼ê$ícy·¿hÑÝr~óáû¶ÎNºXvŒsÆÚEpg\‡~ÜÒ ×±¨’5> endobj 364 0 obj 2063 endobj 366 0 obj << /Length 367 0 R /Filter /FlateDecode >> stream xœÍXYo7~ׯ࣠$ÌÞG pc»q›Æ% F¨%m±‡²KÅÐßᵤ¸’ëiÒgHÎ|3óqHéóÄGü}É?Ò<@E=ù¬t>J&J'ÈOqâe¨FJÈâ U|áÁ/QÃPhÕj)lÐÇI3ñÐ/“‡O°h‰<£Ç‰72.ÍÌ&Àyœà0ÉòmK–Áûd¹$ôÜNwE{ÖµûU‘0ˆ†¨N~9›]ßÿCEÂ(Ƈ·‘ÜLúžvÏ¿gàñê”tj,œÃ36„«ú̾k¥ìJP˜yoTÓ²‰-f”º‘h3o¯ßüfm©èÊZ¼%=ÒýḀ̂崧¤+6<.ìiW®7 IèÙh†ºóîRôèÓŠ<—¹3Ñ€@ ÑuW²=2æÿKòDÁˆÍü„<‡:QäòN@Sýçã(qù'1Üã|*Ag6›´Î:ÔF)é¤%†m:iÝ!Ÿ´VJËöŽmDŸ(ÍœtC¾”ÐØŸ$Bì¹´:IcÒøªïÉç¯ç牺5 ‚'wæ" 2 \ð‚0Š$¢ù†¢ÛfÕvµìŽò«’6¹>X:Ìàfxlè̶7(¥a#CÈÃØR‹[”T–ÂÝgÙ¤Žð ÁÛ‡TíÍ*H•%0ø.Hº¥ÑˆFƒjvõB¾C¥ Ù7^ígª‚Lõ×J;g‰{šø·Qè\ ÎÀ{[MûAQÊ!Û”F/³ùÖ¬#KÙÉ^MUYV¨1^o+qºD‰^ÊÈ –¢­*1cÜ.hÕŠGŸ2Öµ{Xw©“eÇãtd‰xfd^”P(ðq4K V±¤Æ*–TÔ¤ÙéKI­II9f¶‡¨ÊÛb¥`==i¼ß´'Ìo¡™ð3n•Ô9²x©~—g*ÏœLµò— ¾Õ>7D˜‘Š]W«öF%žÅF” Ñ{©4lT7ÔZMÌp×KΫ‰¢ ÐÑ,PmC¼ô–(røÂ^k£=€t˜Dµ|5†<þÂê{'ò&Òň ÞŒzW?´Û¢Ú-érLÙ$”ßLüÔS×€nÁ€& pd]»òʱ KŽ5‰¤dN ”û£›ô9xaÌÃk… Òªkk3eÔôñ„_Å)t”CDq$ä~e´YZøxÞtÛ§)Šœ41H“üñ­…p:Ônù‰ƒ&¯î> endobj 367 0 obj 1518 endobj 369 0 obj << /Length 370 0 R /Filter /FlateDecode >> stream xœÍYÝsÛ6÷_·Kf†ß÷¦Ø´£ž%%LÚéh` ¶xC‘ IÙqÿú[ $å´OíÍõjüà~ïb¡~¿pˆ ÿ{ÇÿD‰K¶‡‹ïHsHä/DR'²B;&‚ bRðƒ½%?‚KOPñ´{òõ¢¼°ÉÍÅo¿Ã¡±­€<_Ø#æ’Íúâ3BË ã$IPW×r☋ð¬Ûy?;¸äª§•öœ‘ýkojä9îÿF6y¼ø]¼¿ˆc“ìA§€çXž nNüˆÄ–çò%äDv ¿½Yo÷ì@B˹¢-½§ #Ëûÿ²mÛ¼ýd¿\¤š+x‰„ráŸÈYÕÛ|»¿cd\G×Tø¿oy’Ë À.¾U`ñ/ßPË@8Mþ}ÕIÈÊøx2὿Søëщ< Xq/*‘oø¾Ÿh³ËFQä²_7Æ%ØÇ—#«×ŸoÉ[“7´h* v»¦Mu`xÊÙ³Þjõ'í^š•U} m^•Mf´ÕálÏš×ØÒZï'½f´=ÕÌ¿§íÙ¯ÊJÓkv¬ê–í:B®µ¢å‹ ©á*×øªz Ü:©ãŽ=ä%0»Äu %JëÝ„€ž\×X{¿\}¸ì*wÎZÊ×–”õþr+ȬÀwlÛö")õSÍ”¬Ë=­é¶e5Y³¶™Ëª(„w±ATš—b~&ú‘c¹^ÌíP2ϸê}¥>šüHy:܃$0zÛ‰m@¬µ“¢¸[?[\/Wói6[.Èúòc:ŸZ#w&žeÇpÀ•ÒÉ)NNWÓË,]m®¦Ùt­ßÌ®ÒE6»žñ£ÙlžnÖÙtþi,È ­(ñ“$v06Ó¢ ô‰æ½/ÙákþÌ7gÃeÛ¸ E|Ù¼Æ|~h'Ž¬È†4òmoTèï\ß¾ò¦9yE4‰ë'Ú´¬iùÈ ‰aœÅºUX”–²%(dرA»ªhFÛâ´c?ÕÙ6ÈÙn¯$8 ’èV¤Õ’H¹QWνïe÷j©A>Òº5‹Sc@­®’J[Êf¥Ú²5ÏWè”»WÙ‰zÒP¶P…xg÷<ǸlØ»8‡@0ø~buΚ‰¦<ïóí^CTFÎc§¡¸pÍ{y;Ó„Î¥x¶6Ö5潉ÊÅx¤Ñky ØVO¬6u’Ù˜ÉÑ)8ö”ë <¥rÆ"¼«–ômŠD&€Ð‰;„«Àíã[½ŒjZN}ÎÛ=Y[gé|3î¡®XŒq¶ºK ²ËÀª²%-äŠPÀð‘P ê‹+¢ÌÇ6U²-ô÷­è_?ëPnäZQØŽªE5ù}^äí g\ú?iPnZ>´¹ØH.w «E¨ÀÆr‰;¢C D•ÐB¦WóÙBú*ŒÓ[ZŸ2ö Ó‡Sapä•$škjžÞ©É\•#º¥)Ëz——´~™hRY•ïèîlOÜ £°{v±d?èáX°É.ÕsɺsÂ:±¢jñe–~UkY ®.…!³–·/ão6jÍo€—ÉØe?pÙýIÞy¡ªC,1¢ˆp¢ku9 €2 ØÇ%ÆšVßÉ~¬±4üºgå_ÐãO`[•<³šó6àƒ©;[œåDJì8™jå…Èϱ›ÃpàfqÉH9?ëàŒâë%qãËf—Õ_lܾY®s¼ïøf‡x—¸¾¸bާ±t³Qªý®( Ž ˆš¶ÂK ²]"Øç¬¦õÚ…¼,nDË ôul«£ öĆ›òÆýØw“ÆCíæž·Ë›Íb:OÇÖËŽ`Bµô?°¢r=ßòu"K$tœ˜»LzIBó(ÕËǺ:5”¡ën,UüäÈ$‘ L–§v_Õùø¸Ñt9{JÀoÝÆP‘÷¼êdp­™˜L¶yù¨‰ ñâ;,ôÓ£Ìô.û¸\Í~þ_‹ª ÖÙjúá6ݬ–ð¯þ¡3bxFº~GQ¢^wMEîEXxÕó¬Á8H÷ç|ú‹xgò}:Á;·È›Vn7øÎY[(¢zËlx]F±íƒÂŠÛrŒˆ!V!C(¼knW=p|×¥9Ò´ç‘`T"R°íàzÚÉRDŠ˜{Ÿ›Baµ Ü=íãÓn\^<1]¯Ó•ˆ›|@SŒÉý”_§Ygy{;¿ZΧ³>iµ¼Ëf‹´G[§ŸïÒÅeŸ˜ñDZﺦ¾®wkþÛBz l¯6Ù·O©LH~ ŸÉº p­Ð³“ØñõD/ÝîË3A—~¯j}]_Æf¥×FhÏ}Ù“±cGVî伤>/Í/™)ÃÈ+PÐ=Ñ–¦ty ¡ñ—ÞÝ|±»*ô®’ýÇ ùWŸ æ)$ƒ›¤)wI$Ÿ¿r wÓÖ4/ÛF—šÈö$)PÙ—ÿÙ\.E'™-2ƒ÷*½NWüg£é­y`¬užÑZ¤SŸ1'?À¡(ä/ŠÙjvs戶r&qxÄðŒ£¤×.xIx|¤¡&–Í£øN—WêkG{!VºRG¾œ% ¥~¤K >Á%0ŸÝg¾n@VMMiú2GÂue2ÇÉxä Ð±‡’ݨßÜ­§7)ÿÁÛÀF†EÇ=x xa>øµª®ë Ç(Ãë$æ·‚Õ,)Q^Š{êqÔ5S̳›2kZ¶½mü Iz„½[Ñ26®{L_u2”lÏ'âªUî¼YM!µ¹ƒ¥c?­f_f·éMª!þÇ«ÿW9$ endstream endobj 368 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 369 0 R >> endobj 370 0 obj 2328 endobj 372 0 obj << /Length 373 0 R /Filter /FlateDecode >> stream xœÍÙrÛFò_1oëTÑÜǾÑd3+‘2mÊI¥T14‘M+_¿=÷ ¼~ÊnE1»{fzúî|™ÙÈ‚ÿÞÒŸ0vÐî8û"h6 ä‚äÈq`EèˆùªèÆH·ÐeT±›#ô묞Yèýì÷?`S,ì£ËÌš0çlÒÙG¸Ü°Dq YlG½ÂÅ»#úyutÐMÃvKé)#ë.½)‘k;ÿYèóì]6ûùÖG¶…²½ׯ®f޽EØu(1‘ÑïoÒÝóåunò>Î;‚6Ï’]ßýôÊ~™%™P—ñbåÀ_ˆYT |Ï®§èš ÿ{Øå4 `ǽèR%œ,~é‚}f4þûª‘+ãðØeÌzçå¯{'t‚£WBß°ý0Ðþf“M¼HïVÊ€èÁ@‘¼!¨z1]hT¡ìåDЪÞ7í1ï˦æê]±†…Ü{±eYvqÙ ŸÐ[߯z³Zßn¶÷‹lµY?¥ËÉýB¯íšºÏ˺3)ÇSK¤îʯ“R ¢‰&Ü›WT½š74{ “|wÐXÇ2ËØÉ’JãqÜ †î^<Ò½ìù]PEޤî;¬I·Mk¬˧ŠÌ5EêÁíæ1[­“TS¾–䢱²ÞUç‚t¯oInk+³ð­ÔÁ ÛÄ’fá?®—Ô{#²/ë’:ÃP œ>±N`¬³kªóüM¯ëe‡LÇŠh@õ¹ªø–¶¹t°/ïaí+iÑÃv³Ln· Ò"txrmäbσ€b¶ESñÍrs÷x¿Nçéa±]Ü'Y²M "­°K“Éz™˜;¨;:—hJ?¸YÚ\ £¨VÔGn0M¹”ýÁ@»òXVy;±AìlPçGrÅV6´$ϹA04 )2—ÒDÜ0x±Ý.> Žvú¬yX’Âà«w'wÉ}²Îž²OÂè”JMŽö+T …äúŠæ¢`žïî"¦öpâ‘=˜†nŒCà4&’‘#e]”»¼g*s ‹[ s£ –û«{TíÜ5Û¼V 4¸f;7™Õ&Ò’«Ì´kÚ–t§Ô¨?+*¯öEa{Ã,{%Âí- 1µ©glªÒšÙG3²ö4C3óȾ©ªæÂ%¤A¦P‚Ì# _»/½v¡q¼åËýË+L 9z) wÙTyß)94ìœÇì%ª²g††§ýÄÁgÂuGH·kËgRüS‘6ï~I–ÙÓr‘-î6ïçc:o¼òŠÞ„H­2Ÿªø#5 ƒîÖØ‘§Õ uu»J¶Ôk¶ôUÞõâNúG'±sÝ“ö”·b™¹Lµ1[e)G„laø¥5­à`Qî÷äu_½pBÞMuǵî&»ÉD´Õ§™LlÚ‚¥?Çz½§  Æ±¬‰^}fD¡˜ŸØìl´}n›óI£¢Í²Gvsó9QVKFJ?Þ=­î¸IùpNõùpÇm²È`ÚJGätõÛjý^Óä Ä¡Í¦Ó8›Ü¦&¼‘jÂמϊy~ÊŸË <aœÊuäðH›„Ñ8†„ÌË kÔ¢Îà¯7ŽšªÐX׃cv317sL(+å4.}6. ßNUÓc+ùJŒ½—ƒ‰ t7;‹ÐlZÊœ0ÙOýË÷¢Ñµ\yvìñ#0!‹ÁîG_zNˆ:Uº±šÙ`ñÖqéÀlÀ]sÔˆé,FØ»¾9*T¹ƒ/²Y_bÂ6âXÛòÚ).OéU”š][49JccEQ‘Â0ñÄšØß…ag`‰ôSš%÷Ѐ¡ÓòL”4ISH/Jcßl†d^Nºïú-p„àiKT#jÉ´fy[ ÓóßóYlá0€@‰-Ûð=o8FQ\úÁó¤3=O<÷X(SìùE½bÃ=Ë )•àQK¨;ŸNMÛO¹ÈÐÀ×ÂéÎ0dEYôQ-PxCï éO_æ–3ÒÂÞµTl%fKh+éSއCž¯V,¼¼¸¹_­Wi¶]¼»Kž¶øgñ˜}ØlW¿±":í­žU¾Od‘jþ(”ŸûCÓ–ñlœ£¼ªÐç6¯©ÁÀTTæ¼€^Ĺ"(ô÷A4.îVK%ä± *P+ò]ÿGův‚dž»+•Ý·¡i… pèŠoc‹4M¶×­ã»ÐÀÂN,dB«o±y‡ÔIćëѨ¬›½©˜šÄ÷ìÑÕ–#ÿ7ù!LH>¸Úqd–4'TAÑ®ß(àïdb™ÌL$ßPÓÈz2ýbYسèG6[ÄÁòÃb»XfÉjA6•(pìBüÆ`P~àF'uLç’b€…eÊÉó°KÃ8´byu²ü×Ó ‘¼ZËÛŇãÿ1'õp endstream endobj 371 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 372 0 R >> endobj 373 0 obj 1978 endobj 375 0 obj << /Length 376 0 R /Filter /FlateDecode >> stream xœÍV]s›F}ׯØÇvÆÝì÷Â#±°«V©„’Éd2 +‹È™ô×÷.` ä¾dÒŽå–»{çœ{w¿Œ("ð÷‹½h—¡h?úÒŽQ¤âª’ QqеŽtPjÏnmH{ËëÑ6ºyØ¡£lDÐýèÓgŠÁ}‘ÞâÍ2«Ñ\*Ì•ãºn‹•aê86Ç n¢=z3Ù34Îëègôv!òŸ£ï"â”ýô8zŒÞÜID ¶/às4»B#sfoÁÁ}úiíÌ>,Q˜ÅhVáCX´xøÓDUùógü6òƒösëµjC1øi\»êì…äüMÇq§ñ—Qø˜7c0‚™„ﲯÒVäöj_<ßÊš´æz•¤v©ÎäKÉjö~dòëêh#Ø9SE«÷çFûÁ”õT´¹¯ éÌ‹ã¤Jò,LQ’móbÚ'TL”l“U92a´C·¿ú·¿£(Ïʪ“¬ºð(=ÆIöˆªA¥ ƒ€f½† Nb¸…Ä”7™ë7·‹ù*Xz“y°Y.ÖÁdîoÖ+ïÞïÍ—Ð~\Aa¢™?éÀ…ßÝz~Ls”7Õ ³5…É"Ôþ²‡¸ì¥ÔS&maÊòb:õl’U/ÖU˜HíºŽRƒð¢A;–©ªoÓá åÛ…'\,6Öü Þ»åäýdêßû}i™¦XR _ËaiEò”¤æh„§¦\»0nÐcfÖpÀrœlkÒ+´\´ò¯Wþ…Çj—Éßᰘ˱ŠP!Îp¯ÇÁN9•˜k( ¢Ù ì8)+h" >¾ó¿·œëf#ÕòT,§æòªQ¹t1 Š¸¢ÿ…5;­Jø%K·ºº…ÝOèPLµ ”2ÞƒZ×夂pL‰t-å Ò‹¢þnˆ“˜pPSð¶–Ç^àm¬t¯y,ƒ¡%BÙ° ªü€RódRTÖG Ðû),’üX¢¿’,†± «—ï83M?­r°K@P‡´Vh*x  ›;%„ÓJœ%¯6 ÆúÍ[‰Y+h”Ñ.ˆÎž×Ç#¹Àʵ ¸£]§c7e(ûëé^qD8­ŽþÔŸùÖv@èí`©8õJ[êZÁLjö&kÄó–Kï㩚ŸY²ûàqxi‘¡þ :„E¸7•)šcnaªc‘øéÑôñ+B°€suž ÀŸ[Ë7¶õñ+ư`Š0y¥´ë.Øé & Ò–Kûmѱ¨»eiÊrè\£œø`ç×”>'˜ß-–³úœ°YÁ¹cæmn¡V¦‹ûÍÜ›ùgÇöî“¥À endstream endobj 374 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 375 0 R >> endobj 376 0 obj 1146 endobj 378 0 obj << /Length 379 0 R /Filter /FlateDecode >> stream xœÍWms›8þî_¡éL $úHâ#çØ)Æíå: ±±Ã¯˜ô¦ÿþV/€éÌez——A»ËÃîó¬Ä׉0üþ".wÐæ8ùª}6òD\íb.²=ËÅ>:"møÌG±°3KôH¯^­ŒGôiRL0šM>E[„-†þžà^pf5ùg®E\Ÿs®±:–íûâÄra°9¢wÑÑA—'¹ºF/áÿ½‰ˆØÎÿFûÉûdòîŠ!£d×R€ØÁfN=ä[ÄCàDrDŸ/V›Ç옞QZlÑeZ¥é9Cˇ?³Mu~ó%ד0ѯ+cIB9ðçY’U FqwÆ`\ão½ðO-¢|à±ï%¦ºÈú*&ê!“IS×Ñ$éPÆÍÏK&³÷3>^€Çò;Uñ<#÷]¢ýä”õª(ž=þ2¸G°¨ØÊcZå§Á_õ˜¡s^ìšI0_ÎÐI² vrr«I¨`&•9~˜Šü[xw?]Î×7‹ûõ*˜…½;˜cyáÜwÜ>–7°†CÞÑEÇPÍY¥Ó³3 {ÈÌÙê1­ 3-3Ãz:g[Ã|øn·qtÄw†^ð­a®чuhÆ.Ì`WË8Œf‹îý½œ¸rB1v oÈœlNŹ*Ó¼¨õnÖÒµ8wa±®åm7aÆ«ÞRs˱}XK† ÿWZ¦Ç¬Êʳ¨t–nÑÕz1M¢åJt/§áå:îWцöE1v(U‘ãð*ŒÃEs Àb•ÄA´H01ØH\ ŒÃ4‚í6€ÒƒHÅ–‹.ò.)”Ó‰UÈkkù{kÝž¶ÀóÖU•ù~Ÿ•ŠÊ•nºOÕUFé2íÚqK„çú)pÙ³€Æ¾£2Ûe%ªNýõ>lR¾à‡Ëu²—óð>X'¿.ãè@”ëþ2\Mãè6YðÀ^fcÁß6hÎâ`¨PÀè‚<œ “§Ì¿å‡lJKk´Væ¾L‹ ÒZ‘@S¢lžÊ2+*tÎÎg¤ä»ÛWÉ.‘Z°(#&P±×ŒA¥’þ Âí€*c™¾—J1€ëy5\Eã7I*$@A{ÔfC»$åÕýP ›RÏ4û£¶wÍp›ï Íäµ§Ù-µ©öJe¨ReÊŠl–Ê•·A5·íºV` Œl—²í$MHÙ…#Çv7i×A<–1©:?%|°Æp+z:§ûLð:ý–¢CZ쟄ãå^` a„ZAá¼>ÃÔøà¸ð1š‡³°OB&ƸGía‰‡¿‡Óu2H<˜ma í&m~˜Oêd>›Lb}9Iyª©ïÏ›ÁQ÷¢c˜Õ­}z×Ô–AŽ&B{„ÓžúVGP‡4muÈW;óâågtAŒŸfçÏÞú%zº|chAÜcÝÜ®B8,¦cÉu)|&8(à÷¡úþ¦QÊ”ˆD¯Ÿn^=Ðú+ñY endstream endobj 377 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 378 0 R >> endobj 379 0 obj 1225 endobj 381 0 obj << /Length 382 0 R /Filter /FlateDecode >> stream xœÍWÛrÛ6}×Wà1™q H oŠL+l$Ê–¨dÒLÆCKÍ–…¢ìª_ß% Š Iµ}Jëˈ»\g«ï#ŒLøý©üpA›dô]ù0r¢¶r1aǰMޤ Î8ŠËÀÎc¢iåUѵñ„>Ò‘‰¦£¯ß h‹Lƒ¡—‘Ù›¼žf5ºƒÅ™mP› !Vb`ÎË%¨aÃÃ&A$ ë¬ŠnЗ™ÿ9zÅä€ÈD£÷ÁèÝ CØDÁ®•Å5fa9ˆ”” ‰ A_߬6O2 (L·è:,‡ð Ñâá7¹)o¿¡à—‘¨íVsU‚"ð番:/˜evßhŠ;û[/ü[­}à1ƒ}•¯buÈê³|Ñ<²Š´úó"Ij*mðë#«Øû‘‹_>‡‚ÇàSq¸Æ}Wh?˜²Þ)–k_Þ „qƒ1b«÷²\¬Ïwïƒñû™{¿^§n½9meŽC…àÄ®yé.Ë“°ˆ²Á_5¶Òè'ÏýŒ²ZŸ¨x æår's™näE)ºYû“À[øÕ€Ûåbâ^¯—.ÚÊ]”F唇›B0@yõªÉ™A07MBÕYÙÅòYưttÇÚê%–3°f¶x’h«¯·6ò€KbY*_'Üù8÷C‰0lˆ'l˜ÃN¹X=ÿ‡À°Á9` ¶PÜ»µëO¸ÁŽe`Ó†XŽ14C›Õû3¸HI¯ jµ»Ùý;€Ãþ‚¤RðCµÍ¢CÞÂ[Œ ŒÞd;Í(h-˜øg ‹k®C§æ[͵“aqÌåáJóEé&>n£ô±ãk7ª-¯/O˜Î5˜'(YsÜï³¼:šLfÅ?„?œúŒQócN{™ýPF +"Šö,¼ùíÌ»~0.•|ïù7‹þHÐTpnZƒ:HÃD^¡M¸¢RRÖdhxŒA”plº(‘L£T¢C¶+^€%£¿¢€Ûƒò¨EZ¬·ãÉG(7}ÝP, ‹:ð®nƒ‚¨dS?—@Ά.åÑ4S{öáæ÷ðQI¦vuÓ¸:‚QëjÏš\Î@N­¥ÄRÃWSi#•R.Æè„BÓÐeè¢N(ƒ~Í.%eÛ:÷Ë`€x‡A5Á0-£¯Ö¦ZÂÖ†¢^Y„U.=ak×>Ì •­µ£›­¯›­jmÝгõŒæ¤™M¶ÖV7ýÔ|úè&[/‡w^Ñuñ,h"° uš ÜžÂÊûÕó§ý`J Ì2˜×q´cPiw&úLoþ%ǵ°ÑŸ´À"ÚF»êò-PS+ô“mäà ]Í,ƒYPî-Ì^ƒ¾‡»óÆ› d¯å؆cÃe-LµÕª?êlÅ¢ââ8Ø[\¡V6%%e™[Îë’§.ÐçH¾”-ˆL2~–ý»Œ 5 ª hºšºš,üU°{þ@~0‹BÚ1áX˜ô—Zá¸-ÊhîµÚ‚’KÍ®{“ÖÞ@ÿSäa”6iR»»iRûn—Þ|¼ü¢y>º_ôAk߃ ]÷M®7õ»Ct¬éV³€ÉÉÇ> P•º$h˜ûÑ| bÜ,[fÿ ä3Tþ¡Ñƒ´‚Šeq>¨‹}=G±„"þ7Ýgö’‚¼!£g ]TV)esÌ«d8d>ÐfÂw\òY8Jï 5«„ÕÇi[Ðì DØÐ—Þtê.Ýëûõíõ8(Å4[Ï›¡ê«Ú_ãßẠendstream endobj 380 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 381 0 R >> endobj 382 0 obj 1308 endobj 384 0 obj << /Length 385 0 R /Filter /FlateDecode >> stream xœÍW[oâ8~çWø±ó0۱䱅Ðɨ¥-„V£Ñ…`JV´Ih§ÿ~“ ®´š]• ûØçœÏß¹Ø<("ð÷Y™6CÁnð\Ê(22d)QKb¡*'–°ÐVol õ–rhäÒrw1Ù ‡A4 èrðã'lZ!‚zŽñÂÌlp΅Ć´lÛ.±2L-K»0°„A°C_ÜC£8ß}@¯ ‘ÿ}‘AÙÿAƒ oðe,%È[×)`Pl Ùæ&²°ÁôrÂÛ¡g³`£v~Šüh…F~æ/ýT¡›å_*ÈÒO?‘÷màxåqs[yB1ø˜8ϪւऽÒȸJ^KáŸc£3çÒKÛ2Èå·^8 ENZñ}’¤ÒTCù8d9{Òùéè˜H°ÕŠŠi7¸o'Ú¦¬EíûôaH'ÁÜh';? ãÁ'ˆ·û]”¢lãghã¿(´T*BûT­P!oê^^:S´Rë0 µRªÅÙ’r‚æ·£sÏAÁÖ‡ýC ÏÁ†É !B®Kc³ÎNÁ0§¦Æh–;ã'´U/j ÎZpµãw0­ÊŠI;.L޹¤¶ ^Z`Û«ùõd1Ÿ_:-[bA„mK³—¼BÅEys˜¨µJTLjxËxõ†âuß :®)µ°ÀžAÚô-¦7sÏ8' S)dÐ\(ï=žO†ž ÑÓ-ævz3tFó©sêï$B×µdX`æG$Ïœ»¹3žÄlq¸a!ÒêÇ|Ðo£ìaù#0‘ØdBçkÃôÎ/®Nad̦©ÏÆú“!WÎI½w‡%Ňà èF*à‘;Î.n§î½{å\:Ýzb&ÓW!Ô¤½Xs è) _­zT)zLü(LYŒâůŒ—oyÒûg:’®'›c›@ä,R"GÎ2t´ð¾ßöÀ3¨Ä6—„rþ›r×ú“G5Þ5kXØÖÏΨD{I11€P W{åÿªÏ+’¿õo˜˜À:³þßo0œLðg3ë#-¦ÛSž÷*yCê×S¢Ò4ï…Ð`ôB{×/ÜþT Û”6°¾ßZ8·1ÓÊeì'ôYê»ð¬9®šM%ÑRMêöSk—'­yU³¼’ªY^RÕ,ïUÕ,Œš6JcÕ´I]b}BYÓÔ%2ªMÌIÞ!G˜€Ü3­íïõ¸0³!«8ÿZßù‡‰óe o"~ô°p¿C¹jnǯoO*™Ý]¡á>ÍâºÕke¡çi"‡_Â69=4â‚jxÕëx»_Ãè±½h‹õÔOÛÓ'„ë0¨%Ð̪ñ®E×qšÕ³"â¥âF¥êc^9WÌVa¬mßjɲ1þ6ºÖ³ÃëþZe¾w#/å=;•mbíNZX¢³ÀßnÓjVV9Î!ã0Z…Ÿ©Æj­”îƒ ®f³xWëN]úŠ£ÌÏKê`µYù…¬¬ÔrCÃI™rc\ «œé;FÃFg ,/Ë«.a¦uDXy…iû³ ,ûÉ åçÂeIà /e‹ð2gßgžs½¸pfÞôæÁ9ϻδ«Êf¦a[ð†)TÇp‰Ç?ªìB¥Ù4~uWp¡#=ªäÐfô[.ÉŒáùð«ãNÆ7­_{z& endstream endobj 383 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 384 0 R >> endobj 385 0 obj 1259 endobj 387 0 obj << /Length 388 0 R /Filter /FlateDecode >> stream xœÍUÛn›@}ç+æ1‘ÚÍ^ ,ñ­rÇmMÒFITa¼¾D\³®›¿ï,àÄ€i_ª´2Ö.3³3gΜOŠ¿÷fq=al=•6.á”&Ûæ‡Jˆ¡|‘¶„ÈV¶&¤ÜŠÜZF/+øj%…Öí=Ívm$/ÒL­ÏXÜvˆp¤çy%VN˜”¦„ nÂÎF1‡~šGïÑ›DôŸ£?D$ÿQXZ]ß:ÚÀ(ø‹W FEš½Ž ’n¶¨ ?†Û“i¸RqAÌ¡è`d &³êìôüÖÀ/ÛÍså‚âø¸$WUÅawhÕs ¸û«ÿ" Z·±/ãŠÊ!—«qì·vNZ±¶’T¦:8\YÎÞ[oŸŽ+ÐBde*’p_ÚSÖ˜¢©ÝÞ ml”,ÒMèuš>AAú¨ÈT–¡-ƒuz¥`¾ßÝÉn…þm¦æ0{†úÝsó¶¹;}é¶™ÎO„ÛÍF%zŸ‰”@´.ö›©?÷Ï»ƒi#ÜæDJ)“â(tÄ©â¦üX«]è}¹3c¥³'K¥ý<°‘ßíÔòÂño>ä9µ#Ãß•ôŸ”eL¶Ô|ó[¨`ú.ÿLi½N–¤ PA¸­~ê‚¥æ,˜Sgw]'ͲÎWkóØ·Á×HÁi¿²èUßo6Íy¨¶‚x¼É3·ëœí‹M_ŽTsy®NéØnÞK¬ñFr£5ª‰5÷ňÿ/Üãk†{Žö5¢M.{“‹«ñe¿`Ní\[׈eÓK£mœT?*¿Òi endstream endobj 386 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 387 0 R >> endobj 388 0 obj 627 endobj 390 0 obj << /Length 391 0 R /Filter /FlateDecode >> stream xœÍÙrÛÈñ_1û W$x0¸]®­ÒA¯µå¬m‘›dËv¹@`(bƒƒÂ!šŸî9€@y•¤j_šîéékúøaa ¿/ðG1’‹…³IÀˆã+”ç;°|’‚( ôB’#áh‰$j鬢–ÀŽü}Q.(ùiñé ¥„Z9,茹d³Z|ážo9~E‘Ò•Yv¢Çòa‘äåmÁÈM%¨µöȈþϵ75rlö¡ê$î\Ü:ƒ?%®~´á¹t¼c„E°ð×µ‰ŒÅ<Ž[¹º õ7ôÒ–ÉŸOZ¢X‡§~&þ™Â)¹_\­/ßxĦd½²(pc…,Â_Œ¬ òé,d/¾õÏ‹åz ²Ëf·ˆ²©äGíÈ·I­ s³G†‰ˆŠ|Rj{Ò®ë]¼oyM<‹¬ù·–¬ãMÎi+zèå t'|\× ìØäc&1ü!«6.Ó¸NÉ·]ÍIµ%o›‡<ÝHæ/ߨ§‡¾åP&|JÆWÕ†|¨yÓVå9Yï8y»úøŽÜðGžWû‚—-ù©®º½djZJ+ð@EæG’Ó›š§d]uM“ý1'¡zÂE¡«ÌþáŽ?fMV•¯ˆQ‡ü0×Ãõ­ÐñàŒç*—WûcÝïZòH¼¢çŒžŒB4 8´|€” ø×€„u(í´L¼.²u5Yc÷u\¶#.meiÖ´u¶éZnRìF,Ò*éЕs7ÀþØ ‡¬ÝU:Ág`ÎqXç“q+u•¨®L!L5Ôîø°Ú‚0;E„w}sÕƒy–ð²áV¸LÓ åÅyÚ›“¨l38K «ž”;wF@'Î0£ðÁº|&‚Q‚»XnAîÉ+»ÊÿF'ëuU›XézÞîùho+ƒ,åkÉp{‚B:znrÈ&&ë+˜“Fî„ゆJ!}e³Wý µ)Õej\û°ðÙá$u¤.uá uTê¾äõcÆf­›µ8è†Vä@/}ß(uò,¬2 ‹ž7Ý~_Õ&ÅVx^C}$jÄ!n ¨‚ÒAæG™Êð¹©p“@Õ µBa2¸Ï=‡ÊvÄx[W…Ê{ØT¿ó¤ßó)øÄ¡¶£ÛãªÛ4ü¡ÓìíH«„«ß«¬ª# EàJ±W¬f¸ÊʤªÁ…qk!ŽË­j'šVd.á:U®"d[EÏ ²@ˆQ?ˮ؈G@2.x¹‹Ë„c5çs³61›7{ždâ²Ð®®m.©ÊGà « ö˜¤* °¯! âÈö˜•÷âÌ6Ö 'S±kôÑ~<‹E.¥¾£Ú÷-Úë¸x[q¿*»¶Ùñw¡cO\Xó-¯±&@EÙü¾ÎÚ#ÙðöÀyi&=Ö„¢áù#,!ÐEåÕ“ö‰Úàxðöp6 ÔäŒ;äªx´¬KT†ndÙâ%t~Žò`Ÿƒ ãȵ]wˆ[0]4<1šÃpðgÏ>ˆûÈàp÷Y)gTÚ|<ž¦ÜÀ¶Â~û!;ñn¬1`·bXh l󏯯ZJ™xKqšâ»nù5T?@ëxÕ?ÕaLqm;Àt0È"¼º¸¡‹__àÙJÁÌiC>ƒø-<®/lx»¡ƒpp¿ ®Q9¢L9óìßõúN&Ï{%õl:‘Ñ£ô‡³™ðž6‚·2¢B­ŒÑñ|…%;!†MäŒt6 "-2IÑ#3LÄs\ U"© ¥Õ™ÊÖÚ˜6½Ÿ©v¨ÌÔ; 5uNÿY)"³ü‹¼A¼H|ÑOà×õÝÚ° àõåÕ»%y-B¼Œ þ#ù|ö:òU”23DªýH>½ú˜¹ñåó‹ïdŸg{–펲OÏûV¨²Ìša·Ãz›ÕBéle™4²2h7ûtÀ–—†øÊ€Kc#6Ÿæ ·Z® 1r¼rÄ–ã–ænZª†¿S*è¾áRÕ³îÁØ•ÉHü”&z òµMzúgóœ²ä9‘åÓ ìÓe ÷m¹¯óÁ@É3xˆ0ÁÏÈ9¤w¼™ …—€Súxðö¢FÎ#‚ÏWH• ™6‘3ÒiØP…`DŠ™id"žã" ïkÍ uR%§²µ6æ…MïgªÝsÊÒÈ; 5uÎwÊ’çâãȧŒzv_–0ÁæÕhõþ×»k@=tÌ_1pã+¤Ð×j/¾ AqºY®®¿è:tbŠðÏ ¼,¢jŒX%Õ:9$â›øá#âéRE¨L™©Ï9Ÿó&ijŸ¢»4ÓR‹å°+EÃ43GÖ¨€P›oÈû_Þý&”[þõÃú·ùì3f9ŒF¡FßSfN§­Åq;6žFMG]bRòƒTq¯é F¶,QìpÄÏUžWÁfH]kFÒ]ׂj’PyÝžšÂØ ªµü°Q£;jþÐeµtÐ/ ¦¯ÅVeÒ2þäãâ_Ãóßµ endstream endobj 389 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 390 0 R >> endobj 391 0 obj 2284 endobj 168 0 obj << /Type /Action /S /GoTo /D [392 0 R /XYZ 72.0 720.0 null] >> endobj 171 0 obj << /Type /Action /S /GoTo /D [392 0 R /XYZ 72.0 651.324 null] >> endobj 174 0 obj << /Type /Action /S /GoTo /D [392 0 R /XYZ 72.0 386.592 null] >> endobj 393 0 obj << /Type /Action /S /GoTo /D [389 0 R /XYZ 72.0 720.0 null] >> endobj 394 0 obj << /Type /Annot /Subtype /Link /Rect [ 519.373 85.512 540.001 94.512 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 393 0 R /H /I >> endobj 396 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 73.512 101.16 82.512 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 393 0 R /H /I >> endobj 397 0 obj << /Length 398 0 R /Filter /FlateDecode >> stream xœÍZësÛÆÿ®¿ŽŒàý˜étF–ÙT¹J$6n&ÉdŽÀ‘D4šÖß½Û½TÜ/ix¼¿½ÇîííÞíøéÊw<øï­ø'ͧ8\}"žï¤&ÄŠÇOÝÄËœƒC ‹3§G¤èBd(¹ÔÁÞùxÕ\yÎwW?ÿ JÇscç|åÍ&Çiž®~áqâ†I–ç9é¸~– ¡›Qœoï󾕽•öb"﮽­QèÿyÎîêÝúêÛ¿ÆŽï9ë­q<Ãzð'ôÌ ƒ\ü œõÁùùÍÓ÷Î=kv'¶ãßüê¬ÿ~µZÓòäXé@üŸºÒ‹F qä[,Ó|Ã…¿‘"8nÃ:DSM›JÿŠEÆÒHøïE£ÐTÖàéIký‘Â/ïF»‚çf£}È-ã=ë¶Ùl…lçóü<ñŽV:~6Z ‰Ý0ÏÁÓüÔ¸×{60‡5¥³f›š÷¸PaŸãxN仞—À1Yæ®q¾qBŒð†RL¬èþ¥øáÚt«kÓVíšj[¬4¯ )Põ¦ïÐv¼4-FÚ 5·ô0½zþéÄ›‚kÆŽ7¼c0UïjÞzÏ;¾…Ù’ÃÞ ÙV]?Xjðã’EÇÙP5;£šÒ2^NŒ'–ºa½•únJËE²äÛªÁù*­VŒW¬»UFE[Ÿ\+2ÖÖ,¸KH÷LÂ:3O:Ûn0B`Áº—‰×Ÿ÷U±7JuFw>ÏÌ>I ö‰ó|ÿðxóø“aé­SÝ-ºizöYº;AÜc5ëk\ÛÔ/¡±•8¹ßjXµåCu°8íöBמ÷}Õ6®µ»¹haè~y&ΤXF˜íµ/‚ddEiÌñ¹ê+AÊUm»öàÍH! Ù zz°ÎÐ:ÇöxªÙ#w.B. a§ã”6úo/à&ÂñµçÖ€Û;°ãä¸O S¦ µp5D1)ކ <7qÞ(¿É§~#Ò‹Nß,]Ìi\Àƒð9ÍC'Gz°;£ójHG‘<‰Eñ‹@"åÚš±g½5°( ÝÕ¾¦ƒµšw§á«%öœ["ªÁí¹™AàysíñEОŽgu:ƒ×@L /„­hÜð]ÕÈ‹z«“f.$Ý8ƒû ‹#;ÒO\#¯EZ…p¸§ùÂ÷·Ò‘ü(З#̓Ž!>Ü"óù´>id¨ ‰g:ÒLS:ꚨC|7,Me¢1EÉÿÛ9Ü]¢Øˆ ‚›/æýêöþæqeÌsÉZëw/ã‰Qàùn¤ÂN’*Ž$E ä¨{Oºõ$wNaf+OêYÃeøN;™XãT’•…›(I•e˜^Í’dÊì.®qîíQ:1dÅ-NÉ‹š‰Ì·jd¼ª²·ãÖaÎб¦g…\£ð†B¾h‡j©¨ FÓe!ÄR8¥?ÏÒe~Üs±œ(29ÒÆJˆQŠ<àæ­ìÒðHbúOc¬”’8*;¢Î5i͈7f8 ;ÕÒ¡q·]ÔKy—eÜ‹V©|³Ÿ›* Ʀªš¢>• ìÃ?œÛ‡îÖÎ÷«§Õã+çñáãÓµ0?n™¶‡XÏ3?p6B£½‚óæ9Ö¬àó= áJEÐ&qnƒqæúΛ®=÷HWDÒ6-q”i¢i‘Ö¥Õlš?´ÖCZ6G†´9‰²¼|%¹ëÅpPç^¸°È}ÿ©.7nÇ{òÛ}ù uùM¬øâ'ÿk“j­~1äÓj=·9\"ã‘O«§§;Øi¸“L”w°Õÿ¼_üaõáó|j0èÏ µAE{j†¿üË7†¦»Á†Ëp$ÔyÕ2/¯ Ï”ˆéN 4—j Û´Ÿ¹5ÑÞ=—ÈÜ.A>±‹p#rˆ£²êŸ_«»BaòÔÏóÔ£ï{S´ýnåf°¹"çMÂi6/Š _jnÊV⨲F‚'Sægœæ!jI[U¥æQÍ®`ºcZOÃdz>R§ãö`YyhÉ^Û•Xö«í…µœÙ˨e¾[cí%ßVàZÃs8I`%bÉ}Ue}{sû·Õ{‚ø<´ú×úbQAMìƒOd±Oùàup@Qo?X ÄÇšö†¦CÅ´QRãó‚ †ù(], ”)‰FâˆÅ;qe´%¤k†Ñà i‚5ýlÌž×f.pŠªãµYfeÄÓjn)¨{Ç–"wñeÚŠ=kvÜ`Êü‘&m öCw*†Sgõn­f»\GNeÑçòÅH@ vÑܪ)ù£}5¯;c?œ,ŸRqãRÆ$:÷µÆ`ÿöŒ©$2¤/hdJm„â]]s{²d´°î\õöØgNGÃo5ÙóϼcµÆûSSRùNÚ’1ÛÉR\o©ÃÜ8A<1+?³f`r¾zñÍcÅŸl¬…ûê‰G¯^×®þ(®|‘êí W<«ñ5F¹¯£Õ'#Ȫ½Â'ù:…õ1ê—ô«%?rHЏh>-¦SCD¹'=+³>Ð -¿H‰ µU½mÄ…ÑZiÂ&3ë“Ò̰û§BZ™õ­ i¨néDEü¾54}Cpêù¡‹¥÷K{êÆ6˜Û1Ê'v„RXŒI=µ.AAÒφê3¦þ’Ó Ü\…äWqI1CuU¨÷HÉRG’œ ÅÓ^O¦€YÎW.P¡-AÛÐ}.•^På=^ R@«(²¬dî5IEÙõÜXÉôd¦ÜáЖøIV¾ïËÅ\ªc،Ї|0òuKš"ÊdùaÒ)‰IEÌ·O?ðË›[qXƇZç]’õ#«O^‡2Ñâ´1°äuu¨FÕhfvªMjYúª\Q‚°°0•îXÙ"U„"ü©=—çÜŽy2±#¾a9é'˜ÄZ€ÔˆE6$$ÖtmáþD_h²Þ]žG{ñ×ÖAÛVõ·Cdµv;äR»Ž®/ÉV "i©M¬æÚ^ÐSù™šF~=›ÿ&ÁË&v½©!v ¡•ø´+MÒÒH›m@l5áw1…ȇà"É ·»Ôx!¤V退ò c¦¥û,˜š4·š«1Ù„Fê{25… Ûn«¢Â71äTs—Lob:“~‡¡eºaÀ- ñ%Kw‘§»êW‚V W¨_ëBó<&IŠÏÐü¢åàùê"]ž‚r3WáµiZ[³ëO¿SQÆq)|f/óL/ ƒ‰½6ô!«‘^üZJ}tÈGdš*«í–w¸3È!¿B ¯C$.J†i²ô/îöFFÇ­±¼\Ö¯K¤eÖ3U\Œ’í¨“VòUµ%Bf 4ÈÒrbÄ(JÝ0  \É¢{^–»Iêåò×®óab·ç»Í..ëýÚúÊáBù$ž;â…!δwîú¯ô.öì‡;ú)è%g˜ endstream endobj 395 0 obj [ 394 0 R 396 0 R ] endobj 392 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 395 0 R /Contents 397 0 R >> endobj 398 0 obj 3262 endobj 400 0 obj << /Length 401 0 R /Filter /FlateDecode >> stream xœÍYÝsܶ¿¿“ôAž‘hüN&²"7n]'–NÎtry€x¸#jy&y:iÆ|@‚R®}H«|»Xì.~ ì.¨/‹ùðÏÿ•æ»ÅÅ PŠQ˜(Vœ  õ?C;¤ˆ,ÎPÅGC.¢†¡à*iI”è×E½ðÑ_¿ýBkä{1:.|G¹Ts»øÆãÄ “,Ïså+ö‚,ã&B/A±C¯ßí0ú±Òƒ÷\‘ÿ?÷Þö( ðÿG>Ú.Þ,¯ßÆ(ðÑrcŽ@àg^ø¾ƒe^ˆsþƒÑr‡~;[ÒÇ-É}E»W¿£åß×Kµ=¹– ÿ¦ž8E£‰8òÇ3Ö Ó|Ã…ÿ"/”<àx8†}ð©JUýæÃ0 ÉßÏ‚¢TY‹§!hý™ÆŸFÇËFAÈB ûñÁú“!s¢Èm¿t´œ…=¹-ƒ±#sýȺžÕ[Ô·¤îHѳ¦îi)*šÝŽõ=]#Ò£¾dÚ7¬î§:Á.ν8ŽáT‡TÎv„®À•Ý9z….p‚‘3VÕaÍ=2¼MÓR¶­-ÎgúÔYdK7´¥u1^&œ¶H~µlS|—¶Ê}?ò£4<‹ón4=Ò\Ò‘3ÝöÆîYÅú'k¢ÙŒ×¸ EÁ$²Þ±šqœú¦E}ƒhÝÀmXÍZ>Òm Ff‚VÒ✥™J/ÒÉ ötVÓ£!ºæÐÖä†U%wª$ R×p"4ƒÔÁê5}¤–¸X÷Võ†<–´¶–öóI×Aàm‹€Û[áõ }ÙÛ‚¶RqŽí=<â5á—À°š‹nMÐýðóV`Ÿ/øp÷þý¹¦î>¼ûxw­Iã0üåæÝ?.oþ©é¿_›qan‡æI8Õ<9lËÞL‰8ȱDEñ~;ZQf)¼oZ¸àžfüÔémóêæ¹dɸ‘Èvš;[7=*JZ|’\¶£.‚å ÒR›ÞIu*ùaTÇûõ[HØÉ(ëAr„%L §ey¢Bq¨*ô‰T8ЬFWMuØANµN…É£¼éI¼ˆ'Iœ¨½­0Ž]\¹ëÝ.ü†Ñj-èac"ƒvˆ Á%쨘RRp äu†ÿCd±’'1Àä_‡®GÝž°{Ú)Ü Ý‘ºé­—bèCâÈ Ë3®;r w”Š@Á g £Éc’E3ßOâ\'û ÛZqµ^ÀûÐwù‘…©L[IîåèlM7ä ’ˆ¤†šÒÀhŽ8êrHôˆ×5C­ÎÎW¯F¤Š’åýÓžš-CépQËÓ jVUÁÜÕ¨NTØn»^¥xÀ…†ÍâX7³#…ær=£Áêùµ&bù`´$Ã螊Ðò!4L†Gèëu{¶wëKèçPVg_W¯÷ç¡ãÝW°§-kÖhuæÁT_ªŽnMzÂ;U>æï/^‚j›#ᮚæ3ªØç“êQÍ{…~Ì×#>åü -–L·–‘ýFô ˜ËG¹cC±ÆE`Ο{t×Y:øŒpÄ8Ý!U3xbgä“™Põa$Êq<²§@òq®L«Š5*U3ÞØ›ÆgêÝ)k„ŽbMÁy¡f…8ó`5<‡ÒÄÔ¬·âÞËûÊù×[y Ç[–¬µ/°0ö½0ÏüÀçÔë@fÖ<ô2¸Ø¤Ðß\$G4…jL!M½¡ž¶­ÕÄ–}„w칡E/Ôa§xÉ:–¬( YØúÄ{@Lþ®‡d½f÷É‘µAKKɶjîgýñ o9ÓÃSy¡ÝH_À“6Ó¯ÃèÊæØ(CHåX?"†¹Ò"ÌëmÐjcè*-æI×P"·žÚô!ÿj™”-å]àÒhœzÆôüKâ¤d%Ð~€ŸIÖ0Èy% Ke£C^~›>%|˜96k’güÉ3/…»Ÿ ½:gàãt‡†Ä<5ƒ'vF>™‰!=Ú¢Ç#›q D eÊ„±ªXãdízclŸ©w'%kÅš‚óR²Îá09ÿCTô>0¾è~ð^zeDA¯Î.Jªt«‡©ºNvÑlkÖQÙ™ä3dXV¯Y!>o‰È|íún°™"ØõÄfx~Œ}@L]Î?T÷Ò Gæ<®i¬´­VݱINˆ’I.W4U3ýd ZùG1ua¢µ~á_ÝfÔ:¢@TÑ‹9yÅ~<)½à/ÿpèjvE… ‚ÄÝ’bîc8ªqâûq¦•“}ÓÍèv$¹\ß6û™:G©—qä‚H£1ÅŒëtÄjz¬ ?G讓Ÿ%¡ÎRh)H]”áÕï’Ñ_xCÝÒí¡"üSξ¥ðìjên&³Çp™l槃+S¸+ŽXAÚ–¨w-í­ñ8‡v…ƒmE¼ŸQìˆÁås”%ÿÛPâ‡>Ö^®V®6W»Št¥«ú»r¼Û÷ð3£Ö%讆£¾¶2ß:ýÚˆ5Ð;RþžýoåèË— endstream endobj 399 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 400 0 R >> endobj 401 0 obj 2404 endobj 403 0 obj << /Type /Action /S /GoTo /D [266 0 R /XYZ 72.0 720.0 null] >> endobj 404 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 709.5 300.013 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 403 0 R /H /I >> endobj 406 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.563 709.5 539.677 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 403 0 R /H /I >> endobj 407 0 obj << /Type /Action /S /GoTo /D [266 0 R /XYZ 72.0 589.542 null] >> endobj 408 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 697.5 219.569 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 407 0 R /H /I >> endobj 409 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.412 697.5 539.785 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 407 0 R /H /I >> endobj 410 0 obj << /Type /Action /S /GoTo /D [266 0 R /XYZ 72.0 299.826 null] >> endobj 411 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 685.5 271.029 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 410 0 R /H /I >> endobj 412 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.469 685.5 539.676 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 410 0 R /H /I >> endobj 413 0 obj << /Type /Action /S /GoTo /D [266 0 R /XYZ 72.0 214.454 null] >> endobj 414 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 673.5 149.45 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 413 0 R /H /I >> endobj 415 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.343 673.5 539.941 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 413 0 R /H /I >> endobj 416 0 obj << /Type /Action /S /GoTo /D [269 0 R /XYZ 72.0 428.532 null] >> endobj 417 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 661.5 253.671 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 416 0 R /H /I >> endobj 418 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.521 661.5 539.784 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 416 0 R /H /I >> endobj 419 0 obj << /Type /Action /S /GoTo /D [272 0 R /XYZ 72.0 626.4 null] >> endobj 420 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 649.5 243.192 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 419 0 R /H /I >> endobj 421 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.488 649.5 539.785 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 419 0 R /H /I >> endobj 422 0 obj << /Type /Action /S /GoTo /D [272 0 R /XYZ 72.0 427.2 null] >> endobj 423 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 637.5 247.064 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 422 0 R /H /I >> endobj 424 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.495 637.5 539.779 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 422 0 R /H /I >> endobj 425 0 obj << /Type /Action /S /GoTo /D [272 0 R /XYZ 72.0 211.2 null] >> endobj 426 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 625.5 192.35 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 425 0 R /H /I >> endobj 427 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.427 625.5 539.887 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 425 0 R /H /I >> endobj 428 0 obj << /Type /Action /S /GoTo /D [272 0 R /XYZ 72.0 124.8 null] >> endobj 429 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 613.5 275.275 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 428 0 R /H /I >> endobj 430 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.59 613.5 539.743 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 428 0 R /H /I >> endobj 431 0 obj << /Type /Action /S /GoTo /D [293 0 R /XYZ 72.0 720.0 null] >> endobj 432 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 601.5 209.909 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 431 0 R /H /I >> endobj 433 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.454 601.5 539.758 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 431 0 R /H /I >> endobj 434 0 obj << /Type /Action /S /GoTo /D [293 0 R /XYZ 72.0 574.464 null] >> endobj 435 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 589.5 135.43 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 434 0 R /H /I >> endobj 436 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.37 589.5 539.947 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 434 0 R /H /I >> endobj 437 0 obj << /Type /Action /S /GoTo /D [293 0 R /XYZ 72.0 411.984 null] >> endobj 438 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 577.5 218.18 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 437 0 R /H /I >> endobj 439 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.466 577.5 539.792 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 437 0 R /H /I >> endobj 441 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 565.5 213.416 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 440 0 R /H /I >> endobj 442 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.445 565.5 539.838 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 440 0 R /H /I >> endobj 444 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 553.5 179.043 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 443 0 R /H /I >> endobj 445 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.386 553.5 539.889 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 443 0 R /H /I >> endobj 447 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 541.5 161.12 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 446 0 R /H /I >> endobj 448 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.382 541.5 539.943 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 446 0 R /H /I >> endobj 450 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 529.5 179.611 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 449 0 R /H /I >> endobj 451 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.386 529.5 539.887 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 449 0 R /H /I >> endobj 453 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 517.5 156.11 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 452 0 R /H /I >> endobj 454 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.366 517.5 539.943 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 452 0 R /H /I >> endobj 456 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 505.5 198.421 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 455 0 R /H /I >> endobj 457 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.448 505.5 539.889 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 455 0 R /H /I >> endobj 458 0 obj << /Type /Action /S /GoTo /D [299 0 R /XYZ 72.0 169.153 null] >> endobj 459 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 493.5 146.66 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 458 0 R /H /I >> endobj 460 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.334 493.5 539.941 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 458 0 R /H /I >> endobj 462 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 481.5 145.55 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 461 0 R /H /I >> endobj 463 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.332 481.5 539.943 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 461 0 R /H /I >> endobj 465 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 469.5 165.56 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 464 0 R /H /I >> endobj 466 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.394 469.5 539.94 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 464 0 R /H /I >> endobj 468 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 457.5 162.22 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 467 0 R /H /I >> endobj 469 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.384 457.5 539.941 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 467 0 R /H /I >> endobj 471 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 445.5 153.88 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 470 0 R /H /I >> endobj 472 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.358 445.5 539.942 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 470 0 R /H /I >> endobj 474 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 433.5 155.56 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 473 0 R /H /I >> endobj 475 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.362 433.5 539.94 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 473 0 R /H /I >> endobj 477 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 421.5 151.1 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 476 0 R /H /I >> endobj 478 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.349 421.5 539.942 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 476 0 R /H /I >> endobj 480 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 409.5 307.925 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 479 0 R /H /I >> endobj 481 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.643 409.5 539.698 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 479 0 R /H /I >> endobj 483 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 397.5 262.486 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 482 0 R /H /I >> endobj 484 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.55 397.5 539.785 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 482 0 R /H /I >> endobj 485 0 obj << /Type /Action /S /GoTo /D [305 0 R /XYZ 72.0 720.0 null] >> endobj 486 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 385.5 195.111 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 485 0 R /H /I >> endobj 487 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.435 385.5 539.886 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 485 0 R /H /I >> endobj 488 0 obj << /Type /Action /S /GoTo /D [305 0 R /XYZ 72.0 535.998 null] >> endobj 489 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 373.5 206.196 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 488 0 R /H /I >> endobj 490 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.473 373.5 539.889 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 488 0 R /H /I >> endobj 491 0 obj << /Type /Action /S /GoTo /D [305 0 R /XYZ 72.0 303.996 null] >> endobj 492 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 361.5 189.569 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 491 0 R /H /I >> endobj 493 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.418 361.5 539.887 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 491 0 R /H /I >> endobj 494 0 obj << /Type /Action /S /GoTo /D [308 0 R /XYZ 72.0 331.935 null] >> endobj 495 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 349.5 180.708 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 494 0 R /H /I >> endobj 496 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.393 349.5 539.891 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 494 0 R /H /I >> endobj 497 0 obj << /Type /Action /S /GoTo /D [326 0 R /XYZ 72.0 696.0 null] >> endobj 498 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 337.5 200.095 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 497 0 R /H /I >> endobj 499 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.451 337.5 539.886 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 497 0 R /H /I >> endobj 500 0 obj << /Type /Action /S /GoTo /D [338 0 R /XYZ 72.0 201.47 null] >> endobj 501 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 325.5 254.215 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 500 0 R /H /I >> endobj 502 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.518 325.5 539.779 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 500 0 R /H /I >> endobj 503 0 obj << /Type /Action /S /GoTo /D [341 0 R /XYZ 72.0 324.85 null] >> endobj 504 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 313.5 264.674 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 503 0 R /H /I >> endobj 505 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.556 313.5 539.784 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 503 0 R /H /I >> endobj 506 0 obj << /Type /Action /S /GoTo /D [344 0 R /XYZ 72.0 101.472 null] >> endobj 507 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 301.5 187.905 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 506 0 R /H /I >> endobj 508 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.415 301.5 539.89 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 506 0 R /H /I >> endobj 509 0 obj << /Type /Action /S /GoTo /D [350 0 R /XYZ 72.0 548.514 null] >> endobj 510 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 289.5 189.579 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 509 0 R /H /I >> endobj 511 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.418 289.5 539.887 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 509 0 R /H /I >> endobj 513 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 277.5 196.208 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 512 0 R /H /I >> endobj 514 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.441 277.5 539.889 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 512 0 R /H /I >> endobj 515 0 obj << /Type /Action /S /GoTo /D [356 0 R /XYZ 72.0 540.0 null] >> endobj 516 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 265.5 226.134 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 515 0 R /H /I >> endobj 517 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.485 265.5 539.837 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 515 0 R /H /I >> endobj 518 0 obj << /Type /Action /S /GoTo /D [356 0 R /XYZ 72.0 122.4 null] >> endobj 519 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 253.5 245.4 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 518 0 R /H /I >> endobj 520 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.495 253.5 539.785 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 518 0 R /H /I >> endobj 521 0 obj << /Type /Action /S /GoTo /D [365 0 R /XYZ 72.0 216.0 null] >> endobj 522 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 241.5 197.757 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 521 0 R /H /I >> endobj 523 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.458 241.5 539.846 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 521 0 R /H /I >> endobj 524 0 obj << /Type /Action /S /GoTo /D [368 0 R /XYZ 72.0 696.0 null] >> endobj 525 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 229.5 328.151 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 524 0 R /H /I >> endobj 526 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.654 229.5 539.678 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 524 0 R /H /I >> endobj 527 0 obj << /Type /Action /S /GoTo /D [368 0 R /XYZ 72.0 579.535 null] >> endobj 528 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 217.5 274.579 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 527 0 R /H /I >> endobj 529 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.588 217.5 539.784 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 527 0 R /H /I >> endobj 530 0 obj << /Type /Action /S /GoTo /D [368 0 R /XYZ 72.0 470.776 null] >> endobj 531 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 205.5 220.629 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 530 0 R /H /I >> endobj 532 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.465 205.5 539.834 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 530 0 R /H /I >> endobj 533 0 obj << /Type /Action /S /GoTo /D [368 0 R /XYZ 72.0 350.017 null] >> endobj 534 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 193.5 195.101 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 533 0 R /H /I >> endobj 535 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.435 193.5 539.886 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 533 0 R /H /I >> endobj 536 0 obj << /Type /Action /S /GoTo /D [371 0 R /XYZ 72.0 720.0 null] >> endobj 537 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 181.5 213.982 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 536 0 R /H /I >> endobj 538 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.446 181.5 539.837 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 536 0 R /H /I >> endobj 539 0 obj << /Type /Action /S /GoTo /D [371 0 R /XYZ 72.0 514.92 null] >> endobj 540 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 169.5 202.308 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 539 0 R /H /I >> endobj 541 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.459 169.5 539.887 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 539 0 R /H /I >> endobj 542 0 obj << /Type /Action /S /GoTo /D [371 0 R /XYZ 72.0 439.8 null] >> endobj 543 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 157.5 215.037 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 542 0 R /H /I >> endobj 544 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.499 157.5 539.886 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 542 0 R /H /I >> endobj 545 0 obj << /Type /Action /S /GoTo /D [371 0 R /XYZ 72.0 376.68 null] >> endobj 546 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 145.5 206.818 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 545 0 R /H /I >> endobj 547 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.423 145.5 539.837 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 545 0 R /H /I >> endobj 548 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 133.5 131.548 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 393 0 R /H /I >> endobj 549 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.326 133.5 539.855 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 393 0 R /H /I >> endobj 550 0 obj << /Type /Action /S /GoTo /D [389 0 R /XYZ 72.0 521.719 null] >> endobj 551 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 121.5 135.43 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 550 0 R /H /I >> endobj 552 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.37 121.5 539.947 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 550 0 R /H /I >> endobj 553 0 obj << /Type /Action /S /GoTo /D [389 0 R /XYZ 72.0 328.314 null] >> endobj 554 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 109.5 178.327 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 553 0 R /H /I >> endobj 555 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.449 109.5 539.896 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 553 0 R /H /I >> endobj 556 0 obj << /Type /Action /S /GoTo /D [389 0 R /XYZ 72.0 296.353 null] >> endobj 557 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 97.5 202.953 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 556 0 R /H /I >> endobj 558 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.41 97.5 539.836 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 556 0 R /H /I >> endobj 559 0 obj << /Type /Action /S /GoTo /D [389 0 R /XYZ 72.0 168.292 null] >> endobj 560 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 85.5 221.722 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 559 0 R /H /I >> endobj 561 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.47 85.5 539.836 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 559 0 R /H /I >> endobj 562 0 obj << /Type /Action /S /GoTo /D [399 0 R /XYZ 72.0 629.55 null] >> endobj 563 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 73.5 281.809 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 562 0 R /H /I >> endobj 564 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.455 73.5 539.628 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 562 0 R /H /I >> endobj 565 0 obj << /Length 566 0 R /Filter /FlateDecode >> stream xœÍÝ]—\Ç•˜é{ý \ÒkÓ'"v|]öPm[³º¥n‘£¹ðòD–Dx@ ‚-÷¿Ÿ³³@P™d㙠Ϩ?„ÞÈ*Ô 2wñ/¿*/Žóþcþ×ÜõÅ7¯õ/~®¼˜õE~ªe^Ʊ^¼~ñáÕ׋ï3ü䇙|øa»þì‡úñï^ü_¿zó«ãÅùÕûïgôí‹ãÒ_üõWÇ̓?>ÌW¿úçó÷qicí½?|¬õRÖÊwÑ.ãüÁ7¯_ü§ß¼®/~ýöZÿôÑçÿŸôD­Ôÿ|DÇ‹?ÿêÿúWÿé?÷åxñõŸžþŒv™;ÿSãź´úøã_¿~ñß¾ø¯ÿö—‡w_ýó?¼ø?xx÷â¿üøêÛ‡ÿðß_|ýüêï¿þð»¼>ÄõÏQ=ÿw^®˜>ù…ǧ¿òÑ´¿ýüÓÏžÿ—öøsçÏ\j?;ùKß°ýðßù ?ý°_?Wÿý³Ÿ›õÑâçR×OÚÿÊwþó(3.¥çÆùa—õ‰Ê«ýáÓ?hÿ‹?w7œù¾þwëæOØ×}ûâ?¼øc\Æ‹/þé»—?<<½ùo¿ù¿_½ùóÓOüõÕûïžÞúêÍË¿üðÝÛ÷O?ó›Þ~ÿòý«·o??{¿µ®ËQÚùéŒ}ó<-¾ª•K™û\µº¬: ¢G©õfÕå&žÇ!q“xH¼!îUâ.ñ‚x‰EpˆàÁ)‚S§.\"¸Dp‹àÁ ‚ç¿!ƒ`;@° x~][ÁVA°UlU›6l"ØD0D0D0D°‹`Á.‚C‡"8EpŠàÁ%‚K—nÜ"¸Epƒ` Æ‚Q@0 FÁ¨ £‚`Tl"ØD°‰`ˆ`ˆ`ˆ`þc¾çq´2?ÿÕMœÿª÷Q÷ZõöµÜ/¬š—YÏWRm—›U­=¯×‹üÓõI”/óáw͇ÿòí›÷oò…ÞÓϽúèÇõŸþáÙc–óSÓG¾–«qûèO+Ÿ/ëÇeïØ»Ÿ¯­eY\¢ž¯ßûùZùfÙs‰r~v >¿úIݨTo©Ï¯€Rwª—ÔçA©Ér‘å&ËM–›,·XÖC,ë!–õËZIJ±¬E,kËZŲV±¬•,Y6²lddddÙɲ“eOËc_¿³ñõ–zTª;ÕKêY¨ª§Ôë ºQM–‹,7Yn²ÜbÙ±l‡X¶C,[ËVIJ±lE,[ËVŲU²ldÙȲ‘eeeee'ËN–,Y²d9Ér’å$ËI–‹,Y.²Üd¹Ér‹eb‡XÆ!–qˆe±Œ"–QÄò|.HµXF%ËF–,Y6² ² ²Ì‘Îêç¯Gƒ‘N¾¢”½¦­š—ÕÖQê¼]uoð•#ʼN¡¬ö4øú!öËþiÊõøã¼.çooüþíï_½yø(}ùæÛ§7¾~÷êÏ~x÷×ýGæÆ·ïûiù×ÿuͽ£ÝùaY¿ô{ÏcÞ.»7€ºªƒê)õ -u£zP½¥> ©É²‘eeee'ËN–,;Y²d9Èr’å$ËI–‹,Y.²\d¹Ér“åËH-–9€ºˆe¤Ë@]Å2R“e#ËF–,ƒ,ƒ,ƒ,ƒ,;Yv²ìd9Èrå ËI–“,'YN²\d¹Èr‘å&ËM–[,s µXæ @j±ÌA€Ôb™ƒ¨«Xæ @j²ldÙȲ‘e#Ë Ë Ë^.õ8_Ž—×¾×A@Þ—%hY^s¾dgz³ìÞ( ¯üù$úÇ?|ùå³,¿çoaì~ÛçÇRÎ?ÞåæƒYåRŽó·ž÷~ɲ¸Ì^ö^ûvÕóÏßîÚí€v~[Ž*q—xA\ŠÄ€W è• |¥‚_©Xª6l"ØD0D0D0D°‹`Á.‚]‡"8EpŠàÁ%‚K—.Ü"¸Epƒ`=@° X¬kÁZ@°¬kÁ¼aóóã&‚M›††††vì"ØSðüËe|F= ÕAõ”zT7ªÕ[êU©îT“å&ËM–[,Ï_¤Z,óvM©Å2oØ”Z,ó–M¨«XæM›R“e#ËF–,YYYYv²ìdÙÉrå ËA–ƒ,'YN²œd¹Èr‘å"ËM–›,7Yn±ŒC,ãË8Ä2ŠXFË(bU,£ŠeT±ŒJ–,Y6² ² ²ìÇeìóµmnêSÛ¸Þˆ_÷šÇ÷òKëæeï¶×:âvݽ‰uîØõIôåwoßþðaŸó_¬ñâ‹÷ß=<½ñõ»—o~xùÍO÷q>þä?¾ýöáû›¹ÂùKóÃ67ïåiíͲ¸œŸ®·oÒ²uiG=ïsÞ.»6ªƒê uͽI nTª·Ô¹? Ôj±¬U,kËZɲ‘e#ËF–,ƒ,ƒ,ƒ,;Yv²ÌíJŽ3ÙGûŒ:÷+ºQ=¨ÞRçž%Pwª—Ô¹m ÔA5Yn²Üd¹Ér‹e;IJbÙ±lE,[ËVIJU±lU,[ËVɲ‘e#ËF–A–A–A–,;Yv²ìd9Èrå ËI–“,'Y.²\d¹Èr‘å&ËM–[,ãË8Ä2±Œ"–QÄò|ÕLµXF˨b•,Y6²lddddy½t/Î×öýγõŸ}aݼ*/ùǦeyß<Ž>êí²·ƒü‡÷“è«o¾{xýòúúßîÌËþúåû—ü°éq¾ýåw/ßüùáùàü§¹ìóå}iqûØ?-½Y”—“ž‹ftXtþVw~‹·îÛE7ã‰ój©Õƒê-õùµÔêu^|"uP-–yý‰Ôb™W H-–y ŠÔb™W¡@ÝȲ‘e#Ë Ë Ë Ë ËN–,;Y²d9Èr’å$ËI–“,Y.²\d¹Ér“åËó©˼Ej±ÌëQ¤˼ê*–y=ŠÔdÙȲ‘e#ËF–A–A–A–,;Yv²d9Èrå ËI–“,'Y.²\d¹Èr“å&ËM–[,óz©Å2¯Gºˆe^"µXæõ(R‹e^"5Y6²ldÙÈ2È2È2Èòü×¾´u\`úÜqÄõ^Ëu.]=í¹t³¦õÛiMŽ›?Ö¼zýã÷ï_¾yxûãu?¥Õr*ôwß|óðÃGo¿ûôã¯_þñû‡›Í•Îpqþ3ÐÛ¸}'O‹o–tnÕ¶¬Ê+Û‡m­n–ÝÎK‚ê)u^u£zP½¡ÎM­¤îT/©‹Xæ^VR‹eîe%µXæ^VR“e#ËF–,ƒ,ƒ,ƒ,;Yv²ìdÙÉrå ËA–“,'YN²\d¹Èr‘å"ËM–›,·Xæ^VR‹eîeuËÜËJj±Ì½¬ ®b™{YIM–,Y6² ² ² ² ²ìdÙɲ“å ËA–ƒ,'YN²œd9Ér‘å"ËE–›,7Yn±Ì½¬¤ËÜËJj±Ì½¬¤ËÜË ê*–¹—•ÔdÙȲ‘e#ËF–A–A–9]ékïÑïÌ3~vhp¯üt¼™,Ë Ë±wývÙ½Ë~¾áÕ^=üõÃA%/V{ñÅW?üðêí››!Êõ Á½÷Šyû0­¿Y×.kÔܬ`غyióü¼ïè·ën& y›ÆÇ1;¿ÉÛºQ=¨ÞRçmPwª—Ôy›ÔAõ”zå ËA–ƒ,'YN²œd¹Èr‘å"ËM–›,7Yn±Ì¤Ôb™3H¨‹Xæ Rj±Ì¤Ôb™3H©É²‘e#ËF–A–A–A–,;Yv²ìd9Èrå ËI–“,'Y.²\d¹Èr‘å&ËM–[,s)µXæ ê"–9ƒ”Z,s uËœAJM–,Y6² ² ² ² ²ìdÙɲ“å ËA–ƒ,'YN²œd9Ér‘å"ËE–›,7Yn±Ì¤Ôb™3H©Å2gR‹eÎ ¡®b™3H©É’æ>AsŸ ¹OÐÜ'hî4÷¹¬WÎ?幟>LÜ®CÈ:Ïvß™¸ýÒºyÙç»;Î,·ën¦5^”ãù.F†Ž×]ûK}:4ïúƳý‰òË·oÞ¿{ûýÓO|õþåû‡×oÞ?]æ;çðë…\·ïúén–K̼ÝÐVí˘ûl×½u·/Á«åÝòEy-–‡å“òó¯6åÍòa¹©†©†©†©vSí¦ÚSuíÕÇçÔã ºQ=¨ÞRÏJu§zI}Ý‚íóë š,7Yn²Üd¹Å2·à‘Z,s ¨‹XæI^H5÷|¢œTs×'ÊI5÷}¢ÜT›©6Sm¦¦j³¥°ÙÒõÅ<`g¬{ùÏN¼®Wõ8ÊÛºyYGœÞ¸7™‹zóbçE©Ïw‹úÝ¿>¼û×W}Öž_"»£•;‹OT«—yó1¯ŽžÇ‘U[—/ÖùïË*÷Ö=ÿL竨Õ[ê|éu§zI¯ ª§Ôå Ìrf9ˆ³ä™:)'ÑRˆ´T2-•Pó6`ÉóUÊãèóÞ¿#·y³|X¾)ÏW ’wËåùªAò°|R>Lu˜ê0ÕaªÓT§©NS]¦ºLu™ê6ÕmªÛT7©æýÁ”“jÞ!,y!Õ¼G˜rRÍ»„)'Õ¼O˜rSm¦ÚLµ™j˜j˜j˜j7Õnªýó¥#Ögå›òQ-ï–/Êg±<,Ÿ”¯Ãòf¹©.SݦºMu“jÞ@L9©æ-Ä’RÍ›ˆ)'Õ¼XòJªy#1å¦ÚLµ™j3Õ0Õ0Õ0Õ0ÕnªÝT»©S¦:Lušê4ÕiªÓT—©.S]¦ºMu›ê&Õ8H5RƒTã Õ(¤…T£jTRJªQMµ™j3ÕfªÍTÃTÃTsGóóÓSJÌ;ùÏÔó› -ñ¹ï¡-œ—½çqìzï¼û]…¸9^â£Kçå£ó@¯o|tTèõퟹðøüÂYæþðí›wñ´üfݾô¾îüRºëϾ¿ÛA[·|Q~~)¥<,Ÿ”Ÿ_J)o–Ë7åËT—©.SݦºMu“j=H5oõ§œTóÞ~É ©æ½ý”“jÞÛO9©æ½ý’7Sm¦ÚLµ™j˜j˜j˜j7ÕnªÝT‡©S¦:Lušê4ÕiªËT—©.SݦºMu›ê&Õ¼ÕŸrRÍ›ý%/¤š·ûSNªyÃ?多·üSnªÍT›©6S S S Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:Mu™ê2ÕeªËT·©nSݤš{PNª¹€ä…Ts?ÊI5w¼’jî @¹©6Sm¦ÚL5L5L5Lõ|upìr-ª ™®×úŽñÿbݼ¬øÙ÷w3•Ëáb¾aào_¾~¸ÎärDÿ·™Üã¿øÓû‡7ßÜñz~>ÿÈŸÓæÇ|z„›uqY£\'¶n]Ú1÷^cÜYw;W+–‡å“ò<_Còfù°|SžglHÞ-7ÕeªËT—©nSݦºMu“êõ´ ÉIõzÞä…T¯'nHNª×37$'Õë©’›j3ÕfªÍTÃTÃTÃT»©vSÍó7Žu”ó¹÷gå›ò*.ŒKÉ íÖ¼÷qßL.Î×ç’Ÿ¯Ï)o–Ë7åçësÊ»å‹ò(–›j˜j7ÕnªÝT»©S¦:Lušê4ÕiªËT—©.S]¦ºMu›ê&ÕÜ•rRÍýW%/¤šû¯RNª¹ÿªä•TsÿUÊMµ™j3ÕfªaªaªaªaªÝT»©vS¦:Lu˜ê4ÕiªÓT§©.S]¦ºLu›ê6ÕMªç/ZNª¹ÿ*多û¯RNª¹ÿªä•TsÿUÊMµ™j3ÕfªÍTÃTÃTÃT»©vSí¦:Lu˜ê0ÕaªÓT§©NS]¦ºLu™ê6ÕmªÛT7©æþ«”“jî¿*y!Õ°ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[Êéîªy-G· èõ^éÕÏ…­áÂ<Ÿù|?Ž{àÝùî|¾Oë—o¿ÿþeÀü|¢›sŒz–uö;Ëïà.—¸ù¨v½Ì–‡T—aëÎ4ò†ëüôݬ{þÙÎëÐ>¿.yšäÝòEy^‡&yX>)ÏëÐ$o–jιÏ'aÇ1ëçÔyÔê%u^ƒuP=¥Î РnTªÉrå ËA–“,'YN²\d¹Èr‘å"ËM–›,·Xæ<[j±Ìi6ÔE,s–-µXæ$ê*–9Ç–š,Y6²ldddddÙɲ“eÿð¨ìøœ|ËÃòIù<,o–Ë7å«ZÞ-7ÕmªÛT7©æðšrRÍá5多ÃkÊI5‡×’WRÍá5å¦ÚLµ™j3ÕfªaªaªaªÝT»©vS¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu›ê6Õmª›Tã Õ8H5RBªQH5 ©F%Õ¨¤•T£šj3ÕfªÍTÃTÃTÃTs£Ïq>ÛïíÞ îç§¶Ãëóeùê æFŸã8ê½×wf×ëùn ¿~õÃûWo¾yÿÓˆü|/_ÿÛ_n÷¸ü]ΕǸó(­¾3©-£¹).ŒË,ûlç¼³ðÞÌVòó¯ åÍòaù>óµ÷ùÏÎçäç_AÊ»å‹òó¯ åaù¤<ÿ JÞ,–›ê0ÕaªÃT§©NS¦ºLu™ê2ÕeªÛT·©nRÍY.多Ó\É ©æ<—rR͉®ä•Ts¦K¹©6Sm¦ÚL5L5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºI5Ç»”“jŽw)'ÕïRNª9Þ•¼’jŽw)7ÕfªÍT›©6S S S Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕeªÛT·©nSݤšã]ÊI5Ç»’RBªQH5*©F%Õ¨¤6[ ›-…Í–ÂfKa³¥°ÙRØlézmrË«yg£Aæ§×&Ó¼6ùlkÜûïÍwóD˜góÝ·¯_¾º½09.†¹åΚljs»ù€ò·ó_‰=×€UyEÃ</‚¾]õüÓœ4@=¥.YHÞ,–oÊózÉ»å‹òJ¦¥j©¦š×3ütNÚçäÍòaù¦<¯g¼[¾(Ïë$Ë'åÃT‡©S¦:Mušê4ÕeªËT—©nSݦºMu“êu#fÉIõº3ä…T¯1KNª×˜%'ÕëFÌ’›j3ÕfªÍTÃTÃTÃT»©vSí¦ÚMu˜ê0ÕaªÓT§©NS]¦ºLu™ê2ÕmªÛT7©^7b–œT¯1C^Hõº³ä¤z݈òJª×˜%7ÕfªÍT›©†©†©†©†©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2ÕmªÛT7©^7b–œT¯1KNª×˜%'ÕëFÌWR½nÄ,¹©Úl)l¶6[ ›-…Í–ÂfK׫[ß»Fƒaðu>Îe³Éäùã+oWÝ„—ç{5ÿöÇ×|Ü‚ù|ݹó¿üx÷¸´óõfÔãüG½ó0Op³n_v‰½[Ý´îüCÇ:{ýÞ‡}o Iù¦üüCCy·|QÞ‹åaù¤|–›ê0ÕaªÓT§©NS]¦ºLu™ê6ÕmªÛT7©æ@’rRͤä…Ts I9©æ@’rRÍ$å¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©vS¦:Lu˜ê4ÕiªÓT—©.S]¦ºLu›ê6ÕMª9¤œTs )y!ÕHRNª9”¼’j$)7ÕfªÍT›©†©†©†©†©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2ÕmªÛT7©æ@’rRÍ$多IÊI5’’WRÍ$å¦ÚLÕfKa³¥°ÙRØl)l¶t=®ÇQÎFÆo'ÃåÒG·uí|»îîL²>ß_øë—üþfy>Ýã¬Úw–<ŽHow2ΫÂÊ>ÿ36¬ZårþÆÏ÷ÕçŸãTO©÷Au£zP½¥Î}‘)ï–/Ê y攓hî±A9™æ˜žòSõqåö9y«–wËåQ,Ë'åùï¬äÍòa¹©S¦:Lušê4ÕiªËT—©.S]¦ºMu›ê&ÕÜcƒrRÍ=6$/¤š{lPNª¹Ç†ä•Ts ÊMµ™j3ÕfªaªaªaªaªÝT»©öÇgKåØ÷žߎ͋åaù¤|–7ˇå›òU-ï–›ê6Õmª›TÏ_´œTs ÊI5÷Ø œTs É+©æ”›j3ÕfªÍT›©†©†©†©vSí¦ÚMu˜ê0ÕaªÃT§©NS¦ºLu™ê2ÕmªÛT·©nRƒTã Õ8H5 ©F!Õ(¤•T£’jTRÍ=6$o¦ÚLµ™j˜j˜j?.cÆQJ½÷üýç¦Ò׫„Û¹,– ³¯n{­#î,‹qg$ßžo›ü‡W½™È·KÏ-Œ[~‹àfŇçÎ÷漜¯©÷ùÛ€u븬™ß’h÷ÞßÍœ½Q=¨ÞRïJu§zI]ŽbyX>)/äY æ!ʉ´T2-•PKMÕÜ3}ßû»x;7/–‡å“ò8,o–Ë7å½ZÞ-7ÕaªÃT‡©NS¦:Mušê2ÕeªËT·©nSݤš÷ QNªõ Õzj^[@9©ÖBªµ’j> £ÜT›©6Sm¦ÚL5L5L5Lµ›j7ÕþáÙRžƒøù8,o–Ë7å³ZÞ-_”¯byXnªÛT·©nSݤÚR=_%ZNª­j+¤Ú ©¶Jª­’j«¤Úª©6Sm¦ÚL5L5L5Lµ›j7ÕnªÝT‡©S¦:Mušê4ÕeªËT—©.SݦºMu“j¤©ÆAªQH5 ©F!Õ(¤•T£’jTSm¦ÚLµ™j˜j˜j˜jñG^…S'±Çø¶Ì¶…m÷q³.æó|]_ð|Z}ùöÍïß½|õæýóiþÎiþù»™}ÜY÷¸÷¾ìÛ¬ç¥ôŸîG€u¹íôìçË¥–ß¹Yx;\n–Ë7åyΊäÝòEyž³"yX>)ÏsVúù·¢òYy³|X¾)ÏsV$ï–/ÊóœÉÃòIù0ÕaªÃT‡©NS¦:Mu™ê2ÕeªÛT·©nSݤš»¼PNª¹Ë‹ä…Ts—ÊI5wy¡œTs—ÊMµ™j3ÕfªaªaªaªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu™ê6Õmª›Ts—ÊI5wy‘¼jîòB9©æ./’WRÍ]^(7ÕfªÍT›©†©†©†©†©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2ÕmªÛT7©ÆAªqj¤©F!Õ(¤…T£’jTRjª6[ ›-…Í–ÂfKa³¥°ÙÒuÛéÝÒâÞî燰×YôŽ£Ôè¸ðzQùQJÌ; ï£ó첺÷}>V÷ÃïÞ¿z{sã>.5ä%'Ý7Ë'äåvÝ.ë§VÍKütœäíªÛAñay³|X¾)Ïý£$ï–/Êsÿ(ÉÃrSm¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©S¦:Lu˜ê4ÕiªÓT—©.S]¦ºMu›ê6ÕMª×½É%'ÕëÞäR½îM.9©^÷&—œT¯{“KnªÍT›©6S S S Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:Mu™ê2ÕeªËT·©nSݤzÝ›\rR½îMy!ÕëÞä’“êuorÈ+©^÷&—ÜT›©6Sm¦¦¦¦¦ÚMµ›j7ÕaªÃT‡©NS¦:Mušê2ÕeªËT·©nSµÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙÒuj=ÛY,ó^gÖë|75÷ô†eoƒr³,Ö‰õ¬Ïª¯ß½úóŸÞ=ŸW_o)Ìk§k¿³èÃñ—y»£I¿ô2Î6ÏF”uûRz;ßakwÖ=ÿ<ŸOy¥îT/©sÿÊÃòIùù„—òfù°œHsÿÊ 5÷)ýü6öøœ¼ËÃòIy–7ˇå›ò^-ï–›ê0ÕaªÃT§©NS¦:Mu™ê2ÕeªÛT·©nRÍýG('ÕÜ„rRÍýG('ÕÜDòJª¹ÿå¦ÚLµ™j3ÕfªaªaªaªÝT»©öÏ–ÊüœzT7ªÕ[êY©îT/©W¡:¨&ËM–›,7Yn±Ì G¤ËÜnê"–¹ÙˆÔb™[H-–¹ÑˆÔdÙȲ‘e#Ë Ë Ë ËN–,;Yv²d9Èrå$ËI–“,Y.²\d¹Èr“å&Ë-–qˆeb‡XFË(bE,£ˆeT±Œ*–Qɲ‘e#ËF–A–A–A–9ý®å8Ö½‘ÜÏÏ~¯ãïܡ̂ s{÷Rï,¼;?Ÿ…~Zýþíï_½¹9œs}¼yÈÍ¢Ÿ>¦Û¡|>oÝy6inërÛ¼Z²½³ìfFÝ$oˆóHL©;ÕKêÜ,ê zJ]2Ï”Z(ó$Ì•7ŒÜçäßÏs›<É»å‹òÜ&Oò°|RžÛäIÞ,–›ê0ÕaªÃT§©NS¦ºLu™ê2ÕeªÛT·©nRÍ“0)'Õ< SòBªy&多'aJ^I5O¤ÜT›©6Sm¦¦¦¦¦ÚMµ›jÿð4éØósòQ,Ë'åó°¼Y>,ß”¯jy·ÜT·©nSݤÚRÍ“0)'Õ< SòBªy&多'aRNªy¦äÍT›©6Sm¦¦¦¦ÚMµ›j7ÕaªÃT‡©S¦:Mušê2ÕeªËT·©nSݦºI5RƒTã Õ(¤…T£jTRJªQI5ª©6Sm¦ÚL5L5L5‡àçÓŽ5{§ðu >Î÷³{Á…o\r³0ö)øùwøÓê7o¾}øŸ7Cðó9ñq~@{å#߬yüâr{@gnã¶õ–egºs¼™߬{þ™^[ê]©îT/©ó’qÊÃòIy9,o–“h^2.y%Ó¼dœrSm¦ÚLµ™j˜j˜j˜j˜j7ÕnªÝT‡©S¦:Mušê4ÕiªËT—©.SݦºMu“j^2N9©æ%㔓j^2N9©æ%ã’WR½ž.¹©6Sm¦ÚLµ™j˜j˜j˜j7ÕnªÝT‡©S¦:Lušê4ÕiªËT—©.SݦºMu›ê&Õ¼‚œrRÍkÈ%/¤šW‘SNªy9多W’SnªÍT›©6S S S Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:Mu™ê2U›+5,5›,5-5›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-]§íG;ŽóIš¯ÓöX{ïÃfÔŸ^s~³ðfÚ^ãñYÔ'ÕWï_¾xýðæýùŽrSß_üéí»§7¾ú滇×/ŸÞþõß^½y•‹?ýÜË7ß>½ñ/ß¼úËß¿ÌäæÕ_¿ìÚóÓÔï|,OqçUãùy}¼ûVÖåÇÙæNï·ëî½|¤|QžwK–OÊó–cÉ›åÃòMù4ÕiªÓT—©.S]¦ºMu›ê6ÕMª×%'Õë-ÈR½Þ„,9©^oC–œT¯7"KnªÍT›©6S S S Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:Mu™ê2ÕeªËT·©nSݤz½CYrR½Þ£ y!Õë]Ê’“êõ>eÈ+©^ïT–ÜT›©6Sm¦¦¦¦z¾:èí|‰S‚^âä«ÇçËÎÞ¦­›—ó8v]wÖÝ»Të:Æþ¤úòíëׯóÕ_üý÷O/%æÃ+ÃÇ7ž^k>{ðë±#«ï]£Ýy7Op³®]æÌÝJ{Þ/¬›—#/pùɾYwóLö8,o–Ë7å¥ZÞ-_”×byXnªÍT›©6Sm¦¦¦¦ÚMµ›jOÕz”2ëçäã°¼Y>,ß”Ïjy·|Q¾Šåa¹©nSݦºMu“j6('ÕüÒ-y!ÕlPNªYPNª9Ø ÜT›©6Sm¦¦¦¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT—©nSݦºI5”“j6$/¤šƒ ÊI5’WRÍÁå¦ÚLµ™j3Õ0Õ0Õ0ÕóÕAͧûç)yžƒg:ç¶uó²Î­Jw–Ýk´çÛµýþáÍËׯÞüùñˆîëøäwüßÜ.ò{-åLŽcÜyœÖß,—QÎßÞ\¸07/û8Z»³îù'?S–zP½¥ÎoÅCÝ©^Rç÷ᡪ§Ôƒ,Y²d9Ér’å$ËE–‹,Yn²Üd¹Ér‹ežš,µXæ™ÉP±Ì“¥Ëçÿ;Fߟ•7ˇå›òó9åÝòEùù‡žò°|R>Lu˜ê0ÕaªÓT§©NS]¦ºLu™ê6ÕmªÛT7©æ•””“j^K)y!Õ¼š’rRÍë))'ÕZI5/©”¼™j3ÕfªaªaªaªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu™ê6Õmª›TóÚJÊI5¯­”¼j^[I9©æµ•’WRÍk+)7ÕfªÍT›©†©†©†©†©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2ÕmªÛT7©æµ•”“j^[I9©æµ•”“j^[)y%Õ¨¤ÕTm¶6[ ›-…Í–ÂfKa³¥¼¶r奇㸗ÿü0ð:#-sï7pÓÂ’^Ç–÷æ–w‡¤ãù¾w_¿üã÷ï£ç§?7#=_Ïcï¬Ü{”àf¸z~è}˜3ÓÂ~Y×KUó’Ó›…7³‹<àò<à]ò°|Rž¼KÞ,–oÊó€wÉM5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºMu“jl)'ÕØJ^H5¶”“jl)'ÕØRnªÍT›©6S S S Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:Mu™ê2ÕeªËT·©nSݤš[ÊI5¶’RÍ-多[É+©æÀ–rSm¦ÚLµ™j˜j˜j˜j˜j7ÕnªÝT‡©S¦:Mušê4ÕiªËT—©.SݦºMu“jl)'ÕØRNª9°¥œTÃfKa³¥°ÙRØl)l¶6[ ›-…Í–ÂfKa³¥ëÀ6êQòhFL^¯Ü?@B s^®3½YØëyíz¾Ÿçßæµûºè/œ=YrC×Ý£ÔzçžãfX.}míÝÖõË1÷Þ߬»3.ÊsÇoÉÃòIyîø-y³|X¾)Ï¿%7ÕaªÓT§©NS]¦ºLu™ê2ÕmªÛT7©æö”“jÞi/y!Õ¼ÓžrRÍ;í%¯¤šwÚSnªÍT›©6S S S S Sí¦ÚMµ§j9J~Søß¯G¡:¨žRσêFõ zK½*Õj²Üd¹Ér‹eÞ[/µXæõR‹eÞW/µXæ]õPW±Ì{ê¥&ËF–,Y6² ² ² ²ìdÙɲ“å ËA–ƒ,YN²œd9Ér‘å"ËE–›,7Yn²Üb™wÎK-–yß<ÔE,ó®y©Å2ï™—Z,óŽy©É²‘e#ËF–A–A–A–¹ÇæhÇñ|þôìzh?öZ×}¼ÁæÍº¾î ÷óm8ÿðêá¯ùÎÜÚÓ% O?óáPãÇ7~iäx>®yÈÏhqçÝ<=ÆÍº~é5/]÷>¼_Xw~Jâ§ðoÖÝŽ1Šåaù”<ÏX¦¼Y>,ß”ç·[$ï–“jž±L9©æË’7Sm¦ÚLµ™j˜j˜j˜j7ÕnªÝT‡©S¦:Lušê4ÕiªËT—©.SݦºMu›ê&Õâ±€ÁõŒå²>\»%ëòŒåcïóç;ëÆK·òïØ§Õ¯ß¾~ùê͇sœË§s–ÇŸù0gy|ã—æ,¹ïËl{÷=ï¼£§Ç¸Y×/»ç%a«Ùº}©çW½]ãÞºÛiBµ¼[¾(?ŸœR–OÊÏ'§”7ˇå¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©vS¦:Lu˜ê4ÕiªÓT—©.S]¦ºLu›ê6ÕMªyŸ多÷™I^H5ï3£œTó>3É+©æ}f”›j3ÕfªÍTÃTÃTÃTÃT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu™ê6Õmª›Tó>3ÊI5ï3£œTó>3ÊI5ï3“¼’jÞgF¹©6Sm¦ÚLµ™j˜j˜j˜jŽ6fEºå%úu²ÑóäÓ9l]N6æqôQï¬íÎd£<ßjìëw¯þüç‡w?mU¶~ᨅ~ÙÇù›[óÞã|ô7 ÷%ãa ÏçL¹%Û^=î,|þÙ/çs&Êåçs&ÊÃòIy–7ˇå›ònªÝT»©S¦:Lušê4ÕiªÓT—©.S]¦ºMu›ê&Õ¼XŒrRÍ‹Å('Õ¼XŒrRÍ‹Å$¯¤š‹QnªÍT›©6Sm¦¦¦¦ÚMµ›j7ÕaªÃT‡©S¦:Mušê2ÕeªËT·©nSݦºI5/£œTób1É ©æÅb”“j^,F9©æÅb”›j3ÕfªÍTÃTÃTÃT»©vSí¦ÚMu˜ê0ÕaªÓT§©NS]¦ºLu™ê2ÕmªÛT7©æÅb”“j^,&y!Õ¼XŒrRÍ‹Å$·ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙÒu£¯5ö>¿HÑìðñd†~÷ßÏ/-̾θ•{ÓÊw†ªõù~`¿ûãûWo>óüÚ™G,´{óËç×–ãü<Î]qa\Æùêõ(åκÛ!é”:OºQ=¨ÞRçé"Pwª—Ôyl-ÔdÙÉrå ËA–ƒ,'YN²œd¹Èr‘å"ËM–›,7Yn±¼žR µX^Ϩýüºˆåõ„Z¨Åòz>-Ôby=j²ldÙȲ‘eeee'ËN–y&íI´úŠÏÊ7åy&­äÝòEyžI+yX>)Ï3i%o–›ê2ÕmªÛT7©^Ϥ•œT¯gÒB^Hõz&­ä¤z=“òJª×3i%7ÕfªÍT›©†©†©†©†©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2ÕmªÛT7©^Ϥ•œT¯gÒJNª×3i%'Õë™´WR½žI+¹©6Sm¦ÚLµ™j˜j˜êÇgÒÊ€ï“3imáGgÒÞ.ãÎä3žoZöÕÿüøð曣Ïã—Ž¥Íkš:–öö>z€;3Éy¬[•Ù¼íåü¥cÌrgáí 1,Ÿ”çm/’7ˇå›ò¼íEònù¢|˜ê0ÕaªÓT§©NS¦ºLu™ê2ÕmªÛT7©æ%œ”“j^ÂI9©æ%œ”“j^Â)y%Õ¼„“rSm¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝTϧ%õz„BŒÏÉÇay³|X¾)ŸÕònù¢|ËÃrSݦºMu›ê&Õ¼„“rRÍK8%/¤š—pRNªy '多—pRnªÍT›©6S S S Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:Mu™ê2ÕeªËT·©nSݤš—pRNªy §ä…TóNÊI5/ᔼ’j^ÂI¹©6Sm¦ÚL5L5L5L5¯èÿÛXÆu×Afî+¸{Å…9È,g{Ü›,Ž;ç*D¾/àWÿü׃ŽKñÅ?½{ûÍ÷?¾{xú©¯Þ¿|ÿðúáÍû›éU\J;¿çsÿ;ûô7ëæ¥·}×Ï*¬Ë[Ö~:™övÝí<«Y>,ß”ç-k’wËåyËšäaù¤|›ê6Õmª›Tóª=ÊI5¯Û“¼j^¹G9©æµ{”“j^½G¹©6Sm¦ÚL5L5L5Lµ›j7ÕnªÝT‡©S¦:Mušê4ÕeªËT—©.SݦºMu“j^ÇG9©æu|’RÍëø('Õ¼ŽOòJªyå¦ÚLµ™j3Õ0Õ0Õ0Õ0ÕnªÝT»©S¦:Lušê4ÕiªÓT—©.S]¦ºMu›ê&Õ¼ŽrRÍëø('Õ¼ŽrRÍëø$¯¤š×ñQnªÍT›©6Sm¦¦¦z=AúCsëôkÅ^½u[7/ëqŒtoÝ<î ¿Æó­#÷þ»Ç-!Wä‰_}óÝÃë—Ooÿîÿãá›÷OoÿÜ~ç¿ÈmïÇí0oÞÇÓò›eã2óìQ+­;Ÿ±«ïÇ[ËoÖÝNdšåÃòMùùŒònù’¼žÏØ)Ë'å…Tk!ÕZHµR­•Tk%ÕZMµ™j3ÕfªaªaªaªaªÝT»©vS¦:Lu˜ê4ÕiªÓT§©.S]¦ºLu›ê6ÕMªí Õvj;Hµ¤Ú ©¶Bª­j«¤Ú*©¶jªÍT›©6Sm¦¦¦¦ÚMµ›j7ÕaªÃT‡©S¦:Mušê2ÕeªËT·©nSݦºI5RƒTã Õ(¤…T£jTRJªQIõ|½My3ÕfªÍTÃTÃTÃTÏ/¥×ãXÇéÅuÞ³cï^hêñxÈ:JÞíy³ìfÜ“3«ysÈw6µÜï7oþôöÝë¿núø“ çc…óõêìó8Zžró¨O«oÖíKÙý8f«´.·ʶrgÝÍÔ#÷’|Qž»I–OÊs#!É›åÃòMù0ÕaªÃT§©NS¦ºLu™ê2ÕeªÛT·©nRÍ&多MÉ ©æ@“rRͦä•Ts I¹©6Sm¦ÚL5L5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºI5š”“j4)'ÕhRNª9Д¼’j4)7ÕfªÍT›©6S S S Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕeªÛT·©nSݤšMÊI5š’RÍ&多MÊI5š”›ªÍ–ÂfKa³¥°ÙRØl)l¶t½€­œÅ>îå?;­»4û:޹pÝühã»›uóÞ©ÆëùfuÿôîáÛ‡?½zóðm¾Ÿü’óâ‹/¿{ùîå7ï/l{ü©¯Þÿð¿}T¼ýþûëà󇧟{ù棇øõÛ×/_½ùáæθ”ž;Úì{ËÓò›uûRë8?³³ÓºQ/ç“ÒóÝíκÛ×<ÝòEù,–‡å“òuXÞ,–oÊ·©nSݤš7íPNªyÓŽä…Tó¦ÊI5oÚ‘¼’jÞ´C¹©6Sm¦ÚL5L5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºI5oÚ¡œTó¦ÊI5oÚ¡œTó¦É+©æM;”›j3ÕfªÍT›©†©†©†©ž/‘ú<_êÔ}/ÿÙ'òùiô¶w™¶l^fžtì}gݼsDa?žï‚ó‡W½¾ÌÉ»è_|ñêÍÓóÛÿü»ßÿãß}ý›ßýöé'¿úò¿þý?þÝóg•GÍßøÞq¾‚¹}O«oÖõ˪>a´n_Ž9Η®ëÞû»yÒ›WÿJÞ-_”çÕ¿’‡å“ò¼úWòfù°ÜTÃTÃTÃT»©vSí¦:Lu˜ê0ÕaªÓT§©NS]¦ºLu™ê6ÕmªÛT7©æÞ·”“jî}+y!ÕÜû–rRͽo)'ÕÜû–rSm¦ÚLµ™j˜j˜j˜j7ÕnªÝT»©S¦:Lušê4ÕiªËT—©.S]¦ºMu›ê&ÕÜû–rRͽo%/¤š{ßRNª¹÷­ä•Tsï[ÊMµ™j3Õfªaªaªaªç«ƒóËÙ^»y›ƒ¾oê ey/È<Ž>êuw9ËYÂ<öOƒ^ýñÕ÷¯ÞÿÛõ[´×“ÂÞþééÇÝòìáº_{Ï{ûôÏ—åýôýØ;Ö´uý9™õβçyªÔ£PTO©çAu£zP½¥^•j²\d¹Ér“åË©~ûòõßν_”ÏIò\«=w½ó8=ÆÍÂqG?ŽÖ†-<_­–c¿¿Þî,¼k´fù°|S~¾b¥¼[¾(Ïí}$Ë'åÃT‡©S¦:Mušê4ÕeªËT—©nSݦºMu“j^H9©æÙ_’Rͳ¿('Õ<û‹rRͳ¿(7ÕfªÍT›©†©†©†©vSí¦š7û8ÖÜŸ•oÊGµ¼[¾(ŸÅò°|R¾˛妺Lu›ê6ÕMªy!多·J^H5o#¤œTó6BÉ+©æm„”›j3ÕfªÍTÃTÃTÃTÃT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu™ê6Õmª›Tó6BÊI5o#¤œTó6BÊI5o#”¼’jÞFH¹©6Sm¦ÚLµ™j˜j˜jž ÜŽ½÷´qÝuŒy~1Ù³ëÂy¾ÇóF¿; ¼;ÇÌû4?©~ýòýõ°¯¼êÅ_ÿÛ_žÞú¥«ÿÊe¯²wŒvçAŸâμ.Η.—ÿɺuɉíuÃìÛu÷w”‡å“òqXÞ,–oÊgµ¼[nªËT—©.SݦºMu›ê&ÕÜQNª9¸“¼jî('ÕÜQNª9¸£ÜT›©6Sm¦¦¦¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT—©nSݦºI5w”“jî$/¤šƒ;ÊI5w’WRÍÁå¦ÚLµ™j3Õ0Õ0Õ0Õ0ÕnªÝT»©S¦:Lušê4ÕiªÓT—©.S]¦ºMu›ê&ÕÜQNª9¸£œTspG9©æàNòJª9¸£ÜT›©6Sm¦ÚL5L5L5/?<êQ¢ ™I]çv1ÎuaËrËã3Ñ﬛ýÎÔ.w(û¤ú§wo¿ýñ›÷×w².åGu×ßfÞ<î<ÒÓCܬk—ùáµuóRçq‘WsÞ¬»]œÏ (o–Ë7åç3Ê»å‹òó™åa¹©NS¦:Mušê2ÕeªËT·©nSݤš·4SNªyS3多·5SNªyc³ä•TóÖfÊMµ™j3ÕfªÍTÃTÃTÃT»©vS=Ÿ7ÔóYÍõh†ÏÈÇay³|X¾)ŸÕònù¢|ËÃrSݦºMu›ê&ռ˙rRÍ»œ%/¤šw9SNªy—3多w9SnªÍT›©6S S S Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:Mu™ê2ÕeªËT·©nSݤšw9SNªy—³ä…Tó.gÊI5ïr–¼’jÞåL¹©6Sm¦ÚL5L5L5L5¯œsﱚÌÓV;ßG¬mëæeÇùò¢æ|òfÝÝ9ãùšáÓêwyx÷tHÚþw® l—#7$¬yãÍCýôw&t1sCY³/û¬Ž÷VÝÓQÞ-_”byX>)Ÿ‡åÍòa¹©.S]¦ºLu›ê6ÕMª9¦£œTsLG9©æ˜ŽrRÍ1ä•TsLG¹©6Sm¦ÚLµ™j˜j˜j˜j7Õnªùe·œO jÙŸ“Ãòfù°|S>«åÝòEù*–‡å¦ºMu›ê6ÕMª9¦£œTsL'y!ÕÓQNª9¦£œTsLG¹©6Sm¦ÚL5L5L5Lµ›j7ÕnªÝT‡©S¦:Mušê4ÕeªËT—©.SݦºMu“jŽé('ÕÓI^H5Çt”“jŽé$¯¤šc:ÊMµ™j3Õfªaªaªaªy5`_{wb?3‘ºéö¹ªæ&Ÿ¿êãxoVÝÑÍçÛ~õÏÿp}øq™/¾øêýË7ß¾|÷íÓÏ\þ|>OÈkýËÜ»å7ø´øfݺԕ;[w~½Ÿ½ä¨ôβ›iÇùå^ê)õùÅ^êFõ zK}~¡—ºS½¤žd9Ér’å"ËE–‹,Yn²Üd¹Å²bY±¬‡XÖ"–µˆe-by~•ºŠe­bY+Y6²ldÙÈ2È2È2È2Ȳ“e'Ëž–?Ýcðïç£X–OÊçay³|X¾)_Õòn¹©nSݦºIõüEËIµ¤ÚRm…T[!ÕVHµURm•T[5ÕfªÍT›©6S S S Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕeªÛT·©nSݤ©ÆAªqjRBªQH5*©F%Õ¨¤ÕT›©6Sm¦¦¦¦šß$ê}ï–7í~þäë:¬g×}|“ðͺ›Éàñ¢¯çûÿõËãÖó2^|ñõÃÿ|ÿñ›/ÿøýÃó±`ß—ë8ŽZýl]ž4QóJÃÞmݸŒ}þgì{ëžœ_v >?eRwª—Ôç—©ƒê)õùõFêF5Yn²,a–ƒ4ËAœ¥g)Z ‰–J¤yå„Zª©6Sm¦ÚL5L5L5Lµ›j7ÕnªÝT‡©S¦:Mušê4ÕeªËT—©.SݦºMu“j~ׂrRÍï[H^H5¿sA9©æ÷.$¯¤šß½ ÜT›©6Sm¦¦¦¦¦ÚMµ›j~#ã|ª_j-Ÿ“ç72$Ë'åù É›åÃòMy~#Còn¹©nSݦºIµ¤zýF†ä¤zýFä…T¯ßÈœT¯ßÈœT¯ßÈ€¼™j3ÕfªÍTÃTÃTÃT»©vSí¦:Lu˜ê0ÕaªÓT§©NS]¦ºLu™ê6ÕmªÛT7©^¿‘!9©^¿‘y!Õë72$'Õë72$'Õë72$7ÕfªÍT›©†©†©†©^/€½þü˜>¿‡Ñjßk͉ çeõ8Ö1î,\õæ…΋¾Ÿï‡ú»}x÷¯¯þú¬=¿2ÄÙG+w]?¦|nuû=‡y9z¾Þ©¶î|é0ÖùoË*÷ÖÝ|‡ Q=¨ÞRŸ/¤îT/©Ï× RÕSêªåÝòEù,–‡å“òuXÞ,7ÕeªÛT·©nRÍÃÓ('Õ<à‹/ÞþééÇw7¯ÉË?w?ç|&yç1ŸVß™Æùüæ+l]îq~¾êw÷†”7ˇå›òëùywËå×óó ËMušê4ÕiªÓT—©.S]¦ºMu›ê&ÕÇóó 'ÕÇóó 'ÕÇóó 'ÕÇóó>?¯¤úx~ä¦ÚLµ™j3ÕfªaªaªaªÝT»©^ÏÏ;ŸÞóÞ×ã{CÊ›åÃòMùõü<È»å‹òëùy‡å¦ºMu›ê6ÕMªççANªçç}~^Hõñü<ÈIõñü<ÈIõñü<ÈMµ™j3ÕfªaªaªaªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu™ê6Õmª›TÏσœTÏÏûü¼êãùy“êãùyŸŸWR}כּ;ql7gè}óö/„–|/ß|ûôÆï^þðë?¿É DïÌÑf­×Ý7î<êÓcÜŒ¼Ú¥äovÄ´uã’›ïÙÇu·“µMùùÅònù¢üübHyX>)?¿RÞ,7ÕeªÛT·©nRÍ­[)'ÕܺUòBª¹u+多[·J^I5·n¥ÜT›©6Sm¦¦¦¦¦ÚMµ›j7ÕaªÃT‡©NS¦:Mušê2ÕeªËT·©nSݤzþ¢å¤š[·RNª¹u+多[·J^I5·n¥ÜT›©6Sm¦ÚL5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºMu“jnÝJ9©æÖ­’RÍ­[)'Õܺ•rRÍ­[)7ÕfªÍT›©†©†©†©ž_Ž~싦F×ÉÚ‡-bmÝÇ“µ›uw'kñ|“×ßþøý÷ùò_à_üáå÷?>üðôö«7O?þòí÷?¾~óÑ/>^ò÷øãŸŽ¯ûðÖ½ óB™uìǧn?§Õw^×çÓ„=ú½ßÀ/¬—ÚÏ÷WǾ³îÞ |ÉÏø”wËåç |ÊÃòIùùŸòf¹©†©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2ÕmªÛT7©æ |ÊI5_àSNªùŸrRÍø’WRÍø”›j3ÕfªÍT›©†©†©†©vSí¦ÚMu˜ê0ÕaªÃT§©NS¦ºLu™ê2ÕmªÛT·©nRÍø”“j¾À—¼j¾À§œTó>多/ð)7ÕfªÍT›©†©†©†©æ—ƒ,Î×øòJôú¿Ç^#_¨Ëºysï]ǽW¾«=öÿõ¯þùüŸÿ“ì; endstream endobj 405 0 obj [ 404 0 R 406 0 R 408 0 R 409 0 R 411 0 R 412 0 R 414 0 R 415 0 R 417 0 R 418 0 R 420 0 R 421 0 R 423 0 R 424 0 R 426 0 R 427 0 R 429 0 R 430 0 R 432 0 R 433 0 R 435 0 R 436 0 R 438 0 R 439 0 R 441 0 R 442 0 R 444 0 R 445 0 R 447 0 R 448 0 R 450 0 R 451 0 R 453 0 R 454 0 R 456 0 R 457 0 R 459 0 R 460 0 R 462 0 R 463 0 R 465 0 R 466 0 R 468 0 R 469 0 R 471 0 R 472 0 R 474 0 R 475 0 R 477 0 R 478 0 R 480 0 R 481 0 R 483 0 R 484 0 R 486 0 R 487 0 R 489 0 R 490 0 R 492 0 R 493 0 R 495 0 R 496 0 R 498 0 R 499 0 R 501 0 R 502 0 R 504 0 R 505 0 R 507 0 R 508 0 R 510 0 R 511 0 R 513 0 R 514 0 R 516 0 R 517 0 R 519 0 R 520 0 R 522 0 R 523 0 R 525 0 R 526 0 R 528 0 R 529 0 R 531 0 R 532 0 R 534 0 R 535 0 R 537 0 R 538 0 R 540 0 R 541 0 R 543 0 R 544 0 R 546 0 R 547 0 R 548 0 R 549 0 R 551 0 R 552 0 R 554 0 R 555 0 R 557 0 R 558 0 R 560 0 R 561 0 R 563 0 R 564 0 R ] endobj 402 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 405 0 R /Contents 565 0 R >> endobj 566 0 obj 18843 endobj 568 0 obj << /Length 569 0 R /Filter /FlateDecode >> stream xœÍ]sÜ6îÝ¿B“§tÆQ%QŸíô!Mâ»ÜuÚi³L§ít´»\[súp$­߯? êc×Û{è]’ÖH ‚Dº ½þ¾R?²"òvÍÕ'Â…^y"%T’zaæ§Aî5y’{µ8iª!ÔK£¸ó>^µW÷·«_‡A{/ðïñ*XG2®~æIê‹4/Š‚dü0Ï á§ÐØ5Þ—ï›È{ÛéÑFzE(øŸKïJ$Âèÿ@¢À»½úvsõåMâ…·9° „Aî'aQ{¹/¢Bý‰¼Mãýúr#?Þ¦ÜÖrøâwoó«wZÎUÁ¿Ì×V4éHâ`ÚãX˜Å3þ‹}8ÀøQëP]5m*ýT¦™h%áÏ“J!RÎäùimý•ÌOïF&ãç“MÈcG÷SÃú‹U¶ØEÅûôb‚…=ÝûñNöM×Ëkï “û™÷òï~üîí· ß÷ÝCµ—cvǪ– Çûû®ñXw w½tF—û}5V][ÖŒÛv]-Ë–ݽ2|ÅÜ€/oŠùEûyaʘ¯¶ºma¡ª~ ……’â(=MáúbúEž2*–>»QîO2¼(˜Í(Û½fš-œf Ýaì,[!Q×<Ã8£ùYž.çû,ÀæN^"M–«ÅÅ’ÜEÛÚ?C‚e@Û`ø·—{y(õȨCYò·/1ʺtÌ»;n£¬NŸ»~½ëªu:+G¨ÒSˉ>+òäŽ ˆÈn€0¸\^dê‡@z°Íã ÷x¼“<ˆ$Õm+¨†Œœè'fÔ ìºv,«vpõ±aVw²ÜWííà[ÌÆ!uú¬‘©-NE¼\óF+Òsx‰SíM,Ë‚ŠPö±Ø•8ž1 }e~¡]äm_6ïÊÑ7‡»îXï-ÛgÛz±ƒ˾;¶<ÔaÛ»»²/w£ì-æPÉzÏs! Ѓ‡moY´Î‘’ÙݱßI‡"Ù©†6ÎÀÓŽ/3ëKD²ÔÖ3{‹âÌdË÷r±7*8Lp7BÕÖÚqͰªG°kë' .håNCÙs·Ö&6÷Õ }¬†;‹+mKoOCû@À9_¦WÚö ïa·Ç®çáfû}‹zï+YÜ­Kf\h-Íç­M#.ü”ƒn×}/d;:wÎÈ£; Ý ¶•–ÉQÖcw+UâàÐæ‰n/ËqJÀ¡mõ08Ó6xîãŠùxŸ‘`Ùy1Ô`DS>-ô–3½ž‡{¹«`÷žŠwÀùkœ:*…ðE¨î³´XRûðnãm^ûÝ;ïÃ?ÿôæÝé;2/à^„©™ˆ–d¼a,GÙÀF}eãÕÀ/blTYdQƒ`^{¥$ ý,½8ƒX2„…Ã¥w€èòU·ôEÐ×xqZ0X+ÐÌ«=¦aY? Â" çñ¬¡ ×»KS&Ùœ02cBå_R>‚x+„p  ÈE3òÑŒ¾+‡ÓÑxZúÉPðÌ$™ .P‡Ÿ†Ä‚¹ʈ3çMÒØ q÷`.Õ³B¸Ap¡›Z€ÕÎâÖ¢ðãlQÄ9™üaKnžF•µ’E{/š'uÁ|톂ß(ý5_û~q&T#2‹!SˆçGòÕ*™5NT·Ë@Ã|Ì>ÉF~ªÎ˜Èò†Ž´§O)¸Ù3$.!ƒÓšÂÑN³p…€vÔ'¹ßs“-wô»ÏHA $‰J3Òbξ–'OÏ‘`yzÞ½Š7õÐArÍ ‰{Ì–—ã*®mt<̶(.& 9,Ü~(ÄLZ41>R“c›¢g+º!°e#>š|';›‡p¡e*]¦b…¿s†Ÿ;JÙ9:ŽÌíþ±¢(g,TνBí"‰„ʳO’`Lf§E!8I&hn·ÝÈí°»ì,÷8ÉEÓ !à4Î÷ÚÂ:=¢&BÆØ¾ï†¡Úê3…<¿8¥dÏCËöɶÑ`,H‡ÇEÑ£Ý@›H;|Ü¡ú.ã”ÃÚZ)ÓCh+w]êƬi©=Lµ§cïT—¦I!}×0TrÓ®ÉgÜÇ;“Ûk°ÇäÝ™Þr[~FvÿrtéÛ¤1µ¥ÀkÝ™*¢I‘©WE÷ƒÃ¬Ü9kªÚ}õPíÁòàî— Ëç·-[ÖOfÝ‚r$jï%|þ~`œIÙ*¹i27+gŽõá“7#.uéR4õ4ÌÉ\0™LåÓ;zb¡`²‡|m[˜Pl¶XÄÈvב "âÐqçèLµÖFÃÐŽ0e´Õø)ñÃBŽL„+‰XeÊx‚Éc«&VTKG/^í­fªÇvÔ8½©J` Dš¬óóææU~:€.ÎN&ÞZaQfn¢Ò‚»>Ÿ`4IÕâÜ 2wßÙµˆ¸€+( 3+âFßsJc·j¶Zø‚¢Š$\!‡±îÈò®ˆD>oŠ'£ŽÂoUyˆ³•ÙVøgv$ŒJ–¤+T<Ø Ô=Y9X Û—2'0$ö­øŽöZ@D˜<ò¦j!B{Ò·mìÇN¹Açã"Ècèv¹­êj|â¾Î6Õ½Çãx„úÂjãap ³øéÝë·øáûï~aé¶Ìì¾.wäÖ‚ýK>=v= ðâí»o^0¯qu–l—·_”…3‘¯ž—‘þ\=(Ê#Èýó ×kBª_`¿)X8(,‚84joJ󢢈Ÿ† „šÖhÖä)àä¥Y‘gF@ÄÄåQhÁ&šñ™ÈÄT©™ UYHä".QŒÏBbÁ\ 5©­HãnØ|æÒ]R?šh‡Ps圩!E3µ‹‹H/ÕhdÓõ:ÖŒì7R/?Wͱ!¨=6[¼*Œ«Fß=sÙZ>ŒJ§RÌ›~;°5¨±j융ïŒñL1*E껺¦«]²Í‘î̳i­ºéE¡cQ¬1PúûC­ùôå) f'"]¡`%Ç™ª]c6Ž|î­®à‡²>ró z’øY‘‚5Ù·ž¥`E  C5ÕË ˜Ëßw¢0Ÿã0‰Í¶k£ÊÝ–Û.Ò™ ”ˆÐ‰ZX#„úΣzÆø—Äé80ü|SQ@D³”U:Tÿ>_ÏãÅ!œ(ÄKÒ)½ #‘âs×K¬ñº¦÷Vɲ¯+,¨ÔƒìõÑïÚE¶e#±dg0ã”ù™×KB½ç……+kPf¿õI»²>}¥Å*¹:MÉ•Æ<dYOÊŠ7yN(Øœg$ E¾BEûÊaTŸµ¦yü—7 ӹqá ó°GÏ[ àË[¹Ó•åÅ“æu#É"² 8EìÄðxÁxMù¤D1óÓÅëÆœŸ[,)í­2S/CRªiÊ¿tG­pùù¾®vÕÖÊ{¥s•¡ 9ºn‘`5 G%†.ÝBXß=*èOÕ’²Éöo½  º#Ým'cÐ3í ]ðϬ†'ñœ>b¦×ÄŠ$aêç “Q!&ˆ‹…¡KjÎ$šq™ÄtSL†*],äq—hƧ1±`®„šÜ[+Ò85Û˜¹l—ÜZ®j3×Ì™K+=Îã ȳâ‚Ôÿ‡››3Î"ii ‚ˆ\Ö‡ãvŸŽ`óXIT»Î¥~ ø¬<Ä+ÔH˜Ó¾"ÏM'þ¹}@ÐVr[6÷˜º ȯâr¬\¾R_š|Æý½{”pÁ]3†ßäåüÕ!þjG½rØõ•}%ûœl÷=ñýƒÜ_O\>ÊŒÓÙʵóÓûHáv/_Y×ë8/¿_œ÷K 丢8é—Ô'hÝm†ÅÐY³ÐÞð’“Ãã|N137°”þ¯L=2E?…ÄÅÂ'4c͸Lâã Ü¡J y\Ä%ÚQŒ bÁ\ 5õKKiœšmÌ\¶‹ü’£ÂÌ5sÎ/¥‰GY‘åIt‰_úþœ[Ê3ÅÞ}©é Î4œBKdßÖDø,U¶xÞ"û<(âhU7¹zéR¢š¨n›¢èTŠâ wóžLèeC¯™qUNxe%‚Heé/ŠÂê§Ò¥š(pž `‚)o£m“@Áäeј¸8ÄU̺4ߢ6wN©b§a•‘£”5Æfp^Çr3¶ÜïQ3ó1.›}Õƒ»~ù9 C«6uO°“=á]õˆrÛ=€îšæ,ãД~"Ì‚b-j± üU ´07 ½J¡>ˆ•¤Á»’g êÓ%%„ÕC}ßBæñ B®i]»¬Öå›q¥Šªno-÷Yª»ã¨^¤-5D¿¤Àâß#JÊ[Õ—É=cÌ5Œz›qÛãçIƒ¸ &y¯Wæ3μxCHש4µ7„p±=ü|@€ÊÚ®¾Ö‘’w€ ãaìáL9¬š•ìåçÙ¯¤þjlw endstream endobj 567 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 568 0 R >> endobj 569 0 obj 3969 endobj 571 0 obj << /Length 572 0 R /Filter /FlateDecode >> stream xœÍkÜ6îûþ }k L\¿צÀ&Ùm¶È5½f‚ÐÆÖìñØÛ“Íܯ?J¤~ì¶ùÒ»ÜKR”HQ|IžóáO埬Yy¸øH´€e!‹R"%) 2/õsv`„äIÎÉ8% ‘¢7"wì׋öÂg?\üö0UÌ÷vá/ÇeÞ^ü „'©¥yQ¤kèy.ED^ @y`ßÜBö²SÜZ{¹ÿ?×ÞÕ( Âÿ|v{ñ|{ñÍuŸm÷Ö?÷’À÷ý0ˆYîEa!ÿ…l{`¿=ÙŠÏ#Ûò]#†¯ÿ`Û/®¶´=œ+(„ÿgžò¢É@ûÓÇà ÝRá¿Ø‹/L`r¨¡C¥¿r@ƒ‰2þ}Ð(´”3y~DÊZ§ð‡O#‹€âå“CÈÇöSÇú›M¶8E)ûáÍø j…¨Ø×ìiT°'c§¡ÐPÙ >Z–®5Ìw†g”î¸ÑX=hÐб†˜–’ªz(»¶帲ðÐúÒ`Õ©¯ÛÛ6¥cmUëöf¤k‡±çu;Uxk6S·•ø¬ãȱQèÏŒ$çô¢:.RìXƒmŽüƒìå(ú}×Ô`ˆÒÆÃu}<\?(Ò€õ·p*àPùìTâÂóC_J œ0¿®Ábï~+ôR·ë‡šE^žegƒû®iº{i°º•Ê¡…øñØÔ¨´Tö$g`¯QÊSç8Þß\g üy*¨È½8HAÍ<œëy3 'mËU%0kƒ]Ó&ÿ†ÉÌøÁŸZÎ, /cOš®T›ï]Ž^À©×%ù-ÑçÙ 0Ž;xçίê²ëÏ>:(xÖ~5<¼sòã‚h§ì;›¢-V,ËTÖpf yNÕÎãòlßïOMóþÈÇ»­ÄáÊ" @š{9„e/½u<‚ŠX1xìO ÜòpýÈ?Yd8£8,¤x†²½sí!xO½XÓüÖѧ„øÏCéÀzý}=ˆŠãÙž¹ÊaìÉPjÕ'e)§Aô;ð³Ev§Œ†ú°aG@ù£;X|_Ë0³øöÎYf8вÞ×躴² 2Ë`’"âÒ,†9—àvý±£»XUï÷¢íØœWì=ÞÌneÙõæÝ(1û$Ï÷˜‘òülÀJìù©7ÎTagâqVœê4n‡¹zÑ@FøôÀŠ…-ä+³T!Në HP¸Y18æÔ|ªÊÎJŠî8´Ð„’·mg†)Ÿ8ܬºúaf ÌÖeOá- W-m¡é*Ž.çÿLó«…éÌjÔë‰*ÁÍ=?‡V¸²X×6*è Ýv†Æ[×/$hë Vò#ßÕM4L0ZpYR/C õ]3Ñd€&mãJpÄ=Ø÷DÐÅ.7ý¥.Êgk˜'÷–-Ξ7p&!œ©†zSÌ–Þž^‘Ë8 õößó†·XY¤Áª½ÈðlÏ÷²8@£Ž× é2<7L^<$k}ÛBå¨V´É/õ ßϳÇcoÁw£2‚¹˜Aj€-38‡Í×ùA@·UWPI¤”à܇vÃNmýQfCYË@/É¥ô,ïDù¹7.é/Ë‹…£}äG^ùEž%ÉcÚ/ùt&ÏtŠÐ¨]Za¶SRè¾vÆÐרr¤Fîk üŒöáö< ½žºÑbåïy9ªû -s²KRW¹b¤8Ÿ î²#oK,ºq$Û |GA˜\ ­¡FÏÒL­CÔ˜ƒpªaˆèšECÔÑóÆä½¾½A— °´ªMiÔåèµ£µbC™>'6TÞwÔT+€°–˜+)Ru6詮 ˆ*;#ˆwªÊ3ª'ˆàÖÞBâ1žÜU¿D×®_×SÀ}Îh½f±<žY쾯Ǒ¼*–õ¤;¡ëEìÿ2óCÓí ‡úÙøöŸ|MJÂÜ+b¿Ð7E|žNðÕÀ>…"Á<û!zÂWD¸ðcÂ*Ñjø*lgà ÂÚ÷b‡˜ SÏЮxy7eÿj˜¨m•1M¾B©¯GÝ> H*•©ê»L IìOlvƒŸ3'y„!¡t›|u>" ì(£GïÄ1QnÕASÑÇ‚Éì³£ÉñØœ×s|B&³ïk‘û키™»œ!a\òò‚ëòíÕÒ|)'.wõo5-C‘„¾¼º¾|÷zûÖR¾sò¶!búÞè 1s¾ãdúsOe1´D¶8‚Ì=‚Ì=KÀ°øÔQ‰xé¨!>óñ™—;0äI× àC·pÑÏVPžÿa~~ ½.2ù«€" åK—ʰF’å^…E@Æ‘¯^èÃ?†ºvñX¼D1…Èt€Ü\LI$¹ 5lº°ùÁ‚NO³ß-q¾A$ý㢅pÍ›úP÷íéS^1!üu…ä’ኘp&ÇÕÉ80µ£ «´ÈB#—ðL$ ra¥I«3—MÚLl~>síþT™¹u´0Žù‰IÁ¥(O½8 üÐן þÉ< ÃŸ©ðƨÖÁ¼ŒhÌÕo"RŸb€}e;5õö-\,:ùmòÙ»íõÓüÛJ€xßw÷Ã3ùó)ŸCýñL:ÿWü²! ¡Wó“"bzØz]CÃÅÊt3Œ¢û8+¤«E4c/Š‚"óÃÅ}`ýcÿrÆ~x¶™üÈë¿?ÃÏ endstream endobj 570 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 571 0 R >> endobj 572 0 obj 3021 endobj 574 0 obj << /Length 575 0 R /Filter /FlateDecode >> stream xœÍVAoÛ: ¾ûWðØ*Û±czØÞ{{ë†Øa ÕVb¶äJN½ì×O²K‰Ón¹lKS˜¤Èï£HJÎcÖ¯Ìc™GP4Áãh aAœŽ¦$…p‰RœA£’%ÔÆñ@4.£ÖÑÛ*|x€áÿàËWíTF ôž[˜OÁGMž¤(N³<ÏÇ\#f™¡ˆQª…¢ëÛ&‚Åà½ÏÞá?ž½ŸQFAF6Á›Upý6ÃjíF ÄJBŒq. Cq”›O«¾\¬è·V䡦êò+¬Þÿ­ÆíÙX3@‘þ.Ñ0E É®x6ÙUÿ/PlmÚ‚¢DïÃ,ÕcSǧYØ‹ÉP$û|¶(#”|Ü¢¡Z¿“üùn,cmAÙA²Ô«ýá`ýæ’ͺh¸Ÿß žÍÓ]%v3×oóù$ÎüŸÔÍÕÞÿ|ŒÏÄŸQy¥s‹b}“óä”}¬j·me»íÑî\$U¬f”{b}0w…$ªòñ(ôV¥Ãصž›X%ˆ&ýÖ[ªŽˆ&­"mK¹Ãë+SËSq¦ó"¦áQÇ–\B¬pꮫI| úŠ›´^šæðIïÄ•“+0öÀ*Gà ÙMòØ÷I¼Þyq‹J6'²'Eyà¥[,·ÒOžx´î<Œ˜îxžºe|T¯Ï¬«ÀvØvV§g;y¤,™Á!54ÔäÇT£@·k;Î?ãÝèBî†(mÐGŽá¥Vtåë¶Ä@Ïê̘ÉE¿EÛøûâ endstream endobj 573 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 574 0 R >> endobj 575 0 obj 904 endobj 440 0 obj << /Type /Action /S /GoTo /D [576 0 R /XYZ 72.0 568.95 null] >> endobj 443 0 obj << /Type /Action /S /GoTo /D [576 0 R /XYZ 72.0 306.0 null] >> endobj 578 0 obj << /Type /Annot /Subtype /Link /Rect [ 372.32 582.45 539.998 591.45 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 577 0 R /H /I >> endobj 580 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 570.45 105.06 579.45 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 577 0 R /H /I >> endobj 581 0 obj << /Length 582 0 R /Filter /FlateDecode >> stream xœÍkoÜFî»…>¦€£êý86ö&ÙCc·öæz‡¶´«Y¯®Zi#iãø~ý‘à õX'Àz—Ä0ÉápH‡Ã¡òéµøûÅ©gmŸ͵bÏò#E #ËíÈI¬ƒ¥$L¬ ²(ЗTÅMÈÞú墺p¬·¿þL¹åØ¡õxáL„“˜û‹Ÿañ0²ý(IÓTéêÙn’ྰ=X߯žu]Kn­= rþçÚs|×û?Ðȱ.^¯/¾Z®c­w&|×öpsÄVbû‚ëƒõë‹ûí^²Öʪܺκl“µÂºÝüSl»ö»ß­õ_/–ke®”%ʃ±-£j0Îp„E\O7Tø lŸh@±½ì¡Rm²ú ¥Óè÷Y')Qlòxˤ÷þÌÅÏïNìÅN»øÌ÷Ã@û“]6ÙE\û¼1€Ž#¬­ÂúÎzév`½ØB|µ—oOÛ½Á {8oê㱨 åúöýbucðšÂ”Iëöl©\E•‹ª›Ì` 6lBUw|vÛ5õ“È™øÍ‰1ê¼Ø"g«×nÄ¡þ,h¹wE…bïãbFž¶Ž¾š$·Ñ¶)6ê¶QÂϬ:2ÒwðÊcß›±÷™yàîflj;3ïþk®Yœº}ÝÿÊ:•`•Y³a!ÐΜ€ ­v7WSc‡ê%T…ítŽ5æ{"`pýYîí>;vÁhÖ÷o ,‹µ ß!¸$NÓ8hÖ ä8*žïÄN@Î{´€IqÒÔöbÂ*Ü¢Ý!3fÕ;gd¹…ØäÅbp•®hZe`­V:©Ù‚~ ¼hFÃWÖPXê4?œ5Ís“çdØFg Þˆ²®˜ú*¡§,Äͼ—í1Û2šÎ²Sî#\ãÅöTfŒá¢Ê'qç¹îHqÚ–ÁN89Þ6e!Ú4ÂhS>Uŧ{, WŒ·k‡bÈR¶%q…ˆ/ÙáXŠKFɨ¦žW{Ÿ1ñŒÞ ðœé¹µ§žòü‘§Ðýë»ÕÛ·Ë;KÕ:Ótë¡ùüØ­ wçy!sl7î›Y¶ÅÔŽ$•¾­%ZÔRXhFÆx-T@Oo-Ø8ôã¶.O‡jN“(¶SH.<ŒI“×b›A ¦ ɱӾh”0/ç$Á;EЕ#M-³'NÐ…Ú×÷ÕÞ7°~ó*ê)pÉyÏ*¬¡2Ù¨šÕ ßt]qÓÔ A1òk%0Çg͉ |óTRȧSV»'>¬JYÂôQR(ÉYNæ!ÅkvIógUv²ê*Wx£SzÎgT É8¢*V­Š¾mF\ï ¼®fÎYêŽÜ)+Á—‰‹Bþ T&éC𫳠Bß ¡Jüpf“î¥rid{?{x7žOÿn ‰Ó Ò4òƒ‘¶ÑjÅ4ÔÂðq*¾¨ç<‘êªdÖflf)ÏàgMõ!£;)öoF±oºÛüÄN³€»ÃÔÓo6½I ø=«¼#k°³£߉ìðëÛƒ^ˆBÇñ n™Ê¤ƒÍî)…›z_l ó–Ô_öE)ø”Š!zKZË"Üàƒ=V´þÙ+Wñù;†œßd(`‚Š/ðÿ[. ÂjK$ñ×\69µ¾Žøë#ÞpY‰Ž„S÷bQ)` ›¯õÒƒ­ð ËBDfTÞ¤ €uñ#Ø'>D°ÂP y!•U%ón2:˜¯’¦¤?VZ)ªS´(U¤L}á/Z(“ ³Öô¼q#Ù†2 ÝØï“dúDAJñE%gIQvN…RÉ0yù­ŒÿñâìRš]½ÊŸ™6õ§?¹`II×Ö½ 1%®Ô“p¦Ó!”(J²5²ÐÀîTÊ4,йÂÈí÷«—0Õ¥èÇU¯Â¦®ÈAÃç¶o“ „7í‰é¯Œ®~°_s]8ÎÝŠ_ïºëý¢1ÌPÏgX¸¢0‚—a”̬ƒÛ-¥”Åâ±hEOÈ4 ½,îeIh<*ù܉Y`Æ}XTiˆüL‚ÉÏ>ëçê:T؉9ýµŸ§.Æ™q°–Æ´úÏ{Ñsç$Îä”$’]ô$ ãIËÐK1à–UÞö89„`ÎeZ•gMnë”}Ç“ MʵýpçúÓ™&è'POX3?®á•¤1ê¡|·¼Y¼_šI·=¸­‡læÍê§ÉÈ{Ý“vñžkËâaßQ¥Hy±“…mÇh%|}’Ðõ0ÑtŸ\"ýµMøŸsî8bÞÉŠ²âÃY5áe„‚+5*ÈŸŸ1øo«å/\tûÛëÕÍrúµÅuFÞ”Ýxù>½„%¶½ñ3‘zyé—>]Uûèžë ~b;><œP­=¼º·Üÿ÷¢{®wDžíùü`,¬«w‹»ÅÓýrºá®<îkÐÌͬö´iE‡aøp³ºº½^b§K- ƒ3_œ’ÀcîƒÅpŠ<ŲÉ/ t¨t3ë™î’g»v ÜxFô«F<ÈÎÌ7u™ðPìÐm0•e[²´@?€éº1j ,™i „P¦Øeö¢„Õ+;±#36GZñY4Ôá%\»ìû ÑÌ’lå…­øêƒQ§Ìàôœ&xuóæöîýb½º½ùHÝz¶Ð»ú5¾œší&#³å4›' -fGÛíVÿ¼½4íu‹jyFô£ÆÁ¼!Á{©oZ »s-¦›áþ\ÂÉzò! ù¾¯ ÚgŸD¨ÙÅ–îKõ- Sü½J홪w̰ ü×Ë¿¯/qæÇÕõòf½z³ZÞÞ³©¤*} B'ˆyCžô‘¼hÌÜž  ¶håvAfK÷W«U•¢ë¤¥š›H¥#Á[·}:lêÒð©÷'!2_NçÐ¥¨Öͪ‡Sö kAc ú‡/=uFœ1t¦Ì¿¶Ô"D¾å1”ú/DWçÈ6þaó´†ÀÕk±Ñ¾[„ˆN‡=ap숄ÙÎHš±9rÒçmÎÚó¹×‚zâÔö«ÝNá Y¥gžÉS‘ïÙ>^±“c‹=ofˆÊ ‹{ „%§ÉÎ߇ªØÖ¹æeª(ŠÎYÃQM·:BÍ£‚ÁB¶]SPÇ?öt8Ëée½i{x*Nfö}î’ ¹D—eòf`¾o ºiºº€0{û°Rè‡õ¸¸;u ·jëmýÄÒ¯¿ûgoõ¿¦þ F6’÷ endstream endobj 579 0 obj [ 578 0 R 580 0 R ] endobj 576 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 579 0 R /Contents 581 0 R >> endobj 582 0 obj 2900 endobj 584 0 obj << /Length 585 0 R /Filter /FlateDecode >> stream xœÍYmsÜ6þ¾¿‚홵¢÷—^Ú™µãÔîäåjo¦ÓÖ ½Òzu§•\I›=ßÜ?ERÚÝtú¡wI<Æ’€ ¨ü>ó˜ /į$óÙj;ûxK|ÄÄŠbæ%Nì¦lˤQÊ*1Ñ"Å"É¥Ù6ì§Y=sÙ÷³_ƒI9sˆígîD8йŸý棯 â4Ë2²Õw¼4*'bµe¯n·>{ÓÈÙÊz!ÈýŸ[oZxþÿE.{š].g¯ÞFÌsÙr­S Øw]×O"–:Ÿ‰?>[nÙ¯g‹Õªè:vÕÔ}ÛT翱å³ë%mP®–)äÿđyd D¡k96ð5~B'@p?‚ˆ¡ŠÂJ¿Å€"#é&ü}Ô-$ÊX<’ô×_©üx<’8NjÅ!M ßÛ©õ»lE¡ûøfÜIJ]¾°svDŽÇÎòbÍwU?ל~ShÐ<þ£Xõf”µ¦¹&»Õ¦ØxÅyM] ñ\&w‘£/G,khöuÑ:/¿:ùˆuO-¯û±IkǾ;rb[>mÀ1MÍ„™ÊO}ÃÀ-ÛuE £-ƒC[tÊ{õ6™F'ôœÄõ@p£d¾ë7M[þ›÷%H/ó¢îËuY´JF<•Ž›„®ëÞ“‘È’Ð Ãìð"”ñú˜ïØ7ß|Ë^‹±šo‹ïØØk±aDJÇLôÜÈI½J]’Qy³tœ3ŽÒ™VÕ)V·ám¡&òA£¢…ö‹î™¯ξì7e}`YÎ{þÈ»ÂQŒåq‘І¬©›^¡Ç¿Ã–ôºiÉñéþún’Ož¸l,Oð:gœÝ}|w=d ”¡xìÁ0t¢Ö…*L—»²ê/nkv'2 1ŸDò Cœ8I 9„”/°}éÞ‹0“¶› k¶zn‹ (e§™2É5Ä"tÁW”ßÿvLüD4¤© ¸ÿñzØ7oóù1¹¦˜›—碅åŽfÁþ»b¤$ùImV¥ªŽ -óIÞuånP‰uA¡‡³¼l¡pÈúˆ,™@H~)¹f‹ª2·Äa@¦4îáÜ·Ú<žç¥8bZDO!GTvæ€f×°ŠW¾ÿùÞ²A»¢-x_äSfÞÈ…âL Ç'!4Cz ª‹½æ%yÚ6bAJ]BâX à"´oZƒ#·¯ôêTŠ4Ý›¬šº†èaåR²Û²«/ Câ~S±.Û®?pÛ#¯YªÏÉ(«ˆ”"‘VnroHny.݉èVËjª\úÑÈQФ×5뼃óærn¨6ä“Ïì¹àÕž¿hx¿ÐV\îzmj}pK¤V×Í›OÝæE#· )Ò(qTሪ؂iœååz gnÿ®oËúéÔ-í‰ãpÅú1Õ뿺|w{uâRö£Ô‰ÜØõ¼,ÖÖà2Ùœ¨Ð>Tž4I²ÌMü¡Bƒ  ”ÇœÈ~Ã{"eaT9¥QüªR”yçªeCm“Sjµ^¬‡s¥¥4+Ìc*ðr3˜bXºáƒh|ÐР좎šJ}Õ4ÒPVlÿà!='N‚Ûo?Þ½_,o?~ø|usý^æ .ê †[ ¡¬ÄjHÙIX6X#Hecª/;[ê\CºZ˜FŒ«þª@Pwв{myb⻊‹í»!„'@àGâ"ç†k`yýþDîa OZxÓf~ªsŸÖ}-ùhOà giê†*ùÉ£Ðߪ¬B`ðUÔÍGm%r×ÒñìQO#ygÝK×[™úÈ2C¨»>(MysnL\U»*Œ98óö¶¥®t…tõ£PÕ†#)Â!£­ÝŸ|{¸Ð¡ÆÐô'êáðærq"¬¡ï;IÝ'¬Ña…5hÑÃÐZA^¬ ƒ_=œŸtͬçfY‘hñPPEMnÐR<ÞýÄQY¡VÖ°>â- Z5©ª*ˆ¥KZFÔÒË’h…”Ûš{¨L›ŸÜ£%€ç[èkà>‚Ø}1zÞýÓTÜÔ–QÓt £xä\«¡ò<ãÝ£ˆ¤FÃÞ<õþ1¯ºÆ„XºêL`ÐÐýëÅÀt"™•zË´¡8«¹ØÐJ á²>*è°Jsõ¶àµ%­?ꆼ™:>NGŽ/ cy/QY|×ø¸`R®MÞ¡9šÔŸ7“Iòf®UyhÔç㦌e›&”Xüh«áüðTy{YZôJ³ë©çRwä9aYd|bá /Ç“Vµ-L¡ ã…]Ý]/–×TIOT¹ª\A¯dFi­þsõ.‚zçû±øLC·âsÉwâI€ì¡I¤Š • „*OÈç™ÆèÓÎÑU$Puà”]_±ÄXO'ujÕðé aiÐØì -ß¾“d‰ ¾ÙδûÚ“¹‘$N”¥®ï‡Ôš_Ý,>|ýyñiyóñîöyçžJ‘,u²îM712䀌?—(±øÜz4i*Q„;Â@Õ:Tz ¢ ¨¡Ò@Cz ¤@Øðú©0W`dSq:°`µkå«j`tÐð[k1º$¾Æ/¦Öþ —¦èS­-¬I¢Ä?ræ†ãÕ …:ѽ›”ù†NS¢Ô¾/Uk7] nz*kìK£,D´ovU®á§rªú¹-¿”Uñ¤>è{yÔÖiÇ+Ù”ÊÖ²³w7u”(ÛYâøŠdÁà gtøÆ}ð¼ÑÿMý–ë„ endstream endobj 583 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 584 0 R >> endobj 585 0 obj 2068 endobj 587 0 obj << /Type /Annot /Subtype /Link /Rect [ 155.04 509.28 284.73 518.28 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 431 0 R /H /I >> endobj 589 0 obj << /Length 590 0 R /Filter /FlateDecode >> stream xœÍks¹í»?&…Ù÷£Ó錓(‰;NœHroÚËM†’hkÛ}èvWVüï |í®d§_®½\FH âÁÍï>ñàÏ+ñ“æÙT¿+œOÒ€„‰BÅ ñSšx©ˆ²8#¥X8Š%jJ¬ZÀŽürQ_xäÃů¿Á¢-ñhLŽÞ„8’Y^|æqBÃ$Ëó\ÉP?Ë‹&0ØTäõUw\­¥„¼ÿ¹ô®D¡üHä‘û‹7«‹×ïcâ{dug] hxž¤1Éhäâ¿€¬*òë‹Ë͆wyÛÔ}Û”/#«¿]ÌWê€r·t¡þO©ô£ÁDyÃÇÇ ÞbáoDCĆ1œDL•ʬêWLèa,Õ„¿gÕ¢H9›ÇF’úú#™Ÿ·G†f;d¹£û¡kýÁ*›XQð6‡ILJñ&.µüÇ’Üv¼Å½~ŸL·„B¹¸ßq"6`ùöâã㞷˯ׯº=ßwÅæÛKMf¢Fð¾€& 0Îü©­vEG^’WqLSòBÒ4;Ã}S±¾Ø°²|´èMËYÏ·q,ú³Ëk~´À–õlÍ:";æpç5À»7—€ëÇ©Ÿ:JͪsÌŠÞÙµg]wlZgšµõéh1‰FZÜò»¢F5À\ Dk;V@`ÓÔ5ßôEã,Ø· ذ/xgqǯ§»ê{‡ls†…Ò4®¦§ûÐ|gèè­Ô¢.;wmá@BÝ3çü½3î& L“‘÷M×ëRr÷=ÈfZNlv¬¾Ìî\H›mæn1gSˆö´,DîXyÅ`»‹QzUP·Ùñйä×ÿuÔA­BuѬt0âåq`µ­§^˜ec/?ÚƒÈëGÂj<­¤ÙïXOÄJ7/“‘–w‡²Ÿ‰©–°(+ì~zRrÖõ¤©pn-hÏБÂs2Š4¾ŸP?OA]®®n>_¾ý8ÿtIà¦ôLM—…ÿŽ CqðŽÜ5í©c¸Œ“€†0Ž ªRqRš2Êbi¶ÕüÓ÷Ûå|±4È%Ó ’Ã"z‡€L  JAgÔ±T]SYüGß2;Å{¡XËKÐ,e›Ý€5œizò4üòvõñfqõO©æ%‘ç$æxÌhy 7Võ Íæ c j·XòÞⵈCqÍ=Eð„‘ÍœU:ÂZ±jVe ìÛâ¡(ù½»ü¾eµÎ^¸£±cÔ9#ԙǙÃ`ŽãmqwW©väÐ~6QFàe#e˜ ²àwâæ6ÒQG³zìò ~˜’˜¬Ži|~õR†14Ù;+nPŠ!¸‰4uK åØó|èNÒ'–CHß÷pFá¬Ê‹„[ÞmÚb/3$x•8>Z™’ùVíÁùÖ¼lŽ6ÕŸGóÈ÷SQ”åiG9”aíý…!h&Ú¥œD)¨Û§¢¨÷`š“;(Ú^ùŸÄ¢U$Jò!ª(—PI†„M½HcœÛ—†GNx(”îî&ÌÍÚ©@%Z@xÄÏ $H'Ø#>™ìDEðDîR¡‘‰D.âgTëÃP±°\J‹3æ­¥q 6¶ÏXºg…kG¡ÆÊ1~N²Qâ D¹žB òPݳùõüíŠü‰¼_Ü|:‘¸è0©L"dB?…l¦éO\]¾¹žÿ²¸úûÕõüÃ|ùD®’ŒF‘›«U“»(îwýS:ÈÅ ?Jpç›G¬ZD'+êb&Ë ‹2…›„T¼s0EíÌ»—D˜ )Õ¥Ëyíraò4º˜Ãùdz2M5ÇZ¥M…xsèÿËÝgÅ–)hbîЋFjuÒ×7uÒJë|{ 5šŒ“Z™5lõ׈¯g’q@ËUH¤ZP‘&yƒ;Öâ jZ®5"$ÿ˜!´ævèÔêE§YÊbgœ]^kµ§b[5úåjõG—ŸW8¼ù"\"pUk†…!×ñÙô¸a6:®QèFèhX*¯9ô_º>ËŒÄDÈŠGâÚ±:ÉLà„Þ¦¢r‡‚|±úäYÙ5 䩇æß À]ÛTÏ[3 Šüƒ¢ÕÏ=Q†t=44T&ƒT¥¢‚ä±T—©Pº+BH 4\0,¬²nÚJ¿höò}ÂÅwÖ¦OQb- È]‰ò+}ÐMtó±9ŠÂS†&hG}é¯È AìnqÌì°Û5m¿9ôÎÆËëk Ø€ë¬0'E°â¬v©—å@ 5¢°þÌr¨óq Ñ+B(âÉT‘jmÚ¿žô‘¨Vΰ"¨§°.6‚N¬yÉˆŠžÉ(Y™â÷ġҜæ¢S Ãä¥çÏä‡! ª,P§D3lÜX¨ùííb1ÿ¼’)Z—¦ÄáB†_0JÑuŽ]¶¹kSWŒ‚œú¨ÉØ^S}ÔÝÖÔLüqܰ­h Z–"´}N?AèÓDtÏ^âŸàŠ âü¼‚hÂTÆ'˜>z*¦y8ñøÅ> jžÆ‰ÓÔ?QdDiH#°´»pÇ{¼õ‰O3ÝÎ,¢¨7åa«Ë$ê¡àGwÉðb!N%f°~À±t¡s„ŸBñû–»´±É·ä%k‹þ‘Z앳½pvº/cê¼ÍH4 ²©· ‡º³ «‰¦„^¾Í}õÔ8%ö|$ñ£ø)²æá?8¤UN–_¯åËœc`]àžó»¹è̼ >¢&P’­#jÌ–wÅ} ¼:ƒêýÖ^zó/Nªbž¦¦åÀ:DF„ªTäg†úœDöœ3ƒc–ß‘cy0ÆŸqª™4iFJ/jª–³­xGeú>*o7͈ ¥˜íX u̦ç4'L‘gÔ‡Æ% ýh`ŠP¾b››¦à15´Fè>ö#àØ#Tïê2¥‚üÄŽ ~Ž@Ì+.qeÂP=³»t!'CܧµjN/e*@‡Î— —ˆ³ÒÛæ8ý²ä{#ýéÓ‘уbØœNè¯b\ð9T-¯Ä¾M"vìŸØoM$ Kº'…i f¸ã·F‡qìŠ3v÷Öh n¦ÍrµéPgòhŒ¨×"->õÕD>/AjL='_©;`Þ•ˆêŽ_šPDT4É“RxáXà$‡ýV|H¢ƒ)ðÌÙv endstream endobj 588 0 obj [ 587 0 R ] endobj 586 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 588 0 R /Contents 589 0 R >> endobj 590 0 obj 2601 endobj 592 0 obj << /Length 593 0 R /Filter /FlateDecode >> stream xœÕYYsÛ6~ׯÀc2ã à’踙QmÚu›Æ­¤ô˜$4 YìP¤CRuÓ_ßÅA<¤¸}è‘Äv ,öÞòÇ…ƒü}!>Bæ¢t¿ø¨y ]äšEä„8 Ú#MD4B…Ø8XŠ-zéI®Þ­ˆúiQ.º^¼û›2D0E 2®Ä¬?Àå4À^1Æ´®.v¢H\áá齼ٻ貒»;í… ò¯kokä9î@#‚î_m/¯(rÚlM 0.!Ä )аç2ñÇE›=z÷l™¦¼iÐEU¶uU<ÿ€6ß,â6Pž–)ä¿Ë<< >>±r¬ç.üøØS<à`—‚%âQ¡Ãª?ŃnI¥›ÔçQ·hQÖáq¤¿þÉËÇ#ô€ƒ£A±|?L­Øe“(Š»C&)µÙqô½ˆˆþ³U|¯â7ñÚðêü·¼à÷Ö¶¤(ªÇÆÐ­-Cyæåßí Ï#ă‰ç÷uR¶œ¿êŽOTw]ïøqK—ʬ3¾ÍK[o³¼º]Å7×o ãÛøC¤UÙ´u’—­áU嬠,ßnyÍímrWð3eˆåy—Œ”~ÜåéÕ\ž‡ÂFÂò0ªjI4<Í·yŠÒª8ìËe¼ÉïˤåÚê=VÌúPáÉ律#â09¾‰ûfus}¯Ì9¤#›dY^Þ£µu~Ïá¢Ê(‡»…Óì (vCš4:yÍš<ãÎÐæÓüYíÁ­gèb—ÔIÚ‚è5o¬Š"ió žl š"‡GŠq4! —Cúܦz.(øL'eà YÝýÊÓ¶9³8eñÉPo×ËëØiRâÎ’£ò4Æ£+hVÌ x+o̺ä<ƒPöô㎗c•çOöYcÎòöŸ&Áglè§¼D`Þú‡×¨i!—ö½§‚ê¸.vÎ{ZÀª:´PY'Bãø0Ƙc¾?NàHõ•ÅÊË´8È´ëYujÞž-e{(S‘#¶˜.ªŠŠŽ/Þnb[¤ÅÒ¡VÄõÀµâlvysR–ýXw há#ÏȨ‹òÒ^A åÐ@d»€¢¿°aG€Æ…¼âÄ×èVÕÀ‰°¹ÄÁ' 8`öIaÃA_F†Ñ ‡õTb=1MÔb&efïnx-hñjnˆ²j !]ÒS½oæE ­-Ayc 5kbÙq{Ö0ªZXbé!K¯™¶w„®SMs¯#EÔ‡&8¨¾ÿ°ˆÆþ÷=ì„”PÝ@»€7²ã/í®ªó?doDÂä9L(À||ƒäC)3â æ¿8ãYcîêXEÞ´Êí’¼ã0zJN‹žJk®´ê—æ ®¶>¤ƒçÕ¶_¾]Ú;·º}›*ùpϰ•¿^-ßlæeÄ?Þ~O‘‘/†ö3rÆDIƒ¹y¦ †\ª¶¡N4bD+Ÿ·U]1ÍH«ê¹ôµ2X’Ú`¹n’½Ę^[JÍ@¦Ñ./ͦ~55’¹·Ÿz¹#‚æÊ~ƒ)!oR(„uݶIÃdK7œjg`êÀÜäéºXÅKhê"iºcÁÌ1/Ä0º@;Wƒq'’ 0—‰øþÙ×Jjè«ïŸ…­ ˆ2Láræwàé|$éúâ‹/‘¥R;JÑ+ôýr½þévu‰ÎÀ9U½BïÐòò»›7èÉfìE.&ÌmFõܽì­çõ8T-Kþhy¹Ù¥kA¹.nItú`Ã:ßý3J! Qí¼»fOêËcy‡â–§,š‘eiÛØf˜µ…fS™ 0™×–7[Ûæy‰Yu€Öÿâã¡êzÜÉíiÒð /ˆùo3߃W÷¡!²Þs‰C#Gô")[/›~ÙjÕ14YõËÃ$¨¸÷¬ã‚„T!ëdª‹I¾£aqØ)sŠ'ý Ú»ÂnŠhZTeÓcÞîÌfØZ§ÈôTÚ½X×”ÙÜíÀ̼ô`dƒÊ ‡ø˜r$¼bñUWàÍÈ…{Ô‡þɳÖí*³4¡_ôxvf1õkµ¦.¿ZZ”hšÇ„iÜjKªŽŠÕ}CS¢ˆ±Eßj4­Éd´Õ"u|ÿ†îkŠÿÎÓCË¢ò)ÚòhäÚ'!cÂC½Z¹§gÂåêöûÏM?ð0q²³0T§²ºz#Ìò§N?¢ØàU¤êÊœ‘¦&J¯œ=ONL JBèѾÐÕÑæ Ñïüª>½.Þ#øïêD±ªhCMXß5@ÞÈ«rõuD2À›&z˜Ÿ©Sj°çò« q¼/M‚ûn¯#Ý—y•¨›dæY"Kdn¤RI•"úO{ë¡ÔÅ‹ÀxWcçåë ¸NúcŒÖñ¦ŸÅ'¢MCн*˜:]jñV*ØuPí©ý£N¡µF>4XÆtâ'E«+Ò+° J‘âRCõW[L®¦ÈC)ºƒÙš<]©àŠ¡…à 5tý¥acÛ>?kà˜çb€v­H»Ø%¥|ï |u=D­-ûC¾<¨¥ìjÙ§vÇ蚢N|7 Hꛉ_¿LëåPúpã˜B£!GgdõÊÈž=±@!½clïÆØ-±ÄDÖÔœÚû9DøþHûÑLuù‹ˆf*à‚hôoxþPkÈ‚ endstream endobj 591 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 592 0 R >> endobj 593 0 obj 2012 endobj 595 0 obj << /Type /Annot /Subtype /Link /Rect [ 156.16 186.966 266.15 195.966 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 240 0 R /H /I >> endobj 597 0 obj << /Length 598 0 R /Filter /FlateDecode >> stream xœÍÙnÜ6ð}¿‚63¢(QRàØØNëÂmŽU‡$²Vë°+9+m£í¿wxS×Úд¹<3"çæp†ù:#ȃß'üG”ø(ßξ*A‘(S¤!aæÅh‹‡1Úð…/Q TµZ"kôqVÍ<ôóìÓX´DÑÝÌ0—l³w J·èÓÑ<Ï‹¦AguÕîêÍñ”þ:»H•b·H!þDXäQçCxÝ/NŽº¥ÂßSI öC°„Ú¨°ªŸüƒCá&ùsÒ-Š•³¹$á¯)|: Ž;qHˆãûnjý`— ¢ÈeOã RêMµ¹GÚ7ÅÝ•íµë¿š#H°åY…ŠoE¾o øP6(¯·Û¬Zbiÿó×ÑPõ0K(dp”¨¬½J/Þ£ øcŒ)ºüý2½œ_¡ÅÙ/¿Í536dRì…!¨1ɬ)Z¡bY•m™mP“¯‹m†VõN[ñùè—ûÛb·xwõùXsN†œ£êY)Oœf›¶ÃR V æ2¨Åê/RºÆÚ¬-¶EÕ¾Ô”/~Ò ô‚B„3|ꊪ²mavsO)P9LÚã†3êY!=ŠN•f’ß_èüâõüÃUªý1’ÄKpîéX²:[gÕM„!dá÷º†­$nü Q [*·,}<;È»1%z«€ýÒ ×÷\«l¿iG•ƒ$±ìtôGp³w˜.÷»²ºÄ€ø¤ç9®Ô e8à¹Ó4e]aK¹\Yx2?C‚½˜_¼ü ø?Í„ÚmÅ Ç*˜»ï™E¥£b]¨7š€i3u,.¬l³éÈÙ5Ó*8»š mž&¼³U§ B!‡Ñ¤´ç/~ Õ±RåEõ]# ‘8½mryZ8É©I…´ÉZÈT¯äg•CÑÐc‘ ô¼À¾«:›>TŸIãŠs22Y ¯Þœéj3Z—!¹pAiòýn]ªf{«¶Ì¥ÝÉMCÄYš}ŸbŸÒ$¡!íÔfÁœKì^"^^åe%•%ÏþDéûP_ϯèï5Ðàœ'¢Ëi!ÊÁIh3‰ƒ=u[´ëz©1•…½ªØK.†µ°k,]—æ‹ ©&¬í®ÌH.V«"7Kjž5 ¾=ͪoàÄJžœ¡ƒtôüÁ’8ˆÕå+R6“˜â‰$´(w|ãोUv½)–Ø!]VÒ®;Ë­+¡^9HWñgÎS]žï ðŸË¨ìJu Xfmv5.)Û¹XySÕ»7^ \lèD–ôœèFÄâŠd“¤o ^TÊfûÌÒš}¾vv6¾:Ÿ¿µXé|áu[4]»; 6¾×ù²²ð}½·È]æ2€rè2°ˆÈsÇšÛ¬iîêÝr趘ôÜÖs’løšÛ"/We.*ð Râ„w$`ÿ^A¥>ŒÆ>tÕ±Úãí|±øøæýù"Jƒfgõž¶ŠjŸXá­›4‚®!H—:ž”ðICmT®]-²Ùtäìšiœ]Í„6> #\Ù]7èî‰öЏ$˜ä•hê.nŠ[(u­C‘o‘gÕòVc—!¨ùËàMt‹­>ÕspG¶YH\`d¥è Eu§zéÐwàÖ®ïL^/Яɦ•±·10öÀ£Œ°¬f˜M¯^H âŽLwYÕÀUà =.$!˜ÁUÀe(Ždz58ü¶5Ùè݆0ìA—'‘Ó=ÏÓù«9Œkê¤>áÅ0â3|÷ž õ{:„ó%Õ#¯#˜¡³¤ &q[­cD|¯3HHÜœ~:ˆ~çÑ<"úöÑ·/‚4Ò¸r”B§ ™—ô»\‡Œú˜°?éNÈ$ ±oŠÄœB£(Î)“}Ì$Vw&B‚‚]&˜år$VØ&k —ùµ«š¬K‡b¦Û1K&s ‡ô£’â„B÷Ò{¹’iÁ0JAÐác“b22l¸«÷Z¯þ§è!©Òè endstream endobj 596 0 obj [ 595 0 R ] endobj 594 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 596 0 R /Contents 597 0 R >> endobj 598 0 obj 1927 endobj 600 0 obj << /Length 601 0 R /Filter /FlateDecode >> stream xœÍYmsÛ¸þ®_öŒƒàûšYb|ju–O¢îzãót ¶ØJ¤BRÉ¥çþ÷.^€"%wúáÚ8í.€}Á>X,äÏYðóŽ}Aëýà³”Ù( Èñ¥Èó‘`ß ÑI&ôB´c[$›"I‡KålÁlÑσ|`¡»ÁãLÚ {èëÀê(j–ƒÁ¸çcÇ£(’¾l‡!3á`ˆõ½Ÿî š|vã=SdýϽ7=rlòà‘…^·ÉàýGÙJž5"ûIJ,x(ĉØ?‚’=z¼­×´ªÐ¸Èë²Ø]?¡äσ8‘òÕBþ˜ã¨5à¹V{ÄÀ˜’k)üºØ2`âA$lh'Ó*?Ù@Cz|›ÄçÙm‘ªŒÅ§IâûõG?ŸÀ [yˆˆ±÷mhýÁ[ÖÉ"³­‚ Nƒ±:/âQ£Å|‹˜Þô»« Ûn¨´± àGц>gyVgEÞ,ºK=G~E¡'VO–~@ß}÷'d¸ÄŒ<ÝÓèýk20ºÑHžê—  Ã`[6€«½‹Ì†Iki*i—°F,‡!ܧN ¥w‹Ñ}OÐí/ÀFHˆ˶,×’h‘¥ WMË}–§o”=@*öØ=î’àÔ°.dM ÁŽFaDä ÓE×ÉÕbß'[-ãzU¬yvzJ ©°½´Ê£“ˆcoÛ8ìÂDŠëmZkŽ']ÒÜ£,Ñ)I—ôKñÖhj ÊšÙ]v(³/ÙŽ¾Ð kaËÏâÀLwZrvÿ;‚+Û³lBìnôM&X­ Y­ƒ”(ú$7=û E;‘EvŸríÝz—ê;)v’­ Ù×ÈãÖ?QEÂÚb2=åKZfűR¼:Z$S'˜-áÈïÏ£WO ñOó¿ÄŠM×l»y6„€×¦Æ€öS„©=ÕnäEÝŠæ¦w} ~ÝݲÃön~ó`4eå׬¢7(« 3åº`¶Ô_*Žá(ðÁR`âäRWäÛ8ˆ¼ˆ¿Št•@ ÊÿÑÅä„ð‚‚î*²ˆcy¤Ð2N†’÷U#bÅ¡¡› n¨O–žžÌõ8·F©|TÔïz¿Ø»ˉ¼^aŒÑSÓà ¯æÉt~Ï¥}ñbgçÂÊ…4E–+‹ù¨ª²^³ö|1Šˆ–ƸºÉš±O§ëÚ˜\šfµÊÔSjšÝf¢N >N×[ÍM6q}öªdm´ÝÚ¹³{·ã%Ú…ÌpåWoï²n ¬…mÅ0žÏf#\¶JÔÑÝNuZ~K©rˆñ÷£Åhœ@—'Ë8Ñ:¶i ׳xÖ1IEëËê8eKáI×ë(8Ýù€Tí2° \…^ÖPιWE%¿<ÄŠ²òŽ¿ðy#¤õ·}SÏ2þqß ]ý|¤ùºÛFyVtâõ Í™¿¢ª·eÆUf\®U”„µ’”Å:ZªxxØÀ Mù•Ô]¿˜¯’é}¬õ.?1ÜužØà<±ˆÝ½«û1ÇÉðù˜óÎK~òŠóqWì.«jc>ÿæD[7’À?‰„ygÛÖLÀ½$Ö¼14½‡&4Ñü£&›($«Âh†Í8¤L"ù&’fIÊ•O½.®&£$îF†'‹[š>éºà”9ØnH™Hù-ØÆm9¿ñºWÛ“¢^µˆ?Æ V–Jtâ[':£v4ÒŽá­ôRx'½’³žà¬–£»>“ÅôîŽ?¯ã¿ÆãUÏÖù„ÀãÚþæëÐsFøm(%ìÄ qWŸëbÇ - âiÍTÈoþØ!m½Õ³ ¼XkÓ¼Våþ ì…Aµ endstream endobj 599 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 600 0 R >> endobj 601 0 obj 1984 endobj 603 0 obj << /Length 604 0 R /Filter /FlateDecode >> stream xœÍksÛ¸ñ»~>&3B$AfÜÌ(Žœsë³Yîõ&çéÐ2e³¥H…¤ìzrýï]¼A‚’~¸6/ï.±,û ómâ#~¿a?h ÕfòMÒ|DDbIŠbäS{ Ú ‰$Q‚J¶°²%$œ*W äý2©&ú4ùz ‹n‘‡#ô8ñáBÌåä (bLâ$MSik€ý$a*ŽXmÐÛ³M€>Ö|µ²ž òþçÖÛ?ø?°ÈCw“ËÉÛÓùZ®M¤!ŽÏó¡“ e¿´Ü ¯¯¦«U޶褮º¦.__£åŸ'³¥Ü çæ!ÀŠyõD¡×bئ*ü 14 à ‚°G¥ìAbÏó£Ô¨Íéî³N#«¬Òð1y׿·¹Í·yeк²D–îikz=ºf¯'ˆá@ŒÈ󮨲M¾ß $!ؽâXÛ'Ó‹²ÆÀ·E»Úµ°s!Û:ÝÀˆ+˜bªíqpÛäE½kÞ‚ÑE]a…ŸÖ3͞ݔù‘е‚öÇLäÃ{iS׬c% Çø×ånSi´,Ún¿ï‚$+É’®tm¥ÞaUwz³Û|U¬‹üöÈò̸—Œ‰qwMVu#&¬ò",!g¬ÃKÀÊ™}¼/V÷+ªU¹»Í[MÈÊRÃ"^źÎ,γXÄ5ðÓ`e“¸aÙdfݱ5»½Í°®¶ô[&ns½ëvMŽ5.âJÀM½ëŠ*olNÇ¡a8p(»RŒâAú‚AR)¥\…Ê´ÁÀMÔ! …^Ô=Ö |Ìž„u É ÐÑ(,kG4ßåUÞ+…Ú–Ž®—Vô°B~‚$Õ\~9×ʲ~lÿ°¦¬çŸ&_çM^­Šêޱšèa±ó7eÉãà-ÜûV=_+ùÓò%£v{¨•{dÄb#"š°¤lÔË(%ÖþËm…"ßk0Yaë¦Þ8j¤ÔAdg{óâdà}§xA¿|Û¸T‚¢N‚#»ÖBd\qxzó¦!qäj?¶—„,gØÎä¸âÅ]•uus ÏÑÊM˜¦ ¿£ÅÚLm`žœ j걡µù6k²./Ÿ¬]WÎ3Ûwâ„òªs¼žx‹ÄŽàÒ#p"ó°Ü5vX}Jk) ¢ ÞWºÏßA€C6}¤”Žð‹Œ| ÚÒXðÓ$áGŽÌ\~iÁô /j‚Øh0šý+ÛlKp"<ý´˜^,QÛ7àÄjó]ñUä&‡kúN7‡NCß§¬gKi…°+ÔÜMXø°ù"€ª• "yd¬¡™{ãCõcO‰xºAaœöI%#ÙJÔ—¨ûHy~ûÃvR눨£C’ÔÔç(×kY4öì‰-ýއ b"ƒ5Á@OÏ&ó`ƒÄŽì¥Ì#ŽEñº(f}¯³m¯ï¢¡ne}`ÃóZ÷¬1CïHÒÐ9ºó‡¶zÐøûôU¾/znô"Œ§ççh~.g_®f'3”]Bª„ ’£åœß‚ysÕ²ÒçÜ`a]WHl—³óÙÉ’ÉÌ–¬ÏÈUž2AIº‚ŽÐÕçÓåLœ~8ŸõúG¸Â#ÈalÛa<"ü7ÙM>üöZ){ÆŒ6ŒíÍUœ²Eab+Ÿýmvr%¶tùyvrvzv‚ó«åÙ–)óï~@B)ß?:ÕùIŒ ©Ø÷囑íSœBc9 ʼlw8I6<V…#¼‰ÉJC³ðYì[šnò®“]’][‚òµêË8žçZ­ëfqp ¥U Mk!²,÷pŠ Ð*ZË+7Oî ¦Iß±¼Ÿ¤¼1ÞnËb•©É‰Ód_CE‡ËwÅaC•ÃÕ•š@u§¦e§²3i´ø³µ‚Ö»F6¤]Ýg•Øœào´æ ô{®áêôT÷?rY;Gÿ“¥ÌCÙ+“žÛv]½_­àŒž Ö­ÙAÂÖ!Ù©1{ØNY†>ó>{ÈeûPªÞáí)uã> {)è H`]0ÅpDäà *Ùˆ~‰Ÿ–.é{Û@¡H¼™¤½ÞƒGID§'ÃY Zè{‹øîÝŸ,LdƒDð þÕ‚¿Û|«z³ÉÞÿ€¤cŒ-ôÚ=É$ío2›Ø`&ÑM—"|UÀw½Ä4Ê¡Ô3øÚóËÙò'O?þ|v¡ùçåÙüb?#÷çì£B?üêNêž?vŠÐ‹£ëy–ÐõGPp¡P‰–õ¼  ‰³o5Æ/ÜØžâÈÃktÎs¤³jS7ùYbÄðY”qÃxvqŒ©_ dÿ+0?±§i“‡<ߊè¤0–ñ·i–o¦ÏÂÈYÇó¨—üWÆÁC_Óç%.öp,Ë–w­¨u«›ÑE<ƒ”gp Ë %ƒf=ô©Ø&RAÈß™©û"Q}e$nn$ìth=°úÐ’éˆRc¶íšÞ›5³ÇÊ`j®|fË0S°ƪõG´¿ Â’ðc‚|=$ÇGާÊK·; !ˆÖ·NÜQ¸s5¯ÓÒdæi…r1K²Q’Ç{[ÇóôªÉy?‹î^ð´l4ýÁá’@Ûéìõº.!ƒ³É9é͘$†!X,RÃE“%¨D}Á/ ˜@J’ÔŸçFì áþúŒD¥=aàØ&ü€AržtÔ=¶MÖ9Õõ–²|3´¨Gx‹Øú„JJ«&õfL×šÞ ÏghÝKfÌžwÉqΓP&9U5ˆÅ}8YÌØìvu9[ h˜wcSa¯‘€‹S±¹s6hm·ìnŒpAÏî‡`jÛ³•\Ï&§½ Sp3c¥=cB/…Y8ô|÷$^]N?Íúãu«ÆkÈ {ÅùÉÀÎÜ8ëFûå0b·/Z"Í\Ìþ:ÿË é!à@çÒCy_}giò‡úŸ/ëšÃ”âÀf(Ð2‹Knó™Åj”Y{,Mû*_·Éêu:_ ktl}eD§‹ùÏî›q8‘B«ù„º úh ~7 iZÁ唫ĮGEš.T>ü:”ÉúÍ1)‹Ùårqv²4”ß x2½<™~œha" IêQ"ß;,ÎnÓ.Þn²÷œÏMZQDp?áŸ^èØ75 ™) éGÍ‹®FpÅ野öˆr$Ö¸$MÌ[Ú»Üò±3S=“DuË$q}cçuÜ·@ØwûÒHs¿fÀø<Ür޳4ìå,˜Ý{(´Ç°)G¸è¶ËáîêT¿pU¬‰ éûð;êE¿-ƒ}+„ §”Ø>Óžb! HÖwyù¿gþ~h¯… endstream endobj 602 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 603 0 R >> endobj 604 0 obj 2646 endobj 606 0 obj << /Length 607 0 R /Filter /FlateDecode >> stream xœÍRÉNÃ0½û+Þ¸;vì#»àDâPõ€B I£&,¿í¸4!ʵE3~3žõmYr(j¶X‚L@ê)$ãš jăQ•w©Þ%ª2 Ñ»?¼â‘máš-WÎéľM‚÷aØK®4—ÚXkc­‚'Æø’k§57µÀE¼wÕû@ôçÕ+’‰ø^ØYÎW !_ï)`S®‰LÁp)¬òË£Ó¢(»çÍæ½mªãò[v™ÇÃí@!ᾌ *¥±eÀ±|º?å²ÇÂ…rxS×¥7ìTÆÔËÙ±ÄPƒË¿—æuÈäóûȤC¸íÁ¦ƒÙ©uà‘M¶èsÏ7CJÝ—ŸÍ[‰'8B•X·M®l;4m€:>¢Ù7}öå endstream endobj 605 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 606 0 R >> endobj 607 0 obj 317 endobj 609 0 obj << /Length 610 0 R /Filter /FlateDecode >> stream xœÍÉ–Û6òÞ_Cö›Í}ñ­½eyÙìÖLq µ˜p3—Vk¾~ (l$%µç’™8‰P P UE¹ñˆ 6ü'É|’×7_$Î#‰O‚X¢¢˜x‰»)©‰Ò(%_8ò%r¬\ÀüvÓܸäÛ›ßÿ€EqˆoÜq$sób'ˆÓ,Ë$¯¾ã¥)?"pbä5yõ}í“w­X­¸ç„Üÿ9÷6Gçÿ_pÄy6V÷áßĦŸMD¡;Ÿ±ÜBã þ q€qüçS•´„üåj Éð÷¢$’”µy©W!âßy¸KnÞlo^}ˆˆç’íÞÜ¢$Œ“úÿÇ'Ûšüþ"‹^þA¶?ܼ߮¼áoVÙÊŠülé¹^{¤—‚Ä÷f‚ ÊâÈu]/B¹Þh7²ž$yGGJîòœ ¡MA`ªy`(6WÖ«—5\Œ=Ô$#IòCÏ ²m§a(oÉöÀÈw÷$ïØ#«Ú®fÍH¾íÛ©C‚¨» ™úNâ…Y!’üæ{,‡²m^“È 2ò n¶s'pC`#U’µÝ©/#yI6œí¾ë¹øŸ¯1‚U ËŽ†e}]üT*=|èi3Z»ÇV‹rûr7Ì̬­E›OB q,ÇC;˜6'3®À×õ-äþÂU%Ýñ«Ž fŽZ«Ä§À†îñPæ‡s¤1·µH÷íq³;màG£v§µæ¢d¡9JrñÜ:äŽüðîÍÛË×#£ð–A&gè|Åí€zæ ¸ÜYE Ÿá~'5{ 3’Ùµ`I⤞Ÿ¥©Ÿ"=|®6¢á½ªË¦¬ÑíQ°= ”Q‡ -Ž©â‘–¥îrYUbF¿¦6±¶¨²`E k‡C*Ù•|Pkªn-ñ nU±€˜{™¾Û"Ø|WCkCU{\«”\3•òk¡¹„ë"˜ØÑü/~øÀ«Ï?§ºã3<Õ+!ƒâ;¹‚Ö† =× ]^ü@QiÒ¶ŸYÑc„x ®–t”…2>öˆÜªRd¹Æà xò°B¸µØ‘qk4±Ö:O™A’ÚÏH=Ç |­.ß_¨k§¨„pè /!»o nw2c¬)NøöJÜ—‰V¼Îèƒ+­ýFæÐ¶G8Ïý×üH«‰Y‡îíͳSua­Öº\.æAìb áBÏ'ÍQxfw÷‹çĉ¼™g¶Ú‰áõ“=HׯrÔF¨«â¥ ±ëajEØ·m5Õ v??ALºx*læ=Ê„ÇêdNƒH8¦$¤`ì·Eæ†àXƽëkÔ㇠õjŒÅ=Ž n}âØl‹t5¼&¨n%BóK‰8[’fªwØR\2¹”ßõyã©[çáa.Ô'{+ž'º£BùÜ;çùñ0–ù`&ÐÅqÌ(ær‹`ÎÀ²‚À_M{´æT®ˆ¼*è&Ϙe‹ˆ+ûÔº++f 2“jÇà[ÔËq°ióÄÛa¥¬ÈW¾¦ŽMø^¸úTµë$ªlx© “2‰íYMËÆÞš· ïIŒ³EðZU²3(‘JÕ‰4HóÀìiY‰J@©P0ªÕ9bóÕ"µ×êŠWÉuq«0ÖZy^ê$©ëú™ìÄ,ž¡$½™Ï ÀV'bdäE`´×bF¨ Ë•S:Y6ô£hÍÒó©¡[.ï7 È85oÔž¹gcú¢ðšKã(¹"ÊO DþEérMïúWèXü‰îˆe«Ѿl§uÓ-â½K›Øñк›ù-òœŒ'Úi¬‰|½@^8ÿà‡ášÑ #YâÓŒj©cýX2Á«ˆd2€=Ç:°Í#®„×x¿l„(¸²ÿL(Š<'ˆ3xmÕ×¾;»©é‰ðûAÃ¥©yÀãÏœ#¾ŠÇb빂gŠ‹¨ãŸ’yÙ™8ÃL†‹€á$õf%—y×ocæd1·Tr†Èñ}âÏÿgÞäûüò²Á]NL§ÙB'è‰BF@T yžm^ xÀw–ž9ïùd ó‹Qð ¢*k¨U0;•¨q¦l(œ±ŸS³ë~‰ÂdØ^[; ––Rsç‚È'xä=$pÁœu#äíÕ‰ˆöE÷£üÆ'–WG;oÿn*«ñVd}è‰â«˜ñÕrÈáAÔ}–³ÉdÌ}ÁÌÝù™>–ÖwÛ³Ydø½Šns¨®/:ýy5‡°,«ÅX÷%<ä}[Uª“ƒ8{oÓbEèþÌj»á(ú)Ò¥Ëv_§›jñn€ø5^`†+ãÝdƒQ•0·Øü¹Ý¬¼ žk EWy@0“DbÚF6®Ô’IªtåÙˆ0ÙL0K2jØÓh Ç·³µÆ€ A ÚÙkÛ?¬Ï-X^ÑÞä?iŽœeNõò2u«õWW>ÞüßF?Í endstream endobj 608 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 609 0 R >> endobj 610 0 obj 2814 endobj 461 0 obj << /Type /Action /S /GoTo /D [611 0 R /XYZ 72.0 696.0 null] >> endobj 464 0 obj << /Type /Action /S /GoTo /D [611 0 R /XYZ 72.0 288.9 null] >> endobj 612 0 obj << /Type /Action /S /GoTo /D [608 0 R /XYZ 72.0 720.0 null] >> endobj 613 0 obj << /Type /Annot /Subtype /Link /Rect [ 255.194 456.6 356.038 465.6 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 612 0 R /H /I >> endobj 615 0 obj << /Length 616 0 R /Filter /FlateDecode >> stream xœÍksÛ6ò»¦Ÿ’™áûqss3®­¤îåäÔb’ëÔˆ„$6é”Uÿû[`A|È—Þ‡ÞMÓñîXì » @_/b×üO”¸$;\|•4‡D.ñBI BâDVhÇä@$1)ùÀȇHÐT9‘=ù|Q]ØäÝÅ/¿Â œØV@Nö„9²Y_ü‹¡å…q’$RV×râ˜/áY!Ù¼¹=¸ä¦£{é9#û.½)‘ç¸ÿÙdwñ}zñæm@›¤[žcy6˜9ñ#[žËAˆ‰ô@~yµÎöì@[B«œÜÐŽnhËÈÝæ7–uíë_IúãÅ2•ê ^" \øY"ªß~1"NÑ5þ÷-i@±ÜôâŸJédù—èÁ@ ÿž5’deL»LXïÏ\ü¼w"(V<ðŠ¶ÚŸl²‰ùÚ畱'vE^“K7°òª-ª]É4žÕåñPi¼Þj¸Û!,ó¨1ic|ÈÙ¶¨X® Ø ¾½Y®ÒÛôgK“Rs‘'Z™1¾íêÆäUT¦tE{^Úl鱫/w¬b í¢U9úذkŒÇ9ñ™“º‚-J^«ŠXþðš9«º¢{&-ûzdUƤnHýØuEËòyA(cÉzùÓÇåêzIj±¯-\÷Í[¼pä=?¶¢8J’X ð©`§¶?ãíȳ"϶m ŠvwX!yõévùYch0„ÛâP”´Ñ„®Ö0Õ`zõýû¥F7ÇÎàgÀyÍ îUm|zdÍV`©òY³ºê(ú M}2`JÖ-ê=iæÕ3ÂPªÔΪ^¹ÿyq02éòŸî—ëõíÝjÁç:P'aòi_d{G$Ro;V85àõòýò:5m‘y´nOM´a[Öð3á0q^B |϶¦ÄÒ}½¼&"wtϨlkóc]µEÛ Ô3GO,˜D# b]ß­ÖéýÇëôîžýDØðhQêÁ{&(9ßLBCkÂß}óœØë£^DÃ}à,Ž-kÿ2ç{VÂ÷·Æ8ïÁuƒÑ0gnܰٹÊ^5´Ïˆ´]s̺cc¤#ÑÉ qžZ¢)%_¡¸¥ ©¹Pï’-5x6ì±a­Œ É·2¦Ö†µ)ª´õìH_R+6ôg”§Ö3ÁÈŒb5‹¤<{sŠ*+`YºÛ5lLßî ÒakÁzíñ€}‚ô½ãá¼mê©ÁŒ“™ðˆËæëÆÑËnžŒ»*Ëú$K„Zf°áZc–D¸}dY±-2MésbªZyÒZ’Z@áoÑàˆ°ßéá±d cæ· Ô°¬nró£L!ˆ˜*ŠœQž«Zè‰Æ c³òîŠ'fhîa‹K&ÎÈ’¡cØ9´¤.sp—pê/Z*‡og?~Ñ_Óq½¿+1Œ#0až8nH±ÍŽ. t€âø-ì%;õ­.?õeN U]]i‹-{zQmk(’¼o‡kí†#­W5l±N×o$‘±¡£Ù¾`OàÚSÑí ÏSïî¯V)‘5GUšdHîþ²„9%ylŠ'ðl³©‹|ØëÜÁAä}†C÷ªú ÄTåXà 5V­ù™iDÛNda0Õ n\å°âŠ6Ïš¢:D ƒgß=…ãîÉ =~ „293y2‚íz¶ýòìâlÏGS ö;Ïã-¼Isûz0Õ˜VS†ŽåB9p©ó¢Ça/ bY$*‚yÑfǶI)…‡b"<èØ³œÄ‡pvý¡ÎOó¡”ÐRØÁÌ4~pVS¯ú*…®´Œ×{ZíÆ•Ê]8žG¶ÆD$D²=hÕ}/~iZ¶§k,EXׇ±yf‚Óã=ÚiNªoÎøEJ‚¾ÊKk5ß ›ïúV9IÙÑ ë¢jY#„»œÆ!XÆ£»ú¬N`¡Í“Ÿ;3UÔ¥×¥ Ë(ô|šÐ_¢v¢Ã]†4yœDXËÏ…³ô—Ûj°‚¹ 0ãÂX„âé1ã„*pyÒþ¢òŽØŒ÷ªkxÚŠ»pšM‰¢;yyâ`=x¬ ^—ϼ@ôe¢0ÎrRÝ*ºÎæÿ5kY_ =GìœFÒq —æD„7“Ð9*›RGo„[F‘ŒÔ¬¼×I®·Ç£ÉRXŠWnˆ`Ž'MDDÛ9Çëú‡åõßv÷!½½[i‰Ä>› <ß÷qqDæíV2¸þIÌûÄäePbÞF%Êœýe&’ ¯íäÎ`V›ŒÍ±›úÉ@ùÁw×Ðǽ&Éc9"cìæìE9pÓHù‡Èàøl“s©§Fã¯:£Ý®ÖéòŠç^NÁúoØ5ÅnÇšVj ¢û‚>±X Kå6=ÃÃ8ö\:f—9š¬Œ%ÛãæPt2ö%Ç.oÂáP縧L¸(|á©•Âxd%Y’³$ dP²úêÚñ³“û(E¬¿+)Ÿ-M쯒É@¢ã3ÌÔù>Á㿼jg§êKG)‰é“Y†¿Õ…S»ÅöÈnÝ ï ­È4‹@û[EËRŒˆA×Á‰¸No@æt©™cœ)\æùÑb4O«ºP4y;&àm­yö]›ÖÆRè'uÝ*>‚±¦ÖIÜ‘uzµ}|rP ¡¶ÀQmzúÆk†//e‰O éýí»wË{“ëò^…gÇ|üps5ºÌÒË™ùª58SÐ|{œ¥UF%L°aÐÛÈ{ùi¢÷ÝÈò7…hìvÏ•Çg”Ëö‘fL^l˜7óï(A`ÅqÌO²Ê^CÝ5—º—ÞSüŸ‡%Ç -j˜¸¿¾º]¥Š$ ‚TAÙ¾(s…µâW¡ø¤gUz$n„7¬¬… .¯ss÷FsnfÆO[/©€µg¤˜º B|h ýÚD|÷P-ž—=F’¨‚¸g-…‰ó‚ò…‘ Û·þ‹†Ûçö¶Bûg¾öÌJ Á=?函0ÂÊSˆnØ®¨*S ™€ùnýóú_ßMC;pÆ—àBÉó ‚З …÷ýb™Ž]M£šh4ÔÞˆTžRHY@Imozžx}U˜ª&'Ñ{L'¢ä–Âûæ`"ùÔ4°ë‡¦9ÕÍ%0㯅eñ…ï}´„æ#^b‰¼”‡Y(¿“5ÈY›5ÅDç»è4ãèÎmhÁÝÄS.¡D&Ej®ÕÑ/Œ§±†‰wà"#¼áÖ™'šf ßR ^È9?xò-eûf› ç„X‚D Ù´¢••\Pd;"`ªÁ^†drÍâÙÖ·}'˜ç¯êq¸x!;«¿]þ«—Y–Z(ÕuLÝmLöîˆÈ‹oiÙèƒúIÂdä±úRÕ§êáµ1Y6\Q÷4ƒãÕ$ZB; æMt¯— ^v8–êg­ÎwHèÀI0Hf1Œîº¾$þG«;±c%|O…®;óIZ+ñŒ—åžÆŒvÆM}¢úÝñ˜cÓÈ7ÈßÊ)¾ˆr°PS‹Ns'Åžžµ¸ƒŸŸG–:nĽÙy»„sóƒwDñΈ—¡pvájåýϱ -ç•<ùóü ñ„“^¿” B~|å'ýÈ–=Èê.%«ïß~Øõoו· endstream endobj 614 0 obj [ 613 0 R ] endobj 611 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 614 0 R /Contents 615 0 R >> endobj 616 0 obj 2961 endobj 618 0 obj << /Length 619 0 R /Filter /FlateDecode >> stream xœÍisÛ¶ò»¦Ÿ’72ÃûèäuƇܨãÚ©­ÄÍÔ -AßP¤LRVüï»Àââ%§ïCßë1Þ]{a±Øôtäþ=f¢Ä%‹ÍÑ“ 9$r‰ R'²B;&"8ˆIζ@6D€§ŠÑˆ¬ÉÝQqd“Ÿþø-‰mdd÷˜#›Û£ß@xZ^'I"tu-'Ž™Ï XlÈ»ÙÆ%ç%-µgŒìÿ¹ö¦Fžãþhd“Ç£ÓùÑ»‹€86™¯t0?;¶m;^DbËsöKæòÇ›ó´IÉÉbA뚤Œœ­Ó⑾ý“Ì9šÎ…¡œ %þ‹,O­o·¿±¦èš ÿû–‡4 Xn±O¹X^ñ—}`ÀÝ…GÝ#X“»‹ÅýöO _—ÈŠ·Ö# ß·CìvYo™ìqcì^hÝžÝ\_^NÈ[øì û›²2«kÁ±–A™¯©ýr~zf u“6tC‹Æ mÓ*ÝІš2ia`&ÇzKÙ*£Kƒ–Ö?š|ù8ýzq}swrsþõúêò‹9²Xâ:ö»vÇœZöuvu;½ºÍgŸ§a¶q‹š—-%æ05ˆd5)Ê†Ô»í¶¬Póá…|¸ýíòüÔêIö]+öØ=!,é*Ýå c®FþV gVŸ_6¶øÝ­)s$ä›lWXDË»‹¤—~+ò¢$‰“°Ïù†Ö ä-mäô^`9pŒÏWâÁL –[ZÐåDj†FmË:k²²à€¤º*+ªÐf­áUVÕšMUî-…|ª³âqpÒ¨K<ß±vò…žß·© ßšû7÷oG]âEÑéJ<ì†u¹ÔLo8¦ ¤ÍxS>ãva‘üJÆÝŠˆô•@…³v·Îr:2qÔ_ŽZIhC ~_¯ïˆ¡Ä>0_+ÀÃCÀ­ø4î0§- '{N«¬Üœi#Òâ¸.Æ‘¦y0²«Çžò#»·fqÒ±ùwQæ»MQ“rEÊÖCz N °“ƨÃlÛ_qŸ¶K¨²Òo[àVÃâÔš˜ð5Ω¥i˜< ˜YY Üüƒá=†Üšº¢)Ø@ë‰&mó]UœÀëx†›G (¶ü«Éª*7|y˜ÜrË"/͉”ÐÏÑNZv‹ç Ó" áX×þBTûKÓÐ]+wŸWÜ OK5x;½œžÍ5έÈr¥)gW,i•¿`´‡´6Ft»UĨæÏÝß¿5ŒÏÀ«UßqÜñß2«è¢É™ßlËÕ ‡²B~³$éDÊrŽ™… 'à¢yœp>»Ï®ô -åç›ëO%rú¥?àb:?û0‘Øåì×Ù\a×·SÅ”¯‡ †(TìŽé­ý:Ìm³B©M#E†b:Ò&Š)TÕ7¸Û‘)J‰4¾ (wrH#ä¥ÐÌà:6¦Y§n‚†´í&ÌÓÓU`S¥ žÇ5âH|/5¸ÖÓZ¡/>K3…üYñ’d¢HÚQ’aÚ‹&Í´Ží<‰4ô,¬ÀTÚ˜^FÒô[ºÙæ´ŸÏ\×ïx¦dé Y%a.Rdˆ ÖV i¨ÂÙ3›!–d¹¨µ8Š' Âl£+䳂²ú€*ûµÁ;kêWu<ȶ¥WßK^7C‹\¡“„HúÀ›Ó¼.‰ð£j¡~ñádf=Z¹%©@ëÇVG¾?‚^À¶|†¹|º‚î˜E8äà  ñäMÊÉd”“6cÕ>Zí$¡Óí"• /èÉ$yéÓ®ÆÆ oT¹*q2¤Ôa%w€µ«y·Tà´ AÝÅf¶–Í¡ï±Ësq&]öhùÝe+ÖecD" $A`ëh'„k Æðñú”î6ª¸ ÌÿÂñÚã}uX[ßU'%b£dµ­ønbZA9'ìL(”5òÖíœ$éšN¬P6™MÀ> a±¥áÂ&¯ÃÌ00IïDÁ½Ö° ŽÈ‹ÄT`pŒùÝüdÌ2»)$™‘‰º­F&›†ã5í—ÔPÂtœ§wTЭ¬8e¾F\Ñ<ýF*¤3PdAÂÆ*–iµT“v9Õ3x±ÌaÜøHÕ"¢õdpžm°B4US7|f)!™™¸TÍ/=“nm½Ž3ºõa 'èžõ|¯È¥`Ųâzÿvà:Ø»[“hbùxi;ÑèÙõÕÙ§›¯,Õ%7~ç“9ŠÇßÉéåTwWˆàÝ­ v$­L–2}sdü¦4„Òªš¾M·ÒK£ÇŒïº#sµ`õj0àÆ {0 x!rUs€`EŸvžÞâÛJh²Ç®¿°ùCŠºÆbËC Áͤµ_4ÓâºK;Q_öël±îuKP ÑO “N§¬Qƒå×iC›€ûº†ž.Ùîðoâvâ_<3[šTƒ.Ò-OÖ }~¯_ Çñ¡ùZ‘!8Ü>x‘fÜù"¡Vw¾ˆw¾HûÜ7‚½H݈‰ƒ<Êe¶z1¾­iº“å;Z[š07G³ZÍP¦\õV'°»Ç»Ç/L´yx—£­ãø}ÄüÊ1Y¾räî>úƒ¥('+“•8ĵŒ–ˆÓ´ˆRóOT•{M­ôäeYàjõØŽG–XA§}à…Î@unÊýÁ‡ßv1éøO£;|?¾ì¯ò?'²y3•ç6-«¬€Ò N1qÕ»s  <|+ÐLø­šµb\QÆŸ÷ÀO{Z޹Ïó;ÞflèWhb!S÷ç+ù›ôEÁü铱BøAkž5­¸1ÇYÑ”–ú0Óö¦ÅÀð×m÷ØÛ¤ã%qâ†ÿ•ñ^b0Ñ òm°®É„;V ÄÐF ²þºNGŠÜ)Iwå‰ý.Ä@^4¢“âX:æùŽˆ¼ÒŸÚüeY†˜xÇIôŠÊÅsãe‰ãjû5‰P^ƒ´ •ìÁF¬©4¼NŸ‡ùˆ³±ïæÐ븙gä}ÍÌãN6GÚ‰ðhºW± àözF1Ì“$Œ¢ùJ~ùðºh& OÄK½4Wø¶¦»ey,žE‘&2Ôa¸ãښƣAq0Šù¥–Vnw9¬¤"àѧP¬:MQx¯+)«F^ãxV*‰þ¶o`/?ù3î½Ü\ˆ.JÐïiEmþ2Ñd¡£ÀdጯÅbc‰O¢%Д¹9XŸÚ^÷!ZÄÎñŒ—h¯õíïà‹{@7‘§ CVež—û{š¶^X÷ÎïÀö±EÊ> ØOnâ`€®ök‡´ã@›À®_½0`2ðóvsÒÙ±Ëì9[îø8Æ×ãZcòAT<ÂäÆÀVÆsUFCÎà%KGý%à%Í©ÈhHÀ§7)Ô`˜j°É6¢Ý–oN?øÜÀòpšë¸õxÍï^âà¡•ÈZ¦‹,"ð½ìäëÚíúþß>Ÿaûö§±6Èøul†ÔøQ…øÕä_> endobj 619 0 obj 3068 endobj 621 0 obj << /Length 622 0 R /Filter /FlateDecode >> stream xœÍÙrÛFò_1R• ã>²µ²D¯•RÄD¤ãJE) Eìâ PŠþ>=¦qѪ}ÈnÇÓ=ÓÇôôI±Ã7CR „^Hrv°·dGäÒáXyZ{òmQ.Lò¯ÅïÀ¡”˜†G^戹`³^üÂ=ßpü0Š"©«mXaÈD8†‹¤ o ›\Wü´Òž12ÿçÚcËþ?ÐÈ$O‹O›ÅÇϱL²Ùi`v¶LÓ´œ€„†cGì›l òûÙuÜÆä2IhÓ¸LÉÕ>.Ÿèùdóãb¹‘å\¸+Ùð_`pêmx®ÙßA¾Öá5þ¸†#p€1lnĶrù¼òo¶¡–7—ø{Ö<’">·Ûß)|þ]0FØ{(@¶ï»Øßl²Ñ+2Ùó—1G®õmŸå”œ“!ø9;6Yù¤Á¸D[‡Üp‹OßÓæ˜·kÚjT[éuQ¥ÙîMÃŒþBƒ"˽®iR-SšjdYÍIx, ½=š¸ }ù'®Zi-Ì6Ó—f¡ÈôuèŸ49¶”¬¹%\ŒT«iã–Â]Ú†´û¸%Ò$LI®;k™?ƒ§ùƒçr}Ȳ7äÒ×´l²6{ÉÚ7E6ñÊ~dxLé0Ù†[îQ4‹Wíºe‹Ž&Ǻ©ê¬i×iôѪ[¾dM¶ÍòžÂš°ˆS:ÅË–¯%€íÛäù¾r£ŽË&NÚ¬*5ݱíÖ¯Y»¯Ì`ôÞ¡50DzãÙSöBKÛ TÄDSswQPC»%wy¾ª´¼˜ •·èÞå8ªˆßÔòØh"íq sLöjwØ›»õò~Ó©P«Õן¯/7Ë‹‘]"g`æý=¶áã ä ŒA¾VAÇîã3<­4¸««¢^÷WLÕYV€Â´B3Í9¥5/Q¹ ÒóFîj<ŸAŽâ%%ýS©Ý # ChùÜH(õ¥ÊÓX$ѹ݊|#`—ñTM¸&q¾æ zXî9ož¡äÞ®[ÊŒÊ×]P PÕˆ›¨ÆbÛª€'HÀ’oZ“|?íÀ×=-'åÆ5XJïõ“øP0ë ²¶!,P#«õŠw8°U-ÍŠï&Ù. ³’?£´\J“<®…C‰¡•Žø|ŒsFnòífó…|YÝ^ `Àêë†Ãcϳíh À o©<*49ûñúÓÕ‚÷ú.+r‘´æ×µ2¦÷CyW2‡JhWåyõÚ§‰ó#mz‡êYkåíw´¥õc‹¸ÖÀ"ÌrW_ï׫ûõãê×åýãÕê§Ÿn6̼W·«õ²Û½ÜȽ Kû¶80?™Q4›B¾óX¡3Á✠½–a‰×B â«1ÒL’ F#tÁ’ˆ®¸“!fÌÝæ$Õ4N?T%¿÷ “åIc†9%pl¯ÈØKÏR<:6´cùÂQQÍy bBb+L£µÊœÑ0sF-ȶvàM(Ðuõ³™×ò,#ô™ã˜7f€T½ƒzñª”3Ê'U¹Ë3È~"%¶ˆËR„ó}ßZÌá‘p›J^™ÎR3Ÿ5 ¼›nÝÿ¬ÙŠÆÈš±|oÖs“Ofò‡ Ù”1â“sç)ïu‹p˜?–Æì¢†€àÂE ²¾Óéµ?Hð"'~ƒÝR¨ð?t_a äº–°#Q`{.”\R?-XÕ„¶ß#nÀbx‘ÝâЀ‚ R@Úä:gky<'e÷MÆðL+ò­á§ÅK|ŸéØéo4Ï -CðÝPÊó]!Ë>-q°1;[ñÃÒ¦ \9± ²Ôú—cGéÎA%®!¥ S"ó!ÁßÖÝK¬õµº/Z ‡Ÿ:LpqhaÂЖþu¥ûï„ü“”ôUcÎÎÿ1òQßr ÛŽ5à—Çm×pz¿Ü%ø'›>®x_øp¶‹ó†NŠr#uß”CKÓ‚’‰Á#v‚N×ôùNhR¨ë”Þ)s¢?xdùIú/òû endstream endobj 620 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 621 0 R >> endobj 622 0 obj 2337 endobj 624 0 obj << /Length 625 0 R /Filter /FlateDecode >> stream xœÍZYsܸ~ׯ@íK¤Ô˜æÍaR[)ã«äc¥qìÔj0Œ†21É‘<ÿ~h\ b)Šbâ%NìÎII$3æ¤à{$ï"É@Heod¶äËIuâ’×'¿ÿÖÄu"òt⎔£šÛ“ß`ò(v‚xž¦©´Õw¼ùœO81YI^¾-}rU‹ÞÊz®ÈýŸ[o[xþÿE.¹?¹Xž¼|Ï%Ë Ž³çº®$dî~ÊùdY’ßO¯hGÉy–±¶%´Z“Ë-­îÙÙdùîd±”Ž -"”|ø“8"žz Qèö[¬XÓr#…¿¡  $ŽG¼©Ë+òEF.üy©Ê<\,ÛÏœüøº$Hœyo=Ò¹…}?Ä~2d£UäskgÀô¸çŒÜ¶ ¸~ _Þ]]\’O´¡%ëXÓ¢c8¸$€‰‡yáÐ/[V‘3òÂ÷]Ç#§Ô¢…VÃ~jØŽ6l}ÛÑŽ•¬ê¬¶º±˜KZtU°©Žyk1û–­-ö)ï¶¶)¶]·¿][\;¡¹ÛR›ÍꪣyeO·>T´Ì3DÇÂ$L˜ì4’3&NÈÕ3M¯ùVÖ ‡k5Wo&GZPjºam]< 0dceè5Wæ•Õ¼:LΪ{è¦Ù'\Úq?>”䯮\fg„Sì pZ IlHÒØO›µli«ip‡æ3;`¦¹«ížè¸i´&”‹ ä" ‡è!—»ºµÚмÌ;ÃÖÕ¤ò’þÈË}iF´"8å¨F“W–·y]àJ‚\"6¢r‹œ i޽wDt·+ráÅx|kÐF9¹«ä¸§ZÓìGÆvXnún„c³Ž¨ºíš¼º7VÆ€‹üþ P)i1e @yGEÎñàˆMäB:–À‚B‰òûªn„‡z”€Cqz‰•@n„éÞÚOKöH‹½Ý'·µµ¬›Y,:®¸º*Ë*€4{ÆÖŠñ‚€6‡‘ý#èÒaêVn _ÉLæjlB_f?X¶ï`¯Ñ[K%äqÃÔ0Ac،®š¾£´–ÎpfU¤òÆj̶,û†‡l­,F¢h#ÏG`yîѤNXÃq~ó×I“ŽUU#Vöƒ–»‚‘+ê'!ñÿw§wg$ Z²®IUw¤¡yË Â#zÍÈjß‘òdÔ'`cu.æ ôuQ¶„¼VH? S¨šû^†¾“úA𯲹ÙPuòÂ&$éЉT¼Wˆ½JÆi_Tp‘­© }ͺŽq"×KcoXÎè9âd4‡©ÛÇhrÕ×OR(ÊBפ=\Ø‚ÿ ®ÒŸ˜ÆÌcÛd5”DxÔë ˆŒ,ê þˆxÿ(‘S˜Y¥H™3œ[ZÓ[°áú ­û·Æ ÑAÑ]y¦d>,<#׉=b-òp‡¼|I:^ë‘5ÛäUÎÃýoäòfq¾\åùÅ5üKîN?œ¿_žß\¾9¿¹;õü»³qçîl¼c(=¬‰å¼¬+H’\1Éȯ¤bOFÂwÐß't€GÜÊ8ŒQÇ8¶èÊYìhùÝé/·‹ëÅå’ü•¼ºùø¬ÿòfq³ ƒ_É?~™œ ¹Ñ~Xxö“¾—{8 ’øÚÔñ¢Zv[X²Šˆ£[uâÜoÅÁš‹W ûÔöì™K¬¥Ð>¢ÆÇÚå£õÞ0Ždö-3 D8£¥=_ä8hì¬Þpõ‡{‘*½]}7—ôº0¡è²×²b‘–ZÚ¶pýÀ‹’¥ÅÕ½Ø@pŒð_×Çà…A<ö(ï2<¶ÕÆÛK.ÅøUlú}ƒo ‚ß4u©èL°º»t+´îœ¹¹ºx«˜–5Ú=à—[cžÖèàB]õŠç‰±Ãp…ì9,ŸBæPÅÈE¾”cµ`ÝÖëÖt1„´Ø`HÊç&d„C¶VÓ²54OŠ,…oÈá~@¼>h¦ Í=³ý¥Tá|Ôù<$h8b6¬áùh Wœ àÙô@xlü­¹deÝ&Ò֜׎ü†äʺ”àì =(¦ÿ&D¸eYîÛNѨA*§Ã<î…©—~ØùÖ<ÐGê´ß çœÛrô4ðáøŒeF¿âä[¡ ­‡ÂĬÑVÈkšäufÀ®V^@5õøÑõÖÉÄë…}˜-Ã-„ôQ ÓÀ ù·†yOÌ1ÚzÏ›»S«Ÿ"+ × à6ÛZ“Z]ß~¸]Ü,-‹°¶ï7¯¶ãƒ/L¢+yšÀ•ÞvK ÔÇÉ®ó ¤Lùð%e²<ý,Š=y€¨6“~•DV ÈèdÔ{P“êpÐutét¬^·uÉz“˜' ,ÕïógÖžÍB ÔO¯*+äÔ.,ó–dÛ*‹d#ب²Bp÷¬‚©SK dY]ìËÊ£0ôÍ›µæ(Ö°ÚôÆæÔþt,ÙrÚý‰Ï9é8¥Û‡„±®³=_ i9å•&•œæ/ÓWu¦y€/2н³…E^¯œ‡õ*sø–ï‡ï¥ã؈q„Œœ‰à™wbAÚ‹ˆºpgŠçGIâ%DxQ$~Ò°†Ž¬ùÄš;ŠÃÚwè–rd®õ‰ØUN69TÁc¨üaòäS+»d<‹“¿„²IYC–ÈÁ{¸Qr±xõîçË›·¯_/nHO¿hò3Ù?Š<Ç…ƒûhj¥õ ÔäýgÒ~”„pï%®Ø_Ö êË™ §¾¬Š†ºÙÐL’È¥úä´D1Åü©gÀO0‚Æ@œR!–òú³ÎØzß\PP‚ÞÒG=튱JÑâEÐÌWf°î/®Ù´e?'1y‘Îu’é}Fîi¤;{ ìâÒp˜ ¾<¿¶tjŸ?ÐÒ~wjh¨Ÿ¬†3C«³9¨.øUÔ2N^B. {}ÚJ»šcÚt•8FL<ÈÙˆ•´ù&ËI¸ƒÃAû¡µ2r ‘Á“iYÑ#ƒûiª)ûk$æÒ,&K¤?~^øZàaÐk±P@‰Xe«±B¯Ì¤ñÔ’ó ‡’|êK¶;\ÜcE»­÷ÅZ<:®Ä"+~,#ÔcR¦6z{<‰ÇXÁÜõ|Y!žoÔ÷F04U•‰zU@™:ŠÓÚg–PïÈ©—äTš<ª±Wœ:ªS+£øÞ#–êŠkJ;ÝÁ2íš\½É ôžu_¿~¼÷ÇaØÇwó=Œÿ?™?½ÁÀÐ endstream endobj 623 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 624 0 R >> endobj 625 0 obj 3020 endobj 627 0 obj << /Length 628 0 R /Filter /FlateDecode >> stream xœÍYësÛ6ÿ®¿›ßd/—[–/î8VjÉÍtÒÌ EA>d’râiï¿Å|Øé}é]ÓŒv—‹ÝŋŹŸ9ˆÀŸWì'J\”•³{)sPä"/”¢ DN„C£I&bT0ÅÉT$éq©ÔÌ}œU3‚þ9ûô”¶ˆà}‘‘qaf5û œ!öÂ8I«‹8f.<‘•èõeé¢óšk«è™!ò?ÞŽÈsÜÿƒˆº›­g¯/ä´Þ™`8;„Ç‹PŒ=7aÿ¹h]¢O'çi—¢Ó,£m‹Òj‹æû´º£/>£õ³ÅZN”[á©äÂÿæùÔûø¤ÿÅÊ5-7RøëcOÈ@‚ÝfÄ>ryå/û È€Ã%~Ÿ„Gš²‹ãöW:z]"$8î­G’XØ÷Sì/†l´ŠÌ÷Ó“!£ÔúÐÔÝÚ¢è•îN²´ÒtZ´µfÚ󭮨¡M–uC­!í±è4ÛҮŚû¥>š/ûúXl­ŠB3ÝÞ¼£Ý ·¹¢Ý¯'¿¾0‘V[[é=D!ÛžZI»}½mÅúY¸¸dLW#˜o“ÓŠXr&lˆÍ|óÈ~ðÈïà$‰`‡0´úéŠyw죓ݱʺ¼®Z#’p Fá-8¸üjÈ.Ý^b9aRA)¸ö˜íŸ G‚-µÓÒ⾦V,Ö˜C/‰äw±z"Éi7|2#$o€$¸L‘^} ýë Ø á0ËL\—ωÄÐÏÏæ0”ÁI·èç´8ÒVŸØ%ñqà‘$‰]OX‹xݶ·J"#¨w†îlMîWs:v#Ê«Ž6»4³ÆÈÕÌÆúpléÖòSÚ$Šàø /c<0««Útƒ‘ÓºÛ|·£ ­,íîñÐs3ÞWŽl‡CÝt0ØB ,ŽQ{ Y¾Ë³”¥ãxW9^Œ$3D&ÃÇ=IîãPí Nί–gÖ™†œ9ë}ª7¿Ñ¬3|ÞºQ©¢%»¦.'ýéE}idUmè-;¼'tMZµicû9V]^X:rŸ|ÇTCSËÆæÑÐi“×lj… ÈQ•ÕÌ¿¥)nï ÌÁdj Ã#Þ‘@mžKˆ?¯P‘6wP‹:ûÒ"Hœô¡Î·ˆ~cmK{¿¤p4<"Èâ‰õ‡!ŸˆhN›ÊX#Ø÷ «ÀrM äUÛ¥XîEËÇÜ,ç‹ó[Ûñ¦Þ>bÃ^ZC;;bš6Å£aZд¥VH¢° úlö<ÏNÏÀâbÂwC˜àH»L&×¼@Ð ÁÕ•ˆM© mÊàSû“j8ßR‹Q{x",}„a#ƒÅmèN¶3b*å±µœm,Í-O/{r/×ïÆ@úáÈ›Åúöæšï@v,pHÀðÍâô-¯¯~ÑÉMdkc†„$ºGÈy©††CcÒóàì1TÎÉ9ëLVF’±wÏÞkoúFÞ¢~øR1½‘–+('oGÈxžÇæ’Ä¡Bæú­׫ËõåÏ ôº¼¶¹SÃü}F\y~³¼º‚o×KEç±§À‡©û„Ä‘*b3lÕлåÕ9˜aôòv-Xå„+ÈE3*R0é. ±OØÅ/‘»_oîJ%ývhXñ¬« D¶ºP¿=Vå"lèï&9 ‚Ûç§ë„¶¼„ëâXVaTäm÷‚Ö1M<ßayà'qགç8F'"JÍšpLloA§†\-®óµá{•QˆÄÎ’Ÿó2‡ÌyiÙçúØÉ6o³c+ ‰ülÅÓÙñC´¶Ã­fÛÌöéÚ4l$—O™¤ßÒò0ÑÌúž3@rC‹ú+ïTgÏSS'‚`”]A¿3Jz¬•qR¬$—ÝØnJÚR} •q!{?òÕò½&Mµå©ñµ6JOMI¶|t;Ë÷`©ô.jpÁ–{)i~_b„‹Q:*þ*Š{fDU+ÑzPdº@pZþfuYæ|NŒ»m•¾ËM(*€Z[¥‡ï¥¬^×ÕÊ©Rx¬cT‚`€JEaµÀ­ª«Ì›DÛ.D¬_êX·¦;(Ùy?Y¼Ý0Â>Ô@âúþ„ß9\)Ù•m5<F%ăÓîCX¿£œøŽ±ç$rYè æn&|ˆ%ôàPŒ‘ 3{Ä…Ù ÝìTà^Ï”¡T“ôEÙ† Ô7¬_^p@œ$t†0Ú‡|H‘z/9Wº‰á&"GÆÃÄü1“î„wàÇŽÉúP">£ž*{ƒFÔü ˆ˜¾KÆ«©p†¾e4½®Ï0ºï3DGˆFàè·²ÅÃÃ/ °ç†IÄA¿b§ƒÜg²“=B¯'°· ;™eyþº¸Y¾ïîØÇ‰Ëž;é Zöþt}¹¼þ×jþnñþ¯OÏ®«¿G'>Øè˜ÈnàÕ«ñƒ ñ±JޝZ†å‡Åµ5i—ˆ÷H,lB~•¢@GØÌÄ—o,«ÇªK¿¡EÁKB«lÝM·AᘸI«îTnÄŸ…-ÅRiS T©ŒÌƒ¥ 7Ɔ¼M&7*ò-˜T¼ªk¶ÚNëeüÉÝħ*Ÿ5´1Ÿ·´Íš|3í_öÒåpX l¦.[ìª>nP…«mÚðs;"ìf/ç“òA¶k‚£ß:Zñ›¹ÉÛ’`D?$è-ÝåU®Ÿ …Pö ‚ó¤µ,©ÃF$[Áœ]_|ÇúDVYs¢5<µ™¶.i——tüÈÄÎ,è$ï:ž{'€[ŽÝN™D¾Z]åФÅs†¡çb¼(púcø­/à¢ò.É}Û圼ßrZ6ÒFÕü½£3ñ‡@¢+˜;èãÀ³eîî†++C2d!â5‚Ü áKU­ +ž˜¤ZgéAR”i÷T`꙯ÙhÝBßïC ‘lR†Ü-ø›eųÅôìŸBþÛuó endstream endobj 626 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 627 0 R >> endobj 628 0 obj 2330 endobj 630 0 obj << /Length 631 0 R /Filter /FlateDecode >> stream xœÍXÝoÜ6 ¿¿BOC$ªmù³Èdi²µ†­½`—<8¶ïΘϾؾfAÛÿ}’¨³(Ë—{èÖ˜¤%’?’é{˜¹ÄáOÅ#J<’mfJæ’È#,T¢ $nDC'&¢˜8ˆI%¤X¢H&¥j50kò笞9äçÙâŽ/ʉCò8s,å æÓìn<) ã$I”¯uãX˜`4äD¶!oÞo<ò®‘«÷Þ EÎî=öˆ¹ÞÿÀ#‡¬f?Ígo®â:d¾Ô% âì:Žã²ˆÄ”y‰øã‘ù†,ŽÞ¥}J.²¬è:’Ö9¹\§õª8¾#󳫹*µÈRòø¿ˆÊz2^¾c¾Aµ6ȵ”ÿ÷)—P/àˆÄ«J¥W=Å‹=ÈpÁó`x”*´yœ,·ïiüp^"±Ñuhld„g …߬²ï5+‘Âö€'ãáËêJ0n`vu™5yAŠ.K·üQ›¢î;øæ:´Uø.M/V‡¹¯R‘Ø*BŸFBcÊ‹³¥ãXÜ2q@#r¤Ô!I·-²rYí9–¾}û#f˜¹¹útyñû=ìš¾8?lüÆ×s8ò6[§mšõÜ¥ŒÜY›’„"ÐqO@tŸ`?§Õ®8Ø=*A[[ýÊËUÙ¿Rå×à CS¡…ÆuÝeJ™øJ•Cpˆ±ÄVÉøQaucfGÈóœ@@ÕH×PWáÆV| Ó®Ž|B©^—ýôÃVòs&ùñDúý!ä&´²0ŒË‚5µù¾­vÝ ïÊU=árìŽ]~ñ ø=‡ÑDÔ‹Žñ¨" ‹Ô+„À|ctƒ‘A½×^Ìb‰ÅA4Qznȧã,@+DÂý1.EtWÖ«jr?’õ¼™دB‹$·Gééò .N¯Olp3çœ&·Ç'Š@&Ÿ3pqq"ov÷ÜÏ=ß´äìq]öé¶i¶?·“½Ä‹ØèRÐ+®¡M«gÚˆ—„r҉à za÷Da®uÀÌø¢Ðû–'a`•ÖóA°Ož uVÖ}Ûä»L”݄Ң×44¤,í˦ÖzínÀ˜u¸Tçà{c|hmÚU¶ضEÇ[+˜£”¢—wx÷³º¿à•]±å†ú¦=·÷Û(|6B± ÈÓ ÿîö…F¾IÖVŽÏ-?\ »:/Ú.kÚ)—âX6g×á)ã:9Úꦖ.¡ËE´/uO›û¦²ÍøVÿ›Ô# ¤õºãRÞž,ÛfCúµ:eÊ µ­ˆ–h Ó- æ—9òƒh\iµ„ŸV0êA‹ÐY‘¼qX<<‘Hæ7M¢jÁ½,ÙŽZ-rº¾“(PÕ-)dMò‹ú¢×˜Uý¾ç|´zâ¿©ñàp3>øG)Q2%ÀIQ"•Å-}øÛ«/ìA/°úèĹÔW9QôÍYºÙòCÊ?PÏq=ÀÛ¢N ¢é¼OX9Tóÿ~5ŸªªÊ¬ %|^ïC~‚`ÒKxuwPß·Ë”r KFHÔ¢?}ì=¡'~ìø‘U^²ïA%†Òž‡ëã¹=_‡#ø$9<óO|Ws§ùWÀO–—¨!e¾†ñ<”cÑÓqÍRÓ©&’‘:ZPvš¾üåâãÅåüê#Õ2ÃjUÔ«~=m·Ç õ¹|…Ycç”ϯµ*‚‚\¿´+!‰Ì ªýøQâZÉÀ®€Üz×9zSk:Õ$â­ë§µ Õ„•>–€¸þ±yÙ׎jᯠä8•d3K‘Ó÷H[^~.s]ßXÁ Ä æfWõåv?*çÀw'DÝ+\$¥09‹Iº¨óÓfyZ•5ì¾2O~vº‘£†}¸˜øi£A׋¹bÏ©HsóÃ@Šß ÷4„CÑ ?×¥æ›6/ë´}Ò †€OêÚ܃Ã/“‚‹–ì}±*ëÎb‡Ç÷Gáu}ŸfuUÚ­Éí¹½%·ÇxìâÎòú[6UÕ<òÄÜ?qz×þM•æü&ÝðÓŠ0òžl­îØ'9¨iUÂ{jüÜúïãr endstream endobj 629 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 630 0 R >> endobj 631 0 obj 1540 endobj 633 0 obj << /Length 634 0 R /Filter /FlateDecode >> stream xœÍYYoÜ6~ß_Á§®Ô IQ×€¯)Šm4…ãyW^ ÝÕn$9œü÷oêØò’6±bÎsrÄo¨¼›QDàï±ü• †›Ù;ã(e(J +NMqB2´A†Èâ ­åÂÎP.1ÃHqÍjM< ¿fÕŒ Ÿg7·°h‰ŽÑ‡(×jþœýÆãGI&„0¾2L³LšˆpƒÅ=µaèr«V[ï¥"òŸ{zQö?ðˆ ÕìüzöüeŒ(A×÷¾dž)!„F)ÊpÄ„üÃÐõÝ]æmŽÎ‹¢iP^-ÑÅC^­Šg·èú—ÙÕµ TiQ¥Äà'Ūž:1'Ý™ Ößsáá8Ò<à`CDrjm¶×ü–v«téß{ÓcTÂýÍRyûžÆ÷ïK*)ÁYgG(¡Aú»Uö³6ØHi{Cœá ™0-iTž:Æ‹?¹ñ7:Q©õ«nüL³ËÅ)ÆØ±nG–=y‡âcÙNU5ØBÅ!ìaD¸‰Ð)< Nx¥Ñ ;* ïÖ¿ì›ðñu>…ê (ݼÝÖ§ÓdGýÆuÚñ=!ç ´Üîc1³ÆM-ÁQ‘ð°êdœ,Ë•FgðœÃsÏ%%Æ„·jXÞmÄ›pÃúûÓ÷nRÿfǰúÉ9ÔÁºÆœ’rÓµ¼™Óüîìâ2âs4?»?Ôð°$Þ“Š,lÛÒNhwX–á,›Â¶y#r#½NoÉ@ŽX{'RðÊbœŽ&ƒFG3t££ÇçnäÁ[Ó7~æN7šÒ®Ç·¤ŸüšNÏБ6À²ë„(/ý˜î1î“Tøih'ÔôPG ´Ê„Êiõq̤6”:îÍ8÷C†ö¼a(Ð4ãóWרSczW­‹¨#¶ÛýR‡LwÄ&ë· mÈKÙ*JI’jé ðë@Äã‘ èí`ˆp*«Æ¤g5h°'º9ÊÁœãH¼ó²‹€Ž¡ ÐQÇ€££JzŽƒKÇR¸é¨ÒóöØXJê4ïРE®³ Ãê"ݘ?Ð耬?ÀàÆt‡ Ò̰žŽO~Âà]g©ÌÈÀ£1%E°>Æ„·jXôñ&ܰþþô½›‚¾ìV?9ÐJÇ,ƒ{?5÷¾ó¹úô ?€¾jt€9\šòî›Cõ¸)êr1…yÂåv0‘Òƒ²#HÌ3¸¯ÊoD‘}ÕNšrUÁÛÝÓ¡±GÞTaúT"Øcµgåà}Ž [&Ç Ã {ä|vŒö Gã¾!Nàâ´h¿Iþs ïvõö#\»Ôe¤«c£½öÇÊ# I…K9±Ÿq¬£Ð „n*2pRÑ:D5 s¤pv«¢vkoÜʨÜ.G&¾¦âÖ †Äq/ÏÈòŠ­Æ¡| — ••‘8¨,óyb·~l¦Aí¦¬,9Ô# &À1×;{7Z¦'›¼j˦ÉOÑ‚üï¶`íPw …­~/©é½ûj…'œã^ÂDävÝXÕŠFÓeþ£é_,FŸ± endstream endobj 632 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 633 0 R >> endobj 634 0 obj 1927 endobj 636 0 obj << /Length 637 0 R /Filter /FlateDecode >> stream xœÍXÝoÛ6÷_ÁÇkX’E±ð¤[dKÓ­uׇ4ªÍØÂdÉ‘ä¥úÇïø¥O;ÍP [Ó€¼ãñ>~<O¹PDàçXB2´ØLn"ÁP98"1Ú Gİ¡wT€á RDNçhÑ:]¦«´>Á[{ð†4 0‹ÜnuÍ× ¡=©ï·nVÜØ1Éí¨¾$‹ÚNóÝF•éÂYZ«2É,q—ÖëbçÄ;,Õ"ÝxmÎÚiZÙñür>{={÷ÔR/Î_ÃEidzÙËó7§O½Â­Ê—i¾rBÎÁz­F E⤳ØúW’í‚Ø@y×?齨'3UÕÈ`P¯“- øRmKU)ðZ Ùýàº&´à§#<² ,xLHÀ‚.¼Ç·[€l§g;õP[ªEÛÒ-à–Ö˜·ZšY »¥=ò–2àÛ©7Œ®·û"­Ò"ßëòAcC;æê.Ed#ø¤À|V¥>5“ÛÕàü0ÒW‹$¬?(mÔÔ…Y-ÓÕºö;}$®ñÑRÆ0 B¸94ê]Ši{{ a/™Ú;d§ÛmY|u+Ù¹O†î\)CÛ›b¦go?¼¸˜á†>ý>ÍIv—Ü·ÚÓ|‘í–ªeÔà6I^§U•Œ1 BÀ$2àîÀôª¾l‹®ÍST©mR‚WKôùÍpSÔ –!¥B×Z)¡Ž¢r5Ñ/iasBB Sú„©¦pÑ Ôâcª bVhƒÂHöY™fue¨¯¸y0'TFtø46x0²áX¾odEŒ‰f ï˜÷wH«d{̰žOíÂÙˆº¢‘‘G]Æc ù8p&¼Õ†åÝÚöÞtlx>Cï¾éÌÇ‚Óy¸ãÁ»HyˆC€¬oBØ8Ý£ú”ð[!Èÿ€å´ïZWè_ÙŸ(›3ÿ,‹ñ³Ì¼WÞå€ »åsQd ʇ»¸~o´g/t—"Œuezpëžn…qèv\`I|¿2Øl[‹ù»3ô½:½x¯Ç—¿^¾ýxù@›±`¡nÆh[-ºu‘†Já pµ… |“BµøSÝßå²Â!&9¦Ú¢0vˆ-¡ÒÔéF™.^wF%¼ÙÀ/аIô/4ížLT¬&‹¦ªž†Ý²¾¢i_Æ1ª:Ùlî¸1Œ|ýÀ“HÚ1×7uv:Ÿ9{U]Bï´GOÌ!¯!­#î œŽ]žŸ¿™97é ÜYÞëTÇQ4ÊÞÏOßüÖó Zx %€\’a7L'o½Ýµ:Ñí´™-QOÄ-UsEBçíFþ°êžÈAÕ"Ä2†Ã‰…ñmý}¹ƒF¤À¡ª_×ÿ¿õµò‰ëÌØ/Ž)téee»Y EVhî&Íwµòü‘N%†G^Šv[·sP79zâô5´¶ØÓ{•”Õaac½³n=í,y½þŽýKètÆ!AoÓéPìúe TÆ"èBìœ0Ð>Ó–_©E‘/c-"ÇPÎIè§)AGˆÆ¤iæN> endobj 637 0 obj 1523 endobj 639 0 obj << /Type /Annot /Subtype /Link /Rect [ 321.11 297.735 386.93 306.735 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 162 0 R /H /I >> endobj 641 0 obj << /Length 642 0 R /Filter /FlateDecode >> stream xœÍXëoÛ6ÿî¿‚ßÒ ˧DY€lɆ }¬·aòA‘[€-»’¼"hú¿ï(QE)©û¥[0y¼û݃äÝÑgø=6±f(ÝÌ>ZE1C<²$!ãˆ(´Av¢¤BkÃ8;ä Õr·“úkVÌúuvs L D°DŸfdÞÂ\ÏÞƒra)­µµ•aª”QÁqƒtƒ^]mºØ6ÜõˆüçÖûqÊþ´œý4Ÿ½úE"JÐü¾?&ΔByŒæL›†ætóâ"©tž¦YU¡¤X ŸWI±Ì^Þ¢ùo³Ë¹u´AiŽƒ¿7çi° ®xgÍÑ{*ü Ì[P0“à‘YZÛíµŸf¡Ê&\íç“á±Pžp¸YMܾ§ò§÷%6‚”`5ØJ¸þá)ûÎQm¤ÑíüÑ¡?dtºN÷ÅÇý¶Îè%:Ž"¡u¾Éª:ÙìzRU—y±<ë ''?ö“ ŒERgψŸV»$ÍΞ…0f´aöÌg$°ßBÃZ­!yM8J‰F/ò¢ÎÊ’µ#xf6sëd3¾q£Ó*_=Ó­}îY²¤<Þl‹zåhë´%ë^ð±g_$Ç“îJxáP¾ŒxcH5œÂce=Xée`D3o=l† wÕÍ ,û̱Ý8¦M^ìS»d=pÛ ö‘J^´@#> µˆ™kSnÝí¢ˆœ—ƽžÜí÷zD§CÊžCä¹ DÆ"„i¶EöççÌQÚp¶cÃ_¹™ G;½éÙÜM°óÕv_"—n×Û“3;Sgã€RžXÌÔaœVYº-²+·æw i,•$$Š© IÖ&Ü­ýcÖ¾‰«}¬PÑ@¡gß㈽?!m"±̸„¼"¸w}†=JuÖøü‹°R‘†xw!²·â›PšÇZ ®ú³÷qÓªi-¡l1sˆXqȵï.Aóƒ`84ABC‹y•n3àôú¹Bº”dF—9gˬœ’¹é$vY™o#òè¾LÒ:·—Ç&§æsl¹ ˜ ù—éÀòÎ?ûÂdD¨0vq"ÃÐì›ò€½U‡b)‰…€‹MXŸ¢;ñ,ÒD·U“(L4\9Êl}¯LÂ㲩È»~²½wÃÄœŽ«tC¯ÜNÀå•V»,Íïó¦Rw¢½gÍóØ|c»xz ÛP»é®=°Láë)ö›»¬œò|‘/ózœ¹´)Ã0‚Ñ3j—”5(CvŽ\du’¯¡Ï/3´Èª´Ìïšk¸5&MPóh Ð8b—GO³_¿^ÃÃbŸ,Ã6ÚZ,š3©qhõ3ìé*Ù»®ƒ&X JcÓØê˜IM+*—3@n‹Š…a ͤEÓù)ѹ‡Æ÷êCÃÄZ¦ ¦Fù¤µ!ù@k4v=7–„jMÐz;HC–Ô=–GʯfP¤VQgø€p¸A’M¨ažMýµù¬&"#‹|Â!!þˆ[½VKêÌ uwÖøîOhÝW £cIap¼W’ Ó ä}›ÊGºGøùüA_ªŽ›¿£ñ—pÒcÓgu éüêM#sBÔÉ´ôº ­¬'q=?ó»¯ u¦?™@‰VÆVÖ=‰®ÞÎ/?üyþQr„.ÎÿË(øçdŽZkÑ›«·€Ïówèúòçwo/ºªÁ¡ Â%¡À3HG±”¶L~Èî³2+Ò¬úeuŠŸ)9RPSEh,U(ܼ¦PbʬŸä‹¬¨M…({d•¼mŽði•§+o=)úÉ–ôà ^ëI=ž%Ûò+ ­%Þ|»Ùm+ûîl!îÒ9~ J„ªÑÐõv™A‰(ѧ{¦X´ª6wÛµ‹<ÿØ|ǧ URÚZÕ‡·Áï„£ a­1£J¡Ï|^x⫈ˆAEŠ)ÈË®/ ¥m Ó“M›ÿ¹>o°òc<ñn‰„Àœ1¨èÚ黤ÊSôUe–<øªí_X˜28 endstream endobj 640 0 obj [ 639 0 R ] endobj 638 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 640 0 R /Contents 641 0 R >> endobj 642 0 obj 1536 endobj 644 0 obj << /Length 645 0 R /Filter /FlateDecode >> stream xœÍXYoÜ6~ß_Áǰ‘º×ÀÆ^7.|$^¹AäÖr½ju8’ÖŽüøQÔ±£i›Ë g†ß ‡3ù6ÃȆ?‡ü'ˆJòÙ7ÅÃ( ÈñËó,ßQŽz!ʸ`oÉEÔÒ\%-‰ ú4+f6ú}öå+­myèif”K5ËÙG0îù–ã‡Q)_‰…Ûp,IŽÞœç–Bºõž+²ÿsïMLþÙè~ö.ž½9ó¶Q¼îR€ãŒmÛÆN€BË!ÿ 8G_^Ò†¢y’°ºF´X¡“ -îÙë¯(þc¶ˆÕA…‘Jþ,‘O½žk÷¿¹¦ùþº–#yÀ±ˆ'âŸ2^õË?´KOÀ%w£T›‡Á¸ýJã»ãðضÂ^D°íð÷³ì£6 $·½û<ö(»æè5ò‰¢W¬JËÕaÍhE¶Ò’ M M•k½LW¬hÒuʪÚÒÌxæ:^§Š’;Ì&†pÅÖ†\Sêå ®Ê­;Ê»¿XÒL׫ X¥U²y¶dT ´ˆ=€KžîËÄʺNï2ƒÓªJYÝ1ieHPãú̲òI`§8çE·f4ÙŒ5?Ë6ScUæÕ˜ÎÖ ­šŽ,«r¬Xu„D]w†TžÂÑ‹{Ù»mÓÓ8ÂÒ!–ãð:˲ZA!Ÿô9À\Q6 %¢È­Æñ\+Ä>×I- Ä<+Á“:Ù°œ 2ø# Tp›€†ÈÛ¡ögì%e¶Í‹Ñþ(²‚0´AVû˪bmÒ²@ÍwïÄ \¾5”[ßiþA² Æ©Ïóæ>}dyòV×ÛŠ\Œ^ ¢€xn—¿ºŸñBï<IBŽOrÝ^Re¡ÊH7£ª55tÉÔêO…¡R qŠP™Ž»‘}J¬CDZ®»õßEùdìL¡%&Ç–ƒIG÷B01Ïy\eæ | ™±Ê*¹¤z¥IŠ#*qqBµV9(©´“§Ýòüj¹¸‰;M•^Þ~8Ç MÂ݈Aõ@³îXB·5›¶-c°×¿Á)DäRã/ÉwÛq¥÷¼`]º%‘a|ˆDªÏÒO”ok1bwÐ'ÇHŸN¿Ø4ÊÃÚ /¶zUþ¹³Ð—`OE‡™šY>2G޹òJ=2n’fÉTKªW²$dšæýž&Tõ”[²lBy§²-<‚¨X³­Š sâvXš+mW•€z_Oå»0Ça×&^¨^syÉ Œª4§Õsï_ÿÈaÞ· endstream endobj 643 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 644 0 R >> endobj 645 0 obj 1847 endobj 647 0 obj << /Length 648 0 R /Filter /FlateDecode >> stream xœÍXßoÛ6~÷_ÁÇhŠE©ðtë:t0t Ї¢ŠLÛB%*‘ä¦)üÇïøC%*v†ÝÚ¹;‘Çï¾;ÉÞ¯B„áï¥üÅ2‚Šzuol!bE‰1Ñ…,HpŠjd””¦¨’'¢bÄHYÍh­ìÑÇ•XaôÛêÓg´A8 èa…=çÚ͇Õ{Xœ&A”¤Y–¬$ÓT. E®ÞÕ½iÔè½t„ÿsô.¢($ÿDíV?߬®ÞRbt³K@òbŒÃˆ¡4ˆH&ÿtS£O/Þä}Ž^ï:”‹ úeŸ‹¿øŒn~_ýzcU^T)øÇUO“4ÆÓ/N­Yûh…Ÿ8ˆ´ ,¡‘üT™ôšßòà RE—þý$=Æ•3yž,ÅÛ\üé¼091ÄA:ÉHˆ©Cÿ´Ê~0k^"åÚ6ždöªëk^8âßîZ¨¯²è®-ë¼}Ô^½Í|’0Œikíä>‡?A/ŽÕ¸¾vm¯^ýäªë»¼å¢ßó®üÎ7î—kL5roL/…Í•¤¯hÄt§X¸öœ%qa¹Sidœyˆ äg„«´Ve3‘+y]ñmo5åq¸>ïkÝ–»}ïeÉ ¬öìË2èëQåõOB2ŽõAtåNØqÝ/ÊmY佄é­¹š-x„PhÈPЦ:ÔÂê-ßrRðkkrw¼·Êö Š^—œ6LQ,N/ò*oÇ ‡Ûû×ê-òŽû‘hÉ,= ÖN” }ôƒâ¡›ü›k+@*§W8´2m“‰>ꈞ@}Dë¶9ô¥à¨_›Iz$¸£,ˆ™¬3bºÊÛ#ÊM=ôû¼Ge‡ºGÑç$ ½zD¯¶—^•uÙóM0¬ÀV`YÀ(ìá8Mݾ5áp˜¿Ðõ&Ž eAó;;¡åmaIF'=o–Dµ*ˆ¦Í+EäŽ )?o[8N%7lšUì¾RùœVÂ5„mkQ²ïÂâ Çqð€w²œ”¦p­É²”F†Žs‘¥p†fq–fxˆ¬ÏÛÚ¼—Ñr$‘‰’×û¦'@{Êk‘œsq|xÿ‡?ß›‘X§ANMƒš7"¯Ë°ÎP…°™<ˆí±Ô•õ]%“K$@KY ŽŒô—2'çÄô£¬™!§‰‰àš8…ü bx}Ë7u2´e~ ñQ|8 âDn±(6| ùNå[YŠŸçª’Ï¹PP¬öiœWŠtÜ,„3œÖí5úìO#è\& sE¢ûA:Çà|ýrªïÆ8®]1J’ißm w7-ª›–ëÖÓ½DŠ »2dÎ]ÝC6p¢æ ÉëNué˜ÈÛ%´/™s m¼›Ã‰6S¸ZbŠCè-ç,ôé˜É­ Qœ œKòš_˜{-Óúü2¥­ÃÕLkg\¨ê–i,ò¦àº;ºÎ`Ū,ÊÞ±-ø÷/±i<‹¬hD×·‡ŠÔßMË­ =Œ±lJD˜ÀÛݽNkh/6׎q¸œk팇c±<ýø|gNp~la6‹mïŽåvŘ„sˆpÎc€¬ªÍ÷/ž ³: Mù»ÉSLƒÐ}ühÝyþ˜ÃÑ긵>t°G‹ëºU°O,|œð_ƒ!žFf_'Úv‘ ’RÇÓ¶}’T¾5r+éȵ,ã„J±³¦f;Š‚rkEu Šá¤ ¬åµãnµŽËS W·Fm‘ì-­;î 8.¬QUÓ9³KaÅÛ6/¾ðÞýPö{«ÀÆ[xtÇ3Æš;yBªn«gÿþøÐ´«C‰Vy'¬‡ÞK«äVÒŸÌÿþ 2*¦^ endstream endobj 646 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 647 0 R >> endobj 648 0 obj 1541 endobj 650 0 obj << /Length 651 0 R /Filter /FlateDecode >> stream xœÍÙn7ð]_Á·8€Ã{³p ¤Ž’¸p“6V‘×[™’Xí*»«8FÛïðæR„>´õq†sqf8CRŸgø}!>R åvöYã(J&'ˆ¦8!Ú" dq†JAØ = %VS+`ƒ>ͪAogw÷@ô€ŽÑ㌌„+1·³_@yœà0ÉcÚÖÓ,*BœÀ`¹E/¯·z]Kjc½Dþsë}‹Bü,"h=ûa1{ù&F” ÅÊ¥€ð3%„Ð0E&~´Ø¢»³×y—£WË%o[”Wèj“Wkþü-~œÍz¡RŠL¥þR,ó©7G¤?ãåšÅ;,üG8T8Àà †‰©R‡WŠ 3Œ¥»ÔçA÷hQó0XÒoÿ¦òÃqI#%8ëE„’Äs?Ëþe¯)tÛõ¤ÃõY†£4‚Tc¡ZLË;´ÚWË®¨+Ôîø²XË\@j/ß$c)Á Í@ 9Y KIœ&d=‰””‹Ãb.Ñwß}.òõºáë¼ã–ìý‰.ÖM½ßÕÕ;Þ(z¥×Ó–E˜‘˜±,Ð6;®çèEBЙc6¡Sß~üðëÏ×ïßø¢ä«Î»¼áŽëbY—ûmeÀ†¯8L/¹%¸3ƒ?<–í6Í’¡ÑZ¶'ô/Œ1ºGM±ÞtH™b¼>ÊhÈÊ0‰EèH¬dÞJG?-d:ËíèK^î¹…xS|áþݱtG–ïv¥ŽšÅÕ« é6ÒVJí¨6oÖû-¯:l1ó¼)Cë¾iÌÐ;5tŽ}"c(&z$c™wÕ¾ß̯¨8GªËývV£g¢†=ðU;ûÙoÏÑ›~BÝ‘ÎÁ™,„›+ICݦ¯^Ý»¾G .²Iç‹@à¨ÃO~]‹Ø-$e)¥ÌÜÞGüúY­ç*ŽÄ¼|OkyÞ,7p“˜QÉÅ4†fÑļÜ) ÏQLä‘L>vÅö MŒÄrõPY¢ÆòÁ¤z0ô}IªBK¡e¾±ââ®w†ƒ—V˜&ÒÐýØrè}Ëçï_© T‹¡K㺾G¤×äzÜ„4Õ3ò)ÃŒI÷hJD “¥™yJ5ðåI}ŸÞÍߣ ‰Ö>CeÑv—h!'T{+ Ä·6Иép)4¨y$ze¡rä "hÀAûż)÷.$Ïo„¯zôw0~nA endstream endobj 649 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 650 0 R >> endobj 651 0 obj 1906 endobj 653 0 obj << /Length 654 0 R /Filter /FlateDecode >> stream xœÍÙnÜ8ò½¿‚ov›!%QGàèÄl{ÖîÌì Ƀ¬f»…ÑÑ‘Ô>°ÙŸâ!‘”ÚÇˬb±.V«”ï3Šü>?¢ÄCY9û®qEòCb!¢IŒJ¤˜Å¨„ÎRè¥/±šZôÛ¬šôaöå­Á ÝÎÈ„¹bs9û;g!öÃ8I­«‡i >a‘•èåÇÒC§µ¤îµŒÈÿ\{[#Ÿzÿt={»œ½|Ï%h¹6! üL !ÔPŒ}/¿<´,Ñ—ÃÓ´KÑ<ËxÛ¢´Z¡w›´ºæ/¾¡åO³ÅR*¹ÈPòàO„e<9, îŽkÞ`áo€}… öX$¶ }½ú§Øè—LºKý|Ð=š•ux|YÒo¥ð‡ï%)Á±s#”D–ûÝ(û‹½6¹H!{°'ÛC&Ñu’¥-Gõ–7[oЫW¯ÑISߢ›´Øq´mø*ÏäÎtRßð¦H·mî€ m:Dß(wXb¼Gq†ZÎí†W½Täm§…Ùø7è ú':Éê²Lߌ·þ…1Fß&’Å^àƒAAlKzŽ=cŠ%HÚk@e¹-äû<è ~ÈÛºšëVÂ[ôŽËBlÙïn97ò¿'o'ŸmÒ&Í:Þ€×ÿà†f"/b / Ä÷•8­- ‰VU®~ô‹“˜’·^Û¦+Ĝڼ̋´ùÏ7üšßÙšLl‹£‘mûÁÙqB-ÎN§™È& KŸ–Xɶ—ýú±f"ßÙG' H\¥«=*$8Ãi 5‘8ùï" ‘3þCþƒºðõ0ŽÀcG>ùúBkµØ5Ð[X4qx”Pø3ÌÛ<ÕOXÅ8 Iò”9ЉU¼ê,ƒö¾æ>¡âŽ`¨îCC”=ù¸¶´xX‰çi ÍgYC­Ý]½¤¨ƒyuS7@Í¡Ÿ’ºè¿/…/ßG{Äz¢Ú@‘¦ <ºì„{&$µé c‡ZÙzˆÒ ûã{:?d8!üÀéT—#ÿ¡ÃçÍ€îG ± ÀIÁ׿4ôrÜ:å²v&+˜_>@Ù¥Í5ï¦-¡Ecå›üzÓ!%wJŸÄ8ñ|hü(³uç×IÏ'Ç#¸Ø<Ë»â^6 +ý.ºî™ <‚}h4IǶ@m’·ªKHoTAs#E­Ä!ä±f3(Ž}‘YèMšMÊp¢[9µ”,"BR˜† òôƒëÒ?T7¢Àm‘fÜ’¶ëÀŽ\Q¶e ½ÄÞÀì³ÅFµ]¯y%³ÆHmŸß×t2u?óGNªv%oò éŽU4në†sÐXYÜÁÍ®›º„îGuš¨«!›kY;à’LT´Ó4#pCMèëðZÜ©¨ªF‰‰$Ïrݬpª;W늋ïvisom[¤º_Ô¼ 4µØÀçw7÷‹è,+s~™Ûu'¼Oyusj𥹠d†/m~Ò­S7ŠiÛqc¯}à›ñE­•öj½®›Ì"s};@æ® 1…ØîšmÝ;Q¡~&+›ÕºO*­ øÆ"/Ã\ÙjéÂ6Õßbf>º8ü-Å´Àï2¾5…Þö¥ø”àøRß}„ctøöãÙüâw‹gkÎá¹½0 ´¸¿H ˜ÑTÁ:4ÔA›°·^A¶.Y‘w}ö+„;u=!ÄŠ9 ¿S‘Y~dÙ:¢·ùîùJHGnT—Ådn9—ÅìDÑ:$peo 5Çœ¬Íº¯;°Í×ÖΆ?ªÐ`¢>ÚZRÌÒr»B4\¸:ù¾|ý豜ʡ›úÕóG~U/£œgaË {^šœU“å­Aöó¸ ¥Ûüª°0ýwÐÑ¿ †JäxåÆ*sáÈÀ·›\}yÛ#~Å۬ɯ¸ÃÐbµ±h[žíÍbæ–L|¤Sú œÊÏéQ∑$ YhÚØáÛ‚ü:Ú ü3ààrešÊ/6 _Þ •߯ž1³0ÆPÀ÷Íï,Œp[ýÔØÃj íÈâò¬T{¾ÍWÁîd<–ÒØ’. `.ÏšÐ]ÖžÍÛÖ ÇêQØÁ®|=Ã|Aù®a‘e¾#LË6®wœí(òœéÛX®`×ðGæn…˜FÐFfp\ (»–^\.ç?ÿòõÅ4¦c†#jš`çðBˆÂ$Š‹gËŇÅL“¯vÊ&º1—CwõK{~þi1?“Ç—ŸÓÿ`!DDŒ¹6Á¿Î?¡ïÎ+ãMYÑ3°fÍ‘E ¸wL‚cJ¥NçË…ä!ÈÞ}d¦ aDô1!ƺœ-þ±D áçz~áügðŸZʼ endstream endobj 652 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 653 0 R >> endobj 654 0 obj 2401 endobj 656 0 obj << /Length 657 0 R /Filter /FlateDecode >> stream xœÍYmoܸþ¾¿‚`ÔDIé6€ãlZrÎÞ´=$ù k¹¶P­´‘´vÈïðE"õ¶Ù;׿r1gHÎ<3Î å¯ Šü÷Bþc†Òýâ«áQ2äqà 8¢!æ$B{dˆ(ˆP.ö†r‰zŠkVkâýsQ,úÛâÓX´EèiAFµ˜ÛÅ/ <àØãQÇ+Ã4Ф s¤{ôòjÏÐÛR­nÑKAäŽÞEäQö€ˆ ûÅ›Íâå»Q‚6;ÒÏ”B½EØc±üÃÐf>={›4 ºHSQ×()¶èò!)îÅó/hóÓb½1†*)*”ü ±Š§ÞDà“þŒkßrá{šÌ°HNåæxÍO9Ñå.ýsÖ=F”³yxXÊo¦òùs åFJpÔ;J"Çýý(û“½6:H©»³‡í!£è*Ä·=&ùQ ñíPAee¡­{ù.ï÷@=‘û!ª•€Õ¤„×èÕ«¿¢ëõ¿6èï?®Ñ»7hU‹¯GQ¤Ý‹BTISV¨Höâu«oä[†ILäÕ´¾Ñ«=G/‚}ô¬y–PX:JƒêÈrgljv :N‡[Þæ!«-e µ¼4qˆ;Gܱ[Gs=ƒ"©ƒ=Ïj‡‚ɽ(FæèøU&ê¥ciå®ÔÞu|Ê}LdR瞯}š€)÷…Ô À1_K;LîrÑQi™÷…]¨¡¨áV¦ªnÊSY7I£Œ¨qÇ»ÚYviß»Z‰Õ׺Sû²ŽŒÄî(Í‘1Z€uVÜ;vUå“+©¹-ä·iP\Ÿ7ë(!#ÌÝ.;–±OkˆùŽè‚TQŽÈJº¶U1vúXµ†$}°›ŠÇ2Mðîx»FTC@Æ£ÜÞ†¶CR5YzÌ»Ù8fˆ/-÷‡\4b9rT exÇýû¦96t¬§,Ï-Uuw^Ó‰n³ÝNTænhVçQMîªro©”2ß¶aKoÜ•…xšU }Ò3E8rï~›ÑÞ:bä?èìyˆS(ÖF¬'Ûm~ŠnTY‘V]ö0óåÌÚ<©e64µ gª³[ÞU1#U|Kd¨8ØEnbjj±{ùæÚŽÛëßçxaœé(t¬ƒ;[Ô¢jP—^u•œàا4”6YàCñCÕýB¶OÌÇ”ûPƒJ¡˜#H;;¨½/¨l´Ãz~|÷Y¹d¹2rÔ—Ù•}s:¬þŽ˜ŽtVÛ¯”wk!ä˜dE-/Àaq> )’M¨a==Lvb´EîRé‘"—qŽ‹@ ¡F…ÕjX-œ¡î{`Ãó¢û!˜¡w k蜮Q‹Q4è{¨Gá-Â1mÏÕõíúfƒ®®7ÐÏ¿n.Þ¼_~vùá=]"ø—}~®û¬[Ėöëç_o׿|\__®Û>+÷Y”3ì…è‹Mcwùñæf}íjwOt•4òÁÀ0Žp‡Ú+••GkÉÇÔîžî-ç¤èör„ðu˜ŒA¹¢Òrx| ZLJàÅÛ%(Cå:tš4Œ.OvËwúI·|†r˺aéT>©K¥%µ¥––6[ªŸ: Ót †Jœ±[ˆ «ßùæÕÀ£,Ë|2ð`›ñU¢_"i“v’rtˆ-”`½œïÐHÀ’±Ë*ð²Î×K% *÷·óµHKxëç¤q¦Þ‚T¥qwR=,z¹œð¯^Ô&‡¥“#Hå†}F¢’#¤Ã°úys OèáP²X‹¬Ç8ÉÛ#5l §‡ÉN˜ìÙ[*=2Bä2Îq¬|£Âj5¬^.Ÿ@ãØð|†èÎÉå=ïÖÐ9'r9 bBrŒ£0ú/fó¿Œ/"8J'ÐhBÑå߯޿=¡‹’åDJé›,,ŽqL8¤€ˆkÍs‰¢zxpÈJBÿô橾¬³PµjJÏÊö­:µgnÙ蘲~tĪ8îá ZÎ9"¾;ê¦j;ðìš”`ÊÈ…µh2ý\T[k$5À¥xÎG ìøc»ïÊ2úEm7áópßû­äóqT¿OÔc/‚Ûîƒ@ùÙY ¼(œ­º„è*Z£™gÛ¦+1ò;Ì€ó¾WÜ%‚ª‘ ‰ªFÕ<.õõ@}5( ³Ÿr¨+؇Ëû‘©smÜüŽ`÷={ÐeÅqÈÏ2ô>Ä …C|î·Ÿáf¤èVi°WÇ1¿nuÈ5’_‚ÆAêÃ)ž#qŸ­Ha,Ž›p¬'YÁÞ%)t#Jæ®à… Ú꿞š¬Ë<Ûk;7RPÙ @®ñ[;Z)Rß'¡À~±fªlŸT¿MˆòŽ ¢( ‡ÐîÑF c§GÞÛ‹´ùÁ ‡2‚> endobj 657 0 obj 2107 endobj 659 0 obj << /Type /Annot /Subtype /Link /Rect [ 288.06 436.5 353.88 445.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 162 0 R /H /I >> endobj 661 0 obj << /Length 662 0 R /Filter /FlateDecode >> stream xœÍXQoÛ6~÷¯àc l )J”TxÒ¥²Z»èCŦca¶ìHr»þñ;JI‘¢³§nmñŽÇï¾;ÉK_&aøû³ø$Yˆ–»É‹Ô”„ˆ2©Š"IÀpŠvH iœ¢­0 …‰ÒV+­;aƒ¾LÊ F¿OÁh…p£oì€w0óÉGp³€²4Ë2É5 Hš 4`0XîÐåí.D×ûÖºg/€ðÎÞdDIø?`„ÑóäÝbry#‚Ñb­K@ä™`Œ MPÐ0B´Ø¡‡‹ë¼ÉÑÕrÉëåå ý¶ÉËgþæ-þ˜¼_È@[”¶”Bø—m= &âgŒZSz­…Ÿ( 4ACDbj+·W~ÅD?ŒÛtu_oz$”±ØÞ¬6o?Ò¹_±à ì!ØHÿ°Ê~pÖœ¾U<‰˜¥V0EÙðêk¾EðÙua]Þ0waDJE‰¦ÔZ?GŽø_‡ J´Ø—=Hæ‚0¤©By”Bò.:<-kä_ íÛ·¿ÒŽÈ\qzÅÞ﷋ȼ°c+Ò:Š1 ¶Çºêâ¹Ô3¦O¡û±8yíA!hv.ÄtW” '„49·0£ùµB‡ÞOj4Ýòu£¤C^ñR›MWyÛbÇ•FÐJÖ¾vkóV§že6uå©ÛóiUÿx‡î ß:æ}Ë¥WвM!·tÂÿÂX¤gÌ—›üQ}ÎFÞnŠ©µ *QùœñcíŠ;óžÓY}ƒÇể‰pl%»?1à?‰Ú4èa®Ö4›¼ÑRÅ›cUÖæ47€Œ|v•ÎNܯ cÃIŸ“@«n×'fþ¤ÆàSòç¼)¾òŸŒéæŒ)_–{pT}+jw/"ñ;Þ ‹‚Óö (UÕx—¾:w£[ûú´ßo9äÃ×õÕ,´½2r£4¶OI"[µÌí¼ì~ÆZ:è{N>«×Ür÷"K|¬ÇŸ¡˜tIp6¶ »dz•Ñë ­®f׎•ë+êÂ_ÃVgv¿}ŽvQ7#h,ò3‡Cæª]y@·sí¢©ŽÍ¦+ h­\ÐÒ[Œ+„‹Å§Ïï!!7Wwsñý<û0»ÿ2s ö&ZqkÃ6¯Š%œ¾Aš¥¶\¹‰`Ô›VÑbážcѯõ¦¶ïù¤8m¯L8¾uñ7´ÆÌ¢n¥Âþ­RªÝþŽE‘͸ܗCßN¯6lvåÓüc ü³ endstream endobj 660 0 obj [ 659 0 R ] endobj 658 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 660 0 R /Contents 661 0 R >> endobj 662 0 obj 1257 endobj 664 0 obj << /Length 665 0 R /Filter /FlateDecode >> stream xœÍk¯Û¶õûýü˜KRɭH¶æùÐôƒlË×dÉ•äÞdèß!_2%_wºíœC‘çý"}½ã„Á_ȲBíñîW½ÆI&H”ê¥$%<£)ËÉ‘h$OrÒÈPnÑ`¤VõnDäÓ]{ÇÈ_ï~þ6í£ y¼cq$óñîŸÀvêÝ„T»sH%•VÞQïdé@ϸ€ÖpøýÁ#b¼êpX·÷˜ù‡NFïÕÂcÄ Xã8͸î»Ç V8K/¶ÙxÍ3Ê­ín9XŠ”æÔ`!fÈ)Ù£TŠ[Öz ²íŽÇ®uxÕTGÈ,·€&B¸l‡X Ô-Þ|N1ÿcéÀ‡ª­ú²©‡RFÒ<ïM‡A…زù#N!ê!ÿŠ9“¬çÓ–óüb£—·‹ÆOÓ™ƒÊèPrȃC½=8•G¸tà°-›²÷Žé¤@M€ð¢Ò<ã4)rÆ ’†­A—¦ÞÖʲtA0ÐFœD —‡±?oÇ®_V:JÊŠ¬(xÿ7Ôa¨Ãtæ"•#ôTÄ.8Ú’’¥Ðv´Á.h£Õ-m±„ ²ñ> `®Ñ¡µ·í»×ßxG (#Üãÿx¨z–N6D(R#+TüD6ã@ŵöÏ#ië4ßP'¢‚S'…šŠCž²ž*ШÆyÃÏÍXŸš™D‚Þ5%핉pwÃhž2§ºKÿ§äY{>nªÞ`:Ú×U³ †Î‘.N\N˜Šdi(RY0îÆÎ©JZ3#zƒ•E”S/’7âœY¦òŸ&­V®ÏÃhàµËèL4”G ›ª1Ý1~=9zΆ°#t¸v*¯µt¬ÂL‰Š r@X È©j]ÃqAë€ÈÆm„¾s‚j¿iÜҾ맟ûzèZj×Þí-XÁ„Q¹ÝÝÞ—lð¹xÓ .íºÊ!mç„;tÍne±Ò©P}ÙV'I$4Yž_˜ Ò§/kð/%2”u ƒ|Ú–`Ã’È(ƒP÷eKQiQ°"†;V3ìvÕC_UWâ1£q )ŸÉÌé0!%»(v)Ç-ï”TÊ—íW›¨Šm]ˆ'5Ö~ûüls ¢­ ³ÊÕ‹ã`ˆãçç+ƒÖþ.WP!+(CÑ5tbsß6`E1Œbà§IH׈eFW«¸š\ôþ§~XÍhÓÑÐBLYèˆû“ŸÌ_nIW þéýßßøôžº•wK”–Ëe’ÑŒe M…’™j™%vwè-Õ2O¨€^ÄEwÒJO«c×W¾ØÂëZï“=WnEÈ™½ªîx B§DqàiAÔöâ^GwËè`²«NU › &ÊUÙSëí&>bhïqYx# 4\€Y¢ª+Äy±~,§i³aÁ¢%cµŒD †±X0Îíwä‘`^,¾2+x±V I>áÍ›þ)ˆ»U’6HwzõHN‹DDÁcŒó"õ'’¬”n]ýz.pÌ îrä%¿“µ¬Qsë|ÇRáf—C†QrÁðwWq*ïrk(Ô`ŸÞ­˜àEÌq³KþiÅé¨GTË~+Ù§„êC%¡N•¼4וçq)ÏäƒaM_6$ËÜÞ œ„™^Ãjˆ°~X@D×"DTˆàµÞyÇìì ñå–Âbš›–Šn‡ržú#9Ooë+Qôä;QšÏ÷ÄõZ‹QÜÓÛ´ó 뺶 V Ïx×Ò<ç— ÎŠex$fˆÈAǶ¢Òò0M*$ì¸ÿñ§7+òöõp»‚p6‚è‹YD£(†nœz@Á¦æµ4Ï¥á8­WNS¬3´ž˜¦N³dæ˜áÚí/ùf†»s&ö²HXuKƒØ¦å{—'"KŸn»å$'ùö[®£å§3yq|ù=bÒÜI:C\™­|Ë´9z…Ù÷Ý‘¨·FHOõл"rÊØ|•ÿÌ„²œÍ‹¬ÈóBûévÓÆMeyÓS̰"0 ëÂ¥-0¨QCš¡½H¦åìI š¦¼È3œoU뀡öê9¥"—I‡ֶ߈D óO6|1’Ͻ•GMÿbb#lK¢Û5JÆ`AY`,²÷ÔÆ›ˆ^—–]ýA¾þ.$ŸZìÝ>tOƧÖ@ÒPv¸'¢J'Šã’⊠ÖTƒ¡æšDë¨[ͽ±¯í<_jQ[ùoáá‘YŽe¨u¹HŠ<ϲÉÓ‡€»ÌÐhå…¸HÅ ‰5^Q_¸!{£”Boí„Qùø£ZzHÜ ‡ÕSc_¶C&ܹ¥îi-$—“I”¦3œÞ¸·b¶]E¡¶©(l2€ãÒK …ç'$,¹`í(~~~íÝ<<º8U–LD¾‹¹ ÙÕÇpZˆH'ž!a&é|e["*7´¾×_žö}‘ÂMZ{ #BÈÕJõ@ßë¥îiõÀh4ÒùE>ÃÉú%7þFlâo\zi¡ð\葨¸`çû“zû‡-hÅAÔˆ“ø/(.­t˹+A¥Í ^¹(f—¥Ip÷c¡¸þ ®á >…Ô¼‹Tb_&BóÁ·é9¹›¯OœÇ3dÃ÷"i¨5LuÍ×™tÊbÊAô¼Ìc÷‘1÷¢«‘e3/ö.éÙK*ÜÜ4©[Šgi›Èß¼³´M¿âžOŠ•'Zu“$øË("Ãy3Œõxg\”B™Úe£žˆàú^È ßÔPòzo ò¹q˜÷üƒ øH€°å« W¡›˜Ùqõçj7?©in&zïö §Eb7´7ÒÕ¿˜+X_` ÇÞÁjÒ^…6ŒãK–òwGý]}©Á pÍl»ö…rZm…—j5ª_ÉŠðž©ÿ¨ïßçý¹ endstream endobj 663 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 664 0 R >> endobj 665 0 obj 2843 endobj 667 0 obj << /Length 668 0 R /Filter /FlateDecode >> stream xœÍZYsÜ6~Ÿ_G¹J‚q‘ S²ªœXÞUÖW¬q9²åjÄ‘X5‡Lr,«6ùïiܼ=~Én—º›À‡¾€n@þ2£ˆÀŸõC¦ -7³/VF‘dˆÇVňJ“me’(Ak5°Eª!–äZjGæ}˜mgýköé3 ºEGèqFzàærö;,ŘÇIš¦VW†i’¨%8ŽXnÐó‹ C¯vz´Ó^‘ÿ¹öM8eÿt7ûy1{þ:B” Å*¤€ò3%„P.Q‚9KÕ -6èÓÑ«¬ÎÐËå2¯*”moÑ/÷Ùö.ö-~/¬¡E§ƒÿ%ÖùÔú ÒþÒÈ5/Rø+072`EêÓÚ†×þTiw™Ÿ£î±PÉÝ`i¿ý“‹ÇEª‰”à¤JYÃýí,û‡½Ö ¤Z{ÜÒË®Å}Žž¡“„cŽòoÙæaWA²[z¹ÛMínU/rêt×¶Úø€4cÐÕê»J4=bØžCüÆMQÒÙ·°T¹*‰ÉÄkøC;Fü‰ëgèj @tq‰ïÞŸ÷Ò:"X¨¼Nâø°È½~ùæ²L´j`Ç0Úé j#h)Žgü´hÒP ‰§À¨¤lþþÍ›cа¶vdòýü?ó·æõp“d 㸬« @M“°tQOÏÆ`•P)I >+)€e V´{€·Þ•Õjn9£¯Zœ¡€Œq+dšÿž{©êGzqÀd-ÑD"PCÄÀ ,j$)Ô²‡ØHÔç¯e¿¦RÈYÂb·ÙðóùâÃùùÜM‰¦¤Te”‚Øzí&¯s¨¥PZn‹eVçnvڟ͠ˈ4Œ±föioúúé§è´„z¬j]î¾loÏP4‚Ê^#vÖ¯€\b!$$%‰Æ–r“õŠŸÐüí}FÖÀ¿¼¼úí·óÅ»‹_П(ПµrýEÚY°§þËù«aÜËú&¹!"±Aº|È—ÅJõ,3ú(óT©lÏ…¶{™éš }›¯2Óg¾¨<,ž /:'†“2&¢Öü±FpŽwü•§”ßýqÔWbЭ•Îý…†ìÌ¿ì ˆ…iÅŒ¨ÞMåo":¨×Ú€Tª>ìì…'¯tKíë¦A-¦ú ;67 žöñ‡¼?^[àöÈl~–¨z}‚-Цb²=Á§yNcsvÂ$XCòö&‰û¨ÚŠS×2z¹ÛBW^Û4Ÿ·6:šËéNVË>õ}àvÛÆ§]è¹gXö^…뼫™NvkÙxz@õKxB(“}[ÿî2é`è«ñÞÒ8’Ð>G”êºNVíP]ÀÝŸªg5ÕLéþ¢Ÿ+°)Z£_ίЄY3ŽÑã}±¼WMF†Fu” &б@RG}ˆÓÆ¹ÕøuIh Æ c" Ó”2íãâ¾½1ôcêðÕÆ4‡\ui¶ Ôôø9Èq ål9€æ»…“§~a¼-‡^ŽõË6„çõ)óz_n+ÏowálãA#¯r4[„éúm{ö-Ì*‹*ÿ1_põ2O\™âAgØÂ¨]!ÅÐèªÆ@¦CÓ)ϸbÒŒ²º¼¶F›¬‚ôRÇÊÍ“þ¡Ï›<ƒÔUzÂm@Û<~!†©ˆèÀ6ðß8S¯žúMEÊœ”M%ŽhG —”å‘ :¿däî™IúyÛ+}Œ**«-±Î³ÊÑæÄUøã¸·„O¦<¶ôée^ó{Š­×A‡jL‰ß¥¤Á:6ÇCnO݈š`ÕœEP ˜m½ÿýô——¿¿%˜~?ªö»²®¼ Ûz2ÿVç[÷8Iüƒ k¼vº xYÃ^ÈÊÛ¡9à½z+¹Ö¼7ã&,²¯òZl9mÈ›·"#1÷"ìùÅ}ìØ|±÷AooµQl^9=©U5¤UÕ0¶0 (ev¯T5h¸JY… ê Òs™§¾Bú¹œ@½k`;'N¿ ¸‰`wÀ_jÇO+…áÆ¿Vý¬Ì6y­+Ø­‹ò7È—Pr endstream endobj 666 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 667 0 R >> endobj 668 0 obj 2477 endobj 670 0 obj << /Length 671 0 R /Filter /FlateDecode >> stream xœÍksܶñ»~&ŸìŽ ãADê¤ã8çT‰*ÇÖyœŽåô Ò]zGÊ$[}ü÷.° @yÎtÒÆñxwÉ]ì ð>pÂàÏûO¦YlN>y'™ 2õ$•žÑ”ådC<’«œ¬í‹оâAé¨þmD–äÝIyÂÈ'ï?ÀKׄQE>Ÿ°‘psyòW)•i®µöº ÊóÜ.!i ÀbCžžmù¾rowÚ[Aì®}_#ÉÅÿFŒÜž|7?yúRÎÈü&¦€õ3gŒq™‘œJ¡í‚Ì7äý£ï‹¶ Ï Ó4¤(¯É‹eQÞšÇÈüÇ“ÙÜꤸTðF]> ¨„ Ÿôr-Ð#þ&T" (T(°È>ZûðúíƒTÎ]øïN÷xQ=æí`9¿ýž‹ïŽKf9£ù "œËžû‡Yö;{mH»ön{Ø(»nªš<&O¤ L±Xvð¢X¯i‡Ì—&¼ó¥ØÜ­úѬ«ÏÒ,«ÏM‡,#½]®9B÷¹Ô²ƒ._ŸO-ûã÷ß½ªU×¾¹oÚ@¯Mц'E”&(òkñ[A›Okú¼®‹ aÏ5‚mù¦úø«Y´¤]-YTe[¬Ê0C~+Ö÷«±1­#Ýu±1­©ÉçU»$ÎæÂ.CCª0ªÎ3A •hˆY}{kKA3“$ƒÍi€IRrÑ}Â!à¡mOIRѵE;æ5‰‚B"QŸNùv>u2U2iÑ®óêÞá°°°0ç f¬Æþ¥­ ±%Xô%÷—ï¨â4Ž/Ùž6X=bGXn_Γ¾Yˆw‹ók—÷½ï_Te ‰¿ªJ›öåG6f–CrŽ?× À\_¶P‚S¶ä®³Ùܶl\id{úÔ-à éÎÖ‹!PbmQ¶+sM–¦6#)y¾å WͶØÈ7NÅNàȯn®}uv1Ÿý0{óÕ)±Íà¬lÍ­©!:ÿà§Dœù¯«ÇceuNY®´ÎU‚ËÜ5ŠÝI½zœ°àg°å[ÆŒyç¼1Íýº½„FQ7 "È1_Ìâ¾5¯ïM ²‚”§/³qÃæRÛ®Ä|xÎÏ~šu éCÊi’ ;Mx†õêoР <«ø¥cÕ¬¹„BP–Ó³>ò~K¾þúòl±„n·°Ínûñ?ɳ ´Û&šmJ‡V'd·T” ýš3MPñé­Ò‘¬2ü¬ÆÇ!®Aos–בó}€.^Íü!@ÖÇQtÐllϷ̸+Zx±ü–¼'³ËÏž‘g¦Yw†)ß’cAPâJà (“±?‚Ì-æ Ø4P®nNÕ©„ü¾Z&´ùÏ¥æŠJ™1¦ÒNYŒ:xL±7 Ãf)>jì‚fá³—™¥¼ï0 ~è€.\Næ@•Îuct¶eÃ(`NÐT°$×4cP’ÜQݦCöÚÚ}3›2~ ƒ·wXÜSå)Œj Œ Rí·¶>BÅDrjõcZäS*ºbg‚X/V;Ÿàr-µfcú!\Dp§Þinop"Ëí¥—©MéX:ˆ“VBpÊ$1Î^åË^®°Ñ Úb¢ r_^›ºYTufçĀܙza'Í@Òsϲø­ÇߨæW¬G!‚ÙÒwcвkRBY^Ìb„º!É24ó±¢|pUFž ði GÖñ…¶·f4÷ˆÔ˜O÷¦\D1®¬ü»©«H¯£¬jbêNà¨2tQt·u’d4ÙÞŽ0’d LÖI6!¶Ûù“L zÏž––Á‚ ŒÈNîc‰A#gãåxnµ“8nÖ÷çÝU‘”›ÀaQåÉ>Í\E#X¬›*"‡– Δ*ÓZ¥|JáPݨpWÛˆSÙp 9ƒx‰4ßgƒ½&§ØÞEÕÆÁŒÛ/ªì÷¥¸#!l¾@N¬zK‘áI‘֦¼m—4ÎzÒ|ãAdØxxo{˜x¹×„°êÙUCñ­j¼æòÖõž–U½)ÖJ‡‰Dnï5ØE…@Ç›ˆø½åtÇc×oV¨’v—ÄŽ‘Z§É„±ž(IåQ…*£™„â’JNˆŒ:Uõú ™PźÌ?¬àZµC=Kਭø”¸¨ ‘ùØsnw¥‰Ø¡õeÜøl oS ÙÞRyÊYHSqE„}’Ò@˜÷î¿4OÁ½)LŠãåý¸ [†Š]±#Fm‘h*•Ÿåǃv®œÄcˆó0ÜE딽»{¥Ì(t$g™ž2©ß7¼)G5Å)ì?ŒËd¯!àqLÓí±£›€4Õ¶}Ø{£ˆcÿCxx&Cš =o{_—æšFÒY'’ ¹âîГ¼*w¼ú=ý^ïYª_¼=??Ý!mŸñ“õ‘moL}} 2&€o/~ºxõî‚B( Ù·;vWIj/5…oB#%žÛLJhÞ][ ì¯+ùnO‘À SÚωž=e—ÝqÀé¸%!Éyü€’)šË„q˜¢&Vêë~Õ³ihGwµ<Õ[sè­yŽ×Pcù1 .I½Þ½ˆàîÐjðÖ8òÑж˜U á²j#Â#è?Œáûí4oøˆÅâÑaŸÌˆô:þÄš«Í2ç$Æ=ñ¢Ç=œPÆÚ½•ã|‚„Á™cB¶ù²0wöêìU=BR+pÝs­8ˆÈ5Ãý­ÿÙ%±•¿ç [%&ø“Ê yÊûõú¨+l•Jª2eo°»«´!¯¿L³»îZ½«FÐì=±Éþa áÄÅšÊÕ0Øëœ/Ö¸êfwBl#æïÎFo9=攣÷·(ˆ :”§í9Ò¤4×0ue\O(þ‹ ~êfâËûkVìó†HA¤–Œs8ÐåG ýlìàîÚÍéw­ÎgÕ¦I«q…3Ûxé W;-ãöô®$É(ãQ äýxÕMOç‰f¤t¶ÅqmnkãÎÉÚ]•Þ›Â;m†aV ûfè±p?–餑ƒØcÏ2š&’1…7”Ãóª×E}ë¦Î×Má4€óžiõýÚD0Ó}³èŒÂUÂpbY_Xl«æô°×¤ûøè÷Ò±e¿/¹Ì@poÖÛË@ÆRÈzéªù›·³ñ·T¦·Xñ–K¤vSÝ3wÐÔ}äƒ {,š“&v€uæ ˆÕàá}¦i§4e?°ò ÙA7g‚/ŸŸ_Îh@]¬J·«!ÒTSD1¦w1Eìcå¶þö·::‡È£²Ï Ž?²»öØã…£¢e?ð–ãžÿv¸û Ò~ŽÁ{5íy6NFÁ·¸!”¶}°¬;»øí2&Øì¯Xø„È_ÈÖ0nCŠQmŠã|?@ óœî‡»3‚ Š¿Ø­øxÿÞ¦ÙV[ÔûæŸ4I¨Lç0û3Áù¹SüùÅ_¿âû7ÓK¬R endstream endobj 669 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 670 0 R >> endobj 671 0 obj 2910 endobj 673 0 obj << /Length 674 0 R /Filter /FlateDecode >> stream xœÍZ[Oä8~¯_áGhwlǹŒ$¶vk·›Ö  éÑ0Z…ªDªJ I5´?~}Û¹Tý0»}ÃçÄþ|î±OúqÆH¿ß©qÊÉb3{4Ügå]~ø'¹úçììÊ(ªQt(qøSO½2 úO¼X³|Ç…¿!Èå4RÖÆ½æ§zÐ ¥6þÜiå-:KÛí¯Ü|·_bµ4éy„±Ð3?Êþb«©ö¶úDC}‚Qt=n³²-VE¾$‹jóÕES•ä¡Î—Å"kM˜½?OÇHd“ K"Ò±uHÞE±$dDzÐ'–õÓO?Ûñq]=Yâ[¶ÞæÃ•åÒ­ŸÁN§¿w^Å«ªÌŒ†¡ ‚X„ˇ|Q¬ž••DB#r¹aßeÈs>£Žy^Õ?pä˜í}îˆQÅ!áÒ¥‰*šcUºàH9M¼è@Ò…ÇNóˆ4¡1¸ƒ1.&à€E3TÇW°*ó±çB1@»}&0‘<í=ɳÅ=QÂW+¢-±ËPZ(*?E:é–ø;¡*gÑ> :V ’4ŠbUbœ3_éÌb”Y÷!±Û}’²’-ˆÂ <#<À°0¢19äÝ„ŒCúFJ‹(@t"Õy»­ËÆ1ÊÊ{X=5G=]JG«×(ÆCÊcÈã(&ä°©<å¨@{–z‚xÒ7:g»J:ö@7Ûu;½öê×ë3OÛÛmûFeÀPÙC‘LH¬ÊÐNmC.÷­u»c=yI’^v ê¯ù”Ù÷TÂP&û–ú¦§B¦;(7ëƒÑÏO?]žMäRšÒ$e*z¹ÄØÞêµ_¿l>°7ÆàøKõ¢‰'Vº1LplU:òž{RšxC¢ÿƒ©˜sÔ ‹¼ïa3qbÓHW»„±'ˆÝ²PGÎߦÓÈ—žôí©N”’YKÖyÖ´ºÐƒnG“áA¾·~*š|ðøúâ__~»ÇðPÕ; ™?roìÀÙAÕÉhbõÞ”f«¨‹ØÄRÜV;tßöPÐE¨@˜œÙ—¨pÄê=‰pçöÚ½r³ÒÄ«ìü:}¸ê‚žÿúå³M›Ãq ©ä씥SØ'ªÇö£ÐRR© “@NAÿ¬?ˆ ×Q‹ Ùöñ[Å~O´gSõM®“©4ååìëüòê²[2ÑYB¥HU³4Â%ù÷¢i›WµƒÕ]=Žàö)ºÓìñp5¶1QŒ½×Éžfq ‡d!!G=M.tvÃ6Ç¢Ž”¹‹Žf•Uù.ß<´F“·ÔQxo4Xì‘ÈUß1k |ã ¯ò&ïi"AUæpÕ’Bc\{LÆê0ü²eƒ‰)¤¡d|Љ„úÆ1 _öÒSηÖF½nFwu·&){Ô¸ó‡òï M£,GOìSUö&â÷R&#:Lcʃ$âÄDØõÅü—ë³=-Ü+„êIvœmY€U_Ñ2d4‚|HYw%.Æ€F)ÞÐ24‰cÈ3 ‚Ä´Øqd Œfó@¥™~ÛäåÂÑ:q¸Ü>¬» r”'©¥®<{ñ¡ø›õ$Òwæ…ò¥Æ;·rüî’‹ÔÍA™óV™¦=ÔøV‹åÀj(»P7¥T7Ör w‡ÐÃŽ†bªþ‡ˆ¢‰-lVÆêÃ+:Öƒµú‚‹ 8'^•ñîU¶™ÎH”¾´2c@L.êñÅ5¼ÌX±ŠgnRYùøM±Ìñv§9+ §x»\9–vÄÜ7âØI<Ьƨ`ÜFÍ5Žw‘g ÇKxQå¬êjc ýõÄB« ;š†ïÂw¯­/háäéúæÞ6¦Cb¦N®²r?VªT_îPc[ªŽmß–ÊN_õ×þßU©T"ƒ÷ô§$¥Š×DÙÝÝ€wC¬?$ò‰¾’ù%ù/âù1ô©bw‹Ž'{±öÕìˆsŠ­™âìϧWþ±§dG!Ü@¹ðÚd-øP±Íÿ|ø/’v3B endstream endobj 672 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 673 0 R >> endobj 674 0 obj 2384 endobj 676 0 obj << /Type /Annot /Subtype /Link /Rect [ 97.0 437.138 226.69 446.138 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 431 0 R /H /I >> endobj 678 0 obj << /Length 679 0 R /Filter /FlateDecode >> stream xœÍksܶñ»~>ÚS !@€$2ifT[N•8R"›xlO‡ºÃYlïH™äYÕL~|oðHž/ÓNÚ 8K†#Ñ]óô@…ÿN (˜rÐH mìñÚ¿jÀ\›Ëü5e-Þ?,m·?róùsÉÕB’àbp"„ðÈüÃ[ö[mtjo¯Ø×'Ý®o¶e¿¼GÏË0AÏZ¹ª–e/¿õ¤¯¿þ³‡¿i›G|.7;¹¿²^…•?ž/^üÕcï<ôæêòç7ý01åöòÇŸ^‡)¿yè§ó›ÅåùkcÿH/šì)özõæõkô}Ó—w‰ºÝݧlŸ¾5K';AŒâDdà‡Yn˜Ü>Èeµ~‚ÝÏRª¶/ØË®غi¢mZÕìÖá€.îe@Vr]î6¯ª °³¡E½],þXõ÷Í.Zkl;·U+»ÁNÍ:Ò'ž8T.HÂŽ²ÙŸ³=Ó-nàˆÁ(¯Î_ß^ ÷ÏjùY¶èÍÕW׿\½ŽGrŽ‹ŒÀrb9h¨rgUÝË®X_öUS{²–߀Wê´¢¯fVpU­×²•uï)ë¶Ù†J9yoëÕ ìàO»ª".›ò DzõYb?tÄì#¥ÜM¹)K ÌD*Š"ac»8'ðÒMG¶,ò½5Á;g¯6± å”aOÕI–› ƒW}‡Ö•ܬ µÒ+µìå‚%êìÇL3š Q¤Ü°¿VÖ~¬:iÌÚ#ƒX‰%21ÁEÛê-@÷ƒR¦”cb¬7ÅùèwˆQrˆÏ„aS‚S¸."'Â̹4~ Ç9x24nYÃ~ß*¹:Æ£µ]³•Ó§Ð&š8k’A@Ž.‚Ú»|&ÅÅE‹†`4k+*(¦Ž“gt‚ý´ÖæÊzÔ=|‰^ÈÑ:}­êool»YC¨„*Öž°ö„bK›¿ÕÁå9K Ùæx#­/pï÷§]¹ñXßx°©e€[n›6ÐU “֜՚rHWàöŠ"Ÿ’Ëú„×ïËΑ2†‹\Ð)†A±ûHjw¦Œ¡ƒ”§}L;çcÃÖM"?Ó#›âÀ°ÒÉ{Sož²´:y&HÈ ÂM¾£:vNø{žc¢bmše±¿s•Å» )Ì6ðÐáíx´Øú‚Aê¦>«w›M ø¸jñy·æI ~)Š yÛC½ãÃu„®¾#Î_ HLô™@ú;Þ«l#•Üíwê6±êMͬê×pH`åãã)ÄžÖmÎ œ»gSƒB  ¼9¡l‚÷š3È#Ä1^C(ðà*?†ª}ÌÐ d_Ãá%Ôh4°^céAŸ×V(qðð “´¿]ð)G1i™å>6Q=¥ÿS/¤‰BdcE{a¦oÆ+“ŽZÌÈžM¸`¹ ·1×`>æ´‰&Î;‡R©eYÆ&ÄôΗŸAFø1Q·à˜AŠRäéÿiµ}ÐÍâ‡Æ áª×ë|uõD]š²iý !Êy|Ô5èÚšâ<ƒD ;³GºTuqÆ€îÙ1˜~u h^ ·´A× öõ°“ÖœºPÐ,g§bJtÊÇ] P˜òC›CµR»3Ã>–ô™ ºF‡ûýW‚îxŸ B¿€K­vzŸ«¦w¹V®ìêrBÍrÓ5Ûur°;97RE^]ß\\~w?\¼6kê®o˪ŽäYÉuUWª8îp .î£íä¿Êe´b+ËÚõ(rDž]·l«;¹›©HöÌ‚‡º(Êü&¦Ž&©È>žv '´-M»Sµ?ïJp÷ë»Èeßíq€¨†‰Ð‘’±!á fÌO_Þ—PÄcç ùøAIŠ/ €,l•|ý·‹›×ç?ݺEÙÄ"Ê0¥9ŠÄö§šÏ²Ý”ò/ÎG,e‹B¯N­×‹T«n²FNÄéá-±žØœg ¼öÙ~OŒ*g/=d›F1 1;¥ö Ûãw²”2Œ÷‡W T_éhh²­š•¾à†pQêÞ¥A!…²^B@™ …l<È„Ïp=v„‰Ò"ÅYÂámb‚¹—n»‹Œs_~–“*›ÆÊÈéÒ\ìñµ É£ÖAlo& 6¥íjYJ+A¯ÎôÀ,© `duK1fÇpÛÌì=h˜YZÁåæ±|ŠÇê9%šv°ù<9ã˜ä66ŒôþÙ¯DçŒ(6¿Ò÷Ï6ôÚØØ‚Œø¼5|U æ[à3ß½)0¡*öŠ FÚ†\eYöeÖðºjM·Õb6ãÓ˜-ÞŒgPÅ'Æ}JwêÑÇûjûhçNB,Y}ykÓô=zk5Ñš:0V}R˜8² !ÑBL œ"D‡ ‹Äþg(QŒ´”Ë9NáÒø7Íãé`öØ"Òl8î›—”ø'Ú4cÚ9²^©Œó òÙ®Ê'ì?£&X@A™«¯›"§œÁÅEíÇõi<áŠv¨5˨Y =³®O>Á(d™ñó±ÈÂF}ƒx3Ô˜ib^¨¶ ~ aÁpƉÐfÉë.Qÿ÷[#-(N –5ê!s˜~ç”"å6šN7C6§~—öoáç@ endstream endobj 677 0 obj [ 676 0 R ] endobj 675 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 677 0 R /Contents 678 0 R >> endobj 679 0 obj 2939 endobj 681 0 obj << /Length 682 0 R /Filter /FlateDecode >> stream xœÍÙrÛ8ò]_G{ËaxSÞT)‰œÕ”¬¤d&§¦‰’YC‘I%qmöß·ÆET´/³;G©» 4}¡ð—‰Clø÷ý‰—¬÷“/œæÈ%^ÈIAHœÈ í˜ì Gâ &ØézŒÊG#ò@~›”›¼™|üƒ6Ķòmb˜#›å䟰xZ^'IÂeu-'Žéž°Þ“çó½K^Wl´ž2²ÿçÒëyŽû ‘Mv“—«Éó«€86Ym• P=;¶m;^DbËsúKV{òñìuÚ¦dº^gMCÒrC^=¤å.;ÿDV¿Nf+¾QÆ…¹’ ÿEó§Î‡À·»_4_“tE…ÿ}ËCP,7€ÑO7/ÿ¥0uáï¨z8+mrßXLoåâãv‰èDǶâŽE'ÔÔßõ²¿XkCÒµÇ÷c¼k¾%çä™çY 9«ÊL!Û<+6 Íß¾»¾VõI‰´‹ °ÚÌ¢¬Ú.¿ mš>g;Â;+²}V¶Ë´Ö>ßÞ­´±_iqÑaTް­³æPh¢U£ë„±M^•è šŠ]»§cÜxà‚-ÏV‹w3K¡¨~„ËJÁëjÿ˜ÖyS•ЦdC¼ÏöB¡b‡çRmGÂþ6ù:m3óŠWÓ륾“•>WiGÑPOϯ’¾Sú$ý(°íÐêîwÊÀqCÈOg󥆀…š÷\Ëóh=ž;çËÕüöóȯtÞÕâîFC?±±’¸–mûIA¸ S¾cEB'ƒ£å_ÓüRÑÚJÁ£*p‚ÄŠâ I?.Æ™K|Ïu‚× "¦íÞ-:Û½?ݰÊ@óq%C!,µ njD¶UQTßòr§Hë‡lý§Bë¬=Ô¥¦¦¶>h òíÀ޾ß[¼iӺݠ/‚7Å\íb.A˜…ºÄ˜îù‡rCç[’0W“Ò¢Q•´œ ËWÝ*†9Ïnˆ%¬êþâ&áiî3 Õ—c RjJµNGŽuÚd%'ÛJ|ljè©AÙÏ#õn‚%GdS?‚ÓñB t çÉ3Â>»øyOü0éP JѤÃOcV`; uï4üý ÏŸSDõÙ_WŒ c+¦K¸§ã§‹Bù¹Ã%Üîº4о'l#ú@PC_?A-0<8{¹ §AzËr9tóôÌÑë§bô4‚”¾Bd‘‘¸Wc„¾1 îÖ _HW2I±LÌCC$%8aäáȃ¼'!r›îvu¶£Ü®庅C¦Ó£aÁÅšw’I*çoù|1=4L÷ËŽO›>Hë0=tz©ìr8ÿùå—¿“WwïnWä²È¶-³?òeÚ´TXç»ùá#¹Üæ|¤N'òz ®‹ôÐd/hÂu›œ}’Ð ]î²2«YæDB“µVb ÊG5ÅøI‹¥u>ITêc¸—8èíE‰"5@Ä’Ÿ …XdÛiû„Ql“ú.Ú„ƒ—†qoŸ39­Çn+Ž}41ƒÓªls(µk9ΰ 'éoŠ 8•T•Õó! 8j»AÀ¤{ÁMÐ_ÒÊóЦ” zªA]L-Cžæ6Ë0ˆ8ÏîÜslŸÎIBÝ"<}ÿFÂ?$t3ýÝDߨËw7êìýlñÁ@ŸÞš¨Ë»›™Ì‚r¸õ(ìmýY®^¿ž½ÿãíÝ["‘åô†bï§ Ä!7³×óéíu‚š¦Uj)ÝQ¨òdýA¦×׆B¤ïÚ¦-”ÉÕüz5[tSÎoÿ˜-fÖLëõYWå&oOp0ÏwY“¬-(¢¼ã׃-±F¡ñßéb1ýðÇôÍŽÿà¿owïÞþñêîöÕtÅIÿæ¿"ø=öDº xä %üžä¦ ”Á‹‘Ç1=a^Õ–öùI@*Cv9ˉËÙÛébºº[h ¶“¶Õ±$á…aßÇ 'ýèÕ–ÁLðèš:MÓÖ´À/ò–&Ï£TîPHvÝwù˜­óíI ªsD¶!ÛºÚu ýC†YZѺú&ªW+ôÜ]wž–ØÔОFw.NÒ’4§`›†0裰ìûº84ù׬xÒ†ëü8ÞÀÅ1t‹ bÕPÜË/‡¬Æ#ϧi¥aJ¡ÝµJ­¦ŽÌñ¡ôuÚ‘kઉXjÊÛî^ÒÖiÙl«zßwW¬gBš³ 'G^ŠF+ ¢(PzFjW´ÅÁÖ‘ÏPäBM¿p^BU”n$^m%ˆïE›?vy4ÚÈ´5N« lòR4‘#27–$\‰>]{¤{XñâHAèQO{ËÙõŒµìŽçCv–BDö¥"\¶ég¶ ŽkYgÔsœÄ³’Jø t kR‰Cч†\ï¡¶×Pi(ìô¢¡Ô@"R­Ð‘Ÿb[T¥Å€0I‡Ø@T4[ƒãÑ~¨³ ~_å'´óÝA— •G—¥h/­BÆcÙv,‡êÎi†‹J{=shaÆJ•{±ëûsíƒ4œ œb9σ~Ç’8ˆ}ÃêJ~ýZ…ª3˜À4Ý€ž/:ªiÓœÞPDZ3¢ã˜n Hë]Ö´Š <€£˜6æþÃ1T¥+¯LˆŽ›&‚4ëBB ’ê† eñvö7a”°o”ðd£@'8Pƒ^dXYI®%Ö®T…¥¦“Êpó•ô“< ¼»¶-Ÿœ}{ÈQzDÇ/U+ A`úb0dªTyRO¦t¥*Š¢'7q¬$HlÇòJnMOH—ë ‘zB”_ÂãDÌRY}’6ÜÀ¢7‰›¸¹øÎÖìþQ7_zKoíF•††‰Ã¢&p#Ö“9‘ho1¾+”á+8\ϲ=ú2 örRG†mw_+Ž CÛe÷¿±%ˆ>¯èï®®¬žb’óu}vQýöGïÇ…zÔ’$Œ ‹³ª_mçåø­½QKG¶¸GvEøýùÅ@ázÍâw+IŠ*¿íNÃW•¡½¤'ú2ëÊç× öµtäøi ªù]9ŽUÀp®ZŸÜ~"Hiσ”âÚ&AÍÿ3ú¨ÑiÿÇÞìжVÏÇäÜê‚f)t¨c~h)|^êŠÆò1zE>bõ8†8:°id“î5¬<ì?.ã‚À1šßT"£p*!q\DB”á*ÐÊŽLK`X…2¡÷+hÕ’’T{IõÓÔcw,ƒ"Ç랦'ž¾ïÑ?*±Ä®+ä†Ô~ìb5=sÎ;)ÕÙ±¡Ö†D5Z|@æÒKuß Ó1GIMÔ Gæó«™ "r õ…æ°§m1+³ÂÜL<ò7œ½Iâø¡}çŒ3•8‘{l:ÒŽÆÙÐÕãÝ“«XàÅž¸Ÿ£Ì '¬Y»H¡Ïb4 ¡-*ót6GŒ€ Ëê|Í1ly)ígVew|°‘ )ÆÛÆ.¼Š;A¢á®“¸·k<)"Ú§qy/$A ,h¤ mÎr ´mX’ˆÒ#¬E 燃ӯ ç™ÿ(AD‰šççL©/JÉ·j­¢è®c¸À »§'¨uèDîØôo7ð¯@肚— <_I¹ôøØç› lÛpQ3UMï—Š;™ø·’ ïœù³4¿RAïÅóvZ*ä³ö’­{.'UÚPT”xzÌ´'q~.à_tØ$׊b¦?ÈÛ3S ÞõØÈô{w$S•öÐ?ßv¤ª?Ô+þ7öìü ÛLQ£# endstream endobj 680 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 681 0 R >> endobj 682 0 obj 2863 endobj 684 0 obj << /Length 685 0 R /Filter /FlateDecode >> stream xœÍYYsÛF~ç¯èÊËÊŽ<Â}dk·Š–(Y.JtHj]®(C”àà R²þ}ºg7(YÙªìÆ113èãëczzào#4üóŽ®o@Œ¾©5\LG-Ùè.s4PÏö &ÂÖHÔЫŠZNîáó(ip1úíw$ZƒÆlxi=áRÌbô+*·f:žïû «ÁtÏ#&sp$pr™p– ê= Òþç蛈LÝø?@¤ÁÝèýrtrnƒ®ÁrS§ùY×4M7]ð˜iøôŸË~;:ã;ã ‹xº†Ó{žÞ…o~‡åÇÑd© RD*ø¿ËD>µ^Ø–Ö~Óȵj½^Å¿3å®0ÃF‹èU¬Â«žô¢ÚÂ]òyÐ=JTƒ¹,á·¿SùḸĨkÌkED×ý†ûÛYö7{­HÒ­Iyšî;:äÊ6t¯e²ØÌô}J;·Ÿj‹ß…I˜î i+9iÀC˜>³L¥Jʇ§m˜/~ÂxçẎ£Í>ŽŸêi±ßn³|WÔ+<ŽëI¶©Ç(溽š¯ aÍ&¡Ö‚+ÌÇõâ6Þ7I²$lX¯£]”¥ ‚Mž%-ý¿šæ±zélß°Ëã(QÛ²á[ïx'@m»œG ¤;YïÃjìóM¨æa^ Äj.ÜS²EE5¹ØGëZÊ: ëWiV‹ 28¨¸Ø¯¾†AM)¢Æªé—l_y^³ñõCT„ëZdÖЕû¸–Èk+d~Èñ*Ëþè9Î1;Ž+öÁ=ðrä¢Ù?æaD©µ‹vq?‘P*‘ó0æVÃò>Ìò§Ÿ`õ§ >2ÀYOEвH›Uo…/ÈL‡6áÑ·}˜G§r.] Ç*+Õ‹2)å´ÎIV­-ïkÞ$+vÕ$È’$KÅ^‘ {éÙW¨©V¢ú审o1™NN—}¾ãžO|§ã“Õ^„Ò`ž)s@ÌxcœÑ«jV›ß`åµ,›,OjI5g”D1¯%åY²jv&}¡˜J_ÔÙ¡ÀØÆaãmº®Õ„»}ž6¦e7ûù£c‰h;k)Ò”da•¥–¼µáqb ,}5ARUIþ$èhë¦!çy„ôDXòì))" 2FÍåt¦Æ, K3%ºyifÑð‡œV¹cŠN™ƒ8]=UCº(½«åÜ7ã8{l¾Íƒ—åV-¥µäj· JkQøXî%Cì¥߀Ц1q–‘×û²ŒŽƒÍ^£–Œã»p•såß“s§êX¶|ÛÅVÁ¶¥ ³Ëë’¡wz:slê,<{€jkžSéÙÌr,ßwL•z‹Éò FÝaUU<Ó8Eõ<¨Ët˜N]ª†mEŸ÷êfº¼|Nµg0×%[ÝAÕ?d¬¡aQr êYŒÒXªg—³ë^P Ãc–‹ýéë’öÓ|öñ±å3ŒzßRp:»út³¼¼¾èÓºx¨û¦¦ë–[ÒNo®®áz|5Hï+‘óÙͧŠbè 3M¤ ®¸ž µ¨Tw4l“*–ñÅÅ|r1´ÔÄÕÖßól³ãBŸ/'s(aÂlÏJ„ÐtTîÚn•ym™ pK®QÒoßÀìÓd.d-úÂl—ÙZïh¾6›ŸMæCþ4]Ÿi†§é¶^füôòô9¿j€(™mÚ˜ Ž£b–¥A¸Ýí±?‰vQÇÝX–å¬UPÊEYRÊ™ªƒ¢HVli“BÍáWQzP5_a«ÖdÌ×â`­X7mÖ¦¾ÝÆÍ¹ìSÕÜEaDÙb—’ÄÉÙ‹¥V§.ƒËTtiáwžl±/[…x<ÑiŠ˜Ú̺cÁN%áØ»&ú[ $úN uçx|<àÉ—a_‡‚U×/ O]]wéV„eÁ¶|7„haoièX)°\*:óh›˜@§/^›Þ‘y–a3WR%`9~{)¦¥¦¤Ú’«Ûê\Ü*¾ÓÓ¡–ÊO-=å%­cy¸Ë j,$žÞÂ+‘Hc@ÑÑ#1 øõºNë;ç-I/:¨ G.õÐT—tº÷XË4}¤òMU9Nç“ñrËñûé¸è%°q¸¼^bÏ$|¬å#” =nßü³Ÿî–ÉÔ©|ò"™ßiø}²xc£_3|É\ª…øb³ÏES\e0v‚`{³yÂÛ“¾:ÛdåIÛ(ÑðÎç³+eRŸËÁV†þ,V¹ G -n9"ýüa2Ÿ@s¼|Ãc´»oÚÀ%ãh×`†8ß]ÿ0j%žÃωAÐãéíh0b›g_‡¬à›Â$ò¬íôb´¯—Uhט ” ¯ÁŒÉÝŽ×ÌTÜö;~t䍨Ÿv«ß­YˆçëÉkqZ'dà»ÇL‡æÇ• ‹÷I )ÝËä^G›M(¾a<ò§bÈ›-qW²º–ð†%ã]‚c9\G¯³Íô»‘EØ\ñ»Áߦ8Ô,ÖWâ7¿]z„¥”óÏ‚–T㣯ûIjå\Û~>W˜¥p—gû-¹’ ¿»Ëû$ò¤í ç„ÌâÅÍÕíÑq7'Ú;xÿEÐô%:Þó)ñB‘™ü× rÝáÔøQƒàÃø?Ô»V”ÿÆf°¯Æs_¨çn®©%n¦Ê;Bš^€øVHœOBy»´Éw;¹ðb©Yc^™ "æ˜+tl í$îÛèà]野ÑXö6ò€!Þ+ü±oA´ù=â³ÉâôXð\ßL§ýk‚CS+?`:^,>Ú/¸ˆ£ g´ÌÞÊ!C>°ìá`>{ÊÕVr8Ÿ,O?€ óÙçÌ®§_Zÿ–ó'Gxì endstream endobj 683 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 684 0 R >> endobj 685 0 obj 2133 endobj 687 0 obj << /Length 688 0 R /Filter /FlateDecode >> stream xœÍZmoܸþî_ÁNácHê=H 8‰S¤È%m¼é}H‚BÞåzÕÓJIkÇ-úß;äP$õ²ë= ¸ör9#ræáÌp8Cçû' þü¤~$™ ËíÙwÃã$$ˆ +Š OhÌR²%†H£””jâ`¨¦˜a ¹f6òËYuÆÈŸÎ¾|ƒI+ÂhDÎØD8й9û+(bÄi–e« ¢€‹ÿDŒÜ½Zœ=ÎÈbíB@Ù™3Æx”"Sÿ ²Ø’/çoò.'WË¥l[’W+òz“WwòÙ7²øóÙõÂlTKÑ¡$àÿ„êx|ˆB6üâÅšå;.ü i€<àPÁŽÔ§Ò¸×üTúa¤Í…?šÇˆò¥íö{*?ì—D-䌦pÁ<ó£ìw¶ÚÄ‘J7£YÈy¢¦f‰ˆÂ >6wg:Õ„ SŠI#ɇq*ÈÆ甃t p™ÃF#Ƴ˜!ªÕ V&Oø ë©ètzÌð¸*\N‰jMõÊœ|£‹¡"6Ð÷¤³y»9.ŒÀAâA¡§+‹$•üÑ‘V.»¢®Z²*ÚåÎò}Þõ¾%ÝãN¶¤^“.¿-%žñz'›§Õ}]ÞË ÈJ¥‚SAÛåÜʪk)ãó·áñOR.â,K3„s#KÀAnúÅýÒ™­$*uñ,Ko+ÏHЄœß\¿¿~½°¤c9E×ÊrmÉU ;뉪vó–õ½l,•—¥£]zªöd)+Øh öÂò6Årc©mþè)ßÞ•ÛÕv_vÅ®oä™&ÍF¦ñœkⱊc°žêMM§4Ì@Zœ$SÉ/¿ïe£ÿ¤1Äíy»“Ëb],ux\ôÏRuQÁ•’ð©TVÑzD7@¼­ÛÎ#ÁZÛºòÆ=i]Ñ3ü¨°“ ºu+ïŠÊ_òPt›!ž‰ñ9ã£Ý˜`üU>>ÔÍʇdÓ\TÜ´pâýµ7‹«ÅõÏ×ýâxfqÒ4NÀQÂ\-ž&·Ï¯çw²‚£[~}vädñ8VY‡±„™|neƒfoõ2ÊGËiäZŸ¤ºÚ ÃÔØžI$‡ÖWœ‡¬ü•NþVæîKnGCV¤s0.Âhf;.hCH¶áÉAòˆŠ0É  gÄZ\uó4Ä0àbä,„8 ®$M”?v „õQÜq<³Pe®.“ówk;ÌíÈwrìa@Ò$¬o}Šp¼ÉÝšª¶ÃÏÞ}ü`)m13Ï;ª•€»u.,¯Ã˜A¢ps‹vfOGœ!f,tÈM<1|”£'k)ù¨6üP´’~À xá„úŠ& ¤‡P$3²L\Ÿ"i¢/^ÆçP¹³4 a&D`ní…ª Ž$B¥ƒ¶H„¸â>ÎA _Ÿ¦‘rYéáÙOrC]•8r™{’oåì¥ð6oåA!_Í Fê¾_Ÿ9Úÿæk“» …ÄxPîºn¶r5 ½¹oæj‘îi]OQDbdV#C¤*Úu0PGßÔ[ïk_¾R×/ý§5’yã/GwM±Í›ÇKo:Þ Hw˜¹yÓËbuÌ›ðÚܶHª Sï;˜¿½}+çáC5Ûä­=ÙʾõMÇ ˆýÈ‘¯>¼UÕ¬Ò¦#›ü7Ù×ÈäV–õ)‹¶Såòî>•'m¡llÔ›æÅT«*•˜wË/°´VÖÊ˶ÄÄÊ-hÕÙ屨î4¤û¼ÜÃÜn“wD¹fYW]UâÊ`Þ¾8˜> X F€eæ «¥*Ym×ì—]Ý\’/þHþvõþóõ yÙÀ~qŠK.Ú—“Í"ƒ2$RõO¯B­~F"gIËÀ±' Zž+å8²§ˆ§$õË¿˜Ÿÿê…¨â0¿ˆœ"ùùܶ/É¿)¥äÛ‘|@uBjÍDß’¿Ãp’?ò­ªß1€rl©ˆ¾I»‡š€:쯠E¯ËýVµW­s ¸Xˆ°Ve „¶Õ?ÜVIDá/6×Ü5׺ù (׫ö4v¼ýRÝ™:â„XMæÂ—‹ô°åžhOárI î[nÕVdƉ L›?T FPÜÓ—¦ªýO°øŒSl…0*œVü̠±Ž¸bŒë”wgCmbß2’Žƒ; (‹E–¦Â &I|=ç⺠RíKè0.‡‡_ן?}‚îåïo 9Ú{„,¢axÒQ^Tà8@Þ_AÖm CR¨oXKÂeÚÛ¢Ì÷>q¡é¼ÈâêÕûk+zÿÈ·òXÒ„b‹²úºÐ\³/!”p“uˆ S% 7Ù °`-¦d®Â@v˜Ò„…ªøâ~iÄc¯&@Â$Öqt¹p4>OB'Ká9#UåGà=ä6ÞÌ¢Z–û•\ùœB÷Øž:záì½á¾jË9©í¨§õ­‹¦í&ù<ŒÙȶƄ”(@jçÖ¦&#Ã~å÷}©ntzBj A#è¹ÓDgWÇI]ì|bÕ$†“úcï±0•x‚ô™Ð'¤5_=ÌtÖ0ÓÍáÉB*õˆÜãÉh5|Æé€L¦¨#=LîƒÉwƒ©Ê"D>ã@&Œ §Õ°Ùwï°±ÆèNÉÁëÖØ8GÒp˜2*â”±(HL©QŽ S¢aUº§ž/zÂT•k)ã ˜mx¯/fmµšø.Š‚‘‘Py¢[H|Ç×ù9¸ÃÄeOÃ:Kè{¢ŸãI[nò]'jWvÔ.suçZÒóŽ‘ßí›Ê‰ª+O·®çql”¦“°žSí/?EïÔ‚q4² Š Bõ–m!ˆÌ¸±ÃmÝ8¾©Ú©e\ÙQßÅ åE†‹ô?eS?©Î\ñÿ-°xK㢧ƒ _ÕPS£%ÉÈh·²{ú!.Ô=·kŠ{Žjg[Ka”é¡ï¶Ô¾Ü™oÐÚ†%µ¬7OHÆŠÅŒK¸Ó1þÝSÃ!€ª–?Ì™Oí³¨‘ä Ù` ŸÚÒêÐFæ­‡¹Ç(æBØž1úÏ:.m.1Wr™…yIƒ:†¶Ã¸µD¯½ù›òtêwáYàúI×¢œ˜î•‘™ûœÛ52WsÞT§ÞOròáóû÷”¼‘;Y­§ÆÆÜx_µ ` õdí"DõßPÊj)Ýï2gÚ„X(7Ó, í/ÇŒz `£ðÒ’Óí„! Bž©²À{;9¾Þü#‹ÿtÛ}ƒ endstream endobj 686 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 687 0 R >> endobj 688 0 obj 2593 endobj 690 0 obj << /Length 691 0 R /Filter /FlateDecode >> stream xœÍ]sÛ8î=¿‚éL–¥>HI]_f|mº—›^÷vã>¤yPl:Ö®m¹’œ\¦½ÿ¾à7%Jnžö.cAþr!¿?ˆ¬ˆÑrwöEÓ"”Å(ašDŠ2ÌHŽvH#9ÍÑV0ö@Á¢ÁDR5·B6èÓÙþŒ ŸÎnï€i…¦è錕˜›³_`qÊpÂò¢(´®1Žò\,‘`Àr‡^_ïbô®–ÜF{!ˆüϵ÷5J¢øÿ@#‚Îþ¾8{ýž¢ˆ ÅÚ…€ðsD‰’ å8‰ ñ£ÅÝž¿+»Í—KÞ¶¨Ü¯ÐÛM¹à¯îÐâŸgW m¨”"C)†¿ Ëxê ДôG¼X³tG…ÿ'ŠS°H mõöêO1`@*Ý¥>'Ý£Ey“‡›%ýöW.>½/™˜œ÷v$Š#Ïýý(û‹½l¤XÛÚS í!Atͺò~ËQ{¼ÿräÍó%zóæohfQe§7?!8%b~Nµ€ÁÔ-_wèP6|‰frñÿˆÞª¤¦zØ%ýõûEl '…£˜f°ÍÔ:¿HQ7¾¬ÖÕ²ì@š™l˜áŒÁlÆR5}Ž^¡Š:WJY´õE:rÕ:¸Ü¶µÃþØ×Océ3:ðæêÃÕÛ…·LWv|Ç÷v´ën|½nò«[mYïv¾šëºÙ9¬^;Øx'‚$Ëp”&„P‘m†Žš­xS=ò•”+mD„\žpv‘ dHãHù]“ EÇEé/ICY:@A +pŠÎ½`šT)Š\HɲP¢ÓHù\Á¥ïË–;L®1ÊøXñ'‡ÕÇ´vˆÙ#ͶöضÛúIùZ<ç{«{þ\l<Õ\Œ)ÜÆXpl#B^8ðFèÕ¢CSÿΗ"ø/оÜUû‡ Qv8v"0ª|xhøƒ:ð'‚³©ŸZ†È@ÚVÈ3˜‰#³|D½±/ÙÏ”d§$!<©X‹L"Vª3ÉÌ%Y÷úàÒ ÍaÞ‰V„[~w}³¸þØþæÁó<ì΃g-ß‚û=ʶj;_ å¨pK“º85,Rvžô™Y„‹X{Pçm».cÄ[UbÚr Ïʶƒ°lÿpÃßÜà@ Tƒ¾¤[ }u“D+/‡BB­³d µÿ_Œ1º g QŸRõí´3e•2çlYo;Øóo¢V•[ˆ Z{ñq”c"úa–¤6˜‚ij ƒÂHµ‚3)˜´Ü”•(ƒpüªzuéØFK ŽD ç‘‰\O¦ðßy² I¯aP³—ÄßËQ nέ…¾º¹ZçPQŸPÔ?±kq–ЦæäTéS ­½MÎLËì²”ñXn½´ƒnÅ. å¶<¶ürD½v=íy˜UÒò ¡·h~ƒîÐL-$ÒèÉ‚™ÀΦ"ŒHœ(:­§)ÎEƒ¢Bªq$?½(Jíêì¢òpØ>;´«=Ø_Ì?n»Ö“¸žàt‰Oá¶Ìx‹®;_]¨kž\æÕF2ÓzKoÊGo½{Î÷á&@õ}¦+_a$ÐV;axûc²M™º@O› êŒõ ¨mÐ}:y«jø®~ÔÄÕñ°Õ€C¹ã-Up¥ÄC–è.úß¶†"è)¬bèþùt‰ŒâG"‡G4kr—L\“ñ8~¢Â%ňŒõá 0Íïzc¸Ò‹­…š¯º-…O7‘pØrX("i(p˜ÔF”.NÍwëïx©âD¡:®¢›7ªXÁ:€¿c…p]L ³ˆ)1öžI" ñKZ¸Æc¸j’Ó“†A:¤Ú/·Ç_]ø¤ [ZÈ-žÉÍJ--µíÍzö>%y_#ȼra¡\UBjM NzBu&¢<çy(Ø:/*„6/jÛ¡Iɇ(OBØè3·Jš03¸«ÅšpÿlY­aZ-‰ì•3%lBM±Ë@zÂEœDe¼ ylò}“¾EF¸ XU$¬‚C‚&4°!\¯-×Þ@ǽo¹t®QrZËܪ@“(n¥ìk™Œ­fB®oG4sw­¨'Ó€Óé#Ï05Tà×TÊkÍéô—2Š)ä’‘<¦¿4‰û,Ÿ”"ÈHFùž>' Ñ1;môê/L ‹q‘Àm8´úÈý Õ\UrœBU·¨ X~œ/~ûuþÁ 5üíæúãOû½®öíÅèbÇ–‰žt•8Ò„Ä$J#6â«ï Ø<èz³ôùÞˆÜÛ‰‚ÝyU¸}‹¬•ÉÁ$a°Eî9°ñQ>sHzKaK˜[È?›ŠâNEXÕžûºóÄ>ò¨iVƒ1œ%¢Ì~±!iÿµAQtëú‰D!¥O÷4PS³‚EÆâ‘õuÿ ‚h–¾´2ÄY4…²Ê:"óÂÓ«>ˆ6 ’Ó³GÉÕ7ó©ê6ª ì÷,m{–ètÄ2U}µYúz0¶"ÑÏÂ9g´†=…æ/Q.Mà†_dENótÒía|dù€ñ%Û× p¢Èrâñû|© “„ï¹wêML!ÝMyZþÖmŸ ǾoHÄcKíl¦ç-ä¾^ÙÙ'ª¥)&”6–3—esÙ…Ûv3l•¤T­àNÚX7–¹k,ý[x>¼ƒK‚¸ÄjPl´LíIqïýù_v‚ÌUÓÉQMÕÙÔâºèyÓZ'¼ Ÿð(d¢¾kìójò„3> ÅUüó+yhêãA¼>¯›z'oÐÒŸÏC¥ž ¥þJƒSÏ¿4ÏåÛTÑðV—2õN¬#ê73…̤5?–pë±>ø Þ»ñiÒb‡ß?Ÿ8™20òÍ6å£páô³‹c÷ê&MôŸ´¤µ¯.SÆ’‹·²¯È<߆£ï{ º6Ñ$GégMoª|›SÔCSíJñ…â74m¤2ÿ;(ý¥÷Ÿüó. endstream endobj 689 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 690 0 R >> endobj 691 0 obj 2350 endobj 693 0 obj << /Length 694 0 R /Filter /FlateDecode >> stream xœÍÙrÛ8ò]_G§ÖApñšõ¸ÊIœck&3ë(›šrü@KÄ-‰tH:ïñïÛ8€‡d¥jkvç(u7Fßhþ:£ˆÀ¿ÏÕO’1´ØÍ¾ZE C<¶¤(F4Á1IÑY$R´U{ bA®©v´A6èó¬œôvv}ƒ–ˆà=ÌȈ¹aóqöWX<Š1Ó,ˬ¬ Ó4UKp°Ø¡ïw ½®ôèNzňüÏ¥%â”ýHDÐzör>{ñ&B” ùʇ€²3%„Pž s–©šïÐõÉë¼ÍÑÅb!›åå½ÚäåZ>»Aó¿Ì.çVQÍE‡ƒÿ¬ã©÷!¤ÿ%ˆ5G÷Tø_`nh@Á,Ô§­u¯ýU:0Òæ2¿{ÍcY“‡ÎÒvû#ßï—DM¤§=PÆó÷£ì¶ÚÈ‘jm§O6Ô‡Œ¢ë¬Ío·=CÏÃ):¹«‹]^?ž{Ê?üè‘áðªöð×{Y?z´Ìw2`s= ^|ôðM°Ì¢ªk¹ÍÛ¢*áx¶•«Öø$Е‘²wy-Ëst¶”uñM.Ñ¢ÚÞïJ´-š¨u±Þ´È޹A7#~j­8‚,SÃï_JFбìÚNç½vÑXƒ7~ú@_Mtê8hefåÝ+ˆÑq¤K$ºLa4-I° ªPE<0´Xy+ë|ë$÷&Ñ赃ŒI4xãÙ L¢‰Î$Î$ó&1­ #eÒl Ì¡xͦ”⌋,K )­-@èíV.´ÌúVíkjÞ žZFkdÄDçxAÆ ~Ÿ¼"Æ"Qê2†¯6‘Kk®îË… Å+Yß•Ì9‚yW2çJ6åJÖs倃nïʱ.Q:Ð娜óI)&Ò@¤AJSHzR»‘Mñ­¹¦þ½*J93Ð.C©KqÚe8Hpæwr§?í%7%‡™f| ÆwYÑGÊ$TKk͇¬%ZlóûdT[Àçw—W—è춪¶2/Ñ·|{/‘üý®†¾”ûˆñ“Â5Î"Ëu]W÷wJ›„bNn=Ü-åfÛ±ÈÛ«_>ýêÑ—¿yøÚƒgl=öõ>/ÛbUÈ:àzŒÖÒåÚ“äVîÀçç“ÜÿL]T»]>¡rD&UV‹8ÞÿÆO9!aÐ*fYñnî&ÿ¦f†^xwñ·÷Þ>醉VVÈ"L…ÈÒŒP³Â|£s>¢8F'ÝÌQÓ@SÅ‘ÚFÓ g«ºÚéZ«Ê“sä^92è±U¨N'¸yqUÙæEÙxJUÒšÆÃÀ»ª>N ‰Ĥ"®ZMj¹‚$(”aÉr8Ï*ÓHH>Ø—ž¤ƒßé áÔ`O¸ð “Ê N(O*šQ0q’ d©V­,Qnv#ÖûVȽ)$G¶°éÏxÌe8NT#Õµ &thŒ“C_ëÖY° ¶ÈéMJLdRö€ß¡gªuMú|%Új-•bžòP´åå㳘g¼/q¾^×r e&º;?ò$ÅieŽ$¬ÇÏËRf­útùè){%W×lwð™<>½ý,Lƒ*z,gºöªFcQ ²›œ;¨ -†ë]´wj»É[ B[,GCÕÉP÷ÄÝ<œý¡>»V­Æ9Õ$È •œ)æ‡âY`ÁÕq”%½ÉÎÚqª:mm>½ F!*°£Gì„™›rkÄOIePäaÓH„è‹ư‘ïéf  8ƒxÖçæ)¼|GY‘h Sˆ°,‰ûò¹ª`„;\xÊp´G¢Æw²††k§ë˜¡T^\™O´XBÄŽ£ö«*2<6æ_:Ø´qV|2œã ˆrk ##žA»ÐHp8ê¾Jûø×¨nfÆ£‚,84l¿·àðAc¨á1œWCÛ¸ O×üðɦX &…Xehè±_¢t­ÏU>v°x-Ûûº´’šâŽ®³Þ²Øþ4bjó¢ª÷ê­Ýß TC¤ÞŸGPÀÕ­{ÒãçEy_z¸§áª¨›6Pà÷|w· ¾ßÊmõpêñ܃MÑj/ŒcÙsæØÞ‰ß­ \u/©n®h^þvŠàðœ Ó:6RDíAKá[dçc÷œBp&`U¯YÂ"ÖGõz¦‚#嘋DÝåƒP,p¢¯ö!W³¯0De=ä~j툳>i«H!£-ê3v08"4‹éðÆ®Á1Ék8R÷r:Z¼QÕª¦p.7â(œøwˆ£²‰EX•P Oß!­M8P=D¤ ñ#l£†C_ªÙû ¥d°¬•£ç¦¡W‚=)ÈÐ(†4´IðL–[¦ŒbÂcBIbÏC¯®./æ—h~ñò§K”›“àH¨÷æ§èÖü,ÌÏÒüHó³R?_žýyü ÔN(#Ü>?|¼üéòÕÁñDªyo®~ù¹[ÊܾæèO°Ö°P—mÝà1wè)™ºìbbÀxÀŒŸ~þr²úòìÈUÔ¤îòÑM=G ]|xm¿ž#qàò1‚_D¡&ÂÞ1«;®XuË{+m†c¨Ðð‰éÝí¨:2w0ûï3, as™`Ö‰âïŽ4jÏõ ´­¨†ÍõÀ`€»0t½Yk¸póÜŽ®±|Õê–× wwÛG£ÎñþX0èç ¹2OÈßÂ(ûØK˜cL%Ç)°Mã”0Ö}O<,FƒñE«7a–øû+»k*ìiöZú‰ ž´»7» ÁnƒÉy0*ØvüØÜžd ~jC!ú§iK,öî^+,ª_+,lo ºõê±ù¢d`>ÅÚ·]GÑÛ8_¼áˆÆÃŒK#,HLH”Úç¹Ñ_Í ÿ\…SNRNÔ]k8ÓþmÒ½AƒÚ -‹•nZ¤b»A&ü5µít™17¾FŠ9Ã\õ@œv¢{Ææö\÷*Æp†¢Vó˜ÎG ÷îÇc{?>`õèñ܃ê.{t¾ ç…pÊVšsç„$km“ÓÉOê~úK[çeã"=î?X©Ê=3‹õZŽc+b`æ¥\¥^ãÔ<˜¿áÐJ5wr¡žÏ– ?¿Ÿ¿³.TŽîûÜðmœúÔÿ§,ã endstream endobj 692 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 693 0 R >> endobj 694 0 obj 2727 endobj 696 0 obj << /Length 697 0 R /Filter /FlateDecode >> stream xœÍZmoÜ6þî_AôSrX+¤ÞU¸|±sÝÂqQ{ƒ ˆƒ‚ÞåÚ:h%GÒÆÉá~ü 9|ÓË:¾/½sÒzž!93Éá(_Ž¡ðçXþÊŠ¬wG_4‘,$QªYIJX¤4';¢Ažä¤’¤ì¢ÉHquo÷äÃQ}DÉ?Ž>}†NBƒ„<щps}ô(OÒ Jó¢(´­aÀò\ªˆ‚ˆõ޼ZîBrÖ¨ÞÆz)ˆþÏ­÷-ŠXø`%wG_½z›FÉjëB@ú™QJY”‘<ˆÂBþ„dµ#Ÿ^œñž“ÓõZtáõ†¼¹çõxù™¬~;:_é‰*)*”Bø›*ž IL‡-^¬Y¾ãÂq!8A˜ÀŒdS¥—Wÿ– †L”»ð÷A÷hQÞàñb)¿ý•ʯK&2äƒaaä¹e±×& )uÛùãùÐItôü¶ä%‰Ó€‘MkÉ/{Ñ~·¨æ;ñÚ¢ŸþÅÒ# ÃŽÿöºµ¼îʾljË{æÈKÐÿ¯ÞfÓF4 ,ƒ¦ Nq#Úò«Ø¥Í œ,5ìd4…Mæ8ðt³¶†u††âÛC ûç¢yý=ï*;¯w½®š,p­Þ¸ÞŠº¿ð†ÈnA+ú}[{­Û¶Ù9ô/Ñ6ž½ãµgtۅßláÍtÌ`NpŽI æÇð´Š!¿°*ÉòTd Ï>Ö‚„ÂÁÍo6ù”—7«&grŒ¯9¦Ð2ÑnºF¼¯J{$¦~¦A`‹”Îè‡J|{GÔTüŽ2—ãã§±Ò¢cÇ2R«í,ÓhYFvýÐŽ±O5v‰÷¦ÎG×v(óÿD&†:‰¼>¿8³"jÊ×ê‚TÜP7¦õúý»Øo=¯n^’·W¿¿³›OS³UÊ ùÅí›r½gîÀ °^7QÁôD‰4ã¦ä#lΓôÇ6ó`=·0ñ¹³™è(œ«ÒgLçhOÍ—ƒ×Ö7/ŸzóÃ1E1eq®¢÷——ç׫'’-pW@áZ¤‘1‡Èë@Å¢ÎcîÊ]‰'§fà3i팅ã`NaäÔ]/øÆ10wCš;Ò¦Q]rì njáÏž¦í“±ÞÌU‰‹ ž!>ݶüûtÍÒtä1}Ýf±¾´7ƒ+YÑppd2ãá.ø W¤ÎZc¼Ñͺ·#m¶‚ðñ¾Ti‘†÷ÜÓ¡=ftÈ7ƒÃ[Œ¢‰Ü2|k êÍÀ^ù ÷TÍ]‘Q–œ&*W| {ñ»¤AµÃK¯ã‡åêW‡~¿:[^ž^,W¯ôTÈÅYx‚kG‹oø;è\d ÒQ£[ݤg .ëø6?1ã]Ð ¾±S×to› [êÒô}ÙyHå›w”õ~w+Z‡652Deí+#ùBâ«î@_Ègîú{OÝöPGÞÞaZ¨jù»CÓèv¼ªüy`wOÃ1†swèÓãÔˆ©ªf°.ß_\X€¹\`± F$U8!y¢¬²Èí©×ާŸ@å¨eu,æÔˆÝCï´ u–N”®mh¾^ö®ÏCÅ×ÂMk5³‰c6¾+P£wFȺ…ÞƒCCd Vo*XzU—!@ÊZläCB6¯÷­zuŽº=Ušˆ#YÈ*à:õ}~*+±ÖåvR¿(  - („}EÚ{P¡“Jl{T­Úޱk­Yj¼•^^L˺qœ oË»ûžhMŸˆ:ç¼ãíówºL"!§¡Œ†É €ÂrYA8\΃0JUMpF†æ1yç•ßîËÊW^ÖÇC¿+îõùïÏ/ßœÿyzuuúÑÖŒdùйßq¶ÒŸ°dä'}Ôaíã8Æ¢£>Å5Ô¹Uì—õÈ—…Cøª*ØVÊwOˆ)Ù!¥'³iáÈĪ'2šÎ+;)Ö²>`ƒ®=XìW"cWà4åQêá¦jòdéotS×…ÙÄuÞ>…+îE…K¥Ö>B`\„H{A`©e=+#õ Ò;ÍiWR"XW κŸþ9£@i¡ÒQ®ŸNàÈǤ³Dמ°¨ˆ,•ÆO=#ÊgƒÚ> endobj 697 0 obj 2877 endobj 699 0 obj << /Length 700 0 R /Filter /FlateDecode >> stream xœÍYëoÛFÿ®¿b>Úi³|“…c@±•V­L#¢  ¥•Í‚"’Š›¶÷¿ßìƒÜ%)+=àЫÛÂ;³óüÍÎìÒý2²€â?þ+ˆlXmG_Ï‚ÀÇW,Ï+ > a н2.ØYrµtWIKâ Þò…G?¡Ð(ñàyDÆ¥™»Ñ/èÜó‰ã‡Q©Xmb…!wá«-¼šom¸,„t=7DÿïÑ›9–ýˆˆÂãèM*î3C°Øèu¢—›}Þ‹a•d™a³0Ô†÷¯K{0>ìÓ¬ž(TÜÁ)J½F4ËÉšmÒ\¡ú‚Ný”Ôš*Y½/óJ3C4)ËäÛao‰a0yÈÑt[ׄò…h¾ïlÚJ«/»‡\¶í«9rrGé++k‰ÚÎee$•è¥Èk¬é*ݦYR†žJSϦ{y©hºØ±R cÍj;`ÊDLr ľrÇ”>Ç .C,ñÔîï¯âùÝ,Ÿšˆ¥èÚ¤Â%iÆBt`,„±| §O fߙ޻w}2ÝÔkÍÊô«,Žâ¥sƒñï ª.Š>ËØ¦6è]R²ÜTï ÅÓbˆFõr0ÇÈY™>>Õ =©®¯*êSê…ꡈ!ì·9äÉ–A–Võ‘éêºñ=þ‡€HÝ1–TຠÚËRíØ*ݤÞû”^â]² ÃW ĸã³4I¥óJ*c°ÏÓ/8/ŸSl±\h›¨¯ËïšÈ‹"Ÿª‹â¬)žÝ9ðrõ>~„!±\E–­ÞPi`ë>œ³Ý&ç½BàÓdTâ„xÔ}G}nLe-1ù*ýóøµ£TÂÈN·»ì$Ý (Ò\k€·÷;C¬(¯Ójµ¯xÿ<°¬x>Ö?žƒ¯~«n¹ê‹é¬^‡R8QÁ4¤îAªnë¶7¥;CnþÖ|¹¹ý`Íæ€?AúVä™ à äà³·I€ß4xOò·˜ô¢޹c¥æ—®á9¡¡(&(´díZNç¢Ô»¼'Z¢~.ôº™gÒˆÖPSWÛË×Õ¸åÈ1œæ-GÞñ´åÊHZ®»¾´ þ²`zWWI “–œÊWH+y$WDbøMLÃzŒËD^¢xùâŬN–$ĵ(—¢²c½ó„£ÇÓ,…®$¶˜U2x¸UG_¯úÊ‘ªälÊb{Pq“–UÝñÐ -ãápaUK'=Ù|øåÛ´—x/â§uØÄ!×9>i[B…!‰& Òr~Ös¥å­­ñ ÍªGµòW´ËDzØïZªb8îñRÐæŒ(Û㤌ÈÖüÐÆ þò|0=uHä=«\”xE!b8꺈݉&ãßcx7§ƒØ²W‰÷Wn’ϦbwÃH:ººiùâ‘ñj°šÞ7T ²íŸq'$Ó ËMúÖäÖ /«Ìð“£±¶-®1o­n®þºåö€^§ñ:ÀgÄ·b…‡€»KVO°+‹õ~Å›Š'¥‚W×aŽ÷ ÖÆ/éüÿ‡ÿŠña endstream endobj 698 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 699 0 R >> endobj 700 0 obj 2031 endobj 702 0 obj << /Length 703 0 R /Filter /FlateDecode >> stream xœÍY[oܶ~ß_ÁǸpÝ%i'Ý´.\Ç^£Ip ïjmh¥µ¤­k ?þ 9Ë.kç©çä‚oDÎÃáPz\øÌƒ¿oåO*¶Þ-‰ç³4`aB¬8a~Ê/c;F ‹3VÉR!2T\àý±¨ûeñå Ú0ÇìiáM„£˜›Å¿@yœð0É„dkÀý,“*Bž±Þ±w绀ýܨÑÚz)ÈûŸ[ïZúÁÿE»_|\-Þ}Ž™ï±ÕÖ¦€Œ³ïyž¦,ãa 䟀­vìË›Ÿó>ggëuÑu,¯7ìÓC^ß'ߨê·ÅrEŽ*)*•ø—r•Oƒqä Ÿ8¹fø– ÿ#"8<ˆÁ#ù¨¢å¥_ù@“± þ ‰r&KÅíŸT~|]R9Ñ÷x6X?ˆð³ìŽÚd!¥nãûãM²ëýš².6¬ÏïªâûñÇŸØûuÛ@®ÉØßìýã!¯Êm ƒ «ÎûC›WÈÀX8:Á³D¦³—W¢R¡Ô±¶ØmQ¯Añ§ë«›öÛÕù¥~¸Í×}ÓN¥Ç>…/¬ I·ž°ØcoPÒRR$£Óï=Z !ºÞ›qßèWYú¢à‰áI86\éèöŬ_ç}ÙÌ3‹¸`É’X¯˜þ ¬®ã­è®"Y VœË³ÕíõÙ…†_Ì<ò\íºß4AÎϨ9¶h¾—ðJ„Ùqç17ÔƒuSoJdª|ÛÁꮛ갫»#YçCY,³ÎwU8’¤ø+H°®ÈÛõƒód*,<ö¥&ì”ÀÛ›óË_ØûªØölŸCŒ?äPV•]¬¶¼Ð¦êRŸ{Q"Dꥮí~©åüòry-CÑú¢eÎÓ/ìêvϾM¥Š€ÇiA!IÌ–²/–ŸW úúü—_åïçÛ‹‹éž†Âæ{Ð „q8Œ®ã$VäÈp!e½ûœN«QÆ< e9 iOØ: §MŠ2L‹Sî§žP‰š¶z)ø6ð ú¾éÊݾ*ºÞr¶M»³¨ÙZš’PÙY-1PšÄ-(œ:¯­j 7N7¯< sàCî8ö»“ªÊçLÒY;oÔC1]îDŒ"¼-[Ñ(àujà¶©ªæI`dÜ=­¢iÊ(¤­Mˆ•IÓa]!·é1Åjñ¦“ØmeWcS´ÜÀeÛ_ƒ¶yz͈ç­ ãÒîNž¦Ópfþ(œOe/-x+ä¼ÍA€æ Ë$¬9H›˜Ð#!ˆCnK̈‰Ðѽ¦¤.ž†¸çó3ŽI¸74VoLrÇÁþÔUQÕ7Ó|„£Pƒ%r–ÓaPƒ!u«'yÛ]™×lß6›Ãºg4E9D´Üº8¯Ù-4âŸè¡H¦ñqS9ÓGŒ \|ð²- ]7½å›-DØNSÃŽS¥!†ÂK#YÔN zz(Uü•v˜ª“Ïê‚;éƒ$âQÂõDÄ3>žÉü÷m”4•@I~ùzb"‚xåŽ4{¡Þ+ˆJÇŽâ¯=$yçªÏÇG0͸ðRh"㙘Ɇçm–È»“±¡¶Ññ"JbÉ5ÁŒ‚iMŒ ÜŽ‹epIðЪFØT*ò®ÐdÉö@ؤpðÒifÜK!2/ž1AÅÁ÷¼Á’~át÷ A÷T話PŸYX_sãtaÜT¹,à\snk@è;þPFF”| ¥n‹¨B¶€øJʪ­§ÝKçüÐx:–d#ÒÔÕó«GIìA¢Ä ´ %*ƒ8çìꥳ$Rže™çyÑðHðØi’-KÇíEÃ- „#Ò2hƒ*Úi„ÒºS ï½ù‹ú]pÙ¢ó 1­}YDDå@’áú«+>Ñ5̪7Gf dÏË8£ ¯Û‚ZQù ªõõI¾¾ÙÕ íÆ‚vv`{(¸A´¥Ð͘YÙúíìX”[ê“ۇǯviÌã ®vqÌ8ŒW;ž:: >êÊ2¿¾ÑïU5Ǿ_ýzòb)„^ º=/›±`Z ãÄçôè^Òn 3…% M[dn(w!3œcI]yÑ{ o#ÚÁ#"]Í–[¨/ýó íå ±óHí$wMkÙçÐÜØQ[GºjȦ‘KÃQäÌmÖ¼ÝàÌD|‘vM7ªhêÕ±|/âÜ~—«ÔýÈ÷Sù…J¤A +è³ö~!?ofÐ1û!xPð=‹úq¶]<ÂSØ}1ÒŸï !ÄUI–+£bC™æ»™L$‘øãÏgFÜÇÆ:ˆ¥?xO”›±6’yp-${´óÆ÷$E3j‚‘žMöÁŽ¡GîP‘‰E.ã{B½„TX­ÄÒæŒukkܯÏغWG‡Xãà8_:³ñ)há|‘¦q„É~³¼X~Z±œÿpÊîøL½jÉéËŠªowòëPÎaÿü»© ö “4lŽÎð$x w}hÄè WŸ†¦ß£ˆÃÍYˆ0¡m¨?ÅÙ$}Øÿ/"¦ ¥ endstream endobj 701 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 702 0 R >> endobj 703 0 obj 2522 endobj 705 0 obj << /Length 706 0 R /Filter /FlateDecode >> stream xœÍ[ësÛ6ÿî¿‚Ž‚ðý¸éÝŒ“Ø©2®ÓÚÊõCݹ¡dÚb+‘ IÅÖßvr|w3½KâñîØ]üðÜóåÄs\øûZþJ2ßYmO¾Ìsß bE±ã%"vSgë“F©³‘{¤¬Bd ¤T™µóËIuâ:N~ý *Ý9®ˆœÇw¤ÕÜœü Æ£Xqšeùê /M¥‰@Ä@¬¶Î›ùÖwÞת¶ö^*rÿçÞÛžÿà‘ë<œ¼]œ¼¹ˆÏu÷<$Ξëº^8©üLþñÅÖùõô}ÞåÎÙjU´­“Wwλu^=¯~sOÎÔQ¥EM%þ%Bͧ^Aºýk®9Ká'Ê@"üz$‹64¼ô[h2Rpáï£ð*«ñp°n¥ñãã’Ȇž+ÒÞˆx~lÁߟe1j£”¶÷ÇÍ®uYµÎ+çµ Ï9},»5sŸoæW˜­¦¯ÎŸ¯Ï.YðGqx¬›;K×ï}ÕyS0Ó–Ûr“[úºÚªY1]|Ù—RK–ûÎj¶.Ì­òªª­Ò¥e±)v›|UÜõ|Ømý¾ã¸Zxùî0t. û&Œd±. ]†îòå†KÊÖ÷u³EŸ«áÇF–²vW¬ÊûÒªŠƒú vQ»¬™]Õ›ý¶b›õý¤‰î±îûÛÎ,77›úÑÒ¹<Ø:F¨¾¹Ÿ¥¢Ö­— ™öirËUÜ7õ–¹"_­­–ÒIÁü¼bÚšž(øøi~5;b•ñ:âM]b6›g½g~——Mk×Í- Öù×¢§gb@ló­lâCýŠIµ6|㋤îÁnG´<2j‹Umž¯‘ó %"ÕÚŸSWj¡ø=p´­±Ÿ£vÅž¸’_FÞê]Fißäûv …<{PЈx1Ÿ`-CdÌ6„l¯eñ´ƒ™ÙâàS¹Uýxs‘ ÷Q/ EÇ®„þع3©!tEÜ›‡( „‰{«-Œvj?òàŠÂ8[˜YþVw/pØO‘Åa–ÅÁ„º³£þ1iÎdoO¿_ÕÛmÎ’¶ØåMÞw£Ñ‹Ó=Z(joʶûÇí«£@xp})#ÒI’eiašpVÚëY²¸ûHªã:r–ÐáYûµdôÁÙÛµäp(­²¬´`×ÔpììažýM‹p§’”†[ÒBMòÁÛWÎ;ÕD¿ h‹çú\ò»;Ô,Ñç.Ñh„ 5$Èâ‰<ÑŽ6)âàFP4Ìââ2­VÉnWäÍ ôó&‹|Õ³'g“`vnU´–" 4öSP8Ñ„Û]M/f®MH#§€&rÍ• ÌTD(#§@·!ˆ‘Ñ“ÍÖnq`¹†÷YÅúܰ|†s›e­®)ÔÖ[U‹‹»6›´SÕÕë1¸p ëƒkËîà"ƒºG¸Öø!£;¢ËôÜEVçÈèõ€,λ •f&›²ƒ¥ÄÌÞoh™rlfWp½8i,a;‚ÉÍ 4SײѰ¤6º $ <–¥ØKÕ9êØÍÆ»¯{"ô£, Ó¤·ý†‰º¥v‡£†´¾Ñ!ÇCž×ú¸egàÍŠ õ€#‹n¤—yk׬«#*ûÜ«fÍI²uLaÝ”rx^¶‚ó¾•1ÌpŠ÷a¶”FpH¢Û­áp¦#‘ÒÅS¾êÔ<£Vk®'w—Ùd A‚ŒBd¢µBdÍ"[²kæ(Evy˜6“?<4ÅCÞ•µ ³P¸8Rcb¤Ñ±¶Ø«£¡DµgR9qt_GnEŸb ˜„󼨬ò¯ùf_Xj)ÊR4í—Ú 9Lá”±Œ3ùÓÇ<³ºÌÂ]¹úö_ÓÎè˜Ï²;† Jû°]`¼™zjÕ>åÚ=Üüxvy9¿Z°„®¥È@Éù‡óëK½ýG¸lŽU·ÿóìúÝg×·§ž{ûêˆASÇïÕ™°:ðgƒ®÷”©)’‡Ø59Š»0òdx/dúÃ…²²ZM©|A\wEÓ•‹(øE†æ«oÙ¤ylþn£s{š*$È£j|¹ñýáNMÛÓxæCk Œ¥²h<ƒüŽ$È²Ì¥Ä ™1ï‹”àA[#XpžMÖmêG®G1¦I5aˆ©uÒö6Ö¡ƒhLùä¶„‰¥q M+î˾hX3Š]Žñ%y%`ËûæRt6‹[êÒ1^Q4À«« p£qTRHf¤S*‘BG¹>{€U³Cgm×%LëÔFŸ›¢Û7²º æåö°ªwÙ˜|&©éŠ,ô¼Dæ³ÄB'æáDÆ‘ŠE©¡˜&àµ'€– ÆýɨÓKVr±ÒÖ ã¬/ÚH‘­hãô›4¨ˆ\/‹½a6ÔØ‚‘ é÷‹‘qSâED^ ýI3‘ô/wHªô'Ìø;=Ÿ¸`ë`쪑‘G¶à%B7 l•DÚ¡mí=`Ãñz÷Mg†èhŽI\gN:È[ûI,ü‚ƒ ¨õqs~yþná|ç\\úÑÉùÕÕùµ£‚º¥óéÊá•øwç™u„ôf‘ç¿@/æ·§¤ŽóÉ8Õx‰ˆ2h¼,DÕŸ>/HÕÑt4 ]á…°Çn†Í.Ï/3çzþᇅzºø|yé uÙb_ÄYëÒ{·qè"ìlMa˜/û|#³s˜¦”ºæHriª™I)¨3¡JH×NÅàmCR:Ä–tñ´*væÞ]º¹™ª¦óY@~¾šº²ëÍ\è0 {d¥œ»’ê@2åøf$á¤]½ÛoèZæÅ"4éxd(€U4DÈÐ1=®e]ÎQ  S·}$å¦dÕ&{:3"ý?uÉDøX¢³ T/碻’aÀÈémþÇDº?X–jt¢/Y”d ¬˜/*1¦Àz/B¦xêŠJ'®~0šÐ  ¯-ëúI… î7›Ö²QY93ö¼~w@£6¤q‘r×-[½±Ô&qMõ†sŒs–p¦Žù-3â:Õ›‡®¥FYÑ8ÈŠÄ1V¤bM—FJ£8´„#86ƒ£GIv3vXoJϦ¸7¦hÈP? ˜•ëFòî[¤*BÏ`ˆëPÈmEn¬Dã*”T ³ã(ü(éb¯øÚ(“=ª¿bnNòzö•ÃßDÂJ —®¤užm`Ó,baöËa3°Àdò$‡A˺dön ’?Cï^¡õÐ!Ñœg"´0†c7U Œ Iåâ»D`& R›'‡/v´&³£híÍE—Ï¡µ,qº)JºQ‰]Ø'Ÿ‰­Xáú°¿D­¦÷E»+»‚÷k:i©(Nl«M°hOšTÎk:öHYÍôEëÃm¤Ü˜ÃP ië©¥åGÎ$ÁÎ^w°ól‹ FQ6·šÞç«Îêdi™‡ƒœbCÝŸñ§?€TŸÕ 0:ÊgN2-Øë+„*Plч€±‘$] Hœ›*æ! ƒª¬r•¦ºyTŸ.ôÆ100k#3ÍÐÇdƒ `%™›Ö7?_š&ꣲ‰XÂp€’íÜ;Ì㈇ï3|ÁB ÍdrCýòÃùõ¹ál€©æn§ïÞ(P0µ´0i>T‡ÐBNµÃ&ájµ†³m½eU«¼Å¯Ê¨ÕÚêò¶èÖõ8+Eñ8zŠSá±=Ž¡‰‘Ôo*Çï—AK†Í¿æåÆ„tJD÷GE[×G´ÀÆÞÃB[œ³¢Š•~þéý™Ud–`ËFÞâwŒŠ~\Vº©îìê¶-—SSK&Öú PŽ1ÜuC^AAÚF%4É¡[:2ff©áÓº”{ÈX¤mcYt EèYEn)è ÉÏ4TÄ~äìÑöK5-»;j¦Œ}RÙpñÌÙÁÙ’pîQ¦ñ§¦þý›GK¬¾ ²$ŒGÍä z«ÇS‘½¹«$”6“¤NiIÚÚö¯·;Åä¬Ï¼¢²Æü8ŽºMbLq5+Ɖ2TÌ;)7†=ÚmÊUÉ廩^? “_ˆöвá×pa5K iˆbø„CÞ,/a> endobj 706 0 obj 3479 endobj 708 0 obj << /Length 709 0 R /Filter /FlateDecode >> stream xœÍksÛ¸ñ»¾5n„ßmš'çÜù&MæbͤÄ( ²Ù£H‡”ì(¿¾ ,^|HçÞ‡kï1Ú]»‹Å¾úë#üû\þ¤9'åö쫦1’r&š'„¥4 2²%ÉâŒÔrâ”S4*ªžÈùtÖœädzÏ70iM“dz`ÂÙ\ŸýÂㄆI–ç¹Ö•S–eRDHÊ-yqµåä‡VÍ6ÚKFÁÿ\{_£ñÿr{özyöâmLX@–çÒÎ,¦$£!Ïå?œ,·äó³Š]A.ÊRô=)š5ysW4·âü†,>»\ê*.Ê•8ü—RåOƒ8 †#ž¯Yº£Âÿ ‘ÊcØ‘ªõñê_9`ÀX™ šG³òKÙí~ü\R¹4œã©gþ¡—ýÁV›¤”}|?ÁÄ»–w‚œ“ç< 9yöï¶jÄÚá»bU{ÃwEï²­÷ÛÆ#ìîŠÃŠÎ[¸i»­Ï·(˶[WÍ­·ºõ9yk»}-<)[Ñìªv e±juøë½§GÕxk‹æàm èE¿pxÓúê×õ@žC¾ŒmŸ®`pïÞ¤Hètëõ`iá@LÓÑ!§g™s²HÅÙŸ<ù(ê£lšÿ^+Ùæ9 ãaçÑNVTçÙÛXŽ,«KUDS¯**Ì$ZÄ^·Xßæ'êÚ®P]=l5žŸÙ9&í½ô¬¢^XÊJ•ž'ÄfBøº¯:áÀî„2ÓtñÈFúîiäw¦Žf|9ûrÑ,I¡ã|†ï…äÀ²XjóùâúÆCÿéÁ_ž½T÷ä®/Žæ¼CŒ+jTúÕ«/çGã.ŒR𥠮4sººÍnE=(¢®î(ô•7Kwyfijݜ›†òq ^u<òèòÑ H‚JÞÜoër´ wÍœì½vfž×ðÙ®{µõ˜ieÄè†  [Ȇ*ÍJ5¼´3ü&5·G!Á‹…2Ñk´ ÕœyÈÇA,ªS, ‰½A#¢ßky¨ÌõPð(ÖõÕ’:óÐÌ<Ý‹Z|é¾~ÿÖÕ;ØXP£+QÃ%䓣Ѳ„†Y$/áùŒU jºNÔ¶ÄòØ$ÍWGƒ ‚Ü„9´Üq:ÃÒ)UõÆ™žX4.h=:ÜÑbí ®«ºwï,E½O-p3`±™£‚Zté µ*Ë!øX*Ù£Í_šá\¾²D^ÞAT¥™ãI†sšó,ò œanµS¾‚`a!“ós RtåœXäXÅ“b(ãH¹¡óÁDve·0‚:htèÄ•l·{ ®Ì(JØ"$æÌÑ ö†dq¨•Ë÷‰× ذø ×0\5ån¦&3Åð@¤÷¯°yTž,/Ös•ÇÊ!TJßYMß4¼€ÎøÍ 2ÈÏÏ@×¼±Ð(Sœæõ²›ÅÀEã¦yÑáWå©]ó|´E7ä%T€»Ñ\oÈ͉69’¯î9ÜbƽwÄç½$­ñ­7ŽÞQTÆ]™î=4!AgÿéL¯b™aóè¢qS‹b ¬F¿<+<V\zðÚƒ…o¾œS‡-}µv­C¤‹TGU’ãCQƒãN½? ùÔÂÊéEÙB_¡œoáÜ[] d97”’à$ծ嘊 è¸12ä¨jŒ*äúé§Ë—¤¬ öµŸÎà”#ÆRùE+O9\ù#Ý홬Vr3ùБ(•+MÕ§I6g_a ¤¿H=†«I[%ùTK’Ϩ&CÆöc…,'lüÍÍʈ³‰ M2_É'ÂíÜ4¡L~&JŒ>i eØ'<]!ɒψá#9ÜÀ–àŽü©Ò"|ÂSLó³L‹0R-ɨ3–m´ñl|>cí~S™±u4ilûy4'Ù8õÄœÆ<€¹A®?|¼¼X^’åÅëw—¤Àh€ð&Wï— ²ÂŸÖø#ðg#¾œÿm| §Œã}Äÿ†é@Èeêãš–„‘S¿€¨¿“rÊ+e4•¼F߃¾-Äï÷/¨;P}¿  )RÏùrN´˜=ˆy1'^AÀö4e ä÷ˆ_A®ñ³Î;Hø'²{ ·ø0`Ã|ü–ÉlçÞÓ"î‹$â¶ú#ÖÞV¥ütç­.~Õ݃BÍ3·Fí»¢ÍSÕpßÛÇ(|éOÖo1V„¯þ ƒˆW›´zÝ´áŽåëÙÀxú”„²({· $è=(Øì¶º+è2Ét¾ Më{z:uDÕSYlÅe+~¶>þpùÑ¡¯ÿå`¬*SCÁ¥h(ódåîé\_Ó-ì>oñÁ €žX¸!ýN‡‹Üw^œØÎ2-;j±ãµ™oí˧¯3cÌ+„B G/,äÚ·¹½yö((š²nû¹7Ú8ÎGÖEm='˜®É( qž%a8èê¼Oì Ö=ŽŽn<ÕÚˆ¹‡h¶ó¬{órdÿLÀIÁ?P°þæ…ˆ÷ü„Ÿõ]ž@©ó¢®Í7nDÍk bKo¢Nlð”Ïôß L­˜ó‘ýF ã£â)­VDPAä»¶jµ8”Ì@þÁ Õ’“8N25Þ#aßà1R¥{€?¡ó£t"C“†mÍœ><¡ÆŒ><†¹OxºBº­šˆá#9Ü€nnS¥E&ù„§˜²T‹pR5iÐjÍhãØø|ÆÚ=¥ÕXG“ÆÆ9Ñj% ’ cy–ŽZèB²Yùvè÷[èQÿ.ñÃwÀgGƒ‘1‰¦„s0À.´2xŒ`)ïD#“¨V3˳œë«îÕÆ{8ú3šË¿á B6ÃC ?*5;¹V>W›Ç”CßpÍ,=½YÆO.V>ÙˆÈ\´~z3mMY4rÆJÞõ_àLÓ–Ê’ƒ¿lý¶¤% endstream endobj 707 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 708 0 R >> endobj 709 0 obj 3128 endobj 711 0 obj << /Length 712 0 R /Filter /FlateDecode >> stream xœÍZÝsܸ ÷_ÁÇËÌZ§ï›¾$Ž›º“Kî’ͤ$ò.×Vg%íI»qÜ¿¾ ’ ¤u2}¸ö>fñIA¤üÇE$Bø÷RýU,6íÅÄ‹D‹$'V–‹¨ò°­ Pf¥Ø«Ž©º™h.õFp/>^t¡xuñé tÚŠ0ÈÄÃE8ŽbÞ_ü“gyäeUU¤kDe©¦H‚ˆM+~¾icñ²×½öJPø?מk”DñÿF¡¸»x±¾øù¯™ˆB±Þ9PvŽÂ0Œ’B”AWêŸX¬[ñé§—õ±Ï79Ž¢î¶âê¾îîä³/bý÷‹ë5-TKÑ®ÃE ýÉkÈÒÐoa¾fùŽ ÿ§A‚<àq+RM{Ú^úU †Ì´¹ð÷¬yH<Ý,m·?sòóûR¨Q”ÞŽDqÉÌï{ÙŸlµÙFª¹ízŠéz [¤¡ZK™ábÞÔ­ïäØïOǦïpa ¦Ei¥œ4/qèM'žAS ¾óSíÈõM'·ëÛ½\9Üì‡m@ƒ–Iì”b®ãá ëadRºÉ ¬­gm·ýñÞ¡±ÙòŽÇ{É×Ð=:0Èd·a:{oä9UÛÓxtè4Ê3£´Öhofå,žXY ‡ÕöÃVtrÓìÅÃ}³¹ZŠhFq+›îNhµ0ÿ±Ì^&"Ê'{YTA—0KŠ“¼úÓA{C­a4£—œ(L‚2UN”ß¿àIQœU‹ “h2þ™È2ðy0ÿxÚG‹õv#‰FDZî›¶éô„–×ï,¹=öͦ>ºCÿ0=·ÔÝTÞ,ĩശ]?´ÚË‘S;K*ZAnø¶7§q”ÛÙîC€Q¡Æl}Û•öš˜4FjlÚÃ^Z¨ô± ßY’- ÍhI¾ äÜ>ZÒøª¢Od¿¼y¿¾ysµ¶ cDï¯___­îë{6·Ù9éXõ~ÏgŸ'­&Æáû{™©Ð«7Ø¡Ï|¼¯Ý×_%oc`¤#èk½?1ˆ±iYoîBãXyÍà Æ7¦ËÓÜê·‚Æ÷Ž®;crð–ùùYàðš+¯ûÎÍ—GóiŸ•­Àþ8Ÿxh r*£¼z÷öÃoâÅ?Åf_ƒ'Bo¤ ¿§ñ÷¿:êÜI­¨\ßÝ òN;ÿSÁ(*+(3‹ªÊcʰÏÝÀ'ÂH eh¬ªS(˜fãÀi¬ÅhÉÚqùñF¹µ'ôMj© ¥ÏBãˆvCß2‰“nNœö“©d›©ÏW½á4«Tï-6q ÑšÍdW6s€®o/vMó¾™òYè›Eä³oÍ…bºÒÔ¢öˆ=‹!ËHkÇÓÀF‘ÖÚú[ÓžÚã4â°Yº-Êeî˜ƨ¼;3—õW SjÛìtmtœ[E™×³ŠöÓ'Î~\•A–pó1Õõ{yü±*$‰ã €*"‚zÖ UøJ‡f\”³F’4@éªk-çã}£Oxœ¨l­êY ¼lެ;Ù©£¹´,^,dÃ÷à~_ùí*k¯E³+‹ß_¯-Û‹ôÕÛ×*½Þ¼}ó”rR,mOÈl߸€ú&@×Í“ zl­M˜2*"“QM&£"ÚJ8 “ã"°ö#Ü0eê‰*bùÁ™ÇXó¾hm#‘ÛÓÌ?°ÞÞ€ùWssæåÄœ7oÖ×ïÞ_c©TPJß:pý«ëßXãg{È6’ò<6|¤¢¡ðŠ‚…)>°f£&o%ÈkíOÂæ! `ÔÍå$±½Ü,柤 §^fÊ¥Ô+ÜRVb¥^‰•²]GHfœrå\Ê=Š:޼m{ÚH&Å^)¹’* X0Õ|å fRÝÜO0Ð"ÓV­cà˜k®®?•·w¤Ö0/!‚NÌk®·y<½´«gÍæÈ  #û‰hMZ²šs’:ù0‘ä Þ`Œã(÷;†GG׎$ãÐ XS¼²žÈºû':¦9³eNs”/Í¾Æ < "ØæÓÑãllˆDL!òp×á½£aLÈ­„Ícrz¦Š½v-(à ]Ó½ÛžéÌŽ‰ÆÍxFñNª÷ÈzhöL®§ûÊ3ÕÜÂÑ4åÔÂÅu+a¥—@l­ÔËEN/XTüFAn|io¯‰ÕY=œh³aŸ[ -…ô Çä/˜Â¢š‘ŽvEæeº µš¤ªT9¥“ˆEŸÌ¥ú‹e½8[¼ÄU¡ª§ª ÓraŽÕ÷µLÂ8HÔ[L–OjÉ3Ø¡iš&0OZøhažE‹ŸU:…ƒ†p• ‹xIé¹Ódá¤M¸Y9[ ²Î¯%Š ÐÆÊw£lA´ Aqd&¦#íj”GBDúœ!iC4µtn“¶ƒ“Ò?`FÎCýøËâÄÆ½ñp€œz»u³ãÌ|>uçV…mð—N×ßKwŽ.ù¶^º“DdÓaÄ£sˆ±%vBWSð%á_ûF¯ð¦?+ ä[Eh§ÁZÕ<ŸFÊ*H3ˆíiY-GE‚$ÓrAøê¬VêkJT9aá4ɦùL3P—ì;¡?Œ ôGUUæsÙÊLîJ¢ÉóÕAq)¬HÓ'´tiê‡UŒÃ,“, “|AÇÀhFþªH›!À9bïâaF©BÓ˜)ÜM+f—8MS0C© ¶ya•æ',‰}Íqý|‡©!²—ÑÀ µëÃ÷7ò®À†a86cø¦·Â~´‚hIøb‰KŠØÝÛiáFëÈŒ™—qEåÈ~B`“‘}·_^ÙÍnn¡4õ-¤Ã|’xk#Œ×$¤kGšìƒH+ÈpÃötÀ% ’ˆÙA{^ .I7‰hY¾×·;µ·¼3_ÚOè.:lF6nôÆÍMŸå¾éÇÎj•æöŸèΑ¦Ò  m  \n$a^õ‘ã·[}äø­]– ÙXD¶,ËÙGhjÒùÒµ; ´t„Ûž-ªgÃlÁ°éÎ̆ywnμœœuãû—‰®ÅovŽîɶ[ãžu« ÆpÀªŠ°a⌇h` CmÖAJöÎŽ =¯ÑYñTœ“ïõe?[æOˆ?7}.˜^}×ë.Û•èÑìD'þ"èç¤ËáÉ¿,ÈCõ&eÃ^ÓÕW¤+ýéP¿Î¿“›Ó06_¥øý$Ðþ‰·ù²@¢Þø‹°âuÖeœa ¤N…þ,Fœ7ë¿9„,ÆoXnYƒþxiQÃzÕŽüÔ}tP~;€QGóÉ ™žzO+³7Ñ–ÖÒñ… ŽnéÝ‘ús¦ª<ÜËV}R˜íléÁ7{—*RvH­]y+ eÿfk8MçÛnÖ* 8›Xyýö10`í†YÅ­HO;z3ÓÊ JU«„}7?úÃiÏÛð‘ÌûÛ¸ÿàiØÖ endstream endobj 710 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 711 0 R >> endobj 712 0 obj 2870 endobj 714 0 obj << /Length 715 0 R /Filter /FlateDecode >> stream xœÍ]sÛ¸ñÝ¿N+3A‚ä5—_¢\ÜqÆV.qh ²ÙP¤BRv<þ÷.° ~9¹{¸6½Ž°ËÅ~c±üõˆþw"â4 ëÝÑW£$ãqBcû Ù $QB IØJ=d «©¸#Ê#Ÿüzôé3mˆïEäáÈ1G6WGïAxÄ=Æ“4Mµ®G“DŠ`‡ÁzGžŸíòºRÔö’‘ÿ?×ÞÕˆÑàÿ@#ŸÜý²:zþ&"Ô'«­Mégêû>e1I<¤ò_@V;òéøuÖfät½MC²rC^Ýeå­xö™¬þ~´\iC•Jü{*Ÿz¢ÐïqrÍà-þz q€ñ‚,’Ÿ ^ý+?tÃH¹ gÝ£Y9“‡ÁR~û3…ÏÇ%–©ï%½ˆÐ uÜßϲ?Ùk£@JÙóöø£ìjïyŸÂÀ‹Éq-šÖ«­ô)¿DýèÀâÛ&7yU:ȼéQˆõ¡ÏÁ­îD^;ðº*[Q¶î´Måe媷V+Á¥=Ôyy;«3jÐWñ 1ÆÏߤC/†,ùñ…rNqÜø:ÇO7Õæñe'dª”'{³*ùtÂ(M–hòöެ‹ìЈ—ä§Ÿ~&ÏVoÉ'r¹|õáòêì·%ùL¨È›öåHwz”¾@Ò9±âga" ±ƒÀ½öÿ&/ÖÕn—½œüþÏóÈ瑬„{~œ€¬”¹² ‘OŽ =6œ4,ÑÃ&)%Tf;a¨>šBl ¯}V‹ÒÐôD®«â°+],]ßÞµ#Òd`‚æþ™œ^«1ZO› €R<5Áˆ5¥©—¦¡ï³žw´ŽN@4Fšîu²Ðz©Üt×ñ=Uör{äi¶ÛÂ"p¡àX¯ ½~€Jåž0+-Œ…Ç·ù½pÉnª{WZ¹µ?\\,¯VžE¬\¡³Ë…±Àó“0MiÈ'a‰F‰—ºÕmÞ£!°áqèS° žŽ±eÏGãhGl0W;viæøAå:Šû¬8dPb ¦*×–R6fVk§e‡¢5`›ÝvÒ:+ÍøF8s¶RuíÈÊ-!F^O‚*gõÙNÒì2gò|ÐÀe<â¾%|ÂI&h<‚MÓ ÙØÁ@ÑŸût)fSSÈ¡‘{4£Ù‹u¾ÍÁZUz¼±ÜúË }½Žu¶RƤʶ0[ÜñøPÕƒ»^ã`Ú—‡ìqö›.žîd½NQÏF"ˆ™—À¹ IüpÂ*SHì`\WÏyï† gäÓ  Ì} 8:P­B 16-¢W?fBÈ`¦q ýþ¤ ÓÛ9MÓáTH™ñD©d˜¨bM,µ”4 KŽuL˜µ‡2î%24äá„4J#YкUƒÝ¦:kBËpŒ“'mÙ/B7bÆŒgï.,XÕ³ŸNÏϺ­ÃÀ\÷Eél¸T~&]…ziAw æú¸É»Í1¿žX^Y ÀñÕò|ùjeᦅ’¬8^?ó,Zç)]SÒÓÀa¿µãÖgœ…`î(m6ƒ±W6ðÊ6¯1lI"×+nÀBf«Ðð€VO8Z»ij4c‚p>«“öTÙódBo“Õ ¼Äfµ¿›ÕÌ÷½”q\4cöžÕðtÛbÛÑiŸ;F7­Ø/fL[êZÇò‡œ2Ž‹f¬†¦006#à4LjPjâ°·e믥¢ÒšRõ¢ž¾>ÎÌØä:‚&Õ¯Ÿœ²o,CeîbþÓ”{Qo«z7•Òᰀ߈öA`†ÎºAÀañ@…¸Ï«C3O®ëИœF141›ÐÖ–gŸ{¡Sžü~y†’lúÙ1û…Õðá._ßY0w¬e‘Õ·ÂñÄÍ£k§K[A,2y”ö,n5•½‘Ü+"èâu±%+í1²(]ÅÔØ„Ü¢²[ì;°~[XøP¶yaÁ®v¦ý jM¶3„ómœZ¹ÏádÆÙ„¥&¨©rOS„¾Òм0epœã æV½¦­öŽÇT{é¸ý b:`¢÷ ”ö Âè·.á¬?€š€;ÒˆN³Å:pŽô ø®3hê{ ºMÈét‚µÕ sÇeõ`ا`o3tâŒç™®õÂaË%,g¼Ò»\ú£ìu¥.œis6 ü]·L£Ùùx¥ÓGÀ;Ò uÚ™_p¨æ\Ÿ‘Æ\ÇwO ü§8ÕeBs¹[Ù7Sù‘‡¤ KqÎÛG(%WïÏAòN¶45D«Vj+ðˆÔÕ¡Ü49ÛUêà?ñm-ÄFÚ ‡`Q×Ðå¶ÎòfR&_y±K#}|UNêü>Ï ÛË„U¢à03#­á½%븩”Åawe‚Ð(ªÏ€UkY`â¸ëú2^þº¼°,Þ¨þ¶§ûÂêa•™Ú[´þjù t5PW cGB!ë9²2›uOà­íÄîF-×À^@ i¶Ù./§h6Õm³0P[Ý ÐÏrÓ% Ü‘¯.êZg&Þf 4íW„Œ_G²Ý9öF_mò5”¡f’xëC1ÙÛ³ˆö}w+ÊnƒÑ*@`ó²Xíd[W;‚ÃBØV‡,¶“<óÐrHi,ßÒ8ˆ SRß©{æÅ܇ÒOÂX¾…ž¬ÔÐ|Ày}{ôhà(.©¤Ú‘§}T!Q.§‚ô9›·/òiÊéð‰ÄȈèH†Fuš#ám‰ç*µ>¥"ñ;’,ƒ 1Á@Ž«“óaG”E=RùP8Ô¨‡øIú„jTƒêÔÊÖÚô6ŒÏP»ï*3ô¢FÎ1¯Y)IWØ vÈ0L}?¢ºÓ}u¹<]-Éêô—ó%ÙïÛZr}¼Ï7äìbµ ø{ýìoã…“Pš ¼½U¬Î.®–—+Iÿ®ã¤ý×ÇÎÏ„Â1gq}LÁõ³‘ƒëã`ªßp©_¶àú7žÂ)48ävï<ê¾×n¿Ú X• ùB° 뻼؀ðS©Ë?h%¿Ô×üˆÖ\ªH^^­®ËCQ ¶9yXS¦ŒùÀ©«ï]BT÷>¦ ÒóÑGCPšü•€Xˆòÿ›ËwÿÐþ\ eß./—ò;ù-ó‡¼â`QÂc˜¯EüyJ^Îâ3`g#ÿ<½$ðïÕÛ³ó×d<‡ÇÃONNȉú‡?sâxà ÐÏ ªÈÄ,y‚è“`fNÊéâÌaÓs"è‡ú^`F gæÐ¼ÀB„Õkæ ÂgæÑÀ Μxf >R$zâ+‚Ð2ÎÔše51ïî“~û¤Q²Êñ¶ x}ea<$|³Øu-”M5?ù^?!´É·Û|ÝÝ 3gòFÜC—¶wx—÷ëÍáÖ³°i^ f_W÷ùƵ%¿sDPÞûÊ 8Ú”°³+·èƒ}e‡xÆ×7Øû í}¢ÛmƒDp¼=”kÙ08óõMCw…ÒêÒJ’_ãøÍh:><é¼0pV>Z:ŒÙ‘´m.M;Š|ß!mÖ|!ÊÒÑÊcŸ¼Œ¯«b¡ŸwŠ × rŸÕ¹ÒXþ”±-)…üƒœ¬~\Ø£„yžg„òA²r¶ÆÄOSÆugö^uóËÁ3Õd¦s8Y1K$ ¸=[0ßýC „z÷Ûˆ‹8m5¡ZPf–¬ÚKÿ«C "ô££fÒ=:vó6vüãªÈ³¨g ¼}øÒåá±™øs…pपĞYßÏËÁ®ª;œ|¤Ûè±Øß‰´¼…†1=;à.kõP¿†òî-”»×ª ùסéè‹ü‹0\ºÑ&öY#¦då刼óªÒÓõ©RCz´÷·`ÿBümÎ endstream endobj 713 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 714 0 R >> endobj 715 0 obj 2933 endobj 717 0 obj << /Length 718 0 R /Filter /FlateDecode >> stream xœÍksã¸í»?f{^õ–vr;“ÝxïÜI“kâ›m'—ŠMÇž‘%¯$'ñ6ýï ¾ô°“ë‡k÷1@@©|¹„Âß÷üGœzd¾}“4—Äñ#I #âÆND²!I„䜱r ú‚*¹Y‘¯£bDÉÏ£Û;`Zê„äiD{ÂQÌÍèï°x9~”¤i*uõ7Iø¾0ß§œ—‚[iÏÑÿ¹ö¶F¾ëýhDÉÃèÓlôã—¸”Ì–&¸Ÿ]J©ëÇ$q|/å<2ÛÛ“ó¬ÉÈÙ|ÎêšdÅ‚|^eÅ{wGfMfÒP!E„’ÿbGÄSk h{ÄŠ5M7Tø8>Ò€âx!Xćr¹½ò'P`(Ü…?ºGв&w7KøíÏ\üð¾Ä|¢K¤µ#®O-÷·£ìOöZo#ùÚÚž´kíE×é·«ö„=o+°uY|$>üDnÉéÓºY‘yžíjö‘Ü‘#¹/ûèˆ×Qâƒß\Õ‰\댼# (‰X%… VpÅ–¬ªÖ” Ê4)»Ï™B–eµa -GKÙÕëâA!¿]N¯.µœB³—ÍŠU ©Y£é[Ve èW;Š4[±WlA¿XÞ¼Ž7”•Iè¸äd]˜=fù.kÐ$-«rc°œ-ƒ¡S®Ö+kHZ'ùPiD¦—³ÉõÍäóÌÐβ2”Ufi–ÍÙ‚sKJùȪ h/h2ùÇçɯ³ž‹Â ã"¥8þŒÔëÍ6_/×à–O—_8ìaýÈ Y^>}Pq8ò1$·Ô…OÚ1êxn"Þ AIámáüX¬'£aÕÆf9Æü¦µ•ĞÒ´c:NïÙÅy!çÓ›ÙôöøŽèyYÁ¢Û²XðÃPoÙÜ:×BýÞ®ë:qìSêE=ߥd:c6¢ÒIˆty·Õz“U{‹ýå0sGp+^‘tk@nîPíM¹ëÛèùÿK_df?Mã¤ã*Ò–ñGO ðT„6S¨ÈhšïEsÉSÒ²Šš§½R+¸EE–@nõ¬²Z°ªoG˜´í€4jÊø„ïò†”Ë%O’­¡%kæ+²\Wµ=pŠY uP'öC8ö‘+§ýáz¶?†~ 6[`|“ =ÌEªÖì/šY ñ «‘9¤ö¦ÚÍ!Ó Ìwæëùºé+ÕV\jª§Ià:ÏÎ>]LˆÔ’,ê^dÖw‰ç†ŽçF”ú:v퀄p·¡Í5&Ÿ€?_]_On~½º<Ÿ^þ¬©·úôO ªÀBLG–œ—ùnShœ+¬‘|]7Úón²­½äîHÏà©¥1¸Ôó­¦Á¥99˜â¡A‹cÞÓÄþ€+ùB‰df9¨T(ß Ó4 di]d9Cø B[˜$ „J¾EE•,jéÑØ ü€Ò0>ªç<+4|ÏT¾™\Ȥ*к¾cÊfl™úº}~;4ä; ê€}ú@X» ŽÆAƒ „›S˜&qH4êa¿‚ši¼ÈQšÒ4–JáQÄL`§€ƒ:¹á§’ÀqcØí”Jue¿èÂ}":›HÇŒi°)”H¹å‰-Ë‹6]ÚÜÍ¡©EiÉDÉc‹½[ÑF-ìð¾»ìx#ˆü³M\pFý׎žÏ*…(‚R: ÍRH¿?¤là»´JpõËÏ!eû›™FÆWg Ìâõ$pr²ÙÕFVÙ#ÓÚpy‘b·¹6¢åRƒ˜ÅÅ S3Ö 3¤ŠÀkØÐW¡y* ëzÁÌÄ‚‰»‰Dʶ9=ú4éøBm˜ë„ÚR‰iS%^. l+)Sk´(»œç…Ê`òlÜÂ`âΫ±–dž®ÏŠÀ²¶lq4*v\JÓ Ëí–«Ô-»Æ}/û^ÇË"“úâ¾»[>ÕÝ—; ‹{7‚5ËÙÜL*‹|oÆJ߈Xš"çÒˆ[6³žÙÀ—ìÛ¤¢"%"¬^¤°ÏCJÏ+Å~PrÁžÚº8ëž3Þ³÷t󬸯>W9ƒŸ‹Ù‰×ÍG"ž:ø0Uٞ趤&SàX=gúMHÎ× ôwr´ï¡8ìxH­Ë_Ö¹r™6„¿dy]ešZÿò·‹ ¼;cIÖ;„Ý(‘guó–R$a#Ê¿HñZìA’¥üSh« ÌdR%Á"a™±å¤-øMe‡ó»ng MjWÁ}BH54r) ¥>!²Mø É*Ü[Æë¬cëd ÈZØb埙»µopçŸhBc¶!µ*s_›Ö†u÷§«Ý[jsË;Hê9çHqàŽN(í®zU’uö™ü@öäì†<ïëÝf ðä;Ç÷ßoUn 6²NÉÓ˜<÷˜|‡šM¾þ2¹ž@Wûô´?‘'"òLÿ› ¡ñnB}Ãá•_,,ÎØ ¹8»™åÒHù2½¾™©(¡=O §Ú”VåOùg$•ïùAïU¯µ¦”…YÁMYúá'Ð$t(Ãb; á©z‘"»‡¨<¦‰ùÐ[ù; ÐÑ*ÙÆË›¡´a©AYYY°.+ü‹h6‡þBu©þø*ÁB´£—ºÝbñ:â.Ç÷¡=I#@ˆöô—í¯#—ZÄ¿ºñ€DG«Ôê>äåu ý°Ë³ö¢ìÛ.ËíúÜêf†+|G„í衊¯á‚=¿Á›\R!ð(irÐýÍ ½ã[EÅÝÊhY8G©C(Ê~èS/ö©™êœÞC¢â¯›ø; QŸØ E~’˜nm$ŽÍDN¹Ë-¼÷ýL ÜZð¿lü1*ûØÙwcw¬ê,õoÇqHÿÃlÄ+ œ$ðÕ>I•ƒÈJPFa$£ ¶²Jû³»a¿5ÌТåø"‚ã^Äï&Ý|Öð‹†Î'yÀ2hrÚ–ÝÚ©¼X©ÿèç2¸»8¾RêÉô ¶Ìà€WŸ%ßteüˆþ[Þyi endstream endobj 716 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 717 0 R >> endobj 718 0 obj 2860 endobj 720 0 obj << /Length 721 0 R /Filter /FlateDecode >> stream xœÍZësÛ6ÿ®¿žƒðýȸqb9Ñc_-µi&ÉZ‚,NùPH*Ž®éÿ~ ,^$%Ÿçn¦wiïo,»Àîô—‰Køï9ÿ§Y–“/’ç’Ø#~$YaDܘFNBJ"A&¤à{$ï"I_peoò~RMòfòñ3tZ‡†äa⌄£˜ùäg˜<Œ¨%išJ]=ê& ŸÂ§Ë’¼˜•¹¨Eo¥=äüϵ·5ò]ïÿ@#‡ÜO^-&/.Câ:d±6[€ÛÙuÇõc’PßKù,Jòñä"ë2r¾\²¶%Yµ"¯7YuÏž}&‹¿O¦ ¹P!El%þÆTì§^C8ýk¯i¾áÂÿõ‘ê…°"ÞTH÷ÊŸ¼A‘¡0þD$|ˆd½eÚ8ÈYf†në’uyÉZ͹cÖPhÊqoÉÆ½&ÑÉH³ê>¯ |à¶P ïN +<(ªÍJòjži„éLDܼº·…Œ úƒ… ´´Öu³b ¡ä—Іâzn²íVqWwòÃ?Óùkò7rýËÕÕœ\ÏB¹żœÝÎTí£x|ºã<øQ„ê´u£÷Ðç.ò¶S"¢±ˆ4¢i+ŠÒðI"FgB‘›Ð€W q"Õ8BžA³“‚z— ýI£—/ÔôÙ׬Ø1 MÌ0Ý?r3)ð]SܤŸM'´¢‚šfÐÈ·®ïÐ k†AŠË0®ù|ô0øУ?ÌIœà¸¹Xð^Ì•&4˜£hm„bËP‹qþH_ëè)žˆÚ @;lêR0=Èî'C!°+Vßõ¥ºßw\šz1Ô2°Æ¦8û²c°DG4éyóx€„¬ ûÑqbß; ³g¼§èø c§PìGuï‡(tìmäãêóIFc¹žžï »V+ q·–’ÈxH ^.aÇ`œÒCj Ô•= $AY7vÛQ{y©C£(æÙ)>°s>ÃÈy²O€zqÇ+MȤ–^‹Í“´D¯BÜñ ‰ÓrìU؆ýŽOÑ>Š [/tõ EÚeE±×8ÓÏ-Ó“¸†òà…®9¢œF÷Ÿj|·ë̬f4OºF2¤|£PÞY fÄ; âÓtzÄ!Þ+‰9öC’ü‡~ $¢„””¨\s¬œZV°e'Ò% «T‚¾<ðƒx(Óú°AÞƒ§!Mý8–A¾È—àÒGƒçC éð¼F¦úvÅ®^åë5kXÕiÛÓ#Y@Ñáyw­tS?´ ‘¾3}ìœ ¥W‡…©X#›Di£P¶îX£Qnºm²Öš•U½Y“ÚË5aK6…­Ò¸Æ)¡Œbü¡ÅÊŒ­á}:Á ÜSýoêÝÔ°Xªj3Ö-é§gÔ0›Ü’lÓ¦b׬»½¡ÕÉàrºxýÖ@J­noÞÏ ’9ÁÍåå|º0/íØJ‘7´ᮕòœ r>½š¾^Üvp±)a7RÛU†îÔêâŽ=µ™%©g Á²´XîY¥UcnXYµÇ®›ºì©)Ë!íÅõ”;·¯¡µ˜ÝÖj©{½ÆƒEÍÑ™b5|¿³m'" WŽR§®aºÇ*o—lµ}¤˜öÒ&Pú8‘+ã§<–õzÝ2¸åáå’ð‚YZöL6ÁDp ÜUPVÿA`;‘ïDlª?GËòù³”ºnɪÿl [~#Œwß“uÞ´FjN…U±Îi³¥9úÃðuµÍÑwM]O3ì?5õQSj—¨µÂ¥*øy¼J¸ÇõWÙ7 ¹¹¾ú@>’_æ³ë7dv}1ý¡'åùÆ‹TF!¹ç‰«Ù»8UG•-oœâ`Êðc1ô¬›ç°'ø= 3Žaô®Èê²ß1ùKˆÇ©%¥<ÖÙ=3 aP—@Fu‰²¢aÙjoÛ¦æWg<¶²Oe]aÓά7¯-\‘c+Їoì¥$®Ú•w"Cøú1IP2üZ†ß¼1 RÅ™ÁH«‡6%ögšÄ•Ë>Ý®©ÚCò­ )OÑU%à¡0UìATÅ æÃ¿o+AxIó·yΘƒ†Xz9®ˆõy}‚ Y"ÀŠTu¬ÀUמÞj_ee¾4Œ¯Y“ó@ow‚ÜÞáÑdl³&+XÎî…—¢ÞˆñÓ˜“ Œ¤çÃZR¼Cê9©/)w°zXÊìz1}3½¥úá‚HàBuL€ˆ=þÄà’æ~‚p3òÇ'0!Tšh˜’YO¾@ÈN›Ò;•$ˆÒ>«à,[PAú‚õS3 ᢩeðâŒs@ÇëÏaXêÑhrÝ7€ûX wñP錠ÇxºB\¤w`o0OO'ÓP\‘Ý•[d¤‘ÍxЉ ìÉ)̬’¥Ôέ´±6ôÏP»«ÌÐ:’54Žþ8’dl/¦i™ ¤¼Ó`]˜’;ry{óŽdx xÿvz;…ÉÏHHð]øÕ’ݵ»RÕ ¾,‡<Ì­"³ŽÏ”Ó0´«©ÿfB̹yñÉ 8á¤Â¯¼Û?@Ê!?¼ $Ú LipY¼—y(¬GºÄA¨&Ð ¬‘æ×ÏÓ#rzµ1²tà—KZ¤UŒHî,±™Å/Xfws-UÄ…é!oí‘ÖŠYÓÔÍá5a";øý vûV”פuÜd_óz×(†iâñ.åxýñ".i4š ç?_iì U é±áÜ_ 4P~޶}÷<kÿÄÊ;c{$~ß2ðrÛí Z°„ñ§~‡I`hê8V|ã{¹üI’ovf ng¤Ñ%’/¿IX[MÒÈZœæ¨dô¶|d°ú¬&¡ø®¦äŠ Å©%¤;¼‚ .àê•9ò{­Dø]K)‡·j83K7þr86-¿8õLË_ÈstvÓ@IeCDueõQ4ˆõó"Â2Ûkš_[4Ø6lÉV¬Z2ªyâÊ çkMϺms|¥’rj3ûj¥i¼~iYâv`: iV™áâÔ»´ö  m>ÈÁ}ó¡g L®Y2Q3r†,Ñ‚Ükú%ŠFå9œ€‹×åTŽâ™r˜ÒC(I Ÿ;^œøÖ¯“àï¹zæi•Èûï£)iâ¥òâ‚PE |”Œ<&އ_„p0dùÅT$øG¾DFm|˜5†yqÜ 'Õ¯S/I˲f¹Q÷?ùë0ÿ9 ØÆ endstream endobj 719 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 720 0 R >> endobj 721 0 obj 2766 endobj 723 0 obj << /Type /Action /S /GoTo /D [399 0 R /XYZ 72.0 558.675 null] >> endobj 724 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 709.5 176.11 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 723 0 R /H /I >> endobj 726 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.428 709.5 539.94 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 723 0 R /H /I >> endobj 727 0 obj << /Type /Action /S /GoTo /D [567 0 R /XYZ 72.0 293.408 null] >> endobj 728 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 697.5 229.443 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 727 0 R /H /I >> endobj 729 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.495 697.5 539.836 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 727 0 R /H /I >> endobj 730 0 obj << /Type /Action /S /GoTo /D [570 0 R /XYZ 72.0 696.0 null] >> endobj 731 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 685.5 161.874 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 730 0 R /H /I >> endobj 732 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.351 685.5 539.848 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 730 0 R /H /I >> endobj 733 0 obj << /Type /Action /S /GoTo /D [570 0 R /XYZ 72.0 240.233 null] >> endobj 734 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 673.5 207.735 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 733 0 R /H /I >> endobj 735 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.436 673.5 539.794 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 733 0 R /H /I >> endobj 736 0 obj << /Type /Action /S /GoTo /D [573 0 R /XYZ 72.0 554.0 null] >> endobj 737 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 661.5 147.1 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 736 0 R /H /I >> endobj 738 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.403 661.5 539.944 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 736 0 R /H /I >> endobj 739 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 649.5 145.359 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 577 0 R /H /I >> endobj 740 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.364 649.5 539.853 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 577 0 R /H /I >> endobj 742 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 637.5 135.43 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 741 0 R /H /I >> endobj 743 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.37 637.5 539.947 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 741 0 R /H /I >> endobj 745 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 625.5 238.555 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 744 0 R /H /I >> endobj 746 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.53 625.5 539.795 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 744 0 R /H /I >> endobj 747 0 obj << /Type /Action /S /GoTo /D [583 0 R /XYZ 72.0 598.512 null] >> endobj 748 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 613.5 221.758 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 747 0 R /H /I >> endobj 749 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.419 613.5 539.785 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 747 0 R /H /I >> endobj 750 0 obj << /Type /Action /S /GoTo /D [586 0 R /XYZ 72.0 627.66 null] >> endobj 751 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 601.5 218.46 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 750 0 R /H /I >> endobj 752 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.407 601.5 539.783 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 750 0 R /H /I >> endobj 753 0 obj << /Type /Action /S /GoTo /D [586 0 R /XYZ 72.0 475.41 null] >> endobj 754 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 589.5 177.947 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 753 0 R /H /I >> endobj 755 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.383 589.5 539.89 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 753 0 R /H /I >> endobj 756 0 obj << /Type /Action /S /GoTo /D [591 0 R /XYZ 72.0 502.696 null] >> endobj 757 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 577.5 295.877 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 756 0 R /H /I >> endobj 758 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.604 577.5 539.695 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 756 0 R /H /I >> endobj 759 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 565.5 185.192 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 612 0 R /H /I >> endobj 760 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.384 565.5 539.759 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 612 0 R /H /I >> endobj 761 0 obj << /Type /Action /S /GoTo /D [608 0 R /XYZ 72.0 577.251 null] >> endobj 762 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 553.5 135.43 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 761 0 R /H /I >> endobj 763 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.37 553.5 539.947 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 761 0 R /H /I >> endobj 764 0 obj << /Type /Action /S /GoTo /D [608 0 R /XYZ 72.0 490.473 null] >> endobj 765 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 541.5 196.734 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 764 0 R /H /I >> endobj 766 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.401 541.5 539.792 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 764 0 R /H /I >> endobj 767 0 obj << /Type /Action /S /GoTo /D [608 0 R /XYZ 72.0 281.928 null] >> endobj 768 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 529.5 200.21 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 767 0 R /H /I >> endobj 769 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.401 529.5 539.836 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 767 0 R /H /I >> endobj 770 0 obj << /Type /Action /S /GoTo /D [608 0 R /XYZ 72.0 132.372 null] >> endobj 771 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 517.5 164.44 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 770 0 R /H /I >> endobj 772 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.392 517.5 539.942 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 770 0 R /H /I >> endobj 773 0 obj << /Type /Action /S /GoTo /D [617 0 R /XYZ 72.0 627.0 null] >> endobj 774 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 505.5 170.0 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 773 0 R /H /I >> endobj 775 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.409 505.5 539.941 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 773 0 R /H /I >> endobj 776 0 obj << /Type /Action /S /GoTo /D [620 0 R /XYZ 72.0 696.0 null] >> endobj 777 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 493.5 162.79 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 776 0 R /H /I >> endobj 778 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.386 493.5 539.941 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 776 0 R /H /I >> endobj 779 0 obj << /Type /Action /S /GoTo /D [620 0 R /XYZ 72.0 568.8 null] >> endobj 780 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 481.5 165.56 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 779 0 R /H /I >> endobj 781 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.394 481.5 539.94 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 779 0 R /H /I >> endobj 782 0 obj << /Type /Action /S /GoTo /D [620 0 R /XYZ 72.0 387.6 null] >> endobj 783 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 469.5 170.56 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 782 0 R /H /I >> endobj 784 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.41 469.5 539.94 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 782 0 R /H /I >> endobj 785 0 obj << /Type /Action /S /GoTo /D [620 0 R /XYZ 72.0 314.4 null] >> endobj 786 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 457.5 187.356 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 785 0 R /H /I >> endobj 787 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.412 457.5 539.888 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 785 0 R /H /I >> endobj 788 0 obj << /Type /Action /S /GoTo /D [623 0 R /XYZ 72.0 720.0 null] >> endobj 789 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 445.5 192.34 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 788 0 R /H /I >> endobj 790 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.428 445.5 539.888 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 788 0 R /H /I >> endobj 791 0 obj << /Type /Action /S /GoTo /D [623 0 R /XYZ 72.0 303.007 null] >> endobj 792 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 433.5 265.117 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 791 0 R /H /I >> endobj 793 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.501 433.5 539.727 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 791 0 R /H /I >> endobj 794 0 obj << /Type /Action /S /GoTo /D [623 0 R /XYZ 72.0 192.361 null] >> endobj 795 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 421.5 224.494 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 794 0 R /H /I >> endobj 796 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.479 421.5 539.836 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 794 0 R /H /I >> endobj 797 0 obj << /Type /Action /S /GoTo /D [626 0 R /XYZ 72.0 662.333 null] >> endobj 798 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 409.5 215.651 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 797 0 R /H /I >> endobj 799 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.449 409.5 539.834 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 797 0 R /H /I >> endobj 800 0 obj << /Type /Action /S /GoTo /D [626 0 R /XYZ 72.0 544.465 null] >> endobj 801 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 397.5 197.314 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 800 0 R /H /I >> endobj 802 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.444 397.5 539.888 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 800 0 R /H /I >> endobj 803 0 obj << /Type /Action /S /GoTo /D [626 0 R /XYZ 72.0 211.461 null] >> endobj 804 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 385.5 164.489 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 803 0 R /H /I >> endobj 805 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.407 385.5 539.896 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 803 0 R /H /I >> endobj 806 0 obj << /Type /Action /S /GoTo /D [626 0 R /XYZ 72.0 134.527 null] >> endobj 807 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 373.5 150.55 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 806 0 R /H /I >> endobj 808 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.348 373.5 539.943 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 806 0 R /H /I >> endobj 809 0 obj << /Type /Action /S /GoTo /D [638 0 R /XYZ 72.0 227.114 null] >> endobj 810 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 361.5 184.565 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 809 0 R /H /I >> endobj 811 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.435 361.5 539.92 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 809 0 R /H /I >> endobj 812 0 obj << /Type /Action /S /GoTo /D [643 0 R /XYZ 72.0 158.674 null] >> endobj 813 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 349.5 191.782 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 812 0 R /H /I >> endobj 814 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.459 349.5 539.921 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 812 0 R /H /I >> endobj 815 0 obj << /Type /Action /S /GoTo /D [663 0 R /XYZ 72.0 673.836 null] >> endobj 816 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 337.5 161.1 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 815 0 R /H /I >> endobj 817 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.398 337.5 539.959 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 815 0 R /H /I >> endobj 818 0 obj << /Type /Action /S /GoTo /D [680 0 R /XYZ 72.0 651.2 null] >> endobj 819 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 325.5 204.521 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 818 0 R /H /I >> endobj 820 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.499 325.5 539.92 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 818 0 R /H /I >> endobj 822 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 313.5 214.548 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 821 0 R /H /I >> endobj 823 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.495 313.5 539.884 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 821 0 R /H /I >> endobj 824 0 obj << /Type /Action /S /GoTo /D [683 0 R /XYZ 72.0 720.0 null] >> endobj 825 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 301.5 193.89 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 824 0 R /H /I >> endobj 826 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.492 301.5 539.892 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 824 0 R /H /I >> endobj 827 0 obj << /Type /Action /S /GoTo /D [686 0 R /XYZ 72.0 689.194 null] >> endobj 828 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 289.5 187.914 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 827 0 R /H /I >> endobj 829 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.445 289.5 539.919 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 827 0 R /H /I >> endobj 830 0 obj << /Type /Action /S /GoTo /D [686 0 R /XYZ 72.0 525.829 null] >> endobj 831 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 277.5 142.77 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 830 0 R /H /I >> endobj 832 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.339 277.5 539.959 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 830 0 R /H /I >> endobj 833 0 obj << /Type /Action /S /GoTo /D [686 0 R /XYZ 72.0 225.72 null] >> endobj 834 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 265.5 158.33 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 833 0 R /H /I >> endobj 835 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.389 265.5 539.959 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 833 0 R /H /I >> endobj 836 0 obj << /Type /Action /S /GoTo /D [689 0 R /XYZ 72.0 685.92 null] >> endobj 837 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 253.5 201.192 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 836 0 R /H /I >> endobj 838 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.49 253.5 539.922 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 836 0 R /H /I >> endobj 839 0 obj << /Type /Action /S /GoTo /D [689 0 R /XYZ 72.0 213.6 null] >> endobj 840 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 241.5 190.676 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 839 0 R /H /I >> endobj 841 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.457 241.5 539.923 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 839 0 R /H /I >> endobj 842 0 obj << /Type /Action /S /GoTo /D [692 0 R /XYZ 72.0 158.817 null] >> endobj 843 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 229.5 178.495 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 842 0 R /H /I >> endobj 844 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.417 229.5 539.922 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 842 0 R /H /I >> endobj 845 0 obj << /Type /Action /S /GoTo /D [698 0 R /XYZ 72.0 171.699 null] >> endobj 846 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 217.5 172.404 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 845 0 R /H /I >> endobj 847 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.395 217.5 539.919 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 845 0 R /H /I >> endobj 848 0 obj << /Type /Action /S /GoTo /D [704 0 R /XYZ 72.0 248.598 null] >> endobj 849 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 205.5 157.22 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 848 0 R /H /I >> endobj 850 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.384 205.5 539.957 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 848 0 R /H /I >> endobj 851 0 obj << /Type /Action /S /GoTo /D [704 0 R /XYZ 72.0 148.302 null] >> endobj 852 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 193.5 161.11 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 851 0 R /H /I >> endobj 853 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.398 193.5 539.959 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 851 0 R /H /I >> endobj 854 0 obj << /Type /Action /S /GoTo /D [707 0 R /XYZ 72.0 672.0 null] >> endobj 855 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 181.5 201.222 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 854 0 R /H /I >> endobj 856 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.49 181.5 539.922 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 854 0 R /H /I >> endobj 857 0 obj << /Type /Action /S /GoTo /D [707 0 R /XYZ 72.0 597.63 null] >> endobj 858 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 169.5 152.22 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 857 0 R /H /I >> endobj 859 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.368 169.5 539.957 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 857 0 R /H /I >> endobj 860 0 obj << /Type /Action /S /GoTo /D [710 0 R /XYZ 72.0 663.84 null] >> endobj 861 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 157.5 205.628 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 860 0 R /H /I >> endobj 862 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.505 157.5 539.923 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 860 0 R /H /I >> endobj 863 0 obj << /Type /Action /S /GoTo /D [710 0 R /XYZ 72.0 554.4 null] >> endobj 864 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 145.5 169.99 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 863 0 R /H /I >> endobj 865 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.425 145.5 539.957 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 863 0 R /H /I >> endobj 866 0 obj << /Type /Action /S /GoTo /D [710 0 R /XYZ 72.0 444.96 null] >> endobj 867 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 133.5 180.159 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 866 0 R /H /I >> endobj 868 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.42 133.5 539.919 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 866 0 R /H /I >> endobj 869 0 obj << /Type /Action /S /GoTo /D [710 0 R /XYZ 72.0 135.36 null] >> endobj 870 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 121.5 265.65 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 869 0 R /H /I >> endobj 871 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.587 121.5 539.812 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 869 0 R /H /I >> endobj 872 0 obj << /Type /Action /S /GoTo /D [713 0 R /XYZ 72.0 135.023 null] >> endobj 873 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 109.5 192.889 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 872 0 R /H /I >> endobj 874 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.464 109.5 539.923 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 872 0 R /H /I >> endobj 875 0 obj << /Type /Action /S /GoTo /D [716 0 R /XYZ 72.0 316.686 null] >> endobj 876 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 97.5 156.1 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 875 0 R /H /I >> endobj 877 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.383 97.5 539.96 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 875 0 R /H /I >> endobj 878 0 obj << /Type /Action /S /GoTo /D [719 0 R /XYZ 72.0 528.3 null] >> endobj 879 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 85.5 148.34 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 878 0 R /H /I >> endobj 880 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.358 85.5 539.96 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 878 0 R /H /I >> endobj 881 0 obj << /Type /Action /S /GoTo /D [719 0 R /XYZ 72.0 174.948 null] >> endobj 882 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 73.5 196.107 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 881 0 R /H /I >> endobj 883 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.498 73.5 539.891 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 881 0 R /H /I >> endobj 884 0 obj << /Length 885 0 R /Filter /FlateDecode >> stream xœÍÝO“eÇyØé=?E/áˆñõÉÌ7ÿ-eR–ípŒ$‚/^´ÀØ@ƒn4(i>ýœ÷VƒÝ]÷@ìgãR ¢€_Þª®§Puî[yóü¯_•WÇùߟÿ3w}õÍ÷¿ú_þ^y5ë«6>ü­>^•yÇzõý«o¬¾^}—ág™É‡¿l÷¿û¡~~ã¯þû¯Þþêxõ7¿úÿóŒ~ÿê¸õWÿü«ãáÁŸæë_ýýùÎû¸µ±öÞ>Öz+kå»h·qþÅ7ß¿úÿåûúê7?ÜëŸ?ú| ãÿóþÓ¨•úÿƒèxõí¯þãï~õþSUŽW¿û§_£ÝæÎÿÔxµn­>ÿõ«ß}ÿê|õŸÿõOï¾þûÿöê~|z÷êo~zóû§÷?_ýî¿þê¯÷áOyˆû×Q=ÿoÞî_LŸýƒÇçÿä“/´?ÿý÷üÿ¸µç¿wþ[íç'ÿÑwl?üoþƒŸÿ²ß?WÏÿû‹Ÿ›õÉâ—R÷OÚÿÎwþË(³ßòïÝÖgúä“ÿùØÿæÏÙc¾ï_þÓÄzøÊúõoÿéÍ·?½{ýþÍoŸÿXÎË·RŽó?£<,|õïÎäçøÕòó ~öãhG—e¥Üj;˹ÆÃ²ÛCOˆë!q“xH¼o5ÎO}ý—ãV%î/ˆ£HOˆû!q“xH,‚C‡œ"8EpŠàÁ%‚K—nÜ"¸A° X¬Ö‚µ€`- X Ö ‚µ‚`­"ØD°‰`ÁÁÁÁÁ.‚]ûzþÙ}Ôö—ãQ$‰'Äó¸I<$Þ¯*q—X·nÜ Øl¶Û‚ç³ ‰A°l[ÁVE°‰`Á&‚MCCC»vì"8DpˆàÁ!‚S§N\"¸Dp‰àÁ-‚[7Æ‚q€` £€`Œ ‚QA0*FÁ&‚M›†††öã¶Æy=3úãÅö/Ïãü¶uÇ>ßÇ¿µlÞönG)1–­ö²^çsÛÑoÞüøÍoß>}óþÍÛoó­}‹W_ýîé_ÞòÖëüîéLJ±Ï¼Åù•²[ûqñØæüµy>•–¥X9ŽºÊã²ÇYДúþüáËëFõ zK}ñåu§zI}ñå5Yn±¬‡XÖC,ë!–õËZIJ±¬E,kËZŲV²ldÙȲ‘e#Ë Ë Ë ËN–,ïO.޽fï_Pߟ]|yݨTo©ïÏ0¾¼îT/©ïO2¾¼ªÉr“å&ËM–[,Û!–íËvˆe+bÙŠX¶"–­Še«bÙªX¶J–,Y6² ² ² ²ìdÙɲ“e'ËA–ƒ,YN²œd9Ér‘å"ËE–‹,7Yn²Üb‡XÆ!–qˆe±Œ"–QÄ2ŠXF˨b•,Y6²lddddy^Û—ãüo+s_¤Ü'M;öîEæ/9iZkÇìóqÙŠ‡§)çÏó[kÇq”Õž£ŸgJ¹Ûn¾úê?½ùîé“7ÿáÇ×ß>½x”ó#Yóþ›ëþøpŸ¬}±ì¼àŒóÙ÷ž£Ò²qÛcÏ~ÚŲ—ŸýóÂóËãr^xJÝ©^RŸžRÕSêó‹HêFµPæD¨Y6²lddddÙɲ“e'ËN–ƒ,Y²œd9Ér’å"ËE–‹,Yn²Üd¹Å2w&J-–¹7ê"–¹;Qj±Ìý‰PW±ÌŠR“e#ËF–,ƒ,ƒ,ƒ,ƒ,;Yv²ìi9Ï æc|A= ÕAõ”zT7ªÕ[êU©îT“å&ËM–[,së¢Ôb™›¥Ëܾ(µXæF¨«XæF©É²‘e#ËF–,ƒ,ƒ,ƒ,;Yv²ìd9Èrå ËA–“,'YN²\d¹Èr‘å&ËM–›,·XÆ!–qˆebE,£ˆe±Œ*–QÅ2ªXF%ËF–,YYYæöÅ£íÕ/â_æPùüÖÿ<‹¦uó¶ö:ÊQ/&¼«?N•Ï?ÍõTùüñÉPùù­¿ùî‡|ýÝÇ·ÿîÝ|z÷þÍã^Æ“k¶~Ü_þð.>>Àò}+Qö^u˲óÇuµwßóqÙã(®S½¤>\KTO©Ï×R7ªÕ[êI–“,'Y.²\d¹Èr“å&ËM–[,ë!–õËzˆe-bY‹XÖ"–µŠe­bY«XÖJ–,Y6² ² ² ²ìdÙɲ§å>J©íKê-õ¨Twª—Ô³PTO©×Au£š,Yn²Üd¹Å²bÙ±l‡X¶"–­ˆe+bÙŠX¶*–­Še«dÙȲ‘e#Ë Ë Ë Ë ËN–,;Y²d9Èr’å$ËI–“,Y.²\d¹Ér“åË8Ä2±ŒC,ãË(bE,£ˆeT±Œ*–Qɲ‘e#ËF–,ƒ,ƒ,{¹ç¥Ø.ë¿8‰ºomã8b\ŒÖþeó¶¢>Ï–]íòlÕÏÇvï^¿ýñõ7yãËaÜì·#÷–®˜ëžg‰ûV>¨¹nc—L·,Ë×Ю’›E×ã²—Ÿå| í—Ç â|í—Ç!ñ„¸äËg¡nTª·ÔEKÇR²T‘,U(K%ËF–,Y6² ² ² ²ìdÙɲ“å ËA–ƒ,YN²œd9Ér‘å"ËE–›,7Yn²Üb™ãq©Å2ÇãP±Ìñ¸Ôb™ãq©Å2ÇãR“e#ËF–,ƒ,ƒ,ƒ,;Yv²Ì—Ï®z”º/.†¯ÆãPçËg¡îT/©óå³PÕSê|ù,Ôj²\d¹Ér“åËK-–9‡ºˆeŽÇ¥ËC]Å2ÇãR“e#ËF–,ƒ,ƒ,ƒ,ƒ,;Yv²ìd9Èrå ËI–“,'YN²\d¹Èr‘å&ËM–[,ãË8Ä2±ŒC,£ˆe±Œ"–QÅ2ªXF%ËF–,Y6² ² ²Ì}­å¬Ë¬2¾ÈóZ¨—‹÷òo­»̹×:.Ö­ñ"?^×ÙŸ7ãöüèí6^}õWß|óôãŸü_ÿðöý»¾{9o·Ö÷ù e<>à'«_.·•'BŒ²ì¼Ä>¿Ôv>z\ö0 o‰7Äçå5Ä]âq9/®¥ª§ÔEKÆóËj,U$KÊRɲ‘e#ËF–A–A–A–A–,;Yv²d9Èrå$ËI–“,'Y.²\d¹Èr“å&Ë-–y&±Ôb™gK-–y&±Ôb™gC]Å2Ï$–š,Y6²ldÙÈ2È2È2Ȳ“e'ËN–ƒ,Y²d9Ér’å$ËE–‹,Yn²Üd¹Ér‹ežI,µXæ™ÄP±Ì3‰¥Ë<“Xj±Ì3‰¥&ËF–,YYYYv²ìdÙɲ“å ËA–ƒ,'YN²œdIŸF#ŸF3ŸFCŸFSŸFcŸFsŸ ¹OÐÜ'hî4÷ šûÍ}‚æ>AsŸ ¹OÐÜ'hî4÷ šûÍ}‚æ>AsŸû˜=ocu^`É(ù~~Ä8ÿíhcÚº7~Ü?æíè#ÏE¦eó¸Õö^åbÙËÏñl‰7Ä«JÜ%^ï"qH/¾a<ÖêAõ–:*Õê%u/TÕSêA–ƒ,Y²œd9Ér’å"ËE–‹,7Yn²Üd¹Å2÷ÍK-–¹oê"–¹o^j±Ì}óR‹eî›—š,Y6²lddddÙɲ“eÿpísÄú’zK=*Õê%õ,TÕSêuPݨ&ËE–›,7Yn±Ì}óR‹eºˆeî›—Z,sß<ÔU,sß¼ÔdÙȲ‘e#Ë Ë Ë Ë ËN–,;Y²d9Èr’å$ËI–“,Y.²\d¹Ér“åË8Ä2±ŒC,ãË(bE,£ˆeT±Œ*–Qɲ‘e#ËF–,ƒ,ƒ,Ïkûy~bJ‰)íçþ~¾Ë ­Ë}óó8v½øè®&úûå©ÑõÓû?üðîÍÿóú~¶Ìý††%ohøúíï?¾ñqCýóÛ×ûéï÷Øû¼œ|GW_ŒzÖØÇÑš¬:¿Ñ—U÷^c<.{â ª·Ôç7z©;ÕKêó½ÔAõ„:÷pJ-–¹‡Sj±Ì=œR‹eîᄺŠeîᔚ,Y6²ldÙÈ2È2È2Ȳ“e'Ëž–眶ëÔã ºQ=¨ÞRÏJu§zI½ ÕA5Yn²Üd¹Ér‹eîá”Z,s'ÔE,s§Ôb™{8¥ËÜÃ)5Y6²ldÙÈ2È2È2Ȳ“e'ËN–,Y²d9Ér’å$ËE–‹,Y.²Üd¹Ér‹eîá”Z,s'ÔE,s§Ôb™{8¡®b™{8¥&ËF–,YYYYæ¡—eG‹‹úÇ9ñé5í2+y>J¸íåb–ó0ð‰u5üçÕüéÍwïÿýy{?¯¸Üö«¯~ûÃwO?~|óÃèçùøñéÝÃý¿bßfŸ{÷Q.ÞÁÇÅ/×åϺ9Ïtw[7n}÷½ÛëFy»Èó~)’wËåyËÉÃòIùùÓòf¹©.SݦºMu“jÞãžrRÍ»ÜK^H5ïsO9©æî%¯¤š÷º§ÜT›©6Sm¦¦¦¦¦ÚMµ›jÞOeŸ?¡Ïà 꼟 ÔAõ”:ï§u£zP½¥Îû©@Ý©&ËM–›,·X¶C,ó¶÷R‹eÞöê"–yÛ{©Å2o{/µXæmï¡ndÙȲ‘e#Ë Ë Ë ËN–,;Y²d9Èrå$ËI–“,Y.²\d¹Ér“å&Ë-–yÛ{©Å2o{u˼í½Ôb™·½—Z,ó¶÷R“e#ËF–,ƒ,ƒ,ƒ,; ‰îgˆ–}£Ñè>kë(u^,[ëb4V^ž4úßÞüøþÍÛoïï£þyúõñÍŸ'cõÏS³‡ÉظÅù‰9Æ,ÿqñÅDm­ó=û¤u½ÝZ™çS¡2.Ö=NƆå›òQ-ï–/Êg±<,Ÿ”çÞ<ÉMu™ê2ÕmªÛT7©æ rRÍAšä…TsF9©æ MòJª9H£ÜT›©6Sm¦¦¦¦¦ÚMµ›j7ÕaªÃT‡©NS¦:Mušê2ÕeªËT·©nSݤšc5ÊI5k”“jŽÖ('Õ®I^I5Çk”›j3ÕfªÍT›©†©†©†©vSí¦ÚMu˜ê0ÕaªÃT§©NS¦ºLu™ê2ÕmªÛT·©nRÍÁ多£7É ©æðrRÍñ多8ÊMµ™j3Õfªaªaªaªý¸íyæ#çv_>dz¾«Ï|¾w­Ë‰\ß{õ«uk_ŒäêËc ?½—ÏxõÕoß|û‡÷S·óßÌ#_1sñ^û°jßúùÇ:Î￲ì|ŒÜÄÖâbÙÀãüsS¾)?ŸÆSÞ-_”ŸOã)Ë'åçÓxÊM5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºI5_-L9©æë…)'Õ|Å0多¯–¼’j¾j˜rSm¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT{ªŽóÚ鸺 zœ»–7ˇå›òY-ï–/ÊW±<,7ÕmªÛT·©nRÍ×SNªùŠbÉ ©ækŠ)'Õ|U1多¯+¦ÜT›©6Sm¦¦¦¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT—©nSݦºI5_pL9©æKŽ%/¤…T£jRJªQI5ª©6Sm¦ÚL5L5L5Lõ~™<.èè0Ƽ9—§ Ý_Ã ËæmGý0r~Xö0Ó­qŸÄ}^}ýþõû§ïŸÞ¾¿ÏuG¼úêŸ~x÷ó_~v ÝÏóÃÆËñÙYtãO¢ËÐ×Ìð¾x÷?¯½zz[rQ•Uy:VÞÄfŽu±êêY.åÃòMyž%y·|Qž‡dI–Ï3ÿùw9Ïs²$o–Ë7åyV–äÝòEy—%yXnªÛT·©nSݤz?5KrR½Ÿ›y!ÕûÉY’“êýì,ÉIõ~z–ä¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©vS¦:Lu˜ê4ÕiªÓT—©.S]¦ºLu›ê6ÕMª÷cµ$'ÕûÁZR½­%9©Þׂ¼’êýx-ÉMµ™j3Õfªaªaªaªç³ƒç¿$»Ž/r–OrÇÇÑv‘U3OqßkWÚ>^ôÇ}ÃÆçѼ}ØU_}õ›×ï_|ëãó×ç·?¾¦ð|ã×xýöÛ§Ÿ;ŽÊ®Çó/ôÞÕÇÕëÆm”¼cZ—¿6hy¤Y¹Z÷’¦ä¯ $–ï3ï{÷Üö—óüµäÝòEyþÚ@ò°|Rž¿6¼Y>,7ÕaªÃT‡©NS¦:Mu™ê2ÕeªËT·©nSݤš¯,¥œTó•¥’RÍW–RNªùÊRÉ+©æ+K)7ÕfªÍT›©†©†©†©†©vSí¦š[RÏk‚rÌ«+œÇh±<,Ÿ”ÏÃòfù°|Sž[R%ï–›ê6Õmª›TÛAªùÊRÊI5_Y*y!Õ|e)多¯,¥œTó•¥’7Sm¦ÚLµ™j˜j˜j˜j7ÕnªÝT‡©S¦:Lušê4ÕiªËT—©.SݦºMu›ê&Õ|e)多¯,•¼j¾²”rRJªQI5*©F5ÕfªÍT›©†©†©†©æ+KG=Ž>ªLŸ7!ÅqÔ±mݼ­ã|z±ç¸X·ûÓûëÒ>¯þöOOïþôæéŸ_´çO‡ÈîhåbÑ/ß‹3Ÿ5ä~”]mÝÏ·7^åjÝËÏôÏ·7þÂzP½¥þùöÆ_Xwª—Ô?ßÞø ë zJ]Â,i–ƒ8ËAž¥h)$Z ‘–J¦¥j©¦z¿Óñù]ªÏ«ï#y³|X¾)¿ßíònù¢¼ËÃòIù0ÕaªÃT‡©NS¦:Mu™ê2ÕeªÛT·©nSݤZR­©ÖƒTk!ÕZHµR­•Tsû7å¤Z«©6Sm¦ÚL5L5L5Lµ›j7ÕþájéÈ_A|A¾)Õònù¢|ËÃòIù:,o–›ê2ÕmªÛT7©¶ƒTÛAªí ÕVHµRm…T[!ÕVIµURmÕT›©6Sm¦¦¦¦¦ÚMµ›j7ÕaªÃT‡©NS¦:Mušê2ÕeªËT·©nSݤ©ÆAªqj¤…T£jRJªQI5ª©6Sm¦ÚLµ™j˜j˜êùì`žŸžRb^ä¿ýøÓwï~ëë§Çc,ϯ´yþH>ÿÈãâ‘^ù°jÝÊMʺy[kÇìóbÝÕp27}^ýŸ¯ÿôæÛûmb^Ô»Þ"βF\,{Þzþ݇*Ï„É{Ûì:mݾÈmg½X÷0×ÈßKÞ-_”çïÀ%Ë'åù;pÉ›åÃòTí;çõ_’çïÀ%ï–/Êówà’‡å“òü¸äÍòa¹©S¦:Lušê4ÕiªËT—©.S]¦ºMu›ê&Õœ[SNª9·–¼jέ)'Õœ[K^I5çÖ”›j3ÕfªÍTÃTÃTÃTÃT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu™ê6Õmª›TsnM9©æÜšrR͹5多skÉ+©æÜšrSm¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©S¦:Lu˜ê4ÕiªÓT—©.S]¦ºMu›ê6ÕMªqj¤©F!Õ(¤…T£’jTRJªa³¥°ÙRØl)l¶6[ ›-…Í–î‡ä¹Ä ‘íý€]žoöm ó€x>]àqáå亼< øþøû×ï_ÿã›ïÞ¼ÿ×—³ä«þùnìëÖ÷¿åÖ×ùáìCö[Þì|¯2/^•%Ï_YI–OÊóWV’7ˇå›òü••ä¦ÚL5L5L5Lµ›j7ÕnªÝT‡©S¦:Mušê4ÕeªËT—©.SݦºMu“ê};´ä¤zß y!ÕûvhÉIõ¾òJª÷íÐ’›j3ÕfªÍTÃTÃTÃTÃT»©vSÍíÐóÈö¶/És;´äaù¤<·CKÞ,–oÊs;´äÝrSݦºMu“jŽ•)'ÕûvhÉIõ¾ZrR½o‡†¼’ê};´ä¦ÚLµ™j3ÕfªaªaªaªÝT»©vS¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu›ê6Õmª›TïÛ¡%'ÕûvhÈ ©Þ·CKNª÷íÐ’“ê};´ä¦ÚLµ™j3Õ0Õ0Õ0Õ~ÜVÍ[M”«ü—§ªÏû¡×Þ£Û8öy¬ÜöZG\,Üãb¬\_žPûõÓÛß¼ó§‹©òq›ûL]/Öý<í~ܧ½sJ¾òþ|¸nÝŽ¼?ߘËgË…ê zJ}þa¤nTª·ÔµRÝ©&ËF–,YYYYYv²ìdÙÉrå ËA–“,'YN²œd¹Èr‘å"ËM–›,·XæïL¥Ë<>Xj±ÌÊR‹e uË,¤&ËF–,Y6² ² ² ²ìdÙɲ§å8Îk‰ñ%ù8,o–Ë7å³ZÞ-_”¯byXnªÛT·©nSݤš§SNªyZ°ä…Tó´`ÊI5O ¦œTó´`ÊMµ™j3ÕfªaªaªaªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu™ê6Õmª›Tã Õ8H5RBªQH5 ©F!Õ¨¤•T£šj3ÕfªÍTÃTÃTÃTssó\Gé%húzßܼú^£5\øéúaážSèöòdáÿüÃw¿ÿ…½ÍíÖÏ'/{öq±îy8¾oûqš y³|X¾)Ïù€äÝrSݦºMu“j;H5Ü œTóÀ É ©æ”“j¸A9©æ’7Sm¦ÚLµ™j˜j˜j˜j7ÕnªÝT‡©S¦:Lušê4ÕiªËT—©.SݦºMu›ê&Õy€‡…ë¶V?æpYx>…>ÿ5<žÅ~Xø8"í–/ÊϧД‡å“òó)4åÍòaù¦¼›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºI5OŠ œTó¬ÊI5O‹ œTó¼É+©æ (7ÕfªÍT›©6S S S Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕeªÛT·©nSݤš‡GPNªyx„ä…TóðÊI5 œTóðÊMµ™j3ÕfªaªaªaªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu™ê6Õmª›TóðÊI5¼jA9©æá’Ûl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØlé>Q]õÃö^˜>OTË^³áºyÛ9ŠÝ½^,¼¨žÞ¿4P-9³ý»×ï^ÿôþéÝ#ȼñÞÞ{´¸x˜Oâaa»­~Æc5\8oçϽg+ Ç’‡åÍòaù¦ü|–Ky·|Q~>Ë¥<,7ÕaªÃT‡©S¦:Mušê2ÕeªËT·©nSݦºI5) œTóÉ ©æ!”“jR@9©æ!”›j3ÕfªÍTÃTÃTÃT»©vSí¦ÚMu˜ê0ÕaªÓT§©NS]¦ºLu™ê2ÕmªÛT7©æ!”“jR y!Õ<¤€rRÍC $¯¤š‡PnªÍT›©6S S S S Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:Mu™ê2ÕeªÛT·©nRÍC ('Õ<¤€rRÍC ('Õ<¤@òJªyHå¦j³¥°ÙRØl)l¶6[ ›-åÐs—~«ÛXð>ô<¯B}ØXðó©çý.¦ž9̸œzžÍëÕW¯ßþþã¿yýþõÇ·~ý‡×o¿}úøö×ï_¿úþéíû‡ùhÞ=2oxwò\¼Ãp5¬Øç'ðü’´uû6f;ו~±îjjAy·|Q^Šåaù¤¼–7ˇå¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©vS¦:Lu˜ê4ÕiªÓT—©.S]¦ºLu›ê6ÕMª9µ œTsj!y!ÕœZPNª9µ¼’jN-(7ÕfªÍT›©†©†©†©†©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2ÕmªÛT7©æÔ‚rRÍ©多S ÊI5§’WRÍ©å¦ÚLµ™j3Õfªaªaª½Üêù\k—ò¤;‡ý(Ç1«©Â¿±næ}…Î÷wõÿrd‘cË‘Å.¯¾úõëï¾{ýß=ýüöŸ§/‡ùúÅ}þÛw%zxÄŸW?,ê·}œ‹FÞ3éËWíÛye¶woW«^ äñp”wËåù›YÉÃòIyþfVòfù°ÜT·©nSݤšÇÃQNªy<œä…Tóx8ÊI5‡“¼’jG¹©6Sm¦ÚL5L5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºIµ¤šÇÃQNªy<œä…Tóx8ÊI5‡£œTóx8É›©6Sm¦ÚL5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºMu“jG9©æñp’RÍãá('Õ<ŽrRÍãá(7ÕfªÍT›©†©†©†©ž?ޱã¨ñåC û¦žy®j»Èªy[ë\5ÏðqÕÕx,ƒø…ñXËùÛoŸÞÿôîíÓï?þÿëõw?==lÚÉ_:õ<Ìn_=æÇÕëæíÈ8z¥uý¸õ)Ÿ‡åÍòaù¦|U˻妺Mu›ê&ÕœÆQNª9£œTsG9©æ4NòJª9£ÜT›©6Sm¦ÚL5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºMu“jNã('ÕœÆI^H5§q”“jNã('ÕœÆQnªÍT›©6S S S SÍi\9΢5™7Ýçq±£\—¹óÙE‹r±n\}yþدz÷ãïîïcßæ«¯~óôÍw¯ß½~ÿ懷/Ç÷#qçú‹úøëÖm•r1‚ÖåØ÷˜ÙŽ‹uSûJ¾(ϱ¯äaù¤<{‘¼Y>,ß”S¦:Lušê4ÕiªËT—©.S]¦ºMu›ê&Õû–BÉIõ¾¥òBª÷-…’“ê}K!ä•Tï[ %7ÕfªÍT›©†©†©†©†©vSí¦š[ Ï ¦Òvý’<·J–OÊsK¡äÍòaù¦<·JÞ-7ÕmªÛT7©Þ·JNª÷-…’“ê}K¡ä¤zßRy%Õû–BÉMµ™j3ÕfªÍTÃTÃTÃT»©vSí¦:Lu˜ê0ÕaªÓT§©NS]¦ºLu™ê6ÕmªÛT7©Þ·JNª÷-…R½o)”œTï[ %'Õû–BÉMµ™j3ÕfªaªaªaªyTXŒ½=eZ÷<Č筈´î“ƒÂ×= 1óÑÛËãľþ×·ï_ÿËóid-ïÁð×ß]ÿ•7^Yë\™Ó‡GùdýËuãvœ×ãg¼lݾõ1ósõQ?Œ9ò÷%’wËåùûÉÃòIyþ¾Dòfù°ÜT›©6Sm¦¦¦¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT—©nSݦºIõ¾ñVrR½o½…¼ê}ó­ä¤zß~ y%Õû\ÉMµ™j3ÕfªaªaªaªaªÝT»©æ^Ü1Î⸺ä»cS–OÊs/®äÍòaù¦<÷âJÞ-7ÕmªÛT7©Þ÷âJNª÷½¸’“ê}/®ä¤zß‹ y%Õû^\ÉMµ™j3ÕfªÍTÃTÃTÃT»©vSí¦:Lu˜ê0ÕaªÓT§©NS]¦ºLu™ê6ÕmªÛT7©Þ÷âJNª÷½¸R½ïÅ•œTï{q%'Õû^\ÉMµ™j3Õfªaªaªaªy›ß±ŽRbÒÈö>Ç>æQΫ9\˜ƒìq”¸Zw¹7^ž1ùßÞ¼z÷ú»—cëüžÙãhG¿XtÿÎE7Ÿ×ÒeçÎ]×oëü“ǘë^~ªÏkj¨ÏKj©ƒê)u9/¨)o–Ë7åç5å$Z ‘–J¦¥jÞ`Zò–ª}ïvÄåÍòaù¦<ªåÝòEy/–‡å“òaªÃT‡©S¦:Mušê2ÕeªËT·©nSݦºI5oÕD9©æ­š$/¤š·j¢œTóVM”“jÞª‰rSm¦ÚLµ™j˜j˜j˜j7ÕnªýÃÕÒj_To©G¥ºS½¤ž…ê zJ½ªÕd¹Èr“å&Ë-–yo&©Å2ïÌu˼/“Ôb™we‚ºŠeÞ“Ij²ldÙȲ‘eeeee'ËN–,Y²d9Ér’å$ËI–‹,Y.²Üd¹Ér‹eb‡XÆ!–qˆe±Œ"–QÄ2ªXF˨dÙȲ‘e#ËF–A–A–çÕý<Ž£ÔZhTœãòóùM¶pÞö>?¾Z/Ö]ŽËûË3gûôOOïžÞ~óôãÿñ<—¯·úê«§÷ß\Kûè¹7=.ç“Å ÇíÈ#6fžyA ÷mûüŒ–q±ðqÈY-ï–¯3_瓱޾$ÏTJ–OÊó•’7ˇå›ò¼A¥äÝrS¦:Lu˜ê4ÕiªÓT§©.S]¦ºLu›ê6ÕMªõ Õzj=Hµ¤Z ©ÖBªµj­¤Z+©ÖjªÍT›©6Sm¦¦¦¦ÚMµ›jŸÏ×k^]ªžä…T[!ÕVH5_K9©¶Jªç?¥¼™j3ÕfªaªaªaªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu™ê6Õmª›Tã Õ8H5RBªQH5 ©F!Õ¨¤•T£šj3ÕfªÍTÃTÏg»œI´«iä/#öíü“ì=ûÕ¸îßXØëm÷ÌΫ§åhcÒñò àûMµ>À‘gcüËß=ýøãÅ¿ç×Õ\åü0ÇÕÃ||„‡ñb»Õuœmm¶nÜæýTyõþ§˜›òóƒònù¢ü¼ð <,Ÿ”ç°_òf¹©vS¦:Lu˜ê4ÕiªÓT—©.S]¦ºLu›ê6ÕMªyî多ç.H^H5Ï] œTóÜÉ+©æ¹ ”›j3ÕfªÍTÃTÃTÃTÃT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu™ê6Õmª›TóÜÊI5Ï] œTóÜÊI5Ï]¼’jž»@¹©6Sm¦ÚLµ™j˜j˜j˜j7ÕnªÝT‡©S¦:Lušê4ÕiªËT—©.SݦºMu›ê&Õ,ß”¯jy·ÜT·©nSݤšƒhÊI5Ñ”“j¢)'ÕDK^I5Ñ”›j3ÕfªÍT›©†©†©†©vSí¦ÚMu˜ê0ÕaªÃT§©NS¦ºLu™ê2ÕmªÛT·©nRƒTã Õ8H5 ©F!Õ(¤•T£’jTRjªÍT›©6S SÍßKÞÇÖó*ÿålN¢Û^G9.¯äÿ…9Šþù̇u¥”‹Iô~y’ï_}ûí»§o_¿ÞQÛóÝü§ŸÞ~óþÍo_Φï·þªG¾Ë}ñHàb¸ç>޶‹­Ë}Æã|9ÚX÷8­«–wËåçoÊÃòIùùã›òfù°ÜT§©NS¦ºLu™ê2ÕmªÛT·©nRÍãF)'Õ‹åaù¤|–7ËMu™ê6Õmª›TóôQÊI5Ï•¼jž@J9©æ¤’WRÍSH)7ÕfªÍT›©†©†©†©†©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2ÕmªÛT7©æñ¤”“jPJ9©æ¥”“jR*y%Õ<¦”rSm¦ÚLµ™j3Õ0ÕóÇÁq~á¬^hâuß”šÇóêŒÖ}öÂú‡u¥ŒÇQ`ž0ñyö·ïÿðôîþ>êm¼úêë}ûþõ¿||û¯¿{úþéíû‡©`Þ63Öqœ_ÊúqýÅüm϶÷>ª­ËqéùŸ¶/–=NÊ*Õê%õùsSê zJ}þДºQ=¨&ËE–‹,Yn²Üd¹Å2Ϩ”Z,ó„J©Å2ϧ”Z,ótJ¨«XæÙ”R“e#ËF–,YYYYv²ìdÙÉrå ËA–ƒ,'YN²œd¹Èr‘å"ËM–›,7Yn±Ì(¥Ë<ê"–yú¤Ôb™gOJ-–yò¤ÔdÙȲ‘e#Ë Ë Ë ËN–,;Yv²d9Èrå$ËI–“,Y.²\d¹Èr“å&Ë-–yÀ¤Ôb™ÇKB]Ä2—”Z,óhI¨«XæÁ’R“e#ËF–,ƒ,sî5ö‘w¦‘™ÎóÜ+öî…fA÷¹×ùÄó¾Eïq])óáéÄóWÐgÙo^¿}íÖ_}õWß|óôãßþúýë÷׃¯¼Ôúùsóð¨áaÝù…SÏ?ìØÝÖ­ÛÌWºG/ëæyB˜äaù¤,ß”ç a’wËMu˜ê0ÕaªÓT§©NS¦ºLu™ê2ÕmªÛT7©æH‘rRÍ¡"多cEÊI5‹’WRÍÑ"å¦ÚLµ™j3ÕfªaªaªaªÝT»©æ aã¼€Ús~Iž'„IÞ,–oÊó„0É»å‹ò¯§¥nTª·Ôyß Ê»åÄ™÷ ¢œ@ó¾A’W"ÍûQN¨yß É›©6Sm¦¦¦¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT—©nSݦºI5ïD9©æ}ƒ$/¤š÷ ¢œTó¾A’WRÍûQnªÍT›©6S S S S Sí¦ÚMµ§j<ß&ó òQ,Ë'åó°¼Y>,ß”¯jy·ÜT·©nSݤš÷ ¢œTó¾A”“jÞ7ˆrRÍûI^I5ïD¹©6Sm¦ÚLµ™j˜j˜j˜j7ÕnªÝT‡©S¦:Lušê4ÕiªËT—©.SݦºMu›ê&Õ8H5RƒT£jRBªQI5*©F%Õ¨¦ÚLµ™j3Õ0ÕóÇÁXõÃ~dKßïÔÖ^»[øÉ}ƒ×]æûË3E¿þéÿ×OOïþõå„zœÓqeµ‹EÏÓqñ1=ÿ²ïù†².·\Çù=`Íz±îbj-õ–:§Ö”wËåçwÊÃòIùù…r2Í©5å©ç¿n­Iž÷¼’¼[¾(byX>)ï‡åÍòa¹©S¦:Lušê4ÕiªËT—©.S]¦ºMu›ê&ÕœZSNª9µ–¼jN­)'ÕœZK^I5§Ö”›j3ÕfªÍTÃTÃTÃTÃT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu™ê6Õmª›TsjM9©æÔšrRÍ©5多SkÉ+©æÔšrSm¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©S¦:Lu˜ê4ÕiªÓT—©.S]¦ºMu›ê6ÕMªqj¤©F!Õ(¤…T£’jTRJªa³¥°ÙRØl)l¶6[ºßí~OrÏË&ØÞ§ÖkÇ<[ZøéÔúaÝõÔz¼<øïsd}?ªcÜö«¯¾þãÓ7oþéÍ7¯óv÷ƒÂ’ç}”ôñA.&†c{÷ËàßX7n%Gç±®Ö=Ž7åçO{Ê»å‹òó§=åaù¤üüiOy³ÜT‡©NS¦:Mu™ê2ÕeªÛT·©nSݤZR­©ÖƒTk!ÕZHµR­•Tk%ÕZIµVSm¦ÚLµ™j˜j˜j˜j7ÕnªÝT»©S¦:Lušê4ÕiªËT—©.S]¦ºMu›ê&Õvj;Hµ¤Ú ©¶Bª­j+¤Ú*©¶Jª­šj3ÕfªÍTÃTÃTÃTÃT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu™ê6Õmª›Tã Õ8H5RƒT£jRBªQI5*©F5ÕfªÍTm¶6[ ›-Ýà­GÎò¶ Èî'Qäý¶ŽÚh]ûþ°÷a]©åbr8_žÓ{?ˆâù´‹ãÖ^}õ×ÿòÇwO?þx17<¿ GžG\ûÅÃ|òóÆó³8óÞiKæâr~bj¹Xø0Œ8¯S>î7þËùyByX>)?¯S(o–Ë7åç—!åÝrS¦:Lu˜ê4ÕiªÓT§©.S]¦ºLu›ê6ÕMªy .多êRNªy .多êJ^I5Ô¥ÜT›©6Sm¦ÚL5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºMu“j¨K9©æº’RÍu)'Õ,ß”çk%ï–›ê0ÕaªÃT§©NS¦:Mu™ê2ÕeªÛT·©nRÍ ,多XÊI5'°”“jN`%¯¤šXÊMµ™j3ÕfªÍTÃTÃTÃT»©vSÍמ×Ïׇ9Ï×JÞ,–oÊgµ¼[¾(Ï×J–›ê6ÕmªÛT7©æ–rRÍ ¬ä…TsK9©æ–rRÍ ,å¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©vS¦:Lu˜ê4ÕiªÓT—©.S]¦ºLu›ê6ÕMª9¥œTs+y!Õ(¤…T£jTRJªQMµ™j3Õfªaªç³ƒ…ãÉûðµŒÜ*¹mág›H–Z‡¯ýxy¶êýáÍÛ§ß?¿—‘÷L»º½YNãÈ;4´vñŸ¬~XØn{DÞÙ!páét>9Ž}õQ?SË›åÃòMyþÛ'y·|QžÿöI–›j˜j˜j˜j˜j7ÕnªÝT‡©S¦:Mušê4ÕiªËT—©.SݦºMu“ê}²+9©Þ'»’“ê}²+9©Þ'»WR½Ov%7ÕfªÍT›©6S S S Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕeªÛT·©nSݤzŸìJNª÷É.ä…Tï“]ÉIõ>Ù•œTï“]ÉMµ™j3ÕfªaªaªaªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu™ê6Õmª›Tï“]ÉI5l¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–î“ÝöáZ2ȼ.ºc¯}[xïö½Ïo  K‹ñîùD6ïuU江³¯Ÿ¾{úæâ(ÑÕoõ|Ê~”Z/V=yúø1­u~Žç[i}ùªó;KžâzÔˆ‹U/?Óç7©—Ôåü¾ByX>)?¿¯PÞ,–oÊ+™æÌšrSm¦ÚLµ™j˜j˜j˜j˜j7ÕnªÝT‡©S¦:Mušê4ÕiªËT—©.SݦºMu“jά)'ÕœYSNª9³¦œTsf-y%ÕœYSnªÍT›©6Sm¦¦¦¦ÚMµ›j7ÕaªÃT‡©S¦:Mušê2ÕeªËT·©nSݦºI5gÖ”“jά%/¤š3kÊI5gÖ”“jά)7ÕfªÍT›©†©†©†©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2Õeª6Yj6Zj6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØlé~C¬y~%CÞçÛaïæ¼Ê•e÷›aïmW\©ãb^}>ü<û»w?üß×ë}+åü££\,{£ïÛº>ÏcÝgÖ¶nÜÎ+¶½÷ëÆÐ[êr^9RÞ-_”ŸWŽ”‡å“òóÊ‘òf9¡æíÖ$o¦ÚLµ™j˜j˜j˜j7ÕnªÝT»©S¦:Lušê4ÕiªËT—©.S]¦ºMu›ê&Õzj=Hµ¤Z ©ÖBªµj-¤Z+©ÖJªµšj3ÕfªÍTÃTÃTÃTÃT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu™ê6Õmª›TÛAªí Õvj;HµRm…T[!ÕVIµURmÕT›©6Sm¦ÚL5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦj£¥f³¥°ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–îcè3^snÁ>o^GÉû–ÑÂû(:ïwV/Ö]O¢óègÙ¯øþ?½>ãù&n¿þở¾ûãÅ”°~ØK}ñ0¿x¸Ž}ì}~åØºq+¹oýüép±îqn¸)ÏçIÞ-_”Ÿ?ê)Ë'åçzÊ›å¦:Lušê4ÕiªËT—©.SݦºMu›ê&Õzj=Hµ¤Z ©ÖBªµêùíØrR­•Tk5ÕfªÍT›©†©†©†©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2ÕeªÛT·©nRm©¶ƒTÛAª­j+¤Ú ©¶Bª­’j«¤Úª©6Sm¦ÚL5L5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºI5RƒTã Õ8H5 ©F!Õ(¤•T£’jTSm¦ÚLÕfKa³¥°ÙRœ?Žzä oË€ì~ îÚ{µÑºOÏÓ}\Wê¼æï®>ËþÏ×ß¿yûí‹ò¼ÄýxÚÂÃ’çµõ6Ï[h·ùÓÖÍ[ÌŸG’ë^~¢ó5XP7ªÕ[êÜFKy·|Qž/À’<,'ÑÜFK9™æ6ZÊMµ™j3ÕfªaªaªaªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu™ê6Õmª›Ts-多Ûh%/¤šÛh)'ÕÜF+y%ÕÜFK¹©6Sm¦ÚL5L5L5L5Lµ›j7Õ<ÜgžÿÆÆ_’çá>’‡å“ò<ÜGòfù°|Sž‡ûHÞ-7ÕmªÛT7©¶ƒTs-多Ûh%/¤šÛh)'ÕÜFK9©æ6ZÉ›©6Sm¦ÚL5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©nSݦºMu“j¤©ÆAªQH5 ©F!Õ¨¤•T£’jTSm¦ÚLµ™j˜jn£=?ùG´MÃàû6Ú±ŽR¦ȟŸèð°ðz ž/ˆø,û›w?üôÇ7o¿½ÏÝû­¿úêoÿøôîuñð°•öüi=ê:޾¯éã#<¬›·cÕ½Ï'-´.Ï€nsïSîbÝ㸮Y>,ß”çýÅ$ï–/Êóþb’‡å“òiªÓT§©NS]¦ºLu™ê6Õmª›Tï÷“œTï÷“œTï÷“œTï÷ƒ¼’êýþb’›j3ÕfªÍT›©†©†©†©vSí¦ÚMu˜ê0ÕaªÃT§©NS¦ºLu™ê2ÕmªÛT·©nR½ß_LrR½ß_ òBª÷û‹INª÷û‹INª÷û‹InªÍT›©6S S S Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:Mu™ê2ÕeªËT·©nSݤz¿¿˜ä¤z¿¿ä…Tï÷“œTï÷ƒ¼’êýþb’›j3ÕfªÍTm¶tßì?¿HþËGX9ÜëG?ŽX42û°Ùuïãb]©ëb¶7_êúWß~ûîéÛ×ǵžOîwîÁ9Û|X÷ó]Ï.^Ýžÿföså*ö[©çç{µ~±ðaú¯n…<_Ý*yX>)ÏW·JÞ,–ï3ÿyfû—ó|u«äÝòEy¾ºUò°|Rž¯n•¼Y>,7ÕaªÃT‡©NS¦:Mu™ê2ÕeªËT·©nSݤš»;)'ÕÜÝ)y!ÕÜÝI9©æîNÉ+©æîNÊMµ™j3ÕfªaªaªaªaªÝT»©öWKǬ_’byX>)Ÿ‡åÍòaù¦<_Ý*y·ÜT·©nSݤÚRÍÝ”“jîjîTsw'多»;%o¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©S¦:Lu˜ê4ÕiªÓT—©.S]¦ºMu›ê6ÕMª¹»“rRƒT£jRBªQI5*©F%Õ¨¦ÚLµ™j3Õ0ÕóÇÁêçÕøìWS·_ž{ÞO;8Ÿ,<Žeág»;^O€×ËÃT¿~zÿü.Zn ýåù¯DŽuG¿z”Oâbð:vìs寅ýv>»<ŽºÊÅÂÇì¢ü¼j¢<,Ÿ”ŸWM”7ˇå›òóª‰rS Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕeªÛT·©nSݤšçÍRNªyÞ¬ä…Tó¼YÊI5Ï›¥œTó¼YÊMµ™j3ÕfªaªaªaªÝT»©öT=>\ñ}A¾)Õònù¢|ËÃòIyÆ%y³ÜT—©nSݦºI5Ï›¥œTó¼YÉ ©æy³”“jž7+y%Õ}|ûõÛß|ã·OßüôîÇ7úäŸÿýOOïÞ<=Ìk÷ùñæÔ5ÏxxW_Ìv9?ç“Y—/î-³íÝ÷¼X÷8*h–Ë7åùÛ|É»å‹òüm¾äaù¤¼™j3ÕfªÍTÃTÃTÃT»©vSÍßæÏ8JÉó²ÿrž¿Í—¼Y>,ß”çoó%ï–/Êó·ù’‡å¦ºMu›ê6ÕMªùâ^ÊI5_Ü+y!Õ|q/多/TóŽ”›j3ÕfªÍTÃTÃTÃT»©vSí¦ÚMu˜ê0ÕaªÓT§©NS]¦ºLu™ê2ÕmªÛT7©æ‹{)'Õ|q¯ä…T󎔓j¾¸WòJªùâ^ÊMµ™j3ÕfªaªaªqµçÝbŠ<‹¾¿xÍãè£Òº^oëÃs.Ö]Ž!Æñò8À$üëýõÆ;Gý/|÷ô㯠ÎW¯®•ïmÇÅÃ||„‡uqk«G-¸nžï/o#4/–½üÜç^*©Õƒê-õù|UêNõ’ú|²*uPM–ƒ,Y²d9Ér’å$ËE–‹,Yn²Üd¹Ér‹eî™’Z,sÇÔE,s¿”ÔbY«Xæf)©Å2·JAÝȲ‘e#Ë Ë Ë ËN–,{Z–ó²i/Ê7å£ZÞ-_”ÏbyX>)_‡åÍrS]¦ºMu›ê&ÕÜ!E9©æ)É ©æ)ÊI5wHI^I5wHQnªÍT›©6S S S S Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:Mu™ê2ÕeªÛT·©nRÍR”“jTs‡多;¤$¯¤š;¤(7ÕfªÍT›©6S S~;/Ý÷šÇUþ‹#¸û©ÑöÚÕÖ}zHáãºR÷Å`²¾<ËðoßýþéÝÅ=¹ãvärżXô|W”r‹«{kÏÒΧ0kÓºó;QËwênë^~ªÏoDRO©Ëù}ˆòfù°|S~~¢¼[¾(¯dzŸ`KnªÍT›©6Sm¦¦¦¦ÚMµ›j7ÕaªÃT‡©S¦:Mušê2ÕeªËT·©nSݦºI5'Ú”“jδ%/¤šSmÊI5çÚ”“jN¶)7ÕfªÍT›©†©†©†©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2ÕeªÛT·©nRÍ7多3nÉ ©æŒ›rRÍ·ä•TsÆM¹©6Sm¦ÚL5L5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©Úd©Ùh©Ùl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙÒý6Ûc¥F§ùîý6Ûyê>Š-¼Ä8c׫ñuiÇÅ”»½<¯ñëïÞ|ó8äÎï‚-Olq±æùcj‡Cžß÷ÌãëÕûúåuçeò(3×Õ‹u/?×çU²Ô[êóYêNõ’:oiDyX>)?¯)'ÐRH´"-•LK%ÔRMµ™j3ÕfªaªaªaªaªÝT»©vS¦:Lu˜ê4ÕiªÓT§©.S]¦ºLu›ê6ÕMªyÖ多g]PNªyÖ多g]H^I5Ϻ ÜT›©6Sm¦ÚL5L5L5Lµ›j7Õžªë(%w}üå|–7ˇå›òY-ï–/ÊW±<,7ÕmªÛT·©nRͳ.('Õ<ëBòBªyÖ多g]PNªyÖå¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©vS¦:Lu˜ê4ÕiªÓT—©.S]¦ºLu›ê6ÕMªqj¤©F!Õ(¤…T£jTRJªQMµ™j3Õfªaª9?/kï(6r¾ÏÏûʸØÂÏæç K+ÏH^xyØæo^¿}߈^oëÕW¿þÃë·ß>}|ûë÷¯ß?}ÿôöýÃA™y‚âq¾óš[Ûõã#<¬›·~þp;Ú°uçóÌó¹Îùç«?Åã±Y>,ß”ŸÏ3)ï–/ÊÏç™”‡å“òaªÃT‡©S¦:Mušê2ÕeªËT·©nSݦºI5wùRNª¹ËWòBª¹Ë—rRÍ]¾”“jîò¥ÜT›©6Sm¦¦¦¦ÚMµ›jOÕvœ?õ¿¨ÞRJu§zI= ÕAõ”zT7ªÉr‘å&ËM–[,s[¯Ôb™›z¡.b™[z¥ËÜÐ uËÜÎ+5Y6²ldÙÈ2È2È2È2Ȳ“e'ËN–ƒ,Y²œd9Ér’å$ËE–‹,Yn²Üd¹Å2wíJ-–¹gWj±Ì»R‹eî×…ºŠeîÖ•š,Y6²ldÙÈ2ÈòünŸc·c¶*ó³ûQ{îÕ×Õ…û/¯ËŸç…ùŽuõáýyÈø×¿ûÕߟÿý÷Êiú endstream endobj 725 0 obj [ 724 0 R 726 0 R 728 0 R 729 0 R 731 0 R 732 0 R 734 0 R 735 0 R 737 0 R 738 0 R 739 0 R 740 0 R 742 0 R 743 0 R 745 0 R 746 0 R 748 0 R 749 0 R 751 0 R 752 0 R 754 0 R 755 0 R 757 0 R 758 0 R 759 0 R 760 0 R 762 0 R 763 0 R 765 0 R 766 0 R 768 0 R 769 0 R 771 0 R 772 0 R 774 0 R 775 0 R 777 0 R 778 0 R 780 0 R 781 0 R 783 0 R 784 0 R 786 0 R 787 0 R 789 0 R 790 0 R 792 0 R 793 0 R 795 0 R 796 0 R 798 0 R 799 0 R 801 0 R 802 0 R 804 0 R 805 0 R 807 0 R 808 0 R 810 0 R 811 0 R 813 0 R 814 0 R 816 0 R 817 0 R 819 0 R 820 0 R 822 0 R 823 0 R 825 0 R 826 0 R 828 0 R 829 0 R 831 0 R 832 0 R 834 0 R 835 0 R 837 0 R 838 0 R 840 0 R 841 0 R 843 0 R 844 0 R 846 0 R 847 0 R 849 0 R 850 0 R 852 0 R 853 0 R 855 0 R 856 0 R 858 0 R 859 0 R 861 0 R 862 0 R 864 0 R 865 0 R 867 0 R 868 0 R 870 0 R 871 0 R 873 0 R 874 0 R 876 0 R 877 0 R 879 0 R 880 0 R 882 0 R 883 0 R ] endobj 722 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 725 0 R /Contents 884 0 R >> endobj 885 0 obj 19578 endobj 887 0 obj << /Length 888 0 R /Filter /FlateDecode >> stream xœÍkoÜÆñ»~Å~” ‰áûá:ÎÒ9VbËtHþ@ñötl¤Lòd èïìÎìƒsŒ¢HÛ4ÐÌpwÞ;;³—ÏGsáŸ3ñ'É|VTGŸ‰æ±ÄgAL¤(f^âÄnÊ*FH¥l'@±„À@Ri5"[öñ¨>rÙOG·Ÿ`Ñš¹Nľ¹æÈææèWÅN§Y–‘®¾ã¥©81EÅ~¸¬|vÑÈÕJ{ÁÈýŸkokxþÿF.{8z½:úáMÄ<—­6&„Ÿ=×u½ a©ø™øŸÏV»=¾Èûœ-Š‚wËë5;ßæõ?ùÄV?-Wd¨ä"Sɇÿ'ŽÌ§Á‡(t‡_¬\ÓtC…C'@P?‹Ä§…—þŠ Œ¤»ðïA÷+kó8XÒo¦ðÃqIÄFÏuÒAD¼À·Ü?̲?Ùk“@ ÙÚžll;É®—k¾ã=g'ÀÛeÇ]Ÿ÷¼âuÿBSxÞ[¾~¥/^ü¨À‹å»åj©°7×Þ+øeŸ·¼WhŸßï¸æp;7 ú¤9MÛò]Þ—MÞ¶¬ðÝ‘u^ÿOì–}|»¼^²—¨6+šz] ð¹ÌDÙe¡ï¸.Ô¹4MèÐi¯¤ì¸m¾t6rú+-sYmÕˆV‚ð²1QšMâåeúI–I2Uòå}Óìx.؆àã§|·çã_[(Âøƒ¦aêD±<ýt*@Ù¸Íû±ê\È‚\Y¾iZõ%׆ƒã&¡‹Â‘éÒ³Pd:Hâ¢\Køå¡…¶‰$õTkÛ=?=°4œß„Çbý__7½AºG^”›’¯-…òÝî°v£o;Êâ×ò‰×㼞¹®gèu˾ÀÙrYkp“ý©Æró¡¬weQöšpà|e¾w|ä-¤D%óƒ>>¨= ƒU‘&"xðLøpYÆaš¥qêOíÒ%‰²ã¿hˆª"¦ÀÞ|¸^^þteQ~Yþnaº®oó²î;‹Š§[!B‚-P¤O7Ð@VL…¶|Õ*iaÝþþÓ1ÏSÛ Ì„Ùí³6MÝæ#· m<Šö6â!Íû2ßiTHìîTzL.ÚéȦm*kYÓÎʇôMyP-•þèPp[ †)Ñçåcäæå@"í;z)ˆF^‚« óªv^@_².ëÖ72SuEg¶¯ÈG3©Á'®t" ðJ>\Ô Æ¿æp:8»ç;¸šÄitˆŒŒ UùײÚW ï{qõÍn_ÕlÁ„ÅdÚ_u“ê:Yèy‰è³ÄB¨©¬}85(ÎÑ_À„&ÐWyŽïŠ9Œaè-Ï<ÑÇ©“ࢊ…q6$íÉf´cCƺ­u"×ËboÜÝ’ŒÌqý‘ MRóèD¸^› Ó€+}€߯`éψñGr:™C‹ì¥²—kd¾ÇE°>ñI„‘J$¥ÎX¶ÒÆØ8>cíþP™±wˆ4vŽ5ˆ¤£Ž²ÑÉb8e~ æ\&ä=½¢6þœ½bÑô ¥14­¢+öâ¹½0M¬‡ÕÊY°Ùj Þ/þ~w¼¸;¡µw'êz˜`6ÐÑà 8¤ãªÝ×…¸˜nÔœ¤¶'Ó¡Â'jƾÚ~ýÛÕù]-^¿[ª­ñÌÖ¢ !Ηºä^IÆf¯ËŸõü¢âÇ®@/ŽmŠærÂb×4ޱ=ù½"ÎyÒj*”'Ø4R±=æÅ4ÜÉ%åZÅþ™p,UÓ‘F¡¶0¼÷ž54ÀÁtg,@j§ç:‹UqËÜP4VÊp­Ê1oaìù‡«ÕåÕoKvy±hõ;û»^Þ¬×+MšÊ ÓÐõ #;Y«(¸/®.@Âû÷—+0ãê;»<ÿå›Ci¥Ž~a6šJÏ ïõô䀈êËÃv–P ˆ~;±Ù÷†°)[q·i¼ì-ž}[><ð¶s iµ-­:‡ ©ãƒRªÞ=ìÞRD5¥jµ*ïøHKâ¯}*ù—îîÄRðr3 YâŽüJÍ:ÛEˆ¢}ëNdm}¯ œÐêÈ@M&"¦ï2´5ß”µÍ¹±9׺紴<µpÛ„AHb.îl†æ_ .SuÚ®©?òÕŠ’¶ûÉPoÄ¥Ú¢R“[ÃÆ aŒ Âü+/ö½ÅMd¨Å¯4rµ‘Ž&­,y V¾ßÎø@ðÁ¢ø‘¸Y‚Û¥,Â@Êr¢P*+S7fሞƒÇ?ôg6©±MÍ_íˆ'õăr:ÇF:=®ËÛܬExµGI0ÃQ™ªXñ¼VpÝPÈ·k5h*ª™8uåUƒîç½›ìÔl0oD‰z¡ù–_Bˆ/\ªY %{Æ ªö“ð…nköSŽÆñ`<bW›‰XKÊͯï ÜÃ8›·kMX‹_9¢Ód$`:¬Á5òþá°ãx:â¼ôÜØ~£"Ò¾^Ód/Q¨Ñu‡³œ!BñîÛfgj2ǯ¹µôÞÒ¶ìlQ÷yñOK¯%uËÒj>ÒÀ6‚î?úPà’ïûæ¬hªªœ§â¡«f=—oIàÄ>TÕξ}bTÏ<7“…»®±ÐnÿøØ´ô‚$¥bXóE’Á¨e²$³ƒFÊZ+[ª1slWˆDïDß%©´Õ ÊéÐŒi¦ÑÐCêVöå‘&©½0ƇöDןâ`³Ã«rÀ äÌZëÌep{ªUö–±¢×”jˆß[kMjÓ7Hm‹ïLfɬ§ÂLÊ^ãã)æÒ0Òë@#Šq68½¾#+JHÄFÏï9ª`±ÝF ìÎj*Íj_åɿާ|F’yÂ'žÓßM ï6£~fÎ?¹­f ÔŒ"2lF‘f5£HhlÎØŒžJÝÔg¼z”‘ÌÍŒ¸j £WÅ|c­³|NFÙûä-6uŽïsÜ,ñb} äx·ª>PJÅcÝ@,RŽ4«öÅ–U¼jÚgç£|$~QËÄ@™d£«ö’ñýâ³|‡¢urÝ óF³|Wly•×0¥±G©ëCL‡ù3 Cr";Ú=’p¦GxàhA@K4jF{›»áukVª¶x—,i}`þþôÌDZø8ˆ³$"¿þ ïs‘.©¹% V mÜTç\ªJ:J=Äé¡C"Žã(ï êK#Õ‡yÊÉ|¬…:å©>«ãèd-ér3³ÆTÇéÏ|?t VM(¶™U55Uq> endobj 888 0 obj 2787 endobj 890 0 obj << /Length 891 0 R /Filter /FlateDecode >> stream xœÍÙnÛHò]_QqàмÀÀ+cËdœ<ÐRKâE:$eÇÀ|üVwõÅCž<Ín¨ªØuWWW“ßg¸ø÷ ÿI2–»ÙwIó ñ!ˆ%)ŠÁKœØMaI£J¾°ò% U®&d ŸgÕÌ…³»o¸h®ÁÓÌ '17³ßPy;AœfY&mõ/M¹ŠÀ‰XîàäbçÃy-V+ë¹ ÷n½mQàùÿ¹°™ýk1;ùçÂbmJ€ÇÙs]× HÀÏø;¸{užw9œ-—¬m!¯Vð~›Wvô ÿžÍÒQ!E”’ÿGÔSïAºý'V­iº¡âÿÐ ˆ†ÇÐ#þ¨”é•¿ü#.ú=)Êb&KÄíŸT~8/ gô\'íeÄ +üý*û‡£6J$×}ØwT]k8‚7‰ãÁ«ëùÍâìz¡ñ‹óùÕâbñEŠVƒí[ë‚­Ž5)/K wù}É jÙ÷=«°¢ 3ö” ›ùo·ó«÷sM¨ïÿÖa,*£tkT¶Ë-ÛåFd#7Œ ß„¢a-ë « ´]Þtð˜—{Ö:#îÐsÒ€ïØ4 îÛ–A½F^Œ²vlǪô´@Á ªŸ*Ö´ÛâêòÕ®¨Š¶kò®xdðÐEÉ6ZÝɇ¼xÀ8å­×uƒ(”¬Z††Þ(Š7'?󗻜&©ä½º™cÆ/®Ÿ[L0á÷ߟ~h¤™Úmnü’$ H·PÕâ¬9Fï(ÕŠV›?±ÂáÀtAM "…éÞ%qsüž[ð²Þíl¼e8ãälÜDã Æ¿¶½´@,Ä÷Á˜û1ö¾4F—‚ ÿúóo1wTÌIS×Z SÆ‘‹†óØx²šzÓàOp¢ª8Ö7oå!Gˆh™r‰êÛ„R›’p£A1s(DnUÅo £üJ˜*Z¡‹­eŒÌÔÈÈA,¥ ËcÞ³%'uþÉžŸêfÕŽ£‹½¯£«ÛËKäKñ6¯Áfþ œÆ‚ÅÔ@ Œ'!k*‚É‚uÕ©G¢­IY§Î³²Ö ˜´1êP%T”øX­=¡ 둌ÐÐÛqÀ’l°ËÅiFŽ"V³ÂiÆQ˜°q̤=!”2 å†~o8dÄ¥ÔJT!Å´ =iNjÜæÆ›üg}iŒN‹ÛU¯¬Æñ̆·”õq~5¿>[ÌÏÕ£^¿4ÎG·xMñ³ 7Í{sî§ŽĨ:òÆ"Ì} …|l£kÙÁ†ãù®c7Ìâ0‹3æìöÔŒ »· Uã6aO[V,7 Š¼Dé%"Áx¾•Ųè¨áJN³…$…æÂ‘\k.µg ‰QUh«mÛ°4Šž‚|Üg"¼ôbRÌÛ¿ÏkäìòóÙ— ·`U?Ž!É$BÙ96yCžм(kœîÒUÛX¢-ý¡©±V†B lìfôݤfö&4€©/ P* õ‘s¬PœÚKý̺ñKŠx! aí G´'ñ¶7Gèmi[쨄„U› 9Í%ßîIÙã„Y?RˆUŒæœL¹Qís‹×x1õ‰È óË'F§ˆ4°%žÑ+jyX4ù³AåU61‡’„­ûƒ¦Ð>r,z$æ,‘°z%>¥›Ç–rëɾåó¡FË¢ÃP”íñôjºÇ=÷X,óøx·c ˆÊ•é• ŸÙjÑÔïGÔ¼RáoÑ+œ“qá‹úrfiø>,sljìGŽuÃàž•õ“~9ƒâ„”qbc7œlÛàz˜’˜jF„ÉZ%ÄN­¢Pj«µXOœ‚–[¶üÓ–“or^•¾¤LÈ¥™—wæ¯D ¦Z(a+† ¬±u×ÕKLÓ‹ÇÁ|ÚÖè­|ïT?ð ˆ)ƒu^”xYYcnžù%F0h:–+_h…òÿÑ5B endstream endobj 889 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 890 0 R >> endobj 891 0 obj 2494 endobj 893 0 obj << /Length 894 0 R /Filter /FlateDecode >> stream xœÍÙrÛÈñ_1o–\4Œûp)ª’-ÚÑ®#o$:.—¤’ˆqÐh­*Ùßžé¹pPÙ¼lâ£ÔݘéîékºGßg±áï+ö#J\’•³ï‚æÈ%^(HAHœÈ 혔D q“‚-ìl‰=N«Ù‘/³jf“³»X´&¶Ç™=bŽlngáAhyaœ$‰ÐÕµœ8f"<+ +Éë«Ò%—5_-µgŒìÿ¹ö¦Fžãþhd“íìíröú}@›,7:˜Û¶/"±å¹ ûã’eIîN.Ó.%YFÛ–¤Õš¼Û¥Õ–ž>åO³ÅR”sá¡ä¿ÈâñÔûøvÿ‹kŠ®©ðß·<¤År8ûT÷ŠŸìƒn.üyÔ<‚•±yè,n·?Søq¿Dl£c[qÏ#ŽçæïGÙŸlµ‘#™lÛJ|ljØÒ$r?ÍvÆKÙÄM¬ˆŸ‡4”l€ƒ& Çy Œbl@ÜÖªZí$¡3Ô˜ñq5K·Ï‹ËPV •‡²Müy$7Ûì•@A‘Š Ä =l”oÕøbÅÉ\E[Bâ^°Ù$dUÊ€ˆ³«ëÛÅÍ’\]/?‘%¹?¹˜¿½?%ÿ¸øøyq èý‰3wïOç÷'ÞüúóÇõrñþâóÇå<¼?…ů_’n×PJšúÊø;¯ZÚtt @W“.]”,1œ MœÐr¹*Žƒº—¯G‹ÜÀŠù"ˆ° ……¢Þœ\ÜÜ\|½{±«»óY]¬_< ³‰”ƒ-ßer}ÁvCNɫзrÒí¨píšÕU—Âù4%­4|u¹¸^^-¿šë‹CYÍ0ÿ‘ÝÔ¹0o‡|Ž.5˜iÛi |¢åEY=Ñ` A^â2ó”+:rShìÙЮÉé.ˇ˜#'‡6¯¶ K”¥E¡òC!,í yªˆ›C•u ¥¥(K4Ù_PçÐTí$sa0D¤G3 †n¯1 &Ë<°ŸÖìËŽV#£E.-°mÏÐhÈ2,_ŠVhÛ¥-i¥)ü¨Ò_iv@5‘ð˜w;…¤ úéòí;…ÜŽ8òBð—†î!“×ãE%ívõz®pSç-í>Њ6°gý3}j…»Ì##ÄþÀõ†h©,îV”Z8ĆŒ*RÕ©«â‰0ñ*ëd²­I‹¶†^æ‰|X\/n.–‹Kø\ĺ‘.I8Ô…'™ …Šåù“Fjk|C†–&,1#9bñU‡¦¤ÁÚŠî–vš$\+õ¨ 9¦¶eÝС~mOÁ¼5¿ëª6ÁŠÈ¸zÛñÀX{°ˆJØ2ç­$ó 3Ý0ð°„¥&óÜVšE¸¤%¬®¥¤„Sç¯XíB†ÖX<»ò\vy¸â&[2!X¤À†Ä»I „­Dë„Ú=ÍòÍ&1§<îòl'­¨ |?ª½»úP¨/+% K×–$,wêÛ&od™–ZIl]SÅšÅy_ñ%|w` qÀ*×kžáÞJ~ÓYÿ""M.Í &º Lq’×”^ #é1çõY`»ô‡Á ê¯qqñ!BÓlw|éó'2ðG†LeæÅ¢à xM7¹8 R㣮8ŠdY–F.n5lv HQYü_rº?9£¿î¼yÎïOeºÒ=Ö†0£ŽÅ*=&Zµp`š†~?ä˜d^d9ÊÀˆ@½nŒOµ†Ek‚J3DpTr!¾2ÄÈ8›kÍå‰Äò§!oçÕnÎÖØ]ÿÁUZR¬¦ˆ³T-ŠÇ‰Ù2õc+R¶žK¼õ‹#<Ö8TÕ×ÂíÇ[IÒ4#G´qÕÆ¡$èÖ†ã¼ñQ[:%uEµ|]Î8AÜ!…)w1Tø'IhØб}’a „.‰ÕfÛÚº¤3ƒdÅ@,Õ äf ÅÆØZ¤‡ÖX«CÎVªÙÈör®I"<SWé<ÉÆDÞ.ÞºYk›|»¥!µîs29|Èoi7žìaý/Ó'²oêùšò[V¹›[VA¹m!.ØgÙÈqɃtŒK.Œ¦^äéQíó~ ·¡nÔäÞh‡Ød sή:”+èàPð\VÁj<Àøž3PiJŸÜ`’¢„:Y}¨&&Dî Øµè˜o|ŽÃ^hõ-𴇱ûêõAùyñÕÀ ’ ƒ‘™-Iá,ÙˆJ,oÚž8]&dШÊh_Ik«‚k‡<çæ)ªõÑí“g›- fœ5ŒYÍ”ÝbB÷Ú>MLyû„í5R:Ñ3‰MXä&ª¼ZY·eKñU™R®FKö”ÉhO°F0lÖÇ‘OæÚñS‘WLßLiemÍj2{ó8êä, ó«LÄk=Vi8úEƒicx%ã^ìÄfì"boâ+ô6Ù·Þ×-{ø1™áX›Oý”&2,[Qô7bk %¯1e×ÕIú)ñž%wõÄô8ÎÀ|¢ë¨÷ìå†UÈMš-É7üY=.ýÈk¸…hË útÖ3Ýlày–úIÛž¸£ûµü™¶6|+bî:IôìÞ‰[<€[% ÛöcQ$Ç­ëT *ëÿEà²-Ëô¼ÿá7öŠð0¶a[Ï q”Œ„þüin_ȱjq›o+Ö£œ“£l@$ý~HÁâèº9ÿÚÀ±‡e§_šŒNìð GòÁþ¶0á³ )‹ˆ.í4Ò‹œá&:~ž}¿/âæ¼÷‹ñßË[, endstream endobj 892 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 893 0 R >> endobj 894 0 obj 2549 endobj 896 0 obj << /Length 897 0 R /Filter /FlateDecode >> stream xœÍYYsÜ6~Ÿ_Ño‘«d„@2¥¨J–'ŽR¶¼ñP›Ý•õÀŒ «xLHŽÇ®dÿ{²—ìÚV©¿ÐÍüÛÊÿ>¿â4€mµúMó|ˆ™fQ~L˜—@$4RL‘bŠ&CÉÕ³ØÁ/«zåÁ«ÕíNºP8®¼™p%f³ú•SFB–¤iªm ˆŸ$BEHÛ ¾½ªxÙÈÙÆz!ÈûŸ[ïZúÁÿE<®^d«o à{=Øqö=Ïóéø@VÁíÉ˼Ïáb»å]y}—»¼~äÏî ûiµÎ´£RŠL¥ÿÅDæÓh€FÞxÄɵo¹ø‘PñCЉ¡Ro¯þ- Ie¸Ôï'ãE9‹§›%ãöw*z_b±Ð÷H2Ú?¤NøÇYö7Gm¶‘B÷àO:õÇ›e×YÇ{xQ@8éóöÑeÑõçúî»ïú¬ävÞ>oym'.ˆ´ƒ·õ»]°mª*ÿJÿ%„ àNíƒã_àMl‹Ç]ÊÆÙtüžŸêéy×5¿‡¶9žƒpÍ«{þ±?äeù úO{5òòÀÜ·x4‹fA:‹HGx®)u¢m<Ò²ËCUCW|¾>‰‰1Ï cãÌaŸ÷ýG›á¤kí–Ÿ¨vH’gÊ8 ëaæÈ;ÍTNj0Õíù¶x(¶yo=^88˜^J"?+ã7r©Ðñ<Œƒ“Ü’"Õ,jœIr?*^÷±ÜlWt¹ô¡“–›‘ÚÒ7ÿxy‘­O-ãÍúÝ«µ£©vnÖ™]A—&X^ßLm´XFì©¹ŽØm^æ­ãv;Ë?ð'Q™§2ˆÌgGø]N1ß‚(R³/0ïe`ƒ+üÉCÛTa2öEýh¹%»¦ä•Áàfq•tütqHTk6µ¬m^,³ ¨ï‹Å=&¨åñÒî‡â¨œÑjQyÛæŸ– ¯ùqbz·SJ'1ÍvÊó•Ì«=FéW^â¦t»æØA/ó¡i+@ƒlîêíq²³RçìßËÕqLR†ÇŽ2}þ¯„cL¦ÔŽR›ÑüX|àÃR¾ðqô'aÔ)ˆ«bŠ­ÆÉ Kª)Ú¤”†Dz‚ÊËOÄ23eœvô w«:tjyh¸¿Û^~4£©ñ¢À±áÊ‘Ðï\ÌYu†gæÎã…÷œq¼¬-àmgÎ5ÿˆ0QKÕ.ˆ×¡½§½À£Ññ¼ÝîåL|<ÉÐCz$|?­]4¶ ÚÇšx1 X|D1v+Ý„ vxÀÖï¹ÖÅk‹œTAÄÒ1«,WP cÁC×I¨ç§ÌŸ6ŸZ#â‚2Ò1°Ìuq¦|˜ËbÕµJ[#1]2ìó†QÁ‚øÀ‘?²C1+P˜)Âû‘|MXìú4(t5}îL#îÚðEµSŸ5ËuÙéø“I`o dšFa¢rX2Ÿä ø(üòãúݰ³žÑR„ ªŽÒ…åïO.NáÅûg(åý‰ ×7¯_#úŒ<’@ÈcôIy—Zž."ÿ:…ÃïÞ¾-ø?8Œ“P3Øy~FÃ{ªóMû4s>D)·áRßó¶úÆ´´!ølÊ#ïa/†M¹’ö†c[SÌÚxÞ‡>Å‹ ž^ê‡z­ì>¯®³·f[XÆ„¦xHôªJjì¦nz!MIÂÐu?Ò¾Ÿ©ÅâA=§&Ÿ,uƒPôÐK$ìÀ™m%îó_Kn¥Ü.P›¼³rÆm›¶å¥¼YÌ62Œý‰7òÊ$ÖÒ0Ä;·«é›ÍÕõ+ŸI †¬Þ¼ÞŽ$¼½v—èzm9Cåv×X4£Ùóö ’pâÂÒeʽœzXa1e0Ýèh@©›£¹KNØ ×ݯ~šÄáHà`4ŒMRrÕœã[€m™c·t¾tÔ"ê–„iêEÉ4ßÄîÊõšÖb Ôi7N‰éš*ï·;Õ¨-ˆøãËꦟȚû€åbìƒV3Ÿ™D$¥4MÃÉÞHÆVc¤p‹Ô5¼¹È.\¿„L½B7r_Hêa½°Ž³$œ†7L|ñbœÕPû«‘>Íq"¨9z4’[xý6sqÄr²ñô™uEÝñ¶Ÿûåã¶`ŒÍ fâ8Ñgئ†&²jnÖï²Þ”y@Shx@ÓƒE¶I—ð 뱓Xï¾|ÁÜÂY󷭸И½¿ƒ^¼¾YoL.jͪ‹}BQš/²ÄB: SŒÂ$áp/‘ȼ)*¤c%é!$Ù¨Á¿ B¿ ,<ÇùÞÄò[øÌëãRŒ(¯ŽwðùÇD¿óiœNâÂ\“™c0sÌÕP…„¹oxlö„ÇtÅc xÌy¿t-> endobj 897 0 obj 1997 endobj 899 0 obj << /Length 900 0 R /Filter /FlateDecode >> stream xœÍksÛ6ò»~¾Å¹Qh_4ÇV¥‰ZJ3™ºsKÅ©D:$Ûÿþoð!Ù™ëô®ñîXì.ûômä# ÿ¾à’,@‹í蛢ù( P+R#?ñbœ¢-RH¥hö@>D¡ ªÑY£/£b„ÑÛÑ %Â^„îF¸Ç\²™~ƒÅ£Ø ã4Ë2%kàùiÊ—½€ÅO·:+Åh-=g„ÿçÒ»…~ð F7£×óÑñ›ùÍWÖ¸}Œ±&(õ ãÿh¾Eц¢“Å‚Õ5¢Å®iqÞÿ‰æïG“¹RTp®À‰'ü©õ!"¸ýÅñ5C·TøŸx¡¤Å "ЈÚ¨íUù FÂ\òï^ó(VÎäîf »ý“‹ïß—„Oô±—¶vÄcÇüm/û‡­ÖÛH¾ö~}pÏ»>ß.iÃÐs±ÒQUÞÕc”•†ò¢fU£±‚ݹãí ¦Ôp³6,¥¥Žßd]Yü8òœ€×'aO¬— ­n_Ò{5ôzÃ^iV=µ’y~F€U@z¬<-ÉÜ õqrùv¢‘º lYaÜÕÌhEÍ(¶(áôi¹@ÆRõ-[䫜-¥„޹Ü‘æú&½€ø2MàÅ¡Ïg%}/ÅÚœKè{ ì[±Š‹öñÁ+3q<‰úüÆV ± ^²†UÛ¼`Î絃¨­˜yíŒÚ ÷ZZ‚p*K·bKÏ’¦óÙá[Öu®ÔGJwoµÅæ¡·Oaà…!Ài(­ì¥ìH( bEyJ®w ÚÕ;ºÙ< ë²YëñU †³å¬SNæ# í®ï'üí0K‚rµª›Oà>¿€#¼ë$ oÖ ŸóÇ…Á‘X¾Á8´|‘£¶ˆÄY›´á$—Óµ9›wM/Â~ûÝçM³FBzk(’þABoq=–°füC%!ô¿áâ,ƒe‚Î:®L·-µ†òôÞ•¨Ex‚‰8CLÔvUEÒât×VÒ´6¬»?]é¦kIêǼDg(íÔyaÀCÂXýyz9á/ ó“×&¨AWGùMÏçèÓåôãÉåWôëäë-Y½¨ò[^‘£ßO.Oß\BY†±-¬Ü5B' ²d”qLö ÀõV… • JKÈV}WG'³Å_h±¦yõlh~Û쥀 ²ÉR |žMÏߢVÅé&.w-^YÚŠRT’º‚´•#ê +b?Q „Nf<Ð×WG÷ã˜tqŽlù³ z÷}&ЖbÎ$I-ÑÃé~mÎõ4›ÌŸ»ŠñÀ«jâwöX3æMa‹¹Úµ%RÐñ^¾~ŠÙUýzsyñ5 _úr‚è¢Ü€Ì˜æG-Ùµoî¿ÃRÄÇ{¶à¿³ ²ö 8蟧'³ùÕÑ/Ü,0‚{\ËFO²P˜v¶æùE²ä Mü\uü&„f¾Cx $V%ÏYNoŠªù…̘"jŽ7Ã'1ðRÌFuõòîá–U³ß>ˆ åo&õîö¶¬äÅ”¢”[f±ö`ë±%ڦͥ®v…½¾’$U´Jä=ýN-¥Àº\:cõÛ Ä (+—·^z¤#í¶¬[Ó ëÀ""w cÊŽ—P¸Ái–Å‘{ uà÷ ˜ˆŸ£©Ó³Éù|:ÿzut oN€EÄ‹ °@ÚÆPÒ4» LÍm±¡µ¾uò%¿UldlêãÅ®×$µÜ¸¡_p@‡&8³°õ?=xEŸƒ0–·¬}o'¢ø‡3CGgÓ“·ç³ùôtvàA#…Šø9âgjÿ&5/øú³ôr¶´$u7 `jÁM¾Í[ãØ}ýÁZ†¸Þ囿E^XŠÙ”ÇŠÆB‰£íôBâCl†-2ð´Ť3•n B/h“g½k&~ùS”ÕVÜÖ‰TP‚Äñ§ÙGT•»&/ ¼ã.Ö¼ÀàÎÑa·it§&ü“ßNëKàBu."ß$ýP¥P¿Çpœ@:ëK.÷çÆ Ê ’u¢OY:µsÍ:°UÀ…ÿ’*ÀY¦ª«y©V’ó«GËNÓ ÛW†ôÓO?X;šÚË:×}µÀíSŽ@ʼnîÿôW[Lõj°6~ îòâË¿O/>ŸÏ[?µýꄹ endstream endobj 898 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 899 0 R >> endobj 900 0 obj 3266 endobj 902 0 obj << /Length 903 0 R /Filter /FlateDecode >> stream xœÍUÝOÛ0Ï_q uÆIš/iš´ ÐñhrS·–;tì¯ß9qš4Y·=±•V¾;ßçïÎdzaÅ¿wêð ¢ÔxÖ2< lW‹L¸Ô‡4ã;>$Jq‡T*š´+©Ö®™Ü™AáÜxxB¥9PâÀÆ çµ›[ã w\b»~:W‹˜¾¯BØÄE"Jáè"µ`’WÚMöÊýçÙw3²Më?ȈÂÒ8 £3L ᢅ³I)5m|b[úX¦ðp0a’Áqq!€es8]±lÉŸ ¼4¦¡.´òR’…_Tó´sáŒéîMgÖ¶òVŠ¿1±kJˆå`Eê*ÑíÕ§ºhH§‚«>÷£]uŒûͪp{Ëàûûâ)C“§#Ø¥ü»Söƨ ©b﯇¦+\q8TËæ .éè,è©p8©cÌß‹8]'Ê…ït"Y±är˾°¤l/ÅšGñ"Ž˜ŒóìCo¤e9„øì±5¨“…&˜>>ôª¹VÄl–ð‘æó¢§^䥌3ÞSïk_ß…šZ³‚¥\ò‚Ôiwµé/!UËÒ†ƒoüu“óV°fÇ!žï {èòæúþëéõÝU¸4“hî"h¦9´oÃëpÑŠd7ß"ß´L”—™ìÜqYï3{Ýã&a¢cÈ¿ó¨”]C!™ä)Ï$iegîš¹¸ºÞ„£Vp÷yrNGøÇxk«ÕéÛz_N?Né2ôTóyC~šÞœoåÛĨÉU5UÝRº,Efe:ãEÃ勆B̶êl±à‘.Uñ5B=G»Õ+Iø§Øǯ¡›WUHœq’mã0›ËÉÉ)è†<<Žõ*Ÿ  –$cغýàE˜Vãgø<·R=‚:O…ÓÞ™· «Õ‚ƒ:pñ7CïýÆ^e,d^`Ýq ËføçPï©aßsr‘Á¢Äª±^¨ ƒp¤èòµÚb61B6Cßåzªó Äq³e– G¢†AÿØ?@ÈJ endstream endobj 901 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 902 0 R >> endobj 903 0 obj 784 endobj 905 0 obj << /Length 906 0 R /Filter /FlateDecode >> stream xœÍXK“Ô6¾Ï¯Ð!U k$¿Íì. !° •CÈAkkfœØÖ`Ù»™üútK²­-¹$áµêV«Ÿ>Im>­¡ðûdEHÊvõÉêÉB¥V•¤„eAJsÒ+äIN4<¢‰FZk­°#¿¬º%?¬~ý Œ*Bƒ„ܯ¨çܸy¿zÁ“4ˆÒ¼( ›k°<ÇQ lÉÓ—mH®¤¶ž²GGô?ÏÞÍ(báÿ"#ÌIï¹ÞõþdÞú£‰$¦Ç3-fý¢…¿qh‚0à8ÕØ°?qb&º2óó³•XWÎâS\u‰ÿfpJ¶«ï׫§/Â(Yo–S”áBFƒ<,ðWHÖ-ùõ‹òÇ¿‘õ«ÕõÚ#Ä¿Œš·‘›”)#½­-"!;ªM“ªHJ)KLa—;¾DOò€¼÷úâew'ÿ¹‘ãPwB™¢­§/VŸ8LY(ÃÄ:|ÑÃòµ•ªŸõNÁ/¹w¢‘ûVtù¡—ãÞ8ÖNé‰Ë< 2EÅÆå77â®Vµìž‘¸È3òYì–Eã §)î³uÉý¡¯·»<&˜ö£2zÿ„³F§: &å`–ߊ¾­FUµš‡Ûžwƒ³zó°ªÕÐ×·ã –Ù³´’å¨q˜÷õ°¸g™w‡eÜÀæð²ðkféIÍcWÁN>&QG‚Še ŨY’›p£®¾ŸÅ¦.E§D0+žWU™ðfVí]Œª^â, Ù`ò³qgÁ%ʤsãÖæPFiš[ž€| ú 6‚LdO&°`1¸aJ'Àg°Ä<&übz’²ë‚æŽ,}ÆÂg ýXG'²{— 8Ià ͢¢HŠÌ8ÁcXÛc4H’ %z{ ïÅ"lÆ®4µ,ó³|ßËRTcï:(yÓ¸!6½l ²éÇì´Ù&« ºjÜïe?¨sù–²ÛH`K·õÌâ Ìqb¹><÷ްç6Œ5“';M)+Ø\­0¼¯‚Euãäg4÷}= ¢[u÷5¾ÞmG¾u¦íÆÁ"cpöýZPxW:kÜâ!ÖÓ·ïò!ËÓÈ>⥀þöjaEcéÒ^rFþIVc#ÔÇÇ‹JíEYoêR†`ÑA¤5.DZQ;ãWüŽ/Ò‚‰p‚·ò¶—Ü™:ÅD+-&¦&ÀäÕÍÚǤÈO0ñK cäâËns{«=YTÛ¿U‹nßÃOÄ¢édw¡,³­­uQ@-‹€gNÀ¢˜P3’{jŒÆy¦Bã©Á^[HÉ|KùÒ¿' iËØCoD†­¼K£0gÐŒU¹-ŸEyû»(ÌŠ7¼5¼´K;ǯ؈^t¥;¿‘M#ï—PpfïàÞ±{0éÚV÷FÔ'Øzoš/%æcå'`o©x+ˆ-œt(”+ÈD¤ô=¶]Ä@L<¥‰«Lc`´ŸFÞ£A;-H%¢4( ‡fáÔx=Ÿs"pÜåd~t±ïàdbéÃ( 1ÃF®˜NÖÏ|ë8 XS¦Öúc&'fì!;ì‡,.ºêË›ëçëkòâÛËõËŸßø‘RØ“0¥,bùÙHžoîùA_3c”àD{Aîx3Z8¬fà·ð#çE±¬("–žìÙUN@'ÒJØôƒ>]øt¹áø–+?dÌXC¯F£ôlHß`ÕLVa{‚í#4<ƒÀöÓmB¡_ŒÏèÛ!ÁwüN`, C×·7?_^_}¸¹öB%! rü JXx.”o‡e²’¿D/ñZnÇf¨÷g’ÚgP%ò$ŽàËšYÂΆ>5ÃÈÿ”ª ¼4‰)KÙù`ž@jÛ~%?ƒhO€½ÓÓ~ùüõ9Ö&y°8Oszöêñí¾†µ)4-a”YJ³sÞ}»¯`m ÝHáó1¥tµtDðvÓ€MŸz8]蓬êm7?ùZc?°ô¸ÜAY%Týw]ª'ó„~“fŸBÉf<Šè:ÁÝ4SË´O¿šÖ´fâ‰eùØÕØ77‡Y¢4#Ç8Ì}ÃÔ5ÕæòÂëöÇù¯w«¿!Û” endstream endobj 904 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 905 0 R >> endobj 906 0 obj 1792 endobj 473 0 obj << /Type /Action /S /GoTo /D [907 0 R /XYZ 72.0 720.0 null] >> endobj 476 0 obj << /Type /Action /S /GoTo /D [907 0 R /XYZ 72.0 529.892 null] >> endobj 479 0 obj << /Type /Action /S /GoTo /D [907 0 R /XYZ 72.0 467.238 null] >> endobj 482 0 obj << /Type /Action /S /GoTo /D [907 0 R /XYZ 72.0 390.184 null] >> endobj 908 0 obj << /Type /Action /S /GoTo /D [904 0 R /XYZ 72.0 720.0 null] >> endobj 909 0 obj << /Type /Annot /Subtype /Link /Rect [ 242.81 531.392 340.86 540.392 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 911 0 obj << /Length 912 0 R /Filter /FlateDecode >> stream xœÍÙnä6ò½¿‚ÀV¨[ fè{²œ™Ýƒ<y`KìnmtôHj@>>EERG;Æb‘™ÀU%²n«Ø_W.¡ðߥø§ɪÕWEsIì?R¤0"nìD4!QH&¤ G X¢@_RÕjDäçU½¢äûÕ/¿Â¢œP'$+:cŽlîW?ð0rü(IÓTéê9n’¾UäÛ›Ê#W\=h/Ñ¿]{[#ßõþQ²_½ß¬¾ý—’ÍΤ€ï:>7§ALÇ÷9±©È/oXGX“+Ö³-ë8ù¼ý/Ïúî›_Éæ‡ÕõF™+yÉ„òà_ìȬ}:þbeœ¦*ü8>Ò€âx!Ø%>•*Èê¯ø0€¡tþ=ë$ÅÊÚ< ™ôÞ_)ü|tb(N2ŠJZ¾'Ú_ì²Y…lm ¨ŒQ‡7SÀ.iË]sꋚ«lZp%>¤F ûãñò ¹Œ|' oXË rêx{™ó,É uwª³¾hjkWÓøØ6ÏO-ïCÜ,¶5«F"ëÜÉöÖÒf÷¢ÜÑV#øŒ9y±Ûñ–×½ƒ>²<¤Ï|üòéÃææó'±;Åî¢303`‹.4„þÀzƒe¬6ÈÖZÖr©K†žU"¬µ«Ÿ-¦ÏGnÉG· Üõ¬çX…þFâî>¸¾úrwýÖæ¸È8β«©Ëg61òa}{K´¢s÷'ž“&¥®HsÁò"*3Òñ#ka'isÙYÆÉN)Þ͹¹4pb*qÈî=Ï$³°$õxp ÂýÁúplº®ØeÑ?/¯nx[6,/êý…¡r– fù Ê‹ˆ؃õ©jZnëb¯llÂ|Ç ›ÃäÛ+Œ›éUtsç¹ÑÄyŠ…¸V!Û”$ÄvxðaeiÁM˜ÞH{`mÁ O/ i{ê 28q´Ú¬³„p(xÑ´ày~긞 ÷1õìêŽ<+vEf8 7ž-Ÿ^8Ô¥”¦q¼ÀÍ2J×ËQmSóø×ò¢#£”mxÏcæ%/Øæ¥£¢‹(–„U€éd£âÂÆþzÖ×nà:A¦©…¯Ö笯Ý4r‚|Åî7ÃE,D¶¶(ÓïOL¶\Žyåâ®±êêehŸEè‹ÎÚZô¼pº:±…A½ÙãýêCcVBh\]©ÆÉ-.½Ð„ªÉõ;“!Îü‘cø$AuVADXÚì”9di®¡–Õ{Ãë=¤Ý9‹§cüØ3ªe åÎþ€SbÇS í?ÞH±s)ÝéxlÚÞÚ5 jˆ±<—!d¥µgtW*"—õÊ¥µy¤/qåïmm¹¥,x˜·}Á-UÐ'ŠÿSÑA-ÚÏ]âE—¨„P‰ðRuñ·µ0‰CU_>4U {]ª|Ip?‰Ç™·è ¡¨&qœê™;)ß—WçÀRS†óÇ ˆµ µö«^GaʵˆŒt$éQ•]K¿8†Š>Ÿšó.k‹­-YL²Ýò]cïPA5[’Lü%uqZÅd l*¹xînÑ,„^LiBÕˆ]ä Gœàöl‡Û CóBî¾wY­1øhÎ#]àI“&vÒ¼5ûÞ‘ï¾ûyÛò=”º–Ø~'os^U!*ùäƒ8“%œÛÏß$D/3h힯Nb'·Ð8q•zËb¥¢ysÚBËòõÔôüy ‡´e™è1:þõ$ºÚw“53y!…áÀ°@yKÖKiªF1s¾¾ë¸‘ V«Á‘“þÞ‹Ç6„Ö.3˜©òíZÖמÄgIÉm>¼Î9Xþc®ˆú5 ÙÒ˜øNø”º0&ÎùÅT•wõË‚ƒÁ†¢*¨„µc¬Í°ºlTaAÊcÑ †¡¿”¡·ä›k>õ8‚ ýxAm‡jzcóŒ«@r¨ÉïKöd>X.kO¥šœäOØu¨=ò°ÌCWìX+sˆDÆz®‘7?c™ADµ­ˆX1A‚4A“€šdŠ…¦Xä 3Ÿä/ƒLÃÚ”Ö|‘§e¾ÈÄU¶ªùâÞ¼)í­âÅ`î· ˜øÍ˜&LÚÊ]$-§Ž~oýkÀ½ endstream endobj 910 0 obj [ 909 0 R ] endobj 907 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 910 0 R /Contents 911 0 R >> endobj 912 0 obj 2380 endobj 914 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 96.0 167.55 105.0 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 916 0 obj << /Length 917 0 R /Filter /FlateDecode >> stream xœÍXKsÛ6¾ëWì19˜åC|(£z†‘èD­L9"4£ñ¦ ›- I9ñTýï$É“É!í$í.ö…oÀ2_F¨øÏù±':ÄÙè “i`ë`XLdZ ÙŠ¥:cÓ”(H¢ÂH£‘2mÊ<§Q>RáÝhs‡•¶ *&|©’sê&}ÀÁMK1,g2™°\uEsÂP,LÄü²Èt˜v›=q¤þçÙ÷324ý‘ £·áè—+4Â]׆¦*†y2¶ÁQ ¸' 6¯‚øeQQ¾…yTG÷Q…`uÿ'Šëêõ„¿¼m·ñÕ4”ŽÿÚJÓUƒs¬WzÇåÿ+•a‰¢›x_d)eEf¿d¡%Í4ú{$æªg,–¬Aïg?_ÛÀÅTŲ{Øí'C&U‘Äæ›™ˆ›Q¥›–Å¡Nr¯áBWUx?FeרLª:‰/¹üÍ›_9=M£üá=ô¬ÒèP¡NûØé a‡\TÕÏé ¦Û^κ*žŠo¶¸Z̈f’ ÕÅÉ.‰¹$Ç1/9wì4·$•,É›íqñ‰]‹†Á‡åÅA.‰âU•”­¡+†¡ªªæ4Û$ß&qT'EN7iYŠÕ"Déi~HÓ‹8JÓž°Ë “Õ‡2GÛž¬DÕ!­{‚ ÕUßã‰Ò2ÏÒ.ÆcaÓ*zBû"ÉkHÑJ¡·-É{u¾ÛHkùÞ'ÜÞÍjᇰô>zK8Âj9¥R,g"fÚƒFfË9P¨œö;¥çŸ}÷ºi7ʯ½àvr6ð€3Ó,ú–d‡¬œf#%®©š9Ë“ä'cªé†jw´è‘j[†ä~ã®Ýk/ôÖ„Ÿ—ˆÊ'Œ-ÉmRí£:~xB7Ä`ÌÁÎÞË~,GL”bP ܬ½ðvíÀëçý©¬&"JÜà5àŒ5xÕrŽŽÒ’*;À§ì6}+Ö/”£ªîôî8u<¿ÔÍ× $_kšTPEcNó#û Ý·¤„T¼;ä198é!Ë!Å{»!U³Mê ÷,wÓ ˜»–mÜrŽ]ÿ½þÑ®æî+”wŠ?EÎ}ì¹£e(Çùlào˜ÆE–E—/áÜàEQàwYòðXMVhÓ'Þ±L{Ö˾ (S¶BœiÓ`gê=1šw¬„5m0âmæ!\­W×Ð_ƒ]Ydg¼š)¦~Ú’fÛ凡œ¦¾ƒ‹rpßÉ! GNœ6jÏÝ»·$ðÛ¡ä¾Ø>3Ïøù…VL^ûKü…’#a/;$q6¬Sº»ên»II~.U¹ C7Í͉ýÞìv½?ÃÂÿ¸ú_ÏÇ¡xî]-|o-GÐ¥"HiuHíË"FÛC‰·VG5mWÙ¥)ÏÅçs¬ãóÙÛ2À\Äî…†öþÀÏï.¹`Ã)ü~zœ‘£ô†Ð†çÓ[ÃÉ-3¶t!óôÀu”ÍSÄR|y½ŽðÎÃõpåÁÃTm¾áp)ŽÄåœ<É× 7ôþ*Êä0†Ú\†š­NºÂóQTÇËv;ŒöâÔI¥íO9ÕcÈf;îØ£g+?t~ð]Êkϟל»¡Û7”w;Ö…Ý^¯æxÖ÷‚¦Ä^¶±ÆÍCÚC¨¨Oþír +Ÿþ.ü›ÛWbæ.—Þ|(–C9¶XŒvÞãSgŠ£'òWÉYÂó/z@%;Š'¾6ñè¬N„ÍÌÑŽž ½&¢œ“¤’ü©ø«™u©Œ%… \NíÐWN;NÖóbO:¦ê‚•ÝZ^ÔœÆv!ïŸ9ù_ý%-y›m§÷ˆ¿8³E»ˆYÌ ÂËIq(«.õ¡~–òg†® XD ‘5EBüBï°jâÙÂPÍ@Ô6óm|Ä÷äÒØáW.+0Xøˆ’´ŒïSTâý`’aJ @ߢlŸ¢Ji;À>ÑìÛ« ã.ÉÏ*;øoŸèÍP endstream endobj 915 0 obj [ 914 0 R ] endobj 913 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 915 0 R /Contents 916 0 R >> endobj 917 0 obj 1506 endobj 512 0 obj << /Type /Action /S /GoTo /D [918 0 R /XYZ 72.0 255.61 null] >> endobj 919 0 obj << /Type /Annot /Subtype /Link /Rect [ 276.97 528.625 375.02 537.625 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 921 0 obj << /Length 922 0 R /Filter /FlateDecode >> stream xœÍXÛrÛ6}×Wì[ìiƒw2u<ãÚNëLÚ8–2©ÉP$$1¥H›¤|Éäã» ðZN_Ò¦I,±»‹å.o'PüoʼÀ„h3¹2<,Wˆ ¸Ô‡ ˆ‰ïøò…½!_"†V-«›Éþœd ¿N®>á¢(qà~B5ðf6ù€›;.±\?a«I ßç[XÄÅA´ƒó §y½ZZÏèn}×"Ë0ÿQXM~™OÞ8`P˜/Û° bQ¤9°=ð‰eò!ÆÄ|W{³hÍ6a aÃiX…‹°dð~ñ…EU¹ÿ æo'gsánU”‰=RGUïcÓþ“NÄ)y+Å6±Jˆé _üQ*YüòrèÔ¤5¿O’$ :ÊÃ#«Ùû‘›?}:ž…â÷NÅõ;Ü÷íS¦"ß[9ã¡Z€…iÅ (òm•d Ê*¬Ø†eUãßÁ›@G°(1¨ŽÝ@6û05]—¸°'ÑZ‰Â=ê_½zÝ™¿›Ÿ]væ‡å ‹’eíŽY™¬²°Ê‹.òU§¶®ñ§ã…m¼ØÑ:,ÂU’²J¢ò>Á\žÍæ—ç'sœÊ…‹<~<Òp]‹ø>¥Ô ^'á9 ;×B´m|‡¸šï{þà†L5ó¤’7g ˜JÃlµ W­4Ü–¬]ý­]{ƒxÖݲ¬SMU3<ð†sÌ©áSÄœ}x71É)IE¬,Õ4Éâ$ «$ÏŽ”¬£žmÓt…iªD­ýÚâ‚UÛ"c±’¬Ü¦•š–L&ØŽñ ÖxÕ50¹Ûü™®?u5A€îÃHpä$Äu,bRãÌ·Ücqþ& `¯Z39ì[(¥ü}¢¯å»Êq¾l×Ê? $»ËÿfJ[Läü\©©;#æI)Gâf· ãÖ´1<ÐÓ‚…ñ£N¶ë HÁÓçÈ–ƒIÃG ÑQœ,—¬À¥$­ͩֈÏo@`+ôÆ!iðÅDe€’´ÂÓšŠ®NÁ¢mQ&wM £ƒ‹Ùï=A;Yn³ˆ›\¶¢¤3γô±cD^–É"í€/:OÖL)i‡YžMuZü`@Kk÷n8΀=„œd@óV¸ Œ°š¢>ªImxü`š#èË=b?½œßÁsq/‹†‰Ê¢X6˜¥j|džµݱãàyÔ_B&FÇß¡žLB#¤,XšßÃ/Oòl¡¾2è/mámx†Ò:_r3(XwA<@¤.Qµîn†ÇK¢À31/cT¬&œCÓ”R‰E™‹°Äbij`EÅ7cMe»A_”rQ"…>¤ªÓˆƒ¼¹Æ°\S{x¦¶‡ÉKÛ\®µðÿ={°k÷× Üm‡4G¶1ûtmê<Ø@íQo)›¡E=ÁwPÄMSsÛìS4Ü[XÓ;°áù ­{Ö˜!;H#GUÖøƒ7²‰u±ë`égc@6µ¾¥*ÖÆüWVäŸoÂøzï fÖê%Äø[•P7áC™|e|r½¯_6›þxÛt ¹˜M SÖõ"Ü…Å#¦ºë=ƒÒQõ€··èŠ'ÕU- ûL ]ÏA ¸žçK½,‡ò6Å+ŒIaƒÙž×ºRGQϰd§ª¼üÂï{[@6…#ê(ž¤z˜šÂP% SÈP^œ¼;žÍ.Žç¿½Ê‹Y£]ñ‚¤É‚Ì*žø?VIJªü/tð"Œc7â?ë;Þ€Ÿ¦NS$Éì¿‹,‹§î>YÊi4M_oxC’ °¡ÙŒj™î€Ž˜a[ðÆ­Ž ¦½¯»hYî0‚°Ê­U_C–LÌ·}œQ$ÛÑ‚I!•ÛEY³|½÷‚vÿ¼€e‘c[¿ DàOëàýœ²lU­¯±‡(øŽðÇÙ×q†ü6wà‰åXèeY,«jo¤µ °t ìæMX+œ^¾¿ #Ý´h`‚0,[¼ã"¿ùWí´maž²ñ…ëYÂÈÃã©N®×JëM7¸íÒ:=ô8Z¿Z½ýlÞ%ø|G7b»T¼ØLáÃ)ÃÉÅ»[5 ²[XÖìC,Ÿ_Dl™\Uñ°Û-Ë"'<¡ªbvôÃh‹§Zûäòìx~³³Ïþ89Ûq˜Ž…=•ÝcÝRî¼b+8KÐÖú;ÎÔÁ8¥È‡8‡C…õ§çÀ^‹(-ð‘‰$|(¼3錜?γ¥Þ:®7°ó GœÎëö… Ñ!|Ÿxüʘ1tu ntŸ\pcß:\,3~¦í éøëÒ¾»|.Ñš™¸žÕø°z¼a£hß$V”o6#•‹eDßÚ|èÚ6ö&ƒžú|ÔlÏ’úܺ·â“ñ?½mÅ endstream endobj 920 0 obj [ 919 0 R ] endobj 918 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 920 0 R /Contents 921 0 R >> endobj 922 0 obj 1858 endobj 821 0 obj << /Type /Action /S /GoTo /D [923 0 R /XYZ 72.0 101.178 null] >> endobj 924 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.7 541.372 274.75 550.372 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 926 0 obj << /Length 927 0 R /Filter /FlateDecode >> stream xœÍksã6î{~§_’í8ªž”t³×7qrÙËck;íìt;Ŧm]e)+ÉI÷ßø¦DÙëmgz—vÇ €àãÓ‰‡\øïœþĩۓOç¡ØG¨#/v°› -@%¨ „&%Í€a56èç“òÄE×'¿ü DKä:z=q-æœÍìäGa'ÀIš¦BWßñ’„Š Å}w³õÑeŨ¥ö”‘û?×ÞÔ(ðüÿ\´>ùa~òÝU„<ÍWÚ¨=×u½ F‰ø)ýóÑ|‹~9»ÌÚ  Ò4(+—èb“•kòæW4w2™‹2.Ì•|ø?v˜?u>D¡ÛýbøšÂk,ü €ããøŒˆ~*ÄôŠ_úA6#f.þ»×<‚•ѹ?YÌn§ðýóÓŽžë$ñ¼Ø0×Ëþf«YIe«ñ¤ýñ¸–w]<<ÞÏ?ž}ûñ Ò€ÂÄê…Þ s91:«I»«ËF#Ú ÑÀ¢Ú•­«•ngE¡—¬Ø‘f¤y¹(v˼\kT¹+ “äu“†(©¾5f&Ñó¢4oßðß2(3/‚€ÎÈÏ5\^•ß²Œï98 !pýð+mÄy㻽þÊvžQ•¸ñPVåùýãí­â6t œ¿æíÆ/ofó›û “"+šÊ!ë<·ÙîŠ6æv—Dõz·%eÛ}S@»ÉM»&[“ÎgZæM ³ßZ |'hŽLi íS^f-LRƒÀ:”RZ1’¥ƒ&d[кAO¤¨^ÿ¡¢×uÒ¢™UûQ΃êõ ÚÐ “¤¡0†Éñߥ²p]AÌ{˜aजf‹Bœv0Å\ ÔaªB݉\/Å^?â9ÿÐñƒ.…‘+t_®¤Ä–ê0M¡ 86áãU¡ü|[„ß•aj£ñ[Äb‚úº˜ðfò4ì…@…‘ŠôÄ =ÌééMGO­/ªÑ³Çô b$⤗‡#(¥bêÎAȽy6¹@,Š„¤bs•×M[f[2BEÆ[ß «éÃZìš¶Ú’ÚŠì9q ¹$I¼ƒ¼?ž ræ?þ`5 ¦ÒŸÈYsÊ>ØM~šL?Œ4<¾ÿ ZÉ(`öp7ÑPõLjÕ ·ÈJ <B€vUÕ[bp«LÒª*ˆÙW'öÆìQ|vzŠkÐHß1Ÿ>êæ+kRÜ5‹Xë€>RéŽûñöü¦|©~cM«T¤éq€z†.Y_廾.6ÙsKê×I!~ƒ$M£w‚.ÀÔt{Kuºy¬Æóx¼]ÁôqLb¶(¸Ã÷{×'Ï…2% ÀH°c·ùi… ?W¯†?W; ´•A¸\€n6$« /ªr™Sr4îç ) ®¦Aöv×(BCü´VL&^A¾²÷°íŽŸéÏê§³ºziH&8ùI¼Žm¶EãÑ(1º-KÚ€cÌ%ìk„•UkK6ß”{8ŠÔ¶0ôÔͶ›&å§©?ÛvôýžåúÓ¾Vh™¯V¤† âÎ æa›æ˜=‡„N”‚¿†6”ÈåD²ü5P¼ 6±Ê¶QaSú ´dT·ØÒ'ÂŽO·ÅXêÁ¶·ƒ8^!±×°Äø=9ôQùwH©E,LÄ1&†n(Dh©ÕÙ† hcNX~úÚ³éXG úÆ9°ñ¡ŒðXObœ ínæ“;º+¸¹O¦°møù_“é]Oî/ü':½:…¯ãúæjr7¾ðnߌv·+òœ$b¡„!áNJ0øó]ÊûÉÃûÛÉ=ŠÃÊê‚õÜ4å|ÇÓéøÃoãëkˆuØb‘jxSG°Ä¬êj«^Êó¶,Å£”e!1ÒDZP®%,+¢ñ<Õ V¬)g6Þ§?Ðg?žoŒ5¤µT²­Ÿàž•ô¶‡'ÊRµê:û,v“µ² ËV›åFf+#'§zË3’ ¬U²iš^.ƒ„·Ç~ðÝÿ£x`têÄÏ:§}{)€šC6?G*t¥ÕkÛÉìUæJ•=ÚÆÛÇéK+D?I` ˆÍ‘Ž‹CGöPø6‹·Eͤ;Û) €Ê¦kê™Z‚íl½VÜo«zÉRŸ>«¦¨Å…¸Y©¦8ÿå€Ñ¤{¹‘AET[X@“V«A:ž£X Ê27IH“6UÝš„‹Œ…_0¾Õ ˆ½qÒ«(“ÔǶS¦ z¬ýdW’AÐ_˜¾´¡ ýN¬piV້MvÈÏiD+Œ8’ ‚™ã_²¼Èž á¹ Q0ß`[Yµ¬u;kÿg×´ƒ}öÚ6£y>ÙP Ø#6nk †>.†!dÎÒ!ŽÒ–†z™Ö5ïošaÒÂ~æ'~B33pÖ¡ÊÚØä„â¢ÂQ˜¹A¿‡ •&ƘžÇº(§Ã1w:Õü’kÑ[²ø¤q„+ÍDNaíMö¢U6n†8ˆa1äRÛIfH“Ò”aÛ=ê¯`2£ÑBh†ndz9‚|9™] O»¬ÈW9©éùW…ö[3…"–ô4ðÓ oEf®êvƒ2;¢7€I° G–ÌAØÝK„r±MÀ=(‰Ò”òbݯ§ï»x¸¿³k:ã@ï_Y³y&‹.NÈ8ÒXÎ$éðúV@ÊUåä^–‹jû¼g#÷àY0JõËm†Ôï™AJ{®ë„ç87e(íG²&Ûê…˜d"û HžrH]«rPºñ¨Û¡ìðW’¿ÑnÚZÜc«Þ<Å0ß×Ê锥:€xq©T± ºaÏ€f,¦ê2™7U•˜%o4ÕÞJ±“¸1ÈÂx@ð1!äaÿ ¥Â&Óú?R*€9>„ûr¤Pls%šº—LÕ|Ü•f`T`–Mþ¤íÔQ—==î ‘²Úf*]€rJ)úU*a'0Hœc0ž›˜g­aL«`}üÅayúÅ¡fÃ=9”©Öº®vÏÌTfk»‚Ä3töÒœM©;šùËQXSÁ‹ÇÙüá6ùÑŠâC@+ö#·7d0›:ޤ…8䢶‘'íôÕSÖ»¬ÌÖ°:^?Þ ìù™Úš~nª] …‘x@°bç˜÷à´±ïÁ²³:/Šº*»¸ûB¨|N¥®ð5JÜÄkNüVÚ„y%€é%C zïl}°—8‰ï»¾|³@‰ø …ä[¾¿'§óZ@ÏLRz1ßרƒ8æÅÐG±¡¥ T÷Í€¥MgÂúóÓ×î¨w¦uÄþqÖ»9!},`Ü9¬£%Ðýøn2B*(?ž]ÝL9=LéYÚBÉ‹þ qÑ‹WJ#yÙ±—@êÒ܈k IŠÐ…þìŸ-'¯¡õ¨ŠQžË?tþ§ÿl9‘ –—u/·fKHÁ”bfüåô]µ)OGòç6ÛÕüN«'R·§¿9žˆÞm¹ìšHúÿ¦U)çšTõškÕxuOCwEnÈ4„Ûr „v©w¤q,Æ [=ž¬$íGð¥ñ@~öAøq¼Ç Íäo¼:9䑼|ŸMÞ§ãùâoÑ©pS[…÷¦î«<9ŠqÏRÅ“möIÔ ”¿àÀìÓ¨oå·|bÁtÌWá—ºî1:c(¾ºÕNª˜2g¤¿Ô9á—{ë¦^Øó|푚)õIY!Pö’¦RÏõcùúÕWH\ËODyÔyý_Èî endstream endobj 925 0 obj [ 924 0 R ] endobj 923 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 925 0 R /Contents 926 0 R >> endobj 927 0 obj 3291 endobj 929 0 obj << /Type /Annot /Subtype /Link /Rect [ 310.85 359.1 408.9 368.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 931 0 obj << /Length 932 0 R /Filter /FlateDecode >> stream xœÍXKoÛ8¾ûWÌ1FïGá àÆÎÖ»®Ó: Š"ÈA•éX¨-¹’ܦh÷¿ïP$EJ²Ý[w·[x8œ¿ypÔ/ üsÉ~üЂd;ø"x&øØž`¹˜>ñŒ¶ À† ¶H&"H»æ i¾XÇA60àÏÁã -Á .|=ãÜÌýà=îzÄö‚0 …¯1ƒ€a‰d WÓ­ã¼––Þ3CÆî½î‘mZÿ x¼ŽW·.˜D+• gÓ0 Óö! ¶²ÿ,ˆ¶ðx6Ž«FIBËâl 7ë8{¦çOý5˜D⢵•:•,üß'u>µ6\Çhïh¹Öðÿ:Äæ<äËű­¯øe’tk¸øïQx„)M¹¬·ßyøñ¸øLÑ4HЊˆiüí,ûͨõÉÎnîãwïcô²«¤q‘¬!ɳeZ¥yÆ/vuëõUmÄõ‚ÐOë†}]×&Ž‹ nø×v•¯áÕ«?`ø)Ï74Îàk¼ÙS /»óžmKã½aZ{Ä`Õc™7~¿£Iºú±2Õ:® -!ZTlbìy'Jܱ°ÄÙÃi{òUnëòœ.€Ødc]'Àqúl µ¬nk¿ô,ðÆ,He·añ~Pt¿Õät±¶Ž&t·Ojùú£¢U¢Åýþ¸wú6´<â6Ö"™«Ni¹¨k­›ržgtÀËWuwðHØXà _§½LW+ZÈîV³Šü[IÔò†ûWæšVk LØÍJÍæ^^ç€3ô…&{ géŽßOf“›èB1ÞYZ)áBÑc–Y¯Cã[hÊ Ó•õ¯²¶à÷œ}[ÓL­bE>̧ï&j£^YqÊAâ<î§ÓlI_´e©h5IH=íH‹<„éâð mW[z­ v¥BÛ*å”!Öõ˜!³>†ÓÁ×–¯úS Ê5|ⲡ"ðÙ æ÷Ñb4G'z”‹ßö5E<Ù¤äëù²†ó—_®E<·žwͦa³#›—tº²ý'Òõ]b™ìC"ôûöÏñ?Çΰq‚‡…4)¯› >/pú°"M>7«*e3\= æwQC?5Ôxr;Y,F¯gµÙ¿ †¿}“Ÿ8N1ƒO xlÂýã~õMâøA|6?„®ÝG×e8LçÓh:šÍ>Šã&c$súöíd<Õ¶ˆgã¨ÌžPßûH ¡è¦Œ®£/¼ïÔdÜPíbç›Ù²¡ÓªT¢í“f£yjR3¤ÎÞ±ì‹7 ƒn¨2»ÎiÙ)Y*/ÔÝòªÇé óhÍGvÎG†øÇ¢mû} endstream endobj 930 0 obj [ 929 0 R ] endobj 928 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 930 0 R /Contents 931 0 R >> endobj 932 0 obj 1587 endobj 934 0 obj << /Length 935 0 R /Filter /FlateDecode >> stream xœÍYësÜ6ÿî¿‚››Ñû‘ñyƉíž3­“®7×é¤ù Õr³êi¥µ¤µãiï?àK¢ÖwŸÚæ1 ~8ñ‰Ïø4H¹;y2Ÿ¤ )Šâ§4ñ2²#’ÉâŒÔ\qDrI†B*µ‘Ù’ŸOš|òù (­‰Gcòtâ9ÆÑÌýÉO0yœÐ0Éò<—¾ÔÏ2>EH Êy}» ÈU+´•÷Ü÷—{o{úÁßÀ#|=y»wÿÓg·Ícûo¶&‹ö0T ë_}!Ë÷'×K¹LaCRÿR*¢iô!޼ñ+Ò´ÜHáDC”„1¬‡ªåæÊŸüƒ"cþ< Ž4e žn•@íÏœüø®¤| ïÑl´~˜[ðcìOFÍÙH>·‡öt¬XcL+óƆ}3c†§v:­ñCErû®}¬ÖÌ,O'õì‘uEMØ·b·¯a×WlÓÊ)±V9/„{·FœÝñýŒ¦!d—™QzÝOcšO€—²mÑFy¤»¢YCÛ=F¤¤÷ܘ= ¬‹Cc$x Õç–¯t°$oïn¬ùû}Û bë¥heMýÏç=ëäéB ¸g€ÇE%ôhÊQÓQ騮_é+áÁ·nË?¥05D›¼DúõMêæc?hÈ1÷3iýÝâúryMn>ݽ[Þ~¸sýICšs‚$ø¸øðîúêÓâZM—ÌL—Ç“sªòÖzRAf«G½‘Ͻ²Ì‰?ñ§"D2gr²¯vU]tšß´†† /ÙúÐ1£.÷U žªE—ÎÇ—Üa*h•º9= P!QäS¢`‚óŽ ‡®é ‚|¢Šñrqá(˜Ä X‚e“rV$í|‡’JFG5+K"*³¾ìª½Äe_«Gf¸¾ÕäFlÒe GÛL:X6LÞ •8ÆRRë’…‘ÍÝ‘ýž•Õ¦*‹‘?¼è»pFþnˆŸ~tÅêö‰Ý<0-;Ïo¾—#ܺ¾ÜÂa;†Ðš(¼°„oÞüÃâäq3}ð,™kùáPÔ°RÌLRf7 (i ¯±§>‡då"‘F“…@£aÏáCug ÆÑ­I¹…%(¸*{ë‹èUÜiòDÜk²$N¼‚$á¥J¼ K&á’œK Tf³D®ÝZRf¡%%-eg­ÐË&Ë0h½âmHÊ…AMÉ=Å©S®ò,[ Ú=©0…{ªézxO­™oçáLŒ‹ÁGkmg¾—ŠFv´:%åë³X•‘[1ÖŒ,𤱒Á‹²b Z‚›Öž¶â5盧îJ¦21rGo4ÎÓ<÷óhfÑ粤qJ32Ú_%¡r<ñ‚Rǘ[\û–‹•›çÃxZ‘­®Æø1†Ô]3ÍaÙCšÃ„<ò6H(©CöF=ªŽ­©–Ün4‰¨"}Ó2LÃm2Hò™5œÛ(BQŠ¡T¶ë0„È¥Qæؘ±§jŸ…¦ìÉœµ~ø´4£Æí|8u·#‰'S‚»ûŠYo8nKY=`"«€¼y¡€„Y:éždà%Þxœ:.Q …Ó˜#9u^³Í`l°F©|V ÿ×núóé]ÿ3ùœC½+ ÷s«³eã‚ü‡RJ¾Àßó®úººåLÓ‚¬Îa<ñUFSH™,±\® Α"îóÅðÒ¬ºDˆ±îàLÖ`L p[˜Yv<­¾Öt•/ëöŽüAxäþAD ºvR§¼N¦vΡ;-lWf AwÃqÐ/D½"ÿ*ê#¼“^+ÈA7ª~áRû9°Â —w’ÅõòÓâîþ…‹Eì4gª^b|Áõ˜·e/’8È _ ÷Ñóèó²%!÷ýV½>ƒæ #ÿ³ùöýˆæyËfì‡T éh°æ[e8|Ö™QCÿ ÿ(6jv\aHû¦ƒ’_¿kÚaVW÷²¿¾¢F*«´Ô®kÃÈRä>’ñvs†¾Œ‰Â˜[÷hdÚn]5…¼R ‰Ý 6qjdòiFr6 Ç}m™+¬Anä&?!3Oo‚- ëÛŠÍ]ªz8«šñ4§³ºW~¼¼uïéq–LPžú¹º½_ÞBLÐ*—ÕpêHެ~>•ååÛ®­[9%|ãäCÏ)‘'RËòúûë…û˜“ð®—g©Ô“YJµgŠAÙXvª%Õ`È^“û¶ï«UÍ´@¾r}g&;Þ‹@E¡ÉAËõÜ>Ë!´a¼Ã)äÜŠ1?†aF“4ò|?gì›ÅÏB¤@9ƒïŸfÕÛÂÀsì! á}ýhF´Ç%÷(õRHG^àÏXø œ¢ýCM¬?ÔÃ=^Hl XŠ!·E3†,OÚÕo¬¨%¹?È“#Y+XP2Î(çXÅ•cä½a¼^§Š€[Ô÷³<ƒ#3ã¨ÞòéÔÇ·=ñhDÐ¥ùŒA{¡ËcÆ® jÉÜ3x0™DÿÓ´L<κvg¸¦ívø*¿ŽžºPviHÃXÛHd‚Cfe©zyŸ\eiÙ#Ô]J0ÖY޳oûŽÁÁ·§ƒœTŽV÷´e5k1]©‹ZÙë0âfü-“ +ö¤|$Yû„·!\š”ïMHW;ËîÆ˜j[|„:'s2:8nè`—^5ëYk˜(,E}ˆçŒ]Ñôšv*àä/‘ÿ ­Ñ endstream endobj 933 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 934 0 R >> endobj 935 0 obj 2392 endobj 937 0 obj << /Length 938 0 R /Filter /FlateDecode >> stream xœÍks9ò»…>†ªD‘æ-6KUÎ.„[Ç,»Åòab+ñ,öŒ™'Pw÷߯õÖ~‚MKDpŒž&d \‰¹ü‡Ç “Œ1¦u 0Í2qDˆtzµ ЫJî6Ú A䮽¯QHƒÿz˜¼œON/cD šß»HÌb?i‚2Lüh¾An¹>¹*«Ï|‰fÕ®-JÞ<û„æo&Ó¹¾¦”!)€¿)–ÑÔYˆ#Ò]ñ"ÍÒþE8T4 à †ûˆ¥µv®þ- Kc©ß{£EyÌ}WI«ý•‡ï÷J*)ÁYÇ4"žù»1ö[màHqöþûAle[¡g(jå¥!æ,ÜæwkŽ-:_q /ªõnã¸Úo[ÞX¬ºw Ï’/Öy ±lž¿¼žZl³kZ‡äíbåI©þ=ñ3ÞìÖí-oÝNX¯Ÿ ×»)ÿºàÛ¶¨JåSÏVé«Aub–(o‘8³-6¼ÎE.„à”(À%Œeq¤¤\ ½O¢SÐÊñô’õ„¡H ÁPØYÍÛ]] £ŸPˆÔT»ËÇÁ)/ŒôAHÐá ÌIb6ïÔ+/ù=ä ¥#ÜWµw§ÒÁF§ÿ¸}ëíÜ• a§cGRγ’Öëê©(‰ÝÖ¼i€i\›]ã«R”M±äé—ÄQïšF+ÉÆ€©22¯Ár»AØø¹Áö»Ž$8”EéðÔÙtþ~v£<UÂ=ƒÿqä!g_v¼þæœ]^ø<Ï~Úëë0Èp®Z Õ1·¹rfОaâ°|³][ôœtUH%‘‰ç%ÍÍ—Ø&X‚YWy¥A ’)ª&"9g8ÈBB¥ÿ(ܾæè2â …´™¦8UË%¬CY Š'`:òl"Æ1¡,¡ý|¬äg˜„]ù–bº§þ¹f'ƒÌ"(Ö$c8óñWEÈ †GÝ3|m}ƒäEü`†¾.>þfi4Ôâíšbé«õðÝÓsGO­ïªÑ³ˆ¢ô bË$ܱ_%c¶Þ- :OU=Px–·ÓëéÅåÇè]ÎÞ½…‚ cÿÃëélŠ8úY<½CO–dRÈëTr©³ÌmÅ™xyë0—Œž{ÍÓÓ+µ‡,yS<è|­wW¾óvšTª°Â;J_ØâM›·|Ã˶ñ¹uÞ6º{’mjSègþí©ª÷hÕdã]eD(æ®åþ¬d=RÊp?”µ(MK²Píÿ°âòni$ dîÀ7¯^^8lo^‡n=- ‘F#Ò/òõZhrkl´¿øB SÊXÑANUïlœ¤0e8_œ__{+Êþ éÔÝ‘u? 5yØPW›ïÈv”XÀW~è¨>Ý»Úór‰ÐC@\æ‹8 ‰Z"®ý•6q,Jm*¦‡ôÞÚ¾ð¨‘{=„é!9há ]Šžï :˰ªsa<"æÇ#$"ä ¼W1†&bR…àŠÃ^³ 8DÑ ôüùÏH¥¶[d½~Ñ—7 @"JpWšd²,i ùPÓÿåI–A6.?€GM¡7 AÐï¸ä!*•œ)²==‰¬‹¦O ^+˜ÑènãënK‚k*¥ZL(aà³5¿o-¶…¼[ºÿÅ)CÕÁçÕùZFŒ8Eu¸-ôO -ªÍ&w{¬&Ý.ܬ& šXdpà¿-„1¶ð'wX]<¬¿2Êðbi æ«J¸ï”1—"«„ 3½R戉3lÃC´ „m§½°òBTÊìK9½L‡o*¤ 'QÎ ZéZ}AwÕò›aLF#hqè>Ëö3Ž´ a∤Pê˜4ã3ÆÐð ‘…B¼c¯E+¥räMU;ºšúÜ©ð¶ÜBoòG‡Ôüžƒ·òs"©Ï †¤ãDèÞF!j¤l¼EÇU÷/ì_·Ù©¦Ã² b „@ëZðb6=Ÿ‹n$ Å€Ë÷7ó«w7– î)ÁÞÖÛ‹×ӷ畯¬\Z\»PÈ*äÑ÷‘p Áü˜—n§ªsn]<‡Ê ¯7ʲªÉâ±4Ço8 ˆ`ùæxh,íY@›T²Ç G-í[D»F!ª—Ô°©È† }a˜Ü>-ßI”=´Œ²Ò©p ‘ñ«À‡âQvi ›þ6½x/=¡ðm]<kþàάÊCªû‹þõê‘ða¬g<1³Brc¢·ÙV0ßë¢-”5yÉ·¼\ªÈT•l™kž¼¿¡ ¦d®8Ft8³Aí£ EUÒ÷76AŠažÆ&¤#ò°Õh¾’>Pˆ’jQù¼Ýj[ÞɆ³f2šš2¶ôÖÚ±-V|ñY†–ŸÀOïi0çw5W_ü,qÙDbˆ‘αFç+³2N aÿ~‡@gbŽ’hD •:O˜–.ÞÏ®æ¿[«éåÕÍt¶ß90PP¨-´y#²µnO«B~ ð†ç¥ÑÙ\ÚÁ˜[ Õ½ZÿÞ`¦Ú°Ö†.ÆŠŸF¾^öË|1÷•惠BGeå`þµ­s‡J§6Ï}¾-¯Å¬§?ßIÒ“žÌf´–ˆÉÕiCcÊÍÍV/iÊÜ_Î×-¯Ë¼-=âÞ@Y„³(S_†öÑ@iìahÖ°_“®n~}÷÷!#LâùË"®ƒA"6$æò„jì.YJ¨«µMÐ]ÞX¼ºû“/»-ïKC‘ù¿/Å=EuTmA÷Æ%ª¾÷Ù•/klp‘‘†Œú5Í÷""“åͼö©{¶Tiøu›†˜D00À¤Ø-þØ'äØ<¥ƒ®Ñ!÷ÒÖH?‡$EJB¤.ü°'Žãg4 ”¦Áa摾8N3œ0Bš(fñ¤}f1¤ç(/‘/uQ• Ì\,‘mrä|§!K#;© ¼àc[Wð>vóVø¡‰" Å1¡)ÑÞšþ6ŸÎnίÑÍùÛéóÁ‚Ã0ö>¦ï ÁÎÿÿ˜¡µ… endstream endobj 936 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 937 0 R >> endobj 938 0 obj 2429 endobj 940 0 obj << /Length 941 0 R /Filter /FlateDecode >> stream xœÍY[oÛ8~÷¯àÛ¤@Â’¢®E¦€7ã¶.’´c»ÛY´E Èt¬Yr%9iþø9I‘ºØÝ}™Ý^ž#ò\?2_'ø{!~‘ƒ’Ýä«âQ8ˆùŠåùˆØ'!Ú!E„^ˆ21±3SÔ5\5[[ôq’Oz=ùô&­Ázšp)f9ù”{>f~E‘²ÕÁ4 … †}$;ô|¾sÐoE3[[/‘ÿ¹õ¶EŒ:ÿô0ùÇjòü•‡(A«€ïàÈ#ð'ðQˆ™‰?ZíЧ³åï×óü±ø“¯Ñ¢8ÔiΫg_Ðêíd¶Rn62 9ð/À š:<—t¿XHkù† ÿ]Ì$8ØñÀñ)SÉU?Å=ôš`ÉŸGƒ£DY‹û©j¢öw*?ž•@,¤‡|P—ZáïbìoŽÚ ‘B÷qÈ[³o5/ó8CÏPÀgy¼ã-Qíy’nR^µœzk¾~=Ä™øº_\lFW½ã–Øñz[˜õqUIזȧ´ÞZrRcJ)·n³¸Ì¾›Ï<ãqe™nÙóæûž—°­d­ð8¤XÅ ©gEÞHoÆÕa¿/ʺҴrªKŸÚOÂ4×”ŒD3L2pw×[¬9+óQZöüUÔO¡ÃÔ'Äwƒ¡¹—Üä3Ä´5¬—|ÃKž'\3ªºLó‡—Z×.®ã`'`„€Ü@—65m]mCðõP@Ñef j ™! €U°oˆÕ6M¶†¬êXÆX–XPÔÕõt¹|?]½yaxq¾6Dj-ÝYV;žY‰®ãD$îhŽ(y”Žˆ°1ï1UtEzŽ a'­Œl j΀ª%ë -³-õ’Ñô~r¨Û›á*³»%Ýy­£ô©Lëšç¸eÌë±išŠf#KR´ z\¶8!Œ$ˆý°a#N/k¾‰tAH=GUÞNÿ9E»CU£{8pÕa6  ¦<»X!å^uª`Ž‹!p’Q§ŸJ½ÃDqÓ DæsSC†Æ»f´AØ—'‹Ž&Bó£qáP™Ø{,„³Äl R†CÑ!šÂ)9ºpJªÉ‹Š–Mã¶!•ô¦0dÂä¸]Ë™×c²MÓ7"Pµ]‰Æ”|}nDæíP÷›æcmù­îC’xŒ³Ã~‚°8í5.‚~²Q8ÕMš ub™B;y#eÍu(†{3!^è÷N%Ñ;ž¨m®ë`Nzª jO/ €q}†ýÀ%”:ÊvÁ ­:UÚBìQÊ‘aŸ¦¡×;LCÝPžhˆ`ƒâÑéÆ<Õµ´¼Gɱ…2Ź?Ô†¨m7yþ :I?¥™µ.)9Ü„,Ñqnu±‹ÕÁ/YêmAÛ´±Æõ¸­°Û†7«Àëù½‡Ã®Pb{y¡¸‘}Üò¼%Då-[cÝ1jZ´‘šªe4ï ­³Nú! µÏGg¿½Á•À‰`[:G<²qA]ú3\0€yªM:”Öš“×kÃ7Ѫ’-ßÅ-¹‹ótÈšÎc˜‰0èi‚ë~Íw‹&‡p!ŒÔ)«Æë²Øª©njgªoU¤Ú[DrTž°á¨½)‰ãA'”#h<ŒßëlCýv<îN`7!>‘g,J«QÏ åÇ©j-%W¨´\kŽ ½v¿ÏäSÞHlg¨À]«6‡<©”‹kí¾,¾>”âpšçÍÓÿïöh¹çPèÏQŒ:5SÔýn‹Àch‰´Xܾ«¹”â¹3 ïT>LÀ,Rìx”ÈBW%`ñ…píG›ÉW˜]LÀœµƒbuY™`Ù’2Ô•Ü>Åbš[HPïEVé€[ééhYú7(åz®}'eÊÊh3þ ƒ„HgDÓÓcÛd}ءƣÎTñ[‰¾EÆ"!fKF«bisúº•5„õóÓ·î§Æô£#Yƒà´ç {§ºú"Ç UGyµ˜MW3ôêÃíÕjþî6Åݶ8”w÷ ÍïŠò./ž>ŸÕh5¿™-WÓ›÷ŸŸ v™ç„ر„ºúm-f«‹Û¥Y7\ÅBLôGñôªÛwhìQÛs€Êü@Om»è¦{?]@+´š-Ðrõ¯ë™ÕRÙb¼3ÐFí j[’QÏïÄãæ]î8”öÝ~(úên@QïaïóÈ[”8ß8Kï1Ⱦ†+ý4:Ê ý^l~’¨]ü }>ãw54¼h~»ËRä ‚8ÈÒÑx€ ¸”Dûp²ô+EƒQËÙõìj…n¦€p86ñüü ½Z¼»AqßÃUãã›Ùb†ÔgáïH:ó. r¾y÷aq¢EöÅK-ìÎÐÕ-òo 7óÛùr5¿êü®ñ/,G\ endstream endobj 939 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 940 0 R >> endobj 941 0 obj 2412 endobj 943 0 obj << /Length 944 0 R /Filter /FlateDecode >> stream xœÍZÛrÜ6}×Wàm¥*‰&xgÊ»UZi¼;.yäH£¤¶âùçúäÍ»P—¬MDž“†.ü‰#’8¾—ò?Y×ä·ÓûŸo.–Ísû…ä®Ý eÃú³ßÉúýÉb-—)ÆäÁ¿±#¢iô! Üñ+Ò´Þhá¿ÀñQÇ a=üS%7WþÍ?(1ο:GeuÞß*ᵿròûóŽÔu’Ñ~ÐÀ³Ü?ޱ¿Øk“äsëõDûëq'±U°uuÙ”ýPæ$ßf]–ƒF@\äŒ[\â¥NóÂÇYo9#„Ñ©ê–îw£‰ãz1t☠ðvlÉ Á‘§cƒþqÐ"šÆNÊètheX^e»^›Y6E™gë•bØfƒ’3%txÞt'Ýzß\¡l;%5íà(ùÚnŠK°\Ð=sk–5|š‹$„ݳ˜Æ©(Zfµ…Y­¶ì‘u¬ÉíîYS´µÁÏYµcý¹Q°¯`j“Uv“®Ì6Õ¨•X¦2¯¬­ ÚG#—@Yàà²m£\Û«)Øc¶«,“Kk-Ã(gœ¶º]O<ú{®ëÅ݇åjy¿^^Œ¥8™ö+ð”œ.-¢µBd}Ïš¡DÇ ÍÐj±`y3Ÿ¶VÏq„[ú¶ëX>T¯ZóˆnrÖh²Ã›÷wkeˆœ›¶½5³±‚5Ÿe$¡‘­J*–£pÏ`'¹Ó/Mû¢ŽŒrÞ6x£× Óvï³çÌêT›½lË|k}ÛU…Fe“W»Âš.«*3—ð;Š5¶ma>ulØuMÙ|6u¤Ãìm_å³ÑàÁqÆ(mäD4LÓØ§³·Çlä§ŸþNFñI¾j2³ñt>êÆN¦®ëE©.Èõåú’dyñ©úÎ$ê%NêRH Él×Ï 4t7€âé(1„‰Ë ±D<Îü`fˆ·¼*² …“O!¦Ñ.%™×ɉçD…Ä3³h+µ óB;a f°ÖÆ™³̧V‹*–eZ2\®Æƒ—Íø/å°Œ;c“õlr`)Ô‘ãeALóžÂ}ýÐvPC–VñAÈ ø«‹òQäŒôù–ÕÀŸt,|:s¦Ó%>¿¸®Ї ï€9¬iÈÛº†ƒF€õʾß ”6mñJx‹xmÃx½ mÜÇ9OÜã®Éù=vž çÓw!’¢-ºº]­/—«{Ît"V`¼ÃÜî£"prg†âC¸N@LЍo1 À¬d¹pÓRf!óEžk´Ù Z×¼jP´Z”Ù]ÈË 01 e-ìá«=Ô¬e|ï§Z¸æ¥|£YÜ-.¯güjoöúðP:è~/˜é!"ã°‰ª}^SFþLß·×ËwËÅ=QQ|˜Èu\À¼`ÞغžU„}}ª²&ƒ£ô:=žLs{\Y`_r’:V§p?äüd¦÷¸x½à…$¤èw·W‹ë‡»ÅáE¸P5ƒÙP G3£IS ì‚,Ä’Tä™’ïŽÚK×I½ÎHÎÌ¡=Ž6cÐqéøÆ7ûA”&A2g¸#ZcåDU%N=u*¸u@û ՠùÞJü8tâ”§=š~Ï÷ïVWëåíêà ¨•B×s!!Í®`*Aº×fÕâ´Æ?Nò:"QfDF…0i©Œ6š:{5`›=[ó‰ô#Kiæ…ÙY°–šUt3P¥?Õ°³¾=µO» RjaT›WÛÓ çEtÏm2‹üMXR'F`КנŽQB%"¢[B³:ÄÒ0’j@=Û—ëÐLÔI2EÀCûÜy m!s±=•eoOeÉÌžc°¾ôO,—ÄŽŠÃ„èÍ9IË©?c¯éw©2Hfz‰TÝï`«å~OÓiå1p÷´È»ð|WÔJªÊS «Ì³´¼t6*ä6IôÍ’í²à»u¢›m)*e«ãÄǾí­ö`^š©ì}*{ž#ÒX]vnnÈrõña}¤¨÷^ÔûPÊPY›5»ª"ü¶D°²=RÇû1/ÃT¼ü✼óe÷y'ŽÕt‰)å• ÜýÈ.ü/(ÐÜÑÒ?uÂ\ã&éÌ o¹ÍÂf~Q SQV ëú> £ ý阖Ux%U§¢þ4PÞ¾Òµ¨¥\>Z ›im©?íéŦø²evû¬±i홆‘£¹¯àŠ;}frý=?dj3yï ÒÏ[Ræž?7pö B–FYRÞ«¥îðv‡>Dsè…36Ý-Öw²V§Ôr ˜È¦úÑI˜Dƒ5l jØéŒÖÕC‚Zq;Z½öv¢Fæü]¤™f3Íg ÷,‚<³kŠL\&/¼w¿0o(Ë<…`Ⱦ0ƒ JÍ-¨âI hÉ2ŒÃ@Îaà(+0‰ú²~ªÊÇ’Y:é*9\G0.càÎ4´^±P!‡$’O9Sï7îE5¿hÖO]û F=±Î-ÜÁÀPMñû .küuçXz €;}ßã?Çø"’ô#^lT¼Šx„ø4ÌL¾‘«Ë››ÅõX}„ç¡ü…œŠoؘˆ/Y|¼]®ÖäfñËâæ×© &«k SÄÐÁ 5Ã0w€t„íCJy†áw(LÞ4>~šSÇ󸛠Ξò¶‡ó©-eh%”¿œUì™Uþ¡—›Ôsàf€ÕÆtËRIè4¡#Ô„ŽP:"˜Î]Çì䱓H¼§ÛŸñd+0òØsÙ—›²*{FÉÚØWþ–6CÔ¡çï­O»É)Uu9lËÆ`EPˆ÷pÚ™fzÍŽÑ-­ÆG¶Ý‡¤-_™¦ö®¿âBC'"VÝ(ž§Œí¦üWXˆª˜Î o ,-‡`*囊ÔÍ8N]«©+ôcÍ̯ážò=_¼H'<†ŸºŸŽó¨§iùÞœX¯ß²“ô¾ÖlXŽ/IËFDQe4zÓ§£É-G€ïí‡gt´ê߯@‘À½Ÿà÷ff`uq}çrê‘ Þó/ÔŸÀËxÄ…Mè9œHÝdf 5oJ¤S(ð܈GÈd¨s‚—Îz×ü=QÇÆ1Î#Q/§©~v6ô…¤eß>8ùÏX ¬{s}h3¤¦¼ÐŽÒ4vÕTÿY]~X^Aj¹¸Y“ûÅúþóGÀ†4•ÏV²|à•%D'pÿq­gÃñ€ùd>_BGøÇ“ãøâÿ_H‚™!Þj›Î 8÷‘L{üåOba¥F?ú³¯g3HÁ{$†é¼ÚnA(ʤ€@=° ÀK÷4Fö7ß°áOŒ§G™}ÔÙײÞÕFÑìê ë F~GY»UbéV‰÷!ÊŒhs‘žöÕV½ö Î3 l¬^ú¤•ô±6Áj­`Ñ#Uí‹3ú_[þe…¹] endstream endobj 942 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 943 0 R >> endobj 944 0 obj 2751 endobj 946 0 obj << /Length 947 0 R /Filter /FlateDecode >> stream xœÍZYoÛH~÷¯è·Ø€†á}d³[NøÈHô.‚ñ h‹-›…¤|̯ßjv³/Êy˜ÝÌêª.V}]]U}åçƒløïú%.Z•?9ÏA‘‹¼³‚9‘Ú1*'â FÔšT„7½žË¥q‡þ}PØèÓÁo¿ƒP†l+@öH9S³<øŒ¡å…q’$«k9qLMxVU‰ÞÎKÔ½ô€ž*²ÿçèUDžãþ ²ÑíÁÇôàíi€¥k¡k% ¢Å–ç&ô‹Òýv¸üõì—yu_ÿ ZÔÛ.¯H{ô;J¿ÌR>Ì^GH.üY}4ioë=J¤ ¾äÂ_ßò8–ÀxhWÁ'—ÿÒŽ¡ôÎb¿Ï:‡«R>6§ª÷ÚßiüùY‰è‡ŽmÅÚ|8¾§¸_±¿Ùk£‰¤¶Ÿ=Š­ôŽ #è;‡YãmÑ :oEóÒÔ– ækÑ|ª·¢ý€«Níh±iêɶ´ÕÕ¢ÙnÛT Ùª ZÒµ“æÊm«ˆmÈ*_?IýʸJü˜—ÛRÐÕ¶¼!\½6l³ÉUœæÚ†×((ÔÝáõÔÃ+ñbã±Ð ép^´?ËÛÕ¶m!ó QlyìPKV]^W­Å,¾=MÆæCÅ }ÛvüÙ~Ïôƒª#†V¨xŒ‘=¸XÝá¯:Òäm—¯>þ»wÿí“oÓóù± ³åÕY*Èå,] â½tæ`œ¡9-ð à&…÷IÛ,ðm' ÔÜ‚<äÄfÄz–F ÇóE9Dg¸ºÝâ["ê!º>üº<¿>ßîÇŽ,ßsèL:Z¸‰!ªB ‘4-ø°°fÜeW7½ï9}^gÛ‚\I Å|…éÜJ6L8©²V2:Õ2” Šat‚ówwŠ…®Ù®ÀíDц+Ôª®º¦.Ô/pGJH;š'ÇI —´ÛUo, `U8Ä­lƒÞ,§ÃÂ…"À,3¢¨ë¤¤YK2?Ö¢žœ§Ûj5xm‡rMV«)ŒuSg9Qàn[¥“»›Ã¥J=U~œHu÷ØQžŽrm;Œy$–yU7ˆ<®ÈFÍcõ›À³Ü0„oüH7։ÆE¯dÀž$Å 0kcÙb¥'„‹-É›WŠŽNQÒæå¦ ¬l2κnʉ$»»×‚ióê¶ ¯75áHš‰«y‡³L缸nZvâÚŽðýèìlvœéz}H ’»ï]^Âz é;ÄéUu'¶†²o‚˜pEw%§‹ËsF·ÿx)ñ¢Ø ÈnÛø:8E|=UÒ+g“¿^‰ 5ÑOâè…Å‘ ¹LHL®dñ€‘ŠØœ©ô>ò~0²ÁYF<ñx°s mÐïp<”ᨌWòÉ4ãvTLJjM<2B¤1öp•÷nBZå,-ÇÆh´ 3çÇD·WŽ©Þa¬‘s^ʱ$¶¼ÒÀ‹´Åñëâòxvrµ˜Áúá;©»º$Íõá:oÚ®OŸMÇŸ§‹ëÃÀ¾>š ïâïX>=8&`Òq†}%Bç—'óÓùlÙ¯S'Ót:þ v Ap#[,Ÿó‹ål‘ÂOz‰Ž¯–éåùl±ûgW éúðdv:…ãõ Ìå>X,fé÷ÑJ¿³x>œîÂÄv\?Ç %å«–4pÀ¨©€êjºê’GzPÝ¢ß@™èÏ–tqÎÈ:¯úãÝk …:° û*áÂlÓ*áhU‚Jx !b“Ó<Øù÷,رO؃pèz)mäŸi=ö@i~Ð[±'ˆ!ó5®aAƒ";†R ŠÒñ°¨Œ}|ò°J1Ò*gé¥`ŒFLŒ6&®}Š€t §MŸ¼P<€í'^Ƕ¯U€túñl††Ìo¯óŒ¦ÚìÓl>Í.f :A¿!žgtÕŸ@JÍÓoJÎubœØQ«<ì|‡Û¦”LÎ2’©[ó—–m߆*Èn³¼=öËÿÍêí;qjk÷æ˜ö»¬…ÅBOÑÑÇ€FïŠTÞF68KÏŒ]xÜâ/’›uÊð4Æþ€xfŽÌ¸† “ìàù¡‰RŒ©Œ}\òA©g…¥eë4ê„™óc¢Û'g5ïp–éœÒÖ‡êï%°îÚÄÓvzvf,Öo¾\~¾x3Ao–çóôó›?I߃À†cmìihK/ê” 4Æî¬Åî¬X»^w¤’$–ÍU]nê-»hdýÞŠñ¦{} áJý¢êp®0jtÝÈvY7J¿M3Œ´ãzå»|u‡(ˆ¼ZÛŒ áRXQƒp‹HQÐß Î"PÇÄØ”»Û±µ(‚ðáìÆÌÜׂ`qÛJßXêN¡V¸!ëmQŒÐËXÇ…¢ãì@ó¾%e¾ª‹ºúðlh9Iô‚†‰ÄÀ<)ȼ•í†üÜæü9€qp÷ÌI•íb[—Š˜ôºäÝl;Í±Šµ½zÞñøâlj1 FñP`½†v#ß<ä„FÞNûaÈúÄå¦Ù=†(¾%°Ÿ-'y‹ç…àØFny¡'pèB+F‡gÊ[ãˆ'Ááo;’q‡ï•V°ÇåÉÅ—äÕ÷ìÉQ_ð=~-€ýöË"Uq ¯ŒPÕ[~Íï±ÈiÝ-™êÐqΑ•;‚Ú=숮]70Äœ]rÌßPØíi‰19RÆÎftV‹&‹=þé³™ý‹ k²2/HîhÞ[¨V1ÕIÕ7Ѧ!-«¤#å,£eÜÝY‚•*Ý†Ó Ö¬Ýaói—º+ wÑb†Êþá–æ »í ó¦núCÓxzBެ¾zýº{zÆr§}ù‡w•XŠÙ³L_W˜ ä<÷b,\ú&=¢N„\QÈÏÉi­Ôôœ>‡ØÇÕŽ P¸ÍUý |› Ͳ†ó$/í7O ¦Ρ/íšsHu &ÙóБx?ë Ö+釼($ÅK%#Àp–¤lö:‘´ú(×3ØòÌÚ-T|R­”^>7œâ¯dLYCð€p¦ôW ¥=<›íFÀþµkß(ü¬©7’™ÛêIÏ5<ÉGáô(ø£`Oˆ×dÉ*ë,_ç·£àv¤ïúæ~’„ð„£ÍEOÝ4ÿPEkêp{y$«-½‡°$/U¿Pæ½§³š(æ½'~²Qíæ­:(úüÙ_Æîð ïÄ7aÔ×4ÚÒþ!ÖQä=} endstream endobj 945 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 946 0 R >> endobj 947 0 obj 2861 endobj 949 0 obj << /Length 950 0 R /Filter /FlateDecode >> stream xœÍWKoÜ6¾ï¯à1š‘¢ £@‚4A‚Eârˆs %î®j­¸ÑÃŽÿ}‡%qWk¥È!­Ãäp¾!盩o+Šü{éþÄ Cé~õÍË(ŠâÒ‹„D4Æ’(´G~¢„B…S<:?äÔk÷“ú¼*W½[}ù J"X Ç™ïÍܬ>ÂæBb.U’$þ¬ S¥ÜK¤{tõ~ÏÐÛi§w†È~úðDœ²ÿÁ‰Ú®^¯WWo¢­7S H†Aà'–HaÎ÷ÃÐz¾¼¸ùøçË÷僽7údÛ&/M}ñ­?¬þX{7;]"1øã.›ŽDDŽW‚Lå“~#Ì{H0à[*|pý_·0 EGVÿ÷Yr¼©|ªŽµ_¹ùóQ‰¬ŽâA£( ÿ8Ç~1k³@º½Ÿ÷‡Ìrë–1Ñ;3*ѹÖk“ê¶6èÖ©ÂzÑìÂYÝèÆìMÙÔ0/ƒ‰'ÐÁ¬êS:T®ÂÙ}iCtcŸ=‡)·`éòùõï&…ÍlhÎn~ö˜…MïC‡uQÌ©dä„K"!°B/2Ýè;]{÷·I{{AÞLãÒ˜,Xê™èÇ:MM¬Ý™­»GÛê´iu1ÍG^ð$ûœ7»iöA?èi湨/'ÑH†ß¡:ò©Ñ ž~·U^nçlq†9‡.HïÙš"¦Ë 5»¼F{ý„útÔY–»5p%3…~ªäܾ-š4+£3ØÒóT9¾ñÉÖ®?b)c¦x©2fjomÕ§€Ät"&5;ÝÓ̓҆KS½`LÀnöæÕúÕe0BòüÖ·ÎÂÕ‡OëÛ‹@êø›fw&˜ltݘП|sä‰ ‘SAŠí‰ùÞ˜²ÎÌœ7)OxKu‘¶…vá«çÑP &D$‰\ Æ©Ö_eñ„:ZF2R¨hÏ«;]åråPÙm¥÷u—R•©m[Êò *¯xò§¹zË•'íÓ9FT¿§¿ÑÍØø™îK#¸K”ƒÇ¾†¤ÜØ¢°PÈ|2Ô⩞!ë|ƒô<àPAëu5—ÚS:hvÅRƒK®®‡C%g%9fÌó-êzÌ™I ]uAú}#ªbª¤ô8(®Â ]åÝ`μµ=’xø¿r¸9O.|“¸îõÁû¶ªmu"1ø(ÙÑuoKGÜDá`á„7|ô1µûƒm!s–` <¨¢8·d4Àt¬9„Ó t(1@ ø–Å ‹¥£O»¼XÞDF˜I ÔEÔc*s0z‘® vÝÓT(û%@DN8x¯˜ÏòëÂÚÃ"„SÌb·K2@r¨VПPs€()ʇp]ý°È@ xhÀµÇ¸<€®°Jf nŠ ´ÂÜý’A˜°¦­ÊEP_Rº3€jS@O ßP Í"]ÙÇ3¤Àœ+’ñ²3ßólƒ >W"F˜RtjP(†Ï@¸ÆF5HúÊÃG`/J»÷T?¾›ìt m˜ä“ 4æÔÀÓÀLîÚf÷·å µ5%dJQ<[Ü´e×'‹·Ã=öSGíÍyO’꺖 ÚéÖŒï×›5‚÷dÏqÄkúÇmÝ‚ÊÙ<@Ôž¯]£׿™Yjó’A¿pÝšDñØ“ŠÅ–|ÍPÀp*ÇN[˜f^aþCôÎ$ endstream endobj 948 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 949 0 R >> endobj 950 0 obj 1296 endobj 952 0 obj << /Length 953 0 R /Filter /FlateDecode >> stream xœÍYëoÛ8ÿî¿‚Àa%êÝÍ-à&nχ4ÙuÔ]’ P,:ÑU–\IN68Üÿ~×H=ìó}Ù»´E8Crføãpê‰,øsÆ~A«Íä‡äÙ( Èñ%Ëó‘`ß ÑI"ôB”³…!["‡çÊÕ‚xA¿OЉ…¾Lî`QŠ,ì¡·‰5.ÄÜN~åž?Œ¢HÚJ°†L…ƒ}¬6èÃbCÐeÉW+ë™ ën½i‘c“ÿ‹,ô<ùO>|öm¡x­]À'8ò,ø |b‡D쇠xƒîNn½:[¯åwš¢e¹k²‚Ö§(þÛdËcrÜ‘ü 0÷¦Î„çZÝÃÓZ¾æÂ?;‚L<8›ÊååÊßlB =–ø½)ÊØÜ¿*ŽÚŸ©|ÿ­l£má°s¶ëðw}ìOFmp‘Lw{ž¨kà[çYQÓªAu“4tC‹ægq4c‹ca+èìÙmSX}hgãÐo¶CGîÙÐêy¸espS{¡¹yV£Stæ “ú¥|+4™ãæ…j‚þ‘l¶95v>Ѽ|›îY¾.«M’kz›TɆ6´2$Eºg÷kReÉSG[¹Þ³¶/X3VIa©Ç»š¦ã'ma¬§èC¯‡^m²<©PS"fÈ[òŽ´*óݦ@]ÓŠ+в1}XÝ‹ƒl¿w/6Dú–åx®}Qn¶å`¹U¸VÛñ1aŽ¡¼Wv"씤–ÓžQ³²ZÁè¼”ÉÙB=ü4ÿ²¸Öä=œ__jâ)/Wß5ù–5/š*·MVÂ?'OÀj¬ ÃNy£êdE“˜¶•âò%Qéñ¦¬Œ…äà»®;‚å9d‰/ØnØ[¦<•é @KJWà ;Þþ'iÃâ¡4þš’Ç~sm‡`Ë·£Èwýç‚֠ծªËj¿-„„8´÷ŠÓIdG\xO¾H4fÜ ¼ùœVÿZŽaÏÞ+S[õD×êÆ94zœÓ¤6Hå3œ½ißêéißF1<ûOןÙÎ^ix(ü¸Â¥‘í Õ1}üøt‡ÎŸèsVYñŒø³øÁâ BH¼¾»»ë›øÍ⛯‹‹‡ñÄrpÐ1þîŸÌŸQë­&ð輦›LhøÂ$ð„HO r4éaLjqƒ¨ F¹Ä^“ÆESt'ÜV劦»ÊLˆÒ"«‹ep´Hkx8¡XéA4c1*pypɳ¥y2äA^1×\Î\pžÊô½%x0Cá”í*朸%zÿ–V,Oë"±¶ú7¥–Ò$õ÷1ûE½Ã@RœŠæ`¨¶j›dX·WV@B=EŽƒCÐöfŒ™Çâ–Œ¹b¼¸œ_Ç‹øï-ã5Éwzºyá!@1LvM¹O[%yþ®ð“pÃ䥮³ªnºÖ)©hSeôÕ·«LC‘ê÷'÷§C¨ 7u¡ZïŠ{'ˆUP­Ù@&µ¦#S$pk+k G®m¬àâ¹¥PõŠ×~Ï¢ÛcÂÔ”}{|Ò™œXc È#!¶úiNÉç’³”‰›™/Gv;ö{é ¡³3Ä?éo{ìµDãp8íyPŽ Ä1 ϼ*ËHxÐRGÒ]„]ßfWäŽì?7âŸOØ7Œãr›káЉ@¨GF¤¶FéÌ&h‘ÄXf5Aˆœ&7A›§w¼oõ*žÙ†’Œ3´Ò¦z“üD˜¿k^ÖÔ¦É.o iÐùá–\ S›O¬Þ…5иC VÐ?š–ýú´e$íȰZ0xË'†2½ ‚w³bøRæßPjô¯Jº<…œ/´iš1D¦£‚ÚÏí‚ì|m,~ Ãí÷’!\éÁ¥R)/¦²žT¶ÎdAÁyImÌÛ]£Éî÷ÁSß„¥ê N’š•Ñp•ùYpÄ—i1þNßßÊ*Åš¿d†zý©¨e¥%5€¬þ`Ly­Ê;Ný£|"èº}kÞ kÍY!ô5+w5’ާËö_Rÿ˜½3Ž endstream endobj 951 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 952 0 R >> endobj 953 0 obj 2259 endobj 955 0 obj << /Type /Annot /Subtype /Link /Rect [ 147.0 142.224 251.69 151.224 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 612 0 R /H /I >> endobj 957 0 obj << /Length 958 0 R /Filter /FlateDecode >> stream xœÍZësÛ8ÿî¿‚ßšÞ$ZQoõÒθ¶Òz'qº¶rNÓé(6ëÖ–\INÒ»¹ÿýÀ‡HêáÔù²wû*À €ôþ`dÂßgô?´Ðb;ø!dù²=!r=„}Ã3´E‚ ÜmèÄI§ÒfR1›3kôy LôaðõLZ"ÓpÑãÀìçfæƒ?À¹ë¶„a(°ZêÂ6< [ôÛdk¡qÎf×è©!óŽ^Gdcëÿ‘‰îïãÁo.Â&ŠWêx–º&üå{(0l+¤Y(Þ¢¯'ó?.Ï&ÙCþ'Y¢Y¾¯ÒŒ”¯¿¡ø÷A‹e2ì Yðo°ÓÔp³9¢4)WRø×1l.‰a¹°:´›+þ¤5é²`ñ?G˜Ò”Û[Å¢öW:?¼+>UĦ4ö;žþæû‹£ÖÙHêÛ4BcŸN }ËuB,î4Ñ€9Ç7Q ‚ (Ÿa™`ÚñBFm(%à ‰ËpMz¸ Ûà……ñÇ ¶\B.áN€WþžwCµ-eÈ–t' Ø"‡ ~͇ X ÌôÕb8W;ª­ ?¦&åï—NÄB8%×!Obˆ‚ÆA4!)àÀ‡3èÛüŽfÑ0ŽÐ§Ùõ(ßÌ"”‘Çï‹}Yå[RÜžL¦h•e•%[‚þ1œ>g·'®yûúÁØ&98”,—)E‚Ñ@"óƒ2ÆÒÅ&(ß¾î¨@Z±™ A®‚®®Ç“‹I4GÔÐx;J¶g„t¥AèÕJï£l__MFùŽg¸Ô †@Šù£Ñå‚R‘íî{º„uÅчhö÷Ž6Ô·f\©öd:f1UºF£›9øfsXîå ¿=GÃ›ËøTEøTôf³h'WÑ<^}º}Ýuë¹<˜–‰•ÛyKÀoÑd V&ñ—Û“>¾Û m÷p<žEóyÔ‡[89­÷ºÏAàt¶!šŽù´žL çˆã[ô€ˆ<¯ z?½@«¼@I‘&w‚–d±IФJó ¥%ºOH†îÈ&|S÷{ŒÛ¡áÁÂÀ«w¸6\+{=ʆ/Ø CÏ—µPm#ì±ØFB<Ä!;§6^#l™èDš¼fñ]-{óæmMÖÈ{ÞVgߥ 7iYIçˤJj¦ú¹#r䫨ÚîGºMØK²Jö› –¿Ù“wߺŸ, âB "T$>Œ#¢Ëi¼C_Ñ¿Ñù"ßn“w±ÿ†¾=sz,Ç„N8Üoô”lwRÂ]ÒæI¾’¤2.ÐOU-K 5ÎYͱãfHvšWjfµN*ɤš5I©ýã|Y%ðA‘L©=¦ÕZ2[wºÓ°²•dG“ew \«ŠF0Kø~áâû’lɘƮ¢d·Û¤¸*GÉfÃ&ÔJK¢ºods¸c°<Çp<Ï4mÖ8áÐ.Õjô–g!ŸTMMÄ«¯fˆÊDM¦ó-Üò!EÍ6  ±·=ȾÀcC”]ð@¢ý踱Z~tLÚ€hS!"D Á!¢1.”W!j40]4 kïOÝ1íM#:\Ô Î3ýŽåÃWàB&ÂþQm€Ð$óýà@ð/Rä´åˆºÅÎ 1\êàdÛ!> gDÎê1¯û $ò.²º6m>&° ÍÑ!›Õº Z fA%-¾Êrö¹¿ê± 7–¸ž2|v†¶9|”2•rnW×2ÛaÕ¢·,Hèô&æ™iŸá ƒvÃ-íнEnÔñn Åîˆj=‰ …¾uˆlß7à„šØ™t´/ʼ(Ÿ)D`ÞÀ´!´<±²!dî3À “ƒ ìÆ´£y²c᜗'ZΠ {PŽwq`Ó7LŸ†×í±§éµGˆÒRÑû’,õ@Ò".H9.£QÜãÄP2ÚÛIVS40ìËä^g•»±ÖöáϺ->¶[ I±ùIu,ªò@Š*)Ü!#?B,x³Æ–aJ:U*äi±Ù—Ð&hvyÀYj_d’M´’VÞš-‰¢WE¾íÑØù‚,÷1¤HDóW5¸ßÝ6V¨ïÝZn+„¿ß@îh 2‚Fösm?øH~÷O²P¬h8³­R"’n¬‘‹bmøžT3¶Ì9©èýFlIµÎ—Êùê„iB&zø»q°ýV pÌ"%„uF,.]7 9.¤0 ‡¡Š:¡>¡Ü†u 8}0YX¤`zQrìkç⣽½çSCÐÝ¥YÊ®‡†cÁí jŽoõØ<}@è© ?tà¶U¢kmüe:„¬ÂE“–,ÉC˜DjùØ€]0¡ßìƒ*ÑA~‚”ìv_V’¹Sr‘âÄêrI–;²HW?%ŸHŠ7ÉR~—?(ŽÀž-ÈM”ò0ûÏ…†é–°=é˜P×Ï£%at3›_Ïž©PLZoËë±&Ñ”ÍïÃW߇/ƒÅ™dU‘BqÙOIk×+.h^¯„YEÂf—ï³å3 î6ùâOC²züx¹énÜÍ5êVqÈü¬óýf)Yv,8¹Ê7pÇ#jLÜÉ8sq=“ô,Ž%s=½ü"vš8™<䩲µËË27v& E‘’ƒ;­¥!%|¹œ>x\lŸ~Â.ÜûpÏâÏóËmŽo8Z€gˆ ôM#pXŠ$Od±‡»'{š¡)÷#r;åvy A~\“‚§DQ’h)¿£“vû ½Àv¿—>yРB–=”8kØ¡èyâ´¬RÂÎ+'%ÎZPï"cI‰ZÆ™¾JÑ0'*—ñŠsªŒÂ¹§,Ëœ…X”Ú¼D<m-tÓzª Ýs3@´“5ž¬DÕô„ÛņgB—˜bŸ©RšÝÓãb¨·|à1eËåŒìq8ËWÏiöÒ)9U¥è3¯¼R³Pº‰Fk!µOVÎÒ°žö"€%\Á».‹à[Øó´k·ÂÂÛÂÀ4ìÚ¶`ê +I£1å"Þ}qšv>¼ùÖrEoyAéiøÌÈ“f\†ôTÉîÈ*/4ž]|!4ÕÅÔ ¢ï¶‚¨mþœðüÐÒ‚;KW­3É7ú¦éçp±€Ê^·Fë$»o·³˜]ëè3Üë~í ú=Ã{fúbìhzÊùÓXù3«’'–yÝ£_’J’Ưfn(xÄüç6hr\úûaóW7:Éæ“êçMÄŸ€4Cì¦Áñ$Dç{NLJ5_¨zðxPmBöë?‡CyGã_G¼uœXM/: %oTúDú›y Î:^±ÃÆr¹¤ñXÖÁÑØ¦ö®´€óTÖ µcòÌK™ eÞõéI¡ü ëÙ§2ϤwA?ô×zù[™•ÍwØÅNW[äsÞ̢ϓø#šEñÍlŠhÏ%^þ†.f×Wh2ÙÕ0ž\O¿ÏG£«¡ß_Fs6—õe´ë7(ÒÎú¥¯HžmÃ瘖okø¯?ES¾ÇŸcw",žÄÿƒñ_Ú6^ž endstream endobj 956 0 obj [ 955 0 R ] endobj 954 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 956 0 R /Contents 957 0 R >> endobj 958 0 obj 2683 endobj 960 0 obj << /Length 961 0 R /Filter /FlateDecode >> stream xœÍZ[sÛ¶~÷¯À[ì™áý’“vFµ˜DGNe¹é™8“¡)ÊæT"UR²ãÉÉ? ,®$å¸/=ÇmÆØ°»ø°v—þëÈ!6üwJE‰KòÍÑ_œçÈ%^ÈYAHœÈ í˜l'â &k:ÐhÒ!¼é1.ÄùxTÙäíѧÏ0hIl+ GvO8й<ú ”¡å…q’$ÜV×r☪ð¬ù†¼œn\2©Ùha=dÿÏ­×-ò÷ÿÀ"›Üý²8zù& ŽM+å¡k% ?QHbËsúã’ņ|:¾üíütZÝ×K2¯÷»²*Ú“ÏdñëQºàËd2˜#¹ðd1o2:ß6{4O“|Å…¾å!8–Àzhךo.ÿM;D3``áïƒàpQÚäîV1ÔþIå‡w%¢ÛŠýpüHƒßô±µÞFRÝr=qBc=üÜF°–ÈÃż˪åºh¸C ``/†CÎéxΓrš$VDŽÅ´¤; P‹œˆz´ÓðúµR9®—dÇË"_gM¶+ëê烶80Öq¨Ðp@ª²jY¬è!QŒÝ]¡ˆ¼Þ7­F×+ÕÎrj¢î Ê´vñ5/¶æàºÑ&fMUV·ŠQjæ4YÙÂaVöîc,˜‹h»Øå_‹|/ pl¸gÄR8ÁÍ©¼Þlë}µÔXí.Û›¢ÚYsüÌ9o“=jÔ]v¯ë­+ƒjôyuS¥SpŽæ­nãâ®hû…n!.ï{–CŽo XQ!IºÙ÷Šä{D^/U5çT;]0B-fJСCÆíX×ùŸÊ mlSl²²:d¡ÞS=*û›S&²Iä$>œv¸8$T—²ç¡ÜÝLj=›o@–HØ8\eÅÍ`1` ë¶»ÕDôlHB+öàÆ =m˜2+–>ŠÄ¶)îËzß*Nñ5Ûl×ÅHqÊ•jg•>R;Ž|h«ëiê­O¸;Œ“…¬ZS[jè¦HÃû¬ îèïïæØq5.$Š-ß<˜È1Î%²pýØoÝÀ>î mJ¦Ï7Ä`ö…m›z›Ý>)L ôÍãEgãóó'×°Â CNíåÚ Àº¼€ý-è9Ù°; [êŽAZ»a$/ÏT»)ÚzÍN Òh½hóU"©ƒ†~¼†æjˆ }íj6D{’¨ƒßöQðÜ %8 Ý“l½®ØñTŽÎL¯¥RùÏdWà ¯@ɾèe',?û$p\í,»¾ÚXlós+雬 ½šM.$¡¶is{—g»üŽ=îHãM(ôª=ª²$ÊVãóÍãŠÄ}0´u`‘Ã.9°RuPÒ+@Ø}F‘UVmÉÞNóƒ‚Ä/éÛéL‘/U3MÁoqI[M¾®Kãã-Šm¾œâ»1ÒÆ®× Ìaðm¡‰G’íe¶Ëµ-8Ö›bÙG.J:ÈÉ#t ‰T bFá ã˜Ñ c]+ìñR5»ëEŠg™“Y£éjêõºÐ4Ýdh$º]ò2ìÖVÑ»}SµŠ¡Îºî9xÒ§ìŸt{K&&¶•øŽÑ|!‰ÜÀ‡4·G õiP9}@üˆ¾4 f71ƒWPœ:`k³ ŸŽÚ?LLÖš²tIkbJ–¹ŒØNÑz'¥‘:¯§ƒ³D ¢§\Œ…|Ërã„fhç8V¤3þ†AT¤; ÆíèÑmÒ:6„­Èzêô-2Ï€ˆ ´=®Biå,aNW7·ÆØ°îþt­û¡1]tÕGfŸ ‰;‰¤ úâ(WKÐuÏæéx‘’ó‹³tr5OÉ,ýøåìêrqñ>_é]•M»«2ˆBÏÏÞØ×'#}ëì`W¶\ÂËÝöNëÂé‰ - xÊ(§BVy}r}ÒŸá9–Mmb1~Þ_L¦o¦é%¡±ßd¼÷çù¶RMN"ç­3x¿@BôŠà4†…NÏús!×s©N7V*'éÙù ‚ûmû¥\Â*éÛtþ¯Ù  ÙŽï„ýéì†7žMÎÓ9ys1§+Hÿ8K?,¦3ržŽO•ÂÁ}0-†”B ŸÎ.Óù‚štAÄö]¶çWÑõñ$}3¾:_ŒÔnŽäæ`Â|žÎ_Ó÷éåbüþÃõÉ€^xúÛp™.$?‘éÄLÿ¾>”ǽ 1-O&óôò2²œk ÏÔİm !¶%ðð»fW©êd$¶Ó?¦ CÍó,É–¢"3¤ËÛ ²÷VÓò(ÛzÖ·½ŽÅ²8=ÈfM4X áE*"ÃvU|ÝIBò‘Ãâ…þ,!9V£8*H¨…r"sj%K‘£Þo¤!(©1žìÛÁƒ!$TØ„ôáØÈƒàÉD²**WfÍ×Çí>ÏÁ9Wû5„5˜¶È{QdÁí’Ä¢.ÀãêÁ4®ª–%+ºh<^ûbÄ6ø¶¨Š&[Í)&/±v»-òrUæCS,Åoj^û‘ÅãÑþlæËQ™81‘1îGà»VB•ßcý‡Ó<0FBú?"€Lóq<ŸMgoŸ)…Wuw%Kª89»X(âÍÅfâyàŒDUïN{+÷mÇ\ùJÆÖžMËð‘Æ“ò;ÆÌ‚ªÎ)Gó0ÉLkOÒót‘ꢯ>ÀËjpøm­¼œˆ<:oS6“±š—âa–Fááíâx& Y¾Ûñb†gƒù«U‘ïx‰1*Ùá»%Úã5\"p…”÷Åúq$¸¼0Êšh‰’(mëç„Ò¦Ã3:8mÞt§!î”÷B±¥Y´bÑ%+±›MÖ„>¾˜ë{Mwn»e8Ä<Ñ‹ sõz\‹4[b¬¼ÚäB–ß¶E‡ù#’ã!õ+$ËÖ4p½ú^çFä¹ö“Ÿ9 Ûިס /Ž<4 ê“~B=íõ}¶ÞO|ßp+ˆ ¹ ‡Ä¤9XöVja´¦/>~±!ºõ^HŽ@¡•^ï°Í/HËCŒd¶ÚJ{¦ëU ÄÉëÃìw®W¶3~¤ªìL2„¿!EËRYY©ñÌùyóö¶)hERrVûJ|ÊVT9Ün¢†2d«Ú³{ ¶e’’u"ÝdšxKÖ¸ÒzÅÖ ­­õNع‚YÝŒ é¬Ïâ*ÒcMžW¤y]o÷PyÌ@'nà«g”üÈ·BâØKŽEÚï`¿ÈF5f¸š –dô32^:Þ‹z:8ËLÀ‡ì‰C+Vâ {€áŒçÄ =5nGa“êài¸1”"Ò³Hg<"ïG\…ÒÊYFQ`À}úûÓµî9EÎê‚óDQÀ]Ë£uý—®ŸJUñj“WÚH4ýr×Á¼+°+‚4ÍŽbGÅ¿¿ÌÞv³ºìX(–Ê‚ò£öó>eǶå„6," „ÑsËWBN4°7¶¼ÐM¢ÐŽL9vbn807p,L±ñÍW÷Kç*@¤D¤Ö`zýü~l›Ÿ÷%óÕ«Ÿd[Ø,èo¢ͨÿÈ––˜v»h÷]RÂq Ôÿ¦ÿuÃ}':XËŒâ;<gmŽôM—%^jd¼f`KƒI~ɦeYŸ¿÷W“DÕ|zM_eUŽVßy>?uÀÌþ˜.-Áùx7𠇞ÛA#î0î}sFVçûS6dð¼KLgàû.I¾¬öÀtq$Ê´aeu`ŠþIݰÁ4±ÒEµE³;dÂ5ôƒ_–Ë|!ôýX¬ÔQV°ƒ9Ùe7ëB}¨ Äô_ÆÁÔD endstream endobj 959 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 960 0 R >> endobj 961 0 obj 2985 endobj 963 0 obj << /Length 964 0 R /Filter /FlateDecode >> stream xœÍ]sÛ¸ñ]¿ÎŒÍ¿ÉÔ—_¢$ê¸öEV.‰3Z‚lÎQ¤LRv2mÿ{À‚ø äª}¸Ö‰£ÝÅbw±X,v¡õ2k?ü(3ÜoÇØìµÑFrÝÔË#ßO9kžq”Ã`{?á‰ÄE)%ï<Ø€ÎÈdœù0BAC”äª8„VáÄÁ€Äþ30Ë,› èðo@ÞϯÿBŠ^Ü_>N¡ù-WÀêÓ—ÛϪuHývç V¥kÌÒœ„9RqAÖ»z)’IJ¨*‡tȵp,»˜ûDZ0LT,ï=b|Ü·Ãß a¼hrËLü˜ø~÷Øh’Î{ì‰2k áxƒÔqrÕŽË&= Ž˜ÉÊ=2²È$ã"à2ûˆi’}ÄÆÖ˜æîkÝ1GÌò’\ç¼tÄ¢È ÷ˆA‰åÃi¹ù4_Üòz-0NÍž&(LC&>¥Q¡V±¥Ñ‘×äFv sUtí?yêŘ&a;·šxu•í¾x‘8ô;›‘‡’C¢²ã‘0T¾Í€ˆH‚Ø rõqŒÁò"ûÍÜ6Úˆb€w¬ý1`½V* „µ¬MPŒ*ªöqªêWu¥æÛÍç- =7íïéÊMY-ÏGá{¬[Jñ~ðPtb@øN•ç:Yïpºçá.äßQþ꘨@²`çgW.§d~ýEÍOöÌ#/ãœi¨ºrCƒ-¯ 6œ­¡= cí}çÔ²\5XR/üáLœ’je% Þ ˆjE8¬ËY~ С@‹U÷üeªÕR¾™¬–9UÙíéÁzgâÍUM–msɹ¼çF=ŠùîçÍ3Q2òJ MO¨ZEƒ ¥k\5;ñãƒÜR¼ª™¿ðßMËf³)ÞŒ…Ží"Ç~GÙ?¡Í#ß^H-q”@VL @c|Ïž³¾-Ù“|% ¼È8܈ãéF¬Ð ýô(H3ÁWUwZ¯úV©ù2Õ¼'¨ªV†a²ØßøÇ0éQÙ¡IÊœa4¢’ JBbïFœ9¾„$[®àHÁ~T„­×"F«tŸØyG¾wÍ;¦<‚JЋ ŨŽâfˆau+kмèµqÕšè×>g÷[¾¢Ø5ÈK²Ð‹Bce ¨E8Ú¬€\%£Å2H`b±r_Œì1 Çxø¡—*´V$YEÑkŒr6Ƶ혒Èt R\ϼPÅiîù4áSë"3º ‘Šur¸Ûx©jJhêeQ”§JÏ{(hàôüªÞ°º²Y×mÄy–¥8{Z,Ä©å¾×aš„9IÀ…Ái>ÙK¾´KäÎX±u‰H(§ÓðìêT#øJ„š[“ †<_ÔæØ‹ ( e¦…e½ÝõÅÜ(á¶g¥ã¯bDlzSs¬¾Ðr4èò뙘âµá) ³ë0 ðjÝôÃì¾iVCÆúê®\ £½–f›Æe4«ƒZéH¡ïcêxÑ^L¡€–­YËê%³þÓÉ¿,pu endstream endobj 962 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 963 0 R >> endobj 964 0 obj 2625 endobj 966 0 obj << /Length 967 0 R /Filter /FlateDecode >> stream xœÍYísÛ6ÿߚܹ©wmiïÜXíÜsãÌv¶Û%¹žbӱT–“æ¿ø"’’l×ý²=ÝÚ €?€ À|ë„á¿·ìGÙh±é}“<‚9¾dy>"åãm$B/D›Ø²)rèp®œ-ˆ5ú«—÷0úÔ»½‡IK„-½ôpG¸3ëýÊ=ßrü0Š"i«m‘0d*ˇÁbƒ~ml4,øìÚz&ÿçÖ›9Äþ?°£ÇÞ‡yï—"ÍW:|ÛŠ< …–cGìæt{6ûcüv”?ÿ£K4-vUšÓíù=šîÅs¹M.ƒ’ ÿ¦ÆÏÅÍ/F¤)¾æÂ_×r8–íÁ~اL:Wþdê¡ÇÁ?‚#E‹Û®â¨ý›Ê{%` ¶Â†?ˆð7cì_F­ãH¦ûð~p'¶VE‰ÎÑ[ VŸAh=í*Kу\ GW“›¹¢ž’2ÙЊê¥éV 5*銖4_PÅ1µ=ÕZ¯ÏA³‘/O1Ê4Éü#[“òq·¡ye/ÜiÀdãNOÉvK™Upž]0þU Õ.ûŠU­{¥ŠSä™^‘¨Ñò5O6éBѦ±r®6VJ*÷ÈyNÊ4yÈ´¾—´Z§¹ž©‡`iVlÓüQ+-‹]î kÆüÚDZ-ÇTEB§ón ®š¯)Nú˜sË·URQ>‚(Ù±‰U!¿£='ÙŽrNŽ˜ß@†p ÂÂêàÁ! ‚( O0âAá»–ÏÁ×ýžlž2ƒñ@³â¥`¶‰„d‰Àã%]dIÉ£@rÌšJ +dJ¹j+š7ªŒ…Œí«’]U¼}¤9-GCùh_ÍGó¿;ðø~ ñª,6ˆI]ÍâéÜð  ÏøÌæ:Þ,•á°¹„,ñDí¹¤šò±Ç²chy¡Çj7€„‹QˆÀ$¦·²LÂbÒ¹~ÔàdŒcˆÉPCªÊ‡–‡Iä“vZ¬å;N[¾äÔEL[o=“„>T1>Æž4…1ˆÉ8Ý&Ñî*±[ZLƒŒÄ7Ó˜Ê.î¶= Æ è°ù®#Uh­’U›ÓÖ-­1ÕrLÛ¶šÒ‚Fp:Ȩ›+Baûâò-;p1¶¡˜âA}9ó]O'—ñðf£œ¾|]ì¶U±¡å?€ÀI—îó>üƒVi¹­ ßRôç`zùû`zwæá»sþ-Kö~ê­È³BföäÑb‹“岤ۭ^K0,¾;ï¬&سÜÀ°¼Vú2Ž>Žâ‚* óAwñ,ÌVµNô!þzóÉ—Ñew¾ é „œÐ0¾$8ñO_(ñ§xú[wµã¶€fËeÊ€Uty3Åñt߀åwgÃøãàf 0+Œû Ò>,˜N!U}¾Ä³ùàËõÝù½®ÐÂ.íÈÖzgñ\™üÕïîl¯Ïé Û´|0NãÙ,Þg¹ÔÒ¯½¹Wƒï€'8ME¤½«¥ìYØà0΋‚zi|5óöVj6 öÙŠÚâ–ó SP7„ Xè(b ƧEÞ×Q‰qzHÆC±|5–¬ô8É VЪBÞ‚‚Vצ¡3ÑC£8‘œ œRC³ñEÜ„¦p¸›ö,oXiÂábÁ†:¦‰ã`%ËAB ©‚h”‚µH²¬oN5 ÌÍ ÎKšešZÙò€*ˆM¤K¸tÓêÕ”Ì.mciRJÆFm Åå[ø£=Zš7Z5&wQ´£Š ¤\b…u±$Æ 5a‘ —iIUöÚ׬,C%)mÄçá‡KM]‚0†òL•,ZgÎ\%¢üÖ’òrª‚q¾gOd†Hm‚¨‹¤.Jð½‰+¥!ÀKZ•)}@xɘ «»êµ$dÜŽ]¹´å\5õ5³'‡À=&"áÇ€ÂÜÀvO¿ÓÅ®¢,½"8Mëb¹ç8A$„@–õˆ™–X~S Â(¾Cß‚NôPf-ͨ–1ý0VÄm[%d}`ÓWV¤ËƒHÙÎ1Úàb\w–f©Ä² îpý©8a[\hÄ÷¢ÐÛk–YïÜ™k{ÇdôXËI×÷×Z/zB\(ôt–áT3¥ ÖÖ ô5RÍ â°³¡b&D~äí±èo“à¨È:-ƒ7_7vÑ à˜ïʼ±©ç49ˆPN¿Wy9øÈdgjdbyR¥ÏréAÀWaðóÈøûÖ!™Ãxë÷PêU‚÷í¢<àÖk›Oèí(²›½yòÒÅ«¬¡x3ûG; ­PLª;ƒ%º"CoMô ]›ƒ–Åj6m{ìqÀr›±ˆ´Çq"+0?al;jì–Ó&ãƒlÝSY*i[Ô`œ›R…ÔªYF²kMÃamÿ´­;¥•l #XpŽô’†’⾌qÕ©3Â:$»tu3wkz‡øìmTR ?Í>TKì£7Ÿ‹uþ~Î6P°œ¿ë¤ÌÒ„Ÿ¦Ù·Ü(o õ@{Ý fÊ‚ÐT¦ÅÿVŸjú”ö†!ñGôÞŽ_¿˜U²dT%ÕöH/â@R]hÔë¿?!1;–ú\öH˜Vªå´Jj†xRtÅ‹b=Úmõ’T}/å¯8¬š1RŸ`·[ÚUÒ7¾×Ã÷*v,ø 7¢ßÝ×…h¥¶Câdé¶zä®…öý®ÌwÜ®h…DµùV#S¬º¾†óÑX[ä”=ŒnØ“2³Po]¼¶¾,zb–̧+öbK“r±F`Ò2­ ü:¼7ÛõŽª¯ˆ$eºpz˜•ôûS)Ë:¨³?L&ãxp…ª×'jÕz‚n¬¹6ÔØ‘‹ ¨ÒÇ“Éu½Àß³ÀuØ…~ýb‘Å“ÆèÈ%éúž…üÅ †„¯e÷-ŽŒx¯X¿þúNoÕèâ>¦y.û΂†…fzÝÅ¢È`E߫۞ž&{ù¦z-T ¹ hm#¾".÷]Pp.Ø%í¹?½‡±…ð²ëH$ÿú}4Ž`ïÙ¶xÔ =W¬xY§PòŸ¾çºÔ@‡.Á‹ÏÙ¿×B_°úb|«F ôK¡/g(ô}¯F|‡zž<5­O†b 'ÝßGx~{'SŠ¸ÛØ{ê~Î+AhvÛù¡Äx_ǃù·ÀÑ„Ëu4®4¨¤O4©Nò‹>µƒH}íÕïsìB/7R}ßý­¸Û±¡ ƒÀÜO®:ò;¯ã¾&n®æ#5U{Œ“ ‡qC]› o•é‹ZßIãìÿ å endstream endobj 965 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 966 0 R >> endobj 967 0 obj 2495 endobj 969 0 obj << /Length 970 0 R /Filter /FlateDecode >> stream xœÍÙrÛ8ò]_Gg×aÞÌ$S¥±å‰¦{Gbâ‡8•¢%Úf E*<¢øï·4òz_fדŒ»›@w£Ñ€|ŸQbïٯ0vÈf7ûŽ4JB‡¸’ü€ÐÐ ìˆì"‘‘‚ ìl‚.§âh<’›Y9³Éï³/_aЖؖO3{Ä\°YÏþá~`¹AÇ1êêX4Š˜× ØìÈ›åÎ!ç-µgŒìÿ¹ö¦F.uþ4²ÉÃì·döæÂ'Ô&ɽvÀ±b߆Ÿ0 ‘å:1ûqH²#_NÖ^¾^–?ª¿²-YU]›—Yóê+Iþ˜-\&çÁÉ?¡Å½©÷Á÷ìþÃÓ]Sá¯g¹‚Ëña=ìS›‹¿Ù úÜXâ÷Qã +còp«¸ÕþNáÇw%d©mE½ý ¾m˜¿ïc³ÕFÉd_=ò­eIÚÇŒd?ÓݾÈÈ]VT‡S’’]W´9£ÔÕ¡!i‘¼l²ºÌ˶‚mzW0*€7–— RTÕþ­2ŒmÅ¥!Ó7ß‹AÃúaJ8¶EcŸx¡M‚@ø ¸‡µ¼¦Ìà±Äl¹|WhÁP9¹ š‘2›åÛ4èÐz’gìõx2Tf¹ž 9&Š­(ö˜rB4உ¿P¸{úö#­É¯0úüZø¢ÁÀ -/rm›†T0 dyµ^¬ø•\“³Oëäúãbµ&Ÿç—Ÿkr{r¾¸˜ºLN‘ñí«_FL½Ð²S›F’éz‘HMÞKà5¡ã¹P]¶¢(”Bz*‹Þ‹«>¿è²¸:‡qcvA`9Œ]HÝ)vŽ#Ø].æŸE¸ ãgú`qX›ë C6PG;NÓÞ\¸„ƒ-£Ð'8¶LJù¦Íê”e‘‹ëY·î²²•&uÁFpð=´oùêy1§<‘3ãáLYQà±ÜNðxw_ÕŒ x±’“F*òëQM(/”íÕ?­PÞh¸Éwy‘Öš‰SÁä]ãS. £gK¥N5í®kÍ)ÓbÓâ>xטlyûhŒÕফ›ÊÐh›m@ù´Í«Ò\ÁÈI¨ ¬k!ÕX!+/¼ˆT÷Ψ-¤ÉZIAÁi¹%û¬†Ù‘jŸ É éš¼|àã~¤E—q>YºydL-¹]á„ã@ñvÂØ¶ƒƒ \NŽ&ÆÇ2QÎNC1žùH3tÑ‘£A^'÷)ó57î¹µmÓ·$åíÛ÷ü"wwÙC^–l©Há±¥æ¼ÛTEU*ô«XÉ!ß»¬~’Xös–nrcÒùµ -åhÇ,C©NмýYô3_È»¬Ü2]Qɯϰ ’²¦Ã¨À‘ÃüI)-оւÆ][€©‚Ö‹ËÅY¢P¥©¥H7Y©Ö)L6˜7%-û™m:ÉÓI6ÇŽÓØæ~<0Î}^7<®=jy°âr«!Œ#…³€RˆHf•m-MH„eôgðÀÒ"ªƒF ì^¬Èé‘¡GƒÈ<ìa…v0a毌K7 IÜ?:¡‡0ÏmÈTñ÷i³É=³Æ›Ò‡›Ç”+õ<–\Üì³MžšÞU1Í#á™r¦¹Ê1ã¶'2-Š# ´˜¡nôBÞ)¢éWZ§€8gçÕñ‘ÀV'¶l‹°Cs;ì:HË ³+sÈü¼Ya“}ïrèKآ٩¸|"{è™vt@L&år&ì°Ül µ§×Wõ¡6‡v¿Ë¥ëO11¤ofN‰AÀÐíÝw…ÆåÎqdSíöìéA“°«R8oÚ¦î…÷rzô½†[Se]Pk¬ 8­>¦ d²žz©÷uµÉ¶]õæŽméÙ[6•HB.UUZˆÐ_À¨?ŽRú ô·4¶,L“)Š€7*Ó£{+$ؾFc©ÑPÓq¥aÙ€ëeâ¦N-÷S`¸(}l[ߨvqæå³|ˆ%}ÀX‘6­*œ!ƒ‘£Bo³ßö–&\Ó<Š«!‡ñÜ€Uˆ“p%(äÑP@µX­q†'¬ ²ÆŽ6Ý]«’ÅSrmNÇö ¼ýðxD`5[Ȧìx_W;~àáWlÉ"—òQdã©úªâ›íźãð}U€ûA@½U¤Äø¬œ\ ¢…”3ëIŽªñÆ)†# ßÞu¹Áë›D6¼JáÀ Äi<,šFä± ½ž…–M¾Èîq4°î[à²YR¹+ªÍ_ÊÎce ¾ ôôxÊp˜H/Ôï4Ê€Jb Ü+¦™)‡V*œ×N#¹¡¨ô½ž¸ñ]µ§íéP‹5+F.áÁOÌá7«…1»‚3¥ qA’É™™“ÓD¥m¾Ñ$Ul%çg7D¹8Üô±*¶Ç˜Ë…XùÖd…R£˜Ôì±±g`,£ÃÌ;0óÀlÌq”*E—¥‡V»xŒMu°4–˜ŸzuHD‹Ùá¶ø¶×hZ?t»ÞÊðÜ*¶sËMdmW—ÍiOÌØ’®7°¤_gìÐÍO—U …eSu%¿Zâ‘È‹ûøÿ%T5Œþl»}‘oøbÐ0¬ÏWgæ«ÛǾ}uûŠŒj‚ï8ÆÝèÇëóåÅr±&ì}>Oæï"p*fsb[ß¿ƒÜyrýqy6Ag мH½…°w¡ô{bO¼¼Ä`™ ì8”S ªå‹aeöäbuý‘¨ú$*JïMcL¼Á>ŒMZAíØs{YO¤t`7ÂÎA-Ø«)¥ÌÒóžäÛ‰G#(9}Ã2–Çžp|×ÙµoYñûŸ“ïSp”rA”CÕC‡ºV–žšì“žy%òÃÐ ¨øè̲€„®^‰šgn™Ø"›½öø~¬ЄÙD{¨Hû´Ogóõ‚X–ÅÌ}¥¯÷ùžUØUö5é}}î!€2ÒȦ¡6â"n”?L¾6‹u(‘/›ƒ´É¯”ƒ7üGÿ˜Ó‡ endstream endobj 968 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 969 0 R >> endobj 970 0 obj 2746 endobj 972 0 obj << /Length 973 0 R /Filter /FlateDecode >> stream xœÍYëoÛÈÿ®¿b?:€³Ù—\.@ÚÈ­ ×éÙ îC.(‰Š‰“H‡¢¬ä¿ïì{—¤å \›¼3œ™Îü†þ2£ˆÀßçòGV0´Ú;EC<5,‘"šá”äh‡ ‘‹m¥`´”"fÉ×Hkâý:kfýmöá#­Ágd¤\«¹›ýÆEŠyšEa|e˜æ¹4Áq ‹Õ½XìzÛ*ië½TDþçÞ‡qÊþ<"èóì/ËÙ‹+(AËO”áBø“¥(ÇœòCËúpq÷ËõóEóØþ^­Ñm{èë¦Ú?ûˆ–ÿ˜Í—æ˜J‡J$ÿ2¬²)z ? 2Íñ=þ'˜kp0pùhk.×ü”ìR¨`éŸ'ƒcT›‡W¥¢ög?}+™ÜH Σû ‚ásìOŽÚè"¥íÓç!£ÜZÞWèzÎ(¸}±¯wÛ€^•ûði_öÕ®jzÏ:쫽§J¿ÔñyqU = \àŒÐ¢¹9óÊòñ¢}¨º²Y¿¶ÊFÇa ‚ABÁFÊ¿ûð¼]µ®W`³ÚM°nÙ¶óë]ÛµôÕ{æU(íêÏ÷AÊ®× n ÎF»•¨°TåêÞSÎú¥çÕ½_ïªU½©õ=i–9—!:¿¶çÒ”@½ü@OßN}­V‡>Ø]›ó6?–Ûƒ  g-oßϱ'§´Í¯ïæ£ðq†9‡ZJs®Ã·Ú–ª¨Þ£¦í‘ Éú•=ÚVå¾G2&d©{_•DxÕ6뺯ÛfvøT¡¾;@˜[êŽ5è+T}]URJ*ïJà®ñÉä‡*,0ãýy’˜”÷ï͉åá‚þÚ±^¾üÙ­ÿúænîˆWÑNûêøÇgÙqœã}ՌšB—àŒÆÒ0¬¯1ÆèÒxUÕH#>¢ùÍ[$i-¦Þa–£0šcÖ!E ‘âI‡ÃÆ®ç˜Àê׿ÏoòÕ`» _ÀÙÖû>T·(€—et2JØàhÞs¥o¼ƒ LxJ§4,‰'¢*Ï$_$Í£Iå“M€&.xf„IÃ7p–T@³¹Øÿ^m«¾Ü:Fõµ4סézï–ŸëG6M}ª¶í;Rw½~,»ºü´ÿÖeh¤tSwûÞQPújíªreûr(·uÿÍ1ŽuïÆÜ2ØÃ¸[êû5æ7Þ`à¶4îÍÙ"5¾5Q ©+cFqª+Ù¥'{“iŽòÄâæn~»ôt”皥âdÖ£ŽŠŽa™œÐ=¡«jÖºcë›[M µn«ÀYN½B¡`ë0ãØÁÃAì´í' ¾úÚ;ÂdÇ‘ž]:êx_ëÆ¨()µ,ýŽÅ[Æs¸' ®V¯³K>­ /¸oݲm°[/ƒsE·¡lúªó d';t¶AØ|‹ó®CZ7ÒK©ŽûX·‡=’AƒVUõ‡Z›ê³Í\$”fd t0Ô}žIÜV¤€‚a(É XHx’ƒ"´úœJ¤ B\ íP’1k+Y¡¢-Š;ü‹ Ä”a°³!²‘ òcëȸ•e0ÐÀÊSãd$!ã’*Ù„6°ú<Ø!u¢HT¢Ú¡GãŒIù43&¼Uòî mo¢ ÞÏлï:3ŒŽf‚ã&–åƒ^ÅH‚M!Õ˜i¢ ö˜pŒœaƒ †‘€q„T³gìAõW}ÛÚÅÍòêÕ{ æ§±.Æq&M –Dº Šüvú’K$~{¦u¾_Ï—stuûîŸF'ˆÞÎOhæsé%À«Y5ò÷ÿzû´<åTÂp!·f‰p[#l5ÙòY–bšRBa_4ùe çPæ5­Dq,æ2Ï£ö¡XvöÓ”)††èüÚΡÀŠÙ—ži»˜"6¡2;ú|GY «<ŽF¡I·ÇÑÎóAØÜì—àÂÍHšˆg$ÍÓP¯ƒI3ôŒdïƒþdšŽZŸQÎLšåf&M¾ ¥Ý˜â;õàrÒ±ðÄá¶&8Üô FÈ |¦MÉ+nžœ¹üù‚59SqxMIÊŠÊ” ‚t†%˜ Èh¬R,;`¬RĹªÇMJÖ HãÐp1ðúP\žO“¢Hy2s>/ë§§ÑÐi''3UºDÕíýù½ËH~jLâСbïÏŸdxon–{YÖìÈ¢&‰Ê®ß~C% •cW÷.í(2;.ѧCbMuô¹(”ëuµ~yNJˆÀ™Èà0Oà$)Ä´mÐK7ý@‘ê»}ò‚ŒlVŒI¦ü¡'0™õZJ-1ˆ aìqV"(ÎåNû q ³²q=J ŽsJ¡¥æWV<øHS@˜œP–iih¼®ø=Qö/pJ¡dÆ#4GÝ× ½Œ ½ûÒ¢—U÷ÍKÖ»z[vŽÖÀ…úO"F,ì+’áúJd;VèØºÞlL4«jÊþ¾ôn6Þ|„]†›ÄêÆÁËÓÁÉbØ_‡?ÊïÃanOAû¦„_œIZ’ráã絨c„_CUY8ý54T-IÀH‘ó¼˜RÂ}j…ëx5Lˆ×SfÇ“d`0pÌü"÷?î¹’, endstream endobj 971 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 972 0 R >> endobj 973 0 obj 2176 endobj 975 0 obj << /Length 976 0 R /Filter /FlateDecode >> stream xœÍYëoÜ6ÿ¾ÑO `3’(êÑ:Gn6XÛé®ÒP†¼ËõꪕIk'Àýñ7|ˆ¤öõp‡Þ9 ÌrüÍp†T¾Î\äÀŸcþ+Œ=´ÞϾ*ž‹B‘@±h€ÜN„öHPÁö†|‰ÁU«%±C_fåÌA?Ï~ûmƒ)zš9#åRÍjö §&ADZòÕÃnq0XïÑ›ùÞCï+±ºóž+rþçÞÛ×û?ðÈA÷³wéìÍE®ƒÒ­IÀÃ1uà' P„‰ó¥{ôÛ«Õ/‹ãyùXýÁ6hYÚ¼dÍëßQúq–¤j›B‡H$þ†XdSo‚úNÆÊ4Í7\øçc"yÀÁ…ýð©BWýæÝ °äïgÁQª,áa¨j¥ñç£rA×ÁQ/.õ,øû9ö£6 $·­÷÷ãŒrë$ߢ¦ÍZ¶ge‹XÑ0´.²CÃNÑ?¾EÉb• H@kQ‘7í©àÍAn00Aì°DÚX²öP—hÕièdGp;(p±C|8¾Mw ½F¾ƒcôj™¤Ÿ—Wš4uœ¼ÑÚ}=ä5œ—Ž‘•f »3DU߆R·‡rÝæUÙ`Ͳ¹«6F¬Ú;#SݱzBè¹=IÌìŽA)€9€Z$ ªj”¡uµ¨°WƒN»ËZà—m–— ,Q&ô.ÓçÅÖÖbµW­Fš¼¼/˜µ®9­&Ÿv̵;ö¼1‘ r¸aÛ¼ù¨Œ™)©Õe„qìûôìÝ"A7¯ÆèæõX€ìñ&g_ T`…F½ÍJ2Ó£–‡OSÛºÚO,Z%‹ä<Õ¤IXÍú^Ìô®:MBZL¨8dŸsÅ9¬wF®ÑC}x$)@Lžqc<U@PAM)+Ò® %FüÀÉ žXÝÄâ‘ÿ˜=fhÏÚ]GQnZm+Cß¿;_ŠÌY±–ŸŠ6+×lâDv|®>µ¢Áwyº…&2=²2M1dØ$Á-iJ¢?Ôðwð7_ |x¬,üåí²æÈÊ(Ç]u5âÄØ…ÚîúØÜ=k5*7¯ºÐLt “—ôLC$·ß1ƒ&ÚjP€Š= ¡÷Éùâ `?oÆäOc4ƨ€‚c©X%©%þýgàOX ¢>äܨ µ±ÛElB>ŒFøBíáãuºp"b/PQ†ëi]æóVó­‹ú.&NGD}à‚v’m6¹hlm%®¸Ã4òE¹­ è“p76M÷åE}^AÍ[çÛ|-®Ìì[ÛŒ•4€CNyC Êÿyš,yšB`Óä2¹JÇ2Q€#׎­|ïCr"-ßÑö{]rÔuCŒïŒ z{I¢­¬åòeª&,S%ìIyËꬻ2 Žø '‡™Á–…eIÊYŒ±Ã7–ü—su™ä2ù‡z Q ‚[Çâúú“‰ÖÍkŒæ-oíM¾ÏygWñþG+/ìë«Dó\<ˆø—üÂ{#ð ¾ãÑ(ê>éÊ] N¬O¹œÓò5ð¡c»4î‹äì×Qª¨ÿ…ø'Ú!vt endstream endobj 974 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 975 0 R >> endobj 976 0 obj 2084 endobj 978 0 obj << /Length 979 0 R /Filter /FlateDecode >> stream xœÍY[sÛÆ~ׯØéËIfœÍò¶$Û43NŽœº“8­­œž™$ã¡(Êâ„вë_,½ð"§yé9i3À]û°Ô×™Çü÷Lý§>Ë·³¯$óXì³@’(’Ì‹¹ Û2b’(a•ZØ#Õ"ƒNJ«‘Ù°?f»™`of?â÷’D™¸"ß²çç[Ÿý»îVkï•"ñ?÷Þõ(ðüÿ»™½ZÌžŸEÌl±¶) }žFþÄ’%<ðSõÇg‹-ûøäê÷·ÏÎwwõ—bÅ.ëC[îŠýÓÏlñël¾ cv:ºDòáÿ˜wÙÔ{…¢ÿÄÉ4#·Røòe á~çQ* .ý«h2êÀ‚CªœÍÃPu¨ý“ÆG%V=Á“^<¼(pàïçØ?ŒÚ(ÊöñóˆQn-6{Êž!Ù“·óÓÿÌ-»o³¶Ø»ÖŠòlg™¥³õ°‡ä4\[[º*²;gaæ<É–EU¹û–Uá–ÿcSìŽÙ('®We[4à÷jâ'î*‡Þ;kËmYeÍôQÚMwõÅÑ–M‘}ùYô@ÿk–íVì×ì.ãìÕD-SP‚Ý¡à,y½½­°ÈìÛ³lÏî!ŽFŸŸ¥ãx†>÷COÏ Ðü ÄÛhyÉ~üñg†‘}a}ê°©Ì“Å2åè¾¢âˬܗ»6ÿ3/nÛ²Þíõî‰4Kî˶‡)Õ°òf—U J"¶²Ìe±<¾² Ø-UUß[¶ÅÌE¦Á²è<­Ý•»“éB†[ÙùÚÒ:å»/ÛÍÎÏ,]7–~}z5·\^ïVe‡ÝIOÏ(«< 4žªtêN¤r†Ô4&Kâq8<(ð^ 3†ãüÍÅé[½CNìS.èH2öp …ȤÐ#Ñ÷ n¦©„äéWF¶-ß+3(Â7i‚Ž£¸"mâÚ±׎¶hÑ'—Ž[×M^|cï§§ÜJu)"±Ÿ¸5¿Œ¯ŠféÄïcµîÜŒBîéCú¦¼ë<@ε€’3"­´=4ÎôšA—êÆTSL)ÛÕ†¤3œLú÷¨G·M}›ÝPY¦½õ´š]^Õ]¡ÑÈò¶ø³u¼ÞQLÃ>Š%V¡ÖCM¿­Š}kñöÄp÷Yá€\i•t0 Ù‹®p€q ¸ ­c8Ðc}qê-)òCÏ”ãÒ&«ZÊÁާìè\º™êV²SÝ»0á1{²ÊÚÌrhé¦Ö}ùe–±Õrdè¸zŸ9Ž~ ¯ìþÈê~1FÙ«Ç¿b*ìâÛ·Å~ŸÝ8ŠÂc–¦Ûf_ çѺ©·c$½¤$€B©t/ÀY8ùʈ\“(±þ"î"í*Ûßy¹.]p!¸Zœ.æÜHN •öm½=j8¤—Ù ^7v§¾ÅŽ3F$Tý«ù‚åUü± Æ  ™¦±Lh„±Ót@§A¼4"5ÓhÚöd #À©Ç°wYu(¬¦v#¸«éwó««Ó7óëÅü¿VøóøÈÊŽˆ…ç§4%½€¯Ér˜A¡S6ªŒUÝ@Z½dŸiÐ~"yâÅixÔ¡/çßìÑ€ôôSèê)õè¦øŽ.@¼$Ì^(£^›ö¥§Ò^{àˆz­šdøâ£›5±Ø­5£Û5ñØs‰é½‘$SïÝ÷¬§*ü/ס£‰Ä1aPIk‰EJ‹ô¸«ö•«C3.¨ àý­6[b/§öueM&\ê« ÒÅz]ä­åu'ÅIB*n´Ã…†ž×ÇÖ:Ý–DÔn­@U¨ãV°>4ªMZä{ÏÜòሹüÐ4€Lõ0ÆZ{¥/ŽI¢êEwÏ­›Òns@ YFÆi( æ0±´‡Š0Çi­n¤‡’tBQ¯ WþMׯ`I9L:S¿mo8eÔ ´ºqÚµ]W.ëšÎþ^É”k‘HÓ0‰é}iœ+œÕliK¶"ÝÊ"%[ö*¶ìl©ëµ´åZNTk9Y¬°¡×£XO\Ch„‰¯¾ÕÔéè«û­®¶us»)÷ÛG*oy<‚Ê&‚â÷®†©³…g5¨¹ƒ4W)ÃYÆô EÑË›BÑ||¼8àa‡Lbº2žÑ…' T%45Œîž(Õ—XäV%T›F_ÅPFÎìÑö°wWlèÏ#JnçmÑ®Cy}€û=w$æŽ5å›ñß‘•®Wy¦†ÔÁáÆ0%Ñ&ë[ç[)z«>²²ûM™oL8ÀÚƒ‰˜i˜&©ðzàÃ5:Ts—Ûk?Êô@Ú1=ÌPäâŽúø†Œ}BÙŽc9× 3½Èè¸LØ:¶Ý±¿£å¥€V$¼4¢¯Ví}ס†Çfú~Bß (‰-õBíÿd$mn‹¡Nã¼V¢Û|Üt1ã$0h¸ê¹å$eoýî£c\o€Ë6kó µç'ÃÓY©•+ºçŽCŠT3Ú‰á²<¯›•k‡…Ž\ÖøÁk¤¿v%±Qï´Ò•pz­Šå—bŽâ¦ /vå¦0À(ØÔ6Ô•OƒÕOuŠî÷†vlCF<R§f±Àõ„dzE±“` ¦¯I(‡¥U­è#–ÀÊF‡vPYëó•ÙeQÕ÷ÜòïwÅÈGS® DZÅ9´ÇÅé»ß¬ÊZåèÐuýÕ£]OÝŸø€–57‡î³-7¿À¥0ô¼Xýp‘Æ~Â<Áš›h‰("~ Í TÂP¡¾£' ÀXϾ€"˜5R\´e¡ú*íŠ*%rU¬¯Øü¦ÂU¾HoøÓ ÙH¹ l‘þ)td\¯•aˆDDþŒßáRéO˜ñvЧÎ}G¾eCÐÆ€¨ ˆ«é› ÝAÑÈó³SÊ’ÁÀ¥1i ¼8¢;þë˹øÎ>\¼^œ¿¿`Ùî.Íõ²€é·¸®›ë]}ÿéIËLú~z:JB)`N}çÖÌØå|ñáòâÊîïò$÷Á?Õcçg¬e/Ùë——ó‹Åµ}g¿Ì/Æüˆ' ADA¬5hËc?÷0ƒ€ß‰Hßó·WóñÂ0àæjÙ3x•~yÿáò§Þ¯Á˜­ÈÏ endstream endobj 977 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 978 0 R >> endobj 979 0 obj 2367 endobj 981 0 obj << /Length 982 0 R /Filter /FlateDecode >> stream xœÍÙrÛ8òÝ_š—q¶„÷±ÙdJ‘é‰R¶ì‘èIR£)-A6w%RCRvü÷Û¸ÁCŽó2»¹Œnô…îF£Aä¯#Yðû5ýÆZnþ8…ròd‡8°"´Eˆüm(akHIÄÐeXAÍ{ôù¨8²Ð¯Gü D+da=Y=á\Ìüè7PîØ ¢8Ž…­¶£ˆªpqƒå½™ltZ2ji=dýÏ­7-rmçÿÀ" Ý}HÞœùȶPºÖ)88ö-ø(®Ó_J·èãùoç¯'ÅCù²B³rßä©_ý‰ÒOGI*–Éd°DràOˆY6µ&|ÏjÏ™¦ð =ìr`°ãÃzèÔFWü¤rè3gñŸ#DÌÝP1¯ýÊG%¤Œ¶…£V²ØöœbCQ& GXÚZì[vØ]£©$G u:Ryyé©Û‚ۻРîêo!ž7D ´|¡Bk(iNW·°ÆâFX¶|Wµpõ< R/FQ+ó,Ð ¤"éJ¦§hrÆ3Ï £Ö0Bˆ3£Ï’Qš ³ëé8\NQVÜÜ—ûêæ–¬ËŠÜ”ÕMQ>.Ž”N.’Å«ž@×Ç^ÆqRõ,I¯gÓ9ãèÑ{>¶¨àI?ÍÔô(}Ö’ãЕ”}þ˜LÑ{4¾žÍ’izCU p=îÀÃÕãX¶æ–¶µøßöxC·ã$­ù[ÕÏ–ýOË‚??+ÜžS å z {ìãåõ¬¯:vÁ=ÀzžæLÎç}GÚ–ÃcîúޯІ£¹ëš14œx ¾Ñ*ïa+¦¼L´IƒòíHµ&Ëfó„ve]ç·‚šÝg­òõšT¤hЩê¼,jT®QsOPÅ'”Õά7Ÿf)*+6¼š_ÈÙKs\d]s âÆŽÇàlnÎŒ4ûªÈ‹;tš5:«Ê-ºªÊ%Yí+y ¯,†|qX™/’‚‰¯ÐëÐÇ!:¾¼N5VªñdÚšÚeU¶% ¬Ô _ëq¦‡W³Ëqrz=KŒÙÊP¹¯áW¸S“‹ï ×ùv·18²ÍžÔü«§"ÛæËïX\™Ìýb_=dUžAÔk”,¶Ël³¡QX–EC¾5¸/šˆÐ‚й¨£å²¬V” tG6¤ábÌÃÁy“«¬ZhTVÓ"‡‚/HOÒ\SˆÌÚfO†äMmØQ± 3áz¿i4\“¦~Á ¤ƒ4⠧ܸã)ÈÌšŠrmlpPèçO(>Ö‘çp^¨!·Lò†ðæ>Ó¢352]Æ1ÜcÒ"á¢.›®Sì··¤R Û*ß_V©9вÐF˜¶n6ÆJŽA»ãTm[Íó2kh©ÂˆVÈ$3Á¶¬Q†¶dyŸy½e©;êíür6Gpj¢l¹$°G!¼À„¶%È~¢PU>²ê—õí ÜŽ=jýÐ}ðõ«1_2ß>™h¬€ô>¯ •c² ÔØ¬Ò‚ïI¡ž|¼‚šz›ÕdH _3+Y±¦µWÍjä¤*²žÛí69w¸ÂA‚ÝA]Ø ´*uwútúaŒfÌcsB#*ÖÙΖ͆ú¼¡Þ€*w_®˜ÿ™­ˆYø){ÈPW³xi½ßíʪՀ?>Áñ90`Lb;ôâ( E£ ia!¡ÃâÆ%)¸áqူH‚,ûù°Rç˜+ò‚¶ÒR`ÕùΘS©#8ùÖဈ tä°ÚÖš¾,6O xÈ3c!Z!u¿1´âŽsÆ zJÀ^jÈ–—/Æ1Ý¡"`X¡Æûª.Ù¡Äa^ÊøxE–€Wz²ÐãrG cê1— äfóñm¹zÒlëAåmÙ´TÃõ¾âÊÔ]ÉD+«ûŽqìŽchûTV[¾y¸×åHl?:\*0P-¬K×2™a>‹ Ý!$ßÈr/·JÀƒâ$"W&,KÚx4ääûÖÞ &}_¸nǰs–%´/d›SïëòößÐeÖˆæ!UÕO¨¼¨¡PÃÆg—(Í ¯á,Õµsn2páð<¸™x~« à6Æ“\CC¹,¦ 7ëZƒ¹1–=‡h5Ô˜Êx @Ý×!;Ù¸ÛÉ:!¸úbËsãGçL°íAk÷/ÙK4佂Çš2«îöÔ‚¾Ó‚ £Â~Ï»²{èc¬y{hÀ}¨ê½úÁ€H* p$û)>^ò3^@­Ú%p Õ»}{½/–ìÄ_¼Â;Z7lsKv¡!~S2ßVdë=9À|0|4bväÂýÊ‹qGš/_¾,žó¤g9ÏIÐ6ðç6WThàv`¯†QG˜HçXy€àìªrò@$,¯H `çH™]µBÇÇÚs±t:–@ªñà—‹²"¼RÔÔ?rF±\n±z8‘7°jP¦JÒ³¡—ÅV‡YÙãôxà>çã[¢†Â±`žåCѸ¨™{Íb˜T³ås4o$ i¬aÒÔȬñR4k¦M!Z/o@ŸRÃmiàMHb²´[©î)¢8ZΓv0E`a¨%¢Ý6ç„•úƒá´=ûôÛlFÒûIt0²Žg?'‰<`å#ˆ5ª€¶WXÚ?y<v½íZVà‹Sp¶¢È·L^ö9â–@‡{r€ºuµå(8!Iů¨‘é!ÜOLB^ÔÄ.÷u§yeLÓ³kxÒ´XÕˆ^§> zžœ'ãTÃêìë;Í :NE˜~S7®é–å—Y7æ>áG³`çžà@VcS…¼ùskªSÅ>¡°aEÖy‘‹îKÙ±ÜìW¤>Àr¸N¹1¤c§§í øåôëtt1aÍKäPA³d~}žjxž¤s ÙÏ4Ï‹:¡Ûj…Ñ×r¶¨Þ‘%ÜwѲ¬*þM.b›}Ë·û-~è4õ¶­y·FÉtÂÒ <ˆX=Ÿ~ªðü˜>ÅÑïßôÍjvûÉ‚}˜§D.'’_õ )0±Ï÷-ø/”>°z:ªý1`‘´%Íñ]8} øÌÏ(=%N[‹iÆ‹§ “vikLø¾¡ä±µ–+1­7•ž­0u£Ò1ì%o,-§pT×'ϼµxAˆ}ÁºÍGýI· 7²J.Ž×yU7´¹F¿fã£ÙâØ·hw7…üÀ+‹†ޝ8,õ$qqy:9›$sö}êt”ŽÜèb³mm÷eE½¯‹>$¿N¦h”^wŸ>°Ké#ãæ4Ÿ`¡bó¯_è þŠ þt6»¼€‰9HMfsú~ô“SôþI¦é$ýJÏØþÛ„où°ÏË6Ÿ@&Óy2KáGziÈü}t~ XŸ&g#Xò R®ÖÎ=i½…ÌÓÑÅÕ ZºPëX¾ñbty•LÅ"ßR¸Ïæø½È$ÓÓgj¨ïCããqh9ÆSCv í‚QÿàÚ(®¯pÉg÷à=ÿ¢Ø¿õ¾ >úA„AŸåÏÔGJäp"µA5Jly-ˆï<~I zÏïé¨N9êÛÀùí> endobj 982 0 obj 2960 endobj 984 0 obj << /Length 985 0 R /Filter /FlateDecode >> stream xœÍkoã8î{~…°÷aS\êúý¸ÃâIÓÙ 2i×qw°˜ 'vß:vÖvÚ)°?þ¨—%[îLïËÞu:°HI$ER$Åþ12ÿ.ñÇ L´;Žþ`8y&²\†r\dxš«ûèˆà;>ÊñÂÎ/aC‹`Ùj ЧQ1ÒÑûÑç/°(Aºæ ç‘®§dÖ£_€¹ãj–ëAÀd55Ã÷1 Ksa°;¢«ÅÑD×%YͥDŽôÿ¹ô²D–aþH¤£ÇÑ»htuã CGÑ^¸€kj£Ãç"_³Ìÿ˜(:¢Ïãõ/ËËEñTþž&(,ÏMV¤õÅ}Í#vLBƒ8’ ¿žF¼©3áØzwFò´/°ðßÖ,ŠŒf:p<•3ã²/žàC‡(‹~_U#%mhí¯dþºU<¼ÑÐ5¿cÃq$õw}ì/ÖšbHÌûõóèŠo- t.áœ67‡Té×øxÊ%Ä6ÍËgÆbxªÊ]šœ+iñ!®PÒÌb%ѨÏÇ´h$L‘Hò<—¸½Ôµ&p‘,ý‡ëw3Íâ<·yºnâ&í2ÌØM’Tdê=k¸xM‰ª´©²ô)EXQOq~NkŒ;WÌgAc1…t­›èZ`†‡­x¦c`¯êqü,Ss\XÛ×Î’hf½4Àö0«ÓÙ#²Ý ƒÉ1FÚŸ£¹Ö›4G7×è;§o}ú ÃS@Ÿ/_ix  h™LÃó¹„x»0˜¢©21{\d¤‰#"‡é,Åa¯/Oñíàõ¾ÁXp®-Š‹Óçͤ‘ Õ3L_¶ïŠÒS Å(šiï}€üÞµ·qÔ§ö-‡úô,œO£9º ogóëûpŽÓæaw®›ò˜V|K³-VÑ„xô>«ê¦ˆ)úuÎ~ž†›±£o.èdÍm.r³ì²«Iε©×k]O£©²Ã 4Ëßñnþ¤›F·3e=ØHÇŒ–B——p3³Õíí‡ ]“Ûš‘{ G—NˆC?’B¬æy öi¬çËùŒ)éo›dˆux+¨O„¶nÂÛˆk¼FŸ~žƒ0üRý¢ýSáîû=+"4_]+Ë Ý­ÌÀbÖ.‹"Ý5YY  ¼¦i*}ˆP]õ©sØŽ©h§*=ÅUŠmÆ?™®ýk‚ðïæâ‡ÍÅ7Óí)“Ðê´YÍflL`…ÑÕ*‹ü…X L¿—|ÁõÀÇÚX‹êCyδMP€Ï¾¬h¤ÆTUæ– º„£:Ì<ýšîÎMº l;à¿ °ë3½®!!’óüD¸i :µ›ì<9¼"=è±Í/ Š÷MZá-ª ŽÓ³í+çs0%Èjy^GÖÖÿTQ­öЃ¥ƒ€[yNxRazõ!ÄyÙúQÔ5ÇĤ& Ã$«Á1p&eˆ¬à#Zwá‡ø)æãe\<žãÇvîN!_3Ÿf ©P4E‡²n÷V¬l kAHeÏ®É_Š‚ wx,uù¿ (w°2î֑РV9^I õ:ezïRMåhAq<–>» \·XXu5Äy]²á©¬ëlK 6 6®9*f_Vá¡\a\“îèÕN”ÛƒÎû<ÈÕï2‘kB"òžo:¤¯,i/ƒª Ûê©‚ÚÐp/ íE£µ˜Å¾Rvt,3¤Z½Õ-L+U6®Úá±ìì©ÏyÓ‚lÀÐCìZÝý îØG ’5.‚tÚÊDP£AŒƒ[é”ÄMUÕ@<誆E>L¸ÿQÞë´p4ž¨–iÊRB‚ÝÂKË‚ÇÌx.È5«ŠªŸíâë«ò( ^‰S¨ÎŽYWA|ˆÅÍÑòSÖd™H$’0²ª¹¦ÙT«j. ×5ƒ‹²Quã=ÝliBÁAºA8€òˆiAÌíEL çSÏ Çg ;„ôRÕ¼!ºùÁ€kÙ¬è Eôº´@ ¬óBÛTŒ+Î@8Á´EumJPܦ(!ß\ÞâFf‹/’L¬Š_¤Õe%íÄ!°–ä‹Jé`U ·F"4p4ÅJ–Ãr! óÄ98°¯CÁI~ãÂħm2Ý “T<\JÌßB¼›8#ŽE±XX¥b]¹o‡Uù,–§ñîÐÌ}B8“Ñô@áH’F¸ƒÛŒÀ¨ˆóŸî ŽãëÐ)35T[AÐSfž÷qõö„tHÓ)S¢tœd;li–ÐqVô&w‡,O*âY }™æ#\(±H¨ŠÂ‘´R¨Š±?Ò"©©r]Qè)®2fu&mòÐ9;3œJ'K$ùÕ÷¤aô4ÊÜÁ&½Õ‰FZˆ*Ž÷<×[¨K¡·¥=°-%6ÇL!vuY–¼²£Ü‹5MÝ€Z‘"¶b NCÔýT>ÂV æ±3¸å6ä?Ã5ßca4’Î4I耒=æ¯]zbú–æ!Òêó›:_6<§¬J‹´¾LÝÔ\ÜïvÀlÛÖ|ºŠ÷`$íëH”Hs¥¿¡Ïƒ×vG‹ê¶äqmO 0Š÷äÄ!k{)lÌ©÷$áYï©£¡¾Bð_dJoé>uÄ¡(EšoµŸ .ª¸¿)÷Ÿ¢é»åH¨ßŒO¼çD¿CopÛ/Á”<‡QZ¬Ösxƒ’> %ôëty?_½Õýr9AÜO0qÇ à¡ sb“¯=qÈך¸ìë rö!¿úœ—¿¨Ic \•Gže¼DÀÑ%Οq ÔH‚k”~Ý¥'²ò§||¥Zd†fÃù|§×©»¹_Í¢Åí ‘ðÑôõpâšBá<ºWk ¡iNS{iºÑ3Bë»ùlq³˜ ªðR·zOëßïÜ™ºfÂϽ¸õâýjºÄ{Ö>Ó6þ“×ê^(øºJ`ª†·ù9ÎI±‚ böµOëšdä”Ç;þö¡Š­Ì 4f1‹¨"Ø8Y;ºiÌÚ´kÆk±ï(ÎñÅ}³é¸¾¢6„®ç³å4œ#ž7[#ÃÌÍô~É Ï_T·uàu×u[L2ÞC^–§¨ë¡äë꯿¹ yà#­Kz×hÛòDZ–Ô¯oº¸^O™ÑÆiÄôy6 ¯à‹è· ¯À­ÿŽŒ/¯tC]ÝUtÛ£JvÒÑŸÊ7'K†®¸k¸ÊŸ¯®Éù¹Îö™Î€Žéä ì²EÓm;—ýe÷?eõÓ¦ endstream endobj 983 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 984 0 R >> endobj 985 0 obj 2533 endobj 987 0 obj << /Length 988 0 R /Filter /FlateDecode >> stream xœÝksÛ6ò»¾Å¹‰|÷æ>(Žâ*cË©%§wWw<´D[l)R!);鯿ŃxRŠÜk››ëcŒ]»‹}aÔ§#¹ðï ù§-ÖGŸ8ÎC1F~ÄQa„¼Ø‰Ü­’0A%Y¨ É>ô)–¯fÀ ýxT¹èìè§ŸaѹNˆžŽ\‹8#3;ú˜‡‘ãGIš¦\VìxIBXøNƒÅ½ž¬1z[ÓÕ½ô„ûÍ¥W%ò=ü? ‘‹ŽÞÌ^¿ ‘ç¢ù½t;ièÂ?q„ÇÇ)ù£ùýt<ûáüdR=Ö¿æKtUo»¢ÊÛ—?£ùû£ñœ“Ò Ž„á¿Ø¡Þ¤M„«Ï(ž&ð ÿŽÏp€qpç!S%7.ÿK&úaH•ÅþîT'¥l6MEµöW2ßm•˜lô\'ÑìÛõë>ökÍ2$áí:iày1YšÆ8 R˜lŽh¢ ba A\ °9º A”°,ˆÙ‚’`” v¥¨Nèziä™:X’Ä:M–ZL^kиÁD6y«ð~zjAÈÉ †Ó b°år¸Œ¿k‹ñU¶üäld\x[ŠÍÙ\‘œ K¹Ÿœ nÚV‹®¨+´È*TÕOè.GÛrAQ!H ¨í²._çUÇ“‚BЋL)zO%ãóñéý ½»º¼@óÑ›óñÍñbU”ËÛ¬inŽñÍË›—ŒÌ@8¸ÈOœ0€žÏ N*ôø>äc"¬ªüs'¡üs¶Þ”ù+‰É”}Ù]©ì|*º•2ùTK`Q—ÛuÕJD¡Œ›¼Û6èEÎVm—g ¢¾WP$‡³g_ ë§R™ì=HY/²rç¹³¦ ËJ¡k(.óE™5p˜¬Z¢û¢,aHC”L ÖäT/Z1tDŠÚàÒñ©wдàE¡ã‘4÷yÆAä9Ì…DI II¦DÕƒ"–{¾N_`ôTaK‚qâ¸,bxv€›,T‡ Ãó”É\´Ü%'úä¥.%iÔGC’¿`}âs=WÒ3˜%j(Ã0¦l‡ä4U5<·™šÙ“Üà.u#²6N™—Ÿ^Gó1zw==O.§ÌsoiÐÜon7ÅM¦ó›—èj<¿¾šÎútÕôS¯PsÛ/²‚*N(ŠÉ¥3vÍ>ŒO'ï&§*§Ûº²2³“½qô{AÖ·3šnߎæ#kGš8 Ùa,¸MΦ£s²e6'ç|AovŽöC1£óùøJJ{uy=ŸLÇ_•Ú{šG~3>›LÑh~y19µ7øPöΡ/6 ôv|z>º3m÷L›$vËD …½û†ŠöTüìÞWê „ÐùiÄa_pÜUÑåpG-¶MKê"¸.«ºC›ºm rãf-½Ö*‘é.oÖEe\¢+ro¢‡âþ.ó \©° É³Å*_òKÓe9K…pU¾~çƒ5LÑâÀ £(MH{GE{Ÿ=fè<«¶ÙC.:5ˆÈ¯ß_‰,E’äði!DÜÁÐo0’sZRA`ûèø!¯ò†Ö ¾Ï3(xòV huÆjËØã„@=ê 1nW´ÚèÁ»¼{ÊóJÀfr[%×Á©Ä˜ë»u¤oóÝòªüõcXNåC÷¥«ª^bÝM“?õ¶EmN«cÍI¡Æ!°lV¶¬bj7ù¢¸/à0êZz"r ym¦>yæˆ\7ˆÕ' k Ê©—_$ÄjJ6Îä:ƒ€ÊÞ+¦÷N`U¦E‡T÷ »€×y·ª—ÏdµdÛ¾Rˆ2•ä ¾ê¶(ÝoËR9î§mV[M‘ªlmßN~:-h‘:±èèXQ …—9 xjâ7£¶ å¸yMу¢¶è¼|0S:²ŒÐCwyY?½àÓªX¬t‘òvP|Ñ­‰ÉZ ¡;(mÅÀ ¨+†“é“ ã>9¦fºðBÇõH¶Â¿€ýâuÎEÖ­œ¶¨V7ÇËzË;’˜”‡ÇË=¹×ƒ"(ö¡Ìôbo€¾Px…˜/81W£*‡a™Üåêíy\(ëH&ÙþJÜ/Û¶“PYü:àQb)«¾ »mQv'À«—ô6ʇZ.= Eû¨ÐÕú'2°Ù¾‚WP¬+P(ÐÒ\ƒèÈú8°xp”Þ´ Èø®.O€þ–€õQlðQeR&xë¢-XiˆTDâÀ:6ÖUdòæÒh3ícJwH+¥i‡¡,åìé¥üJ}ZiEÉp3Åþ*ãkRuÉ&Š!ìpH¡ “8鋼óÑôìzt6FïGGÐ@Wr1™NfshJ¦—¤³±ÈnÄzÄ dÆÿ„¤šŽ.  ‚îb6û0šÿÝ@Ž²Û£C‚%Q¨W•jJcïBpJZh®¿tòe°Ð ‚Äñ£:<í RªxÆbcy_0X\ öRqQ3P\Š $w¢„v'õÔu<Ÿ<Âøé€”]ýI?dËe¾œuMQ=ì<$©%=ò¨Àý`S¢ÐŸ@© øùjåäb(R3iE=¤‘>‡Ú6\C¢`åê! 7ˆ¡>‹=òREnãÒG5ïpÇEl‘x‰âIDbq¬Â‡$ ˜b‹G9Ζ'ô|ðmìâþ%-ô°ªˆgÔçX“ 6ø¨2)<ÓiKA#–Dâ‘õ æ,z®¥å][Í`¦}LéÉ»švÊRΞ¼@ÚNÀo“ЇóîoŸ·›lysü½™œÑ×’eñP@uBÇëìs[ü–ïx´  è €~ Q+_žXâ>ý~t…>Ž®þ5™žAãìºCûÓÔqÉþ8Œþ‹,ºÐ‡BiäúQôÕ,^7ΪýT.¸sXZºîŠÒ±³Õ‹=99ôIÀ‡iâ'JóÛmI×F’ -7yr½9ˆ™E½Ì¡Šëè‹ÿ@BqÊÐåw¹öM® H=¬ô§¹ý»ÒO`'1¤Vön.¥e2Ù¼py‰âa$i0OVáC և®Åƒ£Œ(' À‘!zqöUøpqúc2Á:M ﳎ²(ÔFÑ ,\F^2d=áXr¨f2­bvHºÑ”ÂQ†Nöd›0„‹Ül8à-ÊŠ¨1x©Áb Ùavs\Ö0ñ˜•ÛüDAG^Ky,c d¡d¡½OoWGä«T¢=‚ø˜\’¦Ë‰bC`_ã$Ü}Ù°Ž™üKV¿R€÷vœˆ| `ù qkÞìq(ëX§ÞÓ®Ûü¶}ˉˆ ~²Å¢n–DÙrw­Q²shêcŸ,#?߇ài(„2ÜuùN0ý’Ì>ýÀ¾Icß#+Õ!ûEèzœàý?)`äi ‹'Vx±dãEŽÅÔâå§Ý”4N^̉ù$@gÁ¡Abße’žš“ï?ñK%+Z“Üwë¯ÿÊ/e&ü†HâÚ¿"™]ŒÎÏ¡ @ƒ¿%Ák9ÃW}áÏskd.œâwø€3àÔ-ç°Ýó\Cñ Ó1TÚÏðÏP›”íY.Юê¦Cuƒfd0è4+DP¢†fVÐÌ¥*ƒ‹¾?Vö¯E«Æ Ö™íz›ŒöN¨‘P|lðÛö;™h ¸‘8 G†‡*ž"ÀþØ·ßk|ÏøU„þÎÈ7 ®*òùæÚ­‡ö /醶h±­ð·¼`‡÷ÍlÐéfhCsªdÏ22)¶ ¾'U—?äÍž÷Ýÿó¾~ôûâþ¹a/ØþAŸ<×؃Àî¨7œà›E}ò‡Ç|‚#~§Sü)>ñ-mÈ œ×ý›-ÿíöGÿJûÁÒ endstream endobj 986 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 987 0 R >> endobj 988 0 obj 3047 endobj 990 0 obj << /Length 991 0 R /Filter /FlateDecode >> stream xœí\YsÛH~÷¯è·qªœïcßh[N”RäDV2›ŠR)Z¢df%R!);ž_¿è»y)öÎìLâRæpìÐ>4šCÏ·#ð×sòÃ-4ß}ã<ù²=Îr=dúØ3´AœÜ­ÉÄÚLáC›rùlFÜ ß²#½<úô&-]twd´„31WGï@¹ëaÛ Â0ä¶ZØ ¢ÂÆ æôb¸±ÐyNg ë‰ ã·^·È6­ŸÀ"­ŽN§G/.\dhºT)àY8t øã{(À¶’?šnЧã«w£çÃì6ÿO²@“|W¥YR>ûŒ¦¯S¾M*ƒ&’û˜fSíëõ'Z¦I¾âÂ?¶8Øra?äÑš—ÿ$ÄÐ¥Îb?{ÃEi‹›¡¢^û;•÷GÅ' Mµx˜®¯¹¿žc³×Z¬GÑž+ÒÞ²MFmšUJ(‹PjltÙb‚%½BXµÐyôÜbré„çVMwªÐVu+©MBS™él‰Ý ™Åü†Éûsà ‰Qêøý›Ádx†P^ óÁÙðM4êLË1ô¨ÔüipÕãóè`±Õ¥w«ÇU-Rí@Õå?$"R®Ñ°êÑÑ8MWçÉ<ÝÄëÎ ¸ÌÅ, <ôœ3jþæ&ïOÚŽõ5\ÔžÃÁ +ðëÊö¢¯CL¾Ž?_ÕoèÛ‡?¿WIm‹PŶ•?¤ß„û1Ø6ü‡q7q¿]FS†ÁË÷§£A/µàëN}|è»VëëÉ«z<:#j×1ØÌˆž`=<jéÐΆºü‡½á9ݲG|‘ï®× 8õÃݶpjp?{MHì?D2ìE»ûÚa´_UEš­ú1îŒ?5ŒŸGÓþc\ øØ¿0°¿Æ·1.¿­ñy\í9Ã=ÿ€ï§†ïéðM?¾µ€ðýð=M7{ð8|?E|_M£7o{A®Eýò§ò²Š7Û=/ß óõ§õÓá8š|ìç¦Åüô_è§÷Uòéóp›ÁÜOÜ——£A4îG·ôºat_çù:‰3ò^õ” ÷ ÝvHjH&“è#Ê—(ÎîQu¿í¾°QÌká?`þƼlÝ£¢ˆï÷àݵþI¼[à­.Ä[m¼6Ài©Åнf—|«£ X?iE˜F{ÿ[º–?KxT¦<® ü8OþiÒÈ’?U(¬?W)&I¹[WWI¥åÅ^Iß0 Ó⢆Kô žgÐqu“(¢Ü&ót™& Åz jµIª›\{š–jœå•"–ù.ÓæAK£ÖTÚ¢m\Ä 4)4^¬¯,’jWdš½p,jsy›¸šßôls‘,Ó,­Ò<;ѵªqò}žlÉsæbÝ™aØp&u‰ìq§e²À‚¤^¦£M^$b\ÝPEtœg’} }òÉRÍ—sx(˜HJ%ßÓ²:Ñ–dË5mwiu#%G¥ÙJÐ2"‚ÁÂÁv(‚ÁdóPP"-[¾²À™u_©¬°°£M‰"YÁ&’‚y3y¦Òqu—+bfYvòm—ÞÆë$«€rÔ3æ›R1¤{„$ž ”X¦EY)’y‰iùûfÇÓ}R™V»¸b›, +J]Áú^Qw,VbnÛ‡–Ýð¡Š(ŽÑ¶H7Ê· JáæÆ‹L"Î…T»¼þšÌ+ò0|ÜÀ2>á%x[¡_\„ÍÂa!60 \è5Ûf¬sñ=@Gѱm{ßZj[¿bÊžv,¦upg+<Úg‚c{û¤àÙ3Üv¶ãbÛ#„{&›ö;‡’‰%:X¤„#%xé0V«¯Þ^¼žL%]°ÊM±Uª¥r9¾KN$™VrXÞ仵R|­¤„§Ý¦—é‰f Z¾- ú‹*D9k’[Ê$Z7“EÛo.ù<Ÿ‡›E–ÔŽ^zF9wD9WT¾ìYF¾ÆOù×øJóà‰¶ž$øàM±bM™,ëŠÅÁËäÉúÍSÝ„r¥F‘‹t¹„bÍu]…F¤« ÊþB·¤Ãs^Øðܵˆ–A¾î…&$0ÜK'ƒéûÉø äx6ÉúM˜ >D“ÃñËÙ±i³gý… ±áxaè~‡ iã|ïJe²ÊËÖnà8X±ÃÍS©˜Õö`6T–ôK'šöE²8RƲÈ7’àIJÇ¢S¢„j”ؼ\Á!X§»JŽÓe§Øl·¹¦‡1#s5k‘®x/EÉxYiót öE¶¤·yš)½3–Ú³g]:â–#Ú> í†ÕGà°Z06¤x#•%.VÔÚ@¶D²L lA½' x¾ëSU"ONSº1Ë"žó ÙS¦¤ '3YYì²y\ulÖ6ÜÆfIÍr¤j xï..2ÒRt^TÚ‚,zÐOh|ìií ¥–`Šê((Kt”¨÷ìŒë”ƒ‡Þ*gÇcôN½eÌ\cÈ›#µ«_ #ÁÐj=7K—v~zÖ¸ÉèÞ±Cé4S ÎRÔX&]ÍJ¢ Xç¯u‡¥3'nò;b¸äÄ<MÅn^颵qÍd¿¬Sñ†“Û]±ÍYJ V™$µù:Uæ»bžÔŒZ${tµKšíšÒuy±Â7pg\\㯋ë9&; /š¥,±¨Ë6ù,¿~k´ý;¡‰8LØÛ|}7™-ìoÓ[Ð ä¶lhµ ÿÓ¯›V [x2ä]h)è\Mâ!¨„NWŒ¡C­°j%ù冎Å)] †~»aÚÄ}’ü§BÉíÎïͬ{1žóŒ=Óź#9?o…Æ!@Í5¢;myr5¤N`cîFHØ12ÓŸÑÜ`C}ã½ Ë“®¥É-­FúªRÒi¶GMª¤Ä’1Ì:7¤ Êèëdß´ÝçvÝ]LˆG_0ðk%X^yõ»})XE²¤ñö¤=e‘§yØ«ùÉÓüëɽï[Ê@%¨a×t^DÕô“ŽIÚvdöêÑðx¿Ùvš4œ&ò’â‚¶—å6Ïä|â{-¡W¡V'eûœr<›f†®)ÞeˆØ u®X ÙYÝœ<¯Ä…&†)š¨„ªINK2• ŽehØu9ÍæëÝ(N+zFaùŠËÀ¡cš>ùMÌзàb‡LT¬ŽÈEχ2ÀB†ä÷€+œ jÑ’¼½#¯ßÄ>›µ=…uÖš°tIkT—,_îap;l¾C:ÀMMœ%^&¶”‹¹žãƒtPèp{ÃÐ0ˆˆ´:ÔX =ºMÚƒ ¢;ªM%¿0Ý´¨Æx€‹È|Ëå*”VÎ’ï[ÍNkjkƧiÝiz‡±ZΑoVCh 'â ¨9?oÏ&ƒh:@ïÇgÓáå²ý 4EÅ—ëÎíäK^|Éò»Ùq…È·yâZ¤K Bì_ü7,›ß€ äçºú‚îOdg;bÁø’ «5Õ5쵆åÈ©£hüò}ôr€^G"ô6šDoÓÁ]M?޳-Æ„úýÀ&þ ‹ÆÑa=úíl]]½¦¯þEúl›ãuza磤,£ìxä·¶\ÛolýQΤ:vxÔ%9»¶¼Àëò¨ö¤¾ÊõZ¾ês«çµüñ¿¸Õw¹ô¹5tûoºµJÊêÛ.)îgÇ)ާƒ—ƒ ¹4%y†ÓòI­XÏŽ3ñû`³c ný'ˆ ìF:¡†×À®ó+z0œGÓ¶‡<Ëny¨æèö Ûn¡i¯Oy«L<‚§ð/rž]ðã¬Ä«¤zGüÄ®¿ÕþgÿYë0 endstream endobj 989 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 990 0 R >> endobj 991 0 obj 2893 endobj 993 0 obj << /Length 994 0 R /Filter /FlateDecode >> stream xœÍks7î»§_j_fß>nFu”ÄÛIl¥¹™(s³’(iÛÕ®²»râ¹¹ÿ~ Á×>äú¾ôNמ ‚€d¿œ¸Äÿ=ãâÔ#ËÝÉIsIì?’¤0"nL#'!;"‘$LHÁ; g‘ /¨’‘-ùxRž8äÕɧÏÀ´" É×g Åܼ‡ÉÈúQ’¦©ÔÕ£n’ð)|°Ü‘ç—;¼¨·Òž rþçÚÛù®÷ ‘C6'¿ÎNž¿ ‰ëÙÚ„@äÑ4tàG$¡¾—òŸGf;òéôîýÕ³Ëò¾úƒ­Èmuhó’5gŸÉìÍÉt&—)dˆ@òàŸ˜Šhê „Ó±"MÓ þ ¨4 P/„õð¡B:Wþå …±ðïQãHQÖÇ}W «ý•“÷JÌ?tštüᆉeþnŒýÅV8’Ï}|=Î ¶.Kr#~BrÚn™…½Éî3 ]YÓe^±u^æm^•6OVÛ<™=´®Š¢úÚP‹tSµì XÄj}”ÃÚ÷V?ܲæP´ÖÀ޵Ûjel“w´þš·[[mt¶eDÏéYñw0m¾ô¢*K¶TZú>¸ïtŸÕLÊjjh³mÞŒp’=œoʪf+Cøºe–ü嶪š¼ÜŠ´"ʈáê;š°'+rhl-Új`ߣ¾IÌM|4ÌžÇ Wgy¨kV¶äÍ‹_/ÈÒX©­Ä°PRê¦÷–CÓÀucòiì…A A^oN`¦  NL‚Âò«Ë=ˆµ5l‡g.(€†1l˜ J5VpL~Z-Eï::n¹ýͧä%ž-0U"í9‡¹4ŽÁœ–<›ð´É¹4¯+ÜëI·•°vD(Þa奠¯G‡ðKpþГS˜Y%I©ÓŸ[j£a¿¯ÓŸª`™±5tþKIÒK!°†1„K w.ßþ°(ò%iÚ¬…?z/Ïò#eõõŠ5ͤ|]êùiwð>+l~Fþ5Ø 4 °b×ÌÔÒ3T™”3ö1Ìÿ°%`®{EOÒh»ý£ @¹ŠÁ|©C]>_ìú¾†4ÃÂ|Ïl ®›Œ¬µ»ÌØw¬%Ý>?µ²«I!ç$‡¼’ƒÚm …@»4ý¶d{Á7të%#vä¿;˜Ÿíx–jZò‹5]Ö †ôøüt~öÓP0” —¯-ˆ{‚kÖê¤Rö--«šŸ~w7½š^ÌÈßÈËÛ·×dF>¾žÞNÉ%ù™|G~àk™%ˆ1„ÃÈXúùK¶C/æÝ$ ©ç:N›E|!²íUVnÙ†‘wuµd«C­šÊѾÁsêy!DƒªyBÈ^Kx­EjD“ïò"«‹žßׇRXj=/6«|½fP –øÍÃêê¥ül+ô¥ç0sÍãã⥭ۇ=#Ðèâ"ƒKVÿÝ\¼€\å«a0{&ÜÊŠ—<ª@ŸíR´#lè Ø©ªHÂªŠ°2šùÔ|ûafÊ’pyCç—5‘eÕ¶ÙWåJöHV­bÒ"7ÑQµ…Ù4¶`.bÄ`‘ƒJ‘8ÒcY 1PgÚU¼=(«òÙ¾†jó{&<9â"êÈ ÒÔQ çˆ|yót$,À-9´Î ·~V®ˆ06hº9ðí±Î[X08 ¤€™ öŒ˜>Ä’†:ûN5„—>ªó›48‹'–ÛÕ^Ct™•f¨‚½ö ÑÖ‚a…°ˆ*q SëÕ„…‹‡¶£KR4$ Š™¶Õ © ƒ(Ãi•Ö£ß(…FLu¥k²c>ð¡c œ4 ]÷Q ø& TuØ*ç)Ú\€2ûH¬*50²€v•ù²V‡5¬ç!€ËÍ—™Oà¨Òfe›C)ZéáFAbÿHØÔQ¥Ãâw¨gšWxS@hc€)õ‘6bÈ{]Ûð=rÆ[:W™€B^j÷ºÁÔ~RáwQ'„Í¡ñ™5ÆÃ0kÑ ‘+³%jt-Ü#µÒíh%/k5²ÍŒâ7Z18(ÃimÄlýºfÓ}iH¢õȵ¡ë˜ 0f¼Í4¨<¨ƒ6îTAØg-LYR…Ï ïáékÖ/)8M52¡íA¨Ö#ƈÞ1¸e<ÞÙޢÓZ¬óºiÏ ® pˆâkb© 60/â­ég>}ShV¡I¬ªpF¢ÀœŸæš(ؤˆ:Ž líVç£bdô!¢£o d™3#ò&,2f>3W{KafoIå±^)CaHúCsº&ÂØ|8<ÌU¥(ZI"Æç†ØùZ/Eâf-Š[8Îàxу°×$i-;#Çlz‰XÙèøç21RC™Ù2¸ïFìã¹]û˜œ‹ê‹™.ƪ\‘IIÀ2høBÓ0ÙÃò¸`ñà\ùf­AY1Gšéïj¶ç»m„IW ¥rfá“kø~×z+ó‹4‘x0ç¥ÁÕ}@¬[9+*D4G¾ìøIF}õAuäc‘M jÅ¡”´¶³åvdÚOŸ-E宣†ô²ªG¬„]kµúäÂïøõŠäBÎûwd¤ÙV‡brKDlñq ³>åQ ¶æNÛªÃ^Ú?ìqý¢ˆQ츎<1òs’œàööüôgXªû÷s~@8|°m’Úc=⵺f=cI U~«=zîòáÁ+¡©v¯€í|8Ó·™¼í™¸ܨ}€yKЪ²xaÐ$™y¼ÊÚL#Ù¸†OƳ€wY™ïE¦®‰‘ÁÒ2ÃÚF5af-êH6JÓžMÌŽŠ=qÜÃÑ8ìY +Ù²ÚÁùËà¸L„k¨½‹lù5$© "Ò¦rÚŽÍž Êr›•KZk‹nÀ¦ÒjŠÐ¶Í–p°ôÐ<ÐeôÌ£u€Ä•*ÎËeqX1w–€$™ÁÛ! S!˜x|–e‹‚5c|,Ò`<ŽYcI4õ êp€X}°Åb !¼a%«!š4…•àçåX{z~ÏDÐZqã³r×9Y ¡Z­ÄLV)IäK^ëŒBú‚¿>ˆþïZ~ñ38……ÿüÔwœÐåéŠûÔ‹¹Ù·l·Ýâ"#˜iÈÞÚH1DçšÖV&M‹ÙP!’ ‡",û3Dtk$å†u“ß3£í‚Á^¥•;Ç”´1®†óüÍm¿ ;…qÏNÒ¤ê¾DÙj•7ËÞG,ª{FxZâBßÝ]?å=%ŒRêò'­H<ªÄPçù[´ßyS £„FȤnþ-¾&X‚ÄÕ~Âë˜$ƒ9$©ûØ1¢OD4RâK}„ÿB!ùØ2˜ÆëÍc½xXtùâѱPß üÝß–ô”·Ž:HhóØHÑăs—Ÿ¤Q·ÓÉlJÞݾ½˜¾øp;å·îÿ„`j««çÐ蓜_€ÍÎÅm˜h˜JhÈo“ۋדÛùièÌÏp°ÈÆÆxÛ:ì Ïu<'Ô·Ø Ç‹;qò{1™M†Ÿ¤~X¸“ªO®&7¯>L^MÉ›ÉoÃ/"'¤|»‘~l˜þc6½½™\‘›Éõ”|q5¹»{7™½þ±ª7t -ÓjA[Ö´tÿ縌q!m¡ïÉ¿Îä=«ö5D5&l~*ž/àØx×ÖPÉÀåhc‹ ì:òBùÁÀŠü'Btø'/"‹ëY–ÿPOÎgò i@iq¯÷Sç¿<ù¤‘ ç endstream endobj 992 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 993 0 R >> endobj 994 0 obj 2825 endobj 996 0 obj << /Length 997 0 R /Filter /FlateDecode >> stream xœÍksÛ6ò»&_jϸ,ßtúA±•TÇN%¹½Nœ¹¡HØbO"’²ã»¹ÿ~ ,,IÉÍÌÍôÎMjìb±/,v`¾œ8̆ÿ¾¿¢ÄeÙöä‹Â9,r™*T2'²B;f[¦€8ˆÙFö†‚D =‰UÔ¬Ùo'å‰ÍÞ|ú D9³­€=Ø#æÈfqò BË ã$I”®®åıáY! ²-ûa¶uÙe%©;í#û®=ÕÈsÜÿlöpòfyòÃÛ€96[Þ›]+ lø‰B[ž›ˆ—-·ìÓéâ—«ïgåcõž³yµo‹’7gŸÙòýÉt©Ì”Ü\ÎÞΦ »œ,'l¼(S‹"/îV]M®ßÝNÞMÙûɯ“qbµaS„až¯W\þ~=ù0»`óéâöjÉÓå‚9ã•Nb9b¥þS+§[Nçד+ ¦ì»‹«Ébñq²üùuU?XëæË&_Y-oZk ÿ³ |v¡\ö±K¯ß%yñлýjSd¬iÓ~=VEÎñº;]´uQ>0ÜŽs¦@¹ Jó¼>Kõ#ð%ØÐr5úÑYB³ØÝ¤´ºzjØ-°Ú‚ ›~Íø®-ª’ýk,*€Ü% âž0ägŠ#ÂP!Èh´/UH"%%ß c’Ä!ï;œ vºIˇ}úÀ JWÀ† Á´ÞÏ—“ÖtѾÁ¢¨À¢¤”(r¨E–nn›–%¯ ‹*ýqñ`ju}°(§ê¨"© Ê’Ø¢n™ózä]&ûÞ2²]W–q%ù\cæ²æ‹øê0—i›jàm]m5 –¬—jáp]=é±ôÁµ½6ã÷—o.4p‘n6éjÃpT°äv3E …ö>Íø!Þ°Ê|ì׸Ä4Hi™‹bÿ¥_èus»”¨ÙµÕ{¡GÓ‘ 3Ù°_h¶M?«gI¡%X]d{øƒÈvØÈ$sëx$²˜*>È.¥yád¸Q`¹pŒÌaTM˜çY„ òÑ0¶=A´ë´5: tg¡ûª6@ÿl©µ%¥Þ—2VÉüÒVDPγ H&ËñÜ)¾D,æQ òOÂ=ÓG¦ ÆGÿ¡fÐÂ4CLÚ˜±Qat¶eoÑgh—œ\w¾C£°M®ˆŸw”Z¹!ªtURàþˆ4uì:Õ÷»]U·ÔR!®!Æ,éêÙõØ“£ûžÔý±ôY,Ú¥Ž•>ë¬ìChE(é¦ &¥Jþ Òzöªym/ÂKJ/RW’e˜&4xÈæƒçA’>x±7²Ñ#6ÊqWüÔL]§ÏdVííôvJxFÈ;I@ômD!¸0]ù "útn0E™mö9':ΧËÛùõ ®o¯ˆ´›qxyÁûþê–¸®Ø…·Ëó3J26Dݨ¿K£®¦ýúZêÒL* j£€³TWzyQ¶š}Ý6•¬±¨F]lÁ§XH‘Ä×OEé1ÏÝøp$yàTˆ-a4ÔÍìJQ‘ñ(c°»¿K€† b´;$dÂá{ÊX EY&ú¼ 8؉1'…ÝâåôÝt~ؘ7³w0oàÃÎòä{å#艟ð vÇ;Ño=òͳ5f·C/ôl; T—/ »’CT^{HbªC+TgÖääHøú†°>'ë5ײêF*Ã˱ήRíJмY=qMÔjFü+Ïö-Ñé€Þ(`ì'¸´öý´ªòç.˺›^¼#.5îJ!tQAƒmr‹¶@— Ï´/=íº ”¦x$ŸÚ=_u¤Q-ËxÓa“CǼJN̛ݣÕá0öYâ |Fógèˆú{qs½œÌ0"FŃ‚º ˆŒ‰nF´×̱ËWr&+BVó4· ˆfiQ„]¯L n¬ý|:¹ì«nñRð‚!#oùv0ðVg¡o[±6´Ç+C³­òâ¾àÒBÄHqˆö)fÔ“wUÓb›Ôêrzq5™OÙÕÍÅäŠ-§>ÞÌ'óßÙròæjÊàঌ<Ûž³Th|ÄŸ•s)ö¥Éª? PûI¡¾'‰ËümŸ*ö$j¹ÞÉÄCò ^òð…†%öCÛŽÕõÍÒ8î˜èR>¿‹¸†í2÷|ºl„ÉF‹Df BØOŽˆÓÕ•¬hŽˆ•N–Z·\Í‹Ìéô«u‘ç¼|ED—ÄŽªÜ<ðTô=õX`œˆuL¯É/À§–A,é,”óÖ@Øí`bÚ‘sƒ,uZ>“u_F +8c=³uU5üˆH²ÁÈ3˪:Ç—˜?³¹æ_öôhcGvÔw¤lûÅ câ8šñ=ÎŽ ?²}\æç1Õ-Z—DDCȃ›B´iL÷º‘ _77²‚0ßàüB_ý‘¯²×}Òý¦}éðuô¹Ä^dhTÂ=± â7uê: 1ÐJw»ºJ³õùt癲>àTߨ“Wêé2çE¤h ¨¢c©öóâú‡q32ß½ ýŒƒ°èØÎÐf„Dk8uP‹fÍ Ã.…TJV}j'xXü…×àµËZöúCZ¦ÐÑËB¡ D÷µtšν~!èX…–ƶ›DªJŸ‚Åì'Ö“b=ðÖPÜÌ»³_xÊ ñoMbê+±o*•ëïY~ÿyÈ×ÏdrÔߟ¾òI 0> endobj 997 0 obj 2953 endobj 999 0 obj << /Length 1000 0 R /Filter /FlateDecode >> stream xœÍZësÛ6ÿî¿“/±s6B|¦íÝ(¶’*ãW,¥½NœéPd³¥H™¤œhnî¿ÅƒøªÎÜôNM#ìb±ûÃb±X@y:²‘ÿñ/?$(^=)ž|‚¨§X®‡l{V€VH ” ¶š\D5©à*iI<¢Ÿ²# ½?úü„ÈÂ.úzdõ”K5Ó£`Üõ0õ‚0 V‚í à&(ö ¯ÐëÉŠ ‹\H×è¹"ëŽÞDDmò€ÈBGogG¯ß¹È¶Ðl©CÀ#8t-øø 0%!ÿ4[¡ÏÇÓ—g“ì9ÿ-Ð]¾©’Œ•'_ÐìÃÑx¦¦)tˆ@"ðÇÇ"šZ®cµ{ŒHkøš ÿ;˜Jp0qa>¼+U‹«¾yGÝt…³ä÷Nç(UÆàîR ¯ý•Æw¯ŠÏÚZëa{–áþvŒýÅ^ë-$·máбmŸ‹†>q:‹‡#žh@ã[ˆZØ3BCKÐqfC/­”·*5°‡]Ë=»‹Rê@• õé¨Ö\wR»Æ mMLú“\ÑJI[«iWóWH5Ïìžu“>`Ú ~–ꃊSé˜U8,ÓÁ hXÍ]¶ºSoÂ:DA+ª-È0vÀe}*#úün<šÑíÝÍùøâÓÝ­‹<¶ï'×èÖF“ëÙ)âM"›7Ÿfè–òöý‰Ü†jÈw~@"³m•½nÇç“w“s>ürtýþÓèý}ý4BãÙøîjr=™Î ûêæÄÆSé]Œf#4þ'ô_.ÑõèjÜ39‹ CßÂzy~9šNoG³ßäÅ~,ŸÒÅW¬¬ð þšVyÁ·03¶Ø ó9r>yùâþä;© XÈ !P˜QàIK“  3—/ßqõÈ4±LвÒ$û­Ö);Ý!]› »&mË”ÂùŽÓ·þâ·Å<~³`Ëh“Voâ<ËX\%yöb爻OŸ´bÕc¾ÐtRêö¦d ¬É.( ZìóA¤›|oy=»sdXM“ƒwç;ŸbòEDÖ#„`0m¥="R¨Þ»š#“V#¶¨I@Ü »ú§¤úHHèc š¡¯ Ðƒ¼b0£2d×éX1*]µDyhuñ´x‡Ëû¡2Q[mX­ÜÙGc.TgaºØÉ¥¦k$§ç™}IÕÆ…”ï»õÆ‚Ïz3O“•UTÁ×sž,P“wBkû‰orÚÛ¡- e!õ •ŸIV±VÀ”ÖôþUEþµD¿Eφ$ˆ!£Ž¿ÅlÍ7úW?eC…C¸˳ÛfΛý‰øVE? Œ…tÂgB‘ÛƒxQ$Ϭ¸Š²ÐáVi…÷»óX“M;$ð.ÿèY‚ÙŠ+ËjU¡d ØMßýñ v'À×î¸pU˜}cñ¦byr=ßÍøÑwƒ®~™Þ^ŽÑO£ËOã)t¢¿ÁbÂ_/N_òCÇ~y2<7Øáï?khkd§5ßÿ#Ïݱ–`Ê*T”à7ÅÇ +¶`­d)¬z…–E¾ªÁ Û üAÛ·wŪè"ª"‰=ËEɃ¤æ¯±¼Þã»(ÎÓ&®P\ºYeçùf×ÒÛ…užßQ·¦Ÿ­/ Jm.ü¥v³¼?æ6UQwÇÌa^qš—lÇÙ}ûFºÎ€/þ=P+ÑN ¼~P”ÂišAbzfhÁâX±Õ¿&Õ£¹õ›“·¯7 s½ûs^'§¨ä·' ’€{ÀHèûÚÈ% –{"ÂòùUœª ßÏ,C¼Ê)E )f#jH^ŠÄQšo¾P˜/K.ñN;<8(_ ‚Ϻ”‰£ Í”#ÑEKÎá2\%> ¼¡ÄÃaHà õkµêÞëÈÞæR¢Yꚣ5ÈÛ‡IrïyßéÙP¬ÎlÏM-<¾a¿ð ú¦g†tì´0éŽú^hŠrôùÒE 8½i“¶‹º¶k4æ‚u×§‹î§åÅê:gOC)¤ª€@¾ p`?Fè‚6š§ú¨­ëtTå°=k¢»·É)ä@Šáœo+Ø3yVEIVŠ®‚U›"“[¬¯Ô¥8l˜™KµÒ>и.L.gZß„íSrú',õ »‚™Ðñ 3±>ÈAJ¶¸'-ßÄs L€ˆŸ_~nÙÆý”"ÛëÞOáºø®ÔrÉ¢x‹¦›õ:/ª}·Zâ`ǶŒÜ=“÷¸øè8•zúÇíšüjÞpÊÚ§š·ûJëXئÜçÜpÀ´z€=ÔCÇ£ËÉhjÐßg°ú7ïnîÌîå&M·ãi¥É2a ƒ÷Žƒ”·ÝÞÂ8Ô뀦wz’ W\ã Í›YÞ4Ó<ƒ“ª!K¹X¬à,’ÎÈt‹ΤÒÙù•ŸUäŠ÷&ÙƒV uÕ<*™VezpUDY™Â²êîJ£Ž´Ù5‹“(mèËîÀÚ÷Ž\í¾ç¡ o ¾ût}>›Ü\£ï÷¯A845 ™"‚].n2m,7™,Ay°ß~z{99GeüÈVî#ó!z-†^@[{*¾ ^-MCÖÓœûM;ÒÍ:%¥_^”`98¨ÝpC°¬’45H36$k¾1P.¤»\"ßu$sR ë†ÄÄkEµÉ$¯‰ —p0;ã\Ž‹uN°CWly »ÃÀÆ¡Ës ôqM|£j£aÁ¶)˜&Õ“–$xìiJ®ç€˜¹8ñ~6 ºÈ¡D6è§M^<5u)O×ýF6;T?€!=·½!âO…xÛÛsÀ¸ÄƶKÃÐVø¶‚§•Q³²ä'üy•eý»ÔàãòkNZÄ ÔSÁ[>Eßá¡(N)}å«3î’hKE‰)óF”ÕjbŽ¡ÑUª™4C²ž1dÁ…G)+êðO"ê„zL®óšS?‰òöì±±ÂkzÕÊWP>¬’²™Žð[µí­ëzß$\‰c‹Í“‹¥VĶ„Ø-qÙH¶sq»‰Y2T–1‡6$@ƒ#½Ú6Œ»“XP!ú”?ò¨ê¡].ϯ£¿òðÜ ÔÝ«°Aù†ßá4bö »VžgJB`MVyßµ^ÐQËP™*`pÄC¡ILS;½”ÎaPwÀˆ¸w¦Qö€¯ ºvzÂOP?°,7 ´ €"›.·ê\—¼Èèf«$ΡÆ8+y9['hÙ™&ò ¥uihàÎ6E•Ÿ°æŒtӈŮÁÝÀêÌIíÌ3¨ÉY¶(ë¶xvPmüªn%M%ÎïEMFMG¤5¤MwZ4ÓÍ:¢$UG4R•S!·ŒŸJ¨LÆÐ2/Væ|[·ÊÍNèjSŸBá²ï0þÜÑqC¯Ð=ÌÎà¤üýþ¤_¡xü‡g~ -§ù‘ŠT¿¿ 9ƒ‰Ë÷ˆféÁ‡sÆx§›€Ä~TØ2ƒQ/]#¤c¥Hw¨g€–(÷EÉ8Ä; ï»ÊDmµaµ%Ð ÕY˜.¶Cž$L×(N×3{^$> endobj 1000 0 obj 2855 endobj 1002 0 obj << /Length 1003 0 R /Filter /FlateDecode >> stream xœÍZYsÛ8~÷¯Àã¤ÊfxˆWÊë*ÇGÖS»&–kv+㊂$V(R!);ú÷Û@7’¢7»³›™©ô×úB£Ñ€æû‰Ç\øçLü§>Ë·'ß‰ç±ØgAD¬0b^ìDn¶Œ@&¬{¤Bd ¹4Á†ýqR¸ìÓÉ×g´d®²×w$Å<žüÊÃÈ ¢$MS²Õw¼$*'"ß²÷w[Ÿ]×r´²^rÿçÖÛžÿ`‘ËÖ'ç'ïoCæ¹l¾2)ùNºð'ŽXâ~*þøl¾e_yüýóÙ]õRãKö¥ÞwEÅÛwÏlþëÉ͜ܔ2d"ùðoìÈlê}gnÿ‹•išo¸ðßÌ ÇÁñ©¤Å¥¿ÅE†2Xø÷dpH”5y¸T2j¥òéU‰ÅDÏu’Þzx‘g…¿ŸcqÔF )tOûãŽrk¾áì;‹acÇì—lQ¿Ø˜ÿȶ»²7¢,ë×Öfä9omFWÛ '~Ë»M½´ÕäàîÕ”—YÛòöƒÅÂ5x›½ ÂÔIßu£d6r¸nÖΖ;¿®„D%c©Ù,˜–a»_-'íp™ïÑ~¨÷Î?ë}ó¶žë§ƒbÏsä5Ä’7šñZt `‘ÌHT¤)ˆËè‡M:äÏ<'‡A̦}+‹Å¤W¿!A[°ËòoÙš;šq_wܲ5댫£>ìšzÇ›î`Æ·«ºC­• |' üzI€¶,ù êìò”U5£Ïëªkê’(½ª›-d0¥Û§ä/¼tFrC8'=Q×#å>T¹Ìrm¯ ¬ê„6YKÔ‚óŠHmÏpnvd¥•uÙ"kÕ7³9Åê“ùˆÚ®(íveÁ[‡à|®<«´]Dð<ßw„uUF!ˆÂAbUÇS^Hrßò¦UàuS+r“½è1I¯›¬BÅÞüãæêi~£à®)^Š’¯¹Yë™Eç(rÞ×D=9¨ÅdŠø5{Ñ´ “„Û}ÛéñeÛse8DGĤáNàŸÊ<ËðCŒ€e.É­5œùKVTm±äò»4ë-%¥‹§Œë¥ ©YÃî ˜— –ç†Ð‡àEsžD\®1ùØåzÝðu{ñv_å]QW­¾>~Þx~êÄ1¸7ócø÷lhi *¡( Ky H²"‚ÿè8¸R+,”PŸ‚2;¨ÁY³Ž•'ÑbqÏh©ÏÚÄ+åCŒËŸ˜;ZM*dß]%WîY~ÔöÆRmȶ¨ÖxÖ&T› VP¦%±^7ÜTtmÉ”¹`¾X30jJ_lyÕÑÆ—̧ª,¾YF¨:CE•›@(¬8K‡ò´'g,(Žý`}ã‡×Z.%t^0ëúîq~w5× (AP½5”uIrÅ Afi40žÐ0ËäXK‡ d"±w4ã3†dÉÒj”ž •™£õ²¹/¼ZÁž‘ȱŒDÆ‚—uµn5–‚fkªÍ7|k ì Mç™-K“»ºZ„ýYâ$.õîè+õÝpíëï`dÙE 9EkM(_³ƒ…­š€ ZQB3CêuÁ’ƒL}‘š‹FžÃ Ç-éì©GÆR§xd¦ª‘d0Ô‹Q†ø‘;ˆšPg/$q.œ2<ÅÁX,AãÄi ‹¶€œÁ$±•zr6?R6ýØÚIÎø‘ltVšÄð ­‹ÈŽrdp¤2‰€×ÑŒ¹%ôg·Ïåš©]B°0?><|¾¹¼ŸÐ¼)#4³¬àjÕmÆQKfƒ¨™d„¹A*nsÔl" 0 09ŽXÖP?Ò䂟”™éw÷Osú›yèúqA ïöMÕ³L¹&Ä·D¨$G)QZ K¶âÉ ûN!rú%+÷"Ë…z°Gº[D׺x\/q\u'”:¯¾Ü\B/ùéÓ—›O‚º}‚&àîá^I‰ŽHÏ‚¤„Ý&ÿ]57gÑ¥3€"Í@lRå´O`(ÒýCN2Œ`ÍÂÛ§$Ûb[”Y£1žÏ’ÔW¹ŸL'·¤±±$©càV4È]Ý4gúé$J$Ž\7v“±ïç¸Ö2qcÙ+”Dùbúz¸qLˆÊ”¶Þ‘÷ïoE&­‹.Ž_8;7ž\‚4pRñªàG Y­ê™ëÚ›GBûì“ ó ÅøðáoФ´$d²“*I>×M–„ß÷YY¬ ¾y=—®žÉÖ½;ˆ!΢ŹÐèœÚx z§·äôÎAÉYrX¨&S'ºä•EÛY"ÍÊ"£·²¶­^< ¯26߀Žô‚ä"o/˜þ²¨—‡é$¡°w}Qu¼Yd?KÎR'íûƒœ¾?Èþh RFÑrë!‰)¤¦’†¶Jª¡d %¾5F¨SFZz©Ù@@w“#ÍvI 2:^ŽÐD/—ôx…ì,(=QsPF²Ãüƒîž­^_±^àÈ¢Îþ¸F‹¶;Lõ¹±…5üû¾hèÁ‹x<Ë7c}ç•Þ´Òq® u‹Ê±~ã€FÁ  feÁ™Ìºdˆ$y«͠㘉sÍõé-…6n8(<¡;LiÁQ4ÔEHPç%_uDƒe¼RC¾ÞÝ?+R5êìôXA?ƒ]ÀÀò^Qñ\Ú#çõv›Læ0ÃT¢¹ƒ=ƒ]ç$2¨œÔ&¨ñÛ«› ܆¤¾hC؆ G‚èÙLUq Ú2εCôßê»æ»Ó+„7Åz#¯Â$oßž¬¼4 ìâD¢ð˜æ2² #YŸT½r„åY_1ßXC-²³õ$cÛ:*Quä‹r°UˆJëx¢UmFFäp·}já .gfÖô»_HOY&ˆvƒ‹I ®ŸH[Wfd¨+3¢«‡ûùåÝý£á@ºœ”Y¢ðil ¥ñJQÍ[û»5¸á™eGš•u™¥¡êQ?0ÐDùm'žbŽZg`W·ò<Ž$=™HBƒŒáê_.dÄ #»~”—æëËù%Ý0=™‹±ÚX´ñȯ3Iì¸Ðo&qL §:åó8k?œöNGÍQÏ ½÷µÖn¤õ^J‡‡`b½â:Ö/+§šc=œÓhÙü§ÊŒ@ÁqHÄ»X/$ø˜yZ÷ Y³ÞãÛ—fµ¼;5¨¦»í°Ò#Pg9¢F>ÕÀ|# ÍÒž…?.# •v·ïø„m²2à32n‹Jl Ë:ÌM¥SÇòˆ0{¡Žy¶­›q&Gž7ˆ$XOõTf²0ˆaM§fD¿Hz±K³ï¤zXž™¶B·÷ÈÜÁmŸNÌЯlÕ:&â‘™ªàÄþîÈ8:&d–‚vÇsy3²ôOùJùOÕN¿¢G³Ù |”.òºìÊE­MÓuYÒù¾iÐVÄ ÞÌ­úe ¡å$2ðÒ?’¿¨ë’ã#»Ä·—ŸoŽkP¯\¤ ²¯\Óº1ýOYÕû?†þY„2 endstream endobj 1001 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1002 0 R >> endobj 1003 0 obj 2777 endobj 1005 0 obj << /Length 1006 0 R /Filter /FlateDecode >> stream xœÍZësÛ6ÿî¿í9‡!øÉéõfGvÕqìT’{“‰3Z¢dÎQ¤Â‡wúÇßâE€å¨_z§¶cìØ]üìì·Œ\øç ý%ZíN¾ F‘‡|"X!A8rˆ£Dƨ M:D4}Æ£9ñˆþ}Rž¸èêäó´F®¢ç×ÎÅ,N~å!q|'I"lõÇT…ïh¬vèílç¡÷-­§‚Üÿ¹õºE>öþ,rÑöäÝòäíeˆ°‹–uˆç$¡ ¿ˆ Øñ½„þ<´Ü¡Ï§‹ß®ßÌʧê?ÙÍ«®Íˬ9û‚–¿žL—b™L;Hü9ì4 :ÂÀöh'­ç+.ü8>çÇñBXí*ÄæŠ¿´C6Cÿ{!J›lnCíïT~xW":»N<ØL< þáû›Q³6’ê>¼×:[éS†ÎЀ¦Ó´|QDû²t­5¢Özò2oó´(´©eWçŠ|èZMìc¦\¥¥6N“Úí×i›­u5Ú¬j­ ¬6†mºrÕæ•&eÝÕy¹Ut–®u}OÕ*¥3Å\>f|ë5H=×À´}Ìkj8°%p¼½©ºº}T]õ¶ÛeeÛ(ΪUmÅ®³mÞ´YÝŒJ}¬ EÀšóº§žÒ¢ËÔ¬‡¬}β²§Õ§g.jRqÛÕåP\O1¨{­j‘h (ßs|\Ž}TÞ |[V5l³Ø *gUíö]ˬBûÇ´ÉÐýéó#XM;›lUÁÒ÷iî2@ŒËÉõbzæX ÃÀÁ˜€B,N6t ìfœ8¸?œÐÕöL¦ÿüÀ ýDqNÞhmá±{FU®´É»ªÖ¨¶RímÖR˜—i¡È:kº¢ucVêMcøF\L^7­… !€`˜$‘9‚òȲ+ÁR®™·o%]#ä]d„ØE5òU©UUdÂO0Ær~7u4R-/ߘ ýõ3ÔjºÄ]3º¿KªóÅ,Š À3.€ºV4„Xhe¥ìä~kÐY¤œa8#Ò/š¨KIÛü¾fRèË%T?´DzU¢ÎË@™dÈž®éE§%šŸÇ‘õX(%®y¬¶[ðqàðé$œ ͤ´q;)+ï[Â΄['¼:¥!w’ͦgt»É™•#þuYó}¦äsÎO m_Íoï>Jâݧóý+„½Â dÁ¥·–]ÏX? \gûŒE¼&£Þ­Í  nª±¨$yh[WÝ^xº·—>ÂÄðØK A€`„¸OÑÇÅ4é1¾à6RÎH¢€CωãÜup9âÄaÓÓŸ}OwûBç&4ªeß÷°jпîÏâx¡ãc ÂH0"Z‡Bî†}:H`Lë/=³›åôj:Gy Qÿ%mÒ| Âø’^ä~ÆCF3¼­óÍ&«áðÓSUW;L{Ð`ÉjJÚØ&EÄ0)o÷5 t³èL>ÊíÎ’&Š4tú„Ùu’ƒ<Èc“È AFõö„V)q JH’ø(ˆh… ¸Ó¬*Mh‰îL³qåóQ;dÈ*(K—T ¡ä>ÇvB'›©v¯ƒø–Á’¥±¥\ŽõáDÀŠ#aex:ã/DEz#j ’„$!?Þóéd9E“««ùôж.ïn.–³ÛÔ­Ó§íýéì}—WñhS¤[ôîööz:¹¡ŒÛ»%J×ënÞÍ®` ä­ª®„$t¤Š€T+ ]×w… T¼t5ú@ £ÆúÒ© ùty7¿YH{ì)Ô+ER,º¸½YNf0"ƒ=Öàb‚Ëñ聆4YÞ~˜]ØãƒÀÀÁovÉYþ2½±§Ð¼|¸Töã˨½•HýdÏ'¾‰BS¨ì‘‘¯/œþÓ~ÐÏÅäzº¸˜ÞŸ Þ9rïÏÐ?Q{&2R 7YÇ8\ØŸjüïŒ7"<ñF8㞇G0¡‰µ=ɧyG‘ŽÄÍ{Àd4Æ&l0ô•À|'MÂ!)ñUø¦m-vSrÌßÈ9ý>Ÿôµ„ÒïSQ_¤ ´ÑdE¶j{J&pöŒV¦%&ÄY‰#©Û’?SsXñ# U[öæÚX†¡ÍSÞä –ä®Í‹œ®,—E+[†J@ˆ†>‰@ƒçº1†Ø!ƒ8HûÞß;`ÅN]Éà~U§qò0ž„–Á2bΈ=±ë¸Àˆ„=°Œã ’1ÏTãz6©õ¡Ë"q D0> … ¡U±†qжFß0sL뎉ƒtËç•8®Ò éc?ñÅ©^L¯§Kôò5¸³Ëùí´êš¶ÚÑ)^½û„hµZÂÅùé5’Ðò2oD\+ÁB§¯#YS]aF²+|>2Nó+Œ–© Ó¾#­ëôE `…8k¯ª²Msm «ÞL=}åϨ}Úp¯Åm¨ê‘½ \+ME·cÕ;#/+;°k î‘9¡˜¾ÐÈJ”SEUn…‹b4[bs®/U§ñÌʉjßæ»\-]al>kqŽxF`mæëE-4kF¥µm”"óòÊÞÿòqà|Õc•%^JÑ5 ÆžÏ3À\Îg¾NæóÉ'˜ac©œ¡5¹¼-¢pßUõÍ{Ú¶gÈ•[šüÌé©%u9`Ö×ÀŽºcuµ]^´or%‚­÷+ä±6@~`4|¸}5:}Œ äÑ Â!¡_¯†1*€ÍGI稱¸ÃÕ$1Ÿ7 pÀT`L,‚5Œ#öH¡< e‚0‡¸$iô_0GD#K‰7Ô¢¤ø""èéWAÃ>:‚—<*!QmÈÝ¢¬ ÇŒ?œ?UùJ0ØWYe©÷ú|üÙîð endstream endobj 1004 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1005 0 R >> endobj 1006 0 obj 2770 endobj 1008 0 obj << /Length 1009 0 R /Filter /FlateDecode >> stream xœÍZmsÛ6þ®_ov¦2 |m'7C˲#W–R‰N¯“d2´LKœ£H‡¤ìz¦?þ@‚„¬¨¹›ÞÙI„],ž],^vÊ×A~ÏØ‡ë›hµ|<‚\QG°l×p°‡¶Hží¡” všLD4iÍҜؠßÙ£«ÁÇÏ t°a£çÖÀ9Ìrð+(·ƒ:žïûÂVÓ žÇTPÃÆj‹~œlMt‘×ÒÒz„ÿçÖ«QbþX„Ñzp~¼´Á(|h·€c¾áÇugPÓg?& ·èãéò×éÙ${ÊÿߣE¾«’,.ß|Fáõ`ŠiÖõF2ákÔ»©Óa[¸Û£ì´†ßrá¯ePÎŽaÚ0Ö•ŠÅŸ¬C6íÚYüóUç(ep©j¯ýÊ__— $Øð:ëAª¸¿»Çþf¯i Étc÷q™¨ïš¶åCg±°‹à,#ßCEŒ`ðhËñëVÊZÂ1¢±Ë°1ñÒ7cp Lkã×D–p—p%¾Wƒ·ú«a£ÍÈHª`lQmNÝö+:D󈹀¤ÛN†SR‘Dz°ê¦Vß7•ˆ‰ðV3f'úÈëlD —ñ\؃.—Âx:…hr1D—“Å2œ7ã!š²,Áï_‚««Åø*ÇŸNGÐõét2û0ŸŒÆF8ƒ) –èC°½ ŸN ÆŸÞ°_Ä7·¢î0×óàr"„+Gèr1¿A«]YåÛ¸@×óÉ h4‡æz;º]†ó›ñbr¡áÁuCk<Øšïj1¿}ÎmB†å6à à?~* ZîÊ(Ëb„Ð/QQÆ4¸>žPßó Ÿ|F‡4=»Ž‡C~o2.þ>®â¢Ì³Fécj|2<±¨gŠ¡¾á²¥ÌfVhz›ûØÄÂÇ„¢›dµ‰âôŒÒ([½(óqlÓ6èwÌǵ{¾'ºŽ¶qY‹ÿ’dk>PúÍÃ,f»m1Øã¸¯YÓãY†ÏüæùŽÐã¡åKú”Dhï|¨Å–Ð=¯và+ÓôøìÐãZ×cbtžß qMµà†v˜"ÀŸ9âžËö=l|lY0 ârðI†Þ 3P‰N«MÜ´ã?¢ícÚÒwqš?÷Š>ì²U•ä-NW»"+:jZeU°åhQ¢ª!VyVE‰2LձʷÛ謌£"ª iü4)[„ü¡U™¦{qž¢t·*£²TÐòB¿)L¿ç1†­×E¼®MYåén›(Ü$%j|í2Ù&iT *GlÈÝ.I+”dübø2šÏFAØ 0šøûz¬#f;°Žw61aÜíÄ=&bˆ¼é%Íã…¨ïõ–8"~0a—vqÝ V}í;S»p£ ƒ¨ŒcᱫÀìiPMQ:D\ëˆÂü5[:Œ#|Âä-*T´Z«]ukÚ…é,Eß®c¢nëNk>9ƒ‰åŽ i:Å"èŒc®¨ ³èòv6 '×E¾{üÇtû>ƒ¿,ö"8Q½ˆ;„¸‰ÒhÎçóé8˜1Æü6„ððï9a6Ä1N•±SÅ€lü*ßeœ€ uêWÌ-Æáíb¶ìíI\ÃbÓwdÇ2 &0J]܃ۓYêøRÓùø f@^0éò¾Óó.š\¢Ëip…Âw㙞EÀÊu=!f‚Îo//Ç‹ŸõÄV¦=ž.õ´Â„°Ú#3‚-Ûd‰f·Óim‹TÄ?£ñì„ö¨£vß Œ/lo9…Õè-:99€É¢V×I ³Yì>èh~; kT|Ô¶úžT0ÿ ž0þ­lüù'‚XzÚ¡ŠË÷BüÀÜ»g¤Kû+ÁFK«Þ6­Ù3² £‰i’Þî¨Mà›àXÈm\W:áµ9QlöÜ’ÒjZpýCü±‘C†<Èš°á!ÌCöÕRUt—ò˜Ëé(»o‰û¨Š”.E ‚±‚¡Â?ñS’ïY%[áŒDéÜAˆ7Zò}TT-Ås†=Jò]õ¸«ö#–›ü9S ÇÑjÓREþü]øúªP§çåõ¡:%KxI"h}ã[¬ðayÔ{¤1;i"\¨ m-K„ˈÇ-•>&|‚¼ej:«Íu{ Ì6°°,†«Œ¿`Ì&újÌžÕ&¥CÄôŽ(xD³¨Ã8ÂELŽWÑj¬N†¡[ÓY°þúô­;&Ïèx‡³4çH5hýðÊrV›t þ=yÅCR”ÛÒõm ¿ð‘Fœå|·To m)¡$H–}Ç3S^ºÔ‘ÐÓs…Ð4ÚZVqœëYk.ò»n“šøFÙº·Ô£dñàO–â­CµÍëÙºyçÅ:ì] ÕgŸ}X%”—.[¨;:—p³ÄhÊbI1¥£¦ia«·ôò`¹MªÍ0`O²y_ÄÏœøÏtÚ[óóŠÂË]šÂ,k¼ý“ܫӤ{·Ðo›¤Š‡â­ &þ‹:)ín!ùdÄ †ÒÓ‚FŠ=+ÈŽî°z“ó¶Ì($Ù½3m9,¾8¾çË„è:zŠP «cp1/oËÉ„åAñM)$•¶ÇA]ÏpÇk¨¦ìnYêëçðHÍÛ÷ñC’ñ Ÿ3DQž¾´,¨Ï›öûå] Eú DŠ|« mà þ½F˸Ëï_¤çM³†#¬Žÿù{üUF×ãB‚< ¦@YÐ8eï aÆ««A0Üë˜};)‡ *\$Ò=ÞKÄ e98£LÖp§ïŠV~»«ßl„|ž¦u¾ÄÉJÁ-væ¯vI¡Ò©eËûHPµÑ¢­œ1ºT‘À] Í3t©TA¹¾8µT–ggªïåp·ÆÒqUq’½^‰-û-9YëèîcnÇ}àgå%QuYúCá–6æÑ—i‘e“xÜ”JÅ™ô^{Ù6‡šÂu YWU$+´£ú¡S 8¦ú°=×ð±%p]}Øp!±GÌî—wLÈâB2íUX<•V€êl¶C‘Z3yÇÖtV7Óßcc±o lß“ÕcA&¬2þ‚A¢ÒÐÔ˜==ªMJ‡È÷;¢ìû÷¾EÆ.bò®-TH­ «S}èÖt¬¿>}뎩>:Þá,Í9ªÛ‡ìÞ‡ëÝ"Ö7:åÿÂvxóÊy1¿=ŸŽ_}Ý„³Â!åôïÃØ×M`‚Ó|ñ¦¿kîy£t$ì>ÔXµ»ï>K¡JbB¾ š fW·ÁÕ]}„E{žD¨I8êDãd4 –Ë÷Aøî'¨IŒMù5½¿3ª¸¬Œþ£ñð 8ø¤ó??þ Ä*>E endstream endobj 1007 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1008 0 R >> endobj 1009 0 obj 2684 endobj 1011 0 obj << /Length 1012 0 R /Filter /FlateDecode >> stream xœÍWKsÛ6¾óWìQnmLÆ—4NÇ™x2‰5ÍÁòt(¢ÙPd,‘v;þ÷.HðMºê%-%›àøöÛ±«G‡ÅÏ™¹ù‡ÍÎy´2>׳"éó‰GìÀ>(© 1 {C³ÄÝRjWWðÅI ?;·w¸è(‘ðìÐxsã|BåÒ#®§‚ °\9aJ.ñp°ÙÁùÕŽÃÛ¬\]³7@ô?gßeä2þ?`D!rÞ,ów…å¶M“@R¼|qy`.ËÜ.n>}8»JŸ²¯ú>gE§úprË÷ÎåÒšYb”‰Äñë“2›zRÐþL'Óy+Å?AÜJ†Â%Úc¦\{7õP–Ϊî³Î±PÍÃP•^ûžÊç£â›ŒÕ‹óDÇýýûÎ^Òèž·‡Žrkù á}ø¶H7yœ¥p¯·q—ÃøQü¤SXë${~ÕMI ó —ÀçR¨}9¨€ÂÂG: aôØkØ"Í3†Sœ¢ ªab†Õžê݈¤,ðØÐ§rH ÕúäÑiàÛiYs©5 ¢ú‚#0Þæä¾öfb–qgiiëˆCGp” $aªhµZQMg¨»aÓóøÏ?ª¯ýPnh205H@®°‚ø¸Öw« ¼¾ë$ÞÀ!s¼½ÍðQC¤³Î÷ñæZ‡éja¥qz o²,Al“0:­²²£Áõ‰o4(Þ*¨¯ ­Ùë(>äz Wi®#½GÙ&+p¼_ÀŸ#P§¾Rx>c²÷Pã-¬†Èä6,ŸAÉ%ðÆdÊ­5‘[zIb`^ìÓòù5ü5ö<" °/Äø¾rUÐ'•ø—0)ôj±:y=õ=SÝ)uå<èAœ#óJ€d­ßPÅRI BrÊÆÖÆ*(äÉû¸]-~Ãóˆ$a‘ë0 ß²çÕ"<…õêdŠt g"3vßGŠ8ý7`xÔO‡À‚ ýmÀéQÈ\ÌÄ᥌ønõ"WMù¾ƒ‚oÕØ±L¸3ž5WtÀýö%jcȦBÅ$v9Ñ“ÃXNzÊlŒæ½oÄ0^È}øÆš¤ìóÞ‰Ž&|ÐÎ’8Í[Ý?´w›‰×DŠl&6ÝÜmã”NÀÂOö œc™ŽAÖçõUŠËA'z“—¶Þé4?…‰¦‡ÀÆ¡8`·ª7yò$ñW]®Xq’Ÿá‹F†w7›Gõ®¬«TÙe0âõû ·SélQt‡Õ¿Å¨*_÷ù˜Â‹ë=1Òቩ>`‚P5,*rŠÔq}Èš×Ø=B55¿œ4wõÚñ1vãR¿ÓtUýF££Íô;C¯«xhª‰Ñoª‰^O°þáqsùáò§eÛZüº+{‹02uìÝç×Pý߇—ì{?³þ/7“ê endstream endobj 1010 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1011 0 R >> endobj 1012 0 obj 1091 endobj 1014 0 obj << /Length 1015 0 R /Filter /FlateDecode >> stream xœÍZKsÜ6¾ëWàƒ]+Ñ|?\µ[5–F¶—Ë㤶â0CŒ†e9!9ëßoG“¹ö”Ý8‰ºD£ñ¡_€ü×EÀ|øs%dEÈ6û‹¿´,`YÈ¢T‹’”™—ú9Û3ÍäIÎjùሔŸh2RRý52;öûEsá³·ü •Ì÷vºðgÊQÍç‹O°x’zQšE¡m ½ Ïå‘—±Ù³WwûÝ´êkc½TäÿÏ­§EAøa‘´I¹:õþ̓v\ÀÃà07 &Hïºòó+ÂÔ„¯ÿàu¾‰¢q\Ê  òYPú^$*„¯”~|Ýc%N4g™ &‰'½ÁOµ1:„%ŠE^lÍO¯ž¬°êúÁ0üpCBñUc(âuaîI†ûu[Z­úp%iÂ<扗%X¤sÛëêѪ(ùÀ×¼FÕlïQ”{Yš¤é¹*£fÓ6q. ډή±ÙñæAôgw>;÷ÐÏÆKH aB–"Þhj-4±o›jhWÉóÆR›ÁJ‡¶ñ4½Ât¡& ÞZðÍN“Cµ7êÍÊ7Ë÷ËÕòRs_~½Y¬–ši;MÜ}ø¼¼_iÆ®A¼m»½(Ídn}¾÷ ïo0† a…±''+T53ðo¢qìú‰ íÈw¥ØÔÚõ̰ö0ω0MfywfÆ3¦<O’yžDóýUûƒÊ?ð¿0ð’0óýâ~¦ÀYpÚUµx€g­‹Ò؃TàûYÌ•w¢æô¤ÎXûÐW'Y‘ÉŒãýAlž*ù¹'DÁÄí ýaÜC ‘gÉ|6zÀN /— Kæsž[œd'-áuÝž«=¾jÈ' ¡»u5t¼{r"`›^NRx;9„´ÎfÆŽŽ«ˆ5k1Zùx€‰èûZgGæAééŒÍ3ÃC;?˜8#sè ¦B DU—̬zJQ‹Aô—’†ê©qa.°ö`Ê伆)äp™w _/õ¹Ý£SG²yYóÒ1â;ßjÑ;‰ö0E›ØVÌ(’•¤jˆ¢í<•ð Ø¼!Ëròñ×0Œ*hB:¬zZ Åú#ðAìä¢*Ƕ=Öd k1 ª Zžn`î{A>çd|^–MÀ»~·¼þEžÀË©‰ž•-,5¸âŽ<:›žÊ=3Å*<ße Ôíš’T[¢CXú‘×GÇ'$§X\÷D³³ *²ÏõG…øS•¿œñº¼˜·Pñ=Ôq±ùæ8 ¡Ù ”Œ®:½˜ÌS̲V”xyAW…g 0'w¦¹W°¿-ÞYþ_ÿ$Œÿl~ £Â+‚V{Þ|kæWš-¿¾´òÊí„[Ê9­bOüÉÒ:wIR»¯ÉKJE㛚Fä+ èvÃ83¾ª°v]{ê 8_¬°ßî9$˜Ž¹‡Án¶¼>×xGP•yç c}óùÒóŒi$땳¡'BÞ4íàx^d|MŒ¢Y?9²äL嘩NÖyå}ûÒreM%¶¸ü†ÀÊtÔ(€BP«Å…ô¾[U=Ö!viÕàÈÞ’ˆÒ‡œd­Ú¨;’t,Í-eBRs”™S©¬*ï8Kˆíºr¹¡Æ’'! ë,ɦn1ÄzŽ^œOу3—8J'Í)¨[¢ì¾áþ>,[r["¥ËªNC”gœ.v©‘’D‰K[P«SšÍ‘GðI:cýmkIÙ{?rõ΀e“u$Þ.-oïȶne¼EŒVh›svÙKƒÓB–vÖrpϲ+éºíýª<œ@µWY+µE7Ň–Å©M¤Ø,àˆgwÍøSwgQ,Qλª·ú·]»7ôõâóõâfùŒ•Huûñ~y÷öƒaYþÛ$/ç6˵æ8ñÕaâe•¹\ÂÜa´2áþv·ü³-˜¼:+¹ò\yz¨™ûhdž/ß:óL?>Üa£ºi’´_ÀÖNëûc=T‡Ñç´ÇS쪑掔5i4Ñx”æW»j%1b×!Œ¾‘ÎøfÓv¥®‡ótUøP·…ˆÓü­.‹ °¶ÓŒ0£?ú„ÏŠ.Ŷj ™þÝœ´n•%߇¤â±lDª€ ¢1—j‰–,fÈëû%¾(nu÷öíòÞ*7þuiM£6«D×¥óMÇÁdÓLÕ=CÞ5«í“rIñ]lŽ*Ë Œúñ­'Ó8œñS(„±¼†!m~È*Þô©ås¢c]¢Õ· Ío6P÷É„–ÐöÌSSJ'h‰VÒ/;£zϱ·ôkûVcmpO*fáŽ,]‘¡u;ìÈ̆ØS—t€0yK¤ˆfÉÑG#u*[¬r°-l3§Ë#žd…5ÒÆÚZ@:òRÉ·ƒ~ZÕ¥d·¢µ€2es–gúáˆéäQ3ñ#/ ³¢HóÍz³”)vòû‰³¢I˜y±ü=#4íÄI’<¾ ‡#MߦPÂɨ¶Çò¶€jÞuÈïÛRz>YWÐ¥¬S¡@n¹»ÆÑ­t Çž xT]1ž76T•dÕ3o ÜDÆØ¡ij’§_‘‚ílÁ=±ËM´Ñ–ÆüªHU¶tBMèÖ±YÖwGdÕõ³·,^Tf“,:’Y¸OÈÙŽŽ–œìì`ɹNŽÕ£§úæœC–ÈœÈþñ(ί»|dœ_ o’bfw„œ©´6?$õh‰Nbs½æiÝs"“™ òfsIÖräš—51߯F+Ë_Å4s¤dö!¥“ɦÊ;ø»8êt¢ D$çu!ɯ€†)‹Ì¯Äì$9Éÿ½ØØ@Öž‚þ\…´ 8="»§F9è|Å%‹º¶ôa›¥…:Äù¶CGvM‡ø8‹‘MP¢·ñ9ªiè{Qµ!ó ªPOLò¤¸÷OW,í”@{º¢£ã·;§†ú®è—NIÒGRÉË‚zi9®`Õ‹_}”HÞA9æ¥ZÒô£G·æ½DÛ7$ '€¸&ÐWÏWèä] iwæôOµ(Y‘­Ù‰~tÛÔÇÒ ø¸rô—÷ïݼñU…µhT¯0³Ô|jž³æÚæPÄñ Ùj˜[Ð7hké+ùkŸ.þï·ñ endstream endobj 1013 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1014 0 R >> endobj 1015 0 obj 2825 endobj 467 0 obj << /Type /Action /S /GoTo /D [1016 0 R /XYZ 72.0 265.703 null] >> endobj 470 0 obj << /Type /Action /S /GoTo /D [1016 0 R /XYZ 72.0 179.945 null] >> endobj 1017 0 obj << /Type /Action /S /GoTo /D [1013 0 R /XYZ 72.0 720.0 null] >> endobj 1018 0 obj << /Type /Annot /Subtype /Link /Rect [ 209.2 73.501 248.08 82.501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1017 0 R /H /I >> endobj 1020 0 obj << /Length 1021 0 R /Filter /FlateDecode >> stream xœÍYmsÛ6þ®_ÉŒ€ïäÌÍ͸‰œªõÙ­\§S÷LAŠT*ªÿý-ÞAQRbO¦×i3Þ]» ì.ôy ÿ‹?Y¢r=ù¬eÊB¥Z”¤(ÈpJr´FšÉ“Õbà€C4I©­˜úuÒLz?ùý´@'h7!#ps7ù‹')ŽÒ¼( ­kˆƒ<KD8¢\£7³uˆÞµr´Ñ^‘ÿ»ö¾FQþ4"èqòÃ|òæ2AAó¥ (À3q†r…‚„˜˜¯Ñï¯îÊ[SŽh³@ïhO(gèæáOVöüõhþÓd:×Û•X2 Bø?Ã2ª’˜ ¿xgåN ÿb)Hp˜À¾Ä§Z;Yÿ ™H£©¿G¤¡¼Éû.“Öû;?î, Î^‰sÏöÃ@û›M6ò¢XûøfÈ(À.¯Ö›š¡eÛ­Q»Dpå'T¶ ï;Z5=ª8êW ]ßÌÑõÇ«+ïÓÚ­ªr…èfSW †µˆ\ópe[o× Vvzs™5‰`oAJÉ¥ÊÇëÙ‡S3ã€îIˆ3€îij”ÎC0Ò“ïmÀÊ`'–iáØ¶q4õhöyKëªò×ÚUÜŸf³ôZo?üoXY-«ÒGfò†ß¿êé'æa÷í#ûw÷¯c¶ sL×î”ý<«¥1X-$$Šseµ]կĔ8—ø+æN×ç¶¢øe×®ÇhéÁ(•@¶ByÇ‚†;vîíßÖý7`} dë-÷¦6ì‹¿êƒ7¹ï¶wÿª¤ÍáKZs#ÝÈ´YºgÚmó©iwÍýk¹Å$B¯fKCQC€ ÙÚ¯z’¤µeV”Rž>MW…mžN¢yvbŒ;ÒfÞû(î‹§ü‚ÝùÅÈ\y>2WõY:#,öN¬Hï b QQmj7ÐìHpàÀàÌ| - cyr$£vZ¿¢fʬӴæãÎP"\Ïì£g½Á‘ö„=,‚ƒ& Õ†¨Ù' dÏ@*!§dú*rì¶©玗ÛÑtÍ(÷fê+B3KGƒrkÇUšˆ5ìØ©>ëŠÓW¼åÕÎà1£…$ø¾º½ð¨nÁ÷</@;=¦[øì¸ýŠÝ^xL½èÙÑûõ^èᛦÐQiQ"Seye&Ï ên:×Ô»‹ùÅwSóáÕ¦l³éTw§éË‹+;\U^‚z`2 2ÿ™[ÑH+£EÓöš¢u=ÒÌf0¤©ÖÌv‚Dè̼f[×g£ÌfÅž1ÄJB1Þ¤¢ÊehwÄ+B%;ºEÅ©H~ „z®j8ë@¾€ Z•Peˆ‰d‰©§‡Äƒ€U…H‚r‘s·Èé&/À¹hž“4PJþr;ûÏÅíoèçéo'Z½(Œ1I èÃØëõàX"‹`x@²ô°í“"UÖHJ¨ TfÞWUÍJ’ZÊ5“Ç@Uç¡IæèÎ’ë¶srÑ<[Z—ñZº[ÁMS?ùÐ#·GQºgÏ¢HÔSP4.زjÀ·à8٦ɖ⤟èq’„8×eÒåÍítöþúk~Ê Žc¨rŠ$ôü$8G >±'Ç ­ªdº•´íЫ,®hêÑ~‡n€ýîPƒ±~ǘ'ðªI¿t´ß¦HÛD)צ+kÓÇ+Â=é&¬e½.­gzCɘF]q¦Û*†Å°â}ÄÁ@¿ý¤Žt!oæùÞÑSojc{½ªíZÕØîˆBæ‰Á›…?÷‡ª÷€‘=c´§íiüÎd Rf g t¯âM¶ý¿bï‡ÍŠ?rØö+Ù…×/‰xò{7ùÖv°#óŒèËÍlgЧkEì9‰“l·5¶^îYïíÓ·?‹I!Á¢3­é–³3'‰‚;^[X1îÍFlýàÓ&r‚V_tŠ«–GðÏi¶³všyzžÒ “@5cZÅ^8Ò3¹è[J£èÓã0ß3¡¼rÁp"ÉÊÁ~u쯊÷Ü4’“Mk “L¯•h#3€ß´»,G|%6IQ#ßÐ’!yiP.zÕZÄ7—ƒË;Îrd¤¿ñ¨ËÛÎ;õ KB@ÙA’ ÒÓä NÁ®wwÓÛùìæÚä.)jˆ¾Ýœ×pìj#àòGõê× løYo(aHi?3r9Â6jûj‡ \Â))Š<‰ìà_œÑN^Ä)VÏY‹JØáßGí¥GEN&ífõ;“ õÍ#iU)JRI™G2÷c/“€Ç²ØT0ÝÝ?ãñP.D9$ö"Ëö}<Ÿs/|\Äòᓤ.‚i U™wÕã#ëNOža(‹Œ„)æ·³÷ï§·¢.¥¨\UõéP± *QZïè‡ê¦n›GýcÔ÷WSWEÿMo? âéí›§¬$‘î©t6JLiòÝôj:Ÿž9ÁÇ_ ˜:^'8IÏ®EÔ;^•1ŠÞ°N\÷êŠÖSO•·¾Ë¡£%¾TlçiC*>UVѲRyÕ º¶®W«å¬cÃ…ážází\å ùV'#ïâSÏcr »Pù€Gâš?à".†Q#{hLÊ-çªv]0è=jAíÁ¢ÅýcZ$ÇÃE«ttø0lݬ,ÂI…vGß²H…ù‰áåŠnzÖáÁ϶ÿ{†¨ endstream endobj 1019 0 obj [ 1018 0 R ] endobj 1016 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1019 0 R /Contents 1020 0 R >> endobj 1021 0 obj 2220 endobj 1023 0 obj << /Length 1024 0 R /Filter /FlateDecode >> stream xœÍËrã6òî¯Àq¦JÃð!RÔÑ“¡'³5k'm|Hr€%Èâ.E*$eÇùúm @ó!WNÙG¹»ôÝ ú÷«H„ð÷ƒþ±ZÇb{¼úh‘XÅ"Ɉ”f"ZY˜‹£ $OsQéPo!01TÚÈA<\ÕW¡ø|õËo°i' /Wá„9²ùvõO³ ÉòõzMºÆA”çZDdlâ»/ÇX|jÌn«½fþϵç%Qü Q(ž®>n®¾»IEŠÍÞ§@ƒgã0 ãU*ò ‰×úO,6GñË»M[>=©¶{ÿ›ØüãªØmxPgO ÿVI¡ÁBº ‡+,½ÝSáÿ2H” NÁ½TQDé§^°`j<„?/z„X±ÃãøWýÂ/‡b¥Fabesÿ0±þf¯M©e;{e{è²®À–U‚Æ\ßlŠ{1L«O„"TL +£|pò½HWâ]Oç ÝÊš Yu 'Õî›öhv»²/›ZVDØÉ^ÚãY?©nA(œ"Hý!§JVÖjû²~²,ëK¼ÛæÅé­>VÚ®ÜïU«êÞÚ"+…Ž`æ§áÈ|­•ÑYžAZˆÍAuJ8O€ê¦Çø¿Šþ hÑ {qÏJ<*Uãr©vâ÷|¹ýVÜoðþן®7…[mI`3ÒU,uHóu†šMqýIÜÝü•¸FaåFgäñ!I‚¥‹+#hõVvÞ©m%[°ÄQšÚÃÒƒ?)ó<$;a­p0g¬Wà)›gÔ+“h„•¬ÙâËAÕe‚÷™roR;IŒ(JGþûT|-èÐ2ÈÅ»®—½:b‚‰t5°úCmÏ=9ÎP^Êþà1y.Õ‹Çdwa[/Û'Õ/.­²¨"“dóêɪâlä+èv«*kfTÝxxnA¡_B#ú’ªÂ‡lmË‚ÅzùÕYäTÉ­[AKÌžƒ#jÇÙx:ó…F½'ŒDéÀ²ÞVç;F^ q‘îü":ÌœiÝÆZmU×ÉöÕík†VN]“¬ƒH %ÌZÆ5$Ò/vÕ“°²öð`›©m_Dõ;×;ÕV¥ºpX»páQS• VÏŠ‰ltpÇBÙÉî¼=xL2}L-Ÿ <ánÆŒvçŽ!ÍÞì áîfêÝ4{×Öq)Z%wšºzæöé¤PÐ2 SžÕ¶9*q>逾ºxckÒØÝq¨|‡ØèÃhE¢}Âržëqº˜¯ãÑÌ'~l›“nxª³ìžæKzfã^m²+7Nc ox‹æE)t ,=ØÔ×–ñ5¶ûsL‚¿{ýY¶esîÞPéä,åªé¢^ÖL†-äÄå þ¢•¶âNÒ ŽÆCŽ.a‡æå­þ/3hÀyféz°nEÿFëW㬣´Laîã6 Aß²Þ£tœ=1 ¯Âß~úÊØðödÙH†m%Ü­‹BÆJb%#…Ñѧ¯þ…Ãe75oÇyOC–'#’Pa²îªmêÔ–ýh…Ä´Ž`Â7 Ó`­[QœbÙ‚×{”"lß¾¬ mÉ\}õpÿÒx¤S'ÙB(<ÅÌ-ÇoðR!BˆQµZ0W÷á‡â–i[Iª–3Ú£Û™’’mljœ¬Ùê“„b×Oý¯Ý¡ÿlµ^éAÊÌÂsmÈ`Ô'íCºóã¿¡îzÕùéNrÈ‚Q˜ˆl_2;fÍwíÔ`ÔNç·=ÊI#Dè½Â´=Â@u{l˜:6^kËàn‚»AºòO†Q 0°d'låFûYç •&[.AÖ³Œ¶ºç•|íØœë>ð„;Æ=p$Ó=å ŸeuæÊ–—6ÚŒ³F»qê[Èé¡oÝû¬“}ÙÁµ°6º«ÐÍÔŽl¬ &Eáš:µÖ* O D} Žž@ØYc¦smÁ³¸U,B®#æ.@„7ÕùhžFˆãÍ#û{Göþˆçf& vÈö•À‘nfÞOÉ*9‹ßxvÛCÝ$ð‘…vw¶)õï9ÄñM‰ð¯ú:+tɯï=ý¥ÄJKÌYr"…ÜmwSª’¶uY¸sÐÔ'y>ò‰©ÐÝc‘Þ#ùj€J/„7`!À K*¿£¾©B”ðNùVl„¶¼5ç,£,Èõœ.I©Ï­¬Ïàü²}cÊYÂ¥Jõ¥ÊW9›Fã$d £UÐ]+†³˜çBÜÓ“Ñš߃„â'$ÇïÀ×øû›H4½¡"=mçÔá iwóõ›»{†×ßÿ0‰ÿ2MF.û¶Ôùgq»™V›%\ ý‘8ÏÒóo”‰ýòEˆó+¢¼šðÀ©H²>EŒ\Šˆ¢±nF¨ëí®¶:ÊîÜâç> endobj 1024 0 obj 2148 endobj 1026 0 obj << /Length 1027 0 R /Filter /FlateDecode >> stream xœÍks7î»~¿5™q˜}?æænFIÖŽ;ŽÝÚjý¡é‡µDÙ{•víÊ®fúã$ÀÇ>äºs3½K›‚‚ÈÍ·™Ï<øïüIó€-·³oDóY°0!Rœ0?剗±-#$‹3¶‘Œ=P²**q#òÀngõÌcg³_~¦óxÌžgÞH8й™ýÊㄇI–ç9Ùp?ˤŠ',·ìýù6`ŸÅ­­—‚¼ÿ¹õ®E¡üXä±ûÙ‡ÅìýiÌ|-Ö6ü<xž¤1ËxäòOÀ[ö˛Ůº¿»öí¯lñý¬XÐÚp¢ŒžþO¹ ¡Þ@yý'¼ ÝRáoÄC¤…1,BmhGéWh0VÂߣ!QÎäáþ(WýÊoE*'úÏz{à'©ãþ~`ýÍ^m¤Ô}|=Þ(žÎ/oÅü{ Ã1Ø›«S wl–Rl6ͳXYBSo{~µ#ëAŒ[BåèX‰åôôä:J-øóyqË-z[u®>WfwxtÔ7ë‘)'G,O¢îp·/ÞÀ_ßÜüxÁÚ®ìÄ&|}˪®›5#ê¦câw±Üwbu”¤ RÌG£€§^ây~¡ðÅéÕu6É|Öï 8?]×s¶ ¸[k áßû¶3ÈX7³£¢ÇV®;a‡ÐQ®øJíÉXO3J‡rƒž:ªÄïåöq#N^2qä­8xKHèÉÍÛ5ÏÁp ¸nÅa(]c1GFWÞ¡IÇè@Ä쌴q=VZ.»ê©TA`iµc-W‘¯§ôþéÂŽ¬¦oïÈ©I2p*èÐ4Ø,ç^& Vö]ó´ŸG²,k‹l›Uµ>8ìh1"´T=Rv«w¢ªï!gƒ‘¢âŒàýãJî·ã— –çø¨Í`fëÈ[<ˆÃÈO¾ç%è¾ÝC"=À/˜ Aø(vè[V®V•9²êr+0c‚ãÈÒC¯‹Ó⺸üx~y¦¦f2ÕB,@4ZÂ*L †IáûêÉ™£Ì™fÔ.PˆÞ8…P:$ ´W 1ç Ñ…+Í=±„ÉE]]|²È¼,nÇ~ÊóŸó*£%>´d䄵G[c¸!b‚Á’6P7Õ™†[­ gmH¬ ‰´6Dþ° ¬Í™yuû—@Ù×1}Ü ùþÀWîšàf3Õ±E7aÜ{„é0ÒÀ΀65–¤R6ÜYy˜ÀùÉcŸfk?&Т.. b² ¡em`4÷`ðÒri e­ƒ%qöLq¢£4Þ¬'Ù0Â5½ì RÙ©º¹ Áe}Ý~jÝaºxL®ñÐìÝõŽ#òsß{m-ñ•OMµbûºP9Ûrw0•›ºJéé j«FÝ}”jó6Í=>0Œ7Q.ˆGMP¬j§EÛÉ ÈÍÍs¾ÇóÈ÷SùÊž§AåÌg»ûå@òƒ<À:™ÉyäÉ´aÄÖ³oÀ¾dŠi Ñ’÷IIrmX_°ùÀcÏÏøÀèH’‘"éu#åš7}ž)ËÈI]Â_0HŠ &Ô=®MÎÀ–©õXÁ##‹z„W¸HòÇ ©°Z‰¤Íê&kz6ÜŸ¡ujÌÐ;H9Ç|²ÉY6èÁ¢<ã‰ç{~¨Ÿíûx]Èî|q}~vF/qô(GöêÒ†øøÉºÒi–¥©–Ș›Te>‘id~#o–p€Æ2äçQ°*ˆÃÜÊ0O‡r²J_ß ×—1ÿëÛ±$H‘'¯¿yf%Ñ:Î/Wj™WgìçùÅOÅ+ò„ÌãPDÊö®ðßi=“]m ½Fìgyæç¡›Æã€çöuJ!NGÂÎâÌîkž",›•3¬žŒ©#ž˜m«*äš,V­-\º*ì}Xsºv{Á-ªd¤bˆ5ëVâNƒ<¿Þßàt ¼J ¼ïä}„KÙº,Kû¹(3?"øÔް~Ÿd¯Ãš²|Ë߬ ,C£ÿQ­åP5•L‡sƒ-=n÷…ˆƒåoŽMeç2ïºq§ÑÐ?ôÁ2’ ê͇âìüÒ¢óÅÕ—ó§ n«mµ)w–€Âôe%§×®÷?Ü|±m¶á]Ydé΄¸êÊÊ!ÀÊÑG_h´Ç´Þ󷿦¯6¹}·³Rõ'dZæøQ$Î’ãJÕ¨•©½¦~ÇFsõ¯WTùÎ{u[FjÐÔ C¡d¦cpÐ×$`Oá|¤ ªãÈ’$J*iɽ)º2T}Nq´d]©¯ ¼¨+å5…Ñ5)C;^(‹‰—ð$Mó4Ó·‚qYdô!’³ (.÷m×l§¾xú R¨h±¯‰¦ö*ÝXXs¨­yÏõxJsèz½ ýPOÙEqy¶ølªÞºÚµ¼2|}++*7¨³cyQÌ=çúÐ0ú#Ÿ™†¢Ø?ÙÅÕmq=¥ä½jôM8& endstream endobj 1025 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1026 0 R >> endobj 1027 0 obj 2791 endobj 1029 0 obj << /Length 1030 0 R /Filter /FlateDecode >> stream xœÍ]sÛ8î=¿‚³O팫èûcwæfÒÖéf'çÜ&îô¡étdYN´+K®$7Íýú P„$;ç}Ù»n»@A@};s„ ÿ½‘?QâŠl{öhŽˆ\á…D BáDVhÇb+‰ƒX”²ã”]ô•z#ò(>Ug¶øpöù tZ Û ÄÓ™=aŽlîÎ~áAhyaœ$ éêZNKžmÅùÕÖïkÕ[k/Ùÿsí¹Fžãþhd‹‡³·Ë³óË@8¶XnÌp\°¬kÛ¶"¶<7‘\±ÜŠÏ¯–Mñð7íë/bùÛÙ|IsÃr÷¸ð7²Ô4¾=laÛ«§*üó-i@±Ü&!›JZQú•  ”…ð÷¨Eˆ<^eª¿Søñ¥ˆä@ǶâÁ8aÌÌ?ÜX³Õ& )eÛVâ;N$»&‘ø 46gÊ»ø‘-\`ÛËj.6ÀÁcƒ„ C„JIa·ªV`;IèŒ5–|\ÃÒòD2–µ‹„ƒÊcÙYÍ͈}/(Z‘‘XÒÃFùöTÿ*–fŽÐxâýnKD<Øl¶¥#•÷™Pæ‹÷âêòÜq¬³Z®êí8¦;tÆŽç—ôñ÷}+ ØÈáÀ™ˆ‹¬+êJ•ø-ýžj“Ó &–‡ 2HÃ…x-Üæýª#^O‘§F³ÔÀ«¼Ÿš¢ërÓ”¶ì!©”aT¦­éÔ=¦]Û]™oóªãíF–žW2ž—z–íúIâ%ÓÖ̓õØ~+×+‹ÌuÔ>^äçc´¬º¼Ù¤Ynõ¤åcÑNÛ'+;#žÊ\o|[Û‹À¶¨ÊÜàÛ¼{¬×z,²GƒŒK––e>èªV‡04§Fú?ÀG.ÿ÷´Ë×3CË Ïú¯òMÝ0†5kK7ï:œ‡5¶ þ鸎8ó‰%odIRݵü ¾z6°f®¼z(ª|fEgàv¿Û•EÞÛ=ïVoX 3«"¤ŒGZ1i÷=-÷Œá:߀j§L¢ßn÷ACýÒæa/ÖýëÙ€ÍÔ)ÙÁȲUº•Œ<ÇŠiž¢÷SFœT1 Îd¨Ì”ÛIÓU™‘—®þ’¸›ë÷=|{óé0Óº\ßÖOSsÉr`.# Ɔ¸äk ¢X.æŸ4ˆBH2\åO ²çÒóµ4ii¸¡zã¾/ Ï}Yjx£Ž«3¶„ÃÙw¹ZÜÍo—½öºZS3¸co‰º½q"6…1ÝŽWõCÝŒº)°1cµn y?¿ž/çëuÓ„KÃAï•)=j¦ «º{kÚB~H×{u‰Mmâ½}¡ä@€‰;AqCLÁªîÁ4ËòÖ´t5ÝÃë´KqS ¾dm4¿%úâj`"¼®L?uð¦â²ºj»­B㫃§÷.qì†t‚±cÇ«®¨ÖE·‘”kõhv3!wKþ#•ÑÃLàžýúv~ys;ÿ*Ï´~ü×û‹åüëÅår~+i¶p@låÛ¶¸ƒ- —ºÓ‡0„é†PÚ­ˆt|» h$^ˆ¬XÏ&ß·èïðlaÓ6i9áËt¨ßu±ÙÀöÂCFäÀÓ„ÁìL|AZÖëüˆÎë¢í :ÙíãÔ†q4²á*ïžr¸Ü¥QŒV¨ŒŽ±ŸÈ^Æ<ª]¼ka ê™þ™‹t·kê]SÈ­€ªÕgrdz&ü­ ‰Tîä8V¨Ó&ÊlˆF“^ ®³J9„FNJ\lËó‡|%>ΞFÒ× È7B­€,Ó '*ѧm\€;’0PÅ4èLŽw•óŸè §Øúû>‰0R‰4Lç¦Úô 3Xб^§$wÆ(„mòBŽçÚ1äm€zahò¶M{ê^…tÌéÎÄ`°¯eHÓ#jûÏÄÍê<ëÜoÎç/u?¹ýBçBHÚ¦‘7pU‘¬õ® 1s´'¿‚ë×>WÙcSWõ¾5Dæ¾p®ˆ‰Zåeý¤""« Ñ5ùgÆk©â]&ª`1bp72ÑÇOÔ:w×÷F»Ûc{òBRšÊ JkÈtá#Òä›}4’P-„irÔcÝ¢R\=†ñ_år;0vmÞ àZ!¼ß­e:fÊEõ̺êÔìô¤oÓäÊ ‚‘µ ùóÃ|é€y£ØrbÏv<]a»PÁXíGBÙžÒ2¡p¶ ÅEH¡‚,g$L½9Z"pÂÀŠ#'I|Û= ï_(¸‘œÀƒ$n|€S†²{=˧šap ·v"?N®¹¡RÖiº‰=RÜÑv›¯Õe LÛŠ4C„¿íó}¾Æà‘HoŸ 9hº/»ÙáÁº°€Øïççµ ˆáv—g°-©¨€4:8ˆôE§ƒw3‚Õð|P³ž_ÉÔ^1X–àŒMŒåÙîÈXR µSÑaZBÕtào[l‹2m„ßw¿_kïNÑÇ\Ès}+ í$=:=TÞˆ¸ÒSÕ4£…4á©Pɰ?èƒG(B ¦}‹=3Ô\ƒxn5FçKÁi/7ߥ nÝäi¯„J=Õ<Ûón=HÇ\ÁhÙ‘xp ¼pd(Œ°Cfª­iP²a:ÄVH[ü›a•e`JÉÀµ¦è°‘Ê(“䌱£‹:µƒ”oºbËe?·]¾m¹fÃ`óÕO]²¤rÝ ]5±ª§óã‘ŰÊõSѾÕþ—ÕNÃAm7¤òÛŒiÙz¯ÇBüÒÔë}†÷’¤¬ó2}nûæ kºû„ë$ÁÑd™­–jvù®I –ûöäuÓù‡öhþ‹›OWKe´H–itª¢J¯Ü'W +X/ž¢)‚*½*·0Ä¥^X…ÕŽeõ6g$½'bv¯B7T- kHfG쯸BQp‘c…’$—k>Û²¨€÷(bpÕO ¹#B2º˜¡¡Ú2F€,/K›5ØL–`GÉ™…5ù®„Ä}-Ô‰„@M(%¸Á$°ˆ£+G˜wëm‰ØuZ=ìÓÆç¼#x86€óßTY”´ˆ¬ØXéu,ƒ.¹¶C¹ºâB3—\®ykUÉä°' 1 æ\?Þ^Á€9 øÓëUö3Ez?“Øu?àå`ºBy/ÃG†M´ÚªDk;õ~àY‰&‰ëPåOWpÝÀ·Bµº;*ã…ï8"©Â¥DÂò»”·Ý`¾“Ó9!üø£c$ËSµY**ëŒâNaGíê‡ÁA~³—ÖÆ•.gj-áÃON-)8­)+4C¿h'ò­ ’$üSÔAUÞÉe:þ ë»/ñdjéµEL{jkÛ:“¹Á  D m³¦Øu/8ŠFÒ¹A­îGwtIx`´”í9øJl`R‘㦆ÄÂ÷åë¿`}. Üì«s´÷ùñV~@qœÑd]4pˆëæÙ2´«cjSýÝTmhv¤7;ºdŽÖÀýÓ³!ÕUùœíX•ã}Ø‹¶úb†×äe';é:1#aí™1REà~B-Zö—_…diX?¤O¨ÏWë÷E2 œ®•æ'bÜ‘œN¦ 䃮Ò"8áCùÑ”a¤iP®?  _°ñúŒµ;¥h?°‘ÆÆy¡n¸®åzQùO¤ëöïnç˹XÞ^}ø¡¸ü}ûñVP †âæRÈ(^扛…ŽV1=Vòc/}z6¶zöR9µ|õ—O’w2wj|QøŽåƒšqìÆ†è#æï~Uƒ?ý:_ˆûWÈÀ‚ƒyu'7K±øx}­8ÇÀ±lPÊõÃðÝÅõµøé¥ëùx,áÖ÷°¥£ÝE³‰zºÜW™.f$æ1éŸ<‰H_éà˜¦ÞjØô–7um¿oª5¤>ÚA¨—¸«Û¶ÀWÝ÷ÆkzúcšÁt8!ªÏ„È"oª´œÚ_Fæceõv»¯¨ä#ÔE"“[™!NN›gõ ­^ºõ ·Ž®¥ATÄ*{dyö'>ަ%§ («²ÓSœq[Ø.9ãdè…¡ÕÇÖþø¹ÃO5ÇOq1Ð?ò'2ˆ4òxS}B?2â¤>Â_PH{ܱw$‡¹=F×n[hlÀœNr{\$M´yé“T;´Â(±Ð|f:r{ÝØá-D¶o»z«_A8;ùÕjƒtæánç—óÛùâÝÕâƒòp½wø­)/W¾É$0 }0ûvþáj!.–7ÿ¼z7âÇ!¶—°f…¸º×óŇ寽[ÜMÛÉg×û×âʃלòóˆéD w޽ƒÜ>ýÜÂWí¦Üg4S \&‰ûeðiÿ*5ßá endstream endobj 1028 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1029 0 R >> endobj 1030 0 obj 3606 endobj 1032 0 obj << /Length 1033 0 R /Filter /FlateDecode >> stream xœÍYKsã8¾ûWð˜®Êª)J¢¤oªòÓÙÊ8Ó‰»rHå Ør¢*YÎØJ§»&óß (Šz¥§/³Û ‘ÀGAæ‰Ë8üýþcÁ–›ÉZæ²P0OjQ ™:’GlÃ4+p`‹Ä!šô”T&æ‰ÝNÊ gç“»{´bÜ Øë„÷”“š›Ég0HÇ“QÇ«pÜ(Bž#XnØÇ‹`g[5ºFŠøÿ½ÈsÅÿ"Î''‹ÉÇYÀ\Îë&\žœs,r<ãÁvw°ØåÙnÿáž-þ3Izm4³GÀ¿ÐQ)Ôúø¼ýÅJ/#o¤ðßw<’Ä,?:¢ú'~¨É@yˆ~ŽzD«²&wã£\õOEˆ]îD­¸2¶ÜßN¬Øk½@¢mîľë†84EàÇðq÷8QÕÅ9 Ò‹ƒ4ckÐàËìp0@ i@kñ¼êÜ¥ÛEŒzD£R´uR=éÚÚ€Ç;Ær×¶Í¿¡ÖæZ½1¨%5ŽYƒ“}Þ‡ñC³zåDun²-fQ+Ù8“XHqãSž1õ'™Ÿ±‹Ù¯”qÖ`W:BvÝf8 ¦œrŠBð?Î<ævíùFø A¶« ;Ýei•oËZλ›ê‰ëø>âõ}šz/¶¸¾8?O®iöÇ™ìÏŒ='Â(@­£™•¶¼ÊÖy™7¶ÑM½Ù.®= ‰Ózæøæy°ûG–ô—_þmqi#И-É€æ2ÝdGïI—hØT9ÌéGODÃKˆ8;ȾfeudØ«¹!§UúPd†mð ww’Ì®®“fð¶z²´v­¨É÷ÍlC]'³ä:™Ÿ^ÌÏû¸}nãN˽r4#\ÛûšîrEùÖpÏêÕe+F¾p†Ž„:GaÔq‰v§r"Ãê5¾±ãÙÂõÆ.æ7‹äøŒ]Íúz£Àáîêf[¯v1jÉõ4%—ÉUùý “ãtøl¹-^6e½¬ž-ÁCÇ—°éù[­™hqª%÷Չ؉$@\ÑV~„@ 8hDmG–D§¹æî,üfqÉñé'‹ýÓ¢¯¯n-îÍ¢oà—ß’ùÂ’ýeÑ÷#¦±¿>eeݾÛY÷²H_öY'“n>_²}•VÙÃØ×"ÁBÁðâžóÐ,«•¢·n?%s6-²uÅžÓ]Þœî³t·|‚À•+]G¦0ÿ©зAé±CÑP´ކm˜}#Ó±#fÚþ¼Û.³ÕË.{_Ã[Cž$çó†=^\ývqÚð¶-õ—G%5,ËàªMéŒ>úËqu\½±»Ï_’/ ›æe•á(ò*Û¥”›»ùÕíñÅ¢¿<è³ÚO//Ùô ;;af3é~ÏfŸçý(xPpyQw}ù÷+”Úï;‚eõmããeˆ ïoØ"3W—gPTp{Øñ æô¶X1kf=¡oP†ƒ¦øKH>z"çÉmÃÜ5¤ÞØÄÜPC#¦eöÚp^#3^5’q|èÃ,ŽO.“cé;$Œ»èø’¢@0Þ:…lÕ®Ç5 ïó9”¥Ø£˜»?66œR#š”ª¾°®Uã¸~N3´w!Ì2ÇRÔÒš¯`Cçë<Û ¨‚ÎÙå2ð‚áå›ð[—ÛÝ.+T#91†NÛ….Õ—ÁðâBïÀý ®½®çÄ. ±Ûîqñ âpÈÚý¢%Ì÷“Z4™þšß-ár»y.²o–ÄÔHÇ.ž²ö¤‡¼L;†·k‹m‚á® !q…;°H»¥ ¸‡U¾iLµÀjL\çû‘KsÀ€íœrõN¯ˆàlR@ÔŒB‰á`ð±³’þ€:…DRáÙäe¶od•ö81ߟ-N;z`ásIò-ÅøZzórY¼¬¬IMïM<5“‡€úUÃRyØÛvX7¸àLvb¨ž3CRëê4üÚ´"¢·Ïú´0‚Ñx¹Z—p§óÂ(XœáÒiDZñ$înk–ŽÙš» ³'„ã‰ Ž Ø6àÕÎ$rÿœ-±d­Œd½Ý:- ©;zãB<à}?°]ÄMª“òD3ÖSªDãvû %`Õˆ¶%Õ =xm±Ôn×#öȯ{ûkZ [ÏÇ0F^àqÀ9‡/}7´oº^lM˜ku“*(n¼ø†‚wþ¾áuØ6KëGMºý¨Õ·8Sˆ™rW—=Ã1õV頻|LF[oC ÜN$D5^!^a'rÔÓpB ·Ò(òÌÐ--V•UßшæmÔ·ødâÛ|èÆ: ¨×§î5h)Iˆ†ó0})*ÃSù8´Ç–ƒßñ†½HB;•è,µPí¶¯éõ°!ÝiÖ_ÒʲÙe,;I×ël©Á8.;xø^SÚ ’Ù·lù¢ÏL% 0H¥FF—4E¶N|%¹Â÷—×|ŸÖ’¼2ÔÞ(³]£ì”ˬ¡ ƒí™\Û²ÕkŒÏ¶fôh*úÁw {>”<êŒÒÉ罹Òs+倬ȪÈûÃF¾Ë GE_4e]‘t‘¨Å+CÓˆhå*ÃéóAÑ:눬s 3³F5GÇЇmõôóˆúi*ïx'û EØ%í²ç]¶Ç&½|¬e”®ôYmE>d°Ìl`ÌËó LÈu¥²kx†S³äE6 ͱüR+i0¨ð)J'´¶_Sä¶È> endobj 1033 0 obj 2237 endobj 1035 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.306 356.97 539.999 365.97 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 1037 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 344.97 145.494 353.97 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 1038 0 obj << /Length 1039 0 R /Filter /FlateDecode >> stream xœÍksÓ:ö{~…¾µ0Eõû1Ë2Z§äN›.‰YØfG$N⹎ÝÚN ÿ~–d+ °în€‰ÎÑÑyëèHáqd# þ¼¢_aì ånô(p6 äåÈq`Eh‡ù*(aoHIÄÐeXAÍ-ú8*Gº}þ D+da=,ƒ9g³½á~€Ý ŠãXèê`;Ѝ0XîÐåtç ëŠQwÚSFÖÿ\{]#×vþ4²Ðfô6]N|d[(]«°ð¬cY–ú(®ÓƒÒú|žÖùf“ÕÍ‹¯(ýc”¤Â6¾fCÌR¨7á{VFK/‰WXøça—ヌ S…ˆ¨ø¦ÝÐgâßG="Xi‹‡ña®ú+…EHÚŽz1°CKs?±þb¯¤²Ûc™ù´ÍÐ äD蜛t9‰| qB:Z^`,ÿ ‹Øè|žL’y2»šÎn$îu[“²ÉÛ¼*%®%ߊLBU-‡O¤Îé܉ùÚ©dØáD1†¤ã r „=y#û&[‰a[‰Á&êì&â»$»lHÖJïÜß^wôeÇm–|äjþu¬6+ÒTWÏLe¶c”nA7&nIJô-Cu¶Îê¬\‚žy‰˜ÐcÁp Áb*À "SØëÅû[ôPWÀi_g¨iI›í²²}sÔ“npŠOå2k¦µ&{öHÛ õœ‚c!„?Ðè“B"ŽZæ»Øò}àãÚ&KÈ$V÷X$]Ûèüy›•XÂ|ÜL;Óbײ|àhp—ʱœáC"GMFêåV‚˪\±”¾Pù./H-a–?b¨ùâ#å¬õñ×Ém’&Ц6à{{>üãz Kdø1š®Y…J2MĪEéüC‚Ö¡,U/(-ÏCáöŽŽ,Ûü ˜®q»%-¥7S" pÓ’Ñ+3G L„-eg®üý”¶àÇÉòM~Ô”âE€8Mg‹dž^ îå $\G7ù]2¿ÑœØ˜fÆ1¶lÐ;<=ó_yö©raϧÖB+`0xý̽~K™Ä D$2½i8y?;á‰0ÄžRφ¦¬NS–ôlDºÁ*ë\ÔѬÀù:çšP ¾C>µ$/5'ݰÞÅxÜ“‚2‘lEÍec–ü}5þ OÄpºmÛC¸K˜Bùî¡àÑ:]FmËÅ®K÷  &ǪÞàmóX¬¾aÑp?Š`ñ NPÐÛ¬^“ef¦ µ ÎrF—šû)ð1-uVd¤É…áîáãw?²šî ‰y‚–Wp°¥€U¥ÆtK€œLqãÔÓÃÒùQ(€tüö6Ñèj5†ãñ(]®©*w˜BÙSV˜þò|é/±/ºMy9 Í^dž6£Ù؟óéÍ ´)׈zo‘ÂV¿KfiÇ#8Àƒv6„7íždHbÊC*4Õ,–"±GzO«¯0:µ½¼Ð–Ðd¯³ŒåÝ2帶ðCd÷NèW!mVÏ×yÝ´LÄ‹5lòrSh!”iáÆ 5û ±Ç8 í1aG¡‚É1«¼YîQÉ»Uš=º¨×<¸ìÂ=ÂxbÃ0Šc8ÍeP¦_™á Ù´|ªþäZGØó¶Ú·y™5ƒ¥!T'úàéøÁ&rõp•‹=Ú ¹î©EPR ¿înh_$bÃÞ'8$ï  zh$$¶*çÞ]¤IÁ·'Ãþ‹$œ‚‡š¯,šJ5Éy‰Lå0û¾Ìij@§²6ûåÖt|ä ÌgùÖÐǤª^A¦ÃÞ'ìò’u.Ù÷l¹gB*þ2ÐkAù]jIØË™þ |øÊ®kIÒϳí>LÆ¡ã{Уz3¢oKYŽíÆQŒ¼ÐB\|éMÜ– ­G@‚} ‚:'Ú!/ˆû¨‚¢tFê3–o¦Ø‡‹W`ŸN¥Œ80dT÷û†!¼£õ"h mϲ=¡ù8п¡eéã äè:i;Ä,ê‘Òí:Ô¨‡øQú(":©Õ©3”-´élŸ¡v?UfèŽ2œ#_¹c .\ݱ%²¾!._öóxK)hБÚmùšžDû¦­v@ÁŽº„—ù‚À‰½V¢ÎÈê,̨Ñ//Í÷PÛãÐÔÒºš'´÷O¦íˆÅÉÌ»*t?Sò¼²Â%\ÅaWãࣿºÓ« ½øŒ¨ÌžÁ@“‡ëâ¾Oø‘ÆT@Éøê[üñ]2C_Î9œ¯Ð¸…Z_^˜¼<ð±k¼øMbœÞßM¯Ì%¾3 bŸé%Ÿ¦‹t‚EgöMæ÷wèêÃXÃ@-ðSâÛñ"ïôwjµ¿¼@)èo #"ü³˜ÞÌÆ·´ú±ÇtæÑ‡Ã3Dü»d±ß$ÿN“O):ëGþìo¦8†Ì!D¯PÓÉúÈ> þ…Ú Gãú+V[ã¨WTé¬ÃgånV(Q!¾IuøW*Ðûž!C ÌÔÇ]@…qØéãÃM$Ô¿¡PW@‡bœ]'mB”±)ýEb¨Qñ .¢ -OˆPRªWTMmzÆg¨Ý¯Õžw8ÊpΉ¢ {´Íp> endobj 1039 0 obj 2758 endobj 1041 0 obj << /Length 1042 0 R /Filter /FlateDecode >> stream xœÍUKOÛ@¾ûWÌ1‘è²»~Q$(æQµ¥$–8'^K~Û!äßwí]ÛëØH=цDž×~3óÍxyÕ`þ÷¥zØ3 «D{•66Ý’&Ób# ;€TÓ¸ ì‰UˆõÚ*£…òZªa¸ÖŸyP™°Óð\À,´{žÜ´n9³ÙLÖJqœ*…Ž,.¬8¾M(\futS}„ÿyõjE:¡ÿAEÖÚ…§_™@0xa·„rf)ƘÚ&8H§³êCÁKàqâåÑzÍòbú ÞwÍõdoâ`µ=”mT¯PÏa¸ïQÖ«µwVþ3.lÜ‚¨É›¨\±œ¨|VŽF4k†ÄóCF$”røp>5UŸ™üãQØÕA‚‘Ó›±‰B±>™µÁ «Üm?³Ã~ð`ŸNK±PÀÞÙj[FY Y°ü NN¾Â…{u7wá4+_xHšú ; Œp†AÇInö–/îÀ”È‚ {/Y'è”^è¢ôÓÀÏ%6ëd?޳Ý0u#Šªù›nGݾ‚(›;T²¶ŠÂˆ)….÷¼-¢tÝ©‚ZÁ¢ÂA‘®ówŸ8ºà~ &á» ”#ôzÏ­¥]dM…FiTõ‹Z›§øS¶‹÷ýèºñœ»(Ž[eÙ¡R•ƒKf9­HeKXFûìʽ \™ÆWåKT­”iÀdûÛ‚I¥µ¦Y)%î Ž¤,ë2j[׳  ¶ÈU?,Û_ÒÃÛäì-ʶ… ×èQÛ%iÀë ì|¼¸Ê6ü4ës4àIJ89¿òÜù¸çßn`~÷ ¥…wî¹?Ý_ÞÓ5o²=r[8h—ó»ßàÍo¯¯ÝysΞ#üÎì òlÓ^ Eé—,aiÙ@Œ\TD¼ ãâ¦R ƒÓ¿½©È`….YQæÙü&êý§ýÖø4å endstream endobj 1040 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1041 0 R >> endobj 1042 0 obj 715 endobj 1044 0 obj << /Type /Annot /Subtype /Link /Rect [ 291.001 512.4 391.505 521.4 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 1046 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 363.06 184.19 372.06 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 612 0 R /H /I >> endobj 1047 0 obj << /Length 1048 0 R /Filter /FlateDecode >> stream xœÍkoÜ6ò»…>ôCŒ³RoÅÎíƒ&¾&[Üê¢WÜ]!Zi£‡£è¿!‡"GÝæú¡wiRÏ Éá¼83¤üùŒ; þ»”?âÔsÖû³ÏšÆØsüH“ÂÈá±±ÄÙ;IÂÄ)åÄ(§hÐWT=‘óϳêŒ9ßýü LÊæ†Îã›1G6Ï~„ÍÃÈõ£$MS-«çò$‘[ønÀzï<¿Ù{ÎëZͤ—ŒØÿ\z*‘Ͻÿ ‰¤LÊçÊëü]åúÑ@°ñ C·Tø¸>Ò€âz!l.‡Jí ýS `¨4ßG5ѬÈâ©]•ŠåæÌÙž½\=¿ÎœÕÆž¢X.äÌM¼TþñœÕÞùù½ó_œÕÛ³7«Y@üÅV›9RîÍãiÄFëæ;馂*BÆQ±W»ìЉFjì¼ì‹²sn*纯Ö]QW-ê,õüšKEƒ ¿ˆ»`$àj~×ÈUÝ·mqá¬vÂùþã?8¯Åƒ(ëÃ^Tó]S÷d¬˜² ËÄsc¤iäÈò›â¡hAœNÈ‚ÔùS­H–‚Z^<¨Užšb»ëœsçRŠýÌcœ]Âÿ@؃Zí„•i„'1ãPáþ`{ˆeH?ArZô5bä› ±£G5²;1,qAUws/C} ±P”Ù}).`eÙä©î5´Î* É@v¼Ñ`ý8LèÛ¢ÚjøÐÔk‘÷ʃ’€‘¨ +eº~iõ’h¶Ý6b›™ýhp©ñfd¶†¢¤œ(qÃB›têJPßK'êw»¬sT|:RL`±d¾ržÏ¼»Ä"‹bŽ‹eù6^±rnà@'H·Ý®ÂÙÊüܾ˜3Œ=7•M?ót2»ó¼p2/Í“¢~ìàPgM>mFF+ÓÀ£3-ò•ŒEÐC™”¦Q™ÓŠ9M#£®i$ hÊýA@Æç×5ÔŽlQ= SƒÆtÒ¹û5k—äP.´è.{ ü«znŸE³²&Û‹Nµœ»ñ %Âkp¨RQÛ .ö‡îÉ`À êN´˜8‘xMä¶L ²ïË®8”‚2Ayì‚zƒ©1¨þ$žë&·S‹ªíD–“¥ 6àÉÄëz¿Ï$)³Öl…”GH=¶³°Õ5´wØ£!B}†´-Âòè•u–c íj_«P4›µ*;iaê½]­­YUn ¸¯évlÑ â³cA¡¢-d.·Á†fHÜ ×{Y™ó KyÜ¥ |Òˆ®o§ZÂkca­¼ÆF§IsqкUDàþPWG„8¾)ÚuaÖ/Ø1ðŽÚ‹œ/±Òe_!}›m ªÛ)_§‚ 9ÏP®G­‡"Ý­ECؘOÓ>Cä~$„ÈïÎ-^ž´ƒñIPiL|³ÙК“Šj$‚¥Âiv~u™sµ^‹¶udË—Oè3g+S7ÂÞ&XàáL§ËǤÓu±œU'?†ü Ý{Çé©ê4Ÿ÷öõËWÎ-Ä^eW?Üœ*R~š¸>å$ cSW[´.“—¼q{©HƒƒFREÈÈTínk?Õ„„7S ïS)µAZxD„]±ÞY´hð¹ÏZ:¶Q™I#·ÒRDR¢ÂÛéÐÜpgÙbª `ÈLI–à^_œ•5É„!@×–÷먢 („Þͪ@Ñ®³ƒå´RUÑî mŒ|b]l¬´…UYkí.…€D°`ÙèMÐA¡’WZdÁoîÉ 6©TѦ™Ð Ç\FUSuŸ4,)‡¤ 2!å9öÒ´Ï–8vY³t÷‘‘$ª-œ—P®ëéñ–¦óƒ‰éÄ—lMÈ%‡ K4Üiž_§Ó u×?‚¤’x Œ>¾ùáÍ«•äã…*ýý¶©öúêß·×ïn߯¾'Ä;©ŠxU—ý¾º;ÿŒ\¸}GÐýÓJ^WÑfw}?H\ÎÆý(^h§+Æî©â}«=‚hA'šs¨>µÃÌ…ÑDˆzí¶ÌÐí7yARå4AÕ@„UjCð¨wäÓOBš"awãn™ßükõáŠ~½½þup’¦kOhŒúëØœ?r–´N8Mÿ…:Q‘ïúú°"HC)é§I )úô B»½à©ê²/®%ÜüÙ­óZmáê=“ê”àà‹‘ÐÕ[©xšú‡Òé&exÉ(K‹a„#œ›×Òè‹R¨A‘’Q†ÚºˆÐd‡“ë43•ú Ïd|—›í-R^þnè2uu¤EL©%/™š4~ØÑkZ’ÍC%]…ʹƆ˱­á›žn[†O.¡~¯Òí"Ýp9!¥½¼ÛE †‚’=6Ôºo†ðJõ+K×á+ª&híRòäb¦š/oHÐMÈÂÔ¡t¹–´¢ãßás§%ŒnÔš;ÜHDRhB{Ób# ͦ·¤GG‹AÕŽÄ]0QìOL¤Mû•=¬–Zäh½®÷‡¬)ZïE÷( ZJ•T §!ÏÈk¯—êkï zŒ|lÓÈË÷×K6Ý¡Âd¥¸°èð§Ñ‚¬ƒüYtú$à7Dp¹~^BÂòˆ¬»žÎîêObˆ]Eø(ÛpÖÚ’DI.?¨C×TÍ“Œˆ/oT Í_Ê#O,6ˆ&Vë²l`u”ì«mi¦Ý7Ùú“®”ž < ï]ß}Θ—ð)¾-ÅFÅ•lqõcëß–6jãIšÆ<]`f¥ÎÿP.χ’_òCî/Ée>¦•`>xRy*?Žž =nÄ´h„t¾±KÒP9‰hDsÿòt²gû´¿¯K|¡c²ñ¼=ØÄ\HÉÌ3Œ? ¤ 2!Ö~îGó‡ø°ìd>î‰0uÓÈODÞ‚&BxŠ·iÜå„/‚Ðæ9?¢l•…x~‘¯?.ˆgåk哤$ ðóÏ)ùîÎç™/òùdþ;û­A>NFÛxk Õo¿ûXê>÷…}LDÙ a< ¿¢ë€P˜T]}ïN8=–¯˜8)XÐI;¦î6A ®ö8áü0õdtŒ±V¬"jw~B—è,1cG²ÄWI„ÀÎé|š'¤»;?þT£~)f,õ’îÑÍ!x g_É_ ±*_.†$¥P >å†2€GÞIü (d˜m<|7m ŒyÁ;ùè!W IÀ®~œ,Hþ-Ý ”wØàD\0HД¡4ô¸YÉÎ]_u‹š‰Êªm’³µµ½íxæI[uÎä÷ê~<ûG+ endstream endobj 1045 0 obj [ 1044 0 R 1046 0 R ] endobj 1043 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1045 0 R /Contents 1047 0 R >> endobj 1048 0 obj 3145 endobj 1050 0 obj << /Type /Action /S /GoTo /D [719 0 R /XYZ 72.0 143.808 null] >> endobj 1051 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 709.5 189.569 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1050 0 R /H /I >> endobj 1053 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.451 709.5 539.92 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1050 0 R /H /I >> endobj 1054 0 obj << /Type /Action /S /GoTo /D [886 0 R /XYZ 72.0 529.02 null] >> endobj 1055 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 697.5 198.979 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1054 0 R /H /I >> endobj 1056 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.482 697.5 539.921 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1054 0 R /H /I >> endobj 1057 0 obj << /Type /Action /S /GoTo /D [889 0 R /XYZ 72.0 674.5 null] >> endobj 1058 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 685.5 186.25 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1057 0 R /H /I >> endobj 1059 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.442 685.5 539.922 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1057 0 R /H /I >> endobj 1060 0 obj << /Type /Action /S /GoTo /D [892 0 R /XYZ 72.0 514.11 null] >> endobj 1061 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 673.5 192.34 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1060 0 R /H /I >> endobj 1062 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.46 673.5 539.92 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1060 0 R /H /I >> endobj 1063 0 obj << /Type /Action /S /GoTo /D [895 0 R /XYZ 72.0 452.75 null] >> endobj 1064 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 661.5 189.569 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1063 0 R /H /I >> endobj 1065 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.451 661.5 539.92 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1063 0 R /H /I >> endobj 1066 0 obj << /Type /Action /S /GoTo /D [898 0 R /XYZ 72.0 276.705 null] >> endobj 1067 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 649.5 184.517 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1066 0 R /H /I >> endobj 1068 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.463 649.5 539.891 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1066 0 R /H /I >> endobj 1069 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 637.5 176.849 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 1070 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.497 637.5 539.896 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 1071 0 obj << /Type /Action /S /GoTo /D [933 0 R /XYZ 72.0 720.0 null] >> endobj 1072 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 625.5 172.245 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1071 0 R /H /I >> endobj 1073 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.459 625.5 539.924 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1071 0 R /H /I >> endobj 1074 0 obj << /Type /Action /S /GoTo /D [939 0 R /XYZ 72.0 617.482 null] >> endobj 1075 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 613.5 214.489 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1074 0 R /H /I >> endobj 1076 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.532 613.5 539.921 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1074 0 R /H /I >> endobj 1077 0 obj << /Type /Action /S /GoTo /D [945 0 R /XYZ 72.0 662.166 null] >> endobj 1078 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 601.5 226.455 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1077 0 R /H /I >> endobj 1079 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.552 601.5 539.853 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1077 0 R /H /I >> endobj 1080 0 obj << /Type /Action /S /GoTo /D [945 0 R /XYZ 72.0 226.525 null] >> endobj 1081 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 589.5 246.543 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1080 0 R /H /I >> endobj 1082 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.598 589.5 539.884 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1080 0 R /H /I >> endobj 1083 0 obj << /Type /Action /S /GoTo /D [948 0 R /XYZ 72.0 627.324 null] >> endobj 1084 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 577.5 198.999 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1083 0 R /H /I >> endobj 1085 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.483 577.5 539.922 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1083 0 R /H /I >> endobj 1086 0 obj << /Type /Action /S /GoTo /D [951 0 R /XYZ 72.0 630.75 null] >> endobj 1087 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 565.5 207.86 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1086 0 R /H /I >> endobj 1088 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.509 565.5 539.919 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1086 0 R /H /I >> endobj 1089 0 obj << /Type /Action /S /GoTo /D [951 0 R /XYZ 72.0 301.8 null] >> endobj 1090 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 553.5 184.575 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1089 0 R /H /I >> endobj 1091 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.435 553.5 539.92 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1089 0 R /H /I >> endobj 1092 0 obj << /Type /Action /S /GoTo /D [951 0 R /XYZ 72.0 158.7 null] >> endobj 1093 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 541.5 158.32 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1092 0 R /H /I >> endobj 1094 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.389 541.5 539.959 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1092 0 R /H /I >> endobj 1095 0 obj << /Type /Action /S /GoTo /D [954 0 R /XYZ 72.0 366.634 null] >> endobj 1096 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 529.5 151.11 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1095 0 R /H /I >> endobj 1097 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.365 529.5 539.958 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1095 0 R /H /I >> endobj 1098 0 obj << /Type /Action /S /GoTo /D [959 0 R /XYZ 72.0 720.0 null] >> endobj 1099 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 517.5 156.1 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1098 0 R /H /I >> endobj 1100 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.383 517.5 539.96 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1098 0 R /H /I >> endobj 1101 0 obj << /Type /Action /S /GoTo /D [962 0 R /XYZ 72.0 639.161 null] >> endobj 1102 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 505.5 211.18 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1101 0 R /H /I >> endobj 1103 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.522 505.5 539.922 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1101 0 R /H /I >> endobj 1104 0 obj << /Type /Action /S /GoTo /D [962 0 R /XYZ 72.0 371.266 null] >> endobj 1105 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 493.5 244.848 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1104 0 R /H /I >> endobj 1106 0 obj << /Type /Annot /Subtype /Link /Rect [ 522.347 493.5 540.641 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1104 0 R /H /I >> endobj 1107 0 obj << /Type /Action /S /GoTo /D [962 0 R /XYZ 72.0 136.482 null] >> endobj 1108 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 481.5 196.766 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1107 0 R /H /I >> endobj 1109 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.475 481.5 539.921 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1107 0 R /H /I >> endobj 1110 0 obj << /Type /Action /S /GoTo /D [965 0 R /XYZ 72.0 379.78 null] >> endobj 1111 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 469.5 197.872 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1110 0 R /H /I >> endobj 1112 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.477 469.5 539.919 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1110 0 R /H /I >> endobj 1113 0 obj << /Type /Action /S /GoTo /D [968 0 R /XYZ 72.0 630.105 null] >> endobj 1114 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 457.5 216.754 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1113 0 R /H /I >> endobj 1115 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.503 457.5 539.885 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1113 0 R /H /I >> endobj 1116 0 obj << /Type /Action /S /GoTo /D [968 0 R /XYZ 72.0 165.666 null] >> endobj 1117 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 445.5 214.509 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1116 0 R /H /I >> endobj 1118 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.532 445.5 539.921 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1116 0 R /H /I >> endobj 1119 0 obj << /Type /Action /S /GoTo /D [974 0 R /XYZ 72.0 708.0 null] >> endobj 1120 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 433.5 190.686 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1119 0 R /H /I >> endobj 1121 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.457 433.5 539.923 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1119 0 R /H /I >> endobj 1122 0 obj << /Type /Action /S /GoTo /D [974 0 R /XYZ 72.0 227.726 null] >> endobj 1123 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 421.5 197.892 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1122 0 R /H /I >> endobj 1124 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.477 421.5 539.919 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1122 0 R /H /I >> endobj 1125 0 obj << /Type /Action /S /GoTo /D [977 0 R /XYZ 72.0 674.089 null] >> endobj 1126 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 409.5 198.441 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1125 0 R /H /I >> endobj 1127 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.482 409.5 539.923 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1125 0 R /H /I >> endobj 1128 0 obj << /Type /Action /S /GoTo /D [977 0 R /XYZ 72.0 315.779 null] >> endobj 1129 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 397.5 213.961 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1128 0 R /H /I >> endobj 1130 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.531 397.5 539.922 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1128 0 R /H /I >> endobj 1131 0 obj << /Type /Action /S /GoTo /D [980 0 R /XYZ 72.0 572.231 null] >> endobj 1132 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 385.5 254.76 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1131 0 R /H /I >> endobj 1133 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.588 385.5 539.848 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1131 0 R /H /I >> endobj 1134 0 obj << /Type /Action /S /GoTo /D [983 0 R /XYZ 72.0 426.692 null] >> endobj 1135 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 373.5 198.989 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1134 0 R /H /I >> endobj 1136 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.483 373.5 539.922 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1134 0 R /H /I >> endobj 1137 0 obj << /Type /Action /S /GoTo /D [986 0 R /XYZ 72.0 470.376 null] >> endobj 1138 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 361.5 243.51 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1137 0 R /H /I >> endobj 1139 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.608 361.5 539.858 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1137 0 R /H /I >> endobj 1140 0 obj << /Type /Action /S /GoTo /D [989 0 R /XYZ 72.0 365.08 null] >> endobj 1141 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 349.5 178.9 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1140 0 R /H /I >> endobj 1142 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.453 349.5 539.956 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1140 0 R /H /I >> endobj 1143 0 obj << /Type /Action /S /GoTo /D [992 0 R /XYZ 72.0 558.23 null] >> endobj 1144 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 337.5 228.32 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1143 0 R /H /I >> endobj 1145 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.541 337.5 539.886 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1143 0 R /H /I >> endobj 1146 0 obj << /Type /Action /S /GoTo /D [995 0 R /XYZ 72.0 492.65 null] >> endobj 1147 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 325.5 202.406 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1146 0 R /H /I >> endobj 1148 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.456 325.5 539.884 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1146 0 R /H /I >> endobj 1149 0 obj << /Type /Action /S /GoTo /D [998 0 R /XYZ 72.0 342.506 null] >> endobj 1150 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 313.5 184.585 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1149 0 R /H /I >> endobj 1151 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.435 313.5 539.92 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1149 0 R /H /I >> endobj 1152 0 obj << /Type /Action /S /GoTo /D [998 0 R /XYZ 72.0 222.227 null] >> endobj 1153 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 301.5 231.653 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1152 0 R /H /I >> endobj 1154 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.513 301.5 539.847 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1152 0 R /H /I >> endobj 1155 0 obj << /Type /Action /S /GoTo /D [1001 0 R /XYZ 72.0 638.72 null] >> endobj 1156 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 289.5 237.99 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1155 0 R /H /I >> endobj 1157 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.586 289.5 539.852 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1155 0 R /H /I >> endobj 1158 0 obj << /Type /Action /S /GoTo /D [1001 0 R /XYZ 72.0 517.28 null] >> endobj 1159 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 277.5 260.267 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1158 0 R /H /I >> endobj 1160 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.605 277.5 539.847 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1158 0 R /H /I >> endobj 1161 0 obj << /Type /Action /S /GoTo /D [1004 0 R /XYZ 72.0 614.214 null] >> endobj 1162 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 265.5 249.828 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1161 0 R /H /I >> endobj 1163 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.573 265.5 539.849 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1161 0 R /H /I >> endobj 1164 0 obj << /Type /Action /S /GoTo /D [1007 0 R /XYZ 72.0 282.426 null] >> endobj 1165 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 253.5 225.577 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1164 0 R /H /I >> endobj 1166 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.529 253.5 539.882 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1164 0 R /H /I >> endobj 1167 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 241.5 116.95 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1017 0 R /H /I >> endobj 1168 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.357 241.5 539.927 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1017 0 R /H /I >> endobj 1169 0 obj << /Type /Action /S /GoTo /D [1013 0 R /XYZ 72.0 575.42 null] >> endobj 1170 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 229.5 135.43 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1169 0 R /H /I >> endobj 1171 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.385 229.5 539.962 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1169 0 R /H /I >> endobj 1172 0 obj << /Type /Action /S /GoTo /D [1013 0 R /XYZ 72.0 240.88 null] >> endobj 1173 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 217.5 195.67 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1172 0 R /H /I >> endobj 1174 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.473 217.5 539.923 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1172 0 R /H /I >> endobj 1175 0 obj << /Type /Action /S /GoTo /D [1022 0 R /XYZ 72.0 720.0 null] >> endobj 1176 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 205.5 189.021 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1175 0 R /H /I >> endobj 1177 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.45 205.5 539.921 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1175 0 R /H /I >> endobj 1178 0 obj << /Type /Action /S /GoTo /D [1022 0 R /XYZ 72.0 666.0 null] >> endobj 1179 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 193.5 216.198 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1178 0 R /H /I >> endobj 1180 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.502 193.5 539.886 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1178 0 R /H /I >> endobj 1181 0 obj << /Type /Action /S /GoTo /D [1022 0 R /XYZ 72.0 565.2 null] >> endobj 1182 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 181.5 170.012 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1181 0 R /H /I >> endobj 1183 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.453 181.5 539.925 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1181 0 R /H /I >> endobj 1184 0 obj << /Type /Action /S /GoTo /D [1022 0 R /XYZ 72.0 498.0 null] >> endobj 1185 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 169.5 176.83 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1184 0 R /H /I >> endobj 1186 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.41 169.5 539.92 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1184 0 R /H /I >> endobj 1187 0 obj << /Type /Action /S /GoTo /D [1022 0 R /XYZ 72.0 327.6 null] >> endobj 1188 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 157.5 166.1 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1187 0 R /H /I >> endobj 1189 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.414 157.5 539.959 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1187 0 R /H /I >> endobj 1190 0 obj << /Type /Action /S /GoTo /D [1022 0 R /XYZ 72.0 124.8 null] >> endobj 1191 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 145.5 205.159 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1190 0 R /H /I >> endobj 1192 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.465 145.5 539.884 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1190 0 R /H /I >> endobj 1193 0 obj << /Type /Action /S /GoTo /D [1025 0 R /XYZ 72.0 592.872 null] >> endobj 1194 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 133.5 201.84 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1193 0 R /H /I >> endobj 1195 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.455 133.5 539.885 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1193 0 R /H /I >> endobj 1196 0 obj << /Type /Action /S /GoTo /D [1025 0 R /XYZ 72.0 492.92 null] >> endobj 1197 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 121.5 193.457 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1196 0 R /H /I >> endobj 1198 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.466 121.5 539.923 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1196 0 R /H /I >> endobj 1199 0 obj << /Type /Action /S /GoTo /D [1025 0 R /XYZ 72.0 394.592 null] >> endobj 1200 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 109.5 214.052 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1199 0 R /H /I >> endobj 1201 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.456 109.5 539.846 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1199 0 R /H /I >> endobj 1202 0 obj << /Type /Action /S /GoTo /D [1028 0 R /XYZ 72.0 699.3 null] >> endobj 1203 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 97.5 212.943 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1202 0 R /H /I >> endobj 1204 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.453 97.5 539.847 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1202 0 R /H /I >> endobj 1205 0 obj << /Type /Action /S /GoTo /D [1031 0 R /XYZ 72.0 699.3 null] >> endobj 1206 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 85.5 163.92 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1205 0 R /H /I >> endobj 1207 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.433 85.5 539.923 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1205 0 R /H /I >> endobj 1208 0 obj << /Type /Action /S /GoTo /D [1043 0 R /XYZ 72.0 720.0 null] >> endobj 1209 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 73.5 162.61 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1208 0 R /H /I >> endobj 1210 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.425 73.5 539.865 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1208 0 R /H /I >> endobj 1211 0 obj << /Length 1212 0 R /Filter /FlateDecode >> stream xœÍÝË–Yv˜éy=E “…ÌììsÙ=+ÕE"W±ÉªLuD ÐY`«+Yß¾m{ ¸#Ë¿¨›”qùG ¾HÀ}û±cÿãûÃvþï¨ÿ3óxøöû_ü¿¶?Ìã¡¿ÔÇÃ>Ƕ¾øø“Õ×ß*|ñÃJ>þ°]~õcýô“yø?ñöÛÃþÅûïgôLJí±?üë/¶«z˜¯ñûóƒ÷ñØÆÊÌŸëñ¸¯U¢=Žóß~ÿðÿöûãá×ï.õOŸ}=ÐöÿùgÿégÔöãÿŸÑöðÝ/þÓ7¿ø¿íûöðÍ?? Œö8³þ爇õØŽ§?|óýÃûê¿üÛŸ_¿ÿú÷¿{ø¯?¼~ÿðŸ|óÇ×óß¾ù»_üæ›ÊËC\¾ŽóÿÍÇË7Ó‹ßè±½üO¾ÑþýןõüÿñØž~íü•Ç£Ÿœú­?}´ýøë7~úa¿|­žþï¿6ê“ÅŸK]¾hÿ+?ø—Qf<îûvþÏ8?­íq½PùË›O^~£ý/þÚ]qÖÇþòŸ*ÖÕwد_ÿéõ‡×sþö¶=އ¯¾þðêÃëï_¿ýðôgü÷µûùíÜGž_’ß§Ÿ¬ÿ|Ù±?n32GvZ}¿·ןóãU·úpWËö¶ž¯ó%ègÕ7ï|ûí«§ÁàùßâÏÍÏ×k9Wæ8n<Îóúc¸èçWd_–µÇlçW=ç¸^vk"'uJ}úKÝ©^R÷ê zJ=6ªÉrå ËI–“,'Y.²\d¹È2É2É2É2ŲætR‹eMê ÞŲfuR‹eMë¤Ëš×IM–,Y6² ² ² ²ìdÙɲ“e'ËA–ƒ,YN²œd9Ér‘å"ËE–‹,“,“,S,k'µXÖ(ê],k˜'µXÖ8êC,k '5Y6²ldÙÈ2È2È2È2Ȳ“e'ËN–ƒ,Y²œd9Ér’å$ËE–‹,Y&Y&Y¦XÖ¤Oj±¬YŸÔbYÓ>©Å²æ}PbY?©É²‘%Í}‚æ>AsŸ ¹OœÛoÛØöó%/Œ¹.ƒ¿u¾ð!Ó±§ÁßÚ¶¹öëe{;®'ç+¬Ö¶§1Ü¥úÛ·?¼~ÿái¸¸?ΟÛµñê>Yzµb>Î12ב´îü¦=ŸüfŽ~㾜ߴRO©ÏoZ©Õƒê”úü¦•ºS½¤îdÙɲ“å ËA–ƒ,YN²œd9Ér‘å"ËE–I–I–I–)–5¬”Z,kX õ.–5¬”Z,kX)µXÖ°Rj²ldÙȲ‘eeee'ËN–,;Y²d9Èr’å$ËI–‹,Y.²\d™d™d™bYÃJ©Å²†•PïbYÃJ©Å²†•PbYÃJ©É²‘e#ËF–A–A–A–A–,;Yv²d9Èrå$ËI–“,'Y.²\d¹È2É2É2Ų†•R‹e +¥ËVJ-–5¬„šæ>AsŸ ¹OÐÜ'hî4÷ šûÍ}.»È5'Íç.ÓÊØsÕåî²î2®Ìmuããí­]+Ï×*/«ÿúç?þ´M1vZYãÐó ‘£Åõ£<¯¿ZÖW™3“–Í3}úp×ËnM¥nTªSê8¨îT/©ûNuPM–ƒ,Y²d9Ér’å$ËE–‹,Y&Y&Y&Y¦XÖTQj±¬©"Ô»XÖTQj±<±¬©¢ÔbYSE¨Y6²lddddÙɲ“e{t¾¤¾<'¹£N©ÇAu§zI=wªƒê)õÚ¨nT“å"Ë$Ë$ËËš*J-–5U„zËš*J-–5U„úËš*JM–,Y6² ² ² ² ²ìdÙɲ“å ËA–ƒ,'YN²œd9Ér‘å"ËE–I–I–)–5U”Z,kª(µXÖTQj±¬©"Ô‡XÖTQj²ldÙȲ‘e#Ë Ëš*ŽóYÊ1a‚ötéóù¤}!Ë>½ôùjÙÞâz¤xyÂÿiõ÷¯ßÇ'"^=ÊG"ÒºOÎD¼Zw52øôPÄ¿^zþu£zPRzþu§zIýéáˆwÔAõ”zå ËA–ƒ,'YN²œd¹Èr‘å"Ë$Ë$Ë$Ë˧%ÞQ‹å‹óÿz½‹å‹ï¨ÅòÅ™‰wÔbùâÔÄ;j²ldÙȲ‘eeee'ËN–,;Y²d9Èr’å$ËI–‹,Y.²\d™d™d™bùâ8Å;j±|q â_¯w±|q¤âµX¾8Tñ¯×‡X¾8VñŽš,Y6²ldddddÙɲ“e'ËA–ƒ,YN²œd9Ér’å"ËE–‹,“,“,S,_œ·xG-–/N\¼£Ëg.ÞQ‹å‹Sÿz}ˆå‹sï¨É’æ>AsŸ ¹OÐÜ'hîóâøE˜¸½8QÖ}:…¼Z··~õÚãáòöý§Õ¯ß¼úîí»>¼ùö‡Ë´ó|”‡¯^½ýãóO.sÉ«™äùuÙ?^b}õ˜Ïk¯–_ u¦­ ZV?«7>ÚõDò ºS½Îú8¿ö€ëãNuP=¥>ŸãHݨT§Ôý ºSM–ƒ,Y²œd9Ér’å$ËE–‹,Y&Y&Y¦X›X›X›X›X»X»X»X‡X‡XY6²ldÙȲ‘eeee'ËN–,Y²d9Èr’å$ËI–‹,Y.²L²L²L²L±l›X¶M,Û&–m˶‹eÛŲbÙ±l‡X¶ƒ,Y6²lddddÙɲ“e'ËN–ƒ,Y²œd9Ér’å"ËE–‹,Y&Y&Y¦XÆ&–±‰elb»XÆ.–±‹eìb‡XÆ!–AsŸ ¹OÐÜ'hî4÷‰©ÜejùqÃ%¬ª™åÑ3cÝX¶·ñY¿=\®Üù4Z—GoÇÃW_ÿþwÿáoßþåÝÿýúÏ¿ø‡w?~xóöõŸ¿4?ÿ£YQ·šßŽëG}^~µ¬ØjÖÙdÙù¤iîç—~F\/»œOš¤žRŸOš¤nTªSêóI“Ôê%ueee'ËN–,;Y²d9Èr’å$ËI–‹,Y.²\d™d™d™bylbylbylbyìbyìbyìbyìbybybydÙȲ‘e#Ë Ë Ë Ë ËN–,{Y>=ÙûëñØ%‰'Äs“¸I<$Nˆ×!q—XSSÏߔۂmÁ¶ƒ`ÛA°í Øl¶C›6l"ØD0D0D0D°‹`Á.‚C‡"8EpŠàÁ%‚K—¦¦¦&Æ‚±`l ;Æ‚±ƒ` Æ‚qˆ`Á&‚MCë6:£×•Ö7žqÔw™„æÜ¶<–,»ŒBW®>®Wím]½xÈϯü8éü¸Eôá«_¿þç7oß|xóîíÕs{Öõ,óç>³ëºQ=¨N©ëŒp¨;Õë¬#³ïÇuuP=¥®3¡nTªSê:#êN5Y²d9Èr’å$ËI–“,Y.²\d™d™d™bylbYÛL¥ËÚf õ.–µÍTj±¬m¦R‹em3…º‘e#ËF–,ƒ,ƒ,ƒ,;Yv²ìd9Èrå ËA–“,'YN²\d¹Èr‘e’e’e’eŠem3•Z,k›)Ô»XÖ6S©Å²¶™J-–µÍTj²ldÙȲ‘eeee'ËN–,;Y²d9Èr’å$ËI–‹,Y.²\d™d™d™bYÛL¥ËØÄ2v±Œ],cËØÅ2±ŒC,ƒæ>AsŸ ¹OÐÜ'hîs¹Lþ§ûñÜ=UüxR§®úôÞ?W«ö–Ÿ÷ë²Mô‹SÖó!ÆÃW¿ú—Wï_}ûáõû7— ç¯fOÇc¬•¹b¿ñhÏsµîüºìçWñüGßÖåãùïí¶µ8n¬»5좼[¾(¯Ó«%Ë'åu€µäÍòa¹©.S]¦ºL5M5M5Iµ†_”“j¿('Õ€QNª5“ü Õ‚QnªÍT›©6Sm¦¦¦¦ÚMµ›j7ÕaªÃT‡©S¦:Mušê2ÕeªËTÓTÓTÓT“Tk•ü Õºõ)å¦ÚLµ™j3Õfªaª5‰™u SÊxá2‰É™¹×^Xw9AkËÚÉqcÝíIL|~ÔÖ§—wÍÚñr¹ãé÷¯ß~¸»œ¯"ëöÛV{m®èù>_W·†›}ÛÆnËÚcö}ÛÎÿÐo¬»Eœß ”'åqXÞ-_”÷Ýò°|R>6ËMu˜ê0ÕiªÓT§©.S]¦ºL5M5M5M5Iµ¦Œ”“jM%ßIµ¦Œ”“jM)'Õš2RnªÍT›©6S S S Sí¦ÚMµ—êÇ۳ߓ'åã°¼[¾(Ÿ»åaù¤|m–7ËMu™jšjšj’jM)'Õš2J¾“jM)'Õš2J~jM)7ÕfªÍT›©†©†©†©†©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2Õ4Õ4Õ$Õš2RNª5e¤œTkÊH9©Ö”QòƒTkÊH¹©6Sm¦ÚLµ™j˜jÓ¿3ï·ž¿qžv9Bjí>i÷â©ëu{Ä1cÿü°©_½ûþÏï~|ÚáUwLúdÎx5™ëkœk/ó«z~€½óÙØ¹l­«Þô–9o}Þ·&{R/©ëž7PÕSêºí ÔêAuJ=Ér’å$ËE–‹,Y&Y&Y&Y¦XÖOj±¬!Ô»XÖOj±¬žÔbYã;©É²‘e#ËF–A–A–A–,;Yv²ìd9Èrå ËI–“,'Y.²\d¹Èr‘e’e’eŠeMé¤ËšÑA½‹eMè¤ËšÏA}ˆeMç¤&ËF–,YYYYYv²ìdÙÉrå ËA–“,'YN²œd¹Èr‘å"Ë$Ë$ËËÂI-–5‚“Z,k'µXÖø êC,kø&5Y6²ldÙȲ‘%Í}žnŽylû>™.]6÷m¹mÇHZw™ºõÌ6úu{ôS·ñùyTß¼ú¿þôñþ˜G݃óÿxõþMýÒÕÖ¾óûº×ÎÅQƒ^=Ì'pµðü²ÔÍ?·ýÀ…ù8öóëÒÚuW“ƒó¹Ôê%õùÜFê zJ}>·‘ºQ=¨&ËN–,;Y²d9Èr’å$ËI–“,Y.²\d™d™d™bYg I-–ušÔbYg¢I-–u6Ô‡XÖiR“e#ËF–,YYYYv²ìdÙËråZ[Ü“Íòfù°<)Ÿ‡åÝòEùÚ-ËM5M5M5M5IµŽf£œTë6ÉwR­ãÚ('Õ:¸rR­#Ü(7ÕfªÍT›©†©†©†©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2ÕeªiªiªIªu~å¤Z'ÉI¾“j)G9©ÆNªqj¤‡©6Sm¦ÚL5LõrSÆóYM´[ãÅ/÷.› [dÎ>láeîYÅyë%Àí¹çüüº/Í9ëV{fÍ9o¬º|VõîïÕgU—¿ç'u9+ÖO6{kç‡ë·>ËÏ¿ÚçsM©SêújSÞ-_”ŸO5)Ë'åçSMÊÉ´.š§ÜT›©6Sm¦¦¦¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT—©¦©¦©&©©©©;©;©;©;©©©‡©6Sm¦ÚL5L5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©¦©¦©&©ž¿i9©¶TÛFªm'Õ¶“jÛIµ¤ÚRm‡©6Sm¦ÚLµ™j˜j˜j˜j7ÕnªÝT‡©S¦:Lušê4ÕiªËT—©.SMSµÉR³ÑR³ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–ÂfK5·žë§Û»ÂÀ¶æÖmå¶Í>maÍ­slÛqÜXw{l½>?²óW?¾ÿáÝûχÖu¾ð~f—ëá¯Ö<}J×§ƒÖUç×+ç²êüÌkø~Ì~cÕç_溕õýuÝÉêNõ’z¯ûXK–OÊë>Ö’7ËI´¶eK~im̦ü,Æù=Üksù_Ïë>Ö’‡å“ò:(Còfù°<)¯Ë $ï–›ê0ÕaªÃT§©NS¦:Mu™ê2ÕeªiªiªIªµc›rR­=Û”“jíÚ¦œTkß¶ä©ÖÎmÊMµ™j3ÕfªÍTÃTÃTÃT»©vSí¦:Lu˜ê0ÕaªÓT§©NS]¦ºLu™jšjšjšj’jm⦜Tk·ä;©Ö&nÊIµ6qSNªµ‰›rSm¦ÚLµ™j˜j˜j˜j7ÕnªÝT»©S¦:Lušê4ÕiªËT—©.S]¦š¦š¦š¤Z›¸)'ÕÚÄ-ùNªµ‰›rR­MÜ’¤Z›¸)7U›-…Í–ÂfKa³¥Ë0¼E®ÞnMݾ4 ¾ŒÂGdnG“e—Ax|é“Ûc\OÂ//À_dÿåÕÛ?þéõÕ(ü|ºÕöíóÆ¢§OiŒë±ö|œ{½{°’ÖÕ”âXÛv>á¼±îjTO©÷*$o–Ë“òšQHÞ-_”dº„º¦ÚLµ™j3ÕfªaªaªaªÝT»©vS¦:Lu˜ê0ÕiªÓT§©.S]¦ºL5M5M5M5IµÎR¦œTë4eÉwR­ó”)'Õ:Q™rR­3•)7ÕfªÍT›©†©†©†©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2ÕeªiªiªIªuØ2å¤ZÇ-K¾“j¸L9©Ö‘Ë’¤Z‡.SnªÍT›©6S S S S Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:Mu™ê2Õeª6Yj6Zj6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶t™pÜö#:ÍwŸ¶{™}ì¶ð2åžÛ–Ç­ñõóÆ”{ÿüç_þðÛïÞÖ=Ð.ç@·Ÿ¿-Z>î33Ïgð7êùnŒéÆ~~¦'­[?ÿjØV¿±îz^—”Ÿ_?Ê»å‹òóŸXÊÃòIùùO,åÍrS¦ºLu™ê2Õ4Õ4Õ$Õú+‚rR­-¦”“j”“jm1•ü ÕÚbJ¹©6Sm¦ÚLµ™j˜j˜j˜j7Õnª½T[®>î©ÇFu£zPRσêNõ’zíTÕd™d™d™d™bY{J¥ËÚQ õ.–µŸTj±¬Ý¤R‹eí%•š,Y6²lddddÙɲ“e'ËN–ƒ,Y²œd9Ér’å"ËE–‹,Y&Y&Y¦XÖ–Q©Å²6ŒB½‹em•Z,k³(Ô‡XÖVQ©É²‘e#ËF–A–A–5Z‘¹Ç­ü‹C¥ËÝÐŽóÅðùO?­»œ œÛëÖëüåã¶ãóÿ~ý§×ß^Fmç_Bû'£¶ç_úß>ùÝ7o¿{ºyÚÓÏÿðî_¯¦#Ç㊵mó¸ñÑžWÞ˜Áì3?¾z‘u—[ÉeFßo¬»5Œ¡¼[¾(¯ÓÎ$˧ä5Œ¡¼Y>,'Õúæ§œTk#ùAªUPnªÍT›©6Sm¦¦¦¦ÚMµ›jvVÇÙäœ÷äuÚ™äÍòayR^§IÞ-_”×ig’‡å¦š¦š¦š¦š¤Z³ÊIµ¦3’ï¤ZóÊIµ&4”“jÍh(7ÕfªÍT›©†©†©†©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2ÕeªiªiªIª5¼¡œTk|#ùNª5À¡œTk„#ùAª5Ä¡ÜT›©6Sm¦¦¦Z“û½gîÇ­çï_GD]c#W¬aëÚã˜ëüô¶vcÝíYNûüDÍß¾{ÿý«?]Fë±=|õ¯Þ¿úþõ‡ëK†ëÎ9Î?ÞZqãqžájÝz<_8eyкó;gÖM¦b´ë®Fçwå“òó;‡òfù°<)ï‡åÝòEù0ÕaªÃT§©NS¦:Mu™ê2ÕeªiªiªIª5•¤œTk*I9©ÖT’rR­©¤ä©Ö?A”›j3ÕfªÍT›©†©†©†©vSí¦ÚMu˜ê0ÕaªÃT§©NS¦ºLu™ê2Õ4Õ4Õ4Õ$ÕšJRNª5•”|'ÕšJRNª5•¤œTk*I¹©6Sm¦ÚL5L5L5Lµ›j7ÕnªÝT‡©S¦:Mušê4ÕeªËT—©.SMSMSMR­©$å¤ZSIÉwR­©$å¤ZSIÉR­©$å¦j³¥°ÙRØl)l¶t¹•|¯C¼žv¹“üì—»ßȲˎ±Ú›µn­»=eŒÏO+üۯ߿úðú—3ó“=c×sÆþ¸æùçÛG¿ñHÏpµ.[ퟘ5g„uçSƒõSz½îzpØ-_”ŸO (Ë'åçSÊ›åÃò¤|˜ê0ÕaªÓT§©NS]¦ºLu™ê2Õ4Õ4Õ$Õºõ7å¤Z·þ–|'Õºõ7å¤Z·þ–ü Õºõ7å¦ÚLµ™j3Õ0Õ0Õ0Õ0ÕnªÝTû©zd®Ñç=ùØ-Ë'ås³¼Y>,OÊ×ay·ÜTÓTÓT“TÏß´œTëÖß”“jÝú›rR­[K~jÝú›rSm¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©S¦:Lu˜ê4ÕiªÓT—©.S]¦š¦š¦š¦š¤Z·þ¦œTëÖß’ï¤Z·þ¦œTëÖß”“jÝú›rSm¦ÚLµ™j˜êeÎ8sõÚïwÿ<íiÎ8rå¤ùÝÓ ±g¶›s¿=òÆ ñrƒ€¤ëAã^æ·ÿð‡çŸ|ñP¸z­·ºË÷}^µl=îóü óÆº½o7Fc—ûO~šýêÝÛ?¾ùðæÝÛ—ûãç¶á=¤´mÇÈöüWëúcžÿÀå¬ðd]Ý%yË<¢ÝXw=ã:,ï–/ÊëÖB’‡å“òºµäÍòa¹©.S]¦ºL5M5M5IõrkÉIµ.j¥œT/çLJNªuQ«ä©^ÎUÜT›©6Sm¦ÚL5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©¦©¦©¦©&©ÖE­”“j]Ô*ùNªuQ+å¤ZµRNªuQ+å¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©vS¦:Lu˜ê4ÕiªÓT—©.S]¦ºL5M5M5Iµ.j¥œTë¢VÉwR­‹Z)'Õº¨UòƒTë¢VÊMµ™j3Õfªaª1÷­çš½ËÔè2Q;ÿ ß Z÷âªÖ«u·'jõôòEö‡×~|ÿörsÓzyþ3ÛËÎרcõàí7ç“Gø|áù ¶¯šÂeâÂþ8ê*á½Å…WÓˆó[Mòó[ò°|R~~«QÞ,–'åç÷!å¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2Õ4Õ4Õ$ÕcRNª5ƤœTkŒI9©ÖSòƒTkŒI¹©6Sm¦ÚLµ™j˜j˜j˜j7Õnª½T÷³Øn=›¹5Ƥ¼Y>,OÊçay·|Q¾vËÃrSMSMSMSMR­1&å¤ZcLÉwR­1&å¤ZcLÊIµÆ˜”›j3ÕfªÍTÃTÃTÃT»©vSí¦ÚMu˜ê0ÕaªÓT§©NS]¦ºLu™ê2Õ4Õ4Õ$ÕcRNª5Æ”|'ÕcRNª5Æ”ü Õ8H5Sm¦ÚLµ™j˜jm~ëç÷å†s¾ËE³}nÛ6›-|º¡ëÇÈ^-ÜûqcYï5¿È~õîí‡÷ïþtïé|uíÑ:òÆýüé|óü3-« ¨ûötháÕ²ëÁa§zI]WOCTO©ëX>¨Õƒê”zå ËA–“,'YN²\d¹Èr‘å"Ë$Ë$ËËË)|P‹åå ¾ûë],/'ðA-–—ó÷¼œ¾5Y6²ldÙÈ2È2È2È2Ȳ“e'ËN–ƒ,Y²œd9Ér’å$ËE–‹,Y&Y&Y¦X^ÙƒZ,/GìA-–—ö ËËñz÷ׇX^׃š,Y6²ldÙÈ2È2È2Ȳ“e'ËN–ƒ,Y²d9Ér’å$ËE–‹,Y&Y&Y&Y¦X^ŽÐƒZ,/èÝ_ïby9>j±¼žµX^ŽÎƒš,iî4÷ šûÍ}^šwÿœëå¡y°îÅ¡yWënŽÿ.—k¼ÈþðêÍoÞ~÷ñ£¬‡¯~ó?¿}ýçºTøzü7ϯHË—7èùnŒÿrÏó«Ø:­«+Þrn[Ûçu×#½ayR^W¼IÞ-_”×o’‡å“òºâMrS¦:Lušê4ÕiªËT—©.SMSMSMSMR­#)'Õ:BPòTëAÊIµŽ¤œTëAÊMµ™j3ÕfªaªaªaªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©.S]¦ºLu™jšjšj’j(H9©Ö™‚’ï¤Z§ RNªu® ä©ÖÉ‚”›j3ÕfªÍTÃTÃTÃTÃT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu™jšjšj’j9H9©Ö¡ƒ”“j;H9©ÖÁƒ’¤ZGRnªÍTm¶6[ ›-…Í–.'nO÷«€qÚe̸>ÞjXÖ}ºËðzÝÞÛ1ãñù9…x÷ã‡7o_¼(ûü(ÿøîOÿöý»÷þ—7?|5 Û³®_=n<ÔócܺÕÓóLiÝz\û|º”êzÝ­éåaù¤¼Þ|“¼Y>,OÊë 8ɻ妺Lu™ê2Õ4Õ4Õ4Õ$Õš¾QNª5}“|'Õš¾QNª5}£œTkúF¹©6Sm¦ÚL5L5L5Lµ›j7ÕÚ”}þ½z¹áž<)¯mÙ’wËåµ3[ò°|R^›³%o–›ê2Õ4Õ4Õ$Õš¾QNª5}“|'Õš¾QNª5}“ü Õš¾QnªÍT›©6S S S S Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:Mu™ê2ÕeªiªiªIª5}£œTkúF9©ÖôrR­é›ä©ÖôrSm¦ÚLµ™j3Õ0ÕËi…g2V“!ÓÓi…û¶õ5hÝÓøíé~#×ënßÚç‡>VøqŸßùwÙ|øêׯ>¼zþÙoß¿ûþùgÿøþÝ·¯ÿøãû×W{Ï¿Øf £ï7>Ìó#\­[]ã!ˆ™£Þß•uí1cË<¿ãn¬»šEœÏ (OÊÏg”wËåç3ÊÃòIùùÌ€rS¦:Lušê4ÕiªËT—©.SMSMSMSMR­ýV”“jí·’|'ÕÚoE9©Ö~+ÊIµö[QnªÍT›©6S S S Sí¦ÚMµ—ê~>ÍèÇ]yR>Ë»å‹ò¹[–OÊ×fy³ÜT—©¦©¦©&©Ö~+ÊIµö[I¾“jí·¢œTk¿•ä©Ö~+ÊMµ™j3ÕfªaªaªaªaªÝT»©vS¦:Lu˜ê4ÕiªÓT§©.S]¦ºL5M5M5Iµö[QNªµßŠrR­ýV”“jí·’ü ÕÚoE¹©6Sm¦ÚLµ™j˜êåjÇ‘kõ&ó´§ËÛ¶í“æw/÷[]­Û{¿zùòtSðÙß½úËÓæªõؾúÝ«·ßýøê»×Ï¿òÓÐñùWþ髯ÿ»ÿøwøæŸþæj°²?öí§=WWêù!®ÖÅãÌ8Ûº¬TÖ­ÇmmuÎ[»±îÖ ‡ò°|Rž›åÍòayJ^ƒÊ»å¤ZƒÊIµ9’¤ZƒÊIµ9’7Sm¦ÚL5L5L5Lµ›j7Õ³ØæÇâž<)‡åÝòEùùåaù¤|m–7ËMu™jšjšj’j r('ÕäH¾“j r('ÕäH~j r(7ÕfªÍT›©†©†©†©†©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2Õ4Õ4Õ$ÕäPNª5È¡œTkC9©Ö GòƒTkC¹©6Sm¦ÚLµ™j˜j]MrT²uGÔ gÔÿË ÖÕ†±lÛÖÛ­Ooïãóërká—ÙÏSUÃÏ­^ÔdêjåÓ};ãz¼r>•Šó¿æí|uEËÚcÖËŸÖÆeW³‡zoLò¤¼Þ“¼[¾óüÆÊ>o}a¯òzoLò°|R^ïIÞ,–'å5ú”¼[nªÃT‡©S¦:Mušê4ÕeªËT—©¦©¦©&©©©©©;©;©;©©©‡©6Sm¦ÚLµ™j˜j˜j˜j7ÕnªµïºžÕm™÷äµïZòfù°<)Ÿ‡åÝòEyí»–<,7Õ4Õ4Õ4Õ$Õ¶‘jÛHµÚ•|'Õ¶“jÛIµN)¡œTÛAªí0ÕfªÍT›©†©†©†©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2ÕeªiªiªIª±‘jl¤©ÆNª±“jì¤;©ÆAªqj¦ÚLµ™j3Õ0Õzu°ŸI´[“Í/ /çzÛ¶óÙ–,«áQ¶mßcÞX¶÷ycܺ>?Îì§}sk=/÷Í=ýÊ—&» x·m›í¸ñ¸Ïpµ.ç¶Ÿ¯ZV§u£v£´¬ë|o¬»ž7 Ë“òyXÞ-_”_öB–OÊ/û!7Õ4Õ$Õ§ý€“êÓ~ÀûóTŸöBNªOû!'Õ§ý€›j3ÕfªÍTÃTÃTÃT»©vS­ý€+>îë¾#OÊk? äÝòEyí”<,Ÿ”×~@ɛ妺L5M5M5Iõ²PrR½ì„|'ÕË~@ÉIõ²òƒT/û%7ÕfªÍT›©†©†©†©†©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2Õ4Õ4Õ$ÕË~@ÉIõ²PrR½ì”œT/û!?Hõ²PrSm¦ÚLµ™j3Õ0Õ:H¿¯óé{¿5 úâäår~\ütÕѶíüvº±îüTn ¨òósæ~P¯üûÃW_xõáÍ·Ï?ÿû×þåݯfSu$Ü6>ýõÏ˯ֵÇ5÷m;[6[ëùtûÌ«uWS‰:C\òfù°<)¯3Ä%ï–/Êë qÉÃrS¦:Mušê4ÕeªËT—©¦©¦©&©ÖŽ5ÊIµv¬QNªµcrR­k’¤Z;Ö(7ÕfªÍT›©6S S S Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:Mu™ê2ÕeªiªiªiªIªµcrR½ÜòTkÇå¤z¹¯–ä¤Z;Ö(7ÕfªÍT›©†©†©†©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2ÕeªiªiªIªµcrR­k’ï¤Z;Ö('ÕÚ±&ùAªµcrSm¦ÚLÕfKa³¥Ë޵Ü2gÛeâõ´eíü0ç_ƒ´î2Ürem¨»Z·÷¼ ^þ3x‘ýîõw¯¾ý·§}qG ¿þñÏ~÷þÃç/õÏ׿}Åù¡¶[òÉú«…uÇÑYcÀ óqçnÞú€W£ˆó»XêNõ’úü–:¨žRŸß¿R7ªÕdÙɲ“e'ËA–ƒ,YN²œd9Ér’å"ËE–‹,“,“,S,k*µXÖTj±¬¨ÔbYP¨±¬ù§ÔdÙȲ‘e#ËF–A–A–A–,;Yv²d9Èrå ËI–“,'Y.²\d¹È2É2É2É2Ų¦œR‹eÍ8¡ÞŲ&œR‹eÍ7¥ËšnJM–,Y6² ² ² ²ìdÙɲ“e'ËA–ƒ,YN²œd9Ér‘å"ËE–‹,“,“,S,kˆ)µXÖê],k€)µXÍ}‚æ>AsŸ ¹OÐÜ'hî4÷ šû¼¸ÐVt—¹e‹óÃt›ì=ݤb^.w½±pÛÁåþùˆ_×Ípß¼ýî²er>î_ýòÛo_ÿðÃóÏ?¼{þñ¯þôê‡n\w{~¯õóasÝúÏ˯f7íq;bÛŽ ×iöm‹cÞXw="JÊk߃äÝòEyí{<,Ÿ”×¾ɛ妚¤ZÒRNªu!­ä;©Ö…´”“j]HK9©Ö…´”›j3ÕfªÍTÃTÃTÃT»©vS­}¹rÛïÊ“òÚ÷ y·|Q^û$Ë'åµïAòf¹©.SMSMSMR­ i)'ÕºVòTëBZÊIµ.¤•ü Õº–rSm¦ÚLµ™j˜j˜j˜j˜j7ÕnªÝT‡©S¦:Mušê4ÕiªËT—©.SMSMSMR­ i)'Õº–rR­ i)'ÕºVòƒTëBZÊMµ™j3ÕfªÍTÃTëBÚ8_¯#e”r¹voÛùÄßÖÕ5VnÆ­u×ç#ž61¾Èþë¯ß_>ÄöðÕ¯_ÿó›·¯ÿøÓOùÝwï_÷êÃëŸ~á·?¾ýöÛwo¯†Oã²_pÛzý ®>ÄOËoÌ„j¶—íU³¶ï]Nºõǹ5¢|Q¾vËÃòIyn–7ˇå)y†('Õ I¾“j†('Õ QNª5¢ÜT›©6Sm¦¦¦¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT—©¦©¦©&©ÖhˆrR­Ñä;©ÖhˆrR­Ñä©ÖhˆrSm¦ÚLµ™j˜j˜j˜j˜j7ÕnªÝT‡©S¦:Mušê4ÕiªËT—©.SMSMSMR­Ñå¤Z£!ÊI5vR­Ñå¤Z£!ÊIµFC’7Sm¦ÚLµ™j˜êùÏÁùômÛ·y+ÿ¨ã2Z¯Ú¼Õe,Ôϰµ«ö±¾`=]ú"»Œ‚ÞÔ°çrc×ù˜_½ûç翘 =ýÒ§Cu ÜçbWéù®Fç7kÔqmG·uñ¸Ž8mòÖºëIÅ”¼.y¢¼Y>,OÊÏ¿‹(ï–/ÊÏ¿‹('ÕºöIòfªÍT›©6S S S Sí¦ÚMµ—jßöó›çž|l–7ˇåIù<,ï–/Ê×nyXnªiªiªiªIªuQå¤Z—EI¾“j]E9©Ö¥Q”“j]E¹©6Sm¦ÚL5L5L5Lµ›j7ÕnªÝT‡©S¦:Mušê4ÕeªËT—©.SMSMSMR­«¦('ÕºnJòTëÊ)ÊIµ®’ü ÕºzŠrSm¦ÚLµ™j˜jíi)_›åÍrS]¦š¦š¦š¤Z»A('ÕÚ "ùNªµ„rR­Ý ’¤Z»A(7ÕfªÍT›©†©†©†©†©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦ºLu™ê2Õ4Õ4Õ$ÕÚ B9©ÖnÊIµvƒPNªµDòƒTk7å¦ÚLµ™j3ÕfªaªµdlÛ–“—ý ³ÚíÖóþ/¯{±#äjÝ>Ž3–ñùa6?Ýqo}¾ûcýÜÞÚ¸>Gf_ýÆcþ´üjÕxÌÚ1Òë’¥»WÕ~ú¹*F»±êj&Q7ú‘|Xž”×7’wËåõ]$yX>)OSMSMSMR½x#9©^¼|'ÕË7’“êåÀÉIõràä¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©vS¦:Lu˜ê4ÕiªÓT—©.S]¦ºL5M5M5Iõràä¤z9ðòT/ÞHNª—o ?Hõràä¦ÚLµ™j3Õ0Õ0Õ0Õ0ÕnªÝT»©S¦:Lušê4ÕiªÓT—©.S]¦š¦š¦š¤z9ðFrR½x#9©^¼‘œT/Þ@~êåÀÉMµ™j3ÕfªÍTÃTëÀ›–Û6Ïâî1ÍeŠUç¾ì²¨ZÞÏ5Ú­9Ò>Úg ¶‡˜ŸŸˆ“—“œë‰ÏÃWß¼óÝw¯ß>°:_ÕœçŸiÜx„OÖ_Ì{oÛ¶-;ÿX{Ý0oíÆºÏ¿àç¿xR/©Ï浪§Ôç?vR7ªÕ)õ"ËE–‹,“,“,“,÷0÷4÷8÷<ëF‘”“è¾é~é~ê~˜j+Õº2sÝú[ò:o–Ë“ò8,ï–/ÊûnyX>)¦:Lu˜ê0ÕiªÓT§©.S]¦ºL5M5M5M5IµÞ?¡œTëýÉwR­÷O('Õzÿ„rR­÷O(7ÕfªÍT›©†©†©†©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2ÕeªiªiªIªõþ å¤ZïŸH¾“j½B9©Öû'’¤ZïŸPnªÍT›©6S S S S Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:Mu™ê2ÕeªiªiªIª±‘jl¤©ÆFª±“jì¤;©ÆAªqj¦j³¥°ÙRØl)l¶6[ªûUÎºŽ¯înyUÿÌ{ /ÞW—…—ÛUfæ·>¿}ô«×/±>?Aîþòúý_Þ¼þ×ÏÚÑ£nb°µýÆ¢§Oj¿qÍó¯ò­îšë uçß飾xY›š¯ÖÝx›@êAuJ}þ}.u§zI}þe.uP=¥®· ('Íz›€rò¬· ('Ñz›@òƒLëmÊMµ•êùÏôÈqWÞ,–'åqXÞ-_”÷Ýò°|R>Lu˜ê0ÕaªÓT§©NS]¦ºLu™jšjšjšj’j½M@9©ÖÛ’ï¤ZoPNªõ6å¤ZoPnªÍT›©6S S S Sí¦ÚMµ|¶Tû³î¨SêqPÝ©^RÏê zJ½6ªÕd¹È2É2É2ŲÞZ,ë]¨w±¬÷¤ËzGêC,ëý©É²‘e#ËF–A–A–A–A–,;Yv²d9Èrå$ËI–“,'Y.²\d¹È2É2É2Å26±ŒM,cËØÄ2v±Œ],cË8Ä2±Œƒ,Y6²ldÙÈ2Ȳæüó|–²ÕL`Ä}ô¯þñ YXƒþœçÂcÝXx=èõзÏ_ýO¿ùí?üá7õQΧcó‹—LìõªqÔÿüj\?ÊóúÓÄ½ÞÆ˜ãÖGÿòºú¦‰zÛdÏënŽ%–'åõ#y·|Q^cEÉÃòIù0ÕaªÃT‡©NS¦:Mu™ê2ÕeªiªiªiªIª—±¢ä¤z+B¾“êe¬(9©^ÆŠ’“êe¬(¹©6Sm¦ÚL5L5L5Lµ›j7Õ+Flûý®<)¯Á¢äÝòEyÍ%Ë'å5^”¼YnªËTÓTÓT“T/SFÉIõ2g„|'ÕˤQrR½Ì!?Hõ2m”ÜT›©6Sm¦¦¦¦¦ÚMµ›j7ÕaªÃT‡©NS¦:Mušê2ÕeªËTÓTÓT“T/cHÉIõ2ˆ”œT/£HÉIõ2Œ„ü ÕË8RrSm¦ÚLµ™j3Õ0ÕèYw—>¢Éø­†’Q§ï´îÓÍÇ×ënÏ$똡:Uenù”ýò·ßüæ—Ág݇ùË3ÉóívœM›ÇGù䮆’ÛÓé4µÅÑÆãùѶí|¡scáÕ,âü¾”üü¾¤¼Y>,OÊÏïKÊ»å‹ò¾[nªÝT‡©S¦:Lušê4ÕiªËT—©.SMSMSMSMR­™'å¤Z3OÉwR­™'å¤Z3OÊIµfž”›j3ÕfªÍTÃTÃTÃT»©vSí¥:rÍ[Ï%n<¡Õê%õÜ©ª§Ôk£ºQM–‹,“,“,S,kÈ)µXÖˆê],kÀ)µXÖxêC,k¸)5Y6²ldÙÈ2È2È2È2Ȳ“e'ËN–ƒ,Y²œd9Ér’å$ËE–‹,Y&Y&Y¦XÖ Sj±¬ ¦ÔbYóK©Å²¦—Pb‡XÆA–,Y6²lddYCËØsíÖtðËã¹ËÔ²Ÿíqì¶ð2¶\Û6×­…û7Æ–uÂø‹ìoÿ÷¯¿ùÍ/}ŽûÃWÿðÛçi†YgÍåÌËíÞ®òyýÕºù8ê¬ìš`²Ëd¬ŸGÞXw{2ù¤ü2ƒ¼Y>,OÊ/“1È»å‹òeªËT—©¦©¦©¦©&©>MÆ 'Õ§ÉØýùNªO“1ÈIõi29©>MÆ 7ÕfªÍT›©†©†©†©vSí¦Z“±óéç¶zÜ•'å5“¼[¾(¯ñ˜äaù¤¼&d’7ËMu™jšjšj’êeP&9©^Feï¤z–INª—qä©^f’›j3ÕfªÍTÃTÃTÃTÃT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu™jšjšj’êe’&9©^fi’“êeš&9©^æi¤z™¨InªÍT›©6Sm¦¦Zÿ¬í|þ>hØt¹›Ûvl{ìƒÖÕXí8ÛóÛéÆºë±Úqþ)êæw/²“³Ÿ¦wóá«|ÿîϯßxóúóiZ=½Ûsñvë>y„ÏÇç½¾¯—9ÑÂó¿“cœ¹n,¼GÔòšH–OÊk y³|Xž”×@rSm¦¦¦¦ÚMµ›j7ÕnªÃT‡©S¦:Mušê2ÕeªËT—©¦©¦©&©©©©;©;©;©;©©©‡©6Sm¦ÚL5L5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©¦©¦©&©¶TÛFªm#Õ¶‘jÛIµí¤ÚvRm©¶ƒTÛaªÍT›©6Sm¦¦¦¦ÚMµ›j7ÕaªÃT‡©S¦:Mušê2ÕeªËTÓTÓTÓT“Tc#Õ°ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-=í´Û6/}ÚhyÆG6[øâúð«…·7ZžÿýÌD8êÃüæ/¯ß~¸¶Æã:×mûj7ä“Õ7¦´mŽÌ•¶îüO*Ï—s[7ÖÝšÖJ=¥>ÿ{’ºQ=¨Îz OôyOÞË»å‹òØ-Ë'å}³¼Y>,7ÕaªÃT‡©NS¦:Mu™ê2ÕeªËTÓTÓT“TkPK9©Ö VòTkPK9©Ö VòƒTkPK¹©6Sm¦ÚL5L5L5L5Lµ›j7Õ¾.O öó™Ä=ùØ-Ë'ås³¼Y>,OÊ×ay·ÜTÓTÓT“TkPK9©Ö –rR­A-å¤ZƒZÉR­A-å¦ÚLµ™j3ÕfªaªaªaªÝT»©vS¦:Lu˜ê0ÕiªÓT§©.S]¦ºL5M5M5M5Iµµ”“j j%ßI5vRTã Õ8H5RÃT›©6Sm¦¦zþs°Æ™Œn3ÉˤvßjZwk\÷3 /“Úy®œ·>ÁÛ“Úóoò—Ù~ÿêízõþ͇û,¯÷é³î'óÆº§ÏkݸëQà»ösa]âëj‹ï1êâÅ:ÑôjáÕøáü¢P>)ß7Ë›åÃò¤ü8,ï–Ÿx#Îïº~ëûâz¢»[–OÊc³¼Y>,OÊûay·ÜT‡©S¦:Mušê4ÕiªËT—©.SMSMSMR=6R=6R=6R=6R=vR=vR=vR=R=R=Sm¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©S¦:Lu˜ê4ÕiªÓT—©.S]¦š¦š¦š¦š¤Ú6Rm©¶TÛNªm'Õ¶“j;Hµ¤ÚRm‡©6Sm¦ÚL5L5L5Lµ›j7ÕnªÝT‡©S¦:Mušê4ÕeªËT—©.SMSMSMRTc#ÕØH5vRTc'ÕØI5RƒTÃfKa³¥°ÙRØl)l¶t™Ÿÿ?MoaLú4/>?Îeƒ®,¼Ü~lÛqÜXw{\ÿü›7ß¿¾ҵǽ¯óc÷[ù¼öjÝx{ß¶IëêzÍY³ë:ÔâjÝ­)åÃò¤¼®×”¼[¾(¯ë5%Ë'åÓT§©NS¦ºLu™ê2Õ4Õ4Õ$ÕšòQNª5壜TkÊG9©Ö”OòƒTkÊG¹©6Sm¦ÚLµ™j˜j˜j˜j7Õnªu½æÜŸ..úëu]® u£zPR×¥šPwª—Ôu&ÔA5Y&Y&Y&Y¦XÖXOj±¬¡Ô»XÖHOj±¬žÔbYã<©É²‘e#ËF–A–A–A–,;Yv²ìd9Èrå ËI–“,'Y.²\d¹Èr‘e’e’eŠeMí¤ËšÙA½‹eMì¤Ëš×A}ˆeMë¤&ËF–,YYÖ¸gËm;ŸtÊê2¦‘9Ú­óåu—ëÀ¶¬{ŸßXw{L·>?¸õ¯ÿùõû×o¿}ýÃåÚ>úáÝóÿðî_¯îstþã½jàå¾zÄçµ7¦{í|ѱ…ëÎ_q~a·[‚«¹Âù*NòóUåÝòEùù*Žò°|R~¾Œ£¼YnªÃT§©NS¦ºLu™ê2Õ4Õ4Õ4Õ$Õº§å¤Z÷t’|'Õº§å¤Z÷t¢œTëžN”›j3ÕfªÍTÃTÃTÃT»©vSí¥z>Ñë¸+OÊÇay·|Q>wËÃòIùÚ,o–›ê2Õ4Õ4Õ$Õº§å¤Z÷t’|'Õº§å¤Z÷t’ü Õº§å¦ÚLµ™j3Õ0Õ0Õ0Õ0ÕnªÝT»©S¦:Lušê4ÕiªÓT—©.S]¦š¦š¦š¤©Ö=('Õº§“ä;©Ö=('Õº§å¤Z÷t’¼™j3ÕfªÍTÃTë µ>^~ÿ€ìéÏ8?Lm(„u— âù|n·ÖícÞ˜ æÏÜÓé|5_ýêÝÛ?¾©½~WsÃýü4º ýêqžàj]ùñ׿ÿÝÕÈëxÜzÝ}>ûG^zµîü6šyþ¡s·uë1·ó‹ÕÏ/òõºë!ØnyX>)¯3Ÿ%o–Ë“ò:óYòn¹©.S]¦ºL5M5M5M5Iµ¶ RNªµMPòTk› å¤ZÛ)'ÕÚ&H¹©6Sm¦ÚL5L5L5Lµ›j7ÕnªÝT‡©S¦:Mušê4ÕeªËT—©.SMSMSMR­m‚”“jm”|'ÕÚ&H9©Ö6AÉR­m‚”›j3ÕfªÍTÃTÃTÃTÃT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu™jšjšj’jm¤œTk› å¤ZÛ)'ÕÚ&(ùAªµMrSm¦ÚLµ™j3Õ0ÕºÐø|B–û”ÓÓ.ÁžÙÍ´j ·Ö‘ÙÇ­™ÖíÜñù©ŸäÚãþb wùù›O~üw¯þòêjBvúÆùYœOqn<üóÚ«uñxþÅœy>%µuóqmq®·þ8×3³Íòfù°<)?_‚QÞ-_”Ÿ/Á(ËMu™ê2ÕeªËTÓTÓT“Të–Δ“jÝÒYòTë–Δ“jÝÒYòƒTë–Δ›j3ÕfªÍTÃTÃTÃTÃT»©vSí¦:Lu˜ê0ÕiªÓT§©NS]¦ºLu™jšjšj’êù›–“jÝÒ™rR­[:SNªuKgÉR­[:SnªÍT›©6Sm¦¦¦¦ÚMµ›j7ÕaªÃT‡©S¦:Mušê2ÕeªËTÓTÓTÓT“Të–Δ“jÝÒYòTë–Δ“jÝÒ™rR­[:SnªÍT›©6S S½LäŽmk5’»Èô4’;Û#­»Œäâé¨ÁëuûXW¯GFû™;tìçRýá«_½ýêÆ…»5½¯Û4¯úÓ]=Ì'ë?_W{*£ L[·³.ÞãÆº«QD½½+yX>)¯·w%o–Ë“òz{Wòn¹©6Sm¦ÚL5L5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©¦©¦©&©Ö娔“j]ŽM9©Ö娔“j]Ž-ùAªu96å¦ÚLµ™j3ÕfªaªaªaªÝT»©vS¦:Lu˜ê0ÕiªÓT§©.S]¦ºL5M5M5M5Iµ.ǦœTërlÉwR­Ë±)'Õº›rR­Ë±)7ÕfªÍT›©†©†©†©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦ºLu™ê2Õeªiªiª6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØlér9ö6sÕ…É0S½ŒšÏxoyëÃüÌÂËõØkÛæÚo,ÜG~¶`{qu”äöxfÏÇöðÕúñÍŸ><ÿôoß>ÿø·?¾½l ýü–3ç3ʱŸ_£­¶ ^=úóúÏ—Åã¶Z}m-›½6Êæ7–]Oˆ7Ë›åÃò¤|?,ï–/ÊÝò°ÜT›©6Sm¦ÚL5L5L5Lµ›j7ÕnªÃT‡©S¦:Mušê4ÕeªËT—©¦©¦©¦©&©ÖY”“jU ùNªuVå¤ZgPNªuVå¦ÚLµ™j3Õ0Õ0Õ0ÕnªÝT»©vS¦:Lu˜ê4ÕiªÓT—©.S]¦ºL5M5M5IµÎ* œTë¬ÉwR­³ ('Õ:«@òƒTë¬ÊMµ™j3ÕfªaªaªaªaªÝT»©vS¦:Lu˜ê4ÕiªÓT§©.S]¦ºL5M5MÕfKa³¥°ÙRØl)l¶6[ ›-…Í–ÂfKa³¥°ÙRØl)l¶6[ ›-…Í–.ãê~¾&î«Ëö2®>"לIëjgt®mߎ[oŸÇÓ‚ß|ó‹ßŸÿûÿx<¥¥ endstream endobj 1052 0 obj [ 1051 0 R 1053 0 R 1055 0 R 1056 0 R 1058 0 R 1059 0 R 1061 0 R 1062 0 R 1064 0 R 1065 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1072 0 R 1073 0 R 1075 0 R 1076 0 R 1078 0 R 1079 0 R 1081 0 R 1082 0 R 1084 0 R 1085 0 R 1087 0 R 1088 0 R 1090 0 R 1091 0 R 1093 0 R 1094 0 R 1096 0 R 1097 0 R 1099 0 R 1100 0 R 1102 0 R 1103 0 R 1105 0 R 1106 0 R 1108 0 R 1109 0 R 1111 0 R 1112 0 R 1114 0 R 1115 0 R 1117 0 R 1118 0 R 1120 0 R 1121 0 R 1123 0 R 1124 0 R 1126 0 R 1127 0 R 1129 0 R 1130 0 R 1132 0 R 1133 0 R 1135 0 R 1136 0 R 1138 0 R 1139 0 R 1141 0 R 1142 0 R 1144 0 R 1145 0 R 1147 0 R 1148 0 R 1150 0 R 1151 0 R 1153 0 R 1154 0 R 1156 0 R 1157 0 R 1159 0 R 1160 0 R 1162 0 R 1163 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1170 0 R 1171 0 R 1173 0 R 1174 0 R 1176 0 R 1177 0 R 1179 0 R 1180 0 R 1182 0 R 1183 0 R 1185 0 R 1186 0 R 1188 0 R 1189 0 R 1191 0 R 1192 0 R 1194 0 R 1195 0 R 1197 0 R 1198 0 R 1200 0 R 1201 0 R 1203 0 R 1204 0 R 1206 0 R 1207 0 R 1209 0 R 1210 0 R ] endobj 1049 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1052 0 R /Contents 1211 0 R >> endobj 1212 0 obj 18886 endobj 222 0 obj << /Type /Action /S /GoTo /D [1213 0 R /XYZ 72.0 654.442 null] >> endobj 1214 0 obj << /Type /Annot /Subtype /Link /Rect [ 318.33 451.31 396.12 460.31 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1208 0 R /H /I >> endobj 1216 0 obj << /Length 1217 0 R /Filter /FlateDecode >> stream xœÍûoÛ6ówÿüm в"õº^š¬Rç[⢚ PdÚ¦‡'ÉMìÿŽOQ»Å6lk„w¼ïŽwGõ÷Aü}É…1Ei1û]á )r…òDB8*"?B9'ì-9‰Zº«¨%°EfåÌA?Î>ÞÑ 9ØG3g$\йý Êý»ADZ²•bE\…‹X¤zuYPô¦ÔÚz.Èù×­·-r ýXä Íì‡åìÕ…ˆƒ–ë.bëÀ— »4æ(ZèãÉíÏWè*)7ûdÃNïÑò§ÙùROðŠ¢ð/Ä"‹z¾çôw¬ 3ø ?v%0˜úp¾•« ªß|C/}á$ùû S”(‹y"á­Rùáh„.`pÔ‹õ-ß÷ëvÙ(Š\÷áÃ8£„ZT-C§°É飓v›´X•ù³6Y±ËmòÏI¾gÍP÷vë,yÈ{Imó'y^=²•…Y÷$´Ûu]'¶9Y¹bOü¸e¥MÞš&Û”+íãe¶e;Vƒò‚­°…\nÕ5³\HÙSÂýÒ ÇA+VTeÓÖI ¨- XθâUkÄO$ÏÁ=Q³5«Y™‚ ²Ýž_Ÿ-QR®à½ÿß›ùò5-ÈáìØäœƒcì㩇Ô÷b~½™q®‡I;A^†Ly]†Ö)/ œÉ…r-i äq“sŒ%%G=¡&A±ï8 Ã<Õòc:”¯0º• õjJßÇÇPe À® ½)\« }¶5¾@â 6!¸ah‹ …[€< J¼Q¨0ÚZe‡žA8f}ÑŒG$fèS>b ª‡Gp„RÐõd?’)Û¤UÍšuRþ–•›û¨L F7×ïP‹~º¾\ – ªDw'-ÎVè;q›­îNG×Ì'Ø ¸eŽ/u© ÑÂ=1é=ˆ ÔÕüÍ [5ß oÏoΑPB)þÕTó`X#HOÚ­V4÷ó BÒfp•5ïD9%0yžVÅ|Ë>x:ueDˆK½Þ—©„R¸ß í¸øY»•%¡ÁZS0¡‰Ç*%g׋3ðÅb¾¼¼^3ÇÖñ `QïlPà`È@'iU¦P^Ja¤Áʲ(–¦( ô€,Oj·U·ÕÖíiáØ çynÖ¦2jTH#XÖ~±NzV[¦ÚDu¶Ù¶‹Å¾Û1è«QŽ‘ øŽÓ•hP”³ukÂOx8б¹pŸB"%¼6ƆþÀ ßkì·ß~§—}rÑP5Àžvã Ç#áõ(t+®ª¿ŸhZdÚN©ÑRE'˜©‹I½„Âü!™ûê^ÄOöÇGò˜zŽ<×ÍSíóâýâŒçñí‘D¦A€}ÇQì(ó/ª}mÝ(iã!Sw ½am’åh´+Ö¤uö û¬Hšþ©—÷ÊÈP6&pt˜ü‡}–·è²DÚ¾¿ ­9–؇‘ñËê\ wÿyºMv-«å)…*LP¹‰«jÈüæÍåb~u¹ü½æiŽvà)Èщò†I²Q’¸N }$¡ ì»ù/Ÿþ-“)áºÐ}hFAäõk‰à)s’&õ*+“ VÅU€²b_ÀÝH¡ ÃÕ°½…8QWéXZ¹© ýz*­–7—ï>Íon濊òKy­q׊¿Ùìj;µ  €ì¼0 iU‰—û‚ÕYÚ1öP,ýSIð@|Þ/”Ÿ—2X0U¡þÙ%JgŽAXÁpbViµ{6€h„Š¢cÖ¾’˜4ÐZv4;–fëLtm‰=°zJºÕ‚µEõÙb]×U1©ZêÈËPØþ±ß<-MéH'˜Š‰ËßUn臙.F< >Ý^ß,ÿæºçù¦¡ëGOƒ2_òÙz ÎJB…é²P!’nÙTu+> «¼TœÐ“%QØÀ‹÷WWdzŠf29F*¸íÖ­} ¶ÉÊR –cz´%{§$ô˾¿L. k\ë½}†1‚Oîì f‘¼e”•ˆK«ðœâ¶…(˜Çfv/ qÌ{µ¯Ç˳ùíòHl}è¡KhöjК ø[S°ÓÄÚ{`öFÓv´ Ê’qXžôªÚê–«l->RX"[pîÀó$ÝvP×±&äªhMê—ÏŽ/¡'c¤ÛvP÷ø‘É1˜\"âé@RoX«â GìCÛî8õ`ü~±8?âÀÃbvsƒÐ[Ì›kx@¶bRåþ­ûNÔÈç"wÔ„~cÏ••†ÅÉ‘Cã0¶­¼;XSïNÑGôárù]w³Ãý‘SN„]/ˆ#/ zE)¢ØE'ƒ¡& ùÇ4OÈèfwß-økÚûQON¾c‘ê>IàÁ²žwôe§¿š* Ó<:‚Ê–f­MÑ”ðÜb7`fI“Å[–è΀QnüCeï¬[ð$’eßsøCšéeZåû¢Ôþ’Ê×" ÔúÚ^&3Âx‘TKþ]ã…QRëUûXõÕ5EW‚LJ†F<ˆGÐ ³Z v§Öpç ‰imn»‹IŒ¬/¤&s%x5,Í÷+ÕÆü2Á]îó¼¹;ÅæƒòÐq—)Ü&¶ùÒåöi›=9c½ïÁ†_Ä@ˆ=Ëg 2°ù²’¯ îª&Ó“°Ø^OðXÏfå¹4RŽkU5³1J|g;&R|ŸÔ'Ê ïýçÚÿ\Ç.m endstream endobj 1215 0 obj [ 1214 0 R ] endobj 1213 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1215 0 R /Contents 1216 0 R >> endobj 1217 0 obj 2207 endobj 249 0 obj << /Type /Action /S /GoTo /D [1218 0 R /XYZ 72.0 720.0 null] >> endobj 252 0 obj << /Type /Action /S /GoTo /D [1218 0 R /XYZ 72.0 607.372 null] >> endobj 255 0 obj << /Type /Action /S /GoTo /D [1218 0 R /XYZ 72.0 429.516 null] >> endobj 1219 0 obj << /Type /Annot /Subtype /Link /Rect [ 175.6 608.872 253.39 617.872 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1208 0 R /H /I >> endobj 1221 0 obj << /Type /Annot /Subtype /Link /Rect [ 344.778 520.244 445.867 529.244 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 1222 0 obj << /Length 1223 0 R /Filter /FlateDecode >> stream xœÍksÓHò{~Å|»¤ÊÑŽÞÇRe‚ß:1ØÔ¡®dy«%£GBê¸ÿ~=ï‘d‡Ü—½[–Êt«§_ÓÓÓÝáû‰0ü9§?ÂØAéîä»ÀÙ(t” ;´¡@äG(§„%%K—a5¶èóIq‚Ñ»“/_hƒ°å£‡<`ÎÙ,O>‚p?°Ü ŠãXèêXvQ®À"ݡߦ;½)µÔž2ÂÿsíM\Ûù?У»“׫“ßÞúÈÆhu«CÀ·-ŒÁÍ‘ë Èr˜þç Õ}9]’ºÎÊ¢FI±A«*)ê$m(âì+Zýãd²¶2F,šø?´XHu>øî~1ÂMá5þz–Ëq€±Œ¢ŸrqÂâ'ý —>óÿyÔC‚•±¹^Ìu¥ðãGº€±¢Î‘¸¶áûn”ýÅ.œ"•­ŒÕƒŽ1âæ†` Øe†7M•­Û†ˆ¸:à ŒÜÈr<v{ß½Útßp`yè´~¬²3‰bj +r›“´10M‡KÚV)Ìï»rc”·&°'UB-«£Ükn¯e ÀˆšüJë41%¬;ôi LÉÆ@=dÍ–ûÑðž{Þ»m‹T¨nû–M…äy­ záõMÅ„ó%ø’€³R¢)3Mø½%UFjK!Þ2Çð5ù‘ìö9)øéñ×òš¶* imw& µ–a÷ÃÈ è«âÅ1vÜ¡O>gד%pq™#_ªÃ¸3pޏóÕY–u4Œ#o¸ÕM¡ ag äDžûÆØî}dè´Hvòè܆¬ÛtkÒ˜ß.®‹ÉÕêŸ×ËÉbt¿¼x?¹›_H“Z&·ÊÔgùqfB DQR™ J7Õ&9]50=z¦wŒƒ¼ŠÛÈ—âøÙZܳ‘Fpp Ñû“¶)ÏÓr·ËͳRËŠ$›ó²È†f½]*[¯Ig›TræÔT½§Íòæ<ÓL:îá¨qž›6ÖÃX¤^ìzJ±Aôxò 2ãæ£îv»–OŸ—È p’>Nþš„¦z+5èï#+¢E]ìÆÏÙ–ûyºMö ©Ô};øè„¦/hFÝWçSReÉ:òѱÛò#pPä{ÝÝ$B¼÷’‹Âð+Á×mMªó ¹ÍxÞ:¶%…i Ì|]ÃWÀCò¨åÔé‡Üù“$¸5eeÚW%äï¶2Õ/ôgè Ýžg.øÛ™?²táD"^%`êÅp{в‘ÐZ¶â9£kv7ØêŽðØæ™†.UúäI…¢Vü9‘b†28Ä»BËiJ¹š^ôr~½R; E Ø¡;"¿çŽ}RÁÉAt2ƒ}(ïeõÀ×ê$¬ÂÒÈÕ63¶Ã ]>0}²yvù%O{Øfü=àà6¹'R& }+½î|Hª»–¹Ü@›¡Wâ°ç•L¼>p¯ÙIß¶¹PŃ6äžäå~§ 2†¡hÖíÝ8Á2KB HÕ` ¥‡ÉŠ£Ä=ƒœÐ±Â0¶o{l{jc`91RÛ>°‚ù|Zܗ߈iÚ¢lÈýê†Ú@c7>Äë¸.ÜØ(1öh2}j£H«#ó¨Š 1Ϫ¹]’ÜÁqíu T–†—ÃéåY*.Û1ýsr-ÛB×f=’¿¡!ÂVìÙvHû”8t|ÌDÕÝ =êå!/ÄÈÃxcA¢¾…&ær<£À@±C^pNaµ?G3Õ3Y>¶ãÀî·NНëvùRXŽ9ºÒU JF f,ˆb+î ž©åçô8= Uô‡â&˜¤Ôþ.&â9>†Ž+Dh©%ÕéË–Ú¨ƒéE_¯_ªÑqŠ€û>QÝlŒ¢~ÄBÖƒ|×ЋЛÉÅl¼˜ ´l ˆx4½ZMÞM€;¾ž­û÷á…†$¢lb'ê³´ÝB9õi¼¸x?^Üœ:øæLñººžÍ°ƒDã…6x! $»åd%5úÝö쉠¦ƒ=Ÿ”%ãÙ í+ž‚nNÅþ‘Ðéæì‰ŠËµ=¨ñü8 Ü^Ÿ¿úU¹åº±åy >\±­Ÿ¡™¥i'`õHAh·›TÅ` ï«ì>ËÉ©GYË9–ˆªà0„ÕÜh¨Ò¯¬Hóv#ž]Žz7›¿Ï4¼š\~˜/Æ‹?{\L•šmÒ«a]ïúvϺ´]+–í6[Öé–ìÞ70Ä8o¶e{·U¥$M9¦‘ÕEaÀD Ësý¡àÕ© *´nL×LNJV‚x¿Ï3C+Áħ|ø²¸Ûó†y¨g!|Ê¡VÔžâÙ: Òb[Ô2Ãë´¤®`¹¦•ñq“ݲ‰ˆ¡ƒ(h8@^xqÈqÌêi¥:²Òœ$¢ÔÌ3ÑZJê¦cÂП¡ßó'ÓÙ–žõ"0áaKx÷(”FPÆ¥y …ú°1pãȲýc_¦ Ý2Ñ·Ïp"¹]|mºcÖ$MøIŠÍ[’UšÞŒ2ŽÊ4çû¬ÎÖ¹Þ+ZyÐ1YV˜|Õºî+ÌãÊiªßµËRàÊà¨õøËƒÞ¾ë/°`S•û=ïŽWupç¦D´ZCÉ ¹ n“L G‡a Ûu $„æØ·Åxù%´Rû²)Öv]e˜oHš'|òùÊ@¿xñ»ÉWLcfó ž%ÜI“7~=3÷¼ì˦ çÕЉž70„m$9k Ùäú‚æWèb~y9]¡¡‹Ér²ø4A?áUMVôo´˜^¢¯Oz!0ÛXËù6¤ú°˜^ÊaP`¤¡ë«éÇ뉆EÿÈÖï'B´²–ÆŽõÒðGèÐc`'×hÍ…÷8¼6èw%d³L´tüëãÐK±ÝóR²aÅXR‘]yO×i™·»ª‡ º°´Œ SØáŒ /'ãÞJÎkJUc3Velµ/k™ÌÞ]¶bý!:‘ í H•4cN.¬QÒèuI@bû7¢•ª ²ÛÐ_&HLy¯uѰ”vPödGz³3¥ÉŸ9AÏg+6 òBú€ d °«Íê­F&zi^.†Ð—‹·U¹3¨¥ö&1¯ bkìÝפݔÇwS{ÌÍ—ó7× OG/X'ô¡ÏDü ‰¶ ÆéÉ1u2>ˆæ»C hÔA<ÃE”>ô„-U :£€¡6ëŸO_»ç :Þá¨sž˜ ø‘ÏQ÷›y^üè’‡:ë–Ö»èæ4Û¨i|òØK×Í&i=°1¾9»9Ó•Ìð¶Æt u¸çÊ™‚*uh}3üm&ö-ô³…ÖÓ+ _Q•æÞ±êZ¡ê*¥‹Ê6#t›UuÃÀŸ?ÑßàüÈz»˜_¢´­›rGªþ DÂ[‚ŽqૹÇù9-bkØ2á®>”Õ·¿yõ,6†Ž1wYÌ?‡v”n†²@ R%m1’¼!Uå "ûФK-2óܾ›MMdgª"þÁÌ!ûç= endstream endobj 1220 0 obj [ 1219 0 R 1221 0 R ] endobj 1218 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1220 0 R /Contents 1222 0 R >> endobj 1223 0 obj 2873 endobj 1225 0 obj << /Type /Annot /Subtype /Link /Rect [ 97.0 697.5 174.79 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1208 0 R /H /I >> endobj 1227 0 obj << /Type /Annot /Subtype /Link /Rect [ 154.76 395.5 232.55 404.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1208 0 R /H /I >> endobj 1228 0 obj << /Type /Annot /Subtype /Link /Rect [ 286.95 173.5 352.77 182.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 162 0 R /H /I >> endobj 1229 0 obj << /Type /Annot /Subtype /Link /Rect [ 86.72 73.5 164.51 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1208 0 R /H /I >> endobj 1230 0 obj << /Length 1231 0 R /Filter /FlateDecode >> stream xœÍXYoÛ8~÷¯àc l¢Ž" i’EÙE ,°AY¶èp%yÛ,òã——$Š”l祻i ‡sqføqâo ÿ÷A|I±ø¦yP_³˜p}‚èEÈB Á)D4I%WK«Åü¹(ü¶x|âB+€ ßÈ1®Ì<,¾rç̇Ô£(Ò±ˆÃP¸ ÐçDR€³»‚€ëJJwÑ Cè?ÞŒˆbò?ˆÍâj¹8»e#°\- òŒB˜ „”D⇀eß]Çm .“$m—+ði—›ôýXþ¾¸YêƒJ+²•ÿ  ì§ÑóÐxÇ赞?pùRÅãH?‘ØÊuyõ§ØèH&Ó¥>gÓ£MÊv±dÞ~¦óùºB#Ž*‚Qd¤Üe?9kN!…ïùó §»vi’­_À{ðx0ïâ\ïˤͪrà¼di¾ÊÊͤøßq¾O‡eµèöegì”û"­³œåÖØnö»]U·éÊјõÕEÚÕÆ~ž5#{âõ‹UÚ$uöœ®TQdde++A+B òz8’ŽL'¤®öYÞ‚»Üv°Ô8(@qd@\娌 楓m¼kÓ*­³ÛÀm@J…T)5m-ê­òþØÕ†xœ ß5á{o3M4©o™8Ÿ±q>~üt»IU&q›–q+·^ûuœ´U}áÔ£pÆ‘ÖPæm¯`WgE\¿˜.”Lׇ®(šqÅû0d¢­ð{¾ˆ¡_8ZýMPK37ƒÒÈôÀ¯viOgÆi„£¹tênyíɤ¾¾võŸ)ì4€Sa¤QG¼¥kPZw #=‘NÎ/ŽÖsVòò¢RÕÊíMØ­4¤ òêómGfå*9i:F»[ÇÅ„]7ߑݻFƒ*l£ &Þ+ÛÂTáÃв0ó(Hàƒ@>Š‘eË@>C¬QB‘怦8œ¨U¶ûZ EŽî9k€µ®Œ½2MY80ô%Ò»æ7믿åãÓ˜ñÖÆ¾âœÎ¡¢sF)Ó]?Ôé™-ä“ÇD°7aÁ‘fÌKŸâ8d!Æõ)b'xã Ùñæ8*®ÆHkŽ͊ô-£uîÆQ+÷ƒº÷£7ËË}øF/¨¥5Æ(¦„ÔbÂÏIaˆ¿ÂYÉ7¹S:æ!ûRžïò½hSñ^Ï62HA›A‰u‘ _gdº@=>¶”žóÔÈÛ £¢à³êlõ.Ày‘•Ü‘r1¤Kªº.¨Ý]ƒiåLÎÍ=onfô˜Ý_ŽŽe©Ÿ¼Á¹düS•éxrMóM×9>Ý[›Ÿï™Û#F|ÂÑåÒ4Ö³t"+L?…8@‘mÊГFï¿|º¼ç.ïþ¸}ù|cÔîèx!¾ò,WÝsƒñÑ!¸NÛ8Ë 0ùºrœ„‘ïüˆM8qÅèÍ‹?|½÷q¹ÙÇ{&¼ÌÄçi>ÅQˆ8ìÏ‹Ÿ€¬Ì÷-­™9€«, ßfcU}=]2׬'Ì>µ{Θ;’Sá@šs‡âts‡Zs‡£k¶â 7©µž$Ôb4I´à†gPû÷Az³4­÷­Ý³²Ò¹£¾Ó;·€_‚€ˆocH0¡àH`ñu ÅÒGgŒA„õˆrÜYD ; =¾ú[æ00  endstream endobj 1226 0 obj [ 1225 0 R 1227 0 R 1228 0 R 1229 0 R ] endobj 1224 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1226 0 R /Contents 1230 0 R >> endobj 1231 0 obj 1471 endobj 1233 0 obj << /Length 1234 0 R /Filter /FlateDecode >> stream xœÍmoÛ6ó»?¦€ÇŠz׃¢@œ&©‡.ÅboÃb˱0[J%¹Y±ì¿?GÞ‰¤^ìn(°çASäîHÞ›Ž÷Â|šæÀ¿ïä¯(qÙj?ùD4Á"—y!‘‚‰ˆ‡NÌöŒ8ˆÙNnì€r ž¢ÒnD¶ì—I1qØõäî#lZ3‡ìiâ ˜#›ÅäG„Ü ã$IHW—‹8–"<°Ú³—ó½ËÞ”jw«½däüϵ·5ò„û ‘Ã&³åäåUÀ„Ö±Ç]ÜœÀÞ˜{®!&–{vw6;ä»†Í vu(VM^õ‹lùýärIF**Œ\ø‰¸Š¥ÎBà;Ý+Î4ÝPá¿Ï=¤…»X#—vôié·\hÁ@¹ u ±²÷?”òÙ¿)üø7‰äAáð¸ó5DäYîïFØ¿ìµÁ‡”²Ûã "«Ùfì,ñÕMZ¬Ój­ OÛ|µ5ËÙ*ßäY­)öá E¦&äf_Q6™áš›=i•À¥¶˜¦üþÍìB#e¥Á·_³jñã»éØ¢­ìyyUÀªŽj ¶Á/hyÆuz®)7LòlAžáxÊÁæˆ$¬zO{LÄ=Oû BæM?F~‹¦Ê‹œØ,/Òê #JïRËÏ7úí"{‘ã8n ǹ2)vÈÔ©Á@ñ*3hj#ͶÊ,ô÷¼X׫5\+ýþc«mZ¥«&«,Q÷h‹‘U¬íņl¹µäм©¨Xe2Øšüs¶û2"½¶Ä—@hlÈ|Û8èyôª•b^Ì;»L1Γ1:atˆÁWiaûÌÀ¹E_ç›M&ãÜ"¥Mj°ÂÙÖæâíùíÔ ?ŸßJŠ!¤¶zïÞϬ¥ÊR‚n©Ú:ï´×%QÏu³ùÍùí¯R?óD©‡$MAýž¡z´ ´C•CX‡¢¤íkCüæËq94úu~sý7Ä6Ö_vTªºhÄl·øH8IÏIšïóØ$G§HBE~,ëœTÌ!˜jH^˜±6§žÜ§¼ÙæÅèΧm¹;zNånZ¡¬¿6ÆTå^#Â0/Gåì²â¡Ù~Mo¥ÍЯ®õ«º+® µ‘R ÂïˆÌn®¦CÖ/¯’A…¡‹•mWŽˆ{%oäøòŠ|Nw‡Ì ÙÕkƒ¶2™úeî9>0Žƒ!mòUÚ` DuÓâ‹A@j¾6¨¬G‘*duMÅ­uCÚX;¤Ò]îêKµ’ ØÉ´®Á0% Q> •ÊwùïÙS^gÒã^ ³ðQ‡ûÂòÅ€Ñ+ eÆãˆµG츿ƒ˜G^ì8aŒÈ°ýʦÒâ•ö›]ma±Ê }ÌòÇDj_‡ý·Œ¹“Çñ|÷²³*_u¬ã­ hØoˆ àŽì`BÏGîç‹‹ùü¨äÜr¼MШšìÃë„&£©^58%1d;GÔ>ÝfÍ¡*jèŸØüfyy}y˲O‡tÇ œåÍGI«r‘êß6yU7Ì·Ì@Ç,𜘻!|Å$ŠFTØpÔ††Œ8xD6·Æ#îw]ÕêSÑ]þöîòæzùö„÷]¸[‰L-ÂuûÇÔ' ,o ÀÔñ•Oá†0é'2cùþ€-$ðP%Õ !¬!5…ÈjdØ­$k/¢XÞÛ¥FÃh…ªÎH˜›µJ‰a¡¡Ùü¢F£íÕCŒ2&"û,­•º@íj6ªV¶á=wQ ¶µëÙIZÇÛç¡ã‚ð ÒZ@»žîê’É6ðübyyÛz_ºè=ÚÏqê6{•¡bŠBÉîD8y> ¾€!GïWqôÓÍüâý›KuÙ¾<^…DÆdäQLÒà •çÒê²öÆDÂÁ±]/,„î=·HmV°NXp·¤!Íôðí¦²hÒ¼èm.5,í²¯°ÕUÑmZwí㺥:åüÈïùM{]N:÷õ} •0 ‡Üp¾ðdG«§|DÑýÓxƒô¢É²Š f\Juì³4Š bÀúp_gÁi¾òLwÞžÙíÊ'|7@‚º´–„ NýˆÏér,Œ=Gx0Ø»[ý0à~%qùuØ-yqØÛó7r¿/ Q¢º$ß\>ûßs¸#¨ø¨ÃÊñ%pp´4©[‘žíµNv!ú_-ðᬅھX!m.Uˆ]Uˆt×?-h*“ÈŸ±‹ë|ßíòŒénÁþbO'ªVéf³¤“xhmã¾'Z*F”µ¥çvÉ~í"½voË¢*Ø¢TõA;›jÜÔ>µÍGF$ªM×L»ÈVO>H’r+Õ$Å!µè€¥RJš.Y¡¤¬Æ±p#Üi¾U—iOƒ¡7â¨ç ©‹,ÚmÓ08Àìîªg¢2w¾Û©Øä¾5¸kŠî0M5¤; DÍ­UD¬£]5;õ¼Œ¨ÊŽÃ]æ¹B¡y1ºë!ÿœ™ù~À5ÖÏ’¶‚¾¤©‡.‚‘µë¢ÞKœz&ïQ‘§Áñ½Îàô˜…H'ZŽ0¸Ïm Ú¦êˆõR€„+¼ÛˆXÖ[ä›Y5€:ÓõÂÃŒF)é#;>‘:îÈy¨´º˜ªQ9‡)‹¬b¬ÉE¬Ñ@jžòU¦öeµ‡éãe¼«--LufÆØMÚ¾îýÍÅùò”ér¬ƒj$ øÙGÆæ:&^O‡D÷5»›2ιÉÚ6B¸²qà ùS²éK’GdŒV†P¾ôË$9ÝʸÜ5im“¬õNºF’I€D(­Eó>ÞÙÌ ÅêaI^·Á¡çÙc1!îghdåè_è?v27£–³bè¹=ýò^=^|'œX=&Ü£ŠBØq ¢ät¹/?rø|Ôü+¾L!HÆ‘0=y)x`¤¢vßÁéxC@o% ƒ‹œpÄÐWú•Ï YkTpT¼¶çç¡ë|œ£RöüŒazâkŒë?Пÿ É— endstream endobj 1232 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1233 0 R >> endobj 1234 0 obj 2263 endobj 1236 0 obj << /Length 1237 0 R /Filter /FlateDecode >> stream xœÍkoÜ6ò»?&€Ãð%‰ ~¬“-\;µ·—IpXïÊ^»’#iã¸C‘")S’Ý~èšÂ3#Îpf8/Òþ~@ÿÞ©IÊÐjwðÝÐ(Jâ±!E1¢ މD;dI´U { Zb@ÞRÍjlÐçƒâ€ _¾Á¢5"8B$®ÅÜü ›G1æ±LÓÔèÊ0•RmÁq Àj‡ÞÏw •íêN{%ˆüϵ÷5â”ýhDÐýÁÉâàýy„(A‹;’cFÀÍ)¬•˜3BL,vèË›“}¾mм@çûbÕäeQ¿ý†?ÌÆÈVBF þ%¸¥Þ‡Hþ/Î,ÝQṦ³¬QŸ¶æhÍOõ¡£ÖUúç¨kŒ(ùùAµ>û'7?“D1R‚eï4h"<÷÷#ìöZpjokOòÜX&1)!„&Ú˜³ùùùìzvy:Ó6½?OC.žâ4NÒTFÏ™Ð×7è§ÕfY¡Ëí>CÙŸ¢G‡!‘¡¯o»=OSœÈöHÌ&‹M†Þ¢„ã½YV÷û]V4µGq_ÕVËU“U–R7U^ÜרNËâGVyüͤô¼hJ‹Ü\ývy6ûÝmW®³úÐqk WY³¯ OË‚óËÅìÃìÚâ·Yó˜e…öˆßà«LapÖ­È;LïǽyÜä«Cób¯–MV;Ò¦|tHïòí²rmv‡<–qV‚>;‹‚̱̾w#2[®ºÇ6²²^î²CÏ”ÆÁΆ ü…Ó[•Ñ3‡n–?2T”È8'ožìÞmJ0TÚwæx±G™¡dktWVèaY5ùrë Á ?Ÿœº(Ê?¢ºA ÚHªµ™_ÞÌ®ÉGYŠ‹á$òYÆS¯¼»«³FAÛ¬¸o6'iD1våzÓkw&ðÖB~úiŠN?‹Þ.ëlm±²°à¨ÕT0,)å"TEB¸¥·†iÚq€¡É¦i MÓ@‘¡r³ˆá„PB Kw”bjj·Oæ—Ç×8Ü•nC¯Ûéâ­ñÛ'7Õ²¨·6Š4±¼sð&ûs¹ÎVù¥%®óû¼ñ•)<ñÛ¬éJ›&äžhÓí5òÓDeRu€otñEÅ©bo=<ê^GX¤Ð<ÜBÙ8ˆ@ XCR)3qÏ–¦™Dj»~ólIÚƒ6&kdÔbˆTÛ-à ]»”˜ù³E§í¥)\AT`’„ˆvºíöuã°[Oë¥Û£÷ ­Wép¸éÄ¡?Žøž RO©gƒÔÙ õÜPk°·¼w ·OMæŸeIüÌ‹Ê(.ó í6/–Õ2i]À$ äM7ø FwÈ.d’©½¯”E†ÔîªL}|zÈ*hÓ¥*•8¢påJ‰F/No&/‚Œ`Î%p°ØãE_¨R&<% )z^¤`>: 4䧈¦Ø"¥Ñf³l,’×=³ð¶|ô¬`"µ\ k]Â4Þæ_(a|ZSH¬Ê@,B»ºì£0S—}Î>%‰G æÉCÉØªÖ›Œæ¥ÕDàúýÔéF¢¿ÃÅÕg¸±~}œíÄÑÒh@Ы:'‡Ñ"Mbàêž.fçS7#ž&8I£´}´ ƒÁ¨n@à‚æ…¨4Å1j6 z'”KS§4䇥¦Ø°4 Ê¢ÎëÆ'µ¡¥AZ¾Ë«¶zjlüV$a´H Ç ]¨ª±püâÃé{hX=¤÷xH¸¨Á‡ˆtP;)WSj—{! @0OIšRFc«Z/ Œ—K Æ|Ò÷ŠLp;PóåÉ€tóÛÉÍâFÛÄAíØJP;‡êóšHÎ9Ž"ˆî$ŠvzUV‰ˆc¡î2DÈ.I.?,>Nä•P3¾*;->Ëß(óR”$ÐcHšÃh’´w:vàÉüÃüráp;¶hÔ )ö»[=1h\OPîß—5MOž¸R¬k \ÔB;ìTEeìö!¦y‚9“„°”ÇN¿^PwÆ—~uuÔŤ·ËéÇãëë£ý‹5^‰{U8Fê¦Ó%³i2§Ç‹©¡#Rc6´WF»4Ë_z{þ‚ÜÃú6´Q"pÄàäi³ÒīԱ*½8õžLíˤzælÔKaÛdïECš8õw@}[­öU•«¬¿vâù šn!•Âm$0ÁŽ!©Иy¸ÐÈÄË™h/)Ô=*ôzy³É‹TP‘‰º8%d@P«jP©#H«Þ2—p„t ç¡O0’`å%Ââ4«¹©÷ÈÝ£¶¤ƒ'¡,pãyU`”ùÈmž×®àB}—gëCGëžÁõ‚lY™ß´ømvŸžuB#¬^tv;›_0¬=yO¯ð O!g%˜5ê—‰Hd‚}äˆÀ”0jÔÇçuÞ¡¼}_¨\”Cêýj•ÕõÝ~{èˆd˜±ûÍv¤~ÙÖ4]¶5Ü/ÛŽ>1^K8Ä <4ëÓÕÍ|1¿ºüêÝö¡}ù·ýµOä-¦ã4<¿ œwšá"¢þ  ×òX/™Î¿©¢î‘ W¯Çá.­#åŒÏªå¾±x÷¤á¼Z[¬ûÞáD;WÏy0µE0ž{:½ûí(¢“óX@ „œ¹èhÁ¬ ‘ „À$ˆ 7Kˆ ÏÂñb u;Uϳ)“¡F]`Lý敱>Ïù+ƒW5ôXÌ…$Œ‰îIàÓñYïïþ ÷¤ú endstream endobj 1235 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1236 0 R >> endobj 1237 0 obj 2378 endobj 1239 0 obj << /Length 1240 0 R /Filter /FlateDecode >> stream xœÍYmoÛ8þî_Áo—©*R”DE4u/Ò¤›ø¶»h‹…"˱[r%¹Ù¡†)SRÚû°wHŠpF|™>óÆ~QâÂÏKù'ŒIv³¯ŠGIȈ(–:+ÈŽ(Bø‚låÄÞPNQC¯áªÙHlÈÇY>sÉåìÓ˜´"®ã“§™kmŽÛÜÏ~…ÃýÀñE‘’•9Ty„ç0HväÕbÇÈ»¢™ÝJ/7rÿçÒ›y”ýHä’ÇÙÛåìÕ…O¨K–k á9Ì3G0W8“CÀÄrG>¼=dÛš,rrqÈ“:+òêŲüe6_*%›1ø K½>wû_ œu|Í…Üñ‡ù ü´UW«þÊíÐoL…GM£¶2_Tc³òðñ; åBê:¢w4ô ó÷ö[ͺHyv§Ot¬k!ëúÃÙ;òù„¼N6qI¾ÅÛCJÒ¿ö%¡oNÉëmš?Ö›7äÓ©=½!_Èçh‰Û¹ÄQ¹gq‡Ý¥õ¡Ì+ò‚¼Œ"Ðì$ÖC¹}œÔi©YU]fù£¦Ÿ²z£©z“jÕt±ÖãVBËT 8èE¶°­ò£ 2O,Ьr4siJ¬hRäuœ™†ê)«7üI…¹'ô”Ûáãî8;š†7gPJJN h’ŽÛIÀ‰L‚Îímå2 9ÙÇ«UºÒt]cT‰mº®5Õ‚©j')Ú‹µÚ…ÑÈ¡a亮ðmŸBÂr ðÎ ³Êso·ˆõVÃ8Õ·Å6ÒÅzd¢†ÒqùxØ¥y}jݮϤTû¾êušƒ¢ã¸.!Åuºr4­¬¾›[{™­â­æŒ{#[êÁp¨*,1üH¼ù¡ÜFÃéŽH²‰ÛÂdZ8À>gXçjŸ&Ù:KW§¦ž½ííÕ‡ qÔº(5!Aëì 4q‡rA4¨ÓxEàò[Œ>¹ú¾OËû_¯u"¾pÀ(QRµÕõònñ~ô “@ÂsCE"0 %‰7ÓñŸzÔ§@K'êw ‡½€,mT¤beI$‹\ÇaÅ¡N à† $êpåÉHà ÉFÉq$›q —Dy0°µ®QH)Ab —ÚÓ±¹Ý«F+Ó]ñMùræ_ˆ>kIêß— +`æÕEqÈW±tO2j<Ý.—d”l$a¨¸žŸ½[Ü\’ÁÏÅÝíûŸƒ‰ç1<# Ã3$Ìy÷ö|âœIv(27«nÏ—óåŸ×ó›ËåÕÒûÜß÷{aƒxA­LZU`²g…¼Eu¢µ\zoóµªäIÿ!%Mh€¢"ÅC–Çåw‚bTŽu½ `pé¬,2} °!hëa8z»¸\Ü,;²…:RêŽØ¥quM¯zf—Žl²‘=«s]$3-PªÕÕx.©ÃD‰ÐPNbžFMèü¸IsM©«(åpŠ2#‹b){Ž^!Dù–!tc¶v¼f2ÌôæHk4º’<­&ÊæjdyÚdÉF²ê§ Ü]ÎÍ‹Š‚æ•°×: ~&EõÁg¢°ñoó»ë³?&€Ïø<§£ŒõÖŒ´äÃõÙ¹ôñ.À2…à÷„E(S`T¨ê¸¬É¾¨²ºñ Oäâö®ó°¶Õøüß˳ίÎîÎÀeîîFÃ<®…E êÛJ(ÇQÃþ:¤ˆ-9e®ëì¿Qdº9 }‡²Ö…ˆÆID²Èù) ‰ÕŠný†­Ú-]vYéxb[ÓO…ΰê }ܸ¿BŽDßP èÔ¦WAªÔ1G‘ªhSÔD áAzRƒçœÒI™iÑÞŸ³Àq[GícC¨?ó¹&³EØ@…²X?JôÈÜÄßRƒ|HÓÜ U`pÖe±3ȶÒ@j¢ýaNàƒ\>T|¶ ï°cÊ¢µEþø}ASÈCèùhħՎsSþ,ïKŸ•½ßBet:ªÞÓ¦Øþºj;ˆÓPdDCw2ÜC‘p4o v ½ ‰¥2ð'Åú ;¡sF—7­(7ãÂK*Á ÀÈ¥:0´l¡ƒCË)"9ñÔþFŽ h`v uÈÈÌÃëž´U¼3É]œçªÀW'W£Kûý@O׫yÞ‘Õ~8rè#ŸË@qé‡ÛûÅrq{3‘@y@)\JyØ_4–A7ƒOh?šì ö9¡`°#>pà`¶“G%ºéÄä3è‘ OD&y?Luô`wàAR]WÕ1dâ°¿eTi\6›έ>µTÛª,bíÙ[“&…!™ñ¦ lÃíu묬ô¬"Ie™æIj¿¡@ãÒ·úæë°ŒD»§"Í÷ä ‚Žf,ƶꬤh|gPßIíÉú°=YÝFnc}>vPçööAmk¨d|õ[C¯[8£|ʪsr~dοӲ0«æŸ¨‰ý päOS/`Wtöqy{5ÿ}§}(2|æEà׬¿hÐÞq£€ºdšHf½~³6è²ã@Çz?;¸¶ÆØ¬‹îÍh“þ¯Ò$Û5ïk k•=fuwD™Ê~fl‡—Ü ¾×i7·ÂñŒQky>´D.Ã×Võu0l+‡õÛ‡ã‰2Él¼ìíÈ0v4gƒƒHÝäcY£Ì˜Aè„zÞ°÷¸òQ±©¬ŒdÆ}:°UÓé•q^måÃ)Éòº€Î¯ pƒ¯ì‡Ÿóð°>Ô/a íùåü÷¾?[ž_Íï{ÿ1ø>å.  endstream endobj 1238 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1239 0 R >> endobj 1240 0 obj 2126 endobj 1242 0 obj << /Length 1243 0 R /Filter /FlateDecode >> stream xœÍYëÛ6ÿî¿‚`å›PØ$Ûdƒöîúú@Š-¯u°eW’³—ÿþ†"%ÒÖÃÞ»"-²99œÎoÒ3Šüû‡ýÑ C‹íì?G‘fˆ+?%¢+bÐyÂHƒ6váÑÐ.ñCÞÌúÕŽX£ŸgÅŒ 7³aÑ,ÑãŒô˜;6÷³áp©0W&I/+ÃÔ{Ç ‹-úævËÐë]³º•Þ2"¹ô±Dœ²¿D=Ì^Îgß|'%h¾ .`8fÌœÀZƒ9³Cð‰ù}xöòojt[ ïÅ¢ÎwEõü#š¿›Ý̽’ ‡ÆüiÜøÒÑ)Èñ“ÈϺù0 ÿænf0“ }´ñWëíƒv(S¹ßQÓxVÑæÓ‹jlö5¿m7R‚ÍÑmP­"ó{ØW¶Zï"íÙ>É©>¤çYw7on~yÿû×óWooîÑoÏз‹uZ¢Ïéæ¡ì?ûòÅú¶Ì˜µtVUà€/ÐoÏÌF'X+nÏþœ¬>”E…žÃsk¢gu ü;*_EOÖуöŒž*Zb©$!LˆþiN`Âð™S¦#­F…§Ú€…³€èÖã$Û¦õbUO•›qŠ©–ÀÐèÁ[K ëM>*2—K<I¦DN#iÓ0|\ï6ôü"EMp’@b`àK£Š¸í‘gv²ò•êïCy…–Ù*/²%J‹]¹Ì‹TïлôsŠ6iñpH2Ôw]T6Y…Á×ß~ÙgåýßWÖ}WVÓDƒ¦DAæþ_/ïçw·ÿ|3j!@„~ÎáÚ ïýÓG!J¥¡&9EœuèÖ=Ýx•—UÝQp˜5KKæÅàžQ5)•˜%p5ÂO_Ž‹Œ‘,zr‹ Š É,R˜Ö‘œiP'ó J0C0O¤ƒÐ€—‘àgq™,©˰!¦¸k~‰ˆ‚ÂTMˆØCeìdé…ëoüZ˜£ÂƾAÄü~}wwýëæ¨R8á‚©Å‹?z& "„b¬Ÿì”µ›M7n³„;à…u òúËâñ8 Ç ¡„Ä ˆ2bB­—…”èè38”kè°]JŸy$iƒCG48|šœQPUh ÙÊ%æþ¸ò6Èë2¾¯ü{«n"FZ@y4f•š>Å3|Üs•‡mVÔÕU|^ÿ^5s(nyäŽlýÞQ€în Ù7=lê*̸LëÇë˜Év_ d€±£Ób«üÑÓ#N‘ÙZfùv¿‰˜—Ùv÷9«FötE+ÀÜx¼Ù€H9b¼¾‘ ?Yw8GÊÆ¥ÞV´*wÛ¦pMª³¾ 3¢°h‹G庹»ŸÊ ‚lì[ÅÅÑžÁ2`:Ò ¡PCϧ »8ûg\jßx´I»Ïû)Ù_L1B à:+]ˆ5™}*CPafåÅ›ÐÐ)Cˆ6mz¾}óvª‰ÂÐÒº&9ìøê0I¡ïÖ21Fë³7%h•Wµ2¬æ›ÔÑ{16ú9¡=8é\%dßÿMl/Âu¼sor’zPŠK½ƒ'dŠÑE5™»Ö³³÷ûë×w.ÇBðD%š‡ ãÕØ&+êõp ÆÎ–`Ò@w`K!¢‡tlÚ·¡Íð¨ sS!‚;Ú§(Ou­%œ¤vÁÖÇ]JCq- ñd@ØVûq—bzbû€f¾“k&ç±ô§Š~‚6,6Ó„â‘ß>MyÁux< ý`Ê‘‰>Y×%r‘´¯ç5QÀjƒí77ˆŽr€k“)‰•Ÿ.—®þv´Ïþ$2„#Êüa]²5™£ª=T€ÎünâvÆã`g ž¢2ž÷•Llç»· ^Э­ÊÊXG×àh|ÞÑ»ÕȨj趈»êÝ/ôŠ'bzFJb6†'»×%”M¶ÅaÎÙÙ?Yíö¶ÀJ7af¦SNÜ—¡¾„]eI¡XÖQiééÖ%=9QÙànl»lßMôÖºÚg‹|•gË«XÓ£ùû»¾¹tÔjWÂz>ì¸$pËcÉ XÔYº´™«õôK¿²@‘Â)ƒ–®‹Ñó»ÛŽ>sÿ–ÅÍ endstream endobj 1241 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1242 0 R >> endobj 1243 0 obj 2056 endobj 1245 0 obj << /Length 1246 0 R /Filter /FlateDecode >> stream xœÍkoÜ6òûþ ~;H¾$R@ÀvìÖEÚ\í5RÀöÅÖÚ ìJޤM[\î¿ßð!’Z=Ö½½ËËœg83œ§”¯ Šü~£ÈŒ¡ûíâ«ÃQ$â©C%)¢§D¡-r€JÚè½¥Þâ–Ü`Ýn <¡Ï‹rAЋ›;Øô€NÐï 2`nÙ\-~…ÓóTeYæde˜*¥à8…Åý½½Ø2ô¡2»;é5#ò?—>–ˆSö A‹“åâíy‚(AËUpÅ1#`æ ö*Ì™^‚O,·èæèd·Þ´è¢Dç»ò¾]Weóê-Zœ-’†ƒq#$6¾Ô{Òù™Ç,ü˜[`0K@ýhã®ÖýÔºebLeNšÆ±Šˆ÷/ÊØìï<|úN¤&¤«ÞmP)#ó÷=ìo¶Úà"õÙ^Ÿl_2ð¬ËååÅÏèö½»Êkô-ßì Tüñ\¿G·¯¬–#v!ˆLEF¡Ò1*Ú]]6è¯j¸Ï|û¼)¶ 1\ñ‡»é<ýœ7O`èøÌö"÷£‚bÁB8éðŸÇ§g3îGÁc™@Á#ë| U{ÈåÀ}IÊ<}—ËÑ~è¡{hÖq í“92QX¹IéÈ\Ó™¤sô&§5/2§á¤À9¹TÎ:×'WËË{2p:©]NgÐ!K„¾»…NPÿ ï×è]µZ5E«W@Û§ö‡»Æ‰ŽÁ\¦·¾¬´;jýºõ7HÚ&½ZÐĦYí§_‹¹‰‰Jt†#§{ §o‡Ò9µÏ\ªË[j?O„¯ÊÊæ£¼õ[­»5C'µã´K8È–ŽÈÖ]ɤnz3äšAª`)à ÛdÄ¥ŠU]m§C…Q õ~%|„vX>&%§,³œ ŒpjÚ¼6q Ö5)Ò=”Ž­5ÌY#9÷žö.æèÑsÕ¬µŸ¾,|t¶\}WÃî9Á‚¼¨’="›è :º=òK_  ä드ÍdúOf,êÁN­°û&Ð}ºŒÉ|ªá.GtðÝÀ£8ôd=mnÐõ•ÖåôÇãËãÓåÙåºó9&&äà2B9bh6©³ƒ]¾û².óúOw–°Pg 9K8ÂÎŒ-a17ÎX“9KX8XÂÂwAÈÙ™ ¥XfIf^Dù¬&ûÉÆbBµ°É)v›ÇbB³p>ÃØ«cA—ÇÜîȧ¶câÜ9éþ0<`‘L)h‡Æé¼]$n#ùMw÷2Ã*œ<ìÖ ƒ"ìYšŽ0±iœr6}'|tÿN¹áá=ÍJâ=m:)&z™¸ #ü°èbå—ÖÊv]=kþùf&}3œJ×® ð¢g·ð¡:Ä¡Ù%2³ï(_+ é]í²y.î׫uñð:ˆ_nþ- ÐÝ(ów`‰mý%¼%ìªÛàA˜à 8ž5„žBzè»ñVÝÐKJ˜Ò{¶¢©™ ­­-ƒ­â{XF¶>t¶rÐÝ(óÎV¬ÀNzB!rv>Ô!º êÀ.vjÎUµDÏ-` Œ2Wµ7œêŠØ›õ-*Ô5‡°Ã»]{g4P¨j‘Ïr‹…ý[3wNtætž”3ÅL3ÔÍ{˜ì¿5“/xkf–ÔÃb¦FXã Ü)áâ~×®¿E–\—PSJ'nš@¡íó²…Ù6¯`~§Z¨`C>$© šM?&rºœÑÃx –©æ:µzÝ[½€pØAîµ¾버K~=±¡(#FUQVö]¤ßÖDûV=nÓõRÕã¾HŘÉ|n­:t Ï»Ü#'{ŠgÔù´â¦Ë*ÃÚinšÛ·šØ×u ³Z×MÀ¯»|£ËsP3]…6”È’#ò›ƒ)ÎzÄa¾G븄Œ<ï¦Çb"`¸ÔoE¡Í „ƒN‘ÊjDýaœ ¶ÇξÂ$Ÿ¸«q¸éîBÚNì|„m§-%Él«Xø&6/ÜÎ%B åÑ“‡b•ï6-k˜ ÐTbÚµ“óo"ñC&±ð^&±ÈéeÁ<±o؆Qcu˪¿Ý÷åÁ‚½Â2ä­M9tD째u¦î–)–T^ÈzoÒÞ0¨ºÚl ¨X2Ÿ©X %K{eRƒù8«Pͳ®6¶þ€éHÐS êÊÅ@ÐR¼Ia¬‹Ò‘”FØ$Á~„Št„9î¤Û+ŒåËb0ÑL÷›(µ/¸÷Nè¤iÔOuˆéè#8Ñ/l‰ä#|»ÇítJœA¬Ë°îê—Ìà!;Øî=ÿµ(çE8`.¦­Äa<æDÙ‘b¨Xdš›h}ÐŽ39¢ZHèÈi&&t*GêCˆâ *ómûÚF±ôw“£ }ùÈ•2†ÝÛt<¯O¯æ¾{¤8¸P„1‘Fó_ÝÜÿ]øÔæ endstream endobj 1244 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1245 0 R >> endobj 1246 0 obj 2331 endobj 1248 0 obj << /Length 1249 0 R /Filter /FlateDecode >> stream xœÍX[oÔ8~Ÿ_áÇV¢®¯±#!$†¶hjÚà!LÃ4ÒL2M2K»ÿ}'q’IhYÁ.PÕ>¶¿ó‹O¸›QDàï‰ù¥B†VÛÙ“Q¤âÉQ…¢Ñ¹‰–mÌÆÎÐlqCn¥nw5¹EÌÒA/g>Á¦D°D_gd ¼Rs={ —Ëó@‡aè°2Lµ6WpÀ`µE§‹-Cg™Ý]£7ŠÈŽÞGÄ)û "h=›/g§Q‚–_ÚÐ34‡°WcÎÌbb¹EŽæûdS¢EŠ.öéªL²´8þ„–¯fçKg¤Õ`ÈÁ?…m,u¤ Ý/Îy+…y% f¬1KçZ÷Û,ÔCi©ª~RãTy‡û޲œýÎËÇ}¢ÌAJ°îxƒ*íÑß°ßÌÚÀ‘æîq{È ²ÞÅå>O tŒ Ï:ŠšÑê6Ê£Uç¤(ó$]7Óò6*›IRxò¸ïw;OÁ**Ú¥?ã¼€HnæÙ—ƒ*¦O/¾-L0LJˆÄÀ¬§=è \Ú»¢Í>n§ñý.V+Ä…üuæŸv~·O@oœ¶$”Y3¼~ûúô"Û§7‘I×Q#b¤wÃû7oÎß}èHÊÁF x¤rŽy>¿žð# ¸‰6û­Óý¶ãÅ¿ÐÓ$g€ìáÞ¥šaÁ °8‘]÷OEŸ‹l³/c§Ïù/Ê×`4dTd‚ ³TDÛ•ßvqÔ(JoÐìƒÔ0"0ƒRAE©/®¦¸aLâ04\RÖ8HÎ$ L(¬P¬•>@B¾:YeE’ HR”G7Id²¡ÃÅÙÕûùëóÓ¦!–¸ á,¹^\N™šòg¸¢íþÇ[Ρ?¤FO¨ÔaË­Ýœ 2H'.êlX>Ÿ²›CáVDT©Ýø ÕÆÂôË„ñÆ—Qº6¶þ2Û&A /±Á6a»`ð–ÊÐ+eöÄã}öd c? D޵0o sÙ´´/ü ÓÐߌ?ñ^_.ª–x¨Ã¢%öŸx7µ¸š¯è0p uWÛ‡—´(M¹ydxh ¦Bºý[Ìl3“°CÂsÆB>‰ÙhŒ‹¢”â“Ãk…< ÿ~üy¤rêàcÉäЮ¹D¹æÛd7~®½x•eùM’FeìQdûÐf;Üeðâvî’ºÂàǺ”½û*ÎÙëMü¤ž%i=ri߬ä±ñÔ„ªßö\ת©'­µÄZÐ?cñoÞeÛ(÷ùh DE3ªuØö.sUª¾Ú«!;ê±ór¦ChTàEÚ=¢/ί—/'*š¤ ÓÖBGTùŽÌ)èeÜaô÷ãk»äæ#Ý¢§ýï§`ÝdX5)¶Ñfe+1}ÔÚ~9Á:£Ò@§›¶³Ì[‰ïöЀµ³‘[뷢ŗìõzÆÄ÷Є·ÓÔu¤¾ªtD1Äï~ÓQ;)dÍö>ѽ ¦_“ò¶Gõ XE›¸žT™kF×£E#«Ñ‰žÑ¢1Ù¬ìvyvŸl«lòa<ñô¤tzöv4¶ šü¨ŽÚÇÜMª$$U Gô¼ú>O´ä®ÿž/àQ?›ú²ƒ¾A)¸/¬?íª#?ÑøZ¡¹æ»„Õ_˜žÖÏI9ÐÚ“uº‹†B`-¨|ý—WËÎÿ’ý{¼ endstream endobj 1247 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1248 0 R >> endobj 1249 0 obj 1415 endobj 1251 0 obj << /Length 1252 0 R /Filter /FlateDecode >> stream xœÍXmoÛ6þî_Á2â«D`(°$N—"¨×Äà Ôý Ù²#À–RIn׿£H‰´i+Ë:tkèîHŸ{x<’ù<"(‚ŸWú+ŠÛÑgk#(¦ˆIk‘Ë(A[d•D$h£;‹Ykµ½òˆ~£½}ü–(Â}Esãæaô&3™(¥,VŠI’è)– ,¶èâvKÑuÙöîÐkGÑŽÞGÄý ŠÐzt9]ÜD"4[¹H¦Ь o‚Õ"äÄl‹>Ž/wù¦A·ºÙ‹&/‹úìš½Mf6ÈÖC›FþǸͥ½Á£ý/Ïz»³Â/ÇÌØÀ‚©€htÓÆ.­ýê†N-Uæ{’ëÊ|¸P-g?ròÓkë$ÂÉÞjXyôïgØf-XH=w:Œ' 3ëvöó»ëwÓšÑOÅn‹¾¤›]†²?Ÿ*D^Ÿ6úÍÏLøž[願:æ÷¼ üØ<¿7q\0ÌEÿbÙÏî»GB%Ž  „û#Žz,(•`!uPR‚ˆ†ÑJ0ÑÄǰx¯éýz¡¾* ŸsoÄ÷-‘ïø·VŽœèê ·<¤„ÀÁC¡þï‹2†•&šÊ$ðúÒ@ƒzþá8ä:Ó#ÊŒÿÙcVgè ½RPÀÑxÕUhgÒSôJù”UéA‡²próµtJ ¬>÷zVNÎýQ„Eê*WN¶ |tâÔ‰u^¬7Ù! ì ³Ç ÕsTyYЪp™dr@c^4Ù:kÃê vc(½FK©Qê¦ÀŸ±X|F©²z·ñºçµ“Ó³EàÍ¿rrãOP§[Ok¾=yZZŸ”VëÝ6+šS¦ƒÁžD2DL[¸.rh¼ÉŠuóØ«-\#´ÖlÁâÞ2In”häOè¡_£ænžUYm³¥óõ­a§èFnè²ßIÎâÄEYÁ”Oe±ô‡ÐúÒ8Eˆë—¬Í4—f Àime³"n½½¢`ÕP-Ò¦k…-ynÅé}'ÁéÙ‰º|Y×}ñ!¸×è–½ÚMräÔæ!DºÎÀê>ׯõa=횦ÐSZåUÝ —*óñ/°ª‡÷wƒGƒËgÄ•JâØ³WÓ‡sƒq÷iè/˜èû94ž)ä,†•£ˆ0nc¿Ïš]eYDz(¡f–Rk]L0 Œ´-ŽzЬ®!s¡Wé2O‹z~†`¥ ¾žþvy7Aº$h>Þ^_^ s¡8Ž€‚øºØ†®8ÞT_Áûþ/ç‚3p#É>:²Ïc©wUÑk&ŒnR}¯KÏ•U;'©ýöEÕny²¾Z¶Œ<ëýždAïS¦€0¸c…‘´D€¸—sor£¶Ôœä…ÁFÆ $š ýZTU¦³@ׄ.Ì¢ K‚ÇÙ÷s,þVªðBÐ×[&íëzòæ~2Ú:\I¬ ç#BéÞ˜—§Œ ÈTªìî¹*‹/Yex`ÂÕj«øia,sË•mïnFu´ô¦¼8I8Nl! ‘i‰~–-¿'ÃÒ—G©h[B?°»=0Mé´e¶®²¬ö£ñ€Wn3!¦OÉÎñ‰~n‹ØF½K‚üŒ€~>“„à8‚"w2›I“¿d‘€‡•íÄôýÿA)¸³ý> endobj 1252 0 obj 1344 endobj 1254 0 obj << /Length 1255 0 R /Filter /FlateDecode >> stream xœÍXKoÛ8¾ûWðè KR"E‹MÓtSd›>Rôä ØL"À–Éîãßï II´%¹MwÑ]4EfÈá<>Î GyœpÂàß!þJRAfËÉ£_ã$$R~I*ª˜&Kâ-5Y à‰"žŒìª—vÌù<)&Œ¼ž\݀М0*É× ë)wj>NÞƒq©h¤tš¦ÞWA¹Öh"¢ ˆÙ’Õý¾2­—×Ó7'Ç/{øD‚FcŒëÈá“srZnŠy†=ìúÀx~šôóTÆ4¶ÝPKwöüm#ö¥Ec|¢­ir=%@ðäK¶Øb¾­ª#Ò™(TS©Ð¤J·ka*2 !aå}VÁU. ƒÍe<#YM2o ö<\§ëéO†Í!§”D̤ÇìüâõžÀy,h‚9(“Nþé¡sSp'Rýû±crìZ+ªñþÒ(m£àlOÜ‚iš&ˆ“Á‰§G."N1Ùü6« žü)…!#ʱDb˜¤¬õ¿.N‚ üèYoM„¡  *é& «Vù>(R˜RpFËx÷qàŠª¦_8º2Ë,/æö9p+×Óe9ß,6õõA»fÛ‡#Gaàq w)!ù ö°a_¦.xG[ÉF£’Ó$‰ƒ„ÐÝ:7Ï¿äs3oùÛï?ö[@ÃH’(ÕJÿšß∎:sNeÂaL“}Ž_Wý%ëî r°ß‘Yº£Èçseop®æ.ýëli0Ã-mf%´ïîEvéMžÐÓ#¨µ;¬ä¾hßí)ŽŠ#–¶Äy#V÷–s9/±êD÷Ë"¨×Tí*ÿ‡+Jq¨Ç×)òmãÝÅçWöDó”*„^Äqpâ—Š} ð8†DluÊønñ§…l_{Ç4)éY÷Ì;z4èÒJa«TjÀžÏ÷CÁž÷yß°ûj$T]1ærÀNçh•åµ­Ù&Àr$ØUùÕö©§‹5§5v¢ÍÝüõsÑŠñh±Ð5>eOöF›W™í¹È^ÑÇPGÛJ²ý)uC‘i|3U“j/NÎ^¼ý¸/ûÍëR(½uæé/¶„‰q°ž&‰Sõ²,¾˜jmñ·¤ã=ŽËnåzj¿Išýâ~ˆ£ ðãË-åÅøã¥%RpGÅÉ€kvBfØ›Í}eL=žô ¼ÎÆ,ÐcŸÔÖ—莫²yžuNàyÕ5dÚÜiÈu£¿ßÄÄé噄yÇë7R ƒ>K±ÊšÑýË·'{2I¬Ï1›EÊ»˜FWÄe˜H7?H%xÁ…ìµKx¦š4GV€i¹ìø7Ç:ÜíqsL‡›ßl>š{Ê–+¬;ûIìWÆ[Ü‚d~îl…p…g¡6álÓž×úëX‡MËÞŒ"©^SázSh)ˆ=@lã‹ÆãìÔ&ܱî8œ½\RœµÆþÔªïÏqjà}6{ðd u  yîÁZD*k÷WYå¾…‘m¯è9·öQ@æÞËŠúw5HÝå•ýÒðµ¾ð¤ÿÛ’vß°Iô`iÖ­©Ú¬ëV‡ äûÑbpWV¤ÞÜÖæqƒ Á‘|˜—¤(×$/f‹Í¦5Òü©AFA.áG:OXóÕ{ñ©)@ÿçÅ¿utGN endstream endobj 1253 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1254 0 R >> endobj 1255 0 obj 1577 endobj 1257 0 obj << /Length 1258 0 R /Filter /FlateDecode >> stream xœÍXmoÔ8þ¾¿Â[©;ï‘ÐI}Y¸EPŽ6(:å²în¤MR’l ÷ëoü’؉³¡E'îDQ=ãñxæñ“ñ¸_ø÷‚ÿ ceÅâ«ÒQ:È ”Ê q@"T %D~„vÜp0ä&jè ­²–Â}Z” ‚Þ,>£5"ØG b9—n®as?ÀnÅq¬bu0"¾…‹dz¹*tQ ë.zîˆüçÑ›¹ÔùDDÐfq–,^¾ö%(¹Óˆ\ì€9Û»'’}>:Ûç»­Jôz_fm^•Íñ”¼],•¤ð häÀOˆ—¾G†3Ïz½Ö»Rìø ŸÚ©£U¿ùD7ôTò÷Ah”+cñø f¿róÃgò…”àhp4¢üC†ýbÔ¬ƒä{÷ùÄã|ˆÅ¬«7—èö½*÷zHw{†Ø·ûú·ô*/[SƒneÚ@äŽQJ¶ ózàu+­hŒ]BÂØö!‚'.ñ°‡Žd0Z–aiù`x<{ø bßÞ%oŒ@«;Ch9\|¸9{·4§¿ß›óUm/ÏWïO߬±!ºS_¶¡ªY»¯K3¸t.šª–ù‡â98r[¹2U#*ê©·y¶Õ¢DFŽ“Ë$hvi½Ù xÔkêj_®ÙÚ°¯ôø Kœ€bêÀ-FvR‚¨àÃ÷9 }hR9H ¨ãØáÌðáÛµëÀîwiÆ 0ê|³mŸÿšey‘ñ½ÑV÷$!ØáÁ²Õ]7:ˆˆëc?àÜÐöÖ!B @¢äyL¨ëb? “È·]wIjðQÉ6i›?°“N¡àû¼nÚN0É0taÂë)1Ÿ> °Q¸2ÿåü=¨áŽ;Ñáü5#†CòÖiÁÈɎݵHÑRA’ÖÚêã`m²•¸Et\6¤F`iXˆä ™•ë¼Ühù1o·Z‚û¦Ëz&Ç;8ÅÒ¶éƒNj?òâpá°¥D7¨œèúã;t d[Cg€ÎO¯“ŽVâ–.›–¥kIB(°eU¾h:ã®Ëä´úèUƒ«Yjùð¬ç—†$V$¹º¹<Ÿ¡•¯/×^1ù­}¶ÿ8ñežf~àãQm´ï¨þ)"Æ©6y‘C㧪ϗcõÌÂÁÌb{ðJ×D4Ïñ4Y~Œ,3ëuæC@jå?­~–Ɍ͇™… Ïê<ÃZ£ž§¶_èè*Iå§8®Š¼mÙúÄ~‡Á(OÑ-ÀÚ½*üó/0»+õãxL¤ŸíJŸDõÀ¡?8Ô ¶ž7ÅvXô|«?ÿá#ÉÝ endstream endobj 1256 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1257 0 R >> endobj 1258 0 obj 1582 endobj 1260 0 obj << /Length 1261 0 R /Filter /FlateDecode >> stream xœÍ]s7î]¿bí©ÃÜ’7™ÌرsU›8S[¹Î´êtÖeïÜjå¬VqÒ_à7µ»’}/½›&1€î— I0ü÷Jý`‚&‹õä‹¥‘„Ñ$-,)/ÂPy²N,ÂsžÔŠqT,L5Õrä!ùuÒLpòÏÉïÓ2Á(Ož&x ܈¹üÊó¥BX[)"œ+)*X¬“×Ó5M.7šÛY¯áÿ¹õ±E)¡ÿáä~r1›¼~Ÿ''³UHž"ŠÁÍx9J©!'fëä÷“‹]UwÉ´IÞïšEWmšíéÉì§ÉÕÌnRKÐiDáC:—ö>äÞÿå™§*üÍPjh@A4‡Ý¨Oµ ­ý©>80×®2?ºÆŠŠ÷¥}öw*?¦Œø^4§‘û÷3ìoöÚ J÷áýàAfÝÈn×6Ûä>§`úIÀ¯e½“­šwчm¹Ž°îûc„•‘hã´×ïEß,’×X FY} ß4»µ’‘$"› *¿=¶oÜÁviF&Dˆ4#¹Á®»]uù= ­\îòжe¡›U€/¯ÞM?žˆÜÐ,rýùãÕÍô1;Š Å=õf·H¯, NfV¿FBx4ZmÜnvÍR.áî{ôQ>Öå¢jîiYÝW]´þ©êö—l7ÑÇU»Yì`PiAãÔjå`koªF;=ˆÇQÕèñ¨BíE9‚9 –©]ÊØ)ÕýCP/ w±_—rQ­Ëzž”¢4ÅžU³ ˆ*›jq–ÍydºòàA¿±©&€qžUZ·Aò³à5ƒwaÚ8DƒÃQˆõVé$2`#ïË®ú*Ïž7™R‚rR€p*†ÂÏ/nç'ÞÌçvà±ùéÑ  Y1¥Göâ“zŸZ®BÜ6«Ñ¸ÊUªF³àËPæOºEê: á\ä`“€ñ‰jP“¨#|ÖÄ@ЦDÊ6–ª½Œ¬s§Ü`ú”£€ßÈí®Ž¥Åv@é«m1„ÙÍçëw糫}éï©arÏ{„¦YŽ Æ¬ÌPá­Òðüä=söP eóSšÍÚe ~­d•óS䈦Ôjpe‡.‡/7º¬h¸Ùt\<”ͽ_Ô…õÐÀîdë°j5ðJÁ{^Q‹·r±\*ÛûÝZB†ÁѬA(J6m"¿ì úFš]w#ˆ‘BVU»íüR4P(0"©šéEfêÂÄC)Ô µÀbÞ‹ëR¡!ãÃäX¹íÊÀ=?yz_;"Å/},[(:í1MØ´Aj½[{)­\ÉV6 ©“ÀYߌìÄÎ$Ü×ý>C«Ç ‡é²4pÁ´ç5S-Qý©üî1[Ghg#Ã4Æ`MÓ°)E=K'Â…Ô¦MXÌY”[S·{²–¤Ik&Kp5ÒH÷œQµÐ¸=•ö•Bcó“Ÿ./Þ…j͆C'0$2Õ²qn<÷ëôrö㟟ßý|5;ØVÔ$G,g§Œ* ¬,pÐ×P4¦ú‰ƒÉ[=ÏLß¾€)˜ì à¿W|¤¡ÁN †ò"‡Ô¢Å`2O™™! å½>!–&(ÞÉîIÊhŽå,rx&/(\„¡§gE:b›ß¸ˆû¸Eݶ-úCÉáY(Ë@lD &Û!Ø9¢ê*Ó ¡{heôݓؑmÄ`ºš[}P'wX˜èÅ]¶ÕB—ŽÔ×*€–e'»j-®:rÈìÁÓ[Õ5Φs™L‡¢È  ¥bÄ Ÿ±4$,ÕIm3ûóczdôÎàB ÊÓï}Õ~§²å]¹£úZ™ÂÃmožÝi†aÎÃpËy>¶S“ƒ¬Ø‚ô–x©ªéÌ33)½â™zlˆ¦{K± g“pÞmÍé5˜»>,ôK04pÔ ,%zÚ1„i¤*ïF½íY UÍ¢Þ-íÅËÆN/”c,pº¿×»uÀ¢|°øñ ¾ÌDµ… hm.7 ›Úy!gÜWG fáÑUÄx¸¦9ÊŒ…,Ë÷Í ãáa\S0=òLH¦­ûâ¼)ffzÆ, fåD]ä2ñR³Ž5[0‹äcŽ™õTÕÁ“‹ò3²88üÛB>ªGž4?y¯žKEusib£½z»Ã™»Ï›D~+×pÇ„ÃsǬIîd½yú‡ Ç0ãÂÔ µ`4¤½ŸèÙ.5}¼H2¦.R0Ý©k‡S›¬&_€rŠ˜áZ'0 î“jEŠ%ÕɾdÿzŽr ¤ÿˆîuˆ| Ã’ܯ¼Êo Ý0ÅjíIá&ÍcÂaIGÔОžØ¦èÃ:Ñ;ÚcUYÓ·hð)8·*‚VKræôu[köÖOߺgé{ÇÎñ¿ï ï×*¥úÉŠ‘›' Ûù¤#üÕÿà‘£ÇeêÒ©}œÁC"ꂘfÙ¨š>«†Bà•ž[tÈ“ñž)=5ãgõäa%£H­2²ÆzÆô÷óEpŸÛ÷<±-]±ø Cxý.˜ýÀeê-ö·Af–_BMfª‰ªb<…Ù¹…ªÚÿ¨Ê…Ñ®•ÁÕ…ç ”jy~¡zAkåã¦íôÛ™îÓm‰\eV÷ß¾´Üè^¼‡ân‚8mño±¸‘’L¨9Š©ßbØÝΦ¯~ût}uäqZ ‚ùRpá»h~ü­!‡>×m u8ÛkP/vm«žù¼Õ“Í‹äv«»ˆc‡3½ž]ÝüëüCòã§Ï7ÉìSòqzýyv•膇’ùÉpímoùpô(Ï¡‹L0l·{u{;ýtýçKÜÀ8‚Gr`í3Þ(à€3èÚĹ><¼ä~”VÐR®Ê]Ý9ºç¨d@3¾ì¯s5˜w¢A÷•馭ïVƒjç\lëhƒXwä…N/(E9%Ы ;D_žÏÎ/Îo¯^âöÂü"DˆÔïÁêàxûÿ)ü‡Cê endstream endobj 1259 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1260 0 R >> endobj 1261 0 obj 2511 endobj 1263 0 obj << /Length 1264 0 R /Filter /FlateDecode >> stream xœÍXëoÛF ÿî¿â>&Àz½÷(¤y¬.ÒdM”[Z ª£$lÉ•íÝ_?žNÒéigÅÐ ma’wäýÈ#yT?O("ðç…ûÑ–¡Ùrò¹”Q¤âªI…¨ÆŠ´D%c¤A ·±Eº-%É i¹Û3Oèv’Núer÷6Ý#‚%ú:!=ãÞÌõä=.æÊXkK¬ ScÜ+ fKôrºdè$+vWè!òŸ£o"â”ýô8yM^žID ŠB Ž0[Øk0gŽ„œˆ–èîàõv¾Ø iŠÎ¶él3ÏÒõáG½œF¥“……"üոȥւ¤½ÒȳZ¤ðO`îe ÁL‚7niQ^mùë*R¡ò¿£¡)M5”»UÄìG>~'Ú)R‚Më6¨áð·3ìG­w‘îìqH/³®’Í6O×è½P˜¢ƒÍSèù20ei`²|Pã>ÞÄŸâu$éã… …+U=J>ØÆ øÍÞ_Jš«Éçí‚ëŽRS]M¢¥ðþ[î¦B0 ?×=øŒh°¢à±VbÀ @¦ €³¸áͧ$ÐÛr4÷\Üð3dš½ˆóÇ]j*–¹â™U nÓjÞX¬úM¿K ¦:Ž Þ $LŠ&EiÂØºgD z™åtD´tö&’¥XE(L™DªÃt#[6ÙxjP˜À`#”±«hhfï·+wqUøöäõñÎðÁ¤Œ¥†•Ùð¹°gÌ–\b®Ü×e-}á“Rcª¨5šÿ{ÑëE½O…†¼ËÀó=ÝJLÕWÏõï×{òŠk!­¦ÕWMGg fŠ1,¹!¬:fwÌÐŽ Y¬+Ÿ{VÛÍ£ñvDå3Ï,Z% p°¡I^§–ÿö7ÈÌßo endstream endobj 1262 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1263 0 R >> endobj 1264 0 obj 1396 endobj 1266 0 obj << /Length 1267 0 R /Filter /FlateDecode >> stream xœÍ˜[oÛ6€ßý+ø?„åU$a€Û8kº%^m]Ñ…š(±±XnymþýEŠ¢,Y ¬]Û ‡‡"y.É~QDàï±ý¥ CWëѯ£H1į’ ¢ 'D£5ò -5º³¶Dû‰y¥õ_»Æ½#‚~½ÿ]#‚%ú:"ÉÝ4‹ÑkX\&˜'Úãme˜jm—à8ájž­:ÙT_×ÖÛ‰ÈO·>¶ˆSö?°ˆ ÛÑótôìT"JPzÓ  9fÂlà[9³"0‘®Ñû£ç»Õ]‰Î tº+®ÊÕ¦¸@é«Ñ4õNV3T1ø§pÅR«C Òî‰8 úF ?s§ f¼±]w>µþ·í¨EY…Êý>?U4x?QUÌ~äâ‡s¢ì@J°neƒj…¿MØŽZ'‘víàÙ÷‡tÈZ¼[¤gçÓE:9ÿÓ9Õ‚8†©¦Ý¸t¹ºGcÄ9Öè¨ØgÛÛмñEôiþe·ú'»Ë‹2¨ÊMk :†S‘`f!JÈ®1/ÞÌçÓ‹ôã÷=aBÌìÈŠë^ã‹ìÓ]u5.Îæ“ ß?eö-4×›ë<46ÅÝ­Ë£—Ÿóíâõ—ãÚfÕ¾dX+A‘ÒGv2yw0X°Ñ%†ˆÂëГ_£° Ê†BEùõy ùU”¿r3. { VœuçFu¾N&é‚q0Y|h–¾ØqD“=Ï(“˜˜H‹PCÁ4ýVn³«ešÞåkë׿eè$+órµÎ²B…Á4ûìÊjfˆñÅä|:ª(R)•hA—Gè—k¿(‚ïr”û¼ý5Þõ䎑ÆðD¶6æ1ÀÍZ[ÑkâÞÖfôº¡¬R ÆC>§=+Û9à :šþ•Î'/ÒFqu‚Ã+ƒæt>;oZãhฑ†ƒ%…ÌEŸ]ó¼Üm‹Èí¬ïËíª¸¢Eª\æMc›·Q òbW\gκ(5ŒÈ=CŽÑ"Sàc é~uòüÅà®gp*eÉÕ<°2;=Ÿ]¤/c²:!ö<‘/¡—ŒÙŒ«6_p4š6_N÷¶ùrº!¾ÁD&vÓž•íTU!óšË¸Û"6;ýèoÔ5g¾éA«'Gè 9”Ñcb„šó6‹#S”ùm¾m. Q¥eÞJ‹½å”À"=æôQLq’`e þ$> endobj 1267 0 obj 1465 endobj 1269 0 obj << /Length 1270 0 R /Filter /FlateDecode >> stream xœÍ˜YoÛ8€ßý+ø CŠ¢DENëîÚÙ& ÚESÚDI Äv*Ë=þý‰£Ãj‡î¶ 23~õuÄ ƒÿûúOœäf9úêlœÄ‘3Ɉð˜FL‘%qŠ’Š<ê¢~ĉÂXÝÓVy G«#oGŸ¿ÀC·„QI¾Xgp;ÌÅèL.#*"•$‰[k@¹Rz A#n–ä`º ÈÉÚ<]­^ÄþóÕã üVÄÈýè(œJÂIï<JЀA˜xVQh˜H—äóÞÑvñX’銜nW7åb½ÚŒ¿ôýh’:'Í£~bjXj4È5[gµÝ[á7¤ÂÚÀB Þè¦G·µî¯n¨DiBeÿî  uno”‰Ùïœ|÷žÄº#gT5vƒ+‰Âß$ì7G­³‘zîÝþ°YéÃbCÆd?ŠiHöî^Þ‚[ó¯ÛÅ·ì1_•ÞV®m(N“ödœ'4á9,«=¯Gœ&doò)=?¨$åz°ÈlP©/iRe-¸µI•µ•k/ïæ ñ|Ý ¨BAyÅ”•­¯µZe5Ç“ë5öòÎ0;¤nÆC•tW‚p²e8'k¨qªÚQPPC“U×w^æúŒîЕĭu=ƒ*Î5V*OÉüp6@‹‡²îÅ•hõz!_æuÖ‹"Õ Š“¸ ˜µàÖ&`Öf³ò`•Rê E=kÀyKDž1§h¯ÏN¯kØœ½N_V­Ò—aŒ”Ýé " ûÈXÄ{Ö…€³f^Ü”Åbuâ„bæø²JÍ—U{ÒEkâ÷Ùj›?!kä7ùòŸ¼xVîâ‰l増‡çéä|€±Pçš1ÀqŸ ]¯AÆ¢A˜4;³ÔÖÀËš ]²±‡=§c§cÀXgzwz!UŽ-'W¾ÖÇ”Ó,RU¿±—2X@•N¥,{㉲Ne(u«tÓ•+œ¬f²•y-í×RHkñø‘=7U$c»Ü‹ÉñÙüdˆÕ~gl—Â#Xû0­Ó”ÕÍì¤ ¨­•›´É¥&-—VÊ%æîô83A «“‘«µ^ç#£UéÈv{y€sHÀìRö¬g#íS†âà?£¯½x›ß,–Ù#zÔÇÇ¥)-û,eúw“”àíÜb‹ªWäû¢| z¬M{ýTÀ„½IÙÆX{1xV:¢šlÄ/®/¦óãÉõlz2Ÿ¾}—ð ·Ksîr¸ ñR^Uû©xAû8µÜÚDÖÚo v Ö[ zfÖcÄJ† µ†+Ô¸Ãÿº½‚Øjb7ÌØË»OÔ$¤,°0ô¬AlÎpp,Æ]ö’ 5 P¬Ù²ÔBÔ,ªH$¦Æ÷ó)/.>üù‹:¿}è^ΧŸ®Óélr‘Îþ€*íW¡ÙUÃô¹§|£ßŒ7äË0V¡lƒï¯q;:S‹ccÉ|4};§È`ÖD‘á£~‹½ºZ#å)+àÕ.óâ2.ÊÁÙëÛ·ÕE 2Te¶Q6ùÍzu‹{o«ÜŸ'1Ûg~ºõx%­hU¾„Uɦ…“C{÷Õ²ÍZò›æ M_µÅ:ª%Xå·¼(7•î|4Ó÷Û¥{“C‹òº’½ófî»JBnµòY+Èáz©y×w8[¤` _ÃÔ=øÕøTÛ–ßí®X/Áp¹Zü ßM™-ŸžýZI´îÇÉä—I¡¹ãð˜¡/ÌÇ2”;®7‘jçckÁ­­¯2ê—ùJ‡˜Cð£¸gfCo$uíÕø.#ÑýÆ*Úa}¿ù{rxŽÌþëŒÄ×7À)×™J% ï[!þ<£|.vAŸg”¿à¸¨¸ï1ª¾àtȔÚÓø\— á³'TAâJg¡Ï0¬ý&˜p¾Œ£pW,lžë²]‡J_‡Ên*]:À¤ŒC\&=³š G@#Ò¸ÅÃjtà8­¾Â­ºÂØNc/ï.C£–ñ\õ¬ ]a|*[e¨ôµ¦Dµ¦lÔšRÖ'y-í×’þŠGkíàDa;¡¸Ø5>ôÿ þ¿éì endstream endobj 1268 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1269 0 R >> endobj 1270 0 obj 1708 endobj 1272 0 obj << /Length 1273 0 R /Filter /FlateDecode >> stream xœÍko7ò»Å~k‚‹·Kr¹"@±åF½Ä¾ÚÊåzMa¬¥U$œ´rW«ºüãoÈákE®œŠÞ¡)<3$‡Ã™Ùyúõ„D üw*þä%f›“_D9X¦H<‹HgIm"…¼ˆÖbbSÈ$UÍFd}:iN’èû“ŸIó(‰yôp’xÌ‘ÍÍɰ9Ïb–eY*YiLŠBlÁâ €Ù&úv²¡ÑùVÎÖÒ FÉÿ\zW"FèÿDIôåäíôäÛ ‘$š.¬ ,¦ ¨¹„¹ĘÁ'¦›èço÷«uMšèbß̺նٽü%šþp2žªCJÒ(üËcéK½ž&ýÇÏ ÝRáÿ4fHJL9œF ­•iÕ_1 A.U…U£X9‹ %uögn>l“\,$I\ô¬AŠÌQßÃþd­y†{›ó”‡çI<Ïÿsz=:›FŸ_D¯ëß»¶šuÑbU¯ço¢‹ë«–¸ÛîÛYý&úüÏîðdR$ÉÎLÑ$‰^(V ûjð§ñèZÃOøpu9}çQÏG?y´wWË'—§ãÐúÛ«‹ÛOãñß¼1AƒBï\)5çzŠ~ü8ºžŽ¯£§Hñ“'0ŠþäñÈÒ˜d î‚äÈi:ù0þ×ÕåøVá)2¸’þ)ºŸ]]žàæöfry&ÆÏ/'ß¿›6)²8:c)n"„º}ܤ`ñ–‘¤ˆ’$ %éù´µ…Å^Ï«®îV›:ú­Zïë¨þý¾}œ_¯š®næÒq“À§ÛÑ2.…óѬPºXÖ`ˆSðŸ,2žh ë,¥­»}Ûì,¡rf O³è¶µp½®7uÓ9ƒ w® Zzïá ìÈÊ$Éy8ˆãö§9œ”ÕÁ`Ã"ç^±gúU²1žÆœåe™²â‘-å$¦9+‹¬ †V¤•k ß½Rr°Ò8ÒË(Íb¢¬„ q&MîTïvౡ¡BîïF Kwæ ÃýÔì¸3àÛÉ÷“Ë©AŽ\›í®ØfØ")DD–”``Pð TÊȵ¢`À6 øaB|³i欽—UBì…³ðG˜‘8JŸÕ¸ÔÒV>›|½·mìÀ)Ð-ê¹¥<,W³¥E—•3»s´«6:[íTŒR" ­tœ_Q¶­ožŒœØù.Ägyø] mˆ°„ˆI-ì :h?’ò˜”"¤i@ “PÀQ)Ž:lÁ2Ë *Ù‚‡8éC‡‚l’Å´ ‰å•vo›Ó¾Bšó¸®™$Àt¹_wFA«Æ€•fËJ|¥uk(»®]5_¬>-ëæy%§"ኌ›Cï‹r˜ªÃY4Ï=D˜”À@¬{ðGp€ù+Cªì ”Ù ò¤¢Ÿ"ÜVÍ‹ýP5ûª}4ø©ÎëY½¹“*Qü¬úûŠ Eé‘a€B†¢ ʳÀA'„À±9ceœ¥iBhÊÿù_rq˜7oöͼzŒNo*ÐŽ€@ £)o=%Qø2‚Ë'"÷d…­YV&yUA™RŸ™›x DÍŸ/ Éâ"g’ùüŒ8RµÏHF Ý$ Ö ºh•l;ŒX¯°©H:°+ôxÙIó"¦$‡Tû•v¾Z, µÈ*)_ÚíþÞžf»xþ`Œƒ§A£ Z"„ÎSÁ"ÉŠôˆÎgUã»eýÙw2ñpŸö;L}™×÷u3G7G f3 ª†«®²X|©‹à‚~¢BÚÔ?Zl—ÂsyÎüƒô¨—òF*ÖN-Õ°z)„k‘HNü}ìñlA$ñªõ¿vÊx58é ë é<ÍúÑ X]",D5ȧ‰ì~íˆ8„!Tͼ7x3}øûW®Õ¶“ˆ°Ý.¶“U‘rܳ!še:2{‡5–à"?YÐ5€«­4ï3K¸Ô®-÷†nL'<«2èsx&„-üÍCÊŒ]_i¼ÂÊR€ÆzQö 6—œÞÌ]²1‡ XËá¥a Dgö_˜év‚¬Þv¾ÆxÙ?„¥â¦ãHd%A|F‰sÐLQ&n^¡ÐBš¬&á#_gÌ qÛP¦nNã…pçóJ¿¨ùàgäÁœ}\4Ù«æPŲ’x©Ì‚r½v kIÑy±gÒJ‘âm-I³ÀN¯þ;•²„ÅмCÀc!nžNŸiYI³Ñèf/}‘;+æ¶qàžsøÞT²îè¿Â›Kíá¥qp€ Í_ÿû´Òæ‘ðd›Aðc*Í·TsPð(ÎuÖô$T7§ü ^”å÷°ÅKèÏK–è`\õ!l®lS=*èNKm"KiKX+~ €ä`Ó»JerÈL'n„7Û¦[¢Ö ï’øÑ ¼$晸®$ýð&ö|_kAÿ½s#ëÙ8?0ôqžIœæL¼™Ð€¸Žf¬Y”zÐ2ˆÜ9š‘öñUOòC?GÛ«‘¾ù"-hQc(DÑPïêÙ¶™£¥rá²®¯6÷ëúÕQoÏuãË)8¥òÖO‘' jãyÏTOâ’«$Ú|2´1AåU¥˜eíêË"Ä̧¨$ wÕ F ¢ÿAjÓvgŸ^EÊe5$,GŸAÛ¢-“÷Ì«n½z{óãû‚nÝÈØ£Ÿ<¾½`PZôã¢æORÈ`)QoæS³î_F-°ß<ÓÜr¿»eÏl¹+3úèü|Ð ’(M(¸¸\(K¡h9þýù……_w»•ÅÜF )˜f^9 šý¦nW3K1½¢6`÷–ù¬å:ÿÁ…¤‡YØê? ±”Aåš‚ÆØá¹Ï'Ç4¹Td‰$g4°R¾ˆ áµ:Bï!ñüã‰çÄÞŽr)}xSK!‡§…ŒlLUaäû 8ëíôfr{q=:»µGŠêjrž¤ÊPɾ@¯Õ±© *È Ž«G¸á ú px†zˆó@2ïz}Þ Þ©qVÄ)ø\ÎôC˜‰PrÉ ëÝþþ~Ûv;CXì×kƒ¸3o:(Ä«vnŽ÷«¥µ¸Â)“nx£j®ºsDEÙú¥níx[‹o®n:wÖ¾Y9,di…`Oùª­gÝúÑ×%OÒmÅÇÛÎí2· (€ ò2ô똇øýz¯foA¿U·mcD¥Ä‚õNmäèAbw²6[`‘JŽÕ)N!š”

                  > endobj 1273 0 obj 3042 endobj 1275 0 obj << /Length 1276 0 R /Filter /FlateDecode >> stream xœÍZëoÛ8ÿî¿‚ß’à–Q¢ Ý$ÛìµÉnãîbÑ…b+±p¶”Jrröþ÷¾$R’ß°wh q†Ã™‡™¡û}B?Çò% Íדï†GQÄ K„ˆF8$1Z#CÄ"F+)è5¥ˆirÅ5ÒšX¢ß&Å„ 'Ÿ¿‚Ð,ÐÓ„ ”k57“_À¸1ã$I V†iK‡Ð˜¯Ñ«Ë5Cg¥’¶è¥"ò?Gï"â”ý "è~òv6yu!%hv×m˜cFÀÍ ÈÆ˜3Ù„=1[£Ï‡o7ùªA—ºØó&/‹úè+šý49Ÿ™I* j1øaµ—¼¿ÇÙg-¿ã¿sÍff#»VfiÍWvئP®Òß­®1ªœÁý…R>û3o_“H¤ÇÞjÐ8rÜïï°?Ùkƒ…”¶·Ï‡ vVZeè3†ÓU¾°Ä]YÙæ¦nEÊbõlÛOˬ°íyºZåŽ%›eÖižÊV©Ý½ØrfËV®ÊšMU8`6Ù˜Ùå‡ó›Ù釟OÏÎ,/¯[|wÛ¬Óuæù!Ókçø„‘¾S”BžÀRZEšX¤MÖäk‡“V÷›uV4ܵÀ9sÇws4ÊNG™išqv¢g—;w ¥«§ôÙ¡ß^þxy5›ºæîÓj±ÊjGH»hdn>–ònà&Î0ç„s»wôÜa9å,åB·jûôçR/ËÍjn3Ù%!¨’æ±¶ùê"n\ÁqD¬Q¨{:í¸áޏ0“Û  .,õ›´ÞtÙ?*ÄNÐñx=ÁèËáOgoørÔ^'¥‘â˜ÄúÈõ6½¼ý¾¢›_Þ›Ý\~ûp}5{7E|ŠÎNgçè€S WÞ²»ÔÑ›0ÌdH‹(9L®âwן>N»óëh–׿kN^ä`\€"F@‹áÕE4<Ù”QœP8149‰o0Å× 8æDë(ôIøc÷MÑ›¼h² x7:X¾0YQ8†n>½Ý….1‰bBXÂýAÿ º‘pÎH„ƒ0 $&vÍlì…=æDÜ–c¾jgß79˜2áK±šÒ‘Ì›å€Î;Öb‘Ku£X´ízsÛT©27m™oÜ©8md×Ô-õ—n\ë‹㆑œ&=wh€°=$’¶údÛ¢íc+ï •džÐ^¶\oKZûZ¶ªò1_d‹Žô²5/×i“ßæ«¼y6¼'ð»i–­(àOoÓ:«ñpÞœ·ª7e%£\;•M‘CH–¸TàmÀ=!ÈãîË U^ëHC˜/Óè¯ŭz¿ùÈHøw öІ Ž-]BÄŽpȆC-d/l‡¥/G‘º‘=z€ ÆÉÀ†aùñh O@+”[}tûDQÏ;†ÕwÎŽPÊTqêkŠa¼DÍ)‚Lúü㯧ïG*ºŽÅQõ!á0Åáðš ŠÌš­ ¦2ÐîD0O†ò¸0'LB+<‰Eè QQè.ÏV‹;dêÜòNÔ™n R;rX¢.!Â'TºùùÄCy-’8Ž"r<ßÒÁNÆ–‹Ç3 k!BsKõ2ªP"pŒ_¿þ«C.…$1&:«†åUu#hÜë¯OÝ>UçÃê;gGU'àFæ “iïÿ,*D‚˜ˆ ƒ›N¤Çß:ÙK¡ ²×c¨ˆaE"ÈȃÐÌèãõ§«]5„/¸f è¢IäŒØþÐøY>5Ηiåq¿îÆ¡üõ'3öÇ“ ¾JAÒÈwPCÞÛ ¼ÕÌÆÒíû ¡·‡bÁ1l?Ø <šÒyƒ«cŸM/uiH¹tŽ`å÷èEmYê+Gb/‡*y{ê´lèµ,/xc« Õ¾ü!3Žâ¡îœëŒtp  ðÊ’Ê„î.[FXJ?dª¦Jð-ÑfñŠúíüüo¶}}1:ÀäùªmÓ|­Ieù–ê̵پ¢TÞ ZæáÒPya[:ÒMSÙxÿ—â_$P,R endstream endobj 1274 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1275 0 R >> endobj 1276 0 obj 2438 endobj 1278 0 obj << /Length 1279 0 R /Filter /FlateDecode >> stream xœÍZëo¹ÿ®¿‚ß CrßAPÀñ£v[Ç=[F$A±'¯¬¤]Ýî*þõrøÚ‡\õ \{ñgfÉ™áp8ó#s¿Í8aðçµü•d‚,·³ß´Œ“D Ö¢(&<¡1KÉ–h&R²‘{¤¢É@IõhdÖä㬚1òçÙç¯0è‰0‘ï36RŽjf¿€ñ(¦AœfY¦}”§©4Ј喼¹Ù rQ«ÑÆ{©ˆýϽ÷= ¸ø?ðˆ‘çÙûÅìÍUD8#‹•K4 ‚A˜3›Ò@Hrb±%Ÿ_½ß—›ŽÜTäj_-»²®ÚÓ¯dñ—ÙåB/RiPi$à'¡*—z¢õ¿xyfåN ÿ†4@H¨ˆ`5òÓFo­þ-?2R¡ÂßC£Uy“‡¥böG?¼'‰œÈM{»ùï…¿ŸapÔF)m^eÖâîç×g÷䔄ÒÖ«¼z²4|»8[\Z~U7Û¼³l±)¶EÕµVðåU[–ûµØÔß¿œR§ní>>å]Ñ•['ø–oöŽ+Ò¦ÞWO…sj¿³dÝ8}õ÷Ê­aÕîSç™mwŲ\•ÅîŸÁQiõuÊálè¸hUj¦)ÚÎqõêÀ0¥¯õ>Ö‡ô•ÏkOaÞxßÚ¢›ÖPW¾)ÍÜÞ}X\XÇÅÙ§¹§Ã›õÏ¢©ç4þþÕÓQØAƒ€1ÆÓÃ~…–ùõ#ßî6…aU"”Õ³ásCÈ¡Â;óŠ·ÛÔ×à<*¨'TUE.o9‰U†‘£ä˫럻¢yøåo_NqÊ›«d\“” !' Sï?œ› ÙxgŒrøc1÷f€=òÎ.WYüØ5"ŸÉœ¼[®ó¦'ýJœ[ÛºóPnËM.w/Su­¶” Œ"ïï?\f¥ÁÂ|bàÁeñ0¡ae™¤Öö»j¿…©BPoãÃEîàBD˜Ò$M²½½jÛ•Cªt(JöëòâæöÒi|éÃâìöïve°ÁÔ~=b™aRð…ñ{î¨ÍeBül3–MôÒ®8–0Q.XÄN…œ Yjzœ¦sGÚ&«ù¶ktÑCšì~¹ö¦zjN>}:qžzýåööäËiÏŠc>]žÝÏ«:†Ç¼¼ü«ãî®N4í¹ë»Çûù8–aŒ¸½ùðh°Eâz9—çw*‰‘Í[Knʶ3P ÑåIÛä%ÿºqÜÊÓÜ;‰v’ØIú`'‚¤v’!ØI<°“¸Â7Ü"z‰%"Ù,Uf Ù5p†s\4JL×ß×nš7Vbz›žY=MÎÓ-u Çc,zÑŸêiMºËi{ç[ÑMMFØ¢MÔnY´Œ×9¦§OœUèª*¤ÁD©SŽ4zŒ´^;2jíã1»XþÊÓå0 òùn·ù‰çجÚÚtB¿ Ä¤ƒv«št 1Œç¢¿(b/EÆqKu 4]6”™k° r2©c/qí­“ üCÚt"Íj܉Œ ŠfMŸò4iÔ‹Ìsù­¨«ÎšçÇgµï½Ã,Z©‡Z”¤ô÷‘‹Q6ŽSdÑkð ÉUØf‹ù¤G*Œ½1K$£YÈy"ïvY"¢ºižg²k²˜²P t,Èì8£\ÞQñYÁÝï5‡R+XD#´%aœõE)òmH_±½vÒˆñ  Ìàöim¤ÁȆ™·¢‘q;6† "@ z‚ã’*Å„1°ÓóÉ}Ø\‘?TFdä‘/8&D0> ´ gU‹Œ;CÛÆÆû3ôîß:3ŒŽ ƒc 2’P§àM¼°P$˜ðx ÛZðuÚÓ×òGúû6`oCv2'€B$1ùí+…ë^–ø[ªÈ`¾TÁØ[õs2ž ÊcÈû”' ý_8“pH¥÷œI§ysŠƒe <ð* "}{µ• JÀy]}+šŽ@»¸B0‘“‹˜¼†" ,ƒ]bZ©]â —„îŒ, ã`0K]G$|÷ïñ☦‰Ü‘N©Ý[Ü­eân¤÷cp(ù1Ú¦.FN†œÑ8’ûÄâ)µêÞW;º…½xÛ !E£ü<ÓÖØ%¸¥²‚®É«vVÝ݃mZŽûZVx£å÷óá%ÊejÙ뢚4ÑÜØŒ-:ƒí„9ȇ¢)—}cs7ÇŸ>ñ>b‹*š]S P…‹´Áíš´ÔcUþ°Œ|P¢ ’ؼìBÁ™ûdVŒ,"uß´~†AF¡µCííJÛw>ÛujÕÆ Wd7nü¸‰ eƒŒS Ì&ˆxÕ}¯ Ùˆܷ“¨9k+_• ¾¼ù _¶3Ì㔤wyã&#FŒvàéhæqgha¡<Žı%È£}SAàݡЇá¬"qÏIY-7{õ (]@Ì;—8 á¢B‰o€Xam“‡PRÄ àʦÞ{Kb8ÈôvO„xÁS¤Zv??Èñ"ÙТ>œ™ð'œ¦ ±öG _ð8¤áÔÈŒØñ}ò>hPÓ yÔ"9>е gU‹zkìMoÆû3ôîˆÕ‹ŠFÁyb…\É@}¥ÃN/{¢Î_ !qŒÅ4Sm1â AU’DáP•§Ç#ÊÔ?'/À(LàÈDY¤¦âëÉ M?‚I…½9ŸD_jû“ý9Ê8MD –§ýþ è÷g¨æàä–òŸ£•@?ØKÒkŠw£ 9làH®‹)ËÚ[«âÊjrŽ«²è.³ÔJ‡ ¸—AÅ.ój”1 Ñs]ŽÎ0Êe†ÎÙ8Þ{çBÁª©·–Ñ®+Z>ÆYÆ.VqªöÎÍÞéÛÉÚçf“”Lw E·»|éŒÈäÈ—à¡(;ó¼5ÍÀ\Sð\‡…Gƒ°üþö‹„¦,s¢Ú‡€‚-ïµ9(ÀA¦ny"¬…ž"UŽzüµQŽ¢‘ -ê—ê)Bù ­ÏÔæ±àx‡t«™;^½öäº^÷"4 ˆä}MÇÔëž;Z4ôæ…z ³(KxœŽªÛð*¦î¡äý9ѯëòõîúÚsýrü ·z? endstream endobj 1277 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1278 0 R >> endobj 1279 0 obj 2458 endobj 1281 0 obj << /Length 1282 0 R /Filter /FlateDecode >> stream xœí[moܸþî_AÜÛ€M“”´’Œ¢€Ÿkê¤oçC!ïÒÞmµ’#iãèïðE$Eie_ø d“KÌ‘3ÃáèáÌ(÷y‡"¿Å8eh¶Úù¬yÅ ÍŠ&ˆÆxB´BšH¢åbbg(¦èa ¹z¶"èãN±CÐßv~û&ÍÁzØ!=áJÌÕί <šà`’¤iªme˜&‰Pà f+tt±bè´”³[ë… ò§[ïZPö ,"ènçÍtçè,B” é­ $ÀŒ€›S˜›à€‰!ÄÄt…~Û{³^æ º(ÐÙº˜5˲¨÷GÓ_v~žêMJ 2ŒücKQHºOœ83|Ë…?!8˜E°ñ(×G«Ší0’®R?7ºF‹rû%}ö’Ê7ŸI,R‚“ÎiÐ$uÜß°öZï …n‚ÓÒXLMc…)<¬îv$Ì„1üIQÅÑ-, ')( YÂTš„˜¤ÄÚ…#BÓ õÍk™ÃŒ Žè8ÕªƒŒ9WÓ.•ž0B™Udek=D)!Ž®'U訑³$)J:1BÐD!!D‡#🜢3~S­³êñUËyöˆ5ÎJáD.ÛäÚéû½=?ù€®÷Ðôâòç«éÉå?v…ÀC EŒä8$»h÷§é‚£Ó¬áhYÿ„>Á/ôæ-º|ÿnz~€NO>¡óó]t½ßSF˜¥6¨”Z9è)ã^p@Œ#ÀXêH܇g€9{·eµÊC‚3,^Yž?VSeEƒ-sË*Í03£Ö˜Ô7†N"<¡` ÓíÙõïìK†þµÁWËÕ}ÎŮϤ}w0 ð¦ID}›vY7Õ²¸Ã†¾â÷Y•5ee8³0fà€ºw@qêi¹Þ«ï³?P‹cLay¹Ze.ãžWËrîr÷ ^tåe‡QóղDŽ­ Y‹PŠN ×ašÆíE>](4Jq^Ö©•a,²s2;[ž‰Ž9É™ÃÌf¹â†Q7ú””´r@ŠÁøë=¢Þ/5a6+«ù†Õ:4+ y·ü­ýËbp:×~x$ÄóNVÝ­ÅKˆÑ„…±Ýð¼|@ Ý®+^¡9o²eÞ¾¯ƒÁÃa1I#s¼FæHX0bi¥qá÷ ·b{7¦½¢Ð˜üÉ¡Á"¨‰Ò„PÒf 64Ôu†'ȹóÕ¹Ã-Å0Wˆ¢ÊÈåt.Éi/WMU®²éØ/k×ãMË >p5ækWö½8õuÖ¼æfÅÜÝ•¸—ûƒä´ë0{Û —Eãu i›áÜ.y>¯íäÒ• g²ž5Vª‰€=0”ºÙàô,ë‘g•¥V`ÞâÀYmõ—·Þ¬¾³ê9‹73ᥠ¶^RãŠ7ëª/–bˆ—ªnà‚2Uúé‚[â†;sd\(’ÐÒò²i ™¬i#àe´báú«íú[34Þ·ÖŸXôEzàhÖnu vöZ¯ófÀ]i๠€J…¶ ècSšn.`$¢ ùe}Û–…²x“5©-·–ªÚA²ÄêÐϨæÄü(íéЬn9d¸ rB‚Öžj±ãùéÒµ§†yz:6ÙºäìLéYä2žã"˜“RÑj5¬Né;`{`þùøÖ=§4îxG³|çŒTÊ…4ˆ`îd2|“ï2vDé‘,CÝb÷ôôèòòH¹ççÇ—ÇWWƒÅm0¡*×”#^Ò”2fdc"펤A™,!ÇÆq§¼…|²sÑ*Ú)5£Y¸õµ§ˆGŽ(4:R-ѦÁ†¡/!óÔîÑN©Ù«Ò¥ZÀFÈh¾ðŽ•…K•õ˜m}¿Ciì9Iµ2Þ±TUU³l-¥*Z¡'*Ò$ Š\­kûÌÞ…}1N† çªÕsKkÍz™Û™µd-ïVEh¯+BžˆºþV™hö«Õjù®[Î@Œ¹ ¡š„€ŧðŒØÊîÇ"Þå_¢Óá'e»HûÈìñaÙ,P0­ŸM»M·ƒ÷J2¯Gv£X3Ú>M¨/ÉN§&ì$Ás—Y:DæŒG;6©À ÌüÆ–M •¨úÇvÝéÛHŽß^pö½L™§ÌAu¯ÛƃNTãÁIRôØ4ùQœ¶¡œ—KsUcÂÍ‚Ý<Ñœ9Ö˜¬\ÑNc¢]Ü6&ÜEÖ}ÃÒTcB§?mc‘=à@(õºô;C W@(n4H& ³qnP›<+W÷e!_#”"Ÿ†)¼‚Ô¨¦åKÕÇN9˼k!Œ&P8j/fR‚)Fæ€ÚT@v©½×Ù¤m¶¡á´$€;*Vß™ìO«8ªÅM€ „ŠÚÕ'õ‡† ÁiË‘W?ÿà Dëo=q*åðù™4l”‚[HBææ´! 8¤¢½Lã¡×b£ 4 FJnø­H˜­)ƒ/”‚ç*2ž{°é‘>Äq0Ú g}{ÙSèÃñ³ wXìöâÈA0¢¾Îø)ìUØ™¤ÃZ«Â†Z¿ÿ¶†Œp£ L½žñ~c®%­Êæùòtl3€¨=è|H5@ê™äÃìó Õ·±s®>ß?ܾұ82B6©sçt"g> endobj 1282 0 obj 2951 endobj 1284 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.32 400.762 245.01 409.762 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 612 0 R /H /I >> endobj 1286 0 obj << /Length 1287 0 R /Filter /FlateDecode >> stream xœíœëoÛ¶À¿û¯àÇXX‘z÷YZ_ä±Å¾è-’¢Ðl&®-e’Ü.ÛÝÿ~¢¨§Ý¡k3XèÃ<ôá9‡<‡?I˜_'Yðç„ø!EËÍäWÕGO‘í©.×CÄÇž  RBàhÍkM®¢š¶èUÚRx@o'ÉÄB¯'7ïAi…,ì¢O«e\š™O~箇m/ÃPÅJ1 îÂÆ4–ôb¶¡è4ÚeôÜõÍ£7#² }Yè~òr1yqæ"b¡Å]U©Ë‚n€mÊ›P‹ º9z¹×š%èl›,‹8Mòã÷hñ¯É 5IaA”…¿>µTûÂu¬ú7Féþªþ9Ø–}Ѓ© ³á_­UjÕ'ÿ¢lºb©ägïÒ(SÆàf¢Äš}Mçý9ñù@bá – ZÆò×+ì+¯Z+‘õ,ºØwuÑÛ!v†¼LU" „sb8,{ê²ÕÈv• iöoÐ åÓPJ'´å‘vî/îÒÙï°¦‚á ËéH Ù*?ºÊ”úÐkõ6ëÇâÅSßÊoßvÖq|ìÛšP6µ±ï–%]ÚÔÁQâÚU†¾Ñã–:u¹3›r–-¿M³ry›ýÍ5n¹L§6ÒçÎÔ18œ6mÜj„7¼å»RÆØÑ1r\ì £ôN7ŸX”iáöˆœ¸öí±îøôÀ2VI¦ ¢[yeE^Ot³x¨ßÅY^hi=uEc¨E%+Ý^¦I'[¦®Ƭ)m̺H7™³,)÷ Þx—°~{”¤ŠÐ2Z³d|†·Ç¸³º‡h k[í¤æþµš"2»d=vZÜiéѰE½°ÀNêõ˜ms/4¹êvÄ0ĽpÐaMI}é —KS­›^ß2aöµ'°“~¤¹•ágTHéÎR“k{H¯™ÇJ½ ´Ê]…Ú°…Ú°’XÅFˆ{ ¶E¿°;ÈÎĶœÖ6ÒçÎÔ©UÍp¥4Ü q'p[U"ayâiÄÉæ&å$*%A\\)—ÀU’iƒè–®2žè¦ä§l—À•’n+s@=2I\Ù8vÀÖnÌâ0aûùpuý®‡×Ù0]é:Ò•À Ÿâ™lª›F)¸ÒJ­úFßæJñ—(g«J/ÑM‰GٞͯtÌ‘¶Âº§tËàE ãžðn˜.À³$¸¸lßÂ*Jø y\U~3û˜±qºÍÅí\ïYÁ•ø-‡þ€«2Ûò/úK6)%>»¦OxºÊLŸÃš’¨oíj\»÷ÁÕpúYp=¾¤«Q#Ï®jÖÆ£§ Éÿ"t­eµÙßLmÛéPi#}îLNºî0oµBülº^FÆÙR¡ª‹(IJG¤Súœ ÓǨ¤ }èWÇmÄÙ]kíRÛ‰§ŽR«»¡mDÑ/è=ëv•S‰ãÒÑå‚W¹‰)>¼X$ôÊ”YžËfi@°Ò0ð-OÚf<«5cóÈ:ò-[ž†6©?F6§MJ;º'Yd;dË8ZÇò5뾟bqþD Óëëé;-=FY´aË*mñ:·lf¬Øf‰?Fë-˱–Ï UùF·áâÃôõë*æûûŒÝGk½ mCþêó/ãÿÒÂÄÙA^€mÂé…Ûھ…ƒ~íÓ¨ˆÐt¹dyŽøÉœWQrߌ’ð£Þüø½ã’=<߯րúò!z„WÕöâÌï¨ »K lÛ!rÔ«éõéìrz>[¼+Çu0ÓvCº.ŒóÜÖ¸Û#ô}$ŠK$±ß³Ðíqi¯«:¡ºm¾xÀVaîZTD._”_³ K ´L·ðÿ]*_Ÿ¿?²I?Qv¿å*nÎ@kñÄV;fîXøtˆ£R¦ÿù°ßìà `­;èûVÀqà6…—›ãÙí%ØD¿Å›íEëuú öàß³$ž‰Iu_†ðÓÕ|¶˜]]~;mhE‚{¼ú]B»†Â‚F }/—¤ùÒÀ¦€Ø~Ð}³ËJ;R”’b{l5êF·Î®¯.* qRÔÇ·ØàZV#ziùýpÊ\JaËA!¹APOÇQ…* _šÇ|ù•(λÔ5ÊÃ~¼½‰ŠåCÙ¯Ðgêöæ.˜:p$¤#8½ð¾#ÎV ß;G(rl?è0¨Â‰“V„"iX /ŸTcÅî¢íºhiç,Êô„õÑ1û,Ý´³e;@ÊCÀ$tô »“$Nî«.u^R´kº:N%/Ì/ÓGuÕÖ=ý ïyØ&†®tÄW– E¬dQlý9ð\„6ÜÜØ~‡í*:q¾‹YÞ3YyüH‹eMÓÿIuåæ mتÇkDŇF冸e)ŠïP’"YÝqÔ*q<½yzdÙüçóA8¹/E`®ë©+Õüêz±L\¨¨E=Ûoë¦ô úMç¯ÐÿÐéðñ'Pà]þûü|_œÍ®ç øê| î„Ç‹CeáYa'.幪fžf…¸½Rò2}|ª$Yò­Òª,è–òKcÚqßÕTRlD9ØlÌÄÎ.ÝäK–¬Ô¶R!e+–‰1”/X%©Ë•9ïŒ5gÞ*+ÿ:ˆÚò Jî]2žcÃ%Þ‚Üê–hq=»0KFýê¢ÿWZà endstream endobj 1285 0 obj [ 1284 0 R ] endobj 1283 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1285 0 R /Contents 1286 0 R >> endobj 1287 0 obj 2276 endobj 1289 0 obj << /Type /Annot /Subtype /Link /Rect [ 123.635 175.862 228.75 184.862 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 612 0 R /H /I >> endobj 1291 0 obj << /Type /Annot /Subtype /Link /Rect [ 218.1 73.508 322.79 82.508 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 612 0 R /H /I >> endobj 1292 0 obj << /Length 1293 0 R /Filter /FlateDecode >> stream xœÍksÛ6ò»~>:w4‚‚3™Î¸¶Ü¨ãº[žL&Îth ¶8'‘ IÙÍýú[ >$'ýÐ^ÚÄØåb_Ø]ìÂ_'øïÔüˆb†›ÉW‡£(bˆK‡ÑK¢Ð9@ …Ö†°³4$nÉk¬£¶À }œd‚~™|þDKD°@/2`nÙÜN>€p!1—*Žc§+ÃT)#‚c ‹Å½mºÈkê½ö†ùǵ÷5â”ýhDÐÓäçùäí¥@” ùcŠcFÀÍ1Ð*Ì™YBLÌ7èóÉÏ»t]¡Y†.wÙ¢Jó¬|óÍLçÎÈšCF þpK"$Ý/^œ5ø CÌ-0˜ °Æ|Z»£u?͇ýRÔ®²?ºÆ±ò6÷ªöÙß)üð™Df#%XuNƒÆÔs7Âþf¯ ÒÈnì‰ûöAdÍof¿ýqvssöéþ½KŠ"ù†ž“õN#ýç¶ø)@ï²ÝÆÇ û7ÖøwÄ ÃÈð–ÿ®vEV¢7ðRLÑIâ­3ýâ©¥·pµJ*\äY•¤^ÕJ{^ëÎ*Ÿ 2-¸O ùÙ3`Sê¯;-t‹±ñd×µò%nó•Gy8B¸J¥‰AGÌz×$åMâx =–Dp–±K¢!çV·´ôÝá)½Î_lúXðÁ„иñmE’=iñf}Õ›$ƒÛ6‚Ø Ÿ[H·5ü#F D¥éNA6ãvw½é3 D@I@EÀHÀDÀIÀE’ €"$"ˆH‰@‘@‰ &Alv‘/h(G‚]Fß'Øíôjz>GÿB—7¿ÿ†lRßt§Fyïߌi¯`´ÛU¸Ÿ,Ïéˆl(†ÄxˆÄNöéé\‡†*"Ž Zœ'qÏ:"‘Cϯ UÌ”£b#T\õôú>ŸœßÝÜL¯ç\œÍ§ò!ôo$ÑÅÙ'ð—ùa|†>ÎæïÑï7³ë³«ÙüÓP ˜ßºv£³[b/4ƒýà RöŒ»@ÍŸÙ}${‡tÚüA#ÁaﺅJN‰:%æsH‹ž =C#n‰èaCÏalÒCzvímèCŽÐ³°goC/¡‡1÷€½ŽsHòCöF(²äľ5Ú¢×ÑÛKsh¯r„õ[4‰•Š£_t¦ h9zïϦúŒ¾bbžÑ TÚe`ºKÕzÕ=+çZ(UÉ´.ÓÇG]ìûYGbº%vͼš {ÈÛ|ã3êu9¢W²Xè­/7ñÖÏI‘î; ‡òžçöz NK@— Ãj á¤Z}‡Ä0—ÅR jgë27”íšt³v=\½îñKn†;ÎF8Übfì(Ûu‘TI³ó üT– èZ¾z}¾2=l5Œš˜JЈ³ø42SH$ŽmX¬’meO †M«¼_Ccܬ۞°ôhßÍ”×}Z/§›¦Ž–°=€&˜ƒQ‘®•nqv;ž±à=sŒÿ®ï®®f—øÈæ€2J”€c¡»ëÎn§ßO¯¼iŠXAŠó8ŠÃ¸»ÉäùZC.vpìQó•ß HF0‡(‚ŽÆÙf‡aáOV8òf„¡2›×²x„_£³I:¸?™÷2ïàã/ó®»(–¶zù· ºGE«y±³£­ ï©öc(Ã"†–ˆC÷?b͘îxäд+jŠ‚ÂrÔŽÜ^¼¤¥þ+úóîJ3-¨hô4^ÑŸÿ4¬q’³—»Z7¨nb´+¨ `"¶:žE¥YYédÙÀ6+íz“ÚÛ[éÌ=´YÌ"Ù&é:­ÒúŠqjd-¯|[§<>÷aس©Ö¾Öâh™/ꊯ—0Õ{¿ñ‚Rb’úòR+,RוÚUhcÆhEfÀ‚™ßö›ŠüºD&ŽŽ»:ŒG%Üï®ÿ"³y@ endstream endobj 1290 0 obj [ 1289 0 R 1291 0 R ] endobj 1288 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1290 0 R /Contents 1292 0 R >> endobj 1293 0 obj 2351 endobj 1295 0 obj << /Length 1296 0 R /Filter /FlateDecode >> stream xœÍkoÛ8ò{~?¶€ËŠ"õZÜp·ë=ǹMÜí-’â Är"œ-¥’Ü6¸î¿!‡©‡•ìÚ 3Cr83œ©|>bÄoä¯ rÉÝî賦1¸„ûšäù„ÔwB²# ½låÄ(§h+ªžÈùx”9äýÑõ'˜´&õÈ×#§ÇÙ\ý ›{>å~E‘–Õ¥, åœúÜíÈÛùÎ%g¹š]K/9ÿsém‰8sÿ$rÈýÑÉêèí;0‡¬6ÆBN]ÌÁÜrW‚ૹ~u²O·™gäÝ>»«Ò<+_"«_Žf+­¤â ÜÈ…ÿU¾Ôð„Ó±ü¬¡*üÊ‘êz Úê£Õ¿å@ zÊTøû i4+kq÷ ”ÍþÌÍŸI 2‡†­Ó`‘k™¿ía²Õz)÷nô ºú8=Ï:½˜.fW§3Tèí»¨¿„ÃŽL.⢽ææùË—x»OHòí± ìxÒÂÝcr=!”ÒOäæuÍ¿gbðL—:‘ï8Ž ÿˤÚYI^“7nŽùê pœÓ0bQçÓg£e.~@òJ Õ`ìø HŒEÔã0ßë³5b¥ ®,Ø=Ë­l¿ÝN šWIñ5-C*^¬ºëAâ"Š˜ðTw÷°î\¸Ô€“+ÄKuïéh°8[¤Ì-Ý3jÕƒe‚êé1Añ,ñEG’|CnÁ~$.î÷»$«J²Û—¹MÈ]¾{Œ‹øv›Próê]¾ÏÖ±L™Æ‡Â£QEÎwÃÚÇ—¿Í.W#aÁ¨>8_ä±ÖÒŽ‹ca"ÄDjvÜÄ‚ÍÊh „ä¤Ã€M˜erlá?ýôW û·_ýºøçÉüý|¹²ˆß{–ÓËßG'´–+ÒââdlÅÅÅb6]öu¬£[wåéÏÓËƧãûžMW³±áÙéü|ºg0]Ì—ëê{vñádÑbÝ×ÍãÝäÂw‹‹©´óÜMreö~v98¶¸X¾ÿmzÙœÌðŒ%LÑö:ÈBŽ÷Eõ½gŽaùÌ9,Ÿ9ˆå‡óÙåütl†þДËÙèY]^|œŸõu ‚!ÝD¨í?ÿ8_4¤Î xÇBGËÀðj~>ºZMÏÿ~p|ù{‹q_ð°÷rñ‚ïDãÒjk•Y‹ä.-!¡MÈ6Éî!æ)ïâmBdÞÛ%UR”2ÍO#E×eŒB²s/ÒO'apé4©¬!ltãi(XåŽ øËÙÉ©Áì1é³™XS>ïSÈ–Ã ­Ê-Ø– ìa²‚òkKìé•%³Ì¾I)ME qnms—g_’¢*{㺼c””ÔdhþD ‹§ °hj²§e;\…¡A1‚" w>£F4S†BÄ–ð>ý’d/‘WЈ»PUC1$°.BR^U€ÊëBÌ=`䉋ͦÑéK¯ìDtõÓsRG8Qè1ö_©Âá&|¸ˆ…ÞMIòGu3ÊFÊò)}ªô®ïXÜë0Ì bU$‰H¶f»xìöÉÀàË›ô[šÝ’ÔÄ`N_SH vØry!àÑ€t2ÿî“£hd)5›_å;KÎ|cið¼@FÙëº,#ÁÄÀN¦Y‚Æ?{ÀpFf†àe‰Ù°&‰L':O! <5][zbv2‡SNú ‚Ζ·{É‘ÁM:de(£C)ð6.“u¨¬ ,ÏÞX9PÑ´Kà¸tˆ‰mŸjì°­¡ gBjOVÙir­j·!QôïÝ vOƒ3ú&ñ"Ø&€„XeÐêfÔÙ .Cë»wЬ¦þ1â¯p“@·›b‘ˆd¯±Ì³Ä`è°×ÕH!MœR„ˆÞÅ™An­¥{>¨W[üüÊÀ¦ K$)¾`E\½UémºM«'CÞåMÛ%ê« Âú®‚ˆiWäQ4·-köÆÀÖ XÑ5R‚Ý=$kk8[ÛÛnŸì«ý·z.ãph› [õ„M¾9D)ªò™oTò}?N@™|Ÿã¾ÞòÀÅÙØ³²p#èØå»²ØKnT&ß4Ì#¦Äê'L ïâ4;ž¼dظFØKV@‡‰Ê,©¡kJéäSÏÐB°Ž×íGð5f¾ãgÞÀ…ïÒZ’H„-c`_£.Hñ¿°±@4® ¼MâÒB¹5«~¥†¦ïù왫¡Ñot}ÙŒù¸0æ“°:˜‘çRî› º°¶F¬ÔÒßs1PRßlžQ 2*´A~ÈP í5ùNÇ&“v‹+1c4Òoä¬Pq×}¹"T €jâ0ùšìÔÈ {Ø(€HãňŽ}ëˆ|êpÈ®çlb(¯îØ2!en•ýjÒ`± ¯×*¹«ä…¤Ç8- ß|ó¼I ½P/€ ôª?he÷~‡~‡Çˆÿ2w`¾t_¨~8"‡UpiÀ}ülÐçf¼’yžìðkÇÔ¨ÉOš0&®EÝ­?Øjb„ÅKK|ßCÆ ÂpõMâ*±ÔÛgUºµT7`=}6ù1Æ ºªÕ[ÔŠ mo> endobj 1296 0 obj 2733 endobj 1298 0 obj << /Length 1299 0 R /Filter /FlateDecode >> stream xœÍkoãFî»Å|ÜrÓyêòpZ·F÷ºqZÙE¡ØòZ8KÊZòå‚ëý÷ã<$<²â´Å¶ÈÃ$g†CrH9þ<¡ˆÀÏ?ÔG3´Ì'Ÿ-¢!X’  q@"”#‹D2B[5±ª)äšjgdƒ~ž‚¾™Ü„I+D°DOâ17ln'?Âæ2À<ˆâ8¶²2L£HmÁqÀ2G_Ír†®K=»‘^1"¹ô®Dœ²¿D}š\.&_ÝHD Z¬;ˆ8fÌÃÜs¦@ð‰EŽîß\î³mfºÙË:+‹êíG´øn2]X%5íF ~C¬}©7 é8~ÖÒ;*ü Ì (˜IÐF míÑÚO5ЀR›Ê|5eå,><(m³/¹ùñ3 ÕBJpÔ; sÇü}ûÂVóRíÝêêC<ÏšÝüp7Ÿ£ßÐìVÞ ¯ÿl÷)Jÿó¸Côü¬‡³sôá­Q~À\q%]ì…åÿ>­÷»¢Boa<ÆzÓ,ödãGDÂÒ0ðÙX€‹1Eo´0-FÏŠDi„CB¤ôÙvbek®Ø½(b¿ÝžuhYoÒÝSV¥iw²ê r, _«:;®:“˜ÅQH,Š;¹GêúùÑÁJÇ,õÆS®Ã[!³±×ì@Ë/îöŒ› ãc ‰¥ p <ôyvÆb‡± 6æ',Æq( ¨Ï[™.¶yYÕI?ï3Ø--B]ZàöÇyÕI±Jv«—tbÅ\q$¢ÀßþêÝÅ|z{5ýð¢zgb¦z§ ÅsÖ#Q-"ZÛ‹è =ìkô”Õ›>õAæå*[gËD cH(ß]_^uìC?i„àýD~H¨á>Ÿ^Ü.Ž‹ 8”òÌå.H]÷.c $øÿq<‡QF0´¬¶&@8x2[µXc†–P'ÿJ«+‹na¹kÁ¼Üuôd÷iŸƒU¸%Íê\–ùc²sXÖ›¥-ED‹¤É²Ct‚êV«îò”¿C•'ÛmZÕžQÎÀHŒPHc¤F“X Dê‹FœŒ¡ñ6ÑhÌæY3â.&:†´zL—ϬZVÝgíÌÑhÔ C›­d_õXÛ2Húm}ÇaðûvmöÔ^ }Eq²–¥8µŠ!$¨Îw¨ÞÀìkD·;>•»&ðþ‘šã·Åê×*ÏXùSµæ Åä!ÅA9w²¬!c¦Åî3p,ÈjD9ËÉáȤġ„›*ŒÌ>ªÆžÝŒ„" ¡[Œ ‘p—üÁºj~hBáF“\ú±GT›1R™ P(h 0rj(8¹S”t´èâX¨”G¹àìÈfËs‹Ô.âªÐTèƒ -Ù:¸)Ð^Ò–‘¨+0_¯îHAÎâP=¥JÅç3Gº~;ah;ïÄT‚¼¹o­ºÍ=iYº&|€ ¼°à”ˆÔù²\*ª$‡XlÀômØœ jSîê Ç5$XÀMê\¢«‹Û©vÔ´ªlUxSî¡4VkG#ˆC¨JW“àMý4‰'mÞ”ª0ÿ6µ“<p§ŠàyEWëñù“ÚZ¯ÓˆýmúÚW*rcëñýâ-â,Ã@)Òl«³«Ç\!Õ# ¥¬;«Q¡äi¬f°:ÜP@d@eè³Å­\7¦6 Ì‘$ùãÖT»š ?…ö, @~I‡vúÝ 0¸ÓiÀL*ðùv2V-hj{ Î~XL¿™¾oñe¹Ýç…3suÂɨ´à"T§)æ¿‚‹þ²GûùóMª½~ww õ9”7U¨JO¹œu]íq0k™@ÎÎ ¸ö¬òI»Êòl …¼š¤ŸO®m\ÞœA›Lâ°Í´l$5 pl&»©/få>Î_ÈÒ"€¼F„ÄMQg*UÇ^^b ÷=øjÀ8'JuCݸªÆF\5Vu „€zÍñ¸¶BGÕ MÁn2°èwç/hBCŠEó‚õJUÆŠUÂBîˆC!øv‚önŠ×‰Î9Ã’0ý1ðã² @ʃãe1à‹[Éì=¡á&_¥Ö~‡ñ'ôŒ¤¶‰ÐœTÆ?zdêJQñtÞ>ß~4?!ÂǸ }±…² eº¹1%ã‰!.!ùP¨^¢PÚ¸½»›]„¸„œ@8ô;Œºêáý×{28G¿¡¯²"Ù=÷¨ÑÿÆC] 8œ€Æ¡´ï?›ÎSR•¾‹²ÕóIžBwÖ’ê;ƒ8]§!t.kð¤ãš>µ°VªAç´ †ÖÒ žën²Õ½Ç ·hO©dxó ÜÐ+(²sÝèZUï _õ_~¡ë­÷JÀã¦>äýÈåí‹ µ*²š¸QDcm¸òöAÿ€‹Ò7ˆÕSÃÉköù] @g’'uú¯2ˆúÒ–î^v©ê_`¿öeû0ˆ+h¯6h÷ œ—#:/t±Œâ¨íhnŸ«:Í¿ÛUßâ FeÀ4"ÐNÆö ‚÷¿üsñë÷Ó_FB3€˜áªü‹øÁ¢Ó»#ûuóÿúÞ• endstream endobj 1297 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1298 0 R >> endobj 1299 0 obj 2107 endobj 1301 0 obj << /Length 1302 0 R /Filter /FlateDecode >> stream xœÍkoÛ¶ö»?¦@Æ’”¨pq<œ.C–l‰z‡‹u(›v„Ù’+ÉIóïwøIY¶Ó~Ù†¶ð9‡<ïÃsHõË„"~P?iÎÐl=ùbi¥ E‰%ñÑ'$Ckd‘Œgh¥6@µÅ‚‘¦ÚÝyB¿Mª A&¿ÿ›æˆ`Ž^&d$܈y˜ü Êy‚£$ËóÜÚÊ0Í2¥" ³5z½fè²Ö»{ë• ò[ZQö/°ˆ å优¼¿âˆT,| dfœÃÞ GLPÅý~r¾-Wº®ÐÕ¶šue]µïþ@ÅO“iaÔt1ø›b]Kƒ“áJPgŽî©ð/Æ‘¡3Þ¨¥•M­ýU =Èu¨ÌïÁÐXQón¢tÌþNå‡s’*FJp6ÈÍã üà û›£6J¤Ò}Ø2ª¬{Ùm›ªEï`™Pt"ôXV¢yuhÛ5eµth#7leÕ UŽŽ\/öHš5¯›®^6bóäåý)=¼¨wOÒÁËòYzÙ³ró$ýFQÍkØ4õs9— v”âIšÄad'"N Ç ¸½‘³rQÎz75±lw–å¼'<¾öÑôþ*ßM)&)tÔ8åcõÿy«­ ôWŽNä×Mãúß^è(³ŒÅ8#9!<ÇB{›LÌ4hâ¬Á>PßáCDRÌ“4Ï#š|Ÿì°QN1Ë3Bbº'0¸7ª¨{hÛÊ=îÌåBlWÝ(ÓÃQD¡Yd$ö~Ÿ"“ÆWTmW+¤«ñ`òÃ1˜H"Î#‰ÖqíðGi–à‚—ó4 ÁèÓɯÙ<üzóé]/$ŸecCe,1œ—×gnïŠë‹‡ƒÀà8OÀ±¨F÷w¿}¾¸ûx[ ¯}O'ÉSœf)ˆáV{ñ¤ÏÅ9jψ……gugº”ÕLzâÂNµ€b:‚ALš{¹UÛI1÷Ór l›‡A†€A%’Œ’¤tìÆ‡i¡dÄÐ)Ñ 4Žˆ1>\Ã,Ä3HgÎDz½q-4N¹†þ‰=­­Ír«ÖÛkÚQeS’ï(2  Œõ“J¬=¢£eÀpϼ˪n»rÖ:Ú³hJñ¸’ØQ.¶M&­^÷ʨ«`¡Ýn6uÓéÆ8çe»WÌážÃ"A{€#È÷¸ìÊöpnÒô˜€#Ž}}±Ž³ÀèŽÄÆ WJ}“2pS¿8xVou¢íŠæ2‘£®%¬Dë™äW9ÛvÓ À ©Õk%u ›ºùf@â ±èôˆ0غ”;]­Wv!V+saè-/÷ní„,l1Ç)³^K(ÏNêê²ÄÞ‹ïíýÄîD\ß>Lï‹SOøøËåY1 —Ó›i1õxÿyzÿ!XrÎz’ϳ%Ø>dWu¦-¢S=ŽƒZÆ,PRt’ÊS$ZTv䪪CmüéòüIÿÆBõ:I@sFæëËémq]üÿÈ¡YŽc 4"|Èj ÅÀâXÏÝû'Ïqîæ¸†mÄiè }É Æ‚´í¦'tµC„ƒL2 lî9#µ3ÓåÞʶ…ŠÄŽP›ƒÔô¤‹³››‘Ù*.^ƒ.NkÄž+)4ºAÖb®4æ¾îs[ày_ÜkS{%,dÂÓZNócBáCåW:Û§|)»§}>Ê•zµ]ëØ¸Àøìø?v4âCGCûáMš„GËà&Q¶õaÀ,Cèë£ç~ï‹ðƒÂé :^€‰ÁtéŒ-ò¥cð t a*fO»«_‹J,÷Œw§Ã0uö¦¥;JØ1M‹ÎëVnDãš§íŒsrªºó[ 93A1„GÏîK©ÇXwöfUk÷ôL0{Á·Qk·—ôè7“Íçu ÍË,‡‹aèg$Þ-1è°Á+Ò¿¿uBÇÄ$KÆ2{‘>+ÎÎϦGZgï‡,£ÀÄ£!Ó[­3‚LàLÓaïT¸(¡:õMï“>³õ¶C&&5<âË æÉZ¿a¡ ÁP±ÌÔ´h¥rXM£ÎFq‚9…·FNèÐîÏ·g?õ8Ks”§{¦„œoºÃå—§ÀÎG_,ò8¶éòìÑþ•â=®Â×Á³'8Np4šSOƒ«®lf¥ækI öºÛ¯f)+©Îç<Ð¼ß ÿÆàÊË€Ë4‘ÑIˆ¡ðqìʵ„¢_o_ª6æ)e`UƒÌé¾ó¼±µOÀ©'ÙÇœAäWP¹ ~„svyÕegÓ³«sì—ŠPpŸ*k‘Œy à,ËEi®Ïýò«‡ÅøÞÓx1_›¦m9ÓÏÏÆcÛÎ#ý{S#•| k­ÁÖÛ6àz Vl¯¶šÂB²ë¦YÄ¢]!¶ž¶ªmÍÔ=È÷X®lm!Ù•*¸ œ€~®æ“§¨F3'K†á”_ÁÊJ¬H[ª^4`ÊKÝüÙ~s¯aæiBS¾ÓDþ7½¸¾»=Òâžz9Ïõbìe~« Å9¼ahœç„E{z¯újô ™P'ÄÓþþîú‘¬ÀwhDW°`ÏÀ)bšÛ7õ_N#Gpˆm÷ý—¾#.su³â N™gxËMÎS  $¶múe[ÂEJK¸)‡ SÈ_9~&ÓŸAˆy!ŒÅ^|¼¿‡ëÚçЋñ'MBŽÉø¶°Á©‡‘•ç´Ü>Õ{/"œRxÑ<≠GcÂæ JîðÝßÝ“Iã(ÎcqrˆÑþwÏ_º§æ endstream endobj 1300 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1301 0 R >> endobj 1302 0 obj 2074 endobj 1304 0 obj << /Length 1305 0 R /Filter /FlateDecode >> stream xœÍWYoã6~÷¯àãH¢D=:‰²qᬱ–Òb»YŒ-ÇBmicÉ üï;ÔaQÖ‘ôe[ä09äÜßÌЯ#Šü\èÇeh±½–4І¸]’„¨ƒm"Ñ•)$Úè‹¥¾R.yN-o›5úcú<úþ.-Á½HKx!Æ}åÂÆÜ–®ë–¶2L¥Ô*8¶a±Ø¢ËÉ–¡›$¿]Y¯‘ÿÜzÓ"NÙÿÀ"‚^FWÁèòV JP°ª! 9fÂìÂ]‰9ÓKÀD°Eß?]í£M†&1ºÝÇ‹,Jâôì ~yAéd.!‡ƒ_çXj‹4O œé5þ,Ì P0à>Ú”©-?õAµy¨ŠÏÞД¢ æÓDå1û•ÊûsâhFJ°ldƒºÂa¿8j­DjÝGœSàš„òuÀ‡ÎøžïOf_ž|o^xuyë¶ù,‚‰eB­¾}6Å.á W|ßüÀ»Oƒc3PG¬^¶.ïˆÀš0G|×ó¹÷%xò¯ï¼ûñ€F 5`9[ò!Ö.­–‹9®+…Õd½ãéìóZ‡bêZÚäaÞ6×å˜%·ô6X‡iˆVU“@»0Ûïb”­C«m¸D‹ýnÆJÃ4…HeÙ.zÞg!FÀ{@j"µt}"?SñRí–µ<\c˜Àï.ë¹mM@gè‚C&::£óf£ÔØd Ž}î‡*3¶‹$ŽÃEžW’^aK•©g•†ç-1Å«~Íéþ9 _÷­ÍÁ$‡¦=χ^ݾ´ÃÅì“p‚»Ù|òç8€bBi¦²p *;"mI( IˆàN»DT«O!ËH¥ÈŒ{[´5›A1;0jN«K{ GQ•¤b]ºVlª@UGE†Š]#Aå…¤GN•\“&Y·þ81u¬Uübjx‹²u½SñÁ´g»ÆÇY´é1¨¬ŠvÀ$; ضØ$i¸l'Š [*ÚlW#Ñ©Z†+µ‡‰ž.ÖáV¡d•'OÇõ>UuÐÀ FàMßl¡RZé`‡€5n1h¡¢³±€ÛzOçb©6oêPo‹àëYÕF<Šk¶ãê%ú;¬éw‡ŸáN·’ŠPe¼æÌSSÚ/£à¿[lꇀuÝnµI^ð@¯æPFz@PÆh–‰ÿE8»žÝßO‚NÍ¡jˆ„òêÐà|üôx6Ы¹ ƒ ´Ô;Ï{sŠ‚ùƒ‡¢U[†”@xÕ>Ktz£ m“%”Éã1¢µ®-xš;w¥-kKçÞøföeúí©lC³žÃåÔ•Rð^þwüµŒSý­0þQw¡Z¢$¨ÿ;w¿ðÏ…9Ú6÷Ð~5ö½¡€ ˜ßÜýÞqX0ƶE˜²ßác€ÇÊp¸n…tZX0x…wqúm~ºL=ÈuÛÆ ævdº)å=ÿ¥Ѐ(b¹Mÿ¡½Â+&bˆã.ZÕë² £ITW !ª^êð]äá;’VÑ&LÛ¢pMšÄ¦ZSò_Q1'Š]²j‹97LʺÍû™¢Ÿ7†ñÅø+Ö€ëhuðû¼ÕÆaêœÄžk9–Š1˜æo6=5i”êÑ *`Ë£òahÙŒaË®CmYb6Í(OSïwo:€'`Éá«&<ùi'o¢ò»ë?1¨ endstream endobj 1303 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1304 0 R >> endobj 1305 0 obj 1275 endobj 1307 0 obj << /Length 1308 0 R /Filter /FlateDecode >> stream xœÍX[oÛ6~÷¯àÛ`eyÑ…†NâvÞœ…hS ¬%Çd)•¥fû÷£DJ¤D_Rè†Äð9ÉCòÜé/ ü{Õ|…œ€õnòEc„Ð@C~pÄÀh†ù dÍÄÙLÑ$mQ=[1[ðç$Ÿ ðvòñ“œ}ðÀDãŒB‚¤š¹œË % )}"ÚÓË:Í*°ÈÁ›:_Wi‘ï/>è÷É<Ò—l%´nDä[_ øŽX~Öã•R…I_ަʴiõw3Б~«*õ}T5Z”µxl¨Vg?róã6 ›…A6°æ¥þ¡‡ý`­9†lö>~äxÖ}RÕe¾à•„ƒiµM,n]—e’Wöx)ò½h½ÐBÓ}‘‰–%_“Ìâ7EytŸ}²ßËÕЂܣ%©\d˸ŸÏ®-öêîæfEs+Je+K”°šß/fËŇÙårݯÊ4„àaúÛ?OI¹z·|¸Pr^¿ ]­z†m$zÄÕjqwû×âº[ÅÝU19gȯz˜šýYQ¦J¢!s̈‘/¦S¯æÒØbŠÍÑyÚ "l¡Â¢/o·‘|Y@ ˜‹õö¤ìÁ©R{£:O¿ÔöÁâº1ÈÑsÒH­û‰ÌB³t“Té.9qwÇ98©6•ø,öòf‹ø'éeÊd_‰²Jb 6•tHé/ÛºŠ‹çˆ<î†_ì=˜ˆ‚!ÌøÈVwËYÔPËùûùò„/aσc/.>ãR8 §B~è9>E0“¢Ó¹æâd#ꬲLJ©A£ƒÔ ±>5h^§†ƒûX)H#v²Ð{X“,º):Yhv,4v YàôòÝÙ‚ ,[*øÑ èzÍ.g«ù7œ ’ŽŠ¹ZÈÃ/€„ú2zÔ­ „[Á¦9ËðÝø¨&(tXfj‚⻚ppŸ>ò æžÍ* zJW;, ;T|6RÃ÷Û™!„ÒB´ÝÏnW³«Ö6«Å‡ù ûRD!FÒï(LJŸ±+%2ÇQéeuŠD Û€NÛŠ.‹çž^oEþh†ÖEÝFŸâ”Á\&Jõ˜q ؃º"œÝ²Lžd•âÌaÅÁu‹[i¥¨g­³ž=_Σ¹c|JÑ®ú‚A$Ý+Ïi–ωô‚'‘–@Ö‘F®>w?{ý$Í5›áj+* [ý$}9‰á g‘®yˆ9óXàÚûdA’õÃ?¼ôŒ£xȃ¬i^êfþÁ°KÅXùX£_‹kCë ? Ëê  ¬]…!M³¡xÓk(>²…vyà ;‘æ•üþ˜ŸUß ø4_—ÉN^Qdާx8)K51²üb0}Þ¦ªåQ¬ji-²¬X7N` ª0tž<[F¡¶„<>2ß™ú0•HÕÞÁ€Éßɺn'>\XgÌ §›MRií¡¢­}¯Öö•]•6R™îîäýgèüi1^Úxû’r0]J_0^HaˆB!ãUçb…{Xöì„c…rÓ»(ÚDŠâûQl"ŠTâJ0ñ¡%˜DOõÁ¡Ø>6Yâ¬ÈP€c±}X(ÖŠ ƒÅ=Ùº¾c{±‘¾”ï²QL(HÅ„¢µëQLh y|d¾3u Ç„BUL(z Ä„‚º˜P\Zœ5d6Ý}]É÷)ö"¬óN;J¾1@|ù4õCŸ3†nm¸º»îïNµ™¾|¤"Œâ'ÖŸ _>W=ò€‡n‡I| Óò+Înùõøèi¡Ð]ëg„â»gÄ!™ƒnRcî9–wW¬~¶€›÷-d!ƒ=nÞ_]Y¬°e ‹Ö­£klùÞêæ…† †Ò¦œ£Pg¾åÝå™ßdЦX¾>ðpÉÃü².²z—˧këìëäWÐí®cü_·eù endstream endobj 1306 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1307 0 R >> endobj 1308 0 obj 1532 endobj 1310 0 obj << /Length 1311 0 R /Filter /FlateDecode >> stream xœÍW[oÛ6~÷¯àÛ a(ɺèúàÆi=¤ šxËC] ´LÇ$*‘¨dù÷ãÍ<´dg{ê†$ðùy¾s%é<DäϹúH§!ʫѓÕ( Q”XUœ  Å ÉP…,Èâ •j㨶X1ÒZ»Û€ºñAŸFßÈMDpŒ^Fd@nhîFߤó8ÁQ’M§Skˆƒ,S."œH!¯ÐÅ¢ Ñe­wï£WDä?Þ( ÂÿAD=ŒfËÑÅUŒ‚–[,Â!‘ežÊ½ŽB%Ê™XVèûxÖ¥@ Ž®:ž‹¢æíÙ´üm4_Ú$5ƒ£Pþ¦XÏÒÁB.¸` §¥S,.XoHTÖkжG6ÌŸ_—>Ó²cØÁkÏ|qù‹GÐ0'w¼xêR¾q2gϬq¨a]Ë6À¾ÜÕû¼.»Š{{·¬a> endobj 1311 0 obj 1047 endobj 1313 0 obj << /Length 1314 0 R /Filter /FlateDecode >> stream xœÍYY“Û6~ׯÀCìݼIWíCì±c§âJœQå¨8 Pá¡ðEûë· € ¨™Ú§ì&q¹»‰£ûëÝÊŸŸqø÷ÿJó€•ÍæO-óY°0Ñ¢8a~ê%ìÃN!¼ocªÖ‹C1ÌL£cOsp³óQ…¡­2V„ZYf/ŠqêÝÝã¡ÅuÝfV:Ÿ(•ˆÞ‰™žá\ ›Eïh]Éý^ô:ÁH4€‹^vƒ7˾Ã@[X·rpÀó øÑtp×4@y¼aÃQ€JhwQ–Ò`'k9žÙîÌf%Šã"HGZÑ &Û}=‰¶„­°ð0X§`ÀŠcÝEå™ 1’\¸5¡†óŒó(}*FÌî+A$—%`tØnU2BOz>à'JiÊž‘K4ÓOî'7 ´ˆÊ0=ˆcꉅ¨T5ËŽ}‡P:’®òlWcqriqe^@žFðâ­—í­¾óIÌÂ{3=Íü+'¸Øc±+†……PnêÊìܯ¸Øý¸„ý Ö1™F×ï;Ì%Ù>¼^/†üÏ!N|}·Zü%â‹eþµu?i’^¸85Ï R&Rë˜Ôx<]ø6µ–-8ñbõ)²…Ä2ë+åÐÕ…~y‘ß÷]cèCÑW'L1ó­µ)BêâÖn+ûb8Ì_fåÖ˜>!‚%>‡nö·¼z-œ<_?!˜ª=îIÎ-½8 ¬±õùÆ‘‘õvKáCÚ ùoç„z|aEuoÔ¸‚ ðKPĹ–{1ÊF˜qÈ)>Ï5§QÍRq?öµûÜQåjG +áyò,õÛw¿lÁ ?óðIVû-K˜ ó‰|h•Å$ ð‰Ÿ•R «z£Û‰áé œó(–õÙTûˆ¡)I/ê,¹›—«D_Ô:RðI Ïȃ@+\=›B¥»ÖuRI¦÷Ïw½½ÿià1$È®/ð24MÁLCU±ÇfŒáËK)(5„ºm»‘æj BÀ`¼áÁgHlÐáhü:µbxé°¢§q¬û Oï>}ÿ㯪yòCÇUÄš† é·_¿ýðîîÉ•ºkCúA´0ÅÔõÙJÌ觘½Ö>"F«ïY™k|g*,gTÒ“Ðm®RÉY>ž:KKGÍa ÌKL¨!ÖíxœÅ^ݤڳmÌz±$V? £gàˆéç¢zfß(Þ<žÎ"º§öÀœišjÚç^þo({yŲv¾ŸÌà°ÞºŽV@©ìM_O¶´•ûµëÝÒ¹„ZÈËhEa¬YâøQWº™‚ag‰Ñ6pZÍ”i'4?fjSûf`Û&ksÍ2eZÖš¹zÑk~jGY?¡Û¨kÉ•ûè—Qy³èýÔÃîŽ×£U@c@íÜuÃÑsõ[€™À ´UR(!8ª!Ô9NêVÕ\E¶Ý°BOª¦©>õ¢sT» §åÖu)JBl™aPJù³£ízmÃtî]Òet†väDj8L#tv“¼¶½Å‚^îTœo ­sòÊu†ÖÁ…䜳¡ûò]htê%4V ýãq˜Úîêâ.9üáæãå/ÉR]€ï „Lyí ³~Ã]Lõ2ø4Ò W¡Ïn¨TEn·øå¶D=çÿ¨|Þü”9) endstream endobj 1312 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1313 0 R >> endobj 1314 0 obj 2313 endobj 446 0 obj << /Type /Action /S /GoTo /D [1315 0 R /XYZ 72.0 684.0 null] >> endobj 449 0 obj << /Type /Action /S /GoTo /D [1315 0 R /XYZ 72.0 419.52 null] >> endobj 452 0 obj << /Type /Action /S /GoTo /D [1315 0 R /XYZ 72.0 330.84 null] >> endobj 455 0 obj << /Type /Action /S /GoTo /D [1315 0 R /XYZ 72.0 242.16 null] >> endobj 1316 0 obj << /Type /Action /S /GoTo /D [1312 0 R /XYZ 72.0 720.0 null] >> endobj 1317 0 obj << /Type /Annot /Subtype /Link /Rect [ 342.25 421.02 431.41 430.02 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1316 0 R /H /I >> endobj 1319 0 obj << /Length 1320 0 R /Filter /FlateDecode >> stream xœÍYY“Ó8~ϯÐãP•¾Ç0 ­9`b–¥(ŠÒØÊØ[>‚íòï·uØ’xØb·€JwKê–¾nµºÍ·…‰ øsÉ~üÐBq±ø&e&ò-d{RäzÈô±g¨@’ Üålâ€dS$is©œ-˜}\” ½Y|þ“d`ÆD¹P³[¼㮇m/ÃPîÕÂf06ö€ˆ ôr[Xh]ñÙÝî™"ã?ß½¾#Û´þ;2ÐãâU´xùÚE¦¢½ ÛĶ0‡Žl[Œ„˜ˆ ôùb§´ "e‚Ö¤%¤¡èîáo·Í‹/(úc±‰äq¹.Püõ1ªÁ€ëÃ-âz¹’Â?ÛBl¹p.6”K'Ë_6Б.Mü> ’T¥-»Œ£÷;?íß ^q ûa ýfÈ&^d¶Ÿ>Œ1 °í½@—®MtAy¨iB÷YI%‹SR“¸¥µ5´ULÖhgûL_¾¯êYSÔ9Õ¬Tù±(—ÚxJKmayÖ¬´uV>ê|Uë&³r flDñűiõѲ%úÚªÌÏÂã’–1‚²Ç‡ã`üÐuU(NîA0ˆ„h€°œE[¬¸·ç­wﯕ$©¨f®¬ZÅÐ éæ¯Þ®îWWÑæ^‰v›HŸL4]YóìÆÁÐÛ¶m†Ø‚$ì,™äŒHÓC‹˜KÕÉ¥O›ãáPÕ-y8#8ñ×hóW„…‘—¯áNz£Àöà’:>xÃõ…¹«*ÏI›UeÓ­š».¬‚E°T¬Z±Cùö¡»ëëU´½»U"ƒ %š‚)h›V‰â Õ8ú‚©ê„va+$· ‘@A³&ÂQÓ ë‡ Ñ¦2xÕ.+E'lp©•ˆ~;fßINËXVû‰3C„S{ª&Nkðdi™Ø0! ,Ó #›gâö}nZZô,drÌÛž;öŽ¿$yÎ1l"½$JõÙU D—‡PT…W„„'ImËÊ,®ª)Ö˜j?»F%†å ÛÆ{ý×}¸Ý^Ý­7_wÛ›w×›H¡.3=æ Óï!­™5 8ŠF7ô;­IÞóƒ´.D=2 îe °¡33zÑÍ+Ž•`9V‚ÜÞ¾¾»¿á׿ëîêíæf¥Ô¾­Nl?Ë^p©]*Ié4Éš^0:,;^M÷pbˆÙÁ½ ~∖íµ ð|Y¡’Âv÷`¯£œŸý˜Á44GÉ*êôÀZzÿµ•¤ —ÍÀ]aZ5ä¦!Þ±‚F× ÇùHî)'õ#(=pƒ trR>É#äsvÆAìòþŒŠLv3miF{"\Jº ©¨çIO©û&xý’‰H\‚-èSZåŠKdaŠ{ÉÝ©z^ÎÙÍöÜÏYމ¢”)ýí™n‘’8"ä„C„º‚ÂÎÓJÁÊgO0YÓ“ƒk– kÕzd!ê@\U´][WWr®«+9#ý4³'å“9kÊ#‚™"z#¥£šªÄhG)buêz­^­v¤ª´þ`ß×PµåóÖiª:ÑÂþÜĨWnH išY-´áiYµc{Þ/رÝ;ÏLÿ 蟫zmË….$€ú*”×:kÚ¬Œ[ÁCð\ék»¢ qüA]Lkþ=‰Uåš‹Ñk(YÉŠêê„N¼á`%1‚{¦v·DD0Gƒ €Ûk®…&ÓHq!±fÝwÝð—›™0a}&ÝÀ]…ízsm#VQ^†<5ŠbºQÑŒ>5ÊûeIó›¡Ò,NÛ]j©¶T4ÜmZC¯±T¢cÉN—(i~L¬ú§5iÊõ) a0BAöW êáèÎÉsÜ|y)“1ÈSŒ=Ëäín`…2qýÂóÅÄÒ°aÜ¡ñBê“´ç,® ¤MË£Ð2ŒíZÐEê5ç²%?úáOï¸ç8¼?†$Cj”äÿBü˜ç¥… endstream endobj 1318 0 obj [ 1317 0 R ] endobj 1315 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1318 0 R /Contents 1319 0 R >> endobj 1320 0 obj 2074 endobj 1322 0 obj << /Length 1323 0 R /Filter /FlateDecode >> stream xœÍksܶñ»~¿ÙîÈ4ßL§3‘,'Nì8‰Ôf3òúóë/o^Ú±ªå`°ÊBë®ÝV»c¯š}C¼Û»ø… t膡‚1–Ǥéî—ú‰‚™‚Pêç1(ÎÈM­™°ªu°]“fVeðÎÁ+ÆQknsžg#›®?ùŽðºårUg3ÈK‡É™êý#X¬×r`#9—]×m—Õqd,ëj·ë§t÷²_ê3Žü8‚ ,bÔ縭÷öæí»ïß{¨6Jy4?Íá,Ùc¦<ïõJ›D±ÂO¼§m×7¢fq8ÔÕZŒU׌¬mÅ"¼¥—뮼Aíäç#h%¬Ýîµ™·— ;nÛ‰ÌCCÖf†6ݱ93Ü¿zsÃð?[ˆÐŠFþ…xÿ-ïÿ;L„žÑ,$¼Syh_ÿeÖ³³.G £uêæ›q±f³ð #üD ²¬7ÚLÞ­þ.×ãðàŒ02Kü¤,`dˆ¿„Mìo¿{£BYiÄÓÈ,<‡®×N à¾ÔáÓgŠºŒ]/´‘ NÁaÅx©Á«7ï®Î¹æ .Ç·H09o¶8/Â{ñÑuÜ™€*39&Â<›*ƈû%LÕ[ðšÓ1gРvTÛ U£)Â5RŽ‚0b¼uÝ-´îêcÓžë3ácó~¾e/úÍpii}wïd õhxåØTí û‘‰]µ¸Qç'´ØqX†PcQLÕ¨W•ú…÷ôÛ^‚ו›[cá¶…ò: Ëí¶ZW¼uìE;l¥ë‚úРqψÑÎhØ$‘È¢sà^Nú¬ ¿ñ-EçAšC”ÍQ É{‘§Ë¥‚wÿìÁ£ǹIYª#»jg…Ã%ên‡{¨)×|UtT4|5_îb3"ð‘“i0%‰J<¶˜“µÿÈ^HÐø±¯$›{ÛwÍR“)hÜX~dvWÊê— +¢™Â¾—8®[©—io¥mÚ7è{ÙX€6È`Z?f@ÒRµikÈ,tÁvi™ŒKv\CØde3iŽFÖûcû˰ìd'Ò “ræþ—ë¨Lf:jD PÛ}¨ÊŸŽ,"ƹ!FñQÃÐÏ!ÌWb:¾…Vt4ˆãÁ$6—~üé’𪑑òB™‡BÂqÒJÎÖôÕ¥·¨eÒ5‚µ´ÝÈ—µPad3”/º¨f»©]–ãÂ/‹°,“lê#ã”+1ºCK™\Ôíˆ× t‡[›xbyÚx¢)÷hø„± !s9?ûº;T|2:¾„‘‹¦¹M¥MhÇf‚EìÉÚr7”¼&bÖk.¥é¥:|KÝB]<Õ­^¨Pá^ݺld-•ÊÔæÚv^ݵ;ˆë®EÕB(Q´'Š+}+¼‡dx^×B– FOév¬Øã-°¾þòæúëoß½þæîÌ^g±Eh+TU*CK#4V<ˆ ñ)h ëâÒ¢¬|'>ë½:zƒ%ÀÒ†j€¯X‘¸¯v{ÇR]’¹@²£Îˆ ¥û¨%"QðÖIóÂ1ùðÌÂXÏ!¼êÆýDx±;s¤òt¦'µCäFàX¢UÂvFÁP}$YHâÞ ô±‡è’Í ¨]Q[ˆü­¾TD0¿µÈ°ÞËF°ÎÄC…0;SÔØ9”ç-GU›'º¡~ê*‚ ¸qðfùøÀZuI°d¨óXƒ| o‰ú‹åðU°½ U&A9S¥ÒŠÞÕçIlC ÁÂ[yï_ -N·òŽ@ï,¦»Ñµ™‚·Ù*n9=¹7D¸{KÜÍ ÁîRýA‰Àb¶,ΰ·—¾„wÛ¥î¢p¦»¯þöV­q{pßm€8ÅN2·5¤t±$㬉™ k´±‚µ©BÔaXEš~Ýq { ™Ìˆ0ÁgpÛPºó`¹²Žü6…H¯ÙªìZ*.ŽgŠc›‰7ëäšÝÕ=)€žpýók{´I„!]‚ôq ص=WË¢‘”²|°û‰è‘I»Rï<’óÜëÃpԞѓ.di¬^º/5•¤3M©˜ ŽV½ò¨AG‰^ ÀÑ­µ±÷[)={¹S¬NÚiÚ5Ëv¥÷7TÚå@aëê DjŽÃ¨^ˆ»Õ {¨±?[Î7Èó ÊâüÑoýhCËLß,ŠÂa‡¾3Ÿw ¡?¶­)ã5ï"R´¨£'9¶GÜ5ýú ßI6^ñ!Ôº™ÙXºùR ygÑÓv:–´0ûâÊÀlâ®E9'¸Ó‰FéµI+)íô¶@øðÌŸ|Þùo¸Im© endstream endobj 1321 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1322 0 R >> endobj 1323 0 obj 3337 endobj 1325 0 obj << /Length 1326 0 R /Filter /FlateDecode >> stream xœÍ]sÛ6òÝ¿o—t†âWgî!µ“Æi§‰ÓÎMݹ(Hâ…"‚´£þúÛÅHJš>õ.ŽG» `±Ø/ìBþz0~^àGš‡¬Ø]|Õ´€¥!‹MФ^âglÇ4’Å«pâÄ)ŒUÏ&dË~»¨/|öãÅïÀ¤ó½˜=]ø3æÄæÓÅ/°yœxQ’åy®e ½ Ëp‹ÈK(vìåÍ.dךm¤GFþÿ\zW¢(ÿ$òÙæâ‡û‹—obøì~m] ¼,5'Ñ‚e^æø/d÷;öû³OÙ‰»å5߈¨»ç°ûw¯ïõåE!üO=åJ£xáG7è– ¿ /"P¼0†ÃàP¥-«?qÀ€±Ò}žÔŒfå,žÚI©ìïÜüŒIpaà{ÙÈ¡ï;ê;Øß¬µ™!qïÓçtêY÷[Áž3`ùÌ[òâK¿×غ¬Ì@Ák - i˜Ö5øÈòO6ëÙèwÞŠwÜÙÄÓð½3¥j–òœ›¶yš Å£hyeÈ/söHû¦åíŒè*'ô'ÚÁÝ%+ZÁ;±b¼cx®Ü GãìÓÛÏ÷×w¿½g((G|íA‚²fJ NÿΓE[î;¦ŽÂë•¢’”HŽ—o"$#sùl‘z~€ ¾jêêÀ®aù’K!Íê™±}tß Oó<ócZý Tð"J¼Œ=3Ë’¹x~–ù¾Í×£¸ßŸÜ0LhzžÇó¥vç$¯šK¨-¢\LÃ;¾r°Ö} ìE»ã5dÃêpi©Mká²û Û4{QƒuœËù¦ž%Ý7®„_FäåYiÍy]N‚2œh 9í[¬íàh¼êçe ÇÔÚϧÚÏ!²}Ð} 9bÆÏlýÏ®íÅIir†‡qr¾Z¶´sŸ'Œ3/Àò4óòôáÊ3þ…‹3(š Q £ko¦ÙÀ¼8‚J“ŒÞ(—€Ë6÷æ•l,¶o¤,—*õhJ猢Ç8+-X7à‘•Å]'Г-GÎE¤7ä½zËm)/]Ôác¼ÃR´²t¦–uQõ+òpC9ÁõóÇŸS®G³æº â‰n×e+;V4u-Š®ljã%g샡‘ÄÀ# † ©U…þB…°t^7À¯u(Í^md O۲غKªªyryܾ¾½ûø/‡²a–wƒ,]ažÚ²8ýÒÑwÛ6# ØI–²+ë»ÇÖå[ly½ÉÀ»¹®ÙDWæþAŠáîÂkNé‹A7„:#Ìó¨î4CA±„„#ئ!C¡t4ŒSZÒØé|€åm9„ºcÿý×2T”Å'¸XŒFQAðÒJ­’Ø\É?a«\!p…àÓÇ\xi‚)BbÎí¯¤½Üö‚8?Âa@×EÔ¹”&ì.íÄv¬ؤ0gB)áì>ös˜|\‹CZ(Ú}õnÊ}çFJÉR`M/ꝨØöu±Æ÷ûª„bCå!!;ÉÈ3Ðàú È.Y±ëï”FŠNç(ŸŠr?È“€µ*ϲIúboœ¹®°®n®/ÙŠxQTð}UÉ—eUvÃ}s¼d ÃØ ¢…æøöò~úEåeH¸){z¾EààÒb:«"ùÎÁöŽLq'0ó”rgIÜa÷ˆk(»bøÒb:ñ¢ˆÆJ¬±;^;D [ª{UU¹&ß»"ÍÊÁ¶\άFéDASp·Jǘ™á¨‡Šã] œŠr)!i=ÁغüÖÙAðVBA>#Ôà ð®/7UÏï,,mIšg©Ÿ¸w‡ßuߪ Ê=,6–a8ç—æ^æCW亸y78ÒÌæÝ¢èâU–pâ¦ø‚žo­ „‚v†¢Mi>e¿G ±]_u`9L¿Øá…r~ä=ˆâ"pz‹ŠÇ Ï <›÷ªªµ}hOy+ªÎÏn-ÕÞª^üOBi*ªF‚öȲˆÀnQžÅÉYQ¦ÓîuåD¥.$9QW¼Ý€8àPK46Z»ó@‰Ì$ØÈ-ò³ÛÎæá¾ïoît¿ª<‚Aæym¡VŒï‰}_ ”Õ Oú÷ %Š®Œ©ÆÀ¦ª%¢ÔcÐq ú~ ›šñÈ$Ë kAa§éw$-L3€W¯®Þ¾¾¶#|éÈ£.3ÃaNö ¥8žhI=ýnqŽ-½ÂÈs_Lv§›a;&Œ\Ž`°†¥+­ªºŸ%`°…ån:qÂÈ V©`hA*² ¦+BBd³³#Ìíš‘ÅìôvLâ—{”¹#&éD_TʑDž‰g_ ÏySVȲ_¯áfp¾¦Ë`Xv'­…àuOL¸¿DЕ¹æj™4íÞ6½Jš¤;VÂJ»ÊÉVøÆJ÷©¯tú#•ÛB®nt¼¼HpéF 09‰1\1_`óö‚íg°›Ú@²§ç„EýXB:WÊ¥!–Ã6VŽÎMªHŸ|"vsÎJBè^ýôáîæýý\ y0ÑÂõë7_ý¨{ ÷^´$}ƒb;+¼Î î4Q° =±³-oÇÓGÜÜŠ‚(%Ôó+qjsÛÖöŽ?r‹A1¦s¦& ÍÙ“ˆ˜3Åþ4›«dð™"LÒúý® l—›õš•k­>lÈÛù¯1â.ì:¦8[蛢kveQâ³ÒD=Õ…€ÜȦRf¸d×};ê™öËqyIºðƒ Œ&œÕy¡?Ç.—S¹C(·`×Â/»+¢(ŸŽ³Üyà#‚z¼3æ%¶Ú^ Aó^Z´q8C¬B¬t;¬H£vŸÄ©%^ÒŽüó.›c…Ê~¬›UߢœN ˆžª.zè#¡‹îè{-]Ý©flžRâ,õ|?Íó8Ñ0Ž Q¦…8JW4qlÊo„1ûãYìD]¨#,¾M±iÜ´úäŠRÀÎ`DÕ• ,ZáìûÄvHÔd ]w)Š«ï3+æýDÊD æ\þ\,ß ÁÎ@ÎÖŠ\Zؤh„uŠV<°+6H_k1u½rJ†‡gÐE@1VöÃ(5©Lz„ÏÃó™pÀ‰Ìú;Ó¹÷$QèE ú2G?˜˜Çc±„:aêPW…µfQo ký5‘Ìëa‚¦®5Ïâ®KèùÚ œ-æ2CaÕ˜*×ÈíH:, Gȶ¯ŽxU²XL´3ùŠ‹ÙwÍJTìáÙí¯WW ÒÊÏwW?}zxîþ6ä¿j Ü endstream endobj 1324 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1325 0 R >> endobj 1326 0 obj 2863 endobj 1328 0 obj << /Length 1329 0 R /Filter /FlateDecode >> stream xœÍZÝsÜ6÷_Á™{hÒqh}tnnƉ“žÓ¤ikç:¦\-½«F+m$m÷¯? Eèc7~ê]ÚL@~÷Ó™Ï<øï™ú'ÍVìÎ>žÏÒ€…‰aÅ óSžxÛ1CdqÆ*5pÔTCL3Ô\3‰-ûõ¬>óØ÷g¿ÿƒÖÌã1»?ófÂQÌÍÙÏ {ykÖ¨è( àÿ”ëPuÄ‘7î!a6ðþF:ªƒÀ@CF4ëÙŠ~æÊ$›¸R‰ÛT̬E/X'î$„å}ÙoPvóÕ¦sv]³}«b±çl'ê†J;&ZÉ6²–-Œ{`ê *û-øTì!ís´ÇÃBçùyâ³v*d~6©P¹WkésQ|T[þ~Ï®ÀÒ•*/ Q5›ÎÊÝ,W;?P˜*Íó4ŠPFxi¿Zi–!ëMY;²Ÿõî!Õ“™v§‘*šºea‰, ÷ùDíjKè£kÆD;ɸÌ6Á>Ómýº¹w]½øHìÛW¢| ¯{'âÐ7;¡c5/„~N¼×Ê¢ù,[,¤A¨ é]Ûì‰ÅÅ«ºiwxÐ ²Ò®¬Åì¬5¡ö5¼$Ucr›¡Œ-isÀâXçCË)©àfÑKµ×òKO…Aℾ®­¶\K1¯•~Oœ[aëu ÃîsÙ6µ‚õç–Kj¥%zJ õªU7¶õîÆ¶4¤ØÌ¡Úw¢¬ }«Ãf„EDÏoÖnˆì ¾hÃ}s¨Öƒ 97¨–rèoåæP‰v)ÀâtâÌÅpj¡º®àÜöŽ®iO.w¬Û­qŒ?”vÓVh¡w$Uщ‡sÒƒqƒÄ ›Pn×ÞBI'gÒJh›Bî$ƒt•®Õá›ÑJÐ%çþJò‰¿V&7>eIÊsöDû ›&î»Qº¦Ž[ÃUÐXÔ…8û¦*‹7v¹MãCëÔ†í®i{'U×BlîÊN¬*õ¸\dªÂäÄŽºqüC½–-™âF©4Û6Õ’::ÌÆÆÜ{Ù´àó…è<ð¼4ŠiÙxwè!÷¨¶÷ªi °n“”£I@pe‡p\шT Ã[µ0*U+„[8¡<¡z¤3¥;g@júƒeèJ>Ÿ#k…Ÿ¹ÝÁ™-.zäâU>-©aÂtîŸo9D7‘¾”<«ÇQ/N>?ª¶ÂgªÞW“-Ì:g*™3XãZBµ® ?• ÕÈÏesèX±{8‹ÝB0ÖO£Äós¤÷Ë4Ve4;ˆQqç£@;T8ÂÁÝÆ¶Ks¦÷ Q gˆ «Ê®ÙÁ.WdÞñ-õ'1¬ŽÅl±¼íQO‡‘wbªÓ§äkvÄ1|?ÏÒpÙ ¾ùë¸%€N;x«-¶pŸãŽÇ|¾ÿQ>GêRÀuÚkG˜b¨Û¦d˜JˆÝ®-ˆŒǰ÷LC–õâ´×WÏ_8ª“]g`•™uçÚ¶X!!ÚìM£Ì®iÈ`FVçÚí¡V`÷ÜqpƒM»iû3ñÇþ4‹V©ú 6+S…ÖŒ-Û•تÊm$À"™¦Œ,ç^œy~h?༺H¾«µŠçzÿާ)O}ÈãYy^˜û&ÿëCæGªÀ¨ýwF¶…k9†Yʹã4+ukXœm7ÖLmêZº¯k8Ø æ+{w‹‚Žž¶ ͸ç%y–ÅáÂzŸ_¾øáýOJN+l{uy{ùüòæåñ¨.˜INOÒyt1C¨ãɪ «rG]“ž²Ÿd ƒh¢f×tîrÓ•»=¹K©£xΖ.eÎ$7R89+Y5÷u_’«Ý –oz£Ë¥p2rs³YÉãÉ®^@~ó’…u5=Bå=1-^>ua™/̦&³L ;øðIÜã9¤âT}©ÎÓ Ž`1겯Ìe™E)2rÀÀ»³OÐ Ð@õGØ¿´Y•bQ˾ŸÛO “Ï胎4œé0,ûæ5S>Œ…jàe*¹X{¢ŒÇ#Æã R"ƒ5ÁDÏÈ&×±c¸":TWå©E”ñÁø,4*¬ÖeÍ™ê¶ÖÐ ›îÏÔº¯3õŽaM3¼xälú9)Œ"ž¤qžGYj¢™ìf“»}Çþéðs ¨ú_ìù›w/~¸þñûSe.a (3‡k.¹&)M½Ét¢ð$õÔû‚¿ ‚âx¤ì9j¤ñpOžDÉ‚°AÆî #Rç:l›[bhu•è_gl®á"9ëP’îÒ‰ÖIn*lXÒ¹ë$&ôÄi÷Û¦rT×·XC±rÃt13l>EòÓ¡éåBáH󉣪ò£d]ó;“!Œ<õ'[˜ÿMwXÁ2/jÙõr­ZßÝ2õE(I`û3?]5¿@UåaÃ)JMßH|rò ´CÂ~½Bªs°övmÈ›^ôú9¹s<û`¥ ¼+‘ÞáÛù‚nRÚÍ`J”TI³×rtIfd¶­ÈÔ¦¹×üpâµVªÞ*¢ÃÊ} FFp¹ITUð ‚`äÝÝ#qd”D< Ã<÷¢l„#Cý cq¤¦ ŽÔmóYQ·£m`Œ€dHÞ}FÝŽaNUJ†–DÖŽ²®LŸŠîèßšƒ# 2À^² ×|->Šb@ÍÐǬ§ìˆºëzÜ5ßé4™¸Y~ ûiÅä“pl?ÛÛNì¾ë¦Êµk7rU›/,1ùJ=c_à¦jTBpÔ€“Ö-ìî”Séê©5oUã¸n /]ó˜0.ñÔkY6ñš~´Ñw/eùÙ]¼J™L"<tî¥P¾ƒÀ`É—èzî>9+Ìt>*ÆÀ?ô Ú/BEÕa¿Å(„…¸‡ÈÐÐcD?©ñI2ÓaXcX¶dO(eaq¸ÇQ7Å™‚€j™b¸¹AÊc+ê1Þ€Ái’å!=ƒSÝtK¦;02ç1HpäÃyà ŒC€žc}‹ØŸ*)=+ölÛ}ªÖ+þ§hYÓn¸!«r¥ïUW+½Ïž©ÃhÎÇ…;ZLõ Ì'ÊA§<2/HCózxåìæŸ¼­s/ñö¤Ì :=‚AeZä,1Odº-\Óf¤ö¿0#Õ7¤½}Ôª¼œû€×,ȬùöäR‚ðäd§áÌ×L‰¸Æàa¾#¦œ¼`{Ìò,ã“ÖŒ=H}¶"ü¢•ÂþV*t¿ßÁöCsh Ägùs²yõúÄ×õXå‘‘¥ å4X˜ :£pøiHD ¶¡H˜Ð1£šÅ É,0 S¥‘ø€ÎB¢£=wp§A4Œ´p†’)Çoa¨ :ìq-¬_?Y·|xšüöøEŸäŒÇŸuÍOœù“9 šè†ïyÓá8¬ûú‡½dÇ/£TÖâ>L’¹ÊçßO'±¾ÊB: ҅ɧÐuâAæð‘f^è€þˆâëÀ:Ñ¿@ƒK}]“F9~k­Q•ˆ‘²/a¹}Q´—䘧¹Ü~ç5t8U´Žps9¹FêDÆo‡‘çP}ç‹°•æxÒù'æ“uØ|azè¯å~@dÝ2Àsë±´Ñ[¸¨çü‰þ-5ó'ñåèØW¥z˜ïuÕe{ñ…U ÛÁ>h˜Ï†‡´ï|¯F}xz>úÕóàŸ endstream endobj 1327 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1328 0 R >> endobj 1329 0 obj 3389 endobj 1331 0 obj << /Length 1332 0 R /Filter /FlateDecode >> stream xœÍZY“Û6~Ÿ_Ê‹í¬æ}xmWùÊáµ³{’”+N¥ ’hS¤LR3Öþúm q‘”äñ>d×IÊè&Ð7 |ºð‰ÿ\Š¿Ò< Åöâ“âù$ H˜(Vœ?¥‰—‘-QDg¤GC1E CÉU³‘Øß.š |ñû0©$ÉÍ…7ŽbÞ^ü ÊㄆI–ç¹²5 ~– !M`PlÉý·yÞÊÙÚz!ÈûŸ[ïZúÁÿEY_<½º¸ÿ]L|\­l ¤>ÍBsF$£a‹?¹Ú’ßï¾=ôߒ׬ak¾åÍpïrõòâÅ•òQ UÀ¿)•¥4úGÞø‹Sf†o¹ð_DCä‡18#>Õ*³êoñAc)üûdd”(gñ4O2d¥ò3) }f£d^à„\`qÔf‰º?)‹\<áŒ$üQμøÌ¶»šß§!%¯ª~¨š5aä)+>îwä¦6äù)ãµGóÈ÷SaLžq”ƒún}(b/!Qê ‰ é8Y—>8ßBø¶%Q’[²¤^W+ăƞŸ'þ4*Zfd R·®‘"=' iîÅyž)Õ@G.}KõBX0Œ¥»FXþ–HË݉àôÔ —¾E`z+ñF¡âhC&j•& nä'}Ñ7HNã`Š2'Ù¤&ƒœF¹è|Q†5IÈvÍÈe±#›þS].éÖ‘¶[SEÖÕ’¬£º0Éåe •K€WVÝý¥dŠX±Gv¶G¢Œf~&!j}×îÉ=rG4"w ÖX‚Õ}k©uuÍ-Õñõ¾ë ƒÞu¼ï«¶é ƒg9oJK´«³Šv»eî̺jœÏ•³îàzÁ:gVÛÔgM3p°sà¥Ë³ã¾Ýò[X¶ªjŽAvB›x“ÐÂÕU\Æj3Ôšp¬ä!¡Rg?µwçb$ÍÊÞù¨¼E¢ã¬v)“%d8YZXnÓ:Òû ¯ëº].Eo4œ †#X'8V™@â¦Ý×¥%÷®ÝºHói‘FI0%…; `J =ŠpÊßú¢«vÃÉâ‚ù2´dˆbCt² 4…»ªoPÞ7 "tÊÜÀƒ~"ö1`—¹‚o¿`T…gVϽΡ?A§ƒÀŒ¶o;Û GœÚ/ÈP§¦¶°š¡·,ö#S±8-]5£‰Uçèl†ªãÃÁYìŒÅÆk;UL'-,ƒõ®;»š?åIC,±j뺽E³ðù^<Ž_Ï‹¶ÃB#€6wmǺ† _Úî@uêBâ'SXú4 AZ)qoŒ‹KœéÅ~ §…ïåy¬‘M¹IN[SÀ”EG–ËÔ—zñ‘å¤ml_8sv¼cõˆÀu'– "…™äàdÁV·k²êÚ-ª‘iŽA±4¥/üS,Q2àW£1?ËiŠø8"ßü®aƒÃB âȸ`Dß™ˆùQ>Ó¡XctÄÑT²RåkxŒÐe|…A £ÍÔ=#ôh?hÄäNU}/Æ©”· ´Â»ºÊ C©@BwtÃAì- º¥–ÔHUKbŽÜ“ô“LìV8ˆÂ¹©çèçg–ZÕýŽÕªr gvhgY¢ð–gN»ÿªYjÉz‡jØ–;»Ú̯AäÑ1RhQ`Œ„äHÈÚÅaÅ‹W=On$Ð` ¬8yvÛUFÍ×àñr‰÷j—(›ª°Jý+ë˜Üs»žYKJ.àñòËÆÀµ¥à%BG-Q·÷÷Øðð9 ;<à Øfwn¨» B–Ä©MÑv"ˆÏ!§"q½–·>ÑisÀ~æù~¤düp¼ôöçW"ÇA(«o¿‰è9Üè1¬R+¤–§ÌÇa¼»® îS÷($Ta"ñR9†z&dµëŽí6GÇg@þ榎¼÷w_>{ñþže¨Fhôõ³š ½paIQíààéáþÔéÁ_Y”âÓË7/(1±ª†ž×+R¶à˜¸_‰ à{š)\»‹¶äó{PD∖z¯6,/@èZ¾÷šÆë±VÍu[_Ë(Z°[°¾$£ŠÝœHΖCs0b0Trø‘¨?Ñ ÉÂHn¡…CÓjÓ¢EÖnˆÇªZï·Š«#i€®¢Q•â]O䡅ƒ1=èu“”Þ¾>¾Oõ¾”•æÛ7 9DåMq:½4ÚcB+C'Ÿ%||?è@ÖEB5ë‰ùÖµ×à„S3eµ¯kãÖ§=«¥ÇóÀD™ LQ³ÊLøÆÛ:%Z!%O$€ÂŽ‹7$DZ#¸I—P[ðƒwîN¦P˜PÁ)ÊŸ‰.-/4”'E!`$EæÍç  s > ‡c-ì73ÒÕ% } õ‰Û~î<­Û›UÕoîX t¸Ç%‰.©_.¤$}3ôõ©n×ÞI¼ˆ%¾gY^²$ƒd¹ ã4÷XÇSÜ9âhšŽ½j‰Ê#" ¶X…ê_Þ¼"Kf‹SSäüÁÉûÈÎSš§iž'Zø‡rY<À§â~ñàa9:ű—O‹*}üwYBf}É[5u€ý÷h©"}æ¬C&^žgqh0&…Ö•2À&'Àum›œÜ2ð¯m‘ò7¨уEÜÌf­ù ž>'Œ”y bŸУ½(Ì'׎›¶ûØ#Îݦ?l_uU¡A޼”oÙ²Eà~PÕl ×9ùb+qù¯¯¨ÿ_FˆÑ¿E¨ê‰ê2OÖ!^ú%¡~Ž’ãÑ¥GrÂt–Ú1ÅŸJ–! Â!í¨©±r©º[ë¨!]ÃaÞ²M´¦Y¾úAì„FäP¥íHø²ðHøLé`É[ Ýž Ï ;¶d K(Í2Gh·°÷ö„’¥Yy~˜¨+ÙÛaÏà®'ªJB°þLÝ'p°…!Üéµþ{Ù$åãC. ¼–¡0=pÃ%h½§õ¼N@ÀÌ­™¨nû0êñª!§kEúe#ת+›*ú‡ö†_ãMKÊikøüW[q¹.«ÎrÙV«u £nÀŸ‘Zž¶HÃh,¥Œ5ßyüÓ¾‚sFH†WÔœuÿì°\Ïë·‘Ð×/^ÿóÍ;G‰ØÒø“¬ÑêúÅã¦u©ó±à£ÿµê?kE 4 endstream endobj 1330 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1331 0 R >> endobj 1332 0 obj 3024 endobj 1334 0 obj << /Length 1335 0 R /Filter /FlateDecode >> stream xœÍYKsÜ8¾ûWð˜TÙŠÞRïͱ;“¤’xgÜ5s˜Ì-±»5–ÄŽ¶ûß/Hð%©íJÕVÍne| ‚€ô‹€øð÷JüÈV!)š‹Š,$QªXIJ‚ÌKýœ4D<ÉI-NH1D‘‘äªÑä‹öÂ'¿\üù *‰ï%äéÂ_G1÷¿ÂâIêEi¾Z­”®¡ä¹X"òR І¼ûÔ„ä–ËÑZ{!ÈÿŸkïjáÿF>Ù_¼ß\¼ûÀ'› ,ðòÌœF1ɽ(\‰?!Ù4äÏ7÷§~` ùJ[ºg k‡·‘Íç‹õFíQ Q¿̓¡4ùÄþô‹f†o¹ð?ö"äÇ ØŒøT+ϪŸâƒ&i)üù¢e”(gòÜOÒdÿä⯸DL |/Ÿ8#ô#ÇüÓû‡­¶p¤Xûåýø‹À8yK®â•“7ÃYÐ+-ä;K߯¿¬o6ÎÐ2(ûKËÜŽƒ%¨EŶ{vn¾åÑÎPó'Öy–ñG5,º¹¾ù¸¾uöA·5suùÙѺFÇ: ý™Åm«ž(ÕpÚ» Ò™ÅãÔËóÜ÷ýx¥Î2+Æ®N䆷}U²ŽPZħ¥+o? f"@õ0¼Œ:æ|ØñÎA¬-ºÓq@ (žðΖöÌu Ì[ÆZwFÕcßO¤ÐÁ5k÷è"ŨÜéïýrû~)4w˜ûŽÇÞ[x$fÖ¸e¬æGá1=нøœÑÆ¢†5[Öõ–¡÷‡¨à˜ûQóÔ‘¦Ì¦D^åˆk¹3˜Zò »`CyC ¬k zǧJ(jïY¼90WP ¡Wµû…}VÑÌ>UßàÜþÀǺ$[Fúî¬Z8ü´(øØÿZH ‚Ä Dàgn¤˜ïa˜Ì†çÆ­Ý |_œ¬]Ucx)¬Ž·B«!lÁ‰'‡ÙÓ;H¡£mäÝpé0UÆÑˆtì] “0W<85ˆnh{š¨vdtº—GZÓÍ´îç'Þ•ýåCA‘ŠA***¹` ·>´ü©µpàà©Þâ~,QçËÍoëëÍúÒ2>}»_ÿ¶ql(<n;F ~œÅ0¾ÔèIÄ#s¥ZÛ’Ú°–ÓPgK[çC_5Çšug¬­¼@Dm -%V&¨þ-ÚD„Ð2)äg1/È£WÃt1î®E»§¹H6jïL´"TÁŠÀ$ÐKËS§ÿŒ$È;¼s–©èß<‹ÿ͵ Ô÷ 2"HKÇq`Ý\ž³ôÓt}aq×/J¼³+~dí¹0Í™¡ž*HSìùÈA’/ÎŒ,ëeÎ8RQ"B>ÏòW³÷ñtdT ¡nîåZsI Å èùØhQ‰ïyÃxË ~:pC¨¢ %醕  V¸°¿2¯Äê KZåäªáeµ«˜öUG!T~wV…cÇ÷,õK;…~2³Se¬'”ìFðQQ3Ú ìy 娅{`/¶àk?-[œ0õ2!6ɔˡÒt J#NìY †HXl·c…ÈÙ„‹sôtŸˆ Y Ì «Ë å…õ= –‘#D07GjèF¸Ô”*l|l‚ý`•¤Ûc/•Ï¡0Ú·‚»h¨»±¯¼­Þ‰Ct«Ãýî8í©D?|¶¯ ³ÜË Ö¥z3#ƒDDä°WCBc^Þ‰ á¨EóÑþ… p|Y×Òš˜ø-è‘n«º*ðÔ~Z–W ôµ†1/‡y¶ZÅ‘òòúY‰½×½'ù"–%v÷¯tQˆMž&™jQ¶"ßËDÇ&ZÜXÃZ&=Gï0N|tæ.ö\Þ9 Ñ8WýP®ºå£«{†6H×[;nÏáºB±*Wp?Eƒ0‘´=-b?Šý™qtÌàê5³òÎk‹>_U%RÂïo>ÓGjñõñXW5uT2•Û¾¿õ^”ƒ{AúBjªM¬[^ܲ¨3c²‡{™"?ðnï0!áü x^À I83È߬@Õ2¿GÙKSóL 7ÖÄAeiȯ 잊²Qþ|‚¬ d#:gÕ~’í0ëÕk{<ÏŸÚÿ& Çé< ãu.}±.õé k¬j0õײz¬Ê‘Ö†Õÿ°tÍ÷†ÆûeàôóÁ¼GGž§ÀvèjûÅãIi° ¥@½ÕÕ|«Q”y¾ŸúTò3»¾_‹—£(Ièözsýþú~mëß×ßìç/w¿,!Ÿçk]âTÎ_^tC’xqšˆæ69#IöÆs²/5§d}ÑU[ŒpÁÀ+£ †ƒjªù°>T |m¾¨›>N`št‹Ýda;¯3ƒÁË{}ë@1ö›UÅ Ôi1hÄÛ¥)WóL/ŸÆOÄ5|b&aaæ»ÖAf)ÔË1‚Á•#ö• xYA…³3»Æ . ÄK†Sã5KWyÏÕù4 gb_¯ìѹ)°FœOzõKÃrKzœ›_QÄêM†§ª#cã~5'¡<^Hê1òí$èZO@mݵèg£äÃÀÓÉmR9Öü$7·´bÏLù©D_ ±&^ŽZ¨ï{.ÔìXÁ»Rd¦rùâM~ßüÌê' endstream endobj 1333 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1334 0 R >> endobj 1335 0 obj 2581 endobj 1337 0 obj << /Type /Annot /Subtype /Link /Rect [ 443.613 209.34 508.553 218.34 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 577 0 R /H /I >> endobj 1339 0 obj << /Length 1340 0 R /Filter /FlateDecode >> stream xœÍk“ã¶íûþ ~k2³§ÈÖÓ÷î6M:É\’u§íd2Z¦m5’è“äÝs}A$!K{m¦3iï1 €$‚ Ô~¼[‰þ¾1?ŠÍZTíÝG¢­D±IN¤,«"ÊãR´‚2+Ec&N@3…ÀÄRi6"'ñ—»î.¼ûù˜´q”‰—»xÆÙ<Ýý³ÔëÆõÂ’¡:©Ö ©z%ÇZwó¥£vúT•œ¢ÃÓ+B—®2‹Ý îðܘ=ÖñAPá$ц³Oþ¦/nHvíëAî·d<ÕÐûÒ»»O4u[{ÀnÅÃYUõÁêï5PŽ£ìöµj<éýàôÚ©A±½×Ͻ>ö²5‚½ÎŒ‘¬£$‰ãxU&h P{wä BŠÃð9«~¼Š—“êÄÌfïG3AõϪfœ³4Jccå2CÎß@§R ;?D­1dæ ‚;]Dùù"¥ ì´Õþ>06Ê2ÄzîkŒÚË0zdfV0©Þ«^íƒþaÕÙXÁ!úÀ¥y˜]Z„§2³YžGé N#És´™q¸Õ¯ üG#;s6Õ¥¯á(|ÄNÁ€uW5—Á\›ºFxð噘²ŒR“Ý‹2ç!áM’D D`ÁMÑî4›ê‚†CH±‚°‘1ðÎ@ø¡nCõe4ægk'ÊÓ:JÝ«jÔý5 4º.¯äcÍ´Ü>þuËäš[?³%×1}é+%ì6"a"ˆ¹¢.IoöaÆÍµ Õ†Ãÿâ¾­Öë(ËÍ…Ë7üT‹$JŪ«úë™Â*’¬³"Ȭˆ£|Õö<ÁãFø2ÖMÍVïôc ç›ár>7µ½8H­;0p+'z É_UóWuµa1:IDõ¬š¥ý¸+27R’FY7¬H(ø;çaƱ ÷4­VFÿA˜ûw†{ô¢{¾svP(ç)˜<™˜<5‰¨î1œ„Œn”F>Sq¾ûÚ—oóß)<·#´S;º£„UkèµýféLìlÎÝ)ŽàÆ&3#"MT®\vÄŽ‰•c€½%3м‰¼Lç`Äwlõl·¨šã{X¸ ëu~cCW›¨t1a µÓa!╤y6@!¼ ³Žõ³½¹ˆŒ1úm`Ä8aŒø \ßýôø°}üûÓ»o¿Ÿò¿÷ØË©®N³å×àÑ:õÜrI¹è}ÂtÖÇ©û˜T숶P Öç&ÌÅŽú{‘šQõø¤èë½'»^‹…D(*Ìg¡m¦CCÄ5>žjÎדf‹»‚yuPAïþsÁŲøÆP†‡˜ÖG…oZÎ}ý •ÓŒÆ J<] ît÷ÆlÈ: úêëòåMϾ.Êh•¦G-PäÃÅݵ}§»˜8 mA:.éqi‰…É1iiýd`ˆKHˆµª:É®ÚÉ „îœ4DYŹÔ†Hû‹¨Kœ4ÑWæ‹ÊLÒ#­àš€ûG ýÐU“©¯oÞCdžªqSºbwù&M™vˆöº¯ÿé¹#yb@$¡¹v©‹ê{³’»ìn3Rœ·-khZÕºº4²ŸÈgmÈÆ<û'q§¶quXœ â¾$Ê‚åq`ê]H#gDdRi-1‹ØÈ£Dëê=m/Ë!çæs ÅW„±TG˜‘•éÇnƒ'’yèDŠ1±’{[ÿGOØMû"Ob€–Úë??Ë|}c eiµÑAq@h!EÄB@p£ŒO¥Û]ÝÉézŒ$˜%O¤\ºúã…áÆ÷ïÙ0¥“ÅAj\áI‹¶¢ÙRâç&+Ò“1ç61¦°OèåQ ¸Ôk‘I-ø»DAÏa~F”^áËåH¿QvpÆfäò‰˜n_ã®v˜vm8~ãn¿öydÕ|?¡)voö 3Mm /\Æ…Ï1=¦Çë„_øÔ—Sò¯¿ˆ2ã§Kõ‘!ÒK!Õ"i(hÒP­¤¾Ä3ÐÃwÛÇŸþó“Íû9"“R³µ7ûJŠU”¯’8γÍÂ_[mº  Y¾ZXôà?ú˜Þ–÷/žCjžgC¹Éþc©i’GYªnâäõEËΣ󧿾ƫ (Ú±+o"y–°›rS1¥%S6Á íj[hØ#ø`ŒøéýÛïŸëãrbÈòW )hÓòP®) ïÚê^1¢`ÇP|tw˜¶ |Ò2!IuGW‡!¢“ã7}rBÕ`?r¹\ǽyŠ×gãf|•ìjœlFŽ·ÚίTŠ&§?>û&+óºÿá™>%YÌ}²ÈUÉÞV6~>î¬ð›„<²É OAí‚´#Szxäª=Y dÇï¬ûq2ÞÒé ¦wC…ˆ‰°»‡eéÎEæoëY %×…dæûÔI>+CbvàNÙç¥ ?­}²ÛµHíÉhB úWw‹Ñ›{äð‡fÐ÷a^lñuU†%ñ/} ,ˆÕ 0†O#˜Wö^a46‚ϺÞÏ lSzÛžc/ÏÉ¥½Pæ³öÅ´ñue‚ºù*^e4Cèßö*Ï£|n~ib 4T›ÙÎ˰g„éØñŸò}OEÕ5ˆôª‘Ÿ<U€ýb†O4]³•ÌÌ…{ÀB:´wfÆÀ}°uÒx„sTJ6ÄiñÊæô{Á>Öx d¡ñAwоþê.J¨" XQ°K ,U=uu‰ÿªs³bÒ‹%X ~”¬_Ó'åÂu*lõÞœqj:øéqëÀ÷Û‡·Oóm§éͶGø„;ˆ½ª¾Þ…¦ßŒ¿cgúä|a ZOð ñ$aÑ/}ý «¾ö endstream endobj 1338 0 obj [ 1337 0 R ] endobj 1336 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1338 0 R /Contents 1339 0 R >> endobj 1340 0 obj 3019 endobj 1342 0 obj << /Length 1343 0 R /Filter /FlateDecode >> stream xœÍZëoÜ8ÿž¿Bß6×ïP0I&ÝÒn›™ìm±ÝÎŒ’1ÖcOmO³ƒ»ûßeI~ÞÝ—½ë!i™¢Hê'Rη3‡Ùð÷D‰Ë6û³oRæ°Èe^(EAÈœÈ í˜í™dâ f9ì8D’žÊÑÄìØßΊ3›½?ûõ7´e¶°×3{ œÔ¬Î>ÃäAhyaœ$‰´Õµœ8Æ)<+b³goïö.»)ÅèÖzTdÿÏ­7-ò÷ÿÀ"›½œ]­ÏÞÞ̱ÙúY§@äX±n=ŸÅ–ç&øÇeë=ûõ|uª¾gÒ"}á{^4o~c뿞-×rBÈ"þE–H¥ÎƒÀ·»OŒ4Sr-…ÿ¾å‘ $–ÀbðQ.#+⃖ „§èç¤g¤*ãå~œ„ËþÌÉgB‚/:¶w‚áÚ¡áþn‚ýÉ^çž^=H¬õ޳7̇­ÌÎWŸï5ݤÅ6­¶J°KkEó?2HGý¬ÎŠVã$q¢Ð2ªâ‰óÂÐw€q†Âò;¯Ó&žxZi%™VQsx%Í_ñïY•Em)Ñ"¯Ë‹Q­¿\þtàÅÔð•k÷œUø&{Î6iš.gËŸ³ OYqÜ?Ñå3C7>‹ ªÙë.ÛìXZq–í¹Ø»0þéÄöeݰ‡›«+k0³ïZAÚ¶F4ó2%oØeàËÎÅ[š­‡CY5µ–¤Ûm†Ó ‡H™6I‰š]Ú/U\3Ei<Ù`iú±îÌY\¶ . üžKêSѤàÛa,ÖWVš©å¤Ä•ȦÍ)¼—‹´áùéBKETw(Ç<5ô*óåóªÜ7äy’ìÒïÆÄYшä;’=ñ¦á†ÊM¹?€qOYž5'-~ÍšÝÀ aØs‚t>¤±×Ù³R"6ˆ¤ahVi¶âHEÍC„Å~¹Ð¢§cÓy½2æJM¦n²<7Xé|â05S½:iX]9Eƒ?ž F@R‚9¾áuÇSo«và¦(¦cGªZ ëêR‚¿d¼¼îØ€ø¡û>pèý¯®ô†9cãèo/ÐLkxQg"HRóFÑ-iîK’l$üG‹&š$ií %!ÓóÃ$^H%˜ŠcÄEP-v]´OOLÖ÷P渱mI<ëùÁ¸›²!%4q(?*Üö øB »I Í</K¤§}K¢Ò*‘˜Ç‡{cT¥iqÜIZ¦¶ÔÞ@êáI`šVñœàLšV€hû”NÖvÞr†Õ8l¢«ü¨ç*…²ÚBì@[šçå+3— <ª²”ÖuöRki8_þ‰óË ËK ˜œd6Žƒq+yÄÂÒìœÖqD+È'¶œ$Ý—[ÄÑ'Ð!ºRL‘î 2íå;•&ó˜k-OÚ‰‚Ä胄ø)¿%Ž"pya8ë·Á¸ÇšW—m5‚‡HhE´¨Z³´^ɨí}¡ePÇåÇ-‚¤~çå¥â/¯óo¶~V3ºVhNÓMÆXY’H{ ãMgKÑSú,Ú¼žkD èà†Œ‡]®Š6p`Þvpº•¸A’ø±VøXÎþöÖƒíЫÖÝÀ³‚cdÇ'ÀqîŠksÖVÉHÉïFÐTåCààç4«ò“ZCÎÉt\¡>b°WÕL8³ƒÏÜ-î/ ÉÕÝ{2 &’[/Y,ºÛT8d*LÍÉ_9UcÏjþíÈÛ3D]øi_ªÌ!PÛužJ°B(ÆË¹^ÏA?‚Ïo®Lœ}Os<÷†©íùã lL×÷çR{8SûÃÏ××,{f§òX±ôpÈÛ–¶ãþ˜7Ù%ìµj8)t~¨ä…Á줃qÆŽ×Uºì…Ø6ç'fÃirºz?ž=”†ãn ëÁ.¸ ®l›!Ù”ùqßvBbØ©dv—j²¿HšgÅïé ×fúýBÓX¢W²Gž²±Í?K‹î m»(S_ =ãÛnÏ3ÍNmâÞMV¡D‹"TŠËúÊa’ˆ]Jä$(:6dœ‹#¿_~\>,ÖË,ED·«/мYÞ.ï׊_¬yw³ü¸¾[™FÀú;Lâ8ðFæµ”åwz±Í®¬õ¦iâ^e¿ÙŽÔ´$´1q¼ã÷ì(8ßâ$¶•H J¸]Põ.¥«’ŸZJìËC®Æ5ˆÝ"w [¹%)œ‚¤ë A¦-Qð×–4š^Á»°IJHoÙÉp{žm×ÂŒ,× 7j§h J[°‹‘îÍwÞ¾Õòóãòãõ’½SÀŒµòôÁèþˆš y-›#«¡ïÏPb–(íµ™€È‘»2?¶ ë Ùf{á8‘‰‘mùìüúa ^Rìzqu¯¹n»F2JH¢ÕÑH,ŒD›§|Q–ärl¥Õt-á‘¥˜»ëåûåƒâ¸ªià©¶N_"óC»ç 3Q ¹n3…H*Ä \ òßã‚ %J êîȼˆ µ!´Ñ5Á6q⊂H=;ñ¡ÔøyqÿõüQÐ#‘‹_ß(^€,‘Sçz#r{VÕèõ7^^ŠfHТ0E?˜Ý™Ð¢$1¬ÞuÑz¶{Òö™}â×!éÆºÖš ‹;m¦Z†€$A‰»ûL/Ê<à„`MGS@øE1Œw2•žz®i¬Jàhò¡Ôrý`d f ’K®¾Œ+ö{ïµùYù_ÓëŽi‚L`ÃIàEÅì½Ô`˜€˜ Âfuµ¼_^¯K(At{•F\nH&NÐÓ;€º/ôé âÀ”ñmãÅÆ¾™t“g;–%¶cÛÎPó蚦³À¦*„,ðÂh¨ë~±"+笉¼ ÊóþRÚWi/ÎàABci»±'?üàÂŒ¤ÙÞÞØžMFÜëc‡Bï=T‹!a°ÚÇ%»ýéá?NZÏÁúBáºÎˆVq¯1S0D±ã‡c&µx>€dV^q@7JŸßF>ä8V¸è$Áì­Àp\·;ˆ"lêÚT“ýڲ -œ_â[>^^ÇN4bÚÑ—N,î£~XÌšSk ÙUSêþ0íSϵରmot.m-µêDWŠÄbtýø©ƒ.äPºž“:°xµ4¿ÞÏ^>uŒÐw>eµÇâmÒs ÖÇ_‰ âê)¿úŠþ^’¾™É8× ,«ÜÀOFZ €ïlä=^Áá%Ö—xùˆ_e)X Q;$7£À“ç¢Ù¶~8Î(åG\é²$0_êH°xxX|Qœ¨-ÅvòžDi.J”‰©pኣÏxDÓg]¢±‹ªx~ÒJ7›²’·¿RQièK‘8êù¡]Ùз¡Š Ûœo‡ãpáUy„ª…Ó­}RÌ9ÝKŠ+IxN­ ÛfÏ⪫ˆXa—ÒÍ.-^Æ®+Cذù’Äsfï9†ã¾ˆæú üЖžͦb„/‰¤¶èÉ-ØØt® g\-E=섨âfýÊbµÔ’6U³¾¹ÖÌß×`G¬—þ¡ÉÇO7 óÑ?5y»¸_-§Q |Û 1ÝdÄlµênC2úí¸{ù9â~ßïiÝ–˜Ù?™ÁñI·óO à_u„.½í*W~áž½ìw~b›´Þ¤"ó·A §/_Çìl3Eþ®Õ¿²Eë endstream endobj 1341 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1342 0 R >> endobj 1343 0 obj 2978 endobj 1345 0 obj << /Length 1346 0 R /Filter /FlateDecode >> stream xœÍÙnÛHòÝ_Ño‰›Ãû ÈŽ’ÑŽD–3kŒšjÙÜðyØÖßouW_i!O³;RU¬î®«ëhåùÈ!6ü{Êþˆ—dåѳ 9$r‰ R'²B;&%HĤ`Œ±ÐãTÁÈùý¨:²É—£?þ¦5±­€¼Ù£Íq››£opxZ^'I"du-'ŽÙž•ä—Eé’O5ç–Ò³ìÿ¹ô¦DžãþHd“Ç£³ÕÑ/ŸâØdµÑ!9Vì™CÏ'±å¹ ûÇ%«’üññf×v´$—i•>Ò’VÝñŸdõ¯£ùJèÈ7àQä‘ÅCið!ðíá#Ì]SáßòË @ö©ž² ¸¥ðÏw-#¶2ïû‰›ìï<ü€KØBǶâ3\;2Ì? °¿Ùj#G²³•>qÂ>âÒF Kä¡2—»›oä¼.·i—?äEÞíP¹ sجŽ7V“||J×”iµC(¯2cÏœ¶H~Í»'„º'ŠÀM—Vë´Y[ˆ®$½H;Úv¿Ð¦Í몕ǽPyJ×Ôë>£òü>Û?6Ö7ˆHQŠÝ *g¨äÇZ¥‡ž).´bò±­Kj õÆ@@úÖü¸Óú†k)IBJµ¢6‡Á—¾©¸ê¤Ê@^òÔÀ¶M½¥ ³§ePïêÞ”û©î‹õP؆nêÆ<4{¢Ù!ùµoÈ2Ezid¿ÐÖö3]¾ã‹=‡v]^=¶vhW÷„e4qdvéC* 8-Á^S¥ÈŒá%Í‹ô¡P„_w`&cGm7µºV‹³§œ¾¨¥YQ·TÉ>í‹®µFzG®Ö{±!  I_ê|M˜XúJÒªËO¥Ùˆ Pue+²´"Ûºé7…T»% œÔ`|râY‘k۶㊄¤”]×°¶ª;Âc REý æruÚJiмÌ;ð»RR ñAd³Ø lÛõ}<éÞuƒ=6gŠï÷œ‡pb³Ð‘âhRj|¾ýúi¶šk„ìxÓ¤Ìäï·`'j¬¿Z|»›{¯5òu¹¸œ-ï4á·¹duÑ—<«ƦØGƒ -DY«ûnÂì® ‘¥}ˬÌÊ{(G¾etË\ (ëž*˜‡§i 1’6;EyÉë",å‚#˜S»&…ÔÈsW"_X´dñ%ž’Ä·N ó¤Ùhµž€¾Ñ¬gÒí'[f!/Þ³NN"9‹`RQ8¨p‹ÈõòÓ|IÎîHV¤ìúClU„Š–‰ð +qà¢xax0|G|2y˜ÛA¸ü±RøºSðÐ’HCK"Ì.£„i;a©BƒÞÍŠðšnRÈ9 ¿Ü-nf—Æ6yE-…Ÿé•é«y6wÉxûmݶ:EXYš°¸vh£Ê⺡ÿ¡Y:.: ACüb4Ãqì"Èe¶ áàÃ$qÈE#¾ß±‘ðè\Íl„ÅÕÍ|¹RhÝ(PeDUø´ŠDsˆš£Ï2ŠNÛßkEG!xyæ—A­¾"©Ûk)’ 8Ž=¥Zel×öÌ1Èî‹/W×Ë9©¡kjò5–`vÇÔÙí y}Ê¡[ʱb¤ËFCGŽýåB‚cQ`‡Î!wØn«"ÿÁìã$–#Ô=Q¨á>$¤¬hµ ÝñöanZËzovz‘æé1Ñr ¦J#Z ˆr?#øi~17¾˜JÁ,9aHv3´´€ÛÒ’MS—¼<·)´˜(.Ëj¤íž{Úì&,IÊIÀå‘'ªþg^Úù6=¸¹€¬Ð’ʈ,sBä½°–n)†—n/X‰L·Û"Ï0&Ž‹aÎH@ô88XúÇ|·Ø /ÈG9J$û£„ÈÖ¹þÄÿ€ž{OŸ×E³DRû\˜Ø®êÒ7ƒpywc~–û绣B]²¡«O¤5¶aZɾñ¶ßòfN6<ˆ2»]]ÿµ¸:_Î/çW+MgLØ5q÷DXÍÿ½â.$\(íXÒB bäUŽí«pª–ÍOk+ÖK‚û?úÜç/iA'S±£¡C€%QtÈãc>ô¸ð›ýýü\!âæ!òn(D±•¸Z~¼¹ÇŽy’Õ‘ (\Õ4Í BèÃ\XhÂOD€—5HB°¸7!†R#ß(PŒ/ˆ×Ió¶ ,¡ ç§Ð½4–÷|ËÁv’´üˆoÆè6ÆyÝ`³)yî69íi{¢ "B¡oi¹3ÔôzÖy·Æ8n ,5¾|`iï”ÿ÷ASÍÃ>°Ë6âÀš¤·l iT¯¡(» +ùáž•Þ/g^YA°Iê`=óÍÔ¨‡¹UŒw@^¹kò²%í6ÍX®í8ë•¡Ë:ÿu¶$è… qâØ ÙMð|ï 8#¾Ÿ\gP\žjÐL¤Há!*`1O#Â+“ޣܯ…A¡L-M0å0GpÁSv“ûë½Å ‡}Ëùûµú)QÇ:N&Xß¶÷lÈ: ¶…ðâ)e›²bgÐ)]¯yv… ­´‚« Ú‘ó[Âo8»=-…µlBUõvìi$‹B(? yzÌÇ-†¼ÈIG#ZkÚhÔì5î{Ùê%fߨmÓÛ¡‘É€ñ´¥U VyÁ9?”é͕냠QÛä5HáuAQ39Ô–0ƒxÞžAXõaá ž ™‚¢³¥ÊiÉ@\J˜*-ë·ÖuÏê÷s_w“N |+’$¼ÃNñ‰œÐW™®É´bÁ_ìdÈPpK"ök–³¿,¯o¿þu~}u>[MˆVøI‹ó˜ï3æÜâ¼-¢Æt•60hŒw&³x„=1ˆòQ¬x2˜Ï~âtS”÷;à ¶ìÈsÚÁ„>ª5ôãýÛ.H²5DLtÁ¥kÀ/,Ö‹£½Ó~¢o°I`'–íƒÀQt°~ùü¹ÉO,_9¯œˆ€ LÞJ6‚\‹q¦/všru{q¡1¬8Ï«ÁÁÆpD1p5 Ÿ¼#k™ÇV8* ›e¡ÅSZ=Z‰`‘§ò`™°$À¡ÍxSÉ¿A~0±ŒÇŠ#hVRõEÑ’Ÿs´ïZްNõ`}óÉù>ŠÕ”Ð ´¬y‘c æQÏÆˆòŽ_À÷âáP ‹«Õ|ù}varÞŸ4•«^iQìÓoÆr¹Xöb‘zÓâPÑÖ*Cª¬²órÄ»pþÞ%`Õ”iÒÍx…T\ ˜.©±ärvq&8Ѥ!v¶ø2$|º¾=»˜„Ï׳Ãü|»N¼]P¡†:^Ý^Η‹s¶Úã¹åûlÉ:Ó{‘ÐØjq9¿YÍ.¿*Ê={*Q˜5‚ðíâþXa“}PZ•Z-®î¸ÍØáìHrÏB…ÈÝïÇõ ªŸå²¯m÷ðÍñÉ›á†þºÓ*$UÐ^¤"‘¾mhØDEBÚ»9Á‰<ö“$ì¯YŒ¥¸™_ÌÏÙLzl›3®Äo¹éØ|õáýÒö,k’òÎÄ)JLžl(ûùoBgö³ŸÅ_ýª—³gK¡ø‹©X5ý3È:Ξ8¼UbMÚ»‰Úgù~5^Içv~sÏŒÅ$Œsü®yœ(9´!oµÙËxÎ)ë5=T"ò^ žðPTzcè¹–ç¶ë$›¥1ŸüÁ0æ‘Øœòw1p²DC'qù³$þ.›Ñu/ÆÕxð$Ë1‹AÐŒìO^æEÚHTü"© ‚:ì}-‰Î”lôU‚XiÕ‰¢>óÅ]^†ðý=C> endobj 1346 0 obj 2886 endobj 1348 0 obj << /Length 1349 0 R /Filter /FlateDecode >> stream xœÍYëoã6ÿî¿‚³€£Õ[p8ÀyuS$ö­ãì^Ñ-ѱ®z8zxãÿþ†J¢,Å pwím»XΈÎãÇ™!ý:1ˆÿ‹<ß$A2y•<ƒx&±\Ér\bxš«S’IP‡’XLì Å9´j®œÄ–|Ÿ¤ü4ùõ7˜]sȉ>Žb&_asÇÕ,—ú¾/u55ƒR±…¥¹0òù61ÉUVÏn´‚ô¿\{U#Ë0ÿ4ÒÉËäb5ù|ãC'«MÏШnv-›PÍ2}ñÇ$«„üzöp(Jž{–²žð´üôYý<¹^Ik5ŠLøßÓj(õ>8¶Þÿ¢À¬åw\økkò€£™#>Å2²ò_ñ¡:µ§ðßw=#E)‹ãT»ìÏÜüDHÄBC×h/¦N÷÷ö'{mH±wkE ·g<´ØâYhÌM”óu”‡ä2Kv¬ŒÖQ•´oÄ#:±’ðÂSž³8>MÇÙ‚”[N¾Þ‘‡’¥!ËCÌv»8 `Ÿ,-HÀR²æd—å%I™‘/‡ÏÅ‚Q¹Íª’„ÑfU\´F¥£\K£®\UšíX[_ñ|}ø°aÔ‰M×-ÇîIùDÎr†²p\T;¡s!IÖ°0žçí¤uÁKId9([ÂL9’Þ‘d ôÍyC‚[pÐ8G“tÏ•r)8GëféÜFÚ¯XíûGVÿq T8™ºæz6,wqõ“i:G³Œ‘i…ÐÏv4ƒœÝ»¼l ±iK4Áòç’j¾ééºá;CÙC·:…¤v²’­Y½ä”9K ¿uÌ KË<‹;FQ²²Î´2–E5ÇàQk¨EkD´i‡‡¬Ê[‚uáëæí0‡GçUÁó¯ÛPƒà-÷´ÛóÚà\[£},#çg¶g³ô¥‚¢Óq6U´ CàW‘Xf½Hïò,àa•se ³¤ä¡h–w§AriÉÞ¦Êêm(Ë#Ep%QÌrEö1ä…_ûÈ/Bƒì 3Fë`r6œ•BýS)È †ò ¯R”¸ÈYó'S‡Âa™ S“˜—<ô C„ºpx÷˜w¥Â–!ÐÙŒt¶¯3 2*H„œ…qüÞ2Ø>‹B–°ZuBéÚC[FÝ⋎ß?±®«™.tˆiŒ!ì9"Ù)ñEF?¼È+ã5 ~ºÈ‚ Ò—ža3•É­]´(• ëÀ0¸/ˆ4kA]î „™ÐdXmê—”¬è’ ²òå.KC‘Œ;þûns ÷‘ÜÍ‘m·ÈµV¾=7V=÷ý2b‰mø§Dö´MS^{}ÄÉPvú "PwÆzcq¨LO´>=…íá¼[qШ)b$ýƒ†¼œÇQÝY!©|iû$×|Ëö‘*-ŽÓ*Ž;)Q'OoÅUÒ1ç·_¯[Ö¥[ð©ï(% MgWcø=tl(ÔVÝôœi5¸Ú¤+ƒþû8`,®®ïûŽaŽl0Ĉ­;ši{P[éÉr7œw/{ihi µÕGºw%CË•ï²Çâá´ãEiWMBFVš³ü夨¢Â›—ÜDùòðËÃÕlu­|ÄŠÐ~]ÝÞ_?¬f÷ÿèM1ÞðŽŒOàBIijHÌßH–>k5`÷Õâ¹ÞTìãË/³åˆ×!¯x–L2§¼>˜7?:f&õÅR€F!K¸y¨_ù&J£Öo’Û8N’Lý6¼¿¸^NηÙRØbª¼ùóâv>[þò|µx¼¸»>¾& › Ÿõm’+nî³U-É¿gw‹ùO ¹œ}ï‰%$ê®$fòQ yù3eÆV™ÄYÁ‹²c¨OÈùÜ {|õ¶ŠþZE¡ä½¸Ù»à fÄ®yä‚$ Gn6µ5SÜ( Ó< “Á¼•xk0¬‘ý#øƒç»œ ' ”6È:ÓŸ>ÁW"®Zòþ5®ŒÀÓ¡q´\ç”2Ãyµ2³;RÖ÷,q2D@øèSÔS²\|ÌMÉåãrùmv7%óë®`@D¤Ûdñ1EMѪÁðôSÔ`Zu-ÊÖžciBŽú6…œîÍ ãEé>‹÷2‘! (/#¼9"G&£f„pÔq°ìicU¿ü´dû¦Ð ̕Ϣ‚(ò±øúÍ5aÄ–ß÷Fï‘|ècW<.z¾G“ÈΫËFQ­K„ªÌp^€0…b×¼(M›ç"ua¯ƒO6y0©{WQA2¢-¯ŽpÞ û4$ó„ò¬‚Â.wé~Q› xÔœ§3þð]©ì]*›Ç¬¾ßJ »?«o-T}kªp;¿Y,ïg«ÛÅüùáòËõýìéÓ0Ö®m¹ä?ýGþ¤ùo.Ü›‚ endstream endobj 1347 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1348 0 R >> endobj 1349 0 obj 2330 endobj 1351 0 obj << /Length 1352 0 R /Filter /FlateDecode >> stream xœÍY[sÛ¶~ׯÀ[©€w²““Ç–[Ÿñ¥5åôœIòKÄ)/2AÚÑLüY Š›‡ž¶¹»\.»‹Ýo™ç™…ü>?‚ÈFËlö¬x läøŠåùÈ °OB”!E„^ˆR!Ø[ µt®’–Äý:Ëgý8ûô„Vˆ`½ÎÈ@¹TÏ~Í=;~E‘²ÕÆVŠ-ìÃb™¡·×™.‹Fºµ^("»õ¦EŽeÿ,"h3û°˜½½òEÐb­S °p耛}ÇE!vìHü²Ñ"CŸNâ=¯X†niN7,cyõæ Zü{6_¨36 š,²áO€›Tê=ð\Òb¤YÇ×\øëbGò€ƒm#¥*²ê§xÐ.½ÆSòçQÏ(UÆË‡qj\öWn>ñ¢EpØ †M"Ãýýû‹½6¤ØûøyÈ ±>Û¶'Ó YC©GÎÐtæØE'RüíUt¨Ýq`»„ÈhxÇY%TX¾…t²¢}¢R«bñçÔ¤öyE¿ŒË¶ù¸¢UsÞ·Ö ÎjCðBË&–^94GŸ¦*ôšåô)5NÊëÝ®(+ÍX¥ñ´È Ù¼ÈÏÀª|EË•!Ócè`›T¬œHäÚØðiMl &#æzØB'·/.:â5©¶q4”Aˆ#p ±"o¨[ÅÒ"!T 3”ŠS•4çtY%E®™Ë"¯Ê"ÕŒo¡ã„Ø‹|BBghEwˆdÝ-÷E]vÝíÒdI•J–wˬN«ä¬æ¬zÝ÷0ñ<ˆNàOy} öÓ~ÇÊø—›&"#…¸æÐ4+x¥éjË4îHJƒÖ×@ÒÅZ¯ÕPZŠ M¥æ¨@+*£ù~\Moÿu7qãXóæ/,×TZ,ij¼Í28-÷CïÁw*q»8ªy’oØ6žÇñõýÚqV¯ Ä—[–QDÁÊml5ŒMûZGÂ`²„ ÄÍ9=*ªr\?%9˜ß‘„°#Vlä‰Ê ɺºèÖ®Zåùâü´£(ï–¯,MÇøà¸j?µS$¹\iå¦0…ìíèšÖLk¦¥>AçÈ¡‡,Ë:pQ’‹"„TÒeÅŠ Ýo9BKD5œòÿPîV¤ Ðß%Ù…Ú¶\×&÷ȉ`_>žß &ç”å&áØ×]É8{Ÿ¢‡û_ïoOÑÅãÃÃÇó›St7ÿÏ}«Ð79꥕)ò|kÒМ(eQWIΤ;¶Éf›î‘ؼ1½¹ÆäF×n¹¥ù¦Ýÿ핃,ÿ ¿ÛÄǶâDj‡ÛÁ&1+_ :GÄû¦\_ÙŠãS’&Õþh Á®mÝ ÜÎf¥N”[”-åšècC%ùÒØ)a†`W¢l³5Dl¶R[—B¬ S¾«©R6ÙäÉŠn0~d¯š„*RÍsMKãÙSI—¿±ŠâoCwêû(ɰÓu«¢|®‹ / ÄüÆYÎÁ/ ©ÛÓŒñanÙ¾‹ƒÈ‡‹D&/ÁPN¡6˱E%8Û"ìÞÈû-fs¬P4L³)–Âl-Õ5+Ÿcóñ·`¶Ûbòa¼dœFÂ6EhܦpS…ÜÚ··ßä'Œ0lÁ<莘sq÷qþ°ø|òN4‘ˆþÁºÊ¿?Eït5úüæ¨K,LQWCe}àð/4OH·r×’Ž–›Zøz$W¡3‚R¨þ$¸Êý‰˜r¨üo•C3þŸ¨Ò±-ìA9µLpžÊ]7E)tDk4¡J—$TVKâp‘\pØ÷Eٯ؅¡W@J>¥{͹{¼¹ÑT6ä=ÛJMq–²eeÐmpøé‘ãdÔØ6g̰¼*F£ï(Ù ›^ùT  )n~“\]N‰ª%ò:M9ÒY34ÀQaèE¡ï8“AÈuÃ@7|ßëRØÕ F×¢)/´pƒØ5TÒ€äi/ÎçX%T8x¤g8p×l ==çåz½=jê6ä×ÕËÓ\]ÕN5óhQ°"Èu¦Ï ÇÌ™ßÌ/È>³Ï~wn &›¾"ãÆ±ßMÜ|‚}H ÒÈ^ÚZÙ\äºdU]æ£çsŒl;J´x5tˆ–„5 heÄÿ90¢ó'dJ†Da9ZN,ÞŒ‚ÐÑ8öqþj¼¤|3ÑhlËÃ.Gâ¹ÑˆBÈЉ†náSHD0±™ „¨`%| Ó» òÌ‘7 •‡r=¨Ü‡ç:©Ü£´¨Äþòò·×ȯjÐnk— —Ãpëp#.7ßQ$îŠT«f3Ž‹]ßÇ‘à ´ÃÞGÚ7HÊì…¥-¡K_Ë‘ÀRJ&¼jJ]ÔÕS5™'8gKY'V[Zµë'¶ÑjTw–¯ÍíR ¬ÎãyK7éPèêúf˜ Ù9Œ¬hð=‡ìÊJ ÂüP«ýÎJIlé ëšwK¶^ËÆ!É"7^×/äpCšOJ ¶jۚ⬻e[‹qÇYšä~|ìEYi[ªFeviAð–X%|Ys>˜¼ÁQp¹úŽ‚`­0¢Õ"w+ùԘ礌,²™|÷­øÄHçAÖ‡¾ …Ð×ó²hŒúx ¦©@î{£X¦³`eÁˆn߃ÔÂ(hoÔO‹K˜µÛ—ü‘—Â0!¶*Æ·uµ*^smÓÑBHO§{¼9-š¼ÿýðÿPk út}{;¿¼>_Ìoþ‹~G÷·?ŸCñúÅ×?/¾L¸Ï‡±Á±¼¨ý·{‰Vd{âû´‚bŠj‘6xÒŠ;ádù•M±`Ma •mYñä<«ˆ¼¨ ZöêÔ iOR]›–ѹäˆj• PÌ æù@ãð#ªëöÝÔîƒo]ŠÏiÚ€²¦c@)X&*K¸‰>Û/6hƒë (HÔ2hhÅR€Šp×söµBp\Üû±ÿ˜!‹ endstream endobj 1350 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1351 0 R >> endobj 1352 0 obj 2241 endobj 1354 0 obj << /Length 1355 0 R /Filter /FlateDecode >> stream xœÍkoÛFò»Å~»$°¾E®€c»›&ÎÕ*Š"͇5µ²Øˆ¤BRqCÿûÍîÌ>(RÊè]Ó@3ÃÝÙyÏ,™O'óáÏ™üÉŠ•õÉ'¢, Y”)IYy©Ÿ³š’'9ÛÈ…#P.!0RTZÈšýrÒœøìû“÷`Ñ’ù^ÂNü sds{ò8[¬ld—G`æ4ŠYîEa!ÿ Ù¢fïŸÜ>öƒ¨ÙÞð{Q‹fxú-~8¹ZŽŠŠ¢þÏ<J£IìŸ8afè– c/BP¼0eä£ y–~å &ÊRø{Ð2ÄÊÙ¼ï'e²¿òð#.‘ßËGÎß1ÿ8Àþb«M)Ï>¬? ¬W?/.o~y‹ ™…A4]ú¶íj¾aOYA´<é×»aÙ>4–À?‹Þ`|c—kaà%øï-aUmDꮵ,—b#‡©ËÈÛ´÷#&ùí o–ó{îxùq·Q6ô÷´%Žg‰—±'Uc@d‡ðR¬øn3¼n—â·§žÁ몷‹[ÑÏréy-œUso0nw\¼ººxýîæúíâÔÐîvöìrÓöãf´ŒB/Š|ßòµ4Þxf¯V¶õVÙÜc Ѭ¿eï±}`ÿ|ÿöfñabØ(I÷”)õÓÕííÕ埴‰½üñæâõõÛïÿÍ4.äkõ‘¨ì8R—gº#¦|C î†Òà{%D°¤"Œ® m*T-îu/ÑÑ` 7òÁ®lÊÍn)úY¶—Ž˜ò¶ëȼœÝB cFvÕcfÏP¹?“[pý›Ë­³ öÒ½ö¤(Ô,Ë"µ"…C¥10Ýh^»»¬‰ Ç-: q7:œ¢eÄsã„h#ù'g¹‚¸'¾ÀÇÏ ŒøE6c-º¥wÿåðÒéÈv+õñãÂÄòy‡0> ÌaI¢üØ^Çòv>L#†Íñ–¥ØBIµ»mä[Q5×A†ƒå»ÑgzP . 3‘—ú±¢ˆtCP%0¦IZƒmF^VÈòž‡3¼tý |©ÒWÊ{á¥yRМf8iAèR­`¼Q+P`ŽJJ¢‚¹lAT¨©‡ « ·ŽÈéêl)VU# ]Ü•,”ÿtØŒ izÑŒ1%fѱê2•ÔQ0Ц¯ÀÍõ®47Qál|ÈÓ‡Å)篥M%Ƕˠ:|4øSÆE‘É£·Bh)Gö2Y‘U5Sv€4)qèÕñ.MÔnø™±o{Y˜úAÓº±¯þ0Ò‹AõÆÍ½Ì!;šáoæÓL9п‹, 2'‹Î‚@}ÛÀÉÓ!è÷Pø9EWÔS‡hÞáw;šðPÑýѲmN…)Ü'¯_x¡Ì¹$Îgtøê{•0-9ØÒÏâ™ýŽ2~]õìë #ÇæÐ/_õRº’9Å0@5t-ܮƬ¦þ ‹=ÙM¯f72Å*9ŨÏMýÐË(Q!·ë:¸°¾áÛ~ݪ葢›–ïͦ'&N¸6›ˆ+†oò²fcCžFq8ƒbhVý‘Ë ÿ}±aX÷þKµeØXf$Êb/ aþ Ã`4ƒQ~úá)HwjH:,¥¼é FT°;Á(‚|eÆ1ÉÌúÎ>îw½ìjô®FqØuô2C¡h Ïà—s­d|ªnžî©k?X2ýšAzLÜ pæKôR~g”¥§] åˆÍìÕ'Eü&IÉî:ojìÔ‡q:ÉŠ,ÐÔk·U ªª‚æŒ}¸2   kçÌ1±rÒuc@‘Zž:„"ï]¤€%ÓWÚ¤½äêi¥†š*ô÷L¥L{ÔýET½^ŽÌÝOAZç¤àÏ¢3«7¼»7´nêb¨(çX£›ÔÆKJa ýWÈF Ëìä¥Y„EKòŽÝ¢¿Ùà£VCØ0b gûÔRQ¸g)úÔÒ/²ã´‚Bs¡Ànƒ8ªF½r[Z ™ÔœâéD!Q¨-[¯íÎ"¥+!Åú¬ÈN®Úï»Þ‘óNÀæi¥OãxÏFœIŸêÊ ƒC·ê]~TuW~ŒÓŸV‚Q¼Ñ¿iúÇWPx endstream endobj 1353 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1354 0 R >> endobj 1355 0 obj 2851 endobj 1357 0 obj << /Length 1358 0 R /Filter /FlateDecode >> stream xœÍksÛ6ò»~>¦7 €ïޝ3Š­´N;µÔön<™š‚,6|($UÕþø.^(RJç¦ícG» ì‹}AŸfø÷B|D CY9û¤iE y¡&!¢IŒJ¤‘8ˆQ!6@±Eƒž¤êÝ Ù¢gÕŒ ¯g÷`Ó ÃŒŒ„+1ËÙw <±ÆI’h[¦q,Tx8 +ÑËë’¡«Zî6Ö Aän½k‘GÙÿE=Î^­f/_ˆ´Ú؈(Ž=psèù(ÆKÄC«Ý?[>µ/Ñ»´JyÉ«î‹hõf¶Xé3J2ŠüFX†Ò`!ðÉpÅ ³žn©ðçcOÑ€‚Y‡K…¾Yý) HO©Ï“žÑ¢æã{’.û;•Ÿ¹ÁH Ž—Á(uÜ? °¿Ùk£‹ºOŸ‡Œkµåè ô£èÙ7O;Þ,¿{kðŸÒÆ€iÑÖÎêªKóªí× °kêÇ&- ÚmÓ®çixÚqËRõP“móŸ{êÍxK½ÙyÕoY§]ú¶Âu÷ßX©.Ðq #Gžé¤,Cf<ã¿ìÒjmqe†í!¯\Vc¯¥lò‚·Øâpî²6°u58Ëë:Û‹À×®F wÛÜaͶé®ã%쫵‹¾J³yõè¬ï,|¥MùÊcØó!4ö”¯.agQ?¶x´5ðqB xUï¼­Š'”¢} Vòn‹:À«WsÔÔG8–ÿ³}Ç‘Ž˜È)Æ&äü <ˆˆå3ÜHÞ T¥¼kQ™Wy¹/Q›ÿÊÇùJ£Ç4HŸ…JÆJ,Ô$"Ä£Ñ_W ƒ’EPLuZ^Þ]¿?W ˜á H "_±è„ø#e€Á@}p½ê:rqÌ­J€2Ý_ÈÛ¨Ò’u®°„ÁÂÍšcÜñnßÈ Š2dKSPŸ¾ Õ½OÕuERm]ï6fYQºW+dÍ7ªßš5 ›4}ÞSrGЏÆÖ.©äok¡J–Öøúá'žu²!*‚L|žt»O<x”?{êBW!Ã膞IWŸñ4”€!¿î ”bªºs0›ýQ—2³Åõ¯!š®°F^¥nኤ{¸ÞíÀw¼ÝÝ’w®F™,åiæ¢M}p°A8ô\uzè;¶;Ä›ÚAl-r½Háü€ëçUVì×ڊЃý#MÝ”¸ÇôÀ*áz×åu•v«î>×n…;FôP >)ø‹Oûºsìh;(×V£jD<݇ŠCf¢À‹Æž0ñøâìsá(zR¥ˆ0ßKš:Ï™†ä±xÈ‘*¼ :"¶ îKˆB¥xŠÁ¡s¹êIâTëÆ=víêtDgº”(,-ŠIÉ"Ú¬aÕôþô¡àV°|GLKÒsÒè˜N8Ž45ö´O†žN[t}³\Ü­l˜½Ðƒ :7M‚?©%zˆ†Ç.ÉŇ)<òÌ`d<u¥ƒhoÏ”GŸ8 U‡ëÀêä7<3ªG.Mí}ÜjÉçzµïÁCÇ, æ‹ŽÅ ]ÍWóWóå]Þ¾};_]ßÞœéÝ~(žçAÇfúÅÖŠ¬.ŠTT‰?ÔËýØÃ>‰`ŒJ|ÓË?#M÷öI³Ñ…ep²ÞU˜G ïÑÍ-z?¿B¿Éÿ—ïç— tnN .“8J¢h,T7¯´AÌ+B&K¿‚·éÏvAõh×» æ:`΄{D‘åUÙr´·§lšºœÜ*ݫߌ%Xí~·«U²åá©Í·OQ–9ê¶ÊteuYŠye iûÀ¡Úåm»M~ÒÂu‰‡ (‡‘VOèÍï`=äP ±C«•s¶uÓØ’€á Œ“RY2Wµ ûG–”]º6 ®Dl·ÂMÊ®e0=¨•]šñ^ØAw)íPÙû]ªQk{Ê kl²J"UC"T5˜·V±3+9²ò¶®Æ>ÐÐ'R ÅÀW*¦yãŠ"Xï;»#]¯u×V5'(ØF°Â[õmªAÝ UGµék ƒÀúÏjñ¯•£§îÁ}kUvgÔŸ°}ì’(> endobj 1358 0 obj 1877 endobj 1360 0 obj << /Length 1361 0 R /Filter /FlateDecode >> stream xœÍkOÛHð{~Å~¤¸ëgìŠC 8*(-ñ]UµÚÄKbÁv ¨½ÿ~³¯×v⢪׻š™ÙÝyí¼6½™Ãßö1,´HG÷’f¢±…lO’\™cÃÃ>J‘D|×G ÛØÙ Úœ*w d…Þ²F磟aS„°á¢Çî1lf£w Üõ Ûóƒ ºZ†éûL„mx,Rôò"µÐiÎw×Ú3Fø?×^×È6­ÿF-GÇáè噋LŒÂ»&ƦáÛàfÏvoØVÀþX(LÑǽÙSYÑ]‘Œ,iJ³êÅg¾MCi#gÀ£È‚Ÿ±ÁC©µà:¸½¢…™¢7Tøu [ЀbX.Öy³ò“-Ô Ë=%>wzF²ÒwìW ¸vÐĆߺ Ë´4÷·ì{­w‘L¶²'èÚƒ{uXÒ ½€}Ú‹HE椤 §wd“¨å‚––Ò4/žÔZþXÕÈ«W¿ÕàlÖàé$œOfS…OÏ&\ªå›éLî¦W×7„—5í-ÜQÿæúý n²2^f4BqVÑ%-PW´ É‘`°åb1rX¶aŒMß–)F«Ä˜àò½jEœ’/qºIžmÒ9ȨÑüNÌ Ûè”,VͦÚþ0É"3SŠŒ$J4]çá>—2O¨¦2i8Å+šè\³ø kþ=¯»vÇU\°`šP9€í"ÙD-ÒCLË}P.V4%,À"\Û,7ѲŒó¬·+œ^½½¾™Ü|ÐhB ]DUˆ¨Ž½]á./t›ùý†q›(Õó‚çv¼pñæìúæj^\¿¹ü>½š !Ìèõ¡a´Î†+yC˜]Uq¶T8Y¯“˜6ëUÞ,%‰vŒûª4å"‹â‡8Úþ&EX¬W$[ÒFΪH²i°Ç¸ZmÝV'X¯ÒØ®k˜`1ö̾õ¢*XŽcð1›5Ѝ=/A‡¨ˆ™îyýs¨¬HÅÛ¨B°¦.tp'x¥”dì:˜¯e²–¬6‚"žLD2yz*šP¡ÚQr%Oˆ M %ƒ»‘¹ïôx‚Š’—ÝýB›ŠÂÈo4ëóv¬mQ?ô~Ã…±À‡Xay–ÑE7ÖE¾¦Eec×]™¾ U—7°®”UyŸDsC¸âªá­°þ–•»~g0ÀÔ¨Žû¥Ùôº‡ŒêuãôrŠÂo§5/o /ßíHfWuºúæE)­žÖ´¹þb}Èëhxø¶GˆuÅïØ¾¢“ T’Ó~ã3ýŽÀoHFÿßMÎrp7õX$³á¶B*. VGèqE3¾œÑ/:¹™N©TPù…GœˆÙ¨—?B©~ðZžÉ§(ßsÇ?;1,ßæcAÃûßHŒ¾™Òú[îÉ[æ×ÝIa2J ;¶‚iúçôMˆ.¯ÏÑ%€—a[^Gl+téóV’/Q`ò¬t°qG·Ãz¬±pk®!£Æ˜,3™G “¤€eÓà°6K ‚0¿Æ˜jøcÃàÝ¥‚?7{™»öUA¸f¶t¬üS÷7dÁ¯=˜†6‹£ÖÉ÷,Ïxµ ½¥r¬VT`ùšGkC¨'Ždy¥aLÑ~‹oks“­{·iBÒ|ÓÚ-‡Z©H³TJ:êÁu.åìVoÛÉ¿ruëh9è_@ÐM˜rMñ]¼`Ça 7µÐ((c4Ø%h…âd=¿lÐ,& s'‹œ•7…Ål¶®ˆ®Ú§=ZyñéEGùr·4k§4èÇ´Ëg¿ç@»ŠÁ]Ÿ6Æhož‹YO`-ÅINìq·Üý œ A’;M³S”µ5ŽÚË¢9Ü`µá‹hEâDç|&¦}@“‹ê{Q¶ ”J‡}ÑÓòL>¯v&ºefSìo9ªJ,¼4â;ÞŒD…eÍ ª%™ç”ÍŸ|jb ®%K*Ï(. mA^A+«B§ßÛï(Öœ…³9™šÝÅÐeUß…nO³’'òÎfc´ÃFzFê¾(^-ØíhçaÜγeG”+”ÐR5¦ì–g•ãá_ÐøûRdãgï´!ƒ¡_ 0ÙbŽß‘d›X¨ŠÊÉAÑ 8¨ºÇxµçPÝ äÑfAïœ&”Ã2Ôµè'žµP§›ùP¦â+Z¢ãL‚ìÍtÖ}A h»¨Š!O*’®«KÌùäEâ{š}t—'Iþq?âëÌ²Æ ìÔëÓãHåF ÙI²-;×o sŒ!œ×­¦ÆÅâ9VnÖ¬2ÓEU3/9ÜÍ‹¿oÑÅ/F—p¥œyUd|YA}üÑŒ·ÌÀðÈXx–oh@ g¼7:ÿ#ïº~ç ~Þ3Â=—þüjÒ—"« üûìjÒg2ôtð°ÙqZëép~2Ð=hjmI­×Ârñ¬‚ç8 w²ÙòR>?ùîw¼òBþ=ËÉp endstream endobj 1359 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1360 0 R >> endobj 1361 0 obj 1918 endobj 1363 0 obj << /Type /Annot /Subtype /Link /Rect [ 316.43 402.65 426.42 411.65 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 240 0 R /H /I >> endobj 1365 0 obj << /Type /Annot /Subtype /Link /Rect [ 485.263 208.94 539.999 217.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 240 0 R /H /I >> endobj 1366 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 196.94 125.6 205.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 240 0 R /H /I >> endobj 1367 0 obj << /Length 1368 0 R /Filter /FlateDecode >> stream xœÍYiÛ6þî_Á etRRÑðîzߺõî"±’mŠB–h[ˆ¯Ž=ö¿wxH¤¤µ ×›d±|†äp83|8Tîf&2àïûåŠóÙ”™È³M¤È%Èô01|”# |×G8h²!²is©-Àý4+fúßì—_aP‚ 좇™1Q.Ô¬goaq—`›øAH[-lú>[ÂÆqŽ^/s ]–|tg=SdüçÖëÙ¦õ`‘v³ópöúÊE¦Â­JÏľ n&¶ƒ|l[ûc¡0G¿¼X?Õ ÍÑuTD;šÓ¢yù+ ˜-B¹G®€g‘ÿ<ÌSiÐá:ưGK³^®¤ðã`[È@‚-6ú2Yù›utM—{Jü>ê©J›<ŽwÙ¿¹ø‰°‰¦ýA0,ÓÖÜ?L°Ùk“@²µïǘ$Ö¼@/‘ea½(MZQÖ Uy UóÔ öi¼ïѶ¬bZ÷0޲L¡¦ì›ÂW¯¯‚±5& °ç{AàØþ‘ŒÇ»øã‹/A—kã@éšìÌrLl9ÀR(늶 ­”i{Ú·ëÓmJ“^R´ùF\nûfU>h¾¢UÄÜUã^jzºÚLžRÍý–12í>ÊZ6 h•`ª¡fŸÖÔÒ‰ýÆ+ tÁêpN£B\”{»“ó bMð¾ny†t˜Û_ÿ… TQ±8 *s šü™¸Ñ¶°mC‡éÛ =Ð"I‹›ê‚“!D…j‹KP .íqT$GFæ4/«'md–•1;VÂPnQ }‡RI¤¦½­é¶ÍN5ƒë2§zÏè…æ-;ÎÊ'vÔ¯&þqœ‘(Ot°ÿ =¤Í•YIþÇk”懌ß(2'ºÄÁt‚Àó‰Ðu[€–ù•PÆ|vy>GU™QG¢4nŠxôkÐÌÀÝáõž¡%,Ò¦+ ^/Bt9ççóõ½¿Y¾}¿@7óëE§ƒLu˜¦ • ³Ô•–Ö´AIÔD›¨¦¨-Ò;8jE”Ó£ŒÄŠ;³Ä’'ôÛcZÔÎÞ o¾ù3}›&0ˆÑLõæ(ÁÒ®‹=×5 ª*¾ô"'ØñXÄ¿‚ÌZ¿]) äb”•;%øø¢3Tœb!ÝGµQ¡Ú´Ø¥=ÛÑ‚±'AÙ“À˜â.¶c¬`—õªS›¬/§š&Ñ,ßGU V–¢¬,´ÔM§yšÙ&ñFNÚPØD!>\¿ŒúXVöè{ðÙå¹Âò¼ À|¥AA¢-©@‚4׿d;®(?:Ï÷”tÁÁJêý’ÌÉÛíÀÊŽc§+Èl€Þ3vÐGFÓÉô‚‘C£ Rf"¸Ãé£ÌP¼c>ÞV`ãCY}‚[Ù^Ðqò¶nÐ}„¸A@´û ׈—‡®ú—M™Æ2,l° ®ÈŽj, ÈÑš û ׄïæ7ëùE¸¼½A·7á»ÛÕ Î±ÆŽŒ¹ˆù ç4p»Õà–qY4`¶2ò YÄÇ~à~`˜ Aua*:¬¯"EÝbjL%%Œ°d“m_6{/H¬;CŠ>ÑMö‘ÉŸÑêöâÇ5ú]P­‹ ôÇ ´ CJB}Dd:®ùÆÏÌ›*Ù9€MÆmUÑ"~åÎ¥@]÷w‡gªox<¹h©­ ê`£ÍK뺕Ǔã’emöT›W°fÜèìÒU’}tOõEô©q™çiÓ Vª¦¥‘éŽÞÈ`Ò&Š?±3 ç„ib,È~R`ˆ¼L †ƒŽ$­ã¶f\Å÷ÍP½……cIåÓ•¦Ã Ž_wÛgv„*‰ë‘Û5A \ɶcŪ¶ËŒ<>hé¤4åÛö°Cñÿ;øG×í2šZy à½kS¨Ÿ%Õ2Õ¼Y’GŸO¾‰m[sáÝ©ëß×wY²ÁÍãñ×’í>?õqÚ>£g¸)lB¾@œ@«óùÅHèÕjyž`QÇ`” $êÙÖX”%3Ëd$u›¥qóU”ê°÷„á¦J=³Ñ/gM4$ÖNÚ› DƒþÞ,%ðo'Ü!ÁÂê¼:­ìm´/ù}†Ð@)ú;ºš¯ N§Ø×!ŒÄáè8D&ÄO{Ù}5'š#ßaB£žHŸ”D’-oëŽYâÝ›²ÕºšRµáÀÂóî•Ö)i[¨åw@óÓô¥$#ö¸‹¦4¤Ht Úô1¦‡±Öi„µµÁ‘e›©%⨭©®uê=ßyo5¾Vóv[$eAî‚'jƒ7Ñ£b$]aîO¾[pI½—“XøU‚6n›bGÝâL>änô… Ña¯ÑÐÎXßÜñ§ìi글ŒC­Ã+ßf¥„ÙÎxaߤ¢ÞB=–ýœD¨m´Òx Têa%]jÚ„ÇE|zcM½¬ÌÔZ`Þ&ÍRáw!îžv•°¾6§£ð‰s\Ã9G<}ÅCÕb'¹ÿ\&`Rª¶Œ­ìÐ(Ô1‡@Ò YHÛƒŽ:ºÄJÔ¿«-Á˜¢Pëz'p€f¤*ÝÔàâˆi#ÿ8Àeaß‹œàW˜G°é˜Fœgæ­µêVZ\$ÓÐXã+çD%… Á>žúŽ÷ÌÄq!èÚØ=1úhè:ì OÏû{Þ¡ºnâBi–xÿ\58]¥¯ ëøô·®Ž9Z@ý|Jå©ZÑõ=ì9Ž˜:­/Wó÷«-×·«9¯\V‹‹SmxdCñ Ëö3¢üÜn,3Až½§_÷Ö&ìc² e-µ9”ë¤V˜¯ùFQÝ‘þ}M†Ïk¥R¾Xóˆn-û´;°ö3z·˜_B¹w}½ ÃÅ%zëÅ»å|µüy~¾êë=ù_…Érº endstream endobj 1364 0 obj [ 1363 0 R 1365 0 R 1366 0 R ] endobj 1362 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1364 0 R /Contents 1367 0 R >> endobj 1368 0 obj 2249 endobj 1370 0 obj << /Type /Annot /Subtype /Link /Rect [ 360.57 543.9 413.06 552.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 393 0 R /H /I >> endobj 1372 0 obj << /Length 1373 0 R /Filter /FlateDecode >> stream xœÍYësÓFÿî¿â>&3‰¢÷ƒi™1ÄiÓ 0Ä¢¥†9ËçX­,9’œ>þ÷î½O’­ÂhCÀ·{w»{{»¿Ý3·Ùðç”~D‰‹²ÍäVð¹È +‘Y¡£ DĨ  ;CºD =Æ«9±F?Mʉ¾›¼y‹–ȶt?±¹˜ùä%(BË ã$I„­®åÄ1UáY! ² :»Ü¸è¼b«¥õTýŸ[oZä9îÿÀ"ÝLž¤“³‹96JW:"ÇŠ=psèù(¶<7¡?.J7èÍÑü¡iÉ=Ã%¾!R¶ÇïPúÃd–Š32,Š\ø,J‰À·»3F˜)¾æÂ_ßò88–ÀaèT!nV|Ò 9 ˜§øçAÏQÆæþ=1—}Må#WB7:¶w.Ãu|ÃýÝûÊ^\$Õ}ø<ö0°HÛ ctê&–ŽÚ51ˆ— ÎÚ¼*53oªwY¹#…&WU­‰’Ük¢!M;K³RSá’¬ð®hMez|=›žkêé‹gÏ.ÓtvnÈšál=P¦6\4•¹Vä“á(×îy*GéÓ³C[ƒ]¾c%ž ?žÃw½(‹„Ñ®!5ºÏÛ5¢.>2EuUDm"H¶k LÀq›·,¿‡¢CÏ ¨AqsÑ)Ý¿äv—ßá6¡¶bò³ª, ¿¸m]mIÝ> .ïì"éÇ„;€ï 8€ð(Y7·ÅraµÞ³K)ƒÈr£1)–Üí‰ÈÀrè⚇ä,EçÓtúd:Ÿ¡tö:E0¾š¡óÙÅôÕU:—²Â¡,Ç­ˆú߃ÊÉ„ÁÕ¢%nñ7àbò|„àyk†Ç:ĺ6T¬{\ì7Tî1rà¤!®T 8L“¦˜J½\êVeÄcÍ{ôè[MPŸ(B9Gq˜—4ÅÜ¥—wüfË·ûÇÊÖ¸†”‡`-røÞ8ì!ÚéÕ¹¡¸ç)M1×·tTmiüáB1t$ F[éÅw¤®ó%Q b-÷§ „;97Ñæå CÎá "fÛ&)N¥è5n´XsÞhmƒµúC[ºš ã—¦„¡÷#¯ç=q–Â4¤PSíꌠj¢c÷-v-“ >éâUþ(Ád Í a¬ž:7Ž­ ‚«ŽÎªÍªò"‡ì~P\’¨àüzƒ‰×ŒAÊ›¼$ÖT.÷j½˜^qØeÔB+xe镆}¸(Ô˜ßפiµ…«½k¤[O†î “~\]¿¢Æ:!"ý›A/@s‚dtCFrYÐ(bmNÁ"Yov%À@ó){ÀYÂÛû·,Èßå€}›ËóͶ`)Ãz±¡gâ~]Z’-)—°áí1»"£÷tz­'§¡ŸÚéY~7¼qT£km Z‘ÜŽì,eV8º¥åCL'ÚC!»>¼‡²Øl!ï–ŠUV婸;^q„.H¤1xOg›ôq–‡xÄŠ[AU=H’£¨g{™µÚ¹ÝyÆn¤‘¼JÍvQŽrnH ¥¸eU’1JkµøÚWIÕ„÷ܬlG¼s¨ C”šWrTTÌ‘ªÒÜ\%)W¼-írÀÚâdߪË<»á š»pM´¤ÑÛ»ÕâÁ––೪^‚·€á[CÇÃöÝî0C-ˆ Yö2Þkž=x¹wë`§{¦H?¿üe6Ò2{~b9´ „B·§e†ö5ùïä£údÀ¶ßŽ$FŸ<"ì1¢mî^›ÑÜs"ŽºÔX/qÙk-ƒˆ+ž•¢I<…ŠHãeÞt' ½·ŒdìXéqV»M©izˆF“+SúÓï§×šâ•D?N¯»³\®x3Ž|»FUÑŒÜPJs¢IŠöyéí÷\£@y™³7âf± ÁÛbšÙ߉Nd¹.}-¸î©âloÊ·ÇoʉFe@–4-E:êûCv¸.¼4c°í8üP…GÑÈö=Oz·Ÿû,BeY«éó*92‚h¿Ÿ§Ÿï‹?ìgð—øf`¨²Ù‡~Obä»hLξùIQXñ|úl6ö(e¯\'²“GŸN÷M@àõkçázÒ@3ûS0.àÉç€ò݃8'´"p|¨ŽÓ«ï@Ñ;±w¥†¢ùdãzgý<' !¹“cð7ÿFî¡ØéÉ} £ÄËX˜fšm~ÂÌ’}'¹c%Õì²õ ‚0ê: Ú²ˆB1Ã>À[ ³])¨L¨ŽIDC7ò†ÂÙ¥€ÝØÞ$‰ÛZ3;ˆû¹ÂÝ|ê [kÆQ`¤8&*iîÁt¡ç Âìôý=ê/[-#7´O ó !,ÅVÌ­ÍÙšd¿RK=æ Ó^¡²…2¤„lªCTa¡²ªk+x ½ÐvzG†Ô N×ý«5’£!ÔâˆÖÛ>û÷¿¾ßñ/òð@‹ ó,ã|ì ²:ÿgõ7ÖÁt endstream endobj 1371 0 obj [ 1370 0 R ] endobj 1369 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1371 0 R /Contents 1372 0 R >> endobj 1373 0 obj 2050 endobj 1375 0 obj << /Length 1376 0 R /Filter /FlateDecode >> stream xœÝioä¶õûüŠ÷qðr%J”Ä à]NMcOIp4Z¶¤±×hûßû(R"5Mä*ºÌ÷¨wŸÜ}Xøàáï7êGÌ)¤ÅâÁà|ˆ)‘A±ü˜D^ a äêÃÑQ}bŽA‡5_k`ß/Ê…?ü„mÀ# žÞ„¹fs»ø…³ˆQÂ97ºRâ'‰io¯ U÷u¯½bäýéÚ»>ýÐȃ»Å»Õâí%߃ÕÖ¦@ì“$@7GA (W¿(¬ øáÕísÓʾ¥¸“…,Û×?Áê«ÅrelìtYDñOLºT]°Ðß8i6à-ÿ†$Ð8ÄÊÐu•›ÈšŸê¢?²ÎSúç¬g +‡ø0NËþHá'B¢}$£`PŸ9î'ØìµI •ìÁžøÐošXË\œ¯Îßß.áöÛk¸Y~øîúü>ž½¼Õf¾½Œ¦ŒÔ#Té&šS#[؈V¬E#¡yÈ¡–wû\ÔPŠB6д¢u2÷í%ŸòdØZXâygšççŠékxÃBôëû€Qb —7 ´`ûq¯Á—÷Ùg_X@ùb§ØkôÎônŽ¿‹¢-Š9ý@[ôOXÝ|·„Áåù52ÿwïIêa¨"âÅ>çI¤I—¥XçÊxê^UõpÜdÍèjß8Ÿm‡c»s>)7²nÒª¶¨t'j‘¶ÒòíQÚµ¼ËÊ2+ïÎŽ)ã~¹©r‘Y åóÓN:Jd¥%¶á6BÖ—i;ñ1OÆ~2ù¶Ow H«|_” ˆr­òRC`…*näVìó2̹Œô‘ua>z‘?£â8=Jé<åR(ÿ ܆LŒò}N¸á`*U§_‘s±E{D½±˜M¥s]CeÕZ@äyõdA ŒòÀàÜ0õ,Úz,ªÚ¹ë²­×AÅáÌáQþzu‡„:TuêÀÀG2lt¡)='×ÞÄá&ÙÌYØ£RœXpµË aGjUèD*.k‡;êVÞÉEl»*éo«â^´Ù:˳öÙ¢Ÿ²vg!ù)kÆÒܨ1.Ó‘„ûª>NÛLÎzÚeX?Y™æû4-¼Ýal*PÑJ«…ÐV Ôçã‘DŽQË#¸æüM™?ƒìQ5tÖ*ú‹wçPWØÂ”7å'™î[‰™37ްNpUóq± ¯IEäÃ>{9Rõ ¢¾%6¬*á¾®îe­œ>[÷‰+/êÌÔDŸHÁ©C̰ù¹óÌ|H‚SŒHOxdPSÜËpL‚ÙQ}¹¼Y~|rNS¬ƒ(T݇òÙA½Å²(ÓNiÊÂ& #gLÿW–_‚š¶'¬='q¦˜Bc/ŸÝÆØ?}JìÀjˆHÜÕ_a:’†uwgÙOZ ê¢êŽvÒjx»Ïs‡ K"ílµ´ÛáhYw®÷“®®zྖÈÀ**Šuv·¯ö®êj¤Y^Ö×=*³·èâ©C9?pÍ¤ŽŽ[ ¯~Ä=bÍøÙ¢n—×Ë÷+ [²_‹>·G««†e-*sdŽŒÕ(ìÙ}Ö'4D¨v¶ÍtïÕ¨µc…°Ç¶¦á‚Õ<ñVàûÞ„Є(FèÕB¥Og›j8…§ÕªRš {)v½¯¾¹ú96õi7 ìIèy4â}¾JÛ¬Ní)¤j±IaÓ•Êl¡ð“´€~3›Ò#”ã¾úl´£¨ÓxGјZõåZç©Æ8%C,v¶ù!',b¨`ÕZ™#e3[o3Æ9ô)`îv.eº“é?ή¥=WõfŽiV`ÜG\ KO=ô5Âô!#²ªkœT¥l¦s:ˆâ“±¿(§ÛB$³‘ŽÑ]±Štœaß«:ÛŠ¼‘gÝÄÜfuÓB!Út§¶ðèÜ•äÇ*”fºv)>÷‘\I8¡>õ<Ñßz±@}Š»rì%¿ß0•¢ö“À?£é'Ö€8>ÅçÔbIzX‘^™5`õ·¿žÜB| rz>v°™  }¾áðq•L¢Äó}ì3Ãÿ€ÛÌÜïÔ†_ðñ'Û0G]õw ¸èú<¹»®v kØ ôžÌè†v;uQë³ès#,…3Ñ5"Ësy'¬å/ÇŒò_d˜ –À5ë<…Äv6í ÈØA¡A÷x.Ѱf€TÁUûv€ }ƒë£nèú<Ú4Ê] A¿!ÒèAc/½ä'QÜçV¸°Â¯>®––7<ìý7C4œ0Ŧ $Ã×xœàkž†¦ùV˜#jqX«¾€Ï±Zw6öÜ´µê~(«‘¢Æq°ÑÍJÀõÕ_–Ø¢0ºŠt{JûÒ‘Ò˜D¸Tø¾¸¦úüÇ…ù§h§ ’…!‰8ã vá_±ZLÙ¼|µ˜Òž\-X‘ÈCRü«ÅTüÿýjÁâäÀä_°Zx€óŒ0pœ ¿ù|0Åà æIBÇù>•âÎwÕ _6ß§|NÍ÷ë"`X¾> endobj 1376 0 obj 1935 endobj 1378 0 obj << /Length 1379 0 R /Filter /FlateDecode >> stream xœíYYoÜ6~ß_Á·6€£è>жÀÚ»i]ØIêU´EQÈ×+T+mtØuÿÞ’)qWqÑó¡‰Ï Ź8œù¤¼[XÄ„¿ÏñWÙ$Ý/Þ ™E›8¾y>±Ã7C²'‚ ½øàˆÄGé0©xš3;òvQ.LòÙâ»ïᡌ˜†G¦¦œ«Ù,¾ãžo8~E‘ðÕ6¬0DŽá‘îɋ˽MV{º÷™ÿº÷ªGŽeÿ<2ÉÝâ<^¼xéË$ñV–@`¡iö—„†cGøÇ&ñž|÷áæ±iéž\'erG÷´lŸ}Oâ/ëXÄȰ*²á'0X)<ׯ(e6È¥þ¹†Ãe 1l‚Á¥Bœ¬ø =é±Lñß'3#T)›§çÄRöOŸ9Üh™F8: Ûò•ô ìΚvh{ˆÇŸÆcj…ÕЖdI›Ü& %Í»‚´YJ2ZÐØ6i•b{ñ2Òõ9¦aºž B®ðã'iü”|ôÑ'd³ŽÉj/Ï—›5Ù|yEâÕY­¯ÖñšüB⛯ÖܲbϵÁžE¡p{¿’—Ë+Øþ[ï¤vˆ&ñ#ð æÐQÇ»¼!Ï`12BòaZí÷I™)‚¤” -“Û‚J¾ª%åÍxqÛ…ºu[Õ) XÙ¿•t»Söb$Ó‚GI­8UwmÔ­‰¢ôPÓ{°¢®×ùÝ­©¢OE r—”wTKpàÇi[.Ïý)¥‡6¯Ê†¤I×€ÂÛGòúUNËÍÅrµ&i‹ ð hšß•äGúHRØ×ÖI^¶†f* 7À³tÅY¾ÝQžxÃg¹©éÀ% ½ïŠ6?R 4grÇ@ÕՃܛ<ô­ÔÐ 9"WlI>U•Ç I3¥ÜÅ«ü¨–¤¬0 9Mù(v-[–MÒÕ${æšøy u‚çdHY_çœSipG2IQTÜo.àŽs:£Û®h½ÀÊÉË;)iGvÚJÒÛ¤hèÄ’òhÓ¥;ÉÝçU‘ðR“amU3Š*õ†èvIÓè)´­I òvWu- ?Ô¹^¨–ëV„—ÂuûBɡƔ·c?Õ!¡õ`ça¨ZÜ‘¾s[ñöG£;ì»Fdb hË¢¹@»ž4.©é».¯yá¥wI)»”x¿UQ®l’2HHp‘•´Rt«lçmHq¥+¡Ï)y/ôáPä)+)|¨ó¶¥Š`Ë[´Ø¢''ð'É)«ò9\HطDz¾Y_oHIiÖüXv£Ðð-8ÏóäuY<’„@¬ –ÁJ]/I]A›JYuÑ´ƒ Ȳ5ŒA]·m›†ãÀ@õK™Uðƒ'tŸ8K ÐѸ\Ò”%C¦ýT!Z¡0^8­[Amˆ#ÿö¼•¬MÀÿŒ6£ßèÃØÆŽˆÁ1=Q›Ç`ÀWo@4\Ž#HÆÆ©î{¦åúÞ –áýIXÆ=à M:m4f¦*gÀ ☱qŽ >Í80¿­2ügÞ gÇš$KÁ3°94\LÃ5=˧#U¨Á|zRœmÏòDN(©g±H«1 ¶Ù#¨žG$5l“ˆjõÀ‰1pb'=)lš¨IQâ´#Š “Úæ´ÈŽ!—é#uqš£.NßJ#u‰%ùTûPóE®Ëå,ßn!bV”\m²£Í1÷x…rZÀ'ÎŒÐá­ÒSçy“Ô±«SY@*¤$žrûrBBARÈ*0Êu‡9ÊÈJ§»¹¾ÓàW#Ý'ÖDN¶œ_3›Õ zNCrÒܾnyTPÊuѨL=òÆJAÌ 0ç¶…ƒÃ÷ÿ ;¢æ©(Lß:‹ÂÄ ¶÷?›¾Ã[¦ÌËÄ^®cÖ_Éþbìåz. †¶þ}ØK·2Å^¼-> {éÚæ°—ËÞ#Ó:…½n–¯6W8Øâø’Äß¼Yof@˜ËŒ…žs„ÕIÙ˜Ú6'íã6OBcÌuîšeÛ–‚ÆžˆØãÓŸÙèh«§¥ÍA¶šù0ì“0®!œëi>±9=$jXd—šÓCâ´ºòƒŒ#R+!y îó<ºd<4ÙÿðžÙhÿ‹Õù…ä6šæ[õª2qw4]æô=­›Ñƒ.¼DLV‰ÆÄ8ñé€3Mw8Tµ*¨öŠS}×ãŒÚõ˜ä¶Ë‹öy®Øegs¦ð£~׋:Ù¡ç߀GÉÚwMK ñ µ‘á]NˆˆYÐDJ%i -E»ºêîv„%÷†6Ðç7?däMM®²M_?dOa¤eÞX¼Ð7|*À Å%½Ä™õ#3µíH|©Á庣g“'ãËë5§^HÁ&^^¿áìÛËøóé“ß¾~%¨¾ö£þË—¯âõÍ×Ë+ý‰ZØ„Pa6AŒTlÉK=Hœv£ ûŠ´œ";R ¾ì0úd€†eâ»zóB·0œÈ5m“t„Ó˜'@‘Ç÷ꊤ'âÍé=nYª(˜ÇÔ­Dsz¯[väÌéQÜR7Î+Ί6_™¤?AÁJ¤Õ¯žþ¹*õ7GôÈÌ Öà×Ë›‹Ï—7ü²@Qp ÞÓâÑ ØŽ*xOËˤàë%@ì†`±ú©ïi¦ßGº WÕ FmÍ÷…«x†K8ÚáôiÄçÎÈÈŽ˜|ÑÌNiùVñHýDÊ%ì~ šO-Áð¦ûç­Àƒ#ttæÁ½mÎí=S> endobj 1379 0 obj 2131 endobj 1381 0 obj << /Length 1382 0 R /Filter /FlateDecode >> stream xœÍkoÛ6ð»?¶€Ë’)QÃ6 ]ÓaCÖ¢‹»}X‡B±åX›,%4Øößw|Ȥ,KIöèÖ¦ïÈ{ïŽêõŒ"Ÿé_IÊÐr;»v8І¢Ø¡DŒh‚c"Ñ9@ ‰J}°·ÔGÜ22XwÚô㬚ôõì§ŸáÐ ,ÐíŒ ˜[6ç³· \Ä8Šeš¦NW†©”ZD„cX,·èù7[†^Öæt§½fDþsíC"Êþt9{±˜=%%h±ö)P,#psq$qÄRý‡¡Åýôäü®Uù}—UÙe¾Í+õôg´øvvºp6&‹ü$ؤRoCpÒß Òl÷XøÇqdq€ÁL€1z«t‘u¿õF·ÆSö÷¨g«€ø0NÆeŸRøDH4!%Xö‚Áh¸¿Ÿ`ŸØkƒ@jÙãöAb½©Ê;”¡]›7è¶P¤69zùâ5u™£eV¡üc¾Ü©6е*S&ÿ°õ@À9ŸÎ_.-ë…&€ŸüzWÜd%!Uþ˺ªò¥*ê ]5õUÞ¨;dù=•êL%…ú|¸w ä—ÕÅ«&«Ú4û TñAÝ]åmÇnà‚ˆ‰ v¸£K†®Pø„$„¤Â]ÊÓzy²8yqr~ŠÎßž¡¯Þ¼þêd^¿;;;ïÅCF Ç$¡i*c˧ÍZe*»ÈÚµ×¥öÏ2S¨Ú•eàòQ” Ü@5âX~®y>…ÍŠ4z²çîQZއœD°²ƒã_ÈÏ>û"€´;<´wLp\ä!ç,ܘFIr`Ûohñý»Sô;zurüÿ 5³ëΕF©¥ýq“WZd*1EOt.¦hýzÔù)\ÑR(CiZÏQí(”ŠQʹ—lC“W™¹/{t½öëÌ/uÜ<×n˜h.øQªZ=›¤lòvWªÀEõPñØÃï£Íißû¨è`ŒÅ€ ,¸)j|ÈÁdÉh [CR[ót=Aàî~ ¬GøAgÑÞÖä¡]â’B°Eä²ø<‡ZU]Z÷WAÉ1ÕUKÒä³iu¦M£.¸`K߯‹|“Ýõ®Am±-ʬÑüM“-¡5Ô úîÜT½ó¼¹É›#6Ka²€FFÎf}ZeÕ*kV úˆ†î£o¾Óù0¨1×õ’u÷ <þ Ä[…¨äÉ16S×S&S¤èâ­òu¦5* ·YMÄÿt—e‚bž@ÂRÆþ½6;”íÛäø`ZèßX’Lñ™j°,‰p$9!,NG:ì»×ß¼…Ú_‡eÐY ½šS1ÒcwUq îá=6‚1žQFˆˆÙ_k²Nä§l²Î_÷5Y˜ l{D“ È”A‡NˆìwYx*²}—µ@Øe-ÆvY»/ ¦‘©Íüˆ¼{ú,¢{é]{´ÐîvñlY—»m`LàPÃhaü,*Õœ uܾ«ºm‹‹2ð\U²‚ú 4¸ O7õmÀm 5Ø+¿)–›a`!ê}{ëÊðcÐ`ˆhüz[7áÎÚ¯]-`\ëáuÈ£wÒ»&ÄiwäE°Ö¹‰=ØeÑÖa ùŒfQÄNÔ# #üÐ5Ó]4J&‰ç.}ß…n Õ̪@ÿn€F&”¾¤ýhAqí&1»vN²€óõ¼·=vØ•2 ØàÛµ·׆¶WY“¯žõÿücÑšygérÙB02Ö=.M~\|æ—ÛL-7ó](z™_uÃsÇeèg]bz~VP±2 q];Î ´n~Û#ÆkÅBºï:C)÷n“Äs/~›ýêÂd@êêç8ÜÝv Á쥚F…›<°÷Uä³-Ô¢@¢-W=¼Bƒ:Ÿß? tº-–Ð"P·+ŒÃ°¤éÍ~òš£‹Ò£7Ú×Õ[áê¡ã!Üd,ôóúßIÓ¡al’x8ºqF1é†HÁÿö`Èìo€!qøp-.(ßï€#fê"+8¡P)§Æ~%HôÞ´pÈ•½¤#|cŽe, X’ügÀ6} I'Ÿ\Æ8‘ fß”ÿÓÏA$ŽÓ˜PÎÿ½WÀ@ˆ~Ø!ö1€›ÉlÁ1‹hâ+Û§ß/ô€ª¿ N¼„`X°(…¨±éwxéF_ªÙ™ðÄC@$ó(I¥d²ÿ`œôŸáf݉éàNœ?Ü{”{˜µÿÍ:þí¦ýÍÚ9i˜8”}å;7¢GŒü1„FéTêW½‘?!Aë·@8¬YŒ­üv=^íRÌãŠH’‘wÏÈMÑνtÖ ·nê­‡²`£¬³®ß9Ój7ÝZp?™Yð}HüòÍ»g§gmwt>«¡: !¿l²28©?Hù³åmv7œgbFÌîrÍ8Ÿ“à¨ÖPÐu™°¢,Æ;…=ØEùue‹)A£Qf„ûpCïiÁÑ$ñÜËoê]µr¡sÊwó’S¿Ì–50Û¨<[y„‰©u$¸*p–,Ð KèDì@É &—ËÊ©—ÓûÕûœ² ›E|úŒÇk¿¶‰c×&qòÆ#ü[Ö·…ýXk!÷A3 ïKõÐÅ_ïG1¿»S=BtésÄÌ0}œüv¢Çœ?*S¢c$¸÷Ÿ¨t‚|ó endstream endobj 1380 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1381 0 R >> endobj 1382 0 obj 1999 endobj 1384 0 obj << /Length 1385 0 R /Filter /FlateDecode >> stream xœÍYmsÓ8þž_¡t¦¨²dY6Ã1“^[¦LI¡ 0 07QRÏ$N°Bî¿ßêÅ–ǾÎðrWÊdWÒ¾hµzv•~xˆÀ¿ÇêCDMWƒÏvÌC‚"Ø! Oà€„h…,ò-Õ©–X’éQ»Ú0·èÝ ô|ðá,š!‚9ú2 -åFÍxðŒó³ Œ¢ÈúJ±†ÊÃÓ::_Qt²Ö«Kï•"òŸ{_÷ˆyôàA‹ÁñdptÆ‘GÐdîR@x8dæ€ù(ÄŒFê‡¢É }x4¾Ï ¹B/ã4^È•L‹ƒOhòbp:±{Ô tQøX§Rc‚û¤9SK³jÜÂ33#˜rØŒšZÚ“µŸj¢$¹Ž”ù쌌UUÞ='²ßi¼çH” GpØ8 ê…µð7ì7G­uÊv÷~H;±Š8ÅÙ __ é:Í“™ÌrTÜ&9º‘·ñ]²Þf(Ym–:íâ"Y§h&72‹MjúÁ¾ŽVhôOn%ÚdëÌŠ{:ÀÑY´ëZÀ0W~…¾h+¹zsZ ¶öŠnAtsÎÎãír«œâ€„x<2«/Óå=ŠÑ6—ú’·‰Nއ([/%šÆ)’_åt[Hž¢¡ƒÒV-|,ÂTûA€_ùy›ÜÅKBÅZ뇘§rªÃZÅ©3H^èÃþ8¤ZËHþy‰AÝè¸.²m:íŒ Y\ʉvþDŽ| ‹¤LNÐÉp2<ŽOu ß>Gã?‡Õ‰m-žaqPCmæ²@³¸ˆoâ\"ØŠï(ŸB¨:ƒ¡ ÊÃÔAg´<íVó =yòêö=M·+™%S糕Ï:cf!W}âBÊ<;†3ƒË‰CôȦÛa5 ¹¤3™Ã\Å®çN,¹Kr•å\˽*”ÃûÖ¼<=9ŽÜÔb‘É$h52‡„Pi–W#·q¾×D¯SÜoÓ!P›µn‚'øN¬J… (m4ijZAŽ+^_Ÿ’IÒér;“ù^I}ÖuÁ)Çmä4™'rVè+ïtÖ,º‹Yºàæ-œŠÄm')ö­^ÆÙÐÅY‰ÓîmÔ¢ÔŽ+ÀÞN\µøc€@ à¯ÆjìÆÎÖ™cä×Xaú¡iÈÇ"ÐiÔÎÍkëtZ.JEë=[Z8òæÞѵ›RÎn‹šæu}óOËHí±[?âÒßÚ4­ÅfRWini;äQ´rŠ8b ×i­Ò µ ŠLÌ5ÄUŨ?h»lPêa!!ß)Ï( X G ³JÚ•ërÄf­a\ù.GvÊx9ìʹ3³Ö`ç- :Õô×ô˜ý—|y4†«R¿t5vü%³õžpø " ‚ý@7ÑVC:Á=ˆúäzÛ ‚pÈÿÙý C %\ñ£_×P´­¨Ž*èu£·» õ)ék'4×^À!he oUè“Ë7ÇPžGÃQOCÁ\8šBýކb¶ÞÞ@ØÓ8íé(÷±/<8ÿ0èj)œ¢ŽžÂyŒ¾!Õ»¢ïèlx³÷tL8 6uÞÝJ};Bì—xgèZ)2æÂk²s_ÐíE4mž 3½µGD‡Øae²Ö¶˜]' WÔ|¹ÄInë$-*NWûŠûX´‘l,üxPñ7. A*&‹‹VÆçžü:•›².š¡ÝP·Ÿ4ÑÕÖ„>>ÇÜ×,¿)­³ 3àÐ*qè‰ #¼)v(ò"¾‹{î1œ•Tú{;&Ot¶âQ<ê>è„ìùÜÛ5ÜmQСW—ãóÉùÛÓëóÑÙùè|ò¾8ÔÓCy ÑÔT¯ÒeZCLh¿)iˆNŸfšE¤C‡éÿÕùf²Øf©œµñØØ"„§£çïj™Beè"†x›q Ÿo$Ò¹¹O% XÄx$‚(v{Ô<ôñÜí­w>çAhˆüð§¿Ÿ}!0µ%å×Õ»¶Uï ¼_×êD;o¡Ô÷hé+x ˜™Ç6ï(x£7ctv~5žôT<®zEŸ‰¨£â¥Ûå2Gó$Ë‹ž’JpA få9ê’w€BâZ?Ë*­†2º ­-<³Œªˆ†R3Tµ=;¡{XE™­ZoØÒßì§.ž†ü^.Ó…ÔÐ}唫vÌW7œÐFMe{eM5t­¦š]S Ù]S94. »˜Øcë_ kÔ'{X/ƒl¸x³‘qV±7r¾ÎÜ&Ì“ÙmÁmµúÒÁ°p¸n™}óæòêäôªâŽßãŠn„Îd‡¡õiô;ÜþÞ .LsÇñ¼ÈPGR>üõû£zw"óæW-Ä«u^,2 9tˆ.³x È¢¡/ÇúîŒe/×C Ýö´Ô·\‚³ÀP;áVz?¾{Ô<|Û¢½àPŠ=hhÄ~6ö¾€þ¯ƒÞ–…¼ú´®xµ§eèÓ‚ùi´’Š endstream endobj 1383 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1384 0 R >> endobj 1385 0 obj 1849 endobj 1387 0 obj << /Length 1388 0 R /Filter /FlateDecode >> stream xœÍYmoÛ6þî_Á)°²|‘(©è 8ÓepÔVÚm1(6Ó°e×’—ÛþûŽ"%R¦­èÞÒæÉ;òîtÏ#÷k"ÿž«(ahºì}5:Š"†¸0ªP aAb´DFˆÃ-ÔÂÖP-1C^iÍj-Ü£½¼GÐÛÞÇϰh†ÑCxƵ™Iï8æ"N’Äœ•aÇÊÇÓ%zq±dèlU­®O¯ ‘ÿüôî‰8eÿƒô¥wšö^œ‡ˆ”ÞÙˆ(Ž9„YðŘ³Dý0”.ÑǓɮ(å]fyöE.e^>ûŒÒŸ{ƒÔܱ2PUƒßW¥ÔšÒžqʬÑ[-ü˜kh0 á2jja2k>ÕD= «HéÏ£‘1¦œÍûyªBöo:ïH‰ÚH Ž[É`4qÂß.°9j^"•ïæ>Ñþ}`YŒiBhd*k¢³~Ú?íOhònˆ&7£´ÿ :;eú’/Î…o†'8Q’Ä¡¶RÈͲ2»Í ‰Š¯ Tìò2ûæZI|+‚â(`%2f^uØAE™•Uí¿F/_þˆ:Ž~Géøz =»-–ƒ¿ˆa¬üýÎûCØþg}H¯JBxzlŠ©Þ”ÞÏ ô = èd½Y­å¦Üý`U÷2·’ºR#¨c9+ežÝ.¤c­Ø®×«³ánµqfWKél^TÑpv¯îìX…Án¬¢ˆ­b2Ï¿,äóÍêÁÑ †ƒ7©³©Žwá’’h/(ŸNŽæ™Û^æï³N94¡¼’ßÖYóUîhó¢|}4I4ä8Ž0+’>”Êkd#ë&<ö€ƒåºÜÙƒóþõÐZÒU~à)øÞÅç9ÒwGîµ”sëÔ7#B°Ê„u•¨î›HeöX¡ ŽCÕ9â :`¦êÝG«0éÜ‹nwêÙvQ8q |(€~¹^}•/v(C¥ R-©B:;í£Í ŠtšåH~“Óm)aîÓtNß4# &‚ƒé0pà~í#ŒÊUå`ºÊs9U1¶Ñ:*S épßjß `)Ö(ðëì– ƒ@uXÁõÆÌ‚qàI1ƒÕQÜM-.'“jÁB†#B ï&Žä‚E)ä?!ôv†žÊ.ÔÒ#ì‚ÅbÏáSè'Àõy »˜hó W(Ð"FW3 #Ša¤†cÙ!õzË2ŒÆÐŒzÞðŒÚ€C4ŒJ3 #@x&ró›l™°Œ£^Õ¢µ²‚/”œ‘½ X2¢v'Ǩ‹sƒ!4€¦ç³¤ƒq†ãŒö1”ž! ;BÁðaép­0(¤…šqhÉ%Zcø†ZtÃÌçŽà 3[q 9ó£×Þ ”a )dU-´‰†VMCâP5áH¥Á³î Â|¢¡tÝ)`2àÌc{@Ã3´°Î6ÙR–rSXaÎÕøÍÕèý`œ~:ÑiÐÊ»m®;q£1‰ÑBIžÞK'PóÜoì±B‹åj&} àB`F°ø{@Ó³òtÌô¶vB&ÈL"«ëw¹¿3À¡( “ê;¨ 3}/f.‹âi˜é[éÂÌ@0¼'„ñG0ó¦ 3x 8;AüfÞtaf…ðìDì1̼y:fÞÅÌ@1­–ç`f¨ˆIPK’¨…™ÂÙFL­1x©–z\c¥–,Rš• NjY£¤™Ói6Z„ÔŠªŸèáåN¿Õ™m .šÜ[+éà—´TÌÁ¼QhÁ¹i¹Éòb¡Z¾ÙQˆ#ŒÖ%OÈðjôÖ¼døY ¸K’PføËEÕî¢C'~3ôÓ•!ÍCG´øüƒU~]¥V]‡Vú£=ñÙŠª54­´ch%3+Í—K9›ƒ×ÅÎ*³»RÓ-È3võ›‹ÔA5Rž- `ÏOìÅçVBE¨]1Ç´ö¦ÇöKËØq#÷¯Ó«_/FÕËÁÈ.«rk¬5¹µªÕA_o£Á’sÖhNoޤ?i†gàú"½ño ­¿}Ss|e ¯ÎÀÕ­ŸÄ½o–Dë{%öˆœÒtÐ8Ê@¨ïÄ9Kùj,SJð8£}„DDà\|Ô§tXœMe©aÍàÔØåoJ®I‚ØãnÕÜ6³ç¿¦tÀä”Ϫ­Ö¬¬EÆŽÆP(3,É·oH˜¹îxÁ+4æ¡úê—‡ìù5""€H£ï`2ž•§3ok'“Š¥1a, “1ÿIóìž’ endstream endobj 1386 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1387 0 R >> endobj 1388 0 obj 1925 endobj 1390 0 obj << /Length 1391 0 R /Filter /FlateDecode >> stream xœÍYëoã6ÿî¿‚7@ÂÕ‹z½”’KÏk·¶ÒmÐ…bÓ¶P=IÞ$¸ö¿¡HŠ”e{\Û»}…3ä<8Îü¨}™È€ßì‡Xh‘žÏDž…lW°ˆ‹L»†r$Ÿø(c {C¶D í–+Vsbƒ>Š‘nF?ÿ‹–ÈÀ=Œr®f>úŒÛ®ðÕ¦ï36va°ÈÑûÛÜBWe»ZzÏÿsïulÓú?ðÈ@ëÑe¶­€ý²Pœ£ŸßÍ_ë†æèSR$kšÓ¢9ûÅߢXì±UÐf‘<ܦRo‚8FFK³Ž¯¸ð×Á6ç[6æ2q²â'›CÒFŠÿ<¡JÞ?§6d§ñGÂMû½Ã°,C ?Áþæ¨ ’Ù>¾cXñ&­ü¡O»ôK’Af¡¦D͆¢EYtѤe¶U¹¥UóŠø¶ß_ûŠMß„"j Ä`ßFý”áúµh’—_ó×Zê8g¹ä¸,żážl›N`†é‰ÛÅè*ŒÃËp¡ùc4¿ŸÄáOh: ¥w¨†˜8p½ ð‰p›6h™4ÉcRS{@|º–AàŽÙØó=ðà¨Z5ߞЃê&iÚûü}óÍ?Ð ÇÑ¿Q<»‹¸eý@Éž½ßÑu8ñ?Ž’Å`%É)ßÔòà ]Øäï;yàçŠõ¼¡…¢Øž:‚ù¥­¤Eò˜QM[½ÛnËJX••6[æTÎÚphÒåJ§U²È´Õ<’Xse£Í^Ý…cE5Ì+E¦Céò|^Ó ö"Õ”k ÷£BÏi³A³éçÉݧs4‰~ŠsI±Dïf36çÌX5Í“¢I5ZpLìXÄ0lƒÈ³hýt ì wEY\@–ˤZ*nóºåædRiM•uy¥¯/Õ¸Û­Æ:l+úòvÎÞ]Ž#Íp±¬¹OøçÛpÏÄÞÛsßi‹à@:ÍÇÜ0VŒñtr£¨YøY©C3þ¾¬×MEYd”¼‚¦/†v®(v Šj«NG¥õ0¶ÄéG©_óL‚}Yù˜yQ”Ï÷y“rÀ"61f·ÜpZz(–JtÀÉTÍ•ËÛ›ÛI¬Ï ´£ÜÝ‚S7Ñ$š…qt5Œ‚ëö£py®¢ëðn£pŽn¯¢I|ß«Ží{8ð\ô„ä<-Ö½¨ÊgfØqÙþÇÑÇXRÝu¨%çáÝñÚcLØ;‡lušM³Å/ßÒ—mEkÖ`4n–Ö͇㕠ê›çÀÞ‰ï°!½d¡,w$Å ³áõlúIŽYµüáLҢѷסœÃÂ0žÐOúöá.´Ômén+†D€ª²ŸŸ¨ß.«ßðâ2\ó€~¿wÑé‘;/èòØ&ìée“ú†9â@×ó´Ÿ¥tÐÌ𺥢ëþŠw¼oÃûѬaÀcs¨X ûV‘Ÿv´Xp ‡ÊÐy’ëdÝTªÎŽg{ešÐÜM8®¡±ó·økCÂÛØ±èÏ?ÉaÇ °/fhLó·Ë½ƒαí=Ñq8ç=a0ÍP°Et*õ%œ[”ù6iÒÇ4K{w!Ø5 0¬ÿÝ Õ¼Þ eOâ;‡!aî„áø6¾sÒ$èöþÂÏAC+¾Û®ßøAh¨å¾# {–a™2j=Œ4‹®£ë?ÐC¡ÝE73èD§> 1pÀ3­C0¯¢+ZA¬Ò$ƒllèºbØþÄ­ ‡šøxîcÔ"¼­·$C·$yÊ¢ähðP²L”c 9îB"ZhùB›³BŸòÏÒ xâëk’¼Ü øwÈúÒЪàwF°:ÄlÈ£/u§»·H·‹D÷x“|~Õrg/ô`÷*È]OgÑíͤ£ÿÝwcíÀpÇ WM ¾9ÅCqÞÑ<ßùX,çä»Zj%Ö²#’5XT ËnÈïÝï´Ý ýÿúˆ endstream endobj 1389 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1390 0 R >> endobj 1391 0 obj 2114 endobj 1393 0 obj << /Length 1394 0 R /Filter /FlateDecode >> stream xœÍYmsÜ6þî_oß8ŒH½gÚÎÄκqãØ©w3™»¦“‘w¹^]ô²‘´qÜÞý÷_Å•ä½|èõ.qÆDA™ÏG<üûTüŠSËòè³–Qˆø‘…ИD^%h& (ÄÀ=R Ѥ/¥z´b6ðþ¨:òàÇ£_~ÅA+ðH÷GÞH¹R3?ú‡ñ£$MS•š$„O"$–%<»(¼¬åhƒ^(òþçè]D>eÿˆ<¸;:]=;z°X÷!S’øèæÈ !>KÅ‹~y2h;^›¬ÊîxÉ«îøWXüt4[è5J2ŠþÄD†ÒÞ‡0ðö¿8afå½ÿÄW2”âbħBï¬þ->2”žR¿õŒVåLî“tÙŸiüÀ–ˆ‰Ô#ÉÞf0F÷ïØŸìµÑF Û¯ÇÖÅŽ!"zÌ®(,'BNùJÙÙZRõ)ŠÖGŒ¤±gÙc­ô_–uÓì¶âÑ„XÙÂú[¾uƪî#¯ûù:Yþ”EQO'^_¢Oeúˆõäòñ¤È˼C…] ¸A z‚‰7?!4ÂV–Ñô¹]¹ºCŒ‡@ÜV}jêÎÀ¬eù—¬Í<¢ðx­¸|‰ñ4Å›îáñô§ Þ˜sR6aeÓ~.V·sî£{ÀL”–ø‡ºaÅJÍ‚`xÃ:{GÜ\¿Ÿ¸[…#I‚W´8Œ‡—«¥¸{ª7ªo¹V…, AäcÞª"ŸDî½JñJ}ÏëwHÃîUJhnVŠ3w+Åõ·+Å«õ÷¼ð„Ã~·«ÚüNŸ„Z–ãÝ+Ì(†B?Ú_Z1ÝdÅ.Za˜·5‰õ»$ÞÖ[uÀd_órWBµ+o1¼ñ,’Kÿ Z" ú¥zl?Æ㡕Wîå\ú€{ºb0‡â¹O*§@(ž‹(Å^Ò<üqéyxÇOŒ×0úï¥×ØŠN/éŒbÙß–^cE‡Ò+bŒÄa’ÆŒÆÓé5¿øûì@zEA@|_<]$t:½ä%i^úÿ¥þ ʬý« endstream endobj 1392 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1393 0 R >> endobj 1394 0 obj 2299 endobj 1396 0 obj << /Length 1397 0 R /Filter /FlateDecode >> stream xœÍYësÔ6ÿ~…>&òÛfRf¹ÐðJKŽa¦À0:ŸîÎÅÄöBÛÿ½«‡-ùqNf ´&»²´»úI»úI\Í,DàïOüWÙ(ÎfWªÍB_5y>²ì“eH)¡¢”w숼‹ѪzKe‹ÞÎòAOgï>@§"ØC×320.Í\Ì~çž?Œ¢HÅjc+ ¹ û Äzp–Ù褽›è¹!òŸGoFäXöÿ "‚6³Ç‹ÙƒSY-Öz €Ùw\bÇŽø-2ôîà⦪Y†^ÒœnXÆòúÞ´x6›/Ô…±‹lø °ØJžKº_ŒmÖ¶ëVøçbG¶A ¶=˜ ÿ”ª•U¿ù‡FôRò÷^d”)cpd?ÒùÄ’ðÁag1lÛ6àïn°ŒÚ`!¹ïv>Q>d°±Ž*V£{ð͇lFë$e•¡Ç4Þ2C¯’¯µ¦µØŽŒÆ‡6´‹ùÂÐNÏ^Ì/ ýÉñ“_æfï³ßMõh—WÉ&g+£-Ék¶a¥\cf6éM-MjVÒô‘ì9²º¹<å!V訬õ…ÙyÅÖt—³I ‡ B{N¯6TáÄp€^5ÓšŠO*?©KŒ¤¬c—ú®’Ë.5›”SZÂ0]ÐÜÔ̾Òã¡n¸Þ&ñV««‚½óÂŽÆq7Úua8}F?Sc"Ë?Xltåy2@Ï÷zèŸY¹etUáAߎ˜Nßó<½A*%ºNê-âÀž<>Fe‘2ì ‹w½ ÍÌ¡i‹„½8|ü°«]ò™¦0 Õ…pyKŠ]–Å%+kX!•Oƒêb…0H@—mu•®–XìÉ ‘Ä´CgÊnÃŒ¶ÒŽ YvN槯Ÿ6ƒý‘Á^¿ðê(k"dKI7×½(ðÃßéÅp´ßÎ#Äëe?H¤+ŸªwèåÌŠÜ=õ̃ó½IE%—¬Ú²ªˆµ»… j–ä›¶‰¶’аQW»r¼,süé²€øqÛ¶0BØ‹  ›?ð€ áÈ”ºg‚ ds$è†[±r]²ÏEbÒoäÈñ{#¸H âÜÔ8)Ò%ÍW… ]¶T—4Ö]E]—¢\+)ïO87Äïâ»ÁH0÷1?“öb`…îÔèÖ=ß·¸ÕÞn™Ž’¶œoOžÿz~öj¡gSµ¢ÚOÆÄ”0±bÊP5bv¨<Ÿ@Þ ¹Æp@¾‡óÃi±™È%Ûê—Žƒ¨ð6ypPÇÔÆ—-ÍI'”4É’Z«ŠeIey£åýk ·Ï ¢(ôý‘`ZElަURqþÔÐZR%ÕlÝ>äû æz#>uØê$L§ƒ8«Z-©ª]/ªÅÎîQmq‘e.‡ãÄzßRs ÇÂVÃ1¤Ü¤›RÍ|lz$¹ÙCÍG*<›–´2Z®Å¾m]²Ž©Äø&j¡ù=“zÜ‚&=Md’ô4cq²NLºn‡rl;‹¡J=Ä¡38Éá*JWp¥H÷ò Ûw#}/hxC ë›äI6–ä«$¦œðæ…ò‰Ñ›Š­w)>²ƒ´dhÉêkÕv-ÐŒ¸ =qWÓ.¿mrH0˜Î·§MC/Š6IÞðQÔ•ý yS¦¦ˆ“c‡=è4'r2Ášôüh¶5öN”ÉáG{Œôù/u¢Åë7sô:=~q1GO”u'rzÁ*Šd‚8›,RRÅCŠFö«o°®”¯±^äZ, #kÜ*‹]™›†µËD[^öD²Ó´Õw•Jrõy'.8R¡ÚàwY”TܱdKs»7Ì ÷½K¼é4æØ ³ýï–Š®þ€TzQ©Köq’YÙÁ¤™©4týh* ?Ë'rѬé\äï7wIHˆ\ V@¢ÎKð)ýL$nW‰êyHÊæÛh‘CB”ôEˆ wŠ$.²‹d-B69¿hÐŒ_†pûÝÈs\q)ÓjîFŽ~Eqº>\m^¼œöÝ…K/7’¢]û7Ü0}ñ¶â[#!ÝŸ$¥|wN nœ75ìÖ܉”ª.EÿÒ ÖÄå‚Uf_s2ªEMȆ({aå¯ãŒ”‡$ÂÚ·£óºù‘7bï–íkOUŠ×ð8eÀöV¼€ ðFxÜ‹zÕéÛ.>±z‘}ÃeèÅ8\¦Ç‚I3S‡‹o÷‹º>\^Oœ+¾Û¯6ú\É“¢ó¿Qÿ¢¢Ør endstream endobj 1395 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1396 0 R >> endobj 1397 0 obj 1859 endobj 1399 0 obj << /Length 1400 0 R /Filter /FlateDecode >> stream xœÍYmoÜ6þ¾¿‚ a%ê½Èp§pa_põ¶Á][´–Þ%ª—¤µ»—ô¿ßCŠÔjw¯ôz—8ð.šE@¾Yüø3LZ‘€&äiÌ„£˜ÛÅß`ó$¥QšEate4ÌsµEDS Êš|uU3ò®Õ³­öJPð?×Þ×( ÙÿFY/Þ,_½OHåƒ ,¤ynN£˜ä4b…úÃȲ&?>»Ý÷ƒ¨É oøZÔ¢žÿL–ß..—ÆF-@GƒŸŒêPš $q0ñÂlä;.ü‹i„<àP–€1j¨2'k~«K&ÚSøû¤gŒ(oñá9i—ý™›Ÿ9µ0 h>9 Æ"ÏýÓû“½6;Hµ÷hOqhO0 ¬W½ȃ¬DOÙ’~àƒŽ¯×äë¯ÿBn/—äýÕõå-ùëÕò™,¿ûþ’|!ï/®o/Éoè„#n HZÆ*˜ãܰzòƒŒÆäÙ°âe)z¸æ]yŒöáäbºâ÷°2†zx9™½|W Gúk=Å_‰]/NÛð-ôµPÎt¨¬x°¸=gÿT´²Èƒ’£ç=ÇìÀßµ¨Ûnÿ²æÛ­X‘ûÝÃèz:[—Æ4L²¢ÈÂ×}hª=áLíÈ“6D©òîÍéZP¢ä ¿Šr7Ïñ2§4È¢ÈS”¼TóáG|ÚÉG^ÁNPâ˶iD9ȶ!ۮ݊nØ[³ó®#°4l;ÜcÓªV÷œ§¢âNyîd”FÁIÔ.ËæÁ­Î&ðÇÌžæÉíÕ?.íòôÈrVPuQ«RPþSœ´V'pM„pÔI”z)üf*½ƒšTBGÚå¸á¨T7¤²ÄhÊ.;̳ô«]ÓËu#V–!›A¬!v ¬ä :^½>S*Â,¢pÁ½—GÓZÁB¸•lþ"¨ù¯²ÞÕŽa 3ËÒc]@h“‘l<™bÍï÷ƒðö6|pHEý 3üy0)À¥´ÝDU4ê7¢9!hªêzâŠwè^§i3K½0O\ª“U•”¦êTj9¼p¸i›—¶`i†W4Fí=ï„à´ á¼Ú on{[…,÷KRAú3{šJŒúN0êAE—ÛÊßÔ\V®æ0ÜZ1we‘¸RÅ£½EÀ©`ÂÍ›ù:4UAaÅ]YYÒ$I ‚dÿÅÚ:ßÅ«®‡w~¡šå5+’s¢Î•W–F4Π¸†Œ–×ß]-/É»Ëë‹¿Ÿ©° â?Êã `é¬Ä>uP’à+¾w>>So#(ö¬Èƒ “I½} wnî*®(~„¸Ï'¥×ð°ø€å×[€ DÛG¨ààçÏŽ¶] ¢/žDݸð·YhE¶Sk¿°¢²ÿQ%ökèÿ^Õ²ªäûæêúúêölSaÀBIÊÆJ¯´IŽ5Áh,ÂÑX„.”-óýˆ u Üó[Bd-ÿF`áùÙŸþÐAƉ¦<¡ˆ-äˆú}Szcm7:?Š$:ðVÕ®uáÏlÜQÇë$Cån´™x mBö¢H‚•D:xá-1÷ 3†™!þ‹ðvÚV¼ôæÊº+ YPí“{Ê^nzûáææjI,›û Ü8õÕh{¢>ÈÆŒ@±î¯{Ç1ö °ö j›Ò¢Û;¨¾ÏÜ:“#ã§gO‰æ CžÚÒ\(?=§ŽwáÈfW‹NzJéœsÐ\jî}S¶¢”R¬æ.˲—ɦ?rB³ICýnäî„/Õ¹¸ë¶mï°N$M× lëoqÄÞ@;K'œ'ÂIæu»k†c™VAÕöN´nôŒh~\Kîé1p·uo.ãòŽ÷: ·¹©ñ3Á¡¥#cþՆޭo°ØØ¬PíMÛ[ÒVŸÑdEª;gÀôOm6«²ÿÅ’»N6ë™ ø*µ‚QC˜M×0´´Z‚·j苪úwÚm;i Ÿ§©íNÜðþÈÇmtà¦{UšÂ‡‡Š©~Óî*øÌ¤; Eù=Tǹ 8¡´AžÄ(Hbºk;öÎ3¶§©ˆÀü–õ–—º!WÈŽ%"¶ñ¦ˆ\o Yµ|eÈ^;®º±þ…áp+ ý¬(ѬecÁÆMh­²\†Ä[dºÜÜ:±“õ%J«Ûn{ÄMiJ‹$à .4ùÞþØÊ•nM_}»Ó «ºEü~jÕ>5ªñ„›ßïŽìç4Oó ã w¸TeµÐ]ëцϵkºÕÅfy…½4oö؇¼€[×oÕ{w9©c-~4Ë´›EüG·êIÄhZ$EåÅÞªKu‘žnÖ3h“U‡EGö1ͺ>ž;}> endobj 1400 0 obj 2183 endobj 1402 0 obj << /Length 1403 0 R /Filter /FlateDecode >> stream xœÍioÛ6ô»?¶@Êê–\tœÄÙ²&M«èŠ¢(h™N„Y²#ÉqÒvÿ}7uÄè°®[› ï‘||÷AÝŽ\äÀÿgìO<öPVŒnåš‹bù‘\ #äÆ8rT ‰$a‚Vì` dG$èóUyZ 7èݨ9èçчph¢ÝÈé].®™~æa„ý(ÇRV»IÂXø8 +ÐóÓÂCÇk~ZIÏ.rþsém‰|×ûHä ëÑa:z~"×AéÒ„@ìâÄ3G~€ì{cöÏCi><™=Ô -Ð9)É5-hÙ<ýˆÒ_GÓTêÈ/àQäÁOŒy(µ6ÂÀiïXa¦×Í*üØk°‚½”a[+éYù—m(0ä–µŒ¼Ê"îú‰›ìG2ßãFè:8i9ÃóËüíûÁVë9’ñ~\§XéM^£§(r±‹ždë¢ åÂà¤Ôðœjp[Ssf]®4²»¡†¢¹¡•!²Ø”k .HCÌC{49úezl®"󭱯[R[ ½ÝæwdùaH×¶@–ªeI³&_ž›j½¡Uó |ûüdÜ·žçtÌwSß®sœ‘ì†~Zæ+ú©Î€¿º¢ç×Oú—`qÜâxØaG’8Qnb¢{£'œƒÆ–$kÖ•Fór‘g¤¡µ^ilÒü³AÖËÁ3Û2o†ÎÔÀŠÏЖô¢’@ƒó‡FxM '–œôž›=Ð »¼¹Ñù6e-\/9 ¯Ö»žqàc\ˆ…†äe^^#‚ꂬVˆë-0àºírXƒ°GÀI­ÎHuM+jT¾]lWMj!fÄš‘‚žqˆcßqº<—ã‚¥aUˆ›ƒ¹åøp<àJ–ŒôžfÛ†Â}Ý€ŸY/è_=ŽqÀ®v|×Jsø±ƒÝo%‚Jôh¸‰ ³Ø.„R×còw“ÁwÇ{nÊ.îç¡ ”.óa µP4ÈiŠNNϦ3tvqˆfG“³©¢è¨éŒ››ø‚¾¦ b"×hµž£–ÜuÀ<¶bèåÀÆC¯Ð‹?¡ÑKq|²¥¯µpLì1Ža,%>º!å5Ïóg‰ƒ#•ÄQy#Q8 ·‘!ñ­K™JØ é¹E–— ­6mx§Ð‹þ#>ª< ]¾ KÙôMÜ|ÏÀ¢)dµ‚ô쥇;Ž:ÆŒ‚ôÈ|æ QVÈ|©`Yåbª¡À3²!YÞ<`½"´‘§¥ìêl©á¹Y®èb›q{ <7§ÖÕ‚Vã-Mž) iïè£bÑå2ÏrZf–`§F½Æ’Qú] ¤2Ä:Òôlé9IÇ–¼‚rqarò®¯@¸«¨Cà@/q°:lh©†•ÆKr‹ÎÚ#µtˆ…ÔºÝT6ç–ô¾1Dok›¡¥©ZUÄçå :²[÷ŸÐSÛF²Ê± - V$®?礌…EFB¼¦]v 0ÔPàY}ôúòâôM:ôêó/&‹þaQ̾ t;³3‹ÎtrÓpúþrߨÄ>özIÇ? æa³obÆA§,¿lÓ ëB¨—âPI úŠKˆ¾ óéùÅÕ{ôÉûBÓ$I·YîÖHf4„+4ErGò·KlÒfÁ^î Bߌ\m›¿Ÿ¦žyNˆý摘õØ+R×;»­¥o³!ž"aýàQFêZ›B<6·ÃC:ûƒÚBȇ›Ú_³Ñð>g]×È™eÀAT(-źo"Ï똈,м„Ы@AxST[è?{9 ‚N˜±œ9ž@ÖLfSt9™ÍÞ]\‹’ƒNÞ¾9JO/Þ´>\ÿß®&> endstream endobj 1401 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1402 0 R >> endobj 1403 0 obj 1859 endobj 1405 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.906 605.718 539.999 614.718 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 1407 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 593.718 145.33 602.718 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 1408 0 obj << /Length 1409 0 R /Filter /FlateDecode >> stream xœÍksÛ¸ñ»~úå’Ì84@|¤¹Ì(¶ûêÈ9[éuærÓ¡(ÈbC‘IÅö\ûß»x !¹î—k/w'ìr_ذØ|›„áÏkþ§>Ê·“o GPì£ R(!{NÐ) ¡ *9á`ÉIÔ2XE- úeRM0ú0ùõ7 Z!ìQt?ÁŽp)æfò3(§‘DIš¦ÊVß#IÂU^‹|‹Ž/¶>:­µ¶ž Âÿsëm‹âÿX„Ñíäýbr|FÁh±6)/ ÀÍQ¢Ä ü”ÿã£Åýúòæ±íØ}̪ì–mYÕ½ú -~šÌjB€È"þ=‘Jƒ4ÄÃ/Všõxƒ…ÿB/8Àx>…ÍðO¥Š¬úåô’ OÉ߃žQ¢,æqœ„ËþHåO„„3ì%ƒ`ø>µÜ?L°?ØkN ¹î~?Ñx?ØI¬–uh•uÙ2kºËÚö¾nV(ß°ü+Z謁+êJnöø,uÅØK}ž´q*å½å_!âcô²—«à^¼‚¥hen»¬™þNcÞ¼ùQ/of ½<.¦ï§73 šÞÜüru}ªá“óÙÉ_ä,»Cd÷ÙçùÉââjŽ~Go›z×CËzõøýͯæ3ô/í'I0ЍGI ÂâPJ[lø¦_Cæè¥×#¸\­Yw›ƒdõÚ¬3³´ÜÖËÈ:m²v/ß_§×'çÓkƒ¸ËšlË:ÖXäÕÊÚëvMµ_Øû««ËÙtîÌbcok˜Hö'RBpF©—ô‘ÀÁ< )Th„1ö‰+R'ÄÁø¥pS8wC—Ù(owËmÑuleP™eèÀ}êseÑZÅõ癊µµîÌ:¯«uÝlmÔö×í]ÉŠîÑ Dm™t6½¼™9aHÒѶÁ°bU³Uuç9 „7„@ýP2Èø æñ>(’x¡@ àŠse¼µ*LŠd ¼;8‚/ )û>qÆž<« °´ µñ7?_ZDe-Ž&Jº<ì"^e¥Áü”}Ï dW§Ä4lÍVåÌ38],²×yý¨WÖGKTçºÜT?à0”M¢']ãðQ/Ž¡Ù#ñ6pÑk7üpDvQ}¯¿‚Õ×2œíˆ.Õ„çI‚=ÌhL 1~‚:ßdwת0òb UDTehVE›-K†:îð-Þªh·Gˆ{²“+t8s)ñ‚ì¡åu…ó+âpžÆô)^ÄÓ²²½cy±.ÀqEÝ^¶Bpæ‹ 2*ÀÄãu›úÑ>ÁËì yABŸ’²§úá0á!ÁV4WUùˆ2´káü»/º0ûôý55¸›ï=°|×)×÷wûÙ)tÁ)ÜÌ1Iu6 iì!ã‡] ž*ëû#2yÅöÆOÛ ‰ò3¸†q›V^ß®A»ó.*}‚KQs;Õ>=ÀaEƒ”züFÁ!kh³^èÅ8–T[‚¨’£lI%Jî;H” £U¡´9cÝÊšAÀÆñ[÷{G¢çô=yŠ’Q÷èÃ9ëû1ÖÅě۾«íÛYÑÇ"ݦ:uãû„÷@p2&úXAïg.æhº¸úxqâ2îbÐJÒž¡‹3ÄÛ¿_Îæç_úæéË+ôEhq>Û£:$æªýÄBèz¶ø|=G¼Ïù³ËCÁ?œ'I Ïì’·ñ)¸ÒÒ$éù¢¥Ù£€7<#€†ù)lquœ:ÎZ—.MÀì“DÏšým1»žO/Ñ|úqæ p2Þà‹“Kõiº8S7·^V‰ÿç9k[o*~NJxL)ÔGÖmêÕ W0<뇻:>g©8%·‚ Áq¼bk¸%V¨,¾ÊÚ•Íæ’¬ö}·[–E.NrøYÖpÎÉlÛóååM×Õ-­1$Ðï®X¸l†îäA’­²dCúU»²D?ü ^ɪ[¸` Ý04yò©W[A§„4щ{Á;o^¹ª “Ë»ºm Þ6h„hÁå²awe–[Ÿ6f nÍv¥i=%"ÛyþËT(Ѳ«ïXùØ£ÄÚ³õ+«½Ôê3£n>³ «SݧÜu%ÜÃCçÀÝÍ(¼,Ú]¾Aðö¹<~òh^{C`ge ÉÄ2 êŠ-Ó} â§ážz›~æÒââd*Êlx8î„´7”`ã~[Öd‘g @B ½PH¡Æ|8¡£ ‡ˆ ¬=ú Î胚Ñ5£:}pxèwæ“‘©öУO1vèŸ)Ïš„ð„NáòMiÙÏAöüCÂj®!Qgr)Vrie«D¨g•,) ö£J¢Ô›êƒœŠÈu·i˜1NYìŸõ­-Ú¯‹¦í\jÇ÷Ó‘‡À<^»ªø¶c¨>Ýî뤑Aᬙ/.^PœçHô½âý²)š1™>qÜ6›ú ô<öáí,í™YOÙ8òÈždUxõš–€|MË5oµ TXTÝ}m€U±áê ê.ë¸vád…º°Ù7–íò!ëÑÀŒÆ@ÜK­·;›Ù¶¾íêæ ýæº0Ä#ö'g ³ ¹V»€ kÛÛ½ õÛPì›zW®ªA-méý^$\2Ã: &³­ÊªÇƒ&è9£¢lž¯Þu%õ¸R<áŠÛŠËÛ“Åð°&ƒþAú›"¨âÖÔ N²# §®â.•hPzªEôWxOÐØäbúÆìïËǃêÜSôyåY¸‹õA9ƒ°&hêûÖÖå:/‰GÎkv•¸°ÙCÎî„@nŸs)fEÙº±ˆpêÅ>ܬI0x·ËríÓ[ ú÷yyŸ=¶HÏFE£W¬Ç ùÀ`'Ëõ®Ü£8ð½î?쇡‘ÉõhPpѨÜF„¶79lOn‰{óEYÈ“„¯åp^P×e/©/˜È*¾Þdß{¢%c½ªÛ&«ô„™ô£Þ¡y> endobj 1409 0 obj 2373 endobj 1411 0 obj << /Length 1412 0 R /Filter /FlateDecode >> stream xœÍVKsÛ6¾óWìäy¦Á7ØžhYi쉕‡˜ig¢` ’˜ða“`dO'ÿ½ ")ÒisJKIærwñí‡}€¾7L øy¡n~`Aœ÷Zg‚oíi•ëé2È@?0—AªODå¢E»Ñjïöa¹Aáwãã'tÚ%. :oaVÆ; îzÄöXš«ELÆT›x(Äœ_e\÷‘½¢ÿ9û!#Û´þŒ(쌋È8é‚I!Úö-à›„Ù˜fÏv€Û ÔeA”ÁÇÙê±’"ƒžóÈD.Ï>Atm,"½Ç é" ¿>iZéÄà:ôÔ2h³Nßkñç»Õ¡†X.nF™R]Y}W†£è6™jïßÍŒ†,שIÙÏ þ%Q MJØI1,ˤÿ´Á~rÖ&…T±¿¿:i¬h/à ™“f×ü+ï¶uˤÈ;Eµ/êtÓ=–BÖeo彘ä•äyÜãÛ^,wd_ݧ›[òys“ëË‹yX–üñ‚WIܹÅb”u,EðÈ}®“V²Lò¦«3•»ºŸÁÖ-:Ú»Üs Jr¤ 3Q©€œg¢"“åŽEl›Rj2»]þ&OC]‰r áò"lQb̈xq-’ 0)²]Ò5%cš¾ªià[®`Ëá\ ïøXVêWqfP Øb¹_˜hrìÇ Z1Ub»&…ãê®›ˆKÍÀ3ÇM¥qÚÆ:Bõ½uotðG³éYxáåéˆJa?XY`k„<Œ>0dÐ0>qUgۘÉâR ümW‡è£jÕ‘Î8¶fÓ$¿Ïø˜Ï¿†?æ¡'iè&96d†ùؾnÇÕ"‚Ë0 /ÂÕÂÑ«Å2ºš‡ÑÕ›%¼ü°œ7ÂâÏhñ~¾†ex³˜´8¾|Æ(µ¨ÙbÂóùëpµzF¯~U£Ëóæo‹ª"as›§åVµxeÎÓ!÷Åæù>À6W”YàµðççÍÌ4çNÖ,”Ø&9~š|iGg„ù%®Bò§Eº«oS> endobj 1412 0 obj 960 endobj 1414 0 obj << /Type /Action /S /GoTo /D [1043 0 R /XYZ 72.0 576.06 null] >> endobj 1415 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 709.5 135.43 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1414 0 R /H /I >> endobj 1417 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.385 709.5 539.962 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1414 0 R /H /I >> endobj 1418 0 obj << /Type /Action /S /GoTo /D [1232 0 R /XYZ 72.0 696.0 null] >> endobj 1419 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 697.5 239.064 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1418 0 R /H /I >> endobj 1420 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.556 697.5 539.819 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1418 0 R /H /I >> endobj 1421 0 obj << /Type /Action /S /GoTo /D [1247 0 R /XYZ 72.0 630.645 null] >> endobj 1422 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 685.5 173.9 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1421 0 R /H /I >> endobj 1423 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.464 685.5 539.924 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1421 0 R /H /I >> endobj 1424 0 obj << /Type /Action /S /GoTo /D [1259 0 R /XYZ 72.0 328.698 null] >> endobj 1425 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 673.5 234.094 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1424 0 R /H /I >> endobj 1426 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.541 673.5 539.819 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1424 0 R /H /I >> endobj 1427 0 obj << /Type /Action /S /GoTo /D [1259 0 R /XYZ 72.0 275.48 null] >> endobj 1428 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 661.5 266.935 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1427 0 R /H /I >> endobj 1429 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.553 661.5 539.774 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1427 0 R /H /I >> endobj 1430 0 obj << /Type /Action /S /GoTo /D [1262 0 R /XYZ 72.0 696.0 null] >> endobj 1431 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 649.5 289.62 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1430 0 R /H /I >> endobj 1432 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.625 649.5 539.773 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1430 0 R /H /I >> endobj 1433 0 obj << /Type /Action /S /GoTo /D [1265 0 R /XYZ 72.0 618.912 null] >> endobj 1434 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 637.5 309.891 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1433 0 R /H /I >> endobj 1435 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.62 637.5 539.703 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1433 0 R /H /I >> endobj 1436 0 obj << /Type /Action /S /GoTo /D [1271 0 R /XYZ 72.0 386.56 null] >> endobj 1437 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 625.5 260.822 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1436 0 R /H /I >> endobj 1438 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.608 625.5 539.848 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1436 0 R /H /I >> endobj 1439 0 obj << /Type /Action /S /GoTo /D [1277 0 R /XYZ 72.0 444.218 null] >> endobj 1440 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 613.5 296.525 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1439 0 R /H /I >> endobj 1441 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.61 613.5 539.735 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1439 0 R /H /I >> endobj 1442 0 obj << /Type /Action /S /GoTo /D [1283 0 R /XYZ 72.0 463.75 null] >> endobj 1443 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 601.5 162.265 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1442 0 R /H /I >> endobj 1444 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.428 601.5 539.923 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1442 0 R /H /I >> endobj 1445 0 obj << /Type /Action /S /GoTo /D [1288 0 R /XYZ 72.0 262.316 null] >> endobj 1446 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 589.5 170.57 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1445 0 R /H /I >> endobj 1447 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.453 589.5 539.923 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1445 0 R /H /I >> endobj 1448 0 obj << /Type /Action /S /GoTo /D [1297 0 R /XYZ 72.0 147.368 null] >> endobj 1449 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 577.5 168.377 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1448 0 R /H /I >> endobj 1450 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.448 577.5 539.925 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1448 0 R /H /I >> endobj 1451 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 565.5 172.981 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1316 0 R /H /I >> endobj 1452 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.486 565.5 539.896 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1316 0 R /H /I >> endobj 1453 0 obj << /Type /Action /S /GoTo /D [1312 0 R /XYZ 72.0 574.725 null] >> endobj 1454 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 553.5 222.01 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1453 0 R /H /I >> endobj 1455 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.505 553.5 539.82 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1453 0 R /H /I >> endobj 1456 0 obj << /Type /Action /S /GoTo /D [1312 0 R /XYZ 72.0 506.895 null] >> endobj 1457 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 541.5 198.531 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1456 0 R /H /I >> endobj 1458 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.442 541.5 539.882 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1456 0 R /H /I >> endobj 1459 0 obj << /Type /Action /S /GoTo /D [1312 0 R /XYZ 72.0 254.775 null] >> endobj 1460 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 529.5 146.66 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1459 0 R /H /I >> endobj 1461 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.35 529.5 539.957 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1459 0 R /H /I >> endobj 1462 0 obj << /Type /Action /S /GoTo /D [1321 0 R /XYZ 72.0 603.516 null] >> endobj 1463 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 517.5 177.378 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1462 0 R /H /I >> endobj 1464 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.411 517.5 539.919 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1462 0 R /H /I >> endobj 1465 0 obj << /Type /Action /S /GoTo /D [1321 0 R /XYZ 72.0 204.179 null] >> endobj 1466 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 505.5 202.308 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1465 0 R /H /I >> endobj 1467 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.492 505.5 539.92 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1465 0 R /H /I >> endobj 1468 0 obj << /Type /Action /S /GoTo /D [1324 0 R /XYZ 72.0 696.0 null] >> endobj 1469 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 493.5 202.298 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1468 0 R /H /I >> endobj 1470 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.492 493.5 539.92 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1468 0 R /H /I >> endobj 1471 0 obj << /Type /Action /S /GoTo /D [1324 0 R /XYZ 72.0 543.464 null] >> endobj 1472 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 481.5 234.432 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1471 0 R /H /I >> endobj 1473 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.576 481.5 539.853 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1471 0 R /H /I >> endobj 1474 0 obj << /Type /Action /S /GoTo /D [1324 0 R /XYZ 72.0 212.524 null] >> endobj 1475 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 469.5 302.381 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1474 0 R /H /I >> endobj 1476 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.741 469.5 539.848 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1474 0 R /H /I >> endobj 1477 0 obj << /Type /Action /S /GoTo /D [1327 0 R /XYZ 72.0 648.0 null] >> endobj 1478 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 457.5 223.135 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1477 0 R /H /I >> endobj 1479 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.541 457.5 539.852 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1477 0 R /H /I >> endobj 1480 0 obj << /Type /Action /S /GoTo /D [1327 0 R /XYZ 72.0 454.584 null] >> endobj 1481 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 445.5 219.516 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1480 0 R /H /I >> endobj 1482 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.511 445.5 539.884 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1480 0 R /H /I >> endobj 1483 0 obj << /Type /Action /S /GoTo /D [1327 0 R /XYZ 72.0 303.004 null] >> endobj 1484 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 433.5 221.166 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1483 0 R /H /I >> endobj 1485 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.518 433.5 539.886 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1483 0 R /H /I >> endobj 1486 0 obj << /Type /Action /S /GoTo /D [1327 0 R /XYZ 72.0 135.102 null] >> endobj 1487 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 421.5 201.76 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1486 0 R /H /I >> endobj 1488 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.491 421.5 539.921 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1486 0 R /H /I >> endobj 1489 0 obj << /Type /Action /S /GoTo /D [1330 0 R /XYZ 72.0 610.883 null] >> endobj 1490 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 409.5 200.747 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1489 0 R /H /I >> endobj 1491 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.45 409.5 539.883 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1489 0 R /H /I >> endobj 1492 0 obj << /Type /Action /S /GoTo /D [1330 0 R /XYZ 72.0 475.576 null] >> endobj 1493 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 397.5 181.079 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1492 0 R /H /I >> endobj 1494 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.488 397.5 539.927 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1492 0 R /H /I >> endobj 1495 0 obj << /Type /Action /S /GoTo /D [1330 0 R /XYZ 72.0 368.08 null] >> endobj 1496 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 385.5 312.542 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1495 0 R /H /I >> endobj 1497 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.698 385.5 539.772 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1495 0 R /H /I >> endobj 1498 0 obj << /Type /Action /S /GoTo /D [1330 0 R /XYZ 72.0 132.456 null] >> endobj 1499 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 373.5 207.85 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1498 0 R /H /I >> endobj 1500 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.509 373.5 539.919 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1498 0 R /H /I >> endobj 1501 0 obj << /Type /Action /S /GoTo /D [1333 0 R /XYZ 72.0 696.0 null] >> endobj 1502 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 361.5 216.712 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1501 0 R /H /I >> endobj 1503 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.539 361.5 539.921 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1501 0 R /H /I >> endobj 1504 0 obj << /Type /Action /S /GoTo /D [1333 0 R /XYZ 72.0 489.6 null] >> endobj 1505 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 349.5 228.679 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1504 0 R /H /I >> endobj 1506 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.595 349.5 539.889 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1504 0 R /H /I >> endobj 1507 0 obj << /Type /Action /S /GoTo /D [1333 0 R /XYZ 72.0 437.6 null] >> endobj 1508 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 337.5 271.826 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1507 0 R /H /I >> endobj 1509 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.643 337.5 539.848 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1507 0 R /H /I >> endobj 1510 0 obj << /Type /Action /S /GoTo /D [1333 0 R /XYZ 72.0 297.6 null] >> endobj 1511 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 325.5 269.072 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1510 0 R /H /I >> endobj 1512 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.634 325.5 539.848 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1510 0 R /H /I >> endobj 1513 0 obj << /Type /Action /S /GoTo /D [1333 0 R /XYZ 72.0 224.0 null] >> endobj 1514 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 313.5 226.69 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1513 0 R /H /I >> endobj 1515 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.534 313.5 539.884 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1513 0 R /H /I >> endobj 1517 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 301.5 218.46 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1516 0 R /H /I >> endobj 1518 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.47 301.5 539.846 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1516 0 R /H /I >> endobj 1520 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 289.5 238.276 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1519 0 R /H /I >> endobj 1521 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.573 289.5 539.886 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1519 0 R /H /I >> endobj 1523 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 277.5 169.454 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1522 0 R /H /I >> endobj 1524 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.452 277.5 539.926 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1522 0 R /H /I >> endobj 1526 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 265.5 190.676 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1525 0 R /H /I >> endobj 1527 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.457 265.5 539.923 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1525 0 R /H /I >> endobj 1528 0 obj << /Type /Action /S /GoTo /D [1336 0 R /XYZ 72.0 465.6 null] >> endobj 1529 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 253.5 213.393 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1528 0 R /H /I >> endobj 1530 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.53 253.5 539.923 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1528 0 R /H /I >> endobj 1531 0 obj << /Type /Action /S /GoTo /D [1336 0 R /XYZ 72.0 207.84 null] >> endobj 1532 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 241.5 236.939 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1531 0 R /H /I >> endobj 1533 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.582 241.5 539.851 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1531 0 R /H /I >> endobj 1534 0 obj << /Type /Action /S /GoTo /D [1341 0 R /XYZ 72.0 490.404 null] >> endobj 1535 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 229.5 227.806 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1534 0 R /H /I >> endobj 1536 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.574 229.5 539.92 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1534 0 R /H /I >> endobj 1537 0 obj << /Type /Action /S /GoTo /D [1344 0 R /XYZ 72.0 720.0 null] >> endobj 1538 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 217.5 211.748 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1537 0 R /H /I >> endobj 1539 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.524 217.5 539.922 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1537 0 R /H /I >> endobj 1540 0 obj << /Type /Action /S /GoTo /D [1347 0 R /XYZ 72.0 720.0 null] >> endobj 1541 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 205.5 211.19 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1540 0 R /H /I >> endobj 1542 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.523 205.5 539.923 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1540 0 R /H /I >> endobj 1543 0 obj << /Type /Action /S /GoTo /D [1347 0 R /XYZ 72.0 679.314 null] >> endobj 1544 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 193.5 237.729 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1543 0 R /H /I >> endobj 1545 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.568 193.5 539.882 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1543 0 R /H /I >> endobj 1546 0 obj << /Type /Action /S /GoTo /D [1347 0 R /XYZ 72.0 562.17 null] >> endobj 1547 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 181.5 205.638 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1546 0 R /H /I >> endobj 1548 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.505 181.5 539.923 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1546 0 R /H /I >> endobj 1549 0 obj << /Type /Action /S /GoTo /D [1347 0 R /XYZ 72.0 134.166 null] >> endobj 1550 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 169.5 197.902 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1549 0 R /H /I >> endobj 1551 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.477 169.5 539.919 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1549 0 R /H /I >> endobj 1552 0 obj << /Type /Action /S /GoTo /D [1350 0 R /XYZ 72.0 537.822 null] >> endobj 1553 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 157.5 290.363 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1552 0 R /H /I >> endobj 1554 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.662 157.5 539.807 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1552 0 R /H /I >> endobj 1555 0 obj << /Type /Action /S /GoTo /D [1350 0 R /XYZ 72.0 303.718 null] >> endobj 1556 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 145.5 139.89 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1555 0 R /H /I >> endobj 1557 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.397 145.5 539.96 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1555 0 R /H /I >> endobj 1558 0 obj << /Type /Action /S /GoTo /D [1350 0 R /XYZ 72.0 225.392 null] >> endobj 1559 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 133.5 196.776 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1558 0 R /H /I >> endobj 1560 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.475 133.5 539.921 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1558 0 R /H /I >> endobj 1561 0 obj << /Type /Action /S /GoTo /D [1356 0 R /XYZ 72.0 353.028 null] >> endobj 1562 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 121.5 192.34 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1561 0 R /H /I >> endobj 1563 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.46 121.5 539.92 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1561 0 R /H /I >> endobj 1564 0 obj << /Type /Action /S /GoTo /D [1369 0 R /XYZ 72.0 520.8 null] >> endobj 1565 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 109.5 232.215 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1564 0 R /H /I >> endobj 1566 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.552 109.5 539.884 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1564 0 R /H /I >> endobj 1567 0 obj << /Type /Action /S /GoTo /D [1392 0 R /XYZ 72.0 597.103 null] >> endobj 1568 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 97.5 271.426 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1567 0 R /H /I >> endobj 1569 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.601 97.5 539.807 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1567 0 R /H /I >> endobj 1570 0 obj << /Type /Action /S /GoTo /D [1401 0 R /XYZ 72.0 178.0 null] >> endobj 1571 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 85.5 215.057 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1570 0 R /H /I >> endobj 1572 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.533 85.5 539.92 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1570 0 R /H /I >> endobj 1574 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 73.5 128.587 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1573 0 R /H /I >> endobj 1575 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.392 73.5 539.929 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1573 0 R /H /I >> endobj 1576 0 obj << /Length 1577 0 R /Filter /FlateDecode >> stream xœÍÝQs]G’Øùw} <ÊÞëªÊÌÊÌÇn©{¶g»­éf;6b~@Sh »$(ƒfôí·òÐ%q¤ûñ®Çöà¿.@ü('Y§Îÿü¢_µõ?ÿ[ý/ÏqõöýÿóémýÊǕ̧7Ù¼ê~š-®Þ_=ý$,®ÞUøÙ+yú¡lo}ªòýÕÿùÅÝíê_¾øïÿcEß^µ“]ýûm÷â/óæ‹¿®wnó$32óéc§QïBNsýàíû«ÿò§÷ãêë[ýüÑ× µÿÏ?úO?"éãÿQ»úî‹ßÿý‹ÿòG»êíêïÿ<ÿ˜rò¬ÿ3ô*N2|õ÷÷WÿýËÿýçnîßüõÏWÿíãÍýÕ¿üxûíÍúWÿ×/þð÷§ßåöÛŸ£±þ¯Ÿ¶?LŸý‚iûüW>ùƒöËÛÏo]ÿOOòø¶õ–Ó°õÛ©_z÷dûô¿ëžhÛçêñ¿ú¹yz©O¿”Ú>iÿ+ßùë(>N>Zk}ŒõK§øLå§ÛÛO>ÿ“ö¿ø“·ó¬÷ýúoëàØ7?ÝÜÿt{óï¿£OÿTª¬O@“¾[rõŸVÑûú“óåËU~jÚW¬òvš&«Ù­:½l´´yy´Ú¸¼ÍZ­_Þöàzr½ºÞ€]ï¯w ×;àëøõû ‚R‚ÚÚÌyA,$ž$Në ±‘8@lÄJbñ$‚“N"8‰ A'‚Nƒ "˜D0‰`Á‚£ÁÑ€àh@pt 8:ŽÇ‚cÁ1ˆ A!‚B•*T"hDЈ =}'Óý‚6/oç­6.o½ƒVAë—·Ñ@+ nܸ%pËËݤ]î&ír7i—»I¿ÜMúånÒ/w“~¹›ŒËÝd\î&¸ pà&ÀM›7n Ü ¸p3à6Ûn¸9psàæÀÍ[·nܸ%pËËÝ´]î¦ír7m—»i»ÜMûånÚ/wÓ~¹›ŽËÝt\ pà&ÀM€›7µ“ûú.¢ c^]m¯ÿT[Kß¿_Y¶þÏôµlÄnY÷±û¾]C¾¨Þ<ÜßÞ}Wïbý äW_^ß}{þÉïoï®ï>ÿüeüÇïÞ>Ü~¸û¸yø©Íõ3™ûwy^¿Q¬t¶ª eõg$ZS?xoû9ÈDu’zû›ùòÚP¤Þþ~¾¼VT;¨Çö·ôå5±XŽF,G'–£ËщåÄr b9²d)ÈR¥ KE–Š,Y²4d¹ Ç=#í‚xŽ_ ‰'‰ÄÛpüâØH Þ†ãÇJb"˜D0‰`Á‚Ò€ 4 ( J‚Ò t (Ê‚2€  "(DPˆ A%‚J•4"hDЈà$‚“N"èDЉ Á ‚AƒL"˜D0 6 ¨ j‚Ú v ¨j‚:€  ¨ƒ "(DP‰ ÎÓ°lm}ë†5a1³U}+ýú2§°ÕÎ8It—ýˆe}”ÚØ×Š­ú¯?¾¿¹¿}[ïc}¯d¿26YÿAem,ì&û—9¯ß-³“¤®q¼÷_Y§¨MÌ)¹_¶»è_ß2‘ZQí¤^ ¤TOT'©WAjC5²Td©ÈR‘¥!KC–†, YNd9‘åD–Ž,Y:² dÈ2e ËD–‰,“XŽF,G#–£ËщåèÄrtb9:±ƒXŽA,Ç@–‚,Y ²Td©ÈR‘¥"KC–†,mY®oµºN» žÕŠj'µ7T ª'ª“Ô1Pm¨F–‰,Y&±\¿ˆjb)XJ#–Ò‰¥tb)XÊ –2ˆ¥ d)ÈR¥ KA–Š,Y*²4diÈÒåD–YNd9‘¥#KG–Ž,Y² d™È2‘e"Ë$–Úˆ¥6b©Xj'–Ú‰¥vb©ƒXê –:ˆ¥d)ÈR¥ KE–ëoû¬S*+Ö U§dä˜dYme³\[|ÿÞ=öƒVÕÕ××7õbÛ+÷÷Û÷Ÿüìi_ÛãOþt÷psÿÓõ»ó[^ßÉ6Nm]RlŸ„Ý;<¯?˜øh›­YL´,NÞ£µ!c¿ìhôCjEµ“:ªÕÕIê¨6TËýšXÖèÔXÖè‡ÔIJF? IJF?¤F–‚,Y ²Td©ÈR‘¥"KC–†,­,=ÃÛÁ_ÍG£R+ªÔÞP-¨ž¨NRÇ@µ¡Y&²Ld™Ä²F?¤&–5ú!5±¬Ñ©‰e~@=ˆe~H,Y ²d)ÈR‘¥"KE–†, Y²œÈr"ˉ,'²tdéÈÒ‘e Ë@–,Y&²Ld™Ä²F?¤&–5úu'–5ú!5±¬Ñ©‰e~H,Y ²d©È²öØlM²ƒñŶÇN[†u´ìÓ=v»e=^ÞÆ¨qUp~Vý2¿ÙvòYíä{øpþñßn~øpÿðɯ}sþÉó èñgÿׇ»›ýµ¼žR4Ómîß÷yíÁ çX©(XV³€õ©lͺì—ÍHí¤î Õ‚ê‰ê$õ¨6T©Y ²d©ÈR‘¥"KE–†, Y²œÈr"ˉ,Y:²tdéÈ2e Ë@–‰,Y&±¬Y©‰eÍHM,k@jbY³PbY³R#KA–‚,Y ²Td©ÈR‘¥!KC–†,'²œÈr"ˉ,Y:²tdÈ2e ËD–‰,Y&±¬Y©‰eÍ@݉eÍHM,k@jbY³R#KA–‚,Y*²¬Y@Zn»¸ü"öñ~»Õf;x'¯/«Y@ËW®´g3~m°~UŸg?>Ïž~íqðø“¯~¼¿¿¹ûäWkOÉÃíû›Ýõ¨Ÿfæo}ì?‚óòÝÅc[¿=]mZ&§ŒhmZî—í¯P'ª“ÔëO1© ÕAêõ§˜ÔŠj'µ5T#KC–†,'²œÈr"KG–Ž,Y² dÈ2e"ËD–I,ë]RË:EÔXÖIº¤&–uš.¨±¬uI,Y ²d©ÈR‘¥"KE–†, Y²œÈr"ˉ,Y:²tdéÈ2e Ë@–‰,Y&±¬3xIM,ë^RË:‹—ÔIJÎãõ –u&/©‘¥ KA–‚,Y*²Üþ­ª¯ S#Wnu=;¹h{¼”]—Ííè"uý`)»¾ùüµKÙõå—KÙíÇø‡ûë·ç7\ß}ò‹ïnÞ?_ÊnoøðÏOÂó_»Â­›Ìs}ž¦úþ;/?¸,ku¯ÖÑ2=õõ-oúÁgáèòìòx]XHàL™.·¡B‹•z'˶c§Ÿź[Öcî‡ ½½¼iùó·§þË¿Ûn?þêÃÝO7O{·7z“×>_ß7Ž©SÚ¿Æ/Ë_®’“ד(£;Yå'©Ë×™v°êåg½×?W\X>Yž(¯² ¹±jÝ0…r¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜êdª“©N¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘ª6¤ª ©jCªÚªv¤ª©jGª:ª¤ªƒ© S¦*LU˜ª2ÕíÍÑzGß¿¿6ÝÚ¹¾©ÜNk˶‡v®eG\Ïv0/Âø—›»›ûLJqÖl×~e('›™uurð:Ÿ¼ÀnJ;NÍŸ¯jÐB;Õïok÷ ÷Óà@ùºüG¹²ÜQ¾.ÿQ.,Ÿ,O”¯Ë”3UaªÊT•©*S5¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÁTƒ©S ¦šL5™j"ÕºÑåHµnu%yGªu³+Ê‘jÝîJòTë†W”3UaªÂT…©*SU¦ªLU™ª1Ucªëòß<3¦ù%ùºüG¹²ÜQ¾.ÿQ.,Ÿ,O”¯Ë”Ë™j2Õdª‰T¥!ÕºåHµn†%yGªu;,Ê‘jÝ‹r¤Z·Ä’\˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÉT'SLu2UgªÎT©S ¦L5™j2Õdª‰Të^Y”#Õº[–ä©Öý²(GªuÇ,Ê‘jÝ3‹r¦*LU˜ª0UeªëËAjõÍ=·yp=½gäÑwò¿²ð³‰ðnaÏ~0Ö—Gw½ùùãÃÍûÇ÷²=1øÕð¬ûˆ×ï/^å“õ/—å)¢NÜÊ£÷þúºÚK¬u¼YË8X¸O–'ÊëŒ$7–ÊëŒ$W–;Êë1Œ$gªÂT…©*SU¦ªLÕ˜ª1Ucª“©N¦:™êdªÎT©:S ¦L5˜j2ÕdªÉT©Ö^b”#ÕÚKLòŽTk/1Ê‘jí%F9R­½Ä(gªÂT…© SU¦ªLU™ª1UcªÆT©N¦:™êdªÎT©:S ¦L5˜j0ÕdªÉT©Ö^b”#ÕÚKLòŽTk/1Ê‘jí%&ù@ªµ—åLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÎTƒ©S ¦šL5™j"ÕÚKŒr¤ªl¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶¤l¶´Måù|@0&ݦǿŒÉÂmzœ™]çÁÂuñÿbA»ê¶;¢±Ÿê=Ô}WŸL’þ—ë»ëï¶çâ톯õðÃõÿ\ï^ôü »uëOÛXÿ­ËdËüsfN÷ƒuûilc¹°|²Yž(¯cRIn,gª“©N¦:™ª3UgªÎT©S ¦L5™j2ÕDª£!ÕÑêhHu4¤::R©ŽŽTÇ@ªu¶1Ê™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª“©N¦:™êdªÎT©:S ¦L5˜j2ÕdªÉT©nG“©nGƒ¼#Õí(c’#Õí(c’#Õí(c’3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT'SLu2UgªÎT©S ¦L5˜j2Õdª‰T·£ŒIŽT·£ŒAÞ‘êv”1É‘êv”1ÈRÝŽ2&9Se³%e³%e³%e³¥:ʸéú®&ÇÑÔíÕ9æ6ê [ËTкšôŽÈ°£±iÏ£“ŒçËÿòáÛí¹¼ëÛμúòÃ?Ï?þ懛ûëÚ0|~ÓõÝ·çŸüýúïn^n&®{å[«MÁÖÞÛyõnœÄ"s}cëæÉ›¯ÏÙÁºýL,Q¾¾Œ¡ÜX(__ÆP®,w”¯/c(–3Õ`ªÉT“©&R­»çQŽTëîy’w¤ZwÏ£©ÖÝó$HµîžG9S¦*LU˜ª2UeªÊT•©S5¦j¥ú|§Íoç³³\Yî(÷Æraùdy¢<ËåL5™j2ÕDªëYŽTëîy”#Õº{åHµîž'ù@ªu÷<Ê™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª“©N¦:™êdªÎT©:S ¦L5˜j2ÕdªÉT©ÖÝó(Gªu÷<É;R­»çQŽTëîy”#Õº{åLU˜ª0UaªÊT×ÕA·ÙšÕÓÀ.ŸëÔLÌšµ¦h]m©²ÚJ˜GÞ~(Vžö—‡®>År{¸õãPìñÇ¿ Å^^õ×ù õ|írð‚çx¹Nj^¶.Xlv¶Njf¸ÚÃu»¡Dí‰%y¢¼öÄ’ÜX(¯û­I®,w”×ýÖ$gª“©N¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘êv¿5É‘êv¿5È;RÝî·&9RÝî·&9RÝî·&9S¦*LU˜ª2UeªÊT©S­û­CŸžBzAž(¯û­In,”×ýÖ$W–;Êë~k’ Ë™j0ÕdªÉT©n÷[“©n÷[ƒ¼#Õí~k’#Õí~k¤ºÝoMr¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜êdª“©N¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘êv¿5É‘êv¿5É‘êv¿5É‘êv¿5ÈRÝî·&9S¦*LU˜ª0Ueªu¿õ¬§‰’yÚãíÖ=c¶£àëëj^Ïu¹pøáÏã呞‡[éÖ7Ðs¶º)z,Ùn¯ëá݇TÅnë?ä†ÖEÿäœÓݺ—Ÿèš¾‚ÚI Õ‚ê‰ê$u=" åÆò@yGžõgåH´Œ…rdZÃw”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT'SLu2UgªÎT©S ¦L5˜j2Õdª‰Tkk/Ê‘jmí%yGªµµåHµ¶ö’| ÕÚÚ‹r¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜êdª“©N¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘ª4¤Z[{QŽTkk/É;R­­½(GªµµåHµ¶ö’\˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÉT'SLu2UgªÎT©²©’°±’°¹’°Á’°É’°Ñ’°Ù’²Ù’²Ù’²Ù’²Ù’²Ù’²Ù’²Ù’²Ù’²Ù’²Ù’²Ù’²Ù’²Ù’²Ù’nwzX¦L6h®Y»öõßx}.Ä^ä“õGSÚ12§ ¶°þùjFkCŽî°Æò@yýóÉ•åŽòúç+’ Ë'ËåÊT•©*S5¦jLÕ˜êdª“©N¦:™ª3UgªÎTƒ©S ¦šL5™j2ÕDªÛÖh’#Õmk4È;RݶF“©n[£IŽT·­Ñ$gªÂT…© SU¦ªLU™ª1Ucªµ5zz†·yQž(¯­Ñ$7–Êkk4É•åŽòÚMra9S ¦šL5™j"Õmk4É‘ê¶5ä©n[£IŽT·­Ñ HuÛMr¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜êdª“©N¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘ê¶5šäHuÛMr¤ºm&9RݶFƒ| Õmk4É™ª0UaªÂT…©*SÝ^`™.M&·½Ñ½·Þ\ÙÂíQTOâýÂuy~0°í/2ýúæ‡w~®ÇMm»°g½£·înþc÷ü©…)u˜BÌyðBçåC÷‘il•ŸÖå_kësz°n?«k,–O–'Ê$ÊåòõµåÊr¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘jý]…r¤Z*B9R­åHµTDòTëAE(gªÂT…© S¦ªLU™ª2UcªÆT©N¦:™êdª“©:Su¦êL5˜j0Õ`ªÉT“©&SM¤Z*B9R­‘¼#ÕzPÊ‘j=¨åHµT„r¦*LU˜ª0UeªÊT•©S5¦jLÕ˜êdª“©N¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5‘j=¨åHµTDòŽTëAE(Gªõ "’¤Z*B9S¦*L•Í–”Í–¶ o-š“mƒÀÏC"ë¶9àzÍå`Ýñp¼<»õo7×ß~¸{÷óùÝ|}ýpýëû‡Õ…^®O‡v;x¡_ŸÎj5Ùº¥5ê6 $9S¦*LU˜ª0UeªÊT•©S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"ÕmHr¤ºMAÞ‘ê6 $9RÝ&$GªÛ$äLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÁTƒ©S ¦šL5™j"ÕmHr¤ºMAÞ‘ê6 $9RÝ& Hu›’œ© S¦ÊfKÊfKŸO/Ÿx}> ë>›îÖ­Ü]l—SŸg¿ûêO_ÿçíPýÔ¯¾ü·›û·nîÞÞœßøü¨òí'»yw{ýÛw·?ï†<ã¤ë›‘6ãè=_b·ÎN^ÏzŸc°uyjöt:ë~Ý~Ž3Xn,”¯ßÊ•åŽòuY€raùd9R­MQŽTëFS’w¤Z7š¢©Ö¦(Gªu£)Ê™ª0UaªÂT•©*SU¦jLÕ˜ª•êúVÌæEu’zTªƒÔÞQ­¨vRGCµ Y²Ld™È2‰eÝYJjbY÷•‚º˺«”ÔIJî)õ –uG)©‘¥ KA–‚,Y*²Td©ÈÒ¥!KC–YNd9‘¥#KG–Ž,Y² dÈ2‘e"Ë$–uã(©‰eÝ6JjbY7’šXÖ-£ IJn%5²d)ÈR¥ KE–µ…hZë:¾u¸±=´Û-#ÜѺzhwÌLÑ~°n?ªýaúòü¿ß=|xûööáçm44·¿úp÷4úô­úøáÝöïOÞöõ÷Ç¢Ú+ Ñ2§¼Óó ì–ÉɆÖy…lÙ<Íùô<¡ýºýUa¢|ý1@¹±jm—C9S¦*LU˜ª2UeªÊT•©S5¦jLu2ÕÉT'Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHµ¶Ë¡©Öv9”#ÕÚ.‡r¤ZÛåH>jm—C9S¦*L•Í–”Í–”Í–Ì&«ˆAdf{>\ ¬ÛÌ­y­;œÖ?Ž~žýíæãÇûç©áz/×Ï?xîf‡qr¹>-ãàÕž×î†zã4úZeë3 V­ÿLêŒñ©ó`Õ~r(¯KE’+Ëåu©Hraùdy¢¼.IÎT'Su¦êLÕ™j0Õ`ªÁTƒ©&SM¦šHu4¤:R ©ŽŽTGGª£#ÕÑ‘êHu ¤:S¦*LU˜ª2UeªÊT•©S5¦Z—Šá­w?ú’¿Ÿíu–+Ëåu©Hraùdy¢¼.In,gªÉT“©&R•†T¥!UiHUR•ŽT¥#UéHUR•Te0UaªÂT…© SU¦ªLU™ª1UcªÆT'SLu2ÕÉT©:Su¦L5˜j0ÕdªÉT“©&RÕ†Tµ!UmHU;RÕŽTµ#UHURÕTu0UaªÂT…©*S­»‘¢µÞ2/msCkçÝ]¾êñFÛÖEå`Õhcw-²Ý–ðyö‡»·÷?ÿðpóíã{ÙžÆ÷ô †ÝnÃz‚¥gkCâà•Î/ðrÝúFÉl}«×>€_YVSXo­Õïo·n7ˆ¨gƒ¼bLrcy¬|]˜£ÏÔ~ÞÙQ­¨vR×cŒA-¨ž¨NR×cŒAm¨F–YNd9‘¥#KG–Ž,Y² dÈ2‘e"Ë$–u›6©‰eݤMjbY·h“šXÖ Ú IJnÏ&5²d)ÈR¥ KE–Š,Y²4diþø…>Ú¼$ŸåÂòÉòD¹–ËåÑY®,gªÉT“©&SM¤Z÷d£©ÖuÉ;R­{²QŽT«@9R­{²QÎT…© S¦ªLU™ª2UcªÆT©SLu2ÕÉT©:Su¦L5˜j0Õ`ªÉT“©&R­{²QŽTëžl’w¤Z÷d£©jGª:ª¤ªƒ© S¦*LU™jͺ¶æ«óÀmJñx/7YWsÒ¹® mŽƒuû9ií®”—ç~usýð´¹rö«/¯ï¾}þáïÞ¾½ùøñ³_{þÑgÓÕzÃóluwýÓN¦ëctµƒwþ¼z·JNÓúã•Í勿ÉçZ´¾Š¬Ú_™%Ê×'åÆò@ùì,W–;ʽ±\XÎT©S ¦L5™j2ÕDªµåHµ6° ©Ö”#ÕÚÀBòTk Ê™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª“©N¦:™êdªÎT©:S ¦L5˜j2ÕdªÉT©Ö”#ÕÚÀBòŽTk Ê‘jm`A9R­ ,(gªÂT…© SU¦º®l]dõá—_Rèv?´¯²«—í9Šëš±KŽƒUÇ×eúòH­7?Ü<í]Ѻ³î«wo¿½¹_×jëG/^ nC kë ²¼ÒùEvËò4rfzs´®¾¯‹ã&r°ìåg¾´"uº¾ ƒZQí¤®¯Á TOT'©Y:²tdÈ2e ËD–‰,Y&±¬Ó«HM,ëì*PwbY'W‘šXÖ¹U¤&–uj©‘¥ KA–‚,Y*²TdiÈÒ¥•¥äúA/Êås°ÜX(÷Îre¹£<Ë…åL5˜j2Õdª‰Të¬*”#Õ:«Šä©ÖYU(GªuVÉR­³ªPÎT…© S¦ªLU™ª2UeªÆT©SLu2ÕÉT©:Su¦êL5˜j0Õ`ªÉT“©&R­³ªPŽTë¬*”#Õ:« åHµÎª"ù@ªuVÊ™ª0UaªÂT…©*S­Ýs<Ý vùpj;á¾ÕÍ\3Ѻí¬*Ë”i뎧vöòH«77o¼¿}øùñ’§ü­Á]]-õç-»W;¿ÊÁ”¬KËœŽ–Y?YÍ ¥æ™»uGó2”;Êgc¹°|²þ}ýí”ç›Îoùæ‡×&lu°xíÔÂ^ýü Ó©õ‘¯OVí©#ëä´¾ xšèíÖ©Pž(÷Árcy <:Ë•åŽòl,gªÉT©Ö˜ åHµÆT$ïHµÆT(Gª5¦B9R­1Ê™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª“©N¦:™ª3UgªÎTƒ©S ¦L5™j2ÕDª5¦B9R­1É;R­1Ê‘j©H>j©PÎT…© S¦ªLU™ª2UeªÆT©SLu2ÕÉT©:Su¦êL5˜j0Õ`ªÉT“©&R­1Ê‘j©PŽTkL…r¤Zc*’¤Zc*”3UaªÂT…© SU¦º¾¬ïƒ3û@“—mL•§£uÛqãÚzr°n?¦ª_±;nü?nîï®ßÕ»Yß7«/ß<\?ܼ¿¹{8¿éÏ7?Ý|RœG[³µõ_çÁû:¿ÂîÚ]NmzæúF‰­[þ-3ÝŽÖíG‰òú¯šäÆò@yýWMre¹£¼þ«&¹°œ© SU¦ªLU™ª1UcªÆT'SLu2ÕÉT©:Su¦L5˜j0ÕdªÉT“©&R­£sQŽT·Gt€¼#Õ::åHu;6äHµŽÎE9S¦*LU˜ª2UeªÊT©S5¦jLu2ÕÉT'Su¦êLÕ™j0Õ`ªÁTƒ©&SM¦šHµŽÎE9R­£sIÞ‘j‹r¤ZGç’| Õ::åLU˜ª0UaªÊT•©ê<­?Ä­µ<ºõ:w;ÏI¥5GëêD§:`)ýhÝñˆ _üô§»OFvê/GÛ›Î#‚í§¿2"ðSóÑÚ¬©Åî}_awí^}µµ‰Ÿ¬““¹®O]?zûÁdy¢¼¶³‘ÜX(¯íl$W–;Êk;É™ª0UaªÊT•©*S5¦jLÕ˜êdª“©N¦:™ª3UgªÎTƒ©S ¦šL5™j2ÕDª5Q@9R­‰É;R­‰Ê‘jMPŽTk¢€r¦*LU˜ª0UeªÊT•©S5¦jLÕ˜êdª“©N¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5‘jMPŽTk¢@òŽTk¢€r¤Z’¤Z”3UaªÂT…©*S­Me1žî߸ü:wˆ>Ö}6"Ø­;lƒµWGuøÔÕ—øéi<ðøÓ×çëdÖm.Cõà…ϯ°[§æs}žÂкÙO:×çiýÆÖ½ä¨çA£ÜQîåÂòÉòDy –ËåÉT“©&R­QÊ‘jM¨PŽTkB…r¤Z*’¤Z*”3UaªÂT…© SU¦ªLU™ª1UcªVªëÛÀó’|6– Ë'Ëå>Xn,”Gg¹²œ©&SM¦šL5‘jM¨PŽTkBEòŽTkB…r¤Z*”#ÕšP¡œ© S¦*LU™ª2UeªÆT©S5¦:™êdª“©:Su¦êL5˜j0Õ`ªÁT“©&SM¤Z*”#ÕšP‘¼#ÕšP¡©Ö„Šä©Ö„ åLU˜ª0UaªÊTë8õÖÖ—o2yy<ŽE2§^_·ÝçÒÖ‡—y°îxBÕ_žÚòçßé¿>ù"¿<-úñ'ÿúõÿqþÉ»ß}w0¦ª;³žTæýàÕÏËwëò.­u¶l}•a™vø›Ù (ÖW9”'Ê×W9”Ëåë«Ê•åŽòõUåL5˜j0ÕdªÉT©Ž†TGCª£!ÕÑ‘êèHut¤::R©ŽTÇ`ªÂT…© SU¦ªLU™ª2UcªÆT­TgëÍõ’|v–+ËåÞX.,Ÿ,O”Ç`¹±œ©&SM¦šHu}¿Är¤* ©JCªÒ‘ªt¤*©Ê@ª2ª ¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜êdª“©N¦:™ª3UgªÎTƒ©S ¦šL5™j2ÕDªÚª6¤ª ©jGªÚ‘ªv¤ª©ê@ª:ª¦*LU˜ª0UeªõL0óÖf寎jdV“¶íh²nÛÔ57‘í×­Ë烑Ùxy‚Ì››ûŸnî·¹œ}rRñó^ßÒUgû|¼Ëmÿ²Ïëw«ò4ëìodÕú<}]êxŽƒUûùޱË>}pU¯ÿü®~ybü‹åu«”Õmˆ¯óÉú—‚zë\±ëÑðk õ¤u Pëã`ánQ;A^;I.,Ÿ,O”׎G’Ëåµã‘äLU˜ª2UeªÊT•©S5¦jLu2ÕÉT'Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHu»›–äHu»›–äHu»›–äHu»›ä©nwÓ’œ© S¦*LU˜ª2UeªÊT©S­»i½ghÌKòº›–äÂòÉòDyÝMKrcy ¼î¦%¹²œ©&SM¦šL5‘êv7-É‘êv7-È;RÝî¦%9RÝî¦%9RÝî¦%9S¦*LU˜ª2UeªÊT©S5¦jLu2ÕÉT'Su¦êLÕ™j0Õ`ªÁTƒ©&SM¦šHu»›–äHu»›ä©nwÓ’©nwÓ‚| ÕínZ’3UaªÂT…©*S]W©ãñÑgdî¹í ´þtYXáÙVlG“ÖãÍöò`¸çñïóû‘«/¿¾ùçõï>qšµpØÁë|²þ`|Ù½Ž† ºÐN3Ög&G?Xx4Èœ1ž6gþv¾þ°¡\Yî(_|(–O–'ÊWrc9SLu2ÕÉT©:Su¦êL5˜j0Õ`ªÉT“©&R­A&Ê‘j 2QŽTk‰r¤ZƒL’¤ZƒL”3UaªÂT…© SU¦ªLU™ª1UcªÆT'SLu2ÕÉT©:Su¦L5˜j0ÕdªÉT“©&R­A&Ê‘j 2IÞ‘j 2QŽTk‰r¤ZƒL”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT'SLu2UgªÎT©S ¦L5˜j2Õdª‰Tk‰r¤ZƒL’w¤ZƒL”#Õd’| UHUÙlIÙlIÙlIÙlIÙlidÚötË£©ÛëãºÇAfÝåìÂÖ Ó2³ëj=~åLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÉT'SLu2UgªÎT©S ¦L5™j2Õdª‰Tëñ(Gªõø ’w¤ZŸ@9R­ÇO ©Öã'PÎT…© S¦ªLµþ±À#óðûñWgÛ|¨6€m³ÀºíéÖZúÑûÛOˆj_V¼<™ðß>||øîþæÍ_ÿüôdØmWÖ'S£——üëª#Z ¦|¼ÜùEvëòÔãy‚ÖÍQÇ1¶6‡¬ÛM$¦±f¼½¿ùÇíý·OïÆ{þÖëCõàÅÎ/²›Œ­?dëÛø¬•,[ŸÒ);ÉöëŽæo$_Ÿ@”Ëå³³\Yî(÷Æra9Su¦L5˜j0ÕdªÉT©Öü åHµæo(Gª5C9R­ùÉR­ùÊ™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª“©N¦:™êdªÎT©:S ¦L5˜j2ÕdªÉT©Öü åHµæo$ïHµæo(Gª5C9R­ùÊ™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª“©N¦:™ª3UgªÎTƒ©S ¦L5™j2ÕDª5C9R­ùÉ;R­ùÊ‘jÍßH>jÍßPÎT…© S¦ªLU™ê6®³ÜÚ fROãºÖëé›dݧ§|í×ãºuåøyö»®ß~³mȳS¯'„ÞÿãçóOuv·þ–÷õh“ì¯|~‘ݺõç9ÚjCкu ÒoݯÛyŒåòu€re¹£|] \X>Yž$¯cßQŽTëØw’w¤ZǾ£©Ö±ï(Gªuì;Ê™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª“©N¦:™ª3UgªÎTƒ©S ¦L5™j2ÕDªuì;Ê‘jûNòŽTëØw”#Õ:öä©Ö±ï(gªÂT…© SU¦ªLU™ª2UcªÆT©N¦:™êdªÎT©:Su¦L5˜j0ÕdªÉT©Ö±ï(Gªuì;Ê‘jûŽr¤ZǾ“| Õ:öåLU˜ª0UaªÂT•©ÖÁ^ë—{32ëØ†BÓ3×7 h] …jCÕ”£÷w<ZŸ¯Ï³oî¯ß¾Û†BuxÒoíà’Ó”çh¼ÔùEvëüÔêAëR­ÛNi^ïoý÷r°n7ØNiùdy¢|;¥äÆò@ùvJ3È•åŽrgªÎT©:S ¦L5˜j2Õdª‰TGCª£!ÕÑêhHut¤::R©ŽTÇ@ªc0UaªÂT…© SU¦ªLU™ª1UcªÆT'SLu2ÕÉT©:Su¦L5˜j0ÕdªÉT“©&R•†T¥!UiHU:R•ŽT¥#UHUR•Te0UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT'SLu2UgªÎT©S ¦L5˜j2Õdª‰Tµ!UmHURÕŽTµ#UíHU;RÕTu ULU˜ª0Uaªl¶´íøª‡h¹£Ñ×6Ük¶ÞMMß^_÷ÙŽ¯ÝºãáÞº$ù<ûú÷c{~Êߘì-ølõp•ƒ×9¿Èn]žÖßz™ÓѲõA̧'dî×íFë”Ê×7(W–;Ê×7(–O–'Ê'SLu2UgªÎT©S ¦L5˜j2Õdª‰Të (Gªõ ’w¤ZÏ`@9R­g0| ÕzÊ™ª0UaªÂT•©*SU¦ªLÕ˜ª1U[ªÛ¦÷úÇßÎgg¹²ÜQîåÂòÉòDy –Ë™j2Õdª‰T×/²©Ö3PŽTë (Gªõ ’¤ZÏ`@9S¦*LU˜ª0UeªÊT•©S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"ÕzÊ‘j=ƒä©Ö3PŽTë (Gªõ ”3UaªÂT…©*S]_2}å¡džVSFõ™‘~ôn^_·M×Ç'óhÝñ”qý=þyö—7õfÔÅ7ýó››ûŸnîÏoº¾ûö“_ÿù×oÎ?ÿµ¡dmœY_ÖÕ‰åÁ»=¿Èîê³æÌú´1’¬Ó“{¼Ú-Û_ã:©×÷4¤TOT'©×÷3¤6T©×73¤F–†,'²œÈr"ˉ,Y:²tdÈ2e ËD–‰,Y&±¬ 3¤&–µ]ÔXÖfRËÚ*CjbYeH,Y ²d©ÈR‘¥"KC–†, Y²œÈr"ˉ,Y:²tdÈ2e Ë@–‰,Y&±¬ý0¤&–µÔXÖ^RËÚ êA,k ©‘¥ KA–‚,YÖÍÎÑ2ÜÐUU]›ÎÙ×:AËꟲ֥x›ëFËÝÕÄ•ùË“‘Þ<\?ܼ¿¹{øø¢®=Š\ÿGò`Y}T½Æù»«¢¯³È'[gŸµ[÷òs]Ç”^^×)¥ VT;©ëˆRP ª'ª“Ô½Î'%9Òì qöŽ<{G ½#Ñ>iÈ´„Z»ÍH.LU˜ª0UeªÊT•©S5¦jLÕ˜êdª“©N¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5‘jí2C9R­]f$ïHµv™¡©Ö.3’¤Z»ÌPÎT…© S¦ªLU™ª2UeªÆT©SLu2ÕÉT©:Su¦êL5˜j0Õ`ªÉT“©&R•†Tk—Ê‘jí2#yGªµË åHµv™¡©Ö.3’ S¦*LU˜ª2UeªÊT©S5¦:™êdª“©N¦êL•Í”„ •„M•„•„Í•„ –„M–„–„Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–j—™g¶Þ‡ !vò%½5éÎÖ>³ÔLëã`á~˜_ûÌâå‰vo~þøpó~ÛÌ'¹úò›nî¯n?ܽî÷ÚÈåucK½Îùvëâ4,[3Ѻú'õ§¹©­ÛO•åŽòúW’ Ë'ËåëÏ ÊåòÉT'SLÕ™ª3UgªÎTƒ©S ¦šL5™j"Õ:4åHµÍC9R­CóPŽTkï/ÉRÝvú’œ© S¦*LU˜ª2UeªÊT©S5¦:™êdª“©N¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘궘äHuÛ òŽT·}À$GªÛN`’#Õm/0É™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª“©N¦:™ª3UgªÎTƒ©S ¦L5™j2ÕDªÛ&a’#Õm›0È;RÝ6 “©n[…A>ê¶Y˜äL•Í–”Í–”Í–”Í–og}5užöx;ëÓÆd°l»›5Zó8Zwßdë|¥ïð`Ý~lØX.,Ÿ,O”ë`¹±j=ÔåLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÎTƒ©S ¦šL5™j"Õz¨/Ê‘j=ÔåHµê‹r¤Zõ%ù@ª:ª¦*LU˜ª0UaªÊTk†9×w5ÃɰnaÚóó;Àºm†é­5?º\X×·ûæl/î{ó×?o žÏý¸ûç‡û÷×wooÎo|m¦9Ûi]?Î4÷¯{^0g²xºÊAëÖ[mµ#Ö œHîƒåÆò@yt–+ËåÙX.,gª‰Tkà„r¤Z'’w¤Z'”#Õ8¡©ÖÀ åLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÁTƒ©S ¦šL5™j"Õ8¡©ÖÀ‰ä©ÖÀ åHµN$HµN(gªÂT…© SU¦ªLU™ª2UcªÆT©N¦:™êdªÎT©:Su¦L5˜j0ÕdªÉT©ÖÀ åHµN(Gª5pB9R­ÉR­Ê™ª0UaªÂT…©*S]_z¬ïj$¥lOšµ±Ú4´®¾@Œ–uæÁºuÅz0q/Ïãüêúí÷7ÿ¹ÞÉú®y\}ùo7÷o?>Ü< ßøô$ˆÇŸüñöÝÍÇóO_Hežt]t¤†¼Ûóúƒ!Áœ¾~O®[ÿMõÖšÌy°îpZòš\Yî(¯iÉ…å“å‰òšœ© SU¦ªLU™ª1UcªÆT©N¦:™êdªÎT©:S ¦L5˜j0ÕdªÉT©nÓ’#ÕmZòŽT·iÉ‘ê6-ù@ªÛ´€äLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÎTƒ©S ¦šL5™j"ÕmZ@r¤ºM HŽT·iÉ‘ê6-ù@ªÛ´€äLU˜ª0UaªÂT•©ÖnÅ:²*<ÉuîöTŽÖ[—~t9ÿúºO˱_7ÆÑþyyà×ï~|øþæîáöív|×¶fœôõ!@~\›bfèÁ«×ïÖÕ#KÖ'sDgëYÓ\¿Ë£þ¥AZ…rcy ¼¾h’\Yî(¯/š$–O–3Õ`ªÁTƒ©&SM¦šHµN­B9R­S«PŽTëÔ*”#Õ:µŠä©Ö©U(gªÂT…© S¦ªLU™ª2UcªÆT©N¦:™êdª“©:Su¦êL5˜j0Õ`ªÉT“©&SM¤Z§V¡©Ö©U$ïHµN­B9R­S«PŽTëÔ*”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT'SLu2UgªÎT©S ¦L5˜j2Õdª‰TëÔ*”#Õ:µŠä©Ö©U(GªujÉR­S«PÎT…© S¦ªLµ6à´ç‘ÚåS£mÎú²µÿ,ûôޝýºuÑ÷bA»šúòl«uUûxú¾_}ùo÷~¸¹¸½y9F[_*,Ö;ª‰ßî~YþbѺ~èõÑu#‹ê±Ïµ¨çÁª—Ÿð:úvÔyXrôíê$u| jCuºN½µ¢ÚI]GÞ‚ZP,YÖSzQŽ4ë)½$ïȳžÒ‹r$ZGÑ¡™ÖSzQžÿõý±‹ë´ÛËc#q€¸Î¹½> endobj 1577 0 obj 18354 endobj 159 0 obj << /Type /Action /S /GoTo /D [1578 0 R /XYZ 72.0 627.0 null] >> endobj 1579 0 obj << /Type /Annot /Subtype /Link /Rect [ 310.72 380.3 401.689 389.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1316 0 R /H /I >> endobj 1581 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 356.3 115.05 365.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1573 0 R /H /I >> endobj 1582 0 obj << /Length 1583 0 R /Filter /FlateDecode >> stream xœÍ]oÜ6ò}‘'°i‰úN‘‡¦iîRô×ÚEq¨ûÀ•¸»jõ±‘´ÙøßßC‰¥uàÐÖIkÎp8ß3ä(7>ñàÏ­ü•dŒäõæ£Æù$a$ˆ5*ЉŸÐØKIM4F)©$ál)Iô2PXMÀü¼i6ùÇæ—_¨ Èyã-˜#›ûÍ <Ši§Y–i]õÓTŠh ‹¼&wjFÞµŠzÔ^2òþrímŸý 4òÈ~óöas÷>"¾Gv&Ÿ¦¡?~DR°Lþ0òP“_®~<5MÙì o òS/Wÿ|:Šîþ‡ï¯%ßm¾}ÐÆ*N*üM¨Ê©ÙFzó+ß&¼ÁÂ! Ê"°JnU:Äú·Ü—‘rþ¾è"ÍÊ:ìLùîÏ~96ID%ަ³¨$–óçyö'ûlF){²&! ‘m'MñX,“M›òíg^+A®a? ièÇ ¹òiHç˜þ(òr÷$p†çs0o›FäCÙ6sü±k!k‡§9vh!‡ÓP´gçìpp´+øÀ·¼w°çƒø£ƒïŒœå»Ê#1:Ä2¡ìI^µ½(¦p{4 }?‘QÈ…ø½ÛodC©!aL}ÊTE“NéÖ‡H1M¦&aœÍ0•ÄX\*2c:å 4 ´X Þ¹Ú >œ:aöæ©»Se·:}»M©fc`(êãÁ¬kþd€¦µv¶Ö‰cÇÁ9·4À®ƒk»ãè݃uÚî4ˆá»AXžæÚS¾= ¶ê‹@¦™ãVð›4¤y[×¢)DA¤»øñX *] ‘î;^÷¹yxu`ÎB#º{ßM@߇WE–AˇLjôM!SÏ òoq&ï´™#Ïýzø!£™,k>?ëžË˜òYö¢û¤ý¤à²éÞäÂÂôõÀ»A7ÓZgÏ—„Ì/›%Ûš–@vdbó>v fi¯=¨Û(ˆVl/›[F.úþbå,¢¨|¸–ŒcžÝ¬ÚÙˆ³µ!ê#Þ£ó£¶ ™æCϘËÎe@~•;H921ŸK(@Â"ë`m RŽºd™Än2”ÃX 1¹Ÿ©ègSf±ê]Ãk #Ÿ»pä}n»Â>Í‹¸³NâC¥µi9®`'ƒ–Ü@³1‚`ôæŠÓÒÔqÚÛV9-òh8²ÄµåD KpmyDov†0Ñ·½húr€øÑ ÿmÛP‰Ï¹8jË£Jg©H!vüT |ÿõLÇ› :Êü°Æ ›óšr×KÁ»ÉñÑ•£“C “ý e øÊÙQ]PSžPƒ”;VÍtNúKÆvEÜ.:¦õ§hL0ŸVóÆ¥Pöˆ¥å»ù›ñ~ÊÜûÉOõ3¸â2?ZQE¾/Þmðâxîì¤^»¨~UµççL°i ÖJ DØWžB´Me9 ¯\jKåúÕ³ŒBä¶eéihæþ˜ ¸¶31ši9`›@ ×9‹P¹³¨Ä‚A´Â°À®‰kå‚›U&ƒËB˜ý2ùùFý¥…Δñx}ù<ËhÒ¤á-&ð\V•¥q×?òƲL_Ct”¿òÑ‚¥!匞ŒØñ«Œw”XM‹+­¦Š€¼*ÊÓ/7O_Úböô}vÂgYÏ«ËÓ=ìOó¨\ãD‹§Ô¤9._0ÝJRÙìÌWŸq¶å~¦T×éÑÞü‰x™p=´ÖÌá=ûˆ`6ÆIÛ&U_6-fˆ—|Ñú,Ò"F©j6ï/µÁ XŽw5zÉÌ®Ðó¿ë‰g¦þÀ‹¨cš²ôÿ2ö~Hù! Ò/žû§»à‹æ~Yù‘,ö4Ñ"åÛï6öh0ïˆÑ/!jÞ<¨U5ŽS8btq–xCŽ_¹³¹Í8ìÊm¼Ìp|tk 5÷ØÙw½FÝ 1#^:1ö'þg2Á!¡Ç¨³,\9F\ê@Æ]§ScöOBÿE£À endstream endobj 1580 0 obj [ 1579 0 R 1581 0 R ] endobj 1578 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1580 0 R /Contents 1582 0 R >> endobj 1583 0 obj 2007 endobj 1585 0 obj << /Type /Annot /Subtype /Link /Rect [ 86.72 206.44 132.27 215.44 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1573 0 R /H /I >> endobj 1587 0 obj << /Length 1588 0 R /Filter /FlateDecode >> stream xœÍX[s›8~÷¯Ðc;Óª!®ƒ³ÞÖvjÈl3N†`%fÇ@ 8iþýl Ënö©»Ót¢stn:—O"?F"ðï½ü„.ÊŠÑÅsPà"ê+ó‘`ŸpT EpÆÑV –RD-iÇUÒ=±AÊA—£oßAhfèyD,ã½™xôœ3SŸ‡a¨bu±Ã¹tA±‹¬@f…‹.ªNz½4Dþóè͈¨ãþ""èaô1}˜2ä”Üë ¦Òz☺r =‘èÛ›8Ûˆ"mPZ®ÑEÚ¦wi#Ðòîo‘µÍÛï(ùs%긭®¡\ø p×Uƒ æ‘áŽÑq¾æÂÓžì28—ÜÚª"«ßrc¿d]Òúßg“¤LÊÇ%ë²÷;Ÿ¯N@ƒù *œ¹6ÚoN™UEéûüaˆÕ`“ªlÓ¼lÐ[ôžaŽÞ´qXg»ºe{ Ѷyù …e[î×Oi§w[¡w«û“V×ÐÇÚEš[»Fhƒ÷U­m·‡õd<ù#ºÐ¦;§ïNÆô/Ý Øè‹k$Í%GYK¢¯ êcKØs±Ç)!Nਾ‰“h~;Y~¾ž/nãèËu´˜D·×ñø2²´}ûÔmÚ¢.öá€zYWÏšPùê yMeÕvW”šn7i«©Ü0¾÷yÙAy36/£E´'}ò{Öǽ¾ˆ¦ãëωfŒc½ÞŸ[sžóvc†$Žãµ’øGÉ)ÓBtØØˆ;QfIŽ¥rðô<ÿDIbKÞ‚‡ž Ôë¦Û=þÎE›Ê5~í¤ º/Û—)E²(²] ΜÄñ(&!®{Ò|-’1ù » ç¨1dæ`pê÷ûÚeUQÀØB,ë5mÕ·j‹€t^«°»{`8„¶XD“d¶\Ü^­–WÑ*™Ev”. 1ƒ{†Î^ÉÜ6‡gå}uUW¢nsÑØæàn Hæ†Ѭ–q¼Š¦ÑJö”­Ç(æÐ(„ø*[Ó] .üDo¶yÓdŠH’*S§÷¢–Ͷ6˜w/1]®¢ÙåÂà|Šn6˦­¡xmƒMµ~€u2iuÕ4«½ÿwö¹¡I8 CΨJ?(E?«ºëOâ¥oàÍ Í³›ÀåCïCú¼pöÙâ"ú:[L—– …KZ<ïûó\ágåZü”u·mÀðS攸ÞÀíÕj6¯n ‰vÇQæa/pBîqÿ׎¯ê¼HëydÛŠ„—y]N¢‹ëUt&¨Ä•€9¯À´8´Ë® /N\€8Ý+0ðOa»÷$†pV‡¿v?Ý•Y›Wå­ Þ¡%1žˆNbõ!:æGw <Úc.³o2@Øäwkã©ÑÑOév'´h? ÝR§ea½ï[ñ$´èãeðÑìú[³w¤ùñ—χu½Ûjú¸Î„„ÛwV$vNÂð('€e“v…èÔ}9ùEµVw¤zÐô`|ºÛ¶šqÒ‚>zo¡±5vjÑã€æä†™vÓ? zê)ÏX“ÉÆ0*¯]CT•K1ätÎD'yŽ•E@˜ã,JC1x‡®¼Üà„‚% ?Ž|ßQç„ôÙ Š0ÿÒ ¼+^wâ¬ÿB:Û¤­¨áº†aÜÀ¢{É£eÌFóX•khV${±iÓVôw|÷d†+ÔËÑÉ­n'RÌ> endobj 1588 0 obj 1419 endobj 1590 0 obj << /Length 1591 0 R /Filter /FlateDecode >> stream xœí\ëÜDÿ¾E+B:6^wûˆ#ˆ;Yî>„<3ž]s{c{vÙCð·_õÃý¶Ç›‰„h»ËÝUÕUå_u—{yu†QÓYAÐöpöJÐ0ÊŠRAJR„³ st@¢“'9jè@£I‡ˆfĨb4ï\£ÿœµg!úÇÙ÷?À  ƒÝ…sÎæÅÙ7 Ńæ©S‘àã ówܤó>ZØ 3~€¯±e¥Øƒ]ýE7ŒÜÑ]?¢Ï~.7M5Lù*gg~o¿] p(á ^¸SȾV4¬À„÷: ž•c¹)‡j9˜¡S ádTº¬„»Œ„u0ßøÌª>7}2:#‘brùÔeV¡#U›Lã¨@R(X{.⋽s:çƒ-Sv¨B+k>!V.[ ðof(]³w(•JC§§¬ìNšÌ›j‹O'%B£aZ4]\Wh³óîÐ"Ø£ž\ÔšèYZ—|¢<#:bqº†z¤h¢gQBc¯{α¨&nɨ'Ã4ô0õš–«ž ËÎïLÙëoä뿯›j@Û²E› 5]¹«vhßwÔµêöh¼®ÐOe? á¦ÚÖû—º)!‹ˆ§9.>/l±¤™‚¶ì/ËÛršäèÁ¦Ø7 m»Ã&0*r(º+ï©*}5tÇ~+L[3! ¾Ô²¯P¹ÝVÃK©[DµA7}wÕ—‡!@—K+Â)à~ó,wù_”»º¯¶c×ßÏ.P_Îr@妻…å°Ðí;Ø›!É“*k9%ÐP[Gb¹?…W0JÃ0˜ º,7Mã‚8@/ªžîeD|÷íW’­kYäÙ_§ƒ?íéàœ Ì øëdðÇoßÑ©`£ÿ:üiƒaÕ‰€¥‘• wéÆª/ƒ£g¾…ôÚsf8)Þ>CØ2Ì»l 9Œ6¡¦Úë2X{a)‚…Oˆ1€9IŠPg b¼*XS`ì]Å_Ž +5²hpö5¡S<þi·Ù>¹^5» ûñÄ ð/y®Ã[’½6Ûq¼™ãoÂÕPÖN‚æ+¡‡šöB¬y|SMäSOÕ› CtùðN×¹{ƒS1_ ~#öÝÐ7™¯‹pË&ºZoÝM·-›kHo%®/.pA‚þâðI‘„á[ ë‹‹Ýf`›ó`èÕ®;”uÀ9h&iŽ^‡+y}(¨oBôƒñÚÈÂo­'ÑúϰeûcÙÔåðvµjû®9Tí8ÇïúêXoÿ»ÛÌÅ%ۘűŠÌߣŒX˜u¾B+ãz±õ™B«Ï§Êˆ.{§ŒXèeÄbUñ„X«ŒX,–5ƒ¿õ:b¡þŠ©Ò¥7L“¦‹ mvKuÄ«zw…ÄB ³X¼N!±° ‰…Yó[aÕ“z˜.ãD˜vu‘Ë®§3ä =Cò*á=«P=ÿ•»]_ êz>®¥…;QÀâ©M-[ÔÝŒu×– gÓH{¬·›Î%cwºÆ·íÚ¶ÚŽ0ÕzÍrsO…0¥\ákÓA%jº»ªßRÃØ×íÚUûºååÁÅ gDpaˆã4qu¹ûƺ‡á1mL¢>¬Fë[}ïB´<â#ûj…µÓµnÇ#˜SZ¯ãka¼†ûa¬–#XµqìËv¨!3œÃâª-<Ú<ĨwâÔÒiß5`_jÕŠŸ+Q¶¨mçë¬aÄ1p!qìr\oW‚ñºâùâ5‰ƒ,ƒá1äBgê]µY¯E˜•¥EÆ-x°1ÃJC³àœXjÖMrkvSƒ'w¢nÌ^%VÚ®7,bж¡¾hSÆÆ®ÞC È<è$×ÕSiYÏú¡%›¾œ]³£uê+VkÁôÝ·_£*¸ μ –ab‡»}VtöìÞY`ai‡#àÀÌ!?#(›»æ†M½É‚Îj«;sÉl­‹±œ⎖Ãpa•óae MLvY¢»kp/ÓLøÿU}‡šª½¯Ê™XR q‘bÔ‹ p˜Ì­ @Ò,ˆÒ )Òþ]ö5ý˜0 ç-ú”€\}E ß%¼Ù„~"¼yVˆ€º¿Üß/@¦[ɘ}±¡ R±XCªOXØÒø}¢"=aAÖJ²¤Èó,ãbžïÑGð 1‡ÊŽä$)ì;—ìuÚÄR5¹ \6ÕUݪWƒdï· MB¯Ñ_¾œÑs¬›ÖÝ^—= }¥Í­5i}uÓ”[°ÝŒ|ƒõmÙ+ÿŠq<ƒ¸Æ†äe[àã=LGÀÌGG€ˆà´$ öÇf¤9b¢Ðì š\.ok¶å„M¥ÏÚöU9²•ò>3'oÊO~^ Ì^BÄô½íÜdž~€“í½b6*Ãq3ñ¨}8AÚ¶’§Õ)?n*ˆõs3!ðo—,úïwöJP Õ&…šõo¢†Uß Õ;EŒqF· EF’pоè,=%A 0Œ#g°ÉÃA Éíé9Ã>’¦¯‚??@ú*LRCI:™<åît‚ûXÃe$Î,’4m“árl2áþ¤Bƒ°^!Ê’xÄKŽ¡“z‡3l«D-âh¤Ö˜Æ“TˆPRIž<±_Ýa¶líN*c[GlãÈ/Ò²óH”Ds˜Ÿ‰/ÒþèÉêo4ÚŸ×Çq×ݵý±šÍŠÀ5‹\à"§w§ÔãŸ`„µuaH² »„±äxÍ ¥l‰ãÁÔåâpg›ƒ©Ó) >ø…‚!=ýªÏó3ªWǪÝV>F𕎵jjxÏ î¥ ‘òÔ²›8 Ü'8(Žâ‚2åÞ¹w®ê[¶(Ñ¥ T÷sžãxg‚Á¯Fâ®ñhÉsÄS†YîÈ$3ãøô‰T#ØX¤“> Rƒ°^!‘ñ1Ä’c褈¼c ¥q4Ò kLãó\ˆ˜¤J’‘=Úè³ýck·& Ö$Û8 Y0&y‘Ά!YÈ‚Zô?rPµa¶Õ쨤åDûç=ÁÅIÀÆ3Ä1N¹LíÐf3fÏnqVÐ’!›ÿY¹eé%C~ùì“OESãÊ pææRüÔ“p6=mM5DA·™@D)—וóLè®x’ËÀ•*‡á®ë§.ÝL‹VsWÞ»e€¸Àrµ=äeØ]ïxmR·TýR©°e%Ç¡£W+iêpÏ &Aˆ—Á¶Éñ`eŒƒÜZ• q¥EGÕ9%©hä'BÞßÜkϰ|S×|3#¨¿ygëQã¶.gFªñºÓ„oḮ‰–ÐÏû]?Ãfn×L$¶Ì$.¬B¦ªZzeUTtöGlV!Ö8’ðÒf±üéó˜?ŸPG#q$Óx001ú+ŽOsG† ™@ëÓ'Ζ1}âÔÌNPH½#†Xr Ô·ÆPjG#°ÆD0ÞÊÉ6ºÃlÿØÚ­Ã:‚dgü“’ ‰CG)þüâå?˶¼ªúવ`~ùá ¾:öÍ9R¿Þ‰jH/?z:Œ<€“ËHHpœ[7€“}7Lw=0ÎÝÿM²4ˆÃtñpˆâ0Ìœ®øh–cjVNyð@‡ø€fÑ‘ü" ;]׳ñ_›9ÉÙÑ`á¶°£ÄÉÃ^aïé­áÁaÃM˜–zìÄ>qHë°b»ÇW´ÄÀ ‡™@/“¬cP"…ùl¼.<ÅÕ–={©Ôâ^©Wη´Ú—ÇÆÙŠÀ®;ËVĉò€nŠTv3»|A”‹»¶˜ƒOÑe†Ñ&ȾÐJXÙÑsF=]´«3vô› "W…Qäõ„Ѱík¶Óž¿œ$(ì$å$ŽÑî)Û|<9ÈIŽ@;)­J@~¶ž $ŽKïØ2³ShQ 1Hx4XuŸÙ/xî>³&töf ¶îLÐsßr*²¢d©·…¿§Cdމ›iì”`ËÊÑ'ÓŒ—¥›g<ÞrÄ-Å…ôøŒ,}ˆ÷æä î¡£ t¼ç*¢ãø_L23^7@ÞFÌõ~wØxRˆ“k&q2‡HŠD`G%;¯¬Ë!¶Ž†ßlº?Hl%NFÉœ¸w&kñÝF›ÿ½÷4,´XÑïœæ±G$á!WWm6ŒK2˜.¤:çæh 'œ,î“Z’h3ö]L=×ùhä9m“%¤ýÒ«>ܧÜÒí×E…æ.Áêü›°yžÄ¦+§ëŸpþ6öñª¿òþ¨Í@`­¤ê¦0¨‰æ»7ã6mþ)¯…ó‚Ã9C‘l™ùíDbãP‚Õ:K9,ä˜d>ÎØkÝRÚD}Ušbº•,}ç€Ò§ŒbĘ¡ºní}×ûyf +mŠžõ4Û"§°³~^}×÷ý¥ô²ßÉÏkâ­ü4\Ó‚7½C[µC=Ö·U0ý&!¿ÑòdE!–^BqÊnzÛEXBXÕ5hý0f4&xj­¨""NäéÔV…LM ½¥#ß>&,Š•Y ñ§Š©ìÿh ³¶Î[‰VTykCƒN쑯SVݲ ¢xÂ…Tï›×Gl=˜Á•-UÖÔJÙâ§›#æÚ—n‰„ 8ŒÍ¢…Ïcê—YžÒ¬þqIË™´õ´ÞW?×è#¿œòÍÙÿØ8÷\ endstream endobj 1589 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1590 0 R >> endobj 1591 0 obj 3992 endobj 1593 0 obj << /Length 1594 0 R /Filter /FlateDecode >> stream xœí\ëܶÿ~?1p–IêíÀ(8iAŸ›qèv¹>µZi½Òú|ýë˧ħ¤­ûšÜùqÒ,53œÍP¿÷íþyÌ~å%›ýÅ[IC Ç Î$)ÍÊ£ `äI‘ aC6DÆœ*G‹“ðóE{Áß.~ù•Ú¥àö:Ì›—?RáiÅYQ–¥ÔG¨(˜ˆ8ÊèÁfž|·ÇàyÇG+í#øÙµ×5оAðæâ««‹'ߦApµ›B¡4Jjç¬LAŸd?\íÁ/_üãØÈq¨IÿèWpõýÅ7WrvâR?˜þÍ#DÆiÍO´é•þK¢XÐ(%Â)û¨‘>•¿Ùê0å6¿ƒ6‘¬´‹mqc}JáagäìB£ÂðÆ¥f~3´>±ÕGš^L£<ùœþ³CÉŒž¤B¥G"sçT*Z (UFxŒç¬¥Î;‘Plº1å¦X”E^EùˆJ_æìh@©Ü t4@'芔¯ÌñÚ0m·Ž#] 9F³î¤EØÎì2Sw#¤s;¤!ç”e˜4ñüCµ'Þ€F%ÓYäP#HÇBdŸ‰ùÄe”*¹Ñã0Ö´Èú8nƒI¤4 ­ƒ×‰K\mÙŽ7]i 1##Â+gúx2Ⱥà@–'ÏŽçdWšÁ8ÆQž/FŽ‹¨ÌYEOs,NÅ”%‘λ!¶˜½OyÊM£]0žK­¤=ê颥\±£_0Œ\âÈ/êžR¿9Ö‡¡îZo0ñREõ°K•SBì¤,g0Ÿ˜|<•ȇK[ .]–ËŸ­#ŸÓU6—ƒèìl™ü|fº’MH 1ˆût¥cT(»öUŠÌ#wók,ê|d-sUßßvÇílQ2cE ÖS¸•‰—%ÄÄ­9æ(9ÏI7“)z±àxYÚ’½>³ÅÍFÇè÷€,}ˆó!`YPWÐp¹Âýdî„ïµa8¶†õñnßÌU&ˆ•ÁN³ëƒÄaã©;NRâ$AZH»F£$jŒ«âŠÂcëh8Ù¦û#ÊVb1¤Bâ~ç˜:'¥€]wà §žýOq¬%é9P/ ‰]ˆFâÏqáÈ™c£êÀÄ &ÈÍጞ•œÞ°…WêPpª_ÌU¢§H°xôPNW"BÊŒr¤§mö~-Ç€S•Ê„ëôšjÍ(s”à@ EN½Št·B•r±ù`0/84Ä@¦ì‰n “<ê }§!š<–,ç0¼g&PjÔÜg/œ Ù“’rJM+,æ°IÉ$‹qÆz[#öÒ®4f¥«¦›ÊR9”M}úhbŒh3Ô7,Rú,Ÿ‡f²Îé– A¯ó5x¢Šæl~…V~}9Tí¶¢ùõ Ê»\ÝÔýx èñ¦ê èIÛ×CýŽDà›÷ÕþÐpMšîö阌éL„rfõ2Çô!‚jv|sAåbV’,e E8°cI±Â€Ytgü€Þ#YÂi"É u$ÍÅ–Ñe†œ¤"øÈGÿL·t¦I‰)6ýbF)Ф¬ʆæ#c~¬óžDOTšòPd£Ståë”3§ÃãD åù˜ÝM±RnðÉÆ–*‹‚±œ¼8´ç®- +iŠ¢y…r,bПm¯7Ooú·Íöúé®nÈSÒ»fOÚ¡ÿ’•ügÕ+ú?C¼¾TK‚gñûÿü?o°§8*cHb$}K×›n¨†úºnjÝ·õp:º®8Ò¾©[Ò_‚ ´]û¸W7]xìA·ýlêÝ]ºò5 ƒquBï’ªé;П‡î8m¾k¥0õ®©ÐÀn5&àRðléüLÆÕá@**là‹B?¢ª°ÃW?½b%}IoV²«ß“-½±˜–ì.mäÜØÐ·'ÒOÏïzÓ*³ôÙWÇsùì2z““cOÏÖÜâE©B'pŸÅ~,J§sö Œú銻€ò+“‘87£­‚H+Ð\ ºDš²»«Ùª¬`Šá$CÒ¤F–·¥15\} Ò Û°ñå¸’È ‚‘#\mt7YN±u[“1tÊc—™ÌQfQ^bˆÖeŽÍ‘Ty¶£÷&ù«™FþâK#ü‘B‡Ç°]?súôR$E.T¸ª®i)D8Ê"ðuלö-`ì{P·àûç_} ~"ý©^’ ‹µÁ³¼ŒòÙ>7ÊSz›:§²ÏS¦Q¦(g÷yvò©Æ¢#EŸg«š.¶"~€m‘³£ÁLŸÇQb±Ïãöiû<ÞãÁlAˆíèyèñü÷x>N‡> ”I²'Q³ñ8ºÔì4†ÿS_G15š::÷½#˜‹Þ7ž0TSÅP)ôì§I)#3SpçÆ”¹Ô¶q%܃ÀXÓ¯¡){ú5zb¶“+8£_cóñT'í;í³ªœøÙzꉂ&y }cËô>«ëõdV 1Hú3ZÕ¯ñ õk4¡«Õ7dømÃ×+¿µ‹5Æ—ÏÚ²‘SÕdåŽè3[6†Ë,²í6GÜ\€Œ®ÈÒ‡xáõîÐQpŒ€5íšáx ¸]Õ¯Û§\n$Ìõ.7ج!J„¨ã©Hº¦¹¥ÍR…0t1übý`H]ô¿WÊïèý5÷¿¸÷â@Uܧ§·‚Q<†ƒÞ) »hŒ„sz+6•³'fìÝNõˆoÐ í¡”w-, KaÓÅ\%f25Â’1Òg{+AerwpØûµœí­¬ÓËî­èœV}ð.±áÖO×[Ñ¡“5}¡{v¡ÉzÉR0¬€å=3-2>ñ ã<‚ZNÌDÂZg,ób•‚&škùPœæQ3Ñm¢kÌ‘¶tÁÚŠ¦IMÜ^ýÎò¦Wïu¾œ„Ïx2é,n\Ý+q#§žˆÆtTæÐöX¿£Ç5kš0\ªb‹ó>?ß°* ^Á×­x¦{ýèRÚž2ޱ¥Õ˜¹#º¤ ^Q·ؼ~ÈQááŽd8Û^ôÚÛ-96òÖÊ…Ý!ÚT-¸&¯ÉÖ™YC‚Ą́€ÿ¶ÞíÈ‘Z¢¹ãæÏ©˜¶evÇ4è¸=«PÛj¨®«žDs¶¿Á`~5Y’ùˆÙW™š~¢»Ã‚—ë¾îÞ°'ÃM·5LÀ¥¿«ꤪŸqKVXjxÜò¢º&ô 'Ì8£Ìåy~ç­`7I‘‡ *çÈ@ºe Bêh ò®™Lˆ»’Rbð§«óµJ¨ÂØá®ë¼'ÑU‚Ùú0:EW¾NY1s:Üè¼MçªîèÁ >ÙØReŽGÝžû ~^ló]¦(°ÀÆÏÙ¯§Ož4ݦjnº~x¢aéÖ£ÕgºoˆæO³»ÄoÂjZjŽ)´nûzKo0Þ{LoÞº¥Ô~莄7¦7d{:Ê;UÞÚ—üƾ·ÛêNKƃž"m=õãE {5R#š ~¯Y¥ÀÈ-x.óPË3D âæ?Õ¦·aà Ÿ4ÿÍWïÄ.†ÆÃv?èv ýÇ9}¦º_{5ö¯ ´+Òªêãgë)? 9ó`ÿ–+°ÿ€ÀûŒý×;ò¾î‡~¾™ò€úÿ1PmÙ(4~¿ß£Ý ù׳°£’][ÖÕ[G³/`Ñ­K‰åî@@Ügop(tmsêÝÁÐç-úD´½39„÷ â2™éólÆÈÔSõ´Û 3@H˜jmýÊtxœ41$ø%Û;,L•,wXÌ©ìØÊøvXèÎú„[,4kÀYçè-ùšŒ½ò‚['|†¸7{'4õm ]Ûq Yêcìp‚Úÿé’/C*®qæœ>îZ·L¥/Wcü¯zPµ€ìvcîãp¾º2›Q0-rÖ±¹íÉþig öêk–%î¥ü5ì TçQ’A³¹×ò×`ÃrÓ8JszmcÜjŸú—ÔMÚnâZöŽ<¹J-]KÀ¶#=%K„»Ôn7ð2îí{õÓ àOìîAËwú(Rϰ‹‚Þó,„òÂ4ë=L-—ЬÜî\ 茂R1Ž£K8—Î;ÓUhÉLˆ3Æ“G¸Ã®‰ô×–y¨&q»»¶ÎìfÊK2pìÓ07k̰®•€ow§ÜŠHéN× éoºŽ_S1QZŒôº2j ¥î«†m [WŸÜÝ)g åØš˜ åɯn€”Z¤t £#Ù-ˆ3Z ¥Ö1¸ëû ìæƒ1¿Ãïè`Ví/°!ÁÚ_à´d am[Ÿ5½rê…8F˜ÛL°Ô ±7¨§ægÁ§xÑI!ŒÐÀò§XD¢›…W¬0y€WþðJø¥J®Üþ€®üÙÐ±ŽæËUmí¬ÑÂðJJÅ¢Ï ¯`ýHN++ëûg Ѱ),«bóõ/œûî‹0Ƶ_ÊdLS.gos‘t ŽÁÎK™Žò3pÌ’r~8F—‚ctç~:8û_ŠÔ†îiØ‘&ëU~„¦-åÒ€Ù$vã³Ú}Ánt«é †n>]5Ý`»±ƒÎÄntLJ”>Ë󡙜ázCß‹E7*¤ç×óE½¯›ê¨^3T«ûñ1÷\Ÿù.çáÐõõÀ^¬Zúhë>¨Òân>¨~Žäp[#9—ž#9מ#¹r-I¾lù‘€$ùX$9à†Hò¾»Œ#%b?=ûògGÎ<ŽiÎbˆ³Ì½tGÒ (çÒ%)‹2~/#Ô„‘ ¶ùÌ0ûš‚Ä‘Âa ‰~¨€4}‹¸D`òp –‚´/²‘' 3ÉÂÎwÙ0’嬭@$¤}Á_S`"+DIÈfëÑŸ÷6l¼‰(aÿ·Úx´AØ4º­ÑLIBÛv˜•†g¢JúWT_ÿãÅvüÖ endstream endobj 1592 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1593 0 R >> endobj 1594 0 obj 3741 endobj 1596 0 obj << /Type /Annot /Subtype /Link /Rect [ 329.41 436.94 419.32 445.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1316 0 R /H /I >> endobj 1598 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.1 195.586 257.26 204.586 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1316 0 R /H /I >> endobj 1599 0 obj << /Length 1600 0 R /Filter /FlateDecode >> stream xœík“ܶíûý ~Lfîd½îøC›8gšæák:LÆ£ÛåÞ©Ù•Ö’Öçû÷øHJ»r;M2“;;9""ýþ*b!ü¹Á_E³Íáê½ÂE¬ˆY’+T–³¨ò°d¦€2+ÙZØD=&«ZKàýóª½ Ù_¯~úmYdìñ*ôˆK2o¯¾æY$yYU•’5¢²DIÃÃæÀ^¼9ÄìËN´ÖÒ#¡ð7—žJ”Dñï@¢Ý_ýåöêÅW‹Bv»›L в MAÏy•±2Hâ bv{`?}ö]ßy?6|øügvûõÕë[5:Ùí'†¿E ŒÈz‘¥¡ý†˜ÁOXø/ ‰Lg0 |µWsª~ã ý˜ Éß‹:Q¤Hgw†„²~MæË“Q`Ç( Jkâ$$ê·MëWÖš7‘ÈÛŒ§` Oˆƒ ã<„5˜ÛúnÏ¡]Pìϧ±;Ôc³aoNã¶{lÍ8'6YPd,Ž‚,©ä@ob”HI@&ÇYÆAFaXx } 447ñy-HÒJ9é¥\¼Õ2*l¶QÌ âñ€ûeÊž€ Ö¢ Ðg©0³p‰Ù×ÃÈ6]Ûò FÖ l³ï¾ßbìÉ2bZ!©{ "ÛÀeÓ:GF»þ‰XT%†ÌÒnŰV+ÍŠÍ­ƒAO;u"˜éƒ_rã‚Å’0”2W€Ã¼”ÆFÂ)°„Z…ëäšÂ‹äI9x‰²€i¬y µ§ímÀ_˜Ñ%ÊSOd¨6š zà™9´I_RU¸(€;}¶­³ ‹Ó(ˆ- ¤š¼× •y$”߲Ѳ•a„¥0ÒÓêÊyÉáÎÉ£Ù¸öf‰o©|IèOšô¥‘¬›u*¹i™w–ëI_ôÁ¡ãƒßìÀÕ‚c=Êúæ:Yé^g‚}9V°’<÷)ý‰ëžç*;ÓózÙå«§È`Àµ1_ëZ½ß?1Y)Ñ@;Üo’ýXÿÂÆw;àϺHÑvMï…£C½å(#•&`·¨Ð¯ÛA¼ Ãy¨GO¢$ ’t•‰”dQ]'šoFöP¬í´pÍŽ@ì±Øpºøûo©€ƒ?xü”`±¢nºÃ¡n·‚ÁøØ!Ý!`ß¶B±»®g#‡‘§~‹¹êé W¬†÷B3»¾;€9ûúÇo÷`R4)l3âKèÍx=À$wž0eè ³kîOЇÆÛMßµT0ŒVïnœ9zý±>÷`?=?vý(…Éú5íf<ò;* ƒ—àýµ'P;É‘{‚%д÷¬ÛÍ.™MÌš-ˆ!L›(®ìŽc?wq@*¢½eUİåÒß_áŒ0·”æ™H'‚ÆÆv˜/DˆS L¹|‚ø–§+S„È<*_‡ß*¼œ@ÑRuºÜ&$ç/,r˜*Y*tP«XcÛb".JŸ0¡!u‰§¡ø€äKAQk´íñs aR5‡·–FLQº+ÑEö±V„zvõ`¾nT¬ôr{ñU¼.1øù÷önóòax¿ßÞ½Ü5{þ’·}·ÇU4üI¯¡WSÜ ýb䪒 ) †a©BWË>g7e¤ì³z»mÐú¯'”pÜÂe`éÊ HÏÔ¾#Ä ^G¸ÜûzXFA™AdÉaÅúÂ6í ™ †ÅÇ dx¸èqýy¨ø Ê Ÿgžü@Þ< µçàW2¶é±åçºB`]P'º¸?І™3‚-ß5-xECûh>ª² (ù޳áÈ7Í®F‹þñÃßH“€½åÒ¶àüÁsÊC—¿åcÝìu¼C Œ•ƒ{ñLˆk°1DÝ<ŒÃ0S•M-Óô¡œ6ûb2 ”¢¤?Nª10«²2›ÿVŒëfÖ¦c;%¦ô¸ÒM2z…Õgͼ½íicµz8„z¯A¢T…Á¬C?clVûfÀ¥ ¦š›&Î`ã¬ÒH¥q¾ðK½ò0ˆòÅ^oŸ@ŒƒîûMÝÖ÷]„C%IÁ«@¥Hâõ¼“´€tïb¯ÍC}yh¦aR¼¯P0Vß bÛÄï…* Á ½—Ê–ˆM=o¿ÿi*³±aÂÔ;€´-õ\מ" 3ôiêù¼˜Rƒz3ÎSº‚Œ…  «„4†ØekÑÖ>l‚Sm«òY D¶>$nŽ€t™ò¹&øcݤÕn º cY•uÜ™égâβ´ ‘FÏž¢Ô™§Gåµ5ˆ ¾R!ÛJ•ãÏJ1E*dHÈ2‰{Õ˜X P¶®Uƒnz¾#m>N¦ªÝ‰ NƒRªâÚ>M€Z.ÐËŘÓ÷}χc×n-‚@Ã×S\:zÒ;#PÀ}óËhÃë̓Ù1ú{¬$‹‚0Í«ª ³ÇFÇvMÞUBŽo‘Hí£%$vy¸“s§ Û„4‹Ž£oøGðùJ ¥'üÚ–ñiQžæ¾íz¾ êÖÿ¸áG¹ýZ¢ |½å‰£7¹÷SâFiÄFaO†„cJG<*æR;Ê £tj:ÓÖfÍ*ØÖ¸îÒQúô Õ¸Bi¿$¸Å’KRbaÝ× äq[¬O¼:[v‘û6¿÷õ"?˜‡"sç¼ÊðnÇ(Jg(㪠Ø>.Ë[U<ˆé“Ûˆ`ßm~y‡½"Ÿ™æ’iX…g¨­³*S‰Ý¢@ðÿ}wÿ*ºIeI²ê¡`’ÅäTÙðfÂPó—˜þB“±9|¨÷'$›È%TƒI¨ƒä±o¶Ókiþ‰k½‰e»1’ŸkÜWb9i ¢&bàÚ<9ˆ¬urCd<òV,XEcz£òzjÛÏŽíÆ×TU͘º®ɽÒöša HÉ™f{H·÷ؘ¨OJõÞññ‘Cˆˆp—À?0¤1l«Ã?ÁD’Û”ì Wâ‡4•u(ÀŽ ©r‘ÔRa tn8±Â¤ý•ÄDxæp•ÿÖì)±·¯o ôÝß~÷ú‡ÛQn#hÉö³FmºDí«*IUÃWáØD!”}¡ÁâlÑ\°P×€ñaBJkn§ã}™ÕLy4Í`Ëš‡U§‰©1ˆúŸ²bLüî8„kQ(%³ƒ! b§ŒÅ« KÁdÍdX+ªoikv=QÂÒ"ô pø>’ï±\TÙ(,BU”ÆžÙ4W•¤°}z<jªU òUPdyUVZ@Äb½@H2ža;|,™¦ªRf5ExQÄAû,T,&® eÕíf¤¡æÎ+Ýšž¥…r•s¦”—B€JÒ V^¯+å©H¸¼˜¿ëawð k¡Æ·M÷~MØöUÀò«Ê2Li/JÈvJµÚˆJP-LÓŠÄ8ÞTQT©¢€6uK NÏ: —PMè=£„”÷ö…U{FÕªŸžÂÑI.…Ö ­d'˜ý/?Qè¨Ulc “Uä“Jr£³æ¡SR/¹ÙÂårÿ¦êj›–“qm8p÷•‚åVÓæ'¶^LŠD;›N½~µ'ï¸_¯Ëâ4±¥ÌÔ.ï‘\üÈÛ8ퟰð'$´»Vº–ž3D¼Ö¥*žÏ¶VE¯ÅjžùÃìµJñðÃEfð–ùrs]ßÒënæzB––AWa\&îý„*`?ÖûfÛ€…|ñÀ7¿è"éÓÒ%… 2Þ<Ÿo)<ßR`ÿÍ-×~ž¯)<_SЧG/ÛÆó=…ç{ +î)dEDnz¾¨ðǺ¨°Á|æ&ÀÃùˆäËóe…?Èe…¥‰¾­ð»­ <…<–ùAï†Ô<²m?Îý;î%…*!&õ[ÜRÈ¢Ù{YìœõwÀaê¹U…Ù }î~Â’ÑüíÚ|N¼swÖ‰ä\M ôo&ÐÉüÕ®&PUlL¥;ÐâÄYT/O_`]¾’0§©ßɪ+Ò‘ŽŠFõô¿_Hp­Ìj{AÞõ3½0„USM™Ÿ™k™YW©žéO»ˆÀ­{ø¡ùšáé¶'ïÌà“8K/>Ù#ƒ,Ûa¥µë±ˆ7ë—Å-ôå3µAïr€øÚ´#ÈEXœ)ÙŒøÙ±nï{d'¾<ú–o×|ÙIp´p¬:ÉÕá_xЉ¹aÒ=W}–€–æDµ|¦ç™ —´tSÆ9Ç¼Š©:?­‹gJ{b=aõ7Ò:Híó§˜5dJûõÛc\9„Â';¢¬ùø"¯>º”«O§°^J\\…úîhßÉÙÔ-ÚÞüÄ(jí`wX_7pë_%úþê?ã0Ûk endstream endobj 1597 0 obj [ 1596 0 R 1598 0 R ] endobj 1595 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1597 0 R /Contents 1599 0 R >> endobj 1600 0 obj 3756 endobj 1602 0 obj << /Length 1603 0 R /Filter /FlateDecode >> stream xœíësܶÀ¿ß_ÉŒ óýø(KrâÖÑ4Ò¹™i’éðîp:¶­*Ž+ÃvFb»Ëð3Ì|XÙÈ‚ß/é0vÐö¸ú êl:È D• ;Ä¡#…ÈPF*—´‰¸tY­hÍ ôÓ*_Yè»ÕÏ¿B£²°îWV¯sÞÍÍêGîØ ¢8Ž…®¶£ˆŠpqÛ#zõöè ‹‚µn´§Y¿»ö²F®í|Yèvõz½zõÆG¶…Öû.lÛÇžvbEØubúËAë#úù›?•Å)ë”TßþŠÖX]®Åèø£4~øbDÊ ß³Ô;R€µõ]-üça—×A v|½• ŸŠŸôFsé3ñŸ£6]IëbÆúœÂÇÒm GŠז̯†Ög¶ZÏ‘Tv;Ù2ñº†0–Ð價ùñ:/ò}Q“|Kb¯Þ„Æ¥öâ9£¶eÙQÌ{Y'›Œ š,Œh—$÷E¹Cï+‚’ ½Ý‘¼N÷))[ËuŠû8ô!>qq˽tèÅ¡àsÃE‰–öŠÂœ‘ý¦†V¼t¦ÍÊ»–íuÇÓž^¯´´CU¬àAEzòm>ßsO¨eÖ¬ °/RÔ ÊlŸ&5`Öb„ $ÇHÖí´·3}LÕÊcAê/ÅÞ8Ÿæ@ßãáu•Éà+gÇT[‹ž~ðx¶ ­eë%>7Æ~Sñ©‘ÓëŒ[R«–Û±ñw"…ñt8׫.»çɾ´™xÑ0(§»ÝdY`Øš;?)..È>9eõ`h8®ƒÃp627Â1MˆA[ ^äá5žhðÉÁ!÷.G‡.æ8¤‡(2³H´e¡•°qOÏõdÑB®ÜqO¿Ñê«0Câ¾€ ª¶ezW§E>Hlz mìiÓSoÚбÐ~:ô30ûô¦ˆž@}:Z4õ w;0÷`_Êà­ot™áÜÜ3)Pi$ü)Da¿ˆÆn­}E¦' þÚ8é­üÀñ¶¶ø®>d˜Ð…Ò–ü5‡ ©šœ‘Ô€i¤Ëù[KÃóÑ2ÖIÂÑg]VØ=;Û vÙŸn×7"­óGdÉM”˜˜ŽÍ‚²‚m Ä b`ŸdÕðJDL7ÃnWÒ½ž;—;¾×ÍÀdÒ›uqílÒÖ´¹¸§’>Ã,›MtÇéõÃQ¢+1&câ~Ã8Y’+xžHó[¶ú;ß ' —N/QÔ…%O ž>½´6Û7އÍT7Mvo«}GtNŒÔÖ>dé˜UƒÍè£ZH螤ê@Éoî«Ý·Õc9šu?¢†$C¸W“}T¯õºÕÍ–0Ü2•ºiƒ ”úïa‹(OÚ²+­&o:êÒ¾+Ï8q¬‘wÛZÙR­¤­¥—Fݦô:g"kL´æ15S‚-Ã!;9ž%MÂ,w9h¥z]ˆì£VóvÊjYª-%=(IRL¶’¦ïXÎR¦¢E˜¢ºlë}—ûyd‹- Ÿð4[9G±ðóhò´´ä¹>¤ºãêáº?U¤Fuy"/àùHòºR2+ÚšlOÙ!ȼh—ÔÉ&©*6#Û±õªNÛ¥QÛ";ó %ùާdIÇÑ´©)Úªp›»Ájžm‡ÔwqèÀNZÞ®àa—îS¼À§s†T´§¹ ¬Kþ‘Þ£ðŽ«ãÙÉn®„íéZ:ì^:âýˆ}Ð\·Ù ¤x‘ôB3aPc©5‹„Ò¦aÛ1»–ûîDwµ,m¬6ƒ!öåË5 FÍÝ6Ñr¹T±BfðÎÆš*³‚1x~©½E­1ŠtFêa[%­—ktq¶>{}vsÉ‚÷êì‡Ëô/´¾~‰þÞœ½ƒÿ‘ ÍVǯvàb?¤c°}¿Ú*½©“²¦¯Æ}ZP} è}¾#eµ- :áE9/ò:IsÚâ¢È²jI™lkh3†j!øAŽaµ†Õ>ŠÕjác`­µÍîy64 ­5´v­µc¶Áµ_;®-Éí Ö4 p­1†×>^K·Œ“Î°Û ¯5¼v’×:VÜŶÿ×ÀVö¥!¶ÄvÈPÙ>CdëÀª›;ú©™íb.‹8vEr›æ¹ °æ‰íI!\ÛŽpQüµã”kÛP.v Ø}j°{}ùÝûwg×¼L¥¡eÅQkT ð:]“=) =­[è\¼4WÊG£ã;žA¶Ù> Ùjác­A¶Íz64 ²5Èv²umØX{Ù~íȶ9a[’ý4±ÕÆÛçAlgOØŽøÝ Û¯Ùrl»òfW´K«ä¸IoOÉèœÃ(®ëZ](ý7pñ)ì¢U*ªU€„îIª=ÔÜW»_DqÇÔp‡)®Ü|H½)Š»L%âÊýQ\Ù—ŸâÊ–j=çi¥Q¿)½Î³½Ñî,Å2ÔBqeSIʃ’“Íô¿S\=ÆÕecè»ÜÑ#CXäiYø„«ùŠÚµ…£Ÿˆân“SE(E¤,‹’߆E^UÔäHòýòÍ©:%Yö€x6£”·½ùË· Žm`ï<ÍmÓz…êCRƒ9ÚÈöU‘}$;´y@GŠzáfŽŠœprÌÈ2Å¿I–&FoAéýž*Ö—‚9ë3ˆ(z¹†wÞ®Hð¾Cò‘ÀàT9¼Ä¤¡0~öÝ—ÀeJÇà²×1Q$ÑÕw.„Ëв…ËüZ%¼âV`épjúpw1\³k¹ïNtW+ ®Ü †Ø—/×,94WàrWVàrO/Rl¬©².{Q —õ±OÀe?˜‡Ëo.¯/¯ÎG–=úaâ½£Ã.F7uÉþ<ý'Ad›%¥º„ÒRŒs‰¬l°ò£°²>+¬ÜìògCÃ`eƒ•`eÏ p¬l°2Çʬl¦ç$5` V~Xyî ðˆÛ Uþʨ2ÍH$ †3Š=ªø¦HœNÇÉE2¡ÁÉÏ'˾48y'Êàägˆ“)~ãŽ^Œ“ÅwE)Um q¾Kèçè7Xª¥G}ïJ²M+XÆÓdKO£úáŽTýD3gÏI–¡?Ÿ]ŸvÝP[Úhï:ŠU¡’|8¥%…·Tx#à@ZæRÐþ 4?ƒ| Ъò‚k›òÖRŸ ÙvV4©ØW(ð> endobj 1603 0 obj 2838 endobj 1605 0 obj << /Length 1606 0 R /Filter /FlateDecode >> stream xœíësÛÆÀ¿ë¯¸íŒ…‡'?êåÔ­*?D7“Éd4 ‰˜’€ ‚R4mÿ÷Þ ÀÞ €dYRl$ñ8v÷v—{w?™/{rÉ¿ûô¯x†Ñb³÷E´y(ÆÈDS!/v"7A$n’0AkÚQº¤]Ä¥ÏZEo~³B¿ì{.úyï·ßI§%rÝí¹šp.æ|ï#QFŽ%³ÙLØŠ/I¨ ߉ÈÅbƒ~z·Áè¸d½ë© ÷Å­‡ù~¹èzïp¾÷ÓÛy.š_u)ày¡ÄÏÑ,D‰ããý£ùýö—Uy“Uužmÿú;šÿ}ïd.FÇ¥ùƒÉ±Ã’Hz! \ù`m{×JþŽÏÛH‹ƒC2 úÒZÄTüM_h.Cæ#þ·Õ'BxXsÖs*·#¦z®“HQÀ>î—S뙽¦RŽbèÄ!ÚgO°ö}L/…0rr“츮纱v+ M<'lZhÃ>î7˜‹6kâxAQÛ¥ž^,«õ"Çhˆ¦ß#Ú‡%kVæÒ›u ÔUŠ£ÎöY›2ÐyG¨!Þí¬°û™>&Û.¥t¬¦´Ëò9¤& x>Ÿ¥›Ì˜ÐÞŒZä)¤'Pà:.éëzê?s¦á¡Ù£ ãÞTša?æƒN¥p jƒ1ˆCRUÝZ4um9#2¨§{¹sȸäð'v&>87޳«t·®éAê ǃÙýÄ™ÅtFkocÌoùhK :<8A t˜!ªšÉqË\hï…UÂÏšó j¡ Ö쳦‘nÂ@™U½’DÚ.ªü¦ÎËÂÛ‚º´FI)wÖÀIR‡œäÚT+13,¬žz% kè+ð 0 úéëWÚj–I¦Co[ìiËF…*ï‰5_hcÿÁëö‘hòJ`ûwvÿL9 &%މ$L™×+œ¤lò*ÏÖK¬ïJÉL:®mVSˆg·Iƒ“·éz—mŸA¢^Â8 (¿ ‚D aCXßAÍZ jŒšó«Qw@6“…×\n8#i‡d[-”«É`´(¨o”R#pbʆ”SC|jÔõÖqUBݽ„5;"Wò±bÊÔuçkÕ±÷ Æ(ƒE}éA¶c¶>&££‡”p”¨çl#ö o«Ó÷‡ìpúþìç|Bóû°0Tª¦ïûÎ ãéŒítÆ=挭š?Ó!Ûémƒ2†sc:e;²qÊÖ]'P'©‰¡ÿx }]×·iu‘o/ÖåeÿĤäÌÄÏ¿~Î6•½³Ž%ð@ÿÁ:ÙÏ[ŠŠk$ Çb•V ‡ˆû˼H+Æ*l儱s?ŠAJ½;=#´±Â¢•¢¡{’šCîLì6÷±s›ž™Ãî&óúØù8“våÛØ¹ÌgcçРC†ªÜY'IªÕÞ ;7zê•°sè+ð 0 úéëÙ¹še’éÐÛ{ÇGÚ2„Q¡†Ê{bÍØQÒDúìàÞ7莞§e”¹Úeo8ߢúþ&CËl±N+Á}w[Z›:úÛÁ'VÅýỳƒO¿Òz|9â8oSà3v>õˆr/*ë^TÙö&[Ôùm¶¾wÐaË«ßPÜ{ÏŽüÊCkZKÆ `Ÿn,عô»0ðù†ªyrõ£ókÈa[-A¢"à Qì(¥û ÁìÊîTw­½Ândˆº~Ø2b䤻„€»{ kvø‘äcÅ”1ØZ¬Ž½ÁÐ-4XöÝ9#µÀÀA@98™yý@û¹…ØAGe± Y]ðÃôãtöùôÔF€ƒÄ×M&<àG`5&<àf/>œžðÄd"V'©‰ÿxxÁ7Ån½6vl§%%c&þû}ðß¡óÓ¶¸Oø÷ÿ—Ù*½ÍË]%¾\ öDyq[®o)‡ _䥵ÄÎ~ƒ$ù4±ß?5û•‚9±ßökôÔÄ~¿Cö$³&Ò_Í~Ù‡³üåkAá%•8eõ–aÖ”Ãe·ì°1ŰUVï*þ[ò‹â#á–òæµµe2&;ܧ¹GïÏŽ挭öþp®õGs#ßñpìz©7q˜\ú5‚ÒÃÿûGåz·)Ðç³w‰š£î¸º ë†qè³`ºÖ}ÖUógºÖmöØÃ¹1aÝ ëŽÀºáÌsfê$õÂXÏT…x¦ð`¬+ÄjúY{SÇE'2:U'»ï®cS(ubmU0cºfÅ6¬ ”>ëîŠüË.uÕŒyQ¬+FÛébÎú*¬+EMiV#§ªëÍ‘6ú]°‹‘Ö Hw5ŸëÚâþа®6x´MÝÄG`])rj»9MT#óĦî&ʃ±.ûbôþBÚÁ¯ò²Ã/ß…äÀWäò¯;Û9p„]€ÏÆy7³ÕB?>Åúí5ÜLí&`*ú›Sƒ4*% ÇH‚Xù=2õþ‘¸ÑþÿÆÁmA|bl'½©øÄܽ©¶üp&Ú”UFYÖUÎNY²osŠG$ò/Úã:"¶&BQŠ6ùô ݲAþŸýäÿ;×ÿ¹’ïÈ endstream endobj 1604 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1605 0 R >> endobj 1606 0 obj 3442 endobj 1608 0 obj << /Length 1609 0 R /Filter /FlateDecode >> stream xœímoÛÈ€¿ëWìLjy|'ìØ R¸Nc)9´‡C@K”-ÀRrj´ýï}!9ûFÒŽ/ñywÉárgvf4»ûd­û2ñˆ ÿÑÉÔ'‹Íä‹y$ñI Q/qb7%"nÒ(%·´¡tI›ˆË€IEk~sC~žl'.y;ùåWh´$®‘¯Wëœw3›|åQìq:N…­¾ã¥)U81\,6ä§wŸœ¬um=íÈýáÖc‹Ï¹äzr2Ÿüô&"žKæ«6G´ÂD!Ïç‹l“Ú›R‹<%ƒô ]Ç…¶®§ÞññS'ªÍ­3îMEŒÛ1´*…UŒAìëUÕ­ES×Ö“3"#ŒzÚÇ­C†%‡§8±5ñÁ¹qš¯²ÃíÞ˜~à;IÒ›~:Ó„ÎhÍmâó[>$* Eƒ'îgˆªfc²CÜ2× š{a•ð³f§Å<¬ZèÅköYÓH7¡'̪žI"U‹r½Û¯‹­yò¤SØÑ¤’Ë+"/ßa[ÐyQn_˜Y­ïꦞÚÎ"°Zn &ÑÎØJ ¹¦µ–µeÊ#'VŒâ[ú²¾ ªD"jHËFÕÕ±k†W{ÁíWÞ8D¨à½j˰4x8&®x/ôåbÚÞ÷DÃÖ(¬m7bÔHÂtÑ…êéõ¸¦î‘ëå.JL>ðCÏñ}T |(âu=æ­ Qd1o'Õ$î@ïÔCÁöp(Úª—I}Ýw›*’µCuú¦[Ø1¬À2¶æ…Íh=/¡c™&>T$hQ^OŽxæ…qD?V(/s²¢Ÿ:Ïá *xÄW3qØ~Ú”Õ]NcOûˆyhý7W$yÜö›è¸QAwÔŠ¾n5´eRwÆ.E­"&€Ï¹ç4évk7F-ƒ¨µ<@¥ªé_èr±³Z½JêÅ,»B£ifš)I•‰&u PAB$Ÿgfgsrz9ž‘Ù‡sòñâ݇gäâãùùŒü‡Ì/áæ¿äÍñ9<ÿšŠðlæ+J"H×-aĵ̳«Ûœ kêyyØ.2:³‘¢$—Åa»\o¯ÉzKæ÷»œ¼.¶wyYá‰OÉÖ8­·ßãí…lОns&%ϸ7û}ïÍžr_Ö“ã¶ìº-{²-››`{’Ès“6g¨UXß]‰-ý¦¥?UúSÝ€þyÇÜ­¦ŸÉëò-ÁèTì¾c¸¢›B© g£ª]}6~kü[Ò=ûèhÒD#Þ.] ËéP}¹ul ³ÿ¼§KÎéHÊ—Z9.ÞJ îO['úl#·cmu1Wɪ{§c—ªfcÜTuÒÄÞ¢ 7‘R¢; b›˜H»y"¦cÐ¥R¯ÖÍáa׺1L$ÚŒS«1fô’„uÝÄ3‰j£6UnÎÕˆÞ$±©û ³dH¡¸Êo²»uq(I±"{ºõY4[²*‹ 9}ÿñäüŒì Øíóë2»åY…zõ5÷ £ªzA“{?Fž“ÒI5•[GPç§L,x" í›Ô¸‹êçr÷¸ 'ÚÌ@:0VÄÍMæuñÅa&)÷o%m(¿iÄŽ@Rd­«ÞYÃ&õÚç"צZ‰˜‰Fê~z&4{ ½ˆÇ„ Ã^úv6©f˜d:öµÅÞáq¶ aP ±òŽHsˆé‰iÕZ]¥VÎoÖÙñC"÷¯È×›|Kª|OVÙm•¿"‹ìPå•Zš+µ6gÛû¦>óÆ „7I)ЖCNîõÂí+Æ,ù•ì[<ÖA?K§)çv<н…ϱÀA‹O¾WªßD4ƒ¸…´üÃÓFK˜¢Ï8SW– R*0­è˜]ã¾[Õ­TUÜ †¨ëÇ’#‡æAS{b|/1]ÍŽ –|¬˜2„ïqxÕ±wPÞ0ìü¯ß_|:»œS¾{ñúx~Ö…zm˜×KaÅÁĺÂy}×!§ùb½Äl‘Ö8§ë»5[ÜdÛ%9þô–|Ênh±¢|ž}y<‰3‚ÞÇ^%}FÔ;¢ÞzÿÝ›#ìaïØë{©ãE#î}é¸7»»þ\ÑUN÷„$gË{ÿ°×íœiÌ1Yï c½K±ªê½ÐÛúÀ6}(·ù’\Ý“%ÞíorºEêç½´ñßÏNß_ìúºÌ¯³=lýÛº:@°&mfþœDF›Ä YU ¡}“šw&ŒÅ]$ØfFd&Á¸¹É¼.<Ì$…ãþm$Çò»¡`ì $1Tî¬q“zí'„ÕQ/ 69ê™°`ì*ô"2 »éÛY°šc’éØÙ{‡Ú2„A‘ÆÊ;BÍWæa=ï†Á'PùÖñ«¾e^Q µ:kKsQBufì ®´²{“UìÕ*ÛäœÓêÌk¾xÔ4^öa6G8ä ¨zw1?{{vÉ:­¸}¼Ûu¾"?Sr½Ç4›> (›òi>ÙÞ*¡U¶eï×¼ÙeÝm5s‚Ð >X©€{’RÊ¥ÉzEÖ{zc‚!¡Î›yŽi¢ÞƒAPç5Ã'btƒ'Ë&Åm±'Ùj•/öšQa¬%0<ŸNAÉU¾ÿšƒKà-ùXu•s›WE){j]i>Zèz\OŽÛóϱ˜¼újcŽÑèX;ÝhI|•®'¾J·)D=F¢qß­êV*¨6nFëSÓ%FÍ%ºÞÞKt]³#v%+¦ ¡ëq{|Z{]é!êÔuƒhtˆÙëcHÌ¿l›¼\/x†þuU ÇCºqÁ…ª{™v»¢Ü³<¾È.DæÛzMoDè#BB—³g$è#A¯¹F_fŒ}èzÐ_d{NüÜK4…êt4hê1wk˜{j®Ä*xUgÒ7÷t*”‰x:ƒø¹Y±Ÿ#¥âçËâ+œÏÛÌœ*Ít$eËåçb¤HW¢©~ ?—"¦ˆÕ¨iêºò£‰¼EnbD£=½»šOzXÚõgDÐÅ ¥:¬™¤Î.ÃfÕF)nªÜœ$ª½YbS÷¦ÉƒOKçÿÞ•yÅOãq„NƒT°ØÙ±w0õ›lÏ?ÿ®Ï?£PŽçŸ; ·ÁOÏ„y矟òüs0 xœŸøüs ¿WD­ô/-ÿ•—…̼ “Œœ²µœÓ ©‡~ζPÛù®>þ¼¿)‹¯Ûñôxú©@׋…ã‹Ç}cú…—žëži}‡Ì(¡-ÊeÎV+ô»4z8m˜Â˜Ç³Î#¨}¨UÒg$µ#©­·Ï½©1¢ÚÕ@µá4qÜçuÖydµ¤Ÿ¿<5«Ýno«Ï«uY™ËN3%Éù2ÒÚ—Ak-aqí õlóC¡¬eÿ£ÙÈ ÛÄùd6ŒHvË2éTôQ€ÑÜ™È,w‘Y›™Ìâæ&óºÈì0“2‹û·‘YËï†f±'4ÄN¹³ÆM굟ØYT½hÖä¨gÂf±«Ð‹xPÈ0ì¦og³jŽI¦cg[ìhËE+ïuÄ«[$ý¨óÈlÑE²Ý.ÏJr•¯Š2§§d¨¼†±ŒÞfõ±eŠq×gPù’|]ïoŠˆwùb½º§…™Ãë›w—³94ëG´¼ýùñl®Úµ‚cn5=, oFD²=.¬a½EæWý'’é¨ÈûËÓ³KròÏŒ˜D#[´I$m©å@F -F̯ePKš¾ #‰Îh3bѱ8ÒkbÄ­´9>+1b]?– ;À,1âö^bÄša*ùX1e#Ó†«cï`ÄQÜLjñGä8vaUÓ·S™íÙiQlvY¹®Š-û”’]¶¤_cýòc/1ñˆ‰…‰qxdÄÍWwæÅˆG@<Ç5gäÃX’ÖóB}õxrüpܨBlœ’’ aMó¹Úe‹žéIÊ —EŒ‘@KšŠ’ÍéðœHrªN;šAOÄ‘S“cƒºSçQ|Y&çÏŽ/Wl#UñíÓ¾ÌÖ·ô«7òÿøõÃäÿ^€Cå endstream endobj 1607 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1608 0 R >> endobj 1609 0 obj 3283 endobj 1611 0 obj << /Length 1612 0 R /Filter /FlateDecode >> stream xœíëoܸÀ¿û¯àÇpt©'PXÇ{­ ?ïú’C¯l/º»Ú¬ä¸F¯ÿ{ù’Ä—$Æqß™yYœ¥f†3cŽø‹|Þ €¾"_’ ‚ËõÞg. @й(ŠAx±Ÿ‚5àƒ4JÁŠL”.É~‰¨”Ïfƒðno³çƒì}øˆ'-€ïEànÏ×”35³½·Øx{(N³,ã¾B/HSby1¾¸\ƒŸŽÖ–tvã=QäÿpïEPŸG>¸Þ;˜ïýôs̯º‚È Cç8‹@ê!˜‘Ì×àÃ_ÞìÊm±«—Eõ×`þ¯½éœ¯ŽÝJêâ_‰G‹Hú }ù¡ÀZy'Å¿C1–x0ÂË ­xNùWòAsѱ¯½1᪄›Õ Ñ`=¥ñþd$äÆÀ÷R) …BøåÒzâ¨i‰”³yI^Ñ;¨ü$—\DÌ¥z¾ø~¢ ¹£iàE„^Áa‡™jŽm(ª\š$²Ù öŒŽhöl}\³æ–Ò€àÙt^ n’KŒ6Û{ûŒ ht¸ž!1Bt;/úãLn“}—J:QKÚ§õ‘& Y=ŸæëÂXÐAF< ” Ò (ô=ÏõuÄÖƒ2/j_[=š2ME,Σ1èLòª>“8¦Uµ­eS·6R3¼"Œvº»€ØG ±sñ«kã°¸ÊoWµ±< ‚^’ŒVD©—%¤£µÃ²![‘„|ÂWˆ¨]¬ÕÌÚäÒÐ7´cî³æg{¢inWT¬ù×[Fº #ud6õL ©ºÜ-·õ²Ü˜›'iUض”|¶#²í;ì6t¶)·‚€=˜õz?¤¦i­8ÃO}ÄéTž¥žŸQñŠT{¤ °…îNâEÍç²úVÜWÚT}‚ žYÅöÚè^Ô$ºE2ßÒ¥6„Ü  _{zKœÉ@L¥Ïo¡¼wã‘$ö)àûq+!Ho}uÔ›6IëXˆü>ÓJÆäÝÇ21Å †›­‹î¸?4[•]¤4|Ó‘Ålž´¥ 1RÂâšÇÄ()þöm“&g#J…I®‹±îñ×>Ï=K°J´h| Óô)ÿXžûOt×”|÷`Á:ð>¸»)6 ¾+AUï–›ë ä»\–ë-þºØ7¨nÊ]]ìø°¬À6_,Џ[Ö7 Úæ—E>We{ã²*7xG5ß,ù©RpBÅ¡-;ÞåUQƒ«|Uû`SRSÄjÿ[Ù®°1£-ìJy[7Ó÷±]“ã›â Ÿoó•æÂg,äãï¯1§ê’jY•›k|S¹)<í‚/¤{˜kØJ…[ÀìûàŸ³·Ç‡à¶Â!;=o&‡’ëGWྼŮችrµÀ+¼É¿,ËÛÝ>¹´1"Ó<‰SÅ;>žÌÎNÁß.ËÕ*'b`ƒÏ~šrÿþ9{3y=…ç4ñQª›þ~ħDü„â§Ìê<ÿ´*ðD†8<€`VßcÁì~Sçÿiµªdˆ¦xQ˜âñ…\=Qü±Åc≱ÊpxâOŠ' M°öûÍß‘4» Ö6Ô˜{?¼÷è1t­EhÕvdÕzÌj ½Ç‹„¼Íj3ë=ƒ¥I<ŸÜTÇ1Ú¸µñmn@úÚ:1ÆåìS}^y}†ùmñ ·#©ZÓâæ­ìÁã¥Ò§Dï6j[Pm%šéÑVcT©÷CÖ4sCõÑf¾Ç–8E*ˆá"P"(:Ø@fQô°;ØkŒi—özuã´O¼¦ÆÐI´–Ó˜k[I+i7bÍ%µ½ØµÕG)qªÜ\%ª£eÒgî;Ö‰ÕFq»Ý–»\•;zü©èñ§’?:üNÚ¿…ÿ!ð™©3Ra2Òà7’è2Ão4Nטú7zà7Rá·æo?ü¶sIßÈ~w©|2øŒITõ¦MÒ:ÎD{L[Ào=NÏ~#3üFfø-FéÛá·Za’ëÈÌŸ–çž%X%Z4>¿S–gkð=A*gß„7×»Ûbä«UyW18[/?-WKB[)ä.×È«mqYW ¼b@v±ÌWX`ÃSáO… é„O…-áƒÖ< <j<µµ‚4žŠ4žie”3T(ðTdä©Hå˜H橺}ôu<)<™yªæ„RŒWlx*ìxªºöžŠO%5ž §N擃Él foÁì×Óùä=íòÿóó‹)øü<9ÆŸþOèô}è¢Èƒ¤¿…>RÑiä“5aOaz±{ÉËÑÓ‡ÑS¥|>uø´9ÒŽ–†ã§ŽŸZðS^9€ê*¨ëªîHr¹8‚úBjOÞB}ÁõdÆŽZÅî }G̦Â$íêèGÐÔ03bÌÈWè¤"Àº;‰;xd¢©¢xˆ¦ö¸!Úiª8ÝäÞMµsI¡©¢þ>š*æòÉpª‰N*ºë+£þ¼IZÇ)›Ù´š2N5ê™ðT1TÂâ¢ÇÄ0};OUkLr] v¿ö‰îY‚U¦ãC©fÓIÆýH@µº[Ö—7EEßkÍw×·ëbÓÔ¼>;ýez>W·›KúÖ`¾YÜÉKb vüEb jK¬}÷-¸–°¼>\‹Â–2WvÑ×Ò×;`©àÚÖJ«¸Kt\jk¹bz-êîLwRŽIÅix‰º}Qb±r<]µÝXµš4à]ŒWlp-]<»T×>€kCh‰kOf³‡àZ’ý7P?ÓÞt=pro‹kQ”x±£µŽÖ>ˆÖÊÕã`­ƒµÍéy¬2«u¬Ö‚Õ¢$ô‡jªe¨ö~ÕÊÕâHí !µæ´;Pû’A-=ÙZ”mùü>f> U> U>ÛÝIÑP`ä³¢xˆÏö¹˜ù¬8ÝäÞŸµsIå³pœÏ ©|2<+BB‰ÚÉ£Þ´IZÇ¡]é`Ïâô\è,4ÒYqM‚cb”ÎÂ:+ƺÇ_û<÷,Á*Ñ¢ñL³Çç ²k|¶±¦ŸM5>kc´á³±ÀgS#ŸMU>›Ê|V³/JlølªðÙÔÌgU?hÀ»+®Xñٸ㳩=Ÿ mùì¯â³aŒ¼7ПM­#´#´Jù8Dëmsl- Çh£µ`´ašy¾{ŸÖAZiË]>Ü‘ärq”ö…PÚž¼;Lû‚1-?ÙqÚÈ»r ö jÅ\:R;@jMr¨öOˆj#?á‰þެvSn^Uu¾Yä»´8ª mæ^LŽ÷ÁùÙ»Ó‹“ýq`{:}?ÿerLAïë‹ósrÍvrÆ~ÇÞÏux×á݇wÏÎ'Á»Q‚—>ŒP¦âÝÔoʪ¾Þ¶ïàF)yŒr„×Þ‡^¹zàu€·9qU†ã»ŽïZðÝØÜup—ÂÝíõð¸b­8²ûBÈ®)éë¾`¬+œìÐn Ÿü\6& …´ÃãP8´Õj6íØ@ÛWúiŠšágBi´„;ø¸uE?“Âsàcþ» ƒoJΦçG“ã>ljš{kxÑy<™ÍUööhÜý¿ÿ”Ì$Ù endstream endobj 1610 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1611 0 R >> endobj 1612 0 obj 2988 endobj 1614 0 obj << /Length 1615 0 R /Filter /FlateDecode >> stream xœí[sÛ6Çßý)ð¸;“°¼“zTm¥ë­·¶ÚnÛédh Ž8¥(‡¤ìfÛýî‹É€ ™Ë:Þ˜Ýî„„Àsþ8çb™·'²ÉÿžÓ?¢…‹ÒýÉ[Ñæ ÈE^(š‚9‘Ú1Ú#q1ÊiGév‡k½ùÉýtRœØè›“_#¶È¶tbkƹ™«“ï‰ó ´¼0^,B«k9qL]xVHÒ=úê|ëݨ§†ìÏ®*ò÷(²Ñ›“¯7'_½c£ÍMWŽX¾Oâ.[ž» ÿ¸h³G¿þí»òp‹Ë:ÃÕßC›ž¬6btüRZ?.ù7²XI¾- ¬mïZÉÿ}Ëãm¤År2 úQ.r*þ¤4‡‹ÿÓa \¬fˆë!›“Ñ ÛŠ¥,¸^Â/—ÖGMK¤œÅÀŠôœ]ÁÚŸ»ôP#'—»–m;¶i§BhìXAÓBž»Ã‚¹i¡Y3Ç'µ]êéD²['´z…hþâ}ܲ¦€´²€Þ¬ îR´ôúl¯59Xt„‘ÝN…9Îô2Y»TÒ‘ZÒ6«ç€Î0ÏëùU²Ç½í,¨"G© ½€|Û²I_ÛQÏøx¼…4 ï[=š1M¥öc1è\Šªz“8fUõ­eS÷6R3¢"zýtw™VŽÄNâ{ׯ¾IŽyÝ[®çZQ4Z®[‹ˆ®híiäòS>$Úâ‹ï] Ð:¬Õ;O‡8e¡´çB•ˆ³¦Ó º~¡aMŸ±Œt #uÔïê‘R•–ÙmŠþÅ“.UDG[J6Ÿùôíw:Ÿ”Û‡oÌŒê‡Ì4Ë@g, ªåžD5þœíÚc:ײ¾Ìy`…Š(Þb*_f«Ç•°(²¼ìUÿA“»vxMìqçm@„ nUÛ†ÅI‰sb‹ë|WžL»ó‘l˜ ˆ‰µ3#F Z¸H¨ñ—.ˆ€Ýg„^žâHˆ¢¾¸¾c¹.˜ \2‰7óÉ´(h&ÄÌ 7ó~Ò¼D8À5ÍP E¡iöêsߨîJEÒÙT6”0]áhÆ CÊØž—Ülñ„¾ãDt,‹È%3éQ¾9yÎ+Ïúµrˆó£ú­s,¾¡"ñÝLèwß6e÷@7†‹ÐѾbØ¿„í„+Š<ìì“›è°uAï¨ÃnhϨ1Æ…½Îk ßsÇj?¤·ƒÐ“8™0"ÒÓ :嘪Zû— ƒÕyuÒlfÙM»Ò,P¬,4±E&*R‘Ç×™«Õ-7˯—W+tõý]ýüj³üúî›+ô'Ú\þ°B¡Ë5ùô?`!j=x¤`)Zèq숵,©“ë¤Âè‚Ü'tI«zkÎVEWK6L>±ºâVr“\瘎Ô]XHìµoܼ»ívåJy/ÈjIJy¾§{J÷tŸî~N)Ÿù†îÿû†îSÞÌ–Æ|7÷…ÞÍ}²;9¾#—¹ê¥-êd,ôOÈ;=+¶LhÕ%iÒòÓo¶gý±0‹·ÙQ}FcëÏ C©“ȨpÕí[Û¸µñm„ /BúÚJÑX¹M÷ÑòÏ»êm¾½¶¶|Úy]Ó}ÍëîkúV'µtp2Wæäñº1ÑWu™P}EšëÑ¥§×¤¾öô¤Ps7T,m|Á.Ru W„A(°­†Å„jØãý¡|7´ø˜2/ÍþêT:=÷š™žµE[„wíâÒ¶´S³&I]p¦-.ªF)wj{¡¨"F+ÅäîX*S&:G Ã b3JKœÔx‹î³z‡ŽÅÛc’g7i8½\-7+DnöÖ«¨HÝl«ês`Åгbº‚Ærorÿm/X³`zJñÐ]Iå³ ù\6ß6!G“ à¢GؽOÞƒœ&I‘о‘FÂd>„¡­@¯­ž'Y ’mr­ä¬YöEê‘PK+p!ãôñ S­2I:Œ¶AïôL†0)ÕÐù@®ù^Û›LgX[™a7;,MŸ(=ì÷I±E%®È^­BYôrõòâòg1 _¿Cb'g¡+\×YñÕÄÌ]’1j¨W¨:÷ÂÐòÈàãÀ ti’îð¶¹XSî-|+¤apÃX¿ÝJ"!«Ð-§obwîºÊ5÷Yž‹Aò1r=c¤!êÖâj_¡ê˜îPR5¡ñá$Zx³&Âó-ϳÉ÷6òtyúÕ™¸.)1*5JnnpJ×¹„‘D‹46«]âÌPÛ-#Õöco}6 1úËú3D+Ž&p`Ò³EÛü"çÖKhƒ99#-¶Ü2É©€ÛÂ0;†¶;×]«Àа¢î¶L9éîµsqÏ%®éðc)ÆŠ”)TÜ[,®Ž}€á?[½Xþ°Þˆ*ÜüüÝ ý‰DeþÕ”6dä !P©¶ë¸VlG¶ƾ‚µÉR„6eRTIJy:=uyÈÑËÃÖ·]—LxŽ7Óí™nÝVëgÆÛ3ÞnÃxmÌ|{æÛø6ÝÛ{ê"5óí'É·ë?†×#¥Tfžýeðìüþ^ .6†ÄÏ8û‰áìmó¼P n…Rq+´‡·B¼vƒÔÐç€×äËÚG}[ÁJñÐ]IåÐ/}ó¹l~¼6È€> ¼†Ýûä Áëi’x í›àµ”̃×0]+Ôk+gæÄIVljf¿k5g=ðº7R^ÃX ᨀ0§‡×j•IÒa´ z§gÚ0„I©·rÍ7ÒAÜdz2¼>/¶YšÔ¸büÙ4© :ŒQ3ýr¤Ëpuõ ±åûÚß±DÙ÷þ.MŽMòüp·Sˆ«Ë8f?qu} ÉAƒYÆÅÑîHz¶Ä•CìÙzñB•¸’…xNr*(«0ÌŽ¡íÎu×*H'ìÆØ¿ê¶L9é.×î\"®šð.ÆŠ”)Ä• žªc ®ž;D\7—ËWWËÓÍùÅ+tzñjsy±F¢õÅé·W”¸þØžN"¯ž[qDBíybÏéž'>¯9{J­ñÎÙ÷â W}nÙaÉŽXŽf;CØ‚°jýÌv†°Í}ñxmÌv†° ¬ç“퀺HÍö‰BØ×9ÝÝ ¯JJÁÌ(öË@±%N¶¯éLYÝ: ›‡è¬I†ÓOga÷>yCtvš$…ÎBû&:+%óÁè, hu!¥SÎŒ‰“¬Ž#;ƒkg”ÎöFê‘ÐY+p!ãôñtV­2I:Œ¶AïôL†0)ÕÐù@®ù;ô›L 0¿2 …“t‡ |*N¦dX xö„l±%ýÊ,ɳSâ5þØ/¤ºˆ*¼Ë¶Ç$o¼U(M ”î’â ¦²³R9…SPhbÁ^Ø"L`hG''²`/ìX0?–,jÌUX0iÑYìd, ‹'qûXp×Ú>õ*±`Ý?l™öܱĂ»s‰k:¼Pб"e ö–«c`Á¾?åéÛó«‹õ’áõêÇåÁ—«å:½xùò|³aâ^­.Ï—ëó_ØsºS°°O†º ±‰‚På®ü@îå!ϯ“ôwú,üù’ÑCLLØ÷#Zú3ž™ð1aµ~f&<3áæÆ|¼6f&<3á L˜n-|u‘š™ðSeÂ顸ɳ´~]ŠÎð ¥Ï̇¿ >\—Çþ­I³úò>cá'†…1ûopé«'¶âfˆþg½‡z‡KÔL%"÷Mg˜ñ°O&Û®¬>Ž£^.Ç nUˆ‡îJ*‡œõáaØ<„‡M2¢~< »÷ÉÂÃÓ$)xÚ7áa)™†‡a(@k 1¡rfLœduœ\G£x¸7RÃX ᨀ0§ÇÃj•IÒa´ z§gÚ0„I©†ÎrÍ7Ûdo(2=ÿ´Ãôµ ësí±(quÈïøûÄÄ‹² %ׇcêÚ%··¸xÆsz,K\¨ŒÑ-_ósðfü‹"å¤@øß¶’¬¢¼˜I–ÞÅ@?­pn’¼ÂÏ´Çɧô\¢ö-tQäïXÇœ²ñzü%ÂV½Kjt8æ[”&Ç óƒ‹í¡ÀíÊòP2ñ¸>–•OAz+¼Ú1STÞ5Ä{Kl个4Mô×rIõMŸSÀÏž·&ß³ôw26bŸ¾$ƒŠHò—ér‡QU“ñîiz¨Âô°¿ÍqÕYèœ †è¼Ë¶ü}šú¨¸$‡Z#^®³<#Ccï‡âõÓþ¼‹‹7Y+t¿ËÒÚÚ¼°¬h‰;Þ‚rœ‚ü#ºÓ0 ÿȤš4Ì›õgZMß‘Û!~ ¹{ë…¬« ò}¹Or*0¿0ÌŽ¡íÎu×*P;ìF†¨û‡-FNºKÈ¿;—¿¦ƒ¼‹±"e ògƒç‡ê؇^FmÓ¿˶½Yÿ¾¼X¯¿^ž~‹ø£à/Öç§›¡÷S›P@î\‰6Ûõ|íÝùêg{Œ~i¦‡ó‚|-ï’œ½[ÚøèwhÓþùo š1ÿ‡a~µ~fÌ?cþ´Œ×ÆŒùgÌ?ó‡NL&ÙàQa~w¡:tº€÷Æü¬柵K==»Y!¼n‰—“q«jع9‹º}I °¾—Óÿ~¯&úÏl~û§»zz«õº®3öÒéþw5´«–RPŸý‹@w¾XÐ> ýK¹Sša?½†´RdVAìÒ‹zG¬Ô ì~²ßLñˆ~ð”R„b!üø_Úo¡$PäN4\<ª¸Ñêæª|¦L3Ç*yÃßQMßU¶¸bÏ1&Û»¤Hñ–"\ÓÛ/z畉;/Fy=¯¾–ÿvßïOþ Úü endstream endobj 1613 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1614 0 R >> endobj 1615 0 obj 3696 endobj 1617 0 obj << /Length 1618 0 R /Filter /FlateDecode >> stream xœí]ëoÜÆÿ®¿b?¶€EóM^Q8[çÚä‡tŽ›AéV:"w¤|äY¹´ýß;ûàrÜ#e+’³i r¸;3;3œÙýiÄ|:ð ÿ’ÉÄGëƒOœæ¡ÄGAÌIQŒ¼Ä‰Ý­¿I£­È@å’ á—¥òÑìf‰>.úçÁÏ¿À rݸsÆæìàb'ˆÓÉdÂuõ/M‰ˆÀ‰áâbž¾Zû訤£í #÷Áµ—5 <ÿh䢫ƒgóƒ§/"ä¹h~Ù†€çEN‚ãI„R'ð'ä>š¯ÑÏy»)¯ñ¦Îqõ×_Ðü‡ƒÙœ¯ŽM%ñãÃÿ‡‘ò ]õ‰`‚ÞRáßÐ  (ŽÁ2È£÷)ÿI4—µûiµ g%MÖ=DuŸÂíÎHÈDÏuRÅ ~KæWCëž­f8Rõbä$:¤3(ýÐ'—œÜDL¥Ôw\×sÝĸ劦ž5B8ô÷+ÌXs v,¡ète¤—¨b½ØéTÄïô~Ά@¥Ñt,ÐÉ)2Å\›0iµÃ] 9F²n«…ÝÎdšª»Ò‰Ò.çˆd˜(dñü:[ã΀ö&D#O‹ 3€B×qa¬ëéwl=ÁĉÂm£Ç`Ƭ©‘åqÔ­Hn@]‡N'öqÕeÞ4¥õÄ ˆN9íãÖ Ã‚ÃӌتxëØ8—ÙvUw†‡øN’ôF‡¤Î$!MÜ&>»eK"”¸u€ÈÜåÑŬ»ôà·Ô4Òqϵâv6ô´¨'‹æreƆ~Ö02U艣nQ$ª‹M~]çeÑ]6Mä8pR¢tªŽŽájBÉ+í‘N íL¢ÜEÍs•½ ÛB›²·¨!ÉàžÕd¯;Õ‹G [4&sª$LÈJüÝ[š€'=Ù•.Ÿújnï{œhcÀó± Ê†¨’¶®~gu›ÂµÏD®M´æ15{‚-“.;ù¡çøMê¢yêC“ª†YÊ`Á“ŽJfã””&dKIå5IŠÉVÒôµ¥É.e!Z„)ªË¶¶è;ÜÏ–% r´,|§é.ŽÌÏöÓÍšêïÕ%ª—]³sßåª7[ü„Rç¯Nfè)ýq6Ÿž¼E^Í_2ê¿ß¼ž¡zw+” ôêõ|vúãô¸!m0Úàë ®pQãËÇ’¾¯©‘臣gÏÑ×ËrQ¡ò±IO_LôU@¾çWƒÑ)®`7q†ë\gGY5lÌspïáCWeUÁw#'%XÅ$˜˜s‰Øó¬Â½*®ç¤ä=ãN*f”EVã:_cnÜ›l´­!– àx¸À2 —ßËÓŇþ8=}þrzJƒªk|QçŸñjç 9<.7ùU^d+ö¼€];s%uäæ3^8¢²BL‡ž—7k’øPˆ! 7W C˜B ÂH!÷œÄ KRI¼ª¡ƒÞ\ã"/®/ì)ÎèM±Ú •õ4 G·4öG¸ä»‚Kî*ÑãgK¾m°ä.’þØ¡’?)Trg0 +Rô—qZ‘2ЇžŽ¹þûS²…OG ÒÆ‘Z¬ ô'¦ý¨›­!ŸÒ›<ÎÁêt™ô~Ïr9›@eõ¨Õ¢*Ân¾"û˹)]GCO;l`+SÊ;™Îr¤EJ#VNÞZî³Ú¨£ø*[YÔHªèÞRÓÉR—Üé1]ÜÞØ^·È’‡(Á°?4 Ê çÇÙç_f«ª{#ÒÔ‹ã•\¯'Îá®7ØtT£ä4â8¯[š#QÂfŒ©â€R¢ë¨¸N§wlj®Do ØÄý‘r›4A` v :$(Ò¶Â T—ŽY¼þ-¯jrZº„“ØßLD(ÐØ6Üö`ùi$EàˆæÛh¾ìÌÏ߇çwYjDôÿŒˆ~*Jì`<¾„Ü+£ù"(ož­Zj½Ìjt9ù£l±€<½ÎŠm¶‚ ›àÄε€Çh¾~‚Ê Ê‹‹Õ–ŒÎ :èýé1û±ý‹²(Î\¨eë KLøhê¶¿|åä_”‰n Áªa$_­3—‹L?,.¸7%*¯Ñ%,RT3¢RF”1ïóþJÌ[rÜ¢¬IìV¸¡K ðªÎj¼ÆEM¶PµáüÓ_LiwÔ :ˆí'¤ MªcØQ†ýÿvé¤\ä—;òˆÈ%ðyeƒ´ý”Ø&!íÒþ"H[ŸÒ!ífèÒ!í¶?I ö‡#¤ý=CÚdËT}lëñ2Ûß °msül¯À6Í÷o~,ÅáCÀۑ׉+G¾kÐÎ$êÀ]¼-“÷ÁÛ65¼nx[Þ¥Þ>x{˜J¼-ó·ÁÛŠ3ï Þ–M!Q}æÔS¸öcžÑ^/¼Ýi©Go˶’&Ê«’“íôõð¶eŠê²µ-ú÷´e ƒ\- ßãëˆ%8Qh¿Þ¦y¸Ê×ù*Û´øõ²ú´Zœ;"ƒ73ö£ÎϧÏ_ÎŽh—è|ö¯y?²]$­évç¢Î·5Z³SéqQÖš;t±ÌŠ+ÜèIª‘Oð@P¦‚ÂÊŠ(6´ö  rƲ@ÐAÌ‘S¸h0؀ɚ™ƒ€Ø n!hv-ãÀB Á[UÀ(û.ˆ lŽ‚È‰£t›G°ù‹Àf=~F°y››slŒ`ó6›£Èw<½H-ÎßW‹³h}!»›ëì·¬å#9^ì¯QZøŒÏŽŽgwoñ±8ýÎc·ó×FɼA0ì “/¯ÖâŒÄ²ˆÜCŽJ¼½­Ü ¦íítΫ_í¸uI¹¿ñ#ßôG<gŽñØÓåÜi©Ç‚[ñ¸ÃxD©(°_ØåÜ€Ô˜"Æôk—;´,oÈg;v Ȇ¬³‹¥HØ›Û,N37mCnnžÃÏñ%P†ÖŒ hv³Éëš´Q—/gߎæ@;yþ;Þ”´d¬qVT¢É9[Ýd»ÊÐÁAôä0 â;½Ÿ ¼îÿGµ,·«Ec ì¼üŒÁ ®;~¶cül‡‡Ÿª>š½˜¾?ž£ÓÙùq2;ysú:}óá ý½Ø®ñ&¿@Ÿ³ÕÿCù/§½;ø?|'Õ& endstream endobj 1616 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1617 0 R >> endobj 1618 0 obj 3222 endobj 1620 0 obj << /Length 1621 0 R /Filter /FlateDecode >> stream xœímsܶ€¿ëW`ú)™‰¾ƒ×étƱ•D­k'ѵþd2Ô$±á‘ ɳ¬6ýï]€ ‰WRb[3‰s$b»{»äsòËI€|øû ýÀ›í'¿ð¶áE)oJR`/õ3t@ü$K2TÒŽÒ!íÂ#ÖÊ{÷'×èõIu⣯N¾ÿ:í‘ï%èöÄ×ï‡9?ù„'©¥Ùf³áº†^eTDä¥p°; ÏÏ!z^³Þƒöt ÿƒk/já#ÐÈGW'_lO>ÿ2A¶—SAâÅ1Ø9Ý$(ó¢pCÿ Ñö€¾ÿ䛦¾!MWöÓÑöo'§[>»þV?!üƒ=DÒ…$öå+B€íS+ü‰½¨oƒ/L`ôRÉ}Ê?é…á0a6ê?­6áC 7«bÆzŸÂíÎÀôÆÀ÷2É a„óË¡õž­¦9’Êçƒh$Îǧ“ñÃÔ‡¿ød¶ùEI Ÿe:}Cª½¨¯®Šêjœã$"ñ0Øcãm⤟ä“jõƒ“¤Ÿcz¾ø>ÖNù̳ÀK†Úð$œ·@?47‚6\Ÿ¡Ôv©g€e±AêÑä }ydMheÞ¬LPÉ[Œ2Ç{m„Ì:\ wàÁº“v;ÓÛdÝ©¼!ž|=ž²„¦«$îãée~ ÆoG°¡ÚjøèÑCˆBg?PÏúÉD/î:Ú`½)•f±3À$’[OÕÁèÁ¥QUÙš+ui ÃÃÁ(gº<Ä-2ň“Š÷ Œçä2?–16Â(ô0^’ÔÓâ8žâ°?íçC[bÞáÞÑ!Ž.†‡*æ`ÒƒŸ2»7Œç\+ndMO‹z¢h.WXÓÏCº Adõ¢¨Ý5ÅMWÔ•1’X…ŠRx„R*”V9Ô\ÌÕŸÏÇ–q H«š@µ"9Uó°†òã%B£ÊÄKågV Ô‰;”‹ò’1$»ö™¯AúÆ@ÑžÓÀóò¨|ÝþRî/¼ü榬¯f ’-ƒh1}+Yx9TlƒèõF- ª,¬‰^,6Æ!õjcðš&n.>FÏ[d‰]¤€˜Å‚¢‚clÀŸ«4ŸK™^M›î^׆1Ô­à âÆB2¶ŒiXSI-.n…DÕQòšÚnU‰Å±‰{‡Aâ’%hz(v9-'¨ì_{PIÞÒü‚G‹K ¡ã‹E!V‹Ëذw<{èÌ 3äö±9¼Œ–ÄLîÂц5ƒÝè­JH˜î¤êÀY2\—‡›mš oQCÁ]¬È>Õ=ïOõÂç†sSi*½@a| 1d\H¾ô‡ÌÊÏöÓù‚mðÌ;¶Š–Zu}õÌê7iÔ%ù6ÑŠËä| ÆÄFC…qà…R²„B°™2‘ƒ©´!x’›û~Òã²Ð šJ¸Qœ” ˜h&E_[æ4)3QbLR]4¶E_wG[¦àäiQøŒ«Ù£s޶æP_É¡Ûk‚öýË]Ÿ;¡SQíiZ%-ªê!±zè» †´Ð¹…^èPTÅ!/‡>ŸAÛ®<îiΫ;t™åº÷†}^Ô CEIt^–ˆP¢ÕŠÃÖ |äÍ¿#ŸþëôŠP¾ß·0‘D¶¨¾Dm} ô³ƒùUuCµ¤ô• ¸N»BÓ)н(òá«•E¼Ì4„ÍìéœstY”psÅô¹-ºkô'ú êA—?ycå‡ÇA€iØmpoAÔrW' !ÎÀËqšÐ¢x)Ø]ÒDÐföÝNÙ䈯¤ï_¢áÎ1lèkÀ& ´\ÚáE:™,¤¤¾Œ˜0hñå'¡´+fÇâØ“è©2}àÉÝ`Šº|±ÅaæÐ=“d*žMËõˆ3ÉÆŠ*‹‚C>ùþPûÈt7(S¾IêA=ƒ¾˜GÛùé=º}úÅÓóSÁýr‹^¼úŠÇùáŽ_!’~E!ü‰þ'<èX™q„½M@¡q„Uh¼ñÐù·/‘qŒ½,Z™ñʌȌ•øY¡ñ Gh¼+5^©±5RúØö¸°q¸Q†]{cc>¬&Ÿµyœw‚Ù©2ÙùÌtù06R'æÑQ”€LØØ,؆¡÷ÅÆðï%l¬†ËåÆ|ª“,f©ßÄ%—)ͪÛTq³2ºÞ"KìbD‚ £ûš‚¿7¶9ýc>gá¡%úè*>KnSÛÍ1¢*±$6qï0J\ò$£'h—û}ÙÖè‚ c ïú]M‰4Vˆ¼-Ún|CùE¤ŒLÙÀŸÑ>ïò‹¼5?Gý2œHÅ¢qb$À8UÀ®Ò¦;©:pfÑb󈶩‘˜A´ØÝ¤ÞˆvSIÑâø6-9ó½‘hÑBk*"IåÌê8iÔe>i,’h£¥ Šm%Ü(ÎJPL´ÓoGÑj”Iª‹Ö¶èëîiËœ\- Ÿñ5_g8ÖÚwÈ¢wǦ!UWÞÑK-ª+8ÚÕ‡Cѵ·÷¨©Ëò"ßýØütÙòÓ®>Væ4.©Vg]SýÇXSáìªj‹Û_—UÿÖ8qɇümq8Pu<\†.¢;VŒˆ·7ùŽÀ‹ú®~C„—# nGQ$DÒ‡€Û™™*g*,Î4¸Iä,3ÃíÌnÛÔ°ÀíL…Ûš¾v¸í¦’·3¸-9ó½ÁíÌH˜3 r*gVÇI£.O‹èe¸m´Ô#Û™ngf¸ý®p[2IõÌÌ—æiËœ\- _‚ÛQž~Üž 6Ôd)»öL÷grӡ˺AeN2\îW,3˜Ì~©lòꊠ ÒÝRQ™(ó7©§“ãPa´¯¯¡Ca´'%é!6ŒÞ§÷¢2<èDú¨LC@vT‘[6†‡Î.QW×è@—{GÕ©±Ê²ÛC^–¤¤ –(ë¶cZP˼¹"p^WüjC×{Wp‡b«—lÁwyGïjØ”ª”îÔmIí…Žþ•g°ÜgãœGÐ<ál<Vgœœ5œ=JÉ4œé8ù8 8[{=µrŒ,vƒ)êò³ûáìLÁÙ™gkz`_²±¢Š ÎÆÎVç>ƒ³±Š³;éÇøWuÇ~‚`d¿ÔÀwZú…ÉhÇðZ’nR?ˆch÷Úq C+Ð^öÀ¶?+Ð^öÀ–ccÚ+ÐvÚqšzZ¤V ýmúÆ1_—”YQöeÓ=ðf‹ŽÅñ+Ìþèa6Ãô?^goDˆe;ËŽ³H¤²PÛ¼UVwàÀÚŽ!XÚ›w ÁŽ;†ØÔ°ì‚ÕC4}í,ÛM%u¡¶ÃŽ!’3ßßBmã¾XÚ;B9³:NÕaõ®Yôò–!FK=–Í{†`óž!øwÝ3D2y¡¶yÛŽ‡yÚ2'W‹Â—ö ‰á»Ì=í̲ÏF~M±¬%ÅÂç®ÇOåR´oÞ1l{MÊý” õû†,ôÅè¢(Kx{è‰ôؽha{Säˆ.(ýòìÅé9½\¡‚â·]}½Èå%ÙuÅ‚òKЍuEÞvãRitþõ?·Ï_½~‰ê=ûúôÙß¿yuörë“™Ý@’w&8MÆý)çÝ@a7DÛ d”B!©Li±¶‡“PΊa7qlYk¼V^­É[܈¹¼ Ú¼ˆ¦G’I6VTqáÆÉ´ˆ:÷¹eЩatµÏžB`¡ï^½>GoiŠ]äu@Å †G§ ´È‡:/þÃ6Ë™q±ÄŒ(ª‰¿2ã•?Œ«ñ³2㕯ï˱±2ã•;0ãÔ§oª+3^™ñÀŒ[xÖ™­KjÈ¬ÌøÁŒƒ%flsüÊŒ?6f,adÍ §a ÄÌ{ÃÃ}—p5d%~žª†syVéáPMUšõ;å¨4iþHÐ$³šp?UQÏH!ÎéŸwÂp0Îi^WwyÉ¢ýðIQ¡Ÿ‹²¾¸ƒ«?|*þzÂÀŸø=akXÙR6‰úñ}Øxð¹ËËÝ‘®ÔÜ;ì¼Ð+tÑoøÛrFA›¨Ÿ±EŸäm~¸) ]>wör{úÕéwTJŒ˜Æý¢Ù|×aF\Y6 Óõ‚-EõſɎng,ÿ_Ù¾=ù?Ž}ÊÛ endstream endobj 1619 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1620 0 R >> endobj 1621 0 obj 3411 endobj 1623 0 obj << /Length 1624 0 R /Filter /FlateDecode >> stream xœíœëoÜ6À¿û¯àÇ;`£êý8ˆ§ñ%MÒÚ¹W¼ËµÕh¥­¤µã{üï7¤(ŠQRœ—¯QÓÀ—œÎÌ¥_hþ~ä þ<"?¢ÄEëÝÑï¬ÍA‘‹¼5!r"+´c´Cì&b”“ŽÒ%éÂ.=ÚÊz·7×èç£âÈFßýò+tÚ Û Ðí‘­ oÅœýʃÐòÂ8If«k9qLTxVëúîlç¢'%íÝYOÙ_ÝzÑ"Ïq€E6º::¾8úîi€]lûpœÀò}ðs˜(¶<7!ÿ¹èb‡~ùÓëªÜãªÉpýç_ÑÅßN/ØìÚ¡$\ø?²hI¾-"$oï[á¯oym´XnÓ å,¦ì'ù » ¨ÚŸFŸ0QÂ`5BÔY_R¹9èØV,EÁõbÁýrj}a¯i”£XQ€Ñ´ý‘K.™0¸ Z“bײmǶ#í–;Vе†Gî¸Á­hf³&®-(j»ÔÓ‰dµNh ¢éw@û´dÍh¥Þ´LPWÉZuò±&eBꦆ…@ŒàÝÞ ³ŸÉ0Ùv)¥#5¥mšÏ©0ßæóËt‡ÚIˆEŽ’Azù¶eC_ÛQïÚùx‰t š=š°Ö›J³Øú WɨÚ0Ä)©ªn-šº¶‰œa1¨§ÿ¸wȼäp'ö&~pn<ÁÛô7ƒéáz®E“ÙåÒJ"²¢ñÛÈmoÛ)‘Ÿuøà¥‹¢ªÙ ÙÁn©k„üžYÅü¬Ùi0OTÍôŠ‚5ûŒi¤›0‘GêH"Õë*Û7YY /žd©;x*ÙmElË·ßô¶(ó§}03Z?&¦[xsX11:–{'¡e'´9'Ù¨  ¡IÌ» û\Ï›M©MÅÌt°È*ºwƒæ] ¹/:—Ù3Mâ.d ùÚÓ[A$1”6ì»r îï'‚hÀê1o!´ ÖÚê1l’Ô)Ù&ÕJÄäê ¾Œ†üäúŽåv¥‹ÖXºR5ÏSšVtäæ¶ŸTÒ„ÑSÂ@qN‚a¢—{MerȘN‰’a’颯 öγa ³-*‰4} ‡×¿6Îæ· [{ßsQS"5Ùר¹Îjt“æl¡ r½Á{\ljTðFÍÝz•[T^þ†×M²mÒ&½LkŒªò¶^¡mY!ü>ÝísŒn³æ]fEZÝñ ¦-΂M®­µM× Èr\“1iÜU+o}Vð1®PÝTYq:‰iýßuƒÊèࢴش£ÀJLïèD°O´¨­Ù žgÃ7-öZÛ¨dÏÒ:¾ÒñäR_¢5˜_¥ÅF—¸¹Å¸€°Øèù1zžÿþ˜øƒ«éc™c¯@Ð Ux_á L“5¢wY^^Þ5¸¶ÐÙ–ÚÞê0= ‹jÜ ›,Eç§èéÙ‹Ós2¾@Yv­K’x»Ÿd7à«-q1‘_à÷Måógo.ž¼úù%w<;=yþúÕÙË ‹/¸ê¾ãDä —D.¬ÏÕÕ“üöÀ¬ïŽÂìЖ,0ðòŸ‘¢Ò (Œ¡OÛÚ%Å鮨†¼+%¡£­!­öTv×¼„‡‚–Ī0U-¶Ü2K)éqÁôZ”Ý«î[a…s,¹LQ×/¶Ì˜9t÷øêŠ÷|%—Õ2;¨Ã{+¦L*vÙäÛKuî¼%(VëPLèžm{ÝÓ[Ÿ”'!±ÐùÙ?OÑ_‹ÃWÙºMò¿ uâ“¡«>z¾’åÑ뾊é%”#ǵ|ÏBçÙ¿ ×)´@%{’ÕïPûù9”€ôªOUË«ÂøpÁßæøtˆCÍŸrüCŽO 8¦scAPÄñÉðF»H…®•¨‹”¶x¨å˜Ù?^’ rÖ m¡Ðª‹Ò¬hXìÀ dBçÑQuFS+ШB©‹(SÕÓî7îßÎñeHŸÏ”W:xš–_Ÿ®ëßóÍ¥µN××øí6ËñÛš<NJâtVˆµ\)ÉÓYc¢/>ê*¡êŠ4Õ“+Ï H}é ¦n,Uxt‰]¤ÜÏŃ¢<’¹à¹£ëŽ!êRÝW‹èü¸kbVmùéÔñe…·ð¢¬™¤.5ó–ÕF)njûp’¨FLf‰IÝgL“9%ãPd :ÔxCNݾ ‘÷#Buæ!$À"‘‚2Â×£DȨ¯AØComÃKµL¬•ÐÐ$æÀÝa›Ç»É o˜°‹Ý‡Ì#ìóLR»(ßHØÅ`~1Æ.ºBhõEÚªÜ'IF¯ÕÞ4còԡ좯„â¬ÃD?}?¶ÐÏdK/©¶é ¦E¸#ÊY±Én²Í!Í¥¢Ìwöf5ªwižãj5@l5†ÌúRõŽ>0]áÍa©x²]:r+äuÀBÿ Ó©‘³"¼ýŠWð´"pY9‡{äÝÉ@ƒ½AL¸èp¨×¾ku#g1Q/ìip{-"Y®… O™½B‹Bcg)e˜ fdxˆ÷­œÂJ4X×/¶Ìãà îï%¬ÙAÞûX1e ¦“ïÀðlìûFLAí=‰°V’ØD¬£áÀBgEƒ«¾`ÇéúÝaO÷w_¯§îµ‰ {IdÅv¼á… ß‹ «ù³á… wïèÓ¹±á… Ï Ã>9yD]¤2üM’á¬X¿½¤9£ë’š2 þcPá¦: ?°5Ç÷… c\˜nPÛᢗ¢KþR4c±ï9B} ‘«'_ÄÚI±t@<|RG<󤓆“:bõ¤Í^3žg’Âã'uHÁüb8<0#–NmP¤NÃAƒêé³:=õ@8p<|ZG<|ZGüIOëP³L2=>0ã~‘6LaV¨EåS§uøäd‰6Ò³9ð“9ñöä8 vðź,Ê;¸Ê‹+Ý‹»+7Ù6ƳíÛ3ïò%+y+¨ëÙK„ñÓ˜Tu²Ów®ª”ÐåüŽïQ>ÐÁh—VWÁbu^ÞnÊÛ‚nRòÂó¸<4’_5Ù¦uƒÖ×xýn_fECÏ쨯 ¦ºá«ûˆ9ýç¸MóšMRð|ÐÛNÙ¨p~‡Ò¦=é$ÛQ\m²½!{¤õC@Ô#7npUÑcÅ+ôìüÇOŽQ}Øï˪Åe·‡¼[çpnz`¤sGÝQŒFÄê½Ó]Í ½‘pŒF¤£ÁµÀë‹Â¹cí‹YJÛŽ„c4DÙ ®Â—Ånä ý;F#VŽÑˆ‡ÑÐìˆlÉÇŠ)s8wÔ£¡Î}„sGæc4ŽŸ<ó½<ùéô‡Ó—èßèâ§7§è?èéãç§è¿3xw¯+aAB'Ê»CøÔíÖçrýŽòmÞ¨‹‰¿àíoß o«ù³àíow¨a:7¼½àíx;#+Q©¯Œ·ÝDUè&ºŒ·™XM?mïê8ë³SuÒû‘é21&…R'Q®JàSCx{X± o J?|ãóúÝ[# âË’’1_•n³Ùöº¨³>ŠnKQSšÕÈ©êFs„Gß Kì2-'¤ÛšŸ”n›âþ€è6›¶0Fhñ»>º‰÷ ÛRäÔöá4Q˜Ì“ºÏ˜(³v=×l3¼ÿP¦ðˆîZKóºäÛáèñ£Ðˆßg5ùõi¨xŠÔnGžŽI($àƒãÝNã-ÔÉãL9ɪMÅ2SdiÖŸ•"€ÙAåÌR¯IûbeSÔûûîÅ Nûè”ð‚8›eßu[ZW(¾BV8mدàt}Ý~À7ª6×)=&·Üã‚õ‚›ö°ß*kº38lw’ÎØÒºÇëÒ/m¸.ˆdcë¾Â7¸haoò¶*w € Yf:³àP“ ¸pQ” ظ.w;\l@þå¡™>a—Þ‘*²ÁuVQêrKàæ6Oëkz3ÿ5 ª‰+åÓN÷û<Ãô|‰®øP{ÿ"×P£[œçägou¾ªòL>Òªùó?ìÓÂÞ endstream endobj 1622 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1623 0 R >> endobj 1624 0 obj 3578 endobj 1626 0 obj << /Length 1627 0 R /Filter /FlateDecode >> stream xœíëoÜ6À¿û¯àÇHTê-Å¾Æ |ð=ûÜ5E kiï¢ÚÕFÒÆõõî?¾$ IQ’×qõH³äÌpf–b·\„éß/Ùqê¡|{ôQÊ\{Ȥ(Œ;NÐÉ›$LPÁ*—¬‰¼ô¹T¶7kôîhw„Ñ›£Ÿ~¦V;!º9†r¡æüèGj<Œ?JÒ4•¾zŽ›$Ì„ïDô"ߢïN·zUòÖ­÷LþâÞC|×{at}ôç‹£ï^‡ÈÅèâª/×  qŽÒ%Žï¥ì/]lÑOÏþQ•{R5R?ÿ]üåèäBŽNteõãÑb‡‘òA`õP`¼—ÒÇ2*q¼ƒ}TÈœÊ?ÙíeÈc$þ´ÆDªõ ñ`=¦q{2bÖÑÅN¢dÁóS~µ´9jF"Õ,†N¢—¼—¿ôØ¥TFoBáRâ9»ÇÆ­t4q°•0ÁKoÜa¡Zúl¨Š.WZº±jÖœAG û.µ>­Ùð€Jy@hkÞ€Ð4)%ƒ6»¾6c Ž4#S¢Û{a3ë¦ú®”t¬—4æõ²& D=ÿ-Û’Á‚vSæ‘«UY@v0m‹]ýNŒÇO°ܵz e"šš¶ã1èMÊê> &qJ«nÛȦim¢fdE Úé?î2¯8\-ˆ½‹w®Wä*;Í`yx¾çÄñdux~â¤1[ÑºÛØ·bHLÈw.¨Vˆnf;䇼塺{镌³á§Å=hZÚ…Š ÿ¬edº0QGæžH!ÕyµÙ7›r7¼x²¥ŠúÑ•3¢˜¾ƒ~B“r'pŃ™Õû15í2Ð+ ©×jKêSþ’? t×l®åm¹ñЉ4§„ÄV¾\×€)©Qf XÙêöÃ6wÝðÚ(àiã]@¤ ¡Õx KbšæË~§N¦ýýD6l äÄÚ«‘£á$zü•î#ÀCêAèÕ)ކ(ЏŽçÉÀ£“x;ŸÌ‹‚¡BÎ ªX´Sæ á}Ú¡@D<4m³×ùVw_*ŠŸm@MÇÆfz8™1hÀ’2þÌK7["aÔBàº1K{tF¢-ªë£—¢ò‚(d_+—¯ºbß:×Tô#ñ4ý·M{z`†iä_1<¿DÝ„+‹<êõÓMtÔ™`;jÍÞ¸Ö2n•ñK©¯7Äô{î:݇l;-É›#¢-ý°÷ÜSU§_ÚÂ0X½ÅI#íÃ,¿£éVš%ÚB“8t¢¢ûbiÖ›íÅ>ùåÙnW6è’ š4èfÓ¬Q¶Cç?ž¡ºÉ²%;øh4O³ÒÆišD©0t‘]„9Ä:+¯¯7»kô*k2ôÃ:Û]tÞZè7ëZ•ÒêK–Ù7µ1{¸M™R<Ëžì½'{ÈýØDa,Û±¯t;ö`[1¾6ѹÒW×&cÍÐgaéüøLlÑ3°ôëƒaP_‹f­;Ãj'Ów—Ýf<µðŒTÉtJSýSg·.¾­#ã«9€®L ÒÙS°ú²a],V—NQ^XÑÇšÑÅH©–Ö4œºµxºTlJ̵F_t[±azr¡Ti®4Y3ÌÕG—y‹-ØD)ˆñ"Ð"ì QMu~‘ Í`Ò•‰^Ÿ5ç§ÝP3°ŒëMk®[G:I7 .ék˼uD÷QI›.®݉É"±™û«dÎ4QÈ­›#Pη>vÀ—¦]É| ¾ÓG#¶&jë8rpÊÅ®ij¡ïÉÜ¡waû¹ª¾±?›Àd€°ù{c0pžK„úmX°Ïä£QA ÎbýΚ5EëT„°Í´–°rh†é‰€C(Ð 8ƒôùQ¯/Åuj‹¿óÓl¬‡_f5AÉËO¤ºE›jÖ‘Od× òŠÑ³ÃŽüº'yCV(¯²zè@dÛ‘œÔuVÝ:Â0zÏÓÌ÷¦šuÖ0‡š*Ìj”¡†l÷eEѰäÔ8ýš%¿fÛ}Aô–\gÕª ¶˜CÌ»OYq âõÚð+¦ÁpÉß§‘t 3ÙÕëC³*ov­öÖÓ(+ .«ÜJ,yÔbÝ”Y9è˜~Bò_öå† hª› íZ‘›jÓšé°¦£ Ò “#eÅ}Ⱥ‡þ€ùË,ÿå°·V˜8.ûvø©ÕjzÔû¨ƒÏÑlfhÔ¾³{`áÆ¨«’YF%¶Â‡º{Ó½TvØŒS2ìCÉŒ‘Óæ~·¾Eð^aü†Vb¬¹2‡÷G=ð×Ç>Bý#†ýŒý–iœŸ\ ×§g'çèìïoú ]¼ýç ú/z}|v~‚þžHm€ßMÙy>ê{ÜMÑáOèwûД۬Ùäè‡þ;þº"d—ßÚ¿Ç&ìåðÕÂøïÇøµòY(ÿBù[ø2Y ç_8ÿ Îïy!{•¿þ…ô3Ò_oþ3±$©õ²°þ¯ƒõ‡xt±NúÂú¿1ÖÏf†EèL!€àŒ¼êª¬¶deà^_I_â@è²÷ÐÓº& úžÌz7ô ŠÇ^ØÜp‡_ÀæCç’ö ê·½€¹|´—0@êA¬ÝYó¦h†ÃÓîäK€¡@=‘×0T #p †éó_è5¦¸ƒmñw~¢-C˜•ih|$Õâa:ðe¢ïð å×AiùûþÙf‡¶ä:»¼mHýþ¹ äã7Nœ0‘ìÕ0Ãî¬×ÃÞHWpÙŠŠdù]:É3¶Œ²Ž‰Aî燪vÐñô[Ð ²qûÓÐIXÂã02µMar×Gz÷ÀÂÃ@;¯òðóÓŸ ïw‡-©è—•O7šÄ}7rö`‚©O!E®ªìÑ)ª‡ã6$î{±“.D|!â÷"âjõ,@|â-£˜ªŒ…‡/<|÷éR,8|ÁáΊ?Ô|(6ÛÍðÄÓ­IJÉ,Düë â£@|8å ÿÆxøžT9Ù5Ù5§â‡?ÃXﳜñ’CͼehÕmŽrssdr?r»ÊZŽÈÿ¡ÈƒT.gäGðø@œž_É?ä!y?òDžgÃñwìcf{Ëø‚3Zu¾Éꦛƒåáu‡ŸÓæ|—vϳ"?YÃlŸŠÞ¢Ó4¯–Zk”]–Ÿˆ õ{’o®6Ô$N|ÑÏ÷ì,yÆöŠÏbÀ%¶³ìüݬ7ùmI¶cé{ª>}f½ŒÐ«>´=Ôü§/.IsCh 1ÇÛtåRÛ´©öiÚ“÷j,ùQ÷CU±£ÿòͯá’qà[ ør²{9Ùý`'»_¼~{üæ;S'qš$ôÑ]åØ!žúñ–éCÞALkz9ä½ íû!m­|¦½0í3L–Ƶ¨=jtG<­CÞ^ªôRÓ;Sm©Ö°Ïåí$.ÑÑé6ùýÈp¥›A¥Ohg °©!ª=lØFµÑ»Rm~ÌæÃŠÙíøª¤–Ì¥Úr¸½-­Ï¢ÚJÚ4±ž:ÝÜh‘té·Ø‚M‰å„vl8ø ¿ébIû"ÛrÔ mÓÅ{m%qº|¸Jt'&ËÄfîw¬“9³Ÿ&Ÿ&ÐUY!vÏqönÕ v[ßîò÷ÏÞ?o…³=¿ÉQ|M9ÝVUêÿÃBƒà!;xô%O‰Gþ ~¦p•*k¶ëõ!f£wCŠÇ(¸Í ˜‚ÃæCîQðy.iê·Qp˜ËGÃà0@@ ªÝYó¦h¦£Óþ$ Ôáà0T #p †éó9¸^cŠë0Øç'Ú2„Y™†ÆGRŠÙ­]cgƒp ª»ß‹agÅéJ.xK“ß½=½8A¯NÎŽÿÕ·Ô~Ĥý¥•–:ÓÛÓÔ¦(65ÉËݪfX|š…ëîðŸþ@?د£ˆµÁ¨ÓÏP5û æ¼ÜnÙ‚Âõw›³¢(oj´-+s91(ø¾"9užª£ëJY öË5J¸æPhvØÖF¡ƒþ0Š%•WóNwZ\«‡š{@­Qh*1Ï3ϦÐR±$ÒCº—vôW¡Ð¦}(™Çß Ýß+Úð#H”k®Ì¡ÐAÒQh}ì#:Œ¬ç©auÿ¦ÿνú^–¹ÄÓL¿]­ø¯§gg§ç3àuÄþã ŒÓ8 #^»Ÿ¯#7XÈõB®ïE®aí,ØzÁÖÝ/ÖŬf=ƒYG>sç)!ë/sJ’v]h¯îDû>'´;óc$ûŽç³tG2erìâùj|©RªéÛ:£ F}¥‡·éóè5X Oróô<ÊáídÈApê:4^9÷:Ô­W‡ºmè»åÛÈÄ×ìïÿq73F endstream endobj 1625 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1626 0 R >> endobj 1627 0 obj 3534 endobj 1629 0 obj << /Type /Action /S /GoTo /D [21 0 R /XYZ 72.0 379.2 null] >> endobj 1630 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 680.124 227.424 689.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1629 0 R /H /I >> endobj 1632 0 obj << /Type /Annot /Subtype /Link /Rect [ 523.174 680.124 539.768 689.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1629 0 R /H /I >> endobj 1633 0 obj << /Type /Action /S /GoTo /D [1280 0 R /XYZ 72.0 269.681 null] >> endobj 1634 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 668.124 355.687 677.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1633 0 R /H /I >> endobj 1635 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.875 668.124 539.762 677.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1633 0 R /H /I >> endobj 1637 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 656.124 193.148 665.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1636 0 R /H /I >> endobj 1638 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.51 656.124 539.862 665.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1636 0 R /H /I >> endobj 1640 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 644.124 174.429 653.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1639 0 R /H /I >> endobj 1641 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.458 644.124 539.864 653.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1639 0 R /H /I >> endobj 1643 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 632.124 195.895 641.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1642 0 R /H /I >> endobj 1644 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.521 632.124 539.866 641.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1642 0 R /H /I >> endobj 1645 0 obj << /Type /Action /S /GoTo /D [1589 0 R /XYZ 72.0 674.5 null] >> endobj 1646 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 620.124 184.879 629.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1645 0 R /H /I >> endobj 1647 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.487 620.124 539.863 629.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1645 0 R /H /I >> endobj 1648 0 obj << /Type /Action /S /GoTo /D [1589 0 R /XYZ 72.0 172.964 null] >> endobj 1649 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 608.124 173.874 617.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1648 0 R /H /I >> endobj 1650 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.458 608.124 539.866 617.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1648 0 R /H /I >> endobj 1651 0 obj << /Type /Action /S /GoTo /D [1592 0 R /XYZ 72.0 570.3 null] >> endobj 1652 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 596.124 238.683 605.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1651 0 R /H /I >> endobj 1653 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.573 596.124 539.795 605.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1651 0 R /H /I >> endobj 1654 0 obj << /Type /Action /S /GoTo /D [1592 0 R /XYZ 72.0 388.95 null] >> endobj 1655 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 584.124 192.038 593.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1654 0 R /H /I >> endobj 1656 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.51 584.124 539.866 593.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1654 0 R /H /I >> endobj 1657 0 obj << /Type /Action /S /GoTo /D [1595 0 R /XYZ 72.0 720.0 null] >> endobj 1658 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 572.124 181.552 581.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1657 0 R /H /I >> endobj 1659 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.512 572.124 539.898 581.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1657 0 R /H /I >> endobj 1660 0 obj << /Type /Action /S /GoTo /D [1595 0 R /XYZ 72.0 194.086 null] >> endobj 1661 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 560.124 194.814 569.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1660 0 R /H /I >> endobj 1662 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.517 560.124 539.865 569.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1660 0 R /H /I >> endobj 1663 0 obj << /Type /Action /S /GoTo /D [1601 0 R /XYZ 72.0 700.8 null] >> endobj 1664 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 548.124 230.421 557.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1663 0 R /H /I >> endobj 1665 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.551 548.124 539.797 557.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1663 0 R /H /I >> endobj 1666 0 obj << /Type /Action /S /GoTo /D [1601 0 R /XYZ 72.0 579.67 null] >> endobj 1667 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 536.124 409.296 545.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1666 0 R /H /I >> endobj 1668 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.903 536.124 539.637 545.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1666 0 R /H /I >> endobj 1669 0 obj << /Type /Action /S /GoTo /D [1601 0 R /XYZ 72.0 458.54 null] >> endobj 1670 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 524.124 222.278 533.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1669 0 R /H /I >> endobj 1671 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.559 524.124 539.828 533.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1669 0 R /H /I >> endobj 1672 0 obj << /Type /Action /S /GoTo /D [1601 0 R /XYZ 72.0 325.41 null] >> endobj 1673 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 512.124 195.359 521.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1672 0 R /H /I >> endobj 1674 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.517 512.124 539.863 521.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1672 0 R /H /I >> endobj 1675 0 obj << /Type /Action /S /GoTo /D [1601 0 R /XYZ 72.0 192.28 null] >> endobj 1676 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 500.124 306.266 509.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1675 0 R /H /I >> endobj 1677 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.736 500.124 539.765 509.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1675 0 R /H /I >> endobj 1678 0 obj << /Type /Action /S /GoTo /D [1604 0 R /XYZ 72.0 687.9 null] >> endobj 1679 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 488.124 249.587 497.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1678 0 R /H /I >> endobj 1680 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.605 488.124 539.796 497.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1678 0 R /H /I >> endobj 1681 0 obj << /Type /Action /S /GoTo /D [1604 0 R /XYZ 72.0 421.514 null] >> endobj 1682 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 476.124 245.086 485.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1681 0 R /H /I >> endobj 1683 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.561 476.124 539.765 485.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1681 0 R /H /I >> endobj 1684 0 obj << /Type /Action /S /GoTo /D [1604 0 R /XYZ 72.0 300.728 null] >> endobj 1685 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 464.124 209.131 473.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1684 0 R /H /I >> endobj 1686 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.558 464.124 539.865 473.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1684 0 R /H /I >> endobj 1687 0 obj << /Type /Action /S /GoTo /D [1604 0 R /XYZ 72.0 179.942 null] >> endobj 1688 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 452.124 288.51 461.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1687 0 R /H /I >> endobj 1689 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.717 452.124 539.797 461.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1687 0 R /H /I >> endobj 1690 0 obj << /Type /Action /S /GoTo /D [1607 0 R /XYZ 72.0 687.9 null] >> endobj 1691 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 440.124 281.697 449.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1690 0 R /H /I >> endobj 1692 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.664 440.124 539.763 449.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1690 0 R /H /I >> endobj 1693 0 obj << /Type /Action /S /GoTo /D [1607 0 R /XYZ 72.0 554.45 null] >> endobj 1694 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 428.124 280.903 437.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1693 0 R /H /I >> endobj 1695 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.631 428.124 539.732 437.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1693 0 R /H /I >> endobj 1696 0 obj << /Type /Action /S /GoTo /D [1607 0 R /XYZ 72.0 397.0 null] >> endobj 1697 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 416.124 198.114 425.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1696 0 R /H /I >> endobj 1698 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.489 416.124 539.827 425.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1696 0 R /H /I >> endobj 1699 0 obj << /Type /Action /S /GoTo /D [1607 0 R /XYZ 72.0 275.55 null] >> endobj 1700 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 404.124 211.807 413.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1699 0 R /H /I >> endobj 1701 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.497 404.124 539.796 413.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1699 0 R /H /I >> endobj 1702 0 obj << /Type /Action /S /GoTo /D [1607 0 R /XYZ 72.0 142.1 null] >> endobj 1703 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 392.124 231.087 401.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1702 0 R /H /I >> endobj 1704 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.584 392.124 539.828 401.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1702 0 R /H /I >> endobj 1705 0 obj << /Type /Action /S /GoTo /D [1610 0 R /XYZ 72.0 605.9 null] >> endobj 1706 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 380.124 174.449 389.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1705 0 R /H /I >> endobj 1707 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.459 380.124 539.865 389.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1705 0 R /H /I >> endobj 1708 0 obj << /Type /Action /S /GoTo /D [1610 0 R /XYZ 72.0 504.95 null] >> endobj 1709 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 368.124 188.776 377.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1708 0 R /H /I >> endobj 1710 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.5 368.124 539.865 377.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1708 0 R /H /I >> endobj 1711 0 obj << /Type /Action /S /GoTo /D [1610 0 R /XYZ 72.0 392.0 null] >> endobj 1712 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 356.124 188.221 365.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1711 0 R /H /I >> endobj 1713 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.499 356.124 539.866 365.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1711 0 R /H /I >> endobj 1714 0 obj << /Type /Action /S /GoTo /D [1610 0 R /XYZ 72.0 277.05 null] >> endobj 1715 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 344.124 182.143 353.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1714 0 R /H /I >> endobj 1716 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.481 344.124 539.865 353.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1714 0 R /H /I >> endobj 1717 0 obj << /Type /Action /S /GoTo /D [1610 0 R /XYZ 72.0 162.1 null] >> endobj 1718 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 332.124 204.193 341.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1717 0 R /H /I >> endobj 1719 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.543 332.124 539.864 341.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1717 0 R /H /I >> endobj 1720 0 obj << /Type /Action /S /GoTo /D [1613 0 R /XYZ 72.0 658.965 null] >> endobj 1721 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 320.124 180.477 329.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1720 0 R /H /I >> endobj 1722 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.476 320.124 539.865 329.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1720 0 R /H /I >> endobj 1723 0 obj << /Type /Action /S /GoTo /D [1613 0 R /XYZ 72.0 528.901 null] >> endobj 1724 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 308.124 208.031 317.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1723 0 R /H /I >> endobj 1725 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.555 308.124 539.865 317.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1723 0 R /H /I >> endobj 1726 0 obj << /Type /Action /S /GoTo /D [1613 0 R /XYZ 72.0 422.837 null] >> endobj 1727 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 296.124 246.866 305.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1726 0 R /H /I >> endobj 1728 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.598 296.124 539.797 305.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1726 0 R /H /I >> endobj 1729 0 obj << /Type /Action /S /GoTo /D [1613 0 R /XYZ 72.0 304.773 null] >> endobj 1730 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 284.124 239.303 293.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1729 0 R /H /I >> endobj 1731 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.606 284.124 539.826 293.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1729 0 R /H /I >> endobj 1732 0 obj << /Type /Action /S /GoTo /D [1613 0 R /XYZ 72.0 150.709 null] >> endobj 1733 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 272.124 224.949 281.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1732 0 R /H /I >> endobj 1734 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.533 272.124 539.794 281.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1732 0 R /H /I >> endobj 1735 0 obj << /Type /Action /S /GoTo /D [1616 0 R /XYZ 72.0 611.52 null] >> endobj 1736 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 260.124 233.162 269.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1735 0 R /H /I >> endobj 1737 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.558 260.124 539.796 269.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1735 0 R /H /I >> endobj 1738 0 obj << /Type /Action /S /GoTo /D [1616 0 R /XYZ 72.0 470.788 null] >> endobj 1739 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 248.124 293.711 257.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1738 0 R /H /I >> endobj 1740 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.7 248.124 539.765 257.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1738 0 R /H /I >> endobj 1741 0 obj << /Type /Action /S /GoTo /D [1616 0 R /XYZ 72.0 342.056 null] >> endobj 1742 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 236.124 224.397 245.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1741 0 R /H /I >> endobj 1743 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.533 236.124 539.796 245.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1741 0 R /H /I >> endobj 1744 0 obj << /Type /Action /S /GoTo /D [1616 0 R /XYZ 72.0 215.724 null] >> endobj 1745 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 224.124 247.97 233.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1744 0 R /H /I >> endobj 1746 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.602 224.124 539.798 233.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1744 0 R /H /I >> endobj 1747 0 obj << /Type /Action /S /GoTo /D [1619 0 R /XYZ 72.0 720.0 null] >> endobj 1748 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 212.124 161.109 221.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1747 0 R /H /I >> endobj 1749 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.452 212.124 539.896 221.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1747 0 R /H /I >> endobj 1750 0 obj << /Type /Action /S /GoTo /D [1619 0 R /XYZ 72.0 602.705 null] >> endobj 1751 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 200.124 156.694 209.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1750 0 R /H /I >> endobj 1752 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.44 200.124 539.897 209.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1750 0 R /H /I >> endobj 1753 0 obj << /Type /Action /S /GoTo /D [1619 0 R /XYZ 72.0 450.815 null] >> endobj 1754 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 188.124 205.806 197.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1753 0 R /H /I >> endobj 1755 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.511 188.124 539.827 197.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1753 0 R /H /I >> endobj 1756 0 obj << /Type /Action /S /GoTo /D [1619 0 R /XYZ 72.0 300.925 null] >> endobj 1757 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 176.124 205.806 185.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1756 0 R /H /I >> endobj 1758 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.511 176.124 539.827 185.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1756 0 R /H /I >> endobj 1759 0 obj << /Type /Action /S /GoTo /D [1619 0 R /XYZ 72.0 163.035 null] >> endobj 1760 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 164.124 236.906 173.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1759 0 R /H /I >> endobj 1761 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.536 164.124 539.763 173.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1759 0 R /H /I >> endobj 1762 0 obj << /Type /Action /S /GoTo /D [1622 0 R /XYZ 72.0 607.9 null] >> endobj 1763 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 152.124 235.805 161.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1762 0 R /H /I >> endobj 1764 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.532 152.124 539.762 161.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1762 0 R /H /I >> endobj 1765 0 obj << /Type /Action /S /GoTo /D [1622 0 R /XYZ 72.0 476.214 null] >> endobj 1766 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 140.124 211.265 149.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1765 0 R /H /I >> endobj 1767 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.497 140.124 539.798 149.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1765 0 R /H /I >> endobj 1768 0 obj << /Type /Action /S /GoTo /D [1622 0 R /XYZ 72.0 356.528 null] >> endobj 1769 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 128.124 239.186 137.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1768 0 R /H /I >> endobj 1770 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.576 128.124 539.797 137.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1768 0 R /H /I >> endobj 1771 0 obj << /Type /Action /S /GoTo /D [1622 0 R /XYZ 72.0 202.842 null] >> endobj 1772 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 116.124 170.659 125.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1771 0 R /H /I >> endobj 1773 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.412 116.124 539.829 125.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1771 0 R /H /I >> endobj 1774 0 obj << /Type /Action /S /GoTo /D [1625 0 R /XYZ 72.0 687.9 null] >> endobj 1775 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 104.124 237.118 113.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1774 0 R /H /I >> endobj 1776 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.602 104.124 539.829 113.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1774 0 R /H /I >> endobj 1777 0 obj << /Type /Action /S /GoTo /D [1625 0 R /XYZ 72.0 544.85 null] >> endobj 1778 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 92.124 237.22 101.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1777 0 R /H /I >> endobj 1779 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.636 92.124 539.862 101.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1777 0 R /H /I >> endobj 1780 0 obj << /Type /Action /S /GoTo /D [1625 0 R /XYZ 72.0 425.8 null] >> endobj 1781 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 80.124 233.262 89.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1780 0 R /H /I >> endobj 1782 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.591 80.124 539.829 89.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1780 0 R /H /I >> endobj 1783 0 obj << /Length 1784 0 R /Filter /FlateDecode >> stream xœÍÝ]s\Gr á{ý \ÒëvUeVeæ¥Fš±Ç+͇ÈG¬Ã±![bH@@å_¿•çjçÈê÷b½ë±=lè-4ɇ"ú$ªëüûgõ¢Ìÿü}þ—E»xûñ³øX½°v!ãáC}\T;Œâ/x÷‹>ûa&?”å£õú໋ùìú³rñŸýë¿ÍèÝE9ô‹¿}V6Ÿ|ý4¯?ûã|ò>2<"~®íPÝó)ä0æÞ~¼ø‡ß~l_Þ,õãÏ>?Qùþ³ú3’Úþ¿øåÏi1_ÔÛü_;,ôÏþA×òüŸ<ùcñÓÇOÿ§Y?6?rh}>yþ£ÿÿàñ‡}ù•­ÿý³¿’‡OõdñËß×å—øßùäåâýg¿zóÙ?ü¦_ÔrñæÛÓ¿EÖù±ƒ·Èÿio>^üë«ÿø»»xóÏŸýúÍæÃóïÙ†1Ÿû§_ä”楔úìµÐÚÃ/iý}uuwqóíś˿|8Þ­¿¼ßŽr!v°2ægl¾®¬‡‹¿»ø{‹C½xõù—Wò3œ>ôíÍíÇËû»Óæ“üôãûﮞü“w7o?}<^߯ÏþÓsÖÞÚ$¢‡mŸþ´|³ÌV5bˆ’e£JésÙΓ6q'±ƒØ*‰•Äb/$ˆƒ Ø l¶[‚­ÁV`«@°5 Øl "(DP‰ A%‚J;ìD°§à(µÆ8£ÕŠj#µT ªªƒÔÞPÝQ,Y² b)…XJ!–Rˆ¥b9_ ¢šXJ%–Òˆ¥4b) Y ²d)ÈR¥"KE–Š,;²ìȲ#Ë,²Èr KC–†, Y:²tdéÈ2e Ë@–A,µK-ÄR ±ÔJ,µK­ÄR±œ×ú¨&–Ú¥ KA–‚,Y*²T;xƒú¨`P¢ó¯ýj:Ÿ¤ Z¦?7–ù««« Êżðx1r*‡uê4WââÕ›ßÿï/þéóoþdz|ùù›_Ÿ>pyýîÙ?}óÛ¯ýúÍç_ÿáôÑuPuz|üpÌaÔÝæ5k©mþ²­mf§å›eã0æ5Ž[ïhYú¼ò ‰íªí‹ØFâNb??–RI¬$6Ï?% Ai@P”F… "¨DP‰ A%‚v"Ø‰à ‚ƒ"hDЈ A#‚N: "D0€  ¨j‚Z€ V ¨j‚Ú€ 6 ¨ "(DPˆ Áù—yô>ãA^ZéLç«1²bþÝn1ÿ²³¬zl^¹Î¿…_Díá•kþUpñêëãÇ›ÛO¿¼¼¿üËåÝñô‘?}óÕ‹ÏZ竪^Jmû§•›eó˜ÌWùV-³CTËo}ÛvÙKŠ:ÿ¬‘ZP=P¤žÞHÝQí¤žWU¤VT#Ë,²Èr KC–†, Y:²tdéÈ2e Ë@–A,[!–­ËVˆe«Ä²UbÙ*±lX¶F,[#–­!KA–‚,Y*²Td©È²#ËŽ,;²ìÈr Ë,²4diÈÒ¥#KG–Ž,Y² dÄ2‡¤&–9:u%–9<$5±Ìñ!¨±Ì"©‘¥ KA–‚,Y*²Td©È²#ËŽ,;²Èr Ë, Y²4diÈÒ‘¥#KG–,Y±ÌÉ"©‰eÎIM,sºHjb™óEP7b™FR#K4÷Q4÷Q4÷Q4÷Q4÷ÉAcmLÏrÆØk)%lçóÿü²ùW¿‡†G©Ûe­ÙfÐ8ÿ¦Û Û2hÌkù‹W¿¹Zß“±>z:f\?²3fœ—ÞÚbþܽo?ýiåfY?ø˜¿££5´,RFBÔí²ÍaþêHÝQí¤žÿ ’ZQm¤žÿ ι¥ ×sjAõ@uZª;ªÔ½¢ZQm¤Èr Ë,²4diÈÒ¥#KG–Ž,Y² dÄ2G¯¤&–9zu%–9z%5±ÌÑ+©‰eŽ^I,Y ²d©ÈR‘¥"ËŽ,;²ìȲ#Ë,²ÈÒ¥!KC–Ž,Y:²tdÈ2e˽’šXæèÔ•Xæè•ÔÄ2G¯ nÄ2G¯¤F–‚,Y ²Td©ÈR‘¥"ËŽ,;²ìÈr Ë,²4diÈÒ¥!KG–Ž,Y² dÄ2G¯¤&–9z%5±ÔJ,µK­ÄR±ÔF,µ!K4÷Q4÷Q4÷Q4÷Q4÷ÉÑk™—Òµ)™FæüU»—b¾3BûùeËüuþܤÚvÙÞüuþµ±™¿ÊºÑÓ~ñê›ãÝͧ۷ÇÓGžmõ\>²·ÕS–9pŒ¡Û§8­Ü6“u‡(X6ÿ$uZíÛe{DRT©çŸ$RwT;©{Eµ¢ÚH=å@–YdiÈÒ¥!KG–Ž,Y² dÈ2ˆeNIM,s‚êJ,s‚Hjb™DRËœ ’Y ²d)ÈR‘¥"KE–YvdÙ‘eG–Yd9¥!KC–†,Y:²tdéÈ2e Ë –9A$5±Ì "¨+±Ì "©‰eNA݈eNI,Y ²d©ÈR‘¥"KE–YvdÙ‘å@–YdiÈÒ¥!KC–Ž,Y:² dÈ2ˆeNIM,s‚Hjb™DRËœ ‚ºËœ ’Y¢¹¢¹¢¹¢¹¢¹Ï²ysþRKC±eg+£Y¶Lç†ïŒàö&ˆ±9W»tÝÁYrDùúxûÃñöôøÙÎò3{8ççpóóíç?-ܬ‡æùóRѲ‰#æ¯y»j3IÈ×:çÇÄóßœݎ&gÔùJÔŠj#u¾Òµ z :H¯t@ÝQ,²Èr KC–†, Y²tdéÈÒ‘e Ë@–A,[!–­ËVˆe+IJUbÙ*±l•X¶F,[#–­!KA–‚,Y ²Td©ÈR‘eG–Yæw¸òË| ;£ÎïpZP=P¤¶†êŽj'u~‡ ÔŠjdÈ2e Ë –Rˆ¥b)…XJ%–R‰¥Tb)XJ#–Òˆ¥4d)ÈR¥ KE–Š,YvdÙ‘eG–Yd9å@–†, Y²tdéÈÒ‘¥#Ë@–,ƒXj!–Zˆ¥b©•Xj%–Z‰¥Vb©Xj#–Ú¥ KA–‚,Yæ>HËÙ\ì¼¢þÙÙܲÒó­ÄŒôÖ)f_‡Ÿ›e­ùfŠ™ïãÞŒ1û:ÆÔ< þOwCÌåÑñìëƒ?\ÞÝýíæöÝËËõù¯›–Rzßùü§õ›uý µÏß*U¶ÎÖ×»Qm—m† ó…©ÕFêù‹Ԃêê õ|áEêŽjd©ÈR‘¥"ËŽ,;²ìȲ#Ë,²ÈÒ¥!KC–Ž,Y:²tdÈ2e˼“&©‰eÞKÔ•XæÝ4IM,ó~š nÄ2ï¨Ijd)ÈR¥ KE–Š,Y*²ìȲ#˼gr¸qÐyžMDre¹¡Ü Ë…åƒåro,ï,gªÁTƒ©RÍ[m¢©æÍ6QŽTóv›(GªyÃM’7¤š·ÜD9S¦*LU˜ª0UeªÊT•©v¦Ú™jgªƒ©¦:˜ê`ªÆT©Su¦êLÕ™j0Õ`ªÁT©æÍ8QŽTµ U­HU+RÕŠTµ!UmHURÕÆT…© S¦ªLuy#{îelA¦’ÏÞÉNÖ=݈º]·;Ãm;w-Ë wþ­§¯¾¸ùðéãõéñï.?ïN¯žü£þòW_œ}s¼ûôáþõñ~3Ú‡‘w õ1vžþô 6ëâó/úÊÖÍ×þ5JÄüsº³n;ï,”Ï×þ(ï,w”Ï×þ(W–ÉsëÊ‘jn¾C9RÍíw(Gª¹ä ©æ<”3UaªÂT…© SU¦ªLU™jgª©öT­¥Doç䣰\X>X(·ÆòÎrG¹W–+Ë™j0Õ`ªÁT©ææ<”#ÕÜžGòŠTsƒÊ‘jnÑC9RÍMz(gªÂT…© SU¦ªLU™jgª©v¦Ú™ê`ªƒ©¦jLÕ˜ª1UgªÎT©:S ¦L5jîÞC9RÍý{$¯H5wð¡©æ>’7¤š»øPÎT…© S¦ªLU™jx[ó†,Mɰcy³åp¥t´.'Gó•ttß[×Úöv×y& •‡;q?NŽìñ~×qñê‹ÛãåýÕõûÓG~wüÛéÁã{š_Ž æë•"oHÞ>Çiýf´ÙüIGgëÆÁkþb=vÖm¦óŒ×þpaõËù|ƒòÎrGù|ƒre¹¡|¾‚A¹°|°œ©¦:˜ê`ªÆT©Su¦êLÕ™ª3Õ`ªÁT©æ68”#ÕÜGòŠTs+Ê‘jn†#yCª¹åLU˜ª0UaªÊT•©*SU¦Ú™jgªÝ××Ë‹µ_ÎGe¹²ÜPn…åÂòÁò@¹7–w–3Õ`ªÁT©æÎ8”#Õ܇r¤š;ãPŽTsgÉRÍq(gªÂT…© S¦ªLU™ª2ÕÎT;SíLu0ÕÁTSLÕ˜ª1UcªÎT©:S ¦L5˜j Õ܇r¤š;ãH^‘jîŒC9RÍq(GªÚª6¦*LU˜ª0UeªËݵk)m¯þÙaݳ[l“uÏ6ÆmÖíŽ7s+÷Ëñ¦¯on®ùŸº¿ùxyõöô¡×ß}ºwó·ë——þóõRïía4¹ù¼§õ/×åÍç-¹ù~²nÄcþÄκÍd"o}ò¼÷É;Ëåyû;’+Ë åy<’ Ë™ª2ÕÎT;SíLu0ÕÁTS5¦jLÕ˜ª1UgªÎT©S ¦H5·›¢©ævS”#ÕÜnŠr¤šÛMIÞjn7E9S¦*LU˜ª0UeªÊT•©v¦Ú™ê¼ ž×Se~IÛ{A´€– ËËåó‚ååŽòyAre9S ¦L5˜j ÕÜnŠr¤šÛMI^‘jn7E9RÍí¦(Gª¹ÝåLU˜ª0UaªÊT•©*SíLµ3ÕÎT;SLu0ÕÁT©S5¦êLÕ™ª3UgªÁTƒ©RÍí¦(Gª¹Ý”䩿vS”#ÕÜnJò†Ts»)Ê™ª0UaªÂT•©æ;£…[dt¸XëLµ¢u½Bʼ°½ç›×eÛkž7ñrÀûGëÅ«?_~¸zwuÿãé#_|w|û×ÓÃ?ÜÞ|¼½ÿqg@éUóØÌØy–ÓúͺÜI­ó×0àºÜs;JÑ";ë¶CÅÆòÎrGù|•re¹¡|¾Ê@¹°|°œ©¦:˜ê`ªÆT©Su¦êLÕ™ª3Õ`ªÁT©æ–P”#ÕÜJòŠTsK(Ê‘jn %yCª¹%åLU˜ª0UaªÊT•©*SU¦Ú™jgª=U{¸çwž9•åÊrC¹– ËËåÞXÞYÎTƒ©S ¤š[BQŽTsK(Ê‘jn E9RÍ-¡$oH5·„¢œ© S¦*LU˜ª2UeªÊT;SíLµ3ÕÁTSLu0UcªÆT©:Su¦êL5˜j0Õ`ªTsK(Ê‘jn %yEª¹%åH5·„¢©æ–P”3UaªÂT…©*SÍ-¡2ó!{/Èvü¶Ž,YëÖ=¡¥–ÖwÖíŽ,ó˜Ù—#Ëy!¼¼­~¹3øë?~uzð??æ-nNøÓzïõÁåÝéÇ¿}w¼¾¿úöêx»™BùAsŸlÏŸäæéOŸa30Ê[Å\W…­ÓC˜•²÷lÛ©”x^„€XHX(·ÆòÎrG¹W–+Ë™j0Õ`ªÁT©æf8”#ÕÜ GòŠTs3Ê‘jn†C9RÍÍp(gªÂT…© SU¦ªLU™jgª©v¦Ú™ê`ªƒ©¦jLÕ˜ª1UgªÎT©:S ¦L5jn†C9RÍÍp$¯H57á©æf8’7¤š›áPÎT…© S¦ªLUÇ¡™vs{úñ7×÷—W×Ï>Ý—7>\>m¾»¼½|{??Ïæ+»ZôÈwíü²NŸaóE¸Êh¥Vkl]þf?Ü${»nï›N(w”ç9$$W–Êó’ ËËåÆT©Su¦êLÕ™j0Õ`ªÁT©.ç©.瀼"Õå’#Õå’#Õå’3UaªÂT…©*SÍc÷ó¦RË~÷ó¿êäKƒ(ó%E¯ŠÖÍ—cD)Cúκݗ±sÎòüßå[%¿±õÍñÛãíñúíñô¡û›Ó×;xÝ>°ÜÂëåwæEm3›_´Ýwžò´x³.¿ý9¿Øk¾#ëæÉÉTt÷ù6ߨÈzAžô’¼³ÜQžô’\Yn(ÏzI.,gªÎTƒ©S ¤ºÐKr¤ºÐ òŠT—zIŽT—zAÞêr@/É™ª0UaªÂT•©*SU¦ªLµ3ÕÎT;SLu0ÕÁT©S5¦jLÕ™ª3UgªÁTƒ©R]è%9R]è%9R]è%9R]èyCªË½$gªÂT…© S¦ªLU™ª2ÕÎT;SíLu0ÕÁTSLÕ˜ª1UcªÎT©:S ¦L5˜j Õe0Fr¤º Æ@^‘ê2#9R]c$GªË`ŒäLU˜ª0UaªÊTó{fÝ"ú¨d®³~ÏÌ#æó uy½0Kï²7GÚŒµ²sBï¼²]žÃ–óxïoï?¶>¾úÏãéÑ—Ç·.o/ï¯n®_ŽòTªž§mÔ±ó4§O±Y7&ó7̓­Ë»dW›6;ë6“мK6ÉËåy—l’w–;Êó.Ù$W–ÊSLu0ÕÁT©S5¦êLÕ™ª3Õ`ªÁTƒ©Rm©fr¤Ú*Rm©¶ŠT[Cª­!ÕÖjkLU˜ª0UaªÊT•©*SíLµ3ÕÎT;SLu0ÕÁT©S5¦êLÕ™ª3UgªÁTƒ©R•‚T¥ U)HU*R•ŠT¥"U©HUR•†T¥1UaªÂT…©*SU¦ªLU™jgª©v¦:˜ê`ªƒ©S5¦jLÕ˜ª3UgªÎTƒ©S ¤ª©jAªZª¤ª©jEªZ‘ª6¤ª ©jcªl¶¤l¶¤l¶¤l¶¤l¶´ž ±Ì8÷òŸ¿=;A‚¬[N˜é({ëvg–uçÐÛye›Ï‘—¯Þüøýñôè××ßÞܾ=~<^ߟ>xu}úñ7¿¿¼½º»yò±Ëëw§ŸßÝ]½¿ÎO°¹°ÓC£”¡¶óó:}†Í:;H›¿[Ý;Z·ÜëQg³n{©',,”/wÇyg¹£|¹;È•å†rcªÆT©Su¦êLÕ™j0Õ`ªT¥ U)HU R•‚T¥"U©HU*R•†T¥!UiLU˜ª0UaªÂT•©*SU¦Ú™jgª©¦:˜ê`ªƒ©S5¦jLÕ™ª3UgªÁTƒ©S ¤š»YPŽTs7 É+RÍÝ,(Gª¹›åH5w³ œ© S¦*LU™ê¼:¦áf{ùÏ^³ä•¡ÉLçÕZ7¯,æ5’•½k«Ý+öw¶`_Ïœ¿ó¯~ss{œ—r§üÏã§on¯Þ¿?Þß>ôååýåéÑß]^¿?¾xÞå^ž'U¶óS8­~¹.ßF´ÜNe¾)j{ë^ºå÷æI>ÿÒD¹°|° yEªyç”#Õ¼óÉRÍ; œ© S¦*LU™jmZ/u^ž‘ùÂòŽˆQKÑæÏ÷½lÖímúÞñƶžâ¢ËÍÞ^Þ¯—sZ?øxsƒüñïþôÕW/‡ù&E)Ãv>ÿã—‹æo­Ú\$EÉ*9x}üÚ¬ÚŒ'òÐM’ÊsfFòÎrGyºIre¹¡<Ý$9S5¦jLÕ™ª3UgªÁTƒ©RÍéÊ‘jNïPŽTsz‡r¤šÓ;’7¤šÓ;”3UaªÂT…© SU¦ªLU™jgª©v¦:˜ê`ªƒ©¦jLÕ˜ª1UgªÎT©S ¦L5jNïPŽTszGòŠTsz‡r¤šÓ;”#՜ޡœ© S¦*LU™ª2Ueª©v¦Ú™jgªƒ©¦:˜ª1UcªÆT©:Su¦êL5˜j0Õ@ª9½C9RÍéÉ+RÍéÊ‘jNïHÞjNïPÎT…© S¦ªL5Ï`®neœ?‘z8ùaDxöªå,_]µ;¹{ç/û2¹õÐÖÑÜéÑzlÉúã¯?}¸¿úûõÎd§þéw¿ýãŸ~}züÅÍõÝýíåÕõýË WyK¢¼3kh¯;?‘ӧج‹Ã˜ÿ/´4´nþ™6‘™æî·Íºíog¹£|þ™F¹²ÜP>ÿL£\X>X(ïLµ3ÕžªZŠç›N9•åÊrC¹– ËËåÞXÞYÎTƒ©S ¤šÇº ©æ±.(Gªy¬ Ê‘jëBò†TóX”3UaªÂT…© SU¦ªLU™jgª©v¦:˜ê`ªƒ©¦jLÕ˜ª1UgªÎT©S ¦L5jë‚r¤šÇº¼"Õ<ÖåH5uA9RÕ†TóX’ S¦*LU™jëòÓ{‹Î¿š[Žu©6×u´lyKRÌeeï¢s÷ÙöÎûŒõY–ó>o?å—‡Í-ëÇÖ÷­?þææÓõ»‡»­¹zR>žº>š×Ë?oï¶74ÊïM°‡÷m~N§Ï°¹\~ú&,²®"ïcoÝæeì|õEòùê åÊrCù|õ…raù`y |¾úB9SU¦Ú™jgª=Uç¿»êqN> Ë…åƒårk,ï,w”{e¹²œ©S ¦L5j~·åH5¿[MòŠTó»Õ(GªùÝj”#Õün5Ê™ª0UaªÂT•©*SU¦Ú™jgª©v¦:˜ê`ªƒ©S5¦jLÕ™ª3UgªÎTƒ©S ¤šß­F9RÍïV“¼"Õün5Ê‘j~·šä ©æw«QÎT…© S¦ªLu^Œ÷ÇãDοT\Îó’¿ê@ë–·šÌkѽ×ÿó:k{1î;G¬ÎÏ!Ë-¯>^~8}àõÛËÇÓÃõȇöꇫ»Óe»ütßõÁçþÇÓƒ?_~ø´94$ÏäŒyeá¾ós;­Þ¹(/y(mW¸®êˆR†ôu{å$Ï›Þ\Yn(Ï›Þ\X>X(ϛޜ©*SíLµ3ÕÎTSLu0ÕÁT©S5¦êLÕ™ª3Õ`ªÁTƒ©RÍ‹r”#Õ¼('yEªyQŽr¤šå(GªyQŽr¦*LU˜ª0UeªÊT•©v¦Ú™jgª©¦:˜ê`ªÆT©Su¦êLÕ™ª3Õ`ªÁT©æE9Ê‘j^”“¼"Õ¼(G9RÍ‹r’7¤šå(gªÂT…© SU¦ªLu^ÃkXxw%—–ËE¼ÔRk ´./âóâߺí¬Û»ˆÏsÒ·ñu=/Âæû§ï¿¿¹½|øp–gþðw—¿{üá{×ã5_TT™—ãZwžæqífUÔ6Ÿ¿*ߥÖç/\bï¹^ºÔ|—Éåù.5’+Ë åù.5’ ËË僩¦:˜ª1UcªÆT©:Su¦êL5˜j0Õ@ª­ ÕVj+HµU¤Ú*RÍ÷ø ©æ;zPŽTó=$¦*LU˜ª2UeªÊT•©v¦Ú™jgªƒ©¦:˜ª1UcªÆT©:Su¦êL5˜j0Õ@ªùŽ”#Õ|GÊ‘j¾£åH5ßÑCò†Tó=(gªÂT…© S¦ªLU™ª2ÕÎT;SíLu0ÕÁTSLÕ˜ª1UcªÎT©:S ¦L5˜j Õ|GÊ‘j¾£‡ä©æ;zPŽTó=(GªùŽ”3U6[R6[R6[R6[Êd×çîEÏŸ¦åøQ=J•a`Õr­ë›¶«v‡uç°Úy!¹<òKéõãìñá<O~{úñãÙë£ýd~å-ù®×§>­ÞLÜæGåáæØhÝ8èðˆùïÖκí`/P>»QÞYî(Ÿ—f(W–Êç¥Ê…åLÕ˜ª3UgªÎTƒ©S ¤š‡Ó¢©æá´(Gª¹ÅåH5w’¼!ÕÜYˆr¦*LU˜ª0UaªÊT•©*SíLµ3ÕÎTSLu0ÕÁT©S5¦êLÕ™ª3Õ`ªÁTƒ©RÍ…(Gª¹³ä©æÎB”#ÕÜYˆr¤š; QÎT…© S¦ªLU™ª2ÕÎT;SíLµ3ÕÁTSLÕ˜ª1UcªÎT©:Su¦L5˜j ÕÜYˆr¤š; I^‘jî,D9RÍ…$oH5w¢œ© S¦*LU™jNêFïµ’!Ó2«Ë£h¢9Z÷ô~àÛu»Óº¶s@í|9°Ü¾ÊòöU¯ïoŽÖY¿½ùøýåíÕÝú®¾õc÷šZ}ù.OãÙLŸâP|þ¢úh;O{Z¾µƒ )eþF²uý0$Ö}“ÛuÛy”£|~ A¹²ÜP>¿„ \X>X(Ÿ_BPÎT©æÎ1”#ÕÜ9FòŠTsçÊ‘êr(4ÈRÍc(gªÂT…© SU¦ªLU™ª2ÕÎT;SíLu0ÕÁTS5¦jLÕ˜ª1UgªÎT©S ¦H5wŽ¡©æÎ1”#ÕÜ9†r¤š;ÇHÞjîC9S¦*LU˜ª0UeªÊT•©v¦Ú™jgªƒ©¦:˜ê`ªÆT©Su¦êLÕ™j0Õ`ªÁT©æÎ1”#ÕÜ9FòŠTsçÊ‘jîC9RÍc(gªÂT…© SU¦š·:/·=£”åvI®ë)Wdݺ{,¼KßY·;’àçË|Žï-ÛŽBªcÖm½5áù¼ôEyg¹£|^ú¢\Yn(Ÿ—¾(––3ÕÁTSLÕ˜ª1UcªÎT©:Su¦L5˜j ÕÜþŠr¤šÛ_I^‘jnE9RÍí¯$oH5·¿¢œ© S¦*LU™ª2UeªÊT;SíLµûú’ „“Êre¹¡Ü Ë…åƒåro,ï,gªÁTƒ©RÍí¯(Gª¹ýåH5·¿¢©æöW’7¤šÛ_QÎT…© S¦*LU™ª2Ueª©v¦Ú™ê`ªƒ©¦:˜ª1UcªÆT©:Su¦L5˜j0Õ@ª¹ýåH5·¿’¼"ÕÜþŠr¤šÛ_QŽTµ!UmLU˜ª0UaªÊTóíØe^/;AÏí-Û_Ñ‚g#ÐͺÝèØ»eËX÷½–‹W_ÿø0ͧ]¯å¿~¶y=/>lçs?®Ý¬ŠÃÈU­EógÉEó¯ñU{“O”ÇÌKÄ(qN>ÿx¢¼³ÜQ>ÿx¢\Yn(ï…åÂòÁr¦:˜ê`ªƒ©S5¦jLÕ™ª3UgªÎTƒ©S ¤š£O”#Õ}’¼"Õ}¢©æè“ä ©æèåLU˜ª0UaªÊT•©*SU¦Ú™jgª©¦:˜ê`ªÆT©S5¦êLÕ™ª3Õ`ªÁT©æèåH5GŸ(Gª9úD9RÍÑ'ÉRÍÑ'Ê™ª0UaªÂT…©*SU¦ªLµ3ÕÎT;SLu0ÕÁTS5¦jLÕ˜ª3UgªÎTƒ©S ¦H5GŸ(Gª9ú$yEª9úD9RÍÑ'Ê‘ª6¤ªl¶¤l¶¤l¶¤l¶¤l¶´l ˆF{ë9”sU ²j~†ß[µ;ý´½{ÆØ:ýœŸàâÕïo/ß>Ì<—ǧèúpZu"‡™î<Åiõfú,Ãú`ëÆ!lÌuâ;ë6ŠyaMòyaòÎrŸyžÎyN}ð‹›ëûÛ›§|}ón3_ÍÃbæë¢Ò}ì<ÏiíÞ¼Îd}K>Y7i¬æM£šî¬ÛÜ¡ÜQÞ+Ë•å†òQX.,,”S5¦jLÕ™ª3UgªÁTƒ©S ¤šƒ;”#ÕÜ‘¼"ÕÜ¡©æàåH5w(gªÂT…© SU¦ªLU™jgª©öTµùu¿ŸU©GCuGµ“Ú*ªÕFj/¨T#KG–,Y±ÌÁ©‰eî@]‰eîHM,spêF,spGjd)ÈR¥ KE–Š,Y*²ìȲ#ËŽ,²Èr KC–†, Y²tdéÈÒ‘e Ë@–A,spGjb™ƒ;RËÜ‘šXæàÔXæàŽÔÈR¥ KA–‚,Yοí[m¥ôfP˞Ȯó¥-Z÷tr·]·;¹k/ÌÉ]]&wóoÃúlOäúßÞÝ|¸|ä­úêøÃñÃéá·7·§¯ww3¾ÛÌLôà£ç¾Éºó³8­ß™µ”Ü÷YjCë–ÝR^J ÙY·7tA¹¡|Ù-raù`y|Ý-òÎrGyEªën)#Õu·È‘êº[ äLU˜ª0UaªÊT•©*SíLµ3ÕÎT;SLu0ÕÁT©S5¦êLÕ™ª3UgªÁTƒ©R]7O©®Û§ÎÏ+R]7P©®[¨ÎÏR]7Qœ© S¦*LU™ª2UeªÊT;SíLµ3ÕÁTSLÕ˜ª1UcªÆT©:Su¦L5˜j Õuwȑ꺿 äHuÝar¤ºî±:?oHuÝer¦*LU˜ª0UaªÊTóËÁ°RæÓùÂ2³ ‹¨¡h]ÎlÚòFÛ½9ÈîÌFvn2¯ß–çèËûTŸï¶Z?øÍ͇¹|û×ÓG®žüÓ/—ï>ܼýëËá@þ¥^ò<³'>­ßŒiÊ“Y'/ó·¸î¬ÛÌ.æ_ó(”Ï¿æQÞYî(ŸÍ£\Yn$Ï» ©æ PŽTó®(Gªyg’7¤šw7@9S¦*LU˜ª0UeªÊT•©v¦Ú™jgªƒ©¦:˜ê`ªÆT©Su¦êLÕ™j0Õ`ªÁT©æ=PŽTóž$¯H5ïy€r¤š÷<@9RÍ{ œ© S¦*LU™ª2Ueª©v¦Ú™jgªƒ©¦:˜ª1UcªÆT©:Su¦êL5˜j0Õ@ªyÏ”#Õ¼çÉ+RÍ{ ©æ=HÞjÞóåLU˜ª0UaªÊTsÔµ‰J¦93]îy@Öå¨{)Õöžow¤;÷<˜+—çˆå-wW§GÿëæúÉ£Ëëw§¿½¾?ÞþpùáÉÒ¿?n6ìäÍ¥ô*;Ï~Z¼Y7óâìa FÖšϯœEÆØY·`̯S(ï,w”ϯS(W–Êç×)” ËË™j0Õ`ªTó”#Õ<ÁŸä©æ þ(Gªy‚?ÉRÍüQÎT…© S¦ªLU™ª2Ueª©v¦Ú™ê`ªƒ©¦jLÕ˜ª1UcªÎT©:S ¦L5jžàr¤š'ø£©æ þ(Gªy‚?ÉRÍüQÎT…© S¦*LU™ª2Ueª©v¦Ú™ê`ªƒ©¦:˜ª1UcªÆT©:Su¦L5˜j0Õ@ªy‚?Ê‘jžàOòŠTó”#Õ<ÁåH5OðG9S¦*LU˜ª2Õ|·ÚüS¥¡ϲóIZxt´lÙøÔÃ=wmÖíμúÎþózly»xõûï×W×ï~yyù—Ë»ãããË»Ç}s¼|÷Ó¢ë?n¦=õPG+¥õ±ó¤+7«ô0ýfŒç¯Ê°Ftï;«¶³ŸÂraù`y <ßÔLòÎrGy¾¯™äÊr¤šÛ©PŽTs;Ê‘jn§B9RÍíT$oH5·S¡œ© S¦*LU˜ª2UeªÊT;SíLµ3ÕÁTSLu0UcªÆT©:Su¦êL5˜j0Õ`ªTs;Ê‘jn§"yEª¹ åH5·S¡©æv*”3UaªÂT…©*SU¦ªLµ3ÕÎT;SíLu0ÕÁTS5¦jLÕ˜ª3UgªÎT©S ¦H5·S¡©æv*’W¤šÛ©PŽTs;ÉRÍíT(gªÂT…© SU¦š“%·?2²ž‚ä¥Jžà}öªe¬ôøv¿ÍªyÕ´+½ÓËû2Vʿݟ –Ö<-­ù—«ûïn>ÝŸ>ðõÍ»«o|¶êþ»' ~sõa³Çj¹|­%»îü´N‹w®c½Ìß`ÏIY—÷VÕ¹Î|gÝÞ-Ê…åƒåòåîÖ ï,w”/w·¹²œ©¦:˜ê`ªƒ©S5¦jLÕ™ª3UgªÁTƒ©S ¤*©JAªRªT¤*©JEªÒª4¤* ©JcªÂT…© SU¦ªLU™jgª©v¦Ú™ê`ªƒ©¦jLÕ˜ª1UgªÎT©:S ¦L5j^Т©æ-É+RÍ Z”#Õ¼ %yCªyA‹r¦*LU˜ª0Ueªó‚vä©(Ã…\oå%íztm«h]í#Ší¬Û½¨õ½ƒ}ÇãûƒúÅ«úôþxzôîéf‰å#ßæêéáé-CóÁl·W¯ù!É£y狚ç?­Þ¬ë‡mþ¶ˆ²uóœÏß•èugÝK´ÜÕre¹¡Ü Ë…åƒåro,ï,gªÁTƒ©RÍ}(Gª¹åH5÷q ©æ>’7¤šó/”3UaªÂT…© SU¦ªLU™jgª©v¦:˜ê`ªƒ©¦jLÕ˜ª1UgªÎT©S ¦L5ê2ö"9R]Æ^ ¯Hu{‘©.c/’#ÕeìEr¦*LU˜ª0UeªÊT•©v¦Ú™jgª©¦:˜ê`ªÆT©Su¦êLÕ™ª3Õ`ªÁT©.c/’#ÕeìòŠT—±É‘ê2öyCªËØ‹äLU˜ª0UaªÊT—wy)£Ô<{‡Xöl+ÇfÝîÔ+öŽF¶uê5?ÛÅ«7ÇßßÜ^ÞþxúÐ7Ç»Ç\­oþvwzôpHòòã¯on7ïÊW×S½ŸÀiõÎÔ¥æ‰Ñž7ë¼æŸÑuÛY·7~A¹£<*Ë•åFò¿ \X>X(¯H5Ç/(Gª9~A9RÍñ É…© S¦*LU™ª2Ueª©v¦Ú™ê`ªƒ©¦:˜ª1UcªÆT©:Su¦L5˜j0Õ@ª9~A9RÍñ É+RÍñ Ê‘jŽ_PŽTsü‚r¦*LU˜ª0UeªÊT•©v¦Ú™jgª©¦:˜ê`ªÆT©Su¦êLÕ™ª3Õ`ªÁT©æøåH5Ç/$¯H5Ç/(Gª9~!yCª9~A9S¦*LU˜ª2Õ<•Ø$¢4¬§×ð04hx¸5Uøè{?½½ùK/{§û2É#1.^ýú‡ãõýéáW7ïß_]¿ñ‰æ_µD)µŽOyZýbYë}}÷ Y6eH)²»ì¥Â|Q ê:_T¢¼³ÜQ>_T¢\Yn(Ÿ/*Q.,G¨µ1UaªÂT…©*SU¦ªLµ3ÕÎT;SíLu0ÕÁTS5¦jLÕ˜ª3UgªÎT©S ¦H5G9RÍ#ÄI^‘j!Žr¤šGˆ“¼!Õ×;#gªÂT…© SU¦ªLU™jgª©v¦Ú™ê`ªƒ©¦jLÕ˜ª1UgªÎT©:S ¦L5êó¹Þ9R}>×ûå¼"Õçs½3r¤ú|®÷ËyCªÏçzgäLU˜ª0UaªÊTŸÍõΟM=ŸëuÏæz›u»s½¾sÏšyù³œËÚù®ô«ÿ<žÝ|{úñO·ªY&~ëã‡[×,?ÞŸøå=ŽË(¥ûØùyœVoÖùü]Õ™¶@ë–“²ßù´Y·å(Ë åËIÙ ––Ê—“²AÞYî$o©¶‚T[Aª­"ÕV‘j«HµU¤ÚRm ©¶ÆT…© S¦ªLU™ª2Ueª©v¦ÚSõqïú/磲\Yn(·Âraù`y |¹ È;Ë™j0Õ`ªT¥ U)HU R•‚T¥"U©HU*R•†T¥!UiLU˜ª0UaªÂT•©*SU¦Ú™jgª©¦:˜ê`ªƒ©S5¦jLÕ™ª3UgªÁTƒ©S ¤ª©jAªZªV¤ª©æ¡†$oHURÕ†Tµ1UaªÂT…©*SÍ»›•â IÖ»R‹)Z7¯,z©¢{?½ÝÒØ¹íμZžcþ쟌ÖGo/?¯ÎPÎT©:Su¦êL5˜j0Õ`ªTó†(GªyC’W¤š7@9RÍ ©æ PÎT…© S¦ªLU™ª2ÕÎT;SíLµ3ÕÁTSLÕ˜ª1UcªÎT©:Su¦L5˜j Õ¼!Ê‘jÞ€ä©æ PŽTó†$oH5o€r¦*LU˜ª0UeªÊT•©*SíLµ3ÕÎTSLu0UcªÆT©Su¦êLÕ™j0Õ`ªTó†(GªyC”#Õ¼!Ê‘jÞ€ä ©æ PÎT…© S¦*LU™êò&ÃùǸê^þ³3©å–a¥DÞ]¬Ë7¶ÝvÖíÎö|ï¦ýñM†’ǃÝo¯/?œ>ò«Ë·ýôýéñOo<œ?þòòþò/—wÇÓG~sõáx·þØ¡ú(E‡îüN‹7sšrPñˆž÷5%ëä0¢=ì(Û¬ÛŽƒËåy’w–;Êó0$W–És«Ê‘jnõB9RÍ­^(Gª¹Õ‹ä ©æV/”3UaªÂT…© SU¦ªLU™jgª©æÝ…£Î/ÅÏÉóîÂ$––ÊóîÂ$ï,w”çÝ…I®,gªÁTƒ©S ¤š[½PŽTs«É+RÍ­^(Gª¹Õ åH5·z¡œ© S¦*LU™ª2Ueª©v¦Ú™jgªƒ©¦:˜ª1UcªÆT©:Su¦êL5˜j0Õ@ª¹Õ åH5·z‘¼"ÕÜê…r¤š[½HÞjnõB9S¦*LU˜ª2UÍy9Ÿ)L/–­^ÖÃÝ ­[ÇA;Ñ6ëöÆA£ì%?–qPÎz/^ýií¬ÖÉÏúã¯nÞþõô(§>/>{þë;1ÿßÎ󜖾œ!Ì—uµøü5Xeëú¡÷‘·ÈÜ[·U䙢 Ï3EI®,7”癢$––Ï?­ÝJ®çäy¦(É;Ëåy¦(É•å†òö›Ûã¿:^¿ÝÞµ²Z+ó¢$çD›gû/çDjQŠDEë¬L¼”‘A›u{ƒ"”ʽ°\X>X(ÆòÎr'yŠPŽTsPDòŠTsP„r¤šƒ"’7¤šƒ"”3UaªÂT…©*SU¦ªLU™jgª©v¦:˜ê`ªƒ©S5¦jLÕ˜ª3UgªÎTƒ©S ¤šƒ"”#Õ¡©æ åH5E$oH5E(gªÂT…© S¦ªLU™ª2ÕÎT;SíLu0ÕÁTSLÕ˜ª1UcªÎT©:S ¦L5˜j Õ¡©æ ˆä©æ åH5E(Gª9(B9S¦*LU˜ª2Õ™•ªuaÇ2(úiÖå (t½¿ÁvÝî Höî7ë È^މæ¾<~{{ùþñÑåýãNãÍħæµÃ|­;O÷¸~³J]jþæd•¼ä1<ÑwVmÇ>…åÂòÁò@ù¼Š@yg¹£|^E \YŽTód3”#Õ<Ù åH5O6C9RÍ“ÍHÞjžl†r¦*LU˜ª0UaªÊT•©*SíLµ3ÕÎTSLu0ÕÁT©S5¦êLÕ™ª3Õ`ªÁTƒ©RÍ“ÍPŽTód3’W¤š'›¡©æÉf(Gªy²Ê™ª0UaªÂT•©*SU¦Ú™jgª©v¦:˜ê`ªƒ©S5¦jLÕ™ª3UgªÎTƒ©S ¤š'›¡©æÉf$¯H5O6C9RÍ“ÍHÞjžl†r¦*LU˜ª0UeªËÉfµTÕó#˱fQKm`Õ³G›U?Í“~ýæ³?Îÿü²E á endstream endobj 1631 0 obj [ 1630 0 R 1632 0 R 1634 0 R 1635 0 R 1637 0 R 1638 0 R 1640 0 R 1641 0 R 1643 0 R 1644 0 R 1646 0 R 1647 0 R 1649 0 R 1650 0 R 1652 0 R 1653 0 R 1655 0 R 1656 0 R 1658 0 R 1659 0 R 1661 0 R 1662 0 R 1664 0 R 1665 0 R 1667 0 R 1668 0 R 1670 0 R 1671 0 R 1673 0 R 1674 0 R 1676 0 R 1677 0 R 1679 0 R 1680 0 R 1682 0 R 1683 0 R 1685 0 R 1686 0 R 1688 0 R 1689 0 R 1691 0 R 1692 0 R 1694 0 R 1695 0 R 1697 0 R 1698 0 R 1700 0 R 1701 0 R 1703 0 R 1704 0 R 1706 0 R 1707 0 R 1709 0 R 1710 0 R 1712 0 R 1713 0 R 1715 0 R 1716 0 R 1718 0 R 1719 0 R 1721 0 R 1722 0 R 1724 0 R 1725 0 R 1727 0 R 1728 0 R 1730 0 R 1731 0 R 1733 0 R 1734 0 R 1736 0 R 1737 0 R 1739 0 R 1740 0 R 1742 0 R 1743 0 R 1745 0 R 1746 0 R 1748 0 R 1749 0 R 1751 0 R 1752 0 R 1754 0 R 1755 0 R 1757 0 R 1758 0 R 1760 0 R 1761 0 R 1763 0 R 1764 0 R 1766 0 R 1767 0 R 1769 0 R 1770 0 R 1772 0 R 1773 0 R 1775 0 R 1776 0 R 1778 0 R 1779 0 R 1781 0 R 1782 0 R ] endobj 1628 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1631 0 R /Contents 1783 0 R >> endobj 1784 0 obj 17613 endobj 1786 0 obj << /Type /Annot /Subtype /Link /Rect [ 341.88 138.37 394.37 147.37 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 393 0 R /H /I >> endobj 1788 0 obj << /Length 1789 0 R /Filter /FlateDecode >> stream xœíësܶÀ¿ë¯ÀǤ##|“7ãÉŒËuœ—uiÚÆïwÇ) É“¢¤ýß € ¹’–][µ˜ÇˆÜ±‹Ý½ðLÿvf#‹þû„ýWÚfg¿ ™B¹ù²CXʸ‰ü¥¬¡tÉšˆK—KEëææˆ~>ËÏ,ôÍÙ/¿ÒF;daÝžYZçM7Wg?Rå~€Ý Z­VÂVÛQÄT¸8 Û }q™9èyÁ[·Ö³Ž¬n=´Èµ`‘…g_­Ï¾xá#ÛBë}Ÿ¶ícÏ£~V>Š°ë¬Ø?Zgè—Ï~(‹kRÖ ©>ÿ­ÿzv±£keùãÐÿBÌ“HúÀ÷,ù`¼—Òÿ=ì62*ÁŽO‡Á>JELÅOöA{és5?>]‡Õqg}Håæ`„ìAÛ‘dz€ûåÔúÀ^Ó)GÑÇ¡žð'¸ü‰Ã.EgôÆoLŠlY¶e…Ú­04²±ßJ˜à‰3npÓµ°Yë®)(ª\ji‡²Z;Àƒ†húmª}ºgÍ*å¡­y:@]¥ êìž5) ¸w„àÝÞ ³ŸÙc²íRJ‡jJ[<Ÿ}Va|¯Éçï⌠&´½bÙJé äYØ¢m-[½kÆã®°ß Þ6{´Îo*bØŽû W)¨Ú0Ä©^UÝZ4um9#2bPOÿqïyÉa+NìM|ëÜxNöñ)­ÓÃq†“Ùá¸^…lFënC§¹m†Ä$žhðÖ {‡¢ªÉ†ì·Ü5àî^X%ü¬Ùi0ªzaÇš}Æ4ÒM˜È£aU$‘ªm™\×I‘Ožlª¢vt©d5±)ß^_Л¢Ü ìfaf´~¬›vèľ#ft$·öiA_qqʲÝWTCÿ$3‡Þùíçr÷ؔڼ{ƒ@‡ˆ¬¢;4ÏoÝù¢u™5Ӥ΅B!è_[½E!¤ Ci‰‡=G®ÁýýDMˆzÜI¡#€Xk©wưI½N¹È2©V"&WOêËpÈOŽgc§-]¼Ðù¡-Uó<¥u!ŠŽ,nÚI%  §ÀƒpLÀ0è%Å^S™2¦U¢d˜d:ôµÁÞùq6 aV ¡ò‘HóU8Ýþ5q6ï6xÕ”7|—{T ºnö}w(©Ð©"»s.ýùÕåú=¿xùì}‹¢yb×ñ&®{¢"5—’’£›8=Qq޲$M“Šl‹|Wa´>Š5 0Çqs®~|‰¶E–Åùí‹’öJ»ïTÇiZÜV\UE—”(%7$eQuYÐËRJãÁÝT@ƒàÙvÈRa:tæ ~+gÔ —ÍM^à³™ÇÆ* Ú³ÒGƒÅÈHÆ>cô+x\Ö;»½¡d«øU`kÕ­éG¬÷‚öº+.ÐâE >peTbÉ’YJYÓ°ë˜_þ{Õ½”Ö^ËÍèuýP2cä´¹ÛÕ­ÞwsŒ¬VØÁÞûX1eR±#ß\ªcï¾"+)ßÏÃt†¡mCW¤äޏ|yq%}þü­_ýtþ^<{yuþC¯žŠ\o¾_2 ü ´âo/_¾¼¼k¸ÌqsØdÐÉÙöW9ëx“ÚÓúƒ~¢ß?šþß]~Ï¿-Ï“ê_¨ipUe|èw]J±X¸ÝÊ/[öG²eÛu9{–íúÿ÷vý}nÕ§2cÙª¢[õ÷¶MoÖ²¶K×âòü¤Íj%æWcC?Ó6Gh ÕùhÖÜ3ÜíÀäƒ}P»à¨:éÉgT¡ÔHT¨ê7õß:ÿ¶†ŒÏ@úºDÚ™ØÊVàXý–î68OŠ7l¯ñfŸ¤ã³’’4­°ˆ+µx:cL賎:=¨ºBMõä”3Ø¥>ç OS7–&]tÁ&R^Œç‚âAh`—«yP—§á¸‹)Çv©æ«t~àµnfmêiÕuSJ'é ²f’:ÍÌ›RT¥À©òá,Q˜L“ºÿažÌ©§f/D늷[RU(#õ± û®$„YAÆ:ÒbÍœHˆC͆B\ÕÐ?ÉÌ¡wC„ŠÇ±É ˜ÃæCæây&)„öo$Ä – COia¡rgŒ›Ôë494¨ö§ñ€£#†®ÂAà›Þ«9&™m°w~  C˜i¨|$ÔͺڵE gâ+R×I~PHl] ¦†Ìá+¯?_¤u·ÓŠ´êg“œ±gÑm’¦(¾)’¯çÆŠŽJRÑ*³;ÉQUdäö×Tº;mÉUׄìð4¾ìQ7Ÿ6ëNãòÀ!sœ#°DÍâßßTɽþl×l“‘ãß~õúst{$9Jjöð>)«QæÔŠ×ŸÑyI|X!þpRiF¹v]‹~‘#Á#“|[’¸"»×ŸŸÍvqIP^Ôãcô,­Šs”4ác8Zû$ΊS^3oÆ7q’r„¸-²ëSMJÍ$/PLÊHV”w¬·åÔµË á¼~פaù½­Ôî"b°Û=ÛìË`Àö%hsÀçÖ˜ìöj¼Zî´×wZBGÅö¡£bóYJªókØw¯º— \›±seš~(™1rÚ\Âöý½„í5;¸Ã{+¦ÌÁö|ðÍ¥:ölD츨e¹-gè±=£ã*­ @ywZ2]ºêq"[Eïî; w‡~£ƒÕÂÞö~/ö®¤ÏßøÞ’ÉÔXèûBßgÐwZf°½ZèûBߥ­Íø´$çÌß? øN÷°£3ÎpÔöþÈØ;ÛÊoNû=)Ž‘&Y2¼TáÝa»µÕG„ì;H·éFY†ÖŠ€íN]ÈðèÝd‡â1Èn2Æì°ùyc}žI d‡ý› ;ŒåƒìÐ@êAÚªÜã&õ:^ ªÝIÈ>ä¨Ù¡«ÀƒpPÀ0è¦w‡ìjŽI¦CgìhÃfE* u³|V"г!ûúH]f%Ù)k h±¿­äg©É!F›»šT fÝÆ9çß Þj £ŸV6"ßiòÍi?¯âÓ¬ýk­hΑíDç |Ÿ#ßvè­åP!;Ì-´gŒÊ_§´5!mÂDZцkÔ»ÑÄüÔâuj 'ìsX1;ÿkbÅ^23΂^Š«y;VÜ\Ëç¬{Œ¬°b*ÑXÏfÅ¢cÁ‡Xq/í­ÄŠuýP2’K¬¸¿—X±f‡I>VL™Ãн¨cÅêØGX±x3œ{uùÏ ô4?e¤L¶âÐö ^ìÒµphY«(¢ c…{½"[ö§îÐËâ€~( ö]Jòƒ‰»tžêÝm‘côý‰öwÙë ¶Ú¯PœÞÆwôǦ(ù;=¦QqUÇe}ºÆèY~‡ úH‰Èï[Âw¨ª‹ëª}#‡(õíDú10@¼¹kÉî9G’ŸˆxÕG£ íA?·­Áb~nW§×ì‘õÇ_`Bͼ¦JöÔ–;`±ÝžÊ £‹VÒrïSœ¦Ôq1ãÒÔöé3ÒIÎÎS§¤f¿ÍÎÞvB­©IFòºB9‰›?¨D¨?T'£Ûc²=¢["Îw³E÷ªîrÙº@;v•'ü~¤˜oò¢Ìâ´É‰âV µœwöšÌ5ñôÐAí‘a Â+®æ@îxzs-€Ñ™Páé‘7pöy6OókØw¯º— Ž ›Ñ!êú¡dÆÈis‰§÷÷O×ìàï}¬˜2‡§óÁ7—êØGxzd)g¯×Ò—oç,_7„¿'è6©4CåܟשÙ8­C°‚×}ŒøBý lù±ìõÅß×ͱìÊDÚ}Z`w!í i¿iWÒg!í io‘Çdj,¤}!í3H»ï„ØvÒþ˜I{M~¯wü—ñ¹HN”…­l}ø/h'™á˜/\ý‘qõöXܵ¼ÊÉ-bµÕò&HÃì>{ñ¥û1»g·{(ˆÚ׎/Ú2åž-›ädNÛÏ€°<‚2U÷5ŸP­àrѧ‰”Ãp|0RÞZ’´~î/ ëaSóð­á®!>ä€BÀ…/À3íX€=ÜïN¼AšHV¶þÔÍ2ÇJµn2XrçƒÑj¨ž/b5bNÃÏ33^]&;"¿[šä‡$ïŽüv‘×’ðK€Ú†‘xWIÅL³~úÍo+ñœG ’…ìoÒÞ~r±ž&àO¹Š<ÎÈ—èêûŸ^}}žVÅ©Ü2ÖÌ€ü—zÍ5Ž=ÐaûìÎ)›¢> 2,;„µ‚›fã`~h{Áè2ß%7É]h‰„!ï4©˜¿…g=NÀ¾¬TEºJ½u@÷ŦÖk4ˆìºç\›j±ÙîÉv¦µ¸të˜[oñuMJ<=–-϶l?pTô`ô¢(·ì×ßÄå&>ôu‘¦d+mé”ïK`{ o\xã½x#Ì6.°±ÝŽçÅBÒ8ƒ4ÒYû h”ZFí¼Ð^ÝAÞ‡@vêß#ŒÐ[Â…ò”×IFðaû&Ééªé&NÇ'))‡-u# Î…‡Ä'#uæÑ zOt22`EhÐxÞÜ‹ZÊ<öAPKq0í ¶N[}ëÔü%´ÿ\1î endstream endobj 1787 0 obj [ 1786 0 R ] endobj 1785 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1787 0 R /Contents 1788 0 R >> endobj 1789 0 obj 3715 endobj 1791 0 obj << /Length 1792 0 R /Filter /FlateDecode >> stream xœí]m“Û¶þ®_ñ'{Ƈðýe¦íŒß’¦õÔM}|H2Š‚Nl(R&©\ôï»A@‰W_ì«q<¬ÀÝÅîbx„£?®\äÀŸ+ú#N=”ïW9ÍE±‡üˆ“¹1Žœíï$a‚J:pÒ¤CxÓgT>ºïìЫjå ïV?ýƒ6ÈÁ!º]9óžÍûÕ <Œ°%išr]=ì& áãù}óýÞC¯k6zО2r¾¸ö²F¾ë=t³zy½úæÛ¹ºÞŽ!àº!°s”†(Á¾—Òÿ6Õ}Ò±Ò‹çf˜0èãùÙžÚM©F®Azv`¬ãª½~>~ŠÃp×èјõÖTÈò8fƒQ$7 ªƒÑ‰—¸ª²5oêÒ.Ä £œñãÑ Ë‚ÃUŒ8ªxçØxM¶Ù±ìŒááùŽã‹Ñáù NcZÑD7öún?%J ø€;ˆÌ]ŽUÌÞ¤ï2ÓHˆ>׊ÛYÓsF=Y4—+3Öô› #]… qdõ@©Í›âÐue.ž´T"”œ>#öé;zŸ”Áí7f³ÚŸc3”A]œP¥“éèzÊÈ%öP%€„ñIªôÂáó){Až mÆ~F I÷¬"{oT/-l1˜ÌY¨’0!(ñ×voI žteW:üáÀ›æà±Á‰s x>TÙUÒÖQ{³n›p½d"gN´â±iö[Æ&;Áþ{Cêbyêê–YJcÁ“Δܛ¤4‰ [JzPž“¤˜l%Eß¹4iRf¢DØDuÙÖ3ú.÷óÌ9Z~ÆÓlÇ¿ÞÏó§ –5§¾ë]Ñ¢–t]QÝ mÝä¤E7Y³ÎnÊë²$9M¨ˆdùuÅž ŒŽFÕq¿& ª·¨!-”oFlê[T7(‡±¤ï¬ÿÏ·(k€YC²Žl0ºÞñ½ ¤–ç)jmú]ÁsôÄy‚ö$«ZTÕ&Å@{¦õ­O¨¹‡¦¾i²=5¬¸nLc =(`°æfr}Z”‚(¤%ÇÅLmiÎ/QHdO?£ X«QÀh}–s‡÷!ݾ§‘«¥µžßèEC[d•H’$Rb`€âL)‹„Ò¡±`ÌÚ2ïQôH…¤ëâé0˜¢._¦,˜9 ÷EŠä¾(.S±\fðÑÆŠ*{|ò}S»X)J”¥J Œý>ß¿¹F¯_\¿xùâýôÝ+ô'zÒ9ú-+ä/Ò&Cpõ!Û*lSØw$‰ãx­ÛWÍéÐ!ha{O]­<ìÁb±\³uI€ŽÃ£ §úÖÞÛw/GäFM~Œ{N\çôû;£+ácéÿ߇ôû< _ {BÿJOè÷v:ï+TèãT©PZåPs1Wÿ|>žác(@Z•ЪiQõ1³5”JI\8G•_*?gNq‡rQãY^ØMØwPä| Ò' Åt q•N75ÊzÝž¯FÓPäʹ[IÁ—ãdމ^lÔª ÊŠ5Ñ+‘¥^j .ÓÄ áöYòI4œÅ‚²‚Âûéïo³²5oC†Rcöû$Õ«ys¹ç56†B¢UœAœ¨$‚"ò°¦’Z]–UUljçTº9LT%.ÆÉœ¸?0P–¤ R±DA!€z‹fÓEúÆÎ3_õ…µi‚[霠¨ eSV¢k|ø|Ê~ê;£†,CF}åá&õΡ¾ËTRP_™ÿ,ê+ùò³Á¾²%Fª¬®£ôæý6áz 4‹V]f‚} †z ¸¯l*éAyR’b²™>÷Ucl¢ºlì}—;zf ‹<- ?çjŽûºÜÑ‹Aßï·TÚ#GE‹ºæHž3j^W©º–æUÚÇ4¹¢mQ:Žç]²AY‹nIY.Z=šV/àø 4¤‘gÐo-€a¤Zû¶Œv )UœÂš@Q€ÎEB9¸ÊsÐÕ´ŽTpN€V]¾LY1O€Ö±?Z5=˜ÁG+ª,ZÙäÌu1Ðê{ ÐÚÑï D0æYUÕZöÂmÑíPV¡÷?¼Em—ud±)•úáªB§žª6C§ F¯ŠÃŽ4èïäD¿>@oDT¿ÎºlI{PeµyA¢Q-ˆjAÔ… ª>Dµ êp²½Dµ êÕƒ}–ú5ŸQ#ˆú+9/FÓH±êסVuuBq»…P-„:zü ~ЩìK žNM†²ÐéWz‰Ï}‡û²å=xô+²JBE7?²°¨…E ,êlE"ÇõÝD…ESéFéoņÜõ#ÇÞ-µ°èÿ ‹*ácaQ ‹§Õ‹¡aaQ ‹.€Eý8²wK-,zè>øöæ|Eš†‹ÅF6:ãv‹ZlTÃFýÔÿ²×JíËîíe²/íÛÎ`£&C=lÔ¾Nà>_'à§Á]¯•Rlt{,ËÓÕÇcVÛ‚lP^fm‹ªlO†û¤,±ÒßÑ?ìNhØ‹Ñ×ÈhWAß¿CÇXPŒ•>Èß €Z’›¢;]~‹€àn_`_ði/ø#ÀØ †”jc#GÜQ} 9¬¥’êFjHÕšçM~/Ú©…t5~~Z`‚Ç~ÑIm‰/ýÚEt¶EÓvÚ—.a’*óœT3¥\œ §ûlCD§wXßÜdYKFXŸŒã²Ã¡äYìçgÏGrY‡[Ò\mȶ¨Èf^ÖA¼ŽWJ0£ôHQIì‹qX«L‚f£ÈqÑuÒçãþM*ÿþ×[4ê€u^h^ìÕÑÓ¿ÂB{ýRt™z}“}ƒ6tز:ï „Þm¡ \77‚œÏf£ò{Gš*+AŽÏžÒ½o‹´0žð/ï>´ùŽì³?Ó×Í<Ÿîm':ë‘ ¤Ý¾ºÞÀøT6˜ð9ª¡ÕÜàYé]àŽ 8hz¢ZÁúCyÝ4à·òDmÁ¿©ÁñÌ:E×¢õ±(»+pø®ýXnÖ¨¨ ‡U¹ô;´8ÿªàÿê endstream endobj 1790 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1791 0 R >> endobj 1792 0 obj 2700 endobj 1794 0 obj << /Length 1795 0 R /Filter /FlateDecode >> stream xœí[Q“Ó6~ϯطÂL–ÇöcJ sÓ)\:}æÆg+Ç>lçŽüû®dÙ–e9 L g¸h³Þ]í~·+}“û¸ àà×ñÍÄ»ÅG%£à3pWJä­€údå°µ¼2¡8x)TÔKWJ•v³ØÂß‹|áÀo‹·ïQ)‡xp¿pFÆ3—‹×èÜ[w„a¨be„pá’¾ˆwðôåŽÁóBj·Ñ CÎ7^È¥ì;ˆÈ›Å³õâé ¨ëMJ=²\bžW¡qY(þ0Xïàí£?Ëâ–—uÊ«ÇïaýjñëZí®yTà‡á_ŸH Þð–Îð `¼—â¿%qJópâ­LÕT}o´/=™£æûdN”)ía³B2Y_Óùt1|ñ uH0¨[2-ýCh}å¬ )|;=‡†+ ¥Ú› 4ì ñˆ†ŽãP¿ÙØå¡ªùL”‰üX’〒ÐÅç—6~ÇðÄE4¹ðhÃïµUÕ˜î·M•\[í+žhË냶øý€O_¾¾ šl½åŸ´VñZ[¹¶¨·ºâ«è.Ò–q±ÛE¹H–æº~QNGêÞ4YÔòæQ#oMâ †¨rx÷èÝcØ”ÅDp˜‰ò§ 0g7e´#€;=€Ø^^ÔpeiQ½¹ &.òœÇuŠ[ì“Lš ž¾ðQ:,£‰yˆï¥×„³Ž®3ŽzdE \77¸ xžù}Q~è°ßCÏ#>6«€`Ë’ØÂHhqá5ÐA°9Ž?Zªˆ€ Ø6!xÂŽÿ`4¦ÕÏÆÈ\3¸Lù@‘?pKWÄÈÈ?Eï§-"@©LjKÜàØ¥’X}vÏN9Ódv”U­0Zvû(¦ó,Æ.üÉÖâ;ƒè™ž˜bÞ²ÔkÓ¤¡ˆ†èƒgélh¸_sÕì[‘× >9#cM& ±®'÷ß»TÉ3c°ð”UÓ÷¨’co'ð¢Ð`õÓ¿Ý'ä<`P#‰}ˆŸ…‹ç|í³Ú æ2âû'‘Á\Tðʼn©[ú¬Y6Û’¥RølpèÖut˜nv¶8ÔR¦E{ [«¨TŽGqN„§»V~uãø&!4á†ì®¾Uq™ÞŠ‘g’OÔÁƒµ1ŸFsÃìÄ*üãÝxÂŽeüŒfÄÈ¡9Κ=v³–áC<­…wÅ1}ú§†ÏQ‡%UPåŠx$Ú¼uùm9>Æè€b9ŸRjÜŸ¶ÕÇ,¹&%Ç3Ò&½¹Êš³ÍÑÁdঠBïãF;> š)#ãÁcNÓ—?r}rêXMŽÇŽ¥~#wÇÒa`—®2€Æq8Ôì ž…ºÜÛ$jêL”}ÐöÍz~áGf,Ce4}ZwÝTé$]O…dNšó¦Šã p¦ÜŽ3ˆ“0™r÷?â䜖ÑtŠ})®@â*¶i¯Ap¬y¸râ0ÖCÈÑ'ÅÒœ8€J6`BÇÌ´ ¿³°½–è"™=ñDÿšyJW8gá0$¹žjËÊŽÅvVÒ=ìLß]A~&8*'\÷¡u`å“«AåpÚ>ȆGö~}¢STí¤í¦’6Ïý =õºêôö»i+£Æ\ÌoM[RÂý ÛuØ7‹3R02¡ÚÄPÜè Ž·š@åB{¦Ý‹L‡ßT3³9ï-[£ló9kºVft'‹54n­VsZe®ªÕd§rŒNuÉëºéRiŠoSÐ6QVqˆîŠ4© =ÿéj­jo·tQÜ,_AQޏ,ÄÔ0Œ¢»ˆìë4#Š9"ðr#tÁ$¯$uÅ?¥U-8+ŒX 䟵Ð"É`ÕÑԽ͢˜­Ó¶W“Ê¢>v^Áeùm8=—Ŭù§¤¤šb±hàg¦±fëËh,>35óXÝâ4f"k&²Î ²˜ƒ-v&²4‘UãA&¹&Q–÷W›}–]ÝFõöèd2`3óX?%öÇÆÎDÝg"ëY¢eàuJ܆6)þ—±¼bUÓ£A™ÀúÖ–^ŽI`Ù0Xß'Åh¨jõßX‚yÞ©@keU±/cŽ¢®9 nÎ(r¡ Ñ]”fRKŽ*Ï4÷´ŸQ';Vê4¡•Dè*ª8$iÉãº( >–ÖäþºŠ²‰OdÉyBà’sÉziœÄÛè¶æå9L[…$`^¾o2Y.ù!µû<¶p³x¦3™5“Y_Ffð™É¬™Ìên§ 1“Y3™u™úd5“YšÌRŸÊÚñz[$WqUÕU޳É~3í†Ó93ŸõcðYy‘§³ìeŸé¬Fg©{Vs’=c¢_H&Ë¥Ë53“õ­™,½’ɲ%`f²¾O&Ë¥žªÕÙLÖZ0Xu•sž´ •ø-Äû´ÞJjHràÝ£4³}"¨¯û4Kâ¨Lªw¡Ø š>ÕG¹0#5rS”Pû:ÍÛÖwŒÆ–¤Æ¤ÑªŽê4†æÌUõlÕåë x™ßP÷²m£­Ä׿{I| endstream endobj 1793 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1794 0 R >> endobj 1795 0 obj 1912 endobj 1797 0 obj << /Type /Annot /Subtype /Link /Rect [ 148.103 476.352 273.106 485.352 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 117 0 R /H /I >> endobj 1799 0 obj << /Length 1800 0 R /Filter /FlateDecode >> stream xœÍZÝ“Û6÷_ÁÉôas·æRßÒ¾5É¥m¦½i÷úÐôA–äµz²¤H²7ûßHðK”×u/3½ÛdÇH?‚ÒûiåÿÖü#É|RVŸ$Ï#‰O‚X²¢˜x YJDi”’†œ5ùÙ WŽFbO~Yµ+F¾Yýú * £y\±…póaõ”G1 â4Ë2‰Õ§^šr¡QÈÝwŸ¼éÄh…ž bÿsô6¢Àóÿ/qLbÏÅ®ûð?¡bëgQÈæ=–[h¾áÂoHä‡ú(ç]Ü ùÉ;T3+ÃÏgW"EY“]»Š%þ•ÊyX½Ú¬îÞFÄcd³3Q”ð‰£©ŸñŸlä×? ^þF6ïVÿØ,â/¶Úb#¹n†ò˜—ÅäÚâ{³µ §Êâˆ1æE¸°×û¼ŸªG"ùö©¯†ï¿'ÿ¬¦Çnø7ù¾§ª­†×nÉ ê 9Ê@o>Tà †~|‰ƒ¹…ïÞ†Ü:¡"ÎhæA6H9§Þ’_ª­jæmIx»©&”w÷Ö;'Ëó<' IåŠÞUI6Ýqë[²ÙWä[¾¤7Õ©jºþPµùf莽%•¹2Ÿ¬.ô”ùÕOÕ©뮽'aÆòÕ ^©,`YË)¯»þi¨öyIÖ÷Ϙ¿öxŒâ¨Š@ÈTÓ?Vá¹RͪGÝ|òv²fOn–°kC½=N•éÝ[SË®8 ;(Æc=í»£¡óöÉ´ðŽ|Ë%ÇÑ|ÉǶOzI‚R è¬LÖ2jªÛÄ÷éÍ+M6uQµcE5ã벬9¼Ñ¬Þ¶²j£ÇØH*ëžÕ« ÛOÏò—Y(%óåƒxËôÂäÚÔÜĤˆ2µ1ëHÐlš Ì3I·s(3,õ§Ù\?w­5K× »÷üûˆýyŒ©xœgž¼Ôñ|òCâÌ4 Q¨“0ªIf† “ФÎüšoD y<® 0‹Ø äÔ­nâV`ÛYdSù(s©àÙY°†‚-ð’3³~:¶mÝ>èÉ<Ѩöϣݣҡ#ÞË21ˆ ã? vCH½KÓ LÈ·šÑÊd¬èFíˆæ|¼UîÕ¼~èNui,[tm[S}ª§'cúÎôçSÞtËLïCb›CÝ Ý<}·«îÚïþõmE5ŽÕH1㪃Ä`}ß Ùvu E†‡FLÔó²@lUÉ\4v-e”%° ,“~¯µáÙ¡æžqÒ€ÁZC8Õƒ §nd^ôgøÍŒ@¿TT?T°^™¯%ï1²(‘Õ1h/SœÜj—`ìm>Úòqíñmù,˜]f'[y+¥"uºÒž~„º°Ð®êjÊ{qʨ±kÔ0L—fÝŸšûKûàEó Ew8ÛºôF™ôâ©+º†ÖÑ"±ëš¦{”†FVõ9?ô5÷Û“=™+•VVÒCŒ`i&y6Ùì—5|¼r°8 À¶ZD]åùÌB!‰îòc3AŒk÷rvuÛÙæð͇§rKÿöB‡Ð·p€ˆ^òó:çILòâs¹}AuMËhz^ÂKÍ,ñ£0#â,AéŽAü“0áåÉP‘¡k*Õ Hi&º$„ÂÎæ4œc hÈLž®}Õ©ä”ÀR>Ø(šËWu»tõê‘HàœXA›1®Ã%úK%¾£eÈt.ÆÊm±Àc3®±Œ÷#©Âh•,ÇÕ­ÐXålŒ‹í¡8¦‘×2úÖ•·ò„² ŽG} ÂÏïù)'ë¢'”Þ5õöŽçðïßój©*IŒ.ŠÙŸ¬×*<(±qÏc‚³·< € ž)7Y2yªáµZ © *ç[·MdFǦ„ÀsgYÓ+vq†*òÖ[«rriM’™H}>Ž* †Ê-ˆbx%¦¥ïgÆJ˜†¡Î‰sPG|ÌóügsNV 7OÝÑ2™ 1öUQïž CF>}ŽRXv6a—JRBûŒ«¨BFSËÒÉïfëÑ^ÍXÝ>_:ó:¶H¹möù©"ü1C”?R«Ïp᯷î褞È·ñ¦$Ýrr‚ò¨$ÖÚ¹ k²RFü½—{ÓÙ¬Äûì×á`X2ÄŒ ôr›¾&ä`|Ì:$ËÉgðD Í8+Ux€Î×RÈUã;zf˜L‡ÊJöPn‘"›q‰`|¤ £U²æYi‰ÆÞ0w\t×d¥™u$Ë5Î¥¬×ò(Œ2ñ¥ÊLÜåGrx²¢¼”­’ˆF~¥q*ßoñL_¯÷UÓU’(DÆ »øK¿wÀºÉ·¡ºp¹*ÄR(ùñ‘>biL#ì×{kXÒ_Œ Ü2›¾Æ@`,tH–ãÎgðdpo–*µ* ¤ˆÙK•àÀ.Š•(IkumÃk6ÏGÝù(*+$ñˆí£¼"%+'$´‘6Ʀ¶1’ÖµJùÜ&û}‡¶Gzkíà÷˜7láD£`»hjüêDŽ2+Ð&—¨ób¥¡ˆU£D2-M—1Çt²v{Iâ€×ˆm7鶸­bSzxýTÔ4£r«Ývº9‹½&l³QÍÅ'IlëðÑ ô$>( )6Dj7 y!/¾ã’˜«­é›ÏŸö¹YsΟB—õqÌ|ÇnïÞ¼zMpŸF~D˯È©ÎEÐã¾TÅëè¼;’È|„2y<€&òÀŸõófÝî4„£”S¸ÛŽÜ] ÒçÕ¸üê*öqg©Ê bà .JýáØªf®[ÒˆÖåV¯ú&/*E¢/Šæ!¯µ€¢ÉE àUFx¥;\ÛVPfª5ļ-;w}ÓÑзÝIò¹×•¦¯ï¯(€â ¢™fÉ3ï±_¼ OsK†8Pgô§;Ç ’5/6Îá SʼˆÿéÄ&4š1®$‹…ßÑ3Ãd:dÉ1Ê-²@d3®1ŒOb©BiÕ¬Yt½aîþ¸è®)€fÖ‘,×8  Šƒ˜ÌO‚ÿöéCÿE‡õ×3ïWÿQ¾û endstream endobj 1798 0 obj [ 1797 0 R ] endobj 1796 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1798 0 R /Contents 1799 0 R >> endobj 1800 0 obj 2725 endobj 577 0 obj << /Type /Action /S /GoTo /D [1801 0 R /XYZ 72.0 720.0 null] >> endobj 741 0 obj << /Type /Action /S /GoTo /D [1801 0 R /XYZ 72.0 576.62 null] >> endobj 744 0 obj << /Type /Action /S /GoTo /D [1801 0 R /XYZ 72.0 376.92 null] >> endobj 1802 0 obj << /Type /Annot /Subtype /Link /Rect [ 506.585 514.08 539.999 523.08 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1316 0 R /H /I >> endobj 1804 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 502.08 126.71 511.08 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1316 0 R /H /I >> endobj 1805 0 obj << /Type /Action /S /GoTo /D [1796 0 R /XYZ 72.0 720.0 null] >> endobj 1806 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.8 502.08 357.48 511.08 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1805 0 R /H /I >> endobj 1807 0 obj << /Length 1808 0 R /Filter /FlateDecode >> stream xœÍ]sÜ6îÝ¿‚}pæÖª>VÚUÞœÄiÜIâÖÙNg®éÜÐ׫«VÚHZ;î¯??$­Ó{ê]¾ €$¾ •/g‘á÷…þ±ÊcQìϾ0-«X$“ÒLD« ×b/Y§kQë‰#POa0A*Ï&d'~=kÎBñÃÙo¿Ã¤R„A*ÏÂsbóéìgžfA’­óÃ(¼€bKAU B*ÿIuûª×R-©ê-xßÉfðV­˪ºêî8(7ºó––mqD?Âc5ìÚ£Ãeóäà¶E ÅÜæ(Ø|lJØÃ"IàDƒPå`0¦·X»=9IoÔ›W­«B5½ ,á²,+­‰¬-éà;‰H•“ãœÄÂÚgåZÄCóÆ·ר~àï9n­,ÚNg;Çö‚ü¦U"?\ð‡ñÃ\$Ÿ( £ë"\_„pX×Qü2 ÿQšS4>úhFëéÑÌÀª*dlrÎ̓ê*õèÅY²‚…y¬ø n(Þ¢ÈFÞ+}'ÓÒ8ˆC]f¡³ñˆé¼e°:9Ïĸö'Z<^ÅPÈ¡F…I˜~S$§&¾{‚T§óÔG5ÀÆþ!ÞC¢QêzñùüP€>¿˜p‹¡’å 7¿)6^§ÁòäD6lž|â$ ò•.á1ç‰Ëƒì°ˆDYDâ|Ûµ{í‹ÚËÞ£˜à# ÜVuNGzáQ”ÄCmPëG‚ƒ ëöÞ£ìFùtuû¬·7ï¯fòûÀ#A7Ñ«ùŸc§æžZ®'ž*ÚºÖÇ * ÆtÍ(ÔÒá¦CÉfadºã‰—ËÌuRh»êOª-†É,aGpô–+åúÌ9—ÀéqÅn'ìò—Í»›Ûë^n®o>:2û™¾Ý+‡Ù´Î8vEN Ω•Ø'0Ìy„§¹Xâ™Ýhæ|²pb Ù;˜ý$t©‘U`¿QÕãᄪ1[`E–ÐÁ¦š‡ªk¬é:Ú2Á ç¢áFf»è ŒvH+çA&ιWÊi–~h9ÉN9–`v !^Ùú«©L»hÚn ·€ý Œ·‚ëAsï±l=•¿¥ÇCå ÿøæÕëÅÜWùrâ+­0V=íL¯¶´íý ör€èÔ³ Ü„-µ]¾ihÑLTYnéL›qódL…ƒ±bS4U—0ê¤ .:%¹ 'vycoòúöêrsåp“‹ë`¤ƒjáIÚ>Ãj¬zæ¤z ˆ¶÷õ«< ËöÍÿÛz£S2ÕWYLË&xzà±6q¦Ï"iCð‘5!Lz#&*3Jƒã¨D¢‹JD_Ñm…el=x8-»i½ß-<µq°s áž[Nhû¼¹pV (¾>*äämëܧÐÖ}J]0·‹„®÷úÖDN `ƒÖÌž;ÙÛcqâ$üWw\§Qr2uiÅž¿¯Ÿ¸$$pIX¦˜†#âx­]¯Ÿ.Îïu;#ë…Á¹#L•A>7»Œh_A‹ûd0w ¦ !†[A‹°–L8ç› Â¢àåíÁ"X°¦3¨E!pCdWÎÓÑ:Ù±cÞµpí¨ éÊʷƤ÷UTt\«©ð:9¸euÝ>ú,-Œ¹Œ_@ÕAÛ7! îš4l{&\àµCÓ‰²îÛg”05ß7eî®Gþ·w®‚F±®*¬}ì•:BüjDé-“|Ü–QçÙØ+Ñ„pŽaj —ÅÒîžžQÍÄÄÂW¢âNѯk­¶ž˜Êƒù:It}×ÓåÒÄÜ—:i|©.Pag²Rrs¤l”*ÁH ˜Tt§_ÇZvØYi¸'‚ÚË º/è9Mø¶’Û"„,%XZˆsì”lºhóö“»‡%ÿT]ëè÷m瘵|…' Í^XôP6¤<ÒUU­î•ÿìò 3Ã.÷ó‹ÀRœÍ|œþÊæ¹¡‹ûQ1i[¢@\’`yPs–Âs¸Ýî@7Ð>£hŸ³ëÄ®£` ¥nå|7d+ œÎ>áê«n¡K‹c…%¢Ÿ`ˆž‹<^Xü ;Á§ù?R.4Ì!Ñ—Çâ´<ñ2‚‹N`)7°9UYèÉÍwreïsVMéñÕÉtî›<9í¨õ£´¨ÑÇöX—¡ÂL·@ß)Ù.bÏö®mMàTÈ]¹^o!û†2œ¢™Ý¿‘>zY:©úÝ<>Ó0øaøR»Æ}øÁp6a¾Ê#ìݲKÜx“‹ö‚B¬)‘*‚¦0!ÂV"lœA œ7ïT¬=œúBhžÏœB¿r·oL™;D9Dò¶^–%º±&¥ 6Zói·pÛJí&ÁMë`ª‹²VÞR“ê,'éég^Oï¡Ñl»Á[¾m½Åø®ÎáF”QF4"<Œ×G†ÍÝwñ»Êªƒ™õf60÷N ú™ XÓÕË”*Ø`TÊKazؼ_èÖñFK`•2 ß\™4 ô{Ø:Mì«6=A„ú¥Ç”mGQÛíèQ‰TV{GôÚ6"èí_8T×ÿO¿¼zý:p„ËÚ[;zöqä|ð”| ˆŸÃµ_<éØ„Ì½;8öJ!î|übt§Ü©}û`ïŸK÷&˜ðg)E·:B7:º·TŸ™ÄŸ¢±IÌÝ|^ãᾯî_E •åg:sjk_èáPWª?ÍG’Ó9ñÖæ;k•Nœ… ’‚Uˆ`Óž–òÏÁ{ò!xÇ™¯¤oHÂRÆ`oAYª/G9¸•ô9A>Kvª'¬¹§  ¼i› Yî=+ôSÄÂ·É Ñ~8Ô~ÝYÙÍ;á²õjâ2Ô3N݃Á‡NQ [.'ù ‹7¡jààTƒOBsè™Þ§(BZ+a_õ[oÕB”]{Àf@_}ðË;b÷Ÿi~>ûiC‚— endstream endobj 1803 0 obj [ 1802 0 R 1804 0 R 1806 0 R ] endobj 1801 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1803 0 R /Contents 1807 0 R >> endobj 1808 0 obj 3002 endobj 1516 0 obj << /Type /Action /S /GoTo /D [1809 0 R /XYZ 72.0 720.0 null] >> endobj 1519 0 obj << /Type /Action /S /GoTo /D [1809 0 R /XYZ 72.0 596.268 null] >> endobj 1522 0 obj << /Type /Action /S /GoTo /D [1809 0 R /XYZ 72.0 532.536 null] >> endobj 1525 0 obj << /Type /Action /S /GoTo /D [1809 0 R /XYZ 72.0 182.01 null] >> endobj 1810 0 obj << /Type /Annot /Subtype /Link /Rect [ 344.838 445.638 506.231 454.638 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1805 0 R /H /I >> endobj 1812 0 obj << /Type /Annot /Subtype /Link /Rect [ 443.654 411.372 539.998 420.372 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 908 0 R /H /I >> endobj 1813 0 obj << /Type /Annot /Subtype /Link /Rect [ 370.89 365.106 423.38 374.106 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 393 0 R /H /I >> endobj 1814 0 obj << /Type /Annot /Subtype /Link /Rect [ 233.14 286.308 299.52 295.308 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 577 0 R /H /I >> endobj 1815 0 obj << /Length 1816 0 R /Filter /FlateDecode >> stream xœÍÙ’·í}¿‚å—HU»í¾‡<È^9‘,'qvª””åJõtsfhõ1ÛÇ®æïh’}Ì&zq"­j @Ùz¼ñ˜ ïä¯$óYQß<Îc‰Ï‚˜PQ̼ĉݔՌ€4JY% gCIBÃ@a‰ûxÓܸìO7¿ü D%sˆ=߸+æÈæáægÅN§Y–‘®¾ã¥©81 Šš}û®öÙ}«¨'í%#÷®½­Qàùÿ¹ìxóÝîæÛ"æ¹lw0.xN€™ã d©ø™üã³]Í~yõpé^³Ÿò&?òš7Ãë_ÙîýÍÛíQ1P^äÃOâ(WšMD¡;Ÿ±ÜLã þ…N€8À8~›‘S,ý–Ó0R–ÂßW-C¬¬ÅËsR&û=…¿p$r¡ç:éì0|7´Ì?w°ßÙj«ƒ”²õ~æÅ³ýPÐ&°—$ÀÍ|há{–7%{ÿ#«ÚãQ4GÜÞ†A\$N’Å®ë…ÄàÏ—3ï~þÀ^KsùìU^õ­úñ|n»¡×ˆJÉÓ´ wKù•ÔÃш݉žymþÑ !ÑÚ®ÎÑ67œr‹ÀhrÎûžñCk­àÇwM^ÙªÝ^g‡–³ìf {)9wiä$ üÍœ0´qƒ8t°Ûç¶ûÜ; ÖèùÁåE0\΢ȫêbPEÛÄqì”׎C/JkÝt¶sÑ3m Pó¾‡ìÔ¯L{ ˆ¦¨F”“dN:œ€~èÈsê«rïÀÏ7{h«ª}Fí³¿\a86âq´`a-úô*7D‹§¼Ë 8ž¥bŸ^L{¸"²Ì‡|Ÿ÷³-*/$èÈÞ僭>¬_Y. ÀrkL©‡l|Ë Ä`Á…yÃöœÁ©5ƒ8`(–³z¬q§µèy÷;3À圕œ,vÜØƒÒÆ(çò¤Às2½1J~È·A`Ô`y/"´gÔ)·x÷¾ú?!N-ж.ý­A[I†0ÚgšŠþë”l±2†ç¦ kìù€ŽgÝ_µgyvbzwÐÃK;êqÙêaÓzüœ7°¶†ˆÁ,Ò›4“'3FÓãØla½×ÛMÅÀÌcUjÐäZJ¯Zµ•|wa¥ βbçNšg€X¤’-kHÍ'Ëiœmp¡`ï8îý_´±? ¬ð«uÉ|è˜\×Mƒ© Ø~Çxó$º¶‘”31Ûª’!´l)¤¬0©Ãúëtôì§¶CÛ½\,½D¦¾Ðuã ¢ÀR¾çË€'–n­ñG¾_N‹¦ò¦à#c_{k;Ê-ˆxÃÉ@S@+Àœ—^­;½¨ÀJhwÇÌî¦#Æž[0Ô˜+rà8^HÓ­ „— 3ɾ– 8±/¼åf`Sƒj}{Û=w²6—ê‡jƒÌ"eZ”² öã¾QªyÜ ªábóåzYì±îˆþ.Îч¶Éóᔤ¨ßý”Y@»N —‰ÙqÛ|h›22y˜&«¶É÷dùļˆcÙ4½xâÓ“8ð| ì‡ˆç“(NÂòcQŸ+eå4?èa)Þa…Ɇ36i8.Z0ÅG4/ðz†Ä¹>pº¢¹9 ’ªì}¡”­ ”ŸÀ­3ó²T^¤ÔoIÍ÷š »•8BR@!ˆÑƒã±7dôwŽãw3è²Ë÷. ”e¶k+ W¢T÷F¸6Xú-ö#7“©ëùÉÆÆ®¯ !s¹²Á7–ÙÅF-ÿ ¨""üt•½‰ÙÍ'JTý§× Y¡Lºi Y7̾BÅ0?p³4‰¢—–‘÷l8C:ar“Ô£Ù–3¬¨þ© àpuòDºÑpçfˆåÏÀv¾D 6ôD=´gkædñ´[BÄðæ8—ªÜˆZ– ïó'[1Èr¢0ðal0½Ú«±ç$öÅ«mfBÖæ Üxa¾¢‚Î9NØ—eÊóÏPi xèÚÚš4ÃJ@ ¦Š”a0ZË&=Â>eâ!»|ÇÀ<I‘Z<…y3EâĹ5ãï¥þÜš­‚ÅwaªxYæ%fyaYèD‘‹In½¢ðî]óÔ~¶Íòw(càËŒ)ÏÃK—çq->‚Ðu_>%¹tm6âcMEñáû::äÐĆ„òi`âBBvTøÓeÈÔ€>ž9Ñz nµh:”‰b[´ui]¬±#NÁºJèÙ´–˜ÞÕP [6ü…‰Š“¨ ÷Cç¯ú ÚŒÚ.×ÐàÈûÙo2YWvoÿ±c ìÐaÒ}•†‹¬¥NšÉrmH]’®ç×ÉwÐ>°’¸\‚•°Óô¿‘œȯ{ ¸~–*Rºò‡[¸¢’åZŸ:]pyStV:ì^ôŨžn €UÓp],qü(v=èîPB´¥ÇŠê#ôËŠ¹QçVA÷ß½‘}ç¨väØ^vüq²%‚»$#×”ŽUç²=mTËþ[»ï×Ú…^æD>ÜZº xC»5Åi¤®Á¨ÝÍ)RΧÊ8Bäëj Í ßž9vx5Ev\2» l-¹VãG+òzÿ„>a)ÄÛ\5«FS ÐûÊÔ#ùºJik½a+¸ÕÏm%[J¹'8ŸœÉ¢¦9À«éÅžãI_Ï‚lƒëšý†uZÉ–·­¨ÈÛ²È µ»!`ü áÜ í㢕­¼…|Á+Ì„;ñâ³§ÆÂà†?[²›÷)o޼\‹G‡CÜtqEÈ›; !öjÖ†md_:³ÍØ”à¹oFð š1|xàà Ÿ¯6Ž M‰4¢<“nÀ’h*˙ն"0RmS€ý–Œ˜|®—ÆË—ž—ϘÓ$²Á·bÄAWKöAØ>]ÄP)_Šå3]1!H'KªS2@hJ¶‰\wnu¨²Ðª“c_y,AæñhyMºóåÏÙ|B¡€/®U~™\‰ðSAÐS+Ê~6ms¬Úö|š’3áÈ´¢+Æš>y,Us,ܻᚢ§ö™ÓÃÒ$Z&„äAýa}eàÖ67\ÏpÝ{QI»€žPí éPùTWE|ÓZ¾ðîAÚ…èÊbýyjz_a÷øðÜ¿ðÚ¥1xèèe‘}ý¿ åg4ûé=z„AÐ |¢§8 ùvE^rcê¶·¸ózÏË}1®`Ìáx˜©iÕN"í®ÄÞ¢l®0=ÍT›î[z×ëÓÎÒ…)±ü«íÄ!¾¦«»ôŽ¡ÆôyBŠ„£?¨ ¥ÖᕌgìÃô¼5ølqk¦³ ü’‚ŽŽ”µ¤` ~]æl_t¹Øø¤å.ì#- µÊËRȤÙXç ò¶žÕ#œ´´àå:ÅòQŃ"xñ̉£`æÂÔ, &çÀ©éõXBS‹'¿=ðý6úV¡Fø©B ÉeåßÅÔЈQb(´‡ý¦@ý¦ ýõRélÞ1‘O§§0¬?©Æa¸0\?¡Ë“ß}ÕWÎ[ª7oy*t7 Cšß‹å³Åê-˜þ;Å¿d~Âr endstream endobj 1811 0 obj [ 1810 0 R 1812 0 R 1813 0 R 1814 0 R ] endobj 1809 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1811 0 R /Contents 1815 0 R >> endobj 1816 0 obj 2727 endobj 1818 0 obj << /Type /Action /S /GoTo /D [1625 0 R /XYZ 72.0 282.75 null] >> endobj 1819 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 709.5 281.915 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1818 0 R /H /I >> endobj 1821 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.699 709.5 539.798 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1818 0 R /H /I >> endobj 1822 0 obj << /Type /Action /S /GoTo /D [1625 0 R /XYZ 72.0 139.7 null] >> endobj 1823 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 697.5 281.915 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1822 0 R /H /I >> endobj 1824 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.699 697.5 539.798 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1822 0 R /H /I >> endobj 1825 0 obj << /Type /Action /S /GoTo /D [1785 0 R /XYZ 72.0 651.9 null] >> endobj 1826 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 685.5 244.953 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1825 0 R /H /I >> endobj 1827 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.527 685.5 539.731 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1825 0 R /H /I >> endobj 1828 0 obj << /Type /Action /S /GoTo /D [1785 0 R /XYZ 72.0 513.93 null] >> endobj 1829 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 673.5 244.953 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1828 0 R /H /I >> endobj 1830 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.527 673.5 539.731 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1828 0 R /H /I >> endobj 1831 0 obj << /Type /Action /S /GoTo /D [1785 0 R /XYZ 72.0 387.96 null] >> endobj 1832 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 661.5 204.719 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1831 0 R /H /I >> endobj 1833 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.544 661.5 539.863 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1831 0 R /H /I >> endobj 1834 0 obj << /Type /Action /S /GoTo /D [1785 0 R /XYZ 72.0 237.99 null] >> endobj 1835 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 649.5 247.398 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1834 0 R /H /I >> endobj 1836 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.598 649.5 539.795 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1834 0 R /H /I >> endobj 1837 0 obj << /Type /Action /S /GoTo /D [1785 0 R /XYZ 72.0 134.62 null] >> endobj 1838 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 637.5 213.533 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1837 0 R /H /I >> endobj 1839 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.569 637.5 539.863 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1837 0 R /H /I >> endobj 1840 0 obj << /Type /Action /S /GoTo /D [1790 0 R /XYZ 72.0 620.7 null] >> endobj 1841 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 625.5 205.272 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1840 0 R /H /I >> endobj 1842 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.511 625.5 539.829 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1840 0 R /H /I >> endobj 1843 0 obj << /Type /Action /S /GoTo /D [1790 0 R /XYZ 72.0 509.2 null] >> endobj 1844 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 613.5 246.294 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1843 0 R /H /I >> endobj 1845 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.594 613.5 539.794 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1843 0 R /H /I >> endobj 1846 0 obj << /Type /Action /S /GoTo /D [1790 0 R /XYZ 72.0 397.7 null] >> endobj 1847 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 601.5 244.79 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1846 0 R /H /I >> endobj 1848 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.624 601.5 539.829 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1846 0 R /H /I >> endobj 1849 0 obj << /Type /Action /S /GoTo /D [1790 0 R /XYZ 72.0 274.2 null] >> endobj 1850 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 589.5 281.895 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1849 0 R /H /I >> endobj 1851 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.699 589.5 539.798 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1849 0 R /H /I >> endobj 1852 0 obj << /Type /Action /S /GoTo /D [1793 0 R /XYZ 72.0 664.4 null] >> endobj 1853 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 577.5 183.749 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1852 0 R /H /I >> endobj 1854 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.516 577.5 539.895 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1852 0 R /H /I >> endobj 1855 0 obj << /Type /Action /S /GoTo /D [1793 0 R /XYZ 72.0 568.3 null] >> endobj 1856 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 565.5 148.948 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1855 0 R /H /I >> endobj 1857 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.417 565.5 539.896 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1855 0 R /H /I >> endobj 1858 0 obj << /Type /Action /S /GoTo /D [1793 0 R /XYZ 72.0 472.2 null] >> endobj 1859 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 553.5 161.109 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1858 0 R /H /I >> endobj 1860 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.452 553.5 539.896 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1858 0 R /H /I >> endobj 1862 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 541.5 262.719 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1861 0 R /H /I >> endobj 1863 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.641 541.5 539.794 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1861 0 R /H /I >> endobj 1865 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 529.5 163.296 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1864 0 R /H /I >> endobj 1866 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.459 529.5 539.897 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1864 0 R /H /I >> endobj 1868 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 517.5 179.861 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1867 0 R /H /I >> endobj 1869 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.504 517.5 539.894 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1867 0 R /H /I >> endobj 1870 0 obj << /Length 1871 0 R /Filter /FlateDecode >> stream xœÍÝM“Ç‘€á;ŽôÁpUefUæÕúZ{kkEÇn„ÇQ “jHIæ¿ßÊÆP¦›"Þ‹µ’$0o˜yfÈîT£û‡GuWæ¿¿Ï_F´ÝÓ—~¸¿¯îFÛI¿¿Ëú®Ž}/¾{¹»¿áæ»^ü6“ûßÊrï}}¼ñýî½zTv_<úû?fôí®ìm÷ó£²zðãÃ|ýè«ùäÖ÷Ò="î_kÛW÷| Ù÷ù›§/wøÓ˶ûôv©ß¿ú| ò›¿úóW$µý?xEe÷ìÑŸ<úÃç¶«e÷ä»Ó·@—ýˆü§éÎ÷ÒŽ¿ß=y¹ûûãÿx÷úp÷õW_îþöæp·ûâÇçß~÷Ý“??úìÉýg¹<Äò}ÔæÿÆ~ùfºø€i¹üÈÙ7Ú/÷Ÿîÿ×½ï›÷ì›ÍO'?ôâÞöþ×üÀûßÚòµ:þúÁ¯ÍýC-~(µ|ÑþOþa”¡ûZËü§Ï—Uö~¡ò¯çg—ßhÿæ¯ÝŠ3ŸûßUY}ƒÍŸj+ûÝïv¿Ÿß†u÷øËÛgÏž¿zvºãÓ›·7§[Ÿ|óêÙátûë·7o/¯Þ¾9Ý÷ùÝᇯž¾;~‘~yòVbU#æ+X½ŽÓò‡«æ7E{)6?m°ªïë¥ÔX¯Ú¯âqk$6;ˆ¥’XI<@¬…ÄBb"¨DЈ A#‚v"Ø‰à ‚ƒ"8ˆ A'‚Nƒ (J‚R€  (J‚R 4 ( J#‚B… "¨DP‰ A#‚Fv"؉`'‚"8ˆà ‚N: "D0ˆ`A-@P ÔµA­@P+ÔµAm@P"(DPˆ Á¹en}Ìý¸Ú¯ß#Ó¹‰Þ#æ~\°jn«ç¾·w«UMâA^æNæÆný vpW/äº=\²ìì›rµìW÷q?^Ÿïä^QªÔçû¹WÔŠêAêó]Ý+jA5²TdiÈÒ¥!ËŽ,;²ìÈr Ë,²ÈÒ‘¥#KG–,Y±¼Øý½¢&–;ÀWÔÄòbøŠšX^ì¼nÄòb7øŠY ²d)ÈR¥"KE–Š, Y²4dÙ‘eG–Yvd9å@–Y:²tdéÈ2e Ë@–A,/v¯¨‰åÅ.òÇëJ,/v’¯¨‰åÅnò5±¼ØQ¾¢F–‚,Y ²Tdy¾»|ýîÝÅþ2Xv¾Ã¼Z¶µÇ<¿¬ó¯Ýùɸœö˜Û²Ç<·{ûîñßÞN7n¿;ýþ¿þô—ÓïnïN7>}þ柧[On¾yqö_¿½½»yvxðBêüc7l¾²~M§Õ«e=K‰¹´£e±×f¥H±õ²‡„unv“ÚPí¤ž›Ý¤VTP·¹ÙMjAuG5±l•X¶J,[%–­ËÖˆekÈR¥ KA–‚,Y*²TdiÈÒ¥¥¥†WÔ½ ZPÝQ¤ Õ†j'µWT+ª‘e Ë@–,ƒXJ!–ó‡ÕÄR*±”J,¥KiÄR±”F,ç&!©Y ²d©ÈR‘¥"KC–†, Y²ìȲ#ËŽ,²Èr KG–Ž,Y:² dÈ2ˆ¥b©…Xj!–Z‰¥Vb©•Xj%–ÚˆåÜrD5²d)ÈR¥"Kíû¹µnµ‚1@Y¬R¼éAYFÏV7^[Ó²²Ì¿ŒÖCùm‡,«×tÝ…,;Û™[-ûÕ!˵¡ÚI}>d¹¢VTP_ Y®¨ÕÕÄòbÈrEM,/†,¯±¼²\Q#KA–‚,Y ²Td©ÈR‘¥!KC–çC–×çC–+jAuGuú|ÈrEm¨vRŸY®¨ÕÈ2e Ë@–A,/†,WÔÄòbÈòñºË‹!Ë5±¼²\QË‹!Ë5²d)ÈR¥"KE–Š, Y²4diȲ#ËŽ,;²Èr Ë,Y:²tdéÈ2e Ë –C–+jby1dùx]‰åÅ劚X^ Y>^7by1d¹¢F–‚,Y ²Tdy>d¹~ p1dË·,«e[C–;ÝøëÝíÓÛ7Ï_={¸Ó>ÿzÕ#´êúYN°ZÖ÷e”ˆ¨†–å·õlukÙj °ìž]_ªÔËîÙõµ¢zzÙ=»¾TwT#Ë,²ÈÒ‘¥#KG–,Y² bÙ ±l…X¶B,[%–­ËV‰ekIJ5bÙ±l Y ²d)ÈR‘¥"KE–†, Y²4dÙ‘eG–Yd9å@–Ž,Y:²tdÈ2eK)ÄR ±”B,¥K©ÄR*±”J,¥KiÄR²d)ÈR¥"KE–Š,Y²4diȲ#ËŽ,;²Èr Ë,²tdéÈÒ‘e Ë@–A,µK-ÄR ±ÔB,µK­ÄR+±ÔF,µKmÈR¥ KA–hî£hî“£»5?¼9Ý÷þð¨åÆ“Ïþ÷ÉÙ­<<êÍÆeþäGØúœ–n Rzëd•×½[/¥y]/Û¨z: ªÕÕê¨ÚPí¤®Ä2*¤&–9P!5±Ì ©‘¥ KA–‚,Y*²TdiÈÒ¥¥¥…Ûø£nk êÞPm¨vRŠjEõ µT ª‘¥#Ë@–,ƒXæ@…ÔÄ2* ®Ä2*¤&–9Pu#–9P!5²d)ÈR¥"KE–Š,Y²4diȲ#ËŽ,;²Èr Ë,²tdéÈÒ‘e Ë@–A,s Bjb™R˨šXæ@ÔXæ@…ÔÈR¥ KA–‚,YêñêHîEÁ`¨äÄ¡Z¶œÕ§G˜o¼¶­ÊÜ]TúñX¨¶»ÇŸßÞ=½?îñŽ/nî¾¹9žúöxÇ'·/^ž¾}~ûêá~ûÜg²|t}ýD§X-›ßtse¹¦Yæûêósïºñl«™BžÿÔŠêAê<ÿ¨ÕÕAê<ÿ¨ ÕÈÒ‘¥#KG–,Y² b™33RËœ™ºËœ™‘šXæÌŒÔÄ2gf¤F–‚,Y ²Td©ÈR‘¥!KC–––£Ôùâ5uº7TªÔ£¢ZQ=HíÕ‚jdéÈ2e Ë –93#5±Ì™¨+±Ì™©‰eÎÌ@݈eÎÌH,Y ²d©ÈR‘¥"KE–†, Y²ìȲ#ËŽ,²Èr Ë,Y:²tdÈ2eËœ™‘šXæÌŒÔÄR+±Ì™©‰eÎÌHM,sfjA–‚,Y ²Td™ïÔVÊ|0Zff=f›Ⱦ~ÙùAH«e[3³Ø:ö¸ÿàîñ'wï^¿}ãþð£wïo~<ô(ûå_þ¸:Ðhе1?s©cý4ï®õ}os‡_K‹bùL¥n,ZM¦© ÕNj«¨VTR÷‚jAuG5²Èr Ë,Y:²tdÈ2e Ë –9·#5±Ì¹¨+±Ì¹©‰eÎíHM,snGjd)ÈR¥ KE–Š,Y²4diiYÃÕû5uº7TªÔ£¢ZQ=HíÕ‚jdéÈ2e Ë –9·#5±Ì¹¨+±Ì¹©‰eÎí@݈eÎíH,Y ²d©ÈR‘¥"KE–†, Y²ìȲ#ËŽ,²Èr Ë,Y:²tdÈ2e˜ۑšXæÜŽÔÄ2çv¤&–9·u#–9·#5²d)ÈR¥ KE–ù_iz-µ ½zµLíj ï"×/Ê™]/M7Íý—ÕÌ®–­3«ûû3«·ÝãOž¿þþpwºýŸ‡w§§ªÏŸ½zš#¾Ã·§»òâðßܼYŸG]÷-îß¹~ §õ«uco- Gëæ6ö°|£b¯ëÖCaygy |:¢ÜXî$osSåÊòòŠT[Eª­"ÕV‘jkHµ5¤ÚS¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTçYŽT¥ U)HU*R•ŠT¥"UiHUR•ÆT…© S¦*LU™ª2UeªÆT©SíLµ3ÕÎT;SLu0ÕÁT©:Su¦L5˜j0Õ@ªZª¤ª©jEªZ‘ªV¤ª ©jCªÚª6¦*LU˜ª0UeªË»kÌ~+ÿà|áø¶D9žàœ¬[Þ—há>ÆÆºÍMÝ:K{¼ØŒ³ã¬Ž7ÿzwûÓóo™àŒõœfüÊœfZúürH‹g>­_­ëû’ï·lΖÅ~2É6Ö­)åÆrGùÜ.G¹²|<¯{‡rayg9RÍkß¡©æÕïHÞj^ÿåLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÎT;SíLµ3ÕÁTSLÕ™ª3UgªÁTƒ©S ¤šWÆC9RÍk㑼"Õ¼:Ê‘j^åH5¯‡r¦*LU˜ª0UeªÊT•©S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©:Su¦êLÕ™j0Õ`ªTóÒy(Gªyñ<’W¤š—ÏC9RÍ è‘¼!Õ¼„Ê™ª0UaªÂT•©*SÍ©Nž·bþ­CÆ9Õés?'Z4´îü(œõºÍ©NÛ8÷Ü1ÈçÈ3†s¼ýõëÃÓçß=z“'˜:Ý}@ÎñÆÅ çx×=¹îa¥h/æ´~µ;-9è)ÇrȺ¾¯6IFßZ·Þk”çiHn,w”ç™H®,(Ï“\XÎT•©S5¦š§$°Qj ½&Ïs\Y>Pž§% ¹°¼³íæn¸nœöynéçsäß_.xÿìþ´ÏÇ;>¿»yyøùöæñDšgÝ1ÛxÜÓ¬ÖÙòf¡"µ²u¾·‘ŸnÙz¾‡un¡\Y>P>·‰P.,ï,”kc¹±œ©S5¦jLµ3ÕÎT;SíLu0ÕÁTSu¦êLÕ™j0Õ`ªÁT©æiPŽTóÄ@$¯H5O „r¤š'B9RÍÓ¡œ© S¦*LU™ª2UeªÆT©S5¦Ú™jgª©¦:˜ê`ªÎT©:Su¦L5˜j ÕG-Ë“<9üëíùÍ›o^žØè8‡ëÓ8¢Õ` ÓõpÛz}›Ãõ¾q.ÿ¹í¾ ðG¾QùÏ7?Ýœn}þã«§ùîá‡Óõ¼|{‰ù0yœöê1Oë×£is›_!S´¬ïKŸ©l.[ͨƒÔunV¢ÜXî(Ÿ›•(W–”ÏÍJ” ËjmLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSu¦êLÕ™ª3Õ`ªÁT©æÕKPŽTóê%$¯Hu9ÓÉ‘jž`ƒä ©æ 6PÎT…© S¦ªLU™ª2UeªÆT©Zª¶pÏ“<ï•åÊòòQX.,ï,”{c¹±œ©S ¦Hu~åH5O°r¤š'Ø@9RÍl¼!Õ<ÁÊ™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª©v¦Ú™jgªƒ©¦:˜ª3UgªÎTƒ©S ¦HU RÕ‚Tµ U­HU+RÕŠTµ!UmHURÕÆT…© S¦ªLu9‚ÅJé• `— µÕsCëÎÔ«e›걺v‰ìg×È÷cî?½}ùòþl–Ëí7‡»ŸîOz¹Ü¾yõíéÆÏ‡o~üõÝíëÃÝÛç«Æó]ë£úýZV/ãô«u’cÿù%ÎÖÍŸRæicÝztPX.,ï,”ç–(ÉåŽòÜ%¹²œ© S¦*LU˜ª2UeªÊT©SÍ-QŸŽEÛú_ Ë…ååòÜ%¹±ÜQž[¢$W–3Õ`ªÁTƒ©R̓çPŽTóà9’W¤šÏ¡©æÁs(GªyðÊ™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦êLÕ™ª3UgªÁTƒ©R̓çPŽTóà9’W¤šÏ¡©æÁs$oH5žC9S¦*LU˜ª2UeªÚ÷j1ÿô#;ÝˉBµÜ¿¬³ó«°®Ö5Õõ$ÃW×ë}{¤]=Ÿ\op2‘ï¬Ë«´G==ÀÃeº½Gx^˜,ó}“|ã|Ž3VËB,&’\Y>PžWþ!¹°¼³> endobj 1871 0 obj 6015 endobj 1873 0 obj << /Name /Im4 /Type /XObject /Length 1874 0 R /Filter /FlateDecode /Subtype /Image /Width 24 /Height 24 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 <0000000808001010001818002121003131004242005A5A006363006B6B007373007B7B008484008484738C8C008C8C738C8C8C94940094947394947B9C9C009C9C739C9C7B9C9C949C9C9CA5A500A5A563A5A59CA5A5A5B5B500B5B55AB5B563B5B5B5BDBD00BDBD63CECE00CECECED6D600D6D6CED6D6D6DEDE00DEDE31DEDE39DEDE42E7E700E7E731E7E739E7E7E7EFEF00EFEFEFF7F700F7F710F7F718F7F731F7F7F7FFFF00FFFF10FFFF18FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF>] >> stream xœ…Ù‚0E â‚ÑbÜ€¢qx)‹v‚ éÿ˜CË&’8Oí¹Ì=E©ÿó”£\,–ðÓoðt,¢`€ûFšhPL ¦/,ø×x„Ù“bÙ€åÔ±šX!Rpn‚JÙòN^+ñ0Ũɵ²šp:OõAË뚇µ0‹ëMÉ€æ–ZË—9 ”’~TsgkƒÊ+ƒHoÄë½îÉv`Þ)}^Ò}3±ïU ƒæ¿ÈAÁÅžÓ;óc‹U-©Fôq'ÏØnä­²¿ÁK1üÚl\½LÁ­‡?cÙl; endstream endobj 1874 0 obj 218 endobj 1875 0 obj << /URI (http://java.sun.com/products/jsse/index-103.html) /S /URI >> endobj 1876 0 obj << /Type /Annot /Subtype /Link /Rect [ 100.227 365.904 312.519 374.904 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1875 0 R /H /I >> endobj 1878 0 obj << /URI (http://www.openssl.org) /S /URI >> endobj 1879 0 obj << /Type /Annot /Subtype /Link /Rect [ 466.654 160.506 504.71 169.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1878 0 R /H /I >> endobj 1880 0 obj << /Type /Annot /Subtype /Link /Rect [ 516.096 160.506 539.996 169.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1878 0 R /H /I >> endobj 1881 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 148.506 141.99 157.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1878 0 R /H /I >> endobj 1882 0 obj << /Length 1883 0 R /Filter /FlateDecode >> stream xœÅZmsܶþ®_™‰Ý‘ ‚ßòͱÕD²ã8–ÒfÆÊt(îŽ_Î$Oç›Nÿ{w_uî‡4m"ìX®ˆ gÖМl|{ötæzÔñ‚0 56›² @Dõ gäò:³É›BÖnТë/Gk"p˜ý@`‘ÍÙwg—w ³Èݺ›Rǥܷ,‹Ù6 ¨c‡øMî2òéÅÏÇ(o{GÞ‹úP”ä]RÕ"eõòOrwÓa,¤‡†÷‰m ÌÜ¿¸å´º©Ú]Ýi§¨ÆV6üß§2¶z\nõ¿q×ê;-üË©£t QÎÀO©žzýWyF•ƒÕßYÇZ_­é‰ÅOiçósêcCfÑ 7 6 ÷÷#ò/öÚh"±ïv<áp<Ö(2+PtW¡u"t@Nø‚Yã¸&/á‹„Ô'/ŠÒ”3#Œ;”Ù˜Çöâát@¶·`ÉIJNRAMÅ­¨OÂêp‹†0Ûï‡sž«Óy„ÜZho"¨‹“ðpÎ(X›q]îÅ<Ïoy>Û¡5æ êÌ•ÑÏÑSô•梦U•ÒGq¼­‹r¾æó±)9f‹¹°b4ÒV˜â.ª·¦\¬—*—ÉST÷TÏoÞÞ¾VþÜTFùjÁ+ŽM¹>pNðʇ¨ª€õWó‘ [ÆÈ¤DÃÃ9ZÐÃUÒNÛ6T÷”øPhçM5oÆn¨`äó½¾m ¶0 Ât0”RÄñâÛÙ£¡´{4Äl_Õ†ø úU ©Š2qÿ’šëµ!‹½Yy'âdmvTŠ4ª“'Ó"Òƒ!6Á¦Å§(Ý‹ê|ú!IÓ9襨ŠôI¬–¨éí¬/&k=×~÷ï=]%åfÃËóÆíÈa+r‚®½ùxE’ŠTuTÖbEÛíË™ã) ò/³|ê£ ¹Å@JÈUJ(7h½×¥ËIÃÁ.-‡©._Gû:)ò¶¨Lƒ3`!°×!åæ þøÔEªð gñež Ø Äé3VvE¨c©:°[ØÓ¤¨1¬¤¤gtvŸm ÛÁаÖ49ó°Ã¦&sCÊBÒ7¹õLÅ (Д=¶nÌ›HŒ‘£èU…Ñ€ôKþÀŠ!×¶›îZU{а'a˜s2˜ƒ!¨y ~ßJ3òÅ|ÁˆÑk…D£ç«hT¬¼×’†*•(!Ê`r­Ò$¹Qµ+ÙK§¼×Ò„a`hQÞ¿ìHIç3ør! Š;Tئ.“؄Ǣª¦kkZí:¤ø«9®¿£7á”Ò÷æ¦(VÇ Ü–oˆÚÏ £œ¬   ™4y¤*~h9ò# ³Úз]q©9€9œrǶ,EŒsý3Ç~‘ßÛ°ìT:Æ;*ÞLYÇu-zl:ô¡> }´ªÁœÀÃ=wf¬9PX=Åé€ vcúéaê>4´`VEŒ™ŠS\õí€õØ¡SõÙaŒÆœ°áü Ñ= ÆxG«†Î1NGÁˆ&¸M!¸ÃÐeMŽ ÿÄÛ ¢Â`npY—§R`ãôaãôì_n¨lÞ©•ç×—J0 …NÀ´ô ¶ÑS¢¨C«Tz§…ºglþØåÃaɳ`d<˜€¤ó׿-¤¨l©½ø9 7¢‡âÉD™Eu¼þŠ6¦¼*â}&òZ˜nYåBšÄð Õø?fæ,˜2Fäͺ: )‡£Ÿes~2’YŽÃ–¬‘Dgq··W@³q5›ÀÙgc¥îôœg8OB8å6×Iãû¢'¤o6œôBìÉ•Ô [%Ž&c%®*5Äa¨†$ô䥜+úld\«ú$9þë…^²ˆ‡É†©8‰fç‘}{ÐAL÷Asd¯*ú`ÅT,:ÅøԶ»î´ªGÕ0̹NÅÖb*×ó‡V ݱ˜ËÙ—¸Ð$´–?е:Â:>Щ(+8ehɦֹ.¶w°J\‰ÈW’SPl[ÀIJÄuzÔ¢f3-)¢Âh!ÝÚùªû*× *v;Õš»¶i.ã”ÊF/›ƒJVI‘!áyò>"©ºr¦ìJªD¼7e½}(ADU"ÊNV  6å@´´S¨”X•uÊ©Øztå"5:3ócÚ¨uÅßß_ÿaVJjc8q™ì 9.òu²™p˜ÇÁa¾e–§<¦’f^m‹=+E†ûNRÓ†]!¥ð†\¡C= yƸÎeqös‡ù¬pq˜g%˜EYë7%DúbE å>ÏU¬hÅ lÄé×NÐw©²œFµ(Ï;¹Æƒû ýEêZB Æt®gföŒ· Õù)ö‹> qq0>Ý¿¸ÝâªP¹Ž’ò¢îX3OÉÊÁèf Ž€ßË5Wo£šÈ{ù¸rHê-Qá5‘ª #ÄeáÀ_9@QËz/(¥ãN\FCÛ CèˆøIÝ¿y̸ŒS ± [.b\Åc3óíðò÷xØ×¿­G¹‹wªŒM´ÛÖõî‡ËKL8hµÏi\d—àäÕ>®«ËÏU%.`À¯àm‡në,PÙèìÐö¿ •°,È—ÝÀû¶†Èìã„> —ê%§„&F•mJ!ææ«¹ÎÔ’(³Êlª¯>•” ýL0Õ´_ö°S`^ZCÈsØW°(Ò"R܈jcO «"ƒÃ{wEª¼I‹‡(íd½Ñh©*Öõ–&íT¯R£vCåRhn”´.õ3FÔX50&U]¬·¤qÓz«g@‰Ÿ#c(HÒ•Tï9 б'}wÕz3rluÅ›7o;!É«0ÂÇóNݧ’²Â4¥Ç §+jüJøÍnTxMXP‰DQ;Õì‘Áö=êø°b|+˜òw7¯þñê_?ÿúËÕåçR\¦ÉÃ¥øZ/<;KÖhHy_•u˜(aàäñ´þÀª¼Fî9]úZºýâô£rŸô* ͺÆU’Ltk¸æ9·8Ü_²4Þ8nC.Бçê¤ìC éà‘ì¢$‡qTKyw|Lme³_¢GÜù#òA½Ÿ\àƒÔ[ýô²jpàšÀvñ'¬½:K2ÓÒëCѳHf]²|ˆŽU[¥­±jKx)Gá*ÁkÈFRá ‹qÔ„ݳí½ýŒ‰î:‰ÕÃTUÉ&—<#¥‡ã)m¢}½-ʤ>ž7šâ0Yô(Æ“æ;Ÿéäg_æ&´~ÍE[WÈ䬑¢ºT窱ùS×*Úâc^ZAN€*ê×7%ÄQ%ÉC×’yVÓ_‡¤ o´\Ø=ñȽ‰q¾.²¬èz~e · NF6d½.œûǦ:w­'!âôµÂ6ª¦<ò &›Š¯Ql´-ª:ošÓ¸LrJnÞüøšÄi‚Û®Êø0"ÕHR’UTGàdòûÇwæâäÃg4ƨoñ0ð\½ú_¿º¸UAûƶ°&]Ç¥VÈ,ËáúŠðúûŒ`"»)0‚Ùà ÙBL€¼<""Ѓ^··ïˆ±(¹Ã¡ÁvzÀ†Æuh3|(ïd—F±¨Æ4åº>u€&}  …èUUí³æ¬Ë  èFlR&%5l¯ÅÈ(¡ç«H¿/+ÕNdU}LÍ&æÃ°Ò4oîJ2†{nv lö}e*ä*šF©V~#)&j¤a^rê¹äÅþ„{–ÚÔÃÛ}/à áLŸWÕ0Oæöb£ùÞ8$ؾ…Ù;¬çokèQß  G7\nøiØ’sõr8 õaa^8¨y8¨ö-ÊáñªãoMB?ð&Úþ9¨ ìƒ÷ó@káDmypC“˦Œ²…{W4†R´zsõñ:Û ‹›…þ’f)'µJ`"‚?$i~A1±.CFÁÇ*.ôEUaÜ^¹â*p 2C äD['™ E®^Ê QZŠh›â5ÁÆßIl’'\ܸ:`I¡f»T´tç|»èq–ÇðÝÕ±l¼„•H®T#ü‘'§ä'}É‘nm7+×ñÄpŸ{ÁÃ(p`» ‹@öò—D¶<â6×ÀàYÉR•šKIC¥n8 C)é~îY¨íÃá£>´ª;…¶]TNg(ŸG_ÿŽ:±û½(@ {«ÎÈÐacg lØyÖ7C,Z5€2ûb‘åøÖ§Žú탙f²{Œ«€\ÔÅîþûz]”…H.`Ëþc÷ôH!àP>\ý"ké/Ø&/âò¸«{¿vý/ ¶^| endstream endobj 1877 0 obj [ 1876 0 R 1879 0 R 1880 0 R 1881 0 R ] endobj 1872 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1877 0 R /Contents 1882 0 R >> endobj 1883 0 obj 3242 endobj 1885 0 obj << /Type /Annot /Subtype /Link /Rect [ 232.81 667.846 278.36 676.846 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1573 0 R /H /I >> endobj 1887 0 obj << /Type /Action /S /GoTo /D [1872 0 R /XYZ 72.0 450.303 null] >> endobj 1888 0 obj << /Type /Annot /Subtype /Link /Rect [ 248.7 425.131 303.87 434.131 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1887 0 R /H /I >> endobj 1889 0 obj << /Type /Action /S /GoTo /D [1872 0 R /XYZ 72.0 306.171 null] >> endobj 1890 0 obj << /Type /Annot /Subtype /Link /Rect [ 91.72 380.177 248.64 389.177 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1889 0 R /H /I >> endobj 1891 0 obj << /Length 1892 0 R /Filter /FlateDecode >> stream xœÅksÛ6ò»ÆÓ™Øs2 ¾Igú¡iÒ69ßMù¦Ó©:Š‚,6¡ðaEÿþXVz_riï.»‹Å¾@¾pƒÿnä(qI¶¿ø¬i‰\â…š„Äõ©=Ñp@ ಷƒà2°#¿]”Œü|ñÇŸ°¸! 6/ØXœÚ¼¼ø”!õÂ8Im›K8–y4 Û“Û·{—¼Š»³VÊaßÜZÛÏqÿ0òxñêáâö§€8Œxm ‰ÁÆH(+.°ê8#ðç@kÞ¼¯Ôæ´ºº¬U ›´I×iÍ)»\\nó‚ßÝŠCs»Yߎ FH]%ÕqPlše¢-›úå®þ\lÖt÷i[4AbÁ?6Pª¾ÏÒlÇ7/aòr+ªŒ,Ó=¯¿oª–_®®_¢–™ŒaÄ‹(T/©.D};N®a-¡1¹ª<Ë·9ßÒO—óÚÐÒá8T”6Ö‹Ñ€%?¤w!–]úd™UZ"ùv˳ÆVn©³`þŠx^>N•ÚçH+KÔ¶ûYÛ·ü8¹8?9ÒrTÝf;’ÖÀéF9§ eCò’4ÒÝ£®B cPÀ"¨±SnzÏr¿ïms™GãPF:äÄW•¸LŽÏrg»ôÐ@œã.†Ó *ÙíOqÆÉÅ”1È4/ŠuÜÝ/É›2«N‡&e'Iîv¦Q›¸4 =0ª¥ÚÝuh"Å,ÛÃAÀE®®RJ>Qÿ.—÷]žM8 <È;—é¼{U¤yÉÉ2ßjQ.ˆÌ‹_äPðš?ñBö¼lÈÏ•hÓvc%‰ïéÃ}÷?å5œë¼Ç<òÝtÏF{À÷†Å7 :»sÜ»€ýƒ9ŒÍ” ‡ú Ô;ßKºÎUvÂ(BC~ä˜Hà_òpËN ‚ «YñF¬E,Zr½7øæ%Î-Mï^¿úÑ`¥§zBVäàEËŽ´Ü¤ÃzJ?‡QC{»5ðI´–¬ŠO]y#WUmYʪ K…p~@_MþŒ„¼¼TÏx]?_1 l2EÏ€8-EyÓnuM ‰´‡Ô¸F[d# ”¢!Xlá’à´´S ŽC:ZÅ OY ¢üs›W\FnokÑ:Úèº!e1äfv±j=ƒÜš“5“W0|ÑÈçN7»n0.as|Ë‹·/Ã(}J{Ä¥_zXÇ‹‚ÛíáUŸ µ@¸ª5tΓ!ˆºÎ¡•ö„cÞìzäí«½¨v,zlÝ6†¯‡ À¿0t¸Âò“eîi-6F÷.5²Ó¦áûCÃÍ1ã§ ù©Ò~b0¾@Î@¾¼~eúÓ *¯Ð`m¹È2¸9-âæ¼ˆwîÖÜ/öV··Ðf—6ZŠþàHÈË3?w»âªª½ΜñWäŒüµY+%£eÕƒ<‚l# IÁ˧¼¥\_]ÓIùp¡ï„Å,p¼³Ñ<áÃ*Ó|ËÖ¡,AQuG¿,:l*;X7 ó¢èà’cÈ(vÑAc›¢P”$aÌX÷ì.¨ rTªé&h Mjìx·\¾O ÐC©6v¢¿¯Õõ˜L¼²é.Úmû]´½ÏpÎî0Ó[ãOl2s®û«~cIB{9­u,…8ÁÔåô¶=ælÔÁï˰ÛÒ7¯`_ݼÛZ74…ý¨¬½©ó 0tˆ¶ßǤ구{îk™‚UÜXKÚ…ˆuà bðŒ7„Õy ºº:îòÌ£[Fm †«ø3¼‰™C*ûf|éF#_ªÛÇ’ÈxRQ¤Î¢ŽàPoA _9QÏ(ªÝt¨bd›Wusî­ê#7‰ƒXk{còR)Và œ³Ägžœ¾ìt!Ì¡§ß½?4ø”nò=´ õι9¦§Á¹ñ&ã0Z¹,y¹üBgÛìôòÙµ%NºOFzv[B7:c_àzÔ‹"æøÝ÷³wm / QÂ_5ã­(`ô”ÇïG1ȯmþ…×ôÌÛ=€w4LÛrÎ'o÷ÿ|¸'ïµs† '2Çsâq’ßÁGœ¹mÖÙ~±V?ê»ÛÛs*h‚ò·6nøwUNv TªÁö¬ÊР½$ráq2&ò ì[jæVa£fÌ-¤f÷媛TìTðe_Q);­ÿ!´,Ï‹™ãFÖ@äÅf¤FØšq€9‹ð1¯wf—èAsKê ‚m]±Ôì–߉·y&ÇÍ~õÑ÷¤Š4Ö'Û"cžþ­„Q]ɘî°n¶]Øg-m¤âs¦Â«`ÆN½èûC/òËo3q7Ó!¼Ô XÙ k‹ÓR3êV;•Ýpì ˆuµ|Êw©¼q9ÐfóvE\Þƒeó FCü(ƒ¸¥£.òÇ]cp!kY-ŸQxºéM ªÓ“mLjÉÈ·ƒßUÿbWái endstream endobj 1886 0 obj [ 1885 0 R 1888 0 R 1890 0 R ] endobj 1884 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1886 0 R /Contents 1891 0 R >> endobj 1892 0 obj 2650 endobj 1894 0 obj << /Name /Im5 /Type /XObject /Length 1895 0 R /Filter /FlateDecode /Subtype /Image /Width 24 /Height 24 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 <0800001000001800002100002900003100004200004A00005200005A00006B00007300007B00008400008C0000940000947B7B9C52529C5A5A9C7B7BA50000A53939A54A4AA58484A59494A5A5A5AD0000AD3131AD9494B50000B52929B58C8CB59C9CB5A5A5B5B5B5BD0000BDADADBDB5B5C60000C61010C61818C6C6C6CE0000CE1010CE1818CE2929D60000D62929D6D6D6DE0000DEDEDEE70000E72121E7E7E7EF0000EF0808EFEFEFF70000F7F7F7FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF>] >> stream xœmQÙ‚0to4 F© W1)5üÿwY¡—Ig_63ÓÙͶm;àR i5 ïöFšï H¥Ð ¢™pmtš ÇNˆ…û¼ÎµHd'6L‰œ=²°su+C{¸â=qË‹àÖÀ!Š—þjsjð×XQƒŸ:°5ùélx2ú“enò× Gócµ?¨ý³CsMy¶`R÷máãV–/NøwþèIÿðvqwÿOü'®ü°(ÕèËÿe3HÝWæ*šEÝ}ާ¿<ˆn! endstream endobj 1895 0 obj 212 endobj 1896 0 obj << /Length 1897 0 R /Filter /FlateDecode >> stream xœÅ]“ã¶í}gúpwŸVŸ–4}ÊWÛËdÒd²mÚÉæ–éµr²äåõ¹¿¾Á/}Ø»íCzɈ@JŸî"Âïñ'/cVî>iZÄò˜%kMÊÖ,Nƒ8c¦áŒ50ÊbÁ `Ï~¾kïBö—»_~…‡[„ó]8e§&ÿt÷#ËÖA².ʲԺÅAT¨Q¬¨ìþÃ!f_wj´Ñù„¿»¶¾Iÿ4ÙÓÝ—w÷ÎX²‡si’i†aǬ’¸Ä?1{8°_ÞþõrýO?~Ǿùë?²ïj9ˆVôòݯìá[Ç$ŠÊ Iab‘æ,'lßþ$úg˜õøŽæ}ó B“1¬bø?Tldi8~âÅ¥;*üMƒ„h@!cà£F»^ÿ’e$ÓïUÆήá²cñÑï*üºOsœ…A1rCœEžùÇù;[mæH”eE9-ó8KKxØ?Ý©´!Ê¢< ˆÔ0a½`;`‘®K‚‚¢–A#$ùSˆ:mƒ,ŒÊu4U9ÅŽi<áJÉg&îfŸ*€<•?"ÜVÄ2 3-ÂIÕ$£ÎT¶Ö&$%Â]^­M@ÐÌ6ôJVŒ"/dkL¿0TÝØMÓÙ°¯%Kâ÷›z`õñ9eò´iÅÀ&‰¼¼bÅ ŠˆÃ|Hœ…!¢†p%¢é*Þì;¹À“\‘Cz*×F­u'&÷ݩٲ“¬=D_Æ·Û^H)$«[öÅWß±]ݹb§~$»À<ñW‰~à0bØói„¨bÖÓ‡=HáÁÎuRš3¿H¶ìcÛM‡œ{ÖêL«µ€H—]sê®eòÉ÷0—•¥`rX\™'FÖã[.%¬ˆ´C••Цƒ•~hѣ髮mE5ÔÏõpa0Lv8¡>ˆÇwÁ\Ê:%¿Äad¤ü\{ÆÙVìø©hq¾¾b8ÿþÃ?WÖp’ï.WY¦È¹,ŒÔ‘ƒÿ€BêVlÑ'ÊN÷b¨îÑÙRùgAá"™ø|>¤LÀK0$OS²í…E%Ôë"ˆB þd!DØ‚<ÉR£ß×8“3Y·O ØøãÀÅ"¨U¦¦üÐ2\•øÌÇF¬F:„÷pæÃîÁ*ÆW¬ëŸx[ÿ›£!duÐ,ÉŠ£™)§ëÖ›NgÖí”0Š”7’ýðÕë$ëufY?ìM|±mžm»íù³`PGj)1,Àõ¼ª”±åßpÜmÛº‡hl.K¢Òh⨅1Y8q e…™%2œMÈ=MŠ«Ü!õNíøx\¥²®Ç_(‚y»­aAÂ×àCµ‡Èå›îYo~Øõi5IÐÂ"KXf]02‰Ä”õæqP°·ÇÓàajS8÷„‡ž÷¢Py¤ÚŸ !àÈ Ï¨]ëØuýXÚÊCaÝ&¢ªwB9ÒiÎ!oxÊÕ#cÑÛw;ƒÏÍØ¬œ•²%¤ù4 Ã2‹Ì'Uðª¹jõ4»ÉÁS¢ë¯ª&ˆÑ̳ؼB|^,LUB£œÔZÐz‘«ŠDQD1žÅy¶ÀX+¤-\ yU¯8Ê(ñË2ƒRñ††Ý+”Š“8ȱoƒᦡ^¡W’¯¦°çoèew"åvjûäw¦…­ØÏ‹(‘Çì­ÖAÄÞ6º5r”º•o+áQ¤ƒ¹¯;0Lƒ2Ãî Žö¹ÔU]µN”†·f;ù]ÿ]°Ìˆ°\G Ü~›Ô‰ÃâUt-L¦S¤U‡øÉELºP–k±^W˜M: ³9‡|á àUÀˆeóô¢C÷YÌÃ#^O„iI&Œ;_ôò‚uE¸(GAŽ+‡ê ®àÃIzØFÜb°ƒ÷Þƒë{í$žcG +}U Z+Á+‚(]/°pJèjΚmx#Öí`9trRÍV§*ÒåµB¤Ì}˜µL%ÐÞÚгıºDY`?>WM“·f¯œ|:Ö‹!DêuF…T×_‰K›´õÒš (øsl+@“¹Z¯ò9”d7X8%ÆfÖÕ„^šÛï ÷«¢<óæ$–þ›Þ#/,<¡q€®¡ŒËÿÅ›é:»5=Xèf§eÆöÊÊ&*€kìD‡S»xÅÐ:ÐL·O’jIØCÝžTKE£„6¬6`·´Sm×+OHcUw¼¨Zv  ³‘Ø‹¡OwÉštS¿ TÍÚÕáîþÃ!£UÕüçpÄŒ#Ná<  N‡ *6'ï[P×J€ÑA7=Eœ@ Ò?ÝÁ¿qku@°4‚¿…¹çc>SOéø°W!‰®W< s¼zKe™c‚›0פñµÏ‚"IŽâÆ živE}ß4ãOøÊxL-e4l0SeD¸eXŒâ‘ìE|¼¨ÆÈ7SWLÕº®E>±‘fæ¸~ 1 ›+(ñ*4^똤ô°Ùá«)¡È‚0y舯—ª0èÀ¯O6¢»—•ˆð+…s"J––ôrå-F3åL¡~í1˜'ºhB˜¿¨o Æpâ'å‚´?Þl„`è¹F´Éþ+C¨ö¼}V}ÕBæýÖR¨8P#ÎKŒ™(žHÕ‡¸ñ­J¼n íXW•©95Pb[óA43Á:òôz5I7Æ©FïÏ4´}®¥•§Ö¥K3€¨4ë»JlOvêF4ÝyaÅq:Y1p=âµ”WG„š7 3HÓÜü:6-‚t½{U×Ee›ò˜`è?è-Bµ>Á蛕żªã"pÓ©è%äÐ)s2*#‰D5ÈÂX)ª“‡*ÃkPÈaIîT€s¹áêÓPð^Æi(v¾(Žw³P»›³Ó7à:œ°TÑœCamÛ'B*¼ã^9¼ÛžõRxõ"4F}Áºµ"Äl„©Ö0úKwÖD¨=~uû P’ã Ö_F“i¿]ÕuõòC“Æ ó{q¢˜ÔEØ·_ùÕܦy<±iÕ`L û $Ä2CÝ Ï¼¯»“{(AÕëjß"–ô¥õV¸Ak%ìP?퇚҄"4|ÓEPPêÉð¬}ZY\/õ²Å2þs•?4èÁ6u’—º¹¥ 5[ŠW,­x €¤Üš+^¼ì…\©ã^­@Gêº}<X/Ù êÓF•®»ú3T¿U×c¥ª^Ç€˜ºŽyVIÃõD­ä!±ƒNOp6˜ãL‘¬i4N[ƒàªÜD²~Ú{Oñ¤=Õ¤ÃjևނU…î0s *Œv›žßªÝï©o¶aæB–ÐVœGšŒ§É•ÃMDضkß sCFÓô,Z¾Ñ-4G® SÈõN* JófÎóvßœë„:@E¹ˆáOÓf"Ä÷QÈæ‹Ï6FOͱ¢QÛ@3l¦,V{OÈáZ€G‡c×óþ2à+³õ´ÙŽXú·ŒæžK¦çJÀ«µ̳X(N×<Í[ŒEy ݜ՗_ÜðZc·sÒ,Z`Àª†ÓVWç œY†´’ñä=ÍÖA„Ú䡞þ ½ÃO|²€ýƒ7ø²††{RÃö¥­m9¯Y€ýú¶šÓmªwçéº2ÛöFíþm˜žûª—ø8;3˳I7‘7mlÓ"7q¯®{GŸu<á=RÁï³Hq(®x¦…Ox%`ü¤£ôH£Ï´ÑN°¦ŸjôšŒ146µÅR¬ %…¹Ù`ðç7þÌÙûêÈðrö~èî÷òS³Ý¿ñßÒÕ•°ÝAvøK×I z¡t¡{…r=·‰º,«éˆ#’> 1éFc¼n¤CŸõ~êÚ•#ê›jBtÛ£±Çê ŽªÖ¡[1ŒyC)Co+”† gË!p”¿á ˜s­ Ó…)ZUý©Ó¯ÒB–Á¾ÛN¯!‰Uá*,¸­%”¦Å’(pWÍI¿'"iAp ¹¨®êaåxè!Þ^,¢¤—D "Ýòmr9zR>mшþrBctrhØYN±®ïá”|š˜×M^xŽŒô ¯T«¡eõ%:!ê4%мã6xíÀÁÔYz¤7hçÀÁ‚gÝÑh ÙÏ­*úãƒS>Õhe 'IÎÓZíé/J|æ•ãb‹B3‹>‹¹ùð^fd>Oï4ÂÛëGˆ £8•‹<^Ÿ-ýÖµ>!zY„\¿™ÉâZp8Yãí_>å(´“г¨LXè´·Šv¤.“¬îä'½ÓIjã6ÏwîYšÿ× ÉÒ…it­Þ (±U-áÎeç} {‚¾åªàÐ/ŠMÿ^ÐßtÀQŸžˆ•Æùh<ë+É=Ö]­CÔw4ÃòPç?Úõ4…)aǪ]ÍÀ«v‰bŽŠØïðc éR°Q'¥9ãÇ-ïVŽb{­xâÜ׃-®wXSû«»¡Šé™“¹Q‹iÖ‡þhÅÜ©a Ä€}D°¢÷"J,­éÕ j þ;âÇPê‘ÒÐμ‰ëpšO_‰ói¸Ì"HìpÓ±«ÀþäȵõQ©`ófP!&Ïvæ o…¬úzCUåЕãÙ9°ïNp`Ë}× ¾*øå ›N›Âj'剮B§ W ŽqëWáÄ¡‚MSŽ“uè¢aÝH)Ðx±`àÎB¯-+UõûÍ`'1Ì8™ï&Ý²Ž‚öV óeÛÊôJµ j'"xýÃ&Hؘ¯£°,¬ðrx©«‘ë æëøtª«ê2Êtîxš9Õ7šê5%ÌP½D‹èsºÆï]1å@É·¯7*m.¦cÃ4ëÞCâ7âÿº.úY endstream endobj 1893 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1896 0 R >> endobj 1897 0 obj 3722 endobj 1899 0 obj << /URI (http://sourceforge.net/projects/hsqldb) /S /URI >> endobj 1900 0 obj << /Type /Annot /Subtype /Link /Rect [ 97.838 353.977 259.224 362.977 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1899 0 R /H /I >> endobj 1902 0 obj << /URI (http://www.jpackage.org/) /S /URI >> endobj 1903 0 obj << /Type /Annot /Subtype /Link /Rect [ 231.617 282.308 343.027 291.308 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1902 0 R /H /I >> endobj 1904 0 obj << /URI (http://sunfreeware.com/) /S /URI >> endobj 1905 0 obj << /Type /Annot /Subtype /Link /Rect [ 347.827 282.308 452.287 291.308 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1904 0 R /H /I >> endobj 1906 0 obj << /Length 1907 0 R /Filter /FlateDecode >> stream xœÍÛvܶñ]_ã“sb·Zˆà~T\»rs­”¤mœh«¥Å%×¼h­~}g0 ’+×~I›8ñÌ æ‚™öÙ`ü»Â¿²"dëýÙC, Y”R’2‘ñ4ÈÙž$OrVáÀ ˆC iªMÈŽýzVŸìÍÙo¿Ã  xÂŽgÁ‚9±¹>û OR¥yQFÖ‹<Ç%"ž°Þ³‹«}È^5zô(=2 þçÒûE"ü¿eÒ6×VáOƵé'’8˜~ñÜÂÒþ‹yD4 ð0ÅñSe,aþÆ#˜èÑßOîİò&Ïõª·øG.°»³Ë›³‹× »Ùº(Êp¢xøOÈnöì·ça¾øÝ¼=ûËÍÂ!þ`­- ‰kÄ/E*Xkö±PLö¦ªH“ DBûf'½jqì¯Õ^ÿô-kjöó÷Wÿ £ª.^Ç8"žq‹cž‰˜eqûksd/Ø*ÌCžÇ Ùó¾™â†r}_=N‰wªŸäµrM¨ïžËûù@ôêòÝ‹)õÛ²ëU {œP‡ÃlÍzCûõö— .ÚJŒ¶Ú¡®ËúnTÐ9+ëu5lô\³®™QÚÅkqJayÊã ÎÁ4̉áe%ËZ±ërèšúœÝìÃ]°WêAUÍa¯êž½i›áàñ æF 2.ŠDM bûÕßÕCÙ•Mý’ÅE±¯[¢˜Í ®‚|€¿/Eø2 þˆ ½`ê`è]"Ÿ < 2ˆšQa?í¡é”ïI‹ˆC¯LxäAg)ͻٕ[ßT¨¦ŽíÀ½À£F'R/«êœYÎ bÒù±µ<ùʵjT îaÌÇ—Z) ždiQ$¹ÙÀ÷M¯ÀQ’büy¿“ý¹Å†º*ïÝG醵rSö }YYÚFöòVvnx§…9÷x«ÖcæÁ{Y?ºE=kà×Yì8aPöÞü{oX§j…ŽOA‰ö"Î0/û]3ô ……BÌF®R˜Tõó‘ ­jà–áf;Bê)0qƒ×`fµ±1Ò¹'‰âKÄp Åé ÑÊzuh›µêº‘ÃÂà çAàp>Š€Î¶²nz+pÆu£iìÜ »õÑì V#„Žºêj]nËõDMKc„ÑbÇ }–¡§,½=Œ¡ˆÓ M–»þðIj°ÜÆ¢ÚMÔ;³Ø¹ˆ›ÞïÊúÞ1ë¼ÊÂû¦ë=¶û}S[wm½Û—½qÂÏ,ã¡êËDŠ/¢©p’@@V+¹F(o+'Ê¢³jîܶÀÝ—êJŠ©º F 6ñ„F³ðŒ¢Ü"ð¹Ó°VÜß=¿|´iƒàJö=å(^Yh¯díÍO¬f|Á®oFßÓs7£ìîݰæ4[_*§˜K˪šïÖârÝ6c ùJÌÄL‰‘¬Û ý¦9Â)±{ FïÞ½àìŠÉ d%Ç3) rÚ^Â<Ö=¶g©À—Nø{óB@õ“'1-þëN¡nEÂSR9Aw僲H'÷‡ÊCwJïš0t[·³„[ÈÚÇó<éà~bÖqW®w+½ŽM{o‘ÒI{Ù m­VÀê {ãÌž„ݹ7ÉÔ( …DA:SÈ¥ìvÚkÚš³Ÿ!†:vÜ5˜kѺ¢C‡å*¿¬·ª-›–}³¢5™–¼Và|=¬‹õü ˆ(‚>'‰ :F +ÊñÓé©"¢4‚¶ Êö4hòíá1TqcFåSGÆŒêYI§6ŒÚCÂÑYç̉V\×1–_a‘0íåJœi¹µlœ ³¢t[Ö²}´èA®ïårµsެJT†E7 ù…áÑ6åÆ .u;@pÓžîЪ­Ç¯köê¶Ù8±TÕ‘æÐCYmÎOrê ¯œÌ]Oi‚°mémçT¥cq8Ñ&E ô±,„q]¡èõD²¬¤É@DqŒ<¯ç–xÕëÛ¥-bŸPS—Bº0òJ'›ÙºYÚBÖü„:ó›YÚ^–s»TX”ÌfŠÒ0¡e[’×!†å¢‘•¸6€¡F¤HšŸ¨PZ¦"ƒ8*N,üÄ$¼žÀIYœ|Á¤˜‡{„0>1ÉäŸãñÈßq°ÝÅ<õa£ÂÒ¢øü¥!Ëð,L‹¼È¾`Ô‹®”C¾\NzBŸ!žÕ¡é„>©œ XJÄâÔROLʃOibÌçC½m•:Â9Ï¡b›«SKšÃÊ" ?{å(Ëx‘cý‘ˆÏŸâ†0)Ï¢OhSõknÀÜÈÇnü„MÛ2T ‘\†Š¾tÐݯÔå´n\›m¤l‡¨ Ê”.:ÙÓ9¤Gëz~d3ɺ¿Þ)]L |…i޲)¢­:4] ±VªŽÚÛ¡³<•l-:ç³ NˆåN!P§;}F%Ö+I€å6傟íð°„ϸ¥Ýè5 †^Uª¾sÝÆHw34Gܸ€Ÿ¼ ¡²^]b,„«¾YA3§ž¾ ›æpˆ“ð+ÂxJXÕg›N†ºæ%øV™n×ìOÉ~hUwR‰Ýp84­›«ëá´]š(›— ¦…Š3{RǶÍEÈ%¿XwÏ&—!ÒªJÑ­b: "0æ@nðwà„<@ãZ®‡Jê³ÞlP—Z yÀËÍF·íZº¦îæ«Öêh Q_Ð/÷ŸÏýR_9$‰¾&Å×= `HÔl.t öö—ïbïÅ$;ƒÙ„kp܆` ©£Ò~˜0ÀÚÇcÿÎÓ•!…ZYãV¨½ ZD}·k ›f=˜³dÜçnYÕÇÅü| õ ª9àùÄX×תega”ÜûbœŒf¸ÉÆã4ŒMŽEÆ ,šIÊ|7M¡5]Š [¼€“A}ä»~_}"”ƒOq9÷¶á6AÕÁcsDØFènÐÆß`étBí…½¢—XôZDvÚCÈ-ß_’`žWŒÇåÓÆ„ÉX ÷Ҍҽ$”ur<‡jÕâM ¡“g=k¯\_¨1|ïZ%éË1o½écŒ‰^tõQß"k¥ä~ÅyÂê°qç­( \2"”e8lìI3§§æ1tSrO½1­#Á#ž®„8Çn º²žák‹Óƒic§üIß ™­sûúá,JIýw’…BÔ}hjú…ÂtM¡AºLÔà­ý.GຒÓñ€ZKµú Œ$së2›FO&ûe&Û\)zSq2ÛÔ+£D²íPc&iñMÇ×¼Î)Þ7Ø×ÝPÿ»> endobj 1907 0 obj 3151 endobj 1909 0 obj << /URI (http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores) /S /URI >> endobj 1910 0 obj << /Type /Annot /Subtype /Link /Rect [ 518.867 519.426 539.999 528.426 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1909 0 R /H /I >> endobj 1912 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 507.426 274.949 516.426 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1909 0 R /H /I >> endobj 1913 0 obj << /Type /Annot /Subtype /Link /Rect [ 282.231 507.426 540.001 516.426 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1909 0 R /H /I >> endobj 1914 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 495.426 233.96 504.426 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1909 0 R /H /I >> endobj 1915 0 obj << /Type /Action /S /GoTo /D [1898 0 R /XYZ 72.0 720.0 null] >> endobj 1916 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.637 235.665 242.529 244.665 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1915 0 R /H /I >> endobj 1917 0 obj << /URI (http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html) /S /URI >> endobj 1918 0 obj << /Type /Annot /Subtype /Link /Rect [ 358.157 156.979 412.21 165.979 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1917 0 R /H /I >> endobj 1919 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.996 156.979 539.996 165.979 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1917 0 R /H /I >> endobj 1920 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 144.979 295.61 153.979 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1917 0 R /H /I >> endobj 1921 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.706 85.493 365.942 94.493 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1889 0 R /H /I >> endobj 1922 0 obj << /Length 1923 0 R /Filter /FlateDecode >> stream xœÅ[K“Û6¾Ï¯@yvªf $AÒ[{Hb;±ãM6Ñd§R‰ÑæC&)ËÚ_¿ 4@€Ñ3—¬ã”Ð  »ÑôÇ+F<øïFþD '›òê£æ1qâ Í áå!)‰.‡¤€Vn›ü`#(ìÉ¿®ª+|wõÛïP¹%t8]ycqªóúêgP ê‹8Im§,Ž¥E>PØ”dõºääE­Zk¥ïO·ÖµÀgüÿ`G¹½Z½ óÈíÎN©Ò òZ"mAiQ¸ª»¿Z*ß95u™ÝÕÛ³åu¨í±<´–tÕéAªò./²kKÖ-ÃA±O]®™¸òzÇ»z%Æûœ‹„&rÙrOP²ªm +§ýGeäMÏ6dÈÓÍgÑTµ’ìZÀñW¶\Ö­ã Öqîx,›iÆ™I]μŠL€ñ‰Ð„1åÜ€SŽ–ÛÌ’©-Vuu³©Ë2k6yZX¾\¦×–4!K‡¦¾KïpÇ gŸ~Êñ›MÖ¶Žv×’½ÓÐ ®ŠþÛ®n2Gñë§…cU»¯OŽžÊ–³Ïiy(Ù¸7µyn/ךûlêÈ(9ò$—s»vM]ÊpFÐxˆ’ÛŒ¼ùaMŒñÓX–$Ôc!˜X¯Žÿ 7£DîÓ2=["-š,Ý: ãY]]Ùò¿C/±” +Hípû ¦;šM-ãõnÐô¢ê±K¦ YæÀ›»qq/Ÿ>†&zä'ÎdŒ¼©†^ä2"-5;6"€=†'=@šp?IÂ$¾/õ²dÏ(yùùP7*è¹'ähÆŸ¶ýT÷Ç£IÀX$‘Hñ0H{4÷Wg1år9…‚XËNü€ÓU‚ˆFX_’bÔ€UH–+£ C™=>¢¡ÇÁÆ0I눩ÇG:z–¹ôL”÷mø2º1cOÓ3`<Ü )’Ϩá#=›lEIpDnS鑉E.ã!.ŒkV«fsƺ5î„çglÝ{G³ÆÎémBâñ2a™ ¶H¨·?°h»ºƒ2µÊÉYÅz]S$nÒ"8›}†ëì„?¼‘dzi›ãâ±Ú!€z‚y^ ´öוڙDÇhºw2î-B£BÌÈy€zÆ%°Bîd;Ý=Þ c<„OÙ¬Ê>wn¥‡iLgIL/ð<‘”ýc}ÂÃ; SS=DER$Òí Ê€E${¸8Ó±®2—Ú ¤¸U-LtVºÕhÚ,W³F`sÏô¼dˆ9|LÝ©¢¹ÎÜŽ#' ±„øÉŒ¿:† n(°}b/\înš^od ;| ΪËü¿4C.oHkã.$ÛlÓåuÕÓ¹-¾Y¯_þ’í¾;P û®,F¹' ØÙpSêîÅLzq8sÏ ™ÿ¨nœ€!ìpÍB·ßÆý )÷a+ñ˜ÍôÛwÝáùjõ®´=V¥"Úl%VÛzÓ®ºl³¯ê.kW÷Òí Ò1ñã_œyÁégŽ“qdDlFàï“æ!å2ë·Û™æà™ÈÀ­ J­Z½ªxÚgMOè5mÌÖþzß)ÂÝtŠ‘x4e„ˆªˆ€IǾ·¹i…M=飑¤ÕÙØ{Ã} !!¯–êjj‰Û½ÓiWE}Ò·/dÉ›DZmY9Âw¤t¤Ó‚]Y&ÌNŸÊ–Í¡d9è‰,Œ[Z, éÎQ“Úb•¦b,'ß]<¤d&TŒ\Š—Eê Â¹ÔŸéI¶uÖVO;ÑO8e –mȸ $¸çÌ!˜ ¯žš6° ©wéÊÚíé”m 0-Í Ò4°(¬×S]6ªq€°·ûlKÞOrÂOy›]”ÑCK$Í {n$í!Ûä»óPT3}s‚º¡_7ê†!ûzUëóèŠtã£nPÛ²YsHÙG¤a±Ý7iI-Gƒk$Tb4ßXÆ ÓÄS5zéé WÆ­ÅLÃcDÚuÐâKè¼–&F^•7ÃÏ´Êà°n ª¬\/g3bHgù™tyéäoš£zgl âíÝü ¢•N@-`ì `î¸ Y0ÁØ>%k\I2Æ(-õ©ÒÛUcZ†Äß|KÜç£E „ b(œÚÜÈc¬7Ïa!jtdd(óA(R¶g|¤£g Aíœ=B~è!’Ęg^âÒ7GCê‰>Ô20¨çkXë6”Î[ãÐñL po"g€¯§v¸Ó4ž•‘aA×§hÖÈ' à:°´Eèyl)|älFñB?˜H‹û|¦ßúcq ×’I)¢,‰0÷øeò»ž`b`ÚÚŽZ¯eìSÇ3wǼènð‘9·o×–hu‡²ë“ £×N“Ú!ôCâÍ;)B¿ëi!Y·t$$Áh|je-gOÄ\?RWò«“¬ÁGîÒ–Q^©¤‡±wSW»üþؤ*E+áßS… .ÍÌ[»Oçó»ì¹‚ ’™Í}!µ¯Û®JK—…Nׄ9ü5¹M»ls›ÿúË[‡* œÒdÚáEKÓÝ@ùåuÇOÉ™!}[—eíZù#ŒàòœÓ„ñ$ üxF˜#¯—³¦öo¦–5úúHsõ cffx4Ò|Û_Ë$~™¥UëÐݰÚ|FÛ§ ,·y—9äÈ,ÓÛ•|ù& ~òÅ nf3§Ûr#sâ]Í=±ÔÿÚ±¡ÿN+‡Ò×MÛì!¶s6^,ßb6£ûýönóûúiŸ¯VE w_¹.ßRC±$Ô±«nEè'0çt:QãâçŒyÞe?s>#S¢6ˆ\òe1ïf¡ðh2Î’ANH>8ùs¤ú:’¥I,#¹Íº4/Z‡£·$iuîö€/¯>4jòrIÔø '|àI03 …Ž ´!ì&Q´Üq}¬žº#“[l$Ì—Ç¢á?Ê ?ð(—ɈGv„sÜ’8æñrÇñ«—€+‘/HrÙL:.>zMWPÄGýò.öÅÇCîSù ¸Í¨?qj…{ˆ‡pÚ?à ì+ –ñ`òŽîH´Ç;77¦¹÷³Ïç”*7¨ÁǾ€Ã8 H¸êÃÄõK"…öo)>‘—¹ˆµ4˜ü`Oß&ñ3ò›µüœëÝ3ó1º¢Í§å³¶ŸSÐeêhò^žEšDƒüšÖa¥Ny4?QB#OÈæã©àËÝâ„z¡ÄœB,v“Ÿ©YÊÍhDAùѨN¡ÍØk_)“8ÐP&ñ…> endobj 1923 0 obj 3636 endobj 1925 0 obj << /Name /Im6 /Type /XObject /Length 1926 0 R /Filter /FlateDecode /Subtype /Image /Width 24 /Height 24 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 <1000001010101818182929293939394242315A5A296363184242425252526B6B426363527373526363636B6B6B7B7B7B8C8C188C8C39BDBD08ADAD21ADAD399C9C5A8C8C7B9C9C639C9C7BB5B54AB5B552BDBD5AA5A563ADAD6BADAD7BDEDE00D6D618DEDE21DEDE31DEDE39E7E708EFEF00EFEF10FFFF00FFFF08FFFF10E7E729E7E731EFEF31FFFF21C6C65AD6D652CECE73D6D663D6D66BEFEF42E7E763E7E77B8484848C8C8C949494A5A584ADAD8CA5A594A5A59CBDBD84BDBD9CA5A5A5ADADA5ADADADB5B5B5BDBDBDC6C6C6CECECED6D6D6DEDEDEE7E7E7EFEFEFF7F7F7FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>] >> stream xœmR SÂ0 Í¿§2˜:ù7ee¢AXg]ÿÿÿ±[S†ÞÞ]ï^^“ô]R) Dù"F†¨O7ÔtÎz~†O7äE2ó^ƒQ©$e~PÀo-œÇ·ŽÝÖ7Íü‚_ël`W3ßûVÍçÔû Ò£7*=¢¾S€ƒâ®xCü `ïŽxÄ/5 ªÆSŸzgÛ:/Ó»ë¢L¿ßßz)Ó'áÉÛZG¹$ÏÁб;…™ÌˆŸ*ÿC*}2t`ìts6¸Ê”xú…öáQMgŒñ'¶tøh¦`VƒÍùÆÓõưþ41n/Y\,8ÁFÔWxv_ÿ„ˆ™r£þ¥yl¯ endstream endobj 1926 0 obj 265 endobj 1927 0 obj << /Length 1928 0 R /Filter /FlateDecode >> stream xœÍÛ’ì´ñ}¿BÅ Pµ«±dË–óua)—³TB€Jyf<;ÎŽí9¶g—åëÓºK¶ÇøäB­º-õ]ênòþ† þ½²œ¢]}ó^ãÊ(ŠSb)"N#Žj¤Î8:‰‰ÁPLÑÃXbõlÑßoš›ýõæç_aÒE˜¡—›hB\‘ywó=0g)ŽSžç¹–•b¹`ã»mîkŠÞ´r¶‘^ŠþçÒûÅ„þH¡Ç›Ïn6_0D"ôpp!a)˜9£ q‹a1ñP£Ÿ?ùòõ\vï¾ÿµ úño÷ÿøôWôðÕÍÛ­¢\/ƒˆÂÿ2,#)øÀ’(üâE™Å;,ü—àXáƒA¤Z~:iÇê¿âƒ2i(õ÷ªa4)oñØMÒb&óˆ…$Â<ðe±gþ0¾þd«M)xG8OÉÄTKI»GˆùXÒ‹ Ø—àu%:Ƚ@ù$Íåè$FZ$³Ê ‡YDò”ŒeÔT”œš“ôý¡m>Â)’jFâ@ x.së©#E--Ÿ‘D ƒQÇK¨âñÒÃ5jÁÔ˜ù¢ÇN1…ávóØþ1¯L)¦‡žb6Hsă%,Ó‚ðLœ±ŠPÿ\š][Ÿ»²ïÑ¡:•MQ—øüôˆÿ©bw&Ú%šãˆÄ"ØEê§ö‚vEÁRìQ±m/Ž%:»§â±DÛWÔ]š¦jí–X¿„`šò(¢W‚0‰p¦¾[;Œr𣠠ëÃk< ó#r°˜0‚¦²°XäA-PãX/…ŽØ1qêQ÷…ÐHXvŽP=ÀkŒdá¾^ zÄÙ÷ÃØî0«BÜW_£õƒ=á8giÊ]´CdWÍ¡Ew't·~1ÜAÿŒØ8©¦õÃ¥´Š={º¶…poQÕôCq:á51Î)Žb/–1NÁNüCÂ@ç35É8Áa”Ce`^ãc —ñ1 cl* ‰bœÅöxˆZh½:®Çä©O?8²5ÖžÚv–EwŒaŽ>JÖŽ_ÛKç}yi°ƒîÝðP5{•Ïe÷:…ðW_vGoFÑW¥GøåX6³„õwˆ¾= /…/îÐÎi9±ˆ°ßK5u¢¬:›*ë¢?uÙ ¨퇲îñÔÂ,(?§Œ_óîεôøœ<“õ_]ú”ˆ¡f­žª³Àr½ûRî†JzDÁÕÁÁ7vüÔ´/8zc8$íRkKŽêß}ƒ-p?ÏâÐ^¤“¥¿zNå4©|éUH@æÀÞŽ<Ÿ*„ç;GzæÖƒŠü[ÙRÇâÙQªÞ©o>a;~8º%]YÎåx›I2>Ò©ƺ#‰ WÖf\þv>‘ÞÀ…<–MÙU;B%ºîï ŒJƒ«KÒ½^Ž•Ú8è!zOîSÛ=Ù1D¶eּΉžG#Ñ¿®šËoè¹èª¢[|v`K ïaŸŸZ(+…“!¨o%vTl‚e?¬Æ¤œ­¢N®™bULBðP*¿xDÔa Öä±€Å.f¾9‰ ‘äÜTwŠ´^p' ¨Ï!EcMt³¤B9,´Ê 0;y ¡€Ã$<áï{fâˆP¦Ui80…Á¦XÌÔD8É$bs 2±8‘ïÞÃÙº9Ãq3´q>‹ƒz¹Ù‚s-aP~2®³Ç纗;`[š¢³ÜC*F—ócWìaü›!Ip±…ͨš`ãPÚÏŽˆ6¹Xå{X° EàŒD,Å<2µŸ€b­—Åþ˜õ9¢h¬ F;KZ!”ÃB« ³K <Ú cþ¾g&ŽeZ·|S\`ŠåÍ+â\T¥$m†Ÿº2(§E¯D¨ÞY…Êk,ÇmD+†=øÝ¥/= ÎŸ^¯ôRÈo@Y¬à©,ÏøSÑûS SjXça¸êpºÚóeÙÎåIÊÙH]½­¥ý†c×^HHódì–íFShd Žœ¡ø «)º«>À É—(N+Vˆ6ØÇIDD{­býŽÆ+ëtýÛ߆®ØI'ÀÞHM ¨ße«AÓAUãÆE0Þ•ýÐv³¯:¨wÛîÕ¡”cg6勾|÷ý×o>wð±…¦ËÐâÌ©HøHÅ}Û|,dÐ *„¤¢SwP ¥÷íè×þ'Q’ç<ã3Ü•ÿúòÛoÞ^ƒ˜dK$œ)j[î ½;g¤.•{+ÝþIÜKu:Í.ŽF|­=2‚u½«FÐ ö@òîTlK½#Õ+ß­[Õ¸ÏJ45î/[_…üèØ¿?í·a‹yP}SøyNú„ŽÝîÛŠˆˆíÍÈ4Àb|ݯ4Æ2‹gȯñ+åù‰[#ƒ²‘Í wj[‰aÝ>—VÁŒôÉšÊV» ú •—ª?Ži0–Œµ)‰¾"p€mK7V…’¾P(½óåXô\üL¨/§¡:Ÿ<*:œzˆ'Šù1î6nN£t|¸IÁe:Su¥E¶?š!j.õŒ¦±.`†®,Q§ 4Ý«®!ch!³ˆG_º‡³¨šeJ¥*’*2ÄšjG,HØ„‹F…5׌DŽà,‚’Ý”ç8÷áõòèro„†\Âß ÞÝ…»™Òcy4ÎbYs(Bs¨*ÓÈ+ wÐÑëD¼iH«uvnDÛ<9ÂFD½NëÒü>i³³XY&ËD‰Êů¤ô™<=20²Ír,Èõ’õÄt’ª@Ô¸èvÇêÙ}Óç’¶¯“žÊKŠbk‡q Ô@b;:ºv¤Ê5öÔŒÁšôwÂ{tªžÊ…\›¦â 3MgH(ÝQaZh]¯è"­iõݯj@âTwÀÅ“Î+‰1„ŸÚöÉÿ4x€.14düh`›|åW]¶cùË'? 7x˜«#˜Nõ(ÎÉŒ`#“¥Õ¾­/Ž.|= §*¢¬ê}µ¾ÃtpË[iZ§9Ó]†êT U`¾ÃÌo ´¡ä¦„áÜõA:Í*”º[ýåSìPêBTu«Z/Uõ¹íݸ)”QZA*#«ñàÓ±oeFœ=Ú½_us ­PÆhDÈŸSu•›ñ¿‹îúvÈ)Ü:!ìõ«»²¯ö¥'¤jm¬®SodlD|TÌÞ 3´e1ÎQ"0>CíT]h(„3hó4ËfVbù›ò\6¦6Ó8ÕhàåØzÐöR¶5²÷U?tÕö"bþöú4»S(ŽD4÷ Òwú,¼±)ÐF¶\ù«ÁIœÀW-ÞãÙlpÝÁအÃ_ 2yzJÀÕˆïoâTÍ•Y,£A_ÇÄS¡Í}ª‡{2›gˆ$aT$ˆ8¯¢,ŠR®Ÿ„Ü›iyÀ|ÌE)ÊÅ€Óê¨CÅ»ÙGÊ—)b¤Áê‡]†ª·$…EN²oJ?pp„N($|õÝ”&žA-5"nQ£ç3‚ˆb&ƒÊÇ<bNÿ±BóÆcLŸŽ¸5RªøS… &¢øˆE£%B5mÇN£ìÃO:/†ï›±+Æb]—"ÙC£Ææ¸þ:Og 5b&Þ+EºHüB&MîUmj|¾tç¶—gªBÈôaæU¿;ç¡ìn-âÞŽöåAý€¦Àë%¡˜fižS>#áª6]Ôàl:q;%á$oíp[Îë]tê÷M­‚—fìàÖÁ‰¿°h8Ã( o$ÙHÐ]+»m™Éä#ÓëFËp$žâÄ|†ÐŠlK˜ )ŒÍ¬ÇN‚·øß:PþÒ­Ç&u(è¬*r ©«?P‚ÂéJ9Sð¥Í)xr¯1jå8É9DbNg¨mŠÍÖtaàðÍ ù’”-Q¼‰ –&ÉÕ•­¯FC‚Óï*¦Öl!’FK$°ßÕ ?£îâ{ºÖ3ÛB™Ï—HŒ[!a'NTßq}YôÅ¥å{ÝvP¾_š“xËy ÒJÔºÂ^¼68µ»â$ïØ‘Û‰ “Ew*~ÂèJÑq,÷ùÕÉ!˜n*ÓÓ')]"1mÓ(Æ9TŸ$Mý‹¿8önãUñ®«ÎæúX![o¶ÙÂzºW#:l_¼ö>}ÕIÎp[hšS¥â‡3šN¥_³ÍSAl”3:%à$0Õ«‚̵§†ôà =³í®Yá«â¹p®do›`­ t¦Þ",²bÕ˽|ø„ü^#Û€ÊÇò—ˆ@QÚïQäíÆU#'âÿx›†:eº¦ÿŠ–ÈÝâêdñ˜þ?d·£Þ endstream endobj 1924 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1927 0 R >> endobj 1928 0 obj 3368 endobj 1930 0 obj << /Length 1931 0 R /Filter /FlateDecode >> stream xœÍXmoܸþ¾¿bêhÔ´Þ_|8 —8é9ðùîâ=´ÅùPh%îJŽ^Ö$wïÐÿÞ!©ÕjEnœŵˆQÔpfø<óBîãÂÿËGœz7‹ÇaÎ…Ø?¦ÂܘDN /I˜@-†RdújvÖ/%ümÑ.øëâç_P¨‡„ð´p åZÍÝâG4FÄ’4M_=â&‰4á“y×W’Þ{/9ÿsï§ù®÷à‘›Åëåââ]®Ëõ!bÖC˜c/„„ør˜bL,øùå·»-ew?Þ@×ÂO·×õ ,ß/Þ.‡-ªõ*ˆ<ü‹‰Š¤£aà™DÙ8˜ÅÿñõÎt©QŸêØá)?쇡J?O3¨š,žÓ¤û=†¹ÐuHrÄ…ÆøãëwFÍ RÚvH¸n,Ee,)~d›…*2Aì@øÄsÝeÖ¨"ˆR4ä =šHÔrÊœpÞ’ÐqÓÈ;-5y¥ÞL«.-çî±µԌԮÜU£uŸ7Š«›zd˜¹N!9¢a‘Õ e–_€()b‡*â 8¯ëx:Rýð´ †ÏñÆ-2žkÊ’6Û:X:ŒFXÞÜÓ6g»­ |‹ýçê5ÜQ†®Û"Ýwqÿ¨0 G…hC›îT”™Pñ^v\(0´eØñ!¢K!¶ãùýÕë7ðÓ‡MÏ4æžZhÚ ÜX/àÍ-tk%Ε›S&ªu•ËMÝ¿”d⨌¨Z.²6§ÕUƵ‡ë®®»'k¡3ƒó ëgÛ Øf¨r°;5ˆ ³º¾e- XÈ¥óŸìÕý£ë±¿×;h)Â-:܃€3Á.:FÏ 2öW.dÛ-ë>á²ÕÎf,5¨Ve…︠ tõ5ò3šB¬žÊ ‘Ï3­¡,¯²úhohn•­j›µ85âà©ëkôÚ±HÒç£>Mæðëª"0‚Ìè$stÇŠ¢kzðË‹ ,{cAI±h]Ô¥ByòTxŒàXI^ß|s}ûÖ²U3ÆÚ‘éZbYäÇó ž°òÇߤURbÿ÷Ež¡óøw®ˆ–0ѳå £\™Èì+³rñ¦ö†QŠLd+ܤEOÎQÑDê‚\¬,KÝQ\/ž“¹M"•UÑ·$[3 Pù#ÁÎvñ­©î:Iâ%_Ú|'˜ÇÕHiÝñ¾Ý¸–E®ÑRƾ°!‡SMÁ÷üdߟa4g综?ì‰!0L”Xú¶J¨ÂËû­¬¶Æx\Š·f‡¾Ÿ Ê… e?ôNf¢Z‰¼í[Â¥ï;´¢ÀÔýjä‹u%—üØhH#[eU´Ý>YÚ¸Ÿ¸3(º°Då³îä'éJR–3’c–ÿÛ¹R]èlÏ?“mRÒ¤»®ê[w;•Y²ù–•¨ºÛÌŽB‘m1g6ÕH$xÛža¢Bg> endobj 1931 0 obj 1955 endobj 1933 0 obj << /Type /Action /S /GoTo /D [594 0 R /XYZ 72.0 402.007 null] >> endobj 1934 0 obj << /Type /Annot /Subtype /Link /Rect [ 257.41 311.74 329.41 319.6 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1933 0 R /H /I >> endobj 1936 0 obj << /URI (https://sourceforge.net/projects/pwgen/) /S /URI >> endobj 1937 0 obj << /Type /Annot /Subtype /Link /Rect [ 225.27 191.78 255.27 199.64 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1936 0 R /H /I >> endobj 1938 0 obj << /Type /Annot /Subtype /Link /Rect [ 272.4 191.78 506.4 199.64 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1936 0 R /H /I >> endobj 1939 0 obj << /Length 1940 0 R /Filter /FlateDecode >> stream xœÍZë“Û¶ÿ~ìtæÎ3wIðy‰ãñ+3nÜX—¦Ÿ§‘8‰gŠÔñaUÓéÿÞ]|”zŸÒ&v„]»‹ß.X g6±àß+ü "‡ÄÛ³ͳIàæk–ç; ¾’-ÑDè…$ÃŽ£&vÑM&¹º·"6ä·³üÌ">ûô:%Ä¢ÙŸYáJÌòìPîù”ùaEÚV‡Úaˆ*õ¡oÉâÝÖ!o Ù»µYÿsë‡1Ûù?°È"ë³W7g‹3$`(ßìxUí‹2!›4ID¾Û'ÓQ!›â´I+¦z#Èýë"ÏE\í¯Û‹R<4i)*rÃ'FïyyûŒN…G áëŽ][ª0‘ŽfÊÝà‘c·-GÅ&óÜc.·á”`€6öùÛíJ y#ÊÕ,ÈOü+'o^ÍXn;¶‰¦r~‚Cí™Ì a€ïE¦÷å˜ë¯7‹ºXHj‘~q]”‡oãR€Ïë²™qªíÚ&„] üé_ؤØþ÷ÌHÏ2ëãç‡äoêÍêˆ;ÞdõÜz…œƒª]޽«”ò7‚ÊÉ(ïµèu!d@R5AÄØ+ZGbZ/ç¼D&è(²çœð¬*døÎ[û:KE^k[µÎ}ZoȯßÏ( #Ó $K¿ˆ¡‹ïTzüþÓõw»¢¬¿ÿ¼h“ËÏà£K²ß¤ñ¦ŸÙTKš.SÓ¥±G@p¬Ðôù½hHÌsBnoŸ“ºÀ%·MëKR¥©%0 ïZð-h‰StÁíÅ~sxñâÅí³=xH5ü—5ÊNa‘‰-˜(åâ‘7„„C¨A£VŸž* ž>y2#Nƒ¦#.j´“×dùÝE&g„«MɨØçÈ“ðiÓù®,àøš.g´±`âÍP×9¤ó$Ië´Èy&§«L rßTµN‘0f×”»²ÙŒ2ן8õÇb/ P.É»ó¯ö? ¾ öi=Y´³¬Ó|MR=ÙvFsJ<ÀÒ: Z³Ã D5&xœãRÜ)Ü.;áÓ6ÍpöÁìÞ·gŽ« ;´¨m‡°­»Òý$2ø‡X—\ìÓ,«á·¦Bsz£§§žfEÌ3Ü/¯*þtð¡âoC925÷4ä´4—~0ïÊb{T8ö.šrÐ}3êþÓ›W¯¤ÌýPŠ¡@ô¸©iÕBÍ@9´2ßlà$–¬äd¥£>²ýpF”œgS'!ÜQÊ^ÕÖ()BOSz–3ݺ¥eÄÕY±îT]›÷Í®àì8ïÓª¹h*›<‡ ™ž÷,טŸt>[ëd³·M’¸"Ú¶4Êì/Ám ™¶¦XÝ亂%®Ýæ«¢é¤vU'¿èFê“ÕäC!o'_â×—ûT«$O†ìÆLcWM±‚£ø«4'Jc¼á»Æàº—‘»n`c S Ê+Ë‹"æëÃñÇ&'GCÙŽ¨Eˆe…3Cuê9¿¾MáðgT;˜M»ÂøxʼÂh%«QCIס²ÚÂïL}oKµK•²&Ñ(±¿çOthÖ¸:³'€Y!+jí†;b<Þ ]OÔ8†ž‘Mý]£Žº""‹†ŒÇ@ý}_«èµjÖ¨bž±fè0Ó?¦u©¡Gèh– Ήbšù>ˆ÷a•µ¥î±ä¸‚“iëÈâ5D?žîÈpÇ;±å²JÍ õöóîNí)˜"23ib-êžà}Û;,ÿ|гݴû Aµ÷"ËhOõV"nÊ´>Ì,=¡þè È1T4KŠ#sáõÈÀ£ÆU³d Dk1:D%ý ÿZ$ÓÛË70ïÊ)Èž(¥=zRòk¥NØxâ• úh^ÄÆ¡,3̃žz§º/ßÞ¿¾\.ûðñ1Òñ‚G(š 6Çg'¶SÄ C!»|y^‘›Ç$g×ñ)ƒ¢Ýr擳‹×=ê{›,•i2äbÑÈ<Øßò kœçìa!u‘¶ö@‰7H'â‰ÇÐ3²©ÿ Óá¨+"2±hÈx D Ðö´Š^«f’óŒ5C‡™þ1­{Lr¡£Y&8'’³Ëð}ÉrXŸœ‡ ˆœçb߆ñù·'²±ëÃÑ:p!Ñ·²–ty·¦üÉšr¨cãå>³gWuY´Ü}n@܀ œÜ-¼'ÝÂ{8c¾,=Û¥.”ýŠÆÔ+š* ¶;Ò5+ÔåÔw«@—–X˜wÒ¡' qe‡Øæ1\Öð_6)‡Á<Á3¶‡8u›Ú®mÏÁ¸ˆ T§.¨z–Ô^PFÆ‚>_tÂáÐh ×,cM ñ<1¼u´!È`CÆc,iW®)ß1 |Ø9•QWÀ`bʈq ìèZv¯N³º÷WgÖŒ‘oLW˜f·"0ðP¬ ÇÉ ,1Ž}OnEv{ÂÈŠ°øù":b‹W+-/™±<@´íÈ—É6Í¡l*y]”U/M(T»¸«åYCQ¹IGȃ‹VÉú›]×T‹»#ÛÕ:Ðõ®kmÒõ&;ôC›õZ´Uþ È¥c$t É€x½ÜQYZ×YÿNë’o;úøAÓŽ…/W!›Q\Þ½0,£F–ë3ÃvûµÈ'gœ“CŽj‚,2èêö©aŸÌƒ‘eQ&sq43lS×»êz±>Oå¢^n÷P·W 9ƒ…!Óeî ™ŸÍÞî) ŒùÎm®G#ß"ŸÍÅíœû{ÑÌlšãê6ã Žš _É(Ô]P("´÷xñÞ“ú>3¾”=ÕÞthòÃr œÇ_8Ä<íYúNÝñºe _%³BËf‘33eéEãX‚ÈÅ•}m$ù>òÙ3’ÐT}»©¨W 5ã |±IC 1ÃLï_¼ÀƒÄDoý® BK5rÍ+B_)bùËû+¼ì,J€®ïÓÖ.UÇÑTƒ›9Åp¨uÙø ÕøÕKQîQí.Ùõ_Ë^E,ßT5Q‰¼Jëô«¼‚U,Yiª¦ -mx‘Ÿ›9à ž‡FáseG耶ê“D._g:Rµjw·×’Z ¥y-Ê])j‘ôL^õíf˜]á´²5ªmw]wV Dé{PE+L7´gÜ^|ȳÁàöÎY™ ëfÏКKeÇët•Âp¸œâE^{¨g "·1|dùg,vò>½}®v"NyF¤ïåsäòå%Y55Aï袛g{~¨ä+Tyº|ùT=z€ LTÕí³i€ûpHfŽ…aо*`ÂÏñüˆÛôàÚeüæëK°Ü&#ýQ…7>fùXÖZP`LuÝÞ>¯ˆèÔЙ©¸Xµ»°wº~w[ƒ(©‚9Qf/»£û%©õTåâÇÒºÙ%¼Vw æ­ÃñœgãFª+…© íµS) NJ øFBxƒ5àƒìÐûø ýñU endstream endobj 1935 0 obj [ 1934 0 R 1937 0 R 1938 0 R ] endobj 1932 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1935 0 R /Contents 1939 0 R >> endobj 1940 0 obj 3093 endobj 1942 0 obj << /Type /Action /S /GoTo /D [591 0 R /XYZ 72.0 413.68 null] >> endobj 1943 0 obj << /Type /Annot /Subtype /Link /Rect [ 374.365 587.136 440.456 594.996 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1942 0 R /H /I >> endobj 1945 0 obj << /Type /Annot /Subtype /Link /Rect [ 504.001 493.348 540.001 501.208 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1942 0 R /H /I >> endobj 1946 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 481.348 96.0 489.208 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1942 0 R /H /I >> endobj 1947 0 obj << /Length 1948 0 R /Filter /FlateDecode >> stream xœÍ[Ywܶ~÷¯ÐÉK“sÆŠöåôÉIœ¥'MÛØ¹mOÝzF3£T#M$]÷×_Ih™qòÒ{³™D @‚à’/g¾ãÁïsù#Íg¹;ûB4ßI'Lˆ'ŽŸº‰—9;‡@gN%+в CE¥Ú¶Î¯gõ™ç¼9ûãO¨´r<7vîϼ sdsuö 7L²<ÏI×Àõ³LŠÝ ËóüÝ.p^5ª¶Ö^2òþçÚsB?ø?ÐÈs6g/®Ïž¿Žßs®×v¤`ØÌœ±“¹¡,æ0&®wÎOß>ì‹öê—÷NS;Ÿ>¼ûíÙŸÎõg—×ÔEÕ^ ¢þ¤®Iƒqä ¿°Qfè– #7DP\Pi§>UäXú)?èb¬ …?†X±Æc7)‹ý›ÂOxD6ô=7ø"ˆsfþáøú—­6q¤”}¼?Þd\ýÞœgð)ðt)ê…EÍš}imW°¢ê†–Ë¢ë,î·…+Ñ‹[Ñ1Ê}ÙoYãúÁ‚^½xÉÄVeQ÷ïÛfÓŠk)ýï˪²¨.ŠS‰©»kVåš }€Þq¡¢ëö¢ß¢“™ñod=bê&ÎÓ²^V‡Ua06~þ:û À~žgù”ß¶ûR­nÝÏ¢ÕÍ'.ô½ítÑ™â}AFÑM§%`†F&¸yZt7Ï\CÔ¦VDmyê¡ Á¡³&У@–VÜ[ˆd¯^“N^î†Ò–So„†žçùYˆ½—;fu>‰' ›vã’é}Y¹¯pÄþ(j±¨{_Ö›£þÀ ™æ6á¼p„}ÙoË¥¨ê§þÂéÊ]Y‰ÖÙÚ}f“ƒé˜úaž»~Œ£$žJ¹úR]7MuTÇ(òO´v'–#×÷3¨ã…ƒ(‘ûnf|€ü€f2‚ºiw¢²X®Z¬êB ú 8•°Ü˜Etx M”=qœ g!øË’ŽÛÔ‡ï0²$ ¦]~̦ažhÍTÂ)‡åªášñ/ƒ^NŒ³ÝÄII2ÓZÃj–%a8ÓÚµ ¼[ÛòeOØã¦þŽY þ0Û T†™f|=@S/Á‚=Ô‰†1ÌãL×b½aBt[Ø27t‚™•-ëdEU±‡Š1Eµ]K¸nÆ|-Œ LÝ…%è= µeiR‚±r Ùä{¿ý€ÙÔ~Y>²ß£9m%íþ£*v‡®gp+0ûÃÝ0¢¶©8<¾c‰r7 `¤ÊsÁ©^¯^\Oº u9ÑtÁÄãââöÁfW¯í÷Uý‡~Û´å?B® Œ¾Z£í¦à‚;ï tÙXì_§– Æ±Üø-¶{5,î0 #ºM5IÚ´›kˆÃË÷e·u RRsÿ‹I0!ƒw³üq“nÚš2Î>,?¹xõã»O nö4qc»#Ÿ¶:q°•ºA¹bæE3~ OGÇÉb9 d$PÓËfÚáLžz,¯t3idÍÔsN,ïsÕ)T,lâÙ›®i9A>ʘö’XGM±îÁejÉ)PöÓœ*ˆ37ƒ5}ÚÍüT/¥¥3ßÍiNaÑ,ÜUlÂ"-Ô C@_Í6SuU0ÖV¦¬G-"šÚSްL+™n¡R ´0öaß–w°mÜV”fÄ£iÿ:¦‚èG½š1gêÍ©÷HQ,g¾î#Aý Ò‹"^Ñš… -7Ûž³Ù–Ë푺û®8¬šsš½DüùÓ‹÷ï^rÉkfKXÞ”\'œíЮi¹ì¢Ý•]Sº[Lm•#[w¸¤ùžò­é$b:tÀoú É³Þ ÃZE¡å>)VgLCKÔÙ‚¼ËÇÄmZÚs ”s‘±»±þABQËŠèXÁŒU³žÚ-Fvc¸y¦b*4ˆ eßÕz:dCÈi’8ͳœv`W%F€s?”w?fÜ;âßÍU BÁʃ{úÌ2:¤ìg¿jxåú² <°Ô$Þ”6róŠè,o¨Ê‚ÑJÎ “-Ýgˆœ5Ã0Ê×.«o&û÷3·Ùвö"ŒåÂÐ<1]^´ÃZŽw%î¤ô·m1bÆ`Y3`²jj(na€ºŒrÍÅÈExWþÙC×ò0FÆ‚‘ÛbuXòz°UÃÉ5œWÓ'©ˆä)‘d?µWä í%؉r„ì1$¿Q±3Eí3D·Egk)+bQOUDW—ï/_^ÏÕ3’˜[ÎÊzçU©’$újN ¨ ®èp"áֶǃrVíöÁw°³-aÆMÍCs ‡“ÜŸ«Ñ´°ØÎ~.¬@Wnjæt SÄâïe±7[)E¢+ÙÁ,°ãOŒuÄ Ùù}ÈÐ#\–ÿ*Š=S©€l¡w-áb“º°ªŽõéò·Ë—Ÿfrµ0‰†Æ’i€l«8E|-lÃÊ#8Rh#øtuñæÒÂŒÌ|GGˆ{Ø|éëM¤|hpŸÎ 4*™F¼¬ŽëŒª¼ŒáAñåPÞ‰Šn9‰gc˰ÐS¤Õò˜*U«©QÓÑÒAgÁI•ßAPhk\Ö(nàòÑÁܱˆ7[,h©¢ùjy´VëÈ7ȲË©/¬º:/Sà¶À•AËbÈœ¯jÂzh©³Ñ Agf&ëÜo¸XˆüÔýoZqAßúUs_?r ¯h3ˆÁ~”åtÀ#ÍfúLK˪Pù"sБ0C¸Çs è3bÙÚVkç·*R+œÕp,h¹5áw&ƒb/±±ÝYš ć½U«3Eu‚EåHêa³›z2’w±ãáäW—"ŽŒÃ—­|Äâ:¿ÊîÑ­ÓBÖ;2ImµyÕÙ_äû©|l#_cE°×•.—›Õ$u£4Ï¢Ôs|ù<L¹>û_!‰y³¤¾ïäCR%IœGå yš'@z ^‘ Øh#†¤_íM„›º)ü+I™ÖÞ€ðõ I–ÁŒ˜`$g “ý°s°G¼ª´ÈD#NøAý0 V*‘´:cÙZî°±ÆÚ=ªÌØ:DÇ<ÚÊIPIc×O|Ï÷ÒˆÎ$à×gq'œóÏò‰è·Ïûæ9»wÎÏåíw: |ÿS5KQm›®?ïŽ_p€°YEÔõÍ~KµÛZÇÃÓÐMåãÈ4ŠfT|ôÞ+üSí·ÅRàqâ’)¦ì˜!0Êb}³ƒ4 \Ù~ëØ‹UT6@œŠö#£ò¸6öò‘žnñQ*äH=¾eŠ!ŒÂ$ð¼0÷‘çÇC]K¼U ˆÀ¹z{îœW¢Ø5­\q¸1 ç4L¯…äLÒ/ }ÜÖªyM¨ ÞD«¢yæã&²ÁÍVCX¦z0•ágZ‘º„þ£ òÅ^=*x«F¡;ʹÊÇ.¡ËòDyoîuÔ–OY¨'5ä òÒÔ{êšÛEß¾'¸ñ–ËdZåZâ5¥™ˆ ×é?Š¿÷•(kVE>Ë0€î²©moZ`©ßšá@>ÐCÀýí¸ ïŽ˜°~Î0bš@ìiCJ”²f@or 2ÿ3ªtèb؈!}'N­Ç‚Ë“gZôáÉ¡­ÊÕ“SzžÏQ4¶åW=ô›¶“ ["O¾nÌHCŒF,è´,±‡j‰=I³_¶¶ ›ÄHÀ €å;}ׯˆUm%°]-(ÆÑñ Ò^—µ ¦ C@/a¹*ñ> endobj 1948 0 obj 3853 endobj 1950 0 obj << /Length 1951 0 R /Filter /FlateDecode >> stream xœÍYÛrÛF}çWŒã­²ì’ Ü <豋‰D9"yËr©@`("Æ…ÂÅ ÿ~OϼaììSv˲IƒéîÓ§»ÏÀ/ƒéøsFCßdQ6xi¯lh2Ëm/9.3†š«{,cí/žã±”|¥%íWK\mWË_–ìatöaðù ÅL×¶è½Íå6³Áï0åz¾ï·¾ššáydÂÒ\|‰2v>ÉLvYˆÕ÷´‘þ?÷~ß#Ë0ÿ<ÒÙóàç`pþ‹Ã ‹†ÖÌCÓažfÑWœ2öùäj³âåì÷kVäì~:ùôö ~Œƒ6Dñ¼ ‘‰Ÿ¡&˜tpñõÃ;{,Û^ß]Å_[³ä5\ÑàR&n¥mbÛOºÑ}uPòó»À´[í=|œ&Ø?iü¡ ]óraºæü‡üú‡Që%’lëšoÆ–—l7ËçAõk;:smK3u]‡»%g la»> é° ¿í­HéRÿ‚¾óVstÃwc§i's·©y´«l-†wh !z ãwÏýØ(žJ›ò[Ïä6×>óRmjgXܦùõl|÷Çøîityyýôþz4›}WçMUž§E¦çqRÕçQS–<6ó0ÿªý–LrccÃÕL±³aÈ­kLGóĤKšg¿%«ê°¬›£¯Ë¦Ž‹uÎa’6%¯NÙ¦hXæ¬ ¿q²´¨Y±`1Ÿ7ÏÏIþÌê$ãl¾Q˜³Íö†¾ïùng®æÙª(Ã2I7,Œÿlªš¶oFŸžfÁè.xšßÏX˜ÇâR0¾»™LGÁX^® øÐ7e;šN‘ @k*Mê:嬸ÆK¶^†5Kj„W4iÌêð+8Iá6QÄ«jѤ[Èî4¾-ÇF‡ÔC­Î0Âf› áiŠ'\[æÆÔ¿Ÿ›¡ÕËÍGí¼4 (LA-^"–ó>—ßX’Ãé*s,Á$sD½Nêe’3…Ïê%å_GÐ/Ê"dsUÍšŽÛËr"»ûè>¸zúer=fÕŠGÉ"9GƒBñ>žLy½.ʯ¬ÆÉ`Û>Öœ5]g¦¬*ì¹}¡‘ähpg]—ˆŠ,kò$ ë¤Èߪö:½lÏø*,ÚIëd…9÷-Lâ2áVµ÷áüô–ÝWã;6û8~?]³÷W£»Ñ{”øLUw¦'„aw=*¡‚"à_T @Œ£M•­e–,HVPç Áê}@álQ>žTo•Tð¥’ð<³M‹¨•ÙÅ!ý–EUÇsãJYéöQBU‹Œ¾¤D™Ð t«Øköî›Lè$˜ÜNYp++v†§"¿ÇåJ $9ÂV˜4­^ÒÚIÓJ/jÙlÞÔÔÑd­«±,«—  A¼++Yåô|Ω*özò>Y­ n%µ¯o°ükŽ1“¨ÙæQ‡(& G-$×N¡ÑYZ€ºIÓŽ;u’-Ç<®½ÙÕ}pyû0}êÒ]ä1Ï <•©vÿ Éa û’cö’EéÞ aବ5Ñ—ÇX†²ØýJ÷=ã84Óc‰O[[ ^Ò&µ2¢öREý‚ €ì‰Q2jºJH €>H›Ê ¯÷²A;|©¿jÇ?É,•×¶Þ— '3.+¸C&Z†+R]b–r¶}ýq’ˆ&þ¡IbQäD©¸ÈߨHoë=1-ƒ©5&ˆŸjjØÆ±–x½mÇç„ÛùkK¸ϵv>ÎZE~P¥µÈ«LÔ¾»³F”†•j¢ÙN_xPŸâa|ÊâFêlp½äk yY4Rrf(U(ñ½"ÁªCrûz£ÒÖWÚNò+.¢Š…sÜWÚUXDˆ*l ‡ÇeFÎÑy”ý¤Ò?ÉBnc& ca•’vžÛçܧqPÞðÄÁ?É¿˜„hP™fZ좠ãŒ@§_•9¿/>$8dìñí©Ý9o§Ö¶¾ˆfõxb@& OÑ’G_É¿ºÁáAq:×ûÚãñÄ”S§“oj° Çï-†®Þ%çÂã@¾ ¹øT»™ÎßV§c ʈd-¤ KnZ‘¶aó‚‡Dèt–¢E0Ž<¥`ó¾ÃJ”lùJÂÜ´J°9Λl.»bÇ 4 pê9̪®XOBqf X&å¡7 ‹N_ì|¦)Hxƒ~7„+…M,Ør¶9\‹[±¿ c®uœBA™$Љ¤´œ‡t½cé9œ@!ÛZ}œп£taO¨ìÑ'Õö#j'É:ÌEE»-s–¥ò¤àx}]2Õæû7¶h唘á[5Þ‰éèm7m© ÿÈSßì1bG©ÖqJýö½÷.íaTt‡nÂwï »7Š×bú±´éXçß=RÉsd—­ÎåK7Ãèq`Œ7û´–óâ.ß^%ôÈßýRžP\³'ºÛ j‡Ç`ª¨€À³ÎßU]ÂoÁ/ÑÜö©!F¬P© KV_u/ÄžqîCÊÃ6”C)õvn›8–e†Ð•ï)õcìU ”ðÿóÀ^, 1w8^«ÿ`œüÇÑ¥² endstream endobj 1949 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1950 0 R >> endobj 1951 0 obj 2528 endobj 1953 0 obj << /Length 1954 0 R /Filter /FlateDecode >> stream xœÍY[wÛ6~ׯ˜Uœf-š÷Ëîñƒ+‰SÇI#%iOÓãC‰Å†™ åèßï êBB®öt·iŽ$œo0ß7ƒr?°ÀÄ?#ú"æùà^YØàøjÈóÁ ß !õ#ôBÈhâÁWš¢¾:bTÍ–?–ðuP Lx3øýœ”€ixð00{Æ¥™Éà÷|ÃñÃ(Š”¯¶a…!A8†_æ9œ]å6\–bvë=2ÿçÞï{äXöÿG&Ü ^Ng¯=°L˜.v0°6†9°= ‡¾F¨‰i¿?»Y±jòË5”|¾¹úõ§?`ún0žª%Š÷…ˆlü?0„’x®yødOeÛñÝ(þu GŽáˆ.åâQ¦ˆUŸô ýê‰@ÉÏ£Q¦ö^îÒ$"öw‚?½h™FxÀ…í;{á?Ô×ßµ‘„m‘kYM%-¹>¬îå¯ë‘BÃ6MÝ­,ЄëGd"‚üF39#£¡ýW䀹óÖðL+ò­®ÓdÉÞµ;VeiéÁáî–ÿ`àqG¶qíb‡ª†ZwºØÊS:aj|ùKè@†@~ëE`+½ÂåÙ&øT]q²RÝ3x¹„-â&«Oá}œWźüÎ*xH³ þlx USÀôâÓ›ñôöÕõÅd‚ê%%ÄÕ7@ªvÃò [€XV‹2þ竌A½Œ…A.M×K¦1M£|Åæé"e ¡49+jþ/ ”í¡€B=J¨«›/^Ý^\^^ߢáÉùɈ§¾‹8ãìžÍšŽ¬Z³ÊXU%–Á:eÔ× ¤¯YœüCéx†QFþñÕõ¶Ê1|e³‰@Õ-Æõ “c¡¬,f8„²º3–ü>Kf†ZÀÖè‰Æ¨ç"ãmNëîMY3á!ËW¸V^Wiq‡kgs–Ð7z4ÏbΡˆs¦cØw%ö©g˜×qUs µq±åþ¹üÕ‡ œ.»°)› Ê4³Zeé<®SÜ»„éI‘ðíyj0ãT,ã-în—/AbÐs¦ £C–ÏX’°dˆR {€ß~2a&¬†ÉøÓ—ñ'I‘XçÇ‹é[¨Ëçè8Žä±×}’`áqÆéñ¼ÌxŽDMê²`0±bMJN4™iÚ2ÿOÁCVÎãlYòZ' Û².ÑÇógQVк_®7d’e[=~·2*E݉±Î£éõDE ï¾¼WŠ‚ÝSdåª@ÞS®Cs,¤Ñ|o‹69;=”)¾«Bû°LçKYÉ•YI"+\^& fX§UÝ0( t­.×èg]·)Vgü¾³ ÒV¡q‘l}Ää{(«¤Ï Xƒà™:Ÿ©H¼ØcMs¬ñ|^¥¨i˜±¬|ø·*H ã$I‰©8nWNÕÕulhA®¶p%ίRÌ”NpA'b'«²B=µÎëòÀÂÝò/*÷ðäD#}åâhDÑN6!²L—¡*ˆzÄOI#©@𓥏š&EŒ”ô‚÷ù ªVeפ•!–¸bŽ´ið¨Ç;›£ ¹­á–›.¬¢4YÅ깦êDÙÃbÔÜ’‘ Øš‘˜Ëæn‰ÐÙFàkà¢ðˆ2“’Ì›-—%º²n›a`µY`Q§5Pˆ †À}ƒO8%ê]U6«Ý>-$€ÃíZIë,:u’_ìG#µ%,K󴦬ּ‡‹CNu“œ GÄ”6æëÉí‹]j-ã5&3Ã`—3^fìXp\¿ç).žÕrP %Sû"‡销´‹ß‹5ß`dsãÏxÿ0 VœgF[ÎÏVq½<«Ë3‚;[Ué:®=æôXá÷º£Ç!Ú²sÎÙ¼bõ¶ iL^/§”èÐày]5Z‡BÙáXvоtu£+æÁ›õÆeÔ˜d†ö6”ï/~Ãôí^_]áÃ×›ñ§Ñ§ñÅåèÃÍõoÚ¶Ît{|L˜ì“¨ä‹yµ‘[FG|bÙ=F{ŠþŒÛ&M0yWñ†T×5¦MÖ ZýöÓFt¿lÞT)öfqEjúöœSÏ¡±a;=Tí¢^ç@Œ1(Í´RcXE›$:¹Óa-1ÙÈ` ãt)$}‘q^ !ŠŽ‰!²brŸMË2Ã&¥X¤w² }{NM‡ì¸x}v¬J8®Ý£öâóôí­ uWi<£Â¦v}2JòIkÈé€1cH°­9°…¦j«mïíždy+Tt„¿ÛÊè&ý䢨ˆ^Ft®äùšâLy©4öîòå+ìÉS&·)ÁRHåÛ[ Thuij·¬]}^6"49$ÔPc?+¹š¬ªxê# Ì!rOľ›¢‰¨/ðq—Ìw°,Á>®Êã w±” IªjôBw2ûÍÆ~7$Ó„€ÏtµBHA·×ì5²`ªólOžò—í±K ¡vu—H£¡Ã²úÛÖ­wvÔåí5ÚÏQ¹)9G2Áâ‚Ä©í7ƽé¤"ƒ¾¬ã¬Ñ¯Ú {´íÕ q^£B!N墥¾UŽ¢Ö®Sd©`Õ©˜ß‡¦Àƒ‡8ÈiàÜ~#!”—Jà˜ Ô®°]@=sA4Še¢Àêª]‚×op uvKM»JgÊY¯P=Þ]»~·Çx&UwŸáù.3ªùq‘A‡ÆW×Wã›é-¦ºèmG—»8a³æî·M¡Ðïñ&ÔÊ¥XáØMòUoD(MÂâÅ%-”wBÁñ¬DÝ` Ï&“k­×Q·%ÑÝ'˜ý¦B[ÄÚ#™Æ„%¯PßüïªÜ³»ý…:žoÃþkþóì\÷®Óo"~k»v&÷a‡´áî¨ܯH J¡ìâU©Ò]ÌÈK{¯9£“-Ö¡9–ÇxCÇ6,žÅ6¤jÖ‘Íõ6g¯ƒî-3!àËtð„©«Ÿ/rÇÝ|' ½ïÜhÍõ.­ÉÝ]ì›{§n·÷ÖÇïˆ}ìöÕõ&][–á·×Äâ2Ô·üÝõ¨¼IÝ’·³{6Ä•éÁï'ÜÖ’ÁÈëaDžæòXç–fº±ÃÖ;4‚ƒ§;¤.¯{0vçÀ§Ýu…|0ÕÒy´?ð”Ñöã*ˆª:¸ÐÖx³OX—Ÿ®wO¹â>ˆŽêçÑ»nÛí6eøßö%ïS¼[ŽïÐû¡ª ˜’UYÖr7‘‡ƒÝ¹—6œó¶¡+<7§ó½“3Õ‘ý\¡fùd7Ɖ endstream endobj 1952 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1953 0 R >> endobj 1954 0 obj 2429 endobj 1956 0 obj << /Type /Action /S /GoTo /D [1955 0 R /XYZ 72.0 392.798 null] >> endobj 1957 0 obj << /Type /Annot /Subtype /Link /Rect [ 121.99 655.462 250.6 664.462 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1956 0 R /H /I >> endobj 1959 0 obj << /Length 1960 0 R /Filter /FlateDecode >> stream xœÍko¹í»Å -p`çýh?åšäâCî®=ûÒuqïj½ÏÎlæ‘Ñö¿—©‘æi£Ú擉¢(Ф(ùó™k9ð÷Ä©gmgŸ™æZ±gù“ÂÈrc;rë`1’„‰U`ÈMô%•[²·þ|Vž9Öwgû;4ÚZŽZ§3gœØÜœý #Û’4MYVÏv“‡ðí€ÍÁºº>xÖÛJ¶VÒ##ç.½)‘ïzÿ9ÖÃÙ··gWïCËu¬Û6ëšc/´ÛG0›¸=X;ÿðtõÍŸ>ZUiýòãõ_^ÿݺýþìÝ-OQö—FäÁ¿Ø––4øÎð‹ae=]Sá`ûDŠ "ä§‚–â†RQôsQ1ÌÊè<^&©±ÿæà++‚]ÇNkáE¡þ¡}ý—µ6YHÛ±ÓÀuclж¤ð±~8sSÉ.¡±kGV-¬vO€èó J%T ĹéP2;tÜ4rÇ’‘Ùh)?Ÿ)Îê#xˆ‡Ag2q} ìïiV^ÏËH’@Y‰ÊŒÄà æ-ýДÛ׳Òüy,ÇT˜ûòabšAÆ|z»L­d`–žþÁMbô>Ù¤®ŽY»¿j««}ó¹ØÞ[M›µ]C¦:cÜÀÅKÀƒ;ðÇw‰MÖZYùdµùAXme5BX§½h÷¢¶žª®¶>€ zû­¥x¦cžn ³ÂÍ’ÄÉ”ûǼiE)êe‘üd¥»•7VÝ•e^>ØÄœKè`”’í©ùÏâZ[¯­Kßµëf¡‘fSçÇVã§¼ÝkLd«v LŽUÓä÷…AÉê‡î ʶ1zT®EVOÆ7Ñ2äüPU[[£×†°@ít )ÛJ4å7ælªúÑ5Ø·ƒ9”SýEÞH¸ørºÃ¦Aj§)´r£dÚgÜ8ôì`±ñm]u ½f_U-λ.A 7rqF¬À¡Ù.ö†=ôì¸n Ƴظ›6¯Ê±Á® l' q[EÔ4œ1´I£[QR»!lÝs¹Ozì§ ³%HXY&}`£’H^²H̰S‰wÇÊèØ<Á†:x›ÕmwÔ„¬Ü_÷]»­N¥­IlWJp£cmˆÔ5ÊÜè›1ÑØ—¬Î³²5'–Ø>kè5Fz½íæªÞØ›ªÜ-º Ê“Ž8$$§)lÝZÃËNË 1?+Ýu)ì¢ÚdŲûÂŒx‘‘–äî¼È…Æ¿½y«Vb£)¼ˆ„|Þ¥ªî^_h/!‡Ž\ a0W~eÛîÕÔ²]'ÉÌ&‹1éüÕ_ßݼÒh^jXä2Dô8{Ll j„Fw9ìx[ãwç߳Ą«!‘•8±5EIÝpFìTøß’ë÷{†yU'„g–ÙO}ÈÎa™½ÔŸܘº¡=ô¦Zw†~Ô¶óh‹|3ëâ9£1ªRr¨”-AX…Fª¾{m÷„÷´$Œ¦Gp‹Æ`CÛV"Áñ¦÷7ýÔCMûTèfèÂ.zŒ'(aeÔI£{pŸÕZ²"/µ`†üMµkZ‘5ΨtX3º¯ºBS‹&ßꡲv-ºQ8TàÕÇü¾Îê§«Šñ×°ÎôùÇJZ=ÃåyvbÿXzxSŸz„4C0:“Y”Üoè%ñ¹A4’Eÿ#,ÿA´°rö±€#Á¢ÜA­pÓ¢ÕÕaÆãxØž³,×ÑÕoó²Àª~2h‹Ó‚ÔÓ‰`Ÿ¸~0åÛÔ›«ª~°y-šìp,ÄÊ©Ë[áeCn•T2ªŽaÆlÀnóû × SRÈ`þ æsêÈšÅÞhö3*OÒ‘jä†(ñá¸{þ¦ÑpQQRIXf|éã§J#2¨i´ßTŒSVBðJöÙ~¤iºS¡×vÚ²#`:NÇS–Z(µ’J\Jö ÓÉ>5&šSšË 0ú ƺczéãÞ8Vu›ÝçEÞ>õ48…6àß.z84’ÒìÅæ±ÇLÎYAoÕA²+{pÙÅ® ‡|Ç Ód:™sCÞØ>9}¹Äp½MPê#ù+gYrN™P¥›#55Žæ©Äˆ&~ʯçCÜt<*Æq(C6hO«Ew;ïŸTÙ£/;.—ø<3ôvç+}øÝ¥ïª¬e¨>fð…¬þ‚ª¶ÜÉLëæä#)QòÁ^.— 'Ãx£q2é\Ú4uç$2 /Q´]BʤA‰qFsÁÆë3–î%åÇv˜4VÎZ5ÒóáDz°›u5’Î ÒøáhøYšøgÓVÇ‚ÏFä_Ö‡gÒ` ydÀÖÛዪmÂfòâ>sd˜c!˜÷æƒPBij5z#ÄBÏùBŽpÐ;@B–ä%~ Á ðâ™) 4³ìÛ˜)ä?î c&·•†!ȸ"933nXC2Ü\hÂ)?«®]`³8ñ rí$N½Ô›‘ùj&|AV7lôŸD_7ñf8aª ŽÙHnìžô™„È4‰À{Q䂳}"H-p;:)H˜&>ŠêXèO-Õ 9t:V³L]M1“PªäÍè2Äá¬T—#ÐiHƒ¨TB¶‡uD8ê!˜õD8Û ¾…´c—Š*Y Äçù Ó—þ¸MÝ7ÊÚLÁ›ª®»c+¶=ßCöØËßtuSêÊÂÎèR¬¡^^ zv0¯¬{9 U'3©?)#,ã´ ìCÔ }ä^ÊÌßËC#Hä#‚ÅW™ð7=A¦?Óv”Êô(Ÿ§¸]ÕƒÙvkÂ9fôY¡¹œè›¹žæ`èüdAŽÐï?ýðM3äwEz r;ÇQ|›®3òLUæù#•)IsÖ4È`[wÒíê[…¹äÜsmkD¡)Û›w?z÷ó¯oÞ¾ýøë>¾¹¹ùã›ÛË!$ˆuieÊÌ’_®­Dvâ`9$Œf:_ÿøé§? o~þîfÙ‘‡«l¬·i_E¹zïÃQwÀ´B´Ž¹âøò»“a€WØ®*RK^oŃ ›)ð¥¸ÖEU=(¹ FÔY0a{ÏÍúÓsz00´û ?ísºkSÜš¥Q)*3òÓÍe#Ž¢ÜŠr8Ö&C 5G >Ë¿k:u!77ârœ§3ÕãÕ—¬¾‚ÙŽÃè<‰Fm) ÙÐzq©¢¹~Sg8¨¥a*èÐzâN|:º$ku o®ûqùÊØ÷fÚó ­•-AJ—:ÖÕF°çB¼a›å%…À¤¯/ „•Œž¼r†Ol8AŽå§3B=[ Öz_(J¿(Å“•‘ÁÞ×áɆOß7\»¯•ï+Ÿî«  z¸`œ:‚ý~óuøäÁ¢mæ¯fsà\|nå9ÉÌ šnåô=’(ñfz*¹*-ø¼àX-”r²Í¦êJ5>a*-,2š.Eè¸#qnù¹TdǸ}õÊIÕ9vì°%‚x†i#]Z"‹1¿À!óÇ7?¼Ó”ˆmÛ^6įnšŽ73ˆ–ò¤*' å{ã'^>TÑN?Ô ¼+á hà­©Pôƒ0:ãe¹Æö™Ñ/Ó Z±ÆÀßå†4Í^Å̹þtÌ’ƒŠã’„UI"”\+¤2`|¹HY¸¸%áFlºšïµˆroÀTåk)æFo+ÐÆ7ÞÏ”¹ãL/>åô⇕=šÃcÎ|8f¦ú>”×»A¿f|ÁªÅ‹“jéÕ)^éAF`Q îÞ¡ê bHŸ²÷ÝÃÄåAìi„x´`bÇ |Ѳøå2©{QT§™e À- 5ÇNÌËJ‹ƒ9A°š°1ÛAqÙ(8ªK¶@ÝÒ÷Ýó1¬V[¶j0~;ÈbŸ<;qV¨c}€f}<ŠR­;]öø^WÔðYµìÿŒEÔóiZ¡NæZÂt¤öر£ŸNÜtx0ié&’HR…ÒÜKƒ¬Eæ v„Þ‘ÞÙ2. Oº×Þ©m²“'5Xê… —B³ïŒ/Ë9-Þa9xó‘$3zjö˹D®õì‡æ”‹Z©çdJ;I !ˆ ÐL9_~]yè­õ쇖YÝ3RNb'ŽŸ&a4'Äò­ÀsV:ê…•Y—^.|¬õÜu1>І€å¤n C<¼-¾t!½ ñ7`äguK©)tñ©Ö€ßs7=ÿ$ó'ÊðNvF’Ä·ÝÔsÜX‰’xv4 ¼X¾âF¤?,šŒÙu1‘Ç$¼D;Ð> x5jORâŒÇVÒ 5Z˜±lÏŠ2R SÆšY¼!—'ö ~7Äà¤.¿ZÓ_Z©×Ê×a Ë[ ö"~¤¨nðÚVÞÖîÖL&‘ ³€,ÄžòZqPi²ÖQw(?–ÕIÊ´Íw;H„Ê€Ûžæ2Ë× ±‡–ÔOgXñ^œ®t|æŽÚûøt%òƒ¹QWœ#8‹•žÓl"G–F`ÐÌ8S¹‘Ý_*̉„´£‹E§,Faœ¸Ç^ÃýC9BñµasöÑäÁœ¨?Ð$!|ɬªÌËMÑmçG©Å—¼¡—wD(»Ã½Ìµ åÊo?Ózq9@K¾7ÒÒ³/Ïfú ?ÈZÈtÛê”ÕÛFÚ%^Žò©rdÜ?ÀpÑX>ó}õë·×Ûß½Â_4@–`;È#wV&ŸW»Áo¡þÁ] endstream endobj 1958 0 obj [ 1957 0 R ] endobj 1955 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1958 0 R /Contents 1959 0 R >> endobj 1960 0 obj 4308 endobj 1962 0 obj << /Length 1963 0 R /Filter /FlateDecode >> stream xœÍXÛrÛ6}×WìSkÏØÀ;_2“ŒëÚ·iyÚNœÉÐ$2Ë̋U÷ë» @$%¥Oi}íY»g‹ì§Šß—âÃ-ˆóÅ“Ò1ð-°=¥r=`>ñh9(¸dbâHS”hwZ5[‚~_ ?/>}ÆIk Ä…ý‚ÎŒK3ïѹëÛ Â0T\-‚@¸°‰‡BœÃò6·àªìf÷ì…!úŸ³7ÙÌú0¢°]¼Y-–×.0 «.kaš}Ë…€ØB ±&V9|:»yÙñêãû;( ¸ÿõöóϰz»øi¥BìÖwEdáOºJ ¸U6èµbKjRÊ»¡Lm¬ú½èv‰’ŸG£L‹§ÛÔeì{:?±#b!£$í…å¹FúÇõõ³6ÛHá›’ÐaÌSE-9!VÛ…h2hÎñq2#T6¸ü’¡’¢qÇ ;)’"¤Ö ̈KYè±)AiCrTf4˧Eo¹Äâ)7¢™Œ<žv$Ö[Ú”5Ø2uª:RjXíI‰ÿ"&œi»&o[G¥í+_ÔL˜öøM7* )ñ uB0*KŠí¾h¶,IÀ¯:Ë¿`5ɲ)—Iý”­¡n¢ªW°lòê"Y¹ëÕL1•Õ'Éa™,¯m`S¶OÐ¥Ôu¥ÃûݶŠÖi±íl žE\qx? WIZCÍã&ÅN†â¦¬ ­yUÃ>)!¢lk4 e[uÒ"m Ž«t×\@T¬õ¼ž4 O+ZdZ`œY Dò3SçLýRÖ œã ÅÆg’ŒÆû4Ë X”æä$zæŒÛº)óôo¾6”ÈÎ@]8ÊÀÌñ¦æÙæÂЈ˜5z‰™{ì‚=A;¡G“/âhW·˜¯í´Ç0KdèMÙ‡æ1⛑I—Å&ݶUÇT«7iƉ†«„×\Ãa3”ͤl³µÆ_ÛÚðP>ój_¥±^VÆO3ܧM¢Q¤Å‚ï /…aS•ùÈ›}9ÎòÆh0Kœ.X¹ó–Þvó¨hqüeÀ¼ÚòȼöH¤³—kÞ4x> endobj 1963 0 obj 1427 endobj 1965 0 obj << /Length 1966 0 R /Filter /FlateDecode >> stream xœÍ]sܶñ]¿y°§'ü&=ÎH‘œØc%ïÒ´çǃtŒIâÌÉ—_ß_Gòäö%mw—À~aw±‹Ëç ŸPø÷Rü•æ)›‹ÏŠæ“4 a¢HqBüÔKhF¢,ÎH-ž€b‰CIU«Ù“_.Ú J¾»øõ7X´#Ô‹ÉÓ1G6닟@xœxa’åy®t Õê$Ôßâƒciþ}ÖÅÊÙ<õ«4ñÏNÉÃÅõæâÕ›˜ø”lîm¥b£O½,ÈÅ?Ù4ä×A’¼ülÞ]Ünfñ'{mvB6E~ÔÏŸtʶþ‰m2¨ò$¦”ú1öí¾8 ¬1¹a‡šÖä»±Ú1´X¸êÕ_˜M¸%¾.n±âö¦c;²ácßW+²Ù3òýú§÷À÷‘Õü€Œ;>±dJ',³ÀKý(Ï“0B–ß|`U_ñö5‰i“op³k½(HÁ¦\ÅÇ®zØä%¹j¿( . §¥)RU ÊžÁÿκ¦ê…TCªz>tE;8»nÀ]Õ]µf¿î­;^ŽÒšðT {>Z¼h®ádŠ´˜Û yjóØîà_’0„¼¡ÌÂ`Lo0~¿¸HÔ͵AëªdmÏ;×€f÷mÍzÌàJ³ò“B”d…UβHÐEBÄÄØi˜ƒÅÐÝ Ù:â´Ú–"}² ~¾²Þ@ЗE]Wή¶¬Ç]Õ>œ×nyñîw®šCÍD4^A:D/ yO!a<k5.3PS|©š±±_>¶V&Þ+¸R‡¢!~Ft†’D¼»6àÖ.رûââãKÏ6x.Ê®ú¹‡’<”æYdè¡ÖBh ïeº \ìØçÝ„§=k R݃ýdìCTÖ¢ÞrêìJ‘8+ƒÉYàŽ§v?‚’ެ¾úÃ"ÒÇvüÉŠ¬,/‘v20u«úS“9Í&~ƒÒ$#?¤~¼gOÙÃ=ª:*$lë=‹o0«±±¤ÙêU¸´TS‘ê0· ñÒUqë‚râ0u ®:ïŠGÇ®’7ª;H¨«–¹; ‡çRèåtâBY?E…èÆ¶Åæû#”)è0<ò¨ìK!’t…}Êzl $ðŠ ¸‚™hÎ/ÿÙ| â¤!P«;QÖ{Ù£(§A¶ÂGrwíé¾Z‹dÒ„~îQšæyœ¨Öb#¯PÕ\¡M«¹ØZ„QèÅ ô9~ªŠjŸd=¢êÎ@«#Â…înï~üð/ƒê;1 UüàHéeÔ ŒéðUá[Kg…¼ò rë~yV1ض¤¤5KDÓ,(Â8žøŽog%FR†ÍTá`{¼¤ ,XµÎ"¼sîØ=ëX[2Kz,ºJæ¿gioí%‡[¡jA*îºâèȺw`©º³ïÞÕD§~©X½ë]ýÏ,T§¡0u.‡Ç‰ÆsW'é9W‡‘Ó "ýŒ ý|ú±d£n.p ]ˆ)¥ ‰“ß„xWÏw¯¾.Þ§‘øpÛC—°Àá=oÎ ÷ƒì¹½ÿ‰thM²T %þƒõ º§óâ“ì™ÍV:JÏ o[{:jì´ çì*˜Ý¾ÌY¥&L„Uö†öÀ µ|g×L»¡_°ˆˆxbšO VbüÌK1ˆbÆ#œó]mè èf;RN’IW–aáì÷já‹vbò.ÒÈïcï¨ÑÚU%¯Ç¦µŸî-7¸â òö‡Ííw·æuíþhWÞóqÞ”„¹¿˜Ñ²$¢æp.HT^D™Ha 86$æ"AâWƒÆ£Kë"ÉFÇ`*>¹4P9vp\ƒl>•Å'5v$¦ûF0£gxOŒô rÍŽd ­òêD£™G#:½ÊÙ˜8ˆ:O¨ÒòEDF„L¸›Ä@9‚ˆ¾ƒÌËd ¾‘¶ ÅžéC"èØhF²,Qð×Щý7ÍHƒuYBi”¨èZ:×÷qú–ÄÊRŠº¶ˆñ|•ȽÅð‚ZZfGU_Mª÷ÎY)æÜa™#ö)ŽZ=·0´þŽ zæ8/ÞѺ)œ8×heÞ÷&¹¶Ÿª½ó,~5¨æ§>ïY÷ˆQ)o°º]ª™­lTWÏUŽ \³ãRqãw¼™­=fFѨ¾çd¹Öai·j¯¤Ãص8\,h6÷AFg>äEà%à³VC:t“iè†ÔKãDü¶.0«ÚËCÇKÖ÷gc? ¼È ²`–ïX/qç$®®2Úy]`j4.*‡º*õ;ˆ$ÙWB‰–5_æ¶µ C‰s ÍLùi¯ÿ\{X" B¾t¸2Ðygqœ»X¬‡b`ú÷t$Éß„î‹ÒY…ïE럲3náºjªáŒLþ¹ÛÂ`â6=KD©—‹òA¼Æ¯,Eÿx(‘'Hjµâ•Ãi¯ÀÛÏpdíƒz«F\ÿæ8ãçv½Š?ÃóÝÍõ·3­˜Ã·u4ƒÉí“#ONÉ<ñûe©'Q4ñ-Ö÷J<¥ ¿Ê±Ósþ¯œŸ.þ Áz_y endstream endobj 1964 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1965 0 R >> endobj 1966 0 obj 2997 endobj 225 0 obj << /Type /Action /S /GoTo /D [1967 0 R /XYZ 72.0 546.648 null] >> endobj 1968 0 obj << /Type /Annot /Subtype /Link /Rect [ 365.3 697.5 469.99 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 612 0 R /H /I >> endobj 1970 0 obj << /Type /Action /S /GoTo /D [1964 0 R /XYZ 72.0 720.0 null] >> endobj 1971 0 obj << /Type /Annot /Subtype /Link /Rect [ 218.37 401.196 299.75 410.196 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1970 0 R /H /I >> endobj 1972 0 obj << /Length 1973 0 R /Filter /FlateDecode >> stream xœÍZësÜ6ÿî¿Bß.™Ù¨z?Úkg¶ñ:qëÚ‰½ž\¦í­–ëÕE+mô°ãÿþ@|è±ÉÍÍMïÒ¤Æ$AA€òç3×rà¿WüGœzV~8ûL<׊=ˈF–Û‘“X‹@&VÉ;HÞ…H_p©7‚½õá¬:s¬7g¿ÿ ¶–c‡ÖÓ™3ŽbîÎÞÃäadûQ’¦)éêÙn’ð)|;"?Xß]<ë¼½¥ö\ó?×ÞÔÈw½ÿëáìçõÙw¡å:Öz§] Á°üñ]+±}/å{`/ÿ´Ö¿œ­Ö´<1V8c[xÑ ! œa‹áaН¹ð/°}äÇöBXo*iSé'od(Œ„?O…DƒÇ[$¬õWN~z7b8v2Ø/2l?t¬¿Ød“]äsŸ^Œ3q¨zg½ÅíÈz‘)êsÏšç…‚E§Éñ,X«p·gоZ®W·Ë+…?±ç§ºÙj9Oû"ß+t`Y5/(kšìÙhÉŒùõˆ¼®YÓ±­îYk2Û”Z`žUŠÞ°²®æÆdÕóp+‹N8½’Ðw‚zNVÕÝ<œ ÖÂ5Ë ß¦Ö68K:Jã/àwm[Ô•i˜tâµq<4¬¤a Ž8Dý¸¤³²¬ŸðP \TºI“7·ç«[…~þ¨Htö…ÂbUSIº¿°TÑÖºQ¯L±ÚnùævŃŽÂë·Ëk[£§ZÞ2±M’mö³„/XÅÎ[¾Ï™8¥mv`Vɪ‡n/Žç=fe‚Ë@âڲ/Ö±n‹Žk/„ÜÜ$Œ±©aøõýÕÕ×ßL?ÇI¯û;Xåùêâòzun]Ü_¿^_Þ\ß =ÞÝÞ¼^ßß®î¾rx\Ÿ'ižãDI`î9qÀ6Ö·]hæ#ì „­fñhX×7•Ù_˜Ca:‘ð€ ÝY^ì fÈ*Œ®àAF[¶ÑR1v}•wÒñgÔ:65äœhaÊÏË~ GnânŽl“=<4ì!ëðHƒÅƤ¶Á\VøÚ(ƒ%Ã"mB)eÔ¡GLw¡UWÜ$­9¢,ýMeÚ<+³Æ`èýš—/|_à cÕÔza|Êz[aªPÅ=k™ByvÌ6Ä[L%)FŠz*¶è ‰À¨È^hÀ2“[~'³/¹¸Š­ ëžÀ®"œ@p UtáÊü ¢‹^ FÇM#×jàÈC’šŒ| ±-I'én¾äá‰a"ðž§xÖÝ‘±­”ù0:<Ï·Ó®k/ QÎÛç#kx%ÒöÇcÝt-Ä Ëß–·­_W]¾¿_‰Y.nnW—o®9ßgm»ܵƒc‰© ? íþwèË®8BÆ–×e€36M½‚’¢‚µGZ¬…oƒ^Ùä ×k ´d‰ ÀUàhÏÄþÁ Z !¹DbQHÒÒàæsJ.Sõ—ºè%/ÑϾ* Ëž.3L`™¡È¯p™x§€“)T˜KÝjåĤ^1PKæ8µF9‹ZÄš‰QJ†°š5φ’ÿɬS#ÅÎÈHCÿšñžRN.T/JG>ÌÃ$¤  Ö`ˆó/“4di’ŠíZè]2³µ1€òrÍ’þn°>Ö½)q_÷åÖ`Ȭ“Æ sš:÷,L#¯(˜MLã;ÁÈ4æ“X¤¦•ä‚HdEâzÌvÖµƒvz‰ƒÁW5«clQ9iø¤L‚.z°¬Á(L úªb¼þ!%îêƒB¹T[FÓVn4²_Ξe[P÷Žaž¸-Ú¼Çôu¾¾sþ¾ºÞŒÈi÷ÄNNw?gDz~>°ª³ÞôpUŽËC/äïßžÆób;žíHÅOê— EäÁ¼Lù‰ÆnšI4¼v^Âv*jEçMŸY©0Fê·åYs§;‹g …ÄÙ ~سJ™% 2dÊ:O+PWÛB^êSýàèlõ`ûAÏ'“ít|cú±o»XÐOÝkÜ­®V¯× & m¸lÛVô‡·«ÛÕÔ ¡3‘Á)QÒáŠü¤IÐDÑËës 6ƒ?jÒ9Y3¸~`òڟꀅ²ÎWc#ês`Ä­˜—tEÛIPWšbŠÜIJÆ—XEGÝ’)!ûL±3ÝöÒ–œËJ-Z­Mv€0¼˜š:òFËDeø ÷WvÜ…#ñá„FþŒnû“V÷øÊP5µ «ÅR4Ü0ad­€T“ÙŠeÜyÈÈÊ'|BAÎþï–VÖbDè$Õ¸è)/w¦ÀF‹Ì ºuº1 ·éÞ@7´÷^eƒq"ÛÌànäÅ607‚YtÖSQ¾¯ë£3:)õ˜‰^ilûìGÒ,u«p¡É¼dY#êÄY®m‚œ"q›™ÃñÍ_|µ¶BXR!-—DÈpŽp£ûå{–bº ƒ驼ý[R²ív&ß |d&,è!§IÔE a%{̪NsŒËxÅÌŒíÔâÂè¨rG[óÖæà“·‚‡%LÁ½üÀ›YÉêï®–—¼f|¹ü*h ¨}4ø»ØŒŸNß"Qd”ú¡ëÏL¥•m;¸D®¨Í„8‚±0J}¤êéîáh¢R`¬ìåÎó0/ÁÆÑyaX,h~ƒ(¶£ q\GVù”Öa!"ó¾C禚MQçW­W ŠPŠäý»ó¥Ñ¢l°P,ôšC>&P¹If«;ÖŠ„jj;+€ˆl¡€”mØœ¤ænÁ‹±:ž¬¢?nÅ“ÚÔfq:²™¸t_E¾sÀˆS¸å‚'s6êJSjTm “¤q¶PÊL‘ͪê³è¦JÕ»Ž)9Ç‚^(·–l_£Fo‹†åïšú0£Ê®hÚnj¸ÔNåLl¢mÝpó=9ðWU.Oìm-¾ Xø‰?Ôl"O+y‰=Ý"8–všDŽç¥á¸&ò]žú£k Á¿RàP-Å?Ra”#ŽîùϺ¨´@ù¬¨äè·d`г>Ç"ßöü ÀŸY‰ªg ?‹e=ƒ´øú)Aç*ò—÷ˆï)òÆàºvîNí±h8»(eRü@çÙ¹§áÉ`À…ãCXv½dF I¹+=iÈxÉ‹Yønt—}¢g"Äá ¢ž®ÁÇC67h w <è fÊ4 y¾«a,§2´ðl .Mõd¼˜š ªMY5¤¾Óòã‘aåöxx4+"©àÔÛ'QqOF1Ä]…_8,‡<Ýz-CbP,~/äGƒV‡°ºðd;ŒõOŒ N¿»€1|ñÛ_N8£—Ë_H¨4Ê ZO„µÑ¤tB¨^R²²€ŒÕ,ðdH#z¹G EÒ¿D*1SkÇã»DÆÍ0RÅѸ«ÄÇðˆ€¾ÝɆ…FòÛœâ@¡†mûÜ¢NMVŒFú†(è’篺eV§ù4y€Ù ,Ú4óH_#ýÙ—Í"ãPèΘ´8a‡Áѵ‘æ‘tjíd|ÕÑ×cá•"Åte%L˜oÇBCù0ç™å!A2kú}™É‡b<Öå£É1]F* 4˜haŒ©î¡úC¼`ÀˆM(«Fzh8wU¥³W.¿"Ë·CLikt­5m˜;ÓBð4_¼!I~~À)”Ò–uý©?ÒzG­—ôc† -Æç¬<)`qìh­u…Ù4 ÛÈM0,fú¬9ãØÍóZùB¶y`ÈEBnÑwîùSQ¾gûžŸÆA䢨ëZÄ¥Ô(«è‘ARêY)U^š>ªïuéès\:|0Hua¬*R£(&±Æ×dœR Î$QÕÕ+üÖû mpS,-›¶j5µOŒìƒ'9tø—SòŠ:[à Ûè)ü{Í9ýÊíð¯®)\LÑÌì¯o®ïÖ·ËËk¼¨=ñu¡ÊÌ5°þ´LŒ?^äîÂÀÒ ù¼üÁÀ§ß?üÐ!qH½(™ÑM/NþΩ6ScªhOX}î‹Ç¬¤wäÕ»Áï_ÿ ”w] endstream endobj 1969 0 obj [ 1968 0 R 1971 0 R ] endobj 1967 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 1969 0 R /Contents 1972 0 R >> endobj 1973 0 obj 3633 endobj 1975 0 obj << /Length 1976 0 R /Filter /FlateDecode >> stream xœÍkÛ6òûþ }LGÕòeàpÀf³i·Ýí¶Y§Á¡-²L­ÕJ¢£ÇnÜ_CÎIÞ÷¥wi Ï Éáp8O*Ÿ/B/€ÿÞ¨Ÿõ&òòúâ3ÑBoyñŠHÉÊ ×þ*H½Ú#$MR¯RG šB`¬©4‘ƒ÷颹¼o/~ý&í½ÀO¼ç‹`ÆÙ<\ü ›'+?^¥›Í†dü0MÕ±¿ ¯½onêÈ{'õl#½büÏ¥çÅaô Qà=^¼Ý^|ó>ñÂÀÛÎÖA­/õãh£þDÞ¶ö~}õN+yªEÓ{ßå^¼þÝÛ~q½¥#êõÚˆ"ø»öµ%’e0aVféŽ ÿ/ýi@ñ£΢†*ºXúUL´¢ð÷EÅ+¶xzMZcçæ_¹µ0 üttÑjÍÔ?¶¯¿Yk³‹T{ÛóÄ^¸‡|v gYÇx˜­¨²ÍÚ“w'j ?;á½Ú²yôî¢ÍúR6ž÷Œ†/Þø‰ROºN‘㧃h¼×0¯AúWzw¹½f„¬Ù3ìÝõíõhøó ÚRt|A+2²­g"ù†W—Wß]¿c„>ÛU¢[pÊs,†ªbh'zκ`H+Ÿ»›¬Qά(DÞ‹ýuÇ4–„•M^ {¥ñ×^øKÅYvÂb†•%ì7ØK ÞÿhA«uâëk\XBÙYð *ǹl,X£=”ÎÄL´KЛϓƘ|KÚ˜µÈŒ1]­â©®Hã~K²“CÉFvÂÁGÙu%X€£h•™Q4'GØ‹JôÆþAŸ›àá¸ÏFƒeó$«'¼:"=‰–‰Ueí#Ûºêh9÷ÂÁμ¦#ܦõ ´IûŽð0䇙òÖÉDyöp› ôS°÷ƒª=#ò»Òʆ/¯³ª-§ˆžDCœ®Ù Ö®,;>Ú‚ú³n´]6’VÊæ¥1ãÖˆ±È‚É…daÉH1Ó_ºžèÏ*ÃŸÍ Ã©WSLb-Z ÖM^h‰Ýp„ØÛ[¼tC¢Q7¼·øsÙ,òp½µðåÇíýÕýÝÝ#½¿¼}¸^X´*»Þ1ÖV…`¦ÃmÝt¢íÝ"ô·ªµ º€™ä®’hê¼!S¼È^¶ú€©³©tl 4QZ®A„›”gnýÎm24{Ù8ô¯‘÷··o/¯~p"t ì¸e‹¿× @Øú"‰a³ ⲩN\F;˜«*žºjÙ(K3‘u•@Y"HA›èn ênaqŒŠ£0ƒCVY”"™—¹E‡ìÉ­ÊYóˆzAÂvlÖgÖwǬa#rè ÿ»¹ÚIt¹/‹2ÏÎ+h9õE âq •ë+°ÈÌaÏ%æsÄúìOá°áè`¶¤Âä^„]°¢õM_ræÆ»_딆kë`fzDÉ!êaZ8ÃXy°ïÐë,?8 ®Ž‰ûU&ÓRmè —õvÜYµ]àíN*¿á1ñgb]:ulŠuPÃÎqHÂÚAƒO¥xv0ì#R:~ȯ¶nIãfIГcÝõ™T„…ÖhÊBKÕ7YŠvسä­Èz&ßê(C5Ýσ˜ki3õiÑ<–Ð7™D*$ܦGÄÔÛ›i½¬ýêÿ9oÌ Ðœ¯0C<<ÜèrÐP>\?|¼åSî®ïî?ü‹Ï¸ÿôÀДM/EûÏkÿ8ˆýåj„Á9Üaìµ8Òó6"; bÊ #µtL1ö:gꎂY„À‹VLÉbé¾ìþôtÐùC ê­EP·ÐZEQe²üÙF*ŠAKi íúrC-º BWà›Â´R—U%¹/žíŸ¢Uä¯ã´¸!FŸ0׿>‚§ÂY7C ±‘pí*+„m¾%Ë(Z¥”b1jÐÌ´êä0 Ÿ¸¯dKXg_Êz¨K^Ʊp°©x‰KËNBΜ„IËb2.;c ëåD©Y£W¤K-zY£"ºE "²E6T½# Æóéà$X€%8\ë¥ ÈSys{ýàP}Ù5.‰X.ëšî ˜RH¾Å¡û\íw~®ŒñßJ–¹‚ÒÕDA¹l‘S½ñªÙ ļV•wýÉQ°Î"„ ›®Y#Ô`i8«zêpÈ48XKH5¾#\òÁ†m ~¿—5Ûoض¤n‰ö`‚Ù¦Jceóÿ×³Ö µÿͺI§ Õª;$Eiˆ¬ZÃ¥Ç 5¨ïlqfUe0-®†¬7h¬b/ì»Óˆ­¥“NhÄŠÙOWÓ­;íΓ}Ùøˆlú¬l°#6gÚŠÃ`¢-„;¥¡-Jz”1¤ùc® ñ%«º©WXYѯ¾%‚©wR T8䨑ë·HbtùÂ4ΊÍÀ¢ aY0¹x‘L\çj‰¦¹€üR2T+e7¦ÉFXÈ'ùE'@XI´p(™>"Úh8ÊÖ=RÝIË$›†ªt„d"6ºÚ™ýØS‚; n7ôÉØÄ—c[Šý\£ñ4C«ŠÆ…§3[ˆ²ÉVg~|¬ÑÁ{Î)™:ø¥>ã:Ölû}©b§î©ˆf¢ç‘F¹+ÿnÃ"ÂT ›¶(÷¡±a‰ææ#•žÙÐØËX<ß‘ÌK Mz†es¬gN\Öø>§F¬à†"2AD%2#"{Ò¡F­Ž}¶‡!Û˜ D0ôùްåû±t„§¬¸¤%ƒÑZ~x˘ýæ”6›>:ØË'Ù•MÖžæêM§Á ¬³Gz|ܸFa“³6Ô²iæÁ]#e³_ÌÓ¡¦ÜôŒ‹*¯+ûĉ4é`H5lûˆ`FíãƒYz:B3Za‰¤èÍ’CÖ±ùÆî+èÁn~>˜݉<ƒ¥s n¦Î¯¸è¸ ×ÔŠ#ÔùÐJÀž(¿Ïž2Oîþ€¨ó{=c¶ §þ¯»7 †, #ªAíØÑ ‚ð9ïÄ}ô3“ÈŠpDd—uŽ@.7’0h#¼s3¡rô $Ü4g%¤4;×F<õýl'Ÿ†:¬n GÀèl \2ç¡bDKèE‹õb¡M*´…tp¢†¸(½ƒÍãb`›˜ÆÎÈéú–õ’¹ì¸œ2š`4“E×Tsõ-§¾MIR§@óžJw:I%˜£ —£Ú’Ôr5-ëuWª<éêöþ­§BÁ[ä²j(w@ãê‰Î£†÷R ¿:é=©Æ¢Šl]/9#ÁfjnWu÷A"¬ÝÏb?ÞÜ;¤(+¶(Ësõ`eñZô¹gã•~0&¬lÔ›N'F LûhD‚¨ê;ür²É®g$+kð¸'Μ¹¤a¯ßË烩tGAW—¢#!D%“žÔ êÀ¥”ÃGŒ,JVÞ$#U×Psƒí˜Ûõ ¯)¥Gê¢< ×ןæW—@1µŽ6›4X®GW—êª úñK—¦t§®µE‡n0¡^ã¾~ vb!ûU 馵¡ î0ÂÖ¢îê4J …ÑÚ³²Ý$²€-ì§'’ µêŠ'nð=saq:ÑŽ~EÊ<õv "“lpw`Ée¥]îH¹Sªlá)'·¦Â¾Ê™¯‘EóÚ¯½?%«ÔÒ4#’æ^§.ï')«ÿêý)ÙÄþF½›E+z7ûîb<ü|«’ÀÊ_yøLlÌBØ#¬ï A%»EŽ Ž[‹†pY׃éÒˆ&_ÇÐÍmëè7ø0¹°„[©­’&êj‡8ðób}[²‰Óí¨„$.­“ _ÎæŸ¦ƒd¢8¬wù—BÌUûŽtÃæÖ²ë–—m>Ô]Ÿ59G†#½DÑwR•»6dŽ¢ñBÊþ§gÛt=eBšm‘#dŒw!žùP.%ßšöŒp°¹ÞÂõDoE+>PˆU§7T&ã JÜ•hðOqì ¬•®!<´oP ^Œ“ÁŒMN¹v‡¬u»CPÒÆ‚~*U ¹Ën.@ïvüþ—»s‚P¹ƒBsÕD›‰jôƒØS…„oü£߲!ÖB†ÐïkÊ®•á·"—õ±¬®¥yé;B¤þQ_eÅ*<³«l}*Ó´ñû¿¨¦H…–É2Œ¾ÂÐË«¬3õ ý«µÿÆlï_ endstream endobj 1974 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1975 0 R >> endobj 1976 0 obj 3099 endobj 1978 0 obj << /Length 1979 0 R /Filter /FlateDecode >> stream xœÍZë“ܶ ÿ~?Ú3wŠÞÌôƒïáÚ®Ý4½K<™8“áîrwUKâZ[oÿú)RZÝÅÓiÓ¤Æ"A@€ë/óáWøGV„l]_|Ѽ€e!‹RÍJRd^êç¬fäIÎ*8!qˆ&#ÅÕ£ ìÙÇ‹æÂg½øõ7´a¾—°ã…&œÄÜ_ü‹'©¥yQZ×Ð ò—ˆ¼ˆu;{[‡ìVªÑF{äÿϵw5Š‚ðÿ@#Ÿí.®.¾{°Àg[ëYᥡïûa–°Ü‹Âÿ ÙCÍ~}q+•<Õ¢éÙ_‡r#^þÆÞ]Ü=è-ªùʉBø7ó”'M>$±?ýâxÙÈ·\ø/ö"âÇ Ø ~ªôÁê?ñƒ!e(úóIÃhQÎäù1)‹ý™‹?s"81ð½|raš;æŸúןlµ³ƒÄµÇýD,H'ûÑ1›Á^²ˆ6ó^®ØQËöÄ~êøN;Ö‚-|HF^œ€úYJs_­×¢ëØKv•°½ÔD%W†W‚WG~2à Ú­lk±1£M¬÷Có¹»Ô¨3Ë~.%ˆu_ –]W®*1W¥ëek˜¼1ëqWm®ÿ¼yÿõ&e«‰kËë÷ÜjA6r,ç3ËT¼Ý %&N½LMo\$,x÷ó j:‰óª’kÞ—²ñ,óÁÎ×ýÀ+G¶ì]Ø•ÿvË­¥Í1*;wÑZv½ÅCS•uÙ‹£ÃGGêž?:¨]OGKøXö{GƒGÑž™/õgæ |ˆkê*-Q„zÆ›0àèàƒv"Þ¬…w&0¼(Ó™T ¼V6 üÄ Ø‹Øò¡ê/֛Ȼÿñ½Ã =ßAC':Ò9]­xG[Õ잃ºã¶äKæ3œF°5u뽨¹Ãøô¢‘ý““í±/JÛðžzé9pšVlu8h^éÊ_pë"š™ñк嚎/7±Fônù m„p¨— Ì2ÊfS>–›Ág¼ÒŒpÚ;¢qh|Ë1n¶4˜ÎÛ2tȰ!§µž†1?L6†Jž Í8µÖšb>Èár}±–VvÚXlt'dsa­-«-a«mçYî[gaÙn\it^ŽŽì 2)K¯cÉ­8Z{{éœõ¶® 9txŸøŒv¼<7$VWCžäÀИkPi'.º»ÜG¶d7¯nÞÜÝ2†Ê¬8x+ÁJDzÙÁXÞ ¬¢ºïÍE—1¸¶g—dxj‡ip÷•׸_.J”5] #×Â+ƒkß+bØ^ÝE&q—u»»ÀÂ,‰`!,-XœÁë{  b WûU€õ iPÍâ´˜²*d¹‚*6½tÕ†:´¾Þ$:mÀf±O!²¢PAÔÉm$g@H R+èƒERùœFBçl2+RŽ *aƒ[ŽD§ jb‘Ú‰÷©»úbò‘§‹{9φQÎŒPóƒ ©­˜:ÜÖü-¤~lÎåP„Aù€0í¤a˜Ì†KãTtæãÍÑÂF8àË Ú’òTžÚ°&š:B¢'ObÄ2~h–q„”µ¸‚3ê†Z'E»ÚɲsךŒ\XŽZíÜ}ŸÒSázÙµú<Ï2ß6 f*’™™Ì« †Va缂nõ3©BŒ8ê «³'’´ÐtË›Žß X oe5bŒÏêrqzÙÉŠO&WtÎ`ºÁÏ'®‡¶¥£Ç e²²¤„‰ó·-0K ¥çÔ,Põuå¢GÆaW ¸vô¬Cž Sþ˜…ª§Æ§ºÑ^ˆ®ùײê7C½RÉ *sˆìJ¼§x# {™ÓŒ¬ÅËÅ•œô@ ª_‰vîFž Ñ‘¡ËloÀ…n¯ÌûS3ô{ýBª³£÷ lDCžØ•ÅåÖÒ'9´ñá*ׯsÌpg ¸Ê]£_²Cûd¥§[òÈOŒÉ A¹Ö8"Í;5í¡’ºGÐxZ,SwÜfuµ.¤ô¼û<÷:4$|òUÕI¡MDKuWU#žž&ñjµW¢W–½/w{åo{ÑŒ`+ŽÎ§™ÿsºuâÑÍF4foDo·#‰¯G㢜‚9“1‘­Ø ëy«‚–I㹋ÁíM3QÔ„õ%3ïU ãÌ*ÎðB£g)Ú0bpgk 9Úú£2Óª¿¢Ÿbõ<õPbÿ"¤Ÿö­Ÿ” ¬¤~™WH•¦Wýbq£ßïi…ÆNæ*}j~7¬Q¼s§ÿ²Ú{ ´b-Û¾«ˆFtTrW6åÎ Vd3ƒÁ$z‰ Õ®‘©/GÆFª#@&Ò´P–  ŸG è×Q²±ìYz#¼ùwËrDA‘|²rÂ~)›Ø–MÙ‹ÊŽÐ÷–¢[ã…eSά“øÅÌ:*©MÜ´òp ›A=§š2êýU%êçLðÿj€êß?RXG)eZ:JBÜ~x²ùH/Ân,ϳáßÒù‘çc7–gá‚„Q÷­†8GWsÝB(º¢§“óÓcåâ4ç$† D-óúæòÛæu}©2.¡VÔ¼l¬(<ôóGôY&;?ò²×•ÄöRÖ@—|ñµ·h²c3\Zzå̬!wx¾¦žM#¸:º‰¸Ý½âÒâñî¢5ÊZ<¡ >‘gÔ—4}WƶØ\‰çrÑôç¦Ä×—‰)éñ¬cxý@nÙp ÄîÔ¬÷@ƒqðùn!Z²Ä‹}üí=ˆÝTžE°÷¯˜é9Ä÷o~z¸ýáãß ^ËnYå2 ›ßŒ¦ƒ4\ý£B>ŠçínÀß=Æùd ¤Zñe(õïQˆélÕšh¸‘½I㡞a¼²Zš£8ß|žÍ6¡ åC¯ÞC߃éÝ~è7òØü¥oaÙ” ‰VÞF¤n] H;D?ÓÑT×7ˆõÓ?ßÛYíH–v)­"õpzÊê_ÔëÅä™ö‹Š8QM L7çF*Š™‘Ô]èîÎNàìȧÏ],EáØmd~1IÈWи)Ù`îÐîZ1ÿ™U³>™‚@cóPEd펅4b\άæªòä%†™—g¹ï'E¾°£o¸Bü}&ÊŠ"Ž–$,lñÓKWÏõø€¦`=t½Wî·žžxbþ(K×Zk¨®0 ŸŸ[Îtͬ u3'§Xïn¯ox3G¤‚MJm1ÖáHª“çp_ó²Ì~õ,È•ò ÷³î³4<–æ±V×pþµ]3ÊÆPò¶.œô£ÄÑgõzç¿"¤PÎ æT— ßÐàïÞ{Áñ/p+ú¯Ìýò † endstream endobj 1977 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1978 0 R >> endobj 1979 0 obj 3195 endobj 1981 0 obj << /Length 1982 0 R /Filter /FlateDecode >> stream xœÍÙŽ$5ò½¿"µOƒÔ“ä} ñ0l0+†ºB BY•®®ÔäQ“ǵ_¿aGØŽ<ªÅ¾°ËÂvD¤—Ãa»>ÞùŽÿ{)ÿ¤yàš»Dó4p„Hqâø©›x™Ó8„dqæÔrà ”C •F#rr~¹kï<ç›»ß~‡A¥ã¹±s¹óVÌ‘ÍãÝ ÿ:v|ÏÙm¤¹›žçiìdnäòŸÀÙ5Îo/Ĺî®hG盩*Åg¿;»ݽޑ‰j¾ ¢þM]I³qäÍ¿°(3tK…ÿ"7DPÜ [ä§š–þÊŒ•£ðïMÇ+6y¹LÊc§ðgVDNô=7›­EäÌýóøú›½¶ZH)û¶=Þ*®^9Ÿ9/7w^º¦éZƒŠ¾ïzƒ5E) ²¿pD?¬²Óë®(_Žb e¨š©.ƪkÙ Žgjà‚ÍoŸjûáPWr3X§ª[캳°zmÉXtLÒxê¦>¸¶Ìg·pZw”³ &Òmm+Æ,$¢t„ ~{=‹þñÇï,Ü÷Iô¯Úa,Úƒp-iw[Ò˜€qÍydâ/U][ìXT +Ž#È´;Š ³€¼a){q(heÀ½ðîqåµ0pò™Ÿ…èµ¢¡¯ÈU`€\XSgè¨/¥`l)êâ P1:û©ªhÁ¥òã»G€¹rr*P%{¸‰îéE†w Ù †iŒÅuù6!ž|œÙ7>f«\×Ƚ¨ƿ7Øë è2ÚWW†”âXL57 ¶ç`¶›¢®ÇÍ‘Ž\"F¹èW;Âý…Vä™›9/ú©F~ˆÂFh-ÆÔA‚ÿgÚ°ˆÀjNœSÝá!&Õ$W!Ó=Â¥8TMQ3¹E=-´ÙðÎÂmÇ>+†\*%œ³z8ƒÈc%ʵےpá¶Z´OãIÎ ¡Ú’â <÷ÀE;HQtH¸†òmw Ðßè©°‚ÁƒˆnPøb½f;tÍŠÛ8õ­(­ÚÇ£±¤*BÐê»;U–9Çníª4^¸ È«fNÅPaö—XS=Qn"±ï;´¯ÙXŠ»á^(ÔX†ŸzQŒv4g±¯êj¼j¢Œ —ÅXì‹CK†é`>†úöJÛ?`±§†ôbíHÌs/ MǪQR ×M”=WƒÔÕž–qR‘r†A ´'\CÄ m°A‹$`PhÙè‚Qµ?H0cûx…QAßmñ$l€Hð©8o&|™ºqåb% êœõ±ÜG²p©%L|œ*H n@3ícR=Özð@k‹ØÈselv{SŠ¢®¯÷Ä_õ/œó¡Ä ;©×™"ð— öT|NáŒý$•ÂTÁÝ˾\ÈÙ¸kfaä&I”çÐûQ̓ñ«£S ÙmÄâé\»É9@¦–-ü ^VíËF4]V.=ˆaptÄoHŒ¡¡Há˜Tµß¨ ál\¡:X”² !Øü!ÒO­E*w-›BºÝϤµ7dC¬Œ šS³° n(’eCD¹›úÐ&©¿a58í‹›ÍHÂÃh?ŒÂ¹Vzi£(ÃÔª> ¦ø^Œ13TúÕµø®c®µ˜ñ¯¬×0É1wEnê¼BàAUvbg­@t¶¿ýy÷ðî—ïÍ8£áöUèû–æG>êýg®¦üº)ŠÛ–|8¦Õ¹6øÍe søžÅž&ɆáÏ.cäá+‡Ýáy=WËæåAªvíòÌ_Ì÷né-ãE‡DGþ Δ>Q_×»0ô"×KsâÓç»0ÍlRÖˆÞ…ˆÒ.D÷¶Á7$Úq‚OÇŠŠF !—‚OÅÖáBœo(']g1é· ¹¿ñqO§xĆ®žtÏ@–ÛºÑa‘Œ[û"`îçGsŽ\k< [Š®üˆ°?@¤°àÍ€õ½ÄMS¨y–mÈ6`ý saä¬8ߘk¥›ünI¯ô™[[ÁMÒ1Dfôì[ ±zoQŠ DpÂò„‘Q k³Ë©ÂF‹Ðª®7ŽðÙÂÌá4ewiÕy//6vPìA^H`ZÑ1›â)w‡-3â´Œˆ Uwgh ׫O#k8³™³N’&tÞ3 ªI-/6©¢äß°5G¸ÁË;ñœÝÌ í=´-‚ëÏïdçÔB/¹v_,Ü÷Ol•dBW‡r @°ÇŽS­šjDî0F%@º[‚Q­<Æ8ríµxYÜ Ó‰È!za]çµL’²Y^+–F Å0"}]M\9Ÿ@e8Â77']’4’ÅdCг[3OÝ,ƒ™PF6¦ɬ!ÐjV]µ]TŽ+ ª`m†ñýæ·•(ÆÝ}:ZЪSvÂNÁ#5ÂâÏj°Øû•«2 ¢¸•HmH÷ë%Ì’…{àÄü©ê¦¡¾Ú@[ÍŒ¼ÜòÐóý(åe1’WÔ:5!‚·Óm"ºŽ!6²aÔ¦"RXÐæ ÄuI¸g£±lnè!w²ÅÎòÜ&÷$²²HJét¬å1³x'žºŠ3}tçlZ»2ð®Ä󌜮oJ'"…onHâ¹Ba à öǪ··4_ÐMËëíhc®>+lHúš. cwSH\PË¢ò b” © ì1S1N‰)óìJ ºÌxçº5AVòÖ¿¼¿©ˆŒ€õ’…áÂ/p|mŸ°Ø$‘™„‘%"\¤P‘GDÇeiIÒ¡3µøîyvÓü†Ç?úÔ2© 6o"4 ¬¶èÔŽç1Þ%Ó…UKƒâ‰ƒ ±½vo/Ü«E>§™°ÏWMYìz‰|šIà º¦})ÿ·«G¨tkYtlŠ|/°è…®$HÃM{ oîu¶™'ï:P F¢@šñLØ Æ¬ÇJ üC®á¹h][_Õ‰ö\öì÷Àÿe%W endstream endobj 1980 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1981 0 R >> endobj 1982 0 obj 3529 endobj 1984 0 obj << /Length 1985 0 R /Filter /FlateDecode >> stream xœÍÙr·ñ_·XU«ÑÜGU’*J$e:º,®¢(¶+…ÝÁìN4ÇjRÌ×§Æ5DzüäIJj»G7úFß.<âŸçü'É|²¯/¾IšGŸ±$E1ñ'vSR‰¤QJ*>qò) UÎFäH>_4.y}ñËo0)'®‘‡ w±9nswñ30b'ˆÓ,ˤ¬¾ã¥)g81û𼏭}rÕŠÙJz¾‘û?—Þ–(ðüÿ‰\r¸x¹½xqÏ%Û¸@’9±ïº®ŸD$u?ãÿùd[“_~¸b§ª}¬Y3×c™³g¿‘íO×[yD±^8‘ÿ'Žð¤É@ºÓËË4ÝPáoèHŠãGp>TIÃÊ_> ÀH( Ï*Fne-ž›Ihìdþ„EøBÏuÒ‰-üijÔ?õ¯?Xk CrÞçÏã.üês9É3Ôä‡áXö îÙ0”Ía£ð¦UPNª`3¿j–ëé»qP ­*À)p¤ÍéåƒÞ~O÷G–k:ÝUfíôú‡®Ö,×[<[Ô¢¬˜£­ž~b]_ög„E+[ÚóÝ™ú‡8‰£ãIA(‡`:Û(ä±õRÚèe=ÓëŽ|õãõ«¿}xûn«—´uM›ÜQøm±²/œ®h»Z¡w?~Ú^½ÿün³ÂÁ>I©A«¾]h!ð €<å¥jA*Í–„NÂÅë:¶ªGÇÐPD„¥ˆä­›v0ˆT"S ­í ¬Ng(Gô–ëê²sX¤£…ÐÓ©*÷t(ÛfcQÑ=ôü…jÂp¦ã1„²ô`V­p;$7¹Q r“ìh¯ñŽÝ³nÐ{ ·PiˆmWà\•ÂûÏ(©¹FCfñ‰5LKò©¡K^HFâG½ªX‘}.?‹³PW;aºn µõ¥Ñ ŽHAœW£–EzM”#`å,b²†,%Ê¡~eÖÀêSÛÑîѬ+û¯“M,žû£ÙîáXî+ÍæÊ‘“ed€ íÍð`íW•ÊÚÚb¡¶$ª¯·Ô㈠‘ÍÇž ãä¬bà|žÖOˆ=.1[OX“÷Kcy®ëÄQ’e‰'ù¾—ùמÖÖÌBOxîé7öœq´PÚ[«w,ÏUꤜݗ{fOÒÚ–ø‘ÞÛL©w¬*yõ°Ù`ã[p°E4EÐÕÁ¡·‡lx†8_1V¡= S,µíóT‹Êéýhšw4­ìûµ Ði$¬0ì¥F~4°Už^ÓÜ öfƒ‚vŽF¶R¸‚ABÈ5*âAzîX>î->¼R/¥ç‡35@òéLt{Y  ÞÝ]iXº…£ 7X¬íÇéþfŒi¸j÷_5ÂcA#=d½*ר6:Gvf$î^fâƒj¥æ¬ömÓ@-,­ãœ:~Üáõòâ&[vj^ƒ†R× “5tì¿UùÎá’ÿ‹Kü—dcj‹E³çþÊ&Žš/ž³ŒCÇKxwµ_Ì~9V_ÉmÓóº³!ŸN¼é /WW"¥ôg¹Ãni ÅxÇ¡µ¨ ÜZm«)˜¦zCÀº(‘Qr7£Ø""[f-PALZ‘Ãô;YK›=û]«‹¶ªÚ¬†’„±áÂÖ^ ’îJCéÎtÔ±š–biO ¦¥ƒW‰šÒ š4öJ&¹4ÛØòqü¶±æÐaXûa„#g³”¿²1KöíËÇn*ƒ™¨|³:ljܘ6K}‰Ç[_‘Ðh¶Ð)€é!ò-Om §ø÷6Þ1°,V¾÷>-Ä23û4o4o±‡[{ó9p-XLziXdßÙ~”÷îzKnnß\ß‘7ï_“›Ë7w×D´eü6¿"F “Õ=ì‰÷Í59³®-–V‰xŠôqÉ!seÖ8-f}· Þ / ~¸£ƒ¸Ê:v¢Ü:ZHÝ—8Lúò? ¸‚7.7ÿu 8.T§o#Ì_Š ýµ“†¾ë¹Ê®H½˜tY@ËNdÂS ܨN<ÿ#a9nA(ͯq\Ì¢—†úb$`ÝPqd’S¥Æ¾~=è!%õšÒšM­lC­4/ð_U¯,0¶ ‘5â×gC²FÍTC‡¶5ò–93#ò‘€ƒRÏ+ŠŠ’™¢,3\]ß|¼|½! ÕÀhÎýÖ¥ƒ04Ï+VJ2¸†®¦n›¬Yi1KXÉs2‘Í›C¯°C« ‡®ùV :ûÊ%L;¬¼žäaA)„qȾSzw¼1 ˜*`lÊo£žÂëÐÐÑRÔ A¹/ÛJu°¸r×â½u.–eE™7SV¿ r´Ï"ü@oD„‘„œcäŠðDH’^‡¶³[¯ H¸}ûöúêör{ý拦)‡Ð q4í3jUŸdyøÐ f‡ï c¡Ý0½ÃA,<”Òðe@•?¼óKw,ÊNf»)hq™ ¿I‹Zš· {ªI ȬQ”¥I$Së'‘îßݾ'7¼¾ÜCsþTcF¡“Æô™‘,¢êš‘eö-ƒc˜Q8¤ztSÁBa`. ËŽ"3Î…Ý'ô`¥úO§ºíŸ×pçbù›ÝXø‘é(™s9ÛÁIè„)ÔÍ8ÊVŽ,'Ï*)tŸ\l ë(äÆÈWÑîÀºåëTÏ6RžÄuâ{VÛ‹È«Kpœ+âkìFã' C!Ø”­†Ë®:÷ÖþV›‡mKDûÆXyhÊ.Ä|JDò‡IÃ>á$ú‹åÉ¡‰™ž\¾…)A¼Ö! 5ô÷¹! Zæý±ÁŽåáÈ𶌄—ÎYAÇjØ  Ã# z´ø6Cý†-ÇJù.Ñ®­ ¡ªá·/­íOÖéZCi/°Îñ;D&š*›}ÇÖn2aæÎ4¬®À^ žËZVnÄõmÑéä³A•DN Ý¿Äñ GÞ«ñg‡Äç¢b×fp©~‰ÝÝþóÚBÿ|O«‘ýõl@ú¡ïD41´KΖì¦W³ˆpììZo HØÙ£¬iǃ­—o-ŒÞÓ²ÒO[RËgúÈõgRB¨µuÝæòÙ;5uaLˆÕ‰ƒDdC|v™p|O­…"ýh ÓÁsééêAF TCpÓ|ÐOüÓßßqdchE¬Ž#Ôöüy0äP¦vXêË›§Ù~ÅB-š$ŒµÀ´0D ¨Ù úùÖ|@PË:¼.Ú…ñ$>¶!„É'kª Âqžÿ£þ®`¸uQ¨¦¢‚ ¶%Ë8 ¾-Œ+ òçåC:ª<8¿µi×,Ä44#'¶‡ Ƕ!Ü`&où…åžh5"(|Ad‰ïÉKî~¸Reë‰.#‚”dÐɇ±ìS>ŽM£' €É¤úIRÙ˜ðÇGh&î~~c(æë„\hm¢ž5¢ŸšÆ*äW$$˜vGN(,Dit áò'ˆ@TíÑR¶ž_Æe@ w쥭!ÅMµ7ûH°Á R|€øxÍ¿ié‡wÚ“g¥Ö ©äÃr)¸“†ÑöNÁ¥qÈ…k²Gº:I:³38¤û~–F©|út:t4çÎü„_õ•˜·ã/Ÿ'/ä—pÏÕ­Êp„fZú,(—¿oçD0~.8¯Æ{þ‘:i8vßqIïPdb©W*ØN.p&ÿ–ã¿YØ# endstream endobj 1983 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 1984 0 R >> endobj 1985 0 obj 2820 endobj 1988 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 709.5 165.595 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1987 0 R /H /I >> endobj 1990 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.438 709.5 539.923 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1987 0 R /H /I >> endobj 1991 0 obj << /Type /Action /S /GoTo /D [1589 0 R /XYZ 72.0 476.38 null] >> endobj 1992 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 697.5 218.735 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1991 0 R /H /I >> endobj 1993 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.533 697.5 539.858 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1991 0 R /H /I >> endobj 1994 0 obj << /Type /Action /S /GoTo /D [1589 0 R /XYZ 72.0 286.864 null] >> endobj 1995 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 685.5 185.525 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1994 0 R /H /I >> endobj 1996 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.5 685.5 539.925 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1994 0 R /H /I >> endobj 1997 0 obj << /Type /Action /S /GoTo /D [1595 0 R /XYZ 72.0 510.954 null] >> endobj 1998 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 673.5 320.187 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1997 0 R /H /I >> endobj 1999 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.733 673.5 539.75 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1997 0 R /H /I >> endobj 2000 0 obj << /Type /Action /S /GoTo /D [1601 0 R /XYZ 72.0 720.0 null] >> endobj 2001 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 661.5 240.482 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2000 0 R /H /I >> endobj 2002 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.58 661.5 539.886 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2000 0 R /H /I >> endobj 2003 0 obj << /Type /Action /S /GoTo /D [1613 0 R /XYZ 72.0 687.9 null] >> endobj 2004 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 649.5 247.646 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2003 0 R /H /I >> endobj 2005 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.603 649.5 539.886 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2003 0 R /H /I >> endobj 2006 0 obj << /Type /Action /S /GoTo /D [1616 0 R /XYZ 72.0 639.9 null] >> endobj 2007 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 637.5 274.427 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2006 0 R /H /I >> endobj 2008 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.61 637.5 539.806 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2006 0 R /H /I >> endobj 2009 0 obj << /Type /Action /S /GoTo /D [1790 0 R /XYZ 72.0 651.9 null] >> endobj 2010 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 625.5 186.808 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2009 0 R /H /I >> endobj 2011 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.443 625.5 539.921 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2009 0 R /H /I >> endobj 2012 0 obj << /Type /Action /S /GoTo /D [1793 0 R /XYZ 72.0 720.0 null] >> endobj 2013 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 613.5 169.474 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2012 0 R /H /I >> endobj 2014 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.453 613.5 539.927 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2012 0 R /H /I >> endobj 2015 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 601.5 249.447 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1805 0 R /H /I >> endobj 2016 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.635 601.5 539.826 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1805 0 R /H /I >> endobj 2017 0 obj << /Type /Action /S /GoTo /D [1796 0 R /XYZ 72.0 526.924 null] >> endobj 2018 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 589.5 132.66 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2017 0 R /H /I >> endobj 2019 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.375 589.5 539.96 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2017 0 R /H /I >> endobj 2020 0 obj << /Type /Action /S /GoTo /D [1796 0 R /XYZ 72.0 462.852 null] >> endobj 2021 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 577.5 193.437 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2020 0 R /H /I >> endobj 2022 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.465 577.5 539.922 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2020 0 R /H /I >> endobj 2023 0 obj << /Type /Action /S /GoTo /D [1796 0 R /XYZ 72.0 199.581 null] >> endobj 2024 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 565.5 221.712 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2023 0 R /H /I >> endobj 2025 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.518 565.5 539.884 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2023 0 R /H /I >> endobj 2027 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 553.5 223.928 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2026 0 R /H /I >> endobj 2028 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.526 553.5 539.885 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2026 0 R /H /I >> endobj 2030 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 541.5 235.171 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2029 0 R /H /I >> endobj 2031 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.545 541.5 539.82 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2029 0 R /H /I >> endobj 2033 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 529.5 259.212 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2032 0 R /H /I >> endobj 2034 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.583 529.5 539.785 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2032 0 R /H /I >> endobj 2036 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 517.5 313.593 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2035 0 R /H /I >> endobj 2037 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.646 517.5 539.683 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2035 0 R /H /I >> endobj 2039 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 505.5 284.371 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2038 0 R /H /I >> endobj 2040 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.659 505.5 539.785 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2038 0 R /H /I >> endobj 2041 0 obj << /Type /Action /S /GoTo /D [1884 0 R /XYZ 72.0 666.346 null] >> endobj 2042 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 493.5 161.717 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2041 0 R /H /I >> endobj 2043 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.427 493.5 539.924 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2041 0 R /H /I >> endobj 2044 0 obj << /Type /Action /S /GoTo /D [1884 0 R /XYZ 72.0 542.838 null] >> endobj 2045 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 481.5 175.55 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2044 0 R /H /I >> endobj 2046 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.443 481.5 539.957 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2044 0 R /H /I >> endobj 2047 0 obj << /Type /Action /S /GoTo /D [1884 0 R /XYZ 72.0 288.769 null] >> endobj 2048 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 469.5 260.822 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2047 0 R /H /I >> endobj 2049 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.608 469.5 539.848 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2047 0 R /H /I >> endobj 2050 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 457.5 141.12 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1887 0 R /H /I >> endobj 2051 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.333 457.5 539.958 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1887 0 R /H /I >> endobj 2052 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 445.5 247.599 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1889 0 R /H /I >> endobj 2053 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.565 445.5 539.848 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1889 0 R /H /I >> endobj 2055 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 433.5 322.102 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2054 0 R /H /I >> endobj 2056 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.693 433.5 539.736 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2054 0 R /H /I >> endobj 2058 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 421.5 196.653 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2057 0 R /H /I >> endobj 2059 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.498 421.5 539.889 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2057 0 R /H /I >> endobj 2060 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 409.5 173.596 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1915 0 R /H /I >> endobj 2061 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.455 409.5 539.863 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1915 0 R /H /I >> endobj 2062 0 obj << /Type /Action /S /GoTo /D [1898 0 R /XYZ 72.0 597.36 null] >> endobj 2063 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 397.5 128.22 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2062 0 R /H /I >> endobj 2064 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.363 397.5 539.962 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2062 0 R /H /I >> endobj 2065 0 obj << /Type /Action /S /GoTo /D [1898 0 R /XYZ 72.0 409.415 null] >> endobj 2066 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 385.5 141.0 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2065 0 R /H /I >> endobj 2067 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.401 385.5 539.961 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2065 0 R /H /I >> endobj 2069 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 373.5 265.231 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2068 0 R /H /I >> endobj 2070 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.602 373.5 539.786 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2068 0 R /H /I >> endobj 2072 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 361.5 198.85 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2071 0 R /H /I >> endobj 2073 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.507 361.5 539.892 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2071 0 R /H /I >> endobj 2074 0 obj << /Type /Action /S /GoTo /D [1941 0 R /XYZ 72.0 638.212 null] >> endobj 2075 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 349.5 206.593 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2074 0 R /H /I >> endobj 2076 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.529 349.5 539.89 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2074 0 R /H /I >> endobj 2077 0 obj << /Type /Action /S /GoTo /D [1941 0 R /XYZ 72.0 327.672 null] >> endobj 2078 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 337.5 136.56 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2077 0 R /H /I >> endobj 2079 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.386 337.5 539.959 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2077 0 R /H /I >> endobj 2080 0 obj << /Type /Action /S /GoTo /D [1941 0 R /XYZ 72.0 206.958 null] >> endobj 2081 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 325.5 251.568 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2080 0 R /H /I >> endobj 2082 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.559 325.5 539.784 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2080 0 R /H /I >> endobj 2084 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 313.5 255.154 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2083 0 R /H /I >> endobj 2085 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.547 313.5 539.805 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2083 0 R /H /I >> endobj 2087 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 301.5 229.454 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2086 0 R /H /I >> endobj 2088 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.506 301.5 539.847 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2086 0 R /H /I >> endobj 2089 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 289.5 245.975 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1956 0 R /H /I >> endobj 2090 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.56 289.5 539.848 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1956 0 R /H /I >> endobj 2091 0 obj << /Type /Action /S /GoTo /D [1961 0 R /XYZ 72.0 707.4 null] >> endobj 2092 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 277.5 138.77 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2091 0 R /H /I >> endobj 2093 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.395 277.5 539.962 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2091 0 R /H /I >> endobj 2094 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 265.5 165.245 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1970 0 R /H /I >> endobj 2095 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.463 265.5 539.895 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1970 0 R /H /I >> endobj 2096 0 obj << /Type /Action /S /GoTo /D [1964 0 R /XYZ 72.0 575.128 null] >> endobj 2097 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 253.5 189.56 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2096 0 R /H /I >> endobj 2098 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.441 253.5 539.854 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2096 0 R /H /I >> endobj 2099 0 obj << /Type /Action /S /GoTo /D [1964 0 R /XYZ 72.0 425.392 null] >> endobj 2100 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 241.5 226.134 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2099 0 R /H /I >> endobj 2101 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.533 241.5 539.885 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2099 0 R /H /I >> endobj 2102 0 obj << /Type /Action /S /GoTo /D [1964 0 R /XYZ 72.0 312.768 null] >> endobj 2103 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 229.5 244.875 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2102 0 R /H /I >> endobj 2104 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.554 229.5 539.845 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2102 0 R /H /I >> endobj 2105 0 obj << /Type /Action /S /GoTo /D [1974 0 R /XYZ 72.0 720.0 null] >> endobj 2106 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 217.5 299.1 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2105 0 R /H /I >> endobj 2107 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.69 217.5 539.807 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2105 0 R /H /I >> endobj 2108 0 obj << /Type /Action /S /GoTo /D [1974 0 R /XYZ 72.0 508.8 null] >> endobj 2109 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 205.5 250.353 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2108 0 R /H /I >> endobj 2110 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.574 205.5 539.848 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2108 0 R /H /I >> endobj 2111 0 obj << /Type /Action /S /GoTo /D [1974 0 R /XYZ 72.0 177.6 null] >> endobj 2112 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 193.5 251.472 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2111 0 R /H /I >> endobj 2113 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.576 193.5 539.846 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2111 0 R /H /I >> endobj 2114 0 obj << /Type /Action /S /GoTo /D [1977 0 R /XYZ 72.0 720.0 null] >> endobj 2115 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 181.5 202.396 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2114 0 R /H /I >> endobj 2116 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.456 181.5 539.884 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2114 0 R /H /I >> endobj 2117 0 obj << /Type /Action /S /GoTo /D [1977 0 R /XYZ 72.0 534.92 null] >> endobj 2118 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 169.5 166.314 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2117 0 R /H /I >> endobj 2119 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.378 169.5 539.922 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2117 0 R /H /I >> endobj 2120 0 obj << /Type /Action /S /GoTo /D [1977 0 R /XYZ 72.0 461.88 null] >> endobj 2121 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 157.5 229.783 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2120 0 R /H /I >> endobj 2122 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.6 157.5 539.891 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2120 0 R /H /I >> endobj 2123 0 obj << /Type /Action /S /GoTo /D [1980 0 R /XYZ 72.0 684.0 null] >> endobj 2124 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 145.5 232.987 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2123 0 R /H /I >> endobj 2125 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.536 145.5 539.817 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2123 0 R /H /I >> endobj 2126 0 obj << /Type /Action /S /GoTo /D [1980 0 R /XYZ 72.0 628.986 null] >> endobj 2127 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 133.5 275.124 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2126 0 R /H /I >> endobj 2128 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.652 133.5 539.846 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2126 0 R /H /I >> endobj 2130 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 121.5 307.887 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2129 0 R /H /I >> endobj 2131 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.719 121.5 539.808 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2129 0 R /H /I >> endobj 2133 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 109.5 300.749 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2132 0 R /H /I >> endobj 2134 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.696 109.5 539.808 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2132 0 R /H /I >> endobj 2136 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 97.5 352.805 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2135 0 R /H /I >> endobj 2137 0 obj << /Type /Annot /Subtype /Link /Rect [ 522.237 97.5 540.183 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2135 0 R /H /I >> endobj 2139 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 85.5 319.136 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2138 0 R /H /I >> endobj 2140 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.72 85.5 539.773 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2138 0 R /H /I >> endobj 2141 0 obj << /Type /Action /S /GoTo /D [1983 0 R /XYZ 72.0 579.672 null] >> endobj 2142 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 73.5 258.798 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2141 0 R /H /I >> endobj 2143 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.565 73.5 539.812 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2141 0 R /H /I >> endobj 2144 0 obj << /Length 2145 0 R /Filter /FlateDecode >> stream xœÍÝQwGràûw} <Òçì¶33"2#îÛX{Æ+Û3Céúž³ÞˆÄÌp‡hš¹úö7#T“]Emý_öîzwM@ÿì†ðƒˆ®èª¬ÿüªÞ”ù?ÿ5ÿ׈vóêÝWÿùü¹z3ÚôçOY¿©ãÔ‹ß¼»yþÀÍoÞføÙ3yþ£¬Ï>×çþ|óï_ÝUnþé«ÿþ?fôú¦œìæo_•̓ŸæåW¿ŸOný$Ý#âùkm§êžO!§>ÿðêÝÍßÿö]»ùæaÕ¿ú| òÿûWÿéW$µýð•›?}õß}õ÷ÿh7µÜ|÷ÇË@—Óˆü?Moü$íüç›ïÞÝü÷¿ùéýÝãËß{óý‡»Ç›úñÍ뻿û7ßýóW¿þîùßr=Äú9jóÿŽÓúaú옖ÏÿÉ'?h?þòÙùÿô$çÏÍÏœšÍüGoŸmŸÿwþƒ´õ½:ÿï/~ožê“Å×Rë›ö¿óÉ¿Œ2êI¤”R]æ?:ùg*}óæÍ' Ÿÿ¨ýoþîm@ó¹¿üïµó3öõÃýýÝ«§7÷77“Òn^|ÿ‡oÏÿ~?¯ 9YØü~´¶y€Ÿ—]¯§Z5bx?¼¦–rê2Ÿ¨ÕíWzÚÄBâNâñü«ÄFbq«$VK Nvµz wˆµ‘ØHì ¶Jb%ñq'‚v"Ø‰à ‚ƒ"èDЉ Á ‚Aƒl¶[‚­Áù÷!‰`k@°5 Øl "(DP‰ A%‚FÚó+™ã@ îÄFbñ¨$V{!±˜: "D0€  (J‚R T (J‚Ò€ 4 ( "(DP‰ A%‚J4"؉`'‚"8ˆà ‚ƒ:t"èD0ˆ`Á‚Z€  ¨j‚Z V ¨j‚Ú€ 6"(DPˆ A!‚JÕNQsŒÞ¶ñ—f:ÿR×ù÷‚{óã‹æ_îa^Êðí+õÖÆæa~^Uÿ÷íã›ÛÞÞ}Èçð~óâ·÷ÿôù,6?³ÅÖù‹kä7¦ôº}ðë6 r*¸ÇÉIÍÎSð͢팩£:H=LHm¨vRÏcR+ª©çá ©‘¥#KG–,Y±l…X¶B,[!–­ËV‰e«Ä²UbÙ±lX¶†,Y ²d©ÈR‘¥"KE–†, YZZjx·q îÕŠêAêQP-¨î¨R{Cµ¡Y² dÄR ±”B,¥K)ÄR*±”J,¥KiÄR±”†,Y ²d)ÈR‘¥"KE–†, Y²ìȲ#ËŽ,;²Èr Ë,Y:²tdÈ2e Ë –Zˆ¥b©…Xj%–Z‰¥Vb©Xj#–Úˆ¥6d)ÈR¥ KE–óµ}óUŠV;<¢É–ÍÒ¬™/ô=æ™ì|Yó°k;ÚßÒŸO‡\Õ烪˜OòþñáýÝãÓ›»×ÇäóhÕZ)˜lèãòÍ¢~ r^”?±ó;Ñc»h3+ÈŸXPwTÏŸX_þv ÎŸXPªÔù jEõ µT ª;ª‘eG–Yvd9å@–Y:²tdéÈÒ‘e Ë@–A,פÔÄrM*וX®I%¨‰åšT¯±\“JP#KA–‚,Y*²Td©ÈR‘¥!KC–†,;²ìȲ#Ë,²Èr KG–Ž,Y² dÄrM*AM,פÔÄrM*AM,פòx݈åšT‚Y ²d)ÈR¥"KE–Š, Y²4dÙ‘eG–Yvd9å@–Y:²tdéÈ2e Ë@–A,פÔÄrM*וX®I%¨‰åšT‚šX®I%¨‘%šû(šû(šû(šû䤲è,ÜvFƒ_έIåñzfUûvÑîŒRõªúæöéö‡Ûwùó Þ¼øÝÏ3ÊËçÞÜ_þüùTóü¹ïÿðíåƒÛû×{¶ùbüT½GôùÅo¾¬Ël=ꩉ—Ò-Ð2=5™î=ÛöøfzþÆ#µ º£:H=ã‘ÚPí¤ž¿ñH,Y² dÈ2ˆ¥b)…XJ!–R‰¥Tb)•XJ#–Òˆ¥4b) Y ²d)ÈR‘¥"KE–†, Y²4dÙ‘eG–Yd9å@–Ž,Y:²tdÈ2eK-ÄR ±ÔB,µK­ÄR+±ÔJ,µKmÄR²d)ÈR¥"KE–y!©·ù²ÝwB¾ø²=‡F¶uT²l —yla¾]Ö¤\÷~“¹}Vå†byjHîT•Ç<|x|w{ÿêîòÉ/Ú¬· ½Fh—í_àzÙüÚ›æÉ†–ÍoA¾¬k³ì"wjõ|aNjEõ õ|aNjAuGu€:wl!5±Ì=[@]‰eîÚBjb™û¶šXæÎ-¤F–‚,Y ²Td©ÈR‘¥!KC–†, YvdÙ‘eG–Yd9¥#KG–Ž,Y² dÄ2·t!5±ÌM]@]‰enëBjb™»€ºËÜÚ…ÔÈR¥ KA–Š,Y*²TdiÈÒ¥!ËŽ,;²ìÈr Ë,²ÈÒ‘¥#KG–,Y±Ì=_HM,s×RËÜ÷…ÔÄ2w~u#–¹÷ ©‘¥ KA–‚,Y*²œÛ7é³¶ F ëméùë°,ߟnr¾Xg³¬IÝŽaæ+çÏ«OߟövóâßÞß=Þæ›Ï>~æËc˜ÜÁV-¢—Ø>ðÇå;ó‘è½Ñv|‘ç4q>“íý+l†j'uTT+ª¨[)¨TwT©+±l•X¶J,[#–­ËÖ¥ KA–‚,Y*²Td©ÈÒ¥!Ëu¶J/µ =P¯³UŽ×‚êŽê õ:[åxm¨vR¯³UŽ×ŠjdÈ2e Ë –ç³UŽ×Äò|¶ÊáºËóÙ*Çkby>[åxM,Ïg«¯‘¥ KA–‚,Y*²TdiÈÒ¥!KC–YvdÙ‘å@–YdéÈÒ‘¥#KG–,Y±<Ÿ­r¼&–ç³UוXžÏV9^ËóÙ*‡ëF,Ïg«¯‘¥ KA–‚,YæàÃÏ[€=ªÏ©G/ó•MŸááEŸÎ<6‹šØvæ1ÿ‚ùòÌcÌŸÁ›ÿøæí'=Ÿ`þà_îÞ=<þtùøË'ÜçE1mÌç™ßƒÍs^`³ÌNÝü|. Yæ'ZJ×±]¶=0®¨VTRÏ—a¤TwT©¥¡ÚP,Y*²TdiÈÒ¥¥e‰¨­©ƒÔ½¡ÚPí¤ÎSÒ@­¨¤ö‚jA5²tdÈ2eË<7ÔÄ2ÏMu%–yn©‰ež›êF,óÜR#KA–‚,Y*²Td©ÈR‘¥!KC–†,;²ìȲ#Ë,²Èr KG–Ž,Y² dÄ2ÏM 5±ÌsHM,óÜRË<7ÔXæ¹ ¤F–‚,Y ²d©Èrþm/cD”ÑÀæù(=ÂMÈaíÚßS[©egU“¾=LÍöž?½:ß§žì—NDÈãղΟèÛ‡ùä6ëòÞ9m®›_$Y—?¹ó¯ÐªÛu×ß÷¼Ë5©©ó'Ô‚êŽê uþä‚ÚPí¤6diÈÒeG–YvdÙ‘å@–YdéÈÒ‘¥#Ë@–,Y±Ì&©‰åšX¯+±\KPË5±5±\KP#KA–‚,Y*²Td©ÈÒ¥!ËœXŠ—ùüH ÎyåñØHì ÎaåñXI<@œ“Ê㱘: "D0€àQàPŽ+\ãÉã1\ÃÉÃq‚k4y<&‚B… T"¨DP‰ A#‚Fv"؉`'‚ƒ"8ˆà ‚N: "D0€àš@àš?àš>àš=Ž\“Çã1"(DPˆ A%‚yGìùz­D2`[7ÅÖ1Ÿ£uŸÞ{³n†lnj¹Þ¾æåOžîÞŸ¤œâ掹Ÿúˆ(mçq>y„ëcòü¬Ï8wÝa õ¤1éû; 7ÇþyS ç]5H.,ï,”ç5Hn,÷™·Ræ*Gò¼¹É•ååy ’ Ë;Ëåy ’Ë™jgª©v¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁT©æ5(GªyU'Ê‘j^׉r¤šWv’¼!Õ¼¶åLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÎT;SíLµ3ÕÁTSLÕ™ª3UgªÁTƒ©S ¤šW}¢©æuŸ$¯H5¯üD9RÍk?QŽTóêO”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT;SíLµ3ÕÁTSLÕ™ª3UgªÎTƒ©S ¤š—…¢©jAªZ‘ªV¤ª©jEªÚª6¤ªl¶¤l¶¤l¶¤l¶¤l¶´ÆÁš÷lÚ¼~yî¹æÁ6ãùz‹-ÌpŸ_ õ½í<º¹ZPÖœòójþ,®Ó\[nÁõ›ŸÞß=>ï]~þÌ¿Þ=ýíáñ/—O|ûæÃÓÝýÝã‡Ë§þãÅ˻ǿÎOýÇßmf'y“±QJo²óÜ—‡ØŒ9Ê©çFc^[—g/ÏÖdoÝvšÒY(_oÜXî$oëú-+ËÊ×%\ Gª­"ÕV‘jkHµ5¤ÚS¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªT¥ U)HU R•‚T¥"U©HU*R•†T¥!UiLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÎT;SíLµ3ÕÁTSLÕ™ª3UgªÁTƒ©S ¤šwÈF9RÕ‚Tµ"U­HU+RÕ†Tµ!UmHUS¦*LU˜ª2Õ×Äò¼ËçáºËó.ŸÇkbyÞåóp݈åy—Ïã5²d)ÈR¥"KE–Š,Y²4diȲ#ËŽ,;²Èr Ë,²tdéÈÒ‘e Ë@–A,Ï»|¯‰åy—Ïã5±<ïòy¼&–ç]>×Xžwù<^#K4÷Q4÷Q4÷Q4÷ɳ&‡Y)êdlƒ{d<¾N– Í{—¶eÛ‘½úººøóìÓ$óú•›çSwF‚šwJíÚwå²zo6(e~ó\ç'‡2EŠí¬ÛŽæ*Ë•ååyš-É…ååò¼„›äÆr¦Ú™jgª©¦:˜ê`ªƒ©:Su¦êL5˜j0Õ@ªën’#Õu 7ɑ꺄›äHu] ò†T×%Ü$gªÂT…© S¦ªLU™ª2UcªÆTóî¦ácÄ‘ÚPÎ/yÔ—Žoó²z3’’S­óÅ4غ~²êϧsoÖm'_òùË åÆrGùüe…reù@ùüe…ra9Su¦L5˜j Õ¼~åH5¯Ÿ'yEªyý<Ê‘j^?Oò†Tóúy”3UaªÂT…©*SU¦ªLU™ª1UcªÆT;SíLµ3ÕÁTSLu0UgªÎT©S ¦HuþC–#Õ¼~åH5¯ŸG9RÍëçIÞj^?r¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜jgª©v¦Ú™ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©RÍëçQŽTóúy’W¤š×Ï£©æõó(Gªyý<Ê™ª0UaªÂT•©Î£ƒZ5oö"d®£¿|˜ðåu9új%òDÁuû£¯~½Ãá§£/S¿Œ¾ÎåèëíÝÓf¸TçsÉ‹þ7zY¾Yg§ùúcþ»Vaëü4Z¦­í¬ÛŽ›*Ë•ååóèåÂòÎò@ùnï__>ø÷».\—_¼…sn Vó|6k¶óŒ—Gجë'ͽ$-·Ó$ëæ¼ÇLó²×ͺí<§±ÜXî(ÏÃ’+ËÊóð€äÂòÎr¤š;†¡©æža$¯H5w C9RÍ}ÃPŽTsç0”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT;SíLµ3ÕÁTSLÕ™ª3UgªÎTƒ©S ¤š[Š¡©æ¦b$¯H5·C9RÍÅHÞjn-†r¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁT©æžc(Gª¹ëÊ‘jî;†r¤š;‘¼!ÕÜ{ åLU˜ª0UaªÂT•©Î_óè&¢)š¬á’Z©×­[ÌÿlæÆ;ëö‡K~½½Ù˧Ûǧ7÷Zw4‘œaÝ^þx™'?þããûËG?=üøÉ?ûÕû÷oß¼º}zóp¿3âh?_R¸ù .±3ëМ6yî‚BÖÍÏzžŽ5öþ÷†(’çÐåÆrGy­,W–”·Âr¤šC”3UaªÂT…©*SU¦ªLÕ˜ª1UKU‰(yÚçÊ7ïŸ4Ÿ1/•hmçÙ?®Ü,²“I^_1‹Á*?õ(ÚöVm^­æÌƒäÊòòœy\XÞY(Ï™ÉåLÕ˜ª1UKÕùƒ¶÷ã¼=Ì-,–w–ÊGc¹±ÜQî•åÊr¦L5˜j0Õ@ª¹ÇÊ‘jî1@òŠTs”#ÕÜcåH5÷@9S¦*LU˜ª2UeªÊT©S5¦jLµ3ÕÎT;SLu0ÕÁT©:Su¦êL5˜j0Õ@ª¹ÇÊ‘jî1@òŠTs”#ÕÜc€ä ©æ(gªÂT…© SU¦š÷Îí+[€ÆumsÕüÿÀªOß Ý®Ú?‚n×Û|÷íËuoì"§vóâ×÷¯z¿sw¾Q3ÖË|±¹ó Ÿ<ÂÕºùê±i~fl]žÛ?l¼Éκëoûºýp]×¥è 7–;Ê×¥è W–”¯KÑA.,G¨u]ŠþqŒò¿Î×¥è 7–;Ê×¥è W–”¯KÑA.,ï,gª©v¦Ú™ê`ªƒ©¦êLÕ™ª3UgªÁTƒ©Rm©¶‚T[Aª­"ÕV‘j«HµU¤ÚRm ©¶ÆT…© S¦ªLU™ª2UeªÆT©SíLµ3ÕÎTSLu0ÕÁT©:Su¦L5˜j U)HU R•‚T¥ U©HU*R•ŠT¥!UiHUS¦*LU˜ª0UeªÊT•©S5¦jLµ3ÕÎT;SíLu0ÕÁTSu¦êLÕ™j0Õ`ªÁT©jAªZª¤ª©jEªZ‘ª6¤ª ©jCªÊfKÊfKÊfKÊfKÊfKy÷rJ—ŠF°ëþåó5n™‡ßlá§70ß.l:®ø:Ççóìwÿùã›Ç»ww÷O› ló¾™y¥‰ä¹c›•ç¯ÌvÎ9«ó`Ùïy}ôÏßüÃ×—^ý¼iÒÎÂÛü~õ<ãsó<—GØŒ Ú©äiÔQ[g'½”Qöþ½¶“ 'yž(†reù@ùü åÂòÎò@yk,Gªy¢É…© S¦ªLU™ª2UeªÆT©SíLµ3ÕÎTSLu0ÕÁT©:Su¦L5˜j U)H5OC9RÍÅH^‘jž(†r¤š'Š¡©æ‰b$¦*LU˜ª0UeªÊT•©S5¦jLµ3ÕÎT;SíLu0ÕÁTSu¦êLÕ™j0Õ`ªÁT©æ‰b(Gªy¢É+RÍÅPŽTóD1”#ÕßÐÛóÍó¿{|ó×Û§»ÿú—»Ÿ>~ê¿ÝýôáéáñúnŠ9~±ŸÏÜ<þÇÕ;S˜ÈMT{Þ$åðªù÷ç<&œ¥ÖUÛ銱ÜQ>ÿþD¹²|Ó5ôþ<û×»§¿=<þ%Ÿ%·Àºyñ«W¯î>|¸|üõÃýÓãÃ۫Ǫk³ÕùHá¾ó¨—å›u~*Ã#4/iëæË +ó˜PwŸïÚ"÷ÛFù@ù|Yraygy |þÔ ÜXî(ïLµ3ÕÎTSLu0ÕÁT©:Su¦L5˜j Õ<åH5Oã@9RÍÓ8PŽTó4’7¤š§q œ© S¦*LU˜ª2UeªÊT©S5¦Ú™jgª©v¦:˜ê`ªƒ©:Su¦êL5˜j0Õ`ªTó4”#Õ<ƒä©æi(GªyÊ‘jžÆr¦*LU˜ª0UeªÊT•©S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©:Su¦êLÕ™j0Õ`ªTó4”#Õ<ƒä©æi(GªyÉRÍÓ8PÎTÙlIÙlIÙlIÙl)‡ŽeÔˆƒÌÓÖ¾Ü1ÂÍ÷¦‚_^——È´ùßAÍ}°7ë¶CDz^å|^Í&ë 4÷ýþÍOïï_þþÛËgΧYœÿ¼sšEÍÿ#ç²}ì<øeífŠŒRšu¶ÎO:FDwÙY·™OäF$W–”çF$–w–Ês# ’Ë™ª2UeªÊT©S5¦jLµ3ÕÎT;SLu0ÕÁT©:Su¦êL5˜j0Õ@ªyw”#Õ¼»É+RÍ» ©æÝ HÞjÞÝåLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSLÕ™ª3UgªÁTƒ©RÍ» ©æÝ PŽTóî(Gªyw’7¤šw7@9S¦*LU˜ª0UeªÊT•©S5¦jLµ3ÕÎT;SíLu0ÕÁTSu¦êLÕ™j0Õ`ªÁT©æÝ PŽT•Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–”Í–ÖÈ·j)ÃÐüs|MÏ)Y——ã…Í/¯Äκy8±9YïžýîÇÇ÷®·:ÊkØòµµ5çšæÍæk²8¹åNRù%uùûÂçwڣכּþNç¯ P©ó—¨ ÕNêüMjEõ uþš5² dȲ„™oD q®÷HŽ@×û oˆt½ÿ@r„ºÞp/¥ÛÞß»ï?ÜXî(Ïß$W–”çû$–w–3ÕÎT;SíLu0ÕÁTSu¦êLÕ™ª3Õ`ªÁT©®÷HŽT×û ¯Hu½ÿ@r¤ºÞyCªëý’3UaªÂT…©*SU¦ªLU™ª1UcªÆT;SíLµ3ÕÁTSLu0UgªÎT©S ¦Hu½ÿ@r¤ºÞ 9R]ï?©®÷@ÞêzÿäLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÎT;SíLµ3ÕÁTSLÕ™ª3UgªÁTƒ©S ¤ºÞ 9R]ï?€¼"ÕõþÉ‘êzÿäHu½ÿ@r¦ÊfKÊfKÊfKÊfKy_†Ñ¢‰º“yø¾îËÐåKÏó ×}F)Ñ|gáþ;r½oàoï?<ݾ}{ûôæáþªï±Ó¯¯'/ØÞ»½²…=¿kAÖõSÞ a톸]·™â©çËoRªÔóµ7©ÕƒÔy{e” ËgþH¼"м½2ÊiÞ^å5o¯LraªÂT…© SU¦ªLU™ª1UcªÆT;SíLµ3ÕÎTSLu0UgªÎT©S ¦L5jÞ^åH5o¯LòŠTóöÊ(Gªy{e”#Õ¼½2Ê™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦êLÕ™ª3UgªÁTƒ©RÍíªQŽTs»j’W¤šÛU£©ævÕ$oH5·«F9S¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0U6T6U6V6W6X6Y6Z6[R6[R6[R6[R6[R6[R6[R6[R6[R6[R6[R6[R6[R6[R6[R6[Ê1¾;ßw†L±×u¥æ¹÷ή1~Ÿ_àÞØ|Н×ÛZ¿¼{zz¾½ò|™í7/Î7è9ÿù›Û§Ûn?Ü]>óõüÌÛ‡OòÛû×—¾}óáéîþîqg ÑæK¬Ò¼î| —õ;óˆùÝ)Ū°uqê}”2ÔvÖí &Pn,w”×Êreù@y+,–w–3UaªÂT…©*SU¦ªLÕ˜ª1UKÕÑjÊå½±ÜXî(•åÊòr/,–3UgªÁTƒ©RÍÁÊ‘j&H^‘j&PŽTs0Aò†Ts0r¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁT©æ`åH5(Gª9˜@9RÍÁÉRÍÁÊ™ª0UaªÂT…©*S¿Äçqë{ù¢×}´J ±÷ºÿËërƒÜ„`HÛY×Lwæv½óíù¶YÏ“‰h7/~zøññãŸ?Î%®ûç¥kÞCKÇÎC~\}½*o©6oÊü"«æOÄÏӡͪk„< åòü‰ ¹±ÜQn•åÊòò^XÎT;SíLu0ÕÁTSu¦êLÕ™j0Õ`ªÁT©®i#É‘êš6‚¼"Õ5m$9R]ÓF’#Õ5m$9S¦*LU˜ª2UeªÊT©S5¦jLµ3ÕÎT;SLu0ÕÁT©:Su¦êL5˜j0Õ@ªkÚHr¤º¦ ¯HuMIŽT×´ä ©®i#É™ª0UaªÂT•©*SU¦ªLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦:˜ª3UgªÎTƒ©S ¤º¦$GªkÚHr¤º¦$GªkÚò†T×´‘äLU˜*›-)›-)›-)›-­ÝT}”b½Ÿ¦éºézw°jÝW ÛYÕÌv&ýzÃÕ¯ïnŸÖ)Nù2òæÅíë×oòšæÛ·—ÏýêÕ«‡ïŸ>lÆtz²ù½ÉQçæ‘/ë7ëÆiþ»æ ²¢uóÀNr©¶·n;¸S–”Ï;” Ë;ËåóÀåÆrGù`ªƒ©¦êLÕ™ª3UgªÁTƒ©RÍ] QŽTs×B’W¤š»¢©æ®…$oH5w-D9S¦*LU˜ª2UeªÊT•©S5¦j©j¥ÄGò^Y®,(…åÂòÎò@¹7–Ë™j0Õ`ªTs×B”#ÕܵåH5w-D9RÍ] IÞjîZˆr¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜jgª©v¦Ú™ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©RÍ] QŽTs×B’W¤š»¢©æ®…(Gª¹k!Ê™ª0UaªÂT•©æÕï™XG#¬5ékQ÷žåËËÖ¨OÃLjuÍbgÔç×;¾üóO¯þvÕΗó¶.ÜÌÙo÷Q,;g:æ6&}Ì…yâ X7êiŒþ|ÁçfÝõwz(ª©g@jAuGu:ª ÕNêZf-H³Ä™?n(G µ"ÑZimÈ´6„ZS¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªT[Aª­ ÕVj+HµU¤Ú*Rm©¶†T[Cª­1UaªÂT…© SU¦ªLU™ª1UcªÆT;SíLµ3ÕÎTSLu0UgªÎT©S ¦L5ª¤*©æ½†I^‘ªT¤*©æ] PŽT¥!ÕùOQ.LU˜ª0UeªÊT•©S5¦jLÕ˜jgª©v¦ÊFJÂfJ†J¦JÂÆJÂæJÂKÂ&KÂFKÂfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKë^EÃKµº7_ÿòÈ{Ý«Èm¶"láÚäpþ‡ãeï÷ÿq½â~¼¿ÿ¸Ë¡âæÅo>üçÛ×?\>¾ýðÉŸ/|ùÓ‡§»w—¿¹½{·¹ÛQO,ßÚwžû²zgŠâóu˜[—§XÛlmïßu;N ”ÏåÆr'yžD‰reù@ùüE¹°©æI”$oH5O¢D9S¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTó$J”#Õ<‰åH5O¢D9RÍ“(IÞjžD‰r¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜jgª©v¦Ú™ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©RÍ“(QŽTó$J’W¤š'Q¢©æI”(Gªy%Ê™ª0UaªÂT•©Î£ƒ–û®³OÖI”æE­Ë­ë'ÛaÊ|øœ*~žýîáñéö‡7oß<ý´ž)òÓ¼üùü ÿqSËÍwüäè?ïéhÏ·ºØ>ðŸ×Pæãj۬λû}yõåùßÜ¿yº|ôáÕã›÷O›¡ˆÌÇÒRzô_|¬Ù‹êüz1¶.NcþgVTbgÝÞåÆr'yaP®,(Ï14É…ååH5‡0(Gª9„!¹0UaªÂT•©*SU¦ªLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦:˜ª3UgªÎTƒ©S ¤šC”#Õ ©æåH5‡0$oH5‡0(gªÂT…© S¦ªLU™ª2UcªÆT©v¦Ú™jgª©¦:˜ê`ªÎT©:S ¦L5˜j Õ ©æ†ä©æåH5‡0(Gª9„A9S¦*LU˜ª2ÕÂØLÊhä~ a´GŒ2кÂh-eþÚÚY×zÙÂÔëÍí~û<ã˜søÇÇåã—wOçûxž?üÝãë»×?>nn˜1›¨Íÿ‚uØÎs\àzÝüµâr¾Ç[§§–œ>êκ͜bn|n \XÞY(Ÿ‡(7–;ÊçáÊ™j Õ¼¢ åH5¯¨B9RÍ+ªPŽTóŠ*’7¤šWT¡œ© S¦*LU˜ª2UeªÊT©S¿ æÏ|DÕ~$Ÿ¿P.,ï,”Ïà ”ËåópåÊr¦L5˜j0Õ@ªyEÊ‘j^QEòŠTóŠ*”#Õ¼¢ åH5¯¨B9S¦*LU˜ª2UeªÊT©S5¦jLµ3ÕÎT;SLu0ÕÁT©:Su¦êL5˜j0Õ@ªyEÊ‘j^QEòŠTóŠ*”#Õ¼¢Šä ©æU(gªÂT…© SU¦šû¨µñ<}:>Jy¾cB©5öžæËërúôñn°ÛuûÓ§v½ßÚw?þðöîßžž¯«òv²›O¾»|ðóŒj}ôr÷<œ!§6GêÎÓ\o–“Ì£˜"yX7ÿ"ímoÉvd"‡Ë~¸Œ£eÞ¢ì`i‡K?Xæ ?GK=\Ž£e=j”'÷-å)=ËvÔ(Oä9Z6’ÃFrØHéa#=l¤‡ô°‘6²ÃFvب6ê‡úa£qØh6‡Æa#?lä‡ü°Q6ŠÃFqÔ(Ï¥9Z5Ê3hŽ–Gò¼™£åQ£<[æ`ÙŽå92GËÃFrØHÉa#9l¤‡ô°‘6²ÃFvØÈõÃFý°Q?lÔÃFã°Ñ8lä‡ü°‘6ŠÃFqØ(ÅQ£^7b¹®ñ5²d)ÈR¥ KE–y޶j©MѤeíê:[gšóIyõùFÛuûÃ(¿Þûõw~|ûñv,ç[_>ød4µ>þòhjÌžï¡oÿ²x³$oD$óp%„­ËïV-żï¬ÛÎGËåŽòù·+Ê•åƒäy]” Ë;Ë‘jÞAåH5ï Kò†Tóº(gªÂT…© S¦ªLU™ª2UcªÆT©v¦Ú™jgª©¦:˜ê`ªÎT©:S ¦L5˜j Õ¼ƒ.Ê‘jÞA—䩿tQŽTóº(Gªy]”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT;SíLµ3ÕÁTSLÕ™ª3UgªÎTƒ©S ¤šwÐE9RÍ;è’¼"Õ¼ƒ.Ê‘jÞA—ä ©ætQÎT…© S¦ªL5ï±3_7W©{s/ÎÎ÷Ø™?þ¶÷,_^¶N ªán{ãŒÝiŒ•ëÝû¾»{÷þáñöPž,’œ©v¦Ú™ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©RÍÃJ”#Õ<¬$yEªyX‰r¤š‡•(GªyX‰r¦*LU˜ª0UeªÊT•©S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©:Su¦êLÕ™j0Õ`ªTó°åH5+I^‘jV¢©æa%ÉRÍÃJ”3UaªÂT…©*SU¦ª9,èë pü”¡=æáZSEëò(TÛ|º²÷Õµ>vŽBk;É<Ä«£Ä9ûæöévèÖS½yñõí«?ß]>ü䜀õñ/œ0‚m>wÙy’Ë#\¯ËÛQw­v¶.oR`çCÜͲk˜ó=õ×ë–zÇkAuGu€ú|;½ãµ¡ÚI½î¥w¼&–ç;é®±<ßGïxM,ÏwÑ;\ ²d)ÈR‘¥"KE–†, Y²4dÙ‘eG–Yd9å@–Ž,Y:²tdÈ2eËóÝòŽ×Äò|¯¼Ãu%–ç;寉åù>y‡ëF,ÏwÉ;^#KA–‚,Y*²Td©ÈR‘¥!KC–†,;²ìȲ#Ë,²Èr KG–Ž,Y² dÄò|3¼ã5±<ß ïxM,Ï7Â;^Ëómð×Xžo‚w¼F–‚,Y ²d©È2ß’ïrÞ>Ù¯·äÇüy·Š& ç÷äçWcì¬ÛŸ†LåϳûáÞ½:_QrOß=<¼½|ôÉ8d}ü ã8éhó_¾¶g¹<ÂfPÑNcÄüGgëú©¸E¸éκí<$P>_ô¢ÜXî$oóu/Ê•ååó¥/Ê…åHµU¤ÚRm ©¶ÆT…© S¦ªLU™ª2UeªÆT©SíLµ3ÕÎTSLu0ÕÁT©:Su¦L5˜j ÕùYŽT¥ U)HU*R•ŠT¥"UiHUR•ÆT…© S¦*LU™ª2UeªÆT©SíLµ3ÕÎT;SLu0ÕÁT©:Su¦L5˜j0Õ@ªZª¤ª©jEªZ‘ªV¤ª ©jCªÚª6¦*LU˜ª0Ueªklç}%Àà<6±pÏñX·Æ&-Ârª³Y·?6™¿??Ͼ}øár?©Oný´>þþÃíŸ6wxš¿à%æw¥Ï‡Ø>ÞoN•7Gò¹&æA[7NÒz)ZöÖmfZX.,ï,”¯[vÜXî(ŸG€(W–3ÕÁTSLu0UgªÎT©S ¦Hµ¤š[› ©æÖ&$¯H5·6A9RÍ­MPŽTó¢4’ S¦*LU˜ª2UeªÊT©SµTýø²ã÷Âraygy |4–Ëå^Y®,gªÁTƒ©S ¤š× ¡©æ5h$¯H5¯AC9RÍkÐPŽTó4”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT;SíLµ3ÕÁTSLÕ™ª3UgªÎTƒ©S ¤š× ¡©æ5h$¯H5¯AC9RÍkÐHÞj^ƒ†r¦*LU˜ª0Ueªë¶G%bH%¯uÛ£¼‰úük­[;Í–ðˆ½É\ë¾3ÌC’ϲwx¯óP½yñòýí«ë`jÞà(ŸgóŸ,¾^7NÑ»¢u5//ó2¢í,ÜL!òòR’”çå¥$–w–ÊóòR’ËåÂT…© SU¦ªLU™ª2UcªÆT©v¦Ú™jgªƒ©¦:˜ê`ªÎT©:S ¦L5jŽQŽTslŒr¤šcc”#Õ“¼!Õ£œ© S¦*LU˜ª2UeªÊT©SÍ­ËÆó~}òܺŒäÂòÎò@yn]Frc¹£<·.#¹²œ©S ¦L5êÚºŒäHum]òŠT×Öe$Gªkë2’#ÕµuÉ™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦êLÕ™ª3UgªÁTƒ©R][—‘©®­Ë@^‘êÚºŒäHum]ò†T×Öe$gªÂT…© SU¦:Fôó ÃȘ4çÆó¯‘ˆ2ö^ÉÿÂÂ[”ª¾7ÐÝŽ›ÞXžòYö/·÷·zÞæÚ۩߬ Ê~¸=o„}þÌ×÷÷w¯öv¾®ó¸bø|ÀùÚyðËCìÌ›æ¿UÄüÅÅÖMrÑù]¶½çÛ<<O$–w–ÊsðDrc¹£<O$gªT×à‰äHu žHŽT×à‰äHu ž@Þê<‘œ© S¦*LU˜ª2UeªÊT©S5¦Ú™jgª©v¦:˜ê`ªƒ©:Su¦êL5˜j0Õ`ªT×à‰äHu ž@^‘ê<‘©®ÁÉ‘ê<‘œ© S¦*LU™ª2UeªÆT©S5¦Ú™jgª©¦:˜ê`ªÎT©:Su¦L5˜j Õ5x"9R]ƒ'W¤ºO$Gªkðò†T×à‰äLU˜ª0UaªÊTóæ1Œ»72JY»à¼iX¶NW´õ±³nê4®w‡ûîow·ù8uªyVäÓÏÛàçͯ?ùèá—?ÿ|¶Í¤§œæ· "¬î<ßåvJó%ÞlÃØºqê³+*±³no²„raygy <Hn,w”Ge¹²©æd åH5'K(Gª9YB9RÍÉÉRÍÉÊ™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª©v¦Ú™jgªƒ©¦:˜ª3UgªÎTƒ©S ¦H5'K(Gª9Y"yEª9YB9RÍÉÊ‘jN–PÎT…© S¦ªLU™ª2UcªÆT©SíLµ3ÕÎTSLu0UgªÎT©:S ¦L5jN–PŽTs²DòŠTs²„r¤š“%’7¤š“%”3UaªÂT…©*SÍÉR«¥ä-FÖÎxÒK-coôóåu¹3žÕç®6ëækæë3óë ô~õþýÛ7ç{ä3 É3§¾¹ûëÝÛ‡÷ïîîŸ.Ÿ¼½}ùà»»Ooîÿ´sÄ^ç!X´¼Êbó\—å;‡îbaygJ²n~ë~Þ»p³nïåÆrGù<†G¹²| |ã\XÞYÎT•©*SU¦jLÕ˜ª1ÕÎT;SíLµ3ÕÁTSLÕ™ª3UgªÁTƒ©S ¤šÇð(Gªy OòŠTóåH5áQŽTóåLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSu¦êLÕ™ª3Õ`ªÁT©æ1<Ê‘jÓ¼"Õ<†G9RÍcx’7¤šÇð(gªÂT…© SU¦š{Øü¼»Ôñ#Ñuvˆµyì_:Z÷Ùöö›uûñq½éÕ¯ßýp÷úõÝ:>Ï¿µ/%}¸|êÍý'ÿøîÃ_žÞ_>ñÉàúš¥¼y»ç©"ó7ëÎs_cç0®ÔÊ×Íã¹*_|¾½ã9”;ÊçñÊ•ååóxåÂòÎò@ù`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©RÍã9”#Õ<ž#yEªy<‡r¤šÇs(Gªy<‡r¦*LU˜ª0UeªÊT•©S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©:Su¦êLÕ™j0Õ`ªTóxåH5çH^‘jÏ¡©æñÉRÍã9”3UaªÂT…©*SU¦:ÿ,$B«’c–<üÕùº<üÓ/>_e{ø×ËõÖŸþéɯÿÖ§žÿÖŸ_Þ=þõîñòñ/ýÍŸ•¡~~KwûÔ—ÇØýÕ“Ç(e¾nbëìTæ·3|wÝæõjÞìäy³;’+ËÊç‹ ” ËûÌ­TQ9”Êç3ÊåŽòQY®,(÷Âra9Su¦L5˜j U)HU R•‚T¥"U©HU*R•ŠT¥!UiHUS¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTµ U-HU RÕ‚Tµ"U­HU+RÕ†Tµ!UmLU˜ª0UaªÂT•©æ±¥z)“—­·£—ªŠ–}zh¹]·hÙ6Û¾ùÏÇ•ê§v¹ÐüüÑÿuùãùôù õó§n/üÍOïï_þþÛËg.G çÿãÅ·o><ÝÝß=þÇßí¼ ö2{æQÁÎWxyŒWÖÃ{ø¶¬ŸÆÇœo×í½Â&ù|…rc¹“<_a£\Y>P>_a£\XŽTó6ÉRÍWØ(gªÂT…© SU¦ªLU™ª2UcªÆT©v¦Ú™jgªƒ©¦:˜ê`ªÎT©:S ¦L5j¾ÂF9RÍWØ(Gªù åH5_a“¼!Õ|…r¦*LU˜ª0UaªÊTuœšÙ|…íè•â| jò¼Z'§öñ]Ÿíºý—Ør}¡Þ÷ž_6Ï_ñùkåógþýÍÓŸ~|º|âÛ‡?ýé³5ùvÏ壯ÿ|{ÿ§ë»Y¶ó‰ó‰-v¾ˆËêÍûó{3ÿ¿Üö -“Ó|‰6¿£ÒwÖí½Yò@yÞ—™äÆrGyÞ—™äÊòò¼/3É™ª3UgªÁTƒ©RÍC)”#Õ<”"yEªy(…r¤š‡R$oH5¥PÎT…© S¦ªLU™ª2UeªÆT©SíLµ3ÕÎTSLu0ÕÁT©:Su¦L5˜j Õ<”B9RÍC)”#Õ<”B9RÍC)’7¤š‡R(gªÂT…© S¦ªLuþ:èóuD­±—ñuÿ:®•Ù¶†Öå»yƒ£²{Œ´(¥×—KýÃoÿ².µò“Þ¼øíý‡»Ç§ÿåò™ïß¿¾}:ŸwþÄÇ=MÖßܽ½›ÿôê‰j¾ß¶Ù<åeùõº(§âù­È÷ȺùSÓóNµRwÖ]CÕ> endobj 2145 0 obj 18377 endobj 2147 0 obj << /Length 2148 0 R /Filter /FlateDecode >> stream xœÍZIwÜ6¾ëWàf{žÌp_Ž²ÔŽ5c[ŠÔ'å€&ÑjÆl²ÍE²þýPظ´âSf²<×WªBm@ûÛ‰G\ø÷-ÿ#É|’ïO¾IžGŸ±dE1ñ'vS²'¤QJ*>qDò)’ WÎF°#_Nê—ü|òû0© ®‘§w¶8.s{ò lÅN§Y–IY}ÇKS¾EàÄ@ä{òÓåÞ'˜­¤ç ¹ÿsém‰Ïÿ?È%'ïÖ'?½ˆç’õÖ¸@’9±ïº®ŸD$u?ãÿød½'¿¿¾`‡ªyÞ³º'?eÁÞüAÖÿü—8“FQèŽG,/Ó|Ã…ÿC'@p?]øP%VþÉ CáŸG #—²>ž“°Øß¹ù 'Â?ô\'…Ÿø–ùÇþõ7[mv|o­OB@"[—+ãú±Ë½ •¹n›œCË`qÇsÈÝá¡¥EY? ÚÓ íXGÎ[F{V§²ß‘³¶+›šxNê|G;,XÎ%ï$ÂlQˆ;yÎÖsü…IWV“~ÇH!wÇM9çOÚŸ´'¹§ì ­ r`í¶i÷bÎ퇻õÅ՗ϤëaŠÚÁ,rûËGÛ £c"‡¿ ìlÒ Â~x±ø¦¾ãrÉç[&±“päx±Z°°ålÒõ’²çWŸ®ÏÎ×–‚óí²t²ÒVxCâÈÉÈëmÙv½F]Ï”&ûF“miÝ3³Ô²¥¯jó•S5Öž•%@ÓÚ+iZÖÑœ/;°¹ƒvVÅ¡fU™Óž;«Y›=wÔH¹aÖ²…H¶¬˜уð[Q¬ý6Êœ64dEÛf`—ÓŠ\öÝYóš=ëË=³XucÍ=´4ïA§Ê°Ä¡¨aéfpg ¡Yí…§,Q³µ¿²e:è¡Y÷¯…Ÿ/oÓT…àù÷oƒkrZÏ-ìû —uƒ›Ç©q ´N•Nˆ6ƒ5ôŒ;#ØÓgª¦³V<ÐÖú Ͳ°±Žxko|ý µ£íh:hU\ÖGv’A£®D0H¸æQ·Ù[5©+J´jÍpó åD’fhQDê º$h–JÆG¾iZƒÆ!¹°ùž~euÒëä¼çƒr}9<²¸œ$-.÷³¿;>Ø‚–¶ ;k"·øÜ„a<1¡L`Ð;Åj'¤óf7Ö°4 Ü éš=iú+«£«ït¨„µ‘!ÜɯuóTkTÖ ›Žì3“' ..>¾ôÝÐ-eÃ(šÒx¾£õOɪ088F`¤`[:T=y¤ÕJ2yS ûz^¬¼Ô¬|Ʋ/fDfÝ4æuMÔœ}S°Îyi†*Ÿšéiöm(A`ÞIhzì±ånÏo.¯­ÕÕ`­×@ÏÖ™«œù•Gotz^údŽç¦¤+¹èF`nHß›þÙ¶g<"ƒ@œ«U@‘C5¥ö>ÕÌ¡Hc Eú‰ ë ÆAR¸ÓP:áÊH–ÂÑäÖ÷ Ž80ä¼oŒ¸ ÂH„¡„4†Ò·«µYàòãêV£wgçÿº»žÊŸ†÷åçó›Õ§Õç5YßÜ­¬†Ê»·Í#>Þ톾àÁÈÏ(ß±üë¡)arÐS4­>Ëná˜Âi$]Õ9º9pI<+È``aè*OyÿËe«jj¾Ã†¨Ø…ZöX6àz2­QT[ê¨Æ= ^„”ºü8„ßýx½Q¤59 µ’ ÜüpBo–„ž±“ŽL °ô¨Y Y&Ø>Jü¶Ä®ѽ°½§±´™YXdFÄêA€¼©{Zš}ÎÏÎ?ˆÄ*çÒ,:RKù"hÒê ùÜ>þ4l”1L!¼,ÕŠ¢U¥HÝH,óPªY8U •ž€Te?›–}/×ó\׋²LzÆvì7uM÷ìÕÑFµƒ0ÎÒ0VTÉD¯à½¸³h}µzTÛ€¿ÎIR7wâ$•…š'ýÕÒ¥: ¦is'úX,Ú¨¦ ùVðtÙ Ã#) »GÜöªAvíã9f±ÍŸ,ïÍ8Û–u©z)U]Œ¾7ë[zX¢ãu÷eYó]Sæ¢f!Æ÷9¶ð܆Ót˾š¶çwllĶC§.”¼B«ð!Fé ¦(nz™•«ðGàÉ+­É0‹åa91)OÜtá¥ÜW/åŒÜiá¤s›‰ü> ò3c3üÝ'£äø£ù|–~ˆnÚl@+ëâP/ÙM½í¢5…›Ãü=Üw € NÜì…ñÙ¬KÙÿ…ž¨ý;CëÀG(£õT3ðiyÍÓøx²Ic'× ¼dA½'¤#(ª¯_A'¦Ê:Æñ¬ÀÖ1¸gš¹ÞÂÒFÇÆè$꼆TSºG—ª––n²FÌŸ¸}²-…¶íð<õü…ß3¢pòåÒ¯ óYº%¥û…õáŽ8þ2\Z6ëœKÏ“›ë»BÚy ëøÉ» z–¹®á9ßçTI¨^}ÉŽÇ›Ç?;¾†%†<1ávßüˆ¾ò_ÈÁ=£paË@Ú ra±$KSÿ/¤Å‡ÍEwtoâ„Ô7­}&´;®iš×ýü…ü{Ó8ŠÜf>k ‚ÉuVç7*SòŽúHÅ’ƒëùþ¢Fðã’½¸‚¬K“dÊ£óÑú‘t–ÂAÃY`ÇKv˜Íwp*ë÷6DâV†$­Ÿ »†ôÒ•]ÏêÜæÚ«hZõóóÆ `Å«¬õ°ßˆÖz&HËx%=2šå}¹ˆMÅ,ŠÅyòåTcÑwÓn·pšÖðA×DZÞ©ÃYø{œÇ4h-öQzôÙ:ø½µ8†Ò2ò)þ7xŸºÁ‚ä?])Á ?$ÉÂBF”þÁHªÔCï{èÑ´JöÆÐêCÎ~€jeï®ÿ]”ÿÔ¯ü„ endstream endobj 2146 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2147 0 R >> endobj 2148 0 obj 2706 endobj 2150 0 obj << /Length 2151 0 R /Filter /FlateDecode >> stream xœÍÙrÛ8òÝ_G{*AÀ›|L9ÑŽc'¶¼S©ÉÔLA+<Vô÷Ûƒ„DZñîÃì&q¹»‰úF7òãÌ! þ¾Æ_Qâ’´8û¡i‰\â…š„ĉhÈbRÄALr\xâ z’ªW+dCþ8+Ïùpöç_°hI ÈîŒ6WÛÜŸ}Ãzaœ$‰–Õ¥Nã H òf^¸ä}%Wéq#ö?—Þ–ÈsÜÿ‰YŸ½[œ½¹ ˆÃÈb5„@”ÐÐeŒ¹Q@bê¹ þqÉ¢ ž¿Û¼Ú¢lɇ.[Š‹¿Èâg³…VQòË rá_De$||vøÅвž>Páǧž¢…º肟ríXý?0†R¿Ÿ5ŒÞÊb>v“´Øßyø £Ãh|à 7ò,óÆ×ßlµ‘#ñìçõqÙ(°Ú äuâó5Vž•¢1”¬4µ¬?[7"m³ª_õíü/;žürÃËõ°][Ml§Lùæ* :Ôc>HÆ#±i“ÖÙ¶5Ì#M=æ=Ïl޾Êrñí‚ô¡é…âØÖÕºæE‘•kCˬ­êAÞ[#k”<¶½]vtxÊ·ü1¤Z°Î2ÇŸD½'9¯×‚¬@¦†À²¬(«–ìj¾%yë”s€³P£¼Gœð@yFüˆú,H’ØõÔ©Ú/Æ!à tÁoÚŒ-ñ¬-æA†Œy¾Vb.]ƒnäüã~+êû/×Å¥l@´«²êò|Àjf@A¯~{½˜Ý èâí»ëÙ€¦UQ€‰š’Y0âY.m<QYÌ›Ãc\ò–XÓÖ]Úvµ°wר¼Y}ätÈ1÷È\%/D#ãÌóh&«v|þj d«æåWùr@P¸G®¢TQR^b„ôø£õ­ÚŠRØÜõQdØÖ’¤L«²ÉšV”i&KFôz•uh×(ûþ¥ø9Í”VyWXÊI³Œ¬—øGÖ“)Æk!“\¿åm†ÞÝeí†@¬½"…ŠnÌLL'Lt곕ÅIhAJ‘7>î·_Õ7Œh3æ0h‰Fì2ƒ 8†€3 3VU]€0l4qÅÁ¸5)î8!4Td­ã¨½¾¹np´Ì™Z÷OQ7X†1ñú²ÁÓT@j/»mž¥¼ó¡¹ ÈC¤°  ewLËóbr âÁwA Á„„^ uÅZŸðxÙ)ùšª¤U%±&:D”¨½ã±º@Šú Dü.ö»ª†äGÿWhXuÈý£«ÐûR‡Œ:ºÛqOŠ=Zgä¾ ¾;6K= ¢’PÁZ/ƒv% &QZ]š&óC}zè=¥ ¶Ûdé¦ÇÅ:VÊDè/­£— @ }eÑà~¶UÅÏœ_–ê>6sÐJ‘{d¥æGNk±îàû—•Ò™ã`‡4â'P¼ÑB^ä˜p_âÑØƒt|ÿ¤ûFëì°ƒ3 Œl(éYÚªÚ‘nDúB®ÄºEO]»bÅ»¼%O<ï hÄq€Ü­IªcnÁˆèEšèóÂ4@KûH¢ËÌ›ÊÀÛªi°¢QC¸€1°n04Ü“O·ˆ²ƈÈs'„}Au Nñ›óe•3:wM/⣘rMª1yÏ+#àþãÃâýí7=~y7ÿ¼Û•Cqôm`ÛmäÐøµåªƒU}Ñ+Ät" 3W þ¦.­ .sÓ´8صÂ:ª›E-ÆÐk·dz´˜ù*µ°ô‘¢aÙÿ K›÷–„n 4ËjÉ=6©—™ÎÊV¬ë¬Ýã]*~B7€:¡ö }:ŒDIÆ'ËëxÝÍÄý ±J`ö½ÄZˆªDõM£¨`YMU—¢ªŠZ«uˆ(ÄÜ|Ãrå …(oèÒoK:PÀÓÍhµ• ¿‰½LGe}‡ŠÉë¥E«7[[òÀU7al9̃۷5Äz ·ä ®ó2ª\ô ô,‰ã‡ÇŽš®õcŽË³Ëߟ¯ïÀ‚w¿ ÝQÂôèñv¨³FJ4:Ïw|ß`?T‹¢‚‹}B`¼}ˆÍ%/xÄqs» 7××'eŽ‡Ð±xadd†Üy]bøÏÅöaö bW–З‰=æø|7ÿôöî+ù}öõ”ä¾Pœ.ã(JŒä0ïú8¹f¯÷ý.zÐÒÈPdÄ}ØÆ*@•~ŸÛËUi™æ0¨œi$„d¿JŽjâÿXVÏ*OÌfƒ&˜ëßΘâÇn€!˜9‰½Ð #އ›ù—‡ÙI„1<ˆ8×ïã]qGÎ2$“ ˜$ÃV˜õQo[aÔô´Š £~ ÃÈ Uq\ÝÞÍæn~i>ûFзE¬Ï‹õ¿H“†À89ü0x™ðcŽËÛë‡O7dñõóìþ¤ôA@C%tžŠóÇŽtxÑÍw»ßâó ¸fhÊ® ?y±…ŽT›ß,ffw†C»V_¸Õ»ùX3¡pQÏ ’²U›pƒ isÑö×Bá½Õð'C.ªe¶’íÁ©±ÖÇ2/ 'ûuãçœb—sí+²¯:©2¾.H¹úG ޱ\<ך3õ¬ s`èz­ªâ£—¥…0 ¸Ð|˜°zÇÓï;¸É¥žô³ûyÓt¦YÀÎÉwªÐcÔ Õp¡v³§‚˜&ýã”B jq>oŠzѰní$r°É} ÞA!{Ê£h[QÛ¼ºÍ“ضOYÕYç<©ÙÄ¢˜VV"n}™boaUm‰µ\>PÑtUÈMË(Cœø U Þ€8ØH¹‰]³Vð}?d9¼$=p˜¡fÒq=ºÛˆÒâ(Á­*¼lBkJj¦À®±ÙdïœòV›Ô¨ G'}°­Îz[hÇþåßW?´• endstream endobj 2149 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2150 0 R >> endobj 2151 0 obj 2179 endobj 2153 0 obj << /Length 2154 0 R /Filter /FlateDecode >> stream xœÍksܶñ»~'_"wd†ã«ÓéÌI>9jdÉ‘ÎÍd¢Lwé˜ðq&y–ÔÇï»$–GòÚ~Ik[v,‹Å¾ÀÏ'®åÀß·êW”xÖ:?ùL8׊<Ë „–Ù¡[¹E@ÄV¦öšj5}¥Ñl­NŠÇzòÓÏ0hc9v`=Ÿ8âHæþä{X<m?Œ“$!^=Ûcµ„o‡ÐXçÖ7W¹g½+õè–{EÈùŸsÏ9ò]ïÿ€#Çz:9_ž|sX®c- D‰zŽãxQ`Ŷï%êg-së§Ówr—•¯¹,ëý>ÝÈ7?[Ë¿œ,–´E=_+‘ÿ"[kR¯#˜9ý¦eÞ`ágfûˆŒí°Õ•ÑÁÒoÕÑ6-(ü=)"Å&“–Øï¹ø‘Q]ÇŽ{gáE3&þ¾~ýÎR¤Z{z?Î@¯ËÊz]³4àô‹¬ê´,Ƶcû…Á½áRTY*+›¡îË\òá h¶¼kW6 Í©È.­ë½¬âáT¾b±ÅZª{P?¼a¢â´³´n$Ÿ·••ì±)å$cû,; ÕÛž=“©çu]…\7J’»ªÜɪIaWJÔ"kdUˆ&ý"k{@hæÛ³HY—=x^p0ÊvþªŒ;±N7òQì³æÌ`ž·²0кÌw¢Jë’áê¦J‹§šÍ!‰P÷¶¬€íÃñNkÓÞ‰ÍEO«§Í–Í܉5ìÜ –[>y+ ‡òñjàr¸£â %õÍer¨öÁ̾ndÝ|ÝNÜ”Y8œKú‰=³H'±=¹h8³Ã@MŸù«Y§Ól¸N`GN¨&ÆGzÞ¦ë­aOßlås×µ¬ÁuTÒp/?ïEvÖYïÒÆÌF5Àv&‹§Æ,²IáH* —Ñîpt˜¬äV|IË}ÕaX'°ÒTe–ÉÍP½Ãè`›+­Þ®¶ËÜU„HÛæãüƒî?Î/ ¦ëÈ ’‰B` < uqñ2¶o7 U“ gh öé‰L1\2àæ¶ÏªÍy•rrŸu#mõnRófÁˆïË¡¨!âèz7_ÎÏç÷ ëâöúz¾¼º½±þTˆ\þÙúÉR’EyþÂ}(ðçIÅõ’xH}hñ\dzC×O’xæ3yÃqŸj´H¡…b±î rº½uý\VÖ‹ž"ă¬åÛZµPÙîð[¹þ­ƒè(tÛ®×Uºk:ø1ÍL'ª®Òµ6¢+XÇL)«QÒ벪ÈÈuÌ‘Þî|D\†ôÅ¥dÒÊÂRP±u_ÜJ K±2_@°¾Ow×#GéGvIFGOòpØ•Þñ,0ŽÛh¹Ø•u®PÔˆÁk…íz'×éã+ëܲ‘b“§…•ø”ÔØÔZ©R‡¡ó¢±ŒAÉä§Œ˜‡Ó´€(D0JxˆØ¾ŸO0Ðã]æ»æuDˆ‹ô„Ørýðfä`"ÏŽ“(I‚£çr0êÛW8þûﯵÁ‰•—òlÇ䩨%ŽÈ¢iTDa0ÍV4ªd&^ ˜6l$è™RIæ±é%'Å:zÞ7 IgG”‹‰y`øÈ à8ØyŠŠGdÏz2SçX®~U—X[$ÛZn%èD'å8À]4ûª7IéV.^Ò|Ÿ[lãÃCôÀæ;p¡ˆ4ãp\gË¢Èv1h*‘(sDæ{Œq»!Ú(t”>µQŠô éÛ5gD§Ø0¸”qTI%Ft¤ÔûÈÚ³Š’ul$­põ!~O×]V#Rƒ¾/µJB|¢ìŠr ™6-aŒ!£jüe#¶³ ‚wfF Ç™Añ«‡˜¼LÑôØó\°“.ýCFd{*Ê1øÞ²¢™ÊR!6°`[*FÙ…Ò+ò…´.—à]AD"Í,±*÷õ¬V…3RG#²¬|–›í†ÐÖ!TãÙQíŒ[ªËº‘ëLT·)WQÜ>/ýç¤=–º™ªC€žË—]%ëZÖŠqªÔîütˆêÕªÓ¿Ið—Üb8î‘TÍ‹T&=sœÀõr<w…¾È#ãÒúÔ×&LµÞ@ Ñ/¨(³i¤Tô¼‘Çí/õ§l0]´,ÆWŸŒ7=0ƒÉ,Á=7,•5YË_TÖ¸n~Q¢ ý$>FÊ0ÓòL<ОžGÎ"qè¡qG3ãǺPvMS Aý¶éhfI1(žÒ€õ~·Ë^Ñ ç)¨!ëÓZ×Lû:Ü¥Eh¥‘ï2­ˆ]ë¯ó»‹oçwŒ÷a(¢ê¾@ØMRÂôC;0ºƒy~ŠÒ´÷gLÙ°'0¢Œ 0Mßûn’v}{óÞìŠtÍÿËÝðÃyIÛ€³lwî{DnªÊד›"S[*µ•SC­Ìá«J÷ʸ+„¹!Ú Uó347>Dͳ0tv´44wÑ )t툧JLY—0Í÷w·Ÿ>ðüGÓÙSb¢ágY1L«JúkòUֶ̾ /G ÔÞ²éën3±’™m`ˆ§aÁW¦|azÉiAÝ—­¯óƒÇ´ª<9ˆ=´PèM)Ñ›å¢YoÏ,Ø ;Qdxx~]‡N ©pt4ÏŽ»¢òDç°‰ç’AT‹E@{^6R@¶T3EÂÖþµìu©ÊŒ8À¨qZ­‹j×Úò•kÊ­T2;›<¤ !29$B¬øøJRÑi3µ5µ¹‚‹êË•r.ßU÷üyKJŒ È`£o%V*ù©f#´x Ø]*Wò±ìÓë ÕØp¼ ØVõ8Je©sËuÛŸ˜]ï±NÅ—å{XrbGëGCü$<ÖUT{·¸\Ü-n.÷Öß­åÝ'U:ºœ_Cï?§+GÁYËTÀdº ê¿IklëJ†IGªê®J–ÔÙ¼o›wöžMŠº‡Èç4cКrO„ÈáäZnÎ (XjïÈ‚½š¢î׋‹¥ÿ`š—w· dÛ¶ÈIãÊÔlÌÖ‰m£ž>Ð2ÞWÆ"ÜNnmloÍ-}9Þii!iÙèAà' ´6[’JQ´Uõú2<Ñ@åÝn’ÄÇ“áá¸ewoLæZÿ[$Y@Jß7ý´à…‘¸êíÇYïýâfq7_.tM:ò[OªZï—óOט߷­«w‹›åÕòÇé Ùsm°vIÆþÈš†ëÕ¾1@k´"8¾9åâX=aÄñÈBï®>Ìïº }·˜fyæ'p¡anàGYÞ”œÇãWg†“ž)Á§kÐ.m8!ÏWޤ’¢‘¦¹«Ò\eyâ7ùjèËž꾈PeßÚ€9D}j% ÿ&*ɉè©4U–øèùñЇt8HFÃÎÇCý»#Š€– Ç4BŒ V€#'éZZÀ0йjö,^œël¿‘X-BÔ9ª+mXM=]Ï·c_=1¨«0`àân—O ˆô Õüüz1ýÚ–À âú0 G¨~:ÓÜÛi¿â³W»uÈA;Û¤ ‘À>A‚g¹xeSêzŸ36³Ó÷‘#€ ·Ï3SuW?ü&€„m¼/xˆ¡hª/  _„×{|eFTkµÎÆ©Wª&THF£ "ùC‘oCH åR(cÌ»/M{úrľí¹ÜcTôÞ%Í`àP¸ 0û^v Sü@] .Ä@(Ôµ)y}8õœ‡7o¦U0ŽíÄó“$H¢‘äžíK 6›Ju&°ŠA½…Ž ˜®Ûþø‘㺑7²V'!ÜA+ ‚ú{¿Y.Þ/î:¸s{#Rt•ñ÷/Ž)´#—¨¢ îLNQ5[ñvî} ¶íÌš"ÿ©è}ϳGUóCw„M ¨Ì ¾ÊN±lŽz95»î6šë=í)ÍÇ›î|L¢ä…+c”áȪ„+£®?Ï CCý®Gw\]m°BT·ª-åyT¿g;è8TÉ- âc1Ôp\ïæ@1¿¾ÂsB¶Ÿ`yèÙå rrÙP¹%á9UÂ3œ)ÙÌÇ}ÑIà '®~…¸í…Q_r‚ÓvÂ÷Mh2ÜmY=ÙÛús¶YÙ×éª"[š0ŠCO:‹mõ8—DA8Büg]:ô”ìëBâ;X¾@`\Ûñc¹7Øç=Ùk SÁ.W@û~¦V‰j?ŒÌ)9éÌ…ˆÐaqæ.Ëë]árŒ½#=´=ˆR "HëúöýÃéË‘û=ƒû}d¾á °ÝŠo^Œ”‚hv@A i“ê‹®$ œÚ L©¨ÅñÝ:_ uÎÎʧ¯ŽoÏóC{¦>CóÂx„舀hÇBÇ ü£YÔp^¬ƒtªe ¤u›5~ PN•ç`ŠÌ@|T§NUÅt ìùX¬!ºøvÓÁìC…EŒ:Æ5ˆÀïl°Ý°Ð‡~ÃtÁÞÈ·JNr ¾êb„Ø5²Š=„„ÚwÁÍønxLìÃqe¾Û›7ѰW>C¡Ø6Å„ûA+âº/›¤w!Ìc*{BH°e Ëõ ŒOÞÓ,nEo Ó¾“õ>k>@ ¨°ÌfÑÅVæò”Ç;³TÖËppÏÏtEžfžd!ᆃºèéµ¥‹f|]¸gÖ…g÷¾¬þÓlY endstream endobj 2152 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2153 0 R >> endobj 2154 0 obj 3551 endobj 2156 0 obj << /URI (http://hsqldb.org/repos/) /S /URI >> endobj 2157 0 obj << /Type /Annot /Subtype /Link /Rect [ 258.64 236.43 357.26 245.43 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2156 0 R /H /I >> endobj 2159 0 obj << /Length 2160 0 R /Filter /FlateDecode >> stream xœÍkÛ6òûþ ~:lp^®Þ"(pIÚ\‚´¸6{(Ф(h‹¶ÕÊ’#J»ñýúrø’d;ùÔ»íÃ3#r8œ΃ҧ›ðÏüÉˈl7Ÿ4-$yDâL“ÒŒ„9Í‚‚ˆFŠ´ 8å ÆŠªG#²'¿Ü´7y}óá7T‘€¦äé&X0G6ïo~‚ÅÓŒÆYQ–¥–5¢aQÈ%bš°9û7‡ˆ¼êÔh#½düÏ¥÷%ŠÃèÿ@¢€ìn^<ÜÜŸ’0 [çyI³(‚(OIA㨔y8·¯ø±éNÞäõXWüÙoäáíÍwz‹j¾r¢þÍ©ò¤Éƒ4 ¦Oì»J¬<Švÿ}9ßI”ƒŒy‡%ZH»ãÃË®íìÀ?ÞÖpf€c˜!hóv£}|fX/””$`Ã"-‹,޼=ÙX[]Ð(¸$Ö;¶æ‘+ Ü|…Ta–Ð2 Ë2ò%o`R—ävÏ„…ל·Ù4¬¯·5¯Üã“Ñdkƒ!’XHùæoØPw-µä‹ˆÓ„†¹”0+.ë-tÍqq…£çÃØ·béÉqDãbjXÄ8E{g‘Û±­xßœêvg(hƒµ ÜÊ Oûº±3/Û=-hÇe™AzX¬=÷€+ûŽ@}—9ô¶ ÊÚ“µ¹”¹¡ë ´ã-ïÙ౦f‚쟧#ïßÿôn©Ky.&b„à¹0+¥jíÊ ,¼gÜ ²Ð¦k[¾‘¾dIǾƒ•‡ÓÊR.«sQde'áR,PóïhÉߥ /ë8»ÆÅ‰¦ßì-Vñ-ƒ&,aèØn³µÛÚ#ï…¿UPc¿‡9s^-µ/«°©'«u³PÎÛ²Fp‡âÒ‹îà=éyÙàÂQº­ƒ=9‘¦Ÿ©ÃíF‡Ó"æ‹Ã?›zSÍÉ“Cy¤Göµ'†±¾£0qyžÌ'_¤'†Á±·m×Þ-U™3UŠÜ—õYsØTÝýÇgä¢÷•PË ”•é’Õ,ù\‹èÅ5>ô‰Ç›È%€yd ø—ÔËÅ´XBÔ•LS¨E.Ëöåø—ÁFçX¸a™…¤ßŸv5«8ÊF¤°ËçšøB ¤åÛ͉@=0@d aêGé<*ϳŽä.«™z‘HÖÌaØ:Ù0†é(dˆݳªxþæ"Ìàºí h]÷xº¨Ùâ€>ÃyXšRHy-¤%™mCÜ{ÄÖ:׈­Çº©0ÑèÇÞ&-qØ37EŸ.oþÝP©2;­¹ã0=iŒ¦WnU¤ÞªŒ€0ÿÌ7ãR–ÙÉ‘=A6SǨŽebl—¿•³šzݳÞ`â$~ ûî3;µ‰ªX$ÌÒj<‡TQ2ìÈ,×hlëÁ<ç€ýتJRÂtkjÆöõnÇ{nx¯O³(O¤^-ù~ªÐ*¤©ÿäÒí@feÙãØ4µ!m¶í»ƒ:Û-žºþOC@sw Òž€ Dš›ç„“•ͳHe_ ù+Õçò¹Œ â@þ+^ñî((išBuUd™_èCv•ûGe"Òµ£#ŠÎƒð¡óÆUü‘72’ Kª¨r‚è8šùè¸q³E¸„ˆ”'¨:ÏH.ZvûÎIÒóc'ê¡ë/Ÿï(+)p*Kðë3,WN@'s+ÈL:œÛ·Õ£§¹ÁÓpÃ_ÇÇq 1Á¢ÚŽ Ÿ‹¢p&¨:6q*›] A7gˆ0 õ¬Ýq‹Ù0𾵸ò\ƒ\)všÄ XÚÒ¥T¢Õµì Ü•ÉÔíˆ÷NæÁüó†+¯d¥mtm£÷¾÷çb¡€0xʨ7¢Ö`ˆvíA0(ë ª­C—æIbše°1hU®õØËq¿â9¸KRšO2„#b{§‘MWq‡Íò¦jßÓ˜úÎ4sþìÕ7ËB„uÏ„ˆçafn- ˜®GÓjò›ÖçPû‚ƒ•æ±Tj$MgÑ ‡©l‘}¡‘2I5³QVqšl ®ñµÇx³ç›?¹÷°ö&bY‹ðIH³lã³Ñæ0X;ô]ã WYÁá¬é 8©ý9“íJvgt”å £4Š41:bú~CÞnX[o!¨G2\b<À©Žº‡o¶¶{ÍðÒ¤ò˜ÔwÞîY»ÑÚÃõ:c”×s`ËŸx¿Ê:O¿ŒqÂ9M{FUò>u¢ªñXAÄ…™iàÔ°“ñ¹ijçMVjGM ‰¯·­/Dþî‘Ûm½Çp¦ŸY/DÊÇÕYQ'^¯×¯›Æ1mžØÉ­q`ÃfF;e¸p$N¤Üˇ1Ís(³ã0¿Ò–ãtH‹VûxçŒJ5±UM""¬iº'aQÜ5ÂèIzÎÖ‚Pä+¥!j«+jIoZ_혫 d1ô(ͳÞu}7 O°«[­?Þm Í:öXΟ‰lq”Σ\‚N´c¨Y,G"ï÷|×s¡=I²”ð27StÞ8§ÐÂú¸‡¨dz!_óP~k&J P‹?t„~Ó‰·wSdeyFIq>S¬ …æAÆ™/hGB& Џ,#CRÐtBø²’U´äÍØO$qwá•»_â®ê±æm–³$û1Mt^ Ï&3Ì…º,C>U†¦Ìua?X\±IÿŒa~˜¼Sþ¹ðÈ3Ç¿Ìh^ðN½ä ë¾B]i`Ù¨àºÝt‡#øýºqD}Y…„ ÆClÜ0¤‹7…Q’ÓB¾4ŽáP,Å_ŒfQ‘SˆÔ — ¨á…¬{ð® ÖZØt6 QÅ™Ø{Ý®ÿ`½…¡{ÁwXzïgL)‰g"a- £¬Ž! ªNG½.m…½…•„ªu(ë¶T|=îîxËÀFü·ì‘‘lYÐ¥YNSyeš¥¹rÆ;¶;ÐYb+D tàýàpóî]!ÏI¿uT(]ÕGN–€­pLÿCß <û Ë›—g¯ø¶nkSŠèƒ×ÞXy™-/WŽ$ö ÄÊ#ts+ªòr¦*0ÒPÿØÛ·S¯z#Eªn3Êýc>ÀwHò¦’ÉÝI;21p´±ÑT1k˜tøÆ85$Ÿh–¢3¨%ã$Q_(ôÛ^­&È+«0›–*sR.¿H*ó Q/a©,,h$¿$—W 4W_m˜¼t'?ÄÉäwv8È„K„±×cÔ)cÍûÇY8Ôk4HgkXÒ45œ“Ân¤Àä‚%áëÒ©i±L4[eBñý@æJ[*Dâ>§/*h.Ž&Í¥± £$ó—»YíI ibë-øóöâ\dqJÓ2,åm¿›¢&á§ g¦@ Â*¡y;@ôßs´¾Uß<¿7èäëÈÿ´Il endstream endobj 2158 0 obj [ 2157 0 R ] endobj 2155 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2158 0 R /Contents 2159 0 R >> endobj 2160 0 obj 3288 endobj 2162 0 obj << /URI (https://github.com/unsaved/gradle-ivyxml-plugin) /S /URI >> endobj 2163 0 obj << /Type /Annot /Subtype /Link /Rect [ 403.268 285.835 502.195 294.835 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2162 0 R /H /I >> endobj 2165 0 obj << /Type /Annot /Subtype /Link /Rect [ 512.207 285.835 539.997 294.835 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2162 0 R /H /I >> endobj 2166 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 273.835 241.16 282.835 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2162 0 R /H /I >> endobj 2167 0 obj << /URI (https://github.com/unsaved/gradle-ivyxml-plugin/raw/master/README.txt) /S /URI >> endobj 2168 0 obj << /Type /Annot /Subtype /Link /Rect [ 181.512 261.835 283.099 270.835 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2167 0 R /H /I >> endobj 2169 0 obj << /Type /Annot /Subtype /Link /Rect [ 293.057 261.835 539.997 270.835 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2167 0 R /H /I >> endobj 2170 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 249.835 127.28 258.835 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2167 0 R /H /I >> endobj 2171 0 obj << /Length 2172 0 R /Filter /FlateDecode >> stream xœÍZÝsÛÆ×_qå‹íóxß8h(MÓ±ã¸m'Ò´ާ‘Ä$h´Ìéôïî@ÜÈR}H«8n±_··ûÃ.à/øol~e9C³åÅG£(cˆ+G’ Ñ +¢Ñ¹…–U†1¸4,î’·TÇmèo« ‚Þ]|üLsD°DO$QnÕÜ\ü Æ¥Â\é<ϯ S­ Ž\Ì–hò~ÉЛºåî¼7ŠÈÿÜ{ß#NÙÿG=\üáöbò½D” Ûû>²+Fa™Ds–›†n—èãË7庪÷ËrÕ w»Å¼|õ Ýþñâí­Ûb+ß&ƒ?n3)¸! ïxYv ÷Tø_`ni@ÁLÂ^̭ʬûmnt—² ”ý}40N•'S±ßÒø‰1‚”`œË”þ0¿~ã¨%ilœ J3ÚgLŠnn.Z°…¥ÙF›݃ ¡r0DÀ‚½¢$ÃÄrT†ä‹Xé½Å’Ð\ÑØi£‰õJY¤ÕBKbn a0Û§q Ö™è¬H;±mç ±N_þ£i{•Dàz9ÒAæ¤ ¸4°I‡ÚŸédSVe±-·×6=ª0k%( D¶«b½}¬›&±nE G<*WÅ]Uί›Í®œNºU¢€K,tûÉU¤`·žMù¡®³ýuQ=ûíteBbb¼¡©PÙ챜}Þî–Nò¾XTÓIDLÔIßòŒ‡!<%l  c¸˜_?n¿Tó»¿„§“Å@@2>ÑéªX–×?ì×åææç?£›^I{#Q£ù`\§»MuýØ4ëËÉÄúƒëÍäĺ6Ñ…›‰¦œCPAS&D ©*öõ®¹ž—÷Å®j¦·N³Š0›ˆ\z ¦Ö梩7]ä'ßs@¿(‰)3Ï4Þçd·s´r5/W³=ºY—³ÅýbV4‹z…Þ~+–ëªÜvZ3Pk•¦L™ðX­Nn`Ñ]L½ÿº÷Ì û8LRÀ}ÁA¿jñ’AíSW\Z˜É-ÓQz’C©^‘…}j?Õ¡žè€?9´j†Ä;rŠU@8ß¡Äc3,²øÔßè€Ýg5I<ò ç„øµv&:«Rì©7þÅç{wÔÑq¤88'0Ÿê C*¢øAÓy_-PðW#ø [!ƒ W£nµ)¿^nþò݇›~º¡Y½º¿ÝíÕü§UµM®OÔƒîES NURX2-¬‹¯åêy¥Å˜†Ò8±¥¥5¤}Èù¥Å U–©;SdóÄSÔU°>#oŒB%6)Lã8ôôHT: dXú„g8äÊ(1Ã";¾OÞ —Ì똦„3Bdø³Ì™è¬HAi¥ÞŸOìÝ9¥DÇ’’àœ(-Ý…  rgQwÑ×P‡M‰S"Á‡M½[¿Ÿ_÷Õx ¥Š µPTšn„&ŠŠM³¸/fÍû®Íð)©ª ºã,QõµÜlá1zÝAÀª&C5¹LÕünŸØ»sÀ.ˆŽ%%Á9vúN2@-í5í‡ÂX”[ì*ýú²…¬Kô¢G±¯Û¦h‡µC‘Ë®¼øõUZ”t?`ºþ#fÑ?S! ±& ö%yXɛݪY,Kß³K÷ëàÅëT_žcÑó\(#‰ýñõÁßM]W½Ât*%€bIü9ò_´$ïŒ@‚S æó\R¬ïïÑ+4ÖSôƬ~ñT¬š~{¸ÞmË~Q¬úëÎp6½ª•Ë_÷øÛ²:ê6åü”xoÿÞdM¿EóèùÙ_:¼<¬Ûôõ±0,ªª_­Êr~$ÍcGâ°N3 ‚„'ü©$rðd†'“OÊÁ <¾ÅÕîa±Š´ ¦°–Ðäòœ>Ç+ÁaÎË¥É:ö<9Ž%W„’Lœ”û c®ËóTмuØ^N&i}±>@Nìî ÂLv«-ÌóÉCªñ¢àx=(3:ÙþL©¥ŸböŒa‡FÌ7eÇf£L1ÌàÜoñÝÖ_6Åg@¥~]x×÷å“·ª«Ï>g}ï-fõ¼ô–‹•·€LßxË£õËM‡(D®övÔ¶äÐX©{×gÖÄ_ŸïŽ›#,´8t »®Ýg4Áˆ½ñÖçÄØ9±ê{ƒ–Œ©þ1ŧ9vÎðÅ‘¢˜œ˜$ˆú@¿ßB—õ|™íf«Ãd4ðÝ0_B7A÷¾ã`Œ¾Ð@'¦4Í}SÿíËΓï6e0¯a¡ì“ªÕCó~]ß ^£Ýv±z0/Öå9E«MÀ`vâ#‚a"–é5=Éåa¯È¦ƒ¿>'1Ÿå‰ GŠj$õG…ì€äÎEæ|Â3êJ46Ã";¾OÞ W0+D$ñ( œ"ÃÎXÕ)¨ÞÔ›àÀâó‰½;«~ýèXRœSŽ ÅšKÂhî^YþröÎ úWáœoKú*ô¯ÒA¿ýÀ§bc0¦M ÕÄû¥X=”è¯V L'LÓA:UˆT@Óê*˵)²ÝzÜÔc󱵦UúÆ{“ü˜èÍX> endstream endobj 2164 0 obj [ 2163 0 R 2165 0 R 2166 0 R 2168 0 R 2169 0 R 2170 0 R ] endobj 2161 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2164 0 R /Contents 2171 0 R >> endobj 2172 0 obj 2448 endobj 2174 0 obj << /URI (http://ant.apache.org/ivy/history/latest-milestone/ivyfile/dependency.html) /S /URI >> endobj 2175 0 obj << /Type /Annot /Subtype /Link /Rect [ 200.031 657.823 228.52 666.823 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2174 0 R /H /I >> endobj 2177 0 obj << /Type /Annot /Subtype /Link /Rect [ 241.956 657.823 536.666 666.823 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2174 0 R /H /I >> endobj 2178 0 obj << /URI (http://docs.codehaus.org/display/MAVEN/Dependency+Mediation+and+Conflict+Resolution#DependencyMediationandConflictResolution-DependencyVersionRanges) /S /URI >> endobj 2179 0 obj << /Type /Annot /Subtype /Link /Rect [ 142.276 645.823 193.884 654.823 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2178 0 R /H /I >> endobj 2180 0 obj << /Type /Annot /Subtype /Link /Rect [ 213.106 645.823 539.996 654.823 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2178 0 R /H /I >> endobj 2181 0 obj << /Type /Annot /Subtype /Link /Rect [ 126.0 633.823 476.04 642.823 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2178 0 R /H /I >> endobj 2182 0 obj << /Type /Action /S /GoTo /D [2173 0 R /XYZ 72.0 720.0 null] >> endobj 2183 0 obj << /Type /Annot /Subtype /Link /Rect [ 88.94 395.83 137.54 404.83 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2182 0 R /H /I >> endobj 2184 0 obj << /Type /Annot /Subtype /Link /Rect [ 403.268 154.996 502.195 163.996 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2162 0 R /H /I >> endobj 2185 0 obj << /Type /Annot /Subtype /Link /Rect [ 512.207 154.996 539.997 163.996 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2162 0 R /H /I >> endobj 2186 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 142.996 241.16 151.996 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2162 0 R /H /I >> endobj 2187 0 obj << /Type /Annot /Subtype /Link /Rect [ 181.512 130.996 283.099 139.996 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2167 0 R /H /I >> endobj 2188 0 obj << /Type /Annot /Subtype /Link /Rect [ 293.057 130.996 539.997 139.996 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2167 0 R /H /I >> endobj 2189 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 118.996 127.28 127.996 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2167 0 R /H /I >> endobj 2190 0 obj << /Length 2191 0 R /Filter /FlateDecode >> stream xœÍ]sÛ¸ñÝ¿u’Llˆ~xO¯—Ü;ÍM{I¯Ih‰’˜P¤"Rv4þ÷î $#¿\›ÜÅÜå~aýýõ‚þ^ã0æd¹»øªqŒ„œˆ@£d@XH/";¢HF$GÂÁ#’èGÑ`5µ¶ä_Å…G~¾øð ˆVÄ£’<^xŽp%æÝÅ?@¹ ¨¢8޵­œ²(B‚ð°Ü‘ÅÝŽ“×eCÝZ‚¼ÿ¹õ¦E‚ñÿ‹<²¹øËû‹ÅO’0¼_÷G ŒiÀ=Ïã¡$<Æ?œ¼ß‘Ï_§û¼<íÒ¢&?³Uúâyÿ׋7ïõþæqø/¤ÍI¼¾7|cœ²ßc០… åÖ‚¯r½±ú'¾heã(õsÒ1Z”ÁloSã±ßSùÌŽ #óh4Ø ††û‡çëwöš³‘J·Ô šŸ"!*H… ÒnÁ!Ø;X°ô c4ˆX­”j¹ËvYÔYYrMÞ&iA~K"~MŠMJÞíÓe¶Î×ù$Ò(ö‹ð!âB rØ\À¿ Ê›Äg‰!j#‡”¬1Ùpty@CE³#~09b )9t¢RÏ î0mº³v”£, !>[<Ä÷­@QÜ•Î-ñKú;¢Va’âêCLĬ?€0æZv«®Cu€›a쉵¶QÓ6„CghŒí‹é…+êyx†âPØ_Ê:%/à­/!¯=¯·Im€w'úø<)Vb“u—&quªêtWMË>V餦c±JEšÔÛ+›g_L–ŸÉÞ„‡ÆÁÛUž~|aštÜïËC=´I—ÓI~d9©Ü§EVlO dK¿-óc•=¤=J‰YüÛ^g£ž„¸áAäŠþÔò9»Åp¯&ùzÅYÑ?'«UÖdŸS—ç˜TrP%bWÓ‡I ¹Ç§Ù®z½Ûô&UP‰±Í}Q˜²ÈOƶ†Ÿ½ÈŠó÷Âçœz"ð˜ŽlóôJ}Íð+i³;uOUàYlïÒÆd.%ÔÁv‘:¤yúµ²$²Æ$È2 \Ù3|BP/@ˆY>ˆH›U2ê@›þ$•tk>ŸÄ0*CH”‘'gù>8Œ1…š 3aÜÖõþf±ïÒdŸ,·)-›EöpZl³ª.§EžÔiU_ï²~”EŠ/×,V)œ¾UZ,Ot[ïrK­ø4dIÆ\µŸÜ#Âiô u‹0Ò‰æÐœ%ä8Þ€‹‡x1Ž\ƶˆrŽÎg|–­‰IÛ0¶Ä"†1c§u2Π‘ñ¡&A}_L#¶Fb–ÏÙpŠ Îásõ†¯ÊeE—å*Ý&ǪÙóUVíóä´xûÃoo~Y¼î6÷åÛt•5mÜK(*/,‹už-kw#ßRõò×´*ó#²þ±—׉i­°žðº'Ô½bÓ*Vöéò@øÔ‹Æœ®8°hÀG‹]" C~¾nŽ>­Ò:ÉòŠjð=&mýœtOM‚Kr -“*­ôó£A*-ý¶<æ«N®S‰)z-5ø ÛfetÉŠ¶ZØÝ8tõÛ¥ð [p¡Ö«:îÞ»mó½Txó-Ùíó´oÄ­a€…>å˜a… 5LP ÅAÚ uÌßí°°A¦9§Ù—¾JèAÓí 9ÚíC‘ЍkB{”îh{Aª»4áÙ$…‘#\£¬N{IJ®ÙB¶†Â ΰ¤mñmùÜR00¦ÑöÛ&)úÀ1ÅDÌ:©e÷ê4jØö»f˜{co…mÖ|ãoúC£lwÌvþ Òbˆ¹ ”:œ?©jaƒQ˜ç=êÈè1÷i^>^õ0D{a0÷‡&æ:pŸÔ5tò="3„n i+ ¡YÝ?ïÒ¤0HÛî¨Tyîá>U´ö=&ÆrÌun ‹Lɉ]öÐ[`‡Þê”Lõ–‘¤1¦gî±óÉÞ2fs|”Ü­IB–yRUMgIÀƒUÁqà/Ê}SYr‚ófÞeRêK¶Ç÷ÐþoRøî[¥ëä˜×äãó¢¼îåÁ„ô99t‰ò·+gP\#HE(£tæ„CIcJÞ)@e[œãúŒÛ¥=˜“!ç…x%‡¦Â0íáÁá`Pô¡±QÅfÅcmÚ»†°!òQ„JE´!('CÁ]lQéÁ¬ÃìëtæèШa³Jh©µ1Ч„=t¾):Õ9 ¸©a`ŠÆîˆZEG„.ZÑAçxäxL –‡p«| ¬Õmn‰½s¾k€íx Kw1‰ì#ëCq•Ð „íE$QþÔwð:ÀW—ðÝV_óÕý%)’]úê²…éëËüêã‹K²„¦íÕåçàúVGÑåâv2 A}Àá˜7=·V‡ 'Æ’Ðd½*ÊþY§Ý¡[* •ëþY5K'=+\Ò?¶¶Τ a- ¸Õ5³O 3C¿G¡Ý†å‡#zÔ½ÄÐ'irGí ¼xDÌ]ô[;g“å {oÀ}ºLô…“B²MÌ ©Œ Y'€ pÕõAˆ9¶¡ï¹\²ê¸\¦éʾ€­æÐô»¨x2›)<^ FÐ绂¾çBæ…sì{}A«ÏÖäXá©S×kW$© 8 6»¦G˜-$14,,†£#¤SH˜gUuId×’Ñx­µÍ•Š} Ê«í–è†Em˜CTàÕhr«³¨!†šÃä2)vEºD îX륩V©2g’ŠžQ1…4^,`ÅÄ ”xÏ J&R1EÕæp¥*‚!©IÐøŒ"ô>wthÔ°NØãÃÔ†,e"¸‰x‚AºH:j¸¥Ç´Éx¡KØ€‡nÛ¢â !½äZE¯U£ÕÔµf°aöþØÖSSÞQ(Ç93eUH8ŒxÖXÛ ·®Þ:ÙM`²…ÒbÆÍ¡<îïV·}!îP® j^‰À”êl,k`Ôr ̈¨˜ªÛ´vV7Dé^ÿ¶©þäÊ€LÀº"Ùæ3CÆ®¯É»e¹ïï ›ñËe¹ÛC¹¼q¥ÅÑ„sAZ…’nqìÑ;Œ‘“N&äŸPûSز?ÂÌW)~ª,’ä8ªA‚r#Aåšè³hÚÿ½ðÛÏ«/Ò„]A<œôþõõ½'<í¼ÑÒãcÎÆ†ÐB·ô0«ô¨âö´9Æ%^þàw8ÌÊéL]þšIÙÇú:ü†h t†é© 7ás2Ðw[rü{éˆ=zl(ÖÎUÍ•«‰x‚Am¶ÕpKi“ñB§Ái3Ÿ[ g¸é£P«hµv¨ARv­l˜½?¶uç$åwÊqÎLRö¡· ™ßsü>6º°ÈR¼ôn’ŒþMj½!Ïúlû쪙{×Á:áÝe핺õ—A© C=ëGIÑ?ON1þ ~ Œåˆ ß°#™fïõãç3cY½5ììuæíàûc–¯®¦Ü©KK©šÎF¡oMOt+p`“°õgWàðA˜{0ÌDa<Ëw÷pN/ñïùq“ÙW>h„óƒˆÙS¬òtH1DX(øÓøðzYàžã³¿¼ÁØD9~e#Œøé­ºY,Üø€¤7$ÝÀ™8Þc®Z‹ &¤ÕbÓ¸ê:kV&X'_ôí¸‚ãy>Pž_LJu‰£üi€êÆD'lÉzp2~~töý8Š=6²¢&€¨räô¯7ˆ`N†¹8Æ­Jwc£À>eù¥9@Œúí"Õóô¢|êclyþˆØ Æ¡qcîìùìÄÀ¡l{C­¾M gFýâ<.vIÊH.Éi(ý×7?¼~û†ÖßœoöÆ]™Ëæ|DhÀðZ7—g¨ ÎPú fÌüD¶ó·_ÇO©ÂãØè9#·F]xI^&+¼[;}JÌ,8;ÔLFý5 ³H $~Å4/d ”j¬ 9Ê<«ÑF±çèШaß?fÐPa;¹ˆó Òs‡£†[zŒæßÀëæà!Û!›’Îiþæh”m þý/‚µ endstream endobj 2176 0 obj [ 2175 0 R 2177 0 R 2179 0 R 2180 0 R 2181 0 R 2183 0 R 2184 0 R 2185 0 R 2186 0 R 2187 0 R 2188 0 R 2189 0 R ] endobj 2173 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2176 0 R /Contents 2190 0 R >> endobj 2191 0 obj 3327 endobj 2193 0 obj << /Length 2194 0 R /Filter /FlateDecode >> stream xœÍVKSÛ0¾ûWìø˜Y–-ÙbêN§ÃcÚ[Kfz&IZ?‚ó(ù÷]YJüÈ@s¢5kW«ý>­¾Uxv| øs®_‘d0)œgëó!bëâüˆCÖˆy ¹ì uˆ×Fc?œÒ¡pãÜ=`P”pøíЃä&Í­ó Á¹ ˆ¥”–+#~kˆ€L ð¾ .«&zÇ^'¢ÿœ}—Qà³ÿ€…©óyìx×| ã§V‘$‚QJYÄ!&“úa0.àîäR-òj[¨r7ëy¦N`üÕ¹Û-6ë1üH£¤Þi¦£²½¿õâ'$ñ¡‡0Ž{ÑS¹=XûÖ»!o eÞ¯Ʀê,SS±÷ãDôBŸ’¸w,Š;åïëë«vp›ú~¤CeÄx(q²ž:Í%F˜$Q³¨¤ÈtžÕõÙuH£abvZj=Fœm–F4]ó­b6ó[O¿i™Ä‚HÚHÇ0A;ìÚÇS±ý:„`}Œ.›Öo[§ˆeréÚG”÷é÷€ÖÓkáÝãÇ€Ö1-Ý­ˆñ òFkÇŒ„1Þ ±FÍŸP™÷'ÓºZ/’QÛB£30힌öŽ]ãšVBG§“FØI"Sëéèþ´÷_ÁÃ4@© endstream endobj 2192 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2193 0 R >> endobj 2194 0 obj 787 endobj 2196 0 obj << /Length 2197 0 R /Filter /FlateDecode >> stream xœÍYYsÛ8~ׯ@¥æÁ©µ¼Sµ´ÉœP¤BBv¼“)•bѱvt8–ÏÔîþ÷mo(ó4»“I©_£/óm` þ\±×Çèa;ø&Æ äbd:bÈvájŽî¡-Œg{hÃ$¤YŒ iÎ<¡»Án £Éà—_Ah…tÍF¯½£œ«ÉÁ¸íh¦ãù¾/|ÅšáyÌ„©9@hÿˆ>ä¼î_V2ËÕ»±ÑN”ŽLSsmPfè.WưùÙǨ¥£'Ñ:²lÍfYö\Ï¿ä+D÷§Ãa}‰èSŽn˜¦Qþ=ß쟷ùîˆ&/ûÓ3WYSd»-E?¥ù÷õa½ß½Gžå¢Ÿ:3¿5ë¾Ò½+²­¿7ð{[ÿ¦Ë4ÓËrkx­p|È­uÝ´¼n:²ãr·Z¾¬zsÛ“šgÚà¡m‰•zx€yëÝWô™P=ÐÅq_‘,I3s%-Ì^þP2Z–_+ð7áh9ð°ÜíöÇ’ýR‰ž°n’YV3Ö+X³õã:©Æ>_ì–Û¼â!?’\-Ë/ËC¥wÿåŸùÃñÐY=v^39‡ÓÃËûÍi»; ˆ²M~øü½®OûÓ};í?­«Ï¶Ù…äû6Ü–…¾›?žóžž+“ï‹§".Á_÷³Ý¯òV$iв<Â>¼¬Æ^ŸÖàkÉ._òŠ9ä¸H¦”ßkvŸjÂòdùí݃]WÓmHï:=±e„2%fJF ®ƒŒT#"jÎÄÁ”dû¯Š¤é¼6éßÝœ:nËî8ˆ„]3ÐÅ”•Áš§ë°ºŽß£¦H€©Ybÿ z¹Ùì_+vÿRÑ«õ¡…Ê4LmŸK]5º¶…µj”Ö¬òÇåis¬؆¨i¨i+S íV­ 'O‡#v˜°u8vsïú­¤Õƒ4pyLÝ’’ïù®&S£OëÚlîeÅvM•…CðEå´(=NÍ3’V_PN§ID~äüÝSÞp8oúÛM™o´R!²=~‰vû]ÎÊ8SR·ÚžÉÙÆ‚BE,BÝ£Ž! NØ\®%¯àͦÒ[WUœýÕþe¬¨]PeZÚÑò’ÿ¾Ü>oò²?Ñ5ß2 —µ ¾‹m »³XaÀަ³ë#Ëe®hàÜßjÐ#´Wôõ̅¶Èbe}hÆêŠ6¨©¸ìhäuÙjlJžÑ±!†ä«¡c¼”µ\Íu,öžþÀn üy‡˜JÜc·ì4|ª€-âÕEYF:ÕþLŠ@Þ6„‰Êª’î´mKoê Ö^Ÿ¶w?t¦1ÔNNÙSû¨Ýá¢U4uÝöEo„Ð0%%®8Ío‚(zƒ>_¼ âÑÆô½¹»!qA~Û=E– ï'èàÏ” 3‘!E\Å8M¦B+èI‰T÷w„u¬ŸiJ±ck–åÂí£Ëóy]Ü€ÐÝA÷‰(Ю’! NR^Ùz x¤î@ª²’¦jŽ*žŒÄYHÃ[•Êì~:%4 ‡ œv× Z‘f6‹M¦ …Ósz“¤á?&±ºt5ùï ,O¼6®É$® ½#D2!ŒSIÇAz/è(¹T7H Åz#¨ûŽUC¯b›¾o£C¾èìƒF=gBF*,'QHïUÙ0©§]C?B UŽÆx¤jd‘xBoºi2q3Mr_Àeçó©Á–÷ymã´„µ~P‚l}ÕXF”`D$žÁ£Hœf …§›ËêOŠõ³˜6ŸÆßF§ÓžAg±kÞõKÄ£°8Qj˜•K5œÑ4`I-qKÒ3pšvS[©7%¦ÍglÆ/vg1ؘswºÀ-ìÍY2SƒY0íGù-Ô‹$YÖ Ì¯û'̧d1 ³žàxýaÃ걉8Œô ¸Q‚(™üHl$â9+CÆÁ<¢ Xá8'ét1I“ù¬9­†×.†BÝ,(ެ­¹UÍ`´ÄEîÄ38×Óàœ §g50<£°Æ]§ý¾ÒTÎk&`ä‚ÞÏjHO9’%’¾F¤cÏ2Lè¤ßólÑ™È1ŒÚ!)˜¿¡{Ro!úð¡§A¤#Ñ/ôÅ–PQûgdyüÐÀ»‰a-d31Зy.GPÓðšH®‚iÃY’]œ+Y±$Oøäù;g5‘Ó)ÔNÝÇ´],GóНH¦hNH0äwû@QFÉHÀTœÑ>P\.½H8V`¼Ùëä“Xâ. ÂLe*ò½ú4$3•ÿjc€ÌiÏ.·½VêŠiä,K†$M%5“¬+´A%Ç.ý®n(3Ø0u»­GÐô×KZÁ åkÖ †²×îGÓŒ.nƒh®Ö%=&jåg!Nb%œµ?ìY£Âæü=RaÝÔB1l¦vg¨ì»Çó èîçuVÒÛw}>iBÄÂN ã’«9 ‡‹»¤"á:ïê4-Í7|]wäºÇO$ëìMpËšN'ÑHRónOaCO]Ãw±#¾Ü„P’(oµ¡Õ® Á…±…PuùÒõ Ää ˜Ì©l¼®T"éç 29ç‚L4{•@7“Ц´2)g–[¤¹•‹œ¨¼¡8õ!ÀAOÁ°=_s°Xꟓ°»Ëƒ}¯òtìšâ£~t÷/ Ó„g éØR*žÌƒI‘Uöx¯…/X¸ôÎÃõ* ’aqEgH0:ЦV)p{Î<Ó3hø¡=·›7xŒ´ò³)ì›O|å"±Â¬ïˆjdÑz5Ù¢Ó’cIIÝ‘´ö¤ÿRh õ endstream endobj 2195 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2196 0 R >> endobj 2197 0 obj 2301 endobj 2199 0 obj << /Length 2200 0 R /Filter /FlateDecode >> stream xœÍY[“Û¶~÷¯àc:Ó(º_úFK´­³²¤P”½îe<ÛØ›ìœ½´ëÍdòï Š¤$K¢Ú§ž“dg} ‚2.,dÂß÷üWÙèÓÓâOùÍB_~ò|d†o†è I&ôBôȯH."I§ù*¥óíÏ ­¿üB'dú¶0GÊ…šjñ&÷|ÃñÃ(Ф­¶a…!ŸÂ1| >=¡é“’—FZYÏ™ÿsëû9–ý`‘‰>/–lñaå!ËDì¾ k›¦i ÇŽø±'ôË»ìáòvA/÷èæüýÛËëéòÃoˆýgA˜\c£ ‰"þFJW€çš×H/ÌÚïÝWøq G|ƒ/†íÁb8ô(wVþæ€"½ÆSâ·Ö3RUoðpŸ—ý›“ë·$à-Ó¯6ÃÍžû¯ì_öÚh#ùÜúõ˜£ÀÚboÐ(4½ûÕÝŠÙâ[-pŒ1MÒg);h„ÈvI¨£k¢ƒØ¦H4XškšéjµIºJI%¶²ç"Ûø¨âuF¤s¶‘d±´"l¤Åµ €l6]_hÉ1K ððâÊnÍ‘à5ã ¦z0+–ZìµP¡Gr¢Çèvþç¦…Øæ¸ÃY=;rŸçÝÇRåþ¼Î²ŽJWІ°J㑦j›ÉwJp£©ˆãšR’Ǥ:R²&<Êßû–au¶ ®ˆaÇŒäk¶ÑʬôÈ âB‹f‰ÊõHvÐb%Ñ£z$!päÀ0:°fÂå@ÀhAîúT†ËªÏFJ-Ë2|ö×ò¡µÄCö slÏ;[,å9¤ 4&9;Rœßü ÄÒ1†,þbIZÅZ±¢š°h¼XÛ.V”Øh-‹½òaIIœV\±bañD1éÓƒbŠ˜$5%ã9]ß0y׿;®˜ÜÒTÝ÷ާJ»Á)ŸMb'Õ ˜é1È´*Ýég%«ˆˆ$ý;‰4_ëEÖôˆwëÛk±³¼pè,9’ç›ãn«Y0 uA:<Í£rN†Ú3`•AVÏá··³èDÚAɽ^¨r˜ñð‡îËÏ®ˆ. fz´J×òÔàpšêQ8óy´ÒûâFovºÞ æ{ÚóAˆY¶ÄñÈDÎÕ¥¢÷-q„si©òø©~Ã5<Þp„,°Þ‘²HEy Â^ë"¹*¡¹-Z”`Út|ªb¢G3ë"9/j;½a¤â5íXW¢ÈOË ôÝeùCw©¨òí^ L•nÓ¬iœ¦@hc2áæ)´Ø RBy^¥ñ<Ê¥nüGµ3rË+†8S¦%*†Ù¸ÞÛv8p‹¨ßŒÛcš‹Z)> pÊ4ƒ'‰œÇMbIBvDz(gñ ouõRÛyÛ®9å R1ÊpÍöàªÞJâ°…^ÚIÅVŒlûtÄã©a“"Þ¶Z¶¼;0¼Ìš„°\èh»h—lóeÎ mDk§AÓíÜX@a'?Έü íþqSÔôˆµ·­¾àØ;tEsٰ̨NK–Qœfò ×JäU†åÄó"][?/(;7<Êtpº^‹:¦Øб“Bè$uÄ”bÙà1Z“–Êã©Ìw`×%Ž/ïJ5©bÜ7ì§NÃÔyRèáièc­Ux“{íÀâO‡Aƒ­ÊDlõ$V6~Ÿ‚*=Ñ5vc!oÌ}KxN\M›‘ Y)š6ŪešÊ¤¸eš· ùŽŸ®˜¶ÌarZ¸ÝÚLz²—ØóoÆpŠ´—)àTß¿O¸;/k(ÆL}­Ü+Z½Hp*Í;º½­í7pÛøFà@ÂOØr€Aˆ™âaÊ´"ðÏëçŇ•}ÐàEÉ5}Ãv"Órü {¬äo•ü˜Sï•(y¸Ü=>¾|;ŸÐÝm¾ÿq~|âÙ$0B'ŒÂÈ–ÁœžÎÏo÷ç׋²êóôÛ–ëÙFÈoª'ÇŸyÚ¶á wo_Îs:ßß}}|ë>åVÑè?XŸ 7ª‰)dÃâ9<É!hñRõÇNwÔK&‡ nÕ±+œUDM;Z 'ˆ(™˜·3üéåÔ[×Ã¥£¿^Χ;öåùñ{ÇÝuäåëï—sϰw-- ™·»çÓÝë©ûòß«÷èþføîÀâOwÏÏ/oè÷3âvõ£=t{l Û¤Ô¢»×3—¼á±sùi> endobj 2200 0 obj 1886 endobj 2202 0 obj << /Length 2203 0 R /Filter /FlateDecode >> stream xœÍW[s›8~÷¯Ð£3“Ìí‘Ä8¡Å&œl¶édˆ‘kfmH 4Ó¿B€3}ënš ç;:+ô}¢•ü» Ó†`s˜¼sžLÁYº4S1T –n=ì‘T„“¨árivàq’OTp3ùö¥@Utð1QGÆ™™hrOœë†‚ ˶m~W¨h–E] Å Äæ.½ó¢‘noO ©ÿùíå! þn¤‚“«xr¹Ð¦‚xÛµ€E UU…¦,A›þ@À·©Ÿ•U Š-øŠ}Ç´<ûâ/7æ16š.‚ä×TšVêè3µ"µ™àw\ò7SãŽu =ÚóÊò'=hI½É{~šnJRÖ©IÙŸtþyILª¨©ŠÕ+´4)ýýûÃY’úþ<uÔXÞ Ù*lQY%>AèTA]5ÃèÖd °ãžR¢m3|ìX±DP"liØTžžR>â-&CºÁ驸؛cœ) 2UЛADÛ¿ 7ïPü¹à±Ð-wNÃ8Ôe%Àk'(jÁ`S‹T8 ^?²ŸôrÄ%Q~ÅíI)Þ‚ ݶ `d¥d­ª9ëŸ6Þ»ûó™¤&^r ¶+èwqñÆQRŽ“‰†[Š7Sãá¼’Pi‹1‡Í4û|zØÔ2áü›‚ l7¨Jï?ÿŸÜÈp endstream endobj 2201 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2202 0 R >> endobj 2203 0 obj 1287 endobj 2205 0 obj << /URI (http://gradle.org/documentation) /S /URI >> endobj 2206 0 obj << /Type /Annot /Subtype /Link /Rect [ 506.863 467.19 539.999 476.19 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2205 0 R /H /I >> endobj 2208 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 455.19 157.54 464.19 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2205 0 R /H /I >> endobj 2209 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.87 455.19 292.81 464.19 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2205 0 R /H /I >> endobj 2210 0 obj << /URI (http://gradle.org) /S /URI >> endobj 2211 0 obj << /Type /Annot /Subtype /Link /Rect [ 325.86 455.19 396.12 464.19 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2210 0 R /H /I >> endobj 2212 0 obj << /Type /Annot /Subtype /Link /Rect [ 404.45 455.19 469.17 464.19 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2210 0 R /H /I >> endobj 2213 0 obj << /Length 2214 0 R /Filter /FlateDecode >> stream xœÍZY“ܶ~ß_WIªŒ¸ ÁSoRév\‰¥µ])¯+ÅÁÌ@ËcÄcW›_Ÿ Àc¸ò‹ÇÎâkFw£»Ì× ŸPøßsù'ɲ-/¾jšO’€°X“¢˜ø‰Ó””Dƒ4JI!;Žš²‹n2EÕ½ÉoÕ%ï.~ÿ:íõ"rAgÌ‘Í狟aò(öXœfY¦e D!qÜb [*üz i@ñ‚&—Ÿ m ýW~0ÍH­ ÿž]‰få žêU-ñ¯œœ’ÃÅ««‹Ë·ñ)¹ÚÛ]”È>õÒ “ÿäª$¿? ÒàÙäêãÅ›«™CüÅZ›RÎM‘õ³Ø'^#?Z›rª,Ž(¥~„ {y:ñj'¾‘WyÕ‹b'ªyÿpâÍçŸÿN>æM‹ë– »|ëOµE c^GŸ&Èñ}}OºšÜHfdÛ·]]Šÿð©ÒžøVä…‚_ò†ìEÁ5ÿKPF^$Í&)ò~ÛÀÈ«ºo[±!WGNÞK)_ó;^Ô§’Wy×Ôý Y:Œ¢dÂè‡OüN´¢®^0£ùa6$Î&CêÏiúœ‚=è ?xÑ¿Áª©ÑÏØRû~:YOb¤ ˜Æ yþ³oNuË]/¨Á|JgLÃÄè¡.É3øÃ&~zǹK<º±¨=  íO§B€ŠÑ6Ø@ý tølA†cûµØÝx`dzôSÉQ&ñ+ƒt‹DkÛÒ: ïEw´èc~—[ä{±gч½m?Ô½Ã"¯†à©C»é«s3¦‰,§¶íbÇøñן63¯òa»€ÏP ^¢t ÄžH•\ Nßr’W$/:ÞTy'î¸Ú+×+†ŠRÀ4 ’ù h§ç¥¨Vm„Á “ áÝÖ»~¦$-aSëý-}kÇ[Ñè­´–e˜Ï¯ôæ ˆB¦/âD³–Ûø]“ïÀº¼½%—ä¥TDÞ8Øéìš!ꆾô&?Y`Ê¿Š\T_†øµètiø©nºV­Qo±–Ô{\\^픜ù¶ëó¢xfÛy"ø)A,£4‰ôv¯R"ªä‘ÈÐÈ‹£Ð‰R/[RÕX#¿©ïøf°‰d.rp*û«á_{i´¹‚ öb£2–!Ë_ªBÜâö ¼<-ë¶³¨­÷Ý}Þ8ßÑ3l‡‡¶ãe»±³ØÕ¶ ’;€s‡Kçt;æwÎt&¼) i2¹Å¢j;0—ËYN#YcѶ.O}Ç›e)ä>µ|»M²t¢É©…CåÉuWOºéÅ"P³`³¯ ¦€È•óU­W3á].Švqdk»‰n3´oúÎa%ìX§éNqÂ5àz¿ØíìFePKe¸h¥Ò\%e°û³›”EÁÚðÙüñœAä2®ùÁƒû&‡ è|Xdi‘6XÄ¢µùÛm#N«ÂÜêùÁ±û6¯æžÑ ß–+ç áÜ$Ö¶Miö¤µ´³ºO2R1Aœ-Ì¡öéùèHWÛÙwG¶]ݾüõå¿ßÿã§7ƒ¨0ÒK³Ð‡jiÀ"& @øÿ ¼(“Z%¡¨Ø³T!f{yCH-@'ŠJʨK*$ÉeT1ã³— sΘk’¹©›ÍjúÊDLYijAX'!—ð=’H^Áÿ`2+Œó¡$j)£® ƒ™(#šRdGyÓ£x›éÒp},Š1²ÍÔS±ÎK‘Lô¤™:Î_Y«*KžØX|\U¨y†ä§Ñ^T;E´BùZ¬0”½ Ýäb?wn$éJSµÛcÝã!·ÓCf(:Ë \0Ü;p5ç@?ß36”I曉†™'E¥±–A˜Kø)LÂp&ì]Iœ:ùºÂêg‚Œkú±Ò-S“F9x.†k“‰ ¦B­f`WH™éb=gPd'òÁ(Ö7q¯¹zYÑùÐÏäFÒwM†Ë&ý öpÜõÇë«CÑ‘.)יѣ™ÃAãÛ¯E) º¼* eþà sa‡èfz®½Èh3Ö‹ saâeÃA_µMM¢¿n –g‘• ±ÎJ‰ 2Pi±¹À{w,åEPÕ:Ó\¹ð¼/>õ¤¨‰¥e|;7Ç©©aõŽlîÇ®^PœuÇê3¹„ÍÊKe¶Zjùq‡é'˜Ïöx: ütAçæ”›šºv–4\'YÒP7"4‹ÈÔªˆäM÷P¹ºm\ß³´ë§Ÿù’ËÂùw¼ˆSÃïDÝc½¸zÛ˜Q™[!•¤l¼™_¹pƒ$ÀXF£…±ÃÜ{ýæ$Û_ú¶{±U×$×ϼáÃçzhæVl³]‡«bl¸%ßÔ‡ƒŽxK}_ @ئ9/Œ/¡Kkmì ýÐ4ÁȽþFdj0_ß/Žâc…Àä^€SÍxçßD¾'ÉYå³Z'äÃ3ÉaTÞl0ê *î{0Ø Óççä‘g°È<ƒ}¨îê[¢ss££m$8Á …©_k"zPpáÑDñûíÈA“x Év¯véëJÕþðúÍÆùb›Pk6ÝV_‚FCÁ¬ÛEÞWÛ£Åb«“B·T[?Î&p¢­Â³XKž|šˆ«€ôQ‹†kÞÙôü‡U8óp1Ö  ùþƒJ#ø™~E3OɽW·aœzˆxàÝÖs(Z½m¹vEN T¡i¼ÀÄ qm.—ú ²\}ß^?³$m°G$N"/6²k2ŸÕl•ƒ+p®*Š7ØAÁS‘w2ÃÂ6–zSã{¹²·í{pçSÃ[83Z,ݘœ¿®‰¥ â¯?g€«éd„M5µz‚oì_v¢í~ˆ«ó—½H–•Òy¦ôAE¯Ì9"k¤¢-ÁÔg™õl [¸Å¹mŽv’œÂ,í@„&Ž Ò.g o@*8¥7ÎlÕÙÑo¶…8µÎ\Š<‹~iyã°FËë¶tœ¹öb¢½QéQõ:ƒ¯Æa8R#¾á¶mjD¨TlC-ˆ«D¨•?ï§oµô‡#Î ˜ð‚¨Ì«üàN ªGü¼t®µôãUŽf«Þ*ù‹Þ-üº‰Mjì‹f¢®‘¨ÜõÐ4?†¡Æá¨LèímWŸ 4 fc_{±½}n3‹¤É¼â Ц’h/šv˜Ã”täÁRº¹5gêx +×ð+!:h~®‹4šèâú©ùùBèËSг`”e™"‚ñ*‹ZÎo-2/޾9S5ý¶S¿¨ÚpÊÜ,MsÓ mùäÏkÎ 7õ®žÜÝ+šßð#ÝÅé®m9×S–Lô¤5ê‘ë§Ws|¬RµT–óßÇAÝÏLݯ|®µ‹G²Šƒ ëChl ?‚+…øh)æ7ˆ02[,µV7Ál Г> endobj 2214 0 obj 3480 endobj 2068 0 obj << /Type /Action /S /GoTo /D [2215 0 R /XYZ 72.0 228.061 null] >> endobj 2216 0 obj << /Type /Annot /Subtype /Link /Rect [ 297.029 652.539 436.577 661.539 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2068 0 R /H /I >> endobj 2218 0 obj << /URI (http://ant.apache.org) /S /URI >> endobj 2219 0 obj << /Type /Annot /Subtype /Link /Rect [ 398.219 594.425 489.241 603.425 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2218 0 R /H /I >> endobj 2220 0 obj << /Type /Action /S /GoTo /D [2204 0 R /XYZ 72.0 720.0 null] >> endobj 2221 0 obj << /Type /Annot /Subtype /Link /Rect [ 104.242 241.561 209.846 250.561 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2220 0 R /H /I >> endobj 2222 0 obj << /Length 2223 0 R /Filter /FlateDecode >> stream xœÍۖܶí}¿BoYŸîrDR×öôÁ©f;ï6MO6§G;£Ù‘W#M$×ëÓ/@P"uõìKÚ8É €‚ÿ~Æþ\âO g½?û]Ó¸ GšäYàFÎÞÑHäGNŽ { 6Ñ TTÝšóϳâÌuþ~öëoÐhã¸ÌwÏÜsbs}ö÷&ƒ(Žc­«`<ŠP„dë½³ºÚ çU©Z·Ú##÷®½­‘äâÿ@#×¹?ûúælõïp×¹ÙšÁ°Ì ߉˜D0†˜¸Ù;¿žûtH«ëŸÞ:eáüãû«_^üæÜ¼9{}£‡¨ú« ðoÈT$õ>øžÛÿbEYG7TøÏc’h@a Ò^}ʵcõ/~hA_Š~g £YY‡nRû#…/x;r—E=_ß³Ì߯?Øj#G¢ìùñ¸£¸ºÚ:/œKÏ9*Ú–y^>¦6»TCYQ7ÕqÝdeQkRrW~l?'ÅfÄ«n²<×ð¦,¾j4üP”|Ü%-õMò1ÑàÇ´ªAŽaXi,¿ú&ŽMz1“.N0Òp˜»ú÷|sÇ>$UÛdÏ]èßçx8”US_ÛÄÐ2±p›ê Ú îœWi²ÉŠ{mÊõqŸMÒÐH‘¶Íò´Öpž=¤œ5÷<&¸ëºAÈÇ’QÞ>eͧfvØÂ]bpñ%ùÂǽ޿~ùêÝkvóËͼØ`¢ß—¥…’…1(ùÞ¸ûÕ÷×7/ß¾]®”ñ-?mÖLƒ·ç/[w\éß:É6TáßjM1ŠP‘>¦Õ(.¤`R‚dI’¶É`>ewÇvBAƒxæÉ“AÛ é4 Ö†3eß–Õd§»c–o.:4+&[a vȼC"É\lèb±2`¹^eÅ&ýÄvÍ>Ÿ÷I.0¹}Á:=T¶juMŒMÚ4Óš,­)Õ¾KóÃÅÈ0qú‚p2;˜ºÖIá|8Öƒ—RÏìôƒÙciFÁ˜ã Y‡ÀãÑ÷â1sj¦N¶u²Æy,«È=àWåCÒ­|,ØhpÏDŒ³Z†Äé¦Ä”%\ÉbçüX§¦¼Æ0ÅåeMš}±ÐÅÑr,ñ”Á{K .HH³Ê-R?d‡iJ¶Ãè ¥Âg_ãâ`,g4R«_Ìü ŒcÉgûy8Ý?Yê¥kÎ /·–†YÝ!í¼ˆ”Ë@B{2zŽªâȃ8ö#ÜYCUY/(œ žX0$³Ù€’2|¾Ûƒ‰n¬m:PEõep—³PêI¦ZÿX•ëts¬R¬·8s¾Fýqa=A:ð’y®ÇQ?>œAbª•Ê>a[áÜÖ5„%9.ºO¾KTDÈË¢¹°ú=y™l:E0ÁyÒ¤µáZ7É]n¾ÞeER&ó¾­Ê}‡ E°ÞÜó¸71Æùnó¸ásºI—P¯Ž{ìšæðçÕ*)–’õ.eeu?èíÁV3‚º.æ^ð ¡÷ÍzN7J¨ãPò‰n¬ë·¶\Vvà#L«t"Œ¤?`„±óãv `gXC`¦‡)G’Ív(\ïO˜ïò8àÃmJ'ö“CšÔ)Œ„wmý˜¹˜Ç‚V?¢ÄL)¸¬²bÄ@NO'óö[ÑP%>¥‘M8ÅDÐ>ZD+µ#µê e·ÚØúg¨Ý• ÖѤ¡qºeìDƒò{, À¡”Ö þ9Ÿa™^’f·jÊV“ ( Û‡‡‹\X¥ýÐ#FeuJÐG“NÛ™ |Ñ÷ÎÚ†¤=hxmüB{.2:Ò À&ô‰!¹F°ÊVŸ8„²Ò&œ®PàC1b §§“ùІ™Ý”OidN10R‹0R5©ôcml‡ ý3Ô·­£ICã,}ì1¨&¡€ž ú&©œËOŸ·ƒ¸2»ÿ¼ú‚ã&v@¡÷œÐǺ6Œ|êÉÉÐÇ·6·HäG‹‡2e?Á¯ØÞ—#šÔ³)}dŽ€ìÑ®?H=Âé é0‰9=Ìl½¦|J#›pЉ } µ#U“z¡?¡í°¡†Úú=ëhÒÐ8K¡/$TF!lSCa"ÿNå{á\®'bÿî³pþc&ÇåâLð% 8¬FžÔ«Ék¨nŸ`뤎Í8ȆR‹vû„Ü¥ˆ”Iž«ÍkKQ!IÁž¦ƒëãÝ&«`×VªŠZ7Hö—ùãòް±Œ¼ Õ©°½„Zï’#„sþ§ÒUûü±H$ÁQºŒ3gzÿR›‚ñ종«‡Ñ¡PPŽËS{Å>_cŒdÛ¤•ªCuaŠ{Œl«ÎH`¹;ÈË~áaŽ>Á;«q«ë´!9ÅǬ* u(š;“*£mÏÒég ŠýPN°}óòç—ÿþö‡w¯çO é/0ÀòõºK`»l SnéèE¿½yÿOd®_}wáà‰í)y¤r˜nñ\Þ†å, ï]Â0$„ Ê6~JR†xò2¡Iƒ9Ö–mº‡@] ÌÁ42¡ØiùzÈ^Xüm=4QgÆ® hÐ!'˜˜Øcêgã¾¼ž †çÏÆL¤Þ—2°t¡xò‡‹ÐdàôÞL8]ÈÿÅ€]ëjõ‚uõAÔ›ΠxYJ–(§@¹@O„:\“xOxž—ëöÊBSè\‹`˜»0Qò'CÙ¤‡´ØÐ¶&v÷öz‡0œöicõ§#4‚ñî“ôúX|eÉ®{Kìàx}‚[{áDXQV{X>,ÉzA§0)Ã…è$Ò·¦î¨\áVËø 㦺ܧjÉ[8:…ÍnÑ¢x‚3ºtÒèSݤ{ƒÿl@X¬’ûÔF$2àÖ€„Ý‚ÁÖùQ_qib³+ëÔF麰u¹·¾™cŽž­½x0¼ë2‡©o_¨k8»Ú¾#Šö!‡ž_Q$g"Ä!Š&$+}Ù;‚ûK\.Œ"8dƒ%¬Ÿö—yV<Š>ÕûÒTŠ 9A573Œ±…Û¹ÐÚœí±B6é69æ!Øw¹>ÅI]Nø9àaxƒ¥}­‹ðç±>*Gש•íp¡ž¯ÒxÈÔ¬ó aŽ¥|Ù$"äŒæšË'ܾWB2°ü º:P­äD%4nõ>Ýã:]0ÿp*ÑUÜlÄ XW|Ý©«cØ{(M:¢_´]å {YXlwí2 0ª&4\Ì1¨S<78n;§¢RqoÜï…š^ôÌç,Bû¤Ø°*wÈ °ù \.§+wOài¬úÞV•‰ÊS‹‡ª{ø %+¶b £#õ+æ)}$ü?ô±pÐúH<íµ §+¤«õ‘1ÓÓÉ|Еu¯)ŸÒÈ&œb"hE,‰0R5©WãOhc;l蟡v§Ôú=ëhÒÐ8Kõ¾'}ÆÏuñ¬+øñ‰rëR)ïù>“.ìdûÆåo¡ÕJJ·¾‰£NCæ_8„h“›“Ò_('û.HƒI7nò:LõžX>ÂÒ2,æÂóÛº­$GÈè” Oà{h‚Í|7¼‘ÄuŠªq·îúºëÞ=÷ì(o’ª0Å«E|7‹àYÊp<îó|Xañàx¡_rÀ[öÉP²­õ+?BÔ…¦±`i`ó¶€xÝaž¦”ø Á¶~R UŸ|îçÑ,„¢ab'=ø[ä`M×èz´§ D׺ã‹¢;(W±˜«u4bË.kÀÚ²úFBjìdD4¡IV°qc‡ª„Àh²´žO»°«›çÓéq ~y0JÒ#4‚Õ‘ÐGÿÔ«Éò µ¡gD¼êuïàMyÑÁêq_×~ìˆÈÿx/pTý‹\é!†’£rµ½whzlq(ðÉF uï……kYaý ¹PÂù…~²¹àx˜x´çL‚£8ôçß%[]§9è¢*aÌ>”i,]iPo{œóêX´$]Òƒ½ÚÜAèYÕµÆnÏßüüŽN\PJÍ4D³Ý7¯ÛÆŒ::½Hí =vÍÊ–Ó2jvÈ­½¸ÆFÕi2a"(²ú&‚±lŽíÃ<ȪøÐ±= #ô–XB—F LA›¤I;<é Yž·/.:ŠŽGúº+j)$t“n²õ4kí> endobj 2223 0 obj 3560 endobj 2225 0 obj << /URI (http://issues.gradle.org/) /S /URI >> endobj 2226 0 obj << /Type /Annot /Subtype /Link /Rect [ 118.255 697.5 201.677 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2225 0 R /H /I >> endobj 2228 0 obj << /Type /Annot /Subtype /Link /Rect [ 211.271 697.5 305.161 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2225 0 R /H /I >> endobj 2229 0 obj << /URI (http://issues.gradle.org/browse/GRADLE-427) /S /URI >> endobj 2230 0 obj << /Type /Annot /Subtype /Link /Rect [ 477.983 697.5 539.995 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2229 0 R /H /I >> endobj 2231 0 obj << /Type /Annot /Subtype /Link /Rect [ 75.33 685.5 259.76 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2229 0 R /H /I >> endobj 2232 0 obj << /URI (http://issues.gradle.org/browse/GRADLE-1855) /S /URI >> endobj 2233 0 obj << /Type /Annot /Subtype /Link /Rect [ 267.978 685.5 336.634 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2232 0 R /H /I >> endobj 2234 0 obj << /Type /Annot /Subtype /Link /Rect [ 344.74 685.5 534.17 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2232 0 R /H /I >> endobj 2235 0 obj << /URI (http://issues.gradle.org/browse/GRADLE-1870) /S /URI >> endobj 2236 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 673.5 141.433 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2237 0 obj << /Type /Annot /Subtype /Link /Rect [ 155.869 673.5 345.299 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2238 0 obj << /URI (http://issues.gradle.org/browse/GRADLE-1871) /S /URI >> endobj 2239 0 obj << /Type /Annot /Subtype /Link /Rect [ 356.682 673.5 431.668 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2238 0 R /H /I >> endobj 2240 0 obj << /Type /Annot /Subtype /Link /Rect [ 446.104 673.5 539.994 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2238 0 R /H /I >> endobj 2241 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 661.5 167.54 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2238 0 R /H /I >> endobj 2242 0 obj << /Length 2243 0 R /Filter /FlateDecode >> stream xœÍÛrÛ¶ò]_ÇdF† €0oǵ:“dÚÄ<Ä™EAjŠTy±ê¿ï‚ Š5ö™NÏq›ñ.¸7ì.v🠂<øïBýŠbŠÒýâÏn ˆ"vKAˆH„C£=êp”)ÂP‘t kW;jìзE¾ðÐûÅ÷@´FÐqáYµ˜¯‹_Aybò8Ž;[)&œ+ ‡¤{ty·§èºh©{ë• ïnýØ"FèÿEÚ.®î—·"ºß˜?¡çy„EˆcFcõCÑý}sÕÈl-ó-úùù ʯ¿~D’²zûÝXÜÜwm¥´©Dáÿ·ùtò!ð½Ó/£\ÖÍ*üó1Ók°‚i;RŸ².¼Ýoõ¡ƒÖ]ú÷¬{:Q#æi°Z¿ý›Êçã)Fâa~ÊÙÈý§Yö/{Í ¤Ò=¿ÏÊ®» z _}ó\4¼.°©Ä'ùz€EþGñ<`ïËd‰å€×;‘ÈVn…Samî“G1–3À‡²X7i=à+Q×¢4¨±¦[YÁ7ulÛhSŠÑ–Ò´hr#tS”:¸#§Qoâ5°¼¬DÖú.dX‰© <á÷CˆX‡Û‹lIó\1fäAÒRÖ2M2³ÒTÉJf²~6KzÏ䣘O /À1g„謅[Œ {”Ùlï¿üçúãÍ…O#+õ!xŒ©ÎÄ™¦†‰YílVeq¬Äå¬^Â# Ôˆ-v5ì©)%d¾M­j!®ÄŒÁ•Ql@j±ÍsA "W·#ƒ`šZ!ÅÔ‡&OŽšSFCæ€)Œ_ÃaPãy Î÷<×4’4¢8b±Î‘ÿ6–Žû°s¢Êór§ÁôÃzžE+3}Î÷‘7!†#Á¹§+°Å¦Î ƒSÅ,?†1öUró0| [äà UÓœwžmêV†P'³Ù^ì}kï4‚z1%„:äZ0 qHá,EÜ&^Îï™rHT)rÿ5¾¢1Œ3ÌyÀ‚s%Óªø¦ž½B  ‡…‘*W¯J8ñ˜Râyü¼:«:B2@‡ ÆäQµ’]]ÄNX­¸O=Å F~øÂlqOÃ5MÍ›x‰`8Û‰ì ~Ë=LaO© ¤›Ç°vyÁˆ07}ìSUô-ë—²Hź)ºÂ£»ü©xTCZ7üÿímÊb¾É| D7²¢e¯Â1ÑÕÚT Šz%O³ÌEõµNÊvhó9&Иîµ ¢3›¥kqùº0õR‘XMˆg>‰²’E¾4+rdËQf™ÁVbD5RÑ ™ìæ“È›‘ð¢|ˆ=ð8GÉÄqjlߊÕˆ¯RnwõEšÉôµvLý¯.“&*«|λK”+HÕçäIn˜¯¦ ¡r±µ¾KŒxš$$8&±rmÁ+u«žÍ*5QœaFkYŠ´.Êgt”õN¶n(Í]æUdYRCˆ¾€¾r*¹|aQÝÊvêŒ1WhÉ´à6Ì-”É\ôðÛõ(W5áÀÒåi ›,mÑÁÕþ$ÅñámmŒ2EzUf<F9†ËÜsìS×Á‹m#qºŸ‘Oè9)¸7£½áöv–ƒurØg^8¼ÏÉD^JíAßÃq¿ Ïî4ô0 +;D¾p£úF+%pÈXF¬šz€ëc1ÀáÕë,§pG„Ä×·¯s¦ÏšMùY Æðî©@#úM@ÃÇ$¯ÇT\ä®ä6—)ÖÆφIüUEê¨LçHë˜Ml틦ÐéT¥)²Z–(©P2œÐ \}U(iÈ2WIîHþéÓ5RÇdÞqÞšÃaötÂèºhVà|]p¡üTîøûsmF_Ô¥¥¿ò1Å諨Ûì†.Ø·â29ìÚ»kûYé¾|J•@w×7gZ2…Š÷®˜mÉ6ÕíHÅ©‡§C“eP“r¤šúÒäèZ@-Ê »‡ÀTöÂOE¾‘Û¦lËo…áÇ~ÐrqªÚÕŽlª/£N§Œ|ª†>Ý÷; ‡c?Z‘ãÏý{–Æ2±©Gh®»îÖÝš[%hùC¤õ?¦åä"áýCŸÆ*‘*û,Ž.Á!?õ×Ãé˜D‚hð–{3 ³6X±À~’j‘cQ>V‡$í^Õ’j¶"Y»XÁÌ™S-”U$.*‘W²–OæË¾¡zžrô-yà•YN>ó{ê0ê÷tœ¢ª(Tr/³¤l2Êìhš| է˧% 0qI¨!iCÕÉjW4ÙuÑ©wIýðÖÎuF¢‰®qæºo_d#ŠýÁciǽ¥ÁÓ]’oÅ ñS’5#TGÁA÷9Ù‹w…‚ž­G¤#[æ[ƒ9-„€ø¡c??Ãdv}ÕÆ ®Äqÿn:[Æ{¼Ç<ß!®3(Pó•>J;BÄ“­ä°5ƒuÞ±îp¶ËQuÝ&:-IYÒä)$'Ò9…ZξŠ_a©È³g¤tèaU»ã  ‰3q‚iêú®Ä±¨>©÷ûJµ•’í”þ)À×ÉJ™¡ÓU¬ £©“—B‹êVû-ðÍ0Ú!‹´=bïÌR›YKƒwÞp0_µWlƒëkt³ cW­KZ'¢0pÞß^œ_»«Sb–ÌOÒÜwøã…s¥ò%Ÿ¦ÓC €I_¹uNsÄ1S¤X=LZR^0¦þƒMĨCäq¡j.˜ÑÞ)Tþœ»îQB0ÓnÄ!îüuúg™G×=h.§W½îüà“¿Çþ ·¶][ endstream endobj 2227 0 obj [ 2226 0 R 2228 0 R 2230 0 R 2231 0 R 2233 0 R 2234 0 R 2236 0 R 2237 0 R 2239 0 R 2240 0 R 2241 0 R ] endobj 2224 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2227 0 R /Contents 2242 0 R >> endobj 2243 0 obj 2225 endobj 2245 0 obj << /Name /Im7 /Type /XObject /Length 2246 0 R /Filter /FlateDecode /Subtype /Image /Width 640 /Height 602 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 <000000ADDC867DC93D3366992B42844B4A4943ACE8EBF0FB330000A67217B5B4B4EEEFBB18161494918FD4CFCDABA7A55FB8EB54AA15C6202C7D76728FCDF0E6E6E6821E1EA29F9DC17D7E5F5C4B999999AE6262D96969242221434240CCCCCCB5DEF6878483C37070DEDEDEF5F7F29553533A883DA0B8D09999993C3A39C5C0BDCC99994A00007D7B7B716F6ED8EDF9DD8181DCDCD9B04645FFFFFF1E3165DFE6F6738299AA6A6AB0CEB1DAD7D6717188A3D5F2B6A8ADA4825A5BA463EFEFEFA39F8AC4B373C8CEDDB66248E6DFDFF9E59594A0B87FC6EF5B6C89F1D1755880B4697E38CAC6C4B9B9BCCC6666CBDCC55352511B1918A17972C1C9D6512323ECEEE5BD5858DCA6A06666667FC34754668287373382C356F1F8FFEBE8E7333333E6BBAFE28F8BA6A5A5E7EFF8B7841C8693AEC9E6F7F03F518C8B8A8DB9D2D4B1CE4D975687B46EE7E7D07188B1710000F6F7F758579DDC8371EA979799CC66F5F0F066BE1EAEAAA8AA73632A28265D5B5ABCB489E0615BBBB6B5E6E3E12F2C2B000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>] >> stream xœíŸÚ¶ÝøÓµN[0é.:L—åeo\Ý^Ks]¾Ý%kLƒ›.cIOI“‡®iž®W^vÇñ¯%Y²ecƒ ÷y·ü’%Y¶ß‘%Ÿ%÷Ýs}¸aèÀJ}\ƒèo^»óݰ[â³yœÅe?„n2š18 åÀOÂ}´Öc(jøöÄÙ wnØñ‰}pçj)Xwxg?r)ø·¼€ WvÎü«v»Ãè…DÀª\–²!‡Ê»ˆÛ,à&]ÓöéWm`=ÊA=|ÖpB¡ |èèú,ÿªÕCcŸì™}ã0ÄÀóo5.äà+IM¿µùÇéÁ{Á[ÃÑpƒ,hèÕÿú׿^ Z _ w»µÆ2†m¡810‰ƒ e,£XýbùwÈëáYá·Æ“I›výk4ÿ:ùñ/yI4w[šÍÖáþ¥Q.#` U` —É5–}+Ñoáêϧ‡æVO‡~k\™Z!Á®ÿúì³G7‘}ˆ£2KQ.wÝ•5 CôxiMÌ<Mò†™ ¥dÔI§ëO4°|1²L ßvèwæ×£Ìœ ÁUf'S·SCaÛ fþ¡“ïÝG'D¿7Þ8qõ5[a} 0ÊÀÓSWRô+QYtÝôWgœBš"ô÷‰šÃ¨ÚOF.а/ªøñ¶~múa=>+“ЬÌéA­)˜9ÇšCO¦ÏäÞ^µ6){Áœ7oRýÞø?f\æ¬1ÈûY&äœÀ¿T\Î@R÷uãÀPlÓÜoH%InZµRÓ*X–6¬MJÒ˜™†>ë–$Óws˜‘¬v/‘4,谊ì>N© ÊÒ–«P"éÍ”+ί=î˜f×t29uVãf”¨ê[‘}Ëô}±6Rö9=‰5E«håk8™ö«=iÒèzÁ®7 ¬þkŒ>“1uòþÙ¨âß>.ëa¼&¡sþ••ªREõÛA;3ì·ÌòepÐ’p­WV9ÿörÃb›¾›Cµ<Ùx‰Õ$h8I‰rC1¤âiÅtüâ\uœŸ³ˆL3š/Ò¼˜ê%“oAï¸CMô¨Jí²­T9=Hp±Ô¥ æe:«™õ}Ù vý;þ‘Õ~|ðë_£Œé’÷M²WÒ:Hο§§«…«¨ ÙX:0›¨aØÄÎhRÉ49ÿÔæ°iÑwsØW*9‘ZNÛ†Ÿ’¨äÿRsØuýC9ºù™,2YM_©izÊÕÞºº¼ü‘&z4šÒDi6ˆNk×ZÝò¾Qó¬¡2Õ'Z¯ÃÉ4³þ;Ì«I7CÀEªAÓù¨ò]=ÀÍA|Rv^½ æüC¢uUúŽ~îì9ÿf†TC'<è:Å;¹ôF(Wgùàg$®âKK¿Ï=ä¦Ôm8zÐÎîvÑîf¸ÖØ{èä[íÕ½`¯ý÷­ý>xÁÚZNÖrNcgòå\¯®‚Žšt*•OKÕÓZe¿Øæü“ŒýŠuh:}cäŠkæjô] ÍÆ‹g¨F3c»ážJ±‰Î¿V«9püsò+¡$2[ Îh¾{±å[›}Á¿´9z”uÙÑcŽ58µµF5ç3ÿÿ:>bú=q¯¿È£¼1vÐú#™oŒ€I$í¿®Ò8••îÈ:=«MƒHéˆQVz™J‰^ A ɪW‡Î;:;«¥ÞˆÔ|¥dW‡‡4ÜóOëY¹Ò°¥ >ÉGù+¥úádEý#ÍVo…ò¥§:óz4æXƒƒ« (ŸyÁÞõ?$ Õ¯åzV5 m|||<ÖŠEþo)sÜHä"ñ)n{é§CÔâk,èó”¼P(þI›f$¹CÞuökÈBh8é ;ÿkgÃB‡£Ø$'ùA.üèN¾8a*î µµö<= Nk‚½¿¿Éÿú×Éÿ}ðÁ/ÊU-_ë#e µ¼ÿOyiTi˜HÁYÇ0Ý-MŲ:òì(sWŸd[ØU Ûz—KÕÀzh­ †kv*“<œyÿ ¢<å¹Ñ¸|XF˜š‰Œ!á‚"âŠm1í’ª·|)Û‡”[D–ì×£Ü µfZ¦¹þ¡¦aÙ0Aûb¸„kP0®… »ϹEÌKS¾¥ì#â«*!zDX Žá_4s \âÏ#‹ìáE$L(bª,TØwÌÖÍu¸ KùÓÁØ2†ÿ ]ÕßèÄy¸hù–”.¶}IŽé’ú,í_€% LMÁ¥<\ŒKe±­_P¾yö¥ëKÚþ­ÌÀEOÈËI¸¸Ž)­vÑ­ŽÚ‹›eñ/ñåÏÞ|üÄðìÍçðÀ3Ç>ðX?Ï}o‚€ž9ú€˜}à°~žyúÀšyÆëþëÅgçß¡è‚ç€gý¨‡Ûã_6›F.r§„2J–W:k>×LéæŸÜQJ¥ž=+‡"UÛÙQ‚¼œxà_(_=À|Ú˜óÙ´~!þ ²yXI³rÚzÿÌl’©ÔÀ¼H~xõàÕψþóÁ«ƒÙQÃô›ö¯•UX‚l¶Õ¶Ð®oØ“^…è]Ìš½Ú-È’Câ-н4#µ$9uR¯z P°Ö¶ÔÚ>¤•’’‰Ê',eÆMÀ•Ϋ›¸˜„³ºŠâ£/å¶eµË:#Ëà‹Áçäl¸sÉòé¼ôf¥]êÕËqØNñï_#üüõo<øaVÔPý¦ýkgs,E6«Ž²©U;‹ä ÜÌeûìPq t/M»QÀoÅlÝ—@5ÙÔÈ*š¦âœÂò II(œ¤t¼5î:0‡¥I±+£fDÙÄéÌ2ÃKåßÓpjsñ{X^•lÿ´ÚŸy¾ØUþŽô{øð‡>tŒ®Ÿ…ë7íß$랉³¤‘„ŒÔÈar‡Y›ÿ–FÓð[3[ò%@Yùƒ8h„s Ë'$eÅMÀ—.k:?‚ë@M<ú©í¤kó1<£¼bršÚ\§¨ÓyM²­è#´Û¼úçϯýððµ‡èõÚÏÿüåÁ«¨ˆQúÍñøl9§*ttºÉ$_œâ-ðÈf‡î›/AS©Ytî:ÃAaù„¤ôð¥ã­a1u§t‡ì Igñ1<£¼\ùœe`KÂòªg³%©ÖÔv†Æƒß¼öñßQÝ÷óCrþ%ò ¥ßœó/ùp¤^ËVšCïðy <È÷-ÀÄû7OHÊ)ÿ¼SLZì*ûâ9Ãb„úÈ)¬ ayuèôMZçW¿üæçxíµƒ×P=Hüû5,Úp8ŒïŸ¯ÿA>ܪ›hywý ¼¢ß?7w´Ü nð‘_X>!)§Î¿ä£„ëªQˆ¡ç_ƒ?ÿ²bs nnðüË­­YÈNfªäòï5Tõ¡~È׿|üûåO!±†®Óú…\©àë/gÉݹ sÒ?=ì+øLSlH8TÊ–} ¢üsxGË B >Ãiø‡å’rªÿA>jÙ\3£†ø‡ûÍFÇßg`1|¹Òbs nn°ÿÁr2g£ì`™¹¥<øå—¯QŇüÓ^ûñ΃éHÄþyן١<ìôL_`¨Ö-5C3ŽlÁ~ ÎtßÜÞÑrƒÈ…>it…ä’rêú ùد©%©âÊbúú ‹ÁÅu‹Ì)¸¹$4$¯r§WjšÉßÖƒüûÍ×?ýÓþòÎ/ï„ø7Lì_rr¥Eï^Èøz½‹ç³$™éÎ70äß/¿ùÍoÿù\ýMû7\‡Êh~œiìr3#eÇKç³$ÓÅb‚ýC¼6|è|yç©ößÿ>trÿAK*MÚÚÚW»¡ÅØF^½C¬ûùëw¨~> F™å߇.[tÿ °9hí˜~ï<˜º !Ò¿yÀ?`þô€xÇξôѩÂÕ€ÿ€Eøám:µßƒ¿ãÀ½¯ö¾üò˽½½ß!¾B¼õÖ[eÏ?Üßÿ€TШ€ïýœ¿¾ýî­¯<þøÇ·0ÇÌ?§¿ þé€jÀïü‰þñ÷«·¾úT«K{…ßý®~ü»ßUŽ÷þøVÅñïùsðHíOäþçWì‚üÿ§pÒû(ÿñ+Þ>ðH•Fƒ»ï¥þ¿ÈéûjoµÜs/ø¬ÏÞ \$gÞ¯$ðXÇÝ <ýêéiž~ž}t þérúôé÷>Šä=¤âÓ*ø¤É—OßûÃGñÌ\Þ½ñôKðH“§7þý ò.æ:âÆÓ¹þe³Y¥v&js€-ãÊ{ÿöó åöíÛï:\çNÇWæû§ë‡õ=A[lW®‡ˆç©wý=?±üÓÏ,=K¿gGªU§·†–÷Ô^ŽÞì›-ôÔ<þ쫦®$‰Œší«½B–²ØÙâD5 ½¶¼Æ½¬ Ç¿wÇãñ»×©{Ž}øtË:Ÿ"nÄ÷¯Zo{þµý½ª-µšÕÙ“•Êe ÏÆw¤÷éò™¥,v¶s–+¡Wg½;X Ô¿áp˜ÿâ6ã:‘ï1㽪>lÄö1izþ¡j«ky‹ÏÚ4ZK×[x ˆ~Øô‡­áAt4ÅÎVõ&~Y:°{ÿ¾Aþ5¿àäûâ1ò¯Ù¸ñø‹/¾ˆWÿÉJÆó~bëª;TÁÆJ‘EýA>Y";«{/`׸Bøh8ìæ¯Dñ´:Üo<%ßâµÿª“«‹< øgçªÃCúÝ­ÿÈ‚`ýÇÇÿv™+7HGcØl“oWœ›®þøô=öeõà¬A–†×¾;§‰&B½Ö5Úÿ”~“„‘ ÖþÃ?Xû¯ÀÚ|lðo—¹ò.¾âGü»Ž{¿WÞúãÿºÜ¸¡ýwGªÍ³Ã÷ÐÂ_Ÿö¯柦à°£€F»¤æ™¨ÿÛÒEü$åÑ!êÿæJ4Åÿv™+¤×ûî)òïñÕ«W_yë}þÝF­¾/»û‡7®^ýév ÿbiSF]bk€mù‡k¸f÷àøý«¨¯áóï#ê_ã¬[½qõ§Õû·×Õ¤ó8Åù…ú·ßæßÇ}Ý+7ð £ñx|Œyêø'Ÿ5o ý¾ywÅþ&J>Éì¶À¶så:¾æòQ£¹ÿ%ñïñSîn˜7ºØ¿Ç™ýæø} ùÔoQÿãø÷øÆ—=%ú]÷?ƒû¿¿@«7¾üò¾:øoðHÇ¿ë׿Ï_qþÂåúõë?ýôzÇÕß7¹þ‘GŸƒÀ’`ÿÞ}—ÿcâºöW¹o¾ùæ½+Õ à°W®“ëÊ<œzhÑmN?ä_Ãü–æÊGÈ1þ6û8÷<ýè½Yï]¹ËANÁƒðXìßõiýèýïòò…ø‡Ûà°8È?N¿¦õcê‘{Tß»Rv ú9ý_ðX˜!òÏ7à“AǸ7çt%¨ø,ÎpÿŠkÞ—.Ó2<ÿªîõ?ðXá~ãÊÓD\¡öU?ÿ€eiî7ŽóÉØþ‹3l6»„ý9ðœƒÿ€¥ñ&zÜ`ôüCà°<à ð øˆüD²œ9ƒNüýÏ8·`ÿdøˆüDþ"ÿ‘¸þ‰î‰Çck Ì%à_ÚfçRÏÑ)ä ²°rÿô´sÿv ð øˆüDþ"™ëß·þŸaÄÍ?žŸ ×QÌ,Á¿"Ê?G²‡¿=ð ø—áp©àãÛäãöãÿöò÷ü»é1•ò“6øw.‰ôoHøùçøç,›ðñˆ€·ÿß<yÿn1|þ}þùçGŸ|‚ÿÎ!³ýûö¿0¼€ž¼pýó øÇ·o?þâ_à¸ùóþ½ð×O’”üÛ æÔo¿ý×·ßæãÿåÙ³gØÁ?þ-(àí÷úé?ïÿç§ŸÞ¿íåïóÏ­§üC/Iþ6ÐØœQæEýýç&ã?–¡þÑ;ø‘¾ã÷—g''qï¾ÿÌûW¹üýþ±„Aÿhc³cb:ÑÉKøw×'çß³·Ë¾ã÷ë›o¾‰D5àŸý“û?H¿ÿù-¼ãù÷­Ã#`éמἌ¢ï5äþýJÇ, ‡~ÿ>}óääWwDÓ¯£ûÛÿÁ$÷ÏigºÍ²b*þÕú’Á¿mfÚ?yÊ¿O]Ç>õ¿OŸ?Ž$õ_`™|•ú}þ}Ãaªþ{Ûá¯ôl¯IÚ,‡dðo›‰åŸ;V3èßÉIÔ2¬ßoû[Ÿ€Áú/¢ÿállF9$ƒÛLˆ§§qýûðñƒ¤þó/û1ïĈë/·XÂû¿oÇÒoóü˃=“Ë?wlzÐ?TÿE,Cu®ø®¢ÏÐëÏ7gø·Ìõ?S!ïñÒbÿYÐ{s •ÚúnH%Éð–dKj½J¾d'ä ¦Ú™8‘§ÿ±œ(äCRýM-“éy÷êoCÿþ&Ë¡þ-ÿ÷S¿ñ¯Ro4µ¶®ŸY•jÅ:ó–d:¥*ùyV«;E>³êFÓh‡íPð/qü+ºþ}ǯˆ‰p3ôxûü›ù÷ÅýËôdâ_¾£öjúZ›ô •‰4–z®/í÷o²ïì‘B½U Ü]ïtœ/û–§N=Ô³}ÕÔË{j/×D¿òªZ þµlµþœO,ÿ<¦Žÿ¬eS®¬áþSîÔˆJÁÛø«=®•Ð I]TúãvÅ«ýþuêδK6>­j¶Ï?ü mRÿÙÎ^S[t÷eÛe]—ZÍj'§ë}©\–ÿ2’Qµ ë<[JÿÒb÷ÿ™²61˜ac Œe¿,Y¶û²œ‘‚þ9àö_Ϫ ZÌÂ5Y³äóüDX]g¯™Mò½t?ž¡“±¬l9þuPx#ôü øØ=ÿäZ¿gìžišŽlôe‘¿åqi}õâ ŸWúO «ÿºZÿõZtYzXW³YÓ1·éâUá `;è_¹×BïíÚ¸œñûgçiƒþég]/’ö_=´ý×¥í¿Î]D–Ú¹êð0;Uÿ1ØAÿäœÛ£/ùý+ 6á¨ÕþkkÍÃz ÷mgƒÞ¡·d˜éXNÿ·Yé8{­jÕËCù§ôQ_8ëkÿi’vZ¶…Ñí"Ô?ßÏôÐ×䟬 ÷¾TR~ÿä‚m)Å(ÿ´vI©áö!™Ù²N[†èÝTëgÎO«~HwÛ¡mYøúIm´Kjë«=·ÿÛ±”ÌúçÖ±NÿVÁjþþaÜkb–[ß?“±œUÖÑVÌ,ÿD—-÷÷_ à ðÉùöoÁ„@zœgÿDÐõyþ‰îßÎc ÿ€Í"Ü?‘ÿ6æþíà ð øˆüD²°ÝñŒV)Zàßîíß³´.‰2ŠŠš–«àßî°°#÷ü&Ò¿bxŒ‡G‡ã1…½¯éݘ#vÊùd‹FUz^æCq]ÙÕhøxÌ®ÿäGiÝ®†<Óº§P÷Ù¢‘Öô–³ÐæX×ǧ+­ÿ4Ñ“bœWj¶]/¦öQMfèºê±¦ê[4b7qúBFC^åùÙw+&!û 5ØÝ*“·®5%Ê1¸÷ç´ÿŒÏtTwÐixxŒÎÄ#ïðïØ=óþ±Ð³1ªþVçŸÛ¾U+¸øÁ]_ƒ"ý5%ÊÑ¿ïçø×Ôº¨Þ#õŸæTg¼_úÏMåéKCµjµ¼:ÿ°~ú¯;Üú3_ÁYÆœ‡:tï H)~M‹ íߘ¸£‘ë,Z³‰Û]­;œ>ÿ’ˆl‘ëÚÅí¿&Í1uÿ´ÜË—//".]B潎õúîå\f|æI"XÁ~e$Mù¹ËˆÅ 2M¢räw}´NGö (tû¿]ãx|ôωH¹þñ¡ÚéÆÐ®ñJü{ƒÕ¯¿ŽUœïßËÈ*ÏBY”ðaNn¨ëß>¥b¦€&÷Éü»tï޽˗ïܹvíåËg%^VÆû˜#ÂÔŒP‹å/r,ÿe]Ì9fðë÷òmßéõmbØ…#ü~rÁsî‚ßÀP¿ý+ž†úoL@Ó4ÕNË]*EL¹äYIKæúç ˆ²štƾ4¼4eXý>¾/ÞŒsaIhOîÞ}tóQ«Õºyó&ó/¯”ÔêÇdN}òo8ÆW7Ü¿kˆ·o½Éñ6ºva‚ß{®E*à·û+† ˆ§•éxÏ‚(EìÒÿÈ$‰ø))¿zqZ;4çߟ>àøS0÷%ñûwß™ ïCýkYu-c‡'žÅjüÈiw;üÖ#»ÒõïÉѵk/lä߉]*ÝG'4ôõÂQ)Û¾9KÀ·ÿö×·ñËù…XËbó’jÈôLwbÁQÛÂõ…™S-{ÌíÑ_Ÿ œ²fQ L·þôzÞ¿7ÞxC§ó´¿ðÏYË1žîPîãô¤(9EÉÉ^B¦?¤‹X-JËøíÌ»t§Rÿ*u¶Wiž^^|¶5®¬þÛHb×7K×®Mn"éz/îÜ”î;þ©'7m;¼¤UÞÛ{›¼Ø¡w$ß<‚¦”÷&T*®/L©¯9Õ¤ëŸ3Iö?>óÕí %ŸWxÿž¹­1yJßô‡èMÍóGý¨ÕjáË/êëÿòyNû\#øç÷ïwÿ|¥£(ÿ8ß&×^þÆ?Ç‘Måçtl EÕjBŽD1Ä?Ôü³3¨:µQ—9²ÿ»GÚ°ØÕt–Òw•{=Ï ¬–!Ì?ßô‡Xœ_ÆúϽþÇå9í_pçۿˈßùý»œïO!øt‹÷¦9;÷Å´ñRî!>ýõ××?ÇöÑú/mØõ?žTrLywüãc$ôÈUËéçú÷áÉ'"ÿðg¢”wßÀ§ß7î.W˜8kâI2•b¼çD¦_›MúS”SIõÏORÿ¼*0æ3èæîÜîCz>¼™,%åîëo¼ñújô~ÂÔ×­öï^*äRº+ùý°§9)×ø· «ñ/-?¶àß9÷ÏQX9»å_’zÀ°°ƒO>Yb3ÿ¶œEýk)?(­™1Öø·å,¨ÙÀç2€[Îbþ)ºüÉ'Ÿ´Ð§‹ª†9æl½î{>8øÌ÷Ï(Ñëà%ȻOpûÏ󯬪åPÿ¸ÇÖ–@ŒúϘî»'`kðàÅUõ\[–©ªîœG:3Éðcë³ô­ÿè£êÁ¿óNŒó/V/ jÿ ”×þZûûÖ?ÞØ¯ÕƒõŸô=ªü;ïÄiÿ“b öC}ÜþCŸ4$ÓÖõv¹%;OiæÛä±õ~ÿØ£šWéßÌ?œ›sck!VÿcªöÓõA ýçý´ñøs5Gý£­÷ûÇU/Ö?@<ñú¿Ãàqo Ÿ|※&®çÌ®«™ÉùG*D\Ê"ê?:¶¾Z·Ô‘×ÿ¥ª_½lxLÛ›,c,yþMW\Å>¢YÔ¿àõ?A„ú‡o«Ð©Jlx Ìš±{¾ÑÓ£årº#èKø·1„û§ãÇ*†ÖíÚ¸œ1Cê?Ï?Yô6føWÞzÿ<›‚í¿AÆ;’Á‡!£áü».vß?§“K‡Ê9ÒÿíK%uÀ†ŒÿÖÅÎûl4»îß‚ƒ5±ëþ› øˆüDþ"ÿ‘¤íŸ˜ñ˜àß¶’²‚ÆcÎòOô8VãŸo<æ¼1Fñï} ‰Ée>Ó¿ À&¢§ïßÔx̤þEû3¶ ¶XòJü ܵõ_ì•ëcŽåfÓH~þ ŽÇÌzj^wTiÙjaèÍôÆ^²ð¾j’Z­8QB¯-{‹‚9Màÿ¶Ž9þ ù™Å7Ø÷‰*ɨÚoh&»÷Þ /;VuÎr%ôêx‹9… àÿ¶Žø7=3‹9ÃÞ:†®7ÚÞÐL6öÈ Ç÷îc«ªz¿,oQ §œ)ù·ÀP€ø-Ö@pvþêf·9æ¦Mc`ÃêXMý™Å,qÀø¹;YÓˆ½ †gu÷År ÀÇ?v82R)ªôéù'« ýsgЍÚVožƒ¿Ï…cÌ,ל­ÁÃ'âž#¹ÿã1ƒõ ¢o|ýLJsþ±E|Ná8çûgHYÕÙÙRfj©»’$Û:3É –¸þs~íO*‡‡ÈxÿPŒ™åš¿5ÃŒ47ΪX‰ñ˜|«M“´Ó2weM·`8ç[Äç>€s¾Ò([íètºz¨ïg÷õCTƒŒ$iÄuäIQ/Ûv•uyÊ{j/‡*Z=ÓžàÖ(×+rr£Y°ådušÛÑ¢¹±®×kb+ðrÂÛÇå0³Ï…c°„¤ôn9¹5ñeeq¹í Ð^;«ð/8“ìÁþ¥d¼ÍwÇ^Â9ÿØ">§ðœóý›tiu0Ä»¼VÐ &zÕƒûn÷§e¡õI…&®‚˜òR«Yí Ý0R´îž¿Wäý#è»Ëñzº¥¡ÛÑ¢¹±*Ü¿¶7'„ZSÕÜÍafŸ ÇpsÂ¥gåäÖÄ—• æü‹<¬šÕø·ÜxÌadËlóý¨Y¬¢ˆ[M­ŽnWl½ÓrÎà6ëþ&xÀ¼’;ÃQÙ)s†ºA1ùÊ÷мF€í.'ÿ,°¾´£EscM®ÕÀ¯€ùgÚ†]¤9Ììsá¶Fsb-\NnM|Yݸ^nH÷¢(WÓÿXŽÖ¢Í‘ýFV§¶,ÑpØ;°šÖ°7tz0n¿¦WÁ‡uK2¼.Ïa]ÍânŽªû{E^'Èr—c:\­Esc]¥,÷•­;Ë*|TO7СQh3û\8—©¿œlM¬s‡Öà‹Ë>[¬Û³v6Ñ¿^fÁ„±ú¿Ý z?(’ÊÙεõvÎö*/ç¨ì«tsGŠWýعêð0ë«ÿ<¦ë?L‰›ê‹æ³þkSÿH3û\8†¯Ncå Ô —Ë UÎŃwù²l¢ 3ß¿úYvDjWÒþÓ‹¥¢ž+½Æµ…h˧yÉkž)ý&éòŒ$Ò¾ã{EþöŸÄÚš¤{þÑÜb¶ÿ2Îù×ÉaVŸ‹Ä(ðm:VNnM|YY\.·]kÿ c¾ù:š$.ÙïÕl‘Qït˜—¤üг¥«ôŒbÙ²×å1Ú%5—³þ¯×+"IXt9 © t/Gšßýd_é HD6Wl±‡ûN³ú\$Æ}Ï•èºÜrrkâÊÊâr¹íZÿWI®?ϸþçgñ–‘5yGì,#s˜Ž‘™u:@ îÎ]ÿEÿFRÌô+h™§žå^W“ó£EÄ5'ùˆ¸«çÜù—˜Ù²d³Þìê)e¹…‰’Û„KwõÌó¯Û=ïþ«üDrŽü“ d5þmÞøË­øtY…8þØdR÷/tüe€¬÷§G'ëÿÿ¶•Tý‹m#p=£ŒOþí)û1þ2žþ_y)Ê?üÛÒ=ÿN¿\è`B³wèJ6û>`TS‚ÛJÚí¿ÀøË…î&Ôs^%7ó>`„œÌ?Ñ3O eJ´—WÏ u!uÿBÆ_.t0¦,q'Ù™÷cú·Ä^Kæ_DYÅ[}¡réû§O¿¤oÉîÆH‡œ3ïÆ$õ/Õ=¹9ð|p ÈûbþM¿tß’ÜL¾qÞŸ}0ø—>ÛêßÔøKú–ìà`¿wöØKô¿±€æFüþ¥{ý%8þ’¾%»xÊ¿™c/³‰û¿ôMy‘ þ­ôú_+¸­ο)³¥þÅb3üƒúoà_2ÄÖ˸œžiþ‹ZÀ?3ðs»ÿß4¬þ3MsÒÇÜ_u„Þ,ô©¾ðÅütý—´LôùžÓÏì4ö”’T˜Z_<¦ýØÎ§=ˆÈü nÂÜúíªVÇŽ¹¿µŽ,çM$a§æ O³þKZ&oåRÔíc£ EEž[*_¡0òb<)Ï)ø¿þC/ Õg&y pNQPº^FÖLMÎôäQÛRqFE©WqvúÅ­™È=«Ec;IQâѤ˜•^WùŽÚ«$üÈa.þ …ø—¨LôxÓú Ÿhä0ZøÃÒœ„ôQ 4–Y›ô •‰4Š”ƒß{üÞÙc›Å¶ÜýM7›[+m(çÜ?zÐZ6ú”òî#Ð;¹RÈ•Ž¬TŒ ªˆŠJÜ®8 ”‚ÜF ŠŠ÷ÀtœÔ”‹VQf LºH)c»&³G®óùøCHý—¤L¼|¸mgˆ0¨…¶[6Äb™ö¸VB¯v¤üÔ,ƒèÌ6‹n¹»™¦÷y¶ºÒpι´ýgâúÁì£mÔV*¶å‚-Kõ¶ldµÖ"Ç-ÌÐóXÅFÕÊD¶+,¶“Ô¬LpB˜tfŒ¶‹r0—Ðö_²2ñí?>ÜØ›Xu 0‘ƒ9·l|js,øeEÊáÛØäZÇÝ,g˽Íd›Íƒ®4œsî=Z½M÷¢óÏ[.÷ ˰ʽ²œ±-íH‹{€µV)²2*,¶“ÔìÕñM`ÒE»GZÎ~´Â„Rÿ%+_ÿÖ1¶QíÓÎÉ^B“/ k‚„´ØÂüÃ&£F Û,“®Öýíí¶ºÒpæû§Ñ[À’í?Èj4©&‘Éõsí<—R’êr]j{±£ õh‡'ÀAG©ËÓ«ÿø|3ÚqËÄû\G )3Rò¶W6¾$ ýC&ç¸Íbþ¹¿éfû‹‘ó_)˜^E”ÚŽûG÷žVg­"Ö¢«”jr­„Z/í‘1PÐ>E œk"åÐ^.˜9/6= D@šÀmÿ Œ¾dºí?–OਇÖIÊÄûLJKÔøª£/ jµ²„*6#¤$ACýË«89Û,æŸûÛÛ#ll‡Èaž¯È¿Í9 ×þ³p+ÝÙ1ï>ylËǨY$U«›ut)Ò”:õ¢3¡›MÝc XG°/•Ô^žsú¿4ßÑmÿ%+“¯ÿË…Ðêëø'²›tªCJË?d2·YlËÝß\ÿ—®€íy}þmÅøËÕþý7î0‡Õÿý­ROžFüßßöo Æ_®öï¿Ir^ìï¿&%Vd£§%ÈšÓ¿¸e˜±ŠTýÛ’ñ—ç©þ3ÍÁüHSliý·%ã/áþ—yl©[2þîžÇ¶ú·%ã/7è`ƒÎ·€¼/âßöŒ¿Ìmàùà÷ë¿í¹Y2mÒ? Ä µ ÿ¶düåf±‰eZG¡VàßvŒ¿6‡”¯¿lÅøK`sXíõ¿0Ä?6‡õßÿþà ’]¾ÿØv×?Ñ…b±³þÛøˆüDþ"ÿ‘€€Hvqü%°=Lû·¿¿íã/g²ã?Jzþ¥<þrþØ#L´s挌ÐÐ4Kª=ž±<öŽb‘Ži¿¬ÚVožÃôØËÙþ-6g¤)9»= )ø—2iù—ÊøËýIåWŠÈ!‘sæŒÄGäT‹Ôuƒ^¯ÂW‹¶3 ‹3$›Ù‘L&IsùÑiWttvŸ”ο錿¬×8ÙæŽ½Ô¢îv˜=g$öKêkì‡÷¯Ø£ËóÞ”Št2!ßì@8‚3Í#T‹‹’Zû/ñ—jMUs4dîØKu8Tfø7{ÎHì×È™ñ /.ðþi%g9ŽÎ¦T¤“©ùfGÜiÁ¿EIÅ¿´Æ_šv£aiÈܱ—b±yÿ•>gÎHn"'²˜÷/×ó–³)éd’NŸŸ3ÍãÆcÛ|¢îY¬þKeü太5ªðü±—µwqÿ)¹¹g朑üDŠÁúµÿÈw:¥bhý‡¸Ó<&Ú]@ºþ¥3þ²Íû7wìe»_¬Ïºÿy朑œþöŸQ´­±·œM©HÛdG_~dšG8ÿ&&]ÿÒ™áÏ¿sÇ^ªøô¶ tÓfÎÉù‡û¿µ’“:×öØõ?G*6³£3™¤3#Ÿ™æüKLªþ¥4þR/ö¼þÇܱ—™Çÿâ.ï‚,2Í#¶Û<þ²£”:ùf&šá‘°Ð4@Êçß8l¬ƒ‰2ˆzºÔ<›æÿ¡¬ß¿Uþm+à ð øˆ$Ò¿³³ñOô8΋«ÅXýÜø'ºt@2ød¾ã9þ}üêûï¿õpeŽüÛ:æø7žëß«ïóÚϯþüýÇë,uàßÖ±¬¿õñÁÏ_¿zõýÔ€àßÖ±¬þóŸ‘x?£W^`6›Ujûk)¿ðoëHèŸQ¢·$• 'µýð™÷µ?ÿù{/Sr«}mj]+üÛ:’ÖÆÄpß1¿ÿýï±ÿ½ß?ýl‚>ûª©ë#Iá[KÙÍ¢8°¼§örMô£8QB¯Îx ðoëH|þÅêyúQÿ>þ}Ð?RÿeÛez“|Ÿ»YJ­fµƒòÌvÎr%ôꤲ1àßÖ‘¼ýgLŠž~ú+ìßÇß#ýüí?·ÿ²8žM‡ÙjÄŸµÑªÞÄ/+•ÿ¶Žú\í‡û¿ßLj¿ÛW¯^½M}ScXtè$7êWj6k:?²zZw£‚[Ç"ýß!ŸÁÇߣ¾ïŸ¿xåôôô óù7Uÿ‘À\ux˜ÿÎ=K_Ö¾úþûßãÚïª[úücí¿‚7XRו~“£ÿÎ3ËûGxÿ›+ß|ƒ^ï“_>ÿ†yIÊ£*sˆú¿¹ 4Ú%5þiùwåý+WÐëýÙÑ2jz%üÛ:Òòïñû£×,ÿöºš4˜±|yÀ¿­#%ÿn¿ïp{FœÂDÉg,_ðoëHÉ¿ÍüÛ:À?@$çÈ?Ø@΢ „“Ä¿‹› ŒÿÝVÀ?@$QþƒÀˆò¯Rÿ€ÕåŸÑLì¹j×Âÿ¶•ôοîxÌ•Û6M2ÿÖÝћͅ ,Ó: ua¦‰Ï¿ÜxÌ¥uºw+á ?¡áB —'7ªLë(Tn¶‰Ï¿ÜxL/P¿EÞ“Étñâ­{óé|Îà_ºˆ÷ïø³Ï’ùÇÇä$yyoÿâ$ðÅÿÒE¼‰Ï¿ÜxLN’KÏ©*÷^>¿|ñâóK/éèõœE¸÷ò ¾xùÖ-ü¡_~þìÚ¥‹:[ååçÏ/ë^U‡ë/]»õæ‹:M þ¥‹xÿŒfÂúÉWR×.Kîݺwéåeü벎^ט~(øVèÒ%, ª./]»æh¥Ó`Þ¿——ȹùÒµ;^ ‰þ¥‹xÿÆIÏ¿ÜxLÞ¿KoK®¡óð¥—ï]»øòÎˋ䬌¡_ðǽ—¸ºD±ž¹þ‘`Þ?–ìÒK/DÿÒe ýóÇtý»xç~Fsy~ñúïM–èÙ%烾¹¢9ϸŸîç¥kÏÝS¯ üK—-ôï¢o<¦çjóÑúÔt¸öC¯ˆúÏï«ÿ°¥—˜r/ï\ò~lFý·ÔcS;Ôi>üpB™Ï˜«HÏ¿‹þñ˜®÷®9í?rÖ¼ŒºwH—ƒlÿùýcí¿k×.Ý{É”CñÈ[—¸H‹ùgšæ¤3޹¿*~bº…^#Õž¦IËä<«Î{N§‹±§”¤B0òb…B œ§˶ï9cæôWqþÜñ˜®o9>ÃWõHïW¿äF¿wË×ÿõû‡û¿wžáSî3¯ŒzÌäî /ÙÿE»ªÕ±cî/D­#ËyIØ©ùÂSõ/a™¼•JQ·‚9Y¡0¢Ãxõ„¼MñÇŒb6÷žÏ³hûï* Õg&yœoNÁîedÍÔäLOµ-gT”zg§QÜš‰Ü³Z4¶“%M*,Yéõp%‘悔šA2À æò ;‹–‰oZÿqá2}·aáKsÒGzÒXfmÒ+T&Òhn¡0{üÞÙc›Å¶ÜýM7›[+m(«òÇ\Ø8tÞ½u'NÄ%ê¿6ú”òîÓÌ;¹RÈ•Ž¬TŒ ªˆŠJÜ®8 ”‚ÜF ŠŠ÷ìsœÔ”‹VQf LºH)c»&³G¦óùÌ8Ô‰ËÄûLJÛv†ƒJPh»eÃA,–ik%ôjÏ-F³ ¢3Û,ºåîfšÞÓàÙ èJÃY‘îxÌÙÑôX¹^~óÖåyq ·ÿL\?˜}ô£ÚJŶ\°e©Þ–킬ÖZä8¢…z«Ø¨Z™Èv…Åv’š• ®Ch“."{%lå`>3uâ2ñí?>ÜØ›Xu 0‘ƒ9·l|js,øeÍ-›\븛ål¹·™l³¹bЕ†³"ÿİpý§ÕÛt/:ÿ¼årϰ «Ü+ËÛRÐŽ´¸Qk¥‘"+£’Áb;IÍ^Ð&]”±{$!Ž*ûó 9 —‰¯ÿëÛ¨öiçd/¡É—Ä”½×ìB9¹MH#m–IWëþöö[]i8àŸ×ÖÂ?X&Õ$ò"9 ~®çRJR]®Km/¶s´íà¸"(à(µq9czõŸÏôqX¸L¼Áu´2#%o{eãK’Ð?drŽÛ,æŸû›n¶¿9ÿ•‚éUœsÿ´:k±]¥T“k%ÔziŒ‚ö)jàŒX)‡örÁÌy±éQ Ònûo`ô%Ómÿ±|‚G=¬þKR&Þ?>\* ÆW}QP«•%T±!%™S(‡¼Š“³Íbþ¹¿½=ÂVÀvˆæ9ø‡›Nn¥;;f àÝ'Ícù5‹ä¢jµq³®€Î"EšÂ@§^t&ôb³£ ©{,ëö¥’:ÀËsNÿ—æ3Ï¿¤eòõ¹ðZ}w~‹ÙMH:Õ!%‰å2™Û,¶åîo®ÿKWÀvˆ¼¼Î&ýý-áÕÀ•ÿ©«ROžfãþþ¶áõ>˜Âý™,õªµÑÓ˜)*2«(À¿±Yþ™æ`~¤) þKÆ&ù—¸ÿ…|p È;ø·&À?òÁ- ïàßšÿÈ·€¼ƒkü#Üò¾Óþå6‰ X¦uêüúwa³ØÄ2­£PçÖ?`sÿ‘€€HÀ?@$à ’]öØv×?Ñ…b±³þÛøˆüDþ"™ö¯Zÿ€uþ"ÿ‘€€HvÙ¿^o‘=’p°;ì_¾×‹˜ze&àß:Ùaÿ:52k˜3¡ã ×«p“GðS0²YsªeéT3gPÒc‡ý³4 ÏØâMèÈûçMÁèÎÊ(õµN‡Fá§mVÈîú—“dYÊq:xÿ¼)ÝYGÜhü´À ÙEÿœ»{ÚèGÎ7¡#ïŸì¾øYÙ"nÅ Ÿ¶;DÝÿ²þ¡²æL‹£y:âúÏp;òûÇÏÊèú‡s¡3(ŠÞÄe§ýCo52ù§]ã&tIJu4wEúâgeÄodªFnE`%ìº*9}öU6¡c¯W+ᙑQ¿60ï"7+£lÒ©¹•°ëþMS\èr4°vÝ¿À¼ˆ­ ÔW»G$ìºeõ)@çÌ?`Ãÿ‘€€HÀ?@$à ’Ý÷Oô8Ùì¼¢ ÌüDþ"ÿ‘€€HÀ?@$à ð øˆüDþ"ÿ‘€€HÀ?@$à ð øˆüDþ"ÿ‘€€HÀ?@$à ð øˆüDþ"ÿ‘€€HÀ?@$à ð øˆüDþ"ÿ‘€€HÀ?@$à ð øˆüDþ"ÿ‘€€HÀ?@$à ’ÿÁ?` ì¼ÀF³ëþ‰.0›]÷Ødrà ð øˆüDþK²ä±#y€À¢¤±›Á?`QÀ?ðO$àø'ðü øþ‰üÿDþ"I²›ÍÀ'ü…ÛÍÛù´|sú+ø¤¿›'Dšñ¤üÒ†ßÍ{üÞÙËwÔ^Í@ž z&–Íý]éõp݈ý+J½ óü…ßÍš…$3,M)c»†<“òD6÷·’Ï+TTúãv…¦ÿ€Eñíæ’¬F*Ay,!Ïú²{²%¿ H¼6 ²Ñ¢ŒD“À¢øvóxB»gš&U½¹¿IõH‚,Ó$AðXÿnnçr¨~kׯå çŸûÕZÿå¹Tà°(þÝœWU$–20úçŸûÛkÿP›pÔ¦©À?`Q»YQÐ[_*©Î?÷7×ÿ-Ø–R¤‰À?`QàïoàŸH–ÛÍNüê?ðO$àø'ðü øþ‰üÿD¢ÃüàŸ@.,Éü„ó¿"ÿ‘€€HÀ?@$à°€€HÀ¿‚U9t§D ìÉ.ûg*ºL~8Ìœ¸+aޚ̈+*á¬l—÷ï ý—½^…aÖ&½Be"¼|hZ®öuÖÌVë[îfî­“ûÊÖ&{¥e.XB–9]9Û&Ù+"Kž­û•ŽmXÄÄí:;í]ð_yÃïƒÿpM©¯u:xG´Ž/™R12¶ܾ7ÌßIäËÓ´¼ö¸VB¯6WšÖ­èšÝÒòËÝÌ}áì+[‰é”– 8c iælå4ïKž-ûîÛ—þmü nè!Øyÿ´‰A¡zƒï½á÷®w´ýgŽð,(r‘–L­µø„ 2¬Ÿ&ò…á¡ÿ8m÷o,øeq i]ÿèšÝÒ—Rsán™éÚ0´´l–fÎVNcñþ±„áÙ’R÷¥)GMlÀ¢»ã€ÃÁÎû'×êdĽ7ø>0ü^æ<¤o8²÷ 'ËØ–Ò÷' óŸ #iyÿd÷ÅòáÉ,(-[ÎeÎ…óe6ÜbÒšná„,sºr‹ßp–0<[ö}ªtÓà·àöG‚÷¯ÜkMýãã‡ß‡ø7]ÿá,UÂà0ÿ©0VuXjXùýcùLù¬ÿøå\æ!þñ--›p€%dõ_Þ‹Ø@‹È†g¬ÿÜ ŸØ€EgÑ¢ÁŽû'çl®ñè»Ãï}Þq:L·ÿÚ#c øÇí‡ùO…±öÝÑÜ@úòÀ¤¥"å´ÿøå\æ!þñ 5ZZ·ýGÒÌÙÊi,b-"Kžm°ýçnXøÄÁí=çÀ?™ì¿‚·]&S6üÞõ.p:”snÿ—&+ªV{$ûÆí‡ùO…áþ_­„v§:•~ÿ|0Y©dwÍlµ¾å\æ!þ±µÉ^iY¿”%d™Ó•³m’½"²„áÙºý_Z:wÃ"&6 ÑY´ÐC°ãþ‰¦Ø¸63"Ú’Ù&"FÀ¿ÑÑ J]àÚRñoÉÿÄ1˜(ƒ¨É×±¶Tü[r#À?`Sûÿ‘€€HÀ?@$à ’]öØv×?Ñ…b±³þÛøˆüDþ"ÿ‘€€HÀ?@$à ð øˆüD2í_£±ÅþÛÆNùl1à ð øˆüDþ"ÿ‘€€HÀ?@$à ð øˆüDêŸÈÅüÛÀ?@$àßv±Ò†Í…u­Â#Ô¿½Íæ\û·Â¼sÖµ .€¼ýó+›ú¿Ñ‚ÐôàßjØ ÿ|IR.Pnqÿ¼2ƒéþó8Wþ$›å_ü[›æßxÔ•7Ï?³ þ­† ó/ãðóÏÿVÃfù7›Ç‚Ç"Öƒ¹6Ë?, ø·iÌ=½ÐGW¦åŸišj§5+“ÙkJÔþÓ6Ó?hÿÍ ßëåC‚Só5Ë:Y™¤èŸll¢ÐÿE§VÃz¸ˆfŸ†¥¡òI<ÿä–%ËE©W)“ª¶wìüB =úXïy«àÈ{Ôõ¿MìÿÂõ¿YXšfaè“ïÝO$¦,Ú3ÓÆóoÜ‘ä¢Ò·+²Z@y*ì—lJùtë?šüÛæ‹œ$ËÚ7&2£Øæ>åñU޳÷Z¼öŸ91d»ÎÃ’\±eÙ®°_²Ù—ÓòŸ¬è‚5Ñ‚,îŸ7}ø nç°oj=YÜ'YÔ›ýXéxõßH-Ê–sž5JšV2Ø/G½Tü»°Zõ&ÿ¢Ðˆ ¦Fê½­ÿÈ'òFÉÛ³óŽÙþO ›öqìZ Wyoa*þU7ð/Š1Ì®…´ÿdYQ ³óŽéŸÜ®”‚1BZz=Òt~‘…jX÷;¸ .€¼Ãøma¶*nÉ}uºÿ‹^ÅÉœ¼ãúWPå‚m)E™]m¤¿ÈBÔž¿ .€¼ƒÛB̾ øÄTêsmÌß?6ðo.!þ½™ÿäü3ç]î‹Z@ÞÁ¿maaÿLs0/ÔñÿVøðo5€ñÿVÃúg.¨Hhº™iíkÿVÃæøGú5Ø3‚fÄ÷` ÉÜò/j§—E®û\û—òßBý]×*<"üã”IÝ?L¦â_TÒC—AVû‡Ñu­Âc–D>RêzËV Cô»¯ÒeÅžjzmY×Ë5EͲˆ»W@‹GŠU¯zéô‘ª8›¤}úe$I£!Kë_6µn¶Êóìß®1×?ç{F2ª6öª]¦1:g9«~–ë s§Ö¬vrnD­[ÃñŒýZÝK×—ÊeÉS¬U§_HxÞWѹ˦ÖÍV þí1ÛC×6úa09ªz¿h[í¬Í"¶œÅ¨^ìN¼t6 nqUÜ!ýBÂmŸu³U‚»CÌúoâék²×a]5Í‹Øô20½t nº‰±q$Üâýó–…­›¼À¿Ý!¦2¿ÀïŸ]¬Í@ýGßX:ý'•Ù·éúÏ[¶nðoǘ¿&i§²îŸÔom‘µÿh–Î×þÓ$×6Þçòå–…­üÛ1æû7"=^­nIãpÿ ÛRFnÄL›ôYšNïsý_v±ãô½|¹eaëÿv øû ð øˆüDþ"ÿ‘€€HÀ?@$Aÿ¶‚­)(0¿ ð øˆüDþ"ÿ‘€€HÀ?@$à ð øˆüDþ"ÿ‘€€HÀ?@$à ð ø·u¬t„Í…õ­ƒþm똥~m3áÏò¯uôqt²Â²É9'þµî¿xÔ‡“'`à&q>ü;ù¤ä«VÑÛþ‹£Hȹðïä¨9Ü?9Bœì‡' àæpük}‚ô;¢ :ðÅ‹HÄyðï>:ùžÜ¿ÿâî!z?AÍÀû+,ˆsà_ë5ûîß?ª ýƒƒ ôA6… ò/ÑÐƒë „û÷â¯ùèQ÷ôôûwzºà¦Ç Ó4ÕN+yÞqýË+%5·:ÿîï7)åûèüÛm6‡Ÿh‹¬ HŸXþÉr¦ÓIžwLÿZV]ËØ«óïɰëÐzòäÉ‹Cô¥yþm1ýC’8~ 73§Zvœ¿sÅô¯R÷V“S<•Õ¨máQ.J½J9Ö:þì÷Ÿ<99ÄßÀ¿!¦ãŽäù'õµXÕaLÿÚw5%ŸW²¬T \#•þ¸]‰µBÔù×U'Uòíô“¥ÖAÌöŸ91<ÿF²¬Y1ÒÅôÏ2èj‹mYVk¤¹i÷Ñ™_еB¸GœÓïÉ“'-z&~£ôÀ:ˆYÿÔ¢çýœKòú«h µ3¶¥ ÷,òÈÈXë D\yqêXW­VÉg³ 7…¸í¿ñİP£i´ÿ¸ö«ÿpbÕùØë D]¾Kz¿wïßo8ý`8ýn qý“Û»£õ¥øÇõYû¯=2Š,”‚1jÇZ!¿Ì±Oð'üxƒˆí_AÛ¨Sºÿøëë'U«=Â+Eçáb¬u¢î?8"Þ=zrÿÖï\}Þ6èïK­ƒyÿÕÑÑþRo_‰>ý6ˆn˜æün@(›ãŸ|òäßü7ÜÏ܇“ï&q>ê?ß‚úäèèþý“Æ $æÜø'Ëb…%áùl à ð‰¾Ê‡²]Xß:àßÖqa¥¬oð øˆdÜÁ?@cüÄþ"ÿ‘ŒËøcl€€8À?@$cCÿaŒ5ðÇ1ø¤Rƒ€0ŒÆDq<·D—8§+ÆÍË¢‹œO|c£qùò团KœK y|óòåÿ±(… endstream endobj 2246 0 obj 17367 endobj 2247 0 obj << /Length 2248 0 R /Filter /FlateDecode >> stream xœÍUÉrÔ0½û+ú˜TÅûÂ,„P¹CqŠ­Édɱ%†ù{$KiœÌÈf½v«—ׯ'Q±þ~eU“BÛGΖ@•BV:SQBR¡2®¡ê¢fޯųÙê¼-ØÀ—ˆG1ÜD_¿k§bTÀ6ŠŸ·a>Etò¢DYY7MãjMQR×&E†J}h{8¿íS¸³÷Sõ&PüÏ«+Ê’ô?¨(†‡èb¿- ‰aµöÐ<eÇIVA²´1_)¬zøzr¡(ë(€w»ŒŸ>ÜÁ{º^¹Fç(³”RýS¡YO/Š<>|hmo÷Vý›£ÌÚ´¥…îȼbn¼îi^<‹™.û—Ê\LbTL$­ó€þC•ýeÖž ÒæÎ« åI®e;ÉóÅeÕ4(ÕóBG¶}A/qe—ø8I‘iaæMS6äUî®'¥åäRð5}P£ê͈;Fàæó-ÜaÅÛ r¸n&b©ÛÇMcÈëríŠ „Ï¢?…WY¢)=ÜŸwB¹¸Þð‹Œ ý1ï<ØŠñç4à6¸0©†3å&Œ†™ à Ű$ADÊ¥8rùN´XêZ^{Óš\ÆkIƃÖ^ ¨©M„‘V‚É5ŒâaÄ=ôxxA°ƒŽ®×d$\²öÃÜŒ@nèS;ÂaÚ‰¹ôÇDš.R•K§ô%¯KFÛŸ¦ ­¼jO‚÷à^I)8ò†Uèê¤ã±¢芕¥ÎâQ…q¾Ü®=Ò}è)Šþ7ÿ¬!Iî endstream endobj 2244 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2247 0 R >> endobj 2248 0 obj 797 endobj 2250 0 obj << /Name /Im8 /Type /XObject /Length 2251 0 R /Filter /FlateDecode /Subtype /Image /Width 641 /Height 600 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 <000000B6D87C85CE2E72AF7F41925242ABE6336633FCFEEB333333E6E3E19B601F7BC4EE77879EDEDEDEB1AFAE286296181614824719908C8BC8E7F88DCDED9BD3F38783824E5B70B59223CCCCCCDAD7D6A5A2A1D1AD79E6E6E6293B5D73787E3E97CA5D5B5AC5C0BDF4F2F1242220BA7928BEDABBF8E8984C4A4A999966595755B0AFA4F7CF80E37780EFEFEF5D5F9490B8D8941C1C8E9BB0B29062AD722F525150424140ECD18B2846B3D76860D7B998D4CFCDBBB6B5ABA7A5FBEFC9DAB2CF367CA496918DA9D6F8E29AA5D8424F6666668FC6F0B0CEB1F8D8882E49B0EDB950000F6FE4A2395899642B29287B5B1F916F4ECAC6C57875737098C0B39B859999997271934F7EA99FCEB2DCEFF991BE8C375E962D8745B6B6B629447B94CDEFECE9E8AB6D22494644FBECB1E4E0DF1B1918F7F7F7FFFFFF74737244526BC385369393928F8A86B0C0D82A6ABAD7D4D1C0483823284DAAD4EC4E467BF0D890F6DF96B9DFF55B73A33967419081976C4B18EFB7B9C18E40BEBBB93A3937BBA578000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>] >> stream xœíƒÒFÞÇ÷nWÅXn[Qˆ»ÊK•n=-ôì€ç¶rzžÒ [¶jwÛuÝ*xÛÞÕÚú¯?óšLBBä ˜/K’™Ì„ùì/3a~3_ýÚ>8šX§ÝjÝ^ã¨4Zygµ':¡&IËÅ%8| c}¡# ÆuáNÎÏAû?_•¦àoQœ ÁÉRZ(ηÂË äãøTÎì†8ù°0H´Û鬢Ñ·!eF,}þN§Ó<5twœRç`ª7á¾Ô¦¾[Þß¼¹ùûïokÌ·.+1Ue¤TÐ}RÐáŽYE(;È‚¨æÃnTi• H+P´âín³”kN€_Àü!<ŽÒ4¡FRºjphkÆS .4 äï6áôL™Äé ’Œ—§Óè#TJ—…b"Þ8È4âh{Ÿ/3åBE†ÛJ¾Ð* ríD±±™ngŠ…CÀÑ‘©·©Ñ8ÝŽw‡ ßèÅú©F+·ãè`, €©X¡Üo+ù œ£‡a\²AN]h5r;Õ(”÷Û8q-±ü>FUPEÛ‡Çy‹²ÇøyÐÞ‡xÔËÇ™Lv“Ã#Ž©iÁ‹ÞÂÔd8˜Öã±ÃFæ@ß­øFÓ­[·4R/VÍ €ô€@[ •l#¤ùì~)‘Í“mó-x³›¯b•n»UÌÒíÄf{s¿]+s&Zme-ßï´›0P¹­$@þÑ`è`7ß‚¢&Iz×(pQ?L6È©q2mœ™6N\KLiëÿÚ?I£äÆao’ooBð¸¢ÆxÄ‹åt¶çðÀ»[…~[.¬™wƒÓ)¥³ÎÁ$·×¿ý¹ÿþ€Dï¹™D&t€—WºapÄÿÞx(ZØ?,Àš`¢^ª'È6%O¿JLàA>_ÈK•T¿ÝnÀ0lŽ|_M¥¡1B÷ØA©]j môGƒ¡ƒ¥v>wäP@X;L6à©sШ´ó°PB÷k|f¨-•-,´`D׆o,üF~õãЇ‘‚xdò‡±ÊA†ÃïNõÒërïæaê4r±zZß­h°€¬Ö·/sÊí»pJ§Að@)¡ê;¬ ÆÖc%²ïl¤êG º±N¶1€…|{½¶™Êòô9 ]e󸂙:h GþH°lˆw¤ACk‡ééЩqÐ ÏÖ¦GóGy”ü0€ƒL¾TpIŸwøËßÁ”ŠÇz Πݰ™!Ÿ.aj8˜šðþÕõÝ:€ÿÙ¿ýë0×}&ÐÍYþ2ÞAÁrZª”й£Tã¸ÔétJd;£·JHAgSëÐÀ[ðA«œ?l•ŽùTj½…Ì»×Û”©Ín©›ÒL¥`|°UjuàŽ¢¼žjÄ€Úa²Q”à©qÐ2 ˜Éö`â$±t:´ðrïÖ ÜÐçÝc?·ß¡b&x¤U`ÄÃL ¬öãkún Àã¿×vÿM³8ljš\%ÊI‰ã¡øEà„ö+±~)]‰í§ ¥œ’+±m$®‡í€4Pj Òùþ ­Óéf£¢?@Í÷€™ÃF'®xú2 †¤F6w4€Úa¼ÑΡS·I2$ Iœ$–® mãÃ!¤ƒláð8Xü&áïÈÓn¦ø1Ü Në»5¡ ¬íþ—ðWÕŸ¼È­V®šH$ª¹VKvmG2ïkÐlÀE[…Ûy²nkRÉc²€/Ô„hçñM7ŸÇÛšðÍݼñ~üœ…üµé*ÞPÉgø¦ÚÚï!$Z*l›ÄÒSÙR{8D¶ÛøB¼¤Ïü ¬ñ0Qc“@h«·!ÿ=—ŽsÊÕš´¤R³67‡'EÐñ*¾qi¸õ¹ÕèG{–QÜ$£P;èò2Æür¦ÅϮNj\»lG\ß³†IÛÍh£tµÖíukÕô˜üy O ꪣðNn’!?&‡@ßøA~¢»ÖMôŽ˜ÜMcZ–ñ{lƒGÐ=ƒ%w¿£qr=î7â'~HèáJÆO LcÈi|]b8 Åq¿ñÙ!ÑOîFÓç²H\ïã5&€“"è’Do A7_“^ÿ¤øMUÈãñ46€S#9!ƒ“Ã8niûC㤹ð :·ôùŠ›/Žo§Dpƒ8iùOÎãô)Np™Îß·¦ozv€n;š y¬%  C[@¡0% U@¡P% U@¡P5@ÅÕ Ü…òSáçÀ¨ òµKPÃâ.Aè+±ýVH¯!öØ„U*ô°i·EHûìÉÍJ¡(Ù·s8¨÷ƒZeÇ*¦Iƒ\à»6:…3MŠ9œphÃ,eøƒU9»£Nbw>£:Ù„,'‰÷îg들 wUë1›ðxMÖ›.ó3Bˆd µj­â •6ÇѾ®µA,…rQ•ˆ‘°µú Ö”ñ'K p=`‘-“j0KDÒ(@é ´³‘‚ÛkƒF¶j•É~ƒ…\«TÖ€ñ’pdËŒ“˜ û¬NΜRR8ƒ|úÐôbUÐWr ³ü¹Ì S¤b±5sV@£lUjÕrʇY¯R«UìoÁ žÂ%¹šm‚Š€TA;z‡$=@"['•Í&T‹R„Ö§[‘ru´ WC Ù±l†Ä9]3\‹l•qh‹:€–§¯´@¹¾ Z‡†0ì¡éÁ/ Uè”9¶ö³Ì S (½áÜÌ»F׳‰¡; «–[ð+`.&³ý"Hm°™B;ʉG0ÖIÉÍX£“3ÅQPl³E‚Œæ™Ä59ç´l¸$Ù"ãP YÐòôðjÐ n¦ aØ7BÓkeA¹S›’åÈe‚fqÑ„¼okŠÝ= –GšMbˆè$r!—+àreñèÙ:)¨~6«5F‘õìØfR )7 —ÄGŠ™´t-ƒå ‰ ¨$ ²! »2š^:&äF:f®Yh_1Ë ú£Y\4p³f‡•†“„ÐGæ UMWÑ¿{*•¼dpdë¤P}‹5FáŒØh9 ÈÎ4ÂÂwµ!7 áMØÊÅèËÀ É‚b³ßCvMûŠYf„´PªHòg6ߟ¡8Æ…ÚÊÂe¥'׊èd±˜ø: ;€#['U”dÜ–eGYœ¾7À­`q—D#ÛdÞ[³õœthàš"AÖºÀ ¡ÓKRøm™7.3 ^´HÙB¥eŽ£=ì±V0lýY€J£V, ÖЧmƒ^,Ö,èHdˤ¤b¡‚ê€ì(‹BRë6R®ä[Á,Ù.ãR¥šmèI o®ðÙ7ÂÒ«ÂÊaB±l¡2ƒN[Á ÈŸ€Á¨5:E¤B‰º“Uõw4 b×0…Fe ÞÜ*Irë.iÛRÅ}îNï*/¶‘ ;Ç?Ï\( ØkTÖ†ž9 X7„D]J($‚€B¡J(ª€[BB¡ˆ¸$$’pg„° ±ÐâJ(ª€™°3!ä›"?ìJF8¿BôEýö&œ[Å£OίⳀ_€nm‘ŠÓŒð €âç– 5+üñªªŸFÊ@Ó>½ ¯‡×Ìðg„  ¯éŸ^Ð×ÃivøÎîùí5Cü g÷ü¶š%þœ¼hq½ž®÷SqøêíuãÁÔzvq^b2F2¥ÿÞ)ëÇË+{{{ËÇvÇ.¯¬¬,_µ?t½­îû qÄú€ùüýßvsõÈZO¶ïܹäL“[í¯4@9xñ”M6ëíZ<¡âW¼Ö®ÆíD{;Î{$òÒiýLšÒG£ \ÞûóŸ_¼xñteÙæøÊŸÿôâÅòÓ‡v'°Ðú‚?Ë#OŸ®¬<Û|G¦ó÷woݺµkGàíÛ·íòùäñ«W¹;vG‡åš?»¢õWKKäMe àwH;·~ýõ"Ì¥u6eH];_EÙx0…ö¯zÌh  @c% ¡–W^üYE¾°!peùá©?} ´³–_ðw ¶¿ü}øLyyùÙC»ïÈtþßv¡n¿yºgõ/qîÍ›76BþÞ½zë@'þV‘¾ßù}Ñú,#ÖžEúϯÏ/ÞC²Ì&¤.]kãWzØÒ#ÜWÁøGþ¿ïœka$Kÿýû÷ƒÕUÌ Ž÷–—¯ªêŸ!Ë{Vwá§OŸÂã‚+ iäÒÁG«ë|çË/¿¼tçôð‘{˯^µŠbqþׯwoÞ¼¹ûfþÇì|ýúµ$ÝF’$‹\þÞnÛ\İœü÷Ù³ÿøÇW(Z¿e ÐÁ¾|yíåK˳ÈR¾ž—𠮇,àåô…ÜOmk ø‡>¹î\$C%VׯÂÿTâÎn¡e˜úç§6ˆÁúßC•h}€—TYÀá ¾óå«·_n¿:5tdý@Ù}Güù_ª*ð6²™ËË+\(³E¿!Ï|rÿ…ü=~bsCr¼3 h_´>Ëü¿çDíöËG/¯ÃuìÉÊÛ¹ y)MøCë Ü‘]y##åky©-e6ä]º×loïìœ{g X½z2~|u5‘¨¼·Jˆ\Þ³±÷þ=ðêÊSVÜæ\z­VëÕ«SÀõuxÁÆÕ/ßB¿|uá÷?}úžþÅ µDŒ8ÿ'×®ý¯Þ÷Vöô³ #_ܦÝ„ÑÝ_ão¸ ¬äàç°\ÿ@…kºž äªøÏ™‰:õè”áµÆnÉI¥úú§øU/I9î¬^Îc ˜¿¬×Dz€ïßC__…’=æô÷¨…ƒ6nhÈðøÕ½= @sÀÛ÷N}´³³ºïJgÖ†èÎ¥/¿üã¸Èœ1ì_yúL#óûôá™gçÿÝîúÐˆŽØx'–ûÛšý*+¹'wfœ¦µ_²ð Îfº¢T ÞäJ­x=_ñV‰·€Úµcjkmv„PŸŽÏÖV*«ÇÇ/®þéO«ä³9ý½“'Ob¯ž<ùtÏ"Ä2ô!*ním Á§wxuçÂáœá ú° õÍ7ßlo×¾4 È»·÷ñž]]v8ÿ'ð>ú û²Ü{/ô@øÈmúm˜ÄüõÛìþ;Trnoò¥&À}ÅÒ?¹4ÀrÅœ!b®uÀ½øc9)З^;äü¶ôfãvéöF­õxÆ[plõêÕ«Oÿôb•ÖMéï §>„k 9ÄÊÊUÈÇÊÊ»wïÞ! ¾:…„hxel£FÈ7hñ­a?$[]‡|?{öteÅáüŸ¼…z©‰ „|¢‰OÞ~å\5‘ØÖêæ2°;Ï—´ð” Ywý ðÕZo\0)á^[XÀoŸo¤7ž§7Òh­Ç38H¬Bû·òÞƒ­Æ,“[06qÖÏa® öÉÊÕ¿æóù¿ZàÓÛ…ÜqâƒmãF^˜rð4¯^]~¡æmÚÜù_>zôèå[ª/x GÞ*eO®Ý»ÓO$¤q0qñ p’w.êðS À·§ÚŸZFìw×»}ôðS¼ÅÉÁÏú‹ýÏŽ `%±ºúâÅ‹“«Öù>†u»‡Èþ­¬<µ| ÀUé²wuÈ‹Oï´|ï>bzÇÛ&·fa;hõy?xñtÏòÆÈÿ ¤ì•?ÑG†J&äOU·5Ï„e»}‰ÇÈ©k§N©Ö^€t]Èìfêi¼Å9:ǽ,,à– QÓ7†Øe ‡ˆ¿§¶?…`ý|ã¯7nÀ÷ÏÇ ¾}ûîW&`5BÈÂÿL|ùŲ±Ng}þ3×_^§2òǹ>ÌŸzo{,þܘÕÌŽsjŸd àös‚ßµSpeý ôÏ>×?·~.soñG.^t¯ÀÛ·1€·íë€Íê`ÿ ýËùéÊÞ(þÀÏýù¯…oGíøl3ýa:Á2jQ@þl2Àÿ/vüqG®ÿÅpà:æïÚ¶×üAUõ±/ÑðÓO?ͽ½öêÞŸ¢/Þ2âOȺ­ºþÓ:²x?qGvû7ÓÚ«oñ°õ\ÿÄc@‡Q,—÷FvFÀú™iøÀwÿaz7’ü<,6?VžÊ–ÇŒç?£ÉÊîÈ[Ìßõñî’®ä4ÖÉýÑÄݱâ?íó/þÐ.·ŸñÇØåÄE3§ïØÆnPþê€@&/R> ʨ³ç_–i¼¨ýÛ>§ç÷ù‡•™AÇL{G8›çÖlx…åzËWÏIg½L?íB0=7Á&–ßçäÏmPϾ評iߟ?·L?K9ÂÀtd Ì/X @üõÊ ¨ãö±Ë"pþ†æ€_m؃.΂¢B Wœ¡ÿí%‡›m-É!0Ó>ÌÈ v&¢.`D Ì/8 áúß’zBh¤€Á°K Ì€5?€NÂFÂfòÖ~“ûfd¼&uÉD¯æÈŠ4€€NÚZÊEÄÚøMû³öH3 ù‚L ŒT#Fæ- !Ô²Ž¤"`î³ög#»7ÛµöoGðekñlÐߨœÆÁºcüZs @mp„pK;‚‚æ" ¶€˜/û–ÑïÀ6!6Jð¾Q­!Êæ›æÂ&ò(q^ÕG¨\ü7¢Úõ$ P£,ਬÂãO[ XÚÈm”¾Q­AË}æ†-w¡ŒâäGà¾{EQômm¹úKaã>\ßÿ¥ðË}ýˆ¢Ä6®ÆWh¬+ xHŠp\AóV0ÿmþ›6&̦†—È1BÖ]B·jjÛÈæðËp óMXŸFrª‰ZˆÁðí+¦-¸üÒu²UX½²Z¸Â¹¿A?^ùáé ¢–"W–ö¿é›ÿ.5 د!\C5t—nw,CÔ¶jÛ5ˆ¾¾1Åe¯œUÜoÚ¦ˆÃéÛ‰Áðí+¦-¸lP붺 ?¬ò¶ñÄÆÙ¸R a6~`±ïÇÈe,†"¸× yƒìŠ®"à‡ÒøõY@bßr°üsê0”ÃC˰ØþVq¦NãOb|YŸ'pøì6âÔG0|ûŠiKAÉmxÃàýµ€Ôè5ØÝWA‘à ûÊÆ*ºw_¹ò‹BŒæ/÷ñ®+âBïÀ×<ÄU‡ìªÖúj^»ÙæV5fÍ! ú”ôg?´¡}%¯ö·}«¸йóß’¥e[qrƒ#¾}Eß"‚[«Æ*ĉ¹‚@|c…*\Ñ£ãH #ñÊA÷¾Bh¾OvEXQùƒ­àÛ•k·õò‡õ3¬¥¡áÙ¬B õï”´ûüÿC{}°ŠÛ×ÿÁ"ÝZ†V0?8‚þí+¦-²¼²±Á,à/., B^Ùˆa úΣ:ºŠ<€íÔþií‚«/奣ßò6! öa ýøeØîñúøesvršN Üá³[ŠhAÿöÓý|¥Áê€?¸¨*ì(4œW£dÍåè*òÖÚØþÁ:`Íæa%¶‘tx6ûÓC-=aì}«ý“„2Šð„qpöí+'Œ[ Æ·rq+¸aÙ >Á,à•j2+4Ì/¨E¬˜ë€âìVÖvèГèÕ±ŽH, ú%$?jȺ}„>Xƒé.ò(ÄÒG ùû£Â–³_ðs¾û¿(Ê-ÿ°°¡?,àç€86ŒC4[ÁäabtuÓRm£†j€¿ÙÙ7l]$°oèƒ 8>V²Á\Nİž(êÖóä l^눸zDÇ”€Lø“¢·|mt¥ý:Ü´Š:€²~6ÿ¬Éܰˆˆ†ÔG«´#¨¨8ÃPhX@ß$t£hHŸ¯ù;2BPºQt<ÖœÃÎEÔ%ôM@7ú&  }Ó0€½Ý]»À + o°_9ªL4Mï7ÙT,Tšô›¯ü…~ª–±-ë3(îTìñ²È€â)‰Q°¿5›â,üVCòS_¶r‰MêÈ7®"ŸúNµšµ=ƒkÇË€Çö"P`<€¿qFø2”ûø_óSo÷ƹ¬Èû½ ®ô{G½¾i¶¯~ƒ¬•µA#[ Vn PbkƒXŠ:ÛLÅbkZ<A–ëŸÁŽ+ô°16TQ‚F· Ã5bR*v˜0è>ÞX ol½À8ûãàçƒ.ðrÿÓŒ–‘êš©¸ß«ô̹ìÉZ)J¹:Ä©’’‘IëUjµ )m­{, V Rì&Nd±¡U lö›…l¿¹iÐ}<pý ´¶¶Võò¤ã倖‰`«=¦AÐ!<€¨‚ê€pÍ…MÄh¦hrÐVšxG¹@‹”¿¶‰ÖÚ$½‚B9‘(ÓÉàÙq#€,6R6•êÀU £wÁ û x àz©”ÏOw›. $e ÀÉøCF‰ÀêÖP+¸×‡/CH)Æ<­6ûÙBE ÍšLÊ_ÛDëk€ bØpdvœžÉ©5ˆUõ Ÿ©‘â>^xšÀ¬üË y­âºØåoÁôx¶ž“‡ê€ðOBuÀ„€.2à1€ñuhK¡A\´:€y¢Ëù ds x6SÇ,¸È%”>¾;°Ùc `…>ˆÖ $=òI‚•kÐ(#³ØÓ¡=½Úãc¢ ¸O{’HW³ÁšÞ ÖOtØEt‘¯<}úÀWݘ5€Ÿ¼>óúµ¢éL÷FerYÓ[¿ÓÍÏäiAO’Í~¯Œ¯`K>è®Àl|uæÕ(!ÃÜÊžÀ§O—Ÿº³€Ï¹å¼»#tc‡Äœ’ìŒÊ°—²Ëƒõn¯ ‰ÇáG„ò@wÆH³rêÌ™gÎÐÏ%XX•f¦Ä ž{‰-K£.a¨¨°¥¢gÝ{8Œ¼»±€ã+0ÃÌÀÖR CÐ{ݘ€ðýZÀÏ5K¥t½cP] n§å%\F n ÆÐâ ýp!´µ‹.¿„îÂÂZ"Ò¼\†ï—ŸŸùüsúù@o;0ˆžjɰÓê.›Z"#-àÝ»w¿q÷ýÑÖÒ:´#§×××GŸ·r A@¹Þ1í\æÏòàýÜÐ} ~á»Ë@„„ÕÀÓ<‚¾èÀר¬¨(ƒÎ±-.Ჩ%¢µ€¡JÈô›@׉.Ã÷kÔ ¦Ÿ×•õa±[°yÿÐ%ØÖ .¿+r ŽëZŸ·rð4‘Ö ¦ŸO+§‡¤7BÌGÌ—pÙ”KŸí­°oÓc8Ñc!$Ú‰m‹Ï[Ù<†¹e¾?G­àÑ.±åhÝYÀ½§W_ì-Cø€ßoðÁ(ͲP8% kk  Ç0ñøV@š3Çùû@’•£Ëðý9jÓÏGÊÑ ÃÜÊ(ã%¸l¿xºü ®~¿ñàÆïxG?fÈ¥ëë±P8%Yhk) R™ÀÅçs&Ðâ8¿CŒ]ŽO)Ã%˜[ÁVY°ÜÉ:±>™%€~:%ÙœE±?4´ß›LŒ' È@.>EŠ6ÿ±ÀéÅ_‚¹l™…a²ûNA¬Ofó[°ÇNID‡v”)î Ë1 ˜Ç+ƒ#xÞkùK0×-³à"—n¯ÇEg„J7ׯÓq‡Ç5>ü§µÊÊ\8^&<P†MF  ÀŒwrÝÇ1ˆþ€Þ;%aɱª†Èì9&¡ «GàdÅ7m&ðÒá5¸»„´rJÊÕ™SåDNIXõ”NÑì9&!Ó˜@k!ÐO]þù ¥S’¢ÄXp"§$¤Z…£hö“€Œ@+1‚&=–ŸÍ ,à°Sè×)R ™ñœ’*UŽ¢ÙsL"3¦£­iŠoÚLà¥oº¹ˆvJ‚ª²: ¶Ç) oq½ZgÐ1‰¨Í˜ƒ&}J$@‘äÖÖz#’Ê ù3ÃÐʸNIæ&î :&¹Æ÷óÀåÒ)©U) Ï•q’†œ=ǤH N¤È}šeÍšSÒ¨Älö ƒÑdÃõÏšSNl,Ò¼ü%ÄÀ¦­¼J\Ë^FÀ‰ºSÍ‹S’ß™à’âžg/€‹¨‘Ö¬%tŠ€n%) ßêºxqh—Ðo ௶ÆïŒ€OMàç½Ð½†|²}çÎ%¼Eü×NíêòÊÞÊòU [òÉÄÉýìëäÖÖ05¸æ3—XÕe:rñ”€Ýx*Þµ<é’ÁÅJ8ŽÌ>yüêUîÞ¤ð_;ËÏÖÕõgË/†Ì&V@3S—OÐ~¯ê¦ŸðÖ2™µµD­úÞ |Îdòwê"·—°›é®wã-˳.øNIcÈ äïÝ«·_ük‡üƒ?{a0»_ P‡¯÷fû›˜À:\ö×R™L+ÕÊdR5no ÞÖÅí¿xO×K.g:@ÐþA ˜ïÆ/[ØÁ%ž?á”4†ŒþÞnãÀ‡Ëmhá¸Ý^~h°•¨§{*$0]OŸ4Ý…ËéNóx³ßI—“ÏtS¸—WÊP†Á¨Ù@@ðòÕ«W/‰øœé¥Ž;Ç—×±ÌX¸ÄÇ6FÜ)iü³NôÌÚ ºÿBþ?ÁŸ€ËÏÚÿµïÀÛÏ– Êïå÷§@¸–³ÆÓ¦Ëéz®œ«Ãµ)ÁÔZ¦ÙZCÃʶ´_Tçk¼¼víåPpÀ ´€ëR<•¹ _£qé”F¸™v›Š×'§$‹cŠUÐÑ9ä2‡36úg;À;PÀ•ø©ågÿÚyúl¹_1x2÷>- "0WO˜ÎÛ?”ëðu84/F3ÓL5[Í.ä/ÅŒ€@  ]°oå¥v7ÞLwÒæaLrÝa¤;¿{ȾðŸ™xo¶€ðëÎæ²f0Øf†7àN«ÕëôZpÍ2—øÑ€DOqòÆ/dv3 —ÓÖOcôXÀSïN§$’8<_ªÐ©ºfÕº˜9=x>éš©Ãk«Ñâ2Ç2æ @xû•sÕDb[ã«.?[‡wasò‡-`®sf ¸™Ø„-`¸4Ý.¼´.R=¥e/Pµj„lû`;X#°ƒ+õÒåcþÜ:%܉¢à”DoeA¹S›’àfËGEËaÙ˜ÃTã3.sZÆ\øäÚ½;Õj­¶­"º_û*j£ç³ûï÷¡Œ¿ßß7?‡Aü•e QáÕ›½^¯Y×3—ÁHeðâ+]Œ@ÀÜOûð•s‘ˆK§$ƒ;]„ê”DOÇä‚ÜHÇÒÚá†q* mMJËaÌàe¯eÌ €?UÝNXX{ñ¬MÊë_;Æç€'ûÐÆaM°ÿ>a|@Û„üUúMøÞL ÷LÁC¨¬É–‚ù%Ä@@ŸÂ\ãšÃ<€úøå"—NIw"m¢SM¼Ø,ÂwY?Ì, à¢XYÀ~,ÅK1;XW@È_»­ÞÛ–8þ´ß‚_°_BìA´|2—BüåÞ dÍûp=”$⯓íp öÇê€?Á;ðOn~·i„˜’Ì0T§$šxªÂo´o€~0`u@ïëéÕMýü¹A“ÏŽ{ xò×¾wm›çOýL ÔÊ@†¶O~Ÿ{Ÿ0ó‡Ú x5Ô Uƒ,B¯†0dÑ‚Ðò—]/ùdžÎñ û\uÄp锄d0T§$šxVö ¹® Ðîa#¥ç‘ìãZÁúù¼Ÿ[ÿ‡ù»nàϪ7 !P/„ƒ,j‰ÈÖ?Ú)ÛÁ¦/•í„ “ì~ Cóä”ä¤Â”§£? ½õjP°Ä}Іüì8NI’œÿŸ\ÿbVÐR @G à„Š9=’r’p¤Dh¿%) ßŽ”*ôY£´ùÖóLàeœL@÷ŠÐЀþ…ä³€ãhk©‡~TgF`h“¸p᩺ò¨w\ˆe8ãv,Yæÿwd¥ =Ððm `ØÙŒ¤€È€B¶šMWƒÈ—+àtŠ.€òˆ(Q°J¿OàXŠ.€…!/A‘-ksŤٴ`&jÕc [Ã^ˆ€Ø‰˜¨4L^Ò6–÷ý̦µ°Z«ÕrhBàxrÐw í”y{½Þµko¿øâROýÎ@ÅïœZûø7JY8¶"lUžÀßvØÈ-ˆ>`ºY‰uóp£6HI5 tÞ5 x€?ˆ[°u¸í­¥£RI‘N\+IUío$HdR(Èd+6¥Xè‡<-CÕnCOi—9¬©oVWoá]Å~)^着TL§Qõ/xüD+x")œ ÇÖRXÎ5›¤$a1îåxV‚%ZNãbMÖÖ õ£n]?äiº°€êÍkL†ÈGeUÍöáÿÅ ¨(ÊÀ<~¦Xlš"޶E2hk© L·Ûë R’UXŒuXð™MX¢T²qµ„Þý§e袨ª_<þB½© íÉtÉ$4”’ ó7ƒÂ¶K½n} Þ‹jÖGæ@ð?ïuÙZ*@Q0©—d†@%‹K”–,}³Cž–¡«Vðã{Õ_™0€Ùn¼OFÀò¿pŽ š°Zs·¥ÃÃ`Õ›ØqŸ 3_Bž0êá! @V’uZôÖG=ž´ -4=üâчG_¨_}wJ%y3~ph•q,`Q½‚Õè÷im¨˜9öÅ*’í­¥M@V’ýb.ŸÎZÈyZ†–šH |¬þˆõO²KÞ, j0OmiëB´€¼Æ«B3¯H‡^AêÂâ)vµ¡bæLF XÓ„%I[ÁõÂá¾%€ì§eh  Q—?zòèñ¥ ýÓâ$ûOóäZ`º:`bÐ2ŽxA=áÊðkem¨˜9“±èðS\»àºðñ£ë®_ü7¤¡ƒÍõÜaÏïlZ L ¨6dn `Žx c#Fk™3[Áö‹þ—¡ __ûßÿ]{m})vX é·l0%€`3Å äÂ$>ûÙ­eÎd|è`,áºðË×H_ú—±¦Pªp¹0>4Ð†Š™/ ‰Ro{£* ~ ™NÑ0 Ä5ÓEÐih˜ÅPt” @!$àtÀé$œN@8€Ó §“p:àtšM£èǾOàXŠ.€³æ–ɾOàXŠ.€ã»eÚ+iZ{' €£º{œ( "÷ØQ+#WÅ4‰®uÇwËL:~ˆ€ÆÑÎhðó¿˜C›>× ‹Ñ›%çtœgVðTîL&“•æiíã$N¸ÖqìÛ-sæñidx‹ Æ]ýF§ož$ ÉÅœ A>€ªït´“tË·Žc k·LÚm‘ºeÖQ×òA !Ũ¿ çñç‘Àô’)Tµ‰Q©4<Ôƒ7Km ×ú Ö”MÒyb¸ùb¸îû)ös?;ªO´ªg–!=Qj4BŠë—wÀÖRk0h% €Ô+“—þ-§¤ðN7X’æÝ7µ5ê㹿٠Nâ@¸D€fݺeòýfÕòì«ÑZ}§Çn}`zÙªh»U©UËhR¢bMï£(ÉÕlÓ ›-•›5•ë¾_–ÈZ;ÊM´Š"jswQg€š)e8®OÞ[K‡ýþa’öÈ—eä•ÉŠ‹HnÆà?%µ€›ºË¦jrßÔ?ÈëÈÇ3q˜[o <É¢%b  [·L€Ø³/Ë™q9»d5§Ýú€u@:…*Ú•• Eø¹Äñ}ôûE#€l®@nÎ@®û>ÞR?ÊM´ª>[<€ÌOKEŽë“wÀÖR¢TJ$5Ÿ$ä•ÉŠ ©Ó¨¬e=P±’šÜ7µŸh)ë¤ÂÇx’DKÄ@ˆ,Ý2 bϾý …ÐwzìÖ<¨êS¨‚†¢ßµE5;ÐwÒ}l¶TnÖT®û>³€ÜQ­×¿b˜ Vw0¤¢ ÇõÉ;`k)S*N¼2Yq€ðÛ®ì\6 î›f_Nt6ÕXàI-; ­à7¾¾ûõ–n™x’$­b2À>„Éz(à€úª`³ÆÒlQªš®š´°€@ï¾Ïꀆ£:€Ìœ ©(Ãq¹Ó{)l÷“¯LÞÒ[0 ôÄyÞeÓà¾iöåä, ““<°øàk¾Xºev:ër®+°"@Fw¨Ñ,ºß%?ÜúÀôÒ)T±#ºT‘äÏÊ&+=¹V4ÈfKåfMåºï³V0w”Õ Î,œe8.===…gå­¥b?§Õ©--.MiÖQëï²ipß4ûrÒ: _àI –êÁ]ÈßÝ–n™ñN¯käÙG9ø Z<k{êÖ¦¯Ò)TÉ$¨¼ÑµLÖŠ½Ï>;0Ü æ»ï×*ä9 7§* èÅbÍ‚aVW=œe8.=½÷ê­`æ•ÉŠË( V®bpÙä·Í¾œj¢LZÁz£½m®L˜°Ð(  ­[fX³úS\+"Îvä9`2øŸâô‡î$·`k·Ì¦î’ðƒ_,xë­tœƒ¡™5B¾~`Ý Ì¤ì5*kiç`Ahf$ 0ƒîfÀ)B½aFU)FÇÀi¦K§Ìosh6e { §N'àtÀé$œN@8¢à­EPª*ŽC‘[=¨v|€­x÷[™ÏŠ€;®Œ–Wܤ¢.Æ$½ìÜÀ%t_†Àû#:#5âNSíÏúÉkðiWx…Ù;Ú[‰ÀEB&ð„"±„Öy÷æÆ.þÑm?º:»e:¹1h9˜@ÜmT*Ó.ñ¬”Ö5žëFzY­·>†DÝD¥ ×…¾¦ß‚Y¤è޶]Ý2ÇÐ ÁâŽó¸Ó1ª²^¢H¸k<×¾v˜Özë#éu@2µ‰úÕ;Òþ|†.þÑm?Â:ºeÎDŸX?ys×xø—ôõÞút7ÐBÊ…\® [v¿×"Ew´ýèè–iál©¹ä5í"ð¤ˆ>1 hîîÊȨmríe ™M¡.ýVÝïùHm?Ê:¹eZ8[2—¼À¦]Ó´‚ °\è³j­:àãu×üXo}ºè!¥XLîBoèâïSz%ϰ€Vn™ΖÌ%/°iÁ´Ï%Àx ýä ð®L{ë- IgÖ4u¡7tñ÷©?½Š0€ÆÙ2o¾}{ó¦q¶L gKÞ%/i§¿„D¥Ÿ|€Š€dj ËVð÷=ºiœ-ÓÂْش‹À;'í'?ÛƒíGÀœ @ÓsÀ^¿þýW_Ü2-œ-hM»¼0BýäTt4¨^ÿçLÔ-ÎÂÙRsÉ jÚE :#L§èhÒ?ÿù¦ Ý2}™v§Ǫ́þMÓ„éø2í"N§Ùpjù2í"ppKÈA‹ /rPÈQÀ)4À4D0ׯVs¯yg&P<¾~@øN¤Q"ˆœ{¥È;>‰ÖÙX8‘DοRä}z­CX —¿ù8ÿê‘÷ú:8ÝÎ+€€¸RK“(Ÿ'ü 'Ó5ç^=òÎO¤vØüÍ/€ˆÀ…@p¼§À/Lþæ@Làh¼Û“+ä2œ[Á-òžQþÆýrhÖœåàBˆ^ïŒòçÀÞ½{÷¾Hwr¿=ã€pJ}. WeèÀ^¯wöì‰WþÝà <—6@ízÃ.‹Iå²?à­_uí.Ô±2m ÚŠˆùg&9WMoçÉd™.€êîWºvñæXY”J™º¶"bþ™I}Óãy2Yæ€ àM@쓤9VVºxmº"bþ™InöDoçÉd™. €çu™ce¦^(ÊÚŠˆsÑ\5½'“e^¸ ~ÿ]º¤JTø•j  Çód²Ì ÀrÒ6u¬ÌçkEmEd Çód²Ì À[º¨_u¬Ü¯4²@[Yèñ<™,óÀyp}l# œ#×GøÝßþ6µg¦÷ÀEÐ¥’XžeÎI@( S@( S@( S@( S@( S@( S@( S@( S@¸ˆÎÂd…!´æÀ>Ð/eÖgË ˆ 5öMºŸ-Ó$n 9ÿ’ÀyÐýl™&Ùhú…¸ì œ@8·ºž-Ó$[ Ȫ€žiNtž-“ú[2L:Cf’Û¤óiqÈ•bq gšWgˤþ–Ô“Í™ä6é|šDr®GõC œ_gˤþ–Ô“Í™ä6élr4¼3]ôª€s  ¿DÆÙ2é‚úc²2¹É2µù4“l~.¢bFè¡æ@C+øÁ¯ï~}ãq¶Lmý1Ù ™Üd™vлnÓ@8¯Ÿ>øZ…¯ÆÙ2é‚úc²2¹É2Ù|šªžo${’yàœh| øà.äïîãl™tÁü1%½,é­`63z@Ï5ŸEtœ-38w$" œOÜ‚}2€!h!D¯8žL‚@¢àsç \ £* œ#O gRÀð€óà‰™ à à Ã. €êª].€À0€ó`•^Žua#·L¼A´¡PÕ×þs €ó`Õ @â–y-'F£[µŸì ~@¬9ð~A!*Ü'mvË@íSû«³gz¨9ðÄ}Ü!_nPþN˜Ý21P?o#’ÎR“öñóç?RêØæÏ9cGüÕ3ø€Tó &PçïÄ “[&ꣳ§ç?ž@&íãçgÏ>'j›h­H|þÕóçç€^j.„v9þNÝ2 Pgᢠ‘"ñæ~QŽg%}ºM:g²œÖ‚š3/œoÁ& ˆ„OÁ[ðÃ-8WKè]ÐgŠ«ÕÙŒšýºº™Êªõ¾`}ŸD¥oÖa ™M}ºM:gRÖƒš3/œá-øhŒ:à'o¡>ׄvi“Ò7›+³^c3j¶ùB©Ñ޵5Ѽš\Ô†¢(IEŸn“NÄÉ5g^8'Â[ðhmÏ=zôù[ª/0€ ZðR X8À1ÐŒš›ÝMüF‡qpfé¢NÓ`ÓmÒh¼±4g^8'¦â;#4=| ù{DEøS+°¢fÌ•™;Tµ5[…–Ú…otgu@•DésùtVŸn“Fã«‹æÌ ç@¹4@ÓSÀ3×?¿NEùƒ-פ@2Wæå5U›Q3žþg^¸(:ºeòö?ï@¤ÅÐÙ-“ºa ƒÖbèì–IÝ0€Ak14É…[fÀÐ…[fÀE0@`˜@`˜@`˜@`˜@`˜@`˜@`˜@`˜ÀùPŒ 3£Z …[fd5/žõÞ-ÓwG9 œ½rËä> ƒÐ‚8‰[¦0-€ã¸e2ó‡6éÄ—~e^¸0Žá–ÉÈ&¾ô+óÀ…p ·L@6ñ¥_™. €ã¸er²‰/ýʼpQtí–Ù8€'5XÀ¾ÐO-€îÝ2;u¹l¨€~j1tï–ï45½,‰V°ÏZ Mn™ÑÑB(Ü2££Å0@`˜@`˜@`˜@`˜@`˜@`˜@`˜@`˜@`˜ÀEP¸eFVs`|ÚÙ2±ž0@g·L,`ðZÝ2±€ÁkAttËÔ0k‡‡È=SÝßlH¾g^¸0:¹e2ÌuÏLæÖýž1çàz'²€Ãn™Ì¯³ªZß÷™> ÑÌ_ï$u@ ·Læ€Ù î™h- @3½“´‚-Ü2™¦°€‹^os6Ÿì9 …[&sÀ”D0X1 ßÌ’¯ßûRm ÏÄŸÎ-“9`¶Y+8Q­à ¤Èï[Rí‚{‘âtÎä@“„[ft´ ·ÌèÈ`ï‹:€uv¦IŒ†€Ð `µvf@e3MÎ$œyLŽ>€J%€s!ÀjmfTŠ@82XÀþÌ(,à¼ÈàqnFuÀ¹‘©,Ï€¢Á‹T~ŒCÌO ‚Lóÿॾü¿‰¢º :oݱžÿú믟~¤–Ô7¥Ò›_§5IkùÒXÒrùîߺ¾+&Ö¿Ç×®=vG ™…'Ûwî\7æÅÇ×_=züØõÅjQõžWv{æÀãn#} 8´\þ}S׿Ç+Ñ¿ýí(ðɓǟLà“ǯ^åîŒóâãÇÀ3®âñQµa’–ìöÌ%€oÜ…/õ äd€KæÏKKÜ é# ?‡g]m·¿¸tésÇâPLåòï›Ú~l¶€/¯C ør¬˜D¿w¯ÞŽ þúã'.‘£\ øÑW_}|õ3ð+,xÕ ·¾2jÉü~[lIeAàç˜?$@E) ²ÖÒ@öÀ[°vXtKô²â”›•BQrމEø{»=nÌ?~?*Ý{¬Ýô¶Ô®ŒÛ2Dµ¸³â›w›À»wï>@¾ÑY»õÓOΪKx¡ï&PP¯š+@îf Õ¡’´ðÝ»›ßÏØotú‰M[XLtûEâìd²TtŒ‰…î¿¿ÇOÆŠù)ÕÛ'Cê²pX‹`Ö3À[k·’p}®°ôÕùsƹóçÏ/í*…sçMªþ,üñ·³ºj*‹0j©4^7Rîjp—˜êÐ k•Ê:ÕÚ ‘åP6YÀ3:€ œ1¹†hä´x$e w 8þhL=·µú Ö”aÚ½ÂÇü”dÕ @øW+7[h° ÁEðWÈU3ÀÝ:O´tþ<´€pÛ9ùÛÙA.ѵ.ü-7èWŸ—J«¸•]Ò+T¸Z1ø®ÔªeXþÝŠ”«[øî¶%`Y"ë^¥VC*E³n[¢g?fM‚l6Võ&RY‹GSæcÞI§åþ¶Î‹©åöP’«Ù&J»fˆùifö{;+)KX@ ‘•9êí[YKK…Ÿà§%Èßù ݹ ø®Gh&p-`é¥ÞÀ…+À¢…8%àÍm³Å•—^.«»±ûvWÉ®†LÖe£U†Q ¹†¹D766~À­`€~ Gäf¬ÑÉ*ä¾ÞÕâÑ”90ýĶÆ‹©å©×JÍS³€Ÿ°V°BDlö ×hˆj!Çú)."öþøã—!€§_Cߨ·¤Zâ×É[?þx+ ?е&v þÑ(#ÛÏŸ¯b„^žÒÄ…Ð…$4hùP¬†<§xŽÈ, Š!7h®PIÌ¿]9qöì¿þ`*Ó~š Í-0HkñÐZšðö+窉Äö“¡˜,·Õì€Qe (UB°”zû {äÄ[Àýl¡"ù ହe~õñÇw>Rۯ߾VUàÇTKüzãÜÇŸÛ€vÈZ ¤²FÈÇF}Å„¾„:õŠHê€jCì,à9]@VÔ, !Þ°4ª‘­UjY=Þ|ríÞ~"!mÇd¹-§ªéª€ä%õ­öÈÓÔ ÞŒ õc˜±ºcY(É-ƒ àåÔ×°¢ô¸c à;T÷{?Ð5à[Ú¸­éþè%+¹•EU{©"ÉŸ•më€ß­êúŽ@ZÁ¸سp›<<4@T”äý,ªîJzæ[ñ÷h,þt©&ˆê6¨3€Nn™@Ú!?‘ú¤ÍžqÏŸŸó¥xšžDÈ»eR‘kR6ö°€-€?ú $pò.ªaÀ0:ºeR©Sf0¡›+8[E @G·ÌhYÀý"8©œ-Œ" ³[¦^,ú=G¡&€P“ùlÎFÐÙ-SoKhûÎß„ ÎF8_³e aPhZM`ÔÝ2PhzÍew¬°¿T!÷šS'¯¾) P¨†$Å9ÈBh~D}šò¨k·U³Ñhº è‚"‹s™{Z-´æÀÃV.±éŽ#“Öb­VlŠg`Nçrš_‘úÌ«‡úbCâtÈú}¢ıPÓa€Þ!ÞŒUA_Á?—Eæû¨pA,¥9)Z‹¥I½yt÷I=k¦È‹ ù°K]½˜ß!ö7Ä Ýû±¦925$ºõHz U7º,2ßGEßìÂ*£Î¥§‰>°x†¬™"Ï¥L.!s `"F*c~‡Øß/4ßô:2)È1Ü"[YPî”Á¦„?i.‹Ì÷QÑ7‘W[Ku.“¿gÈš)ò,«OÅ­Ga>‡äÓ<(ŘŸLC÷b¥ ƒ÷#u,dâ¬V:&äF:–6º,²÷¹AI³?—…Ç¥bÊš)ò «›é®wã-ËcÄëš~p ହe"»±»dæw¨½Á¡ý âëmÅf¾Ë&—E ™q®aKÅ”5Sä´Ðæ»ñËvp‰+Ë%€.gË)ï–À(S1}dæw¨½Áû‘:2ø–kªÂo£Ë¢€¬8â\,MìÀÈâ²F#ÏRÇãËëØf,Ôøs  ËÙ2G*`ÉàôA õ;ä€ðÞÔ±P{2Â=»«ÂºZB©š\-½X¬Yy.–&v`ÔâñY£‘ç@h×¥x*s¾Ft  »Ù2G*`Ç×ÔæZúísÑóµâ­¼ÔîÆ›éNúò¨€nttˤSb¦›•X7ikŲ+ÝUØßô²¿*ˆÒOqõœT±vÌ]HÕâ\'ÞŠ7á½xT8×:¹eÒ)1‹ýR¼Þ…´ÕÖ õ£n]wÕ„îåxÖ»û Jö•µtà©FVñ ™ÝÌHàåôˆq_'¶€Ãn™tJL¤£2¤-®–л ;*Aëð™ÍùPÈ Ž\G¯Òåã‘üMX´pˤSbf:ƒdR!÷[úf®šh*MØ,@G€s¯ÜOûðe=V¯ÉZÁn™*™3Û·ãI#€F è¡€0²ºÐÇ/Çp“=´pˤSbJ%yÓ uÕ„›ýb.ŸöÎm#«øOðüSÜ1Üd¿„X¸eÒ)1åÍ fºjâVp½pèÝŒÁ@]Å/ì_pæoÂß‚ÇrËôoÈ6 œyMØa·L ½è #²×m”ü‡ ¸°ÓǤC@v+R®ÎF›„üPE ?|%ERÈ7¹P5 ¨aï–‰Œ˜Ìôq é›dä:…ŽS¥˜NÓR££H ù&×dï–‰ŒR õq é Y?¬ÐqL¹¡#‡‡’òI€÷ÇÐÞ-“8€$ÊQi£E6« ÈÌÒ…­Ô ù$ ÀqœÙ2µVp+Ûèëã@Ò! Y„Ñê€lèÈž©N(ä›&»ÏÀl™æç€tH6d÷·‚qÒ †¼éCGòÃW ýÔ„FCÀ«_Bc¡Iˆ$ M@$`h …* P¨ …ªù0l‡W!Wš[—„fBs `Øyr' P¨ …* P¨ò ÀPÜ4€³¯IŒŒ›¦€Óâü~÷îÏ?ßý=èœ Ùi" èÆMS­â92±Ÿfm0‚®žfû÷ŸïÞøúÆÝŸ'!°;ö$w›Ý ’Y0Mv vá¦Ycsd"?M M–<€CÓlÿþó õÆ øÖLb¹I¬Ý8Æóð×ò4ªãÇ1簾Wi~€ä=xðàîÏt ª)à…¡î@Ç{@dhÐĦÇf³psst³hÇϯyÞ¤xvšÇ0nš’>OzxuÀ! x÷Áï@ÍÒ: ®)hÕ­îÀMÃ] $ƒØʼ é,ÜÜÝ,Z¾àù5Ï›4œ@ 7Í6»“áÒ Öõ¾0&¨þ®Þ…w‡ê€Ima¨;ÐñÇx•‹¥õ($…›› ”E;x~Íó&o, 7Í}ï c‚V0„ȵ‚ùµV]Ðê*ïï¯áO±cU‚'g³ps²h¢訉ë€F9¹i6×s‡=ëCSh’瀨ò@8  ¡î@Ç{@j!˜Z±¸ÊE­ kÈfáædÑD+ØQ“¶‚Ç”Ã÷c5Ñ/!~~Àý¢Õñ´0Ôèxx?zH‚“Iô|›…›F;nˆç€Nšð9`4ìoÁâ—?$zÃ…*ê€áH8ûò¦’€³/q  U@¡P% U@¡P% U@¡P€6±¸ßbÇï®%œ}ùà›¦PÈJ^èÊMS(d%O, 7ÍdmÐèÄ9w ⨙ä6¥Ø`¼.3ÀÙ—7·`nšÉ²¼Þljî¸×PÛ¤ñÜK8ûò¨è즙„ç=hhî¸ß1PÛDžKÙqRξ¼j„8ºi²ŸÔ]‚9j&¹MêŒá^ÀÙ—g­`'7M½Ë1v—`ŽšInSXÀ”?a,Ü4€Ô]‚9j&¹M´ˉB8ûò@ 7M ó²ôV°¤·‚%Ñ ^0ù ËÙ4§uUξ|ú%ÄÝlš^hر$œ5…ÚÁ®-àÌiæ{Ãg[@¡P% Uó`wÅ© gQó (CþÊÂΤæÀtE©¤€3©¹äŠ9QœMÍüØ0¢2Û h|@$œ}iÞ … ¨ÕÇrNÂòó¿ gNAèv6Íä8 "À gM~8ÍlšãZÀ¸IÀ“€3. `ØÙr' P¨ …* ›³¢¸åQÃΜ+Å­4T—¼¨i.Õ¼‘ñ¤£ôþ*ü¾ºÅ© -ä‹sIµ*åñ´å€†“:èõUø~u‹!S £su‹!÷ö=+:o¬k™·N ôî*|¿ºÅ© í¬Ö¼*:oT6Ó4óÖ‰@¯Â÷«[ ™ÊÐÀ E•J¸ÐË«ðýêC¦2´°Z‹0€J¸ÐÓ«ðýêC¦2´µ€ýèÞzy¾_ÝbÈ¥ǹÈ8FÐË«ðýêCnë€Èp¼V°wWáûÕ-†\·‚ˆh+X;©»ç€¢-‰Ñ^K8–Ühèånø4¡<ÐÜÿÞŠ@ôü*ü¾ºÅ© ­\ò^e~¨ÿý}¸ Ÿ¯n1d*C ͽܣ«Q†7!wšÛ©B³" P¨28ûš«X  C@¡P5`Øf™ÈÇÇÇB‘Ò0€–›¾Ë”–pQĨª¸¯ @’%Oäá©„< ˆ€ÞåÁÃS y( P¨ …ª™ðâ £©hxŠæ…Ë’YOM@ 0šŠ€ñûX;qK¿CÚüAÇ'PMy  t¨Lš-°óŸÿ¤¯býgÇÀôö¸xil€Ñ”K¥b¡Ò”SƒX ~VzhoËÄ[±e ÍÖPMëX4­ø•+;;Ä Ž¶€/_^{ùrì FSÕcW¶r‰Í&Ír"QìB”*x¯ ¥]Wº¹~½£¯X«`-c±´îß¾}ÿÙ³û/nß·®^BÃz]‚/ÏŸ0¢r R¿À @¢Qª¯ASVg(­U*kØë]1„ÖÖr¬Š4Æâ…|øðþÕ«÷¾øÞ@pf‚ FScØ-R!RJ \•¢Ô«Ôj˜@=p®žåÖõ>fŒeàC øðI/TM¹0ë“[p¹€P+·ZEF\ÖýZe@E‰ÉúºV!ÇŒ± r`J8g‚»PŠÕàRnbõBI $†R5O د—õu¥Êäc„„@`ÿ™päÀn,Á6ëuŒÓ`ì- Cs…&î9 ‘Ÿ<¡°¾¡€ÅÝ‚…„‚Wõøÿ@±û endstream endobj 2251 0 obj 21248 endobj 2252 0 obj << /Length 2253 0 R /Filter /FlateDecode >> stream xœÍWKsÛ6¾ëWìä{F‚  ÁkZÇu&“LjgÒNœCBÆ!óÙýõ] I¤rKk[&v}}û ô4£àáïÂ<¢Ø‡t3{êx"‚°cñhDBOÀ:Bp¹9x°4GºeÐr»Ó–X×Y1óàföõÊÀ#v3ïD¹Us7û„ÆyH‚PÄqÜùê*„1é®n7>ü®ÛÓ{ï"ï?÷Þõ( þÿÀ#V³7÷³«·¨÷Ë¡gzžGƒ üØüøp¿¯o•gªXÁ/[YÞ}zï’²ºü÷ïf×÷] ­–¶”|ü‹H[Oœy‡;N­õü‹FËCñ9Fd¶ò.½ÝÓlì—¼…Ë>'áéT9ÂÇÉjqû•ƧóAêq_pþÃ*ûŨ$ÒÚf‘ Ô³‘0ñXİà ’±˜x–ØÄÂ6ñ44dÄ£ Qb` £±ç…·˜Ü?ô£©Ò›2Ér 7ŸoaYê \§¹ÚVÒæÌ<&ü#ëÒ¤€LC½V$Ei®+ ª†dYËd’®¡©ät9‡ZCòC« ª:)ëf y²šÃFj£þi¥vkYàóu…®AF–XW®ÞÓAˆØ$^L(Å9õâJö‘µýhc«×~Ó›ñô½*ä^ó x¨9ðIà!|~(ÃUÆ‚„U™l×*Mò6îB‹ÓYþn,WƒéÔš^ähšœÌ9i&<êùÀôø?vêFÖp Ùp‘ô+×VϬÖ2ÏIO~QE¦wUO#Øå@™X~-ÆRöäÉåÕŸMAÈ Yï·ÿžLÊt=ÜF{õEíhµOQ|œ"æc›{Ö£`#¨¤›l2»,çD_ q|À´Žä äG"»I‹àNå9<zkü`Õ¯0E XôOó.BǨ+A7¯Æò~rêÖ¤gA±ÐQS^ÕZš;Œ4sÏêIÁI´)^%b.Ì+OŒøÒVú$Þ”á{‰óaÇ~¦J™Öº|qxM‘µ1îq©uý8TJWäy äs]&i-]„´kO8®òüàÀþÕ>’§X…WkSO ,(Q2©Í„ê™ÕKUËC·í1ÐÖ»^ª¶WöTS¤µÒE5°lÛvÄw9¬±6IµÖ ½üëzÊžrvž•>æ/Ž1g½µC¸§“R7®"í8‰ =Å1Ä·ø!ŽÝDƒv¢!$;œC°a×ÏÛ\—_2²NÉÃåi›…f A,°û­Â`¤ÍNO C/}þ0$-eѶkµ*t[h–l߉{¼%=õùÃí_ÖiÖ õÕZ7yÖ“²¨š IíÃFÚ”%ÎÑžv»Âr¦[=ˆ}¼S¼Ûb«ŸâA&ÛO|¸"T…*‡ÐÛ&ÉcGŠ·I½6 Ø–r©ž¡Ó39Ê<¼‘™»–OÙˆ¶UûîÞf>Ç+ãtDÜø1mšsÂÍ׳0˜6½X5jÒºOÏjØ_1ÌÕÉDÓ LíÙn™Î¹yÝ1î,ä#jÉÕtÒ9?' ’¬È»ïLgjNàås„á¨ýŸe…qÿœ‚~ t_Àþ®–© endstream endobj 2249 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2252 0 R >> endobj 2253 0 obj 1219 endobj 2255 0 obj << /Length 2256 0 R /Filter /FlateDecode >> stream xœÍXKsÛ6¾ëWì­ÎŒàA€äôTO×™LgÒ¸ÓC’-AS>>,ëßwAP$HŠtNiØÂ.vß.‹…¾¯Püwc>üÃ:]}oy |Bµ,©€ùDÑRh‰@ÁÁЈ´CÑp[iKìáïU¶¢p·úü…6@‰„ãŠNŒ[3ŸVqq©ˆPA†-VNX˜%Q8X§ðú>åð&o¤Ïè!úŸ£w Æÿˆ(ìV·«×ï$0 Û>0ÎRQJ™ð! ‚‡æ‡ÃC Ÿ¯në8ÙÄÙ~?tñéãx嫯ðð~õö¡u´±Ò¤Çÿ>iòi0!=:œqr­ã÷\üõˆ°<ä.Ñ#3•´ÛÛ~š‰óP6Ჟ³áiM9ÊãÍjâö3Ÿßß(2J‚ÁŽð@9áfÙOŽÚd#ÍÚóþÐIvyĺ҉ð©Ì}Õ^C¹×Ir EŽ‘Q€U}ý.¯Ã0f˜pøƒ6ÆævE´IôÍ®ŽÏúœÌ^  jNôa›š9ìãu”À£9!¿B¾ˆƒ, ƒ²@ÇY4¸¯óÊ-šJ?W7Q©7Î8¬'B˜3«ù€1}7ž}¸še@B&m$'&~ ”þ’~¿þ6N4qÙóºpˆcÖG܃vfËu*Çh^ü€‡œ ByH© Õœ‹Gc‡SŸøpu³è¯ ‚0*ÃÀ—rjôxn£cT8dµ/ójÿnˆbn6ëÆ"rO.pÀf›YsAzÁ_¥Yñ®I)GÏé1†Ñö}„JWñ¡¯’Cn*æÑ‘û÷[1Æ9\òºQÖ¿Õ6Þ 1›HJ_q´L½ ˼t`uYRï–·»½Œ„q†žyŸ‰y(ä1ªæáx¨šç« &®;˜cÙÅc›‹ ñ¨»á¡Ð%fnV/i“»!Ê8=$½tœ•UQ¯Í1/;æÖ Â>?öXòn¸É'‰Ïä¸úé']œ0[1‡P‹£S¥-Õ:d‰c”9Sv1;Þä¤'n£Ò4ÉézÎNK™ÎÇY]÷D¥5_À'¾9Uœ|±¡Þ’zÀý0; _úX›³˜yÂ_´ÐcXçij*OI}Ð&F~ºùj\›¬ÛÄæ¾Át[¢uÙ³®$’®%ÿ¾Êšk>í¥gŸªÂ>U›æØ—-¬q,dD…aÅÛµÿÈ+ÝYFQ„c\HÅn…YˆïBÓï ðÌí`†­yAY¨H`gSðT8d%†åZH`hqö]Ð÷ •#ãëü’Ÿ¬z–E'†@ CÌ"›Ablñ öùhŒ3‘BãÊ@c02`,ÅJ9qTƒ2^´…1Ø›ñVŒaÍ£ðGñ°¬I8¾ð0y¢ÌZ^Ø„´÷æ/¶-ñðÙ~uóÔö¥¡ñ åEåc-ÏXÃØè*ŠG"Ím+ÜNÇ…^WmÏÓp°ìf.å/Ôš(Ž•‚â uê“~>$Qœ}ë¾×¸TlL/2oÂA„íƒ?×åuOv]êü¨ü˜ :²ã#ÛW¼{Ê6V)œƒˆ‹ñÿ®Èó§SÇýÒ%‰²]í4Äxƒx•â_¨MçcîD»‹àÞ™ØÁ ¾ÔùÓç† endstream endobj 2254 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2255 0 R >> endobj 2256 0 obj 1438 endobj 2258 0 obj << /Name /Im9 /Type /XObject /Length 2259 0 R /Filter /FlateDecode /Subtype /Image /Width 640 /Height 640 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 <2C340FFFFFFFE97A13C698560000FF897E1E5A5AFF666666C6DD01B8CFE52929FF0E79C87CB102E6EFA0C1BFBE8C9BAA86BCE3D6DF3D38393A86929EB5B5B5999999636C741111FFE6E6E6F9F6B4DDDDFFB5B5FF3F7400E4E0DF5151FFCFDEEDBDD1014B4A496666667A8A99CCCCCC9999FFC4D9EDE8EFF76666FF9AC33EDEDEDEE6E6FFADADAD4040FF5252526B757EBFD4E66382BFEACA9ED6D6D68B8C8DC4C4FFA2B2C1256EB32020FFF3F1F0F7F7FFC7DCF00707FFADADFF5A5A5ADEE660D6DBE069A701A3C701C7C5C5B6B0AD8484FF37597BEDEBE9F8DD6DDDE8F3A5A5A5848484424242D5DFEE49669FEEEEFFEBE8E71A1AFF7373FFF7F7F74997D08EB72892AC7BB9CCDFB4C7DBABC0D4A0C6E7005DBFE6E3E17B7B7B6B9222CDAC86CAD9486666FF9999996C879B518F0CD7E4F1C3D6E7EFEFEFFBF6EE8D8DFFCCCCFFEDAD154949FF4C455C3333FFE6EDF2BEBEFF7C7CFF99996633333391BD01A0C635737373DCD8D6BEB7B494AF9195A6B62E83C7585F65A4C1586480944D7DB6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>] >> stream xœí} {G–îT¦¯IV$^ˆIôXÖ6Æ‚cÿÔ¯-íûö]ŸÜwtþö:'cÐï4ðoLŽVçiáßÚáNoëÏî<«“z}g§µ³9ÿ&JÀQù7"Ç`àˆfœÆhü+†~›;”ôãÒÃϚ͖“Lß<ûžÿGÏtþIk•'­¶Nf†S'àH½®BèW ÿ6ýôH` HV ì‰þïM_|i÷OØ7Ý£iÜÒ§]‹€¾3œ+ÅÁ±ª™ úåâ߉¡dÚ déë ™T¨øw è÷Û·Ø·| ø·Y9PgÕ?¨xnÁ¹ù7tXÇc`'à<«ýÐoäî/‰þd¯µäß¹Cvîýß¾Õÿ-Ýž“Eêõ]ÙA Ž g—€E0p§Úln8‰úߤ1:ûJ ßW ôp’7ArûM[iÓäÖ¦Å?~cþí[«ß¼E¯Ïªäßækú1x훃Ì!‡fàNó¤×«´ÔÉó/³á³E¿Í »©rj°¿º§¬©t*k™ÖÖšÛ›š Yòïü*;½·úo½ÅÎeõ¼(rò諆þ÷«Gãño‹ÃQ°zÂþ’^s¥Ó{ÝìTwz«ífñï°Ú©®N‰|#³¯ ú}µ¹BéÑ®Òùo» è±ÉYSi¶š¯9kN™VûÍjóðÐ$Kþ­¯±³xkí­ƒƒ¯Vûôcg{m‡¡ÍæØ;kÛ¾È|އ#r0ûrægaSvZ„ þ¾ªö¶[½ã_{§WwûŘ—J¾©7"ïÀ¥>aôøªZ­W«_zðä×Þfg…%ï@2}õºóhuÇ$÷z¼“üïÍþ!ݼõÍæWëçÖè¡èU·Oê ‡üïN.þå¡ ïÔGŸ GÂ\üëSîuÄýö¤Ú¤{Íž¸ÿÒýÎxwáâ¨WÀ”×¾Î'Œ'=:6¾èÁ“·wë«›Û,y’©ÝÜl¶ë&YòÿøÇÓoVÿqnç¢ÈÉJ  ²’“°È[q6 Ûu6éükî0æÑ±ÏŽ«½1f½¹š–rj£³o"ô[ÛäôØéUïïpzÈû/gÍÁ*ýóUŸ³©Mo¾‡Í¶IVü;¡õ?cøè#ÿÍJµ^Q¨7}`F$à4˜‚i$ÜlîÜ?¨49ÿª›ý×ÍÃíÖý ãßë×ýÖ(÷ßœMJ;«©³/þžMУNê6=\Ö2­žTv™dÉ¿›;««›´ûûÇ?6ÿqnsçæ¦ê3Û­×­¶º‘—EÀ N‚‚I,<Ï_ÿV«ÍJGÍ?ú+ÍêfÌ‹|éì›ýÖèá$o2mîÐÄúW&YòïÂæ*í!(/¨2­jµòúÑ£G¯+Õj+w÷WS)8ã4—‰Øå;„ÿ7Äíw¨êSO$ë[˜û(üôpX³é'“Å¿?l>;÷ßôP—i·)eéßáè7òDxL¦Sp8z™8$F¨0ý 2¿€BØ—¤qáô¨TzX¬ð$«þo¶lû‚)S½Ý¤7Ÿ×õ!éWÇ¥àH$ÌÍÇñ|gµ|LòMš}”Õ8=k,Ä“%ÿÞÜüÀÍ7°Ð›.³¡ 82Ǧ`&Ç$áä‘Ùàìs…|ã±AÒÃJƒ¬±á&KþåÄð ÌÉÂ83¾Ì‰ppˆ˜¯csÏe_ÎK’ëòÆx1 £†ãߨ ÌIDÿÿ¡c<™žaNŠxÃ?eÎfßXy8> Ë¿±9y æ¤a^"ÆÆ!ªÏu:ÃõxyÉW(ÛŠàßð}âH œÄ yXŽËƪÊy™_FÒ·8ÙŽo|îPþð-!òQ&ˆ2üC” ä¢L ÿeù‡(È?D™@þ!ÊòQ&lþ­#Ń$òozÄGœ^ ÿe"›·‹€¨bâ(ÈíêžÂ¥žIdòïöðѳqÖ09¬ãv u#ÿøw›<(·û…|åëŸBÝÈ??ÿŠ¡ã_ßøz‰r¼º‘^þå _Ä¿a¿ð(Êa´>Éëè֘тñêFþùøgèI¤ò/Ù(Æ?ó}‹"™íd&™fÖ0~ó¸†Ky¾ƒä}Ûìº7aîû|%—ºy ‚4þÙ½_¯ì䜽ámSO®Ž-§)¼Š'Ýn«¿sœÛybm9ê^ŠZýúÀç+OéÓ…¡ùw>ŠÂ›·<¸»†¿ÜåÉ_Ö¢ó–‘ìÏ×Â.ÏÐ;iü«FQ·³¶Æ:ŽÃ0\íWka­Ú—dŸÿeµvYF…¶`©O^Å㨭Ga£vWì}Y³¬©Ñê÷ŽCÓ)í¶ÐðÕEkªja%[Î=)7áñABËO†æßú³o¢›t£»î^`Ɉ~š79SoÒÏy°“Ê¿f½ÿ(:î¢z;PR4û͈_¼ÎÁÁ¹ÿV£ãƒ*ËèF•~ËêfàUìF‡b8jïðOÍÞW5óš*,¥É‹xù'-t#|uw£îñö&lªðø×áuø[~ª0Òý7 <û_ŠäZtÎ1Š¢«ôo-¢Q ìøùÆQدÐë2 ÌªÑNdUPeµÇµh³À2ÂpÅÑKÀ«*ŸÀ£±¢²ÙW5‹šXJ—ñòOZèFøê^©±SÚV’¡vÃüwZ~ª0,ÿîþŠ›ë9º­½aÉa÷VŒú.ÌvãÓOÿWY’÷¼Z÷0¬YEßÙ“ŒmÓx2ÞþÏräûèší*ýüÓ;î´ÉbP¥Ú`ôÒV1þ¿ñÒ§ 6ÿNÌQÿØmWQñ|ÔeûwÃ_®úøW‹$/õNÿØÝ”4£cvkêÒ®fô ÿ[Ue[U«ñÿ,G¾®YÓBIãh„§nöe2²i+s«ª]Mê=OÿNòñïÙƒc¶{áÙƒ§ìžJ÷ßD|ü£Ã¾«WÙQï¤ó¯~Ðat\í¨1˜5v #9¨:<¬,õûƒzǺˆÖUÜTó_Ë‘Ÿ²fÍ®”ñŸÜÑðÕ½ôè#–€•hy-ª 7Mÿ Ë¿» y/¥7b5ÿ}p.êxø÷à\# /Ü…;i÷߆º£-±KGIÐä´U™±.ÝmSolÞKï›áR žŒuõó?èÈ{ÿmDÎý×™ÿš\sãTðÕ=¨…t² ¬DË[¦" œÿ2äçß$q;ÞI Ì«8LÝñÇÈ?äßôêFþi ÿJ¨; Ç)½P@þÍDÝÈ¿ÿ˜L¹0þ! ë)ü#¤°þ¯M5b‘Æ¿¢È‡@( ÿe"•Ã&ˆ!€üC” ä¢L ÿeù‡(È?D™@þ!ÊD‘ükÇ0–;Ä"ÿþú×?3<ø«tÀŽÿöü ŠçûÌÎk>âÔBrç›·~ I”‹×®þùêÕ«ß¾}íÚ»o?¸vít{íÚŸžÿýß8þþüOV^{pí£z«U¡hµvV¯äß)åÍ_77«­·Þúü£>úë5‘š‹½ÞϬÿûcïÝåï¾ÛëA·½?=ÿý¿¾÷/ïýëïŸÿ 浕ÖW¬4-qP¯lºüÃèw§ ½ÞêÎGß|³ùú·; ×Dj.þí.¿Ké÷îòîŸß½zõÏË»–Ûçÿõû%~ÿ_Ïmþmo×77úýµÍ•öNŒ× †ãŸ'˜Ef| D¹ØÝ­¬|óÿ÷*„Ü¿¿óHþ,0ßüƒvüó™Zæíå埭ñߣwÞûðÃO>üNÀ÷Þy²Úƒ•íf§Ó9îT«í–§ÿëþñ͵~,²ÈˆÙ!•_ÿÇÿýuu»ÝÞÞ^©ÈŸfçâëü>ûùÝ]†Ÿ——ß…nßg¼ûMô\vö`‡V¶ÒÚ¹OH¯ÞêÇø§$`!Šýƒí°6Üȼ¹Àî.íý~ýëju»RoÕ[Ãô·ßýóíÞµwyGõ%݇nŸøÉ'þæÿ…¿úø¶÷dµ½:£zý€Ò¯ò×^Œ»Q´»«ùG‹E¾'ÄP{?¬µû:Q_Fð9€¿œ´5Z}Äì Çz¿_?bl ÷[­k"5ÿþùîoé‘ÚïÞýtû1eÝ'_wkµèWÏéÞÇ ‹Î¯ÕÛ”îýÊÊg×bó_:þ‹"ñ¹øÇâÄB U£Áêj³CÉ>æþk,ªØ?LG”ŒÖÿyï×ß´io´Jz•ÊPóßß½ý»ÏÕ³¿¿þåm‹Ï?ùé§O¾»Ý°ñ5ݳû?j^o¯ìl¾^aåcüûì³(bÿ(ÿìè>*ÄP-:y&‘Œà Á€Ex_ž)|óo¿ý法6åßêJ…^q‘š¯ÿ{ûwOI>»ûågw~ûŸÐíóŸ(¾Ž¢Úÿü/eâO6ÿX™Vu³^ý–íÅø÷í·ì>ù-ƒÛÿÅB I69¡`<щüÑ}eã7¿®öÙç•j}³]ùv8þÝþù·9KþùÏ[¿£ûÐíûŒÏ)û~zçw~úÉž°2õæj½ÍKÇø÷ùç”bŸs¸ã¿Xˆ!Ýÿ©¿Q<:‘°ù7SàøöóæÎf•ï‰Ô\ü{F;ÀgŒ%ôFü3í ¡Û¿=§Äûâßáøéùß@V{ÀÊÌk³žuZç9Çbü»j{þ 1´½uÛÿxŸƒÙ‡gX‹3ÙÑt(ÿøŽHÍÅ¿þðóÛ·o?øÏ·ÿò—¿ü᥊yÐyÿ‹§¤ü÷/ÞïÀ¼ö€ý¾éY§^}ÃéãßwÿCzÍäÏÝŽONš|G¥æàåÇþù‡«WÿðÇŸþùö^…n¿ûîøý¯ÿÎñõû«0¯=`=Û—ç›ç¾ä}Üdßÿ"ÿæ â>÷]§uü†ï‰Ô\ü»uëéÓ7”„wÏ1<½ÝòÎëWÏ¿þúù¯ÖoQ€¬öÀý­û$Ï'Á1Ë7º§OŸÞâ;"µPýi,ÖÂXî Ôß#ÊòQ&ˆ2üC” ä¢L ÿeù‡(È?D™Èàß:Q 2ù—8zÙ>ì„ÝvDH¯†=nv»Û„Dí.?TÉjK-OjÛüÇGôïv7"‡ƒ0ôÙA-Ü?!¤µÖ ]ŽÙEÕ°[i‡Ý:¬ÿ̆ÚûñâÞ™]B‚{{¯^Â㣀l]ÙÛû~‹&‡’+„ì^ßۻΟ\¼¸!Ó÷L²ÚÒô—G¢JÄþßÁ‹#Q+Ld»lG—`Mb¸|vïÞ†)¤¦ÚÀKïžÙ;z!Šª²N+¤oឨ*êœçt°îNŒÍÁýûƒHn›„TýÝDò°él#ÒªµDɈÿ9¦äjPB5;ì OÚû„P‚õ›Â@—cvQ“Tºô³pQ~¿äÓ+ÉõëôœyL^¼‚ÇÔâìú…Ÿ‘WIå0ð„Ý‹4÷ÊãÇWžÐKöýãÝ'"yQÉjËG—EQ“$üˆ­/QU¤K(R\ül=1…TÃLQRepU6Ö æ[:€'ªŠ:ç9¬;¯`ÇâŸ;ª²J™Ò]¥Û.=^åFÑ¡8TÉjK»¸éGð¯¯Ü†ô '¶µíe Ë1;–Ï>!l¿B¬“9ÚD صÝÇ•éEy•TŽ*.Ì/réHl…ËàâK;™mi÷òRºÓIÒØnyUEº„jÒ½-XH5LµAóOg0ÃÀ*kÅc¢ÀUEóœþM°ÿ‹ä¾ åÖ9„ÛF•gÓ[k¤íê|hãëä¸Ûh‰C«|>¢ÿc_üÞÞ^€ ïÜØ L¦Ì‘†’¦lgO†m6n8Él{öSU³•*Ž'ª §z+¿rñìe› ùçž›¯l¬ž ÿ C8ÿ•ÉjK-ûûüLÚ¡¢\«Õ¶ÿ*p_ÞA¹þ‘—7öön°îíÓ{Á«‡à/ß îmн{ ‡ÒaÞ6¢Û}¢æ…{{büÇfÑ*Ymiñ­W⬒^¾¾ƒ㉪EÀ‰Àó{ü* é†É6˜»¶Ì “׋jþ+˺­¹ÂÐ)ÿ´¨Êèª`*ÓS €îÿ„¶H‹—ŒîH ФöH锘äˆ?ûå2¦@½é5r'©È":Í袈Òf 7Ê3QndY[ÀEv/²×ü»ê'Ñ*ãÖÔä?¨ªZL¬ÛAW&È¿*eS§I6„ì¯jÙUDUFWS™žJê¬ 4%”.Ie(ñÉ|¥S’—ÔÕ>¹“PdiOO¬nGk³˜éY·F•µ\Ìϧ„üp%¦~b­2nMíuV`«ªëËÆã_LÕëÒioWì@Ý…rEéª`*{ù+uVšJ—¤2àËs&VÚ#föXغÚ'-M’Š,UJÔV µ¤gËjÅÖ=B®?Œ©Ÿ@«t àÁ£Î bª‚ÄúrQ÷ß( C¦ªì7Ö,¹U–%µ’:+Í?¨-ÒìbIA‘®f\Š´g“ÃJÇ–6Kz†nãF g’³)U¸’/Oíø·èã¿ÂøW“Ò¥ííŽÕÿQàŸ%µ"Bgeç¿w N öw­”¯ÿÛòtN[±þÏÒfIÏЭ׈¼¼ñòz\ýÄ«â'XBñ/.–Âþo,þµ‡d­Cêlü·©eW‘%ªü³¤VRge ù'µEZ¼¤ÄCJP$óVJŒÿ„ŒI¡âÒtá)6þSÚ,ž$=3(7–‘n¹ñý¸ú‰A¶Êr«øç¨³ÔøÏ¨ªÅñ´kÑ~…,UÜù/UþYR+©³2Ôïm¤¶H‹—´îH Šd¾Ñ)‰K)eLBåÈ”'GmORž‰qcé&ÑW?qˆVYnÿu–l'PU-& 䟅ôç~…¼åŽ~Ù7~¹è©ÃLðoµ›–;ŒÀ¥KG£V¶{v+Û!0-þ…)y$Ü­ñ¹1‚Œid ðÅà €iñðù‡(Óæ_q3ä1ÞH3‰¡ > W°ï$-ôd׃ù72ƒÀè@ªw×s˜/sþù~A ŸP»¾ƒ1ø7ç¯Hæ±ÿóÛ#öEðÏW6d\þÍ/ äß0ú+•ËÄW:²•LLc‘ï äΨ\ÒÂ&bk›ä¾”D½D¶‚-ré,Ïã=©ýÄ ¤[–¼Ê8q_ N÷ Ú"Ég:íl±•¶`Ê/-år‚a±L-)shs‚âø7”þ ³Ò‘ ä6AŒÅ ôêT.)”¥m’ûò•Ø“ ²qD?OŒ3õ²ŒAK·y•v¢^øÅ#HéÀZÄ‘eiŽÉeŠ­K¿t‚aÃŽm^0Qþ®¿:Á¬td+8&&Æ’ÿ×_ÁÞ4Žn@H¡,m“Š{%$Q—Ï+O®3âe/¦ÄRjŸ¸¼ ÏÚ "H©ÀZ”“•XüË[i ³ê’ FÇïR>Ú¼`fôWv0++AŒÅÞÈÒ[©8Ê% l²Þ­Ê?Êòý³GîÙ™†­vº+–Ò[_)ŒÊSÎÿ¥Š­\ ;ÒV,æ¨ÈÄæ3¢¿‚½£Žlu¨ßÌùÄ0„ÜØØ¸nu&@Øä㟒D]yq…\a‘­t¦Êáû¶tËKÁþOÁ1[Xn´‰çgŠ­¬ÒDزƒaYüshó‚Ñ_™\8þ‰ b,rGÿ„r)°„M>þ©qÔÆÅä… •+dSöøÏ’n¹b)WðEH<Ùªr@Pe"^eŠ­ÀIÁñŸ +Ðíb´yÁŒè¯L.ˆl%ýb¬€°ÐVw¾×Ê¥À6ùø§$Q[Á%ÚÑH2pÙ”ýÄ`K·\±—D±[µ'‚ ¬¥ÊA•‰x•)¶'”aN0¬@·Ô dbó€™Ð¿øss>* ²M&K÷Š®Á{R%œiá@þ ‹'»úV]æ_ªþÊŸ›^DcÚ!¢6Žôsçâà=©E †…úD™@þ!ÊDÉü›„¦ ÎvØr#¢Ë)¢äùøÁ¯KÅ||̰Ú:#CKLú¢ûý%×’›,gX$óOÏ€?¦ü!H¶¼­™*–Ï¿ôÝ,d˜Þøq—id4æ†[G—È¥£Ç$àŠéüÚûì`Jú+±¦ !k ö·± 5XD/Õ S#õzج1(dZ J%¼GÖòHꉵž2e‡~múÂLg•dŠÃ U%ÍÜã€XB,+I¸„Y±0\ÀÕÆ rƒ=cþ‘þùá àŸÐ½Åf1ﶬL¯j8{˜šþJ¦.1:.Y,³T!H5éM#Óbj,éܪ#£Ø2¸ñDð *£84ÿÀ›7%™bpCUI3÷8°…X0:W\¸%äU@˜å†á‚®È+¬)ÁËû¿WÔÁW–ØÌëݳªáìajú+iôùsËPÇ~‘KuTñ¦X)±¤L‹»j,åÝæß¡û[â­ë´ŸÚò(£4ÿ¶œŸú*I•ª šãÀb¹Ñ¹\á–Žå"šâ†á‚®è˜ïwuåáåï-õÂÆ³¶ìEŸxÁ,§è®j8{˜ªþŠÞ,{aþs4XŠ?îrƒ®,‹eª%¥w›ÒÞÂîl±@{ý>À?¶•wi%™ÒùŽŠj/~Kˆ£o% ·\‘ÔaWäÊ ÞÿÑ®îÕÿv÷vé?ÇÇ»ã615ý•JîðC[ƒ¥ú?w¹Á؃L £¼ë¬ž·ÿãØs$Kjg×éÿ”dŠï;¡ª”ôÉ9l!ѹ|Â-.Ò2én.èêá "5gÏZ“\B®o°.Лy¼ûW5œ1LKªå|ëûûuWƒ¥–*T©jÂØƒD«±¤waºß–Þ¤bËà }úʨ“´JKŸ¤¦‰AI¦ÜPUÒÌ=l!ŒÎ•$Üén.à걚ÿ Çÿîœe£<[læz·de§’¶þН)ÈÑ`S`Gƒ%ç¿*U-@[c5–ð.LOö¥·Øü÷ò`ï _ÙR¨“´JKŸ”¦‰É‡ªJš¹Ç±„X0:—W¸e§ÇÂpWúùŸpÌìÍäýÞ=âŠÍ\ï–¬ìtòoúáJÎK3ÃWp¾ü›¤bX,ÿr*¶ rjšQú4X(þ!æÈ?D™(Ž•®8V¬ÎªøñÜHEeD,Ù¼+."²ùW‘µM³9—´?œøWðêy®¤ïâÂÒApñÌKo%{7ü¬Ò<ûqtÉy†çf¦a¨çŒÊü«Î¿ s"H>„ìnÅ ÈL6Îæs—‰ÀÚ éù7ÿ„2 ª¤H³ÛݶÅTì™q5ìVÚa·nc©ÇѲtb,[Te‡­b€j(áJšòRþ;cÑâ&|Þ«’Á‚‚ hðéÞÑeúùÁ«<²Ôê ÕYÎÐteœªjÄiÉSñ¯\í–/2â,£ØþÏRIуž#¦bükÒ‘"ýìù•z§J'À²DUNØ*¨†R¯¢”¹|Óbª“˜ Q³ÀË,X4xB^¤)Ë!+ êþë‰SÅ3­@WÆ©ªFžV`7'¡£Ýš+öM˜–þŠqÎRIÕV¹SEâ}Ô³»PÈ#SÚËUyÂVA5”’")3sÇl/n†/ídþ2ß*Êêc)Ë!ËðϧŠgZ®l§9--+0ñ¯íÖiæŸuÄ8WIÙb*™%?1ù•,+ÊÞ‡j(u7Ufg?µœé+·gyÚ¸á$ï¹E%±Ø'&¸r"dVª³œa¬‘:ÑL\ô6-þòO‚÷P%¥ú?ý‡8üSò+Ýÿõµ3o"KTå„­’¸ãÆRf[g_@glüçš°?{ YG¡‚EU”ôÉ!Ëîÿ@ã@¦­—Já_jü+äŸ#•¥’Rã?•I\þ)ùÿ±­*ËU9a« Ê f‘žÿÆLÄü7>þƒEU”ôÉ! Žÿbqª4Õ ^ÊÏ?~.Vü+õ'¦0›ܶ1éç/P%Eš![è(™J~ÕcóßДŽÀ’[KTe‡­b€j(áJ›m½÷QýüÏ5¡à¿’É@̤‹ZTQÒ'_„,Ã?Oœ*M5¨—òóOœ*Œ¥ÿ¸ ³ùÀíôõÏÇàßxX­MÐÙôQ|„¬ÁíåÏ®õÈîµÏ¾ýöƒ«WoÍÿš=çgló…©DÈZÌ$ÿ¶]ó|a*²YüãÿJ¸ÿ"Nˆ2QÿrꯘÙh’ÿ¡L4á¨ä}7.‰Ò©Eh¡øA, •ØQ>¼ËJ¡–©ØZ¨PéTšáŸG7Æ t_N|/éÚÄUxä¬bû¿<ú+±±£eèWméR+‹ÒX®O(M8ª]ã9€ö&µ-ÿÇ HÅw´¹wYB£"s—@dP¾Tü+ÿø{CéÎï¥ÎÉ=ƒ¢$M”#鯈c¢eä”ZYã?e,Ö'”ÙJ´¤Òl{Zˆ*€Nu#CÞe ŠÌ]‘øºdñ/¦¤;7¾—:'÷ ŠŽœUlÿ—_eGË2P½Z†ÔÊêÿ”±XŸP&Zê(U2°ìAªü3I-Tà8çÍcË™]±v,|Åò,o¦N(JË^]±Ø›/)šùõWv´,ùdI­,þ)c±>¡J¼l™¹ýŸ“Z€*pœ‚óQæÞe ‰V‘A÷[Ð÷ž·ÿsucÚüŽ™¹AºRÏ Ë¿üú+;Z–ü²¤Vÿ¤ñküg…£R%hS'¨… @}±€T<9ÿ²„R¨*†ã?àK¥™v$Œÿ¤;7¾—snÖi‰‚Ÿ¿ä×_YѲ Ô!µ²eËÂX®O(­pTÊ0€ö0u‚Z(È¿X@ªžœYB)Ôk1¾Tü+ÓnŒA龜ø^ιY§U$Ê}ÿ6©ß¢o¼JÏ/ükLA1¡c¼¯2OsD”Ê?O¬Ò‘pñ¬ç÷ãV€ç@’À ù7Âí1Z>ö6¦SÏ´$ðšÃ(]¨A” ä¢L”È¿ba¥!iœä¦OdH‹³1•7´Õ–-Mò„¶ÒëY]Š… Te¹Mã&Nt«¸îj $…”r«[hüþ(«Ý•~ù«ôºý»ÞŽÌÉ:¶EDŽ˜*)´ULš me^ˆ:%ë­p¬ilë‹nÓ]©•»˜!¬n¡QÿÜ(VPw û¿C«ÿ#n +1þ â2'[容§ Ç±èW¶4ÉÚJ÷ñ X»6ÿܦ)ÎÀèVqÝL¹ÊöÿÁ(VjlèŒÿb®^Ñùï .s²Ž­5÷1•?´•:¥„¶Rz&§$F©Û4Þ 'ºU\weÖ/tÆ™¬n΂Y€âøçF±‚üÓó_¹À ”fÅ]‘—7äÏ ]™<¶ÖܳÄTI¡­¤Ð)%´•Ò39%4Jœ¦ñV8Ñ­âº+°~¡•«Z/ª›³`V# ØçsŪ8xiµè\ó¡@þÍy«Bá£Ú¢©Är¡@þÍy«BáSJ-šJ, ãßr:r–‰‚¾s„ò/}çƒâøEîå„)À019íò–Ë@Aß9Â`øEQxá®—5È¿EG6ÿZ…óoyùéùîÝ<¼Jòo^Áø§W_øî;—­ƒƒÑùGQ{C/ãz-ì®/ þE¼·sù·¼|þΚ7°vžî­wà _ò”gKaøË³§Ý§Ô¨ûLæ3ˆ É·óݨÁ|“–{ÊË)<{=잣Ÿ7ÆB:’íëmi¤­ ú΢ÿSˆõcñïæò›¨Fé] ŸuÅ¿›ËÇQ'Æ¿§!g ¥È³›tï—§O¹ÉSƒo^X¾IË¿ùEå3È A° Ï–×´*J¢ ¢œrÁ³o.ŸëÒ°ŽäFùºI -EÚjÒ_6"†‰öðÆE™öTP®Ñž…QðïéòӨ㧠åÃ:ïÑX‰g]s —ŸÑò7Ï©|PìKá¡ûL3Y¹PÙÑ—–…tý…"÷™±*úËGÚÿ[n$v–u*4ýßÝ !ë‹"ÃÈ7û!/|áÜrMç3¨ i*ì¹ÖKÕüÌGYHGr£|9~&ýe#b(rü·¬ú¿§’)ýßù%Å–7]«ÿëž”¸»÷¦Îç]×9›`ªwS‚ýŸùtM'±òû¿eœLSèÿèøïË/ßübÆ7£cïü—õrÏÿÌøÐ.0Wû¿¼Ñùœ*ðÛž]ˆÿÌGYHGr£|Ý\zúô‚±šô—ˆ!ãùË$ø·|¾…Œ<úf|Á}þ×UÏÿÎÕ¢Ækþû¦uÏ3/oèíWåó~KeþÑ©vÔ8Ÿÿ‚´ŽäFûº‰ù¯°*è;GÇ??Ôˆ-ÝÐ÷üîüq‚Ë„Š†²`3‰‚¾s„Áüð¯ñÌ“˜ŒÑøwÓÜ´—‘SÀ´ù†î¥õZyÊŽIqypÞÜ´—‘S@aüC rù‡(Åñ/!¼Kd¶¹`ÎÖÝ÷Ø©>@u§ñçSÇlñ/‚½ ^Tã_öã¾°STÃñ¹XfŒô³q6–¶¹ù糈‚P ÿd¼+ÔJþä7»m÷JnX ñ¬·'רr¢`1h#°öŸ^]O»3¥”© ¬ß§w_ÁHZI @þÉxW2¨• y]ýÀ€]XCJóOÅ¢R±(X Ê®ýgÆ œþOú‘ªÀú}zW†%…c "&€‰òÏzp¦â]É V*äKvÝ%X÷tñ¥K‹E&’X,°ÅZûïbÿ¤µŸY¿Jïn™ßäÀYÑKò*<þ‹tP+òÊ~eÀÇ7\ÂÀ1_ÿÄb]4vìY]Ïÿöz|vuj0 c "&€âùGDP«|ýû#Çf¾xÿ'ÿÀXW°ÿS600Önÿˆ\/³ÿ‹-`ˆ˜ŠçŸ j¥B^E`—mcã?6ÿµWàƒëí™%ý;Ö•2‚á¨T`,àNG”R>d¤*°~ŸÞ1ªÏ†ˆ  xþ© V¹æ¿lRj¯À§bQ1˜%ýØëJpT*0p§#J)2RX¿Oï‚UgCÄ0Ý÷oå-ù‘ ÉÔBÒä@"ËNehª©`ºü 3-JEâú}§24ÕT€úD™@þ!ÊÄlé†FàlÝý´4»ø˜3ŒOs.–ZÍ™OÓr3Ê?oÖꬱø¤r<¾˜©>ùÀÖÅS÷noFùç…z:í$m1üËO2 ì†&UöäEBÆÂbôWQ5ìVÚa·NÈá }ÁN¸^!|;g:’\ê¬üj+°² oiŸ¢æ˜ëûË ½f!Ñm Ô«ãÀ:RMTË^þ~´«8¿˜ýUÔ$•.ýPãå`S,V×+`lDuV~µXYÈ·TyYIL‹µ· *yb ·¬;®}ÿUMTË*1ÏéÁ,诘%û¨§ƒbA8¸^¡Àê¬üj+°² ‡o©òºbk±ìŠ/9­Dþ©&êå Ÿ@.*fAý©/±@T–•ÿ§ÎÊV[É·½ìWN%1-_(ÑuEÜ´X›UÕr…Øÿ•¡¿ü«UˆËRH‘!ÕY€?j+À? ¸røÓb}Ù©ö»Aÿ@ùr…8þ+CøÇ‹Ç©ýßhê,•–[mÅ>@q»±À£Åâó_eǪ­ªeâŸ:RMTË^Çù¯Ã¿ÃÃâõW€­FTÛNäßèê,•–[mÅ>@qåð/¦ÅâÏÿ”‘^³˜¶ª–‰º²‰²Yøüo‚üóa¦ô/A¶Iþryß¤ß ÿ2Z¬Ibºü›)ýÕˆÏ:P‹5Idó¯2Aþ!62øWAþ!ŠÄmä_¡ú«ÀÙºûiivñG™oŒ„Q§M™(eö³nÇÿ,›3¡» R92õVùØîô2ÅP°”§?ëË}ˆ²ùç…zîì$ídù—™z«|¥òÂú¿RÔ_òoýÕLè® /Qc~½yrñâ†IR&±¶q3­ÃrÍyµ²a*OÛX ßð"[©d]²R–Îÿ7>{ &•ªþ*£è¯fBwÑõV?~ÿx÷‰IR&nÛ¤™ûÆÎªV¦=q¶Õ@øöÑx‘­”g­C‚ÑôWôLî¼²’JUM”ãë¯fBwÑõV2ìªJR&nÛ¤™:#ל'ˆ©ÌhWä-9?'™þù,´©H°RKû2 äf-|˜Þ®1!•5þƒ‰°RÞ’‹/È 6ÕpÖÔ45ÎútÂ`Ï¿¸þÊ;ÿ C{þ[DÀ« .ª2!¥Ø'&¤âݯ»¬Ÿ[)oÉVp‰v¬[ñµ·^É[°® UF܃ujP†þ¥Lþ¦Û ¦ŠøÇÆ{ÓçVºT …Te ý•}£¸¢*CtuÚýÎPÿ‚(È?D™(‹Óšƒø'ɲªÄIHòìdó–Ó;õ™ºþ%OîåWÉ/âc—j”I­WVž[ûsÛ4žœÇO’óSŠYìÿ^¥¼ˆòRùͽ©™üËsæ"È¿Bú¿ÃAúk vØØGD?{îuB¿öêŠzÌOR©$¥Qö}ÜJå]ârÁ³—”ˆJI­” ÊH­¼²ªdAPpÁ•À*)>–©@º$ÆVµÑˆ²˜LËm9lÄ‚¢Pþ5ê”\²D7õ%u¤µWÍ$íÕE­sÚ5J%kI?'Ê•Ì{E7w^iK%µzâ•ZydU¢Î¸  (¸àŠ€ZÅ2!>–©@¸äÉ2MµQ‹²¸LË´\-ic± (P%SC²Í–5ÚVGZ{Ð]MÓ°-S0Ae•^Ò/åŠçm°¥6´¥^ë’Wj—Uñ?AP0À…ÀŠ$ÆÇÒH—–#ÄK[ÕF-Êât[± (”­†lEl ¬Ôü·†MŸöŠ\f¢+uͤRII£¬ú“GVêHI­” J  d™¸¬*QÐ\bþëå ±øFÚêkQ“iY-ß³± (ëùóä0Wã£ü½t/ÛfÅ¿µµù7-•Õ|ɦròïÉ.¿sŸÆ¿i©¬æK6•3²ÖÆÑ¢?wV(ŒD ÿe¢,þeG‡)þaXj°«`ò3 õ0ÁyFqüI•V¨U(ßaðG&göön°GÆ—å×dN\<óRìX1¼2Zü›éþ¯$UÈtùwãÇ]rçŠx^~çè%ÈÙÝP‡N ¯´úqþ=«ÿN%“Iµ÷d!à¯U– ‰矚Ì^aåYèƒÀäëCe$ªQî} +W›¥ÂaA––k9FŽíüDÒÊà_gsjú+•LI§© ”¤Ê5Äú¿'[¦e*‘ü«•ðJV£Ü«VXMv´YRëML -ÇȱŸHZükLM¥’Ù¶×µ q¨›Î”UY Å?Ú]§Ö–Jß³øÇe /Bt5ºV ÐMv´Y ~—V‚]5@#Çv~"izÿJ¥“Ã04… JRernÿG±ûãôþÅð2æ¶ûÀ4™U¡òTJëå*ÁàÉ)#Çv~"izÿJ¥û¿¾(/ ”¤Ê5xøÇ “gü§ú¿­xÿ§«w´YÄÄïÒÑýŸc·“HZ™÷ßqú¿¡ôW*¹=8$kUÈ $U‰åòï uûé«|ó_YÿÅV®6Kj½ ‰‰¡å9¶óI«Ðûïpú+5ÿm×¢ýŠ*PŽ* „ÄrùwùF°w…ÿòÙ àýÂçúᑬF¹×¼`“m– ‡EXZ®å9¶óI+óþ[Ðóç¢d›Lg>ͶAÄQØý·Œ(WSWem­|˜{ý•ó¥Ê:Å@ý ¢L ÿe¢PþUºQ‘Ó‰Ì1’LÀ}¢‹iOf…ê¯j›©Ó`õ+±ü@=çÈЫ$øÖ¢)í.Hhòo (´ÿ‹H:ÿò4ÐË¿å“2•hʲó#ÿ¦€"û¿ˆ½îÕŠ*2¨R y¾ÿpF(‘֩Ή¸Ê*À?‘¡\ÄÇôTJ‚Z©W¶×õ³aøZi™D³Ì …"¨•/K×c+¬” L›jÔJˆÐÃü¨ÆD¡÷_ÙÿIEÕfƒ}kC^`vm^]ÒÚ!£12\s”U†2Cº qç1=•M Vò¥2¯à¤–I6ˬP(t×"Tõ8 +©KêjäÖò0?ª11Qþ¹ú+É?©¨"övÚ«q×õ?íÔAePV™ñŸÊ.bÎ=z*%š²‚ºˆJ€" H”´ Ð.è®E¨êqVR–,ÔÕI‚ö0?ª11þO*ªHe¿±-Ô èáYzc²—äsøçhÀžÌ.<Ε¸¸hÊö35E`È+Oˆ*§!º'CªÀ€Y¬:èa~TcbüSŠª%GQ¥®Õë@Reú?MÊQVn© áÂã<¦§âØóöPe¹ctZ–à l­µ7!U`ÆLWª…æD@5&¦Á?©¨ª³ñß&°P]Šÿ íÔYѤeÿñ é"ˆ;é©”h µJÿI-“l–µB!ØZ o¶ÂJ¨À€™ÿ Ù•åAVºøÓäiðO*ª–*îüWŒÑØÓ¸;ß‘ÐYѤ iòOfHþÅõTR4‚Z©ù¯ÒFÙE”–I4ËZ¡‡ ro®ÂŠ«À€™®F­„=ÈJ‘Eýþwdl¼š ³Y¸¾³Ð†ò0oñ¯.ž}™m”³píg¡ åaAõW9‘3U¡˜…6”Ô¿ ÊòQ&ŠžŒ8 I5^Ê[8Í.H²8Ý#¹ÑPôó—Qø$]Jó¬ÄÍØÏlüµýðõ‡ë!_“‚¤"ÿ†Ç\õÉü“o¶ŽHÀŸÏÜHà„ø—aÈÂû¿vW¹2°#AŸî]¦Ÿ\È]ÊX,§äò)W‹<ù”?>¤ÝßÓÿ){7äT\÷”`'ÒDUö/Ž8,ÕÔP8ÿd'Tð„<¼H?LËd^|ÞXN¢ÿó¬Ç,ËîÑc¶”{¸"íÝSqÝS‚RZ©ü“ÅÁ)‹–jj(Zº¢HPLÀÄ>{.dxc9 þyVd¯S_ò‚“àÊÃËúU\`ÛÃS1ÝS’RZVÄŠVµxa©¦†©Ì?B˜gò²ÊHbÿⱜøÇÑd±õZî1¹óêÕÜ@Ä”rßÔZ:'W÷”d'ÕXû”%,ÕÔP8ÿû? rRü‹õJŠdñÏÑd‘3^»gÏBJ@{(ˆòêž|vÐÙ÷÷‹–jj(~ü×ë¹ã?+äŸT"©ñ_,–Sâ ,íå+>+±¼þ¹‚(¯îÉg'Ó÷‰«±à”‚Å K55”1ÿµ"AAþI%’$M<–Sâ ü>xã†Ê!>þ¹‚(¯îÉg'Ó…LûÔÅÍ)‹–jj˜¥÷oA¶‰#i²F® 1A,ÿFÓd!ÿf³Ä¿é*‘N·îiV0KüCœ>¬÷×- ÿÓĺ{X ÿ&ð‹Ô%'€Ç…Ó$[1÷ß(¶çç¡®d\}ï¾2ARÃËï÷ön<ôå ÿ¦ŒâùgÁ?¾ÀGÆÕ÷f'ò/—îÑš^žIp…ü›&Šã_´] ÷OÛÄ ƒ2…‡Å"­ý°öÚþE†» Á¿²[Q0¦Ï?©7ˆeçâ_øWöÐ¥hþ•ÝŠ‚Qÿ„Þ*–=4ÿÊžº Á¿²[Q0æŒðþûí‚Cð¯ìVŒ9»ÿÂùÇç Á¿²[Q0æmþž¿|°àü+»cîž¿(Ü^¾ºàü+»cfŸ?onfñï»Eáÿ-6昷óùá_?[Sƒ@ŒŠ,þõ³ßå £#ƒDÁ@þ!ÊD ÿˆâ‘È¿²ÇˆÓ$þ!ÓòQ&bü#øÁOÁ€xÿ·Žüü1ðÜËþ¿?‹ý±àÿ•ý~ûóD™@þ!ʾÿ@L‰ü›ñ§`‚üCLÙü+;ZÀ4¿ÄTÉ¿ ‡‚ü[¸]xðà|-ìžg)ça÷œÈ¦T/©³%¯d>Eã.ÈfÉ,1¼éòqÏ¥òo1ÿnu»O»Ý[ÎG7é‡Rè|táÖՎ柴ÓÙVñˆ¦Þj [”è9-nüwòì›ÿžkDá6•¥;tþ{·!ï¨çCÎ2íåŸÎÖ7㛞î2äßâ!'ÿŠÃï@‹ä¢L”ο0ÌmŠü[<”ο!€ü[< ÿe"™Lð^6ãl”-ÿGLiñO ™±þ¯lý?bâÀø»ˆ2üC”‰ôõˆ"üC” ä¢Ldóï¯{þÅó¿}F÷§ÞDÄ#›×®ýéùßÿãïÏÿtíÚ´[ˆXddó¯÷§ç¿ÿ×÷þ…â½ýýó?õ¦ÞDÄ#ÿžÿ×ï?”øý=†jÙõÑ 2°RƒØþ¸ÓE6ÿ½óÞ‡~òá¿p¾÷Î#žµyÜ Ã¥,ç|Ì—-ÝèÄñ–èÑd0µ«Nn‡a­³Úïo7ÂÆ¶1ßÎ"c|Fá/~Ì;ÈôI ›ï3Þý&z.»À÷YÎI·Ûêïg9/œvùœü³ö—V›Ñ _‰šýf´¢’›eS‰bg…2q›Žvè7!ÿ&lþ=ÿð“O>üÍÿ õñ'lï9Ë9ŽÚÒ¦Z kÕ¾è*ÂF7ì®Èýッ~‰ª°[•}‰9쇦o©ìÓÞ´"‰Áÿ´÷ÃZ[oT!e'·Â§.$>;Q÷°¿£XÓ¯FQ·³Ö`¯'öÀqØ_¢=éI´$ëÝM•»É^qíSž²bµíþjÈ¿I ›SÖ}òu·V‹~õœî}ÌrºÑ¡0©ònƒÓ«½Ã?5¶ß¡‰Mq…«ÑñAUXˆò°ÉKÊkØ*ýÖð¯ VW›f# )»˜=à%J•·K Yï?bwÌxÿ§SZ´Ñ!wŠÄÃÆŠÊm)"¯†!=ÁUV¬žœ„Uäß$£ÿûä§Ÿ>ù:ìvÃÆ×t÷¡úîkÑZUpŽuw¢Ë‹xbW\áZ´Ù?¢€<ìr#é' W6Ù–@•:Ö'V!e§í#XH~Q œ$³H¸ÿöYg­&St _‘ðöÛ´s\bÝ~v;î!òoÈÁ¿Ÿ(¾¦wÿù_ÊÄŸ8ÿtÿçö=f fä­Ou:ðP]Ã6½7V*õÁFRvÚÞÇ?:wh2ösT–BX}º•]ƪ0bã…P$ÕV•M=Ú—fì>¼M9È2ªaXÅ™öDcþÁø÷œ²ï§wÞyç§ŸøüCÿºôŽ´ªz7ó‰5vÏbPýß*,©¯a«ª:ÌU_ÿ·jÛA{SH}ØL¡ÓWÕT⸿†¬‡[¢“ŠF/‘¯†‹Ç¬8æL;a…é½xù7dóïoÏ)ñ¾øßw8~zþ7–³©æ¿M3þƒŸ¦5þ;<¬,±†Ý2õ¡5þÔû|äX‹*Çrü·vØ4YHÙ©-/¯ iš5"EÊ¿úT"ªã¿vÔåwê el'ªVñÝýUùS—ãÈô{È¿I ›¼ÿÅï|ü1§ß_¼ÿÏÒÏÿšÝHÎ[®žÿ¶Ÿ³²{&8´ç¿KÔåA«¡:žíý¨ÛÖUHÙ©-7Õ…4ÿªâI÷Ü·n‘äŒä‘|þg󯣇‘ Îè å#òo’ÈæßƒÎû_ü;% ¥à¿ñ~'‡$¦ô+ÓâJs€lþ}÷Ýñû_ÿãë÷;W¯fû,›«ûÖì1ÃÈÿï¾[ÿÕó¯¿~þ«õ[Ù>ÃpâÍ aw;Û1@ý)¢L ÿeù‡(ü+{iXÄbƒdñ¯ì_Ç# ëî!ò1E@²1 ÿÓ„Ã?ìÿSòQ& ç_4¡†fø±³£hRÕ"Š…$›zC›B"’áy ˆ»‹`š›%Z"f ‚lZø”“y<#ÿÙàd3¿jŠƒm²= ¤7÷èa³n‹¼Hv‘úFmw»BúKa0A8X —hñ¨[]ªêÍÁ \:4åöÃfÿ„¥j‹ÈŠªáRßµDÌÙ"#/Їû¤AIÒl’ö1!ÕAŸT5ÿ´‘Øo’JƒN•þÉ,±CM*Q¥¦7:Ù^Š—óÒÖ Û¢ùÇ]#f#Í?Ôø¯: ü!Ýû„„„Ô¹C?ÿzÜ„Zö …dð>¹Š>Êlx†.ÇL²ø§kÅE"­/œà—…˜8FãŸ,¼­²£Ââ[œâH!` ‰éM«òÛ·ÈHõ ”¥h ¨ù7Ó‹»»uÅAjÿ'>Iý_/Æ¿nÏ.ç…²„ÇØÿÍ>²øwr’Ì¿M:þÛäc®~‡ÝŒï³á\£BÄ\¡»F´­dG§iÿîÃñŸÅ¿ð„[ªr9Æâ#ÛB›±Cpü7bü7X!+lþÛ k+4µ†mB*Ýî6gÄv¦Á„Üù//Àæ¿}—+‹.åäŸj ©ðÚ«Ñ~¿¸ï1>Fâß8˜æýŸºÌD ä¢LLœ8÷@ Ô¿ ÊòQ&ˆ2üC” ä¢L ÿeù‡(È?D™`üÓ¿>ÿî;äbªýŸöˆéû?D™ÀþQ&°ÿC” ìÿeŸ¿ ÊòQ&ˆ21þø*ǵøT1-«æáZÜoŽ«…¹ž.FáŸØ¡}þïÙgY_ k’l=V5ð9T}ÙÍ¥- ;‰?âëwâ_ÁÐXZJj’}~«ƒ0¬ª£ŠlYŸXŒÂ¿ý~/ìõ»ÆÉXü;iìƒ2"ÞKl/õûKí!êËÑÜAvrKI¹í¦ç+¡E^'”"Øß§çÖÞµ¬™xÊó…Qø7¨¯D•ÖÀ |å]NP›pÈÕ¤‰Ä`Ef¶»a[-<¨Wäl/öõYª³þJçÈU U‹×÷ùï”íF¸1¼ ;·AË|v«eì/µI[{±5Ttž»œmlßnKÄË'5o¾0 ÿ:•ã¥Neà¾ò.'Øt"ÞsËŽ"!”£A¿7P Ú+Îx½¨âúÏÕjX¼['·n /vbÿǬ¾»Õ2öƒ£„Ùk/Òþ‹u£2/­ÿ;fýŸE¶zÃ:åùÆ(ü«®tëÝ•ŽøÊ»œ 6‘ˆ€ HâkÔèWlÅA¯³ßü#h’]¼ÖÞŒ7Âá¥üDU’€|v«eìlj×ÛßÙÙ×yiü;hжÀ±è[›ìTóoåxŸ4:MOà+¢ã_©åŒ” 1¹Nˆ,ÞÿEª¼½ð úãó¢ŠË?â&«µù'‹oרÁn„ÃËÜ«‰78Ö`õÄ[‚óƒQJìµï‹ÿÇìÓôžß mEwº+æ¼ç£ð¯E'œpÅ |å]NСGÀD‚ƒ ÿ䃺·˜Ï‹„3þóñϯZèv_;IÆøO}v«ýý±Ïˆ£ÂF|•<üsÆ-ÑûêñßjT'tøí¾ò.'¨M$ø¢„öø¯Þ8¡Õ—.Ô£%îÚõɵ½tÿ¾™ÿºüƒÅ×èÕs!`×p¼CzÕ}âÒB¢Ý1_ÝjÿøO|ìµ;´#ÞîþÉÅ=ç·_•ó_q¶Ýé  -ç#=¦ÿ;ÞZNà+ïr‚ÚD‚/J(M*¨±­¾J¹ð ^q»¶½èÙ¢(a=ÿS·}e‹Wá~Ým„d€]Ce) HÂå½ß=Ð_ÝjûKmRÖ^lP¾­5 ÿx“¼ç·¶†KkêH¬üØ#òùßéäß)GâûÈÚÄ1¹1Û©~ÿH@*ÿ¦¼öâœù7A„ÖÆÁ”×^œ ÿeù‡(È?D™@þ!ÊòQ&ˆ2üC”‰Û6ˆ©b}Ùò1U¬/÷!ˆ©ù‡(È?D™@þ!ÊòQ&ˆ2üC” ä¢L”Á?WŸ®~Y“”?neC‡Ášû_õÌFáŸøÖè)¡ä¨üK7÷ü¼6³ø0 @®Ž…û¿±¾uäBaþÙq¬d((ù“VÙIBƇR†ÕpßüôÖŽU¥_YHq­ÊÉŸ×E‹•% KP!²Xø¡YZ!Ù@þ…qøgÇ1¡ ITd'JZ¡ìŸ-:a¢²]K¨rù£h­V»,šžÈ“dˆ¬ˆ¬°?õA·š…1ŒÃ?;Ž• ¥HÒs‡"^Y¡WlþéÀW2\^%w­A£Ý7ÕÊ2DVÔª‰Ž²ßn,Hœ•YÅ8ücbQxI¸²*>0LâŸ].‡k‰ÀŒQ´lþÉ2DVÔ•áEcÌþ¯—2>”2Léÿœ0yÙ®U ªÿƒõ¥FÑ:¬võý×4…ÈŠ–vØîq·Š?/“ÿñ¿ iÆH"ãC)CQNZj;«Ê²åp-¡ÂKE°¾ô(Z|þ!COÉ2DVD÷éMÞD¾ b,Œ;ÿq¬Ä©ÈPP^!JV#VNYZ±ªTà«Oxx¯k =ÿ…õ¥EÑÒà¡§d"‹îµ:qKäßä1«ïß–ê×Y § ³Ê¿¡á¥æ Ã? /5—Xþ!æÈ?D™@þ!ÊòQ&ˆ2üC” ä¢L ÿeù‡(È?D™@þ!ÊòQ&ˆ2üC” ä¢L ÿeù‡(¥Ä¿Šòÿ„çQ˜iY>¡ãüA’Šú1Q4 ˜e”ÿ*á›ö&vsÀðð/E£ŸLzÉøOI‡hÄiàcñ¯†á_þŠóˆÉÅ¿’±£d”);Ø”ÿʾeª˜SV—*];‰ÂKc“¬5ô‘}3W‰"–L´Û’ñJ9( úV®F ÿ†‰ cGÉ(Sv°);þ•qC”³¿ní&J/Ím²Ý>¡3™YÅÀW–¥ñJ·ÅBÑ·†nÄ‚brñ¯dì(eÊ6Å­Á>¤Œ,gSM»vûšXAøt'3,€‹ŠL&¹µ{"^é¶X( úÖðXPL.þ•Š%¢LÙÁ¦ìøW6ed¹ø.Æ?å%äYÚ't_™âv[lK;â•n‹…HÿMŠþ1tô­á± ˜`ü+;JF™²ƒMÙñ¯b]V=FµÐêÀ/KÕ%èÓ¹™s’ØýŸsÎÐ’X¯t[âö©ü>úÖÐXPLnü'cGÉ(Sv°);þ•ŒG%½Èr2•„wü§¼T»mè3>e¢ÿy_%G¼Òm±&&}+G#¬ê“‹%cGÉ(Sv°);þ•ŒG%瀲œ D%¡]ÃRÊËN´cŽìðY*QDØJ|•ñJµe Ñ·²aW¿ À÷o>`ô­iù7`ô­ü›0úÖˆ@þ!ÊòQ&ÆåŸûò!OÎd&tÃy3åiÖ8MgÂcÒùÍòzDþ-©™ü#qƒ\ßÇP êKaíQ’õŒhìNÿô«¤ãßIc‡4“¬‘3‡Ñø×0€ÙK õPChúòž 7»ü=§#aâ ^à!RŸd)¼¢nu©j4VB­dëšòoþeSÄU²I*/‚Åe•3áņj¼/Ï{¯´Õ_Þ¯ ‡LI×ı<÷´v–ŠÑø×l·›ú“½d P5ÙI¶ØMvÕAŸP¥J˜“‹?ÕÙ9N1)üÄÌcDþ Z$]`d‹²$ìɤ#0²¼ÈW¶lˆ&öc?ÌöʘBlÜo1 ŒÈ?þž?M`ä¾NãXjÚ?‹”eÌ‹Œqeˆ:Ûì­Ÿ¿¸äŸ©œÌFäŸzÓ(0 9G¿YëvÜ—I^/2Æ•-Z9¶_0Àâ’¦Zäß\`œþ]è$‘ójROVïWÁ+RýV?îEĸ²eCýкý¦ÈòoN0Îø/M`ei¸b"¿ã ²ß±â2Ââ’xºZÿÍFÿ2"¤ Œ¼ã¿Á!Õ}slÿ,SãÊ‘ 5£´I–Ѷ©1»‘÷Ùó¿4‘-Ê’¨,EáLAô6îEĸrdCû¦š,7"òùòoÆQäû‰c%w¥øþcN0Wï—â±éóyâ_¸”mƒ˜/Ìÿ‹‡õþºäbšXw‘ˆ)’ ￈iù‡(È?D™@þ!ÊòQ&Ùäzæò1mp²iú!ÿÓ… ›¢ò1]H²Iú!ÿÓÎ?eù‡(È?D™@þ!ÊÄÐú+ǘ$²øWöÿ/ˆGÿˆ‚üC”‰þ!Å#‘e §IüC ¦ ä¢L¼®×‘ˆÒ€üC” ä¢L¼nµˆÒ€üC” ä¢L<ªTˆÒЩ#ÿå¡uòè5Q(ùªe·qJñèõ£N«º„ ¢ Pò½nÕ÷ûMd ¢´v5£èÿ©hâ« endstream endobj 2259 0 obj 22953 endobj 2260 0 obj << /Length 2261 0 R /Filter /FlateDecode >> stream xœÍVÉrÛ8½ó+ú(W90. ãrœQ*‡¤¬Ôâ ¶P“`ÿ}$$‚²4ÇÌh)â5z}Ý€ô„@ñýÎ>xΠ¨‚' 3ˆR'JR9Ii8%h«¸XZ·ŒF©ÓžÀþ ê€Â‡àÛwT*’ö}ã|ró|ÁàIJ¢4ËóÜåÊH˜e6DDR\ܬ+wͨ}ÈÞ:¢ÿyö~FQÈþQxn7ÁÍ}!…ÍÓ<Ès’RJÈCF"–ÛƒMßV·ƒÒ¥ªŸáï×Vv_>ÁGÑõWßaó1x¿q…Ž^ÆQbøádœ§ÅFÓåŽ7kGù,ÅoL¢I†Â¬Èni×^÷´‡e2Ò5=/Òã\yƧÍyû“Á/÷…[Ã’lÑ–qþå”ýaÖÞ4ÒÆ>Öa:‹zP-$9ç8j,žŠùÚÛÙ2; :Qj||]«{ bÎIÆ8š“¿‹ §âȧûà<£!ÏI˜Äyžñ ’0w¦,²yU«ýTà¡è¤¬§Œnî9 ÇËŠ’O-ÅîðÄ9ùÜ5…,‡NÂ-‰Ü«®7°Q•„a,öà}P·oÒD·œ‘sC²’ÉmH&õ£;§µ6p…›4ÃέŒø!{#Í3ryÌ‚çAyHxëýN-4MãÞˆÎ:´×ÚÊB ½ôE½ª”Ý%¢öÀúî½oªü@ʯíYÖ²Æ|¾­z߸yò@)PÚw'¶Í`ΞÅ'„‹Ÿh)¶Hýþ´IRëpaÂÎtò­Öz¤§+=6n•PÞÖ^Õe³¿žê’iÚ´¢–úÚwcvì6X—‡ð> endobj 2261 0 obj 833 endobj 2263 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 378.612 215.3 387.612 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2218 0 R /H /I >> endobj 2265 0 obj << /Type /Annot /Subtype /Link /Rect [ 223.63 378.612 305.84 387.612 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2218 0 R /H /I >> endobj 2266 0 obj << /URI (http://ant.apache.org/manual/install.html#installing) /S /URI >> endobj 2267 0 obj << /Type /Annot /Subtype /Link /Rect [ 101.679 356.826 170.975 365.826 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2266 0 R /H /I >> endobj 2268 0 obj << /Type /Annot /Subtype /Link /Rect [ 182.563 356.826 387.293 365.826 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2266 0 R /H /I >> endobj 2269 0 obj << /URI (http://ant.apache.org/manual) /S /URI >> endobj 2270 0 obj << /Type /Annot /Subtype /Link /Rect [ 446.57 356.826 504.507 365.826 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2269 0 R /H /I >> endobj 2271 0 obj << /Type /Annot /Subtype /Link /Rect [ 516.095 356.826 539.995 365.826 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2269 0 R /H /I >> endobj 2272 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 344.826 172.53 353.826 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2269 0 R /H /I >> endobj 2273 0 obj << /Length 2274 0 R /Filter /FlateDecode >> stream xœÍkoä6î{~…€ûpY Q,ÉÏâp@·Ûmw±½»"9‡¦<¶2ãÄYÛ“dúë”dYãÇt÷Kïö‘ˆ2ER$E‘´?_0âÁßkü%œdÕÅg3ÇHĉÍTÑЋIE 1)ñdˆ(f(Ô¬ÁÖÀŽürQ_x䇋_¤œx4 /ÞŒ¸&s{ñ30B*Â8I#+§,Ž‘… ! ²ŠÜ|¨8y×(ìAz$äýÏ¥w%ŒÿHä‘íÅÛ»‹›÷a¹{]ô„žç1‘˜ žàNî*òëåÛCQæE½%?÷²½ýùù˜¶Ý›ßÈÝÇ‹ïïÌFåJþETùÓɃÀ÷NŸ8¾fçÇYøïS¡ç`†òv„Jc^ó Ã@©Kÿ^U!å,žKéíÏd¾n—2Æ'áqì¨ÿÔËþd­Í ‰¼×÷ãͼKP½‹Âç8·YÛ”%ynJ.ûfì¤i 7ï“)»0¡‘‡á#3¢;Y39±¾p`ŸvOf˜Ö¹ee‘ ³EoMÉ©ð,eÖ[Ì«qOõ©q«ÛVZŒï_evèGÒM¹I[m}ß ˆé¦y–Ô÷—ÿiæPæsýso²å´ìPðë@И\îÒg9BysØ”òZ‰+óq^Ël€¢—ÕÕ‚t#pTâ Kë8tr…žV_Ñ8Èû¶Éd~hÝ%ŽÐ{­MU‡²/ö¥‹ æìFð¥èw#ô]S÷à‚sM N…À¸ ­© psry»+úx’Çnk©p$­è ¥‘(êa”ƒ‚òˆÝêëk‹£,N(Y’ŸÍ=~8ä7ëKAt 2PQ¯ˆ¸i T#¼OkYÒþe'[é®-ºBAG¨ËLà½LŸl5‡~n§(žìáY¶›¦+ú#.e¶ ´àÐe;Ù]9s&8ÈD¥YÖTû²èvÎ¤Ùø@Ò8­}ˆyÌo\ö‡îôá)¥[ÙöîÓtCTXËg}(ÌÔmš—.‰Ñ¥ÌÄ=˜l®«Ä›èÊ"ÜìŽ-5¬lyÿfœèÓRDƒÊ #Q¢6ÛÔëîù4 œÛ$žË´U›{A:Q€{ù[×Týñï”ÒUÇ£¾?æÏ‰^b»kÀ˜]N¬2vÕþ˜…¾ˆ…tO÷—«£Íq®væñ‰8æ’maÐÐ|ˆEÊâI’I]Oò"§6#û|!BMWýfp0¼ˆ{^hʡ˕ E¯&â>a˜ cѱD b<é‡ ŸŠªèS¼ùÆ Ó8ñ‹qsÒn/à'ƒû)2‰O|’²šÒ|x,É–WÓK¼Ä4RE|H™N¦Jœr •ä”ðjÒh‰‡|FÜL eÞŒë€Ë¡~aAìy„³¼Ò™øI_ Ï' \aœQ[9AÌD9™8§DL‹\$nüÓ xï0Ö÷‹>¤E[-Xë˜¢ÆæªVã2ÍžÆEk, of5ìöûæE‡cMë9-ÊtãÈ£Ó0=”¯ýõ&íäÈR϶£ü©é¦·î?“ýwŶ†ð«/Î ˆFæfÖÃêh‡Í¾¨á ;hêèñd4Í‹ŽÚÒiçqkÇ/»"ÛY胙”}à wUnAk' ±;œÅn¼¸K°…­]wÝzäObxÜcˆæ«-{µÐÉLfú©›sÀMtJ5kêgY²Æ0ŒTbŸíX¹€vrDÙ`ÃÃBPWìeÛR¹ƒžûð`‡ú¢h;ŒâÙ.­·Ò‚ß:XÊvzhí°$ȇwÊôŒÌ ‡Ùn\ˆÞl‡¢”«W<ê,Ž&:S|é¸ëU‹²À[XŽGBÙª¡9–jl›HÃĪtœû‹B¸ÃxMÎõ :8»ØrÏ‹îø¦=Ú™ûKHqÓÞ$Iz+ý8|XšÍÙÕaùZt#t”ýý›+ š°¦ë^¶ žœ$ÁÍÐSº9Ì ©«>B¬[GE‡ÆÝ±îÓW:€Cg@:çRCSýNvõªá_ÚAÙdiy7Ù¦iž¾Ä¿@œM/ð*ô&•×ãQÆà÷®ÉÞÍk“ûed$n KO·¸<–„ “£›÷psÆ“Þ÷áBô¡TåbÚûTý€o÷)Ô'Îï@t»ÜäâP³…ØOa¨ ¡f»¶[ª*…»ŒFô•À †1á"C»kÉ?ÀÉ]Ó`bq$oÔsåñe8F6Õ†í„S)Aco`„øç¦O •þÛ-,Š/ 𦬱¯W"{ˆ¾)Ù§mò¢>¦O¥7F-ÿj›G8KóJ^HµX”Ä‘g¹ç<˜ ±%¼ñž7ÜFå£}‘Ó”‚Ù¯‡J‡ìeN‹ÌÐ_ƒœ¥þër£éûq¼€¿ëûý777paÐTmŒ6ívZ”°ŸPMHÄosE‡Œ‚€ôâ³zž¢™¬…| È£pØ£6ó•ëËPv/J’NÀ¹eê*Ör(½õ¤uϱ!ëÓØÇF_#$IäƒþW-cž  QCŸ]7³:ƒ ƒf½f ~S¥õ!-o ­ºë«ò/…ÕÊT­ ªí›³|aGS—,†R‹CˆÄqö±O·® è”Úý9ïÀ¤0ˆÀ.‘à_åH–€[LÌ×é iXú“RЄ€Ïc(^ÀÁ¼è«C\ƒk „[%X`|n„t€?‹óë¦.áû>õ’Àó_Ô¸ÄÂ!Ä)æ¢×ÌÖû¡sİjFaêè娀CÅæØ”¼Wu‡ ¾:M®ƒºqU6²/Ó€êÜäƒ@Ì=æA­=y›Ø}.ó¹XÏ^G>4ŠB݉Ò™~£âtÕÐT9º›Wƒ®ô §›§†¿ûaˆ8Úõ¨K)MK‰w5’Óï)­õì5ÔÇ@ø|a7šþzþšç–— —•RåÜçå"¢Þà" rO«•—¬¯vÔZ©ªM7lÿP:ŸÁaªÄ9}]›¼Vå9oÁd•JyÕ[ “A)û­‰ $´µècÚ®—Cbi¡õo•Ýõ¤ÂváF’´ÄwGb½Ì!S…ŒO%‡ø:ДŒXD®Z2°ƒ5çù6ô9[^GÔÛÇ2ËoloÑ£ØXŒð­oAQR`ú¬âZB}lûÄ „tgh+^3 ô}¸{õó¡ÉåL鎙C£$§4mïjHÚ'-,Ã#¡,œð°S§ ½%y c‡› â`tvá/Ç´gLø)—ì|EônDTÆTþÝ:5ù‘¡ž™°äpÍ4µÊD°?dª35щm3&dZ”ù¬.z–˜b„`›åÚgߣÁêÒWÜtäÙdR^tp}u({ƒH¸OÛ­ì»+¢{ix½`-ÜöûòHÒŽdMUa Ù¬h·‡ ªø*^Ñ’i<ÃuVr9KÑ|ÂÄOáF– œ·"Ð×-¡³Ñ‹q è(X ñ%a,>G€Œý$wS¨š(öÌ-/_A½Eýh?:ÙÚ ýSÑ!Ú7Ê×*Š/Ú£)XCѯÕ{¡>ÜÚ}ÓÉn€óâán!°(J1¯JÈË .€º&º…¥L§ïãPÜ"˜Bá’Ã^±ºÉÊ´CÖc7I]7àhª—$§ßX÷0„è  „Ãýt° Á $heÕ> endobj 2274 0 obj 3181 endobj 2276 0 obj << /URI (http://www.junit.org) /S /URI >> endobj 2277 0 obj << /Type /Annot /Subtype /Link /Rect [ 453.456 540.06 540.002 549.06 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2276 0 R /H /I >> endobj 2279 0 obj << /Length 2280 0 R /Filter /FlateDecode >> stream xœÍËrÜ6ò®¯ÀQ®’ ‚oúfÇvbí¦R‰U»‡(µE‘ 9&9+_¿ÝhHÎdrÉ®5èÐÝhý¿\ æÁß[üI2Ÿ»«/'Xâ³ Ö¨(f"á±—²Ó@¥¬ÆN‡èf °z4[öï«æÊcß_ýú *™Ç#v¼òç̂«Ÿyó N³,Ó²ú\¤)²x bÇî>î|ö®U£Gé‘÷?—Þ–(þÿD{¾zûpu÷!bÂcs@ÏQìyž–òÀÏðÏvì×ë·‡ª.«æ™ýð²—ݧŸÿÉîó®õ{¸¿zÿ ª¨¨£äÿ„«óätD¡çöXgmÂ,üy@8Àp?‚aW­·WÿbÇØŒ”ºè÷¤z4)kò|³”ÞþNæ§÷%Á‰Â㩳#~šYêwOÙ߬µÅF"ïÓëñ§k۩˧]ÕЊÌÊãÅСe¯Ø­êÈØõžJ έv¿ËëÚ‚?ç Û|°öû¶z E¢Ü}ˆçâû> (̲4IâUÍí¾k Ù÷ãüÅòý8ੈ<ÏÃÅ|K€"òº}îoœÛR7²¶Ò^Vwh¼¥Ö˜Öî/Ú¦‘ÅàÚ¥Ú}o&Øtï?Éî«ìz>›ã±Ðç¾H@-Í€=Ú¶^Òž„-¥Ô38lÕ ;n«bË@à!¯šžµMýÂ`µìÓ—ú±¢Îû^®È‡\x`ÇüT}Îçƒ@ˆÅ¨óæ…íÚN²!ïž%œ…Úù×¼ªó§ZröË¡aã¦fËC‘qÏãúÉ’vÞ ìvæDDÜ ÌËÉ,oÊ3ŒÓ‡ì“W…Œå·} *ü<Ùë ‚ä•¥ŽÓˆgYèyA OœŒwoY‘7ìIªÝXÕ0TiÑ&ª¶aí† Ç–Ýÿòž=^߃nQ©Cµ“ì}óµêÚf'›áñÃã{µôRÁÛ»©jÉúêµMxÍ6 €K©Dzƒ'/~ÏŸåÍ„ —Eí~ÛT¤N`Ù›ºÍËÕõ|>4Õ` eÖ©½éÚÝlÙÖÁ@Äk‹==-à1˜sÄÉ_š†§}¡X›¶†ýë»»ãñÈÕjxÛ=/Ï@šÍ¦áÚƒ3­Tð¤trÒ‰E܇Zå KBwuõtÚÎf禲²ê Ch»—éGóÜWå9D¶G8+ÔЈÔòü?zŽÄ˜ @È¥ïa9j‡ÿQí™>wËŸD)‚p_‘ú¸ÁK)ü £Ž¨4tÌ)˜0Úöip !5¬£= m«ç­BÚýÄênŒè¼·€Œi/K Ci®Jùtx~ÖI›Æ=BªißÚöùN:‹{q†æ¶ðG{ä.ÿÝA KµúÁL­ð–‡BøeÕ]Y*Fï¯n˜"˜SèÞ€Tg2‘bQf‰.Êrà Eorú<%1÷±Ž•%É <hhÌ5 Ú´uÝ]VE»Ûé`~Ea×:‰Ó)ŽCô™xÇ+˾S‡ötLûçf[Lœ[ÈûCo+L7þLän!VáTZ¿d !Âr?E0uI¹-ŽW&ªÃ“£÷)*س\)–N°Š=ÕI¦:ØX;ë?áà÷ ¸]÷N¸EõfÑB‘©µhÔÌ¥y‘éÅñ¾?ã1¡\O°&‡QÁ¦ŒòÂs— ¤=Ñ‚?ããÈd:´?p†¢FÙˆKTã_³0\5ÊñN+ÒØ6ߟ¹t—x'G;5WÎï9Æ¡ça%ù/Õ an‰–•ãÀqM·ÂÃ̲L„€hȾô“›¦º?Ônìi›ìtõPwïɾOˆ1¤÷fé÷iª0½Îp°Waê{ßç7³`S]Òˆªw…Z±Gp|\züõ¨uÈVý¹Ö³ˆ9§I¤§¼ÿ–ïö`lÞrÕÝJ­ž©)ó®d?¨Ú©Ê«ØùÍhÏ¥ÐK!\ò²L¬¥Ðƒø„úÇÛ`¡è†Y4Ô!wà nL³r Àš<>좒QZw— ¤ Ђ?ããÈd:´p†¢FÙˆKT$Ðjš«A9FiE{Ãæû3—î£ähG£æÊ9c”Báë¹'À,£D°3ö( R|S–ϕǀ ;9lÛ’Úy}$k”h›¡Û9ýP)+™^h’)òÅô?FL®)Wzö*HóeÆ\G×`|ö²¨6Õ8P•ðwÐ4îßüëÍ~øéÇ÷JóÚ¶|Ƽ٢¿BÔo=ÒÜ}e3Ua Ì ³4Ž’Ù#hJRoi°Èsæƒv4ŠgίX˜¢ÑÓƒìsojCLN±?*#¡&…ˆêÍE¥7³rB(kOM­nôN@{Dm”OÀGÃu—¿¬I°oû^¿BÕw&†½5í_äе]Þôuñíb£"ˆ ]uáã9L"¦·S3/¶•ü*M×¶RÅx‚ô{FDeýg,Å+ F}ÍP:3FKMØ4)•è_OˆU§0A´Hjßåem@¥{jÒÁ¦¶V=¤zjÓ¦ 1’ŽƒŒk4>“‹–;ÿÌtéGs]jÅS™?ã¡yÕP€~n$@ùXÎvÎtŒO³=A;=¢(̘^š!‡TÕD'!â)äN‡„´_bc3Å„âÐA°R¼8H±^KQ£ ™éâÎ ‚×O—ó‹_ˆtÉlⱑùçf )Ã(´u*œÉñã.â»K’™({¿`Üx¾{Ͼ#ç6fZ¸úUw>>¸Ó‹•¢èƒ9_ 2Ûùލ©z6"T)‚óÎîÅGâºÒï„êd^¾X°~ç @»en¡ÀZ;$+›[3Ÿ\ËofßÉ[ëë˜Q¨_‹,ÄÇá}ü¸N=Ä®|cÎtgyø8ÂohÔʨi„Ð][Ó&•ö¬]ê;jÂÎÞ8ƒZõ) Á£ÿ!hò¯*_@Í7ô?ÑW(T›™´¹.·®H¥kÂ7ÖDÌ2:ùåQWyã|"ü_€hÊ3 endstream endobj 2278 0 obj [ 2277 0 R ] endobj 2275 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2278 0 R /Contents 2279 0 R >> endobj 2280 0 obj 3371 endobj 2282 0 obj << /Length 2283 0 R /Filter /FlateDecode >> stream xœÍXKsÜ6 ¾ï¯à¤‡Ø™˜¦(ê5=åݸ=4cO;8íŠòª–ĵ¤µã_P¤DRÒ:›Òæ1& ø!ß­Að Ä~'I¢±Rìű áã› ¬(z+zë½tDþsô6"ߣÿDݬ^_­ÎßÈ#è*7%yBBˆçG(Æ>M䊮*ôùäõ¾(³¢¾A¿<îxsùé7t‘6íétu±zw¥_´÷Ò—…îëÉy0â>±jmÔ-ügØW:Ð`ÀÉG¥>^ýS>–AŸ.õó`z´+kóô°ú¼ýÈà‡Ï%’=‚cçDhB¬ô»Uöƒ³6;HûðûYu=Š=:EgAŒ#tÒnž̌œMÛ±Ù×Fè¶Üš4+-¹KÛ[#]ŸˆÆH¯êÎ6lnxw}j4kž‹ÆrµÕ®(eýª´¶06¼÷–}ÞˆêÊVì›%gEÃ7h ÞZÎ-WüA³•?J& ÔNó¢/Ý6íP ðÛßy±A€v½OQˆ®%˜–÷Ë¢íx†ŠI€kÙáøkUö^®O±ŠJTY/ =ÔÜÀyúÈ‹'çÉE~’Ä4Tx~iïÊlÞˆŒ_>ÝfË›ÁÝÍrID Èȇøžraï•Ù€Kí¸LÇU'Di ã²Jëô†bVä9o¸:ø^sÏ›¶õ(‹|\öésd½¸dx”>iYЇv ŠªãbdÑA‘‹ftvîq8IÒÅÛ_[ ¨3ÒPÔ²O”Z¶¢âÝVÕ®Ò”Å-…t\í ÎÆø©Çå›qµÞ[ÌòA4·&¬ªëòqTãJ5ÄO'W‰2¹[ßcÚŸàÆy-LØMÃÓŽ[ˆ;ÞT<+@9K`O(öÝ޲ϿvMª:ÏöyÔÃ$•'d{ßö­±k(ƒÇ¡«$ϨÎBÉeIèÛÈÊ£¨ïä°å»´İôC¹ e²ˆù˜I  a¼Ü/1Áž$¦4k¨™H ¦¬•¬S¯%Õ jš¥LÐKÛ¿$¾ÖvRUPº–æY~ÓÝ®»¦Pg6(™r!ú‚[z‡u)6·í<=A0IOOа²¾S"%¨bÒBŽ£¤ÛRo2K8¬®ØìËÔzl±‰R¨ ªµ­½B±¯¶ŠÖô.8ò´sÙ3QóCøÊÒÑ.c±Þ#ãyQÛ/<ÜF/-û:s‚̳F“l·ûµu¯éò=A#MxßK|D0v2⫽ᆭÕŠÿ5¦ ‚®Õ¾Dõå<í@ ƈà„y^$ç”$¢KPyADJBˆErFfX‘w9 1gL:Ò¢ŸsX˜±”â°»DÆÓ8/ —ädl}º.‡éénå„Lü˜bÂàFud??¶âÈðÒ¸§ÿ6ëA…zìŽ)¼÷ ‰£8"Ò>Jtˆ!ê¨àLck4ãqØ'0EõMvF”8KÈ8¿&h:îPhâ^æëzGúÆsª¦@ÕÔ‡B ƒÄXŸŸÿTäÐ~èâÕ¯è|SH1ƒqL'!${r`h«Ú‹_Kv|ùl«&®,íÒuÚòg×§?ÏBŽB‰^ÔAÂËv~Wú>9ÀÚ£‘eübnÓèr6l¨pã}RßOröâ|nCò :„‰ªU-. ±lz>StÇУ“­š&ç ŠdA„ýП4ðßò«J47XqÞwE‰RÇèÌ"Äå^„ÉþCï$‰éÅSctò?×Oëv”:Ë ˜é¦I«Q>]”ÔÏ^óM›}£?•<ÎJ£æZÏ`Jr‡ Q­fÏdž·jäT°ßÃy_ð >ª‡|$Ó|0 Dâ$ñ¢…Ì|#™²Jovó8ãR–ÐÉ™¬~B+Ó5/Kx+8Ö­ºáPµoáS&9uÔyþA|«Ñ ‰Â œ$ÃèÒÓ>»\ÊÔ‰…¯Þ#X2ðÇ食 ½{ò—+‘C“ÒŠºc‹¥R=oyêÛΑài°YŒ`iR[À²ˆY}M‚3ÇtðlQThîq²0}iÕÞcHlj¬T&ðlùÁ$žŒ*‡æ± Œ1cÊŽÇ‚¾p⊑<= …DþŠfqnûýßnÐ8ާcËÂ8²`žgÀÓ¿¬ÿ>}úÍ endstream endobj 2281 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2282 0 R >> endobj 2283 0 obj 1862 endobj 2286 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 680.124 272.864 689.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2285 0 R /H /I >> endobj 2288 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.266 680.124 539.39 689.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2285 0 R /H /I >> endobj 2290 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 668.124 271.781 677.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2289 0 R /H /I >> endobj 2291 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.262 668.124 539.389 677.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2289 0 R /H /I >> endobj 2293 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 656.124 358.827 665.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2292 0 R /H /I >> endobj 2294 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.28 656.124 539.159 665.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2292 0 R /H /I >> endobj 2295 0 obj << /Type /Action /S /GoTo /D [1578 0 R /XYZ 72.0 720.0 null] >> endobj 2296 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 644.124 464.138 653.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2295 0 R /H /I >> endobj 2297 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.523 644.124 539.1 653.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2295 0 R /H /I >> endobj 2298 0 obj << /Type /Action /S /GoTo /D [1578 0 R /XYZ 72.0 457.4 null] >> endobj 2299 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 632.124 368.775 641.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2298 0 R /H /I >> endobj 2300 0 obj << /Type /Annot /Subtype /Link /Rect [ 531.483 632.124 539.333 641.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2298 0 R /H /I >> endobj 2301 0 obj << /Type /Action /S /GoTo /D [1218 0 R /XYZ 72.0 506.744 null] >> endobj 2302 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 620.124 217.926 629.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2301 0 R /H /I >> endobj 2303 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.527 620.124 539.809 629.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2301 0 R /H /I >> endobj 2304 0 obj << /Type /Action /S /GoTo /D [1218 0 R /XYZ 72.0 178.032 null] >> endobj 2305 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 608.124 253.57 617.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2304 0 R /H /I >> endobj 2306 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.582 608.124 539.762 617.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2304 0 R /H /I >> endobj 2307 0 obj << /Type /Action /S /GoTo /D [278 0 R /XYZ 72.0 553.728 null] >> endobj 2308 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 596.124 231.707 605.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2307 0 R /H /I >> endobj 2309 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.564 596.124 539.806 605.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2307 0 R /H /I >> endobj 2310 0 obj << /Type /Action /S /GoTo /D [281 0 R /XYZ 72.0 720.0 null] >> endobj 2311 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 584.124 153.92 593.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2310 0 R /H /I >> endobj 2312 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.39 584.124 539.855 593.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2310 0 R /H /I >> endobj 2313 0 obj << /Type /Action /S /GoTo /D [281 0 R /XYZ 72.0 145.885 null] >> endobj 2314 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 572.124 126.653 581.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2313 0 R /H /I >> endobj 2315 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.359 572.124 539.902 581.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2313 0 R /H /I >> endobj 2316 0 obj << /Type /Action /S /GoTo /D [284 0 R /XYZ 72.0 395.971 null] >> endobj 2317 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 560.124 215.199 569.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2316 0 R /H /I >> endobj 2318 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.517 560.124 539.806 569.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2316 0 R /H /I >> endobj 2319 0 obj << /Type /Action /S /GoTo /D [284 0 R /XYZ 72.0 183.132 null] >> endobj 2320 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 548.124 211.352 557.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2319 0 R /H /I >> endobj 2321 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.506 548.124 539.806 557.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2319 0 R /H /I >> endobj 2322 0 obj << /Type /Action /S /GoTo /D [287 0 R /XYZ 72.0 482.742 null] >> endobj 2323 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 536.124 200.883 545.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2322 0 R /H /I >> endobj 2324 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.429 536.124 539.759 545.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2322 0 R /H /I >> endobj 2325 0 obj << /Type /Action /S /GoTo /D [296 0 R /XYZ 72.0 672.0 null] >> endobj 2326 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 524.124 292.362 533.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2325 0 R /H /I >> endobj 2327 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.463 524.124 539.532 533.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2325 0 R /H /I >> endobj 2328 0 obj << /Type /Action /S /GoTo /D [296 0 R /XYZ 72.0 589.617 null] >> endobj 2329 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 512.124 328.648 521.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2328 0 R /H /I >> endobj 2330 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.566 512.124 539.531 521.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2328 0 R /H /I >> endobj 2331 0 obj << /Type /Action /S /GoTo /D [296 0 R /XYZ 72.0 390.312 null] >> endobj 2332 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 500.124 228.62 509.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2331 0 R /H /I >> endobj 2333 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.369 500.124 539.62 509.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2331 0 R /H /I >> endobj 2334 0 obj << /Type /Action /S /GoTo /D [1016 0 R /XYZ 72.0 603.628 null] >> endobj 2335 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 488.124 339.338 497.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2334 0 R /H /I >> endobj 2336 0 obj << /Type /Annot /Subtype /Link /Rect [ 526.64 488.124 539.574 497.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2334 0 R /H /I >> endobj 2337 0 obj << /Type /Action /S /GoTo /D [1321 0 R /XYZ 72.0 270.864 null] >> endobj 2338 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 476.124 276.011 485.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2337 0 R /H /I >> endobj 2339 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.617 476.124 539.732 485.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2337 0 R /H /I >> endobj 2340 0 obj << /Type /Action /S /GoTo /D [1327 0 R /XYZ 72.0 227.896 null] >> endobj 2341 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 464.124 197.005 473.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2340 0 R /H /I >> endobj 2342 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.521 464.124 539.862 473.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2340 0 R /H /I >> endobj 2343 0 obj << /Type /Action /S /GoTo /D [1330 0 R /XYZ 72.0 720.0 null] >> endobj 2344 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 452.124 232.087 461.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2343 0 R /H /I >> endobj 2345 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.555 452.124 539.796 461.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2343 0 R /H /I >> endobj 2346 0 obj << /Type /Action /S /GoTo /D [1330 0 R /XYZ 72.0 562.419 null] >> endobj 2347 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 440.124 242.488 449.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2346 0 R /H /I >> endobj 2348 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.583 440.124 539.794 449.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2346 0 R /H /I >> endobj 2349 0 obj << /Type /Action /S /GoTo /D [1392 0 R /XYZ 72.0 674.426 null] >> endobj 2350 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 428.124 341.95 437.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2349 0 R /H /I >> endobj 2351 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.681 428.124 539.608 437.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2349 0 R /H /I >> endobj 2352 0 obj << /Type /Action /S /GoTo /D [1908 0 R /XYZ 72.0 605.314 null] >> endobj 2353 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 416.124 286.161 425.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2352 0 R /H /I >> endobj 2354 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.677 416.124 539.763 425.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2352 0 R /H /I >> endobj 2355 0 obj << /Type /Action /S /GoTo /D [1908 0 R /XYZ 72.0 469.926 null] >> endobj 2356 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 404.124 264.56 413.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2355 0 R /H /I >> endobj 2357 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.583 404.124 539.731 413.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2355 0 R /H /I >> endobj 2358 0 obj << /Type /Action /S /GoTo /D [1908 0 R /XYZ 72.0 300.21 null] >> endobj 2359 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 392.124 294.555 401.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2358 0 R /H /I >> endobj 2360 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.605 392.124 539.667 401.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2358 0 R /H /I >> endobj 2361 0 obj << /Type /Action /S /GoTo /D [1872 0 R /XYZ 72.0 124.773 null] >> endobj 2362 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 380.124 305.913 389.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2361 0 R /H /I >> endobj 2363 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.64 380.124 539.67 389.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2361 0 R /H /I >> endobj 2364 0 obj << /Type /Action /S /GoTo /D [1893 0 R /XYZ 72.0 285.9 null] >> endobj 2365 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 368.124 240.73 377.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2364 0 R /H /I >> endobj 2366 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.546 368.124 539.762 377.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2364 0 R /H /I >> endobj 2368 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 356.124 198.383 365.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2367 0 R /H /I >> endobj 2369 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.525 356.124 539.862 365.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2367 0 R /H /I >> endobj 2370 0 obj << /Type /Action /S /GoTo /D [1977 0 R /XYZ 72.0 598.96 null] >> endobj 2371 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 344.124 276.011 353.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2370 0 R /H /I >> endobj 2372 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.617 344.124 539.732 353.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2370 0 R /H /I >> endobj 2374 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 332.124 186.503 341.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2373 0 R /H /I >> endobj 2375 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.523 332.124 539.894 341.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2373 0 R /H /I >> endobj 2376 0 obj << /Type /Action /S /GoTo /D [2155 0 R /XYZ 72.0 136.809 null] >> endobj 2377 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 320.124 270.081 329.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2376 0 R /H /I >> endobj 2378 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.695 320.124 539.827 329.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2376 0 R /H /I >> endobj 2379 0 obj << /Type /Action /S /GoTo /D [2161 0 R /XYZ 72.0 585.554 null] >> endobj 2380 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 308.124 234.913 317.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2379 0 R /H /I >> endobj 2381 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.595 308.124 539.828 317.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2379 0 R /H /I >> endobj 2382 0 obj << /Type /Action /S /GoTo /D [2161 0 R /XYZ 72.0 527.863 null] >> endobj 2383 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 296.124 249.19 305.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2382 0 R /H /I >> endobj 2384 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.636 296.124 539.828 305.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2382 0 R /H /I >> endobj 2385 0 obj << /Type /Action /S /GoTo /D [2161 0 R /XYZ 72.0 402.972 null] >> endobj 2386 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 284.124 248.636 293.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2385 0 R /H /I >> endobj 2387 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.635 284.124 539.829 293.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2385 0 R /H /I >> endobj 2388 0 obj << /Type /Action /S /GoTo /D [2161 0 R /XYZ 72.0 248.335 null] >> endobj 2389 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 272.124 301.912 281.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2388 0 R /H /I >> endobj 2390 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.691 272.124 539.732 281.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2388 0 R /H /I >> endobj 2391 0 obj << /Type /Action /S /GoTo /D [2161 0 R /XYZ 72.0 171.444 null] >> endobj 2392 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 260.124 305.981 269.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2391 0 R /H /I >> endobj 2393 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.736 260.124 539.766 269.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2391 0 R /H /I >> endobj 2394 0 obj << /Type /Action /S /GoTo /D [2173 0 R /XYZ 72.0 530.092 null] >> endobj 2395 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 248.124 223.919 257.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2394 0 R /H /I >> endobj 2396 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.562 248.124 539.826 257.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2394 0 R /H /I >> endobj 2397 0 obj << /Type /Action /S /GoTo /D [2173 0 R /XYZ 72.0 441.36 null] >> endobj 2398 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 236.124 243.139 245.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2397 0 R /H /I >> endobj 2399 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.617 236.124 539.826 245.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2397 0 R /H /I >> endobj 2400 0 obj << /Type /Action /S /GoTo /D [2173 0 R /XYZ 72.0 278.228 null] >> endobj 2401 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 224.124 242.586 233.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2400 0 R /H /I >> endobj 2402 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.617 224.124 539.828 233.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2400 0 R /H /I >> endobj 2403 0 obj << /Type /Action /S /GoTo /D [2173 0 R /XYZ 72.0 117.496 null] >> endobj 2404 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 212.124 295.912 221.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2403 0 R /H /I >> endobj 2405 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.673 212.124 539.731 221.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2403 0 R /H /I >> endobj 2406 0 obj << /Type /Action /S /GoTo /D [2192 0 R /XYZ 72.0 689.7 null] >> endobj 2407 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 200.124 299.964 209.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2406 0 R /H /I >> endobj 2408 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.718 200.124 539.765 209.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2406 0 R /H /I >> endobj 2409 0 obj << /Type /Action /S /GoTo /D [2275 0 R /XYZ 72.0 346.536 null] >> endobj 2410 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 188.124 277.444 197.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2409 0 R /H /I >> endobj 2411 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.589 188.124 539.7 197.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2409 0 R /H /I >> endobj 2412 0 obj << /Type /Action /S /GoTo /D [2281 0 R /XYZ 72.0 548.9 null] >> endobj 2413 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 176.124 292.873 185.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2412 0 R /H /I >> endobj 2414 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.664 176.124 539.731 185.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2412 0 R /H /I >> endobj 2415 0 obj << /Type /Action /S /GoTo /D [2281 0 R /XYZ 72.0 315.575 null] >> endobj 2416 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 164.124 254.697 173.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2415 0 R /H /I >> endobj 2417 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.651 164.124 539.827 173.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2415 0 R /H /I >> endobj 2418 0 obj << /Type /Action /S /GoTo /D [2281 0 R /XYZ 72.0 223.85 null] >> endobj 2419 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 152.124 268.753 161.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2420 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.66 152.124 539.796 161.124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2421 0 obj << /Length 2422 0 R /Filter /FlateDecode >> stream xœÍÝos¹‘çñçó*øì´ç^™ zƳþs³ç°g¼qû GjY”ùè)}¿úøBéÿù«úŠ$—ÿ/^Q¼¦i>ÕËøÿ¶›ôÏ>ašžæÉ¯ÅçÇ—GÇu'ÇÇÆ#»bãÉãS7'‰ÓÿÆ'ÎÚüÎŽÿûÅïäô¥ž ¾ü¹Îoñ¿òÉÓÕŸ¿úú‡¯þù_ì*§«Þ.ÿŠZÙµ’RÊ¥ŒOízñø¿rõÃû«õ·ëëú«~÷Õ·?¬~/þ‹x+ÏxîÏß–ÄoLéñ}<ûî¦q;}SÇïé»ë‡Ç«»·WßþmÿþÃÍááø nüdÒ•´]K5~6ý86ïòî꟮~QûN¯^ýnÿÓ~9z}÷æ°=Þ=ýÌííáõãö'ß=us÷z³¾{øë“£ï÷?î/÷ó‹t»^Žk^¿Þeðj˜î’ŽŸ—fCÃÆOY²»VYÛ]¦ÇïI JW”v’.¥ ¥;IKFiEid©ÈR‘¥"KE–†, Y²¬È²"ËŠ,²lȲ!ˆ,;²ìȲ#KG–Ž,XJ"–’ˆ¥$b)‰XŽ3”&–’‰¥b)…XJA–‚,Y ²d©ÈR‘¥"KC–†, YVdY‘eE–Y6dÙeC–YvdÙ‘¥#KG–Ž,Xj"–šˆ¥&b©™Xj&–š‰¥b©…Xj!–Z¥ KA–‚,Y*²TdiÈÒê.õ(u´ô§¼jƒ©š{.d‚­µìÆë‹²ÊÆ0»H§«1©¹,5”s©¡=+5´g¥†ö¤šÐ.K Ÿ\J íy©a¾{|ü°m–Æz×zNÉz]¿ÞeðªfPv^{JE VwÙÔ½·¾¶:i'Ÿ Y6”î$=N>IZQº‘ô8ù$iAid)ÈR‘¥"KE–†, Y²¬È²"ËŠ,+²lȲ!ˆ,;²ìȲ#KG–Ž,Y:±”D,%KIÄR2±”L,%K)ÄR ±”B,¥ KA–‚,Y*²Td©ÈÒ¥!KC–†,+²¬È²"ˆ,²lȲ#ËŽ,;²ìÈÒ‘¥#K'–šˆ¥&b©‰Xj&–š‰¥fb©™Xj!–Zˆ¥d)ÈR¥ KE–Š,Y*²4d…‰fÇRÁË'ÈÇÂĘ”¿‰dX&ÔÇ,>Ëzغ0Qóª0!³01~Ú})LÎ…‰ãѱöpþÌçÂÄú“§ÂÄñàsaâxøpxýñþɧ¿ÿþ»åà¼@âx´¿}óäS§‚ÆiÔ,h<¬ÎÄë®)Š[·õ7ºŒ^ ?¶:À´¢aãݺ%Iiœ¤¯‡­Ï¶ ¥;HKÊ(­(ÝHz¼[“´ tEi'éB,¥K)ÈR¥ KA–Š,Y*²TdiÈÒ¥!ËŠ,+²¬È²!ˆ,²lȲ#ËŽ,;²tdéÈÒ‰¥&b©‰Xj"–šˆ¥fb©™Xj&–Zˆ¥b©Y ²d)ÈR¥"KE–Š, YÆJ~-)'r¦7OÍ›ÏÿÁ°qj^r£R][ŸšÏwÝç§æ:OÍã6ƒqæüáðúúí§ëÛ?/í—Ogä×w·Ëcîï>î?-OÓO_ðÝÇÇ7w??ÉŸNÜoöû÷OùùÝáKá›ýÃãß-×O>s÷px³UýXó­¾þY,ƒ·Þj›x¯½ am§y<™Ôº¶õžKÒ‚Ò¥¤Ç{.IJw’ï¹$­(,Y ²d)ÈR‘¥"KE–†,Ç{nïõXØxù?ÐxÓµ2¦¶©6ëáݽZ_k«7ÝyÊøüM׎õ|ù–ìÏ<‹‹Gž¾ÙÆñ©"2>zsý°¿¹¹ûùóØûÃþqë‹Þ>gÎᆱÂÀø£Þtü0}ýÒÏcWc|WûÓ¬¾xP\ï3?®xYÚºÞGÒ¤sFiEéFÒ%¡´ tEi'iA–‚,Y*²Td©ÈÒ¥!KC–†,+²¬È²"ˆ,²lȲ#ËŽ,;²ìÈÒ‘¥#K'–q½¤‰e\ïéL,ãzI˸ÞÒ…XÆõ>’F–‚,Y ²Td©ÈR‘¥"KC–ñn߯IVOöâÓ«8»Õ.#ØòË÷~ñ1Ȥ­­Ïmýr²œîwîeçW¯þôp¸ÿÅ›ÃÛëÛÛåÑï§³Úãÿ¶¿¿ÞÿøùÎêÏ_?†s×ÞÖOµŒ_ ó]±ñÃÕÞɰ0éâãÄ^ÖÃ.M²Jw’®¥¥I·„Ò‚Ò¥¤;²ìȲ#KG–Ž,XÆÿ$M,cí=IËX{OÒÄ2ÖÞƒt!–±öž¤‘¥ KA–‚,Y*²Td©ÈÒ¥!K ËqÆ«Ý_® ¥¥+J;I·‚Ò†Ò¤{FiEidéÈÒ‘¥#K'–³ÒÄrÖâ^žÎÄrÖâ@šXÎZHËY‹id)ÈR¥ KE–Š,Y²4diÈÒeE–YVdÙeC– YvdÙ‘eG–Y:²tdéÄrÖâ@šXÎZÜËÓ™XÎZHËY‹{yºËY‹id)ÈR¥ KE–Š,YÆ}µÞŽõ²—€4NòKK©§Š†E3KóÞlãÙ$¯Šf9].¢—Ó­ûÑZq]5;>úÃáý‡»ûýý§å¡'…´Sf³ŠgÇmv1(ϽŒ^Ó]óêÞRcãú.M©¤¾1n«@‚âÊâÄ£F‚âÂâ•ÅÅsaqcq¤¥GªQ,!qaªÂT…© SU¦ªLU™ª1Ucªª§uv/ˆ×ÄâÂâ•ÅÅ[aqcñŽâ=³¸²8Su¦êLÕ™ª#Õ¨¢ 8R: ‰g¤•GªQKAq¤ÕgªÂT…© SU¦ªLU™ª1UcªÆT©V¦Z™jeª©6¦Ú˜jgª©v¦Ú™ª3UgªŽT£Ì‚âH5 -$ž‘j”ZP©F±…Ä Rr Š3UaªÂT…©*SU¦ªLuÌÄ,¤“‚Á¬»œû,¢qm×SwOº5½Øª¼”Ë{¤äÔ›`œ1Ï•IçUóÇ~¸ßß>ì?/Â?>øÍ»ýýxìpýðxýzUn±x!íôݬžpù2—ãÆ$÷m5Ȱº+ÝŽwJ¬Ç­ê!ÑÛÄ£¹/‰‹wþ¾$®,ÞP(ŽT£½‰g¤ ~P©F‹/H5šü 8S¦*LU˜ª2UeªÊT•©S5¦jLµ2ÕÊT+SmLµ1ÕÆTSíLµ3ÕÎT©:Su¤(P©F/ GªÑÅ‘jô£ ñ‚T£#Š3UaªÂT…© SU¦ªL5¶€:5<…—YµŠ}4M¶žååBŽö­ú¬o²Ë³)“Xí\µ:µí‰3·«Wßݽþ˹iÏñ‘Í…@=ïvËX [Û JJw’Ž?½ ­(ÝH:þî‚´ tEidÙ‘eG–Y:²tdéÄ2ÚÖ’4±Œ¦µ$M,£e-IËhX Ò…XF»Z’F–‚,Y ²d©ÈR‘¥"KC–†, YVdY‘eE–Y6dÙeC–YvdÙ‘¥#KG–Ž,XFSZ’&–Ñ’¤3±Œ†´$M,£-IËhFKÒÈR¥ KA–Š,Y*²4diÈÒ¥!ËŠ,+²¬È²!ˆ,²ìȲ#ËŽ,;²tdéÈÒ‰eôœ%ibgA:Ëè7KÒÄ2ºÍ‚t!–Ñk–¤‘¥ KA–‚,Y*²Td[ûôäî Õ‹f·Ž\Ý{q6îi·ŽuÍו¶ê«J[;VÚô¸iÏRiÓ‹]|Žüòãã»»ûëÿÜGÛÙ˺À˜“‰ù¾m<Ñò%VÕ²²«Ÿ«sd\Ý%­c\Ùz¾UÑBÅ­°¸±xGñšY\Y¼¡xK,.,ÎTSíLµ3ÕÎT©:Su¤:7—"q¤:7—"q¤:7—"q¤:7—ñ‚TçæR$ÎT…© S¦*LU™ª2UeªÆT©ÆæRjÞ=šÓÿãxl.EâÂâ•ÅÅcs)7ï(›K‘¸²8Su¦êLÕ™ª#Õ¹¹‰#Õ¹¹ˆg¤:7—"q¤:7—"q¤:7—"q¦*LU˜ª0UeªÊT•©S5¦jLÕ˜jeª•©V¦Ú˜jcª©v¦Ú™jgª©:Su¦êHun.EâHun.â©ÎÍ¥H©ÎÍ¥@¼ Õ¹¹‰3UaªÂT…©*SU¦ªL5 6ÂÕ:)aÍÂ_ª)g¯lÜÓÂߺ¦·QøëyUøëÇÂ_»,üµËÂß|à‡ë÷‡åèßÝ. Q?îãEYÍÏ·Œ]U Ë®Œ¤Ÿ"g»*uDukܪ2N7H|œn ¸²xCñqºâÂâ•ÅÅÇéŠ3ÕÊTSmLµ1ÕÎT;SíLµ3UgªÎT©–„TKBª%!Õ’‘jÉHµd¤Z2R-©–‚TKaªÂT…© SU¦ªLU™ª2UcªÆT©V¦Z™jeª©6¦Ú˜jcª©v¦Ú™ª3UgªŽT%!UIHUR•„T%#UÉHU2R•‚T¥ U)LU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÊT+S­Lµ2ÕÆTSmLµ3ÕÎT;Su¦êLÕ™ª#UMHURÕ„T5#UÍHU3RÕ‚Tµ U-HU S¦ÊjKÊjKÊjKÊjKÊjKQ»L±hoÌÑIù-j—Zºw«lXÛõˆÎ5’«qšÖ¥K¿l“ª»ÿÓþæãáé—{¼[ŽöO¾hl[¶Þßý¼šß¦ÔØ‹, ™«W½ ]“¶6—M’Qug±ešE¯ÛÕ¸õäÛQ|ü{AqcñŽâãß Š+‹7·ÄâÂâ¡ZRÞüeX§¤kAiCéNÒ-£´¢t#éžPZPYvdéÈÒ‘¥Ëè­EÒÄ2:kt&–ÑW‹¤‰etÕéB,£§I#KA–‚,Y*²Td©ÈR‘¥!KC–†,+²¬È²"ˆ,²lȲ!ËŽ,;²ìÈÒ‘¥#K'–Ñ:‹¤‰e4Î"ibm³HšXFÓ,.Ä2Zf‘4²d)ÈR¥ KE–Š,ÇlX´ù8cß:]ÿâllΆë8* `­§T\¶&º¶š G«êËÙp™³áXƒ4f»ßÿx¸?͆Ý?ÞßÞ¾¿=ÍZ×Ãùèçwׯßö×o?÷çÊ/^?ûúŸ¿ýß¾=½¾»}x¼ß_ß>®æm'ÒçR‰õ+<_ã§ä6‚¹’Qã·Ñû˜‘eÛµžHTw¿$n,ÞQ<þr¸²x#ñ¸aÅ‘jܰ‹âH5nØEq¤7ì’xAªqÃ.Š3UaªÂT…© SU¦ªLU™ª1UcªÆT+S­Lµ2ÕÊTSmLµ1ÕÎT;SíLÕ™ª3UgªŽTã†]GªqÃ.‰g¤7ì¢8RvQ©Æ »(ÎT…© S¦ªLU™ª2ÕèßPÓqWÚŸ Ǭ£Ž)zÖºõ$_Õž\Ä^O'Ö{ùÆœç¡ñ/ât»îleø§óå÷ãá7¿üæ7ßþj9žwÙ>,ÇoïîŸ|òt_ï<øî÷_/¯ßÞï/OC£¯hÎã›6ßxaËèÕ¸íH«h\“”t^±·:KÎÂâ•ÅÅKaqcñŽâ’Y\Y¼¡¸2UeªÊT•©S5¦jLµ2ÕÊT+SmLµ1ÕÆTSíLµ3ÕÎT©:Su¤•GªQI@q¤•GªQI ñ‚T£’€âLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÊT+S­Lµ2ÕÆTSmLµ3ÕÎT;Su¦êLÕ™ª#Õ¨$ 8RJ‰g¤•GªQI@q¤•gªÂT…© SU¦:fÚÆ\?—Bf¢7mÅ"r4óÕ1_hQ&hÖ¶¦ò¾ÞY V=®&üå¼µ€^½úýÛ·7×·‡å¯÷¯ÿòñÃrüíßöï?ܬ·°]ŠŸT‹[‡WO² _ ­q SÎfãüÑ|kÜ%LSNo(>¦œ(.,^YÜQ<~…HÜX¼£xeª•©V¦Ú˜jcª©6¦Ú™jgª©:Su¦êH56NEq¤§¢8RSQ©ÆÆ©$^jlœŠâLU˜ª0UaªÂT•©*SU¦jLÕ˜jlz!¥V^¯‰Å…Å+‹;Š·ÂâÆâÅ£q+‰+‹3UgªÎT©:RSQ©ÆÆ©$ž‘jlœŠâH56NEq¤§¢8S¦*LU˜ª2UeªÊT©S5¦jLµ2ÕÊT+SmLµ1ÕÆT;SíLµ3ÕÎT©:Su¤§¢8RSI<#ÕØ8Å‘jlœJâ©ÆÆ©(ÎT…© S¦ªLUë.G rüù&õ´¨@Ú˜ŽzMŽÆYÙuWïžòƸ’òºY/»‚DéüØñ£íäêÕw×çýŽì——bäñøçëÇwËѯ~<~~UøI»Ô£c-O¿Œ_“ÄÒ­T3{cœ¶V][×¥Åç>6 n,ÞQ|îcâÊâ Åç>6 .,ÎT©–„TKBª%!Õ’‘jÉHµd¤Z R-©–‚TKaªÂT…© SU¦ªLU™ª1UcªÆT©V¦Z™jeª©6¦Ú˜jgª©v¦Ú™ª3UgªŽTgÛZGª³m-ˆg¤:ÛÖ’8RmkA¼ ÕÙ¶–Ä™ª0UaªÂT•©*SU¦ªLÕ˜ª1Ucª•©V¦Z™jcª©6¦Ú˜jgª©v¦êLÕ™ª#ÕÙ¶–Ä‘êl[KâHu¶­%q¤:ÛÖ‚xAª³m-‰3UaªÂT…© SU¦½›zI¹¸’RʬK}î_ ÆE]ªœvêX³íu]ª]öè³àcÿqÎ<žâ‡‡Ç»ó^LJöˇO*Sú¬2¥¯25Þ­µ—Yã–·Õ XƯÆÉ®Ó²TzfãêΛ¸{*ãÖÅ GññþâÆâÅÇû7Š+‹7UG(.,ŽTcÕ‰g¤«ŽP©Æª#Gª±êˆÄ…© S¦*LU™ª2UeªÆT©S­Lµ2ÕÊT+SmLµ1ÕÆT;SíLµ3UgªÎT©:RUG(ŽTcÕ‰g¤«ŽP©Æª#Gª±êÅ™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª•©V¦Z™jcª©6¦Ú™jgª©v¦êLÕ™ª#ÕXu„âH5V‘xFª±êÅ‘j¬:"ñ‚TcÕŠ3UaªÂT…©*S®(‘®¢¤1«;]Rj¬Œq¬î˜÷ÞÚÆ¸ÍêN¿ì†4ÎcìØ]u°^½ú—ëÛ7§ÚÎñ·w÷‡ë?ß.üåði98ïÉz<:{ŽG·wËÇö÷‡ÛÇ'ÑýÛÇÃý“ÃåÃ?Þüe9º~ÿáî~ÝŒuü‚Û¼¿4o|KËè­yA:oÐJÆÙ®×žrÖ¶1nk‚@âc‚€âÊâ ÅÇÅ…Å+‹;‰ÇÅ‘jLH<#Õ˜  8R Š#Õ˜  8S¦*LU˜ª2UeªÊT©S5¦jLµ2ÕÊT+SmLµ1ÕÆT;SíLµ3ÕÎT©:Su¤Gª1A ñŒTc‚€âH5&$^jLPœ© S¦*LU™jô°(Ù»öJÎ?gc”žÆÌ¢±q±>èsûÔÕ¸qö¼š ÄŠ»‹ ‚œ;¡Ž|ô=‰òs7ÔùÐëÃxàíõëýãayðíýÝûåèÜu<î:Üÿ·‡å‘1§ˆ‹Ê—ÝTbEu®ãû6í¯l¿×v¥yJÕ+ ƒütÛÈzÜêô4‘xeqGñhDâÆâÅ£a‰+‹77¦jLÕ˜ª1ÕÊT+S­Lµ1ÕÆTSíLµ3ÕÎT;Su¦êLÕ‘j$P©ÆkÏH5ÖX£8R5Ö$^j¬±Fq¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜jeª•©V¦Ú˜jcª©6¦Ú™jgª©:Su¦êH5ÖX£8R5Ö(ŽTc5Š#ÕXcMâ©ÆkgªÂT…© S¦ªLuü90ëî‰Mç$»§Énh\´ŽtKyüÙÚW6¶‰Ó–Õ$ûØ}´Ž'øå›ó%¸zÞ¹°nL³cZ}÷ù£wŸ|}s}¸}<}ajÇ)¨YT¬n¼žóèÕ(Ûµñ‘LŒê;ýXz®F­Î_ãÂ>‰+‹7 û$.,^YÜQ<.쓸±8S¦*LU˜ª2UeªÊT•©S5¦:NH½¤Ó»Ù?Ž·DWo(>NHQ\X¼²¸£xÜ4BâÆâLÕ™ª3UGª±; Š#ÕØÅ‘j쎂âH5vG!ñ‚TcwgªÂT…© S¦ªLU™ª2UcªÆT©V¦Z™jeª•©6¦Ú˜jcª©v¦Ú™ª3UgªÎT©Æî((ŽTcwÏH5vGAq¤»£ 8RÝQPœ© S¦*LU™j쎒$eËúò9ô³5Â/5wF£Òæ|}³6QV} åԗЉg¤‹ÎP©Æú$^j\=@q¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜jeª•©V¦Ú˜jcª©6¦Ú™jgª©:Su¦êH5îÐGq¤wè£8R;ôQ©Æú$^jÜ¡âLU˜ª0UaªÂT•©ÆŸï) ^R½˜kàÕ¼{, ãæúãŸM•­ç+¶Ñ¯®Úàé© ^oW¯Û¿ÿp¼ä‡½y¼»»ÙÝ¿þüÈãþö?÷—U€hkø¥ÈÆ3œÇ®FlcÔøÆÁ¨ñû‘Ë•óÆ U}büz´“ôøå iCéNÒ–QZQº‘tM(,+²¬È²!ˆ,²ìȲ#ËŽ,Y:²tdéÄ2ŠŒ$M,£ÄÒ™XΦ  M,£¼HÒÄ2Š‹$,Y ²d©ÈR‘¥"KC–†,-,Ç9Œu}QÜQ¼7ï(Þ2‹+‹7ï‰Å…Å™jgªÎT©:R’"Š#Õ()’xFªQRDq¤%E/H5JŠ(ÎT…© S¦ªLU™ª2UeªÆT©S­Lµ2ÕÊTSmLµ1ÕÆT;SíLµ3UgªÎT©FIÅ‘j”Q©FIÅ‘j”I¼ Õ()¢8S¦*LU˜ª0Ueªñç ºAôŠd³ XÆ(q0(vÝsõîikªPêF5±­ú}ÚyS ݧøÓùáç<üæ—ßüæÛ_-ÇûoËñÛ»û'Ÿ&mëùJkëJWßè9~wçsè.?+uÍã¥Ô5—ž‘óðï4/È»,~ZŸ±zÖå+¬ÆéîØ0¢w6®íj‰ecغˆ’PZPº¢´“t4£iCéÒ³%H+JËÙ†¤‰ålB ÒÄr¶ ib9P¾<-ÈR¥ KE–Š,Y*²4diÈÒeE–YVdÙeC– Y6dÙ‘eG–Y:²tdéÄr6šib9ÛL‚4±œM&AšXΓ/Ob9L‚4²d)ÈR¥ KE–Š,Y²4diȲ"ËŠ,+²¬È²!ˆ,²ìȲ#ËŽ,Y:²tdéÄr¶‘ib9›H¾<‰ål! ÒÄr6ib9ÛG‚4²d)ÈR¥"ËØ¯£Õ”ZBUƒy÷In)©8÷¬ò²·YyñΑãöôrQy‘ç•yÖ7rÿÒKÚÙ±¯¥n<íòVãd×Kw×fl\Û¥VRª±Àk5n«ö‚âÂâ•ÅÅãžA7ï$>»R’¸²8R])I©Î®”$ŽTgWJGª³+%ˆ S¦*LU™ª2UeªÊT©S®”-»'o/‰G[JWo()I\X¼²¸£xt§$qcq¦êLÕ™ª#ÕÙ£’Ä‘êìRIâHuö©$q¤:;U‚xAª³W%‰3UaªÂT…© SU¦ªLU™ª1UcªÆT+S­Lµ2ÕÊTSmLµ1ÕÎT;SíLÕ™ª3UgªŽTgKGª³%ˆg¤:;Y’8R½,I©În–$ÎT…© S¦ªLuÖtƯq‰$//G<¯é€qÏvYÛªéXÚèi9Neæ½iþ¬¡ˆ?©çÄÁÓ^–þ¬“¥îcéϺXú{XÊÒÃrýŠÎcW£Æ?‚40ºƒAq2âcݵžl ‹Ww“7ï('#$®,>l½¤œì%é8iAéŠÒNÒqÒ†Ò¤ã$¤¥‘¥#KG–Ž,XÎn˜ M,g/Ì—§3±œ0AšXÎ>˜ M,gLF–‚,Y ²Td©ÈR‘¥!KC–†, YVdY‘eE– Y6dÙeG–YvdÙ‘¥#KG–N,g³K&–³ÕåËÓ™XÎF— M,g›Ë—§ ±œM.AY ²d)ÈR‘¥"Ë1µ.)µž_>]š3Ñ&ÇN$/5;[ÊqÏÌõ¨ÍyhÞèl9~YOÝ3ýbs…gsÑyø¤¯å<¾ìk9\úZžÆlôµ³J®œã›ØxUËàÕ\./}-Ñ8óí11Ò´õ|ë)cCñèšIâÂâ•ÅÅ£k&‰‹÷/iü ê/‰G×LWo(]3I\X¼²¸£xtÍ$qcq¦êLÕ™ª#ÕÙ5“Ä‘êìšIâHuvÍ$q¤:»f‚xAª³k&‰3UaªÂT…© SU¦ªLU™ª1UcªÆT+S­Lµ2ÕÊTSmLµ1ÕÎT;SíLÕ™ª3UgªŽTg×LGª³k&ˆg¤:»f’8R]3I©Î®™$ÎT…© S¦ªL5îV=ß?fD³kfnÞ[ªhÜìšYÝ[Úz¾ÒúzÖY.;|½;®g¯óúêׯߜfŒÇß–ƒ‡Çýí›ýý›å‘ß<üõæÍËñÿÙß/o¯ož þùúñÝrôËÛÇË“ÇñTuÌCS\0[½Îeèj\óü–’ՂƲ-¦¯±éÀzÜêÜvü“Eñ†âãŸ,Š ‹WwÿdQÜX¼£¸2UeªÊT©Sµ¡:æP³§ïKâŽâµ°¸±xGñ–Y\Y¼¡xO,.,ÎT;Su¦êLÕ‘ª$¤* ©JBª’‘ªd¤*©JFªRª¤*…© S¦*LU™ª2UeªÊT©S5¦Z™jeª•©6¦Ú˜jcª©v¦Ú™jgªÎT©:R§þ,ŽT5!UMHU3RÕŒT5#U-HU RÕÂT…© S¦*LU™êøs0þ›²¢ ìl%Ø»w/›âú_Ýš.Œ3Ãõô_/o{ÿzw^ú†oÿödõs<ðp÷ñþõ“ã×wožýxx{wÿäø›ñÙïÇ<ÿõ»ÃýòèõÃòñýÇÛ™oŸ?ä¼ñò–‘3`[?S.l\ÜH0<=®ï¯Æ­gŸ‰Å…Å+‹;ŠÏ[¹@ÜX¼£ø¼• Ä•Åçí!Çyÿ8}¼“ëÅiAéŠÒNÒÇ»¸^œ6”î$}¼…ëÅiEidéÈÒ‘¥#K'–’ˆ¥$b)‰XJ&–’‰¥db)…XJ!–Rˆ¥d)ÈR¥ KE–Š,Y²4diÈÒeE–YVdÙeC– YvdÙ‘eG–Y:²tdéÄr®žib9WO¿<‰å\= ÒÄr®ž~yº˹z¤‘¥ KA–‚,Y*²ŒÕÓÕâbìVü‹ó«¹~:Vg­hܳÔ«qã4o=™µËû}¿Þ×O·1¥\ÏF¾¾{ÿ~ûfyàæúö°]ßþt÷zÿx}w9O«·c¯¡õS/_a5Îv{Û÷ÖÙ8ßå<~ Õ|cÜ¥Wt9CqcñNâÑå ŕŊw<¯,ŽT£ËŠ#ÕèrFâÂT…© SU¦ªLU™ª2UcªÆT©V¦Z™jeª©6¦Ú˜jcª©v¦Ú™ª3UgªŽTç:Gªs?‰#չΟđê\çâ©Îuþ$ÎT…© S¦*LU™ª2UeªÆT©S­Lµ2ÕÊT+SmLµ1ÕÆT;SíLµ3UgªÎT©:RëüI©Îuþ ž‘ê\çOâHu®ó'q¤:×ù“8S¦*LU˜ª2Õy¿ŒD®dJ?k#–SJŽJ§.g)õ¶õò6k#õòô¯wz\ç_ã¾ÿ|]ÿx|¾®<Ú¿}<–Lއ—…”ã£îï^âþòU± îšŸ¦Å·¹z!ËWXóÇöVŒŒ+Ñ·ûéöÕ¸uù ²¸£xtÅ%qcñŽâїĕŊÇR gªÂT…©*SU¦ªLÕ˜ª1ÕXJñy5Ò?ŽÇZ ¯,î(ë)HÜX¼£x,© qeq¦êLÕ™ª3UGªse‰#Õ¹¶Ä3R«+H©Îõ$ŽTç gªÂT…© SU¦ªLU™ª1UcªÆT©V¦Z™jeª©6¦Ú˜jgª©v¦Ú™ª3UgªŽTçÒ Gªsñˆg¤:—_8R 0@¼ Õ¹ƒÄ™ª0UaªÂT•©*Sjƒ—cot0->®ÄH)IÝzš/‹jCé)³ºqŸ« ßþðÕÆþ/4§DÓ endstream endobj 2287 0 obj [ 2286 0 R 2288 0 R 2290 0 R 2291 0 R 2293 0 R 2294 0 R 2296 0 R 2297 0 R 2299 0 R 2300 0 R 2302 0 R 2303 0 R 2305 0 R 2306 0 R 2308 0 R 2309 0 R 2311 0 R 2312 0 R 2314 0 R 2315 0 R 2317 0 R 2318 0 R 2320 0 R 2321 0 R 2323 0 R 2324 0 R 2326 0 R 2327 0 R 2329 0 R 2330 0 R 2332 0 R 2333 0 R 2335 0 R 2336 0 R 2338 0 R 2339 0 R 2341 0 R 2342 0 R 2344 0 R 2345 0 R 2347 0 R 2348 0 R 2350 0 R 2351 0 R 2353 0 R 2354 0 R 2356 0 R 2357 0 R 2359 0 R 2360 0 R 2362 0 R 2363 0 R 2365 0 R 2366 0 R 2368 0 R 2369 0 R 2371 0 R 2372 0 R 2374 0 R 2375 0 R 2377 0 R 2378 0 R 2380 0 R 2381 0 R 2383 0 R 2384 0 R 2386 0 R 2387 0 R 2389 0 R 2390 0 R 2392 0 R 2393 0 R 2395 0 R 2396 0 R 2398 0 R 2399 0 R 2401 0 R 2402 0 R 2404 0 R 2405 0 R 2407 0 R 2408 0 R 2410 0 R 2411 0 R 2413 0 R 2414 0 R 2416 0 R 2417 0 R 2419 0 R 2420 0 R ] endobj 2284 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2287 0 R /Contents 2421 0 R >> endobj 2422 0 obj 14643 endobj 2424 0 obj << /Name /Im10 /Type /XObject /Length 2425 0 R /Filter /FlateDecode /Subtype /Image /Width 25 /Height 24 /BitsPerComponent 8 /ColorSpace [/ICCBased 42 0 R] >> stream xœuR»à ôYÁcd•´)]¦dÊ[A#PÒRjZFPé€-žqÄã=¸;}Úw³Òl¿ZI¢ºYFXbEŠÔ•ä Ü/ êzÄÑ¿Pè¸!š[¦S/nÝŠ*ò¨“Ïã¥Gni8XðÜKTE¿yçº&pd­Ë²Ù¹` ð¼Öyÿñ˜ˆ;Œ£€™ nÕÏÄFˆ'"ÆóÁE[²:ÑŽœi°œÔ×[Ú€ñ¯Ùÿþú Ò Êð”ë0@—IiÚHð(y| endstream endobj 2425 0 obj 202 endobj 2426 0 obj << /Length 2427 0 R /Filter /FlateDecode >> stream xœÍÉ–·ñ>_ç2zoÓû’œlË–ÇÏN䈊çñ$A²­ÞÔËPÔ×§€Bè’/NFËTUU…P €÷7.qàϽø§Ù7ïÍ%±GüH‘ˆ¸1œ„D!I˜\4¢‰}IU­9‘Ÿoʇ¼ºùõ7h´' ÉùÆ™1G6on~áaDý(IÓTéêQ7I„ŸFì òðXxäe%[Ú FÎÿ\{[#ßõþ4rÈñæ«ÍÍ÷!q²9˜%v#Çq\?& õ½TüxdS_o¿ê³|Ÿ•GòÝ¥æÍ›Ÿ~ ß³¦}ñÙ|óÍF Tr‘KɃ¿1•ëiô! œñk­iº¡Â¿€úH õB‘ø”«éU¿Å‡ ¥¹ð÷ªy+«ót²¤ÝþLáëó‹Ž®C“ÑŒx©k™¼Êþd«Í&RÈvh¸n,š¦±)|lŽ7ÒÕ1,…„†b8 i89‡ JAŽ Sê`ƒ\P¬ˆ;FU:n¹SϰôÆ<ѹLe`ñ‰p±5&²müºÈ-¡I Ø+š2(2«ôpP¾3Wã“bÕÈš\¯¶”$£ÅsQ/I„pq¥õS¿n*Øü]Æ[Ú²gþt[õÝݧö}¾ß’=ëØ–µü‹§Ç…iñôC$1ˆO#Ãóáá/¼Üg‡Yë0Ç­ÓØk@)ÅÆ »KLÏu?V[äÛª!/È}àјÜîyDzœï %+US°.«JC´áîÄ ²«Š‚•V÷<+­ÏU-ø´†Ðô§AëtªµçÔ†bRa§Ìð;{f‚‰ëx0«·Us¤hmÚwYN¿®öüÍ9ëv'Þ¬Ú%ðc&0ù~Î%P£ãÛ–ùl.’tÒƒ`Eó–ìXI¶°u«¬’•DXk+ÂýPä䶨ë£w\í0øœÖLÒƒä¶:0¶Þ™ì³†ïºª¹¨%ã ÃÝŽèá[Ÿ¸³µ/B¥0–˜Žqà{Yíú‚—\/ËãòJt—&¸k?Ž‘ÍÌð=Ì&p 'Fב6k^ÈöÆz®Þ IÂdbæ÷жcí»‡Ž5GÞ˜éyÕ°=XVö—eGgÓåF>õSôwS#æØó $ÜvçÊ ¯úlÏ[ƒ? Ѫ´KÕ„5Ö—†3iM(«³Aê¼·$Œø¿…%œ gbH}˃…~O/Väf¥Áª_UÕ;CøåÇ ÒV}³³zâ®§†°©ævŒÃ‰.—£ì%<ømWøõËo ‚^GÁʈˆ¬Þ'ëÃw¥/6ë»ºï Žú¶¡©ŠN¿ØŒpàw† |ÒB?µ¬ÌG\r_ÝÂ~ ›J$&Iœ,XíÈË{XÇí÷”\ëo4xÙ”ŸÏYOzÃ!ÃHÖ œ_ ÑÎ ¢ŸÔ† 'EÁB÷§”<–m×ô; ç,ÏÅæßgm³ ß‹ï¤fUw}Κ٠<'¡i‚~‘ ÇOžNš¹Kíþ¹…€'æÛ§Á0ÛÔ)¼Â÷¶gˆ¸vè€þ¬{—ÕåUy”ûUbY¹Ëû½nÝPú™1ßQ¢5:ÖÀh]“m{ãGðœ‰>fµ o>Šº3hV¸jö¼1(nl„ßqnñÈ:·Ësjðÿ ‡D¤`ƒœYÙ-s×E©¨öu`;K…ÀÖ}gulX¹;Ù#X闳޷–ô†ç’4«5;® âÔ‚•}obå}u.óЉq‘Ø›LC­XS;ƒ–¬nOU§ °7·`E+ rêºúo*áiŸKŠkÜá‘Ó’wÏ??ïT‹‘|>H;=hÒ.B–›)ó…ñÁd|Pvl…|W¤Tw õR Š<@üC]5Ý€±° 6a)ßî&÷ó®çªÑß!njzßB°^6ÿ)T$Iè‡8lFÞôÛgÞ´Â)ìòŒ/¥^ Þ;Ó$ï4k§Vb“÷¸FË«,Š‹!dàAq™(‚ZâˆXÁ -·˜aÌU| Èp *ÏÁϧ ÷¢*ÛPÈ3l›ÛÝqÓ!bm‚á³Ú̈½±VŽ¡n†(¶—„ÕDlYí“á(Lzɰ »Øp&ÔD“LncCÞ'•¿H˜ÐÊ´ ;±n…n…ô­Í¢2°mZ%»´kq yaµí»JÔxrIM0Ï¥ÕÈZ›S†e\D#{pˆ‹ÁÝtuúÂn’Eô\„ÒùåöQ¬ÈõÙtãk\,5†)T:rS&Gä„ɹjW˜ïUp“3`­‹~[À«±,õ™Ž±œÕª@L×j6›…¹rƒeCB7˜m]±#<äˆeeWQ=Ý~åü½¨âï4™U]W­<.P¬+ ¾zûhºÈnÒPpY#Œ«z®œ^Vˆ®§×¡8Gƒhqiaü÷¯W׎y×zjÑ­<@X&úѹîjE\îfÈ‹f*D¾C,1>w$;ˆ÷Bê†x9òü¼(H¨A^íéLz1®ÌÛa\ñäÕDHÏgT\A’µxS! Ñ.k jb âmwÉÍ×öŬÏ}ÒƒÖÂüCÝ\âT„ V†©(þ33œ¬{zqgzb Ûu|Z> EÎÄBbhÜi±Kq0vÈÊL–'w†ª|,"ÿúÇ+ƒ´{Ìà:±F÷¿jZsn±ékKjµ3ˆÎƒ‹¬@o³ JºÙGnë_sÈíÊ5&ŒTJ¿¾ë>Ö.X œíØR}§±# Þ©¤J0þ#üX‚õ¡5¤/­¾™ø\À€tÜPY [‰aΔsÕ+CHtk5Vvu& ‘úxâ­Õ¶á˜©¶–²¥Í€Yº}·Ù¼6XË›gÞØƒ\°TL,ÕÂÄ™vC± -[!aßdÏÜ *+“ð«½á˹¤{íNCÖ'q +¹5 ( M»ª^–N,òÙÉœCg® ðËÁ,ÊKÊd[áN‰M.°cÓÒÀ¶K°î.$¬ƒ¢2xɘ¥I[¨ŽsÓBœc›» #Êúr€n)oK=dMk$Ÿn5cæ ìÿ¹‹ ¼iØg—W/({yA,tÿìYò(ÿ}'\`#äuÆòÍææýa_?P×çâ‚3/!.ÑbqúðX€ù>AÞ¹ÅÄ ÆUh„ÔõTí½Éj-ÑD\¥&HäÙï.»œ¯{»$¥âª½ÝŒ ÁYØW¼-ÿÚ‘£ÈáŠÖäõ[¶{7¯ÜB' ±ÐËñ|s9:wZsàP°zò‘‚“,°Q¦å×Ï¿\ˆâ؉bw ØÅò¶"ã^ûÐçVÝP| Åü¸ ²õ}un]¬F¡ªfFW(Hͳ/[»•ÌÈ)å±.˜d–ƒn1„åŽ@°®ZÓ£¨öÙ!Û±áÑÁ¬5&ÕË‹TYÜ!¾í»Ea˜lX.†3fXˆà†@XV6PWÏ æ'ƒáYˆI.Tù?"UsdeöQŽëNSq‹éæF…¶¹ÛM]x{ڼШ4‚ç&ë ’ŸWy ÓÝjJÃÅMËÞ‡Q¬Tç&7>6Öha,®_†4ŸÒÆú¼k¸*&G}b‰#Ak|·Î°í·£39¤B¶g#^Ϙ=‘ÕÄŽ+”ùpA«û¶Ù]©•âkÝê,®Jê» f˜úc˜ ð>cîò¹,sß\ª!¬®$1–F\ßo"ªªJDô¢'öŒqPõÄú‘ÒFä©ä\{†¢^[ reR<ê‚StB×_÷õê5ˆ®öÕÒ±rŸ+]syº°6‚+•lB!·†ŒZD‡™`ñê~>©q0i']áúè–º€nÆN®*¥‚xÇàÆXn|µ/ –‹ QG7 ÞaQÄd§½£v‡É`|NÙñt?¤U‰JLÌeе±yI _Ÿ&Q¸8¸OÝJù¾w­ÿgZÖÞBçÏË ( ç}ï´‰”QwU}™¯¢dúE<ªÄ‘;°ýž'õeùf Hx¸¦mÅ+8tëÏà@€ºrž ûô‘’9WúÏs™È‰©(iÓØQ§ôßì3؆²®O¬T„­`’¸Óð§HO·-Õ!Z7ü9«z«AÍvlX}2$å´)ª²K|í¥(ø†BµÍð¬1¼IBX%qÇŠ0xXK)f@1W{–«×YHûåÇæ–rÓ‰¥ÔrSo‘ Át…Ï·}Ã)1}Å)±ý¤¡Í¤n²‚a´Uu_bQD©ÔÓ0¤ˆGƒù3³aQ‡‹Z‰ ï¼3Ø”î2¢åmËW{ÛW½øY®ñÕ• ô݉íÿ­«¥õ|Þ[b ˆÓža !,ެ¨Æ; ªËQÕŠ[ÎÂxΨUÄK0„™†+"6\ˆ-õÉË,¥Ô9鬃9ȆešéÅ7Ï_"ˆ?c# '%‡.˶Ì~…5Š.Ha"ëÌq–xÌÿ_@Gü endstream endobj 2423 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2426 0 R >> endobj 2427 0 obj 3793 endobj 2429 0 obj << /Length 2430 0 R /Filter /FlateDecode >> stream xœÍVKs›0¾ó+öØ" ‰ç5“¦M¦—4žé!ÉAÙ0ä‘Äÿ¾`À–ñø”Ö/v—Õ§OûÂoŽ X¿/Í%Œ $¥óÖÛ\ Р7ù¸! p%ôJäGPÇ=Ѹô"m­½w§dðÇ© ?œÇgí”F>|8Øï`œ{½¹ Dq÷\ r£ÈlAQ …¤„ÅmIàZ´Þ;öÿsöSFÔ%ÿ# kçjé,n|p1,Wc è8ûÆØ¥!Dˆ’ؼ,KxüvÕäEšWkø¹Ýpùpÿ /žayç|_ömQÚR"ú¢¶žönøÞ¿3©µÁ>Zõ×C´³i "¾>‘¹Uôéí¯æÆNôÛpu×ÙðôP“ŇÉjãö•›Ïç%4 ]Œ¢½Œ˜L¿_e_5+‘fïùó`«º–—.ÀÓ¥ߨD®ù;—¬ôºþTÎëÁ¤2¦%aÕ ¿Œ0MÍÓqÄT²’©Ù$y‰(K^)БÐëA‰ ˆU+®òB¤…[Üć©pCŠ|3ZêÙ{´¬/õ9^„xEŸe±Ã±RJBÿŽah¸ÌÒ ˜"|šÆìÖ”žZ i.y¢„Ü"+¦A”šyÑÎù‰ÿÀË=âöΊ<ÕU#*T¿æ 7ðεÜ2UÇ£à,DË-Éšêõ8¤‹£³0m¿•˜A¤øŒü7ãCŸ4l;z»vì•Ù~ðÌ“8ÖxÄ;‚­‰\Ö2Yè!•–Üô'kT&dÔ§šoQÝ'@G†íHëä”+–õ ï&U§‰fô¼É•ƒÞöì ÕÛZñrPŸtHD³ÎFÜq‹ÛAú¹:6ëQe¹ž ôo-Jþa†¦€ºKùÓÚû›òšˆsN endstream endobj 2428 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2429 0 R >> endobj 2430 0 obj 749 endobj 2432 0 obj << /Length 2433 0 R /Filter /FlateDecode >> stream xœÍYëoÜ6ÿ¾QôCгi=V+)Å}h’Kë"87ƒàZ®ÄµØh¥µ^ïC_’ÖNîKïú€ç7‡Ã™áÌ{¿ Iÿ^Ê?i‘b¿º×¼¤‰7š•lH˜ÒM‘=Ñ K2RË'¤üD“±âê¯TäÓªYäÇÕïÀG% hBŽ«`!Å|X½‡Å“ 7YžçZ׈†Y&—ˆéˆbO®®÷yÓª¯öRPð?×Þ×(£ÿ ¤NÊçÊëü—RåúÉ@²¦#^XX¾ãÂÿk#84J`q9TkOè¿rÀ‰Úþ}r'Z”7ynWµÅ¿rñ€Ü­^Ý®®Þ&$ Èí΢TN šE¹ü'"·{òû‹(¿ûƒÜþ¼úÇí" þb«-)×P^æ›tzo1‰ÂÉÞTPå›$‚0Áýp8ð¦ä5%?¼ûðþ9Š¡"70p³Û‰‚ãΥɮކs{$Žiš€Ì0HQæOí‘ -{þ¤HÚvw(öŒ ²Nh"ퟥŠ|Ûñ’ܶcß‹ r[`)ô àu{Øóf ?víx@‘ž $ úöWþ zÑ6/I$!ùv1e“ϦDA]ÙeŽ^†ÑË$øl60f™Z^š=ÌfûÉ3šä2ÿ:ž¾ÆÔgìF1 ¥ri¤ý75)ù¾[‡tC^\yô;±í8~õÄ?XQq'ÌMQ%ï=–ÕÞ±XSz\ï/ìÚÎC|¿åeÉýÉ%Ø–ê1oÆná©0NhC0¯3íª¢­k¶m;6€‡Õ씼P&Öôs·Ä8â]o8íï =TÜ5ëCïøÑ'ÎÜÔŠYr˾ƒÞÝTTéÅ®f¹gÃØ‰ádõÙ-w¿Ng»7n‘vƒ “¯8X›[(šßYãX^kÁÍM{ae68$D™S9CÐÅŠQ0OPg;uÞ3¨Ö ù¹9°Ì…C§vt`ÏNYãIUŽs˜æwä]9rV&´h=1GúE9`6 eGˆzÇ:wœ£pžÈ†ÓNs­:™J† Î ücu ÝÅ~¬q¨9iQ[í•;äW2ÏölωÉ/g|Ï“è¦rå:ÒgS¬î[Cê¿ýеÍ&/IbÒ“ÔØ ûÁÄæ’1y:r4çšé^RTëAeޛűF(Êå¼ ÍÙÀÎ,Wñ™Ø¥)’yâæ6)^nK)×2Y‚<ØCÅ¿µ[ÊOçÏ––Ë(”§¦×æhà r‡¡±)}Ž£uÓè\[ƒ#ºÖ"˜>2cúHúž=óVìÅþ JŸÆ?Ô̤‹>‚?Ù²‰²yšÐ‡.ÔªZÒ•ä™ÙG4¢¹E°”¥Mu MF=Õ®!½›£öx`[ YðÞ2'zñÇw «-cÒ¸!ëÚ NLÓ:ö‰;úÐB¿­ù9µ‹Žƒ‚KÛåóä!=+÷h³©U Ó»J&ÚrËXÃyZÐ67¶Žè#‘–=Š.oøwc îßrbâQv7BÇÍÄrYÄ£TÖ‹>ú_Ü)âuFC¸QÀ-&FM?ª´ãI¿òe(žŒ¼1¹åJþnqÑ4–»<Ÿß6dDC¿›³‰4sä¡=òlã8^ZÓ(X·B¾¡]ï­+Sìa±CcÄaÌœªC1K”ÂŸË Øž®øsÚCŸ)rè—1”­gvÛ³š›ú$—‚d›Èäß‹»ÆBLGHº¶•…y]_B†;6¬È†<ÓvCïD‚ºNàÄSÈR޲Klaï'®¥·˜@€;¡=”Oà!ädcÝãPŸ–öÈ73{°&jiüå\‡Ùìã[åa¸FÊæ ôíŽa:(DÓøDÞàM×EV#ãÒ OœèzOz760GÖm¡òž†®ñAlOnë 븚*Aë¶Â3¥…y4DMщ-÷‡›¥ ã`fB¹â?ùpl»Ïz[Ù/;@ —‰I%Å»Q”ç<’ÌÓÀ'Œ´Ë0NéÚžN<iŽñ‘†ÓëÐÅ“‚öcïKÁ»ãi¹’¹ê#Ý­óG¼zeXþ¡¶SJ“1s}Gôñ×wK[mæGŽôÉp­ù¦ä;}ë¿1+ý}èFþ %o!2ø#ƒâP.be kÌ(YnVYÙúC½©Ågn%š¯Ã0•o…òqhU9@©uº¡òé)_Èjº!P–v«{…ƒ+Çc߃þù”UK–/£&S™öÓÔ«ÙC¦]c³^¬¡YæW‚ÅâöÛ,7ЍkÄ¥žWBŠ‰ÎˆŽŒì‰ÀÙÔ[ Ê ûëjúkö Ÿ¦‰·Írv ³šoö¹•=%¾¸ð|«šewj_¿s2ï*ÖP»’, ÂH?æ’?Ëmñ}Õß×åö¥üóòêJÅcÕöÃÕþTn¿?Øä™ÇÝ$Hiåy¶IR{óR -“eµm°›F¤«ŠcÔb/û¾‡<"3,ÚÌûzVÎ, s¢7Ý\w0oÞ/_½»~í0n—:†ÍÛO*ªšF‹l÷¸|¶†.4–i$ t)Ew/çÓÝ%Ü}–Ù;21…÷\PÅ´¯*›°E‡ûÌBóËÞW5¬I@Hfà÷L¿‚¿n;È®•¶å–ì´cæ§å ûÈðA•Ø/4¬I¾¦¹|6ºy××6|KÔO&ú¡±†f±ôê1È 7Ž–>LJ>vŠ[ýNZ‰¢rðäk`ZWDƒ'vô%¶ãÐC)žhà­ ÐQÏÞ£é:’©ÖÔ±ô¡s{pH,{ÚM°™™oÝÐd0aÁGäè„@vE%ëJÇùíúOŠêqÖ¥ì¶4VOˆnäÜÚaÿu 9¾ãôz2ܨÃ?ë†ÑèÊ<þ ô3¥Ù>vš/= ÓßÄò'© 4¸SKê8c¸¼Ë‡iÓ‚ Ã4ˆÔ9qPnzøºyræÕdb):è.Úît1ÐùSØáétØìÛ|ìQÙ§_8•ð|(|Õõ5„¬/ð&ÊõÏ©#ÈXZᩱeÅò´‹ùë’bý¥µC€ii|üAºi–Ö7%hz'Ü/ 5C9BU$dè „À cdà 8’n9ïåxºÌÒ ëhfÈ&êe@§ ûhëýÞý~õ“™wA endstream endobj 2431 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Contents 2432 0 R >> endobj 2433 0 obj 2656 endobj 2435 0 obj << /URI (../apidocs/org/hsqldb/jdbc/JDBCConnection.html) /S /URI >> endobj 2436 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 537.149 313.12 546.149 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2435 0 R /H /I >> endobj 2438 0 obj << /URI (http://hsqldb.org/doc/2.0/apidocs/org/hsqldb/jdbc/JDBCConnection.html) /S /URI >> endobj 2439 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 514.966 373.97 523.966 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2438 0 R /H /I >> endobj 2440 0 obj << /URI (../apidocs/org/hsqldb/jdbc/JDBCDriver.html) /S /URI >> endobj 2441 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 492.783 293.11 501.783 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2440 0 R /H /I >> endobj 2442 0 obj << /URI (http://hsqldb.org/doc/2.0/apidocs/org/hsqldb/jdbc/JDBCDriver.html) /S /URI >> endobj 2443 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 470.6 353.96 479.6 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2442 0 R /H /I >> endobj 2444 0 obj << /URI (../apidocs/org/hsqldb/jdbc/JDBCDatabaseMetaData.html) /S /URI >> endobj 2445 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 448.417 343.09 457.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2444 0 R /H /I >> endobj 2446 0 obj << /URI (http://hsqldb.org/doc/2.0/apidocs/org/hsqldb/jdbc/JDBCDatabaseMetaData.html) /S /URI >> endobj 2447 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 426.234 403.94 435.234 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2448 0 obj << /URI (../apidocs/org/hsqldb/jdbc/JDBCResultSet.html) /S /URI >> endobj 2449 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 404.051 305.35 413.051 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2448 0 R /H /I >> endobj 2450 0 obj << /URI (http://hsqldb.org/doc/2.0/apidocs/org/hsqldb/jdbc/JDBCResultSet.html) /S /URI >> endobj 2451 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 381.868 366.2 390.868 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2450 0 R /H /I >> endobj 2452 0 obj << /URI (../apidocs/org/hsqldb/jdbc/JDBCStatement.html) /S /URI >> endobj 2453 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 359.685 307.01 368.685 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2452 0 R /H /I >> endobj 2454 0 obj << /URI (http://hsqldb.org/doc/2.0/apidocs/org/hsqldb/jdbc/JDBCStatement.html) /S /URI >> endobj 2455 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 337.502 367.86 346.502 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2454 0 R /H /I >> endobj 2456 0 obj << /URI (../apidocs/org/hsqldb/jdbc/JDBCPreparedStatement.html) /S /URI >> endobj 2457 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 315.319 342.55 324.319 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2456 0 R /H /I >> endobj 2458 0 obj << /URI (http://hsqldb.org/doc/2.0/apidocs/org/hsqldb/jdbc/JDBCPreparedStatement.html) /S /URI >> endobj 2459 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 293.136 403.4 302.136 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2458 0 R /H /I >> endobj 2460 0 obj << /URI (../apidocs/org/hsqldb/util/MainInvoker.html) /S /URI >> endobj 2461 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 270.953 290.89 279.953 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2460 0 R /H /I >> endobj 2462 0 obj << /URI (http://hsqldb.org/doc/2.0/apidocs/org/hsqldb/util/MainInvoker.html) /S /URI >> endobj 2463 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 248.77 351.74 257.77 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2462 0 R /H /I >> endobj 2464 0 obj << /URI (../apidocs/index.html) /S /URI >> endobj 2465 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 226.587 199.22 235.587 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2464 0 R /H /I >> endobj 2466 0 obj << /URI (http://hsqldb.org/doc/2.0/apidocs/) /S /URI >> endobj 2467 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 204.404 217.01 213.404 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2466 0 R /H /I >> endobj 2468 0 obj << /URI (../verbatim/src/org/hsqldb/server/Servlet.java) /S /URI >> endobj 2469 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 182.221 295.86 191.221 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2468 0 R /H /I >> endobj 2470 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/src/org/hsqldb/server/Servlet.java) /S /URI >> endobj 2471 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 160.038 356.71 169.038 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2470 0 R /H /I >> endobj 2472 0 obj << /URI (../verbatim/src/org/hsqldb/Tokens.java) /S /URI >> endobj 2473 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 137.855 269.76 146.855 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2472 0 R /H /I >> endobj 2474 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/src/org/hsqldb/Tokens.java) /S /URI >> endobj 2475 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 115.672 330.61 124.672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2474 0 R /H /I >> endobj 2476 0 obj << /URI (../verbatim/src/org/hsqldb/server/WebServer.java) /S /URI >> endobj 2477 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 93.489 312.51 102.489 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2476 0 R /H /I >> endobj 2478 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/src/org/hsqldb/server/WebServer.java) /S /URI >> endobj 2479 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 71.306 373.36 80.306 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2478 0 R /H /I >> endobj 2480 0 obj << /Length 2481 0 R /Filter /FlateDecode >> stream xœÍXÛrÛ6}×Wà1™¦ î$òÖÄušLÒIjÏä!Í-AŠ”IÚŽÿ¾ ^$RAÖžIëðàìâ`± ùfAï_í#Ô -·‹›vŒ¢!®Ú!© ±"Ú¢¶É¥8hZHÛäõh‹n:ôy‘-z³øò@+D°D÷ â74‹O`\*ÌU¤µn}e˜F‘5Á±‚Ær‹‚·[†ÎòÝyo‰Èî}ß#NÙÿÂ#ëS½çõ®3ø q½õƒRá›^XìÇ£ð+0oÆ`3 Æí«´Ý‰öi_tMY¯¬yŽ®¤¥êM>Öµ^âÏ4NÐõâÕå"8—ˆt¹>œ¢ÐN¤GLÛ/†.·èË3¦Åó¯èòÝâ÷K' ~²jÎFZÛ¤á#T+ŠŠvm1:X[TZIB•ÍÂ~ÛíL¶J~ 3ŒþxØ™ââÓ{tž¤½O²ïe³h«VpN¥"ˆsJ £$lè%*ÌÚ…Y¡*GI†ªMR¢7·ÉÊ4¼'䇨•8¤8™<â|bÅ~¶®Ùý½ÃXìo\5Fë'¥¥amúæMú®#/„C1ØV)æ˜)ØW"tãæŸyeöì€Ä‘”F¶1.¹cø«#) ËC‚*(gP:ìÑÑÚ–ç0¼Ál‘Pz0’Ú‘KФ£'°#Vô˜¸éŠÛ±ÁI¹ÄR@ÕS­v€ôfxa©˜ËÎŽèûžô^lQ½ŠVï82ðéaL·Üsíоܳ“nô÷ähŽ÷!ŠÑŒ8ZŒçwˆD2ÌC@‡Q‰o×pÌd&žÙÓеí©èÚÝéèúõ)é:Ý ÞÜ'Õæ@³o•Uœ­â4ϼÏÎ6Lñbßϳô¡gð0©Íî90Æ{TzHàƒÕs2\ý}’¦h}›-m:À]f†#ÌŽ‹‡„L£!Š·©ùcœ%Ê×u6IÑ/hÔ3T{ƒÖ‡êdm²%$Ò:cO1 "óªÆäߌɣEÑS¸÷Ö£—èÊ#ˆ±º®‹sŽÑ¢î_ ¹ã Þ% FXY…‚o««eðîìÕë×y–™f6Õ6uWȃ㵎mÓüh<ÞØaö*p¼«é§wqÓŠ»s|ŠÏ@s÷„âgErgŠ1µ\m™‘!ŠÚãFÀ¤Oa ·à‘Wi7CigŽWéi4÷qO)WñU\š¦Šm{LsM±Ôp£ˆž&ù kps…ž¡Í‚ÔålZzgŠOùi0÷0Oèþ—)oÓêÂT#‚s¨šZ1B¤bOQÜkÌ@9¢BÀP¯Ön†ØÎ¯ÚÓhîãžÐû®ðÆÞÆô†¢ÀYWfý¤÷Ú!°b¸lQ¢¡ZpŸÞ.nZowŽOïhîãžÐûcavpG[Mé.˜ÀÊÞ[OÑ}–=0'ŽÂPûyŧ¿ƒ›¡¿3Ç«ÿ4šû¸Oë[%ið!N²·Ù]þ}´„ÚODÚTP}Ž05ƒ N(Þ<îâfhíÌñj=æ>îžÖI¶2?FT•PS„I®çªê¨&!ñ+¢¡Ò†Ú§š‹›VÍãSmšû¸A5¸_]ÅU² ÊbÙ Òð*¸€G ¥é[|ŸXaý‘†;”óñ†ÀN¨±œéWÜÁÍPÜ™ãU|Í}ÜÅ/áœfåˆÒ²˜Êˆ0û£G*=nø!ÉsA á‚ùvqÓ »s| Ï@s÷tL6WukLkÈä’q¨¤Ñ£µö˜ªÿþiñY°[t endstream endobj 2437 0 obj [ 2436 0 R 2439 0 R 2441 0 R 2443 0 R 2445 0 R 2447 0 R 2449 0 R 2451 0 R 2453 0 R 2455 0 R 2457 0 R 2459 0 R 2461 0 R 2463 0 R 2465 0 R 2467 0 R 2469 0 R 2471 0 R 2473 0 R 2475 0 R 2477 0 R 2479 0 R ] endobj 2434 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2437 0 R /Contents 2480 0 R >> endobj 2481 0 obj 1460 endobj 129 0 obj << /Type /Action /S /GoTo /D [2482 0 R /XYZ 72.0 720.0 null] >> endobj 132 0 obj << /Type /Action /S /GoTo /D [2482 0 R /XYZ 72.0 161.972 null] >> endobj 2483 0 obj << /Type /Action /S /GoTo /D [2434 0 R /XYZ 72.0 547.649 null] >> endobj 2484 0 obj << /Type /Annot /Subtype /Link /Rect [ 323.76 484.467 407.76 492.327 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2483 0 R /H /I >> endobj 2486 0 obj << /Length 2487 0 R /Filter /FlateDecode >> stream xœÍÛ–Û¶ñ}¿‚gŸìž5LðN÷ôÁ‰›Æ9Išd7õCœJ¢VL(rMR+ïßw€Ëd¹éIë\<3æ`fP®¤çÃ?/Ô_ixëýÕ¢I/ ¼0!Rœx2‰Ÿy{,μZuª ¡¦RoDvÞ»«æÊ÷þqõ˯Ðiãù"öŽWþŒ9²¹½ú„lj“,ÏsÒ52Ë”ˆP$¬÷ÞË·ûÀ{ÓêÞF{ÅÈÿŸkÏ5 eð ‘ïÝ_}qwõò«Ø“¾w·uK ”"‹|ø#c/a«?w·÷~yöÓ¡iªæÞ+š÷s¯ ¯ŸÊîöÇoŸÿêÝ}sõ÷;2VsÒË)€S¡×Ô¨!Žüq [o–î¨ð_$B¤E1X¥šjšbú[50Ö.ÿOºˆX±ÁÓ Ó¾û3…Ÿž›4Š&²Ñ¬„Ìùãuö'ûl6J¶ü|™'ÒëȲГÙÈ2‹0ÏÕºKѬ·Í‹ºv]ö½÷z­ÿZïM1«¢/½/¨ÛûmW.[ð—ïE¾Rªåœ®ÞsïE~yv_6eWÔ7–ðÍ›/¾´HÕ[ðЗ‹lÛÎÂE];u4(èjÀ éÜ KºÛ1ö Ü´Mi‘Õ“÷Åïj·YYZ·MS®‡ªm–$»r¦Å om˜ ÉÜ÷=]Õ”Â),†gûrص‹¶[¡d "Ó—_åÓÙÉC§™ïy8ô[ñXˆþC-¾´F³iüô '«Üê7àã,,\Yºr8tžmìÕÈNïÔ<åWa×ã^nt3õF25" ÁE xs#ªæÅn†“^ð½$šŒ2s®fZ„4‹~(º×6Q¶]»g¨Ú7 ?VÃŽ¡´¾[öPŒú÷åºÚV#‰Us’áxqñ矾 ý ·#aåÇbÿP—\åj{’ÿ鹈! B,’QϽº­êòÕ™iH“ÓÓ s‘yÏšbï=#^e?lV×– ­í7¸ŽJ‡ãV·ë§”F5Dãî¹›ª7·Ý“ãè˜w%cÏy¬Ûýž+¨—;‚ÝÁ‰}jcüðPW ¡ÝÎÌoY6ñÛÔ¨úþPnn<%xÛÖu{TpÝnJhòtdVY5»åòÊfD_ä‘”©JTyÄ!•„Tâûöì7/J!ýH‘x`èrØ ;5ÏEŽÍ{/Jò¥VΡöÆmò4‰o’CµÕTã"ÉÔ½SÙ¶+TÀ±"I£üár}Ë`.%˜ˆá±†½‡öð®Ê3…8áAÿ %N*‘Œ:SÙ¤ Ÿ­éäL•û¤.ß eæ[¸åÞ¬ºñÕâ†'‹$¥%Ïe6oíýÍ{ÓUe÷]Ñ÷e'îËÁµ¿výÛfµ~µƒ„¸Y½ÒˆBÅw}ûZýÿúýó¿ž Jêz?L!GÆ´»î0¦,üQìFŠâ0È©­íö:}¾Öù6 øH҅ƈձèX{_ýN7"TŒ÷»ªÙ´GÖ¸kû¡ƒ%Vgó–o«æðqÂC8ü¶…&…ïue QìQÙèÄ®<Ô[Lg¥¥ª;*7¶¥ë¨ãgÀê „)T#ÂC5Ij.ÕqMq¶^9rµ)›bs-,é+f¥V×}kAŠð­‡ÔJšû0Ž'>äÆÄ¡kÍ$QCoÁ“õd¡!óïHé‡î°†ÒÛ1X¨dšÏä\pøMUMéÂÐ/OWpPˆ§R¯C¹0ÐÃÍGÂ3áHEO¹Cí-(Jt=¢· ”«¬êU scº«¢I/ï‹ê”\Š0Câå:Eæ¾È°Ý&IG¢Äëx`òãø%‰úK"Ã’&uÁ\ŸÀ”Ôyž>ˆœ>C!S—LÅ9\'Ö@ÕÁ¨«>BN4.p‘bø$ÂI%Ò¨V™k3š°éüLµ»¤XyI3眫VrµêÕòÿNµ2ŽBW-A !(Ó£yGq1€`ÏŠ DYR&ŠN¾7‡}ÙO›z¬°d@lÅ:Åï\î\ÞºX!;$UŒÓqW­w'†BÄõqç­™ú(?â3‹ŸANœùMñXxÿªºáÑù»b½«šÒS§®òc¹>À1Rx?é$)ÍTÿM»Ö'®“q7ˆb‘BÎaµ-Èô&zpÖ>Ó]Ý@L¯€Ü]u¢ ÷ó4=-jé’;’g*÷-„ÙM %BÝ‹¹3c8åG‘/Á\ôƒYKp†5'w„Ç#>V®ëÖ\aø,ŸóqŒkçZq”Âu[à}Ùô•Y¤š|45…¾› ²„ŠñšˆaÊr۪뇹—’lâ¥ñNèn@Þ›Òa¸ÂCvõ@ˆÑX8Ò‡±Ü:¸p`_‚üÃÿsm 6¢}(›¹j7ŽdÃÔL!S³¦L7µHæÍü‰CÍÂÇ`³…íÚ[¼mê'‹è°ƒàšôCŒjM‹¸nÜ=ÄÄ1'çаv‘Cù±ê4ž4z`²ø,"….ÆI@YôXÎdƒZeß³nU®‹Ã±#ȃ‰ÇÀ¦SªÇÖÃ< vWùáP=5”¬ó=ª÷”ò.¤%dõZ׫ə«Dé‹0ÓÏiraü¾ÜŸ®CÃ@Ä9½Ä͇É|ï&¶òO¦‡oEÀ…Ä(Îk«Z4ô}õüyšË4R=Re á´ê];´ëV85.sϪ€[BõB@•ö™zAa .…Â&’Ñ.ÅÂaâ/³c'¾®àplÝ[@íakÝmù¨Þ›>ia¤h–‚–aö¹Â"U4%:îaøBDïQ‡ &»¡+ÓTqŒ""Üó‡ FÆågWCuBÛœÐÁÝB¦eÝoNôæ{)ÕÈ u]næ»<Ì&¼Þ?Ó¡l½ä¼¶I"½iÏkª]b»9(0>]ÿð #ª˜Ïdi|6ZÒ' DªÊ£àÇ/W‡Nf3!ÁXÊH!K§Ó靖1Õ†á—øºG²w‘2:¦ÍõàÓ4•‰b—ÒFN!ÒÄ'gÎha¬–)=zþÑ3šŠ)f‘_z6 3¥²„üàg.Æ©HÏĶ,V/$ñÂø®ìÏÄîH$9d#?͆ZɼúB ^jgD¤è˜„ FŽOè/!8H%Ùϳϵ@Æ¡H}èùá9xZDÊkgB5,VXHé ê´‡nÍœÁdÑ‘cj»”»ºÚ2ð{•«ºèœ¤– GÙ<œØOÒáHg>b@°°Ðº.úþýsa :MÐmÂ.I ns¢×à|dE\[:çÒµí`z±EDæ0Àü‰}ì䚣¾Q²Â§ RbÙ~{@Ú·ÝýË™;#?ž¸sÿôRyT™©£œ¾«ÖRE)kÇ’ÿ‘ò^­ÂU±Ò5 ’ØØÂBßN¢¯YãëeÖ¡ãÕ[°ëô†<#eÝî€GÏúÙ'(êÛl–˜oJ7tî3™N|†3qŒŸ¶ìéÒqsxFLoC÷VÒ¡TÐ"2ìxO8V÷msã…O‡Ÿ 6T’@aä úŸ ~(B™B¾ £…±N:¯šÒïÚC½qxÓ2óéÅ ܳÁž=4³\o&‹um6Ën-êcñÔÏg0Èg(6/Ô©W\PªE¤õ$ñår¥¦š}Ýl*GÁÒÃ1¨½¿‹*Õ=”SþH—D š¨·°$Î3S2*‚.V†ê±©`"e¤k âhÔUB3Õ‡.ñô$‰pR‰4ªÔ´a5™˜©n—TjÜ5D™zæL¥EÊ™PÕ¥Ù.ÔÔ‡ öOBÅk©ìÒ’-J!Sò˜ÅtG0í¢s¡HmLõ”Ÿ.°½àsµP¤ÆÇñ’>º€ŠLPP]>EæÝ<¢ÅãPá}kÍ¡o>YGÓǼ@xÕªe6ÕPu…é'²qЋܖG‚veýPvóP•E‡ VúJ+7âDå B_oüF Ç rC°¾—¥›¹œ‚ª¦[—YÖZ[Ý'^CÅ »Ü~õª@÷9çˆ%]è-2§—#Ê+6öiîŒ<™8ƒ.¶‰¯2ø”¦ „Í=ŒF¨Ä Œ}YÆûŒ]×H¼¼4_Ô.pÖ~7N ]oü–s/4H¸¾ýúç»7ÿ|÷ýõ²æåfÄ}þ®úzhä¯ûª³Úc«VÉŵ癕e>Œ³ ½Ð/0¨}‚6ú"ŒÓ<•’žý¾oñM?Η ¦{e‚m3# ¦ýoP7Öö07H ¦ )ÂÌXòé[@bªŒà ÅÌ\ï âO§ï,[F‹UngVÜCèn>©o%" ¡p #¹ òü'¥úVJ?²3úŽÞDáëö¨®o Ž"8—åIUÕo3‚ÏÒOª^õw›ra¬’J‘ K¤ìðÑ ‘UIÏ(³O/³uÝ£am0½÷hx2oH¤³Ä›žu°›O¯½Ü2 ¡ŽÎƒ{Ïá!œÓÒ0T¿r¸ÌWÌ^óIY<0˜úÐö}µªOØg6×'LŒâDd*»§qº &l¯yðˆ£I¯Oí@XÈP«ß±D £=>ú³ôý¡*u®×a†¸—æmvú;“řĔm>s[v°E¼ïZˆ‹Ÿø-Iâ«7Uñ„ôËs¼‹tFiñ1–Žðɧ/ÆB÷ñÚ\Ðñ Nu"C¨¾YŸq`šÙª ^1x[ô êÌ)ï!bn3æpÑ "¸—Þ‰eþlXïö±ìNÈkÊáØv¿ G¹ãÍ{8Ζdø/lºâ¸*Ö¿«Yâ~°ÉpÔ2,÷"ûá» )øÊð¦Ü°h™„ÖÁ´¾—ÉvbÃâ&RÌÏ4kC_mX3}I[ŠÂQ_3“ Bôç®T¯n#WÒÇa."¾É-„ïJt2¢îé>Âû‚’.ÒnOt% M1?@A¬ü«µÁ'5Þ¶5ãÜÖ¬{ÁZÞÌXÓñ‹ÉÚÑLj§¯3?dH¢hº{¯ÃßNº{ õ{¹Q:È¥ endstream endobj 2485 0 obj [ 2484 0 R ] endobj 2482 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2485 0 R /Contents 2486 0 R >> endobj 2487 0 obj 3953 endobj 135 0 obj << /Type /Action /S /GoTo /D [2488 0 R /XYZ 72.0 572.571 null] >> endobj 138 0 obj << /Type /Action /S /GoTo /D [2488 0 R /XYZ 72.0 445.484 null] >> endobj 141 0 obj << /Type /Action /S /GoTo /D [2488 0 R /XYZ 72.0 297.254 null] >> endobj 144 0 obj << /Type /Action /S /GoTo /D [2488 0 R /XYZ 72.0 133.482 null] >> endobj 2489 0 obj << /Type /Annot /Subtype /Link /Rect [ 339.74 574.071 504.42 583.071 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1805 0 R /H /I >> endobj 2491 0 obj << /Type /Action /S /GoTo /D [2434 0 R /XYZ 72.0 192.721 null] >> endobj 2492 0 obj << /Type /Annot /Subtype /Link /Rect [ 484.378 213.868 539.998 221.728 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2491 0 R /H /I >> endobj 2493 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 201.868 228.0 209.728 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2491 0 R /H /I >> endobj 2494 0 obj << /Length 2495 0 R /Filter /FlateDecode >> stream xœÍÙrÜ6ò]_ò“½%A$xçÍŽ7»’­$ÖnâÀOW! àïú•‚íÛ«O†²L°(5¤$eaÆÓ g-3Hžä¬Q êbÀHSMoDŽìç«î*`ÿ¸úåWèT±€'ìá*Ø0G6®~áIÊ£4/ŠÂè*x˜çJDÄSö-»}× ö¶×½­öŠQð?מj…âÿ@£€Ý_½¹»ºý&aaÀî~ D!Ïãþ„ Ëy$ õG°»–ýòò§¹ëêîž•]Åþ5*èÛÇ“>üøÝ«_ÙÝû«¿ß™ÉjNz; ø—q½§ I,[È~stO…ÿ1.˜•jj̛ߪÁ‚‰6þ¾h"Ê ^/˜¶Ý_)üòÚd W4ž/V%&Æ_Øf›eT²/Ï&Øì¯rø,öŠÝ ÏØË¶¯äèÑÓЮ+é Ó‘ mù{Ýέ'”û½ÇzW7õôÈ=ýŽŽªÊ©Ü•#¡Èî¾î>Ìѡÿ÷÷„ÇÃ!ýIÒñ=eÝ/æ:\ÒÛoÒµÑb¸óNgœnÏgÝÝà@bc¬:•]¬„íËëþñv°Ò0LyÌ^îÁpM?rOz7y¸©ÇÉL œ¬ÜwÜOu¿è1ô­Ç@Íû¡lI{ßyج<"cÙJÊ»=Í“$Ò¨äFÛÎÏÓÉé¡þÃ7&Ž"ucæZ 1 e76åû˜Àþ¢S®»©g—8ŒÕ©›ÇI¸å kü¥ ó!0ÈÃlË`¡ è¡æhOÁ¸\ñ8S{ Éì!…3Z6`—\ðNP}8ÈAv“£¥C¾ì<ŒÒ®,aAmm„G{ ŠG áANC J8BïûÍ'˜Šo©;Øvm©æÊñõéÔÔûÒî¾ :|¹oj˜ÕøñÕÆ&i²²‰Ÿ\ѹ™”õ¤v“BtÖ.ô\GëVáýÛ7_;¤j`Ãþ®s`ÛÓ%qú6½~Žb¸^¤Éa¤a­'Y9J7·;9l¬•e+kõ¿á`û•+áîOr_jà¥ÜTñ†¾ƒ‰: ½f°äýI­`Ù4׬YIö5ä§Y‚%êÀ½sUÛ]ä< áœeQˆz½6÷oÈp“{T™Îcõèá²{y‡ª-%á` ²ºÄææ`;Éó¬V^JQæaѽ…›þÔŽ垊7²Õ´éˆæýL¤‘I€é†Ç…"Ó…„,mç4Ô·x u*u]ºc6OÚ³‡cÝHJ ¬ôR¯šb»`!ĦYÎO¤JW®½&¨Á <é1·¿u'Q¥^å0}ÿ[&ž\S¿ïG˜é ônƒOiçŽÜ0F ¸)Ï3Ç«ÆO¤«Vªs‡Ã”錷VŠ£••vp]šGVÕã~•Ú;Ø+œ}¯bŽJNeÝŒ æ²Fµ&ÖªÀW郷#ÒŒgœé@Dg$nºgàÒ.ww×Ý?ÑŲïtô Tùh‚Âí5‹‚[?G…aüD÷ý±”s3}|åhäøÑ[[Áý²´Õ<ÖÈ:È6*ö¢}¬vüo/t-D)všwàÄt« Z^ü^í^pv·j9ÖfL1Ó´]&,í`ÃoHå^Äa˜© »È$dS÷Wê.…å*žJXœ)W ‹ ×ø’ï›2téC†í-‹ÓbIj‰òhØ’§Ëûy„E®Ó##äXÉp$[²Ûw}!©ˆ2ÈJB«O"x¾ <_!ÅRœ#Vr:ù†–áŒhWe‘F”ðÃP^ª!YuÖ²­6tÁÖë³Öî‹Ê¬­cHkã¸JMÁò•ãq΋4€Œ2‰¿d¿•ŸKv³?1Îo›zw{?5p$~ƒ ´î¹AÍýb*;77öìñ@Ÿ€¯Ô1Rä: @„có„UqD§A`“Yu¾ìmÓ¨²M9ÜÏ­Ž¥ —b“Ø‹@„ñ–áÍÍQ6§Ë©u¢ 6ƒ™Jœv’ékœÇ½„Ô†©RˆºÀ^à^vWr|*ÚEÆ#Ø8yœ§ëhãîî‡/G‘ªÞÀ È¢e´‘©rF+Á¥UÅBƒ&R·(cýFŽ:šEÄ„ Ùº£ à:Í•¿íLCMðÉZúáÇPï'¢zè Sm ‹Øƒ;ÊÝ×éB µVß5:Ò(»13¾š…°Mã3Ñ"ÎÆˆj#èlŒ(cgi“loO½É74¾óšêA>@rç;=M’¡aŸdWCЧG¨u¹?ÂYò M>‚šL[ÓÅñÊt㱟5&T(Òõ“ƒwÒf7!ò`R9ĦV¸ë8Îû£C¨Ù¸£b8ƒ0)ªîD\íQ½ Fº¨Jºôet–;ß¶¯ËŽƒN½·vSoZ »é2©;© ÄÖ•>×¥>ôPQê²Ñå‡zè ÈØ‚$¸u:U »9̓Ú4Lii†¨m AÕáÈ©¼?Wî‹tµ& ‚Ô¤8wÊÞÂD˜,dl(¼ ®]yjʽ´(nE ¶eíì›RŸá#ÚuwgZù¡¤‹LÅ2´×hƒ}A£k˜°qÍ;_=#‹rðí¸Öð|<¦Úl·!apAxhÿ¾ÀŸl¨þ¬eÒ2ö9£O€ÒŠ”}!¤„? ‰½6bÄJÕ‰4˜hÑU¥ïk„g˜Hõ#ÂK5¤E<¶Õf±`ëõYk÷œxla$mŒóD<Ala‰}˜9tý,w_ âˆ&ϳìÏ ©¶ÿHLµý§Uqœð$K!ΓKAU#§§ –æLµ÷Ò¶çžpçÞSÿ¼9vY œ:uYrFÊ—¶r(§†{ùÚC_{¼î<ãÓõ.Ê©Åñúô$y¢^Ég¢Æ4Oçúý}m&«>KPs}kWá‹wªëLQ‘ÇQ޼~6ÑZè/]> endobj 2495 0 obj 3322 endobj 2285 0 obj << /Type /Action /S /GoTo /D [2496 0 R /XYZ 72.0 696.0 null] >> endobj 2289 0 obj << /Type /Action /S /GoTo /D [2496 0 R /XYZ 72.0 550.782 null] >> endobj 147 0 obj << /Type /Action /S /GoTo /D [2496 0 R /XYZ 72.0 458.364 null] >> endobj 2292 0 obj << /Type /Action /S /GoTo /D [2496 0 R /XYZ 72.0 289.746 null] >> endobj 150 0 obj << /Type /Action /S /GoTo /D [2496 0 R /XYZ 72.0 212.019 null] >> endobj 153 0 obj << /Type /Action /S /GoTo /D [2496 0 R /XYZ 72.0 137.207 null] >> endobj 2497 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 710.1 156.0 717.96 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2483 0 R /H /I >> endobj 2499 0 obj << /Type /Annot /Subtype /Link /Rect [ 377.481 471.864 539.999 480.864 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1805 0 R /H /I >> endobj 2500 0 obj << /Type /Annot /Subtype /Link /Rect [ 125.828 397.052 239.077 406.052 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2057 0 R /H /I >> endobj 2501 0 obj << /Type /Annot /Subtype /Link /Rect [ 319.892 315.246 422.819 324.246 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2041 0 R /H /I >> endobj 2502 0 obj << /Type /Annot /Subtype /Link /Rect [ 446.228 315.246 537.495 324.246 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2057 0 R /H /I >> endobj 2503 0 obj << /Type /Annot /Subtype /Link /Rect [ 273.9 213.519 438.58 222.519 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1805 0 R /H /I >> endobj 2504 0 obj << /Type /Annot /Subtype /Link /Rect [ 338.61 138.707 503.29 147.707 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1805 0 R /H /I >> endobj 2505 0 obj << /Length 2506 0 R /Filter /FlateDecode >> stream xœÍ]sÛ6òÝ¿“'gF† àGnî!irWgÒ´ÝéCÝФ,¦©TÍMÿûí ~ȧæ:½s?„],°‹Å~a¥OŒxðÏ~„1'éîâ“Á1râ%ÂBxÙD2"%ކHb†¾Âj lÉÏÕ…Gþyñ˯@”JòxáÍ6×ÛÜ^üÌe@ý ŠãØÈÊ)‹"dáÓéŽ\ßì8y]+ê^zÜÈûŸKïJä3þ ‘G.^Ý]\ÿCæ‘»5ŸÑHxðÇ$‰¨ÏcüãänG~¹üp¨ª¢z I•‘ŸZ}{ÜçÍíïžÿJîÞ^¼¹3‡U;)sâðoH•M&¤ðÆ3޽ x‹…ÿõ50”K8N•æŠÍ'NôC©T¦?OªÈlå,ž^˜ÒÝ_ÉüôÝ„’"ŽF£[‘ŽòÇvöëlvÈ{8M<=7³¯·¯_}óM]UyÚu¥5GbFOž“«¼€\jÚ•Å CßóxÀ—ûLíòþ²¬Ó¤Ë3‹**;î¶¹zV³ó0)(½8¼xÆë:«Óëd_ÀG{RX΃Ó;X ²¢ ÕÍÑ¢ê þøú•KÞvM±> NïŸS;ñÒÓz·«ç_’ݾtN]´“ëð÷&¦ÃÕ‘®&¨´,ß$‡²#ûºéÈýe Qåþ99´ èMÝ(’^ÁLqLÜœ' ¼ÏxmÛOå‹ÓŠdO­%û¦îê´. J 2´É.'»$ÝU>lð ±½ I!?âF¡ÞéQ£Œ’·É焤u–ãé.zE yGÐä6o>çÍà³c!ºRr)À¬HópüdD%ã 2"B𕈪°ÌI““ xÚwOÓìˆâ¦DŒ³KIF›N¥Çâ€Mý¼ßgÂ'\\œ‰Q‡‘¢…Må!ÎÐnÈÃÂr5¨^œ)o#{Q“‹™ÊöE™¨FcfšqBq4±ì   =$ˆ¥ñÒA|ù×Ìé!Eh†¾7âß7eÒ¶|ú=¸Òý峺y híÙš~ÌÖ)ÅÈþº)ÀðŸ‘ûç›mIjŠ¿ßöw9ÝBØxó%Í÷*¬ä=æ2Å#Qnm—ïhÞ4tßUWV Ï›¾ÿð‚l’¢„ØNYÖIFL¤DáH¦¤£Ï–¤cž Õ‰Ðe•k·]’þv×$)œ|q9äá©vñ¯É»CS-Ðs¦äßçTbP•Í™$%'ZÑß%Uò'zÈ;;ªÀûx¡ïF}¼¸¾VÑi[·Ýõ—lýlEžÝ¾Äÿ[],„X €rD€ ‚1o6*ØõE!ùöîîÒªxGŠVÅý•¢0`O&ÎÐP A°ÀlÛuû'2€ïê|±*aQ’Ÿ>¼#EY’5d«b³É›¼êžÊ,fàh M5ž&~V¹ÏOÜóiˆ)'PY€1ŒÎs=߇ ¥Ãš³‡Š-#øŒ0‡ô"œñ0¨qÔ]’‡ÁUø*uyáç d¢þŒ ŸðÉd'Lì‘*S›Jä"ÎQÐËȰ°\ j” ¤q/lz?SéÎÉ#íÔT9O$V&XèÔ9ÿMˆA7ýÚÃ}ŸÆA^,Líö¾îTU*|Êú"]M‘®d]v@§2pàù«ÑêÆÝ¸µãª¶ãD‡Ñ.ºð^ Kºd´f¹ÇᘴîJ—á£;Õîó´Øúibæ·¹#Acå®óZJ×±"uXV¯¨,ÉåMi3ÉVœF÷‡uY¤Xa½ÜPãCÙœ 0öÃÜI©7 ô1Õ³eÿ²lkË»ÍóE9&ç‚ØN!¬ÇQ(åÂO/ƒZ)à B,,ÒW¿ü}Þ=ÖÍoüTy•7ö,÷—: ·÷Ï窗á„AºMö¤Äþ äX§JGx½ÚA]»>»mRÁcRToU âYáæ’*ÍiïH>$¼©#A5<ˆ”·yzhŠîˆžÝYÞ$(Àé·©§Ô†$>&ô?kC”JÉ0r(Íu*A{P‚ñ® ôlvLÓ¼µ´í¶>”Ù®sK˜åŸð|/ + Щ61º­MjÝüà¬Ïà”[^»ä¸Ä¨à)ÛήÙçÞD;kÜ‚ÇÊÒÍHE 584f4ÙHBéÇ1ô2¶°å‰5õ|Xñ…%/{%âB¸ë®²KChÇf¸É¨E§qƒ‚FAVãÇgKÂzaÇ2’ ‹Vf•½lÅ¿(Á#tC¸­7ÝcÒä«a¾É“²<1]÷ÚDOÈ’]e¼°¥ñ}Uç—çó‰˜-º‡ <±j0íá}òf­E öhàµCŽÁíêÊ»Z©Ú@Å" ¼MŽ+‹5nÌÏbL\] í»,V2õIÓœ'7„¦êaɺ…˜(hÓÔÈ{½08²’ ”ïöÝÑŒÑoªj ›ëƒ%M¿ÉþÐìë6ßʲ_ Þü¹ÈŒyx:¹öÌë™:[­,¾š‘i˜û²RÀm_M¸vÆ?çë[û°Ñ¸ï«¥eϹՉY,ÅíLí,3]ÅÉdúµèŽÝ¡‘Û¶X[[(Îë? É©' ¼ ½Ù—þ9ý'ÄQõ}ÚºÓ“jÏhJ ¨ Ã@‚ª¦g”«æí¨3…D\õ-¥Û,ÎF%o|VÛé%›ñ0¨qhIž(— ì"êƒKžÕ™š±á>#™ì„éHQ#3‰\Ä9*‚ 9 Üï(Ô¨3µ {aÓû™JwNgj¤ƒš*ç‰Î”9\ íÏh~·ç´¦\"ð>éÇ‘ þ”ÎØYü_ãÒÔÇ>4¨T‹‚ |ÈõæA׬«³¢M-ÖžEE²¼KŠGöëW›°=FñG61<øææÔ@q’z(]úþ‰í›œî—ø` ¾ež!@l}‚Ü´ZžjHŸQŠ8”}C_ÿ´å;xÈW_›žËS½)%:ì"êßÝ*'„*ßÙ„º‰Q¦œsf{i-Ò¤5V!;³uwÓ_ôÍ"jQ7•»Ò¡5_ø;,U uõlÛ¼sf6syf^%ƒp¢=ljYðeÑ+Ì>§Ôp\G ¦¶týéÔúz·3%‚Ë¢2JA覆…åÙ?ïѶX—vÇ®žHqt–‹Bô§·, +m2ŒNþ¼Ä|pH´14FÁÀߺâ ;"~j‹AÕ©žßROºgLêécj5kõêÇXšì“uQ(—ŠE)XU£#ÑRü†zxøráœ(N“Už¬øHˆ¤8Cáƒ?An"^…k† µ” H³ïâ½ByçÆõ6À „*ÃxÔo÷°ŽŸSž;œÅ¦H|©ÌŽù1Õ û±ráÚ6I³rÀÄŸ´M4M¨=Ÿ… ¼?BMJ!çÑéo»d‡EOmåS¯?š*Ü ÷ˆIù˜]Dßz1`çÙöYúYí·ÅQƒ{uèNÒCDñŸ˜9S Ääh`ª›ºÙa'rô>¯²¶ÿ}RvŒNfSýàòß$Yz endstream endobj 2498 0 obj [ 2497 0 R 2499 0 R 2500 0 R 2501 0 R 2502 0 R 2503 0 R 2504 0 R ] endobj 2496 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2498 0 R /Contents 2505 0 R >> endobj 2506 0 obj 3111 endobj 156 0 obj << /Type /Action /S /GoTo /D [2507 0 R /XYZ 72.0 270.4 null] >> endobj 2508 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.685 296.5 230.247 304.36 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2483 0 R /H /I >> endobj 2510 0 obj << /Type /Action /S /GoTo /D [2434 0 R /XYZ 72.0 503.283 null] >> endobj 2511 0 obj << /Type /Annot /Subtype /Link /Rect [ 243.772 296.5 308.334 304.36 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2510 0 R /H /I >> endobj 2512 0 obj << /Type /Action /S /GoTo /D [2434 0 R /XYZ 72.0 458.917 null] >> endobj 2513 0 obj << /Type /Annot /Subtype /Link /Rect [ 321.859 296.5 446.421 304.36 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2512 0 R /H /I >> endobj 2514 0 obj << /Type /Action /S /GoTo /D [2434 0 R /XYZ 72.0 414.551 null] >> endobj 2515 0 obj << /Type /Annot /Subtype /Link /Rect [ 457.446 296.5 540.008 304.36 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2514 0 R /H /I >> endobj 2516 0 obj << /Type /Action /S /GoTo /D [2434 0 R /XYZ 72.0 370.185 null] >> endobj 2517 0 obj << /Type /Annot /Subtype /Link /Rect [ 85.12 284.5 170.617 292.36 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2516 0 R /H /I >> endobj 2518 0 obj << /Type /Action /S /GoTo /D [2434 0 R /XYZ 72.0 325.819 null] >> endobj 2519 0 obj << /Type /Annot /Subtype /Link /Rect [ 191.234 284.5 324.731 292.36 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2518 0 R /H /I >> endobj 2520 0 obj << /Length 2521 0 R /Filter /FlateDecode >> stream xœÍ]sܶñ]¿‚qGfH‚Ÿ3mgdɩڱ)ÍC’è§cÂ#Ï$O¶ú뻋]à‘G)NšV¶GØ%°X,ö€?œ…^žã¯¬ˆ¼ÕîìãB/‹<‘2*I½0óÓ ÷vy’{v5± 7…Æro¶ÞgõYàýãìÇŸ¡ÓÚ üÄûxLˆ™ë³oaò$õEšEÁ¼F~˜ç8…ðSh¬vÞ—¯w‘wÕèÞ†{$üϹw9aôÀQàݽ¸9ûò«Ä ïfcU@„~ð&^ÀŸÈ»Ùy?~ñÝ¡®ËúΓõÚû¾ÃÖ«‡½j¯¿}óìgïæë³—7¼XMI«S3_ëÔèCã/޾ x‹…±/?J`Uø©â-æßøÁ4-2ú}RDLÊ|¼aZvæä§÷&K|ÄùùhWRGøc=û“e6ÙFœûôj‚‰~½ìzy[•ÝUë™—æ0árh­šºV«¾ljû4qø\5;°ì‡æVvC»kvjš{Õn•\wçªßªVmšVÍ*-º±è»¦±|ì[ L®ìø¾±<¶Jöjfmµú8³NÚYGbQp$2Mû¹Hý&V-ð½³i›ÝNV•ëÃîVµn6NèHœ½ó-òÂ6GÛ`Èo›Cµ¶ð­²íV:å|Ó{ÁíÝaµÿ²oº®¼­:´×† Øl—hSWú¸USÙ‰È[.Hv°¯°Ÿ¸w *ÈøÖÌÊ;YÖHÓ“^ÕÀ·Û²Rþ„f"ü¨@o9¸H\,î¤mÁÖŽõIcwû¦íeÝNÃÍNµ÷j€¬¤õVhÜÅc] ø¦—¦qsùÞ4‘‰VÍnw¨Ë•OûRêÒí¾Ü©‰$ÒäHZù²<ù‘ÆNˆÛ;¹VçtF2“3c@`’t€P·¶ VlÖhíÕ=t½Ú9äj‡ÐZÍP—›ž,ff‚ÇHÚê[ÄëÍD€Yv$À¬iA‰ŽtÁ"e«,€R´Ð¦mvNGÛDY9WU©êþÜ"ÌÊ40°¢ãy6É+2pë’·î¤ä¶¨ý«R{ œ¶Ù”é4à¡A¿'2Ì‹#âZœÍ‘=p¾ï§v†:’é1ÚÕEzbê÷åWÅqì*ü"ŽÁ §Åhè/ò^ú݇ʿ*ØÈóHÕjÚú,òt:¥™_àiI”æKÜ=Ε€ªcg3¡!Ëý­S;¡!†Zo)çc?.°2È‹¶ÈˆeÕ¤šD1 £ŠOVÓA𯀠 ’CdÀ Œ!¿Ê[3C—o\p0nßAr °ã§â-‚£•º"ºT9 ÂqÉG s4; CÙ9ð¶Ö5_•;£9£ÓÇ †lÜȘ¸Á7´qƒ×宬äÔŠ :’ ³™Ç’—ƒÏqˆ‰D6Câ3ó’8„,<ËžRŸb 1¿¶#ÌBL‚@ÌÑv¸öà œ1(ù”ÕD(ÈRç<‰g¦¼¾ø×Ë÷ï^sã¬á¯¸ˆ¿ŸNÈ’ØO°¢Ï£by³„Ú]#üMEžM¢—^d‹G=€ê“ôŽ65›yzÏBH@C­˜Ù %Ë g¢Á ÷Ÿašûyl<È„¾5óU½W"FxDßðbö,Ât‘w«o»êF˜§ˆá§q†%3Óàðón²Û`'•ôÕ,ҙѪႣˆ£ÐŽ£H´‡ùeݬ˜Ò–dÙBð‚è <„3Ôa8†œAŽv/‡žA²4ìë«—Çù“Ää~ƒuÆAô„Ég³F(ƒ"’,ž¡pþøòC(þ†óÞß ôަ4"Ì•ÀU[Þ«ãÜ;©/„ÐùÛç­>Š?/À_¦Añy«ÇÓ„¨€È‚åUóøîl5Yæ]¯Þ9ˆ_ñNÑ elúÑÖgÉA`â º?š¥ðˆD‚ÄçLQúœq‰ÇiÆsÚ7–ÂwúHåZvÞ`ÞBÌìásPò¥°™øi¤,Ä3tÈ‚Ýʦ TŸçÅò8äþ¨"±^,÷SŒ¯)¤>O˜|öÜ=>À ò8üL„!Ø"&ŸE2GbA?sGç—>.ƒŬ“¾DÀø’(s~áM Ô"ó$HUÙõâ7;p½K@wØãÛªw …K±s!ÌÛ;eî| ó±ì·ÓH'GÌ•5Fa}ïçé;R¨B»½Z•›r…'¯ ¶]½à˜†t? Â" ½öd!¼0?6‡  Ø9Š—üv ×hÜŠ!xw¦ ˆcÍÍ¢––Ð7ÅæÒ®0-?^4°>ôáÎÃ…Áìšµ3”n¨­Ïymn{ Dqmµ¯_}sõî‡oì@(=!ë<·¼tÝÁ¡$íÔÎÌ”ÉR{!•H b‹±h!Ÿ˜«¸a ìs99·ólŒˆö÷ÊÂNõîÐàW)`êȧ2Æ4Ò· ¹ ÒÀ 6­jî,bõê)ÂýhUä¥Î,¥óI:ôÌó8¦ M_tGâã›Âf¯ð=À‡C¹úµzКZ«O½¾ÔáÄI}gö&ƒüYäœ'XE¢EÉÊ€†Sló |á>qÔ ¹¸(¬¾˜/ u_Ê™þ® |ùîíû‹Ë›a"ÒPßÀ7[K¿°UÛ²W3ÉÂ!Y’Š# øë¥;|17¦Ê2ô`:Ï €ßoàÜ𝶧ëÑ ®ë›Vké24//._½¼²„ð ÏÒ%I˜Iw{Io3˜ŠeHŸ¾¬í±+ërwØY6Êëã]‚Xìu”ûT©²äH>öp:*ìkLj®†a(²Êf]®ð6õÜ¢ë#]±ŽŸ³0T5}g!ÒQž¢îTÛwµÃ6Y¹Ý[Û^«J>nå½r™wgåšÐ]Aã|f '`%W[5#¯<;’m)Š=Ô—¯—úÉB7ÀzïBçÙµ»¾=¬úCk1Z ÓŽÆ8ÏíPz÷J€´3­Ûf¿' gŠíЄ˜TnÜûf¨øòŽ97ºÊL]+ëµú¤¦ÇPt GŸÝò»åJ¶wÊ“»æPÃæÃjµ¾ÒvØî+ʆǫJ–¸YŽîx€Í®eú‚7ëd?à¬àÊ âi`ü?¶øñuàaXC±É§›Ðªd7t½’ ÌÓìQwÇ“"XšÉÕ§}U®Ê^[Ädfò²ØÂ4ÌçöÅ©y÷-¾¥êÎ\eÊ–­<ºí¡_7ë¿â©“.3Ëg†’1Ò•ÝËEεµ9©cÛÒ¨ÆéjlK›²íz‡æèlä\{ÍŒuca~w˜¥fÞ3 ~–JÇys$åŠ4ŽäL‚?Yá³#]Ok’Ôšã0£w¼óGÿÙå?çJ•á endstream endobj 2509 0 obj [ 2508 0 R 2511 0 R 2513 0 R 2515 0 R 2517 0 R 2519 0 R ] endobj 2507 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2509 0 R /Contents 2520 0 R >> endobj 2521 0 obj 3607 endobj 162 0 obj << /Type /Action /S /GoTo /D [2522 0 R /XYZ 72.0 720.0 null] >> endobj 165 0 obj << /Type /Action /S /GoTo /D [2522 0 R /XYZ 72.0 573.84 null] >> endobj 2523 0 obj << /Type /Action /S /GoTo /D [2195 0 R /XYZ 72.0 720.0 null] >> endobj 2524 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 289.74 148.38 298.74 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2523 0 R /H /I >> endobj 2526 0 obj << /URI (http://www.postgresql.org/files/documentation/books/aw_pgsql/index.html) /S /URI >> endobj 2527 0 obj << /Type /Annot /Subtype /Link /Rect [ 228.017 181.74 400.858 190.74 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2526 0 R /H /I >> endobj 2528 0 obj << /Type /Annot /Subtype /Link /Rect [ 412.216 181.74 539.996 190.74 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2526 0 R /H /I >> endobj 2529 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 169.74 245.06 178.74 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2526 0 R /H /I >> endobj 2530 0 obj << /Type /Action /S /GoTo /D [2434 0 R /XYZ 72.0 237.087 null] >> endobj 2531 0 obj << /Type /Annot /Subtype /Link /Rect [ 103.66 97.74 143.09 106.74 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2530 0 R /H /I >> endobj 2532 0 obj << /Length 2533 0 R /Filter /FlateDecode >> stream xœÍZ[wÛ6~÷¯ÀCÏYgצy)2o±å¤ÊÚuc)›í©{öÀ$$1¡…Ûú÷;ÀDRnûÒÝÞ2ßÌ ƒ¨ßO<âÂßçâiâ“t{ò]ñ<2õI)VoêDnL¶D8ŒI!bˆ"ÉU£lÈ—“òÄ%N~ý eÄuBò|â„£˜ÅÉ'X<Œœ Š“$QºúŽÇb‰À‰€H·äb¾õÉŒËÑZ{!ÈýŸkokxþÿ…FB'¹çr×}øgêÈ­?øNÜÃ/VXt|Ã…'N€<à8~‹‹O…Ú õ§ø ÉPZ†µD‰²&÷ý*Mü+wÉúäryrñ>$žK–+sЦ¡#xNì'â/Ÿ,·ä×ÓøÍodùñäz9‡¿Øgƒmk»(Ïõ’È#•², ¾w`™ ©$ ]×õB4ëjCw «ˆïŧrCËuK× >ºxï '=A‘ç€o@P¨½¯XF–¼­ëüŒ,7Œü(äÍØ+ønËʆ|¨x»CÁR¨ÛûÎÔ›$ILPä÷ì)¯s^¾%¡$äœl›ãF½9W|·¯òõ¦!oȹPûÔw]ÿÜwa£4GªªªìtøgVmóZ¬Ú±òº#×-kvÃ;2Ëë¦ÊÛ†™¯kjÆÓVúA3žófÃ[ƒi¹7t›BÐbh³÷lnË vð 8а(34Swˆ¯F‰š]v°ÈSVÖÌéï²,šÐ¢cíl'!+7ë'©ÅøÑu;`ŠæYcÛ¸=ûA¾å|éôÎÙÂÉ„WD;Û8¶&è7¡ú üÓ¨Àh? ˜ôUD×¹Ÿ»pTÝ·žÿ6tÿáz®«OÑáÙÓ‹3pÂT8UB -3Ze5Y´»¯ûL’–K ÎWܰZ?îaŸÐÉçáÔñà,8®5Š­ wG,§KÃá£è©[å% d<;›:VâŸàú“ƒ`êÁ§Ø1p©N¢-£¥Ÿ7¬bƒmô¡9ôSâHLY1Ú´3 4iå&Ú$ÃAMÔWô1ËÎ 9kÇ ‚­k™¶‘GYÁ¯tÇL\²¢€¹a(’Š.;Þœu¼ÙíMG£ìÞÒ2ßµ="£cIË”´OG¥}jYµM ÄWÃD5Qw¬•%ë…³¡å~ÿíy+Ü ™P™Fà÷º- ÕæF^oo£ƒ´™;Q[žå«ý˜[}œ•BòÊ`S‹½£y ¾}e†ˆ™c(êÌ—$/ ˆÚôO ÄU-«®-Ý“ }‚¢‹“GF¤Úp7 RöÒÝ^މ+jäÀu x檪@¨²>H¬zB"¯?¤•§Ø©DI*-`v qÉK¨%§­í娥YC k · JyÑnKK:ݲÚ1ø½=˜½Ðí®À|Û2ôaÔ?}ÂQ0ÇKd³s·˜/çw?u ™|´¼† j¾åÍØ ÚQ«¶LÕáD†)Ë @ýôª‘#ë÷áu¾Íá¶3Êò‚)ªÛͤ_/òa¬ïœ4åÚÉ¡1x¹[=œ>¼ÑF î îŸïÈÄIÈéGúDíË9Çû ‘Š$i[Upúнaí*(kJkŒÎ%¬*¾5¨­U¾FH iŸä¨pP(_Ytó‡tU ÊžWÛª0TÒ@é°³ ’~ÒÈðîióZ ñŽ&ñ_^wjMQMØ¡-°N¨Ú¹7m–¤½;’açhÉxì>YÛŽ*”Ùˆ^EÁŸÍlZ<3qÕµ8±I(ˆÐ%’ìÒ B‘Mœý"Ãé.«!¤O<7H“Ú¦›‰µ™fÈU«š'„]êï”\u¤í cM,òo ÝŒ–rKuêÓHî›xýûÃÚwhWb³ñˆps·”¦+öa„pòªhï#ÊºÒÆHåfðw¨4rLéÈXnÌÜU+kRªÖSV‰žÒj½jMn‘¥Ñ×Z‘î ðÍò—¡çü~b¼}dWòO¶—ËôæLa¦0aê‡#³It䯌–“°Ÿæ+"2 .$Dž¡¤óÈ7Ô’@L ƒE  å)É ð{„6…ðG±§gRä"ÂÊ´àÀ‡¬ÞÊx+¶õ{ËØ®¡:Ó~dÙéÝwCl1jnA»÷Q,VnD{ÖZŠ­®< •-öU“h1/;Ñ ª Ó\ý §`A¤Êà íheCìF:1ö¼C »ætè ¸¿©×J†ž•LPÃ?ziÃ…›A’Äž7²Äâúæúj)R„7¨·¼ûÙ€Ðïïïn rœ£W¼—„N2K$áÈzg¿¯°x“›@àFñäh|3¿[Ð5¤ç×ÿ¸Aè:¾ë%IÐéÍÌ릑ïL„7BÏ‘5»·½½|wysmàv/Óä LÂÁ“åü=¹þ÷|±\µ)œŒL#"¼±Å—A%ú©¦jÓfäð†â¥*q]?Š#œ}«žküI jÆÔ€…9ÿV[8åª QX …¬B±L˦úü*y´´WcKɾº#‹©Ú-Ë¢ÅóÕ¹Õªi‘´Æ‡7…»g…ñ=ÍX3t™x¨:p™ÎQDiFê3‹§ T…”‘ éܨ?šöWqz*x¢ô"8ù~2¢Í+ÅCWà¹nc‡æu³®˜xܳdÌ˦âY«;˜NiÜ5…®8¤î]Ó¿qµN GM¼ÉŸÒ4€{0c×õ¦ÞŸ›­v<…“øñëíÏœ@z¹ÁÄ™¹išÝÛ‹‹ççgg‡~ª¿¯Ö«öúb&“¸'Bÿ #_j.äAº ÏÿÙ­A҅천M³í¿ŒŠßBÜPÔa4"ô·Áp('D:H‚dd¸HC‘®É¸„¼À}Ë·_s*ŸØ|ÞäXÞFº<7ç…VSÕØâz,¡W1=:DY¸yú=¨ÞŒ½èÈ9Ñz ¼Ì5T¾‚úSÙ5”©J9I ×vêº"—•¹ÂxÚÔ,Cê¢Åé8KñK‰™gÑ5>!ÈòÕ Â¨Ç³*5Ùj”¾ûŽä¥µbi†`Ò™:t–x=p‡aTrëD>œÞ}^^ߟ‘»ùìo˜X“:oÄOòmF› Ú¸‡Óùìú§å|ùËÅâú~þîæŒ,ïç>ˆÙ‹ëOŸ¯ººÖFpæøÓ±+­Â9ª2 0ãÌ ý³‰ký UŽúDÒg—Wuŧä@ì­ÜÈ HéŽ>æ4-Ç–é~Ö’+kºèZ¬eºv o9²y‘Û?¦â÷ƒ'ª~Dºæ”´®•Š‘õć ÙðŠ·ëÒ%²pW?EÖs’aÿ²mÖ©òUžRÝÅé±¥%æ`W%GýÆ–Z‚øVVöȉüþ1_0&•~‚öœHäÁÊ·á¤Áè‰ã-Þ£f<í͉b'Ô•Ôï¯0õLÝ52Z¼ +FjHÏ…r*þïßW‹³›!{t¾f©ó÷£E ïN^DT°8Öÿ³óéä¿Y‚\b endstream endobj 2525 0 obj [ 2524 0 R 2527 0 R 2528 0 R 2529 0 R 2531 0 R ] endobj 2522 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2525 0 R /Contents 2532 0 R >> endobj 2533 0 obj 3024 endobj 1573 0 obj << /Type /Action /S /GoTo /D [2534 0 R /XYZ 72.0 720.0 null] >> endobj 1987 0 obj << /Type /Action /S /GoTo /D [2534 0 R /XYZ 72.0 574.529 null] >> endobj 1636 0 obj << /Type /Action /S /GoTo /D [2534 0 R /XYZ 72.0 434.996 null] >> endobj 1639 0 obj << /Type /Action /S /GoTo /D [2534 0 R /XYZ 72.0 301.75 null] >> endobj 1642 0 obj << /Type /Action /S /GoTo /D [2534 0 R /XYZ 72.0 142.504 null] >> endobj 2535 0 obj << /Type /Annot /Subtype /Link /Rect [ 437.27 507.807 504.95 516.807 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 162 0 R /H /I >> endobj 2537 0 obj << /Type /Annot /Subtype /Link /Rect [ 412.1 496.407 502.1 504.267 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2483 0 R /H /I >> endobj 2538 0 obj << /Length 2539 0 R /Filter /FlateDecode >> stream xœí[IsÜ6¾ëWàªØ3p§nqg)OUkjIlRsªI¶I¶ýû<¬À¥[Ž­‰'ÊR@àíïø½?#ÿçìG’ù¨¨ÏÞË1‚±ŠbD/Æ)ª‘ì¤QŠvl¢ÕdSd3à£r¶èlÑΚ3Œ¾=ûå7˜T"ìEèþ Oˆ 2ïÎ~æQìqše™”Õ÷Hš2C£¨ÑÅ÷µ®Z>[IÏáÿ¹ô¦Dñÿ1™¸Ï¹×}ø/ñ¸ë­Qˆí/FXèñqþ½@ŒÁˆçGÀœ}ÚIOÈŸìƒjF\3ñsQIÊXìÚ•«ø”Ì1º={}}vñ&B£ë›1‹¶`/õ3ö®kôË ßO^þ†®8ûæzOlµ‰#o,èa’ÅuR·ùÄÒUGc Å¾ÞæûvRýص{Ú í…®ÌHoS0tèÄÄãHÒyÓÑ]·‡¾¯^¡ë-Eß½ûé-º¢wt×îkÚ èÛ®=ìaN;$SßKH˜eq ’_üL諭j›Ká C_ˆÅ¦68ö°ƒY*Õi÷]u»ÐKtÎÄ~ácìŸûü¤F¸¨ª#DötÿGÚÕUϸꡪ×ÍÛ.ocõÐêfYõCWm¿n¥e[¸ÔÀ}5lÛÃØÏ›‡±½ŸäH1Õ™¤ŽÎ‡¦¾DA LéØezÝkof'1G]½ÖÝ]UЦ§žøª,+&I¾ÓC{ÓHb¨ùŒF’ÌÚE¾ºcŠ3ÆÔ?ÀŽþ@ß0>7º6632j;¤Œ=¶GÂnL$a'°Ï ì¡ì0 ôXtãôC¦âKâ_FøŸ˜`¬²ÈNM–—$ä%Û1äT«HnZ0IÑ¿~k&ä¤dÁòŒT,™×ÜÎç$H½ ½hÚ®æÞS5k”Æ ÕÉ‹‚‚s›[sÌh÷þÎSCE>ä»Ö\ "_vî*sý` ÷ÃÕ믮¡¶A â©»É •jð+gF×–wáÐNÜçl™ª¬nnh'3ö•qzÕ¦a­}×ÞU¥´ (AëMÞSÕïiwQ£—æM©›¦Mc‘ µjy£šMì¦=ŒË«ÆX§šŽjAy~œei†ÉDËÅ5©@'aMÖH³eoóæößRgyèg|ŸLã(9•eø^;ñýe1 ±+M“Ï÷}kÁòj×#fjú{^ïw”'ò¶½GP Mˆ ´¼£Hø Xµ=tè‡ü.¿j tuBíO™›cAzÒC»B ת!^žËă|bœ••J¶Iþ‡A¼¸jÆ„aäA±VÌùŠgŒŸ²çÐT`‡Ú1Š…©-ç÷Ôü&6DÙaUBþPõ[ctC‡{Jkž‘‚Š“¬P¢Shûyƨ*zjN]·—®ºãû¤Ö£–ÕMeö‹!¦‹àÔÞ%aš Óý·Ü—Ûþý®Ü\.úŽhÓ•À3 Xšïví=·!ënd#—?!X‡¶hw²kÉÌ~}±(¯°*›ÃT€šÖ—@„ÀEô¾©vÔèv´7zLA³; {çkï|î—­Bü…°Õ¥ œ§býúRj•nzúçÌ7 ·ÉDšP4·m?莨Ƣ½o»ñÃhÓ~ktST\Ñ.Dµ’¢É*?,e.)¬‰hì!®4ž³Ž`RqV ]Lm•ÇVwùîõ/¯@S¶éÀn“ï÷´aÅ2—i u‚cÇ+ÔÓ}&˜ÀR=­+ˆF8>yÊÁ øÝÉ“§p]…"§²Ä\ç›e— â¡ѺíЕÒ\oàn5^m"/‰Pภñ»Õ¹Ï.AòRH^­6Ïlª‹V æ³Î¹¿~ÙäÔ}Ë$#à sLÏ ÉȆÄÞ„é„NË”,N0•ôåGPÀf!{³<ôº9ÆG®µ$/ÍiÙ°ÚÈ}Ù~l™-3ãǯ¡ÉÌyî×Üõ²HÞõ®Dqf9ú£¬x³÷m§;(æcÂjéˆøÀp˜‰绊ÃKÇ¢`Ž‚Iâ"“ö÷Þwo~„Ÿ‰c–Q°G¹ù;V¹“YþFØ€•ô$G'óžþ¸¹?™02×Uà ‚@…ëE µà/ zX‹± ©½ XÎ2M!_/3ë:og‹Ab3[/òS2N•÷"£fj³'¿Õ*¿ÈÄš ]$YxcrX‰B ÖKýTðw–Ûà À<Æcaæ ·N ^5Ñì\j„¤ú±`ÚØˆ„SÂ`n©ðfm)'‹ÕÚ>Yn§ôŒW âk^·œ>õ¹Mü4×:61ÅÒ=‡:ÇM Õý.äì´·\Ö{ðÄ\>݉V¡°³úÑ)n•í?ãç£ þô®þà ΋¢=4C¿¹ÜèA¤vsl–áÈôïþû‘eÏ/-W¦çCq ölÕåöa3Ƕ¯æ1†q0ŠÀÛK5PÒpȇ“ríòÔ®ÂcñÅRç#lÇÒ«Ìÿ6-ó kcmªX›9>fãé"eÜØP=V"`«aÛ3^Õ »äfAè˜J§DΚVúËèÙ‘ª™ò™Qb°^¬yÓk{ìÖLz4Dñ ÑYÊóUë\Ÿ«óØIö·í=íò 1L{GÏïÛ®D8Ut4hÏq„ª9¯Å•_ƒ÷ aßnªn#ž‡ªÕyI=ôî°ééûPœy@R‚}^SdÿîD‘ï5Æñ»&ÑÕë)<†^°_jèV´»qX”aÄYDÞÎ<"~ËL š‡o&#iâ±_‡fA6%¡í â¸Úq hKç ½·˜¨Í^hX,Ö5„Xš¬pqž±¨K‹…!ñÒ½ Á¾ƒùzSAóœ(ŒB/ ãg¤è)2ï nXAûþ@KÿõBOÁ %³Û tq¯a[uÆëSn0n/ÓË=“såoÒê¼ØV ½Do@&¹ò•´s p–û˜qbÀéS¯(ud» †+5§`s1&ÎÂ,Á‰Íú™öí¡+NƒçbH¹LýmÚ3Ù+/Ù™DÃßðé׉®ýäIBÿ¨r°„à™â:¶|’RðWzv‘ë \EØ­ÆÊyöï~8±1 endstream endobj 2536 0 obj [ 2535 0 R 2537 0 R ] endobj 2534 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2536 0 R /Contents 2538 0 R >> endobj 2539 0 obj 2954 endobj 2026 0 obj << /Type /Action /S /GoTo /D [2540 0 R /XYZ 72.0 708.0 null] >> endobj 2029 0 obj << /Type /Action /S /GoTo /D [2540 0 R /XYZ 72.0 542.684 null] >> endobj 1861 0 obj << /Type /Action /S /GoTo /D [2540 0 R /XYZ 72.0 420.497 null] >> endobj 2541 0 obj << /Type /Annot /Subtype /Link /Rect [ 484.378 623.842 539.998 631.702 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2491 0 R /H /I >> endobj 2543 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 611.842 228.0 619.702 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2491 0 R /H /I >> endobj 2544 0 obj << /Length 2545 0 R /Filter /FlateDecode >> stream xœí][oÜ6~÷¯ ú² à‘u¿؇d“lS¤Ý´ön°¨‹…ò¼e!ŠRž•¤(Œ½0AkÄÓ ª¡”šÇüÁ Aâ}8iN|ôÏ“_~…‡+äC…»_WG+ŸŸüÆ’Ô‹Ò¼( î[èyN<мË5:{»Ñ«––½%zü¯î­êA„OànN^^œœ½IP࣋kÙ¥QâÅ™ïûA¢Ü‹Â‚ü¢‹5úåÙw÷Üÿôýˆ‡»¶û½«ú7¸ëŸÿŠ.¾—J‚ ð¢*æq†B_SsùìwŸ ÖåsVïõ «L`Â?™G±5yÄþô‰‚;‘/sáߨ‹Xä°`G5ïzþ'‹ K²³?õe\}{Ç’G_Õ¸»O3R1ð½|Ò a+áŸ"ò+GÍèHbÛÝß@æÅ-F˶0=j¯ÑrOAæmºP;T¸G×UQÕ£î—]u…W¨jhÑÿ1@ùåPµÇ‚rö&BAª™…—# R0ë'ÚñÝÅÅ{D`]ãaT`ñ;ɽ$ÏÉÛ•ŒŽƒ?ÏÑ"Ìѳ5nÛÕ(A+xª\.q/J•uߎémE>iORgxš?´Ë¶öÆŒ·Ã˜’–A°{w‹akLôxSv倥L[:Џ¹©ñðòYÛ ›M]-KXµ.îÆw_å€IžEÇ,8ývy µB(êÇÔE»…£DMÑÔϸ¯šQ€fªVXT1¤ÒЊM®Ê¡¼*{ì CòÙ¹h/hWâѲlšV<¹ùýPv +«f…7þÓ õý˜yݵkÅ#"y¨GDÆ=H½tŒ¼'3˜Ó\‘X#ŒÏd”³Ä4² ÆAÌÔ–Ö—uÙ÷§R¦½ÃÓƒêæwð½z)åßÊN©Öß¶Ûz%å+¬ª„0×5V·.+¹r F¥F+ÓCuF±Ö~†>’šicߨ+L&sØ›ÈÒý/«ëŠ5‰emØ7R,%=mW!Åd>Þ+ýŒ¯Õ¬Ù<­úÚ·Ûn©Èt’_±{YaIÒÀ ‹h8Ö—µ`ÖePÒp×ê»åYÛÝœ}ø©Vç¶ÿX¯®ÎX@Î8°½ßÊO¥>c!lmTGîw±”‡8öSNYᡬêÞ3½ s/àý‰£‚U{Ùdœ[—ÉÑ›Iç¢/™\6«éC>°ŒuËÆ<..T˜Ð6tàá{‹¸N:8bE±@9$˜ðý«—ÿÒª«¦þ Žj˺‚±OÊ0zR‚DqnÕÊ4 ®fc_ áø®–è_!WÁX B;CŒíäMÃF¢…HŒ(> P‰HÓk¥Ši= ¼4NŠ"õ¹õ÷5æïsPEz¸e!éûv;&Yya™ìÖ0˜Ýò¶WÔ°!‚¤×Œ|hºº¶(/;,Uð~dJD¾:Y8ÕÚU25hHŸ`âÛÆŒTi‘¢ é«aK5"9Zö¤¯JèÐÛD±í·4ë’´˜¿Š©þ*†aâ%d6˜g¹ÅbÕ,àΗ9„Ñ,(¡Á‹lj8E0É`‘„xÀTwMY#ÂZˆ¿ž”‡šåŸM…ý €á¯»a“É\› †~èAß"É» ‹¼áÄ\|/毣îûÜ2 a ìƒ>?ç“KY•ôQâÓ) àªÈ¦jLè¶MÃñÂ28b˜Àº[©ËqÆŽc&,;\²¹ÏXt;´kèò%éOOæÿ—¡–D¯j‘2@\q¶½kœ­ß:®ƒ²2ÑF¹°é’áþïN~KS/&ëÛ´H,j>•õ;ÑVÌÖ¥,GgeÅ‚M%ÞO4K:-æÅTnÔàì0ª%»%  »â  gÛ.€•¢[ðCñÞéR¼¦Tmº`\ßß­8žÕ%ÃJpcp3­°ÞöʬÛ%6_7®ª¯¶»G°jêï/ÛõºdÌïÍr÷By! ¬f-Va’ã±ŒÇ›ÎÆwo™TClч茜¬€«¾ßâ•ImaxyqËò€ÕyKÞ²(¦èºé:´°,ËS!Ò—@>eƒK/y=n€`òà‰üн:¬?iŠ­›˜Ð”k¥ ]6+Ét¾¼qxÖá[èӕȨdóëöwÄu3jy¤Eíòönè+™“”ñ…êÁ£fp+YâE„ÊÒ<²(}óâÝùk÷ŒÔŸ­,}¹«h˜¹t[~ÂRjZ™Æ××îS™qµÜ¢0 ½ ü¨ÐâÕuY÷î‘2,f+»šD¶&/Ÿ+Ñ?ßn6-_Œó¬ ~yŸZ3ÞÛª3{ºH4'VøºÜÖâx½$S²²¹¿|Ng0e®ÛÓ;¶2ƒ€¾­ú^‘FE^„)ß*¯` D^àÑ¥åsT6;C!Ò‡Â×ÊNZK0E0‹ùfÞ"$»n|„„íå„9é!ò¾À÷Ò1‡d,Âù>¦šoöêØ†½ž?)dS³°þ¶:bØÀún͆K¥i…Í$ϱÚu]Æ”4:Ü ï¥c”è.Ü6EœIµ©ïÄÝ7ÍÌ9"ÙNÈä#á+ÖÿÈ©Š¶ L÷ðs@6ü€Ö\Á%~¢ü³ñ£«{oš?))ðÃÍ*9qÄŸ]š Œ~µXÜ›)ù\†f? Z8¥“ÂÉ+6ÌY‘F¡—e{…LÄŠŒL}…˜…Ld "91/ð` ¨ÚU èfÖ6?¸H£T2÷ŠGÙðÓážjšÛUþ9adº°FvS#òˈ¬÷­Pb”E&ï:eT¢ÎÜÿùÚ¡ÇÂHZ¹°Ð ÂŒÝp`7ÙÕöiþ8ªóB Ó&•gšËÕ¸ N Ѧ¼D`bŒ›ˆïÂexBJfR,›àáô=>¿»pþ¢îC…b .Íñ Þv¥Ž’eL÷àÝÇI÷éùv´èNìD‹ËÜDË>ãÝŠá{ÉÃýŸ¢M9ÜÒåý ‹ìŒ_ \W]?ˆ Ë>¡‰dgÛۧΌŲìàX,È ƒúBësXŒ«µ¬ªà…›Ù®UÕ¬ÁI!>/ÙÅì†],¦}0‹]¸íâ0 0OÏa \"Ǻês8LƒË4_ïBÓäZ°ØÍ©e¬£Òõ¾áâƒ8ì›ofÉË€"/ÞèÉòÂpI_4}yMúMÏ·ÃDwb'L\æ¾ Lö6ÄV³Øõ«+º•ØYøŠòÙ ñÁñÐq5õÄ«)ûê[0‘™§g¢ãjê±WS?þ ½zýæÅ¿ß]Ì2’ ÄHÇåÔ¡-§š¿Á“®¦ªf~5CµCc±ãjêIWSó¦æé9츚zìÕÔ~æBÂqØqUu«ª míXTű¤£#)Ÿ@Í“‘—#ýùÈhèÒŒ4äÀÀ‘†þb4Ô´ô AÓWŸ0Zã¾§_£®ª~S—÷x…Ú†œŠèÛYþIŽ?.ù‡ñÏЕËùOøt´éçÏG?Ê—Ôþq€àÈ?1þ¡ç7é ñÙì“ÞOJGöyö)W«Nœ­tñOvh¿'ùç‰öâH8’Ð_Œ„Þ¾G|ä ¿õʱF+áÁÁNfNö„“9'S ' Ðmf;'3'3 'S`‘íI8vÃ.ÂÉ>Ÿp†zÙhXyz²É ²Éƒl2ÙX{Ï09 'vsjëè±C½o¸øÈ‹ˆg2ƒg2ƒg²Çá™ÌÁ33HÑØ‰—¹/ˆ”}·x¸ÅùZ7Ëî~3 †_^Ø.×zK¾Z gâ‡(é<ÌlùxAîúÚÎ/Çf…Sò[SC¾w`×½ÈËPzDîp¡G™éo Æ+v¡yN”xä²䑸ÿFœgv^Êz1¹ HsSAßxM¯FúÃy}_{¿ãûó¡ífZ¤Lg¦NòyÈL0ãì!>¼/ûúmåö% M•§Fè’B+RÂò·]n׸!'Ä1Œ,ô2vU=ÖM¦(Îv)ÙׇN²ÈT®“–µY ÕªÖ›r9ôü)å€ù¼'Aä%ä6‰4ŠMãåm7s³[VÌhðÜ´$=¼#{ǧÙX•xí8Þ9ÎÑt¸<ýí¸!ðÕ7¤] 8 9Úq/àkìˆ9š¸´—ÌÅÈåI@Í%šO÷äÉÁqOX7§<Ö û*ìípÂbz ÏýïwBDâ°ê5ÓŒÈ1ˆ5àÿÁŒyMiÈzzšRqõÈ!ìW«ÈþÖO1]kƒÕìI +¬.MJYǨ}ÿ~:s€å€èÌzTB¿xåËŸ•Ðï`ÙP;ÏRX55óµµÏXô‚^ †È Do•ŸžÒ“lŒªéÍ‚<õ·û8…¼Q•°(¹:UA­Ë»0EA‘ù¡zïß"*"$/¹3È5 üX*‡ž*„ñvJ*È›¨©Èï#–„¤<Ø6uµ®ømm4§Ù®¯-ìf|šcÖKµÕVËeƒÛmϯ¥ù–»»Ó8ÖZmÜ:BëÃ> endobj 2545 0 obj 3628 endobj 1864 0 obj << /Type /Action /S /GoTo /D [2546 0 R /XYZ 72.0 637.377 null] >> endobj 1867 0 obj << /Type /Action /S /GoTo /D [2546 0 R /XYZ 72.0 506.132 null] >> endobj 2547 0 obj << /Type /Action /S /GoTo /D [2434 0 R /XYZ 72.0 103.989 null] >> endobj 2548 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.19 355.574 523.19 363.434 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2547 0 R /H /I >> endobj 2550 0 obj << /Type /Annot /Subtype /Link /Rect [ 304.77 343.574 388.77 351.434 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2547 0 R /H /I >> endobj 2551 0 obj << /Length 2552 0 R /Filter /FlateDecode >> stream xœí\[sݶ~ׯÀ£3cQ$ÀkRw&MâÖŒ”æ!Îx¨s ‰ /2É#Yýõ]‰/òUÓʉ-b ì.w+ïŽäÃÇìG’a´«ŽÞ Z€ŒH,HQŒpèáUH\G¨„^ê–Wðƒw‚‹+ôÛQ}䣿ýþÜÜ#Üù&»aðéÑ/ ,Š=§Y– ݰ¤)Óˆx1\ì*tò¢ÂèÇfè-µe|ü/®­ª ðWÐÀG—G;;:y¡ÀGgÓ”’È ß÷ŒQꜱ?Uè÷'ÿ¸»¦íé//Ñ+Úß6íŸèeÑõ´¦m÷Íè쟓 È<ÂÀ4Lö 6ožœÒöF½ù†ûéL…f°Âðâ ØÒnD¡¯ßQp7Ò'*ü =Âi@áÆ`·J1õâ'· ¿äæ?g ëOvõÝËn}Qáósš°ï¥Ú4à0R̯#ò [ÍšH&{þy| ™çwè¸CB/EOveAë¾S(}£Þnêšîú¹ÛýU®ÞÛç}~žwÔShgWTíQ\ê_¹.T-Šz×Ò T£{…zÑ´št•uGAÙ½C…”k:õQšZÕú_yy .Ùxo}ûe ÁŒ6ì­õF‹ÔòÆuÛ€cèïd{—·Ý8\áÄÅž<Í™ ì%‘­EE«oå AzY >+N{èÓU¡Ø|Â?~ˆÞê¢(é¼lÄ^LØX2ÖX)šOñ²$ðü”9ޔ،ZÚ-ènÑấÅ{ָ拿EcÎh¡t¯öE·;t‡ê=µ‘D°GˆxžA‘^¿zõÓg/^¿:õÐs0 }ŸW×%}:z!ßË H˜sÈ…¸ƒöòØ…)„s˜b¸JÀI^ŒZŠ.Àmà[‚üp»Baœi”’Q%ÒøÞÊ‹ü ‹ÓiIþ1ù ŠL@L¹²g ž.XbÂ5‰2/QÛÛUaü°-ë2Tm&z…†Q;‚L]Ôö³7Ÿö£@A‘Šb…êôÓa¨µª†aN1 2Æ’ ¥F(‰"/MBj‰þŒ>ÎÆ\OO«ëïºw¥Gkpš;ú¶ëÛb׿íŠÿÐg}{ ß;œ®¤^Á›€3ñ"ü<½\ðìéE~({tÃÝswMwÅE±C,( ¦™åñ Û…Å_øééž÷Qêù ¤iq”Ø|PÞNž/Aèø‘ç³AÈœåç%e7öW™JÀ[>…úˆùú6–ñ`ØRUqÄ‚•|;°±µÇ›'uÓVy)«šjU… ïÀå¼yR\ ³—§öâ92Ï´Þµw×=Ýk5S;ÄÍ€M 1¦¿Þ6‹#€Y‘NŠa_eŒB e[Å ÌÔQƒˆIw#ÒTb‘sâ>#"·x§³~>yñ3bÞ X­†•û¼ü³¨/ÙÒRÔH=ô}YŽ«ÝŽ­øÖÁ;x¾=jjÄJz]^ÑAŽ·0“ðÁÌ ±ÖŽÖ¢îC"¦äëXÂ9ÖzS4›®‡uÒ˜ùXJ%+Ù¦[6£ªìf_«+°*¸~HX­›·Ý]×Óê-}_¬X\_?ÀªÐ"3뽉°&´Œf_´ÜÈRu܆¬•´^N¯ç–áòz*ç͘Õâãã VP|“¥­¬Å§µìû°©¼ Æ2ÏZ‡nÅ“©ä<éb¾ž¶x£z©;p5Gœ^Ëc^ëÍ™¬9„e¾k4Úåo¯(­ã¯ûŠ"vq\÷ÜC`x;fÎÔ>KÁÙpKÏïQtNâ©èlóZ«:c{ºûaegâ¡Q“ •g¦žãÇÊócåùÃ*Ï&€+Ï•ggÚ±”ÇÊócåyCåÇ¡™!ë+/¤qf ÄÙ'XG ¶–ü.½ºètlËÄÙòã 6sµNÃŒŽ¢V–ÈnÁsKdEè'¯<›`ùú c*$Õ¡ò1ëb*:Ýœ>Kä"R ¸Å©}œ+”ö¾¥â½¼©¯ÔYv†d½‚'ëÎhcYyIhÙ,Œ§ŒQ(¡ìóIVÍÚü›t7ÜL%Vá6'î3Âí–•XF\åŒÏPž«[%ÒÍu^uAµ(Pëô0k¼¢ñö:¿\Yg ùúLÌ'.ðÎÕwíiÜX¿U’ßEqjŸ/µÝ;õž¾÷®úª\ D3Hx@ÈY¿ýâåÛ9¸¬–gM¸Ì‰ûŒpÙâB†ê¨(dÞÒsÄ|ÈŒ¸o™@àÿ€ @mÓ,¯ L°<žÿ½Àã,œ9<œÿÀS6»|Ø%Õ\ ñ ‹; Ë‚“m"býê*"Ÿ ÜH¾–ü†Ùw Ó5ŽF&ǶRC{©Øí–c}ø"»—cÒŠp#& ®÷˜÷ú¾§uøúërP20õõƒ’Š(’êˆú˜¨d"ʸaöu Ê (UÇm€šQIëåtJn.§¤rÞ¼^½F?þôüû__ž-±Ä<  &¦L#í¡è4ó㣘òvjZʉ´ÕZE•©äTéb¾ª¶¸¢ VUÅuI­û–}5ÒvWˆížû>$‹½˜íÀ&qìðllUÿ¬÷v2­ï]û¸Ó%.l¹WÔ”}³^ஊ zÞ]³/^.øgª=„îb»¹;¼Ïï†[lý(VëbŸRÊù5‡vÇ—œ³VIB/ @©R‹2d¥þRç®Ý4íåÉU÷®ÜŸŸpuO,uÃÄø=ç‡mxÿÎorSdh@ _,9z³çÏQYtÚç¿sH#Yæ…!Ì bÎàûZn—µkê~8¾ÚùÂIdøu«Íñ"ìf1 „}suYÜÐÓ²¹ývË.umšYš ÛÔ“ÔcŸLùDß«ÎÍ;›É'’Ø>1âû£Õö–ýêl‡<±d’±cÝ¡O TŠ}?‘úd…i„í É]ë¦lÈÑtšnÈ ãjWfK#•°ÅDÐ?#B„”:’´ÝëmÔ 3çÇÔnÓvÕ:‚dga;8/b§ö$DzKøcž×á?β8i®ûð!ùnׯ_Ö¨ÜpæÀ- !±¹×yÅxÍSÄìˆ`A™@W¦ºÛŸÛœ¢^1qÑŒ"Á3Z·MYQ§*I²ð$R<ìñÏeÛæq)J3?˜S?{w(vʇpz¿Èϼ4dgTùâq^ nÔ¿°ëü¼¹™Zò˜ g×yÿ„ú±x’¤É÷ð’l×ì<£Q“ÁgÊFQï X+‹ãf¸ÒâXó Äçš² Ý{e àŒv Ÿf¼$ãÕ¾¸¸ -@Àš»†Âãfv6N4çsÛÈKˆ9⊫©‡ît’·ã=öÔÇìæþ©$Ý^qK˜lú«¢ÝËF11+Ëã¢>6íݤÓ4./ U8?/hUGaoÙÏ6 !†a0’§#‡ÇœÃWÊ ˸Hæà¥;W®>faüÓ¥À.4½ÁÌyA Ðp2Μx ïÕø%´=xÍ àHùøÙn'  ŒgI(½)Û±ÀOÕó¢xcô¼©⓪§Eƒ‹vjÞŒDñ¶8Ɖ7ÎÆâ“qª°jêvMUiBK–ÄO}…mŸ·ý ›ÉKuîÙUÑ÷ìuèì‚IãÔ0©–ý;f-ÄŽALx—@­äM„Óu®öãçd –Vè9ŸÞâg†ñkÍÒœÄ-ͯ…‰xC±4'0K?Uøö xÜVºY/õD/N1T³ ÝPßÌ0ÿJEŽAÛT€Çx´´0 BZÈØcï·!æ'nñ7ÚÖƒEˆimôîˆÄ|äð2r/ÎØÚCœPIø •ò«ÑP…(öÁ£³íÆa,v?¼júéë è ·!›LÙEŠIDØÚþ!à ARʲÕ‘ °Š–X›D¬ZóNã‰N‰'Ú £éŒgë‚9䵡Á|$W9ai%;lHfü1¬FS°Ay`–É4e¦â¢ve6°TQ ‹Fa_†§‚÷$NÆÃM±[ unÌ©0Õš×"1ì!H¦9æÏcd¸ Q–%Dõëõe›ïÁ- ^#&^,Ü"¿¼kãõU>D-Þ ï‹N8sNغ¾©Æ¦Ô8i¨é<\åõåÄû5~=F8q«qöªéítWš2M}¹EÑÔf¤f6‰aön¾ƒ¹åpTd‡ 3cD ÎZþ&I;V‘yq}yQ+Û™ÔBË/GÿéÞ‰ endstream endobj 2549 0 obj [ 2548 0 R 2550 0 R ] endobj 2546 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2549 0 R /Contents 2551 0 R >> endobj 2552 0 obj 3638 endobj 2129 0 obj << /Type /Action /S /GoTo /D [2553 0 R /XYZ 72.0 662.836 null] >> endobj 2132 0 obj << /Type /Action /S /GoTo /D [2553 0 R /XYZ 72.0 553.308 null] >> endobj 2135 0 obj << /Type /Action /S /GoTo /D [2553 0 R /XYZ 72.0 410.616 null] >> endobj 2373 0 obj << /Type /Action /S /GoTo /D [2553 0 R /XYZ 72.0 325.088 null] >> endobj 2138 0 obj << /Type /Action /S /GoTo /D [2553 0 R /XYZ 72.0 157.522 null] >> endobj 2554 0 obj << /Type /Action /S /GoTo /D [2434 0 R /XYZ 72.0 281.453 null] >> endobj 2555 0 obj << /Type /Annot /Subtype /Link /Rect [ 112.43 159.622 184.43 167.482 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2554 0 R /H /I >> endobj 2557 0 obj << /Length 2558 0 R /Filter /FlateDecode >> stream xœÍZYs7~ׯ`ùeí*©Õ÷¡Ýl•cˉ\r.)ëJÅ)5ÃÑ´ÝǸ»GŠòë$À£‘õ”]ÇÎðIA ûËQÀ|øïDþdEÈVõÑ¢, Y”)IYy©Ÿ³šÈ“œU²á¨(›P1RTj`ËÞ5G>ûîè÷? Ñšù^Âîüsdsuô3 ž¤^”æEQ¬¡ä¹"òR(¬jvzQ‡ìu«Zké%#ÿ.½+Q„ÿùìöèÛë£Ó7 |v½±&^ú¾f ˽(,äŸ]×ì÷ç¯Å®jjÑ ì»}¹/þ`×oίiŠª¿2¢þfž²¤QEûãÇÊ ÝRá_ìEHŠ&0YUÑÂÒ¯¬ÐÅD) *†X9§Ë¤4öwþÈŠÈŽï壵3ßQÿؾþf­ÍRŽ}x>þÌ®†­`/ØI{{îíºv'º¡½%nÊÊiÒnlyÔwÍ~Ã{áYÒµ[?ˆ~p¸®x3bä º]—›‡¯ slI7ûaÔ¸^åŠeÛ8£óÎiÓ´N˜~_öƒXã ;š ý‰êøf“ÒáܶüN°U[ï*ý½ƒ8ðâ"‚þqN{šæ¢ÃIÙóûrØZôLê¾ÿØ ¾n›êᛡۋg¶štˆàFØò®â+±s-¶¤QâRñ¾ßqw\Þ8ÝŽÜ?ñÎ)§gáÅh¬²wE¦¥[¤m±’+5S]MT÷ë/—¬Þ÷ÛÃjK.èϘïЮÚê˜ÝoËÕ–  9XY¯í†ñžqÙºÝw+A‹tú&bA:Ý)¾çIQäyŒcž×7b½½Úuݼýç¡Ý±—»]¥ Ms]Øy~^> 2d‹ÊŠƒÂˬ¶î{~‹ú2õÂA¼n÷ÍàpwSvàjË›[·÷h¤ŒÙ¤*ër@Òƒ5ë± Ý“™¹btâ˾ì„:Év­hά ’‰î´:Ò¼®0²®Åºäƒ¨<‡|=î#6|_ 徃‰ZTüÁÁ¤cÒ?[Ô °áµ+Bï€MÙ¸|7mç š7î ܱ&WøßÚ½ƒÀÌ•gùXI¼ê•v£@uÚ“D¤+"òÿIÛr1µå"÷‚D†+q´0è¶ÿR­o<¥ÌJ…벪Êþ›À÷î0 ‘iî§ L]¹Ý)ub½_¹ó(‡CM}pòá‚;\”G•sP#2".¾ª‡o6° â  ‚8^`bd±—Ód°¤&ˆ›Òºì?Ð?4+ÛFX ¾ÚçlxÏào°·ÜQÄÅÚ¦¡)C'NUÛ ¥SÄÊdIšm»¯æGk“ù‚¢aü:†¹ëñ±|õý¯×¯|ÿƒ!HÙÑ;QãÖEÓï;±ÈÆœ𠿀EXèFX†eÓ¼ªC¹Çˆ…ª‡%øs˜0ô þ¡ìÀ¨!’ªmþ±àùÒé©Ñ&*w³QÈ«ßýôòÕµ<ãºv?€¿yì€ òÂKâØ÷Ó(y섻ݘ͸ÒÃ$·ùÄõÏ48Ãõ‰fPÙܵհÕÜ”zÕTØÑm›½²`j±Äå^Ü<ÎBÍ­!)ó¡.) ­MøþŒôêçKg2ÒJV*BÊÅÜ=‡a×àõùåËß4‹€?ès_8C>¼ÐÀ jb DÓîo·FJnZ•ü'„ãûÚN$œk(Î'2ÛŽŽ˜Ž1,’ÊUy캑¶nÕþC€¹–o[§Í½í°‘!œîÐ34\âÂxC*:Œ…´IÞ¡ÖíaS,›Ó|.¿^"Dz¨—›R_󪚫/…õ‹!´Ï²Õg¬#ŒäQÿáyè[T÷¸Àˆd2Õbʉ„²ÞqíAˆDV…MÖâ~'ð( ¬tGeÔ Ö 6ŠÐ˜(ÙÚò_¢k-on"®Á¨ûåî‹&¡ÙXgj ¶’ 8Ô5Š6ä^A0gR€_„è&/™¼¬ $i ù m\„*¶EcÚºjdÄD¤\…¸ÔÜ©c8)›“ZÔ–æøU¢hGn)«àýà°TÎÖ‘RÏJ¸Ò7k² $mØÁgZ‚M=Ñæn½<ð9ÓWÍpŒª—Ò¯™‘Z”Ò½Ëfe»EU·€üp’C:\±¡¬ ¢(ôÂß{5ú»òOàÿ®] vÆ0F3âÌ"|x~©݇„Q’xaÊÌLéª$uC^š]€à^FDÞ8íøMå ´`ªQ«b±–&‡Ûà ü¬(’4X Œœ¿äu8`Ï!gI3y/”-p°2¸††½dŽ ›®­-jÕJH¢4·%]AŠåôÖGUòfXÖV·wš-ØcšM&¥—Yö‚(ÒÜaDrjÜTÖR‡-,¢ ‹À‰´ˆ¢5‡©0Ò(F@»ŸZ·î0¥3è̓-ƒæ;í´Iˆ#´-^÷ƒ¸uÊïÅ VÏu–3S²^%ôÕ=G×Þvr—wé±­¢;MúPð1`… ÊBÜ#"="Їv“·|ÌaÃ8ðò¨¹“pamwëQJ ùEå½ãesAüg­‚… ûîE9º³9KG`g&jyœ‰íFêXÐwLøºÇ„Œdçî VÒ, ÓǺ¼‡Ñ æañîLÉÈYï½ÜíØ³gÌñ ²y®o\Œâ$õb!ð ÚµžÿŠ>,€0<ì?²ô ‚¯ æqΜ2ºk¡n³ÊøÍi¢R—ҽ˾qÀû²4RÏ!^íÄŠ«ôÈ[Wüž×.<†D°nq¬õ\)OˆB"…DÀ È²Ž o_ûÊò%å€ÞmœæÞ`ªS©ðÞŽÑã­D C``—roÎF#Ó²/•‡3[aäˆbŸ¯SlAH?³™I¸îÜíÁ)» šâ=‚pɇ²ï)HÑúuÊr)ç ”û“™âG|߬ÊÏ€ƒKŽ(ÊRHöŠvŸÖ7«3ÜèêçìôtÛöC¦~øbßáxl$ÒÉ¢Ñå’H_ʆ”…n TyrÓ¡hZ•ˆú¶òYôv¤›G.÷cHÙkBÚÐÙ¿äÿ•_‘i1­ö¿k%Џ²yÞœÈOmàxÈí«éRõò 9É ˆ•Åd²0cÂò¯u·Ö–)@Ðn6' Í“~+ª%ÛLñ4´Gª~æ6[7²GŠs‰J<3ŽÇìè¾ ëm®¢0™¨HFr«víq «šÄ©—C˜GôÌû”6MçýTå|Ú Ê”­¢õáÄ ìKuò¥¬U¹Ùƒ¶:ñ¨SÅ·ò”6£éÀ^¡š—–›´ïÖŽ)/ÛÅ"šÛ”ä6©¬àoÿóÎ3àJØ rnªüò§‹ù’$ùXE=œ–LÝ¥t<±G¾¼Ø æÝÙdyfn<[G{0á×GY:P‚ü±~rbk1ð²êxB uÿØeK’'^,ƒÌ×ÎZ9)³/Þ“õ_¶··²B¾Ì°Wê:葸*õs`+?^Hb}Ϧ.2uó®?éɦ DÑÉ9"úX},ƒ@˜rlIæõ¡¾¸²¬[w§¥Wµ·c = ¯õ× õ+Ñð®lAîÇÍ¥Ltˆ>Aˆ™§òËŸ‘2þ{wMàÆ©ö¾"¯êT¶¶\ÖÎÜ9= ÛcKrÿ”ê>Ïд³ETñî}âñÅ ÒÞ´Nó¹©CG*Ý?,̶ó·Ê‚DZºôED®šœ·¤t ¤¾*fâ®”jÀŠ}”ÓüÚ³z¹R–ÁN+’fVº„Èé%]_1R¥;“N¬`Ñ:g&dÂ(F€wåÒuF®·ŸEö+R—µÏR¯.èÓ8žLJ~isÇ+ù¥t%ú™‡«óköæâòüŠ]þø{óòòêÜ}Qú_­  endstream endobj 2556 0 obj [ 2555 0 R ] endobj 2553 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2556 0 R /Contents 2557 0 R >> endobj 2558 0 obj 3325 endobj 2560 0 obj << /URI (../verbatim/src/org/hsqldb/test/TestBase.java) /S /URI >> endobj 2561 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 709.5 293.65 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2560 0 R /H /I >> endobj 2563 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/src/org/hsqldb/test/TestBase.java) /S /URI >> endobj 2564 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 687.5 354.5 696.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2563 0 R /H /I >> endobj 2565 0 obj << /URI (../verbatim/src/org/hsqldb/Trigger.java) /S /URI >> endobj 2566 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 665.5 270.31 674.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2565 0 R /H /I >> endobj 2567 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/src/org/hsqldb/Trigger.java) /S /URI >> endobj 2568 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 643.5 331.16 652.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2567 0 R /H /I >> endobj 2569 0 obj << /URI (../verbatim/src/org/hsqldb/sample/TriggerSample.java) /S /URI >> endobj 2570 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 621.5 331.42 630.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2569 0 R /H /I >> endobj 2571 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/src/org/hsqldb/test/sample/TriggerSample.java) /S /URI >> endobj 2572 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 599.5 408.94 608.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2571 0 R /H /I >> endobj 2573 0 obj << /URI (../verbatim/src/org/hsqldb/util/MainInvoker.java) /S /URI >> endobj 2574 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 577.5 308.65 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2573 0 R /H /I >> endobj 2575 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/src/org/hsqldb/util/MainInvoker.java) /S /URI >> endobj 2576 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 555.5 369.5 564.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2575 0 R /H /I >> endobj 2577 0 obj << /URI (../verbatim/sample/hsqldb.cfg) /S /URI >> endobj 2578 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 533.5 234.21 542.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2577 0 R /H /I >> endobj 2579 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/hsqldb.cfg) /S /URI >> endobj 2580 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 511.5 295.06 520.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2579 0 R /H /I >> endobj 2581 0 obj << /URI (../verbatim/sample/acl.txt) /S /URI >> endobj 2582 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 489.5 216.99 498.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2581 0 R /H /I >> endobj 2583 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/acl.txt) /S /URI >> endobj 2584 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 467.5 277.84 476.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2583 0 R /H /I >> endobj 2585 0 obj << /URI (../verbatim/sample/server.properties) /S /URI >> endobj 2586 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 445.5 259.19 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2585 0 R /H /I >> endobj 2587 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/server.properties) /S /URI >> endobj 2588 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 423.5 320.04 432.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2587 0 R /H /I >> endobj 2589 0 obj << /URI (../verbatim/sample/sqltool.rc) /S /URI >> endobj 2590 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 401.5 229.77 410.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2589 0 R /H /I >> endobj 2591 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/sqltool.rc) /S /URI >> endobj 2592 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 379.5 290.62 388.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2591 0 R /H /I >> endobj 2593 0 obj << /URI (../verbatim/sample/hsqldb.init) /S /URI >> endobj 2594 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.05 357.5 234.78 366.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2593 0 R /H /I >> endobj 2595 0 obj << /URI (http://hsqldb.org/doc/2.0/verbatim/sample/hsqldb.init) /S /URI >> endobj 2596 0 obj << /Type /Annot /Subtype /Link /Rect [ 82.0 335.5 295.63 344.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2595 0 R /H /I >> endobj 2597 0 obj << /Length 2598 0 R /Filter /FlateDecode >> stream xœÍ—Ms›0†ïüŠ=¶‡ }€9fڴ鸇L˜é!Í`bÓ€±ºí¿¯Àrl#r:“ÖqˆwßÕ>ZagãÀòç]{B IálÔ€ãjÈç@ı€Ô…ðä­ðä´•¨SÖ*õîb _•ƒá£sw/EsÀȇŸÖÌw6·ÎLîsĸÃPÍ•""D›‚!.O’Üë‚Âû²Sïgßá>ûã1BÿƒaX8—‘ã^ù@0D‡àÄ,1¶/ Qwo>ý^§ÕíÍ ®²<…Y¶zªßÞCôÙù©*;‹®¨|¨k¦“¾‡Oï5ÚóøaTþzˆíÆä¢¾,§½•«µUÇöÆþÔïX펣l”ÕQp¥:h¯™||Q‚6`$N–ƒ†þþÓ{ejÚB¶¹ÇëÁZk}£Tó,"ºjV&q~=!{ÊÓ"úZOVb­eã¾¹Û´zˆ›¬pë*qËjá.ëM>p›´nÜHþ¹Œë}·±^Ã=¿eÓ¬/\eZ·y™¸á—§‘{"Æ0ÆD0eM6Y 1qž3ƒ³tTe‹EZ0¼žÓùŒ 0„ÜŠ®&›¦«…˜èN‹™ÁÙ@·Ž‹užîÜvW#¨ ͺëgÛœíǶ¯ë¦ùë1¦°P3“·a ~4Yî~‰³Õõj[>v:áýMs>~›T2“èoªêšÎ‚ºc¤>­f&ïê»®S´’Ç…^ÅýcƒxÂWÚÒþÆæ©ë¦yê1&žjfòà'9j~5Õøý=`sØTz´ûHÜŒ$5I-ÆHrZÍLÞ$ë´’Ch]•ò x“¥õ@]¡×ó±g:e/¿¯nEW×MÓÕcLt-ÔÌä=Dw“7e™£*(ˆ‰—có•¶ÛñÔt<µ#Ïi53y?G³U6°÷™è÷ûÙÒƒ±ú¿óPUøB endstream endobj 2562 0 obj [ 2561 0 R 2564 0 R 2566 0 R 2568 0 R 2570 0 R 2572 0 R 2574 0 R 2576 0 R 2578 0 R 2580 0 R 2582 0 R 2584 0 R 2586 0 R 2588 0 R 2590 0 R 2592 0 R 2594 0 R 2596 0 R ] endobj 2559 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2562 0 R /Contents 2597 0 R >> endobj 2598 0 obj 727 endobj 2032 0 obj << /Type /Action /S /GoTo /D [2599 0 R /XYZ 72.0 720.0 null] >> endobj 2035 0 obj << /Type /Action /S /GoTo /D [2599 0 R /XYZ 72.0 491.936 null] >> endobj 2038 0 obj << /Type /Action /S /GoTo /D [2599 0 R /XYZ 72.0 212.161 null] >> endobj 2600 0 obj << /Type /Action /S /GoTo /D [2559 0 R /XYZ 72.0 720.0 null] >> endobj 2601 0 obj << /Type /Annot /Subtype /Link /Rect [ 173.97 655.263 323.933 663.123 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2600 0 R /H /I >> endobj 2603 0 obj << /Length 2604 0 R /Filter /FlateDecode >> stream xœÅksܶñ»~FŸäÇ7 ¹êŒã8;î#•:þe<8NÇ”GžIžeýûîâÍÇYr'ã:Ž´»v `_ð§³ðßKü•³ˆ”û³Oš’<"q¦IiF¢„F)Ù §¤†Q>~©Aìȇ³æ, 9ûõ7ø¸!Lx8 ¦ìä䛳_@XšÑ8+cZ·ˆ†EÅ4 Ü“Õ»}D~låh£-ò ¾»¶¾qý4ÈýÙ·g«ŸRävë¶4Ni’AF)h1ü‘Û=ùõâçǃèn~yOþ.†‡¶ûy_õƒhD׿øÜþÕ1 CFã&IN¢`ÂæîâFtŸaÖÝ 5ïí­6ŠšŒÇ*‚¿9•gkô!M‚ñïÜYº£Âÿ  (Êø©Ö[¯+Ë(PXý>iØÀÙ5XÞXüô]…ŸÞÓ'†-FÛ%™gþñ‰üÎV›m$Ê¿ dYH:½¶˜„Åhm0%¥1cxdsµ°›wCÕÜNÔA#ۮݓÇöׇؑC]•|¨ÚF-­¶`²€ÄŒ†Y†gXÛëÝ–¼ QL r¬,üÀ›Á"CkÁµpvÂ}QJT*g¹Uîj|An wº_:boÁöph{±YRÆ_¶û=oܰºjÜÇÖ‰[ó¡Ü9-«Zô—‹èwí±ÞL\\ÕpbÀ²|@Q/Óo T5`«¦´_Ú­nŒ¥ÝBÄz<äÒ °PË—÷}ußx_ xèZpdC%z§ÌÆ€fߦ“” jÐ×–1zBå¯)&ïšÊ5#C–@¼R¦UAB잯 rŒæB¢‰_!ïÞÈÅŒ†â!Ÿê3"<Ã:8>͵'U“Œ:SÙZ£&3ÕíIU&¦Q”™elz–Ÿ„:š„)Üw“øó3\íº| פòÝÅÝ‹W³› BÌÿbæ(Ü7=õñîâ\_’ øÜ Î/Ïñš\­ÚðڬW¼,Áï ýù¢ LìQF^dOËX7p§¥Þ|äuÅO0…€!Ó,NÓÕ .ô@Žy·;psBÔWàv¡â22jŸ¨õR“ˆÓýÅ\?‚K!—e,U2^×ÐU²ÿ¦mØHñrýã™ ØïÊ:9ùQ›ë‰¼?Ê!Æe9+ò óÿ—q %‘Ir2é‚]VÑ[à§a'öí >ÂýkNžÂ0Ž€:ö _àäTÑÞèÑQdJi´îŽâòÄ"Ü9V8¦³ÞÔMµÝŠN4CíñÖ%Ë»¦íöê +|ßnd^¦Ñw?Ï×^ÎUQLÖ\Ùä¼²é{ÓZ"œÑ÷¼{´)|k ÿìUvÀè!¡Æ®†­¸¥Ï–Mù‡ÒÖÕRÁ1®c¤÷h2«F,“w[Iç”îæ·.‚‰ÜzÔB.ñâ=˜Lð¬ÁÊ`Ij›(¹µÙ*Ù´都£ä‹)\FÍ!澬HYc¥IçÚD!̓rýTãrÃsÚí–°Ülƒp”î · ¬†$˜ƒ+ëwr“ïvÆÌªkÅóÁÀNur$ˆÆ±pgÙ´bi°ø¶¥S®S‚ÖqJ졪ë%þ`Ô¹íàŒmg—êèâ¹äv6† Ç®·V޼î–= si‚ˆ ?¤…ªôôͯHÿþ×{ ï!ÞZ¤jÊú¸qsÏ;÷¡]ct¼´”^xÇÕÅSì…X„{÷UÙÖž–ÚÍ¥ÈLZô]³8J—eskeÙÄZ²z”Ž4„kgû*óŽœ!i[´?ˆ²ÚVÊ»hšÎr2¤„)¤ø FA%¿ ™Lœß\­d›fµÜŒ‚ÝRŸäE,`E† ü<•*_?íA<í›Í·ØCîÈsÖ›Ä ê—2àdA½/›õÉ•%Ø189s´°ù–çÅd¼j"é%3ëk ¬×Ë|CéõvÐY3.ðòÄìF|6º‹O Ÿ*Irvfž3gÕ 9½ÀÛ%GÆ‚‰½ƒa·Gß +/A^÷­ÒV²¯*‘Á’¹öbe`_/IñSBªO)Á£“?ÓÇoJJk•Rö xÃKüµù¼žÜys4 ¢‰tç2Jì ˆžý넸º˜©à°¡WùƒœÞžš=n‚"Eé,Á£ê#K¸]RK›BÂÊÆJnëÍ”°:  |ŒDýýÜPá4d¡‹Ãiן¦ä­òß=‘îùêݵ$Ê ÒˆÀEÈöZÊ–ºk8(PƒLÇ#©ž‘ÇH6nFø3zH8jš© M·´–ô)2šwfÔ<ôñç«£j3!ÑXÊH!K×M- cª‡?Ç60†%®Ã ¢Qý Ã±Fuž(ésÓÑSc:"ŸÒÙæÉjî sñû8™÷­™kúONp ·Ýʲ—`­kNÌòù è9)‰´Æ·Ö4‡¬=ˆXÎd`õB ¬ù(°â X 2žÝ#©Xá1’.{„?#xàø4ÉФq[Ð'K ôøŒ…ZŸáÒat&&šÈñBšG×1md¡©AqzNP©£H3m¾ÕÒ"§ Ô£Q^hw½Z™N|>J×4?À,§Vµqͺô®Ñv=zš?¨Œ¡–͵Ç2G¯ôóôFlù±>bÛHEë.†ØŒ¢Šì‡Ë¨2ªâŠð5õãÒµ»ðàŸž¶^SÓÚÇ+h;¹Üw|χ BNý8皤 ¶ûÖg;ýo¯þ ái«ý endstream endobj 2602 0 obj [ 2601 0 R ] endobj 2599 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2602 0 R /Contents 2603 0 R >> endobj 2604 0 obj 2841 endobj 2054 0 obj << /Type /Action /S /GoTo /D [2605 0 R /XYZ 72.0 521.1 null] >> endobj 2057 0 obj << /Type /Action /S /GoTo /D [2605 0 R /XYZ 72.0 399.9 null] >> endobj 2606 0 obj << /URI (http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CreateKeystore) /S /URI >> endobj 2607 0 obj << /Type /Annot /Subtype /Link /Rect [ 187.129 534.6 416.241 543.6 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2606 0 R /H /I >> endobj 2609 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.995 534.6 539.995 543.6 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2606 0 R /H /I >> endobj 2610 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 522.6 362.81 531.6 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2606 0 R /H /I >> endobj 2611 0 obj << /Type /Annot /Subtype /Link /Rect [ 277.495 447.4 366.481 456.4 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1915 0 R /H /I >> endobj 2612 0 obj << /Type /Action /S /GoTo /D [2559 0 R /XYZ 72.0 544.0 null] >> endobj 2613 0 obj << /Type /Annot /Subtype /Link /Rect [ 198.37 401.4 244.75 410.4 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2612 0 R /H /I >> endobj 2614 0 obj << /Type /Action /S /GoTo /D [2559 0 R /XYZ 72.0 500.0 null] >> endobj 2615 0 obj << /Type /Annot /Subtype /Link /Rect [ 142.71 208.4 226.71 216.26 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2614 0 R /H /I >> endobj 2616 0 obj << /Length 2617 0 R /Filter /FlateDecode >> stream xœÅÛvܶñ]_Ú9§ö9+, ÞõfËN«Ôñi,õ$mœ.‰Õ2â’4/Zéï;ƒ ’»»i’V˜!07Ì À~¹p‰ÿ^âŸ(a$Û_|Q8—DŒx¡B!a>eÙ5H ³ìÓ#ø#'Á`G~¾¨.ò·‹_ƒ9q`Áᙓ‹o/~fAH½0N’DÉÆ¨Ç(‘GCd{²¾Ù3ò®³µ´HÇùÓ¥µ%ð\öÀ!÷oï.ÖßÄuÈÝÖl©P?rÇeŒÄÔc þÃÈÝžüúêïÏ ooú@>òþP·äCÑõ¼âm÷ú7r÷ƒ!⺠õ|XûaÎŒÌçW·¼}„UŸ_Ëuïï”Qäbt+ÿETøÖäCà;Ó/–ßxƒ…ÿùÔ“8ÀHcà§Rm½ú+-#‡ÒÀòïIÃ:Æ®ÎñÅO*óÓ{áBסñdXàXæŸzäŸlµÅF"o‡&¾ëF85‰Xà'𱽿i\”°„FBÒr² ~˜È‘<ä„1Ö ;FT8nºs‰‘3$Ù”¦L†ÏæÅSCÌØX°cØ;1³üLžÓü£© $fn‚ÓY|/ iâ gu¥ïý˜>pÒ àE}M:Þ“~ÇI“v”ëœÔ[Ctþ”f}ù,à.Ýs’vÓ¹ƒz²¥¿,‚ÑuêO¸ÿ»Èkr å&"¯*Îs!©hÚú¾M÷!ic.™é˜Ôa˜± …[òƒžf%È­©,,åÆgÉ9À@ã8«‡¶ãÔ ÞÕfÜÕ{KŸ¢êy[µÍwž¶ÙŽw–¬ÕۢʿBy/bÔ™ã!;«=fÀ“ÊûП¡b)ßž”6êÿÍøÉ±Å$ äõ¡*ë4'EO—ÞåùÔÇŠÃÂXåÕ­•åw௞á6äÅv[dCÙ£Ï×›>-ª¹!YZ‘C[ôàÚD;LÈkãóý®¨î//ÉïCדöpU} ZožïA® o&I«|ÿ±®.¯ß\Þ÷xü5”—“¶€å±GªDž\þi¨pTÙ3¾€ uìbbˆŽÐا‚Fà’W¯}]—'E€Pˆ ½àBFÿqÜq>Ñjõê28xEñYz‹ePf}pGÏggשÄ!ë–§=ì™Á¤fø]ô-¹³¾¨-óÊø–ãnoßâÛ¿ EÎé®ß—3 =’8*æ³øIÅ<ŽY>¤ðÈs¿mäò‚„%ÞÙu¿ÎBÝH¨Y{Ì’»¾o®ÖkL´* !#€Ž¯Ãõ2ê áN×çuÖ­{žíªºçÝúÍÕ­Á²ÄÖóú÷-LùRl×;2cÃè‚°ÈExDZpüm1ݧ® –Örº¬á,ÚƒZCâ|_Î~3ôõ|(#ò JÀÏæt}ÚöCCÀgþõñæ—3qÌ`»é öÈ iL^=ËB(Tº¤¤7Ê1²°¦Éš ´’µCMÓ ¤%”ï-$?A ö ±>™¡ÒÚgQFT;T• >%eÑï Ä«¬}n0àVonë±ãgJ â™I;p¾åí‰B}¥p„ÀÞþÖ8Õ±jùGhn¢ ƒ£3©Ö£N Üó…ú§jŸNWcH—gˆ+Ù ^5PG Ñ@±ç7,`.¨ÚÓÅEÕõíõ²ï‚¬ë6õ#_°2Ÿ¶uYÖ‡ÔyÇšleg!ΫP_g£¥ˆ§—ÅСAÃàȲñâI/¯0&P­Œg²À•5ú„€DãCbŠ£àì²l—6Ðð³6é³.Jâ{YwÆ@ißój,CÂ|õQKÞ}¸½\î2œ¦b´¼Lq‹!‘ïpG`c 8eƒ_àCµ-îɶ(ù²­òœ#mÕk⛬囜%†C'uóuòƒ¦-‘™;*„Gìz2˜°Ò¸=žLôìÁÆ´Ë®6ôúqÂÎÌm±QÓST­*Û¤"I¸…{ñG™N¥>mY䆄WkíÇ5Ÿ®—†sç y®ðÜÄŸÀð6j+ ¹lJmÖò°zxµÊà˜·$·œÓ8Ld$-§[»<_‰»µ¯à‰çr¢rG^èÉë¡ö^–ØùeçcÀC›Äô½¢¾~“e¼ëÈu]õ­nHñ4»þÞ]&/D¡ÇñãxzKLÞ\oŠÖbĮ̈@©µ?¼{{ {ÀI Uñ1— Ô¡(K=NËCú<~Ùp=ÊyUˆD* b«GÒŰš¦´& I¶Ñã‘ZjG ÐSéá¶Ìá•svPáïù8‚+-ë{ªá·Cox/½RÛÔD“”êÓ¼*Õe¾ÁdòX!ž j9”ˆ"ë­ïr» l}ÓiîP^®  ÅŠa¨2¬Âéô3Š*Ìañ?ìŠlgÀ]úhM‡ ‡삃H~ä¸ózgZflgÉÉ“9ÄB$Gà¸$3ooñVûôlÉpf%íŸúyg ;r¡U#÷4§c•ÚØs !Õ‹sÆØ}e]@$:²ƒƒ9øŸº¾®´Qµ5ßßy£Lü€C¼’»øf*ß3ÕÛ¢x˜KåÏ<Ì A©§½Ï@/à¨õü‚´C‰åcA%Œ)¡˜1v<:éêÒ$;ÈX^<940d¬I+ˆ'ÈZUºÇ±¨Á .øê?³y¥t5µMôë $¾n€ÄûDð('4áùŠ`'Øb÷‡i0ƒ€PºÁ_7,ÙÅÑl7^Z2’ ’+ØNüA„u¡ð¢¬³´Ä‰Ò\ÇŒžDÓ=\N p±/oË´z Ðj÷⾪[ž!ºát/!/Á*m›—úy[´¨M]]Â1¬ç]“BÅÌvi ‡Ð ív†ÍògË9ø;µ?ðçЦ¶[…¡ã^囸êjí12ùÚÌÊà endstream endobj 2608 0 obj [ 2607 0 R 2609 0 R 2610 0 R 2611 0 R 2613 0 R 2615 0 R ] endobj 2605 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2608 0 R /Contents 2616 0 R >> endobj 2617 0 obj 3205 endobj 2071 0 obj << /Type /Action /S /GoTo /D [2618 0 R /XYZ 72.0 138.88 null] >> endobj 2619 0 obj << /Type /Action /S /GoTo /D [2559 0 R /XYZ 72.0 456.0 null] >> endobj 2620 0 obj << /Type /Annot /Subtype /Link /Rect [ 349.61 592.7 509.585 600.56 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2619 0 R /H /I >> endobj 2622 0 obj << /Length 2623 0 R /Filter /FlateDecode >> stream xœÍkoÜ6ò»áç°¦õ¢)r@ž‹´ik÷ÚC]´+î®’]q£‡ÿû›!)‰’¨Íâ>ô.‰cEΛÙ‘>Ÿ¹Ä¿—ø+J<²ÚŸ}Ös.‰<â‡zŠ…ÄhèÄdO4³˜ìpá`ˆKôЗ³zµ¶ä·³âÌ!ßýñ',ʈCy8s&Èš›³Ÿ8 ©ÆI’h^=êÆ1’ðiƒÕž\]ï=òZÈÕ-÷ˆÈùŸsorä»ÞÿGÙœ½¼=»zˈëÛuï(Ö5G#1õq˜€OÜîÉï¼¼ùù=ùõÇëߟþIn¿?{s«E”û¥yð/¢Ò“Xà Ÿ^ÖÍ÷³ðP_ÍÁ –öòÑNVÿÆíIE©ß³ŠÑ¨ŒÍc3Iý•ÄX7º¶ð3Ô?ô¯¿XkC"íyyó¨“xI9S9ÞÁýòß~ûñÍ/³š¼`ƒ!]•«ùÒZá4ýÁsF¤|ùnGÄCAP¦,­Óe ž°‚ÁNlÈ:‡!i‘ÉÇßÿór(ÅŠW¯è”R—X (\¯)¿×˜¦«•hŠº3Á«âIò/yU/ŒmE;^•<­;,yMÛá‡nI ²èaõXÕ|ÉZC)¯º… ‘îEÕß>.Ë<ëVÝ]€^wM–›vê}^4_îžv >Цã/-¦*aÁH%eS;t¦Rˆúî)©ÄžƒÛ…]þ‰wÑÆ¡Iຼ%p.RnÎÜ#UâÀ ‚KCRr²ÆðC Çz¼'A˜ fv8c €À4uT¢Ìq“Ð§ÈÆøõL›FŒé¶+c_³{2޹9NqxS´žÆk’† ¡qKÒPÔÃd…•ë¹—PK¨Å®é˜Jv':>•d4OÍtÒuÑŽƒ}LÄdö3ð€§YF.W䉊7äu{Â?<¼|B.+rµÌ‹+˜Û’Ë=ùJhJ®ãSß]`L’º»xyóúò>-óŽ5­ €8")©ò}¾K!Î^aLãeL±:9s”ÒyþbÀÅ’$f>³à"+±ßÃÙ¿{:Ž^ —Çh„«}HÅÕío qÓU/9 UÁ×ep»ËAA³bƒÅ|0¹éI·ƒË ¢;]ü(²à ¯Äáq–ÅJæÆFýSDðBˆ>>œýÄÊ¢ç¾+2Â<¹5ӱз+p€{^R¸| 9®s^>¬Žƒ$qƒðNlw-ó)c˜”³9­ö„Å/€èY¤}MëØï>š$DpÞ!×q™Çinà$€"ÆÃØ‚ãIe°±Õ®ªÁ,/ùªå£1§®Æ*y›ð鉼6•;}MD/ iâCYÉ@™Sglk‘jÓcˆ¨ÁÌÝÅ SîÔ¯ó"Ý DÜçE٢ŪA2¢q®rÂó9Ì1…›x—Öù='‡´Þ.àr' /xÒ ª)A–¼_ äGÂ#”ŸÔíÎÊ„!í"ï>üðæhyE ænèQÏÃhª$ä.Ä‚H=n/LcJݼ y-àîcD˜Dzj˜XøñY8ä'¼YOÊF&d¼“'ãNK] Gƒ‰T„ëƒh"v0Tј¶æf`°±}ÆÜ’Ì ´£¦&Ê9–Õ¸ @âÄŽD: CÞÉ$€ÜÈHVkU¤Pb9½ˆï@RÄ€?½û†sYÊt]–yý ÊOä=”¼©‹*‰XWþŠåÒwMžÙ‰Å œ1`ÕÜöƘ.J@È‘ÇXËÑ›tµ%:ž´õýfê«‚ŒC¼Â¬/ÎÎuuvnãÃs0¯qØ©ìšrº€*Ž`œ;pøò4 €""V+7š¨þ+¬®DYòê ¨ ø—tUï1¼¡?fËÕ3•¾=û»šMLõý뗯ȯ¿¼ÇøHD³ËdF™¯Õäš\FÓ Ú‘W”V×ÅåOªF…êÊB ®¡¾!¯DQÀæ\-¿mý›ài†Š:GÁALˆôµUaA8²­mvXºë·EøXÎstçgÙÒ¹‚Ša¢$N:º&U³Ùp¨c±ò_µ( ¬òh<ë¤A½)ZÈ1æÔ2M™‰ØÄ«^KúÞ{$çùZìÕóºlø9I×xr­Ta*ÛS*1›Ø.KUèg`ˇm眶ÂJâ.µ|$€±”.‡”t$œì|Ïá6³‘J GRQÜ;X“¸3rþíHíJà… YŸÃþÌ‚Ýw‚‘Y¿™œ“¡a‡äl(]hfÛÏŸX©%»Ä¼:hï´ÙÕ t~:Í!ŒVÒcŠçÏìl,›ÚFË÷'¶2OŠô«\zG¡šJå@œc 6Ë7…(Á¤’ù`ÕÇ8¤VzØL CÖˆsJdt# îBxQÉ?7ù€æÍf‹9™… ó&6ܧ(ÒÅ´m—Ÿ@ƒœn¨ =#þóó.ÜØëfŽ$NŽëyZ ›¶k¹ÔíŠ2ܧ»ÆÅzfÝ:/eûJƒÝ©ëfî¦m/ùh?äõ¶‡Zy‰§^A"Ÿ ·|fŽ«H!9öh‚ ïõÁ†Wœwc-˜C V¥›jj>E‹},IB'±°¥_Ã?c‘¶2§TÃÒX8Å./ø|>äG 8žg!A¿Î¤l®„˜x6&¥'ÎSŽnî¨ldgB«ʉªW|SššOkÓ ëFãz\¿ÇW&l }nòšHC£ù—¼VÝ©¦,e³{ËaáÝ…Øãû¸»OHn ,o»†2vy2ѽCº@×ÅÕ[ì;P†CB¸‹7ÔÑ׺+<9è-ÒßÛO.Zœ›RïR|ƒ1–(<¿ñ'¥zõŠ/‰ÉÅFèVÃúí«ô÷{ºù¼»b7·8]é³Ý=Ýš»Û¹0æ*s¿:D-ÔÖí,¸J¹­¨ÛO 48ï¡~B?t\' ,ªØXƒ|G³”ÀaÇP\¨N«›,SmLSw³|‚Ý„ù„ *´íSï¯õ‰úpNç¿ b0ÄgüÈ‚í¹s EÏC®?ÑÓ`ºÃžÇc?QåªïÚM`Î{pÉ+¨¿OɃ8¶üã¿R-6ª`èy¸C& –BµÀÔ~Ô£ CÉ/—M¾«Õ§í˜É&=…±Mùͤ 6Ô{±–«ªC¥ÆêuW I:4õ¸uüzÌ ,\œ ;7:Šaaˆ±â‡^*|´DE?‰Æ†×_çßi…x¥@f¡«]yÞäNtl;íǪÓvÙä>e¾lô¹W“+õá‹6ˆj»j»Ñ€3ýþ+Y© endstream endobj 2621 0 obj [ 2620 0 R ] endobj 2618 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2621 0 R /Contents 2622 0 R >> endobj 2623 0 obj 3519 endobj 2625 0 obj << /Type /Action /S /GoTo /D [2559 0 R /XYZ 72.0 412.0 null] >> endobj 2626 0 obj << /Type /Annot /Subtype /Link /Rect [ 136.376 674.1 238.376 681.96 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2625 0 R /H /I >> endobj 2628 0 obj << /Length 2629 0 R /Filter /FlateDecode >> stream xœÍYmsÛ¸þ®_±3sÉŒEï¤;ýàØÎÅ™sܳuMÛóM&a‰>¾(eUíô¿wà‹Bv>]›Ø#vÏî>»¿MlBáÿ?ÂØ!I1ùÖÎÙ$tˆ´S~@ìÐ hD Ò"?"9.Ü{Ä%í£+gÛÕj°$_&å„’'¿þ‹RB-Ÿl&t$\‰¹›ü ÊýÀrƒ(ŽãÖVDz£U¸VIAfW…C.*¹º³Ñÿ¹õ»¹¶ó`%‹ÉûùdöÁ'6%óÇ!BÖ˜CÇ'‘åâc 11/ȯo?nW¼¾ûù'R•ä—ÏW{÷™š\ÎÛ#Êý2ˆø -I{/|î¿Ù‰²~~˜…_ÏrÕÌX`R!_å­cÛO|Ñ=ú(õy˜VÔÎfÝM±?Rù Á6µ¢=_8~°ÿ~|ýÁ¨‰ºŸ‡Žâê‰Õäñ<Ë&o³œ÷ƒMÖ,û럞y-2ˆÁnœ³žŸ Ãì÷A„iö!ÖͰÀŠ¢R›z#‹Ä·¼©ª|j[ŽåZžv‚Fçq<ðMıëÙ#AƒUÍ’5?ˆs–|:í‡kÁ÷VÀcÉK§ï'®ú'Á¶¯ŸÙ£Ž…¦!0Á3¿xVJªmè«¥vì¬K\—‚²ÈUëΫZ8 B+Ä3òaО±´J@èSÐìùcñ¸ßÕ·š-, ýÛ+V9Ÿug¯m³@Ý …ØëJ Ù¡7`n”Ð"R@ç u-ßµ«ƒä@Ôï¿Þ|ù|y{8vCD8(ß‹áÚZ±¬Š›Ò¬æISÕ[k˜ûE|Ñ.ÐÆO†ñXc²,ªô µ}i¯Ê‚ýÎ_»QÜbŸ±'¶æ,e ¬LɦÎ9¨Ê|KPÏAz±cËv1OÜx,ô»œcÇö "¬žþ©{¶"+cÙöÀR/&ªt`¾Ä!- IÍÉ#Ð5›O‚ØòÕÛ‚x8Ø™ÉqfgNöÄõUÂò©¶^,:ù‘§Ëogº¶N×Û¯ôB© N¥LM|¿1(Ñ+q4-Ê eù0_ «’bv伊ŒfK;£›ÒИD‡¾QD)ä­Š…còæ*=%‹ϵ] ÛžÒ~uNíøÔþAÖ¥`Ï<%oÈ(ö#è(Q.…jSJ_¤êù2~QdJnÏIR•Ùb]³ë´äw¨p)yØ’»oùŒ}5œ€‚›B0ɉôüÁðø„*¶¢ˆl=±í<–$¯A8<%äÍ¿akma2ýǤ2Ö!ep+:Wú;Ÿ&lZP.SÑ âsE×9\•  !ÌGàŽºß°Ó$lA>û˹[ñDr=òƒŒ`÷‰`p°K£‘ó¾deZm:¯²–0A$ƒAmƒø «S" @-¥Á\–¶1›x÷Ê—k‡FþC„ž+àd3Ñå22¢X1L8“ª¡À”ÀÀKV‚ Í"äþ­¤±±2GïŽÑÛû¼LèlµÊ3.”‡¶ H˜;¦oÈÓh°M¤ûw&üÜ@s¾aè^;3“áýÛ²*§ø  lî߽Įh¾S„m¤~7ð5Øa1yJ’SÕyœÂ6üM2CäÁ…T££dPëîÎ Ë#½T¯ —Ù@Ù0¬½}xÆK<ê¢t€ð„äU‚p/ÁæÙzV°õïpô ¬c‡üuºËY³ôaÖ ü“X®ȨòÏM½æñ®^•_ÄÖóœ}¼Cëùކ[Ghd~{öùîì|~uóùëíåÙÅ×ó›ëë«ùüò &Æ/سu5’Tu<êŽÉŸw>ˆ]U>±¬Öyjh¼p\JU‹ „Òbh¨ëÛAjÇ•D.Å}ï z¢qU²À~üÊJšÉÿ™5Š[ÿzm £˜¾¶>WÆîò͈ èÞkü’¬ke‘†úÏÖyÓßaËS»I™^±È¯Ö@‘@,H±¨SU¦¾;G’&-ÈîpÖ>–píÑÝÙ‘‘õ|[¯­*…¤iËJ4SÁ »œHÞÅ€†æ4ÂÓÙ¬cájðÅTñ=½ºÎßW—Tçð]Ò^¿oúa Ò°&„9‡›(kx Nù\’¨s;édòG¬WՂɶ¾äªrC$´—Mg!î–}Qg~ò¾ ż»ÉŒõÔßÇèXmÂ’m0+° WC•–‹:0hž*¼Ê&ŽÖĆ•Íp=åŠM¤".àNð¯leÐåxîÇõC´c7º€FL6Éò¦Ü_ÑÞÜÜžÿtùõãÍõå a™Á%MÂ~`¬ÈõtçµÂ6:<ÕV`êÁÓC×sKD…ÌscJÞ¸ÄÝepa–Öw>„~?dßß_'~hÀ„ç ¨°kýÕŸ#vÿèõ_.™g- endstream endobj 2627 0 obj [ 2626 0 R ] endobj 2624 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2627 0 R /Contents 2628 0 R >> endobj 2629 0 obj 2391 endobj 2083 0 obj << /Type /Action /S /GoTo /D [2630 0 R /XYZ 72.0 567.24 null] >> endobj 2086 0 obj << /Type /Action /S /GoTo /D [2630 0 R /XYZ 72.0 444.9 null] >> endobj 2631 0 obj << /Type /Action /S /GoTo /D [2559 0 R /XYZ 72.0 368.0 null] >> endobj 2632 0 obj << /Type /Annot /Subtype /Link /Rect [ 179.744 336.66 294.604 344.52 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2631 0 R /H /I >> endobj 2634 0 obj << /Type /Annot /Subtype /Link /Rect [ 169.215 254.28 277.386 262.14 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2619 0 R /H /I >> endobj 2635 0 obj << /Length 2636 0 R /Filter /FlateDecode >> stream xœÍ[[sܶ~÷¯Ð[“[–¨{ÎSÓ¦­;nÓÖN“3u§£]q½:ÕŠIwûëH€­¤užzÎ$±ñA$‚ ^òñ"ôøs%eóÖ»‹Ä ½ŒyQJ¬$õÂÌOƒÜÛyò$÷YpDÊ"DFŠK¥l½÷íEà}{ñÛïP¨ò?ñž.‚‰pswñ34ž¤~”æEQ®Ìó\6ù)ëw}³cÞ×B•ÖÚKAÁÿ\{W£(dÿÞãÅëû‹ëo/ ¼ûu ËÀÌK¼Ü$Y€OÜï¼ß^|wÜóîîç[O´Þ»o>¼üÝ»ÿþâÍ=uQÕWNÄàoæ+O}Hâ`üÅñ2÷\øûò€ãƒJ;õ©¡¥ßòƒ&e(ü½håT>&e±²ñ3#"+†ŸÆ‚¥cþ±ýÃV› ¤l{¹?ÁįÚrÇ{ï%|L¡©uké£8tî—z°¨_wõÞÁkÑnêG‹7uÃ} o6—TnÁ ÜJ*›Æi´ï¼¿édÁSÙ󒺃ÓÒ’ïùêŽwŸø¨_ýÀËÊ2Äf¶*ÖsT¶¼E7pÌË‚ûîÊ?eo£ØÁj‡Îì ÒÛò“ýPZ6/›a{4ØU9Oõ°©øÄW½*èï;c¨Õ “|0ôai«Wÿ9ôƒ«ŸmçÝ/·V€r$Ñ×ß§žå¹_,ò Z¥ÿØ B4~·Ö&®Çç8Z·Õd"æGQaQ{Ðåû/ùöÍý_Ý~ywçA`üŠ‹IÒ8˜â÷Z¼µ“O¬]¨\ÃQ&}ZKóaЪ­E#:Ý–t­ÃþZ±a+ §“ZöÓüöücK(M¯X„)ê«Bµ¡ Ìñ«¨x£9·u{ø‹›Š´fKò»ŸÞ}ø× gŒ¤¨ÓŠ&ߖ䟜ï5ÝVÖ£Τk s)#g³ó“ÙÀ¢©¡¦aɉA6‡–Ö¼þ°ß75,«£·“Ùƒ\ävfÅ×¥l‚Ÿ^°¶ôž\<åjÞŠö Ç}.-eqæÇ2f)ÅÇ·› „£Á&£¡êCÏ-lê]=Ðrãª{‹DëT°á±6;¢zøÂEçÂRYYÎÄʂǎ—ƒÛÌHK ô‰èSÙÕœö-層ŽÙ$†ÃhWNÇÈs@žâÂØˆryjTf幦ÀqëM“´¤ÊµòøŠ|K²t¨ÓGÛ×ðý¶nLAZ$Y‰ö‹AÝ/ÕRý¸5¤;5‚š¥“=I¿½»ê÷| š®Ü’Ãtœö< Oz^V;C«¡ôÇC >‡5,"RÍJxJ«Ò{âàœhkOZXá—_+ ¢àÒ0ֵ̅€19 2xÁ`ÂZ¸á¼Z•ë?Ï- š¦™T0CýnlŒöî8ÌFï'™nU0gÎÄìˆE~TÀ0NG1ûŠ1.¢Ð_þxtXìÕ[ëÌ– E:*+ðˆÉ€þ4jG'ºY3¯æQZJHÀèª&+'†Ý¨C¸`tÖA¼MÝõnããÝÐ…ÐÙ‰·:N·×QrjZgo ™€¬F…Ÿy6í",ýc1žD÷'tìÒaéCD”Di)ŒØÕó‘LéÝŠmϵ۴>%B´:Ž?µO‰SVU-çm¨©s橉 HMän|aÕÇ(D—†¶M#&/@€k5Ò¥\]Ö:$ÌÈ4äà »Uè@ûˆ;GfåÂæÂÖà4]]¹J`–i šôµSŸbѼÆSëÈ]ÐÈ:N“ë¦T;©i­<ô³´(ò"±VxZˆÍ•úJì1®'~nœžœˆìÜD¼x¸Ÿç1$’i1Ó J¤S]ß©•ùY µ¢èL¥^]c^ëKOûȘŸRL>ÛøLhd –¾êÇ [¨O–Ÿa 3¿Ha»–'ñŒ´qz>Õ%ËÏÕvja«ºãëAtÎ?鸽<ƽe4õ'§°pÚ‘n<ã_Et¢%f*tJËLš/I™øéMƒ¤wBµ2'sF؜սᔭ¹<¡³rNÕ¼†%ýZï–Ç#OΉ°]ì>C"óó9l¹–ÔéÖ~õœN²ê9V'kÀ;ý#üÕPýpløtLã 9‘ª3uêU¤_ìf’ûI(ë²bFÎõ¡ï®åx6¦¿‹ 3vN”Õé×w_[ ºgᤔ?Ó#–ÃÚ%OÞÃ"™ëÒm½ê`Ç{}‡{£0uýÌD“äœL·o3Ãf'åßÞy¼9C¿û%H+=ˆVk¹ÑP»*φy%9°ª æÂYU ûa t»7³¨L ýZsu²X$n¢†hѰiêçE;̦'÷5Ë~’ægäX=ÌÂð&ŠPiIØE;è [ÑòÈñh!íYFÅ7uëÔ]gX¾$J_kÁ ¶hyø½*{îX[0B ;­­vÄx «2QC­Å,B¬Ø÷É]þ¥A”Š*š](ŸÓ€N–•0Ü (o_Ìíë“m¶¼·mãa)ÒúîB”„’ÝÞ ÐÇ­¶›7›YåËn.î¥ñØh‡ž’ÞL¥nèÕŠÆ´ÄÀÅ!-B?ˆ#ÔŒMÅ«iîÔ·µ2ŸÉ’ò”îL­…9ât ü-O!Ê$Åó­Ï9RúIS+ÍQõÍu\f/r‘Ö>¢€>nU@;Œè0™½EF‘Ö3°Ea‡‚òŸ Ï6Ì”Diz73ØY:îæìK ³‘ÉD ÏòiUi€WÕ*¸®Vb9N…ìŒß<¡øx¥X'’7½^ ÜËÛ[FO‹"|Z¤ž4d^ŸhÄ^„6 *á?BH3ò¡(|ŽÃ0—D΢$òºÇ‹,‚Š™Ÿ@N‘B$Ç‘mzim@%¹ËïÞü  º‘4Õj<#`ñ݆‚7Œû€ãã…n Ä1ê’èöbH€FŒó­J1Ì•ÉN„ŽZ¶vêë•}œ4ï2Îö$…ɶÍKëqÚ¨VCÙÛ±ñ©*Ë-gºóDŸöýÌ{ŸXyƒ dÓäL?uüŠù ¥ò!‚÷‚P¯o5‰E¾ÀD„©‘Ã0Wš;Mdtüã¡Ö—È¢Ó鹯ÆO<ŒP\þΩx"dߣâ¤ïwv˱>òåv6`ñ\U Ö‡®©«3kw˜eç¤øÞ½ZðLäVH¬zÑpÈZdBÛoÅ¡©¼‡©»Ÿx5ó’#ü ÛuØ+±ÑL’7-õ¦6ç¹¾r¢“…–ó<Ø`çtc5ŠG)¼}ÿã›_–­‡~\HŸ‹x‚öŒò¾6Ö $ gd|Æœ•`uØè£íŸTÑÑBòFÔÕw+vNY“¨_ZžpLNË#½óWàSÙˆÞýŒIbX<¦ýøòÝýw|ssûæ\‚™dÉI5zp–93A)Ýó08œ}Iï22;‘^=¹z¢ $3žå°ë)¿žÊ sØgô(˜Ÿ†!¸sÎÈø/JÎJ°:ØGƒ ÞÓí”ýh‘û¥ÓÏ÷B‡Â›ä¬Z:㥅tì©…:ã¢Ï 3:–Ÿ °M÷ÄzÆÔ¡MoHy£G/ñ€Z!°—wˆÏÌhùvÂIžÌ´ÿY>ÁÀ¯ÎÈ0J¨7$ѹ‘6/ÓÊQÁÄj÷$ZP×ÚgÅéL=–$«àcIª# ‰Ká3–У܇l.² Ÿéåz»gNÁ`p‹bn¶“¿Á>®^Ã⻫{à o5…Ud«Ž )íákpo‹PfÒ…hcAñEtÎZðƒi¶Üˬ «ñn}ý¯­¼S¦ëëðŽ»gÎs­ýÔña.ŸØÆµ€ Øu»NÙu6 oÌZãÿ­OBõ0·I”Í‘ÄuiµMB²´L™gØâCÙþm?*gF’Îj,Ï´ ‘,VÛ•‰¾Ÿó¢3õMóӈα ïÅl7õnáËÚW‘á÷_¿þÊ€w¿Üš|ŒN¯.G°uúöLOœŒÕÝÃþnwssmD´üÖ¿zxi9÷³>Ä@änVss[E´>CC´<0yârYLÂhªêç¢ÉCÎe9Nwôš„ð·w#éuïå¨G˜íîìÿmÑ—£ÿÚñ_Ë¢?9 endstream endobj 2633 0 obj [ 2632 0 R 2634 0 R ] endobj 2630 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2633 0 R /Contents 2635 0 R >> endobj 2636 0 obj 3818 endobj 2367 0 obj << /Type /Action /S /GoTo /D [2637 0 R /XYZ 72.0 696.0 null] >> endobj 2638 0 obj << /Type /Annot /Subtype /Link /Rect [ 351.057 586.2 453.057 594.06 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2612 0 R /H /I >> endobj 2640 0 obj << /Length 2641 0 R /Filter /FlateDecode >> stream xœÍZmsÓ:þÞ_¡m™¡ì´Žåww†…(·K—¾Pvoït[i Žl§!ûë÷I~W€ûåî˜X²t^ó(åÛ%&ü9Æ?´H¼Üû¦æ(ñ-b{jÊõõ Ï È’¨Aà$Ã…½G\¢m1«VËÁ‚Üíå{&y»÷û°(!¦á’Íž9.Å\ï}å®gØ^†¡²Õ2h  Ûðà!^’ÉùÒ"g\¬®­GAæÿÜú®E6µþ,2ÉãÞ«›½É—P“ÜÌ[øX Âì[. CÀÄÍ’ü~øn»bÅõÇ Âsrûáüó‹?ÈÍû½érQì ²à¯o$õ^¸ŽÙÓAY3ßÎÂ?ǰåÌ`ÒR¼ÊTbÕ'¾¨](ù¹30JTgó0M"b¥òd7RÓz¹°<Ú _qÔF‰DÝ»ý±Ì°Ê*Êÿ‘„z%‡s^4ÏÕ‚5ÏÒáÉ›p"×ß4©éŒdÏÓŒ$3sÿj#›¨ç-ðÂÐvèHB£?Žª(ãF3ñ/¾nž—ë²jåzµÊ¶;Jˡģf¢ ¢ü–4£÷g¯^7ƒÛ«‹Î޼}L–iž–UUé“ÎvÃn™ÏÖ%+H-Ù‰ò„`¬WQYnx‘u¬|ˆäÏñŒÀó ÞÔ–‚¦ß£å*cˆN&“FÒXLà#‹1MÛíŠC‰g’\ŸŽw„žáãˤíŽúÌ’’Å«vV9(ÐP,”m+c¬d¼ê‚ó¯PfŽ-Ë ÎTí³¬Ïjóå’åÝ·|I¹cyÅWí€Ïw¬‚’Ö‘XÆEºêŒ7‹4^´Ã Ê_G]Á¤I K:k !UÊóÎ:Y õ.åóôq]ˆšPÙ–a!„]ßnû n‡”Öbññ)*R¾.ë!Ò§úy•E¬\–F=󚯶õ³²KYVÕHZÖ¨ê¨ÝÙ'-ŸÂ >xîG¦ã~ èöÐS?4L:¬8šÒ°‰Ä½ÏÛí€þhûH¯»vmÙ…Z`†»LÑâõÏ›xHh ‚‰Ha‰&£Ž3Ýà T™ÞnùºhÇñ‚§1»a´SÓDÂVŽ”bµºÉœ×¹“£(Žá,§ygôJ#)͡ۯãuiÞy®:6½á›{¨–}ÔÎl·QƒMšeí¨d}Ï4A„ëZ?ˆOQ¶f3± œ®c„M“zf?pžó³ëð¡áíÐ<Íf‚Ü¥—š¶ác×ñéPS:4¶ÇsB¡Î²j>6œøÕtl¨Æèép¢Î|Íк„ üVÔ3GN¬ù-‚ÌžôÆ•è8 ÏΓÒ–wb» +©ylºÇpBOœðĵþMÖy=ŒŸMUwN€÷†ºjׄp—Ã5¾U+¿–m¯×‰` ö׿K‰kV<ÁuæëzÎ C#Ü2]ÃAdzqíš1qàö‡ßnì“x­* U W4 nñÚôv&L«„ºpYêîtÓ²œAˆ?3ãoðCÞ*Åmˆ(P1TU(ÒÇEEê†$ü¨ÓÐL´[k“íô#ßú-è•bUû2ÅûX/Kx¿Y°B š1iS"®‹5Ž=LÞF”<аàë,A â·M®µÔµ)Ò-òìAˆÈ Z)PŸû%DìÜ'³-‰È+(,Ë s¬´½IRnó*ú®5È· S`ÝúA°:pglÐÝùÅùpyCî.¯~ƒR¥¦`½G6±¨¬î_ˆ|ä$Nº\•P°ëQ²ŒÅ€ ¯ëƒDèÁÕ¹¾÷§ŸN¦Ÿ§¯ooN_]L_NÖe1™¥ùäKôé$„þÏ cú#ŒÞæpÐJ¿˜¯R&¿7û"šÓ‚/öò°I„B•NLâƒcMÔ³`%ô˜£öì4ž³Wï.ÿ1délR³=Ð{¤êtw "T`CÎéZÞï%ŸWpagdALR¸>W¼ØêâØî¿x\DÁ¬vA髵px¤ 1À´ÄÆ•EpŽ¿iuD²ô«î„8θY+¯©a6ú0)ò€Ä`ô‘È‹hVåŠÅé|+²3_C•Va¤Ä=m¬ÏöírJž+ÖºžKçîE‘ƒb„Ÿ|]õ½L õ2yuã.Q·F§çŒ²Þ„ŠžÜ+A u’¾óè:¾3È+ àæòòâáýéÕÃ?OoÞ½œðU¥.ëÇ–a¦ ¥“Ø£´ã­Rùˆ]¾~8=;»x8½zÛòH:{HH$Û„À*°áÅ ì8èEŽˆ/ AŸ0¡ ¸ø¦‰ƒMÚö ·ÏLÄ^LÊS”fx¡¨½Ü°üØœ¼GX&ï¯n®«ï1 Páʵ.ÚʧþkÀ›«• endstream endobj 2639 0 obj [ 2638 0 R ] endobj 2637 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2639 0 R /Contents 2640 0 R >> endobj 2641 0 obj 2824 endobj 2643 0 obj << /Type /Action /S /GoTo /D [583 0 R /XYZ 72.0 412.452 null] >> endobj 2644 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.06 656.7 162.56 665.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2643 0 R /H /I >> endobj 2646 0 obj << /Type /Action /S /GoTo /D [1247 0 R /XYZ 72.0 599.26 null] >> endobj 2647 0 obj << /Type /Annot /Subtype /Link /Rect [ 132.28 617.1 149.78 626.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2646 0 R /H /I >> endobj 2648 0 obj << /Type /Action /S /GoTo /D [1247 0 R /XYZ 72.0 533.905 null] >> endobj 2649 0 obj << /Type /Annot /Subtype /Link /Rect [ 139.5 605.1 157.0 614.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2648 0 R /H /I >> endobj 2650 0 obj << /Type /Action /S /GoTo /D [1306 0 R /XYZ 72.0 287.49 null] >> endobj 2651 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.15 593.1 183.65 602.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2650 0 R /H /I >> endobj 2652 0 obj << /Type /Action /S /GoTo /D [332 0 R /XYZ 72.0 447.435 null] >> endobj 2653 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.49 581.1 156.99 590.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2652 0 R /H /I >> endobj 2654 0 obj << /Type /Action /S /GoTo /D [338 0 R /XYZ 72.0 720.0 null] >> endobj 2655 0 obj << /Type /Annot /Subtype /Link /Rect [ 197.26 569.1 209.76 578.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2654 0 R /H /I >> endobj 2656 0 obj << /Type /Action /S /GoTo /D [332 0 R /XYZ 72.0 138.87 null] >> endobj 2657 0 obj << /Type /Annot /Subtype /Link /Rect [ 164.49 557.1 176.99 566.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2656 0 R /H /I >> endobj 2658 0 obj << /Type /Action /S /GoTo /D [344 0 R /XYZ 72.0 416.736 null] >> endobj 2659 0 obj << /Type /Annot /Subtype /Link /Rect [ 208.09 545.1 220.59 554.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2658 0 R /H /I >> endobj 2660 0 obj << /Type /Action /S /GoTo /D [371 0 R /XYZ 72.0 313.56 null] >> endobj 2661 0 obj << /Type /Annot /Subtype /Link /Rect [ 282.53 533.1 295.03 542.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2660 0 R /H /I >> endobj 2662 0 obj << /Type /Action /S /GoTo /D [680 0 R /XYZ 72.0 621.75 null] >> endobj 2663 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.7 521.1 169.2 530.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2662 0 R /H /I >> endobj 2664 0 obj << /Type /Action /S /GoTo /D [669 0 R /XYZ 72.0 94.382 null] >> endobj 2665 0 obj << /Type /Annot /Subtype /Link /Rect [ 180.58 509.1 198.08 518.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2664 0 R /H /I >> endobj 2666 0 obj << /Type /Action /S /GoTo /D [335 0 R /XYZ 72.0 534.86 null] >> endobj 2667 0 obj << /Type /Annot /Subtype /Link /Rect [ 155.05 497.1 167.55 506.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2666 0 R /H /I >> endobj 2668 0 obj << /Type /Action /S /GoTo /D [338 0 R /XYZ 72.0 591.11 null] >> endobj 2669 0 obj << /Type /Annot /Subtype /Link /Rect [ 200.59 485.1 213.09 494.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2668 0 R /H /I >> endobj 2670 0 obj << /Type /Action /S /GoTo /D [338 0 R /XYZ 72.0 289.678 null] >> endobj 2671 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.89 473.1 183.39 482.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2670 0 R /H /I >> endobj 2672 0 obj << /Type /Action /S /GoTo /D [341 0 R /XYZ 72.0 72.008 null] >> endobj 2673 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.82 461.1 165.32 470.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2672 0 R /H /I >> endobj 2674 0 obj << /Type /Action /S /GoTo /D [359 0 R /XYZ 72.0 516.0 null] >> endobj 2675 0 obj << /Type /Annot /Subtype /Link /Rect [ 142.82 449.1 155.32 458.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2674 0 R /H /I >> endobj 2676 0 obj << /Type /Action /S /GoTo /D [913 0 R /XYZ 72.0 94.5 null] >> endobj 2677 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.05 437.1 152.55 446.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2676 0 R /H /I >> endobj 2678 0 obj << /Type /Action /S /GoTo /D [353 0 R /XYZ 72.0 259.2 null] >> endobj 2679 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.94 425.1 176.44 434.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2678 0 R /H /I >> endobj 2680 0 obj << /Type /Action /S /GoTo /D [272 0 R /XYZ 72.0 93.6 null] >> endobj 2681 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.28 413.1 164.78 422.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2680 0 R /H /I >> endobj 2682 0 obj << /Type /Action /S /GoTo /D [332 0 R /XYZ 72.0 582.86 null] >> endobj 2683 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.94 401.1 156.44 410.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2682 0 R /H /I >> endobj 2684 0 obj << /Type /Action /S /GoTo /D [594 0 R /XYZ 72.0 708.0 null] >> endobj 2685 0 obj << /Type /Annot /Subtype /Link /Rect [ 250.88 389.1 263.38 398.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2684 0 R /H /I >> endobj 2686 0 obj << /Type /Action /S /GoTo /D [594 0 R /XYZ 72.0 560.185 null] >> endobj 2687 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.39 377.1 215.89 386.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2686 0 R /H /I >> endobj 2688 0 obj << /Type /Action /S /GoTo /D [591 0 R /XYZ 72.0 185.904 null] >> endobj 2689 0 obj << /Type /Annot /Subtype /Link /Rect [ 224.51 365.1 237.01 374.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2688 0 R /H /I >> endobj 2690 0 obj << /Type /Action /S /GoTo /D [341 0 R /XYZ 72.0 451.71 null] >> endobj 2691 0 obj << /Type /Annot /Subtype /Link /Rect [ 131.16 353.1 143.66 362.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2690 0 R /H /I >> endobj 2692 0 obj << /Type /Action /S /GoTo /D [371 0 R /XYZ 72.0 269.64 null] >> endobj 2693 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.23 341.1 186.73 350.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2692 0 R /H /I >> endobj 2694 0 obj << /Type /Action /S /GoTo /D [1232 0 R /XYZ 72.0 582.96 null] >> endobj 2695 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.94 329.1 156.44 338.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2694 0 R /H /I >> endobj 2696 0 obj << /Type /Action /S /GoTo /D [1247 0 R /XYZ 72.0 468.55 null] >> endobj 2697 0 obj << /Type /Annot /Subtype /Link /Rect [ 136.16 317.1 153.66 326.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2696 0 R /H /I >> endobj 2698 0 obj << /Type /Action /S /GoTo /D [371 0 R /XYZ 72.0 225.72 null] >> endobj 2699 0 obj << /Type /Annot /Subtype /Link /Rect [ 137.56 305.1 150.06 314.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2698 0 R /H /I >> endobj 2700 0 obj << /Type /Action /S /GoTo /D [1247 0 R /XYZ 72.0 337.84 null] >> endobj 2701 0 obj << /Type /Annot /Subtype /Link /Rect [ 145.6 293.1 163.1 302.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2700 0 R /H /I >> endobj 2702 0 obj << /Type /Action /S /GoTo /D [1247 0 R /XYZ 72.0 403.195 null] >> endobj 2703 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.6 281.1 158.1 290.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2702 0 R /H /I >> endobj 2704 0 obj << /Type /Action /S /GoTo /D [583 0 R /XYZ 72.0 696.0 null] >> endobj 2705 0 obj << /Type /Annot /Subtype /Link /Rect [ 216.69 269.1 229.19 278.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2704 0 R /H /I >> endobj 2706 0 obj << /Type /Action /S /GoTo /D [371 0 R /XYZ 72.0 181.8 null] >> endobj 2707 0 obj << /Type /Annot /Subtype /Link /Rect [ 164.76 257.1 177.26 266.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2706 0 R /H /I >> endobj 2708 0 obj << /Type /Action /S /GoTo /D [1353 0 R /XYZ 72.0 439.335 null] >> endobj 2709 0 obj << /Type /Annot /Subtype /Link /Rect [ 173.39 217.5 190.89 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2708 0 R /H /I >> endobj 2710 0 obj << /Type /Action /S /GoTo /D [666 0 R /XYZ 72.0 570.11 null] >> endobj 2711 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.92 205.5 181.42 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2710 0 R /H /I >> endobj 2712 0 obj << /Type /Action /S /GoTo /D [632 0 R /XYZ 72.0 659.864 null] >> endobj 2713 0 obj << /Type /Annot /Subtype /Link /Rect [ 128.38 193.5 145.88 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2712 0 R /H /I >> endobj 2714 0 obj << /Type /Action /S /GoTo /D [64 0 R /XYZ 72.0 680.113 null] >> endobj 2715 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.94 181.5 151.44 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2714 0 R /H /I >> endobj 2716 0 obj << /Type /Action /S /GoTo /D [1232 0 R /XYZ 72.0 517.8 null] >> endobj 2717 0 obj << /Type /Annot /Subtype /Link /Rect [ 173.93 169.5 191.43 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2716 0 R /H /I >> endobj 2718 0 obj << /Type /Action /S /GoTo /D [1247 0 R /XYZ 72.0 159.13 null] >> endobj 2719 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.6 157.5 168.1 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2718 0 R /H /I >> endobj 2720 0 obj << /Type /Action /S /GoTo /D [1247 0 R /XYZ 72.0 93.775 null] >> endobj 2721 0 obj << /Type /Annot /Subtype /Link /Rect [ 171.15 145.5 188.65 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2720 0 R /H /I >> endobj 2722 0 obj << /Type /Action /S /GoTo /D [632 0 R /XYZ 72.0 471.878 null] >> endobj 2723 0 obj << /Type /Annot /Subtype /Link /Rect [ 113.39 133.5 130.89 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2722 0 R /H /I >> endobj 2724 0 obj << /Type /Action /S /GoTo /D [1250 0 R /XYZ 72.0 685.44 null] >> endobj 2725 0 obj << /Type /Annot /Subtype /Link /Rect [ 149.49 121.5 166.99 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2724 0 R /H /I >> endobj 2726 0 obj << /Type /Action /S /GoTo /D [1250 0 R /XYZ 72.0 617.76 null] >> endobj 2727 0 obj << /Type /Annot /Subtype /Link /Rect [ 142.83 109.5 160.33 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2726 0 R /H /I >> endobj 2728 0 obj << /Type /Action /S /GoTo /D [64 0 R /XYZ 72.0 244.76 null] >> endobj 2729 0 obj << /Type /Annot /Subtype /Link /Rect [ 116.72 97.5 129.22 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2728 0 R /H /I >> endobj 2730 0 obj << /Type /Action /S /GoTo /D [1250 0 R /XYZ 72.0 550.08 null] >> endobj 2731 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.05 85.5 167.55 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2730 0 R /H /I >> endobj 2732 0 obj << /Type /Action /S /GoTo /D [635 0 R /XYZ 72.0 533.534 null] >> endobj 2733 0 obj << /Type /Annot /Subtype /Link /Rect [ 134.49 73.5 151.99 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2732 0 R /H /I >> endobj 2734 0 obj << /Type /Action /S /GoTo /D [58 0 R /XYZ 72.0 248.751 null] >> endobj 2735 0 obj << /Type /Annot /Subtype /Link /Rect [ 388.38 709.5 400.88 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2734 0 R /H /I >> endobj 2736 0 obj << /Type /Action /S /GoTo /D [658 0 R /XYZ 72.0 298.5 null] >> endobj 2737 0 obj << /Type /Annot /Subtype /Link /Rect [ 418.09 697.5 435.59 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2736 0 R /H /I >> endobj 2738 0 obj << /Type /Action /S /GoTo /D [1283 0 R /XYZ 72.0 399.262 null] >> endobj 2739 0 obj << /Type /Annot /Subtype /Link /Rect [ 421.15 656.22 438.65 665.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2738 0 R /H /I >> endobj 2740 0 obj << /Type /Action /S /GoTo /D [302 0 R /XYZ 72.0 442.856 null] >> endobj 2741 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.23 644.22 436.73 653.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2740 0 R /H /I >> endobj 2742 0 obj << /Type /Action /S /GoTo /D [649 0 R /XYZ 72.0 261.154 null] >> endobj 2743 0 obj << /Type /Annot /Subtype /Link /Rect [ 379.48 632.22 396.98 641.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2742 0 R /H /I >> endobj 2744 0 obj << /Type /Action /S /GoTo /D [1288 0 R /XYZ 72.0 162.362 null] >> endobj 2745 0 obj << /Type /Annot /Subtype /Link /Rect [ 408.38 620.22 425.88 629.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2744 0 R /H /I >> endobj 2746 0 obj << /Type /Action /S /GoTo /D [968 0 R /XYZ 72.0 115.23 null] >> endobj 2747 0 obj << /Type /Annot /Subtype /Link /Rect [ 420.05 608.22 437.55 617.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2746 0 R /H /I >> endobj 2748 0 obj << /Type /Action /S /GoTo /D [652 0 R /XYZ 72.0 415.235 null] >> endobj 2749 0 obj << /Type /Annot /Subtype /Link /Rect [ 342.56 596.22 360.06 605.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2748 0 R /H /I >> endobj 2750 0 obj << /Type /Action /S /GoTo /D [1247 0 R /XYZ 72.0 248.485 null] >> endobj 2751 0 obj << /Type /Annot /Subtype /Link /Rect [ 375.05 584.22 392.55 593.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2750 0 R /H /I >> endobj 2752 0 obj << /Type /Action /S /GoTo /D [583 0 R /XYZ 72.0 160.104 null] >> endobj 2753 0 obj << /Type /Annot /Subtype /Link /Rect [ 445.86 572.22 458.36 581.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2752 0 R /H /I >> endobj 2754 0 obj << /Type /Action /S /GoTo /D [1232 0 R /XYZ 72.0 329.76 null] >> endobj 2755 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.77 560.22 407.27 569.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2754 0 R /H /I >> endobj 2756 0 obj << /Type /Annot /Subtype /Link /Rect [ 422.55 548.22 440.05 557.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2754 0 R /H /I >> endobj 2757 0 obj << /Type /Action /S /GoTo /D [371 0 R /XYZ 72.0 137.88 null] >> endobj 2758 0 obj << /Type /Annot /Subtype /Link /Rect [ 405.9 536.22 418.4 545.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2757 0 R /H /I >> endobj 2759 0 obj << /Type /Action /S /GoTo /D [629 0 R /XYZ 72.0 465.6 null] >> endobj 2760 0 obj << /Type /Annot /Subtype /Link /Rect [ 379.47 524.22 396.97 533.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2759 0 R /H /I >> endobj 2761 0 obj << /Type /Action /S /GoTo /D [61 0 R /XYZ 72.0 665.713 null] >> endobj 2762 0 obj << /Type /Annot /Subtype /Link /Rect [ 401.17 512.22 413.67 521.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2761 0 R /H /I >> endobj 2763 0 obj << /Type /Action /S /GoTo /D [1224 0 R /XYZ 72.0 494.0 null] >> endobj 2764 0 obj << /Type /Annot /Subtype /Link /Rect [ 413.63 500.22 431.13 509.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2763 0 R /H /I >> endobj 2765 0 obj << /Type /Action /S /GoTo /D [1232 0 R /XYZ 72.0 418.92 null] >> endobj 2766 0 obj << /Type /Annot /Subtype /Link /Rect [ 380.61 488.22 398.11 497.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2765 0 R /H /I >> endobj 2767 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 708.0 null] >> endobj 2768 0 obj << /Type /Annot /Subtype /Link /Rect [ 506.43 476.22 518.93 485.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2767 0 R /H /I >> endobj 2769 0 obj << /Type /Action /S /GoTo /D [371 0 R /XYZ 72.0 93.96 null] >> endobj 2770 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.78 464.22 437.28 473.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2769 0 R /H /I >> endobj 2771 0 obj << /Type /Action /S /GoTo /D [323 0 R /XYZ 72.0 517.918 null] >> endobj 2772 0 obj << /Type /Annot /Subtype /Link /Rect [ 392.83 452.22 405.33 461.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2771 0 R /H /I >> endobj 2773 0 obj << /Type /Action /S /GoTo /D [1356 0 R /XYZ 72.0 661.419 null] >> endobj 2774 0 obj << /Type /Annot /Subtype /Link /Rect [ 380.33 440.22 397.83 449.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2773 0 R /H /I >> endobj 2775 0 obj << /Type /Action /S /GoTo /D [649 0 R /XYZ 72.0 585.28 null] >> endobj 2776 0 obj << /Type /Annot /Subtype /Link /Rect [ 413.94 428.22 431.44 437.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2775 0 R /H /I >> endobj 2777 0 obj << /Type /Action /S /GoTo /D [1288 0 R /XYZ 72.0 72.008 null] >> endobj 2778 0 obj << /Type /Annot /Subtype /Link /Rect [ 404.5 416.22 422.0 425.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2777 0 R /H /I >> endobj 2779 0 obj << /Type /Action /S /GoTo /D [928 0 R /XYZ 72.0 357.6 null] >> endobj 2780 0 obj << /Type /Annot /Subtype /Link /Rect [ 362.55 404.22 380.05 413.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2779 0 R /H /I >> endobj 2781 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 664.136 null] >> endobj 2782 0 obj << /Type /Annot /Subtype /Link /Rect [ 379.77 392.22 392.27 401.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2781 0 R /H /I >> endobj 2783 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 576.408 null] >> endobj 2784 0 obj << /Type /Annot /Subtype /Link /Rect [ 446.99 380.22 459.49 389.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2783 0 R /H /I >> endobj 2785 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 532.544 null] >> endobj 2786 0 obj << /Type /Annot /Subtype /Link /Rect [ 444.76 368.22 457.26 377.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2785 0 R /H /I >> endobj 2787 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 488.68 null] >> endobj 2788 0 obj << /Type /Annot /Subtype /Link /Rect [ 422.55 356.22 435.05 365.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2787 0 R /H /I >> endobj 2789 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 444.816 null] >> endobj 2790 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.21 344.22 436.71 353.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2789 0 R /H /I >> endobj 2791 0 obj << /Type /Action /S /GoTo /D [311 0 R /XYZ 72.0 336.9 null] >> endobj 2792 0 obj << /Type /Annot /Subtype /Link /Rect [ 388.39 332.22 400.89 341.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2791 0 R /H /I >> endobj 2793 0 obj << /Type /Action /S /GoTo /D [698 0 R /XYZ 72.0 317.169 null] >> endobj 2794 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.89 320.22 403.39 329.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2793 0 R /H /I >> endobj 2795 0 obj << /Type /Action /S /GoTo /D [643 0 R /XYZ 72.0 545.478 null] >> endobj 2796 0 obj << /Type /Annot /Subtype /Link /Rect [ 386.69 308.22 404.19 317.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2795 0 R /H /I >> endobj 2797 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 620.272 null] >> endobj 2798 0 obj << /Type /Annot /Subtype /Link /Rect [ 365.89 296.22 378.39 305.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2797 0 R /H /I >> endobj 2799 0 obj << /Type /Action /S /GoTo /D [305 0 R /XYZ 72.0 507.331 null] >> endobj 2800 0 obj << /Type /Annot /Subtype /Link /Rect [ 368.11 284.22 380.61 293.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2799 0 R /H /I >> endobj 2801 0 obj << /Type /Action /S /GoTo /D [281 0 R /XYZ 72.0 455.473 null] >> endobj 2802 0 obj << /Type /Annot /Subtype /Link /Rect [ 358.11 272.22 370.61 281.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2801 0 R /H /I >> endobj 2803 0 obj << /Type /Action /S /GoTo /D [663 0 R /XYZ 72.0 481.98 null] >> endobj 2804 0 obj << /Type /Annot /Subtype /Link /Rect [ 402.81 260.22 420.31 269.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2803 0 R /H /I >> endobj 2805 0 obj << /Type /Action /S /GoTo /D [1232 0 R /XYZ 72.0 182.88 null] >> endobj 2806 0 obj << /Type /Annot /Subtype /Link /Rect [ 393.94 248.22 411.44 257.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2805 0 R /H /I >> endobj 2807 0 obj << /Type /Action /S /GoTo /D [928 0 R /XYZ 72.0 231.36 null] >> endobj 2808 0 obj << /Type /Annot /Subtype /Link /Rect [ 380.33 236.22 397.83 245.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2807 0 R /H /I >> endobj 2809 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 400.952 null] >> endobj 2810 0 obj << /Type /Annot /Subtype /Link /Rect [ 466.99 224.22 479.49 233.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2809 0 R /H /I >> endobj 2811 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 357.088 null] >> endobj 2812 0 obj << /Type /Annot /Subtype /Link /Rect [ 455.88 212.22 468.38 221.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2811 0 R /H /I >> endobj 2813 0 obj << /Type /Action /S /GoTo /D [317 0 R /XYZ 72.0 150.168 null] >> endobj 2814 0 obj << /Type /Annot /Subtype /Link /Rect [ 450.87 200.22 463.37 209.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2813 0 R /H /I >> endobj 2815 0 obj << /Type /Action /S /GoTo /D [317 0 R /XYZ 72.0 354.474 null] >> endobj 2816 0 obj << /Type /Annot /Subtype /Link /Rect [ 481.13 188.22 493.63 197.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2815 0 R /H /I >> endobj 2817 0 obj << /Type /Action /S /GoTo /D [643 0 R /XYZ 72.0 353.59 null] >> endobj 2818 0 obj << /Type /Annot /Subtype /Link /Rect [ 468.92 176.22 486.42 185.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2817 0 R /H /I >> endobj 2819 0 obj << /Type /Action /S /GoTo /D [1294 0 R /XYZ 72.0 652.234 null] >> endobj 2820 0 obj << /Type /Annot /Subtype /Link /Rect [ 400.05 164.22 417.55 173.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2819 0 R /H /I >> endobj 2821 0 obj << /Type /Action /S /GoTo /D [1250 0 R /XYZ 72.0 411.84 null] >> endobj 2822 0 obj << /Type /Annot /Subtype /Link /Rect [ 372.28 152.22 389.78 161.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2821 0 R /H /I >> endobj 2823 0 obj << /Type /Action /S /GoTo /D [1250 0 R /XYZ 72.0 344.16 null] >> endobj 2824 0 obj << /Type /Annot /Subtype /Link /Rect [ 372.83 140.22 390.33 149.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2823 0 R /H /I >> endobj 2825 0 obj << /Type /Action /S /GoTo /D [583 0 R /XYZ 72.0 236.22 null] >> endobj 2826 0 obj << /Type /Annot /Subtype /Link /Rect [ 431.17 128.22 443.67 137.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2825 0 R /H /I >> endobj 2827 0 obj << /Type /Action /S /GoTo /D [1001 0 R /XYZ 72.0 419.52 null] >> endobj 2828 0 obj << /Type /Annot /Subtype /Link /Rect [ 472.54 116.22 490.04 125.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2827 0 R /H /I >> endobj 2829 0 obj << /Type /Action /S /GoTo /D [365 0 R /XYZ 72.0 412.8 null] >> endobj 2830 0 obj << /Type /Annot /Subtype /Link /Rect [ 413.39 104.22 425.89 113.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2829 0 R /H /I >> endobj 2831 0 obj << /Type /Action /S /GoTo /D [359 0 R /XYZ 72.0 260.0 null] >> endobj 2832 0 obj << /Type /Annot /Subtype /Link /Rect [ 383.95 92.22 396.45 101.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2831 0 R /H /I >> endobj 2833 0 obj << /Type /Action /S /GoTo /D [362 0 R /XYZ 72.0 652.362 null] >> endobj 2834 0 obj << /Type /Annot /Subtype /Link /Rect [ 439.23 80.22 451.73 89.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2833 0 R /H /I >> endobj 2835 0 obj << /Length 2836 0 R /Filter /FlateDecode >> stream xœÍ[]sÛF|ׯÀcRu‡`¿GŠ‚e^(R& 8¾$¥¢)ÚaE9•Øÿþf\¡gQu/¹KâH¦zÝÞÙ™Õ"Éèßú/®Éêñâî3‘8™(Û}dl"\j³d¤„ü¿`ä95sÞ̺¤ÿ\ÚLý«½þI ‹ÓççOéNUû}’JC÷?Úv3Ñ}õ?8~kš7k¿Fߤs÷ǵyÅ¿óáYòùâ²¾øáID–ԟΫÈyC‘¥¹,ü?2©“_¾“…ýþ·¤þ×EYƒ þæQƒ‰ôÏÎZ™(¬HöÝ»©DŠWïÖˆª°&Ë2aÚ«ÞM“Éîaýµ}=?.ÞÞI÷L5‰Zdê:ËoŸ¶Ï­3YbE*”ÖÑä¾úPÕåM²˜OË$­åyàó434âŽ^,ûàœ^6 Îó#)öEr—jÿ"4Á-~4ð"ËRç½+ ¤-ú²J>½ìV‡ÍÓ^ÂÒT9â•»œ1´L]-\Þà =:ãùçÕ F0öœgöùRÃóëÉ|v?¹Š“(t*ZÍ)Æ mjãhq\ˆ!)eSç—«qª#uu•ŒçÓ»›ÊL¦ÚïD.·Œ! uZÄÑ6C.:ï–Éêiûò¸K6ëÝasø–|^ïÖûåáiô„4©´ôÆRhÆÂ]êâp+‘ I”¬YU/F“Y³3s]ÄÑ܀ф Ÿ«ù ‘¢åg#óO²J3Nž§&·‰åˆÝLfOèrZÞû v?º«ßΓü"¨€¤¤ÄÈã ‡Wi‡;ƒ$‹¾&—Ÿ?ïן—‡u|=º"µ~o³…a@¨¥d-Ž×£Ìú:M§Ér÷Œf’/ûõÃfEŸqN3?I~íçŠñp!HQ¸ ©IPÿ´.±`‘Ó|øX¤2ØÚЦE[lT_‡Ëía½ÿ¯ÂE kt‡«@œ ™p!u_…¯(î^¶ÛåÇÍ–XbàÈÓÜ?«Pãç^¤*ç¨QUá7‘6òf.ÛØsI9]'dÆ”™yG[FY6gÙLfWåϸC2` è  #¬ÔV,É䪜Փ7“r+r0[tRE?wT'Dá9ÃÍ‚°‡«)¿µk]4tPH#ú(¦ØaWîÒÌ Ý<\Q2”*JWskº#¨ËÑøÇ»ÛäŠfÿrTá&þ*ÛEs„»©̄Ñ5´~”e—u¯|YÖïËrv.ÀØ´Ë癹pŒ=—vÅÑB`Ænh ½F}Üì–ûo ÕTàlqÿ±mbàöÐÐ]ÖÁ£iÈ‘-¢Þ Mf£Å‡äðí SŸ†¡M‡B=¢F3C«¦Ï¦¾Ÿ–³ëúm<„x)~‹Ë”`\p;¢ŽÃ¹ÈÐê^£ÙÀ‰Ÿ ÂZC„5DsaÍ8wÃh6¯Ž!‹ó1$:à†ÕÆá,«å}ˆj[‡,@³Ú.PÛõà9w>éCk橈£…òËfŒ¾ç‹BT%«î|¹*9Žf IFØ‘µßœHxïR2v€v©Œ£™µo£èŸ'¨ÙÑšm˜DÑìàhPóÓÓv½ÜEmeª} lÎX3yêI?ˆ¦<¿Å—uÐï’Ú]=FzwY’7;ã¹ow9§*‚0~N)¿S¾RwÒ€%3Üy Ë4f=Ìqðþ\n_ÖÉú+íÂÏÏ|<¶Á dC‹cbMsüÁR³Gµã,Ç—wÂoVtàÑ⊶Ëé¤þ0´=a\pGº6ŠL=K«¾Ïª®ÊäiŸ,ʪ^LÆLó@U$x@tPDÚ §Üô0«åóàœ[y»€1“WQ0©è‡¨|ÿ¶¨KŠ`e€9wÐ æˆÄk% ¥ÍîxJÉ÷N1à¼Aá‚™9!QäêGuíç‚24´J3_‰Å¡)[E T]N¦e$=A7ë^3¶lQ~@³m_Ý×ÙøíhvÝë1gm”µØÎ }p-=‡3%¤0 í·£E—2sùó/k5cÉúÆÑ\ž,,Ț،Æu¥ôZ¢`ð !…p–TŠ>‘ªÊš©²Uêw„¶ÿÆL Ðq4Û±ì nõûr¿\ù¦R4± ðèºl í¹øGÓ_˜Íš‘w;F‘Ì!§MÍvµ/Z3uµ£öž¥èëí™ùhZVãr8y;—à‚=Œ‰Ã¹dNùõÍóŠgs25Œ!ž˜2 .SþÞnÃt:ªqiÚÞŽ‰ Z:Hc-&J‚ˆ&|3"ØÿÑ‘ŒŒ£™U®È·¹Urß}‰Eu°ßpiœwm‘ÍÃ9Z…ÜðiïIDiQø1ÇÆ"¸@8…Ÿ8œ£eQÇ ­ÛÅä§É´¼æša¶„³%„s¤#ìfî®êØ@ùR²9¾ÌrÆž­%ãpŽSÞ×^w÷æaýi³ÛðgC6èqƒ=w´G¦o[ôuw¼´|\S÷Œ[‡ Ûè`>ÈÐBbƤ³¾æ:Jûõ§õ~½[a·Ã…ý-0gŠGS GJ’W8êÚƒƒVlS$Šf¤ªúæ¦d6Ur}J¾ÐŠé·Ø8Úྡ5Fë›› òÐ!0tÈЊé<Ôïã—å~óü´jQ‘ÛÓà‚©£T-˜”C[ŒÔ³ñhàÄ>² ´tl š½{£„£7rÃŒ ‡22Ds{½.PƧ x5Á‹nì±gV˜ÉPØ'jÍ5®³¦¯“µWŸÐ Âíù¦Â9f“’#³ä×ïËÛuòÿú=“ Ðöà!#$ã)ŠTÅá†i{JFöGŠÍŽâ¯Ÿ `Ú]6+ælÝüH34ààTgÚ8œ£©û"¥a;¬¿^–Ûí·æœà¡+Ο¿¬W›O>ˆ°5EÙs›¼"¼úìçvc˜•òS¹Š$ÁÉ*š3‘ÐÄÑ¢`ZÿXmþÞJpãM™Æ“‹£¹æ–ÁRs¨3jƒ`…¦Ìi¬Š£Y:Xl.Jª§îÛ –ü/L B¡€Ëà áÌéªÅR³a•Œ®¯åµÿîÍÝlÌýÒå“Y0Ž®ü}›\0—ç-¡»ãu´á[7h?xëáÌ~i±m9±]„æ&oÑþfZ2骎£™KàëÑŽÌép³*™Þ˜ÿÍÐc· } ¼8_ÕG¸;·qÛ_^ü]žîs endstream endobj 2645 0 obj [ 2644 0 R 2647 0 R 2649 0 R 2651 0 R 2653 0 R 2655 0 R 2657 0 R 2659 0 R 2661 0 R 2663 0 R 2665 0 R 2667 0 R 2669 0 R 2671 0 R 2673 0 R 2675 0 R 2677 0 R 2679 0 R 2681 0 R 2683 0 R 2685 0 R 2687 0 R 2689 0 R 2691 0 R 2693 0 R 2695 0 R 2697 0 R 2699 0 R 2701 0 R 2703 0 R 2705 0 R 2707 0 R 2709 0 R 2711 0 R 2713 0 R 2715 0 R 2717 0 R 2719 0 R 2721 0 R 2723 0 R 2725 0 R 2727 0 R 2729 0 R 2731 0 R 2733 0 R 2735 0 R 2737 0 R 2739 0 R 2741 0 R 2743 0 R 2745 0 R 2747 0 R 2749 0 R 2751 0 R 2753 0 R 2755 0 R 2756 0 R 2758 0 R 2760 0 R 2762 0 R 2764 0 R 2766 0 R 2768 0 R 2770 0 R 2772 0 R 2774 0 R 2776 0 R 2778 0 R 2780 0 R 2782 0 R 2784 0 R 2786 0 R 2788 0 R 2790 0 R 2792 0 R 2794 0 R 2796 0 R 2798 0 R 2800 0 R 2802 0 R 2804 0 R 2806 0 R 2808 0 R 2810 0 R 2812 0 R 2814 0 R 2816 0 R 2818 0 R 2820 0 R 2822 0 R 2824 0 R 2826 0 R 2828 0 R 2830 0 R 2832 0 R 2834 0 R ] endobj 2642 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 2645 0 R /Contents 2835 0 R >> endobj 2836 0 obj 3002 endobj 2838 0 obj << /Type /Action /S /GoTo /D [362 0 R /XYZ 72.0 395.991 null] >> endobj 2839 0 obj << /Type /Annot /Subtype /Link /Rect [ 175.6 709.5 188.1 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2838 0 R /H /I >> endobj 2841 0 obj << /Type /Action /S /GoTo /D [341 0 R /XYZ 72.0 294.935 null] >> endobj 2842 0 obj << /Type /Annot /Subtype /Link /Rect [ 159.49 697.5 171.99 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2841 0 R /H /I >> endobj 2843 0 obj << /Type /Action /S /GoTo /D [933 0 R /XYZ 72.0 585.6 null] >> endobj 2844 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.94 685.5 186.44 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2843 0 R /H /I >> endobj 2845 0 obj << /Type /Action /S /GoTo /D [356 0 R /XYZ 72.0 93.6 null] >> endobj 2846 0 obj << /Type /Annot /Subtype /Link /Rect [ 149.49 673.5 161.99 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2845 0 R /H /I >> endobj 2847 0 obj << /Type /Action /S /GoTo /D [933 0 R /XYZ 72.0 564.0 null] >> endobj 2848 0 obj << /Type /Annot /Subtype /Link /Rect [ 177.84 661.5 195.34 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2847 0 R /H /I >> endobj 2849 0 obj << /Type /Action /S /GoTo /D [594 0 R /XYZ 72.0 72.014 null] >> endobj 2850 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.5 649.5 157.0 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2849 0 R /H /I >> endobj 2851 0 obj << /Type /Action /S /GoTo /D [305 0 R /XYZ 72.0 275.329 null] >> endobj 2852 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.06 637.5 172.56 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2851 0 R /H /I >> endobj 2853 0 obj << /Type /Action /S /GoTo /D [918 0 R /XYZ 72.0 226.635 null] >> endobj 2854 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.61 625.5 183.11 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2853 0 R /H /I >> endobj 2855 0 obj << /Type /Action /S /GoTo /D [308 0 R /XYZ 72.0 303.06 null] >> endobj 2856 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.61 613.5 163.11 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2855 0 R /H /I >> endobj 2857 0 obj << /Type /Action /S /GoTo /D [362 0 R /XYZ 72.0 71.982 null] >> endobj 2858 0 obj << /Type /Annot /Subtype /Link /Rect [ 188.38 601.5 200.88 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2857 0 R /H /I >> endobj 2859 0 obj << /Type /Action /S /GoTo /D [344 0 R /XYZ 72.0 72.0 null] >> endobj 2860 0 obj << /Type /Annot /Subtype /Link /Rect [ 161.72 589.5 174.22 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2859 0 R /H /I >> endobj 2861 0 obj << /Type /Action /S /GoTo /D [1031 0 R /XYZ 72.0 667.295 null] >> endobj 2862 0 obj << /Type /Annot /Subtype /Link /Rect [ 179.22 589.5 196.72 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2861 0 R /H /I >> endobj 2863 0 obj << /Type /Action /S /GoTo /D [359 0 R /XYZ 72.0 404.0 null] >> endobj 2864 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.39 577.5 155.89 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2863 0 R /H /I >> endobj 2865 0 obj << /Type /Action /S /GoTo /D [591 0 R /XYZ 72.0 424.152 null] >> endobj 2866 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.95 565.5 156.45 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2865 0 R /H /I >> endobj 2867 0 obj << /Type /Action /S /GoTo /D [338 0 R /XYZ 72.0 172.218 null] >> endobj 2868 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.49 553.5 156.99 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2867 0 R /H /I >> endobj 2869 0 obj << /Type /Action /S /GoTo /D [701 0 R /XYZ 72.0 502.221 null] >> endobj 2870 0 obj << /Type /Annot /Subtype /Link /Rect [ 132.84 541.5 150.34 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2869 0 R /H /I >> endobj 2871 0 obj << /Type /Action /S /GoTo /D [1297 0 R /XYZ 72.0 115.84 null] >> endobj 2872 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.61 529.5 188.11 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2871 0 R /H /I >> endobj 2873 0 obj << /Type /Action /S /GoTo /D [1262 0 R /XYZ 72.0 289.92 null] >> endobj 2874 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.05 517.5 177.55 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2873 0 R /H /I >> endobj 2875 0 obj << /Type /Action /S /GoTo /D [1303 0 R /XYZ 72.0 588.852 null] >> endobj 2876 0 obj << /Type /Annot /Subtype /Link /Rect [ 212.27 505.5 229.77 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2875 0 R /H /I >> endobj 2877 0 obj << /Type /Action /S /GoTo /D [1262 0 R /XYZ 72.0 667.008 null] >> endobj 2878 0 obj << /Type /Annot /Subtype /Link /Rect [ 191.16 493.5 208.66 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2877 0 R /H /I >> endobj 2879 0 obj << /Type /Action /S /GoTo /D [1300 0 R /XYZ 72.0 115.62 null] >> endobj 2880 0 obj << /Type /Annot /Subtype /Link /Rect [ 190.61 481.5 208.11 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2879 0 R /H /I >> endobj 2881 0 obj << /Type /Action /S /GoTo /D [1303 0 R /XYZ 72.0 632.568 null] >> endobj 2882 0 obj << /Type /Annot /Subtype /Link /Rect [ 206.17 469.5 223.67 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2881 0 R /H /I >> endobj 2883 0 obj << /Type /Action /S /GoTo /D [1262 0 R /XYZ 72.0 623.424 null] >> endobj 2884 0 obj << /Type /Annot /Subtype /Link /Rect [ 188.94 457.5 206.44 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2883 0 R /H /I >> endobj 2885 0 obj << /Type /Action /S /GoTo /D [1262 0 R /XYZ 72.0 536.256 null] >> endobj 2886 0 obj << /Type /Annot /Subtype /Link /Rect [ 222.28 445.5 239.78 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2885 0 R /H /I >> endobj 2887 0 obj << /Type /Action /S /GoTo /D [1300 0 R /XYZ 72.0 159.258 null] >> endobj 2888 0 obj << /Type /Annot /Subtype /Link /Rect [ 190.06 433.5 207.56 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2887 0 R /H /I >> endobj 2889 0 obj << /Type /Action /S /GoTo /D [655 0 R /XYZ 72.0 575.832 null] >> endobj 2890 0 obj << /Type /Annot /Subtype /Link /Rect [ 182.0 421.5 199.5 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2889 0 R /H /I >> endobj 2891 0 obj << /Type /Action /S /GoTo /D [1262 0 R /XYZ 72.0 224.544 null] >> endobj 2892 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.83 409.5 175.33 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2891 0 R /H /I >> endobj 2893 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 313.224 null] >> endobj 2894 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.99 368.22 209.49 377.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2893 0 R /H /I >> endobj 2895 0 obj << /Type /Action /S /GoTo /D [1306 0 R /XYZ 72.0 537.396 null] >> endobj 2896 0 obj << /Type /Annot /Subtype /Link /Rect [ 261.14 356.22 278.64 365.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2895 0 R /H /I >> endobj 2897 0 obj << /Type /Action /S /GoTo /D [1300 0 R /XYZ 72.0 391.629 null] >> endobj 2898 0 obj << /Type /Annot /Subtype /Link /Rect [ 200.6 344.22 218.1 353.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2897 0 R /H /I >> endobj 2899 0 obj << /Type /Action /S /GoTo /D [1259 0 R /XYZ 72.0 115.617 null] >> endobj 2900 0 obj << /Type /Annot /Subtype /Link /Rect [ 222.26 332.22 239.76 341.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2899 0 R /H /I >> endobj 2901 0 obj << /Type /Action /S /GoTo /D [1300 0 R /XYZ 72.0 290.172 null] >> endobj 2902 0 obj << /Type /Annot /Subtype /Link /Rect [ 214.49 320.22 231.99 329.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2901 0 R /H /I >> endobj 2903 0 obj << /Type /Action /S /GoTo /D [1300 0 R /XYZ 72.0 457.086 null] >> endobj 2904 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.16 308.22 183.66 317.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2903 0 R /H /I >> endobj 2905 0 obj << /Type /Action /S /GoTo /D [1274 0 R /XYZ 72.0 615.796 null] >> endobj 2906 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.15 296.22 183.65 305.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2905 0 R /H /I >> endobj 2907 0 obj << /Type /Action /S /GoTo /D [1274 0 R /XYZ 72.0 573.024 null] >> endobj 2908 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.94 284.22 181.44 293.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2907 0 R /H /I >> endobj 2909 0 obj << /Type /Action /S /GoTo /D [1274 0 R /XYZ 72.0 438.048 null] >> endobj 2910 0 obj << /Type /Annot /Subtype /Link /Rect [ 161.15 272.22 178.65 281.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2909 0 R /H /I >> endobj 2911 0 obj << /Type /Action /S /GoTo /D [1274 0 R /XYZ 72.0 395.276 null] >> endobj 2912 0 obj << /Type /Annot /Subtype /Link /Rect [ 161.16 260.22 178.66 269.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2911 0 R /H /I >> endobj 2913 0 obj << /Type /Action /S /GoTo /D [635 0 R /XYZ 72.0 443.63 null] >> endobj 2914 0 obj << /Type /Annot /Subtype /Link /Rect [ 187.26 248.22 204.76 257.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2913 0 R /H /I >> endobj 2915 0 obj << /Type /Action /S /GoTo /D [73 0 R /XYZ 72.0 569.672 null] >> endobj 2916 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.04 236.22 172.54 245.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2915 0 R /H /I >> endobj 2917 0 obj << /Type /Action /S /GoTo /D [70 0 R /XYZ 72.0 500.895 null] >> endobj 2918 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.71 224.22 164.21 233.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2917 0 R /H /I >> endobj 2919 0 obj << /Type /Action /S /GoTo /D [1224 0 R /XYZ 72.0 394.0 null] >> endobj 2920 0 obj << /Type /Annot /Subtype /Link /Rect [ 180.87 212.22 198.37 221.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2919 0 R /H /I >> endobj 2921 0 obj << /Type /Action /S /GoTo /D [1224 0 R /XYZ 72.0 172.0 null] >> endobj 2922 0 obj << /Type /Annot /Subtype /Link /Rect [ 171.43 200.22 188.93 209.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2921 0 R /H /I >> endobj 2923 0 obj << /Type /Action /S /GoTo /D [1265 0 R /XYZ 72.0 589.44 null] >> endobj 2924 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.93 188.22 181.43 197.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2923 0 R /H /I >> endobj 2925 0 obj << /Type /Action /S /GoTo /D [1265 0 R /XYZ 72.0 510.624 null] >> endobj 2926 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.93 176.22 201.43 185.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2925 0 R /H /I >> endobj 2927 0 obj << /Type /Action /S /GoTo /D [1265 0 R /XYZ 72.0 431.808 null] >> endobj 2928 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.15 164.22 193.65 173.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2927 0 R /H /I >> endobj 2929 0 obj << /Type /Action /S /GoTo /D [1265 0 R /XYZ 72.0 352.992 null] >> endobj 2930 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.49 152.22 191.99 161.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2929 0 R /H /I >> endobj 2931 0 obj << /Type /Action /S /GoTo /D [1265 0 R /XYZ 72.0 274.176 null] >> endobj 2932 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.99 140.22 194.49 149.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2931 0 R /H /I >> endobj 2933 0 obj << /Type /Action /S /GoTo /D [583 0 R /XYZ 72.0 336.336 null] >> endobj 2934 0 obj << /Type /Annot /Subtype /Link /Rect [ 126.72 128.22 139.22 137.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2933 0 R /H /I >> endobj 2935 0 obj << /Type /Action /S /GoTo /D [626 0 R /XYZ 72.0 469.931 null] >> endobj 2936 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.62 116.22 178.12 125.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2935 0 R /H /I >> endobj 2937 0 obj << /Type /Action /S /GoTo /D [959 0 R /XYZ 72.0 210.622 null] >> endobj 2938 0 obj << /Type /Annot /Subtype /Link /Rect [ 173.38 104.22 190.88 113.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2937 0 R /H /I >> endobj 2939 0 obj << /Type /Action /S /GoTo /D [954 0 R /XYZ 72.0 598.858 null] >> endobj 2940 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.82 92.22 175.32 101.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2939 0 R /H /I >> endobj 2941 0 obj << /Type /Action /S /GoTo /D [1294 0 R /XYZ 72.0 331.053 null] >> endobj 2942 0 obj << /Type /Annot /Subtype /Link /Rect [ 153.38 80.22 170.88 89.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2941 0 R /H /I >> endobj 2943 0 obj << /Type /Action /S /GoTo /D [317 0 R /XYZ 72.0 556.831 null] >> endobj 2944 0 obj << /Type /Annot /Subtype /Link /Rect [ 390.04 709.5 402.54 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2943 0 R /H /I >> endobj 2945 0 obj << /Type /Action /S /GoTo /D [1250 0 R /XYZ 72.0 264.48 null] >> endobj 2946 0 obj << /Type /Annot /Subtype /Link /Rect [ 397.83 697.5 415.33 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2945 0 R /H /I >> endobj 2947 0 obj << /Type /Action /S /GoTo /D [719 0 R /XYZ 72.0 115.068 null] >> endobj 2948 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.61 685.5 403.11 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2947 0 R /H /I >> endobj 2949 0 obj << /Type /Action /S /GoTo /D [695 0 R /XYZ 72.0 708.0 null] >> endobj 2950 0 obj << /Type /Annot /Subtype /Link /Rect [ 368.93 673.5 386.43 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2949 0 R /H /I >> endobj 2951 0 obj << /Type /Action /S /GoTo /D [939 0 R /XYZ 72.0 93.242 null] >> endobj 2952 0 obj << /Type /Annot /Subtype /Link /Rect [ 449.47 661.5 466.97 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2951 0 R /H /I >> endobj 2953 0 obj << /Type /Action /S /GoTo /D [1300 0 R /XYZ 72.0 684.0 null] >> endobj 2954 0 obj << /Type /Annot /Subtype /Link /Rect [ 419.49 649.5 436.99 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2953 0 R /H /I >> endobj 2955 0 obj << /Type /Action /S /GoTo /D [1235 0 R /XYZ 72.0 720.0 null] >> endobj 2956 0 obj << /Type /Annot /Subtype /Link /Rect [ 413.39 637.5 430.89 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2955 0 R /H /I >> endobj 2957 0 obj << /Type /Action /S /GoTo /D [284 0 R /XYZ 72.0 698.609 null] >> endobj 2958 0 obj << /Type /Annot /Subtype /Link /Rect [ 380.33 625.5 392.83 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2957 0 R /H /I >> endobj 2959 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 225.496 null] >> endobj 2960 0 obj << /Type /Annot /Subtype /Link /Rect [ 431.99 613.5 444.49 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2959 0 R /H /I >> endobj 2961 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 269.36 null] >> endobj 2962 0 obj << /Type /Annot /Subtype /Link /Rect [ 363.66 601.5 376.16 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2961 0 R /H /I >> endobj 2963 0 obj << /Type /Action /S /GoTo /D [365 0 R /XYZ 72.0 314.4 null] >> endobj 2964 0 obj << /Type /Annot /Subtype /Link /Rect [ 401.17 589.5 413.67 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2963 0 R /H /I >> endobj 2965 0 obj << /Type /Action /S /GoTo /D [359 0 R /XYZ 72.0 94.0 null] >> endobj 2966 0 obj << /Type /Annot /Subtype /Link /Rect [ 371.73 577.5 384.23 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2965 0 R /H /I >> endobj 2967 0 obj << /Type /Action /S /GoTo /D [362 0 R /XYZ 72.0 495.267 null] >> endobj 2968 0 obj << /Type /Annot /Subtype /Link /Rect [ 427.01 565.5 439.51 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2967 0 R /H /I >> endobj 2969 0 obj << /Type /Action /S /GoTo /D [362 0 R /XYZ 72.0 171.258 null] >> endobj 2970 0 obj << /Type /Annot /Subtype /Link /Rect [ 403.38 553.5 415.88 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2969 0 R /H /I >> endobj 2971 0 obj << /Type /Action /S /GoTo /D [332 0 R /XYZ 72.0 276.01 null] >> endobj 2972 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.5 541.5 402.0 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2971 0 R /H /I >> endobj 2973 0 obj << /Type /Action /S /GoTo /D [338 0 R /XYZ 72.0 418.568 null] >> endobj 2974 0 obj << /Type /Annot /Subtype /Link /Rect [ 441.15 529.5 453.65 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2973 0 R /H /I >> endobj 2975 0 obj << /Type /Action /S /GoTo /D [335 0 R /XYZ 72.0 696.0 null] >> endobj 2976 0 obj << /Type /Annot /Subtype /Link /Rect [ 409.5 517.5 422.0 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2975 0 R /H /I >> endobj 2977 0 obj << /Type /Action /S /GoTo /D [335 0 R /XYZ 72.0 274.295 null] >> endobj 2978 0 obj << /Type /Annot /Subtype /Link /Rect [ 420.32 505.5 432.82 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2977 0 R /H /I >> endobj 2979 0 obj << /Type /Action /S /GoTo /D [344 0 R /XYZ 72.0 214.56 null] >> endobj 2980 0 obj << /Type /Annot /Subtype /Link /Rect [ 387.27 493.5 399.77 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2979 0 R /H /I >> endobj 2981 0 obj << /Type /Action /S /GoTo /D [344 0 R /XYZ 72.0 327.648 null] >> endobj 2982 0 obj << /Type /Annot /Subtype /Link /Rect [ 453.1 481.5 465.6 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2981 0 R /H /I >> endobj 2983 0 obj << /Type /Action /S /GoTo /D [344 0 R /XYZ 72.0 505.824 null] >> endobj 2984 0 obj << /Type /Annot /Subtype /Link /Rect [ 435.32 469.5 447.82 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2983 0 R /H /I >> endobj 2985 0 obj << /Type /Action /S /GoTo /D [359 0 R /XYZ 72.0 604.0 null] >> endobj 2986 0 obj << /Type /Annot /Subtype /Link /Rect [ 377.27 457.5 389.77 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2985 0 R /H /I >> endobj 2987 0 obj << /Type /Action /S /GoTo /D [599 0 R /XYZ 72.0 630.543 null] >> endobj 2988 0 obj << /Type /Annot /Subtype /Link /Rect [ 372.28 445.5 384.78 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2987 0 R /H /I >> endobj 2989 0 obj << /Type /Action /S /GoTo /D [918 0 R /XYZ 72.0 342.71 null] >> endobj 2990 0 obj << /Type /Annot /Subtype /Link /Rect [ 374.5 433.5 387.0 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2989 0 R /H /I >> endobj 2991 0 obj << /Type /Action /S /GoTo /D [308 0 R /XYZ 72.0 454.635 null] >> endobj 2992 0 obj << /Type /Annot /Subtype /Link /Rect [ 387.84 421.5 400.34 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2991 0 R /H /I >> endobj 2993 0 obj << /Type /Action /S /GoTo /D [356 0 R /XYZ 72.0 650.4 null] >> endobj 2994 0 obj << /Type /Annot /Subtype /Link /Rect [ 398.39 409.5 410.89 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2993 0 R /H /I >> endobj 2995 0 obj << /Type /Action /S /GoTo /D [323 0 R /XYZ 72.0 184.333 null] >> endobj 2996 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.39 397.5 390.89 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2995 0 R /H /I >> endobj 2997 0 obj << /Type /Action /S /GoTo /D [365 0 R /XYZ 72.0 499.2 null] >> endobj 2998 0 obj << /Type /Annot /Subtype /Link /Rect [ 416.16 385.5 428.66 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2997 0 R /H /I >> endobj 2999 0 obj << /Type /Action /S /GoTo /D [350 0 R /XYZ 72.0 638.838 null] >> endobj 3000 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.5 373.5 402.0 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2999 0 R /H /I >> endobj 3001 0 obj << /Type /Action /S /GoTo /D [1040 0 R /XYZ 72.0 650.0 null] >> endobj 3002 0 obj << /Type /Annot /Subtype /Link /Rect [ 407.0 373.5 424.5 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3001 0 R /H /I >> endobj 3003 0 obj << /Type /Action /S /GoTo /D [591 0 R /XYZ 72.0 298.264 null] >> endobj 3004 0 obj << /Type /Annot /Subtype /Link /Rect [ 371.73 361.5 384.23 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3003 0 R /H /I >> endobj 3005 0 obj << /Type /Action /S /GoTo /D [341 0 R /XYZ 72.0 554.57 null] >> endobj 3006 0 obj << /Type /Annot /Subtype /Link /Rect [ 372.27 349.5 384.77 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3005 0 R /H /I >> endobj 3007 0 obj << /Type /Action /S /GoTo /D [942 0 R /XYZ 72.0 147.426 null] >> endobj 3008 0 obj << /Type /Annot /Subtype /Link /Rect [ 430.89 337.5 448.39 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3007 0 R /H /I >> endobj 3009 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 181.632 null] >> endobj 3010 0 obj << /Type /Annot /Subtype /Link /Rect [ 399.22 297.5 411.72 306.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3009 0 R /H /I >> endobj 3011 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 137.768 null] >> endobj 3012 0 obj << /Type /Annot /Subtype /Link /Rect [ 400.33 285.5 412.83 294.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3011 0 R /H /I >> endobj 3013 0 obj << /Type /Action /S /GoTo /D [672 0 R /XYZ 72.0 342.237 null] >> endobj 3014 0 obj << /Type /Annot /Subtype /Link /Rect [ 390.04 273.5 407.54 282.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3013 0 R /H /I >> endobj 3015 0 obj << /Type /Action /S /GoTo /D [1250 0 R /XYZ 72.0 184.8 null] >> endobj 3016 0 obj << /Type /Annot /Subtype /Link /Rect [ 371.72 261.5 389.22 270.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3015 0 R /H /I >> endobj 3017 0 obj << /Type /Action /S /GoTo /D [649 0 R /XYZ 72.0 414.56 null] >> endobj 3018 0 obj << /Type /Annot /Subtype /Link /Rect [ 359.77 249.5 377.27 258.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3017 0 R /H /I >> endobj 3019 0 obj << /Type /Action /S /GoTo /D [1336 0 R /XYZ 72.0 310.08 null] >> endobj 3020 0 obj << /Type /Annot /Subtype /Link /Rect [ 408.37 237.5 425.87 246.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3019 0 R /H /I >> endobj 3021 0 obj << /Type /Action /S /GoTo /D [936 0 R /XYZ 72.0 115.756 null] >> endobj 3022 0 obj << /Type /Annot /Subtype /Link /Rect [ 401.71 225.5 419.21 234.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3021 0 R /H /I >> endobj 3023 0 obj << /Type /Action /S /GoTo /D [1268 0 R /XYZ 72.0 93.6 null] >> endobj 3024 0 obj << /Type /Annot /Subtype /Link /Rect [ 398.94 213.5 416.44 222.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3023 0 R /H /I >> endobj 3025 0 obj << /Type /Action /S /GoTo /D [1250 0 R /XYZ 72.0 117.12 null] >> endobj 3026 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.61 173.5 403.11 182.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3025 0 R /H /I >> endobj 3027 0 obj << /Type /Action /S /GoTo /D [320 0 R /XYZ 72.0 457.72 null] >> endobj 3028 0 obj << /Type /Annot /Subtype /Link /Rect [ 425.32 161.5 437.82 170.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3027 0 R /H /I >> endobj 3029 0 obj << /Type /Action /S /GoTo /D [968 0 R /XYZ 72.0 567.669 null] >> endobj 3030 0 obj << /Type /Annot /Subtype /Link /Rect [ 401.73 149.5 419.23 158.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3029 0 R /H /I >> endobj 3031 0 obj << /Type /Action /S /GoTo /D [314 0 R /XYZ 72.0 696.0 null] >> endobj 3032 0 obj << /Type /Annot /Subtype /Link /Rect [ 441.97 109.5 454.47 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3031 0 R /H /I >> endobj 3033 0 obj << /Type /Action /S /GoTo /D [898 0 R /XYZ 72.0 152.193 null] >> endobj 3034 0 obj << /Type /Annot /Subtype /Link /Rect [ 405.6 97.5 423.1 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3033 0 R /H /I >> endobj 3035 0 obj << /Type /Action /S /GoTo /D [599 0 R /XYZ 72.0 531.267 null] >> endobj 3036 0 obj << /Type /Annot /Subtype /Link /Rect [ 381.16 85.5 393.66 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3035 0 R /H /I >> endobj 3037 0 obj << /Type /Action /S /GoTo /D [599 0 R /XYZ 72.0 398.172 null] >> endobj 3038 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.49 73.5 401.99 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3037 0 R /H /I >> endobj 3039 0 obj << /Length 3040 0 R /Filter /FlateDecode >> stream xœÍ[]wÛ6}÷¯Àc{Î.C$i vÔÊ’#ÒI¼mVVRcË®,gÓ¿EI°î€R_ºÛcE¾^3ƒÁ\ä3ÎR÷ï?ýÜdlöxöGûgyÆ„n¿Ršñ<ÑiÁYû‡BìÁß|ôö£h¾mÑ›?üÎ>-ÏRvyöËotÏÒD±ÿœ¥0øf˜êìƒ{¸Ò‰Ð…1¦åš%¼(ü#D¢Ý‡Ù#{7xÌXÿ©AoÙûÒÿ9û‘àÙÿ£”}=;¯ÏÞ](ÆSVÙ»ç<)„›g-$+‘ÿOÆêGöËÕ‡!,ïçßüÕ?Ùº}¹¥wŸÌý—'½ù…’éÛßþµû~ÿ­û_&bóû&É”{ ÿ«‡vIÛŸþÛª™¢ÍÏè”´CƇ ÔÌÕßùðøZäÞ§Iñf2“ÓÿÖ³þæYƒ…ôÏŽ¿O ՛ز¶¬7Ëz0ýƒm^mH”7(dÖÖIçÙ:eYJÓé¯Êr)òDú ”Mlk\D–‘¦)/Ä.7£93F'F:ƒLJ4°IdÌ…:RÒt£¾ý \ò`fÀÀÁÌ8OŠÏü•ëɸgû7K8Úç00G´s•(šš]ÐŒ&ã!’É3D`(c8<¹Hé'W½÷öªD-’ÔGOîLÁG\´GÁ ¹˜ˆÇVöÃõp&L‘hî RÍÑW…'<ŠÖÐáiÄeëòœZ–€ šÂDd­0µpñÚzRŽªX²óF¹_—cq„I‡ gÏ­'ƒËK;A2Ižy|–ưÀY’ÅÑZÂw≰λðï$Ï56—‘øªo¯ â‰ð‰ÌCXZ$Ec|q °›ŠX)GÆHŸÄŒ",-Ý~ELÂ\G¢ëãÀ~¢rÞn?@K‚Œ‰£5áÆ9׸ªØOcb×Ö®~ò[_Êah‘ˆ8šg ÉS·×õÝÏö–}y]ÎÖ‹§eg*Ä:s!¹ÁrÂùý!«›Iß/X”S³Y8 ‘*œÜ-¢h÷)qðç›ÉÄŽê»^Y—Ãñeœš—,w¦2ˉqž%yÎ ®b–·äº's“píçAkb€g<Ñq89mœ½eæË.fá 3‡ss˜½3 žß2Û”#Ü„t³æ užà \»Y‹ÂÉõÔ›š»Ð*Ë­\uÎZPVã ÔòË8œ\O—ã̪º¼ºî §| ø™È b$„û@ˆÂIz…ŒÐóÛN·»íjMÝ-¨6Nº›;ñÌØÇrxãNJcÜGvˆò5:âÜÉÏii,º}ªð§‘ÖaÑœHÃ"ŽÞ-Ù» áOûòà€-|ärÓx䯢¿ÅÇq!M¢Ý‰¹PBµh—Šï|µsw=| í¥­pV³`ÇÆ1žkœdÍ ^çeeïÕxS=ß íG;ìpHW»rÑ\8 ÀCÄáÜ,]Ia9*;“Œ+Fu›jqÌ~.3GÑT¤çqbÞSÿ5u‘ó)ÆG¦Tœ‰L1q8/°|&Ñûh'•[Û®JÀ•–Þ½•4Ä@wž‡S“'S*&<»ŽrNî‹´':7:Ž&9eD<Ø»²ßïæ¤šBVö§8š9r„÷Û»êæ¼ƒßo®hO¼Œ£IN’p|Û9M>Kì^̉Ðq4IIÎnûƒ‹‹nN;{ŠSMrÒ‡Nw?]Ï׋Ç9›.ïÙb¹ž¯¾MØÃÂ}˜>»ªJ2ÿÈŒKb0„çI‡óS„,Àá· ÇÏŽ“Ÿ¶òÓÞLFŒ@`âhŽ[¿4”Ç7{ÿúÏç9òÉM’7ýè´ Œ}–dq4ÇeTé¡î–Ñ­ÞëœÍ¿?¯æ//dM}ïȯI®ˆp y"âpžb/EñCW<`Ï®¦öP*81 u86q8I-ÃÛ½e›ð!`Ne®8š˜á•Ä ;¾¸ê÷]EwH †@xÈ à$/…>ïx}²öçZi°÷à”l£ãp’–ÆDïhÝڲ눒m)z ‡“´rLö·ÕŽÛF9cûgÁ(T'TÆá$µ|þ¼¤ %÷}S4tДEtiT§àê¶7,'–¹“TEâ|.ÌÚ܃ÆD%ÃãhC¨9\¼åó¾õ‡D¯Õ§œ]ŸÍ) ³ˆÃ¹ÄÔ®3ðï–Ó·éj1ý÷º?erÓôt sê”Gs‰§-À·moÜï:÷†³Ö€' ÐÜ´E‚­Í9“þçìñd½¹o/Ê›aÍfÓלÃ<( މÍEP>bÑ:Ô€ûörbmuZÛà¸Üt ÌsôzPûvh½Þ<_Ἀ}+ñ¨Öœë}#‘КQèø~¾Z|›ß³5éèJï÷¼£b³ j ó û_ ÷ݬL®£AUzlöût5¹²xñ²^̈ƦKÌù6í¹ “˜(šKœ*Јûƒòr4öÔ:<éÍvqTŠöº™‰¢©ã)¨Åþxc'^î"ÈgGÅé&‡FÑIÞPy_NÊžËJ¬²ÈÉÎSÞž¶+Áþp®âpêH´VÑ;\&¨Ž«Á&¨Mñ™vËçæ É¸bù¸ ÆÕ„.jìýêé™Íž^—lq?_.Öë?Ù×ùÒw-žVD/ع³l¯W‚…sç(šÊQšm'g›zpµü×Ë(NŒúkÃ`[‰ýúC³Ëÿú#Ù¢ØÕ¨'ˆ¾þ¢dN1ýuÃŒ¾ý—ûž—]Ë„ÞÜ·¼¢h¸ Cɼ™®õreBòd^)vÒ¢)^ ·†¼ÚU$¼Zkw\à͂à Â)Z µ6´èë‰:\º£š®—ÐDšFaµáBž­õ_Òou§|kˆp%µ¡²zz]/–XJëF÷<*Öj D\ÁCµyzärb\Ò<®ÑæÁ%MD7ðP;݉ÝN,ô¾=I¥-âhâ«ÈH‡¥/'ê ÕkG+ì.A:lçÕÄ4¸ÐžléÅáDÙ%$é¹±‹‰Í6Ž6Ä6Ž }X„ …ã)44/N¤ ¡Èh!o÷……&Úušˆ&n÷ MÆ y·O·W±R© ;2ƒEÑÔ=øâÄ·æÝÑ{b+_0¸š—:.…1CP—DÎe›N"—,¤;O§Â¸ʽUca·x¢%!$íÐ^5~n¯‰ÛEÐPE[â4”ÇÑÄyKB4Ú‘OBýæ>A'ØÑ–ÕŠ8š¢±b?ªºbÏ«ùýb6]wwéм«O‡hÎ µBÆ~¥Â8-6£hªS'!l:t=™ïã zˈvIÉ@°Ì¿¯ç«åôM_׿ϗk¿f¤‚¦÷ "Žè@žDt–bƒUðëÏîŒ<*‡ÌK{äÕö½Üzԯ߈³p‘Nm%EÇ®ý¹½£ãÜ=DsâdÍ Õ™Ã”;I¾Ía9Lµ½SEÇã­-ì£qWËÑTP¨¶]OìàrÄü½ëÙÓòe½š.–kb§N&8 ÕM)âp…¢Úfâfìáéé™-–ÛJœ¸»àÜÑ'N!41åŽq4Wi÷Úu°ö—k¯ÓÃñÛnÆü~ÛçxyžÏ_b‘ï[»67ކ=ŽlßCG¸Â„­³ôtik´Æ)Iq÷· ÑšH]iÍ%–e‡Œ\q]Û>;¿ÅŠ*¸îƒ†+ÁuDgB ÕpqìâÛâaþ•Ø`C¹àxð†r Ýnó7Fÿ ™§> endobj 3040 0 obj 2978 endobj 3042 0 obj << /Type /Action /S /GoTo /D [602 0 R /XYZ 72.0 505.457 null] >> endobj 3043 0 obj << /Type /Annot /Subtype /Link /Rect [ 129.49 709.5 141.99 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3042 0 R /H /I >> endobj 3045 0 obj << /Type /Action /S /GoTo /D [1294 0 R /XYZ 72.0 205.404 null] >> endobj 3046 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.94 697.5 181.44 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3045 0 R /H /I >> endobj 3047 0 obj << /Type /Action /S /GoTo /D [710 0 R /XYZ 72.0 634.56 null] >> endobj 3048 0 obj << /Type /Annot /Subtype /Link /Rect [ 193.38 685.5 210.88 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3047 0 R /H /I >> endobj 3049 0 obj << /Type /Action /S /GoTo /D [1235 0 R /XYZ 72.0 529.086 null] >> endobj 3050 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.04 644.7 187.54 653.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3049 0 R /H /I >> endobj 3051 0 obj << /Type /Action /S /GoTo /D [1265 0 R /XYZ 72.0 195.36 null] >> endobj 3052 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.16 632.7 158.66 641.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3051 0 R /H /I >> endobj 3053 0 obj << /Type /Action /S /GoTo /D [638 0 R /XYZ 72.0 162.612 null] >> endobj 3054 0 obj << /Type /Annot /Subtype /Link /Rect [ 137.82 591.9 155.32 600.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3053 0 R /H /I >> endobj 3055 0 obj << /Type /Action /S /GoTo /D [907 0 R /XYZ 72.0 327.53 null] >> endobj 3056 0 obj << /Type /Annot /Subtype /Link /Rect [ 155.05 579.9 167.55 588.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3055 0 R /H /I >> endobj 3057 0 obj << /Type /Action /S /GoTo /D [1300 0 R /XYZ 72.0 570.543 null] >> endobj 3058 0 obj << /Type /Annot /Subtype /Link /Rect [ 159.48 567.9 176.98 576.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3057 0 R /H /I >> endobj 3059 0 obj << /Type /Action /S /GoTo /D [302 0 R /XYZ 72.0 298.284 null] >> endobj 3060 0 obj << /Type /Annot /Subtype /Link /Rect [ 122.28 555.9 134.78 564.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3059 0 R /H /I >> endobj 3061 0 obj << /Type /Action /S /GoTo /D [1294 0 R /XYZ 72.0 115.755 null] >> endobj 3062 0 obj << /Type /Annot /Subtype /Link /Rect [ 148.38 543.9 165.88 552.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3061 0 R /H /I >> endobj 3063 0 obj << /Type /Action /S /GoTo /D [971 0 R /XYZ 72.0 245.421 null] >> endobj 3064 0 obj << /Type /Annot /Subtype /Link /Rect [ 147.83 531.9 165.33 540.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3063 0 R /H /I >> endobj 3065 0 obj << /Type /Action /S /GoTo /D [374 0 R /XYZ 72.0 93.904 null] >> endobj 3066 0 obj << /Type /Annot /Subtype /Link /Rect [ 280.87 519.9 293.37 528.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3065 0 R /H /I >> endobj 3067 0 obj << /Type /Action /S /GoTo /D [666 0 R /XYZ 72.0 396.075 null] >> endobj 3068 0 obj << /Type /Annot /Subtype /Link /Rect [ 126.7 507.9 144.2 516.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3067 0 R /H /I >> endobj 3069 0 obj << /Type /Action /S /GoTo /D [1235 0 R /XYZ 72.0 630.543 null] >> endobj 3070 0 obj << /Type /Annot /Subtype /Link /Rect [ 147.83 495.9 165.33 504.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3069 0 R /H /I >> endobj 3071 0 obj << /Type /Action /S /GoTo /D [889 0 R /XYZ 72.0 645.8 null] >> endobj 3072 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.38 483.9 155.88 492.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3071 0 R /H /I >> endobj 3073 0 obj << /Type /Action /S /GoTo /D [658 0 R /XYZ 72.0 435.0 null] >> endobj 3074 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.37 471.9 220.87 480.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3073 0 R /H /I >> endobj 3075 0 obj << /Type /Action /S /GoTo /D [658 0 R /XYZ 72.0 720.0 null] >> endobj 3076 0 obj << /Type /Annot /Subtype /Link /Rect [ 128.38 459.9 145.88 468.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3075 0 R /H /I >> endobj 3077 0 obj << /Type /Action /S /GoTo /D [79 0 R /XYZ 72.0 450.111 null] >> endobj 3078 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.6 447.9 163.1 456.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3077 0 R /H /I >> endobj 3079 0 obj << /Type /Action /S /GoTo /D [1303 0 R /XYZ 72.0 389.988 null] >> endobj 3080 0 obj << /Type /Annot /Subtype /Link /Rect [ 195.6 435.9 213.1 444.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3079 0 R /H /I >> endobj 3081 0 obj << /Type /Action /S /GoTo /D [1303 0 R /XYZ 72.0 193.266 null] >> endobj 3082 0 obj << /Type /Annot /Subtype /Link /Rect [ 271.71 423.9 289.21 432.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3081 0 R /H /I >> endobj 3083 0 obj << /Type /Action /S /GoTo /D [1303 0 R /XYZ 72.0 258.84 null] >> endobj 3084 0 obj << /Type /Annot /Subtype /Link /Rect [ 240.04 411.9 257.54 420.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3083 0 R /H /I >> endobj 3085 0 obj << /Type /Action /S /GoTo /D [1303 0 R /XYZ 72.0 324.414 null] >> endobj 3086 0 obj << /Type /Annot /Subtype /Link /Rect [ 227.27 399.9 244.77 408.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3085 0 R /H /I >> endobj 3087 0 obj << /Type /Action /S /GoTo /D [675 0 R /XYZ 72.0 195.05 null] >> endobj 3088 0 obj << /Type /Annot /Subtype /Link /Rect [ 173.09 387.9 190.59 396.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3087 0 R /H /I >> endobj 3089 0 obj << /Type /Action /S /GoTo /D [1294 0 R /XYZ 72.0 93.872 null] >> endobj 3090 0 obj << /Type /Annot /Subtype /Link /Rect [ 148.38 375.9 165.88 384.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3089 0 R /H /I >> endobj 3091 0 obj << /Type /Action /S /GoTo /D [669 0 R /XYZ 72.0 219.874 null] >> endobj 3092 0 obj << /Type /Annot /Subtype /Link /Rect [ 154.2 363.9 171.7 372.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3091 0 R /H /I >> endobj 3093 0 obj << /Type /Action /S /GoTo /D [1303 0 R /XYZ 72.0 115.692 null] >> endobj 3094 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.81 351.9 220.31 360.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3093 0 R /H /I >> endobj 3095 0 obj << /Type /Action /S /GoTo /D [701 0 R /XYZ 72.0 115.061 null] >> endobj 3096 0 obj << /Type /Annot /Subtype /Link /Rect [ 131.71 311.1 149.21 320.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3095 0 R /H /I >> endobj 3097 0 obj << /Type /Action /S /GoTo /D [701 0 R /XYZ 72.0 231.504 null] >> endobj 3098 0 obj << /Type /Annot /Subtype /Link /Rect [ 159.22 299.1 176.72 308.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3097 0 R /H /I >> endobj 3099 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 708.0 null] >> endobj 3100 0 obj << /Type /Annot /Subtype /Link /Rect [ 184.21 258.3 196.71 267.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3099 0 R /H /I >> endobj 3101 0 obj << /Type /Action /S /GoTo /D [939 0 R /XYZ 72.0 489.246 null] >> endobj 3102 0 obj << /Type /Annot /Subtype /Link /Rect [ 132.54 217.5 150.04 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3101 0 R /H /I >> endobj 3103 0 obj << /Type /Action /S /GoTo /D [695 0 R /XYZ 72.0 618.936 null] >> endobj 3104 0 obj << /Type /Annot /Subtype /Link /Rect [ 122.55 205.5 140.05 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3103 0 R /H /I >> endobj 3105 0 obj << /Type /Action /S /GoTo /D [1235 0 R /XYZ 72.0 439.629 null] >> endobj 3106 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.5 193.5 162.0 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3105 0 R /H /I >> endobj 3107 0 obj << /Type /Action /S /GoTo /D [1297 0 R /XYZ 72.0 662.072 null] >> endobj 3108 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.94 181.5 161.44 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3107 0 R /H /I >> endobj 3109 0 obj << /Type /Action /S /GoTo /D [1235 0 R /XYZ 72.0 362.172 null] >> endobj 3110 0 obj << /Type /Annot /Subtype /Link /Rect [ 136.72 169.5 154.22 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3109 0 R /H /I >> endobj 3111 0 obj << /Type /Action /S /GoTo /D [1235 0 R /XYZ 72.0 284.715 null] >> endobj 3112 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.82 157.5 170.32 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3111 0 R /H /I >> endobj 3113 0 obj << /Type /Action /S /GoTo /D [669 0 R /XYZ 72.0 599.604 null] >> endobj 3114 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.92 145.5 156.42 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3113 0 R /H /I >> endobj 3115 0 obj << /Type /Action /S /GoTo /D [1253 0 R /XYZ 72.0 684.0 null] >> endobj 3116 0 obj << /Type /Annot /Subtype /Link /Rect [ 126.16 133.5 143.66 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3115 0 R /H /I >> endobj 3117 0 obj << /Type /Action /S /GoTo /D [1297 0 R /XYZ 72.0 572.288 null] >> endobj 3118 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.71 121.5 184.21 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3117 0 R /H /I >> endobj 3119 0 obj << /Type /Action /S /GoTo /D [1306 0 R /XYZ 72.0 116.886 null] >> endobj 3120 0 obj << /Type /Annot /Subtype /Link /Rect [ 148.38 109.5 165.88 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3119 0 R /H /I >> endobj 3121 0 obj << /Type /Action /S /GoTo /D [1262 0 R /XYZ 72.0 579.84 null] >> endobj 3122 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.6 97.5 188.1 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3121 0 R /H /I >> endobj 3123 0 obj << /Type /Action /S /GoTo /D [1262 0 R /XYZ 72.0 492.672 null] >> endobj 3124 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.94 85.5 221.44 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3123 0 R /H /I >> endobj 3125 0 obj << /Type /Action /S /GoTo /D [1235 0 R /XYZ 72.0 207.258 null] >> endobj 3126 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.27 73.5 169.77 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3125 0 R /H /I >> endobj 3127 0 obj << /Type /Action /S /GoTo /D [278 0 R /XYZ 72.0 322.264 null] >> endobj 3128 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.94 709.5 391.44 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3127 0 R /H /I >> endobj 3129 0 obj << /Type /Action /S /GoTo /D [1253 0 R /XYZ 72.0 551.52 null] >> endobj 3130 0 obj << /Type /Annot /Subtype /Link /Rect [ 383.38 697.5 400.88 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3129 0 R /H /I >> endobj 3131 0 obj << /Type /Action /S /GoTo /D [1253 0 R /XYZ 72.0 617.76 null] >> endobj 3132 0 obj << /Type /Annot /Subtype /Link /Rect [ 373.38 685.5 390.88 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3131 0 R /H /I >> endobj 3133 0 obj << /Type /Action /S /GoTo /D [965 0 R /XYZ 72.0 316.484 null] >> endobj 3134 0 obj << /Type /Annot /Subtype /Link /Rect [ 388.11 673.5 405.61 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3133 0 R /H /I >> endobj 3135 0 obj << /Type /Action /S /GoTo /D [1235 0 R /XYZ 72.0 93.801 null] >> endobj 3136 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.94 661.5 396.44 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3135 0 R /H /I >> endobj 3137 0 obj << /Type /Action /S /GoTo /D [1238 0 R /XYZ 72.0 650.086 null] >> endobj 3138 0 obj << /Type /Annot /Subtype /Link /Rect [ 383.94 649.5 401.44 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3137 0 R /H /I >> endobj 3139 0 obj << /Type /Action /S /GoTo /D [672 0 R /XYZ 72.0 116.453 null] >> endobj 3140 0 obj << /Type /Annot /Subtype /Link /Rect [ 392.26 608.7 409.76 617.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3139 0 R /H /I >> endobj 3141 0 obj << /Type /Action /S /GoTo /D [1283 0 R /XYZ 72.0 334.93 null] >> endobj 3142 0 obj << /Type /Annot /Subtype /Link /Rect [ 449.48 596.7 466.98 605.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3141 0 R /H /I >> endobj 3143 0 obj << /Type /Action /S /GoTo /D [895 0 R /XYZ 72.0 423.278 null] >> endobj 3144 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.38 584.7 395.88 593.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3143 0 R /H /I >> endobj 3145 0 obj << /Type /Action /S /GoTo /D [1265 0 R /XYZ 72.0 116.544 null] >> endobj 3146 0 obj << /Type /Annot /Subtype /Link /Rect [ 391.71 572.7 409.21 581.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3145 0 R /H /I >> endobj 3147 0 obj << /Type /Action /S /GoTo /D [1253 0 R /XYZ 72.0 463.2 null] >> endobj 3148 0 obj << /Type /Annot /Subtype /Link /Rect [ 376.16 560.7 393.66 569.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3147 0 R /H /I >> endobj 3149 0 obj << /Type /Action /S /GoTo /D [1268 0 R /XYZ 72.0 696.0 null] >> endobj 3150 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.49 548.7 406.99 557.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3149 0 R /H /I >> endobj 3151 0 obj << /Type /Action /S /GoTo /D [1268 0 R /XYZ 72.0 619.2 null] >> endobj 3152 0 obj << /Type /Annot /Subtype /Link /Rect [ 418.93 536.7 436.43 545.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3151 0 R /H /I >> endobj 3153 0 obj << /Type /Action /S /GoTo /D [710 0 R /XYZ 72.0 720.0 null] >> endobj 3154 0 obj << /Type /Annot /Subtype /Link /Rect [ 381.16 495.9 398.66 504.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3153 0 R /H /I >> endobj 3155 0 obj << /Type /Action /S /GoTo /D [707 0 R /XYZ 72.0 477.675 null] >> endobj 3156 0 obj << /Type /Annot /Subtype /Link /Rect [ 406.72 483.9 424.22 492.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3155 0 R /H /I >> endobj 3157 0 obj << /Type /Action /S /GoTo /D [707 0 R /XYZ 72.0 236.199 null] >> endobj 3158 0 obj << /Type /Annot /Subtype /Link /Rect [ 397.28 471.9 414.78 480.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3157 0 R /H /I >> endobj 3159 0 obj << /Type /Action /S /GoTo /D [701 0 R /XYZ 72.0 93.53 null] >> endobj 3160 0 obj << /Type /Annot /Subtype /Link /Rect [ 388.93 459.9 406.43 468.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3159 0 R /H /I >> endobj 3161 0 obj << /Type /Action /S /GoTo /D [652 0 R /XYZ 72.0 93.447 null] >> endobj 3162 0 obj << /Type /Annot /Subtype /Link /Rect [ 401.99 447.9 419.49 456.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3161 0 R /H /I >> endobj 3163 0 obj << /Type /Action /S /GoTo /D [1262 0 R /XYZ 72.0 367.296 null] >> endobj 3164 0 obj << /Type /Annot /Subtype /Link /Rect [ 376.71 435.9 394.21 444.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3163 0 R /H /I >> endobj 3165 0 obj << /Type /Action /S /GoTo /D [1297 0 R /XYZ 72.0 482.504 null] >> endobj 3166 0 obj << /Type /Annot /Subtype /Link /Rect [ 388.38 423.9 405.88 432.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3165 0 R /H /I >> endobj 3167 0 obj << /Type /Action /S /GoTo /D [942 0 R /XYZ 72.0 409.713 null] >> endobj 3168 0 obj << /Type /Annot /Subtype /Link /Rect [ 375.6 411.9 393.1 420.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3167 0 R /H /I >> endobj 3169 0 obj << /Type /Action /S /GoTo /D [632 0 R /XYZ 72.0 295.892 null] >> endobj 3170 0 obj << /Type /Annot /Subtype /Link /Rect [ 375.6 399.9 393.1 408.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3169 0 R /H /I >> endobj 3171 0 obj << /Type /Action /S /GoTo /D [52 0 R /XYZ 72.0 211.565 null] >> endobj 3172 0 obj << /Type /Annot /Subtype /Link /Rect [ 386.72 387.9 399.22 396.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3171 0 R /H /I >> endobj 3173 0 obj << /Type /Action /S /GoTo /D [655 0 R /XYZ 72.0 326.784 null] >> endobj 3174 0 obj << /Type /Annot /Subtype /Link /Rect [ 419.2 375.9 436.7 384.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3173 0 R /H /I >> endobj 3175 0 obj << /Type /Action /S /GoTo /D [655 0 R /XYZ 72.0 149.624 null] >> endobj 3176 0 obj << /Type /Annot /Subtype /Link /Rect [ 409.76 363.9 427.26 372.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3175 0 R /H /I >> endobj 3177 0 obj << /Type /Action /S /GoTo /D [1297 0 R /XYZ 72.0 314.936 null] >> endobj 3178 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.38 351.9 395.88 360.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3177 0 R /H /I >> endobj 3179 0 obj << /Type /Action /S /GoTo /D [1297 0 R /XYZ 72.0 404.72 null] >> endobj 3180 0 obj << /Type /Annot /Subtype /Link /Rect [ 373.38 339.9 390.88 348.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3179 0 R /H /I >> endobj 3181 0 obj << /Type /Action /S /GoTo /D [1238 0 R /XYZ 72.0 572.344 null] >> endobj 3182 0 obj << /Type /Annot /Subtype /Link /Rect [ 430.04 299.1 447.54 308.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3181 0 R /H /I >> endobj 3183 0 obj << /Type /Action /S /GoTo /D [67 0 R /XYZ 72.0 581.414 null] >> endobj 3184 0 obj << /Type /Annot /Subtype /Link /Rect [ 370.05 287.1 382.55 296.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3183 0 R /H /I >> endobj 3185 0 obj << /Type /Action /S /GoTo /D [704 0 R /XYZ 72.0 421.28 null] >> endobj 3186 0 obj << /Type /Annot /Subtype /Link /Rect [ 374.49 275.1 391.99 284.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3185 0 R /H /I >> endobj 3187 0 obj << /Type /Action /S /GoTo /D [675 0 R /XYZ 72.0 435.638 null] >> endobj 3188 0 obj << /Type /Annot /Subtype /Link /Rect [ 407.82 263.1 425.32 272.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3187 0 R /H /I >> endobj 3189 0 obj << /Type /Action /S /GoTo /D [1238 0 R /XYZ 72.0 472.688 null] >> endobj 3190 0 obj << /Type /Annot /Subtype /Link /Rect [ 400.6 251.1 418.1 260.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3189 0 R /H /I >> endobj 3191 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 651.556 null] >> endobj 3192 0 obj << /Type /Annot /Subtype /Link /Rect [ 383.12 210.3 395.62 219.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3191 0 R /H /I >> endobj 3193 0 obj << /Type /Action /S /GoTo /D [1336 0 R /XYZ 72.0 378.24 null] >> endobj 3194 0 obj << /Type /Annot /Subtype /Link /Rect [ 402.27 198.3 419.77 207.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3193 0 R /H /I >> endobj 3195 0 obj << /Type /Action /S /GoTo /D [928 0 R /XYZ 72.0 640.32 null] >> endobj 3196 0 obj << /Type /Annot /Subtype /Link /Rect [ 343.11 186.3 360.61 195.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3195 0 R /H /I >> endobj 3197 0 obj << /Type /Action /S /GoTo /D [1253 0 R /XYZ 72.0 407.04 null] >> endobj 3198 0 obj << /Type /Annot /Subtype /Link /Rect [ 361.72 174.3 379.22 183.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3197 0 R /H /I >> endobj 3199 0 obj << /Type /Action /S /GoTo /D [1283 0 R /XYZ 72.0 270.598 null] >> endobj 3200 0 obj << /Type /Annot /Subtype /Link /Rect [ 438.38 162.3 455.88 171.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3199 0 R /H /I >> endobj 3201 0 obj << /Type /Action /S /GoTo /D [1238 0 R /XYZ 72.0 283.29 null] >> endobj 3202 0 obj << /Type /Annot /Subtype /Link /Rect [ 398.38 150.3 415.88 159.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3201 0 R /H /I >> endobj 3203 0 obj << /Type /Action /S /GoTo /D [1253 0 R /XYZ 72.0 340.8 null] >> endobj 3204 0 obj << /Type /Annot /Subtype /Link /Rect [ 387.83 138.3 405.33 147.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3203 0 R /H /I >> endobj 3205 0 obj << /Type /Action /S /GoTo /D [320 0 R /XYZ 72.0 649.715 null] >> endobj 3206 0 obj << /Type /Annot /Subtype /Link /Rect [ 427.55 126.3 440.05 135.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3205 0 R /H /I >> endobj 3207 0 obj << /Type /Action /S /GoTo /D [583 0 R /XYZ 72.0 500.568 null] >> endobj 3208 0 obj << /Type /Annot /Subtype /Link /Rect [ 381.17 114.3 393.67 123.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3207 0 R /H /I >> endobj 3209 0 obj << /Type /Action /S /GoTo /D [1268 0 R /XYZ 72.0 542.4 null] >> endobj 3210 0 obj << /Type /Annot /Subtype /Link /Rect [ 400.05 73.5 417.55 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3209 0 R /H /I >> endobj 3211 0 obj << /Length 3212 0 R /Filter /FlateDecode >> stream xœÍ[ßsÛ6~÷_Ç»™;†ø >26í°‘HG¢œd:k+­nl9µ•&ýïo!Ñ"Ä]@~ê]ÓŒlé[è#°Xìî‡üqÂYþí_l!ØíÃÉý{œYÁ¤éßÒ†q›™Ü±Öÿâ´c÷xð£‡ô?Êí»=z÷ËïìãÉú$g'?ÿ ;–gš}?ÉÑà»aæ'à˵ɤqEQô\EÆó_!3?Ü>°7õƒ`g[ô {?Pþ?g2’\ü0ÊÙo'o»“7çšñœu_àœgNÂ<©˜Ë¤(ü‚uìçÌ?LX½¾[þøç/¬ûé¤êú‡ÛYz÷ð¿Í¶>tðVùá'íßÞ…¿*“»÷àLhx ÿÑ}¿¤ý«ÿàåG½¢ÝktJú¡ãñmçêïüòøZXoÈóÌ,‚(\0ý‡žõ7ÏZHÿÝñçÉ‘C]ÌʦcO÷˱ÝCíÁÚfªÈóœ‡Ì¶Èж#pÎDŽhTeWÍ;öåÛúv³z\#6Ï ß ”Âæ¬2óB BRdRzþN¾j—usÁÚËjVvuÛÌ%.x&- laEÐ-3EsÑûÔ›séHÖ &‚XØþÝ šXc+3.ú/Ú«O];+?&f×e¹Ÿ°& ™£'ÉÁ-£hnš^§ÇŒÚÅ,ÎÆ70¼4›ŽÁ–g& æN%§•Ã1f¤?Õ µ³¨Ë…Î ¿l¹ä;ôên¹Þ¬¾¬–Oìö÷›ñ(:sÜo ¡aïÄÑ<Ç;‰K›þ‘ì¼1¥»å—ÕzEN±“Y®ýع&Æ@hé8Z˜–*F ú¬jººû_uñÆù/‘†°GhÄѼÀNÈ s:gÕ§zÞá­­!Êú½ê¬#ìZd6ŽÖ9¦»fL¥YL&ñɱf5Ø¡Ýj0š €–Mμƒ <…uÃtÀ­_â6%èÈ8škŽéc'«›óv6ÝFâëùé»jZ^Ÿ–]9i/®›rZ!†"‡900‚ö§2Á!ë’q¸5Ć\¼a_Ÿ–w«Û› qšªÌúÍœ[C˜g¯ˆ£!ja:yw3¯f‰5\ClZCŒ¦‚¾ÈÉwŒê¦kq  [ÒÅÑ\)‡ûÝj½Y>ýysÏn~}~¼ÿ¶Y2øåÛ2>a\>‚ÇÃp9x †sŽã‚Ð(š¿„—ìT0i>rH °-BäÅÑ$ƒ}¼«fWå„mþúº|Æ>å2íÏ/§,aŒb8Ïò8Z|ròùu¹èÚÓv:­¾î“¯ÃMÀ Áy¡1µyûü²Ú³¶™|¾>ƒPõ¶œW×çõ¤š'xEf!¿ÊåÄ8ȉLÄáO8Â_Á3Á¶^îËSHª‰ÁÜ—Pq8É£Ø0œWó9œ ‚ZÃÙ s¢„%ÆÂp ‡wNhWÌÙäusÚ%Žžƒ¿»¾²Çƒ`8ølÎ9ÁLáýñú¼[§ò Œ& +·ÛRŠÏ“YŸk¡UfâhÎñQ Þíd—ZLª«*1]\æ™ó‘ÁB%ŽÇ¡Ž‡ï+RHØÑÊW'’Ü­ÅO‰êDå&³Ò‡÷¢èÑ-¤$‹9”±øä€8³p¹# Ñq a&ކJͱâŽ"ó}µùÝ>®ï"U ¤=>ïáB#%€£÷¬"“«”É”Ô\š¾¦~Ÿš\˜0-ú‡®>_Ÿ¶“Å´¹^ÌË œúÚr˜5dá*X·6ý40u¹opÕ»Ê$ñ4PËm›"ÎèþÙ'es± žÂµ>6Ch9ô0š+œéCr´M,á (^¨@ŠQN¨šL«mGVí™DÑ`&B™œ&B+2MXá<›Q 3ìò1ªLõÄlÐÃÆ4Å0šm:­"tžàcÔ°!±-B›£É gói.ºw‰žB>´_°5Ñ‘q4ÉÈ"ï­ßW‰³ ʜ…ã–0&a*ަÎ6í'r%(Jù.-Ö„%Qm˜8š;œ¯ëyt[žm“àD/2ˆƒx„¶CÅhÊ«M޼º}{]Ÿ½.IÂÖ©$ £y[ F ¿nOËIWOSÓ”Zx2÷ŒÃ¡ªÇ¬$òíVó®œ^¦ å}`ÂÃ`x™0œä¦›·.1] „ÏQ„5‘‚Ú8z ª.Ð_„ò¯·¯Ö^€ò{õÖ„8uÍ0Ç´$bXi‰¾¢qTS‡ÌИ9&¼Ø@ãÀ !l úGÈE\Lqé×9äÒ^²Õš==~Û¬ÖT»ÃdÜ—ß¹áØšˆ & æD]›1ŸË2¥BŸA¦)§A`ê¤3nL¦›ÕÓ×å&È6•š 0·éD¾ð}L(’Œë·ç4‘ùB}0’ˆ¦ewú.UúÀá¹qEX“#І·ºGŒ>]Ÿ–³³º)'IÅÄK1Êo7m%1†Y‡ó‚* €å~5”ëëi5»¨Ž·p±aª…‹Ñ\âš’+=&S7‹TзA•‹­‰µqô^J i;fÔ¦v¨tMlJL§‰£©Æ½p:¢Ó¤Òcë%7¿ÎÆÄlq4wÄŠ9Nò‚M«s3Ÿx ‡P‡ïiE¢‡×‰Œ/œíK•Ú$ÂV>Ö7Kö´Ü*Ç´ìW¨,˜M¨,/—BFHýF«õoþÜúÏ#œZwlsó+q½£еã‚Kk„à"ˆ<)±çåýòvÃîWÏoõ ½Yœ¤WBc¡x!å£)»Å¬œ0ß¡¢Žø½3—Xlà‹„ÄB4ʰîÑTŸ:vUN;ogx~‚]x\b)İÃ1R#LÉM›¸9b‚jí¸°b‚jÐUˆL«¾{\Ÿ¿®Z;.¡„Õ¥ íc¤blûÙus¹ÀB¹ t§ãj‰ d'B,QD)ëo˧Õ-l®Íòéæ>Í訳÷Õg)àyót³ZãŠÂßpý B”Q´&Ô—|ìÙ‹·HWg-Õ˜÷å|±Sä!YÍÇÀ.}áßÀ¦<ô?$(Ö(>,ÊY—ZkLÓqAœŽ£÷M–þ$}8ù/㎻û endstream endobj 3044 0 obj [ 3043 0 R 3046 0 R 3048 0 R 3050 0 R 3052 0 R 3054 0 R 3056 0 R 3058 0 R 3060 0 R 3062 0 R 3064 0 R 3066 0 R 3068 0 R 3070 0 R 3072 0 R 3074 0 R 3076 0 R 3078 0 R 3080 0 R 3082 0 R 3084 0 R 3086 0 R 3088 0 R 3090 0 R 3092 0 R 3094 0 R 3096 0 R 3098 0 R 3100 0 R 3102 0 R 3104 0 R 3106 0 R 3108 0 R 3110 0 R 3112 0 R 3114 0 R 3116 0 R 3118 0 R 3120 0 R 3122 0 R 3124 0 R 3126 0 R 3128 0 R 3130 0 R 3132 0 R 3134 0 R 3136 0 R 3138 0 R 3140 0 R 3142 0 R 3144 0 R 3146 0 R 3148 0 R 3150 0 R 3152 0 R 3154 0 R 3156 0 R 3158 0 R 3160 0 R 3162 0 R 3164 0 R 3166 0 R 3168 0 R 3170 0 R 3172 0 R 3174 0 R 3176 0 R 3178 0 R 3180 0 R 3182 0 R 3184 0 R 3186 0 R 3188 0 R 3190 0 R 3192 0 R 3194 0 R 3196 0 R 3198 0 R 3200 0 R 3202 0 R 3204 0 R 3206 0 R 3208 0 R 3210 0 R ] endobj 3041 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 3044 0 R /Contents 3211 0 R >> endobj 3212 0 obj 2784 endobj 3214 0 obj << /Type /Action /S /GoTo /D [1253 0 R /XYZ 72.0 262.56 null] >> endobj 3215 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.27 692.22 174.77 701.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3214 0 R /H /I >> endobj 3217 0 obj << /Type /Action /S /GoTo /D [1253 0 R /XYZ 72.0 184.32 null] >> endobj 3218 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.16 680.22 158.66 689.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3217 0 R /H /I >> endobj 3219 0 obj << /Type /Action /S /GoTo /D [1238 0 R /XYZ 72.0 171.634 null] >> endobj 3220 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.04 668.22 187.54 677.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3219 0 R /H /I >> endobj 3221 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 607.112 null] >> endobj 3222 0 obj << /Type /Annot /Subtype /Link /Rect [ 218.11 656.22 230.61 665.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3221 0 R /H /I >> endobj 3223 0 obj << /Type /Action /S /GoTo /D [1238 0 R /XYZ 72.0 93.892 null] >> endobj 3224 0 obj << /Type /Annot /Subtype /Link /Rect [ 204.5 644.22 222.0 653.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3223 0 R /H /I >> endobj 3225 0 obj << /Type /Action /S /GoTo /D [1241 0 R /XYZ 72.0 594.264 null] >> endobj 3226 0 obj << /Type /Annot /Subtype /Link /Rect [ 252.28 632.22 269.78 641.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3225 0 R /H /I >> endobj 3227 0 obj << /Type /Action /S /GoTo /D [1241 0 R /XYZ 72.0 673.566 null] >> endobj 3228 0 obj << /Type /Annot /Subtype /Link /Rect [ 212.28 620.22 229.78 629.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3227 0 R /H /I >> endobj 3229 0 obj << /Type /Action /S /GoTo /D [281 0 R /XYZ 72.0 554.669 null] >> endobj 3230 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.94 608.22 191.44 617.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3229 0 R /H /I >> endobj 3231 0 obj << /Type /Action /S /GoTo /D [305 0 R /XYZ 72.0 700.8 null] >> endobj 3232 0 obj << /Type /Annot /Subtype /Link /Rect [ 119.22 596.22 131.72 605.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3231 0 R /H /I >> endobj 3233 0 obj << /Type /Action /S /GoTo /D [965 0 R /XYZ 72.0 160.196 null] >> endobj 3234 0 obj << /Type /Annot /Subtype /Link /Rect [ 222.55 584.22 240.05 593.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3233 0 R /H /I >> endobj 3235 0 obj << /Type /Action /S /GoTo /D [1241 0 R /XYZ 72.0 502.962 null] >> endobj 3236 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.61 572.22 168.11 581.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3235 0 R /H /I >> endobj 3237 0 obj << /Type /Action /S /GoTo /D [1241 0 R /XYZ 72.0 435.66 null] >> endobj 3238 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.28 560.22 174.78 569.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3237 0 R /H /I >> endobj 3239 0 obj << /Type /Action /S /GoTo /D [977 0 R /XYZ 72.0 451.423 null] >> endobj 3240 0 obj << /Type /Annot /Subtype /Link /Rect [ 188.38 548.22 205.88 557.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3239 0 R /H /I >> endobj 3241 0 obj << /Type /Action /S /GoTo /D [974 0 R /XYZ 72.0 504.288 null] >> endobj 3242 0 obj << /Type /Annot /Subtype /Link /Rect [ 117.0 536.22 134.5 545.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3241 0 R /H /I >> endobj 3243 0 obj << /Type /Action /S /GoTo /D [933 0 R /XYZ 72.0 218.4 null] >> endobj 3244 0 obj << /Type /Annot /Subtype /Link /Rect [ 122.56 524.22 140.06 533.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3243 0 R /H /I >> endobj 3245 0 obj << /Type /Action /S /GoTo /D [1241 0 R /XYZ 72.0 332.358 null] >> endobj 3246 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.28 512.22 174.78 521.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3245 0 R /H /I >> endobj 3247 0 obj << /Type /Action /S /GoTo /D [602 0 R /XYZ 72.0 285.771 null] >> endobj 3248 0 obj << /Type /Annot /Subtype /Link /Rect [ 117.55 500.22 130.05 509.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3247 0 R /H /I >> endobj 3249 0 obj << /Type /Action /S /GoTo /D [602 0 R /XYZ 72.0 184.891 null] >> endobj 3250 0 obj << /Type /Annot /Subtype /Link /Rect [ 146.16 488.22 158.66 497.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3249 0 R /H /I >> endobj 3251 0 obj << /Type /Action /S /GoTo /D [1241 0 R /XYZ 72.0 265.056 null] >> endobj 3252 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.38 476.22 160.88 485.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3251 0 R /H /I >> endobj 3253 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 550.668 null] >> endobj 3254 0 obj << /Type /Annot /Subtype /Link /Rect [ 261.99 464.22 274.49 473.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3253 0 R /H /I >> endobj 3255 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 528.446 null] >> endobj 3256 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.44 452.22 208.94 461.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3255 0 R /H /I >> endobj 3257 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 484.002 null] >> endobj 3258 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.99 440.22 209.49 449.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3257 0 R /H /I >> endobj 3259 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 439.558 null] >> endobj 3260 0 obj << /Type /Annot /Subtype /Link /Rect [ 185.33 428.22 197.83 437.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3259 0 R /H /I >> endobj 3261 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 395.114 null] >> endobj 3262 0 obj << /Type /Annot /Subtype /Link /Rect [ 173.66 416.22 186.16 425.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3261 0 R /H /I >> endobj 3263 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 350.67 null] >> endobj 3264 0 obj << /Type /Annot /Subtype /Link /Rect [ 186.44 404.22 198.94 413.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3263 0 R /H /I >> endobj 3265 0 obj << /Type /Action /S /GoTo /D [281 0 R /XYZ 72.0 368.277 null] >> endobj 3266 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.89 392.22 143.39 401.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3265 0 R /H /I >> endobj 3267 0 obj << /Type /Action /S /GoTo /D [281 0 R /XYZ 72.0 257.081 null] >> endobj 3268 0 obj << /Type /Annot /Subtype /Link /Rect [ 204.77 380.22 217.27 389.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3267 0 R /H /I >> endobj 3269 0 obj << /Type /Action /S /GoTo /D [1274 0 R /XYZ 72.0 148.142 null] >> endobj 3270 0 obj << /Type /Annot /Subtype /Link /Rect [ 185.32 368.22 202.82 377.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3269 0 R /H /I >> endobj 3271 0 obj << /Type /Action /S /GoTo /D [1253 0 R /XYZ 72.0 94.08 null] >> endobj 3272 0 obj << /Type /Annot /Subtype /Link /Rect [ 181.43 356.22 198.93 365.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3271 0 R /H /I >> endobj 3273 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 306.226 null] >> endobj 3274 0 obj << /Type /Annot /Subtype /Link /Rect [ 207.54 344.22 220.04 353.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3273 0 R /H /I >> endobj 3275 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 261.782 null] >> endobj 3276 0 obj << /Type /Annot /Subtype /Link /Rect [ 181.99 332.22 194.49 341.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3275 0 R /H /I >> endobj 3277 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 217.338 null] >> endobj 3278 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.1 320.22 195.6 329.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3277 0 R /H /I >> endobj 3279 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 172.894 null] >> endobj 3280 0 obj << /Type /Annot /Subtype /Link /Rect [ 208.09 308.22 220.59 317.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3279 0 R /H /I >> endobj 3281 0 obj << /Type /Action /S /GoTo /D [377 0 R /XYZ 72.0 116.45 null] >> endobj 3282 0 obj << /Type /Annot /Subtype /Link /Rect [ 216.43 296.22 228.93 305.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3281 0 R /H /I >> endobj 3283 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 720.0 null] >> endobj 3284 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.43 284.22 208.93 293.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3283 0 R /H /I >> endobj 3285 0 obj << /Type /Action /S /GoTo /D [936 0 R /XYZ 72.0 418.566 null] >> endobj 3286 0 obj << /Type /Annot /Subtype /Link /Rect [ 127.83 272.22 145.33 281.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3285 0 R /H /I >> endobj 3287 0 obj << /Type /Action /S /GoTo /D [928 0 R /XYZ 72.0 527.52 null] >> endobj 3288 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.05 260.22 167.55 269.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3287 0 R /H /I >> endobj 3289 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 675.556 null] >> endobj 3290 0 obj << /Type /Annot /Subtype /Link /Rect [ 126.44 248.22 138.94 257.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3289 0 R /H /I >> endobj 3291 0 obj << /Type /Action /S /GoTo /D [1309 0 R /XYZ 72.0 652.0 null] >> endobj 3292 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.94 236.22 201.44 245.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3291 0 R /H /I >> endobj 3293 0 obj << /Type /Action /S /GoTo /D [1309 0 R /XYZ 72.0 696.0 null] >> endobj 3294 0 obj << /Type /Annot /Subtype /Link /Rect [ 159.49 224.22 176.99 233.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3293 0 R /H /I >> endobj 3295 0 obj << /Type /Action /S /GoTo /D [646 0 R /XYZ 72.0 310.295 null] >> endobj 3296 0 obj << /Type /Annot /Subtype /Link /Rect [ 161.98 212.22 179.48 221.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3295 0 R /H /I >> endobj 3297 0 obj << /Type /Action /S /GoTo /D [1241 0 R /XYZ 72.0 197.754 null] >> endobj 3298 0 obj << /Type /Annot /Subtype /Link /Rect [ 139.5 200.22 157.0 209.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3297 0 R /H /I >> endobj 3299 0 obj << /Type /Action /S /GoTo /D [1241 0 R /XYZ 72.0 94.452 null] >> endobj 3300 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.5 188.22 162.0 197.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3299 0 R /H /I >> endobj 3301 0 obj << /Type /Action /S /GoTo /D [281 0 R /XYZ 72.0 675.664 null] >> endobj 3302 0 obj << /Type /Annot /Subtype /Link /Rect [ 132.55 146.94 145.05 155.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3301 0 R /H /I >> endobj 3303 0 obj << /Type /Action /S /GoTo /D [942 0 R /XYZ 72.0 267.998 null] >> endobj 3304 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.71 134.94 184.21 143.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3303 0 R /H /I >> endobj 3305 0 obj << /Type /Action /S /GoTo /D [350 0 R /XYZ 72.0 518.733 null] >> endobj 3306 0 obj << /Type /Annot /Subtype /Link /Rect [ 137.82 122.94 150.32 131.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3305 0 R /H /I >> endobj 3307 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 631.112 null] >> endobj 3308 0 obj << /Type /Annot /Subtype /Link /Rect [ 132.0 110.94 144.5 119.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3307 0 R /H /I >> endobj 3309 0 obj << /Type /Action /S /GoTo /D [1356 0 R /XYZ 72.0 513.933 null] >> endobj 3310 0 obj << /Type /Annot /Subtype /Link /Rect [ 110.9 98.94 128.4 107.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3309 0 R /H /I >> endobj 3311 0 obj << /Type /Action /S /GoTo /D [923 0 R /XYZ 72.0 71.997 null] >> endobj 3312 0 obj << /Type /Annot /Subtype /Link /Rect [ 142.82 86.94 160.32 95.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3311 0 R /H /I >> endobj 3313 0 obj << /Type /Action /S /GoTo /D [1268 0 R /XYZ 72.0 477.6 null] >> endobj 3314 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.83 74.94 170.33 83.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3313 0 R /H /I >> endobj 3315 0 obj << /Type /Action /S /GoTo /D [1268 0 R /XYZ 72.0 400.8 null] >> endobj 3316 0 obj << /Type /Annot /Subtype /Link /Rect [ 487.82 709.5 505.32 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3315 0 R /H /I >> endobj 3317 0 obj << /Type /Action /S /GoTo /D [686 0 R /XYZ 72.0 614.728 null] >> endobj 3318 0 obj << /Type /Annot /Subtype /Link /Rect [ 353.67 697.5 371.17 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3317 0 R /H /I >> endobj 3319 0 obj << /Type /Action /S /GoTo /D [962 0 R /XYZ 72.0 306.788 null] >> endobj 3320 0 obj << /Type /Annot /Subtype /Link /Rect [ 422.83 685.5 440.33 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3319 0 R /H /I >> endobj 3321 0 obj << /Type /Action /S /GoTo /D [1288 0 R /XYZ 72.0 673.882 null] >> endobj 3322 0 obj << /Type /Annot /Subtype /Link /Rect [ 445.05 673.5 462.55 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3321 0 R /H /I >> endobj 3323 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 586.668 null] >> endobj 3324 0 obj << /Type /Annot /Subtype /Link /Rect [ 374.78 661.5 387.28 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3323 0 R /H /I >> endobj 3325 0 obj << /Type /Action /S /GoTo /D [1306 0 R /XYZ 72.0 696.0 null] >> endobj 3326 0 obj << /Type /Annot /Subtype /Link /Rect [ 408.94 649.5 426.44 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3325 0 R /H /I >> endobj 3327 0 obj << /Type /Action /S /GoTo /D [1306 0 R /XYZ 72.0 616.698 null] >> endobj 3328 0 obj << /Type /Annot /Subtype /Link /Rect [ 488.37 637.5 505.87 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3327 0 R /H /I >> endobj 3329 0 obj << /Type /Action /S /GoTo /D [1259 0 R /XYZ 72.0 181.044 null] >> endobj 3330 0 obj << /Type /Annot /Subtype /Link /Rect [ 449.49 625.5 466.99 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3329 0 R /H /I >> endobj 3331 0 obj << /Type /Action /S /GoTo /D [1303 0 R /XYZ 72.0 720.0 null] >> endobj 3332 0 obj << /Type /Annot /Subtype /Link /Rect [ 423.95 613.5 441.45 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3331 0 R /H /I >> endobj 3333 0 obj << /Type /Action /S /GoTo /D [275 0 R /XYZ 72.0 492.0 null] >> endobj 3334 0 obj << /Type /Annot /Subtype /Link /Rect [ 406.16 601.5 418.66 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3333 0 R /H /I >> endobj 3335 0 obj << /Type /Action /S /GoTo /D [287 0 R /XYZ 72.0 416.618 null] >> endobj 3336 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.05 589.5 397.55 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3335 0 R /H /I >> endobj 3337 0 obj << /Type /Action /S /GoTo /D [892 0 R /XYZ 72.0 204.96 null] >> endobj 3338 0 obj << /Type /Annot /Subtype /Link /Rect [ 506.98 577.5 524.48 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3337 0 R /H /I >> endobj 3339 0 obj << /Type /Action /S /GoTo /D [278 0 R /XYZ 72.0 478.824 null] >> endobj 3340 0 obj << /Type /Annot /Subtype /Link /Rect [ 406.17 565.5 418.67 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3339 0 R /H /I >> endobj 3341 0 obj << /Type /Action /S /GoTo /D [1404 0 R /XYZ 72.0 324.767 null] >> endobj 3342 0 obj << /Type /Annot /Subtype /Link /Rect [ 312.0 541.5 327.0 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3341 0 R /H /I >> endobj 3343 0 obj << /Type /Action /S /GoTo /D [1356 0 R /XYZ 72.0 300.666 null] >> endobj 3344 0 obj << /Type /Annot /Subtype /Link /Rect [ 450.32 529.5 467.82 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3343 0 R /H /I >> endobj 3345 0 obj << /Type /Action /S /GoTo /D [594 0 R /XYZ 72.0 185.466 null] >> endobj 3346 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.98 517.5 534.48 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3345 0 R /H /I >> endobj 3347 0 obj << /Type /Action /S /GoTo /D [1362 0 R /XYZ 72.0 150.87 null] >> endobj 3348 0 obj << /Type /Annot /Subtype /Link /Rect [ 312.0 493.5 327.0 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3347 0 R /H /I >> endobj 3349 0 obj << /Type /Action /S /GoTo /D [1356 0 R /XYZ 72.0 117.18 null] >> endobj 3350 0 obj << /Type /Annot /Subtype /Link /Rect [ 345.89 469.5 363.39 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3349 0 R /H /I >> endobj 3351 0 obj << /Type /Action /S /GoTo /D [1359 0 R /XYZ 72.0 574.0 null] >> endobj 3352 0 obj << /Type /Annot /Subtype /Link /Rect [ 500.88 457.5 518.38 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3351 0 R /H /I >> endobj 3353 0 obj << /Type /Action /S /GoTo /D [1359 0 R /XYZ 72.0 433.0 null] >> endobj 3354 0 obj << /Type /Annot /Subtype /Link /Rect [ 483.09 445.5 500.59 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3353 0 R /H /I >> endobj 3355 0 obj << /Type /Action /S /GoTo /D [1359 0 R /XYZ 72.0 136.5 null] >> endobj 3356 0 obj << /Type /Annot /Subtype /Link /Rect [ 407.0 433.5 424.5 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3355 0 R /H /I >> endobj 3357 0 obj << /Type /Action /S /GoTo /D [1401 0 R /XYZ 72.0 93.7 null] >> endobj 3358 0 obj << /Type /Annot /Subtype /Link /Rect [ 312.0 409.5 327.0 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3357 0 R /H /I >> endobj 3359 0 obj << /Type /Action /S /GoTo /D [1383 0 R /XYZ 72.0 641.541 null] >> endobj 3360 0 obj << /Type /Annot /Subtype /Link /Rect [ 470.33 397.5 487.83 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3359 0 R /H /I >> endobj 3361 0 obj << /Type /Action /S /GoTo /D [1380 0 R /XYZ 72.0 686.086 null] >> endobj 3362 0 obj << /Type /Annot /Subtype /Link /Rect [ 490.33 385.5 507.83 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3361 0 R /H /I >> endobj 3363 0 obj << /Type /Action /S /GoTo /D [1380 0 R /XYZ 72.0 207.634 null] >> endobj 3364 0 obj << /Type /Annot /Subtype /Link /Rect [ 517.55 373.5 535.05 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3363 0 R /H /I >> endobj 3365 0 obj << /Type /Action /S /GoTo /D [1383 0 R /XYZ 72.0 428.317 null] >> endobj 3366 0 obj << /Type /Annot /Subtype /Link /Rect [ 479.21 361.5 496.71 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3365 0 R /H /I >> endobj 3367 0 obj << /Type /Action /S /GoTo /D [1369 0 R /XYZ 72.0 247.2 null] >> endobj 3368 0 obj << /Type /Annot /Subtype /Link /Rect [ 449.5 349.5 467.0 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3367 0 R /H /I >> endobj 3369 0 obj << /Type /Action /S /GoTo /D [1383 0 R /XYZ 72.0 239.093 null] >> endobj 3370 0 obj << /Type /Annot /Subtype /Link /Rect [ 476.45 337.5 493.95 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3369 0 R /H /I >> endobj 3371 0 obj << /Type /Action /S /GoTo /D [1374 0 R /XYZ 72.0 528.516 null] >> endobj 3372 0 obj << /Type /Annot /Subtype /Link /Rect [ 477.29 325.5 494.79 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3371 0 R /H /I >> endobj 3373 0 obj << /Type /Action /S /GoTo /D [1369 0 R /XYZ 72.0 72.0 null] >> endobj 3374 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.22 313.5 516.72 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3373 0 R /H /I >> endobj 3375 0 obj << /Type /Action /S /GoTo /D [1369 0 R /XYZ 72.0 410.4 null] >> endobj 3376 0 obj << /Type /Annot /Subtype /Link /Rect [ 435.61 301.5 453.11 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3375 0 R /H /I >> endobj 3377 0 obj << /Type /Action /S /GoTo /D [1386 0 R /XYZ 72.0 720.0 null] >> endobj 3378 0 obj << /Type /Annot /Subtype /Link /Rect [ 476.44 289.5 493.94 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3377 0 R /H /I >> endobj 3379 0 obj << /Type /Action /S /GoTo /D [1386 0 R /XYZ 72.0 507.267 null] >> endobj 3380 0 obj << /Type /Annot /Subtype /Link /Rect [ 477.56 277.5 495.06 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3379 0 R /H /I >> endobj 3381 0 obj << /Type /Action /S /GoTo /D [1386 0 R /XYZ 72.0 306.534 null] >> endobj 3382 0 obj << /Type /Annot /Subtype /Link /Rect [ 479.22 265.5 496.72 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3381 0 R /H /I >> endobj 3383 0 obj << /Type /Action /S /GoTo /D [1389 0 R /XYZ 72.0 708.0 null] >> endobj 3384 0 obj << /Type /Annot /Subtype /Link /Rect [ 478.66 253.5 496.16 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3383 0 R /H /I >> endobj 3385 0 obj << /Type /Action /S /GoTo /D [1389 0 R /XYZ 72.0 473.448 null] >> endobj 3386 0 obj << /Type /Annot /Subtype /Link /Rect [ 475.89 241.5 493.39 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3385 0 R /H /I >> endobj 3387 0 obj << /Type /Action /S /GoTo /D [1374 0 R /XYZ 72.0 93.892 null] >> endobj 3388 0 obj << /Type /Annot /Subtype /Link /Rect [ 474.77 229.5 492.27 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3387 0 R /H /I >> endobj 3389 0 obj << /Type /Action /S /GoTo /D [1377 0 R /XYZ 72.0 262.275 null] >> endobj 3390 0 obj << /Type /Annot /Subtype /Link /Rect [ 522.706 217.5 540.001 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3389 0 R /H /I >> endobj 3391 0 obj << /Type /Action /S /GoTo /D [1374 0 R /XYZ 72.0 305.204 null] >> endobj 3392 0 obj << /Type /Annot /Subtype /Link /Rect [ 445.06 205.5 462.56 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3391 0 R /H /I >> endobj 3393 0 obj << /Type /Action /S /GoTo /D [1377 0 R /XYZ 72.0 495.995 null] >> endobj 3394 0 obj << /Type /Annot /Subtype /Link /Rect [ 467.56 205.5 485.06 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3393 0 R /H /I >> endobj 3395 0 obj << /Type /Action /S /GoTo /D [1380 0 R /XYZ 72.0 464.86 null] >> endobj 3396 0 obj << /Type /Annot /Subtype /Link /Rect [ 487.54 193.5 505.04 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3395 0 R /H /I >> endobj 3397 0 obj << /Type /Action /S /GoTo /D [1369 0 R /XYZ 72.0 652.8 null] >> endobj 3398 0 obj << /Type /Annot /Subtype /Link /Rect [ 506.99 181.5 524.49 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3397 0 R /H /I >> endobj 3399 0 obj << /Type /Action /S /GoTo /D [1362 0 R /XYZ 72.0 514.29 null] >> endobj 3400 0 obj << /Type /Annot /Subtype /Link /Rect [ 513.38 169.5 530.88 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3399 0 R /H /I >> endobj 3401 0 obj << /Type /Action /S /GoTo /D [1362 0 R /XYZ 72.0 356.58 null] >> endobj 3402 0 obj << /Type /Annot /Subtype /Link /Rect [ 365.89 145.5 383.39 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3401 0 R /H /I >> endobj 3403 0 obj << /Type /Action /S /GoTo /D [1362 0 R /XYZ 72.0 649.715 null] >> endobj 3404 0 obj << /Type /Annot /Subtype /Link /Rect [ 463.37 133.5 480.87 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3403 0 R /H /I >> endobj 3405 0 obj << /Type /Action /S /GoTo /D [335 0 R /XYZ 72.0 185.155 null] >> endobj 3406 0 obj << /Type /Annot /Subtype /Link /Rect [ 392.55 121.5 405.05 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3405 0 R /H /I >> endobj 3407 0 obj << /Type /Action /S /GoTo /D [335 0 R /XYZ 72.0 363.435 null] >> endobj 3408 0 obj << /Type /Annot /Subtype /Link /Rect [ 382.83 109.5 395.33 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3407 0 R /H /I >> endobj 3409 0 obj << /Type /Action /S /GoTo /D [344 0 R /XYZ 72.0 594.912 null] >> endobj 3410 0 obj << /Type /Annot /Subtype /Link /Rect [ 426.43 97.5 438.93 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3409 0 R /H /I >> endobj 3411 0 obj << /Type /Action /S /GoTo /D [1392 0 R /XYZ 72.0 546.755 null] >> endobj 3412 0 obj << /Type /Annot /Subtype /Link /Rect [ 467.84 85.5 485.34 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3411 0 R /H /I >> endobj 3413 0 obj << /Type /Action /S /GoTo /D [1392 0 R /XYZ 72.0 256.589 null] >> endobj 3414 0 obj << /Type /Annot /Subtype /Link /Rect [ 431.73 73.5 449.23 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3413 0 R /H /I >> endobj 3415 0 obj << /Length 3416 0 R /Filter /FlateDecode >> stream xœÍ[]sÛ6}÷¯Àc3Ó²@€à¾Ñ­°¥H‡¤œ¤ŽÇuÜmfb»~üûHJ„t.è}ên?Æ6}py\Üø÷3Îbûï7îKš v{öûôŒ³T0©§GJ3žF:6ìžM?eØ'<úÖA¦oåðtB?üÊÞž=œÅlsöãOôÅ‘bžÅ`|4Ó½±/W:’ÚdY6q7ƽBFÚ~s{Ͼ-ï[?è={g(þŸ³÷I.þÅìßgçýÙ·Šñ˜õ¿ÌàœGFÚyÖ2a&’"sÿÖß³¿êÞT¬|øp÷׫ŸXÿÝYÑOnéä#ìi4hèè*‰ãéëð|~jÿO"9>³O"¡ì§p¿ú4-éôÕýbÿ­¦hüœ’É”7øt†¹ú'_^‹Ô äqdŽÁþàMÿ±²þáYƒ…tï>|éè$GŸÈE$yDZHÆÓކøø1*ÒÜbcÍ'p¾.óºc¿|y¸}þøøð5GÆ íÔ« à4Jƒ`nâxÌd |êu˜ŒÎ"®-ZjCOÁ)tL‘I2 ó¶o^ï„2ʼnbµÃOÁö—‘ ¢yª€‘æ§ŒŠ‹¢-ê¾Ì«ëUSw}›—uß/žèˆïG‚D›è4^©^›âÝåõ6ïW¯‹5q)ì€á#@ÔÐóH¤ÛÛ¹)ëÍuÞ¶ùûBÆî¿ÔJÖ¤­!ZDiÍS 3ø Áj‰G ì Ú£hŠAïEUä]Áºüª¸l¬°S¬£,œMB@x%a¸4HJ äë|[“Äq¸Ä @gQF+Ž<$Jü²È{EÛÙ X±O¿±ìóã—çwO8YÊîwåo h9ïD“«¤@ÂvZ®ó]ÿºiËò¾lêëuÑ­Úò²oZ">2Y”¹ Ù®!a à™ˆ’0œˆ„¶j‹­ò” ef†«¦Úmëë s©¨M$óq‰îƧX¥)Ūmv}YK´2W)H&L <’0œ¢eWƒ ÕççU˜—‘”ÎÝI@¸²YxN’1§HíÖ}Rìg0áÞ®E8EÉÕfJ]¾Y˜'OSh€:÷²0œ"%¥Wçùê{/d'.´w*–œ0‚Ìx”…átmÕ>ú©É‹º'VӞ̮Þ&EFØ@¸=šÃpJð?òú.oC¤ìl\(ÀÙ³ E8E*Cí¤.Ûòª¬lÖIùÅN-&I ”UN°JbBø«ý×Ðê(6SÍPk¨ÂpŠ˜ T?êŠ7»¢^™%Öºê¡Ð†°BÕa²0œb&CªÃ-9ì·š #‡0}¹cwýöùî鉤å^äÄ!5aªÄΛÑ<ƺ¦âàÎ/ó¥Â¸KÿqìÊ2•`)RîÛraRW×ÅQ£@‡²»O ëïÛf{<ÑâPi›«Y×;ÙG~:ž“xh9'ñˆ&â>eDˆ «Š«¢Â~B¥Ã‰b4 ÓH„Ñ<ÁÚ²/8F=Ýþzw³/bâ y%´™£UDkÔ™Žõé ­^ۼωµ"Ðr2Dá"µ«Ø¼ÙU à½6¶p™Ì•$A¡‡GI-8VšµÐÙ±µ>Pî®»ÒEsÛr]/׬xj¥îz©` Á>€_âˆ^U¬Pm®üå:¨†§8À®€sA¤Tbžxû³³´©\uñ-x‹ ë2€æ Z©)©w'½† X!ó šg¸3Ý ’ÆsÚk¾Á0Â§Š ˜rUxt«p– ;2óê8`À^›À°mÑn öô|ó|w÷ðL´†íÄeΨT†n†s™ […ÀNÝ‘Ì;Mp4¹–A´Ä ‚kT}Ï^±o„M^4ûÊN^~înÌ\?Ç]vY ÅûÅÅ®^¹G_ã[ÒSY AèÜPº:0X5ÕèÄ×àûh…ºÂaÂp*´è%jëâ"ßU=+ëÒ]bc¸ <…«7îƒ&îêa8q6ºäjÊDÛîh5÷&êó“Ãaá=ó"|Ÿ8UàD£RRþËOô §ñÁÌhø¹-:ÿÇm±mÚ÷ø’ätmÔ„ÛÉ'‡f´ž›ˆ&…¢ÇˆÏh•.e¨²þý%Q44®ãÆæÐ ¹†LnS±ÄÑ.µË„›M æ)ŸËÀh ár.#œ$h’%‚›zIE "s F2°ŽX º(D‹vzt™wÝÛ¦]{¬X}ïýv26§¬žR,ŠË][ί6ÖûäÄmî×sÑÀõQ~º¢:}‹ºrôìIg V慠h|¤>C0†ÅgpA¤Ð2YÖÄðªhímwŽ*Σ»±rQР½ú6ÂI–ŠßËu³s¤Î‰ÃÐÆÂ]„Ð)'L!<‹Ò0œ\g}*Vàç. > endobj 3416 0 obj 3170 endobj 3418 0 obj << /Type /Action /S /GoTo /D [1392 0 R /XYZ 72.0 115.145 null] >> endobj 3419 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.95 709.5 201.45 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3418 0 R /H /I >> endobj 3421 0 obj << /Type /Action /S /GoTo /D [1395 0 R /XYZ 72.0 607.5 null] >> endobj 3422 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.45 697.5 183.95 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3421 0 R /H /I >> endobj 3423 0 obj << /Type /Action /S /GoTo /D [1401 0 R /XYZ 72.0 618.9 null] >> endobj 3424 0 obj << /Type /Annot /Subtype /Link /Rect [ 180.62 685.5 198.12 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3423 0 R /H /I >> endobj 3425 0 obj << /Type /Action /S /GoTo /D [1395 0 R /XYZ 72.0 409.0 null] >> endobj 3426 0 obj << /Type /Annot /Subtype /Link /Rect [ 147.0 673.5 164.5 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3425 0 R /H /I >> endobj 3427 0 obj << /Type /Action /S /GoTo /D [1395 0 R /XYZ 72.0 268.0 null] >> endobj 3428 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.61 661.5 188.11 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3427 0 R /H /I >> endobj 3429 0 obj << /Type /Action /S /GoTo /D [1395 0 R /XYZ 72.0 115.0 null] >> endobj 3430 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.22 649.5 161.72 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3429 0 R /H /I >> endobj 3431 0 obj << /Type /Action /S /GoTo /D [1398 0 R /XYZ 72.0 630.258 null] >> endobj 3432 0 obj << /Type /Annot /Subtype /Link /Rect [ 167.83 637.5 185.33 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3431 0 R /H /I >> endobj 3433 0 obj << /Type /Action /S /GoTo /D [1398 0 R /XYZ 72.0 183.634 null] >> endobj 3434 0 obj << /Type /Annot /Subtype /Link /Rect [ 158.12 625.5 175.62 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3433 0 R /H /I >> endobj 3435 0 obj << /Type /Action /S /GoTo /D [1401 0 R /XYZ 72.0 419.0 null] >> endobj 3436 0 obj << /Type /Annot /Subtype /Link /Rect [ 204.52 613.5 222.02 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3435 0 R /H /I >> endobj 3437 0 obj << /Type /Action /S /GoTo /D [1398 0 R /XYZ 72.0 474.774 null] >> endobj 3438 0 obj << /Type /Annot /Subtype /Link /Rect [ 194.49 601.5 211.99 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3437 0 R /H /I >> endobj 3439 0 obj << /Type /Action /S /GoTo /D [649 0 R /XYZ 72.0 720.0 null] >> endobj 3440 0 obj << /Type /Annot /Subtype /Link /Rect [ 177.54 589.5 195.04 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3439 0 R /H /I >> endobj 3441 0 obj << /Type /Action /S /GoTo /D [290 0 R /XYZ 72.0 256.0 null] >> endobj 3442 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.61 577.5 173.11 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3441 0 R /H /I >> endobj 3443 0 obj << /Type /Action /S /GoTo /D [594 0 R /XYZ 72.0 310.918 null] >> endobj 3444 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.1 565.5 195.6 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3443 0 R /H /I >> endobj 3445 0 obj << /Type /Action /S /GoTo /D [290 0 R /XYZ 72.0 662.0 null] >> endobj 3446 0 obj << /Type /Annot /Subtype /Link /Rect [ 149.5 553.5 162.0 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3445 0 R /H /I >> endobj 3447 0 obj << /Type /Action /S /GoTo /D [710 0 R /XYZ 72.0 415.68 null] >> endobj 3448 0 obj << /Type /Annot /Subtype /Link /Rect [ 159.5 541.5 177.0 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3447 0 R /H /I >> endobj 3449 0 obj << /Type /Action /S /GoTo /D [594 0 R /XYZ 72.0 412.37 null] >> endobj 3450 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.73 529.5 164.23 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3449 0 R /H /I >> endobj 3451 0 obj << /Type /Action /S /GoTo /D [287 0 R /XYZ 72.0 137.678 null] >> endobj 3452 0 obj << /Type /Annot /Subtype /Link /Rect [ 123.39 517.5 135.89 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3451 0 R /H /I >> endobj 3453 0 obj << /Type /Action /S /GoTo /D [1389 0 R /XYZ 72.0 217.077 null] >> endobj 3454 0 obj << /Type /Annot /Subtype /Link /Rect [ 220.32 505.5 237.82 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3453 0 R /H /I >> endobj 3455 0 obj << /Type /Action /S /GoTo /D [284 0 R /XYZ 72.0 116.125 null] >> endobj 3456 0 obj << /Type /Annot /Subtype /Link /Rect [ 123.39 493.5 135.89 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3455 0 R /H /I >> endobj 3457 0 obj << /Type /Action /S /GoTo /D [287 0 R /XYZ 72.0 283.148 null] >> endobj 3458 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.95 481.5 151.45 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3457 0 R /H /I >> endobj 3459 0 obj << /Type /Action /S /GoTo /D [284 0 R /XYZ 72.0 319.364 null] >> endobj 3460 0 obj << /Type /Annot /Subtype /Link /Rect [ 222.54 469.5 235.04 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3459 0 R /H /I >> endobj 3461 0 obj << /Type /Action /S /GoTo /D [284 0 R /XYZ 72.0 610.377 null] >> endobj 3462 0 obj << /Type /Annot /Subtype /Link /Rect [ 231.46 457.5 243.96 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3461 0 R /H /I >> endobj 3463 0 obj << /Type /Action /S /GoTo /D [290 0 R /XYZ 72.0 436.0 null] >> endobj 3464 0 obj << /Type /Annot /Subtype /Link /Rect [ 257.01 445.5 269.51 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3463 0 R /H /I >> endobj 3465 0 obj << /Type /Action /S /GoTo /D [326 0 R /XYZ 72.0 644.914 null] >> endobj 3466 0 obj << /Type /Annot /Subtype /Link /Rect [ 189.78 433.5 202.28 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3465 0 R /H /I >> endobj 3467 0 obj << /Type /Action /S /GoTo /D [326 0 R /XYZ 72.0 295.541 null] >> endobj 3468 0 obj << /Type /Annot /Subtype /Link /Rect [ 209.47 421.5 221.97 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3467 0 R /H /I >> endobj 3469 0 obj << /Type /Action /S /GoTo /D [326 0 R /XYZ 72.0 183.769 null] >> endobj 3470 0 obj << /Type /Annot /Subtype /Link /Rect [ 171.45 409.5 183.95 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3469 0 R /H /I >> endobj 3471 0 obj << /Type /Action /S /GoTo /D [329 0 R /XYZ 72.0 193.633 null] >> endobj 3472 0 obj << /Type /Annot /Subtype /Link /Rect [ 214.5 397.5 227.0 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3471 0 R /H /I >> endobj 3473 0 obj << /Type /Action /S /GoTo /D [332 0 R /XYZ 72.0 720.0 null] >> endobj 3474 0 obj << /Type /Annot /Subtype /Link /Rect [ 198.94 385.5 211.44 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3475 0 obj << /Type /Action /S /GoTo /D [326 0 R /XYZ 72.0 405.256 null] >> endobj 3476 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.0 373.5 169.5 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3475 0 R /H /I >> endobj 3477 0 obj << /Type /Action /S /GoTo /D [1401 0 R /XYZ 72.0 286.5 null] >> endobj 3478 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.5 373.5 192.0 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3477 0 R /H /I >> endobj 3479 0 obj << /Type /Action /S /GoTo /D [287 0 R /XYZ 72.0 628.212 null] >> endobj 3480 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.88 361.5 163.38 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3479 0 R /H /I >> endobj 3481 0 obj << /Type /Action /S /GoTo /D [275 0 R /XYZ 72.0 259.2 null] >> endobj 3482 0 obj << /Type /Annot /Subtype /Link /Rect [ 167.83 349.5 180.33 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3481 0 R /H /I >> endobj 3483 0 obj << /Type /Action /S /GoTo /D [1350 0 R /XYZ 72.0 173.466 null] >> endobj 3484 0 obj << /Type /Annot /Subtype /Link /Rect [ 134.21 337.5 151.71 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3483 0 R /H /I >> endobj 3485 0 obj << /Type /Action /S /GoTo /D [977 0 R /XYZ 72.0 611.067 null] >> endobj 3486 0 obj << /Type /Annot /Subtype /Link /Rect [ 175.6 325.5 193.1 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3485 0 R /H /I >> endobj 3487 0 obj << /Type /Action /S /GoTo /D [1256 0 R /XYZ 72.0 580.5 null] >> endobj 3488 0 obj << /Type /Annot /Subtype /Link /Rect [ 136.16 313.5 153.66 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3487 0 R /H /I >> endobj 3489 0 obj << /Type /Action /S /GoTo /D [1256 0 R /XYZ 72.0 501.0 null] >> endobj 3490 0 obj << /Type /Annot /Subtype /Link /Rect [ 128.94 301.5 146.44 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3489 0 R /H /I >> endobj 3491 0 obj << /Type /Action /S /GoTo /D [1283 0 R /XYZ 72.0 170.266 null] >> endobj 3492 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.39 289.5 195.89 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3491 0 R /H /I >> endobj 3493 0 obj << /Type /Action /S /GoTo /D [719 0 R /XYZ 72.0 662.46 null] >> endobj 3494 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.33 277.5 177.83 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3493 0 R /H /I >> endobj 3495 0 obj << /Type /Action /S /GoTo /D [1244 0 R /XYZ 72.0 674.181 null] >> endobj 3496 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.6 265.5 178.1 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3495 0 R /H /I >> endobj 3497 0 obj << /Type /Action /S /GoTo /D [1244 0 R /XYZ 72.0 596.724 null] >> endobj 3498 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.95 253.5 161.45 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3497 0 R /H /I >> endobj 3499 0 obj << /Type /Action /S /GoTo /D [302 0 R /XYZ 72.0 189.712 null] >> endobj 3500 0 obj << /Type /Annot /Subtype /Link /Rect [ 119.79 241.5 132.29 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3499 0 R /H /I >> endobj 3501 0 obj << /Type /Action /S /GoTo /D [939 0 R /XYZ 72.0 316.433 null] >> endobj 3502 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.73 229.5 169.23 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3501 0 R /H /I >> endobj 3503 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 542.224 null] >> endobj 3504 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.45 217.5 163.95 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3503 0 R /H /I >> endobj 3505 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 485.78 null] >> endobj 3506 0 obj << /Type /Annot /Subtype /Link /Rect [ 218.65 205.5 231.15 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3505 0 R /H /I >> endobj 3507 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 441.336 null] >> endobj 3508 0 obj << /Type /Annot /Subtype /Link /Rect [ 153.67 193.5 166.17 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3509 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 384.892 null] >> endobj 3510 0 obj << /Type /Annot /Subtype /Link /Rect [ 132.01 181.5 144.51 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 3511 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 328.448 null] >> endobj 3512 0 obj << /Type /Annot /Subtype /Link /Rect [ 133.66 169.5 146.16 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3511 0 R /H /I >> endobj 3513 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 284.004 null] >> endobj 3514 0 obj << /Type /Annot /Subtype /Link /Rect [ 184.78 157.5 197.28 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3513 0 R /H /I >> endobj 3515 0 obj << /Type /Action /S /GoTo /D [942 0 R /XYZ 72.0 629.714 null] >> endobj 3516 0 obj << /Type /Annot /Subtype /Link /Rect [ 210.01 145.5 227.51 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3515 0 R /H /I >> endobj 3517 0 obj << /Type /Action /S /GoTo /D [643 0 R /XYZ 72.0 443.534 null] >> endobj 3518 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.06 133.5 195.56 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3517 0 R /H /I >> endobj 3519 0 obj << /Type /Action /S /GoTo /D [356 0 R /XYZ 72.0 511.2 null] >> endobj 3520 0 obj << /Type /Annot /Subtype /Link /Rect [ 179.2 121.5 191.7 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3519 0 R /H /I >> endobj 3521 0 obj << /Type /Action /S /GoTo /D [936 0 R /XYZ 72.0 203.28 null] >> endobj 3522 0 obj << /Type /Annot /Subtype /Link /Rect [ 149.22 109.5 166.72 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3521 0 R /H /I >> endobj 3523 0 obj << /Type /Action /S /GoTo /D [1256 0 R /XYZ 72.0 433.5 null] >> endobj 3524 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.39 97.5 155.89 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3523 0 R /H /I >> endobj 3525 0 obj << /Type /Action /S /GoTo /D [275 0 R /XYZ 72.0 381.6 null] >> endobj 3526 0 obj << /Type /Annot /Subtype /Link /Rect [ 181.72 85.5 194.22 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3525 0 R /H /I >> endobj 3527 0 obj << /Type /Action /S /GoTo /D [1224 0 R /XYZ 72.0 696.0 null] >> endobj 3528 0 obj << /Type /Annot /Subtype /Link /Rect [ 169.21 73.5 186.71 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3527 0 R /H /I >> endobj 3529 0 obj << /Type /Action /S /GoTo /D [1244 0 R /XYZ 72.0 531.267 null] >> endobj 3530 0 obj << /Type /Annot /Subtype /Link /Rect [ 390.62 709.5 408.12 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3529 0 R /H /I >> endobj 3531 0 obj << /Type /Action /S /GoTo /D [1244 0 R /XYZ 72.0 453.81 null] >> endobj 3532 0 obj << /Type /Annot /Subtype /Link /Rect [ 408.39 697.5 425.89 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3531 0 R /H /I >> endobj 3533 0 obj << /Type /Action /S /GoTo /D [1262 0 R /XYZ 72.0 159.168 null] >> endobj 3534 0 obj << /Type /Annot /Subtype /Link /Rect [ 397.83 685.5 415.33 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3533 0 R /H /I >> endobj 3535 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 138.144 null] >> endobj 3536 0 obj << /Type /Annot /Subtype /Link /Rect [ 464.22 673.5 476.72 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3535 0 R /H /I >> endobj 3537 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 94.056 null] >> endobj 3538 0 obj << /Type /Annot /Subtype /Link /Rect [ 418.67 661.5 431.17 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3537 0 R /H /I >> endobj 3539 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 696.0 null] >> endobj 3540 0 obj << /Type /Annot /Subtype /Link /Rect [ 500.33 649.5 512.83 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3539 0 R /H /I >> endobj 3541 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 639.694 null] >> endobj 3542 0 obj << /Type /Annot /Subtype /Link /Rect [ 410.34 637.5 422.84 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3541 0 R /H /I >> endobj 3543 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 595.388 null] >> endobj 3544 0 obj << /Type /Annot /Subtype /Link /Rect [ 418.12 625.5 430.62 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3543 0 R /H /I >> endobj 3545 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 551.082 null] >> endobj 3546 0 obj << /Type /Annot /Subtype /Link /Rect [ 490.34 613.5 502.84 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3545 0 R /H /I >> endobj 3547 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 506.776 null] >> endobj 3548 0 obj << /Type /Annot /Subtype /Link /Rect [ 450.36 601.5 462.86 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3547 0 R /H /I >> endobj 3549 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 450.47 null] >> endobj 3550 0 obj << /Type /Annot /Subtype /Link /Rect [ 415.88 589.5 428.38 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3549 0 R /H /I >> endobj 3551 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 406.164 null] >> endobj 3552 0 obj << /Type /Annot /Subtype /Link /Rect [ 433.12 577.5 445.62 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3551 0 R /H /I >> endobj 3553 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 361.858 null] >> endobj 3554 0 obj << /Type /Annot /Subtype /Link /Rect [ 469.79 565.5 482.29 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3553 0 R /H /I >> endobj 3555 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 317.552 null] >> endobj 3556 0 obj << /Type /Annot /Subtype /Link /Rect [ 426.46 553.5 438.96 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3555 0 R /H /I >> endobj 3557 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 273.246 null] >> endobj 3558 0 obj << /Type /Annot /Subtype /Link /Rect [ 420.35 541.5 432.85 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3557 0 R /H /I >> endobj 3559 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 204.94 null] >> endobj 3560 0 obj << /Type /Annot /Subtype /Link /Rect [ 408.68 529.5 421.18 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3559 0 R /H /I >> endobj 3561 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 160.634 null] >> endobj 3562 0 obj << /Type /Annot /Subtype /Link /Rect [ 419.23 517.5 431.73 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3561 0 R /H /I >> endobj 3563 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 138.481 null] >> endobj 3564 0 obj << /Type /Annot /Subtype /Link /Rect [ 425.34 505.5 437.84 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3563 0 R /H /I >> endobj 3565 0 obj << /Type /Action /S /GoTo /D [1584 0 R /XYZ 72.0 94.175 null] >> endobj 3566 0 obj << /Type /Annot /Subtype /Link /Rect [ 407.57 493.5 420.07 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3565 0 R /H /I >> endobj 3567 0 obj << /Type /Action /S /GoTo /D [386 0 R /XYZ 72.0 708.0 null] >> endobj 3568 0 obj << /Type /Annot /Subtype /Link /Rect [ 399.23 481.5 411.73 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3567 0 R /H /I >> endobj 3569 0 obj << /Type /Action /S /GoTo /D [386 0 R /XYZ 72.0 664.0 null] >> endobj 3570 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.23 469.5 436.73 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3569 0 R /H /I >> endobj 3571 0 obj << /Type /Action /S /GoTo /D [386 0 R /XYZ 72.0 620.0 null] >> endobj 3572 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.78 457.5 437.28 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3571 0 R /H /I >> endobj 3573 0 obj << /Type /Action /S /GoTo /D [386 0 R /XYZ 72.0 576.0 null] >> endobj 3574 0 obj << /Type /Annot /Subtype /Link /Rect [ 409.78 445.5 422.28 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3573 0 R /H /I >> endobj 3575 0 obj << /Type /Action /S /GoTo /D [386 0 R /XYZ 72.0 532.0 null] >> endobj 3576 0 obj << /Type /Annot /Subtype /Link /Rect [ 387.56 433.5 400.06 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3575 0 R /H /I >> endobj 3577 0 obj << /Type /Action /S /GoTo /D [1303 0 R /XYZ 72.0 676.284 null] >> endobj 3578 0 obj << /Type /Annot /Subtype /Link /Rect [ 422.84 421.5 440.34 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3577 0 R /H /I >> endobj 3579 0 obj << /Type /Action /S /GoTo /D [386 0 R /XYZ 72.0 488.0 null] >> endobj 3580 0 obj << /Type /Annot /Subtype /Link /Rect [ 392.57 409.5 405.07 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3579 0 R /H /I >> endobj 3581 0 obj << /Type /Action /S /GoTo /D [386 0 R /XYZ 72.0 444.0 null] >> endobj 3582 0 obj << /Type /Annot /Subtype /Link /Rect [ 453.67 397.5 466.17 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3581 0 R /H /I >> endobj 3583 0 obj << /Type /Action /S /GoTo /D [1262 0 R /XYZ 72.0 93.792 null] >> endobj 3584 0 obj << /Type /Annot /Subtype /Link /Rect [ 428.95 385.5 446.45 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3583 0 R /H /I >> endobj 3585 0 obj << /Type /Action /S /GoTo /D [583 0 R /XYZ 72.0 71.988 null] >> endobj 3586 0 obj << /Type /Annot /Subtype /Link /Rect [ 363.4 373.5 375.9 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3585 0 R /H /I >> endobj 3587 0 obj << /Type /Action /S /GoTo /D [698 0 R /XYZ 72.0 431.904 null] >> endobj 3588 0 obj << /Type /Annot /Subtype /Link /Rect [ 349.22 332.22 366.72 341.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3587 0 R /H /I >> endobj 3589 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 217.338 null] >> endobj 3590 0 obj << /Type /Annot /Subtype /Link /Rect [ 423.11 320.22 435.61 329.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3589 0 R /H /I >> endobj 3591 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 160.894 null] >> endobj 3592 0 obj << /Type /Annot /Subtype /Link /Rect [ 411.44 308.22 423.94 317.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3591 0 R /H /I >> endobj 3593 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 261.782 null] >> endobj 3594 0 obj << /Type /Annot /Subtype /Link /Rect [ 354.78 296.22 367.28 305.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3593 0 R /H /I >> endobj 3595 0 obj << /Type /Action /S /GoTo /D [1256 0 R /XYZ 72.0 366.0 null] >> endobj 3596 0 obj << /Type /Annot /Subtype /Link /Rect [ 373.38 284.22 390.88 293.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3595 0 R /H /I >> endobj 3597 0 obj << /Type /Action /S /GoTo /D [1271 0 R /XYZ 72.0 357.44 null] >> endobj 3598 0 obj << /Type /Annot /Subtype /Link /Rect [ 432.27 272.22 449.77 281.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3597 0 R /H /I >> endobj 3599 0 obj << /Type /Action /S /GoTo /D [1271 0 R /XYZ 72.0 301.6 null] >> endobj 3600 0 obj << /Type /Annot /Subtype /Link /Rect [ 432.28 260.22 449.78 269.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3599 0 R /H /I >> endobj 3601 0 obj << /Type /Action /S /GoTo /D [1277 0 R /XYZ 72.0 415.128 null] >> endobj 3602 0 obj << /Type /Annot /Subtype /Link /Rect [ 410.61 248.22 428.11 257.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3601 0 R /H /I >> endobj 3603 0 obj << /Type /Action /S /GoTo /D [70 0 R /XYZ 72.0 94.704 null] >> endobj 3604 0 obj << /Type /Annot /Subtype /Link /Rect [ 361.16 236.22 373.66 245.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3603 0 R /H /I >> endobj 3605 0 obj << /Type /Action /S /GoTo /D [1259 0 R /XYZ 72.0 246.471 null] >> endobj 3606 0 obj << /Type /Annot /Subtype /Link /Rect [ 403.93 224.22 421.43 233.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3605 0 R /H /I >> endobj 3607 0 obj << /Type /Action /S /GoTo /D [1277 0 R /XYZ 72.0 190.274 null] >> endobj 3608 0 obj << /Type /Annot /Subtype /Link /Rect [ 398.94 212.22 416.44 221.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3607 0 R /H /I >> endobj 3609 0 obj << /Type /Action /S /GoTo /D [1280 0 R /XYZ 72.0 612.776 null] >> endobj 3610 0 obj << /Type /Annot /Subtype /Link /Rect [ 397.82 200.22 415.32 209.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3609 0 R /H /I >> endobj 3611 0 obj << /Type /Action /S /GoTo /D [1256 0 R /XYZ 72.0 298.5 null] >> endobj 3612 0 obj << /Type /Annot /Subtype /Link /Rect [ 413.94 188.22 431.44 197.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3611 0 R /H /I >> endobj 3613 0 obj << /Type /Action /S /GoTo /D [1280 0 R /XYZ 72.0 535.604 null] >> endobj 3614 0 obj << /Type /Annot /Subtype /Link /Rect [ 428.94 176.22 446.44 185.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3613 0 R /H /I >> endobj 3615 0 obj << /Type /Action /S /GoTo /D [1265 0 R /XYZ 72.0 685.728 null] >> endobj 3616 0 obj << /Type /Annot /Subtype /Link /Rect [ 387.82 164.22 405.32 173.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3615 0 R /H /I >> endobj 3617 0 obj << /Type /Action /S /GoTo /D [1306 0 R /XYZ 72.0 196.188 null] >> endobj 3618 0 obj << /Type /Annot /Subtype /Link /Rect [ 475.6 152.22 493.1 161.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3617 0 R /H /I >> endobj 3619 0 obj << /Type /Action /S /GoTo /D [1306 0 R /XYZ 72.0 378.792 null] >> endobj 3620 0 obj << /Type /Annot /Subtype /Link /Rect [ 438.93 140.22 456.43 149.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3619 0 R /H /I >> endobj 3621 0 obj << /Type /Action /S /GoTo /D [1306 0 R /XYZ 72.0 458.094 null] >> endobj 3622 0 obj << /Type /Annot /Subtype /Link /Rect [ 449.49 128.22 466.99 137.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3621 0 R /H /I >> endobj 3623 0 obj << /Type /Action /S /GoTo /D [275 0 R /XYZ 72.0 148.8 null] >> endobj 3624 0 obj << /Type /Annot /Subtype /Link /Rect [ 420.58 116.22 433.08 125.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3623 0 R /H /I >> endobj 3625 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 116.45 null] >> endobj 3626 0 obj << /Type /Annot /Subtype /Link /Rect [ 392.55 104.22 405.05 113.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3625 0 R /H /I >> endobj 3627 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 663.912 null] >> endobj 3628 0 obj << /Type /Annot /Subtype /Link /Rect [ 446.99 92.22 459.49 101.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3627 0 R /H /I >> endobj 3629 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 619.824 null] >> endobj 3630 0 obj << /Type /Annot /Subtype /Link /Rect [ 447.54 80.22 460.04 89.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3629 0 R /H /I >> endobj 3631 0 obj << /Length 3632 0 R /Filter /FlateDecode >> stream xœÍ[]sã¸|÷¯àc’Êr‚ÁGZ¢mæ$ÑKRçõ^]¹­öÎUk{Oöæ.ÿ>‰2!õ@R^.Ù²-÷€­Á`0ƒ†~;“‘ ¿ïÜ—,O¢ÅãÙoýk2Ê’H™þ%m"™ÅFØè1ê°ÚF_pç[é¿UëW{ôæ‡_£›³§3]žýô3>G"ÖÑïgß Óž} ‡k+có<ï¹&±´Ö=Bņ¾Y/ÿøëÏQ÷³²ëßÜÆÒ…OBÿ²xC;¿Ð©Øý_o¯¯Òÿ4V›×è•8Ñô.ܯ¾öSÚu¿Ø~«×.Ú| º¤Ê3ÞŸ µ¯þ̇‡ç"s†RÄvg”žûw#ëOöL¤{vøý ¨²‹.ªIÙF£btUFmõ©ü{´y{;!™§.$s # 8Ó8Iä\D‰r—Mq |rï ` `3pp’$ÀG%±¢)Òª}>“úfrò‡$a$Ú£÷ÈA4GÉØ ¥YU£?’8qþ–I‚¦Nã,æÈXqˆLÀ?š²|oöŒ3Uœ$ åáæãך! ÁÀ^¬˜£#E8|ÛQS]Óu3-:\W´:´{VšdÌ0×±ù•%e8ºošª+) MŠ[d–$qêê¡Ìf„§q†³^Köƒïeù}ùþ´x}x~Š^¾-_÷î'&!é˜ö|úC¹Gâò—Ã¥0H/徺œÕM9*Z&Ƽ”€Æó^J@tŠûˆÔ\ÐW³ª«Š …ÙU9-þÆîmÂí6͘!®b†ç -ÃÅþ´øØÔ7-&*—”Ñ\ÉËù$ã‚»¾.›¢«ê>ß®ŸV09ÜÐ6HÀr‰úºhÛ›ºãÛÏãÌ¡µ)£ÑdÞ’óJLX’ºú,sûAf™!°  ö- ט@ê_B´VËûÏï~_=¼.£o«çoËÕë¿™*‹Ó¬¯fq0„çq†3•°A‚m=oFLíë­<4皃< ç(%ÜZð)EWe1.&µR¹ÉØ#ŽCiŒ{¥¸¸ß¡òüôîù˦¾tÙÌUÙiÊ ƒpçÔ Ü`:Si8à»Ûk¦~ÓŒ [@ f)çqL›°@¦ÞeP\Á¯4»¢ªi}ªgø¶3[·d³D3¶ðþi? £™]Evý4Ŭ¥ŒÍí%~ëˆÖ‡zGD+¬ë•…Õs5ïÆõ 21T€­‹ga3@S_FÓ@H%‡ÕCý…«æ»¢+§T)1ñâèhp3”ÿ§}b¬"õÖ—¡“ÒXº½RÃØ25Œ £¥Å+•ÏÕ:“¹«,¬QŒ) )«„Ñ,â¹nº»¢iŠÛ0+7ou$Áµ«6 —9®³4ݸ—çÕën}}xyåúÖ·„£`k4¬NDKÅxLC”×óÙ¸üvQz r4gZiFË,CJbüº ½*H(óöh4fNØÒ0š%”A_—£ê¢•”*²¼?É@3p*ÈÂhÍÄ‘…øî™D³bÊl^K‹¶‡ZZDK¦nÕÒõ‡ÉÝEYts*«9:o®GSf7ËÃè K/Ý÷—’2ýÀ¦š^OÖézÝÝU³ <¢•)e¾t³¢qDç± ¢9b}·¹KŒ‚ú‡â’q½qcÜ’‘c h—âƒhŽMßoî³i:¤BíÕºñ±Ô¾£³%ë0š£Òw—»TÚêS5C]ú>³I<š1<´ó!šãbDËÝuS¯Oe™,z0ázèÁÎÑʘ ŽÆEWD÷‹Åòå%Züz¿º_¼.W´<,˜&ÌÍ+ކÁ-†æáÔ¤ EË„wôX=.‰µŠ_–«åÓbÉî¼ÂÍi¦ 3 ·óê0\ ,¸uλëXËÏßWËèåõþuù¸|ÂWŠ,–ù6ÿÀ0Ïc†g˜Ì`‚?Z=}xZFÿ|þŒ u–yR˜sÙ?Œ–L?`\Mw ¼ô '´´W7!š«çŒ‚àï(OìPÜD oàp†3=ŠI÷ïåuõðôKô¯û¯ß—Ñòo+Z–œ»¨ï|kYpæ¤" £å¶e);O‡OR÷uñxº??o»æ@måÉmÇÔwë ËûX®®Bñ}M†òm˜Onü£ñcò»õOÆO`„òûmK©ö@íiý~øíRÁô Ó7 ê=ïÎKòS}SÝyýEÅ&i/¬ÊñR{²3 3lŽQ•ß[_äàK,a¼ªæ¸(Ÿ{UÍ>š!„š|O¨žÌ§³»¶ü0/g£ònÞRÉÅðzæG5zé·Y€¶˜VQ£÷ÉaQ±>6ÙÞÂ:&ÿH!¼;[ûh† êó[6SW&35ŽøoúÛ(€fø0ý–ÐlV®“¼«¿®Ë¦«¸ ,ó¼u‚Jo=w!œã‡"}ϯ©Û¶—͘“fWx)³U‘‹ôTxÙ0œ#RyO¬r |`ªá@ñeÞ 'Šç8¡0¿átÝTÓ¢¹ý¡¼e¦0ñvŽãê¼LÔaçX¡<¿eUÊ15«¡¥(5uô¶ÃN詤OÂpŽJô{Ô¸¦#SÝ—Ç{LyΑBéþTpº 3ÝÞN8ªâKwµ1 çH¡œ¿!µQd™4J;Žu JÉ}*·dÍðaýžO¿Ùp>ʆ#–ãÊþº” Ã9N(ío9­ÕN>)H5dÐ4}©‡ ŠpŽJú;¬˜©Ó±î»©”}Ú/EÍBeCh­@±7S†i;*î[ÖÍ´9Œ¸ïÑqzð0p:.êSÊÈÂpŽŠú=©òcðÓÎiÈ R¾‚pŽJù=)rܹ¯‘—î…¯‘œc„Òý†Ñ|Ì”R™0Ž+öTÙˆ0š#ƒ‚}O¦-4yë\ü¶¢ëô;ùà2רX¡P?cÖ›–ÿq‘Þªaù#šq£ÑoØüHd(‹Ô;™=E¨÷ŽfÎCÅžˆUSj÷Šéõ¡ ôn ×KÿÀ¹N”ìoÛÈÍw+k}™Sju‚v®Uœ‡Ñ¶?}¡ÜÇÒ½Ó åV¨Ì×76ÝÏœ}(jÖpçÇJ÷h—Æà (ï” mí7!Zr—òŒãáúj닊íÁ¤w%à–¨ ÙsæÔ_2¤¨nÿ±š”œN‘{·>М¿J„s”¨-`(!‘ÔÛuÐÐÞ¦ƒhއRÀãæîn%º€c hw+1ˆfEîÂx›!Šñø@’p÷¿\:2&eA8y5 —OFS ½e6®..ŽP{›…¥†³Ô „÷ñ´êŽà\†áÒ2‘e!—ѧç'ÔJœè¸•¿ÐŽIÂ&Œ–ŒÈC“ƒÜ¥¤þ¡­ú– íMù;Œ–––Dz}箓8õ.®¡9S©§a47cZBˆ×wLj{!‰1çΈÃhi™³ØB»¾›Í§çK>?ãO=OœKS:…Ø®ïN®e¶‚AøZ&g¦!Ôëñ¡ B™?ƒ`ÌTí*Œ––) Äù p¹² kêÉ÷Ñ€íh^7&–A´Ì1wê bÞ£WÜrÌ!p„Ó\:‘&1–³Ü,¿ÇÍ}úí;w=Ù:Í™žÇyα3b?_W÷O/÷›Qí ÷/쉚¶[†âJD†sJ¦„…àœ7 }>‡º2íæRhÆ”ëÊÂh¦Ì2 ®‚êò²l¶"N@»Qé0-8ÆÁIG8'-) ÿ ¯¦žwÕ,(*)=|ìaïi„áÙ ÷n>|ýÅ9ð endstream endobj 3420 0 obj [ 3419 0 R 3422 0 R 3424 0 R 3426 0 R 3428 0 R 3430 0 R 3432 0 R 3434 0 R 3436 0 R 3438 0 R 3440 0 R 3442 0 R 3444 0 R 3446 0 R 3448 0 R 3450 0 R 3452 0 R 3454 0 R 3456 0 R 3458 0 R 3460 0 R 3462 0 R 3464 0 R 3466 0 R 3468 0 R 3470 0 R 3472 0 R 3474 0 R 3476 0 R 3478 0 R 3480 0 R 3482 0 R 3484 0 R 3486 0 R 3488 0 R 3490 0 R 3492 0 R 3494 0 R 3496 0 R 3498 0 R 3500 0 R 3502 0 R 3504 0 R 3506 0 R 3508 0 R 3510 0 R 3512 0 R 3514 0 R 3516 0 R 3518 0 R 3520 0 R 3522 0 R 3524 0 R 3526 0 R 3528 0 R 3530 0 R 3532 0 R 3534 0 R 3536 0 R 3538 0 R 3540 0 R 3542 0 R 3544 0 R 3546 0 R 3548 0 R 3550 0 R 3552 0 R 3554 0 R 3556 0 R 3558 0 R 3560 0 R 3562 0 R 3564 0 R 3566 0 R 3568 0 R 3570 0 R 3572 0 R 3574 0 R 3576 0 R 3578 0 R 3580 0 R 3582 0 R 3584 0 R 3586 0 R 3588 0 R 3590 0 R 3592 0 R 3594 0 R 3596 0 R 3598 0 R 3600 0 R 3602 0 R 3604 0 R 3606 0 R 3608 0 R 3610 0 R 3612 0 R 3614 0 R 3616 0 R 3618 0 R 3620 0 R 3622 0 R 3624 0 R 3626 0 R 3628 0 R 3630 0 R ] endobj 3417 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 3420 0 R /Contents 3631 0 R >> endobj 3632 0 obj 3154 endobj 3634 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 575.736 null] >> endobj 3635 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.88 709.5 228.38 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3634 0 R /H /I >> endobj 3637 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 531.648 null] >> endobj 3638 0 obj << /Type /Annot /Subtype /Link /Rect [ 195.88 697.5 208.38 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3637 0 R /H /I >> endobj 3639 0 obj << /Type /Action /S /GoTo /D [380 0 R /XYZ 72.0 94.228 null] >> endobj 3640 0 obj << /Type /Annot /Subtype /Link /Rect [ 231.99 685.5 244.49 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3639 0 R /H /I >> endobj 3641 0 obj << /Type /Action /S /GoTo /D [1034 0 R /XYZ 72.0 571.08 null] >> endobj 3642 0 obj << /Type /Annot /Subtype /Link /Rect [ 216.99 673.5 234.49 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3641 0 R /H /I >> endobj 3643 0 obj << /Type /Action /S /GoTo /D [1034 0 R /XYZ 72.0 116.472 null] >> endobj 3644 0 obj << /Type /Annot /Subtype /Link /Rect [ 216.43 661.5 233.93 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3643 0 R /H /I >> endobj 3645 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 708.0 null] >> endobj 3646 0 obj << /Type /Annot /Subtype /Link /Rect [ 125.89 649.5 138.39 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3645 0 R /H /I >> endobj 3647 0 obj << /Type /Action /S /GoTo /D [1283 0 R /XYZ 72.0 93.934 null] >> endobj 3648 0 obj << /Type /Annot /Subtype /Link /Rect [ 177.83 637.5 195.33 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3647 0 R /H /I >> endobj 3649 0 obj << /Type /Action /S /GoTo /D [1244 0 R /XYZ 72.0 308.715 null] >> endobj 3650 0 obj << /Type /Annot /Subtype /Link /Rect [ 137.83 625.5 155.33 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3649 0 R /H /I >> endobj 3651 0 obj << /Type /Action /S /GoTo /D [1256 0 R /XYZ 72.0 117.0 null] >> endobj 3652 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.16 613.5 183.66 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3651 0 R /H /I >> endobj 3653 0 obj << /Type /Action /S /GoTo /D [886 0 R /XYZ 72.0 194.709 null] >> endobj 3654 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.5 601.5 192.0 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3653 0 R /H /I >> endobj 3655 0 obj << /Type /Action /S /GoTo /D [886 0 R /XYZ 72.0 500.141 null] >> endobj 3656 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.05 589.5 182.55 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3655 0 R /H /I >> endobj 3657 0 obj << /Type /Action /S /GoTo /D [1277 0 R /XYZ 72.0 660.0 null] >> endobj 3658 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.66 577.5 201.16 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3657 0 R /H /I >> endobj 3659 0 obj << /Type /Action /S /GoTo /D [1256 0 R /XYZ 72.0 219.0 null] >> endobj 3660 0 obj << /Type /Annot /Subtype /Link /Rect [ 181.99 565.5 199.49 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3659 0 R /H /I >> endobj 3661 0 obj << /Type /Action /S /GoTo /D [1244 0 R /XYZ 72.0 115.62 null] >> endobj 3662 0 obj << /Type /Annot /Subtype /Link /Rect [ 145.61 526.22 163.11 535.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3661 0 R /H /I >> endobj 3663 0 obj << /Type /Action /S /GoTo /D [629 0 R /XYZ 72.0 720.0 null] >> endobj 3664 0 obj << /Type /Annot /Subtype /Link /Rect [ 175.86 514.22 193.36 523.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3663 0 R /H /I >> endobj 3665 0 obj << /Type /Action /S /GoTo /D [701 0 R /XYZ 72.0 322.566 null] >> endobj 3666 0 obj << /Type /Annot /Subtype /Link /Rect [ 133.37 502.22 150.87 511.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3665 0 R /H /I >> endobj 3667 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.26 490.22 169.76 499.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3205 0 R /H /I >> endobj 3668 0 obj << /Type /Action /S /GoTo /D [672 0 R /XYZ 72.0 241.345 null] >> endobj 3669 0 obj << /Type /Annot /Subtype /Link /Rect [ 154.47 478.22 171.97 487.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3668 0 R /H /I >> endobj 3670 0 obj << /Type /Action /S /GoTo /D [1268 0 R /XYZ 72.0 324.0 null] >> endobj 3671 0 obj << /Type /Annot /Subtype /Link /Rect [ 200.6 466.22 218.1 475.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3670 0 R /H /I >> endobj 3672 0 obj << /Type /Action /S /GoTo /D [695 0 R /XYZ 72.0 405.684 null] >> endobj 3673 0 obj << /Type /Annot /Subtype /Link /Rect [ 116.44 454.22 133.94 463.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3672 0 R /H /I >> endobj 3674 0 obj << /Type /Action /S /GoTo /D [892 0 R /XYZ 72.0 485.115 null] >> endobj 3675 0 obj << /Type /Annot /Subtype /Link /Rect [ 116.44 442.22 133.94 451.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3674 0 R /H /I >> endobj 3676 0 obj << /Type /Action /S /GoTo /D [1247 0 R /XYZ 72.0 696.0 null] >> endobj 3677 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.95 430.22 161.45 439.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3676 0 R /H /I >> endobj 3678 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 487.56 null] >> endobj 3679 0 obj << /Type /Annot /Subtype /Link /Rect [ 172.55 418.22 185.05 427.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3678 0 R /H /I >> endobj 3680 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 443.472 null] >> endobj 3681 0 obj << /Type /Annot /Subtype /Link /Rect [ 185.89 406.22 198.39 415.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3680 0 R /H /I >> endobj 3682 0 obj << /Type /Action /S /GoTo /D [1300 0 R /XYZ 72.0 224.715 null] >> endobj 3683 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.39 394.22 155.89 403.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3682 0 R /H /I >> endobj 3684 0 obj << /Type /Action /S /GoTo /D [1297 0 R /XYZ 72.0 237.152 null] >> endobj 3685 0 obj << /Type /Annot /Subtype /Link /Rect [ 137.82 382.22 155.32 391.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3684 0 R /H /I >> endobj 3686 0 obj << /Type /Action /S /GoTo /D [655 0 R /XYZ 72.0 438.304 null] >> endobj 3687 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.93 342.94 161.43 351.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3686 0 R /H /I >> endobj 3688 0 obj << /Type /Action /S /GoTo /D [643 0 R /XYZ 72.0 94.502 null] >> endobj 3689 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.09 330.94 195.59 339.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3688 0 R /H /I >> endobj 3690 0 obj << /Type /Action /S /GoTo /D [646 0 R /XYZ 72.0 558.86 null] >> endobj 3691 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.26 318.94 169.76 327.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3690 0 R /H /I >> endobj 3692 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 355.296 null] >> endobj 3693 0 obj << /Type /Annot /Subtype /Link /Rect [ 189.76 306.94 202.26 315.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3692 0 R /H /I >> endobj 3694 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 311.208 null] >> endobj 3695 0 obj << /Type /Annot /Subtype /Link /Rect [ 190.31 294.94 202.81 303.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3694 0 R /H /I >> endobj 3696 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 255.12 null] >> endobj 3697 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.65 282.94 191.15 291.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3696 0 R /H /I >> endobj 3698 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 399.384 null] >> endobj 3699 0 obj << /Type /Annot /Subtype /Link /Rect [ 108.66 270.94 121.16 279.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3698 0 R /H /I >> endobj 3700 0 obj << /Type /Action /S /GoTo /D [1268 0 R /XYZ 72.0 235.2 null] >> endobj 3701 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.71 231.66 159.21 240.66 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3700 0 R /H /I >> endobj 3702 0 obj << /Type /Action /S /GoTo /D [965 0 R /XYZ 72.0 238.34 null] >> endobj 3703 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.49 219.66 191.99 228.66 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3702 0 R /H /I >> endobj 3704 0 obj << /Type /Action /S /GoTo /D [1259 0 R /XYZ 72.0 614.191 null] >> endobj 3705 0 obj << /Type /Annot /Subtype /Link /Rect [ 191.15 207.66 208.65 216.66 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3704 0 R /H /I >> endobj 3706 0 obj << /Type /Action /S /GoTo /D [1268 0 R /XYZ 72.0 158.4 null] >> endobj 3707 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.05 168.38 157.55 177.38 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3706 0 R /H /I >> endobj 3708 0 obj << /Length 3709 0 R /Filter /FlateDecode >> stream xœÍYÛrG}ç+æ1©JÆÓsÛ™G k[ Ë*—‹R!œP%@–ãü}z`%ºgóæDHµ°œî=;}¦/«o _¿§Cµ˜¯:ßês -Œ¯O9/ ^±õ‡à‚¸KÀ£· R¿5»³5zÿáOqÕYw”8ë|þ‚ [¡¤uq¾w3é|À‹;/1Æš«–Bº„‘ßÌWâÕ`¥E³C?³OŽÔξÉÈ€þ0RâÎëªóê Dõõ Áà:{cEFÇô£EµŸ™|8ƒõíâǯ_Dõ®SVõÍí-“|4þr§¡£/œUÇß4ôõrþpÿ¬4ûsxFj‡w‘¾º«CZÓÏoÝn‰öÇì’Ô®ƧÚ­Õϼx>E2%ÃQŒ‚Æò+ë'¯ dºvþ~T5œ•ãÙ¤ü0-G½r6tÏÊßÄþ¢´F† ”²¸ÕO}P0¦Š¸ˆ'h%´Êªº¯Ï³Œ42*ЦÀå ()eÑ '£¥1x ̧²?›^ö»U9ë]œO‡£ %梌MÔ A{-m]BÌÚ1‘’äBnÃrT1!´^Ä E^ …"ÄR}àˆ‰òSÙ›Vƒ‹‘¸÷Ë1K̦xh¨N\1‹æˆùÀ£¡sIäI&R+N"ÏEEi gÝñ¸{-¾>­çÛåfM×F9,µñ@Ñ  ‘®Mdd>ÌÓñ 6Ä”€dŠ‚Eµ=õPÐyFÑJðhb¼gì ÚKŸGCÊ ¨¬kN“ÞÛrØeB¦SÑ vLhM9hªàšÃ.CÒE1R¹t›éĘ ty4KÈR-#¡—(‰Û›íb»\-èâ`ssˆqCáÍð86 ”›£’>â¶~Z-–s&n˜·Ó†.‚g¼Pj˜¸óð-½zcRS`Oê0¸Ð¬¶{‹é3ž©ÚqÙÁÊCîu'-Û¢0<5&h/!涪Væõ´^Î7· ±xœßÜãán±Z¬·Ì2c’õµ%uCáiìÈÂñåît±F©ú¼»ŒhFtQ Ñ0†¸gÑ %ƒ­5!ƒ­–˜oÖÛ‡›åzK8'uºe –±'èBy´ó”’‰<¥û‡ÅírŽ[—2B­IÞZ3æF{šRrDߣÁ§Y5–ØÐ /[ $&¬y/m@B ‰†Ü+Œ¸3î™ÙI"©‰IS[ð†1"hlbòhìm)‘ÂÙõ¡íDˆQ+‚ÃÄ*„È%¶yù\2Ú4ÏFÇ4Òϣ鈱<%”&†Ùåxðqp^ž•L®Ô¡æQ{.g©<œR;á„M¿|3áQ]_r¬ ÑRÞè@)œjˆ˜'m‘óÍ [¦ß y4D*%cˆ¦§ƒ~{û q'Æ–ë?óhˆ¦µ@¬ nרzJüØR  Ê6`5Çé¤öÿýæî ËàLª¹m‘Ze€1ç¶E?]Üàÿ…&üåêæáof{x©BýŠúáÆ—‡c£MÉÅÀ’{¼_Ì—_Sâ– Gš—ÂH=0E«È£±ý¦³uzÔs„ú8(¯êI?÷õ—: õªqÎlZ«5Gj|3õ(ûtPü*u§Î38V!çX™S îXµ>±AUù”EÁÆžëÇ!ç8ÙSé%N4ÏšÄ#%†à‚N4²èg™,b \Ë"¤)a¿jI"·`ã„U·ž"®Êò}K:Œ²HA‹*0¶$ƒh©óh®÷±¸iNø¼Å‚*î6›{±\‹‡ÍÓv¹^p=~c6¢^(Ü&/ KCípçœPô«·³×ÓÞû²ji¡!*ê„î 8H–Â!èÖè;T¤Ìè]þë–ð;¥u»¶¹nH¯Ën[u‡¦„Ú’ð7:Š~ Y5ž(k›Ž»ÿ¤×?”\£w endstream endobj 3636 0 obj [ 3635 0 R 3638 0 R 3640 0 R 3642 0 R 3644 0 R 3646 0 R 3648 0 R 3650 0 R 3652 0 R 3654 0 R 3656 0 R 3658 0 R 3660 0 R 3662 0 R 3664 0 R 3666 0 R 3667 0 R 3669 0 R 3671 0 R 3673 0 R 3675 0 R 3677 0 R 3679 0 R 3681 0 R 3683 0 R 3685 0 R 3687 0 R 3689 0 R 3691 0 R 3693 0 R 3695 0 R 3697 0 R 3699 0 R 3701 0 R 3703 0 R 3705 0 R 3707 0 R ] endobj 3633 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 3636 0 R /Contents 3708 0 R >> endobj 3709 0 obj 1476 endobj 3711 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.06 656.7 162.56 665.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2643 0 R /H /I >> endobj 3713 0 obj << /Type /Annot /Subtype /Link /Rect [ 132.28 617.1 149.78 626.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2646 0 R /H /I >> endobj 3714 0 obj << /Type /Action /S /GoTo /D [2605 0 R /XYZ 72.0 356.3 null] >> endobj 3715 0 obj << /Type /Annot /Subtype /Link /Rect [ 97.0 605.1 114.5 614.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3714 0 R /H /I >> endobj 3716 0 obj << /Type /Annot /Subtype /Link /Rect [ 139.5 593.1 157.0 602.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2648 0 R /H /I >> endobj 3717 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.15 581.1 183.65 590.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2650 0 R /H /I >> endobj 3718 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.49 569.1 156.99 578.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2652 0 R /H /I >> endobj 3719 0 obj << /Type /Annot /Subtype /Link /Rect [ 197.26 557.1 209.76 566.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2654 0 R /H /I >> endobj 3720 0 obj << /Type /Annot /Subtype /Link /Rect [ 164.49 545.1 176.99 554.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2656 0 R /H /I >> endobj 3721 0 obj << /Type /Annot /Subtype /Link /Rect [ 208.09 533.1 220.59 542.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2658 0 R /H /I >> endobj 3722 0 obj << /Type /Annot /Subtype /Link /Rect [ 282.53 521.1 295.03 530.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2660 0 R /H /I >> endobj 3723 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.7 509.1 169.2 518.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2662 0 R /H /I >> endobj 3724 0 obj << /Type /Annot /Subtype /Link /Rect [ 180.58 497.1 198.08 506.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2664 0 R /H /I >> endobj 3725 0 obj << /Type /Annot /Subtype /Link /Rect [ 155.05 485.1 167.55 494.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2666 0 R /H /I >> endobj 3726 0 obj << /Type /Annot /Subtype /Link /Rect [ 200.59 473.1 213.09 482.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2668 0 R /H /I >> endobj 3727 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.89 461.1 183.39 470.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2670 0 R /H /I >> endobj 3728 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.82 449.1 165.32 458.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2672 0 R /H /I >> endobj 3729 0 obj << /Type /Annot /Subtype /Link /Rect [ 142.82 437.1 155.32 446.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2674 0 R /H /I >> endobj 3730 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.05 425.1 152.55 434.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2676 0 R /H /I >> endobj 3731 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.94 413.1 176.44 422.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2678 0 R /H /I >> endobj 3732 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.28 401.1 164.78 410.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2680 0 R /H /I >> endobj 3733 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.94 389.1 156.44 398.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2682 0 R /H /I >> endobj 3734 0 obj << /Type /Annot /Subtype /Link /Rect [ 250.88 377.1 263.38 386.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2684 0 R /H /I >> endobj 3735 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.39 365.1 215.89 374.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2686 0 R /H /I >> endobj 3736 0 obj << /Type /Annot /Subtype /Link /Rect [ 224.51 353.1 237.01 362.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2688 0 R /H /I >> endobj 3737 0 obj << /Type /Annot /Subtype /Link /Rect [ 131.16 341.1 143.66 350.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2690 0 R /H /I >> endobj 3738 0 obj << /Type /Action /S /GoTo /D [2262 0 R /XYZ 72.0 471.456 null] >> endobj 3739 0 obj << /Type /Annot /Subtype /Link /Rect [ 92.0 329.1 109.5 338.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3738 0 R /H /I >> endobj 3740 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.23 317.1 186.73 326.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2692 0 R /H /I >> endobj 3741 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.94 305.1 156.44 314.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2694 0 R /H /I >> endobj 3742 0 obj << /Type /Annot /Subtype /Link /Rect [ 136.16 293.1 153.66 302.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2696 0 R /H /I >> endobj 3743 0 obj << /Type /Annot /Subtype /Link /Rect [ 137.56 281.1 150.06 290.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2698 0 R /H /I >> endobj 3744 0 obj << /Type /Annot /Subtype /Link /Rect [ 145.6 269.1 163.1 278.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2700 0 R /H /I >> endobj 3745 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.6 257.1 158.1 266.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2702 0 R /H /I >> endobj 3746 0 obj << /Type /Annot /Subtype /Link /Rect [ 216.69 245.1 229.19 254.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2704 0 R /H /I >> endobj 3747 0 obj << /Type /Annot /Subtype /Link /Rect [ 164.76 233.1 177.26 242.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2706 0 R /H /I >> endobj 3748 0 obj << /Type /Action /S /GoTo /D [1327 0 R /XYZ 72.0 616.446 null] >> endobj 3749 0 obj << /Type /Annot /Subtype /Link /Rect [ 105.88 193.5 123.38 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3748 0 R /H /I >> endobj 3750 0 obj << /Type /Annot /Subtype /Link /Rect [ 173.39 181.5 190.89 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2708 0 R /H /I >> endobj 3751 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.92 169.5 181.42 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2710 0 R /H /I >> endobj 3752 0 obj << /Type /Annot /Subtype /Link /Rect [ 128.38 157.5 145.88 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2712 0 R /H /I >> endobj 3753 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.94 145.5 151.44 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2714 0 R /H /I >> endobj 3754 0 obj << /Type /Annot /Subtype /Link /Rect [ 173.93 133.5 191.43 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2716 0 R /H /I >> endobj 3755 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.6 121.5 168.1 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2718 0 R /H /I >> endobj 3756 0 obj << /Type /Annot /Subtype /Link /Rect [ 171.15 109.5 188.65 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2720 0 R /H /I >> endobj 3757 0 obj << /Type /Annot /Subtype /Link /Rect [ 113.39 97.5 130.89 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2722 0 R /H /I >> endobj 3758 0 obj << /Type /Annot /Subtype /Link /Rect [ 149.49 85.5 166.99 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2724 0 R /H /I >> endobj 3759 0 obj << /Type /Annot /Subtype /Link /Rect [ 142.83 73.5 160.33 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2726 0 R /H /I >> endobj 3760 0 obj << /Type /Annot /Subtype /Link /Rect [ 356.72 709.5 369.22 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2728 0 R /H /I >> endobj 3761 0 obj << /Type /Annot /Subtype /Link /Rect [ 390.05 697.5 407.55 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2730 0 R /H /I >> endobj 3762 0 obj << /Type /Annot /Subtype /Link /Rect [ 374.49 685.5 391.99 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2732 0 R /H /I >> endobj 3763 0 obj << /Type /Annot /Subtype /Link /Rect [ 388.38 673.5 400.88 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2734 0 R /H /I >> endobj 3764 0 obj << /Type /Annot /Subtype /Link /Rect [ 418.09 661.5 435.59 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2736 0 R /H /I >> endobj 3765 0 obj << /Type /Annot /Subtype /Link /Rect [ 421.15 620.22 438.65 629.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2738 0 R /H /I >> endobj 3766 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.23 608.22 436.73 617.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2740 0 R /H /I >> endobj 3767 0 obj << /Type /Annot /Subtype /Link /Rect [ 379.48 596.22 396.98 605.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2742 0 R /H /I >> endobj 3768 0 obj << /Type /Annot /Subtype /Link /Rect [ 408.38 584.22 425.88 593.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2744 0 R /H /I >> endobj 3769 0 obj << /Type /Annot /Subtype /Link /Rect [ 420.05 572.22 437.55 581.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2746 0 R /H /I >> endobj 3770 0 obj << /Type /Annot /Subtype /Link /Rect [ 342.56 560.22 360.06 569.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2748 0 R /H /I >> endobj 3771 0 obj << /Type /Annot /Subtype /Link /Rect [ 375.05 548.22 392.55 557.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2750 0 R /H /I >> endobj 3772 0 obj << /Type /Annot /Subtype /Link /Rect [ 445.86 536.22 458.36 545.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2752 0 R /H /I >> endobj 3773 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.77 524.22 407.27 533.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2754 0 R /H /I >> endobj 3774 0 obj << /Type /Annot /Subtype /Link /Rect [ 422.55 512.22 440.05 521.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2754 0 R /H /I >> endobj 3775 0 obj << /Type /Annot /Subtype /Link /Rect [ 405.9 500.22 418.4 509.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2757 0 R /H /I >> endobj 3776 0 obj << /Type /Annot /Subtype /Link /Rect [ 379.47 488.22 396.97 497.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2759 0 R /H /I >> endobj 3777 0 obj << /Type /Annot /Subtype /Link /Rect [ 401.17 476.22 413.67 485.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2761 0 R /H /I >> endobj 3778 0 obj << /Type /Annot /Subtype /Link /Rect [ 413.63 464.22 431.13 473.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2763 0 R /H /I >> endobj 3779 0 obj << /Type /Annot /Subtype /Link /Rect [ 380.61 452.22 398.11 461.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2765 0 R /H /I >> endobj 3780 0 obj << /Type /Annot /Subtype /Link /Rect [ 506.43 440.22 518.93 449.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2767 0 R /H /I >> endobj 3781 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.78 428.22 437.28 437.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2769 0 R /H /I >> endobj 3782 0 obj << /Type /Annot /Subtype /Link /Rect [ 392.83 416.22 405.33 425.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2771 0 R /H /I >> endobj 3783 0 obj << /Type /Annot /Subtype /Link /Rect [ 380.33 404.22 397.83 413.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2773 0 R /H /I >> endobj 3784 0 obj << /Type /Annot /Subtype /Link /Rect [ 413.94 392.22 431.44 401.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2775 0 R /H /I >> endobj 3785 0 obj << /Type /Annot /Subtype /Link /Rect [ 404.5 380.22 422.0 389.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2777 0 R /H /I >> endobj 3786 0 obj << /Type /Annot /Subtype /Link /Rect [ 362.55 368.22 380.05 377.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2779 0 R /H /I >> endobj 3787 0 obj << /Type /Annot /Subtype /Link /Rect [ 379.77 356.22 392.27 365.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2781 0 R /H /I >> endobj 3788 0 obj << /Type /Annot /Subtype /Link /Rect [ 446.99 344.22 459.49 353.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2783 0 R /H /I >> endobj 3789 0 obj << /Type /Annot /Subtype /Link /Rect [ 444.76 332.22 457.26 341.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2785 0 R /H /I >> endobj 3790 0 obj << /Type /Annot /Subtype /Link /Rect [ 422.55 320.22 435.05 329.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2787 0 R /H /I >> endobj 3791 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.21 308.22 436.71 317.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2789 0 R /H /I >> endobj 3792 0 obj << /Type /Annot /Subtype /Link /Rect [ 388.39 296.22 400.89 305.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2791 0 R /H /I >> endobj 3793 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.89 284.22 403.39 293.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2793 0 R /H /I >> endobj 3794 0 obj << /Type /Annot /Subtype /Link /Rect [ 386.69 272.22 404.19 281.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2795 0 R /H /I >> endobj 3795 0 obj << /Type /Annot /Subtype /Link /Rect [ 365.89 260.22 378.39 269.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2797 0 R /H /I >> endobj 3796 0 obj << /Type /Annot /Subtype /Link /Rect [ 368.11 248.22 380.61 257.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2799 0 R /H /I >> endobj 3797 0 obj << /Type /Annot /Subtype /Link /Rect [ 358.11 236.22 370.61 245.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2801 0 R /H /I >> endobj 3798 0 obj << /Type /Annot /Subtype /Link /Rect [ 402.81 224.22 420.31 233.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2803 0 R /H /I >> endobj 3799 0 obj << /Type /Annot /Subtype /Link /Rect [ 393.94 212.22 411.44 221.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2805 0 R /H /I >> endobj 3800 0 obj << /Type /Annot /Subtype /Link /Rect [ 380.33 200.22 397.83 209.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2807 0 R /H /I >> endobj 3801 0 obj << /Type /Annot /Subtype /Link /Rect [ 466.99 188.22 479.49 197.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2809 0 R /H /I >> endobj 3802 0 obj << /Type /Annot /Subtype /Link /Rect [ 455.88 176.22 468.38 185.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2811 0 R /H /I >> endobj 3803 0 obj << /Type /Annot /Subtype /Link /Rect [ 450.87 164.22 463.37 173.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2813 0 R /H /I >> endobj 3804 0 obj << /Type /Annot /Subtype /Link /Rect [ 481.13 152.22 493.63 161.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2815 0 R /H /I >> endobj 3805 0 obj << /Type /Annot /Subtype /Link /Rect [ 468.92 140.22 486.42 149.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2817 0 R /H /I >> endobj 3806 0 obj << /Type /Annot /Subtype /Link /Rect [ 400.05 128.22 417.55 137.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2819 0 R /H /I >> endobj 3807 0 obj << /Type /Annot /Subtype /Link /Rect [ 372.28 116.22 389.78 125.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2821 0 R /H /I >> endobj 3808 0 obj << /Type /Annot /Subtype /Link /Rect [ 372.83 104.22 390.33 113.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2823 0 R /H /I >> endobj 3809 0 obj << /Type /Annot /Subtype /Link /Rect [ 431.17 92.22 443.67 101.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2825 0 R /H /I >> endobj 3810 0 obj << /Type /Annot /Subtype /Link /Rect [ 472.54 80.22 490.04 89.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2827 0 R /H /I >> endobj 3811 0 obj << /Length 3812 0 R /Filter /FlateDecode >> stream xœÍ[]“ÚF}Ÿ_¡Ç¤jWQK Ècmp@Ç›¤¦0ƒjÆa˜Äþ÷¹-4:·åÚ—ìÚN`˜s¯ŽºoßOñû•H2úûOÿâ ™,¯~o?‰“‰²íGÆ&Â¥6˓Ǥý!7y²ñÀ‹·Ò¾Uͧ-úðÃoÉÛ«íU–Ü\ýü+’,5ÉŸW(?¨™_ý@76U6/Š¢å*S‘çþ*µôfù˜|W=ÊdôÔ ì½¢ìÎ>d¤„ü¿`ä95{Þ캤.m¶þâFg—¿ ÌâôùùSúO§êð}’JC÷¿Ú´;Ѿú_ßšæÎ¯Ñ;iUÂÝumnñï¼x–|¼º®¯¾{e‘%õ‡ó)r^Pdi. ÿG&õcòó7*“ßþšÔÿº*k0ˆ¿yÕ`#ýµ³ƒ¾LV$»öÞT"ÅŽ5FUX“e™0‡»YmW»Å&©¶«Ï‡[ôkã…é¾tG\“a«‚ÄÝAzþåñýÓæù Ç,f–X‘ å¯w¹Ÿ¿›×åm2›ŽË$ÉóâçifhÕÝ4HvÁ9ÝpœçGRìä.ÕþFh“øAÏ=ˆ,K׮șÐ×óäÃËv¹_?má&,m—#^¹ËQ@ËÔÅÑÂå<Ñ!÷Ù¡3 ²È¥Lš ¯*5\uÚ· j‚ç4³w­lêü™4N¯_WÓÉ}5Š“(t*Ö®€¶©£éh!)wIFÉp:¾» qËTûèrËZ§Em™ "»»-’åÓæåq›¬VÛýzÿ%ùØœ÷ýÓè iRiéö¥ÐŒ2„»ÔÅáV"AZn±&óz6¨&5î^¸` ÌìuGs –k†ÏhzKdúhyÓÈü•¬ÒŒ„穉íFb˜úè¶šTžÐõ¸¼÷®ó~pW¿žÎªü!˜ãñ§fäѯ€B„«4‹Ã’2ëÚäâãÇÝêãb¿ŠŸGW¤ÖGU[F8xJãh!ð'?ΙÎ)—DYÆaº8Z¡W’7äÚÇ4pm@’I`tÍÄc¥y;¾›ÓÿÒ4¥EªÉ¨«ºŒ“ùðuy;@¯äüѧ«ê;]Âd¡`T!ܤY^0ûëxÛÿc½úؘ‚2wó¹aÁ‹ÊÜ£hÆgª »Ç$Šˆ–Ék…¿y3®†§¬ó8‘ÉT‹#”GxPK!œÉã´ƒž«ª§°³g/€Â€.Î^ÑÂáÖh V<§„<·j<_‡(kY†½£¹ÂS+0Û9(>í¶æÜ“@A6øEÑÜfi0Ûz0‘= ·JçB;FÐTØÄÑìâX°h"Ô³YyÀd™€“ÅÑ,ÖÖII5*'uõª*gxÒ()µÅÑTAÂU'Q8wús0ìþÎ'8Ç …”ïˆ>S¤f|AãbB·=˜ëž†˜¡ƒ£¼z—µêß/–ÿyùwЄ°¶-‡B€¶‡`Ì£e†Ïx‘ Ôõ`øýÝ›dDfx=˜cs‘ì£8ƒ Œpª²‘œ§²~[–“sýÉf>ÍÎ…c乬3Ž C‡§³aëíb÷%¡òÉ·1ü†[€΃m´à6ŽLg‘ªÉ`ö.ÙùÄ”çaÌAѾ˜ƒhnÕä]c»®êûq9¹©_Ç}™7¥ÂÇÚL FšuÎ…BS€yWä^{ž.ð¯( õBà_ÍùW›q7Œ&Óº§ [œ»°¨€[V‡³¬$š÷>jÛ:ð( èÀ š³m«Ð¶ëÞrîÜèDi¦‰VÄÑÂaÕi5cßÓY¡,ÍUÛÞBa®IGŸ•u0¹’Ú¿.#S¸,¡}¿˜ÀãˆshšIþòR‚`]*cXÆ1øýî²ø©wáÂvFW˜`ÅÀÜ>¶›Ý,ôÁÌŸž6«Å6jêV¦Úç(Âæ(Ì$Ò'»°È0ª´[}]O©†¡ôß'Ê.•ïN8iP”YÈ< fÚ«ÆF–æÅæe•¬>Sð}~æÝxÐÎ5|£8†Ç| 6vÔ¾Ö„¦ƒÀ°'Ë*\j…V´àÁlDQr\Õïú¢RàmA×ȶQ´`ªx¯¿Kk>ŒÊäi—ÌÊy=«†ÌÌDe,ª@xPÆ"œOŠh¹xîÝwëîñ ÍäEM6„Œ(ù……*ß¾.{Ê£"8"(ϵ¹ãhÁtˆ„6 §¤!µÞ›´üxää×P n_àÙ.¸ý3hís´#ÕÎü ÊXP„)?2_ Å¡)[E¬»¬Æ=õ,]A7^[3²lwà¸,€f§Þy×Ô†¯“›Îøi5RÖb[1ÔÁM4UÎÔ²¢ã~=˜µ)3—ß8?÷³V3’\Ï;Žæòd™Y›Á°.£”.LåÎãÎ’`Ñ'Ró²fÊ}•úÐиbf\…Ž£¹­ìÜò·Ån±ô3µhþ@>ÒµéÊs>2ަ“fÌû°F‘$"§èfÛÚ¥™ºÚÆÑGïÒtíí¼H‡L¢·´²uǨ‡+ENAÉ‘ÿ°™or+s^­ÞfÛI)Ê2Í6G³îð)‡ßߟŸ¸ŸMïêjRÞßÍ7L3Æw2üHÊOQÂmZÄáŽy€Ì¥Ÿ!ÓqÁ  ÜœGtg¢ò†‚¤’åÓöy¿[¬™ADÔc(ÎMãhÃLIýs¸ÈèÍ”{üÅævì«$-3Å’`åÓÁ¸œËþ,þb8ù5coš1q8—Ï)Ö~äÏçšÙbë–qù›Ò`ÏÓñxPãÑ2ÞŽ‰ J:Hc-&Ê‚7Lø©HÿQ1G3§\90ßæ¡šûö%â|Õ»>àÒ:1*îµ4çhåhÈ ŸÃc"QZä~Ìq® *Nî'çhhÇ ­7³êÇj\ÞpSÈ0[B½ÙÂR:c »Ù»Q[(_R6íË,gäÙ’2ç8É®íµ=¬>¬·k¾ÿcϽE”çšq´af£ªkwǧ¡+Êâž1t¸ ‰â½ü-$fLZwm®¥´[}XíVÛ%N;\8hq¦xq49r¤dx G»6áâ€;‰¢9 ²hÕ··%TIõ)ùB)fÞbãhƒqCçè­oo+ä¡C è 3-Ð~?-vëç§mßxŒ’ˆì8'L¥âhÁ¤&CO=z:öym 4 ƒdÑìäG  GH32ìËÈÍÅz#ÑŒO~Œ5AŒE5b,™f4ö‰Zó[Œ™VçÅP ÂíùA1„sÌ &%GfÉ/ßìï7« åÿå[& ðà!#$£)ŠTÅá†{b=y¦ØDÿäô©¦è²^2½Ar@Íwoš¥ùj™)¨Î´q8G*=Z¶ýêóþe±Ù|iúmqþüiµ\ðN„­ÈËžÇì_/7MÌÙÎEƒõætòc9ëó$AgÅOhâhQàÆbµÙûµàSeæK.ŽfG‘XjöMFm8ˆüj±iÃA$ Y:XlÎJª§îÏ—òßR"hB¡€Ë  …p¦»j±ÔlX%ƒ››Yyãß½º› ùÖ/-™Q>I‘£áÊ?øƒ‹ãwšï=ú¿ !à€ endstream endobj 3712 0 obj [ 3711 0 R 3713 0 R 3715 0 R 3716 0 R 3717 0 R 3718 0 R 3719 0 R 3720 0 R 3721 0 R 3722 0 R 3723 0 R 3724 0 R 3725 0 R 3726 0 R 3727 0 R 3728 0 R 3729 0 R 3730 0 R 3731 0 R 3732 0 R 3733 0 R 3734 0 R 3735 0 R 3736 0 R 3737 0 R 3739 0 R 3740 0 R 3741 0 R 3742 0 R 3743 0 R 3744 0 R 3745 0 R 3746 0 R 3747 0 R 3749 0 R 3750 0 R 3751 0 R 3752 0 R 3753 0 R 3754 0 R 3755 0 R 3756 0 R 3757 0 R 3758 0 R 3759 0 R 3760 0 R 3761 0 R 3762 0 R 3763 0 R 3764 0 R 3765 0 R 3766 0 R 3767 0 R 3768 0 R 3769 0 R 3770 0 R 3771 0 R 3772 0 R 3773 0 R 3774 0 R 3775 0 R 3776 0 R 3777 0 R 3778 0 R 3779 0 R 3780 0 R 3781 0 R 3782 0 R 3783 0 R 3784 0 R 3785 0 R 3786 0 R 3787 0 R 3788 0 R 3789 0 R 3790 0 R 3791 0 R 3792 0 R 3793 0 R 3794 0 R 3795 0 R 3796 0 R 3797 0 R 3798 0 R 3799 0 R 3800 0 R 3801 0 R 3802 0 R 3803 0 R 3804 0 R 3805 0 R 3806 0 R 3807 0 R 3808 0 R 3809 0 R 3810 0 R ] endobj 3710 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 3712 0 R /Contents 3811 0 R >> endobj 3812 0 obj 2997 endobj 3814 0 obj << /Type /Action /S /GoTo /D [1983 0 R /XYZ 72.0 312.996 null] >> endobj 3815 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 709.5 215.697 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3814 0 R /H /I >> endobj 3817 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.463 709.5 539.848 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3814 0 R /H /I >> endobj 3818 0 obj << /Type /Action /S /GoTo /D [1983 0 R /XYZ 72.0 189.468 null] >> endobj 3819 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 697.5 190.107 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3818 0 R /H /I >> endobj 3820 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.452 697.5 539.919 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3818 0 R /H /I >> endobj 3821 0 obj << /Type /Action /S /GoTo /D [1983 0 R /XYZ 72.0 125.94 null] >> endobj 3822 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 685.5 182.743 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3821 0 R /H /I >> endobj 3823 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.49 685.5 539.923 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3821 0 R /H /I >> endobj 3824 0 obj << /Type /Action /S /GoTo /D [2146 0 R /XYZ 72.0 467.6 null] >> endobj 3825 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 673.5 252.561 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3824 0 R /H /I >> endobj 3826 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.582 673.5 539.849 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3824 0 R /H /I >> endobj 3827 0 obj << /Type /Action /S /GoTo /D [2149 0 R /XYZ 72.0 696.0 null] >> endobj 3828 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 661.5 266.384 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3827 0 R /H /I >> endobj 3829 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.549 661.5 539.771 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3827 0 R /H /I >> endobj 3830 0 obj << /Type /Action /S /GoTo /D [2149 0 R /XYZ 72.0 139.004 null] >> endobj 3831 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 649.5 223.173 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3830 0 R /H /I >> endobj 3832 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.58 649.5 539.891 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3830 0 R /H /I >> endobj 3833 0 obj << /Type /Action /S /GoTo /D [2155 0 R /XYZ 72.0 648.0 null] >> endobj 3834 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 637.5 297.21 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3833 0 R /H /I >> endobj 3835 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.732 637.5 539.819 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3833 0 R /H /I >> endobj 3836 0 obj << /Type /Action /S /GoTo /D [2155 0 R /XYZ 72.0 558.186 null] >> endobj 3837 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 625.5 205.257 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3836 0 R /H /I >> endobj 3838 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.43 625.5 539.849 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3836 0 R /H /I >> endobj 3839 0 obj << /Type /Action /S /GoTo /D [2155 0 R /XYZ 72.0 298.344 null] >> endobj 3840 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 613.5 293.097 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3839 0 R /H /I >> endobj 3841 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.67 613.5 539.806 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3839 0 R /H /I >> endobj 3842 0 obj << /Type /Action /S /GoTo /D [2161 0 R /XYZ 72.0 113.753 null] >> endobj 3843 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 601.5 193.447 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3842 0 R /H /I >> endobj 3844 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.465 601.5 539.922 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3842 0 R /H /I >> endobj 3845 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 589.5 160.935 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2523 0 R /H /I >> endobj 3846 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.421 589.5 539.866 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2523 0 R /H /I >> endobj 3847 0 obj << /Type /Action /S /GoTo /D [2195 0 R /XYZ 72.0 646.8 null] >> endobj 3848 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 577.5 228.61 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3847 0 R /H /I >> endobj 3849 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.525 577.5 539.82 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3847 0 R /H /I >> endobj 3850 0 obj << /Type /Action /S /GoTo /D [2198 0 R /XYZ 72.0 339.6 null] >> endobj 3851 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 565.5 339.457 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3850 0 R /H /I >> endobj 3852 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.758 565.5 539.717 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3850 0 R /H /I >> endobj 3853 0 obj << /Type /Action /S /GoTo /D [2201 0 R /XYZ 72.0 444.0 null] >> endobj 3854 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 553.5 208.81 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3853 0 R /H /I >> endobj 3855 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.538 553.5 539.893 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3853 0 R /H /I >> endobj 3856 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 541.5 185.732 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2220 0 R /H /I >> endobj 3857 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.492 541.5 539.866 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2220 0 R /H /I >> endobj 3858 0 obj << /Type /Action /S /GoTo /D [2204 0 R /XYZ 72.0 646.8 null] >> endobj 3859 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 529.5 128.22 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3858 0 R /H /I >> endobj 3860 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.363 529.5 539.962 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3858 0 R /H /I >> endobj 3861 0 obj << /Type /Action /S /GoTo /D [2204 0 R /XYZ 72.0 562.245 null] >> endobj 3862 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 517.5 182.867 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3861 0 R /H /I >> endobj 3863 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.458 517.5 539.891 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3861 0 R /H /I >> endobj 3864 0 obj << /Type /Action /S /GoTo /D [2204 0 R /XYZ 72.0 261.165 null] >> endobj 3865 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 505.5 270.044 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3864 0 R /H /I >> endobj 3866 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.602 505.5 539.813 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3864 0 R /H /I >> endobj 3867 0 obj << /Type /Action /S /GoTo /D [2249 0 R /XYZ 72.0 233.911 null] >> endobj 3868 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 493.5 322.937 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3867 0 R /H /I >> endobj 3869 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.661 493.5 539.702 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3867 0 R /H /I >> endobj 3870 0 obj << /Type /Action /S /GoTo /D [2254 0 R /XYZ 72.0 660.0 null] >> endobj 3871 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 481.5 174.617 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3870 0 R /H /I >> endobj 3872 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.403 481.5 539.92 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3870 0 R /H /I >> endobj 3873 0 obj << /Type /Action /S /GoTo /D [2262 0 R /XYZ 72.0 502.842 null] >> endobj 3874 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 469.5 170.73 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3873 0 R /H /I >> endobj 3875 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.421 469.5 539.891 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3873 0 R /H /I >> endobj 3876 0 obj << /Type /Action /S /GoTo /D [2262 0 R /XYZ 72.0 449.67 null] >> endobj 3877 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 457.5 178.505 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3876 0 R /H /I >> endobj 3878 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.417 457.5 539.922 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3876 0 R /H /I >> endobj 3879 0 obj << /Type /Action /S /GoTo /D [2262 0 R /XYZ 72.0 343.326 null] >> endobj 3880 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 445.5 226.73 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3879 0 R /H /I >> endobj 3881 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.498 445.5 539.848 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3879 0 R /H /I >> endobj 3882 0 obj << /Type /Action /S /GoTo /D [2275 0 R /XYZ 72.0 265.871 null] >> endobj 3883 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 433.5 221.758 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3882 0 R /H /I >> endobj 3884 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.482 433.5 539.848 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3882 0 R /H /I >> endobj 3885 0 obj << /Type /Action /S /GoTo /D [2275 0 R /XYZ 72.0 137.375 null] >> endobj 3886 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 421.5 217.109 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3885 0 R /H /I >> endobj 3887 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.522 421.5 539.851 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3885 0 R /H /I >> endobj 3888 0 obj << /Type /Action /S /GoTo /D [2281 0 R /XYZ 72.0 696.0 null] >> endobj 3889 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 409.5 184.977 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3888 0 R /H /I >> endobj 3890 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.499 409.5 539.926 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3888 0 R /H /I >> endobj 3891 0 obj << /Type /Action /S /GoTo /D [2423 0 R /XYZ 72.0 627.309 null] >> endobj 3892 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 397.5 196.063 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3891 0 R /H /I >> endobj 3893 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.531 397.5 539.924 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3891 0 R /H /I >> endobj 3894 0 obj << /Type /Action /S /GoTo /D [2431 0 R /XYZ 72.0 720.0 null] >> endobj 3895 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 385.5 200.029 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3894 0 R /H /I >> endobj 3896 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.532 385.5 539.865 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3894 0 R /H /I >> endobj 3897 0 obj << /Type /Action /S /GoTo /D [2431 0 R /XYZ 72.0 646.8 null] >> endobj 3898 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 373.5 211.553 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3897 0 R /H /I >> endobj 3899 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.544 373.5 539.89 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3897 0 R /H /I >> endobj 3900 0 obj << /Type /Action /S /GoTo /D [2431 0 R /XYZ 72.0 397.2 null] >> endobj 3901 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 361.5 306.801 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3900 0 R /H /I >> endobj 3902 0 obj << /Type /Annot /Subtype /Link /Rect [ 522.254 361.5 540.314 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3900 0 R /H /I >> endobj 3903 0 obj << /Type /Action /S /GoTo /D [2431 0 R /XYZ 72.0 175.0 null] >> endobj 3904 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 349.5 306.027 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3903 0 R /H /I >> endobj 3905 0 obj << /Type /Annot /Subtype /Link /Rect [ 522.252 349.5 540.314 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3903 0 R /H /I >> endobj 3906 0 obj << /Type /Action /S /GoTo /D [2434 0 R /XYZ 72.0 720.0 null] >> endobj 3907 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 337.5 174.161 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3906 0 R /H /I >> endobj 3908 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.458 337.5 539.865 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3906 0 R /H /I >> endobj 3909 0 obj << /Type /Action /S /GoTo /D [2642 0 R /XYZ 72.0 720.0 null] >> endobj 3910 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 325.5 117.23 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3909 0 R /H /I >> endobj 3911 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.361 325.5 539.931 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3909 0 R /H /I >> endobj 3912 0 obj << /Type /Action /S /GoTo /D [3710 0 R /XYZ 72.0 720.0 null] >> endobj 3913 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 313.5 129.953 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3912 0 R /H /I >> endobj 3914 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.395 313.5 539.928 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3912 0 R /H /I >> endobj 3915 0 obj << /Length 3916 0 R /Filter /FlateDecode >> stream xœÍÝMw\Çu¨á¹~†Ì]+ªÚ»öÇжbG‰oGòÍ +˜„,¬PCPvôïoíÓ À9”ñNr¯,à[ tUŸSõ__ô«¶þû·õ?žãêõ÷_ü×Ãûú•+±‡wM»ê~²Wß_=¼3®ÞVøä—•<üR¶÷>Ôç7¾»ú·/Þ}Ñ®~óÅ¿ÿÇŠÞ\µÓ¼úËm÷àç‡ùú‹ß¯>í$™ùðg§QBN¶~ñúû«¿ûêûqõåÝVúÓ×µÿçúÇ"éãÿƒ?Q»úÓ¿üæ‹¿ûõ¼êíê›o/_&'ÏúÏЫ8É8ÿúê›ï¯þýÕ?üøþæÃ׿ÿíÕîo>\ýæ‡Û77óWßüãÿÍÃßr{ˆíëh¬ÿóÓöÅôä7¦¶§¿óè í§÷_Þ»þ_Or~ßzÏiÌõשßzû`ûð¿õŸ~9·ÏÕù?û¹yx¨GƒŸKmŸ´ÿÉþy×SïmýÇÖ«â‰Êí?Bxú…ö?ü¹ÛqÖÇþüßJc÷ö‡ûÛwºú›«¿Í±¾^ýóW¿»¼ñëÛ·7—·~ñúõÍýýùoþÓ#v]ß Ò×çiÈî±/cw£|}z³5!ƒæúlh¡ˆïFv±ØHœ ¶AâIâ±w+‰ÄAƒ "˜D0‰`ÁÑ€àh@p4 8:ŽG‚cÁ1€àDPˆ A!‚J•*T"8‰à$‚³[Æìý¯ÇÖI¬$v{#±ØHœ ŽAâIb"˜D0‰`Ai@P”¥Áõä–Ä@P:”eADPˆ A!‚B•*T"8‰à$‚“4"hDЈ A'‚Nƒ "˜D0‰`Á‚Ú€ 6 ¨ j‚Ú v ¨ê‚:€ "(DPˆ A%‚ë™yû\üÙõ]OÑÕ¤õ±ýùAë©zÄl-}?jxžÇš>«¾¾ùðç›õÖ“ø“^½úòúãõ¯ïovkOë‰CoÞÚ¶˜Gð|Üza«{lÜ<õ®™ãvÓû59ì}}&¦æ ê5;$µ¢ÚI½&ˆ¤Tª“Ôë+ÔÕÈÒ¥!KC–Ž,Y:²tdÈ2e ËD–‰,“XŽF,G#–£ËшåèÄrtb9:±ƒXŽA,Ç@–‚,Y ²d©ÈR‘¥"ˉ,'²œ~þ9߆¼ ¶†jAµ¡:IíÕÕAêè¨VT#ËD–‰,Y&±”F,¥KiÄR:±”N,¥KÄR±”A,×ï’Z¥ KA–Š,Y*²œÈr"ˉ,'²4diÈÒ¥#KG–Ž,Y² dÈ2‘e"Ë$–Úˆ¥6b©Xj'–Ú‰¥vb©Xê –:ˆ¥d)ÈR¥ KE–ë¹}ªgF›d m[Tœ=s7Ç)çÌ\ß$÷ãö ‹C×Ý“Hk­‡œ«?¼ÿÓ‡ë7Ÿ.w³SüÜÒb;¹®acìè2~7LO£·õY™ÿg†ùÉ)»aû…ņjAµ¡:I½ ROT©×R+ª‘åD–YNd9‘¥!KC–†,Y:²tdÈ2e Ë@–‰,Y&±¬‹IM,ë2GPwbY:’šX֥ޠIJ.v$5²d)ÈR¥"KE–Š,YNd9‘å,ËXÏSì±u+‰ÄÞH,$6'ˆcx’˜&L"˜@°®{1¬ëA ëºGÁºîñåñ‚uÝ#ˆ‰ A!‚B…*T"¨DpÁI'4"hDЈ A'‚N "D0‰`Á$‚ ëºGÁºîñåq‚uÝ#ˆ  ¨ê‚:ˆ A!‚B•Öuc´&ÝÁrܶFY7¾×J(¶-QFk}?ìðÚGÕŸ[¢Œm!ô×¼õ»·oÎ×Fžßü?7îoïÞí–/ëFKë­©éþƒ\†¬I„=\&A†ù©Ûšz˜Ìý°ý’@Cµ ÚP õ;¨'ªƒÔõ;¨ÕÄr b9±ƒXŽ,Y ²d©ÈR‘¥"ˉ,'²œÈr"KC–†, Y:²tdéÈ2e Ë@–,Y&²Lb)XJ#–Òˆ¥tb)XJ'–Ò‰¥ b)ƒXÊ@–‚,Y ²Td©ÈR‘¥"ˉ,'²œÈÒ¥!KC–Ž,Y:²tdÈ2e ËD–‰,“Xj#–Úˆ¥6b©Xj'–Ú‰¥vb©ƒXê –:¥ KA–‚,Y*²\ßí‡G볓~-mÌ«u!ÃÎwuf˜ >öKµ{à“ê_¿ûáúm}Ÿµzò«ï®ßýéæþòŽw~ýÝÍåÿuºýáöýÇË{jc²Ýd~ý±býC–û~ºæ'Óžƒ «›±j…(å`Ô~v/$6'ˆ×7 Oˆ×w +‰ÄB… "¨DP‰ ÁI'œDЈ A#‚F:t"D0ˆ`Á$‚I“&¬[­@ ëF«—ÇÖmV ‚u“ˆ`Ýbb"(DPˆ A%‚J•N"8‰à$‚“4"hDЉ A'‚Aƒ "˜D0‰`Áº“ Ä@°î£zyÜ`ÝEb X÷P½<@°î 1"(DPˆ Áš»çÃvL/ŸsnswÍÖû2¬æîµK’…î‡ —ÝTàj}|ZýòúõþåúÛm@O¶fïwß¿¿þxûÇÛ··¼¼û«ûûö7SÕ^ ¾PûÜ?öeðn˜žf_ŸUùå"†Ý°ç½& Tª“Ô5‘õDuºæ VT#ËD–‰,Y&±¬+KHM,ëÊPwbYW–šXÖ•%¤&–ue ©‘¥ KA–‚,Y*²Td9‘åD–5ɰ‡»–_P'©kšê‰ê uÍ4@­¨vR×dÔ‚jdÈ2‘e"Ë$–ue ©‰e]YêN,ëÊR˺²ÔƒXÖ•%¤F–‚,Y ²Td©ÈR‘¥"ˉ,'²œÈÒ¥!KC–Ž,Y:²tdÈ2e ËD–‰,“XÖ•%¤&–ue ©‰e]YBjbYW–€z˺²„ÔÈR¥ KA–‚,YÖêÔúqÒÂɲ˶:UûÙt2¬nšYOËSã`ØáêÔzú´úéÄõAêbð«W_Þ¼¿y÷ææÝë/ïûúæãÇÛwº¿¼çÛ»—7~ñþýÛÛ××mFmnÞ÷ýò»aÛ_ç¼e¶žSü´CÒnØ~N¨¨vR¯ç¤Tª“ÔëkŠÔÕAjC–†, Y:²tdéÈÒ‘e Ë@–,Y&²Lb)XÖ> ¤&–µ“¨;±¬½HM,k7RËÚOÔ‚,Y ²d©ÈR‘¥"ˉ,'²œÈÒ¥!KC–†,Y:²tdÈ2e ËD–‰,Y&±¬HM,k«PwbY›-šXÖv ¤&–µá©‘¥ KA–‚,YÖ¦hµ Ꚁ‰OÍ ]ÖQCÃjqÖV­q0lø|ÞÇU>ßœáß¾»Þî.¨½ ¯^ýù¼©Âåç;οþ—Þ¾}öˆ}ýTÓëÀكǾ Ý ³“÷õwU2ìñ=„»aÏ-úã{_Pª“Ôï!|A=Q¤~|á jEµ“Ú‘¥#KG–Ž,Y² d™È2‘eËшåhÄr4b9±XŽN,G'–cË1ˆåÈR¥ KA–‚,Y*²Td9‘åD–Y²4diÈÒ¥#KG–Ž,Y² d™È2‘e"Ë$–Òˆ¥4b)XJ'–Ò‰¥tb)ƒXÊ –2ˆ¥ d)ÈR¥ KE–Š,YNd9‘åD–Y²4diÈÒ‘¥#KG–,Y² d™È2‘eKmÄR±ÔF,µKíÄR;±ÔN,uKÄR²d)ÈR%Z÷ÙÎgrɺè,.m[ŸÖÑJÃÈRÖ“ýAvÃ×àzÛí}zÿ°ï©y,ÿ°Èù'—xlïùúÝõûûïî>^Þó¯7ïïîo?Þ}øñ`^ÙÒëcƒ{y„ƒæú<œo@Bãü´´2uØÁ¸£É&Ê…åÆòDy½ HòÉò@y½Hrey©öÖr}M;Q.,7–'ÊëA’O–Êë5A’+Ë™j2ÕdªÉT©Ö$åHµ¦¡$ïHµ&¢(Gª5E9R­É(Ê™ª0UaªÂT•©*SU¦:™êdª“©N¦jLÕ˜ª1UgªÎT©S ¦L5˜j2Õdª‰Tk–Šr¤ZóT’w¤Z3U”#Õš«’| Õš­¢œ© S¦*LU™ª2Õº„<=c†’é™n§ð­RTиšäêh½ÍƒaÇ“Üþ|¿­M/·yt>:¿cM|Ÿ îu…ªZÝOqð(—Ø ÓSÖ§°G²që«LtMuçÑÇ{þ©ïõUFre¹£¼¾ÊH.,7–'ÊëV’O–3UcªÆT©:Su¦êLÕ™j0Õ`ªÁT“©&SM¤ZÉ ©Öe2(Gªu¡ Ê‘j]*CòTk)åLU˜ª0UaªÂT•©*SU¦:™êdª“©S5¦jLÕ˜ª3UgªÎTƒ©S ¦šL5™j2ÕDªÛ &ɑ궂 òŽT·L’#Õm“äHu[Á$9S¦*LU˜ª2UeªÊT'SLu2ÕÉT©S5¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5‘ê¶‚Ir¤º­`‚¼#Õm“äHu[Áù@ªÛ &É™*[[R¶¶¤lmIÙÚÒùª›ÞÚ ÀêÛvÕMmÐb¢hÜvâp¶®‡«}ÃíÙ€¶-ô=­~qÚßkëàßÞÞ¼¿¼y÷íå×ÿtóã_î>¼y¾7JÄ)úüìû2üÙ°ú6ÒW:ZGÃjé–µâ»ö\cÛ üÅußö¹²ÜQ¾íra¹±)îåyGªçÓâ@ŽTÏ'Æ©žO9S¦*LU˜ª2UeªÊT'SLu2ÕÉT©S5¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5‘ª6¤ª ©jCªÚ‘ªv¤ª©jGª:ª¤z>yîå¹0UaªÂT•©ÖJuÝé)-ÜžomY‡Ý¡qÛòÑú¯Å87»ð²N74S ÛÎXÿhÖ?âƒqÇ«VóùþgŸV­ÖŸA>­Zý°ju~ãÓÕå=_ÞÞ_¿}{÷—›7—÷]?úýÇ»¢ßóÕ››wo¿½½ù°;Än;.¬6As9ø3^b÷ĽÏXå«›ù?-0îÆíçÆòDyÝKòÉò@yÝKre¹“\ê†\’#Õí41’#Õí<1’#ÕíD1¤º)Fr¦*LU˜ª0UaªÊT•©*SLu2ÕÉT©S5¦jLÕ™ª3UgªÁTƒ©SM¦šL5™j"Õí´1’#Õí¼1w¤º8Fr¤º9Fr¤º:Fr¦*LU˜ª0Ueªk~à6×üÀ&yºº>VçWOCOsk†à³¯gÕ-Æh3{¾yÔ×ïo^ß^¿Ýæ!kòëÞ½þøpYüÌ«×u¹qˇ›¯vúiôóQµô”–“Œ’Ó¬ý·[Ôv£ž3Ô½((O”¯Ï3Ê'ËåÖY®,w”¯ÙÊ™ª3UgªÁTƒ©SM¦šL5‘jÝ‹‚r¤Z÷¢ ©Ö½((Gªu/ ÉR­{QPÎT…© S¦*LU™ª2Ueª“©N¦:™ª1UcªÆT©:Su¦êL5˜j0Õ`ªÉT“©&SM¤Z÷¢ ©Ö½($ïHµîEA9R­{QPŽTë^”3UaªÂT…©*SU¦ªLu2ÕÉT'SLÕ˜ª1UcªÎT©:S ¦L5˜j0ÕdªÉT©Ö½((Gªu/ É;R­{QPŽTë^’¤Z÷¢ œ© S¦*LU™j½¦¯Ñz`Ej{I_ÂeìnœŸzÝy²þÞh\=ÕÑ™é6Æí(ê©Éå‹N­µYà=¯§:$Ÿ,”×S’+ËåõT‡äÂrc9S5¦jLÕ˜ª3UgªÎTƒ©S ¦L5™j2ÕDª£!ÕÑêhHut¤::R©ŽŽTÇ@ªc Õ1˜ª0UaªÂT•©*SU¦ªLu2ÕÉTëe´õœà|§ð_Ïëe4’+ËåÞX.,7–'Êëe4’O–3ÕdªÉT©JCªu­#Ê‘j]ëHòŽTëZG”#ÕºÖåHµ®u$¹0UaªÂT…©*SU¦ªLu2ÕÉT'S5¦jLÕ˜ª1UgªÎT©S ¦L5™j2Õdª‰TëZG”#ÕºÖ‘ä©ÖµŽ(Gª:ª¤ª©ê`ªÂT…© SU¦ºf-4³+ZCÜöðÉÑšÊчùü¸'{øìÆ­'ž»ùÈvÙÕÓì_~øðþîþæYZû,ŒÊÆ8S¤Z1Ýo_[½Õ Z­%Wׯ‡çúÛØÁ¸çŸéº4ÔIêº0ÔÕAêº*ÔŠj'u]jd™È2‘eo³7¤ÙâìyöŽ@ë…’DZ¯? ¡ÖëњͣïG¯? |²j½þ€r¦*LU˜ª0UeªÊT•©*SLu2ÕÉT©S5¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘ª4¤ºíµ@r¤ºíµòŽT·½HŽT·½HŽT·½@.LU˜ª0UaªÊT•©*SLu2ÕÉT©S5¦jLÕ™ª3UgªÁTƒ©SM¦šL5™j"Õm¯’#Õm¯w¤ºíµ@r¤ºíµ@r¤ºíµ@r¦ÊÖ–”­-)[[R¶¶TgøÈ‡ÝÑvùçßëˆõósçgÖÕÛé­åˆƒ‡¯@ÔÍÓO³'—l[Vð—Ûß]Þú͇ë7oŸ¿@±Èj–iîy}°¬*uBn¶`ãümµýè¯p´¼JjAµ¡:W]ûu~žŽÖVQ>Y(¯#•H®,w”בJ$–Ë™ª1UcªÆT©:Su¦L5˜j0Õ`ªÉT“©&R­µU”#ÕZ[%yGªµ¶Šr¤Zk«$HµÖVQÎT…© S¦ªLU™ª2Ueª“©N¦ZÇu×S‚º‹îy×Mre¹£ÜË…åÆòDy×MòÉr¦šL5™j"UiHµÖVQŽTkm•ä©ÖÚ*Ê‘j­­¢©ÖÚ*É…© S¦*LU™ª2Ueª“©N¦:™ª1UcªÆT©:Su¦êL5˜j0Õ`ªÉT“©&SM¤Zk«(Gªµ¶JòŽTkmåHURÕTu ULU˜ª0UaªÊTë|Öº¼£ü³Ë†ÛµÝ3Zóèhܶ/ÆÌÔ8šìWV5¶­Ÿf_½ûóÝ>¬¬Ö2ÊÕ«ëË/Ï˪—··eØ'¿ýþ»Û××oßþx°2ÐT[3™ôòK£®sw…ãô4×w”‘ãŽÖ H^÷“\Xn,O”×}à$Ÿ,”×}à$gªÂT•©*SU¦ªLu2ÕÉT·ûÀWS_’o÷ƒ\Yî(ßî¹°ÜXž(ßîùd9SM¦šL5‘ª4¤z¾äHõ|øËóŽTÏ÷ƒ©žï9R=ßþò\˜ª0UaªÂT•©*SU¦:™êdª“©S5¦jLÕ˜ª3UgªÎTƒ©S ¦šL5™j2ÕDªçûÀAŽTÏ÷¿<ïHõ|8È‘êù>p#Õó}à gªÂT…© SU¦ºfòé”J0Ï­µkkvŽæÇçS1WjGîx©`<ßióñRÁú‘àKç_^– Îoÿ´Tp~óÛwß_ÞúøÝ£òWwßýîQûÛÛwÏ/å³RêR.µƒ?ÙeìnœžZ_ŸgŸÎÆù©e_>:Æíç(åÂrcy¢|ýÈCùdy |ýÈC¹²œ©&SM¦šL5‘j €r¤Z'¼#Õ:AåHµN@9R­PÎT…© S¦ªLU™ª2ÕÉT'SLu2UcªÆT©:Su¦êL5˜j0Õ`ªÁT“©&SM¤Z' ©Ö $ïHµN@9R­H>j €r¦*LU˜ª0UeªÊT·Ó)×—±F’'òÛ„ÉzëÍ«CBåᾚý¸ó`Æ$Ï÷×úÃýÃtiÛ6ès·©¬§jÖ?ݦ²{ŒGÃwíÔ½·ðgóäC3C>âóÏ}_F”O–ÊGg¹²ÜQ.måó<­~A-¨6T'©u z¢:H=;ªÕNjC–†, Y²tdéÈÒ‘e Ë@–,Y&²Ld™Är4b9±XŽN,G'–£Ë1ˆåÄr b9²d)ÈR¥"KE–Š,'²œÈr"ˉ, Y²4déÈÒ‘¥#Ë@–,Y²Ld™È2‰¥4b)XJ#–Ò‰¥tb)XJ'–2ˆ¥ b)Y ²d)ÈR‘¥"KE–Š,'²œÈr"KC–†, Y:²tdéÈÒ‘e Ë@–,Y&²Lb©Xj#–Úˆ¥6b©Xj'–Ú‰¥b©ƒXê@–hÝGѺ¢uEë>ŠÖ}ꆖÐó-h}q»£¥­§7³öŸ!ë––é+v9¸žî¦ëÿžï)ôx³ ^_v zxóï>>{ zâV"bøhèÁâíš»µó§ \ÿPê’|£¸[G¨Ù;ÈkúNre¹£¼fð$–Ë×?˜ºPkj¾$¯Y<É'Ëå5‘'¹²ÜQ^sy’ ËåLÕ˜ª1UcªÎT©:S ¦L5˜j0ÕdªÉT©ÖŒ(Gªu#É;R­QŽTëF’¤Z70¢œ© S¦*LU™ª2UeªÊT'SLu><[ÚnÅþë¹u–+ËåÞX.,7–'ÊkÞOòÉr¦šL5™j"UiHµn`D9R­IÞ‘jÝÀˆr¤Z70¢©Ö Œ$¦*LU˜ª0UeªÊT•©N¦:™êdªÆT©S5¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘jÝÀˆr¤ª ©jGªÚ‘ªv¤ª©ê@ª:jÝÀHraªÂT…©*S­ÍŽú̘­{nkãÌEŸlw´¸ž>Û}y22柳ßýñãõí»Ÿ‡õ4ŽVƒëÊÚÙ4ÓÇÊ‘êèHu ¤ZwË œ© S¦*LU˜ª2UeªÊT'SLµö ZÏ "‡½$¯=ƒH.,7–'Ê}°|²l¿°x¼øºž?Í_˜[¯å_½ú‡ûÿzûæ—·?]§{~ë`av»<3g] ¼û—¡«S½ûš½H¢qµLÕ¤..=v¸Jj'u­QZPm¨NR×ú¨'ªƒÔ‰,Y&±ÜV¦@M,·u)PËmU ÔÄr[“zy=ˆå¶"jd)ÈR¥ KA–Š,Y*²œÈr"ˉ, Y²4diÈÒ‘¥#KG–,Y²Ld™È2‘eËmÝ ÔÄr[uzyÝ‰å¶æjb¹­8šXnëM F–‚,Y ²Td©ÈR‘åD–YNd9‘¥!KC–†,Y:²tdÈ2e Ë@–‰,Y&±Ü–•@M,·E¥—×XnKJ &–Û‚ÒËëA,·å$P#KA–‚,Y*²T;õÞ2‡¢5•m1)=c†¢quAFµßånÜñZÒz¦øùµ¤õTO®^}{÷áòÆïÞ¾¹yôæ?~ùO÷ϧìuÃÒôÌiýàñ/cwKIrê¶>]óðÏõ3ãÖ?[(³n1ßÛ­(ÔO'×'’O–Êë'É•åŽòú!Era9S ¦šL5™j"Õº£åHu;’ä©nGr’©nGr‚| ÕíHN’3UaªÂT…©*SU¦ªLU™êdª“©N¦jLÕ˜ª1UgªÎT©:S ¦L5˜j2Õdª‰TëŽV”#ÕíHN’#ÕíHN’#ÕíHN¤ºÉIr¦*LU˜ª0UaªÊT•©*SLu2ÕÉT©S5¦jLÕ™ª3UgªÁTƒ©SM¦šL5™j"ÕíHN’#ÕíHNw¤ºÉIr¤ºÉIr¤ºÉIr¦*LU˜ª0UeªkvÐ<[o ­mË`Ñ3Õ{² ¶7"wó‘í…ÇÏ/ƒ…Õ‡ùéªí­¯¾üûË¿ºûþýíÛ›û¥°yê-2eÊÁǸ<Àn\œÔG݆;иõ³1jÓDó~0n¿¦,w”¯Ÿ(–Ëåëg#Ê'ËåÁTƒ©SM¦šL5™j"Õ:åHµÎ!yGªuÊ‘j‚r¤Z§ œ© S¦*LU™ª2Ueª“©N¦:KU3{ý‚õ­­œËÓ¶nÙòèãíV#ÖÓ ”O–Ê×Ó ”+ËåëiÊ…åÆr¦:™êdª“©S5¦jLÕ™ª3UgªÎTƒ©S ¦šL5™j"Õº‡åHµî¢E9R­ûhQŽTëNZ’¤Z÷Ò¢œ© S¦*LU˜ª2UeªÊT'SLu2UcªÆT©Su¦êLÕ™j0Õ`ªÁT“©&SM¦šHµî²E9R­‚ä©Ö¶(Gªu¯-Ê‘jÝm‹r¦*LU˜ª0UeªÊT•©N¦:™êdª“©S5¦jLÕ™ª3UgªÁTƒ©S ¦šL5™j"Õº åHµnÄ%yGªu+.Ê‘ª²µ%ekKÊÖ–”­-)[[R¶¶¤lmIÙÚÒv5¢X† Y <ß“™#W«GuSkÌ£ÅÏõTï`t<ßîÉ=¹ãW¯¾¼{ýÃ÷7ï>^¼½{·[)ÔS3iMæÑƒ]d7Î×ß±ÕòjGãjnÙ³­9Æí×…åÆòDyÍ-I>Y(¯¹%É•åŽrcªÆT©Su¦êLÕ™j0Õ`ªÁT“©&SM¦šHµ.ßD9R­Ë7IÞ‘j]¾‰r¤Z—o¢©Öå›(gªÂT…© SU¦ªLU™êdª“©N¦:™ª1UcªÆT©:Su¦L5˜j0Õ`ªÉT“©&R­Ë7QŽTëòM’w¤Z—o¢©Öå›$Hµ.ßD9S¦*LU˜ª2UeªÊT•©N¦:™êdªÆT©Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHµ.ßD9R­Ë7QŽTëòM”#Õº|“ä©Öå›(gªlmIÙÚ’²µ%ekKÊÖ–¶Ë7ëE !ËoÛå›ëùG›ahÜã£'öãFögÚö:àÓêW§‡ËCíêÕ?üøþæÃ׿ÿíå=n™^oýîýÍ»ß}ûííë›ÝÂcœÖ_|}¢Ò>Æåvk}ý$9[[_TlœžÜê~ô™ãöKŠŽòõ¤åÂrcy¢|}M |²™(Ÿ,”[g¹²ÜQîåÂr¦êL5˜j0Õ`ªÉT“©&R­µ8”#ÕZ‹C9R­µ8”#ÕZ‹#ù@ªµ‡r¦*LU˜ª0UaªÊT•©*SLu2ÕÉT©S5¦jLÕ™ª3UgªÁTƒ©SM¦šL5™j"ÕZ‹C9RÝîÜyGªµ‡r¤º½´Or¤Zkq(gªÂT…© SU¦ªLU™êdª“©N¦:™ª1UcªÆT©:Su¦L5˜j0Õ`ªÉT“©&R­µ8”#ÕZ‹#yGªµ‡r¤Zkq$HµÖâPÎT…© S¦ªLu[‹[‰Öæ…/_dÚÖâÖÇ:_EÆÕå}C3Üó`ÜñZÜ|¾‰ãîn;^ßáõñÒÛå}wùåooÿøáæùï_ß?úõå—_^¼þãõý£ð›»»·» ›ž¢µõI ?øÓ]ÆîÆù)~º2Œ« þ#V«ý`Ü~ ',7–'Ê œä“å±òl]ìè3ºŸ“u–+ËåuÁ?É…åÆòDy]ðOòÉr¦šL5™j"Õ:'åHµÎÉD9R­s2QŽTëœL’¤Zçd¢œ© S¦*LU˜ª2UeªÊT'SLu2UcªÆT©Su¦êLÕ™j0Õ`ªÁT“©&SM¦šHµÎÉD9R­s2IÞ‘j“‰r¤Zçd¢©Ö9™(gªÂT…© SU¦ª¾&ˆ­µõíŒÌYt¶Ó˜ëË߃ ““¨gö<šøÏíùV¿º{÷ç›/“D»zuº;ïç~ëÛÛ·7÷—7?Þ]~ýÃO³¿G÷Šßz| Èù=_ß|øóîD€š¶a™#þp—ÁÓÃ>ÖÈÞѰ5;}M™Ö?ÀƒqG³C”ËåkvˆòÉò@ùš¢\Yî(w¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHµf‡(Gª5;D9R­Ù!Ê‘jÍI>jÍQÎT…© S¦*LU™ª2Ueª“©N¦:™ª1UcªÆT©:Su¦êL5˜j0Õ`ªÉT“©&SM¤Z³C”#Õš’¼#Õš¢©ÖìåHµf‡(gªÂT…© SU¦Z³Ãi»|¼|ÎržŽÖµÃq§‡»qûéa;_¼ð¤úrÛd=À“ù\½ýë5+üôëßÞ¾ûÏûgÖ×?À^·KïüiènÔÿÌ*ævBÝ\£<ÀŠéÓ[v£Fê~™7Ÿïëò°®Ûë6§«W_½{sóß»sZ³ÁõŸ:‘n7þÑàçãâ"k&Ó[«EºÆÅ8÷ü¾~â‘:H½~Þ‘ZW=3½õ—ÔNêõÃŽÔ‚jCu’:ª'ªƒÔÙQ,Y®É=Ë‘foˆ³^?!yG õú Êi½~‚r„º¨ riçojGß&÷¹°ÜXž(×ÁòÉò@ùì,W–;Ê©S5¦jLÕ™ª3UgªÁTƒ©SM¦šL5™j"ÕzýåHµ^?!yGªõú Ê‘j½~‚r¤Z¯Ÿ œ© S¦*LU™ª2Ueª“©N¦:™êdªÆT©Su¦êLÕ™j0Õ`ªÁTƒ©&SM¦šHµ^?A9R­×OHÞ‘j½~‚r¤Z¯Ÿ| ÕzýåLU˜ª0UaªÊT•©*SU¦:™êdª“©S5¦jLÕ™ª3UgªÎTƒ©S ¦šL5™j"UmHURÕ†Tµ!UíHU;RÕŽTu UHUSekKÊÖ–”­-)[[R¶¶¤u&ÖôÌiG«n?ójCmÐn-s¨°µõ’IF;8Òž hççžT¿¹ywóáúíöQÚ¶»þÑ+)µïFmqŸ½<Æ£ÁÏÆ­Ÿ³Î"í Ž›§º>^‹ƒq»W$‚Ôu5¨ÕNêº Ô‚jCu’z}©‘Y&²ì aö†4{Cœõ¯å´w$Ú;"í™öP·£vc¶f~ô}`ÿ"@g¹²ÜQ^a‘\Xn,O”×EX$Ÿ,gªÆT©Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHµó@9R­Ã> endobj 3916 0 obj 11963 endobj 3918 0 obj << /Type /Annot /Subtype /Link /Rect [ 173.39 709.5 185.89 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2829 0 R /H /I >> endobj 3920 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.95 697.5 156.45 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2831 0 R /H /I >> endobj 3921 0 obj << /Type /Annot /Subtype /Link /Rect [ 199.23 685.5 211.73 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2833 0 R /H /I >> endobj 3922 0 obj << /Type /Annot /Subtype /Link /Rect [ 175.6 673.5 188.1 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2838 0 R /H /I >> endobj 3923 0 obj << /Type /Annot /Subtype /Link /Rect [ 159.49 661.5 171.99 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2841 0 R /H /I >> endobj 3924 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.94 649.5 186.44 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2843 0 R /H /I >> endobj 3925 0 obj << /Type /Annot /Subtype /Link /Rect [ 149.49 637.5 161.99 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2845 0 R /H /I >> endobj 3926 0 obj << /Type /Annot /Subtype /Link /Rect [ 177.84 625.5 195.34 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2847 0 R /H /I >> endobj 3927 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.5 613.5 157.0 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2849 0 R /H /I >> endobj 3928 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.06 601.5 172.56 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2851 0 R /H /I >> endobj 3929 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.61 589.5 183.11 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2853 0 R /H /I >> endobj 3930 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.61 577.5 163.11 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2855 0 R /H /I >> endobj 3931 0 obj << /Type /Annot /Subtype /Link /Rect [ 188.38 565.5 200.88 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2857 0 R /H /I >> endobj 3932 0 obj << /Type /Annot /Subtype /Link /Rect [ 161.72 553.5 174.22 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2859 0 R /H /I >> endobj 3933 0 obj << /Type /Annot /Subtype /Link /Rect [ 179.22 553.5 196.72 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2861 0 R /H /I >> endobj 3934 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.39 541.5 155.89 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2863 0 R /H /I >> endobj 3935 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.95 529.5 156.45 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2865 0 R /H /I >> endobj 3936 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.49 517.5 156.99 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2867 0 R /H /I >> endobj 3937 0 obj << /Type /Annot /Subtype /Link /Rect [ 132.84 505.5 150.34 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2869 0 R /H /I >> endobj 3938 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.61 493.5 188.11 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2871 0 R /H /I >> endobj 3939 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.05 481.5 177.55 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2873 0 R /H /I >> endobj 3940 0 obj << /Type /Annot /Subtype /Link /Rect [ 212.27 469.5 229.77 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2875 0 R /H /I >> endobj 3941 0 obj << /Type /Annot /Subtype /Link /Rect [ 191.16 457.5 208.66 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2877 0 R /H /I >> endobj 3942 0 obj << /Type /Annot /Subtype /Link /Rect [ 190.61 445.5 208.11 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2879 0 R /H /I >> endobj 3943 0 obj << /Type /Annot /Subtype /Link /Rect [ 206.17 433.5 223.67 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2881 0 R /H /I >> endobj 3944 0 obj << /Type /Annot /Subtype /Link /Rect [ 188.94 421.5 206.44 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2883 0 R /H /I >> endobj 3945 0 obj << /Type /Annot /Subtype /Link /Rect [ 222.28 409.5 239.78 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2885 0 R /H /I >> endobj 3946 0 obj << /Type /Annot /Subtype /Link /Rect [ 190.06 397.5 207.56 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2887 0 R /H /I >> endobj 3947 0 obj << /Type /Annot /Subtype /Link /Rect [ 182.0 385.5 199.5 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2889 0 R /H /I >> endobj 3948 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.83 373.5 175.33 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2891 0 R /H /I >> endobj 3949 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.99 332.22 209.49 341.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2893 0 R /H /I >> endobj 3950 0 obj << /Type /Annot /Subtype /Link /Rect [ 261.14 320.22 278.64 329.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2895 0 R /H /I >> endobj 3951 0 obj << /Type /Annot /Subtype /Link /Rect [ 200.6 308.22 218.1 317.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2897 0 R /H /I >> endobj 3952 0 obj << /Type /Annot /Subtype /Link /Rect [ 222.26 296.22 239.76 305.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2899 0 R /H /I >> endobj 3953 0 obj << /Type /Annot /Subtype /Link /Rect [ 214.49 284.22 231.99 293.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2901 0 R /H /I >> endobj 3954 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.16 272.22 183.66 281.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2903 0 R /H /I >> endobj 3955 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.15 260.22 183.65 269.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2905 0 R /H /I >> endobj 3956 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.94 248.22 181.44 257.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2907 0 R /H /I >> endobj 3957 0 obj << /Type /Annot /Subtype /Link /Rect [ 161.15 236.22 178.65 245.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2909 0 R /H /I >> endobj 3958 0 obj << /Type /Annot /Subtype /Link /Rect [ 161.16 224.22 178.66 233.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2911 0 R /H /I >> endobj 3959 0 obj << /Type /Annot /Subtype /Link /Rect [ 187.26 212.22 204.76 221.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2913 0 R /H /I >> endobj 3960 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.04 200.22 172.54 209.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2915 0 R /H /I >> endobj 3961 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.71 188.22 164.21 197.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2917 0 R /H /I >> endobj 3962 0 obj << /Type /Annot /Subtype /Link /Rect [ 180.87 176.22 198.37 185.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2919 0 R /H /I >> endobj 3963 0 obj << /Type /Annot /Subtype /Link /Rect [ 171.43 164.22 188.93 173.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2921 0 R /H /I >> endobj 3964 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.93 152.22 181.43 161.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2923 0 R /H /I >> endobj 3965 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.93 140.22 201.43 149.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2925 0 R /H /I >> endobj 3966 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.15 128.22 193.65 137.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2927 0 R /H /I >> endobj 3967 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.49 116.22 191.99 125.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2929 0 R /H /I >> endobj 3968 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.99 104.22 194.49 113.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2931 0 R /H /I >> endobj 3969 0 obj << /Type /Annot /Subtype /Link /Rect [ 126.72 92.22 139.22 101.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2933 0 R /H /I >> endobj 3970 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.62 80.22 178.12 89.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2935 0 R /H /I >> endobj 3971 0 obj << /Type /Annot /Subtype /Link /Rect [ 413.38 709.5 430.88 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2937 0 R /H /I >> endobj 3972 0 obj << /Type /Annot /Subtype /Link /Rect [ 397.82 697.5 415.32 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2939 0 R /H /I >> endobj 3973 0 obj << /Type /Annot /Subtype /Link /Rect [ 393.38 685.5 410.88 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2941 0 R /H /I >> endobj 3974 0 obj << /Type /Annot /Subtype /Link /Rect [ 390.04 673.5 402.54 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2943 0 R /H /I >> endobj 3975 0 obj << /Type /Annot /Subtype /Link /Rect [ 397.83 661.5 415.33 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2945 0 R /H /I >> endobj 3976 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.61 649.5 403.11 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2947 0 R /H /I >> endobj 3977 0 obj << /Type /Annot /Subtype /Link /Rect [ 368.93 637.5 386.43 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2949 0 R /H /I >> endobj 3978 0 obj << /Type /Annot /Subtype /Link /Rect [ 449.47 625.5 466.97 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2951 0 R /H /I >> endobj 3979 0 obj << /Type /Annot /Subtype /Link /Rect [ 419.49 613.5 436.99 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2953 0 R /H /I >> endobj 3980 0 obj << /Type /Annot /Subtype /Link /Rect [ 413.39 601.5 430.89 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2955 0 R /H /I >> endobj 3981 0 obj << /Type /Annot /Subtype /Link /Rect [ 380.33 589.5 392.83 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2957 0 R /H /I >> endobj 3982 0 obj << /Type /Annot /Subtype /Link /Rect [ 431.99 577.5 444.49 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2959 0 R /H /I >> endobj 3983 0 obj << /Type /Annot /Subtype /Link /Rect [ 363.66 565.5 376.16 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2961 0 R /H /I >> endobj 3984 0 obj << /Type /Annot /Subtype /Link /Rect [ 401.17 553.5 413.67 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2963 0 R /H /I >> endobj 3985 0 obj << /Type /Annot /Subtype /Link /Rect [ 371.73 541.5 384.23 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2965 0 R /H /I >> endobj 3986 0 obj << /Type /Annot /Subtype /Link /Rect [ 427.01 529.5 439.51 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2967 0 R /H /I >> endobj 3987 0 obj << /Type /Annot /Subtype /Link /Rect [ 403.38 517.5 415.88 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2969 0 R /H /I >> endobj 3988 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.5 505.5 402.0 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2971 0 R /H /I >> endobj 3989 0 obj << /Type /Annot /Subtype /Link /Rect [ 441.15 493.5 453.65 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2973 0 R /H /I >> endobj 3990 0 obj << /Type /Annot /Subtype /Link /Rect [ 409.5 481.5 422.0 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2975 0 R /H /I >> endobj 3991 0 obj << /Type /Annot /Subtype /Link /Rect [ 420.32 469.5 432.82 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2977 0 R /H /I >> endobj 3992 0 obj << /Type /Annot /Subtype /Link /Rect [ 387.27 457.5 399.77 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2979 0 R /H /I >> endobj 3993 0 obj << /Type /Annot /Subtype /Link /Rect [ 453.1 445.5 465.6 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2981 0 R /H /I >> endobj 3994 0 obj << /Type /Annot /Subtype /Link /Rect [ 435.32 433.5 447.82 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2983 0 R /H /I >> endobj 3995 0 obj << /Type /Annot /Subtype /Link /Rect [ 377.27 421.5 389.77 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2985 0 R /H /I >> endobj 3996 0 obj << /Type /Annot /Subtype /Link /Rect [ 372.28 409.5 384.78 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2987 0 R /H /I >> endobj 3997 0 obj << /Type /Annot /Subtype /Link /Rect [ 374.5 397.5 387.0 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2989 0 R /H /I >> endobj 3998 0 obj << /Type /Annot /Subtype /Link /Rect [ 387.84 385.5 400.34 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2991 0 R /H /I >> endobj 3999 0 obj << /Type /Annot /Subtype /Link /Rect [ 398.39 373.5 410.89 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2993 0 R /H /I >> endobj 4000 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.39 361.5 390.89 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2995 0 R /H /I >> endobj 4001 0 obj << /Type /Annot /Subtype /Link /Rect [ 416.16 349.5 428.66 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2997 0 R /H /I >> endobj 4002 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.5 337.5 402.0 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2999 0 R /H /I >> endobj 4003 0 obj << /Type /Annot /Subtype /Link /Rect [ 407.0 337.5 424.5 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3001 0 R /H /I >> endobj 4004 0 obj << /Type /Annot /Subtype /Link /Rect [ 371.73 325.5 384.23 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3003 0 R /H /I >> endobj 4005 0 obj << /Type /Annot /Subtype /Link /Rect [ 372.27 313.5 384.77 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3005 0 R /H /I >> endobj 4006 0 obj << /Type /Annot /Subtype /Link /Rect [ 430.89 301.5 448.39 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3007 0 R /H /I >> endobj 4007 0 obj << /Type /Annot /Subtype /Link /Rect [ 399.22 261.5 411.72 270.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3009 0 R /H /I >> endobj 4008 0 obj << /Type /Annot /Subtype /Link /Rect [ 400.33 249.5 412.83 258.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3011 0 R /H /I >> endobj 4009 0 obj << /Type /Annot /Subtype /Link /Rect [ 390.04 237.5 407.54 246.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3013 0 R /H /I >> endobj 4010 0 obj << /Type /Annot /Subtype /Link /Rect [ 371.72 225.5 389.22 234.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3015 0 R /H /I >> endobj 4011 0 obj << /Type /Annot /Subtype /Link /Rect [ 359.77 213.5 377.27 222.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3017 0 R /H /I >> endobj 4012 0 obj << /Type /Annot /Subtype /Link /Rect [ 408.37 201.5 425.87 210.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3019 0 R /H /I >> endobj 4013 0 obj << /Type /Annot /Subtype /Link /Rect [ 401.71 189.5 419.21 198.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3021 0 R /H /I >> endobj 4014 0 obj << /Type /Annot /Subtype /Link /Rect [ 398.94 177.5 416.44 186.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3023 0 R /H /I >> endobj 4015 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.61 137.5 403.11 146.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3025 0 R /H /I >> endobj 4016 0 obj << /Type /Annot /Subtype /Link /Rect [ 425.32 125.5 437.82 134.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3027 0 R /H /I >> endobj 4017 0 obj << /Type /Annot /Subtype /Link /Rect [ 401.73 113.5 419.23 122.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3029 0 R /H /I >> endobj 4018 0 obj << /Type /Annot /Subtype /Link /Rect [ 441.97 73.5 454.47 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3031 0 R /H /I >> endobj 4019 0 obj << /Length 4020 0 R /Filter /FlateDecode >> stream xœÍ[Ûrã6}÷Wð1©ÚåÄxÔH°G‰,yHzf¼IÊ¥•5‰ªlÙ‘åÙäï ( ÒiPÊKvs)käÓà!Ðh4úôü~Á’ÌýûOÿC›<™=]üÞ~Ç'\µ_I•0ª¬Hž’ö…,’G<øè!íGÞ|Û¢7ø-ù|±¼È’«‹Ÿ~q ‡$KeòŸ‹ ß S]|t—*åª0Æ´\ó”…O•û0{JÞ ŸòdðÜ ·ìý@Ùÿœ}Ȉ³üÿ€Q–üzñ¾¾xw)–%õ×½ “fE–e¬àI‘òÜøò¤~J~úîj¾œ¯¦Épù0ÿãû_’ú‡ [·ï×7”»ÿtÚ¸ÑÁ/¤È¸Øîûý·î‘òÍwî›4—îEü¯ÛUmú_l?Êf–6?£³Ò¯Q3]çÃãË¡½!ËÒâ`!xƃé?t®¿yÖ`!ý³ãï“SõKÛ«mÒ«*[ÖÃÉøÉæÕv&,c)÷;ßpÖæik~„Î’<£éô{U L4KpPe$X¤" Ö ˜ð<å¼ÝxL>ôÊ^¿¶eRY¤ÄüÆñfÜEiÑ&ÕžˆÔÑ:RBDHMF£^dµx*ý›B£9¢UšEÑ! P„“ëÞÙ:Þt¡ÐÀ&5Q°BßQÍåòvÜ'çÆ(ç?Î lœÿÄÀŒ Sd4áx`¿ /3–fÀ:*&âË7å¤o·¥%ÜF¦÷Û… 4G´Ÿšš–E<¹œŒÎ›¨{Ê{52¸µ‹xmÕÿ`¯{èµEšù=¤ý9¶à(.DÇÑ’ “G·²oí¸óaŠT1g)FXS›Åáª@F"â»uï=µ$×=iŒ™”)?Jƒ`òÌR‡“Óæ6Í̧]ÌBƒA(f,gæ8z;f…ˆ0Ûä$ܸp³æSv¦‰a®Ü¬Eáäzº<™æV¯;g-ȯqjùEN­'ÏŠfUÝ»¾é 'ýFð3¡ b$„û…“ôòØFðÇN·»íNÝ-È8N¹ç‘|ênÝ•i‚§¢óhÂQ>WGœ»" A8}·OþZÒ 4'Â0£wKöî’û28ªŒp¿s™iJì^̉Pq4IÉÎnÃËËnN;{ŠSMq’Ù±Ó=L×óõâižL—Éb¹ž¯¾M“ÇÅÚk5Ä©*ÓÜ?2g‚ á:Õq8ˈ-‡ß2œ¼8N~Ú^ÉLsy391uƒ‰£ý2§<¾9û׾̑6©n*ÓYAû<ÍãhF,£8vÀÝ2ºÕ{›'ó?^Vó×W2Žf¾vä×DKb \B–ò8œeXK‘òØØÅ£„Ë©}”qFŒB]ŽMNRSâïºl>Ì©ÈG³#¼Ôáï&—דqý¡+éiÁyœäU Ï;^Ÿ­ý±ƒVœ=8%à¨8œ¢¥2 ôŽÖíu]Q² ,…#Poaâp’Ã`Wí%Û@ÎØþY0 U q8I-Ÿߣ• )öuS4tP”EtaTqpuÛõJ›¸›TE\âü™–·±‰L†ÅѦ¶4ç\øŸ³§³õæ-á½ñ`Dc¹y[™?KnŽ™À¸Jð–ηéj1ý÷#º—¿2ÓÔ{O‹Îþ3AÜ֎ˤŽÏdÐu!fç¤Þ\³`fÎЛö²w;ª“Ùãôí'GYÃI±¹’K¬C<°W¥µÕyÕ‚ÓrsP,0Óxô <°#ëõærr3Ã÷Ä“Z³Vûú!¡5£¾"ðÃ|µø6HÖ¤»×Ûu'Åf¤f9–½@¸Y)¯‡ãaUûÉì·éj:sÙðâu½˜õLuO+Ïܤ&Šf‚‚@! {Wã‰çÖáJÇÄi)Ú f&§.¦¨û›-½ÜÅ+TÎNŠÓý8gšàŠñ`Xõ'ã±ícÿKè­§•ií÷'¢©¶Ћ7&÷ŽOU—îSM”ØX¸'õiçIÁJœ(±¡^¼a…T¤¿ó6ý5çˆÒÒ§~Q4E”ÙA9¹éèåjnÇ­p†&ÍöÒ¢‰n.Ôf>d3—l[¡Œg(ÀÊËÝQôY ð†Jw7—»œg¬½mŸV‚ýå\ÆáDJ´VÑv.÷§Õ`œ÷ˆ¦ø€L»ås{dܭ縠ÆU„.jìÃêù%™=?¾=-“ÅÃ|¹X¯ÿL~mº^×Ï+¢ìÜYlbÛJ0wîESR9H³íälC®V3A'õ_ç2J¡£þÚ0Ø&e?×÷?O–(ö‰èiÑ×w¸Æá3Ð_7Ìè6@ík^~t%Îzµ/yEÑÐ Cɼ™®õrùBúd^ÁwÒ¢)^ ·†¼ÚU$¼škwZàÍà À)Z µ6´è>E.ÝIMW…Khªë„Õ† y·VI¿Uò-q÷A%µ¡²z~[/–˜S«F÷<)Ö* D´à¡‚Ú<=Ò¡¨ƒnÍÓ­º5Mtà¡vº!ëO,Ô>'=K¥-âh¢•KÒaéæDrC"-âh‰®H‡ílM̉ íÉ’^N¤]¼ =7Ö˜ØãhCãRÇI¨¡Px0žó@CóbTØ0än!»ûÂDíºMDÝ}"#÷ ÙÛ§ÚV¬L(ÂŽŒ`Q4Ñ/ì_šwwðÒV>ap9/u] öA5;ñ8œ‰6œDš,„;D3n\váÞª±°[ç endstream endobj 3919 0 obj [ 3918 0 R 3920 0 R 3921 0 R 3922 0 R 3923 0 R 3924 0 R 3925 0 R 3926 0 R 3927 0 R 3928 0 R 3929 0 R 3930 0 R 3931 0 R 3932 0 R 3933 0 R 3934 0 R 3935 0 R 3936 0 R 3937 0 R 3938 0 R 3939 0 R 3940 0 R 3941 0 R 3942 0 R 3943 0 R 3944 0 R 3945 0 R 3946 0 R 3947 0 R 3948 0 R 3949 0 R 3950 0 R 3951 0 R 3952 0 R 3953 0 R 3954 0 R 3955 0 R 3956 0 R 3957 0 R 3958 0 R 3959 0 R 3960 0 R 3961 0 R 3962 0 R 3963 0 R 3964 0 R 3965 0 R 3966 0 R 3967 0 R 3968 0 R 3969 0 R 3970 0 R 3971 0 R 3972 0 R 3973 0 R 3974 0 R 3975 0 R 3976 0 R 3977 0 R 3978 0 R 3979 0 R 3980 0 R 3981 0 R 3982 0 R 3983 0 R 3984 0 R 3985 0 R 3986 0 R 3987 0 R 3988 0 R 3989 0 R 3990 0 R 3991 0 R 3992 0 R 3993 0 R 3994 0 R 3995 0 R 3996 0 R 3997 0 R 3998 0 R 3999 0 R 4000 0 R 4001 0 R 4002 0 R 4003 0 R 4004 0 R 4005 0 R 4006 0 R 4007 0 R 4008 0 R 4009 0 R 4010 0 R 4011 0 R 4012 0 R 4013 0 R 4014 0 R 4015 0 R 4016 0 R 4017 0 R 4018 0 R ] endobj 3917 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 3919 0 R /Contents 4019 0 R >> endobj 4020 0 obj 2962 endobj 4022 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.6 709.5 183.1 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3033 0 R /H /I >> endobj 4024 0 obj << /Type /Annot /Subtype /Link /Rect [ 104.21 697.5 121.71 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3864 0 R /H /I >> endobj 4025 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.16 685.5 153.66 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3035 0 R /H /I >> endobj 4026 0 obj << /Type /Annot /Subtype /Link /Rect [ 149.49 673.5 161.99 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3037 0 R /H /I >> endobj 4027 0 obj << /Type /Annot /Subtype /Link /Rect [ 129.49 661.5 141.99 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3042 0 R /H /I >> endobj 4028 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.94 649.5 181.44 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3045 0 R /H /I >> endobj 4029 0 obj << /Type /Annot /Subtype /Link /Rect [ 193.38 637.5 210.88 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3047 0 R /H /I >> endobj 4030 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.04 599.1 187.54 608.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3049 0 R /H /I >> endobj 4031 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.16 587.1 158.66 596.1 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3051 0 R /H /I >> endobj 4032 0 obj << /Type /Annot /Subtype /Link /Rect [ 137.82 548.7 155.32 557.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3053 0 R /H /I >> endobj 4033 0 obj << /Type /Annot /Subtype /Link /Rect [ 155.05 536.7 167.55 545.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3055 0 R /H /I >> endobj 4034 0 obj << /Type /Annot /Subtype /Link /Rect [ 159.48 524.7 176.98 533.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3057 0 R /H /I >> endobj 4035 0 obj << /Type /Annot /Subtype /Link /Rect [ 122.28 512.7 134.78 521.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3059 0 R /H /I >> endobj 4036 0 obj << /Type /Annot /Subtype /Link /Rect [ 148.38 500.7 165.88 509.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3061 0 R /H /I >> endobj 4037 0 obj << /Type /Annot /Subtype /Link /Rect [ 147.83 488.7 165.33 497.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3063 0 R /H /I >> endobj 4038 0 obj << /Type /Annot /Subtype /Link /Rect [ 280.87 476.7 293.37 485.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3065 0 R /H /I >> endobj 4039 0 obj << /Type /Action /S /GoTo /D [1941 0 R /XYZ 72.0 175.57 null] >> endobj 4040 0 obj << /Type /Annot /Subtype /Link /Rect [ 115.06 464.7 132.56 473.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4039 0 R /H /I >> endobj 4041 0 obj << /Type /Annot /Subtype /Link /Rect [ 126.7 452.7 144.2 461.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3067 0 R /H /I >> endobj 4042 0 obj << /Type /Annot /Subtype /Link /Rect [ 147.83 440.7 165.33 449.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3069 0 R /H /I >> endobj 4043 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.38 428.7 155.88 437.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3071 0 R /H /I >> endobj 4044 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.37 416.7 220.87 425.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3073 0 R /H /I >> endobj 4045 0 obj << /Type /Annot /Subtype /Link /Rect [ 128.38 404.7 145.88 413.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3075 0 R /H /I >> endobj 4046 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.6 392.7 163.1 401.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3077 0 R /H /I >> endobj 4047 0 obj << /Type /Annot /Subtype /Link /Rect [ 195.6 380.7 213.1 389.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3079 0 R /H /I >> endobj 4048 0 obj << /Type /Annot /Subtype /Link /Rect [ 271.71 368.7 289.21 377.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3081 0 R /H /I >> endobj 4049 0 obj << /Type /Annot /Subtype /Link /Rect [ 240.04 356.7 257.54 365.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3083 0 R /H /I >> endobj 4050 0 obj << /Type /Annot /Subtype /Link /Rect [ 227.27 344.7 244.77 353.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3085 0 R /H /I >> endobj 4051 0 obj << /Type /Annot /Subtype /Link /Rect [ 173.09 332.7 190.59 341.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3087 0 R /H /I >> endobj 4052 0 obj << /Type /Annot /Subtype /Link /Rect [ 148.38 320.7 165.88 329.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3089 0 R /H /I >> endobj 4053 0 obj << /Type /Annot /Subtype /Link /Rect [ 154.2 308.7 171.7 317.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3091 0 R /H /I >> endobj 4054 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.81 296.7 220.31 305.7 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3093 0 R /H /I >> endobj 4055 0 obj << /Type /Annot /Subtype /Link /Rect [ 131.71 258.3 149.21 267.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3095 0 R /H /I >> endobj 4056 0 obj << /Type /Annot /Subtype /Link /Rect [ 159.22 246.3 176.72 255.3 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3097 0 R /H /I >> endobj 4057 0 obj << /Type /Annot /Subtype /Link /Rect [ 184.21 207.9 196.71 216.9 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3099 0 R /H /I >> endobj 4058 0 obj << /Type /Annot /Subtype /Link /Rect [ 132.54 169.5 150.04 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3101 0 R /H /I >> endobj 4059 0 obj << /Type /Annot /Subtype /Link /Rect [ 122.55 157.5 140.05 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3103 0 R /H /I >> endobj 4060 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.5 145.5 162.0 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3105 0 R /H /I >> endobj 4061 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.94 133.5 161.44 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3107 0 R /H /I >> endobj 4062 0 obj << /Type /Annot /Subtype /Link /Rect [ 136.72 121.5 154.22 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3109 0 R /H /I >> endobj 4063 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.82 109.5 170.32 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3111 0 R /H /I >> endobj 4064 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.92 97.5 156.42 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3113 0 R /H /I >> endobj 4065 0 obj << /Type /Annot /Subtype /Link /Rect [ 126.16 85.5 143.66 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3115 0 R /H /I >> endobj 4066 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.71 73.5 184.21 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3117 0 R /H /I >> endobj 4067 0 obj << /Type /Annot /Subtype /Link /Rect [ 388.38 709.5 405.88 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3119 0 R /H /I >> endobj 4068 0 obj << /Type /Annot /Subtype /Link /Rect [ 410.6 697.5 428.1 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3121 0 R /H /I >> endobj 4069 0 obj << /Type /Annot /Subtype /Link /Rect [ 443.94 685.5 461.44 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3123 0 R /H /I >> endobj 4070 0 obj << /Type /Annot /Subtype /Link /Rect [ 392.27 673.5 409.77 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3125 0 R /H /I >> endobj 4071 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.94 661.5 391.44 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3127 0 R /H /I >> endobj 4072 0 obj << /Type /Annot /Subtype /Link /Rect [ 383.38 649.5 400.88 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3129 0 R /H /I >> endobj 4073 0 obj << /Type /Annot /Subtype /Link /Rect [ 373.38 637.5 390.88 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3131 0 R /H /I >> endobj 4074 0 obj << /Type /Annot /Subtype /Link /Rect [ 388.11 625.5 405.61 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3133 0 R /H /I >> endobj 4075 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.94 613.5 396.44 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3135 0 R /H /I >> endobj 4076 0 obj << /Type /Annot /Subtype /Link /Rect [ 383.94 601.5 401.44 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3137 0 R /H /I >> endobj 4077 0 obj << /Type /Annot /Subtype /Link /Rect [ 392.26 562.5 409.76 571.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3139 0 R /H /I >> endobj 4078 0 obj << /Type /Annot /Subtype /Link /Rect [ 449.48 550.5 466.98 559.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3141 0 R /H /I >> endobj 4079 0 obj << /Type /Action /S /GoTo /D [1964 0 R /XYZ 72.0 542.816 null] >> endobj 4080 0 obj << /Type /Annot /Subtype /Link /Rect [ 366.16 538.5 383.66 547.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4079 0 R /H /I >> endobj 4081 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.38 526.5 395.88 535.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3143 0 R /H /I >> endobj 4082 0 obj << /Type /Annot /Subtype /Link /Rect [ 391.71 514.5 409.21 523.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3145 0 R /H /I >> endobj 4083 0 obj << /Type /Annot /Subtype /Link /Rect [ 376.16 502.5 393.66 511.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3147 0 R /H /I >> endobj 4084 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.49 490.5 406.99 499.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3149 0 R /H /I >> endobj 4085 0 obj << /Type /Annot /Subtype /Link /Rect [ 418.93 478.5 436.43 487.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3151 0 R /H /I >> endobj 4086 0 obj << /Type /Annot /Subtype /Link /Rect [ 381.16 439.5 398.66 448.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3153 0 R /H /I >> endobj 4087 0 obj << /Type /Annot /Subtype /Link /Rect [ 406.72 427.5 424.22 436.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3155 0 R /H /I >> endobj 4088 0 obj << /Type /Annot /Subtype /Link /Rect [ 397.28 415.5 414.78 424.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3157 0 R /H /I >> endobj 4089 0 obj << /Type /Annot /Subtype /Link /Rect [ 388.93 403.5 406.43 412.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3159 0 R /H /I >> endobj 4090 0 obj << /Type /Annot /Subtype /Link /Rect [ 401.99 391.5 419.49 400.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3161 0 R /H /I >> endobj 4091 0 obj << /Type /Annot /Subtype /Link /Rect [ 376.71 379.5 394.21 388.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3163 0 R /H /I >> endobj 4092 0 obj << /Type /Annot /Subtype /Link /Rect [ 388.38 367.5 405.88 376.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3165 0 R /H /I >> endobj 4093 0 obj << /Type /Annot /Subtype /Link /Rect [ 375.6 355.5 393.1 364.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3167 0 R /H /I >> endobj 4094 0 obj << /Type /Annot /Subtype /Link /Rect [ 375.6 343.5 393.1 352.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3169 0 R /H /I >> endobj 4095 0 obj << /Type /Annot /Subtype /Link /Rect [ 386.72 331.5 399.22 340.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3171 0 R /H /I >> endobj 4096 0 obj << /Type /Annot /Subtype /Link /Rect [ 419.2 319.5 436.7 328.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3173 0 R /H /I >> endobj 4097 0 obj << /Type /Annot /Subtype /Link /Rect [ 409.76 307.5 427.26 316.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3175 0 R /H /I >> endobj 4098 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.38 295.5 395.88 304.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3177 0 R /H /I >> endobj 4099 0 obj << /Type /Annot /Subtype /Link /Rect [ 373.38 283.5 390.88 292.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3179 0 R /H /I >> endobj 4100 0 obj << /Type /Annot /Subtype /Link /Rect [ 430.04 244.5 447.54 253.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3181 0 R /H /I >> endobj 4101 0 obj << /Type /Annot /Subtype /Link /Rect [ 370.05 232.5 382.55 241.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3183 0 R /H /I >> endobj 4102 0 obj << /Type /Annot /Subtype /Link /Rect [ 374.49 220.5 391.99 229.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3185 0 R /H /I >> endobj 4103 0 obj << /Type /Annot /Subtype /Link /Rect [ 407.82 208.5 425.32 217.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3187 0 R /H /I >> endobj 4104 0 obj << /Type /Annot /Subtype /Link /Rect [ 400.6 196.5 418.1 205.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3189 0 R /H /I >> endobj 4105 0 obj << /Type /Annot /Subtype /Link /Rect [ 383.12 157.5 395.62 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3191 0 R /H /I >> endobj 4106 0 obj << /Type /Annot /Subtype /Link /Rect [ 402.27 145.5 419.77 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3193 0 R /H /I >> endobj 4107 0 obj << /Type /Annot /Subtype /Link /Rect [ 343.11 133.5 360.61 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3195 0 R /H /I >> endobj 4108 0 obj << /Type /Annot /Subtype /Link /Rect [ 361.72 121.5 379.22 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3197 0 R /H /I >> endobj 4109 0 obj << /Type /Annot /Subtype /Link /Rect [ 438.38 109.5 455.88 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3199 0 R /H /I >> endobj 4110 0 obj << /Type /Annot /Subtype /Link /Rect [ 398.38 97.5 415.88 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3201 0 R /H /I >> endobj 4111 0 obj << /Type /Annot /Subtype /Link /Rect [ 387.83 85.5 405.33 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3203 0 R /H /I >> endobj 4112 0 obj << /Type /Annot /Subtype /Link /Rect [ 427.55 73.5 440.05 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3205 0 R /H /I >> endobj 4113 0 obj << /Length 4114 0 R /Filter /FlateDecode >> stream xœÍ[ÛrÛÈ}×Wà1©J`Ì3À#,AÖ$Á%AÙª­-•V¢½LI”—¢Ööß§‡„ §gèäa_ŠxzxÐèîéËè%ô÷ŸîÅæ2º{<ù£½&"+#eÚK©‰„M’EQûC–fу¾zë í[µ»Ú¢÷?ü½?YŸ$ÑÅÉ/¿è>Jâ4úr’Àâûeæ'?Ó—§&V&Ëó¼å*c‘eî+TlèÍÝcô¦z”ÑÙÓý½[(ùŸ³ï3RBþ0J¢O'o›“7çi$’¨ùØ™@žÇI–$‰ÈT”ÅJæîŒšÇè—¿],×ËÍíCT­ï—_ÿþkÔütR6íýí„w$éŸwfôêƒT'¯?陨ázw•þëXí¯Ñ•X¦t#ö©¶¯îƒïoÓ–ö¯^­´Kõ„‡Ïh§®¿òËýÃ:A‘ÄÙ«¡ÝSÿkãú‹µÒ}·ÿ~4ª²‰ÎªâbRÏ›êtþhgAª8uðL[¬‰V(3@'‘L†d6·÷Kà d,w “ €ul½`™I`A«+պܞŬ˜4åYôö˜˜<†°Ê”‚­ˆœ#­9"ÑçÍêÏÕÃòêÅÚX»˜l3ƒÂÎãÜ fظˆÏ°Ù<1(%"¹Ãš åLD¼à\“‘²hÊy}|YßmWOk4ZçšD¤Ö(`k/X0šÉ T/¦Õä"ª§å¬hªz‚~$¤ˆ•uú'ï…­âÌ‹2Ûãßœ+pôÀÇE’ÆZ‘ŽÉö÷—ßñLD"‹­[_Q¦±G—šzV¼(8‹§³„ åán c~¸°t,T[纩moú²^Ìü„úމ²!ÏD´ÈtX½igN½:mÃJR¯£æîWSž´C¯î—ëíêãj¹‰î~¿]17Cë µLΈšlÖ z”È„ŸÒýòãj½b•œ©8IÚ’”YÐiœúÑ:GZ´×¼Ug天škÿsÏ\l åíb -r´CI®4àt•ªyƒ.žÒÎì|6³#h[?:M ¥C*“ÅhäWŽ5]ÈAi@g]ÈA4¥Z)gÞPpÓsC:ÎmÚ8†¢ åG‹T =4²jr^ÏÆ»ˆ|3?½,ÇÅÍiÑ£úâfRŒK`(Òq±€29\à‚bºn™Œ'óµèùn³ú¼:šüÍ…)¡,# hò7?Z¦èpÒ€qO(ÝXÞ¯în·Ì.ï2+÷ÇF”É ¤-cN |2/g}þ•EtТÍíB2ß3ª&Ma»ïn É„íÌ öJ l¯·ËÍŸTÞþöüôð²]FôÃËÒ¯0¡z‹ë!\uþ€p!0J)Þ’¤—G4*RÚ®àM,# hRšÍò‘hãM9»*FÑöÛçå3ÚTÖ<( ;ŠèJDK†#Ÿß‹¦>­Çã*`ë.%ìˆÁ*ïcyŠÔ4Xûü†rí³z2º¾9£Àù¶˜—7çÕ¨œxæyl)ãKŒÌ’r©¸óÃYžâ<Ã3À\/Q¤ª ™Åîš~8ËÐB&Óc8/çsÚ‘)Á”.Ôji™µn)•ðÂY‚xÅ<:£¬¦šœ6-@P H\i”fA8Ù¬.Ã,Gÿøñ,¥CY¢¹,G'èÑŽ’_O™ŒÛ”›£èÜö8FÅäbÁÝ…éuP Ъkm Zh¬;(ë*”b#®BLõ®©)@;&^4åÈÄÊ!“ÓàVHø”‘Â<›q sšé!²uêl¯S‡Â€îµê-˜æaš tàctç( èž³#šSIÀlËÉEsèp$]3¥™ò£YF¬·zWö6*sr÷™°Œ0Ó˜Ó~4··FÈ•¨(û´8e$™jÃøÑ"Ã|Ýh°èº8Û%Áöh/‶]EôÁªË¦7ë‘Ú½Þ=þðœgT¿½©Î~,‹:6çéçP0çÉ`Î3ªO‹QSC*ì•aGg>»´Ô‹¦zŸ) =õ¥ySŒ§á ú±ŽŽ€„êE,@sÄ`4ãˆ5EQ|.{4FQ^j½`6 4Dç]DÖˆÙgM/–›¹¸à+‹~8œÌŒê 2úÐÆr°ç£# Û›¶àˆ‰ 0’!6MEt=Ž££Ê?2/˜ã’£)×ÓhµŽ6O/ÛÕškq˜X¸’;1¥g7^°àÚø ˜ð´Dž¾Ù lÈnÍŽ’Øp3«Æ?–“ p('A´°á^h9HzǤ×5^¯?.šÓËP!ꢃc'4#͆/šÒ{T.¥@CFnN‹ÙY5)FÁÑP6Ö¶¼á:§zÂ9z†°ùõ¸||Ú|‹^žÙîö!‘@ÁP"hip¹jªœ]”Ç[É(j%#Z(¬me¢†dªÉ"´Íؼ¬b(Í’ô£Ö>#¦]‡‚†îæ½(Ê¨ÓøÑ\P•캞„ÒôþY Æ@´È˜'¦†F¶#äÆXK(¶:¡D f„Spõô<±ÌMy^DzI –I»O3ó½y±¾}\F›ån’qlÆÒ¡?¢G(úŒò­ÖŸÜ^ú¯'ÚIï£ííoÌñ—¼W4â"\ºïG ‰¹J¤—Øóòay·VÏ8?ÌÒn k0+ëG³¼Üa·W¨IÑ,fÅ(r2.í8#Š2.¢ýh®a§¤Ò)?4ÑU1Z”Ñy=Cýô¼…á¹ÉÎÃMéRC³›ÔC5¦W5¢(×{ð£Ùš'›ëbWç?ØZé`kÐ\wF™¡™íúêÕdºÀã¦?ÿA&ä'~4¥]HÆlýò¸Ü¬îȹ¶îàm˜HšJXd”A/(i¨N}£Ë^BYfÇ’~´`èä±[í§Î˯”‡>?ó‘í"¸·?\$¼µ€àýŠœ¿Ñ`»œAf½„á,3 F~5’Ázèàt(ÊýÍ9Vµ¯ó¢~ñŠ¢¡êÑ:¾†IDÈ 4•í¯×¯O›²¹9ÖQu'-~\'é½ùÂ^Ÿí¼fÍe9Û¹-Y׿GAv˜áE ¬;4ø€ %ú3~‹¦@y8È‹‚̆Õ)´HÆ …d®ÊÙ¨˜Î5lÞ;‰ 0CåGs#çTŠAÏuO*tì°×Dq ÔëN"úX‹ ÕvàÓ€Sà hZ̨H GŽ')Gn nÀstE¦oüh‹ùÎŒ>ß>?yÚÜGwOŸ–_WÛoø¸{ Í㣩¼×ÑD´L˜Ç ƒ£iÑ\â/ˆ®Iv|2¥T×%c&S·œM+¿Áéü?™K¥28—âÆ0+šÖójwž ˜ÍB®àuÖ£**¼ö;„;BÀL¨˜6޾s 8hŸÔÑ!UÖÛD™!áqx4­ß—êý£ŠÇçTý£Šÿíœj:«ÆÅì:zW^»ó ÏÛÍíjE"EÄîœöñaÕnóôÃÓ6æ·¿˜öóÉ¿ " endstream endobj 4023 0 obj [ 4022 0 R 4024 0 R 4025 0 R 4026 0 R 4027 0 R 4028 0 R 4029 0 R 4030 0 R 4031 0 R 4032 0 R 4033 0 R 4034 0 R 4035 0 R 4036 0 R 4037 0 R 4038 0 R 4040 0 R 4041 0 R 4042 0 R 4043 0 R 4044 0 R 4045 0 R 4046 0 R 4047 0 R 4048 0 R 4049 0 R 4050 0 R 4051 0 R 4052 0 R 4053 0 R 4054 0 R 4055 0 R 4056 0 R 4057 0 R 4058 0 R 4059 0 R 4060 0 R 4061 0 R 4062 0 R 4063 0 R 4064 0 R 4065 0 R 4066 0 R 4067 0 R 4068 0 R 4069 0 R 4070 0 R 4071 0 R 4072 0 R 4073 0 R 4074 0 R 4075 0 R 4076 0 R 4077 0 R 4078 0 R 4080 0 R 4081 0 R 4082 0 R 4083 0 R 4084 0 R 4085 0 R 4086 0 R 4087 0 R 4088 0 R 4089 0 R 4090 0 R 4091 0 R 4092 0 R 4093 0 R 4094 0 R 4095 0 R 4096 0 R 4097 0 R 4098 0 R 4099 0 R 4100 0 R 4101 0 R 4102 0 R 4103 0 R 4104 0 R 4105 0 R 4106 0 R 4107 0 R 4108 0 R 4109 0 R 4110 0 R 4111 0 R 4112 0 R ] endobj 4021 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 4023 0 R /Contents 4113 0 R >> endobj 4114 0 obj 2854 endobj 4116 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.17 709.5 153.67 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3207 0 R /H /I >> endobj 4118 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.05 669.5 177.55 678.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3209 0 R /H /I >> endobj 4119 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.27 629.5 174.77 638.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3214 0 R /H /I >> endobj 4120 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.16 617.5 158.66 626.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3217 0 R /H /I >> endobj 4121 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.04 605.5 187.54 614.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3219 0 R /H /I >> endobj 4122 0 obj << /Type /Annot /Subtype /Link /Rect [ 218.11 593.5 230.61 602.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3221 0 R /H /I >> endobj 4123 0 obj << /Type /Annot /Subtype /Link /Rect [ 204.5 581.5 222.0 590.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3223 0 R /H /I >> endobj 4124 0 obj << /Type /Annot /Subtype /Link /Rect [ 252.28 569.5 269.78 578.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3225 0 R /H /I >> endobj 4125 0 obj << /Type /Annot /Subtype /Link /Rect [ 212.28 557.5 229.78 566.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3227 0 R /H /I >> endobj 4126 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.94 545.5 191.44 554.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3229 0 R /H /I >> endobj 4127 0 obj << /Type /Annot /Subtype /Link /Rect [ 119.22 533.5 131.72 542.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3231 0 R /H /I >> endobj 4128 0 obj << /Type /Annot /Subtype /Link /Rect [ 222.55 521.5 240.05 530.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3233 0 R /H /I >> endobj 4129 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.61 509.5 168.11 518.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3235 0 R /H /I >> endobj 4130 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.28 497.5 174.78 506.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3237 0 R /H /I >> endobj 4131 0 obj << /Type /Annot /Subtype /Link /Rect [ 188.38 485.5 205.88 494.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3239 0 R /H /I >> endobj 4132 0 obj << /Type /Annot /Subtype /Link /Rect [ 117.0 473.5 134.5 482.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3241 0 R /H /I >> endobj 4133 0 obj << /Type /Annot /Subtype /Link /Rect [ 122.56 461.5 140.06 470.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3243 0 R /H /I >> endobj 4134 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.28 449.5 174.78 458.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3245 0 R /H /I >> endobj 4135 0 obj << /Type /Annot /Subtype /Link /Rect [ 117.55 437.5 130.05 446.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3247 0 R /H /I >> endobj 4136 0 obj << /Type /Annot /Subtype /Link /Rect [ 146.16 425.5 158.66 434.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3249 0 R /H /I >> endobj 4137 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.38 413.5 160.88 422.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3251 0 R /H /I >> endobj 4138 0 obj << /Type /Annot /Subtype /Link /Rect [ 261.99 401.5 274.49 410.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3253 0 R /H /I >> endobj 4139 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.44 389.5 208.94 398.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3255 0 R /H /I >> endobj 4140 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.99 377.5 209.49 386.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3257 0 R /H /I >> endobj 4141 0 obj << /Type /Annot /Subtype /Link /Rect [ 185.33 365.5 197.83 374.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3259 0 R /H /I >> endobj 4142 0 obj << /Type /Annot /Subtype /Link /Rect [ 173.66 353.5 186.16 362.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3261 0 R /H /I >> endobj 4143 0 obj << /Type /Annot /Subtype /Link /Rect [ 186.44 341.5 198.94 350.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3263 0 R /H /I >> endobj 4144 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.89 329.5 143.39 338.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3265 0 R /H /I >> endobj 4145 0 obj << /Type /Annot /Subtype /Link /Rect [ 204.77 317.5 217.27 326.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3267 0 R /H /I >> endobj 4146 0 obj << /Type /Annot /Subtype /Link /Rect [ 185.32 305.5 202.82 314.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3269 0 R /H /I >> endobj 4147 0 obj << /Type /Annot /Subtype /Link /Rect [ 181.43 293.5 198.93 302.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3271 0 R /H /I >> endobj 4148 0 obj << /Type /Annot /Subtype /Link /Rect [ 207.54 281.5 220.04 290.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3273 0 R /H /I >> endobj 4149 0 obj << /Type /Annot /Subtype /Link /Rect [ 181.99 269.5 194.49 278.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3275 0 R /H /I >> endobj 4150 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.1 257.5 195.6 266.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3277 0 R /H /I >> endobj 4151 0 obj << /Type /Annot /Subtype /Link /Rect [ 208.09 245.5 220.59 254.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3279 0 R /H /I >> endobj 4152 0 obj << /Type /Annot /Subtype /Link /Rect [ 216.43 233.5 228.93 242.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3281 0 R /H /I >> endobj 4153 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.43 221.5 208.93 230.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3283 0 R /H /I >> endobj 4154 0 obj << /Type /Annot /Subtype /Link /Rect [ 127.83 209.5 145.33 218.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3285 0 R /H /I >> endobj 4155 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.05 197.5 167.55 206.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3287 0 R /H /I >> endobj 4156 0 obj << /Type /Annot /Subtype /Link /Rect [ 126.44 185.5 138.94 194.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3289 0 R /H /I >> endobj 4157 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.94 173.5 201.44 182.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3291 0 R /H /I >> endobj 4158 0 obj << /Type /Annot /Subtype /Link /Rect [ 159.49 161.5 176.99 170.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3293 0 R /H /I >> endobj 4159 0 obj << /Type /Annot /Subtype /Link /Rect [ 161.98 149.5 179.48 158.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3295 0 R /H /I >> endobj 4160 0 obj << /Type /Annot /Subtype /Link /Rect [ 139.5 137.5 157.0 146.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3297 0 R /H /I >> endobj 4161 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.5 125.5 162.0 134.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3299 0 R /H /I >> endobj 4162 0 obj << /Type /Annot /Subtype /Link /Rect [ 132.55 85.5 145.05 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3301 0 R /H /I >> endobj 4163 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.71 73.5 184.21 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3303 0 R /H /I >> endobj 4164 0 obj << /Type /Annot /Subtype /Link /Rect [ 377.82 709.5 390.32 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3305 0 R /H /I >> endobj 4165 0 obj << /Type /Annot /Subtype /Link /Rect [ 372.0 697.5 384.5 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3307 0 R /H /I >> endobj 4166 0 obj << /Type /Annot /Subtype /Link /Rect [ 350.9 685.5 368.4 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3309 0 R /H /I >> endobj 4167 0 obj << /Type /Annot /Subtype /Link /Rect [ 382.82 673.5 400.32 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3311 0 R /H /I >> endobj 4168 0 obj << /Type /Annot /Subtype /Link /Rect [ 392.83 661.5 410.33 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3313 0 R /H /I >> endobj 4169 0 obj << /Type /Annot /Subtype /Link /Rect [ 487.82 649.5 505.32 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3315 0 R /H /I >> endobj 4170 0 obj << /Type /Action /S /GoTo /D [2496 0 R /XYZ 72.0 429.358 null] >> endobj 4171 0 obj << /Type /Annot /Subtype /Link /Rect [ 348.66 637.5 356.16 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4170 0 R /H /I >> endobj 4172 0 obj << /Type /Action /S /GoTo /D [1884 0 R /XYZ 72.0 575.792 null] >> endobj 4173 0 obj << /Type /Annot /Subtype /Link /Rect [ 361.16 637.5 378.66 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4172 0 R /H /I >> endobj 4174 0 obj << /Type /Annot /Subtype /Link /Rect [ 383.66 637.5 401.16 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3714 0 R /H /I >> endobj 4175 0 obj << /Type /Annot /Subtype /Link /Rect [ 353.67 625.5 371.17 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3317 0 R /H /I >> endobj 4176 0 obj << /Type /Annot /Subtype /Link /Rect [ 422.83 613.5 440.33 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3319 0 R /H /I >> endobj 4177 0 obj << /Type /Annot /Subtype /Link /Rect [ 445.05 601.5 462.55 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3321 0 R /H /I >> endobj 4178 0 obj << /Type /Annot /Subtype /Link /Rect [ 374.78 589.5 387.28 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3323 0 R /H /I >> endobj 4179 0 obj << /Type /Annot /Subtype /Link /Rect [ 408.94 577.5 426.44 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3325 0 R /H /I >> endobj 4180 0 obj << /Type /Annot /Subtype /Link /Rect [ 488.37 565.5 505.87 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3327 0 R /H /I >> endobj 4181 0 obj << /Type /Annot /Subtype /Link /Rect [ 449.49 553.5 466.99 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3329 0 R /H /I >> endobj 4182 0 obj << /Type /Annot /Subtype /Link /Rect [ 423.95 541.5 441.45 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3331 0 R /H /I >> endobj 4183 0 obj << /Type /Annot /Subtype /Link /Rect [ 406.16 529.5 418.66 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3333 0 R /H /I >> endobj 4184 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.05 517.5 397.55 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3335 0 R /H /I >> endobj 4185 0 obj << /Type /Annot /Subtype /Link /Rect [ 506.98 505.5 524.48 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3337 0 R /H /I >> endobj 4186 0 obj << /Type /Annot /Subtype /Link /Rect [ 406.17 493.5 418.67 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3339 0 R /H /I >> endobj 4187 0 obj << /Type /Annot /Subtype /Link /Rect [ 312.0 469.5 327.0 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3341 0 R /H /I >> endobj 4188 0 obj << /Type /Annot /Subtype /Link /Rect [ 450.32 457.5 467.82 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3343 0 R /H /I >> endobj 4189 0 obj << /Type /Annot /Subtype /Link /Rect [ 521.98 445.5 534.48 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3345 0 R /H /I >> endobj 4190 0 obj << /Type /Annot /Subtype /Link /Rect [ 312.0 421.5 327.0 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3347 0 R /H /I >> endobj 4191 0 obj << /Type /Annot /Subtype /Link /Rect [ 345.89 397.5 363.39 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3349 0 R /H /I >> endobj 4192 0 obj << /Type /Annot /Subtype /Link /Rect [ 500.88 385.5 518.38 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3351 0 R /H /I >> endobj 4193 0 obj << /Type /Annot /Subtype /Link /Rect [ 483.09 373.5 500.59 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3353 0 R /H /I >> endobj 4194 0 obj << /Type /Annot /Subtype /Link /Rect [ 407.0 361.5 424.5 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3355 0 R /H /I >> endobj 4195 0 obj << /Type /Annot /Subtype /Link /Rect [ 312.0 337.5 327.0 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3357 0 R /H /I >> endobj 4196 0 obj << /Type /Annot /Subtype /Link /Rect [ 470.33 325.5 487.83 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3359 0 R /H /I >> endobj 4197 0 obj << /Type /Annot /Subtype /Link /Rect [ 490.33 313.5 507.83 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3361 0 R /H /I >> endobj 4198 0 obj << /Type /Annot /Subtype /Link /Rect [ 517.55 301.5 535.05 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3363 0 R /H /I >> endobj 4199 0 obj << /Type /Annot /Subtype /Link /Rect [ 479.21 289.5 496.71 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3365 0 R /H /I >> endobj 4200 0 obj << /Type /Annot /Subtype /Link /Rect [ 449.5 277.5 467.0 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3367 0 R /H /I >> endobj 4201 0 obj << /Type /Annot /Subtype /Link /Rect [ 476.45 265.5 493.95 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3369 0 R /H /I >> endobj 4202 0 obj << /Type /Annot /Subtype /Link /Rect [ 477.29 253.5 494.79 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3371 0 R /H /I >> endobj 4203 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.22 241.5 516.72 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3373 0 R /H /I >> endobj 4204 0 obj << /Type /Annot /Subtype /Link /Rect [ 435.61 229.5 453.11 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3375 0 R /H /I >> endobj 4205 0 obj << /Type /Annot /Subtype /Link /Rect [ 476.44 217.5 493.94 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3377 0 R /H /I >> endobj 4206 0 obj << /Type /Annot /Subtype /Link /Rect [ 477.56 205.5 495.06 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3379 0 R /H /I >> endobj 4207 0 obj << /Type /Annot /Subtype /Link /Rect [ 479.22 193.5 496.72 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3381 0 R /H /I >> endobj 4208 0 obj << /Type /Annot /Subtype /Link /Rect [ 478.66 181.5 496.16 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3383 0 R /H /I >> endobj 4209 0 obj << /Type /Annot /Subtype /Link /Rect [ 475.89 169.5 493.39 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3385 0 R /H /I >> endobj 4210 0 obj << /Type /Annot /Subtype /Link /Rect [ 474.77 157.5 492.27 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3387 0 R /H /I >> endobj 4211 0 obj << /Type /Annot /Subtype /Link /Rect [ 522.706 145.5 540.001 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3389 0 R /H /I >> endobj 4212 0 obj << /Type /Annot /Subtype /Link /Rect [ 445.06 133.5 462.56 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3391 0 R /H /I >> endobj 4213 0 obj << /Type /Annot /Subtype /Link /Rect [ 467.56 133.5 485.06 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3393 0 R /H /I >> endobj 4214 0 obj << /Type /Annot /Subtype /Link /Rect [ 487.54 121.5 505.04 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3395 0 R /H /I >> endobj 4215 0 obj << /Type /Annot /Subtype /Link /Rect [ 506.99 109.5 524.49 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3397 0 R /H /I >> endobj 4216 0 obj << /Type /Annot /Subtype /Link /Rect [ 513.38 97.5 530.88 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3399 0 R /H /I >> endobj 4217 0 obj << /Type /Annot /Subtype /Link /Rect [ 365.89 73.5 383.39 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3401 0 R /H /I >> endobj 4218 0 obj << /Length 4219 0 R /Filter /FlateDecode >> stream xœÍ[]sÛ6}÷¯Àc3Ó2@‚à¾Ñ­°¥D‡¤â$ŽÇµÕgb»¶ûï )â¹ òÔÝ4KðÁå!pqq¿òÇg¡ùïû#I»}8ûcã,Lªa(VŒ' 5{`ÃköÙ>ZÈðQv£ºÿò‰]=ž…luöó/tÇ f… ¼Óœ½5U •NÓtà*®µ}„ ”ùpûÀ^‚-Ÿ:ôž½þÏÙ»Œ$ÿŒBöï³óöìõEÌxÈÚßFHÓ Ôar-™¤HíÁÚöów«ÝãîËÍgV<Þíþ~õ k<ËÛáýºÉ ó7 :5:úE…Ç¿qTì0>Žšÿ£@öcf$±yû«Ïî?í/öãn•úŸÞUD9“§{Ô-×?ùpÿv$v"}´2Œå?V®xÕ`#í³ýï‚R]nÏËbÁêªÌ¿gý[Ð* ¸2P͘7Å&

                  ¬Ö=øõ…´ëM(É8ejt>R=þíNðŒp9¼Íê6¯Ùo_o_îŸá-´ÂØÌ0»†³§àÔ,¸Ìu<û"ÉôEê™ÑSéu¶,²M3ó"q ì+ál'AâsNàFÂm–~6rØ•RŠ˜Kª‡Mò1wÌ”ÏU[½Éßû9¥f«#3%4š‡ó§hË#öÃy#)MIåyoÚ"+¯Õ¦ië¬Ø´ P3:pn¦8!á:P~x’ 5©€Ú*y½ÎÚÅ›|F¯¸ÖÊÁ|ÄQ(r™àè \ší¹Y¡b³ºÎê:û0ÃI3—X{’hBÂEøáçì5§S—ŽMR’¨çM±Úd%kÚ¬Í×9¥èܬ¿}NbØZÆyÒ*NÜã…bõ×Þ¨\&Ä,@õõ£¹$ÔWi`ò.¯›oU˜>«,€&•Å\ @©ú‰°?±¹Ø;4"&Úz ^tJhG*H´D££„3­FG ÑFS2ÅêÍœ•áãáÁÉ€–ãÙA4µK’ƒ ›e¹Î¶í›ª.>fmQm®—y³¨‹Ë¶ª WI§AjÜèÐì!! àf•"?œp•¤Õ¶ U¹]o®WÆï¥8ã„®K”€pç2F8Å*í¶¬êjÛ›|ŽVj3‰V„„'Aä‡S´bPvK«ÍÎK?).G[‡Ú§H)PzKj»l½”B'ÁéwN-Â)J ©öÛ&[ͬ“«S €º÷R?œ"¥ M/ϳÅOxŸ˜KÒ*F*SbDƈøÑ„ï…„vwLX[Í9µÒúÎæ#‘BˆÅÜA^8EŒ£~oÀ—Ýݼì^îv´–s»*%ÄZî‡sÛ TsËíñëï»/3ñ‰uíí %'„ 3¤~8Gµ½·SƒíôžØMs3K«6"%d \ÛŒŠN(|¡Â÷¼~Ìj)³ZŠpµÄhBN‘R¨û=©ËºxW”&î¤lB«-:J ”2Æ~8Å*!¿cµÿéÛC„öý•Œ!ÔÆ~8ELZßjò·Û|³ð23.vd3Æ$¤P)™Ô§˜¥>­ï¯C-ë9Žˆ =?ÝÞøbßC| vp‚wD›€I q߈¶Žˆ¬ìvÙ“¤$1 Ðv·¼hj·†@Ðeru½Ù®Ïç²ØÞßý(bÖ³@8OQ¹ãX!/Ck&Þs|Iœ hÇÊ"šd¤4(Ò_ìÏ›Ï_wl÷÷ï_vÏÏ$-û «R" gl­¹ÍCÌnÆzªpõe6—)·á?N‚@I¦¬8UnëbfŸ›ßÅY£@žš‡âé¤èÑìñDÑCÁñ{~*ƒxœh9ñˆ&ü>‡â@…•ù»¼ÄêB$Ýjb6 “@øÑ<r?yëTðDdÞ>|sõîùöÓîáfŸåÄ%t<ÎS<«ú>¬"r1áÓ,Þäë¬Íˆ}D0`¬†Š0ž½ëÓðPãtØ”@Èc‰s ÄƒÈ ÐÊ{ÞÝ|¹ýÄnŸïîé#:¾ÿ©|aâÆ5䔡œ®J¾¨æŠwÆÎŒ.À©Ü·v‚yj¢îÑš&£{:ÍuSXçm],7ó)*žŵ%D ”†h«¯>4EPOSÓϻۯ_î_ÐW2¾®êÝêg8 ¸^žÂ&ƒ s2»iU*òÉ{R@¢qØM)]íæ~h >Žn g¬ZñyAœª"O3{«HM8õ#£î{7î×u¾®êDð†yð+Ckð³›Äwǧ4OD HÅê»(ê†hPŽ3޲®FWáäZA{º¼©X–ÛðTïkÔ§KÌÖ'~¸àèsEÐéAð[mˬöí©vúqQÕ•øáäC PlŠTiTŽ-¯(„*r?œbC2û°i³÷ly.<Ê·/£î>QNá‚c›eÌ¡"âá·nhå‹mª/‰! áÖÐyá$?e¿?GóPièüp’ŸœV}üª½}îæ>QÅûá‚H%ÆÑ´¤èãw¹¢ÖÏñ…Qõ:Ò'ù©iÉøµË…qŠËœ¸h¹rº³Pi+ýpÊøÅ u>^Ùbѱ×X¾ûÏ&\ß4¥Í,FÚbül{»àÃWˆë ±GEª˜ààŸ&ƒ3ak¨‰i‚Õ\}ò€í©R)Ýýa)tJ× Çµïÿ…„wá¼Î>€òugè“K•ž<ëÛMñv›{W§û …Q¾nè‡Sn¡ gO{›¿ßÇ•C”I´ ®}Zå‘ .?œº4Ì“´Ç&ë‚ ëi·u…ñ¥ˆå!\Žñ2©„Ñ)0$½Ìµ*&I¯~È%>ŽÚLÇ¡jƒƒ ½yõ‹² JO±c’O·ÄŽEFôá͇Èýöì¿fßÓ endstream endobj 4117 0 obj [ 4116 0 R 4118 0 R 4119 0 R 4120 0 R 4121 0 R 4122 0 R 4123 0 R 4124 0 R 4125 0 R 4126 0 R 4127 0 R 4128 0 R 4129 0 R 4130 0 R 4131 0 R 4132 0 R 4133 0 R 4134 0 R 4135 0 R 4136 0 R 4137 0 R 4138 0 R 4139 0 R 4140 0 R 4141 0 R 4142 0 R 4143 0 R 4144 0 R 4145 0 R 4146 0 R 4147 0 R 4148 0 R 4149 0 R 4150 0 R 4151 0 R 4152 0 R 4153 0 R 4154 0 R 4155 0 R 4156 0 R 4157 0 R 4158 0 R 4159 0 R 4160 0 R 4161 0 R 4162 0 R 4163 0 R 4164 0 R 4165 0 R 4166 0 R 4167 0 R 4168 0 R 4169 0 R 4171 0 R 4173 0 R 4174 0 R 4175 0 R 4176 0 R 4177 0 R 4178 0 R 4179 0 R 4180 0 R 4181 0 R 4182 0 R 4183 0 R 4184 0 R 4185 0 R 4186 0 R 4187 0 R 4188 0 R 4189 0 R 4190 0 R 4191 0 R 4192 0 R 4193 0 R 4194 0 R 4195 0 R 4196 0 R 4197 0 R 4198 0 R 4199 0 R 4200 0 R 4201 0 R 4202 0 R 4203 0 R 4204 0 R 4205 0 R 4206 0 R 4207 0 R 4208 0 R 4209 0 R 4210 0 R 4211 0 R 4212 0 R 4213 0 R 4214 0 R 4215 0 R 4216 0 R 4217 0 R ] endobj 4115 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 4117 0 R /Contents 4218 0 R >> endobj 4219 0 obj 3138 endobj 4221 0 obj << /Type /Annot /Subtype /Link /Rect [ 223.37 709.5 240.87 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3403 0 R /H /I >> endobj 4223 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.55 697.5 165.05 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3405 0 R /H /I >> endobj 4224 0 obj << /Type /Annot /Subtype /Link /Rect [ 142.83 685.5 155.33 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3407 0 R /H /I >> endobj 4225 0 obj << /Type /Annot /Subtype /Link /Rect [ 186.43 673.5 198.93 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3409 0 R /H /I >> endobj 4226 0 obj << /Type /Annot /Subtype /Link /Rect [ 227.84 661.5 245.34 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3411 0 R /H /I >> endobj 4227 0 obj << /Type /Annot /Subtype /Link /Rect [ 191.73 649.5 209.23 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3413 0 R /H /I >> endobj 4228 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.95 637.5 201.45 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3418 0 R /H /I >> endobj 4229 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.45 625.5 183.95 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3421 0 R /H /I >> endobj 4230 0 obj << /Type /Annot /Subtype /Link /Rect [ 180.62 613.5 198.12 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3423 0 R /H /I >> endobj 4231 0 obj << /Type /Annot /Subtype /Link /Rect [ 147.0 601.5 164.5 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3425 0 R /H /I >> endobj 4232 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.61 589.5 188.11 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3427 0 R /H /I >> endobj 4233 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.22 577.5 161.72 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3429 0 R /H /I >> endobj 4234 0 obj << /Type /Annot /Subtype /Link /Rect [ 167.83 565.5 185.33 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3431 0 R /H /I >> endobj 4235 0 obj << /Type /Annot /Subtype /Link /Rect [ 158.12 553.5 175.62 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3433 0 R /H /I >> endobj 4236 0 obj << /Type /Annot /Subtype /Link /Rect [ 204.52 541.5 222.02 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3435 0 R /H /I >> endobj 4237 0 obj << /Type /Annot /Subtype /Link /Rect [ 194.49 529.5 211.99 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3437 0 R /H /I >> endobj 4238 0 obj << /Type /Annot /Subtype /Link /Rect [ 177.54 517.5 195.04 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3439 0 R /H /I >> endobj 4239 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.61 505.5 173.11 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3441 0 R /H /I >> endobj 4240 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.1 493.5 195.6 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3443 0 R /H /I >> endobj 4241 0 obj << /Type /Annot /Subtype /Link /Rect [ 149.5 481.5 162.0 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3445 0 R /H /I >> endobj 4242 0 obj << /Type /Annot /Subtype /Link /Rect [ 159.5 469.5 177.0 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3447 0 R /H /I >> endobj 4243 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.73 457.5 164.23 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3449 0 R /H /I >> endobj 4244 0 obj << /Type /Annot /Subtype /Link /Rect [ 123.39 445.5 135.89 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3451 0 R /H /I >> endobj 4245 0 obj << /Type /Annot /Subtype /Link /Rect [ 220.32 433.5 237.82 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3453 0 R /H /I >> endobj 4246 0 obj << /Type /Annot /Subtype /Link /Rect [ 123.39 421.5 135.89 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3455 0 R /H /I >> endobj 4247 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.95 409.5 151.45 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3457 0 R /H /I >> endobj 4248 0 obj << /Type /Annot /Subtype /Link /Rect [ 222.54 397.5 235.04 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3459 0 R /H /I >> endobj 4249 0 obj << /Type /Annot /Subtype /Link /Rect [ 231.46 385.5 243.96 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3461 0 R /H /I >> endobj 4250 0 obj << /Type /Annot /Subtype /Link /Rect [ 257.01 373.5 269.51 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3463 0 R /H /I >> endobj 4251 0 obj << /Type /Annot /Subtype /Link /Rect [ 189.78 361.5 202.28 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3465 0 R /H /I >> endobj 4252 0 obj << /Type /Annot /Subtype /Link /Rect [ 209.47 349.5 221.97 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3467 0 R /H /I >> endobj 4253 0 obj << /Type /Annot /Subtype /Link /Rect [ 171.45 337.5 183.95 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3469 0 R /H /I >> endobj 4254 0 obj << /Type /Annot /Subtype /Link /Rect [ 214.5 325.5 227.0 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3471 0 R /H /I >> endobj 4255 0 obj << /Type /Annot /Subtype /Link /Rect [ 198.94 313.5 211.44 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 4256 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.0 301.5 169.5 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3475 0 R /H /I >> endobj 4257 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.5 301.5 192.0 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3477 0 R /H /I >> endobj 4258 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.88 289.5 163.38 298.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3479 0 R /H /I >> endobj 4259 0 obj << /Type /Annot /Subtype /Link /Rect [ 167.83 277.5 180.33 286.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3481 0 R /H /I >> endobj 4260 0 obj << /Type /Annot /Subtype /Link /Rect [ 134.21 265.5 151.71 274.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3483 0 R /H /I >> endobj 4261 0 obj << /Type /Annot /Subtype /Link /Rect [ 175.6 253.5 193.1 262.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3485 0 R /H /I >> endobj 4262 0 obj << /Type /Annot /Subtype /Link /Rect [ 136.16 241.5 153.66 250.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3487 0 R /H /I >> endobj 4263 0 obj << /Type /Annot /Subtype /Link /Rect [ 128.94 229.5 146.44 238.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3489 0 R /H /I >> endobj 4264 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.39 217.5 195.89 226.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3491 0 R /H /I >> endobj 4265 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.33 205.5 177.83 214.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3493 0 R /H /I >> endobj 4266 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.6 193.5 178.1 202.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3495 0 R /H /I >> endobj 4267 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.95 181.5 161.45 190.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3497 0 R /H /I >> endobj 4268 0 obj << /Type /Annot /Subtype /Link /Rect [ 119.79 169.5 132.29 178.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3499 0 R /H /I >> endobj 4269 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.73 157.5 169.23 166.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3501 0 R /H /I >> endobj 4270 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.45 145.5 163.95 154.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3503 0 R /H /I >> endobj 4271 0 obj << /Type /Annot /Subtype /Link /Rect [ 218.65 133.5 231.15 142.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3505 0 R /H /I >> endobj 4272 0 obj << /Type /Annot /Subtype /Link /Rect [ 153.67 121.5 166.17 130.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 4273 0 obj << /Type /Annot /Subtype /Link /Rect [ 132.01 109.5 144.51 118.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 4274 0 obj << /Type /Annot /Subtype /Link /Rect [ 133.66 97.5 146.16 106.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3511 0 R /H /I >> endobj 4275 0 obj << /Type /Annot /Subtype /Link /Rect [ 184.78 85.5 197.28 94.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3513 0 R /H /I >> endobj 4276 0 obj << /Type /Annot /Subtype /Link /Rect [ 210.01 73.5 227.51 82.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3515 0 R /H /I >> endobj 4277 0 obj << /Type /Annot /Subtype /Link /Rect [ 418.06 709.5 435.56 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3517 0 R /H /I >> endobj 4278 0 obj << /Type /Annot /Subtype /Link /Rect [ 419.2 697.5 431.7 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3519 0 R /H /I >> endobj 4279 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.22 685.5 406.72 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3521 0 R /H /I >> endobj 4280 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.39 673.5 395.89 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3523 0 R /H /I >> endobj 4281 0 obj << /Type /Annot /Subtype /Link /Rect [ 421.72 661.5 434.22 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3525 0 R /H /I >> endobj 4282 0 obj << /Type /Annot /Subtype /Link /Rect [ 409.21 649.5 426.71 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3527 0 R /H /I >> endobj 4283 0 obj << /Type /Annot /Subtype /Link /Rect [ 390.62 637.5 408.12 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3529 0 R /H /I >> endobj 4284 0 obj << /Type /Annot /Subtype /Link /Rect [ 408.39 625.5 425.89 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3531 0 R /H /I >> endobj 4285 0 obj << /Type /Annot /Subtype /Link /Rect [ 397.83 613.5 415.33 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3533 0 R /H /I >> endobj 4286 0 obj << /Type /Annot /Subtype /Link /Rect [ 464.22 601.5 476.72 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3535 0 R /H /I >> endobj 4287 0 obj << /Type /Annot /Subtype /Link /Rect [ 418.67 589.5 431.17 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3537 0 R /H /I >> endobj 4288 0 obj << /Type /Annot /Subtype /Link /Rect [ 500.33 577.5 512.83 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3539 0 R /H /I >> endobj 4289 0 obj << /Type /Annot /Subtype /Link /Rect [ 410.34 565.5 422.84 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3541 0 R /H /I >> endobj 4290 0 obj << /Type /Annot /Subtype /Link /Rect [ 418.12 553.5 430.62 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3543 0 R /H /I >> endobj 4291 0 obj << /Type /Annot /Subtype /Link /Rect [ 490.34 541.5 502.84 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3545 0 R /H /I >> endobj 4292 0 obj << /Type /Annot /Subtype /Link /Rect [ 450.36 529.5 462.86 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3547 0 R /H /I >> endobj 4293 0 obj << /Type /Annot /Subtype /Link /Rect [ 415.88 517.5 428.38 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3549 0 R /H /I >> endobj 4294 0 obj << /Type /Annot /Subtype /Link /Rect [ 433.12 505.5 445.62 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3551 0 R /H /I >> endobj 4295 0 obj << /Type /Annot /Subtype /Link /Rect [ 469.79 493.5 482.29 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3553 0 R /H /I >> endobj 4296 0 obj << /Type /Annot /Subtype /Link /Rect [ 426.46 481.5 438.96 490.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3555 0 R /H /I >> endobj 4297 0 obj << /Type /Annot /Subtype /Link /Rect [ 420.35 469.5 432.85 478.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3557 0 R /H /I >> endobj 4298 0 obj << /Type /Annot /Subtype /Link /Rect [ 408.68 457.5 421.18 466.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3559 0 R /H /I >> endobj 4299 0 obj << /Type /Annot /Subtype /Link /Rect [ 419.23 445.5 431.73 454.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3561 0 R /H /I >> endobj 4300 0 obj << /Type /Annot /Subtype /Link /Rect [ 425.34 433.5 437.84 442.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3563 0 R /H /I >> endobj 4301 0 obj << /Type /Annot /Subtype /Link /Rect [ 407.57 421.5 420.07 430.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3565 0 R /H /I >> endobj 4302 0 obj << /Type /Annot /Subtype /Link /Rect [ 399.23 409.5 411.73 418.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3567 0 R /H /I >> endobj 4303 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.23 397.5 436.73 406.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3569 0 R /H /I >> endobj 4304 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.78 385.5 437.28 394.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3571 0 R /H /I >> endobj 4305 0 obj << /Type /Annot /Subtype /Link /Rect [ 409.78 373.5 422.28 382.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3573 0 R /H /I >> endobj 4306 0 obj << /Type /Annot /Subtype /Link /Rect [ 387.56 361.5 400.06 370.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3575 0 R /H /I >> endobj 4307 0 obj << /Type /Annot /Subtype /Link /Rect [ 422.84 349.5 440.34 358.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3577 0 R /H /I >> endobj 4308 0 obj << /Type /Annot /Subtype /Link /Rect [ 392.57 337.5 405.07 346.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3579 0 R /H /I >> endobj 4309 0 obj << /Type /Annot /Subtype /Link /Rect [ 453.67 325.5 466.17 334.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3581 0 R /H /I >> endobj 4310 0 obj << /Type /Annot /Subtype /Link /Rect [ 428.95 313.5 446.45 322.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3583 0 R /H /I >> endobj 4311 0 obj << /Type /Annot /Subtype /Link /Rect [ 363.4 301.5 375.9 310.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3585 0 R /H /I >> endobj 4312 0 obj << /Type /Annot /Subtype /Link /Rect [ 349.22 260.22 366.72 269.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3587 0 R /H /I >> endobj 4313 0 obj << /Type /Annot /Subtype /Link /Rect [ 423.11 248.22 435.61 257.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3589 0 R /H /I >> endobj 4314 0 obj << /Type /Annot /Subtype /Link /Rect [ 411.44 236.22 423.94 245.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3591 0 R /H /I >> endobj 4315 0 obj << /Type /Annot /Subtype /Link /Rect [ 354.78 224.22 367.28 233.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3593 0 R /H /I >> endobj 4316 0 obj << /Type /Annot /Subtype /Link /Rect [ 373.38 212.22 390.88 221.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3595 0 R /H /I >> endobj 4317 0 obj << /Type /Annot /Subtype /Link /Rect [ 432.27 200.22 449.77 209.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3597 0 R /H /I >> endobj 4318 0 obj << /Type /Annot /Subtype /Link /Rect [ 432.28 188.22 449.78 197.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3599 0 R /H /I >> endobj 4319 0 obj << /Type /Annot /Subtype /Link /Rect [ 410.61 176.22 428.11 185.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3601 0 R /H /I >> endobj 4320 0 obj << /Type /Annot /Subtype /Link /Rect [ 361.16 164.22 373.66 173.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3603 0 R /H /I >> endobj 4321 0 obj << /Type /Annot /Subtype /Link /Rect [ 403.93 152.22 421.43 161.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3605 0 R /H /I >> endobj 4322 0 obj << /Type /Annot /Subtype /Link /Rect [ 398.94 140.22 416.44 149.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3607 0 R /H /I >> endobj 4323 0 obj << /Type /Annot /Subtype /Link /Rect [ 397.82 128.22 415.32 137.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3609 0 R /H /I >> endobj 4324 0 obj << /Type /Annot /Subtype /Link /Rect [ 413.94 116.22 431.44 125.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3611 0 R /H /I >> endobj 4325 0 obj << /Type /Annot /Subtype /Link /Rect [ 428.94 104.22 446.44 113.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3613 0 R /H /I >> endobj 4326 0 obj << /Type /Annot /Subtype /Link /Rect [ 387.82 92.22 405.32 101.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3615 0 R /H /I >> endobj 4327 0 obj << /Type /Annot /Subtype /Link /Rect [ 475.6 80.22 493.1 89.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3617 0 R /H /I >> endobj 4328 0 obj << /Length 4329 0 R /Filter /FlateDecode >> stream xœÍ[]sÛ8|÷¯àãÝÕ…H‚´LǼµD‡¤6q¶¶\>EÙuUlgeçvïßß@¢LØÝ}/{—²-÷@ÍÁ`0ƒ†~;Ò’¿oì—¬ˆ‚ÕíÑoÃk:È¢ N‡—Lè,LUÜùɃ¯øì[ ¾·¯èÝ¿ŽîŽTðîè§Ÿô9P¡ ~?R0øn˜îè½¼¹IÃ8Í‹¢¸F¡Îsûq˜Ê7«Ûàm}'÷[ôž½HýÏÙ»Œbý0RÁ/GÇýÑÛShô_Æ(ŠPåJ)ÇAÆQaÿDAüô—wë»õæúkPß}^ÿñןƒþGU?<ßÖxA‘üËÂm=û…IÔóß8!öôúøªüOÂx÷š¼FFÄþêë0«ÃWû‹ý·fë¥ÝW¯W†¡ã—s´uןùæþéȬ¡Vaþl"b•:î\²×`"í{ûŸGAPuUœ”}y\vU°\Ôï—U°(çÕ߃Ý#>™j£%ˆ¡‘§|9 ‚ã0÷#¿€« R^Aydrñ‹‘e+ƒ¦ŽC姸ÄQÇùT§åò¼&!ù †ŽG€ “$aLšyY/¼„´D`bT¬qD§aáE§ P²P:­Ï«.8.g?,/‚z1k«yµ ÔŒg‰ïÓ8Á-ãEGº+ͽÜfåì¬ ÚæCGV„™5‹e§…!EaäE3V«‡Yuõ'²Ü´‹Ä>}ap:é^4cU° ß±’ÈjËwÀ¨pÞ¬œŽìEðÑŠÅúŽÐyst³òœxIåa‰U”2sªöããÝ.?/ô’L”… FýùƒZÞŸO!^ÑvQ§š €N¯øá”UâêEÝ WdÑX¿Ëê!¶€NÂ̦|Œ?œ…ÇKfLÝ8ñiìGGîi:õ‡4ç )£ÌÌݬ­/䇦—$uËveì›%QF†A¸ •NZîômÝW’—ÎËKd& 9±I–§d„'aá‡3¯És¼@=¬ƒ/ßïV7÷wÁ÷õêæËÍêÚþD2” ¥ô–?RqàH,¡)?\ï+O—žf±_¿[4m5“ª£ÌÉh qï$D'¸³Èä2>‹º¯Ës ³³j^þîwÊÖey’‘!‡Æ/­˜Åþ¼üH‹‚m†F¬C ˆù$aÁÝ\TmÙ×Íß?ß¾?XÁä°¡%…#tWøæ©ÉFe×}hÚ||§$BS ë”Dˆfs!ûcÓŸÛuØåZÄ1´´~t¢Iž&muZµRÁÚ€­}õNòÉ<Öó6ÉeqDÂzÖö‘^¸ìÈNÊ(®![Ç3?ÙA?:.°'R9a²[ÌÀ%uŠ?4t1Ö•ˆ&sG,–»ªëd)å²?kÚúÓva‘D:GÛTÈd ÖÇ*?œ9*f¡½'7;+ÛrÖWmÝõõŒô"Fœ‘Úd›i2ÀSiüpF/añ¾§×V´”Á¼š7í¥§[Êeg·‰:1šŒ†pId~8I•±a1ß—ÇçU0;_vâ¼ –ÖY˜ev?Èr2V*Œüpƒ 4NÙØÑÚ¬¯?¿ù}só¸¾mî¿­7ÿ&T&ÙPÔâ`/ÂÂgs¶*v»fÙÎHì®<0gmBá‡3J[ .¥à¬*Oª–¤V)7‰=âÊ`Ü'ŠÅý3*÷woî¿|!õ¥Íf¶ÌN2 ­S½ðÓY¢ýÏ¿ ±¡Â`– Ž#ulD¤Þ%(Vð']Qõ¼ >5 |ì,s»d³È[x~Ùýh²«$ ]?m¹è$c³½ÄíÑúPÿˆèëúÄÀê9[ö'Íd’J¶-žUNÌ-íµ-!•Vô¶šïËÞsÖ§œížŽå?ÂeFR¬!õÔ—¡“’PÛ½2NSbKj˜ÔÖ99¬Í!žëtŒ=xµœÆÄÐ’UühFÇ(ˆç¦í¯Ê¶-/ý¬ì<<Õ‘8kWs?\¸ÎÌÐCj‰Á¡›¾ß<>¯7¬o}ZA8 ¶FãêD´Ž‰Ç†6rDÉΰ8©>úÝ%”ž‚ÍI+­üheHih.J¥ìU^B™³G£19hKühJhè6]BÕ¬>­g@%‘ЬN2Ð \ 2?Ú8J•‡ ׯܖmµ´ˆÖ¤n5ÙËëÞŸ_Ve¿”²šÑ]¦d7+üè K/“C, ›z~q¾M×Ûæèª^œâQ­N$ó%ʆQ]„Ú‹fÄ ˆh!&AýCùޏI<µ:b®3b h›â½hÂ&UÎ[6mT$ ¶O.í;Ú‘-ÙøÑŒJñ,TºúS½@•Aú¾t—x 1<´ó!šq‰Y,ï¸\]´ÍöT–ô`ÑØƒá7c†pF+!A½S‰¯W«õÃC°úõzs½z\odÿ¸Y‘&,›W ƒ[Í+Â¥IÙT½£ÂG‰ýºº}½/ÏðMhß®…·ô’_Ö›õÝjM·fe'=3é´/!g|`­°GÞÒÚܯ֟¿oÖÁÃãõãúv}‡»²VY¨‹!7MjñZaêEgì°çåÁ©ðÚܼ¹[ÿ¼ÿŒv–ZÓ´"_ŒR€5m€OÛ(:rjRŒOb À´Æƒ#í^R×Á¦ÅNÀÓOkðÚîMšPÄ77w¿ÿºþú}¬ÿø¶‘eÊ%}èS 3)ÂÅØÁX“5øåq×·ê(G[›TßsGU0«¢P|ßÒ‘ìêgT8‘4-¿;‘`ƈÈï—dÖ¥fîʧ“Ò»[¼#Z¾AJ¨¼_vÒm^Wâ«æC}bOèOkv|d\½yRŽ×Æœža<U~Çm{£ƒ×U*K™×ˆòÅXË œqBM~àÔœ/ç‹«®z¿¬³êjÙI©EvÝšÔèµÛ_!<ÇÌI4z—Ö…sÿgZŸ×J—‹Î¡>¿'4·E2©pÔ%Ð?¿pF ú=¥Å¢Úft[]Tm_³ ,s]6­Òç®ËÎø¡H?ðk›®d3rÒl ¯8Ý_1™é%žr?œC©| VÛÞ³ ãñ@ñ5Ê|:ž("œqBa~Ç颭çe{ùCuI¦0r6“iu^Gñbg¬Pžß³jfÕ‰4«¾õ¨tôù †½B¢—†)òÃ5”è_PcMG&f¨¦ûí}G?œ‘Béþ‰”wÚ†/ÙßN˜Tñµ½aì‡3R(çïHíY’Keó±÷Êí5ÏiA_ê+íG3>(è|†M‡ù(sn L*ûÛºÕgœPÚßsÚª<)èxÌ ¯Ðôµs£áŒJúÏX‘©3¡Z¦W(û²i*?š"ÊþŽÐV¢7Sž¦mZÜÏYC4iiˆ¸ïбz?x9M‹ú’22?œ‘BQ U}ì=~zvò )ß= A8#…Rþ@JœDƒ»p5òié^¹9À#”îwŒ–'¤˜ÊÌxB1­ØKe£ühFûLWhü¶¹x¿¢_¡Ó»ùáº0H …ú‘Yoj\þÓ"½ý¬ƒÍÜ„ýŽÍBFò‘·Hœ“Ù×õÎÑ,™œ†Š½«çÒü•ó‹CèÜ>z…^¯ƒx„³Æ”ö—]`gÝÊÚ^æÔ&~…vnâ°ð£óá@ôí©m¸ÂäűbbW¨.¶7výO!c?fÏc3 mƒˆÃ4´´s¶„hÍ.¤ãaûiòËšvaÚ¹’а%šúáäœ9±ª!%uûõyÅtŠÂ½õæü*Î(1£„Dg×A#@;›¢™|£ ð8¤¹Û[‰6 TFLmo%zÑôTCï3Dyrr IØû_6¥iBA¸xÕ×9„š{Ïì¤>= ¶Ÿ…RóÃ)µÂ{:­º)ÁX€k?\ç$² DøÍí:øt‡Rˆ÷òÚ‘$œúÑšˆÜ)¹8È^J:à=~Žíí|FÑ:ÇO¸˜ "½¹²×IÐ:×МTê‰Mg,‡o®¦ÏŒ±ˆ˜³3c?Zçxš*íæj±œ,ùÜlŒ# <=…p–¦R ±Ý\½º–Ù¿ Âk/œ:,‚PoN]ÊœDcRµÇ~´Î± HcˆóQͲeAß6ç<–Ú§Þå Ñi¨½h]¸ó¶ÿ3äq endstream endobj 4222 0 obj [ 4221 0 R 4223 0 R 4224 0 R 4225 0 R 4226 0 R 4227 0 R 4228 0 R 4229 0 R 4230 0 R 4231 0 R 4232 0 R 4233 0 R 4234 0 R 4235 0 R 4236 0 R 4237 0 R 4238 0 R 4239 0 R 4240 0 R 4241 0 R 4242 0 R 4243 0 R 4244 0 R 4245 0 R 4246 0 R 4247 0 R 4248 0 R 4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R 4255 0 R 4256 0 R 4257 0 R 4258 0 R 4259 0 R 4260 0 R 4261 0 R 4262 0 R 4263 0 R 4264 0 R 4265 0 R 4266 0 R 4267 0 R 4268 0 R 4269 0 R 4270 0 R 4271 0 R 4272 0 R 4273 0 R 4274 0 R 4275 0 R 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R 4303 0 R 4304 0 R 4305 0 R 4306 0 R 4307 0 R 4308 0 R 4309 0 R 4310 0 R 4311 0 R 4312 0 R 4313 0 R 4314 0 R 4315 0 R 4316 0 R 4317 0 R 4318 0 R 4319 0 R 4320 0 R 4321 0 R 4322 0 R 4323 0 R 4324 0 R 4325 0 R 4326 0 R 4327 0 R ] endobj 4220 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 4222 0 R /Contents 4328 0 R >> endobj 4329 0 obj 3172 endobj 4331 0 obj << /Type /Annot /Subtype /Link /Rect [ 198.93 709.5 216.43 718.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3619 0 R /H /I >> endobj 4333 0 obj << /Type /Annot /Subtype /Link /Rect [ 209.49 697.5 226.99 706.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3621 0 R /H /I >> endobj 4334 0 obj << /Type /Annot /Subtype /Link /Rect [ 180.58 685.5 193.08 694.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3623 0 R /H /I >> endobj 4335 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.55 673.5 165.05 682.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3625 0 R /H /I >> endobj 4336 0 obj << /Type /Annot /Subtype /Link /Rect [ 206.99 661.5 219.49 670.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3627 0 R /H /I >> endobj 4337 0 obj << /Type /Annot /Subtype /Link /Rect [ 207.54 649.5 220.04 658.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3629 0 R /H /I >> endobj 4338 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.88 637.5 228.38 646.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3634 0 R /H /I >> endobj 4339 0 obj << /Type /Annot /Subtype /Link /Rect [ 195.88 625.5 208.38 634.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3637 0 R /H /I >> endobj 4340 0 obj << /Type /Annot /Subtype /Link /Rect [ 231.99 613.5 244.49 622.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3639 0 R /H /I >> endobj 4341 0 obj << /Type /Annot /Subtype /Link /Rect [ 216.99 601.5 234.49 610.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3641 0 R /H /I >> endobj 4342 0 obj << /Type /Annot /Subtype /Link /Rect [ 216.43 589.5 233.93 598.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3643 0 R /H /I >> endobj 4343 0 obj << /Type /Annot /Subtype /Link /Rect [ 125.89 577.5 138.39 586.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3645 0 R /H /I >> endobj 4344 0 obj << /Type /Annot /Subtype /Link /Rect [ 177.83 565.5 195.33 574.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3647 0 R /H /I >> endobj 4345 0 obj << /Type /Annot /Subtype /Link /Rect [ 137.83 553.5 155.33 562.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3649 0 R /H /I >> endobj 4346 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.16 541.5 183.66 550.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3651 0 R /H /I >> endobj 4347 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.5 529.5 192.0 538.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3653 0 R /H /I >> endobj 4348 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.05 517.5 182.55 526.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3655 0 R /H /I >> endobj 4349 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.66 505.5 201.16 514.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3657 0 R /H /I >> endobj 4350 0 obj << /Type /Annot /Subtype /Link /Rect [ 181.99 493.5 199.49 502.5 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3659 0 R /H /I >> endobj 4351 0 obj << /Type /Annot /Subtype /Link /Rect [ 145.61 454.22 163.11 463.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3661 0 R /H /I >> endobj 4352 0 obj << /Type /Annot /Subtype /Link /Rect [ 175.86 442.22 193.36 451.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3663 0 R /H /I >> endobj 4353 0 obj << /Type /Annot /Subtype /Link /Rect [ 133.37 430.22 150.87 439.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3665 0 R /H /I >> endobj 4354 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.26 418.22 169.76 427.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3205 0 R /H /I >> endobj 4355 0 obj << /Type /Annot /Subtype /Link /Rect [ 154.47 406.22 171.97 415.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3668 0 R /H /I >> endobj 4356 0 obj << /Type /Annot /Subtype /Link /Rect [ 200.6 394.22 218.1 403.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3670 0 R /H /I >> endobj 4357 0 obj << /Type /Annot /Subtype /Link /Rect [ 116.44 382.22 133.94 391.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3672 0 R /H /I >> endobj 4358 0 obj << /Type /Annot /Subtype /Link /Rect [ 116.44 370.22 133.94 379.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3674 0 R /H /I >> endobj 4359 0 obj << /Type /Action /S /GoTo /D [1983 0 R /XYZ 72.0 94.176 null] >> endobj 4360 0 obj << /Type /Annot /Subtype /Link /Rect [ 117.55 358.22 135.05 367.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4359 0 R /H /I >> endobj 4361 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.95 346.22 161.45 355.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3676 0 R /H /I >> endobj 4362 0 obj << /Type /Annot /Subtype /Link /Rect [ 172.55 334.22 185.05 343.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3678 0 R /H /I >> endobj 4363 0 obj << /Type /Annot /Subtype /Link /Rect [ 185.89 322.22 198.39 331.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3680 0 R /H /I >> endobj 4364 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.39 310.22 155.89 319.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3682 0 R /H /I >> endobj 4365 0 obj << /Type /Annot /Subtype /Link /Rect [ 137.82 298.22 155.32 307.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3684 0 R /H /I >> endobj 4366 0 obj << /Type /Annot /Subtype /Link /Rect [ 143.93 258.94 161.43 267.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3686 0 R /H /I >> endobj 4367 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.09 246.94 195.59 255.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3688 0 R /H /I >> endobj 4368 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.26 234.94 169.76 243.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3690 0 R /H /I >> endobj 4369 0 obj << /Type /Annot /Subtype /Link /Rect [ 189.76 222.94 202.26 231.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3692 0 R /H /I >> endobj 4370 0 obj << /Type /Annot /Subtype /Link /Rect [ 190.31 210.94 202.81 219.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3694 0 R /H /I >> endobj 4371 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.65 198.94 191.15 207.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3696 0 R /H /I >> endobj 4372 0 obj << /Type /Annot /Subtype /Link /Rect [ 108.66 186.94 121.16 195.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3698 0 R /H /I >> endobj 4373 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.71 147.66 159.21 156.66 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3700 0 R /H /I >> endobj 4374 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.49 135.66 191.99 144.66 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3702 0 R /H /I >> endobj 4375 0 obj << /Type /Annot /Subtype /Link /Rect [ 191.15 123.66 208.65 132.66 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3704 0 R /H /I >> endobj 4376 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.05 84.38 157.55 93.38 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3706 0 R /H /I >> endobj 4377 0 obj << /Length 4378 0 R /Filter /FlateDecode >> stream xœÍYmsÚ8þίÐÇ»™;E/–,}¤à¦nIÁ´Íu: ChËL0)^ïßßÊ0ìÊýÖ»¼Œóìú‘öÑjWùÖ‘LÀ÷Ÿá’zÅæ«Î·ú™d©bÚÖŒe2åV8¶bõÎ8ö€g·RßêêiÞÿñ•½ï”Á®;?è nØßœïÝŒ;oáåÆrm÷¾æª¸t.¼Bs 7ó»ÊWŠõ×úÀ>8ÿ9û&#-Õÿ€‘`_:/ŠÎÕKä`Å瓼ç !¤ÓÌq­|øR¬X±¿]/ÊÅföÈòòañã÷O¬xÝÉŠz|•q¥ ?)¯dtöIÄù' ‰ŸŸžÂoÂõþ<áÊÀ@ÂGuTëkøàpkªYÚ_£³R»j_ƨš®_ùòx8Ò`(wgÐ"mLÿ¹¸~ñ¬¡@†wÇÇ#¨ŠQw8îöŠüv8Íûìós9ß-×ål?£¥T–{ ÊZ"'ìyÊ:–Þ^ÀS¢…Ö8ÿ+k!¦Sžxàeý`´ç>Ц¨iŵ®WdÚmfåvV‘aó¯³ Ü.6Ëín9ßbrÂqsXÏÈBKyZý­1·$¹ÀTÓvÓ Ó6FdˆÉ„ ƒ-Xs§Q Ä•üú:M{·7“Áp:w¯3"xÉ)ÈEk¨:õˆ”uR£ÛI‘³(+ÃY€:°Œv\DÑ+ˆÍjœ½dÃ^”V¢¹ òH`ÇEN0&(Š&hùKÁhÝ7QN 8¥0ø’ò@%Eœ¤À ¯Heýéä®ß-²Z_XíÒ4V:öƒàV´…á„⥌H>ë³ñÛ6.€Þ D ªÇn0¼!{ —©ÀÜTDù,ûõ&!?°ÛQ?‘ÜŽ©»¡Tæãp’[Ñ?Ž¡ ‚ùY{ ¡ƒà£hJ]†ü`Úº÷-Ž0ܬ° j Ðq¸ôÄ YBõƒ8#Û$„lºÉ¡ešb>)VúdØyÇ9ù„Kök {„¶ÜÆÑÒIÌÉa…לƽWÙ KÄM…bÙñ%PR+¢jÁJ®9T9OJcSÅÆmNû5F“„$4:F‰=Ìv‹ÝrµÀ“¥Ç1Ø †7‹á0}˜›Â¢>ãV>¯ ŽšqƒDÖuê,áSƒD‡µtõR‡b=¹¨•‰–!Ûªdo19à‰jZYè…÷ÎhS£{Ýq˲H/Cm%aŒÐ–Ë8šZª*5¨çr9_?,Øb;Ÿ=Áåq±Z”;ªT…dk/Cn0<œDáÀsséåd ÃFôú6âœ&Á=DÑyM"tàEKe0è´(¿Ø|]n¡Ä_–;\@®Â•L{„NyG¢Ók¢ô´Y<,ç°t1#Ðzä­aŽÐPvÄѰ¦‰æé{˜˜ù ƒòfp×Ö/:~ö‚khÉe-ŽŸÖ—’› ‡@  õL¨ÎÕ„B‡.7ІjIª«Â´2j%‚ÐÐ7a"æRcÏO_6³‡eùs­%©ß„°Chhpâh•âÝY§HÊwwP}Æó¢ä>¼ÂzC#4Le-‰b];$äÐÏLïFù»ü&»ÎˆB4úelOåO‡å§öHÂch·úÙKhMûÓâþŽb%51ö€á¢à V‰@z·EÎ6^€m‰âÓÅÑÒcY'%êIÛAU(†¥¯ÄAØRÅp-½n-’°ŽªÚDÔ'HïZŠ…ÄÀࡲ€ž©öÿ}öø [òHðÛmlYݰ9µ,âhhDðä¦â'”`óY®f›ˆåa¹C·:!üÐ'aQ8tܘìn¹íÓb¾ü6DjÊœ8mÒØ±¦q4´˜t6ç¨wyöþ'Ç\²Q `xïlŽÁ‰Ek ©ŸsI¿•²±„Š•‹Ã)VòRƒ«Öó$ðkC•FöTo ãpŠ“¾”^à„ó¬Јdcl8CÊé:‹¼oÉ"ÖŽ„Z×)/kt–½iɇž§!j^8Â¥ÅUMbVÍŸW°£²Çõú‰-K¶Y?ï–å‚j8ö‚áÉ© Äp™±®!ΨåýâÕôŤ÷&+ZjWÙTr‚†lhÁ¥S­á·°®dHÖ¸½Å}Kø­Ö<1U _û¿ÏºmÛ³;U%Ø…¿Qò`ô1üYÑø·“Jµú§bøþ‘㎠endstream endobj 4332 0 obj [ 4331 0 R 4333 0 R 4334 0 R 4335 0 R 4336 0 R 4337 0 R 4338 0 R 4339 0 R 4340 0 R 4341 0 R 4342 0 R 4343 0 R 4344 0 R 4345 0 R 4346 0 R 4347 0 R 4348 0 R 4349 0 R 4350 0 R 4351 0 R 4352 0 R 4353 0 R 4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R 4369 0 R 4370 0 R 4371 0 R 4372 0 R 4373 0 R 4374 0 R 4375 0 R 4376 0 R ] endobj 4330 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612 792] /BleedBox [0 0 612 792] /TrimBox [0 0 612 792] /Parent 1 0 R /Annots 4332 0 R /Contents 4377 0 R >> endobj 4378 0 obj 1671 endobj 4379 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 72.0 720.0 null] >> endobj 4380 0 obj << /Type /Action /S /GoTo /D [383 0 R /XYZ 72.0 211.032 null] >> endobj 4381 0 obj << /Type /Action /S /GoTo /D [1884 0 R /XYZ 72.0 239.661 null] >> endobj 4382 0 obj << /Type /Action /S /GoTo /D [1908 0 R /XYZ 72.0 131.479 null] >> endobj 4383 0 obj << /Type /Action /S /GoTo /D [1872 0 R /XYZ 72.0 230.505 null] >> endobj 4384 0 obj << /Type /Action /S /GoTo /D [2605 0 R /XYZ 72.0 581.9 null] >> endobj 4385 0 obj << /Type /Action /S /GoTo /D [2161 0 R /XYZ 72.0 612.9 null] >> endobj 4386 0 obj << /Type /Action /S /GoTo /D [2173 0 R /XYZ 72.0 618.823 null] >> endobj 4387 0 obj << /Type /Action /S /GoTo /D [2254 0 R /XYZ 72.0 628.8 null] >> endobj 4388 0 obj << /Type /Action /S /GoTo /D [2257 0 R /XYZ 72.0 720.0 null] >> endobj 4390 0 obj << /Title (HyperSQL User Guide) /Parent 4389 0 R /Next 4392 0 R /A 4379 0 R >> endobj 4391 0 obj << /Type /Action /S /GoTo /D [109 0 R /XYZ 72.0 720.0 null] >> endobj 4392 0 obj << /Title (Table of Contents) /Parent 4389 0 R /Prev 4390 0 R /Next 4393 0 R /A 4391 0 R >> endobj 4393 0 obj << /Title (Preface) /Parent 4389 0 R /Prev 4392 0 R /Next 4395 0 R /First 4394 0 R /Last 4394 0 R /Count -1 /A 110 0 R >> endobj 4394 0 obj << /Title (Available formats for this document) /Parent 4393 0 R /A 114 0 R >> endobj 4395 0 obj << /Title /Parent 4389 0 R /Prev 4393 0 R /Next 4410 0 R /First 4396 0 R /Last 4409 0 R /Count -14 /A 117 0 R >> endobj 4396 0 obj << /Title (The HSQLDB Jar) /Parent 4395 0 R /Next 4397 0 R /A 120 0 R >> endobj 4397 0 obj << /Title (Running Database Access Tools) /Parent 4395 0 R /Prev 4396 0 R /Next 4398 0 R /A 123 0 R >> endobj 4398 0 obj << /Title (A HyperSQL Database) /Parent 4395 0 R /Prev 4397 0 R /Next 4399 0 R /A 126 0 R >> endobj 4399 0 obj << /Title (In-Process Access to Database Catalogs) /Parent 4395 0 R /Prev 4398 0 R /Next 4400 0 R /A 129 0 R >> endobj 4400 0 obj << /Title (Server Modes) /Parent 4395 0 R /Prev 4399 0 R /Next 4407 0 R /First 4401 0 R /Last 4406 0 R /Count -6 /A 132 0 R >> endobj 4401 0 obj << /Title (HyperSQL HSQL Server) /Parent 4400 0 R /Next 4402 0 R /A 135 0 R >> endobj 4402 0 obj << /Title (HyperSQL HTTP Server) /Parent 4400 0 R /Prev 4401 0 R /Next 4403 0 R /A 138 0 R >> endobj 4403 0 obj << /Title (HyperSQL HTTP Servlet) /Parent 4400 0 R /Prev 4402 0 R /Next 4404 0 R /A 141 0 R >> endobj 4404 0 obj << /Title (Connecting to a Database Server) /Parent 4400 0 R /Prev 4403 0 R /Next 4405 0 R /A 144 0 R >> endobj 4405 0 obj << /Title (Security Considerations) /Parent 4400 0 R /Prev 4404 0 R /Next 4406 0 R /A 147 0 R >> endobj 4406 0 obj << /Title (Using Multiple Databases) /Parent 4400 0 R /Prev 4405 0 R /A 150 0 R >> endobj 4407 0 obj << /Title (Accessing the Data) /Parent 4395 0 R /Prev 4400 0 R /Next 4408 0 R /A 153 0 R >> endobj 4408 0 obj << /Title (Closing the Database) /Parent 4395 0 R /Prev 4407 0 R /Next 4409 0 R /A 156 0 R >> endobj 4409 0 obj << /Title (Creating a New Database) /Parent 4395 0 R /Prev 4408 0 R /A 159 0 R >> endobj 4410 0 obj << /Title /Parent 4389 0 R /Prev 4395 0 R /Next 4436 0 R /First 4411 0 R /Last 4432 0 R /Count -25 /A 162 0 R >> endobj 4411 0 obj << /Title (Standards Support) /Parent 4410 0 R /Next 4412 0 R /A 165 0 R >> endobj 4412 0 obj << /Title (SQL Data and Tables) /Parent 4410 0 R /Prev 4411 0 R /Next 4416 0 R /First 4413 0 R /Last 4415 0 R /Count -3 /A 168 0 R >> endobj 4413 0 obj << /Title (Temporary Tables) /Parent 4412 0 R /Next 4414 0 R /A 171 0 R >> endobj 4414 0 obj << /Title (Persistent Tables) /Parent 4412 0 R /Prev 4413 0 R /Next 4415 0 R /A 174 0 R >> endobj 4415 0 obj << /Title (Lob Data) /Parent 4412 0 R /Prev 4414 0 R /A 177 0 R >> endobj 4416 0 obj << /Title (Short Guide to Data Types) /Parent 4410 0 R /Prev 4412 0 R /Next 4417 0 R /A 180 0 R >> endobj 4417 0 obj << /Title (Data Types and Operations) /Parent 4410 0 R /Prev 4416 0 R /Next 4425 0 R /First 4418 0 R /Last 4424 0 R /Count -7 /A 183 0 R >> endobj 4418 0 obj << /Title (Numeric Types) /Parent 4417 0 R /Next 4419 0 R /A 186 0 R >> endobj 4419 0 obj << /Title (Boolean Type) /Parent 4417 0 R /Prev 4418 0 R /Next 4420 0 R /A 189 0 R >> endobj 4420 0 obj << /Title (Character String Types) /Parent 4417 0 R /Prev 4419 0 R /Next 4421 0 R /A 192 0 R >> endobj 4421 0 obj << /Title (Binary String Types) /Parent 4417 0 R /Prev 4420 0 R /Next 4422 0 R /A 195 0 R >> endobj 4422 0 obj << /Title (Bit String Types) /Parent 4417 0 R /Prev 4421 0 R /Next 4423 0 R /A 198 0 R >> endobj 4423 0 obj << /Title (Storage and Handling of Java Objects) /Parent 4417 0 R /Prev 4422 0 R /Next 4424 0 R /A 201 0 R >> endobj 4424 0 obj << /Title (Type Length, Precision and Scale) /Parent 4417 0 R /Prev 4423 0 R /A 204 0 R >> endobj 4425 0 obj << /Title (Datetime types) /Parent 4410 0 R /Prev 4417 0 R /Next 4426 0 R /A 207 0 R >> endobj 4426 0 obj << /Title (Interval Types) /Parent 4410 0 R /Prev 4425 0 R /Next 4427 0 R /A 210 0 R >> endobj 4427 0 obj << /Title (Arrays) /Parent 4410 0 R /Prev 4426 0 R /Next 4431 0 R /First 4428 0 R /Last 4430 0 R /Count -3 /A 213 0 R >> endobj 4428 0 obj << /Title (Array Definition) /Parent 4427 0 R /Next 4429 0 R /A 216 0 R >> endobj 4429 0 obj << /Title (Array Reference) /Parent 4427 0 R /Prev 4428 0 R /Next 4430 0 R /A 219 0 R >> endobj 4430 0 obj << /Title (Array Operations) /Parent 4427 0 R /Prev 4429 0 R /A 222 0 R >> endobj 4431 0 obj << /Title (Indexes and Query Speed) /Parent 4410 0 R /Prev 4427 0 R /Next 4432 0 R /A 225 0 R >> endobj 4432 0 obj << /Title (Query Processing and Optimisation) /Parent 4410 0 R /Prev 4431 0 R /First 4433 0 R /Last 4435 0 R /Count -3 /A 228 0 R >> endobj 4433 0 obj << /Title (Indexes and Conditions) /Parent 4432 0 R /Next 4434 0 R /A 231 0 R >> endobj 4434 0 obj << /Title (Indexes and Operations) /Parent 4432 0 R /Prev 4433 0 R /Next 4435 0 R /A 234 0 R >> endobj 4435 0 obj << /Title (Indexes and ORDER BY, OFFSET and LIMIT) /Parent 4432 0 R /Prev 4434 0 R /A 237 0 R >> endobj 4436 0 obj << /Title /Parent 4389 0 R /Prev 4410 0 R /Next 4453 0 R /First 4437 0 R /Last 4452 0 R /Count -16 /A 240 0 R >> endobj 4437 0 obj << /Title (Overview) /Parent 4436 0 R /Next 4438 0 R /A 243 0 R >> endobj 4438 0 obj << /Title (Session Attributes and Variables) /Parent 4436 0 R /Prev 4437 0 R /Next 4442 0 R /First 4439 0 R /Last 4441 0 R /Count -3 /A 246 0 R >> endobj 4439 0 obj << /Title (Session Attributes) /Parent 4438 0 R /Next 4440 0 R /A 249 0 R >> endobj 4440 0 obj << /Title (Session Variables) /Parent 4438 0 R /Prev 4439 0 R /Next 4441 0 R /A 252 0 R >> endobj 4441 0 obj << /Title (Session Tables) /Parent 4438 0 R /Prev 4440 0 R /A 255 0 R >> endobj 4442 0 obj << /Title (Transactions and Concurrency Control) /Parent 4436 0 R /Prev 4438 0 R /Next 4452 0 R /First 4443 0 R /Last 4451 0 R /Count -9 /A 258 0 R >> endobj 4443 0 obj << /Title (Two Phase Locking) /Parent 4442 0 R /Next 4444 0 R /A 261 0 R >> endobj 4444 0 obj << /Title (Two Phase Locking with Snapshot Isolation) /Parent 4442 0 R /Prev 4443 0 R /Next 4445 0 R /A 403 0 R >> endobj 4445 0 obj << /Title (Lock Contention in 2PL) /Parent 4442 0 R /Prev 4444 0 R /Next 4446 0 R /A 407 0 R >> endobj 4446 0 obj << /Title (Locks in SQL Routines and Triggers) /Parent 4442 0 R /Prev 4445 0 R /Next 4447 0 R /A 410 0 R >> endobj 4447 0 obj << /Title (MVCC) /Parent 4442 0 R /Prev 4446 0 R /Next 4448 0 R /A 413 0 R >> endobj 4448 0 obj << /Title (Choosing the Transaction Model) /Parent 4442 0 R /Prev 4447 0 R /Next 4449 0 R /A 416 0 R >> endobj 4449 0 obj << /Title (Schema and Database Change) /Parent 4442 0 R /Prev 4448 0 R /Next 4450 0 R /A 419 0 R >> endobj 4450 0 obj << /Title (Simultaneous Access to Tables) /Parent 4442 0 R /Prev 4449 0 R /Next 4451 0 R /A 422 0 R >> endobj 4451 0 obj << /Title (Viewing Sessions) /Parent 4442 0 R /Prev 4450 0 R /A 425 0 R >> endobj 4452 0 obj << /Title (Session and Transaction Control Statements) /Parent 4436 0 R /Prev 4442 0 R /A 428 0 R >> endobj 4453 0 obj << /Title /Parent 4389 0 R /Prev 4436 0 R /Next 4493 0 R /First 4454 0 R /Last 4483 0 R /Count -39 /A 431 0 R >> endobj 4454 0 obj << /Title (Overview) /Parent 4453 0 R /Next 4455 0 R /A 434 0 R >> endobj 4455 0 obj << /Title (Schemas and Schema Objects) /Parent 4453 0 R /Prev 4454 0 R /Next 4469 0 R /First 4456 0 R /Last 4468 0 R /Count -13 /A 437 0 R >> endobj 4456 0 obj << /Title (Names and References) /Parent 4455 0 R /Next 4457 0 R /A 440 0 R >> endobj 4457 0 obj << /Title (Character Sets) /Parent 4455 0 R /Prev 4456 0 R /Next 4458 0 R /A 443 0 R >> endobj 4458 0 obj << /Title (Collations) /Parent 4455 0 R /Prev 4457 0 R /Next 4459 0 R /A 446 0 R >> endobj 4459 0 obj << /Title (Distinct Types) /Parent 4455 0 R /Prev 4458 0 R /Next 4460 0 R /A 449 0 R >> endobj 4460 0 obj << /Title (Domains) /Parent 4455 0 R /Prev 4459 0 R /Next 4461 0 R /A 452 0 R >> endobj 4461 0 obj << /Title (Number Sequences) /Parent 4455 0 R /Prev 4460 0 R /Next 4462 0 R /A 455 0 R >> endobj 4462 0 obj << /Title (Tables) /Parent 4455 0 R /Prev 4461 0 R /Next 4463 0 R /A 458 0 R >> endobj 4463 0 obj << /Title (Views) /Parent 4455 0 R /Prev 4462 0 R /Next 4464 0 R /A 461 0 R >> endobj 4464 0 obj << /Title (Constraints) /Parent 4455 0 R /Prev 4463 0 R /Next 4465 0 R /A 464 0 R >> endobj 4465 0 obj << /Title (Assertions) /Parent 4455 0 R /Prev 4464 0 R /Next 4466 0 R /A 467 0 R >> endobj 4466 0 obj << /Title (Triggers) /Parent 4455 0 R /Prev 4465 0 R /Next 4467 0 R /A 470 0 R >> endobj 4467 0 obj << /Title (Routines) /Parent 4455 0 R /Prev 4466 0 R /Next 4468 0 R /A 473 0 R >> endobj 4468 0 obj << /Title (Indexes) /Parent 4455 0 R /Prev 4467 0 R /A 476 0 R >> endobj 4469 0 obj << /Title (Statements for Schema Definition and Manipulation) /Parent 4453 0 R /Prev 4455 0 R /Next 4483 0 R /First 4470 0 R /Last 4482 0 R /Count -13 /A 479 0 R >> endobj 4470 0 obj << /Title (Common Elements and Statements) /Parent 4469 0 R /Next 4471 0 R /A 482 0 R >> endobj 4471 0 obj << /Title (Renaming Objects) /Parent 4469 0 R /Prev 4470 0 R /Next 4472 0 R /A 485 0 R >> endobj 4472 0 obj << /Title (Commenting Objects) /Parent 4469 0 R /Prev 4471 0 R /Next 4473 0 R /A 488 0 R >> endobj 4473 0 obj << /Title (Schema Creation) /Parent 4469 0 R /Prev 4472 0 R /Next 4474 0 R /A 491 0 R >> endobj 4474 0 obj << /Title (Table Creation) /Parent 4469 0 R /Prev 4473 0 R /Next 4475 0 R /A 494 0 R >> endobj 4475 0 obj << /Title (Table Manipulation) /Parent 4469 0 R /Prev 4474 0 R /Next 4476 0 R /A 497 0 R >> endobj 4476 0 obj << /Title (View Creation and Manipulation) /Parent 4469 0 R /Prev 4475 0 R /Next 4477 0 R /A 500 0 R >> endobj 4477 0 obj << /Title (Domain Creation and Manipulation) /Parent 4469 0 R /Prev 4476 0 R /Next 4478 0 R /A 503 0 R >> endobj 4478 0 obj << /Title (Trigger Creation) /Parent 4469 0 R /Prev 4477 0 R /Next 4479 0 R /A 506 0 R >> endobj 4479 0 obj << /Title (Routine Creation) /Parent 4469 0 R /Prev 4478 0 R /Next 4480 0 R /A 509 0 R >> endobj 4480 0 obj << /Title (Sequence Creation) /Parent 4469 0 R /Prev 4479 0 R /Next 4481 0 R /A 512 0 R >> endobj 4481 0 obj << /Title (SQL Procedure Statement) /Parent 4469 0 R /Prev 4480 0 R /Next 4482 0 R /A 515 0 R >> endobj 4482 0 obj << /Title (Other Schema Object Creation) /Parent 4469 0 R /Prev 4481 0 R /A 518 0 R >> endobj 4483 0 obj << /Title (The Information Schema) /Parent 4453 0 R /Prev 4469 0 R /First 4484 0 R /Last 4491 0 R /Count -9 /A 521 0 R >> endobj 4484 0 obj << /Title (Predefined Character Sets, Collations and Domains) /Parent 4483 0 R /Next 4485 0 R /A 524 0 R >> endobj 4485 0 obj << /Title (Views in INFORMATION SCHEMA) /Parent 4483 0 R /Prev 4484 0 R /Next 4486 0 R /A 527 0 R >> endobj 4486 0 obj << /Title (Visibility of Information) /Parent 4483 0 R /Prev 4485 0 R /Next 4487 0 R /A 530 0 R >> endobj 4487 0 obj << /Title (Name Information) /Parent 4483 0 R /Prev 4486 0 R /Next 4488 0 R /A 533 0 R >> endobj 4488 0 obj << /Title (Data Type Information) /Parent 4483 0 R /Prev 4487 0 R /Next 4489 0 R /A 536 0 R >> endobj 4489 0 obj << /Title (Product Information) /Parent 4483 0 R /Prev 4488 0 R /Next 4490 0 R /A 539 0 R >> endobj 4490 0 obj << /Title (Operations Information) /Parent 4483 0 R /Prev 4489 0 R /Next 4491 0 R /A 542 0 R >> endobj 4491 0 obj << /Title (SQL Standard Views) /Parent 4483 0 R /Prev 4490 0 R /First 4492 0 R /Last 4492 0 R /Count -1 /A 545 0 R >> endobj 4492 0 obj << /Title (HyperSQL Custom Views) /Parent 4491 0 R /A 4380 0 R >> endobj 4493 0 obj << /Title /Parent 4389 0 R /Prev 4453 0 R /Next 4504 0 R /First 4494 0 R /Last 4503 0 R /Count -10 /A 393 0 R >> endobj 4494 0 obj << /Title (Overview) /Parent 4493 0 R /Next 4495 0 R /A 550 0 R >> endobj 4495 0 obj << /Title (The Implementation) /Parent 4493 0 R /Prev 4494 0 R /Next 4501 0 R /First 4496 0 R /Last 4500 0 R /Count -5 /A 553 0 R >> endobj 4496 0 obj << /Title (Definition of Tables) /Parent 4495 0 R /Next 4497 0 R /A 556 0 R >> endobj 4497 0 obj << /Title (Scope and Reassignment) /Parent 4495 0 R /Prev 4496 0 R /Next 4498 0 R /A 559 0 R >> endobj 4498 0 obj << /Title (Null Values in Columns of Text Tables) /Parent 4495 0 R /Prev 4497 0 R /Next 4499 0 R /A 562 0 R >> endobj 4499 0 obj << /Title (Configuration) /Parent 4495 0 R /Prev 4498 0 R /Next 4500 0 R /A 723 0 R >> endobj 4500 0 obj << /Title (Disconnecting Text Tables) /Parent 4495 0 R /Prev 4499 0 R /A 727 0 R >> endobj 4501 0 obj << /Title (Text File Usage) /Parent 4493 0 R /Prev 4495 0 R /Next 4502 0 R /A 730 0 R >> endobj 4502 0 obj << /Title (Text File Global Properties) /Parent 4493 0 R /Prev 4501 0 R /Next 4503 0 R /A 733 0 R >> endobj 4503 0 obj << /Title (Transactions) /Parent 4493 0 R /Prev 4502 0 R /A 736 0 R >> endobj 4504 0 obj << /Title /Parent 4389 0 R /Prev 4493 0 R /Next 4511 0 R /First 4505 0 R /Last 4510 0 R /Count -6 /A 577 0 R >> endobj 4505 0 obj << /Title (Overview) /Parent 4504 0 R /Next 4506 0 R /A 741 0 R >> endobj 4506 0 obj << /Title (Authorizations and Access Control) /Parent 4504 0 R /Prev 4505 0 R /Next 4510 0 R /First 4507 0 R /Last 4509 0 R /Count -3 /A 744 0 R >> endobj 4507 0 obj << /Title (Built-In Roles and Users) /Parent 4506 0 R /Next 4508 0 R /A 747 0 R >> endobj 4508 0 obj << /Title (Listing Users and Roles) /Parent 4506 0 R /Prev 4507 0 R /Next 4509 0 R /A 750 0 R >> endobj 4509 0 obj << /Title (Access Rights) /Parent 4506 0 R /Prev 4508 0 R /A 753 0 R >> endobj 4510 0 obj << /Title (Statements for Authorization and Access Control) /Parent 4504 0 R /Prev 4506 0 R /A 756 0 R >> endobj 4511 0 obj << /Title /Parent 4389 0 R /Prev 4504 0 R /Next 4559 0 R /First 4512 0 R /Last 4558 0 R /Count -47 /A 612 0 R >> endobj 4512 0 obj << /Title (Overview) /Parent 4511 0 R /Next 4513 0 R /A 761 0 R >> endobj 4513 0 obj << /Title (Cursors And Result Sets) /Parent 4511 0 R /Prev 4512 0 R /Next 4526 0 R /First 4514 0 R /Last 4525 0 R /Count -12 /A 764 0 R >> endobj 4514 0 obj << /Title (Columns and Rows) /Parent 4513 0 R /Next 4515 0 R /A 767 0 R >> endobj 4515 0 obj << /Title (Navigation) /Parent 4513 0 R /Prev 4514 0 R /Next 4516 0 R /A 770 0 R >> endobj 4516 0 obj << /Title (Updatability) /Parent 4513 0 R /Prev 4515 0 R /Next 4517 0 R /A 773 0 R >> endobj 4517 0 obj << /Title (Sensitivity) /Parent 4513 0 R /Prev 4516 0 R /Next 4518 0 R /A 776 0 R >> endobj 4518 0 obj << /Title (Holdability) /Parent 4513 0 R /Prev 4517 0 R /Next 4519 0 R /A 779 0 R >> endobj 4519 0 obj << /Title (Autocommit) /Parent 4513 0 R /Prev 4518 0 R /Next 4520 0 R /A 782 0 R >> endobj 4520 0 obj << /Title (JDBC Overview) /Parent 4513 0 R /Prev 4519 0 R /Next 4521 0 R /A 785 0 R >> endobj 4521 0 obj << /Title (JDBC Parameters) /Parent 4513 0 R /Prev 4520 0 R /Next 4522 0 R /A 788 0 R >> endobj 4522 0 obj << /Title (JDBC and Data Change Statements) /Parent 4513 0 R /Prev 4521 0 R /Next 4523 0 R /A 791 0 R >> endobj 4523 0 obj << /Title (JDBC Callable Statement) /Parent 4513 0 R /Prev 4522 0 R /Next 4524 0 R /A 794 0 R >> endobj 4524 0 obj << /Title (JDBC Returned Values) /Parent 4513 0 R /Prev 4523 0 R /Next 4525 0 R /A 797 0 R >> endobj 4525 0 obj << /Title (Cursor Declaration) /Parent 4513 0 R /Prev 4524 0 R /A 800 0 R >> endobj 4526 0 obj << /Title (Syntax Elements) /Parent 4511 0 R /Prev 4513 0 R /Next 4533 0 R /First 4527 0 R /Last 4532 0 R /Count -6 /A 803 0 R >> endobj 4527 0 obj << /Title (Literals) /Parent 4526 0 R /Next 4528 0 R /A 806 0 R >> endobj 4528 0 obj << /Title (References, etc.) /Parent 4526 0 R /Prev 4527 0 R /Next 4529 0 R /A 809 0 R >> endobj 4529 0 obj << /Title (Value Expression) /Parent 4526 0 R /Prev 4528 0 R /Next 4530 0 R /A 812 0 R >> endobj 4530 0 obj << /Title (Predicates) /Parent 4526 0 R /Prev 4529 0 R /Next 4531 0 R /A 815 0 R >> endobj 4531 0 obj << /Title (Aggregate Functions) /Parent 4526 0 R /Prev 4530 0 R /Next 4532 0 R /A 818 0 R >> endobj 4532 0 obj << /Title (Other Syntax Elements) /Parent 4526 0 R /Prev 4531 0 R /A 821 0 R >> endobj 4533 0 obj << /Title (Data Access Statements) /Parent 4511 0 R /Prev 4526 0 R /Next 4552 0 R /First 4534 0 R /Last 4551 0 R /Count -18 /A 824 0 R >> endobj 4534 0 obj << /Title (Select Statement) /Parent 4533 0 R /Next 4535 0 R /A 827 0 R >> endobj 4535 0 obj << /Title (Table) /Parent 4533 0 R /Prev 4534 0 R /Next 4536 0 R /A 830 0 R >> endobj 4536 0 obj << /Title (Subquery) /Parent 4533 0 R /Prev 4535 0 R /Next 4537 0 R /A 833 0 R >> endobj 4537 0 obj << /Title (Query Specification) /Parent 4533 0 R /Prev 4536 0 R /Next 4538 0 R /A 836 0 R >> endobj 4538 0 obj << /Title (Table Expression) /Parent 4533 0 R /Prev 4537 0 R /Next 4539 0 R /A 839 0 R >> endobj 4539 0 obj << /Title (Table Primary) /Parent 4533 0 R /Prev 4538 0 R /Next 4540 0 R /A 842 0 R >> endobj 4540 0 obj << /Title (Joined Table) /Parent 4533 0 R /Prev 4539 0 R /Next 4541 0 R /A 845 0 R >> endobj 4541 0 obj << /Title (Selection) /Parent 4533 0 R /Prev 4540 0 R /Next 4542 0 R /A 848 0 R >> endobj 4542 0 obj << /Title (Projection) /Parent 4533 0 R /Prev 4541 0 R /Next 4543 0 R /A 851 0 R >> endobj 4543 0 obj << /Title (Computed Columns) /Parent 4533 0 R /Prev 4542 0 R /Next 4544 0 R /A 854 0 R >> endobj 4544 0 obj << /Title (Naming) /Parent 4533 0 R /Prev 4543 0 R /Next 4545 0 R /A 857 0 R >> endobj 4545 0 obj << /Title (Grouping Operations) /Parent 4533 0 R /Prev 4544 0 R /Next 4546 0 R /A 860 0 R >> endobj 4546 0 obj << /Title (Aggregation) /Parent 4533 0 R /Prev 4545 0 R /Next 4547 0 R /A 863 0 R >> endobj 4547 0 obj << /Title (Set Operations) /Parent 4533 0 R /Prev 4546 0 R /Next 4548 0 R /A 866 0 R >> endobj 4548 0 obj << /Title (With Clause and Recursive Queries) /Parent 4533 0 R /Prev 4547 0 R /Next 4549 0 R /A 869 0 R >> endobj 4549 0 obj << /Title (Query Expression) /Parent 4533 0 R /Prev 4548 0 R /Next 4550 0 R /A 872 0 R >> endobj 4550 0 obj << /Title (Ordering) /Parent 4533 0 R /Prev 4549 0 R /Next 4551 0 R /A 875 0 R >> endobj 4551 0 obj << /Title (Slicing) /Parent 4533 0 R /Prev 4550 0 R /A 878 0 R >> endobj 4552 0 obj << /Title (Data Change Statements) /Parent 4511 0 R /Prev 4533 0 R /Next 4558 0 R /First 4553 0 R /Last 4557 0 R /Count -5 /A 881 0 R >> endobj 4553 0 obj << /Title (Delete Statement) /Parent 4552 0 R /Next 4554 0 R /A 1050 0 R >> endobj 4554 0 obj << /Title (Truncate Statement) /Parent 4552 0 R /Prev 4553 0 R /Next 4555 0 R /A 1054 0 R >> endobj 4555 0 obj << /Title (Insert Statement) /Parent 4552 0 R /Prev 4554 0 R /Next 4556 0 R /A 1057 0 R >> endobj 4556 0 obj << /Title (Update Statement) /Parent 4552 0 R /Prev 4555 0 R /Next 4557 0 R /A 1060 0 R >> endobj 4557 0 obj << /Title (Merge Statement) /Parent 4552 0 R /Prev 4556 0 R /A 1063 0 R >> endobj 4558 0 obj << /Title (Diagnostics and State) /Parent 4511 0 R /Prev 4552 0 R /A 1066 0 R >> endobj 4559 0 obj << /Title /Parent 4389 0 R /Prev 4511 0 R /Next 4592 0 R /First 4560 0 R /Last 4588 0 R /Count -32 /A 908 0 R >> endobj 4560 0 obj << /Title (Routine Definition) /Parent 4559 0 R /Next 4562 0 R /First 4561 0 R /Last 4561 0 R /Count -1 /A 1071 0 R >> endobj 4561 0 obj << /Title (Routine Characteristics) /Parent 4560 0 R /A 1074 0 R >> endobj 4562 0 obj << /Title (SQL Language Routines \(PSM\)) /Parent 4559 0 R /Prev 4560 0 R /Next 4582 0 R /First 4563 0 R /Last 4581 0 R /Count -19 /A 1077 0 R >> endobj 4563 0 obj << /Title (Advantages and Disadvantages) /Parent 4562 0 R /Next 4564 0 R /A 1080 0 R >> endobj 4564 0 obj << /Title (Routine Statements) /Parent 4562 0 R /Prev 4563 0 R /Next 4565 0 R /A 1083 0 R >> endobj 4565 0 obj << /Title (Compound Statement) /Parent 4562 0 R /Prev 4564 0 R /Next 4566 0 R /A 1086 0 R >> endobj 4566 0 obj << /Title (Table Variables) /Parent 4562 0 R /Prev 4565 0 R /Next 4567 0 R /A 1089 0 R >> endobj 4567 0 obj << /Title (Variables) /Parent 4562 0 R /Prev 4566 0 R /Next 4568 0 R /A 1092 0 R >> endobj 4568 0 obj << /Title (Cursors) /Parent 4562 0 R /Prev 4567 0 R /Next 4569 0 R /A 1095 0 R >> endobj 4569 0 obj << /Title (Handlers) /Parent 4562 0 R /Prev 4568 0 R /Next 4570 0 R /A 1098 0 R >> endobj 4570 0 obj << /Title (Assignment Statement) /Parent 4562 0 R /Prev 4569 0 R /Next 4571 0 R /A 1101 0 R >> endobj 4571 0 obj << /Title (Select Statement : Single Row) /Parent 4562 0 R /Prev 4570 0 R /Next 4572 0 R /A 1104 0 R >> endobj 4572 0 obj << /Title (Formal Parameters) /Parent 4562 0 R /Prev 4571 0 R /Next 4573 0 R /A 1107 0 R >> endobj 4573 0 obj << /Title (Iterated Statements) /Parent 4562 0 R /Prev 4572 0 R /Next 4574 0 R /A 1110 0 R >> endobj 4574 0 obj << /Title (Iterated FOR Statement) /Parent 4562 0 R /Prev 4573 0 R /Next 4575 0 R /A 1113 0 R >> endobj 4575 0 obj << /Title (Conditional Statements) /Parent 4562 0 R /Prev 4574 0 R /Next 4576 0 R /A 1116 0 R >> endobj 4576 0 obj << /Title (Return Statement) /Parent 4562 0 R /Prev 4575 0 R /Next 4577 0 R /A 1119 0 R >> endobj 4577 0 obj << /Title (Control Statements) /Parent 4562 0 R /Prev 4576 0 R /Next 4578 0 R /A 1122 0 R >> endobj 4578 0 obj << /Title (Raising Exceptions) /Parent 4562 0 R /Prev 4577 0 R /Next 4579 0 R /A 1125 0 R >> endobj 4579 0 obj << /Title (Routine Polymorphism) /Parent 4562 0 R /Prev 4578 0 R /Next 4580 0 R /A 1128 0 R >> endobj 4580 0 obj << /Title (Returning Data From Procedures) /Parent 4562 0 R /Prev 4579 0 R /Next 4581 0 R /A 1131 0 R >> endobj 4581 0 obj << /Title (Recursive Routines) /Parent 4562 0 R /Prev 4580 0 R /A 1134 0 R >> endobj 4582 0 obj << /Title (Java Language Routines \(SQL/JRT\)) /Parent 4559 0 R /Prev 4562 0 R /Next 4588 0 R /First 4583 0 R /Last 4587 0 R /Count -5 /A 1137 0 R >> endobj 4583 0 obj << /Title (Polymorphism) /Parent 4582 0 R /Next 4584 0 R /A 1140 0 R >> endobj 4584 0 obj << /Title (Java Language Procedures) /Parent 4582 0 R /Prev 4583 0 R /Next 4585 0 R /A 1143 0 R >> endobj 4585 0 obj << /Title (Java Static Methods) /Parent 4582 0 R /Prev 4584 0 R /Next 4586 0 R /A 1146 0 R >> endobj 4586 0 obj << /Title (Legacy Support) /Parent 4582 0 R /Prev 4585 0 R /Next 4587 0 R /A 1149 0 R >> endobj 4587 0 obj << /Title (Securing Access to Classes) /Parent 4582 0 R /Prev 4586 0 R /A 1152 0 R >> endobj 4588 0 obj << /Title (User Defined Aggregate Functions) /Parent 4559 0 R /Prev 4582 0 R /First 4589 0 R /Last 4591 0 R /Count -3 /A 1155 0 R >> endobj 4589 0 obj << /Title (Definition of Aggregate Functions) /Parent 4588 0 R /Next 4590 0 R /A 1158 0 R >> endobj 4590 0 obj << /Title (SQL PSM Aggregate Functions) /Parent 4588 0 R /Prev 4589 0 R /Next 4591 0 R /A 1161 0 R >> endobj 4591 0 obj << /Title (Java Aggregate Functions) /Parent 4588 0 R /Prev 4590 0 R /A 1164 0 R >> endobj 4592 0 obj << /Title /Parent 4389 0 R /Prev 4559 0 R /Next 4606 0 R /First 4593 0 R /Last 4605 0 R /Count -13 /A 1017 0 R >> endobj 4593 0 obj << /Title (Overview) /Parent 4592 0 R /Next 4597 0 R /First 4594 0 R /Last 4596 0 R /Count -3 /A 1169 0 R >> endobj 4594 0 obj << /Title (BEFORE Triggers) /Parent 4593 0 R /Next 4595 0 R /A 1172 0 R >> endobj 4595 0 obj << /Title (AFTER Triggers) /Parent 4593 0 R /Prev 4594 0 R /Next 4596 0 R /A 1175 0 R >> endobj 4596 0 obj << /Title (INSTEAD OF Triggers) /Parent 4593 0 R /Prev 4595 0 R /A 1178 0 R >> endobj 4597 0 obj << /Title (Trigger Properties) /Parent 4592 0 R /Prev 4593 0 R /Next 4605 0 R /First 4598 0 R /Last 4604 0 R /Count -7 /A 1181 0 R >> endobj 4598 0 obj << /Title (Trigger Event) /Parent 4597 0 R /Next 4599 0 R /A 1184 0 R >> endobj 4599 0 obj << /Title (Granularity) /Parent 4597 0 R /Prev 4598 0 R /Next 4600 0 R /A 1187 0 R >> endobj 4600 0 obj << /Title (Trigger Action Time) /Parent 4597 0 R /Prev 4599 0 R /Next 4601 0 R /A 1190 0 R >> endobj 4601 0 obj << /Title (References to Rows) /Parent 4597 0 R /Prev 4600 0 R /Next 4602 0 R /A 1193 0 R >> endobj 4602 0 obj << /Title (Trigger Condition) /Parent 4597 0 R /Prev 4601 0 R /Next 4603 0 R /A 1196 0 R >> endobj 4603 0 obj << /Title (Trigger Action in SQL) /Parent 4597 0 R /Prev 4602 0 R /Next 4604 0 R /A 1199 0 R >> endobj 4604 0 obj << /Title (Trigger Action in Java) /Parent 4597 0 R /Prev 4603 0 R /A 1202 0 R >> endobj 4605 0 obj << /Title (Trigger Creation) /Parent 4592 0 R /Prev 4597 0 R /A 1205 0 R >> endobj 4606 0 obj << /Title /Parent 4389 0 R /Prev 4592 0 R /Next 4619 0 R /First 4607 0 R /Last 4618 0 R /Count -12 /A 1208 0 R >> endobj 4607 0 obj << /Title (Overview) /Parent 4606 0 R /Next 4608 0 R /A 1414 0 R >> endobj 4608 0 obj << /Title (String and Binary String Functions) /Parent 4606 0 R /Prev 4607 0 R /Next 4609 0 R /A 1418 0 R >> endobj 4609 0 obj << /Title (Numeric Functions) /Parent 4606 0 R /Prev 4608 0 R /Next 4610 0 R /A 1421 0 R >> endobj 4610 0 obj << /Title (Date Time and Interval Functions) /Parent 4606 0 R /Prev 4609 0 R /Next 4616 0 R /First 4611 0 R /Last 4615 0 R /Count -5 /A 1424 0 R >> endobj 4611 0 obj << /Title (Functions to Report the Time Zone.) /Parent 4610 0 R /Next 4612 0 R /A 1427 0 R >> endobj 4612 0 obj << /Title (Functions to Report the Current Datetime) /Parent 4610 0 R /Prev 4611 0 R /Next 4613 0 R /A 1430 0 R >> endobj 4613 0 obj << /Title (Functions to Extract an Element of a Datetime) /Parent 4610 0 R /Prev 4612 0 R /Next 4614 0 R /A 1433 0 R >> endobj 4614 0 obj << /Title (Functions for Datetime Arithmetic) /Parent 4610 0 R /Prev 4613 0 R /Next 4615 0 R /A 1436 0 R >> endobj 4615 0 obj << /Title (Functions to Convert or Format a Datetime) /Parent 4610 0 R /Prev 4614 0 R /A 1439 0 R >> endobj 4616 0 obj << /Title (Array Functions) /Parent 4606 0 R /Prev 4610 0 R /Next 4617 0 R /A 1442 0 R >> endobj 4617 0 obj << /Title (General Functions) /Parent 4606 0 R /Prev 4616 0 R /Next 4618 0 R /A 1445 0 R >> endobj 4618 0 obj << /Title (System Functions) /Parent 4606 0 R /Prev 4617 0 R /A 1448 0 R >> endobj 4619 0 obj << /Title /Parent 4389 0 R /Prev 4606 0 R /Next 4660 0 R /First 4620 0 R /Last 4654 0 R /Count -40 /A 1316 0 R >> endobj 4620 0 obj << /Title (Mode of Operation and Tables) /Parent 4619 0 R /Next 4626 0 R /First 4621 0 R /Last 4625 0 R /Count -5 /A 1453 0 R >> endobj 4621 0 obj << /Title (Mode of Operation) /Parent 4620 0 R /Next 4622 0 R /A 1456 0 R >> endobj 4622 0 obj << /Title (Tables) /Parent 4620 0 R /Prev 4621 0 R /Next 4623 0 R /A 1459 0 R >> endobj 4623 0 obj << /Title (Large Objects) /Parent 4620 0 R /Prev 4622 0 R /Next 4624 0 R /A 1462 0 R >> endobj 4624 0 obj << /Title (Deployment context) /Parent 4620 0 R /Prev 4623 0 R /Next 4625 0 R /A 1465 0 R >> endobj 4625 0 obj << /Title (Readonly Databases) /Parent 4620 0 R /Prev 4624 0 R /A 1468 0 R >> endobj 4626 0 obj << /Title (ACID, Persistence and Reliability) /Parent 4619 0 R /Prev 4620 0 R /Next 4628 0 R /First 4627 0 R /Last 4627 0 R /Count -1 /A 1471 0 R >> endobj 4627 0 obj << /Title (Atomicity, Consistency, Isolation, Durability) /Parent 4626 0 R /A 1474 0 R >> endobj 4628 0 obj << /Title (Backing Up Database Catalogs) /Parent 4619 0 R /Prev 4626 0 R /Next 4633 0 R /First 4629 0 R /Last 4632 0 R /Count -4 /A 1477 0 R >> endobj 4629 0 obj << /Title (Making Online Backups) /Parent 4628 0 R /Next 4630 0 R /A 1480 0 R >> endobj 4630 0 obj << /Title (Making Offline Backups) /Parent 4628 0 R /Prev 4629 0 R /Next 4631 0 R /A 1483 0 R >> endobj 4631 0 obj << /Title (Examining Backups) /Parent 4628 0 R /Prev 4630 0 R /Next 4632 0 R /A 1486 0 R >> endobj 4632 0 obj << /Title (Restoring a Backup) /Parent 4628 0 R /Prev 4631 0 R /A 1489 0 R >> endobj 4633 0 obj << /Title (Encrypted Databases) /Parent 4619 0 R /Prev 4628 0 R /Next 4637 0 R /First 4634 0 R /Last 4636 0 R /Count -3 /A 1492 0 R >> endobj 4634 0 obj << /Title (Creating and Accessing an Encrypted Database) /Parent 4633 0 R /Next 4635 0 R /A 1495 0 R >> endobj 4635 0 obj << /Title (Speed Considerations) /Parent 4633 0 R /Prev 4634 0 R /Next 4636 0 R /A 1498 0 R >> endobj 4636 0 obj << /Title (Security Considerations) /Parent 4633 0 R /Prev 4635 0 R /A 1501 0 R >> endobj 4637 0 obj << /Title (Monitoring Database Operations) /Parent 4619 0 R /Prev 4633 0 R /Next 4643 0 R /First 4638 0 R /Last 4642 0 R /Count -5 /A 1504 0 R >> endobj 4638 0 obj << /Title (External Statement Level Monitoring) /Parent 4637 0 R /Next 4639 0 R /A 1507 0 R >> endobj 4639 0 obj << /Title (Internal Statement Level Monitoring) /Parent 4637 0 R /Prev 4638 0 R /Next 4640 0 R /A 1510 0 R >> endobj 4640 0 obj << /Title (Internal Event Monitoring) /Parent 4637 0 R /Prev 4639 0 R /Next 4641 0 R /A 1513 0 R >> endobj 4641 0 obj << /Title (Log4J and JDK logging) /Parent 4637 0 R /Prev 4640 0 R /Next 4642 0 R /A 1516 0 R >> endobj 4642 0 obj << /Title (Server Operation Monitoring) /Parent 4637 0 R /Prev 4641 0 R /A 1519 0 R >> endobj 4643 0 obj << /Title (Database Security) /Parent 4619 0 R /Prev 4637 0 R /Next 4646 0 R /First 4644 0 R /Last 4645 0 R /Count -2 /A 1522 0 R >> endobj 4644 0 obj << /Title (Security Defaults) /Parent 4643 0 R /Next 4645 0 R /A 1525 0 R >> endobj 4645 0 obj << /Title (Authentication Control) /Parent 4643 0 R /Prev 4644 0 R /A 1528 0 R >> endobj 4646 0 obj << /Title (Compatibility with Other RDBMS) /Parent 4619 0 R /Prev 4643 0 R /Next 4654 0 R /First 4647 0 R /Last 4653 0 R /Count -7 /A 1531 0 R >> endobj 4647 0 obj << /Title (PostgreSQL Compatibility) /Parent 4646 0 R /Next 4648 0 R /A 1534 0 R >> endobj 4648 0 obj << /Title (MySQL Compatibility) /Parent 4646 0 R /Prev 4647 0 R /Next 4649 0 R /A 1537 0 R >> endobj 4649 0 obj << /Title (Firebird Compatibility) /Parent 4646 0 R /Prev 4648 0 R /Next 4650 0 R /A 1540 0 R >> endobj 4650 0 obj << /Title (Apache Derby Compatibility) /Parent 4646 0 R /Prev 4649 0 R /Next 4651 0 R /A 1543 0 R >> endobj 4651 0 obj << /Title (Oracle Compatibility) /Parent 4646 0 R /Prev 4650 0 R /Next 4652 0 R /A 1546 0 R >> endobj 4652 0 obj << /Title (DB2 Compatibility) /Parent 4646 0 R /Prev 4651 0 R /Next 4653 0 R /A 1549 0 R >> endobj 4653 0 obj << /Title (MS SQLServer and Sybase Compatibility) /Parent 4646 0 R /Prev 4652 0 R /A 1552 0 R >> endobj 4654 0 obj << /Title (Statements) /Parent 4619 0 R /Prev 4646 0 R /First 4655 0 R /Last 4659 0 R /Count -5 /A 1555 0 R >> endobj 4655 0 obj << /Title (System Operations) /Parent 4654 0 R /Next 4656 0 R /A 1558 0 R >> endobj 4656 0 obj << /Title (Database Settings) /Parent 4654 0 R /Prev 4655 0 R /Next 4657 0 R /A 1561 0 R >> endobj 4657 0 obj << /Title (SQL Conformance Settings) /Parent 4654 0 R /Prev 4656 0 R /Next 4658 0 R /A 1564 0 R >> endobj 4658 0 obj << /Title (Cache, Persistence and Files Settings) /Parent 4654 0 R /Prev 4657 0 R /Next 4659 0 R /A 1567 0 R >> endobj 4659 0 obj << /Title (Authentication Settings) /Parent 4654 0 R /Prev 4658 0 R /A 1570 0 R >> endobj 4660 0 obj << /Title /Parent 4389 0 R /Prev 4619 0 R /Next 4670 0 R /First 4661 0 R /Last 4669 0 R /Count -9 /A 1573 0 R >> endobj 4661 0 obj << /Title (Connection URL) /Parent 4660 0 R /Next 4662 0 R /A 1987 0 R >> endobj 4662 0 obj << /Title (Variables In Connection URL) /Parent 4660 0 R /Prev 4661 0 R /Next 4663 0 R /A 1991 0 R >> endobj 4663 0 obj << /Title (Connection properties) /Parent 4660 0 R /Prev 4662 0 R /Next 4664 0 R /A 1994 0 R >> endobj 4664 0 obj << /Title (Database Properties in Connection URL and Properties) /Parent 4660 0 R /Prev 4663 0 R /Next 4669 0 R /First 4665 0 R /Last 4668 0 R /Count -4 /A 1997 0 R >> endobj 4665 0 obj << /Title (SQL Conformance Properties) /Parent 4664 0 R /Next 4666 0 R /A 2000 0 R >> endobj 4666 0 obj << /Title (Database Operations Properties) /Parent 4664 0 R /Prev 4665 0 R /Next 4667 0 R /A 2003 0 R >> endobj 4667 0 obj << /Title (Database File and Memory Properties) /Parent 4664 0 R /Prev 4666 0 R /Next 4668 0 R /A 2006 0 R >> endobj 4668 0 obj << /Title (Crypt Properties) /Parent 4664 0 R /Prev 4667 0 R /A 2009 0 R >> endobj 4669 0 obj << /Title (System Properties) /Parent 4660 0 R /Prev 4664 0 R /A 2012 0 R >> endobj 4670 0 obj << /Title /Parent 4389 0 R /Prev 4660 0 R /Next 4690 0 R /First 4671 0 R /Last 4689 0 R /Count -19 /A 1805 0 R >> endobj 4671 0 obj << /Title (Listeners) /Parent 4670 0 R /Next 4675 0 R /First 4672 0 R /Last 4674 0 R /Count -3 /A 2017 0 R >> endobj 4672 0 obj << /Title (HyperSQL Server) /Parent 4671 0 R /Next 4673 0 R /A 2020 0 R >> endobj 4673 0 obj << /Title (HyperSQL HTTP Server) /Parent 4671 0 R /Prev 4672 0 R /Next 4674 0 R /A 2023 0 R >> endobj 4674 0 obj << /Title (HyperSQL HTTP Servlet) /Parent 4671 0 R /Prev 4673 0 R /A 2026 0 R >> endobj 4675 0 obj << /Title (Server and Web Server Properties) /Parent 4670 0 R /Prev 4671 0 R /Next 4676 0 R /A 2029 0 R >> endobj 4676 0 obj << /Title (Starting a Server from your Application) /Parent 4670 0 R /Prev 4675 0 R /Next 4677 0 R /A 2032 0 R >> endobj 4677 0 obj << /Title (Allowing a Connection to Open or Create a Database) /Parent 4670 0 R /Prev 4676 0 R /Next 4678 0 R /A 2035 0 R >> endobj 4678 0 obj << /Title (Specifying Database Properties at Server Start) /Parent 4670 0 R /Prev 4677 0 R /Next 4679 0 R /A 2038 0 R >> endobj 4679 0 obj << /Title (TLS Encryption) /Parent 4670 0 R /Prev 4678 0 R /Next 4689 0 R /First 4680 0 R /Last 4688 0 R /Count -9 /A 2041 0 R >> endobj 4680 0 obj << /Title (Requirements) /Parent 4679 0 R /Next 4681 0 R /A 2044 0 R >> endobj 4681 0 obj << /Title (Encrypting your JDBC connection) /Parent 4679 0 R /Prev 4680 0 R /Next 4684 0 R /First 4682 0 R /Last 4683 0 R /Count -2 /A 2047 0 R >> endobj 4682 0 obj << /Title (Client-Side) /Parent 4681 0 R /Next 4683 0 R /A 4381 0 R >> endobj 4683 0 obj << /Title (Server-Side \(Listener-Side\)) /Parent 4681 0 R /Prev 4682 0 R /A 4382 0 R >> endobj 4684 0 obj << /Title (JSSE) /Parent 4679 0 R /Prev 4681 0 R /Next 4685 0 R /A 1887 0 R >> endobj 4685 0 obj << /Title (Making a Private-key Keystore) /Parent 4679 0 R /Prev 4684 0 R /Next 4688 0 R /First 4686 0 R /Last 4687 0 R /Count -2 /A 1889 0 R >> endobj 4686 0 obj << /Title (CA-Signed Cert) /Parent 4685 0 R /Next 4687 0 R /A 4383 0 R >> endobj 4687 0 obj << /Title (Non-CA-Signed Cert) /Parent 4685 0 R /Prev 4686 0 R /A 4384 0 R >> endobj 4688 0 obj << /Title (Automatic Server or WebServer startup on UNIX) /Parent 4679 0 R /Prev 4685 0 R /A 2054 0 R >> endobj 4689 0 obj << /Title (Network Access Control) /Parent 4670 0 R /Prev 4679 0 R /A 2057 0 R >> endobj 4690 0 obj << /Title /Parent 4389 0 R /Prev 4670 0 R /Next 4702 0 R /First 4691 0 R /Last 4701 0 R /Count -11 /A 1915 0 R >> endobj 4691 0 obj << /Title (Purpose) /Parent 4690 0 R /Next 4692 0 R /A 2062 0 R >> endobj 4692 0 obj << /Title (Installation) /Parent 4690 0 R /Prev 4691 0 R /Next 4693 0 R /A 2065 0 R >> endobj 4693 0 obj << /Title (Setting up a HyperSQL Persistent Database Catalog and a HyperSQL Network Listener) /Parent 4690 0 R /Prev 4692 0 R /Next 4694 0 R /A 2068 0 R >> endobj 4694 0 obj << /Title (Accessing your Database) /Parent 4690 0 R /Prev 4693 0 R /Next 4695 0 R /A 2071 0 R >> endobj 4695 0 obj << /Title (Create additional Accounts) /Parent 4690 0 R /Prev 4694 0 R /Next 4696 0 R /A 2074 0 R >> endobj 4696 0 obj << /Title (Shutdown) /Parent 4690 0 R /Prev 4695 0 R /Next 4697 0 R /A 2077 0 R >> endobj 4697 0 obj << /Title (Running Hsqldb as a System Daemon) /Parent 4690 0 R /Prev 4696 0 R /Next 4701 0 R /First 4698 0 R /Last 4700 0 R /Count -3 /A 2080 0 R >> endobj 4698 0 obj << /Title (Portability of hsqldb init script) /Parent 4697 0 R /Next 4699 0 R /A 2083 0 R >> endobj 4699 0 obj << /Title (Init script Setup Procedure) /Parent 4697 0 R /Prev 4698 0 R /Next 4700 0 R /A 2086 0 R >> endobj 4700 0 obj << /Title (Troubleshooting the Init Script) /Parent 4697 0 R /Prev 4699 0 R /A 1956 0 R >> endobj 4701 0 obj << /Title (Upgrading) /Parent 4690 0 R /Prev 4697 0 R /A 2091 0 R >> endobj 4702 0 obj << /Title /Parent 4389 0 R /Prev 4690 0 R /Next 4731 0 R /First 4703 0 R /Last 4725 0 R /Count -28 /A 1970 0 R >> endobj 4703 0 obj << /Title (Memory and Disk Use) /Parent 4702 0 R /Next 4711 0 R /First 4704 0 R /Last 4710 0 R /Count -7 /A 2096 0 R >> endobj 4704 0 obj << /Title (Table Memory Allocation) /Parent 4703 0 R /Next 4705 0 R /A 2099 0 R >> endobj 4705 0 obj << /Title (Result Set Memory Allocation) /Parent 4703 0 R /Prev 4704 0 R /Next 4706 0 R /A 2102 0 R >> endobj 4706 0 obj << /Title (Temporary Memory Use During Operations) /Parent 4703 0 R /Prev 4705 0 R /Next 4707 0 R /A 2105 0 R >> endobj 4707 0 obj << /Title (Data Cache Memory Allocation) /Parent 4703 0 R /Prev 4706 0 R /Next 4708 0 R /A 2108 0 R >> endobj 4708 0 obj << /Title (Object Pool Memory Allocation) /Parent 4703 0 R /Prev 4707 0 R /Next 4709 0 R /A 2111 0 R >> endobj 4709 0 obj << /Title (Lob Memory Usage) /Parent 4703 0 R /Prev 4708 0 R /Next 4710 0 R /A 2114 0 R >> endobj 4710 0 obj << /Title (Disk Space) /Parent 4703 0 R /Prev 4709 0 R /A 2117 0 R >> endobj 4711 0 obj << /Title (Managing Database Connections) /Parent 4702 0 R /Prev 4703 0 R /Next 4712 0 R /A 2120 0 R >> endobj 4712 0 obj << /Title (Tweaking the Mode of Operation) /Parent 4702 0 R /Prev 4711 0 R /Next 4721 0 R /First 4713 0 R /Last 4720 0 R /Count -8 /A 2123 0 R >> endobj 4713 0 obj << /Title (Application Development and Testing) /Parent 4712 0 R /Next 4714 0 R /A 2126 0 R >> endobj 4714 0 obj << /Title (Embedded Databases in Desktop Applications) /Parent 4712 0 R /Prev 4713 0 R /Next 4715 0 R /A 2129 0 R >> endobj 4715 0 obj << /Title (Embedded Databases in Server Applications) /Parent 4712 0 R /Prev 4714 0 R /Next 4716 0 R /A 2132 0 R >> endobj 4716 0 obj << /Title (Mixed Mode : Embedding a HyperSQL Server \(Listener\)) /Parent 4712 0 R /Prev 4715 0 R /Next 4717 0 R /A 2135 0 R >> endobj 4717 0 obj << /Title (Using HyperSQL Without Logging Data Change) /Parent 4712 0 R /Prev 4716 0 R /Next 4718 0 R /A 2138 0 R >> endobj 4718 0 obj << /Title (Bulk Inserts, Updates and Deletes) /Parent 4712 0 R /Prev 4717 0 R /Next 4719 0 R /A 2141 0 R >> endobj 4719 0 obj << /Title (Using NIO File Access) /Parent 4712 0 R /Prev 4718 0 R /Next 4720 0 R /A 3814 0 R >> endobj 4720 0 obj << /Title (Server Databases) /Parent 4712 0 R /Prev 4719 0 R /A 3818 0 R >> endobj 4721 0 obj << /Title (Upgrading Databases) /Parent 4702 0 R /Prev 4712 0 R /Next 4724 0 R /First 4722 0 R /Last 4723 0 R /Count -2 /A 3821 0 R >> endobj 4722 0 obj << /Title (Upgrading From Older Versions) /Parent 4721 0 R /Next 4723 0 R /A 3824 0 R >> endobj 4723 0 obj << /Title (Manual Changes to the *.script File) /Parent 4721 0 R /Prev 4722 0 R /A 3827 0 R >> endobj 4724 0 obj << /Title (Backward Compatibility Issues) /Parent 4702 0 R /Prev 4721 0 R /Next 4725 0 R /A 3830 0 R >> endobj 4725 0 obj << /Title (HyperSQL Dependency Settings for Applications) /Parent 4702 0 R /Prev 4724 0 R /First 4726 0 R /Last 4729 0 R /Count -5 /A 3833 0 R >> endobj 4726 0 obj << /Title (What version to Pull) /Parent 4725 0 R /Next 4727 0 R /A 3836 0 R >> endobj 4727 0 obj << /Title (Using the HyperSQL Snapshot Repository) /Parent 4725 0 R /Prev 4726 0 R /Next 4729 0 R /First 4728 0 R /Last 4728 0 R /Count -1 /A 3839 0 R >> endobj 4728 0 obj << /Title (Snapshot Dependency Specification Examples) /Parent 4727 0 R /A 4385 0 R >> endobj 4729 0 obj << /Title (Range Versioning) /Parent 4725 0 R /Prev 4727 0 R /First 4730 0 R /Last 4730 0 R /Count -1 /A 3842 0 R >> endobj 4730 0 obj << /Title (Range Dependency Specification Examples) /Parent 4729 0 R /A 4386 0 R >> endobj 4731 0 obj << /Title /Parent 4389 0 R /Prev 4702 0 R /Next 4735 0 R /First 4732 0 R /Last 4734 0 R /Count -3 /A 2523 0 R >> endobj 4732 0 obj << /Title (List of SQL Standard Keywords) /Parent 4731 0 R /Next 4733 0 R /A 3847 0 R >> endobj 4733 0 obj << /Title (List of SQL Keywords Disallowed as HyperSQL Identifiers) /Parent 4731 0 R /Prev 4732 0 R /Next 4734 0 R /A 3850 0 R >> endobj 4734 0 obj << /Title (Special Function Keywords) /Parent 4731 0 R /Prev 4733 0 R /A 3853 0 R >> endobj 4735 0 obj << /Title /Parent 4389 0 R /Prev 4731 0 R /Next 4750 0 R /First 4736 0 R /Last 4749 0 R /Count -14 /A 2220 0 R >> endobj 4736 0 obj << /Title (Purpose) /Parent 4735 0 R /Next 4737 0 R /A 3858 0 R >> endobj 4737 0 obj << /Title (Building with Gradle) /Parent 4735 0 R /Prev 4736 0 R /Next 4743 0 R /First 4738 0 R /Last 4740 0 R /Count -5 /A 3861 0 R >> endobj 4738 0 obj << /Title (Invoking a Gradle Build Graphically) /Parent 4737 0 R /Next 4739 0 R /A 3864 0 R >> endobj 4739 0 obj << /Title (Invoking a Gradle Build from the Command Line) /Parent 4737 0 R /Prev 4738 0 R /Next 4740 0 R /A 3867 0 R >> endobj 4740 0 obj << /Title (Using Gradle) /Parent 4737 0 R /Prev 4739 0 R /First 4741 0 R /Last 4742 0 R /Count -2 /A 3870 0 R >> endobj 4741 0 obj << /Title (Using Text-based Gradle) /Parent 4740 0 R /Next 4742 0 R /A 4387 0 R >> endobj 4742 0 obj << /Title (Using the Gradle GUI) /Parent 4740 0 R /Prev 4741 0 R /A 4388 0 R >> endobj 4743 0 obj << /Title (Building with Apache Ant) /Parent 4735 0 R /Prev 4737 0 R /Next 4747 0 R /First 4744 0 R /Last 4746 0 R /Count -3 /A 3873 0 R >> endobj 4744 0 obj << /Title (Obtaining Ant) /Parent 4743 0 R /Next 4745 0 R /A 3876 0 R >> endobj 4745 0 obj << /Title (Building Hsqldb with Ant) /Parent 4743 0 R /Prev 4744 0 R /Next 4746 0 R /A 3879 0 R >> endobj 4746 0 obj << /Title (Building for Older JDKs) /Parent 4743 0 R /Prev 4745 0 R /A 3882 0 R >> endobj 4747 0 obj << /Title (Building with IDE Compilers) /Parent 4735 0 R /Prev 4743 0 R /Next 4748 0 R /A 3885 0 R >> endobj 4748 0 obj << /Title (Hsqldb CodeSwitcher) /Parent 4735 0 R /Prev 4747 0 R /Next 4749 0 R /A 3888 0 R >> endobj 4749 0 obj << /Title (Building Documentation) /Parent 4735 0 R /Prev 4748 0 R /A 3891 0 R >> endobj 4750 0 obj << /Title /Parent 4389 0 R /Prev 4735 0 R /Next 4754 0 R /First 4751 0 R /Last 4753 0 R /Count -3 /A 3894 0 R >> endobj 4751 0 obj << /Title (HyperSQL with OpenOffice) /Parent 4750 0 R /Next 4752 0 R /A 3897 0 R >> endobj 4752 0 obj << /Title (Using OpenOffice / LibreOffice as a Database Tool) /Parent 4750 0 R /Prev 4751 0 R /Next 4753 0 R /A 3900 0 R >> endobj 4753 0 obj << /Title (Converting .odb files to use with HyperSQL Server) /Parent 4750 0 R /Prev 4752 0 R /A 3903 0 R >> endobj 4754 0 obj << /Title /Parent 4389 0 R /Prev 4750 0 R /Next 4755 0 R /A 3906 0 R >> endobj 4755 0 obj << /Title (SQL Index) /Parent 4389 0 R /Prev 4754 0 R /Next 4756 0 R /A 3909 0 R >> endobj 4756 0 obj << /Title (General Index) /Parent 4389 0 R /Prev 4755 0 R /A 3912 0 R >> endobj 4757 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding >> endobj 4758 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 4759 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Roman /Encoding /WinAnsiEncoding >> endobj 4760 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding >> endobj 4761 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj 4762 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Courier /Encoding /WinAnsiEncoding >> endobj 4763 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Italic /Encoding /WinAnsiEncoding >> endobj 4764 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Bold /Encoding /WinAnsiEncoding >> endobj 4765 0 obj << /Limits [(N12538) (N12538)] /Names [(N12538) 818 0 R] >> endobj 4766 0 obj << /Limits [(N14213) (N14213)] /Names [(N14213) 1516 0 R] >> endobj 4767 0 obj << /Limits [(N15F7A) (N15F7A)] /Names [(N15F7A) 3814 0 R] >> endobj 4768 0 obj << /Limits [(N160C4) (N160C4)] /Names [(N160C4) 3839 0 R] >> endobj 4769 0 obj << /Limits [(N1610F) (N1610F)] /Names [(N1610F) 3842 0 R] >> endobj 4770 0 obj << /Limits [(acc_access_rights) (acc_access_rights)] /Names [(acc_access_rights) 753 0 R] >> endobj 4771 0 obj << /Limits [(acc_auth_and_access_ctrl) (acc_auth_and_access_ctrl)] /Names [(acc_auth_and_access_ctrl) 744 0 R] >> endobj 4772 0 obj << /Limits [(acc_built_in_roles_users) (acc_built_in_roles_users)] /Names [(acc_built_in_roles_users) 747 0 R] >> endobj 4773 0 obj << /Limits [(acc_listing) (acc_listing)] /Names [(acc_listing) 750 0 R] >> endobj 4774 0 obj << /Limits [(acc_overview) (acc_overview)] /Names [(acc_overview) 741 0 R] >> endobj 4775 0 obj << /Limits [(acc_statements) (acc_statements)] /Names [(acc_statements) 756 0 R] >> endobj 4776 0 obj << /Limits [(accesscontrol-chapt) (accesscontrol-chapt)] /Names [(accesscontrol-chapt) 577 0 R] >> endobj 4777 0 obj << /Limits [(altformats-sect) (altformats-sect)] /Names [(altformats-sect) 114 0 R] >> endobj 4778 0 obj << /Limits [(bfc_array_functions) (bfc_array_functions)] /Names [(bfc_array_functions) 1442 0 R] >> endobj 4779 0 obj << /Limits [(bfc_current_datetime) (bfc_current_datetime)] /Names [(bfc_current_datetime) 1430 0 R] >> endobj 4780 0 obj << /Limits [(bfc_datetime_arithmetic) (bfc_datetime_arithmetic)] /Names [(bfc_datetime_arithmetic) 1436 0 R] >> endobj 4781 0 obj << /Limits [(bfc_datetime_format) (bfc_datetime_format)] /Names [(bfc_datetime_format) 1439 0 R] >> endobj 4782 0 obj << /Limits [(bfc_datetime_functions) (bfc_datetime_functions)] /Names [(bfc_datetime_functions) 1424 0 R] >> endobj 4783 0 obj << /Limits [(bfc_extract_datetime) (bfc_extract_datetime)] /Names [(bfc_extract_datetime) 1433 0 R] >> endobj 4784 0 obj << /Limits [(bfc_general_functions) (bfc_general_functions)] /Names [(bfc_general_functions) 1445 0 R] >> endobj 4785 0 obj << /Limits [(bfc_overview) (bfc_overview)] /Names [(bfc_overview) 1414 0 R] >> endobj 4786 0 obj << /Limits [(bfc_string_binary_functions) (bfc_string_binary_functions)] /Names [(bfc_string_binary_functions) 1418 0 R] >> endobj 4787 0 obj << /Limits [(bfc_system_functions) (bfc_system_functions)] /Names [(bfc_system_functions) 1448 0 R] >> endobj 4788 0 obj << /Limits [(bfc_timezone_functions) (bfc_timezone_functions)] /Names [(bfc_timezone_functions) 1427 0 R] >> endobj 4789 0 obj << /Limits [(bga_ant_build) (bga_ant_build)] /Names [(bga_ant_build) 3879 0 R] >> endobj 4790 0 obj << /Limits [(bga_ant_obtaining) (bga_ant_obtaining)] /Names [(bga_ant_obtaining) 3876 0 R] >> endobj 4791 0 obj << /Limits [(bga_build_docs) (bga_build_docs)] /Names [(bga_build_docs) 3891 0 R] >> endobj 4792 0 obj << /Limits [(bga_build_ide) (bga_build_ide)] /Names [(bga_build_ide) 3885 0 R] >> endobj 4793 0 obj << /Limits [(bga_codeswitcher) (bga_codeswitcher)] /Names [(bga_codeswitcher) 3888 0 R] >> endobj 4794 0 obj << /Limits [(bga_gradle_cmd) (bga_gradle_cmd)] /Names [(bga_gradle_cmd) 3867 0 R] >> endobj 4795 0 obj << /Limits [(bga_gradle_gui) (bga_gradle_gui)] /Names [(bga_gradle_gui) 3864 0 R] >> endobj 4796 0 obj << /Limits [(bga_gradle_text) (bga_gradle_text)] /Names [(bga_gradle_text) 4387 0 R] >> endobj 4797 0 obj << /Limits [(bga_gradle_using) (bga_gradle_using)] /Names [(bga_gradle_using) 3870 0 R] >> endobj 4798 0 obj << /Limits [(bga_gradle_using_gui) (bga_gradle_using_gui)] /Names [(bga_gradle_using_gui) 4388 0 R] >> endobj 4799 0 obj << /Limits [(bga_old_jdk) (bga_old_jdk)] /Names [(bga_old_jdk) 3882 0 R] >> endobj 4800 0 obj << /Limits [(bga_overview) (bga_overview)] /Names [(bga_overview) 3858 0 R] >> endobj 4801 0 obj << /Limits [(book-ind) (book-ind)] /Names [(book-ind) 3912 0 R] >> endobj 4802 0 obj << /Limits [(book-pref) (book-pref)] /Names [(book-pref) 110 0 R] >> endobj 4803 0 obj << /Limits [(building-ant-sect) (building-ant-sect)] /Names [(building-ant-sect) 3873 0 R] >> endobj 4804 0 obj << /Limits [(building-app) (building-app)] /Names [(building-app) 2220 0 R] >> endobj 4805 0 obj << /Limits [(builtin_functions_numeric_sect) (builtin_functions_numeric_sect)] /Names [(builtin_functions_numeric_sect) 1421 0 R] >> endobj 4806 0 obj << /Limits [(builtinfunctions-chapt) (builtinfunctions-chapt)] /Names [(builtinfunctions-chapt) 1208 0 R] >> endobj 4807 0 obj << /Limits [(dac_aggregation) (dac_aggregation)] /Names [(dac_aggregation) 863 0 R] >> endobj 4808 0 obj << /Limits [(dac_computed_columns) (dac_computed_columns)] /Names [(dac_computed_columns) 854 0 R] >> endobj 4809 0 obj << /Limits [(dac_data_access_statements) (dac_data_access_statements)] /Names [(dac_data_access_statements) 824 0 R] >> endobj 4810 0 obj << /Limits [(dac_data_change_statements) (dac_data_change_statements)] /Names [(dac_data_change_statements) 881 0 R] >> endobj 4811 0 obj << /Limits [(dac_declare_cursor) (dac_declare_cursor)] /Names [(dac_declare_cursor) 800 0 R] >> endobj 4812 0 obj << /Limits [(dac_delete_statement) (dac_delete_statement)] /Names [(dac_delete_statement) 1050 0 R] >> endobj 4813 0 obj << /Limits [(dac_diagnostics_state) (dac_diagnostics_state)] /Names [(dac_diagnostics_state) 1066 0 R] >> endobj 4814 0 obj << /Limits [(dac_grouping_operations) (dac_grouping_operations)] /Names [(dac_grouping_operations) 860 0 R] >> endobj 4815 0 obj << /Limits [(dac_insert_statement) (dac_insert_statement)] /Names [(dac_insert_statement) 1057 0 R] >> endobj 4816 0 obj << /Limits [(dac_jdbc_autocommit) (dac_jdbc_autocommit)] /Names [(dac_jdbc_autocommit) 782 0 R] >> endobj 4817 0 obj << /Limits [(dac_jdbc_callable_statement) (dac_jdbc_callable_statement)] /Names [(dac_jdbc_callable_statement) 794 0 R] >> endobj 4818 0 obj << /Limits [(dac_jdbc_columns_rows) (dac_jdbc_columns_rows)] /Names [(dac_jdbc_columns_rows) 767 0 R] >> endobj 4819 0 obj << /Limits [(dac_jdbc_cursor_holdability) (dac_jdbc_cursor_holdability)] /Names [(dac_jdbc_cursor_holdability) 779 0 R] >> endobj 4820 0 obj << /Limits [(dac_jdbc_cursor_navigation) (dac_jdbc_cursor_navigation)] /Names [(dac_jdbc_cursor_navigation) 770 0 R] >> endobj 4821 0 obj << /Limits [(dac_jdbc_cursor_sensitivity) (dac_jdbc_cursor_sensitivity)] /Names [(dac_jdbc_cursor_sensitivity) 776 0 R] >> endobj 4822 0 obj << /Limits [(dac_jdbc_cursor_updatability) (dac_jdbc_cursor_updatability)] /Names [(dac_jdbc_cursor_updatability) 773 0 R] >> endobj 4823 0 obj << /Limits [(dac_jdbc_cursors_result_sets) (dac_jdbc_cursors_result_sets)] /Names [(dac_jdbc_cursors_result_sets) 764 0 R] >> endobj 4824 0 obj << /Limits [(dac_jdbc_data_change) (dac_jdbc_data_change)] /Names [(dac_jdbc_data_change) 791 0 R] >> endobj 4825 0 obj << /Limits [(dac_jdbc_overview) (dac_jdbc_overview)] /Names [(dac_jdbc_overview) 785 0 R] >> endobj 4826 0 obj << /Limits [(dac_jdbc_parameters) (dac_jdbc_parameters)] /Names [(dac_jdbc_parameters) 788 0 R] >> endobj 4827 0 obj << /Limits [(dac_jdbc_return_values) (dac_jdbc_return_values)] /Names [(dac_jdbc_return_values) 797 0 R] >> endobj 4828 0 obj << /Limits [(dac_joined_table) (dac_joined_table)] /Names [(dac_joined_table) 845 0 R] >> endobj 4829 0 obj << /Limits [(dac_literals) (dac_literals)] /Names [(dac_literals) 806 0 R] >> endobj 4830 0 obj << /Limits [(dac_merge_statement) (dac_merge_statement)] /Names [(dac_merge_statement) 1063 0 R] >> endobj 4831 0 obj << /Limits [(dac_naming) (dac_naming)] /Names [(dac_naming) 857 0 R] >> endobj 4832 0 obj << /Limits [(dac_ordering) (dac_ordering)] /Names [(dac_ordering) 875 0 R] >> endobj 4833 0 obj << /Limits [(dac_other_syntax_elements) (dac_other_syntax_elements)] /Names [(dac_other_syntax_elements) 821 0 R] >> endobj 4834 0 obj << /Limits [(dac_overview) (dac_overview)] /Names [(dac_overview) 761 0 R] >> endobj 4835 0 obj << /Limits [(dac_projection) (dac_projection)] /Names [(dac_projection) 851 0 R] >> endobj 4836 0 obj << /Limits [(dac_query_expression) (dac_query_expression)] /Names [(dac_query_expression) 872 0 R] >> endobj 4837 0 obj << /Limits [(dac_query_specification) (dac_query_specification)] /Names [(dac_query_specification) 836 0 R] >> endobj 4838 0 obj << /Limits [(dac_selection) (dac_selection)] /Names [(dac_selection) 848 0 R] >> endobj 4839 0 obj << /Limits [(dac_set_operations) (dac_set_operations)] /Names [(dac_set_operations) 866 0 R] >> endobj 4840 0 obj << /Limits [(dac_slicing) (dac_slicing)] /Names [(dac_slicing) 878 0 R] >> endobj 4841 0 obj << /Limits [(dac_sql_predicates) (dac_sql_predicates)] /Names [(dac_sql_predicates) 815 0 R] >> endobj 4842 0 obj << /Limits [(dac_sql_references) (dac_sql_references)] /Names [(dac_sql_references) 809 0 R] >> endobj 4843 0 obj << /Limits [(dac_sql_select_statement) (dac_sql_select_statement)] /Names [(dac_sql_select_statement) 827 0 R] >> endobj 4844 0 obj << /Limits [(dac_subquery) (dac_subquery)] /Names [(dac_subquery) 833 0 R] >> endobj 4845 0 obj << /Limits [(dac_syntax_elements) (dac_syntax_elements)] /Names [(dac_syntax_elements) 803 0 R] >> endobj 4846 0 obj << /Limits [(dac_table) (dac_table)] /Names [(dac_table) 830 0 R] >> endobj 4847 0 obj << /Limits [(dac_table_expression) (dac_table_expression)] /Names [(dac_table_expression) 839 0 R] >> endobj 4848 0 obj << /Limits [(dac_table_primary) (dac_table_primary)] /Names [(dac_table_primary) 842 0 R] >> endobj 4849 0 obj << /Limits [(dac_truncate_statement) (dac_truncate_statement)] /Names [(dac_truncate_statement) 1054 0 R] >> endobj 4850 0 obj << /Limits [(dac_update_statement) (dac_update_statement)] /Names [(dac_update_statement) 1060 0 R] >> endobj 4851 0 obj << /Limits [(dac_value_expression) (dac_value_expression)] /Names [(dac_value_expression) 812 0 R] >> endobj 4852 0 obj << /Limits [(dac_with_clause) (dac_with_clause)] /Names [(dac_with_clause) 869 0 R] >> endobj 4853 0 obj << /Limits [(dataaccess-chapt) (dataaccess-chapt)] /Names [(dataaccess-chapt) 612 0 R] >> endobj 4854 0 obj << /Limits [(databaseobjects-chapt) (databaseobjects-chapt)] /Names [(databaseobjects-chapt) 431 0 R] >> endobj 4855 0 obj << /Limits [(dbc_assertions) (dbc_assertions)] /Names [(dbc_assertions) 467 0 R] >> endobj 4856 0 obj << /Limits [(dbc_char_sets_info_schema) (dbc_char_sets_info_schema)] /Names [(dbc_char_sets_info_schema) 524 0 R] >> endobj 4857 0 obj << /Limits [(dbc_character_sets) (dbc_character_sets)] /Names [(dbc_character_sets) 443 0 R] >> endobj 4858 0 obj << /Limits [(dbc_collations) (dbc_collations)] /Names [(dbc_collations) 446 0 R] >> endobj 4859 0 obj << /Limits [(dbc_commenting) (dbc_commenting)] /Names [(dbc_commenting) 488 0 R] >> endobj 4860 0 obj << /Limits [(dbc_common_elements) (dbc_common_elements)] /Names [(dbc_common_elements) 482 0 R] >> endobj 4861 0 obj << /Limits [(dbc_constraints) (dbc_constraints)] /Names [(dbc_constraints) 464 0 R] >> endobj 4862 0 obj << /Limits [(dbc_data_type_info_schema) (dbc_data_type_info_schema)] /Names [(dbc_data_type_info_schema) 536 0 R] >> endobj 4863 0 obj << /Limits [(dbc_distinct_types) (dbc_distinct_types)] /Names [(dbc_distinct_types) 449 0 R] >> endobj 4864 0 obj << /Limits [(dbc_domain_creation) (dbc_domain_creation)] /Names [(dbc_domain_creation) 503 0 R] >> endobj 4865 0 obj << /Limits [(dbc_domains_info_schema) (dbc_domains_info_schema)] /Names [(dbc_domains_info_schema) 452 0 R] >> endobj 4866 0 obj << /Limits [(dbc_hypersql_views_info_schema) (dbc_hypersql_views_info_schema)] /Names [(dbc_hypersql_views_info_schema) 4380 0 R] >> endobj 4867 0 obj << /Limits [(dbc_indexes) (dbc_indexes)] /Names [(dbc_indexes) 476 0 R] >> endobj 4868 0 obj << /Limits [(dbc_information_schema) (dbc_information_schema)] /Names [(dbc_information_schema) 521 0 R] >> endobj 4869 0 obj << /Limits [(dbc_name_info_schema) (dbc_name_info_schema)] /Names [(dbc_name_info_schema) 533 0 R] >> endobj 4870 0 obj << /Limits [(dbc_names_references) (dbc_names_references)] /Names [(dbc_names_references) 440 0 R] >> endobj 4871 0 obj << /Limits [(dbc_number_sequence) (dbc_number_sequence)] /Names [(dbc_number_sequence) 455 0 R] >> endobj 4872 0 obj << /Limits [(dbc_operations_info_schema) (dbc_operations_info_schema)] /Names [(dbc_operations_info_schema) 542 0 R] >> endobj 4873 0 obj << /Limits [(dbc_other_object_creation) (dbc_other_object_creation)] /Names [(dbc_other_object_creation) 518 0 R] >> endobj 4874 0 obj << /Limits [(dbc_overview) (dbc_overview)] /Names [(dbc_overview) 434 0 R] >> endobj 4875 0 obj << /Limits [(dbc_procedure_satement) (dbc_procedure_satement)] /Names [(dbc_procedure_satement) 515 0 R] >> endobj 4876 0 obj << /Limits [(dbc_product_info_schema) (dbc_product_info_schema)] /Names [(dbc_product_info_schema) 539 0 R] >> endobj 4877 0 obj << /Limits [(dbc_renaming) (dbc_renaming)] /Names [(dbc_renaming) 485 0 R] >> endobj 4878 0 obj << /Limits [(dbc_routine_creation) (dbc_routine_creation)] /Names [(dbc_routine_creation) 509 0 R] >> endobj 4879 0 obj << /Limits [(dbc_routines) (dbc_routines)] /Names [(dbc_routines) 473 0 R] >> endobj 4880 0 obj << /Limits [(dbc_schema_creation) (dbc_schema_creation)] /Names [(dbc_schema_creation) 491 0 R] >> endobj 4881 0 obj << /Limits [(dbc_schema_def_statements) (dbc_schema_def_statements)] /Names [(dbc_schema_def_statements) 479 0 R] >> endobj 4882 0 obj << /Limits [(dbc_schemas_schema_objects) (dbc_schemas_schema_objects)] /Names [(dbc_schemas_schema_objects) 437 0 R] >> endobj 4883 0 obj << /Limits [(dbc_sequence_creation) (dbc_sequence_creation)] /Names [(dbc_sequence_creation) 512 0 R] >> endobj 4884 0 obj << /Limits [(dbc_standard_views_info_schema) (dbc_standard_views_info_schema)] /Names [(dbc_standard_views_info_schema) 545 0 R] >> endobj 4885 0 obj << /Limits [(dbc_table_creation) (dbc_table_creation)] /Names [(dbc_table_creation) 494 0 R] >> endobj 4886 0 obj << /Limits [(dbc_table_manupulation) (dbc_table_manupulation)] /Names [(dbc_table_manupulation) 497 0 R] >> endobj 4887 0 obj << /Limits [(dbc_tables) (dbc_tables)] /Names [(dbc_tables) 458 0 R] >> endobj 4888 0 obj << /Limits [(dbc_trigger_creation) (dbc_trigger_creation)] /Names [(dbc_trigger_creation) 506 0 R] >> endobj 4889 0 obj << /Limits [(dbc_triggers) (dbc_triggers)] /Names [(dbc_triggers) 470 0 R] >> endobj 4890 0 obj << /Limits [(dbc_view_creation) (dbc_view_creation)] /Names [(dbc_view_creation) 500 0 R] >> endobj 4891 0 obj << /Limits [(dbc_views) (dbc_views)] /Names [(dbc_views) 461 0 R] >> endobj 4892 0 obj << /Limits [(dbc_views_info_schema) (dbc_views_info_schema)] /Names [(dbc_views_info_schema) 527 0 R] >> endobj 4893 0 obj << /Limits [(dbc_visibility_info_schema) (dbc_visibility_info_schema)] /Names [(dbc_visibility_info_schema) 530 0 R] >> endobj 4894 0 obj << /Limits [(dbproperties-chapt) (dbproperties-chapt)] /Names [(dbproperties-chapt) 1573 0 R] >> endobj 4895 0 obj << /Limits [(dec_app_dev_testing) (dec_app_dev_testing)] /Names [(dec_app_dev_testing) 2126 0 R] >> endobj 4896 0 obj << /Limits [(dec_backware_compatibility) (dec_backware_compatibility)] /Names [(dec_backware_compatibility) 3830 0 R] >> endobj 4897 0 obj << /Limits [(dec_bulk_operations) (dec_bulk_operations)] /Names [(dec_bulk_operations) 2141 0 R] >> endobj 4898 0 obj << /Limits [(dec_cache_mem_use) (dec_cache_mem_use)] /Names [(dec_cache_mem_use) 2108 0 R] >> endobj 4899 0 obj << /Limits [(dec_dependency_applications) (dec_dependency_applications)] /Names [(dec_dependency_applications) 3833 0 R] >> endobj 4900 0 obj << /Limits [(dec_disk_space) (dec_disk_space)] /Names [(dec_disk_space) 2117 0 R] >> endobj 4901 0 obj << /Limits [(dec_embedded_desktop_db) (dec_embedded_desktop_db)] /Names [(dec_embedded_desktop_db) 2129 0 R] >> endobj 4902 0 obj << /Limits [(dec_embedded_server_db) (dec_embedded_server_db)] /Names [(dec_embedded_server_db) 2132 0 R] >> endobj 4903 0 obj << /Limits [(dec_hsqldb_dyn_dep_examples) (dec_hsqldb_dyn_dep_examples)] /Names [(dec_hsqldb_dyn_dep_examples) 4386 0 R] >> endobj 4904 0 obj << /Limits [(dec_hsqldb_snap_dep_examples) (dec_hsqldb_snap_dep_examples)] /Names [(dec_hsqldb_snap_dep_examples) 4385 0 R] >> endobj 4905 0 obj << /Limits [(dec_hsqldb_version_pull) (dec_hsqldb_version_pull)] /Names [(dec_hsqldb_version_pull) 3836 0 R] >> endobj 4906 0 obj << /Limits [(dec_lob_mem_use) (dec_lob_mem_use)] /Names [(dec_lob_mem_use) 2114 0 R] >> endobj 4907 0 obj << /Limits [(dec_managing_connections) (dec_managing_connections)] /Names [(dec_managing_connections) 2120 0 R] >> endobj 4908 0 obj << /Limits [(dec_mem_disk_use) (dec_mem_disk_use)] /Names [(dec_mem_disk_use) 2096 0 R] >> endobj 4909 0 obj << /Limits [(dec_mixed_mode_server) (dec_mixed_mode_server)] /Names [(dec_mixed_mode_server) 2135 0 R] >> endobj 4910 0 obj << /Limits [(dec_no_logging) (dec_no_logging)] /Names [(dec_no_logging) 2138 0 R] >> endobj 4911 0 obj << /Limits [(dec_pool_mem_use) (dec_pool_mem_use)] /Names [(dec_pool_mem_use) 2111 0 R] >> endobj 4912 0 obj << /Limits [(dec_result_mem_use) (dec_result_mem_use)] /Names [(dec_result_mem_use) 2102 0 R] >> endobj 4913 0 obj << /Limits [(dec_script_manual_change) (dec_script_manual_change)] /Names [(dec_script_manual_change) 3827 0 R] >> endobj 4914 0 obj << /Limits [(dec_server_db) (dec_server_db)] /Names [(dec_server_db) 3818 0 R] >> endobj 4915 0 obj << /Limits [(dec_table_mem_use) (dec_table_mem_use)] /Names [(dec_table_mem_use) 2099 0 R] >> endobj 4916 0 obj << /Limits [(dec_temp_mem_use) (dec_temp_mem_use)] /Names [(dec_temp_mem_use) 2105 0 R] >> endobj 4917 0 obj << /Limits [(dec_tweaking) (dec_tweaking)] /Names [(dec_tweaking) 2123 0 R] >> endobj 4918 0 obj << /Limits [(dec_upgrade_database) (dec_upgrade_database)] /Names [(dec_upgrade_database) 3821 0 R] >> endobj 4919 0 obj << /Limits [(dec_upgrade_via_script) (dec_upgrade_via_script)] /Names [(dec_upgrade_via_script) 3824 0 R] >> endobj 4920 0 obj << /Limits [(deployment-chapt) (deployment-chapt)] /Names [(deployment-chapt) 1970 0 R] >> endobj 4921 0 obj << /Limits [(dfa_disallowed_keywords) (dfa_disallowed_keywords)] /Names [(dfa_disallowed_keywords) 3850 0 R] >> endobj 4922 0 obj << /Limits [(dfa_function_keywords) (dfa_function_keywords)] /Names [(dfa_function_keywords) 3853 0 R] >> endobj 4923 0 obj << /Limits [(dpc_connection_props) (dpc_connection_props)] /Names [(dpc_connection_props) 1994 0 R] >> endobj 4924 0 obj << /Limits [(dpc_connection_url) (dpc_connection_url)] /Names [(dpc_connection_url) 1987 0 R] >> endobj 4925 0 obj << /Limits [(dpc_crypt_props) (dpc_crypt_props)] /Names [(dpc_crypt_props) 2009 0 R] >> endobj 4926 0 obj << /Limits [(dpc_db_file_mem) (dpc_db_file_mem)] /Names [(dpc_db_file_mem) 2006 0 R] >> endobj 4927 0 obj << /Limits [(dpc_db_operations) (dpc_db_operations)] /Names [(dpc_db_operations) 2003 0 R] >> endobj 4928 0 obj << /Limits [(dpc_db_props_url) (dpc_db_props_url)] /Names [(dpc_db_props_url) 1997 0 R] >> endobj 4929 0 obj << /Limits [(dpc_sql_conformance) (dpc_sql_conformance)] /Names [(dpc_sql_conformance) 2000 0 R] >> endobj 4930 0 obj << /Limits [(dpc_system_props) (dpc_system_props)] /Names [(dpc_system_props) 2012 0 R] >> endobj 4931 0 obj << /Limits [(dpc_variables_url) (dpc_variables_url)] /Names [(dpc_variables_url) 1991 0 R] >> endobj 4932 0 obj << /Limits [(filelinks-app) (filelinks-app)] /Names [(filelinks-app) 3906 0 R] >> endobj 4933 0 obj << /Limits [(gradle-invoke--sect) (gradle-invoke--sect)] /Names [(gradle-invoke--sect) 3861 0 R] >> endobj 4934 0 obj << /Limits [(guide) (guide)] /Names [(guide) 4379 0 R] >> endobj 4935 0 obj << /Limits [(listeners-chapt) (listeners-chapt)] /Names [(listeners-chapt) 1805 0 R] >> endobj 4936 0 obj << /Limits [(lists-app) (lists-app)] /Names [(lists-app) 2523 0 R] >> endobj 4937 0 obj << /Limits [(lsc_acl) (lsc_acl)] /Names [(lsc_acl) 2057 0 R] >> endobj 4938 0 obj << /Limits [(lsc_app_start) (lsc_app_start)] /Names [(lsc_app_start) 2032 0 R] >> endobj 4939 0 obj << /Limits [(lsc_auto_server_unix) (lsc_auto_server_unix)] /Names [(lsc_auto_server_unix) 2054 0 R] >> endobj 4940 0 obj << /Limits [(lsc_db_props_startup) (lsc_db_props_startup)] /Names [(lsc_db_props_startup) 2038 0 R] >> endobj 4941 0 obj << /Limits [(lsc_hsql_server) (lsc_hsql_server)] /Names [(lsc_hsql_server) 2020 0 R] >> endobj 4942 0 obj << /Limits [(lsc_http_server) (lsc_http_server)] /Names [(lsc_http_server) 2023 0 R] >> endobj 4943 0 obj << /Limits [(lsc_jsse) (lsc_jsse)] /Names [(lsc_jsse) 1887 0 R] >> endobj 4944 0 obj << /Limits [(lsc_listener_types) (lsc_listener_types)] /Names [(lsc_listener_types) 2017 0 R] >> endobj 4945 0 obj << /Limits [(lsc_privatekey) (lsc_privatekey)] /Names [(lsc_privatekey) 1889 0 R] >> endobj 4946 0 obj << /Limits [(lsc_remote_open) (lsc_remote_open)] /Names [(lsc_remote_open) 2035 0 R] >> endobj 4947 0 obj << /Limits [(lsc_server_props) (lsc_server_props)] /Names [(lsc_server_props) 2029 0 R] >> endobj 4948 0 obj << /Limits [(lsc_servlet) (lsc_servlet)] /Names [(lsc_servlet) 2026 0 R] >> endobj 4949 0 obj << /Limits [(lsc_ssl_certificate) (lsc_ssl_certificate)] /Names [(lsc_ssl_certificate) 4383 0 R] >> endobj 4950 0 obj << /Limits [(lsc_ssl_client) (lsc_ssl_client)] /Names [(lsc_ssl_client) 4381 0 R] >> endobj 4951 0 obj << /Limits [(lsc_ssl_connection) (lsc_ssl_connection)] /Names [(lsc_ssl_connection) 2047 0 R] >> endobj 4952 0 obj << /Limits [(lsc_ssl_server) (lsc_ssl_server)] /Names [(lsc_ssl_server) 4382 0 R] >> endobj 4953 0 obj << /Limits [(lsc_tls) (lsc_tls)] /Names [(lsc_tls) 2041 0 R] >> endobj 4954 0 obj << /Limits [(lsc_tls_rquirements) (lsc_tls_rquirements)] /Names [(lsc_tls_rquirements) 2044 0 R] >> endobj 4955 0 obj << /Limits [(lta_standard_keywords) (lta_standard_keywords)] /Names [(lta_standard_keywords) 3847 0 R] >> endobj 4956 0 obj << /Limits [(management-chapt) (management-chapt)] /Names [(management-chapt) 1316 0 R] >> endobj 4957 0 obj << /Limits [(mtc_acid) (mtc_acid)] /Names [(mtc_acid) 1474 0 R] >> endobj 4958 0 obj << /Limits [(mtc_acid_persistence) (mtc_acid_persistence)] /Names [(mtc_acid_persistence) 1471 0 R] >> endobj 4959 0 obj << /Limits [(mtc_authentication_control) (mtc_authentication_control)] /Names [(mtc_authentication_control) 1528 0 R] >> endobj 4960 0 obj << /Limits [(mtc_authntication_settings) (mtc_authntication_settings)] /Names [(mtc_authntication_settings) 1570 0 R] >> endobj 4961 0 obj << /Limits [(mtc_backup) (mtc_backup)] /Names [(mtc_backup) 1477 0 R] >> endobj 4962 0 obj << /Limits [(mtc_cache_persistence) (mtc_cache_persistence)] /Names [(mtc_cache_persistence) 1567 0 R] >> endobj 4963 0 obj << /Limits [(mtc_compatibility_db2) (mtc_compatibility_db2)] /Names [(mtc_compatibility_db2) 1549 0 R] >> endobj 4964 0 obj << /Limits [(mtc_compatibility_derby) (mtc_compatibility_derby)] /Names [(mtc_compatibility_derby) 1543 0 R] >> endobj 4965 0 obj << /Limits [(mtc_compatibility_firebird) (mtc_compatibility_firebird)] /Names [(mtc_compatibility_firebird) 1540 0 R] >> endobj 4966 0 obj << /Limits [(mtc_compatibility_mssql) (mtc_compatibility_mssql)] /Names [(mtc_compatibility_mssql) 1552 0 R] >> endobj 4967 0 obj << /Limits [(mtc_compatibility_mysql) (mtc_compatibility_mysql)] /Names [(mtc_compatibility_mysql) 1537 0 R] >> endobj 4968 0 obj << /Limits [(mtc_compatibility_oracle) (mtc_compatibility_oracle)] /Names [(mtc_compatibility_oracle) 1546 0 R] >> endobj 4969 0 obj << /Limits [(mtc_compatibility_other) (mtc_compatibility_other)] /Names [(mtc_compatibility_other) 1531 0 R] >> endobj 4970 0 obj << /Limits [(mtc_compatibility_postgres) (mtc_compatibility_postgres)] /Names [(mtc_compatibility_postgres) 1534 0 R] >> endobj 4971 0 obj << /Limits [(mtc_database_security) (mtc_database_security)] /Names [(mtc_database_security) 1522 0 R] >> endobj 4972 0 obj << /Limits [(mtc_database_settings) (mtc_database_settings)] /Names [(mtc_database_settings) 1561 0 R] >> endobj 4973 0 obj << /Limits [(mtc_deploy_context) (mtc_deploy_context)] /Names [(mtc_deploy_context) 1465 0 R] >> endobj 4974 0 obj << /Limits [(mtc_encrypted_create) (mtc_encrypted_create)] /Names [(mtc_encrypted_create) 1495 0 R] >> endobj 4975 0 obj << /Limits [(mtc_encrypted_database) (mtc_encrypted_database)] /Names [(mtc_encrypted_database) 1492 0 R] >> endobj 4976 0 obj << /Limits [(mtc_encrypted_security) (mtc_encrypted_security)] /Names [(mtc_encrypted_security) 1501 0 R] >> endobj 4977 0 obj << /Limits [(mtc_encrypted_speed) (mtc_encrypted_speed)] /Names [(mtc_encrypted_speed) 1498 0 R] >> endobj 4978 0 obj << /Limits [(mtc_external_monitoring) (mtc_external_monitoring)] /Names [(mtc_external_monitoring) 1507 0 R] >> endobj 4979 0 obj << /Limits [(mtc_internal_event_monitoring) (mtc_internal_event_monitoring)] /Names [(mtc_internal_event_monitoring) 1513 0 R] >> endobj 4980 0 obj << /Limits [(mtc_internal_monitoring) (mtc_internal_monitoring)] /Names [(mtc_internal_monitoring) 1510 0 R] >> endobj 4981 0 obj << /Limits [(mtc_large_objects) (mtc_large_objects)] /Names [(mtc_large_objects) 1462 0 R] >> endobj 4982 0 obj << /Limits [(mtc_listing_backup) (mtc_listing_backup)] /Names [(mtc_listing_backup) 1486 0 R] >> endobj 4983 0 obj << /Limits [(mtc_modes_operation) (mtc_modes_operation)] /Names [(mtc_modes_operation) 1456 0 R] >> endobj 4984 0 obj << /Limits [(mtc_modes_tables) (mtc_modes_tables)] /Names [(mtc_modes_tables) 1453 0 R] >> endobj 4985 0 obj << /Limits [(mtc_monitoring_operation) (mtc_monitoring_operation)] /Names [(mtc_monitoring_operation) 1504 0 R] >> endobj 4986 0 obj << /Limits [(mtc_offline_backup) (mtc_offline_backup)] /Names [(mtc_offline_backup) 1483 0 R] >> endobj 4987 0 obj << /Limits [(mtc_online_backup) (mtc_online_backup)] /Names [(mtc_online_backup) 1480 0 R] >> endobj 4988 0 obj << /Limits [(mtc_readonly_database) (mtc_readonly_database)] /Names [(mtc_readonly_database) 1468 0 R] >> endobj 4989 0 obj << /Limits [(mtc_restoring_backup) (mtc_restoring_backup)] /Names [(mtc_restoring_backup) 1489 0 R] >> endobj 4990 0 obj << /Limits [(mtc_security_defaults) (mtc_security_defaults)] /Names [(mtc_security_defaults) 1525 0 R] >> endobj 4991 0 obj << /Limits [(mtc_server_monitoring) (mtc_server_monitoring)] /Names [(mtc_server_monitoring) 1519 0 R] >> endobj 4992 0 obj << /Limits [(mtc_sql_settings) (mtc_sql_settings)] /Names [(mtc_sql_settings) 1564 0 R] >> endobj 4993 0 obj << /Limits [(mtc_ssl_certificate_non_ca) (mtc_ssl_certificate_non_ca)] /Names [(mtc_ssl_certificate_non_ca) 4384 0 R] >> endobj 4994 0 obj << /Limits [(mtc_statements) (mtc_statements)] /Names [(mtc_statements) 1555 0 R] >> endobj 4995 0 obj << /Limits [(mtc_system_operations) (mtc_system_operations)] /Names [(mtc_system_operations) 1558 0 R] >> endobj 4996 0 obj << /Limits [(mtc_table_types) (mtc_table_types)] /Names [(mtc_table_types) 1459 0 R] >> endobj 4997 0 obj << /Limits [(ooa_database_tool) (ooa_database_tool)] /Names [(ooa_database_tool) 3900 0 R] >> endobj 4998 0 obj << /Limits [(ooa_db_files_convert) (ooa_db_files_convert)] /Names [(ooa_db_files_convert) 3903 0 R] >> endobj 4999 0 obj << /Limits [(ooa_overview) (ooa_overview)] /Names [(ooa_overview) 3897 0 R] >> endobj 5000 0 obj << /Limits [(openoffice-app) (openoffice-app)] /Names [(openoffice-app) 3894 0 R] >> endobj 5001 0 obj << /Limits [(rgc-data-access) (rgc-data-access)] /Names [(rgc-data-access) 153 0 R] >> endobj 5002 0 obj << /Limits [(rgc_access_tools) (rgc_access_tools)] /Names [(rgc_access_tools) 123 0 R] >> endobj 5003 0 obj << /Limits [(rgc_closing_db) (rgc_closing_db)] /Names [(rgc_closing_db) 156 0 R] >> endobj 5004 0 obj << /Limits [(rgc_connecting_db) (rgc_connecting_db)] /Names [(rgc_connecting_db) 144 0 R] >> endobj 5005 0 obj << /Limits [(rgc_hsql_server) (rgc_hsql_server)] /Names [(rgc_hsql_server) 135 0 R] >> endobj 5006 0 obj << /Limits [(rgc_hsqldb_db) (rgc_hsqldb_db)] /Names [(rgc_hsqldb_db) 126 0 R] >> endobj 5007 0 obj << /Limits [(rgc_hsqldb_jar) (rgc_hsqldb_jar)] /Names [(rgc_hsqldb_jar) 120 0 R] >> endobj 5008 0 obj << /Limits [(rgc_http_server) (rgc_http_server)] /Names [(rgc_http_server) 138 0 R] >> endobj 5009 0 obj << /Limits [(rgc_http_servlet) (rgc_http_servlet)] /Names [(rgc_http_servlet) 141 0 R] >> endobj 5010 0 obj << /Limits [(rgc_inprocess) (rgc_inprocess)] /Names [(rgc_inprocess) 129 0 R] >> endobj 5011 0 obj << /Limits [(rgc_multiple_db) (rgc_multiple_db)] /Names [(rgc_multiple_db) 150 0 R] >> endobj 5012 0 obj << /Limits [(rgc_new_db) (rgc_new_db)] /Names [(rgc_new_db) 159 0 R] >> endobj 5013 0 obj << /Limits [(rgc_security) (rgc_security)] /Names [(rgc_security) 147 0 R] >> endobj 5014 0 obj << /Limits [(rgc_server_modes) (rgc_server_modes)] /Names [(rgc_server_modes) 132 0 R] >> endobj 5015 0 obj << /Limits [(running-chapt) (running-chapt)] /Names [(running-chapt) 117 0 R] >> endobj 5016 0 obj << /Limits [(sessions-chapt) (sessions-chapt)] /Names [(sessions-chapt) 240 0 R] >> endobj 5017 0 obj << /Limits [(sgc_array) (sgc_array)] /Names [(sgc_array) 213 0 R] >> endobj 5018 0 obj << /Limits [(sgc_array_def) (sgc_array_def)] /Names [(sgc_array_def) 216 0 R] >> endobj 5019 0 obj << /Limits [(sgc_array_ops) (sgc_array_ops)] /Names [(sgc_array_ops) 222 0 R] >> endobj 5020 0 obj << /Limits [(sgc_array_ref) (sgc_array_ref)] /Names [(sgc_array_ref) 219 0 R] >> endobj 5021 0 obj << /Limits [(sgc_binary_types) (sgc_binary_types)] /Names [(sgc_binary_types) 195 0 R] >> endobj 5022 0 obj << /Limits [(sgc_bit_types) (sgc_bit_types)] /Names [(sgc_bit_types) 198 0 R] >> endobj 5023 0 obj << /Limits [(sgc_boolean_type) (sgc_boolean_type)] /Names [(sgc_boolean_type) 189 0 R] >> endobj 5024 0 obj << /Limits [(sgc_char_types) (sgc_char_types)] /Names [(sgc_char_types) 192 0 R] >> endobj 5025 0 obj << /Limits [(sgc_data_tables) (sgc_data_tables)] /Names [(sgc_data_tables) 168 0 R] >> endobj 5026 0 obj << /Limits [(sgc_data_type_guide) (sgc_data_type_guide)] /Names [(sgc_data_type_guide) 180 0 R] >> endobj 5027 0 obj << /Limits [(sgc_datetime_types) (sgc_datetime_types)] /Names [(sgc_datetime_types) 207 0 R] >> endobj 5028 0 obj << /Limits [(sgc_index_speed) (sgc_index_speed)] /Names [(sgc_index_speed) 225 0 R] >> endobj 5029 0 obj << /Limits [(sgc_indexes_cond) (sgc_indexes_cond)] /Names [(sgc_indexes_cond) 231 0 R] >> endobj 5030 0 obj << /Limits [(sgc_indexes_ops) (sgc_indexes_ops)] /Names [(sgc_indexes_ops) 234 0 R] >> endobj 5031 0 obj << /Limits [(sgc_indexes_order) (sgc_indexes_order)] /Names [(sgc_indexes_order) 237 0 R] >> endobj 5032 0 obj << /Limits [(sgc_interval_typs) (sgc_interval_typs)] /Names [(sgc_interval_typs) 210 0 R] >> endobj 5033 0 obj << /Limits [(sgc_java_objects) (sgc_java_objects)] /Names [(sgc_java_objects) 201 0 R] >> endobj 5034 0 obj << /Limits [(sgc_length_precision) (sgc_length_precision)] /Names [(sgc_length_precision) 204 0 R] >> endobj 5035 0 obj << /Limits [(sgc_lob_data) (sgc_lob_data)] /Names [(sgc_lob_data) 177 0 R] >> endobj 5036 0 obj << /Limits [(sgc_numeric_types) (sgc_numeric_types)] /Names [(sgc_numeric_types) 186 0 R] >> endobj 5037 0 obj << /Limits [(sgc_persist_tables) (sgc_persist_tables)] /Names [(sgc_persist_tables) 174 0 R] >> endobj 5038 0 obj << /Limits [(sgc_query_opt) (sgc_query_opt)] /Names [(sgc_query_opt) 228 0 R] >> endobj 5039 0 obj << /Limits [(sgc_standards) (sgc_standards)] /Names [(sgc_standards) 165 0 R] >> endobj 5040 0 obj << /Limits [(sgc_temp_tables) (sgc_temp_tables)] /Names [(sgc_temp_tables) 171 0 R] >> endobj 5041 0 obj << /Limits [(sgc_types_ops) (sgc_types_ops)] /Names [(sgc_types_ops) 183 0 R] >> endobj 5042 0 obj << /Limits [(snc_overview) (snc_overview)] /Names [(snc_overview) 243 0 R] >> endobj 5043 0 obj << /Limits [(snc_session_attr) (snc_session_attr)] /Names [(snc_session_attr) 249 0 R] >> endobj 5044 0 obj << /Limits [(snc_session_attr_vars) (snc_session_attr_vars)] /Names [(snc_session_attr_vars) 246 0 R] >> endobj 5045 0 obj << /Limits [(snc_session_tables) (snc_session_tables)] /Names [(snc_session_tables) 255 0 R] >> endobj 5046 0 obj << /Limits [(snc_session_vars) (snc_session_vars)] /Names [(snc_session_vars) 252 0 R] >> endobj 5047 0 obj << /Limits [(snc_statements) (snc_statements)] /Names [(snc_statements) 428 0 R] >> endobj 5048 0 obj << /Limits [(snc_tx_2pl) (snc_tx_2pl)] /Names [(snc_tx_2pl) 261 0 R] >> endobj 5049 0 obj << /Limits [(snc_tx_2pl_si) (snc_tx_2pl_si)] /Names [(snc_tx_2pl_si) 403 0 R] >> endobj 5050 0 obj << /Limits [(snc_tx_access_tables) (snc_tx_access_tables)] /Names [(snc_tx_access_tables) 422 0 R] >> endobj 5051 0 obj << /Limits [(snc_tx_choosing) (snc_tx_choosing)] /Names [(snc_tx_choosing) 416 0 R] >> endobj 5052 0 obj << /Limits [(snc_tx_locks_2pl) (snc_tx_locks_2pl)] /Names [(snc_tx_locks_2pl) 407 0 R] >> endobj 5053 0 obj << /Limits [(snc_tx_locks_routines) (snc_tx_locks_routines)] /Names [(snc_tx_locks_routines) 410 0 R] >> endobj 5054 0 obj << /Limits [(snc_tx_mvcc) (snc_tx_mvcc)] /Names [(snc_tx_mvcc) 413 0 R] >> endobj 5055 0 obj << /Limits [(snc_tx_schema_change) (snc_tx_schema_change)] /Names [(snc_tx_schema_change) 419 0 R] >> endobj 5056 0 obj << /Limits [(snc_tx_tx_cc) (snc_tx_tx_cc)] /Names [(snc_tx_tx_cc) 258 0 R] >> endobj 5057 0 obj << /Limits [(snc_viewing_sessions) (snc_viewing_sessions)] /Names [(snc_viewing_sessions) 425 0 R] >> endobj 5058 0 obj << /Limits [(sql-ind) (sql-ind)] /Names [(sql-ind) 3909 0 R] >> endobj 5059 0 obj << /Limits [(sqlgeneral-chapt) (sqlgeneral-chapt)] /Names [(sqlgeneral-chapt) 162 0 R] >> endobj 5060 0 obj << /Limits [(sqlroutines-chapt) (sqlroutines-chapt)] /Names [(sqlroutines-chapt) 908 0 R] >> endobj 5061 0 obj << /Limits [(src_advantages) (src_advantages)] /Names [(src_advantages) 1080 0 R] >> endobj 5062 0 obj << /Limits [(src_aggregate_function_definition) (src_aggregate_function_definition)] /Names [(src_aggregate_function_definition) 1158 0 R] >> endobj 5063 0 obj << /Limits [(src_aggregate_functions) (src_aggregate_functions)] /Names [(src_aggregate_functions) 1155 0 R] >> endobj 5064 0 obj << /Limits [(src_formal_parameters) (src_formal_parameters)] /Names [(src_formal_parameters) 1107 0 R] >> endobj 5065 0 obj << /Limits [(src_jrt_access_control) (src_jrt_access_control)] /Names [(src_jrt_access_control) 1152 0 R] >> endobj 5066 0 obj << /Limits [(src_jrt_aggregate_functions) (src_jrt_aggregate_functions)] /Names [(src_jrt_aggregate_functions) 1164 0 R] >> endobj 5067 0 obj << /Limits [(src_jrt_legacy) (src_jrt_legacy)] /Names [(src_jrt_legacy) 1149 0 R] >> endobj 5068 0 obj << /Limits [(src_jrt_polymorphis) (src_jrt_polymorphis)] /Names [(src_jrt_polymorphis) 1140 0 R] >> endobj 5069 0 obj << /Limits [(src_jrt_procedures) (src_jrt_procedures)] /Names [(src_jrt_procedures) 1143 0 R] >> endobj 5070 0 obj << /Limits [(src_jrt_routines) (src_jrt_routines)] /Names [(src_jrt_routines) 1137 0 R] >> endobj 5071 0 obj << /Limits [(src_jrt_static_methods) (src_jrt_static_methods)] /Names [(src_jrt_static_methods) 1146 0 R] >> endobj 5072 0 obj << /Limits [(src_psm_aggregate_functions) (src_psm_aggregate_functions)] /Names [(src_psm_aggregate_functions) 1161 0 R] >> endobj 5073 0 obj << /Limits [(src_psm_assignment) (src_psm_assignment)] /Names [(src_psm_assignment) 1101 0 R] >> endobj 5074 0 obj << /Limits [(src_psm_compound) (src_psm_compound)] /Names [(src_psm_compound) 1086 0 R] >> endobj 5075 0 obj << /Limits [(src_psm_conditional) (src_psm_conditional)] /Names [(src_psm_conditional) 1116 0 R] >> endobj 5076 0 obj << /Limits [(src_psm_control_statements) (src_psm_control_statements)] /Names [(src_psm_control_statements) 1122 0 R] >> endobj 5077 0 obj << /Limits [(src_psm_cursors) (src_psm_cursors)] /Names [(src_psm_cursors) 1095 0 R] >> endobj 5078 0 obj << /Limits [(src_psm_exceptions) (src_psm_exceptions)] /Names [(src_psm_exceptions) 1125 0 R] >> endobj 5079 0 obj << /Limits [(src_psm_for_statement) (src_psm_for_statement)] /Names [(src_psm_for_statement) 1113 0 R] >> endobj 5080 0 obj << /Limits [(src_psm_handlers) (src_psm_handlers)] /Names [(src_psm_handlers) 1098 0 R] >> endobj 5081 0 obj << /Limits [(src_psm_iterated_statements) (src_psm_iterated_statements)] /Names [(src_psm_iterated_statements) 1110 0 R] >> endobj 5082 0 obj << /Limits [(src_psm_recursive_routines) (src_psm_recursive_routines)] /Names [(src_psm_recursive_routines) 1134 0 R] >> endobj 5083 0 obj << /Limits [(src_psm_return_statement) (src_psm_return_statement)] /Names [(src_psm_return_statement) 1119 0 R] >> endobj 5084 0 obj << /Limits [(src_psm_routines) (src_psm_routines)] /Names [(src_psm_routines) 1077 0 R] >> endobj 5085 0 obj << /Limits [(src_psm_select_single) (src_psm_select_single)] /Names [(src_psm_select_single) 1104 0 R] >> endobj 5086 0 obj << /Limits [(src_psm_statements) (src_psm_statements)] /Names [(src_psm_statements) 1083 0 R] >> endobj 5087 0 obj << /Limits [(src_psm_table_vars) (src_psm_table_vars)] /Names [(src_psm_table_vars) 1089 0 R] >> endobj 5088 0 obj << /Limits [(src_psm_vars) (src_psm_vars)] /Names [(src_psm_vars) 1092 0 R] >> endobj 5089 0 obj << /Limits [(src_returning_data) (src_returning_data)] /Names [(src_returning_data) 1131 0 R] >> endobj 5090 0 obj << /Limits [(src_routine_characteristics) (src_routine_characteristics)] /Names [(src_routine_characteristics) 1074 0 R] >> endobj 5091 0 obj << /Limits [(src_routine_definition) (src_routine_definition)] /Names [(src_routine_definition) 1071 0 R] >> endobj 5092 0 obj << /Limits [(src_routine_polymorphism) (src_routine_polymorphism)] /Names [(src_routine_polymorphism) 1128 0 R] >> endobj 5093 0 obj << /Limits [(texttables-chapt) (texttables-chapt)] /Names [(texttables-chapt) 393 0 R] >> endobj 5094 0 obj << /Limits [(trc_after_triggers) (trc_after_triggers)] /Names [(trc_after_triggers) 1175 0 R] >> endobj 5095 0 obj << /Limits [(trc_before_triggers) (trc_before_triggers)] /Names [(trc_before_triggers) 1172 0 R] >> endobj 5096 0 obj << /Limits [(trc_instead_of_triggers) (trc_instead_of_triggers)] /Names [(trc_instead_of_triggers) 1178 0 R] >> endobj 5097 0 obj << /Limits [(trc_overview) (trc_overview)] /Names [(trc_overview) 1169 0 R] >> endobj 5098 0 obj << /Limits [(trc_row_references) (trc_row_references)] /Names [(trc_row_references) 1193 0 R] >> endobj 5099 0 obj << /Limits [(trc_transactions) (trc_transactions)] /Names [(trc_transactions) 736 0 R] >> endobj 5100 0 obj << /Limits [(trc_trigger_action_java) (trc_trigger_action_java)] /Names [(trc_trigger_action_java) 1202 0 R] >> endobj 5101 0 obj << /Limits [(trc_trigger_action_sql) (trc_trigger_action_sql)] /Names [(trc_trigger_action_sql) 1199 0 R] >> endobj 5102 0 obj << /Limits [(trc_trigger_action_time) (trc_trigger_action_time)] /Names [(trc_trigger_action_time) 1190 0 R] >> endobj 5103 0 obj << /Limits [(trc_trigger_condition) (trc_trigger_condition)] /Names [(trc_trigger_condition) 1196 0 R] >> endobj 5104 0 obj << /Limits [(trc_trigger_creation) (trc_trigger_creation)] /Names [(trc_trigger_creation) 1205 0 R] >> endobj 5105 0 obj << /Limits [(trc_trigger_event) (trc_trigger_event)] /Names [(trc_trigger_event) 1184 0 R] >> endobj 5106 0 obj << /Limits [(trc_trigger_granularity) (trc_trigger_granularity)] /Names [(trc_trigger_granularity) 1187 0 R] >> endobj 5107 0 obj << /Limits [(trc_trigger_props) (trc_trigger_props)] /Names [(trc_trigger_props) 1181 0 R] >> endobj 5108 0 obj << /Limits [(triggers-chapt) (triggers-chapt)] /Names [(triggers-chapt) 1017 0 R] >> endobj 5109 0 obj << /Limits [(ttc_configuration) (ttc_configuration)] /Names [(ttc_configuration) 723 0 R] >> endobj 5110 0 obj << /Limits [(ttc_disconnect) (ttc_disconnect)] /Names [(ttc_disconnect) 727 0 R] >> endobj 5111 0 obj << /Limits [(ttc_global_props) (ttc_global_props)] /Names [(ttc_global_props) 733 0 R] >> endobj 5112 0 obj << /Limits [(ttc_implementation) (ttc_implementation)] /Names [(ttc_implementation) 553 0 R] >> endobj 5113 0 obj << /Limits [(ttc_issues) (ttc_issues)] /Names [(ttc_issues) 730 0 R] >> endobj 5114 0 obj << /Limits [(ttc_nulls) (ttc_nulls)] /Names [(ttc_nulls) 562 0 R] >> endobj 5115 0 obj << /Limits [(ttc_overview) (ttc_overview)] /Names [(ttc_overview) 550 0 R] >> endobj 5116 0 obj << /Limits [(ttc_scope) (ttc_scope)] /Names [(ttc_scope) 559 0 R] >> endobj 5117 0 obj << /Limits [(ttc_table_definition) (ttc_table_definition)] /Names [(ttc_table_definition) 556 0 R] >> endobj 5118 0 obj << /Limits [(unix-chapt) (unix-chapt)] /Names [(unix-chapt) 1915 0 R] >> endobj 5119 0 obj << /Limits [(uxc_access) (uxc_access)] /Names [(uxc_access) 2071 0 R] >> endobj 5120 0 obj << /Limits [(uxc_addl_accts) (uxc_addl_accts)] /Names [(uxc_addl_accts) 2074 0 R] >> endobj 5121 0 obj << /Limits [(uxc_cat_setup) (uxc_cat_setup)] /Names [(uxc_cat_setup) 2068 0 R] >> endobj 5122 0 obj << /Limits [(uxc_daemon) (uxc_daemon)] /Names [(uxc_daemon) 2080 0 R] >> endobj 5123 0 obj << /Limits [(uxc_init_script_portability) (uxc_init_script_portability)] /Names [(uxc_init_script_portability) 2083 0 R] >> endobj 5124 0 obj << /Limits [(uxc_init_script_setup) (uxc_init_script_setup)] /Names [(uxc_init_script_setup) 2086 0 R] >> endobj 5125 0 obj << /Limits [(uxc_inittrouble) (uxc_inittrouble)] /Names [(uxc_inittrouble) 1956 0 R] >> endobj 5126 0 obj << /Limits [(uxc_install) (uxc_install)] /Names [(uxc_install) 2065 0 R] >> endobj 5127 0 obj << /Limits [(uxc_purpose) (uxc_purpose)] /Names [(uxc_purpose) 2062 0 R] >> endobj 5128 0 obj << /Limits [(uxc_shutdown) (uxc_shutdown)] /Names [(uxc_shutdown) 2077 0 R] >> endobj 5129 0 obj << /Limits [(uxc_upgrade) (uxc_upgrade)] /Names [(uxc_upgrade) 2091 0 R] >> endobj 5130 0 obj << /Limits [(N12538) (uxc_upgrade)] /Kids [4765 0 R 4766 0 R 4767 0 R 4768 0 R 4769 0 R 4770 0 R 4771 0 R 4772 0 R 4773 0 R 4774 0 R 4775 0 R 4776 0 R 4777 0 R 4778 0 R 4779 0 R 4780 0 R 4781 0 R 4782 0 R 4783 0 R 4784 0 R 4785 0 R 4786 0 R 4787 0 R 4788 0 R 4789 0 R 4790 0 R 4791 0 R 4792 0 R 4793 0 R 4794 0 R 4795 0 R 4796 0 R 4797 0 R 4798 0 R 4799 0 R 4800 0 R 4801 0 R 4802 0 R 4803 0 R 4804 0 R 4805 0 R 4806 0 R 4807 0 R 4808 0 R 4809 0 R 4810 0 R 4811 0 R 4812 0 R 4813 0 R 4814 0 R 4815 0 R 4816 0 R 4817 0 R 4818 0 R 4819 0 R 4820 0 R 4821 0 R 4822 0 R 4823 0 R 4824 0 R 4825 0 R 4826 0 R 4827 0 R 4828 0 R 4829 0 R 4830 0 R 4831 0 R 4832 0 R 4833 0 R 4834 0 R 4835 0 R 4836 0 R 4837 0 R 4838 0 R 4839 0 R 4840 0 R 4841 0 R 4842 0 R 4843 0 R 4844 0 R 4845 0 R 4846 0 R 4847 0 R 4848 0 R 4849 0 R 4850 0 R 4851 0 R 4852 0 R 4853 0 R 4854 0 R 4855 0 R 4856 0 R 4857 0 R 4858 0 R 4859 0 R 4860 0 R 4861 0 R 4862 0 R 4863 0 R 4864 0 R 4865 0 R 4866 0 R 4867 0 R 4868 0 R 4869 0 R 4870 0 R 4871 0 R 4872 0 R 4873 0 R 4874 0 R 4875 0 R 4876 0 R 4877 0 R 4878 0 R 4879 0 R 4880 0 R 4881 0 R 4882 0 R 4883 0 R 4884 0 R 4885 0 R 4886 0 R 4887 0 R 4888 0 R 4889 0 R 4890 0 R 4891 0 R 4892 0 R 4893 0 R 4894 0 R 4895 0 R 4896 0 R 4897 0 R 4898 0 R 4899 0 R 4900 0 R 4901 0 R 4902 0 R 4903 0 R 4904 0 R 4905 0 R 4906 0 R 4907 0 R 4908 0 R 4909 0 R 4910 0 R 4911 0 R 4912 0 R 4913 0 R 4914 0 R 4915 0 R 4916 0 R 4917 0 R 4918 0 R 4919 0 R 4920 0 R 4921 0 R 4922 0 R 4923 0 R 4924 0 R 4925 0 R 4926 0 R 4927 0 R 4928 0 R 4929 0 R 4930 0 R 4931 0 R 4932 0 R 4933 0 R 4934 0 R 4935 0 R 4936 0 R 4937 0 R 4938 0 R 4939 0 R 4940 0 R 4941 0 R 4942 0 R 4943 0 R 4944 0 R 4945 0 R 4946 0 R 4947 0 R 4948 0 R 4949 0 R 4950 0 R 4951 0 R 4952 0 R 4953 0 R 4954 0 R 4955 0 R 4956 0 R 4957 0 R 4958 0 R 4959 0 R 4960 0 R 4961 0 R 4962 0 R 4963 0 R 4964 0 R 4965 0 R 4966 0 R 4967 0 R 4968 0 R 4969 0 R 4970 0 R 4971 0 R 4972 0 R 4973 0 R 4974 0 R 4975 0 R 4976 0 R 4977 0 R 4978 0 R 4979 0 R 4980 0 R 4981 0 R 4982 0 R 4983 0 R 4984 0 R 4985 0 R 4986 0 R 4987 0 R 4988 0 R 4989 0 R 4990 0 R 4991 0 R 4992 0 R 4993 0 R 4994 0 R 4995 0 R 4996 0 R 4997 0 R 4998 0 R 4999 0 R 5000 0 R 5001 0 R 5002 0 R 5003 0 R 5004 0 R 5005 0 R 5006 0 R 5007 0 R 5008 0 R 5009 0 R 5010 0 R 5011 0 R 5012 0 R 5013 0 R 5014 0 R 5015 0 R 5016 0 R 5017 0 R 5018 0 R 5019 0 R 5020 0 R 5021 0 R 5022 0 R 5023 0 R 5024 0 R 5025 0 R 5026 0 R 5027 0 R 5028 0 R 5029 0 R 5030 0 R 5031 0 R 5032 0 R 5033 0 R 5034 0 R 5035 0 R 5036 0 R 5037 0 R 5038 0 R 5039 0 R 5040 0 R 5041 0 R 5042 0 R 5043 0 R 5044 0 R 5045 0 R 5046 0 R 5047 0 R 5048 0 R 5049 0 R 5050 0 R 5051 0 R 5052 0 R 5053 0 R 5054 0 R 5055 0 R 5056 0 R 5057 0 R 5058 0 R 5059 0 R 5060 0 R 5061 0 R 5062 0 R 5063 0 R 5064 0 R 5065 0 R 5066 0 R 5067 0 R 5068 0 R 5069 0 R 5070 0 R 5071 0 R 5072 0 R 5073 0 R 5074 0 R 5075 0 R 5076 0 R 5077 0 R 5078 0 R 5079 0 R 5080 0 R 5081 0 R 5082 0 R 5083 0 R 5084 0 R 5085 0 R 5086 0 R 5087 0 R 5088 0 R 5089 0 R 5090 0 R 5091 0 R 5092 0 R 5093 0 R 5094 0 R 5095 0 R 5096 0 R 5097 0 R 5098 0 R 5099 0 R 5100 0 R 5101 0 R 5102 0 R 5103 0 R 5104 0 R 5105 0 R 5106 0 R 5107 0 R 5108 0 R 5109 0 R 5110 0 R 5111 0 R 5112 0 R 5113 0 R 5114 0 R 5115 0 R 5116 0 R 5117 0 R 5118 0 R 5119 0 R 5120 0 R 5121 0 R 5122 0 R 5123 0 R 5124 0 R 5125 0 R 5126 0 R 5127 0 R 5128 0 R 5129 0 R] >> endobj 5131 0 obj << /Dests 5130 0 R >> endobj 1 0 obj << /Type /Pages /Count 320 /Kids [8 0 R 14 0 R 109 0 R 402 0 R 722 0 R 1049 0 R 1413 0 R 1986 0 R 3813 0 R 1628 0 R 1817 0 R 2284 0 R 21 0 R 38 0 R 41 0 R 2482 0 R 2488 0 R 2496 0 R 2507 0 R 1578 0 R 2522 0 R 392 0 R 49 0 R 52 0 R 55 0 R 58 0 R 61 0 R 64 0 R 67 0 R 70 0 R 73 0 R 76 0 R 79 0 R 82 0 R 85 0 R 88 0 R 91 0 R 1213 0 R 1967 0 R 94 0 R 97 0 R 100 0 R 103 0 R 1218 0 R 106 0 R 266 0 R 269 0 R 272 0 R 275 0 R 278 0 R 281 0 R 284 0 R 287 0 R 290 0 R 293 0 R 576 0 R 1315 0 R 296 0 R 299 0 R 611 0 R 1016 0 R 907 0 R 302 0 R 305 0 R 308 0 R 311 0 R 314 0 R 317 0 R 320 0 R 323 0 R 326 0 R 329 0 R 332 0 R 335 0 R 338 0 R 341 0 R 344 0 R 347 0 R 350 0 R 913 0 R 918 0 R 353 0 R 356 0 R 359 0 R 362 0 R 365 0 R 368 0 R 371 0 R 374 0 R 377 0 R 380 0 R 383 0 R 1584 0 R 386 0 R 389 0 R 399 0 R 567 0 R 570 0 R 573 0 R 1801 0 R 583 0 R 586 0 R 591 0 R 594 0 R 599 0 R 602 0 R 605 0 R 608 0 R 617 0 R 620 0 R 623 0 R 626 0 R 629 0 R 632 0 R 635 0 R 638 0 R 643 0 R 646 0 R 649 0 R 652 0 R 655 0 R 1224 0 R 658 0 R 663 0 R 666 0 R 669 0 R 672 0 R 675 0 R 680 0 R 923 0 R 928 0 R 683 0 R 686 0 R 689 0 R 692 0 R 695 0 R 698 0 R 701 0 R 704 0 R 707 0 R 710 0 R 713 0 R 716 0 R 719 0 R 886 0 R 889 0 R 892 0 R 895 0 R 898 0 R 901 0 R 904 0 R 933 0 R 936 0 R 939 0 R 942 0 R 945 0 R 948 0 R 951 0 R 954 0 R 959 0 R 962 0 R 965 0 R 968 0 R 971 0 R 974 0 R 977 0 R 980 0 R 983 0 R 986 0 R 989 0 R 992 0 R 995 0 R 998 0 R 1001 0 R 1004 0 R 1007 0 R 1010 0 R 1013 0 R 1022 0 R 1025 0 R 1028 0 R 1031 0 R 1034 0 R 1040 0 R 1043 0 R 1232 0 R 1235 0 R 1238 0 R 1241 0 R 1244 0 R 1247 0 R 1250 0 R 1253 0 R 1256 0 R 1259 0 R 1262 0 R 1265 0 R 1268 0 R 1271 0 R 1274 0 R 1277 0 R 1280 0 R 1283 0 R 1288 0 R 1294 0 R 1297 0 R 1300 0 R 1303 0 R 1306 0 R 1309 0 R 1312 0 R 1321 0 R 1324 0 R 1327 0 R 1330 0 R 1333 0 R 1809 0 R 1336 0 R 1341 0 R 1344 0 R 1347 0 R 1350 0 R 1353 0 R 1356 0 R 1359 0 R 1362 0 R 1369 0 R 1374 0 R 1377 0 R 1380 0 R 1383 0 R 1386 0 R 1389 0 R 1392 0 R 1395 0 R 1398 0 R 1401 0 R 1404 0 R 1410 0 R 2534 0 R 1589 0 R 1592 0 R 1595 0 R 1601 0 R 1604 0 R 1607 0 R 1610 0 R 1613 0 R 1616 0 R 1619 0 R 1622 0 R 1625 0 R 1785 0 R 1790 0 R 1793 0 R 1796 0 R 2540 0 R 2546 0 R 2599 0 R 1884 0 R 1908 0 R 1872 0 R 2605 0 R 1893 0 R 1898 0 R 1924 0 R 2215 0 R 2618 0 R 2624 0 R 1929 0 R 1932 0 R 1941 0 R 2630 0 R 2637 0 R 1949 0 R 1952 0 R 1955 0 R 1961 0 R 1964 0 R 1974 0 R 1977 0 R 1980 0 R 2553 0 R 1983 0 R 2146 0 R 2149 0 R 2152 0 R 2155 0 R 2161 0 R 2173 0 R 2192 0 R 2195 0 R 2198 0 R 2201 0 R 2204 0 R 2224 0 R 2244 0 R 2249 0 R 2254 0 R 2257 0 R 2262 0 R 2275 0 R 2281 0 R 2423 0 R 2428 0 R 2431 0 R 2434 0 R 2559 0 R 2642 0 R 2837 0 R 3041 0 R 3213 0 R 3417 0 R 3633 0 R 3710 0 R 3917 0 R 4021 0 R 4115 0 R 4220 0 R 4330 0 R ] >> endobj 2 0 obj << /Type /Catalog /Pages 1 0 R /Metadata 7 0 R /Lang (en) /PageLabels 9 0 R /Outlines 4389 0 R /PageMode /UseOutlines /Names 5131 0 R >> endobj 3 0 obj << /Font << /F1 4758 0 R /F11 4757 0 R /F5 4759 0 R /F4 4760 0 R /F3 4761 0 R /F9 4762 0 R /F6 4763 0 R /F7 4764 0 R >> /ProcSet [ /PDF /ImageB /ImageC /Text ] /XObject << /Im10 2424 0 R /Im5 1894 0 R /Im8 2250 0 R /Im6 1925 0 R /Im4 1873 0 R /Im9 2258 0 R /Im1 15 0 R /Im3 44 0 R /Im2 16 0 R /Im7 2245 0 R >> /ColorSpace << /DefaultRGB 6 0 R /ICC42 43 0 R >> >> endobj 9 0 obj << /Nums [0 << /P (i) >> 1 << /P (ii) >> 2 << /P (iii) >> 3 << /P (iv) >> 4 << /P (v) >> 5 << /P (vi) >> 6 << /P (vii) >> 7 << /P (viii) >> 8 << /P (ix) >> 9 << /P (x) >> 10 << /P (xi) >> 11 << /P (xii) >> 12 << /P (xiii) >> 13 << /P (1) >> 14 << /P (2) >> 15 << /P (3) >> 16 << /P (4) >> 17 << /P (5) >> 18 << /P (6) >> 19 << /P (7) >> 20 << /P (8) >> 21 << /P (9) >> 22 << /P (10) >> 23 << /P (11) >> 24 << /P (12) >> 25 << /P (13) >> 26 << /P (14) >> 27 << /P (15) >> 28 << /P (16) >> 29 << /P (17) >> 30 << /P (18) >> 31 << /P (19) >> 32 << /P (20) >> 33 << /P (21) >> 34 << /P (22) >> 35 << /P (23) >> 36 << /P (24) >> 37 << /P (25) >> 38 << /P (26) >> 39 << /P (27) >> 40 << /P (28) >> 41 << /P (29) >> 42 << /P (30) >> 43 << /P (31) >> 44 << /P (32) >> 45 << /P (33) >> 46 << /P (34) >> 47 << /P (35) >> 48 << /P (36) >> 49 << /P (37) >> 50 << /P (38) >> 51 << /P (39) >> 52 << /P (40) >> 53 << /P (41) >> 54 << /P (42) >> 55 << /P (43) >> 56 << /P (44) >> 57 << /P (45) >> 58 << /P (46) >> 59 << /P (47) >> 60 << /P (48) >> 61 << /P (49) >> 62 << /P (50) >> 63 << /P (51) >> 64 << /P (52) >> 65 << /P (53) >> 66 << /P (54) >> 67 << /P (55) >> 68 << /P (56) >> 69 << /P (57) >> 70 << /P (58) >> 71 << /P (59) >> 72 << /P (60) >> 73 << /P (61) >> 74 << /P (62) >> 75 << /P (63) >> 76 << /P (64) >> 77 << /P (65) >> 78 << /P (66) >> 79 << /P (67) >> 80 << /P (68) >> 81 << /P (69) >> 82 << /P (70) >> 83 << /P (71) >> 84 << /P (72) >> 85 << /P (73) >> 86 << /P (74) >> 87 << /P (75) >> 88 << /P (76) >> 89 << /P (77) >> 90 << /P (78) >> 91 << /P (79) >> 92 << /P (80) >> 93 << /P (81) >> 94 << /P (82) >> 95 << /P (83) >> 96 << /P (84) >> 97 << /P (85) >> 98 << /P (86) >> 99 << /P (87) >> 100 << /P (88) >> 101 << /P (89) >> 102 << /P (90) >> 103 << /P (91) >> 104 << /P (92) >> 105 << /P (93) >> 106 << /P (94) >> 107 << /P (95) >> 108 << /P (96) >> 109 << /P (97) >> 110 << /P (98) >> 111 << /P (99) >> 112 << /P (100) >> 113 << /P (101) >> 114 << /P (102) >> 115 << /P (103) >> 116 << /P (104) >> 117 << /P (105) >> 118 << /P (106) >> 119 << /P (107) >> 120 << /P (108) >> 121 << /P (109) >> 122 << /P (110) >> 123 << /P (111) >> 124 << /P (112) >> 125 << /P (113) >> 126 << /P (114) >> 127 << /P (115) >> 128 << /P (116) >> 129 << /P (117) >> 130 << /P (118) >> 131 << /P (119) >> 132 << /P (120) >> 133 << /P (121) >> 134 << /P (122) >> 135 << /P (123) >> 136 << /P (124) >> 137 << /P (125) >> 138 << /P (126) >> 139 << /P (127) >> 140 << /P (128) >> 141 << /P (129) >> 142 << /P (130) >> 143 << /P (131) >> 144 << /P (132) >> 145 << /P (133) >> 146 << /P (134) >> 147 << /P (135) >> 148 << /P (136) >> 149 << /P (137) >> 150 << /P (138) >> 151 << /P (139) >> 152 << /P (140) >> 153 << /P (141) >> 154 << /P (142) >> 155 << /P (143) >> 156 << /P (144) >> 157 << /P (145) >> 158 << /P (146) >> 159 << /P (147) >> 160 << /P (148) >> 161 << /P (149) >> 162 << /P (150) >> 163 << /P (151) >> 164 << /P (152) >> 165 << /P (153) >> 166 << /P (154) >> 167 << /P (155) >> 168 << /P (156) >> 169 << /P (157) >> 170 << /P (158) >> 171 << /P (159) >> 172 << /P (160) >> 173 << /P (161) >> 174 << /P (162) >> 175 << /P (163) >> 176 << /P (164) >> 177 << /P (165) >> 178 << /P (166) >> 179 << /P (167) >> 180 << /P (168) >> 181 << /P (169) >> 182 << /P (170) >> 183 << /P (171) >> 184 << /P (172) >> 185 << /P (173) >> 186 << /P (174) >> 187 << /P (175) >> 188 << /P (176) >> 189 << /P (177) >> 190 << /P (178) >> 191 << /P (179) >> 192 << /P (180) >> 193 << /P (181) >> 194 << /P (182) >> 195 << /P (183) >> 196 << /P (184) >> 197 << /P (185) >> 198 << /P (186) >> 199 << /P (187) >> 200 << /P (188) >> 201 << /P (189) >> 202 << /P (190) >> 203 << /P (191) >> 204 << /P (192) >> 205 << /P (193) >> 206 << /P (194) >> 207 << /P (195) >> 208 << /P (196) >> 209 << /P (197) >> 210 << /P (198) >> 211 << /P (199) >> 212 << /P (200) >> 213 << /P (201) >> 214 << /P (202) >> 215 << /P (203) >> 216 << /P (204) >> 217 << /P (205) >> 218 << /P (206) >> 219 << /P (207) >> 220 << /P (208) >> 221 << /P (209) >> 222 << /P (210) >> 223 << /P (211) >> 224 << /P (212) >> 225 << /P (213) >> 226 << /P (214) >> 227 << /P (215) >> 228 << /P (216) >> 229 << /P (217) >> 230 << /P (218) >> 231 << /P (219) >> 232 << /P (220) >> 233 << /P (221) >> 234 << /P (222) >> 235 << /P (223) >> 236 << /P (224) >> 237 << /P (225) >> 238 << /P (226) >> 239 << /P (227) >> 240 << /P (228) >> 241 << /P (229) >> 242 << /P (230) >> 243 << /P (231) >> 244 << /P (232) >> 245 << /P (233) >> 246 << /P (234) >> 247 << /P (235) >> 248 << /P (236) >> 249 << /P (237) >> 250 << /P (238) >> 251 << /P (239) >> 252 << /P (240) >> 253 << /P (241) >> 254 << /P (242) >> 255 << /P (243) >> 256 << /P (244) >> 257 << /P (245) >> 258 << /P (246) >> 259 << /P (247) >> 260 << /P (248) >> 261 << /P (249) >> 262 << /P (250) >> 263 << /P (251) >> 264 << /P (252) >> 265 << /P (253) >> 266 << /P (254) >> 267 << /P (255) >> 268 << /P (256) >> 269 << /P (257) >> 270 << /P (258) >> 271 << /P (259) >> 272 << /P (260) >> 273 << /P (261) >> 274 << /P (262) >> 275 << /P (263) >> 276 << /P (264) >> 277 << /P (265) >> 278 << /P (266) >> 279 << /P (267) >> 280 << /P (268) >> 281 << /P (269) >> 282 << /P (270) >> 283 << /P (271) >> 284 << /P (272) >> 285 << /P (273) >> 286 << /P (274) >> 287 << /P (275) >> 288 << /P (276) >> 289 << /P (277) >> 290 << /P (278) >> 291 << /P (279) >> 292 << /P (280) >> 293 << /P (281) >> 294 << /P (282) >> 295 << /P (283) >> 296 << /P (284) >> 297 << /P (285) >> 298 << /P (286) >> 299 << /P (287) >> 300 << /P (288) >> 301 << /P (289) >> 302 << /P (290) >> 303 << /P (291) >> 304 << /P (292) >> 305 << /P (293) >> 306 << /P (294) >> 307 << /P (295) >> 308 << /P (296) >> 309 << /P (297) >> 310 << /P (298) >> 311 << /P (299) >> 312 << /P (300) >> 313 << /P (301) >> 314 << /P (302) >> 315 << /P (303) >> 316 << /P (304) >> 317 << /P (305) >> 318 << /P (306) >> 319 << /P (307) >> ] >> endobj 4389 0 obj << /First 4390 0 R /Last 4756 0 R >> endobj xref 0 5132 0000000000 65535 f 0001623691 00000 n 0001626450 00000 n 0001626619 00000 n 0000000015 00000 n 0000000886 00000 n 0000003568 00000 n 0000003601 00000 n 0000005614 00000 n 0001627037 00000 n 0000005290 00000 n 0000005806 00000 n 0000005827 00000 n 0000005848 00000 n 0000009428 00000 n 0000005868 00000 n 0000007332 00000 n 0000008709 00000 n 0000008730 00000 n 0000008751 00000 n 0000009621 00000 n 0000013258 00000 n 0000009641 00000 n 0000009689 00000 n 0000013196 00000 n 0000009827 00000 n 0000009897 00000 n 0000010035 00000 n 0000010083 00000 n 0000010221 00000 n 0000010301 00000 n 0000010439 00000 n 0000010492 00000 n 0000010564 00000 n 0000010702 00000 n 0000010781 00000 n 0000010919 00000 n 0000013468 00000 n 0000015625 00000 n 0000013489 00000 n 0000015818 00000 n 0000019637 00000 n 0000015839 00000 n 0000016268 00000 n 0000016303 00000 n 0000016751 00000 n 0000016771 00000 n 0000016791 00000 n 0000019830 00000 n 0000023378 00000 n 0000019851 00000 n 0000023571 00000 n 0000027164 00000 n 0000023592 00000 n 0000027357 00000 n 0000031063 00000 n 0000027378 00000 n 0000031256 00000 n 0000034600 00000 n 0000031277 00000 n 0000034793 00000 n 0000037445 00000 n 0000034814 00000 n 0000037638 00000 n 0000040631 00000 n 0000037659 00000 n 0000040824 00000 n 0000044057 00000 n 0000040845 00000 n 0000044250 00000 n 0000046769 00000 n 0000044271 00000 n 0000046962 00000 n 0000050132 00000 n 0000046983 00000 n 0000050325 00000 n 0000053085 00000 n 0000050346 00000 n 0000053278 00000 n 0000056269 00000 n 0000053299 00000 n 0000056462 00000 n 0000059721 00000 n 0000056483 00000 n 0000059914 00000 n 0000063189 00000 n 0000059935 00000 n 0000063382 00000 n 0000066551 00000 n 0000063403 00000 n 0000066744 00000 n 0000069526 00000 n 0000066765 00000 n 0000069719 00000 n 0000072947 00000 n 0000069740 00000 n 0000073140 00000 n 0000076289 00000 n 0000073161 00000 n 0000076482 00000 n 0000077721 00000 n 0000076503 00000 n 0000077916 00000 n 0000080455 00000 n 0000077938 00000 n 0000080650 00000 n 0000083846 00000 n 0000080672 00000 n 0000084041 00000 n 0000119943 00000 n 0000084063 00000 n 0000084142 00000 n 0000119106 00000 n 0000084280 00000 n 0000084422 00000 n 0000084501 00000 n 0000084640 00000 n 0000084782 00000 n 0000084861 00000 n 0000085000 00000 n 0000085142 00000 n 0000085223 00000 n 0000085362 00000 n 0000085503 00000 n 0000085584 00000 n 0000085722 00000 n 0000085864 00000 n 0000085945 00000 n 0000086083 00000 n 0001198180 00000 n 0000086225 00000 n 0000086364 00000 n 0001198261 00000 n 0000086506 00000 n 0000086645 00000 n 0001202873 00000 n 0000086787 00000 n 0000086927 00000 n 0001202956 00000 n 0000087069 00000 n 0000087209 00000 n 0001203039 00000 n 0000087351 00000 n 0000087491 00000 n 0001203122 00000 n 0000087632 00000 n 0000087772 00000 n 0001207570 00000 n 0000087914 00000 n 0000088054 00000 n 0001207737 00000 n 0000088196 00000 n 0000088336 00000 n 0001207820 00000 n 0000088478 00000 n 0000088617 00000 n 0001212413 00000 n 0000088759 00000 n 0000088898 00000 n 0000788745 00000 n 0000089038 00000 n 0000089176 00000 n 0001217760 00000 n 0000089318 00000 n 0000089457 00000 n 0001217841 00000 n 0000089598 00000 n 0000089736 00000 n 0000224068 00000 n 0000089878 00000 n 0000090016 00000 n 0000224148 00000 n 0000090158 00000 n 0000090298 00000 n 0000224230 00000 n 0000090440 00000 n 0000090580 00000 n 0000090722 00000 n 0000090803 00000 n 0000090943 00000 n 0000091084 00000 n 0000091165 00000 n 0000091304 00000 n 0000091446 00000 n 0000091526 00000 n 0000091665 00000 n 0000091807 00000 n 0000091887 00000 n 0000092027 00000 n 0000092168 00000 n 0000092248 00000 n 0000092388 00000 n 0000092530 00000 n 0000092609 00000 n 0000092749 00000 n 0000092891 00000 n 0000092970 00000 n 0000093110 00000 n 0000093251 00000 n 0000093332 00000 n 0000093472 00000 n 0000093614 00000 n 0000093695 00000 n 0000093835 00000 n 0000093977 00000 n 0000094058 00000 n 0000094198 00000 n 0000094340 00000 n 0000094421 00000 n 0000094560 00000 n 0000094702 00000 n 0000094783 00000 n 0000094922 00000 n 0000095064 00000 n 0000095145 00000 n 0000095283 00000 n 0000095425 00000 n 0000095506 00000 n 0000095646 00000 n 0000095787 00000 n 0000095868 00000 n 0000096008 00000 n 0000604753 00000 n 0000096150 00000 n 0000096290 00000 n 0000967456 00000 n 0000096432 00000 n 0000096571 00000 n 0000096713 00000 n 0000096794 00000 n 0000096933 00000 n 0000097075 00000 n 0000097156 00000 n 0000097296 00000 n 0000097438 00000 n 0000097517 00000 n 0000097657 00000 n 0000097799 00000 n 0000097878 00000 n 0000098018 00000 n 0000098160 00000 n 0000098240 00000 n 0000098379 00000 n 0000098521 00000 n 0000098602 00000 n 0000098740 00000 n 0000098881 00000 n 0000098962 00000 n 0000099099 00000 n 0000607533 00000 n 0000099241 00000 n 0000099381 00000 n 0000607614 00000 n 0000099522 00000 n 0000099661 00000 n 0000607697 00000 n 0000099803 00000 n 0000099943 00000 n 0000100085 00000 n 0000100165 00000 n 0000100302 00000 n 0000100443 00000 n 0000100524 00000 n 0000100661 00000 n 0000100801 00000 n 0000120156 00000 n 0000123246 00000 n 0000120179 00000 n 0000123441 00000 n 0000127022 00000 n 0000123463 00000 n 0000127217 00000 n 0000130354 00000 n 0000127239 00000 n 0000130549 00000 n 0000132794 00000 n 0000130571 00000 n 0000132989 00000 n 0000135366 00000 n 0000133011 00000 n 0000135561 00000 n 0000137475 00000 n 0000135583 00000 n 0000137670 00000 n 0000139716 00000 n 0000137692 00000 n 0000139911 00000 n 0000141875 00000 n 0000139933 00000 n 0000142070 00000 n 0000144454 00000 n 0000142092 00000 n 0000144649 00000 n 0000146984 00000 n 0000144671 00000 n 0000147179 00000 n 0000150594 00000 n 0000147201 00000 n 0000150789 00000 n 0000154454 00000 n 0000150811 00000 n 0000154649 00000 n 0000157414 00000 n 0000154671 00000 n 0000157609 00000 n 0000160112 00000 n 0000157631 00000 n 0000160307 00000 n 0000162704 00000 n 0000160329 00000 n 0000162899 00000 n 0000165752 00000 n 0000162921 00000 n 0000165947 00000 n 0000169249 00000 n 0000165969 00000 n 0000169444 00000 n 0000172015 00000 n 0000169466 00000 n 0000172210 00000 n 0000174228 00000 n 0000172232 00000 n 0000174423 00000 n 0000178075 00000 n 0000174445 00000 n 0000178270 00000 n 0000180576 00000 n 0000178292 00000 n 0000180771 00000 n 0000182837 00000 n 0000180793 00000 n 0000183032 00000 n 0000185356 00000 n 0000183054 00000 n 0000185551 00000 n 0000187586 00000 n 0000185573 00000 n 0000187781 00000 n 0000189690 00000 n 0000187803 00000 n 0000189885 00000 n 0000192719 00000 n 0000189907 00000 n 0000192914 00000 n 0000194399 00000 n 0000192936 00000 n 0000194594 00000 n 0000197063 00000 n 0000194616 00000 n 0000197258 00000 n 0000198988 00000 n 0000197280 00000 n 0000199183 00000 n 0000201115 00000 n 0000199205 00000 n 0000201310 00000 n 0000203342 00000 n 0000201332 00000 n 0000203537 00000 n 0000205166 00000 n 0000203559 00000 n 0000205361 00000 n 0000207524 00000 n 0000205383 00000 n 0000207719 00000 n 0000209337 00000 n 0000207741 00000 n 0000209532 00000 n 0000211960 00000 n 0000209554 00000 n 0000212155 00000 n 0000214233 00000 n 0000212177 00000 n 0000214428 00000 n 0000215674 00000 n 0000214450 00000 n 0000215869 00000 n 0000217194 00000 n 0000215891 00000 n 0000217389 00000 n 0000218797 00000 n 0000217411 00000 n 0000218992 00000 n 0000220351 00000 n 0000219014 00000 n 0000220546 00000 n 0000221273 00000 n 0000220568 00000 n 0000221468 00000 n 0000223851 00000 n 0000221489 00000 n 0000224046 00000 n 0000228045 00000 n 0000224312 00000 n 0000224392 00000 n 0000228008 00000 n 0000224532 00000 n 0000224668 00000 n 0000228258 00000 n 0000230762 00000 n 0000228280 00000 n 0000230957 00000 n 0000268619 00000 n 0000230979 00000 n 0000231059 00000 n 0000267734 00000 n 0000231195 00000 n 0000231333 00000 n 0000231415 00000 n 0000231551 00000 n 0000231689 00000 n 0000231771 00000 n 0000231907 00000 n 0000232045 00000 n 0000232127 00000 n 0000232262 00000 n 0000232400 00000 n 0000232482 00000 n 0000232618 00000 n 0000232756 00000 n 0000232836 00000 n 0000232972 00000 n 0000233110 00000 n 0000233190 00000 n 0000233326 00000 n 0000233464 00000 n 0000233544 00000 n 0000233679 00000 n 0000233817 00000 n 0000233897 00000 n 0000234032 00000 n 0000234169 00000 n 0000234249 00000 n 0000234384 00000 n 0000234522 00000 n 0000234604 00000 n 0000234738 00000 n 0000234875 00000 n 0000234957 00000 n 0000235091 00000 n 0000277633 00000 n 0000235229 00000 n 0000235365 00000 n 0000277714 00000 n 0000235503 00000 n 0000235639 00000 n 0000674769 00000 n 0000235777 00000 n 0000235912 00000 n 0000674850 00000 n 0000236050 00000 n 0000236186 00000 n 0000674932 00000 n 0000236324 00000 n 0000236459 00000 n 0000675014 00000 n 0000236597 00000 n 0000236733 00000 n 0000236871 00000 n 0000236953 00000 n 0000237088 00000 n 0000300419 00000 n 0000237226 00000 n 0000237361 00000 n 0000300499 00000 n 0000237499 00000 n 0000237634 00000 n 0000542177 00000 n 0000237771 00000 n 0000237906 00000 n 0000542260 00000 n 0000238044 00000 n 0000238179 00000 n 0000451637 00000 n 0000238317 00000 n 0000238452 00000 n 0000451717 00000 n 0000238589 00000 n 0000238723 00000 n 0000451799 00000 n 0000238861 00000 n 0000238996 00000 n 0000451881 00000 n 0000239134 00000 n 0000239270 00000 n 0000239407 00000 n 0000239487 00000 n 0000239623 00000 n 0000239761 00000 n 0000239843 00000 n 0000239979 00000 n 0000240117 00000 n 0000240199 00000 n 0000240335 00000 n 0000240473 00000 n 0000240555 00000 n 0000240691 00000 n 0000240829 00000 n 0000240909 00000 n 0000241045 00000 n 0000241183 00000 n 0000241264 00000 n 0000241400 00000 n 0000241538 00000 n 0000241619 00000 n 0000241755 00000 n 0000241893 00000 n 0000241975 00000 n 0000242111 00000 n 0000242248 00000 n 0000242330 00000 n 0000242466 00000 n 0000456886 00000 n 0000242604 00000 n 0000242740 00000 n 0000242878 00000 n 0000242958 00000 n 0000243094 00000 n 0000243232 00000 n 0000243312 00000 n 0000243446 00000 n 0000243584 00000 n 0000243664 00000 n 0000243799 00000 n 0000243937 00000 n 0000244017 00000 n 0000244153 00000 n 0000244291 00000 n 0000244373 00000 n 0000244509 00000 n 0000244647 00000 n 0000244729 00000 n 0000244865 00000 n 0000245003 00000 n 0000245085 00000 n 0000245221 00000 n 0000245359 00000 n 0000245439 00000 n 0000245575 00000 n 0000245713 00000 n 0000245794 00000 n 0000245930 00000 n 0000246068 00000 n 0000246148 00000 n 0000246284 00000 n 0000246422 00000 n 0000246503 00000 n 0000246639 00000 n 0000246777 00000 n 0000246912 00000 n 0000247050 00000 n 0000247132 00000 n 0000247266 00000 n 0000247403 00000 n 0000247485 00000 n 0000247620 00000 n 0000247758 00000 n 0000247840 00000 n 0000247975 00000 n 0000248111 00000 n 0000248193 00000 n 0000248327 00000 n 0000248462 00000 n 0000248543 00000 n 0000248677 00000 n 0000248813 00000 n 0000268832 00000 n 0000272902 00000 n 0000268855 00000 n 0000273097 00000 n 0000276218 00000 n 0000273119 00000 n 0000276413 00000 n 0000277417 00000 n 0000276435 00000 n 0000277612 00000 n 0000281084 00000 n 0000888809 00000 n 0000277794 00000 n 0000281047 00000 n 0000277933 00000 n 0000278069 00000 n 0000281297 00000 n 0000283465 00000 n 0000281319 00000 n 0000283660 00000 n 0000286528 00000 n 0000283682 00000 n 0000286499 00000 n 0000283820 00000 n 0000286741 00000 n 0000288853 00000 n 0000286763 00000 n 0000289048 00000 n 0000291244 00000 n 0000289070 00000 n 0000291215 00000 n 0000289210 00000 n 0000291457 00000 n 0000293541 00000 n 0000291479 00000 n 0000293736 00000 n 0000296482 00000 n 0000293758 00000 n 0000296677 00000 n 0000297094 00000 n 0000296699 00000 n 0000297289 00000 n 0000300202 00000 n 0000297310 00000 n 0000300397 00000 n 0000303865 00000 n 0000300579 00000 n 0000300659 00000 n 0000303836 00000 n 0000300797 00000 n 0000304078 00000 n 0000307246 00000 n 0000304100 00000 n 0000307441 00000 n 0000309878 00000 n 0000307463 00000 n 0000310073 00000 n 0000313193 00000 n 0000310095 00000 n 0000313388 00000 n 0000315818 00000 n 0000313410 00000 n 0000316013 00000 n 0000317653 00000 n 0000316035 00000 n 0000317848 00000 n 0000319875 00000 n 0000317870 00000 n 0000320070 00000 n 0000321693 00000 n 0000320092 00000 n 0000321888 00000 n 0000323693 00000 n 0000321910 00000 n 0000323664 00000 n 0000322050 00000 n 0000323906 00000 n 0000325853 00000 n 0000323928 00000 n 0000326048 00000 n 0000327689 00000 n 0000326070 00000 n 0000327884 00000 n 0000329890 00000 n 0000327906 00000 n 0000330085 00000 n 0000332586 00000 n 0000330107 00000 n 0000332781 00000 n 0000334988 00000 n 0000332803 00000 n 0000335183 00000 n 0000336705 00000 n 0000335205 00000 n 0000336676 00000 n 0000335341 00000 n 0000336918 00000 n 0000339861 00000 n 0000336940 00000 n 0000340056 00000 n 0000342633 00000 n 0000340078 00000 n 0000342828 00000 n 0000345838 00000 n 0000342850 00000 n 0000346033 00000 n 0000348517 00000 n 0000346055 00000 n 0000348712 00000 n 0000351918 00000 n 0000348734 00000 n 0000351889 00000 n 0000348872 00000 n 0000352131 00000 n 0000355094 00000 n 0000352153 00000 n 0000355289 00000 n 0000357522 00000 n 0000355311 00000 n 0000357717 00000 n 0000360410 00000 n 0000357739 00000 n 0000360605 00000 n 0000363055 00000 n 0000360627 00000 n 0000363250 00000 n 0000366077 00000 n 0000363272 00000 n 0000366272 00000 n 0000369249 00000 n 0000366294 00000 n 0000369444 00000 n 0000371575 00000 n 0000369466 00000 n 0000371770 00000 n 0000374392 00000 n 0000371792 00000 n 0000374587 00000 n 0000378166 00000 n 0000374609 00000 n 0000378361 00000 n 0000381589 00000 n 0000378383 00000 n 0000381784 00000 n 0000384754 00000 n 0000381806 00000 n 0000384949 00000 n 0000387982 00000 n 0000384971 00000 n 0000388177 00000 n 0000391137 00000 n 0000388199 00000 n 0000391332 00000 n 0000394198 00000 n 0000391354 00000 n 0000394393 00000 n 0000433668 00000 n 0000394415 00000 n 0000394497 00000 n 0000432783 00000 n 0000394632 00000 n 0000394769 00000 n 0000394851 00000 n 0000394987 00000 n 0000395125 00000 n 0000395205 00000 n 0000395340 00000 n 0000395478 00000 n 0000395560 00000 n 0000395695 00000 n 0000395833 00000 n 0000395913 00000 n 0000396046 00000 n 0000396184 00000 n 0000396319 00000 n 0000888890 00000 n 0000396457 00000 n 0000396591 00000 n 0000888972 00000 n 0000396728 00000 n 0000396863 00000 n 0000397000 00000 n 0000397082 00000 n 0000397218 00000 n 0000397356 00000 n 0000397437 00000 n 0000397572 00000 n 0000397710 00000 n 0000397791 00000 n 0000397927 00000 n 0000398064 00000 n 0000398146 00000 n 0000398281 00000 n 0000398419 00000 n 0000398554 00000 n 0000398692 00000 n 0000398774 00000 n 0000398908 00000 n 0000399045 00000 n 0000399127 00000 n 0000399262 00000 n 0000399400 00000 n 0000399482 00000 n 0000399617 00000 n 0000399755 00000 n 0000399837 00000 n 0000399972 00000 n 0000400110 00000 n 0000400190 00000 n 0000400324 00000 n 0000400462 00000 n 0000400542 00000 n 0000400677 00000 n 0000400815 00000 n 0000400895 00000 n 0000401030 00000 n 0000401167 00000 n 0000401247 00000 n 0000401382 00000 n 0000401518 00000 n 0000401598 00000 n 0000401734 00000 n 0000401872 00000 n 0000401952 00000 n 0000402087 00000 n 0000402225 00000 n 0000402307 00000 n 0000402443 00000 n 0000402581 00000 n 0000402663 00000 n 0000402799 00000 n 0000402937 00000 n 0000403019 00000 n 0000403155 00000 n 0000403293 00000 n 0000403375 00000 n 0000403511 00000 n 0000403649 00000 n 0000403731 00000 n 0000403866 00000 n 0000404004 00000 n 0000404086 00000 n 0000404221 00000 n 0000404359 00000 n 0000404441 00000 n 0000404577 00000 n 0000404714 00000 n 0000404796 00000 n 0000404932 00000 n 0000405070 00000 n 0000405152 00000 n 0000405286 00000 n 0000405424 00000 n 0000405504 00000 n 0000405640 00000 n 0000459307 00000 n 0000405777 00000 n 0000405913 00000 n 0000406051 00000 n 0000406131 00000 n 0000406265 00000 n 0000406403 00000 n 0000406485 00000 n 0000406621 00000 n 0000406759 00000 n 0000406841 00000 n 0000406976 00000 n 0000407114 00000 n 0000407195 00000 n 0000407330 00000 n 0000407468 00000 n 0000407549 00000 n 0000407685 00000 n 0000407822 00000 n 0000407902 00000 n 0000408038 00000 n 0000408176 00000 n 0000408258 00000 n 0000408394 00000 n 0000408532 00000 n 0000408614 00000 n 0000408750 00000 n 0000408888 00000 n 0000408970 00000 n 0000409105 00000 n 0000409243 00000 n 0000409325 00000 n 0000409460 00000 n 0000409598 00000 n 0000409678 00000 n 0000409814 00000 n 0000409951 00000 n 0000410032 00000 n 0000410167 00000 n 0000410305 00000 n 0000410386 00000 n 0000410522 00000 n 0000410660 00000 n 0000410740 00000 n 0000410875 00000 n 0000411013 00000 n 0000411094 00000 n 0000411230 00000 n 0000411367 00000 n 0000411448 00000 n 0000411583 00000 n 0000411721 00000 n 0000411803 00000 n 0000411939 00000 n 0000412077 00000 n 0000412159 00000 n 0000412292 00000 n 0000412428 00000 n 0000412508 00000 n 0000412641 00000 n 0000412776 00000 n 0000412858 00000 n 0000412991 00000 n 0000413127 00000 n 0000433881 00000 n 0000436769 00000 n 0000433904 00000 n 0000436964 00000 n 0000439558 00000 n 0000436986 00000 n 0000439753 00000 n 0000442402 00000 n 0000439775 00000 n 0000442597 00000 n 0000444694 00000 n 0000442619 00000 n 0000444889 00000 n 0000448255 00000 n 0000444911 00000 n 0000448450 00000 n 0000449334 00000 n 0000448472 00000 n 0000449529 00000 n 0000451420 00000 n 0000449550 00000 n 0000451615 00000 n 0000454670 00000 n 0000451963 00000 n 0000452043 00000 n 0000454641 00000 n 0000452183 00000 n 0000454883 00000 n 0000456651 00000 n 0000454905 00000 n 0000456622 00000 n 0000455038 00000 n 0000456864 00000 n 0000459072 00000 n 0000456967 00000 n 0000459043 00000 n 0000457107 00000 n 0000459285 00000 n 0000462926 00000 n 0000459389 00000 n 0000462897 00000 n 0000459528 00000 n 0000463139 00000 n 0000464990 00000 n 0000463161 00000 n 0000464961 00000 n 0000463296 00000 n 0000465203 00000 n 0000467695 00000 n 0000465225 00000 n 0000467890 00000 n 0000470419 00000 n 0000467912 00000 n 0000470614 00000 n 0000473126 00000 n 0000470636 00000 n 0000473321 00000 n 0000476172 00000 n 0000473343 00000 n 0000476367 00000 n 0000479328 00000 n 0000476389 00000 n 0000479523 00000 n 0000480919 00000 n 0000479545 00000 n 0000481114 00000 n 0000483473 00000 n 0000481136 00000 n 0000483668 00000 n 0000486619 00000 n 0000483690 00000 n 0000486590 00000 n 0000483829 00000 n 0000486832 00000 n 0000489917 00000 n 0000486854 00000 n 0000490112 00000 n 0000492837 00000 n 0000490134 00000 n 0000493032 00000 n 0000495627 00000 n 0000493054 00000 n 0000495822 00000 n 0000498668 00000 n 0000495844 00000 n 0000498863 00000 n 0000501139 00000 n 0000498885 00000 n 0000501334 00000 n 0000503518 00000 n 0000501356 00000 n 0000503713 00000 n 0000506180 00000 n 0000503735 00000 n 0000506375 00000 n 0000509435 00000 n 0000506397 00000 n 0000509630 00000 n 0000512263 00000 n 0000509652 00000 n 0000512458 00000 n 0000515605 00000 n 0000512480 00000 n 0000515800 00000 n 0000518793 00000 n 0000515822 00000 n 0000518988 00000 n 0000521913 00000 n 0000519010 00000 n 0000522108 00000 n 0000525161 00000 n 0000522130 00000 n 0000525356 00000 n 0000528312 00000 n 0000525378 00000 n 0000528507 00000 n 0000531387 00000 n 0000528530 00000 n 0000531584 00000 n 0000534457 00000 n 0000531607 00000 n 0000534654 00000 n 0000537441 00000 n 0000534677 00000 n 0000537638 00000 n 0000538832 00000 n 0000537661 00000 n 0000539029 00000 n 0000541957 00000 n 0000539052 00000 n 0000542154 00000 n 0000544895 00000 n 0000542343 00000 n 0000542425 00000 n 0000544864 00000 n 0000542564 00000 n 0000545111 00000 n 0000547362 00000 n 0000545134 00000 n 0000547559 00000 n 0000550453 00000 n 0000547582 00000 n 0000550650 00000 n 0000554359 00000 n 0000550673 00000 n 0000554556 00000 n 0000556896 00000 n 0000554579 00000 n 0000557093 00000 n 0000560273 00000 n 0000557116 00000 n 0000560233 00000 n 0000557257 00000 n 0000557395 00000 n 0000560489 00000 n 0000561307 00000 n 0000560512 00000 n 0000561504 00000 n 0000565067 00000 n 0000561526 00000 n 0000565027 00000 n 0000561665 00000 n 0000561802 00000 n 0000565283 00000 n 0000604513 00000 n 0000565306 00000 n 0000565389 00000 n 0000603519 00000 n 0000565527 00000 n 0000565666 00000 n 0000565748 00000 n 0000565886 00000 n 0000566026 00000 n 0000566107 00000 n 0000566244 00000 n 0000566384 00000 n 0000566466 00000 n 0000566603 00000 n 0000566741 00000 n 0000566823 00000 n 0000566961 00000 n 0000567100 00000 n 0000567183 00000 n 0000567320 00000 n 0000567460 00000 n 0000567596 00000 n 0000567735 00000 n 0000567816 00000 n 0000567953 00000 n 0000568093 00000 n 0000568176 00000 n 0000568314 00000 n 0000568454 00000 n 0000568537 00000 n 0000568674 00000 n 0000568814 00000 n 0000568897 00000 n 0000569035 00000 n 0000569175 00000 n 0000569258 00000 n 0000569396 00000 n 0000569536 00000 n 0000569618 00000 n 0000569755 00000 n 0000569895 00000 n 0000569976 00000 n 0000570114 00000 n 0000570253 00000 n 0000570334 00000 n 0000570471 00000 n 0000570611 00000 n 0000570694 00000 n 0000570831 00000 n 0000570971 00000 n 0000571052 00000 n 0000571188 00000 n 0000571327 00000 n 0000571410 00000 n 0000571547 00000 n 0000571687 00000 n 0000571770 00000 n 0000571908 00000 n 0000572048 00000 n 0000572131 00000 n 0000572269 00000 n 0000572409 00000 n 0000572491 00000 n 0000572629 00000 n 0000572769 00000 n 0000572852 00000 n 0000572990 00000 n 0000573130 00000 n 0000573213 00000 n 0000573351 00000 n 0000573491 00000 n 0000573572 00000 n 0000573710 00000 n 0000573850 00000 n 0000573933 00000 n 0000574071 00000 n 0000574211 00000 n 0000574294 00000 n 0000574432 00000 n 0000574572 00000 n 0000574655 00000 n 0000574793 00000 n 0000574933 00000 n 0000575016 00000 n 0000575153 00000 n 0000575293 00000 n 0000575376 00000 n 0000575514 00000 n 0000575654 00000 n 0000575737 00000 n 0000575873 00000 n 0000576013 00000 n 0000576095 00000 n 0000576231 00000 n 0000576371 00000 n 0000576453 00000 n 0000576590 00000 n 0000576730 00000 n 0000576812 00000 n 0000576950 00000 n 0000577090 00000 n 0000577173 00000 n 0000577311 00000 n 0000577450 00000 n 0000577533 00000 n 0000577671 00000 n 0000577811 00000 n 0000577894 00000 n 0000578030 00000 n 0000578170 00000 n 0000578253 00000 n 0000578391 00000 n 0000578531 00000 n 0000578615 00000 n 0000578753 00000 n 0000578893 00000 n 0000578977 00000 n 0000579115 00000 n 0000579255 00000 n 0000579391 00000 n 0000579531 00000 n 0000579614 00000 n 0000579750 00000 n 0000579890 00000 n 0000579973 00000 n 0000580110 00000 n 0000580250 00000 n 0000580332 00000 n 0000580470 00000 n 0000580609 00000 n 0000580691 00000 n 0000580829 00000 n 0000580969 00000 n 0000581051 00000 n 0000581188 00000 n 0000581328 00000 n 0000581410 00000 n 0000581547 00000 n 0000581685 00000 n 0000581767 00000 n 0000581903 00000 n 0000582043 00000 n 0000582125 00000 n 0000582263 00000 n 0000582403 00000 n 0000582487 00000 n 0000582624 00000 n 0000582764 00000 n 0000582847 00000 n 0000582985 00000 n 0000583125 00000 n 0000583209 00000 n 0000583347 00000 n 0000583487 00000 n 0000583569 00000 n 0000583706 00000 n 0000583845 00000 n 0000583927 00000 n 0000584061 00000 n 0000584199 00000 n 0000584281 00000 n 0000584415 00000 n 0000584553 00000 n 0000604729 00000 n 0000607294 00000 n 0000604836 00000 n 0000607263 00000 n 0000604976 00000 n 0000607510 00000 n 0000611057 00000 n 0000607780 00000 n 0000611017 00000 n 0000607921 00000 n 0000608064 00000 n 0000611273 00000 n 0000613451 00000 n 0000611296 00000 n 0000613393 00000 n 0000611432 00000 n 0000611570 00000 n 0000611707 00000 n 0000611842 00000 n 0000613667 00000 n 0000616033 00000 n 0000613690 00000 n 0000616230 00000 n 0000618711 00000 n 0000616253 00000 n 0000618908 00000 n 0000621137 00000 n 0000618931 00000 n 0000621334 00000 n 0000623493 00000 n 0000621357 00000 n 0000623690 00000 n 0000626124 00000 n 0000623713 00000 n 0000626321 00000 n 0000627839 00000 n 0000626344 00000 n 0000628036 00000 n 0000629483 00000 n 0000628059 00000 n 0000629680 00000 n 0000631360 00000 n 0000629703 00000 n 0000631557 00000 n 0000633242 00000 n 0000631580 00000 n 0000633439 00000 n 0000636053 00000 n 0000633462 00000 n 0000636250 00000 n 0000637749 00000 n 0000636273 00000 n 0000637946 00000 n 0000639514 00000 n 0000637969 00000 n 0000639711 00000 n 0000641522 00000 n 0000639734 00000 n 0000641719 00000 n 0000644864 00000 n 0000641742 00000 n 0000645061 00000 n 0000647602 00000 n 0000645084 00000 n 0000647799 00000 n 0000650360 00000 n 0000647822 00000 n 0000650557 00000 n 0000653611 00000 n 0000650580 00000 n 0000653808 00000 n 0000656359 00000 n 0000653831 00000 n 0000656328 00000 n 0000653972 00000 n 0000656575 00000 n 0000659349 00000 n 0000656598 00000 n 0000659309 00000 n 0000656740 00000 n 0000656878 00000 n 0000659565 00000 n 0000662401 00000 n 0000659588 00000 n 0000662598 00000 n 0000664808 00000 n 0000662621 00000 n 0000665005 00000 n 0000667182 00000 n 0000665028 00000 n 0000667379 00000 n 0000668757 00000 n 0000667402 00000 n 0000668954 00000 n 0000670589 00000 n 0000668977 00000 n 0000670786 00000 n 0000671936 00000 n 0000670809 00000 n 0000672133 00000 n 0000674549 00000 n 0000672156 00000 n 0000674746 00000 n 0000677503 00000 n 0000675096 00000 n 0000675178 00000 n 0000677472 00000 n 0000675318 00000 n 0000677719 00000 n 0000681159 00000 n 0000677742 00000 n 0000681356 00000 n 0000684322 00000 n 0000681379 00000 n 0000684519 00000 n 0000688011 00000 n 0000684542 00000 n 0000688208 00000 n 0000691335 00000 n 0000688231 00000 n 0000691532 00000 n 0000694216 00000 n 0000691555 00000 n 0000694413 00000 n 0000697707 00000 n 0000694436 00000 n 0000697676 00000 n 0000694577 00000 n 0000697923 00000 n 0000701004 00000 n 0000697946 00000 n 0000701201 00000 n 0000704190 00000 n 0000701224 00000 n 0000704387 00000 n 0000706820 00000 n 0000704410 00000 n 0000707017 00000 n 0000709361 00000 n 0000707040 00000 n 0000709558 00000 n 0000712512 00000 n 0000709581 00000 n 0000712709 00000 n 0000714689 00000 n 0000712732 00000 n 0000714886 00000 n 0000716907 00000 n 0000714909 00000 n 0000717104 00000 n 0000719921 00000 n 0000717127 00000 n 0000719872 00000 n 0000717266 00000 n 0000717407 00000 n 0000717543 00000 n 0000720137 00000 n 0000722458 00000 n 0000720160 00000 n 0000722427 00000 n 0000720297 00000 n 0000722674 00000 n 0000724712 00000 n 0000722697 00000 n 0000724909 00000 n 0000727143 00000 n 0000724932 00000 n 0000727340 00000 n 0000729442 00000 n 0000727363 00000 n 0000729639 00000 n 0000731591 00000 n 0000729662 00000 n 0000731788 00000 n 0000733816 00000 n 0000731811 00000 n 0000734013 00000 n 0000736230 00000 n 0000734036 00000 n 0000736427 00000 n 0000738829 00000 n 0000736450 00000 n 0000739026 00000 n 0000740988 00000 n 0000739049 00000 n 0000741185 00000 n 0000743471 00000 n 0000741208 00000 n 0000743668 00000 n 0000745630 00000 n 0000743691 00000 n 0000745827 00000 n 0000748625 00000 n 0000745850 00000 n 0000748585 00000 n 0000745993 00000 n 0000746132 00000 n 0000748841 00000 n 0000749904 00000 n 0000748864 00000 n 0000750101 00000 n 0000788505 00000 n 0000750123 00000 n 0000750206 00000 n 0000787511 00000 n 0000750342 00000 n 0000750482 00000 n 0000750564 00000 n 0000750701 00000 n 0000750841 00000 n 0000750925 00000 n 0000751060 00000 n 0000751200 00000 n 0000751284 00000 n 0000751421 00000 n 0000751561 00000 n 0000751644 00000 n 0000751782 00000 n 0000751922 00000 n 0000752004 00000 n 0000752141 00000 n 0000752281 00000 n 0000752365 00000 n 0000752503 00000 n 0000752642 00000 n 0000752725 00000 n 0000752863 00000 n 0000753003 00000 n 0000753087 00000 n 0000753225 00000 n 0000753364 00000 n 0000753447 00000 n 0000753584 00000 n 0000753724 00000 n 0000753808 00000 n 0000753944 00000 n 0000754084 00000 n 0000754168 00000 n 0000754305 00000 n 0000754445 00000 n 0000754582 00000 n 0000754722 00000 n 0000754806 00000 n 0000754942 00000 n 0000755081 00000 n 0000755165 00000 n 0000755303 00000 n 0000755443 00000 n 0000755527 00000 n 0000755664 00000 n 0000755803 00000 n 0000755887 00000 n 0000756025 00000 n 0000756165 00000 n 0000756249 00000 n 0000756387 00000 n 0000756526 00000 n 0000756608 00000 n 0000756746 00000 n 0000756885 00000 n 0000756969 00000 n 0000757106 00000 n 0000757246 00000 n 0000757330 00000 n 0000757468 00000 n 0000757608 00000 n 0000757690 00000 n 0000757827 00000 n 0000757967 00000 n 0000758051 00000 n 0000758189 00000 n 0000758329 00000 n 0000758413 00000 n 0000758551 00000 n 0000758691 00000 n 0000758775 00000 n 0000758912 00000 n 0000759052 00000 n 0000759136 00000 n 0000759274 00000 n 0000759413 00000 n 0000759497 00000 n 0000759634 00000 n 0000759774 00000 n 0000759857 00000 n 0000759995 00000 n 0000760135 00000 n 0000760219 00000 n 0000760356 00000 n 0000760496 00000 n 0000760578 00000 n 0000760716 00000 n 0000760856 00000 n 0000760938 00000 n 0000761075 00000 n 0000761215 00000 n 0000761297 00000 n 0000761435 00000 n 0000761575 00000 n 0000761657 00000 n 0000761795 00000 n 0000761935 00000 n 0000762017 00000 n 0000762154 00000 n 0000892925 00000 n 0000762294 00000 n 0000762431 00000 n 0000893007 00000 n 0000762570 00000 n 0000762708 00000 n 0000893091 00000 n 0000762848 00000 n 0000762985 00000 n 0000893175 00000 n 0000763125 00000 n 0000763263 00000 n 0000763403 00000 n 0000763485 00000 n 0000763623 00000 n 0000763762 00000 n 0000763845 00000 n 0000763982 00000 n 0000764122 00000 n 0000764206 00000 n 0000764344 00000 n 0000764483 00000 n 0000764565 00000 n 0000764703 00000 n 0000764843 00000 n 0000764925 00000 n 0000765062 00000 n 0000765202 00000 n 0000765286 00000 n 0000765424 00000 n 0000765564 00000 n 0000765647 00000 n 0000765785 00000 n 0000765925 00000 n 0000766009 00000 n 0000766147 00000 n 0000766287 00000 n 0000766371 00000 n 0000766509 00000 n 0000766649 00000 n 0000766733 00000 n 0000766869 00000 n 0000767008 00000 n 0000767092 00000 n 0000767230 00000 n 0000767370 00000 n 0000767454 00000 n 0000767591 00000 n 0000767729 00000 n 0000767811 00000 n 0000767949 00000 n 0000768089 00000 n 0000768173 00000 n 0000768310 00000 n 0000768449 00000 n 0000768531 00000 n 0000768667 00000 n 0001222309 00000 n 0000768804 00000 n 0000768939 00000 n 0000769077 00000 n 0000788721 00000 n 0000791228 00000 n 0000788826 00000 n 0000791188 00000 n 0000788965 00000 n 0000789101 00000 n 0000791444 00000 n 0000793136 00000 n 0000791467 00000 n 0000793105 00000 n 0000791606 00000 n 0000793352 00000 n 0000797447 00000 n 0000793375 00000 n 0000797644 00000 n 0000801488 00000 n 0000797667 00000 n 0000801685 00000 n 0000805865 00000 n 0000801708 00000 n 0000805825 00000 n 0000801848 00000 n 0000801989 00000 n 0000806081 00000 n 0000809022 00000 n 0000806104 00000 n 0000809219 00000 n 0000812764 00000 n 0000809242 00000 n 0000812961 00000 n 0000816347 00000 n 0000812984 00000 n 0000816544 00000 n 0000819635 00000 n 0000816567 00000 n 0000819832 00000 n 0000823631 00000 n 0000819855 00000 n 0000823828 00000 n 0000827153 00000 n 0000823851 00000 n 0000827350 00000 n 0000830864 00000 n 0000827373 00000 n 0000831061 00000 n 0000834742 00000 n 0000831084 00000 n 0000834939 00000 n 0000838576 00000 n 0000834962 00000 n 0000838773 00000 n 0000875935 00000 n 0000838796 00000 n 0000838876 00000 n 0000874995 00000 n 0000839017 00000 n 0000839161 00000 n 0000839245 00000 n 0000839386 00000 n 0001222475 00000 n 0000839530 00000 n 0000839671 00000 n 0001222559 00000 n 0000839814 00000 n 0000839955 00000 n 0001222642 00000 n 0000840099 00000 n 0000840240 00000 n 0000840384 00000 n 0000840466 00000 n 0000840607 00000 n 0000840751 00000 n 0000840835 00000 n 0000840976 00000 n 0000841120 00000 n 0000841202 00000 n 0000841343 00000 n 0000841487 00000 n 0000841570 00000 n 0000841711 00000 n 0000841854 00000 n 0000841936 00000 n 0000842077 00000 n 0000842221 00000 n 0000842305 00000 n 0000842446 00000 n 0000842590 00000 n 0000842672 00000 n 0000842813 00000 n 0000842957 00000 n 0000843040 00000 n 0000843181 00000 n 0000843325 00000 n 0000843408 00000 n 0000843549 00000 n 0000843693 00000 n 0000843776 00000 n 0000843917 00000 n 0000844061 00000 n 0000844144 00000 n 0000844285 00000 n 0000844429 00000 n 0000844511 00000 n 0000844652 00000 n 0000844796 00000 n 0000844880 00000 n 0000845021 00000 n 0000845165 00000 n 0000845249 00000 n 0000845390 00000 n 0000845534 00000 n 0000845618 00000 n 0000845758 00000 n 0000845902 00000 n 0000845984 00000 n 0000846125 00000 n 0000846269 00000 n 0000846352 00000 n 0000846493 00000 n 0000846637 00000 n 0000846719 00000 n 0000846860 00000 n 0000847004 00000 n 0000847087 00000 n 0000847228 00000 n 0000847372 00000 n 0000847454 00000 n 0000847595 00000 n 0000847739 00000 n 0000847821 00000 n 0000847962 00000 n 0000848106 00000 n 0000848189 00000 n 0000848330 00000 n 0000848472 00000 n 0000848554 00000 n 0000848695 00000 n 0000848839 00000 n 0000848922 00000 n 0000849063 00000 n 0000849207 00000 n 0000849289 00000 n 0000849430 00000 n 0000849574 00000 n 0000849658 00000 n 0000849799 00000 n 0000849943 00000 n 0000850027 00000 n 0000850168 00000 n 0000850312 00000 n 0000850396 00000 n 0000850537 00000 n 0000850681 00000 n 0000850765 00000 n 0000850906 00000 n 0000851050 00000 n 0000851134 00000 n 0000851275 00000 n 0000851419 00000 n 0000851502 00000 n 0000851643 00000 n 0000851787 00000 n 0000851871 00000 n 0000852012 00000 n 0000852154 00000 n 0000852238 00000 n 0000852379 00000 n 0000852523 00000 n 0000852607 00000 n 0000852747 00000 n 0000852891 00000 n 0000852973 00000 n 0000853114 00000 n 0000853258 00000 n 0000853342 00000 n 0000853483 00000 n 0000853626 00000 n 0000853710 00000 n 0000853851 00000 n 0000853995 00000 n 0000854079 00000 n 0000854220 00000 n 0000854364 00000 n 0000854448 00000 n 0000854589 00000 n 0000854733 00000 n 0000854815 00000 n 0000854956 00000 n 0000855100 00000 n 0000855184 00000 n 0000855325 00000 n 0000855469 00000 n 0000855553 00000 n 0000855694 00000 n 0000855838 00000 n 0000855922 00000 n 0000856063 00000 n 0000856207 00000 n 0000856289 00000 n 0000856430 00000 n 0000856574 00000 n 0000856657 00000 n 0000856796 00000 n 0000856939 00000 n 0000857021 00000 n 0000857160 00000 n 0000857302 00000 n 0000876151 00000 n 0000880140 00000 n 0000876175 00000 n 0000880109 00000 n 0000876314 00000 n 0000880356 00000 n 0000883159 00000 n 0000880379 00000 n 0000883356 00000 n 0000885371 00000 n 0000883379 00000 n 0000885568 00000 n 0000888570 00000 n 0000885591 00000 n 0000888539 00000 n 0000885734 00000 n 0000888786 00000 n 0000892686 00000 n 0000889054 00000 n 0000892637 00000 n 0000889196 00000 n 0000889334 00000 n 0000889416 00000 n 0000889555 00000 n 0000892902 00000 n 0000896692 00000 n 0000893258 00000 n 0000896634 00000 n 0000893402 00000 n 0000893545 00000 n 0000893686 00000 n 0000893827 00000 n 0000896908 00000 n 0000909215 00000 n 0000896931 00000 n 0000897014 00000 n 0000908887 00000 n 0000897151 00000 n 0000897291 00000 n 0000897373 00000 n 0000897510 00000 n 0000897650 00000 n 0000897732 00000 n 0000897869 00000 n 0000898009 00000 n 0000898092 00000 n 0000898229 00000 n 0000898369 00000 n 0000898452 00000 n 0000898589 00000 n 0000898729 00000 n 0000898812 00000 n 0000898949 00000 n 0000899089 00000 n 0000899172 00000 n 0000899309 00000 n 0000899449 00000 n 0000899531 00000 n 0000899668 00000 n 0000899808 00000 n 0000899890 00000 n 0000900027 00000 n 0000900167 00000 n 0000900249 00000 n 0000900385 00000 n 0000900525 00000 n 0000900607 00000 n 0000900744 00000 n 0000900884 00000 n 0000900966 00000 n 0000901103 00000 n 0000901243 00000 n 0000901325 00000 n 0000901462 00000 n 0000901602 00000 n 0000901684 00000 n 0000901821 00000 n 0001226486 00000 n 0000901961 00000 n 0000902098 00000 n 0001230840 00000 n 0000902238 00000 n 0000902375 00000 n 0001230924 00000 n 0000902515 00000 n 0000902652 00000 n 0000902792 00000 n 0000909431 00000 n 0000915553 00000 n 0000909454 00000 n 0000911430 00000 n 0000911452 00000 n 0000911540 00000 n 0000915495 00000 n 0000911684 00000 n 0000911746 00000 n 0000911889 00000 n 0000912033 00000 n 0000912173 00000 n 0000915769 00000 n 0000919163 00000 n 0000915792 00000 n 0000919114 00000 n 0000915934 00000 n 0000916018 00000 n 0000916159 00000 n 0000916243 00000 n 0000916384 00000 n 0000919379 00000 n 0000925196 00000 n 0000919402 00000 n 0000921372 00000 n 0000921394 00000 n 0000925393 00000 n 0000929332 00000 n 0000925416 00000 n 0000925494 00000 n 0000929283 00000 n 0000925637 00000 n 0000925701 00000 n 0000925845 00000 n 0000925908 00000 n 0000926052 00000 n 0000929548 00000 n 0000935016 00000 n 0000929571 00000 n 0000929711 00000 n 0000934913 00000 n 0000929855 00000 n 0000929996 00000 n 0000930140 00000 n 0000930280 00000 n 0000930362 00000 n 0000930506 00000 n 0000930628 00000 n 0000930771 00000 n 0000930915 00000 n 0000931055 00000 n 0000931197 00000 n 0000935232 00000 n 0000940748 00000 n 0000935255 00000 n 0000937278 00000 n 0000937300 00000 n 0000940945 00000 n 0000943003 00000 n 0000940968 00000 n 0000943200 00000 n 0000947024 00000 n 0000943223 00000 n 0000943306 00000 n 0000946975 00000 n 0000943445 00000 n 0000943524 00000 n 0000943664 00000 n 0000943802 00000 n 0000947240 00000 n 0000951753 00000 n 0000947263 00000 n 0000947345 00000 n 0000951704 00000 n 0000947489 00000 n 0000947633 00000 n 0000947771 00000 n 0000951969 00000 n 0000954600 00000 n 0000951992 00000 n 0000954797 00000 n 0000957329 00000 n 0000954820 00000 n 0000957526 00000 n 0000962193 00000 n 0000957549 00000 n 0000957633 00000 n 0000962162 00000 n 0000957774 00000 n 0000962409 00000 n 0000963939 00000 n 0000962432 00000 n 0000964136 00000 n 0000967236 00000 n 0000964159 00000 n 0000967433 00000 n 0000971652 00000 n 0000967539 00000 n 0000971612 00000 n 0000967675 00000 n 0000967757 00000 n 0000967899 00000 n 0000971868 00000 n 0000975070 00000 n 0000971891 00000 n 0000975267 00000 n 0000978565 00000 n 0000975290 00000 n 0000978762 00000 n 0000982394 00000 n 0000978785 00000 n 0000982591 00000 n 0000985514 00000 n 0000982614 00000 n 0000985711 00000 n 0001022798 00000 n 0001222391 00000 n 0000985734 00000 n 0001021804 00000 n 0000985871 00000 n 0000986011 00000 n 0000986094 00000 n 0000986231 00000 n 0000986371 00000 n 0000986455 00000 n 0000986592 00000 n 0000986730 00000 n 0000986814 00000 n 0000986951 00000 n 0000987090 00000 n 0000987172 00000 n 0000987310 00000 n 0000987449 00000 n 0000987531 00000 n 0000987669 00000 n 0000987809 00000 n 0000987891 00000 n 0000988029 00000 n 0000988168 00000 n 0000988250 00000 n 0000988388 00000 n 0000988528 00000 n 0000988610 00000 n 0000988747 00000 n 0000988887 00000 n 0000989024 00000 n 0000989164 00000 n 0000989248 00000 n 0000989384 00000 n 0000989523 00000 n 0000989607 00000 n 0000989745 00000 n 0000989885 00000 n 0000989969 00000 n 0000990107 00000 n 0001226320 00000 n 0000990247 00000 n 0000990385 00000 n 0001226402 00000 n 0000990525 00000 n 0000990662 00000 n 0001244987 00000 n 0000990801 00000 n 0000990938 00000 n 0001245069 00000 n 0000991078 00000 n 0000991215 00000 n 0001245153 00000 n 0000991355 00000 n 0000991492 00000 n 0000991632 00000 n 0000991716 00000 n 0000991853 00000 n 0000991993 00000 n 0000992077 00000 n 0000992214 00000 n 0000992354 00000 n 0000992438 00000 n 0000992576 00000 n 0000992716 00000 n 0000992853 00000 n 0000992993 00000 n 0000993131 00000 n 0001248653 00000 n 0000993271 00000 n 0000993409 00000 n 0001248735 00000 n 0000993549 00000 n 0000993686 00000 n 0000993826 00000 n 0000993963 00000 n 0000994103 00000 n 0000994186 00000 n 0000994322 00000 n 0000994462 00000 n 0000994546 00000 n 0000994681 00000 n 0001058136 00000 n 0000994821 00000 n 0000994958 00000 n 0001253551 00000 n 0000995098 00000 n 0000995234 00000 n 0000995374 00000 n 0000995458 00000 n 0000995595 00000 n 0000995734 00000 n 0000995818 00000 n 0000995954 00000 n 0000996094 00000 n 0000996178 00000 n 0000996315 00000 n 0001260689 00000 n 0000996455 00000 n 0000996593 00000 n 0001260772 00000 n 0000996733 00000 n 0000996871 00000 n 0000997011 00000 n 0000997149 00000 n 0000997288 00000 n 0000997370 00000 n 0000997506 00000 n 0000997646 00000 n 0000997783 00000 n 0000997923 00000 n 0000998007 00000 n 0000998143 00000 n 0000998283 00000 n 0000998367 00000 n 0000998505 00000 n 0000998645 00000 n 0000998729 00000 n 0000998867 00000 n 0000999007 00000 n 0000999089 00000 n 0000999225 00000 n 0000999364 00000 n 0000999446 00000 n 0000999584 00000 n 0000999724 00000 n 0000999806 00000 n 0000999944 00000 n 0001000084 00000 n 0001000166 00000 n 0001000304 00000 n 0001000444 00000 n 0001000527 00000 n 0001000665 00000 n 0001000805 00000 n 0001000888 00000 n 0001001025 00000 n 0001001163 00000 n 0001001245 00000 n 0001001382 00000 n 0001001522 00000 n 0001001606 00000 n 0001001744 00000 n 0001235373 00000 n 0001001884 00000 n 0001002022 00000 n 0001235457 00000 n 0001002162 00000 n 0001002300 00000 n 0001235541 00000 n 0001002440 00000 n 0001002577 00000 n 0001235709 00000 n 0001002716 00000 n 0001002852 00000 n 0001002989 00000 n 0001003073 00000 n 0001003209 00000 n 0001003347 00000 n 0001023014 00000 n 0001025824 00000 n 0001023038 00000 n 0001026021 00000 n 0001028303 00000 n 0001026044 00000 n 0001028500 00000 n 0001032154 00000 n 0001028523 00000 n 0001032351 00000 n 0001035977 00000 n 0001032374 00000 n 0001032438 00000 n 0001035946 00000 n 0001032578 00000 n 0001036193 00000 n 0001039872 00000 n 0001036216 00000 n 0001036303 00000 n 0001039796 00000 n 0001036447 00000 n 0001036591 00000 n 0001036731 00000 n 0001036840 00000 n 0001036984 00000 n 0001037128 00000 n 0001037268 00000 n 0001040088 00000 n 0001045743 00000 n 0001040111 00000 n 0001040225 00000 n 0001045613 00000 n 0001040368 00000 n 0001040512 00000 n 0001040700 00000 n 0001040844 00000 n 0001040988 00000 n 0001041129 00000 n 0001041211 00000 n 0001041350 00000 n 0001041494 00000 n 0001041638 00000 n 0001041778 00000 n 0001041922 00000 n 0001042066 00000 n 0001042206 00000 n 0001045959 00000 n 0001046849 00000 n 0001045982 00000 n 0001047046 00000 n 0001049449 00000 n 0001047068 00000 n 0001049646 00000 n 0001051635 00000 n 0001049669 00000 n 0001051832 00000 n 0001053222 00000 n 0001051855 00000 n 0001053419 00000 n 0001057897 00000 n 0001053442 00000 n 0001053513 00000 n 0001057830 00000 n 0001053655 00000 n 0001053793 00000 n 0001053933 00000 n 0001053990 00000 n 0001054130 00000 n 0001054270 00000 n 0001058113 00000 n 0001062484 00000 n 0001058220 00000 n 0001062435 00000 n 0001058364 00000 n 0001058425 00000 n 0001058569 00000 n 0001058651 00000 n 0001058795 00000 n 0001062700 00000 n 0001067073 00000 n 0001062723 00000 n 0001062788 00000 n 0001066952 00000 n 0001062928 00000 n 0001063068 00000 n 0001063150 00000 n 0001063290 00000 n 0001063427 00000 n 0001063510 00000 n 0001063650 00000 n 0001063788 00000 n 0001063871 00000 n 0001064008 00000 n 0001064148 00000 n 0001064231 00000 n 0001064371 00000 n 0001064511 00000 n 0001064647 00000 n 0001067289 00000 n 0001087340 00000 n 0001067312 00000 n 0001086439 00000 n 0001086463 00000 n 0001087537 00000 n 0001111890 00000 n 0001087559 00000 n 0001110567 00000 n 0001110591 00000 n 0001112087 00000 n 0001113628 00000 n 0001112110 00000 n 0001113825 00000 n 0001139498 00000 n 0001113848 00000 n 0001138561 00000 n 0001138585 00000 n 0001139695 00000 n 0001144219 00000 n 0001139717 00000 n 0001144134 00000 n 0001139856 00000 n 0001139998 00000 n 0001140090 00000 n 0001140234 00000 n 0001140378 00000 n 0001140446 00000 n 0001140589 00000 n 0001140733 00000 n 0001140873 00000 n 0001144435 00000 n 0001148142 00000 n 0001144458 00000 n 0001144518 00000 n 0001148111 00000 n 0001144660 00000 n 0001148358 00000 n 0001150323 00000 n 0001148381 00000 n 0001150520 00000 n 0001182235 00000 n 0001207404 00000 n 0001150543 00000 n 0001181403 00000 n 0001150684 00000 n 0001207486 00000 n 0001150827 00000 n 0001150968 00000 n 0001207653 00000 n 0001151112 00000 n 0001151253 00000 n 0001151396 00000 n 0001151478 00000 n 0001151619 00000 n 0001151761 00000 n 0001151843 00000 n 0001151984 00000 n 0001152128 00000 n 0001152212 00000 n 0001152353 00000 n 0001152497 00000 n 0001152581 00000 n 0001152721 00000 n 0001152865 00000 n 0001152948 00000 n 0001153089 00000 n 0001153233 00000 n 0001153314 00000 n 0001153454 00000 n 0001153597 00000 n 0001153680 00000 n 0001153821 00000 n 0001153965 00000 n 0001154048 00000 n 0001154189 00000 n 0001154333 00000 n 0001154416 00000 n 0001154557 00000 n 0001154701 00000 n 0001154784 00000 n 0001154925 00000 n 0001155069 00000 n 0001155150 00000 n 0001155291 00000 n 0001155435 00000 n 0001155518 00000 n 0001155659 00000 n 0001155803 00000 n 0001155886 00000 n 0001156026 00000 n 0001156169 00000 n 0001156253 00000 n 0001156394 00000 n 0001156537 00000 n 0001156621 00000 n 0001156762 00000 n 0001156906 00000 n 0001156990 00000 n 0001157131 00000 n 0001157275 00000 n 0001157357 00000 n 0001157498 00000 n 0001157642 00000 n 0001157726 00000 n 0001157867 00000 n 0001158011 00000 n 0001158095 00000 n 0001158235 00000 n 0001158379 00000 n 0001158463 00000 n 0001158604 00000 n 0001158748 00000 n 0001158832 00000 n 0001158972 00000 n 0001159116 00000 n 0001159199 00000 n 0001159340 00000 n 0001159484 00000 n 0001159568 00000 n 0001159709 00000 n 0001159851 00000 n 0001159933 00000 n 0001160073 00000 n 0001265397 00000 n 0001160217 00000 n 0001160358 00000 n 0001160502 00000 n 0001160585 00000 n 0001160726 00000 n 0001235625 00000 n 0001160870 00000 n 0001161011 00000 n 0001161155 00000 n 0001161239 00000 n 0001161380 00000 n 0001161524 00000 n 0001161608 00000 n 0001161749 00000 n 0001161893 00000 n 0001161977 00000 n 0001162117 00000 n 0001162261 00000 n 0001162345 00000 n 0001162486 00000 n 0001162630 00000 n 0001162714 00000 n 0001162855 00000 n 0001162999 00000 n 0001163083 00000 n 0001163224 00000 n 0001163368 00000 n 0001163452 00000 n 0001163593 00000 n 0001163737 00000 n 0001163820 00000 n 0001163961 00000 n 0001164105 00000 n 0001164189 00000 n 0001164330 00000 n 0001164474 00000 n 0001164558 00000 n 0001164699 00000 n 0001164843 00000 n 0001164925 00000 n 0001165066 00000 n 0001165210 00000 n 0001165294 00000 n 0001165435 00000 n 0001165577 00000 n 0001165659 00000 n 0001165800 00000 n 0001165944 00000 n 0001166028 00000 n 0001166169 00000 n 0001166313 00000 n 0001166396 00000 n 0001166537 00000 n 0001166680 00000 n 0001182451 00000 n 0001186785 00000 n 0001182475 00000 n 0001182890 00000 n 0001182912 00000 n 0001186982 00000 n 0001187834 00000 n 0001187005 00000 n 0001188031 00000 n 0001190789 00000 n 0001188053 00000 n 0001190986 00000 n 0001197941 00000 n 0001191009 00000 n 0001191095 00000 n 0001197721 00000 n 0001191237 00000 n 0001191346 00000 n 0001191486 00000 n 0001191568 00000 n 0001191710 00000 n 0001191815 00000 n 0001191951 00000 n 0001192043 00000 n 0001192185 00000 n 0001192300 00000 n 0001192440 00000 n 0001192525 00000 n 0001192667 00000 n 0001192775 00000 n 0001192914 00000 n 0001192999 00000 n 0001193141 00000 n 0001193249 00000 n 0001193389 00000 n 0001193482 00000 n 0001193624 00000 n 0001193740 00000 n 0001193879 00000 n 0001193962 00000 n 0001194104 00000 n 0001194210 00000 n 0001194348 00000 n 0001194409 00000 n 0001194551 00000 n 0001194625 00000 n 0001194765 00000 n 0001194851 00000 n 0001194993 00000 n 0001195102 00000 n 0001195242 00000 n 0001195320 00000 n 0001195462 00000 n 0001195563 00000 n 0001195703 00000 n 0001195791 00000 n 0001195932 00000 n 0001196043 00000 n 0001196181 00000 n 0001198157 00000 n 0001202634 00000 n 0001198344 00000 n 0001198428 00000 n 0001202603 00000 n 0001198570 00000 n 0001202850 00000 n 0001207165 00000 n 0001203205 00000 n 0001207116 00000 n 0001203347 00000 n 0001203431 00000 n 0001203575 00000 n 0001203714 00000 n 0001207381 00000 n 0001212174 00000 n 0001207903 00000 n 0001212089 00000 n 0001208039 00000 n 0001208183 00000 n 0001208327 00000 n 0001208471 00000 n 0001208615 00000 n 0001208756 00000 n 0001208898 00000 n 0001212390 00000 n 0001217521 00000 n 0001212494 00000 n 0001217445 00000 n 0001212635 00000 n 0001212719 00000 n 0001212860 00000 n 0001212944 00000 n 0001213085 00000 n 0001213169 00000 n 0001213310 00000 n 0001213394 00000 n 0001213533 00000 n 0001213617 00000 n 0001213758 00000 n 0001217737 00000 n 0001222070 00000 n 0001217923 00000 n 0001218005 00000 n 0001222003 00000 n 0001218143 00000 n 0001218254 00000 n 0001218396 00000 n 0001218538 00000 n 0001218676 00000 n 0001218760 00000 n 0001218899 00000 n 0001222286 00000 n 0001226081 00000 n 0001222726 00000 n 0001226041 00000 n 0001222867 00000 n 0001223007 00000 n 0001226297 00000 n 0001230601 00000 n 0001226570 00000 n 0001230561 00000 n 0001226714 00000 n 0001226853 00000 n 0001230817 00000 n 0001235134 00000 n 0001231008 00000 n 0001231092 00000 n 0001235094 00000 n 0001231234 00000 n 0001231376 00000 n 0001235350 00000 n 0001239455 00000 n 0001235793 00000 n 0001235877 00000 n 0001239424 00000 n 0001236019 00000 n 0001239671 00000 n 0001244749 00000 n 0001239694 00000 n 0001239779 00000 n 0001244565 00000 n 0001239917 00000 n 0001240025 00000 n 0001240160 00000 n 0001240239 00000 n 0001240377 00000 n 0001240479 00000 n 0001240615 00000 n 0001240707 00000 n 0001240845 00000 n 0001240965 00000 n 0001241101 00000 n 0001241189 00000 n 0001241327 00000 n 0001241438 00000 n 0001241573 00000 n 0001241642 00000 n 0001241780 00000 n 0001241872 00000 n 0001242008 00000 n 0001242074 00000 n 0001242212 00000 n 0001242301 00000 n 0001242437 00000 n 0001242513 00000 n 0001242651 00000 n 0001242750 00000 n 0001242886 00000 n 0001242955 00000 n 0001243093 00000 n 0001243185 00000 n 0001243321 00000 n 0001243391 00000 n 0001243529 00000 n 0001243622 00000 n 0001243758 00000 n 0001244965 00000 n 0001248414 00000 n 0001245237 00000 n 0001245319 00000 n 0001248383 00000 n 0001245462 00000 n 0001248630 00000 n 0001253312 00000 n 0001248817 00000 n 0001248954 00000 n 0001253236 00000 n 0001249094 00000 n 0001249234 00000 n 0001249370 00000 n 0001249510 00000 n 0001249592 00000 n 0001249730 00000 n 0001249812 00000 n 0001249951 00000 n 0001253528 00000 n 0001257486 00000 n 0001253634 00000 n 0001253716 00000 n 0001257455 00000 n 0001253856 00000 n 0001257702 00000 n 0001260450 00000 n 0001257725 00000 n 0001257807 00000 n 0001260419 00000 n 0001257948 00000 n 0001260666 00000 n 0001265158 00000 n 0001260854 00000 n 0001260936 00000 n 0001265118 00000 n 0001261078 00000 n 0001261220 00000 n 0001265374 00000 n 0001268555 00000 n 0001265479 00000 n 0001268524 00000 n 0001265620 00000 n 0001268771 00000 n 0001293918 00000 n 0001268794 00000 n 0001268877 00000 n 0001293032 00000 n 0001269015 00000 n 0001269098 00000 n 0001269236 00000 n 0001269320 00000 n 0001269456 00000 n 0001269539 00000 n 0001269677 00000 n 0001269760 00000 n 0001269898 00000 n 0001269979 00000 n 0001270117 00000 n 0001270199 00000 n 0001270337 00000 n 0001270420 00000 n 0001270558 00000 n 0001270640 00000 n 0001270778 00000 n 0001270860 00000 n 0001270996 00000 n 0001271078 00000 n 0001271216 00000 n 0001271298 00000 n 0001271436 00000 n 0001271518 00000 n 0001271656 00000 n 0001271739 00000 n 0001271877 00000 n 0001271959 00000 n 0001272097 00000 n 0001272178 00000 n 0001272316 00000 n 0001272396 00000 n 0001272534 00000 n 0001272615 00000 n 0001272753 00000 n 0001272833 00000 n 0001272971 00000 n 0001273053 00000 n 0001273191 00000 n 0001273272 00000 n 0001273410 00000 n 0001273493 00000 n 0001273631 00000 n 0001273714 00000 n 0001273852 00000 n 0001273934 00000 n 0001274072 00000 n 0001274154 00000 n 0001274292 00000 n 0001274375 00000 n 0001274513 00000 n 0001274596 00000 n 0001274734 00000 n 0001274816 00000 n 0001274954 00000 n 0001275037 00000 n 0001275173 00000 n 0001275257 00000 n 0001275393 00000 n 0001275474 00000 n 0001275612 00000 n 0001275693 00000 n 0001275831 00000 n 0001275915 00000 n 0001276053 00000 n 0001276135 00000 n 0001276273 00000 n 0001276356 00000 n 0001276494 00000 n 0001276576 00000 n 0001276714 00000 n 0001276796 00000 n 0001276934 00000 n 0001277017 00000 n 0001277153 00000 n 0001277236 00000 n 0001277374 00000 n 0001277457 00000 n 0001277595 00000 n 0001277678 00000 n 0001277816 00000 n 0001277899 00000 n 0001278037 00000 n 0001278118 00000 n 0001278255 00000 n 0001278338 00000 n 0001278474 00000 n 0001278557 00000 n 0001278693 00000 n 0001278775 00000 n 0001278913 00000 n 0001278994 00000 n 0001279132 00000 n 0001279216 00000 n 0001279356 00000 n 0001279439 00000 n 0001279579 00000 n 0001279662 00000 n 0001279802 00000 n 0001279886 00000 n 0001280026 00000 n 0001280108 00000 n 0001280248 00000 n 0001280331 00000 n 0001280471 00000 n 0001280555 00000 n 0001280695 00000 n 0001280778 00000 n 0001280918 00000 n 0001281001 00000 n 0001281141 00000 n 0001281281 00000 n 0001281363 00000 n 0001281501 00000 n 0001281582 00000 n 0001281722 00000 n 0001281804 00000 n 0001281944 00000 n 0001282026 00000 n 0001282166 00000 n 0001282249 00000 n 0001282389 00000 n 0001282470 00000 n 0001282610 00000 n 0001282691 00000 n 0001282831 00000 n 0001282914 00000 n 0001283054 00000 n 0001283138 00000 n 0001283278 00000 n 0001283360 00000 n 0001283500 00000 n 0001283583 00000 n 0001283721 00000 n 0001283802 00000 n 0001283942 00000 n 0001284025 00000 n 0001284165 00000 n 0001284248 00000 n 0001284388 00000 n 0001284471 00000 n 0001284611 00000 n 0001284693 00000 n 0001284833 00000 n 0001284916 00000 n 0001285056 00000 n 0001285137 00000 n 0001285277 00000 n 0001285360 00000 n 0001285500 00000 n 0001285583 00000 n 0001285723 00000 n 0001285806 00000 n 0001285946 00000 n 0001286029 00000 n 0001286169 00000 n 0001286252 00000 n 0001286392 00000 n 0001286474 00000 n 0001286614 00000 n 0001286697 00000 n 0001286837 00000 n 0001286919 00000 n 0001287059 00000 n 0001287142 00000 n 0001287282 00000 n 0001287365 00000 n 0001287505 00000 n 0001287588 00000 n 0001287728 00000 n 0001287811 00000 n 0001287951 00000 n 0001288033 00000 n 0001288173 00000 n 0001288257 00000 n 0001288397 00000 n 0001288480 00000 n 0001288620 00000 n 0001288703 00000 n 0001288843 00000 n 0001288925 00000 n 0001289065 00000 n 0001289148 00000 n 0001289288 00000 n 0001289369 00000 n 0001289509 00000 n 0001289590 00000 n 0001289729 00000 n 0001289812 00000 n 0001289950 00000 n 0001294134 00000 n 0001320228 00000 n 0001294157 00000 n 0001294240 00000 n 0001319306 00000 n 0001294376 00000 n 0001294459 00000 n 0001294597 00000 n 0001294678 00000 n 0001294816 00000 n 0001294896 00000 n 0001295034 00000 n 0001295115 00000 n 0001295253 00000 n 0001295335 00000 n 0001295471 00000 n 0001295554 00000 n 0001295692 00000 n 0001295775 00000 n 0001295913 00000 n 0001295995 00000 n 0001296133 00000 n 0001296215 00000 n 0001296353 00000 n 0001296433 00000 n 0001296571 00000 n 0001296655 00000 n 0001296793 00000 n 0001296874 00000 n 0001297012 00000 n 0001297095 00000 n 0001297233 00000 n 0001297316 00000 n 0001297454 00000 n 0001297537 00000 n 0001297675 00000 n 0001297758 00000 n 0001297896 00000 n 0001297979 00000 n 0001298117 00000 n 0001298201 00000 n 0001298339 00000 n 0001298423 00000 n 0001298561 00000 n 0001298644 00000 n 0001298782 00000 n 0001298866 00000 n 0001299004 00000 n 0001299088 00000 n 0001299226 00000 n 0001299310 00000 n 0001299448 00000 n 0001299532 00000 n 0001299670 00000 n 0001299753 00000 n 0001299889 00000 n 0001299973 00000 n 0001300111 00000 n 0001300194 00000 n 0001300334 00000 n 0001300418 00000 n 0001300558 00000 n 0001300642 00000 n 0001300780 00000 n 0001300864 00000 n 0001301004 00000 n 0001301088 00000 n 0001301228 00000 n 0001301312 00000 n 0001301452 00000 n 0001301536 00000 n 0001301676 00000 n 0001301760 00000 n 0001301900 00000 n 0001301984 00000 n 0001302124 00000 n 0001302208 00000 n 0001302348 00000 n 0001302430 00000 n 0001302570 00000 n 0001302652 00000 n 0001302792 00000 n 0001302874 00000 n 0001303014 00000 n 0001303096 00000 n 0001303236 00000 n 0001303318 00000 n 0001303458 00000 n 0001303541 00000 n 0001303681 00000 n 0001303765 00000 n 0001303905 00000 n 0001303989 00000 n 0001304129 00000 n 0001304213 00000 n 0001304353 00000 n 0001304437 00000 n 0001304577 00000 n 0001304660 00000 n 0001304800 00000 n 0001304883 00000 n 0001305023 00000 n 0001305106 00000 n 0001305246 00000 n 0001305329 00000 n 0001305468 00000 n 0001305552 00000 n 0001305690 00000 n 0001305773 00000 n 0001305911 00000 n 0001305994 00000 n 0001306132 00000 n 0001306215 00000 n 0001306353 00000 n 0001306434 00000 n 0001306572 00000 n 0001306654 00000 n 0001306792 00000 n 0001306874 00000 n 0001307012 00000 n 0001307094 00000 n 0001307232 00000 n 0001307315 00000 n 0001307453 00000 n 0001307536 00000 n 0001307674 00000 n 0001307756 00000 n 0001307894 00000 n 0001307975 00000 n 0001308113 00000 n 0001308193 00000 n 0001308331 00000 n 0001308414 00000 n 0001308552 00000 n 0001308635 00000 n 0001308773 00000 n 0001308855 00000 n 0001308991 00000 n 0001309074 00000 n 0001309212 00000 n 0001309293 00000 n 0001309429 00000 n 0001309512 00000 n 0001309650 00000 n 0001309732 00000 n 0001309870 00000 n 0001309953 00000 n 0001310089 00000 n 0001310172 00000 n 0001310310 00000 n 0001310391 00000 n 0001310529 00000 n 0001310612 00000 n 0001310750 00000 n 0001310832 00000 n 0001310968 00000 n 0001311051 00000 n 0001311189 00000 n 0001311270 00000 n 0001311408 00000 n 0001311491 00000 n 0001311629 00000 n 0001311710 00000 n 0001311848 00000 n 0001311931 00000 n 0001312067 00000 n 0001312149 00000 n 0001312285 00000 n 0001312368 00000 n 0001312506 00000 n 0001312588 00000 n 0001312726 00000 n 0001312809 00000 n 0001312947 00000 n 0001313030 00000 n 0001313168 00000 n 0001313251 00000 n 0001313389 00000 n 0001313472 00000 n 0001313610 00000 n 0001313692 00000 n 0001313830 00000 n 0001313912 00000 n 0001314050 00000 n 0001314133 00000 n 0001314271 00000 n 0001314354 00000 n 0001314492 00000 n 0001314573 00000 n 0001314711 00000 n 0001314794 00000 n 0001314932 00000 n 0001315014 00000 n 0001315152 00000 n 0001315235 00000 n 0001315373 00000 n 0001315454 00000 n 0001315592 00000 n 0001315675 00000 n 0001315810 00000 n 0001315893 00000 n 0001316029 00000 n 0001316112 00000 n 0001316248 00000 n 0001320444 00000 n 0001342643 00000 n 0001320467 00000 n 0001320550 00000 n 0001341865 00000 n 0001320688 00000 n 0001320772 00000 n 0001320910 00000 n 0001320992 00000 n 0001321130 00000 n 0001321214 00000 n 0001321352 00000 n 0001321435 00000 n 0001321573 00000 n 0001321656 00000 n 0001321794 00000 n 0001321876 00000 n 0001322014 00000 n 0001322098 00000 n 0001322236 00000 n 0001322319 00000 n 0001322457 00000 n 0001322541 00000 n 0001322679 00000 n 0001322762 00000 n 0001322900 00000 n 0001322982 00000 n 0001323120 00000 n 0001323203 00000 n 0001323339 00000 n 0001323423 00000 n 0001323561 00000 n 0001323642 00000 n 0001323780 00000 n 0001323861 00000 n 0001323999 00000 n 0001324080 00000 n 0001324218 00000 n 0001324300 00000 n 0001324436 00000 n 0001324520 00000 n 0001324656 00000 n 0001324740 00000 n 0001324878 00000 n 0001324961 00000 n 0001325099 00000 n 0001325183 00000 n 0001325321 00000 n 0001325403 00000 n 0001325541 00000 n 0001325624 00000 n 0001325762 00000 n 0001325845 00000 n 0001325981 00000 n 0001326065 00000 n 0001326203 00000 n 0001326286 00000 n 0001326424 00000 n 0001326507 00000 n 0001326645 00000 n 0001326726 00000 n 0001326864 00000 n 0001326947 00000 n 0001327085 00000 n 0001327168 00000 n 0001327306 00000 n 0001327390 00000 n 0001327526 00000 n 0001327610 00000 n 0001327748 00000 n 0001327832 00000 n 0001327970 00000 n 0001328054 00000 n 0001328192 00000 n 0001328275 00000 n 0001328413 00000 n 0001328495 00000 n 0001328633 00000 n 0001328717 00000 n 0001328855 00000 n 0001328939 00000 n 0001329077 00000 n 0001329160 00000 n 0001329295 00000 n 0001329379 00000 n 0001329515 00000 n 0001329599 00000 n 0001329735 00000 n 0001329818 00000 n 0001329956 00000 n 0001330039 00000 n 0001330177 00000 n 0001330260 00000 n 0001330398 00000 n 0001330481 00000 n 0001330619 00000 n 0001330702 00000 n 0001330840 00000 n 0001330924 00000 n 0001331062 00000 n 0001331145 00000 n 0001331283 00000 n 0001331366 00000 n 0001331504 00000 n 0001331587 00000 n 0001331725 00000 n 0001331809 00000 n 0001331947 00000 n 0001332029 00000 n 0001332167 00000 n 0001332249 00000 n 0001332387 00000 n 0001332469 00000 n 0001332607 00000 n 0001332688 00000 n 0001332826 00000 n 0001332909 00000 n 0001333047 00000 n 0001333130 00000 n 0001333268 00000 n 0001333349 00000 n 0001333487 00000 n 0001333569 00000 n 0001333707 00000 n 0001333791 00000 n 0001333929 00000 n 0001334013 00000 n 0001334151 00000 n 0001334234 00000 n 0001334370 00000 n 0001334453 00000 n 0001334589 00000 n 0001334671 00000 n 0001334809 00000 n 0001334892 00000 n 0001335028 00000 n 0001335111 00000 n 0001335249 00000 n 0001335333 00000 n 0001335471 00000 n 0001335554 00000 n 0001335692 00000 n 0001335776 00000 n 0001335914 00000 n 0001335996 00000 n 0001336134 00000 n 0001336216 00000 n 0001336354 00000 n 0001336437 00000 n 0001336575 00000 n 0001336659 00000 n 0001336795 00000 n 0001336878 00000 n 0001337016 00000 n 0001337099 00000 n 0001337237 00000 n 0001337319 00000 n 0001337457 00000 n 0001337540 00000 n 0001337678 00000 n 0001337762 00000 n 0001337900 00000 n 0001337983 00000 n 0001338121 00000 n 0001338203 00000 n 0001338341 00000 n 0001338424 00000 n 0001338562 00000 n 0001338645 00000 n 0001338783 00000 n 0001338865 00000 n 0001339001 00000 n 0001342859 00000 n 0001369219 00000 n 0001342882 00000 n 0001342965 00000 n 0001368297 00000 n 0001343105 00000 n 0001343188 00000 n 0001343328 00000 n 0001343412 00000 n 0001343552 00000 n 0001343635 00000 n 0001343775 00000 n 0001343858 00000 n 0001343996 00000 n 0001344080 00000 n 0001344220 00000 n 0001344304 00000 n 0001344444 00000 n 0001344527 00000 n 0001344667 00000 n 0001344748 00000 n 0001344888 00000 n 0001344971 00000 n 0001345111 00000 n 0001345195 00000 n 0001345335 00000 n 0001345418 00000 n 0001345558 00000 n 0001345641 00000 n 0001345781 00000 n 0001345864 00000 n 0001346002 00000 n 0001346083 00000 n 0001346223 00000 n 0001346307 00000 n 0001346447 00000 n 0001346530 00000 n 0001346670 00000 n 0001346753 00000 n 0001346893 00000 n 0001346977 00000 n 0001347117 00000 n 0001347200 00000 n 0001347340 00000 n 0001347423 00000 n 0001347563 00000 n 0001347646 00000 n 0001347786 00000 n 0001347869 00000 n 0001348009 00000 n 0001348092 00000 n 0001348232 00000 n 0001348314 00000 n 0001348454 00000 n 0001348537 00000 n 0001348677 00000 n 0001348760 00000 n 0001348900 00000 n 0001348984 00000 n 0001349124 00000 n 0001349206 00000 n 0001349346 00000 n 0001349429 00000 n 0001349569 00000 n 0001349652 00000 n 0001349792 00000 n 0001349875 00000 n 0001350013 00000 n 0001350096 00000 n 0001350236 00000 n 0001350318 00000 n 0001350458 00000 n 0001350539 00000 n 0001350679 00000 n 0001350762 00000 n 0001350902 00000 n 0001350984 00000 n 0001351124 00000 n 0001351207 00000 n 0001351347 00000 n 0001351429 00000 n 0001351569 00000 n 0001351651 00000 n 0001351791 00000 n 0001351874 00000 n 0001352014 00000 n 0001352098 00000 n 0001352236 00000 n 0001352319 00000 n 0001352457 00000 n 0001352540 00000 n 0001352680 00000 n 0001352763 00000 n 0001352903 00000 n 0001352986 00000 n 0001353126 00000 n 0001353209 00000 n 0001353347 00000 n 0001353431 00000 n 0001353568 00000 n 0001353650 00000 n 0001353788 00000 n 0001353870 00000 n 0001354008 00000 n 0001354090 00000 n 0001354228 00000 n 0001354311 00000 n 0001354449 00000 n 0001354532 00000 n 0001354670 00000 n 0001354754 00000 n 0001354892 00000 n 0001354975 00000 n 0001355113 00000 n 0001355195 00000 n 0001355333 00000 n 0001355417 00000 n 0001355555 00000 n 0001355639 00000 n 0001355777 00000 n 0001355859 00000 n 0001355997 00000 n 0001356078 00000 n 0001356216 00000 n 0001356299 00000 n 0001356437 00000 n 0001356519 00000 n 0001356657 00000 n 0001356740 00000 n 0001356878 00000 n 0001356962 00000 n 0001357098 00000 n 0001357182 00000 n 0001357320 00000 n 0001357403 00000 n 0001357541 00000 n 0001357624 00000 n 0001357760 00000 n 0001357843 00000 n 0001357981 00000 n 0001358063 00000 n 0001358201 00000 n 0001358283 00000 n 0001358421 00000 n 0001358503 00000 n 0001358639 00000 n 0001358720 00000 n 0001358856 00000 n 0001358940 00000 n 0001359078 00000 n 0001359162 00000 n 0001359300 00000 n 0001359384 00000 n 0001359522 00000 n 0001359606 00000 n 0001359744 00000 n 0001359826 00000 n 0001359962 00000 n 0001360046 00000 n 0001360184 00000 n 0001360268 00000 n 0001360406 00000 n 0001360487 00000 n 0001360625 00000 n 0001360707 00000 n 0001360845 00000 n 0001360927 00000 n 0001361065 00000 n 0001361149 00000 n 0001361287 00000 n 0001361371 00000 n 0001361509 00000 n 0001361591 00000 n 0001361729 00000 n 0001361813 00000 n 0001361951 00000 n 0001362034 00000 n 0001362172 00000 n 0001362256 00000 n 0001362396 00000 n 0001362480 00000 n 0001362618 00000 n 0001362702 00000 n 0001362840 00000 n 0001362923 00000 n 0001363061 00000 n 0001363143 00000 n 0001363281 00000 n 0001363364 00000 n 0001363502 00000 n 0001363585 00000 n 0001363723 00000 n 0001363807 00000 n 0001363945 00000 n 0001364028 00000 n 0001364166 00000 n 0001364249 00000 n 0001364387 00000 n 0001364470 00000 n 0001364607 00000 n 0001364691 00000 n 0001364827 00000 n 0001364911 00000 n 0001365047 00000 n 0001369435 00000 n 0001397080 00000 n 0001369458 00000 n 0001369542 00000 n 0001396104 00000 n 0001369680 00000 n 0001369762 00000 n 0001369900 00000 n 0001369982 00000 n 0001370120 00000 n 0001370202 00000 n 0001370338 00000 n 0001370420 00000 n 0001370558 00000 n 0001370640 00000 n 0001370778 00000 n 0001370862 00000 n 0001371000 00000 n 0001371084 00000 n 0001371222 00000 n 0001371304 00000 n 0001371442 00000 n 0001371526 00000 n 0001371664 00000 n 0001371745 00000 n 0001371883 00000 n 0001371964 00000 n 0001372102 00000 n 0001372185 00000 n 0001372321 00000 n 0001372402 00000 n 0001372538 00000 n 0001372620 00000 n 0001372756 00000 n 0001372838 00000 n 0001372976 00000 n 0001373059 00000 n 0001373197 00000 n 0001373281 00000 n 0001373419 00000 n 0001373502 00000 n 0001373640 00000 n 0001373723 00000 n 0001373861 00000 n 0001373944 00000 n 0001374082 00000 n 0001374165 00000 n 0001374303 00000 n 0001374384 00000 n 0001374522 00000 n 0001374605 00000 n 0001374743 00000 n 0001374826 00000 n 0001374964 00000 n 0001375047 00000 n 0001375185 00000 n 0001375268 00000 n 0001375404 00000 n 0001375485 00000 n 0001375623 00000 n 0001375706 00000 n 0001375842 00000 n 0001375924 00000 n 0001376060 00000 n 0001376143 00000 n 0001376281 00000 n 0001376362 00000 n 0001376500 00000 n 0001376584 00000 n 0001376722 00000 n 0001376805 00000 n 0001376941 00000 n 0001377023 00000 n 0001377161 00000 n 0001377243 00000 n 0001377381 00000 n 0001377465 00000 n 0001377603 00000 n 0001377685 00000 n 0001377823 00000 n 0001377907 00000 n 0001378043 00000 n 0001378127 00000 n 0001378265 00000 n 0001378348 00000 n 0001378486 00000 n 0001378569 00000 n 0001378707 00000 n 0001378790 00000 n 0001378928 00000 n 0001379010 00000 n 0001379148 00000 n 0001379231 00000 n 0001379369 00000 n 0001379452 00000 n 0001379590 00000 n 0001379673 00000 n 0001379811 00000 n 0001379894 00000 n 0001380032 00000 n 0001380115 00000 n 0001380253 00000 n 0001380336 00000 n 0001380474 00000 n 0001380555 00000 n 0001380691 00000 n 0001380773 00000 n 0001380911 00000 n 0001380993 00000 n 0001381130 00000 n 0001381211 00000 n 0001381347 00000 n 0001381429 00000 n 0001381565 00000 n 0001381649 00000 n 0001381787 00000 n 0001381870 00000 n 0001382008 00000 n 0001382092 00000 n 0001382230 00000 n 0001382313 00000 n 0001382451 00000 n 0001382533 00000 n 0001382671 00000 n 0001382753 00000 n 0001382891 00000 n 0001382975 00000 n 0001383113 00000 n 0001383197 00000 n 0001383335 00000 n 0001383419 00000 n 0001383557 00000 n 0001383641 00000 n 0001383779 00000 n 0001383862 00000 n 0001384000 00000 n 0001384084 00000 n 0001384222 00000 n 0001384306 00000 n 0001384444 00000 n 0001384528 00000 n 0001384666 00000 n 0001384750 00000 n 0001384888 00000 n 0001384971 00000 n 0001385109 00000 n 0001385193 00000 n 0001385331 00000 n 0001385415 00000 n 0001385553 00000 n 0001385636 00000 n 0001385774 00000 n 0001385855 00000 n 0001385993 00000 n 0001386074 00000 n 0001386212 00000 n 0001386293 00000 n 0001386431 00000 n 0001386512 00000 n 0001386650 00000 n 0001386731 00000 n 0001386869 00000 n 0001386953 00000 n 0001387091 00000 n 0001387172 00000 n 0001387310 00000 n 0001387391 00000 n 0001387529 00000 n 0001387612 00000 n 0001387750 00000 n 0001387832 00000 n 0001387968 00000 n 0001388051 00000 n 0001388191 00000 n 0001388274 00000 n 0001388414 00000 n 0001388497 00000 n 0001388637 00000 n 0001388720 00000 n 0001388860 00000 n 0001388942 00000 n 0001389082 00000 n 0001389165 00000 n 0001389305 00000 n 0001389387 00000 n 0001389527 00000 n 0001389611 00000 n 0001389751 00000 n 0001389832 00000 n 0001389972 00000 n 0001390056 00000 n 0001390196 00000 n 0001390280 00000 n 0001390420 00000 n 0001390504 00000 n 0001390644 00000 n 0001390726 00000 n 0001390866 00000 n 0001390950 00000 n 0001391090 00000 n 0001391174 00000 n 0001391314 00000 n 0001391398 00000 n 0001391536 00000 n 0001391620 00000 n 0001391760 00000 n 0001391844 00000 n 0001391984 00000 n 0001392065 00000 n 0001392205 00000 n 0001392287 00000 n 0001392427 00000 n 0001392510 00000 n 0001392649 00000 n 0001392732 00000 n 0001392870 00000 n 0001397296 00000 n 0001407356 00000 n 0001397319 00000 n 0001397402 00000 n 0001407001 00000 n 0001397540 00000 n 0001397623 00000 n 0001397761 00000 n 0001397843 00000 n 0001397981 00000 n 0001398064 00000 n 0001398202 00000 n 0001398286 00000 n 0001398424 00000 n 0001398505 00000 n 0001398643 00000 n 0001398726 00000 n 0001398864 00000 n 0001398948 00000 n 0001399086 00000 n 0001399168 00000 n 0001399306 00000 n 0001399389 00000 n 0001399525 00000 n 0001399608 00000 n 0001399746 00000 n 0001399828 00000 n 0001399966 00000 n 0001400048 00000 n 0001400186 00000 n 0001400269 00000 n 0001400409 00000 n 0001400490 00000 n 0001400630 00000 n 0001400713 00000 n 0001400853 00000 n 0001400993 00000 n 0001401076 00000 n 0001401216 00000 n 0001401298 00000 n 0001401436 00000 n 0001401519 00000 n 0001401659 00000 n 0001401742 00000 n 0001401882 00000 n 0001401964 00000 n 0001402104 00000 n 0001402186 00000 n 0001402326 00000 n 0001402409 00000 n 0001402549 00000 n 0001402633 00000 n 0001402773 00000 n 0001402857 00000 n 0001402997 00000 n 0001403080 00000 n 0001403220 00000 n 0001403302 00000 n 0001403442 00000 n 0001403524 00000 n 0001403664 00000 n 0001403747 00000 n 0001403887 00000 n 0001403970 00000 n 0001404110 00000 n 0001404192 00000 n 0001404332 00000 n 0001404415 00000 n 0001404555 00000 n 0001404637 00000 n 0001404777 00000 n 0001404859 00000 n 0001404999 00000 n 0001405083 00000 n 0001405223 00000 n 0001405305 00000 n 0001405445 00000 n 0001407572 00000 n 0001425120 00000 n 0001407595 00000 n 0001424234 00000 n 0001407733 00000 n 0001407871 00000 n 0001407953 00000 n 0001408088 00000 n 0001408224 00000 n 0001408362 00000 n 0001408500 00000 n 0001408638 00000 n 0001408776 00000 n 0001408914 00000 n 0001409052 00000 n 0001409188 00000 n 0001409326 00000 n 0001409464 00000 n 0001409602 00000 n 0001409740 00000 n 0001409878 00000 n 0001410016 00000 n 0001410154 00000 n 0001410292 00000 n 0001410430 00000 n 0001410568 00000 n 0001410706 00000 n 0001410844 00000 n 0001410982 00000 n 0001411120 00000 n 0001411204 00000 n 0001411339 00000 n 0001411477 00000 n 0001411615 00000 n 0001411753 00000 n 0001411891 00000 n 0001412027 00000 n 0001412163 00000 n 0001412301 00000 n 0001412439 00000 n 0001412523 00000 n 0001412661 00000 n 0001412799 00000 n 0001412937 00000 n 0001413075 00000 n 0001413213 00000 n 0001413351 00000 n 0001413487 00000 n 0001413625 00000 n 0001413762 00000 n 0001413898 00000 n 0001414034 00000 n 0001414172 00000 n 0001414310 00000 n 0001414448 00000 n 0001414586 00000 n 0001414724 00000 n 0001414864 00000 n 0001415004 00000 n 0001415144 00000 n 0001415284 00000 n 0001415424 00000 n 0001415564 00000 n 0001415704 00000 n 0001415844 00000 n 0001415984 00000 n 0001416124 00000 n 0001416262 00000 n 0001416402 00000 n 0001416542 00000 n 0001416682 00000 n 0001416822 00000 n 0001416962 00000 n 0001417102 00000 n 0001417242 00000 n 0001417382 00000 n 0001417522 00000 n 0001417660 00000 n 0001417800 00000 n 0001417940 00000 n 0001418080 00000 n 0001418220 00000 n 0001418360 00000 n 0001418500 00000 n 0001418640 00000 n 0001418780 00000 n 0001418920 00000 n 0001419060 00000 n 0001419200 00000 n 0001419340 00000 n 0001419480 00000 n 0001419620 00000 n 0001419760 00000 n 0001419900 00000 n 0001420040 00000 n 0001420180 00000 n 0001420320 00000 n 0001420460 00000 n 0001420600 00000 n 0001420740 00000 n 0001420880 00000 n 0001421019 00000 n 0001421157 00000 n 0001425336 00000 n 0001450107 00000 n 0001425359 00000 n 0001425443 00000 n 0001449473 00000 n 0001425581 00000 n 0001425721 00000 n 0001425805 00000 n 0001425943 00000 n 0001426083 00000 n 0001426166 00000 n 0001426303 00000 n 0001426442 00000 n 0001426524 00000 n 0001426662 00000 n 0001426802 00000 n 0001426884 00000 n 0001427022 00000 n 0001427162 00000 n 0001427246 00000 n 0001427383 00000 n 0001427522 00000 n 0001427604 00000 n 0001427740 00000 n 0001427880 00000 n 0001427964 00000 n 0001428102 00000 n 0001428241 00000 n 0001428325 00000 n 0001428463 00000 n 0001428602 00000 n 0001428686 00000 n 0001428824 00000 n 0001428964 00000 n 0001429101 00000 n 0001429241 00000 n 0001429323 00000 n 0001429459 00000 n 0001429598 00000 n 0001429680 00000 n 0001429817 00000 n 0001429957 00000 n 0001430039 00000 n 0001430175 00000 n 0001430315 00000 n 0001430452 00000 n 0001430592 00000 n 0001430674 00000 n 0001430810 00000 n 0001430950 00000 n 0001431034 00000 n 0001431171 00000 n 0001431311 00000 n 0001431395 00000 n 0001431533 00000 n 0001431673 00000 n 0001431757 00000 n 0001431895 00000 n 0001432035 00000 n 0001432117 00000 n 0001432255 00000 n 0001432394 00000 n 0001432478 00000 n 0001432614 00000 n 0001432754 00000 n 0001432837 00000 n 0001432975 00000 n 0001433115 00000 n 0001433199 00000 n 0001433336 00000 n 0001433476 00000 n 0001433560 00000 n 0001433698 00000 n 0001433838 00000 n 0001433922 00000 n 0001434059 00000 n 0001434199 00000 n 0001434281 00000 n 0001434418 00000 n 0001434558 00000 n 0001434642 00000 n 0001434779 00000 n 0001434919 00000 n 0001435001 00000 n 0001435138 00000 n 0001435278 00000 n 0001435360 00000 n 0001435497 00000 n 0001435636 00000 n 0001435718 00000 n 0001435855 00000 n 0001435995 00000 n 0001436077 00000 n 0001436214 00000 n 0001436354 00000 n 0001436436 00000 n 0001436573 00000 n 0001436713 00000 n 0001436795 00000 n 0001436931 00000 n 0001437071 00000 n 0001437153 00000 n 0001437290 00000 n 0001437430 00000 n 0001450323 00000 n 0001468130 00000 n 0001450347 00000 n 0001467208 00000 n 0001450485 00000 n 0001450623 00000 n 0001450761 00000 n 0001450897 00000 n 0001451035 00000 n 0001451173 00000 n 0001451311 00000 n 0001451449 00000 n 0001451585 00000 n 0001451723 00000 n 0001451861 00000 n 0001451999 00000 n 0001452137 00000 n 0001452275 00000 n 0001452413 00000 n 0001452551 00000 n 0001452689 00000 n 0001452827 00000 n 0001452965 00000 n 0001453103 00000 n 0001453241 00000 n 0001453379 00000 n 0001453517 00000 n 0001453655 00000 n 0001453793 00000 n 0001453931 00000 n 0001454069 00000 n 0001454207 00000 n 0001454343 00000 n 0001454481 00000 n 0001454621 00000 n 0001454761 00000 n 0001454899 00000 n 0001455039 00000 n 0001455179 00000 n 0001455319 00000 n 0001455459 00000 n 0001455599 00000 n 0001455739 00000 n 0001455879 00000 n 0001456019 00000 n 0001456159 00000 n 0001456299 00000 n 0001456439 00000 n 0001456579 00000 n 0001456719 00000 n 0001456859 00000 n 0001456999 00000 n 0001457139 00000 n 0001457279 00000 n 0001457418 00000 n 0001457556 00000 n 0001457694 00000 n 0001457832 00000 n 0001457970 00000 n 0001458108 00000 n 0001458246 00000 n 0001458384 00000 n 0001458522 00000 n 0001458660 00000 n 0001458798 00000 n 0001458936 00000 n 0001459074 00000 n 0001459212 00000 n 0001459350 00000 n 0001459488 00000 n 0001459626 00000 n 0001459764 00000 n 0001459902 00000 n 0001460038 00000 n 0001460176 00000 n 0001460312 00000 n 0001460450 00000 n 0001460588 00000 n 0001460724 00000 n 0001460862 00000 n 0001461000 00000 n 0001461138 00000 n 0001461274 00000 n 0001461412 00000 n 0001461550 00000 n 0001461688 00000 n 0001461826 00000 n 0001461962 00000 n 0001462098 00000 n 0001462236 00000 n 0001462374 00000 n 0001462512 00000 n 0001462650 00000 n 0001462788 00000 n 0001462926 00000 n 0001463064 00000 n 0001463202 00000 n 0001463340 00000 n 0001463478 00000 n 0001463616 00000 n 0001463754 00000 n 0001463892 00000 n 0001464030 00000 n 0001464166 00000 n 0001468346 00000 n 0001484396 00000 n 0001468369 00000 n 0001483582 00000 n 0001468505 00000 n 0001468643 00000 n 0001468781 00000 n 0001468919 00000 n 0001469057 00000 n 0001469195 00000 n 0001469333 00000 n 0001469471 00000 n 0001469609 00000 n 0001469747 00000 n 0001469885 00000 n 0001470023 00000 n 0001470161 00000 n 0001470299 00000 n 0001470437 00000 n 0001470575 00000 n 0001470658 00000 n 0001470796 00000 n 0001470932 00000 n 0001471070 00000 n 0001471208 00000 n 0001471346 00000 n 0001471484 00000 n 0001471620 00000 n 0001471756 00000 n 0001471894 00000 n 0001472032 00000 n 0001472170 00000 n 0001472308 00000 n 0001472446 00000 n 0001472582 00000 n 0001472720 00000 n 0001472858 00000 n 0001472996 00000 n 0001473134 00000 n 0001473272 00000 n 0001473410 00000 n 0001473546 00000 n 0001473684 00000 n 0001473822 00000 n 0001473960 00000 n 0001474097 00000 n 0001474233 00000 n 0001474369 00000 n 0001474507 00000 n 0001474643 00000 n 0001474781 00000 n 0001474919 00000 n 0001475057 00000 n 0001475195 00000 n 0001475333 00000 n 0001475471 00000 n 0001475609 00000 n 0001475747 00000 n 0001475885 00000 n 0001476023 00000 n 0001476107 00000 n 0001476245 00000 n 0001476383 00000 n 0001476521 00000 n 0001476659 00000 n 0001476797 00000 n 0001476935 00000 n 0001477073 00000 n 0001477211 00000 n 0001477349 00000 n 0001477487 00000 n 0001477625 00000 n 0001477763 00000 n 0001477901 00000 n 0001478037 00000 n 0001478173 00000 n 0001478311 00000 n 0001478447 00000 n 0001478585 00000 n 0001478723 00000 n 0001478861 00000 n 0001478999 00000 n 0001479137 00000 n 0001479275 00000 n 0001479413 00000 n 0001479549 00000 n 0001479687 00000 n 0001479825 00000 n 0001479963 00000 n 0001480101 00000 n 0001480239 00000 n 0001480376 00000 n 0001480512 00000 n 0001480648 00000 n 0001484612 00000 n 0001502567 00000 n 0001484635 00000 n 0001501654 00000 n 0001484773 00000 n 0001484911 00000 n 0001485049 00000 n 0001485187 00000 n 0001485325 00000 n 0001485463 00000 n 0001485599 00000 n 0001485737 00000 n 0001485875 00000 n 0001486013 00000 n 0001486151 00000 n 0001486289 00000 n 0001486427 00000 n 0001486565 00000 n 0001486703 00000 n 0001486839 00000 n 0001486977 00000 n 0001487115 00000 n 0001487253 00000 n 0001487391 00000 n 0001487529 00000 n 0001487667 00000 n 0001487805 00000 n 0001487943 00000 n 0001488081 00000 n 0001488219 00000 n 0001488357 00000 n 0001488495 00000 n 0001488633 00000 n 0001488771 00000 n 0001488909 00000 n 0001489047 00000 n 0001489185 00000 n 0001489321 00000 n 0001489459 00000 n 0001489597 00000 n 0001489735 00000 n 0001489873 00000 n 0001490011 00000 n 0001490149 00000 n 0001490287 00000 n 0001490425 00000 n 0001490563 00000 n 0001490699 00000 n 0001490835 00000 n 0001490971 00000 n 0001491107 00000 n 0001491245 00000 n 0001491381 00000 n 0001491517 00000 n 0001491655 00000 n 0001491793 00000 n 0001491931 00000 n 0001492015 00000 n 0001492153 00000 n 0001492237 00000 n 0001492375 00000 n 0001492513 00000 n 0001492651 00000 n 0001492789 00000 n 0001492927 00000 n 0001493065 00000 n 0001493203 00000 n 0001493341 00000 n 0001493479 00000 n 0001493617 00000 n 0001493755 00000 n 0001493893 00000 n 0001494031 00000 n 0001494169 00000 n 0001494305 00000 n 0001494443 00000 n 0001494581 00000 n 0001494717 00000 n 0001494855 00000 n 0001494993 00000 n 0001495131 00000 n 0001495267 00000 n 0001495403 00000 n 0001495541 00000 n 0001495679 00000 n 0001495817 00000 n 0001495955 00000 n 0001496091 00000 n 0001496229 00000 n 0001496367 00000 n 0001496505 00000 n 0001496643 00000 n 0001496781 00000 n 0001496919 00000 n 0001497057 00000 n 0001497195 00000 n 0001497333 00000 n 0001497471 00000 n 0001497611 00000 n 0001497749 00000 n 0001497887 00000 n 0001498025 00000 n 0001498163 00000 n 0001498300 00000 n 0001498436 00000 n 0001502783 00000 n 0001521662 00000 n 0001502806 00000 n 0001520686 00000 n 0001502944 00000 n 0001503082 00000 n 0001503220 00000 n 0001503358 00000 n 0001503496 00000 n 0001503634 00000 n 0001503772 00000 n 0001503910 00000 n 0001504048 00000 n 0001504184 00000 n 0001504322 00000 n 0001504460 00000 n 0001504598 00000 n 0001504736 00000 n 0001504874 00000 n 0001505012 00000 n 0001505150 00000 n 0001505288 00000 n 0001505424 00000 n 0001505560 00000 n 0001505696 00000 n 0001505834 00000 n 0001505972 00000 n 0001506110 00000 n 0001506248 00000 n 0001506386 00000 n 0001506524 00000 n 0001506662 00000 n 0001506800 00000 n 0001506938 00000 n 0001507076 00000 n 0001507214 00000 n 0001507350 00000 n 0001507488 00000 n 0001507624 00000 n 0001507760 00000 n 0001507898 00000 n 0001508036 00000 n 0001508174 00000 n 0001508310 00000 n 0001508448 00000 n 0001508586 00000 n 0001508724 00000 n 0001508862 00000 n 0001508998 00000 n 0001509136 00000 n 0001509274 00000 n 0001509412 00000 n 0001509550 00000 n 0001509688 00000 n 0001509826 00000 n 0001509964 00000 n 0001510101 00000 n 0001510237 00000 n 0001510373 00000 n 0001510511 00000 n 0001510647 00000 n 0001510785 00000 n 0001510923 00000 n 0001511061 00000 n 0001511199 00000 n 0001511337 00000 n 0001511475 00000 n 0001511613 00000 n 0001511751 00000 n 0001511889 00000 n 0001512027 00000 n 0001512165 00000 n 0001512303 00000 n 0001512441 00000 n 0001512579 00000 n 0001512717 00000 n 0001512855 00000 n 0001512993 00000 n 0001513131 00000 n 0001513269 00000 n 0001513407 00000 n 0001513545 00000 n 0001513683 00000 n 0001513821 00000 n 0001513959 00000 n 0001514097 00000 n 0001514235 00000 n 0001514373 00000 n 0001514511 00000 n 0001514649 00000 n 0001514787 00000 n 0001514925 00000 n 0001515063 00000 n 0001515199 00000 n 0001515339 00000 n 0001515479 00000 n 0001515619 00000 n 0001515759 00000 n 0001515899 00000 n 0001516039 00000 n 0001516179 00000 n 0001516319 00000 n 0001516459 00000 n 0001516599 00000 n 0001516739 00000 n 0001516879 00000 n 0001517019 00000 n 0001517159 00000 n 0001517298 00000 n 0001517434 00000 n 0001521878 00000 n 0001530269 00000 n 0001521901 00000 n 0001529851 00000 n 0001522039 00000 n 0001522177 00000 n 0001522315 00000 n 0001522453 00000 n 0001522591 00000 n 0001522729 00000 n 0001522867 00000 n 0001523005 00000 n 0001523143 00000 n 0001523281 00000 n 0001523419 00000 n 0001523557 00000 n 0001523695 00000 n 0001523833 00000 n 0001523971 00000 n 0001524107 00000 n 0001524245 00000 n 0001524383 00000 n 0001524521 00000 n 0001524661 00000 n 0001524801 00000 n 0001524941 00000 n 0001525081 00000 n 0001525221 00000 n 0001525359 00000 n 0001525499 00000 n 0001525639 00000 n 0001525722 00000 n 0001525862 00000 n 0001526002 00000 n 0001526142 00000 n 0001526282 00000 n 0001526422 00000 n 0001526562 00000 n 0001526702 00000 n 0001526842 00000 n 0001526982 00000 n 0001527122 00000 n 0001527262 00000 n 0001527402 00000 n 0001527542 00000 n 0001527682 00000 n 0001527822 00000 n 0001527962 00000 n 0001528100 00000 n 0001530485 00000 n 0001530508 00000 n 0001530587 00000 n 0001530670 00000 n 0001530754 00000 n 0001530838 00000 n 0001530922 00000 n 0001531004 00000 n 0001531086 00000 n 0001531170 00000 n 0001531252 00000 n 0001633240 00000 n 0001531334 00000 n 0001531434 00000 n 0001531515 00000 n 0001531629 00000 n 0001531776 00000 n 0001531875 00000 n 0001532168 00000 n 0001532262 00000 n 0001532387 00000 n 0001532502 00000 n 0001532636 00000 n 0001532788 00000 n 0001532888 00000 n 0001533004 00000 n 0001533121 00000 n 0001533248 00000 n 0001533367 00000 n 0001533471 00000 n 0001533585 00000 n 0001533701 00000 n 0001533804 00000 n 0001534041 00000 n 0001534138 00000 n 0001534297 00000 n 0001534393 00000 n 0001534506 00000 n 0001534594 00000 n 0001534715 00000 n 0001534880 00000 n 0001534973 00000 n 0001535081 00000 n 0001535199 00000 n 0001535314 00000 n 0001535426 00000 n 0001535558 00000 n 0001535670 00000 n 0001535780 00000 n 0001535890 00000 n 0001536036 00000 n 0001536132 00000 n 0001536243 00000 n 0001536339 00000 n 0001536458 00000 n 0001536615 00000 n 0001536717 00000 n 0001536835 00000 n 0001536953 00000 n 0001537242 00000 n 0001537330 00000 n 0001537502 00000 n 0001537600 00000 n 0001537713 00000 n 0001537807 00000 n 0001537983 00000 n 0001538080 00000 n 0001538217 00000 n 0001538335 00000 n 0001538465 00000 n 0001538565 00000 n 0001538691 00000 n 0001538813 00000 n 0001538938 00000 n 0001539034 00000 n 0001539156 00000 n 0001539457 00000 n 0001539545 00000 n 0001539712 00000 n 0001539812 00000 n 0001539922 00000 n 0001540028 00000 n 0001540138 00000 n 0001540241 00000 n 0001540353 00000 n 0001540455 00000 n 0001540556 00000 n 0001540663 00000 n 0001540769 00000 n 0001540873 00000 n 0001540977 00000 n 0001541064 00000 n 0001541254 00000 n 0001541364 00000 n 0001541476 00000 n 0001541590 00000 n 0001541701 00000 n 0001541811 00000 n 0001541925 00000 n 0001542051 00000 n 0001542179 00000 n 0001542291 00000 n 0001542403 00000 n 0001542516 00000 n 0001542635 00000 n 0001542743 00000 n 0001542889 00000 n 0001543018 00000 n 0001543141 00000 n 0001543262 00000 n 0001543374 00000 n 0001543491 00000 n 0001543606 00000 n 0001543724 00000 n 0001543866 00000 n 0001543952 00000 n 0001544185 00000 n 0001544273 00000 n 0001544431 00000 n 0001544531 00000 n 0001544649 00000 n 0001544782 00000 n 0001544891 00000 n 0001544996 00000 n 0001545107 00000 n 0001545230 00000 n 0001545322 00000 n 0001545566 00000 n 0001545654 00000 n 0001545827 00000 n 0001545931 00000 n 0001546050 00000 n 0001546143 00000 n 0001546270 00000 n 0001546547 00000 n 0001546635 00000 n 0001546799 00000 n 0001546895 00000 n 0001547001 00000 n 0001547109 00000 n 0001547216 00000 n 0001547323 00000 n 0001547429 00000 n 0001547538 00000 n 0001547649 00000 n 0001547776 00000 n 0001547895 00000 n 0001548011 00000 n 0001548109 00000 n 0001548264 00000 n 0001548352 00000 n 0001548464 00000 n 0001548576 00000 n 0001548682 00000 n 0001548797 00000 n 0001548898 00000 n 0001549061 00000 n 0001549157 00000 n 0001549258 00000 n 0001549362 00000 n 0001549477 00000 n 0001549589 00000 n 0001549698 00000 n 0001549806 00000 n 0001549911 00000 n 0001550017 00000 n 0001550129 00000 n 0001550231 00000 n 0001550346 00000 n 0001550453 00000 n 0001550563 00000 n 0001550692 00000 n 0001550804 00000 n 0001550908 00000 n 0001550995 00000 n 0001551157 00000 n 0001551254 00000 n 0001551369 00000 n 0001551482 00000 n 0001551595 00000 n 0001551691 00000 n 0001551793 00000 n 0001552062 00000 n 0001552205 00000 n 0001552293 00000 n 0001552464 00000 n 0001552573 00000 n 0001552688 00000 n 0001552803 00000 n 0001552915 00000 n 0001553021 00000 n 0001553125 00000 n 0001553230 00000 n 0001553347 00000 n 0001553473 00000 n 0001553587 00000 n 0001553703 00000 n 0001553822 00000 n 0001553941 00000 n 0001554054 00000 n 0001554169 00000 n 0001554284 00000 n 0001554401 00000 n 0001554528 00000 n 0001554627 00000 n 0001554802 00000 n 0001554895 00000 n 0001555016 00000 n 0001555132 00000 n 0001555243 00000 n 0001555350 00000 n 0001555507 00000 n 0001555621 00000 n 0001555745 00000 n 0001555850 00000 n 0001556072 00000 n 0001556205 00000 n 0001556301 00000 n 0001556412 00000 n 0001556512 00000 n 0001556671 00000 n 0001556765 00000 n 0001556873 00000 n 0001556989 00000 n 0001557104 00000 n 0001557218 00000 n 0001557336 00000 n 0001557439 00000 n 0001557536 00000 n 0001557802 00000 n 0001557891 00000 n 0001558022 00000 n 0001558136 00000 n 0001558309 00000 n 0001558424 00000 n 0001558561 00000 n 0001558703 00000 n 0001558833 00000 n 0001558955 00000 n 0001559067 00000 n 0001559181 00000 n 0001559278 00000 n 0001559540 00000 n 0001559693 00000 n 0001559791 00000 n 0001559894 00000 n 0001560004 00000 n 0001560119 00000 n 0001560218 00000 n 0001560392 00000 n 0001560502 00000 n 0001560671 00000 n 0001560773 00000 n 0001560892 00000 n 0001561006 00000 n 0001561105 00000 n 0001561265 00000 n 0001561390 00000 n 0001561507 00000 n 0001561611 00000 n 0001561782 00000 n 0001561898 00000 n 0001562030 00000 n 0001562152 00000 n 0001562270 00000 n 0001562378 00000 n 0001562536 00000 n 0001562634 00000 n 0001562737 00000 n 0001562908 00000 n 0001563013 00000 n 0001563129 00000 n 0001563248 00000 n 0001563371 00000 n 0001563488 00000 n 0001563602 00000 n 0001563720 00000 n 0001563855 00000 n 0001563953 00000 n 0001564067 00000 n 0001564188 00000 n 0001564322 00000 n 0001564426 00000 n 0001564659 00000 n 0001564754 00000 n 0001564878 00000 n 0001564996 00000 n 0001565189 00000 n 0001565296 00000 n 0001565423 00000 n 0001565555 00000 n 0001565652 00000 n 0001565750 00000 n 0001566088 00000 n 0001566222 00000 n 0001566318 00000 n 0001566435 00000 n 0001566537 00000 n 0001566666 00000 n 0001566802 00000 n 0001566949 00000 n 0001567092 00000 n 0001567247 00000 n 0001567340 00000 n 0001567512 00000 n 0001567604 00000 n 0001567714 00000 n 0001567815 00000 n 0001567985 00000 n 0001568080 00000 n 0001568179 00000 n 0001568305 00000 n 0001568408 00000 n 0001568666 00000 n 0001568754 00000 n 0001568863 00000 n 0001569041 00000 n 0001569161 00000 n 0001569284 00000 n 0001569389 00000 n 0001569563 00000 n 0001569677 00000 n 0001569801 00000 n 0001569913 00000 n 0001570003 00000 n 0001570261 00000 n 0001570405 00000 n 0001570509 00000 n 0001570634 00000 n 0001570769 00000 n 0001570894 00000 n 0001571020 00000 n 0001571133 00000 n 0001571224 00000 n 0001571350 00000 n 0001571521 00000 n 0001571637 00000 n 0001571776 00000 n 0001571914 00000 n 0001572064 00000 n 0001572203 00000 n 0001572333 00000 n 0001572451 00000 n 0001572548 00000 n 0001572708 00000 n 0001572818 00000 n 0001572934 00000 n 0001573060 00000 n 0001573230 00000 n 0001573331 00000 n 0001573510 00000 n 0001573617 00000 n 0001573758 00000 n 0001573862 00000 n 0001574123 00000 n 0001574233 00000 n 0001574385 00000 n 0001574491 00000 n 0001574773 00000 n 0001574861 00000 n 0001575022 00000 n 0001575138 00000 n 0001575280 00000 n 0001575417 00000 n 0001575521 00000 n 0001575622 00000 n 0001575787 00000 n 0001575881 00000 n 0001576002 00000 n 0001576106 00000 n 0001576230 00000 n 0001576346 00000 n 0001576449 00000 n 0001576738 00000 n 0001576843 00000 n 0001576989 00000 n 0001577119 00000 n 0001577344 00000 n 0001577450 00000 n 0001577544 00000 n 0001577656 00000 n 0001577765 00000 n 0001577876 00000 n 0001577997 00000 n 0001578111 00000 n 0001578218 00000 n 0001578330 00000 n 0001578440 00000 n 0001578519 00000 n 0001578599 00000 n 0001578679 00000 n 0001578759 00000 n 0001578839 00000 n 0001578951 00000 n 0001579084 00000 n 0001579217 00000 n 0001579311 00000 n 0001579408 00000 n 0001579511 00000 n 0001579629 00000 n 0001579735 00000 n 0001579854 00000 n 0001579976 00000 n 0001580107 00000 n 0001580226 00000 n 0001580354 00000 n 0001580476 00000 n 0001580601 00000 n 0001580699 00000 n 0001580842 00000 n 0001580964 00000 n 0001581092 00000 n 0001581193 00000 n 0001581306 00000 n 0001581410 00000 n 0001581511 00000 n 0001581621 00000 n 0001581725 00000 n 0001581829 00000 n 0001581936 00000 n 0001582046 00000 n 0001582168 00000 n 0001582263 00000 n 0001582361 00000 n 0001582447 00000 n 0001582535 00000 n 0001582648 00000 n 0001582746 00000 n 0001582898 00000 n 0001583026 00000 n 0001583132 00000 n 0001583253 00000 n 0001583392 00000 n 0001583531 00000 n 0001583646 00000 n 0001583768 00000 n 0001583893 00000 n 0001584023 00000 n 0001584145 00000 n 0001584263 00000 n 0001584405 00000 n 0001584529 00000 n 0001584671 00000 n 0001584810 00000 n 0001584952 00000 n 0001585097 00000 n 0001585242 00000 n 0001585363 00000 n 0001585475 00000 n 0001585593 00000 n 0001585720 00000 n 0001585829 00000 n 0001585926 00000 n 0001586045 00000 n 0001586136 00000 n 0001586233 00000 n 0001586369 00000 n 0001586466 00000 n 0001586569 00000 n 0001586690 00000 n 0001586820 00000 n 0001586920 00000 n 0001587035 00000 n 0001587129 00000 n 0001587244 00000 n 0001587359 00000 n 0001587492 00000 n 0001587589 00000 n 0001587707 00000 n 0001587795 00000 n 0001587916 00000 n 0001588028 00000 n 0001588156 00000 n 0001588278 00000 n 0001588399 00000 n 0001588505 00000 n 0001588614 00000 n 0001588738 00000 n 0001588841 00000 n 0001588977 00000 n 0001589092 00000 n 0001589195 00000 n 0001589298 00000 n 0001589416 00000 n 0001589522 00000 n 0001589658 00000 n 0001589773 00000 n 0001589891 00000 n 0001590021 00000 n 0001590173 00000 n 0001590267 00000 n 0001590394 00000 n 0001590515 00000 n 0001590636 00000 n 0001590754 00000 n 0001590893 00000 n 0001591029 00000 n 0001591126 00000 n 0001591253 00000 n 0001591383 00000 n 0001591480 00000 n 0001591601 00000 n 0001591698 00000 n 0001591816 00000 n 0001591952 00000 n 0001592091 00000 n 0001592215 00000 n 0001592366 00000 n 0001592481 00000 n 0001592608 00000 n 0001592699 00000 n 0001592820 00000 n 0001592917 00000 n 0001593029 00000 n 0001593117 00000 n 0001593241 00000 n 0001593380 00000 n 0001593496 00000 n 0001593615 00000 n 0001593755 00000 n 0001593874 00000 n 0001593987 00000 n 0001594130 00000 n 0001594234 00000 n 0001594365 00000 n 0001594493 00000 n 0001594636 00000 n 0001594782 00000 n 0001594913 00000 n 0001595020 00000 n 0001595154 00000 n 0001595264 00000 n 0001595389 00000 n 0001595493 00000 n 0001595603 00000 n 0001595719 00000 n 0001595853 00000 n 0001595954 00000 n 0001596067 00000 n 0001596177 00000 n 0001596275 00000 n 0001596397 00000 n 0001596525 00000 n 0001596635 00000 n 0001596766 00000 n 0001596891 00000 n 0001597013 00000 n 0001597129 00000 n 0001597236 00000 n 0001597343 00000 n 0001597456 00000 n 0001597566 00000 n 0001597685 00000 n 0001597795 00000 n 0001597908 00000 n 0001598009 00000 n 0001598128 00000 n 0001598205 00000 n 0001598312 00000 n 0001598401 00000 n 0001598484 00000 n 0001598585 00000 n 0001598707 00000 n 0001598829 00000 n 0001598936 00000 n 0001599043 00000 n 0001599129 00000 n 0001599245 00000 n 0001599349 00000 n 0001599456 00000 n 0001599566 00000 n 0001599661 00000 n 0001599780 00000 n 0001599884 00000 n 0001600000 00000 n 0001600104 00000 n 0001600187 00000 n 0001600306 00000 n 0001600431 00000 n 0001600541 00000 n 0001600627 00000 n 0001600749 00000 n 0001600889 00000 n 0001601029 00000 n 0001601121 00000 n 0001601246 00000 n 0001601371 00000 n 0001601502 00000 n 0001601642 00000 n 0001601773 00000 n 0001601904 00000 n 0001602038 00000 n 0001602169 00000 n 0001602309 00000 n 0001602434 00000 n 0001602559 00000 n 0001602675 00000 n 0001602797 00000 n 0001602925 00000 n 0001603053 00000 n 0001603172 00000 n 0001603303 00000 n 0001603452 00000 n 0001603583 00000 n 0001603696 00000 n 0001603812 00000 n 0001603931 00000 n 0001604041 00000 n 0001604175 00000 n 0001604291 00000 n 0001604404 00000 n 0001604529 00000 n 0001604651 00000 n 0001604776 00000 n 0001604901 00000 n 0001605011 00000 n 0001605151 00000 n 0001605255 00000 n 0001605380 00000 n 0001605487 00000 n 0001605600 00000 n 0001605722 00000 n 0001605820 00000 n 0001605924 00000 n 0001606030 00000 n 0001606139 00000 n 0001606242 00000 n 0001606354 00000 n 0001606460 00000 n 0001606560 00000 n 0001606663 00000 n 0001606769 00000 n 0001606878 00000 n 0001606978 00000 n 0001607084 00000 n 0001607175 00000 n 0001607272 00000 n 0001607381 00000 n 0001607481 00000 n 0001607584 00000 n 0001607672 00000 n 0001607772 00000 n 0001607872 00000 n 0001607972 00000 n 0001608081 00000 n 0001608181 00000 n 0001608290 00000 n 0001608393 00000 n 0001608499 00000 n 0001608617 00000 n 0001608732 00000 n 0001608838 00000 n 0001608947 00000 n 0001609053 00000 n 0001609165 00000 n 0001609277 00000 n 0001609386 00000 n 0001609507 00000 n 0001609604 00000 n 0001609716 00000 n 0001609831 00000 n 0001609931 00000 n 0001610031 00000 n 0001610137 00000 n 0001610237 00000 n 0001610334 00000 n 0001610443 00000 n 0001610567 00000 n 0001610682 00000 n 0001610791 00000 n 0001610894 00000 n 0001610985 00000 n 0001611085 00000 n 0001611206 00000 n 0001611312 00000 n 0001611421 00000 n 0001611545 00000 n 0001611639 00000 n 0001611760 00000 n 0001611857 00000 n 0001611978 00000 n 0001612061 00000 n 0001612170 00000 n 0001612282 00000 n 0001612386 00000 n 0001612547 00000 n 0001612678 00000 n 0001612803 00000 n 0001612931 00000 n 0001613074 00000 n 0001613178 00000 n 0001613297 00000 n 0001613413 00000 n 0001613523 00000 n 0001613651 00000 n 0001613794 00000 n 0001613910 00000 n 0001614020 00000 n 0001614139 00000 n 0001614279 00000 n 0001614386 00000 n 0001614502 00000 n 0001614627 00000 n 0001614737 00000 n 0001614880 00000 n 0001615020 00000 n 0001615154 00000 n 0001615264 00000 n 0001615389 00000 n 0001615505 00000 n 0001615621 00000 n 0001615719 00000 n 0001615835 00000 n 0001615978 00000 n 0001616106 00000 n 0001616240 00000 n 0001616349 00000 n 0001616465 00000 n 0001616584 00000 n 0001616715 00000 n 0001616813 00000 n 0001616929 00000 n 0001617038 00000 n 0001617169 00000 n 0001617297 00000 n 0001617428 00000 n 0001617553 00000 n 0001617675 00000 n 0001617788 00000 n 0001617919 00000 n 0001618032 00000 n 0001618136 00000 n 0001618248 00000 n 0001618351 00000 n 0001618460 00000 n 0001618575 00000 n 0001618666 00000 n 0001618754 00000 n 0001618851 00000 n 0001618939 00000 n 0001619060 00000 n 0001619152 00000 n 0001619244 00000 n 0001619348 00000 n 0001619449 00000 n 0001619541 00000 n 0001619684 00000 n 0001619809 00000 n 0001619916 00000 n 0001620011 00000 n 0001620106 00000 n 0001620204 00000 n 0001620299 00000 n 0001623650 00000 n trailer << /Size 5132 /Root 2 0 R /Info 4 0 R /ID [<5C76BDB2E08FEDAE016AA03E43523A9F> <5C76BDB2E08FEDAE016AA03E43523A9F>] >> startxref 1633296 %%EOF hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/accesscontrol-chapt.html0000644000175000017500000007443412007567744022622 0ustar renerene Chapter 6. Access Control


                  Chapter 6. Access Control

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 3096 $

                  Copyright 2010-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  Overview

                  This chapter is about access control to database objects such as tables, inside the database engine. Other issues related to security include user authentication, password complexity and secure connections are covered in the System Management chapter and the HyperSQL Network Listeners (Servers) chapter.

                  Apart from schemas and their object, each HyperSQL catalog has USER and ROLE objects. These objects are collectively called authorizations. Each AUTHORIZATION has some access rights on some of the schemas or the objects they contain. The persistent elements of an SQL environment are database objects

                  Authorizations names are stored in the database in the case-normal form. When connecting to a database via JDBC, the user name and password must match the case of this case-normal form.

                  When a user is created with the CREATE USER statement, if the user name is enclosed in double quotes, the exact name is used as the case-normal form. But if it is not enclosed in double quotes, the name is converted to uppercase and this uppercase version is stored in the database as the case-normal form.

                  Authorizations and Access Control

                  In general, ROLE and USER objects simply control access to schema objects. This is the scope of the SQL Standard. However, there are special roles that allow the creation of USER and ROLE objects and also allow some special operations on the database as a whole. These roles are not defined by the Standard, which has left it to implementers to define such roles as they are needed for the particular SQL implementation.

                  A ROLE has a name a collection of zero or more other roles, plus some privileges (access rights). A USER has a name and a password. It similarly has a collection of zero or more roles plus some privileges.

                  USER objects existed in the SQL-92, but ROLE objects were introduced in SQL:1999. Originally it was intended that USER objects would normally be the same as the operating system USER objects and their authentication would be handled outside the SQL environment. The co-existence of ROLE and USER objects results in complexity. With the addition of ROLE objects, there is no rationale, other than legacy support, for granting privileges to USER objects directly. It is better to create roles and grant privileges to them, then grant the roles to USER objects.

                  The Standard effectively defines a special ROLE, named PUBLIC. All authorization have the PUBLIC role, which cannot be removed from them. Therefore any access right assigned to the PUBLIC role applies to all authorizations in the database. For many simple databases, it is adequate to create a single, non-admin user, then assign access rights to the pre-existing PUBLIC role. Access to INFORMATION_SCHEMA views is granted to PUBLIC, therefore these views are accessible to all. However, the contents of each view depends on the ROLE or USER (AUTHORIZATION) that is in force while accessing the view.

                  Each schema has a single AUTHORIZATION. This is commonly known as the owner of the schema. All the objects in the schema inherit the schema owner. The schema owner can add objects to the schema, drop them or alter them.

                  By default, the objects in a schema can only be accessed by the schema owner. The schema owner can grant access rights on the objects to other users or roles.

                  authorization identifier

                  authorization identifier

                  <authorization identifier> ::= <role name> | <user name>

                  Authorization identifiers share the same name-space within the database. The same name cannot be used for a USER and a ROLE.

                  Built-In Roles and Users

                  There are some pre-defined roles in each database; some defined by the SQL Standard, some by HyperSQL. These roles can be assigned to users (directly or via other, user-defined roles). In addition, there is the initial SYS user created with each new database. The initial user name and password is defined in the connection properties when the first connection to the database is made. In older versions of HSQLDB, this name was always SA. But in the latest version, the name can be defined as a different string.

                  PUBLIC

                  the PUBLIC role

                  The role that is assigned to all authorizations (roles and users) in the database. This role has access rights to all objects in the INFORMATION_SCHEMA. Any roles or rights granted to this role, are in effect granted to all users of the database.

                  _SYSTEM

                  the _SYSTEM role

                  This role is the authorization for the pre-defined (system) objects in the database, including the INFORMATION_SCHEMA. This role cannot be assigned to any authorization.

                  DBA

                  the DBA role (HyperSQL-specific)

                  This is a special role in HyperSQL. A user that has this role can perform all possible administrative tasks on the database. The DBA role can also act as a proxy for all the roles and users in the database. This means it can do everything the authorization for a schema can do, including dropping the schema or its objects, or granting rights on the schema objects to a grantee.

                  CREATE_SCHEMA

                  the CREATE_SCHEMA role (HyperSQL-specific)

                  An authorization that has this role, can create schemas. The DBA authorization has this role and can grant it to other authorizations.

                  CHANGE_AUTHORIZATION

                  the CHANGE_AUTHORIZATION role (HyperSQL-specific)

                  A user that has this role, can change the authorization for the current session to another user. The other user cannot have the DBA role (otherwise, the original user would gain DBA privileges). The DBA authorization has this role and can grant it to other authorizations.

                  SYS User

                  the SYS user (HyperSQL-specific)

                  This user is automatically created with a new database and has the DBA role. This user name and its password are defined in the connection properties when connecting to the new database to create the database. As this user, it is possible to change the password, create other users and created new schema objects. The initial SYS user can be dropped by another user that has the DBA role. As a result, there is always at least one SYS user in the database.

                  Listing Users and Roles

                  Tables in the INFORMATION_SCHEMA contain the list of users and roles for the database.

                  The SYSTEM_USERS tables contains the list of users, with some extra settings for each user. The AUTHORIZATIONS table contains a list of both users and roles.

                  Several other INFORMATION_SCHEMA tables list the privileges granted to users and roles on different database objects. Refer to the Schemas and Database Objects chapter for a list and description of the tables. Example below:

                  SELECT * FROM INFORMATION_SCHEMA.SYSTEM_USERS 
                  SELECT * FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES
                  

                  Access Rights

                  By default, the objects in a schema can only be accessed by the schema owner. But the schema owner can grant privileges (access rights) on the objects to other users or roles.

                  Things can get far more complex, because the grant of privileges can be made WITH GRANT OPTION. In this case, the role or user that has been granted the privilege can grant the privilege to other roles and users.

                  Privileges can also be revoked from users or roles.

                  The statements for granting and revoking privileges normally specify which privileges are granted or revoked. However, there is a shortcut, ALL PRIVILEGES, which means all the privileges that the <grantor> has on the schema object. The <grantor> is normally the CURRENT_USER of the session that issues the statement.

                  The user or role that is granted privileges is referred to as <grantee> for the granted privileges.

                  Table

                  For tables, including views, privileges can be granted with different degrees of granularity. It is possible to grant a privilege on all columns of a table, or on specific columns of the table.

                  The DELETE privilege applies to the table, rather than its columns. It applies to all DELETE statements.

                  The SELECT, INSERT and UPDATE privileges may apply to all columns or to individual columns. These privileges determine whether the <grantee> can execute SQL data statements on the table.

                  The SELECT privilege designates the columns that can be referenced in SELECT statements, as well as the columns that are read in a DELETE or UPDATE statement, including the search condition.

                  The INSERT privilege designates the columns into which explicit values can be inserted. To be able to insert a row into the table, the user must therefore have the INSERT privilege on the table, or at least all the columns that do not have a default value.

                  The UPDATE privilege simply designates the table or the specific columns that can be updated.

                  The REFERENCES privilege allows the <grantee> to define a FOREIGN KEY constraint on a different table, which references the table or the specific columns designated for the REFERENCES privilege.

                  The TRIGGER privilege allows adding a trigger to the table.

                  Sequence, Type, Domain, Character Set, Collation, Transliteration,

                  For these objects, only USAGE can be granted. The USAGE privilege is needed when object is referenced directly in an SQL statement.

                  Routine

                  For routines, including procedures or functions, only EXECUTE privilege can be granted. This privilege is needed when the routine is used directly in an SQL statement.

                  Other Objects

                  Other objects such as constraints and assertions are not used directly and there is no grantable privilege that refers to them.

                  Statements for Authorization and Access Control

                  The statements listed below allow creation and destruction of USER and ROLE objects. The GRANT and REVOKE statements allow roles to be assigned to other roles or to users. The same statements are also used in a different form to assign privileges on schema objects to users and roles.

                  CREATE USER

                  user definition (HyperSQL)

                  <user definition> ::= CREATE USER <user name> PASSWORD <password> [ ADMIN ]

                  Define a new user and its password. <user name> is an SQL identifier. If it is double-quoted it is case-sensitive, otherwise it is turned to uppercase. <password> is a string enclosed with single quote characters and is case-sensitive. If ADMIN is specified, the DBA role is granted to the new user. Only a user with the DBA role can execute this statement.

                  DROP USER

                  drop user statement (HyperSQL)

                  <drop user statement> ::= DROP USER <user name>

                  Drop (destroy) an existing user. If the specified user is the authorization for a schema, the schema is destroyed.

                  Only a user with the DBA role can execute this statement.

                  ALTER USER ... SET PASSWORD

                  set the password for a user (HyperSQL)

                  <alter user set password statement> ::= ALTER USER <user name> SET PASSWORD <password>

                  Change the password of an existing user. <user name> is an SQL identifier. If it is double-quoted it is case-sensitive, otherwise it is turned to uppercase. <password> is a string enclosed with single quote characters and is case-sensitive.

                  Only a user with the DBA role can execute this command.

                  ALTER USER ... SET INITIAL SCHEMA

                  set the initial schema for a user (HyperSQL)

                  <alter user set initial schema statement> ::= ALTER USER <user name> SET INITIAL SCHEMA <schema name> | DEFAULT

                  Change the initial schema for a user. The initial schema is the schema used by default for SQL statements issued during a session. If DEFAULT is used, the default initial schema for all users is used as the initial schema for the user. The SET SCHEMA command allows the user to change the schema for the duration of the session.

                  Only a user with the DBA role can execute this statement.

                  ALTER USER ... SET LOCAL

                  set the user authentication as local (HyperSQL)

                  <alter user set local> ::= ALTER USER <user name> SET LOCAL { TRUE | FALSE }

                  Sets the authentication method for the user as local. This statement has an effect only when external authentication with role names is enabled. In this method of authentication, users created in the database are ignored and an external authentication mechanism, such as LDAP is used. This statement is used if you want to use local, password authentication for a specific user.

                  Only a user with the DBA role can execute this statement.

                  SET PASSWORD

                  set password statement (HyperSQL)

                  <set password statement> ::= SET PASSWORD <password>

                  Set the password for the current user. <password> is a string enclosed with single quote characters and is case-sensitive.

                  SET INITIAL SCHEMA

                  set the initial schema for the current user (HyperSQL)

                  <set initial schema statement> ::= SET INITIAL SCHEMA <schema name> | DEFAULT

                  Change the initial schema for the current user. The initial schema is the schema used by default for SQL statements issued during a session. If DEFAULT is used, the default initial schema for all users is used as the initial schema for the current user. The separate SET SCHEMA command allows the user to change the schema for the duration of the session. See also the Sessions and Transactions chapter.

                  SET DATABASE DEFAULT INITIAL SCHEMA

                  set the default initial schema for all users (HyperSQL)

                  <set database default initial schema statement> ::= SET DATABASE DEFAULT INITIAL SCHEMA <schema name>

                  Sets the initial schema for new users. This schema can later be changed with the <set initial schema statement> command.

                  CREATE ROLE

                  role definition

                  <role definition> ::= CREATE ROLE <role name> [ WITH ADMIN <grantor> ]

                  Defines a new role. Initially the role has no rights, except those of the PUBLIC role. Only a user with the DBA role can execute this command.

                  DROP ROLE

                  drop role statement

                  <drop role statement> ::= DROP ROLE <role name>

                  Drop (destroy) a role. If the specified role is the authorization for a schema, the schema is destroyed. Only a user with the DBA role can execute this statement.

                  GRANTED BY

                  grantor determination

                  GRANTED BY <grantor>

                  <grantor> ::= CURRENT_USER | CURRENT_ROLE

                  The authorization that is granting or revoking a role or privileges. The optional GRANTED BY <grantor> clause can be used in various statements that perform GRANT or REVOKE actions. If the clause is not used, the authorization is CURRENT_USER. Otherwise, it is the specified authorization.

                  GRANT

                  grant privilege statement

                  <grant privilege statement> ::= GRANT <privileges> TO <grantee> [ { <comma> <grantee> }... ] [ WITH GRANT OPTION ] [ GRANTED BY <grantor> ]

                  Assign privileges on schema objects to roles or users. Each <grantee> is a role or a user. If [ WITH GRANT OPTION ] is specified, then the <grantee> can assign the privileges to other <grantee> objects.

                  <privileges> ::= <object privileges> ON <object name>

                  <object name> ::= [ TABLE ] <table name> | DOMAIN <domain name> | COLLATION <collation name> | CHARACTER SET <character set name> | TRANSLATION <transliteration name> | TYPE <user-defined type name> | SEQUENCE <sequence generator name> | <specific routine designator> | ROUTINE <routine name> | FUNCTION <function name> | PROCEDURE <procedure name>

                  <object privileges> ::= ALL PRIVILEGES | <action> [ { <comma> <action> }... ]

                  <action> ::= SELECT | SELECT <left paren> <privilege column list> <right paren> | DELETE | INSERT [ <left paren> <privilege column list> <right paren> ] | UPDATE [ <left paren> <privilege column list> <right paren> ] | REFERENCES [ <left paren> <privilege column list> <right paren> ] | USAGE | TRIGGER | EXECUTE

                  <privilege column list> ::= <column name list>

                  <grantee> ::= PUBLIC | <authorization identifier>

                  The <object privileges> that can be used depend on the type of the <object name>. These are discussed in the previous section. For a table, if <privilege column list> is not specified, then the privilege is granted on the table, which includes all of its columns and any column that may be added to it in the future. For routines, the name of the routine can be specified in two ways, either as the generic name as the specific name. HyperSQL allows referencing all overloaded versions of a routine at the same time, using its name. This differs from the SQL Standard which requires the use of <specific routine designator> to grant privileges separately on each different signature of the routine.

                  Each <grantee> is the name of a role or a user. Examples of GRANT statement are given below:

                  GRANT ALL ON SEQUENCE aSequence TO roleOrUser 
                  GRANT SELECT ON aTable TO roleOrUser  
                  GRANT SELECT, UPDATE ON aTABLE TO roleOrUser1, roleOrUser2
                  GRANT SELECT(columnA, columnB), UPDATE(columnA, columnB) ON TABLE aTable TO roleOrUser
                  GRANT EXECUTE ON SPECIFIC ROUTINE aroutine_1234 TO rolOrUser
                  

                  As mentioned in the general discussion, it is better to define a role for the collection of all the privileges required by an application. This role is then granted to any user. If further changes are made to the privileges of this role, they are automatically reflected in all the users that have the role.

                  GRANT

                  grant role statement

                  <grant role statement> ::= GRANT <role name> [ { <comma> <role name> }... ] TO <grantee> [ { <comma> <grantee> }... ] [ WITH ADMIN OPTION ] [ GRANTED BY <grantor> ]

                  Assign roles to roles or users. One or more roles can be assigned to one or more <grantee> objects. A <grantee> is a user or a role. If the [ WITH ADMIN OPTION ] is specified, then each <grantee> can grant the newly assigned roles to other grantees. An example of user and role creation with grants is given below:

                  CREATE USER appuser
                  CREATE ROLE approle
                  GRANT approle TO appuser
                  GRANT SELECT, UPDATE ON TABLE atable TO approle
                  GRANT USAGE ON SEQUENCE asequence to approle
                  GRANT EXECUTE ON ROUTINE aroutine TO approle
                  

                  REVOKE privilege

                  revoke statement

                  <revoke privilege statement> ::= REVOKE [ GRANT OPTION FOR ] <privileges> FROM <grantee> [ { <comma> <grantee> }... ] [ GRANTED BY <grantor> ] RESTRICT | CASCADE

                  Revoke privileges from a user or role.

                  REVOKE role

                  revoke role statement

                  <revoke role statement> ::= REVOKE [ ADMIN OPTION FOR ] <role revoked> [ { <comma> <role revoked> }... ] FROM <grantee> [ { <comma> <grantee> }... ] [ GRANTED BY <grantor> ] RESTRICT | CASCADE

                  <role revoked> ::= <role name>

                  Revoke a role from users or roles.


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/openoffice-app.html0000644000175000017500000001607612007567744021554 0ustar renerene Appendix C. HyperSQL with OpenOffice

                  HyperSQL with OpenOffice

                  How to use HyperSQL with OpenOffice.org

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5051 $

                  2012-08-06 00:10:58+0100

                  HyperSQL with OpenOffice

                  OpenOffice.org / LibreOffice / ApacheOpenOffice includes HyperSQL and uses it for embedded databases. Our collaboration with OpenOffice.org developers over the last few years has benefited the development and maturity of HyperSQL. Before integration into OOo, HSQLDB was intended solely for application-specific database access. The application developer was expected to resolve any integration issues. Because OpenOffice.org is used by a vast range of users, from schoolchildren to corporate developers, a much higher level of quality assurance has been required. We have achieved it with constant help and feedback from OOo users and developers.

                  Apart from embedded use, you may want to use OpenOffice / LibreOffice with a HyperSQL server instance. The typical use for this is to allow multiple office users access to the same database.

                  There is also a strong case for using OpenOffice to develop your database schema and application, even if the database is intended for your own application, rather than OpenOffice.

                  HSQLDB version 1.8.0 is included in OOo, ApacheOpenOffice and LibreOffice 3.x. You can simply replace the jar with an HSQLDB version 2.2.9 jar to use the latest capabilities with external databases. It is not yet possible to create and use embedded databases with this version.

                  HSQLDB version 2.x jar will hopefully be included in the future versions of ApacheOpenOffice and LibreOffice.

                  Using OpenOffice / LibreOffice as a Database Tool

                  OpenOffice is a powerful database front end. If you want to create schemas, edit tables, edit the database contents manually, design and produce well-formatted reports, then OpenOffice is probably the best open source tools currently available.

                  To connect from OpenOffice to your database, first run a local server instance for the database. This is describes in the Network Listeners chapter of this guide.

                  When you connect from OpenOffice.org, you must specify connection to an external database and use the URL property "default_schema=true". For example, the URL to connect the local database may be like

                   jdbc;hsqldb:hsql://localhost/mydb;default_schema=true 

                  The only current limitation is that OpenOffice only works with the PUBLIC schema. This limitation will hopefully disappear in the future versions of OOo.

                  There wil hopefuly be a version 2.x jar in the future versions of OpenOffice.

                  Converting .odb files to use with HyperSQL Server

                  You may already have an OOo database file, which you want to use outside OOo, or as a server database. The file is in fact in the standard ZIP format and contains the normal HyperSQL database files. Just use a utility such as 7Zip to expand the .odb file. In the /db directory, there are files such as .script, .data, etc. Just rename these files into mydb.script, mydb.data, etc. You can now open the mydb database directly with HyperSQL as an embedded database or as a server instance.


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/index.html0000644000175000017500000015703712007567744017773 0ustar renerene HyperSQL User Guide

                  HyperSQL User Guide

                  HyperSQL Database Engine (HSQLDB) 2.2

                  Edited by

                  The HSQL Development Group

                  Edited by

                  Blaine Simpson

                  The HSQL Development Group

                  Edited by

                  Fred Toussi

                  The HSQL Development Group

                  Copyright 2002-2011 The HSQL Development Group. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. You are not allowed to distribute or display this document on the web in an altered form.

                  2012-08-06 00:10:58+0100


                  Table of Contents

                  Preface
                  Available formats for this document
                  1. Running and Using HyperSQL
                  The HSQLDB Jar
                  Running Database Access Tools
                  A HyperSQL Database
                  In-Process Access to Database Catalogs
                  Server Modes
                  HyperSQL HSQL Server
                  HyperSQL HTTP Server
                  HyperSQL HTTP Servlet
                  Connecting to a Database Server
                  Security Considerations
                  Using Multiple Databases
                  Accessing the Data
                  Closing the Database
                  Creating a New Database
                  2. SQL Language
                  Standards Support
                  SQL Data and Tables
                  Temporary Tables
                  Persistent Tables
                  Lob Data
                  Short Guide to Data Types
                  Data Types and Operations
                  Numeric Types
                  Boolean Type
                  Character String Types
                  Binary String Types
                  Bit String Types
                  Storage and Handling of Java Objects
                  Type Length, Precision and Scale
                  Datetime types
                  Interval Types
                  Arrays
                  Array Definition
                  Array Reference
                  Array Operations
                  Indexes and Query Speed
                  Query Processing and Optimisation
                  Indexes and Conditions
                  Indexes and Operations
                  Indexes and ORDER BY, OFFSET and LIMIT
                  3. Sessions and Transactions
                  Overview
                  Session Attributes and Variables
                  Session Attributes
                  Session Variables
                  Session Tables
                  Transactions and Concurrency Control
                  Two Phase Locking
                  Two Phase Locking with Snapshot Isolation
                  Lock Contention in 2PL
                  Locks in SQL Routines and Triggers
                  MVCC
                  Choosing the Transaction Model
                  Schema and Database Change
                  Simultaneous Access to Tables
                  Viewing Sessions
                  Session and Transaction Control Statements
                  4. Schemas and Database Objects
                  Overview
                  Schemas and Schema Objects
                  Names and References
                  Character Sets
                  Collations
                  Distinct Types
                  Domains
                  Number Sequences
                  Tables
                  Views
                  Constraints
                  Assertions
                  Triggers
                  Routines
                  Indexes
                  Statements for Schema Definition and Manipulation
                  Common Elements and Statements
                  Renaming Objects
                  Commenting Objects
                  Schema Creation
                  Table Creation
                  Table Manipulation
                  View Creation and Manipulation
                  Domain Creation and Manipulation
                  Trigger Creation
                  Routine Creation
                  Sequence Creation
                  SQL Procedure Statement
                  Other Schema Object Creation
                  The Information Schema
                  Predefined Character Sets, Collations and Domains
                  Views in INFORMATION SCHEMA
                  Visibility of Information
                  Name Information
                  Data Type Information
                  Product Information
                  Operations Information
                  SQL Standard Views
                  5. Text Tables
                  Overview
                  The Implementation
                  Definition of Tables
                  Scope and Reassignment
                  Null Values in Columns of Text Tables
                  Configuration
                  Disconnecting Text Tables
                  Text File Usage
                  Text File Global Properties
                  Transactions
                  6. Access Control
                  Overview
                  Authorizations and Access Control
                  Built-In Roles and Users
                  Listing Users and Roles
                  Access Rights
                  Statements for Authorization and Access Control
                  7. Data Access and Change
                  Overview
                  Cursors And Result Sets
                  Columns and Rows
                  Navigation
                  Updatability
                  Sensitivity
                  Holdability
                  Autocommit
                  JDBC Overview
                  JDBC Parameters
                  JDBC and Data Change Statements
                  JDBC Callable Statement
                  JDBC Returned Values
                  Cursor Declaration
                  Syntax Elements
                  Literals
                  References, etc.
                  Value Expression
                  Predicates
                  Aggregate Functions
                  Other Syntax Elements
                  Data Access Statements
                  Select Statement
                  Table
                  Subquery
                  Query Specification
                  Table Expression
                  Table Primary
                  Joined Table
                  Selection
                  Projection
                  Computed Columns
                  Naming
                  Grouping Operations
                  Aggregation
                  Set Operations
                  With Clause and Recursive Queries
                  Query Expression
                  Ordering
                  Slicing
                  Data Change Statements
                  Delete Statement
                  Truncate Statement
                  Insert Statement
                  Update Statement
                  Merge Statement
                  Diagnostics and State
                  8. SQL-Invoked Routines
                  Routine Definition
                  Routine Characteristics
                  SQL Language Routines (PSM)
                  Advantages and Disadvantages
                  Routine Statements
                  Compound Statement
                  Table Variables
                  Variables
                  Cursors
                  Handlers
                  Assignment Statement
                  Select Statement : Single Row
                  Formal Parameters
                  Iterated Statements
                  Iterated FOR Statement
                  Conditional Statements
                  Return Statement
                  Control Statements
                  Raising Exceptions
                  Routine Polymorphism
                  Returning Data From Procedures
                  Recursive Routines
                  Java Language Routines (SQL/JRT)
                  Polymorphism
                  Java Language Procedures
                  Java Static Methods
                  Legacy Support
                  Securing Access to Classes
                  User Defined Aggregate Functions
                  Definition of Aggregate Functions
                  SQL PSM Aggregate Functions
                  Java Aggregate Functions
                  9. Triggers
                  Overview
                  BEFORE Triggers
                  AFTER Triggers
                  INSTEAD OF Triggers
                  Trigger Properties
                  Trigger Event
                  Granularity
                  Trigger Action Time
                  References to Rows
                  Trigger Condition
                  Trigger Action in SQL
                  Trigger Action in Java
                  Trigger Creation
                  10. Built In Functions
                  Overview
                  String and Binary String Functions
                  Numeric Functions
                  Date Time and Interval Functions
                  Functions to Report the Time Zone.
                  Functions to Report the Current Datetime
                  Functions to Extract an Element of a Datetime
                  Functions for Datetime Arithmetic
                  Functions to Convert or Format a Datetime
                  Array Functions
                  General Functions
                  System Functions
                  11. System Management
                  Mode of Operation and Tables
                  Mode of Operation
                  Tables
                  Large Objects
                  Deployment context
                  Readonly Databases
                  ACID, Persistence and Reliability
                  Atomicity, Consistency, Isolation, Durability
                  Backing Up Database Catalogs
                  Making Online Backups
                  Making Offline Backups
                  Examining Backups
                  Restoring a Backup
                  Encrypted Databases
                  Creating and Accessing an Encrypted Database
                  Speed Considerations
                  Security Considerations
                  Monitoring Database Operations
                  External Statement Level Monitoring
                  Internal Statement Level Monitoring
                  Internal Event Monitoring
                  Log4J and JDK logging
                  Server Operation Monitoring
                  Database Security
                  Security Defaults
                  Authentication Control
                  Compatibility with Other RDBMS
                  PostgreSQL Compatibility
                  MySQL Compatibility
                  Firebird Compatibility
                  Apache Derby Compatibility
                  Oracle Compatibility
                  DB2 Compatibility
                  MS SQLServer and Sybase Compatibility
                  Statements
                  System Operations
                  Database Settings
                  SQL Conformance Settings
                  Cache, Persistence and Files Settings
                  Authentication Settings
                  12. Properties
                  Connection URL
                  Variables In Connection URL
                  Connection properties
                  Database Properties in Connection URL and Properties
                  SQL Conformance Properties
                  Database Operations Properties
                  Database File and Memory Properties
                  Crypt Properties
                  System Properties
                  13. HyperSQL Network Listeners (Servers)
                  Listeners
                  HyperSQL Server
                  HyperSQL HTTP Server
                  HyperSQL HTTP Servlet
                  Server and Web Server Properties
                  Starting a Server from your Application
                  Allowing a Connection to Open or Create a Database
                  Specifying Database Properties at Server Start
                  TLS Encryption
                  Requirements
                  Encrypting your JDBC connection
                  JSSE
                  Making a Private-key Keystore
                  Automatic Server or WebServer startup on UNIX
                  Network Access Control
                  14. HyperSQL on UNIX
                  Purpose
                  Installation
                  Setting up Database Catalog and Listener
                  Accessing your Database
                  Create additional Accounts
                  Shutdown
                  Running Hsqldb as a System Daemon
                  Portability of hsqldb init script
                  Init script Setup Procedure
                  Troubleshooting the Init Script
                  Upgrading
                  15. Deployment Guide
                  Memory and Disk Use
                  Table Memory Allocation
                  Result Set Memory Allocation
                  Temporary Memory Use During Operations
                  Data Cache Memory Allocation
                  Object Pool Memory Allocation
                  Lob Memory Usage
                  Disk Space
                  Managing Database Connections
                  Tweaking the Mode of Operation
                  Application Development and Testing
                  Embedded Databases in Desktop Applications
                  Embedded Databases in Server Applications
                  Mixed Mode : Embedding a HyperSQL Server (Listener)
                  Using HyperSQL Without Logging Data Change
                  Bulk Inserts, Updates and Deletes
                  Using NIO File Access
                  Server Databases
                  Upgrading Databases
                  Upgrading From Older Versions
                  Manual Changes to the *.script File
                  Backward Compatibility Issues
                  HyperSQL Dependency Settings for Applications
                  What version to Pull
                  Using the HyperSQL Snapshot Repository
                  Range Versioning
                  A. Lists of Keywords
                  List of SQL Standard Keywords
                  List of SQL Keywords Disallowed as HyperSQL Identifiers
                  Special Function Keywords
                  B. Building HyperSQL Jars
                  Purpose
                  Building with Gradle
                  Invoking a Gradle Build Graphically
                  Invoking a Gradle Build from the Command Line
                  Using Gradle
                  Building with Ant
                  Obtaining Ant
                  Building Hsqldb with Ant
                  Building for Older JDKs
                  Building with IDE Compilers
                  Hsqldb CodeSwitcher
                  Building Documentation
                  C. HyperSQL with OpenOffice
                  HyperSQL with OpenOffice
                  Using OpenOffice / LibreOffice as a Database Tool
                  Converting .odb files to use with HyperSQL Server
                  D. HyperSQL File Links
                  SQL Index
                  General Index

                  List of Tables

                  1. Available formats of this document
                  10.1. TO_CHAR, TO_DATE and TO_TIMESTAMP format elements
                  12.1. Memory Database URL
                  12.2. File Database URL
                  12.3. Resource Database URL
                  12.4. Server Database URL
                  12.5. User and Password
                  12.6. Column Names in JDBC ResultSet
                  12.7. Creating New Database
                  12.8. Automatic Shutdown
                  12.9. Validity Check Property
                  12.10. SQL Keyword Use as Identifier
                  12.11. SQL Keyword Starting with the Underscore or Containing Dollar Characters
                  12.12. Reference to Columns Names
                  12.13. String Size Declaration
                  12.14. Type Enforcement in Comparison and Assignment
                  12.15. Foreign Key Triggered Data Change
                  12.16. Use of LOB for LONGVAR Types
                  12.17. Concatenation with NULL
                  12.18. NULL in Multi-Column UNIQUE Constraints
                  12.19. Truncation or Rounding in Type Conversion
                  12.20. Decimal Scale of Division and AVG Values
                  12.21. Support for NaN values
                  12.22. Sort order of NULL values
                  12.23. String comparison with padding
                  12.24. DB2 Style Syntax
                  12.25. MSSQL Style Syntax
                  12.26. MySQL Style Syntax
                  12.27. Oracle Style Syntax
                  12.28. PostgreSQL Style Syntax
                  12.29. Default Table Type
                  12.30. Transaction Control Mode
                  12.31. Default Isolation Level for Sessions
                  12.32. Transaction Rollback in Deadlock
                  12.33. Time Zone and Interval Types
                  12.34. Opening Database as Read Only
                  12.35. Opening Database Without Modifying the Files
                  12.36. Huge database files and tables
                  12.37. Temporary Result Rows in Memory
                  12.38. Event Logging
                  12.39. SQL Logging
                  12.40. Rows Cached In Memory
                  12.41. Rows Cached In Memory
                  12.42. Size of Rows Cached in Memory
                  12.43. Size Scale of Disk Table Storage
                  12.44. Size Scale of LOB Storage
                  12.45. Internal Backup of Database Files
                  12.46. Use of Lock File
                  12.47. Logging Data Change Statements
                  12.48. Automatic Checkpoint Frequency
                  12.49. Automatic Defrag at Checkpoint
                  12.50. Logging Data Change Statements Frequency
                  12.51. Logging Data Change Statements Frequency
                  12.52. Use of NIO for Disk Table Storage
                  12.53. Use of NIO for Disk Table Storage
                  12.54. Recovery Log Processing
                  12.55. Default Properties for TEXT Tables
                  12.56. Forcing Garbage Collection
                  12.57. Crypt Property For LOBs
                  12.58. Cipher Key for Encrypted Database
                  12.59. Crypt Provider Encrypted Database
                  12.60. Cipher Specification for Encrypted Database
                  12.61. Logging Framework
                  12.62. Text Tables
                  12.63. Java Functions
                  13.1. common server and webserver properties
                  13.2. server properties
                  13.3. webserver properties

                  List of Examples

                  1.1. Java code to connect to the local hsql Server
                  1.2. Java code to connect to the local http Server
                  1.3. Java code to connect to the local secure SSL hsql and http Servers
                  1.4. specifying a connection property to shutdown the database when the last connection is closed
                  1.5. specifying a connection property to disallow creating a new database
                  3.1. User-defined Session Variables
                  3.2. User-defined Temporary Session Tables
                  3.3. Setting Transaction Characteristics
                  3.4. Locking Tables
                  3.5. Rollback
                  3.6. Setting Session Characteristics
                  3.7. Setting Session Authorization
                  3.8. Setting Session Time Zone
                  4.1. inserting the next sequence value into a table row
                  4.2. numbering returned rows of a SELECT in sequential order
                  4.3. using the last value of a sequence
                  4.4. Column values which satisfy a 2-column UNIQUE constraint
                  11.1. Using CACHED tables for the LOB schema
                  11.2. Offline Backup Example
                  11.3. Listing a Backup with DbBackup
                  11.4. Restoring a Backup with DbBackup
                  11.5. Finding foreign key rows with no parents after a bulk import
                  13.1. Exporting certificate from the server's keystore
                  13.2. Adding a certificate to the client keystore
                  13.3. Specifying your own trust store to a JDBC client
                  13.4. Getting a pem-style private key into a JKS keystore
                  13.5. Validating and Testing an ACL file
                  14.1. example sqltool.rc stanza
                  15.1. Using CACHED tables for the LOB schema
                  15.2. MainInvoker Example
                  15.3. HyperSQL Snapshot Repository Definition
                  15.4. Sample Snapshot Ivy Dependency
                  15.5. Sample Snapshot Maven Dependency
                  15.6. Sample Snapshot Gradle Dependency
                  15.7. Sample Snapshot ivy.xml loaded by Ivyxml plugin
                  15.8. Sample Snapshot Groovy Dependency, using Grape
                  15.9. Sample Range Ivy Dependency
                  15.10. Sample Range Maven Dependency
                  15.11. Sample Range Gradle Dependency
                  15.12. Sample Range ivy.xml loaded by Ivyxml plugin
                  15.13. Sample Range Groovy Dependency, using Grape
                  B.1. Buiding the standard Hsqldb jar file with Ant
                  B.2. Example source code before CodeSwitcher is run
                  B.3. CodeSwitcher command line invocation
                  B.4. Source code after CodeSwitcher processing

                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/deployment-chapt.html0000644000175000017500000017114212007567744022132 0ustar renerene Chapter 15. Deployment Guide

                  Chapter 15. Deployment Guide

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5035 $

                  Copyright 2002-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  Memory and Disk Use

                  Memory used by the program can be thought of as two distinct pools: memory used for table data which is not released unless the data is deleted and memory that can be released or is released automatically, including memory used for caching, building result sets and other internal operations such as storing the information needed for a rollback a transaction.

                  Most JVM implementations allocate up to a maximum amount of memory (usually 64 MB by default). This amount is generally not adequate when large memory tables are used, or when the average size of rows in cached tables is larger than a few hundred bytes. The maximum amount of allocated memory can be set on the Java command line that is used for running HyperSQL. For example, with Sun JVM, parameter -Xmx256m increases the amount to 256 MB.

                  Table Memory Allocation

                  The memory used for a MEMORY table is the sum of memory used by each row. Each MEMORY table row is a Java object that has 2 int or reference variables. It contains an array of objects for the fields in the row. Each field is an object such as Integer, Long, String, etc. In addition each index on the table adds a node object to the row. Each node object has 6 int or reference variables. As a result, a table with just one column of type INTEGER will have four objects per row, with a total of 10 variables of 4 bytes each - currently taking up 80 bytes per row. Beyond this, each extra column in the table adds at least a few bytes to the size of each row.

                  Result Set Memory Allocation

                  By default, all the rows in the result set are built in memory, so very large result sets may not be possible to build. A server mode databases releases the result set from the server memory once the database server has returned the result set. An in-process database releases the memory when the application program closes the java.sql.ResultSet object. A server mode database requires additional memory for returning result sets, as it converts the full result set into an array of bytes which is then transmitted to the client.

                  HyperSQL 2.0 supports disk-based result sets. The commands, SET SESSION RESULT MEMORY ROWS <integer> and SET DATABASE DEFAULT RESULT MEMORY ROWS <integer> specify a threshold for the number of rows. Results with row counts above the threshold are stored on disk. These settings also apply to temporary tables, views and subquery tables.

                  Disk-based result sets slow down the database operations and should be used only when absolutely necessary, perhaps with result sets that are larger than tens of thousands of rows.

                  In a server mode database, when the setFetchSize() method of the Statement interface is used to limit the number rows fetched, the whole result is held by the engine and is returned to the JDBC ResultSet in blocks of rows of the specified fetch size.

                  Temporary Memory Use During Operations

                  When UPDATE and DELETE queries are performed on CACHED tables, the full set of rows that are affected, including those affected due to ON UPDATE actions, is held in memory for the duration of the operation. This means it may not be possible to perform deletes or updates involving very large numbers of rows of CACHED tables. Such operations should be performed in smaller sets. This memory is released as soon as the DELETE or UPDATE is performed.

                  When transactions support is enabled with SET AUTOCOMMIT FALSE, lists of all insert, delete or update operations are stored in memory so that they can be undone when ROLLBACK is issued. For CACHED tables, only the transaction information is held in memory, not the actual rows that have changed. Transactions that span thousands of modification to data will take up a lot of memory until the next COMMIT or ROLLBACK clears the list. Each row modification uses less than 100 bytes until COMMIT.

                  When subqueries or views are used in SELECT and other statements, transient tables are created and populated by the engine. If the SET SESSION RESULT MEMORY ROWS <integer> statement has been used, these transient tables are stored on disk when they are larger than the threshold.

                  Data Cache Memory Allocation

                  With CACHED tables, the data is stored on disk and only up to a maximum number of rows are held in memory at any time. The default is up to 50,000 rows. The SET FILES CACHE ROWS command or the hsqldb.cache_rows connection property can be set to alter this amount. As any random subset of the rows in any of the CACHED tables can be held in the cache, the amount of memory needed by cached rows can reach the sum of the rows containing the largest field data. For example if a table with 100,000 rows contains 40,000 rows with 1,000 bytes of data in each row and 60,000 rows with 100 bytes in each, the cache can grow to contain 50,000 of the smaller rows, but as explained further, only 10,000 or the large rows.

                  An additional property, hsqldb.cache_size is used in conjunction with the hsqldb.cache_rows property. This puts a limit in bytes on the total size of rows that are cached. The default values is 10,000KB. (This is the size of binary images of the rows and indexes. It translates to more actual memory, typically 2-4 times, used for the cache because the data is represented by Java objects.)

                  If memory is limited, the hsqldb.cache_rows or hsqldb.cache_size database properties can be reduced. In the example above, if the hsqldb.cache_size is reduced from 10,000 to 5,000, it will allow the number of cached rows to reach 50,000 small rows, but only 5,000 of the larger rows.

                  Data for CLOB and BLOB columns is not cached and does not affect the CACHED table memory cache.

                  The use of Java NIO file access method also increases memory usage. Access with NIO improves database update speed and is used by default for data files up to 256 MB. For minimal memory use, nio access should be disabled.

                  The operating system usually allocates a large amount of buffer memory for speed up file read operations. Therefore when a lot of memory is available to the operating system, all database operations perform faster.

                  Object Pool Memory Allocation

                  HyperSQL uses a set of fast pools for immutable objects such as Integer, Long and short String objects that are stored in the database. In most circumstances, this reduces the memory footprint still further as fewer copies of the most frequently-used objects are kept in memory. The object pools are shared among all databases in the JVM. The size of each pool can be modified only by altering and recompiling the org.hsqldb.store.ValuePool class.

                  Lob Memory Usage

                  Access to lobs is always performed in chunks, so it is perfectly possible to store and access a CLOB or BLOB that is larger than the JVM memory allocation. The actual total size of lobs is almost unlimited. We have tested with over 100 GB of lobs without any loss of performance.

                  By default, HyperSQL 2.0 uses memory-based tables for the lob schema (not the actual lob data). Therefore it is practical to store about 100,000 individual lobs in the database with the default JVM memory allocation. More lobs can be stored with larger JVM memory allocations. In order to store more than a few hundreds of thousands of lobs, you can change the lob schema storage to CACHED tables with the following statements:

                  Example 15.1. Using CACHED tables for the LOB schema

                    SET TABLE SYSTEM_LOBS.BLOCKS TYPE CACHED
                    SET TABLE SYSTEM_LOBS.LOBS TYPE CACHED
                    SET TABLE SYSTEM_LOBS.LOB_IDS TYPE CACHED
                  

                  Disk Space

                  With file: database, the engine uses the disk for storage of data and any change. For safely, the engine backs up the data internally during operation. Spare space, at least equal to the size of the .data and .script file is needed. The .lobs file is not backed up during operation as it is not necessary for safety.

                  Managing Database Connections

                  In all running modes (server or in-process) multiple connections to the database engine are supported. in-process (standalone) mode supports connections from the client in the same Java Virtual Machine, while server modes support connections over the network from several different clients.

                  Connection pooling software can be used to connect to the database but it is not generally necessary. Connection pools may be used for the following reasons.

                  • To allow new queries to be performed while a time-consuming query is being performed in the background. In HyperSQL, blocking depends on the transaction control model, the isolation level, and the current activity by other sessions.

                  • To limit the maximum number of simultaneous connections to the database for performance reasons. With HSQLDB this can be useful if your application is designed in a way that opens and closes connections for each small task. Also, the overall performance may be higher when fewer simultaneous connections are used. If you want to reduce the number of simultaneous sessions, you can use a connection pool with fewer pooled connections.

                  An application that is not both multi-threaded and transactional, such as an application for recording user login and logout actions, does not need more than one connection. The connection can stay open indefinitely and reopened only when it is dropped due to network problems.

                  When using an in-process database, when the last connection to the database is closed, the database still remains open, waiting for the next connection to be made. From version 2.2.9, each time the last connection is closed all the data changes are logged and synched to disk.

                  An explicit SHUTDOWN command, with or without an argument, is required to close the database. A connection property, shutdown=true, can be used on the connection URL or in a properties object to shutdown the database when the last connection is closed.

                  When using a server database (and to some extent, an in-process database), care must be taken to avoid creating and dropping JDBC Connections too frequently. Failure to observe this will result in poor performance when the application is under heavy load.

                  A common error made by users in load-test simulations is to use a single client machine to open and close thousands of connections to a HyperSQL server instance. The connection attempts will fail after a few thousand because of OS restrictions on opening sockets and the delay that is built into the OS in closing them.

                  Tweaking the Mode of Operation

                  Different modes of operation and settings are used for different purposes. Some scenarios are discussed below:

                  Application Development and Testing

                  First thing to be aware of is the SQL conformance settings of HyperSQL. By default version 2.0 applies stricter conformance rules than version 1.8 and catches long strings or decimal values that do not fit within the specified length or precision settings. However, there are several conformance settings that are turned off by default. This is to enable easier migration from earlier versions, and also greater compatibility with databases such as MySQL that are sometimes very liberal with type conversions. The conformance settings are listed in the System Management chapter and their connection property equivalents are listed in the Database Properties chapter. Ideally, all the settings should have a true value for best error checking.

                  For application unit testing you can use an all-in-memory, in-process database.

                  If the tests are all run in one process, then the contents of a mem: database survives between tests. To release the contents you can use the SHUTDOWN command (an SQL command). You can even use multiple mem: databases in your tests and SHUTDOWN each one separately.

                  If the tests are in different processes and you want to keep the data between the tests, the best solution is to use a Server instance that has a mem: database. After the tests are done, you can SHUTDOWN this database, which will shutdown the server.

                  The Server has an option that allows databases to be created as needed by making a connection (see the Listeners Chapter). This option is useful for testing, as your server is never shut down when a database is shutdown. Each time you connect to the mem: database that is served by the Server, the database is created if it does not exist (i.e. has been previously shut down).

                  If you do not want to run a Server instance, and you need persistence between tests in different processes, then you should use a file: database. From version 2.2.9 when the last existing connection to the database is closed, the latest changes to the database are persisted fully. The database is still in an open state until it is shut down. You can use the shutdown=true connection property to close the database automatically after the connections are closed. An alternative option is to use hsqldb.write_delay=false connection property, but this is slightly slower than the other option and should be used in situations where the test application does not close the connections.

                  It has been reported that some data access frameworks do not close all their connection to the database after the tests. In such situations, you need to use zero WRITE DELAY if you want the data to persist at the end of the tests

                  You may actually want to use a file: database, or a server instance that serves a file: database in preference to a mem: database. As HyperSQL logs the DDL and DML statements in the .log file, this file can be used to check what is being sent to the database. Note that UPDATE statements are represented by a DELETE followed by an INSERT statement. Statements are written out when the connection commits. The write delay also has an effect on how soon the statements are written out. By default, the write delay is 0.5 second.

                  The new SQL logging feature in version 2.2.x and later records all executed statements and can be used for debugging your application.

                  Some types of tests start with a database that already contains the tables and data, and perform various operations on it during the tests. You can create and populate the initial database then set the property "files_readonly=true" in the .properties file of the database. The tests can then modify the database, but these modifications are not persisted after the tests have completed.

                  Databases with "files_readonly=true" can be placed within the classpath and in a jar file. In this case, the connection URL must use the res: protocol, which treats the database as a resource.

                  Embedded Databases in Desktop Applications

                  In this usage, the amount of data change is often limited and there is often a requirement to persist the data immediately. The default write delay of 0.5 second is fine for many applications. You can also use the property hsqldb.write_delay_millis=100 to reduce it to 0.1 second, or the property hsqldb.write_delay=false to force a disk sync after each commit. Before the application is closed, you should perform the SHUTDOWN command to ensure the database is opened instantly when it is next opened. Note you don't need to use SHUTDOWN COMPACT as routine.

                  Embedded Databases in Server Applications

                  This usage involves a server application, such as a web application, connecting to an embedded HyperSQL instance. In this usage, the database is often accessed heavily, therefore performance and latency is a consideration. If the database is updated heavily, the default value of the WRITE DELAY property (0.5 sec) is often enough, as it is assumed the server or the application does not go down frequently. If it is necessary, you can reduce the WRITE DELAY to a small value (20 ms) without impacting the update speed. If you reduce WRITE DELAY to zero, performance drops to the speed of disk file sync operation.

                  Alternatively, a server application can use an all-in-mem database instance for fast access, while sending the data changes to a persistent, disk based instance either periodically or in real time.

                  Mixed Mode : Embedding a HyperSQL Server (Listener)

                  Since you won't be able to access in-process database instances from other processes, you will often want to run a Listener in your applications that use embedded databases. You can do this by starting up a Server or WebServer instance programmatically, but you could also use the class org.hsqldb.util.MainInvoker to start up your application and a HyperSQL Server or WebServer without any programming.

                  Example 15.2. MainInvoker Example

                    java -cp path/to/your/app.jar:path/to/hsqldb.jar your.App "" org.hsqldb.server.Server


                  (Use ; instead of : to delimit classpath elements on Windows). Specify the same in-process JDBC URL to your app and in the server.properties file. You can then connect to the database from outside using a JDBC URL like jdbc:hsqldb:hsql://hostname, while connecting from inside the application using something like jdbc:hsqldb:file:<filepath of database> .

                  This tactic can be used to run off-the-shelf server applications with an embedded HyperSQL Server, without doing any coding.

                  MainInvoker can be used to run any number of Java class main method invocations in a single JVM. See the API spec for MainInvoker for details on its usage.

                  Using HyperSQL Without Logging Data Change

                  All file database that are not readonly, write changes to the .log file. There are scenarios where writing to the .log file can be turned off to improve performance, especially with larger databases. For these applications you can set the property hsqldb.log_data=false to disable the recovery log and speed up data change performance. The equivalent SQL command is SET FILES LOG FALSE.

                  With this setting, no data is logged, but all the changes to cached tables are written to the .data file. To persist all the data changes up to date, you can use the CHECKPOINT command. If you perform SHUTDOWN, the data is also persisted correctly. If you do not use CHECKPOINT or SHUTDOWN when you terminate the application, all the changes are lost and the database reverts to its original state when it is opened without losing any of the original data.

                  Your server applications can use a database as a temporary disk data cache which is not persisted past the lifetime of the application. For this usage, delete the database files when the application ends.

                  On some platforms, such as embedded devices which have a reliable storage device, this is also a useful option. Your application issues CHECKPOINT to save the changes made so far. This method of use reduces write operations on SSD devices. For this usage, the lock file should also be disabled with the connection property hsqldb.lock_file=false.

                  Bulk Inserts, Updates and Deletes

                  Bulk inserts, deletes and updates are performed with the best performance with the following method. The database remains safe and consistent using this method. In the event of a machine crash during the operation, the database can be recovered to the point just before the bulk operation.

                  1. Before the operation, execute the SET FILES LOG FALSE statement.

                  2. Execute the CHECKPOINT statement.

                  3. Perform all the bulk operations, using batched prepared statements. A batch size of 1000 to 10000 is adequate.

                  4. After all the bulk operations are complete, execute the SET FILES LOG TRUE statement.

                  5. Finally execute the CHECKPOINT statement.

                  6. If you have performed many thousands of updates or deletes (not just inserts), it is a good idea to execute CHECKPOINT DEFRAG, instead of CHECKPOINT at the end.

                  7. If things go wrong during the bulk operation, for example when a unique constraint violation aborts the operation, and you want to redo the operation, just use SHUTDOWN IMMEDIATELY instead of CHECKPOINT. When you restart the database it will revert to the state at the first CHECKPOINT and the bulk operation can be redone.

                  Using NIO File Access

                  This method of file access uses the operating system's memory-mapped file buffer for the .data file. For larger databases with CACHED tables, use of nio improves database access speed significantly. Performance improvements can be tenfold or even higher. By default, NIO is used for .data files from 16 MB up to 256 MB. You can increase the limit with the SET FILES NIO SIZE <value> statement. There should be enough RAM available to accommodate the memory mapped buffers. For vary large nio usage, a 64 bit JVM must be used. The memory is not taken from the JVM memory allocation, therefore there is no need to increase the -Xmx parameter of the JVM. If not enough memory is available for the specified value, nio is not used.

                  Server Databases

                  Running databases in a HyperSQL server is the best overall method of access. As the JVM process is separate from the application, this method is the most reliable as well as the most accessible method of running databases.

                  Upgrading Databases

                  Any database that is not produced with the release version of HyperSQL 2.0 must be upgraded to this version.

                  Procedure 15.1. Upgrading Databases Created with Version 1.8.x

                  1. Open the database with the jar that created it and perform the SHUTDOWN statement as an SQL statement.

                  2. Open the database with the HyperSQL 2.0 jar.

                  3. Perform the SHUTDOWN COMPACT statement..

                  The first step is to guarantee there is no .log file for the database. When upgrading an application that has been deployed on a large scale, it is sometimes not practical to perform the first step of this procedure (with the old jar). You can ignore the first step but you may lose part of the database statements that are stored in the .log file. Therefore you need to test with databases created with your application to make sure typical statements that are logged in the .log file are compatible with the new version. Examples of known incompatible statements are some DDL statements used for changing the data type or default values of column.

                  A note about SHUTDOWN modes. SHUTDOWN COMPACT is equivalent to SHUTDOWN SCRIPT plus opening the database and then performing a simple SHUTDOWN.

                  After upgrading a database, you may want to change some of its settings. For example, the new SET FILES BACKUP INCREMENT TRUE statement can improve the shutdown and checkpoint times of larger databases.

                  Once a database is upgraded to 2.0, it can no longer be used with previous versions of HyperSQL.

                  Upgrading From Older Versions

                  To upgrade from version 1.8.x with the default TEXT format script files, follow the instructions above. If the 1.8.x files have database script format set to BINARY or COMPRESSED (ZIPPED) you must issue the SET SCRIPTFORMAT TEXT and SHUTDOWN SCRIPT commands with the old version, then open with the new version of the engine. In most cases the upgrade is successful and complete.

                  It is strongly recommended to execute SHUTDOWN COMPACT after an automatic upgrade from previous versions.

                  If your database has been created with version 1.7.2 or 1.7.3, first upgrade to version 1.8.1 and perform a SHUTDOWN SCRIPT with this version. You can then upgrade the database to version 2.0.

                  To upgrade from older version database files (1.7.1 and older) that contain CACHED tables, use the SCRIPT procedure below. In all versions of HyperSQL, the SCRIPT 'filename' command (used as an SQL statement) allows you to save a full record of your database, including database object definitions and data, to a file of your choice. You can export a script file using the old version of the database engine and open the script as a database with 2.0.

                  Procedure 15.2. Upgrade Using the SCRIPT Procedure for Very Old Versions

                  1. Open the original database in the old version of DatabaseManager

                  2. Issue the SCRIPT command, for example SCRIPT 'newversion.script' to create a script file containing a copy of the database.

                  3. SHUTDOWN this database.

                  4. Copy the original *.properties file into newversion.properties in the same directory as newversion.script

                  5. Try to open the new database newversion using DatabaseManager of version 1.8.1.

                  6. If there is any inconsistency in the data, the script line number is reported on the console and the opening process is aborted. Edit and correct any problems in the newversion.script before attempting to open again. Use the guidelines in the next section (Manual Changes to the .script File). Use a programming editor that is capable of handling very large files and does not wrap long lines of text.

                  Manual Changes to the *.script File

                  In HyperSQL 2.0 the full range of ALTER TABLE commands is available to change the data structures and their names. However, if an old database cannot be opened due to data inconsistencies, or it uses index or column names that are not compatible with 2.0, manual editing of the *.script file can be performed and can be faster.

                  • Version 2.0 does not accept duplicate names for indexes that were allowed before 1.7.2.

                  • Version 2.0 does not accept some table or column names that are SQL reserved keywords without double quoting.

                  • Version 2.0 does not accept unquoted table or column names which begin with an underscore, unless the connection sql.regular_names is set false.

                  • Version 2.0 is more strict with check conditions and default values.

                  Other manual changes are also possible. Note that the *.script file must be the result of a SHUTDOWN SCRIPT and must contain the full data for the database. The following changes can be applied so long as they do not affect the integrity of existing data.

                  • Names

                    Names of tables, columns and indexes can be changed. These changes must be consistent regarding foreign key constraint references.

                  • CHECK

                    A check constraint can always be removed.

                  • NOT NULL

                    A not-null constraint can always be removed.

                  • PRIMARY KEY

                    A primary key constraint can be removed. It cannot be removed if there is a foreign key referencing the column(s).

                  • UNIQUE

                    A UNIQUE constraint can be removed if there is no foreign key referencing the column(s).

                  • FOREIGN KEY

                    A FOREIGN KEY constraint can always be removed.

                  • COLUMN TYPES

                    Some changes to column types are possible. For example an INTEGER column can be changed to BIGINT.

                  After completing the changes and saving the modified .script file, you can open the database as normal.

                  Backward Compatibility Issues

                  HyperSQL 2.0 conforms to the SQL Standard better than previous versions and has many more features. For these reasons, there may be some compatibility issues when converting old database, or using applications that were written for version 1.8.x or earlier. Some of the potential issues (and enhancements) are listed here. See the full list of connection properties for alternatives.

                  • By default, when comparison strings, the shorter string is padded with spaces. This has an effect on comparing 'test' and 'test ' which are now considered equal, despite the length difference. This behaviour is controlled by the default PAD SPACE property of collations, which can be changed to NO PAD. See the statement SET DATABASE COLLATION <name> [ PAD SPACE | NO PAD ].

                  • User names and passwords are case-sensitive. Check the .script file of a database for the correct case of user name and password and use this form in the connection properties or on connection URL.

                  • It is now possible to specify the admin username and password for a new database (instead of SA and the empty password).

                  • HyperSQL 2.0 has several settings that relax its conformance to the SQL Standard in the areas of type conversion and object names. These settings can be turned on for maximum conformance.

                  • Check constraints must conform to the SQL Standard. A check constraint is rejected if it is not deterministic or retrospectively deterministic. When opening an old database, HyperSQL silently drops check constraints that no longer compile. See under check constraints for more detail about what is not allowed.

                  • Type declarations in column definition and in cast expressions must have the necessary size parameters.

                  • In connection with the above, an old database that did not have the enforce_strict_size property, is now converted to version 2.0 with the engine supplying the missing size parameters. For example, a VARCHAR column declaration that has no size, is given a 32K size, a LONGVARCHAR column is given a 16MB size. Check these sizes are adequate for your use, and change the column definition as necessary.

                  • Column names in a GROUP BY clause were previously resolved to the column label. They are now resolved to column name first, and if the name does not match, to the column label.

                  • If two or more tables in a join contain columns with the same name, the columns cannot be referenced in join and where conditions. Use table names before column names to qualify the references to such columns. The SET DATABASE SQL REFERENCES { TRUE | FALSE } statement enables or disables this check.

                  • If the unqualified wild card is used, as in the statement SELECT * FROM ... no additional column references are allowed. A table-qualified wild card allows additional column references in the SELECT list

                  • Table definitions containing GENERATED BY DEFAULT AS IDENTITY but with no PRIMARY KEY do not automatically create a primary key. Database .script files made with 1.8 are fine, as the PRIMARY KEY clause is always included. But the CREATE TABLE statements in your application program may assume an automatic primary key is created. The old shortcut, IDENTITY, is retained with the same meaning. So CREATE TABLE T (ID IDENTITY, DAT VARCHAR(20)) is translated into CREATE TABLE T(ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, DAT VARCHAR(20)). This last form is the correct way of defining both autoincrement and primary key in versions 1.8 and 2.0.

                  • CREATE ALIAS is now obsolete. Use the new function definition syntax. The org.hsqldb.Library class no longer exists. You should use the SQL form of the old library functions. For example, use LOG(x) rather than the direct form, "org.hsqldb.Library.log"(x).

                  • The names of some commands for changing database and session properties have changed. See the list of statements in this chapter.

                  • Computed columns in SELECT statements which did not have an alias: These columns had no ResultMetaData label in version 1.8, but in version 2.0, the engine generates labels such as C1, C2.

                  • The issue with the JDBC ResultSetMetaData methods, getColumnName(int column) and getColumnLabel(int column) has been clarified by the JDBC 4 specification. getColumName() returns the underlying column name, while getColumnLabel() returns any specified or generated alias. HyperSQL 1.8 and 2.0 have a connection property, get_column_name, which defaults to true in version 2.0, but defaulted to false in some releases of version 1.8.x. You have to explicitly specify this property as false if you want (non-standard behaviour) getColumnName() to return the same value as getColumnLabel().

                  HyperSQL Dependency Settings for Applications

                  Dependency settings using Gradle, Ivy, Maven, Groovy

                  This section is about building applications that have build-time dependencies upon HyperSQL, and for executions that use a dependency library system. Examples of the second type are unit test runs, job runs triggered by a build system, or systems like Grape that pull libraries from the network at end-user run time.

                  What version to Pull

                  The best option for most developers is to use our snapshot repository, or at least to depend upon the latest public version of HyperSQL with a range pattern like [2,). Here are exceptional cases where you should depend on a static version.

                  • Your application has code dependencies upon version-specific details of the HyperSQL distribution. In this case, the specific dependency specification should be checked in to your source code control system alongside the code that manifests the version-dependency. If your code is enhanced to use a newer version of HyperSQL, you should update the version specification so that whenever code + configs are checked out, the dependency will always match the code.
                  • Your organization only allows the use of vetted libraries. In this case, you vigorously maintain your configurations, updating your dependencies and regression testing as soon as new versions of HyperSQL are vetted. To get the best performance and reliability from HyperSQL, you should urge the appropriate parties to vet new versions as soon as they are publicly released.
                  • You need precisely reproducible builds.

                  If none of these situations apply to you, then follow the suggestions in the appropriate sections below. If you need to specify a specific version, follow the instructions in the range-versioning section but change the version range specifications to literal versions like 2.2.9.

                  Using the HyperSQL Snapshot Repository

                  Use the Latest & Greatest with Snapshots

                  The HyperSQL Snapshot repository resides at http://hsqldb.org/repos/

                  [Note]Limitation of Classifiers

                  Classifiers are incompatible with real repository snapshots. Builders can only publish one jar variant per product, and at this time our snapshot jars are always built debug-enabled with Java 6.

                  Where you insert the <repository> element depends on whether you want the definition to be personal, shared, or project-specific, so see the Maven documentation about that. But you can paste this element verbatim:

                  Example 15.3. HyperSQL Snapshot Repository Definition

                      <repository>
                        <releases>
                          <enabled>false</enabled>
                        </releases>
                        <snapshots>
                          <enabled>true</enabled>
                          <updatePolicy>always</updatePolicy>
                          <checksumPolicy>fail</checksumPolicy>
                        </snapshots>
                        <id>hsqldb_snapshots</id>
                        <name>HyperSQL Snapshots</name>
                        <url>http://hsqldb.org/repos</url>
                        <layout>default</layout>
                      </repository>

                  Snapshot Dependency Specification Examples

                  Example 15.4. Sample Snapshot Ivy Dependency

                         <dependency org="org.hsqldb" name="hsqldb" rev="SNAPSHOT" conf="buildOnly"/>

                  Example 15.5. Sample Snapshot Maven Dependency

                          <dependency>
                            <groupId>org.hsqldb<groupId>
                            <artifactId>hsqldb<artifactId>
                            <version>SNAPSHOT<version>
                            <!-- Scope defaults to "compile":
                            <scope>test<scope>
                            -->
                          <dependency>

                  Example 15.6. Sample Snapshot Gradle Dependency

                      dependencies.compile (group: 'org.hsqldb', name: 'hsqldb', version:'SNAPSHOT')
                      dependencies {
                          runtime 'org.hsqldb:hsqldb:SNAPSHOT',
                                  'org.hsqldb:sqltool:SNAPSHOT'
                      }

                  If you want to use an ivy.xml file with a Gradle build, you will need use the Ivyxml Gradle Plugin. It just takes a few links of code in your build.gradle file to hook in ivyxml. See the Ivyxml documentation to see exactly how.

                  Example 15.7. Sample Snapshot ivy.xml loaded by Ivyxml plugin

                      <ivy-module version="2.0">
                      ...
                      <dependency org="org.hsqldb" name="hsqldb" rev="SNAPSHOT"/>


                  Example 15.8. Sample Snapshot Groovy Dependency, using Grape

                  @Grab(group='org.hsqldb', module='hsqldb', version='SNAPSHOT')

                  Range Versioning

                  Keeping up-to-date with Range Dependencies

                  [Note]Limitation of Maven Version Range Specifiers

                  Note that Ivy (and the many systems that use Ivy underneath, like Grape and Gradle) supports the opening exclusive ] in addition to [, whereas Maven supports only the opening inclusive [ specifier. See the relevant Ivy or Maven documentation for details. There are special cases where you should depend on a specific version instead.

                  Range Dependency Specification Examples

                  [Important]Important

                  For all examples below, when a range pattern is given, it means the latest version equal or greater than version 2. If a classifier is shown, it is optional and you can skip it to get the default (no-classifier) jar.

                  Example 15.9. Sample Range Ivy Dependency

                         <dependency org="org.hsqldb" name="hsqldb" rev="[2,)" conf="j6->default"/>

                  I give no example here of specifying a classifier in ivy.xml because I have so far failed to get that to succeed. Classifiers in in ivy.xml are supported if using Gradle, as covered below.


                  Example 15.10. Sample Range Maven Dependency

                  See note above about Maven range specifications.

                          <dependency>
                            <groupId>org.hsqldb<groupId>
                            <artifactId>hsqldb<artifactId>
                            <version>[2,)<version>
                            <!-- Scope defaults to "compile":
                            <scope>test<scope>
                              Use a classifier to pull one of our alternative jars:
                            <classifier>jdk5<classifier>
                            -->
                          <dependency>

                  Example 15.11. Sample Range Gradle Dependency

                      dependencies.compile (group: 'org.hsqldb', name: 'hsqldb', version:'[2,)', classifier: 'jdk5')
                      dependencies {
                          runtime 'org.hsqldb:hsqldb:[2,):jdk6debug@jar',
                                  'org.hsqldb:sqltool:[2,):jdk6debug@jar'
                      }

                  If you want to use an ivy.xml file with a Gradle build, you will need use the Ivyxml Gradle Plugin. It just takes a few links of code in your build.gradle file to hook in ivyxml. See the Ivyxml documentation to see exactly how.

                  Example 15.12. Sample Range ivy.xml loaded by Ivyxml plugin

                      <ivy-module version="2.0" xmlns:m="http://ant.apache.org/ivy/maven">
                      ...
                      <dependency org="org.hsqldb" name="hsqldb" rev="[2,)" m:classifier="jdk5"/>


                  Example 15.13. Sample Range Groovy Dependency, using Grape

                  @Grab(group='org.hsqldb', module='hsqldb', version='[2,)', classifier='jdk6debug')


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/sessions-chapt.html0000644000175000017500000014772512007567744021632 0ustar renerene Chapter 3. Sessions and Transactions

                  Chapter 3. Sessions and Transactions

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 4903 $

                  Copyright 2010-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  Overview

                  All SQL statements are executed in sessions. When a connection is established to the database, a session is started. The authorization of the session is the name of the user that started the session. A session has several properties. These properties are set by default at the start according to database settings.

                  SQL Statements are generally transactional statements. When a transactional statement is executed, it starts a transaction if no transaction is in progress. If SQL Data is modified during a transaction, the change can be undone with a ROLLBACK statement. When a COMMIT statement is executed, the transaction is ended. If a single statement fails, the transaction is not normally terminated. However, some failures are caused by execution of statements that are in conflict with statements executed in other concurrent sessions. Such failures result in an implicit ROLLBACK, in addition to the exception that is raised.

                  Schema definition and manipulation statements are also transactional according to the SQL Standard. HyperSQL 2.0 performs automatic commits before and after the execution of such transactions. Therefore, schema-related statements cannot be rolled back. This is likely to change in future versions.

                  Some statements are not transactional. Most of these statements are used to change the properties of the session. These statements begin with the SET keyword.

                  If the AUTOCOMMIT property of a session is TRUE, then each transactional statement is followed by an implicit COMMIT.

                  The default isolation level for a session is READ COMMITTED. This can be changed using the JDBC java.sql.Connection object and its setTransactionIsolation(int level) method. The session can be put in read-only mode using the setReadOnly(boolean readOnly) method. Both methods can be invoked only after a commit or a rollback, but not during a transaction.

                  The isolation level and / or the readonly mode of a transaction can also be modified using an SQL statement. You can use the statement to change only the isolation mode, only the read-only mode, or both at the same time. This command can be issued only after a commit or rollback.

                  SET TRANSACTION <transaction characteristic> [ <comma> <transaction characteristic> ]

                  Details of the statement is described later in this chapter.

                  Session Attributes and Variables

                  Each session has several system attributes. A session can also have user-defined session variables.

                  Session Attributes

                  The system attributes reflect the current mode of operation for the session. These attributes can be accessed with function calls and can be referenced in queries. For example, they can be returned using the VALUES <attribute function>, ... statement.

                  The named attributes such as CURRENT_USER, CURRENT_SCHEMA, etc. are SQL Standard functions. Other attributes of the session, such as auto-commit or read-only modes can be read using other built-in functions. All these functions are listed in the Built In Functions chapter.

                  Session Variables

                  Session variables are user-defined variables created the same way as the variables for stored procedures and functions. Currently, these variables cannot be used in general SQL statements. They can be assigned to IN, INOUT and OUT parameters of stored procedures. This allows calling stored procedures which have INOUT or OUT arguments and is useful for development and debugging. See the example in the SQL-Invoked Routines chapter, under Formal Parameters.

                  Example 3.1. User-defined Session Variables

                    DECLARE counter INTEGER DEFAULT 3;
                    DECLARE result VARCHAR(20) DEFAULT NULL;
                    SET counter=15;
                    CALL myroutine(counter, result)
                  

                  Session Tables

                  With necessary access privileges, sessions can access all table, including GLOBAL TEMPORARY tables, that are defined in schemas. Although GLOBAL TEMPORARY tables have a single name and definition which applies to all sessions that use them, the contents of the tables are different for each session. The contents are cleared either at the end of each transaction or when the session is closed.

                  Session tables are different because their definition is visible only within the session that defines a table. The definition is dropped when the session is closed. Session tables do not belong to schemas.

                  <temporary table declaration> ::= DECLARE LOCAL TEMPORARY TABLE <table name> <table element list> [ ON COMMIT { PRESERVE | DELETE } ROWS ]

                  The syntax for declaration is based on the SQL Standard. A session table cannot have FOREIGN KEY constraints, but it can have PRIMARY KEY, UNIQUE or CHECK constraints. A session table definition cannot be modified by adding or removing columns, indexes, etc.

                  It is possible to refer to a session table using its name, which takes precedence over a schema table of the same name. To distinguish a session table from schema tables, the pseudo schema names, MODULE or SESSION can be used. An example is given below:

                  Example 3.2. User-defined Temporary Session Tables

                    DECLARE LOCAL TEMPORARY TABLE buffer (id INTEGER PRIMARY KEY, textdata VARCHAR(100)) ON COMMIT PRESERVE ROWS
                    INSERT INTO module.buffer SELECT id, firstname || ' ' || lastname FROM customers
                    -- do some more work
                    DROP TABLE module.buffer
                    -- or use alternative pseudo schema name
                    DROP TABLE session.buffer
                  


                  Session tables can be created inside a transaction. Automatic indexes are created and used on session tables when necessary for a query or other statement. By default, session table data is held in memory. This can be changed with the SET SESSION RESULT MEMORY ROWS statement.

                  Transactions and Concurrency Control

                  HyperSQL 2.0 has been fully redesigned to support different transaction isolation models. It no longer supports the old 1.8.x model with "dirty read". Although it is perfectly possible to add an implementation of the transaction manager that supports the legacy model, we thought this is no longer necessary. The new system allows you to select the transaction isolation model while the engine is running. It also allows you to choose different isolation levels for different simultaneous sessions.

                  HyperSQL 2.0 supports three concurrency control models, two-phase-locking (2PL), which is the default, multiversion concurrency control (MVCC) and a hybrid model, which is 2PL plus multiversion rows. Within each model, it supports some of the 4 standard levels of transaction isolation: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ and SERIALIZABLE. The concurrency control model is a strategy that governs all the sessions and is set for the database, as opposed for individual sessions. The isolation level is a property of each SQL session, so different sessions can have different isolation levels. In the new implementation, all isolation levels avoid the "dirty read" phenomenon and do not read uncommitted changes made to rows by other transactions.

                  HyperSQL is fully multi threaded in all transaction models. Sessions continue to work simultaneously and can fully utilise multi-core processors.

                  To concurrency control model of a live database can be changed. The SET DATABASE TRANSACTION CONTROL { LOCKS | MVLOCKS | MVCC } can be used by a user with the DBA role.

                  Two Phase Locking

                  The two-phase locking model is the default mode. It is referred to by the keyword, LOCKS. In the 2PL model, each table that is read by a transaction is locked with a shared lock (read lock), and each table that is written to is locked with an exclusive lock (write lock). If two sessions read and modify different tables then both go through simultaneously. If one session tries to lock a table that has been locked by the other, if both locks are shared locks, it will go ahead. If either of the locks is an exclusive lock, the engine will put the session in wait until the other session commits or rolls back its transaction. In some cases the engine will invalidate the transaction of the current session, if the action would result in deadlock.

                  HyperSQL also supports explicit locking of a group of tables for the duration of the current transaction. Use of this command blocks access to the locked tables by other sessions and ensures the current session can complete the intended reads and writes on the locked tables.

                  If a table is read-only, it will not be locked by any transaction.

                  The READ UNCOMMITTED isolation level can be used in 2PL modes for read-only operations. It is the same as READ COMMITTED plus read only.

                  The READ COMMITTED isolation level is the default. It keeps write locks on tables until commit, but releases the read locks after each operation.

                  The REPEATABLE READ level is upgraded to SERIALIZABLE. These levels keep both read and write locks on tables until commit.

                  It is possible to perform some critical operations at the SERIALIZABLE level, while the rest of the operations are performed at the READ COMMITTED level.

                  Note: two phase locking refers to two periods in the life of a transaction. In the first period, locks are acquired, in the second period locks are released. No new lock is acquired after releasing a lock.

                  Two Phase Locking with Snapshot Isolation

                  This model is referred to as MVLOCKS. It works the same way as normal 2PL as far as updates are concerned.

                  SNAPSHOT ISOLATION is a multiversion concurrency strategy which uses the snapshot of the whole database at the time of the start of the transaction. In this model, read only transactions use SNAPSHOT ISOLATION. While other sessions are busy changing the database, the read only session sees a consistent view of the database and can access all the tables even when they are locked by other sessions for updates.

                  There are many applications for this mode of operation. In heavily updated data sets, this mode allows uninterrupted read access to the data.

                  Lock Contention in 2PL

                  When multiple connections are used to access the database, the transaction manager controls their activities. When each transaction performs only reads or writes on a single table, there is no contention. Each transaction waits until it can obtain a lock then performs the operation and commits. All contentions occur when transactions perform reads and writes on more than one table, or perform a read, followed by a write, on the same table.

                  For example, when sessions are working at the SERIALIZABLE level, when multiple sessions first read from a table in order to check if a row exists, then insert a row into the same table when it doesn't exist, there will be regular contention. Transaction A reads from the table, then does Transaction B. Now if either Transaction A or B attempts to insert a row, it will have to be terminated as the other transaction holds a shared lock on the table. If instead of two operations, a single MERGE statement is used to perform the read and write, no contention occurs because both locks are obtained at the same time.

                  Alternatively, there is the option of obtaining the necessary locks with an explicit LOCK TABLE statement. This statement should be executed before other statements and should include the names of all the tables and the locks needed. After this statement, all the other statements in the transaction can be executed and the transaction committed. The commit will remove all the locks.

                  HyperSQL detects deadlocks before attempting to execute a statement. When a lock is released after the completion of the statement, the first transaction that is waiting for the lock is allowed to continue.

                  HyperSQL is fully multi threaded. It therefore allows different transactions to execute concurrently so long as they are not waiting to lock the same table for write.

                  Locks in SQL Routines and Triggers

                  In both LOCKS and MVLOCKS models, SQL routines (functions and procedures) and triggers obtain all the read and write locks at the beginning of the routine execution. SQL statements contained in the routine or trigger are all executed without deadlock as all the locks have already been obtained. At the end of execution of the routine or trigger, read locks are released if the session isolation level is READ COMMITTED.

                  MVCC

                  In the MVCC model, there are no shared, read locks. Exclusive locks are used on individual rows, but their use is different. Transactions can read and modify the same table simultaneously, generally without waiting for other transactions. The SQL Standard isolation levels are used by the user's application, but these isolation levels are translated to the MVCC isolation levels READ CONSISTENCY or SNAPSHOT ISOLATION.

                  When transactions are running at READ COMMITTED level, no conflict will normally occur. If a transaction that runs at this level wants to modify a row that has been modified by another uncommitted transaction, then the engine puts the transaction in wait, until the other transaction has committed. The transaction then continues automatically. This isolation level is called READ CONSISTENCY.

                  Deadlock is completely avoided. In theory conflict is possible if each transaction is waiting for a different row modified by the other transaction. In this case, one of the transactions is immediately terminated (rolled back) unless the setting has been changed with the <set database transaction rollback on conflict statement>. When this setting is changed to FALSE, the session that avoided executing the deadlock-causing statement returns an error, but without rolling back the previous actions. This will cause the other transaction to wait for the current transaction. The property should not be changed unless the application can quickly perform an alternative statement to continue or roll back the transaction. This allows maximum flexibility and compatibility with other database engines which do not roll back the transaction upon deadlock.

                  When transactions are running in REPEATABLE READ or SERIALIZABLE isolation levels, conflict is more likely to happen. There is no difference in operation between these two isolation levels. This isolation level is called SNAPSHOT ISOLATION.

                  In this mode, when the duration of two transactions overlaps, if one of the transactions has modified a row and the second transaction wants to modify the same row, the action of the second transaction will fail. The engine will invalidate the second transaction and roll back all its changes. If the setting is changed to false with the <set database transaction rollback on conflict statement>, then the second transaction will just return an error without rolling back. The application must perform an alternative statement to continue or roll back the transaction.

                  In the MVCC model, READ UNCOMMITTED is promoted to READ COMMITTED, as the new architecture is based on multi-version rows for uncommitted data and more than one version may exist for some rows.

                  With MVCC, when a transaction only reads data, then it will go ahead and complete regardless of what other transactions may do. This does not depend on the transaction being read-only or the isolation modes.

                  Choosing the Transaction Model

                  The SQL Standard defines the isolation levels as modes of operation that avoid the three unwanted phenomena, "dirty read", "fuzzy read" and "phantom row". The "dirty read" phenomenon occurs when a session can read a row that has been changed by another session. The "fuzzy read" phenomenon occurs when a row that was read by a session is modified by another session, then the first session reads the row again. The "phantom row" phenomenon occurs when a session performs an operation that affects several rows, for example, counts the rows or modifies them using a search condition, then another session adds one or more rows that fulfil the same search condition, then the first session performs an operation that relies on the results of its last operation. According to the Standard, the SERIALIZABLE isolation level avoids all three phenomena and also ensures that all the changes performed during a transaction can be considered as a series of uninterrupted changes to the database without any other transaction changing the database at all for the duration of these actions. The changes made by other transactions are considered to occur before the SERIALIZABLE transaction starts, or after it ends. The READ COMMITTED level avoids "dirty read" only, while the REPEATABLE READ level avoids "dirty read" and "fuzzy read", but not "phantom row".

                  The Standard allows the engine to return a higher isolation level than requested by the application. HyperSQL promotes a READ UNCOMMITTED request to READ COMMITTED and promotes a REPEATABLE READ request to SERIALIZABLE.

                  The MVCC model is not covered directly by the Standard. Research has established that the READ CONSISTENCY level fulfils the requirements of (and is stronger than) the READ COMMITTED level. The SNAPSHOT ISOLATION level is stronger than the READ CONSISTENCY level. It avoids the three anomalies defined by the Standard, and is therefore stronger than the REPEATABLE READ level as defined by the Standard. When operating with the MVCC model, HyperSQL treats a REPEATABLE READ or SERIALIZABLE setting for a transaction as SNAPSHOT ISOLATION.

                  All modes can be used with as many simultaneous connections as required. The default 2PL model is fine for applications with a single connection, or applications that do not access the same tables heavily for writes. With multiple simultaneous connections, MVCC can be used for most applications. Both READ CONSISTENCY and SNAPSHOT ISOLATION levels are stronger than the corresponding READ COMMITTED level in the 2PL mode. Some applications require SERIALIZABLE transactions for at least some of their operations. For these applications, one of the 2PL modes can be used. It is possible to switch the concurrency model while the database is operational. Therefore, the model can be changed for the duration of some special operations, such as synchronization with another data source.

                  All concurrency models are very fast in operation. When data change operations are mainly on the same tables, the MVCC model may be faster, especially with multi-core processors.

                  Schema and Database Change

                  There are a few SQL statements that must access a consistent state of the database during their executions. These statements, which include CHECKPOINT and BACKUP, put an exclusive lock on all the tables of the database when they start.

                  Some schema manipulation statements put an exclusive lock on one or more tables. For example changing the columns of a table locks the table exclusively.

                  In the MVCC model, all statements that need an exclusive lock on one or more tables, put an exclusive lock on the database catalog until they complete.

                  The effect of these exclusive locks is similar to the execution of data manipulation statements with write locks. The session that is about to execute the schema change statement waits until no other session is holding a lock on any of the objects. At this point it starts its operation and locks the objects to prevents any other session from accessing the locked objects. As soon as the operation is complete, the locks are all removed.

                  Simultaneous Access to Tables

                  It was mentioned that there is no limit on the number of sessions that can access the tables and all sessions work simultaneously in multi threaded execution. However there are internal resources that are shared. Simultaneous access to these resources can reduce the overall efficiency of the system. MEMORY and TEXT tables do not share resources and do not block multi threaded access. With CACHED tables, each row change operation blocks the file and its cache momentarily until the operation is finished. This is done separately for each row, therefore a multi-row INSERT, UPDATE, or DELETE statement will allow other sessions to access the file during its execution. With CACHED tables, SELECT operations do not block each other, but selecting from different tables and different parts of a large table causes the row cache to be updated frequently and will reduce overall performance.

                  The new access pattern is the opposite of the access pattern of version 1.8.x. In the old version, even when 20 sessions are actively reading and writing, only a single session at a time performs an SQL statement completely, before the next session is allowed access. In the new version, while a session is performing a SELECT statement and reading rows of a CACHED table to build a result set, another session may perform an UPDATE statement that reads and writes rows of the same table. The two operations are performed without any conflict, but the row cache is updated more frequently than when one operation is performed after the other operation has finished.

                  Viewing Sessions

                  As HyperSQL is multithreaded, you can view the current sessions and their state from any admin session. The INFORMATION_SCHEMA.SYSTEM_SESSIONS table contains the list of open sessions, their unique ids and the statement currently executed or waiting to be executed by each session. For each session, it displays the list of sessions that are waiting for it to commit, or the session that this session is waiting for.

                  Session and Transaction Control Statements

                  ALTER SESSION

                  alter session statement

                  <alter session statement> ::= ALTER SESSION <numeric literal> { CLOSE | RELEASE }

                  <alter current session statement> ::= ALTER SESSION RESET { ALL | RESULT SETS | TABLE DATA }

                  The <alter session statement> is used by an administrator to close another session or to release the transaction in another session. When a session is released, its current transaction is terminated with a failure. The session remains open. This statement is different from the other statements discussed in this chapter as it is not used for changing the settings of the current session.

                  The session ID is used as a <numeric literal> in this statement. The administrator can use the INFORMATION_SCHEMA.SYSTEM_SESSIONS table to find the session IDs of other sessions.

                  The <alter current session statement> is used to clear and reset different states of the current session. When ALL is specified, the current transaction is rolled back, the session settings such as time zone, current schema etc. are restored to their original state at the time the session was opened and all open result sets are closed and temporary tables cleared. When RESULT SETS is specified, all currently open result sets are closed and the resources are released. When TABLE DATA is specified, the data in all temporary tables is cleared.

                  SET AUTOCOMMIT

                  set autocommit command

                  <set autocommit statement> ::= SET AUTOCOMMIT { TRUE | FALSE }

                  When an SQL session is started by creating a JDBC connection, it is in AUTOCOMMIT mode. In this mode, after each SQL statement a COMMIT is performed automatically. This statement changes the mode. It is equivalent to using the setAutoCommit( boolean autoCommit) method of the JDBC Connection object.

                  START TRANSACTION

                  start transaction statement

                  <start transaction statement> ::= START TRANSACTION [ <transaction characteristics> ]

                  Start an SQL transaction and set its characteristics. All transactional SQL statements start a transaction automatically, therefore using this statement is not necessary. If the statement is called in the middle of a transaction, an exception is thrown.

                  SET TRANSACTION

                  set next transaction characteristics

                  <set transaction statement> ::= SET [ LOCAL ] TRANSACTION <transaction characteristics>

                  Set the characteristics of the next transaction in the current session. This statement has an effect only on the next transactions and has no effect on the future transactions after the next.

                  transaction characteristics

                  transaction characteristics

                  <transaction characteristics> ::= [ <transaction mode> [ { <comma> <transaction mode> }... ] ]

                  <transaction mode> ::= <isolation level> | <transaction access mode> | <diagnostics size>

                  <transaction access mode> ::= READ ONLY | READ WRITE

                  <isolation level> ::= ISOLATION LEVEL <level of isolation>

                  <level of isolation> ::= READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE

                  <diagnostics size> ::= DIAGNOSTICS SIZE <number of conditions>

                  <number of conditions> ::= <simple value specification>

                  Specify transaction characteristics.

                  Example 3.3. Setting Transaction Characteristics

                    SET TRANSACTION READ ONLY
                    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
                    SET TRANSACTION READ WRITE, ISOLATION LEVEL READ COMMITTED
                  

                  SET CONSTRAINTS

                  set constraints mode statement

                  <set constraints mode statement> ::= SET CONSTRAINTS <constraint name list> { DEFERRED | IMMEDIATE }

                  <constraint name list> ::= ALL | <constraint name> [ { <comma> <constraint name> }... ]

                  If the statement is issued during a transaction, it applies to the rest of the current transaction. If the statement is issued when a transaction is not active then it applies only to the next transaction in the current session. HyperSQL does not yet support this feature.

                  LOCK TABLE

                  lock table statement

                  <lock table statement> ::= LOCK TABLE <table name> { READ | WRITE} [, <table name> { READ | WRITE} ...]}

                  In some circumstances, where multiple simultaneous transactions are in progress, it may be necessary to ensure a transaction consisting of several statements is completed, without being terminated due to possible deadlock. When this statement is executed, it waits until it can obtain all the listed locks, then returns. If obtaining the locks would result in a deadlock an error is raised. The SQL statements following this statements use the locks already obtained (and obtain new locks if necessary) and can proceed without waiting. All the locks are released when a COMMIT or ROLLBACK statement is issued.

                  When the isolation level of a session is READ COMMITTED, read locks are released immediately after the execution of the statement, therefore you should use only WRITE locks in this mode. Alternatively, you can switch to the SERIALIZABLE isolation mode before locking the tables for the specific transaction that needs to finish consistently and without a deadlock. It is best to execute this statement at the beginning of the transaction with the complete list of required read and write locks.

                  Currently, this command does not have any effect when the database transaction control model is MVCC.

                  Example 3.4. Locking Tables

                    LOCK TABLE table_a WRITE, table_b READ

                  SAVEPOINT

                  savepoint statement

                  <savepoint statement> ::= SAVEPOINT <savepoint specifier>

                  <savepoint specifier> ::= <savepoint name>

                  Establish a savepoint. This command is used during an SQL transaction. It establishes a milestone for the current transaction. The SAVEPOINT can be used at a later point in the transaction to rollback the transaction to the milestone.

                  RELEASE SAVEPOINT

                  release savepoint statement

                  <release savepoint statement> ::= RELEASE SAVEPOINT <savepoint specifier>

                  Destroy a savepoint. This command is rarely used as it is not very useful. It removes a SAVEPOINT that has already been defined.

                  COMMIT

                  commit statement

                  <commit statement> ::= COMMIT [ WORK ] [ AND [ NO ] CHAIN ]

                  Terminate the current SQL-transaction with commit. This make all the changes to the database permanent.

                  ROLLBACK

                  rollback statement

                  <rollback statement> ::= ROLLBACK [ WORK ] [ AND [ NO ] CHAIN ]

                  Rollback the current SQL transaction and terminate it. The statement rolls back all the actions performed during the transaction. If NO CHAIN is specified, a new SQL transaction is started just after the rollback. The new transaction inherits the properties of the old transaction.

                  ROLLBACK TO SAVEPOINT

                  rollback statement

                  <rollback statement> ::= ROLLBACK [ WORK ] TO SAVEPOINT <savepoint specifier>

                  Rollback part of the current SQL transaction and continue the transaction. The statement rolls back all the actions performed after the specified SAVEPOINT was created. The same effect can be achieved with the rollback( Savepoint savepoint) method of the JDBC Connection object.

                  Example 3.5. Rollback

                    -- perform some inserts, deletes, etc.
                    SAVEPOINT A
                    -- perform some inserts, deletes, selects etc.
                    ROLLBACK WORK TO SAVEPOINT A
                    -- all the work after the declaration of SAVEPOINT A is rolled back
                  

                  DISCONNECT

                  disconnect statement

                  <disconnect statement> ::= DISCONNECT

                  Terminate the current SQL session. Closing a JDBC connection has the same effect as this command.

                  SET SESSION CHARACTERISTICS

                  set session characteristics statement

                  <set session characteristics statement> ::= SET SESSION CHARACTERISTICS AS <session characteristic list>

                  <session characteristic list> ::= <session characteristic> [ { <comma> <session characteristic> }... ]

                  <session characteristic> ::= <session transaction characteristics>

                  <session transaction characteristics> ::= TRANSACTION <transaction mode> [ { <comma> <transaction mode> }... ]

                  Set one or more characteristics for the current SQL-session. This command is used to set the transaction mode for the session. This endures for all transactions until the session is closed or the next use of this command. The current read-only mode can be accessed with the ISREADONLY() function.

                  Example 3.6. Setting Session Characteristics

                    SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY
                    SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE
                    SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE, ISOLATION LEVEL READ COMMITTED
                  

                  SET SESSION AUTHORIZATION

                  set session user identifier statement

                  <set session user identifier statement> ::= SET SESSION AUTHORIZATION <value specification>

                  Set the SQL-session user identifier. This statement changes the current user. The user that executes this command must have the CHANGE_AUTHORIZATION role, or the DBA role. After this statement is executed, all SQL statements are executed with the privileges of the new user. The current authorisation can be accessed with the CURRENT_USER and SESSION_USER functions.

                  Example 3.7. Setting Session Authorization

                    SET SESSION AUTHORIZATION 'FELIX'
                    SET SESSION AUTHORIZATION SESSION_USER
                  

                  SET ROLE

                  set role statement

                  <set role statement> ::= SET ROLE <role specification>

                  <role specification> ::= <value specification> | NONE

                  Set the SQL-session role name and the current role name for the current SQL-session context. The user that executes this command must have the specified role. If NONE is specified, then the previous CURRENT_ROLE is eliminated. The effect of this lasts for the lifetime of the session. The current role can be accessed with the CURRENT_ROLE function.

                  SET TIME ZONE

                  set local time zone statement

                  <set local time zone statement> ::= SET TIME ZONE <set time zone value>

                  <set time zone value> ::= <interval value expression> | LOCAL

                  Set the current default time zone displacement for the current SQL-session. When the session starts, the time zone displacement is set to the time zone of the client. This command changes the time zone displacement. The effect of this lasts for the lifetime of the session. If LOCAL is specified, the time zone displacement reverts to the local time zone of the session.

                  Example 3.8. Setting Session Time Zone

                    SET TIME ZONE LOCAL
                    SET TIME ZONE INTERVAL '+6:00' HOUR TO MINUTE
                  

                  SET CATALOG

                  set catalog statement

                  <set catalog statement> ::= SET <catalog name characteristic>

                  <catalog name characteristic> ::= CATALOG <value specification>

                  Set the default schema name for unqualified names used in SQL statements that are prepared or executed directly in the current sessions. As there is only one catalog in the database, only the name of this catalog can be used. The current catalog can be accessed with the CURRENT_CATALOG function.

                  SET SCHEMA

                  set schema statement

                  <set schema statement> ::= SET <schema name characteristic>

                  <schema name characteristic> ::= SCHEMA <value specification> | <schema name>

                  Set the default schema name for unqualified names used in SQL statements that are prepared or executed directly in the current sessions. The effect of this lasts for the lifetime of the session. The SQL Standard form requires the schema name as a single-quoted string. HyperSQL also allows the use of the identifier for the schema. The current schema can be accessed with the CURRENT_SCHEMA function.

                  SET PATH

                  set path statement

                  <set path statement> ::= SET <SQL-path characteristic>

                  <SQL-path characteristic> ::= PATH <value specification>

                  Set the SQL-path used to determine the subject routine of routine invocations with unqualified routine names used in SQL statements that are prepared or executed directly in the current sessions. The effect of this lasts for the lifetime of the session.

                  SET MAXROWS

                  set max rows statement

                  <set max rows statement> ::= SET MAXROWS <unsigned integer literal>

                  The normal operation of the session has no limit on the number of rows returned from a SELECT statement. This command set the maximum number of rows of the result returned by executing queries.

                  This statement has a similar effect to the setMaxRows(int max) method of the JDBC Statement interface, but it affects the results returned from the next statement execution only. After the execution of the next statement, the MAXROWS limit is removed.

                  Only zero or positive values can be used with this command. The value overrides any value specified with setMaxRows(int max) method of a JDBC statement. The statement SET MAXROWS 0 means no limit.

                  It is possible to limit the number of rows returned from SELECT statements with the FETCH <n> ROWS ONLY, or its alternative, LIMIT <n>. Therefore this command is not recommended for general use. The only legitimate use of this command is for checking and testing queries that may return very large numbers of rows.

                  SET SESSION RESULT MEMORY ROWS

                  set session result memory rows statement

                  <set session result memory rows statement> ::= SET SESSION RESULT MEMORY ROWS <unsigned integer literal>

                  By default the session uses memory to build result sets, subquery results and temporary tables. This command sets the maximum number of rows of the result (and temporary tables) that should be kept in memory. If the row count of the result or temporary table exceeds the setting, the result is stored on disk. The default is 0, meaning all result sets are held in memory.

                  This statement applies to the current session only. The general database setting is:

                  SET DATABASE DEFAULT RESULT MEMORY ROWS <unsigned integer literal>

                  SET IGNORECASE

                  set ignore case statement

                  <set ignore case statement> ::= SET IGNORECASE { TRUE | FALSE }

                  Sets the type used for new VARCHAR table columns. By default, character columns in new databases are case sensitive. If SET IGNORECASE TRUE is used, all VARCHAR columns in new tables are set to VARCHAR_IGNORECASE. It is possible to specify the VARCHAR_IGNORECASE type for the definition of individual columns. So it is possible to have some columns case sensitive and some not, even in the same table. This statement must be switched before creating tables. Existing tables and their data are not affected.


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/texttables-chapt.html0000644000175000017500000005470112007567744022132 0ustar renerene Chapter 5. Text Tables

                  Chapter 5. Text Tables

                  Text Tables as a Standard Feature of Hsqldb

                  Bob Preston

                  The HSQL Development Group

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 4903 $

                  Copyright 2002-2012 Bob Preston and Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  Overview

                  Text Table support for HSQLDB was originally developed by Bob Preston independently from the Project. Subsequently Bob joined the Project and incorporated this feature into version 1.7.0, with a number of enhancements, especially the use of conventional SQL commands for specifying the files used for Text Tables.

                  In a nutshell, Text Tables are CSV or other delimited files treated as SQL tables. Any ordinary CSV or other delimited file can be used. The full range of SQL queries can be performed on these files, including SELECT, INSERT, UPDATE and DELETE. Indexes and unique constraints can be set up, and foreign key constraints can be used to enforce referential integrity between Text Tables themselves or with conventional tables.

                  The delimited file can be created by the engine, or an existing file can be used.

                  HyperSQL with Text Table support is the only comprehensive solution that employs the power of SQL and the universal reach of JDBC to handle data stored in text files.

                  The Implementation

                  Definition of Tables

                  Text Tables are defined similarly to conventional tables with the added TEXT keyword:

                      CREATE TEXT TABLE <tablename> (<column definition> [<constraint definition>])

                  The table is at first empty and cannot be written to. An additional SET command specifies the file and the separator character that the Text table uses:

                     SET TABLE <tablename> SOURCE <quoted_filename_and_options> [DESC]

                  Scope and Reassignment

                  • A Text table without a file assigned to it is READ ONLY and EMPTY.

                  • Reassigning a Text Table definition to a new file has implications in the following areas:

                    1. The user is required to be an administrator.

                    2. Existing transactions are committed at this point.

                    3. Constraints, including foreign keys referencing this table, are kept intact. It is the responsibility of the administrator to ensure their integrity.

                    The new source file is scanned and indexes are built when it is assigned to the table. At this point any violation of NOT NULL, UNIQUE or PRIMARY KEY constraints are caught and the assignment is aborted. However, foreign key constraints are not checked at the time of assignment or reassignment of the source file.

                  Null Values in Columns of Text Tables

                  • Empty fields are treated as NULL. These are fields where there is nothing or just spaces between the separators.

                  • Quoted empty strings are treated as empty strings.

                  Configuration

                  The default field separator is a comma (,). A different field separator can be specified within the SET TABLE SOURCE statement. For example, to change the field separator for the table mytable to a vertical bar, place the following in the SET TABLE SOURCE statement, for example:

                      SET TABLE mytable SOURCE "myfile;fs=|"

                  Since HSQLDB treats CHAR and VARCHAR strings the same, the ability to assign a different separator to the latter is provided. When a different separator is assigned to a VARCHAR, it will terminate any CSV field of that type. For example, if the first field is CHAR, and the second field VARCHAR, and the separator fs has been defined as the pipe (|) and vs as the period (.) then the data in the CSV file for a row will look like:

                      First field data|Second field data.Third field data

                  This facility in effect offers an extra, special separator which can be used in addition to the global separator. The following example shows how to change the default separator to the pipe (|), VARCHAR separator to the period (.) within a SET TABLE SOURCE statement:

                      SET TABLE mytable SOURCE "myfile;fs=|;vs=."

                  HSQLDB also recognises the following special indicators for separators:

                  special indicators for separators

                  \semi

                  semicolon

                  \quote

                  single-quote

                  \space

                  space character

                  \apos

                  apostrophe

                  \n

                  newline - Used as an end anchor (like $ in regular expressions)

                  \r

                  carriage return

                  \t

                  tab

                  \\

                  backslash

                  \u####

                  a Unicode character specified in hexadecimal

                  Furthermore, HSQLDB provides csv file support with three additional boolean options: ignore_first, quoted and all_quoted. The ignore_first option (default false) tells HSQLDB to ignore the first line in a file. This option is used when the first line of the file contains column headings. The all_quoted option (default false) tells the program that it should use quotes around all character fields when writing to the source file. The quoted option (default true) uses quotes only when necessary to distinguish a field that contains the separator character. It can be set to false to prevent the use of quoting altogether and treat quote characters as normal characters. These options may be specified within the SET TABLE SOURCE statement:

                      SET TABLE mytable SOURCE "myfile;ignore_first=true;all_quoted=true"

                  When the default options all_quoted= false and quoted=true are in force, fields that are written to a line of the csv file will be quoted only if they contain the separator or the quote character. The quote character is doubled when used inside a string. When all_quoted=false and quoted=false the quote character is not doubled. With this option, it is not possible to insert any string containing the separator into the table, as it would become impossible to distinguish from a separator. While reading an existing data source file, the program treats each individual field separately. It determines that a field is quoted only if the first character is the quote character. It interprets the rest of the field on this basis.

                  The character encoding for the source file is ASCII by default. To support UNICODE or source files prepared with different encodings this can be changed to UTF-8 or any other encoding. The default is encoding=ASCII and the option encoding=UTF-8 or other supported encodings can be used.

                  Finally, HSQLDB provides the ability to read a text file as READ ONLY, by placing the keyword "DESC" at the end of the SET TABLE SOURCE statement:

                      SET TABLE mytable SOURCE "myfile" DESC

                  Text table source files are cached in memory. The maximum number of rows of data that are in memory at any time is controlled by the cache_rows property. The default value for cache_rows is 1000 and can be changed by setting the default database property .The cache_size property sets the maximum amount of memory used for each text table. The default is 100 KB. The properties can be set for individual text tables. These properties do not control the maximum size of each text table, which can be much larger. An example is given below:

                      SET TABLE mytable SOURCE "myfile;ignore_first=true;all_quoted=true;cache_rows=10000;cache_size=1000"

                  The properties used in earlier versions, namely the textdb.cache_scale and the textdb.cache_size_scale can still be used.

                  Disconnecting Text Tables

                  Text tables may be disconnected from their underlying data source, i.e. the text file.

                  You can explicitly disconnect a text table from its file by issuing the following statement:

                      SET TABLE mytable SOURCE OFF

                  Subsequently, mytable will be empty and read-only. However, the data source description will be preserved, and the table can be re-connected to it with

                      SET TABLE mytable SOURCE ON

                  When a database is opened, if the source file for an existing text table is missing the table remains disconnected from its data source, but the source description is preserved. This allows the missing source file to be added to the directory and the table re-connected to it with the above command.

                  Disconnecting text tables from their source has several uses. While disconnected, the text source can be edited outside HSQLDB provided data integrity is respected. When large text sources are used, and several constraints or indexes need to be created on the table, it is possible to disconnect the source during the creation of constraints and indexes and reduce the time it takes to perform the operation.

                  Text File Usage

                  The following information applies to the usage of text tables.

                  Text File Issues

                  • File locations are restricted to below the directory that contains the database, unless the textdb.allow_full_path property is set true as a Java system property. This feature is for security, otherwise an admin database user may be able to open random files. The specified text source path is interpreted differently according to this property. By default, the path is interpreted as a relative path to the directory path of database files, it therefore cannot contain the double dot notation for parent directory. This path is then appended by the engine to the directory path to form a full path. When the property is true, the path is not appended to the directory path and is used as it is to open the file. In this usage the path can be relative or absolute.

                  • All-in-memory databases can use text tables. In this usage, the path must be an absolute path. These text tables are always read only. To disable this capability for access control reasons, the textdb.allow_full_path property can be set false as a Java system property.

                  • Blank lines are allowed anywhere in the text file, and are ignored.

                  • It is possible to define a primary key, identity column, unique, foreign key and check constraints for text tables.

                  • When a table source file is used with the ignore_first=true option, the first, ignored line is replaced with a blank line after a SHUTDOWN COMPACT, unless the SOURCE HEADER statement has been used.

                  • An existing table source file may include CHARACTER fields that do not begin with the quote character but contain instances of the quote character. These fields are read as literal strings. Alternatively, if any field begins with the quote character, then it is interpreted as a quoted string that should end with the quote character and any instances of the quote character within the string is doubled. When any field containing the quote character or the separator is written out to the source file by the program, the field is enclosed in quote character and any instance of the quote character inside the field is doubled.

                  • Inserts or updates of CHARACTER type field values are allowed with strings that contains the linefeed or the carriage return character. This feature is disabled when both quoted and all_quoted properties are false.

                  • ALTER TABLE commands that add or drop columns or constraints (apart from check constraints) are not supported with text tables that are connected to a source. First use the SET TABLE <name> SOURCE OFF, make the changes, then turn the source ON.

                  Text File Global Properties

                  The database engine uses a set of defaults for text table properties. Each table's data source may override these defaults. It is also possible to override the defaults globally, so they apply to all text tables. The statement SET DATABASE TEXT TABLE DEFAULTS <properties string> can be used to override the default global properties. An example is given below:

                      SET DATABASE TEXT TABLE DEFAULTS 'all_quoted=true;encoding=UTF-8;cache_rows=10000;cache_size=2000'

                  List of supported global properties

                  • fs=,

                  • vs=,

                  • quoted=false

                  • all_quoted=false

                  • ignore_first=false

                  • encoding=ASCII

                  • cache_rows=1000

                  • cache_size=100

                  • textdb.allow_full_path=false (a system property)

                  Transactions

                  Text tables fully support transactions. New or changed rows that have not been committed are not updated in the source file. Therefore the source file always contains committed rows.

                  However, text tables are not as resilient to machine crashes as other types of tables. If the crash happens while the text source is being written to, the text source may contain only some of the changes made during a committed transaction. With other types of tables, additional mechanisms ensure the integrity of the data and this situation will not arise.


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/gradle-gui.png0000644000175000017500000005577012007570374020516 0ustar renerene‰PNG  IHDR€€;9sBITÛáOà€PLTE,4ÿÿÿézƘVÿ‰~ZZÿfffÆÝ¸Ïå))ÿyÈ|±æï Á¿¾Œ›ª†¼ãÖß=89:†’žµµµ™™™cltÿæææùö´ÝÝÿµµÿ?täàßQQÿÏÞí½ÑKJIfffzŠ™ÌÌÌ™™ÿÄÙíèï÷ffÿšÃ>ÞÞÞææÿ­­­@@ÿRRRku~¿Ôæc‚¿êÊžÖÖÖ‹ŒÄÄÿ¢²Á%n³ ÿóñð÷÷ÿÇÜðÿ­­ÿZZZÞæ`ÖÛài§£ÇÇÅŶ°­„„ÿ7Y{íëéøÝmÝèó¥¥¥„„„BBBÕßîIfŸîîÿëèçÿssÿ÷÷÷I—ÐŽ·(’¬{¹Ìß´ÇÛ«ÀÔ Æç]¿æãá{{{k’"ͬ†ÊÙHffÿ™™™l‡›Q ×äñÃÖçïïïûöîÿÌÌÿí­IIÿLE\33ÿæíò¾¾ÿ||ÿ™™f333‘½ Æ5sssÜØÖ¾·´”¯‘•¦¶.ƒÇX_e¤ÁXd€”M}¶‡]‰ú pHYsØØH‘¦!tEXtSoftwareMacromedia Fireworks 4.0ê&'u IDATxœí½ {ÛÆ•6ìIQkådém­;á%ÊÎJ2mW´kËŠÚ„Nõ„d7²Ù4v¥{]넯ýäq“E–r´û×ßùž3ƒÁ?Ô¹c ÀÌ™3âÎ`¸yæÌqï+2˜3D!¨úºÆ°ÞnŸiŽ®NŒ¯òb݃£¦a˜ˆ©˜è;ªä¢§ŸGòù§~miß·ïú侸“óçhÐ;s2ÿN§dàduž^=Ú=3à;Íg÷ž5Ín³¹»ÛÙÝšŠ€3eजSPp 3Nc2ÿ­]ÊúqéágÍÖnÇI&gß>ûü~÷LœtÖyÒzçdnX:'"áäu¿b¸å§Gk@²¢à@ö€o†â[{p¾êáMäŽ>ïÚT ôâB1p,NUÍ|ð/O = ÕN kLoɤ:AMÀCÁ¿_¿Å¾æCEÀ­Ú¡:­áaÍsÎMÀ±»À‚8³ˆ8çYí/€w€Iôð'{­Ï±“þú­á¯éöè¼,ÓlêÚ;pd8¿ ,‚‚»õv{çÐIìÑÿfÉéWÿ¾J ‡“¼’»hÚZ—&w¶lò›ó¯ßZÿë[ô­Kn½¦ƒ×¾‰È2pl î¶OƒZ×I=3>_üÛª±û*§û«û:ÁšZ¯f±†‘éêÕöÎÖ£6HV¼°ÎÎï­á[o±“Y¿ Êœ<úê„a—ÿýêÑtœ1§¢àx¬Ÿ°¿dÐ^ë ^·{õÝÁz·Ýd<ª÷êë%±obúÄ¿¯¶Ö(=ºu: îÖ=¶8kjíNû5gÍ Óú°]o™dEÀ«ì4ÞºúÖááWëCzȱ»su—¡Ë¦Ú»Ww|Ó 9'$aöõÌOö4ìu~UìtFÀîî éöŒP/•}roBâK}ÂèñU½Þ¬×¿ôàɯ{»ƒ­ÞKÞ…dúêuïÑú®I¦äýäm èæ­¿n}µqþ*=ëÎI“áˆÿÝÍEÀ<ôûäSâéX˜‹€CJ¾ž¸åžÔÛt¯=·`ºß›îF\÷ ˜øÚ×ù„Ñãd@ÇÇN=xòÎîQs}k‡%ïB2uÛ[ínÓ$+þsëpýŸÿü/úïÍú?ÏïþS”9YëÔÖr°y7Îfa·É¦¾‚€í]F=Ú'Ùq}0ÅÜ7WÓRNmrúÍ„W·8=võ»œòÌYs¸Nÿ|5ä¬dêÒûïQ»k’5Ohž1üîw†€[µz³¦ÐlûžÃLÈÀ2)˜ƒi,Üjï>8¬µ9ë[Ã×í£Îƒ#àë×ÃÎ$·àœMJ;«Òéå&èÑ$M›.k™ÖŽNj»‡L²"à­Ýõõ-ÚþóŸ[ÿ<¿µ{kKu›ÝÎkNWÝÌ«b`gÁÁ$žˆÇ0Œ€ëõön­§&!õv}«êMžtúÍŒWèá$o2míÒÄæW&YðâÖ:í$(/ªBz½öúÑ£G¯kõz'wXS98 ã<O™‰Øå;„ÿ7Æx¬êSO$ë[(‰~~z8¬Ùò“É&àï·Žžÿ/ÃCz¨ u»”´ôïxü›x:<%Ó98 ½TT˜~™_@!ôKR¼pzÔj=,Öx’u¸›¶sÑj¾ÞiÓûÏëæ˜ü+Œ‚Órp"æ&ät¾³Z>%ûfM? Jzœ€5âÉŠ€onýàÖXj—ÍšÙÎØ œ˜‚Ss0“„S²pöÈlpö9O¾éèÇ éa¥AÖØp“sb| æ¤aœŠßæLH8LÌׯ©ÉçÒ/ç%Éuyc¼‡QcpR æd¢ÿÿÑ)QÏ1gżñ7gÓoª‹<ŸÆ&àÔ”œ=sò0/ £ãÕç:ñú¼¼ì+”n…pü^q" Îâž<. §¥ãUå<‰Ì/#é[œm×7=w'øšˆ™ ˆ¨H@D¥@"*Q)€ˆJDT $ ¢R • ˆ¨7ˆâA’ Xõ§H@D¥ÈAÀ;E@T1sä¶„ºK¸Ös‰lÞ?c6îÀf‡bÜ–P70‰€wÈÃpgXÈw¾QŒÛêF&°þ1ñ•oTx%§« è'`þEÑD÷¢F³¼n-˜®n$ —€†‘D*“b4_¸(’ÙPf’ifå·Žûa¸’çKH®Ñ·Í®{k†áÏWré±›·$H% Ýÿ%ËNÎÙÞ1õäêÚršÂËxÒïw†»Ç¹'Ö–³ î•¨3lŽ|¾ò”>]Ÿ€¢(¼uûáÃ{aøó=žüe#º`É~ðB#ìó ½“FÀzõ{W¯²®ã( ׇõFبe9äÿDWYo…}–Q£-X©Á³—ñ8ê*ÇÀQØê‡ý5{_Ö,kju†ÃÃãÐtËp«-t#|uGÑUUµ°’-çž”›ðø0¡å§ ãpãÙÃ7Ñ­‡ûѽ‡÷.²äUÃ?MÀ[œª·èçØI%`»9|GQs¸(+ÚÃvį^ïððÐÜ‚ëÑñaeô£Ú°cu4ð2ö£#±uwù§a﫚yM5–ÒæE¼”º¾ºûQÿxg 6Uøìñ:ü-?U˜ì…†á½/Er#:ïEÑuú·Qƒ¨vücÀ(Öè…Qj5h7².¸²>„cÀF´5Ò¡ßõël˜¨wÒ Ø<ì±:6‹vÕ8Ì?…‘XÕV†ÃQs¸k]Eë2n©Y°åÈO@Y³¦WÊPîèFøê^ytDG+ÀJ´¼Õ…›6ŽÆ&བ¼Ò{±š?<õ<|x¾…ïÁ´[pKÝÔVص£,èGròªÌØ=—îv©76û¥·Îp¥ÏƺŒú9 tä½·"çìÌ‚M®¹wªFøê5B: ÙV¢åS΂Æ à,q'Þ’Y ÊË8NÝñÇ‚H@$`‰u#5€UÔ†Ó”^* ç£n$`œ€L¸\†4RXX„ʱ€H%`QìC €ˆJ‘NÀñ‡”Ä@"*Q)€ˆJDT $ ¢R •¢Pvc˜Êb ‘€ûÛŸþMz`ÇþÅó¿fçuGÈqj!¹ó×·~ I”€7®ÿùúõëß¼}ãÆ»o?¼qãô{ãÆŸžÿãß8þñüOV^wtãwÍN§FÑéì®ß HÀS Ê›¿mmÕ;o½õ‡ßýîw»!Róp0ø‰õ€¼»úðÝwèwð§ç¿ý×_ý ůþõ·Ïÿóº£Zç+Vš–8lÖ¶\bt¼Ó„Á`}÷wýëÖë_ï2Ü©ù¸·ú.åß»«{~÷úõ?¯îY~Ÿÿço?øí>· ¸³ÓÜÚ:¯ní®uwc¼a0=q.2C_ ªÅÞ^mí¯ÿçÿþwvÉ 朄Ððþ#ϼ½ºú“5|ôί>øà“þ…3ðWï<YÝÑÚN»×ë÷êõnÇÓ y´ŒöÕa,¶˜ˆù!µ_üŸÿû‹úN·»³³V“?ÙÎG@Öý}öÓ»{ ?­®¾ ý¾Çˆ÷Ëè¹ìßYÝÑ.­m­³û€A³3ŒPIÂ"B‡‡;ac¼¥"z ½=ÚÿýâõúN­ÙivÆêï¼ûç;ƒïò®êKºý>ÿà“O>øåÿ Ï|ü Û{²º£A“‘½yHùWûÛ FÀ=(ÚÛӤŢÞШ{6ºC§h(ÃûÂTZÑŒZ!b~0`ýß/16Î ‘š€ÿûîoëÑÚoÞý ôû1¥Ý'_÷èÌsº÷1È¢³àÍ.%üá°¶öÙØ,˜Ž£H|nò)±øCõh´¾ÞÂ8E2¼¹[ÑŒjö/Ö£óÿýêíÒîh jµñfÁ¿yû7PÏÿö—·->ÿäÇ?ù:ì÷ÃÖ×tÏî©y³»¶»õz•ð³Ï¢ˆý£´Cÿ¨øCèDä™8E2¼,£á­y®ð×ûõ_?[ëR®¯Õè©9{À·ó”±ä³{_~vï§·ÿú}þ#Å×QÔøïÿ¡TüÑ& +Ó©o5ëß°½¿ù†Ý*¿ap{ÀXü!I''LŒ't‘?ô¢jüòÍÏ>ûC­ÞÜêÖ¾“€w~úãN“ÿýßÛ¿¡ûÐï{Œ€Ï)ý~|çw~üÑž„°2Íöz³ËKÇø‡?PŽýÃÆâéPýâ¡‹ìhFHÀ¹§À7hïnÕùžHÍGÀg´ |ÆhBïÅ?ÑÞúýûsʼ/þ玟ÿduG¬ÌÓöz§ÎI#àûïGÑû†€;akËˆŽ¯µ-Êð>"ì‰(TGÎ#DGó‡öÉÕ6ß©ùøþPÚÝùöýg¿ùËÛùé?Þ‡~ßï‹/Þùøcο/¾xæuGŒZÏz‡ œd1^7ˆ=ŒÅÚ9ˆú]‹€<¼Ïá¡ûÃ3¬hFHÀ¹‚ìiz”€|G¤æ#àÇ¿ÿéí;wþÇÛùË_~ÿÐÒÈ<ì½÷Å¿SRþûïõ`^wÄ~õô¬×¬¿á¿Šð[ƒñ_Å!¿ òGpÇ''m¾£Róä÷ÿûûë×ÿÇŸ~úéÎ\‡~¿ýöø½¯ÿÁñõ{½ë0¯;b}Û—Úç¿ä½Ülß# âN÷m¯sü†ï‰Ô|¼}ûéÓ7”…÷Î3<½ ýòîëÌó¯¿~~fã6ÈêŽÜ_ÁÏò„âá}ó y«{úôém¾#R‹¤ÆÂ0L屄@I>¢R • ˆ¨H@D¥@"*Q)€ˆJDTŠ,n "›€)Ñ¥WíÃ^ØïF„ zaØÐãv¿¿CHÔíóC•¬¶Ôò¤±Ã‘DAÿîô#r4 ÃÑ4ƒB:aã‘0Ðå˜]TûµnØoÂúÏnª½.íŸÝ#$ؼ¿ÿê%<~íkûûßm“€Âä0°C²y½÷÷?d‰O.]Ú”éû&YmiúËÇ¢JÄþßÁ‹Ç¢V˜ÈvÙŽ.ÁšÄpåÜþýMSH7Lµ—-Þ;»ÿø…(ªÊ:­¾…x¢ª¨sžå`Ã=œÛ£F‘ܶ ©†º‰äaÛÙF¤Ó舒ÿsLÙÕ¢Œj÷ØÁt¡ ¶….Çì¢6©õéç6à’ü‚ɧ×>'~H¯ÀÙÏÉ‹Wð˜Zœ»K¿ñ³ò2©ž°w‰æ^ûüókOè5ûîó½'"yQÉj+¯ˆ¢&Iø[_¢ªH—P¬¸ô=Ù~b ©†™6¢¤Êà«l¬Ì·tOTuγl8oc§# ;j²N©Ò_§Û>=^çFÑ‘8TÉjK;¹]éGp¨Ü†ô` ¶Ce Ë1;–Ï>!l¿D¬›y¼-˜°‹»Ž?W¦—äeR9ª¸0¿LÈåÇb+\—^ÚÉlK;˜—ÒN’~ÄvÛ“¨*Ò%T“îonÃBªaª š€:ƒVÙX+>'Úkh³ÓYº·Ï.‰Ê‘†{ü®jÆFÛj ¸yÎ7Ô TI¯^ßÁµ½½X¢¬È¯1œ½Lî^2…TÃLû\ž0ÃÀ*ë¶‚çJðDUQç<Ëd›Ï’€zÜÃ6Ÿ‡!œËdµ¥–Ã~&ÝPq®ÓŠ;€€µVx oÁ \ÉË›ûû7Y÷éýàÕGà¯ÜîoÒ½û ‡Ò¡ÞY6ªÛ{¢f‡ûû›b ÈæÒ*YmiñíWâ.¬’^¾¾ƒ—≪EÀ‰ÀGçöùmTÒ “m07n™A§°—Ô,X–u[!r…x¢ª¨sžå@°M/>S",L4´*uü(&†­Ò%€X+ˆI –«…Ý‚£0 ™”ªvкj©§€Æ H¶,å•”]hB©‘Î`WKê‹ì|p9ãʤ}›Vš8¶¤ZÒ3t7b8û9—R…«óÔ€Ë>,Ž€ ©(]ÙÙéY= ÐXZÊ+"dWp|Ê–`(qבNùzÀmO÷´ë-©–ô ÝzÈË›/?Œ‹¡xR K(ƵSØNGÀîèˆ\í‘&niVdi¬-å•”]hJ©‘Ö2)-‘ÒÉ| c@¡jº¨¸Z]xŠ•T‹'IÏ Êe¤›Dn~w7.†b­²Ü*:b-54"«åD$ÝFtP#+5w 4V€€–òJÊ® õ#)5ÒZ&-C’ú"™odKâZJU“ÐE9ê'åÉQDFªÅ“”gbÜXFºI4…ÄÅP¢U–[E@G¬%Û DVˉ" h!ýù_!ïG&¹†“_÷Í&.zê0\ï§åÎéòãI+Û;·m„(€aJ w&k}nL jšX\¢œx P€ˆJQ:‹›n$ó&šNŒ]ð)º‚„}'i©§¼TIÀ‰¹FŒR½»žÃ|™ÓÐ÷ËZø¨ÚõLAÀY²= ÿëž°,‚€¾²i$ÓpqQ$Ç‘c©\¦ÅÒq¯db‚6‹|÷=!w¯A!“Ö9[ê$÷¥BêÜe²l“ËçxïKu`(¥ä²ÔVƉ£ÿbpÒ¸OÐÉ>Ómgk¯´‚ie—*‹ej…™«G[HÀ±äX0Ô•Žy · Ú,ΠW—¡ (£,©“Ü—oÇžl’ÍÇôóÄ8SïÍ´’ËQ[i'êÝ_<¾”»E•–&™lP¦ö*€Ñ²ôKB'TVIìèѳ%àär¬#êJǽRAebÚ,ùÿý‡/Ø;‡Àe”%uRQ±„BêÊYríÉ5rV¼WãÅ”vJíW[ÐZÛAB|)v‹€r²‹€™Ú+m¡"Z]vÅèè^ʇ£G[ÌËuãf%h³ØÛYz7GBÈtNÖ{VùGYÞ§öÉ};ÓÐÕNwµSzë‹/BUyÊÙcÀTí•kaÇáŠEÄuÕØ"`^äX°Ôq¯ŽôK:Ÿ4†›››ZÝ Ð9ù¨R×^\#×XÜ+©rø¾­ärµS°Tp5aÌ–Ûmâù™Ú+«4ñ·ìPY=Ú¢`^äX&ŽEb‚6‹ÜUc@!d ,“€j,µyéy!£é •=´”\®vÊÕOc¶ªÐW™xX™Ú+pRp h‡Ê tûƒ˜mQ0/r,“ â^ÉD¿6+ ,ðÕÝï´)°tN>*…Ôvp™v5’ \E¥C1ØJ.W;ÅRìní‰/Ãn©r@_eâaej¯ÀI¡˜*+ÐíuÕØ"`>Ô0þÜœ ƒl“Yãòý¢kðžTgZ8€cãÉž¾[$ଠ˜*Çòç¦Ñ(;€Ôæcýº8xOjCe¡Q)€ˆJQ5g!Ž©³·ÜEKtY"ªž„€»\ÌGÈ «í³2N¹Ä¬¯ºß_r-¹Ùr–…;ÿô, øãÊïƒdûÀÛšEáâ0}7 ¦7ØcŠ…!àöãËäòãÏIÀ7Ó 8¶÷ùAYr,±!!W[ìok J²ˆ^ÑA¦FêU±YP¨¶”8Kx¬…”Ô£k=qB)ý õ…™Ô*‡ÈJš¹Ç±tY0vW’Ž è´bAº€«Í›ä&{Øüýóý@@!#;wjÏbÞm•™^qþPžK¦®0>®X’,³®!H5ém£Úbâ,éÜ­##à2¸ùD ¥84ÁK8¥ bpYI3÷8°uY0vW\Ç%ÔV@§åé‚®ÈÍk¬)Á6á{ÀWÔÁÝW–öÌëݳâü¡<9–´a„žüf¨ãÂÈU½@ªxk¬„YRµÅÝ q–ònðÈýñö‡´§Úö¥4·Ÿ+…•È šãÀÖe¹±»\—Žó"šâé‚®è¸ï2wuí£+ßYR†Í³f)ÚK>%ƒY{Ñ]qþP®‹Þ/á€þs$YŠ@îÚ„®J‹eªõ ¥w›€ÒÞÂÞleA{±?@@¶•7j¥ Òùލj?~K—cs%é¸\Í”eWäÚMÞÒÎîÕ÷÷ö÷è?ÇÇ»ã>QžK%÷ø¡-ÉR= »6alAB¦QÞuÖÀÛrì; &µ³çô€JAÅ÷@VJ å¶.‹€Ø]>×l™t7HtõÑM"çÎYS]B>Üd ­=óx÷/8g(MŽªå›MW’¥Ö5T©jµÂØ‚„D‹³¤wazЕޤ€Ëà}úʈ•´"J+¡¤Ä‰A)¨Ü@VÒÌ=l]ŒÝ•¤ãén.àês5 Ž-Þ=ÇFz¶öÌõn©ÌN'm9_€£Å&ÂŽ$K΂UªZ­0¶ !1â,á]˜žHo±Yð•›Áþ5¾¦+iE”VB)‰1 *'•4sbé²`ì.¯ŽËNé2®ôs@á˜Ù›)üýûÄÕž¹Þ-•Ù)%`ù˜àeJÎk3Ç—p±œ©b\,s ¸ rJœ–Q 5X."H@D¥(€µ¾HV¬ìªø1ÝDEe¼,Ù¼Ë#.#r°9!’.i 8ѱàåó\JßÕ…¥ƒàÒÙ—ÞJöoúÃ\¥yöãñeçYž›™†±j\0.g°9gL:ˆ ùp²·ù8Î@f²y.Ÿ»LÖfLHÀI(„RP4EÚýþŽ­­bëa¿Ö ûM6K=—–¥ÃcÙ+;¨GéøWÒŒ—ò§éÜ‹“7á³_• VEƒO÷_¡ŸïÎÊ?K-2Rµí0XÆ©ªFœ–HÖ1ª`QÀ¥„òÅϲ{@Ð8i˧R˜ ¨ÀXe‰¦ÔPe—€JÅÆ€l«J'…Dz4VNP+(Ž2ŠŸµ$¸³úÙÙ»ñÙ7ß¼ýúí9!`{àü¸m±PJü¬%Á|pÇ6/J‰Ÿµ$È"àð̰š[0ât ˆ¨0§‹™M¦OðÏörÏý ©â¤QÙž=ùc7&¹À|NŽ $`N93K!`NåU -½ß³/ѯ*N•å9îÐj]Bmñð_-ÇÓGÀœr¬(ž$ºôÈôœRAF{Æ$à˜æ9 yÃåþŸ°zGÀœr¬H¾¶—64P_[†òÊ& 0–‹ÊD¬JÞzã )Z„4ŠÄÂU‰åû†¡Ôm™Š­U •B¥zdd JæDÿ’®Ý8]…ÇÕ*¸Ì#Ç;––~ë–®¼²(åb†2Ñ«Ú3žhoR ‘FñÿsÜpU|G›{×04¢2w½DþKEÇ2Œ¿BäîÜè_êœÜ3(úyÒl 8‘‹èð0&––ANå•5TÆb1C™Í¡4L*Ͷש…H£èT7âsèû†¡•¹ë%2Àð_—-Ædd¢€tçFÿRçäžAÑqµ îó˱ìXZª_ËP^Y= 2‹ÊDK,¥J–=H•f) §à yl C#*³+ÖŽEø¯XžåÍÔ 5jÙK1{ÿ%…0¿ËŽ¥e ¿,å•E@e,3T‰W,3·tR FŽSp>ÊÜ»†!Ñ¢2è~úÞ÷ö€®ŒL›ß5š37„Wê‚ ˜_ŽeÇÒ2ß@–òÊ" 4¾k­`Uªdíaê ¥Q¨/®*€'ç_ÃPê¶@Åp ¨Â©4ÓŽ„1 tçFÿrÎÍ:­"Qôc˜ür,+––ú2”W¶YËÅ e¢¬JЦÎP  WÀ“ó¯a(u[ b­÷"&ü—ŠŽeÚá‘‘1(˜ýË97ë´ŠDůâfõ#õÍWéù…)(&¬ŒWïUåiNˆj è‰f:.óü°À ½HÒ{!ÇD¸3EÓÇÀþf9õ”…$½×ÆðB5 ¢R •¢J&+ Ic%7}&cªÓû*óNÀ—ßíïßü(§ÃØ…N |•ÓÁDÌq e˰’«[~êÎ9/ß§ä{y6§Ã8S_åq0NC"$à4tb\A–ÊS«J¥V, ÖY=}Õò \ÈZ .øÇ¯Ÿ/ð•Ô=¥¾Rò&_È,öÀˆ´ì¦‰V8±¯â2,¥¼²”_ õ¼ºE u5 $ ã ʰÔê„j%ù–.ë’zØ`äA¹µ@Ÿ«­ò¾rÞRy_)y“'d' i¹Mã&N쫸 &€—eʬn©Q Ëqe­8(׿R«JB< á]%Ê…´VËÑVy_mÛJ%Oà+½ôÕåxÀ˜€@‘–Û4n⾊˰¶AL)g°º¥FÑï‚ÐÊ‘aéÁz5BO,Ѳ ¬c[Säh«’_Å”J±ÀWæå¨S2°Þǚƶ¾ØW1P^¹+Âê–ÐqEº<²z@â†ÁcÀ ®z²åYî} z ‹e+•<¯t™µgÐmš" Œ}—aÁ«œa8›1 Œq ¨Æ‡Î0ëåc: ¾ÄUOÖ±µ@Ÿ£­ò¾’º§”ÀWJÞä”J)õq›Æ[ᾊ˰Ìb‡ÎP8“Õ-X¨« P ÝW€z,W#”J­X,òò¦üÕ¡«z‚ÇÖ}–¶*)ð•Ô=¥¾Rò&§$PJéÓ4Þ 'öU\†;´rUëEu êjüpÁc\/¯–l>IÀqU(|\[6ÑX.IÀqU(|©eåBq\MGnÃ*QЗŽ0@¦¡ /aP £È½ž0¦ æ"§]Þr(èKGÌ£( /ÞóÒ ¸ìÈAÀNá\]}z¡/±’€\T0êE¾ýÖ%`çðÌáä¤h¼¡×q£ö7V#Þß¹\]½ð3§Í›Vظ@÷6úáÅ/yʳ•0üùÙÓþSjÔ&óD†$Ü…~Ôb¾EË=åå” ž½öÏÓÏc!Éöu‘¶4ÒV}éÑ*ÄzÀéxkõMÔ ü‹.Òφ"à­Õã¨#àÓÓ†räÙ-º÷óÓ§?ßâ)ŒÂ·.®Þ¢åßü¬òd†`ØÅg«-ZeÑEQN¹àÙ·VÏ÷éXHGr£|Ý¢…V"m5ëoÃl{@xï¢T{*8׈hߘ(øtõiÔs†bƒ÷i¬Ä³¾¹•†«Ïhù[çU¾F(ö¥ðЦ©¬\¨ìèKËB:‚þB‘ûÌXýí#ŠíÁ]7;«:‚ðÞÅõF‘¡ä›ƒ¾x~µ¡óT†4ö\ú¥ŠjGæ£,¤#¹Q¾?³þ¶1:\U=àSɃ”ðŠ¢Ë›¾ÕöÏ NÜ;¸wKçóÎë¼Í0Õ¿)ÁÐ|ú¦Ç“ŽØFù‚=à*NBJ@= ~ù囟ÍðVtì³~î™  ²QÚEæêàç7:ŸPe²±Û³‹ñ1 ù( éHn”¯[+OŸ^4V³þ¶1d<†™ W/´¢±Gß/ºÏûê9àùFÔzcÍ‚ß4¢þæå ½«|Þs© @@:áŽZçã³`ð‘Ò‘Üh_#1 V}éƒ è‡µ¥úžã]8Np™PÑXÖlº#QЗŽ0X ¶žy“1o™ûö*°”NÀ0t¯­×ÊSîÂxTŠ»Èƒ æ¾½Š,ÅÈ$ ¢RHÀ„Ð/‘Ùæ 8[wßkLüA©røÕÆŸh”Ž9#`û7A4© FÀìÇ2|A© «Æ# ’± Ìégó\, lsÐg39¡HÊhX*ä•ü)pv»îϖ܈âXœO.ÇåÄÈbÐF`¡@½ŸvgâM)2ŽXìOï¾x ãl¹«"f" (£aÉW* Vve\veu„)M@©JYÄbd1(#¸P 6+pz@éCƱ‹ýé]°@Ž­vˆ˜fK@뚊†%C^©p0Ø=rWj`Ô¥—.cTœ™Hb1²`0k¡ÀK ”>Ôâ}f©+½»m~«gE¯ßwªPô0Ò!¯@@,76–ÞtÇ}ü‹„ÒØ±g)>{ Ø‹÷ÙÕ©ñ€<Œ­vˆ˜J !¯òõ€ìšåúâ= ü#aÁPÙÀ°Y{ $rñ¾Ì0¶Ú!b(€2ä• ˆ]¶Ù,Ø^®.ÎgÖÿ ìHXÊ«Ra³€;oJùq¬ÀbzD° <«"f€¨B^åšS°©©½\ŸŠTÅ`Öÿc@$,m‚U©°YÀŽ7¥|È8V`±?½ "XžÕ3@ɯâª[$’¹…¬+H@ˆDšÊÀU¥ d†™•"q±¿S¸ª Q)€ˆJ1gb„±8[w?-Í.>å4ãӜ뉥VsöӴܥļЛ5…Xk*©‡Ÿ_ʈgŸün`ûÒ©{Í7¯ôB=¦v’À¶æÀ‹'vC“*{ò"!ci1r¬¨ökݰß$äh†£¡ '\ܾ¨3]I.±V~ñX†¨¹´OQsLšõÝP‰^àè¶ê5r`©&ªµ ¯|7Ùe\\Ì…+j“ZŸ~¨q‹’°-Vµ‹ °+6¡X+¿ø ,CÔ\ª¼¬$&ÍÚß•<±u\ÖM×¾«&ªµ •´çô`.äXÌ’}ÔSB±x\ÜP` ±V~ñX†C¨¹Ty] ±¥YvÅ—W"UõÚ†‰O"—s!ÇŠˆþ4WX˜*ËÊ€§ke‹¯ä›_ö,§’˜4‹¯ªèº"nZ¬Íª‰jmCì+‘c6jÄ¥©äȘb-@  ñ `9ŒI³¾»âT {À½ ‰€ ‰|mCV"ÇdÆãÔp2±–JË-¾b À‚Yà‘fñY°2‚c@ÕVÕ2ñO©&ªµ ?ÄY°CÀ£3GÅ˱;­¨±“HÀÉÅZ*-·øŠ}€Ë!`LšÅŸ*#½À!1mU-ÿt;ee³ð9à, èÃ\©a‚l“üåò¾ I¾ Af¥Y³DÉœ+9Ö„Ì…† MYdQÖuOˆex‚”˜(«<.J&à\ȱÈ$'f'ÊšÿG#e¢d"6€ˆJQô,8Žr¬¬‘bàlÝý¬rÙ‰VI®q07Ì#_úB,BlƒÀǧñ ØéÈÃi0tKªGÐNØæ# ÞΆ€U"r¢HæŽÅÍ¥+Ö²? ±ÄŸøB{ü ­xL;Fü¬¸;YKL§…È‹|=)Ç“c¹"vE'b™"Î-øÉ§„|À‚9ÕZ³å›˜N ‘|=§‘c%p !–)âpû>!ŠWucªµ¼ä€:-D^Ì–€ÖѸr¬”pJ!–§èÙÈ9Û(¯ZËGÀ˜N ‘%ä’c Ò8…+a¡À—7_~è–ΣÖÚó0¦ÓBäE Ì–ctÅ …\‚åí'b¥,Hn~w×øg²ÕZ~wìÓi!ò¢f˱NÄ …\‚åN(ÄJY(\Q}TÁlµ–ßûÄtZˆ¼È"àWg¾š”€>Ì‹†vª?¤dŽE$dÝ48­Ü;—¶ÎÇ8œÂµ §BÉœ9VººjÅ®]8J& a ˆ¨0CŒ@RY>ÎÖÝOK³“óOX}¡®ÆA¼4ÎY,TBÀ’ÀbÂañÝŒr¾PWy+ôgå¯ûT`n{@õüÙIÛ vs^ñ\fãpÒz–E0QŽåyMÚýþ, ßÀ™§¾S†Ã â+pJÖâêªx%±5J¹Ñ¹Ëd;Ø&—ÏÙæ´ÀËÇÒ¿m°~ w%NÆÉ:=(’€‰r,"«>Ú°4»H3‡Ä5V2à”tÓU±Jbkº•r£M²I™¶ùÄ6È•Çò'ç&´U×üÜœ&’uj0[æ”cyôuÇW!á°‚¸Â òÔmÐ[Э”¿Ú;K®=¹FÎ^±Íi7(W_]PT-fȲ@¬Sƒ¢Ç€Ir,¯" ‚ ‡Žì…ýønLW©[©`5Ù§ÁùO­Rº°¨Ú‚ Y§%ÄäX¹z@ögÖá°2{À˜®Š÷€î€n¥üøÚ‹käÚæ5wáÁís*@P¬„®”ï»§íÅ^ ŒË±<Š,ïpæá°‚¸ÆÊœbŸ˜®ÊÂDX)oÉæ¥ä›o8 jššg±À@ºA²N J `\Žå‡¡= ."V×X™€SìÓUñØ]Э”·d;¸L»ÖíøÂƒÛ¯ä]X׊*#îÉ:5¨D S&&Óm¥¢ ²1_ÙàäJWN¡®ª T!Dzïµå€ ¬24X§íð\Õ0ˆJDTŠÊXÖDÄ?³HVY%ÎD’§(3˜¼œÞùOùj˜<¹W^%¿•]«I¦¶^•x€íÏ lÓxr?IÎO)æ²|ù8å­ü˜×ÊoîMÍ$`žƒ4É@ÓÂp4¼Úb‡­-qDôCèA/ôK±®©'Ê\ÿ$…KR)e¯æÇ­TÞe.Pé­’¢g™ ¤KblUF‹©¶Ü–ÃF,)Š%`«IÙÕ#+tÓ\QGZŠÕN’b]Ò²§=#\²Öÿsb`ɼWts÷•¶TÊ«'^å•Ge%êŒë»€  .¨5/¢g™ „Kž,ÓTµF‹«¶LËÕÚ7¦KŠ"åX25$;l¤u¤…ýõ4!Û2AZéõÿb1°xÞ&[$hS[ê5´.{•Wq•ÿãÑw9\>Pè­Hbô,]tÉ“·ÁïKF¡`T[ªåÛsîˉb{ÀæJÈ‚NÂý§Ž²¥X—¬.I —ìõÿlõ•ÌÛÛߣÿ|+z”WñäþIˆ²åH¼âþ“ê…®öcº/©Úе4bIQ,5±íí°NPé0IŠu ª ”pÉRJ9ê+•÷á&ëÕ\EÐ×&©¬taа| ¦IBô¬ÇNÏÈ7ª-ª²šØòm§KŠb ÈÔø,ìUóà iŽ”+q øòñ]3ÒRÂ%¥”²VócLÞÝsl¥ŽÔHÊŒ·½c@Um¢¾ ºÜ% ÅÐ=ËÑe‰Š¥­j£Öhqº-‡XRKÀNK„½"-6ÖGjÜöOŠE®0 –ºhR¸¤”RÖj~ É#÷YÌ+u¤”WJ%õP²L\e•¨ï‚.w C1 öGÏruY|#mu‹µF‹©¶¬–ïÛXRTö zvX¨1RþÆ^¾Ÿm³È"àÕ3W'$`Y¢«ÅRQå$à“=~ó>(Ž€e‰®KE•3îÖæãe­Pˆ@"*EeÌŽS$üC±ÔPXÁì§;Aêaþ‚‹Œ 8‘+­P5"-P¾ÍàONÎîïßdÏŽ¯ÈŸ³Éœ ¸tö¥Ø±"|e´ 8ß=`E"-éðæ{äî5ñàüîã— goS:¾ÒêCÆ øhºp<9–L&õ~x<…€¿jDZ&`Vœ€jJ{•gA“¯•‘¨F¹÷ ®\©– –5YZ½å9¶‹g+ƒ€½­òäX*™’^[2¨H¤jˆõ€O¶MËT”"ùW*–¬F¹W­°šìHµ¤ô š˜[Ž‘c»8q¶2Ø9,OŽ¥’Ùvз q¨ûNÉ"-Pƒ" í…>¤]Ö¶Jß·Èe„/Bt5ºV ”ÐMv¤Z º—†]5@#Çvqâl{ KŽ¥“Ã04… *irnH±÷ÃÍôEø2æ¶ûÀ4™U¡òTJúå ÃàÉ)#Çvqâl{ KŽ¥{À¡(/ T$Ò5xÈ“g ¨zÀíx¨«w¤ZÄD÷ÒÑ= c·]8[Ù·àizÀ±äX*¹;:"W{ªAE"-0Ë%à5êöÓWùfÁ²3Œ ®\©–”~AaË1rl'ÎV±·àñäXjÜmD5U ‘˜åðÊÍ`ÿcþ•sAÀ{$>6„Ïõk$Yr¯Ã|Á&;R-, j²´zË1rl'ÎVö-¸ ÑE#È6™)Î~šmƒˆ£¸[p1° JimŸù|X|9–‹%Ò:Å@5 ¢R •¢XÖúQ‘s‘™L4’ÌÀ}¢‹²çHs‹båX­Ôɰz¥•ŠX~ wd¨W|k •v$´ XŠí#’NÀ<-ô0Gù¤L¥¡²ì¼ÆHÀPh±W¿Z`EFMBš#`!¯ÂwßN %;Ò’#Õ=Wh(2”‹¸ó˜¼JÉ£@È+õúöCý>‹VÒ&Ñ,³œ¡yåFÓÒõØ‚+% Óf µl"ô°8zª)Qì-Xö€R`µÕ"ä†áW˜]œW—µ”ÈHŽ Ù¡•! Ì.HÜyL^¥4T ä•ücI¥ÌÛ8)m’Í2ËÊUÝ… U=ŽàJŠÂÀú†º¹µ<,ŽžjJÌ–€®KP ¬H¯»S‡öjìõá‹ÍŒ”JŽ Ì­ÌPe1çy•ÒPY_D%@ ôJéø Wt.Tõ8‚+) ëêj€>A{X=Õ”(¥”+R;h]…j ôÑ9zo²×ïsèH’ÀžÌ.<Ε"º¸†Êö35E`@,O+§!º'CŠÂ€Y¬:èaqôTS¢*ÕŠ#°Rëæææ‡@aez@kÊZr© áÂã<&¯âØ÷ö€P*e¹kd[–þ l­Õµ7!EaÆLWª…DO5%J! X5Ùp X¨NE…”HJެXSŽÐ Žy†tÄÇäUJCB^¥¥´I6ËZÎl­Õ…7[p%DaÀÌŒ… Ëò +]þÉr)”«•š; ã4öTîîwFv$$GV¬)(IÚ‡”Ò…‡€qy•ÔPWj¬¤Rv%mͲ–3„ÅáêƒÜ›+¸â¢0`¦«QË&B²R$`a¿ ž›¯fèl.ð<´¡:,\t¬Kç^fåÆ<\üyhCuXV9VNä VU(æ¡ ÕÕ0ˆJDTŠÂ'!NERFS™òN³ ’,N÷hn2þfI×Ò<2q36åC³›‡ÿ=|âzÈׄĤ ©…HÀñ±X=`2å{„íÇ$àin&aF̰@äFñ=`·/B`Øq¢‚O÷_¡Ÿï \õ]ËX¤§äåò)׎<ù”?|D;À'¦Tön@ª¸ *ÁN¤ͪì_<^â U¥¡xÊðNœ¨à ùèý0i“yx#=‰гœ`@>gZöÎb¯åY¤½*.ƒJ°SÂ+u’€²88¥`y‚V•†ÂåXÑ‘ûLÚ‰ÅôLì³OàšW7Ò“  g9Aöjõ!/8 ®}tE¿• l{*&ƒJ²SÂ+Њ€X±¬–/hUi(gÂt8=×U~@ûôÀ?ŽD‹-ìrŸ©ºÈÝW¯¾ç"â”ûÖÖ’=¹2¨$;8ë¬ÆÚ§´,A«JCñLìèI0ÖJ(e’E@G¢EÎ~ôÑ5±{îä´‡ú(¯ Êgý˜}¸,A«JC cÀÁÀZq¢ ¥0Ic‘ž—di/_ñ©‰ýüÐÕGyeP>;™¾¯XX§,OЪÒPÉ,ØŠ (…I’5ñHO‰Ë ò[áÍ›*‡øè꣼2(ŸLº0íS7§,OЪÒ0W¯â‚l?&’hM\b†X N&ÑBÎæŠ€å “N· j^0WDœ>l 7, ¥bÃ=,’€3ø•Hêz‚3@€cÃrÙVÐ-8Šíù‰(d,—ß»ž ¯L”Áðò»ýý›ùr€%£d/’qù½Ù‰LÀåû´¦—g\!ËDŒváÁ‰ ›XŽP¦ð Y¤s6Aû€G ¿¿Ç_è»QªÀkF¡XÀ+Î+Gò¤ DVÛà5è!õŠ„`ÃÀY Q$Û"‰Y÷€òùaˆµJáÉq¿Õö¬çùÁQeY[id§«DWòdiXàd¢z@•è‰w•^ˆBÁÙ¦ùWUhR8š–L‹]ðsÛ‰G©r{@7z•î%î>Žö€b ¨2ÝU [é…(‚mŠEPeJÈ—M_÷ð£³Þ1 >Yc@UÒ  %%OJ¹åЬ^>¦³à»*Ó]Å0°•^ˆB!Ù&ùWår„*¥²h•­ðÀ½ò*ðD©Â'f xeÐ’’'¥Ü²DVêõïË›"R>ÏtW1t”^ˆBQêsÀ 1³ÁØåû³ò„˜NŸìég9ˆùÁ"p6º©ÍÇøly±D,1Æ—c9¸ƒX ¸×µ, mŒßÞYE,J»ŒC›>à h—¸³úbñqÇVÆwÌËŸ€7‹$ |t}gu°ä¸Ãÿ[r”MÀHƲó0Ò,mÂTîðÿ–¥P½z‹eç$`d¸·ä¬º£|JñA,;#@Àª‡/EC°êVŒ (äW±ìñ Xõ®hVÝŠ‚±h„·ào–‚€U·¢`,Ú-NBþ°ä¬ºcá&!à1ÌûKAÀª[Q0ï1ŒÂÕëKAÀª[Q0æöAôÖ™­,~»ì ü¿åÆ"ð6bñ±@fKlˆI‘IÀaökbrd(H@D¥H# Q<’ Xõøq:H@¢\ •"N@‚üüðô€øÁOÁß-¸êÿ?ð³Ü Þ1`Õÿàg¹?8 AT $ ¢Rà›DH&`yÔGœ^€©Q>r°êhve~3ˆRMÀ9 •‚\>dð©Z2f€\>dpžø‡\Bdp¦ü‹¢ì”T —é4üKÌMB²‡Qrž•÷{Ö ¸¼H% èÿòöU3"  žÃ?$àbLÞŠî=¼]|øðB#ì_`)ç[aÿ¼È¦T?©³%±d>EëÈfÉ,1¼å‘Ïåp 1&o÷ûOûýÛ/D·è‡rèBtñöõž& ´ÓÙVñˆ¦Þ‹ [”è=܈6\²=ìÅø‡\Bä' èÛîE!í6¢/iZCîÐÝÐ" Î¶E·…Î%n?¼õ‘€§c[QKóQÎ%`ä³€n”Ö©ÿð|*0.ÏGýè<ëÃn‹cÕÒìoax;Ö}ªéìä'!§cpµß¸Ý诲QÜõë÷.ê1`ƒÞ—o1›RgǸÇÿèìÄ1 >†9-s x‘훟oEáE6¡¥;t|¯%oªBN3í% ÎÖ÷ã[ž3$àò!/‹ÃoC€Ë$ ¢RTOÀ0ÌmŠ\>TOÀ1€\> •"…€L_5ålTý‹ÄÌ‘!•9ë«þIbæÀ½ˆJDTŠŒeˆ"DT $ ¢Rä àß(þþü ŠçÿŒî—ÞFÄ#oÜøÓóüÇ?žÿ鯲›ˆXfä ààOÏû¯¿úŠ_ýëoŸÿiPzKŒ<|þŸ¿ý@â·ÿù|ª•Ú'7ÈÀZz`ûÓzD”‹|ôί>øà“þ…3ðWï<âY[Çý0\Éòn±ÁGiéÒNo‰M“¿êäÎq6zëÃáN+líóá,2ƇaòâÇì°‡TŸrð=F¼_FÏe'øË9é÷;ÃÝã,ï…Ð.Ÿ“€ÖþÊÚÑQ; kQ{ØŽÖTr{¤ljQKì¬Q*îðÂÑ.ý"$à,ƒ€Ï?øä“~ùÿÂ3Âöž³œã¨+mê°QŠÎ"lõÃþšÜ?><<ä×¨Þ ûuÙ›˜Ãááqhz—ÚíOk’üO÷ ltõFRvr+|êBâ³õ†»Š6Ãzõ{W‡ì÷Ä8‡+´/=‰Vdb³¿¥rW"Ù/Ž¢JTV¬Ñ£` 8 ä àÇ”vŸ|Ýo4¢3ÏéÞÇ,§ “:ï88¿º»üÓ`û=𨗏օ…( Û¼¤¼ˆý¨6ìŒëÑh}½m6²²‹ÙR¦Ôy»ÚÍá#vÓŒ÷€:¥Cr'¡H ±Án[ ª\‡%õEìÔU—¹îë×m;ho ©›.ô†ªšZ|v÷×Âõq+tf±Ëø%òÕñ˜gØ’i'¬0½¯#g‚üûsʼ/þ玟ÿål©YpÛŒá§mŽj+¬awM}hGÍ!=6¢Úá±^=j›,¤ìÔ–—×…4ÏZ‘â %`ó?1Õ €1`7êó›uR¶Õ ­øÎ‰îëüáËqdz>$à,ƒ€ï¿÷Åï|ü1çß_¼÷>ÏÒÏÛýH΂»®žw[Ÿ¹²Û&8´gÁ+Ô%B§¥ºžƒ¨ßÕUHÙ©-7Õ…4ëâ‰÷Üwo‘ä ä‘|h°§‡’-Né%$p–ÈAÀ‡½÷¾øwÊ@ÊÁÿâ½^L嗦ß— 9øí·Çï}ýޝßë]¿ží´j®Xs`Ä#¿ývãÌó¯¿~~fã6E¶Ó0œy;ÇBØßÉ6BÌPЍH@D¥@"*E«^J±Ü ™¬úwóˆ¥Â†{ˆD” È6$ ¢T8ÄQ.€ˆJQ<£µ4ÃE³ªQ,$ÛÔËÚœ‚‘ ×3¦@Ü]ÓÜì(Ñ1OlÓ2¨¼Ìã ˆÈg›ù±ëxí!ƒQxpHÛýpGäE²“Ô÷Âh§ß¯2\ ë€ ¢ÀáJ¸B‹GýúJ]oGáÊ‘)w¶³(,U[DVTW†®%bžÀØÁùx<: -Ê’v›t ©†¤® ¨Ä~›ÔZ„ôêP`‰=jR‹j ½i5ÉÎJ¼œ—G°ÙM@î1¿˜l¢Æ€õ%é? $$¤qÄ=ú 8à&Ôr`8$ „ȃPôRfÃ3t9f’E@]ƒ(.i}á ¿-ÄÌ1!eéõh…áâŸ@ɼHo:­ßÁE~D¸g ,E[@µHÀ¹ÆtìõØ ®/R{@ñIê1ö›yv9/”%<Æpþ‘EÀ“3'ÉÜ¢cÀ->îöØýøÒµjDLúW‰¶•ôèµí1à8´žpKU.ÇP|d[h3v ŽPŒGkdÍ‚{ac¦¶Ã°KH­ßßá”Ø Ád˜ð; æØ,xèpMxÑ墜Tm!5^{=:÷å!¦ÇdœeÞñáËÜ#¶JR±TIJpîqgÕBÑÜ ŽfÔò<À ÈÜãÎêg7dïÆgß|óþõë·K¸#H@D¥˜Š€(BL‹ÇüˆñDTŠé˜&B r`R¢ 1LG@”@!¦ÄÔc@”@!¦Á,ˆ(ÄĘîLP…˜³ J cö¯âða b •böÄ b  Q)€ˆJDT $ ¢R • ˆ¨H@D¥@"*# þYú·ß"åBô€ Ø"Jö€ˆJ= ¢R`ˆ¨Ø"*>†AT $ ¢R •b,*,V4kñ«©bZVÏ嵸Ÿ'× s].&" PÝí}þ/ÚgÙ\ ’l=ZµÃ°=V}ÙÍ¥- {‰?íöã_ÁØXYIj’}~ë£0­«£šlÙ…£XLDÀƒá  ûÆËTÿ“Ù§é=¿Q×îö×Ìy/>&"`‡N;{ášË»ö ;L€‰ ÊU u!º0Ÿ g è# )Þ4¼Ðí$¾v’Œ1 ú ìVû{@bŸGújyèŒ;¢ÿ;ÝcÀõ¨IèÜ ‹å]{P›Hð í1`³uB=ªo]®R¨GLܵë²kgåÁ3 v ‹_¥—Ïm„¤€]Ãñ.ÔˆË ‰nÏ|v«ýc@ñ±jìÑ®x§g(WvôœßA]΂ÅÙöO¤ƒ.´\\Lö šþù ê8a±¼kj ¾‚¡4Q¨µ¢ÖŽú.å*…zyBîÚö¢çŒ¢„õPÝù• ,^k…M·’v µ•(<>$ ×÷AÿPv«ed0µIY¨±E wµeÈ›ä=¿«+a¸rU‰e"äP><¥<åH|Y›8f7n;ÝoB H%`É 5.€³Dhm”¼Pã‚ ˆ¨H@D¥@"*Q)€ˆJDT $ ¢RܱD”‹U H@D¹ØXB å ˆ¨H@D¥@"*Q)€ˆJDT $ ¢RTB@W²®~n“”?mecÉZøŸú,&" øiÖäW)¡ä¤L7÷üì6³ø8 @²N…I{À©¾v$ Ba*ÚQ®d (ùSW÷IBFR†õðÀü$׎d¥ÃbYHq­ÊÉŸÝŽc‹µ+KP´Xl¢YY#Ù@N…©hG8¢KTÜ'=JZA ì_3:A¤²]K¨rùcl­×û,ڞȓd­ˆ¬±x@ÍQ¿ž¢1LE@;Ê• ¥X2pžâaYaYlê°X2\z%wŒ­Q«;4ÕÊ2€VÔiˆ®rØm-I –yÅTdbzK¸´*z0L" ].‡k‰ÀŒ1¶lÊ2€VÔ—€EcÚp€2z”2Lé0zÙ®U ª„õ¥ÆØ:ª÷õ-Ø4ЊWvÙîq¿Ž¿%/3ò¿­iÇX"£G)CQNZj;Éʶåp-¡‚OE°¾ô[|"SÉ2€VDŽè}Þ„D¾ b*L= Q®Ä©É@Q^"=JÖ#VNYZ‘¬TX¬]Oy¯k = †õ¥ÅØÒà©d@‹îuzqK$àì1·¯âVšã—Y’ ¡§ sKÀ±Á§ËC@ >µX"H@D¥@"*Q)€ˆJDT $ ¢R • ˆ¨H@D¥@"*Q)€ˆJDT $ ¢R • ˆ¨ÕDÇŠòÿ®çQ˜iY>¡ãü”Šú…Q4˜gT+á«ö&ösÇÆð0E“ŸLzÉø/LÇhÄi d%ѱÆ!`þŠ€‹ˆFÇ’‘¥d *;•˾kªˆTV§*];‰ÂKk‹\mé#û~®Eü-™h·%-–ëÍ¿faŠÖJ6IåE°¸l r&¼ØP÷åyo—¶Ìûä†)%›8–çžÖÎJ1!ÛÝn[¿k²×b¢6;Ë»OÃ.²>Ê TE“‚çe_T‹j #¹â%[æ¤in]TŠÖJ–Ó¯8ìâÖ‘ð?£^Bž·[ruXž¯ ] Hyií¬ð`w÷@ëìõ…˜¨¹2ˆÇLÓ ØÏÊ’Mb´_ýO±W÷B¼dËœø×Î.Mn]TŠÖJ6É& .n™ú Tã}y^º:,ÏW. ƒ¤‰<÷´vVŠÉø@\Uõ5øuJ1Q§¿FMl‚}ðý‹Û‘“h ØŒŒÚIˆ—l™ï#å).*‚M²á&ÚÅ­#ß0K5ÞÎS7ß(žèê°<_AZsí¶IZ;+Åd¬±áIMébë 21Ñqã¸Áûz_H<ßDèxQÿ7bT’+!^²eN\©ª ˜G•rEe“œÐ*Ø·¼ÄÏ(ù¢ûS›¾-çŠv™§®Qj­b2öèÿ§;=ÿPЉjQ3âCdWÕGøx¾ w È 8c@A@%¹â%[æÔluMÀ<º(aéÕZÉrö¢Šº8o :Š,o¦xŒA@W‡åù Òš –{4KAš1à0¹-b2¶è7sµ¥ôFZvÄ¡ÄD!¿j±”ÐZµC6óP)šx[ð% ¸¦uQL¼äÈœj­¨µ£ÜçÑE K¯ÖJ6É^TQßÎd!KÆ¥ï½=û~×êê°<_AZsåùÉ5ëÜvβ¸{f·ÄWqs÷õŒÛ¤Id\§HÀ Ìa“– óEÀ9ÔtÎa“– óE@Ä©Q)&&`=‡=sü”#ôUŠ÷4õÑq}rLj1)‡ýÃtÇ 1‚<èõÃðö<è«|þMò½{BÌ?&%`×'yr#Ȩ> »Ç)ã!…€B ˜{LJÀQ‡¤ël–„=¥tôF–ËVÑÄaìÛ^õŒMûÕ ÊÀ¤ä/ýÓôFî›5Ž•¶ýÓ±HYƼÈX¶Š¨·Ã^ú‹KšjñùÉB`Rª×Þ‰z£ÐQWq Û~Ï}¯äõ"#`Ù*¢µcûU,. hªE.¦êÙ•NÒ9¯)õ”õA¼.Õ¯øã^D,[E4 ­;pŠúˆ SÓôF1–†«-ò{‘° !!=+p#,.™§«Å1àb`âY0cBšÞÈ;íR?0ÇöÐ2°Q;ê@›dõÝéšó‹I ø€=LÓÙ-‰ÚJŽÀ Appendix B. Building HyperSQL Jars

                  Building HyperSQL Jars

                  How to build customized or specialized jar files

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 4909 $

                  2012-08-06 00:10:58+0100

                  Purpose

                  From version 2.0, the supplied hsqldb.jar file is built with Java 1.6. If you want to run with a 1.5 or older JVM, or if you want to use an alternative jar (hsqldb-min.jar, etc.) you must build the desired jar with a Java SDK.

                  The Gradle task / Ant target explainjars reports the versions of Java and Ant actually used.

                  Building with Gradle

                  As noted above, Java SDK 5 or later is required.

                  Unlike most software build systems, you do not need to have the Gradle system installed on your computer to use it. You don't need to understand the details to use it, but this is the purpose of the gradlew wrapper scripts that you can see in HyperSQL's build directory. If you want or need to learn more about Gradle, you can start on the Gradle Documentation page on the Gradle web site.

                  [Note]Gradle honors JAVA_HOME

                  Gradle can find the Java to use by finding out where java is available from, but if environmental variable JAVA_HOME is set, that will override. Therefore, if you have multiple JREs or JDKs installed, or don't know if multiple are installed, you should set environmental variable JAVA_HOME to definitively eliminate all ambiguity.

                  [Important]Rare Gotcha

                  Depending on your operating system, version, and how you installed your JDK, Gradle may not be able to find the JDK. Gradle will inform you if this happens. The easiest way to fix this problem is to set environmental variable JAVA_HOME to the root directory where your Java SDK is installed. (See previous note for justification). So as not to get bogged down in the details here, if you don't know how to set an environmental variable, I ask you to utilize a search engine.

                  Invoking a Gradle Build Graphically

                  Whether from an IDE, a shortcut or launch icon, to run a Gradle graphical build you just need to execute either the file gradle-gui.cmd (on Windows) or gradle-gui (all other platforms), both of which reside in the build directory of your HyperSQL distribution.

                  I will explain how to invoke a graphical Gradle build from Windows Explorer and from Eclipse IDE. Users of other operating systems should be able to infer how to use their own file manager in the same way as shown for Internet Explorer. Users who want a desktop shortcut, quick-launch icon should first get Gradle working from a file manager (like Windows Explorer), then seek out instructions for making shortcuts, etc. for your operating system or desktop manager. (Try a web search).

                  Some IDEs, like IntelliJ have direct support for Gradle. The Spring Framework team is working on a sophisticated plugin for using Gradle with their IDE. But I'm going to document a very basic setup done with Eclipse because it's serviceable and a very similar procedure is likely to work with all other IDEs.

                  If you do use and enjoy Gradle, then I urge you to make the product better by registering a free account for yourself at the Gradle Jira site and vote for critical usability issues like GRADLE-427, GRADLE-1855, GRADLE-1870, GRADLE-1871, to help to improve the product.

                  Procedure B.1. Invoking Gradle GUI from Windows Explorer

                  1. Start up Windows explorer. Depending on your Windows version, it will be in the Start Menu, or in the menu you get when you right-click Start.

                  2. Navigate Windows Explorer to the build directory within your HyperSQL installation.

                  3. Find an icon or line (depending on your Windows Explorer view) for the file gradle-gui.cmd. If there is no listing for gradle-gui.cmd, but two listings for gradle-gui, then you want the one signified by text, icon, or mouse-over tooltip, as a batch or CMD file. Double-click this item.

                  Procedure B.2. Setting up Gradle Graphical Builds from Eclipse IDE

                  1. From Eclipse, use pulldown menu Run / External Tools / External Tools Configurations....

                  2. Right-click on Program in the left navigator Right-click Project in the left navigator panel and select New. (Depending on the state of your workspace, instead of New in the context-sensitive menu, there may be a New_configuration or similar item nested under Program, in which case you should select that).

                  3. To the right, change the value in the Name: field to HSQLDB Gradle (or whatever name you want for this launcher config (this Gradle launcher is only for your HSQLDB project).

                  4. Make sure that the Main tab is selected.

                  5. For the Location: field, use the Browse Workspace... button to navigate to and select the gradle-gui.cmd (Windows) or gradle-gui (other) file in the build directory of your HyperSQL project.

                    Configuring Gradle GUI Launcher in Eclipse

                    Depending on your Eclipse version and workspace setup, the value populated into the Location: field after you select the program may appear very differently than in this screen shot.

                  6. Click the Run button. The Gradle Gui should run. (If you just Apply and Close here instead of Run, the new Gradle launch item will not be added to the pulldown and toolbar menus).

                  After doing the Eclipse setup, you can use pulldown menu Run / External Tools or the equivalent tool bar button button to launch the Gradle Gui.

                  Invoking Gradle GUI from Eclipse

                  You can do this and close it after each use, or, to avoid startup lag, minimize it when it's not in use.

                  Invoking a Gradle Build from the Command Line

                  You can invoke graphical and non-graphical Gradle builds from the command-line.

                  1. Get a command-line shell. Windows users can use either Start/Run... or Start/Start Search, and enter "cmd". Non-windows users will know how to get a shell.

                  2. In the shell, cd to the build directory under the root directory where you extracted or installed HyperSQL to. (Operating system search or find functions can be used if you can't find it quickly by poking around on the command line or with Windows Explorer, etc.).

                  3. Windows users can ignore this step. UNIX shell users should ensure that the current directory (.) is in their search path, or prefix their gradlew or gradle-gui command in the next step with ./ (e.g., like ./gradlew).

                  4. In the shell, run either gradle-gui for a graphical build; or gradlew for a text-based build.

                  The gradle-gui file is our own wrapper script for gradlew --gui. Be aware that both gradle-gui and gradlew --gui suffer from the limitation that the --gui switch is mutually exclusive with most or all other arguments (including tasks). I have registered GRADLE bugs 1861 and 1863 about this.

                  Using Gradle

                  Using Text-based Gradle

                  If you ran just gradlew or gradlew.bat, then you will be presented with simple instructions for how to do everything that you want to do. Basically, you will run the same gradlew or gradle.bat command repeatedly, with different switches and arguments.

                  [Note]Note

                  Gradle's -v switch reports version details more directly than the explainjars task does, from the operating system version to the Groovy version (the language interpreter used for Gradle instructions).

                  Using the Gradle GUI

                  Sample Gradle GUI Screen

                  Procedure B.3. First Time using Gradle Gui

                  1. It takes the Gradle gui a while to start up, because, similar to an IDE, it is generating a list of details about available tasks.

                  2. In the main window, in the top panel, with the Task Tree tab selected, you have the list of public tasks, sorted alphabetically. Down bottom is displayed the output of the last task(s) execution. (After startup it will show the output of the task tasks).

                  3. Scroll to the help task and click it once to select it, then click the green Execute toolbar button above. (You could also have double-clicked the item, but you can use the selection procedure to pick multiple tasks with Control or Shift keys to execute multiple tasks in a single run-- and the tasks will execute in the same order that you had selected them).

                  4. Scroll through and read the output of the help task in the bottom panel. Where this help screen speaks about verbosity switches, you can accomplish the same thing by using the Setup tab. Whenever Gradle output (in the bottom panel) talks about running gradlew <sometask>..., you can execute the specified task(s) by selecting and executing them like we just did.

                  [Note]Gradle GUI Limitations

                  The Gradle GUI is fairly new and lacks some of the power available to text-based users. Most significantly, in my opinion, is the following item for which I have opened Gradle issues 1855. There is no convenient way to set build properties. If you want to change Ant or Gradle build settings, edit the text file build.properties in the HyperSQL build directory (creating it if it doesn't exist yet), and enter your properties using Java properties file syntax. (You can also use local-docbook.properties in the same way for DocBook-specific properties).

                  Building with Apache Ant

                  You should use version 1.7.x of Ant (Another Neat Tool) to do Ant builds with HyperSQL.

                  Obtaining Ant

                  Ant is a part of the Jakarta/Apache Project.

                  Building Hsqldb with Ant

                  Once you have unpacked the zip package for hsqldb, under the /hsqldb folder, in /build there is a build.xml file that builds the hsqldb.jar with Ant (Ant must be already installed). To use it, change to /build then type:

                   ant -projecthelp

                  This displays the available ant targets, which you can supply as command line arguments to ant. These include

                  hsqldb

                  to build the hsqldb.jar file

                  explainjars

                  Lists all targets which build jar files, with an explanation of the purposes of the different jars.

                  clean

                  to clean up the /classes directory that is created

                  clean-all

                  to remove the old jar and doc files as well

                  javadoc

                  to build javadoc

                  hsqldbmain

                  to build a smaller jar for HSQLDB that does not contain utilities

                  hsqljdbc

                  to build an extremely small jar containing only the client-side JDBC driver (can connect only to a HyperSQL Server).

                  hsqldbmin

                  to build a small jar that supports in-process catalogs, but neither running nor connecting to HyperSQL Servers.

                  sqltool

                  to build sqltool.jar, which contains only the SqlTool classes.

                  ...

                  Many more targets are available. Run ant -p and ant explainjars.

                  HSQLDB can be built in any combination of two JRE (Java Runtime Environment) versions and many jar file sizes.

                  A jar built with an older JRE is compatible for use with a newer JRE (you can compile with Java 1.5 and run with 1.6). But the newer JDBC capabilities of the JRE will be not be available.

                  The client jar (hsqljdbc.jar) contains only the HSQLDB JDBC Driver client. The smallest engine jar (hsqldbmin.jar) contains the engine and the HSQLDB JDBC Driver client. The default size (hsqldb.jar) also contains server mode support and the utilities. The largest size (hsqldbtest.jar)includes some test classes as well. Before building the hsqldbtest.jar package, you should download the junit jar from http://www.junit.org and put it in the /lib directory, alongside servlet.jar, which is included in the .zip package.

                  If you want your code built for high performance, as opposed to debugging (in the same way that we make our production distributions), make a file named build.properties in your build directory with the contents

                  build.debug: false

                  The resulting Java binaries will be faster and smaller, at the cost of exception stack traces not identifying source code locations (which can be extremely useful for debugging).

                  After installing Ant on your system use the following command from the /build directory. Just run ant explainjars for a concise list of all available jar files.

                  ant explainjars

                  The command displays a list of different options for building different sizes of the HSQLDB Jar. The default is built using:

                  Example B.1. Buiding the standard Hsqldb jar file with Ant

                  ant hsqldb

                  The Ant method always builds a jar with the JDK that is used by Ant and specified in its JAVA_HOME environment variable.

                  Building for Older JDKs

                  HyperSQL version 2.0 cannot be directly compiled or used with JDK 1.4. It may be possible to use the RetroTranslator tool to achieve this. The suggested procedure is as follows: First use Gradle or Ant with JDK 1.5 and build the jar. Then translate the jar using RetroTranslator with backport (which bundles replacement classes for concurrency control). This translation should cover the concurrency features that are specific to version 1.5 and later.

                  ant switchtojdk14
                  ant hsqldb
                  -- translate the jar
                  

                  Building with IDE Compilers

                  All HyperSQL source files are supplied ready to compile. There is no complex pre-compile stage. It is therefore possible to compile the sources with an IDE, without using Gradle or Ant. Only if compilation with Java 1.5 is required, you should first run the Gradle task (or Ant target) before compiling and remove from the source directories a few source files that are specific to Java 6 (these are listed in the build.xml file).

                  Hsqldb CodeSwitcher

                  CodeSwitcher is a tool to manage different version of Java source code. It allows to compile HyperSQL for different JDKs. It is something like a precompiler in C but it works directly on the source code and does not create intermediate output or extra files.

                  CodeSwitcher is used internally in the Ant build. You do not have to invoke it separately to compile HyperSQL.

                  CodeSwitcher reads the source code of a file, removes comments where appropriate and comments out the blocks that are not used for a particular version of the file. This operation is done for all files of a defined directory, and all subdirectories.

                  Example B.2. Example source code before CodeSwitcher is run

                          ...
                  
                      //#ifdef JAVA2
                  
                          properties.store(out,"hsqldb database");
                  
                      //#else
                  
                      /*
                  
                          properties.save(out,"hsqldb database");
                  
                      */
                  
                      //#endif
                  
                          ...

                  The next step is to run CodeSwitcher.

                  Example B.3. CodeSwitcher command line invocation

                      java org.hsqldb.util.CodeSwitcher . -JAVA2

                  The '.' means the program works on the current directory (all subdirectories are processed recursively). -JAVA2 means the code labelled with JAVA2 must be switched off.

                  Example B.4. Source code after CodeSwitcher processing

                          ...
                  
                      //#ifdef JAVA2
                  
                      /*
                  
                          pProperties.store(out,"hsqldb database");
                  
                      */
                  
                      //#else
                  
                          pProperties.save(out,"hsqldb database");
                  
                      //#endif
                  
                          ...

                  For detailed information on the command line options run java org.hsqldb.util.CodeSwitcher. Usage examples can be found in the build.xml file in the /build directory.

                  Building Documentation

                  The JavaDoc can be built simply by invoking the javadoc task/target with Gradle or Ant.

                  The two Guides (the one you are reading now plus the Utilities user guide) are in DocBook XML source format. To rebuild to PDF or one of the HTML output formats from the XML source, run the Gradle target gen-docs (or the Ant target gen-docs). Instructions will be displayed. In particular

                  • Obtain the HyperSQL documentation source. We no longer include our Guide source files in our main distribution zip file, in order to keep it small. You may want to build from the trunk branch or the latest release tag. You can download a static snapshot tarball from http://hsqldb.svn.sourceforge.net/viewvc/hsqldb/base/trunk/ or under http://hsqldb.svn.sourceforge.net/viewvc/hsqldb/base/tags/ , or you can export a snapshot or check out a work area using a Subversion client.
                  • You must locally install the DocBook set of image files, which are available for download from Sourceforge. The gen-docs task/target will tell you of a Gradle task that you can use to download and install them automatically. This Gradle task, installDbImages, will tell you how to edit a properties text file to tell it what directory to install the files into. (Command-line, as opposed to GUI, builders, can use the Gradle -P switch to set the property, instead of editing, if they prefer).
                  • You can optionally install the entire DocBook style sheets (instead of just the DocBook images within it), character entity definitions, and RNG schema file, to speed up doc build times and minimize dependency of future builds upon network or Internet. An intermediate approach would be to install these resources onto an HTTP server or shared network drive of your own. See the comments at the top of the file build.xml in the HyperSQL build directory about where to obtain these things and how to hook them in. The same Gradle task installDbImages explained above can download and install the entire stylesheet bundle (this option is offered the first time that you run the installDbImages task).
                  [Tip]Tip

                  If running Gradle, you probably want to turn logging up to level info for generation and validation tasks, because the default warn/lifecycle level doesn't give much feedback.

                  The task/target validate-docs is also very useful to DocBook builders.

                  The documentation license does not allow you to post modifications to our guides, but you can modify them for internal use by your organization, and you can use our DocBook system to write new DocBook documents related or unrelated to HyperSQL. To create new DocBook documents, create a subdirectory off of doc-src for each new document, with the main DocBook source file within having same name as the directory plus .xml. See the peer directory util-guide or guide as an example. If you use the high-level tasks/target gen-docs or validate-docs, then copy and paste to add new stanzas to these targets in file build.xml.

                  Editors of DocBook documents (see previous paragraph for motive) may find it useful to have a standalone XML validator so you can do your primary editing without involvement of the build system. Use the Gradle target standaloneValidation for this. It will tell you how to set a build property to tell it where to install the validator, and will give instructions on how to use it.

                  There are several properties that can be used to dramatically decrease run times for partial doc builds. Read about these properties in comment at the top of the file build-docbook.xml in the build directory.

                  • validation.skip
                  • html.skip
                  • chunk.skip
                  • fo.skip
                  • pdf.skip
                  • doc.name
                  • doc.target

                  See the file doc-src/readme-docauthors.txt for details about our DocBook build system (though as I write this it is somewhat out of date).


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/dbproperties-chapt.html0000644000175000017500000037632412007567744022465 0ustar renerene Chapter 12. Properties

                  Chapter 12. Properties

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5039 $

                  Copyright 2002-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  Connection URL

                  The normal method of accessing a HyperSQL catalog is via the JDBC Connection interface. An introduction to different methods of providing database services and accessing them can be found in the SQL Language chapter. Details and examples of how to connect via JDBC are provided in our JavaDoc for JDBCConnection.

                  A uniform method is used to distinguish between different types of connection. The common driver identifier is jdbc:hsqldb: followed by a protocol identifier (mem: file: res: hsql: http: hsqls: https:) then followed by host and port identifiers in the case of servers, then followed by database identifier. Additional property / value pairs can be appended to the end of the URL, separated with semicolons.

                  Table 12.1. Memory Database URL

                  Driver and ProtocolHost and Port ExampleDatabase Example
                  jdbc:hsqldb:mem:
                  not available
                  accounts

                  Lowercase, single-word identifier creates the in-memory database when the first connection is made. Subsequent use of the same Connection URL connects to the existing DB.

                  The old form for the URL, jdbc:hsqldb:. creates or connects to the same database as the new form for the URL, jdbc:hsqldb:mem:.


                  Table 12.2. File Database URL

                  Driver and ProtocolHost and Port ExampleDatabase Example
                  jdbc:hsqldb:file:
                  not available
                  accounts
                  /opt/db/accounts
                  C:/data/mydb

                  The file path specifies the database files. It should consist of a relative or absolute path to the directory containing the database files, followed by a '/' and the database name. In the above examples the first one refers to a set of mydb.* files in the directory where the javacommand for running the application was issued. The second and third examples refer to absolute paths on the host machine: For example, files named accounts.* in the directory /opt/db for the accounts database.


                  Table 12.3. Resource Database URL

                  Driver and ProtocolHost and Port ExampleDatabase Example
                  jdbc:hsqldb:res:
                  not available
                  /adirectory/dbname
                  Database files can be loaded from one of the jars specified as part of the Java command the same way as resource files are accessed in Java programs. The /adirectory above stands for a directory in one of the jars.

                  Table 12.4. Server Database URL

                  Driver and ProtocolHost and Port ExampleDatabase Example
                  jdbc:hsqldb:hsql:
                  jdbc:hsqldb:hsqls:
                  jdbc:hsqldb:http:
                  jdbc:hsqldb:https:
                  //localhost
                  //192.0.0.10:9500
                  //dbserver.somedomain.com
                  /an_alias
                  /enrolments
                  /quickdb

                  The host and port specify the IP address or host name of the server and an optional port number. The database to connect to is specified by an alias. This alias is a lowercase string defined in the server.properties file to refer to an actual database on the file system of the server or a transient, in-memory database on the server. The following example lines in server.properties or webserver.properties define the database aliases listed above and accessible to clients to refer to different file and in-memory databases.

                  The old form for the server URL, e.g., jdbc:hsqldb:hsql//localhost connects to the same database as the new form for the URL, jdbc:hsqldb:hsql//localhost/ where the alias is a zero length string.


                  Variables In Connection URL

                  Two types of variables are allowed for mem: and file: database URLs.

                  If the database part of a file: database begins with ~/ or ~\ the tilde character is replaced with the value of the system property "user.home" resulting in the database being created or accessed in this directory, or one of its subdirectories. In the example below, the database files for mydb are located in the user's home directory.

                      jdbc:hsqldb:file:~/mydb;shutdown=true

                  If the database URL contains a string in the form of ${propname} then the sequence of characters is replaced with the system property with the given name. For example you can use this in the URL of a database that is used in a web application and define the system property, "propname" in the web application properties. In the example below, the string ${mydbpath} is replaced with the value of the property, mydbpath

                      jdbc:hsqldb:file:${mydbpath};sql.enforce_types=true

                  Connection properties

                  Each JDBC Connection to a database can specify connection properties. The properties user and password are always required. The following optional properties can also be used.

                  Connection properties are specified either by establishing the connection via the method call below, or the property can be appended to the full Connection URL.

                      DriverManager.getConnection (String url, Properties info);

                  Table 12.5. User and Password

                  NameDefaultDescription
                  userSAuser name

                  Standard property. This property is case sensitive. Example below:

                      jdbc:hsqldb:file:enrolments;user=aUserName;ifexists=true
                  passwordempty stringpassword for the user

                  Standard property. This property is case sensitive. Example below:

                      jdbc:hsqldb:file:enrolments;user=aUserName;password=3xLVz

                  For compatibility with other engines, a non-standard form of specifying user and password is also supported. In this form, user name and password appear at the end of the URL string, prefixed respectively with the question mark and the ampersand:

                      jdbc:hsqldb:file:enrolments;create=false?user=aUserName&password=3xLVz

                  Table 12.6. Column Names in JDBC ResultSet

                  NameDefaultDescription
                  get_column_nametruecolumn name in ResultSet

                  This property is used for compatibility with other JDBC driver implementations. When true (the default), ResultSet.getColumnName(int c) returns the underlying column name. This property can be specified differently for different connections to the same database.

                  The default is true. When the property is false, the above method returns the same value as ResultSet.getColumnLabel(int column) Example below:

                      jdbc:hsqldb:hsql://localhost/enrolments;get_column_name=false

                  When a ResultSet is used inside a user-defined stored procedure, the default, true, is always used for this property.


                  Table 12.7. Creating New Database

                  NameDefaultDescription
                  ifexistsfalseconnect only if database already exists

                  Has an effect only with mem: and file: database. When true, will not create a new database if one does not already exist for the URL.

                  When the property is false (the default), a new mem: or file: database will be created if it does not exist.

                  Setting the property to true is useful when troubleshooting as no database is created if the URL is malformed. Example below:

                      jdbc:hsqldb:file:enrolments;ifexists=true
                  createtruecreate the database if it does not exist

                  Similar to the ifexists property, but with opposite meaning.

                  Has an effect only with mem: and file: database. When false, will not create a new database if one does not already exist for the URL.

                  When the property is true (the default), a new mem: or file: database will be created if it does not exist.

                  Setting the property to true is useful when troubleshooting as no database is created if the URL is malformed. Example below:

                      jdbc:hsqldb:file:enrolments;create=false

                  Table 12.8. Automatic Shutdown

                  NameDefaultDescription
                  shutdownfalseshut down the database when the last connection is closed

                  If this property is true, when the last connection to a database is closed, the database is automatically shut down. The property takes effect only when the first connection is made to the database. This means the connection that opens the database. It has no effect if used with subsequent connections.

                  This command has two uses. One is for test suites, where connections to the database are made from one JVM context, immediately followed by another context. The other use is for applications where it is not easy to configure the environment to shutdown the database. Examples reported by users include web application servers, where the closing of the last connection coincides with the web app being shut down.

                      jdbc:hsqldb:file:enrolments;shutdown=true

                  In addition, when the first connection to an in-process file: or mem: database creates a new database all the user-defined database properties can be specified as URL properties. See the next section for details.

                  Database Properties in Connection URL and Properties

                  The database engine has several properties that are listed in the System Management chapter. These properties can be changed via SQL commands after a connection is made to the database. It is possible to specify most of these properties in the connection properties or as part of the URL string when the first connection is made to a new file: or mem: database. This allows the properties to be set without using any SQL commands. The corresponding SQL command is given for each property.

                  If the properties are used for connection to an existing database, they are ignored. The exceptions are the following property settings that are allowed for the first connection to an existing database: readonly=true, files_readonly=true, hsqldb.lock_file=false, hsqldb.sqllog=1-3. These specific property / value pairs override the existing database properties. For example a normal database is opened as readonly, or the lock file is not created, or the sqllog level is set to a value between 1 and 3.

                  Management of properties has changed since version 1.8. The old SET PROPERTY statement does not change a property and is ignored. The statement is retained to simplify application upgrades.

                  In the example URL below, two properties are set for the first connection to a new database.

                      jdbc:hsqldb:file:enrolments;hsqldb.cache_rows=10000;hsqldb.nio_data_file=false

                  In the table below, database properties that can be used as part of the URL or in connection properties are listed. For each property that can also be set with an SQL statement, the statement is also given. These statements are described more extensively in the System Management chapter.

                  Table 12.9. Validity Check Property

                  NameDefaultDescription
                  check_propsfalsechecks the validity of the connection properties

                  If the property is true, every database property that is specified on the URL or in connection properties is checked and if it is not used correctly, an error is returned.

                  this property cannot be set with an SQL statement

                  SQL Conformance Properties

                  Table 12.10. SQL Keyword Use as Identifier

                  NameDefaultDescription
                  sql.enforce_namesfalseenforcing SQL keywords

                  This property, when set true, prevents SQL keywords being used for database object names such as columns and tables.

                  SET DATABASE SQL NAMES { TRUE | FALSE }

                  Table 12.11. SQL Keyword Starting with the Underscore or Containing Dollar Characters

                  NameDefaultDescription
                  sql.regular_namestrueenforcing SQL keywords

                  This property, when set true, prevents database object names such as columns and tables beginning with the underscore or containing the dollar character.

                  SET DATABASE SQL REGULAR NAMES { TRUE | FALSE }

                  Table 12.12. Reference to Columns Names

                  NameDefaultDescription
                  sql.enforce_refsfalseenforcing column reference disambiguation

                  This property, when set true, causes an error when an SQL statement (usually a select statement) contains column references that can be resolved by more than one table name or alias. In effect forces such column references to have a table name or table alias qualifier.

                  SET DATABASE SQL REFERENCES { TRUE | FALSE }

                  Table 12.13. String Size Declaration

                  NameDefaultDescription
                  sql.enforce_sizetruesize enforcement of string columns

                  Conforms to SQL standards for size and precision of data types. When true, all VARCHAR column type declarations require a size. When the property is false and there is no size in the declaration, a default size is used. Note that all other types accept a declaration without a size, which is interpreted as a default size.

                  SET DATABASE SQL SIZE { TRUE | FALSE }

                  Table 12.14. Type Enforcement in Comparison and Assignment

                  NameDefaultDescription
                  sql.enforce_typesfalseenforcing type compatibility

                  This property, when set true, causes an error when an SQL statements contains comparisons or assignments that are non-standard due to type mismatch. Most illegal comparisons and assignments will cause an exception regardless of this setting. This setting applies to a small number of comparisons and assignments that are possible, but not standard conformant, and were allowed in previous versions of HSQLDB.

                  SET DATABASE SQL TYPES { TRUE | FALSE }

                  Table 12.15. Foreign Key Triggered Data Change

                  NameDefaultDescription
                  sql.enforce_tdc_deletetrueenforcing triggered data change violation for deletes

                  The ON DELETE and ON UPDATE clauses of constraints cause data changes in rows in different tables or the same table. When there are multiple constraints, a row may be updated by one constraint and deleted by another constraint in the same operation. This is not allowed by default. Changing this property to false allows such violations of the Standard to pass without an exception. Used for porting from database engines that do not enforce the constraints.

                  SET DATABASE SQL TDC DELETE { TRUE | FALSE }
                   
                  sql.enforce_tdc_updatetrueenforcing triggered data change violation for updates

                  The ON DELETE and ON UPDATE clauses of foreign key constraints cause data changes in rows in different tables or the same table. With multiple constraint, a field may be updated by two constraints and set to different values. This is not allowed by default. Changing this property to false allows such violations of the Standard to pass without an exception. Used for porting from database engines that do not enforce the constraints properly.

                  SET DATABASE SQL TDC UPDATE { TRUE | FALSE }

                  Table 12.16. Use of LOB for LONGVAR Types

                  NameDefaultDescription
                  sql.longvar_is_lobfalsetranslating longvarchar and longvarbinary to lob

                  This property, when set true, causes type declarations using LONGVARCHAR and LONGVARBINARY to be translated to CLOB and BLOB respectively. By default, they are translated to VARCHAR and VARBINARY.

                  SET DATABASE SQL LONGVAR IS LOB { TRUE | FALSE }

                  Table 12.17. Concatenation with NULL

                  NameDefaultDescription
                  sql.concat_nullstruebehaviour of concatenation involving one null

                  This property, when set false, causes the concatenation of a null and a not null value to return the not null value. By default, it returns null.

                  SET DATABASE SQL CONCAT NULLS { TRUE | FALSE }

                  Table 12.18. NULL in Multi-Column UNIQUE Constraints

                  NameDefaultDescription
                  sql.unique_nullstruebehaviour of multi-column UNIQUE constraints with null values

                  This property, when set false, causes multi-column unique constrains to be more restrictive for value sets that contain a mix of null and not null values.

                  SET DATABASE SQL UNIQUE NULLS { TRUE | FALSE }

                  Table 12.19. Truncation or Rounding in Type Conversion

                  NameDefaultDescription
                  sql.convert_trunctruebehaviour of type conversion from DOUBLE to integral types

                  This property, when set false, causes type conversions from DOUBLE to any integral type to use rounding. By default truncation is used.

                  SET DATABASE SQL CONVERT TRUNCATE { TRUE | FALSE }

                  Table 12.20. Decimal Scale of Division and AVG Values

                  NameDefaultDescription
                  sql.avg_scale0decimal scale of values returned by division and the AVG and MEDIAN aggregate functions

                  By default, the result of a division or an AVG or MEDIAN aggregate has the same type and scale as the aggregated value. For INTEGER types, the scale is 0. When this property is set to a value other than the default 0, then the scale is used if it is greater than the scale of the divisor or aggregated value. This property does not affect DOUBLE values. Values between 0 - 10 can be used for this property.

                  SET DATABASE SQL AVG SCALE <numeric value>

                  Table 12.21. Support for NaN values

                  NameDefaultDescription
                  sql.double_nantruebehaviour of expressions returning DOUBLE NaN

                  This property, when set false, causes division of DOUBLE values by Zero to return a Double.NaN value. By default an exception is thrown.

                  SET DATABASE SQL DOUBLE NAN { TRUE | FALSE }

                  Table 12.22. Sort order of NULL values

                  NameDefaultDescription
                  sql.nulls_firsttrueordering of NULL values

                  By default, nulls appear before not-null values when a result set is ordered without specifying NULLS FIRST or NULLS LAST. This property, when set false, causes nulls to appear by default after not-null values in result sets with ORDER BY

                  SET DATABASE SQL NULLS FIRST { TRUE | FALSE }

                  Table 12.23. String comparison with padding

                  NameDefaultDescription
                  sql.pad_spacetrueordering of strings with trailing spaces

                  By default, when two strings are compared, he shorter string is padded with spaces before comparison. When this property is set false, no padding takes place before comparison. Without padding, the shorter string is never equal to the longer one.

                  Before version 2.0, HSQLDB used NO PAD comparison. If you need the old behaviour, use this property when opening an older database.

                  SET DEFAULT COLLATION <collation name> [ NO PAD | PAD SPACE ]

                  Table 12.24. DB2 Style Syntax

                  NameDefaultDescription
                  sql.syntax_db2falsesupport for DB2 style syntax

                  This property, when set true, allows compatibility with some aspects of this dialect.

                  SET DATABASE SQL SYNTAX DB2 { TRUE | FALSE }

                  Table 12.25. MSSQL Style Syntax

                  NameDefaultDescription
                  sql.syntax_mssfalsesupport for MS SQL Server style syntax

                  This property, when set true, switches the arguments of the CONVERT function and also allow compatibility with some other aspects of this dialect.

                  SET DATABASE SQL SYNTAX MSS { TRUE | FALSE }

                  Table 12.26. MySQL Style Syntax

                  NameDefaultDescription
                  sql.syntax_mysfalsesupport for MySQL style syntax

                  This property, when set true, enables support for TEXT and AUTO_INCREMENT types and also allow compatibility with some other aspects of this dialect.

                  SET DATABASE SQL SYNTAX MYS { TRUE | FALSE }

                  Table 12.27. Oracle Style Syntax

                  NameDefaultDescription
                  sql.syntax_orafalsesupport for Oracle style syntax

                  This property, when set true, enables support for non-standard types. It also enables DUAL, ROWNUM, NEXTVAL and CURRVAL syntax and and also allow compatibility with some other aspects of this dialect.

                  SET DATABASE SQL SYNTAX ORA { TRUE | FALSE }

                  Table 12.28. PostgreSQL Style Syntax

                  NameDefaultDescription
                  sql.syntax_pgsfalsesupport for PostgreSQL style syntax

                  This property, when set true, enables support for TEXT and SERIAL types. It also enables NEXTVAL, CURRVAL and LASTVAL syntax and also allow compatibility with some other aspects of this dialect.

                  SET DATABASE SQL SYNTAX PGS { TRUE | FALSE }

                  Database Operations Properties

                  Table 12.29. Default Table Type

                  NameDefaultDescription
                  hsqldb.default_table_typememorytype of table created with unqualified CREATE TABLE

                  The CREATE TABLE command results in a MEMORY table by default. Setting the value cached for this property will result in a cached table by default. The qualified forms such as CREATE MEMORY TABLE or CREATE CACHED TABLE are not affected at all by this property.

                  SET DATABASE DEFAULT TABLE TYPE { CACHED | MEMORY }

                  Table 12.30. Transaction Control Mode

                  NameDefaultDescription
                  hsqldb.txlocksdatabase transaction control mode

                  Indicates the transaction control mode for the database. The values, locks, mvlocks and mvcc are allowed.

                  SET DATABASE TRANSACTION CONTROL { LOCKS | MVLOCKS | MVCC }

                  Table 12.31. Default Isolation Level for Sessions

                  NameDefaultDescription
                  hsqldb.tx_levelread_commiteddatabase default transaction isolation level

                  Indicates the default transaction isolation level for each new session. The values, read_committed and serializable are allowed. Individual sessions can change their isolation level.

                  SET DATABASE DEFAULT ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE }

                  Table 12.32. Transaction Rollback in Deadlock

                  NameDefaultDescription
                  hsqldb.tx_conflict_rollbacktrueeffect of deadlock or other conflicts on transaction

                  When a transaction deadlock or other unresolvable conflict is about to happen, the current transaction is rolled back and an exception is raised. When this property is set false, the transaction is not rolled back. Only the latest action that would cause the conflict is undone and an error is returned. The property should not be changed unless the application can quickly perform an alternative statement and complete the transaction. It is provided for compatibility with other database engines which do not roll back the transaction upon deadlock.

                  SET DATABASE TRANSACTION ROLLBACK ON CONFLICT { TRUE | FALSE }

                  Table 12.33. Time Zone and Interval Types

                  NameDefaultDescription
                  hsqldb.translate_tti_typestrueusage of type codes for advanced datetime and interval types

                  If the property is true, the TIME / TIMESTAMP WITH TIME ZONE types and INTERVAL types are represented in JDBC methods of ResultSetMetaData and DatabaseMetaData as JDBC datetime types without time zone and the VARCHAR type respectively. The original type names are preserved.

                  SET DATABASE SQL TRANSLATE TTI TYPES { TRUE | FALSE }

                  Database File and Memory Properties

                  Table 12.34. Opening Database as Read Only

                  NameDefaultDescription
                  readonlyfalsereadonly database - is used to open an existing file: database

                  This property is a special property that can be added manually to the .properties file, or included in the URL or connection properties. When this property is true, the database becomes readonly. This can be used with an existing database to open it for readonly operation.

                  this property cannot be set with an SQL statement - it can be used in the .properties file

                  Table 12.35. Opening Database Without Modifying the Files

                  NameDefaultDescription
                  files_readonlyfalsereadonly files database - is used to open an existing file: database

                  This property is used similarly to the hsqldb.readonly property. When this property is true, CACHED and TEXT tables are readonly but memory tables are not. Any change to the data is not persisted to database files.

                  this property cannot be set with an SQL statement - it can be used in the .properties file

                  Table 12.36. Huge database files and tables

                  NameDefaultDescription
                  hsqldb.large_datafalseenable huge database files

                  By default, up to 2 billion rows can be stored in disk-based CACHED tables. Setting this property to true increases the limit to 512 billion rows. This property is used as a connection property.

                  this property cannot be set with an SQL statement - it can be used as a connection property for the connection that opens the database

                  Table 12.37. Temporary Result Rows in Memory

                  NameDefaultDescription
                  hsqldb.result_max_memory_rows0storage of temporary results and tables in memory or on disk

                  This property can be set to specify how many rows of each results or temporary table are stored in memory before the table is written to disk. The default is zero and means data is always stored in memory. If this setting is used, it should be set above 1000.

                  SET DATABASE DEFAULT RESULT MEMORY ROWS <numeric value>

                  Table 12.38. Event Logging

                  NameDefaultDescription
                  hsqldb.applog0application logging level

                  The default level 0 indicates no logging. Level 1 results in minimal logging, including any failures. Level 2 indicates all events, including ordinary events. LEVEL 3 adds details of some of the normal operations. The events are logged in a file ending with ".app.log".

                  SET DATABASE EVENT LOG LEVEL { 0 | 1 | 2 | 3}

                  Table 12.39. SQL Logging

                  NameDefaultDescription
                  hsqldb.sqllog0sql logging level - can also be used to open an existing file: database

                  The default level 0 indicates no logging. Level 1 currently logs only commits and rollbacks. Level 2 currently logs all the SQL statements executed, together with their parameter values. Level 3 will be supported in the future. The events are logged in a file ending with ".sql.log". This property applies to existing file: databases as well as new databases.

                  SET DATABASE EVENT LOG SQL LEVEL { 0 | 1 | 2 }

                  Table 12.40. Rows Cached In Memory

                  NameDefaultDescription
                  hsqldb.cache_free_count512maximum number of unused space recovery

                  The default indicates 512 unused spaces are kept for later use. The value can range between 0 - 8096.

                  When rows are deleted, the space is recovered and kept for reuse for new rows. If too many rows are deleted, the smaller recovered spaces are lost and the largest ones are retained for later use. Normally there is no need to set this property.

                  this property cannot be set with an SQL statement

                  Table 12.41. Rows Cached In Memory

                  NameDefaultDescription
                  hsqldb.cache_rows50000maximum number of rows in memory cache

                  Indicates the maximum number of rows of cached tables that are held in memory.

                  The value can range between 100- 4 billion. If the value is set via SET FILES then it becomes effective after the next database SHUTDOWN or CHECKPOINT.

                  SET FILES CACHE ROWS <numeric value>

                  Table 12.42. Size of Rows Cached in Memory

                  NameDefaultDescription
                  hsqldb.cache_size10000memory cache size

                  Indicates the total size (in kilobytes) of rows in the memory cache used with cached tables. This size is calculated as the binary size of the rows, for example an INTEGER is 4 bytes. The actual memory size used by the objects is 2 to 4 times this value. This depends on the types of objects in database rows, for example with binary objects the factor is less than 2, with character strings, the factor is just over 2 and with date and timestamp objects the factor is over 3.

                  The value can range between 100 KB - 4 GB. The default is 10,000, representing 10,000 kilobytes. If the value is set via SET FILES then it becomes effective after the next database SHUTDOWN or CHECKPOINT.

                  SET FILES CACHE SIZE <numeric value>

                  Table 12.43. Size Scale of Disk Table Storage

                  NameDefaultDescription
                  hsqldb.cache_file_scale32unit used for storage of rows in the .data file

                  The default value corresponds to a maximum size of 64 GB for the .data file. This can be increased to 64, 128, 256, 512, or 1024 resulting in up to 2 TB GB storage. Settings below 32 in older databases are preserved until a SHUTDOWN COMPACT.

                  SET FILES SCALE <numeric value>

                  Table 12.44. Size Scale of LOB Storage

                  NameDefaultDescription
                  hsqldb.lob_file_scale32unit used for storage of lobs in the .lobs file

                  The default value represents units of 32KB. When the average size of individual lobs in the database is smaller, a smaller unit can be used to reduce the overall size of the .lobs file. Values 1, 2, 4, 8, 16, 32 can be used.

                  SET FILES LOB SCALE <numeric value>

                  Table 12.45. Internal Backup of Database Files

                  NameDefaultDescription
                  hsqldb.inc_backuptrueincremental backup of data file

                  During updates, the contents of the .data file are modified. When this property is true, the modified contents are backed up gradually. This causes a marginal slowdown in operations, but allows fast checkpoint and shutdown.

                  When the property is false, the .data file is backed up entirely at the time of checkpoint and shutdown. Up to version 1.8, HSQLDB supported only full backup.

                  SET FILES BACKUP INCREMENT { TRUE | FALSE }

                  Table 12.46. Use of Lock File

                  NameDefaultDescription
                  hsqldb.lock_filetrueuse of lock file - can also be used with an existing database

                  By default, a lock file is created for each file database that is opened for read and write. This property can be specified with the value false to prevent the lock file from being created. This usage is not recommended but may be desirable when flash type storage is used. This property applies to existing file: databases as well as new databases.

                  this property cannot be set with an SQL statement

                  Table 12.47. Logging Data Change Statements

                  NameDefaultDescription
                  hsqldb.log_datatruelogging data change

                  This property can be set to false when database recovery in the event of an unexpected crash is not necessary. A database that is used as a temporary cache is an example. Regardless of the value of this property, if there is a proper shutdown of the database, all the changed data is stored. A checkpoint or shutdown still rewrites the .script file and saves the .backup file according to the other settings.

                  SET FILES LOG  { TRUE | FALSE }

                  Table 12.48. Automatic Checkpoint Frequency

                  NameDefaultDescription
                  hsqldb.log_size50size of log when checkpoint is performed

                  The value is the size (in megabytes) that the .log file can reach before an automatic checkpoint occurs. A checkpoint rewrites the .script file and clears the .log file.

                  SET FILES LOG SIZE <numeric value>

                  Table 12.49. Automatic Defrag at Checkpoint

                  NameDefaultDescription
                  hsqldb.defrag_limit0percentage of unused space causing a defrag at checkpoint

                  When a checkpoint is performed, the percentage of wasted space in the .data file is calculated. If the wasted space is above the specified limit, a defrag operation is performed. The default is 0, which means no automatic checkpoint. The numeric value must be between 0 and 100 and is interpreted as a percentage of the current size of the .data file.

                  SET FILES DEFRAG <numeric value>

                  Table 12.50. Logging Data Change Statements Frequency

                  NameDefaultDescription
                  hsqldb.write_delaytruewrite delay for writing and performing sync() of log file entries

                  If the property is true, the default WRITE DELAY property of the database is used, which is 500 milliseconds. If the property is false, the WRITE DELAY is set to 0 seconds. The SQL command for this property allows more precise control over the property.

                  SET FILES WRITE DELAY {{ TRUE | FALSE } | <seconds value> | <milliseconds value> MILLIS

                  Table 12.51. Logging Data Change Statements Frequency

                  NameDefaultDescription
                  hsqldb.write_delay_millis500write delay for writing log file entries

                  If the property is used, the WRITE DELAY property of the database is set the given value in milliseconds. The SQL command for this property allows the same level of control over the property.

                  SET FILES WRITE DELAY {{ TRUE | FALSE } | <seconds value> | <milliseconds value> MILLIS

                  Table 12.52. Use of NIO for Disk Table Storage

                  NameDefaultDescription
                  hsqldb.nio_data_filetrueuse of nio access methods for the .data file

                  Setting this property to false will avoid the use of nio access methods, resulting in somewhat reduced speed. If the data file is larger than hsqldb.nio_max_size (default 256MB) when it is first opened (or when its size is increased), nio access methods are not used. Also, if the file gets larger than the amount of available computer memory that needs to be allocated for nio access, non-nio access methods are used.

                  SET FILES NIO { TRUE | FALSE }

                  Table 12.53. Use of NIO for Disk Table Storage

                  NameDefaultDescription
                  hsqldb.nio_max_size256nio buffer size limit

                  The maximum size of .data file in mega bytes that can use the nio access method. When the file gets larger than this limit, non-nio access methods are used. Values 64, 128, 256, 512, 1024, and larger multiples of 512 can be used. The default is 256MB.

                  SET FILES NIO SIZE <numeric value>

                  Table 12.54. Recovery Log Processing

                  NameDefaultDescription
                  hsqldb.full_log_replayfalserecovery log processing

                  The .log file is processed during recovery after a forced shutdwon. Out of memory conditions always abort the startup. Any other exception stops the processing of the .log file and by default, continues the startup process. If this property is true, the startup process is stopped if any exception occurs. Exceptions are usually caused by incomplete lines of SQL statements near the end of the .log file, which were not fully synced to disk when an abnormal shutdown occurred.

                  This property cannot be set with an SQL statement

                  Table 12.55. Default Properties for TEXT Tables

                  NameDefaultDescription
                  textdb.*0default properties for new text tables

                  Properties that override the database engine defaults for newly created text tables. Settings in the text table SET <tablename> SOURCE <source string> command override both the engine defaults and the database properties defaults. Individual textdb.* properties are listed in the Text Tables chapter.


                  Table 12.56. Forcing Garbage Collection

                  NameDefaultDescription
                  runtime.gc_interval0forced garbage collection

                  This setting forces garbage collection each time a set number of result set row or cache row objects are created. The default, "0" means no garbage collection is forced by the program.

                  SET DATABASE GC <numeric value>

                  Crypt Properties

                  Table 12.57. Crypt Property For LOBs

                  NameDefaultDescription
                  crypt_lobsfalseencryption of lobs

                  If the property is true, the contents of the .lobs file is encrypted as well.

                  this property cannot be set with an SQL statement

                  Table 12.58. Cipher Key for Encrypted Database

                  NameDefaultDescription
                  crypt_keynoneencryption

                  The cipher key for an encrypted database.

                  this property cannot be set with an SQL statement

                  Table 12.59. Crypt Provider Encrypted Database

                  NameDefaultDescription
                  crypt_providernoneencryption

                  The fully-qualified class name of the cryptography provider. This property is not used for the default security provider.

                  this property cannot be set with an SQL statement

                  Table 12.60. Cipher Specification for Encrypted Database

                  NameDefaultDescription
                  crypt_typenoneencryption

                  The cipher specification.

                  this property cannot be set with an SQL statement

                  When connecting to an in-process database creates a new database, or opens an existing database (i.e. it is the first connection made to the database by the application), all the user-defined database properties listed in this section can be specified as URL properties.

                  When HSQLDB is used with OpenOffice.org as an external database, the property "default_schema=true" must be set on the URL, otherwise the program will not operate correctly as it does with its built-in hsqldb instance.

                  System Properties

                  A few system properties are used by HyperSQL. These are set on the Java command line or by calling System.setProperty() from the user's program. They are not valid as URL or connection properties.

                  Table 12.61. Logging Framework

                  NameDefaultDescription
                  hsqldb.reconfig_loggingtrueconfiguring the framework logging

                  Setting this system property false avoids reconfiguring the framework logging system such as Log4J or java.util.Logging. If the property does not exist or is true, reconfiguration takes place.


                  Table 12.62. Text Tables

                  NameDefaultDescription
                  textdb.allow_full_pathfalsetext table file locations

                  Setting this system property true allows text table sources to be opened on all available paths. By default, only the database directory and its subdirectories are allowed. See the Text Tables chapter.


                  Table 12.63. Java Functions

                  NameDefaultDescription
                  hsqldb.method_class_namesnoneallowed Java classes

                  This property needs to be set with the names (including wildcards) of Java classes that can be used for routines based on Java static methods. See the SQL Invoked Routines chapter.



                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/lists-app.html0000644000175000017500000002732112007567744020570 0ustar renerene Appendix A. Lists of Keywords

                  Lists of Keywords

                  List of SQL Keywords

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 847 $

                  2012-08-06 00:10:58+0100

                  List of SQL Standard Keywords

                  According to the SQL Standard, the SQL Language keywords cannot be used as identifiers (names of database objects such as columns and tables) without quoting.

                  HyperSQL has two modes of operation, which are selected with the SET DATABASE SQL NAMES { TRUE | FALSE } to allow or disallow the keywords as identifiers. The default mode is FALSE and allows the use of most keywords as identifiers. Even in this mode, keywords cannot be used as USER or ROLE identifiers. When the mode is TRUE, none of the keywords listed below can be used as identifiers.

                  All keywords can be used with double quotes as identifiers. For example

                    CREATE TABLE "ALL" ("AND" INT, "WHEN" INT)
                    SELECT "AND" FROM "ALL" WHERE "WHEN" = 2020
                  

                  ABS • ALL • ALLOCATE • ALTER • AND • ANY • ARE • ARRAY • AS • ASENSITIVE • ASYMMETRIC • AT • ATOMIC • AUTHORIZATION • AVG

                  BEGIN • BETWEEN • BIGINT • BINARY • BLOB • BOOLEAN • BOTH • BY

                  CALL • CALLED • CARDINALITY • CASCADED • CASE • CAST • CEIL • CEILING • CHAR • CHAR_LENGTH • CHARACTER • CHARACTER_LENGTH • CHECK • CLOB • CLOSE • COALESCE • COLLATE • COLLECT • COLUMN • COMMIT • COMPARABLE • CONDITION • CONNECT • CONSTRAINT • CONVERT • CORR • CORRESPONDING • COUNT • COVAR_POP • COVAR_SAMP • CREATE • CROSS • CUBE • CUME_DIST • CURRENT • CURRENT_CATALOG • CURRENT_DATE • CURRENT_DEFAULT_TRANSFORM_GROUP • CURRENT_PATH • CURRENT_ROLE • CURRENT_SCHEMA • CURRENT_TIME • CURRENT_TIMESTAMP • CURRENT_TRANSFORM_GROUP_FOR_TYPE • CURRENT_USER • CURSOR • CYCLE

                  DATE • DAY • DEALLOCATE • DEC • DECIMAL • DECLARE • DEFAULT • DELETE • DENSE_RANK • DEREF • DESCRIBE • DETERMINISTIC • DISCONNECT • DISTINCT • DO • DOUBLE • DROP • DYNAMIC

                  EACH • ELEMENT • ELSE • ELSEIF • END • END_EXEC • ESCAPE • EVERY • EXCEPT • EXEC • EXECUTE • EXISTS • EXIT • EXP • EXTERNAL • EXTRACT

                  FALSE • FETCH • FILTER • FIRST_VALUE • FLOAT • FLOOR • FOR • FOREIGN • FREE • FROM • FULL • FUNCTION • FUSION

                  GET • GLOBAL • GRANT • GROUP • GROUPING

                  HANDLER • HAVING • HOLD • HOUR

                  IDENTITY • IN • INDICATOR • INNER • INOUT • INSENSITIVE • INSERT • INT • INTEGER • INTERSECT • INTERSECTION • INTERVAL • INTO • IS • ITERATE

                  JOIN

                  LAG

                  LANGUAGE • LARGE • LAST_VALUE • LATERAL • LEAD • LEADING • LEAVE • LEFT • LIKE • LIKE_REGEX • LN • LOCAL • LOCALTIME • LOCALTIMESTAMP • LOOP • LOWER

                  MATCH • MAX • MAX_CARDINALITY • MEMBER • MERGE • METHOD • MIN • MINUTE • MOD • MODIFIES • MODULE • MONTH • MULTISET

                  NATIONAL • NATURAL • NCHAR • NCLOB • NEW • NO • NONE • NORMALIZE • NOT • NTH_VALUE • NTILE • NULL • NULLIF • NUMERIC

                  OCCURRENCES_REGEX • OCTET_LENGTH • OF • OFFSET • OLD • ON • ONLY • OPEN • OR • ORDER • OUT • OUTER • OVER • OVERLAPS • OVERLAY

                  PARAMETER • PARTITION • PERCENT_RANK • PERCENTILE_CONT • PERCENTILE_DISC • POSITION • POSITION_REGEX • POWER • PRECISION • PREPARE • PRIMARY • PROCEDURE

                  RANGE • RANK • READS • REAL • RECURSIVE • REF • REFERENCES • REFERENCING • REGR_AVGX • REGR_AVGY • REGR_COUNT • REGR_INTERCEPT • REGR_R2 • REGR_SLOPE • REGR_SXX • REGR_SXY • REGR_SYY • RELEASE • REPEAT • RESIGNAL • RESULT • RETURN • RETURNS • REVOKE • RIGHT • ROLLBACK • ROLLUP • ROW • ROW_NUMBER • ROWS

                  SAVEPOINT • SCOPE • SCROLL • SEARCH • SECOND • SELECT • SENSITIVE • SESSION_USER • SET • SIGNAL • SIMILAR • SMALLINT • SOME • SPECIFIC • SPECIFICTYPE • SQL • SQLEXCEPTION • SQLSTATE • SQLWARNING • SQRT • STACKED • START • STATIC • STDDEV_POP • STDDEV_SAMP • SUBMULTISET • SUBSTRING • SUBSTRING_REGEX • SUM • SYMMETRIC • SYSTEM • SYSTEM_USER

                  TABLE • TABLESAMPLE • THEN • TIME • TIMESTAMP • TIMEZONE_HOUR • TIMEZONE_MINUTE • TO • TRAILING • TRANSLATE • TRANSLATE_REGEX • TRANSLATION • TREAT • TRIGGER • TRIM • TRIM_ARRAY • TRUE • TRUNCATE

                  UESCAPE • UNDO • UNION • UNIQUE • UNKNOWN • UNNEST • UNTIL • UPDATE • UPPER • USER • USING

                  VALUE • VALUES • VAR_POP • VAR_SAMP • VARBINARY • VARCHAR • VARYING

                  WHEN • WHENEVER • WHERE • WIDTH_BUCKET • WINDOW • WITH • WITHIN • WITHOUT • WHILE

                  YEAR

                  List of SQL Keywords Disallowed as HyperSQL Identifiers

                  When the default SET DATABASE SQL NAMES FALSE mode is used, only a subset of SQL Standard keywords cannot be used as HyperSQL identifiers. The keywords are as follows:

                  ALL • AND • ANY • AS • AT • AVG

                  BETWEEN • BOTH • BY

                  CALL • CASE • CAST • COALESCE • CORRESPONDING • CONVERT • COUNT • CREATE • CROSS

                  DEFAULT • DISTINCT • DROP

                  ELSE • END • EVERY • EXISTS • EXCEPT

                  FOR • FROM • FULL

                  GRANT • GROUP

                  HAVING

                  IN • INNER • INTERSECT • INTO • IS

                  JOIN

                  LEFT • LEADING • LIKE

                  MAX • MIN

                  NATURAL • NOT • NULLIF

                  ON • ORDER • OR • OUTER

                  PRIMARY

                  REFERENCES • RIGHT

                  SELECT • SET • SOME • STDDEV_POP • STDDEV_SAMP • SUM

                  TABLE • THEN • TO • TRAILING • TRIGGER

                  UNION • UNIQUE • USING

                  VALUES • VAR_POP • VAR_SAMP

                  WHEN • WHERE • WITH

                  Special Function Keywords

                  HyperSQL supports SQL Standard functions that are called without parentheses. These functions include CURRENT_DATE, LOCALTIMESTAMP, TIMEZONE_HOUR, USER, etc. When the default SET DATABASE SQL NAMES FALSE mode is used, keywords that are names of SQL functions can be used as column names without double quotes in CREATE TABLE statements . But when the identifier is a column name and is referenced in SELECT or other statements, the keywords must be double quoted. Otherwise the result of the SQL function is returned instead of the column value.

                  HyperSQL also supports non-standard functions SYSTIMESTAMP, CURDATE, CURTIME, TODAY, SYSDATE and NOW which can be called with or without parentheses ( e.g. NOW() or NOW ). These names can be used as column names, but the names must be double quoted in SELECT and other statements.


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/listeners-chapt.html0000644000175000017500000014434012007570422021745 0ustar renerene Chapter 13. HyperSQL Network Listeners (Servers)

                  Chapter 13. HyperSQL Network Listeners (Servers)

                  Server, WebServer, and Servlet

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 4903 $

                  Copyright 2002-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  Listeners

                  As described in the Running and Using HyperSQL chapter, network listeners (servers) provide connectivity to catalogs from different JVM processes. The HyperSQL listeners support both ipv4 and ipv6 network addressing.

                  HyperSQL Server

                  This is the preferred way of running a database server and the fastest one. This mode uses the proprietary hsql: communications protocol. The following example of the command for starting the server starts the server with one (default) database with files named "mydb.*" and the public name (alias) of "xdb".

                      java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:mydb --dbname.0 xdb

                  Alternatively, a server.properties file can be used for passing the arguments to the server. This file must be located in the directory where the command is issued.

                      java -cp ../lib/hsqldb.jar org.hsqldb.server.Server

                  Alternatively, you can specify the path of the server.properties file on the command line. In this case, the properties file can have any name or extension, but it should be a valid properties file.

                      java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --props myserver.props

                  Use the --help argument to see the list of available arguments.

                      java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --help

                  The contents of the server.properties file is described in the next section.

                  HyperSQL HTTP Server

                  This method of access is used when the computer hosting the database server is restricted to the HTTP protocol. The only reason for using this method of access is restrictions imposed by firewalls on the client or server machines and it should not be used where there are no such restrictions. The HyperSQL HTTP Server is a special web server that allows JDBC clients to connect via HTTP. The server can also act as a small general-purpose web server for static pages.

                  To run an HTTP server, replace the main class for the server in the example command line above with the following:

                      java -cp ../lib/hsqldb.jar org.hsqldb.server.WebServer

                  The contents of the server.properties file is described in the next section.

                  HyperSQL HTTP Servlet

                  This method of access also uses the HTTP protocol. It is used when a separate servlet engine (or application server) such as Tomcat or Resin provides access to the database. The Servlet Mode cannot be started independently from the servlet engine. The Servlet class, in the HSQLDB jar, should be installed on the application server to provide the connection. The database is specified using an application server property. Refer to the source file src/org/hsqldb/server/Servlet.java to see the details.

                  Both HTTP Server and Servlet modes can only be accessed using the JDBC driver at the client end. They do not provide a web front end to the database. The Servlet mode can serve only a single database.

                  Please note that you do not normally use this mode if you are using the database engine in an application server. In this situation, connections to a catalog are usually made in-process, or using an external HSQL Server instance.

                  Server and Web Server Properties

                  Properties files for running the servers are not created automatically. You should create your own files that contain server.property=value pairs for each property. The server.properties or webserver.properties files must be located in the directory where the command to run the org.hsqldb.server.Server class is issued.

                  In all properties files, values are case-sensitive. All values apart from names of files or pages are required in lowercase (e.g. server.silent=FALSE will have no effect, but server.silent=false will work). Supported properties and their default values (if any) are as follows:

                  Table 13.1. common server and webserver properties

                  ValueDefaultDescription
                  server.database.0file:testthe catalog type, path and file name of the first database file to use
                  server.dbname.0""lowercase server alias for the first database file
                  server.database.nNO DEFAULTthe catalog type, path and file name of the n'th database file in use
                  server.dbname.nNO DEFAULTlowercase server alias for the n'th database file
                  server.silenttrueno extensive messages displayed on console
                  server.tracefalseJDBC trace messages displayed on console
                  server.addressNO DEFAULTIP address of server
                  server.tlsfalseWhether to encrypt network stream. If this is set to true, then in normal situations you will also need to set properties system.javax.net.ssl.keyStore and system.javax.net.ssl.keyStorePassword, as documented elsewhere. The value of server.tls impacts the default value of server.port.
                  server.daemonfalseWhether the server is run as a daemon
                  server.remote_openfalseAllows opening a database path remotely when the first connection is made

                  In HyperSQL version 2.0, each server can serve an unlimited number of databases simultaneously. The server.database.0 property defines the filename / path whereas the server.dbname.0 defines the lowercase alias used by clients to connect to that database. The digit 0 is incremented for the second database and so on. Values for the server.database.n property can use the mem:, file: or res: prefixes and connection properties as discussed under CONNECTIONS. For example,

                      database.0=mem:temp;sql.enforce_strict_size=true;

                  Properties or default values specific to server.properties are:

                  Table 13.2. server properties

                  ValueDefaultDescription
                  server.port9001 (normal) or 554 (if TLS encrypted)TCP/IP port used for talking to clients. All databases are served on the same port.
                  server.no_system_exittrueno System.exit() call when the database is closed

                  Properties or default values specific to webserver.properties are:

                  Table 13.3. webserver properties

                  ValueDefaultDescription
                  server.port80 (normal) or 443 (if TLS encrypted)TCP/IP port used for talking to clients
                  server.default_pageindex.htmlthe default web page for server
                  server.root./the location of served pages
                  .<extension>NO DEFAULTmultiple entries such as .html=text/html define the mime types of the static files served by the web server. See the source for src/org/hsqldb/server/WebServer.java for a list.

                  An example of the contents of a server.properties file is given below:

                      server.database.0=file:/opt/db/accounts
                      server.dbname.0=accounts
                  
                      server.database.1=file:/opt/db/mydb
                      server.dbname.1=enrolments
                  
                      server.database.2=mem:adatabase
                      server.dbname.2=quickdb

                  In the above example, the server.properties file indicates that the server provides access to 3 different databases. Two of the databases are file-based, while the third is all-in-memory. The aliases for the databases that the users connect to are accounts, enrolments and quickdb.

                  All the above properties and their values can be specified on the command line to start the server by omitting the server. prefix. If a property/value pair is specified on the command line, it overrides the property value specified in the server.properties or webserver.properties file.

                  [Note]Note

                  Upgrading: If you have existing custom properties files, change the values to the new naming convention. Note the use of digits at the end of server.database.n and server.dbname.n properties.

                  Starting a Server from your Application

                  If you want to start the server from within your application, as opposed to the command line or batch files, you should create an instance of Server or Web Server, then assign the properties and start the Server. An working example of this can be found in the org.hsqldb.test.TestBase source. The example below sets the same properties as in the server.properties file example.

                      HsqlProperties p = new HsqlProperties();
                      p.setProperty("server.database.0","file:/opt/db/accounts");
                      p.setProperty("server.dbname.0","an_alias");
                      // set up the rest of properties
                  
                      // alternative to the above is
                      Server server = new Server();
                      server.setProperties(p);
                      server.setLogWriter(null); // can use custom writer
                      server.setErrWriter(null); // can use custom writer
                      server.start();
                  

                  The Server object has several alternative methods for setting databases and their public names. The server should be shutdown using the shutdown() method.

                  Allowing a Connection to Open or Create a Database

                  If the server.remote_open property is true, the Server works differently from the normal mode. In this mode, it is not necessary to have any databases listed as server.database.0 etc. in the Server startup properties. If there are databases listed, they are opened as normal. The server does not shutdown when the last database is closed.

                  In this mode, a connection can be established to a database that is not open or does not exist. The server will open the database or create it, then return a connection to the database.

                  The connection URL must include the path to the database, separated with a semicolon from the alias. In the example below, the database path specified as file:C:/files/mydatabase is opened and the database alias xdb is assigned to the database. After this, the next connection to the specified alias will connect to the same database. The database path can also point to a mem: database. If you use database properties on the URL, these properties are used when the new database is created. If no database properties are used on the URL, you can also specify the path with filepath=<path>. Examples below:

                  Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb;file:C:/files/mydatabase", "SA", "");
                  Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb;mem:test;sql.enforce_types=true", "SA", "");
                  Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb;filepath=file:C:/files/mydatabase", "SA", "");
                  

                  The path can be a file: or mem: database.

                  Specifying Database Properties at Server Start

                  Each database started by a Server has its own URL. When new databases are created by the server, the database properties for each of the new database can be appended to the database URL. Examples below:

                  // example in server.propertie file
                      server.database.0=file:/opt/db/accounts;hsqldb.default_table_type=cached;sql.enforce_names=true
                      server.dbname.0=accounts
                  
                  // example for setting the property programatically
                      HsqlProperties p = new HsqlProperties();
                      p.setProperty("server.database.0","file:/opt/db/accounts;hsqldb.default_table_type=cached;sql.enforce_names=true");
                  

                  The specified properties apply only to a new database. They have no effect on an existing database apart from a few properties such as readonly listed in the Properties chapter.

                  TLS Encryption

                  Listener TLS Support (a. k. a. SSL)

                  Blaine Simpson

                  The HSQL Development Group

                  $Revision: 4903 $

                  2012-08-06 00:10:58+0100

                  This section explains how to encrypt the stream between JDBC network clients and HyperSQL Listeners. If you are running an in-process (non-Listener) setup, this chapter does not apply to you.

                  Requirements

                  Hsqldb TLS Support Requirements

                  • Sun Java 2.x and up. (This is probably possible with IBM's Java, but I don't think anybody has attempted to run HSQLDB with TLS under IBM's Java, and I'm sure that nobody in the HSQLDB Development Group has documented how to set up the environment).

                  • If Java 2.x or 3.x, then you will need to install JSSE. Your server and/or client will start up much slower than that of Java 4.x users. Client-side users will not be able to use the https: JDBC protocol (because the https protocol handler is not implemented in 2.x/3.x Java JSSE; if there is demand, we could work around this).

                  • A JKS keystore containing a private key, in order to run a Listener.

                  • If you are running the listener side, then you'll need to run a HSQLDB Server or WebServer Listener instance. It doesn't matter if the underlying database catalogs are new, and it doesn't matter if you are making a new Listener configuration or encrypting an existing Listener configuration. (You can turn encryption on and off at will).

                  • You need a HSQLDB jar file that was built with JSSE present. If you obtained your HSQLDB 1.7.2-or-later distribution from us, you are all set, because we build with Java 1.4 or later (which contains JSSE). If you build your own jar file with Java 1.3, make sure to install JSSE first.

                  Encrypting your JDBC connection

                  At this time, only 1-way, server-cert encryption is tested.

                  Client-Side

                  Just use one of the following protocol prefixes.

                  Hsqldb TLS URL Prefixes

                  • jdbc:hsqldb:hsqls://

                  • jdbc:hsqldb:https://

                  At this time, the latter will only work for clients running with Java 1.4 or later.

                  If the listener you wish to connect to is using a certificate approved by your default trust keystore, then there is nothing else to do. If not, then you need to tell Java to "trust" the server cert. (It's a slight over-simplification to say that if the server certificate was purchased, then you are all set; if somebody "signed their own" certificate by self-signing or using a private ca certificate, then you need to set up trust).

                  First, you need to obtain the cert (only the "public" part of it). Since this cert is passed to all clients, you could obtain it by writing a Java client that dumps it to file, or perhaps by using openssl s_client. Since in most cases, if you want to trust a non-commercial cert, you probably have access to the server keystore, I'll show an example of how to get what you need from the server-side JKS keystore.

                  You may already have an X509 cert for your server. If you have a server keystore, then you can generate a X509 cert like this.

                  Example 13.1. Exporting certificate from the server's keystore

                      keytool -export -keystore server.store -alias existing_alias -file server.cer


                  In this example, server.cer is the X509 certificate that you need for the next step.

                  Now, you need to add this cert to one of the system trust keystores or to a keystore of your own. See the Customizing Stores section in JSSERefGuide.html to see where your system trust keystores are. You can put private keystores anywhere you want to. The following command will add the cert to an existing keystore, or create a new keystore if client.store doesn't exist.

                  Example 13.2. Adding a certificate to the client keystore

                      keytool -import -trustcacerts -keystore trust.store -alias new_alias -file server.cer

                  If you are making a new keystore, you probably want to start with a copy of your system default keystore which you can find somewhere under your JAVA_HOME directory (typically jre/lib/security/cacerts for a JDK, but I forget exactly where it is for a JRE).

                  Unless your OS can't stop other people from writing to your files, you probably do not want to set a password on the trust keystore.

                  If you added the cert to a system trust store, then you are finished. Otherwise you will need to specify your custom trust keystore to your client program. The generic way to set the trust keystore is to set the system property javax.net.ssl.trustStore every time that you run your client program. For example

                  Example 13.3. Specifying your own trust store to a JDBC client

                      java -Djavax.net.ssl.trustStore=/home/blaine/trust.store -jar /path/to/hsqldb.jar dest-urlid


                  This example runs the program SqlTool. SqlTool has built-in TLS support however, so, for SqlTool you can set truststore on a per-urlid basis in the SqlTool configuration file.

                  Note: The hostname in your database URL must match the Common Name of the server's certificate exactly. That means that if a site certificate is admc.com, you can not use jdbc:hsqldb:hsqls://localhost or jdbc:hsqldb:hsqls://www.admc.com:1100 to connect to it.

                  If you want more details on anything, see JSSERefGuide.html on Sun's site, or in the subdirectory docs/guide/security/jsse of your Java SE docs.

                  Server-Side (Listener-Side)

                  Get yourself a JKS keystore containing a private key. Then set properties server.tls, system.javax.net.ssl.keyStore and system.javax.net.ssl.keyStorePassword in your server.properties or webserver.properties file. Set server.tls to true, system.javax.net.ssl.keyStore to the path of the private key JKS keystore, and system.javax.net.ssl.keyStorePassword to the password (of both the keystore and the private key record-- they must be the same). If you specify relative file path values, they will be resolved relative to the ${user.dir} when the JRE is started.

                  [Caution]Caution

                  If you set any password in a .properties (or any other) file, you need to restrict access to the file. On a good operating system, you can do this like so:

                      chmod 600 path/to/server.properties

                  The values and behavior of the system.* settings above match the usage documented for javax.net.ssl.keyStorePassword and javax.net.ssl.keyStore in the JSSE docs.

                  [Note]Note

                  Before version 2.0, HyperSQL depended on directly setting the corresponding JSSE properties. The new idiom is more secure and easier to manage. If you have an old password in a UNIX init script config file, you should remove it.

                  JSSE

                  If you are running Java 4.x or later, then you are all set. Java 1.x users, you are on your own (Sun does not provide a JSSE that will work with 1.x). Java 2.x and 3.x users continue...

                  Go to http://java.sun.com/products/jsse/index-103.html If you agree to the terms and meet the requirements, download the domestic or global JSSE software. All you need from the software distro is the three jar files. If you have a JDK installation, then move the 3 jar files into the directory $JAVA_HOME/jre/lib/ext. If you have a JRE installation, then move the 3 jar files into the directory $JAVA_HOME/lib/ext.

                  Pretty painless.

                  Making a Private-key Keystore

                  There are two main ways to do this. Either you can use a certificate signed by a certificate authority, or you can make your own. One thing that you need to know in both cases is, the Common Name of the cert has to be the exact hostname that JDBC clients will use in their database URL.

                  CA-Signed Cert

                  I'm not going to tell you how to get a CA-signed SSL certificate. That is well documented at many other places.

                  Assuming that you have a standard pem-style private key certificate, here's how you can use openssl and the program DERImport to get it into a JKS keystore.

                  Because I have spent a lot of time on this document already, I am just giving you an example.

                  Example 13.4. Getting a pem-style private key into a JKS keystore

                      openssl pkcs8 -topk8 -outform DER -in Xpvk.pem -inform PEM -out Xpvk.pk8 -nocrypt
                  
                      openssl x509 -in Xcert.pem -out Xcert.der -outform DER
                  
                      java DERImport new.keystore NEWALIAS Xpvk.pk8 Xcert.der

                  [Important]Important

                  Make sure to set the password of the key exactly the same as the password for the keystore!

                  You need the program DERImport.class of course. Do some internet searches to find DERImport.java or DERImport.class and download it.

                  If DERImport has become difficult to obtain, I can write a program to do the same thing-- just let me know.

                  Non-CA-Signed Cert

                  Run man keytool or see the Creating a Keystore section of JSSERefGuide.html.

                  Automatic Server or WebServer startup on UNIX

                  If you are on UNIX and want to automatically start and stop a Server or WebServer running with encryption, set the system.javax.net.ssl.keyStore and system.javax.net.ssl.keyStorePassword properties as instructed above, and follow the instructions in the HyperSQL on UNIX chapter, paying close attention to the TLS-related comments in the template config file.

                  If you are using a private server certificate, make sure to also set the trust store filepath for relevant urlids in your RC file, as explained in the sample config file.

                  Network Access Control

                  (Server ACLs)

                  JDBC connections will always be denied if the supplied user and password are not found in the target catalog. But an HyperSQL listener can also restrict access at the listener level, even protecting private catalogs which have insecure (or default) passwords. If you have an in-process setup, this section of the Guide doesn't apply to you.

                  Many (in fact, most) distributed database applications don't have application clients connect directly to the database, but instead encapsulate access in a controlling process. For example, a web app will usually access the data source on behalf of users, with end-user web browsers never accessing the database directly. In these cases and others, the security benefits of restricting listener access to specific source addresses is well worth the effort. ACLs work by restricting access according to the source address of the incoming connection request. This is efficient because the database engine never even gets the request until it is approved by the ACL filter code.

                  The sample file sample/acl.txt in your HyperSQL distribution explains how to write an ACL file.

                  # $Id: acl.txt 826 2009-01-17 05:04:52Z unsaved $
                  
                  # Sample HyperSQL Network Listener ACL file.
                  # Specify "allow" and "deny" rules
                  # For address specifications, individual addresses, host names, and
                  # network addresses with /bit suffix are allowed, but read the caveat about
                  # host names below, under the sample "localhost" rule.
                  
                  # Blank lines ignored.
                     # Lines with # as the first non-whitespace character are ignored.
                  
                  
                  allow 2001:db8::/32
                  # Allow this 32-bit ipv4 subnet
                  
                  allow localhost
                  # You should use numerical addresses in ACL files, unless you are certain that
                  # the name will always be known to your network address resolution system
                  # (assume that you will lose Internet connectivity at some time).
                  # With a default name resolution setup on UNIX, you are safe to use names
                  # defined in your /etc/hosts file.
                  
                  deny 192.168.101.253
                  # Deny a single IP address.
                  # In our example, 192.168.101.0/24 is our local, organizational network.
                  # 192.168.101.253 is the IP address of our Intern's PC.
                  # The Intern does not have permission to access our databases directly.
                  
                  allow 192.168.101.0/24
                  
                  # Any ipv4 or ipv6 candidate address not matched above will be denied
                  

                  You put your file wherever it is convenient for you, and specify that path with the property server.acl or webserver.acl in your server.properties or webserver.properties file (depending on whether your listener instance is a Server or WebServer). You can specify the ACL file path with an absolute or relative path. If you use a relative path, it must be relative to the .properties file. It's often convenient to name the ACL file acl.txt, in the same directory as your .properties file and specify the property value as just acl.txt. This file name is intuitive, and things will continue to work as expected if you move or copy the entire directory.

                  [Warning]Warning

                  If your Server or WebServer was started with a *.acl property, changes afterwards to the ACL file will be picked up immediately by your listener instance. You are advised to use the procedure below to prevent partial edits or mistakes from crippling your running server.

                  When you edit your ACL file, it is both more convenient and more secure to test it as explained here before activating it. You could, of course, test an ACL file by editing it in-place, then trying to connect to your listener with JDBC clients from various source addresses. Besides being mightily laborious and boring, with this method it is very easy to accidentally open access to all source addresses or to deny access to all users until you fix incorrect ACL entries.

                  The suggested method of creating or changing ACLs is to work with an inactive file (for new ACL files, just don't enable the *.acl property yet; for changing an existing file, just copy it to a temporary file and edit the temporary file). Then use the ServerAcl class to test it.

                  Example 13.5. Validating and Testing an ACL file

                      java -cp path/to/hsqldb.jar org.hsqldb.server.ServerAcl path/to/acl.txt


                  If the specified ACL file fails validation, you will be given details about the problem. Otherwise, the validated rules will be displayed (including the implicit, default deny rules). You then type in host names and addresses, one-per-line. Each name or address is tested as if it were a HyperSQL network client address, using the same exact method that the HyperSQL listener will use. (HyperSQL listeners use this same ServerAcl class to test incoming source addresses). ServerAcl will report the rule which matches and whether access is denied or allowed to that address.

                  If you have edited a copy of an existing ACL file (as suggested above), then overwrite your live ACL file with your new, validated ACL file. I.e., copy your temp file over top of your live ACL file.

                  ServerAcl can be run in the same exact way described above, to troubleshoot runtime access issues. If you use an ACL file and a user or application can't get a connection to the database, you can run ServerAcl to quickly and definitively find if the client is being prohibited by an ACL rule.


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/running-chapt.html0000644000175000017500000010554412007567744021435 0ustar renerene Chapter 1. Running and Using HyperSQL

                  Chapter 1. Running and Using HyperSQL

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5039 $

                  Copyright 2002-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  The HSQLDB Jar

                  The HSQLDB jar package is located in the /lib directory of the ZIP package and contains several components and programs.

                  Components of the Hsqldb jar package

                  • HyperSQL RDBMS Engine (HSQLDB)

                  • HyperSQL JDBC Driver

                  • Database Manager (GUI database access tool, with Swing and AWT versions)

                  • Sql Tool (command line database access tool)

                  The HyperSQL RDBMS and JDBC Driver provide the core functionality. An additional jar contains Sql Tool (command line database access tool). SqlTool and the DatabaseManagers are general-purpose database tools that can be used with any database engine that has a JDBC driver.

                  Running Database Access Tools

                  The tools are used for interactive user access to databases, including creation of a database, inserting or modifying data, or querying the database. All tools are run in the normal way for Java programs. In the following example the Swing version of the Database Manager is executed. The hsqldb.jar is located in the directory ../lib relative to the current directory.

                  java -cp ../lib/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing

                  If hsqldb.jar is in the current directory, the command would change to:

                  java -cp hsqldb.jar org.hsqldb.util.DatabaseManagerSwing

                  Main classes for the Hsqldb tools

                  • org.hsqldb.util.DatabaseManager

                  • org.hsqldb.util.DatabaseManagerSwing

                  When a tool is up and running, you can connect to a database (may be a new database) and use SQL commands to access and modify the data.

                  Tools can use command line arguments. You can add the command line argument --help to get a list of available arguments for these tools.

                  Double clicking the HSQLDB jar will start the DatabaseManagerSwing application.

                  A HyperSQL Database

                  Each HyperSQL database is called a catalog. There are three types of catalog depending on how the data is stored.

                  Types of catalog data

                  • mem: stored entirely in RAM - without any persistence beyond the JVM process's life

                  • file: stored in filesystem files

                  • res: stored in a Java resource, such as a Jar and always read-only

                  All-in-memory, mem: catalogs can be used for test data or as sophisticated caches for an application. These databases do not have any files.

                  A file: catalog consists of between 2 to 6 files, all named the same but with different extensions, located in the same directory. For example, the database named "test" consists of the following files:

                  • test.properties

                  • test.script

                  • test.log

                  • test.data

                  • test.backup

                  • test.lobs

                  The properties file contains a few settings about the database. The script file contains the definition of tables and other database objects, plus the data for non-cached tables. The log file contains recent changes to the database. The data file contains the data for cached tables and the backup file is a compressed backup of the last known consistent state of the data file. All these files are essential and should never be deleted. For some catalogs, the test.data and test.backup files will not be present. In addition to those files, a HyperSQL database may link to any formatted text files, such as CSV lists, anywhere on the disk.

                  While the "test" catalog is open, a test.log file is used to write the changes made to data. This file is removed at a normal SHUTDOWN. Otherwise (with abnormal shutdown) this file is used at the next startup to redo the changes. A test.lck file is also used to record the fact that the database is open. This is deleted at a normal SHUTDOWN.

                  [Note]Note

                  When the engine closes the database at a shutdown, it creates temporary files with the extension .new which it then renames to those listed above. These files should not be deleted by the user. At the time of the next startup, all such files will be deleted by the database engine. In some circumstances, a test.data.xxx.old is created and deleted afterwards by the database engine. The user can delete these test.data.xxx.old files.

                  A res: catalog consists of the files for a small, read-only database that can be stored inside a Java resource such as a ZIP or JAR archive and distributed as part of a Java application program.

                  In-Process Access to Database Catalogs

                  In general, JDBC is used for all access to databases. This is done by making a connection to the database, then using various methods of the java.sql.Connection object that is returned to access the data. Access to an in-process database is started from JDBC, with the database path specified in the connection URL. For example, if the file: database name is "testdb" and its files are located in the same directory as where the command to run your application was issued, the following code is used for the connection:

                    Connection c = DriverManager.getConnection("jdbc:hsqldb:file:testdb", "SA", "");

                  The database file path format can be specified using forward slashes in Windows hosts as well as Linux hosts. So relative paths or paths that refer to the same directory on the same drive can be identical. For example if your database directory in Linux is /opt/db/ containing a database testdb (with files named testdb.*), then the database file path is /opt/db/testdb. If you create an identical directory structure on the C: drive of a Windows host, you can use the same URL in both Windows and Linux:

                    Connection c = DriverManager.getConnection("jdbc:hsqldb:file:/opt/db/testdb", "SA", "");

                  When using relative paths, these paths will be taken relative to the directory in which the shell command to start the Java Virtual Machine was executed. Refer to the Javadoc for JDBCConnection for more details.

                  Paths and database names for file databases are treated as case-sensitive when the database is created or the first connection is made to the database. But if a second connection is made to an open database, using a path and name that differs only in case, then the connection is made to the existing open database. This measure is necessary because in Windows the two paths are equivalent.

                  A mem: database is specified by the mem: protocol. For mem: databases, the path is simply a name. Several mem: databases can exist at the same time and distinguished by their names. In the example below, the database is called "mymemdb":

                    Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:mymemdb", "SA", "");

                  A res: database, is specified by the res: protocol. As it is a Java resource, the database path is a Java URL (similar to the path to a class). In the example below, "resdb" is the root name of the database files, which exists in the directory "org/my/path" within the classpath (probably in a Jar). A Java resource is stored in a compressed format and is decompressed in memory when it is used. For this reason, a res: database should not contain large amounts of data and is always read-only.

                    Connection c = DriverManager.getConnection("jdbc:hsqldb:res:org.my.path.resdb", "SA", "");

                  The first time in-process connection is made to a database, some general data structures are initialised and a few helper threads are started. After this, creation of connections and calls to JDBC methods of the connections execute as if they are part of the Java application that is making the calls. When the SQL command "SHUTDOWN" is executed, the global structures and helper threads for the database are destroyed.

                  Note that only one Java process at a time can make in-process connections to a given file: database. However, if the file: database has been made read-only, or if connections are made to a res: database, then it is possible to make in-process connections from multiple Java processes.

                  Server Modes

                  For most applications, in-process access is faster, as the data is not converted and sent over the network. The main drawback is that it is not possible by default to connect to the database from outside your application. As a result you cannot check the contents of the database with external tools such as Database Manager while your application is running.

                  Server modes provide the maximum accessibility. The database engine runs in a JVM and opens one or more in-process catalogs. It listens for connections from programs on the same computer or other computers on the network. It translates these connections into in-process connections to the databases.

                  Several different programs can connect to the server and retrieve or update information. Applications programs (clients) connect to the server using the HyperSQL JDBC driver. In most server modes, the server can serve an unlimited number of databases that are specified at the time of running the server, or optionally, as a connection request is received.

                  A Sever mode is also the preferred mode of running the database during development. It allows you to query the database from a separate database access utility while your application is running.

                  There are three server modes, based on the protocol used for communications between the client and server. They are briefly discussed below. More details on servers is provided in the HyperSQL Network Listeners (Servers) chapter.

                  HyperSQL HSQL Server

                  This is the preferred way of running a database server and the fastest one. A proprietary communications protocol is used for this mode. A command similar to those used for running tools and described above is used for running the server. The following example of the command for starting the server starts the server with one (default) database with files named "mydb.*" and the public name of "xdb". The public name hides the file names from users.

                    java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:mydb --dbname.0 xdb

                  The command line argument --help can be used to get a list of available arguments.

                  HyperSQL HTTP Server

                  This method of access is used when the computer hosting the database server is restricted to the HTTP protocol. The only reason for using this method of access is restrictions imposed by firewalls on the client or server machines and it should not be used where there are no such restrictions. The HyperSQL HTTP Server is a special web server that allows JDBC clients to connect via HTTP. The server can also act as a small general-purpose web server for static pages.

                  To run an HTTP server, replace the main class for the server in the example command line above with the following:

                    org.hsqldb.server.WebServer

                  The command line argument --help can be used to get a list of available arguments.

                  HyperSQL HTTP Servlet

                  This method of access also uses the HTTP protocol. It is used when a separate servlet engine (or application server) such as Tomcat or Resin provides access to the database. The Servlet Mode cannot be started independently from the servlet engine. The Servlet class, in the HSQLDB jar, should be installed on the application server to provide the connection. The database is specified using an application server property. Refer to the source file src/org/hsqldb/server/Servlet.java to see the details.

                  Both HTTP Server and Servlet modes can only be accessed using the JDBC driver at the client end. They do not provide a web front end to the database. The Servlet mode can serve only a single database.

                  Please note that you do not normally use this mode if you are using the database engine in an application server. In this situation, connections to a catalog are usually made in-process, or using a separate Server

                  Connecting to a Database Server

                  When a HyperSQL server is running, client programs can connect to it using the HSQLDB JDBC Driver contained in hsqldb.jar. Full information on how to connect to a server is provided in the Java Documentation for JDBCConnection (located in the /doc/apidocs directory of HSQLDB distribution). A common example is connection to the default port (9001) used for the hsql: protocol on the same machine:

                  Example 1.1. Java code to connect to the local hsql Server

                    try {
                        Class.forName("org.hsqldb.jdbc.JDBCDriver" );
                    } catch (Exception e) {
                        System.err.println("ERROR: failed to load HSQLDB JDBC driver.");
                        e.printStackTrace();
                        return;
                    }
                  
                    Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb", "SA", "");

                  If the HyperSQL HTTP server is used, the protocol is http: and the URL will be different:

                  Example 1.2. Java code to connect to the local http Server

                    Connection c = DriverManager.getConnection("jdbc:hsqldb:http://localhost/xdb", "SA", "");

                  Note in the above connection URL, there is no mention of the database file, as this was specified when running the server. Instead, the public name defined for dbname.0 is used. Also, see the HyperSQL Network Listeners (Servers) chapter for the connection URL when there is more than one database per server instance.

                  Security Considerations

                  When a HyperSQL server is run, network access should be adequately protected. Source IP addresses may be restricted by use of our Access Control List feature, network filtering software, firewall software, or standalone firewalls. Only secure passwords should be used-- most importantly, the password for the default system user should be changed from the default empty string. If you are purposefully providing data to the public, then the wide-open public network connection should be used exclusively to access the public data via read-only accounts. (i.e., neither secure data nor privileged accounts should use this connection). These considerations also apply to HyperSQL servers run with the HTTP protocol.

                  HyperSQL provides two optional security mechanisms. The encrypted SSL protocol, and Access Control Lists. Both mechanisms can be specified when running the Server or WebServer. On the client, the URL to connect to an SSL server is slightly different:

                  Example 1.3. Java code to connect to the local secure SSL hsql and http Servers

                    Connection c = DriverManager.getConnection("jdbc:hsqldb:hsqls://localhost/xdb", "SA", "");
                    Connection c = DriverManager.getConnection("jdbc:hsqldb:https://localhost/xdb", "SA", "");
                  


                  The security features are discussed in detail in the HyperSQL Network Listeners (Servers) chapter.

                  Using Multiple Databases

                  A server can provide connections to more than one database. In the examples above, more than one set of database names can be specified on the command line. It is also possible to specify all the databases in a .properties file, instead of the command line. These capabilities are covered in the HyperSQL Network Listeners (Servers) chapter

                  Accessing the Data

                  As shown so far, a java.sql.Connection object is always used to access the database. But the speed and performance depends on the type of connection.

                  Establishing a connection and closing it has some overheads, therefore it is not good practice to create a new connection to perform a small number of operations. A connection should be reused as much as possible and closed only when it is not going to be used again for a long while.

                  Reuse is more important for server connections. A server connection uses a TCP port for communications. Each time a connection is made, a port is allocated by the operating system and deallocated after the connection is closed. If many connections are made from a single client, the operating system may not be able to keep up and may refuse the connection attempt.

                  A java.sql.Connection object has some methods that return further java.sql.* objects. All these objects belong to the connection that returned them and are closed when the connection is closed. These objects can be reused, but if they are not needed after performing the operations, they should be closed.

                  A java.sql.DatabaseMetaData object is used to get metadata for the database.

                  A java.sql.Statement object is used to execute queries and data change statements. A java.sql.Statement can be reused to execute a different statement each time.

                  A java.sql.PreparedStatement object is used to execute a single statement repeatedly. The SQL statement usually contains parameters, which can be set to new values before each reuse. When a java.sql.PreparedStatement object is created, the engine keeps the compiled SQL statement for reuse, until the java.sql.PreparedStatement object is closed. As a result, repeated use of a java.sql.PreparedStatement is much faster than using a java.sql.Statement object.

                  A java.sql.CallableStatement object is used to execute an SQL CALL statement. The SQL CALL statement may contain parameters, which should be set to new values before each reuse. Similar to java.sql.PreparedStatement, the engine keeps the compiled SQL statement for reuse, until the java.sql.CallableStatement object is closed.

                  A java.sql.Connection object also has some methods for transaction control.

                  The commit() method performs a COMMIT while the rollback() method performs a ROLLBACK SQL statement.

                  The setSavepoint(String name) method performs a SAVEPOINT <name> SQL statement and returns a java.sql.Savepoint object. The rollback(Savepoint name) method performs a ROLLBACK TO SAVEPOINT <name> SQL statement.

                  The Javadoc for JDBCConnection, JDBCDriver, JDBCDatabaseMetadata JDBCResultSet, JDBCStatement, JDBCPreparedStatement list all the supported JDBC methods together with information that is specific to HSQLDB.

                  Closing the Database

                  All databases running in different modes can be closed with the SHUTDOWN command, issued as an SQL statement.

                  When SHUTDOWN is issued, all active transactions are rolled back. The catalog files are then saved in a form that can be opened quickly the next time the catalog is opened.

                  A special form of closing the database is via the SHUTDOWN COMPACT command. This command rewrites the .data file that contains the information stored in CACHED tables and compacts it to its minimum size. This command should be issued periodically, especially when lots of inserts, updates or deletes have been performed on the cached tables. Changes to the structure of the database, such as dropping or modifying populated CACHED tables or indexes also create large amounts of unused file space that can be reclaimed using this command.

                  Databases are not closed when the last connection to the database is explicitly closed via JDBC. A connection property, shutdown=true, can be specified on the first connection to the database (the connection that opens the database) to force a shutdown when the last connection closes.

                  Example 1.4. specifying a connection property to shutdown the database when the last connection is closed

                    Connection c = DriverManager.getConnection(
                            "jdbc:hsqldb:file:/opt/db/testdb;shutdown=true", "SA", "");


                  This feature is useful for running tests, where it may not be practical to shutdown the database after each test. But it is not recommended for application programs.

                  Creating a New Database

                  When a server instance is started, or when a connection is made to an in-process database, a new, empty database is created if no database exists at the given path.

                  With HyperSQL 2.0 the username and password that are specified for the connection are used for the new database. Both the username and password are case-sensitive. (The exception is the default SA user, which is not case-sensitive). If no username or password is specified, the default SA user and an empty password are used.

                  This feature has a side effect that can confuse new users. If a mistake is made in specifying the path for connecting to an existing database, a connection is nevertheless established to a new database. For troubleshooting purposes, you can specify a connection property ifexists=true to allow connection to an existing database only and avoid creating a new database. In this case, if the database does not exist, the getConnection() method will throw an exception.

                  Example 1.5. specifying a connection property to disallow creating a new database

                    Connection c = DriverManager.getConnection(
                            "jdbc:hsqldb:file:/opt/db/testdb;ifexists=true", "SA", "");


                  A database has many optional properties, described in the System Management chapter. You can specify most of these properties on the URL or in the connection properties for the first connection that creates the database. See the Properties chapter.


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/triggers-chapt.html0000644000175000017500000007153012007567744021600 0ustar renerene Chapter 9. Triggers

                  Chapter 9. Triggers

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 3042 $

                  Copyright 2010-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  Overview

                  Trigger functionality first appeared in SQL:1999. Triggers embody the live database concept, where changes in SQL data can be monitored and acted upon. This means each time a DELETE, UPDATE or INSERT is performed, additional actions are taken by the declared triggers. SQL Standard triggers are imperative while the relational aspects of SQL are declarative. Triggers allow performing an arbitrary transformation of data that is being updated or inserted, or to prevent insert, updated or deletes, or to perform additional operations.

                  Some bad examples of SQL triggers in effect enforce an “integrity constraint” which would better be expressed as a CHECK constraint. A trigger that causes an exception if the value inserted in a column is negative is such an example. A check constraint that declares CHECK VALUE >= 0 (declarative) is a better way of expressing an integrity constraint than a trigger that throws an exception if the same condition is false.

                  Usage constraints cannot always be expressed by SQL’s integrity constraint statements. Triggers can enforce these constraints. For example, it is not possible to use a check constraint to prevent inserts or deletes on weekends. A trigger can be used to enforce the time when each operation is allowed.

                  A trigger is declared to activate when an UPDATE, INSERT or DELETE action is performed on a table. These actions may be direct or indirect. Indirect actions may arise from CASCADE actions of FOREIGN KEY constraints, or from data change statements performed on a VIEW that is based on the table that in.

                  It is possible to declare multiple triggers on a single table. The triggers activate one by one according to the order in which they were defined. HyperSQL supports an extension to the CREATE TRIGGER statement, which allows the user to specify the execution order of the new trigger.

                  A row level trigger allows access to the deleted or inserted rows. For UPDATE actions there is both an old and new version of each row. A trigger can be specified to activate before or after the action has been performed.

                  BEFORE Triggers

                  A trigger that is declared as BEFORE DELETE cannot modify the deleted row. In other words, it cannot decide to delete a different row by changing the column values of the row. A trigger that is declared as BEFORE INSERT and BEFORE UPDATE can modify the values that are inserted into the database. For example, a badly formatted string can be cleaned up by a trigger before INSERT or UPDATE.

                  BEFORE triggers cannot modify the other tables of the database. All BEFORE triggers can veto the action by throwing an exception.

                  Because BEFORE triggers can modify the inserted or updated rows, all constraint checks are performed after the execution of the BEFORE triggers. The checks include NOT NULL constraints, length of strings, CHECK constraints, and FOREIGN key constraints.

                  AFTER Triggers

                  AFTER triggers can also perform additional data changes, for example inserting an additional row into a different table for data audits. These triggers cannot modify the rows that have been modified by the INSERT or UPDATE action.

                  INSTEAD OF Triggers

                  A trigger that is declared on a VIEW, is an INSTEAD OF trigger. This term means when an INSERT, UPDATE or DELETE statement is executed with the view as the target, the trigger action is all that is performed, and no further data change takes place on the view. The trigger action can include all the statements that are necessary to change the data in the tables that underlie the view, or even other tables, such as audit tables. With the use of INSTEAD OF triggers a read-only view can effectively become updatable or insertable-into.

                  Trigger Properties

                  A trigger is declared on a specific table or view. Various trigger properties determine when the trigger is executed and how.

                  Trigger Event

                  The trigger event specifies the type of SQL statement that causes the trigger to execute. Each trigger is specified to execute when an INSERT, DELETE or UPDATE takes place.

                  The event can be filtered by two separate means. For all triggers, the WHEN clause can specify a condition against the rows that are the subject of the trigger, together with the data in the database. For example, a trigger can activate when the size of a table becomes larger than a certain amount. Or it can activate when the values in the rows being modified satisfy certain conditions.

                  An UPDATE trigger can be declared to execute only when certain columns are the subject of an update statement. For example, a trigger declared as AFTER UPDATE OF (datecolumn) will activate only when the UPDATE statement that is executed includes the column, datecolumn, as one of the columns specified in its SET statements.

                  Granularity

                  A statement level trigger is performed once for the executed SQL statement and is declared as FOR EACH STATEMENT.

                  A row level trigger is performed once for each row that is modified during the execution of an SQL statement and is declared as FOR EACH ROW. Note that an SQL statement can INSERT, UPDATE or DELETE zero or more rows.

                  If a statement does not apply to any row, then the trigger is not executed.

                  If FOR EACH ROW or FOR EACH STATEMENT is not specified, then the default is FOR EACH STATEMENT.

                  The granularity dictates whether the REFERENCING clause can specify OLD ROW, NEW ROW, or OLD TABLE, NEW TABLE.

                  A trigger declared as FOR EACH STATEMENT can only be an AFTER trigger.

                  Trigger Action Time

                  A trigger is executed BEFORE, AFTER or INSTEAD OF the trigger event.

                  INSTEAD OF triggers are allowed only when the trigger is declared on a VIEW. With this type of trigger, the event (SQL statement) itself is not executed, only the trigger.

                  BEFORE or AFTER triggers are executed just before or just after the execution of the event. For example, just before a row is inserted into a table, the BEFORE trigger is activated, and just after the row is inserted, the AFTER trigger is executed.

                  BEFORE triggers can modify the row that is being inserted or updated. AFTER triggers cannot modify rows. They are usually used to perform additional operations, such as inserting rows into other tables.

                  A trigger declared as FOR EACH STATEMENT can only be an AFTER trigger.

                  References to Rows

                  If the old rows or new rows are referenced in the SQL statements in the trigger action, they must have names. The REFERENCING clause is used to give names to the old and new rows. The clause, REFERENCING OLD | NEW TABLE is used for statement level triggers. The clause, REFERENCING OLD | NEW ROW is used for row level triggers. If the old rows or new rows are referenced in the SQL statements in the trigger action, they must have names. In the SQL statements, the columns of the old or new rows are qualified with the specified names.

                  Trigger Condition

                  The WHEN clause can specify a condition for the columns of the row that is being changed. Using this clause you can simply avoid unnecessary trigger activation for rows that do not need it.

                  For UPDATE trigger, you can specify a list of columns of the table. If a list of columns is specified, then if the UPDATE statement does not change the columns with SET clauses, then the trigger is not activated at all.

                  Trigger Action in SQL

                  The trigger action specifies what the trigger does when it is activated. This is usually written as one or more SQL statements.

                  When a row level trigger is activated, there is an OLD ROW, or a NEW ROW, or both. An INSERT statement supplies a NEW ROW row to be inserted into a table. A DELETE statement supplies an OLD ROW be deleted. An UPDATE statement supplies both OLD ROW and NEW ROW that represent the updated rows before and after the update. The REFERENCING clause gives names to these rows, so that the rows can be referenced in the trigger action.

                  In the example below, a name is given to the NEW ROW and it is used both in the WHEN clause and in the trigger action SQL to insert a row into a triglog table after each row insert into the testtrig table.

                    CREATE TRIGGER trig AFTER INSERT ON testtrig 
                      REFERENCING NEW ROW AS newrow
                      FOR EACH ROW WHEN (newrow.id > 1)
                      INSERT INTO TRIGLOG VALUES (newrow.id, newrow.data, 'inserted')
                  

                  In the example blow, the trigger code modifies the updated data if a condition is true. This type of trigger is useful when the application does not perform the necessary checks and modifications to data. The statement block that starts with BEGIN ATOMIC is similar to an SQL/PSM block and can contain all the SQL statements that are allowed in an SQL/PSM block.

                    CREATE TRIGGER t BEFORE UPDATE ON customer
                      REFERENCING NEW AS newrow FOR EACH ROW
                      BEGIN ATOMIC
                        IF LENGTH(newrow.firstname) > 10 THEN
                          SET newrow.firstname = LOWER(newrow.firstname);
                        END IF;
                      END
                  

                  Trigger Action in Java

                  A trigger action can be written as a Java class that implements the org.hsqldb.Trigger interface. This interface has a single method which is called when the trigger is activated, either before or after the event. When the method is called by the engine, it supplies the type of trigger as an int value defined by the interface(as type argument), the name of the trigger (as trigName argument), the name of the table (as tabName argument), the OLD ROW (as oldRow argument) and the NEW ROW (as newRow argument). The oldRow argument is null for row level INSERT triggers. The newRow argument is null for row level DELETE triggers. For table level triggers, both arguments are null (that is, there is no access to the data). The triggerType argument is one of the constants in the org.hsqldb.Trigger interface which indicate the type of trigger, for example, INSERT_BEFORE_ROW or UPDATE_AFTER_ROW.

                  The Java class for the trigger can be reused for several triggers on different tables. The method code can distinguish between the different tables and triggers using the supplied arguments and take appropriate action.

                      fire (int triggerType, String name, String table, Object row1[], Object row2[])
                  

                  The Java method for a synchronous trigger (see below) can modify the values in newRow2 in a BEFORE trigger. Such modifications are reflected in the row that is being inserted or updated. Any other modifications are ignored by the engine.

                  A Java trigger that uses an instance of org.hsqldb.Trigger has two forms, synchronous, or asynchronous (immediate or queued). By default, or when QUEUE 0 is specified, the action is performed immediately by calling the Java method. This is similar to SQL trigger actions.

                  When QUEUE n is specified with n larger than 0, the engine uses a separate thread to execute the Java method, using a queue with the size n. For certain applications, such as real-time systems this allows asynchronous notifications to be sent by the trigger event, without introducing delays in the engine. With asynchronous triggers, an extra parameter, NOWAIT can be used in trigger definition. This overcomes the queue full condition. In this mode, old calls that are still in the queue are discarded one by one and replaced with new calls.

                  Java row level triggers that are declared with BEFORE trigger action time can modify the row data. Triggers with AFTER trigger action time can modify the database, e.g. insert new rows. If the trigger needs to access the database, the same method as in Java Language Routines SQL/JRT can be used. The Java code should connect to the URL "jdbc:default:connection" and use this connection to access the database.

                  For sample trigger classes and test code see, org.hsqldb.sample.TriggerSample, org.hsqldb.test.TestTriggers, org.hsqldb.test.TriggerClass and the associated text script TestTriggers.txt in the /testrun/hsqldb/ directory. In the example below, the trigger is activated only if the update statement includes SET clauses that modify any of the specified columns (c1, c2, c3). Furthermore, the trigger is not activated if the c2 column in the updated row is null.

                    CREATE TRIGGER TRIGBUR BEFORE UPDATE OF c1, c2, c3 ON testtrig 
                      referencing NEW ROW AS newrow
                      FOR EACH ROW WHEN (newrow.c2 IS NOT NULL)
                      CALL "org.hsqldb.test.TriggerClass"
                  

                  Java functions can be called from an SQL trigger. So it is possible to define the Java function to perform any external communication that are necessary for the trigger, and use SQL code for checks and alterations to data.

                    CREATE TRIGGER t BEFORE UPDATE ON customer
                      REFERENCING NEW AS newrow FOR EACH ROW
                      BEGIN ATOMIC
                        IF LENGTH(newrow.firstname) > 10 THEN
                          CALL my_java_function(newrow.firstname, newrow.lastname);
                        END IF;
                      END
                  

                  Trigger Creation

                  CREATE TRIGGER

                  trigger definition

                  <trigger definition> ::= CREATE TRIGGER <trigger name> <trigger action time> <trigger event> ON <table name> [BEFORE <other trigger name>] [ REFERENCING <transition table or variable list> ] <triggered action>

                  <trigger action time> ::= BEFORE | AFTER | INSTEAD OF

                  <trigger event> ::= INSERT | DELETE | UPDATE [ OF <trigger column list> ]

                  <trigger column list> ::= <column name list>

                  <triggered action> ::= [ FOR EACH { ROW | STATEMENT } ] [ <triggered when clause> ] <triggered SQL statement>

                  <triggered when clause> ::= WHEN <left paren> <search condition> <right paren>

                  <triggered SQL statement> ::= <SQL procedure statement> | BEGIN ATOMIC { <SQL procedure statement> <semicolon> }... END | [QUEUE <integer literal>] [NOWAIT] CALL <HSQLDB trigger class FQN>

                  <transition table or variable list> ::= <transition table or variable>...

                  <transition table or variable> ::= OLD [ ROW ] [ AS ] <old transition variable name> | NEW [ ROW ] [ AS ] <new transition variable name> | OLD TABLE [ AS ] <old transition table name> | NEW TABLE [ AS ] <new transition table name>

                  <old transition table name> ::= <transition table name>

                  <new transition table name> ::= <transition table name>

                  <transition table name> ::= <identifier>

                  <old transition variable name> ::= <correlation name>

                  <new transition variable name> ::= <correlation name>

                  Trigger definition is a relatively complex statement. The combination of <trigger action time> and <trigger event> determines the type of the trigger. Examples include BEFORE DELETE, AFTER UPDATE, INSTEAD OF INSERT. If the optional [ OF <trigger column list> ] is specified for an UPDATE trigger, then the trigger is activated only if one of the columns that is in the <trigger column list> is specified in the UPDATE statement that activates the trigger.

                  If a trigger is FOR EACH ROW, which is the default option, then the trigger is activated for each row of the table that is affected by the execution of an SQL statement. Otherwise, it is activated once only per statement execution. For FOR EACH ROW triggers, there is an OLD and NEW state for each row. For UPDATE triggers, both OLD and NEW states exist, representing the row before the update, and after the update. For DELETE, triggers, there is only an OLD state. For INSERT triggers, there is only the NEW state. If a trigger is FOR EACH STATEMENT, then a transient table is created containing all the rows for the OLD state and another transient table is created for the NEW state.

                  The [ REFERENCING <transition table or variable> ] is used to give a name to the OLD and NEW data row or table. This name can be referenced in the <SQL procedure statement> to access the data.

                  The optional <triggered when clause> is a search condition, similar to the search condition of a DELETE or UPDATE statement. If the search condition is not TRUE for a row, then the trigger is not activated for that row.

                  The <SQL procedure statement> is limited to INSERT, DELETE, UPDATE and MERGE statements.

                  The <HSQLDB trigger class FQN> is a delimited identifier that contains the fully qualified name of a Java class that implements the org.hsqldb.Trigger interface.

                  Early releases of HyperSQL version 2.0 do not allow the use of OLD TABLE or NEW TABLE in statement level triggers.

                  TRIGGERED SQL STATEMENT

                  triggered SQL statement

                  The <triggered SQL statement> has three forms.

                  The first form is a single SQL procedure statement. This statement can reference the OLD ROW and NEW ROW variables. For example, it can reference these variables and insert a row into a separate table.

                  The second form is enclosed in a BEGIN ... END block and can include one or more SQL procedure statements. In BEFORE triggers, you can include SET statements to modify the inserted or updated rows. In AFTER triggers, you can include INSERT, DELETE and UPDATE statements to change the data in other database tables. SELECT and CALL statements are allowed in BEFORE and AFTER triggers. CALL statements in BEFORE triggers should not modify data.

                  The third form specifies a call to a Java method.

                  Two examples of a trigger with a block are given below. The block can include elements discussed in the SQL-Invoked Routines chapter, including local variables, loops and conditionals. You can also raise an exception in such blocks in order to terminate the execution of the SQL statement that caused the trigger to execute.

                  /* the trigger throws an exception if a customer with the given last name already exists */
                    CREATE TRIGGER trigone BEFORE INSERT ON customer 
                      REFERENCING NEW ROW AS newrow
                      FOR EACH ROW WHEN (newrow.id > 100)
                      BEGIN ATOMIC
                        IF EXISTS (SELECT * FROM CUSTOMER WHERE CUSTOMER.LASTNAME = NEW.LASTNAME) THEN
                          SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'already exists';
                        END IF;
                      END
                  
                  /* for each row inserted into the target, the trigger insert a row into the table used for logging */
                    CREATE TRIGGER trig AFTER INSERT ON testtrig 
                      BEFORE othertrigger  
                      REFERENCING NEW ROW AS newrow
                      FOR EACH ROW WHEN (newrow.id > 1)
                      BEGIN ATOMIC
                        INSERT INTO triglog VALUES (newrow.id, newrow.data, 'inserted');
                        /* more statements can be included */
                      END
                  

                  TRIGGER EXECUTION ORDER

                  trigger execution order

                  <trigger execution order> ::= BEFORE <other trigger name>

                  HyperSQL extends the SQL Standard to allow the order of execution of a trigger to be specified by using [BEFORE <other trigger name>] in the definition. The newly defined trigger will be executed before the specified other trigger. If this clause is not used, the new trigger is executed after all the previously defined triggers of the same scope (BEFORE, AFTER, EACH ROW, EACH STATEMENT).

                  DROP TRIGGER

                  drop trigger statement

                  <drop trigger statement> ::= DROP TRIGGER <trigger name>

                  Destroy a trigger.


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/guide/sqlgeneral-chapt.html0000644000175000017500000027607512007567744022122 0ustar renerene Chapter 2. SQL Language

                  Chapter 2. SQL Language

                  Fred Toussi

                  The HSQL Development Group

                  $Revision: 5039 $

                  Copyright 2002-2012 Fred Toussi. Permission is granted to distribute this document without any alteration under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group to distribute this document with or without alterations under the terms of the HSQLDB license.

                  2012-08-06 00:10:58+0100

                  Standards Support

                  HyperSQL 2.0 supports the dialect of SQL defined by SQL standards 92, 1999, 2003 and 2008. This means where a feature of the standard is supported, e.g. left outer join, the syntax is that specified by the standard text. Almost all syntactic features of SQL-92 up to Advanced Level are supported, as well as SQL:2008 core and many optional features of this standard. Work is in progress for a formal declaration of conformance.

                  At the time of this release, HyperSQL supports the widest range of SQL standard features among all open source RDBMS.

                  Various chapters of this guide list the supported syntax. When writing or converting existing SQL DDL (Data Definition Language), DML (Data Manipulation Language) or DQL (Data Query Language) statements for HSQLDB, you should consult the supported syntax and modify the statements accordingly. Some statements written for older versions may have to be modified.

                  Over 300 words are reserved by the standard and should not be used as table or column names. For example, the word POSITION is reserved as it is a function defined by the Standards with a similar role as String.indexOf() in Java. HyperSQL does not currently prevent you from using a reserved word if it does not support its use or can distinguish it. For example CUBE is a reserved words that is not currently supported by HyperSQL and is allowed as a table or column name. You should avoid using such names as future versions of HyperSQL are likely to support the reserved words and may reject your table definitions or queries. The full list of SQL reserved words is in the appendix Lists of Keywords .

                  If you have to use a reserved keyword as the name of a database object, you can enclose it in double quotes.

                  HyperSQL also supports enhancements with keywords and expressions that are not part of the SQL standard. Expressions such as SELECT TOP 5 FROM .., SELECT LIMIT 0 10 FROM ... or DROP TABLE mytable IF EXISTS are among such constructs.

                  Many print books cover SQL Standard syntax and can be consulted. For a well-written basic guide to SQL with examples, you can also consult PostgreSQL: Introduction and Concepts by Bruce Momjian, which is available on the web. Most of the core SQL coverage in the book applies also to HyperSQL. There are some differences in keywords supported by one and not the other engine (OUTER, OID's, etc.) or used differently (IDENTITY/SERIAL, TRIGGER, SEQUENCE, etc.).

                  In HyperSQL version 2.0, all features of JDBC4 that apply to the capabilities of HSQLDB are fully supported. The relevant JDBC classes are thoroughly documented with additional clarifications and HyperSQL specific comments. See the JavaDoc for the org.hsqldb.jdbc.* classes.

                  SQL Data and Tables

                  In an SQL system, all significant data is stored in tables and sequence generators. Therefore, the first step in creating a database is defining the tables and their columns. The SQL standard supports temporary tables, which are for temporary data, and permanent base tables, which are for persistent data.

                  Temporary Tables

                  Data in TEMPORARY tables is not saved and lasts only for the lifetime of the session. The contents of each TEMP table is visible only from the session that is used to populate it.

                  HyperSQL supports two types of temporary tables.

                  The GLOBAL TEMPORARY type is a schema object. It is created with the CREATE GLOBAL TEMPORARY TABLE statement. The definition of the table persists, and each session has access to the table. But each session sees its own copy of the table, which is empty at the beginning of the session.

                  The LOCAL TEMPORARY type is not a schema object. It is created with the DECLARE LOCAL TEMPORARY TABLE statement. The table definition lasts only for the duration of the session and is not persisted in the database. The table can be declared in the middle of a transaction without committing the transaction.

                  When the session commits, the contents of all temporary tables are cleared by default. If the table definition statements includes ON COMMIT PRESERVE ROWS, then the contents are kept when a commit takes place.

                  The rows in temporary tables are stored in memory by default. If the hsqldb.result_max_memory_rows ( SET SESSION RESULT MEMORY ROWS <row count> ) has been specified, tables with row count above the setting are stored on disk.

                  Persistent Tables

                  HyperSQL supports the Standard definition of persistent base table, but defines three types according to the way the data is stored. These are MEMORY tables, CACHED tables and TEXT tables.

                  Memory tables are the default type when the CREATE TABLE command is used. Their data is held entirely in memory but any change to their structure or contents is written to the *.log and *.script files. The *.script file and the *.log file are read the next time the database is opened, and the MEMORY tables are recreated with all their contents. So unlike TEMPORARY tables, MEMORY tables are persistent. When the database is opened, all the data for the memory tables is read and inserted. This process may take a long time if the database is larger than tens of megabytes. When the database is shutdown, all the data is saved. This can also take a long time.

                  CACHED tables are created with the CREATE CACHED TABLE command. Only part of their data or indexes is held in memory, allowing large tables that would otherwise take up to several hundred megabytes of memory. Another advantage of cached tables is that the database engine takes less time to start up when a cached table is used for large amounts of data. The disadvantage of cached tables is a reduction in speed. Do not use cached tables if your data set is relatively small. In an application with some small tables and some large ones, it is better to use the default, MEMORY mode for the small tables.

                  TEXT tables use a CSV (Comma Separated Value) or other delimited text file as the source of their data. You can specify an existing CSV file, such as a dump from another database or program, as the source of a TEXT table. Alternatively, you can specify an empty file to be filled with data by the database engine. TEXT tables are efficient in memory usage as they cache only part of the text data and all of the indexes. The Text table data source can always be reassigned to a different file if necessary. The commands are needed to set up a TEXT table as detailed in the Text Tables chapter.

                  With all-in-memory databases, both MEMORY table and CACHED table declarations are treated as declarations for non-persistent memory tables. In the latest versions of HyperSQL, TEXT table declarations are allowed in all-in-memory databases.

                  The default type of tables resulting from future CREATE TABLE statements can be specified with the SQL command:

                      SET DATABASE DEFAULT TABLE TYPE { CACHED | MEMORY };

                  The type of an existing table can be changed with the SQL command:

                      SET TABLE <table name> TYPE { CACHED | MEMORY };

                  SQL statements access different types of tables uniformly. No change to statements is needed to access different types of table.

                  Lob Data

                  Lobs are logically stored in columns of tables. Their physical storage is a separate *.lobs file. This file is created as soon as a BLOB or CLOB is inserted into the database. The file will grow as new lobs are inserted into the database. In version 2.x, the *.lobs file is never deleted even if all lobs are deleted from the database (In this case you can delete the .lobs file after a SHUTDOWN).

                  Short Guide to Data Types

                  Most other RDBMS do not conform to the SQL Standard in all areas, but they are gradually moving towards Standard conformance. When switching from another SQL dialect, the following should be considered:

                  • Numeric types TINYINT, SMALLINT, INTEGER and BIGINT are types with fixed binary precision. These types are more efficient to store and retrieve. NUMERIC and DECIMAL are types with user-defined decimal precision. They can be used with zero scale to store very large integers, or with a non-zero scale to store decimal fractions. The DOUBLE type is a 64 bit, approximate floating point types. HyperSQL even allows you to store infinity in this type.

                  • The BOOLEAN type is for logical values and can hold TRUE, FALSE or UNKNOWN. Although HyperSQL allows you to use one and zero in assignment or comparison, you should use the standard values for this type.

                  • Character string types are CHAR(L), VARCHAR(L) and CLOB. CHAR is for fixed width strings and any string that is assigned to this type is padded with spaces at the end. Do not use this type for general storage of strings. If you use CHAR without the length L, then it is interpreted as a single character string. Use VARCHAR(L) for general strings. There are only memory limits and performance implications for the maximum length of VARCHAR(L). If the strings are larger than a few kilobytes, consider using CLOB. The CLOB types is for very large strings. Do not use this type for short strings as there are performance implications. The CLOB type is a better choice for the storage of long strings. By default LONGVARCHAR is a synonym for a long VARCHAR and can be used without specifying the size. You can set LONGVARCHAR to map to CLOB, with the sql.longvar_is_lob connection property or the SET DATABASE SQL LONGVAR IS LOB TRUE statement.

                  • Binary string types are BINARY(L), VARBINARY(L) and BLOB. Do not use BINARY(L) unless you are storing keys such as UUID. This type pads short binary strings with zero bytes. BINARY without the length L means a single byte. Use VARBINARY(L) for general binary strings, and BLOB for large binary objects. You should apply the same considerations as with the character string types. By default LONGVARBINARY is a synonym for a long VARCHAR and can be used without specifying the size. You can set LONGVARBINARY to map to BLOB, with the sql.longvar_is_lob connection property or the SET DATABASE SQL LONGVAR IS LOB TRUE statement.

                  • The BIT(L) and BITVARYING(L) types are for bit maps. Do not use them for other types of data. BIT without the length L argument means a single bit and is sometimes used as a logical type. Use BOOLEAN instead of this type.

                  • The datetime types DATE, TIME and TIMESTAMP, together with their WITH TIME ZONE variations are available. Read the details in this chapter on how to use these types.

                  • The INTERVAL type is very powerful when used together with the datetime types. This is very easy to use, but is supported mainly by "big iron" database systems. Note that functions that add days or months to datetime values are not really a substitute for the INTERVAL type. Expressions such as (datecol - 7 DAY) > CURRENT_DATE are optimised to use indexes when it is possible, while the equivalent function calls are not optimised.

                  • The OTHER type is for storage of Java objects. If your objects are large, serialize them in your application and store them as BLOB in the database.

                  • The ARRAY type supports all base types except LOB and OTHER types. ARRAY data objects are held in memory while being processed. It is therefore not recommended to store more than about a thousand objects in an ARRAY in normal operations with disk based databases. For specialised applications, use ARRAY with as many elements as your memory allocation can support.

                  HyperSQL 2.2.x has several compatibility modes which allow the type names that are used by other RDBMS to be accepted and translated into the closest SQL Standard type. For example the type TEXT, supported by MySQL and PostgreSQL is translated in these compatibility modes.

                  Data Types and Operations

                  HyperSQL supports all the types defined by SQL-92, plus BOOLEAN, BINARY and LOB types that were added later to the SQL Standard. It also supports the non-standard OTHER type to store serializable Java objects.

                  SQL is a strongly typed language. All data stored in specific columns of tables and other objects (such as sequence generators) have specific types. Each data item conforms to the type limits such as precision and scale for the column. It also conforms to any additional integrity constraints that are defined as CHECK constraints in domains or tables. Types can be explicitly converted using the CAST expression, but in most expressions they are converted automatically.

                  Data is returned to the user (or the application program) as a result of executing SQL statements such as query expressions or function calls. All statements are compiled prior to execution and the return type of the data is known after compilation and before execution. Therefore, once a statement is prepared, the data type of each column of the returned result is known, including any precision or scale property. The type does not change when the same query that returned one row, returns many rows as a result of adding more data to the tables.

                  Some SQL functions used within SQL statements are polymorphic, but the exact type of the argument and the return value is determined at compile time.

                  When a statement is prepared, using a JDBC PreparedStatement object, it is compiled by the engine and the type of the columns of its ResultSet and / or its parameters are accessible through the methods of PreparedStatement.

                  Numeric Types

                  TINYINT, SMALLINT, INTEGER, BIGINT, NUMERIC and DECIMAL (without a decimal point) are the supported integral types. They correspond respectively to byte, short, int, long, BigDecimal and BigDecimal Java types in the range of values that they can represent (NUMERIC and DECIMAL are equivalent). The type TINYINT is an HSQLDB extension to the SQL Standard, while the others conform to the Standard definition. The SQL type dictates the maximum and minimum values that can be held in a field of each type. For example the value range for TINYINT is -128 to +127. The bit precision of TINYINT, SMALLINT, INTEGER and BIGINT is respectively 8, 16, 32 and 64. For NUMERIC and DECIMAL, decimal precision is used.

                  DECIMAL and NUMERIC with decimal fractions are mapped to java.math.BigDecimal and can have very large numbers of digits. In HyperSQL the two types are equivalent. These types, together with integral types, are called exact numeric types.

                  In HyperSQL, REAL, FLOAT, DOUBLE are equivalent and all mapped to double in Java. These types are defined by the SQL Standard as approximate numeric types. The bit-precision of all these types is 64 bits.

                  The decimal precision and scale of NUMERIC and DECIMAL types can be optionally defined. For example, DECIMAL(10,2) means maximum total number of digits is 10 and there are always 2 digits after the decimal point, while DECIMAL(10) means 10 digits without a decimal point. The bit-precision of FLOAT can also be defined, but in this case, it is ignored and the default bit-precision of 64 is used. The default precision of NUMERIC and DECIMAL (when not defined) is 100.

                  Note: If a database has been set to ignore type precision limits with the SET DATABASE SQL SIZE FALSE command, then a type definition of DECIMAL with no precision and scale is treated as DECIMAL(100,10). In normal operation, it is treated as DECIMAL(100).

                  Integral Types

                  In expressions, TINYINT, SMALLINT, INTEGER, BIGINT, NUMERIC and DECIMAL (without a decimal point) are fully interchangeable, and no data narrowing takes place.

                  If the SELECT statement refers to a simple column or function, then the return type is the type corresponding to the column or the return type of the function. For example:

                      CREATE TABLE t(a INTEGER, b BIGINT);
                      SELECT MAX(a), MAX(b) FROM t;

                  will return a ResultSet where the type of the first column is java.lang.Integer and the second column is java.lang.Long. However,

                      SELECT MAX(a) + 1, MAX(b) + 1 FROM t;

                  will return java.lang.Long and BigDecimal values, generated as a result of uniform type promotion for all the return values. Note that type promotion to BigDecimal ensures the correct value is returned if MAX(b) evaluates to Long.MAX_VALUE.

                  There is no built-in limit on the size of intermediate integral values in expressions. As a result, you should check for the type of the ResultSet column and choose an appropriate getXXXX() method to retrieve it. Alternatively, you can use the getObject() method, then cast the result to java.lang.Number and use the intValue() or longValue() methods on the result.

                  When the result of an expression is stored in a column of a database table, it has to fit in the target column, otherwise an error is returned. For example when 1234567890123456789012 / 12345687901234567890 is evaluated, the result can be stored in any integral type column, even a TINYINT column, as it is a small value.

                  In SQL Statements, an integer literal is treated as INTEGER, unless its value does not fit. In this case it is treated as BIGINT or DECIMAL, depending on the value.

                  Depending on the types of the operands, the result of the operations is returned in a JDBC ResultSet in any of related Java types: Integer, Long or BigDecimal. The ResultSet.getXXXX() methods can be used to retrieve the values so long as the returned value can be represented by the resulting type. This type is deterministically based on the query, not on the actual rows returned.

                  Other Numeric Types

                  In SQL statements, number literals with a decimal point are treated as DECIMAL unless they are written with an exponent. Thus 0.2 is considered a DECIMAL value but 0.2E0 is considered a DOUBLE value.

                  When an approximate numeric type, REAL, FLOAT or DOUBLE (all synonymous) is part of an expression involving different numeric types, the type of the result is DOUBLE. DECIMAL values can be converted to DOUBLE unless they are beyond the Double.MIN_VALUE - Double.MAX_VALUE range. For example, A * B, A / B, A + B, etc. will return a DOUBLE value if either A or B is a DOUBLE.

                  Otherwise, when no DOUBLE value exists, if a DECIMAL or NUMERIC value is part an expression, the type of the result is DECIMAL or NUMERIC. Similar to integral values, when the result of an expression is assigned to a table column, the value has to fit in the target column, otherwise an error is returned. This means a small, 4 digit value of DECIMAL type can be assigned to a column of SMALLINT or INTEGER, but a value with 15 digits cannot.

                  When a DECIMAL values is multiplied by a DECIMAL or integral type, the resulting scale is the sum of the scales of the two terms. When they are divided, the result is a value with a scale (number of digits to the right of the decimal point) equal to the larger of the scales of the two terms. The precision for both operations is calculated (usually increased) to allow all possible results.

                  The distinction between DOUBLE and DECIMAL is important when a division takes place. For example, 10.0/8.0 (DECIMAL) equals 1.2 but 10.0E0/8.0E0 (DOUBLE) equals 1.25. Without division operations, DECIMAL values represent exact arithmetic.

                  REAL, FLOAT and DOUBLE values are all stored in the database as java.lang.Double objects. Special values such as NaN and +-Infinity are also stored and supported. These values can be submitted to the database via JDBC PreparedStatement methods and are returned in ResultSet objects. In order to allow division by zero of DOUBLE values in SQL statements (which returns NaN or +-Infinity) you should set the property hsqldb.double_nan as false (SET DATABASE SQL DOUBLE NAN FALSE). The double values can be retrieved from a ResultSet in the required type so long as they can be represented. For setting the values, when PreparedStatement.setDouble() or setFloat() is used, the value is treated as a DOUBLE automatically.

                  In short,

                  <numeric type> ::= <exact numeric type> | <approximate numeric type>

                  <exact numeric type> ::= NUMERIC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ] | { DECIMAL | DEC } [ <left paren> <precision> [ <comma> <scale> ] <right paren> ] | SMALLINT | INTEGER | INT | BIGINT

                  <approximate numeric type> ::= FLOAT [ <left paren> <precision> <right paren> ] | REAL | DOUBLE PRECISION

                  <precision> ::= <unsigned integer>

                  <scale> ::= <unsigned integer>

                  Boolean Type

                  The BOOLEAN type conforms to the SQL Standard and represents the values TRUE, FALSE and UNKNOWN. This type of column can be initialised with Java boolean values, or with NULL for the UNKNOWN value.

                  The three-value logic is sometimes misunderstood. For example, x IN (1, 2, NULL) does not return true if x is NULL.

                  In previous versions of HyperSQL, BIT was simply an alias for BOOLEAN. In version 2.0, BIT is a single-bit bit map.

                  <boolean type> ::= BOOLEAN

                  The SQL Standard does not support type conversion to BOOLEAN apart from character strings that consists of boolean literals. Because the BOOLEAN type is relatively new to the Standard, several database products used other types to represent boolean values. For improved compatibility, HyperSQL allows some type conversions to boolean.

                  Values of BIT and BIT VARYING types with length 1 can be converted to BOOLEAN. If the bit is set, the result of conversion is the TRUE value, otherwise it is FALSE.

                  Values of TINYINT, SMALLINT, INTEGER and BIGINT types can be converted to BOOLEAN. If the value is zero, the result is the FALSE value, otherwise it is TRUE.

                  Character String Types

                  The CHARACTER, CHARACTER VARYING and CLOB types are the SQL Standard character string types. CHAR, VARCHAR and CHARACTER LARGE OBJECT are synonyms for these types. HyperSQL also supports LONGVARCHAR as a synonym for VARCHAR. If LONGVARCHAR is used without a length, then a length of 16M is assigned. You can set LONGVARCHAR to map to CLOB, with the sql.longvar_is_lob connection property or the SET DATABASE SQL LONGVAR IS LOB TRUE statement..

                  HyperSQL's default character set is Unicode, therefore all possible character strings can be represented by these types.

                  The SQL Standard behaviour of the CHARACTER type is a remnant of legacy systems in which character strings are padded with spaces to fill a fixed width. These spaces are sometimes significant while in other cases they are silently discarded. It would be best to avoid the CHARACTER type altogether. With the rest of the types, the strings are not padded when assigned to columns or variables of the given type. The trailing spaces are still considered discardable for all character types. Therefore if a string with trailing spaces is too long to assign to a column or variable of a given length, the spaces beyond the type length are discarded and the assignment succeeds (provided all the characters beyond the type length are spaces).

                  The VARCHAR and CLOB types have length limits, but the strings are not padded by the system. Note that if you use a large length for a VARCHAR or CLOB type, no extra space is used in the database. The space used for each stored item is proportional to its actual length.

                  If CHARACTER is used without specifying the length, the length defaults to 1. For the CLOB type, the length limit can be defined in units of kilobyte (K, 1024), megabyte (M, 1024 * 1024) or gigabyte (G, 1024 * 1024 * 1024), using the <multiplier>. If CLOB is used without specifying the length, the length defaults to 16M.

                  <character string type> ::= { CHARACTER | CHAR } [ <left paren> <character length> <right paren> ] | { CHARACTER VARYING | CHAR VARYING | VARCHAR } <left paren> <character length> <right paren> | LONGVARCHAR [ <left paren> <character length> <right paren> ] | <character large object type>

                  <character large object type> ::= { CHARACTER LARGE OBJECT | CHAR LARGE OBJECT | CLOB } [ <left paren> <character large object length> <right paren> ]

                  <character length> ::= <unsigned integer> [ <char length units> ]

                  <large object length> ::= <length> [ <multiplier> ] | <large object length token>

                  <character large object length> ::= <large object length> [ <char length units> ]

                  <large object length token> ::= <digit>... <multiplier>

                  <multiplier> ::= K | M | G

                  <char length units> ::= CHARACTERS | OCTETS

                  CHAR(10)
                  CHARACTER(10)
                  VARCHAR(2)
                  CHAR VARYING(2)
                  CLOB(1000)
                  CLOB(30K)
                  CHARACTER LARGE OBJECT(1M)
                  LONGVARCHAR
                  

                  Binary String Types

                  The BINARY, BINARY VARYING and BLOB types are the SQL Standard binary string types. VARBINARY and BINARY LARGE OBJECT are synonyms for BINARY VARYING and BLOB types. HyperSQL also supports LONGVARBINARY as a synonym for VARBINARY. You can set LONGVARBINARY to map to BLOB, with the sql.longvar_is_lob connection property or the SET DATABASE SQL LONGVAR IS LOB TRUE statement.

                  Binary string types are used in a similar way to character string types. There are several built-in functions that are overloaded to support character, binary and bit strings.

                  The BINARY type represents a fixed width-string. Each shorter string is padded with zeros to fill the fixed width. Similar to the CHARACTER type, the trailing zeros in the BINARY string are simply discarded in some operations. For the same reason, it is best to avoid this particular type and use VARBINARY instead.

                  When two binary values are compared, if one is of BINARY type, then zero padding is performed to extend the length of the shorter string to the longer one before comparison. No padding is performed with other binary types. If the bytes compare equal to the end of the shorter value, then the longer string is considered larger than the shorter string.

                  If BINARY is used without specifying the length, the length defaults to 1. For the BLOB type, the length limit can be defined in units of kilobyte (K, 1024), megabyte (M, 1024 * 1024) or gigabyte (G, 1024 * 1024 * 1024), using the <multiplier>. If BLOB is used without specifying the length, the length defaults to 16M.

                  <binary string type> ::= BINARY [ <left paren> <length> <right paren> ] | { BINARY VARYING | VARBINARY } <left paren> <length> <right paren> | LONGVARBINARY [ <left paren> <length> <right paren> ] | <binary large object string type>

                  <binary large object string type> ::= { BINARY LARGE OBJECT | BLOB } [ <left paren> <large object length> <right paren> ]

                  <length> ::= <unsigned integer>

                  BINARY(10)
                  VARBINARY(2)
                  BINARY VARYING(2)
                  BLOB(1000)
                  BLOB(30K)
                  BINARY LARGE OBJECT(1M)
                  LONGVARBINARY
                  

                  Bit String Types

                  The BIT and BIT VARYING types are the supported bit string types. These types were defined by SQL:1999 but were later removed from the Standard. Bit types represent bit maps of given lengths. Each bit is 0 or 1. The BIT type represents a fixed width-string. Each shorter string is padded with zeros to fill the fixed with. If BIT is used without specifying the length, the length defaults to 1. The BIT VARYING type has a maximum width and shorter strings are not padded.

                  Before the introduction of the BOOLEAN type to the SQL Standard, a single-bit string of the type BIT(1) was commonly used. For compatibility with other products that do not conform to, or extend, the SQL Standard, HyperSQL allows values of BIT and BIT VARYING types with length 1 to be converted to and from the BOOLEAN type. BOOLEAN TRUE is considered equal to B'1', BOOLEAN FALSE is considered equal to B'0'.

                  For the same reason, numeric values can be assigned to columns and variables of the type BIT(1). For assignment, the numeric value zero is converted to B'0', while all other values are converted to B'1'. For comparison, numeric values 1 is considered equal to B'1' and numeric value zero is considered equal to B'0'.

                  It is not allowed to perform other arithmetic or boolean operations involving BIT(1) and BIT VARYING(1). The kid of operations allowed on bit strings are analogous to those allowed on BINARY and CHARACTER strings. Several built-in functions support all three types of string.

                  <bit string type> ::= BIT [ <left paren> <length> <right paren> ] | BIT VARYING <left paren> <length> <right paren>

                  BIT
                  BIT(10)
                  BIT VARYING(2)
                  

                  Storage and Handling of Java Objects

                  Any serializable JAVA Object can be inserted directly into a column of type OTHER using any variation of PreparedStatement.setObject() methods.

                  For comparison purposes and in indexes, any two Java Objects are considered equal unless one of them is NULL. You cannot search for a specific object or perform a join on a column of type OTHER.

                  Please note that HSQLDB is not an object-relational database. Java Objects can simply be stored internally and no operations should be performed on them other than assignment between columns of type OTHER or tests for NULL. Tests such as WHERE object1 = object2 do not mean what you might expect, as any non-null object would satisfy such a tests. But WHERE object1 IS NOT NULL is perfectly acceptable.

                  The engine does not allow normal column values to be assigned to Java Object columns (for example, assigning an INTEGER or STRING to such a column with an SQL statement such as UPDATE mytable SET objectcol = intcol WHERE ...).

                  <java object type> ::= OTHER

                  Type Length, Precision and Scale

                  In older version of HyperSQL, all table column type definitions with a column length, precision or scale qualifier were accepted and ignored. HSQLDB 1.8 enforced correctness but included an option to enforce the length, precision or scale.

                  In HyperSQL 2.0, length, precision and scale qualifiers are always enforced. For backward compatibility, when older databases which had the property hsqldb.enforce_strict_size=false are converted to version 2.0, this property is retained. However, this is a temporary measure. You should test your application to ensure the length, precision and scale that is used for column definitions is appropriate for the application data. You can test with the default database setting, which enforces the sizes.

                  String types, including all BIT, BINARY and CHAR string types plus CLOB and BLOB, are generally defined with a length. If no length is specified for BIT, BINARY and CHAR, the default length is 1. For CLOB and BLOB an implementation defined length of 1M is used.

                  TIME and TIMESTAMP types can be defined with a fractional second precision between 0 and 9. INTERVAL type definition may have precision and, in some cases, fraction second precision. DECIMAL and NUMERIC types may be defined with precision and scale. For all of these types a default precision or scale value is used if one is not specified. The default scale is 0. The default fractional precision for TIME is 0, while it is 6 for TIMESTAMP.

                  Values can be converted from one type to another in two different ways: by using explicit CAST expression or by implicit conversion used in assignment, comparison and aggregation.

                  String values cannot be assigned to VARCHAR columns if they are longer than the defined type length. For CHARACTER columns, a long string can be assigned (with truncation) only if all the characters after the length are spaces. Shorter strings are padded with the space character when inserted into a CHARACTER column. Similar rules are applied to VARBINARY and BINARY columns. For BINARY columns, the padding and truncation rules are applied with zero bytes, instead of spaces.

                  Explicit CAST of a value to a CHARACTER or VARCHAR type will result in forced truncation or padding. So a test such as CAST (mycol AS VARCHAR(2)) = 'xy' will find the values beginning with 'xy'. This is the equivalent of SUBSTRING(mycol FROM 1 FOR 2)= 'xy'.

                  For all numeric types, the rules of explicit cast and implicit conversion are the same. If cast or conversion causes any digits to be lost from the fractional part, it can take place. If the non-fractional part of the value cannot be represented in the new type, cast or conversion cannot take place and will result in a data exception.

                  There are special rules for DATE, TIME, TIMESTAMP and INTERVAL casts and conversions.

                  Datetime types

                  HSQLDB fully supports datetime and interval types and operations, including all relevant optional features, as specified by the SQL Standard since SQL-92. The two groups of types are complementary.

                  The DATE type represents a calendar date with YEAR, MONTH and DAY fields.

                  The TIME type represents time of day with HOUR, MINUTE and SECOND fields, plus an optional SECOND FRACTION field.

                  The TIMESTAMP type represents the combination of DATE and TIME types.

                  TIME and TIMESTAMP types can include WITH TIME ZONE or WITHOUT TIME ZONE (the default) qualifiers. They can have fractional second parts. For example, TIME(6) has six fractional digits for the second field.

                  If fractional second precision is not specified, it defaults to 0 for TIME and to 6 for TIMESTAMP.

                  <datetime type> ::= DATE | TIME [ <left paren> <time precision> <right paren> ] [ <with or without time zone> ] | TIMESTAMP [ <left paren> <timestamp precision> <right paren> ] [ <with or without time zone> ]

                  <with or without time zone> ::= WITH TIME ZONE | WITHOUT TIME ZONE

                  <time precision> ::= <time fractional seconds precision>

                  <timestamp precision> ::= <time fractional seconds precision>

                  <time fractional seconds precision> ::= <unsigned integer>

                  DATE
                  TIME(6)
                  TIMESTAMP(2) WITH TIME ZONE
                  

                  Examples of the string literals used to represent date time values, some with time zone, some without, are below:

                  DATE '2008-08-22'
                  TIMESTAMP '2008-08-08 20:08:08'
                  TIMESTAMP '2008-08-08 20:08:08+8:00' /* Beijing */
                  TIME '20:08:08.034900'
                  TIME '20:08:08.034900-8:00' /* US Pacific */

                  Time Zone

                  DATE values do not take time zones. For example United Nations designates 5 June as World Environment Day, which was observed on DATE '2008-06-05' in different time zones.

                  TIME and TIMESTAMP values without time zone, usually have a context that indicates some local time zone. For example, a database for college course timetables usually stores class dates and times without time zones. This works because the location of the college is fixed and the time zone displacement is the same for all the values. Even when the events take place in different time zones, for example international flight times, it is possible to store all the datetime information as references to a single time zone, usually GMT. For some databases it may be useful to store the time zone displacement together with each datetime value. SQL’s TIME WITH TIME ZONE and TIMESTAMP WITH TIME ZONE values include a time zone displacement value.

                  The time zone displacement is of the type INTERVAL HOUR TO MINUTE. This data type is described in the next section. The legal values are between '–14:00' and   '+14:00'.

                  Operations on Datetime Types

                  The expression <datetime expression> AT TIME ZONE <time displacement> evaluates to a datetime value representing exactly the same point of time in the specified <time displacement>. The expression, AT LOCAL is equivalent to AT TIME ZONE <local time displacement>. If AT TIME ZONE is used with a datetime operand of type WITHOUT TIME ZONE, the operand is first converted to a value of type WITH TIME ZONE at the session’s time displacement, then the specified time zone displacement is set for the value. Therefore, in these cases, the final value depends on the time zone of the session in which the statement was used.

                  AT TIME ZONE, modifies the field values of the datetime operand. This is done by the following procedure:

                  1. determine the corresponding datetime at UTC.

                  2. find the datetime value at the given time zone that corresponds with the UTC value from step 1.

                  Example a:

                  TIME '12:00:00' AT TIME ZONE INTERVAL '1:00' HOUR TO MINUTE
                  

                  If the session’s time zone displacement is -'8:00', then in step 1, TIME '12:00:00' is converted to UTC, which is TIME '20:00:00+0:00'. In step 2, this value is expressed as TIME '21:00:00+1:00'.

                  Example b:

                  TIME '12:00:00-5:00' AT TIME ZONE INTERVAL '1:00' HOUR TO MINUTE
                  

                  Because the operand has a time zone, the result is independent of the session  time zone displacement. Step 1 results in TIME '17:00:00+0:00', and step 2 results in TIME '18:00:00+1:00'

                  Note that the operand is not limited to datetime literals used in these examples. Any valid expression that evaluates to a datetime value can be the operand.

                  Type Conversion

                  CAST is used to for all other conversions. Examples:

                  CAST (<value> AS TIME WITHOUT TIME ZONE)
                  CAST (<value> AS TIME WITH TIME ZONE)

                  In the first example, if <value> has a time zone component, it is simply dropped. For example TIME '12:00:00-5:00' is converted to TIME '12:00:00'

                  In the second example, if <value> has no time zone component, the current time zone displacement of the session is added. For example TIME '12:00:00' is converted to TIME '12:00:00-8:00' when the session time zone displacement is '-8:00'.

                  Conversion between DATE and TIMESTAMP is performed by removing the TIME component of a TIMESTAMP value or by setting the hour, minute and second fields to zero. TIMESTAMP '2008-08-08 20:08:08+8:00' becomes DATE '2008-08-08', while DATE '2008-08-22' becomes TIMESTAMP '2008-08-22 00:00:00'.

                  Conversion between TIME and TIMESTAMP is performed by removing the DATE field values of a TIMESTAMP value or by appending the fields of the TIME value to the fields of the current session date value.

                  Assignment

                  When a value is assigned to a datetime target, e.g., a value is used to update a row of a table, the type of the value must be the same as the target, but the WITH TIME ZONE or WITHOUT TIME ZONE characteristics can be different. If the types are not the same, an explicit CAST must be used to convert the value into the target type.

                  Comparison

                  When values WITH TIME ZONE are compared, they are converted to UTC values before comparison. If a value WITH TIME ZONE is compared to another WITHOUT TIME ZONE, then the WITH TIME ZONE value is converted to AT LOCAL, then converted to WITHOUT TIME ZONE before comparison.

                  It is not recommended to design applications that rely on comparisons and conversions between TIME values WITH TIME ZONE. The conversions may involve normalisation of the time value, resulting in unexpected results. For example, the expression: BETWEEN(TIME '12:00:00-8:00', TIME '22:00:00-8:00') is converted to BETWEEN(TIME '20:00:00+0:00', TIME '06:00:00+0:00') when it is evaluated in the UTC zone, which is always FALSE.

                  Functions

                  Several functions return the current session timestamp in different datetime types:

                  CURRENT_DATE

                  DATE

                  CURRENT_TIME

                  TIME WITH TIME ZONE

                  CURRENT_TIMESTAMP

                  TIMESTAMP WITH TIME ZONE

                  LOCALTIME

                  TIMESTAMP WITHOUT TIME ZONE

                  LOCALTIMESTAMP

                  TIMESTAMP WITHOUT TIME ZONE

                  Session Time Zone Displacement

                  When an SQL session is started (with a JDBC connection) the local time zone of the client JVM (including any seasonal time adjustments such as daylight saving time) is used as the session time zone displacement. Note that the SQL session time displacement is not changed when a seasonal time adjustment takes place while the session is open. To change the SQL session time zone displacement use the following commands:

                  SET TIME ZONE <time displacement>

                  SET TIME ZONE LOCAL

                  The first command sets the displacement to the given value. The second command restores the original, real time zone displacement of the session.

                  Datetime Values and Java

                  When datetime values are sent to the database using the PreparedStatement or CallableStatement interfaces, the Java object is converted to the type of the prepared or callable statement parameter. This type may be DATE, TIME, or TIMESTAMP (with or without time zone). The time zone displacement is the time zone of the JDBC session.

                  When datetime values are retrieved from the database using the ResultSet interface, there are two representations. The getString(…) methods of the ResultSet interface, return an exact representation of the value in the SQL type as it is stored in the database. This includes the correct number of digits for the fractional second field, and for values with time zone displacement, the time zone displacement. Therefore if TIME '12:00:00' is stored in the database, all users in different time zones will get '12:00:00' when they retrieve the value as a string. The getTime(…) and getTimestamp(…) methods of the ResultSet interface return Java objects that are corrected for the session time zone. The UTC millisecond value contained the java.sql.Time or java.sql.Timestamp objects will be adjusted to the time zone of the session, therefore the toString() method of these objects return the same values in different time zones.

                  If you want to store and retrieve UTC values that are independent of any session's time zone, you can use a TIMESTAMP WITH TIME ZONE column. The setTime(...) and setTimestamp(...) methods of the PreparedStatement interface which have a Calendar parameter can be used to assign the values. The time zone of the given Calendar argument is used as the time zone. Conversely, the getTime(...) and getTimestamp(...) methods of the ResultSet interface which have a Calendar parameter can be used with a Calendar argument to retrieve the values.

                  JDBC has an unfortunate limitation and does not include type codes for SQL datetime types that have a TIME ZONE property. Therefore, for compatibility with database tools that are limited to the JDBC type codes, HyperSQL reports these types by default as datetime types without TIME ZONE. You can use the URL property hsqldb.translate_dti_types=false to override the default behaviour.

                  Interval Types

                  Interval types are used to represent differences between date time values. The difference between two date time values can be measured in seconds or in months. For measurements in months, the units YEAR and MONTH are available, while for measurements in seconds, the units DAY, HOUR, MINUTE, SECOND are available. The units can be used individually, or as a range. An interval type can specify the precision of the most significant field and the second fraction digits of the SECOND field (if it has a SECOND field). The default precision is 2. The default second precision is 0.

                  <interval type> ::= INTERVAL <interval qualifier>

                  <interval qualifier> ::= <start field> TO <end field> | <single datetime field>

                  <start field> ::= <non-second primary datetime field> [ <left paren> <interval leading field precision> <right paren> ]

                  <end field> ::= <non-second primary datetime field> | SECOND [ <left paren> <interval fractional seconds precision> <right paren> ]

                  <single datetime field> ::= <non-second primary datetime field> [ <left paren> <interval leading field precision> <right paren> ] | SECOND [ <left paren> <interval leading field precision> [ <comma> <interval fractional seconds precision> ] <right paren> ]

                  <primary datetime field> ::= <non-second primary datetime field> | SECOND

                  <non-second primary datetime field> ::= YEAR | MONTH | DAY | HOUR | MINUTE

                  <interval fractional seconds precision> ::= <unsigned integer>

                  <interval leading field precision> ::= <unsigned integer>

                  Examples of INTERVAL type definition:

                  INTERVAL YEAR TO MONTH
                  INTERVAL YEAR(3)
                  INTERVAL DAY(4) TO HOUR
                  INTERVAL MINUTE(4) TO SECOND(6)
                  INTERVAL SECOND(4,6)
                  

                  The word INTERVAL indicates the general type name. The rest of the definition is called an <interval qualifier>. This designation is important, as in most expressions <interval qualifier> is used without the word INTERVAL.

                  Interval Values

                  An interval value can be negative, positive or zero. An interval type has all the datetime fields in the specified range. These fields are similar to those in the TIMESTAMP type. The differences are as follows:

                  The first field of an interval value can hold any numeric value up to the specified precision. For example, the hour field in HOUR(2) TO SECOND can hold values above 23 (up to 99). The year and month fields can hold zero (unlike a TIMESTAMP value) and the maximum value of a month field that is not the most significant field, is 11.

                  The standard function ABS(<interval value expression>) can be used to convert a negative interval value to a positive one.

                  The literal representation of interval values consists of the type definition, with a string representing the interval value inserted after the word INTERVAL. Some examples of interval literal below:

                  INTERVAL '145 23:12:19.345' DAY(3) TO SECOND(3)
                  INTERVAL '3503:12:19.345' HOUR TO SECOND(3) /* equal to the first value */
                  INTERVAL '19.345' SECOND(4,3) /* maximum number of digits for the second value is 4, and each value is expressed with three fraction digits. */
                  INTERVAL '-23-10' YEAR(2) TO MONTH
                  

                  Interval values of the types that are based on seconds can be cast into one another. Similarly those that are based on months can be cast into one another. It is not possible to cast or convert a value based on seconds to one based on months, or vice versa.

                  When a cast is performed to a type with a smaller least-significant field, nothing is lost from the interval value. Otherwise, the values for the missing least-significant fields are discarded. Examples:

                  CAST ( INTERVAL '145 23:12:19' DAY TO SECOND AS INTERVAL DAY TO HOUR ) = INTERVAL '145 23' DAY TO HOUR
                  CAST(INTERVAL '145 23' DAY TO HOUR AS INTERVAL DAY TO SECOND) = INTERVAL '145 23:00:00' DAY TO SECOND
                  

                  A numeric value can be cast to an interval type. In this case the numeric value is first converted to a single-field INTERVAL type with the same field as the least significant field of the target interval type. This value is then converted to the target interval type For example CAST( 22 AS INTERVAL YEAR TO MONTH) evaluates to INTERVAL '22' MONTH and then INTERVAL '1 10' YEAR TO MONTH. Note that SQL Standard only supports casts to single-field INTERVAL types, while HyperSQL allows casting to multi-field types as well.

                  An interval value can be cast to a numeric type. In this case the interval value is first converted to a single-field INTERVAL type with the same field as the least significant filed of the interval value. The value is then converted to the target type. For example CAST (INTERVAL '1-11' YEAR TO MONTH AS INT) evaluates to INTERVAL '23' MONTH, and then 23.

                  An interval value can be cast into a character type, which results in an INTERVAL literal. A character value can be cast into an INTERVAL type so long as it is a string with a format compatible with an INTERVAL literal.

                  Two interval values can be added or subtracted so long as the types of both are based on the same field, i.e., both are based on MONTH or SECOND. The values are both converted to a single-field interval type with same field as the least-significant field between the two types. After addition or subtraction, the result is converted to an interval type that contains all the fields of the two original types.

                  An interval value can be multiplied or divided by a numeric value. Again, the value is converted to a numeric, which is then multiplied or divided, before converting back to the original interval type.

                  An interval value is negated by simply prefixing with the minus sign.

                  Interval values used in expressions are either typed values, including interval literals, or are interval casts. The expression: <expression> <interval qualifier> is a cast of the result of the <expression> into the INTERVAL type specified by the <interval qualifier>. The cast can be formed by adding the keywords and parentheses as follows: CAST ( <expression> AS INTERVAL <interval qualifier> ).

                  The examples below feature different forms of expression that represent an interval value, which is then added to the given date literal.

                  DATE '2000-01-01' + INTERVAL '1-10' YEAR TO MONTH /* interval literal */
                  DATE '2000-01-01' + '1-10' YEAR TO MONTH /* the string '1-10' is cast into INTERVAL YEAR TO MONTH */
                  DATE '2000-01-01' + 22 MONTH /* the integer 22 is cast into INTERVAL MONTH, same value as above */
                  DATE '2000-01-01' - 22 DAY /* the integer 22 is cast into INTERVAL DAY */
                  DATE '2000-01-01' + COL2 /* the type of COL2 must be an INTERVAL type */
                  DATE '2000-01-01' + COL2 MONTH /* COL2 may be a number, it is cast into a MONTH interval */
                  

                  Datetime and Interval Operations

                  An interval can be added to or subtracted from a datetime value so long as they have some fields in common. For example, an INTERVAL MONTH cannot be added to a TIME value, while an INTERVAL HOUR TO SECOND can. The interval is first converted to a numeric value, then the value is added to, or subtracted from, the corresponding field of the datetime value.

                  If the result of addition or subtraction is beyond the permissible range for the field, the field value is normalised and carried over to the next significant field until all the fields are normalised. For example, adding 20 minutes to TIME '23:50:10' will result successively in '23:70:10', '24:10:10' and finally TIME '00:10:10'. Subtracting 20 minutes from the result is performed as follows: '00:-10:10', '-1:50:10', finally TIME '23:50:10'. Note that if DATE or TIMESTAMP normalisation results in the YEAR field value out of the range (1,1000), then an exception condition is raised.

                  If an interval value based on MONTH is added to, or subtracted from a DATE or TIMESTAMP value, the result may have an invalid day (30 or 31) for the given result month. In this case an exception condition is raised.

                  The result of subtraction of two datetime expressions is an interval value. The two datetime expressions must be of the same type. The type of the interval value must be specified in the expression, using only the interval field names. The two datetime expressions are enclosed in parentheses, followed by the <interval qualifier> fields. In the first example below, COL1 and COL2 are of the same datetime type, and the result is evaluated in INTERVAL YEAR TO MONTH type.

                  (COL1 – COL2) YEAR TO MONTH /* the difference between two DATE or two TIEMSTAMP values in years and months */
                  (CURRENT_DATE – COL3) DAY /* the number of days between the value of COL3 and the current date */
                  (CURRENT_DATE - DATE '2000-01-01') YEAR TO MONTH /* the number of years and months since the beginning of this century */
                  CURRENT_DATE - 2 DAY /* the date of the day before yesterday */
                  (CURRENT_TIMESTAMP - TIMESTAMP '2009-01-01 00:00:00') DAY(4) TO SECOND(2) /* days to seconds since the given date */
                  

                  The individual fields of both datetime and interval values can be extracted using the EXTRACT function. The same function can also be used to extract the time zone displacement fields of a datetime value.

                  EXTRACT ({YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | TIMEZONE_HOUR | TIMEZONE_MINUTE | DAY_OF_WEEK | WEEK_OF_YEAR } FROM {<datetime value> | <interval value>})

                  The dichotomy between interval types based on seconds, and those based on months, stems from the fact that the different calendar months have different numbers of days. For example, the expression, “nine months and nine days since an event” is not exact when the date of the event is unknown. It can represent a period of around 284 days give or take one. SQL interval values are independent of any start or end dates or times. However, when they are added to or subtracted from certain date or timestamp values, the result may be invalid and cause an exception (e.g. adding one month to January 30 results in February 30, which is invalid).

                  JDBC has an unfortunate limitation and does not include type codes for SQL INTERVAL types. Therefore, for compatibility with database tools that are limited to the JDBC type codes, HyperSQL reports these types by default as VARCHAR. You can use the URL property hsqldb.translate_dti_types=false to override the default behaviour.

                  Arrays

                  Array are a powerful feature of SQL:2008 and can help solve many common problems. Arrays should not be used as a substitute for tables.

                  HyperSQL supports arrays of values according to the SQL:2008 Standard.

                  Elements of the array are either NULL, or of the same data type. It is possible to define arrays of all supported types, including the types covered in this chapter and user defined types, except LOB types. An SQL array is one dimensional and is addressed from position 1. An empty array can also be used, which has no element.

                  Arrays can be stored in the database, as well as being used as temporary containers of values for simplifying SQL statements. They facilitate data exchange between the SQL engine and the user's application.

                  The full range of supported syntax allows array to be created, used in SELECT or other statements, combined with rows of tables and used in routine calls.

                  Array Definition

                  The type of a table column, a routine parameter, a variable, or the return value of a function can be defined as an array.

                  <array type> ::= <data type> ARRAY [ <left bracket or trigraph> <maximum cardinality> <right bracket or trigraph> ]

                  The word ARRAY is added to any valid type definition except BLOB and CLOB type definitions. If the optional <maximum cardinality> is not used, the default value is 1024. The size of the array cannot be extended beyond maximum cardinality.

                  In the example below, the table contains a column of integer arrays and a column of varchar arrays. The VARCHAR array has an explicit maximum size of 10, which means each array can have between 0 and 10 elements. The INTEGER array has the default maximum size of 1024. The scores column has a default clause with an empty array. The default clause can be defined only as DEFAULT NULL or DEFAULT ARRAY[] and does not allow arrays containing elements.

                  CREATE TABLE t (id INT PRIMARY KEY, scores INT ARRAY DEFAULT ARRAY[], names VARCHAR(20) ARRAY[10])

                  An array can be constructed from value expressions or a query expression.

                  <array value constructor by enumeration> ::= ARRAY <left bracket or trigraph> <array element list> <right bracket or trigraph>

                  <array element list> ::= <value expression> [ { <comma> <value expression> }... ]

                  <array value constructor by query> ::= ARRAY <left paren> <query expression> [ <order by clause> ] <right paren>

                  In the examples below, arrays are constructed from values, column references or variables, function calls, or query expressions.

                  ARRAY [ 1, 2, 3 ]
                  ARRAY [ 'HOT', 'COLD' ]
                  ARRAY [ var1, var2, CURRENT_DATE ]
                  ARRAY (SELECT lastname FROM namestable ORDER BY id)
                  

                  Inserting and updating a table with an ARRAY column can use array constructors, not only for updated column values, but also in equality search conditions:

                  INSERT INTO t VALUES 10, ARRAY[1,2,3], ARRAY['HOT', 'COLD']
                  UPDATE t SET names = ARRAY['LARGE', 'SMALL'] WHERE id = 12
                  UPDATE t SET names = ARRAY['LARGE', 'SMALL'] WHERE id < 12 AND scores = ARRAY[3,4]
                  

                  When using a PreparedStatement with an ARRAY parameter, an object of the type java.sql.Array must be used to set the parameter. The org.hsqldb.jdbc.JDBCArrayBasic class can be used for constructing a java.sql.Array object in the user's application. Code fragment below:

                      String sql = "UPDATE t SET names = ? WHERE id = ?";
                      PreparedStatement ps = connection.prepareStatement(sql)
                      Object[] data = new Object[]{"one", "two"};
                      // default types defined in org.hsqldb.types.Type can be used
                      org.hsqldb.types.Type type = org.hsqldb.types.Type.SQL_VARCHAR_DEFAULT;
                      JDBCArrayBasic array = new JDBCArrayBasic(data, type);
                      ps.setArray(1, array);
                      ps.setInt(2, 1000);
                      ps.executeUpdate();
                  

                  Array Reference

                  The most common operations on an array are element reference and assignment, which are used when reading or writing an element of the array. Unlike Java and many other languages, arrays are extended if an element is assigned to an index beyond the current length. This can result in gaps containing NULL elements. Array length cannot exceed the maximum cardinality.

                  Elements of all arrays, including those that are the result of function calls or other operations can be referenced for reading.

                  <array element reference> ::= <array value expression> <left bracket> <numeric value expression> <right bracket>

                  Elements of arrays that are table columns or routine variables can be referenced for writing. This is done in a SET statement, either inside an UPDATE statement, or as a separate statement in the case of routine variables, OUT and INOUT parameters.

                  <target array element specification> ::= <target array reference> <left bracket or trigraph> <simple value specification> <right bracket or trigraph>

                  <target array reference> ::= <SQL parameter reference> | <column reference>

                  Note that only simple values or variables are allowed for the array index when an assignment is performed. The examples below demonstrates how elements of the array are referenced in SELECT and an UPDATE statement.

                  SELECT scores[ranking], names[ranking] FROM t JOIN t1 on (t.id = t1.tid)
                  UPDATE t SET scores[2] = 123, names[2] = 'Reds' WHERE id = 10
                  

                  Array Operations

                  Several SQL operations and functions can be used with arrays.

                  CONCATENATION

                  Array concatenation is performed similar to string concatenation. All elements of the array on the right are appended to the array on left.

                  <array concatenation> ::= <array value expression 1> <concatenation operator> <array value expression 2>

                  <concatenation operator> ::= ||

                  FUNCTIONS

                  Four functions operate on arrays. Details are described in the Built In Functions chapter.

                  CARDINALITY <left paren> <array value expression> <right paren>

                  MAX_CARDINALITY <left paren> <array value expression> <right paren>

                  Array cardinality and max cardinality are functions that return an integer. CARDINALITY returns the element count, while MAX_CARDINALITY returns the maximum declared cardinality of an array.

                  TRIM_ARRAY <left paren> <array value expression> <comma> <numeric value expression> <right paren>

                  The TRIM_ARRAY function returns a copy of an array with the specified number of elements removed from the end of the array. The <array value expression> can be any expression that evaluates to an array.

                  ARRAY_SORT <left paren> <array value expression> <right paren>

                  The ARRAY_SORT function returns a sorted copy of an array. NULL elements appear at the beginning of the new array. This function is a HyperSQL extension and not part of the SQL Standard.

                  CAST

                  An array can be cast into an array of a different type. Each element of the array is cast into the element type of the target array type.

                  UNNEST

                  Arrays can be converted into table references with the UNNEST keyword.

                  UNNEST(<array value expression>) [ WITH ORDINALITY ]

                  The <array value expression> can be any expression that evaluates to an array. A table is returned that contains one column when WITH ORDINALITY is not used, or two columns when WITH ORDINALITY is used. The first column contains the elements of the array (including all the nulls). When the table has two columns, the second column contains the ordinal position of the element in the array. When UNNEST is used in the FROM clause of a query, it implies the LATERAL keyword, which means the array that is converted to table can belong to any table that precedes the UNNEST in the FROM clause. This is explained in the Data Access and Change chapter.

                  COMPARISON

                  Arrays can be compared for equality, but they cannot be compared for ordering or ranges. Array expressions are therefore not allowed in an ORDER BY clause, or in a comparison expression such as GREATER THAN. Two arrays are equal if they have the same length and the values at each index position are either equal or both NULL.

                  USER DEFINED FUNCTIONS and PROCEDURES

                  Array parameters, variables and return values can be specified in user defined functions and procedures, including aggregate functions. An aggregate function can return an array that contains all the scalar values that have been aggregated. These capabilities allow a wider range of applications to be covered by user defined functions and easier data exchange between the engine and the user's application.

                  Indexes and Query Speed

                  HyperSQL supports PRIMARY KEY, UNIQUE and FOREIGN KEY constraints, which can span multiple columns.

                  The engine creates indexes internally to support PRIMARY KEY, UNIQUE and FOREIGN KEY constraints: a unique index is created for each PRIMARY KEY or UNIQUE constraint; an ordinary index is created for each FOREIGN KEY constraint.

                  HyperSQL allows defining indexes on single or multiple columns. You should not create duplicate user-defined indexes on the same column sets covered by constraints. This would result in unnecessary memory and speed overheads. See the discussion in the Deployment Guide chapter for more information.

                  Indexes are crucial for adequate query speed. When range or equality conditions are used e.g. SELECT ... WHERE acol > 10 AND bcol = 0, an index should exist on one of the columns that has a condition. In this example, the bcol column is the best candidate. HyperSQL always uses the best condition and index. If there are two indexes, one on acol, and another on bcol, it will choose the index on bcol.

                  Queries always return results whether indexes exist or not, but they return much faster when an index exists. As a rule of thumb, HSQLDB is capable of internal processing of queries at over 100,000 rows per second. Any query that runs into several seconds is clearly accessing thousands of rows. The query should be checked and indexes should be added to the relevant columns of the tables if necessary. The EXPLAIN PLAN FOR <query> statement can be used to see which indexes are used to process the query.

                  When executing a DELETE or UPDATE statement, the engine needs to find the rows that are to be deleted or updated. If there is an index on one of the columns in the WHERE clause, it is often possible to start directly from the first candidate row. Otherwise all the rows of the table have to be examined.

                  Indexes are even more important in joins between multiple tables. SELECT ... FROM t1 JOIN t2 ON t1.c1 = t2.c2 is performed by taking rows of t1 one by one and finding a matching row in t2. If there is no index on t2.c2 then for each row of t1, all the rows of t2 must be checked. Whereas with an index, a matching row can be found in a fraction of the time. If the query also has a condition on t1, e.g., SELECT ... FROM t1 JOIN t2 ON t1.c1 = t2.c2 WHERE t1.c3 = 4 then an index on t1.c3 would eliminate the need for checking all the rows of t1 one by one, and will reduce query time to less than a millisecond per returned row. So if t1 and t2 each contain 10,000 rows, the query without indexes involves checking 100,000,000 row combinations. With an index on t2.c2, this is reduced to 10,000 row checks and index lookups. With the additional index on t2.c2, only about 4 rows are checked to get the first result row.

                  Note that in HSQLDB an index on multiple columns can be used internally as a non-unique index on the first column in the list. For example: CONSTRAINT name1 UNIQUE (c1, c2, c3); means there is the equivalent of CREATE INDEX name2 ON atable(c1);. So you do not need to specify an extra index if you require one on the first column of the list.

                  In HyperSQL 2.0, a multi-column index will speed up queries that contain joins or values on the first n columns of the index. You need NOT declare additional individual indexes on those columns unless you use queries that search only on a subset of the columns. For example, rows of a table that has a PRIMARY KEY or UNIQUE constraint on three columns or simply an ordinary index on those columns can be found efficiently when values for all three columns, or the first two columns, or the first column, are specified in the WHERE clause. For example, SELECT ... FROM t1 WHERE t1.c1 = 4 AND t1.c2 = 6 AND t1.c3 = 8 will use an index on t1(c1,c2,c3) if it exists.

                  A multi-column index will not speed up queries on the second or third column only. The first column must be specified in the JOIN .. ON or WHERE conditions.

                  Sometimes query speed depends on the order of the tables in the JOIN .. ON or FROM clauses. For example the second query below should be faster with large tables (provided there is an index on TB.COL3). The reason is that TB.COL3 can be evaluated very quickly if it applies to the first table (and there is an index on TB.COL3):

                      (TB is a very large table with only a few rows where TB.COL3 = 4)
                  
                      SELECT * FROM TA JOIN TB ON TA.COL1 = TB.COL2 AND TB.COL3 = 4;
                  
                      SELECT * FROM TB JOIN TA ON TA.COL1 = TB.COL2 AND TB.COL3 = 4;

                  The general rule is to put first the table that has a narrowing condition on one of its columns. In certain cases, HyperSQL 2.2.x reorders the joined tables if it is obvious that this will introduce a narrowing condition.

                  HyperSQL features automatic, on-the-fly indexes for views and subselects that are used in a query.

                  Indexes are used when a LIKE condition searches from the start of the string.

                  Indexes are used for ORDER BY clauses if the same index is used for selection and ordering of rows. It is possible to force the use of index for ORDER BY.

                  Query Processing and Optimisation

                  HyperSQL 2.2.x changes the order of tables in a query in order to optimise processing. This happens only when one of the tables has a narrowing condition and reordering does not change the result of the query.

                  Indexes and Conditions

                  HyperSQL optimises queries to use indexes, for all types of range and equality conditions, including IS NULL and NOT NULL conditions. Conditions can be in join or WHERE clauses, including all types of joins.

                  In addition, HyperSQL will use an index (if one exists) for IN conditions, whether constants, variable, or subqueries are used on the right hand side of the IN predicate. Multicolumn IN conditions can also use an index.

                  HyperSQL can always use indexes when several conditions are combined with the AND operator, choosing a conditions which can use an index. This now extended to all equality conditions on multiple columns that are part of an index.

                  HyperSQL will also use indexes when several conditions are combined with the OR operator and each condition can use an index (each condition may use a different index). For example, if a huge table has two separate columns for first name and last name, and both columns are indexed, a query such as the following example will use the indexes and complete in a short time:

                      -- TC is a very large table
                  
                      SELECT * FROM TC WHERE TC.FIRSTNAME = 'John' OR TC.LASTNAME = 'Smith' OR TC.LASTNAME = 'Williams'
                  

                  Each subquery is considered a separate SELECT statement and uses indexes when they are available.

                  In each SELECT statement, at least one index per table can be used if there is a query conditions that can use the index. When conditions on a table are combined with the OR operator, and each condition can use an index, multiple indexes per table are used.

                  Indexes and Operations

                  HyperSQL optimises simple row count queries in the form of SELECT COUNT(*) FROM <table> and returns the result immediately (this optimisation does not take place in MVCC mode).

                  HyperSQL can use an index on a column for SELECT MAX(<column>) FROM <table> and SELECT MIN(<column>) FROM <table> queries. There should be an index on the <column> and the query can have a WHERE condition on the same column. In the example below the maximum value for the TB.COL3 below 1000000 is returned.

                      SELECT MAX(TB.COL3) FROM TB WHERE TB.COL < 1000000
                  

                  HyperSQL can use an index for simple queries containing DISTINCT or GROUP BY to avoid checking all the rows of the table. Note that indexes are always used if the query has a condition, regardless of the use of DISTINCT or GROUP BY. This particular optimisation applies to cases in which all the columns in the SELECT list are from the same table and are covered by a single index, and any join or query condition uses this index.

                  For example, with the large table below, a DISTINCT or GROUP BY query to return all the last names, can use an the index on the TC.LASTNAME column. Similarly, a GROUP BY query on two columns can use an index that covers the two columns.

                      -- TC is a very large table
                  
                      SELECT DISTINCT LASTNAME FROM TC WHERE TC.LASTNAME > 'F'
                  
                      SELECT STATE, LASTNAME FROM TC GROUP BY STATE, LASTNAME
                  
                  

                  Indexes and ORDER BY, OFFSET and LIMIT

                  HyperSQL can use an index on an ORDER BY clause if all the columns in ORDER BY are in a single-column or multi-column index (in the exact order). This is important if there is a LIMIT n (or FETCH n ROWS ONLY) clause. In this situation, the use of index allows the query processor to access only the number of rows specified in the LIMIT clause, instead of building the whole result set, which can be huge. This also works for joined tables when the ORDER BY clause is on the columns of the first table in a join. Indexes are used in the same way when ORDER BY ... DESC is specified in the query. Note that unlike some other RDBMS, HyperSQL does not need or create DESC indexes. It can use any ordinary, ascending index for ORDER BY ... DESC.

                  If there is an equality or range condition (e.g. EQUALS, GREATER THAN) condition on the columns specified in the ORDER BY clause, the index is still used.

                  In the two examples below, the index on TA.COL3 is used and only up to 1000 rows are processed and returned.

                      (TA is a very large table with an index on TA.COL3
                  
                      SELECT * FROM TA JOIN TB ON TA.COL2 = TB.COL1 WHERE TA.COL3 > 40000 ORDER BY TA.COL3 LIMIT 1000;
                      SELECT * FROM TA JOIN TB ON TA.COL2 = TB.COL1 WHERE TA.COL3 > 40000 AND TA.COL3 < 100000 ORDER BY TA.COL3 DESC LIMIT 1000;
                  

                  But if the query contains an equality condition on another indexed column in the table, this may take precedence and no index may be used for ORDER BY. In this case USING INDEX can be added to the end of the query to force the use of the index for the LIMIT operation. In the example below there is an index on TA.COL1 as well as the index on TA.COL3. Normally the index on TA.COL1 is used, but the USING INDEX hint results in the index on TB.COL3 to be used for selecting the first 1000 rows.

                      (TA is a very large table with an index on TA.COL3 and a separate index on TA.COL1
                  
                      SELECT * FROM TA JOIN TB ON TA.COL2 = TB.COL1 WHERE TA.COL1 = 'SENT' AND TB.COL3 > 40000 ORDER BY TB.COL3 LIMIT 1000 USING INDEX;
                  


                  $Revision: 4864 $

                  hsqldb2.2-2.2.9.orig/hsqldb/doc/branding-frag.xhtml0000644000175000017500000000022512007570374020433 0ustar renerene
                  hsqldb2.2-2.2.9.orig/hsqldb/testrun/0000755000175000017500000000000012007557306015614 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/0000755000175000017500000000000012007570424017305 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-trimming-alt.dsv0000644000175000017500000000041312007547346023226 0ustar renerenetargettable=t} } # Following (header) line has intentional trailing whitespace.} i \ r \ d \ t \ v \ b } } # Following line has intentional trailing whitespace (and mixed case).} 31 \ 3.124 \ 2007-06-07 \ 2006-05-06 12:30:04 \ a B \ tRUe } hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/varnestee.isql0000644000175000017500000000001212007547350022166 0ustar renerene* x = eks hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/nullrep-alt.dsv0000644000175000017500000000042312007547350022263 0ustar renerenetargettable=t} } # Following (header) line has intentional trailing whitespace.} id: i : r : d : t : v : b } } # Following line has intentional trailing whitespace (and mixed case).} wspaces: %% : %% : %% : %% : %% : %% } nospaces:%%:%%:%%:%%:%%:%%} hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/comments.sql0000644000175000017500000000560012007547350021656 0ustar renerene/* * $Id: comments.sql 610 2008-12-22 15:54:18Z unsaved $ * * Tests comments. This comment itself is a multi-line comment */ /* Just to have a work table */ CREATE TABLE t(i int); /* A multi-line comment with leading + trailing white space. */ /*Repeat with text right up to edges. * * Tests comments. This comment itself is a multi-line comment*/ /*Repeat with text right up to edges. comment with leading + trailing white space. */ /* Following line contains spaces */ /* Simple hyphen-hyphen comments */ -- blah -- blah /* Empty and white space comments: */ /**/ /*****/ /*** Extra stars ***/ /*** Extra stars ***/ /**************/ ---- Extra slashes ---- Extra slashes ---------------------- /* */ /**/ /* */ /* The second of each of the following pairs have trailing white space. -- -- -- -- /* Comments trailing SQL */ INSERT INTO t VALUES (9); /* Simple SQL-embedded traditional comments */ SELECT * FROM /* A simple traditional comment */ t; * if (*? != 9) \q Hyphen-hyphen trailing SQL failed * end if SELECT * FROM /* A simple traditional comment */ t; * if (*? != 9) \q Hyphen-hyphen trailing SQL failed * end if SELECT * FROM -- A simple single-line comment t; * if (*? != 9) \q Hyphen-hyphen trailing SQL failed * end if SELECT * FROM -- Two simple single-line -- comments t; * if (*? != 9) \q Hyphen-hyphen trailing SQL failed * end if SELECT * FROM -- Two simple single-line -- comments. With leading white space t; * if (*? != 9) \q Hyphen-hyphen trailing SQL failed * end if /* Nesting different comments inside one another */ /* -- The traditional comment should still close. */ SELECT * FROM /* Something -- single-line SQL-trailing comment */ t; * if (*? != 9) \q Hyphen-hyphen trailing SQL failed * end if /* Sanity check */ * V1 = one * if (*V1 != one) \q Failed sanity check for simple variable test * end if /* Test single-line within PL command */ * V2 = alpha--some crap * if (*V2 != alpha) \q Failed single-line within PL command * end if /* Test traditional within PL command */ * V3 = gamma/*some crap*/ * if (*V3 != gamma) \q Failed traditional within PL command * end if /* Test multiple traditionals within PL command */ * V4 = de/*some crap*/l/*more*/ta * if (*V4 != delta) \q Failed multiple traditional within PL command * end if /* Test single-line within PL command */ * V5 = alpha--some crap /* with nested traditional */ there * if (*V5 != alpha) \q Failed single-line within PL w/ nesting+trailing failed * end if /* Test single-line within PL command */ * V6 = alpha--some crap /* with nested traditional */ * if (*V6 != alpha) \q Failed single-line within PL w/ nesting failed * end if /* Test single-line within PL command */ * V7 = alpha--some crap /* with nested traditional * if (*V6 != alpha) \q Failed single-line within PL w/ unclosed nesting failed * end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/logic.sql0000644000175000017500000000163112007547350021126 0ustar renerene/* * $Id: logic.sql 610 2008-12-22 15:54:18Z unsaved $ * * Logic tests */ *if (1) * T1 = true *end if *if (! *T1) \q Test of (1) failed *end if *if (0) \q Test of (0) failed *end if *if (! 1) \q Test of (! 1) failed *end if *if (! 0) * T2 = true *end if *if (! *T2) \q Test of (! 0) failed *end if *if (!1) \q Test of (!1) failed *end if *if (!0) * T3 = true *end if *if (!*T3) \q Test of (!0) failed *end if * SETVAR=3 *if (*SETVAR) * T4 = true *end if *if (! *T4) \q Test of (*SETVAR) failed *end if *if (*UNSETVAR) \q Test of (*UNSETVAR) failed *end if *if (! *SETVAR) \q Test of (! *SETVAR) failed *end if *if (! *UNSETVAR) * T5 = true *end if *if (! *T5) \q Test of (! *UNSETVAR) failed *end if *if (!*SETVAR) \q Test of (!*SETVAR) failed *end if *if (!*UNSETVAR) * T6 = true *end if *if (!*T6) \q Test of (!*UNSETVAR) failed *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/badsqlonly.nsql0000644000175000017500000000033412007547350022356 0ustar renerene/* * $Id: badsqlonly.nsql 610 2008-12-22 15:54:18Z unsaved $ * * Simplest test possible. Does absolutely nothing. */ /** Intentional SQL syntax error here */ CREATE FABLE t(i INTEGER); \p Should never reach here. hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/errhandling.sql0000644000175000017500000000127612007547350022333 0ustar renerene/* * $Id: errhandling.sql 610 2008-12-22 15:54:18Z unsaved $ * * Tests error handling inside of blocks and in subscripts. */ \c true bad; \p Made it past first ignored error. /* At root level, can even ignore fatal syntax errors */ * foreach bad * ifff * V = changethis * if (1) bad; * ifff * end nosuch * V = ok * end if * if (*V != ok) \q Seems to have aborted inside if block in Continue-on-error mode * end if * W = changethis * if (1) bad; *if (2) * ifff * end nosuch * W = ok *end if worse; * end if * if (*W != ok) \q Seems to have aborted inside nested if block in Continue-on-error mode * end if \i errhandling.isql hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/forrows.sql0000644000175000017500000000163712007547350021540 0ustar renerenecreate table t(i int, vc varchar(25)); insert into t values(1, 'one'); insert into t values(2, 'two'); insert into t values(null, 'three'); insert into t values(4, null); * RES={ * EXPECTED={ Q1 1|one 1,(one) Q1 2|two 2,(two) Q1 [null]|three ,(three) Q1 4|[null] 4,() } *forrows INT VCHAR SELECT * FROM t; * RES=*{RES} Q1 *{*ROW} * RES=*{RES} *{:INT},(*{:VCHAR}) *end forrows * RES=*{RES} } * if (*RES != *EXPECTED) \q [*{RES}] != [*{EXPECTED}] * RES={ * EXPECTED={ Q2 1|one Q2 2|two Q2 [null]|three Q2 4|[null] } *forrows SELECT * FROM t; * RES=*{RES} Q2 *{*ROW} *end forrows * RES=*{RES} } * if (*RES != *EXPECTED) \q [*{RES}] != [*{EXPECTED}] -- Test that case of 0 rows handled gracefully DELETE FROM t; *forrows INT VCHAR SELECT * FROM t; \q Executing forrow body when table is empty *end forrows *forrows SELECT * FROM t; \q Executing forrow body when table is empty *end forrows hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/altspace.targtbl.dsv0000644000175000017500000000003112007547350023251 0ustar renerenei|vc 11|eleven 12|twelve hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/plcontrolflow.sql0000644000175000017500000001040412007547350022733 0ustar renerene/* * $Id: plcontrolflow.sql 4699 2011-11-04 23:50:26Z unsaved $ * * Tests PL control flow. if, foreach statements, etc. */ *if (*UNSET) \q Failed boolean test of an unset variable *end if *if (astring) * y = something *end if *if (*X) \q Failed boolean test of a simple string constant *end if *if (0) \q Failed boolean test of zero constant *end if *if (!x) \q Failed boolean test of a plain constant *end if /* Nested if tests */ * if (1) * L1 = true * if (2) * L2 = true * end if * L11 = true * end if *if (! *L1) \q Pre-nest failure *end if *if (! *L2) \q Inside-nest failure *end if *if (! *L11) \q Post-nest failure *end if * L1 = * L2 = * L11 = * if (1) * L1 = true * if (2) * L2 = true * end if * L11 = true * end if *if (! *L1) \q Pre-nest failure *end if *if (! *L2) \q Inside-nest failure *end if *if (! *L11) \q Post-nest failure *end if /* Test deep nesting of IFs, including negatives. */ * if (1) * L1 = true * if (0) * N2 = true * end if * if (2) * L2 = true * if (3) * L3 = true * if (4) * L4 = true * if (0) * N5 = true * end if * if (5) * L5 = true * if (0) * N6 = true * end if * if (6) * L6 = true * if (0) * N7 = true * end if * end if * L51 = true * end if * end if * if (0) * N4 = true * end if * L31 = true * end if * if (0) * N3 = true * end if * end if * L11 = true * end if *if (! *L1) \q Pre-deep-nest failure 1 *end if *if (! *L2) \q Inside-deep-nest failure 2 *end if *if (! *L11) \q Post-deep-nest failure 11 *end if *if (! *L3) \q Pre-deep-nest failure 3 *end if *if (! *L4) \q Inside-deep-nest failure 4 *end if *if (! *L31) \q Post-deep-nest failure 31 *end if *if (! *L5) \q Pre-deep-nest failure 5 *end if *if (! *L6) \q Inside-deep-nest failure 6 *end if *if (! *L51) \q Post-deep-nest failure 51 *end if *if (*N2) \q Negative deep-nest failure 2 *end if *if (*N3) \q Negative deep-nest failure 3 *end if *if (*N4) \q Negative deep-nest failure 4 *end if *if (*N5) \q Negative deep-nest failure 5 *end if *if (*N6) \q Negative deep-nest failure 6 *end if *if (*N7) \q Negative deep-nest failure 7 *end if /* Nested foreach tests */ /* Initialize Results to I */ * R = I *foreach L1 (A B C) *foreach L2 (1 2 3 4) *foreach L3 (a b) * R = *{R}:*{L1}*{L2}*{L3} *end foreach *end foreach *end foreach *if (*R != I:A1a:A1b:A2a:A2b:A3a:A3b:A4a:A4b:B1a:B1b:B2a:B2b:B3a:B3b:B4a:B4b:C1a:C1b:C2a:C2b:C3a:C3b:C4a:C4b) \q nested foreach result unexpected: *{R} *end if /* Initialize Results to I */ * R = I *foreach L1 (A B C) *if (*L1 != A) *foreach L2 (1 2 3 4) *if (*L2 != 3) *foreach L3 (a b c) *if (*L3 != b) * R = *{R}:*{L1}*{L2}*{L3} *end if *end foreach *end if *end foreach *end if *end foreach *if (*R != I:B1a:B1c:B2a:B2c:B4a:B4c:C1a:C1c:C2a:C2c:C4a:C4c) \q nested conditional foreach result unexpected: *{R} *end if /* Test break and continue */ /* Initialize Results to I */ * R = I *foreach L1 (A B C) *foreach L2 (1 2 3 4) *foreach L3 (a b) *if (*L3 == a) *continue *end if * R = *{R}:*{L1}*{L2}*{L3} *end foreach *if (*L2 == 3) *break foreach *end if *end foreach *end foreach *if (*R != I:A1b:A2b:A3b:B1b:B2b:B3b:C1b:C2b:C3b) \q nested foreach result unexpected: *{R} *end if /* If something doesn't work right, could get into infinite loop below. */ * accum=L *while (1) * accum = *{accum}P * subcum = M *while (*subcum < MQQ) * subcum = *{subcum}Q *end while * accum = *{accum}*{subcum} *if (*accum == LPMQQPMQQ) *break while *end if *end while *if (*accum != LPMQQPMQQ) \q Wrong value accumulated by nested while loops (*{accum}) *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-rpcommit.dsv0000644000175000017500000000011112007547350022442 0ustar renerenetargettable=t i 1 2 3 4 5 6 7 8 9 10 11 12 13 x 15 16 17 18 19 20 21 22 hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/adv-comments.sql0000644000175000017500000000156412007547350022433 0ustar renerene/* The tests in this file don't succeed with SqlTool as it is now due to: * Improper handling of traditional-comments inside single-line comment. * Improper handling of single-line comments inside traditional comment. * Inability to recognize SQL commands on lines which don't end with ;\s*$. */ /* Repeat with text right up to edges/* /*on one*/ /*line*/ /*Same thing/* /*with leading*/ /*+ trailing white space*/ CREATE TABLE t(i int); INSERT INTO t VALUES(1); INSERT INTO t VALUES(2); SELECT * FROM t; -- single-line SQL-trailing comment * if (*? != 2) \q Hyphen-hyphen trailing SQL failed * end if SELECT * FROM t; /* traditional SQL-trailing comment */ * if (*? != 2) \q Traditional trailing SQL failed * end if SELECT * FROM t; /* Something -- single-line SQL-trailing comment */ * if (*? != 2) \q Hyphen-hyphen trailing SQL failed * end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-trimming.dsv0000644000175000017500000000040412007547350022443 0ustar renerenetargettable=t # Following (header) line has intentional trailing whitespace. i | r | d | t | v | b # Following line has intentional trailing whitespace (and mixed case). 31 | 3.124 | 2007-06-07 | 2006-05-06 12:30:04 | a B | tRUe hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/macro.inter0000644000175000017500000000126312007547350021455 0ustar renerene/* * $Id: macro.inter 610 2008-12-22 15:54:18Z unsaved $ * * Tests interactive macro commands /... * * This only tests the buffer macro commands /=:..., so that we can * manipulate the buffer. * The other macro commands don't need interactive mode. */ \c false \p hello /=greet: world /= /greet now; CREATE TABLE t(i int); INSERT INTO t VALUES(1); INSERT INTO t VALUES(2); INSERT INTO t VALUES(3); INSERT INTO t VALUES(4); INSERT INTO t VALUES(5); COMMIT; SELECT count(*) FROM t /=q: where /q i > 3; * if (*? != 2) \q Query returned *{?} rows, should have returned 2. * end if /q i > 2 :; * if (*? != 3) \q Query returned *{?} rows, should have returned 3. * end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-omits.dsv0000644000175000017500000000042412007547350021752 0ustar renerenetargettable=t # Following (header) line has intentional trailing whitespace. - | i | - | a | - | b | - | c # Following line has intentional trailing whitespace (and mixed case). 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/errhandlingn.isql0000644000175000017500000000035012007547350022652 0ustar renerene/* * $Id: errhandlingn.isql 610 2008-12-22 15:54:18Z unsaved $ * * Errors out in a nested block */ * if (1) *if (2) \q Forced error *end if worse; * end if \p Returned from bad block. Should not have. \q hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/nq-noarg1.isql0000644000175000017500000000042312007547350022003 0ustar renerene/* * $Id: nq-noarg1.isql 610 2008-12-22 15:54:18Z unsaved $ * * Simplest test of \q from nested script with no args */ \p Following statement should exit SqlTool immediately with success exit status. \q \q This causes the unit test to fail if the \q above didn't work. hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/at-chainer.sql0000644000175000017500000000032612007547350022044 0ustar renerene/* * $Id: at-chainer.sql 3714 2010-07-22 02:28:38Z unsaved $ * * This script invokes the script subdir/atuser.sql, in normal fashion, to * test that @ works when used by a sub-script. */ \i subdir/atuser.sql hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/subst.inter0000644000175000017500000000327412007547350021520 0ustar renerene/* * $Id: subst.inter 3340 2009-12-14 00:00:49Z unsaved $ * * Tests interactive commands :s*. */ \c false /* Since running interactively, need to either invoke with --abortOnErr switch, * or use "\c false" Special command, to detect failures. */ CREATE TABLE t(id INTEGER GENERATED BY DEFAULT AS IDENTITY, vc VARCHAR(80)); INSERT INTO t(vc) VALUES('one') /* In interactive mode, the blank line above will move the command to the * edit buffer without executing it. */ :s/n/MM/; /*Since this executes, command #3 in history will become "INSERT... 'oMMe'".*/ SELECT count(*) FROM t; *if (*? != 1) \q Blank lines not behaving right in Interactive mode *end if SELECT count(*) FROM t WHERE vc = 'oMMe'; *if (*? != 1) \q Simple substitution of edit buffer failed. *end if /* Tailing white space in line below, on purpose. */ :3 s@M@.@g; SELECT count(*) FROM t; *if (*? != 2) \q Recall + subst. + exec failed / 1 *end if SELECT count(*) FROM t WHERE vc = 'o..e'; *if (*? != 1) \q Recall + subst. + exec failed / 2 *end if :3 /* Purposeful trailing white space in following line */ :s:MM:x:g :; SELECT count(*) FROM t; *if (*? != 3) \q Recall + subst., then exec failed / 1 *end if SELECT count(*) FROM t WHERE vc = 'oxe'; *if (*? != 1) \q Recall + subst., then exec failed / 2 *end if :/INSERT.*MM/ :s/Me/End/; \q :/INSERT.*MM/s/(?-i)o/Begin/; SELECT count(*) FROM t; *if (*? != 5) \q Regex Recall + subst., then exec failed / 1 *end if SELECT count(*) FROM t WHERE vc = 'oMEnd'; *if (*? != 1) \q Regex Recall + subst., then exec failed / 2 *end if SELECT count(*) FROM t WHERE vc = 'Begin..e'; *if (*? != 1) \q Regex Recall + subst., then exec failed / 3 *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/macro.sql0000644000175000017500000000140612007547350021132 0ustar renerene/* * $Id: macro.sql 610 2008-12-22 15:54:18Z unsaved $ * * Tests interactive macro commands /... * * See macro.inter script also. */ \c false /=q SELECT count(*) FROM t CREATE TABLE t(i int); INSERT INTO t VALUES(1); INSERT INTO t VALUES(2); INSERT INTO t VALUES(3); INSERT INTO t VALUES(4); INSERT INTO t VALUES(5); COMMIT; /q WHERE i > 3; * if (*? != 2) \q Query returned *{?} rows, should have returned 2. * end if /* Now test with lots of intervening white space */ / = q SELECT count(*) FROM t WHERE i > *{LIMIT} / = setlim * LIMIT = * LIMIT = 4 /q; * if (*? != 1) \q Query returned *{?} rows, should have returned 1. * end if /setlim 3; /q; * if (*? != 2) \q Query returned *{?} rows, should have returned 2. * end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/j.sql0000644000175000017500000000064312007547346020271 0ustar renerene/* * $Id: j.sql 4816 2011-11-24 23:15:42Z unsaved $ * * Tests \j command */ CREATE TABLE t1(i int); INSERT INTO t1 VALUES(11); COMMIT; \j SA jdbc:hsqldb:mem:dataSource2 SET PASSWORD 'sapwd'; CREATE TABLE t2(i int); INSERT INTO t2 VALUES(22); COMMIT; \j SA jdbc:hsqldb:mem:utst SELECT * FROM t1; * if (*? != 11) \q \j failed \j SA sapwd jdbc:hsqldb:mem:dataSource2 SELECT * FROM t2; * if (*? != 22) \q \j failed hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/return.isql0000644000175000017500000000034112007547346021523 0ustar renerene/** * The return statement below should abort this script immediately without * triggering any error handling. */ * VAR=*{VAR} two * return \q return did not cause nested script ireturn.sql to return * VAR=*{VAR} three hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-rpcommit.sql0000644000175000017500000000206612007547350022460 0ustar renerene/* * $Id: dsv-rpcommit.sql 4543 2011-10-15 14:54:17Z unsaved $ * * Tests *DSV_RECORDS_PER_COMMIT setting */ /* Unfortunately, can't test how many commits are performed and where. * That would * require adding significant complexity to SqlFile itself, or * complex interception of commits. * I have, however, manually tested the commits by echoing the commits in * the source code, and removing observing what remains uncommitted after * removing the straggler-catching commit after the insertion loop in * SqlFile.importDsv(). * All that we are testing here is that all records which should be committed * do get committed. */ CREATE TABLE t (i INT); \c true * *DSV_RECORDS_PER_COMMIT=5 \m dsv-rpcommit.dsv ROLLBACK; SELECT COUNT(*) FROM t; *if (*? != 13) \q *DSV_RECORDS_PER_COMMIT committed only *{?} records instead 13 *end if DELETE FROM t; * *DSV_REJECT_REPORT = ${java.io.tmpdir}/test-rpcommit-${user.name}.dsv \m dsv-rpcommit.dsv SELECT COUNT(*) FROM t; *if (*? != 21) \q *DSV_RECORDS_PER_COMMIT committed only *{?} records instead 21 *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/for.sql0000644000175000017500000000133012007547350020613 0ustar renerene* RES= { * EXPECTED = { outerA 0 innerA 0 1 innerA 0 2 outerA 1 innerA 1 1 innerA 1 2 outerA 2 innerA 2 1 innerA 2 2 outerB 1 innerB 1 0 outerB 2 innerB 2 0 innerB 2 1 } * x = 0 * for (*x < 3) ((x += 1)) * RES = *{RES} outerA *{x} * for ((y =1)) (*y < 3) ((y += 1)) * RES = *{RES} innerA *{x} *{y} * end for * end for * for ((x =1)) (*x < 3) ((x += 1)) * RES = *{RES} outerB *{x} * for ((y = 0)) (*y < *x) ((y += 1)) * RES = *{RES} innerB *{x} *{y} * end for * end for * RES = *{RES} } * if (*RES != *EXPECTED) \q (*{RES}) != (*{EXPECTED}) * ((summer = 0)) * for ((i = 0)) (*i < 10) ((i += 1)) * ((summer += i)) * end for * if (*summer != 45) \q Summation failed. *{summer} != 45 hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-altspace.sql0000644000175000017500000000054312007547350022420 0ustar renerene/* * $Id: dsv-altspace.sql 3340 2009-12-14 00:00:49Z unsaved $ * * Tests importing to table in non-default tablespace */ CREATE SCHEMA altspace authorization dba; CREATE TABLE altspace.targtbl (i INT, vc VARCHAR(80)); \m altspace.targtbl.dsv SELECT COUNT(*) FROM altspace.targtbl; *if (*? != 2) \q Import to alternate tablespace failed *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-roundtrip.sql0000644000175000017500000000176412007547350022660 0ustar renerene/* * $Id: dsv-roundtrip.sql 610 2008-12-22 15:54:18Z unsaved $ * * Tests a DSV "round trip". * Create a table, export the data, import it back, cf. imported and original. */ * *DSV_TARGET_FILE = ${java.io.tmpdir}/test-roundtrip-${user.name}.dsv * *DSV_TARGET_TABLE = t CREATE TABLE t (i INT, a INT, d DATE); INSERT INTO t(i, a, d) VALUES (1, 149, null); INSERT INTO t(i, a, d) VALUES (2, null, '2007-06-24'); /* Export */ \x t SELECT count(*) FROM t WHERE i = 1 AND a = 149 AND d IS null; *if (*? != 1) \q Pre-check of inserted data failed (1) *end if SELECT count(*) FROM t WHERE i = 2 AND a IS NULL AND d = '2007-06-24'; *if (*? != 1) \q Pre-check of inserted data failed (2) *end if /* Import */ \m *{*DSV_TARGET_FILE} SELECT count(*) FROM t WHERE i = 1 AND a = 149 AND d IS null; *if (*? != 2) \q Post-check of imported data failed (1) *end if SELECT count(*) FROM t WHERE i = 2 AND a IS NULL AND d = '2007-06-24'; *if (*? != 2) \q Post-check of imported data failed (2) *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/nq-arg1.isql0000644000175000017500000000042212007547350021445 0ustar renerene/* * $Id: nq-arg1.isql 610 2008-12-22 15:54:18Z unsaved $ * * Simplest test of \q from nested script with args */ \q This should cause SqlTool to exit immediately with non-zero exit value. /* Following line causes the unit test to fail if the \q above didn't work. \q hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/errhandling.isql0000644000175000017500000000125212007547350022476 0ustar renerene/* * $Id: errhandling.isql 610 2008-12-22 15:54:18Z unsaved $ * * Tests error handling inside of blocks and in subscripts. */ \c true bad; \p Made it past first ignored error. /* At root level, can even ignore fatal syntax errors */ * foreach bad * ifff * V = changethis * if (1) bad; * ifff * end nosuch * V = ok * end if * if (*V != ok) \q Seems to have aborted inside if block in Continue-on-error mode * end if * W = changethis * if (1) bad; *if (2) * ifff * end nosuch * W = ok *end if worse; * end if * if (*W != ok) \q Seems to have aborted inside nested if block in Continue-on-error mode * end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/nq-noarg1.sql0000644000175000017500000000026112007547350021632 0ustar renerene/* * $Id: nq-noarg1.sql 610 2008-12-22 15:54:18Z unsaved $ * * Test of \q with arg from nested script. */ \i nq-noarg1.isql \q Should not have returned from nested script! hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/else.sql0000644000175000017500000000072612007547346020772 0ustar renerene/** * Tests else statement */ * RES={ * EXPECTED={ c c23 A c24 A c c23 B c24 B d } * if (0) \q a \q b * else * foreach x (A B) * RES=*{RES} c * if (0) \q c1 * if (0) \q c21 *{x} \q c22 *{x} * else * RES=*{RES} c23 *{x} * RES=*{RES} c24 *{x} * end if * end foreach * RES=*{RES} d * end if * RES=*{RES} } * if (*RES != *EXPECTED) \q (*{RES}) vs. (*{EXPECTED}) hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/build.gradle0000644000175000017500000000100012007547346021562 0ustar renerenedefaultTasks 'runTests' task runTests << { def params = ['NO_JVM_EXIT'] boolean verbose = project.hasProperty('verbose') && project.property('verbose') if (verbose) params << '-v' if (project.hasProperty('norun') && project.property('norun')) params << '-n' if (project.hasProperty('scripts')) params.addAll(project.property('scripts').split(',')) if (!verbose) System.console().writer().print(' ') run(new File('runtests.groovy'), params as String[]) } hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/goodsqlonly.sql0000644000175000017500000000020312007547350022375 0ustar renerene/* * $Id: goodsqlonly.sql 610 2008-12-22 15:54:18Z unsaved $ * * Just runs some successful SQL. */ CREATE TABLE t(i INTEGER); hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/nullempty.sql0000644000175000017500000000226012007547350022061 0ustar renerene/* * $Id: nullempty.sql 4649 2011-10-27 18:34:34Z unsaved $ * * This test written verbosely to make it easier to partially share it with * script sample/nullempty.sql. * This tests differences between null and empty strings, * and ? var vs. _/~ variables. */ \p At startup ? is equal to empty string. See between A and B: A*{?}B * if (A*{?}B != AB) \q ? is not the empty string: *{?} * end if CREATE TABLE t(i INTEGER, vc VARCHAR(20)); INSERT INTO t VALUES(1, 'one'); INSERT INTO t VALUES(2, 'two'); * res ~ SELECT * FROM t; * if (*? != two) \q ? did not get last cell value * end if * if (*res != 1) \q res did not get first cell value * end if INSERT INTO t VALUES (3, null); *res ~ SELECT vc FROM t WHERE i = 3; * if (*res != **NULL) \q res did not get assigned the SQL Null * end if * if (*? != [null]) \q ? did not get assigned the *NULL_REP_TOKEN: *{?} * end if -- This will prevent SqlTool from aborting when we run a bad SQL statement: \c true *res ~ SELECT hocus FROM pocus; * if (*? != **NULL) \q ? did not get assigned null upon SQL failure: *{?} * end if * if (*res != **NULL) \q res did not get assigned null upon SQL failure: *{res} * end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/runtests.bash0000755000175000017500000000445412007547350022047 0ustar renerene#!/bin/bash -p PROGNAME="${0##*/}" # $Id: runtests.bash 4697 2011-11-04 13:32:05Z unsaved $ # Distribution is permitted under the terms of the HSQLDB license. # (c) 2011 The HSQL Development Group # # Wrapper that serves two purposes: # (1) Takes traditional parameters in format: command -switches... filenames... # and converts to a Gradle command of format: Gradle -P x=y... taskname # (2) Invokes the 'gradlew' wrapper script supplied by the HyperSQL # distribution. # This script automatically 'cd's to directory .../testrun/sqltool in which # it resides, so that it may be safely executed from desktop managers, etc. # The main work script, "runtests.groovy" does not have this limitation. # # author: Blaine Simpson, unsaved@users.sourceforge.net # since: HSQLDB 1.8.0.8 / 1.9.x # see: README.txt in this same directory. # In November 2011 this script converted from the sole test runner script, to # one wrapper for Gradle (w/ "build.gradle") + runtests.groovy. set +u shopt -s xpg_echo # This will fail for very old implementations of Bash SYNTAX_MSG="$PROGNAME [-nvh] [testscript.sql...] With -v, output from SqlTool will be shown. Otherwise, only tests and results will be shown. If no script names are supplied, *.sql and *.nsql from the current directory will be executed. Exit value is number of test failures, or 1 for other errors or if number of test failures exceeds 255 (shell scripts can't handle exit values > 255). Non-verbose Result Key: T = Testing + = test Succeeded - = test Failed" while [ $# -gt 0 ]; do case "$1" in -*) case "$1" in *v*) VERBOSE=1;; esac case "$1" in *n*) NORUN=1;; esac case "$1" in *h*) echo "$SYNTAX_MSG" exit 0 ;; esac shift;; *) break 2;; esac; done case "$0" in /*) SCRIPTDIR="${0%/*}";; */*) SCRIPTDIR="$PWD/${0%/*}";; *) SCRIPTDIR="$PWD";; esac case "$SCRIPTDIR" in *?/.) SCRIPTDIR="${SCRIPTDIR%/.}"; esac cd "$SCRIPTDIR" scriptsString= while [ $# -gt 0 ]; do scriptsString="$scriptsString$1" shift [ $# -gt 0 ] && scriptsString="$scriptsString," done [ -n "$VERBOSE" ] && echo ../../build/gradlew ${VERBOSE:+-Pverbose=true} ${NORUN:+-Pnorun=true} ${scriptsString:+-Pscripts=$scriptsString} exec ../../build/gradlew ${VERBOSE:+-Pverbose=true} ${NORUN:+-Pnorun=true} ${scriptsString:+-Pscripts=$scriptsString} hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/nestingschema.sql0000644000175000017500000000140712007547350022662 0ustar renerene/* * $Id: nestingschema.sql 437 2008-11-14 04:17:35Z unsaved $ * * Tests a schema creation statement that nests some objects. */ /** * Besides testing nesting of commands without ; delimiters, this also * regression tests that the CREATE SCHEMA... command itself does not require * the closing ; to be sent to the DB engine. */ CREATE SCHEMA FELIX AUTHORIZATION DBA CREATE TABLE FELIXT1 (AV1 VARCHAR(10), BV VARCHAR(10)) CREATE TABLE FELIXT2 (AV2 VARCHAR(10), BI INTEGER) CREATE SEQUENCE FELIXS1 CREATE VIEW FELIXV1 AS SELECT * FROM FELIXT1 JOIN FELIXT2 ON AV1 = AV2 CREATE VIEW FELIXV2 AS SELECT AV1 AS C1, NEXT VALUE FOR FELIXS1 AS C2 FROM FELIXT1; SELECT count(*) FROM felix.felixv2; *if (*? != 0) \q Nesting CREATE SCHEMA failed *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/nullrep.dsv0000644000175000017500000000047312007547350021512 0ustar renerenetargettable=t # Following (header) line has intentional trailing whitespace. id| i | r | d | t | v | b # Following line has intentional trailing whitespace (and mixed case). wspaces| [null] | [null] | [null] | [null] | [null] | [null] nospaces|[null]|[null]|[null]|[null]|[null]|[null] hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-multiline.sql0000644000175000017500000000207712007547346022637 0ustar renerene/* * $Id: dsv-multiline.sql 4497 2011-10-09 18:43:39Z unsaved $ * * Does a DSV export using a multi-line custom query instead of just * specifying the table name. * Imports it back to validate the output. */ * *DSV_TARGET_FILE = ${java.io.tmpdir}/test-roundtrip-${user.name}.dsv * *DSV_TARGET_TABLE = t CREATE TABLE t (i INT, a INT, d DATE); INSERT INTO t(i, a, d) VALUES (1, 149, null); INSERT INTO t(i, a, d) VALUES (2, null, '2007-06-24'); \. SELECT * FROM t . /* Export */ \x : WHERE i = 1 SELECT count(*) FROM t WHERE i = 1 AND a = 149 AND d IS null; *if (*? != 1) \q Pre-check of inserted data failed (1) *end if SELECT count(*) FROM t WHERE i = 2 AND a IS NULL AND d = '2007-06-24'; *if (*? != 1) \q Pre-check of inserted data failed (2) *end if /* Import */ \m *{*DSV_TARGET_FILE} SELECT count(*) FROM t WHERE i = 1 AND a = 149 AND d IS null; *if (*? != 2) \q Post-check of imported data failed (1) *end if SELECT count(*) FROM t WHERE i = 2 AND a IS NULL AND d = '2007-06-24'; *if (*? != 1) \q Post-check of imported data failed (2) *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/inlineif.sql0000644000175000017500000000712412007547350021631 0ustar renerene/* * $Id: inlineif.sql 4706 2011-11-05 01:21:45Z unsaved $ * * Tests PL control flow. if, foreach statements, etc. */ *if (*UNSET) \q Failed boolean test of an unset variable *if (astring) * y = something *if (*X) \q Failed boolean test of a simple string constant *if (0) \q Failed boolean test of zero constant *if (!x) \q Failed boolean test of a plain constant /* Nested if tests */ * if (1) * L1 = true * if (2) * L2 = true * L11 = true * end if *if (! *L1) \q Pre-nest failure *if (! *L2) \q Inside-nest failure *if (! *L11) \q Post-nest failure * L1 = * L2 = * L11 = * if (1) * L1 = true * if (2) * L2 = true * L11 = true * end if *if (! *L1) \q Pre-nest failure *if (! *L2) \q Inside-nest failure *if (! *L11) \q Post-nest failure /* Test deep nesting of IFs, including negatives. */ * if (1) * L1 = true * if (0) * N2 = true * if (2) * L2 = true * if (3) * L3 = true * if (4) * L4 = true * if (0) * N5 = true * if (5) * L5 = true * if (0) * N6 = true * if (6) * L6 = true * if (0) * N7 = true * end if * L51 = true * end if * end if * if (0) * N4 = true * L31 = true * end if * if (0) * N3 = true * end if * L11 = true * end if *if (! *L1) \q Pre-deep-nest failure 1 *if (! *L2) \q Inside-deep-nest failure 2 *if (! *L11) \q Post-deep-nest failure 11 *if (! *L3) \q Pre-deep-nest failure 3 *if (! *L4) \q Inside-deep-nest failure 4 *if (! *L31) \q Post-deep-nest failure 31 *if (! *L5) \q Pre-deep-nest failure 5 *if (! *L6) \q Inside-deep-nest failure 6 *if (! *L51) \q Post-deep-nest failure 51 *if (*N2) \q Negative deep-nest failure 2 *if (*N3) \q Negative deep-nest failure 3 *if (*N4) \q Negative deep-nest failure 4 *if (*N5) \q Negative deep-nest failure 5 *if (*N6) \q Negative deep-nest failure 6 *if (*N7) \q Negative deep-nest failure 7 /* Nested foreach tests */ /* Initialize Results to I */ * R = I *foreach L1 (A B C) *foreach L2 (1 2 3 4) *foreach L3 (a b) * R = *{R}:*{L1}*{L2}*{L3} *end foreach *end foreach *end foreach *if (*R != I:A1a:A1b:A2a:A2b:A3a:A3b:A4a:A4b:B1a:B1b:B2a:B2b:B3a:B3b:B4a:B4b:C1a:C1b:C2a:C2b:C3a:C3b:C4a:C4b) \q nested foreach result unexpected: *{R} /* Initialize Results to I */ * R = I \p before R=(*{R}) *foreach L1 (A B C) \p BEFORE R=(*{R}) *if (*L1 != A) \p bEFORE R=(*{R}) *foreach L2 (1 2 3 4) *if (*L2 != 3) *foreach L3 (a b c) *if (*L3 != b) * R = *{R}:*{L1}*{L2}*{L3} *end foreach *end if *end foreach *end if *end foreach *if (*R != I:B1a:B1c:B2a:B2c:B4a:B4c:C1a:C1c:C2a:C2c:C4a:C4c) \q nested conditional foreach result unexpected: *{R} /* Test break and continue */ /* Initialize Results to I */ * R = I *foreach L1 (A B C) *foreach L2 (1 2 3 4) *foreach L3 (a b) *if (*L3 == a) *continue * R = *{R}:*{L1}*{L2}*{L3} *end foreach *if (*L2 == 3) *break foreach *end foreach *end foreach *if (*R != I:A1b:A2b:A3b:B1b:B2b:B3b:C1b:C2b:C3b) \q nested foreach result unexpected: *{R} /* If something doesn't work right, could get into infinite loop below. */ * accum=L *while (1) * accum = *{accum}P * subcum = M *while (*subcum < MQQ) * subcum = *{subcum}Q *end while * accum = *{accum}*{subcum} *if (*accum == LPMQQPMQQ) *break while *end while *if (*accum != LPMQQPMQQ) \q Wrong value accumulated by nested while loops (*{accum}) hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/logical-ops.sql0000644000175000017500000000133012007547350022236 0ustar renerene/* * $Id: logical-ops.sql 4809 2011-11-20 21:12:35Z unsaved $ * * Test logical operations. */ * three = 3 * four = 4 *if (3 != 3) \q 3 != 3 *end if *if (3 == 4) \q 3 == 4 *end if *if (3 > 4) \q 3 > 4 *end if *if (!4 > 3) \q !4 > 3 *end if *if (3 >= 4) \q 3 >= 4 *end if *if (4 =< 3) \q 4 =< 3 *end if *if (*unset1 != *unset2) \q *unset1 != *unset2 *end if *if (3 == three) \q 3 == three *end if *if (3 == four) \q 3 == four *end if * blankVar1 = * blankVar2 = *if (*blankVar1 != *blankVar2) \q *blankVar1 != *blankVar2 *end if *if (*blankVar1 == *unset1) \q *blankVar1 == *unset1 *end if *if (*{blankVar1} != *{blankVar2}) \q *{blankVar1} != *{blankVar2} *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/README.txt0000644000175000017500000001636612007547350021021 0ustar renerene$Id: README.txt 4713 2011-11-06 23:41:51Z unsaved $ SqlTool Unit Tests since: HSQLDB 1.8.0.8 author: Blaine Simpson (unsaved@users.sourceforge.net) ************************************************************ Sun Jan 18 21:52:58 EST 2009 The dsv-constcols.sql and dsv-trimming.sql unit tests are failing now, due to known issues with the inability to apply DST (Daylight Savings Time) offsets to JDBC DATE objects. ************************************************************ HOW TO RUN Typical usage (executes all tests). From UNIX: cd .../testrun/sqltool ./runtests.bash or from Windows: cd .../testrun/sqltool runtests Run tests on any subset of SQL files: cd .../testrun/sqltool .../testrun/sqltool/runtests.bash file1.sql file2.nsql... or cd .../testrun/sqltool .../testrun/sqltool/runtests file1.sql file2.nsql... If you have Grooy installed, you can run tests on SQL files that reside anywhere: groovy .../testrun/sqltool/runtests.groovy file1.sql file2.nsql... If there are any test failures, the failed SQL scripts will be listed at the end of the results. To get details about the failure, re-run the same command with just one of the failed SQL scripts at a time, and with the Verbose option, like ./runtests.bash -v failedscript.sql or runtests -v failedscript.sql or groovy .../testrun/sqltool/runtests.groovy -v failedscript.sql To see all available invocation methods: ./runtests.bash -h or runtests -h FILE NAMING AND ASCII/BINARY CONVENTIONS You can name SQL scripts anything that you want, except that the filename suffixes ".nsql" and ".inter" are reserved for negative and interactive SQL scripts, correspondingly (see the next section about that). If you plan to run runtests.bash with no filename arguments, it will execute all *.sql, *.nsql, an d*.inter scripts in the current directory. So, if you plan to run runtests.bash this way, you must take care to name only scripts **which you want executed at the top level** with extensions sql, nsql, inter. By "at the top level", I mean that if you are nesting SQL scripts with the \i command, you can't name the nested script with suffix .sql, .nsql, or .inter or the script will accidentally be executed directly when you run runtests.bash without script arguments. It's a simple concept, but, as you can see, it's a little difficult to explain, so here's an example. You have a script name "top.sql" which contains \i nested.sql You can run "./runtests.bash top.sql" and everything will work fine-- runtests.bash will execute "top.sql" which will nest "nested.sql". But if you run just "./runtests.bash", runtests.bash will run "top.bash", which will nest "nested.bash" just like before, but runtests.bash will also execute "nested.bash" directly, since it executes all files with extensions sql and nsql (and inter). Just use any filename suffix other than .sql, .nsql, and .inter for your nested SQL scripts and everything will work fine. If you are a HSQLDB developer and will be committing test scripts, then please use the following filename and type conventions: purpose suffix filetype -------------------- ------ ---------------------------- top-level SQL script .sql ASCII (mime-type text/plain) top-level neg. SQL .nsql ASCII (mime-type text/plain) interactive SQL script .inter ASCII (mime-type text/plain) nested \i SQL script* .isql ASCII (mime-type text/plain)* delimiter-sep-values* .dsv Binary (no mime-type)* * If you run any 'runtests' command without specifying any script files, all of the *.sql, *.nsql, and *.inter scripts will be executed directly. Any other files, including *.isql and *.dsv, will only be used if pulled in from the directly executed scripts. Therefore, if you add a script named say 'alpha.isql' or 'beta.custom', they will not be used unless you specify the filename to your 'testrun' command explicitly, or if you reference them from a file that is executed directly. If you will be adding new files to HSQLDB, please configure these extensions in for CVS or Subversion client accordingly. FINE POINT JUSTIFYING Binary TYPE FOR DSV FILES (Only read if you give a damned). The reason we're storing DSV files as binaries is because if CVS or Subversion saved them as ASCII, the line delimiters would be determined by the platform performing the check-out, and imports would fail if the computer executing nested.bash happened to be of different EOL type from the computer that checked out. (This would be the case any time that somebody built a distributable of any type which includes the .dsv files). NEGATIVE TESTS runtests.bash determines if a test script succeeds by checking if the exit status of SqlTool is zero. But we also need to test that scripts fail out when they should. I.e., we need to verify that if \c (continue-on-error) is false, and there is a syntax error, or a runtime SQL failure, that SqlTool exits with non-zero exit status, as it should. For this, I have invented the convention that SQL scripts named with suffix ".nsql" are just like normal SQL files, except that they are expected to fail. Here's an example to confirm that you understand. ./runtests.bash 1.sql 2.sql 3.nsql 4.nsql 5.sql or runtests 1.sql 2.sql 3.nsql 4.nsql 5.sql (on Windows) This test run will report test failures for 1.sql, 2.sql, and 5.sql only if SqlTool fails when executing them. It will report test failures for 3.nsql and 4.nsql only if SqlTool succeeds when executing them. I.e., runtests.bash _expects_ SqlTool to fail when executing *.nsql files. Negative test scripts should be small and should fail out as early as possible. The reason for this is that if there is an accidental error before the point of your test, the script will fail out early providing a false negative SqlTool exit code, thereby silently missing your test completely. INTERACTIVE TESTS Interactive test are invoked like java... SqlTool... mem < scriptname.inter in order to test interactive ":" commands. The : commands are disabled if an SQL script path(s) is given directly as an SqlTool parameter. I.e., SqlTool runs non-interactively if an SQL script path is given as a pareter; therefore, to test interactive commands, we invoke SqlTool without a script name, and instead pipe the script into SqlTool as stdin. (Using script name of "-" would do the reverse, it would run in interactive mode even though getting input from stdin). Remember to put "\c false" at the top of your interacive scripts, or errors will be ignored. Account for this command when counting command numbers in the command history. hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/sqlpsm.sql0000644000175000017500000000114512007547350021350 0ustar renerene/* * $Id: sqlpsm.sql 631 2008-12-23 03:35:47Z unsaved $ * * Tests SQL/JRT */ create table customers( id INTEGER default 0, firstname VARCHAR(50), lastname VARCHAR(50), entrytime TIMESTAMP); create procedure new_customer(firstname varchar(50), lastname varchar(50)) modifies sql data insert into customers values ( default, firstname, lastname, current_timestamp) .; SELECT count(*) FROM customers; *if (*? != 0) \q SQL/PSM preparation failed *end if CALL new_customer('blaine', 'simpson'); SELECT count(*) FROM customers; *if (*? != 1) \q SQL/PSM procedure failed *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/errhandling.nsql0000644000175000017500000000044412007547350022505 0ustar renerene/* * $Id: errhandling.nsql 610 2008-12-22 15:54:18Z unsaved $ * * Negative tests error handling inside of blocks and in subscripts. */ * if (1) *if (2) \i errhandlingn.isql *end if worse; * end if \p Returned from bad script errhandlingn.isql. Should not have. \q hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/return.sql0000644000175000017500000000056712007547350021357 0ustar renerene/* * $Id: return.sql 4717 2011-11-07 00:28:07Z unsaved $ * * Tests the new "return" statement, which is equivalent to a "break" statement * with no parameter. */ * VAR=one \i return.isql * VAR=*{VAR} three * EXPECTED = one two three * if (*VAR != *EXPECTED) \q return statement failed: (*{VAR}) vs. (*{EXPECTED}) * return \q return.sql ran past the return statement hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-rejects.dsv0000644000175000017500000000066412007547346022271 0ustar renerenetargettable=t i | r | d | t | v | b 31 | 3.124 | 2007-06-07 | 2006-05-06 12:30:04 | a B | true 42 | 1.5 | 2007-07-08 | 2006-05-07 10:20 | a string | false # Letter in int field: 5 | a | 2007-07-08 | 2006-05-07 10:20 | a string | false # No seconds in time field 42 | 1.5 | 2007-07-08 | 2006-05-07 10:20 | a string | false 42 | 1.5 | 2007-07-08 | 2006-05-07 10:20:0 | a string | false hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/buffer-vars.sql0000644000175000017500000000254712007547350022262 0ustar renerene/* * $Id: buffer-vars.sql 4683 2011-11-03 04:25:26Z unsaved $ */ CREATE TABLE t (i INT, a INT, d DATE); INSERT INTO t(i, a, d) VALUES (1, 149, null); -- 1-liner sanity check: * qpart1 = i FROM SELECT *{qpart1} t; * if (*? != 1) \q 1-line query with internal PL variable failed * end if -- Multi-line PL var: \. a FROM . * qpart2 : SELECT *{qpart2} t; * if (*? != 149) \q 1-line query with multi-line internal PL variable failed * end if * res1 ~ SELECT *{qpart2} t; * if (*res1 != 149) \q multi-line query with multi-line internal PL variable failed * end if -- Multi-line Macro: \. SELECT a . /= m1 : FROM * res2 ~ /m1 t; * if (*res2 != 149) \q Legacy multi-line query with multi-line internal PL variable failed * end if -- Newer syntax of same: \. SELECT a . -- Note the critical 2 spaces before FROM to delimite it from preceding token: /: m1 FROM * res3 ~ /m1 t; * if (*res3 != 149) \q multi-line query with multi-line internal PL variable failed. Ws by appendage. * end if -- With separating white space in in middle appendage \. a FROM . * qpart3 : SELECT *{qpart3}t; * if (*? != 149) \q White space inserted with middle appendage * end if -- With separating white space in the base \. a FROM . * qpart3 : SELECT *{qpart3}t; * if (*? != 149) \q White space inserted with middle appendage * end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-rejects.sql0000644000175000017500000000062612007547346022272 0ustar renerene/* * $Id: dsv-rejects.sql 3340 2009-12-14 00:00:49Z unsaved $ * * Tests proper rejection of bad DSV input records */ CREATE TABLE t (i INT, r REAL, d DATE, t TIMESTAMP, v VARCHAR(80), b BOOLEAN); * *DSV_REJECT_REPORT = ${java.io.tmpdir}/sqltoolutst-${user.name}.html \m dsv-rejects.dsv SELECT COUNT(*) FROM t; *if (*? != 2) \q Should have imported 2 good DSV records, but imported *{?} *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-omits.sql0000644000175000017500000000175312007547350021763 0ustar renerene/* * $Id: dsv-omits.sql$ * * Tests omitting columns via header line and *DSV_SKIP_COLS */ CREATE TABLE t (i INT, a INT, b INT, c INT); \m dsv-omits.dsv SELECT COUNT(*) FROM t WHERE i IS NOT null AND a IS NOT null AND b IS NOT null AND c IS NOT null; *if (*? != 2) \q Import using header line - column-skips failed *end if /** Repeat test with some non-default DSV settings */ * *DSV_SKIP_COLS = c| a DELETE FROM t; \m dsv-omits.dsv SELECT COUNT(*) FROM t WHERE i IS NOT null AND b IS NOT null AND a IS null AND c IS null; *if (*? != 2) \q Import using header line - AND *DSV_SKIP_COLS column-skips failed *end if /* Now test that behavior reverts when PL variable is cleared */ * *DSV_SKIP_COLS = * listvalues DELETE FROM t; \m dsv-omits.dsv SELECT COUNT(*) FROM t WHERE i IS NOT null AND a IS NOT null AND b IS NOT null AND c IS NOT null; \p Post everything *if (*? != 2) SELECT * FROM t; \q *DSV_SKIP_COLS behavior failed to revert when variable was cleared *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/varswithspaces.sql0000644000175000017500000000053712007547350023103 0ustar renerene/** * Logical expressions where elements contain spaces. */ * str1 = one two * expected = one two * wrong1 = one two * wrong2 = one * wrong3 = two *if (*str1 == *wrong1) \q 'one two' == 'one two' *if (*str1 == *wrong2) \q 'one two' == 'one' *if (*str1 == *wrong3) \q 'one two' == 'two' *if (*str1 != *expected) \q (*{str1}) vs. (*{expected}) hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/sqlarray.sql0000644000175000017500000000104212007547350021663 0ustar renerene/* * $Id: sqlarray.sql 3615 2010-06-02 11:17:43Z unsaved $ * * Tests basic usage of SQL Arrays */ CREATE TABLE a (i BIGINT PRIMARY KEY, ar INTEGER ARRAY); INSERT INTO a VALUES (1, array [11, null, 13]); INSERT INTO a VALUES (2, null); INSERT INTO a VALUES (3, array [21, 22]); * ROWCOUNT _ SELECT count(*) FROM a; * if (*ROWCOUNT != 3) \q Failed to insert 3 rows with SQL Values * end if * ROWCOUNT _ SELECT count(*) FROM a WHERE i = 1 AND ar[3] = 13; * if (*ROWCOUNT != 1) \q Failed to read imported SQL Array Element * end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/nullrep.sql0000644000175000017500000000556612007547350021525 0ustar renerene/* * $Id: nullrep.sql 3340 2009-12-14 00:00:49Z unsaved $ * * Tests enforcement of null-representation token */ CREATE TABLE t (i INT, vc VARCHAR(80)); INSERT INTO t VALUES(1, 'one'); /** For INPUT, the NULLREP is only used for DSV imports, since unquoted * null works perfectly for other forms of input. * Therefore, following should enter "[null]" literally. */ INSERT INTO t VALUES(2, '[null]'); INSERT INTO t VALUES(3, null); * COUNT _ SELECT count(*) FROM t WHERE i = 2 AND vc IS NULL; * if (*COUNT != 0) \q Seems that non-DSV insertion of '[null]' inserted a real NULL * end if * COUNT _ SELECT count(*) FROM t WHERE i = 3 AND vc IS null; * if (*COUNT != 1) \q Seems that non-DSV insertion of plain null did not insert a SQL NULL * end if DROP TABLE t; /* Now test nullrep tokens with DSV imports */ CREATE TABLE t ( id VARCHAR(80) PRIMARY KEY, i INTEGER, r REAL, d DATE, t TIMESTAMP, v VARCHAR(80), b BOOLEAN ); \m nullrep.dsv SELECT count(*) FROM t WHERE id = 'wspaces' AND i IS null; *if (*? != 1) \q Insertion of INTEGER space-embedded null-rep-token failed *end if SELECT count(*) FROM t WHERE id = 'wspaces' AND r IS null; *if (*? != 1) \q Insertion of REAL space-embedded null-rep-token failed *end if SELECT count(*) FROM t WHERE id = 'wspaces' AND d IS null; *if (*? != 1) \q Insertion of DATE space-embedded null-rep-token failed *end if SELECT count(*) FROM t WHERE id = 'wspaces' AND t IS null; *if (*? != 1) \q Insertion of TIMESTAMP space-embedded null-rep-token failed *end if SELECT count(*) FROM t WHERE id = 'wspaces' AND v = ' [null] '; *if (*? != 1) \q Insertion of VARCHAR w/ space-embedded null-rep-token failed *end if SELECT count(*) FROM t WHERE id = 'wspaces' AND b IS null; *if (*? != 1) \q Insertion of BOOLEAN space-embedded null-rep-token failed *end if DELETE FROM t; /** Repeat test with some non-default DSV settings */ * *NULL_REP_TOKEN = %% * *DSV_COL_SPLITTER = : * *DSV_ROW_SPLITTER = \}(?:\r\n|\r|\n) \m nullrep-alt.dsv SELECT count(*) FROM t WHERE id = 'wspaces' AND i IS null; *if (*? != 1) \q Insertion of INTEGER space-embedded null-rep-token failed *end if SELECT count(*) FROM t WHERE id = 'wspaces' AND r IS null; *if (*? != 1) \q Insertion of REAL space-embedded null-rep-token failed *end if SELECT count(*) FROM t WHERE id = 'wspaces' AND d IS null; *if (*? != 1) \q Insertion of DATE space-embedded null-rep-token failed *end if SELECT count(*) FROM t WHERE id = 'wspaces' AND t IS null; *if (*? != 1) \q Insertion of TIMESTAMP space-embedded null-rep-token failed *end if SELECT count(*) FROM t WHERE id = 'wspaces' AND v = ' %% '; *if (*? != 1) \q Insertion of VARCHAR w/ space-embedded null-rep-token failed *end if SELECT count(*) FROM t WHERE id = 'wspaces' AND b IS null; *if (*? != 1) \q Insertion of BOOLEAN space-embedded null-rep-token failed *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/varnester.sql0000644000175000017500000000062312007547350022042 0ustar renerene/* * $Id: varnester.sql 4428 2011-10-01 01:04:34Z unsaved $ * * Invokes another script that defines variables. * Then we test that we have access to the variables. */ /* Want to test with no user variables set like this, but unfortunately the test script invoker always sets one user variable: \p *{testvar} -- Should not expand the variable but should not abort */ \i varnestee.isql \p *{x} hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/unseteval.nsql0000644000175000017500000000034412007547350022215 0ustar renerene/* * $Id: unseteval.nsql 4432 2011-10-01 04:07:19Z unsaved $ * * Invokes another script that defines variables. * Then we test that we have access to the variables. */ *if (*{unset} == 3) \p Should not succeed *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/runtests.groovy0000755000175000017500000001513412007547350022454 0ustar renerene#!/local/groovy/bin/groovy /* * $Id: runtests.groovy 4809 2011-11-20 21:12:35Z unsaved $ * Distribution is permitted under the terms of the HSQLDB license. * (c) 2011 The HSQL Development Group */ /** * The I/O in this class could be simplified it were not necessary to support * Gradle. * Gradle intercedes with stdout (and stderr), requiring the flushes and usage * of System.console(). The latter makes this script require Java 6 or later. * * @author: Blaine Simpson, unsaved@users.sourceforge.net * @since HyperSQL 2.2.6 */ import java.util.logging.Logger class SqlToolTester { private static Logger logger = Logger.getLogger(SqlToolTester.class.name) private static boolean doJvmExit = true private static String helpMessage = '''groovy runtests.groovy [-h] [-nv] [testscript.sql...] -h displays this message. With -v, output from SqlTool will be shown. Otherwise, only tests and results will be shown. With -n, SqlTool will not actually be invoked. If no script names are supplied, *.sql and *.nsql from the current directory will be executed. Exit value is number of test failures, or 1 for other errors or if number of test failures exceeds 255 (shell scripts can't handle exit values > 255). Non-verbose Result Key: T = Testing + = test Succeeded - = test Failed''' public static void runTests(def params) { boolean noRun, verbose while (params.size() > 0 && params[0].length() > 0 && params[0].charAt(0) == '-') { if (params[0].indexOf('n') > 0) noRun = true if (params[0].indexOf('v') > 0) verbose = true if (params[0].indexOf('h') > 0) { println helpMessage return } params.remove(0) } File javaBinDir = new File(System.properties['java.home'], 'bin') assert ([javaBinDir.absolutePath + System.properties['file.separator'] + 'java', '-version'].execute().waitFor() == 0) : "Executable Java not found under Java home '$javaBinDir.absolutePath'" String sqlToolPath = '../../lib/sqltool.jar' File sqlToolFile = new File(sqlToolPath) String sqlToolClassName = 'org.hsqldb.cmdline.SqlTool' boolean useJar = true if (!sqlToolFile.canRead()) { try { Class.forName(sqlToolClassName) } catch (Exception e) { throw new IOException("SqlTool is available neither at '$sqlToolPath' nor via CLASSPATH") } useJar = false logger.warning("SqlTool jar file not available at '$sqlToolPath', therefore using it from CLASSPATH") } else if (!sqlToolFile.isFile()) throw new IOException("Not a read file: $sqlToolFile.absolutePath") def pbParams = [ 'java', '-ea', // either '-jar path.jar' or 'class.Name' will be inserted here '--noAutoFile', '-Ptestvar=plval', '--inlineRc=user=sa,url=jdbc:hsqldb:mem:utst,password=,transiso=TRANSACTION_READ_COMMITTED', null // Sometimes we'll specify script, sometimes not ] if (useJar) { pbParams.add(2, sqlToolPath) pbParams.add(2, '-jar') } else { pbParams.add(2, sqlToolClassName) } def scripts = [] if (params.size() > 0) { for (p in params) scripts << new File(p) } else { AntBuilder ant = new AntBuilder() for (suffix in ['.sql', '.nsql', '.inter']) for (f in (ant.fileScanner { fileset(dir: '.') { include(name: "*$suffix") } })) scripts << f } if (scripts.size() < 1) throw new IllegalStateException( 'No *.sql, *.ndsql, or *.inter scripts in current directory') for (f in scripts) { //println f.name if (!f.canRead()) throw new IOException("Can't read file: $f.absolutePath") if (!f.isFile()) throw new IOException("Not a read file: $f.absolutePath") } println scripts.size() + ' test(s) to run...' boolean isInter def runParams boolean succeeded def failedScriptNames = [] PrintWriter cPrinter = System.console().writer() StringWriter sWriter StringWriter eWriter for (f in scripts) { isInter = f.name.endsWith('.inter') if (!isInter) pbParams[pbParams.size()-1] = f.name runParams = isInter ? pbParams[0..pbParams.size()-2] : pbParams if (verbose) { logger.info(runParams.join(' ')) } else { cPrinter.print('T') cPrinter.flush() } if (noRun) continue sWriter = new StringWriter() // Unfortunately, can't re-use // To process stderr separately, remove the redirectErrorStream // call below, and add a p.consumeProcessErrorStream(eWriter) Process p = new ProcessBuilder(runParams) .redirectErrorStream(true).start() if (isInter) p.withWriter { it.write(f.getText('UTF-8')) } else p.out.close() if (verbose) p.consumeProcessOutputStream(sWriter) else p.consumeProcessOutput() succeeded = (p.waitFor() == 0) ^ f.name.endsWith('.nsql') if (!succeeded) failedScriptNames << f.name if (verbose) { print sWriter.toString() println succeeded ? 'SUCCESS' : 'FAIL' } else { cPrinter.print('\b') cPrinter.print(succeeded ? '+' : '-') cPrinter.flush() } } if (!verbose) cPrinter.println() if (failedScriptNames.size() < 1) { if (doJvmExit) System.exit(0) return } println """For details, run again against each failed script individually with -v switch, like 'groovy runtests.groovy -v failedscript.sql'. ${failedScriptNames.size()} tests failed out of ${scripts.size()}:""" println failedScriptNames.join(System.properties['line.separator']) if (doJvmExit) System.exit((failedScriptNames.size() > 255) ? 1 : failedScriptNames.size()) assert false: Integer.toString(failedScriptNames.size()) + ' test(s) failed' } } def ps = Arrays.asList(args) as ArrayList if (ps.size() > 0 && ps[0] == 'NO_JVM_EXIT') { SqlToolTester.doJvmExit = false ps.remove(0) } SqlToolTester.runTests(ps) hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-sqlarray.sql0000644000175000017500000000217412007547350022464 0ustar renerene/* * $Id: dsv-sqlarray.sql 3603 2010-06-01 02:07:46Z unsaved $ * * Tests a DSV "round trip". * Create a table, export the data, import it back, cf. imported and original. */ * *DSV_TARGET_FILE = ${java.io.tmpdir}/test-sqlarray-${user.name}.dsv * *DSV_TARGET_TABLE = t CREATE TABLE t (i BIGINT PRIMARY KEY, ar INTEGER ARRAY); INSERT INTO t VALUES (1, array [11, null, 13]); INSERT INTO t VALUES (2, null); INSERT INTO t VALUES (3, array [21, 22]); COMMIT; /* Export */ \x t SELECT count(*) FROM t WHERE ar IS NULL AND i = 2; *if (*? != 1) \q Pre-check of inserted Array array data failed (1) *end if SELECT count(*) FROM t WHERE i in (1, 3) AND ar IS NOT null; *if (*? != 2) \q Pre-check of inserted Array data failed (2) *end if DELETE FROM t; SELECT count(*) FROM t; *if (*? != 0) \q Failed to clear table data *end if /* Import */ \m *{*DSV_TARGET_FILE} SELECT count(*) FROM t WHERE ar IS NULL AND i = 2; *if (*? != 1) \q Post-check of inserted Array array data failed (1) *end if SELECT count(*) FROM t WHERE i in (1, 3) AND ar IS NOT null; *if (*? != 2) \q Post-check of inserted Array data failed (2) *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/rawmode.sql0000644000175000017500000000074212007547350021471 0ustar renerene/* * $Id: rawmode.sql 4852 2011-12-27 15:55:44Z unsaved $ * * Tests raw mode */ CREATE TABLE t (i INTEGER); INSERT INTO t values (42); /** Adding a few blank lines in what is sent to server on purpose. */ \. SELECT i FROM t .; *if (*? != 42) \q Raw command failed *end if -- To change results so we can be confident of getting 1 later on. INSERT INTO t values (43); SELECT * FROM t; \. SELECT count(*) FROM t . :a WHERE i = 42 ; *if (*? != 1) \q Raw command failed hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/vars.sql0000644000175000017500000000236112007547350021005 0ustar renerene/* * $Id: vars.sql 4809 2011-11-20 21:12:35Z unsaved $ */ * mt1 = * mt2 = -- Following line has trailing white space, but that should have no effect. * mt3 = * - un1 * - un2 * if (*unsetA != *unsetB) \q Two never-set vars differ * end if * if (*un1 != *un2) \q Two explicitly unset variables differ * end if * if (*un1 != *unsetA) \q Explicitly unset vs. neverset vars differ * end if * if (*mt1 != *mt2) \q Two legacy-unset vars differ * end if * if (*mt1 != *mt3) \q Two legacy-unset vars differ, one set to blanks * end if * if (*mt1 == *unset) \q Legacy-unset var != never-set var * end if * if (alpha != alpha) \q Sanity constant comparison failed * end if * a = alpha * anotherA = alpha * if (*a != *anotherA) \q To equivalant variable values differ * end if -- Following two have 2 trailing spaces: * wsTrailed1 = alpha * wsTrailed2 = alpha * if (*wsTrailed1 == a) \q Trailing white-space not honored in logical evaluation * end if * if (*wsTrailed1 != *wsTrailed2) \q Trailing white-space not valued equally for logical evaluation * end if * wsEmbed1 = alpha beta * wsEmbed2 = alpha beta * if (*wsEmbed1 != *wsEmbed2) \q Embedded white-space not valued equally for logical evaluation * end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/unsetvar.nsql0000644000175000017500000000027412007547350022060 0ustar renerene/* * $Id: unsetvar.nsql 4428 2011-10-01 01:04:34Z unsaved $ * * Invokes another script that defines variables. * Then we test that we have access to the variables. */ \p *{unsetvar} hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/append.inter0000644000175000017500000000215712007547346021633 0ustar renerene/* * $Id: append.inter 3340 2009-12-14 00:00:49Z unsaved $ * * Tests interactive commands :a*. */ \c false /* Since running interactively, need to either invoke with --abortOnErr switch, * or use "\c false" Special command, to detect failures. */ CREATE TABLE t(id INTEGER GENERATED BY DEFAULT AS IDENTITY, vc VARCHAR(80)); INSERT INTO t (vc) VALUES('a'); INSERT INTO t (vc) VALUES('b'); INSERT INTO t (vc) VALUES('c'); INSERT INTO t (vc) VALUES('b'); SELECT count(*) FROM t *if (*? != 4) \q Sanity check failed / 1 *end if SELECT count(*) FROM t WHERE vc = 'b'; *if (*? != 2) \q Sanity check failed / 2 *end if INSERT INTO t(vc) VALUES :a ('prefpost'); SELECT count(*) FROM t *if (*? != 5) \q Append + repl failed / 1 *end if SELECT vc FROM t; SELECT count(*) FROM t WHERE vc = 'prefpost'; *if (*? != 1) \q Append + repl failed / 2 *end if SELECT count(*) FROM t; \p Intervening command making previous become command # -2. :h :-2a WHERE vc = 'b'; *if (*? != 2) \q Recall + Append + exec failed / 1 *end if :-1 :a AND id = 1 :; *if (*? != 1) \q Recall + multi-line Append failed / 1 *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-trimall.dsv0000644000175000017500000000013012007547350022255 0ustar renerenetargettable=t i | vc | d 1 | o n e | 2006-12-11 2 | two | 2008-02-98 3|three| hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-prepare.sql0000644000175000017500000000052612007547346022270 0ustar renerene/* * $Id: dsv-prepare.sql 610 2008-12-22 15:54:18Z unsaved $ * * Tests PL 'prepare' command */ CREATE TABLE t (i INT, a INT, b INT, c INT); * N = 4567 * prepare N INSERT INTO t(i, a, b, c) VALUES (1, ?, 8, 9); SELECT count(*) FROM t WHERE i = 1 AND a = 4567 AND b= 8 AND c = 9; *if (*? != 1) \q PL prepare command failed *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/sqljrt.sql0000644000175000017500000000047012007547350021350 0ustar renerene/* * $Id: sqljrt.sql 3340 2009-12-14 00:00:49Z unsaved $ * * Tests SQL/JRT */ create function dehex(VARCHAR(80), INTEGER) returns INTEGER no sql language java external name 'CLASSPATH:java.lang.Integer.valueOf' .; CALL dehex('12', 16); *if (*? != 18) \q SQL/JRT function failed *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-constcols.dsv0000644000175000017500000000030112007547346022625 0ustar renerenetargettable=t # Following (header) line has intentional trailing whitespace. i | - | d # Following line has intentional trailing whitespace (and mixed case). 1 | 1 | 2006-12-11 2 | 2 | hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/nq-arg1.nsql0000644000175000017500000000040712007547350021455 0ustar renerene/* * $Id: nq-arg1.nsql 610 2008-12-22 15:54:18Z unsaved $ * * Test of \q with arg from nested script. */ \i nq-arg1.isql \p Should not have returned from nested script which ran \q. /* Following line exits with success status to fail the .nsql unit test. \q hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/q-noarg1.sql0000644000175000017500000000024712007547350021460 0ustar renerene/* * $Id: q-noarg1.sql 610 2008-12-22 15:54:18Z unsaved $ * * Simplest test of \q with no args */ \p Just quitting. Should exit with 0 (success) exit status. \q hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/function.sql0000644000175000017500000000225612007547350021662 0ustar renerene/* * $Id: function.sql 4847 2011-12-27 15:23:12Z unsaved $ * * Tests SqlTool functions. */ -- Special command function /= f() \p one *{:2} *{1} four /f(alpha, beta)five; /f(alpha) six; --/f(); /f(alpha, beta)seven :; \p uno *{:2} *{:1} quatro /: g() sinco /g(alpha, beta); CREATE TABLE t(i integer, vc varchar(20)); INSERT INTO t VALUES(1, 'one'); INSERT INTO t VALUES(2, 'two'); COMMIT; -- SQL functions \. INSERT INTO t VALUES(3, 'three'); SELECT -- Trailing whitespace on next line * *{1} . /: h() t -- Trailing whitespace on previous line * quieter ~ /h(FROM)WHERE i = 3; * if (*? != three) \q SqlTool function for multi-line chunked SQL command with appendages failed *end if -- Same but without any appendages \. INSERT INTO t VALUES(4, 'four'); SELECT vc FROM *{1} WHERE i = 4 . /: f1() * quieter ~ /f1(t); * if (*? != four) \q SqlTool function for multi-line chunked SQL command (no appendages) failed *end if -- Test function invocation with no params but appendage \. INSERT INTO t VALUES(5, 'four'); SELECT vc FROM t . /: f2() * quieter ~ /f2() WHERE i = 4; * if (*? != four) \q SqlTool function for multi-line chunked SQL command (no params) failed *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-abortcommits.sql0000644000175000017500000000220412007547350023323 0ustar renerene/* * $Id: dsv-abortcommits.sql 3340 2009-12-14 00:00:49Z unsaved $ * * Tests proper commit behavior upon DSV abortion */ CREATE TABLE t (i INT, r REAL, d DATE, t TIMESTAMP, v VARCHAR(80), b BOOLEAN); \c true \a true \m dsv-rejects.dsv SELECT COUNT(*) FROM t; *if (*? != 1) \q Should have imported 1 good DSV records, but imported *{?} (1) *end if ROLLBACK; SELECT COUNT(*) FROM t; *if (*? != 1) \q Should have retained 1 DSV record after ROLLBACK w/autocommit, but retained *{?} *end if -- Now with auto-commit off \a false DELETE FROM t; COMMIT; \m dsv-rejects.dsv SELECT COUNT(*) FROM t; *if (*? != 1) \q Should have imported 1 good DSV records, but imported *{?} (2) *end if ROLLBACK; SELECT COUNT(*) FROM t; *if (*? != 0) \q Should have retained 0 DSV record after ROLLBACK, but retained *{?} *end if DELETE FROM t; COMMIT; * *DSV_RECORDS_PER_COMMIT = 10 \m dsv-rejects.dsv SELECT COUNT(*) FROM t; *if (*? != 1) \q Should have imported 1 good DSV records, but imported *{?} (3) *end if ROLLBACK; SELECT COUNT(*) FROM t; *if (*? != 1) \q Should have retained 1 DSV record after ROLLBACK w/RPC, but retained *{?} *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/lastval.sql0000644000175000017500000000151512007547350021500 0ustar renerene/* * $Id: lastval.sql 610 2008-12-22 15:54:18Z unsaved $ * * Tests auto-variable ? */ CREATE TABLE t (i INT); * if (*? != 0) \q ? variable not capturing CREATE TABLE return value * end if INSERT INTO t values (21); * if (*? != 1) \q ? variable not capturing INSERT return value * end if INSERT INTO t values (10); * if (*? != 1) \q ? variable not capturing INSERT return value * end if INSERT INTO t values (43); * if (*? != 1) \q ? variable not capturing INSERT return value * end if SELECT * FROM t ORDER BY i DESC; * if (*? != 10) \q ? variable not capturing last fetched value * end if \p echo some stuff \p to verify that ? variable value is preserved * list * if (*? != 10) \q ? value not retained after special commands * end if * if (*{?} != 10) \q ? value not dereferenced with {} usage * end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/testcases.txt0000644000175000017500000000400012007547350022040 0ustar renerene$Id: testcases.txt 4713 2011-11-06 23:41:51Z unsaved $ This list is incomplete. It just takes more time than I am willing to dedicate to keep documenting ever new test script. If you want to know what a script for and it's not listed here, you'll have to open the script file and look at it. file items/features tested ----------- ---------------------------- dsv-trimming.sql DSV import tests, including trimming of whitespace. lastval.sql Test automatic ? variable. nullrep.sql Test the null-representation token (default and custom). q-noarg*.sql Test for success status \q exits. q-arg*.nsql Tests for failure status "\q arg..." exits. noop.sql Does nothing (exit status should be success). goodsqlonly.sql Executes some successful SQL. badsqlonly.nsql Executes some bad SQL. logic.sql Conditional expression tests. nq-noarg*.sql Test for success status \q exits, in nested script. nq-arg*.nsql Tests for failure status "\q arg..." exits, in nested script. plcontrolflow.sql Test of PL control flow commands like if, foreach, etc. rawmode.sql Test of raw input mode. dsv-constcols.sql *DSV_CONST_COLS usage. dsv-omits.sql Test omitting of columns in DSV imports. dsv-prepare.sql Test "* prepare" command. dsv-rejects.sql Test import behavior when a reject file/report is in place. dsv-roundtrip.sql Exports and re-import data, verifying that is hasn't changed. subst.inter Tests interactive commands :s... write.inter Tests interactive command :w append.inter Tests interactive commands :a... history.inter Tests interactive recall/execute commands (plus :h, :b) comments.sql Tests -- and /*...*/ comments. errhandling.sql Handling errors which occur within blocks and nested scripts errhandling.nsql Handling errors which occur within blocks and nested scripts adv-comments.sql Advanced comments macro.inter Macors (interactive buffer manipulation) macro.sql Macros, main hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-constcols.sql0000644000175000017500000000137512007547346022644 0ustar renerene/* * $Id: dsv-constcols.sql 610 2008-12-22 15:54:18Z unsaved $ * * Tests setting column values with *DSV_CONST_COLS */ * *DSV_CONST_COLS= d = 2007-05-14 0:00:00 | a = 139 CREATE TABLE t (i INT, a INT, d DATE); \m dsv-constcols.dsv SELECT COUNT(*) FROM t WHERE a = 139 AND d = '2007-05-14'; /* The d const value will override the .dsv-specified values. */ *if (*? != 2) \q Import using constants for int and date columns failed *end if DELETE from t; * *DSV_CONST_COLS= \m dsv-constcols.dsv SELECT COUNT(*) FROM t WHERE a IS null AND d IS null; *if (*? != 1) \q Failed to reset CONST_COLS behavior (1) *end if SELECT COUNT(*) FROM t WHERE a IS null AND d = '2006-12-11'; *if (*? != 1) \q Failed to reset CONST_COLS behavior (2) *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/noop.sql0000644000175000017500000000016312007547350021003 0ustar renerene/* * $Id: noop.sql 610 2008-12-22 15:54:18Z unsaved $ * * Simplest test possible. Does absolutely nothing. */ hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/math.sql0000644000175000017500000000246712007547350020772 0ustar renerene/* * $Id: math.sql 4563 2011-10-19 02:24:41Z unsaved $ */ *((x=1+2+3)) * if (*x != 6) \q Tight (non-whitespace) math expression failed * end if *z = notanum * (( z = 1 + 2 + 3 )) * if (*z != 6) \q Loose (much-whitespace) math expression failed * end if -- Force an error with a non-integral variable -- *x=werd * ((y =(x*2)/3 -(2 + 2))) * if (*y != 0) \q Math expression with parenthetical nesting failed * end if CREATE TABLE t(i INTEGER); * ((i = 0)) * while (*i < 5) -- \p Next is *{i} INSERT INTO t VALUES(*{i}); * ((i = i + 1)) * end while * c _ SELECT COUNT(*) FROM t; * if (*c != 5) \q Loop failed to insert right number of records * end if * r _ SELECT COUNT(*) FROM t WHERE i = 4; * if (*r != 1) \q Loop failed to insert record with i == 4 * end if *a = 3 *((z=a*2)) *(( z *= 1 + 1 )) * if (*z != 12) \q Math op #1 failed * end if -- Series of squares * sum = 0 * i = 0 * while (*i < 5) * ((sum += i*i)) * ((i++)) * end while * if (*sum != 30) \q Math summation failed * end if -- Count back down * while (*i > 0) * ((i-=1)) -- We do not support '--' * ((sum -= i*i)) * end while * if (*sum != 0) \q Reversion of summation failed. *{sum} left over. * end if * (( v1 = (3 + 4) ^ (1 + 2) * 3 )) * if (*v1 != 1029) \q Power operation failed * end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/write.inter0000644000175000017500000000370712007547350021513 0ustar renerene/* * $Id: write.inter 3340 2009-12-14 00:00:49Z unsaved $ * * Tests interactive command :w*. * * This script has some serious portability concerns, as detailed here. * * Can't think of a portable way to prepare/purge the output file. * Depending on existence of "rm" program until a better solution found. */ \c false /* Since running interactively, need to either invoke with --abortOnErr switch, * or use "\c false" Special command, to detect failures. */ * TARGETSCRIPT = ${java.io.tmpdir}${file.separator}sqltool-wtest-${user.name}.sql CREATE TABLE t(id INTEGER GENERATED BY DEFAULT AS IDENTITY, vc VARCHAR(80)); \p Testing write of non-sql, #1 :w *{TARGETSCRIPT} INSERT INTO t (vc) VALUES ('a'); :w *{TARGETSCRIPT} :; INSERT INTO t (vc) VALUES ('b'); INSERT INTO t (vc) VALUES ('c'); :w *{TARGETSCRIPT} \p Testing write of non-sql, #2 :w *{TARGETSCRIPT} INSERT INTO t (vc) VALUES ('d'); INSERT INTO t (vc) VALUES ('e'); INSERT INTO t (vc) VALUES ('f'); :-2w *{TARGETSCRIPT} :w *{TARGETSCRIPT} /* Following line has trailing white space */ :w *{TARGETSCRIPT} :; /* The :; commands will do non-effectual INSERTs, not :w's, since : commands may not be recalled (since they don't make it into the buffer). */ /* Clean up the temp file if at all possible! */ \p deleting DELETE FROM t; \p selecting SELECT * FROM t; \p executing \i *{TARGETSCRIPT} \p executed SELECT * FROM t; \q SELECT COUNT(*) FROM t; *if (*? != 5) \! rm -f *{TARGETSCRIPT} \q :w test failed / 1 *end if SELECT COUNT(*) FROM t WHERE vc = 'a'; *if (*? != 1) \! rm -f *{TARGETSCRIPT} \q :w test failed / 2 *end if SELECT COUNT(*) FROM t WHERE vc = 'c'; *if (*? != 1) \! rm -f *{TARGETSCRIPT} \q :w test failed / 3 *end if SELECT COUNT(*) FROM t WHERE vc = 'e'; *if (*? != 1) \! rm -f *{TARGETSCRIPT} \q :w test failed / 4 *end if SELECT COUNT(*) FROM t WHERE vc = 'f'; *if (*? != 2) \! rm -f *{TARGETSCRIPT} \q :w test failed / 5 *end if \! rm -f *{TARGETSCRIPT} hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-trimming.sql0000644000175000017500000000364412007547350022457 0ustar renerene/* * $Id: dsv-trimming.sql 3340 2009-12-14 00:00:49Z unsaved $ * * Tests trimming in DSV imports */ CREATE TABLE t (i INT, r REAL, d DATE, t TIMESTAMP, v VARCHAR(80), b BOOLEAN); \m dsv-trimming.dsv SELECT count(*) FROM t WHERE i = 31; *if (*? != 1) \q Import of space-embedded INT failed *end if SELECT count(*) FROM t WHERE r = 3.124; *if (*? != 1) \q Import of space-embedded REAL failed *end if SELECT count(*) FROM t WHERE d = '2007-06-07'; *if (*? != 1) \q Import of space-embedded DATE failed (1) *end if SELECT count(*) FROM t WHERE t = '2006-05-06 12:30:04'; *if (*? != 1) \q Import of space-embedded TIMESTAMP failed *end if SELECT count(*) FROM t WHERE v = ' a B '; *if (*? != 1) \q Import of space-embedded VARCHAR failed *end if /** I dont' know if "IS true" or "= true" is preferred, but the former * doesn't work with HSQLDB 1.7.0.7 */ SELECT count(*) FROM t WHERE b = true; *if (*? != 1) \q Import of space-embedded BOOLEAN failed *end if /** Repeat test with some non-default DSV settings */ * *DSV_COL_SPLITTER = \\ * *DSV_ROW_SPLITTER = \}(?:\r\n|\r|\n) DELETE FROM t; \m dsv-trimming-alt.dsv SELECT count(*) FROM t WHERE i = 31; *if (*? != 1) \q Import of space-embedded INT failed *end if SELECT count(*) FROM t WHERE r = 3.124; *if (*? != 1) \q Import of space-embedded REAL failed *end if SELECT count(*) FROM t WHERE d = '2007-06-07'; *if (*? != 1) \q Import of space-embedded DATE failed (2) *end if SELECT count(*) FROM t WHERE t = '2006-05-06 12:30:04'; *if (*? != 1) \q Import of space-embedded TIMESTAMP failed *end if SELECT count(*) FROM t WHERE v = ' a B '; *if (*? != 1) \q Import of space-embedded VARCHAR failed *end if /** I dont' know if "IS true" or "= true" is preferred, but the former * doesn't work with HSQLDB 1.7.0.7 */ SELECT count(*) FROM t WHERE b = true; *if (*? != 1) \q Import of space-embedded BOOLEAN failed *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/dsv-trimall.sql0000644000175000017500000000171412007547350022271 0ustar renerene/* * $Id: dsv-trimall.sql 3340 2009-12-14 00:00:49Z unsaved $ * * Tests *DSV_TRIM_ALL option. */ CREATE TABLE t (i INT, vc VARCHAR(80), d DATE); \m dsv-trimall.dsv SELECT COUNT(*) FROM t WHERE vc = 'three'; *if (*? != 1) \q Sanity check failed *end if SELECT COUNT(*) FROM t WHERE vc = ' o n e '; *if (*? != 1) \q Default mode messed with VARCHAR-embedded whitespace *end if SELECT COUNT(*) FROM t WHERE vc = ' two '; *if (*? != 1) \q Default mode messed with leading or trailing whitespace in VARCHAR *end if DELETE from t; COMMIT; * *DSV_TRIM_ALL = true \m dsv-trimall.dsv SELECT COUNT(*) FROM t WHERE vc = 'three'; *if (*? != 1) \q 2nd Sanity check failed *end if SELECT COUNT(*) FROM t WHERE vc = 'o n e'; *if (*? != 1) \q *DSV_TRIM_ALL didn't trim with VARCHAR-embedded whitespace properly *end if SELECT COUNT(*) FROM t WHERE vc = 'two'; *if (*? != 1) \q *DSV_TRIM_ALL didn't trim leading or trailing whitespace properly *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/history.inter0000644000175000017500000000205112007547350022051 0ustar renerene/* * $Id: history.inter 3340 2009-12-14 00:00:49Z unsaved $ * * Tests simple recalls and executes : and :;. */ \c false /* Since running interactively, need to either invoke with --abortOnErr switch, * or use "\c false" Special command, to detect failures. */ CREATE TABLE t(id INTEGER GENERATED BY DEFAULT AS IDENTITY, vc VARCHAR(80)); /* Just verify that an error is not thrown by the two following commands. And that they don't effect the command history. */ :b :h INSERT INTO t(vc) VALUES('one'); INSERT INTO t(vc) VALUES('two'); INSERT INTO t(vc) VALUES('three'); /* Test simple recall and execution */ :4 :; :4; :; SELECT count(*) FROM t *if (*? != 6) \q Recall and execs failed / 1 *end if /* SELECT vc FROM t; */ SELECT count(*) FROM t WHERE vc = 'two'; *if (*? != 4) \q Recall and execs failed / 2 *end if :/ee/; SELECT count(*) FROM t; *if (*? != 7) \q Regex Recall and execs failed / 1 *end if /* SELECT vc FROM t; */ SELECT count(*) FROM t WHERE vc = 'three'; *if (*? != 2) \q Regex Recall and execs failed / 2 *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/csv-roundtrip.sql0000644000175000017500000000427212007547350022654 0ustar renerene/* * $Id: csv-roundtrip.sql 4455 2011-10-02 21:22:13Z unsaved $ * * Tests a DSV "round trip". * Create a table, export the data, import it back, cf. imported and original. */ * *DSV_TARGET_FILE = ${java.io.tmpdir}/test-roundtrip-${user.name}.csv * *DSV_TARGET_TABLE = t * *DSV_COL_DELIM = \t * *DSV_COL_SPLITTER = \t -- * *ALL_QUOTED = true CREATE TABLE t (i INT, v VARCHAR(25), d DATE); INSERT INTO t(i, v, d) VALUES (1, 'one two three', null); INSERT INTO t(i, v, d) VALUES (2, null, '2007-06-24'); INSERT INTO t(i, v, d) VALUES (3, 'one,two,,three', '2007-06-24'); INSERT INTO t(i, v, d) VALUES (4, '"one"two""three', '2007-06-24'); INSERT INTO t(i, v, d) VALUES (5, '"one,two"three,', '2007-06-24'); /* Export */ \xq t SELECT count(*) FROM t WHERE i = 1 AND v = 'one two three' AND d IS null; *if (*? != 1) \q Pre-check of inserted data failed (1) *end if SELECT count(*) FROM t WHERE i = 2 AND v IS NULL AND d = '2007-06-24'; *if (*? != 1) \q Pre-check of inserted data failed (2) *end if SELECT count(*) FROM t WHERE i = 3 AND v = 'one,two,,three' AND d = '2007-06-24'; *if (*? != 1) \q Pre-check of inserted data failed (3) *end if SELECT count(*) FROM t WHERE i = 4 AND v = '"one"two""three' AND d = '2007-06-24'; *if (*? != 1) \q Pre-check of inserted data failed (4) *end if SELECT count(*) FROM t WHERE i = 5 AND v = '"one,two"three,' AND d = '2007-06-24'; *if (*? != 1) \q Pre-check of inserted data failed (5) *end if /* Import */ \mq *{*DSV_TARGET_FILE} SELECT count(*) FROM t WHERE i = 1 AND v = 'one two three' AND d IS null; *if (*? != 2) \q Post-check of inserted data failed (1) *end if SELECT count(*) FROM t WHERE i = 2 AND v IS NULL AND d = '2007-06-24'; *if (*? != 2) \q Post-check of inserted data failed (2) *end if SELECT count(*) FROM t WHERE i = 3 AND v = 'one,two,,three' AND d = '2007-06-24'; *if (*? != 2) \q Post-check of inserted data failed (3) *end if SELECT count(*) FROM t WHERE i = 4 AND v = '"one"two""three' AND d = '2007-06-24'; *if (*? != 2) \q Post-check of inserted data failed (4) *end if SELECT count(*) FROM t WHERE i = 5 AND v = '"one,two"three,' AND d = '2007-06-24'; *if (*? != 2) \q Post-check of inserted data failed (5) *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/q-arg1.nsql0000644000175000017500000000021012007547350021267 0ustar renerene/* * $Id: q-arg1.nsql 610 2008-12-22 15:54:18Z unsaved $ * * Simplest test of \q with arg */ \q Quitting with non-zero exit status hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/unsetvar.sql0000644000175000017500000000046312007547350021702 0ustar renerene/* * $Id: unsetvar.sql 4809 2011-11-20 21:12:35Z unsaved $ */ \p *{:unsetvar} *if (*x != *y) \q Two unset variables are not equal *end if *x = *if (*x == *y) \q A variable set to '' is equal to an unset variable *end if *z = *if (*x != *z) \q Two variables set to '' are not equal *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/subdir/0000755000175000017500000000000012007570424020575 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/subdir/tblx.dsv0000644000175000017500000000002212007547350022260 0ustar renereneid|vc 1|one 2|two hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/subdir/tblx.sql0000644000175000017500000000023512007547350022271 0ustar renerene/* * $Id: tblx.sql 3714 2010-07-22 02:28:38Z unsaved $ * * Test loading other files with @ */ CREATE TABLE tblx ( id INTEGER, vc VARCHAR(10) ); hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/subdir/atuser.sql0000644000175000017500000000034612007547350022626 0ustar renerene/* * $Id: atuser.sql 3714 2010-07-22 02:28:38Z unsaved $ * * Test loading other files with @ */ \i @/tblx.sql \m @/tblx.dsv SELECT COUNT(*) FROM tblx; *if (*? != 2) \q Failed to load table deta from @ directory *end if hsqldb2.2-2.2.9.orig/hsqldb/testrun/sqltool/runtests.cmd0000755000175000017500000000377012007547350021675 0ustar renerene :: $Id: runtests.cmd 4697 2011-11-04 13:32:05Z unsaved $ :: Distribution is permitted under the terms of the HSQLDB license. :: (c) 2011 The HSQL Development Group :: :: Wrapper that serves two purposes: :: (1) Takes traditional parameters in format: command -switches... filenames... :: and converts to a Gradle command of format: Gradle -P x=y... taskname :: (2) Invokes the 'gradlew' wrapper script supplied by the HyperSQL :: distribution. :: This script automatically 'cd's to directory .../testrun/sqltool in which :: it resides, so that it may be safely executed from desktop managers, etc. :: The main work script, "runtests.groovy" does not have this limitation. :: :: author: Blaine Simpson, unsaved@users.sourceforge.net :: since: HSQLDB 1.8.0.8 / 1.9.x :: see: README.txt in this same directory. :: In November 2011 this script converted from the sole test runner script, to :: one wrapper for Gradle (w/ "build.gradle") + runtests.groovy. @echo off if "%OS%"=="Windows_NT" setlocal set ERRORLEVEL= ver > nul set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. cd "%DIRNAME%" if "%1" == "-h" ( set VERBOSE=-Phelp=true shift ) else if "%1" == "-v" ( set VERBOSE=-Pverbose=true shift ) else if "%1" == "-n" ( set NORUN=-Pnorun=true shift ) else if "%1" == "-nv" ( set VERBOSE=-Pverbose=true set NORUN=-Pnorun=true shift ) else if "%1" == "-vn" ( set VERBOSE=-Pverbose=true set NORUN=-Pnorun=true shift ) set SCRIPTLIST= :moreArgs if "%1" == "" goto noMoreArgs if not "%SCRIPTLIST%" == "" ( set SCRIPTLIST=%SCRIPTLIST%,%1 ) else ( set SCRIPTLIST=-Pscripts=%1 ) shift goto moreArgs :noMoreArgs if "%VERBOSE%" == "true" echo ..\..\build\gradlew %HELP% %VERBOSE% %NORUN% %SCRIPTLIST% ..\..\build\gradlew %HELP% %VERBOSE% %NORUN% %SCRIPTLIST% :: People who have a real, local Gradl installation can use the following: ::gradle %HELP% %VERBOSE% %NORUN% %SCRIPTLIST% hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqlodbc/0000755000175000017500000000000012007557306017413 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqlodbc/blobtest.py0000755000175000017500000000602512007547344021612 0ustar renerene#!/usr/bin/python -t # $Id: blobtest.py 2895 2009-03-07 19:34:26Z unsaved $ # Test BLOB transactions through the ODBC driver. # Can't perform these tests with our Java unit tests, since Sun's jdbc:odbc # driver does not support BLOB or CLOB type. # N.b. there is some dependency or bug which requires pyodbc to use the # ANSI variant of the HyperSQL ODBC Driver. Using the normal Unicode # variant will generate the following error message when you try to connect: # pyodbc.Error: ('0', '[0] [unixODBC]c (202) (SQLDriverConnectW)') # It is quite possible that this issue will be taken care of when we fix a # high-priority bug to do with switching between SQLDriverConnect and # SQLDriverConnectW on UNIX. # Author: Blaine Simpson (blaine dot simpson at admc dot com) import pyodbc conn = pyodbc.connect("DSN=tstdsn-a") try: conn.autocommit = 0 cursor = conn.cursor(); cursor.execute("DROP TABLE tsttbl IF EXISTS"); cursor.execute( "CREATE TABLE tsttbl(\n" + " id BIGINT generated BY DEFAULT AS IDENTITY,\n" + " vc BLOB(20),\n" + " entrytime TIMESTAMP DEFAULT current_timestamp NOT NULL\n" + ")"); # First a simple/non-parameterized Insertion #retval = cursor.execute("INSERT INTO tsttbl (id, vc) values (1, 'one')"); #if retval != 1: #raise Exception(('1st insertion inserted ' + repr(retval) #+ ' rows instead of 1')) # Now parameterized. Unfortunately, the Python DB API and pyodbc API do # not allow re-use of a parsed statement. Cursor must be reparsed for # each usage. retval = cursor.execute("INSERT INTO tsttbl (id, vc) values (?, ?)", 2, 'two'); if retval != 1: raise Exception(('2nd insertion inserted ' + repr(retval) + ' rows instead of 2')) retval = cursor.execute("INSERT INTO tsttbl (id, vc) values (?, ?)", 3, 'three'); if retval != 1: raise Exception(('3rd insertion inserted ' + repr(retval) + ' rows instead of 3')) retval = cursor.execute("INSERT INTO tsttbl (id, vc) values (?, ?)", 4, 'four'); if retval != 1: raise Exception(('4th insertion inserted ' + repr(retval) + ' rows instead of 4')) retval = cursor.execute("INSERT INTO tsttbl (id, vc) values (?, ?)", 5, 'five'); if retval != 1: raise Exception(('5th insertion inserted ' + repr(retval) + ' rows instead of 5')) conn.commit(); # Non-parameterized query for row in cursor.execute( "SELECT * FROM tsttbl WHERE id < 3"): print row # Non-parameterized query. As noted above, can't re-use parsed cursor. for row in cursor.execute( "SELECT * FROM tsttbl WHERE id > ?", 3): # For variety, we format the files ourselves this time print repr(row.ID) + '|' + row.VC + '|' + repr(row.ENTRYTIME) except Exception as e: conn.rollback(); raise e finally: conn.close(); hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/0000755000175000017500000000000012007570424017065 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfLeftJoin.txt0000644000175000017500000004304712007547346023031 0ustar renerene-- SIMPLE OUTER - NO NULLS -- SET PROPERTY "hsqldb.default_table_type" 'cached' drop table x if exists; drop table y if exists; create table x(a int, b int); create table y(a int, b int); insert into x values(2, 1); insert into x values(5, 1); insert into y values(1, 1); insert into y values(2, 1); insert into y values(3, 1); insert into y values(4, 1); /*r1*/ select count(*) from x inner join y on (x.a = y.a); /*r2*/ select count(*) from x left outer join y on (x.a = y.a); /*r1*/ select count(*) from y inner join x on (x.a = y.a); /*r4*/ select count(*) from y left outer join x on (x.a = y.a); create index idx1 on y(a); create index idx2 on x(a); /*r1*/ select count(*) from x inner join y on (x.a = y.a); /*r2*/ select count(*) from x left outer join y on (x.a = y.a); /*r1*/ select count(*) from y inner join x on (x.a = y.a); /*r4*/ select count(*) from y left outer join x on (x.a = y.a); --MULTIPLE OUTER -- GROUPED --OWNERS are possible account owners --ACCOUNTS are existing accounts, each with an owner id --CREDITS are account transactions drop table credits if exists; drop table accounts if exists; drop table owners if exists; create table owners( id int not null primary key, name varchar(100) ); create table accounts( id int not null primary key, accountname varchar(100), accountnr int, accounttype int, ownerid int, constraint fk_accounts foreign key (ownerid) references owners(id) ); create table credits( id int, accountid int, amount float, constraint fk_credits foreign key (accountid) references accounts(id) on update cascade ); insert into owners values(1,'John'); insert into owners values(2,'Mary'); insert into owners values(3,'Jane'); insert into accounts values(1,'Bank',5101,0,1); insert into accounts values(2,'Cash',5202,0,1); insert into accounts values(3,'Giro',5303,0,2); insert into accounts values(4,'Invoice',7505,1,1); insert into credits values(1,1,1000); insert into credits values(2,1,2000); insert into credits values(3,2,100); insert into credits values(4,2,200); --outer join /*c7*/select own.*, ac.*, cred.* from owners own left outer join accounts ac on own.id = ac.ownerid left outer join credits cred on cred.accountid = ac.id --ACCOUNTS are outer joined with credits to show account balance /*c4*/select ac.accountname,ac.accountnr,sum(cred.amount) from accounts ac left outer join credits cred on cred.accountid=ac.id group by ac.accountnr,ac.accountname --like above but filtered with only one account type /*c3*/select ac.accountname,ac.accountnr,sum(cred.amount) from accounts ac left outer join credits cred on cred.accountid=ac.id where accounttype=0 group by ac.accountnr,ac.accountname --join like above but condition changed to return only one not-null item from cred table /*c4*/select ac.accountname,ac.accountnr, cred.amount from accounts ac left outer join credits cred on cred.accountid=ac.id and amount=200 --OWNER and ACCOUNT are inner joined then outer joined with credits to show balance /*c3*/select own.name, ac.accountname,ac.accountnr,sum(cred.amount) from owners own inner join accounts ac on own.id = ac.ownerid left outer join credits cred on cred.accountid = ac.id where accounttype=0 group by own.name,ac.accountnr,ac.accountname --OWNER and ACCOUNT are outer joined then outer joined with credits to show balance /*c5*/select own.name, ac.accountname,ac.accountnr,sum(cred.amount) from owners own left outer join accounts ac on own.id = ac.ownerid left outer join credits cred on cred.accountid = ac.id group by own.name,ac.accountnr,ac.accountname --ERROR when a condition column has not been defined in the join so far /*e*/select own.*, ac.*, cred.* from owners own left outer join accounts ac on own.id = ac.ownerid and cred.accountid = 1 left outer join credits cred on cred.accountid = ac.id --from 1.8.1 functions and different conditions are accepted in outer joins /*r Bank,5101,NULL Cash,5202,200.0E0 Giro,5303,NULL Invoice,7505,NULL */select ac.accountname,ac.accountnr, cred.amount from accounts ac left outer join credits cred on cred.accountid=ac.id and abs(amount) = 200 /*r Bank,5101,NULL Cash,5202,100.0E0 Cash,5202,200.0E0 Giro,5303,NULL Invoice,7505,NULL */select ac.accountname,ac.accountnr, cred.amount from accounts ac left outer join credits cred on cred.accountid=ac.id and abs(amount) in( 200, 100) --MULTIPLE OUTER --STUDENTS contains id's for students --TEACHERS contains id's for teachers --STUDENT_TEACHER links a teacher to a student DROP TABLE STUDENT IF EXISTS; DROP TABLE TEACHER IF EXISTS; DROP TABLE STUDENT_TEACHER IF EXISTS; CREATE TABLE STUDENT(STUDENT_ID BIGINT NOT NULL PRIMARY KEY); CREATE TABLE TEACHER(TEACHER_ID BIGINT NOT NULL PRIMARY KEY); CREATE TABLE STUDENT_TEACHER(STUDENT_ID BIGINT NOT NULL, TEACHER_ID BIGINT NOT NULL); INSERT INTO STUDENT VALUES (1); INSERT INTO STUDENT VALUES (2); INSERT INTO TEACHER VALUES (100); INSERT INTO STUDENT_TEACHER VALUES (1, 100); --show all students with their links to teachers, include students without a teacher /*c2*/SELECT S.STUDENT_ID, T.TEACHER_ID FROM STUDENT S LEFT JOIN STUDENT_TEACHER MAP ON S.STUDENT_ID=MAP.STUDENT_ID LEFT JOIN TEACHER T ON MAP.TEACHER_ID=T.TEACHER_ID --filter the above to show students for teacher_id 100 /*c1*/SELECT S.STUDENT_ID, T.TEACHER_ID FROM STUDENT S LEFT JOIN STUDENT_TEACHER MAP ON S.STUDENT_ID=MAP.STUDENT_ID LEFT JOIN TEACHER T ON MAP.TEACHER_ID=T.TEACHER_ID WHERE T.TEACHER_ID = 100; --filter the first query to show only students with no teacher /*c1*/SELECT S.STUDENT_ID, T.TEACHER_ID FROM STUDENT S LEFT JOIN STUDENT_TEACHER MAP ON S.STUDENT_ID=MAP.STUDENT_ID LEFT JOIN TEACHER T ON MAP.TEACHER_ID=T.TEACHER_ID WHERE T.TEACHER_ID IS NULL; --show the result of nonsensical query --returns one row per STUDENT_ID with TEACHER_ID set to null in each row /*c2*/SELECT S.STUDENT_ID, T.TEACHER_ID FROM STUDENT S LEFT JOIN STUDENT_TEACHER MAP ON S.STUDENT_ID=MAP.STUDENT_ID LEFT JOIN TEACHER T ON MAP.TEACHER_ID=T.TEACHER_ID AND T.TEACHER_ID IS NULL; --ANOTHER OUTER WITH AND create table BASE (ID integer) create table CHILD(ID integer, BASE_ID integer) insert into BASE values (1) insert into BASE values (2) insert into CHILD values (1,1) /*r 1,1 2,NULL */select BASE.ID,CHILD.ID from BASE left join CHILD on CHILD.BASE_ID=BASE.ID /*r 1,NULL 2,NULL */select BASE.ID,CHILD.ID from BASE left join CHILD on CHILD.BASE_ID=BASE.ID and CHILD.ID>1 /*r 1,NULL 2,NULL */select BASE.ID,CHILD.ID from BASE left join CHILD on CHILD.BASE_ID=BASE.ID and CHILD.ID<>1 --bug #736327 create table emp(company_id varchar(10),id varchar(20),supervisor_id varchar(20), primary key (company_id,id)); insert into emp values ('01','1000',null); insert into emp values ('01','1001','1000'); /*c2*/select e.id,e.supervisor_id from emp e left join emp s on e.company_id = s.company_id and e.supervisor_id = s.id; -- --bug #676083 -- DROP TABLE T_BOSS IF EXISTS; DROP TABLE T_EMPLOYEE IF EXISTS; CREATE TABLE T_BOSS (FIRST VARCHAR(10),LAST VARCHAR(10)); CREATE TABLE T_EMPLOYEE (FIRST VARCHAR(10),LAST VARCHAR(10)); INSERT INTO T_BOSS VALUES ('Ludovic','ANCIAUX'); INSERT INTO T_EMPLOYEE VALUES ('Ludovic','ANCIAUX'); INSERT INTO T_EMPLOYEE VALUES ('Bill','GATES'); /*rBill,GATES,NULL,NULL*/SELECT * FROM T_EMPLOYEE LEFT JOIN T_BOSS ON T_EMPLOYEE.FIRST = T_BOSS.FIRST WHERE T_BOSS.FIRST IS Null; -- --bug #674025 -- CREATE TABLE boss (id INTEGER PRIMARY KEY, name VARCHAR(10), UNIQUE(name)); CREATE TABLE employee (id INTEGER PRIMARY KEY, name VARCHAR(10), bossid INTEGER, FOREIGN KEY(bossid) REFERENCES boss (id), UNIQUE(name)); INSERT INTO boss (id, name) VALUES (1, 'phb'); INSERT INTO employee (id, name, bossid) VALUES (2,'dilbert', 1); INSERT INTO employee (id, name, bossid) VALUES (3, 'wally', null); /*c2*/SELECT * FROM employee e LEFT JOIN boss b ON (b.id=e.bossid); /*c2*/SELECT * FROM employee e LEFT JOIN boss b ON (b.id=e.bossid AND e.name='dilbert'); /*c2*/SELECT * FROM employee e LEFT JOIN boss b ON (b.id=e.bossid AND b.name='dilbert'); --bug #959678 CREATE CACHED TABLE propertyvalue ( id INT, name CHAR(36), value VARCHAR(255)); INSERT INTO propertyvalue VALUES (1, 'title', 'Foo'); INSERT INTO propertyvalue VALUES (2, 'title', 'Bar'); /*r 2,2,Bar */ SELECT * FROM (SELECT id FROM propertyvalue WHERE name = 'title') AS id LEFT JOIN (SELECT id, value FROM propertyvalue WHERE name = 'title') AS title ON id.id = title.id WHERE title.value != 'Foo' --bug #1018584 drop table a if exists; drop table b if exists; create table a (aid int, id int); create table b (bid int, aid int); insert into a (aid,id) values (1,1); insert into a (aid,id) values (2,1); insert into a (aid,id) values (3,2); insert into a (aid,id) values (4,2); insert into b (bid,aid) values (1,1); insert into b (bid,aid) values (2,1); /*c0*/select * from b left outer join a on b.aId = a.aId where Id =10; create index idx_test on a (ID); /*c0*/select * from b left outer join a on b.aId = a.aId where Id =10; /*c2*/select * from b left outer join a on b.aId = a.aId and Id =10; --bug #1027143 drop table testc if exists; drop table testb if exists; drop table testa if exists; create table testa (oid int, name varchar(20)); create table testb (oid int, name varchar(20), a_oid int); insert into testa (oid, name) values(1, 'first'); insert into testa (oid, name) values(2, 'second'); insert into testa (oid, name) values(3, 'third'); insert into testa (oid, name) values(4, 'fourth'); insert into testb (oid, name, a_oid) values(21,'first', 1); insert into testb (oid, name, a_oid) values(22,'second', null); insert into testb (oid, name, a_oid) values(23,'third', 2); insert into testb (oid, name, a_oid) values(24,'fourth', null); insert into testb (oid, name, a_oid) values(25,'fifth', 3); insert into testb (oid, name, a_oid) values(26,'sixth', null); /*r 1,first,21,first,1 2,second,23,third,2 3,third,25,fifth,3 4,fourth,NULL,NULL,NULL */ select * from testa a LEFT OUTER JOIN testb b ON a.oid = b.a_oid create index idx3 on testb(a_oid) /*r 1,first,21,first,1 2,second,23,third,2 3,third,25,fifth,3 4,fourth,NULL,NULL,NULL */ select * from testa a LEFT OUTER JOIN testb b ON a.oid = b.a_oid -- tests with OR in LEFT outer join condition drop table a if exists; drop table b if exists; create table a (a1 varchar(10), a2 integer); create table b (b1 varchar(10), b2 integer); insert into a values(null,12); insert into a values('a',22); insert into a values('b','32'); insert into b values(null,14); insert into b values('a',14); insert into b values('c',15); -- should return 3 rows: /*r NULL,12,NULL,14 a,22,a,14 b,32,NULL,NULL */select * from a left outer join b on ((a.a1=b.b1) or (a.a1 is null and b.b1 is null)) order by a1 -- should return 2 rows: /*r NULL,12,NULL,14 a,22,a,14 */select * from a left outer join b on (1=1) where ((a.a1=b.b1) or (a.a1 is null and b.b1 is null)) order by a1 -- should return 1 row: /*r a,22,a,14 */select * from a left outer join b on (1=1) where a.a1=b.b1 order by a1 -- should return 3 rows: /*r NULL,12,NULL,NULL a,22,a,14 b,32,NULL,NULL */select * from a left outer join b on a.a1=b.b1 where (1=1) order by a1 /*r NULL,12,NULL,NULL a,22,a,14 b,32,NULL,NULL */select * from a left outer join b on a.a1=b.b1 order by a1 -- add an index and retest create index idxa on a(a2); /*r NULL,12,NULL,NULL a,22,a,14 b,32,NULL,NULL */select * from a left outer join b on a.a1=b.b1 order by a1 -- tests with OR in RIGHT join condition drop table a if exists; drop table b if exists; create table a (a1 varchar(10), a2 integer); insert into a values(null,12); insert into a values('a',22); insert into a values('b','32'); create table b (b1 varchar(10), b2 integer); insert into b values(null,13); insert into b values('a',14); insert into b values('c',15); -- should return 3 rows: /*r NULL,NULL,c,15 NULL,12,NULL,13 a,22,a,14 */select * from a right outer join b on ((a.a1=b.b1) or (a.a1 is null and b.b1 is null)) order by a1, a2 -- should return 2 rows: /*r NULL,12,NULL,13 a,22,a,14 */select * from a right outer join b on (1=1) where ((a.a1=b.b1) or (a.a1 is null and b.b1 is null)) order by a1 -- should return 1 row: /*r a,22,a,14 */select * from a right outer join b on (1=1) where a.a1=b.b1 order by a1 -- should return 3 rows: /*r NULL,NULL,NULL,13 NULL,NULL,c,15 a,22,a,14 */select * from a right outer join b on a.a1=b.b1 where (1=1) order by a1 /*r NULL,NULL,NULL,13 NULL,NULL,c,15 a,22,a,14 */select * from a right outer join b on a.a1=b.b1 order by a1 -- add an index and retest create index idxa on a(a2); /*r NULL,NULL,NULL,13 NULL,NULL,c,15 a,22,a,14 */select * from a right outer join b on a.a1=b.b1 order by a1 /*r NULL,NULL NULL,NULL a,22 */select a.* from a right outer join b on a.a1=b.b1 order by a1 /*r NULL,13 c,15 a,14 */select b.* from a right outer join b on a.a1=b.b1 order by a1 --- CREATE TABLE names (name VARCHAR(20) PRIMARY KEY); CREATE TABLE params (name VARCHAR(20) PRIMARY KEY, value VARCHAR(20) NOT NULL); INSERT INTO names VALUES ('name1'); INSERT INTO names VALUES ('name2'); INSERT INTO params (name, value) VALUES ('name1', 'value1'); /*r name1,NULL name2,NULL */SELECT n.name, p.value FROM names n LEFT OUTER JOIN params p ON n.name = p.name AND p.value <> 'value1'; /*r name1,NULL name2,NULL */SELECT n.name, p.value FROM names n LEFT JOIN params p ON n.name = p.name AND p.value = 'value3'; --- CREATE MEMORY TABLE SUPER(PK INTEGER PRIMARY KEY,ASS CHARACTER(3)) CREATE MEMORY TABLE ASSOCIATED(PK CHARACTER(3),I INTEGER) CREATE MEMORY TABLE SUB(PK INTEGER PRIMARY KEY,ASS CHARACTER(3)) insert into sub values(1, 'mee') insert into super values(1, 'mee') insert into associated values('mee', 10) insert into associated values('you', 20) /*r 1,mee,mee NULL,NULL,you */select sub.pk, sub.ass, a.pk from Sub sub inner join Super super on sub.pk=super.pk right outer join Associated a on super.ass=a.pk order by 3 /*r 1,mee,mee NULL,NULL,you */select sub.pk, sub.ass, a.pk from Sub sub inner join Super super on sub.pk=super.pk full outer join Associated a on super.ass=a.pk order by 3 --- CREATE TABLE bremsen_dl_fzg ( bremsen_dl_id integer not null , lfd_nr integer not null , bremse_dl_fzgtyp char(1) , bremse_dl_art char(1) , bremse_dl_verf char(1) , bremse_dl_bauart varchar(4) , bremse_dl_typ char(1) , ort_bedienung varchar(4) , loesigkeit char(1) , beschreibung varchar(30) , bremse_dl_gew_id integer , uhrzeit_ende timestamp not null ); ALTER TABLE bremsen_dl_fzg add constraint pk_bremsen_dl_fzg primary key ( bremsen_dl_id , lfd_nr ); ALTER TABLE bremsen_dl_fzg add constraint chk_bremsen_dl_fzg check ( ( bremse_dl_fzgtyp is null or bremse_dl_fzgtyp in ( 'W', 'T', 't') ) and ( bremse_dl_art is null or bremse_dl_art in ( 'B', 'F') ) and ( bremse_dl_verf is null or bremse_dl_verf in ( 'D', 'H', 'M', 'W') ) and ( bremse_dl_bauart is null or bremse_dl_bauart in ( 'ALaH', 'ALaT', 'H2Lw', 'H3Lw') ) and ( bremse_dl_typ is null or bremse_dl_typ in ( 'D', 'B', 'S', 'H', 'K', 'F') ) and ( ort_bedienung is null or ort_bedienung in ( 'BO', 'ST', 'BOST') ) and ( loesigkeit is null or loesigkeit in ( 'e', 'm', 'M') ) ); CREATE TABLE bremsen_dl_gewichte ( bremse_dl_gew_id integer not null , lfd_nr integer not null , bremse_stellung varchar(2) , gewicht_brutto float , gewicht_bremse float , uhrzeit_ende timestamp not null ); ALTER TABLE bremsen_dl_gewichte add constraint pk_bremsen_dl_gewichte primary key ( bremse_dl_gew_id , lfd_nr ); ALTER TABLE bremsen_dl_gewichte add constraint chk_bremsen_dl_gewichte check ( ( bremse_stellung is null or bremse_stellung in ( 'G', 'GE', 'P', 'PE', 'R') ) ); CREATE VIEW lok_bremse_lfdnr1_view ( bremsen_dl_id, bremse_dl_gew_id, bremse_dl_art, bremse_dl_verf, bremse_dl_bauart, bremse_dl_typ, ort_bedienung, loesigkeit, beschreibung, gewicht_bremse_g, gewicht_bremse_p, gewicht_bremse_r) as select br.bremsen_dl_id, br.bremse_dl_gew_id, br.bremse_dl_art, br.bremse_dl_verf, br.bremse_dl_bauart, br.bremse_dl_typ, br.ort_bedienung, br.loesigkeit, br.beschreibung, gew_g.gewicht_bremse, gew_p.gewicht_bremse, gew_r.gewicht_bremse from bremsen_dl_fzg br left join bremsen_dl_gewichte gew_g on br.bremse_dl_gew_id = gew_g.bremse_dl_gew_id and gew_g.bremse_stellung = 'G' and gew_g.gewicht_bremse IS NOT NULL left join bremsen_dl_gewichte gew_p on br.bremse_dl_gew_id = gew_p.bremse_dl_gew_id and gew_p.bremse_stellung = 'P' and gew_p.gewicht_bremse IS NOT NULL left join bremsen_dl_gewichte gew_r on br.bremse_dl_gew_id = gew_r.bremse_dl_gew_id and gew_r.bremse_stellung = 'R' and gew_r.gewicht_bremse IS NOT NULL where br.lfd_nr = 1 AND br.bremse_dl_bauart IN( 'ALaH','H2Lw'); -- check for use of index in execution plan CREATE CACHED TABLE article ( id INTEGER IDENTITY, name VARCHAR(50)); CREATE CACHED TABLE salesorder_row ( id INTEGER IDENTITY, salesorder_id INTEGER, article_id INTEGER, needed DECIMAL(10,2), CONSTRAINT fk_salesorder_row_article FOREIGN KEY (article_id) REFERENCES article (id) ON DELETE CASCADE); CREATE INDEX idx_salesorder_row_article ON salesorder_row (article_id); CREATE INDEX idx_salesorder_row_salesorder ON salesorder_row (salesorder_id); EXPLAIN PLAN FOR SELECT article.name, salesorder_row.needed FROM salesorder_row LEFT JOIN article ON salesorder_row.article_id = article.id WHERE (salesorder_row.salesorder_id = 1234) hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfNoDmlBug1.txt0000644000175000017500000000065212007547344023040 0ustar renerene-- Tests a bug where with write_delay of 0, DML is not persisted until and -- if DML is committed or DB is "shutdown". If DB stops with no shutdown, -- all work is lost. --/*u0*/SET write_delay 0; /*u0*/CREATE SCHEMA ghostSchema AUTHORIZATION dba; /*u0*/SET SCHEMA ghostSchema; /*u0*/CREATE TABLE t1(i int); /*u0*/CREATE VIEW v1 AS SELECT * FROM t1; /*c0*/SELECT * FROM v1; /*c0*/SELECT * FROM t1; /*u0*/COMMIT; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfPersSchemA.txt0000644000175000017500000000130512007547344023276 0ustar renerene/*s*/DROP USER owner1; /*s*/DROP ROLE r1; /*s*/DROP SCHEMA schema_a; /*s*/DROP SCHEMA schema_b; /*s*/DROP SCHEMA schema_c; /*s*/DROP SCHEMA schema_z; -- Test basic ability to create schemas owned by individual DBAs, -- non-privileged users, and roles. /*u0*/CREATE USER owner1 password "pwerd"; /*u0*/CREATE USER adminowner1 password "pwerd"; /*u0*/CREATE ROLE r1; /*u0*/GRANT r1 TO owner1; /*u0*/CREATE SCHEMA schema_a AUTHORIZATION owner1; /*u0*/CREATE SCHEMA schema_b AUTHORIZATION r1; /*u0*/CREATE SCHEMA schema_c AUTHORIZATION adminowner1; /*e*/CREATE SCHEMA schema_z AUTHORIZATION nosuchowner; /*u0*/DROP SCHEMA schema_c; /*u0*/DROP USER adminowner1; /*u0*/ SHUTDOWN IMMEDIATELY; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfStoredProcedure.txt0000644000175000017500000003075312007547346024430 0ustar renerene-- AUXILIAR TABLES + DECLARES DROP TABLE tt1 IF EXISTS; DROP TABLE tt2 IF EXISTS; DECLARE test_retval INT DEFAULT NULL; CREATE Cached TABLE tt1( ID INTEGER NOT NULL PRIMARY KEY, tt2ref INTEGER ); CREATE Cached TABLE tt2( ID INTEGER NOT NULL PRIMARY KEY ); ALTER TABLE tt1 ADD CONSTRAINT fk2 FOREIGN KEY (tt2ref) REFERENCES tt2(ID); -- CREATE SIMPLE PROCEDURES - INVALID DROP PROCEDURE procedure_test IF EXISTS; -- Exception no body /*e*/CREATE PROCEDURE procedure_test() MODIFIES SQL DATA BEGIN ATOMIC END -- Exception no exists - in call + in drop /*e*/CREATE PROCEDURE procedure_test() MODIFIES SQL DATA BEGIN ATOMIC END -- Exception no body /*e*/DROP PROCEDURE procedure_test /*e*/call procedure_test() -- Exception invalid parameter - reserved word /*e*/CREATE PROCEDURE procedure_test(IN value INTEGER) MODIFIES SQL DATA BEGIN ATOMIC SET val = val + 1; END -- Exception no body /*e*/DROP PROCEDURE procedure_test /*e*/call procedure_test() -- CREATE SIMPLE PROCEDURES -- Empty procedure CREATE PROCEDURE procedure_test() MODIFIES SQL DATA BEGIN ATOMIC DECLARE temp INT; SET temp = 10; END call procedure_test() DROP PROCEDURE procedure_test -- Empty procedure - IN parameter CREATE PROCEDURE procedure_test(IN val INTEGER) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu INT DEFAULT 1; SET valu = val + 1; END call procedure_test(20) DROP PROCEDURE procedure_test -- Empty procedure - INT parameter + OUT parameter CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC SET retval = val + 1; END CALL procedure_test(20, test_retval); /*r21*/CALL test_retval; DROP PROCEDURE procedure_test -- Empty procedure - INTOUT parameter CREATE PROCEDURE procedure_test(INOUT val INTEGER) MODIFIES SQL DATA BEGIN ATOMIC SET val = val + 1; END SET test_retval=20; CALL procedure_test(test_retval); /*r21*/CALL test_retval; DROP PROCEDURE procedure_test -- PROCEDURES - BASIC SQL OPERATIONS -- simple procedure return select CREATE PROCEDURE procedure_test(OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC SELECT id INTO retval FROM tt2; END INSERT INTO tt2(ID) VALUES(1); call procedure_test(test_retval) /*r1*/CALL test_retval; DROP PROCEDURE procedure_test -- simple procedure test insert CREATE PROCEDURE procedure_test(OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC DELETE FROM tt2; INSERT INTO tt2(ID) VALUES(1); INSERT INTO tt2(ID) VALUES(2); SELECT COUNT(id) INTO retval FROM tt2; END call procedure_test(test_retval) /*r2*/CALL test_retval; /*r2*/SELECT COUNT(*) FROM tt2; CREATE USER PUSER PASSWORD '' GRANT CHANGE_AUTHORIZATION TO PUSER GRANT EXECUTE ON ROUTINE procedure_test TO puser SET SESSION AUTHORIZATION 'PUSER' CALL procedure_test(test_retval) /*r2*/CALL test_retval; CONNECT USER SA PASSWORD '' /*r2*/SELECT COUNT(*) FROM tt2; REVOKE EXECUTE ON ROUTINE procedure_test FROM puser CASCADE SET SESSION AUTHORIZATION 'PUSER' /*e*/CALL procedure_test(test_retval) CONNECT USER SA PASSWORD '' DROP PROCEDURE procedure_test -- PROCEDURES - VARIABLES -- simple procedure asignment CREATE PROCEDURE procedure_test(OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE temp INT; SET temp = 10; SET retval = temp; END call procedure_test(test_retval) /*r10*/CALL test_retval; DROP PROCEDURE procedure_test -- simple add CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE temp INT; SET temp = 10; SET retval = val + temp; END call procedure_test(5, test_retval) /*r15*/CALL test_retval; DROP PROCEDURE procedure_test -- simple substract CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE temp INT; SET temp = 1; SET retval = val - temp; END call procedure_test(5, test_retval) /*r4*/CALL test_retval; DROP PROCEDURE procedure_test -- simple multiply CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE temp INT; SET temp = 25; SET retval = val * temp; END call procedure_test(5, test_retval) /*r125*/CALL test_retval; DROP PROCEDURE procedure_test -- simple division CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE temp INT; SET temp = 5; SET retval = val / temp; END call procedure_test(22, test_retval) /*r4*/CALL test_retval; DROP PROCEDURE procedure_test -- PROCEDURES - CONDITIONS -- simple IF CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC SET retval = 0; IF val = 1 THEN SET retval = 21; END IF; END call procedure_test(0, test_retval) /*r0*/CALL test_retval; call procedure_test(1, test_retval) /*r21*/CALL test_retval; call procedure_test(2, test_retval) /*r0*/CALL test_retval; call procedure_test(200, test_retval) /*r0*/CALL test_retval; call procedure_test(-23, test_retval) /*r0*/CALL test_retval; DROP PROCEDURE procedure_test -- simple IF/ELSE CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC SET retval = 0; IF val = 1 THEN SET retval = 21; ELSE SET retval = 55; END IF; END call procedure_test(0, test_retval) /*r55*/CALL test_retval; call procedure_test(1, test_retval) /*r21*/CALL test_retval; call procedure_test(2, test_retval) /*r55*/CALL test_retval; call procedure_test(200, test_retval) /*r55*/CALL test_retval; call procedure_test(-23, test_retval) /*r55*/CALL test_retval; DROP PROCEDURE procedure_test -- simple IF/ELSEIF/ELSE CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE temp INT; IF val = 1 THEN SET retval = 21; ELSEIF val = 2 THEN SET retval = 55; ELSE SET retval = 100; END IF; END call procedure_test(0, test_retval) /*r100*/CALL test_retval; call procedure_test(1, test_retval) /*r21*/CALL test_retval; call procedure_test(2, test_retval) /*r55*/CALL test_retval; call procedure_test(3, test_retval) /*r100*/CALL test_retval; call procedure_test(200, test_retval) /*r100*/CALL test_retval; call procedure_test(-23, test_retval) /*r100*/CALL test_retval; DROP PROCEDURE procedure_test -- simple CASE CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC SET retval = 0; CASE val WHEN 1 THEN SET retval = 21; END CASE; END call procedure_test(0, test_retval) /*r0*/CALL test_retval; call procedure_test(1, test_retval) /*r21*/CALL test_retval; call procedure_test(2, test_retval) /*r0*/CALL test_retval; call procedure_test(200, test_retval) /*r0*/CALL test_retval; call procedure_test(-23, test_retval) /*r0*/CALL test_retval; DROP PROCEDURE procedure_test -- simple CASE - multivalue CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC SET retval = 0; CASE val WHEN 1,2 THEN SET retval = 21; END CASE; END call procedure_test(0, test_retval) /*r0*/CALL test_retval; call procedure_test(1, test_retval) /*r21*/CALL test_retval; call procedure_test(2, test_retval) /*r21*/CALL test_retval; call procedure_test(3, test_retval) /*r0*/CALL test_retval; call procedure_test(200, test_retval) /*r0*/CALL test_retval; call procedure_test(-23, test_retval) /*r0*/CALL test_retval; DROP PROCEDURE procedure_test -- simple CASE - multivalue CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC SET retval = 0; CASE val WHEN 1,2 THEN SET retval = 21; WHEN IN (3, 4, 5) THEN SET retval = 55; END CASE; END call procedure_test(0, test_retval) /*r0*/CALL test_retval; call procedure_test(1, test_retval) /*r21*/CALL test_retval; call procedure_test(2, test_retval) /*r21*/CALL test_retval; call procedure_test(3, test_retval) /*r55*/CALL test_retval; call procedure_test(4, test_retval) /*r55*/CALL test_retval; call procedure_test(5, test_retval) /*r55*/CALL test_retval; call procedure_test(6, test_retval) /*r0*/CALL test_retval; call procedure_test(200, test_retval) /*r0*/CALL test_retval; call procedure_test(-23, test_retval) /*r0*/CALL test_retval; DROP PROCEDURE procedure_test -- simple CASE - multivalue (repeated) CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC SET retval = 0; CASE val WHEN 1,2 THEN SET retval = 21; WHEN IN (2, 3, 5) THEN SET retval = 55; END CASE; END call procedure_test(0, test_retval) /*r0*/CALL test_retval; call procedure_test(1, test_retval) /*r21*/CALL test_retval; call procedure_test(2, test_retval) /*r21*/CALL test_retval; call procedure_test(3, test_retval) /*r55*/CALL test_retval; call procedure_test(4, test_retval) /*r0*/CALL test_retval; call procedure_test(5, test_retval) /*r55*/CALL test_retval; call procedure_test(6, test_retval) /*r0*/CALL test_retval; call procedure_test(200, test_retval) /*r0*/CALL test_retval; call procedure_test(-23, test_retval) /*r0*/CALL test_retval; DROP PROCEDURE procedure_test -- simple CASE - multivalue & else CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC CASE val WHEN 1,2 THEN SET retval = 21; WHEN IN (2, 3, 5) THEN SET retval = 55; ELSE SET retval = 101; END CASE; END call procedure_test(0, test_retval) /*r101*/CALL test_retval; call procedure_test(1, test_retval) /*r21*/CALL test_retval; call procedure_test(2, test_retval) /*r21*/CALL test_retval; call procedure_test(3, test_retval) /*r55*/CALL test_retval; call procedure_test(4, test_retval) /*r101*/CALL test_retval; call procedure_test(5, test_retval) /*r55*/CALL test_retval; call procedure_test(6, test_retval) /*r101*/CALL test_retval; call procedure_test(200, test_retval) /*r101*/CALL test_retval; call procedure_test(-23, test_retval) /*r101*/CALL test_retval; DROP PROCEDURE procedure_test; -- PROCEDURES -- BUCLES -- simple WHILE CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE counter INT; DECLARE temp INT; SET counter = val; SET temp = 0; WHILE counter < 10 DO SET temp = temp + counter; SET counter = counter + 1; END WHILE; SET retval = temp; END call procedure_test(0, test_retval) /*r45*/CALL test_retval; call procedure_test(5, test_retval) /*r35*/CALL test_retval; call procedure_test(10, test_retval) /*r0*/CALL test_retval; call procedure_test(100, test_retval) /*r0*/CALL test_retval; DROP PROCEDURE procedure_test; -- simple REPEAT CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE counter INT; DECLARE temp INT; SET counter = val; SET temp = 0; REPEAT SET temp = temp + counter; SET counter = counter + 1; UNTIL counter >= 10 END REPEAT; SET retval = temp; END call procedure_test(0, test_retval) /*r45*/CALL test_retval; call procedure_test(5, test_retval) /*r35*/CALL test_retval; call procedure_test(10, test_retval) /*r10*/CALL test_retval; call procedure_test(100, test_retval) /*r100*/CALL test_retval; DROP PROCEDURE procedure_test; -- simple REPEAT with infinite loop CREATE PROCEDURE procedure_test(IN val INT, OUT retval INT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE counter INT; DECLARE temp INT; SET counter = val; SET temp = 0; REPEAT SET temp = temp + counter; SET counter = counter + 1; UNTIL counter < 10 END REPEAT; SET retval = temp; END call procedure_test(0, test_retval) /*r0*/CALL test_retval; call procedure_test(5, test_retval) /*r5*/CALL test_retval; -- infinite loop --/*e*/call procedure_test(10, test_retval) DROP PROCEDURE procedure_test; -- CREATE PROCEDURE procedure_test(INOUT val INT) READS SQL DATA DYNAMIC RESULT SETS 1 BEGIN ATOMIC declare curs cursor for select table_schema, table_name from information_schema.tables where table_name='LOB_IDS' and table_schema='SYSTEM_LOBS'; select count(*) into val from information_schema.columns where table_name='LOB_IDS' and table_schema='SYSTEM_LOBS'; open curs; END CREATE PROCEDURE test_proc(INOUT val_p INT, IN lastname_p VARCHAR(20)) MODIFIES SQL DATA BEGIN ATOMIC SET val_p = 0; for_label: FOR SELECT * FROM customer WHERE lastname = lastname_p DO IF val_p > 0 THEN DELETE FROM customer WHERE customer.id = id; END IF; SET val_p = val_p + 1; END FOR for_label; END hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfTrimSimplified.txt0000644000175000017500000000136212007547346024232 0ustar renerene-- TestSelfTrimSimplified.txt -- -- trim looks different drop table testtable if exists; create cached table testtable ( aString varchar(256) not null, firstNum integer not null, aDate date not null, secondNum integer not null, thirdNum integer not null, aName varchar(32) not null ); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values (' XYZ ', 22, '2003-11-10', 18, 3, 'my name goes here'); /*rXYZ*/select trim(aString) from testtable; drop table testtable; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfCreate.txt0000644000175000017500000001103412007547346022511 0ustar renerene-- -- TestSelfCreate.txt -- -- TestSelfCreate.txt is used by TestSelf.java to test the database -- -- This is part of a three part suite of scripts to test persistence in the same DB -- -- Comment lines must start with -- and are ignored -- Lines starting with spaces belongs to last line -- Checked lines start with comments containing where is: -- c ResultSet expects a with columns -- r ResultSet expected with result in first row/column -- u Update count expected -- e Exception must occur -- Correct handling of index creation for foreign keys create cached table VEREIN ( VCODE CHAR(10) not null, primary key (VCODE) ); -- a no-op create unique index VEREIN_PK on VEREIN (VCODE); create cached table BEWERB ( VCODE CHAR(10) not null, ID SMALLINT not null , primary key (ID) ); -- a no-op create unique index BEWERB_FK2 on BEWERB(ID); -- a no-op create unique index BEWERB_FK1 on BEWERB(VCODE); alter table BEWERB add constraint bv foreign key (VCODE) references VEREIN(VCODE); -- forward FK with index CREATE Cached TABLE t1( ID INTEGER NOT NULL PRIMARY KEY, t2ref INTEGER ); CREATE Cached TABLE t2( ID INTEGER NOT NULL PRIMARY KEY ); CREATE INDEX idx on t1(t2ref); ALTER TABLE t1 ADD CONSTRAINT fk1 FOREIGN KEY (t2ref) REFERENCES t2(ID); -- forward FK with no index CREATE Cached TABLE tt1( ID INTEGER NOT NULL PRIMARY KEY, tt2ref INTEGER ); CREATE Cached TABLE tt2( ID INTEGER NOT NULL PRIMARY KEY ); ALTER TABLE tt1 ADD CONSTRAINT fk2 FOREIGN KEY (tt2ref) REFERENCES tt2(ID); -- column default values - scripting test CREATE TABLE TDEF1 ( I1 IDENTITY, C1 CHAR DEFAULT '-', C2 CHAR(10) DEFAULT 'hsqldb', I3 INTEGER DEFAULT -1, D4 DOUBLE DEFAULT -0.3e-5, T5 TIMESTAMP DEFAULT CURRENT_TIMESTAMP, T6 TIME DEFAULT current_time, D7 DATE DEFAULT current_date, D8 VARCHAR(10) DEFAULT current_user ); CREATE TABLE TDEF2 ( B1 BOOLEAN DEFAULT TRUE, B2 BOOLEAN DEFAULT 'false', T5 TIMESTAMP DEFAULT '1999-12-01 21:30:00', T6 TIME DEFAULT '23:12:01', T7 DATE DEFAULT '2002-02-15' ); INSERT INTO TDEF1 (I3) VALUES (0); INSERT INTO TDEF1 (D4) VALUES (0); INSERT INTO TDEF2 (B1) VALUES (FALSE); INSERT INTO TDEF2 (T7) VALUES (NULL); --bug #824031 --scripting test for order of indexes CREATE CACHED TABLE APP ( VARIANT_ID INTEGER NOT NULL, APP_ID INTEGER NOT NULL, APP_NAME VARCHAR (35) NOT NULL, CONSTRAINT PK_APP PRIMARY KEY( VARIANT_ID)); CREATE INDEX APP ON APP(APP_ID); ALTER TABLE APP ADD CONSTRAINT APP_IX1 UNIQUE( APP_NAME); INSERT INTO APP VALUES (1, 1, 'Shelly'); INSERT INTO APP VALUES (2, 2, 'Eran'); /*c1*/SELECT * FROM APP WHERE APP_NAME = 'Shelly'; /*c1*/SELECT * FROM APP WHERE APP_NAME = 'Eran'; --test identity increment CREATE CACHED TABLE APP2 ( ID BIGINT NOT NULL IDENTITY, VALUE INTEGER NOT NULL) INSERT INTO APP2 (VALUE) VALUES(10); --test update with no primary key DROP TABLE FILE IF EXISTS; CREATE TABLE FILE(ID VARCHAR(10), NAME VARCHAR(10), DESCRIPTION VARCHAR(10), FIELD1 INT, FIELD2 VARCHAR(10)); /*c0*/select * from file; insert into file(id, name) values('14', 'dir'); /*c1*/select * from file; update file set name = 'newdir' where id = '14'; /*r 14,newdir,NULL,NULL,NULL */select * from file; --test TEMP TABLE create TEMPORARY TABLE TTEMP(C CHAR) ON COMMIT PRESERVE ROWS; create TEMPORARY TABLE TTEMP2(C CHAR) ON COMMIT DELETE ROWS; --test VIEW persistence with quoted column names create table "TView" ("First Column" int, "Second Column" bigint); create view "View" ("Id", "The Name", "The Description") as select ID,NAME,DESCRIPTION FROM FILE; create view "View2" as select ID,NAME "The Name",DESCRIPTION "The Description" FROM FILE; create view "View3" as select "First Column", "Second Column" from "TView"; --test inline column check constraints create table TCONST (COLA INT UNIQUE CHECK(COLA < 10), COLB INT UNIQUE CHECK(COLB > 10)) --test separate identity and primary key create table TIDENT (COLA INT PRIMARY KEY, COLB INT GENERATED BY DEFAULT AS IDENTITY(INCREMENT BY 1 START WITH 0)) insert into tident values (10, default); insert into tident values (11, default); insert into tident values (12, default); /*e*/insert into tident values (10, default); /*c3*/select * from tident /*r 10,0 11,1 12,2 */select * from tident order by cola -- SHUTDOWN is necessary for test1 SHUTDOWN IMMEDIATELY; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfRoleNesting.txt0000644000175000017500000001515712007547344023547 0ustar renerene-- First with a table grant /*s*/DROP USER peon1; /*s*/DROP USER peon2; /*s*/DROP USER peon3; /*s*/DROP ROLE r1; /*s*/DROP ROLE r2; /*s*/DROP ROLE r3; /*s*/DROP ROLE r12; DROP TABLE t1 IF exists; DROP TABLE t2 IF exists; DROP TABLE t3 IF exists; DROP TABLE t4 IF exists; CREATE TABLE t1(i int); CREATE TABLE t2(i int); CREATE TABLE t3(i int); CREATE TABLE t4(i int); INSERT INTO t1 VALUES(1); INSERT INTO t2 VALUES(2); INSERT INTO t3 VALUES(3); INSERT INTO t4 VALUES(4); COMMIT; CREATE USER peon1 PASSWORD password; CREATE USER peon2 PASSWORD password; CREATE USER peon3 PASSWORD password; /*u0*/GRANT CHANGE_AUTHORIZATION TO peon1; /*u0*/GRANT CHANGE_AUTHORIZATION TO peon2; /*u0*/GRANT CHANGE_AUTHORIZATION TO peon3; /*u0*/CREATE ROLE r1; /*u0*/CREATE ROLE r2; /*u0*/CREATE ROLE r3; /*u0*/GRANT r3 TO r2; /*u0*/GRANT r2 TO r1; -- Same role may be nested under the same user/role multiple times. /*u0*/GRANT r3 TO r1; /*u0*/REVOKE r3 FROM r1 RESTRICT; /*u0*/GRANT r1 TO peon1; -- Circular nesting not allowed. /*e*/GRANT r1 TO r3; CONNECT USER peon1 PASSWORD password; /*e*/SELECT * FROM t1; CONNECT USER SA PASSWORD ""; /*u0*/GRANT SELECT on t1 TO r3; CONNECT USER peon1 PASSWORD password; /*c1*/SELECT * FROM t1; CONNECT USER SA PASSWORD ""; /*u0*/REVOKE ALL ON t1 FROM r3 RESTRICT; CONNECT USER peon1 PASSWORD password; /*e*/SELECT * FROM t1; CONNECT USER SA PASSWORD ""; /*u0*/GRANT SELECT ON t1 TO r3; CONNECT USER peon1 PASSWORD password; /*c1*/SELECT * FROM t1; CONNECT USER SA PASSWORD ""; /*u0*/DROP ROLE r3; CONNECT USER peon1 PASSWORD password; /*e*/SELECT * FROM t1; -- Now with Admin priv CONNECT USER SA PASSWORD ""; /*s*/DROP USER peon1; /*s*/DROP USER peon2; /*s*/DROP USER peon3; /*s*/DROP ROLE r1; /*s*/DROP ROLE r2; /*s*/DROP ROLE r3; /*s*/DROP ROLE r12; DROP TABLE t1 IF exists; CREATE TABLE t1(i int); INSERT INTO t1 VALUES(1); COMMIT; CREATE USER peon1 PASSWORD password; CREATE USER peon2 PASSWORD password; CREATE USER peon3 PASSWORD password; /*u0*/GRANT CHANGE_AUTHORIZATION TO peon1; /*u0*/GRANT CHANGE_AUTHORIZATION TO peon2; /*u0*/GRANT CHANGE_AUTHORIZATION TO peon3; /*u0*/CREATE ROLE r1; /*u0*/CREATE ROLE r2; /*u0*/CREATE ROLE r3; /*u0*/GRANT r3 TO r2; /*u0*/GRANT r2 TO r1; /*u0*/GRANT r1 TO peon1; CONNECT USER peon1 PASSWORD password; /*e*/SET TABLE t1 READONLY false; CONNECT USER SA PASSWORD ""; /*u0*/GRANT dba TO r3; CONNECT USER peon1 PASSWORD password; /*u0*/SET TABLE t1 READONLY false; CONNECT USER SA PASSWORD ""; /*e*/REVOKE dba FROM r1 RESTRICT; /*e*/REVOKE dba FROM r2 RESTRICT; /*u0*/REVOKE dba FROM r3 RESTRICT; CONNECT USER peon1 PASSWORD password; /*e*/SET TABLE t1 READONLY false; CONNECT USER SA PASSWORD ""; /*u0*/GRANT dba TO r3; CONNECT USER peon1 PASSWORD password; /*u0*/SET TABLE t1 READONLY false; CONNECT USER SA PASSWORD ""; /*e*/DROP ROLE dba; -- Massively redundant privileges CONNECT USER SA PASSWORD ""; DROP TABLE t1 IF exists; CREATE TABLE t1(i int); /*s*/DROP USER peon1; /*s*/DROP ROLE r1; /*s*/DROP ROLE r2; /*s*/DROP ROLE r3; /*s*/DROP ROLE r31; /*s*/DROP ROLE r311; /*u0*/CREATE ROLE r1; /*u0*/CREATE ROLE r2; /*u0*/CREATE ROLE r3; /*u0*/CREATE ROLE r31; /*u0*/CREATE ROLE r311; /*u0*/GRANT r31 to r3; /*u0*/GRANT dba TO r1; /*u0*/GRANT dba TO r2; /*u0*/GRANT dba TO r3; /*u0*/GRANT dba TO r31; /*u0*/GRANT dba TO r311; /*u0*/GRANT r311 TO r31; CREATE USER peon1 PASSWORD password ADMIN; /*u0*/GRANT CHANGE_AUTHORIZATION TO peon1; CONNECT USER sa PASSWORD ""; /*u0*/GRANT r1 TO peon1; /*u0*/GRANT r2 TO peon1; /*u0*/GRANT r3 TO peon1; /*u0*/GRANT r31 TO peon1; /*u0*/GRANT r311 TO peon1; CONNECT USER peon1 PASSWORD password; /*u0*/SET TABLE t1 READONLY false; -- Start revoking, piecemeal CONNECT USER sa PASSWORD ""; /*u0*/REVOKE dba FROM peon1 RESTRICT; CONNECT USER peon1 PASSWORD password; /*u0*/SET TABLE t1 READONLY false; CONNECT USER sa PASSWORD ""; /*u0*/REVOKE r1 FROM peon1 RESTRICT; CONNECT USER peon1 PASSWORD password; /*u0*/SET TABLE t1 READONLY false; CONNECT USER sa PASSWORD ""; /*u0*/DROP ROLE r2; CONNECT USER peon1 PASSWORD password; /*u0*/SET TABLE t1 READONLY false; CONNECT USER sa PASSWORD ""; /*u0*/REVOKE r311 FROM peon1 RESTRICT; CONNECT USER peon1 PASSWORD password; /*u0*/SET TABLE t1 READONLY false; CONNECT USER sa PASSWORD ""; /*u0*/REVOKE r3 FROM peon1 RESTRICT; CONNECT USER peon1 PASSWORD password; /*u0*/SET TABLE t1 READONLY false; CONNECT USER sa PASSWORD ""; /*u0*/REVOKE r31 FROM peon1 RESTRICT; CONNECT USER peon1 PASSWORD password; /*e*/SET TABLE t1 READONLY false; -- Ditto for table privilege CONNECT USER SA PASSWORD ""; DROP TABLE t1 IF exists; CREATE TABLE t1(i int); /*u1*/INSERT INTO t1 VALUES(1); COMMIT; /*s*/DROP USER peon1; /*s*/DROP ROLE r1; /*s*/DROP ROLE r2; /*s*/DROP ROLE r3; /*s*/DROP ROLE r31; /*s*/DROP ROLE r311; /*u0*/CREATE ROLE r1; /*u0*/CREATE ROLE r2; /*u0*/CREATE ROLE r3; /*u0*/CREATE ROLE r31; /*u0*/CREATE ROLE r311; /*u0*/GRANT r31 to r3; /*u0*/GRANT SELECT ON t1 TO r1; /*u0*/GRANT SELECT ON t1 TO r2; /*u0*/GRANT SELECT ON t1 TO r3; /*u0*/GRANT SELECT ON t1 TO r31; /*u0*/GRANT SELECT ON t1 TO r311; /*u0*/GRANT r311 TO r31; CREATE USER peon1 PASSWORD password; /*u0*/GRANT CHANGE_AUTHORIZATION TO peon1; CONNECT USER peon1 PASSWORD password; /*e*/SELECT * FROM t1; CONNECT USER sa PASSWORD ""; /*u0*/GRANT SELECT ON t1 TO peon1; /*u0*/GRANT r1 TO peon1; /*u0*/GRANT r2 TO peon1; /*u0*/GRANT r3 TO peon1; /*u0*/GRANT r31 TO peon1; /*u0*/GRANT r311 TO peon1; CONNECT USER peon1 PASSWORD password; /*c1*/SELECT * FROM t1; -- Start revoking, piecemeal CONNECT USER sa PASSWORD ""; /*u0*/REVOKE SELECT ON t1 FROM peon1 RESTRICT; CONNECT USER peon1 PASSWORD password; /*c1*/SELECT * FROM t1; CONNECT USER sa PASSWORD ""; /*u0*/REVOKE r1 FROM peon1 RESTRICT; CONNECT USER peon1 PASSWORD password; /*c1*/SELECT * FROM t1; CONNECT USER sa PASSWORD ""; /*u0*/DROP ROLE r2; CONNECT USER peon1 PASSWORD password; /*c1*/SELECT * FROM t1; CONNECT USER sa PASSWORD ""; /*u0*/REVOKE r311 FROM peon1 RESTRICT; CONNECT USER peon1 PASSWORD password; /*c1*/SELECT * FROM t1; CONNECT USER sa PASSWORD ""; /*u0*/REVOKE r3 FROM peon1 RESTRICT; CONNECT USER peon1 PASSWORD password; /*c1*/SELECT * FROM t1; CONNECT USER sa PASSWORD ""; /*u0*/REVOKE r31 FROM peon1 RESTRICT; CONNECT USER peon1 PASSWORD password; /*e*/SELECT * FROM t1; CONNECT USER sa PASSWORD ""; /*s*/DROP ROLE r1 CASCADE; /*s*/DROP ROLE r2 CASCADE; /*s*/DROP ROLE r3 CASCADE; /*U0*/ Workaround for bug where DDL will not Commit /*s*/CREATE TABLE bug_workaround (i int); /*s*/INSERT INTO bug_workaround VALUES(1); /*u0*/SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfVerify.txt0000644000175000017500000000321112007547346022550 0ustar renerene-- -- TestSelfVerify.txt -- -- This is part of a three part suite of scripts to test persistence in the same DB -- Correct handling of index creation for foreign keys -- check the consistency of foreign keys and primary keys /*e*/create table VEREIN(VCODE CHAR(10) not null); /*e*/create table BEWERB(VCODE CHAR(10) not null, ID SMALLINT not null); /*e*/create unique index BEWERB_FK1 on BEWERB(VCODE); /*e*/alter table BEWERB add constraint bv foreign key (VCODE) references VEREIN (VCODE); -- fails as a uique indexes on verein and bewerb exist /*e*/create unique index VEREIN_PK on VEREIN (VCODE); /*e*/create unique index BEWERB_FK2 on BEWERB(ID); -- null value in not null column /*e*/insert into verein values (null); -- referential no matching row /*e*/insert into bewerb values ('aaaaaaa',18); -- duplicate row /*e*/insert into bewerb values ('hijklmn',7); -- referential integrity row has reference /*e*/delete from verein where vcode='opqrstu' --test identity increment INSERT INTO APP2 (VALUE) VALUES(13); INSERT INTO APP2 (VALUE) VALUES(14); /*r5,14*/ SELECT COUNT(ID), MAX(VALUE) FROM APP2 --test persistence of insert into operations /*c2*/SELECT * FROM NEWAPP WHERE APP_NAME = 'Eran'; /*c2*/SELECT * FROM NEWAPP WHERE APP_NAME = 'Shelly'; /*c4*/SELECT * FROM NEWAPP; --test correct persistent of view defined in TestSelfCreate.txt /*r 14,newdir,NULL */select * from "View" /*r 14,newdir,NULL */select * from "View2" --test INSERT .. INTO and indexes create cached table bewerb_copy as (select * from bewerb) with data; create index idx_bewerb_copy on bewerb_copy(VCODE,ID); /*u0*/SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSchemaPersistA2.txt0000644000175000017500000006444212007547346024256 0ustar renerene-- TEST OBJECTS -- This TESTS the schema-specific objects created in a previous script. -- (See the *C[12].txt scripts for similar tests of ALTER comands (which -- this script purposefully omits). CREATE USER otheruser PASSWORD otheruser; -- ****************************** MEM Tables /*c2*/SELECT * FROM tblt1; /*c1*/SELECT * FROM tblt1 WHERE i = 0; /*c2*/SELECT * FROM tblt1 WHERE i in (0, 1, 11, 12); /*c1*/SELECT * FROM tblt1 WHERE i < 1; /*c1*/SELECT * FROM tblt1 WHERE tblt1.i = (SELECT i FROM tblj1); /*c1*/SELECT * FROM tblt1 WHERE tblt1.i = (SELECT i FROM tblj1 WHERE tblj1.i = 1); /*c1*/SELECT * FROM tblt1 WHERE tblt1.i in (SELECT i FROM tblj1); /*c0*/SELECT * FROM tblt1 WHERE tblt1.i = (SELECT i FROM tblj1 WHERE i = 0); /*c1*/SELECT * FROM public.tblt1 WHERE tblt1.i = (SELECT i FROM tblj1); /*c1*/SELECT * FROM public.tblt1 WHERE tblt1.i in (SELECT i FROM tblj1); /*c1*/SELECT * FROM public.tblt1 WHERE tblt1.i = (SELECT i FROM tblj1 WHERE i = 1); /*c1*/SELECT * FROM tblt1 WHERE tblt1.i = (SELECT i FROM public.tblj1); /*c1*/SELECT * FROM tblt1 WHERE tblt1.i in (SELECT i FROM public.tblj1); /*c1*/SELECT * FROM tblt1 WHERE tblt1.i = (SELECT i FROM public.tblj1 WHERE i = 1); /*c1*/SELECT * FROM tblt1 WHERE tblt1.i = (SELECT tblj1.i FROM public.tblj1); /*c1*/SELECT * FROM tblt1 WHERE tblt1.i in (SELECT tblj1.i FROM tblj1); /*c1*/SELECT * FROM tblt1 WHERE tblt1.i = (SELECT tblj1.i FROM tblj1 WHERE i = 1); /*c1*/SELECT * FROM tblt1 WHERE tblt1.i = (SELECT i FROM public.tblj1 WHERE tblj1.i = 1); /*c1*/SELECT * FROM tblt1 WHERE tblt1.i = (SELECT tblj1.i FROM tblj1 WHERE tblj1.i = 1); /*c1*/SELECT * FROM tblt1 WHERE i = (SELECT i FROM tblj1); /*c1*/SELECT * FROM tblt1 WHERE i in (SELECT i FROM tblj1); /*c1*/SELECT * FROM tblt1 WHERE i = (SELECT i FROM tblj1 WHERE i = 1); /*c1*/SELECT * FROM public.tblt1 WHERE i = (SELECT i FROM tblj1); /*c1*/SELECT * FROM public.tblt1 WHERE i in (SELECT i FROM tblj1); /*c0*/SELECT * FROM public.tblt1 WHERE i = (SELECT i FROM tblj1 WHERE i = 0); /*c1*/SELECT * FROM tblt1 WHERE i = (SELECT i FROM public.tblj1); /*c1*/SELECT * FROM tblt1 WHERE i in (SELECT i FROM public.tblj1); /*c0*/SELECT * FROM tblt1 WHERE i = (SELECT i FROM public.tblj1 WHERE i = 0); /*c1*/SELECT * FROM tblt1 WHERE i = (SELECT tblj1.i FROM public.tblj1); /*c1*/SELECT * FROM tblt1 WHERE i in (SELECT tblj1.i FROM tblj1); /*c0*/SELECT * FROM tblt1 WHERE i = (SELECT tblj1.i FROM tblj1 WHERE i = 0); /*c1*/SELECT * FROM tblt1 WHERE i = (SELECT i FROM public.tblj1 WHERE tblj1.i = 1); /*c1*/SELECT * FROM tblt1 WHERE i = (SELECT tblj1.i FROM tblj1 WHERE tblj1.i = 1); /*e*/SELECT * FROM system_users WHERE user_name = 'SA'; /*e*/SELECT * FROM other.tblt1; /*e*/SELECT * FROM other.system_users; /*e*/SELECT * FROM information_schema.tblt1; /*e*/SELECT * FROM public.system_users; /*c2*/SELECT * FROM public.tblt1; /*c1*/SELECT * FROM information_schema.system_users WHERE user_name = 'SA'; /*c1*/SELECT * FROM public.tblt1 WHERE i = 0; /*e*/SELECT * FROM other.tblt1 WHERE i = 0; /*e*/SELECT * FROM information_schema.tblt1 WHERE i = 0; /*c1*/SELECT * FROM public.tblt1, public.tblj1 WHERE tblt1.i = tblj1.i; /*c1*/SELECT * FROM tblt1, public.tblj1 WHERE tblt1.i = tblj1.i; /*c1*/SELECT * FROM public.tblt1, tblj1 WHERE tblt1.i = tblj1.i; /*c1*/SELECT * FROM tblt1, tblj1 WHERE tblt1.i = tblj1.i; /*c1*/SELECT vc FROM public.tblt1, public.tblj1 WHERE tblt1.i = tblj1.i; /*c1*/SELECT vc FROM tblt1, public.tblj1 WHERE tblt1.i = tblj1.i; /*c1*/SELECT vc FROM public.tblt1, tblj1 WHERE tblt1.i = tblj1.i; /*c1*/SELECT vc FROM tblt1, tblj1 WHERE tblt1.i = tblj1.i; /*c1*/SELECT tblj1.vc FROM public.tblt1, public.tblj1 WHERE tblt1.i = tblj1.i; /*c1*/SELECT tblj1.vc FROM tblt1, public.tblj1 WHERE tblt1.i = tblj1.i; /*c1*/SELECT tblj1.vc FROM public.tblt1, tblj1 WHERE tblt1.i = tblj1.i; /*c1*/SELECT tblj1.vc FROM tblt1, tblj1 WHERE tblt1.i = tblj1.i; /*c1*/SELECT lbla.vc FROM tblt1, tblj1 lbla WHERE tblt1.i = lbla.i; /*c1*/SELECT tblj1.vc FROM tblt1 lblb, tblj1 WHERE lblb.i = tblj1.i; /*c1*/SELECT lbla.vc FROM tblt1 lblb, tblj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM public.tblt1, tblj1 lbla WHERE tblt1.i = lbla.i; /*c1*/SELECT tblj1.vc FROM public.tblt1 lblb, tblj1 WHERE lblb.i = tblj1.i; /*c1*/SELECT lbla.vc FROM public.tblt1 lblb, tblj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM tblt1, public.tblj1 lbla WHERE tblt1.i = lbla.i; /*c1*/SELECT tblj1.vc FROM tblt1 lblb, public.tblj1 WHERE lblb.i = tblj1.i; /*c1*/SELECT lbla.vc FROM tblt1 lblb, public.tblj1 lbla WHERE lblb.i = lbla.i; /*u0*/SET TABLE tblt1 READONLY true; /*e*/UPDATE tblt1 set i = 11 WHERE i = 1; /*u0*/SET TABLE public.tblt1 READONLY true; /*e*/SET TABLE information_schema.tblt1 READONLY true; /*e*/SET TABLE other.tblt1 READONLY true; /*u0*/SET TABLE tblt1 READONLY false; /*u0*/SET TABLE public.tblt1 READONLY false; /*c2*/SELECT i FROM tblt1; -- N.b.: Do not commit DML changes so that this whole block may be repeated. COMMIT; SET AUTOCOMMIT false; /*u1*/UPDATE tblt1 set i = 11 WHERE i = 1; /*u1*/UPDATE tblt1 set tblt1.i = 12 WHERE i = 11; /*u1*/UPDATE tblt1 set tblt1.i = 13 WHERE tblt1.i = 12; /*u1*/UPDATE public.tblt1 set i = 14 WHERE i = 13; /*u1*/UPDATE public.tblt1 set tblt1.i = 15 WHERE i = 14; /*u1*/UPDATE public.tblt1 set tblt1.i = 16 WHERE tblt1.i = 15; /*e*/UPDATE other.tblt1 set tblt1.i = 17 WHERE tblt1.i = 16; /*e*/UPDATE information_schema.tblt1 set tblt1.i = 17 WHERE tblt1.i = 16; /*u1*/UPDATE tblt1 ali set i = 17 WHERE i = 16; /*u1*/UPDATE tblt1 ali set ali.i = 18 WHERE i = 17; /*u1*/UPDATE tblt1 ali set ali.i = 19 WHERE ali.i = 18; /*u1*/UPDATE tblt1 ali set i = 20 WHERE ali.i = 19; /*u1*/UPDATE public.tblt1 ali set i = 21 WHERE i = 20; /*u1*/UPDATE public.tblt1 ali set ali.i = 22 WHERE i = 21; /*u1*/UPDATE public.tblt1 ali set ali.i = 23 WHERE ali.i = 22; /*u1*/UPDATE public.tblt1 ali set i = 24 WHERE ali.i = 23; /*e*/UPDATE other.tblt1 ali set i = 25 WHERE ali.i = 24; /*e*/UPDATE other.tblt1 ali set i = 25 WHERE .i = 24; /*e*/UPDATE other.tblt1 set i = 25 WHERE i = 24; /*e*/DELETE FROM other.tblt1 ali WHERE ali.i = 24; /*e*/DELETE FROM other.tblt1 ali; /*e*/DELETE FROM other.tblt1 set WHERE i = 24; /*e*/DELETE FROM other.tblt1 WHERE i = 24; /*e*/DELETE FROM system_information.tblj1 WHERE tblj1.i = 1; /*u1*/DELETE FROM tblt1 WHERE i = 0; /*u1*/DELETE FROM public.tblt1 WHERE i = 24; /*u1*/DELETE FROM public.tblj1 WHERE tblj1.i = 1; ROLLBACK; /*c2*/SELECT i FROM tblt1; /*u0*/GRANT ALL ON tblt1 TO otheruser; /*u0*/GRANT ALL ON public.tblt2 TO otheruser; /*e*/GRANT ALL ON other.tblt3 TO otheruser; /*e*/GRANT ALL ON information_schema.tblt3 TO otheruser; /*u0*/REVOKE ALL ON tblt1 FROM otheruser RESTRICT; /*u0*/REVOKE ALL ON public.tblt2 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON other.tblt3 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON information_schema.tblt3 FROM otheruser RESTRICT; /*e*/DROP TABLE other.tblt3; /*e*/DROP TABLE information_schema.tblt4; /*e*/DROP TABLE tblt101; /*e*/DROP TABLE public.tblt101; /*u0*/DROP TABLE tblt101 IF EXISTS; /*u0*/DROP TABLE public.tblt101 IF EXISTS; -- Should "DROP TABLE nonexistentschema.notable IF EXISTS" work? /*u0*/DROP TABLE other.system_users IF exists; /*u0*/DROP TABLE system_users IF exists; -- ****************************** CACH Tables /*c2*/SELECT * FROM ctblt1; /*c1*/SELECT * FROM ctblt1 WHERE i = 0; /*c2*/SELECT * FROM ctblt1 WHERE i in (0, 1, 11, 12); /*c1*/SELECT * FROM ctblt1 WHERE i < 1; /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT i FROM tblj1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT i FROM tblj1 WHERE tblj1.i = 1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i in (SELECT i FROM tblj1); /*c0*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT i FROM tblj1 WHERE i = 0); /*c1*/SELECT * FROM public.ctblt1 WHERE ctblt1.i = (SELECT i FROM tblj1); /*c1*/SELECT * FROM public.ctblt1 WHERE ctblt1.i in (SELECT i FROM tblj1); /*c1*/SELECT * FROM public.ctblt1 WHERE ctblt1.i = (SELECT i FROM tblj1 WHERE i = 1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT i FROM public.tblj1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i in (SELECT i FROM public.tblj1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT i FROM public.tblj1 WHERE i = 1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT tblj1.i FROM public.tblj1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i in (SELECT tblj1.i FROM tblj1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT tblj1.i FROM tblj1 WHERE i = 1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT i FROM public.tblj1 WHERE tblj1.i = 1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT tblj1.i FROM tblj1 WHERE tblj1.i = 1); /*c1*/SELECT * FROM ctblt1 WHERE i = (SELECT i FROM tblj1); /*c1*/SELECT * FROM ctblt1 WHERE i in (SELECT i FROM tblj1); /*c1*/SELECT * FROM ctblt1 WHERE i = (SELECT i FROM tblj1 WHERE i = 1); /*c1*/SELECT * FROM public.ctblt1 WHERE i = (SELECT i FROM tblj1); /*c1*/SELECT * FROM public.ctblt1 WHERE i in (SELECT i FROM tblj1); /*c0*/SELECT * FROM public.ctblt1 WHERE i = (SELECT i FROM tblj1 WHERE i = 0); /*c1*/SELECT * FROM ctblt1 WHERE i = (SELECT i FROM public.tblj1); /*c1*/SELECT * FROM ctblt1 WHERE i in (SELECT i FROM public.tblj1); /*c0*/SELECT * FROM ctblt1 WHERE i = (SELECT i FROM public.tblj1 WHERE i = 0); /*c1*/SELECT * FROM ctblt1 WHERE i = (SELECT tblj1.i FROM public.tblj1); /*c1*/SELECT * FROM ctblt1 WHERE i in (SELECT tblj1.i FROM tblj1); /*c0*/SELECT * FROM ctblt1 WHERE i = (SELECT tblj1.i FROM tblj1 WHERE i = 0); /*c1*/SELECT * FROM ctblt1 WHERE i = (SELECT i FROM public.tblj1 WHERE tblj1.i = 1); /*c1*/SELECT * FROM ctblt1 WHERE i = (SELECT tblj1.i FROM tblj1 WHERE tblj1.i = 1); /*e*/SELECT * FROM system_users WHERE user_name = 'SA'; /*e*/SELECT * FROM other.ctblt1; /*e*/SELECT * FROM other.system_users; /*e*/SELECT * FROM information_schema.ctblt1; /*e*/SELECT * FROM public.system_users; /*c2*/SELECT * FROM public.ctblt1; /*c1*/SELECT * FROM information_schema.system_users WHERE user_name = 'SA'; /*c1*/SELECT * FROM public.ctblt1 WHERE i = 0; /*e*/SELECT * FROM other.ctblt1 WHERE i = 0; /*e*/SELECT * FROM information_schema.ctblt1 WHERE i = 0; /*c1*/SELECT * FROM public.ctblt1, public.tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT * FROM ctblt1, public.tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT * FROM public.ctblt1, tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT * FROM ctblt1, tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT vc FROM public.ctblt1, public.tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT vc FROM ctblt1, public.tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT vc FROM public.ctblt1, tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT vc FROM ctblt1, tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT tblj1.vc FROM public.ctblt1, public.tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT tblj1.vc FROM ctblt1, public.tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT tblj1.vc FROM public.ctblt1, tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT tblj1.vc FROM ctblt1, tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT lbla.vc FROM ctblt1, tblj1 lbla WHERE ctblt1.i = lbla.i; /*c1*/SELECT tblj1.vc FROM ctblt1 lblb, tblj1 WHERE lblb.i = tblj1.i; /*c1*/SELECT lbla.vc FROM ctblt1 lblb, tblj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM public.ctblt1, tblj1 lbla WHERE ctblt1.i = lbla.i; /*c1*/SELECT tblj1.vc FROM public.ctblt1 lblb, tblj1 WHERE lblb.i = tblj1.i; /*c1*/SELECT lbla.vc FROM public.ctblt1 lblb, tblj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM ctblt1, public.tblj1 lbla WHERE ctblt1.i = lbla.i; /*c1*/SELECT tblj1.vc FROM ctblt1 lblb, public.tblj1 WHERE lblb.i = tblj1.i; /*c1*/SELECT lbla.vc FROM ctblt1 lblb, public.tblj1 lbla WHERE lblb.i = lbla.i; /*u0*/SET TABLE ctblt1 READONLY true; /*e*/UPDATE ctblt1 set i = 11 WHERE i = 1; /*u0*/SET TABLE public.ctblt1 READONLY true; /*e*/SET TABLE information_schema.ctblt1 READONLY true; /*e*/SET TABLE other.ctblt1 READONLY true; /*u0*/SET TABLE ctblt1 READONLY false; /*u0*/SET TABLE public.ctblt1 READONLY false; /*c2*/SELECT i FROM ctblt1; -- N.b.: Do not commit DML changes so that this whole block may be repeated. COMMIT; SET AUTOCOMMIT false; /*u1*/UPDATE ctblt1 set i = 11 WHERE i = 1; /*u1*/UPDATE ctblt1 set ctblt1.i = 12 WHERE i = 11; /*u1*/UPDATE ctblt1 set ctblt1.i = 13 WHERE ctblt1.i = 12; /*u1*/UPDATE public.ctblt1 set i = 14 WHERE i = 13; /*u1*/UPDATE public.ctblt1 set ctblt1.i = 15 WHERE i = 14; /*u1*/UPDATE public.ctblt1 set ctblt1.i = 16 WHERE ctblt1.i = 15; /*e*/UPDATE other.ctblt1 set ctblt1.i = 17 WHERE ctblt1.i = 16; /*e*/UPDATE information_schema.ctblt1 set ctblt1.i = 17 WHERE ctblt1.i = 16; /*u1*/UPDATE ctblt1 ali set i = 17 WHERE i = 16; /*u1*/UPDATE ctblt1 ali set ali.i = 18 WHERE i = 17; /*u1*/UPDATE ctblt1 ali set ali.i = 19 WHERE ali.i = 18; /*u1*/UPDATE ctblt1 ali set i = 20 WHERE ali.i = 19; /*u1*/UPDATE public.ctblt1 ali set i = 21 WHERE i = 20; /*u1*/UPDATE public.ctblt1 ali set ali.i = 22 WHERE i = 21; /*u1*/UPDATE public.ctblt1 ali set ali.i = 23 WHERE ali.i = 22; /*u1*/UPDATE public.ctblt1 ali set i = 24 WHERE ali.i = 23; /*e*/UPDATE other.ctblt1 ali set i = 25 WHERE ali.i = 24; /*e*/UPDATE other.ctblt1 ali set i = 25 WHERE .i = 24; /*e*/UPDATE other.ctblt1 set i = 25 WHERE i = 24; /*e*/DELETE FROM other.ctblt1 ali WHERE ali.i = 24; /*e*/DELETE FROM other.ctblt1 ali; /*e*/DELETE FROM other.ctblt1 set WHERE i = 24; /*e*/DELETE FROM other.ctblt1 WHERE i = 24; /*e*/DELETE FROM system_information.tblj1 WHERE tblj1.i = 1; /*u1*/DELETE FROM ctblt1 WHERE i = 0; /*u1*/DELETE FROM public.ctblt1 WHERE i = 24; /*u1*/DELETE FROM public.tblj1 WHERE tblj1.i = 1; ROLLBACK; /*c2*/SELECT i FROM ctblt1; /*u0*/GRANT ALL ON ctblt1 TO otheruser; /*u0*/GRANT ALL ON public.ctblt2 TO otheruser; /*e*/GRANT ALL ON other.ctblt3 TO otheruser; /*e*/GRANT ALL ON information_schema.ctblt3 TO otheruser; /*u0*/REVOKE ALL ON ctblt1 FROM otheruser RESTRICT; /*u0*/REVOKE ALL ON public.ctblt2 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON other.ctblt3 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON information_schema.ctblt3 FROM otheruser RESTRICT; /*e*/DROP TABLE other.ctblt3; /*e*/DROP TABLE information_schema.ctblt4; /*e*/DROP TABLE ctblt101; /*e*/DROP TABLE public.ctblt101; /*u0*/DROP TABLE ctblt101 IF EXISTS; /*u0*/DROP TABLE public.ctblt101 IF EXISTS; -- Should "DROP TABLE nonexistentschema.notable IF EXISTS" work? /*u0*/DROP TABLE other.system_users IF exists; /*u0*/DROP TABLE system_users IF exists; -- ****************************** Views /*c2*/SELECT * FROM vwv1; /*c2*/SELECT * FROM public.vwv1; /*c2*/SELECT * FROM vwv2; /*c2*/SELECT * FROM vwv3; /*c1*/SELECT * FROM vwv4; /*c1*/SELECT * FROM vwv5; /*c1*/SELECT * FROM vwv8; /*c0*/SELECT * FROM vwv9; /*c0*/SELECT * FROM vwv10; /*c0*/SELECT * FROM vwv11; /*c0*/SELECT * FROM vwv12; /*c0*/SELECT * FROM vwv13; /*c0*/SELECT * FROM vwv14; /*c0*/SELECT * FROM vwv15; /*c0*/SELECT * FROM vwv16; /*c0*/SELECT * FROM vwv17; /*c0*/SELECT * FROM vwv18; /*c1*/SELECT * FROM vwv19; /*c1*/SELECT * FROM vwv20; /*c1*/SELECT * FROM vwv21; /*c1*/SELECT * FROM vwv22; /*c1*/SELECT * FROM vwv23; /*c1*/SELECT * FROM vwv24; /*c1*/SELECT * FROM vwv25; /*c1*/SELECT * FROM vwv26; /*c2*/SELECT * FROM vwv28; /*c1*/SELECT * FROM vwv29; /*c1*/SELECT * FROM vwv30; /*c1*/SELECT * FROM vwv31; /*c0*/SELECT * FROM vwv32; /*c1*/SELECT * FROM vwv33; /*c1*/SELECT * FROM vwv34; /*c0*/SELECT * FROM vwv35; /*c1*/SELECT * FROM vwv36; /*c1*/SELECT * FROM vwv37; /*c1*/SELECT * FROM vwv38; /*c1*/SELECT * FROM vwv39; /*c1*/SELECT * FROM vwv40; /*c1*/SELECT * FROM vwv41; /*c1*/SELECT * FROM vwv42; /*c1*/SELECT * FROM vwv43; /*c1*/SELECT * FROM vwv44; /*c1*/SELECT * FROM vwv45; /*c1*/SELECT * FROM vwv46; /*c1*/SELECT * FROM vwv47; /*c1*/SELECT * FROM vwv48; /*c1*/SELECT * FROM vwv49; /*c1*/SELECT * FROM vwv50; /*c1*/SELECT * FROM vwv51; /*c1*/SELECT * FROM vwv52; /*c1*/SELECT * FROM vwv53; /*c1*/SELECT * FROM vwv54; /*c1*/SELECT * FROM vwv55; /*c1*/SELECT * FROM vwv56; /*c1*/SELECT * FROM vwv57; /*c1*/SELECT * FROM vwv1, vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT * FROM public.vwv1, public.vwj1 WHERE vwv1.i = vwj1.i; /*c2*/SELECT * FROM vwv1 WHERE i in (0, 1, 11, 12); /*c1*/SELECT * FROM vwv1 WHERE i < 1; /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT i FROM vwj1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i in (SELECT i FROM vwj1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT i FROM vwj1 WHERE i = 1); /*c1*/SELECT * FROM public.vwv1 WHERE vwv1.i in (SELECT i FROM vwj1); /*c1*/SELECT * FROM public.vwv1 WHERE vwv1.i = (SELECT i FROM vwj1 WHERE i = 1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT i FROM public.vwj1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i in (SELECT i FROM public.vwj1); /*c0*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT i FROM public.vwj1 WHERE i = 0); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT vwj1.i FROM public.vwj1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i in (SELECT vwj1.i FROM vwj1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT vwj1.i FROM vwj1 WHERE i = 1); /*c0*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT i FROM public.vwj1 WHERE vwj1.i = 0); /*c0*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT vwj1.i FROM vwj1 WHERE vwj1.i = 0); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT i FROM vwj1); /*c1*/SELECT * FROM vwv1 WHERE i in (SELECT i FROM vwj1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT i FROM vwj1 WHERE i = 1); /*c1*/SELECT * FROM public.vwv1 WHERE i = (SELECT i FROM vwj1); /*c1*/SELECT * FROM public.vwv1 WHERE i in (SELECT i FROM vwj1); /*c1*/SELECT * FROM public.vwv1 WHERE i = (SELECT i FROM vwj1 WHERE i = 1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT i FROM public.vwj1); /*c1*/SELECT * FROM vwv1 WHERE i in (SELECT i FROM public.vwj1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT i FROM public.vwj1 WHERE i = 1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT vwj1.i FROM public.vwj1); /*c1*/SELECT * FROM vwv1 WHERE i in (SELECT vwj1.i FROM vwj1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT vwj1.i FROM vwj1 WHERE i = 1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT i FROM public.vwj1 WHERE vwj1.i = 1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT vwj1.i FROM vwj1 WHERE vwj1.i = 1); /*c2*/SELECT * FROM vwv1; /*c1*/SELECT * FROM vwv1 WHERE i = 0; /*c2*/SELECT * FROM vwv1 WHERE i in (0, 1, 11, 12); /*c1*/SELECT * FROM vwv1 WHERE i < 1; /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT i FROM vwj1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i in (SELECT i FROM vwj1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT i FROM vwj1 WHERE i = 1); /*c1*/SELECT * FROM public.vwv1 WHERE vwv1.i = (SELECT i FROM vwj1); /*c1*/SELECT * FROM public.vwv1 WHERE vwv1.i in (SELECT i FROM vwj1); /*c1*/SELECT * FROM public.vwv1 WHERE vwv1.i = (SELECT i FROM vwj1 WHERE i = 1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT i FROM public.vwj1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i in (SELECT i FROM public.vwj1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT i FROM public.vwj1 WHERE i = 1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT vwj1.i FROM public.vwj1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i in (SELECT vwj1.i FROM vwj1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT vwj1.i FROM vwj1 WHERE i = 1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT i FROM public.vwj1 WHERE vwj1.i = 1); /*c1*/SELECT * FROM vwv1 WHERE vwv1.i = (SELECT vwj1.i FROM vwj1 WHERE vwj1.i = 1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT i FROM vwj1); /*c1*/SELECT * FROM vwv1 WHERE i in (SELECT i FROM vwj1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT i FROM vwj1 WHERE i = 1); /*c1*/SELECT * FROM public.vwv1 WHERE i = (SELECT i FROM vwj1); /*c1*/SELECT * FROM public.vwv1 WHERE i in (SELECT i FROM vwj1); /*c1*/SELECT * FROM public.vwv1 WHERE i = (SELECT i FROM vwj1 WHERE i = 1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT i FROM public.vwj1); /*c1*/SELECT * FROM vwv1 WHERE i in (SELECT i FROM public.vwj1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT i FROM public.vwj1 WHERE i = 1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT vwj1.i FROM public.vwj1); /*c1*/SELECT * FROM vwv1 WHERE i in (SELECT vwj1.i FROM vwj1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT vwj1.i FROM vwj1 WHERE i = 1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT i FROM public.vwj1 WHERE vwj1.i = 1); /*c1*/SELECT * FROM vwv1 WHERE i = (SELECT vwj1.i FROM vwj1 WHERE vwj1.i = 1); /*e*/SELECT * FROM other.vwv1; /*e*/SELECT * FROM information_schema.vwv1; /*c2*/SELECT * FROM public.vwv1; /*c1*/SELECT * FROM public.vwv1 WHERE i = 0; /*e*/SELECT * FROM other.vwv1 WHERE i = 0; /*e*/SELECT * FROM information_schema.vwv1 WHERE i = 0; /*c1*/SELECT * FROM public.vwv1 WHERE i = 0; CREATE TABLE public.vwt2 AS (SELECT * FROM public.vwv1 WHERE i = 0) WITH DATA; /*c1*/SELECT * FROM public.vwt2; DROP TABLE vwt2; /*c1*/SELECT * FROM public.vwv1, public.vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT * FROM vwv1, public.vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT * FROM public.vwv1, vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT * FROM vwv1, vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT vc FROM public.vwv1, public.vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT vc FROM vwv1, public.vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT vc FROM public.vwv1, vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT vc FROM vwv1, vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT vwj1.vc FROM public.vwv1, public.vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT vwj1.vc FROM vwv1, public.vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT vwj1.vc FROM public.vwv1, vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT vwj1.vc FROM vwv1, vwj1 WHERE vwv1.i = vwj1.i; /*c1*/SELECT lbla.vc FROM vwv1, vwj1 lbla WHERE vwv1.i = lbla.i; /*c1*/SELECT vwj1.vc FROM vwv1 lblb, vwj1 WHERE lblb.i = vwj1.i; /*c1*/SELECT lbla.vc FROM vwv1 lblb, vwj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM public.vwv1, vwj1 lbla WHERE vwv1.i = lbla.i; /*c1*/SELECT vwj1.vc FROM public.vwv1 lblb, vwj1 WHERE lblb.i = vwj1.i; /*c1*/SELECT lbla.vc FROM public.vwv1 lblb, vwj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM vwv1, public.vwj1 lbla WHERE vwv1.i = lbla.i; /*c1*/SELECT vwj1.vc FROM vwv1 lblb, public.vwj1 WHERE lblb.i = vwj1.i; /*c1*/SELECT lbla.vc FROM vwv1 lblb, public.vwj1 lbla WHERE lblb.i = lbla.i; /*u0*/GRANT ALL ON vwv1 TO otheruser; /*u0*/GRANT ALL ON public.vwv2 TO otheruser; /*e*/GRANT ALL ON other.vwv3 TO otheruser; /*e*/GRANT ALL ON information_schema.vwv3 TO otheruser; /*u0*/REVOKE ALL ON vwv1 FROM otheruser RESTRICT; /*u0*/REVOKE ALL ON public.vwv2 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON other.vwv3 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON information_schema.vwv3 FROM otheruser RESTRICT; -- ****************************** Indexes /*c2*/SELECT * from indt1; /*c2*/SELECT * from public.indt2; /*c2*/SELECT * from public.indt3; /*c2*/SELECT * from indt4; -- ****************************** CACH Indexes /*c2*/SELECT * from cindt1; /*c2*/SELECT * from public.cindt2; /*c2*/SELECT * from public.cindt3; /*c2*/SELECT * from cindt4; -- ****************************** Sequences -- N.b.: Do not commit DML changes so that this whole block may be repeated. /*r0*/SELECT next value FOR s1 FROM seqt1; /*r2*/SELECT next value FOR public.s2 FROM seqt1; /*r1*/SELECT next value FOR s1 FROM public.seqt1; /*r3*/SELECT next value FOR public.s2 FROM public.seqt1; /*r2*/SELECT next value FOR public.s1 FROM seqt1; /*r4*/SELECT next value FOR s2 FROM seqt1; /*r3*/SELECT next value FOR public.s1 FROM seqt1; /*r5*/SELECT next value FOR s2 FROM seqt1; -- Just to reset orig. value before persisting (can't roll back seq.s). ALTER SEQUENCE s1 RESTART WITH 0; ALTER SEQUENCE s2 RESTART WITH 2; /*e*/DROP SEQUENCE s101; /*e*/DROP SEQUENCE public.s101; /*e*/DROP SEQUENCE information_schema.s1; /*e*/DROP SEQUENCE other.s1; -- ****************************** Triggers /*e*/CREATE TRIGGER trgtrig1 AFTER INSERT ON trgt1 CALL 'org.hsqldb.test.BlaineTrig'; -- Create existing /*e*/CREATE TRIGGER public.trgtrig2 AFTER INSERT ON trgt2 CALL 'org.hsqldb.test.BlaineTrig'; -- Create existing -- ****************************** Constraints -- N.b.: Do not commit DML changes so that this whole block may be repeated. COMMIT; SET AUTOCOMMIT false; /*u1*/INSERT INTO cont1 VALUES (0); /*u1*/INSERT INTO public.cont2 VALUES (0); /*u1*/INSERT INTO cont3 VALUES (0); /*u1*/INSERT INTO cont4 VALUES (0); /*u1*/INSERT INTO cont5 VALUES (0); /*u1*/INSERT INTO cont6 VALUES (0); /*u1*/INSERT INTO cont7 VALUES (0); /*u1*/INSERT INTO cont8 VALUES (0); -- Note that error message implies that problem is due to table conj1, not data: /*u1*/INSERT INTO cont9 VALUES (1); /*u1*/INSERT INTO cont10 VALUES (1); /*u1*/INSERT INTO cont11 VALUES (1); /*u1*/INSERT INTO cont12 VALUES (1); /*u1*/INSERT INTO cont13 VALUES (1); /*u1*/INSERT INTO cont14 VALUES (1); /*u1*/INSERT INTO cont15 VALUES (1); /*u1*/INSERT INTO cont16 VALUES (1); /*u1*/INSERT INTO cont17 VALUES (0); /*u1*/INSERT INTO cont18 VALUES (0); /*u1*/INSERT INTO cont19 VALUES (0); /*u1*/INSERT INTO cont20 VALUES (0); /*e*/INSERT INTO cont1 VALUES (0); /*e*/INSERT INTO cont2 VALUES (0); /*e*/INSERT INTO cont3 VALUES (0); /*e*/INSERT INTO cont4 VALUES (0); /*e*/INSERT INTO cont5 VALUES (0); /*e*/INSERT INTO cont6 VALUES (0); /*e*/INSERT INTO cont7 VALUES (0); /*e*/INSERT INTO cont8 VALUES (0); /*e*/INSERT INTO cont9 VALUES (0); /*e*/INSERT INTO cont10 VALUES (0); /*e*/INSERT INTO cont11 VALUES (0); /*e*/INSERT INTO cont12 VALUES (0); /*e*/INSERT INTO cont13 VALUES (0); /*e*/INSERT INTO cont14 VALUES (0); /*e*/INSERT INTO cont15 VALUES (0); /*e*/INSERT INTO cont16 VALUES (0); /*e*/INSERT INTO cont17 VALUES (1); /*e*/INSERT INTO cont18 VALUES (1); /*e*/INSERT INTO cont19 VALUES (1); /*e*/INSERT INTO cont20 VALUES (1); /*c1*/SELECT * FROM cont1; /*c1*/SELECT * FROM cont2; /*c1*/SELECT * FROM cont3; /*c1*/SELECT * FROM cont4; /*c1*/SELECT * FROM cont5; /*c1*/SELECT * FROM cont6; /*c1*/SELECT * FROM cont7; /*c1*/SELECT * FROM cont8; /*c1*/SELECT * FROM cont9; /*c1*/SELECT * FROM cont10; /*c1*/SELECT * FROM cont11; /*c1*/SELECT * FROM cont12; /*c1*/SELECT * FROM cont13; /*c1*/SELECT * FROM cont14; /*c1*/SELECT * FROM cont15; /*c1*/SELECT * FROM cont16; /*c1*/SELECT * FROM cont17; /*c1*/SELECT * FROM cont18; /*c1*/SELECT * FROM cont19; /*c1*/SELECT * FROM cont20; ROLLBACK; -- ****************************** ALTERs -- Add tests when time permits. DROP USER otheruser; -- This to test .script persistence. SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfFieldLimits.txt0000644000175000017500000000417612007547346023524 0ustar renerene-- field limit tests -- works fully with sql.enforce_strict_size -- from 1.8.0.RC9 DECIMAL precision and scale is enforced -- when scale is specified, all input is rounded down to the relevant scale -- precision is then enforced on the result of rounding down drop table flimit if exists; create table flimit (charf1 character(4), vcharf1 varchar(4), decf1 decimal(10,2)); insert into flimit values('one', 'two', 10.2); /*r one ,two,10.20 */select * from flimit; /*u1*/delete from flimit; -- to check /*e*/insert into flimit values('twenty', 'two', 10.2); /*e*/insert into flimit values('one', 'twenty', 10.2); insert into flimit values('one', 'two', 99999999.11111); /*r one ,two,99999999.11 */select * from flimit; /*r one ,two,99999999.11 */select * from flimit where charf1 in('one','two'); /*r one ,two,99999999.11 */select * from flimit where charf1 in('one ','two'); /*r 99999999 */select cast(decf1 as numeric(8)) from flimit; /*r 99999999.1100 */select cast(decf1 as numeric(12,4)) from flimit; /*r one tw,tw */select cast((charf1 || vcharf1) as varchar(6)), cast(vcharf1 as varchar(2)) from flimit; /*e*/insert into flimit values('one', 'two', 999999999.11); /*e*/insert into flimit values('one', 'two', cast(999999999.11111 as decimal(10,2))); insert into flimit values('one', 'two', cast(99999999.11111 as decimal(10,2))); drop table flimit; create table flimit (a timestamp(0), b timestamp(6), c timestamp); insert into flimit values('2005-05-21 10:10:10.123456','2005-05-21 10:10:10.123456','2005-05-21 10:10:10.123456'); /*c0*/select * from flimit where a = b; /*c0*/select * from flimit where a = c; /*c1*/select * from flimit where b = c; -- drop table flimit if exists; create table flimit (bit1 bit , bit3 bit(3), bitvar bit varying(3)); /*e*/insert into flimit values(B'1', B'1011', B'101'); /*e*/insert into flimit values(B'1', B'101', B'1011'); /*e*/insert into flimit values(B'10', B'101', B'1010'); /*e*/insert into flimit values(B'1', B'10', B'1010'); insert into flimit values(B'1', B'101', B'101'); /*r1101*/select bit1 || bit3 from flimit /*r101101*/select bit3 || bitvar from flimit hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfPersSchemD.txt0000644000175000017500000001305412007547344023305 0ustar renerene-- Test persistence via .script file -- Same blaine role tests as in test C, but after persistence. /*u0*/connect user blaine password blaine; /*u0*/set schema aschema; /*u0*/create table a4(i int); /*u0*/set schema bschema; /*u0*/create table b4(i int); /*c1*/select * from aschema.a1; /*c1*/select * from bschema.b1; /*c0*/select * from aschema.a2; /*c0*/select * from bschema.b2; /*c0*/select * from aschema.a4; /*c0*/select * from bschema.b4; /*u0*/connect user debbie password debbie; /*u0*/set schema aschema; /*u0*/create table a5(i int); /*u0*/set schema bschema; /*u0*/create table b5(i int); /*c1*/select * from aschema.a1; /*c1*/select * from bschema.b1; /*c0*/select * from aschema.a2; /*c0*/select * from bschema.b2; /*c0*/select * from aschema.a3; /*c0*/select * from bschema.b4; /*c0*/select * from aschema.a4; /*c0*/select * from bschema.b5; /*c0*/select * from aschema.a5; /*c0*/select * from bschema.b3; /*u0*/connect user sa password ""; -- FRED: Please tell me if I remember this correctly: -- Next line has no effect, since Role nestings are not preserved in the Roles -- but are resolved statically at grant time. I.e., since r had s when -- r was granted, it doesn't matter what roles are added/removed to/from -- s after that. -- Role nestings ARE preserved in the Roles /*u0*/revoke s from r restrict; /*u0*/revoke r from blaine restrict; -- Following not necessary although blaine had both r and s implicitly. /*e*/revoke s from blaine restrict; -- role s was not directly granted to blaine /*u0*/revoke s from debbie restrict; -- Negative tests (after privilege revocation via role revocation) /*u0*/connect user blaine password blaine; /*u0*/set schema aschema; /*e*/create table a6(i int); /*u0*/set schema bschema; /*e*/create table b6(i int); /*e*/select * from aschema.a1; /*e*/select * from bschema.b1; /*e*/select * from aschema.a2; /*e*/select * from bschema.b2; /*e*/select * from aschema.a4; /*e*/select * from bschema.b4; /*u0*/connect user debbie password debbie; /*u0*/set schema aschema; /*e*/create table a6(i int); /*u0*/set schema bschema; /*e*/create table b6(i int); /*e*/select * from aschema.a1; /*e*/select * from bschema.b1; /*e*/select * from aschema.a2; /*e*/select * from bschema.b2; /*e*/select * from aschema.a3; /*e*/select * from bschema.b4; /*e*/select * from aschema.a4; /*e*/select * from bschema.b5; /*e*/select * from aschema.a5; /*e*/select * from bschema.b3; -- USER INITIAL SCHEMA settings tests. Here, we can't test whether the -- settings actually "work", because TestSelf always connects up as "sa". -- But we can test if the SET commands work, and if they get saved properly. /*u0*/connect user debbie password debbie; -- Need DBA privilege for ALTER USER usage. /*e*/ALTER USER debbie SET INITIAL SCHEMA public; -- Invalid schema name /*e*/SET INITIAL SCHEMA bad; /*rnull*/SELECT initial_schema FROM information_schema.system_users WHERE USER_NAME = 'DEBBIE'; /*u0*/SET INITIAL SCHEMA public; /*rPUBLIC*/SELECT initial_schema FROM information_schema.system_users WHERE USER_NAME = 'DEBBIE'; /*u0*/SET INITIAL SCHEMA aschema; /*rASCHEMA*/SELECT initial_schema FROM information_schema.system_users WHERE USER_NAME = 'DEBBIE'; -- Special DEFAULT keyword to set to the system default schema. /*u0*/SET INITIAL SCHEMA DEFAULT; /*rnull*/SELECT initial_schema FROM information_schema.system_users WHERE USER_NAME = 'DEBBIE'; /*u0*/connect user sa password ""; GRANT dba TO debbie; /*u0*/connect user debbie password debbie; -- Now that have DBA priv, can run ALTER USER. /*u0*/ALTER USER debbie SET INITIAL SCHEMA public; -- ... even for other users /*rnull*/SELECT initial_schema FROM information_schema.system_users WHERE USER_NAME = 'BLAINE'; /*u0*/ALTER USER blaine SET INITIAL SCHEMA aschema; /*rASCHEMA*/SELECT initial_schema FROM information_schema.system_users WHERE USER_NAME = 'BLAINE'; /*u0*/ALTER USER blaine SET INITIAL SCHEMA default; /*rnull*/SELECT initial_schema FROM information_schema.system_users WHERE USER_NAME = 'BLAINE'; -- Test prohibited schemas /*e*/ALTER USER debbie SET INITIAL SCHEMA nosuch; /*e*/SET INITIAL SCHEMA nosuch; -- Test prohibited target Users /*e*/ALTER USER nosuch SET INITIAL SCHEMA default; /*e*/ALTER USER nosuch SET INITIAL SCHEMA aschema; /*e*/ALTER USER _system SET INITIAL SCHEMA default; /*e*/ALTER USER _system SET INITIAL SCHEMA aschema; /*e*/ALTER USER public SET INITIAL SCHEMA default; /*e*/ALTER USER public SET INITIAL SCHEMA aschema; -- Test user-schema dependencies /*u0*/connect user sa password ""; /*u0*/CREATE user depu password "depu"; /*u0*/CREATE schema deps authorization depu; -- Will fail because a schema is authorized directly by depu /*e*/DROP USER depu; /*u0*/DROP SCHEMA deps; /*u0*/DROP USER depu; /*u0*/CREATE user depu password "depu"; /*u0*/CREATE schema deps authorization depu; /*e*/DROP USER depu; /*u0*/DROP USER depu CASCADE; -- Roles authorizations are independent of any user. /*u0*/CREATE user depu password "depu"; /*u0*/CREATE ROLE depr; /*u0*/GRANT depr TO depu; /*u0*/CREATE schema deps authorization depr; /*u0*/DROP user depu; -- Test of same-named-objects in different schemas. As an Admin. /*u0*/connect user sa password ""; /*r1,11*/SELECT i, NEXT VALUE FOR bschema.samesname FROM bschema.sametname; /*r2,21*/SELECT i, NEXT VALUE FOR aschema.samesname FROM aschema.sametname; /*r1*/SELECT i FROM bschema.samevname; /*r2*/SELECT i FROM aschema.samevname; /*u0*/connect user sa password ""; /*u0*/REVOKE dba FROM debbie RESTRICT; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSchemaMisc.txt0000644000175000017500000000172312007547346023326 0ustar renerenedrop schema schemafk1 if exists drop schema schemafk2 if exists create schema schemafk1 authorization dba; create table schemafk1.table1 ( table1_id integer primary key); create schema schemafk2 authorization dba; create table schemafk2.table2 (table2_id integer primary key, table1_id integer, foreign key (table1_id) references schemafk1.table1); create table schemafk2.table3 (table3_id integer primary key, table1_id integer); alter table schemafk2.table3 add constraint fktbl3 foreign key (table1_id) references schemafk1.table1; create table schemafk2.table4 (table4_id integer primary key, table1_id integer); alter table schemafk2.table4 add constraint fktbl4 foreign key (table1_id) references schemafk1.table1 (table1_id); comment on table schemafk1.table1 is 'a short table comment'; comment on column schemafk1.table1.table1_id is 'a short column comment'; /*c2*/select * from information_schema.system_comments where object_schema='SCHEMAFK1' hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfConstraints.txt0000644000175000017500000000434212007547346023621 0ustar renerene-- -- TestSelfConstraints.txt -- -- Tests for Constraints -- bug #733940 -- NOT NULL enforcement -- IDENTITY can be set to NULL to be regenerated but other NOT NULL columns can't CREATE CACHED TABLE THEME (idTheme integer NOT NULL IDENTITY, libelle VARCHAR(10) CONSTRAINT THEMECOSNT NOT NULL,description VARCHAR(10)); insert into theme(libelle, description) values('ESSAI', 'ESSAI'); /*e*/update theme set libelle = null where idtheme = 0; /*u1*/update theme set idTheme = null where idtheme = 0; /*u1*/update theme set idTheme = default where idtheme = 1; -- bug #722442 create table confignodetype (cnt_nodetypeid numeric(10) not null primary key, cnt_parentid numeric(10) not null,cnt_name varchar(40) not null, constraint fk_cnt_parentid foreign key (cnt_parentid) references confignodetype(cnt_nodetypeid)); /*u1*/INSERT INTO confignodetype VALUES (-1,-1,'prj'); -- bug #1114899 create table mytable(field1 int not null, field2 int); alter table mytable add constraint pk primary key (field1); /*e*/alter table mytable add constraint pk foreign key (field2) references mytable(field1) ; alter table mytable add constraint fk foreign key (field2) references mytable(field1) ; /*u1*/insert into mytable values (0,0); /*u1*/insert into mytable values (1,1); /*u1*/insert into mytable values (2,1); /*u1*/delete from mytable where field1= 2; /*u1*/delete from mytable where field1= 1; /*u1*/delete from mytable where field1= 0; /*r0*/select count(*) from mytable; alter table mytable drop constraint fk; alter table mytable drop constraint pk; drop table mytable; -- CREATE TABLE "Table3" ("ID" INTEGER NOT NULL,"dd" INTEGER, PRIMARY KEY ("ID")); ALTER TABLE "Table3" ALTER COLUMN "ID" GENERATED BY DEFAULT AS IDENTITY; ALTER TABLE "Table3" ALTER COLUMN "ID" INTEGER; ALTER TABLE "Table3" DROP PRIMARY KEY; ALTER TABLE "Table3" ADD PRIMARY KEY("dd"); ALTER TABLE "Table3" ALTER COLUMN "dd" DROP GENERATED; --- create table a ( a_id varchar(32) primary key ); create table b ( b_id varchar(32) primary key, a varchar(33) not null); insert into a values ('TESTA'); insert into b values ('TESTB','TESTA'); alter table b add constraint b_fk_a foreign key (a) references a (a_id); drop table a cascade hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfPersSchemB.txt0000644000175000017500000001451412007547344023305 0ustar renerene/*s*/DROP USER blaine; /*s*/DROP USER debbie; /*s*/DROP SCHEMA bschema cascade; /*s*/DROP SCHEMA dschema cascade; -- Test persistence to .log file of personal schemas. /*u0*/CREATE TABLE schema_a.t1(i int); /*u0*/DROP SCHEMA schema_a CASCADE; /*u0*/DROP SCHEMA schema_b; /*e*/DROP SCHEMA schema_z; /*u0*/DROP ROLE r1; /*u0*/DROP USER owner1; -- Schema authorization of individual User -- Test that non-DBA schema owners can CREATE/SELECT/INSERT objects in their -- own schema but not in somebody else's schema (assuming explicit object -- rights have not been granted, of course). /*u0*/create table public.ptable(i int); /*u1*/insert into public.ptable values(9); /*u0*/CREATE INDEX public.pindex ON public.ptable(i); /*u0*/CREATE SEQUENCE public.psequence; /*u0*/create user blaine password "blaine"; /*u0*/GRANT CHANGE_AUTHORIZATION TO blaine; /*u0*/create schema bschema authorization blaine; /*u0*/create table bschema.b1(i int); /*c0*/select * from bschema.b1; /*u0*/connect user blaine password "blaine"; /*c0*/select * from bschema.b1; /*u1*/insert into bschema.b1 values(3); /*c1*/select * from bschema.b1; /*u0*/connect user sa password ""; /*u0*/create user debbie password debbie; /*u0*/GRANT CHANGE_AUTHORIZATION TO debbie; /*u0*/create schema dschema authorization debbie; /*u0*/create table dschema.d1(i int); /*u1*/insert into dschema.d1 values(5); /*u0*/commit; /*u0*/connect user debbie password debbie; /*e*/select * from bschema.b1; /*e*/create table bschema.b3(i int); /*u0*/create table dschema.d2 (i int); /*u0*/set schema dschema; /*c1*/select * from d1; /*c0*/select * from d2; /*u0*/connect user blaine password "blaine"; /*u0*/set schema bschema; /*e*/create table dschema.d4(i int); /*u0*/create table b2(i int); /*c1*/select * from b1; /*u1*/insert into b1 values(5); /*u1*/insert into b2 values (55); /*c2*/select * from b1; /*c1*/select * from b2; -- Test of same-named-objects in different schemas. As an Admin. /*u0*/connect user sa password ""; /*u0*/CREATE TABLE bschema.sametname(i int); /*u0*/CREATE TABLE dschema.sametname(i int); /*u0*/CREATE VIEW bschema.samevname AS SELECT * FROM bschema.sametname; /*u0*/CREATE VIEW dschema.samevname AS SELECT * FROM dschema.sametname; /*u0*/CREATE SEQUENCE bschema.samesname START WITH 10; /*u0*/CREATE SEQUENCE dschema.samesname START WITH 20; /*u1*/INSERT INTO bschema.sametname(i) VALUES(1); /*u1*/INSERT INTO dschema.sametname(i) VALUES(2); /*r1,10*/SELECT i, NEXT VALUE FOR bschema.samesname FROM bschema.sametname; /*r2,20*/SELECT i, NEXT VALUE FOR dschema.samesname FROM dschema.sametname; /*r1*/SELECT i FROM bschema.samevname; /*r2*/SELECT i FROM dschema.samevname; -- Verify that same-named-objects does not make system tables choke /*u0*/SET SCHEMA information_schema; SELECT * FROM authorizations; SELECT * FROM constraint_column_usage; SELECT * FROM system_columns; SELECT * FROM system_schemas; SELECT * FROM schemata; SELECT * FROM sequences; SELECT * FROM system_sessioninfo; SELECT * FROM system_sessions; SELECT * FROM table_privileges; SELECT * FROM system_tables; SELECT * FROM usage_privileges; SELECT * FROM system_users; -- Basic user schema permission capability has been tested well above. -- Now LIGHTER TESTING FOR REMAINING COMMANDS AND SCHEMA OBJECT TYPES: -- (purpose to see if the non-Admin, non-right-granted user may do these -- things on his objects, but not to other objects). -- Commands to test: ALTER, DELETE, DROP, GRANT, REVOKE, UPDATE -- Object types to test: INDEX, SEQUENCE, VIEW /*u0*/connect user blaine password "blaine"; /*u0*/CREATE TABLE bschema.extra(i1 int); /*u0*/CREATE TABLE bschema.todrop(i1 int); /*u1*/insert into bschema.extra values(8); -- First Commands on TABLEs /*e*/ALTER TABLE public.ptable ADD COLUMN i2 int; /*u0*/ALTER TABLE bschema.extra ADD COLUMN i2 int; /*c1*/SELECT * FROM bschema.extra; /*e*/UPDATE public.ptable SET i = 11; /*u1*/UPDATE bschema.extra SET i1 = 44; /*e*/DELETE FROM public.ptable; /*u1*/DELETE FROM bschema.extra; /*e*/GRANT SELECT ON public.ptable TO debbie; /*u0*/GRANT SELECT ON bschema.extra TO debbie; /*e*/REVOKE SELECT ON public.ptable FROM debbie RESTRICT; /*u0*/REVOKE SELECT ON bschema.extra FROM debbie RESTRICT; /*e*/DROP TABLE public.ptable; /*u0*/DROP TABLE bschema.todrop; -- Commands on INDEXes /*e*/CREATE INDEX public.i1 ON public.ptable(i); /*u0*/CREATE UNIQUE INDEX bschema.ui1 ON bschema.extra(i1); /*c1*/SELECT count(*) FROM bschema.extra; /*e*/ALTER INDEX public.pindex RENAME TO othername; /*u0*/ALTER INDEX bschema.ui1 RENAME TO othername; /*u1*/insert into bschema.extra(i1, i2) values(8,1); -- Following violates the UNIQUE index /*e*/insert into bschema.extra(i1, i2) values(8,2); /*e*/DROP INDEX public.pindex; /*u0*/DROP index bschema.othername; -- Commands on SEQUENCEs /*e*/CREATE SEQUENCE public.pseq; /*u0*/CREATE SEQUENCE bschema.bseq; /*e*/SELECT next value for public.psequence FROM bschema.extra; /*c1*/SELECT next value for bschema.bseq FROM bschema.extra; /*e*/ALTER SEQUENCE public.psequence RESTART WITH 10; /*u0*/ALTER SEQUENCE bschema.bseq RESTART WITH 10; /*e*/GRANT USAGE ON SEQUENCE public.psequence TO debbie; /*u0*/GRANT USAGE ON SEQUENCE bschema.bseq TO debbie; /*e*/REVOKE USAGE ON SEQUENCE public.psequence FROM debbie RESTRICT; /*u0*/REVOKE USAGE ON SEQUENCE bschema.bseq FROM debbie RESTRICT; /*e*/DROP SEQUENCE public.psequence; /*u0*/DROP SEQUENCE bschema.bseq; -- Adding views now. Didn't want them to impact operations on underlying -- tables in tests above. /*u0*/connect user sa password ""; /*u0*/create VIEW public.pview AS SELECT * FROM public.ptable; /*u0*/connect user blaine password "blaine"; /*e*/create VIEW public.oview AS SELECT * FROM public.ptable; /*u0*/create VIEW bschema.bview AS SELECT * FROM bschema.extra; /*e*/SELECT * FROM public.pview; /*c1*/SELECT * FROM bschema.bview; /*e*/GRANT SELECT ON public.pview TO debbie; /*u0*/GRANT SELECT ON bschema.bview TO debbie; /*e*/REVOKE SELECT ON public.pview FROM debbie RESTRICT; /*u0*/REVOKE SELECT ON bschema.bview FROM debbie RESTRICT; /*e*/DROP VIEW public.pview; /*u0*/DROP VIEW bschema.bview; /*u0*/DROP TABLE bschema.extra; /*u0*/connect user sa password ""; /*u0*/DROP VIEW public.pview; /*u0*/DROP INDEX public.pindex; /*u0*/DROP TABLE public.ptable; /*u0*/DROP SEQUENCE public.psequence; /*u0*/SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSchemaPerCachTbl1.txt0000644000175000017500000000316512007547346024465 0ustar renerene-- CREATE AND INITIALIZE CACHED TABLE OBJECTS -- This CREATES the schema-specific objects to be used for -- schema-specific persistence tests. -- ****************************** CACH Tables --DROP TABLE nosuch; DROP TABLE ctblt1 IF exists; DROP TABLE ctblt2 IF exists; DROP TABLE ctblt3 IF exists; DROP TABLE ctblt4 IF exists; DROP TABLE ctblt101 IF exists; DROP TABLE tblj1 IF exists; /*u0*/CREATE CACHED TABLE ctblt1 (i int); /*u0*/CREATE CACHED TABLE public.ctblt2 (i int); /*u0*/CREATE CACHED TABLE ctblt3 (i int); /*u0*/CREATE CACHED TABLE tblj1 (i int, vc varchar(10)); -- For testing Joins /*e*/CREATE CACHED TABLE information_schema.ctblt101 (i int); /*e*/CREATE CACHED TABLE ctblt1 (i int); -- Create existing object /*e*/CREATE CACHED TABLE public.ctblt1 (i int); -- Create existing object /*e*/CREATE CACHED TABLE information_schema.system_users (i int); -- Existing object /*e*/INSERT INTO other.ctblt1 values(0); /*e*/INSERT INTO information_schema.ctblt1 values(1); /*u1*/INSERT INTO ctblt1 values(0); /*u1*/INSERT INTO public.ctblt1 values(100); -- Test one update that will be persisted (most update tests won't be) /*u1*/UPDATE public.ctblt1 set i = 1 WHERE i = 100; /*u1*/INSERT INTO tblj1 values(1, 'one'); CREATE TABLE public.ctblt4 AS (SELECT * FROM public.ctblt1 WHERE i = 0) WITH DATA; /*c1*/SELECT * FROM public.ctblt4; -- Work-around ALTER TABLE ctblt1 ADD CONSTRAINT cpk_workaround PRIMARY KEY(i); -- ****************************** ALTERs -- Add tests when time permits. -- This to test recovery from .log files. SHUTDOWN IMMEDIATELY; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfViewSchemaResolve.txt0000644000175000017500000000640312007547346024705 0ustar renerene/*s*/DROP SCHEMA alts CASCADE; CREATE SCHEMA alts AUTHORIZATION dba; DROP VIEW v1 IF EXISTS; DROP VIEW v2 IF EXISTS; DROP VIEW v3 IF EXISTS; DROP VIEW v4 IF EXISTS; DROP VIEW v5 IF EXISTS; DROP VIEW v6 IF EXISTS; DROP VIEW v7 IF EXISTS; DROP VIEW v8 IF EXISTS; DROP TABLE t1 IF EXISTS; DROP TABLE t2 IF EXISTS; DROP TABLE t3 IF EXISTS; DROP TABLE t4 IF EXISTS; CREATE TABLE t1(t1c1 int, t1c2 int); CREATE TABLE t2(t2c1 int, t2c2 int); CREATE TABLE t3(c1 int, c2 int); CREATE TABLE t4(c1 int, c2 int); /*u1*/INSERT INTO t1 VALUES(1, 11); /*u1*/INSERT INTO t2 VALUES(2, 12); /*u1*/INSERT INTO t3 VALUES(3, 13); /*u1*/INSERT INTO t4 VALUES(4, 14); /*u0*/CREATE VIEW public.v1 AS SELECT * FROM t1; /*u0*/CREATE VIEW public.v2 AS SELECT * FROM t2; /*u0*/CREATE VIEW public.v3 AS SELECT * FROM t3; /*u0*/CREATE VIEW public.v4 AS SELECT * FROM t4; /*u0*/CREATE VIEW public.v5 (vc1, vc2) AS SELECT * FROM t1; /*u0*/CREATE VIEW public.v6 (vc1, vc2) AS SELECT * FROM t2; /*u0*/CREATE VIEW public.v7 (vc1, vc2) AS SELECT * FROM t3; /*u0*/CREATE VIEW public.v8 (vc1, vc2) AS SELECT * FROM t4; /*r1,11*/SELECT t1c1, t1c2 FROM v1; /*r2,12*/SELECT t2c1, t2c2 FROM v2; /*r3,13*/SELECT c1, c2 FROM v3; /*r4,14*/SELECT c1, c2 FROM v4; /*r1,11*/SELECT vc1, vc2 FROM v5; /*r2,12*/SELECT vc1, vc2 FROM v6; /*r3,13*/SELECT vc1, vc2 FROM v7; /*r4,14*/SELECT vc1, vc2 FROM v8; SET SCHEMA alts; /*e*/SELECT t1c1, t1c2 FROM v1; /*e*/SELECT t2c1, t2c2 FROM v2; /*e*/SELECT c1, c2 FROM v3; /*e*/SELECT c1, c2 FROM v4; /*e*/SELECT vc1, vc2 FROM v5; /*e*/SELECT vc1, vc2 FROM v6; /*e*/SELECT vc1, vc2 FROM v7; /*e*/SELECT vc1, vc2 FROM v8; /*r1,11*/SELECT t1c1, t1c2 FROM public.v1; /*r2,12*/SELECT t2c1, t2c2 FROM public.v2; /*r3,13*/SELECT c1, c2 FROM public.v3; /*r4,14*/SELECT c1, c2 FROM public.v4; /*r1,11*/SELECT vc1, vc2 FROM public.v5; /*r2,12*/SELECT vc1, vc2 FROM public.v6; /*r3,13*/SELECT vc1, vc2 FROM public.v7; /*r4,14*/SELECT vc1, vc2 FROM public.v8; CREATE INDEX i1 ON public.t1(t1c1); CREATE INDEX i2 ON public.t2(t2c1); CREATE INDEX i3 ON public.t3(c1); CREATE INDEX i4 ON public.t4(c1); /*e*/SELECT t1c1, t1c2 FROM v1; /*e*/SELECT t2c1, t2c2 FROM v2; /*e*/SELECT c1, c2 FROM v3; /*e*/SELECT c1, c2 FROM v4; /*e*/SELECT vc1, vc2 FROM v5; /*e*/SELECT vc1, vc2 FROM v6; /*e*/SELECT vc1, vc2 FROM v7; /*e*/SELECT vc1, vc2 FROM v8; /*r1,11*/SELECT t1c1, t1c2 FROM public.v1; /*r2,12*/SELECT t2c1, t2c2 FROM public.v2; /*r3,13*/SELECT c1, c2 FROM public.v3; /*r4,14*/SELECT c1, c2 FROM public.v4; /*r1,11*/SELECT vc1, vc2 FROM public.v5; /*r2,12*/SELECT vc1, vc2 FROM public.v6; /*r3,13*/SELECT vc1, vc2 FROM public.v7; /*r4,14*/SELECT vc1, vc2 FROM public.v8; SET SCHEMA alts; /*e*/SELECT t1c1, t1c2 FROM v1; /*e*/SELECT t2c1, t2c2 FROM v2; /*e*/SELECT c1, c2 FROM v3; /*e*/SELECT c1, c2 FROM v4; /*e*/SELECT vc1, vc2 FROM v5; /*e*/SELECT vc1, vc2 FROM v6; /*e*/SELECT vc1, vc2 FROM v7; /*e*/SELECT vc1, vc2 FROM v8; /*r1,11*/SELECT t1c1, t1c2 FROM public.v1; /*r2,12*/SELECT t2c1, t2c2 FROM public.v2; /*r3,13*/SELECT c1, c2 FROM public.v3; /*r4,14*/SELECT c1, c2 FROM public.v4; /*r1,11*/SELECT vc1, vc2 FROM public.v5; /*r2,12*/SELECT vc1, vc2 FROM public.v6; /*r3,13*/SELECT vc1, vc2 FROM public.v7; /*r4,14*/SELECT vc1, vc2 FROM public.v8; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfPrimaryKeys.txt0000644000175000017500000000410512007547346023566 0ustar renerene-- -- TestSelfPrimaryKeys.txt -- -- Tests for add / drop primary key constraints -- drop table testtable if exists; create cached table testtable ( aString varchar(256) not null, firstNum integer not null, aDate date not null, secondNum integer not null, thirdNum integer not null, aName varchar(32) not null ); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('Current', 22, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('Popular', 23, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('New', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('Old', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('CCurrent', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('ELV', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('ELNA', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('Older', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('RA', 20, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('RP', 2, '2003-11-10', 18, 3, 'my name goes here'); alter table testtable add constraint pk_testtable primary key (aString); alter table testtable drop constraint pk_testtable hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfArrays.txt0000644000175000017500000000550412007547346022554 0ustar renerenecreate cached table tarray (id int primary key, description varchar(20) array); insert into tarray values 1, array['light', 'red', 'hot'] insert into tarray values 2, array['dark', 'grey', 'cold'] select * from tarray select t1.description || t2.description from tarray t1 join tarray t2 on t1.id = t2.id + 1 select t1.description || t2.description[2] from tarray t1 join tarray t2 on t1.id = t2.id + 1 select (t1.description || t2.description)[2] from tarray t1 join tarray t2 on t1.id = t2.id + 1 select max(t1.description[1]) from tarray t1 select max(t1.description[1]) || min(t1.description[1]) from tarray t1 select cardinality(t1.description || t2.description) from tarray t1 join tarray t2 on t1.id = t2.id + 1 update tarray t1 set t1.description[2] = 'cool' where id = 2 select trim_array(t1.description, 1) from tarray t1 select trim_array(t1.description, 1)[1] from tarray t1 select trim_array(t1.description, 1)[1] from tarray t1 select * from tarray t1 where t1.id = 2 and t1.description[2] = 'cold' CREATE TABLE iarray (i BIGINT PRIMARY KEY, ar INTEGER ARRAY); INSERT INTO iarray VALUES (1, array [11, null, 13]); INSERT INTO iarray VALUES (2, null); INSERT INTO iarray VALUES (3, array [21, 22]); /*c3*/SELECT * FROM iarray; /*c1*/SELECT count(*) FROM iarray WHERE i = 1 AND ar[3] = 13; -- using customer and invoice tables defined in TestSelf.txt select firstname, lastname, a.c from customer, unnest(array[(select sum(total) from invoice where customerid = customer.id)]) a (c) alter table customer add column arr varchar(40) array update customer set arr = array[firstname, lastname, street, city] SELECT id, w, y FROM customer, unnest (arr) with ordinality j(w,y) SELECT firstname, lastname, (SELECT SUM(total) FROM invoice WHERE customerid = customer.id) s FROM customer SELECT firstname, lastname, a.c FROM customer, LATERAL(SELECT SUM(total) FROM invoice WHERE customerid = customer.id) a (c) -- select * from customer, lateral(select sum(invoice.total) from invoice where invoice.customerid = customer.id) explain plan for select * from customer where firstname in(unnest(?)) create table tour ( id int primary key, name varchar(20) ); create table golfer ( id int primary key, name varchar(20), tour_id int); create table stat ( id int primary key, round int, score int, golfer_id int); insert into tour values 1, 'PGA' insert into golfer values 3, 'Woods', 1 insert into stat values 1000, 1, 5, 3 insert into stat values 1010, 3, 10, 3 /*c1*/select golfer.name, secondstat.score score1, firststat.score score2 from tour join golfer on (tour.id = tour_id and tour.name = 'PGA' ), lateral(select * from stat where golfer_id = golfer.id order by round desc limit 1 offset 1) secondstat, lateral(select * from stat where golfer_id = golfer.id order by round desc limit 1) firststat hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfGroupBy.txt0000644000175000017500000001332512007547346022702 0ustar renerenedrop table t0 if exists; create table t0(c varchar(20), i integer, d date); insert into t0 values ('first', 1, '2000-01-01'); insert into t0 values ('second', 2, '2000-01-02'); insert into t0 values ('third', 3, '2000-02-01'); select year(d), month(d), day(d) from t0; /*r 2000,1,1 2000,1,2 2000,2,1 */select year(d) y, month(d) m, day(d) d from t0 group by year(d), month(d), day(d) order by 1, 2, 3; -- drop table test if exists; create table test (sel int, name1 varchar(3), name2 varchar(3)); insert into test (sel, name1, name2) values (0, 'foo', 'bar') insert into test (sel, name1, name2) values (1, 'baz', 'foo') insert into test (sel, name1, name2) values (1, 'foo', 'qux') -- select expressions are all composed of columns of group by /*r baz,foo,1 foo,bar,1 foo,qux,1 */select a.name1, a.name2, count(a.name1) as counter from test a group by sel, name1, name2 order by 1, 2, 3 /*r foo,1 foo,1 qux,1 */select case when a.sel=1 then a.name2 else a.name1 end as name, count(a.name1) as counter from test a group by sel, name1, name2 order by 1, 2 -- /*r foo,2 qux,1 */select case when a.sel=1 then a.name2 else a.name1 end as name, count(a.name1) as counter from test a group by case when a.sel=1 then a.name2 else a.name1 end order by 1, 2 -- /*r qux,1 foo,2 */select case when a.sel=1 then a.name2 else a.name1 end as name, count(a.name1) as counter from test a group by case when a.sel=1 then a.name2 else a.name1 end order by counter, name -- select coalesce(a.name1, a.name2) as name,count(a.sel) as counter from test a group by coalesce(a.name1, a.name2) select * from (select case when a.sel=1 then a.name2 else a.name1 end as name, count(a.name1) as counter from test a group by sel, name1, name2) drop table test; drop table trades_a if exists; create table trades_a(opened timestamp, userid int, points int); CREATE VIEW trades_scores AS SELECT (EXTRACT(YEAR FROM opened) || '-' || EXTRACT(MONTH FROM opened) || '-' || EXTRACT(DAY FROM opened)) AS date, userid, SUM(points) AS score FROM trades_a GROUP BY date, userid insert into trades_a values (now, 1, 10); select * from trades_scores; drop table trades_a cascade; -- drop table PROCESSDETAIL if exists; create table PROCESSDETAIL ( ID bigint not null, ALERTLEVEL integer not null, VALUE varchar(255) not null, TSTAMP timestamp not null, ATTRIBUTEKEY integer not null, PROCESSID bigint not null, primary key (ID) ); -- testdata (not needed to show this problem) insert into PROCESSDETAIL (ALERTLEVEL, VALUE, TSTAMP, ATTRIBUTEKEY, PROCESSID, ID) values (1, 66, '2007-01-01 08:00:00', 28, 9, 1); insert into PROCESSDETAIL (ALERTLEVEL, VALUE, TSTAMP, ATTRIBUTEKEY, PROCESSID, ID) values (0, 67, '2007-01-01 07:59:40', 28, 9, 2); insert into PROCESSDETAIL (ALERTLEVEL, VALUE, TSTAMP, ATTRIBUTEKEY, PROCESSID, ID) values (0, 67, '2007-01-01 06:59:40', 28, 9, 3); select * from PROCESSDETAIL t1 where exists ( select t2.PROCESSID, t2.ATTRIBUTEKEY from PROCESSDETAIL t2 where t2.PROCESSID=t1.PROCESSID and t2.ATTRIBUTEKEY=t1.ATTRIBUTEKEY and t2.PROCESSID=9 and t2.TSTAMP<='2007-01-01 08:00:00' group by t2.PROCESSID , t2.ATTRIBUTEKEY having max(t2.TSTAMP)=t1.TSTAMP); select case when 1<0 then 1 else sum(10) end as res from processdetail; DROP TABLE T1 IF EXISTS DROP TABLE T2 IF EXISTS CREATE TABLE T1 (COL1 INT, COL2 INT) CREATE TABLE T2 (COLA INT, COL2 INT, COLC INT, COLD DATETIME) INSERT INTO T1 VALUES (101, 201) INSERT INTO T1 VALUES (102, 201) INSERT INTO T1 VALUES (103, 202) INSERT INTO T1 VALUES (106, 202) INSERT INTO T1 VALUES (104, 203) INSERT INTO T1 VALUES (105, 203) INSERT INTO T2 VALUES (1001, 101, 101, '2007-08-10 10:00:00.0') INSERT INTO T2 VALUES (1002, 102, 101, '2007-08-10 10:00:00.0') INSERT INTO T2 VALUES (1003, 103, 101, '2007-08-10 10:00:00.0') INSERT INTO T2 VALUES (1004, 104, 101, '2007-08-10 10:00:00.0') INSERT INTO T2 VALUES (1004, 105, 101, '2007-08-10 10:00:00.0') SELECT T1A.COL1, T2A.COLA, MIN(T1A.COL2) AS COL2 FROM T1 T1A INNER JOIN T2 T2A ON T1A.COL2 = T2A.COL2 WHERE T2A.COLD = (SELECT MIN(T2B.COLD) FROM T1 T1B INNER JOIN T2 T2B ON T1B.COL2 = T2B.COL2 WHERE T1A.COL1 = T1B.COL1 AND T2A.COLA = T2B.COLA AND T2A.COLC = T2B.COLC) GROUP BY T1A.COL1, T2A.COLA CREATE TABLE DATE_TEST (DATECOL DATE) INSERT INTO DATE_TEST VALUES ('2006-01-01') INSERT INTO DATE_TEST VALUES ('2007-01-01') INSERT INTO DATE_TEST VALUES ('2008-01-01') SELECT * FROM DATE_TEST SELECT * FROM DATE_TEST WHERE DATECOL > '2007-01-01' SELECT * FROM DATE_TEST GROUP BY DATECOL HAVING DATECOL > '2007-01-01' SELECT MAX(DATECOL) FROM DATE_TEST HAVING MAX(DATECOL) > '2007-01-01' create table hist (mydate date, files int, space int); insert into hist values (current_date, 1, 10); select SUBSTR(CAST (MYDATE AS VARCHAR(20)),1,10), SUM(FILES), SUM(SPACE) from hist group by SUBSTR(CAST (MYDATE AS VARCHAR(20)),1,10) --- CREATE TABLE group_by_bug ( order_id INTEGER NOT NULL , item_id INTEGER NOT NULL , price FLOAT NOT NULL , tax_rate FLOAT NOT NULL , quantity INTEGER NOT NULL ); INSERT INTO group_by_bug ( order_id, item_id, price, tax_rate, quantity ) VALUES ( 1000, 100, 10, 10, 5 ); INSERT INTO group_by_bug ( order_id, item_id, price, tax_rate, quantity ) VALUES ( 1001, 100, 10.45, 15, 3 ); /*r 100,9.09E0,8 */SELECT item_id, ROUND(price / (1+(tax_rate/100)),2) AS price_net, SUM(quantity) AS quantity FROM group_by_bug GROUP BY item_id, ROUND(price / (1+(tax_rate/100)),2) /*r 100,9.09E0,8 */SELECT item_id, ROUND(price / (1+(tax_rate/100)),2) AS price, SUM(quantity) AS quantity FROM group_by_bug GROUP BY item_id, ROUND(price / (1+(tax_rate/100)),2) SHUTDOWN COMPACT; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfMultiGrants.txt0000644000175000017500000000532012007547344023556 0ustar renerene/*s*/DROP USER peon1; /*s*/DROP USER peon2; /*s*/DROP USER peon3; /*s*/DROP ROLE r1; /*s*/DROP ROLE r2; /*s*/DROP ROLE r3; /*s*/DROP ROLE r12; DROP TABLE t1 IF exists; DROP TABLE t2 IF exists; DROP TABLE t3 IF exists; DROP TABLE t4 IF exists; CREATE TABLE t1(i int); CREATE TABLE t2(i int); CREATE TABLE t3(i int); CREATE TABLE t4(i int); INSERT INTO t1 VALUES(1); INSERT INTO t2 VALUES(2); INSERT INTO t3 VALUES(3); INSERT INTO t4 VALUES(4); COMMIT; CREATE USER peon1 PASSWORD password; CREATE USER peon2 PASSWORD password; CREATE USER peon3 PASSWORD password; /*u0*/GRANT CHANGE_AUTHORIZATION TO peon1; /*u0*/GRANT CHANGE_AUTHORIZATION TO peon2; /*u0*/GRANT CHANGE_AUTHORIZATION TO peon3; /*u0*/CREATE ROLE r1; /*u0*/CREATE ROLE r2; /*u0*/CREATE ROLE r3; /*u0*/CREATE ROLE r12; /*u0*/GRANT ALL ON t1 TO r1; /*u0*/GRANT ALL ON t1 TO r12; /*u0*/GRANT ALL ON t2 TO r2; /*u0*/GRANT ALL ON t2 TO r12; /*u0*/GRANT ALL ON t3 TO r3; -- Can't mix right-grants and role-grants /*e*/GRANT r1, SELECT ON t1 TO peon1; /*e*/GRANT SELECT ON t1, r1 TO peon1; /*u0*/GRANT SELECT, INSERT ON t1 TO peon1; /*u0*/GRANT r2, r3 TO peon2; /*u0*/GRANT r12 TO peon3; CONNECT USER peon1 PASSWORD password; /*c1*/SELECT * FROM t1; /*e*/SELECT * FROM t2; /*e*/SELECT * FROM t3; /*e*/SELECT * FROM t4; CONNECT USER peon2 PASSWORD password; /*e*/SELECT * FROM t1; /*c1*/SELECT * FROM t2; /*c1*/SELECT * FROM t3; /*e*/SELECT * FROM t4; CONNECT USER peon3 PASSWORD password; /*c1*/SELECT * FROM t1; /*c1*/SELECT * FROM t2; /*e*/SELECT * FROM t3; /*e*/SELECT * FROM t4; CONNECT USER sa PASSWORD ""; /*u0*/GRANT r2 TO peon1; /*u0*/GRANT r3 TO r12; -- r12 held by peon3. Nest r3 into it too. /*u0*/GRANT SELECT ON t1 TO peon2; CONNECT USER peon1 PASSWORD password; /*c1*/SELECT * FROM t1; /*c1*/SELECT * FROM t2; /*e*/SELECT * FROM t3; /*e*/SELECT * FROM t4; CONNECT USER peon2 PASSWORD password; /*c1*/SELECT * FROM t1; /*c1*/SELECT * FROM t2; /*c1*/SELECT * FROM t3; /*e*/SELECT * FROM t4; CONNECT USER peon3 PASSWORD password; /*c1*/SELECT * FROM t1; /*c1*/SELECT * FROM t2; /*c1*/SELECT * FROM t3; /*e*/SELECT * FROM t4; -- Access to t3 has been granted only through r3, either directly or -- indirectly (the latter through nesting r3 in another role). CONNECT USER sa PASSWORD ""; DROP ROLE r3; CONNECT USER peon1 PASSWORD password; /*c1*/SELECT * FROM t1; /*c1*/SELECT * FROM t2; /*e*/SELECT * FROM t3; /*e*/SELECT * FROM t4; CONNECT USER peon2 PASSWORD password; /*c1*/SELECT * FROM t1; /*c1*/SELECT * FROM t2; /*e*/SELECT * FROM t3; /*e*/SELECT * FROM t4; CONNECT USER peon3 PASSWORD password; /*c1*/SELECT * FROM t1; /*c1*/SELECT * FROM t2; /*e*/SELECT * FROM t3; /*e*/SELECT * FROM t4; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfAlterColumn.txt0000644000175000017500000001357112007547346023543 0ustar renerenedrop table main if exists; drop table ref if exists; create table main (id int primary key, data varchar(20)) create table ref (id int primary key, data varchar(20) unique, ref int references main(id)) insert into main values 10, 'data' insert into ref values 1, 'data', 10 alter table ref drop column ref cascade alter table ref drop column data drop table ref create table ref (id int primary key, data varchar(20) unique, ref int references main(id)) alter table main drop column id cascade drop table "testac" if exists; drop table "testacc" if exists; -- tests for various column definition statements create table "testac" ("a" integer, "b" integer); insert into "testac" values(6,6); insert into "testac" values(5,5); /*r2*/select count(*) from "testac"; -- add column without COLUMN keyword alter table "testac" add "c" varchar(10) /*e*/alter table "testac" add "c" varchar(10) alter table "testac" alter column "c" varchar(2) /*e*/insert into "testac" values(5,5,'long string'); insert into "testac" values(4,4,'ls'); /*r 6,6,NULL 5,5,NULL 4,4,ls */select * from "testac" order by "a" desc -- drop column without COLUMN keyword alter table "testac" drop "c" /*r 6,6 5,5 4,4 */select * from "testac" order by "a" desc -- add column with COLUMN keyword alter table "testac" add column "c" varchar(10) default 'XX' not null before "b" /*e*/alter table "testac" add column "c" varchar(10) before "b" /*r 6,XX,6 5,XX,5 4,XX,4 */select * from "testac" order by "a" desc; -- drop column with COLUMN keyword alter table "testac" drop column "c"; /*r 6,6 5,5 4,4 */select * from "testac" order by "a" desc; -- add column without COLUMN keyword - unquoted alter table "testac" add c varchar(10); /*r 6,6,NULL 5,5,NULL 4,4,NULL */select * from "testac" order by "a" desc; -- drop column without COLUMN keyword - unquoted alter table "testac" drop c; /*r 6,6 5,5 4,4 */select * from "testac" order by "a" desc; -- GENERATED alter table "testac" alter column "a" generated always as identity (start with 7); insert into "testac" values default, 8 /*r 7,8 6,6 5,5 4,4 */select * from "testac" order by "a" desc; -- alter table "testac" alter column "a" drop generated; /*e*/insert into "testac" values default, 9 -- PK definition not allowed in alter column /*e*/alter table "testac" alter column "a" integer primary key; alter table "testac" add primary key("a"); /*e*/insert into "testac" values (null,7); delete from "testac" where "a" > 6 -- Old style identity added and removed alter table "testac" alter column "a" integer identity insert into "testac" values (default,7); alter table "testac" alter column "a" integer /*e*/insert into "testac" values (default,8); delete from "testac" where "a" > 6 or "a" < 4 -- IDENTITY cannot be added with a data type change statement /*e*/alter table "testac" alter column "a" set data type integer generated by default as identity (start with 7); alter table "testac" alter column "a" generated by default as identity (start with 7); insert into "testac" values (default,7); insert into "testac" ("b") values (8); /*r 4,4 5,5 6,6 7,7 8,8 */select * from "testac" order by "a"; create table "testacc" as (select * from "testac") with data; -- Old style identity can be dropped from PK column alter table "testac" alter column "a" integer; /*e*/insert into "testac" values (null,9); alter table "testac" alter column "a" generated by default as identity (start with 9) insert into "testac" values (null,9); insert into "testac" values (default,9); /*r 4,4 5,5 6,6 7,7 8,8 9,9 10,9 */select * from "testac"; alter table "testac" drop primary key; alter table "testac" alter column "a" drop generated insert into "testac" values (null,12); /*c8*/select * from "testac"; /*e*/alter table "testac" alter column "a" not null; delete from "testac" where "a" is null delete from "testac" where "a" > 9 /*c6*/select * from "testac"; alter table "testac" alter column "a" set not null; /*e*/insert into "testac" values (null,12); alter table "testac" add primary key("a"); /*c6*/select * from "testac"; /*e*/insert into "testac" values (null,12); alter table "testac" drop primary key; /*e*/insert into "testac" values (null,12); /*c6*/select * from "testac"; alter table "testac" alter column "a" set null; insert into "testac" values (null,12); delete from "testac" where "a" is null /*c6*/select * from "testac"; -- column with a PK constraint can be added alter table "testac" add column "c" integer generated by default as identity primary key -- no second IDENTITY or PK /*e*/alter table "testac" add column "d" integer generated by default as identity primary key /*e*/alter table "testac" add column "d" integer generated by default as identity /*e*/alter table "testac" add column "d" integer primary key; -- column with a PK constraint can be dropped alter table "testac" drop "c"; alter table "testac" add unique("a"); /*e*/insert into "testac" values(9,9); alter table "testac" drop "a"; /*r 4 5 6 7 8 9 */select * from "testac"; -- tests for changing column size alter table "testacc" add column "c" varchar(4) default 'aa' not null; update "testacc" set "c" = "c" || cast("a" as varchar(5)); /*r 4,4,aa4 5,5,aa5 6,6,aa6 7,7,aa7 8,8,aa8 */select * from "testacc"; alter table "testacc" add primary key ("c") /*r 4,4,aa4 5,5,aa5 6,6,aa6 7,7,aa7 8,8,aa8 */select * from "testacc"; /*e*/insert into "testacc" values (9,9,'aa9000000'); alter table "testacc" alter column "c" varchar(10); insert into "testacc" values (9,9,'aa9000000'); alter table "testacc" alter column "c" set not null /*e*/insert into "testacc" values (10,10,null); /*e*/alter table "testacc" alter column "c" set null; alter table "testacc" drop primary key; alter table "testacc" alter column "c" set null; insert into "testacc" values (10,10,null); hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfStoredProcedureTypes.txt0000644000175000017500000001642612007547344025454 0ustar renerene-- PARAMETERS IN -- Type SMALLINT DROP PROCEDURE procedure_test IF EXISTS; CREATE PROCEDURE procedure_test(IN val SMALLINT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu INT; SET valu = val; END call procedure_test(0); call procedure_test(5); call procedure_test(-5); /*e*/call procedure_test(40000); /*e*/call procedure_test(-40000); /*e*/call procedure_test('a'); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; -- Type INT CREATE PROCEDURE procedure_test(IN val INT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu INT; SET valu = val; END call procedure_test(0); call procedure_test(5); call procedure_test(-5); call procedure_test(40000); call procedure_test(-40000); /*e*/call procedure_test(123456789012345); /*e*/call procedure_test(-123456789012345); /*e*/call procedure_test('a'); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; CREATE PROCEDURE procedure_test(IN val INTEGER) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu INT; SET valu = val; END call procedure_test(0); call procedure_test(5); call procedure_test(-5); call procedure_test(40000); call procedure_test(-40000); /*e*/call procedure_test(123456789012345); /*e*/call procedure_test(-123456789012345); /*e*/call procedure_test('a'); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; -- Type BIGINT CREATE PROCEDURE procedure_test(IN val BIGINT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu BIGINT; SET valu = val; END call procedure_test(0); call procedure_test(5); call procedure_test(-5); call procedure_test(40000); call procedure_test(-40000); call procedure_test(123456789012345); call procedure_test(-123456789012345); /*e*/call procedure_test(12345678901234567890123456789012345678790); /*e*/call procedure_test(-12345678901234567890123456789012345678790); /*e*/call procedure_test('a'); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; -- Type DECIMAL CREATE PROCEDURE procedure_test(IN val DECIMAL) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu DECIMAL; SET valu = val; END call procedure_test(0); call procedure_test(5); call procedure_test(-5); call procedure_test(40000); call procedure_test(-40000); call procedure_test(123456789012345); call procedure_test(-123456789012345); call procedure_test(1.034); call procedure_test(-1.3E24); /*e*/call procedure_test(1.04324324423E352); /*e*/call procedure_test('a'); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; CREATE PROCEDURE procedure_test(IN val NUMERIC) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu DECIMAL; SET valu = val; END call procedure_test(0); call procedure_test(5); call procedure_test(-5); call procedure_test(40000); call procedure_test(-40000); call procedure_test(123456789012345); call procedure_test(-123456789012345); call procedure_test(1.034); call procedure_test(-1.3E24); call procedure_test(1.0E35); /*e*/call procedure_test('a'); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; -- Type DOUBLE CREATE PROCEDURE procedure_test(IN val FLOAT) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu DECIMAL; SET valu = val; END call procedure_test(0); call procedure_test(5); call procedure_test(-5); call procedure_test(40000); call procedure_test(-40000); call procedure_test(123456789012345); call procedure_test(-123456789012345); call procedure_test(1.034); call procedure_test(-1.3E24); call procedure_test(1.04324324423E42); /*e*/call procedure_test('a'); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; CREATE PROCEDURE procedure_test(IN val DOUBLE) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu DECIMAL; SET valu = val; END call procedure_test(0); call procedure_test(5); call procedure_test(-5); call procedure_test(40000); call procedure_test(-40000); call procedure_test(123456789012345); call procedure_test(-123456789012345); call procedure_test(1.034); call procedure_test(-1.3E24); call procedure_test(1.04324324423E11); /*e*/call procedure_test('a'); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; -- Type CHAR CREATE PROCEDURE procedure_test(IN val CHAR(1)) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu VARCHAR(10); SET valu = val; END call procedure_test('a'); /*e*/call procedure_test(5); /*e*/call procedure_test(-5); call procedure_test(''); /*e*/call procedure_test('ab'); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; -- Type CHAR CREATE PROCEDURE procedure_test(IN val CHAR(10)) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu VARCHAR(10); SET valu = val; END call procedure_test('0123456789'); /*e*/call procedure_test(5); /*e*/call procedure_test(-5); call procedure_test(''); call procedure_test('ab'); /*e*/call procedure_test('0123456789a'); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; -- Type VARCHAR CREATE PROCEDURE procedure_test(IN val VARCHAR(1)) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu VARCHAR(10); SET valu = val; END call procedure_test('a'); /*e*/call procedure_test(5); /*e*/call procedure_test(-5); call procedure_test(''); /*e*/call procedure_test('ab'); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; CREATE PROCEDURE procedure_test(IN val VARCHAR(10)) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu VARCHAR(10); SET valu = val; END call procedure_test('a'); call procedure_test('0123456789'); /*e*/call procedure_test(5); /*e*/call procedure_test(-5); call procedure_test(''); call procedure_test('ab'); /*e*/call procedure_test('0123456789a'); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; -- Type DATE CREATE PROCEDURE procedure_test(IN val DATE) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu DATE; SET valu = val; END call procedure_test({d '2010-01-01'}); /*e*/call procedure_test('a'); /*e*/call procedure_test(5); /*e*/call procedure_test(-5); /*e*/call procedure_test(''); /*e*/call procedure_test('ab'); /*e*/call procedure_test({t '10:00:00'}); call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; -- Type TIME CREATE PROCEDURE procedure_test(IN val TIME) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu TIME; SET valu = val; END call procedure_test({t '10:00:00'}); /*e*/call procedure_test('a'); /*e*/call procedure_test(5); /*e*/call procedure_test(-5); /*e*/call procedure_test(''); /*e*/call procedure_test('ab'); /*e*/call procedure_test({d '2010-01-01'}); /*e*/call procedure_test({ts '2010-01-01 10:00:00'}); DROP PROCEDURE procedure_test; -- Type TIMESTAMP CREATE PROCEDURE procedure_test(IN val TIMESTAMP) MODIFIES SQL DATA BEGIN ATOMIC DECLARE valu TIMESTAMP; SET valu = val; END call procedure_test({ts '2010-01-01 10:00:00'}); /*e*/call procedure_test('a'); /*e*/call procedure_test(5); /*e*/call procedure_test(-5); /*e*/call procedure_test(''); /*e*/call procedure_test('ab'); call procedure_test({d '2010-01-01'}); /*e*/call procedure_test({t '10:00:00'}); DROP PROCEDURE procedure_test; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfTempTable2.txt0000644000175000017500000000132512007547346023247 0ustar renerene-- This script depends on TestSelfTempTable1.txt to set up the objects tested. SET AUTOCOMMIT false; /*c0*/SELECT * FROM tmptbl1; /*c0*/SELECT * FROM tmptbl2; COMMIT; CONNECT USER altuser2 PASSWORD password; /*e*/SELECT * FROM tmptbl1; /*e*/SELECT * FROM tmptbl2; CONNECT USER altuser1 PASSWORD password; /*c0*/SELECT * FROM tmptbl1; /*c0*/SELECT * FROM tmptbl2; /*u1*/INSERT INTO tmptbl1 VALUES(1); /*u1*/INSERT INTO tmptbl1 VALUES(2); /*c2*/SELECT * FROM tmptbl1; COMMIT; -- Purposefully not committing these inserts /*c0*/SELECT * FROM tmptbl1; /*u1*/INSERT INTO tmptbl2 VALUES(1); /*u1*/INSERT INTO tmptbl2 VALUES(2); /*c2*/SELECT * FROM tmptbl2; ROLLBACK; CONNECT USER SA password ""; SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSchemaPersistC2.txt0000644000175000017500000001176512007547344024256 0ustar renerene-- Test ALTER commands on objects set up by other script -- SEQUENCES /*r22*/SELECT next value FOR public.s00 FROM public.mt01; /*r23*/SELECT next value FOR blaine.bs00 FROM public.mt01; /*r24*/SELECT next value FOR blaine.bs01 FROM public.mt01; /*r25*/SELECT next value FOR public.s01 FROM public.mt01; -- Resetting all sequence vals so next script can retest them. /*u0*/ALTER SEQUENCE public.s00 RESTART WITH 22; /*u0*/ALTER SEQUENCE blaine.bs00 RESTART WITH 23; /*u0*/ALTER SEQUENCE blaine.bs01 RESTART WITH 24; /*u0*/ALTER SEQUENCE public.s01 RESTART WITH 25; -- RENAMES /*c0*/SELECT * FROM blaine.rbmt00; /*c0*/SELECT * FROM blaine.rbct00; /*c0*/SELECT * FROM public.rmt00; /*c0*/SELECT * FROM public.rct00; /*u0*/SET SCHEMA public; /*u0*/ALTER TABLE blaine.rbmt00 RENAME TO bmt00; /*u0*/ALTER TABLE blaine.bmt00 RENAME TO blaine.rbmt00 /*u0*/ALTER TABLE blaine.rbct00 RENAME TO blaine.bct00 /*u0*/ALTER TABLE rct00 RENAME TO ct00; /*u0*/ALTER TABLE ct00 RENAME TO public.rct00; /*u0*/SET SCHEMA blaine; /*u0*/ALTER TABLE bct00 RENAME TO rbct00 /*u0*/ALTER TABLE public.rmt00 RENAME TO public.mt00; /*u0*/ALTER TABLE public.mt00 RENAME TO rmt00; /*c0*/SELECT * FROM blaine.rbmt00; /*c0*/SELECT * FROM blaine.rbct00; /*c0*/SELECT * FROM public.rmt00; /*c0*/SELECT * FROM public.rct00; /*u0*/SET SCHEMA public; /*u0*/ALTER INDEX blaine.rbmi00 RENAME TO bmi00; /*u0*/SET SCHEMA blaine; /*u0*/ALTER INDEX rbci00 RENAME TO bci00; /*u0*/ALTER INDEX public.rmi00 RENAME TO public.mi00; /*u0*/ALTER INDEX public.rci00 RENAME TO ci00; /*u0*/SET SCHEMA public; /*u0*/ALTER INDEX blaine.bmi00 RENAME TO rbmi00; /*u0*/SET SCHEMA blaine; /*u0*/ALTER INDEX bci00 RENAME TO rbci00; /*u0*/ALTER INDEX public.mi00 RENAME TO public.rmi00; /*u0*/ALTER INDEX public.ci00 RENAME TO rci00; /*u0*/SET SCHEMA public; /*u0*/ALTER INDEX blaine.rbmui05 RENAME TO bmui05; /*u0*/SET SCHEMA blaine; /*u0*/ALTER INDEX rbcui05 RENAME TO bcui05; /*u0*/ALTER INDEX public.rmui05 RENAME TO public.mui05; /*u0*/ALTER INDEX public.rcui05 RENAME TO cui05; /*u0*/SET SCHEMA public; /*u0*/ALTER INDEX blaine.bmui05 RENAME TO rbmui05; /*u0*/SET SCHEMA blaine; /*u0*/ALTER INDEX bcui05 RENAME TO rbcui05; /*u0*/ALTER INDEX public.mui05 RENAME TO public.rmui05; /*u0*/ALTER INDEX public.cui05 RENAME TO rcui05; -- ALTER TABLE ADD/DROP CONS -- We'll roll all this work back so we can repeat it. -- Check constraints but no unique constraints, so cam commit duplicate vals. /*e*/INSERT INTO public.mt11 values(0); /*e*/INSERT INTO public.mt12 values(0); /*e*/INSERT INTO public.mt13 values(0); /*e*/INSERT INTO public.mt14 values(0); /*e*/INSERT INTO blaine.bmt11 values(0); /*e*/INSERT INTO blaine.bmt12 values(0); /*e*/INSERT INTO blaine.bmt13 values(0); /*e*/INSERT INTO blaine.bmt14 values(0); /*u1*/INSERT INTO public.mt11 values(1); /*u1*/INSERT INTO public.mt12 values(1); /*u1*/INSERT INTO public.mt13 values(1); /*u1*/INSERT INTO public.mt14 values(1); /*u1*/INSERT INTO blaine.bmt11 values(1); /*u1*/INSERT INTO blaine.bmt12 values(1); /*u1*/INSERT INTO blaine.bmt13 values(1); /*u1*/INSERT INTO blaine.bmt14 values(1); COMMIT; SET AUTOCOMMIT FALSE; -- Test vs. some values entered in previous sessoin, and some that we'll add. /*e*/INSERT INTO public.ct11 values(1); /*e*/INSERT INTO public.ct12 values(1); /*e*/INSERT INTO public.ct13 values(1); /*e*/INSERT INTO public.ct14 values(1); /*u1*/INSERT INTO public.ct11 values(2); /*u1*/INSERT INTO public.ct12 values(2); /*u1*/INSERT INTO public.ct13 values(2); /*u1*/INSERT INTO public.ct14 values(2); /*u1*/INSERT INTO blaine.bct11 values(2); /*u1*/INSERT INTO blaine.bct12 values(2); /*u1*/INSERT INTO blaine.bct13 values(2); /*u1*/INSERT INTO blaine.bct14 values(2); /*e*/INSERT INTO blaine.bct11 values(2); /*e*/INSERT INTO blaine.bct12 values(2); /*e*/INSERT INTO blaine.bct13 values(2); /*e*/INSERT INTO blaine.bct14 values(2); ROLLBACK; -- Unique constraints on the PK tables, but not on our FK tables here, -- so cam commit duplicate vals. /*u1*/INSERT INTO public.ct15 values(10); /*e*/INSERT INTO public.ct16 values(10); /*u1*/INSERT INTO public.ct17 values(10); /*u1*/INSERT INTO blaine.bct18 values(10); /*u1*/INSERT INTO blaine.bct17 values(10); /*e*/INSERT INTO public.ct15 values(8); /*e*/INSERT INTO public.ct16 values(8); /*e*/INSERT INTO public.ct17 values(8); /*e*/INSERT INTO public.ct18 values(8); /*e*/INSERT INTO blaine.bct17 values(8); /*e*/INSERT INTO blaine.bmt21 VALUES (2); /*u1*/INSERT INTO blaine.bmt21 VALUES (1); /*e*/INSERT INTO blaine.bmt20 VALUES (2); /*u1*/INSERT INTO blaine.bmt20 VALUES (1); /*e*/INSERT INTO blaine.bmt22 VALUES (2); /*u1*/INSERT INTO blaine.bmt22 VALUES (1); /*e*/INSERT INTO blaine.bmt23 VALUES (2); /*u1*/INSERT INTO blaine.bmt23 VALUES (1); /*e*/INSERT INTO blaine.bmt25 VALUES (2); /*u1*/INSERT INTO blaine.bmt25 VALUES (1); SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelf.txt0000644000175000017500000015072512007547346021400 0ustar renerene-- -- TestSelf.txt -- -- TestSelf.txt is used by TestSelf.java to test the database -- -- Comment lines must start with -- and are ignored -- Lines starting with spaces belongs to last line -- Checked lines start with comments containing where is: -- c ResultSet expects a with rows -- r ResultSet expected with result in first row/column -- u Update count expected -- e Exception must occur -- set database transaction control locks -- Miscelaneous tests by fredt -- bug #897591 /*rgood*/CALL CASEWHEN(CURTIME() BETWEEN CAST('00:00:00' AS TIME) AND CAST('23:59:59' AS TIME), 'good', 'bad') -- Referential integrity with cascading delete -- identity column create table main(id int identity,name varchar(10)) create table ref(id int identity,idMain int, foreign key(idMain)references main(id) on delete cascade) create table ref2(id int identity,idMain int, foreign key(idMain)references ref(id) on delete cascade) /*u1*/ insert into main values(null,'test') /*e*/ insert into ref values(null,2) /*u1*/ insert into ref values(null,0) /*u1*/ insert into main values(10,1) -- next main.id value should be 11 /*u1*/ insert into main values(null,1) /*u1*/ insert into ref values(null,11) /*e*/ insert into ref values(null,12) /*u1*/ insert into ref2 values(null,1) /*u3*/ delete from main /*c0*/ select * from main /*c0*/ select * from ref /*c0*/ select * from ref2 /*u1*/ insert into main values(1,'test') /*u1*/ insert into main values(2,'test2') /*u1*/ insert into ref values(2,2) /*e*/ update main set id=2-id /*e*/ drop table main; drop table ref2;drop table ref;drop table main -- Data Definition drop table T1 if exists drop table T2 if exists create table T1(Nr integer) create table T2(Nr integer primary Key) create table T3(Nr integer,dbl double,vc varchar(10),cc char(1)) create table T4(nr integer,lvc longVarChar(100),dt date,tm time) create table T5(dec decimal(10) primary key,b binary(1) not null) create table "T6"("x" tinyint,s smallint not null,b bigint) create table t7("-x's'-" real,f float(2),n numeric,t timestamp) create table t8(bin binary,vb varbinary(10),lvb longvarbinary(100)) create table t9(nr integer not null,x smallint not null primary key) create unique index it1 on t1(nr) script create index it2 on t2(nr) create index it3 on t3(nr,dbl,vc,cc) create unique index it4 on t4(nr,lvc,tm) drop index it4 create unique index it4 on t4(nr,tm) drop index it4 create index it4 on t4(tm,nr) -- a duplicate index create index it4b on t4(tm,nr) create unique index it4c on t4(tm,nr) drop index it4b create index it9 on t9(nr,x); drop table t1;drop table t2;drop table "T3"; DROP TABLE T4;Drop Table T5; drop table T6 drop table t7; drop table t8; drop table t9 create user "test" password "test-p" GRANT CHANGE_AUTHORIZATION TO "test" create table test (id integer) revoke all on test from "test" restrict select * from test order by test.id grant all on test to "test" grant select on test to "test" revoke select,insert,update,delete on test from "test" restrict connect user "test" password "test-p" set password "test-p2" connect user sa password "" connect user "test" password "test-p2" connect user sa password "" set autocommit false insert into test values (1) update test set id = 3 rollback insert into test values (2) delete from test rollback commit script drop table test drop user "test" script set autocommit true create memory table test (id integer) drop table test -- still supporting noise word "null" after type definition create cached table test (id integer null) drop table test -- Data Manipulation without result create table address(nr integer,name varchar(16),placezip smallint) insert into address values(1,'Boss',3000) insert into address (nr,name,placezip) values(2,'Walt',8000) insert into address values(-3,'',0) insert into address select * from address where nr>0 update address set nr=4 where nr=-2 insert into address values(3,'x',3000) insert into address (name,nr,placezip) values('y',4,8000) insert into address (name,nr,placezip) select name,placezip,nr from address where name like 'x%' delete from address where name like 'x%' update address set name='Rene' where nr=4 update address set nr=5, name='What' where nr=1 and name='Boss' create table place(zip smallint,name longvarchar(100),country char(4)) insert into place values(3000,'Langenthal\t1','CH') insert into place values(0,'\\\\Heaven',null) insert into place values(8000,'Zürich','CH') insert into place values(-1,'NULL','null') create table invoices(addressnr integer,total decimal) insert into invoices values(4,1003834.05) insert into invoices values(2,-4987770.01) insert into invoices select * from invoices where not total>=0. update invoices set total=10 where total < 0 insert into invoices values(2,10) set schema INFORMATION_SCHEMA select * from system_tables select * from SYSTEM_SESSIONINFO set schema PUBLIC create table t_double(id integer,d double,f double) insert into t_double values(1,1.2,1.4) insert into t_double values(2,1.4,1.0) create table t_date (id integer,d date,t time,ts timestamp ) insert into t_DATE values(0,{d '1999-08-21'},'18:53:00',null) insert into t_date values(1,'1999-08-22','17:00:01','2000-02-29 10:00:00') create table t_bit (b1 boolean,b2 boolean) insert into t_bit values(false,false) insert into t_bit select b2,b1 from t_bit insert into t_bit values(true,false) insert into t_bit values(true,true) create table Problem(Nr bigint,ClassNr bigint,StateNr bigint,Name varchar(40)); create table Class(Nr bigint, Name varchar(20), Node varchar(20)); insert into Problem values(10, 1, 3, 'Problem 10; Class 1; State 3'); insert into Problem values(20, 2, 2, 'Problem 20; Class 2; State 2'); insert into Problem values(30, 3, 2, 'Problem 30; Class 3; State 2'); insert into Class values(1, 'Class/State 1','Node A'); insert into Class values(2, 'Class/State 2','Node B'); insert into Class values(3, 'Class/State 3','Node C'); CREATE CACHED TABLE HLO(NRO INTEGER,NIMI VARCHAR(10),PTMP INTEGER) CREATE INDEX INRO ON HLO(NRO) INSERT INTO HLO VALUES(1,'hlo 1',0) INSERT INTO HLO VALUES(2,'hlo 2',0) INSERT INTO HLO VALUES(3,'hlo 3',0) INSERT INTO HLO VALUES(4,'hlo 4',0) INSERT INTO HLO VALUES(5,'hlo 5',0) insert into hlo values(10,'10',0); delete from hlo where nro=10; DROP TABLE HLO -- Select with update count /*c6*/ select * from address /*c0*/ select * from address where nr in(-1) /*c4*/ select * from place /*c4*/ select * from invoices /*c1*/ select nr from address where nr<0 /*c0*/ select * from address where nr>=0 and nr<=0 /*c1*/ select count(*) from address where nr=-99 /*c0*/ select * from address where not name like '%' /*c1*/ select * from address,place p where (nr=4) and p.zip=placezip /*c1*/ select * from address,place p where (nr=4 or nr>3 and nr<2) and p.zip=placezip or (p.zip>0 and p.zip<-1 or p.zip=-2) /*c1*/select * from address a,place p,invoices i where a.placezip=p.zip and a.nr=i.addressnr and i.addressnr=4 /*c1*/ select p.zip,p.*,country from address a,place p,invoices i where a.placezip=p.zip and a.nr=i.addressnr and i.addressnr=4 /*c7*/ select * from address union all select * from address where nr=4 /*c1*/ select max(place.zip) x from place /*c0*/ select * from address where name like 'Wal_' escape 'l' /*c2*/ select * from address where name like 'Wal_' escape '+' /*c4*/ select total as x from invoices order by addressnr desc,total asc /*c3*/ select place.* from place where not country = 'NULL' and not name is null and not name is NULL and not name = 'null' and not country = 'NULL' order by zip /*c3*/ select * from address where nr in (1,5,99,5,4) /*c1*/ select * from (select * from address) as address where nr=4 -- from 1.7.2, next result no longer returns null == null /*c5*/ select p1.country from place p1,place p2 where p1.country=p2.country /*c1*/ select * from t_double where id>-10 and d>1.3 and d>.3 /*c2*/ select * from t_double where d>-20 or f<10.2 /*c2*/ select d,t,d from t_date where d>'1900-08-21'; /*e*/ select d,*,d from t_date where ts>'2000-01-01 00:00:00' /*e*/ select t_date.*,* from t_date where t<='01:00:00' /*c2*/ select * from t_bit where b1<=false or b2>true /*c2*/ select * from t_bit where not(b1<=false or b2>true) /*c2*/ select P.*, C.Name ClassName from Problem P,Class C where P.Nr in(10,20) and P.ClassNr=C.Nr /*c1*/ select P.*, S.Name StateName, S.Node StateNode, C.Name ClassName, C.Node ClassNode from Problem P, Class S, Class C where P.Nr = 10 and P.ClassNr = C.Nr and P.StateNr = S.Nr -- ResultSet with value /*u0*/ create table empty(c char); /*u0*/ create table test(nr integer,name char(5)); /*r0*/ select count(*) from test; /*u1*/ insert into test values(1,null); /*r1*/ select nr from test group by nr; /*r2*/ update test set nr=2;select avg(nr) from test /*r3*/ update test set nr=1+1*2;select sum(nr) from test /*r-3*/ update test set nr=-(select max(t2.nr) from test t2);select nr from test /*r4*/ update test set nr=2*(1- -1);select nr from test /*r4*/ select sum(nr) from test where nr in(select t2.nr from test t2) /*e*/ update test set nr=1/0 update test set nr=null; /*rNULL*/ select nr from test update test set nr=null; /*rNULL*/ select nr from test /*r2*/ update test set nr=4/2;select "TEST"."NR" from test /*r34 */ update test set name='3' || '4';select distinct name from test /*rHo*/ select 'Ho' as hhoo from TEsT where name in ('34','y','z') update test set name=null; /*rNULL*/select name from "TEST" -- case sensitivity tests create table "t6"("x" char(6),s smallint not null,b bigint, c binary); /*r0*/ select count(*) from "t6" /*u1*/ insert into "t6" values('CaseS',100, 1000000000000, null); /*rCaseS */ select "x" from "t6" /*u1*/ delete from "t6" /*u1*/ insert into "t6" values(null,100, 1000000000000, null); /*u1*/ delete from "t6" -- Finish drop table address drop table place drop table invoices drop table t_double;drop table t_date drop table t_bit drop table problem; drop table class -- Other tests CREATE TABLE Address(ID INTEGER PRIMARY KEY,organization VARCHAR(20), address1 VARCHAR(20),address2 VARCHAR(20),address3 VARCHAR(20),city VARCHAR(20), state VARCHAR(20),zipCode VARCHAR(20),countryID INTEGER,phone VARCHAR(20), phoneExtension VARCHAR(20),fax VARCHAR(20),eMail VARCHAR(20)) CREATE TABLE Country(ID INTEGER PRIMARY KEY,name VARCHAR(20)) INSERT INTO COUNTRY(ID, name) VALUES(23, 'USA') /*u1*/INSERT INTO ADDRESS(ID, countryID) VALUES(5, (SELECT ID FROM Country WHERE name = 'USA')) SELECT * FROM ADDRESS INNER JOIN COUNTRY ON CountryID = COUNTRY.ID SELECT * FROM ADDRESS LEFT JOIN COUNTRY ON CountryID = COUNTRY.ID INSERT INTO ADDRESS(ID) VALUES(6) /*c1*/SELECT * FROM ADDRESS ad INNER JOIN COUNTRY ON ad.CountryID = COUNTRY.ID /*c2*/SELECT * FROM ADDRESS LEFT JOIN COUNTRY ON CountryID = COUNTRY.ID SELECT * FROM Address,Country WHERE Address.countryID=Country.ID AND EXISTS (SELECT C.Name FROM Country AS C WHERE C.ID=Country.ID) AND EXISTS (SELECT * FROM Country AS C WHERE C.ID=Address.countryID) -- retain metadata CREATE TABLE META_TEST( ID numeric(10), GEOX decimal(10,2), BLURB VARCHAR(50)); -- ignorecase tests create table test_ic(name varchar_ignorecase(20)) insert into test_ic values('Hello') insert into test_ic values('World') /*c0*/select * from test_ic where name like 'HALLO' /*c1*/select * from test_ic where name like 'HELLO' /*c1*/select * from test_ic where 'HELLO' like name /*c1*/select * from test_ic where name = 'world' drop table test_ic -- test maxrows create table test_maxrows(id int) insert into test_maxrows values(0); insert into test_maxrows select id+1 from test_maxrows; insert into test_maxrows select id+2 from test_maxrows; insert into test_maxrows select id+4 from test_maxrows; /*r 4 3 2 1 */select id from test_maxrows order by id desc limit 4 offset 3 /*r 4 3 2 1 */select id from test_maxrows order by id desc offset 3 fetch 4 rows only /*r 4 3 */select id from test_maxrows order by id desc limit 2 offset 3 set maxrows 3 /*c3*/select * from test_maxrows set maxrows 3 /*c3*/select id from test_maxrows order by id desc set maxrows 3 /*r 7 6 5 */select id from test_maxrows order by id desc set maxrows 3 /*r 4 3 2 */select id from test_maxrows order by id desc limit 4 offset 3 set maxrows 3 /*r 4 3 */select id from test_maxrows order by id desc limit 2 offset 3 set maxrows 3 /*r8*/select count(*) from test_maxrows set maxrows 3 /*r7*/select max(id) from test_maxrows set maxrows 3 /*c0*/select id from test_maxrows except select id from test_maxrows set maxrows 3 /*c3*/select id from test_maxrows group by id set maxrows 0 /*c8*/select * from test_maxrows drop table test_maxrows -- test functions CREATE TABLE Product(ID INTEGER PRIMARY KEY,Name VARCHAR(255),Cost DECIMAL(10,4)) insert into product values (0,'Test',10.3444) /*r10.34*/select round(cost,2) from product /*r10.3444*/select cost from product drop table product -- IN (subquery) create table A ( C1 VARCHAR(10)) create table B ( C1 VARCHAR(10)) insert into A (C1) values ('one') insert into A (C1) values ('two') insert into B (C1) values ('one') /*c1*/ select * from B where C1 in (select C1 from A) drop table A drop table B -- simple transactional tests CREATE TABLE PRODUCT(ID INTEGER PRIMARY KEY,NAME VARCHAR(20),COST DECIMAL(10,4)) INSERT INTO PRODUCT VALUES(0,'Iron',5.4) INSERT INTO PRODUCT VALUES(1,'Wood',24.8) INSERT INTO PRODUCT VALUES(2,'Fire',24.8) SET AUTOCOMMIT FALSE INSERT INTO PRODUCT VALUES(3,'ERR1',0.0) INSERT INTO PRODUCT VALUES(4,'ERR1',0.0) DELETE FROM PRODUCT WHERE ID=2 UPDATE PRODUCT SET NAME='ERR2' WHERE NAME<>'ERR1' /*c2*/ SELECT * FROM PRODUCT WHERE NAME='ERR1' /*c2*/ SELECT * FROM PRODUCT WHERE NAME='ERR2' /*c4*/ SELECT * FROM PRODUCT ROLLBACK /*c0*/ SELECT * FROM PRODUCT WHERE NAME='ERR1' /*c0*/ SELECT * FROM PRODUCT WHERE NAME='ERR2' /*c3*/ SELECT * FROM PRODUCT SET AUTOCOMMIT TRUE DROP TABLE PRODUCT -- Exceptions /*e*/ + /*e*/ select nr from address union select nr,nr from address /*e*/ create something /*e*/ create index x on address (nr + /*e*/ create table p2 (id integer primary key, id2 integer primary key) /*e*/ create table p3 (id integer primary key + 2) /*e*/ drop index x /*e*/ drop all /*e*/ create table test(nr integer); insert into test values (10 and) /*e*/ select oh from test /*e*/ create table test(nr integer) /*e*/ create user 'test' password 'test';connect user 'test' password 'test'; select * from test; /*e*/ connect user 'sa' password ''; drop user 'test'; drop it now /*e*/ insert into test values(1);insert into test rows /*e*/ create unique index i1 on test(id);select * from (oh what) /*e*/ insert into test values(2); update test set id=1; /*e*/ select * from test where id in (1 (2) 3) /*e*/ select o.* from test /*e*/ select * from test where id like '0' escape 'maybe' /*e*/ insert into test (nr and so on) values (1) /*e*/ insert into test values (select * from test union select * from test) /*e*/ update test set nr=1+(3+5 'x' /*e*/ update test set nr=1.....3 /*e*/ select *.* from test /*e*/ select * from test where id>2 and (id>3; /*e*/ select * from test order it /*e*/ creat unique index 1 /*e*/ select id from test where yes>2; /*e*/ select id from test where id has 5 /*e*/ grant access /*e*/ connect user or maybe not /*e*/ set parameter /*e*/ set autocommit and /*e*/ select column as column plus /*e*/ select * from hm /*e*/ grant all about it /*e*/ create table wrong(id usertype) /*e*/ select #strange# /*e*/ create table mem(i int)drop table mem", -- ResultSet with sizes drop table test; create table test(nr integer,name char(5), other varchar(10)); /*r0*/ select count(*) from test; insert into test values(1,null,null); /*r1*/ select nr from test group by nr; /*e*/ insert into test values(2,'1234567',''); /*u1*/ insert into test values(2,'12345',''); /*r12345*/ select name from test where nr=2; /*r123 */insert into test values(3,'123',''); select name from test where nr=3; /*r12345*/ insert into test values(4,'','12345'); select other from test where nr=4; insert into test values(5,'','123'); /*r123*/ select other from test where nr=5; drop table test; DROP TABLE ITEM IF EXISTS DROP TABLE CUSTOMER IF EXISTS DROP TABLE PRODUCT IF EXISTS DROP TABLE ADDRESS IF EXISTS CREATE TABLE CUSTOMER(ID INTEGER PRIMARY KEY,FIRSTNAME VARCHAR(255), LASTNAME VARCHAR(255),STREET VARCHAR(255),CITY VARCHAR(255)) CREATE TABLE PRODUCT(ID INTEGER PRIMARY KEY,NAME VARCHAR(255),COST DECIMAL) CREATE TABLE INVOICE(ID INTEGER PRIMARY KEY, CUSTOMERID INTEGER,TOTAL DECIMAL) CREATE TABLE ITEM(INVOICEID INTEGER,POS INTEGER,PRODUCTID INTEGER, QUANTITY INTEGER,PRICE DECIMAL, CONSTRAINT SYSTEM_PK PRIMARY KEY(INVOICEID,POS)) INSERT INTO CUSTOMER VALUES(0,'Laura','Steel','429 Seventh Av.','Dallas') INSERT INTO CUSTOMER VALUES(1,'Susanne','King','366 - 20th Ave.','Olten') INSERT INTO CUSTOMER VALUES(2,'Anne','Miller','20 Upland Pl.','Lyon') INSERT INTO CUSTOMER VALUES(3,'Michael','Clancy','542 Upland Pl.','San Francisco') INSERT INTO CUSTOMER VALUES(4,'Sylvia','Ringer','365 College Av.','Dallas') INSERT INTO CUSTOMER VALUES(5,'Laura','Miller','294 Seventh Av.','Paris') INSERT INTO CUSTOMER VALUES(6,'Laura','White','506 Upland Pl.','Palo Alto') INSERT INTO CUSTOMER VALUES(7,'James','Peterson','231 Upland Pl.','San Francisco') INSERT INTO CUSTOMER VALUES(8,'Andrew','Miller','288 - 20th Ave.','Seattle') INSERT INTO CUSTOMER VALUES(9,'James','Schneider','277 Seventh Av.','Berne') INSERT INTO CUSTOMER VALUES(10,'Anne','Fuller','135 Upland Pl.','Dallas') INSERT INTO CUSTOMER VALUES(11,'Julia','White','412 Upland Pl.','Chicago') INSERT INTO CUSTOMER VALUES(12,'George','Ott','381 Upland Pl.','Palo Alto') INSERT INTO CUSTOMER VALUES(13,'Laura','Ringer','38 College Av.','New York') INSERT INTO CUSTOMER VALUES(14,'Bill','Karsen','53 College Av.','Oslo') INSERT INTO CUSTOMER VALUES(15,'Bill','Clancy','319 Upland Pl.','Seattle') INSERT INTO CUSTOMER VALUES(16,'John','Fuller','195 Seventh Av.','New York') INSERT INTO CUSTOMER VALUES(17,'Laura','Ott','443 Seventh Av.','Lyon') INSERT INTO CUSTOMER VALUES(18,'Sylvia','Fuller','158 - 20th Ave.','Paris') INSERT INTO CUSTOMER VALUES(19,'Susanne','Heiniger','86 - 20th Ave.','Dallas') INSERT INTO CUSTOMER VALUES(20,'Janet','Schneider','309 - 20th Ave.','Oslo') INSERT INTO CUSTOMER VALUES(21,'Julia','Clancy','18 Seventh Av.','Seattle') INSERT INTO CUSTOMER VALUES(22,'Bill','Ott','250 - 20th Ave.','Berne') INSERT INTO CUSTOMER VALUES(23,'Julia','Heiniger','358 College Av.','Boston') INSERT INTO CUSTOMER VALUES(24,'James','Sommer','333 Upland Pl.','Olten') INSERT INTO CUSTOMER VALUES(25,'Sylvia','Steel','269 College Av.','Paris') INSERT INTO CUSTOMER VALUES(26,'James','Clancy','195 Upland Pl.','Oslo') INSERT INTO CUSTOMER VALUES(27,'Bob','Sommer','509 College Av.','Seattle') INSERT INTO CUSTOMER VALUES(28,'Susanne','White','74 - 20th Ave.','Lyon') INSERT INTO CUSTOMER VALUES(29,'Andrew','Smith','254 College Av.','New York') INSERT INTO CUSTOMER VALUES(30,'Bill','Sommer','362 - 20th Ave.','Olten') INSERT INTO CUSTOMER VALUES(31,'Bob','Ringer','371 College Av.','Olten') INSERT INTO CUSTOMER VALUES(32,'Michael','Ott','339 College Av.','Boston') INSERT INTO CUSTOMER VALUES(33,'Mary','King','491 College Av.','Oslo') INSERT INTO CUSTOMER VALUES(34,'Julia','May','33 Upland Pl.','Seattle') INSERT INTO CUSTOMER VALUES(35,'George','Karsen','412 College Av.','Chicago') INSERT INTO CUSTOMER VALUES(36,'John','Steel','276 Upland Pl.','Dallas') INSERT INTO CUSTOMER VALUES(37,'Michael','Clancy','19 Seventh Av.','Dallas') INSERT INTO CUSTOMER VALUES(38,'Andrew','Heiniger','347 College Av.','Lyon') INSERT INTO CUSTOMER VALUES(39,'Mary','Karsen','202 College Av.','Chicago') INSERT INTO CUSTOMER VALUES(40,'Susanne','Miller','440 - 20th Ave.','Dallas') INSERT INTO CUSTOMER VALUES(41,'Bill','King','546 College Av.','New York') INSERT INTO CUSTOMER VALUES(42,'Robert','Ott','503 Seventh Av.','Oslo') INSERT INTO CUSTOMER VALUES(43,'Susanne','Smith','2 Upland Pl.','Dallas') INSERT INTO CUSTOMER VALUES(44,'Sylvia','Ott','361 College Av.','New York') INSERT INTO CUSTOMER VALUES(45,'Janet','May','396 Seventh Av.','Oslo') INSERT INTO CUSTOMER VALUES(46,'Andrew','May','172 Seventh Av.','New York') INSERT INTO CUSTOMER VALUES(47,'Janet','Fuller','445 Upland Pl.','Dallas') INSERT INTO CUSTOMER VALUES(48,'Robert','White','549 Seventh Av.','San Francisco') INSERT INTO CUSTOMER VALUES(49,'George','Fuller','534 - 20th Ave.','Olten') INSERT INTO PRODUCT VALUES(0,'Iron Iron',5.4) INSERT INTO PRODUCT VALUES(1,'Chair Shoe',24.8) INSERT INTO PRODUCT VALUES(2,'Telephone Clock',24.8) INSERT INTO PRODUCT VALUES(3,'Chair Chair',25.4) INSERT INTO PRODUCT VALUES(4,'Ice Tea Shoe',12.8) INSERT INTO PRODUCT VALUES(5,'Clock Clock',23.6) INSERT INTO PRODUCT VALUES(6,'Ice Tea Chair',9.8) INSERT INTO PRODUCT VALUES(7,'Telephone Shoe',8.4) INSERT INTO PRODUCT VALUES(8,'Ice Tea Clock',22.6) INSERT INTO PRODUCT VALUES(9,'Clock Telephone',17.2) INSERT INTO PRODUCT VALUES(10,'Telephone Ice Tea',20.4) INSERT INTO PRODUCT VALUES(11,'Telephone Iron',8.8) INSERT INTO PRODUCT VALUES(12,'Clock Ice Tea',16.8) INSERT INTO PRODUCT VALUES(13,'Telephone Clock',18.0) INSERT INTO PRODUCT VALUES(14,'Telephone Iron',12.4) INSERT INTO PRODUCT VALUES(15,'Ice Tea Chair',9.4) INSERT INTO PRODUCT VALUES(16,'Ice Tea Shoe',19.4) INSERT INTO PRODUCT VALUES(17,'Clock Ice Tea',22.0) INSERT INTO PRODUCT VALUES(18,'Chair Clock',17.2) INSERT INTO PRODUCT VALUES(19,'Ice Tea Ice Tea',11.0) INSERT INTO PRODUCT VALUES(20,'Ice Tea Telephone',20.0) INSERT INTO PRODUCT VALUES(21,'Chair Chair',11.4) INSERT INTO PRODUCT VALUES(22,'Iron Iron',6.6) INSERT INTO PRODUCT VALUES(23,'Shoe Chair',7.6) INSERT INTO PRODUCT VALUES(24,'Chair Shoe',7.2) INSERT INTO PRODUCT VALUES(25,'Shoe Shoe',16.2) INSERT INTO PRODUCT VALUES(26,'Shoe Shoe',25.2) INSERT INTO PRODUCT VALUES(27,'Telephone Iron',23.0) INSERT INTO PRODUCT VALUES(28,'Clock Iron',3.0) INSERT INTO PRODUCT VALUES(29,'Chair Telephone',11.2) INSERT INTO PRODUCT VALUES(30,'Shoe Iron',23.2) INSERT INTO PRODUCT VALUES(31,'Ice Tea Telephone',4.8) INSERT INTO PRODUCT VALUES(32,'Clock Iron',19.0) INSERT INTO PRODUCT VALUES(33,'Iron Chair',18.2) INSERT INTO PRODUCT VALUES(34,'Chair Iron',25.6) INSERT INTO PRODUCT VALUES(35,'Telephone Shoe',7.6) INSERT INTO PRODUCT VALUES(36,'Ice Tea Iron',3.2) INSERT INTO PRODUCT VALUES(37,'Clock Shoe',9.4) INSERT INTO PRODUCT VALUES(38,'Clock Ice Tea',21.6) INSERT INTO PRODUCT VALUES(39,'Ice Tea Shoe',15.4) INSERT INTO PRODUCT VALUES(40,'Shoe Clock',2.8) INSERT INTO PRODUCT VALUES(41,'Clock Ice Tea',20.6) INSERT INTO PRODUCT VALUES(42,'Iron Chair',19.8) INSERT INTO PRODUCT VALUES(43,'Telephone Clock',9.4) INSERT INTO PRODUCT VALUES(44,'Ice Tea Ice Tea',9.6) INSERT INTO PRODUCT VALUES(45,'Iron Ice Tea',18.0) INSERT INTO PRODUCT VALUES(46,'Ice Tea Clock',6.2) INSERT INTO PRODUCT VALUES(47,'Ice Tea Iron',17.8) INSERT INTO PRODUCT VALUES(48,'Clock Clock',21.0) INSERT INTO PRODUCT VALUES(49,'Iron Iron',2.2) INSERT INTO INVOICE VALUES(0,0,2607.60) INSERT INTO INVOICE VALUES(1,33,1610.70) INSERT INTO INVOICE VALUES(2,23,3789.00) INSERT INTO INVOICE VALUES(3,21,5974.50) INSERT INTO INVOICE VALUES(4,30,1953.00) INSERT INTO INVOICE VALUES(5,34,4182.90) INSERT INTO INVOICE VALUES(6,19,3340.20) INSERT INTO INVOICE VALUES(7,26,5328.60) INSERT INTO INVOICE VALUES(8,29,2675.10) INSERT INTO INVOICE VALUES(9,38,6982.20) INSERT INTO INVOICE VALUES(10,24,3274.50) INSERT INTO INVOICE VALUES(11,24,2532.30) INSERT INTO INVOICE VALUES(12,23,4578.30) INSERT INTO INVOICE VALUES(13,39,7001.70) INSERT INTO INVOICE VALUES(14,35,4940.40) INSERT INTO INVOICE VALUES(15,39,1027.80) INSERT INTO INVOICE VALUES(16,45,3657.30) INSERT INTO INVOICE VALUES(17,46,3776.40) INSERT INTO INVOICE VALUES(18,4,3772.80) INSERT INTO INVOICE VALUES(19,9,804.30) INSERT INTO INVOICE VALUES(20,19,3139.20) INSERT INTO INVOICE VALUES(21,8,3740.10) INSERT INTO INVOICE VALUES(22,40,2289.90) INSERT INTO INVOICE VALUES(23,36,5166.60) INSERT INTO INVOICE VALUES(24,15,4344.30) INSERT INTO INVOICE VALUES(25,31,2054.10) INSERT INTO INVOICE VALUES(26,27,4972.80) INSERT INTO INVOICE VALUES(27,24,583.50) INSERT INTO INVOICE VALUES(28,35,1664.40) INSERT INTO INVOICE VALUES(29,46,2515.50) INSERT INTO INVOICE VALUES(30,13,2117.40) INSERT INTO INVOICE VALUES(31,22,2715.90) INSERT INTO INVOICE VALUES(32,20,1098.60) INSERT INTO INVOICE VALUES(33,40,4300.20) INSERT INTO INVOICE VALUES(34,33,4290.60) INSERT INTO INVOICE VALUES(35,4,3102.60) INSERT INTO INVOICE VALUES(36,42,3200.10) INSERT INTO INVOICE VALUES(37,39,7331.10) INSERT INTO INVOICE VALUES(38,46,6373.80) INSERT INTO INVOICE VALUES(39,5,1311.60) INSERT INTO INVOICE VALUES(40,4,5288.40) INSERT INTO INVOICE VALUES(41,19,5475.60) INSERT INTO INVOICE VALUES(42,38,1436.40) INSERT INTO INVOICE VALUES(43,13,4827.60) INSERT INTO INVOICE VALUES(44,32,3388.20) INSERT INTO INVOICE VALUES(45,42,4731.00) INSERT INTO INVOICE VALUES(46,24,5827.20) INSERT INTO INVOICE VALUES(47,45,2320.80) INSERT INTO INVOICE VALUES(48,22,3494.70) INSERT INTO INVOICE VALUES(49,32,4944.30) INSERT INTO ITEM VALUES(0,0,7,12,12.60) INSERT INTO ITEM VALUES(0,1,14,19,18.60) INSERT INTO ITEM VALUES(0,2,47,3,26.70) INSERT INTO ITEM VALUES(0,3,1,9,37.20) INSERT INTO ITEM VALUES(0,4,47,1,26.70) INSERT INTO ITEM VALUES(0,5,12,15,25.20) INSERT INTO ITEM VALUES(0,6,16,9,29.10) INSERT INTO ITEM VALUES(0,7,7,10,12.60) INSERT INTO ITEM VALUES(0,8,0,23,8.10) INSERT INTO ITEM VALUES(0,9,35,4,11.40) INSERT INTO ITEM VALUES(0,10,4,8,19.20) INSERT INTO ITEM VALUES(0,11,12,4,25.20) INSERT INTO ITEM VALUES(0,12,1,11,37.20) INSERT INTO ITEM VALUES(1,0,40,8,4.20) INSERT INTO ITEM VALUES(1,1,0,9,8.10) INSERT INTO ITEM VALUES(1,2,19,6,16.50) INSERT INTO ITEM VALUES(1,3,38,8,32.40) INSERT INTO ITEM VALUES(1,4,16,16,29.10) INSERT INTO ITEM VALUES(1,5,25,9,24.30) INSERT INTO ITEM VALUES(1,6,25,19,24.30) INSERT INTO ITEM VALUES(2,0,4,18,19.20) INSERT INTO ITEM VALUES(2,1,25,3,24.30) INSERT INTO ITEM VALUES(2,2,11,9,13.20) INSERT INTO ITEM VALUES(2,3,19,13,16.50) INSERT INTO ITEM VALUES(2,4,38,18,32.40) INSERT INTO ITEM VALUES(2,5,30,4,34.80) INSERT INTO ITEM VALUES(2,6,43,8,14.10) INSERT INTO ITEM VALUES(2,7,30,5,34.80) INSERT INTO ITEM VALUES(2,8,39,2,23.10) INSERT INTO ITEM VALUES(2,9,18,7,25.80) INSERT INTO ITEM VALUES(2,10,49,11,3.30) INSERT INTO ITEM VALUES(2,11,42,21,29.70) INSERT INTO ITEM VALUES(2,12,21,15,17.10) INSERT INTO ITEM VALUES(2,13,12,1,25.20) INSERT INTO ITEM VALUES(2,14,48,19,31.50) INSERT INTO ITEM VALUES(2,15,0,18,8.10) INSERT INTO ITEM VALUES(2,16,36,24,4.80) INSERT INTO ITEM VALUES(3,0,11,21,13.20) INSERT INTO ITEM VALUES(3,1,1,20,37.20) INSERT INTO ITEM VALUES(3,2,49,3,3.30) INSERT INTO ITEM VALUES(3,3,0,22,8.10) INSERT INTO ITEM VALUES(3,4,20,12,30.00) INSERT INTO ITEM VALUES(3,5,30,10,34.80) INSERT INTO ITEM VALUES(3,6,13,18,27.00) INSERT INTO ITEM VALUES(3,7,26,4,37.80) INSERT INTO ITEM VALUES(3,8,49,9,3.30) INSERT INTO ITEM VALUES(3,9,29,17,16.80) INSERT INTO ITEM VALUES(3,10,10,17,30.60) INSERT INTO ITEM VALUES(3,11,7,11,12.60) INSERT INTO ITEM VALUES(3,12,41,22,30.90) INSERT INTO ITEM VALUES(3,13,41,2,30.90) INSERT INTO ITEM VALUES(3,14,17,22,33.00) INSERT INTO ITEM VALUES(3,15,23,18,11.40) INSERT INTO ITEM VALUES(3,16,19,11,16.50) INSERT INTO ITEM VALUES(3,17,30,17,34.80) INSERT INTO ITEM VALUES(4,0,28,9,4.50) INSERT INTO ITEM VALUES(4,1,35,15,11.40) INSERT INTO ITEM VALUES(4,2,41,23,30.90) INSERT INTO ITEM VALUES(4,3,23,20,11.40) INSERT INTO ITEM VALUES(4,4,9,18,25.80) INSERT INTO ITEM VALUES(4,5,37,24,14.10) INSERT INTO ITEM VALUES(5,0,9,5,25.80) INSERT INTO ITEM VALUES(5,1,9,23,25.80) INSERT INTO ITEM VALUES(5,2,20,18,30.00) INSERT INTO ITEM VALUES(5,3,24,12,10.80) INSERT INTO ITEM VALUES(5,4,32,14,28.50) INSERT INTO ITEM VALUES(5,5,46,15,9.30) INSERT INTO ITEM VALUES(5,6,7,9,12.60) INSERT INTO ITEM VALUES(5,7,2,4,37.20) INSERT INTO ITEM VALUES(5,8,20,3,30.00) INSERT INTO ITEM VALUES(5,9,37,9,14.10) INSERT INTO ITEM VALUES(5,10,28,18,4.50) INSERT INTO ITEM VALUES(5,11,38,23,32.40) INSERT INTO ITEM VALUES(5,12,8,15,33.90) INSERT INTO ITEM VALUES(5,13,18,17,25.80) INSERT INTO ITEM VALUES(6,0,15,20,14.10) INSERT INTO ITEM VALUES(6,1,38,21,32.40) INSERT INTO ITEM VALUES(6,2,23,8,11.40) INSERT INTO ITEM VALUES(6,3,30,2,34.80) INSERT INTO ITEM VALUES(6,4,31,20,7.20) INSERT INTO ITEM VALUES(6,5,14,20,18.60) INSERT INTO ITEM VALUES(6,6,37,22,14.10) INSERT INTO ITEM VALUES(6,7,26,10,37.80) INSERT INTO ITEM VALUES(6,8,41,19,30.90) INSERT INTO ITEM VALUES(6,9,19,2,16.50) INSERT INTO ITEM VALUES(6,10,16,13,29.10) INSERT INTO ITEM VALUES(6,11,44,1,14.40) INSERT INTO ITEM VALUES(7,0,43,16,14.10) INSERT INTO ITEM VALUES(7,1,23,12,11.40) INSERT INTO ITEM VALUES(7,2,27,17,34.50) INSERT INTO ITEM VALUES(7,3,30,2,34.80) INSERT INTO ITEM VALUES(7,4,2,13,37.20) INSERT INTO ITEM VALUES(7,5,24,10,10.80) INSERT INTO ITEM VALUES(7,6,14,4,18.60) INSERT INTO ITEM VALUES(7,7,2,22,37.20) INSERT INTO ITEM VALUES(7,8,42,19,29.70) INSERT INTO ITEM VALUES(7,9,9,21,25.80) INSERT INTO ITEM VALUES(7,10,7,1,12.60) INSERT INTO ITEM VALUES(7,11,19,13,16.50) INSERT INTO ITEM VALUES(7,12,40,16,4.20) INSERT INTO ITEM VALUES(7,13,32,23,28.50) INSERT INTO ITEM VALUES(7,14,47,14,26.70) INSERT INTO ITEM VALUES(7,15,24,17,10.80) INSERT INTO ITEM VALUES(7,16,7,12,12.60) INSERT INTO ITEM VALUES(7,17,40,1,4.20) INSERT INTO ITEM VALUES(7,18,23,5,11.40) INSERT INTO ITEM VALUES(8,0,34,15,38.40) INSERT INTO ITEM VALUES(8,1,44,16,14.40) INSERT INTO ITEM VALUES(8,2,11,8,13.20) INSERT INTO ITEM VALUES(8,3,41,16,30.90) INSERT INTO ITEM VALUES(8,4,15,8,14.10) INSERT INTO ITEM VALUES(8,5,24,18,10.80) INSERT INTO ITEM VALUES(8,6,15,19,14.10) INSERT INTO ITEM VALUES(8,7,6,5,14.70) INSERT INTO ITEM VALUES(8,8,38,7,32.40) INSERT INTO ITEM VALUES(8,9,21,23,17.10) INSERT INTO ITEM VALUES(9,0,45,8,27.00) INSERT INTO ITEM VALUES(9,1,18,21,25.80) INSERT INTO ITEM VALUES(9,2,29,12,16.80) INSERT INTO ITEM VALUES(9,3,4,14,19.20) INSERT INTO ITEM VALUES(9,4,36,16,4.80) INSERT INTO ITEM VALUES(9,5,6,2,14.70) INSERT INTO ITEM VALUES(9,6,18,10,25.80) INSERT INTO ITEM VALUES(9,7,2,22,37.20) INSERT INTO ITEM VALUES(9,8,24,11,10.80) INSERT INTO ITEM VALUES(9,9,13,6,27.00) INSERT INTO ITEM VALUES(9,10,38,11,32.40) INSERT INTO ITEM VALUES(9,11,12,16,25.20) INSERT INTO ITEM VALUES(9,12,25,23,24.30) INSERT INTO ITEM VALUES(9,13,42,13,29.70) INSERT INTO ITEM VALUES(9,14,15,8,14.10) INSERT INTO ITEM VALUES(9,15,48,23,31.50) INSERT INTO ITEM VALUES(9,16,24,10,10.80) INSERT INTO ITEM VALUES(9,17,13,17,27.00) INSERT INTO ITEM VALUES(9,18,3,12,38.10) INSERT INTO ITEM VALUES(9,19,48,23,31.50) INSERT INTO ITEM VALUES(10,0,20,1,30.00) INSERT INTO ITEM VALUES(10,1,33,17,27.30) INSERT INTO ITEM VALUES(10,2,7,9,12.60) INSERT INTO ITEM VALUES(10,3,46,1,9.30) INSERT INTO ITEM VALUES(10,4,10,24,30.60) INSERT INTO ITEM VALUES(10,5,5,24,35.40) INSERT INTO ITEM VALUES(10,6,18,14,25.80) INSERT INTO ITEM VALUES(10,7,4,13,19.20) INSERT INTO ITEM VALUES(10,8,22,11,9.90) INSERT INTO ITEM VALUES(10,9,5,10,35.40) INSERT INTO ITEM VALUES(11,0,45,10,27.00) INSERT INTO ITEM VALUES(11,1,21,21,17.10) INSERT INTO ITEM VALUES(11,2,0,3,8.10) INSERT INTO ITEM VALUES(11,3,32,21,28.50) INSERT INTO ITEM VALUES(11,4,47,16,26.70) INSERT INTO ITEM VALUES(11,5,19,2,16.50) INSERT INTO ITEM VALUES(11,6,0,12,8.10) INSERT INTO ITEM VALUES(11,7,48,22,31.50) INSERT INTO ITEM VALUES(11,8,20,1,30.00) INSERT INTO ITEM VALUES(12,0,1,24,37.20) INSERT INTO ITEM VALUES(12,1,41,19,30.90) INSERT INTO ITEM VALUES(12,2,6,5,14.70) INSERT INTO ITEM VALUES(12,3,0,18,8.10) INSERT INTO ITEM VALUES(12,4,20,11,30.00) INSERT INTO ITEM VALUES(12,5,37,17,14.10) INSERT INTO ITEM VALUES(12,6,31,15,7.20) INSERT INTO ITEM VALUES(12,7,48,7,31.50) INSERT INTO ITEM VALUES(12,8,48,2,31.50) INSERT INTO ITEM VALUES(12,9,25,22,24.30) INSERT INTO ITEM VALUES(12,10,46,19,9.30) INSERT INTO ITEM VALUES(12,11,28,16,4.50) INSERT INTO ITEM VALUES(12,12,13,12,27.00) INSERT INTO ITEM VALUES(12,13,36,21,4.80) INSERT INTO ITEM VALUES(12,14,25,11,24.30) INSERT INTO ITEM VALUES(12,15,22,16,9.90) INSERT INTO ITEM VALUES(12,16,0,9,8.10) INSERT INTO ITEM VALUES(12,17,31,15,7.20) INSERT INTO ITEM VALUES(12,18,9,4,25.80) INSERT INTO ITEM VALUES(13,0,16,10,29.10) INSERT INTO ITEM VALUES(13,1,1,1,37.20) INSERT INTO ITEM VALUES(13,2,13,20,27.00) INSERT INTO ITEM VALUES(13,3,32,2,28.50) INSERT INTO ITEM VALUES(13,4,26,21,37.80) INSERT INTO ITEM VALUES(13,5,22,19,9.90) INSERT INTO ITEM VALUES(13,6,19,8,16.50) INSERT INTO ITEM VALUES(13,7,29,24,16.80) INSERT INTO ITEM VALUES(13,8,48,11,31.50) INSERT INTO ITEM VALUES(13,9,24,10,10.80) INSERT INTO ITEM VALUES(13,10,45,24,27.00) INSERT INTO ITEM VALUES(13,11,14,3,18.60) INSERT INTO ITEM VALUES(13,12,17,3,33.00) INSERT INTO ITEM VALUES(13,13,10,20,30.60) INSERT INTO ITEM VALUES(13,14,1,12,37.20) INSERT INTO ITEM VALUES(13,15,0,20,8.10) INSERT INTO ITEM VALUES(13,16,22,23,9.90) INSERT INTO ITEM VALUES(13,17,32,18,28.50) INSERT INTO ITEM VALUES(13,18,0,16,8.10) INSERT INTO ITEM VALUES(13,19,42,18,29.70) INSERT INTO ITEM VALUES(13,20,5,19,35.40) INSERT INTO ITEM VALUES(13,21,40,1,4.20) INSERT INTO ITEM VALUES(14,0,42,18,29.70) INSERT INTO ITEM VALUES(14,1,9,22,25.80) INSERT INTO ITEM VALUES(14,2,15,18,14.10) INSERT INTO ITEM VALUES(14,3,34,11,38.40) INSERT INTO ITEM VALUES(14,4,41,17,30.90) INSERT INTO ITEM VALUES(14,5,11,8,13.20) INSERT INTO ITEM VALUES(14,6,26,18,37.80) INSERT INTO ITEM VALUES(14,7,43,4,14.10) INSERT INTO ITEM VALUES(14,8,23,7,11.40) INSERT INTO ITEM VALUES(14,9,13,16,27.00) INSERT INTO ITEM VALUES(14,10,44,16,14.40) INSERT INTO ITEM VALUES(14,11,25,15,24.30) INSERT INTO ITEM VALUES(14,12,4,20,19.20) INSERT INTO ITEM VALUES(14,13,11,23,13.20) INSERT INTO ITEM VALUES(15,0,17,12,33.00) INSERT INTO ITEM VALUES(15,1,13,21,27.00) INSERT INTO ITEM VALUES(15,2,24,6,10.80) INSERT INTO ITEM VALUES(16,0,18,15,25.80) INSERT INTO ITEM VALUES(16,1,36,20,4.80) INSERT INTO ITEM VALUES(16,2,20,15,30.00) INSERT INTO ITEM VALUES(16,3,0,3,8.10) INSERT INTO ITEM VALUES(16,4,10,24,30.60) INSERT INTO ITEM VALUES(16,5,11,15,13.20) INSERT INTO ITEM VALUES(16,6,44,7,14.40) INSERT INTO ITEM VALUES(16,7,8,17,33.90) INSERT INTO ITEM VALUES(16,8,13,17,27.00) INSERT INTO ITEM VALUES(16,9,11,10,13.20) INSERT INTO ITEM VALUES(16,10,43,8,14.10) INSERT INTO ITEM VALUES(16,11,24,7,10.80) INSERT INTO ITEM VALUES(16,12,18,2,25.80) INSERT INTO ITEM VALUES(16,13,20,1,30.00) INSERT INTO ITEM VALUES(16,14,0,19,8.10) INSERT INTO ITEM VALUES(16,15,12,3,25.20) INSERT INTO ITEM VALUES(17,0,16,8,29.10) INSERT INTO ITEM VALUES(17,1,19,19,16.50) INSERT INTO ITEM VALUES(17,2,44,11,14.40) INSERT INTO ITEM VALUES(17,3,24,4,10.80) INSERT INTO ITEM VALUES(17,4,23,2,11.40) INSERT INTO ITEM VALUES(17,5,44,1,14.40) INSERT INTO ITEM VALUES(17,6,43,6,14.10) INSERT INTO ITEM VALUES(17,7,6,15,14.70) INSERT INTO ITEM VALUES(17,8,49,8,3.30) INSERT INTO ITEM VALUES(17,9,8,15,33.90) INSERT INTO ITEM VALUES(17,10,10,12,30.60) INSERT INTO ITEM VALUES(17,11,45,10,27.00) INSERT INTO ITEM VALUES(17,12,22,16,9.90) INSERT INTO ITEM VALUES(17,13,41,5,30.90) INSERT INTO ITEM VALUES(17,14,18,2,25.80) INSERT INTO ITEM VALUES(17,15,35,10,11.40) INSERT INTO ITEM VALUES(17,16,8,16,33.90) INSERT INTO ITEM VALUES(17,17,7,5,12.60) INSERT INTO ITEM VALUES(17,18,5,9,35.40) INSERT INTO ITEM VALUES(17,19,46,12,9.30) INSERT INTO ITEM VALUES(18,0,32,1,28.50) INSERT INTO ITEM VALUES(18,1,33,12,27.30) INSERT INTO ITEM VALUES(18,2,40,12,4.20) INSERT INTO ITEM VALUES(18,3,19,8,16.50) INSERT INTO ITEM VALUES(18,4,28,6,4.50) INSERT INTO ITEM VALUES(18,5,15,6,14.10) INSERT INTO ITEM VALUES(18,6,29,4,16.80) INSERT INTO ITEM VALUES(18,7,15,14,14.10) INSERT INTO ITEM VALUES(18,8,1,24,37.20) INSERT INTO ITEM VALUES(18,9,2,2,37.20) INSERT INTO ITEM VALUES(18,10,34,18,38.40) INSERT INTO ITEM VALUES(18,11,30,8,34.80) INSERT INTO ITEM VALUES(18,12,37,12,14.10) INSERT INTO ITEM VALUES(18,13,14,12,18.60) INSERT INTO ITEM VALUES(18,14,28,20,4.50) INSERT INTO ITEM VALUES(18,15,44,20,14.40) INSERT INTO ITEM VALUES(18,16,31,12,7.20) INSERT INTO ITEM VALUES(18,17,8,1,33.90) INSERT INTO ITEM VALUES(18,18,10,1,30.60) INSERT INTO ITEM VALUES(19,0,12,7,25.20) INSERT INTO ITEM VALUES(19,1,31,2,7.20) INSERT INTO ITEM VALUES(19,2,4,22,19.20) INSERT INTO ITEM VALUES(19,3,49,23,3.30) INSERT INTO ITEM VALUES(19,4,36,24,4.80) INSERT INTO ITEM VALUES(20,0,47,15,26.70) INSERT INTO ITEM VALUES(20,1,29,6,16.80) INSERT INTO ITEM VALUES(20,2,24,22,10.80) INSERT INTO ITEM VALUES(20,3,25,14,24.30) INSERT INTO ITEM VALUES(20,4,30,13,34.80) INSERT INTO ITEM VALUES(20,5,8,14,33.90) INSERT INTO ITEM VALUES(20,6,20,2,30.00) INSERT INTO ITEM VALUES(20,7,9,9,25.80) INSERT INTO ITEM VALUES(20,8,44,18,14.40) INSERT INTO ITEM VALUES(20,9,12,8,25.20) INSERT INTO ITEM VALUES(20,10,25,11,24.30) INSERT INTO ITEM VALUES(20,11,15,8,14.10) INSERT INTO ITEM VALUES(21,0,9,10,25.80) INSERT INTO ITEM VALUES(21,1,38,19,32.40) INSERT INTO ITEM VALUES(21,2,31,17,7.20) INSERT INTO ITEM VALUES(21,3,30,13,34.80) INSERT INTO ITEM VALUES(21,4,49,22,3.30) INSERT INTO ITEM VALUES(21,5,27,18,34.50) INSERT INTO ITEM VALUES(21,6,26,7,37.80) INSERT INTO ITEM VALUES(21,7,8,9,33.90) INSERT INTO ITEM VALUES(21,8,44,19,14.40) INSERT INTO ITEM VALUES(21,9,35,17,11.40) INSERT INTO ITEM VALUES(21,10,19,14,16.50) INSERT INTO ITEM VALUES(21,11,20,11,30.00) INSERT INTO ITEM VALUES(22,0,9,6,25.80) INSERT INTO ITEM VALUES(22,1,30,11,34.80) INSERT INTO ITEM VALUES(22,2,12,20,25.20) INSERT INTO ITEM VALUES(22,3,22,5,9.90) INSERT INTO ITEM VALUES(22,4,5,21,35.40) INSERT INTO ITEM VALUES(22,5,24,5,10.80) INSERT INTO ITEM VALUES(22,6,4,11,19.20) INSERT INTO ITEM VALUES(22,7,21,6,17.10) INSERT INTO ITEM VALUES(22,8,3,2,38.10) INSERT INTO ITEM VALUES(22,9,23,1,11.40) INSERT INTO ITEM VALUES(23,0,48,22,31.50) INSERT INTO ITEM VALUES(23,1,26,8,37.80) INSERT INTO ITEM VALUES(23,2,33,18,27.30) INSERT INTO ITEM VALUES(23,3,40,19,4.20) INSERT INTO ITEM VALUES(23,4,23,19,11.40) INSERT INTO ITEM VALUES(23,5,32,14,28.50) INSERT INTO ITEM VALUES(23,6,16,1,29.10) INSERT INTO ITEM VALUES(23,7,39,3,23.10) INSERT INTO ITEM VALUES(23,8,6,17,14.70) INSERT INTO ITEM VALUES(23,9,20,18,30.00) INSERT INTO ITEM VALUES(23,10,4,18,19.20) INSERT INTO ITEM VALUES(23,11,41,8,30.90) INSERT INTO ITEM VALUES(23,12,4,17,19.20) INSERT INTO ITEM VALUES(23,13,14,17,18.60) INSERT INTO ITEM VALUES(23,14,44,2,14.40) INSERT INTO ITEM VALUES(23,15,13,17,27.00) INSERT INTO ITEM VALUES(23,16,8,11,33.90) INSERT INTO ITEM VALUES(24,0,43,14,14.10) INSERT INTO ITEM VALUES(24,1,46,18,9.30) INSERT INTO ITEM VALUES(24,2,38,10,32.40) INSERT INTO ITEM VALUES(24,3,17,23,33.00) INSERT INTO ITEM VALUES(24,4,15,17,14.10) INSERT INTO ITEM VALUES(24,5,35,16,11.40) INSERT INTO ITEM VALUES(24,6,40,3,4.20) INSERT INTO ITEM VALUES(24,7,7,13,12.60) INSERT INTO ITEM VALUES(24,8,5,18,35.40) INSERT INTO ITEM VALUES(24,9,21,8,17.10) INSERT INTO ITEM VALUES(24,10,27,4,34.50) INSERT INTO ITEM VALUES(24,11,1,4,37.20) INSERT INTO ITEM VALUES(24,12,0,8,8.10) INSERT INTO ITEM VALUES(24,13,15,21,14.10) INSERT INTO ITEM VALUES(24,14,1,13,37.20) INSERT INTO ITEM VALUES(24,15,39,17,23.10) INSERT INTO ITEM VALUES(25,0,5,15,35.40) INSERT INTO ITEM VALUES(25,1,43,13,14.10) INSERT INTO ITEM VALUES(25,2,13,8,27.00) INSERT INTO ITEM VALUES(25,3,19,4,16.50) INSERT INTO ITEM VALUES(25,4,47,10,26.70) INSERT INTO ITEM VALUES(25,5,10,5,30.60) INSERT INTO ITEM VALUES(25,6,21,18,17.10) INSERT INTO ITEM VALUES(25,7,16,8,29.10) INSERT INTO ITEM VALUES(25,8,38,3,32.40) INSERT INTO ITEM VALUES(26,0,42,16,29.70) INSERT INTO ITEM VALUES(26,1,43,21,14.10) INSERT INTO ITEM VALUES(26,2,33,7,27.30) INSERT INTO ITEM VALUES(26,3,16,3,29.10) INSERT INTO ITEM VALUES(26,4,46,7,9.30) INSERT INTO ITEM VALUES(26,5,38,4,32.40) INSERT INTO ITEM VALUES(26,6,7,23,12.60) INSERT INTO ITEM VALUES(26,7,4,16,19.20) INSERT INTO ITEM VALUES(26,8,40,13,4.20) INSERT INTO ITEM VALUES(26,9,1,23,37.20) INSERT INTO ITEM VALUES(26,10,34,16,38.40) INSERT INTO ITEM VALUES(26,11,18,3,25.80) INSERT INTO ITEM VALUES(26,12,27,20,34.50) INSERT INTO ITEM VALUES(26,13,13,10,27.00) INSERT INTO ITEM VALUES(26,14,26,6,37.80) INSERT INTO ITEM VALUES(26,15,8,6,33.90) INSERT INTO ITEM VALUES(26,16,30,4,34.80) INSERT INTO ITEM VALUES(27,0,24,15,10.80) INSERT INTO ITEM VALUES(27,1,45,15,27.00) INSERT INTO ITEM VALUES(27,2,19,1,16.50) INSERT INTO ITEM VALUES(28,0,35,13,11.40) INSERT INTO ITEM VALUES(28,1,15,13,14.10) INSERT INTO ITEM VALUES(28,2,44,22,14.40) INSERT INTO ITEM VALUES(28,3,6,3,14.70) INSERT INTO ITEM VALUES(28,4,45,17,27.00) INSERT INTO ITEM VALUES(28,5,49,4,3.30) INSERT INTO ITEM VALUES(28,6,33,16,27.30) INSERT INTO ITEM VALUES(28,7,28,8,4.50) INSERT INTO ITEM VALUES(28,8,28,6,4.50) INSERT INTO ITEM VALUES(29,0,33,17,27.30) INSERT INTO ITEM VALUES(29,1,38,12,32.40) INSERT INTO ITEM VALUES(29,2,17,23,33.00) INSERT INTO ITEM VALUES(29,3,7,21,12.60) INSERT INTO ITEM VALUES(29,4,4,7,19.20) INSERT INTO ITEM VALUES(29,5,31,13,7.20) INSERT INTO ITEM VALUES(29,6,4,16,19.20) INSERT INTO ITEM VALUES(29,7,5,1,35.40) INSERT INTO ITEM VALUES(29,8,35,6,11.40) INSERT INTO ITEM VALUES(30,0,14,7,18.60) INSERT INTO ITEM VALUES(30,1,16,19,29.10) INSERT INTO ITEM VALUES(30,2,10,18,30.60) INSERT INTO ITEM VALUES(30,3,33,2,27.30) INSERT INTO ITEM VALUES(30,4,34,2,38.40) INSERT INTO ITEM VALUES(30,5,43,23,14.10) INSERT INTO ITEM VALUES(30,6,14,23,18.60) INSERT INTO ITEM VALUES(31,0,33,10,27.30) INSERT INTO ITEM VALUES(31,1,4,23,19.20) INSERT INTO ITEM VALUES(31,2,4,3,19.20) INSERT INTO ITEM VALUES(31,3,12,10,25.20) INSERT INTO ITEM VALUES(31,4,8,14,33.90) INSERT INTO ITEM VALUES(31,5,1,4,37.20) INSERT INTO ITEM VALUES(31,6,26,16,37.80) INSERT INTO ITEM VALUES(31,7,38,3,32.40) INSERT INTO ITEM VALUES(31,8,7,5,12.60) INSERT INTO ITEM VALUES(31,9,14,15,18.60) INSERT INTO ITEM VALUES(31,10,0,3,8.10) INSERT INTO ITEM VALUES(32,0,35,11,11.40) INSERT INTO ITEM VALUES(32,1,30,13,34.80) INSERT INTO ITEM VALUES(32,2,1,14,37.20) INSERT INTO ITEM VALUES(33,0,36,5,4.80) INSERT INTO ITEM VALUES(33,1,10,21,30.60) INSERT INTO ITEM VALUES(33,2,36,16,4.80) INSERT INTO ITEM VALUES(33,3,48,1,31.50) INSERT INTO ITEM VALUES(33,4,24,1,10.80) INSERT INTO ITEM VALUES(33,5,8,11,33.90) INSERT INTO ITEM VALUES(33,6,17,16,33.00) INSERT INTO ITEM VALUES(33,7,43,10,14.10) INSERT INTO ITEM VALUES(33,8,3,15,38.10) INSERT INTO ITEM VALUES(33,9,29,5,16.80) INSERT INTO ITEM VALUES(33,10,24,9,10.80) INSERT INTO ITEM VALUES(33,11,5,7,35.40) INSERT INTO ITEM VALUES(33,12,16,23,29.10) INSERT INTO ITEM VALUES(33,13,25,16,24.30) INSERT INTO ITEM VALUES(33,14,44,13,14.40) INSERT INTO ITEM VALUES(33,15,38,7,32.40) INSERT INTO ITEM VALUES(34,0,10,22,30.60) INSERT INTO ITEM VALUES(34,1,4,3,19.20) INSERT INTO ITEM VALUES(34,2,28,22,4.50) INSERT INTO ITEM VALUES(34,3,44,15,14.40) INSERT INTO ITEM VALUES(34,4,27,1,34.50) INSERT INTO ITEM VALUES(34,5,45,13,27.00) INSERT INTO ITEM VALUES(34,6,32,7,28.50) INSERT INTO ITEM VALUES(34,7,21,22,17.10) INSERT INTO ITEM VALUES(34,8,3,1,38.10) INSERT INTO ITEM VALUES(34,9,8,17,33.90) INSERT INTO ITEM VALUES(34,10,41,16,30.90) INSERT INTO ITEM VALUES(34,11,4,17,19.20) INSERT INTO ITEM VALUES(34,12,43,21,14.10) INSERT INTO ITEM VALUES(34,13,30,14,34.80) INSERT INTO ITEM VALUES(34,14,46,7,9.30) INSERT INTO ITEM VALUES(35,0,20,17,30.00) INSERT INTO ITEM VALUES(35,1,3,9,38.10) INSERT INTO ITEM VALUES(35,2,14,4,18.60) INSERT INTO ITEM VALUES(35,3,27,10,34.50) INSERT INTO ITEM VALUES(35,4,14,17,18.60) INSERT INTO ITEM VALUES(35,5,33,5,27.30) INSERT INTO ITEM VALUES(35,6,5,4,35.40) INSERT INTO ITEM VALUES(35,7,22,15,9.90) INSERT INTO ITEM VALUES(35,8,0,1,8.10) INSERT INTO ITEM VALUES(35,9,19,1,16.50) INSERT INTO ITEM VALUES(35,10,17,11,33.00) INSERT INTO ITEM VALUES(35,11,44,9,14.40) INSERT INTO ITEM VALUES(35,12,7,23,12.60) INSERT INTO ITEM VALUES(35,13,19,17,16.50) INSERT INTO ITEM VALUES(36,0,18,13,25.80) INSERT INTO ITEM VALUES(36,1,15,23,14.10) INSERT INTO ITEM VALUES(36,2,1,6,37.20) INSERT INTO ITEM VALUES(36,3,10,8,30.60) INSERT INTO ITEM VALUES(36,4,40,5,4.20) INSERT INTO ITEM VALUES(36,5,25,8,24.30) INSERT INTO ITEM VALUES(36,6,39,20,23.10) INSERT INTO ITEM VALUES(36,7,39,19,23.10) INSERT INTO ITEM VALUES(36,8,4,21,19.20) INSERT INTO ITEM VALUES(36,9,31,18,7.20) INSERT INTO ITEM VALUES(36,10,47,11,26.70) INSERT INTO ITEM VALUES(36,11,44,9,14.40) INSERT INTO ITEM VALUES(37,0,41,24,30.90) INSERT INTO ITEM VALUES(37,1,15,20,14.10) INSERT INTO ITEM VALUES(37,2,36,8,4.80) INSERT INTO ITEM VALUES(37,3,26,7,37.80) INSERT INTO ITEM VALUES(37,4,13,20,27.00) INSERT INTO ITEM VALUES(37,5,1,14,37.20) INSERT INTO ITEM VALUES(37,6,34,12,38.40) INSERT INTO ITEM VALUES(37,7,24,19,10.80) INSERT INTO ITEM VALUES(37,8,46,9,9.30) INSERT INTO ITEM VALUES(37,9,47,16,26.70) INSERT INTO ITEM VALUES(37,10,1,18,37.20) INSERT INTO ITEM VALUES(37,11,30,5,34.80) INSERT INTO ITEM VALUES(37,12,24,23,10.80) INSERT INTO ITEM VALUES(37,13,32,3,28.50) INSERT INTO ITEM VALUES(37,14,12,3,25.20) INSERT INTO ITEM VALUES(37,15,32,12,28.50) INSERT INTO ITEM VALUES(37,16,27,8,34.50) INSERT INTO ITEM VALUES(37,17,38,18,32.40) INSERT INTO ITEM VALUES(37,18,26,22,37.80) INSERT INTO ITEM VALUES(37,19,19,20,16.50) INSERT INTO ITEM VALUES(37,20,14,1,18.60) INSERT INTO ITEM VALUES(37,21,6,9,14.70) INSERT INTO ITEM VALUES(38,0,48,14,31.50) INSERT INTO ITEM VALUES(38,1,45,13,27.00) INSERT INTO ITEM VALUES(38,2,4,8,19.20) INSERT INTO ITEM VALUES(38,3,27,19,34.50) INSERT INTO ITEM VALUES(38,4,45,14,27.00) INSERT INTO ITEM VALUES(38,5,48,17,31.50) INSERT INTO ITEM VALUES(38,6,5,19,35.40) INSERT INTO ITEM VALUES(38,7,15,1,14.10) INSERT INTO ITEM VALUES(38,8,40,10,4.20) INSERT INTO ITEM VALUES(38,9,27,20,34.50) INSERT INTO ITEM VALUES(38,10,4,18,19.20) INSERT INTO ITEM VALUES(38,11,19,18,16.50) INSERT INTO ITEM VALUES(38,12,1,18,37.20) INSERT INTO ITEM VALUES(38,13,8,7,33.90) INSERT INTO ITEM VALUES(38,14,20,7,30.00) INSERT INTO ITEM VALUES(38,15,47,10,26.70) INSERT INTO ITEM VALUES(38,16,40,18,4.20) INSERT INTO ITEM VALUES(38,17,32,4,28.50) INSERT INTO ITEM VALUES(38,18,28,20,4.50) INSERT INTO ITEM VALUES(38,19,4,7,19.20) INSERT INTO ITEM VALUES(39,0,10,12,30.60) INSERT INTO ITEM VALUES(39,1,24,6,10.80) INSERT INTO ITEM VALUES(39,2,39,16,23.10) INSERT INTO ITEM VALUES(39,3,20,17,30.00) INSERT INTO ITEM VALUES(40,0,46,24,9.30) INSERT INTO ITEM VALUES(40,1,45,24,27.00) INSERT INTO ITEM VALUES(40,2,4,5,19.20) INSERT INTO ITEM VALUES(40,3,26,10,37.80) INSERT INTO ITEM VALUES(40,4,18,13,25.80) INSERT INTO ITEM VALUES(40,5,32,18,28.50) INSERT INTO ITEM VALUES(40,6,28,12,4.50) INSERT INTO ITEM VALUES(40,7,31,1,7.20) INSERT INTO ITEM VALUES(40,8,11,4,13.20) INSERT INTO ITEM VALUES(40,9,40,17,4.20) INSERT INTO ITEM VALUES(40,10,6,11,14.70) INSERT INTO ITEM VALUES(40,11,27,2,34.50) INSERT INTO ITEM VALUES(40,12,35,13,11.40) INSERT INTO ITEM VALUES(40,13,6,8,14.70) INSERT INTO ITEM VALUES(40,14,4,24,19.20) INSERT INTO ITEM VALUES(40,15,22,12,9.90) INSERT INTO ITEM VALUES(40,16,27,16,34.50) INSERT INTO ITEM VALUES(40,17,4,20,19.20) INSERT INTO ITEM VALUES(40,18,33,11,27.30) INSERT INTO ITEM VALUES(40,19,7,23,12.60) INSERT INTO ITEM VALUES(40,20,4,16,19.20) INSERT INTO ITEM VALUES(41,0,5,24,35.40) INSERT INTO ITEM VALUES(41,1,47,19,26.70) INSERT INTO ITEM VALUES(41,2,36,2,4.80) INSERT INTO ITEM VALUES(41,3,29,20,16.80) INSERT INTO ITEM VALUES(41,4,16,22,29.10) INSERT INTO ITEM VALUES(41,5,9,21,25.80) INSERT INTO ITEM VALUES(41,6,17,11,33.00) INSERT INTO ITEM VALUES(41,7,22,18,9.90) INSERT INTO ITEM VALUES(41,8,9,22,25.80) INSERT INTO ITEM VALUES(41,9,26,21,37.80) INSERT INTO ITEM VALUES(41,10,24,20,10.80) INSERT INTO ITEM VALUES(41,11,48,15,31.50) INSERT INTO ITEM VALUES(42,0,48,9,31.50) INSERT INTO ITEM VALUES(42,1,18,21,25.80) INSERT INTO ITEM VALUES(42,2,40,19,4.20) INSERT INTO ITEM VALUES(42,3,40,14,4.20) INSERT INTO ITEM VALUES(42,4,48,15,31.50) INSERT INTO ITEM VALUES(43,0,15,22,14.10) INSERT INTO ITEM VALUES(43,1,18,19,25.80) INSERT INTO ITEM VALUES(43,2,2,15,37.20) INSERT INTO ITEM VALUES(43,3,6,18,14.70) INSERT INTO ITEM VALUES(43,4,32,22,28.50) INSERT INTO ITEM VALUES(43,5,33,6,27.30) INSERT INTO ITEM VALUES(43,6,24,1,10.80) INSERT INTO ITEM VALUES(43,7,11,15,13.20) INSERT INTO ITEM VALUES(43,8,44,8,14.40) INSERT INTO ITEM VALUES(43,9,7,23,12.60) INSERT INTO ITEM VALUES(43,10,35,1,11.40) INSERT INTO ITEM VALUES(43,11,49,23,3.30) INSERT INTO ITEM VALUES(43,12,40,24,4.20) INSERT INTO ITEM VALUES(43,13,44,22,14.40) INSERT INTO ITEM VALUES(43,14,3,18,38.10) INSERT INTO ITEM VALUES(43,15,48,7,31.50) INSERT INTO ITEM VALUES(43,16,38,12,32.40) INSERT INTO ITEM VALUES(44,0,33,20,27.30) INSERT INTO ITEM VALUES(44,1,34,17,38.40) INSERT INTO ITEM VALUES(44,2,17,14,33.00) INSERT INTO ITEM VALUES(44,3,3,14,38.10) INSERT INTO ITEM VALUES(44,4,12,3,25.20) INSERT INTO ITEM VALUES(44,5,41,22,30.90) INSERT INTO ITEM VALUES(44,6,14,15,18.60) INSERT INTO ITEM VALUES(44,7,49,17,3.30) INSERT INTO ITEM VALUES(44,8,28,23,4.50) INSERT INTO ITEM VALUES(45,0,44,6,14.40) INSERT INTO ITEM VALUES(45,1,11,6,13.20) INSERT INTO ITEM VALUES(45,2,46,8,9.30) INSERT INTO ITEM VALUES(45,3,14,11,18.60) INSERT INTO ITEM VALUES(45,4,3,14,38.10) INSERT INTO ITEM VALUES(45,5,45,17,27.00) INSERT INTO ITEM VALUES(45,6,39,5,23.10) INSERT INTO ITEM VALUES(45,7,6,24,14.70) INSERT INTO ITEM VALUES(45,8,9,2,25.80) INSERT INTO ITEM VALUES(45,9,26,18,37.80) INSERT INTO ITEM VALUES(45,10,41,24,30.90) INSERT INTO ITEM VALUES(45,11,31,22,7.20) INSERT INTO ITEM VALUES(45,12,32,13,28.50) INSERT INTO ITEM VALUES(45,13,47,8,26.70) INSERT INTO ITEM VALUES(45,14,3,16,38.10) INSERT INTO ITEM VALUES(46,0,5,21,35.40) INSERT INTO ITEM VALUES(46,1,12,24,25.20) INSERT INTO ITEM VALUES(46,2,30,14,34.80) INSERT INTO ITEM VALUES(46,3,21,19,17.10) INSERT INTO ITEM VALUES(46,4,17,5,33.00) INSERT INTO ITEM VALUES(46,5,25,9,24.30) INSERT INTO ITEM VALUES(46,6,41,18,30.90) INSERT INTO ITEM VALUES(46,7,49,9,3.30) INSERT INTO ITEM VALUES(46,8,8,22,33.90) INSERT INTO ITEM VALUES(46,9,7,4,12.60) INSERT INTO ITEM VALUES(46,10,11,24,13.20) INSERT INTO ITEM VALUES(46,11,1,4,37.20) INSERT INTO ITEM VALUES(46,12,21,24,17.10) INSERT INTO ITEM VALUES(46,13,36,20,4.80) INSERT INTO ITEM VALUES(46,14,24,10,10.80) INSERT INTO ITEM VALUES(46,15,40,11,4.20) INSERT INTO ITEM VALUES(46,16,46,21,9.30) INSERT INTO ITEM VALUES(46,17,12,23,25.20) INSERT INTO ITEM VALUES(47,0,23,15,11.40) INSERT INTO ITEM VALUES(47,1,23,13,11.40) INSERT INTO ITEM VALUES(47,2,17,6,33.00) INSERT INTO ITEM VALUES(47,3,1,4,37.20) INSERT INTO ITEM VALUES(47,4,15,1,14.10) INSERT INTO ITEM VALUES(47,5,40,8,4.20) INSERT INTO ITEM VALUES(47,6,8,10,33.90) INSERT INTO ITEM VALUES(47,7,28,14,4.50) INSERT INTO ITEM VALUES(47,8,16,2,29.10) INSERT INTO ITEM VALUES(47,9,32,9,28.50) INSERT INTO ITEM VALUES(47,10,45,2,27.00) INSERT INTO ITEM VALUES(47,11,35,10,11.40) INSERT INTO ITEM VALUES(47,12,12,20,25.20) INSERT INTO ITEM VALUES(47,13,33,8,27.30) INSERT INTO ITEM VALUES(48,0,6,23,14.70) INSERT INTO ITEM VALUES(48,1,26,23,37.80) INSERT INTO ITEM VALUES(48,2,23,10,11.40) INSERT INTO ITEM VALUES(48,3,10,2,30.60) INSERT INTO ITEM VALUES(48,4,48,4,31.50) INSERT INTO ITEM VALUES(48,5,24,16,10.80) INSERT INTO ITEM VALUES(48,6,11,17,13.20) INSERT INTO ITEM VALUES(48,7,30,19,34.80) INSERT INTO ITEM VALUES(48,8,5,12,35.40) INSERT INTO ITEM VALUES(48,9,35,17,11.40) INSERT INTO ITEM VALUES(48,10,41,10,30.90) INSERT INTO ITEM VALUES(49,0,18,6,25.80) INSERT INTO ITEM VALUES(49,1,22,16,9.90) INSERT INTO ITEM VALUES(49,2,29,6,16.80) INSERT INTO ITEM VALUES(49,3,17,19,33.00) INSERT INTO ITEM VALUES(49,4,47,14,26.70) INSERT INTO ITEM VALUES(49,5,16,1,29.10) INSERT INTO ITEM VALUES(49,6,29,15,16.80) INSERT INTO ITEM VALUES(49,7,6,21,14.70) INSERT INTO ITEM VALUES(49,8,48,24,31.50) INSERT INTO ITEM VALUES(49,9,7,24,12.60) INSERT INTO ITEM VALUES(49,10,30,16,34.80) INSERT INTO ITEM VALUES(49,11,40,15,4.20) INSERT INTO ITEM VALUES(49,12,21,17,17.10) INSERT INTO ITEM VALUES(49,13,6,22,14.70) INSERT INTO ITEM VALUES(49,14,23,5,11.40) INSERT INTO ITEM VALUES(49,15,19,24,16.50) INSERT INTO ITEM VALUES(49,16,24,18,10.80) CREATE VIEW DOC_ADDR AS SELECT D.ID,D.TOTAL,A.CITY FROM INVOICE D, CUSTOMER A WHERE D.CUSTOMERID=A.ID AND A.ID < 10 /*c88*/SELECT * FROM DOC_ADDR D, ITEM P WHERE P.INVOICEID = D.ID -- correlated subquery together with group and aggregates SELECT max(city), count(firstname) , max(lastname), (SELECT count(*) from item where item.invoiceid = customer.id) FROM Customer join invoice on invoice.customerid = customer.id group by customer.id hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSeqRightsB.txt0000644000175000017500000000235312007547346023325 0ustar renerene-- $Id: TestSelfSeqRightsB.txt 610 2008-12-22 15:54:18Z unsaved $ -- Test .log persistence of Sequence rights CONNECT USER blaine PASSWORD "b"; -- Following is default, but just to eliminate any ambiguity... SET SCHEMA public; -- By virtue of PUBLIC grants /*c1*/SELECT * FROM pt; /*e*/SELECT i, next value for ps9 FROM pt; /*e*/SELECT i, next value for public.ps9 FROM public.pt; /*e*/SELECT i, next value for ps9 FROM public.pt; /*c1*/SELECT i, next value for ps1 FROM pt; SET SCHEMA bsch; /*c1*/SELECT i, next value for public.ps2 FROM public.pt; -- Don't own /*e*/GRANT ALL ON SEQUENCE public.ps2 TO PUBLIC; /*u0*/GRANT ALL ON SEQUENCE bsch.bs5 TO PUBLIC; -- By virtue of schema ownership /*c1*/SELECT i, next value for bs2 FROM bt; SET SCHEMA public; /*c1*/SELECT i, next value for bsch.bs1 FROM bsch.bt; -- Enough schema specification testing. Just use defauls Session schema for -- here on in /*c1*/SELECT i FROM pt; /*e*/SELECT i, next value for ps3 FROM pt; /*e*/SELECT i, next value for ps4 FROM pt; /*c1*/SELECT i, next value for ps5 FROM pt; /*c1*/SELECT i, next value for ps6 FROM pt; /*e*/SELECT i, next value for ps7 FROM pt; /*e*/SELECT i, next value for ps8 FROM pt; CONNECT USER sa PASSWORD ""; SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfViewGrants.txt0000644000175000017500000000350512007547346023403 0ustar renerene-- $Id: TestSelfViewGrants.txt 610 2008-12-22 15:54:18Z unsaved $ -- Tests viw grants -- These two users are for sanity tests /*u0*/CREATE USER privd PASSWORD "privd"; /*u0*/CREATE USER unprivd PASSWORD "unprivd"; /*u0*/CREATE USER u1 PASSWORD "u1"; /*u0*/GRANT CHANGE_AUTHORIZATION TO privd; /*u0*/GRANT CHANGE_AUTHORIZATION TO unprivd; /*u0*/GRANT CHANGE_AUTHORIZATION TO u1; -- rtable = restricted table /*u0*/CREATE TABLE rtable (c1 int, c2 int, c3 int); /*u1*/INSERT INTO rtable values (1, 2, 3); /*c1*/SELECT * from rtable; /*u0*/CREATE VIEW v as SELECT c1, c2 FROM rtable; /*c1*/SELECT * from v; /*u0*/GRANT ALL ON v TO privd; /*u0*/GRANT SELECT ON v TO privd; /*u0*/GRANT SELECT(c1) ON v TO u1; -- Test col-specific SELECTs /*u0*/CONNECT USER u1 PASSWORD "u1"; /*e*/SELECT c1 from rtable; /*e*/SELECT c2 from rtable; /*e*/SELECT c3 from rtable; /*e*/SELECT c2 from v; /*c1*/SELECT c1 from v; COMMIT; /*u0*/CONNECT USER privd PASSWORD "privd"; /*e*/SELECT c1 from rtable; /*e*/SELECT c2 from rtable; /*e*/SELECT c3 from rtable; -- The following tests that View grants supercede restrictions on underlying -- tables. (For grants on entire View, not View columns). /*c1*/SELECT c2 from v; /*c1*/SELECT c1 from v; COMMIT; /*u0*/CONNECT USER unprivd PASSWORD "unprivd"; /*e*/SELECT c1 from rtable; /*e*/SELECT c2 from rtable; /*e*/SELECT c3 from rtable; /*e*/SELECT c2 from v; /*e*/SELECT c1 from v; COMMIT; /*u0*/CONNECT USER SA PASSWORD ""; -- Exactly according to "SQL 1999" section 14.3.7: /*u0*/GRANT SELECT ON v TO PUBLIC; /*u0*/CONNECT USER unprivd PASSWORD "unprivd"; /*c1*/SELECT c2 from v; /*c1*/SELECT c1 from v; COMMIT; /*u0*/CONNECT USER SA PASSWORD ""; /*u0*/DROP USER u1; /*u0*/DROP USER privd; /*u0*/DROP USER unprivd; /*u0*/DROP VIEW v; /*u0*/DROP TABLE rtable; /*u0*/SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSchemaQuoting.txt0000644000175000017500000000246112007547346024061 0ustar renerene-- Tests quoted schema names /*u0*/SET SCHEMA information_schema; /*u0*/CREATE SCHEMA sChEmA1 authorization sa; /*c1*/select * from schemata where schema_owner = 'SA' AND schema_name = 'SCHEMA1'; /*u0*/CREATE SCHEMA dEfAuLt1 authorization sa; /*c1*/select * from schemata where schema_name = 'DEFAULT1'; /*u0*/SET INITIAL SCHEMA "DEFAULT1"; /*c1*/SELECT * FROM system_users WHERE user_name = 'SA' AND initial_schema = 'DEFAULT1'; /*u0*/SET INITIAL SCHEMA DEFAULT; /*c1*/SELECT * FROM system_users WHERE user_name = 'SA' AND initial_schema IS NULL; /*u0*/CREATE SCHEMA "mIxEdCaSe" AUTHORIZATION sa; /*c1*/select * from schemata where schema_name = 'mIxEdCaSe'; /*u0*/CREATE TABLE "mIxEdCaSe".t1(i int); /*e*/DROP TABLE mIxEdCaSe.t1; /*u0*/DROP TABLE "mIxEdCaSe".t1; /*e*/DROP SCHEMA mIxEdCaSe; /*u0*/DROP SCHEMA "mIxEdCaSe"; /*u0*/CREATE USER u1 PASSWORD "u1"; /*u0*/CREATE SCHEMA "oThErMiXeD" authorization u1; /*u0*/CREATE TABLE "oThErMiXeD".t2(i int); /*e*/DROP SCHEMA oThErMiXeD CASCADE; /*u0*/DROP SCHEMA "oThErMiXeD" CASCADE; /*s*/DROP USER u1 CASCADE; /*s*/DROP USER u1; /*s*/DROP SCHEMA schema1 CASCADE; /*U0*/ Workaround for bug where DDL will not Commit /*s*/CREATE TABLE bug_workaround (i int); /*s*/INSERT INTO bug_workaround VALUES(1); /*u0*/SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfCasewhen.txt0000644000175000017500000000744012007547346023051 0ustar renerene-- TESTS FOR CASE AND SIMILAR OPERATIONS -- drop table testcase if exists; create table testcase(id integer, data varchar(10), filler varchar(10)); insert into testcase values(100,'xxxx',null); insert into testcase values(200,'yyyy',null); insert into testcase values(300,null,null); /*c2*/select id from testcase where data is not null; /*r300*/select id from testcase where data is null; /*rNULLVALUE*/select ifnull(data,'NULLVALUE') from testcase where data is null; /*rNULLVALUE*/select case data when 'xxxx' then 'X' else 'NULLVALUE' end from testcase where data is null; SELECT CASE data WHEN 'xxxx' THEN 'X' ELSE (CASE data WHEN 'yyyy' THEN 'Y' ELSE (CASE data WHEN 'zzzz' THEN 'Z' ELSE 'NOTFOUND' END) END) END FROM testcase SELECT CASE data WHEN 'xxxx' THEN 'X' WHEN 'yyyy' THEN 'Y' WHEN 'zzzz' THEN 'Z' ELSE 'NOTFOUND' END FROM testcase; /*rALLNULL*/SELECT COALESCE (filler, data, 'ALLNULL') FROM testcase WHERE id = 300; /*r600.0E0*/select cast (sum(id) as double) from testcase; /*r600*/select coalesce(sum(id), 0) from testcase; /*r600*/select abs(coalesce(sum(id), 0)) from testcase; /*r1*/select case when 1 <0 then sum(10) else 1 end as label from testcase; /*r30*/select case when 1 < 0 then 1 else sum(10) end as label from testcase; drop table testcase2 if exists; create table testcase2(id integer, data varchar(10), filler varchar(10), datecol date); /*rNULL*/select cast (sum(id) as double) from testcase2; /*r0*/select coalesce(sum(id), 0) from testcase2; /*r0*/select abs(coalesce(sum(id), 0)) from testcase2; -- should result in DATE type /*r2005-10-25*/select coalesce(max(datecol), DATE'2005-10-25') from testcase2; -- error as date type is not comparable to character /*e*/select coalesce(max(datecol), '2005-10-25') from testcase2; drop table test if exists; create table test (sel int, name1 varchar(3), name2 varchar(3)); insert into test (sel, name1, name2) values (0, 'foo', 'bar') insert into test (sel, name1, name2) values (1, 'baz', 'foo') insert into test (sel, name1, name2) values (1, 'foo', 'qux') select coalesce(a.name1, a.name2) as name,count(a.sel) as counter from test a group by coalesce(a.name1, a.name2) select case when a.sel=1 then a.name2 else a.name1 end as name, count(a.name1) as counter from test a group by case when a.sel=1 then a.name2 else a.name1 end -- nested expressions create table single (c char(1)); insert into single values('X'); /*r1*/select case c when 'X' then 1 else 2 end from single; insert into single values(null); /*r X Y */select ifnull(c,'Y') from single /*r X Y */select coalesce(c,'Y') from single /*e*/select coalesce() from single /*e*/select coalesce(c) from single /*e*/select ifnull() from single /*e*/select ifnull(c) from single insert into single values('Y') insert into single values('Z') drop table single; create table single (c int); /*rAVG*/select case avg(c) when max(c) then 'MAX' when min(c) then 'MIN' else 'AVG' end from single; insert into single values(1); /*r1*/select case avg(c) when max(c) then max(c) when min(c) then min(c) else avg(c) end from single; insert into single values(2); insert into single values(3); /*r2*/select case avg(c) when max(c) then max(c) when min(c) then min(c) else avg(c) end from single; /*r 1 2 3 */select * from single order by 1 -- multi-element case when /*r one-or-two one-or-two three----- */select case c when in(0,1,2) then 'one-or-two' when in(0,3,30) then 'three-----' end from single order by 1 /*r NULL NULL :OK : */select ':' || case c when in(0,10,10) then 'WRONG' when in(0,3,34) then 'OK' end || ':' from single order by 1 CREATE TABLE BAB (SALES DOUBLE, COST DOUBLE); SELECT (SUM(BAB.SALES)-SUM(BAB.COST))/(CASE WHEN (ABS (SUM(BAB.SALES))) = 0 THEN NULL ELSE (ABS (SUM(BAB.SALES))) END) AS PROFITMARGIN FROM BAB hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSeqRightsC.txt0000644000175000017500000000270112007547346023323 0ustar renerene-- $Id: TestSelfSeqRightsC.txt 610 2008-12-22 15:54:18Z unsaved $ -- Test .script persistence of Sequence rights CONNECT USER blaine PASSWORD "b"; -- Following is default, but just to eliminate any ambiguity... SET SCHEMA public; -- By virtue of PUBLIC grants /*e*/SELECT i, next value for ps9 FROM pt; /*e*/SELECT i, next value for public.ps9 FROM public.pt; /*e*/SELECT i, next value for ps9 FROM public.pt; /*c1*/SELECT i, next value for ps1 FROM pt; SET SCHEMA bsch; /*c1*/SELECT i, next value for public.ps2 FROM public.pt; -- Don't own /*e*/GRANT ALL ON SEQUENCE public.ps2 TO PUBLIC; /*u0*/GRANT ALL ON SEQUENCE bsch.bs5 TO PUBLIC; -- By virtue of schema ownership /*c1*/SELECT i, next value for bs2 FROM bt; SET SCHEMA public; /*c1*/SELECT i, next value for bsch.bs1 FROM bsch.bt; -- Enough schema specification testing. Just use defauls Session schema for -- here on in /*c1*/SELECT i FROM pt; /*e*/SELECT i, next value for ps3 FROM pt; /*e*/SELECT i, next value for ps4 FROM pt; /*c1*/SELECT i, next value for ps5 FROM pt; /*c1*/SELECT i, next value for ps6 FROM pt; /*e*/SELECT i, next value for ps7 FROM pt; /*e*/SELECT i, next value for ps8 FROM pt; -- Test REVOKES -- Can't revoke on objects you don't own /*e*/REVOKE ALL ON SEQUENCE public.ps6 FROM public RESTRICT; /*u0*/REVOKE ALL ON SEQUENCE bsch.bs1 FROM public RESTRICT; CONNECT USER sa PASSWORD ""; /*u0*/REVOKE USAGE ON SEQUENCE public.ps6 FROM BLAINE RESTRICT; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSchemaPersistA1.txt0000644000175000017500000004747712007547346024266 0ustar renerene-- CREATE AND INITIALIZE OBJECTS -- This CREATES the schema-specific objects to be used for -- schema-specific persistence tests. -- (See the *C[12].txt scripts for similar tests of ALTER comands (which -- this script purposefully omits). -- ****************************** MEM Tables --DROP TABLE nosuch; DROP TABLE tblt1 IF exists; DROP TABLE tblt2 IF exists; DROP TABLE tblt3 IF exists; DROP TABLE tblt4 IF exists; DROP TABLE tblt101 IF exists; DROP TABLE tblj1 IF exists; /*u0*/CREATE TABLE tblt1 (i int); /*u0*/CREATE TABLE public.tblt2 (i int); /*u0*/CREATE TABLE tblt3 (i int); /*u0*/CREATE TABLE tblj1 (i int, vc varchar(10)); -- For testing Joins /*e*/CREATE TABLE information_schema.tblt101 (i int); /*e*/CREATE TABLE tblt1 (i int); -- Create existing object /*e*/CREATE TABLE public.tblt1 (i int); -- Create existing object /*e*/CREATE TABLE information_schema.system_users (i int); -- Existing object /*e*/INSERT INTO other.tblt1 values(0); /*e*/INSERT INTO information_schema.tblt1 values(1); /*u1*/INSERT INTO tblt1 values(0); /*u1*/INSERT INTO public.tblt1 values(100); -- Test one update that will be persisted (most update tests won't be) /*u1*/UPDATE public.tblt1 set i = 1 WHERE i = 100; /*u1*/INSERT INTO tblj1 values(1, 'one'); CREATE TABLE public.tblt4 AS (SELECT * FROM public.tblt1 WHERE i = 0) WITH DATA; /*c1*/SELECT * FROM public.tblt4; -- ****************************** CACH Tables --DROP TABLE nosuch; DROP TABLE ctblt1 IF exists; DROP TABLE ctblt2 IF exists; DROP TABLE ctblt3 IF exists; DROP TABLE ctblt4 IF exists; DROP TABLE ctblt101 IF exists; DROP TABLE tblj1 IF exists; /*u0*/CREATE CACHED TABLE ctblt1 (i int); /*u0*/CREATE CACHED TABLE public.ctblt2 (i int); /*u0*/CREATE CACHED TABLE ctblt3 (i int); /*u0*/CREATE CACHED TABLE tblj1 (i int, vc varchar(10)); -- For testing Joins /*e*/CREATE CACHED TABLE information_schema.ctblt101 (i int); /*e*/CREATE CACHED TABLE ctblt1 (i int); -- Create existing object /*e*/CREATE CACHED TABLE public.ctblt1 (i int); -- Create existing object /*e*/CREATE CACHED TABLE information_schema.system_users (i int); -- Existing object /*e*/INSERT INTO other.ctblt1 values(0); /*e*/INSERT INTO information_schema.ctblt1 values(1); /*u1*/INSERT INTO ctblt1 values(0); /*u1*/INSERT INTO public.ctblt1 values(100); -- Test one update that will be persisted (most update tests won't be) /*u1*/UPDATE public.ctblt1 set i = 1 WHERE i = 100; /*u1*/INSERT INTO tblj1 values(1, 'one'); CREATE TABLE public.ctblt4 AS (SELECT * FROM public.ctblt1 WHERE i = 0) WITH DATA; /*c1*/SELECT * FROM public.ctblt4; -- ****************************** Views DROP VIEW vwv1 IF exists; DROP VIEW vwv2 IF exists; DROP VIEW vwv3 IF exists; DROP VIEW vwv4 IF exists; DROP VIEW vwv5 IF exists; DROP VIEW vwv6 IF exists; DROP VIEW vwv7 IF exists; DROP VIEW vwv8 IF exists; DROP VIEW vwv9 IF exists; DROP VIEW vwv10 IF exists; DROP VIEW vwv11 IF exists; DROP VIEW vwv12 IF exists; DROP VIEW vwv13 IF exists; DROP VIEW vwv14 IF exists; DROP VIEW vwv15 IF exists; DROP VIEW vwv16 IF exists; DROP VIEW vwv17 IF exists; DROP VIEW vwv18 IF exists; DROP VIEW vwv19 IF exists; DROP VIEW vwv20 IF exists; DROP VIEW vwv21 IF exists; DROP VIEW vwv22 IF exists; DROP VIEW vwv23 IF exists; DROP VIEW vwv24 IF exists; DROP VIEW vwv25 IF exists; DROP VIEW vwv26 IF exists; DROP VIEW vwv101 IF exists; DROP TABLE vwt1 IF exists; DROP TABLE vwt2 IF exists; DROP TABLE vwj1 IF exists; CREATE TABLE vwt1 (i int); CREATE TABLE vwj1 (i int, vc varchar(10)); INSERT INTO vwt1 values(0); INSERT INTO vwt1 values(1); INSERT INTO vwj1 values(1, 'one'); /*e*/CREATE VIEW information_schema.vwv101 AS SELECT * FROM information_schema.system_users; /*e*/CREATE VIEW information_schema.vwv101 AS SELECT * FROM vwt1; -- I think we prohibit ANY manual creation of objects in information_schema. /*e*/CREATE VIEW information_schema.vwv4 AS SELECT * FROM public.vwt1; /*e*/CREATE VIEW vwv101 AS SELECT * FROM other.vwt1; /*e*/CREATE VIEW public.vwv101 AS SELECT * FROM other.vwt1; /*e*/CREATE VIEW other.vwv101 AS SELECT * FROM information_schema.system_users, vwj1 WHERE user_name = vc; /*e*/CREATE VIEW other.vwv101 AS SELECT * FROM information_schema.system_users, public.vwj1 WHERE user_name = vc; /*e*/CREATE VIEW other.vwv101 AS SELECT * FROM information_schema.system_users, vwj1 WHERE information_schema.user_name = vc; /*e*/CREATE VIEW other.vwv101 AS SELECT * FROM information_schema.system_users, vwj1 WHERE information_schema.user_name = public.vc; /*e*/CREATE VIEW information_schema.vwv101 AS SELECT * FROM information_schema.system_users, vwj1 WHERE user_name = vc; /*e*/CREATE VIEW information_schema.vwv101 AS SELECT * FROM information_schema.system_users, public.vwj1 WHERE user_name = vc; /*e*/CREATE VIEW information_schema.vwv101 AS SELECT * FROM information_schema.system_users, vwj1 WHERE information_schema.user_name = vc; /*e*/CREATE VIEW information_schema.vwv101 AS SELECT * FROM information_schema.system_users, vwj1 WHERE information_schema.user_name = public.vc; /*e*/CREATE VIEW vwv101 AS SELECT * FROM system_users, vwj1 WHERE user_name = vc; /*e*/CREATE VIEW vwv101 AS SELECT * FROM information_schema.system_users, information_schema.vwj1 WHERE user_name = vc; /*e*/CREATE VIEW vwv101 AS SELECT * FROM information_schema.system_users, vwj1 WHERE other.user_name = vc; /*e*/CREATE VIEW vwv101 AS SELECT * FROM information_schema.system_users, vwj1 WHERE public.user_name = public.vc; /*u0*/CREATE VIEW vwv1 AS SELECT * FROM vwt1; /*e*/CREATE VIEW public.vwv1 AS SELECT * FROM vwt1; -- Create existing object /*e*/CREATE VIEW public.vwv1 AS SELECT * FROM public.vwt1; -- Existing object /*u0*/CREATE VIEW public.vwv2 AS SELECT * FROM vwt1; /*u0*/CREATE VIEW public.vwv3 AS SELECT * FROM public.vwt1; /*u0*/CREATE VIEW public.vwv4 AS SELECT * FROM vwt1 WHERE i = 0; /*u0*/CREATE VIEW public.vwv5 AS SELECT * FROM vwt1 WHERE i < 1; /*u0*/CREATE VIEW public.vwv6 AS SELECT * FROM information_schema.system_users WHERE user_name = 'SA'; /*u0*/CREATE VIEW vwv7 AS SELECT * FROM information_schema.system_users; /*u0*/CREATE VIEW vwv8 AS SELECT * FROM information_schema.system_users WHERE user_name = 'SA'; /*u0*/CREATE VIEW vwv9 AS SELECT * FROM information_schema.system_users, vwj1 WHERE user_name = vc; /*u0*/CREATE VIEW vwv10 AS SELECT * FROM information_schema.system_users, public.vwj1 WHERE user_name = vc; /*u0*/CREATE VIEW vwv11 AS SELECT * FROM information_schema.system_users, vwj1 WHERE system_users.user_name = vc; /*u0*/CREATE VIEW vwv12 AS SELECT * FROM information_schema.system_users, vwj1 WHERE system_users.user_name = vwj1.vc; /*u0*/CREATE VIEW public.vwv13 AS SELECT * FROM information_schema.system_users, vwj1 WHERE user_name = vc; /*u0*/CREATE VIEW public.vwv14 AS SELECT * FROM information_schema.system_users, public.vwj1 WHERE user_name = vc; /*u0*/CREATE VIEW public.vwv15 AS SELECT * FROM information_schema.system_users, vwj1 WHERE system_users.user_name = vc; /*u0*/CREATE VIEW public.vwv16 AS SELECT * FROM information_schema.system_users, public.vwj1 WHERE system_users.user_name = vwj1.vc; /*u0*/CREATE VIEW vwv17 AS SELECT * FROM information_schema.system_users, vwj1 WHERE user_name = vc; /*u0*/CREATE VIEW vwv18 AS SELECT * FROM information_schema.system_users, public.vwj1 WHERE user_name = vc; /*u0*/CREATE VIEW vwv19 (v1, v2, v3) AS SELECT * FROM vwt1, vwj1 WHERE vwt1.i = vwj1.i; /*u0*/CREATE VIEW vwv20 (v1, v2, v3) AS SELECT * FROM public.vwt1, public.vwj1 WHERE vwt1.i = vwj1.i; /*u0*/CREATE VIEW vwv21 (v1, v2, v3) AS SELECT * FROM public.vwt1, vwj1 WHERE vwt1.i = vwj1.i; /*u0*/CREATE VIEW vwv22 (v1, v2, v3) AS SELECT * FROM vwt1, public.vwj1 WHERE vwt1.i = vwj1.i; /*u0*/CREATE VIEW public.vwv23 (v1, v2, v3) AS SELECT * FROM vwt1, vwj1 WHERE vwt1.i = vwj1.i; /*u0*/CREATE VIEW public.vwv24 (v1, v2, v3) AS SELECT * FROM public.vwt1, public.vwj1 WHERE vwt1.i = vwj1.i; /*u0*/CREATE VIEW public.vwv25 (v1, v2, v3) AS SELECT * FROM public.vwt1, vwj1 WHERE vwt1.i = vwj1.i; /*u0*/CREATE VIEW public.vwv26 (v1, v2, v3) AS SELECT * FROM vwt1, public.vwj1 WHERE vwt1.i = vwj1.i; /*u0*/CREATE VIEW vwv28 AS SELECT * FROM vwt1 WHERE i in (0, 1, 11, 12); /*u0*/CREATE VIEW public.vwv29 AS SELECT * FROM vwt1 WHERE i < 1; /*u0*/CREATE VIEW vwv30 AS SELECT * FROM vwt1 WHERE vwt1.i = (SELECT i FROM vwj1); /*u0*/CREATE VIEW vwv31 AS SELECT * FROM vwt1 WHERE vwt1.i in (SELECT i FROM vwj1); /*u0*/CREATE VIEW vwv32 AS SELECT * FROM vwt1 WHERE vwt1.i = (SELECT i FROM vwj1 WHERE i = 0); /*u0*/CREATE VIEW vwv33 AS SELECT * FROM public.vwt1 WHERE vwt1.i = (SELECT i FROM vwj1); /*u0*/CREATE VIEW PUBLIC.vwv34 AS SELECT * FROM public.vwt1 WHERE vwt1.i in (SELECT i FROM vwj1); /*u0*/CREATE VIEW PUBLIC.vwv35 AS SELECT * FROM public.vwt1 WHERE vwt1.i = (SELECT i FROM vwj1 WHERE i = 0); /*u0*/CREATE VIEW PUBLIC.vwv36 AS SELECT * FROM vwt1 WHERE vwt1.i = (SELECT i FROM public.vwj1); /*u0*/CREATE VIEW PUBLIC.vwv37 AS SELECT * FROM vwt1 WHERE vwt1.i in (SELECT i FROM public.vwj1); /*u0*/CREATE VIEW PUBLIC.vwv38 AS SELECT * FROM vwt1 WHERE vwt1.i = (SELECT i FROM public.vwj1 WHERE i = 1); /*u0*/CREATE VIEW PUBLIC.vwv39 AS SELECT * FROM vwt1 WHERE vwt1.i = (SELECT vwj1.i FROM public.vwj1); /*u0*/CREATE VIEW PUBLIC.vwv40 AS SELECT * FROM vwt1 WHERE vwt1.i in (SELECT vwj1.i FROM vwj1); /*u0*/CREATE VIEW PUBLIC.vwv41 AS SELECT * FROM vwt1 WHERE vwt1.i = (SELECT vwj1.i FROM vwj1 WHERE i = 1); /*u0*/CREATE VIEW PUBLIC.vwv42 AS SELECT * FROM vwt1 WHERE vwt1.i = (SELECT i FROM public.vwj1 WHERE vwj1.i = 1); /*u0*/CREATE VIEW PUBLIC.vwv43 AS SELECT * FROM vwt1 WHERE vwt1.i = (SELECT vwj1.i FROM vwj1 WHERE vwj1.i = 1); /*u0*/CREATE VIEW PUBLIC.vwv44 AS SELECT * FROM vwt1 WHERE i = (SELECT i FROM vwj1); /*u0*/CREATE VIEW PUBLIC.vwv45 AS SELECT * FROM vwt1 WHERE i in (SELECT i FROM vwj1); /*u0*/CREATE VIEW PUBLIC.vwv46 AS SELECT * FROM vwt1 WHERE i = (SELECT i FROM vwj1 WHERE i = 1); /*u0*/CREATE VIEW PUBLIC.vwv47 AS SELECT * FROM public.vwt1 WHERE i = (SELECT i FROM vwj1); /*u0*/CREATE VIEW PUBLIC.vwv48 AS SELECT * FROM public.vwt1 WHERE i in (SELECT i FROM vwj1); /*u0*/CREATE VIEW PUBLIC.vwv49 AS SELECT * FROM public.vwt1 WHERE i = (SELECT i FROM vwj1 WHERE i = 1); /*u0*/CREATE VIEW PUBLIC.vwv50 AS SELECT * FROM vwt1 WHERE i = (SELECT i FROM public.vwj1); /*u0*/CREATE VIEW PUBLIC.vwv51 AS SELECT * FROM vwt1 WHERE i in (SELECT i FROM public.vwj1); /*u0*/CREATE VIEW PUBLIC.vwv52 AS SELECT * FROM vwt1 WHERE i = (SELECT i FROM public.vwj1 WHERE i = 1); /*u0*/CREATE VIEW PUBLIC.vwv53 AS SELECT * FROM vwt1 WHERE i = (SELECT vwj1.i FROM public.vwj1); /*u0*/CREATE VIEW PUBLIC.vwv54 AS SELECT * FROM vwt1 WHERE i in (SELECT vwj1.i FROM vwj1); /*u0*/CREATE VIEW PUBLIC.vwv55 AS SELECT * FROM vwt1 WHERE i = (SELECT vwj1.i FROM vwj1 WHERE i = 1); /*u0*/CREATE VIEW PUBLIC.vwv56 AS SELECT * FROM vwt1 WHERE i = (SELECT i FROM public.vwj1 WHERE vwj1.i = 1); /*u0*/CREATE VIEW PUBLIC.vwv57 AS SELECT * FROM vwt1 WHERE i = (SELECT vwj1.i FROM vwj1 WHERE vwj1.i = 1); /*e*/DROP VIEW other.vwv1; /*e*/DROP VIEW information_schema.vwv2; -- ****************************** MEM Indexes DROP INDEX indi1 IF exists; DROP INDEX indi2 IF exists; DROP INDEX indi3 IF exists; DROP INDEX indi4 IF exists; DROP INDEX indi5 IF exists; DROP TABLE indt1 IF exists; DROP TABLE indt2 IF exists; DROP TABLE indt3 IF exists; DROP TABLE indt4 IF exists; DROP TABLE indt101 IF exists; CREATE TABLE indt1 (i int); INSERT INTO indt1 values(0); INSERT INTO indt1 values(1); CREATE TABLE indt2 (i int); INSERT INTO indt2 values(0); INSERT INTO indt2 values(1); CREATE TABLE indt3 (i int); INSERT INTO indt3 values(0); INSERT INTO indt3 values(1); CREATE TABLE indt4 (i int); INSERT INTO indt4 values(0); INSERT INTO indt4 values(1); /*e*/CREATE UNIQUE INDEX other.indi101 on indt101(i); /*e*/CREATE INDEX other.indi101 on indt101(i); CREATE TABLE indt101 (i int); INSERT INTO indt101 values(0); INSERT INTO indt101 values(1); /*e*/CREATE UNIQUE INDEX information_schema.indi101 on indt101(i int); /*u0*/CREATE UNIQUE INDEX indi1 ON indt1(i); /*e*/CREATE UNIQUE INDEX indi1 ON indt1(i); -- Create existing object /*u0*/CREATE UNIQUE INDEX public.indi2 ON indt2(i); /*e*/CREATE UNIQUE INDEX public.indi2 ON indt2(i); -- Create existing object /*u0*/CREATE UNIQUE INDEX indi3 ON indt3(i); /*u0*/CREATE UNIQUE INDEX indi4 ON indt4(i); -- The error message says that the schema name is invalid. Problem here -- is creating an index in a different schema than the target table. /*e*/CREATE UNIQUE INDEX indi5 ON information_schema.system_users(user_name); /*e*/DROP INDEX other.indi1; /*e*/DROP INDEX information_schema.indi2; -- ****************************** CACH Indexes DROP INDEX cindi1 IF exists; DROP INDEX cindi2 IF exists; DROP INDEX cindi3 IF exists; DROP INDEX cindi4 IF exists; DROP INDEX cindi5 IF exists; DROP TABLE cindt1 IF exists; DROP TABLE cindt2 IF exists; DROP TABLE cindt3 IF exists; DROP TABLE cindt4 IF exists; DROP TABLE cindt101 IF exists; CREATE TABLE cindt1 (i int); INSERT INTO cindt1 values(0); INSERT INTO cindt1 values(1); CREATE TABLE cindt2 (i int); INSERT INTO cindt2 values(0); INSERT INTO cindt2 values(1); CREATE TABLE cindt3 (i int); INSERT INTO cindt3 values(0); INSERT INTO cindt3 values(1); CREATE TABLE cindt4 (i int); INSERT INTO cindt4 values(0); INSERT INTO cindt4 values(1); /*e*/CREATE UNIQUE INDEX other.cindi101 on cindt101(i); CREATE TABLE cindt101 (i int); INSERT INTO cindt101 values(0); INSERT INTO cindt101 values(1); /*e*/CREATE UNIQUE INDEX information_schema.cindi101 on cindt101(i int); /*u0*/CREATE UNIQUE INDEX cindi1 ON cindt1(i); /*e*/CREATE UNIQUE INDEX cindi1 ON cindt1(i); -- Create existing object /*u0*/CREATE UNIQUE INDEX public.cindi2 ON cindt2(i); /*e*/CREATE UNIQUE INDEX public.cindi2 ON cindt2(i); -- Create existing object /*u0*/CREATE UNIQUE INDEX cindi3 ON cindt3(i); /*u0*/CREATE UNIQUE INDEX cindi4 ON cindt4(i); -- The error message says that the schema name is invalid. Problem here -- is creating an index in a different schema than the target table. /*e*/CREATE UNIQUE INDEX cindi5 ON information_schema.system_users(user_name); /*e*/DROP INDEX other.cindi1; /*e*/DROP INDEX information_schema.cindi2; -- ****************************** Sequences DROP TABLE seqt1 IF EXISTS; CREATE TABLE seqt1 (i int); INSERT INTO seqt1 VALUES(10); -- No "IF EXISTS" allowed with sequences, so can't verify they don't exists. /*e*/CREATE SEQUENCE other.s101; /*e*/CREATE SEQUENCE information_schema.s101; /*u0*/CREATE SEQUENCE s1; /*e*/CREATE SEQUENCE s1; -- Create existing object /*u0*/CREATE SEQUENCE public.s2; /*e*/CREATE SEQUENCE public.s2; -- Create existing object -- To test persisting of incremented value /*r0*/SELECT next value FOR s2 FROM seqt1; /*r1*/SELECT next value FOR s2 FROM seqt1; -- ****************************** Triggers DROP TABLE trgt1 IF EXISTS; DROP TABLE trgt2 IF EXISTS; DROP TABLE trgt3 IF EXISTS; DROP TABLE trgt4 IF EXISTS; DROP TABLE trgt101 IF EXISTS; -- No "IF EXISTS" allowed with triggers, so can't verify they don't exists. CREATE TABLE trgt1 (i int); CREATE TABLE trgt2 (i int); CREATE TABLE trgt3 (i int); CREATE TABLE trgt4 (i int); /*e*/CREATE TRIGGER other.trgtrig101 AFTER INSERT ON trgt1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/CREATE TRIGGER trgtrig101 AFTER INSERT ON other.trgt1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/CREATE TRIGGER trgtrig101 AFTER INSERT ON information_schema.trgt1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/CREATE TRIGGER trgtrig101 AFTER INSERT ON trgt101 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; /*u0*/CREATE TRIGGER trgtrig1 AFTER INSERT ON trgt1 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; /*u0*/CREATE TRIGGER public.trgtrig2 AFTER INSERT ON trgt2 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; /*u0*/CREATE TRIGGER trgtrig3 AFTER INSERT ON public.trgt3 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; /*u0*/CREATE TRIGGER public.trgtrig4 AFTER INSERT ON public.trgt4 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; /*e*/DROP TRIGGER information_schema.trgtrig1; /*e*/DROP TRIGGER other.trgtrig1; -- ****************************** Constraints DROP TABLE cont1 IF EXISTS; DROP TABLE cont2 IF EXISTS; DROP TABLE cont3 IF EXISTS; DROP TABLE cont4 IF EXISTS; DROP TABLE cont5 IF EXISTS; DROP TABLE cont6 IF EXISTS; DROP TABLE cont7 IF EXISTS; DROP TABLE cont8 IF EXISTS; DROP TABLE cont9 IF EXISTS; DROP TABLE cont10 IF EXISTS; DROP TABLE cont11 IF EXISTS; DROP TABLE cont12 IF EXISTS; DROP TABLE cont13 IF EXISTS; DROP TABLE cont14 IF EXISTS; DROP TABLE cont15 IF EXISTS; DROP TABLE cont16 IF EXISTS; DROP TABLE cont17 IF EXISTS; DROP TABLE cont18 IF EXISTS; DROP TABLE cont19 IF EXISTS; DROP TABLE cont20 IF EXISTS; DROP TABLE cont101 IF EXISTS; CREATE TABLE conj1(i int, vc varchar(10), PRIMARY KEY (i)); INSERT INTO conj1 values(1, 'one'); -- No "IF EXISTS" allowed with constrs., so can't verify they don't exists. /*e*/CREATE TABLE other.cont101 (i int, CONSTRAINT conuc1 UNIQUE(i)); /*e*/CREATE TABLE system_information.cont1 (i int, CONSTRAINT conuc1 UNIQUE(i)); /*u0*/CREATE TABLE cont1 (i int, CONSTRAINT conuc1 UNIQUE(i)); /*e*/CREATE TABLE cont1 (i int, CONSTRAINT conuc1 UNIQUE(i)); /*e*/CREATE TABLE cont101 (i int, CONSTRAINT conuc1 UNIQUE(i)); -- conuc1 already exists /*e*/CREATE TABLE cont101 (i int, CONSTRAINT public.conuc1 UNIQUE(i)); -- ditto /*u0*/CREATE TABLE public.cont2 (i int, CONSTRAINT conuc2 UNIQUE(i)); /*e*/CREATE TABLE public.cont101 (i int, CONSTRAINT conuc2 UNIQUE(i)); -- conuc2 already /*e*/CREATE TABLE public.cont101 (i int, CONSTRAINT public.conuc2 UNIQUE(i)); -- dit /*u0*/CREATE TABLE cont3 (i int, CONSTRAINT public.conuc3 UNIQUE(i)); /*u0*/CREATE TABLE public.cont4 (i int, CONSTRAINT public.conuc4 UNIQUE(i)); /*u0*/CREATE TABLE cont5 (i int, CONSTRAINT conpk5 PRIMARY KEY(i)); /*u0*/CREATE TABLE public.cont6 (i int, CONSTRAINT conpk6 PRIMARY KEY(i)); /*u0*/CREATE TABLE cont7 (i int, CONSTRAINT public.conpk7 PRIMARY KEY(i)); /*u0*/CREATE TABLE public.cont8 (i int, CONSTRAINT public.conpk8 PRIMARY KEY(i)); /*u0*/CREATE TABLE cont9 (i int, CONSTRAINT confk9 FOREIGN KEY(i) REFERENCES conj1(i)); /*e*/CREATE TABLE cont101 (i int, CONSTRAINT confk9 FOREIGN KEY(i) REFERENCES other.conj1(i)); /*e*/CREATE TABLE cont101 (i int, CONSTRAINT confk9 FOREIGN KEY(i) REFERENCES information_schema.conj1(i)); /*u0*/CREATE TABLE public.cont10 (i int, CONSTRAINT confk10 FOREIGN KEY(i) REFERENCES conj1(i)); /*u0*/CREATE TABLE cont11 (i int, CONSTRAINT public.confk11 FOREIGN KEY(i) REFERENCES conj1(i)); /*u0*/CREATE TABLE public.cont12 (i int, CONSTRAINT public.confk12 FOREIGN KEY(i) REFERENCES conj1(i)); /*u0*/CREATE TABLE cont13 (i int, CONSTRAINT confk13 FOREIGN KEY(i) REFERENCES public.conj1(i)); /*u0*/CREATE TABLE public.cont14 (i int, CONSTRAINT confk14 FOREIGN KEY(i) REFERENCES public.conj1(i)); /*u0*/CREATE TABLE cont15 (i int, CONSTRAINT public.confk15 FOREIGN KEY(i) REFERENCES public.conj1(i)); /*u0*/CREATE TABLE public.cont16 (i int, CONSTRAINT public.confk16 FOREIGN KEY(i) REFERENCES public.conj1(i)); /*u0*/CREATE TABLE cont17 (i int, CONSTRAINT conc17 CHECK (i < 1)); /*u0*/CREATE TABLE public.cont18 (i int, CONSTRAINT conc18 CHECK (i in (0, 2))); /*u0*/CREATE TABLE cont19 (i int, CONSTRAINT public.conc19 CHECK (i = 0)); /*u0*/CREATE TABLE public.cont20 (i int, CONSTRAINT public.conc20 CHECK (i != 1)); -- This to test recovery from .log files. COMMIT; SHUTDOWN IMMEDIATELY; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfImmediateShutdownRecover.txt0000644000175000017500000000026012007547346026265 0ustar renerene/*c4*/SELECT * FROM TABLE1; /*c4*/SELECT * FROM TABLE2; /*c1*/SELECT * FROM TABLE2 WHERE COLUMN2=15; -- bug #1110517 /*rnewdir*/SELECT NAME FROM FILE2; DROP TABLE FILE2; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfNameResolution.txt0000644000175000017500000001111012007547346024245 0ustar renerenedrop table t0 if exists; create table t0(c varchar(20), i integer); insert into t0 values ('first', 1); insert into t0 values ('second', 2); insert into t0 values ('third', 3); select * from t0 order by c; select t0.c, t0.i from t0 order by c, t0.i; select c as cc from t0 order by cc; select c as cc from t0 order by i; select upper(c) as uc from t0 t order by uc; select i, c from t0 order by upper(c); /*c3*/select i, c as cc from t0 order by upper(cc); /*e*/select distinct upper(c) as uc from t0 t order by i; /*c3*/select c as ccol, sum(i) as sumi from t0 group by c; /*c3*/select c as ccol, sum(i) as sumi from t0 group by c order by sumi; select c as ccol, sum(i) as sumi from t0 group by ccol; /*c1*/select c as ccol, sum(i) as sumi from t0 group by c having substring(upper(c) from 1 for 1) = 'S' /*c1*/select c || ' time' as ccol, sum(i) as sumi from t0 group by c having c || ' time' = 'second time' /*c2*/select c as ccol, sum(i) as sumi from t0 group by c having avg(i) < 3 /*c1*/select c as ccol, sum(i) as sumi from t0 group by c having substring(upper(c) from 1 for 1) = 'S' and avg(i) < 10 order by c desc /*c1*/select c as ccol, sum(i) as sumi from t0 group by c having substring(upper(c) from 1 for 1) = 'S' and avg(i) < 10 order by c desc, sumi -- bug item #1167704 drop table test if exists; create table test(id integer, cost numeric(3,1)); insert into test values(1,10); insert into test values(2,20); insert into test values (3,1); insert into test values (4,2); /*r 3,kr 1.0 4,kr 2.0 1,kr 10.0 2,kr 20.0 */SELECT ID, 'kr ' + Cost FROM Test ORDER BY Cost; /*r 3,kr 1.0 4,kr 2.0 1,kr 10.0 2,kr 20.0 */SELECT ID, 'kr ' || Cost FROM Test ORDER BY Cost; DROP TABLE "CD" IF EXISTS CASCADE; CREATE CACHED TABLE "CD"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,"Title" VARCHAR(50)); CREATE CACHED TABLE "Artist"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,"Name" VARCHAR(50)); CREATE CACHED TABLE "Album"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,"Artist" INTEGER NOT NULL,"Name" VARCHAR(200),"Year" DATE,"CD" INTEGER NOT NULL,CONSTRAINT SYS_FK_42 FOREIGN KEY("CD") REFERENCES "CD"("ID"),CONSTRAINT SYS_FK_52 FOREIGN KEY("Artist") REFERENCES "Artist"("ID") ON DELETE CASCADE); CREATE CACHED TABLE "Song"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,"Album" INTEGER NOT NULL,"Name" VARCHAR(300),"Track" INTEGER,"Duration" TIME,"Genre" VARCHAR(50),CONSTRAINT SYS_FK_55 FOREIGN KEY("Album") REFERENCES "Album"("ID") ON DELETE CASCADE); INSERT INTO "CD" VALUES(21,'24'); INSERT INTO "Artist" VALUES(123,'Annie Lennox'); INSERT INTO "Album" VALUES(172,123,'Medusa',NULL,21); INSERT INTO "Song" VALUES(2669,172,'waiting in vain',9,'00:05:39',NULL); -- issue with aliases - bug 1344316 create table test1 (idtest int,test varchar(100),primary key(idtest)); create table test2 (idtest2 int,idtest int,test varchar(100),primary key(idtest2),foreign key (idtest) REFERENCES test1(idtest)); INSERT INTO test1 (idtest, test) VALUES (1,'hello'); INSERT INTO test2 (idtest2,idtest, test) VALUES(2,1,'world'); /*r hello,2 */select t1.test, t2.idtest2 as idtest from test1 t1 join test2 t2 on (t1.idtest=t2.idtest) /*r hello,hello */select t1.test, t1.test as idtest from test1 t1 JOIN test2 t2 on (t1.idtest=t2.idtest) /*r 1,2 */select idtest, idtest2 from test2 group by idtest, idtest2 order by idtest /*e*/select idtest, idtest2 from test2 group by idtest, idtest2 order by test /*e*/select distinct idtest, idtest2 from test2 order by test /*r 1 */select distinct idtest from test2 group by idtest2, idtest order by idtest /*e*/select distinct idtest from test2 group by idtest2, idtest order by idtest2 ----- drop table tablea if exists; drop table tableb if exists; create table tablea (cola int, colb int, colc int); create table tableb (cola int, colb int, colc int); SELECT T1.colA, T1.colB FROM tableA T1 WHERE T1.colC = ( SELECT MAX(T2.colC) FROM tableA T2 WHERE T1.colB = T2.colB); SELECT T1.colA, T1.colB FROM tableA T1 WHERE T1.colC IN ( SELECT MAX(T2.colC) FROM tableA T2 WHERE T1.colB = T2.colB); --- DROP TABLE TABLEA IF EXISTS; CREATE TABLE TABLEA (LIMIT VARCHAR(5), TOP INT); INSERT INTO TABLEA(LIMIT, TOP) VALUES ('LIMIT', 2); SELECT LIMIT FROM TABLEA; SELECT TOP FROM TABLEA; SELECT LIMIT TOP FROM TABLEA; SELECT TOP LIMIT FROM TABLEA; SELECT LIMIT, TOP FROM TABLEA; SELECT TOP, LIMIT FROM TABLEA; SELECT RIGHT(LIMIT,2) FROM TABLEA; SELECT LEFT(LIMIT,2) FROM TABLEA; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSysTables.txt0000644000175000017500000001551012007547346023222 0ustar renereneSET SCHEMA information_schema; SELECT DISTINCT * FROM SYSTEM_BESTROWIDENTIFIER SELECT DISTINCT * FROM SYSTEM_CACHEINFO SELECT DISTINCT * FROM SYSTEM_COLUMNS SELECT DISTINCT * FROM SYSTEM_COMMENTS SELECT DISTINCT * FROM SYSTEM_CROSSREFERENCE SELECT DISTINCT * FROM SYSTEM_INDEXINFO SELECT DISTINCT * FROM SYSTEM_PRIMARYKEYS SELECT DISTINCT * FROM SYSTEM_PROCEDURECOLUMNS SELECT DISTINCT * FROM SYSTEM_PROCEDURES SELECT DISTINCT * FROM SYSTEM_PROPERTIES SELECT DISTINCT * FROM SYSTEM_SCHEMAS SELECT DISTINCT * FROM SYSTEM_SESSIONINFO SELECT DISTINCT * FROM SYSTEM_SESSIONS SELECT DISTINCT * FROM SYSTEM_TABLES SELECT DISTINCT * FROM SYSTEM_TABLETYPES SELECT DISTINCT * FROM SYSTEM_TEXTTABLES SELECT DISTINCT * FROM SYSTEM_TYPEINFO SELECT DISTINCT * FROM SYSTEM_UDTS SELECT DISTINCT * FROM SYSTEM_USERS SELECT DISTINCT * FROM SYSTEM_VERSIONCOLUMNS -- select a second time SELECT DISTINCT * FROM SYSTEM_BESTROWIDENTIFIER SELECT DISTINCT * FROM SYSTEM_CACHEINFO SELECT DISTINCT * FROM SYSTEM_COLUMNS SELECT DISTINCT * FROM SYSTEM_COMMENTS SELECT DISTINCT * FROM SYSTEM_CROSSREFERENCE SELECT DISTINCT * FROM SYSTEM_INDEXINFO SELECT DISTINCT * FROM SYSTEM_PRIMARYKEYS SELECT DISTINCT * FROM SYSTEM_PROCEDURECOLUMNS SELECT DISTINCT * FROM SYSTEM_PROCEDURES SELECT DISTINCT * FROM SYSTEM_PROPERTIES SELECT DISTINCT * FROM SYSTEM_SCHEMAS SELECT DISTINCT * FROM SYSTEM_SESSIONINFO SELECT DISTINCT * FROM SYSTEM_SESSIONS SELECT DISTINCT * FROM SYSTEM_TABLES SELECT DISTINCT * FROM SYSTEM_TABLETYPES SELECT DISTINCT * FROM SYSTEM_TEXTTABLES SELECT DISTINCT * FROM SYSTEM_TYPEINFO SELECT DISTINCT * FROM SYSTEM_UDTS SELECT DISTINCT * FROM SYSTEM_USERS SELECT DISTINCT * FROM SYSTEM_VERSIONCOLUMNS -- SELECT DISTINCT * FROM ADMINISTRABLE_ROLE_AUTHORIZATIONS SELECT DISTINCT * FROM APPLICABLE_ROLES SELECT DISTINCT * FROM ASSERTIONS SELECT DISTINCT * FROM AUTHORIZATIONS SELECT DISTINCT * FROM CHARACTER_SETS SELECT DISTINCT * FROM CHECK_CONSTRAINT_ROUTINE_USAGE SELECT DISTINCT * FROM CHECK_CONSTRAINTS SELECT DISTINCT * FROM COLLATIONS SELECT DISTINCT * FROM COLUMN_COLUMN_USAGE SELECT DISTINCT * FROM COLUMN_DOMAIN_USAGE SELECT DISTINCT * FROM COLUMN_PRIVILEGES SELECT DISTINCT * FROM COLUMN_UDT_USAGE SELECT DISTINCT * FROM COLUMNS SELECT DISTINCT * FROM CONSTRAINT_COLUMN_USAGE SELECT DISTINCT * FROM CONSTRAINT_TABLE_USAGE SELECT DISTINCT * FROM DATA_TYPE_PRIVILEGES SELECT DISTINCT * FROM DOMAIN_CONSTRAINTS SELECT DISTINCT * FROM DOMAINS SELECT DISTINCT * FROM ENABLED_ROLES SELECT DISTINCT * FROM INFORMATION_SCHEMA_CATALOG_NAME SELECT DISTINCT * FROM JAR_JAR_USAGE SELECT DISTINCT * FROM JARS SELECT DISTINCT * FROM KEY_COLUMN_USAGE SELECT DISTINCT * FROM PARAMETERS SELECT DISTINCT * FROM REFERENTIAL_CONSTRAINTS SELECT DISTINCT * FROM ROLE_AUTHORIZATION_DESCRIPTORS SELECT DISTINCT * FROM ROLE_COLUMN_GRANTS SELECT DISTINCT * FROM ROLE_ROUTINE_GRANTS SELECT DISTINCT * FROM ROLE_TABLE_GRANTS SELECT DISTINCT * FROM ROLE_UDT_GRANTS SELECT DISTINCT * FROM ROLE_USAGE_GRANTS SELECT DISTINCT * FROM ROUTINE_COLUMN_USAGE SELECT DISTINCT * FROM ROUTINE_JAR_USAGE SELECT DISTINCT * FROM ROUTINE_PRIVILEGES SELECT DISTINCT * FROM ROUTINE_ROUTINE_USAGE SELECT DISTINCT * FROM ROUTINE_SEQUENCE_USAGE SELECT DISTINCT * FROM ROUTINE_TABLE_USAGE SELECT DISTINCT * FROM ROUTINES SELECT DISTINCT * FROM SCHEMATA SELECT DISTINCT * FROM SEQUENCES SELECT DISTINCT * FROM SQL_FEATURES SELECT DISTINCT * FROM SQL_IMPLEMENTATION_INFO SELECT DISTINCT * FROM SQL_PACKAGES SELECT DISTINCT * FROM SQL_PARTS SELECT DISTINCT * FROM SQL_SIZING SELECT DISTINCT * FROM SQL_SIZING_PROFILES SELECT DISTINCT * FROM TABLE_CONSTRAINTS SELECT DISTINCT * FROM TABLE_PRIVILEGES SELECT DISTINCT * FROM TABLES SELECT DISTINCT * FROM TRANSLATIONS SELECT DISTINCT * FROM TRIGGER_COLUMN_USAGE SELECT DISTINCT * FROM TRIGGER_ROUTINE_USAGE SELECT DISTINCT * FROM TRIGGER_SEQUENCE_USAGE SELECT DISTINCT * FROM TRIGGER_TABLE_USAGE SELECT DISTINCT * FROM TRIGGERED_UPDATE_COLUMNS SELECT DISTINCT * FROM TRIGGERS SELECT DISTINCT * FROM UDT_PRIVILEGES SELECT DISTINCT * FROM USAGE_PRIVILEGES SELECT DISTINCT * FROM USER_DEFINED_TYPES SELECT DISTINCT * FROM VIEW_COLUMN_USAGE SELECT DISTINCT * FROM VIEW_ROUTINE_USAGE SELECT DISTINCT * FROM VIEW_TABLE_USAGE SELECT DISTINCT * FROM VIEWS -- select a second time SELECT DISTINCT * FROM ADMINISTRABLE_ROLE_AUTHORIZATIONS SELECT DISTINCT * FROM APPLICABLE_ROLES SELECT DISTINCT * FROM ASSERTIONS SELECT DISTINCT * FROM AUTHORIZATIONS SELECT DISTINCT * FROM CHARACTER_SETS SELECT DISTINCT * FROM CHECK_CONSTRAINT_ROUTINE_USAGE SELECT DISTINCT * FROM CHECK_CONSTRAINTS SELECT DISTINCT * FROM COLLATIONS SELECT DISTINCT * FROM COLUMN_COLUMN_USAGE SELECT DISTINCT * FROM COLUMN_DOMAIN_USAGE SELECT DISTINCT * FROM COLUMN_PRIVILEGES SELECT DISTINCT * FROM COLUMN_UDT_USAGE SELECT DISTINCT * FROM COLUMNS SELECT DISTINCT * FROM CONSTRAINT_COLUMN_USAGE SELECT DISTINCT * FROM CONSTRAINT_TABLE_USAGE SELECT DISTINCT * FROM DATA_TYPE_PRIVILEGES SELECT DISTINCT * FROM DOMAIN_CONSTRAINTS SELECT DISTINCT * FROM DOMAINS SELECT DISTINCT * FROM ENABLED_ROLES SELECT DISTINCT * FROM INFORMATION_SCHEMA_CATALOG_NAME SELECT DISTINCT * FROM JAR_JAR_USAGE SELECT DISTINCT * FROM JARS SELECT DISTINCT * FROM KEY_COLUMN_USAGE SELECT DISTINCT * FROM PARAMETERS SELECT DISTINCT * FROM REFERENTIAL_CONSTRAINTS SELECT DISTINCT * FROM ROLE_AUTHORIZATION_DESCRIPTORS SELECT DISTINCT * FROM ROLE_COLUMN_GRANTS SELECT DISTINCT * FROM ROLE_ROUTINE_GRANTS SELECT DISTINCT * FROM ROLE_TABLE_GRANTS SELECT DISTINCT * FROM ROLE_UDT_GRANTS SELECT DISTINCT * FROM ROLE_USAGE_GRANTS SELECT DISTINCT * FROM ROUTINE_COLUMN_USAGE SELECT DISTINCT * FROM ROUTINE_JAR_USAGE SELECT DISTINCT * FROM ROUTINE_PRIVILEGES SELECT DISTINCT * FROM ROUTINE_ROUTINE_USAGE SELECT DISTINCT * FROM ROUTINE_SEQUENCE_USAGE SELECT DISTINCT * FROM ROUTINE_TABLE_USAGE SELECT DISTINCT * FROM ROUTINES SELECT DISTINCT * FROM SCHEMATA SELECT DISTINCT * FROM SEQUENCES SELECT DISTINCT * FROM SQL_FEATURES SELECT DISTINCT * FROM SQL_IMPLEMENTATION_INFO SELECT DISTINCT * FROM SQL_PACKAGES SELECT DISTINCT * FROM SQL_PARTS SELECT DISTINCT * FROM SQL_SIZING SELECT DISTINCT * FROM SQL_SIZING_PROFILES SELECT DISTINCT * FROM TABLE_CONSTRAINTS SELECT DISTINCT * FROM TABLE_PRIVILEGES SELECT DISTINCT * FROM TABLES SELECT DISTINCT * FROM TRANSLATIONS SELECT DISTINCT * FROM TRIGGER_COLUMN_USAGE SELECT DISTINCT * FROM TRIGGER_ROUTINE_USAGE SELECT DISTINCT * FROM TRIGGER_SEQUENCE_USAGE SELECT DISTINCT * FROM TRIGGER_TABLE_USAGE SELECT DISTINCT * FROM TRIGGERED_UPDATE_COLUMNS SELECT DISTINCT * FROM TRIGGERS SELECT DISTINCT * FROM UDT_PRIVILEGES SELECT DISTINCT * FROM USAGE_PRIVILEGES SELECT DISTINCT * FROM USER_DEFINED_TYPES SELECT DISTINCT * FROM VIEW_COLUMN_USAGE SELECT DISTINCT * FROM VIEW_ROUTINE_USAGE SELECT DISTINCT * FROM VIEW_TABLE_USAGE SELECT DISTINCT * FROM VIEWS hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfUnions.txt0000644000175000017500000000763312007547346022573 0ustar renerenedrop table a if exists; drop table b if exists; drop table c if exists; CREATE TABLE A(ID INTEGER NOT NULL) CREATE TABLE B(ID INTEGER NOT NULL) CREATE TABLE C(ID INTEGER NOT NULL) INSERT INTO A VALUES(1) INSERT INTO A VALUES(2) INSERT INTO A VALUES(3) INSERT INTO B VALUES(1) INSERT INTO B VALUES(2) INSERT INTO C VALUES(3) INSERT INTO C VALUES(4) INSERT INTO C VALUES(5) /*e*/SELECT * FROM A UNION (SELECT * FROM C /*e*/SELECT * FROM A UNION SELECT * FROM C) /*e*/(SELECT * FROM A UNION (SELECT * FROM C /*e*/(SELECT * FROM A /*c5*/SELECT * FROM A UNION SELECT * FROM C /*c5*/(SELECT * FROM A) UNION SELECT * FROM C /*c5*/SELECT * FROM A UNION (SELECT * FROM C) /*c5*/(SELECT * FROM A UNION SELECT * FROM C) -- limits /*c5*/SELECT * FROM A UNION SELECT * FROM C ORDER BY ID /*c4*/(SELECT * FROM A ORDER BY ID LIMIT 1 OFFSET 0) UNION SELECT * FROM C /*c4*/SELECT * FROM A UNION (SELECT * FROM C ORDER BY ID LIMIT 2 OFFSET 0) LIMIT 4 OFFSET 0 /*r 2 3 4 */SELECT * FROM A UNION (SELECT * FROM C ORDER BY ID LIMIT 2 OFFSET 0) ORDER BY ID LIMIT 0 OFFSET 1 /*r 4 3 2 1 */SELECT * FROM A UNION (SELECT * FROM C ORDER BY ID LIMIT 2 OFFSET 0) ORDER BY ID DESC -- /*r 4 5 */SELECT * FROM A UNION SELECT * FROM C ORDER BY ID LIMIT 2 OFFSET 3 /*r 3 */(SELECT * FROM A UNION SELECT * FROM B) INTERSECT SELECT * FROM C; /*r 1 2 3 4 5 */SELECT * FROM A UNION (SELECT * FROM B ORDER BY ID DESC LIMIT 10 OFFSET 0) UNION SELECT * FROM C ORDER BY ID; -- /*c3*/SELECT * FROM A UNION SELECT * FROM B /*c5*/SELECT * FROM B UNION SELECT * FROM C /*c2*/SELECT * FROM A EXCEPT SELECT * FROM C /*c2*/(SELECT * FROM A) EXCEPT SELECT * FROM C /*c2*/SELECT * FROM A EXCEPT (SELECT * FROM C) /*c1*/(SELECT * FROM A INTERSECT SELECT * FROM C) /*c2*/SELECT * FROM A INTERSECT (SELECT * FROM B) /*c0*/(SELECT * FROM B) INTERSECT SELECT * FROM C /*r 1 2 3 */SELECT * FROM A UNION SELECT * FROM C INTERSECT SELECT * FROM B /*r 1 2 */(SELECT * FROM A UNION SELECT * FROM C) INTERSECT SELECT * FROM B /*r */SELECT * FROM A EXCEPT SELECT * FROM C EXCEPT SELECT * FROM B /*r 3 */SELECT * FROM A UNION SELECT * FROM C INTERSECT SELECT * FROM B EXCEPT SELECT * FROM B /*r 1 2 3 */SELECT * FROM A UNION SELECT * FROM C INTERSECT (SELECT * FROM B EXCEPT SELECT * FROM B) CREATE VIEW V1 AS (SELECT * FROM A UNION SELECT * FROM C) INTERSECT SELECT * FROM B /*r 1 2 */SELECT * FROM V1 CREATE VIEW V3 AS SELECT * FROM A UNION SELECT * FROM C INTERSECT (SELECT * FROM B EXCEPT SELECT * FROM B) /*r 1 2 3 */SELECT * FROM V3; /*c3*/SELECT * FROM A WHERE ID IN (SELECT * FROM A UNION SELECT * FROM C INTERSECT (SELECT * FROM B EXCEPT SELECT * FROM B)) /*c3*/SELECT * FROM A WHERE EXISTS (SELECT * FROM A UNION SELECT * FROM C INTERSECT (SELECT * FROM B EXCEPT SELECT * FROM B)) /*c0*/SELECT * FROM A WHERE EXISTS (SELECT * FROM A EXCEPT SELECT * FROM C EXCEPT SELECT * FROM B) --- correlated union create table bt1 ( id varchar(10) ); create table bt2 ( id varchar(10) ); create table bt3 ( id varchar(10) ); insert into bt1( id ) values ( 'aaa' ); insert into bt1( id ) values ( 'bbb' ); insert into bt1( id ) values ( 'ccc' ); insert into bt2( id ) values ( 'aaa' ); insert into bt3( id ) values ( 'bbb' ); /*U*/ the t1.id reference in the next test is not resolved in some runs - only after code changes result in failure /*c1*/select * from bt1 as t1 where not exists( select id from bt2 as t2 where t2.id = t1.id union all select id from bt3 as t3 where t3.id = t1.id ); --- null as column in first select create table au (id int, b1 boolean); create table bu (id int); insert into au values(1,true); insert into bu values(2); select id, null as b1 from bu union select id, b1 from au; -- drop table test if exists; create table test(my_col numeric(10)); insert into test (my_col) values (100); select my_col, 0 mycol from test union select 0 mycol2, my_col from test hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestText01.txt0000644000175000017500000000275512007547346021573 0ustar renerene-- all_quoted drop table tmain if exists; create table tmain(c1 varchar(10),i1 integer, c2 varchar(10)); insert into tmain values(null, null, null); insert into tmain values('aval1', null, 'aval2'); drop table t if exists; create text table t(c1 varchar(10),i1 integer, c2 varchar(10)); set table t source "t.txt; all_quoted=true;ignore_first=true"; set table t source header """charcol_1"",""intcol"",""charcol_2"""; insert into t select * from tmain; -- unquoted create table ttmain(doublequote char(10), singlequote char(10)); insert into ttmain values('noquoteA', 'noquoteB'); insert into ttmain values('"inch','''foot'); insert into ttmain values('_""_','_''''_' ); insert into ttmain values('"quoted"','''quoted'''); insert into ttmain values('inch"','foot'''); insert into ttmain values('"inch"','''foot'''); create text table tt(doubquote char(10), singquote char(10)); set table tt source "tt.txt;quoted=false;fs=\t;ignore_first=true"; set table tt source header "DOUBQUOTE,SINGQUOTE"; insert into tt select * from ttmain; -- identity test drop table tident if exists; create text table tident(c1 int generated by default as identity, c2 varchar(20)); set table tident source "tident.txt; all_quoted=true;ignore_first=true"; set table tident source header """IDENT"",""VAL"""; -- single column test drop table tsingle if exists; create text table tsingle(c1 int); set table tsingle source "tsingle.txt;ignore_first=true"; set table tsingle source header 'full history'; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfColGrant.txt0000644000175000017500000000452712007547346023030 0ustar renerene-- $Id: TestSelfColGrant.txt 3459 2010-02-12 19:46:33Z fredt $ -- Tests column-specific grants -- These two users are for sanity tests /*u0*/CREATE USER privd PASSWORD "privd"; /*u0*/CREATE USER unprivd PASSWORD "unprivd"; /*u0*/CREATE USER u1 PASSWORD "u1"; /*u0*/GRANT CHANGE_AUTHORIZATION TO u1; /*u0*/GRANT CHANGE_AUTHORIZATION TO privd; /*u0*/GRANT CHANGE_AUTHORIZATION TO unprivd; /*u0*/CREATE TABLE multicol (openc int, closedc int, limitedc int); /*u1*/INSERT INTO multicol values (1, 2, 3); /*c1*/SELECT * from multicol; /*u0*/GRANT ALL ON multicol TO privd; /*u0*/GRANT SELECT(limitedc) ON multicol TO u1; /*u0*/GRANT SELECT(openc) ON multicol TO public; /*u0*/GRANT INSERT(openc) ON multicol TO public; /*u0*/GRANT UPDATE(openc) ON multicol TO public; -- Test col-specific SELECTs /*u0*/CONNECT USER u1 PASSWORD "u1"; /*c1*/SELECT openc from multicol; /*c1*/SELECT limitedc from multicol; /*e*/SELECT closedc from multicol; /*e*/UPDATE multicol set limitedc = 4 where openc = 1; /*u0*/CONNECT USER privd PASSWORD "privd"; /*c1*/SELECT openc from multicol; /*c1*/SELECT limitedc from multicol; /*c1*/SELECT closedc from multicol; /*u1*/UPDATE multicol set limitedc = 5 where openc = 1; /*u0*/CONNECT USER unprivd PASSWORD "unprivd"; /*e*/SELECT limitedc from multicol; /*e*/SELECT closedc from multicol; /*e*/UPDATE multicol set limitedc = 6 where openc = 1; -- Test col-specific UPDATEs /*u0*/CONNECT USER u1 PASSWORD "u1"; /*c1*/SELECT openc from multicol; /*e*/UPDATE multicol set limitedc = 7 where openc = 1; /*u0*/CONNECT USER SA PASSWORD ""; /*u0*/GRANT update(limitedc) ON multicol TO u1; /*u0*/CONNECT USER u1 PASSWORD "u1"; /*u1*/UPDATE multicol set limitedc = 7 where openc = 1; -- Test col-specific INSERTs /*u0*/CONNECT USER u1 PASSWORD "u1"; /*e*/INSERT INTO multicol(limitedc) values(10); /*u0*/CONNECT USER SA PASSWORD ""; /*u0*/GRANT insert(limitedc) ON multicol TO u1; /*u0*/CONNECT USER privd PASSWORD "privd"; /*u1*/INSERT INTO multicol(limitedc) values(11); /*u0*/CONNECT USER unprivd PASSWORD "unprivd"; /*e*/INSERT INTO multicol(limitedc) values(12); /*u0*/CONNECT USER u1 PASSWORD "u1"; /*u1*/INSERT INTO multicol(limitedc) values(13); /*u0*/CONNECT USER SA PASSWORD ""; /*u0*/DROP USER u1; /*u0*/DROP USER privd; /*u0*/DROP USER unprivd; /*u0*/DROP TABLE multicol; /*u0*/CHECKPOINT; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfFunction.txt0000644000175000017500000000340012007547346023071 0ustar renerene-- AUXILIAR TABLES + DECLARES DROP TABLE tt1 IF EXISTS; DROP TABLE tt2 IF EXISTS; CREATE Cached TABLE tt1( ID INTEGER NOT NULL PRIMARY KEY, tt2ref INTEGER ); CREATE Cached TABLE tt2( ID INTEGER NOT NULL PRIMARY KEY ); ALTER TABLE tt1 ADD CONSTRAINT fk2 FOREIGN KEY (tt2ref) REFERENCES tt2(ID); -- CREATE SIMPLE FUNCTIONS - INVALID -- Exception no returns /*e*/CREATE FUNCTION function_test() -- Exception no body /*e*/CREATE FUNCTION function_test() RETURNS INTEGER BEGIN ATOMIC END /*e*/call function_test() /*e*/DROP FUNCTION function_test -- Exception - invalid in parameter /*e*/CREATE FUNCTION function_test(IN value INTEGER) RETURNS INTEGER RETURNS 10 -- Exception - not supported OUT parameter /*e*/CREATE FUNCTION function_test(OUT val INTEGER) RETURNS INTEGER RETURNS 10 -- CREATE SIMPLE FUNCTIONS -- No body CREATE FUNCTION function_test() RETURNS INTEGER RETURN 10; /*r10*/call function_test() DROP FUNCTION function_test -- Simple function - IN parameter CREATE FUNCTION function_test(IN val INTEGER) RETURNS INTEGER RETURN val + 10; /*r20*/call function_test(10) DROP FUNCTION function_test -- Simple select CREATE FUNCTION function_test() RETURNS INTEGER READS SQL DATA RETURN (SELECT id FROM tt2) INSERT INTO tt2(ID) VALUES(1); /*r1*/call function_test() DROP FUNCTION function_test CREATE FUNCTION test( in x INT) returns table(i INT, v VARCHAR(100)) READS SQL DATA begin atomic declare y int; set y= x; return TABLE(select id, firstname from customer where id > y); end call test(10) /*c50*/select * from table(test(-1)) create table testtt(i INT, v VARCHAR(100)) insert into testtt select * from table(test(-1)) /*c50*/select * from testtt hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfJoins.txt0000644000175000017500000000325712007547346022400 0ustar renerene-- -- TestSelfJoins.txt -- create table tsj1 (a integer primary key, b integer); insert into tsj1 values(5,5); insert into tsj1 values(6,6); insert into tsj1 values(11,21); insert into tsj1 values(12,22); insert into tsj1 values(13,23); insert into tsj1 values(14,24); insert into tsj1 values(15,25); insert into tsj1 values(16,26); insert into tsj1 values(17,27); /*r3*/select count(*) from tsj1 where a > 14 /*r5*/select count(*) from tsj1 where cast(a as character(2)) > '14' /*r81*/select count(*) from tsj1 a cross join tsj1 b /*e*/select count(*) from tsj1 a cross join tsj1 b on a.a = b.a /*r9*/select count(*) from tsj1 a inner join tsj1 b on a.a = b.a drop table table1 if exists create table table1(column1 int not null, column2 varchar(255) not null, primary key(column1)) insert into table1(column1,column2) values(100,'string1') insert into table1(column1,column2) values(200,'string2') insert into table1(column1,column2) values(300,'string3') /*r3*/select count(1) rows from table1 /*r0*/select count(1) rows from table1 where column1<300 and column1>=200 and column1<1 /*r0*/select count(1) rows from table1 where column1<1 and column1<300 and column1>=200 drop table t1 if exists; drop table t2 if exists; drop table t3 if exists; create table t1(id int primary key, c varchar(20)); create table t2(id int primary key, rid int, c varchar(20)); create table t3(id int primary key, rid int, c varchar(20)); insert into t1 values(1, 'one'), (2, 'two'), (10, 'ten'), (11, 'eleven'); insert into t2 values(1, 1, 'one'), (2, 2, 'two'), (3, 10, 'ten'), (4, 11, 'eleven'); insert into t3 values(1, 1, 'one'), (2, 2, 'two'), (3, 10, 'ten'), (4, 11, 'eleven'); hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfPersSchemC.txt0000644000175000017500000002001512007547344023277 0ustar renerene-- Test persistence via .script file /*u0*/create table bschema.b5(i int); /*c0*/select * from bschema.b5; /*u0*/connect user blaine password "blaine"; /*c0*/select * from bschema.b5; /*u1*/insert into bschema.b5 values(3); /*c1*/select * from bschema.b5; /*c2*/select * from bschema.b1; /*u1*/insert into bschema.b1 values(3); /*c3*/select * from bschema.b1; /*e*/select * from dschema.d1; /*u0*/connect user sa password ""; /*u0*/create table dschema.d5(i int); /*u1*/insert into dschema.d1 values(56); /*u1*/insert into dschema.d5 values(5); /*u0*/commit; /*u0*/connect user debbie password debbie; /*e*/select * from bschema.b1; /*e*/create table bschema.b3(i int); /*u0*/create table dschema.d6 (i int); /*u0*/set schema dschema; /*c2*/select * from d1; /*c0*/select * from d2; /*c1*/select * from d5; /*c0*/select * from d6; -- Test of same-named-objects in different schemas. As an Admin. -- Verify that same-named-objects does not make system tables choke /*u0*/SET SCHEMA information_schema; SELECT * FROM authorizations; SELECT * FROM constraint_column_usage; SELECT * FROM system_columns; SELECT * FROM system_schemas; SELECT * FROM schemata; SELECT * FROM sequences; SELECT * FROM system_sessioninfo; SELECT * FROM system_sessions; SELECT * FROM table_privileges; SELECT * FROM system_tables; SELECT * FROM usage_privileges; SELECT * FROM system_users; /*u0*/connect user sa password ""; /*r1,11*/SELECT i, NEXT VALUE FOR bschema.samesname FROM bschema.sametname; /*r2,21*/SELECT i, NEXT VALUE FOR dschema.samesname FROM dschema.sametname; /*r1*/SELECT i FROM bschema.samevname; /*r2*/SELECT i FROM dschema.samevname; -- Cleanup to prepare for next set of tests /*u0*/connect user sa password ""; /*u0*/drop schema bschema cascade; /*u0*/drop schema dschema cascade; /*u0*/drop user blaine; /*u0*/drop user debbie; -- Schema authorization using a Role. -- Test that non-DBA schema owners can CREATE/SELECT/INSERT objects in their -- own schema but not in somebody else's schema (assuming explicit object -- rights have not been granted, of course). /*u0*/connect user sa password ""; /*u0*/create user blaine password blaine; /*u0*/create user debbie password debbie; /*u0*/GRANT CHANGE_AUTHORIZATION TO blaine; /*u0*/GRANT CHANGE_AUTHORIZATION TO debbie; /*u0*/create role r; /*u0*/create role s; /*u0*/grant s to r; /*u0*/create schema aschema authorization s; /*u0*/create schema bschema authorization s; /*u0*/create table aschema.a1(i int); /*u1*/insert into aschema.a1 values(11); /*u0*/create table bschema.b1(i int); /*u1*/insert into bschema.b1 values (22); /*u0*/commit; -- Test blaine, who will get his authorization via role s via role r. /*u0*/connect user blaine password blaine; /*u0*/set schema aschema; /*e*/create table a2(i int); /*u0*/set schema bschema; /*e*/create table b2(i int); /*e*/select * from aschema.a1; /*e*/select * from bschema.b1; /*u0*/connect user sa password ""; /*u0*/grant r to blaine; /*u0*/connect user blaine password blaine; /*u0*/set schema aschema; /*u0*/create table a2(i int); /*u0*/set schema bschema; /*u0*/create table b2(i int); /*c1*/select * from aschema.a1; /*c1*/select * from bschema.b1; /*c0*/select * from aschema.a2; /*c0*/select * from bschema.b2; -- Test debbie, who will get her authorization via role r directly. /*u0*/connect user debbie password debbie; /*u0*/set schema aschema; /*e*/create table a3(i int); /*u0*/set schema bschema; /*e*/create table b3(i int); /*e*/select * from aschema.a1; /*e*/select * from bschema.b1; /*u0*/connect user sa password ""; /*u0*/grant s to debbie; /*u0*/connect user debbie password debbie; /*u0*/set schema aschema; /*u0*/create table a3(i int); /*u0*/set schema bschema; /*u0*/create table b3(i int); /*c1*/select * from aschema.a1; /*c1*/select * from bschema.b1; /*c0*/select * from aschema.a2; /*c0*/select * from bschema.b2; /*c0*/select * from aschema.a3; /*c0*/select * from bschema.b3; -- Test of same-named-objects in different schemas. As an Admin. /*u0*/connect user sa password ""; /*u0*/CREATE TABLE bschema.sametname(i int); /*u0*/CREATE TABLE aschema.sametname(i int); /*u0*/CREATE VIEW bschema.samevname AS SELECT * FROM bschema.sametname; /*u0*/CREATE VIEW aschema.samevname AS SELECT * FROM aschema.sametname; /*u0*/CREATE SEQUENCE bschema.samesname START WITH 10; /*u0*/CREATE SEQUENCE aschema.samesname START WITH 20; /*u1*/INSERT INTO bschema.sametname(i) VALUES(1); /*u1*/INSERT INTO aschema.sametname(i) VALUES(2); /*r1,10*/SELECT i, NEXT VALUE FOR bschema.samesname FROM bschema.sametname; /*r2,20*/SELECT i, NEXT VALUE FOR aschema.samesname FROM aschema.sametname; /*r1*/SELECT i FROM bschema.samevname; /*r2*/SELECT i FROM aschema.samevname; /*u0*/connect user sa password ""; /*u0*/create table public.ptable(i int); /*u1*/insert into public.ptable values(9); /*u0*/CREATE INDEX public.pindex ON public.ptable(i); /*u0*/CREATE SEQUENCE public.psequence; -- Basic user schema permission capability has been tested well above -- Now LIGHTER TESTING FOR REMAINING COMMANDS AND SCHEMA OBJECT TYPES: -- (for authorizations via roles). -- (purpose to see if the non-Admin, non-right-granted user may do these -- things on his objects, but not to other objects). -- Commands to test: ALTER, DELETE, DROP, GRANT, REVOKE, UPDATE -- Object types to test: INDEX, SEQUENCE, VIEW /*u0*/connect user blaine password blaine; /*u0*/CREATE TABLE bschema.extra(i1 int); /*u0*/CREATE TABLE bschema.todrop(i1 int); /*u1*/insert into bschema.extra values(8); -- First Commands on TABLEs /*e*/ALTER TABLE public.ptable ADD COLUMN i2 int; /*u0*/ALTER TABLE bschema.extra ADD COLUMN i2 int; /*c1*/SELECT * FROM bschema.extra; /*e*/UPDATE public.ptable SET i = 11; /*u1*/UPDATE bschema.extra SET i1 = 44; /*e*/DELETE FROM public.ptable; /*u1*/DELETE FROM bschema.extra; /*e*/GRANT SELECT ON public.ptable TO debbie; /*u0*/GRANT SELECT ON bschema.extra TO debbie; /*e*/REVOKE SELECT ON public.ptable FROM debbie RESTRICT; /*u0*/REVOKE SELECT ON bschema.extra FROM debbie RESTRICT; /*e*/DROP TABLE public.ptable; /*u0*/DROP TABLE bschema.todrop; -- Commands on INDEXes /*e*/CREATE INDEX public.i1 ON public.ptable(i); /*u0*/CREATE UNIQUE INDEX bschema.ui1 ON bschema.extra(i1); /*c1*/SELECT count(*) FROM bschema.extra; /*e*/ALTER INDEX public.pindex RENAME TO othername; /*u0*/ALTER INDEX bschema.ui1 RENAME TO othername; /*u1*/insert into bschema.extra(i1, i2) values(8,1); -- Following violates the UNIQUE index /*e*/insert into bschema.extra(i1, i2) values(8,2); /*e*/DROP INDEX public.pindex; /*u0*/DROP index bschema.othername; -- Commands on SEQUENCEs /*e*/CREATE SEQUENCE public.pseq; /*u0*/CREATE SEQUENCE bschema.bseq; /*e*/SELECT next value for public.psequence FROM bschema.extra; /*c1*/SELECT next value for bschema.bseq FROM bschema.extra; /*e*/ALTER SEQUENCE public.psequence RESTART WITH 10; /*u0*/ALTER SEQUENCE bschema.bseq RESTART WITH 10; /*e*/GRANT USAGE ON SEQUENCE public.psequence TO debbie; /*u0*/GRANT USAGE ON SEQUENCE bschema.bseq TO debbie; /*e*/REVOKE USAGE ON SEQUENCE public.psequence FROM debbie RESTRICT; /*u0*/REVOKE USAGE ON SEQUENCE bschema.bseq FROM debbie RESTRICT; /*e*/DROP SEQUENCE public.psequence; /*u0*/DROP SEQUENCE bschema.bseq; -- Adding views now. Didn't want them to impact operations on underlying -- tables in tests above. /*u0*/connect user sa password ""; /*u0*/create VIEW public.pview AS SELECT * FROM public.ptable; /*u0*/connect user blaine password blaine; /*e*/create VIEW public.oview AS SELECT * FROM public.ptable; /*u0*/create VIEW bschema.bview AS SELECT * FROM bschema.extra; /*e*/SELECT * FROM public.pview; /*c1*/SELECT * FROM bschema.bview; /*e*/GRANT SELECT ON public.pview TO debbie; /*u0*/GRANT SELECT ON bschema.bview TO debbie; /*e*/REVOKE SELECT ON public.pview FROM debbie RESTRICT; /*u0*/REVOKE SELECT ON bschema.bview FROM debbie RESTRICT; /*e*/DROP VIEW public.pview; /*u0*/DROP VIEW bschema.bview; /*u0*/DROP TABLE bschema.extra; /*u0*/connect user sa password ""; /*u0*/shutdown; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfConversions.txt0000644000175000017500000000146112007547344023617 0ustar renereneDROP TABLE T1 IF EXISTS; CREATE TABLE T1(ID IDENTITY, DT DATE,TI TIME,TS TIMESTAMP); INSERT INTO T1 (ID, DT, TI, TS) VALUES (NULL, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP); SELECT DAYOFMONTH(DT) FROM T1; SELECT DAYOFMONTH(TS) FROM T1; DELETE FROM T1; INSERT INTO T1 (ID, DT, TI, TS) VALUES (NULL, DATE'2000-11-10', TIME'10:11:12',TIMESTAMP'2000-12-10 10:11:12'); /*r2000*/SELECT YEAR(TS) FROM T1; /*r12*/SELECT MONTH(TS) FROM T1; /*r10*/SELECT DAYOFMONTH(DT) FROM T1; /*r10*/SELECT DAYOFMONTH(TS) FROM T1; /*r10-01*/SELECT (DATE'2010-12-20' - DT) YEAR TO MONTH FROM T1; /*r121*/SELECT (DATE'2010-12-20' - DT) MONTH(4) FROM T1; /*r9-11*/SELECT (DATE'2010-10-20' - DT) YEAR TO MONTH FROM T1; /*r9-10*/SELECT (DATE'2010-10-20' - (MAX(DT) + INTERVAL '1' MONTH)) YEAR TO MONTH FROM T1; DROP TABLE T1 hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfTriggers.txt0000644000175000017500000000556612007547346023111 0ustar renerenedrop table testtrig if exists; drop table triglog if exists; create cached table testtrig(id integer, data varchar(20), updated date); create cached table triglog(id integer generated by default as identity, data varchar(20), op varchar(10)); create trigger trigone after insert on testtrig referencing new row as newrow for each row when (newrow.id >1) insert into triglog values (newrow.id, newrow.data, 'inserted') create trigger trigtwo before update on testtrig referencing old row as oldrow new row as newrow for each row when (oldrow.updated is null) set newrow.updated = date'2009-11-01' insert into testtrig values(1,'one', null); insert into testtrig values(2,'two', date'1999-11-01'); /*r2,two,inserted*/select * from triglog update testtrig set data = data || ' ' || data /*r 1,one one,2009-11-01 2,two two,1999-11-01 */select * from testtrig create trigger trigthree after delete on testtrig referencing old row as oldrow for each row insert into triglog values oldrow.id, oldrow.data, 'deleted' delete from testtrig /*c2*/select * from triglog where op = 'deleted' create procedure proc_trig(in in_arg_one varchar(10)) language sql parameter style sql deterministic modifies sql data label_one: begin atomic insert into triglog values default, in_arg_one, null; end label_one; create cached table testtrig2(id integer, data varchar(20), updated date); create trigger trigfour after insert on testtrig2 referencing new row as newrow for each row call proc_trig(newrow.data) insert into testtrig2 values 10, 'felix', current_date /*c1*/select * from triglog where data='felix' drop trigger trigone; drop trigger trigtwo; drop trigger trigthree; drop trigger trigfour; drop table testtrig; drop table testtrig2; create cached table testtrig(id integer, data varchar(20), updated date); create cached table testtrig2(id integer, data varchar(20), updated date); CREATE PROCEDURE test_proc_three(pCount INT) NO SQL LANGUAGE JAVA EXTERNAL NAME 'CLASSPATH:org.hsqldb.test.TestStoredProcedure.procTest3' CREATE TRIGGER trigfive AFTER INSERT ON testtrig referencing NEW ROW AS newrow FOR EACH ROW WHEN (newrow.data IS NOT NULL) BEGIN ATOMIC DECLARE cwExists int DEFAULT 0; SET cwExists = 0; select count(*) into cwExists from testtrig2 where data = 'action1'; call test_proc_three(cwExists); insert into testtrig2 values cwExists, newrow.data, current_date; END delete from testtrig; create view vtrig as select id, data, updated, 'fixed string' fixed from testtrig; create trigger triginstead instead of insert on vtrig referencing new row as newrow for each row insert into testtrig values newrow.id, newrow.data || ' added', newrow.updated - 1 day insert into vtrig values 10, 'string', current_date, null /*c1*/select * from vtrig where data = 'string added'; /*c1*/select * from testtrig; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelf3PartNames.txt0000644000175000017500000000433312007547346023267 0ustar renerene-- $Id: TestSelf3PartNames.txt 610 2008-12-22 15:54:18Z unsaved $ -- Test 3-part names like: schemaname.tablename.columname --SET PROPERTY "hsqldb.default_table_type" 'cached' -- Setup CREATE USER blaine PASSWORD "blaine"; GRANT dba TO blaine; CREATE SCHEMA b1 AUTHORIZATION blaine; SET SCHEMA b1; CREATE TABLE t(i int); /*u1*/INSERT INTO t VALUES(1); /*c1*/SELECT t.i FROM t; /*c1*/SELECT b1.t.i FROM t; /*c1*/SELECT b1.t.i FROM b1.t; /*e*/SELECT t.NOSUCH.i FROM t; /*c1*/SELECT i FROM t WHERE t.i > 0; /*c1*/SELECT i FROM t WHERE b1.t.i > 0; /*e*/SELECT i FROM NOSUCH.t WHERE b1.t.i > 0; /*e*/SELECT i FROM t WHERE NOSUCH.t.i > 0; /*e*/SELECT i FROM t WHERE t.NOSUCH.i > 0; SET SCHEMA public; /*c1*/SELECT b1.t.i FROM b1.t; /*e*/SELECT t.NOSUCH.i FROM b1.t; /*c1*/SELECT i FROM b1.t WHERE b1.t.i > 0; /*e*/SELECT i FROM t WHERE b1.NOSUCH.i > 0; -- Cleanup DROP SCHEMA b1 CASCADE; DROP USER blaine; -- Now build up to Joins with 3-part names -- Setup create schema s1 authorization dba; create schema s2 authorization dba; create table s1.t(i int, j1 int); insert into s1.t values(11, 4); create table s2.t(i int, j2 int); insert into s2.t values(22, 4); -- sanity checks /*r11,4*/SELECT * FROM s1.t; /*r22,4*/SELECT * FROM s2.t; -- cross-schema 2-part name Join /*r4*/SELECT j1 FROM s1.t, s2.t WHERE j1 = j2; -- cross-schema 3-part name Join /*r22,4,11*/SELECT s2.t.i, j1, s1.t.i FROM s1.t, s2.t WHERE j1 = j2; /*r22,4,11*/SELECT s2.t.i, j1, s1.t.i FROM s1.t, s2.t WHERE s1.t.j1 = s2.t.j2; /*e*/SELECT s2.t.i, j1, s1.t.i FROM s1.t, s2.t WHERE s2.t.j1 = s2.t.j2; /*e*/SELECT s2.t.i, j1, s1.t.i FROM s1.t, s2.t WHERE s1.t.j1 = s1.t.j2; -- schema qualifier in view defintion CREATE VIEW s2.v2 AS SELECT * FROM s2.t; -- 3-part Names w/ views /*r22,4,11*/SELECT s2.v2.i, j1, s1.t.i FROM s1.t, s2.v2 WHERE j1 = j2; /*r22,4,11*/SELECT s2.v2.i, j1, s1.t.i FROM s1.t, s2.v2 WHERE s1.t.j1 = s2.v2.j2; -- 3-part name w/ * /*r22,4*/SELECT s2.t.* FROM s2.t; SET SCHEMA s2; /*r22,4*/SELECT s2.t.* FROM t; -- Illegal use of 3-part names /*e*/SELECT * from bad.s1.t; /*e*/SELECT * from s1.t.bad; /*e*/SELECT * from s1.bad.t; SET SCHEMA public; -- Cleanup DROP SCHEMA s1 CASCADE; DROP SCHEMA s2 CASCADE; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfCheckConstraints.txt0000644000175000017500000000545512007547346024565 0ustar renereneDROP TABLE "Tab" IF EXISTS; DROP TABLE TC0 IF EXISTS; DROP TABLE TC1 IF EXISTS; DROP TABLE TC2 IF EXISTS; DROP TABLE TC3 IF EXISTS; DROP TABLE TC4 IF EXISTS; DROP TABLE TC5 IF EXISTS; CREATE TABLE "TAB"("a" INT, "b" INT, "c" INT, CONSTRAINT CC CHECK("a" > "b" AND "b">"c")); /*e*/INSERT INTO TAB VALUES(null,2,3); INSERT INTO TAB VALUES(2,1,null); INSERT INTO TAB VALUES(NULL,2,NULL); INSERT INTO TAB VALUES(NULL,NULL,NULL); /*e*/ALTER TABLE TAB DROP COLUMN "b"; ALTER TABLE TAB DROP CONSTRAINT CC; ALTER TABLE TAB ADD CONSTRAINT CC CHECK ("b" > 0); ALTER TABLE TAB DROP COLUMN "b" -- CREATE TABLE TC0(A INT, B INT, C INT, CHECK(A > B AND B>C)); CREATE TABLE TC1(A CHAR(10), B CHAR(10), C CHAR(10), CHECK(TRIM(BOTH '*' FROM A) > TRIM(LEADING FROM B))); CREATE TABLE TC2(A CHAR(10), B CHAR(10), C CHAR(10), CHECK(TRIM(TRAILING '*' FROM A) > UPPER(B))); CREATE TABLE TC3(A CHAR(10), B CHAR(10), C CHAR(10), CHECK(A LIKE B ESCAPE ';' AND B LIKE 'test%')); CREATE TABLE TC4(A CHAR(10), B CHAR(10), C CHAR(10), D INT, CHECK(SUBSTRING(A FROM D FOR 3) LIKE C ESCAPE ';')); CREATE TABLE TC5(A CHAR(10), B CHAR(10), C CHAR(10), D INT, CHECK(A IN (B,C, 'Sunday', 'Monday'))); INSERT INTO TC5(A,C) VALUES ('Sunday', null); INSERT INTO TC5(A,C) VALUES ('Today', 'Today'); INSERT INTO TC5(A,C) VALUES ('Tomorrow', 'Tomorrow'); /*e*/INSERT INTO TC5(A,C) VALUES ('Yesterday', 'Tomorrow'); INSERT INTO TC5(A,C) VALUES (null, null); /*c4*/SELECT * FROM TC5; ALTER TABLE TC5 DROP COLUMN D /*c4*/SELECT * FROM TC5; INSERT INTO TC5(A) VALUES ('Monday'); UPDATE TC5 SET A='Monday' WHERE B IS NULL; /*e*/INSERT INTO TC5(A,C) VALUES ('Yesterday', 'Tomorrow'); /*e*/CREATE TABLE TC6(A CHAR, B CHAR, C CHAR, D INT, CHECK(A IN (SELECT A FROM TC5))); CREATE TABLE TC6(A INT, CHECK(A IS NULL OR A > 1)); INSERT INTO TC6(A) VALUES (2); INSERT INTO TC6(A) VALUES (null); /*e*/INSERT INTO TC6(A) VALUES (0); CREATE TABLE TC7(A INT, B TIMESTAMP, CONSTRAINT CH1 CHECK(B < CURRENT_TIMESTAMP)); INSERT INTO TC7 VALUES (10, '2009-01-01 12:00:00'); /*e*/INSERT INTO TC7 VALUES (10, '2044-01-01 12:00:00'); INSERT INTO TC7 VALUES (11, NULL); SCRIPT -- some type conversion tests ALTER TABLE TC7 ALTER COLUMN A DECIMAL(6,2); /*e*/ALTER TABLE TC7 ALTER COLUMN B DATE; /*r 10.00,2009-01-01 12:00:00.000000 11.00,NULL */SELECT * FROM TC7 ORDER BY A; ALTER TABLE TC7 DROP CONSTRAINT CH1; ALTER TABLE TC7 ALTER COLUMN B DATE; /*r 10.00,2009-01-01 11.00,NULL */SELECT * FROM TC7 ORDER BY A; CREATE TABLE TST(A VARCHAR(10),B VARCHAR(10),C VARCHAR(10)) INSERT INTO TST VALUES ('A','B','C'); INSERT INTO TST VALUES (NULL,NULL,NULL); ALTER TABLE TST ADD CONSTRAINT K1 CHECK (CASE WHEN (A IS NULL) THEN ((B IS NULL) AND (C IS NULL)) ELSE TRUE END ) /*e*/INSERT INTO TST VALUES (NULL,'B','C'); INSERT INTO TST VALUES (NULL,NULL,NULL); hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfInsteadOfTriggers.txt0000644000175000017500000000505012007547346024672 0ustar renerenedrop table testtrig12 if exists; drop table testtrig13 if exists; create cached table testtrig12(id integer, data2 varchar(20), updated date); create cached table testtrig13(id integer, data3 varchar(20), op varchar(10)); create view viewinst (vid, vdata2, vdata3) as select id, data2, data3 from testtrig12 natural join testtrig13 create trigger trigger2 instead of insert on viewinst referencing new row as newrow for each row begin atomic insert into testtrig12 values(newrow.vid, newrow.vdata2, current_date); insert into testtrig13 values (newrow.vid, newrow.vdata3, 'inserted'); end create trigger trigger3 instead of delete on viewinst referencing old row as oldrow for each row begin atomic delete from testtrig12 where testtrig12.id = oldrow.vid; delete from testtrig13 where testtrig13.id = oldrow.vid; end create trigger trigger14 instead of update on viewinst referencing old row as oldrow new row as newrow for each row begin atomic update testtrig12 set data2 = newrow.vdata2, updated = current_date where testtrig12.id = oldrow.vid; update testtrig13 set data3 = newrow.vdata3, op = 'updated' where testtrig13.id = oldrow.vid; end insert into viewinst values (1, 'data2 value1', 'data3 value1') insert into viewinst values (2, 'data2 value2', 'data3 value2') /*r 1,data2 value1,data3 value1,inserted 2,data2 value2,data3 value2,inserted */select id, data2, data3, op from testtrig12 natural join testtrig13 order by id /*r 1,data3 value1,inserted 2,data3 value2,inserted */select * from testtrig13 order by id update viewinst set vdata2='data2 updated1', vdata3='data3 updated1' where vid=1 /*r 1,data2 updated1,data3 updated1,updated 2,data2 value2,data3 value2,inserted */select id, data2, data3, op from testtrig12 natural join testtrig13 order by id delete from viewinst /*c0*/select * from viewinst /*c0*/select * from testtrig12 /*c0*/select * from testtrig13 drop view V_TAB1 if exists; drop table TAB1 if exists; create table TAB1 (T1_ID bigint primary key, T1_NAME VARCHAR(10)); create view V_TAB1 as select T.T1_ID as ID, T.T1_NAME as NAME from TAB1 T; create trigger TR_INS_V_T1 INSTEAD OF INSERT ON V_TAB1 referencing new row as NEWROW for each row insert into TAB1 (T1_ID, T1_NAME) values (NEWROW.ID, NEWROW.NAME); create trigger TR_UPD_V_T1 INSTEAD OF UPDATE ON V_TAB1 referencing new row as NEWROW for each row update TAB1 set T1_NAME = NEWROW.NAME where T1_ID = newrow.ID; insert into V_TAB1 (ID, NAME) values (1, 'Name 1'); update V_TAB1 set NAME = 'Name 11' where ID = 1; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfModify.txt0000644000175000017500000000452612007547344022543 0ustar renerene-- -- TestSelfModify.txt -- -- TestSelfModify.txt is used by TestSelf.java to test the database -- -- This is the second part of a three part suite of scripts to test persistence in the same DB -- -- Comment lines must start with -- and are ignored -- Lines starting with spaces belongs to last line -- Checked lines start with comments containing where is: -- c ResultSet expects a with columns -- r ResultSet expected with result in first row/column -- u Update count expected -- e Exception must occur -- --bug #824031 continued --scripting test for order of indexes /*c1*/SELECT * FROM APP WHERE APP_NAME = 'Eran'; /*c1*/SELECT * FROM APP WHERE APP_NAME = 'Shelly'; /*c2*/SELECT * FROM APP; -- -- TEST 1 -- Correct handling of index creation for foreign keys -- insert some values /*u1*/insert into verein values ('abcdefg'); /*u1*/insert into verein values ('hijklmn'); /*u1*/insert into verein values ('opqrstu'); /*u1*/insert into verein values ('vwxyz'); /*u1*/insert into bewerb values ('abcdefg',1); /*e*/insert into bewerb values ('abcdefg',2); /*u1*/insert into bewerb values ('hijklmn',5); /*e*/insert into bewerb values ('hijklmn',6); /*u1*/insert into bewerb values ('opqrstu',8); /*e*/insert into bewerb values ('opqrstu',9); /*u1*/insert into bewerb values ('vwxyz',10); --CHECKPOINT DEFRAG --test identity increment INSERT INTO APP2 (VALUE) VALUES(11); INSERT INTO APP2 (VALUE) VALUES(12); /*r3,12*/ SELECT COUNT(ID), MAX(VALUE) FROM APP2 /*r3,10*/ SELECT COUNT(ID), MIN(VALUE) FROM APP2 --test result of update before previous shutdown /*r 14,newdir,NULL,NULL,NULL */select * from file; --test insert into table CREATE TABLE NEWAPP AS (SELECT * FROM APP) WITH DATA; /*c1*/SELECT * FROM NEWAPP WHERE APP_NAME = 'Eran'; /*c1*/SELECT * FROM NEWAPP WHERE APP_NAME = 'Shelly'; /*c2*/SELECT * FROM NEWAPP; INSERT INTO NEWAPP (SELECT * FROM APP) /*c2*/SELECT * FROM NEWAPP WHERE APP_NAME = 'Eran'; /*c2*/SELECT * FROM NEWAPP WHERE APP_NAME = 'Shelly'; /*c4*/SELECT * FROM NEWAPP; --test separate identity and primary key /*e*/insert into tident values (10, default); /*r 10,0 11,1 12,2 */select * from tident insert into tident values (9, default); -- SHUTDOWN is necessary for test1 /*u0*/SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSchemaPersistB2.txt0000644000175000017500000007120312007547346024250 0ustar renerene-- TEST OBJECTS -- This TESTS the schema-specific objects created in a previous script. -- (See the *C[12].txt scripts for similar tests of ALTER comands (which -- this script purposefully omits). /*u0*/SET SCHEMA blaine; CREATE USER otheruser PASSWORD otheruser; -- ****************************** MEM Tables /*c2*/SELECT * FROM xtblt1; /*c1*/SELECT * FROM xtblt1 WHERE i = 0; /*c2*/SELECT * FROM xtblt1 WHERE i in (0, 1, 11, 12); /*c1*/SELECT * FROM xtblt1 WHERE i < 1; /*c1*/SELECT * FROM xtblt1 WHERE xtblt1.i = (SELECT i FROM blaine.xtblj1); /*c1*/SELECT * FROM xtblt1 WHERE xtblt1.i = (SELECT i FROM xtblj1 WHERE xtblj1.i = 1); /*c1*/SELECT * FROM xtblt1 WHERE xtblt1.i in (SELECT i FROM xtblj1); /*c0*/SELECT * FROM xtblt1 WHERE xtblt1.i = (SELECT i FROM xtblj1 WHERE i = 0); /*c1*/SELECT * FROM blaine.xtblt1 WHERE xtblt1.i = (SELECT i FROM xtblj1); /*c1*/SELECT * FROM blaine.xtblt1 WHERE xtblt1.i in (SELECT i FROM xtblj1); /*c1*/SELECT * FROM blaine.xtblt1 WHERE xtblt1.i = (SELECT i FROM xtblj1 WHERE i = 1); /*c1*/SELECT * FROM xtblt1 WHERE xtblt1.i = (SELECT i FROM blaine.xtblj1); /*c1*/SELECT * FROM xtblt1 WHERE xtblt1.i in (SELECT i FROM blaine.xtblj1); /*c1*/SELECT * FROM xtblt1 WHERE xtblt1.i = (SELECT i FROM blaine.xtblj1 WHERE i = 1); /*c1*/SELECT * FROM xtblt1 WHERE xtblt1.i = (SELECT xtblj1.i FROM blaine.xtblj1); /*c1*/SELECT * FROM xtblt1 WHERE xtblt1.i in (SELECT xtblj1.i FROM xtblj1); /*c1*/SELECT * FROM xtblt1 WHERE xtblt1.i = (SELECT xtblj1.i FROM xtblj1 WHERE i = 1); /*c1*/SELECT * FROM xtblt1 WHERE xtblt1.i = (SELECT i FROM blaine.xtblj1 WHERE xtblj1.i = 1); /*c1*/SELECT * FROM xtblt1 WHERE xtblt1.i = (SELECT xtblj1.i FROM xtblj1 WHERE xtblj1.i = 1); /*c1*/SELECT * FROM xtblt1 WHERE i = (SELECT i FROM xtblj1); /*c1*/SELECT * FROM xtblt1 WHERE i in (SELECT i FROM xtblj1); /*c1*/SELECT * FROM xtblt1 WHERE i = (SELECT i FROM xtblj1 WHERE i = 1); /*c1*/SELECT * FROM blaine.xtblt1 WHERE i = (SELECT i FROM xtblj1); /*c1*/SELECT * FROM blaine.xtblt1 WHERE i in (SELECT i FROM xtblj1); /*c0*/SELECT * FROM blaine.xtblt1 WHERE i = (SELECT i FROM xtblj1 WHERE i = 0); /*c1*/SELECT * FROM xtblt1 WHERE i = (SELECT i FROM blaine.xtblj1); /*c1*/SELECT * FROM xtblt1 WHERE i in (SELECT i FROM blaine.xtblj1); /*c0*/SELECT * FROM xtblt1 WHERE i = (SELECT i FROM blaine.xtblj1 WHERE i = 0); /*c1*/SELECT * FROM xtblt1 WHERE i = (SELECT xtblj1.i FROM blaine.xtblj1); /*c1*/SELECT * FROM xtblt1 WHERE i in (SELECT xtblj1.i FROM xtblj1); /*c0*/SELECT * FROM xtblt1 WHERE i = (SELECT xtblj1.i FROM xtblj1 WHERE i = 0); /*c1*/SELECT * FROM xtblt1 WHERE i = (SELECT i FROM blaine.xtblj1 WHERE xtblj1.i = 1); /*c1*/SELECT * FROM xtblt1 WHERE i = (SELECT xtblj1.i FROM xtblj1 WHERE xtblj1.i = 1); /*e*/SELECT * FROM system_users WHERE user_name = 'SA'; /*e*/SELECT * FROM other.xtblt1; /*e*/SELECT * FROM other.system_users; /*e*/SELECT * FROM information_schema.xtblt1; SET SCHEMA public; /*e*/SELECT * FROM blaine.system_users; /*c2*/SELECT * FROM blaine.xtblt1; SET SCHEMA blaine; /*c1*/SELECT * FROM information_schema.system_users WHERE user_name = 'SA'; SET SCHEMA public; /*c1*/SELECT * FROM blaine.xtblt1 WHERE i = 0; SET SCHEMA blaine; /*e*/SELECT * FROM other.xtblt1 WHERE i = 0; /*e*/SELECT * FROM information_schema.xtblt1 WHERE i = 0; SET SCHEMA public; /*c1*/SELECT * FROM blaine.xtblt1, blaine.xtblj1 WHERE xtblt1.i = xtblj1.i; SET SCHEMA blaine; /*c1*/SELECT * FROM xtblt1, blaine.xtblj1 WHERE xtblt1.i = xtblj1.i; /*c1*/SELECT * FROM blaine.xtblt1, xtblj1 WHERE xtblt1.i = xtblj1.i; /*c1*/SELECT * FROM xtblt1, xtblj1 WHERE xtblt1.i = xtblj1.i; SET SCHEMA public; /*c1*/SELECT vc FROM blaine.xtblt1, blaine.xtblj1 WHERE xtblt1.i = xtblj1.i; SET SCHEMA blaine; /*c1*/SELECT vc FROM xtblt1, blaine.xtblj1 WHERE xtblt1.i = xtblj1.i; /*c1*/SELECT vc FROM blaine.xtblt1, xtblj1 WHERE xtblt1.i = xtblj1.i; /*c1*/SELECT vc FROM xtblt1, xtblj1 WHERE xtblt1.i = xtblj1.i; SET SCHEMA public; /*c1*/SELECT xtblj1.vc FROM blaine.xtblt1, blaine.xtblj1 WHERE xtblt1.i = xtblj1.i; SET SCHEMA blaine; /*c1*/SELECT xtblj1.vc FROM xtblt1, blaine.xtblj1 WHERE xtblt1.i = xtblj1.i; /*c1*/SELECT xtblj1.vc FROM blaine.xtblt1, xtblj1 WHERE xtblt1.i = xtblj1.i; /*c1*/SELECT xtblj1.vc FROM xtblt1, xtblj1 WHERE xtblt1.i = xtblj1.i; /*c1*/SELECT lbla.vc FROM xtblt1, xtblj1 lbla WHERE xtblt1.i = lbla.i; /*c1*/SELECT xtblj1.vc FROM xtblt1 lblb, xtblj1 WHERE lblb.i = xtblj1.i; /*c1*/SELECT lbla.vc FROM xtblt1 lblb, xtblj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM blaine.xtblt1, xtblj1 lbla WHERE xtblt1.i = lbla.i; /*c1*/SELECT xtblj1.vc FROM blaine.xtblt1 lblb, xtblj1 WHERE lblb.i = xtblj1.i; /*c1*/SELECT lbla.vc FROM blaine.xtblt1 lblb, xtblj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM xtblt1, blaine.xtblj1 lbla WHERE xtblt1.i = lbla.i; /*c1*/SELECT xtblj1.vc FROM xtblt1 lblb, blaine.xtblj1 WHERE lblb.i = xtblj1.i; /*c1*/SELECT lbla.vc FROM xtblt1 lblb, blaine.xtblj1 lbla WHERE lblb.i = lbla.i; /*u0*/SET TABLE xtblt1 READONLY true; /*e*/UPDATE xtblt1 set i = 11 WHERE i = 1; SET SCHEMA public; /*u0*/SET TABLE blaine.xtblt1 READONLY true; /*e*/SET TABLE information_schema.xtblt1 READONLY true; /*e*/SET TABLE other.xtblt1 READONLY true; SET SCHEMA blaine; /*u0*/SET TABLE xtblt1 READONLY false; SET SCHEMA public; /*u0*/SET TABLE blaine.xtblt1 READONLY false; SET SCHEMA blaine; /*c2*/SELECT i FROM xtblt1; -- N.b.: Do not commit DML changes so that this whole block may be repeated. COMMIT; SET AUTOCOMMIT false; /*u1*/UPDATE xtblt1 set i = 11 WHERE i = 1; /*u1*/UPDATE xtblt1 set xtblt1.i = 12 WHERE i = 11; /*u1*/UPDATE xtblt1 set xtblt1.i = 13 WHERE xtblt1.i = 12; SET SCHEMA public; /*u1*/UPDATE blaine.xtblt1 set i = 14 WHERE i = 13; /*u1*/UPDATE blaine.xtblt1 set xtblt1.i = 15 WHERE i = 14; /*u1*/UPDATE blaine.xtblt1 set xtblt1.i = 16 WHERE xtblt1.i = 15; SET SCHEMA blaine; /*e*/UPDATE other.xtblt1 set xtblt1.i = 17 WHERE xtblt1.i = 16; /*e*/UPDATE information_schema.xtblt1 set xtblt1.i = 17 WHERE xtblt1.i = 16; /*u1*/UPDATE xtblt1 ali set i = 17 WHERE i = 16; /*u1*/UPDATE xtblt1 ali set ali.i = 18 WHERE i = 17; /*u1*/UPDATE xtblt1 ali set ali.i = 19 WHERE ali.i = 18; /*u1*/UPDATE xtblt1 ali set i = 20 WHERE ali.i = 19; SET SCHEMA public; /*u1*/UPDATE blaine.xtblt1 ali set i = 21 WHERE i = 20; /*u1*/UPDATE blaine.xtblt1 ali set ali.i = 22 WHERE i = 21; /*u1*/UPDATE blaine.xtblt1 ali set ali.i = 23 WHERE ali.i = 22; /*u1*/UPDATE blaine.xtblt1 ali set i = 24 WHERE ali.i = 23; SET SCHEMA blaine; /*e*/UPDATE other.xtblt1 ali set i = 25 WHERE ali.i = 24; /*e*/UPDATE other.xtblt1 ali set i = 25 WHERE .i = 24; /*e*/UPDATE other.xtblt1 set i = 25 WHERE i = 24; /*e*/DELETE FROM other.xtblt1 ali WHERE ali.i = 24; /*e*/DELETE FROM other.xtblt1 ali; /*e*/DELETE FROM other.xtblt1 set WHERE i = 24; /*e*/DELETE FROM other.xtblt1 WHERE i = 24; /*e*/DELETE FROM system_information.xtblj1 WHERE xtblj1.i = 1; /*u1*/DELETE FROM xtblt1 WHERE i = 0; SET SCHEMA public; /*u1*/DELETE FROM blaine.xtblt1 WHERE i = 24; /*u1*/DELETE FROM blaine.xtblj1 WHERE xtblj1.i = 1; SET SCHEMA blaine; ROLLBACK; /*c2*/SELECT i FROM xtblt1; /*u0*/GRANT ALL ON xtblt1 TO otheruser; SET SCHEMA public; /*u0*/GRANT ALL ON blaine.xtblt2 TO otheruser; SET SCHEMA blaine; /*e*/GRANT ALL ON other.xtblt3 TO otheruser; /*e*/GRANT ALL ON information_schema.xtblt3 TO otheruser; /*u0*/REVOKE ALL ON xtblt1 FROM otheruser RESTRICT; SET SCHEMA public; /*u0*/REVOKE ALL ON blaine.xtblt2 FROM otheruser RESTRICT; SET SCHEMA blaine; /*e*/REVOKE ALL ON other.xtblt3 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON information_schema.xtblt3 FROM otheruser RESTRICT; /*e*/DROP TABLE other.xtblt3; /*e*/DROP TABLE information_schema.xtblt4; /*e*/DROP TABLE xtblt101; /*e*/DROP TABLE blaine.xtblt101; /*u0*/DROP TABLE xtblt101 IF EXISTS; SET SCHEMA public; /*u0*/DROP TABLE blaine.xtblt101 IF EXISTS; SET SCHEMA blaine; -- Should "DROP TABLE nonexistentschema.notable IF EXISTS" work? /*u0*/DROP TABLE other.system_users IF exists; /*u0*/DROP TABLE system_users IF exists; -- ****************************** CACH Tables /*c2*/SELECT * FROM xctblt1; /*c1*/SELECT * FROM xctblt1 WHERE i = 0; /*c2*/SELECT * FROM xctblt1 WHERE i in (0, 1, 11, 12); /*c1*/SELECT * FROM xctblt1 WHERE i < 1; /*c1*/SELECT * FROM xctblt1 WHERE xctblt1.i = (SELECT i FROM xtblj1); /*c1*/SELECT * FROM xctblt1 WHERE xctblt1.i = (SELECT i FROM xtblj1 WHERE xtblj1.i = 1); /*c1*/SELECT * FROM xctblt1 WHERE xctblt1.i in (SELECT i FROM xtblj1); /*c0*/SELECT * FROM xctblt1 WHERE xctblt1.i = (SELECT i FROM xtblj1 WHERE i = 0); /*c1*/SELECT * FROM blaine.xctblt1 WHERE xctblt1.i = (SELECT i FROM xtblj1); /*c1*/SELECT * FROM blaine.xctblt1 WHERE xctblt1.i in (SELECT i FROM xtblj1); /*c1*/SELECT * FROM blaine.xctblt1 WHERE xctblt1.i = (SELECT i FROM xtblj1 WHERE i = 1); /*c1*/SELECT * FROM xctblt1 WHERE xctblt1.i = (SELECT i FROM blaine.xtblj1); /*c1*/SELECT * FROM xctblt1 WHERE xctblt1.i in (SELECT i FROM blaine.xtblj1); /*c1*/SELECT * FROM xctblt1 WHERE xctblt1.i = (SELECT i FROM blaine.xtblj1 WHERE i = 1); /*c1*/SELECT * FROM xctblt1 WHERE xctblt1.i = (SELECT xtblj1.i FROM blaine.xtblj1); /*c1*/SELECT * FROM xctblt1 WHERE xctblt1.i in (SELECT xtblj1.i FROM xtblj1); /*c1*/SELECT * FROM xctblt1 WHERE xctblt1.i = (SELECT xtblj1.i FROM xtblj1 WHERE i = 1); /*c1*/SELECT * FROM xctblt1 WHERE xctblt1.i = (SELECT i FROM blaine.xtblj1 WHERE xtblj1.i = 1); /*c1*/SELECT * FROM xctblt1 WHERE xctblt1.i = (SELECT xtblj1.i FROM xtblj1 WHERE xtblj1.i = 1); /*c1*/SELECT * FROM xctblt1 WHERE i = (SELECT i FROM xtblj1); /*c1*/SELECT * FROM xctblt1 WHERE i in (SELECT i FROM xtblj1); /*c1*/SELECT * FROM xctblt1 WHERE i = (SELECT i FROM xtblj1 WHERE i = 1); /*c1*/SELECT * FROM blaine.xctblt1 WHERE i = (SELECT i FROM xtblj1); /*c1*/SELECT * FROM blaine.xctblt1 WHERE i in (SELECT i FROM xtblj1); /*c0*/SELECT * FROM blaine.xctblt1 WHERE i = (SELECT i FROM xtblj1 WHERE i = 0); /*c1*/SELECT * FROM xctblt1 WHERE i = (SELECT i FROM blaine.xtblj1); /*c1*/SELECT * FROM xctblt1 WHERE i in (SELECT i FROM blaine.xtblj1); /*c0*/SELECT * FROM xctblt1 WHERE i = (SELECT i FROM blaine.xtblj1 WHERE i = 0); /*c1*/SELECT * FROM xctblt1 WHERE i = (SELECT xtblj1.i FROM blaine.xtblj1); /*c1*/SELECT * FROM xctblt1 WHERE i in (SELECT xtblj1.i FROM xtblj1); /*c0*/SELECT * FROM xctblt1 WHERE i = (SELECT xtblj1.i FROM xtblj1 WHERE i = 0); /*c1*/SELECT * FROM xctblt1 WHERE i = (SELECT i FROM blaine.xtblj1 WHERE xtblj1.i = 1); /*c1*/SELECT * FROM xctblt1 WHERE i = (SELECT xtblj1.i FROM xtblj1 WHERE xtblj1.i = 1); /*e*/SELECT * FROM system_users WHERE user_name = 'SA'; /*e*/SELECT * FROM other.xctblt1; /*e*/SELECT * FROM other.system_users; /*e*/SELECT * FROM information_schema.xctblt1; /*e*/SELECT * FROM blaine.system_users; SET SCHEMA public; /*c2*/SELECT * FROM blaine.xctblt1; /*c1*/SELECT * FROM information_schema.system_users WHERE user_name = 'SA'; /*c1*/SELECT * FROM blaine.xctblt1 WHERE i = 0; /*e*/SELECT * FROM other.xctblt1 WHERE i = 0; /*e*/SELECT * FROM information_schema.xctblt1 WHERE i = 0; /*c1*/SELECT * FROM blaine.xctblt1, blaine.xtblj1 WHERE xctblt1.i = xtblj1.i; SET SCHEMA blaine; /*c1*/SELECT * FROM xctblt1, blaine.xtblj1 WHERE xctblt1.i = xtblj1.i; /*c1*/SELECT * FROM blaine.xctblt1, xtblj1 WHERE xctblt1.i = xtblj1.i; /*c1*/SELECT * FROM xctblt1, xtblj1 WHERE xctblt1.i = xtblj1.i; SET SCHEMA public; /*c1*/SELECT vc FROM blaine.xctblt1, blaine.xtblj1 WHERE xctblt1.i = xtblj1.i; SET SCHEMA blaine; /*c1*/SELECT vc FROM xctblt1, blaine.xtblj1 WHERE xctblt1.i = xtblj1.i; /*c1*/SELECT vc FROM blaine.xctblt1, xtblj1 WHERE xctblt1.i = xtblj1.i; /*c1*/SELECT vc FROM xctblt1, xtblj1 WHERE xctblt1.i = xtblj1.i; SET SCHEMA public; /*c1*/SELECT xtblj1.vc FROM blaine.xctblt1, blaine.xtblj1 WHERE xctblt1.i = xtblj1.i; SET SCHEMA blaine; /*c1*/SELECT xtblj1.vc FROM xctblt1, blaine.xtblj1 WHERE xctblt1.i = xtblj1.i; /*c1*/SELECT xtblj1.vc FROM blaine.xctblt1, xtblj1 WHERE xctblt1.i = xtblj1.i; /*c1*/SELECT xtblj1.vc FROM xctblt1, xtblj1 WHERE xctblt1.i = xtblj1.i; /*c1*/SELECT lbla.vc FROM xctblt1, xtblj1 lbla WHERE xctblt1.i = lbla.i; /*c1*/SELECT xtblj1.vc FROM xctblt1 lblb, xtblj1 WHERE lblb.i = xtblj1.i; /*c1*/SELECT lbla.vc FROM xctblt1 lblb, xtblj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM blaine.xctblt1, xtblj1 lbla WHERE xctblt1.i = lbla.i; /*c1*/SELECT xtblj1.vc FROM blaine.xctblt1 lblb, xtblj1 WHERE lblb.i = xtblj1.i; /*c1*/SELECT lbla.vc FROM blaine.xctblt1 lblb, xtblj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM xctblt1, blaine.xtblj1 lbla WHERE xctblt1.i = lbla.i; /*c1*/SELECT xtblj1.vc FROM xctblt1 lblb, blaine.xtblj1 WHERE lblb.i = xtblj1.i; /*c1*/SELECT lbla.vc FROM xctblt1 lblb, blaine.xtblj1 lbla WHERE lblb.i = lbla.i; /*u0*/SET TABLE xctblt1 READONLY true; /*e*/UPDATE xctblt1 set i = 11 WHERE i = 1; SET SCHEMA public; /*u0*/SET TABLE blaine.xctblt1 READONLY true; SET SCHEMA blaine; /*e*/SET TABLE information_schema.xctblt1 READONLY true; /*e*/SET TABLE other.xctblt1 READONLY true; /*u0*/SET TABLE xctblt1 READONLY false; SET SCHEMA public; /*u0*/SET TABLE blaine.xctblt1 READONLY false; SET SCHEMA blaine; /*c2*/SELECT i FROM xctblt1; -- N.b.: Do not commit DML changes so that this whole block may be repeated. COMMIT; SET AUTOCOMMIT false; /*u1*/UPDATE xctblt1 set i = 11 WHERE i = 1; /*u1*/UPDATE xctblt1 set xctblt1.i = 12 WHERE i = 11; /*u1*/UPDATE xctblt1 set xctblt1.i = 13 WHERE xctblt1.i = 12; SET SCHEMA public; /*u1*/UPDATE blaine.xctblt1 set i = 14 WHERE i = 13; /*u1*/UPDATE blaine.xctblt1 set xctblt1.i = 15 WHERE i = 14; /*u1*/UPDATE blaine.xctblt1 set xctblt1.i = 16 WHERE xctblt1.i = 15; SET SCHEMA blaine; /*e*/UPDATE other.xctblt1 set xctblt1.i = 17 WHERE xctblt1.i = 16; /*e*/UPDATE information_schema.xctblt1 set xctblt1.i = 17 WHERE xctblt1.i = 16; /*u1*/UPDATE xctblt1 ali set i = 17 WHERE i = 16; /*u1*/UPDATE xctblt1 ali set ali.i = 18 WHERE i = 17; /*u1*/UPDATE xctblt1 ali set ali.i = 19 WHERE ali.i = 18; /*u1*/UPDATE xctblt1 ali set i = 20 WHERE ali.i = 19; SET SCHEMA public; /*u1*/UPDATE blaine.xctblt1 ali set i = 21 WHERE i = 20; /*u1*/UPDATE blaine.xctblt1 ali set ali.i = 22 WHERE i = 21; /*u1*/UPDATE blaine.xctblt1 ali set ali.i = 23 WHERE ali.i = 22; /*u1*/UPDATE blaine.xctblt1 ali set i = 24 WHERE ali.i = 23; SET SCHEMA blaine; /*e*/UPDATE other.xctblt1 ali set i = 25 WHERE ali.i = 24; /*e*/UPDATE other.xctblt1 ali set i = 25 WHERE .i = 24; /*e*/UPDATE other.xctblt1 set i = 25 WHERE i = 24; /*e*/DELETE FROM other.xctblt1 ali WHERE ali.i = 24; /*e*/DELETE FROM other.xctblt1 ali; /*e*/DELETE FROM other.xctblt1 set WHERE i = 24; /*e*/DELETE FROM other.xctblt1 WHERE i = 24; /*e*/DELETE FROM system_information.xtblj1 WHERE xtblj1.i = 1; /*u1*/DELETE FROM xctblt1 WHERE i = 0; SET SCHEMA public; /*u1*/DELETE FROM blaine.xctblt1 WHERE i = 24; /*u1*/DELETE FROM blaine.xtblj1 WHERE xtblj1.i = 1; SET SCHEMA blaine; ROLLBACK; /*c2*/SELECT i FROM xctblt1; /*u0*/GRANT ALL ON xctblt1 TO otheruser; SET SCHEMA public; /*u0*/GRANT ALL ON blaine.xctblt2 TO otheruser; SET SCHEMA blaine; /*e*/GRANT ALL ON other.xctblt3 TO otheruser; /*e*/GRANT ALL ON information_schema.xctblt3 TO otheruser; /*u0*/REVOKE ALL ON xctblt1 FROM otheruser RESTRICT; SET SCHEMA public; /*u0*/REVOKE ALL ON blaine.xctblt2 FROM otheruser RESTRICT; SET SCHEMA blaine; /*e*/REVOKE ALL ON other.xctblt3 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON information_schema.xctblt3 FROM otheruser RESTRICT; /*e*/DROP TABLE other.xctblt3; /*e*/DROP TABLE information_schema.xctblt4; /*e*/DROP TABLE xctblt101; /*e*/DROP TABLE blaine.xctblt101; /*u0*/DROP TABLE xctblt101 IF EXISTS; SET SCHEMA public; /*u0*/DROP TABLE blaine.xctblt101 IF EXISTS; SET SCHEMA blaine; -- Should "DROP TABLE nonexistentschema.notable IF EXISTS" work? /*u0*/DROP TABLE other.system_users IF exists; /*u0*/DROP TABLE system_users IF exists; -- ****************************** Views /*c2*/SELECT * FROM xvwv1; SET SCHEMA public; /*c2*/SELECT * FROM blaine.xvwv1; SET SCHEMA blaine; /*c2*/SELECT * FROM xvwv2; /*c2*/SELECT * FROM xvwv3; /*c1*/SELECT * FROM xvwv4; /*c1*/SELECT * FROM xvwv5; /*c1*/SELECT * FROM xvwv8; /*c0*/SELECT * FROM xvwv9; /*c0*/SELECT * FROM xvwv10; /*c0*/SELECT * FROM xvwv11; /*c0*/SELECT * FROM xvwv12; /*e*/SELECT * FROM xvwv13; /*c0*/SELECT * FROM xvwv14; /*c0*/SELECT * FROM xvwv15; /*c0*/SELECT * FROM xvwv16; /*c0*/SELECT * FROM xvwv17; /*c0*/SELECT * FROM xvwv18; /*c1*/SELECT * FROM xvwv19; /*c1*/SELECT * FROM xvwv20; /*c1*/SELECT * FROM xvwv21; /*c1*/SELECT * FROM xvwv22; /*c1*/SELECT * FROM xvwv23; /*c1*/SELECT * FROM xvwv24; /*c1*/SELECT * FROM xvwv25; /*c1*/SELECT * FROM xvwv26; /*c2*/SELECT * FROM xvwv28; /*c1*/SELECT * FROM xvwv29; /*c1*/SELECT * FROM xvwv30; /*c1*/SELECT * FROM xvwv31; /*c0*/SELECT * FROM xvwv32; /*c1*/SELECT * FROM xvwv33; /*c1*/SELECT * FROM xvwv34; /*c0*/SELECT * FROM xvwv35; /*c1*/SELECT * FROM xvwv36; /*c1*/SELECT * FROM xvwv37; /*c1*/SELECT * FROM xvwv38; /*c1*/SELECT * FROM xvwv39; /*c1*/SELECT * FROM xvwv40; /*c1*/SELECT * FROM xvwv41; /*c1*/SELECT * FROM xvwv42; /*c1*/SELECT * FROM xvwv43; /*c1*/SELECT * FROM xvwv44; /*c1*/SELECT * FROM xvwv45; /*c1*/SELECT * FROM xvwv46; /*c1*/SELECT * FROM xvwv47; /*c1*/SELECT * FROM xvwv48; /*c1*/SELECT * FROM xvwv49; /*c1*/SELECT * FROM xvwv50; /*c1*/SELECT * FROM xvwv51; /*c1*/SELECT * FROM xvwv52; /*c1*/SELECT * FROM xvwv53; /*c1*/SELECT * FROM xvwv54; /*c1*/SELECT * FROM xvwv55; /*c1*/SELECT * FROM xvwv56; /*c1*/SELECT * FROM xvwv57; /*c1*/SELECT * FROM xvwv1, xvwj1 WHERE xvwv1.i = xvwj1.i; SET SCHEMA public; /*c1*/SELECT * FROM blaine.xvwv1, blaine.xvwj1 WHERE xvwv1.i = xvwj1.i; SET SCHEMA blaine; /*c2*/SELECT * FROM xvwv1 WHERE i in (0, 1, 11, 12); /*c1*/SELECT * FROM xvwv1 WHERE i < 1; /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT i FROM xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i in (SELECT i FROM xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT i FROM xvwj1 WHERE i = 1); /*c1*/SELECT * FROM blaine.xvwv1 WHERE xvwv1.i in (SELECT i FROM xvwj1); /*c1*/SELECT * FROM blaine.xvwv1 WHERE xvwv1.i = (SELECT i FROM xvwj1 WHERE i = 1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT i FROM blaine.xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i in (SELECT i FROM blaine.xvwj1); /*c0*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT i FROM blaine.xvwj1 WHERE i = 0); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT xvwj1.i FROM blaine.xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i in (SELECT xvwj1.i FROM xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT xvwj1.i FROM xvwj1 WHERE i = 1); /*c0*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT i FROM blaine.xvwj1 WHERE xvwj1.i = 0); /*c0*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT xvwj1.i FROM xvwj1 WHERE xvwj1.i = 0); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT i FROM xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE i in (SELECT i FROM xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT i FROM xvwj1 WHERE i = 1); /*c1*/SELECT * FROM blaine.xvwv1 WHERE i = (SELECT i FROM xvwj1); /*c1*/SELECT * FROM blaine.xvwv1 WHERE i in (SELECT i FROM xvwj1); /*c1*/SELECT * FROM blaine.xvwv1 WHERE i = (SELECT i FROM xvwj1 WHERE i = 1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT i FROM blaine.xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE i in (SELECT i FROM blaine.xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT i FROM blaine.xvwj1 WHERE i = 1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT xvwj1.i FROM blaine.xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE i in (SELECT xvwj1.i FROM xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT xvwj1.i FROM xvwj1 WHERE i = 1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT i FROM blaine.xvwj1 WHERE xvwj1.i = 1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT xvwj1.i FROM xvwj1 WHERE xvwj1.i = 1); /*c2*/SELECT * FROM xvwv1; /*c1*/SELECT * FROM xvwv1 WHERE i = 0; /*c2*/SELECT * FROM xvwv1 WHERE i in (0, 1, 11, 12); /*c1*/SELECT * FROM xvwv1 WHERE i < 1; /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT i FROM xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i in (SELECT i FROM xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT i FROM xvwj1 WHERE i = 1); /*c1*/SELECT * FROM blaine.xvwv1 WHERE xvwv1.i = (SELECT i FROM xvwj1); /*c1*/SELECT * FROM blaine.xvwv1 WHERE xvwv1.i in (SELECT i FROM xvwj1); /*c1*/SELECT * FROM blaine.xvwv1 WHERE xvwv1.i = (SELECT i FROM xvwj1 WHERE i = 1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT i FROM blaine.xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i in (SELECT i FROM blaine.xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT i FROM blaine.xvwj1 WHERE i = 1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT xvwj1.i FROM blaine.xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i in (SELECT xvwj1.i FROM xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT xvwj1.i FROM xvwj1 WHERE i = 1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT i FROM blaine.xvwj1 WHERE xvwj1.i = 1); /*c1*/SELECT * FROM xvwv1 WHERE xvwv1.i = (SELECT xvwj1.i FROM xvwj1 WHERE xvwj1.i = 1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT i FROM xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE i in (SELECT i FROM xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT i FROM xvwj1 WHERE i = 1); /*c1*/SELECT * FROM blaine.xvwv1 WHERE i = (SELECT i FROM xvwj1); /*c1*/SELECT * FROM blaine.xvwv1 WHERE i in (SELECT i FROM xvwj1); /*c1*/SELECT * FROM blaine.xvwv1 WHERE i = (SELECT i FROM xvwj1 WHERE i = 1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT i FROM blaine.xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE i in (SELECT i FROM blaine.xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT i FROM blaine.xvwj1 WHERE i = 1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT xvwj1.i FROM blaine.xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE i in (SELECT xvwj1.i FROM xvwj1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT xvwj1.i FROM xvwj1 WHERE i = 1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT i FROM blaine.xvwj1 WHERE xvwj1.i = 1); /*c1*/SELECT * FROM xvwv1 WHERE i = (SELECT xvwj1.i FROM xvwj1 WHERE xvwj1.i = 1); /*e*/SELECT * FROM other.xvwv1; /*e*/SELECT * FROM information_schema.xvwv1; SET SCHEMA public; /*c2*/SELECT * FROM blaine.xvwv1; /*c1*/SELECT * FROM blaine.xvwv1 WHERE i = 0; SET SCHEMA blaine; /*e*/SELECT * FROM other.xvwv1 WHERE i = 0; /*e*/SELECT * FROM information_schema.xvwv1 WHERE i = 0; SET SCHEMA public; CREATE TABLE blaine.vwt2 AS (SELECT * FROM blaine.xvwv1 WHERE i = 0) WITH DATA; /*c1*/SELECT * FROM blaine.vwt2; SET SCHEMA blaine; DROP TABLE vwt2; SET SCHEMA public; /*c1*/SELECT * FROM blaine.xvwv1, blaine.xvwj1 WHERE xvwv1.i = xvwj1.i; SET SCHEMA blaine; /*c1*/SELECT * FROM xvwv1, blaine.xvwj1 WHERE xvwv1.i = xvwj1.i; /*c1*/SELECT * FROM blaine.xvwv1, xvwj1 WHERE xvwv1.i = xvwj1.i; /*c1*/SELECT * FROM xvwv1, xvwj1 WHERE xvwv1.i = xvwj1.i; SET SCHEMA public; /*c1*/SELECT vc FROM blaine.xvwv1, blaine.xvwj1 WHERE xvwv1.i = xvwj1.i; SET SCHEMA blaine; /*c1*/SELECT vc FROM xvwv1, blaine.xvwj1 WHERE xvwv1.i = xvwj1.i; /*c1*/SELECT vc FROM blaine.xvwv1, xvwj1 WHERE xvwv1.i = xvwj1.i; /*c1*/SELECT vc FROM xvwv1, xvwj1 WHERE xvwv1.i = xvwj1.i; SET SCHEMA public; /*c1*/SELECT xvwj1.vc FROM blaine.xvwv1, blaine.xvwj1 WHERE xvwv1.i = xvwj1.i; SET SCHEMA blaine; /*c1*/SELECT xvwj1.vc FROM xvwv1, blaine.xvwj1 WHERE xvwv1.i = xvwj1.i; /*c1*/SELECT xvwj1.vc FROM blaine.xvwv1, xvwj1 WHERE xvwv1.i = xvwj1.i; /*c1*/SELECT xvwj1.vc FROM xvwv1, xvwj1 WHERE xvwv1.i = xvwj1.i; /*c1*/SELECT lbla.vc FROM xvwv1, xvwj1 lbla WHERE xvwv1.i = lbla.i; /*c1*/SELECT xvwj1.vc FROM xvwv1 lblb, xvwj1 WHERE lblb.i = xvwj1.i; /*c1*/SELECT lbla.vc FROM xvwv1 lblb, xvwj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM blaine.xvwv1, xvwj1 lbla WHERE xvwv1.i = lbla.i; /*c1*/SELECT xvwj1.vc FROM blaine.xvwv1 lblb, xvwj1 WHERE lblb.i = xvwj1.i; /*c1*/SELECT lbla.vc FROM blaine.xvwv1 lblb, xvwj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM xvwv1, blaine.xvwj1 lbla WHERE xvwv1.i = lbla.i; /*c1*/SELECT xvwj1.vc FROM xvwv1 lblb, blaine.xvwj1 WHERE lblb.i = xvwj1.i; /*c1*/SELECT lbla.vc FROM xvwv1 lblb, blaine.xvwj1 lbla WHERE lblb.i = lbla.i; /*u0*/GRANT ALL ON xvwv1 TO otheruser; SET SCHEMA public; /*u0*/GRANT ALL ON blaine.xvwv2 TO otheruser; SET SCHEMA blaine; /*e*/GRANT ALL ON other.xvwv3 TO otheruser; /*e*/GRANT ALL ON information_schema.xvwv3 TO otheruser; /*u0*/REVOKE ALL ON xvwv1 FROM otheruser RESTRICT; SET SCHEMA public; /*u0*/REVOKE ALL ON blaine.xvwv2 FROM otheruser RESTRICT; SET SCHEMA blaine; /*e*/REVOKE ALL ON other.xvwv3 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON information_schema.xvwv3 FROM otheruser RESTRICT; -- ****************************** Indexes /*c2*/SELECT * from xindt1; SET SCHEMA public; /*c2*/SELECT * from blaine.xindt2; /*c2*/SELECT * from blaine.xindt3; SET SCHEMA blaine; /*c2*/SELECT * from xindt4; -- ****************************** CACH Indexes /*c2*/SELECT * from xcindt1; SET SCHEMA public; /*c2*/SELECT * from blaine.xcindt2; /*c2*/SELECT * from blaine.xcindt3; SET SCHEMA blaine; /*c2*/SELECT * from xcindt4; -- ****************************** Sequences -- N.b.: Do not commit DML changes so that this whole block may be repeated. /*r0*/SELECT next value FOR xs1 FROM xseqt1; SET SCHEMA public; -- Sequence dflt schema should come from Session (set schema), not table. /*e*/SELECT next value FOR xs2 FROM blaine.xseqt1; /*e*/SELECT next value FOR blaine.xs1 FROM xseqt1; /*r2*/SELECT next value FOR blaine.xs2 FROM blaine.xseqt1; SET SCHEMA blaine; -- Just to reset orig. value before persisting (can't roll back seq.s). ALTER SEQUENCE xs1 RESTART WITH 0; ALTER SEQUENCE xs2 RESTART WITH 2; /*e*/DROP SEQUENCE xs101; /*e*/DROP SEQUENCE blaine.xs101; /*e*/DROP SEQUENCE information_schema.xs1; /*e*/DROP SEQUENCE other.xs1; -- ****************************** Triggers /*e*/CREATE TRIGGER xtrgtrig1 AFTER INSERT ON xtrgt1 CALL 'org.hsqldb.test.BlaineTrig'; -- Create existing /*e*/CREATE TRIGGER blaine.xtrgtrig2 AFTER INSERT ON xtrgt2 CALL 'org.hsqldb.test.BlaineTrig'; -- Create existing SET SCHEMA public; /*e*/CREATE TRIGGER blaine.xtrgtrig2 AFTER INSERT ON blaine.xtrgt2 CALL 'org.hsqldb.test.BlaineTrig'; -- Create existing SET SCHEMA blaine; -- ****************************** Constraints -- N.b.: Do not commit DML changes so that this whole block may be repeated. COMMIT; SET AUTOCOMMIT false; /*u1*/INSERT INTO xcont1 VALUES (0); SET SCHEMA public; /*u1*/INSERT INTO blaine.xcont2 VALUES (0); SET SCHEMA blaine; /*u1*/INSERT INTO xcont3 VALUES (0); /*u1*/INSERT INTO xcont4 VALUES (0); /*u1*/INSERT INTO xcont5 VALUES (0); /*u1*/INSERT INTO xcont6 VALUES (0); /*u1*/INSERT INTO xcont7 VALUES (0); /*u1*/INSERT INTO xcont8 VALUES (0); -- Note that error message implies that problem is due to table xconj1, not data: /*u1*/INSERT INTO xcont9 VALUES (1); /*u1*/INSERT INTO xcont10 VALUES (1); /*u1*/INSERT INTO xcont11 VALUES (1); /*u1*/INSERT INTO xcont12 VALUES (1); /*e*/INSERT INTO xcont13 VALUES (1); /*u1*/INSERT INTO xcont14 VALUES (1); /*u1*/INSERT INTO xcont15 VALUES (1); /*u1*/INSERT INTO xcont16 VALUES (1); /*u1*/INSERT INTO xcont17 VALUES (0); /*u1*/INSERT INTO xcont18 VALUES (0); /*u1*/INSERT INTO xcont19 VALUES (0); /*u1*/INSERT INTO xcont20 VALUES (0); /*e*/INSERT INTO xcont1 VALUES (0); /*e*/INSERT INTO xcont2 VALUES (0); /*e*/INSERT INTO xcont3 VALUES (0); /*e*/INSERT INTO xcont4 VALUES (0); /*e*/INSERT INTO xcont5 VALUES (0); /*e*/INSERT INTO xcont6 VALUES (0); /*e*/INSERT INTO xcont7 VALUES (0); /*e*/INSERT INTO xcont8 VALUES (0); /*e*/INSERT INTO xcont9 VALUES (0); /*e*/INSERT INTO xcont10 VALUES (0); /*e*/INSERT INTO xcont11 VALUES (0); /*e*/INSERT INTO xcont12 VALUES (0); /*e*/INSERT INTO xcont13 VALUES (0); /*e*/INSERT INTO xcont14 VALUES (0); /*e*/INSERT INTO xcont15 VALUES (0); /*e*/INSERT INTO xcont16 VALUES (0); /*e*/INSERT INTO xcont17 VALUES (1); /*e*/INSERT INTO xcont18 VALUES (1); /*e*/INSERT INTO xcont19 VALUES (1); /*e*/INSERT INTO xcont20 VALUES (1); /*c1*/SELECT * FROM xcont1; /*c1*/SELECT * FROM xcont2; /*c1*/SELECT * FROM xcont3; /*c1*/SELECT * FROM xcont4; /*c1*/SELECT * FROM xcont5; /*c1*/SELECT * FROM xcont6; /*c1*/SELECT * FROM xcont7; /*c1*/SELECT * FROM xcont8; /*c1*/SELECT * FROM xcont9; /*c1*/SELECT * FROM xcont10; /*c1*/SELECT * FROM xcont11; /*c1*/SELECT * FROM xcont12; /*c0*/SELECT * FROM xcont13; /*c1*/SELECT * FROM xcont14; /*c1*/SELECT * FROM xcont15; /*c1*/SELECT * FROM xcont16; /*c1*/SELECT * FROM xcont17; /*c1*/SELECT * FROM xcont18; /*c1*/SELECT * FROM xcont19; /*c1*/SELECT * FROM xcont20; ROLLBACK; -- ****************************** ALTERs -- Add tests when time permits. DROP USER otheruser; -- This to test .script persistence. SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSchemaCasc.txt0000644000175000017500000000512112007547346023300 0ustar renerene-- schema TESTS WRT cascading /*u0*/SET SCHEMA information_schema; /*u0*/create user sa1 password "sa1" admin; /*u0*/create user sa2 password "sa2" admin; /*u0*/create user sa3 password "sa3" admin; /*u0*/create role r1; /*u0*/create role r2; /*u0*/create role r3; /*u0*/create schema s1 authorization sa1; /*u0*/create schema s2 authorization dba; /*u0*/create schema s3 authorization r1; -- These should have no effect on direct or indirect schema drops, since -- only DIRECT schema owners incur dependencies that prevent deletions. /*u0*/grant r1 to r2; /*u0*/grant r2 to sa2; /*e*/drop role r1; /*e*/drop user sa1; /*u0*/CREATE TABLE s1.t1(i int); /*u0*/CREATE TABLE s2.t2(i int); /*u0*/CREATE TABLE s3.t3(i int); -- Can't drop schemas which contain objects without CASCADE option /*e*/drop schema s1; /*e*/drop schema s2; /*e*/drop schema s3; /*e*/drop user sa1; /*c1*/SELECT * FROM schemata WHERE schema_name = 'S1'; /*c1*/SELECT * FROM schemata WHERE schema_name = 'S2'; /*c1*/SELECT * FROM schemata WHERE schema_name = 'S3'; /*c1*/SELECT * FROM system_tables WHERE table_schem = 'S1' AND table_name = 'T1'; /*c1*/SELECT * FROM system_tables WHERE table_schem = 'S2' AND table_name = 'T2'; /*c1*/SELECT * FROM system_tables WHERE table_schem = 'S3' AND table_name = 'T3'; -- DROP USER... CASCADEs invoke DROP SCHEMA... CASCADEs. /*u0*/DROP USER sa3; /*u0*/DROP USER sa2; /*u0*/DROP USER sa1 CASCADE; /*e*/drop role r1; /*c0*/SELECT * FROM schemata WHERE schema_name = 'S1'; /*c1*/SELECT * FROM schemata WHERE schema_name = 'S2'; /*c1*/SELECT * FROM schemata WHERE schema_name = 'S3'; /*c0*/SELECT * FROM system_tables WHERE table_schem = 'S1' AND table_name = 'T1'; /*c1*/SELECT * FROM system_tables WHERE table_schem = 'S2' AND table_name = 'T2'; /*c1*/SELECT * FROM system_tables WHERE table_schem = 'S3' AND table_name = 'T3'; /*u0*/drop role r1 CASCADE; /*c0*/SELECT * FROM schemata WHERE schema_name = 'S1'; /*c1*/SELECT * FROM schemata WHERE schema_name = 'S2'; /*c0*/SELECT * FROM schemata WHERE schema_name = 'S3'; /*c0*/SELECT * FROM system_tables WHERE table_schem = 'S1' AND table_name = 'T1'; /*c1*/SELECT * FROM system_tables WHERE table_schem = 'S2' AND table_name = 'T2'; /*c0*/SELECT * FROM system_tables WHERE table_schem = 'S3' AND table_name = 'T3'; /*s*/DROP role r2 CASCADE; /*s*/DROP user sa2 CASCADE; /*s*/DROP user sa3 CASCADE; /*U0*/ Workaround for bug where DDL will not Commit /*s*/CREATE TABLE bug_workaround (i int); /*s*/INSERT INTO bug_workaround VALUES(1); /*u0*/SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfQueries.txt0000644000175000017500000001550012007547346022725 0ustar renerene-- -- TestSelfQueries.txt -- -- Tests for Query results, especially the neutrality of constraints and indexes -- drop table TESTTABLE if exists; create cached table TESTTABLE ( aString varchar(256) not null, firstNum integer not null, aDate date not null, secondNum integer not null, thirdNum integer not null, aName varchar(32) not null ); create index IDX_TESTTABLE_aString on TESTTABLE (aString); create index IDX_TESTTABLE_aDate_secondNum on TESTTABLE (aDate,secondNum); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('Current', 22, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('Popular', 23, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('New', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('Old', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('CCurrent', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('ELV', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('ELNA', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('Older', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('RA', 20, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('RP', 2, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('VS', 3, '2003-11-10', 18, 3, 'my name goes here'); -- /*c11*/select * from testtable where adate = '2003-11-10' and secondNum = 18; /*c11*/select * from testtable where (adate, secondNum) = (DATE'2003-11-10', 18); /*c11*/select * from testtable where adate = '2003-11-10'; /*c1*/select * from testtable where adate = '2003-11-10' and firstNum = 20; /*c1*/select * from testtable where (adate, firstNum) = (DATE'2003-11-10', 20); /*c11*/select * from testtable where adate = '2003-11-10' and thirdNum = 3; /*c11*/select * from testtable where (adate, thirdNum) = (DATE'2003-11-10', 3); drop index IDX_TESTTABLE_aString; drop index IDX_TESTTABLE_aDate_secondNum; alter table TESTTABLE add constraint tt_pk primary key (astring); /*c11*/select * from testtable where adate = '2003-11-10' and secondNum = 18; /*c11*/select * from testtable where (adate, secondNum) = (DATE'2003-11-10', 18); /*c11*/select * from testtable where adate = '2003-11-10'; /*c1*/select * from testtable where adate = '2003-11-10' and firstNum = 20; /*c11*/select * from testtable where adate = '2003-11-10' and thirdNum = 3; alter table testtable drop column aname; /*c1*/select * from testtable where adate = '2003-11-10' and firstNum = 20; /*c11*/select * from testtable where adate = '2003-11-10' and thirdNum = 3; alter table testtable add column aname char(10) default 'a string' not null; /*c1*/select * from testtable where adate = '2003-11-10' and firstNum = 20; /*c11*/select * from testtable where adate = '2003-11-10' and thirdNum = 3; /*e*/update testtable set name=null; -- bug #722443 DROP TABLE CONFIGUSER IF EXISTS; CREATE CACHED TABLE CONFIGUSER(USR_USERID NUMERIC NOT NULL PRIMARY KEY,USR_USERNAME VARCHAR(10) NOT NULL,USR_PASSWORD VARCHAR(10)); INSERT INTO CONFIGUSER VALUES(-5,'guest','guest'); INSERT INTO CONFIGUSER VALUES(-4,'user','user'); INSERT INTO CONFIGUSER VALUES(-3,'owner','owner'); INSERT INTO CONFIGUSER VALUES(-2,'admin','xxx'); INSERT INTO CONFIGUSER VALUES(-1,'sadmin','xxx'); INSERT INTO CONFIGUSER VALUES(0,'nobody',null); -- select all users with their username as password /*c3*/select * from configuser where usr_username = usr_password; -- create a unique index on one column CREATE UNIQUE INDEX IDX_USERNAME ON CONFIGUSER(USR_USERNAME); -- select all users with their username as password /*c3*/select * from configuser where usr_username = usr_password; /*c3*/select * from configuser where usr_username in (select usr_password from configuser) /*c3*/select * from configuser where usr_password in (select usr_username from configuser) /*c3*/select * from configuser where usr_password in (usr_username); /*c2*/select * from configuser where usr_password in ('guest', 'user', 'wrong') DROP INDEX IDX_USERNAME -- select all users with their username as password /*c3*/select * from configuser where usr_username = usr_password; /*c3*/select * from configuser where usr_username in (select usr_password from configuser) /*c3*/select * from configuser where usr_password in (select usr_username from configuser) /*c3*/select * from configuser where usr_password in (usr_username); /*c2*/select * from configuser where usr_password in ('guest', 'user', 'wrong') CREATE INDEX IDX_USERNAME ON CONFIGUSER(USR_USERNAME); -- select all users with their username as password /*c3*/select * from configuser where usr_username = usr_password; /*c3*/select * from configuser where usr_username in (select usr_password from configuser) /*c3*/select * from configuser where usr_password in (select usr_username from configuser) /*c3*/select * from configuser where usr_password in (usr_username); /*c2*/select * from configuser where usr_password in ('guest', 'user', 'wrong') -- -- COUNT(DISTINCT ) when there are no records -- bug #718866 CREATE TABLE IBANX_PERMIT(ID INT, A1 VARCHAR(10)); /*r0*/SELECT count(distinct A0.ID) FROM IBANX_PERMIT A0; -- -- use of column aliases in the where clause --bug #696595 CREATE TABLE "liste"("kosten" INT, "preis" INT); insert into "liste" values(100, 10); /*r100*/SELECT "kosten" AS "total" FROM "liste" WHERE "kosten" > 0 ORDER BY "total" DESC; /*r110*/SELECT ("kosten"+"preis") AS "total" FROM "liste" WHERE "kosten"+"preis" > 0 ORDER BY "total" DESC; drop table t1 if exists; drop table t2 if exists; create table t1(t1c1 int, t1c2 int); create table t2(t2c1 int, t2c2 int); insert into t1 values 1, 2; insert into t2 values 2, 3; /*r1,2,2,3*/select * from t1, t2; /*r1,2,2,3*/select * from t1, t2 where t1c2 = t2c1; /*r1,2,2,3*/select * from t1 join t2 on t1c2 = t2c1; /*r1,2,2,3*/select * from t1 left outer join t2 on t1c2 = t2c1; /*r1,2,2,3*/select * from t1 right outer join t2 on t1c2 = t2c1; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSeqRightsA.txt0000644000175000017500000000744612007547344023332 0ustar renerene-- $Id: TestSelfSeqRightsA.txt 610 2008-12-22 15:54:18Z unsaved $ -- Test Grants/Revokes for Sequences (not ALTER/CREATE/DROP rights, as -- tested in the general schema object test scripts). -- We are not testing TABLE rights here. We know that if the table of the -- query is not accessible for any reason, the "next value" won't succeed, -- so the test setup just grants ALL on the tables used. -- Also not testing the numerical values of the sequences. -- We're just testing if a "next value for" returns a row successfully. -- (some other test file should test the values returned). -- Remember that unlike 1-to-1-dependent objects like table indexes, -- schemas of indexes do not default to that of the table. -- (One reason being, in future we may permit a single query of a table in -- one schema and sequence(s) in other schema(s)). -- Setup SET WRITE_DELAY 0; /*s*/DROP user blaine; CREATE user blaine password "b"; /*u0*/GRANT CHANGE_AUTHORIZATION TO blaine; /*s*/DROP SCHEMA bsch CASCADE; -- Remove public schema objects. The CASCADE above takes care of the rest. DROP TABLE pt IF EXISTS; /*s*/DROP SEQUENCE bs1; /*s*/DROP SEQUENCE bs2; /*s*/DROP SEQUENCE bs3; /*s*/DROP SEQUENCE bs4; /*s*/DROP SEQUENCE bs5; -- We create objects using default schemas and explicit schemas, just to -- exercise schema resolution. CREATE SCHEMA bsch AUTHORIZATION blaine; CREATE TABLE public.pt(i int); CREATE TABLE bsch.bt(i int); INSERT INTO pt VALUES(1); INSERT INTO bsch.bt VALUES(1); SET SCHEMA bsch; CREATE SEQUENCE public.ps1; CREATE SEQUENCE public.ps3; SET SCHEMA public; CREATE SEQUENCE ps2; CREATE SEQUENCE ps4; CREATE SEQUENCE ps5; CREATE SEQUENCE ps6; CREATE SEQUENCE ps7; CREATE SEQUENCE ps8; CREATE SEQUENCE ps9; CREATE SEQUENCE bsch.bs1; CREATE SEQUENCE bsch.bs3; SET SCHEMA bsch; CREATE SEQUENCE bs2; CREATE SEQUENCE bs4; CREATE SEQUENCE bs5; GRANT ALL ON public.pt TO blaine; GRANT ALL ON bsch.bt TO blaine; -- Set perms with various permutations of conditions -- bs* have enough permissions for blaine by virtue of schema ownerhip. -- ps1,2,5,6 have enough permissions by virtue of grants to pub or blaine. -- ps3,4,7,8 do not /*u0*/GRANT ALL ON SEQUENCE public.ps1 TO public; /*u0*/GRANT USAGE ON SEQUENCE public.ps2 TO public; /*e*/GRANT SELECT ON SEQUENCE public.ps3 TO public; /*e*/GRANT INSERT ON SEQUENCE public.ps4 TO public; /*u0*/GRANT ALL ON SEQUENCE public.ps5 TO public; /*u0*/GRANT USAGE ON SEQUENCE public.ps6 TO public; /*e*/GRANT EXECUTE ON SEQUENCE public.ps7 TO public; /*e*/GRANT UPDATE ON SEQUENCE public.ps8 TO public; SET SCHEMA public; /*U*/These two are just workarounds for a DELAY 0 BUG: UPDATE public.pt SET i = 1; COMMIT; CONNECT USER blaine PASSWORD "b"; -- Following is default, but just to eliminate any ambiguity... SET SCHEMA public; -- By virtue of PUBLIC grants /*e*/SELECT i, next value for ps9 FROM pt; /*e*/SELECT i, next value for public.ps9 FROM public.pt; /*e*/SELECT i, next value for ps9 FROM public.pt; /*c1*/SELECT i, next value for ps1 FROM pt; SET SCHEMA bsch; /*c1*/SELECT i, next value for public.ps2 FROM public.pt; -- Don't own /*e*/GRANT ALL ON SEQUENCE public.ps2 TO PUBLIC; /*u0*/GRANT ALL ON SEQUENCE bsch.bs5 TO PUBLIC; -- By virtue of schema ownership /*c1*/SELECT i, next value for bs2 FROM bt; SET SCHEMA public; /*c1*/SELECT i, next value for bsch.bs1 FROM bsch.bt; -- Enough schema specification testing. Just use defauls Session schema for -- here on in /*c1*/SELECT i FROM pt; /*e*/SELECT i, next value for ps3 FROM pt; /*e*/SELECT i, next value for ps4 FROM pt; /*c1*/SELECT i, next value for ps5 FROM pt; /*c1*/SELECT i, next value for ps6 FROM pt; /*e*/SELECT i, next value for ps7 FROM pt; /*e*/SELECT i, next value for ps8 FROM pt; CONNECT USER sa PASSWORD ""; SHUTDOWN IMMEDIATELY; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfGrantees.txt0000644000175000017500000001467012007547346023067 0ustar renerene/*e*/CREATE USER public PASSWORD public ADMIN /*e*/CREATE USER _SYSTEM PASSWORD system ADMIN /*e*/CREATE USER public PASSWORD public /*e*/CREATE USER _SYSTEM PASSWORD system CREATE USER blaine PASSWORD blaine; /*u0*/GRANT CHANGE_AUTHORIZATION TO blaine; CREATE USER blaineadm PASSWORD blaineadm ADMIN; CREATE USER debbie PASSWORD debbie; DROP TABLE public.t1 IF EXISTS; CREATE TABLE public.t1 (i int); INSERT INTO public.t1 VALUES (1); CREATE USER us3 PASSWORD us3; /*u0*/GRANT CHANGE_AUTHORIZATION TO us3; ----------------------------------------------------------------------- -- RESERVED USERS and ROLES -- Test public grants DROP TABLE t2 IF EXISTS; CREATE TABLE public.t2 (i int); INSERT INTO public.t2 VALUES (1); CONNECT USER us3 PASSWORD us3; /*e*/SELECT * FROM t2; CONNECT USER sa PASSWORD ""; GRANT SELECT ON t2 TO public; CONNECT USER us3 PASSWORD us3; /*c1*/SELECT * FROM t2; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON t2 FROM public RESTRICT; CONNECT USER us3 PASSWORD us3; /*e*/SELECT * FROM t2; CONNECT USER sa PASSWORD ""; -- Prohibit adding/dropping reserved Roles and Users -- _SYSTEM role? /*e*/DROP ROLE dba; -- Spec says can't create a user or role called "public" /*e*/DROP USER public password x; /*e*/DROP USER _system password x; /*e*/DROP USER dba password x; /*e*/CREATE ROLE public; /*e*/CREATE ROLE _system; /*e*/CREATE ROLE dba; -- We prohibit change the built-in permissions for the DBA group, since -- the role is not persisted. -- Prohibit grants/revokes for _SYSTEM, DBA /*e*/GRANT ALL ON public.t1 TO dba; /*e*/GRANT ALL ON public.t1 TO _system; /*e*/REVOKE ALL ON public.t1 FROM dba RESTRICT; /*e*/REVOKE ALL ON public.t1 FROM _system RESTRICT; ----------------------------------------------------------------------- -- Roles and Users share a namespace CREATE USER conflict1 PASSWORD conflict1; /*e*/CREATE ROLE conflict1; /*u0*/CREATE ROLE conflict2; /*e*/CREATE USER conflict2 PASSWORD conflict2; -- Can grant a Role but not a user /*e*/GRANT us3 TO conflict2; -- Grant and revoke lists for users and roles GRANT SELECT, UPDATE, DELETE, INSERT ON public.t2 TO conflict1; GRANT SELECT, UPDATE, DELETE, INSERT ON public.t2 TO conflict2; REVOKE SELECT, UPDATE, DELETE, INSERT ON public.t2 FROM conflict1 RESTRICT; REVOKE SELECT, UPDATE, DELETE, INSERT ON public.t2 FROM conflict2 RESTRICT; -- Wrong right names /*e*/GRANT SELECT, TABLE, COLUMN ON public.t2 TO conflict1; /*e*/REVOKE SELECT, TABLE, COLUMN ON public.t2 FROM conflict1 RESTRICT; -- Roles are not schemas /*e*/CREATE TABLE dba.x1 (i int); -- Test global (non-object) permissions of DBA Role GRANT ALL ON public.t1 TO blaine; CONNECT USER blaineadm PASSWORD blaineadm; /*u0*/SET TABLE public.t1 READONLY true; CONNECT USER blaine PASSWORD blaine; /*e*/INSERT INTO public.t1 VALUES(1); /*e*/SET TABLE public.t1 READONLY true; /*e*/CREATE USER user1 password user1; /*e*/GRANT dba TO debbie; CONNECT USER blaineadm PASSWORD blaineadm; /*u0*/GRANT dba TO blaine; CONNECT USER blaine PASSWORD blaine; /*e*/INSERT INTO public.t1 VALUES(1); /*u0*/SET TABLE public.t1 READONLY false; /*u1*/INSERT INTO public.t1 VALUES(1); /*u0*/CREATE USER user1 password user1; /*u0*/GRANT dba TO debbie; --CONNECT USER sa PASSWORD ""; SET SESSION AUTHORIZATION 'SA' /*u0*/REVOKE dba FROM blaine RESTRICT; CONNECT USER blaine PASSWORD blaine; /*e*/SET TABLE public.t1 READONLY true; /*e*/CREATE USER user2 password user2; /*e*/REVOKE dba FROM debbie RESTRICT; -- Test using non-existent roles and re-creating existing roles. CONNECT USER sa PASSWORD ""; CREATE USER us1 PASSWORD us1; /*u0*/GRANT CHANGE_AUTHORIZATION TO us1; CREATE USER us2 PASSWORD us2; /*e*/DROP ROLE r1; /*u0*/CREATE ROLE r1; /*u0*/GRANT r1 TO us1; /*e*/GRANT r1 TO us1; /*u0*/REVOKE r1 FROM us1 RESTRICT; /*e*/REVOKE r1 FROM us1 RESTRICT; /*e*/REVOKE r2 FROM us1 RESTRICT; /*u0*/DROP ROLE r1; -- Basics CONNECT USER blaineadm PASSWORD blaineadm; /*e*/GRANT ALL ON t1 TO r1; /*u0*/CREATE ROLE r1; /*e*/GRANT r1 TO r1; -- us1: no privs CONNECT USER us1 PASSWORD us1; /*e*/SELECT * FROM public.t1; /*e*/CREATE TABLE us1t1 (i int); CONNECT USER sa PASSWORD ""; GRANT r1 TO us1; -- us1: no privs CONNECT USER us1 PASSWORD us1; /*e*/SELECT * FROM public.t1; /*e*/CREATE TABLE us1t1 (i int); CONNECT USER sa PASSWORD ""; GRANT SELECT ON t1 TO r1; -- us1: t1 rights via role r1 CONNECT USER us1 PASSWORD us1; /*c2*/SELECT * FROM public.t1; /*e*/CREATE TABLE us1t1 (i int); CONNECT USER sa PASSWORD ""; GRANT dba TO us1; -- us1: DBA + t1 rights via role r1 CONNECT USER us1 PASSWORD us1; /*c2*/SELECT * FROM public.t1; /*u0*/CREATE TABLE us1t1 (i int); /*u0*/DROP TABLE us1t1; CONNECT USER sa PASSWORD ""; /*u0*/REVOKE dba FROM us1 RESTRICT; -- us1: t1 rights via role r1 CONNECT USER us1 PASSWORD us1; /*c2*/SELECT * FROM public.t1; /*e*/CREATE TABLE us1t1 (i int); CONNECT USER sa PASSWORD ""; /*u0*/REVOKE r1 FROM us1 RESTRICT; -- us1: no privs CONNECT USER us1 PASSWORD us1; /*e*/SELECT * FROM public.t1; /*e*/CREATE TABLE us1t1 (i int); CONNECT USER sa PASSWORD ""; /*u0*/GRANT r1 TO us1; -- us1: t1 rights via role r1 CONNECT USER us1 PASSWORD us1; /*c2*/SELECT * FROM public.t1; /*e*/CREATE TABLE us1t1 (i int); CONNECT USER sa PASSWORD ""; /*u0*/REVOKE ALL ON t1 FROM r1 RESTRICT; -- us1: no privs CONNECT USER us1 PASSWORD us1; /*e*/SELECT * FROM public.t1; /*e*/CREATE TABLE us1t1 (i int); CONNECT USER sa PASSWORD ""; /*u0*/GRANT ALL ON t1 TO r1; -- us1: t1 rights via role r1 CONNECT USER us1 PASSWORD us1; /*c2*/SELECT * FROM public.t1; /*e*/CREATE TABLE us1t1 (i int); CONNECT USER sa PASSWORD ""; /*u0*/DROP ROLE r1; -- us1: no privs CONNECT USER us1 PASSWORD us1; /*e*/SELECT * FROM public.t1; /*e*/CREATE TABLE us1t1 (i int); CONNECT USER sa PASSWORD ''; /*u0*/GRANT SELECT ON t1 TO us1; -- us1: t1 rights via role table right CONNECT USER us1 PASSWORD us1; /*c2*/SELECT * FROM public.t1; /*e*/CREATE TABLE us1t1 (i int); CONNECT USER sa PASSWORD ""; /*u0*/REVOKE ALL ON t1 FROM us1 RESTRICT; -- Role nesting CREATE ROLE r1; CONNECT USER us1 PASSWORD us1; /*e*/CREATE TABLE us1t1 (i int); CONNECT USER sa PASSWORD ""; GRANT r1 TO us1; CONNECT USER us1 PASSWORD us1; /*e*/CREATE TABLE us1t1 (i int); CONNECT USER sa PASSWORD ""; GRANT dba TO r1; CONNECT USER us1 PASSWORD us1; /*u0*/CREATE TABLE us1t1 (i int); /*u0*/DROP TABLE us1t1; CONNECT USER sa PASSWORD ""; REVOKE dba FROM r1 RESTRICT; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfInterval.txt0000644000175000017500000000434712007547346023103 0ustar renerene-- TESTS FOR DATETIME AND INTERVAL /*r 1999-12-31 00:00:00.900000 */CALL TIMESTAMP '2000-01-01 02:02:03.000000' - INTERVAL '01 02:02:02.1' DAY TO SECOND; /*r 1999-12-31 00:00:00.000000 */CALL TIMESTAMP '2000-01-01 02:02:02.123456' - INTERVAL '01 02:02:02.123456' DAY TO SECOND(6); /*e*//CALL TIMESTAMP(6) '2000-01-01 02:02:02.123456'; /*r 1999-12-31 00:00:00.023456 */CALL TIMESTAMP '2000-01-01 02:02:02.123456' - INTERVAL '01 02:02:02.10' DAY TO SECOND; /*r 1999-12-31 00:00:00.020 */CALL TIMESTAMP '2000-01-01 02:02:02.120' - INTERVAL '01 02:02:02.10' DAY TO SECOND; /*r -0 00:01:00.0 */CALL INTERVAL '01 02:02:02.1' DAY TO SECOND - INTERVAL '01 02:03:02.1' DAY TO SECOND; /*r 1 02:02:00.02000000 */CALL INTERVAL '01 02:02:02.12' DAY(3) TO SECOND(8) - INTERVAL '02.1' SECOND(2,3); /*r 1 02:02:00.0 */CALL INTERVAL '01 02:02:02.12345' DAY(2) TO SECOND(1) - INTERVAL '02.1' SECOND(2,1); /*r 1 00:00:00.000000 */CALL (TIMESTAMP '2000-01-02 02:02:03.000000' - TIMESTAMP '2000-01-01 02:02:03.000000') DAY TO SECOND; /*r 1 00:00:00.180000 */CALL (TIMESTAMP '2000-01-02 02:02:03.2' - TIMESTAMP '2000-01-01 02:02:03.02') DAY TO SECOND; /*r 1 */CALL TIMESTAMPDIFF(SQL_TSI_YEAR, TIMESTAMP '2002-01-02 02:02:03.02', TIMESTAMP '2003-01-01 02:02:03.2') /*r 4 */CALL TIMESTAMPDIFF(SQL_TSI_QUARTER, TIMESTAMP '2002-01-02 02:02:03.02', TIMESTAMP '2003-01-01 02:02:03.2') /*r 12 */CALL TIMESTAMPDIFF(SQL_TSI_MONTH, TIMESTAMP '2002-01-02 02:02:03.02', TIMESTAMP '2003-01-01 02:02:03.2') /*r 52 */CALL TIMESTAMPDIFF(SQL_TSI_WEEK, TIMESTAMP '2002-01-02 02:02:03.02', TIMESTAMP '2003-01-01 02:02:03.2') /*r 364 */CALL TIMESTAMPDIFF(SQL_TSI_DAY, TIMESTAMP '2002-01-02 02:02:03.02', TIMESTAMP '2003-01-01 02:02:03.2') /*r 8760 */CALL TIMESTAMPDIFF(SQL_TSI_HOUR, TIMESTAMP '2002-01-01 02:02:03.02', TIMESTAMP '2003-01-01 02:02:03.2') /*r 525600 */CALL TIMESTAMPDIFF(SQL_TSI_MINUTE, TIMESTAMP '2002-01-01 02:02:03.02', TIMESTAMP '2003-01-01 02:02:03.2') /*r 31536000 */CALL TIMESTAMPDIFF(SQL_TSI_SECOND, TIMESTAMP '2002-01-01 02:02:03.02', TIMESTAMP '2003-01-01 02:02:03.2') /*r 31536000180000000 */CALL TIMESTAMPDIFF(SQL_TSI_FRAC_SECOND, TIMESTAMP '2002-01-01 02:02:03.02', TIMESTAMP '2003-01-01 02:02:03.2') hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSchemaPersistC1.txt0000644000175000017500000005566012007547344024257 0ustar renerene-- This script series tests ALT commands on schema objects, including -- persistence. ALTER USER involves no schemas. -- Commands tested: ALTER INDEX, ALTER SEQUENCE, ALTER TABLE -- The blaine schema will exist if a previous script created it already. /*s*/DROP SCHEMA blaine CASCADE; /*u0*/CREATE SCHEMA blaine authorization dba; -- PREP -- Create a zillion simple objects to play with /*u0*/SET SCHEMA public; DROP TABLE public.mt00 IF EXISTS; DROP TABLE public.mt01 IF EXISTS; DROP TABLE public.mt02 IF EXISTS; DROP TABLE public.mt03 IF EXISTS; DROP TABLE mt04 IF EXISTS; DROP TABLE mt05 IF EXISTS; DROP TABLE mt06 IF EXISTS; DROP TABLE mt07 IF EXISTS; DROP TABLE public.mt08 IF EXISTS; DROP TABLE public.mt09 IF EXISTS; DROP TABLE public.mt10 IF EXISTS; DROP TABLE public.mt11 IF EXISTS; DROP TABLE public.mt12 IF EXISTS; DROP TABLE public.mt13 IF EXISTS; DROP TABLE mt14 IF EXISTS; DROP TABLE mt15 IF EXISTS; DROP TABLE mt16 IF EXISTS; DROP TABLE mt17 IF EXISTS; DROP TABLE public.mt18 IF EXISTS; DROP TABLE public.mt19 IF EXISTS; DROP TABLE public.mt20 IF EXISTS; DROP TABLE public.mt21 IF EXISTS; DROP TABLE public.mt22 IF EXISTS; DROP TABLE public.mt23 IF EXISTS; DROP TABLE public.mt24 IF EXISTS; DROP TABLE public.mt25 IF EXISTS; DROP TABLE public.mt26 IF EXISTS; DROP TABLE public.mt27 IF EXISTS; DROP TABLE public.mt28 IF EXISTS; DROP TABLE public.mt29 IF EXISTS; DROP TABLE ct00 IF EXISTS; DROP TABLE ct01 IF EXISTS; DROP TABLE ct02 IF EXISTS; DROP TABLE ct03 IF EXISTS; DROP TABLE ct04 IF EXISTS; DROP TABLE ct05 IF EXISTS; DROP TABLE ct06 IF EXISTS; DROP TABLE ct07 IF EXISTS; DROP TABLE ct08 IF EXISTS; DROP TABLE ct09 IF EXISTS; DROP TABLE ct10 IF EXISTS; DROP TABLE ct11 IF EXISTS; DROP TABLE ct12 IF EXISTS; DROP TABLE ct13 IF EXISTS; DROP TABLE ct14 IF EXISTS; DROP TABLE ct15 IF EXISTS; DROP TABLE ct16 IF EXISTS; DROP TABLE ct17 IF EXISTS; DROP TABLE ct18 IF EXISTS; DROP TABLE ct19 IF EXISTS; DROP TABLE t101 IF EXISTS; CREATE TABLE mt00 (i int); CREATE TABLE mt01 (i int); CREATE TABLE mt02 (i int); /*u0*/SET SCHEMA blaine; CREATE TABLE public.mt03 (i int); CREATE TABLE public.mt04 (i int); CREATE TABLE public.mt05 (i int); CREATE TABLE public.mt06 (i int); CREATE TABLE public.mt07 (i int); /*u0*/SET SCHEMA public; CREATE TABLE mt08 (i int); CREATE TABLE mt09 (i int); CREATE TABLE mt10 (i int); CREATE TABLE mt11 (i int); CREATE TABLE mt12 (i int); /*u0*/SET SCHEMA blaine; CREATE TABLE public.mt13 (i int); CREATE TABLE public.mt14 (i int); CREATE TABLE public.mt15 (i int); CREATE TABLE public.mt16 (i int); CREATE TABLE public.mt17 (i int); /*u0*/SET SCHEMA public; CREATE TABLE mt18 (i int); CREATE TABLE mt19 (i int); CREATE TABLE mt20 (i int); CREATE TABLE mt21 (i int); CREATE TABLE mt22 (i int); CREATE TABLE mt23 (i int); CREATE TABLE mt24 (i int); CREATE TABLE mt25 (i int); CREATE TABLE mt26 (i int); CREATE TABLE mt27 (i int); CREATE TABLE mt28 (i int); CREATE TABLE mt29 (i int); CREATE CACHED TABLE ct00 (i int); CREATE CACHED TABLE ct01 (i int); CREATE CACHED TABLE ct02 (i int); /*u0*/SET SCHEMA blaine; CREATE CACHED TABLE public.ct03 (i int); CREATE CACHED TABLE public.ct04 (i int); CREATE CACHED TABLE public.ct05 (i int); CREATE CACHED TABLE public.ct06 (i int); CREATE CACHED TABLE public.ct07 (i int); /*u0*/SET SCHEMA public; CREATE CACHED TABLE ct08 (i int); CREATE CACHED TABLE ct09 (i int); CREATE CACHED TABLE ct10 (i int); CREATE CACHED TABLE ct11 (i int); CREATE CACHED TABLE ct12 (i int); /*u0*/SET SCHEMA blaine; CREATE CACHED TABLE public.ct13 (i int); CREATE CACHED TABLE public.ct14 (i int); CREATE CACHED TABLE public.ct15 (i int); CREATE CACHED TABLE public.ct16 (i int); CREATE CACHED TABLE public.ct17 (i int); /*u0*/SET SCHEMA public; CREATE CACHED TABLE ct18 (i int); CREATE CACHED TABLE ct19 (i int); DROP INDEX mi00 IF EXISTS; DROP INDEX mi01 IF EXISTS; DROP INDEX mi02 IF EXISTS; DROP INDEX mi03 IF EXISTS; DROP INDEX mi04 IF EXISTS; DROP INDEX mui05 IF EXISTS; DROP INDEX mui06 IF EXISTS; DROP INDEX mui07 IF EXISTS; DROP INDEX mui08 IF EXISTS; DROP INDEX mui09 IF EXISTS; DROP INDEX ci00 IF EXISTS; DROP INDEX ci01 IF EXISTS; DROP INDEX ci02 IF EXISTS; DROP INDEX ci03 IF EXISTS; DROP INDEX ci04 IF EXISTS; DROP INDEX cui05 IF EXISTS; DROP INDEX cui06 IF EXISTS; DROP INDEX cui07 IF EXISTS; DROP INDEX cui08 IF EXISTS; DROP INDEX cui09 IF EXISTS; DROP INDEX i101 IF EXISTS; CREATE INDEX mi00 ON mt00 (i); CREATE INDEX mi01 ON mt01 (i); CREATE INDEX mi02 ON mt02 (i); CREATE INDEX mi03 ON mt03 (i); CREATE INDEX mi04 ON mt04 (i); /*u0*/SET SCHEMA blaine; CREATE INDEX public.mui05 ON public.mt05 (i); CREATE INDEX public.mui06 ON public.mt06 (i); CREATE INDEX public.mui07 ON public.mt07 (i); CREATE INDEX public.mui08 ON public.mt08 (i); CREATE INDEX public.mui09 ON public.mt09 (i); CREATE INDEX public.ci00 ON public.ct00 (i); CREATE INDEX public.ci01 ON public.ct01 (i); CREATE INDEX public.ci02 ON public.ct02 (i); CREATE INDEX public.ci03 ON public.ct03 (i); CREATE INDEX public.ci04 ON public.ct04 (i); CREATE INDEX public.cui05 ON public.ct05 (i); /*u0*/SET SCHEMA public; CREATE INDEX cui06 ON ct06 (i); CREATE INDEX cui07 ON ct07 (i); CREATE INDEX cui08 ON ct08 (i); CREATE INDEX cui09 ON ct09 (i); CREATE SEQUENCE s00; CREATE SEQUENCE s01; CREATE SEQUENCE s02; /*u0*/SET SCHEMA blaine; CREATE SEQUENCE public.s03; CREATE SEQUENCE public.s04; CREATE SEQUENCE public.s05; CREATE SEQUENCE public.s06; CREATE SEQUENCE public.s07; /*u0*/SET SCHEMA public; CREATE SEQUENCE s08; CREATE SEQUENCE s09; CREATE SEQUENCE s10; CREATE SEQUENCE s11; /*u0*/SET SCHEMA blaine; CREATE SEQUENCE public.s12; CREATE SEQUENCE public.s13; CREATE SEQUENCE public.s14; CREATE SEQUENCE public.s15; CREATE SEQUENCE public.s16; /*u0*/SET SCHEMA public; CREATE SEQUENCE s17; CREATE SEQUENCE s18; CREATE SEQUENCE s19; -- blaine schema /*u0*/ SET SCHEMA blaine; DROP TABLE bmt00 IF EXISTS; DROP TABLE bmt01 IF EXISTS; DROP TABLE bmt02 IF EXISTS; DROP TABLE bmt03 IF EXISTS; DROP TABLE bmt04 IF EXISTS; DROP TABLE bmt05 IF EXISTS; DROP TABLE bmt06 IF EXISTS; DROP TABLE bmt07 IF EXISTS; DROP TABLE bmt08 IF EXISTS; DROP TABLE bmt09 IF EXISTS; DROP TABLE bmt10 IF EXISTS; DROP TABLE bmt11 IF EXISTS; DROP TABLE bmt12 IF EXISTS; DROP TABLE bmt13 IF EXISTS; DROP TABLE bmt14 IF EXISTS; DROP TABLE bmt15 IF EXISTS; DROP TABLE bmt16 IF EXISTS; DROP TABLE bmt17 IF EXISTS; DROP TABLE bmt18 IF EXISTS; DROP TABLE bmt19 IF EXISTS; DROP TABLE bmt20 IF EXISTS; DROP TABLE bmt21 IF EXISTS; DROP TABLE bmt22 IF EXISTS; DROP TABLE bmt23 IF EXISTS; DROP TABLE bmt24 IF EXISTS; DROP TABLE bmt25 IF EXISTS; DROP TABLE bmt26 IF EXISTS; DROP TABLE bmt27 IF EXISTS; DROP TABLE bmt28 IF EXISTS; DROP TABLE bmt29 IF EXISTS; DROP TABLE bct00 IF EXISTS; DROP TABLE bct01 IF EXISTS; DROP TABLE bct02 IF EXISTS; DROP TABLE bct03 IF EXISTS; DROP TABLE bct04 IF EXISTS; DROP TABLE bct05 IF EXISTS; DROP TABLE bct06 IF EXISTS; DROP TABLE bct07 IF EXISTS; DROP TABLE bct08 IF EXISTS; DROP TABLE bct09 IF EXISTS; DROP TABLE bct10 IF EXISTS; DROP TABLE bct11 IF EXISTS; DROP TABLE bct12 IF EXISTS; DROP TABLE bct13 IF EXISTS; DROP TABLE bct14 IF EXISTS; DROP TABLE bct15 IF EXISTS; DROP TABLE bct16 IF EXISTS; DROP TABLE bct17 IF EXISTS; DROP TABLE bct18 IF EXISTS; DROP TABLE bct19 IF EXISTS; DROP TABLE bt101 IF EXISTS; CREATE TABLE bmt00 (i int); CREATE TABLE bmt01 (i int); CREATE TABLE bmt02 (i int); /*u0*/SET SCHEMA public; CREATE TABLE blaine.bmt03 (i int); CREATE TABLE blaine.bmt04 (i int); CREATE TABLE blaine.bmt05 (i int); CREATE TABLE blaine.bmt06 (i int); CREATE TABLE blaine.bmt07 (i int); /*u0*/SET SCHEMA blaine; CREATE TABLE bmt08 (i int); CREATE TABLE bmt09 (i int); CREATE TABLE bmt10 (i int); CREATE TABLE bmt11 (i int); CREATE TABLE bmt12 (i int); /*u0*/SET SCHEMA public; CREATE TABLE blaine.bmt13 (i int); CREATE TABLE blaine.bmt14 (i int); CREATE TABLE blaine.bmt15 (i int); CREATE TABLE blaine.bmt16 (i int); CREATE TABLE blaine.bmt17 (i int); /*u0*/SET SCHEMA blaine; CREATE TABLE bmt18 (i int); CREATE TABLE bmt19 (i int); CREATE TABLE bmt20 (i int); CREATE TABLE bmt21 (i int); CREATE TABLE bmt22 (i int); CREATE TABLE bmt23 (i int); CREATE TABLE bmt24 (i int); CREATE TABLE bmt25 (i int); CREATE TABLE bmt26 (i int); CREATE TABLE bmt27 (i int); CREATE TABLE bmt28 (i int); CREATE TABLE bmt29 (i int); CREATE CACHED TABLE bct00 (i int); CREATE CACHED TABLE bct01 (i int); CREATE CACHED TABLE bct02 (i int); /*u0*/SET SCHEMA public; CREATE CACHED TABLE blaine.bct03 (i int); CREATE CACHED TABLE blaine.bct04 (i int); CREATE CACHED TABLE blaine.bct05 (i int); CREATE CACHED TABLE blaine.bct06 (i int); CREATE CACHED TABLE blaine.bct07 (i int); /*u0*/SET SCHEMA blaine; CREATE CACHED TABLE bct08 (i int); CREATE CACHED TABLE bct09 (i int); CREATE CACHED TABLE bct10 (i int); CREATE CACHED TABLE bct11 (i int); CREATE CACHED TABLE bct12 (i int); /*u0*/SET SCHEMA public; CREATE CACHED TABLE blaine.bct13 (i int); CREATE CACHED TABLE blaine.bct14 (i int); CREATE CACHED TABLE blaine.bct15 (i int); CREATE CACHED TABLE blaine.bct16 (i int); CREATE CACHED TABLE blaine.bct17 (i int); /*u0*/SET SCHEMA blaine; CREATE CACHED TABLE bct18 (i int); CREATE CACHED TABLE bct19 (i int); DROP INDEX bmi00 IF EXISTS; DROP INDEX bmi01 IF EXISTS; DROP INDEX bmi02 IF EXISTS; DROP INDEX bmi03 IF EXISTS; DROP INDEX bmi04 IF EXISTS; DROP INDEX bmui05 IF EXISTS; DROP INDEX bmui06 IF EXISTS; DROP INDEX bmui07 IF EXISTS; DROP INDEX bmui08 IF EXISTS; DROP INDEX bmui09 IF EXISTS; DROP INDEX bci00 IF EXISTS; DROP INDEX bci01 IF EXISTS; DROP INDEX bci02 IF EXISTS; DROP INDEX bci03 IF EXISTS; DROP INDEX bci04 IF EXISTS; DROP INDEX bcui05 IF EXISTS; DROP INDEX bcui06 IF EXISTS; DROP INDEX bcui07 IF EXISTS; DROP INDEX bcui08 IF EXISTS; DROP INDEX bcui09 IF EXISTS; DROP INDEX bi101 IF EXISTS; CREATE INDEX bmi00 ON bmt00 (i); CREATE INDEX bmi01 ON bmt01 (i); CREATE INDEX bmi02 ON bmt02 (i); CREATE INDEX bmi03 ON bmt03 (i); CREATE INDEX bmi04 ON bmt04 (i); /*u0*/SET SCHEMA public; CREATE INDEX blaine.bmui05 ON blaine.bmt05 (i); CREATE INDEX blaine.bmui06 ON blaine.bmt06 (i); CREATE INDEX blaine.bmui07 ON blaine.bmt07 (i); CREATE INDEX blaine.bmui08 ON blaine.bmt08 (i); CREATE INDEX blaine.bmui09 ON blaine.bmt09 (i); /*u0*/SET SCHEMA blaine; CREATE INDEX bci00 ON bct00 (i); CREATE INDEX bci01 ON bct01 (i); CREATE INDEX bci02 ON bct02 (i); CREATE INDEX bci03 ON bct03 (i); CREATE INDEX bci04 ON bct04 (i); /*u0*/SET SCHEMA public; CREATE INDEX blaine.bcui05 ON blaine.bct05 (i); CREATE INDEX blaine.bcui06 ON blaine.bct06 (i); CREATE INDEX blaine.bcui07 ON blaine.bct07 (i); CREATE INDEX blaine.bcui08 ON blaine.bct08 (i); CREATE INDEX blaine.bcui09 ON blaine.bct09 (i); CREATE SEQUENCE blaine.bs00; CREATE SEQUENCE blaine.bs01; CREATE SEQUENCE blaine.bs02; CREATE SEQUENCE blaine.bs03; /*u0*/SET SCHEMA blaine; CREATE SEQUENCE bs04; CREATE SEQUENCE bs05; CREATE SEQUENCE bs06; CREATE SEQUENCE bs07; CREATE SEQUENCE bs08; /*u0*/SET SCHEMA public; CREATE SEQUENCE blaine.bs09; CREATE SEQUENCE blaine.bs10; CREATE SEQUENCE blaine.bs11; CREATE SEQUENCE blaine.bs12; /*u0*/SET SCHEMA blaine; CREATE SEQUENCE bs13; CREATE SEQUENCE bs14; CREATE SEQUENCE bs15; CREATE SEQUENCE bs16; CREATE SEQUENCE bs17; /*u0*/SET SCHEMA public; CREATE SEQUENCE blaine.bs18; CREATE SEQUENCE blaine.bs19; -- These are the only tests for SEQUENCEs in this script. SEQUENCES -- The only ALTER command for sequences is here. INSERT INTO public.mt01 VALUES(0); INSERT INTO blaine.bmt01 VALUES(0); /*u0*/SET SCHEMA blaine; /*r0*/SELECT next value FOR public.s00 FROM public.mt01; /*r1*/SELECT next value FOR public.s00 FROM public.mt01; /*r0*/SELECT next value FOR public.s04 FROM blaine.bmt01; /*r1*/SELECT next value FOR public.s04 FROM blaine.bmt01; /*u0*/SET SCHEMA public; /*r0*/SELECT next value FOR public.s01 FROM mt01; /*r1*/SELECT next value FOR public.s01 FROM mt01; /*r0*/SELECT next value FOR s02 FROM public.mt01; /*r1*/SELECT next value FOR s02 FROM public.mt01; /*r0*/SELECT next value FOR s03 FROM mt01; /*r1*/SELECT next value FOR s03 FROM mt01; /*r0*/SELECT next value FOR blaine.bs00 FROM blaine.bmt01; -- Sequence inherits default schema from Session, not table. /*e*/SELECT next value FOR bs00 FROM blaine.bmt01; /*r0*/SELECT next value FOR blaine.bs04 FROM public.mt01; /*r1*/SELECT next value FOR blaine.bs04 FROM public.mt01; /*u0*/SET SCHEMA blaine; /*r0*/SELECT next value FOR blaine.bs01 FROM bmt01; /*r1*/SELECT next value FOR blaine.bs01 FROM bmt01; /*r0*/SELECT next value FOR bs02 FROM blaine.bmt01; /*r1*/SELECT next value FOR bs02 FROM blaine.bmt01; /*r0*/SELECT next value FOR bs03 FROM bmt01; /*r1*/SELECT next value FOR bs03 FROM bmt01; /*u0*/ALTER SEQUENCE public.s00 RESTART WITH 21; /*u0*/ALTER SEQUENCE bs00 RESTART WITH 22; /*u0*/SET SCHEMA public; /*u0*/ALTER SEQUENCE blaine.bs01 RESTART WITH 23; /*u0*/ALTER SEQUENCE s01 RESTART WITH 24; /*r21*/SELECT next value FOR public.s00 FROM public.mt01; /*r22*/SELECT next value FOR blaine.bs00 FROM public.mt01; /*r23*/SELECT next value FOR blaine.bs01 FROM public.mt01; /*r24*/SELECT next value FOR s01 FROM public.mt01; -- May only rename: Indexes, Tables, Columns RENAMES -- (Will only test Column renames if I have time) -- Can't change schemas for existing objects. -- 1st all permutations of PUBLICs -> blaines /*e*/SELECT * FROM blaine.rbmt00; /*e*/SELECT * FROM blaine.rbct00; /*e*/SELECT * FROM public.rmt00; /*e*/SELECT * FROM public.cmt00; /*u0*/SET SCHEMA public; /*e*/ALTER INDEX mi00 RENAME TO blaine.bi101; /*e*/ALTER INDEX mui05 RENAME TO blaine.bi101; /*e*/ALTER TABLE mt10 RENAME TO blaine.bt101; /*e*/ALTER TABLE ct10 RENAME TO blaine.bt101; /*e*/ALTER INDEX public.mi00 RENAME TO blaine.bi101; /*e*/ALTER INDEX public.mui05 RENAME TO blaine.bi101; /*e*/ALTER TABLE public.mt10 RENAME TO blaine.bt101; /*e*/ALTER TABLE public.ct10 RENAME TO blaine.bt101; /*e*/ALTER INDEX blaine.mi00 RENAME TO public.bi101; /*e*/ALTER INDEX blaine.mui05 RENAME TO public.bi101; /*u0*/SET SCHEMA blaine; /*e*/ALTER TABLE mt10 RENAME TO public.bt101; /*e*/ALTER TABLE ct10 RENAME TO public.bt101; /*u0*/SET SCHEMA public; /*u0*/ALTER TABLE blaine.bmt00 RENAME TO rbmt00; /*u0*/ALTER TABLE blaine.bct00 RENAME TO blaine.rbct00; /*u0*/ALTER INDEX blaine.bmi00 RENAME TO rbmi00; /*u0*/SET SCHEMA blaine; /*u0*/ALTER INDEX bci00 RENAME TO rbci00; /*u0*/ALTER INDEX public.mi00 RENAME TO public.rmi00; /*u0*/ALTER INDEX public.ci00 RENAME TO rci00; /*u0*/SET SCHEMA public; /*u0*/ALTER TABLE public.mt00 RENAME TO public.rmt00; /*u0*/ALTER TABLE ct00 RENAME TO rct00; /*u0*/SET SCHEMA public; /*u0*/ALTER INDEX blaine.bmui05 RENAME TO rbmui05; /*u0*/SET SCHEMA blaine; /*u0*/ALTER INDEX bcui05 RENAME TO rbcui05; /*u0*/ALTER INDEX public.mui05 RENAME TO public.rmui05; /*u0*/ALTER INDEX public.cui05 RENAME TO rcui05; /*u0*/SET SCHEMA public; /*e*/ALTER INDEX public.mui05 RENAME TO blaine.bi101; /*e*/ALTER TABLE public.mt10 RENAME TO blaine.bt101; /*e*/ALTER TABLE public.ct10 RENAME TO blaine.bt101; /*e*/ALTER INDEX public.mi00 RENAME TO blaine.bi101; /*e*/ALTER INDEX public.mui05 RENAME TO blaine.bi101; /*e*/ALTER TABLE public.mt10 RENAME TO blaine.bt101; /*e*/ALTER TABLE public.ct10 RENAME TO blaine.bt101; /*c0*/SELECT * FROM blaine.rbmt00; /*c0*/SELECT * FROM blaine.rbct00; /*c0*/SELECT * FROM public.rmt00; /*c0*/SELECT * FROM public.rct00; -- The only schema-specific ALTERs left are ALTER TABLE ADD/DROP CONS -- ADD NAMED Check/Unique CONSTRAINTS -- First, CHECK constraints on MEM tables /*e*/ALTER TABLE public.mt11 ADD CONSTRAINT blaine.mt11ck1 CHECK (i > 0); /*e*/ALTER TABLE blaine.bmt11 ADD CONSTRAINT public.bmt11ck1 CHECK (i > 0); /*e*/ALTER TABLE mt11 ADD CONSTRAINT blaine.mt11ck1 CHECK (i > 0); /*u0*/ALTER TABLE mt11 ADD CONSTRAINT mt11ck1 CHECK (i > 0); /*u0*/ALTER TABLE mt12 ADD CONSTRAINT public.mt12ck1 CHECK (i = 1); SET SCHEMA blaine; /*u0*/ALTER TABLE public.mt13 ADD CONSTRAINT mt13ck1 CHECK (i in (1, 2, 3)); /*u0*/ALTER TABLE public.mt14 ADD CONSTRAINT public.mt14ck1 CHECK (i != 0); /*e*/ALTER TABLE blaine.bmt11 ADD CONSTRAINT public.bmt11ck1 CHECK (i > 0); /*e*/ALTER TABLE public.mt11 ADD CONSTRAINT blaine.mt11ck1 CHECK (i > 0); /*e*/ALTER TABLE bmt11 ADD CONSTRAINT public.bmt11ck1 CHECK (i > 0); /*u0*/ALTER TABLE bmt11 ADD CONSTRAINT bmt11ck1 CHECK (i > 0); /*u0*/ALTER TABLE bmt12 ADD CONSTRAINT blaine.bmt12ck1 CHECK (i = 1); SET SCHEMA public; /*u0*/ALTER TABLE blaine.bmt13 ADD CONSTRAINT bmt13ck1 CHECK (i in (1, 2, 3)); /*u0*/ALTER TABLE blaine.bmt14 ADD CONSTRAINT blaine.bmt14ck1 CHECK (i != 0); /*e*/INSERT INTO public.mt11 values(0); /*e*/INSERT INTO public.mt12 values(0); /*e*/INSERT INTO public.mt13 values(0); /*e*/INSERT INTO public.mt14 values(0); /*e*/INSERT INTO blaine.bmt11 values(0); /*e*/INSERT INTO blaine.bmt12 values(0); /*e*/INSERT INTO blaine.bmt13 values(0); /*e*/INSERT INTO blaine.bmt14 values(0); /*u1*/INSERT INTO public.mt11 values(1); /*u1*/INSERT INTO public.mt12 values(1); /*u1*/INSERT INTO public.mt13 values(1); /*u1*/INSERT INTO public.mt14 values(1); /*u1*/INSERT INTO blaine.bmt11 values(1); /*u1*/INSERT INTO blaine.bmt12 values(1); /*u1*/INSERT INTO blaine.bmt13 values(1); /*u1*/INSERT INTO blaine.bmt14 values(1); -- Now, UNIQUE constraints on CACHED tables /*e*/ALTER TABLE public.ct11 ADD CONSTRAINT blaine.ct11ck1 UNIQUE (i); /*e*/ALTER TABLE blaine.bct11 ADD CONSTRAINT public.bct11ck1 UNIQUE (i); /*e*/ALTER TABLE ct11 ADD CONSTRAINT blaine.ct11ck1 UNIQUE (i); /*u0*/ALTER TABLE ct11 ADD CONSTRAINT ct11ck1 UNIQUE (i); /*u0*/ALTER TABLE ct12 ADD CONSTRAINT public.ct12ck1 UNIQUE (i); SET SCHEMA blaine; /*u0*/ALTER TABLE public.ct13 ADD CONSTRAINT ct13ck1 UNIQUE (i); /*u0*/ALTER TABLE public.ct14 ADD CONSTRAINT public.ct14ck1 UNIQUE (i); /*e*/ALTER TABLE blaine.bct11 ADD CONSTRAINT public.bct11ck1 UNIQUE (i); /*e*/ALTER TABLE public.ct11 ADD CONSTRAINT blaine.ct11ck1 UNIQUE (i); /*e*/ALTER TABLE bct11 ADD CONSTRAINT public.bct11ck1 UNIQUE (i); /*u0*/ALTER TABLE bct11 ADD CONSTRAINT bct11ck1 UNIQUE (i); /*u0*/ALTER TABLE bct12 ADD CONSTRAINT blaine.bct12ck1 UNIQUE (i); SET SCHEMA public; /*u0*/ALTER TABLE blaine.bct13 ADD CONSTRAINT bct13ck1 UNIQUE (i); /*u0*/ALTER TABLE blaine.bct14 ADD CONSTRAINT blaine.bct14ck1 UNIQUE (i); /*u1*/INSERT INTO public.ct11 values(1); /*u1*/INSERT INTO public.ct12 values(1); /*u1*/INSERT INTO public.ct13 values(1); /*u1*/INSERT INTO public.ct14 values(1); /*u1*/INSERT INTO blaine.bct11 values(1); /*u1*/INSERT INTO blaine.bct12 values(1); /*u1*/INSERT INTO blaine.bct13 values(1); /*u1*/INSERT INTO blaine.bct14 values(1); /*e*/INSERT INTO public.ct11 values(1); /*e*/INSERT INTO public.ct12 values(1); /*e*/INSERT INTO public.ct13 values(1); /*e*/INSERT INTO public.ct14 values(1); /*e*/INSERT INTO blaine.bct11 values(1); /*e*/INSERT INTO blaine.bct12 values(1); /*e*/INSERT INTO blaine.bct13 values(1); /*e*/INSERT INTO blaine.bct14 values(1); -- ADD UNNAMED FK CONSTRAINTS -- Index some MEM tables to reference. (table ct1[1-4],bct1[1-4] already set). ALTER TABLE public.mt15 ADD unique(i); ALTER TABLE public.mt16 ADD unique(i); ALTER TABLE public.mt17 ADD unique(i); ALTER TABLE public.mt18 ADD unique(i); ALTER TABLE blaine.bmt15 ADD unique(i); ALTER TABLE blaine.bmt16 ADD unique(i); ALTER TABLE blaine.bmt17 ADD unique(i); ALTER TABLE blaine.bmt18 ADD unique(i); INSERT INTO public.mt15 VALUES(10); INSERT INTO public.mt16 VALUES(10); INSERT INTO public.mt17 VALUES(10); INSERT INTO public.mt18 VALUES(10); INSERT INTO blaine.bmt15 VALUES(10); INSERT INTO blaine.bmt16 VALUES(10); INSERT INTO blaine.bmt17 VALUES(10); INSERT INTO blaine.bmt18 VALUES(10); /*u0*/ALTER TABLE ct15 ADD FOREIGN KEY (i) REFERENCES mt15 (i); /*u0*/ALTER TABLE ct16 ADD FOREIGN KEY (i) REFERENCES blaine.bct11 (i); /*e*/ALTER TABLE public.ct16 ADD FOREIGN KEY (i) REFERENCES blaine.bct11 (i); /*u0*/ALTER TABLE ct16 ADD FOREIGN KEY (i) REFERENCES public.mt16 (i); SET SCHEMA blaine; /*u0*/ALTER TABLE public.ct17 ADD FOREIGN KEY (i) REFERENCES public.mt17 (i); /*e*/ALTER TABLE public.ct17 ADD FOREIGN KEY (i) REFERENCES public.mt17 (i); /*u0*/ALTER TABLE public.ct18 ADD FOREIGN KEY (i) REFERENCES mt18 (i); -- fks can't reference tables in other schemas. /*u0*/ALTER TABLE bct15 ADD FOREIGN KEY (i) REFERENCES public.mt15 (i); SET SCHEMA public; /*u0*/ALTER TABLE blaine.bct17 ADD FOREIGN KEY (i) REFERENCES blaine.bmt17 (i); /*u0*/ALTER TABLE blaine.bct18 ADD FOREIGN KEY (i) REFERENCES bmt18 (i); /*u1*/INSERT INTO public.ct15 values(10); /*e*/INSERT INTO public.ct16 values(10); /*u1*/INSERT INTO public.ct17 values(10); /*u1*/INSERT INTO blaine.bct18 values(10); /*u1*/INSERT INTO blaine.bct17 values(10); /*e*/INSERT INTO public.ct15 values(9); /*e*/INSERT INTO public.ct16 values(9); /*e*/INSERT INTO public.ct17 values(9); /*e*/INSERT INTO public.bct18 values(9); /*e*/INSERT INTO blaine.bct17 values(9); -- Finally, ADD NAMED FK CONSTRAINTS -- (TARGETS ct1[1-4],bct1[1-4] already set). SET SCHEMA blaine; /*e*/ALTER TABLE bmt21 ADD CONSTRAINT public.bmt21fk FOREIGN KEY (i) REFERENCES blaine.bct11 (i); /*e*/ALTER TABLE bmt20 ADD CONSTRAINT public.bmt20fk FOREIGN KEY (i) REFERENCES bct12 (i); /*u0*/ALTER TABLE bmt21 ADD CONSTRAINT bmt21fk FOREIGN KEY (i) REFERENCES blaine.bct11 (i); /*e*/ALTER TABLE bmt21 ADD CONSTRAINT bmt21fk FOREIGN KEY (i) REFERENCES blaine.bct11 (i); -- Already exists /*u0*/ALTER TABLE bmt20 ADD CONSTRAINT blaine.cmt20fk FOREIGN KEY (i) REFERENCES bct12 (i); /*e*/ALTER TABLE bmt20 ADD CONSTRAINT blaine.cmt20fk FOREIGN KEY (i) REFERENCES bct12 (i); -- Already exists SET SCHEMA public; /*e*/ALTER TABLE blaine.bmt22 ADD CONSTRAINT public.bmt22fk FOREIGN KEY (i) REFERENCES blaine.bct13 (i); /*e*/ALTER TABLE blaine.bmt23 ADD CONSTRAINT public.bmt23fk FOREIGN KEY (i) REFERENCES bct14 (i); /*u0*/ALTER TABLE blaine.bmt22 ADD CONSTRAINT bmt2fk FOREIGN KEY (i) REFERENCES blaine.bct13 (i); /*u0*/ALTER TABLE blaine.bmt23 ADD CONSTRAINT blaine.bmt23fk FOREIGN KEY (i) REFERENCES bct14 (i); SET SCHEMA blaine; /*e*/ALTER TABLE bmt24 ADD CONSTRAINT public.bmt24fk FOREIGN KEY (i) REFERENCES public.ct11 (i); /*u0*/ALTER TABLE bmt24 ADD CONSTRAINT blaine.bmt24fk FOREIGN KEY (i) REFERENCES public.ct11 (i); SET SCHEMA public; /*e*/ALTER TABLE blaine.bmt22 ADD CONSTRAINT public.bmt22fk FOREIGN KEY (i) REFERENCES blaine.bct13 (i); /*u0*/ALTER TABLE blaine.bmt25 ADD CONSTRAINT bmt25fk FOREIGN KEY (i) REFERENCES bct14 (i); /*e*/INSERT INTO blaine.bmt21 VALUES (0); /*u1*/INSERT INTO blaine.bmt21 VALUES (1); /*e*/INSERT INTO blaine.bmt20 VALUES (0); /*u1*/INSERT INTO blaine.bmt20 VALUES (1); /*e*/INSERT INTO blaine.bmt22 VALUES (0); /*u1*/INSERT INTO blaine.bmt22 VALUES (1); /*e*/INSERT INTO blaine.bmt23 VALUES (0); /*u1*/INSERT INTO blaine.bmt23 VALUES (1); /*e*/INSERT INTO blaine.bmt25 VALUES (0); /*u1*/INSERT INTO blaine.bmt25 VALUES (1); SHUTDOWN IMMEDIATELY; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestTriggers.txt0000644000175000017500000000262112007547346022264 0ustar renerenedrop table testtrig if exists; create cached table testtrig(c1 integer generated by default as identity, c2 varchar(40), c3 integer); create trigger tbir before insert on testtrig referencing new row as newrow for each row when (newrow.c2 is not null) call "org.hsqldb.test.TriggerClass"; create trigger tair after insert on testtrig referencing new row as newrow for each row when (newrow.c2 is not null) call "org.hsqldb.test.TriggerClass"; create trigger tais after insert on testtrig for each statement call "org.hsqldb.test.TriggerClass"; create trigger tbur before update of c1, c2, c3 on testtrig referencing new row as newrow for each row when (newrow.c2 is not null) call "org.hsqldb.test.TriggerClass"; create trigger taur after update on testtrig referencing new row as newrow for each row when (newrow.c2 is not null) call "org.hsqldb.test.TriggerClass"; create trigger taus after update on testtrig for each statement call "org.hsqldb.test.TriggerClass"; create trigger tbdr before delete on testtrig referencing old row as oldrow for each row when (oldrow.c2 is not null) call "org.hsqldb.test.TriggerClass"; create trigger tadr after delete on testtrig referencing old row as oldrow for each row when (oldrow.c2 is not null) call "org.hsqldb.test.TriggerClass"; create trigger tads after delete on testtrig for each statement call "org.hsqldb.test.TriggerClass"; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSchemaPersistB1.txt0000644000175000017500000007575012007547346024262 0ustar renerene-- CREATE AND INITIALIZE OBJECTS -- This CREATES the schema-specific objects to be used for -- schema-specific persistence tests. -- (See the *C[12].txt scripts for similar tests of ALTER comands (which -- this script purposefully omits). -- This *1.txt script tests whether objects can/do get CREATED in the correct -- schemas, since there is no reason why that would change in consequent -- connections to the same database (*[23].txt scripts). -- This script must, of course, persist objects in different specific -- schemas so that scripts *[23] may verify that they continue to reside -- and be accessible only in the correct schema. -- In the main (object-type-specific) test blocks, for every command that -- has ALL SCHEMA OBJECTS explicitly specified, -- I always do a SET SCHEMA so that an accidental -- fallback to Session schema will always lead to a test failure. -- ****************************** Schemas -- Non-persistence Schema testing. -- Test the _INITIAL_ Session default schema (currently "PUBLIC"). -- After the objects are created in the correct schema, it makes no difference -- whether the "INITIAL" schema was used or not. Therefore, no need to test -- this stuff in scripts *[23].txt. DROP TABLE public.pschct1 IF exists; DROP TABLE public.pschct2 IF exists; DROP TABLE public.pschct3 IF exists; DROP VIEW public.pschv1 IF exists; DROP VIEW public.pschv2 IF exists; DROP INDEX public.pschi1 IF exists; DROP TABLE public.pscht1 IF exists; DROP TABLE public.pscht2 IF exists; -- Verify all SELECTs fail before we start /*e*/SELECT * FROM public.pscht1; /*e*/SELECT * FROM public.pscht2; /*e*/SELECT * FROM public.pschv1; /*e*/SELECT * FROM public.pschv2; /*e*/SELECT * FROM public.pschct1; /*e*/SELECT * FROM public.pschct2; /*e*/SELECT * FROM public.pschct3; /*e*/SELECT * FROM blaine.pscht1; /*e*/SELECT * FROM blaine.pscht2; /*e*/SELECT * FROM blaine.pschv1; /*e*/SELECT * FROM blaine.pschv2; /*e*/SELECT * FROM blaine.pschct1; /*e*/SELECT * FROM blaine.pschct2; /*e*/SELECT * FROM blaine.pschct3; /*e*/SELECT * FROM pscht1; /*e*/SELECT * FROM pscht2; /*e*/SELECT * FROM pschv1; /*e*/SELECT * FROM pschv2; /*e*/SELECT * FROM pschct1; /*e*/SELECT * FROM pschct2; /*e*/SELECT * FROM pschct3; /*u0*/CREATE TABLE pscht1 (i int); /*u1*/INSERT INTO pscht1 values(0); /*u1*/INSERT INTO pscht1 values(1); /*u0*/CREATE UNIQUE INDEX pschi1 ON pscht1(i); /*e*/INSERT INTO pscht1 values(1); /*u0*/CREATE TABLE pscht2 (i int); /*u1*/INSERT INTO pscht2 values(0); /*u1*/INSERT INTO pscht2 values(1); /*u0*/CREATE VIEW pschv1 AS SELECT * FROM pscht1; /*u0*/CREATE VIEW pschv2 AS SELECT * FROM public.pscht1; -- Create then remove using explicit schema. This is a workaround for no -- DROP TRIGGER... IF EXISTS; /*u0*/CREATE TRIGGER public.ptrig1 AFTER INSERT ON pscht1 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; DROP TRIGGER public.ptrig1; /*u0*/CREATE TRIGGER ptrig1 AFTER INSERT ON pscht1 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; /*u0*/CREATE TRIGGER public.ptrig2 AFTER INSERT ON public.pscht2 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; DROP TRIGGER public.ptrig2; /*u0*/CREATE TRIGGER ptrig2 AFTER INSERT ON public.pscht2 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; /*u0*/CREATE TABLE pschct1 (i int, CONSTRAINT pschuc1 UNIQUE(i)); /*u0*/CREATE TABLE public.pschct2 (i int, CONSTRAINT pschuc2 UNIQUE(i)); /*u0*/CREATE TABLE pschct3 (i int, CONSTRAINT public.pschuc3 UNIQUE(i)); /*u1*/INSERT INTO pschct1 values(0); /*u1*/INSERT INTO pschct2 values(0); /*u1*/INSERT INTO pschct3 values(0); /*e*/INSERT INTO pschct1 values(0); /*e*/INSERT INTO pschct2 values(0); /*e*/INSERT INTO pschct3 values(0); -- Verify created in correct schemas /*c2*/SELECT * FROM public.pscht1; /*c2*/SELECT * FROM public.pscht2; /*c2*/SELECT * FROM public.pschv1; /*c2*/SELECT * FROM public.pschv2; /*c1*/SELECT * FROM public.pschct1; /*c1*/SELECT * FROM public.pschct2; /*c1*/SELECT * FROM public.pschct3; /*e*/CREATE TRIGGER public.ptrig1 AFTER INSERT ON pscht1 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; /*e*/CREATE TRIGGER public.ptrig2 AFTER INSERT ON public.pscht1 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; /*e*/SELECT * FROM blaine.pscht1; /*e*/SELECT * FROM blaine.pscht2; /*e*/SELECT * FROM blaine.pschv1; /*e*/SELECT * FROM blaine.pschv2; /*e*/SELECT * FROM blaine.pschct1; /*e*/SELECT * FROM blaine.pschct2; /*e*/SELECT * FROM blaine.pschct3; -- Verify SELECTs using default schema /*c2*/SELECT * FROM pscht1; /*c2*/SELECT * FROM pscht2; /*c2*/SELECT * FROM pschv1; /*c2*/SELECT * FROM pschv2; /*c1*/SELECT * FROM pschct1; /*c1*/SELECT * FROM pschct2; /*c1*/SELECT * FROM pschct3; -- Following 2 just to confirm that TRIGGERs created. /*e*/CREATE TRIGGER ptrig1 AFTER INSERT ON pscht1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/CREATE TRIGGER public.ptrig2 AFTER INSERT ON public.pscht1 CALL "org.hsqldb.test.BlaineTrig"; /*u0*/CREATE SCHEMA blaine AUTHORIZATION dba; /*e*/CREATE SCHEMA blaine AUTHORIZATION dba; /*u0*/SET SCHEMA blaine; -- Verify created in correct schemas /*c2*/SELECT * FROM public.pscht1; /*c2*/SELECT * FROM public.pscht2; /*c2*/SELECT * FROM public.pschv1; /*c2*/SELECT * FROM public.pschv2; /*c1*/SELECT * FROM public.pschct1; /*c1*/SELECT * FROM public.pschct2; /*c1*/SELECT * FROM public.pschct3; -- Following 2 just to confirm that TRIGGERs created. /*e*/CREATE TRIGGER public.ptrig1 AFTER INSERT ON pscht1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/CREATE TRIGGER public.ptrig2 AFTER INSERT ON public.pscht1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/SELECT * FROM blaine.pscht1; /*e*/SELECT * FROM blaine.pscht2; /*e*/SELECT * FROM blaine.pschv1; /*e*/SELECT * FROM blaine.pschv2; /*e*/SELECT * FROM blaine.pschct1; /*e*/SELECT * FROM blaine.pschct2; /*e*/SELECT * FROM blaine.pschct3; -- Verify SELECTs using default schema /*e*/SELECT * FROM pscht1; /*e*/SELECT * FROM pscht2; /*e*/SELECT * FROM pschv1; /*e*/SELECT * FROM pschv2; /*e*/SELECT * FROM pschct1; /*e*/SELECT * FROM pschct2; /*e*/SELECT * FROM pschct3; -- Test of SET SCHEMA /*u0*/SET SCHEMA public; /*c2*/SELECT * FROM public.pscht1; /*c2*/SELECT * FROM public.pscht2; /*c2*/SELECT * FROM public.pschv1; /*c2*/SELECT * FROM public.pschv2; /*c1*/SELECT * FROM public.pschct1; /*c1*/SELECT * FROM public.pschct2; /*c1*/SELECT * FROM public.pschct3; -- Following 2 just to confirm that TRIGGERs created. /*e*/CREATE TRIGGER public.ptrig1 AFTER INSERT ON pscht1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/CREATE TRIGGER public.ptrig2 AFTER INSERT ON public.pscht1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/SELECT * FROM blaine.pscht1; /*e*/SELECT * FROM blaine.pscht2; /*e*/SELECT * FROM blaine.pschv1; /*e*/SELECT * FROM blaine.pschv2; /*e*/SELECT * FROM blaine.pschct1; /*e*/SELECT * FROM blaine.pschct2; /*e*/SELECT * FROM blaine.pschct3; -- Verify SELECTs using default schema /*c2*/SELECT * FROM public.pscht1; -- Sanity check DEBUG /*u0*/SET SCHEMA public; -- Sanity check DEBUG /*c2*/SELECT * FROM pscht1; /*c2*/SELECT * FROM pscht2; /*c2*/SELECT * FROM pschv1; /*c2*/SELECT * FROM pschv2; /*c1*/SELECT * FROM pschct1; /*c1*/SELECT * FROM pschct2; /*c1*/SELECT * FROM pschct3; -- Following 2 just to confirm that TRIGGERs created. /*e*/CREATE TRIGGER ptrig1 AFTER INSERT ON pscht1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/CREATE TRIGGER public.ptrig2 AFTER INSERT ON public.pscht1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/SET SCHEMA nosuch; /*u0*/SET SCHEMA blaine; -- ****************************** MEM Tables /*e*/DROP TABLE nosuch; DROP TABLE xtblt1 IF exists; DROP TABLE xtblt2 IF exists; DROP TABLE xtblt3 IF exists; DROP TABLE xtblt4 IF exists; DROP TABLE xtblt101 IF exists; DROP TABLE xtblj1 IF exists; /*u0*/CREATE TABLE xtblt1 (i int); SET SCHEMA public; /*u0*/CREATE TABLE blaine.xtblt2 (i int); SET SCHEMA blaine; /*u0*/CREATE TABLE xtblt3 (i int); /*u0*/CREATE TABLE xtblj1 (i int, vc varchar(10)); -- For testing Joins /*e*/CREATE TABLE information_schema.xtblt101 (i int); /*e*/CREATE TABLE xtblt1 (i int); -- Create existing object SET SCHEMA public; /*e*/CREATE TABLE blaine.xtblt1 (i int); -- Create existing object SET SCHEMA blaine; /*e*/CREATE TABLE information_schema.system_users (i int); -- Existing object /*e*/INSERT INTO other.xtblt1 values(0); /*e*/INSERT INTO information_schema.xtblt1 values(1); /*u1*/INSERT INTO xtblt1 values(0); SET SCHEMA public; /*u1*/INSERT INTO blaine.xtblt1 values(100); SET SCHEMA blaine; -- Test one update that will be persisted (most update tests won't be) SET SCHEMA public; /*u1*/UPDATE blaine.xtblt1 set i = 1 WHERE i = 100; SET SCHEMA blaine; /*u1*/INSERT INTO xtblj1 values(1, 'one'); SET SCHEMA public; CREATE TABLE blaine.xtblt4 AS (SELECT * FROM blaine.xtblt1 WHERE i = 0) WITH DATA; /*c1*/SELECT * FROM blaine.xtblt4; SET SCHEMA blaine; -- ****************************** CACH Tables /*e*/DROP TABLE nosuch; DROP TABLE xctblt1 IF exists; DROP TABLE xctblt2 IF exists; DROP TABLE xctblt3 IF exists; DROP TABLE xctblt4 IF exists; DROP TABLE xctblt101 IF exists; DROP TABLE xtblj1 IF exists; /*u0*/CREATE CACHED TABLE xctblt1 (i int); SET SCHEMA public; /*u0*/CREATE CACHED TABLE blaine.xctblt2 (i int); SET SCHEMA blaine; /*u0*/CREATE CACHED TABLE xctblt3 (i int); /*u0*/CREATE CACHED TABLE xtblj1 (i int, vc varchar(10)); -- For testing Joins /*e*/CREATE CACHED TABLE information_schema.xctblt101 (i int); /*e*/CREATE CACHED TABLE xctblt1 (i int); -- Create existing object SET SCHEMA public; /*e*/CREATE CACHED TABLE blaine.xctblt1 (i int); -- Create existing object SET SCHEMA blaine; /*e*/CREATE CACHED TABLE information_schema.system_users (i int); -- Existing object /*e*/INSERT INTO other.xctblt1 values(0); /*e*/INSERT INTO information_schema.xctblt1 values(1); /*u1*/INSERT INTO xctblt1 values(0); SET SCHEMA public; /*u1*/INSERT INTO blaine.xctblt1 values(100); -- Test one update that will be persisted (most update tests won't be) /*u1*/UPDATE blaine.xctblt1 set i = 1 WHERE i = 100; SET SCHEMA blaine; /*u1*/INSERT INTO xtblj1 values(1, 'one'); SET SCHEMA public; CREATE TABLE blaine.xctblt4 AS (SELECT * FROM blaine.xctblt1 WHERE i = 0) WITH DATA; /*c1*/SELECT * FROM blaine.xctblt4; SET SCHEMA blaine; -- ****************************** Views DROP VIEW xvwv1 IF exists; DROP VIEW xvwv2 IF exists; DROP VIEW xvwv3 IF exists; DROP VIEW xvwv4 IF exists; DROP VIEW xvwv5 IF exists; DROP VIEW xvwv6 IF exists; DROP VIEW xvwv7 IF exists; DROP VIEW xvwv8 IF exists; DROP VIEW xvwv9 IF exists; DROP VIEW xvwv10 IF exists; DROP VIEW xvwv11 IF exists; DROP VIEW xvwv12 IF exists; DROP VIEW xvwv13 IF exists; DROP VIEW xvwv14 IF exists; DROP VIEW xvwv15 IF exists; DROP VIEW xvwv16 IF exists; DROP VIEW xvwv17 IF exists; DROP VIEW xvwv18 IF exists; DROP VIEW xvwv19 IF exists; DROP VIEW xvwv20 IF exists; DROP VIEW xvwv21 IF exists; DROP VIEW xvwv22 IF exists; DROP VIEW xvwv23 IF exists; DROP VIEW xvwv24 IF exists; DROP VIEW xvwv25 IF exists; DROP VIEW xvwv26 IF exists; DROP VIEW xvwv27 IF exists; DROP VIEW xvwv101 IF exists; DROP TABLE xvwt1 IF exists; DROP TABLE xvwt2 IF exists; DROP TABLE xvwj1 IF exists; DROP TABLE public.pubtbl IF exists; CREATE TABLE xvwt1 (i int); CREATE TABLE xvwj1 (i int, vc varchar(10)); CREATE TABLE public.pubtbl (i int); INSERT INTO public.pubtbl values(0); INSERT INTO xvwt1 values(0); INSERT INTO xvwt1 values(1); INSERT INTO xvwj1 values(1, 'one'); /*e*/CREATE VIEW information_schema.xvwv101 AS SELECT * FROM information_schema.system_users; /*e*/CREATE VIEW information_schema.xvwv101 AS SELECT * FROM xvwt1; SET SCHEMA public; /*e*/CREATE VIEW information_schema.xvwv4 AS SELECT * FROM blaine.xvwt1; SET SCHEMA blaine; /*e*/CREATE VIEW xvwv101 AS SELECT * FROM other.xvwt1; SET SCHEMA public; /*e*/CREATE VIEW blaine.xvwv101 AS SELECT * FROM other.xvwt1; SET SCHEMA blaine; /*e*/CREATE VIEW other.xvwv101 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE user_name = vc; SET SCHEMA public; /*e*/CREATE VIEW other.xvwv101 AS SELECT * FROM information_schema.system_users, blaine.xvwj1 WHERE user_name = vc; SET SCHEMA blaine; /*e*/CREATE VIEW other.xvwv101 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE information_schema.user_name = vc; /*e*/CREATE VIEW other.xvwv101 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE information_schema.user_name = blaine.vc; /*e*/CREATE VIEW information_schema.xvwv101 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE user_name = vc; SET SCHEMA public; /*e*/CREATE VIEW information_schema.xvwv101 AS SELECT * FROM information_schema.system_users, blaine.xvwj1 WHERE user_name = vc; SET SCHEMA blaine; /*e*/CREATE VIEW information_schema.xvwv101 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE information_schema.user_name = vc; /*e*/CREATE VIEW information_schema.xvwv101 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE information_schema.user_name = blaine.vc; /*e*/CREATE VIEW xvwv101 AS SELECT * FROM system_users, xvwj1 WHERE user_name = vc; /*e*/CREATE VIEW xvwv101 AS SELECT * FROM information_schema.system_users, information_schema.xvwj1 WHERE user_name = vc; /*e*/CREATE VIEW xvwv101 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE other.user_name = vc; /*e*/CREATE VIEW xvwv101 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE blaine.user_name = blaine.vc; /*c2*/SELECT * FROM xvwt1; -- Sanity check /*u0*/CREATE VIEW xvwv1 AS SELECT * FROM xvwt1; /*e*/CREATE VIEW blaine.xvwv1 AS SELECT * FROM xvwt1; -- Create existing object SET SCHEMA public; /*e*/CREATE VIEW blaine.xvwv1 AS SELECT * FROM blaine.xvwt1; -- Existing object SET SCHEMA blaine; /*u0*/CREATE VIEW blaine.xvwv2 AS SELECT * FROM xvwt1; SET SCHEMA public; /*u0*/CREATE VIEW blaine.xvwv3 AS SELECT * FROM blaine.xvwt1; SET SCHEMA blaine; /*u0*/CREATE VIEW blaine.xvwv4 AS SELECT * FROM xvwt1 WHERE i = 0; /*u0*/CREATE VIEW blaine.xvwv5 AS SELECT * FROM xvwt1 WHERE i < 1; SET SCHEMA public; /*u0*/CREATE VIEW blaine.xvwv6 AS SELECT * FROM information_schema.system_users WHERE user_name = 'SA'; SET SCHEMA blaine; /*u0*/CREATE VIEW xvwv7 AS SELECT * FROM information_schema.system_users; /*u0*/CREATE VIEW xvwv8 AS SELECT * FROM information_schema.system_users WHERE user_name = 'SA'; /*u0*/CREATE VIEW xvwv9 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE user_name = vc; /*u0*/CREATE VIEW xvwv10 AS SELECT * FROM information_schema.system_users, blaine.xvwj1 WHERE user_name = vc; /*u0*/CREATE VIEW xvwv11 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE system_users.user_name = vc; /*u0*/CREATE VIEW xvwv12 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE system_users.user_name = xvwj1.vc; SET SCHEMA public; -- Should FAIL because SEL sub-q gets default schema from Session default. /*e*/CREATE VIEW blaine.xvwv13 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE user_name = vc; /*u0*/CREATE VIEW blaine.xvwv14 AS SELECT * FROM information_schema.system_users, blaine.xvwj1 WHERE user_name = vc; SET SCHEMA blaine; /*u0*/CREATE VIEW blaine.xvwv15 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE system_users.user_name = vc; /*u0*/CREATE VIEW blaine.xvwv16 AS SELECT * FROM information_schema.system_users, blaine.xvwj1 WHERE system_users.user_name = xvwj1.vc; /*u0*/CREATE VIEW xvwv17 AS SELECT * FROM information_schema.system_users, xvwj1 WHERE user_name = vc; /*u0*/CREATE VIEW xvwv18 AS SELECT * FROM information_schema.system_users, blaine.xvwj1 WHERE user_name = vc; /*u0*/CREATE VIEW xvwv19 (v1, v2, v3) AS SELECT * FROM xvwt1, xvwj1 WHERE xvwt1.i = xvwj1.i; /*u0*/CREATE VIEW xvwv20 (v1, v2, v3) AS SELECT * FROM blaine.xvwt1, blaine.xvwj1 WHERE xvwt1.i = xvwj1.i; /*u0*/CREATE VIEW xvwv21 (v1, v2, v3) AS SELECT * FROM blaine.xvwt1, xvwj1 WHERE xvwt1.i = xvwj1.i; /*u0*/CREATE VIEW xvwv22 (v1, v2, v3) AS SELECT * FROM xvwt1, blaine.xvwj1 WHERE xvwt1.i = xvwj1.i; /*u0*/CREATE VIEW blaine.xvwv23 (v1, v2, v3) AS SELECT * FROM xvwt1, xvwj1 WHERE xvwt1.i = xvwj1.i; SET SCHEMA public; /*u0*/CREATE VIEW blaine.xvwv24 (v1, v2, v3) AS SELECT * FROM blaine.xvwt1, blaine.xvwj1 WHERE xvwt1.i = xvwj1.i; -- Sub-SEL (2nd) should default to public schema!: (don't know 'bout 1st SEL) /*e*/CREATE VIEW blaine.xvwv101 AS SELECT * FROM xvwt1 WHERE xvwt1.i = (SELECT i FROM xvwj1); /*e*/CREATE VIEW blaine.xvwv101 AS SELECT * FROM blaine.xvwt1 WHERE xvwt1.i = (SELECT i FROM xvwj1); SET SCHEMA blaine; /*u0*/CREATE VIEW blaine.xvwv25 (v1, v2, v3) AS SELECT * FROM blaine.xvwt1, xvwj1 WHERE xvwt1.i = xvwj1.i; /*u0*/CREATE VIEW blaine.xvwv26 (v1, v2, v3) AS SELECT * FROM xvwt1, blaine.xvwj1 WHERE xvwt1.i = xvwj1.i; -- We do not permit views to reference tables in another schema, except -- for information_schema. /*u0*/CREATE VIEW blaine.xvwv27 AS SELECT * FROM public.pubtbl; /*u0*/CREATE VIEW xvwv28 AS SELECT * FROM xvwt1 WHERE i in (0, 1, 11, 12); /*u0*/CREATE VIEW blaine.xvwv29 AS SELECT * FROM xvwt1 WHERE i < 1; /*u0*/CREATE VIEW xvwv30 AS SELECT * FROM xvwt1 WHERE xvwt1.i = (SELECT i FROM xvwj1); /*u0*/CREATE VIEW xvwv31 AS SELECT * FROM xvwt1 WHERE xvwt1.i in (SELECT i FROM xvwj1); /*u0*/CREATE VIEW xvwv32 AS SELECT * FROM xvwt1 WHERE xvwt1.i = (SELECT i FROM xvwj1 WHERE i = 0); /*u0*/CREATE VIEW xvwv33 AS SELECT * FROM blaine.xvwt1 WHERE xvwt1.i = (SELECT i FROM xvwj1); SET SCHEMA public; -- (2nd SEL sub-query) should use Session default schema /*e*/CREATE VIEW blaine.xvwv101 AS SELECT * FROM blaine.xvwt1 WHERE xvwt1.i in (SELECT i FROM xvwj1); SET SCHEMA blaine; /*u0*/CREATE VIEW blaine.xvwv34 AS SELECT * FROM blaine.xvwt1 WHERE xvwt1.i in (SELECT i FROM xvwj1); /*u0*/CREATE VIEW blaine.xvwv35 AS SELECT * FROM blaine.xvwt1 WHERE xvwt1.i = (SELECT i FROM xvwj1 WHERE i = 0); /*u0*/CREATE VIEW blaine.xvwv36 AS SELECT * FROM xvwt1 WHERE xvwt1.i = (SELECT i FROM blaine.xvwj1); /*u0*/CREATE VIEW blaine.xvwv37 AS SELECT * FROM xvwt1 WHERE xvwt1.i in (SELECT i FROM blaine.xvwj1); /*u0*/CREATE VIEW blaine.xvwv38 AS SELECT * FROM xvwt1 WHERE xvwt1.i = (SELECT i FROM blaine.xvwj1 WHERE i = 1); /*u0*/CREATE VIEW blaine.xvwv39 AS SELECT * FROM xvwt1 WHERE xvwt1.i = (SELECT xvwj1.i FROM blaine.xvwj1); /*u0*/CREATE VIEW blaine.xvwv40 AS SELECT * FROM xvwt1 WHERE xvwt1.i in (SELECT xvwj1.i FROM xvwj1); /*u0*/CREATE VIEW blaine.xvwv41 AS SELECT * FROM xvwt1 WHERE xvwt1.i = (SELECT xvwj1.i FROM xvwj1 WHERE i = 1); /*u0*/CREATE VIEW blaine.xvwv42 AS SELECT * FROM xvwt1 WHERE xvwt1.i = (SELECT i FROM blaine.xvwj1 WHERE xvwj1.i = 1); /*u0*/CREATE VIEW blaine.xvwv43 AS SELECT * FROM xvwt1 WHERE xvwt1.i = (SELECT xvwj1.i FROM xvwj1 WHERE xvwj1.i = 1); /*u0*/CREATE VIEW blaine.xvwv44 AS SELECT * FROM xvwt1 WHERE i = (SELECT i FROM xvwj1); /*u0*/CREATE VIEW blaine.xvwv45 AS SELECT * FROM xvwt1 WHERE i in (SELECT i FROM xvwj1); /*u0*/CREATE VIEW blaine.xvwv46 AS SELECT * FROM xvwt1 WHERE i = (SELECT i FROM xvwj1 WHERE i = 1); /*u0*/CREATE VIEW blaine.xvwv47 AS SELECT * FROM blaine.xvwt1 WHERE i = (SELECT i FROM xvwj1); /*u0*/CREATE VIEW blaine.xvwv48 AS SELECT * FROM blaine.xvwt1 WHERE i in (SELECT i FROM xvwj1); /*u0*/CREATE VIEW blaine.xvwv49 AS SELECT * FROM blaine.xvwt1 WHERE i = (SELECT i FROM xvwj1 WHERE i = 1); /*u0*/CREATE VIEW blaine.xvwv50 AS SELECT * FROM xvwt1 WHERE i = (SELECT i FROM blaine.xvwj1); /*u0*/CREATE VIEW blaine.xvwv51 AS SELECT * FROM xvwt1 WHERE i in (SELECT i FROM blaine.xvwj1); /*u0*/CREATE VIEW blaine.xvwv52 AS SELECT * FROM xvwt1 WHERE i = (SELECT i FROM blaine.xvwj1 WHERE i = 1); /*u0*/CREATE VIEW blaine.xvwv53 AS SELECT * FROM xvwt1 WHERE i = (SELECT xvwj1.i FROM blaine.xvwj1); /*u0*/CREATE VIEW blaine.xvwv54 AS SELECT * FROM xvwt1 WHERE i in (SELECT xvwj1.i FROM xvwj1); /*u0*/CREATE VIEW blaine.xvwv55 AS SELECT * FROM xvwt1 WHERE i = (SELECT xvwj1.i FROM xvwj1 WHERE i = 1); /*u0*/CREATE VIEW blaine.xvwv56 AS SELECT * FROM xvwt1 WHERE i = (SELECT i FROM blaine.xvwj1 WHERE xvwj1.i = 1); /*u0*/CREATE VIEW blaine.xvwv57 AS SELECT * FROM xvwt1 WHERE i = (SELECT xvwj1.i FROM xvwj1 WHERE xvwj1.i = 1); /*e*/DROP VIEW other.xvwv1; /*e*/DROP VIEW information_schema.xvwv2; -- ****************************** MEM Indexes DROP INDEX xindi1 IF exists; DROP INDEX xindi2 IF exists; DROP INDEX xindi3 IF exists; DROP INDEX xindi4 IF exists; DROP INDEX xindi5 IF exists; DROP TABLE xindt1 IF exists; DROP TABLE xindt2 IF exists; DROP TABLE xindt3 IF exists; DROP TABLE xindt4 IF exists; DROP TABLE xindt101 IF exists; CREATE TABLE xindt1 (i int); INSERT INTO xindt1 values(0); INSERT INTO xindt1 values(1); CREATE TABLE xindt2 (i int); INSERT INTO xindt2 values(0); INSERT INTO xindt2 values(1); CREATE TABLE xindt3 (i int); INSERT INTO xindt3 values(0); INSERT INTO xindt3 values(1); CREATE TABLE xindt4 (i int); INSERT INTO xindt4 values(0); INSERT INTO xindt4 values(1); /*e*/CREATE UNIQUE INDEX other.xindi101 ON xindt4(i); /*e*/CREATE UNIQUE INDEX xindi101 ON xindt101(i); /*e*/CREATE UNIQUE INDEX blaine.xindi101 ON public.pscht2(i); /*e*/CREATE UNIQUE INDEX public.xindi101 ON xindt1(i); CREATE TABLE xindt101 (i int); INSERT INTO xindt101 values(0); INSERT INTO xindt101 values(1); /*e*/CREATE UNIQUE INDEX information_schema.xindi101 on xindt101(i int); /*u0*/CREATE UNIQUE INDEX xindi1 ON xindt1(i); /*e*/CREATE UNIQUE INDEX xindi1 ON xindt1(i); -- Create existing object /*u0*/CREATE UNIQUE INDEX blaine.xindi2 ON xindt2(i); /*e*/CREATE UNIQUE INDEX blaine.xindi2 ON xindt2(i); -- Create existing object /*u0*/CREATE UNIQUE INDEX xindi3 ON xindt3(i); SET SCHEMA public; /*u0*/CREATE UNIQUE INDEX xindi4 ON blaine.xindt4(i); SET SCHEMA blaine; -- The error message says that the schema name is invalid. -- Can only create indexes in same schema as target table. /*e*/CREATE UNIQUE INDEX xindi5 ON information_schema.system_users(user_name); /*e*/DROP INDEX other.xindi1; /*e*/DROP INDEX information_schema.xindi2; -- ****************************** CACH Indexes DROP INDEX xcindi1 IF exists; DROP INDEX xcindi2 IF exists; DROP INDEX xcindi3 IF exists; DROP INDEX xcindi4 IF exists; DROP INDEX xcindi5 IF exists; DROP TABLE xcindt1 IF exists; DROP TABLE xcindt2 IF exists; DROP TABLE xcindt3 IF exists; DROP TABLE xcindt4 IF exists; DROP TABLE xcindt101 IF exists; CREATE TABLE xcindt1 (i int); INSERT INTO xcindt1 values(0); INSERT INTO xcindt1 values(1); CREATE TABLE xcindt2 (i int); INSERT INTO xcindt2 values(0); INSERT INTO xcindt2 values(1); CREATE TABLE xcindt3 (i int); INSERT INTO xcindt3 values(0); INSERT INTO xcindt3 values(1); CREATE TABLE xcindt4 (i int); INSERT INTO xcindt4 values(0); INSERT INTO xcindt4 values(1); /*e*/CREATE UNIQUE INDEX other.xcindi101 on xcindt101(i); CREATE TABLE xcindt101 (i int); INSERT INTO xcindt101 values(0); INSERT INTO xcindt101 values(1); /*e*/CREATE UNIQUE INDEX information_schema.xcindi101 on xcindt101(i int); /*u0*/CREATE UNIQUE INDEX xcindi1 ON xcindt1(i); /*e*/CREATE UNIQUE INDEX xcindi1 ON xcindt1(i); -- Create existing object /*u0*/CREATE UNIQUE INDEX blaine.xcindi2 ON xcindt2(i); /*e*/CREATE UNIQUE INDEX blaine.xcindi2 ON xcindt2(i); -- Create existing object /*u0*/CREATE UNIQUE INDEX xcindi3 ON xcindt3(i); /*u0*/CREATE UNIQUE INDEX xcindi4 ON xcindt4(i); -- The error message says that the schema name is invalid. -- Can only create indexes in same schema as target table. /*e*/CREATE UNIQUE INDEX xcindi5 ON information_schema.system_users(user_name); /*e*/DROP INDEX other.xcindi1; /*e*/DROP INDEX information_schema.xcindi2; -- ****************************** Sequences DROP TABLE xseqt1 IF EXISTS; CREATE TABLE xseqt1 (i int); INSERT INTO xseqt1 VALUES(10); -- No "IF EXISTS" allowed with xsequences, so can't verify they don't exists. /*e*/CREATE SEQUENCE other.xs101; /*e*/CREATE SEQUENCE information_schema.xs101; /*u0*/CREATE SEQUENCE xs1; /*e*/CREATE SEQUENCE xs1; -- Create existing object SET SCHEMA public; /*u0*/CREATE SEQUENCE blaine.xs2; /*e*/CREATE SEQUENCE blaine.xs2; -- Create existing object -- To test persistence of incremented value: /*r0*/SELECT next value FOR blaine.xs2 FROM information_schema.system_users where user_name = 'SA'; SET SCHEMA blaine; /*r1*/SELECT next value FOR xs2 FROM information_schema.system_users where user_name = 'SA'; -- ****************************** Triggers DROP TABLE xtrgt1 IF EXISTS; DROP TABLE xtrgt2 IF EXISTS; DROP TABLE xtrgt3 IF EXISTS; DROP TABLE xtrgt4 IF EXISTS; DROP TABLE xtrgt101 IF EXISTS; -- No "IF EXISTS" allowed with triggers, so can't verify they don't exists. CREATE TABLE xtrgt1 (i int); CREATE TABLE xtrgt2 (i int); CREATE TABLE xtrgt3 (i int); CREATE TABLE xtrgt4 (i int); /*e*/CREATE TRIGGER other.xtrgtrig101 AFTER INSERT ON xtrgt1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/CREATE TRIGGER xtrgtrig101 AFTER INSERT ON other.xtrgt1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/CREATE TRIGGER xtrgtrig101 AFTER INSERT ON information_schema.xtrgt1 CALL "org.hsqldb.test.BlaineTrig"; /*e*/CREATE TRIGGER xtrgtrig101 AFTER INSERT ON xtrgt101 CALL "org.hsqldb.test.BlaineTrig"; /*u0*/CREATE TRIGGER xtrgtrig1 AFTER INSERT ON xtrgt1 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; /*u0*/CREATE TRIGGER blaine.xtrgtrig2 AFTER INSERT ON xtrgt2 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; /*u0*/CREATE TRIGGER xtrgtrig3 AFTER INSERT ON blaine.xtrgt3 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; SET SCHEMA public; /*u0*/CREATE TRIGGER blaine.xtrgtrig4 AFTER INSERT ON blaine.xtrgt4 QUEUE 0 CALL "org.hsqldb.test.BlaineTrig"; SET SCHEMA blaine; /*e*/DROP TRIGGER information_schema.xtrgtrig1; /*e*/DROP TRIGGER other.xtrgtrig1; -- ****************************** Constraints DROP TABLE xcont1 IF EXISTS; DROP TABLE xcont2 IF EXISTS; DROP TABLE xcont3 IF EXISTS; DROP TABLE xcont4 IF EXISTS; DROP TABLE xcont5 IF EXISTS; DROP TABLE xcont6 IF EXISTS; DROP TABLE xcont7 IF EXISTS; DROP TABLE xcont8 IF EXISTS; DROP TABLE xcont9 IF EXISTS; DROP TABLE xcont10 IF EXISTS; DROP TABLE xcont11 IF EXISTS; DROP TABLE xcont12 IF EXISTS; DROP TABLE xcont13 IF EXISTS; DROP TABLE xcont14 IF EXISTS; DROP TABLE xcont15 IF EXISTS; DROP TABLE xcont16 IF EXISTS; DROP TABLE xcont17 IF EXISTS; DROP TABLE xcont18 IF EXISTS; DROP TABLE xcont19 IF EXISTS; DROP TABLE xcont20 IF EXISTS; DROP TABLE xcont101 IF EXISTS; CREATE TABLE xconj1(i int, vc varchar(10), PRIMARY KEY (i)); INSERT INTO xconj1 values(1, 'one'); -- No "IF EXISTS" allowed with xconstrs., so can't verify they don't exists. /*e*/CREATE TABLE other.xcont101 (i int, CONSTRAINT xconuc1 UNIQUE(i)); /*e*/CREATE TABLE system_information.xcont1 (i int, CONSTRAINT xconuc1 UNIQUE(i)); /*u0*/CREATE TABLE xcont1 (i int, CONSTRAINT xconuc1 UNIQUE(i)); /*e*/CREATE TABLE xcont1 (i int, CONSTRAINT xconuc1 UNIQUE(i)); /*e*/CREATE TABLE xcont101 (i int, CONSTRAINT xconuc1 UNIQUE(i)); -- xconuc1 already exists /*e*/CREATE TABLE xcont101 (i int, CONSTRAINT blaine.xconuc1 UNIQUE(i)); -- ditto /*u0*/CREATE TABLE blaine.xcont2 (i int, CONSTRAINT xconuc2 UNIQUE(i)); /*e*/CREATE TABLE blaine.xcont101 (i int, CONSTRAINT xconuc2 UNIQUE(i)); -- xconuc2 already SET SCHEMA public; /*e*/CREATE TABLE blaine.xcont101 (i int, CONSTRAINT blaine.xconuc2 UNIQUE(i)); -- dit SET SCHEMA blaine; /*u0*/CREATE TABLE xcont3 (i int, CONSTRAINT blaine.xconuc3 UNIQUE(i)); SET SCHEMA public; /*u0*/CREATE TABLE blaine.xcont4 (i int, CONSTRAINT blaine.xconuc4 UNIQUE(i)); SET SCHEMA blaine; /*u0*/CREATE TABLE xcont5 (i int, CONSTRAINT xconpk5 PRIMARY KEY(i)); /*u0*/CREATE TABLE blaine.xcont6 (i int, CONSTRAINT xconpk6 PRIMARY KEY(i)); /*u0*/CREATE TABLE xcont7 (i int, CONSTRAINT blaine.xconpk7 PRIMARY KEY(i)); /*u0*/CREATE TABLE blaine.xcont8 (i int, CONSTRAINT blaine.xconpk8 PRIMARY KEY(i)); /*u0*/CREATE TABLE xcont9 (i int, CONSTRAINT xconfk9 FOREIGN KEY(i) REFERENCES xconj1(i)); /*e*/CREATE TABLE xcont101 (i int, CONSTRAINT xconfk9 FOREIGN KEY(i) REFERENCES other.xconj1(i)); /*e*/CREATE TABLE xcont101 (i int, CONSTRAINT xconfk9 FOREIGN KEY(i) REFERENCES information_schema.xconj1(i)); /*u0*/CREATE TABLE blaine.xcont10 (i int, CONSTRAINT xconfk10 FOREIGN KEY(i) REFERENCES xconj1(i)); /*u0*/CREATE TABLE xcont11 (i int, CONSTRAINT blaine.xconfk11 FOREIGN KEY(i) REFERENCES xconj1(i)); /*u0*/CREATE TABLE blaine.xcont12 (i int, CONSTRAINT blaine.xconfk12 FOREIGN KEY(i) REFERENCES xconj1(i)); -- Test prohibit create fk -> another-schema with every thing else ok. CREATE TABLE public.badtarget(i int, unique (i)); /*u0*/CREATE TABLE xcont13 (i int, CONSTRAINT xconfk13 FOREIGN KEY(i) REFERENCES public.badtarget(i)); /*e*/CREATE TABLE xcont13 (i int, CONSTRAINT xconfk13 FOREIGN KEY(i) REFERENCES blaine.xconj1(i)); /*u0*/CREATE TABLE blaine.xcont14 (i int, CONSTRAINT xconfk14 FOREIGN KEY(i) REFERENCES blaine.xconj1(i)); /*u0*/CREATE TABLE xcont15 (i int, CONSTRAINT blaine.xconfk15 FOREIGN KEY(i) REFERENCES blaine.xconj1(i)); SET SCHEMA public; /*u0*/CREATE TABLE blaine.xcont16 (i int, CONSTRAINT blaine.xconfk16 FOREIGN KEY(i) REFERENCES blaine.xconj1(i)); SET SCHEMA blaine; /*u0*/CREATE TABLE xcont17 (i int, CONSTRAINT xconc17 CHECK (i < 1)); /*u0*/CREATE TABLE blaine.xcont18 (i int, CONSTRAINT xconc18 CHECK (i in (0, 2))); /*u0*/CREATE TABLE xcont19 (i int, CONSTRAINT blaine.xconc19 CHECK (i = 0)); SET SCHEMA public; /*u0*/CREATE TABLE blaine.xcont20 (i int, CONSTRAINT blaine.xconc20 CHECK (i != 1)); -- schema definition with table, view and sequenence -- schema definition containing illegal DDL statement /*e*/CREATE SCHEMA FELIX AUTHORIZATION DBA CREATE TABLE FELIXT1 (AV1 VARCHAR(10), BV VARCHAR(10)) CREATE TABLE FELIXT2 (AV2 VARCHAR(10), BI INTEGER) CREATE SEQUENCE FELIXS1 CREATE VIEW FELIXV1 AS SELECT * FROM FELIXT1 JOIN FELIXT2 ON AV1 = AV2 CREATE VIEW FELIXV2 AS SELECT AV1 AS C1, NEXT VALUE FOR FELIXS1 AS C2 FROM FELIXT1 ALTER TABLE FELIXT1 ADD PRIMARY KEY; /*e*/SET SCHEMA FELIX /*e*/SELECT * FROM FELIX.FELIXT1 -- schema definition CREATE SCHEMA FELIX AUTHORIZATION DBA CREATE TABLE FELIXT1 (AV1 VARCHAR(10), BV VARCHAR(10)) CREATE TABLE FELIXT2 (AV2 VARCHAR(10), BI INTEGER) CREATE SEQUENCE FELIXS1 CREATE VIEW FELIXV1 AS SELECT * FROM FELIXT1 JOIN FELIXT2 ON AV1 = AV2 CREATE VIEW FELIXV2 AS SELECT AV1 AS C1, NEXT VALUE FOR FELIXS1 AS C2 FROM FELIXT1; /*e*/SELECT * FROM FELIXV1 SET SCHEMA FELIX /*c0*/SELECT * FROM FELIXV1 -- ****************************** ALTERs -- Add tests when time permits. /*u0*/SET SCHEMA blaine; -- Sanity. Cf. 1st 2 lines of B2 script. /*c2*/SELECT * FROM xtblt1; -- Sanity. Cf. 1st 2 lines of B2 script. -- This to test recovery from .log files. COMMIT; SHUTDOWN IMMEDIATELY; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfRightCaching.txt0000644000175000017500000001320212007547346023637 0ustar renerene-- Rights Map and Adminstrative Right Caching tests DROP TABLE m IF EXISTS; CREATE TABLE m(i int); INSERT INTO m VALUES(11); CREATE USER cani PASSWORD cani; /*u0*/GRANT CHANGE_AUTHORIZATION TO cani; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; -- Sanity check of individual grants for user and for public CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO PUBLIC; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM PUBLIC RESTRICT; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; -- Dual grants, but with SELECTs in between (which will rebuild the caches) CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO cani; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO PUBLIC; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM PUBLIC RESTRICT; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM cani RESTRICT; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; -- Dual grants. No cache build until both GRANTS added. CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO PUBLIC; GRANT SELECT ON m TO cani; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM PUBLIC RESTRICT; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM cani RESTRICT; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; -- Ditto, in different sequence. CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO cani; GRANT SELECT ON m TO PUBLIC; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM PUBLIC RESTRICT; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM cani RESTRICT; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; -- ... different sequence CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO PUBLIC; GRANT SELECT ON m TO cani; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM cani RESTRICT; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM PUBLIC RESTRICT; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; -- Ditto, in different sequence. CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO cani; GRANT SELECT ON m TO PUBLIC; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM cani RESTRICT; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM PUBLIC RESTRICT; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; -- REPEAT SAME WITH A NAMED ROLE INSTEAD OF PUBLIC CONNECT USER sa PASSWORD ""; CREATE ROLE sesamerole; GRANT sesamerole TO cani; -- Sanity check of individual grants for user and for sesamerole CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO sesamerole; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM sesamerole RESTRICT; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; -- Dual grants, but with SELECTs in between (which will rebuild the caches) CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO cani; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO sesamerole; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM sesamerole RESTRICT; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM cani RESTRICT; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; -- Dual grants. No cache build until both GRANTS added. CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO sesamerole; GRANT SELECT ON m TO cani; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM sesamerole RESTRICT; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM cani RESTRICT; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; -- Ditto, in different sequence. CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO cani; GRANT SELECT ON m TO sesamerole; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM sesamerole RESTRICT; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM cani RESTRICT; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; -- ... different sequence CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO sesamerole; GRANT SELECT ON m TO cani; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM cani RESTRICT; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM sesamerole RESTRICT; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; -- Ditto, in different sequence. CONNECT USER sa PASSWORD ""; GRANT SELECT ON m TO cani; GRANT SELECT ON m TO sesamerole; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM cani RESTRICT; CONNECT USER cani PASSWORD cani; /*c1*/SELECT * FROM m; CONNECT USER sa PASSWORD ""; REVOKE SELECT ON m FROM sesamerole RESTRICT; CONNECT USER cani PASSWORD cani; /*e*/SELECT * FROM m; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfInsertDeleteQueries.txt0000644000175000017500000000711512007547346025240 0ustar renerene-- -- TestSelfInsertDeleteQueries.txt -- -- Parser tests for insert and delete queries -- create cached table testtable ( aString varchar(256) not null, firstNum integer not null, aDate date not null, secondNum integer not null, thirdNum integer not null, aName varchar(32) not null ); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('Current', 22, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('Popular', 23, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('New', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('Old', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('CCurrent', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('ELV', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('ELNA', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('Older', 5, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('RA', 20, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE(aString, firstNum, aDate, secondNum, thirdNum, aName) values ('RP', 2, '2003-11-10', 18, 3, 'my name goes here'); insert into TESTTABLE values ('VS', 3, '2003-11-10', 18, 3, 'my name goes here'); -- /*c11*/select * from testtable where adate = '2003-11-10' and secondNum = 18; /*c11*/select * from testtable where adate = '2003-11-10'; /*c1*/select * from testtable where adate = '2003-11-10' and firstNum = 20; /*c11*/select * from testtable where adate = '2003-11-10' and thirdNum = 3; delete from TESTTABLE; insert into testtable values ('Current', 22, '2003-11-10', 18, 3, 'my name goes here'), ('Popular', 23, '2003-11-10', 18, 3, 'my name goes here'), ('New', 5, '2003-11-10', 18, 3, 'my name goes here'), ('Old', 5, '2003-11-10', 18, 3, 'my name goes here') /*c4*/select * from testtable; update testtable set (astring, firstnum, adate, secondnum, thirdnum, aname) = ('Older', 5, '2003-11-10', 18, 3, 'my name goes here') where astring = 'Old' -- create table tt (col varchar(256)); insert into tt (col) select aString from testtable; insert into tt (col) select aString from testtable union select aName from testtable; insert into tt (col) (select aString from testtable union select aName from testtable); insert into tt (col) ((select aString from testtable union select aName from testtable) intersect select aString from testtable where firstNum = 20); insert into tt select aString from testtable; insert into tt select aString from testtable union select aName from testtable; insert into tt (select aString from testtable union select aName from testtable); insert into tt ((select aString from testtable union select aName from testtable) intersect select aString from testtable where firstNum = 20); drop table tt; drop table testtable; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSchemaPerCachTbl2.txt0000644000175000017500000001667612007547346024501 0ustar renerene-- TEST CACHED TABLE OBJECTS -- This TESTS the schema-specific objects created in a previous script. CREATE USER otheruser PASSWORD otheruser; -- ****************************** CACH Tables /*c2*/SELECT * FROM ctblt1; /*c1*/SELECT * FROM ctblt1 WHERE i = 0; /*c2*/SELECT * FROM ctblt1 WHERE i in (0, 1, 11, 12); /*c1*/SELECT * FROM ctblt1 WHERE i < 1; /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT i FROM tblj1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT i FROM tblj1 WHERE tblj1.i = 1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i in (SELECT i FROM tblj1); /*c0*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT i FROM tblj1 WHERE i = 0); /*c1*/SELECT * FROM public.ctblt1 WHERE ctblt1.i = (SELECT i FROM tblj1); /*c1*/SELECT * FROM public.ctblt1 WHERE ctblt1.i in (SELECT i FROM tblj1); /*c1*/SELECT * FROM public.ctblt1 WHERE ctblt1.i = (SELECT i FROM tblj1 WHERE i = 1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT i FROM public.tblj1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i in (SELECT i FROM public.tblj1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT i FROM public.tblj1 WHERE i = 1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT tblj1.i FROM public.tblj1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i in (SELECT tblj1.i FROM tblj1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT tblj1.i FROM tblj1 WHERE i = 1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT i FROM public.tblj1 WHERE tblj1.i = 1); /*c1*/SELECT * FROM ctblt1 WHERE ctblt1.i = (SELECT tblj1.i FROM tblj1 WHERE tblj1.i = 1); /*c1*/SELECT * FROM ctblt1 WHERE i = (SELECT i FROM tblj1); /*c1*/SELECT * FROM ctblt1 WHERE i in (SELECT i FROM tblj1); /*c1*/SELECT * FROM ctblt1 WHERE i = (SELECT i FROM tblj1 WHERE i = 1); /*c1*/SELECT * FROM public.ctblt1 WHERE i = (SELECT i FROM tblj1); /*c1*/SELECT * FROM public.ctblt1 WHERE i in (SELECT i FROM tblj1); /*c0*/SELECT * FROM public.ctblt1 WHERE i = (SELECT i FROM tblj1 WHERE i = 0); /*c1*/SELECT * FROM ctblt1 WHERE i = (SELECT i FROM public.tblj1); /*c1*/SELECT * FROM ctblt1 WHERE i in (SELECT i FROM public.tblj1); /*c0*/SELECT * FROM ctblt1 WHERE i = (SELECT i FROM public.tblj1 WHERE i = 0); /*c1*/SELECT * FROM ctblt1 WHERE i = (SELECT tblj1.i FROM public.tblj1); /*c1*/SELECT * FROM ctblt1 WHERE i in (SELECT tblj1.i FROM tblj1); /*c0*/SELECT * FROM ctblt1 WHERE i = (SELECT tblj1.i FROM tblj1 WHERE i = 0); /*c1*/SELECT * FROM ctblt1 WHERE i = (SELECT i FROM public.tblj1 WHERE tblj1.i = 1); /*c1*/SELECT * FROM ctblt1 WHERE i = (SELECT tblj1.i FROM tblj1 WHERE tblj1.i = 1); /*e*/SELECT * FROM system_users WHERE user_name = 'SA'; /*e*/SELECT * FROM other.ctblt1; /*e*/SELECT * FROM other.system_users; /*e*/SELECT * FROM information_schema.ctblt1; /*e*/SELECT * FROM public.system_users; /*c2*/SELECT * FROM public.ctblt1; /*c1*/SELECT * FROM information_schema.system_users WHERE user_name = 'SA'; /*c1*/SELECT * FROM public.ctblt1 WHERE i = 0; /*e*/SELECT * FROM other.ctblt1 WHERE i = 0; /*e*/SELECT * FROM information_schema.ctblt1 WHERE i = 0; /*c1*/SELECT * FROM public.ctblt1, public.tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT * FROM ctblt1, public.tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT * FROM public.ctblt1, tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT * FROM ctblt1, tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT vc FROM public.ctblt1, public.tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT vc FROM ctblt1, public.tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT vc FROM public.ctblt1, tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT vc FROM ctblt1, tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT tblj1.vc FROM public.ctblt1, public.tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT tblj1.vc FROM ctblt1, public.tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT tblj1.vc FROM public.ctblt1, tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT tblj1.vc FROM ctblt1, tblj1 WHERE ctblt1.i = tblj1.i; /*c1*/SELECT lbla.vc FROM ctblt1, tblj1 lbla WHERE ctblt1.i = lbla.i; /*c1*/SELECT tblj1.vc FROM ctblt1 lblb, tblj1 WHERE lblb.i = tblj1.i; /*c1*/SELECT lbla.vc FROM ctblt1 lblb, tblj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM public.ctblt1, tblj1 lbla WHERE ctblt1.i = lbla.i; /*c1*/SELECT tblj1.vc FROM public.ctblt1 lblb, tblj1 WHERE lblb.i = tblj1.i; /*c1*/SELECT lbla.vc FROM public.ctblt1 lblb, tblj1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM ctblt1, public.tblj1 lbla WHERE ctblt1.i = lbla.i; /*c1*/SELECT tblj1.vc FROM ctblt1 lblb, public.tblj1 WHERE lblb.i = tblj1.i; /*c1*/SELECT lbla.vc FROM ctblt1 lblb, public.tblj1 lbla WHERE lblb.i = lbla.i; /*u0*/SET TABLE ctblt1 READONLY true; /*e*/UPDATE ctblt1 set i = 11 WHERE i = 1; /*u0*/SET TABLE public.ctblt1 READONLY true; /*e*/SET TABLE information_schema.ctblt1 READONLY true; /*e*/SET TABLE other.ctblt1 READONLY true; /*u0*/SET TABLE ctblt1 READONLY false; /*u0*/SET TABLE public.ctblt1 READONLY false; /*c2*/SELECT i FROM ctblt1; -- N.b.: Do not commit DML changes so that this whole block may be repeated. COMMIT; SET AUTOCOMMIT false; /*u1*/UPDATE ctblt1 set i = 11 WHERE i = 1; /*u1*/UPDATE ctblt1 set ctblt1.i = 12 WHERE i = 11; /*u1*/UPDATE ctblt1 set ctblt1.i = 13 WHERE ctblt1.i = 12; /*u1*/UPDATE public.ctblt1 set i = 14 WHERE i = 13; /*u1*/UPDATE public.ctblt1 set ctblt1.i = 15 WHERE i = 14; /*u1*/UPDATE public.ctblt1 set ctblt1.i = 16 WHERE ctblt1.i = 15; /*e*/UPDATE other.ctblt1 set ctblt1.i = 17 WHERE ctblt1.i = 16; /*e*/UPDATE information_schema.ctblt1 set ctblt1.i = 17 WHERE ctblt1.i = 16; /*u1*/UPDATE ctblt1 ali set i = 17 WHERE i = 16; /*u1*/UPDATE ctblt1 ali set ali.i = 18 WHERE i = 17; /*u1*/UPDATE ctblt1 ali set ali.i = 19 WHERE ali.i = 18; /*u1*/UPDATE ctblt1 ali set i = 20 WHERE ali.i = 19; /*u1*/UPDATE public.ctblt1 ali set i = 21 WHERE i = 20; /*u1*/UPDATE public.ctblt1 ali set ali.i = 22 WHERE i = 21; /*u1*/UPDATE public.ctblt1 ali set ali.i = 23 WHERE ali.i = 22; /*u1*/UPDATE public.ctblt1 ali set i = 24 WHERE ali.i = 23; /*e*/UPDATE other.ctblt1 ali set i = 25 WHERE ali.i = 24; /*e*/UPDATE other.ctblt1 ali set i = 25 WHERE .i = 24; /*e*/UPDATE other.ctblt1 set i = 25 WHERE i = 24; /*e*/DELETE FROM other.ctblt1 ali WHERE ali.i = 24; /*e*/DELETE FROM other.ctblt1 ali; /*e*/DELETE FROM other.ctblt1 set WHERE i = 24; /*e*/DELETE FROM other.ctblt1 WHERE i = 24; /*e*/DELETE FROM system_information.tblj1 WHERE tblj1.i = 1; /*u1*/DELETE FROM ctblt1 WHERE i = 0; /*u1*/DELETE FROM public.ctblt1 WHERE i = 24; /*u1*/DELETE FROM public.tblj1 WHERE tblj1.i = 1; ROLLBACK; /*c2*/SELECT i FROM ctblt1; /*u0*/GRANT ALL ON ctblt1 TO otheruser; /*u0*/GRANT ALL ON public.ctblt2 TO otheruser; /*e*/GRANT ALL ON other.ctblt3 TO otheruser; /*e*/GRANT ALL ON information_schema.ctblt3 TO otheruser; /*u0*/REVOKE ALL ON ctblt1 FROM otheruser RESTRICT; /*u0*/REVOKE ALL ON public.ctblt2 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON other.ctblt3 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON information_schema.ctblt3 FROM otheruser RESTRICT; /*e*/DROP TABLE other.ctblt3; /*e*/DROP TABLE information_schema.ctblt4; /*e*/DROP TABLE ctblt101; /*e*/DROP TABLE public.ctblt101; /*u0*/DROP TABLE ctblt101 IF EXISTS; /*u0*/DROP TABLE public.ctblt101 IF EXISTS; -- Should "DROP TABLE nonexistentschema.notable IF EXISTS" work? /*u0*/DROP TABLE other.system_users IF exists; /*u0*/DROP TABLE system_users IF exists; -- ****************************** ALTERs -- Add tests when time permits. DROP USER otheruser; -- This to test .script persistence. SHUTDOWN; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfTempTable1.txt0000644000175000017500000000175712007547346023257 0ustar renerene/*s*/DROP tmptbl1 IF EXISTS; /*s*/DROP tmptbl2 IF EXISTS; /*s*/DROP user altuser1; /*s*/DROP user altuser2; CREATE USER altuser1 PASSWORD password; CREATE USER altuser2 PASSWORD password; /*u0*/GRANT CHANGE_AUTHORIZATION TO altuser1; /*u0*/GRANT CHANGE_AUTHORIZATION TO altuser2; /*u0*/CREATE TEMP TABLE tmptbl1 (i int); /*u0*/CREATE TEMP TABLE tmptbl2 (i int); /*u0*/GRANT ALL ON tmptbl1 TO altuser1; /*u0*/GRANT ALL ON tmptbl2 TO altuser1; SET AUTOCOMMIT false; /*u1*/INSERT INTO tmptbl1 VALUES(1); /*u1*/INSERT INTO tmptbl1 VALUES(2); /*c2*/SELECT * FROM tmptbl1; COMMIT; /*u1*/INSERT INTO tmptbl2 VALUES(1); /*u1*/INSERT INTO tmptbl2 VALUES(2); /*c0*/SELECT * FROM tmptbl1; /*c2*/SELECT * FROM tmptbl2; COMMIT; CONNECT USER altuser1 PASSWORD password; /*c0*/SELECT * FROM tmptbl1; /*c0*/SELECT * FROM tmptbl2; COMMIT; CONNECT USER altuser2 PASSWORD password; /*e*/SELECT * FROM tmptbl1; /*e*/SELECT * FROM tmptbl2; CONNECT USER SA password ""; SHUTDOWN IMMEDIATELY; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestText02.txt0000644000175000017500000000041112007547346021557 0ustar renerene/*c2*/SELECT * FROM TMAIN; /*c0*/SELECT * FROM TMAIN EXCEPT SELECT * FROM T; /*c0*/SELECT * FROM T EXCEPT SELECT * FROM TMAIN; /*c6*/SELECT * FROM TTMAIN; /*c0*/SELECT * FROM TT EXCEPT SELECT * FROM TTMAIN; /*c0*/SELECT * FROM TTMAIN EXCEPT SELECT * FROM TT; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfArithmetic.txt0000644000175000017500000000257012007547344023402 0ustar renerenedrop table arith if exists; create table arith ( inta int, intb int, intc int ); insert into arith ( inta, intb, intc ) values ( 1, 2, 3 ); insert into arith ( inta, intb, intc ) values ( 3, 5, 7 ); insert into arith ( inta, intb, intc ) values ( 7, 11, 13 ); insert into arith ( inta, intb, intc ) values ( 13, 17, 19 ); select inta, intb from arith order by inta; select inta, inta + intb from arith order by inta; select inta, inta * intb from arith order by inta; select inta, inta - intb from arith order by inta; select inta, ( inta - intb ) * intc from arith order by inta; select inta, ( inta + intb ) * intc from arith order by inta; select inta, ( inta - intb ) + intc from arith order by inta; select inta, ( inta + intb ) + intc from arith order by inta; select inta, (inta-intb)*intc from arith order by inta; select inta, (inta+intb)*intc from arith order by inta; select inta, (inta-intb)+intc from arith order by inta; select inta, (inta+intb)+intc from arith order by inta; select inta, intc * ( inta - intb ) from arith order by inta; select inta, intc * ( inta + intb ) from arith order by inta; select inta, intc - ( inta + intb ) from arith order by inta; drop table arith; create table arith ( inta int, intb int, intc int ); insert into arith ( inta, intb, intc ) values ( 1, 2, 3 ); select inta, ( inta - intb ) * intc from arith order by inta; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfImmediateShutdown.txt0000644000175000017500000000225312007547346024743 0ustar renereneSET AUTOCOMMIT FALSE; CREATE TABLE TABLE1(USER_ID INT NOT NULL PRIMARY KEY ); INSERT INTO TABLE1 (USER_ID) VALUES (1); INSERT INTO TABLE1 (USER_ID) VALUES (2); INSERT INTO TABLE1 (USER_ID) VALUES (3); INSERT INTO TABLE1 (USER_ID) VALUES (4); CREATE TABLE TABLE2(USER_ID INT NOT NULL, COLUMN2 SMALLINT DEFAULT 0 NOT NULL, COLUMN3 CHARACTER(10) DEFAULT 'TEST') ; ALTER TABLE TABLE2 ADD CONSTRAINT USER_FK FOREIGN KEY (USER_ID) REFERENCES TABLE1(USER_ID); CREATE INDEX USER_FK ON TABLE2(USER_ID); INSERT INTO TABLE2 (USER_ID) VALUES ( 1 ) ; INSERT INTO TABLE2 (USER_ID) VALUES ( 2 ) ; INSERT INTO TABLE2 (USER_ID) VALUES ( 3 ) ; INSERT INTO TABLE2 (USER_ID) VALUES ( 4 ) ; UPDATE TABLE2 SET COLUMN2=15 WHERE USER_ID=3; COMMIT; /*c4*/SELECT * FROM TABLE1; /*c4*/SELECT * FROM TABLE2; /*c1*/SELECT * FROM TABLE2 WHERE COLUMN2=15; -- bug #1110517 DROP TABLE FILE2 IF EXISTS; CREATE TABLE FILE2(ID VARCHAR(10) PRIMARY KEY,NAME VARCHAR(10),DESCRIPTION VARCHAR(10), field1 INT, field2 VARCHAR(10)); -- DESCRIPTION must be NULL /*u1*/insert into file2(id, name) values('14', 'dir'); /*u1*/update file2 set name = 'newdir' where id = '14'; COMMIT; SHUTDOWN IMMEDIATELY; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfIssues.txt0000644000175000017500000001210112007547346022555 0ustar renerene-- -- TestSelfIssues.txt -- -- Tests demonstrating remaining issues -- -- bug #901313 - fixed - subselect results in error when it returns no rows -- corrected for 1.8.0 RC10 - scalar subquery should return null if no rows are returned drop table table2 if exists; drop table table1 if exists; create table table1 (col1 integer not null, col2 integer not null); create table table2 (col1 integer, col2 integer); insert into table1 (col1, col2) values (1, 1) insert into table1 (col1, col2) values (2, 2) insert into table2 (col1, col2) values (1, 3) insert into table2 (col1, col2) values (2, 4) /*c2*/select t1.col1, t1.col2, t2.col2 from table1 t1, table2 t2 where t1.col1 = t2.col1 /*u2*/update table2 set col2=(select table1.col2 from table1 where table1.col1 = table2.col1) /*c2*/select t1.col1, t1.col2, t2.col2 from table1 t1, table2 t2 where t1.col1 = t2.col1 /*u1*/insert into table2 (col1, col2) values (null, 5) /*u3*/update table2 set col2=(select table1.col2 from table1 where table1.col1 = table2.col1) -- support for aliases in UPDATE has been added /*u3*/update table2 b set col2 = (select a.col2 from table1 a where a.col1 = b.col1) /*c2*/select t1.col1, t1.col2, t2.col2 from table1 t1, table2 t2 where t1.col1 = t2.col1 -- query returns only rows for which the correlated subquery returns a value /*c3*/select table2.col2,(select table1.col2 from table1 where table1.col1 = table2.col1) from table2 -- add row so that subquery returns two rows /*u1*/insert into table1 (col1, col2) values (1, 6) /*e*/select table2.col2,(select table1.col2 from table1 where table1.col1 = table2.col1) from table2 -- reported bug - fixed - first bigint in value list was ignored DROP TABLE T IF EXISTS; CREATE TABLE T(A BIGINT); INSERT INTO T VALUES(7223955391172290801); INSERT INTO T VALUES(8124225344737252039); INSERT INTO T VALUES(8112873400132257948); INSERT INTO T VALUES(100); /*c4*/SELECT * FROM T WHERE A IN (7223955391172290801,8124225344737252039,8112873400132257948,100); -- check with different types /*c4*/SELECT * FROM T WHERE A IN (7223955391172290801,8124225344737252039,8112873400132257948,100.00E0); -- reported bug - fixed - TRUE and FALSE in conditions /*c4*/SELECT * FROM T WHERE A IN (7223955391172290801,8124225344737252039,8112873400132257948,100) AND TRUE; /*c0*/SELECT * FROM T WHERE A IN (7223955391172290801,8124225344737252039,8112873400132257948,100) AND FALSE; -- demonstration of contatenation from Blaine CREATE TABLE tsttbl( id IDENTITY, FirstName VARCHAR(10), MiddleName VARCHAR(10), LastName VARCHAR(10), CommonLink VARCHAR(20) ); INSERT INTO tsttbl(firstname, middlename, lastname, commonlink) VALUES ('John', 'Paul', 'Jones', 'http://cnn.com'); INSERT INTO tsttbl(firstname, middlename, lastname, commonlink) VALUES ('Bridget', 'Paula', 'Murphy', 'http://cnn.com'); -- Raw SELECT using ||: SELECT FirstName || MiddleName || LastName, CommonLink FROM tsttbl; -- Creating View using ||: CREATE VIEW tstview AS SELECT FirstName || MiddleName || LastName, CommonLink FROM tsttbl; -- Executing View Query: SELECT * FROM tstview; -- Raw SELECT using +: SELECT FirstName + ' ' + MiddleName + ' ' + LastName, CommonLink FROM tsttbl; -- reported bug #1487591 CREATE TABLE TESTTABLE(ID IDENTITY, MY_VALUE VARCHAR(10), MY_ROW_TYPE VARCHAR(10)); INSERT INTO TESTTABLE (MY_VALUE,MY_ROW_TYPE) VALUES ('A', 'B'); SELECT ID, MY_VALUE FROM TESTTABLE AS TBL1 WHERE ID = (SELECT MAX(ID) AS ID FROM TESTTABLE AS TBL2 WHERE TBL1.MY_VALUE=TBL2.MY_VALUE); -- reported bug drop table PROCESSDETAIL if exists; create table PROCESSDETAIL ( ID bigint not null, ALERTLEVEL integer not null, VALUE varchar(255) not null, TSTAMP timestamp(0) not null, ATTRIBUTEKEY integer not null, PROCESSID bigint not null, primary key (ID) ); insert into PROCESSDETAIL (ALERTLEVEL, VALUE, TSTAMP, ATTRIBUTEKEY, PROCESSID, ID) values(1, 66, '2007-01-01 08:00:00', 28, 9, 1); insert into PROCESSDETAIL (ALERTLEVEL, VALUE, TSTAMP, ATTRIBUTEKEY, PROCESSID, ID) values(0, 67, '2007-01-01 07:59:40', 28, 9, 2); /*r 1,1,66,2007-01-01 08:00:00,28,9 */select * from PROCESSDETAIL t1 where exists ( select t2.PROCESSID, t2.ATTRIBUTEKEY from PROCESSDETAIL t2 where t2.PROCESSID=t1.PROCESSID and t2.ATTRIBUTEKEY=t1.ATTRIBUTEKEY and t2.PROCESSID=9 and t2.TSTAMP<='2007-01-01 08:00:00' group by t2.PROCESSID , t2.ATTRIBUTEKEY having max(t2.TSTAMP)=t1.TSTAMP ); -- -- create table element (deadline timestamp); SELECT DISTINCT convert(element.deadline,Date) FROM element ORDER BY convert(element.deadline,Date) ASC SET DATABASE SQL SYNTAX MSS TRUE SELECT DISTINCT convert(DATE, element.deadline) FROM element ORDER BY convert(DATE, element.deadline) ASC SET DATABASE SQL SYNTAX MSS FALSE hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfTransaction.txt0000644000175000017500000000444512007547346023603 0ustar renerene-- ON DELETE SET NULL set property "hsqldb.nio_data_file" false set write_delay false; set autocommit false; drop table testB if exists; create cached table testB(id integer, parent integer, ref integer, data varchar(200), unique (id), foreign key (parent) references testB(id) on delete set null); /*u1*/insert into testB values(100,100,1,'xxxx'); /*u1*/insert into testB values(101,100,1,'xxxx'); /*u1*/insert into testB values(102,100,1,'xxxx'); /*u1*/insert into testB values(200,200,1,'xxxx'); commit; /*u1*/delete from testB where id=100; /*r 101,NULL,1,xxxx 102,NULL,1,xxxx 200,200,1,xxxx */select * from testB order by id /*c2*/select * from testB where parent is null rollback; /*c4*/select * from testB; -- ON DELETE SET DEFAULT drop table testB if exists; create cached table testB(id integer, parent integer default 20, ref integer, data varchar(200), unique (id),foreign key (parent) references testB(id) on delete set default); /*u1*/insert into testB values(20,20,1,'xxxx'); /*u1*/insert into testB values(100,100,1,'xxxx'); /*u1*/insert into testB values(101,100,1,'xxxx'); /*u1*/insert into testB values(200,200,1,'xxxx'); commit; /*u1*/delete from testB where id=100; /*r 20,20,1,xxxx 101,20,1,xxxx 200,200,1,xxxx */select * from testB order by id /*c2*/select * from testB where parent=20 rollback; /*c4*/select * from testB; -- CHAINED SELF REFERENCING FK -- ON DELETE CASCADE drop table testA if exists; create cached table testA(a int primary key,b int, foreign key(b) references testA(a) on update cascade on delete cascade); insert into testA(a,b) values(1,1); insert into testA(a,b) values(2,1); insert into testA(a,b) values(3,1); insert into testA(a,b) values(4,2); insert into testA(a,b) values(5,2); insert into testA(a,b) values(6,2); insert into testA(a,b) values(7,3); insert into testA(a,b) values(8,3); insert into testA(a,b) values(9,3); commit; /*u9*/update testA set a = a+1; /*r9*/select count(*) from testA; /*r3*/select count(*) from testA where b=4; /*u9*/update testA set a = a-1; /*r9*/select count(*) from testA; /*r0*/select count(*) from testA where b=4; /*r3*/select count(*) from testA where b=3; /*u1*/delete from testA where a=1; /*r0*/select count(*) from testA; rollback; /*r9*/select count(*) from testA; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfTriggers2.txt0000644000175000017500000000407212007547346023162 0ustar renerene-- Testing some advanced trigger functionality CREATE TABLE log_table ( stamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, message VARCHAR(80) NOT NULL, ) CREATE PROCEDURE record(msg VARCHAR(60)) MODIFIES SQL DATA BEGIN ATOMIC INSERT INTO log_table(message) VALUES (msg); END CREATE TABLE base_table ( id BIGINT generated ALWAYS AS IDENTITY PRIMARY KEY, i INTEGER NOT NULL, vc VARCHAR(600) NOT NULL, ) /*r0*/ SELECT COUNT(*) FROM log_table CALL record('test record') /*r1*/ SELECT COUNT(*) FROM log_table CREATE TRIGGER manual_log_trigger AFTER INSERT ON base_table INSERT INTO log_table(message) VALUES ('totally manual trigger event') INSERT INTO base_table(i, vc) VALUES(1, 'one') /*r2*/ SELECT COUNT(*) FROM log_table CREATE TRIGGER call_log_trigger AFTER INSERT ON base_table CALL record('trigger routine CALL event') INSERT INTO base_table(i, vc) VALUES(2, 'two') /*r4*/ SELECT COUNT(*) FROM log_table /*r2*/ SELECT COUNT(*) FROM base_table -- this trigger is called recursively -- WHEN clause avoids infinite recursion CREATE TRIGGER extra_ins_trigger_ AFTER INSERT ON base_table REFERENCING NEW as new_row FOR EACH ROW WHEN (MOD(new_row.i,2) = 1) INSERT INTO base_table(i, vc) VALUES(1 + new_row.i, 'TRIG_ADDITION' || new_row.vc) -- Sanity check to verify that the Trigger creaion didn't change anything /*r4*/ SELECT COUNT(*) FROM log_table /*r2*/ SELECT COUNT(*) FROM base_table INSERT INTO base_table(i, vc) VALUES(3, 'x') -- Should write 2 base_table entries, hence 4 log records /*r8*/ SELECT COUNT(*) FROM log_table /*r4*/ SELECT COUNT(*) FROM base_table CREATE TABLE KD (KDVER INT, KDID INT); CREATE TABLE K (KVER INT, KID INT CHECK (KID > 0)); INSERT INTO KD VALUES 79, 1 INSERT INTO KD VALUES 70, 2 INSERT INTO K VALUES 79, 1 INSERT INTO K VALUES 70, 2 CREATE TRIGGER TD AFTER DELETE ON KD REFERENCING OLD ROW AS OLDROW FOR EACH ROW BEGIN ATOMIC UPDATE K SET KVER = NULL WHERE KID = OLDROW.KDID AND KVER = OLDROW.KDVER; END; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfNameResolutionSchemas.txt0000644000175000017500000006156012007547344025565 0ustar renerene-- Tests for phase 1 of Schema implementation. -- PHASE 1 = on schemas PUBLIC and INFORMATION_SCHEMA; No "SET SCHEMA" cmd; -- Can't create INFORMATION_SCHEMA objects from normal Sessions. -- (Alter commands tested separately after because there are so many -- alter permutations to test) -- ****************************** PHASE 1 Tables --DROP TABLE nosuch; DROP TABLE t1 IF exists; DROP TABLE t2 IF exists; DROP TABLE t3 IF exists; DROP TABLE t4 IF exists; DROP TABLE t5 IF exists; DROP TABLE t101 IF exists; DROP TABLE j1 IF exists; DROP TABLE other.t1 IF exists; DROP TABLE other.system_users IF exists; DROP TABLE system_users IF exists; /*u0*/CREATE TABLE t1 (i int); /*u0*/CREATE TABLE public.t2 (i int); /*u0*/CREATE TABLE t3 (i int); /*u0*/CREATE TABLE j1 (i int, vc varchar(10)); /*u0*/CREATE CACHED TABLE public.t5 (i int); /*e*/CREATE TABLE information_schema.t101 (i int); /*e*/CREATE TABLE t1 (i int); -- Create existing object /*e*/CREATE TABLE public.t1 (i int); -- Create existing object /*e*/CREATE TABLE information_schema.system_users (i int); -- Existing object /*u1*/INSERT INTO t1 values(0); /*u1*/INSERT INTO t1 values(1); /*u1*/INSERT INTO j1 values(1, 'one'); /*c2*/SELECT * FROM t1; /*c1*/SELECT * FROM t1 WHERE i = 0; /*c2*/SELECT * FROM t1 WHERE i in (0, 1, 11, 12); /*c1*/SELECT * FROM t1 WHERE i < 1; /*c1*/SELECT * FROM t1 WHERE t1.i = (SELECT i FROM j1); /*c1*/SELECT * FROM t1 WHERE t1.i in (SELECT i FROM j1); /*c0*/SELECT * FROM t1 WHERE t1.i = (SELECT i FROM j1 WHERE i = 0); /*c1*/SELECT * FROM public.t1 WHERE t1.i = (SELECT i FROM j1); /*c1*/SELECT * FROM public.t1 WHERE t1.i in (SELECT i FROM j1); /*c1*/SELECT * FROM public.t1 WHERE t1.i = (SELECT i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM t1 WHERE t1.i = (SELECT i FROM public.j1); /*c1*/SELECT * FROM t1 WHERE t1.i in (SELECT i FROM public.j1); /*c1*/SELECT * FROM t1 WHERE t1.i = (SELECT i FROM public.j1 WHERE i = 1); /*c1*/SELECT * FROM t1 WHERE t1.i = (SELECT j1.i FROM public.j1); /*c1*/SELECT * FROM t1 WHERE t1.i in (SELECT j1.i FROM j1); /*c1*/SELECT * FROM t1 WHERE t1.i = (SELECT j1.i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM t1 WHERE t1.i = (SELECT i FROM public.j1 WHERE j1.i = 1); /*c1*/SELECT * FROM t1 WHERE t1.i = (SELECT j1.i FROM j1 WHERE j1.i = 1); /*c1*/SELECT * FROM t1 WHERE i = (SELECT i FROM j1); /*c1*/SELECT * FROM t1 WHERE i in (SELECT i FROM j1); /*c1*/SELECT * FROM t1 WHERE i = (SELECT i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM public.t1 WHERE i = (SELECT i FROM j1); /*c1*/SELECT * FROM public.t1 WHERE i in (SELECT i FROM j1); /*c0*/SELECT * FROM public.t1 WHERE i = (SELECT i FROM j1 WHERE i = 0); /*c1*/SELECT * FROM t1 WHERE i = (SELECT i FROM public.j1); /*c1*/SELECT * FROM t1 WHERE i in (SELECT i FROM public.j1); /*c0*/SELECT * FROM t1 WHERE i = (SELECT i FROM public.j1 WHERE i = 0); /*c1*/SELECT * FROM t1 WHERE i = (SELECT j1.i FROM public.j1); /*c1*/SELECT * FROM t1 WHERE i in (SELECT j1.i FROM j1); /*c0*/SELECT * FROM t1 WHERE i = (SELECT j1.i FROM j1 WHERE i = 0); /*c1*/SELECT * FROM t1 WHERE i = (SELECT i FROM public.j1 WHERE j1.i = 1); /*c1*/SELECT * FROM t1 WHERE i = (SELECT j1.i FROM j1 WHERE j1.i = 1); /*e*/SELECT * FROM system_users WHERE user_name = 'SA'; /*e*/SELECT * FROM other.t1; /*e*/SELECT * FROM other.system_users; /*e*/SELECT * FROM information_schema.t1; /*e*/SELECT * FROM public.system_users; /*c2*/SELECT * FROM public.t1; /*c1*/SELECT * FROM information_schema.system_users WHERE user_name = 'SA'; /*c1*/SELECT * FROM public.t1 WHERE i = 0; /*e*/SELECT * FROM other.t1 WHERE i = 0; /*e*/SELECT * FROM information_schema.t1 WHERE i = 0; CREATE TABLE public.t4 AS (SELECT * FROM public.t1 WHERE i = 0) WITH DATA; /*c1*/SELECT * FROM public.t4; /*c1*/SELECT * FROM public.t1, public.j1 WHERE t1.i = j1.i; /*c1*/SELECT * FROM t1, public.j1 WHERE t1.i = j1.i; /*c1*/SELECT * FROM public.t1, j1 WHERE t1.i = j1.i; /*c1*/SELECT * FROM t1, j1 WHERE t1.i = j1.i; /*c1*/SELECT vc FROM public.t1, public.j1 WHERE t1.i = j1.i; /*c1*/SELECT vc FROM t1, public.j1 WHERE t1.i = j1.i; /*c1*/SELECT vc FROM public.t1, j1 WHERE t1.i = j1.i; /*c1*/SELECT vc FROM t1, j1 WHERE t1.i = j1.i; /*c1*/SELECT j1.vc FROM public.t1, public.j1 WHERE t1.i = j1.i; /*c1*/SELECT j1.vc FROM t1, public.j1 WHERE t1.i = j1.i; /*c1*/SELECT j1.vc FROM public.t1, j1 WHERE t1.i = j1.i; /*c1*/SELECT j1.vc FROM t1, j1 WHERE t1.i = j1.i; /*c1*/SELECT lbla.vc FROM t1, j1 lbla WHERE t1.i = lbla.i; /*c1*/SELECT j1.vc FROM t1 lblb, j1 WHERE lblb.i = j1.i; /*c1*/SELECT lbla.vc FROM t1 lblb, j1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM public.t1, j1 lbla WHERE t1.i = lbla.i; /*c1*/SELECT j1.vc FROM public.t1 lblb, j1 WHERE lblb.i = j1.i; /*c1*/SELECT lbla.vc FROM public.t1 lblb, j1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM t1, public.j1 lbla WHERE t1.i = lbla.i; /*c1*/SELECT j1.vc FROM t1 lblb, public.j1 WHERE lblb.i = j1.i; /*c1*/SELECT lbla.vc FROM t1 lblb, public.j1 lbla WHERE lblb.i = lbla.i; /*u0*/SET TABLE t1 READONLY true; /*u0*/SET TABLE public.t1 READONLY true; /*e*/SET TABLE information_schema.t1 READONLY true; /*e*/SET TABLE other.t1 READONLY true; /*u0*/SET TABLE t1 READONLY false; /*u0*/SET TABLE public.t1 READONLY false; /*u1*/UPDATE t1 set i = 11 WHERE i = 1; /*u1*/UPDATE t1 set t1.i = 12 WHERE i = 11; /*u1*/UPDATE t1 set t1.i = 13 WHERE t1.i = 12; /*u1*/UPDATE public.t1 set i = 14 WHERE i = 13; /*u1*/UPDATE public.t1 set t1.i = 15 WHERE i = 14; /*u1*/UPDATE public.t1 set t1.i = 16 WHERE t1.i = 15; /*e*/UPDATE other.t1 set t1.i = 17 WHERE t1.i = 16; /*e*/UPDATE information_schema.t1 set t1.i = 17 WHERE t1.i = 16; /*u1*/UPDATE t1 ali set i = 17 WHERE i = 16; /*u1*/UPDATE t1 ali set ali.i = 18 WHERE i = 17; /*u1*/UPDATE t1 ali set ali.i = 19 WHERE ali.i = 18; /*u1*/UPDATE t1 ali set i = 20 WHERE ali.i = 19; /*u1*/UPDATE public.t1 ali set i = 21 WHERE i = 20; /*u1*/UPDATE public.t1 ali set ali.i = 22 WHERE i = 21; /*u1*/UPDATE public.t1 ali set ali.i = 23 WHERE ali.i = 22; /*u1*/UPDATE public.t1 ali set i = 24 WHERE ali.i = 23; /*e*/UPDATE other.t1 ali set i = 25 WHERE ali.i = 24; /*e*/UPDATE other.t1 ali set i = 25 WHERE .i = 24; /*e*/UPDATE other.t1 set i = 25 WHERE i = 24; /*e*/DELETE FROM other.t1 ali WHERE ali.i = 24; /*e*/DELETE FROM other.t1 ali; /*e*/DELETE FROM other.t1 set WHERE i = 24; CREATE USER otheruser PASSWORD otheruser; /*u0*/GRANT ALL ON t1 TO otheruser; /*u0*/GRANT ALL ON public.t2 TO otheruser; /*e*/GRANT ALL ON other.t3 TO otheruser; /*e*/GRANT ALL ON information_schema.t3 TO otheruser; /*u0*/REVOKE ALL ON t1 FROM otheruser RESTRICT; /*u0*/REVOKE ALL ON public.t2 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON other.t3 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON information_schema.t3 FROM otheruser RESTRICT; DROP USER otheruser; /*u1*/DELETE FROM t1 WHERE i = 0; /*u1*/DELETE FROM public.t1 WHERE i = 24; /*u1*/DELETE FROM public.j1 WHERE j1.i = 1; /*u0*/DROP TABLE t1; /*e*/DROP TABLE t1; /*u0*/DROP TABLE t2; /*e*/DROP TABLE other.t3; /*u0*/DROP TABLE public.t3; /*e*/DROP TABLE information_schema.t4; /*u0*/DROP TABLE t4; /*u0*/DROP TABLE t5; /*u0*/DROP TABLE j1; /*e*/DROP TABLE t101; /*e*/DROP TABLE public.t101; -- ****************************** PHASE 1 Views DROP VIEW v1 IF exists; DROP VIEW v2 IF exists; DROP VIEW v3 IF exists; DROP VIEW v4 IF exists; DROP VIEW v5 IF exists; DROP VIEW v6 IF exists; DROP VIEW v7 IF exists; DROP VIEW v8 IF exists; DROP VIEW v9 IF exists; DROP VIEW v10 IF exists; DROP VIEW v11 IF exists; DROP VIEW v12 IF exists; DROP VIEW v13 IF exists; DROP VIEW v14 IF exists; DROP VIEW v15 IF exists; DROP VIEW v16 IF exists; DROP VIEW v17 IF exists; DROP VIEW v18 IF exists; DROP VIEW v19 IF exists; DROP VIEW v20 IF exists; DROP VIEW v21 IF exists; DROP VIEW v22 IF exists; DROP VIEW v23 IF exists; DROP VIEW v24 IF exists; DROP VIEW v25 IF exists; DROP VIEW v26 IF exists; DROP VIEW v101 IF exists; DROP TABLE t1 IF exists; DROP TABLE t2 IF exists; DROP TABLE j1 IF exists; CREATE TABLE t1 (i int); CREATE TABLE j1 (i int, vc varchar(10)); INSERT INTO t1 values(0); INSERT INTO t1 values(1); INSERT INTO j1 values(1, 'one'); /*e*/CREATE VIEW information_schema.v101 AS SELECT * FROM information_schema.system_users; /*e*/CREATE VIEW information_schema.v101 AS SELECT * FROM t1; /*e*/CREATE VIEW information_schema.v4 AS SELECT * FROM public.t1; /*e*/CREATE VIEW v101 AS SELECT * FROM other.t1; /*e*/CREATE VIEW public.v101 AS SELECT * FROM other.t1; /*e*/CREATE VIEW other.v101 AS SELECT * FROM information_schema.system_users, j1 WHERE user_name = vc; /*e*/CREATE VIEW other.v101 AS SELECT * FROM information_schema.system_users, public.j1 WHERE user_name = vc; /*e*/CREATE VIEW other.v101 AS SELECT * FROM information_schema.system_users, j1 WHERE information_schema.user_name = vc; /*e*/CREATE VIEW other.v101 AS SELECT * FROM information_schema.system_users, j1 WHERE information_schema.user_name = public.vc; /*e*/CREATE VIEW information_schema.v101 AS SELECT * FROM information_schema.system_users, j1 WHERE user_name = vc; /*e*/CREATE VIEW information_schema.v101 AS SELECT * FROM information_schema.system_users, public.j1 WHERE user_name = vc; /*e*/CREATE VIEW information_schema.v101 AS SELECT * FROM information_schema.system_users, j1 WHERE information_schema.user_name = vc; /*e*/CREATE VIEW information_schema.v101 AS SELECT * FROM information_schema.system_users, j1 WHERE information_schema.user_name = public.vc; /*e*/CREATE VIEW v101 AS SELECT * FROM system_users, j1 WHERE user_name = vc; /*e*/CREATE VIEW v101 AS SELECT * FROM information_schema.system_users, information_schema.j1 WHERE user_name = vc; /*e*/CREATE VIEW v101 AS SELECT * FROM information_schema.system_users, j1 WHERE other.user_name = vc; /*e*/CREATE VIEW v101 AS SELECT * FROM information_schema.system_users, j1 WHERE public.user_name = public.vc; /*u0*/CREATE VIEW v1 AS SELECT * FROM t1; /*e*/CREATE VIEW public.v1 AS SELECT * FROM t1; -- Create existing object /*e*/CREATE VIEW public.v1 AS SELECT * FROM public.t1; -- Existing object /*u0*/CREATE VIEW public.v2 AS SELECT * FROM t1; /*u0*/CREATE VIEW public.v3 AS SELECT * FROM public.t1; /*u0*/CREATE VIEW public.v4 AS SELECT * FROM t1 WHERE i = 0; /*u0*/CREATE VIEW public.v5 AS SELECT * FROM t1 WHERE i < 1; /*u0*/CREATE VIEW public.v6 AS SELECT * FROM information_schema.system_users WHERE user_name = 'SA'; /*u0*/CREATE VIEW v7 AS SELECT * FROM information_schema.system_users; /*u0*/CREATE VIEW v8 AS SELECT * FROM information_schema.system_users WHERE user_name = 'SA'; /*u0*/CREATE VIEW v9 AS SELECT * FROM information_schema.system_users, j1 WHERE user_name = vc; /*u0*/CREATE VIEW v10 AS SELECT * FROM information_schema.system_users, public.j1 WHERE user_name = vc; /*u0*/CREATE VIEW v11 AS SELECT * FROM information_schema.system_users, j1 WHERE system_users.user_name = vc; /*e*/CREATE VIEW v12 AS SELECT * FROM information_schema.system_users, j1 WHERE system_users.user_name = public.vc; /*u0*/CREATE VIEW public.v13 AS SELECT * FROM information_schema.system_users, j1 WHERE user_name = vc; /*u0*/CREATE VIEW public.v14 AS SELECT * FROM information_schema.system_users, public.j1 WHERE user_name = vc; /*e*/CREATE VIEW public.v15 AS SELECT * FROM information_schema.system_users, j1 WHERE information_schema.user_name = vc; /*e*/CREATE VIEW public.v16 AS SELECT * FROM information_schema.system_users, j1 WHERE information_schema.user_name = public.vc; /*u0*/CREATE VIEW v17 AS SELECT * FROM information_schema.system_users, j1 WHERE user_name = vc; /*u0*/CREATE VIEW v18 AS SELECT * FROM information_schema.system_users, public.j1 WHERE user_name = vc; /*u0*/CREATE VIEW v19 (v1, v2, v3) AS SELECT * FROM t1, j1 WHERE t1.i = j1.i; /*u0*/CREATE VIEW v20 (v1, v2, v3) AS SELECT * FROM public.t1, public.j1 WHERE t1.i = j1.i; /*u0*/CREATE VIEW v21 (v1, v2, v3) AS SELECT * FROM public.t1, j1 WHERE t1.i = j1.i; /*u0*/CREATE VIEW v22 (v1, v2, v3) AS SELECT * FROM t1, public.j1 WHERE t1.i = j1.i; /*u0*/CREATE VIEW public.v23 (v1, v2, v3) AS SELECT * FROM t1, j1 WHERE t1.i = j1.i; /*u0*/CREATE VIEW public.v24 (v1, v2, v3) AS SELECT * FROM public.t1, public.j1 WHERE t1.i = j1.i; /*u0*/CREATE VIEW public.v25 (v1, v2, v3) AS SELECT * FROM public.t1, j1 WHERE t1.i = j1.i; /*u0*/CREATE VIEW public.v26 (v1, v2, v3) AS SELECT * FROM t1, public.j1 WHERE t1.i = j1.i; /*u0*/CREATE VIEW v28 AS SELECT * FROM t1 WHERE i in (0, 1, 11, 12); /*u0*/CREATE VIEW public.v29 AS SELECT * FROM t1 WHERE i < 1; /*u0*/CREATE VIEW v30 AS SELECT * FROM t1 WHERE t1.i = (SELECT i FROM j1); /*u0*/CREATE VIEW v31 AS SELECT * FROM t1 WHERE t1.i in (SELECT i FROM j1); /*u0*/CREATE VIEW v32 AS SELECT * FROM t1 WHERE t1.i = (SELECT i FROM j1 WHERE i = 0); /*u0*/CREATE VIEW v33 AS SELECT * FROM public.t1 WHERE t1.i = (SELECT i FROM j1); /*u0*/CREATE VIEW PUBLIC.v34 AS SELECT * FROM public.t1 WHERE t1.i in (SELECT i FROM j1); /*u0*/CREATE VIEW PUBLIC.v35 AS SELECT * FROM public.t1 WHERE t1.i = (SELECT i FROM j1 WHERE i = 0); /*u0*/CREATE VIEW PUBLIC.v36 AS SELECT * FROM t1 WHERE t1.i = (SELECT i FROM public.j1); /*u0*/CREATE VIEW PUBLIC.v37 AS SELECT * FROM t1 WHERE t1.i in (SELECT i FROM public.j1); /*u0*/CREATE VIEW PUBLIC.v38 AS SELECT * FROM t1 WHERE t1.i = (SELECT i FROM public.j1 WHERE i = 1); /*u0*/CREATE VIEW PUBLIC.v39 AS SELECT * FROM t1 WHERE t1.i = (SELECT j1.i FROM public.j1); /*u0*/CREATE VIEW PUBLIC.v40 AS SELECT * FROM t1 WHERE t1.i in (SELECT j1.i FROM j1); /*u0*/CREATE VIEW PUBLIC.v41 AS SELECT * FROM t1 WHERE t1.i = (SELECT j1.i FROM j1 WHERE i = 1); /*u0*/CREATE VIEW PUBLIC.v42 AS SELECT * FROM t1 WHERE t1.i = (SELECT i FROM public.j1 WHERE j1.i = 1); /*u0*/CREATE VIEW PUBLIC.v43 AS SELECT * FROM t1 WHERE t1.i = (SELECT j1.i FROM j1 WHERE j1.i = 1); /*u0*/CREATE VIEW PUBLIC.v44 AS SELECT * FROM t1 WHERE i = (SELECT i FROM j1); /*u0*/CREATE VIEW PUBLIC.v45 AS SELECT * FROM t1 WHERE i in (SELECT i FROM j1); /*u0*/CREATE VIEW PUBLIC.v46 AS SELECT * FROM t1 WHERE i = (SELECT i FROM j1 WHERE i = 1); /*u0*/CREATE VIEW PUBLIC.v47 AS SELECT * FROM public.t1 WHERE i = (SELECT i FROM j1); /*u0*/CREATE VIEW PUBLIC.v48 AS SELECT * FROM public.t1 WHERE i in (SELECT i FROM j1); /*u0*/CREATE VIEW PUBLIC.v49 AS SELECT * FROM public.t1 WHERE i = (SELECT i FROM j1 WHERE i = 1); /*u0*/CREATE VIEW PUBLIC.v50 AS SELECT * FROM t1 WHERE i = (SELECT i FROM public.j1); /*u0*/CREATE VIEW PUBLIC.v51 AS SELECT * FROM t1 WHERE i in (SELECT i FROM public.j1); /*u0*/CREATE VIEW PUBLIC.v52 AS SELECT * FROM t1 WHERE i = (SELECT i FROM public.j1 WHERE i = 0); /*u0*/CREATE VIEW PUBLIC.v53 AS SELECT * FROM t1 WHERE i = (SELECT j1.i FROM public.j1); /*u0*/CREATE VIEW PUBLIC.v54 AS SELECT * FROM t1 WHERE i in (SELECT j1.i FROM j1); /*u0*/CREATE VIEW PUBLIC.v55 AS SELECT * FROM t1 WHERE i = (SELECT j1.i FROM j1 WHERE i = 1); /*u0*/CREATE VIEW PUBLIC.v56 AS SELECT * FROM t1 WHERE i = (SELECT i FROM public.j1 WHERE j1.i = 1); /*u0*/CREATE VIEW PUBLIC.v57 AS SELECT * FROM t1 WHERE i = (SELECT j1.i FROM j1 WHERE j1.i = 1); /*c2*/SELECT * FROM v1; /*c2*/SELECT * FROM public.v1; /*c2*/SELECT * FROM v2; /*c2*/SELECT * FROM v3; /*c1*/SELECT * FROM v4; /*c1*/SELECT * FROM v5; /*c1*/SELECT * FROM v8; /*c0*/SELECT * FROM v9; /*c0*/SELECT * FROM v10; /*c0*/SELECT * FROM v11; /*e*/SELECT * FROM v12; /*c0*/SELECT * FROM v13; /*c0*/SELECT * FROM v14; /*e*/SELECT * FROM v15; /*e*/SELECT * FROM v16; /*c0*/SELECT * FROM v17; /*c0*/SELECT * FROM v18; /*c1*/SELECT * FROM v19; /*c1*/SELECT * FROM v20; /*c1*/SELECT * FROM v21; /*c1*/SELECT * FROM v22; /*c1*/SELECT * FROM v23; /*c1*/SELECT * FROM v24; /*c1*/SELECT * FROM v25; /*c1*/SELECT * FROM v26; /*c2*/SELECT * FROM v28; /*c1*/SELECT * FROM v29; /*c1*/SELECT * FROM v30; /*c1*/SELECT * FROM v31; /*c0*/SELECT * FROM v32; /*c1*/SELECT * FROM v33; /*c1*/SELECT * FROM v34; /*c0*/SELECT * FROM v35; /*c1*/SELECT * FROM v36; /*c1*/SELECT * FROM v37; /*c1*/SELECT * FROM v38; /*c1*/SELECT * FROM v39; /*c1*/SELECT * FROM v40; /*c1*/SELECT * FROM v41; /*c1*/SELECT * FROM v42; /*c1*/SELECT * FROM v43; /*c1*/SELECT * FROM v44; /*c1*/SELECT * FROM v45; /*c1*/SELECT * FROM v46; /*c1*/SELECT * FROM v47; /*c1*/SELECT * FROM v48; /*c1*/SELECT * FROM v49; /*c1*/SELECT * FROM v50; /*c1*/SELECT * FROM v51; /*c0*/SELECT * FROM v52; /*c1*/SELECT * FROM v53; /*c1*/SELECT * FROM v54; /*c1*/SELECT * FROM v55; /*c1*/SELECT * FROM v56; /*c1*/SELECT * FROM v57; /*c1*/SELECT * FROM v1, j1 WHERE v1.i = j1.i; /*c1*/SELECT * FROM public.v1, public.j1 WHERE v1.i = j1.i; /*c2*/SELECT * FROM v1 WHERE i in (0, 1, 11, 12); /*c1*/SELECT * FROM v1 WHERE i < 1; /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT i FROM j1); /*c1*/SELECT * FROM v1 WHERE v1.i in (SELECT i FROM j1); /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM public.v1 WHERE v1.i in (SELECT i FROM j1); /*c1*/SELECT * FROM public.v1 WHERE v1.i = (SELECT i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT i FROM public.j1); /*c1*/SELECT * FROM v1 WHERE v1.i in (SELECT i FROM public.j1); /*c0*/SELECT * FROM v1 WHERE v1.i = (SELECT i FROM public.j1 WHERE i = 0); /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT j1.i FROM public.j1); /*c1*/SELECT * FROM v1 WHERE v1.i in (SELECT j1.i FROM j1); /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT j1.i FROM j1 WHERE i = 1); /*c0*/SELECT * FROM v1 WHERE v1.i = (SELECT i FROM public.j1 WHERE j1.i = 0); /*c0*/SELECT * FROM v1 WHERE v1.i = (SELECT j1.i FROM j1 WHERE j1.i = 0); /*c1*/SELECT * FROM v1 WHERE i = (SELECT i FROM j1); /*c1*/SELECT * FROM v1 WHERE i in (SELECT i FROM j1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM public.v1 WHERE i = (SELECT i FROM j1); /*c1*/SELECT * FROM public.v1 WHERE i in (SELECT i FROM j1); /*c1*/SELECT * FROM public.v1 WHERE i = (SELECT i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT i FROM public.j1); /*c1*/SELECT * FROM v1 WHERE i in (SELECT i FROM public.j1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT i FROM public.j1 WHERE i = 1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT j1.i FROM public.j1); /*c1*/SELECT * FROM v1 WHERE i in (SELECT j1.i FROM j1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT j1.i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT i FROM public.j1 WHERE j1.i = 1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT j1.i FROM j1 WHERE j1.i = 1); /*c2*/SELECT * FROM v1; /*c1*/SELECT * FROM v1 WHERE i = 0; /*c2*/SELECT * FROM v1 WHERE i in (0, 1, 11, 12); /*c1*/SELECT * FROM v1 WHERE i < 1; /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT i FROM j1); /*c1*/SELECT * FROM v1 WHERE v1.i in (SELECT i FROM j1); /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM public.v1 WHERE v1.i = (SELECT i FROM j1); /*c1*/SELECT * FROM public.v1 WHERE v1.i in (SELECT i FROM j1); /*c1*/SELECT * FROM public.v1 WHERE v1.i = (SELECT i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT i FROM public.j1); /*c1*/SELECT * FROM v1 WHERE v1.i in (SELECT i FROM public.j1); /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT i FROM public.j1 WHERE i = 1); /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT j1.i FROM public.j1); /*c1*/SELECT * FROM v1 WHERE v1.i in (SELECT j1.i FROM j1); /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT j1.i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT i FROM public.j1 WHERE j1.i = 1); /*c1*/SELECT * FROM v1 WHERE v1.i = (SELECT j1.i FROM j1 WHERE j1.i = 1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT i FROM j1); /*c1*/SELECT * FROM v1 WHERE i in (SELECT i FROM j1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM public.v1 WHERE i = (SELECT i FROM j1); /*c1*/SELECT * FROM public.v1 WHERE i in (SELECT i FROM j1); /*c1*/SELECT * FROM public.v1 WHERE i = (SELECT i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT i FROM public.j1); /*c1*/SELECT * FROM v1 WHERE i in (SELECT i FROM public.j1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT i FROM public.j1 WHERE i = 1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT j1.i FROM public.j1); /*c1*/SELECT * FROM v1 WHERE i in (SELECT j1.i FROM j1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT j1.i FROM j1 WHERE i = 1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT i FROM public.j1 WHERE j1.i = 1); /*c1*/SELECT * FROM v1 WHERE i = (SELECT j1.i FROM j1 WHERE j1.i = 1); /*e*/SELECT * FROM other.v1; /*e*/SELECT * FROM information_schema.v1; /*c2*/SELECT * FROM public.v1; /*c1*/SELECT * FROM public.v1 WHERE i = 0; /*e*/SELECT * FROM other.v1 WHERE i = 0; /*e*/SELECT * FROM information_schema.v1 WHERE i = 0; CREATE TABLE public.t2 AS (SELECT * FROM public.V1 WHERE i = 0) WITH DATA; /*c1*/SELECT * FROM public.t2; /*c1*/SELECT * FROM public.v1, public.j1 WHERE v1.i = j1.i; /*c1*/SELECT * FROM v1, public.j1 WHERE v1.i = j1.i; /*c1*/SELECT * FROM public.v1, j1 WHERE v1.i = j1.i; /*c1*/SELECT * FROM v1, j1 WHERE v1.i = j1.i; /*c1*/SELECT vc FROM public.v1, public.j1 WHERE v1.i = j1.i; /*c1*/SELECT vc FROM v1, public.j1 WHERE v1.i = j1.i; /*c1*/SELECT vc FROM public.v1, j1 WHERE v1.i = j1.i; /*c1*/SELECT vc FROM v1, j1 WHERE v1.i = j1.i; /*c1*/SELECT j1.vc FROM public.v1, public.j1 WHERE v1.i = j1.i; /*c1*/SELECT j1.vc FROM v1, public.j1 WHERE v1.i = j1.i; /*c1*/SELECT j1.vc FROM public.v1, j1 WHERE v1.i = j1.i; /*c1*/SELECT j1.vc FROM v1, j1 WHERE v1.i = j1.i; /*c1*/SELECT lbla.vc FROM v1, j1 lbla WHERE v1.i = lbla.i; /*c1*/SELECT j1.vc FROM v1 lblb, j1 WHERE lblb.i = j1.i; /*c1*/SELECT lbla.vc FROM v1 lblb, j1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM public.v1, j1 lbla WHERE v1.i = lbla.i; /*c1*/SELECT j1.vc FROM public.v1 lblb, j1 WHERE lblb.i = j1.i; /*c1*/SELECT lbla.vc FROM public.v1 lblb, j1 lbla WHERE lblb.i = lbla.i; /*c1*/SELECT lbla.vc FROM v1, public.j1 lbla WHERE v1.i = lbla.i; /*c1*/SELECT j1.vc FROM v1 lblb, public.j1 WHERE lblb.i = j1.i; /*c1*/SELECT lbla.vc FROM v1 lblb, public.j1 lbla WHERE lblb.i = lbla.i; CREATE USER otheruser PASSWORD otheruser; /*u0*/GRANT ALL ON v1 TO otheruser; /*u0*/GRANT ALL ON public.v2 TO otheruser; /*e*/GRANT ALL ON other.v3 TO otheruser; /*e*/GRANT ALL ON information_schema.v3 TO otheruser; /*u0*/REVOKE ALL ON v1 FROM otheruser RESTRICT; /*u0*/REVOKE ALL ON public.v2 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON other.v3 FROM otheruser RESTRICT; /*e*/REVOKE ALL ON information_schema.v3 FROM otheruser RESTRICT; DROP USER otheruser; /*e*/DROP VIEW other.v1; /*u0*/DROP VIEW public.v1; /*e*/DROP VIEW information_schema.v2; /*u0*/DROP VIEW v2; /*e*/DROP VIEW v2; /*u0*/DROP VIEW v3; /*u0*/DROP VIEW v4; /*u0*/DROP VIEW v5; /*u0*/DROP VIEW v6; /*u0*/DROP VIEW v7; /*u0*/DROP VIEW v8; /*u0*/DROP VIEW v9; /*u0*/DROP VIEW v10; /*u0*/DROP VIEW v11; /*u0*/DROP VIEW v13; /*u0*/DROP VIEW v14; /*u0*/DROP VIEW v17; /*u0*/DROP VIEW v18; /*u0*/DROP VIEW v19; /*u0*/DROP VIEW v20; /*u0*/DROP VIEW v21; /*u0*/DROP VIEW v22; /*u0*/DROP VIEW v23; /*u0*/DROP VIEW v24; /*u0*/DROP VIEW v25; /*u0*/DROP VIEW v26; /*u0*/DROP VIEW v28; /*u0*/DROP VIEW v29; /*u0*/DROP VIEW v30; /*u0*/DROP VIEW v31; /*u0*/DROP VIEW v32; /*u0*/DROP VIEW v33; /*u0*/DROP VIEW v34; /*u0*/DROP VIEW v35; /*u0*/DROP VIEW v36; /*u0*/DROP VIEW v37; /*u0*/DROP VIEW v38; /*u0*/DROP VIEW v39; /*u0*/DROP VIEW v40; /*u0*/DROP VIEW v41; /*u0*/DROP VIEW v42; /*u0*/DROP VIEW v43; /*u0*/DROP VIEW v44; /*u0*/DROP VIEW v45; /*u0*/DROP VIEW v46; /*u0*/DROP VIEW v47; /*u0*/DROP VIEW v48; /*u0*/DROP VIEW v49; /*u0*/DROP VIEW v50; /*u0*/DROP VIEW v51; /*u0*/DROP VIEW v52; /*u0*/DROP VIEW v53; /*u0*/DROP VIEW v54; /*u0*/DROP VIEW v55; /*u0*/DROP VIEW v56; /*u0*/DROP VIEW v57; DROP TABLE t1; DROP TABLE t2; DROP TABLE j1; -- ****************************** PHASE 1 Indexes drop view v1 if exists; drop view v2 if exists; drop table t1 if exists; drop table t3 if exists; drop table t4 if exists; /*u0*/CREATE TABLE t1 (i int); /*u0*/CREATE TABLE t3 (i int); /*u0*/CREATE TABLE t4 (i int); /*u0*/CREATE UNIQUE INDEX i1 ON t1(i); /*u0*/CREATE UNIQUE INDEX public.i2 on t3(i); /*e*/CREATE UNIQUE INDEX other.i3 on t4(i); /*e*/CREATE UNIQUE INDEX information_schema.i3 on t4(i int); /*e*/DROP INDEX other.i1; /*u0*/DROP INDEX public.i1; /*e*/DROP INDEX information_schema.i2; /*u0*/DROP INDEX i2; -- Objects created from Sessions are created as public.object for Phase 1 /*e*/CREATE TABLE other.t2 (i int); SHOULD FAIL since no such schema -- Create the schema "other" -- /*u0*/CREATE TABLE other.t2 (i int); -- /*u1*/INSERT INTO t2 values(0); -- /*u1*/INSERT INTO t2 values(0); -- /*e*/SELECT * FROM wrong.t2; -- /*c1*/SELECT * FROM other.t2; -- /*c2*/SELECT * FROM other.t1; SHOULD FAIL since we created public.t1 hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfUserFunction.txt0000644000175000017500000000201212007547346023726 0ustar renerene-- -- TestSelfUserFunction.txt -- -- This test checks if the USER() function works correctly when used within -- prepared statements such as VIEW's and constraints in TABLE's -- Setup tables and views DROP TABLE USER_PROFILE IF EXISTS CREATE TABLE USER_PROFILE(NAME VARCHAR(10), PROFILE INT) DROP VIEW USER_SECURITY_PROFILE_VIEW IF EXISTS CREATE VIEW USER_SECURITY_PROFILE_VIEW AS SELECT * FROM USER_PROFILE WHERE Name = USER() -- Create user for test CREATE USER MATT PASSWORD MATT ADMIN -- This checks that you are allowed to insert a row as long as your username matches the NAME field /*u1*/ INSERT INTO USER_PROFILE(NAME, PROFILE) VALUES('SA',10) -- Connect as MATT CONNECT USER MATT PASSWORD MATT -- Insert a row as the connected user /*u1*/ INSERT INTO USER_PROFILE(NAME, PROFILE) VALUES('MATT',20) -- There are two rows in the table but the select should only return the row -- associated with the connected user i.e. one row /*c1*/ SELECT COUNT(*) FROM USER_SECURITY_PROFILE_VIEW SHUTDOWN hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfSubselects.txt0000644000175000017500000001655712007547346023441 0ustar renerenedrop table colors if exists; drop table sizes if exists; drop table fruits if exists; drop table trees if exists; create table colors(id int, val char(20)); insert into colors values(1,'red'); insert into colors values(2,'green'); insert into colors values(3,'orange'); insert into colors values(4,'indigo'); create table sizes(id int, val char(20)); insert into sizes values(1,'small'); insert into sizes values(2,'medium'); insert into sizes values(3,'large'); insert into sizes values(4,'odd'); create table fruits(id int, name char(30), color_id int); insert into fruits values(1, 'golden delicious',2); insert into fruits values(2, 'macintosh',1); insert into fruits values(3, 'red delicious',1); insert into fruits values(4, 'granny smith',2); insert into fruits values(5, 'tangerine',4); create table trees(id int, name char(30), fruit_id int, size_id int); insert into trees values(1, 'small golden delicious tree',1,1); insert into trees values(2, 'large macintosh tree',2,3); insert into trees values(3, 'large red delicious tree',3,3); insert into trees values(4, 'small red delicious tree',3,1); insert into trees values(5, 'medium granny smith tree',4,2); select a.val, b.name from sizes a, trees b where a.id = b.size_id and b.id in (select a.id from trees a, fruits b where a.fruit_id = b.id and b.name='red delicious') order by a.val; -- -- bug #547764 -- name in subquery must resolve to the subquery first drop table trees if exists; drop table fruits if exists; create table trees(id integer primary key,name varchar(30) not null); create table fruits(id integer primary key,name varchar(30) not null, tree_id integer not null,foreign key (tree_id) references trees(id)); insert into trees (id, name) values (1, 'apple'); insert into fruits (id, name, tree_id) values(1, 'pippin', 1); insert into fruits (id, name, tree_id) values(2, 'granny smith', 1); /*c2*/select id from fruits where tree_id in(select id from trees where name = 'apple'); drop table table1 if exists; drop table table2 if exists; CREATE TABLE TABLE1 (COL1 INTEGER, COL2 CHAR(1)) CREATE TABLE TABLE2 (COL1 INTEGER) insert into table1 values 1, 'X' insert into table2 values 1 /*r1*/SELECT T1.COL1 FROM TABLE1 T1 INNER JOIN (SELECT COL1 FROM TABLE2) T2 ON T1.COL1 = T2.COL1 WHERE T1.COL2 = 'X' /*r null,4 5,6 */select * from ( select null as aaaaaaa, 4 as b from table2 union select 5 as aaaaaaa, 6 as b from table2 ) baz drop table table1 drop table table2 -- mixed aggregate and subquery with aggregate with group by CREATE CACHED TABLE PUBLIC.VC_CORE_TERMINALPROFILE_TAG(TERMINALPROFILE_ID BIGINT NOT NULL, TAG_ID BIGINT NOT NULL, PRIMARY KEY(TERMINALPROFILE_ID, TAG_ID)); CREATE CACHED TABLE PUBLIC.VC_DEVICE_TERMINAL(ID BIGINT NOT NULL PRIMARY KEY, VERSION INTEGER NOT NULL, NAME VARCHAR(64), NOTES VARCHAR(1024), ACTIVE BIT, STATE INTEGER NOT NULL, TERMINALPROFILE_ID BIGINT ); CREATE CACHED TABLE PUBLIC.VC_DEVICE_TERMINALPROFILE(ID BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY, NAME VARCHAR(128), DATECREATED TIMESTAMP, DATECREATEDTIMEZONEID VARCHAR(50), FAKEDOUTFFISIZE BIGINT, FAKEDOUTFFIMD5 VARCHAR(255), TEMPORARYPROFILE BIT, NETWORKCONFIGURATION_ID BIGINT, FFIFILE_ID BIGINT, BBIFILE_ID BIGINT, RRIFILE_ID BIGINT, FIRMWARE_ID BIGINT); CREATE CACHED TABLE PUBLIC.VOC_SITE(SITEID BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY, VERSION INTEGER NOT NULL, NAME VARCHAR(255) NOT NULL, DESCRIPTION VARCHAR(2000), NOTES VARCHAR(2000), TIMEZONE VARCHAR(255), EAPTYPE INTEGER, CREDENTIALASSOCIATION INTEGER, CREDENTIALTYPE INTEGER, USEPINS BIT, CHARGERDISCONNECT BIT, RESTRICTEDSSID VARCHAR(128), RESTRICTEDEAPTYPE INTEGER, SITEPIN VARCHAR(32), SERVERCREDENTIALS_ID BIGINT, SITEWIDEUSER_ID BIGINT, RESTRICTEDUSER_ID BIGINT, LDAPCONFIG_ID BIGINT, UNIQUE(NAME)) ; CREATE CACHED TABLE PUBLIC.VOC_TAG(ID BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY, TAG_TYPE BIGINT, TAGGABLE_ID BIGINT); CREATE INDEX IDX_TERMINAL_TERMINALPROFILE ON PUBLIC.VC_DEVICE_TERMINAL(TERMINALPROFILE_ID); ALTER TABLE PUBLIC.VOC_SITE ALTER COLUMN SITEID RESTART WITH 1; ALTER TABLE PUBLIC.VOC_TAG ALTER COLUMN ID RESTART WITH 1; ALTER TABLE PUBLIC.VC_CORE_TERMINALPROFILE_TAG ADD CONSTRAINT FKEC676CBA9924AE56 FOREIGN KEY(TERMINALPROFILE_ID) REFERENCES PUBLIC.VC_DEVICE_TERMINALPROFILE(ID); ALTER TABLE PUBLIC.VC_CORE_TERMINALPROFILE_TAG ADD CONSTRAINT FKEC676CBA3EF30942 FOREIGN KEY(TAG_ID) REFERENCES PUBLIC.VOC_TAG(ID); ALTER TABLE PUBLIC.VC_DEVICE_TERMINAL ADD CONSTRAINT FK_TERMINAL_TERMINALPROFILE FOREIGN KEY(TERMINALPROFILE_ID) REFERENCES PUBLIC.VC_DEVICE_TERMINALPROFILE(ID); INSERT INTO VC_DEVICE_TERMINALPROFILE (id, temporaryProfile, name) VALUES (1, 0, 'tp1'); INSERT INTO VC_DEVICE_TERMINALPROFILE (id, temporaryProfile, name) VALUES (2, 0, 'tp2'); INSERT INTO voc_tag (id, tag_type, taggable_id) VALUES (-463, 1, -463); INSERT INTO voc_tag (id, tag_type, taggable_id) VALUES (-25, 1, -24); INSERT INTO voc_tag (id, tag_type, taggable_id) VALUES (-1, 1, -1); INSERT INTO vc_core_terminalprofile_tag (terminalprofile_id, tag_id) VALUES (1, -1); INSERT INTO vc_core_terminalprofile_tag (terminalprofile_id, tag_id) VALUES (2, -1); INSERT INTO voc_site (siteid, version, name, description) VALUES (-24, 0, 'two', 'second'); INSERT INTO voc_site (siteid, version, name, description) VALUES (-1, 0, 'one', 'first'); SELECT terminalpr1_.id as termid, terminalpr1_.name, min(terminalpr1_.name) as name, count(terminals2_.id) as terminals, (SELECT count(*) FROM vc_device_terminal terminal5_ WHERE terminal5_.terminalprofile_id=terminalpr1_.id AND terminal5_.state=0) as col_3_0_, (SELECT count(*) FROM vc_device_terminal terminal6_ WHERE terminal6_.terminalprofile_id=terminalpr1_.id AND (terminal6_.state IN (1 , 6))) as col_4_0_, (SELECT count(*) FROM vc_device_terminal terminal7_ WHERE terminal7_.terminalprofile_id=terminalpr1_.id AND terminal7_.state=3) as col_5_0_, (SELECT count(*) FROM vc_device_terminal terminal8_ WHERE terminal8_.terminalprofile_id=terminalpr1_.id AND terminal8_.state=4) as col_6_0_, (SELECT count(*) FROM vc_device_terminal terminal9_ WHERE terminal9_.terminalprofile_id=terminalpr1_.id AND terminal9_.state=5) as col_7_0_, (SELECT count(*) FROM vc_device_terminal terminal10_ WHERE terminal10_.terminalprofile_id=terminalpr1_.id AND terminal10_.state=7) as col_8_0_, (SELECT count(*) FROM vc_device_terminal terminal11_ WHERE terminal11_.terminalprofile_id=terminalpr1_.id AND terminal11_.state=8) as col_9_0_, (SELECT count(*) FROM vc_device_terminal terminal12_ WHERE terminal12_.terminalprofile_id=terminalpr1_.id AND terminal12_.state=-1) as col_10_0_, max(site0_.name) as col_11_0_, max(site0_.siteId) as col_12_0_ FROM voc_site site0_, vc_core_terminalprofile_tag tags3_, voc_tag tag4_, vc_device_terminalprofile terminalpr1_ LEFT OUTER JOIN vc_device_terminal terminals2_ ON terminalpr1_.id=terminals2_.terminalprofile_id AND (terminals2_.active=1) WHERE terminalpr1_.temporaryProfile=0 AND terminalpr1_.id=tags3_.terminalprofile_id AND tags3_.tag_id=tag4_.id AND tag4_.taggable_id=site0_.siteId AND (tag4_.id IN (-1)) GROUP BY terminalpr1_.id; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfInPredicateReferencing.txt0000644000175000017500000001641712007547346025657 0ustar renereneDROP TABLE dups IF EXISTS; CREATE TABLE dups(pk INTEGER NOT NULL PRIMARY KEY,val VARCHAR(10) NOT NULL); INSERT INTO dups VALUES (1, 'first'); INSERT INTO dups VALUES (2, 'second'); INSERT INTO dups VALUES (3, 'third'); INSERT INTO dups VALUES (4, 'first'); INSERT INTO dups VALUES (5, 'first'); INSERT INTO dups VALUES (6, 'second'); SELECT a.pk, a.val FROM dups a WHERE a.pk in (SELECT sa.pk FROM dups sa, dups sb WHERE sa.val=sb.val AND sa.pk!=sb.pk); SELECT sa.pk FROM dups sa, dups sb WHERE sa.val=sb.val AND sa.pk!=sb.pk; /*c5*/SELECT a.pk, a.val FROM dups a WHERE a.pk IN (1, 2, 4, 5, 6); /*c2*/SELECT a.pk, a.val FROM dups a WHERE (a.pk, a.val) IN ((1, 'first'), (5, 'first')); -- IN with nulls /*c0*/SELECT * FROM dups WHERE null IN (1, 2) /*c0*/SELECT * FROM dups WHERE null IN (null, 2) /*c0*/SELECT * FROM dups WHERE null IN (null, 2) /*e*/SELECT * FROM dups WHERE null IN (null, null) /*c0*/SELECT * FROM dups WHERE cast(null AS INT) IN (null, null) /*c1*/SELECT * FROM dups WHERE pk IN (null, 1) /*c0*/SELECT * FROM dups WHERE pk IN (null, null) -- ALL /*r 1,first 4,first 5,first */SELECT a.pk, a.val FROM dups a WHERE a.val = ALL(SELECT sa.val FROM dups sa WHERE sa.val = 'first') ORDER BY a.pk; /*r 1,first 2,second 3,third 4,first 5,first 6,second */SELECT a.pk, a.val FROM dups a WHERE a.val >= ALL(SELECT sa.val FROM dups sa WHERE sa.val = 'first') ORDER BY a.pk; /*r 2,second 3,third 6,second */SELECT a.pk, a.val FROM dups a WHERE a.val > ALL(SELECT sa.val FROM dups sa WHERE sa.val = 'first') ORDER BY a.pk; /*r 1,first 2,second 4,first 5,first 6,second */SELECT a.pk, a.val FROM dups a WHERE a.val <= ALL(SELECT sa.val FROM dups sa WHERE sa.val = 'second') ORDER BY a.pk; /*r 1,first 2,second 4,first 5,first 6,second */SELECT a.pk, a.val FROM dups a WHERE a.val < ALL(SELECT sa.val FROM dups sa WHERE sa.val = 'third') ORDER BY a.pk; /*r 1,first 4,first 5,first */SELECT a.pk, a.val FROM dups a WHERE a.val <= ALL(SELECT sa.val FROM dups sa) ORDER BY a.pk; -- ANY /*r 1,first 2,second 4,first 5,first 6,second */SELECT a.pk, a.val FROM dups a WHERE a.val < ANY(SELECT sa.val FROM dups sa) ORDER BY a.pk; /*r 2,second 3,third 6,second */SELECT a.pk, a.val FROM dups a WHERE a.val > ANY(SELECT sa.val FROM dups sa) ORDER BY a.pk; /*r 1,first 2,second 3,third 4,first 5,first 6,second */SELECT a.pk, a.val FROM dups a WHERE a.val <= ANY(SELECT sa.val FROM dups sa) ORDER BY a.pk; /*c0*/SELECT a.pk, a.val FROM dups a WHERE a.val <= ANY(SELECT CAST(NULL AS CHAR) FROM dups sa) ORDER BY a.pk; /*e*/SELECT a.pk, a.val FROM dups a WHERE a.val <= ANY(SELECT NULL FROM dups sa) ORDER BY a.pk; /*c0*/SELECT a.pk, a.val FROM dups a WHERE a.val <= ANY(SELECT CAST(NULL AS CHAR) FROM dups sa WHERE sa.val ='fourth') ORDER BY a.pk; /*e*/SELECT a.pk, a.val FROM dups a WHERE a.val <= ANY(SELECT NULL FROM dups sa WHERE sa.val ='fourth') ORDER BY a.pk; -- non-correlated single value /*r 1,first 4,first 5,first */SELECT a.pk, a.val FROM dups a WHERE a.val = (SELECT sa.val FROM dups sa WHERE sa.pk = 4) ORDER BY a.pk; -- bug item #1100384 drop table a if exists; drop table b if exists; drop table m if exists; create table a(a_id integer); create table b(b_id integer); create table m(m_a_id integer, m_b_id integer); insert into a(a_id) values(1); insert into b(b_id) values(10); insert into m(m_a_id, m_b_id) values(1, 5); insert into m(m_a_id, m_b_id) values(1, 10); insert into m(m_a_id, m_b_id) values(1, 20); /*r1,10*/select a.a_id, b.b_id from a, b where a.a_id in (select m.m_a_id from m where b.b_id = m.m_b_id); /*r1,10*/select a.a_id, b.b_id from a join b on a.a_id in (select m.m_a_id from m where b.b_id = m.m_b_id); /*u1*/update m set m_a_id = 2 where m_b_id in (1, 10, 100); /*r 1,5 2,10 1,20 */select * from m order by m_b_id -- DROP TABLE T IF EXISTS; CREATE TABLE T(C VARCHAR_IGNORECASE(10)); INSERT INTO T VALUES ('felix'); /*r felix */SELECT * FROM T WHERE C IN ('Felix', 'Feline'); /*c0*/SELECT * FROM T WHERE C IN ('Pink', 'Feline'); DROP TABLE T; CREATE TABLE T(C CHAR(10)); INSERT INTO T VALUES ('felix'); /*c1*/SELECT * FROM T WHERE C IN ('felix', 'pink'); DROP TABLE T; -- create table t (c1 int, c2 int, primary key(c2, c1)) insert into t values (10, 20), (11, 21), (21, 32) /*r 11,21 */select * from t where (c1, c2) in ((11, 21)) /*r 11,21 */select * from t where (c2, c1) in ((21, 11)) update t set c2 = 31 where (c2, c1) in ((21, 11)) -- drop table if exists test_trips; drop table if exists test_routes; create table test_routes (agencyId varchar(50) not null, id varchar(255) not null, primary key (agencyId, id)); create table test_trips (agencyId varchar(50) not null, id varchar(255) not null, route_agencyId varchar(50), route_id varchar(255), primary key (agencyId, id)); alter table test_trips add constraint test_trips_routes foreign key (route_agencyId, route_id) references test_routes; insert into test_routes (agencyId, id) values ('a','r1'),('a','r2'); insert into test_trips (agencyId, id,route_agencyId,route_id) values ('a','1','a','r1'),('a','2','a','r2'); /*c1*/select * from test_trips where (route_agencyId, route_id) in (('a','r1')); /*c2*/select * from test_trips where (route_agencyId, route_id) in (values('a','r1'), ('a','r2')); create table inv_txn (id bigint primary key, inv_account_target bigint); create table inv_element (id bigint primary key, inv_txn bigint, product bigint, quantity bigint); insert into inv_txn values (1, 1); insert into inv_txn values(2, 2); insert into inv_element values (1, 1, 1, 25); insert into inv_element values (2, 1, 1, 10); insert into inv_element values (3, 1, 2, 15); insert into inv_element values (4, 1, 2, 5); insert into inv_element values (5, 1, 3, 50); insert into inv_element values (6, 1, 3, 30); insert into inv_element values (7, 1, 4, 5); insert into inv_element values (8, 1, 4, 15); insert into inv_element values (9, 1, 5, 100); insert into inv_element values (10, 1, 6, 75); insert into inv_element values (11, 2, 1, 25); insert into inv_element values (12, 2, 1, 10); insert into inv_element values (13, 2, 2, 15); insert into inv_element values (14, 2, 2, 5); insert into inv_element values (15, 2, 3, 50); insert into inv_element values (16, 2, 3, 30); insert into inv_element values (17, 2, 4, 5); insert into inv_element values (18, 2, 4, 15); insert into inv_element values (19, 2, 5, 100); insert into inv_element values (20, 2, 6, 75); -- query must show the same values in columns using equality or IN predicates select inv_element.product, sum(casewhen(inv_txn.inv_account_target in (1), quantity, 0)) as badtarget1qty, sum(casewhen(inv_txn.inv_account_target = 1, quantity, 0)) as goodtarget1qty, sum(casewhen(inv_txn.inv_account_target in (2), quantity, 0)) as badtarget2qty, sum(casewhen(inv_txn.inv_account_target = 2, quantity, 0)) as goodtarget2qty, sum(casewhen(inv_txn.inv_account_target in (1, 2), quantity, 0)) as badtotalqty, sum(casewhen(inv_txn.inv_account_target = 1 or inv_txn.inv_account_target = 2, quantity, 0)) as goodtotalqty from inv_txn inner join inv_element on inv_txn.id = inv_element.inv_txn group by product; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfNoDmlBug2.txt0000644000175000017500000000077712007547344023051 0ustar renerene-- Tests a bug where with write_delay of 0, DML is not persisted until and -- if DML is committed or DB is "shutdown". If DB stops with no shutdown, -- all work is lost. /*u0*/SET SCHEMA ghostSchema; /*s*/DROP SCHEMA ghostSchema CASCADE; -- N.b. this test is unable to exhibit the problem because -- (a) It doesn't show when data is being written to the .log file; and -- (b) The test runner does a shutdown of some sort. To reproduce -- problem manually, just Ctrl-C out of the session. hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfViews.txt0000644000175000017500000000376312007547346022415 0ustar renerenedrop view v_my_server if exists; drop table my_group if exists; drop table dual if exists; drop table my_server if exists; -- test subselect in view create cached table my_group (id integer, group_id integer); insert into my_group values (1, 1); insert into my_group values (2, 1); insert into my_group values (3, 1); insert into my_group values (4, 1); create cached table dual (a integer); insert into dual values (0); create cached table my_server (group_id integer, server_id integer, weight integer); insert into my_server values (-1, 1, 1); insert into my_server values (-1, 2, 0); insert into my_server values (100, 11, 1); -- CREATE VIEW v_my_server AS SELECT DISTINCT mg.id, ms.server_id, ms.weight FROM (SELECT id, group_id FROM my_group UNION SELECT -1, -1 FROM DUAL) mg, my_server ms WHERE mg.group_id = ms.group_id; -- /*c2*/select * from v_my_server; /*c2*/select * from (select * from v_my_server); -- test view in view drop view v_test_view if exists; CREATE VIEW v_test_view AS SELECT a.id, b.server_id, b.weight FROM v_my_server a JOIN v_my_server b ON a.id = b.id; /*c4*/select * from v_test_view; /*c4*/select * from (select * from v_test_view); -- drop table colors if exists; create table colors(id int, val char(10)); insert into colors values(1,'red'); insert into colors values(2,'green'); insert into colors values(3,'orange'); insert into colors values(4,'indigo'); -- drop view v_colors if exists; create view v_colors(vid, vval) as select id, val from colors; create view v_colors_o(vid, vval) as select id, val from colors order by id desc; create view v_colors_o_l(vid, vval) as select id, val from colors order by id desc limit 1 offset 0; create view v_colors_o_l_x(vid, vval) as select id, val from colors limit 1 offset 0; /*e*/create view v_colors_o_l_x(vid, vval) as select id, val into newtable from colors; -- /*c4*/select * from v_colors join v_test_view on server_id=vid; /*c2*/select distinct * from v_test_view join v_colors on server_id=vid; hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfInternalFunctions.txt0000644000175000017500000000123212007547346024752 0ustar renerene/*rXXX*/call trim(' XXX '); /*rXXX*/call trim(FROM ' XXX '); /*rXXX*/call trim(BOTH FROM ' XXX '); /*rXXX*/call trim(BOTH ' ' FROM ' XXX '); /*e*/call trim(BOTH FROM); /*rXXX*/call substring( ' XXX ' from 2 for 3); /*rXXX*/call substring( ' XXX' from 2); /*rXXXX*/call overlay( 'YYY' placing 'XXXX' from 1 for 3); /*rYXXYY*/call overlay( 'YYYYYY' placing 'XX' from 2 for 3); /*rXYY*/call overlay( 'YYY' placing 'X' from 1); /*rYXY*/call overlay( 'YYY' placing 'X' from 2); /*r0109090405*/call overlay( x'0102030405' placing x'0909' from 2); call current_timestamp; call current_timestamp(1); call current_time; call current_time(6); hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfNot.txt0000644000175000017500000011514212007547346022053 0ustar renerene-- -- -------------------------------------------------------------------- -- Checking compliance of type INTEGER drop table SQLUNKNOWNCOMPLIANCECHECK if exists create table SQLUNKNOWNCOMPLIANCECHECK(a INTEGER, b INTEGER) -- Checking v = NULL /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a = b -- -- Checking NOT v = NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a = b -- -- Checking v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <> b -- -- Checking NOT v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <> b -- -- Checking v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b -- -- Checking NOT v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a < b -- -- Checking v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <= b -- -- Checking NOT v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <= b -- -- Checking v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a > b -- -- Checking NOT v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a > b -- -- Checking v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a >= b -- -- Checking NOT v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a >= b -- -- Checking BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b between 1 and 2 -- -- Checking NOT BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b between 1 and 2 -- -- Checking IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b in (1, 2) -- -- Checking NOT IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b in (1, 2) -- -- Checking T && T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 2) /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (2, 1) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 1 -- -- Checking T && F = F /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 2) /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (2, 1) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking T && U = U /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 1) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a and a < b -- -- Checking T || T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 2) /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (2, 1) /*c2*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or a > b -- -- Checking T || F = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 2) /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (2, 1) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking T || U = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 1) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a or a < b -- -- Checking BETWEEN: >= and <= /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 2) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where (a between 1 and 2) or (b between 1 and 2) -- -- -- -------------------------------------------------------------------- -- Checking compliance of type SMALLINT drop table SQLUNKNOWNCOMPLIANCECHECK if exists create table SQLUNKNOWNCOMPLIANCECHECK(a SMALLINT, b SMALLINT) -- Checking v = NULL /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a = b -- -- Checking NOT v = NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a = b -- -- Checking v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <> b -- -- Checking NOT v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <> b -- -- Checking v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b -- -- Checking NOT v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a < b -- -- Checking v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <= b -- -- Checking NOT v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <= b -- -- Checking v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a > b -- -- Checking NOT v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a > b -- -- Checking v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a >= b -- -- Checking NOT v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a >= b -- -- Checking BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b between 1 and 2 -- -- Checking NOT BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b between 1 and 2 -- -- Checking IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b in (1, 2) -- -- Checking NOT IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b in (1, 2) -- -- Checking T && T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 2) /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (2, 1) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 1 -- -- Checking T && F = F /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 2) /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (2, 1) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking T && U = U /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 1) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a and a < b -- -- Checking T || T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 2) /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (2, 1) /*c2*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or a > b -- -- Checking T || F = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 2) /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (2, 1) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking T || U = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 1) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a or a < b -- -- Checking BETWEEN: >= and <= /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1, 2) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where (a between 1 and 2) or (b between 1 and 2) -- -- -- -------------------------------------------------------------------- -- Checking compliance of type FLOAT drop table SQLUNKNOWNCOMPLIANCECHECK if exists create table SQLUNKNOWNCOMPLIANCECHECK(a FLOAT, b FLOAT) -- Checking v = NULL /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a = b -- -- Checking NOT v = NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a = b -- -- Checking v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <> b -- -- Checking NOT v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <> b -- -- Checking v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b -- -- Checking NOT v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a < b -- -- Checking v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <= b -- -- Checking NOT v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <= b -- -- Checking v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a > b -- -- Checking NOT v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a > b -- -- Checking v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a >= b -- -- Checking NOT v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a >= b -- -- Checking BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b between 1.0 and 2.0 -- -- Checking NOT BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b between 1.0 and 2.0 -- -- Checking IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b in (1.0, 2.0) -- -- Checking NOT IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b in (1.0, 2.0) -- -- Checking T && T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, 2.0) /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (2.0, 1.0) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 1 -- -- Checking T && F = F /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, 2.0) /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (2.0, 1.0) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking T && U = U /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, 1.0) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a and a < b -- -- Checking T || T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, 2.0) /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (2.0, 1.0) /*c2*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or a > b -- -- Checking T || F = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, 2.0) /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (2.0, 1.0) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking T || U = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, NULL) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, 1.0) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a or a < b -- -- Checking BETWEEN: >= and <= /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values (1.0, 2.0) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where (a between 1.0 and 2.0) or (b between 1.0 and 2.0) -- -- -- -------------------------------------------------------------------- -- Checking compliance of type DATE drop table SQLUNKNOWNCOMPLIANCECHECK if exists create table SQLUNKNOWNCOMPLIANCECHECK(a DATE, b DATE) -- Checking v = NULL /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a = b -- -- Checking NOT v = NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a = b -- -- Checking v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <> b -- -- Checking NOT v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <> b -- -- Checking v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b -- -- Checking NOT v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a < b -- -- Checking v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <= b -- -- Checking NOT v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <= b -- -- Checking v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a > b -- -- Checking NOT v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a > b -- -- Checking v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a >= b -- -- Checking NOT v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a >= b -- -- Checking BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b between '2003-10-20' and '2005-05-06' -- -- Checking NOT BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b between '2003-10-20' and '2005-05-06' -- -- Checking IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b in (DATE'2003-10-20', DATE'2005-05-06') -- -- Checking NOT IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b in (DATE'2003-10-20', DATE'2005-05-06') -- -- Checking T && T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', '2005-05-06') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2005-05-06', '2003-10-20') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 1 -- -- Checking T && F = F /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', '2005-05-06') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2005-05-06', '2003-10-20') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking T && U = U /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', '2003-10-20') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a and a < b -- -- Checking T || T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', '2005-05-06') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2005-05-06', '2003-10-20') /*c2*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or a > b -- -- Checking T || F = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', '2005-05-06') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2005-05-06', '2003-10-20') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking T || U = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', NULL) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', '2003-10-20') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a or a < b -- -- Checking BETWEEN: >= and <= /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2003-10-20', '2005-05-06') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where (a between '2003-10-20' and '2005-05-06') or (b between '2003-10-20' and '2005-05-06') -- -- -- -------------------------------------------------------------------- -- Checking compliance of type TIME drop table SQLUNKNOWNCOMPLIANCECHECK if exists create table SQLUNKNOWNCOMPLIANCECHECK(a TIME, b TIME) -- Checking v = NULL /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a = b -- -- Checking NOT v = NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a = b -- -- Checking v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <> b -- -- Checking NOT v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <> b -- -- Checking v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b -- -- Checking NOT v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a < b -- -- Checking v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <= b -- -- Checking NOT v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <= b -- -- Checking v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a > b -- -- Checking NOT v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a > b -- -- Checking v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a >= b -- -- Checking NOT v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a >= b -- -- Checking BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b between '10:00:00' and '12:32:36' -- -- Checking NOT BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b between '10:00:00' and '12:32:36' -- -- Checking IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b in (TIME'10:00:00', TIME'12:32:36') -- -- Checking NOT IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b in (TIME'10:00:00', TIME'12:32:36') -- -- Checking T && T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', '12:32:36') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('12:32:36', '10:00:00') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 1 -- -- Checking T && F = F /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', '12:32:36') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('12:32:36', '10:00:00') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking T && U = U /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', '10:00:00') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a and a < b -- -- Checking T || T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', '12:32:36') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('12:32:36', '10:00:00') /*c2*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or a > b -- -- Checking T || F = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', '12:32:36') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('12:32:36', '10:00:00') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking T || U = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', NULL) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', '10:00:00') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a or a < b -- -- Checking BETWEEN: >= and <= /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('10:00:00', '12:32:36') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where (a between '10:00:00' and '12:32:36') or (b between '10:00:00' and '12:32:36') -- -- -- -------------------------------------------------------------------- -- Checking compliance of type TIMESTAMP drop table SQLUNKNOWNCOMPLIANCECHECK if exists create table SQLUNKNOWNCOMPLIANCECHECK(a TIMESTAMP, b TIMESTAMP) -- Checking v = NULL /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a = b -- -- Checking NOT v = NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a = b -- -- Checking v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <> b -- -- Checking NOT v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <> b -- -- Checking v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b -- -- Checking NOT v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a < b -- -- Checking v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <= b -- -- Checking NOT v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <= b -- -- Checking v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a > b -- -- Checking NOT v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a > b -- -- Checking v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a >= b -- -- Checking NOT v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a >= b -- -- Checking BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b between '2004-05-06 12:32:36.491' and '2005-05-06 12:32:36.491' -- -- Checking NOT BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b between '2004-05-06 12:32:36.491' and '2005-05-06 12:32:36.491' -- -- Checking IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b in (TIMESTAMP'2004-05-06 12:32:36.491', TIMESTAMP'2005-05-06 12:32:36.491') -- -- Checking NOT IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b in (TIMESTAMP'2004-05-06 12:32:36.491', TIMESTAMP'2005-05-06 12:32:36.491') -- -- Checking T && T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', '2005-05-06 12:32:36.491') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2005-05-06 12:32:36.491', '2004-05-06 12:32:36.491') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 1 -- -- Checking T && F = F /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', '2005-05-06 12:32:36.491') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2005-05-06 12:32:36.491', '2004-05-06 12:32:36.491') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking T && U = U /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', '2004-05-06 12:32:36.491') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a and a < b -- -- Checking T || T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', '2005-05-06 12:32:36.491') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2005-05-06 12:32:36.491', '2004-05-06 12:32:36.491') /*c2*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or a > b -- -- Checking T || F = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', '2005-05-06 12:32:36.491') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2005-05-06 12:32:36.491', '2004-05-06 12:32:36.491') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking T || U = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', NULL) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', '2004-05-06 12:32:36.491') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a or a < b -- -- Checking BETWEEN: >= and <= /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('2004-05-06 12:32:36.491', '2005-05-06 12:32:36.491') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where (a between '2004-05-06 12:32:36.491' and '2005-05-06 12:32:36.491') or (b between '2004-05-06 12:32:36.491' and '2005-05-06 12:32:36.491') -- -- -- -------------------------------------------------------------------- -- Checking compliance of type CHAR(1) drop table SQLUNKNOWNCOMPLIANCECHECK if exists create table SQLUNKNOWNCOMPLIANCECHECK(a CHAR(1), b CHAR(1)) -- Checking v = NULL /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a = b -- -- Checking NOT v = NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a = b -- -- Checking v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <> b -- -- Checking NOT v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <> b -- -- Checking v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b -- -- Checking NOT v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a < b -- -- Checking v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <= b -- -- Checking NOT v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <= b -- -- Checking v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a > b -- -- Checking NOT v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a > b -- -- Checking v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a >= b -- -- Checking NOT v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a >= b -- -- Checking BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b between 'a' and 'b' -- -- Checking NOT BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b between 'a' and 'b' -- -- Checking IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b in ('a', 'b') -- -- Checking NOT IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b in ('a', 'b') -- -- Checking T && T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'b') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('b', 'a') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 1 -- -- Checking T && F = F /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'b') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('b', 'a') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking T && U = U /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'a') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a and a < b -- -- Checking T || T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'b') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('b', 'a') /*c2*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or a > b -- -- Checking T || F = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'b') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('b', 'a') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking T || U = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'a') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a or a < b -- -- Checking BETWEEN: >= and <= /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'b') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where (a between 'a' and 'b') or (b between 'a' and 'b') -- -- -- -------------------------------------------------------------------- -- Checking compliance of type VARCHAR(1) drop table SQLUNKNOWNCOMPLIANCECHECK if exists create table SQLUNKNOWNCOMPLIANCECHECK(a VARCHAR(1), b VARCHAR(1)) -- Checking v = NULL /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a = b -- -- Checking NOT v = NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a = b -- -- Checking v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <> b -- -- Checking NOT v <> NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <> b -- -- Checking v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b -- -- Checking NOT v < NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a < b -- -- Checking v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a <= b -- -- Checking NOT v <= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a <= b -- -- Checking v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a > b -- -- Checking NOT v > NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a > b -- -- Checking v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a >= b -- -- Checking NOT v >= NULL /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not a >= b -- -- Checking BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b between 'a' and 'b' -- -- Checking NOT BETWEEN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b between 'a' and 'b' -- -- Checking IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b in ('a', 'b') -- -- Checking NOT IN /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where not b in ('a', 'b') -- -- Checking T && T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'b') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('b', 'a') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 1 -- -- Checking T && F = F /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'b') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('b', 'a') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking T && U = U /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'a') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b and 1 = 0 -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 and a < b -- -- Checking F && F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a and a < b -- -- Checking T || T = T /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'b') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('b', 'a') /*c2*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or a > b -- -- Checking T || F = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'b') /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('b', 'a') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking T || U = T /*u2*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 1 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'a') /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where a < b or 1 = 0 -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where 1 = 0 or a < b -- -- Checking F || F = F /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', NULL) /*c0*/ select* from SQLUNKNOWNCOMPLIANCECHECK where b != a or a < b -- -- Checking BETWEEN: >= and <= /*u1*/ delete from SQLUNKNOWNCOMPLIANCECHECK /*u1*/ insert into SQLUNKNOWNCOMPLIANCECHECK values ('a', 'b') /*c1*/ select* from SQLUNKNOWNCOMPLIANCECHECK where (a between 'a' and 'b') or (b between 'a' and 'b') -- hsqldb2.2-2.2.9.orig/hsqldb/testrun/hsqldb/TestSelfFKModes.txt0000644000175000017500000002151112007547346022577 0ustar renerene-- CIRCULAR SELF REFERENCING FK -- ON DELETE CASCADE drop table testB if exists; create cached table testB(id integer, parent integer, ref integer, data varchar(200), unique(parent), primary key (id),foreign key (parent) references testB(id) on delete cascade, foreign key (id) references testB(parent) on delete cascade); /*u1*/insert into testB values(100,100,1,'xxxx'); /*u1*/insert into testB values(200,200,1,'xxxx'); /*u1*/delete from testB where id=100; /*r200,200,1,xxxx*/select * from testB -- NORMAL SELF REFERENCING FK -- ON DELETE CASCADE drop table testB if exists; create cached table testB(id integer, parent integer, ref integer, data varchar(200), unique (id), foreign key (parent) references testB(id) on delete cascade); /*u1*/insert into testB values(100,100,1,'xxxx'); /*u1*/insert into testB values(101,100,1,'xxxx'); /*u1*/insert into testB values(102,100,1,'xxxx'); /*u1*/insert into testB values(200,200,1,'xxxx'); /*u1*/delete from testB where id=100; /*r200,200,1,xxxx*/select * from testB /*c1*/select * from testB -- ON DELETE SET NULL drop table testB if exists; create cached table testB(id integer, parent integer, ref integer, data varchar(200), unique (id), foreign key (parent) references testB(id) on delete set null); /*u1*/insert into testB values(100,100,1,'xxxx'); /*u1*/insert into testB values(101,100,1,'xxxx'); /*u1*/insert into testB values(102,100,1,'xxxx'); /*u1*/insert into testB values(200,200,1,'xxxx'); /*u1*/delete from testB where id=100; /*r 101,NULL,1,xxxx 102,NULL,1,xxxx 200,200,1,xxxx */select * from testB order by id /*c2*/select * from testB where parent is null -- ON DELETE SET DEFAULT delete from testB; /*u4*/insert into testB values(100,100,1,'xxxx'), (101,100,1,'xxxx'), (102,100,1,'xxxx'), (200,200,1,'xxxx') drop table testB if exists; create cached table testB(id integer, parent integer default 20, ref integer, data varchar(200), unique (id),foreign key (parent) references testB(id) on delete set default); /*u1*/insert into testB values(20,20,1,'xxxx'); /*u1*/insert into testB values(100,100,1,'xxxx'); /*u1*/insert into testB values(101,100,1,'xxxx'); /*u1*/insert into testB values(200,200,1,'xxxx'); /*u1*/delete from testB where id=100; /*r 20,20,1,xxxx 101,20,1,xxxx 200,200,1,xxxx */select * from testB order by id /*c2*/select * from testB where parent=20 -- CHAINED SELF REFERENCING FK -- ON DELETE CASCADE drop table testA if exists; create cached table testA(a int primary key,b int, foreign key(b) references testA(a) on update cascade on delete cascade); insert into testA(a,b) values(1,1); insert into testA(a,b) values(2,1); insert into testA(a,b) values(3,1); insert into testA(a,b) values(4,2); insert into testA(a,b) values(5,2); insert into testA(a,b) values(6,2); insert into testA(a,b) values(7,3); insert into testA(a,b) values(8,3); insert into testA(a,b) values(9,3); /*u9*/update testA set a = a+1; /*r3*/select count(*) from testA where b=4; /*u9*/update testA set a = a-1; /*r0*/select count(*) from testA where b=4; /*r3*/select count(*) from testA where b=3; /*u1*/delete from testA where a=1; /*r0*/select count(*) from testA; -- bug 870835 -- MIXED SELF AND FORWARD REFERENCE -- UPDATE ISSUE CREATE CACHED TABLE GroupSubject ( description VARCHAR(10), parent BIGINT, admin BIGINT NOT NULL, id_ BIGINT, UNIQUE ( id_ )); CREATE CACHED TABLE UserSubject ( subjectName VARCHAR(10) NOT NULL, id_ BIGINT, UNIQUE ( id_ ), PRIMARY KEY ( subjectName )); ALTER TABLE GroupSubject ADD CONSTRAINT GroupSubject_REF_parent FOREIGN KEY ( parent ) REFERENCES GroupSubject ( id_ ); ALTER TABLE GroupSubject ADD CONSTRAINT GroupSubject_REF_admin FOREIGN KEY ( admin ) REFERENCES UserSubject ( id_ ); insert into UserSubject values ('admin', 100); insert into GroupSubject values (null, null, 100, 200); /*u1*/update GroupSubject set description = null, parent = null, admin = 100 where id_ = 200; /*r admin,100 */select * from UserSubject /*r NULL,NULL,100,200 */select * from GroupSubject -- MULTIPLE FK ISSUE drop table testA if exists; drop table testB if exists; drop table testC if exists; create cached table testA(id integer primary key); create cached table testB(id integer, foreign key (id) references testA(id) on delete cascade); create cached table testC(id integer, foreign key (id) references testA(id)); insert into testA values(1); insert into testA values(2); insert into testB values(1); insert into testB values(2); insert into testC values(1); /*e*/delete from testA /*c2*/select * from testB /*c1*/select * from testC /*u1*/delete from testA where id=2 /*c1*/select * from testA /*c1*/select * from testB /*c1*/select * from testC -- INVALID SET DEFAULT /*e*/create cached table testE(id integer, foreign key (id) references testA(id) on delete set default); /*e*/create cached table testE(id integer primary key, idref integer, foreign key (idref) references teste(id) on delete set default); create cached table testE(id integer primary key, idref integer); /*e*/alter table testE add foreign key(idref) references testE(id) on delete set default; alter table testE alter column idref set default 10; alter table testE add foreign key(idref) references testE(id) on delete set default; /*e*/alter table testE alter column idref drop default; -- drop table testA if exists cascade; drop table testB if exists; drop table testC if exists; create cached table testA(id integer primary key); create cached table testB(id integer primary key, foreign key (id) references testA(id) on delete cascade); create cached table testC(id integer primary key, foreign key (id) references testB(id) on delete cascade); insert into testA values 10 insert into testB values 10 insert into testC values 10 alter table testA add foreign key (id) references testC(id) on delete cascade; delete from testA drop table testA if exists cascade; drop table testB if exists cascade; drop table testC if exists cascade; -- create cached table testA(id integer primary key, ref integer, foreign key (ref) references testA(id)); insert into testA values 10, 10 insert into testA values 11, 10 insert into testA values 12, 10 insert into testA values 13, 12 delete from testA CREATE TABLE user( USER_ID VARCHAR(15) NOT NULL ,PASSWD_TX VARCHAR(15) NOT NULL ,CONSTRAINT user_PK PRIMARY KEY (USER_ID) ); CREATE TABLE role( ROLE_NM VARCHAR(25) NOT NULL ,DESC VARCHAR(100) NOT NULL ,CONSTRAINT role_PK PRIMARY KEY (ROLE_NM) ); CREATE TABLE user_roles( USER_ID VARCHAR(15) NOT NULL ,ROLE_NM VARCHAR(25) NOT NULL ,CONSTRAINT user_roles_PK PRIMARY KEY (USER_ID,ROLE_NM) ); ALTER TABLE user_roles ADD CONSTRAINT FK_user_roles_user_0 FOREIGN KEY (USER_ID) REFERENCES user; ALTER TABLE user_roles ADD CONSTRAINT FK_user_roles_role_1 FOREIGN KEY (ROLE_NM) REFERENCES role; INSERT INTO user VALUES('JOE_USER', 'secret'); INSERT INTO role VALUES('SUPERSTAR', 'The best role'); INSERT INTO role VALUES('ACTUAL_TALENT', 'What there''s a difference?'); INSERT INTO user_roles VALUES('JOE_USER', 'SUPERSTAR'); UPDATE user SET USER_ID='JOE_USER', PASSWD_TX = 'eat@joes37' WHERE USER_ID = 'JOE_USER' -- create table department (depid identity primary key,depname varchar(20),parentid int) ALTER TABLE department ADD FOREIGN KEY (parentid) REFERENCES department(depid) insert into department (depid,depname) values(1,'dep1') insert into department values(2,'depchild',1) delete from department create table tfk(c char, id int, v varchar(10), primary key(c, id)) create table tfk2(c char, id int, v varchar(10), foreign key(id, c) references tfk(id, c)) insert into tfk values 'f' , 1, 'string 1' insert into tfk values 'f' , 4, 'string 4' insert into tfk2 values 'f' , 1, 'string 1' insert into tfk2 values 'f' , 4, 'string 4' insert into tfk2 values 'f' , 1, 'string 1' /*e*/insert into tfk2 values 'e' , 4, 'string 4' CREATE CACHED TABLE article_a (id INT PRIMARY KEY, val VARCHAR(20)); CREATE CACHED TABLE employee_a(id INT PRIMARY KEY, val VARCHAR(20)); CREATE CACHED TABLE move_a ( id INTEGER IDENTITY PRIMARY KEY, employee_id INTEGER, article_id INTEGER, batch VARCHAR(10), source_address VARCHAR(15), dest_address VARCHAR(15), quantity DECIMAL(10,2), done DATETIME, CONSTRAINT fk_move_article FOREIGN KEY (article_id) REFERENCES article_a (id) ON DELETE CASCADE, CONSTRAINT fk_move_employee FOREIGN KEY (employee_id) REFERENCES employee_a (id) ON DELETE CASCADE ); CREATE INDEX idx_move_employee ON move_a (employee_id); CREATE INDEX idx_move_article ON move_a (article_id); CREATE INDEX idx_move_batch ON move_a (batch); INSERT INTO article_a VALUES (10, 'TEN') INSERT INTO employee_a VALUES (20, 'TWENTY') INSERT INTO move_a VALUES default, 20, 10, 'test', 'test 1', 'test 2', 20.34, current_date CREATE INDEX idx_move_done ON move_a (done); hsqldb2.2-2.2.9.orig/hsqldb/build/0000755000175000017500000000000012015250576015205 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/build/setenv.cmd0000755000175000017500000000030412007547330017174 0ustar renereneREM basic environment setup REM change as needed set JAVA_HOME=C:\Program Files\Java\jdk7 set ANT_HOME=C:\java\lib\ant set ANT_OPTS=-Xmx512m set PATH=%JAVA_HOME%\bin;%ANT_HOME%\bin;%PATH% hsqldb2.2-2.2.9.orig/hsqldb/build/ivysettings-sample.xml0000644000175000017500000000143112007547330021573 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/build/dbuInstallSheetsWrapper.groovy0000755000175000017500000000007612007547330023276 0ustar renereneretVal = DocBookUtil.installStyleSheets(params[0], params[1]) hsqldb2.2-2.2.9.orig/hsqldb/build/build.hsqldb.cmd0000755000175000017500000000004312007547330020243 0ustar renerenecall setenv.cmd ant clean hsqldb hsqldb2.2-2.2.9.orig/hsqldb/build/clean.test.suite.cmd0000755000175000017500000000006312007547330021062 0ustar renerenecall setenv.cmd ant -f test.xml clean.test.suite hsqldb2.2-2.2.9.orig/hsqldb/build/test.xml0000644000175000017500000003241112007547330016705 0ustar renerene Starting JUnit Tests... Generating Test Reports... hsqldb2.2-2.2.9.orig/hsqldb/build/test.dbmd.convert.properties0000644000175000017500000000050112007547330022660 0ustar renerene## Note: ## ## Most test.dbmd.convert properties have been moved to /org/hsqldb/resources ## under the test source folder and are now read using the bundle handler facility. ## ## System properties now take precedence, so you can use this file ## to override the values in the default test.dbmd.convert properties file. hsqldb2.2-2.2.9.orig/hsqldb/build/ivy.xml0000644000175000017500000000622412007547330016540 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/build/build-dist.xml0000644000175000017500000001764012007547330017775 0ustar renerene Ant properties 'build.label' and 'hsqldb.version' must be equal. I suggest setting the value(s) in a "build.properties" file. Ant properties 'build.vendor' and 'hsqldb.vendor' must be equal. I suggest setting the value(s) in an external properties file and using the Ant "-propertyfile" switch. The 'readme.txt' file in your Subversion export contains the wrong product version. You should verify this. If the version is indeed wrong, you should abort this export, commit an updated 'readme.txt' from a work area, then retag and re-export. hsqldb2.2-2.2.9.orig/hsqldb/build/mvn-pub.gradle0000644000175000017500000002000612007547330017745 0ustar renerene/** * Invoke this build file with Gradle's -b switch for POM- or * Maven-publishing related tasks. * * Unfortunately, it is impractical to encpsulate all of the needed processing * here, so there is some tight coupling between this file and "build.gradle". * (This file loads/applies "build.gradle"). * * The tasks pulled in by this file require several properties to be set, * for populating a POM file and for specifying (and optionally authenticating * to a Maven repository server. * ***************************************************************************** * Instructions for doing a full, public release: * * Make sure that your "build.properties" file has setting 'build.dist=true'. * Right after doing the build of the zip distributable with JDK 6 and * javac.debug of false, publish the same exact jar files that are in the zip. * Use -x switches to prevent rebuilds of the jars which have been checksummed * by 'build-dist' not by 'mvn-pub'. * *
                  
                   *     gradlew -x sqltool -x osgi -b mvn-pub.gradle
                   * 
                  * * Now, for each alternative, adjust environment and build properties, like * by setting env var JAVA_HOME or build property 'build.debug', and run * *
                  
                   *   gradlew -Pclassifier=NEW_CLASSIFIER -b mvn-pub.gradle clean-all uploadArchives
                   * 
                  * The clean-all will wipe .../doc, but the .../doc and everything else from * your original dist build will be retained in .../dist/*.zip. ***************************************************************************** * For snapshot builds, just publish jar-pairs individually, exactly as * described * in the 2nd part of "Instructions for doing a full, public * release:" above, beginning with "Now, for each alternative". * (In this case, clean-all really will blow away your only docs, so either * back them up or regenerate them afterwards). * * @author Blaine Simpson (blaine dot simpson at admc dot com) */ buildscript { dependencies { // This 'buildscript' only here because with current version of Gradle, // 'buildscript' is only honored from the top-level build file executed. // When we "apply" 'build.gradle, the 'buildscript' there will be ignored. classpath fileTree(dir: '.', include: 'gradle-javaPropFile-plugin-*.jar') classpath fileTree(dir: '.', include: 'gradle-ivyxml-plugin-*.jar') } } apply plugin: 'java' apply plugin: 'maven' /* Disabling PGP signing for now. apply plugin: 'signing' signing { sign configurations.archives } */ mvnBuild = true apply from: 'build.gradle' defaultTasks 'uploadArchives' configurations { deployJars } if (project.hasProperty('mavenRepository.dest.url') && project.property('mavenRepository.dest.url').startsWith('scp://')) { repositories { mavenCentral() } dependencies { deployJars 'org.apache.maven.wagon:wagon-ssh:latest.milestone' } } // description attribute of project is always set, but may be null if (!project.hasProperty('description') || project.property('description') == null) project.description = 'HSQLDB - Lightweight 100% Java SQL Database Engine' if (!project.hasProperty('title')) title = 'HyperSQL Database' uploadArchives { def authMap = [:] if (project.hasProperty('mavenRepository.dest.username')) authMap['userName'] = project.property('mavenRepository.dest.username') if (project.hasProperty('mavenRepository.dest.password')) authMap['password'] = project.property('mavenRepository.dest.password') if (project.hasProperty('mavenRepository.dest.privateKey')) authMap['privateKey'] = project.property('mavenRepository.dest.privateKey') repositories.mavenDeployer { configuration = configurations.deployJars // Disabling PGP signing for now. //beforeDeployment { MavenDeployment deployment -> signPom(deployment) } if (project.hasProperty('mavenRepository.dest.url')) repository(url: project.property('mavenRepository.dest.url')) { authentication(authMap) } [ addFilter('hsqldb') {artifact, file -> artifact.name == 'hsqldb'}, addFilter('sqltool') {artifact, file -> artifact.name == 'sqltool'} ].each { pom -> pom.project { // The hasProperty tests are necessary even for required variables // because this code is evaluated even if the uploadArchives task // will never be executed. if (project.hasProperty('title')) name project.property('title') if (project.hasProperty('description')) description project.property('description') if (project.hasProperty('url')) url project.property('url') if (project.hasProperty('inceptionYear')) inceptionYear project.property('inceptionYear') scm { if (project.hasProperty('scm.url')) url project.property('scm.url') if (project.hasProperty('scm.connection')) connection project.property('scm.connection') if (project.hasProperty('scm.tag')) tag project.property('scm.tag') } if (project.hasProperty('org.name') || project.hasProperty('org.url')) organization { if (project.hasProperty('org.name')) name project.property('org.name') if (project.hasProperty('org.url')) url project.property('org.url') } licenses { license { name 'HSQLDB License, a BSD open source license' url 'http://hsqldb.org/web/hsqlLicense.html' distribution 'repo' } } if (project.hasProperty('developer.name') || project.hasProperty('developer.email')) developers { developer { if (project.hasProperty('developer.id')) id project.property('developer.id') if (project.hasProperty('developer.name')) name project.property('developer.name') if (project.hasProperty('developer.email')) email project.property('developer.email') } } } } } } uploadArchives { doFirst { ['title', 'group', 'mavenRepository.dest.url', 'scm.connection', 'scm.url', 'url', 'inceptionYear', 'description'].each { assert (project.hasProperty(it) && project.property(it) != null && project.property(it) != '') : """Property '$it' is required by 'uploadArchives' task. """ } } } // This is because jar.inputs is read-only // Funny name is work-around for Gradle sequencing bug task zJarDep << { if (jar.archivePath.exists() && jar.archivePath.lastModified() < file('../lib/hsqldb-osgi.jar').lastModified()) { println "Deleting $jar.archivePath.absolutePath" jar.archivePath.delete() } } jar << { File srcFile = file('../lib/hsqldb-osgi.jar') jar.archivePath.setBytes(srcFile.bytes) } jar.dependsOn = [osgi, zJarDep] if (project.hasProperty('classifier')) jar.classifier = project.classifier clean.dependsOn = [prohibitionMap['clean']] // This is because jar.inputs is read-only // Funny name is work-around for Gradle sequencing bug task zSqltoolJarDep << { if (sqltoolJar.archivePath.exists() && sqltoolJar.archivePath.lastModified() < file('../lib/sqltool.jar').lastModified()) { println "Deleting $sqltoolJar.archivePath.absolutePath" sqltoolJar.archivePath.delete() } } task sqltoolJar(dependsOn: [sqltool, zSqltoolJarDep], type: Jar) { baseName = 'sqltool' if (project.hasProperty('classifier')) classifier = project.classifier } sqltoolJar << { File srcFile = file('../lib/sqltool.jar') sqltoolJar.archivePath.setBytes(srcFile.bytes) } // add javadoc/source jar tasks as artifacts artifacts { archives sqltoolJar /* archives sourcesJar archives javadocJar */ } hsqldb2.2-2.2.9.orig/hsqldb/build/gui-welcome.txt0000644000175000017500000000033412007547330020161 0ustar renerene Please stand by as Gradle starts up... This window will remain after it's started. If it annoys you, please minimize it. (Do not close it!) hsqldb2.2-2.2.9.orig/hsqldb/build/test.properties0000644000175000017500000000044712007547330020305 0ustar renerene## Note: ## ## Most test properties have been moved to /org/hsqldb/resources ## under the test source folder and are now read using the bundle handler facility. ## ## System properties now take precedence, so you can use this file ## to override the values in the default test.properties file. hsqldb2.2-2.2.9.orig/hsqldb/build/build.hsqldbtest.cmd0000755000175000017500000000005612007547330021147 0ustar renerenecall setenv.cmd ant clean hsqldb hsqldbtest hsqldb2.2-2.2.9.orig/hsqldb/build/build.sqltool.cmd0000755000175000017500000000004412007547330020464 0ustar renerenecall setenv.cmd ant clean sqltool hsqldb2.2-2.2.9.orig/hsqldb/build/build.test.suite.cmd0000755000175000017500000000015212007547330021076 0ustar renerenecall setenv.cmd ant clean hsqldb preprocessor sqltool ant -f test.xml clean.test.suite make.test.suite hsqldb2.2-2.2.9.orig/hsqldb/build/build-docbook.xml0000644000175000017500000005631312007547330020452 0ustar renerene You must implement your own "gen-docs" target by editing "build-docbook.xml" or overriding it in your own build file which imports "build-docbook.xml". Your "gen-docs" target must depend on -gen-docs-setup, do an "antcall" of "docbook-transform" for each doc.name, then call -gen-docs-complete. ${_for.automation.blurb} You must implement your own "validate-docs" target by editing "build-docbook.xml" or overriding it in your own build file which imports "build-docbook.xml". Your "validate-docs" target must do an "antcall" of "validate-doc" for each doc.name. ${_for.automation.blurb} <!--Dynamically generated Entity Values loaded by a catalog for document '${doc.name}' at ${_timestamp} --> <!ENTITY doc_basename "${doc.name}"> <!ENTITY distro_baseurl "${distro.baseurl}"> <!ENTITY timestamp "${_timestamp}"> Just created a local 'ivysettings.xml' file for you. Customize this as you wish and/or set Ivy properties (or any other docbook-specific local build properties) in a 'local-docbook.properties' file. hsqldb2.2-2.2.9.orig/hsqldb/build/settings.gradle0000644000175000017500000000073212007547330020225 0ustar renerene//According to Adam Murdoch at http://www.unix.com/man-page/Linux/5/interfaces/ //"For the Gradle 1.0 release, we plan to merge the settings.gradle script into // the build script". rootProject.name = 'hsqldb' // Following work-around needed when use -b switch to Gradle, per // http://forums.gradle.org/gradle/topics/how_change_project_name_when_using_non_build_gradle_build_file if (startParameter.buildFile) rootProject.buildFileName = startParameter.buildFile.name hsqldb2.2-2.2.9.orig/hsqldb/build/build.gradle0000644000175000017500000010453312007547330017470 0ustar renerenedefaultTasks 'help' /** * The only end-user Gradle build properties used at this time are: * ivyDepFile Path to ivy dependencies file. Defaults to 'ivy.xml'. * (This corresponds to Ivy's property 'ivy.dep.file'). * gradled.retain Set to 'true' to retain the temporary files * "build-gradled.xml", "build-docbook-gradled.xml" * in the parent (real project root) directory. * IMPORTANT: If you get non-trivial Ant build errors, * definitely run gradle with '-i' switch and with * ratain.gradles true. * allTasks Used only by the 'tasks' task. Setting this to 'true' is * equivalent to the tas-specific switch '--all' for the * out-of-the-box 'tasks' task. I.e., our * 'gradlew -PallTasks=true tasks' * emulates out-of-the-box 'gradlew tasks --all'. * newVersion Used only by the 'updateWrapper' task, which is only for * baseline maintainers. * There are probably a few other task-specific properties, but these tasks * are written to abort cleanly and tell you if they need a property set. * Other build properties are loaded indirectly by Ant, so you must use * Gradle's -D switch to set those Ant properties as Java system properties. * * @author Blaine Simpson (blaine dot simpson at admc dot com) */ buildscript { dependencies { classpath fileTree(dir: '.', include: 'gradle-javaPropFile-plugin-*.jar') classpath fileTree(dir: '.', include: 'gradle-ivyxml-plugin-*.jar') } } apply plugin: 'javaPropFile' apply plugin: 'ivyxml' import com.admc.gradle.JavaPropFile def buildPropertiesFile = file('build.properties') def localBookPropertiesFile = file('local-docbook.properties') if (buildPropertiesFile.isFile()) propFileLoader.load(buildPropertiesFile) if (localBookPropertiesFile.isFile()) propFileLoader.load(localBookPropertiesFile) repositories { mavenCentral() } if (!project.hasProperty('mvnBuild')) mvnBuild = false if (!project.hasProperty('retainGradled')) retainGradled = (project.hasProperty('gradled.retain') && Boolean.parseBoolean(project.property('gradled.retain'))) configurations { xcsdeRngvalJar xcsdeRngvalDeps xalan fop bndJar jflexJar } task noop // Quiet task for testing root-level Groovy/Gradle development noop.description = 'Noop for testing Gradle' // This task only for SCM administrator. Update version and execute this task. task updateWrapper(type: Wrapper) { doFirst { assert project.hasProperty('newVersion') : '''Property 'newVersion' is required for task 'updateWrapper'.''' assert project.newVersion == gradle.gradleVersion : "You invoke Gradle system with version $gradle.gradleVersion instead of desired version $project.newVersion" } } updateWrapper << { gradleVersion = project['newVersion'] println 'WARNING: Merge our customizations into the newly-generated wrapper scripts' } updateWrapper.description = 'Update Gradle version. For HSQLDB Administrators.' def javaPluginTasks = [ 'compileJava', 'processResources', 'classes', 'compileTestJava', 'processTestResources', 'testClasses', 'jar', 'javadoc', 'test', 'uploadArchives', 'clean', ] void resolveCheck(configName) { int artCount = configurations[configName].files.size() // Following test works only if deps' transitive is false. if (configurations[configName].allDependencies.size() != artCount) { logger.error( "Didn't resolve all dependencies for config '$configName'. " + configurations[configName].allDependencies.size() + ' dependencies:\n ' + configurations[configName] .allDependencies .collect({it.name}).join('\n ') + '\nbut ' + artCount + ' resolved artifacts:\n ' + configurations[configName].files.collect({it}).join('\n ') + '\n' ) assert false : '''Didn't resolve all dependencies.''' } //configurations[configName].files.each { println '+' + it } //throw new GradleException('''Quittin' early''') logger.info "$artCount artifacts resolved" } /* This task will become useful for native Gradle compilations compileJava.dependsOn << { if (!project.hasProperty('resolveCheck.skip') || !Boolean.parseBoolean(project.property('resolveCheck.skip'))) resolveCheck('compile') } */ task checkTabs << { FileTree tree = fileTree(dir: '..') tree.exclude '**/javadoc.css' tree.exclude '**/*.jar' tree.exclude '**/*.png' tree.exclude '**/*.class' tree.exclude '**/*.zip' tree.exclude '**/*.gif' tree.exclude '**/*.data' tree.exclude '**/.*/**' tree.exclude '**/images/**' tree.exclude 'sample/sample' tree.include '*.text' tree.include 'build/*' tree.include 'src/**' tree.include 'test-src/**' tree.include 'sample/**' tree.include 'integration/**' tree.include 'bin' tree.include 'stylesheets/**' tree.include 'doc-src/**' def tabFiles = [] tree.each { if (it.text.indexOf('\t') > -1) tabFiles << relativePath(it) } if (tabFiles.size() > 0) println ' ' + tabFiles.join('\n ') } checkTabs.description = 'Reports on any text files containing tab characters' import java.util.regex.Pattern import java.util.regex.Matcher import groovy.xml.XmlUtil import groovy.xml.StreamingMarkupBuilder private void recursivePush(newName, dli, msl, ips) { assert !msl.contains(newName) : "Recursion duplication for target '$newName'" if (ips.contains(newName)) throw new GradleException("Recursion cycle for target '$newName'") ips.add(0, newName) dli.each { superEl -> if (superEl.contains(newName)) for (subEl in superEl) { if (subEl == newName) break if (ips.contains(subEl)) throw new GradleException( "Dependency cycle exists for target '$subEl'") if (!msl.contains(subEl)) // Recurse recursivePush(subEl, dli, msl, ips) } } msl.add(newName) assert ips.remove(0) == newName : 'Internal IPS stack problem' } import groovy.util.slurpersupport.GPathResult /** * @param fileNameInsertion. * For translating input filenames to new output files. * @closures Will call these with param of the corresponding Slurped XML * (same number of elements as number of input files). * Null to not do anything with it. */ File[] resequenceAntDependencies(String fileNameInsertion, closures, prohibitedTasks, inFiles) { def projectGpathRs = [] inFiles.each { f -> GPathResult gPathR = new XmlSlurper().parseText(f.getText('UTF-8')) assert gPathR.name() == 'project' : ("Root element in file '$f.absolutePath' not 'project': " + gPathR.name()) projectGpathRs << gPathR } def targetsIn = [:] // name -> Target. Those CONTAINING multi-depends. def dependListsIn = [:] // name -> List def inProcessStack = [] // For cycle checking def masterSeqList = [] // Sequential list of all ref'd targ names // 1: Determine new sequence 'masterSeqList' projectGpathRs.each { pGpathR -> pGpathR.target.findAll { it.@depends != null && it.@depends.list().size() > 0 }.each { targ -> List listEls = targ.@depends.text().split(/\s*,\s*/) if (listEls.size() > 0 && listEls[0].size() < 1) listEls.remove(0) if (listEls.size() < 2) return // No precedence if 1:1 dep. targetsIn[targ.@name.text()] = targ dependListsIn[targ.@name.text()] = listEls } } logger.debug(targetsIn.size() + ''' name->Target's (just keys): ''' + targetsIn.keySet()) logger.debug(dependListsIn.size() + " name->List's: $dependListsIn") dependListsIn.values.each { dl -> dl.each { n -> if (!masterSeqList.contains(n)) recursivePush(n, dependListsIn.values(), masterSeqList, inProcessStack) } } logger.debug "RESULT: $masterSeqList" // 2: Generate task-renaming maps 'renameMap' and 'prohibitionMap' // and ouput dep lists 'dependListsOut' // Purposefully not declaring 'renameMap' and 'prohibitionMap' // so they will make project.* so we can share them. renameMap = [:] // String -> String prohibitionMap = [:] def dependListsOut = [:] // name -> List def outList // Strings masterSeqList.each { n -> renameMap[n] = String.format('%03d%s', renameMap.size() + 1, n) } dependListsIn.each { k, v -> outList = [] dependListsOut[k] = outList for (n in v) outList << (renameMap.containsKey(n) ? renameMap[n] : n) } logger.info "renameMap: $renameMap" // 3: Modify Ant build file text // Update 'target' attrs, target name attrs, target depends attrs targetsIn.each { k, v -> v.@depends = dependListsOut[k].join(', ') } projectGpathRs.each { pGpathR -> pGpathR.'**'.findAll { it.@target.list().size() > 0 }.each { targ -> if (renameMap.containsKey(targ.@target.text())) // { logger.debug 'Trying ' + targ.@target.text() targ.@target = renameMap.get(targ.@target.text()) } renameMap.each { e -> pGpathR.target.find {it.@name.text() == e.key}.@name = e.value // Following is for depends that did not contribute to sequencing, // but which still contain mapped target names. pGpathR.target.each { def de = it.@depends if (de.list().size() < 1) return List depEls = de.text().split(/[\s,]+/) int i = depEls.indexOf(e.key) if (i < 0) return depEls.remove(i) depEls.add(i, e.value) it.@depends = depEls.join(', ') } } } if (prohibitedTasks != null) projectGpathRs.each { pGpathR -> pGpathR.'**'.findAll { it.@target.list().size() > 0 }.each { targ -> if (prohibitedTasks.contains(targ.@target.text())) { String n = targ.@target.text() if (!prohibitionMap.containsKey(n)) prohibitionMap[n] = 'ant' + n.capitalize() targ.@target = prohibitionMap[n] } } prohibitedTasks.each { k -> pGpathR.target.each { if (it.@name.text() == k) { if (!prohibitionMap.containsKey(k)) prohibitionMap[k] = 'ant' + k.capitalize() it.@name = prohibitionMap[k] } def de = it.@depends if (de.list().size() < 1) return List depEls = de.text().split(/[\s,]+/) int i = depEls.indexOf(k) if (i < 0) return if (!prohibitionMap.containsKey(k)) prohibitionMap[k] = 'ant' + k.capitalize() depEls.remove(i) depEls.add(i, prohibitionMap[k]) it.@depends = depEls.join(', ') } } } // 3.5: Conditionally execute user-specified closures if (closures != null) { assert closures.size() == projectGpathRs.size() : ('Size of given projectGpathRs != size of closures: ' + projectGpathRs.size() + ' vs. ' + closures.size()) closures.eachWithIndex { closure, i -> if (closures != null) closure(projectGpathRs[i]) } } // 4: Write modified Ant build file List outFiles = [] File outFile Pattern dotPattern = Pattern.compile('\\.') inFiles.eachWithIndex { inFile, i -> if (inFile.name.indexOf('.') < 0) throw new GradleException( 'Input file name has no extension: ' + inFile.name) outFile = new File( ((project.hasProperty('resequence.destDir')) ? project['resequence.destDir'] : inFile.getParentFile()), dotPattern.matcher(inFile.getName()).replaceFirst( fileNameInsertion + '.')) outFiles << outFile logger.info "Writing '$outFile.absolutePath'" outFile.write(XmlUtil.serialize(new StreamingMarkupBuilder().bind { mkp.yield projectGpathRs[i] }), 'UTF-8') } return outFiles } // RESEQUENCE project['resequence.destDir'] = file('..') // The top-level entry Build file must be first!!! sourceAntBuildFiles = [file('build.xml'), file('build-docbook.xml')] if (project.hasProperty('addlAntBuildFiles')) sourceAntBuildFiles = addlAntBuildFiles + sourceAntBuildFiles //throw new GradleException(sourceAntBuildFiles.join(',')) antBuildClosures = [{ it.import.@file = 'build-docbook-gradled.xml' it.@name = it.@name.text() + '_gradled' it.attributes().remove('basedir') // Global var because needed for our replacement task definition below }, { it.@name = it.@name.text() + '_gradled' it.import.replaceNode {} // Global var because needed for our replacement task definition below ivySetupTaskName = '-ivy-setup' if (project.renameMap.containsKey(ivySetupTaskName)) ivySetupTaskName = project.renameMap.get(ivySetupTaskName) it.appendNode { target(name: ivySetupTaskName) } } ] if (project.hasProperty('addlAntBuildClosures')) antBuildClosures = addlAntBuildClosures + antBuildClosures File[] outFs = resequenceAntDependencies( '-gradled', antBuildClosures, (mvnBuild ? javaPluginTasks : null), sourceAntBuildFiles) ant.importBuild(outFs[0].absolutePath) if (!retainGradled) outFs.each { it.deleteOnExit() } version = ant.properties['hsqldb.version'] // Inherit version from "build.xml" // This block generates wrapper tasks for the sole purpose of preventing the // end user from seeing numbered task names. // Postnote: Also removes descriptions from sub-project tasks + wrapped tasks. Pattern candidatePattern = Pattern.compile('\\d{3}([^-.][^.]*)') Matcher m def hidingWrappers = [:] // From 0xxWrappee -> wrapper Task newTask def tasksToMake = [:] getTasks().each { t -> if (t.description == null) return if (t.name.indexOf('.') > 0) t.description = null m = candidatePattern.matcher(t.name) if (!m.matches()) return if (mvnBuild && javaPluginTasks.contains(m.group(1))) prohibitionMap[m.group(1)] = t.name else tasksToMake[t] = m.group(1) } tasksToMake.each { k, v -> newTask = project.task(v) newTask.dependsOn = [k] newTask.description = k.description k.description = null hidingWrappers[k] = newTask } task serialver(dependsOn: ['classes16', 'util']) << { assert project.hasProperty('className'): '''Property 'className' is required for task 'serialver'.''' String fileSep = System.properties['file.separator'] // Could alternatively use Gradle's ExecSpec via exec(...) String javaHome = System.properties['java.home'] String javacHome = (javaHome.endsWith("jre") ? javaHome.substring(0, javaHome.length() - "/jre".length()) : javaHome) Process process = new ProcessBuilder([ javacHome + fileSep + 'bin' + fileSep + 'serialver', '-classpath', '../classes', project.property('className') ]).redirectErrorStream(true).start() // Must read input before waitFor-ing File outFile = new File(System.properties['java.io.tmpdir'], 'serialVer-' + System.properties['user.name'] + '.txt') process.inputStream.eachLine { println it; outFile.write(it + '\n') } assert process.waitFor() == 0: '''Execution of 'serialver' failed''' println """Also written to file '$outFile.absolutePath' so you can read it into your editor.""" } serialver.description = "Generates Java serialversion for specified 'classname'" ivyxml.load() import org.apache.tools.ant.types.Path project.task([overwrite: true], ivySetupTaskName) << { ant.references['xcsde-rngval-jar.cpref'] = new Path(ant.project, configurations['xcsdeRngvalJar'].asPath) ant.references['xcsde-rngval-deps.cpref'] = new Path(ant.project, configurations['xcsdeRngvalDeps'].asPath) ant.references['fop.cpref'] = new Path(ant.project, configurations['fop'].asPath) ant.references['xalan.cpref'] = new Path(ant.project, configurations['xalan'].asPath) ant.references['jflex-jar.cpref'] = new Path(ant.project, configurations['jflexJar'].asPath) ant.references['bnd-jar.cpref'] = new Path(ant.project, configurations['bndJar'].asPath) } private def recursiveAggregator(additions, inMap, assemblage) { additions.each { addition -> if (!assemblage.contains(addition)) { recursiveAggregator(inMap[addition], inMap, assemblage) assemblage << addition } } return assemblage } def hsqldbTask = renameMap.containsKey('hsqldb') ? tasks[renameMap.get('hsqldb')] : tasks['hsqldb'] hsqldbTask.outputs.file file('../lib/hsqldb.jar') hsqldbTask.inputs.source fileTree ( dir:'..', excludes: ['classes/org/hsqldb/jmx/**', 'classes/org/hsqldb/cmdline/**'], includes: ['doc/*_lic.txt', 'classes/**'] ) def sqltoolTask = renameMap.containsKey('sqltool') ? tasks[renameMap.get('sqltool')] : tasks['sqltool'] sqltoolTask.outputs.file file('../lib/sqltool.jar') sqltoolTask.inputs.source fileTree ( dir:'..', includes: ['doc/*_lic.txt', 'classes/org/hsqldb/cmdline/**', 'classes/org/hsqldb/lib/**', 'classes/org/hsqldb/resources/jdklog*'] ) def osgiTask = renameMap.containsKey('osgi') ? tasks[renameMap.get('osgi')] : tasks['osgi'] osgiTask.outputs.file file('../lib/hsqldb-osgi.jar') osgiTask.inputs.files files(file('../lib/hsqldb.jar'), file('hsqldb.bnd')) task standaloneValidation << { if (!project.hasProperty('install.parent.dir')) { // Load some properties from Ant build file, for use in our message. String threadStackSize = ant.properties['xmlvalidation.threadstacksize'] String xmlCatalogFiles = ant.properties['xml.catalog.files'] String dbxirngUrl = ant.properties['dbxirng.url'] println """If you have set build property 'install.parent.dir', then task 'standalone' will install the standalone XML validator that you can use to validate HyperSQL DocBook document source files. If you have not set build property 'install.parent.dir', you will see these instructions. Validating our DocBook source files requires a powerful XML validator that supports Xincludes, XML catalogs, DTD entities, and other advanced XML features. You can use the task 'validate-docs' or 'validate-doc' using Gradle (or Ant), but if you want to run a standalone validator, we will install one for you... read on. To use the standalone validator, xcsde-rngval, you need to know the full path to the file 'xcsde-rngval-*.jar' which will reside wherever you install the validator to. You then cd to the directory containing your XML source files and run a command like this: java -Xss$threadStackSize -Dxml.catalog.files=$xmlCatalogFiles -jar .../xcsde-rngval-*.jar -v $dbxirngUrl file.xml... See the XML Commons docs about the Java System Properties to use for XML catalog resolution: http://xml.apache.org/commons/components/resolver/resolver-article.html#ctrlresolver To install the validator, just set build property 'install.parent.dir' to the directory under which you want the validator installed (a new subdirectory will be created) and re-run this 'standaloneValidation' task. You can set the property by adding a switch to your gradlew invocation, like gradlew -P install.parent.dir=c:/Users/cindy or by editing file '${projectDir.absolutePath}/build.properties' (creating it if it doesn't already exist) and adding a line like install.parent.dir=c:/Users/cindy Afterwards, if you want to see these instructions again, you can re-run this same task, 'standaloneValidation', as many times as you want to, without the property (remove the line from the properties file or omit the command-line switch).""" return } String zipFileName = 'xcsde-rngval-LATEST.zip' String zipUrlString = 'http://cloud.github.com/downloads/unsaved/xcsde-rngval/' + zipFileName File localZip = new File(System.properties['java.io.tmpdir'], zipFileName) BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(localZip)) localZip.deleteOnExit() //println localZip.absolutePath zipUrlString.toURL().withInputStream() { bos << it } bos.close() File pDir = new File(project.property('install.parent.dir')) assert pDir.canWrite() : "Can't write to '$installParentDir'" // Unfortunately, the following writes temp files under build/build/tmp. // Too complicated to clean it up safely, so we'll leave it there for now. File newDir = new File(pDir, zipTree(localZip).iterator().next().parentFile.name) assert !newDir.exists() : "New target directory already exists: $newDir.absolutePath" ant.unzip(src:localZip.absolutePath, dest:pDir.absolutePath, overwrite:'false') if (!newDir.isDirectory()) throw new IOException("Extraction into '$newDir.absolutePath' failed") println """Installed xcsde-rng validator to new directory: $newDir.absolutePath For usage instructions, re-run this target, 'standaloneValidation' without the 'install.parent.dir' build property.""" } standaloneValidation.description = 'Install standalone XML validator, and instructions for same' /** * * Override both the Gradle out-of-the-box 'help' task, as well as our HSQLDB * Ant 'help' target, because the latter is very Ant-specific. * To get the both of both worlds, we combine the output of Gradle's OOTB * 'help' with Gradle-translated output of our Ant 'help' target. */ task help(overwrite:true) << { String antVer = ant.properties['ant.version'] .replaceFirst('^[^\\d]*(\\d\\S+).*$', '$1') print """ Welcome to Gradle $gradle.gradleVersion. (Wrapping Ant $antVer). To run a build, run 'gradlew ...' To see a list of available tasks, run 'gradlew tasks'. Add switch -q to make Gradle run quieter, or -i -s to run louder (or -d -S for very loud). Usage: gradlew --help Display 'gradlew' command syntax gradlew tasks Display all invocable targets gradlew explainjars List all targets which build jar files gradlew explainprops Explain how to change build properties gradlew ANYTHING ELSE Run 'gradlew' for details examples: gradlew hsqldb gradlew clean """ } help.description = 'Displays a help message' task explainprops << { println ''' There are two types of build properties that you can change. See comments at top of "build-*.xml" files for available Ant build properties. See comments at top of "build-*.gradle" files for available Gradle build properties. For property settings that you want to apply to most builds, use a Java properties file named "build.properties". For example, to usually build non-debug/speed-and-size optimized Java classes, set build.debug=true Whether or not you set properties in this way, you can override with invocation-specific properties as follow. For invocation-specific Ant property settings, use -D switches. For example gradlew -Dbuild.debug=false hsqldb For invocation-specific Gradle property settings, use -P switches like this: gradlew -Pgradled.retain=true hsqldb ''' } explainprops.description = 'Explain how to change default build properties' task installDbImages << { assert !project.hasProperty('dbimage.path') : '''Property 'dbimage.path' may not be set when running target 'installDbImages'.\n''' + 'If you have it set in a properties file, please remove it and try again.' if (project.hasProperty('nsstylebase.url')) { File dbimageDir = null String nsStyleBaseUrlString = project.property('nsstylebase.url') if (nsStyleBaseUrlString.startsWith('file:')) { Matcher nsm = nsStyleBaseUrlString =~ 'file:(.+)' if (nsm.matches()) { String nsStyleBasePath = nsm.group(1) // First try relative to the Ant basedir File nsStyleBaseDir = new File(project.projectDir.parentFile, nsStyleBasePath) if (!nsStyleBaseDir.isDirectory()) nsStyleBaseDir = null if (nsStyleBaseDir == null) { nsStyleBaseDir = new File(nsStyleBasePath) if (!nsStyleBaseDir.isDirectory()) nsStyleBaseDir = null } if (nsStyleBaseDir != null) { dbimageDir = new File(nsStyleBaseDir, 'images') if (!dbimageDir.isDirectory()) dbimageDir = null } } } if (dbimageDir != null) { file('local-docbook.properties').append( "dbimage.path=$dbimageDir".replace('\\', '\\\\') + '\n', 'ISO-8859-1') println '''File 'local-docbook.properties' updated with dbimage.path of''' println "'$dbimageDir'." println '''We used your existing 'nsstylebase.url' installation.''' return } } if (!project.hasProperty('install.parent.dir')) { println """Task 'installDbImages will install either the entire DocBook v.5 NS Style Sheet distribution, or just the images resources from it. Only the image resources are required, but having all of the style sheets on your local file system would decrease future DocBook build times and reduce dependency on network and Internet connection. So, now you must select an existng local directory into which the 'installDbImages' task will create a new directory to install the new resources underneath. You must set Gradle property 'install.parent.dir' to the directory that you have chosen. If you want to install the entire style sheet distribution, you should also set property 'install.dbstyles.entire' to true. If running Gradle on the command line, rerun the 'installDbImages' task with -P switches like: gradlew -Pinstall.parent.dir=c:\\data -Pinstall.dbstyles.entire=true (Skip the second -P if you want to install only the required images). If running graphically, add settings like the following to file $project.projectDir.absolutePath/build.properties: install.parent.dir=c:\\data install.dbstyles.entire=true (Skip the second setting if you want to install only the required images). And then rerun the 'installDbImages' task. You can remove these install.* settings when you are finished running 'installDbImages'. """ return } boolean installAll = (project.hasProperty('install.dbstyles.entire') && Boolean.parseBoolean(project.property('install.dbstyles.entire'))) File installParentDir = new File(project.property('install.parent.dir')) assert installParentDir.canWrite() : "Can't write to '$installParentDir'" GroovyScriptEngine gse = new GroovyScriptEngine( [ projectDir.absolutePath ] as String[]) Binding binding = new Binding() binding.setVariable('params', [installParentDir, installAll]) gse.run('dbuInstallSheetsWrapper.groovy', binding) String newRootName = binding.getVariable('retVal') File newRootDir = new File(installParentDir, newRootName) File dbimageDir = null if (installAll) { dbimageDir = new File(newRootDir, 'images') file('local-docbook.properties').append( "nsstylebase.url=file:$newRootDir".replace('\\', '\\\\') + '\n', 'ISO-8859-1') println '''File 'local-docbook.properties' updated with nsstylebase.url of ''' println "'$newRootDir'." } else { dbimageDir = newRootDir } file('local-docbook.properties') .append("dbimage.path=$dbimageDir".replace('\\', '\\\\') + '\n', 'ISO-8859-1') println '''File 'local-docbook.properties' updated with dbimage.path of ''' println """'$dbimageDir'. You will have the fastest doc builds and minimal network/Internet dependencies if you use stylesheets (via 'nsstylebase.url'), schema file, and entities locally, as described in comments at top of file "build-docbook.xml". """ } installDbImages.description = 'Install DocBook resources (minimal by defaul)' /** * Override OOTB 'tasks'. * Hides -private tasks from Ant. * Hides tasks without descriptions. * Hides Ant-subproject tasks because for tasks in sub-projects, Gradle always * creates unqualified and one qualified to the sub-project. * Hide renamed tasks so that user will only see the "generated wrappers" * created above for this purpose. * * Only problem here is that Gradle gives us no way to discern overridden * tasks, so that we could present both the sub-project target and the * super-project target in this case. * In this case, we present only the overriding target until Gradle fixes the * bug that I registered. */ task tasks << { Pattern privatePattern = Pattern.compile('(?:\\d{3})?(-.*)') print """ ------------------------------------------------------------ Root Project ------------------------------------------------------------ Help tasks ---------- dependencies - Displays the dependencies of root project '$project.name'. explainjars - List all targets which build jar files explainprops - How to change build properties of root project '$project.name'. help - Displays a help message projects - Displays the sub-projects of root project '$project.name'. properties - Displays the properties of root project '$project.name'. tasks - Displays the tasks in root project '$project.name'. Other tasks ----------- """ boolean displayAll = (project.hasProperty('allTasks') && Boolean.parseBoolean(project.property('allTasks'))) def describedPrivates = [] def hardTaskDescriptions = ['tasks', 'help', 'explainprops', 'explainjars'] as Set Matcher pMatcher NEXT_TASK: getTasks().each { t -> assert t.name.length() > 0: 'Task with 0 length name encountered.' if (t.description != null) { pMatcher = privatePattern.matcher(t.name) if (pMatcher.matches()) { assert pMatcher.groupCount() == 1 && pMatcher.group(1) != null: "Internal problem w/ regex pattern: $privatePattern" describedPrivates << pMatcher.group(1) return } } if (!displayAll && t.description != null && !hardTaskDescriptions.contains(t.name)) println "$t.name - $t.description" } if (displayAll) { def dependOnMap = [:] def depList def reverseWrappers = [:] // Goes from wrapper -> wrappee // Probably a cooler Groovy way to do this, but this works: hidingWrappers.each { k, v -> reverseWrappers[v] = k } assert hidingWrappers.size() == reverseWrappers.size(): 'Seems we have a wrapper Task wrapping more than one Target' getTasks().each { t -> if (hidingWrappers.containsValue(t)) return // Excluding wrappers so that wrappees can be listed as top-level // tasks. (Because they would be if we didn't need the hack to // work around Gradle sequencing bug). depList = [] dependOnMap[t] = depList t.dependsOn.each { u -> if (u instanceof Task) depList << u else if (u instanceof TaskDependency) // Retarded that t must pass itself as param to its own u: u.getDependencies(t).each { depList << it } } } def allDependees = [] as Set // Purposefully excluding wrappees dependOnMap.values.each { allDependees.addAll(it) } getTasks().each { t -> if (!allDependees.contains(t) && !hardTaskDescriptions.contains(t.name)) { // t is now non-depended-upon, other than by wrappers print t.name if (t.description != null) print " - $t.description" if (hidingWrappers.containsKey(t)) { print ' [Wrapped by ' + hidingWrappers[t].name if (hidingWrappers[t].description != null) print ' - ' + hidingWrappers[t].description print ']' } if (reverseWrappers.containsKey(t)) { println ' [Wrapper]' def u = reverseWrappers[t] print " $u.name" if (u.description != null) print " - $u.description" assert !hidingWrappers.containsValue(u): 'Wrappee is a wrapper too?' } println() recursiveAggregator(dependOnMap[t], dependOnMap, []).each { print " $it.name" if (it.description != null) print " - $it.description" if (hidingWrappers.containsKey(it)) { print ' [Wrapped by ' + hidingWrappers[it].name if (hidingWrappers[it].description != null) print ' - ' + hidingWrappers[it].description print ']' } assert !hidingWrappers.containsValue(it): 'Wrapper is depended-up?' println() } } } } else { println(''' To see all tasks and more detail, run 'gradle -PallTasks=true tasks'. (N.b. our -P switch differs from Gradle's out-of-the-box --all switch for this purpose).''') } if (describedPrivates.size() > 0) logger.warn('\nWARNING: Private Ant tasks have descriptions: ' + describedPrivates.join(', ')) if (prohibitionMap.size() > 0) logger.warn('''\nWARNING: The following tasks have been renamed to avoid conflict with Gradle plugin task names: ''' + prohibitionMap) } tasks['tasks'].description = "Displays the tasks in root project '$project.name'." if (prohibitionMap.size() > 0) logger.warn('''\nWARNING: The following tasks have been renamed to avoid conflict with Gradle plugin task names: ''' + prohibitionMap) hsqldb2.2-2.2.9.orig/hsqldb/build/rng-catalog-template.xml0000644000175000017500000000135712007547330021742 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/build/run.test.suite.cmd0000755000175000017500000000006112007547330020602 0ustar renerenecall setenv.cmd ant -f test.xml run.test.suite hsqldb2.2-2.2.9.orig/hsqldb/build/hsqldb.bnd0000644000175000017500000000042712007547330017150 0ustar renerene# File for use by 'bnd' utility for generating OSGi Bundle descriptions. # http://www.aqute.biz/Code/Bnd Bundle-Version: ${hsqldb.version} Build-Vendor: ${build.vendor} Bundle-Description: ${build.description} Bundle-Name: ${hsqldb.title} Bundle-SymbolicName: org.hsqldb.hsqldb hsqldb2.2-2.2.9.orig/hsqldb/build/build.xml0000644000175000017500000016225212007547330017034 0ustar renerene Ant version: ${ant.version} Java version: ${java.version} jar filename build command explanation -------------- ------------- ----------------------------------- hsqldb.jar ant hsqldb Default distribution jar hsqljdbc.jar ant hsqljdbc JDBC network client JDBC Driver. (Can connect to HyperSQL Servers) hsqldbmain.jar ant hsqldbmain No utility programs hsqldbutil.jar ant hsqldbutil Utility programs only. No JDBC driver. (Includes SqlTool and DatabaseManagers) hsqldbmin.jar ant hsqldbmin No utility or server programs. (Includes in-process JDBC driver, but no support for HyperSQL Servers) hsqldbtest.jar ant hsqldbtest All, including test classes sqltool.jar ant sqltool SqlTool app (no JDBC driver) Ant version: ${ant.version} usage: ant -help Display ant help screen ant -projecthelp Display all invocable targets ant explainjars List all targets which build jar files ant ANYTHING ELSE Run 'ant -projecthelp' for details examples: ant hsqldb ant clean Ant property 'dbimage.path' is required. This should be set to the "images" subdirectory of a DocBook v.5 NS Style Sheet distribution, on your local filesystem. If you run the Gradle task 'installDbImages', I'll do that for you, downloading and installing the resources from sourceforge.net if you don't already have them. You will have the option of installing the entire Style Sheet distribution (instead of just the images) to speed up your future DocBook builds and decrease dependency upon a network and Internet connection. ('installDbImages' is only available as a Gradle task, not as an Ant target). See comments at the top of file "${basedir}/build/local-docbook.properties" for instructions on how set up the DocBook images (and other optional optimizations) manually. hsqldb2.2-2.2.9.orig/hsqldb/build/DocBookUtil.groovy0000755000175000017500000000661412007547330020642 0ustar renerene#!/local/groovy/bin/groovy /** * The methods in this file may be executed directly from a native Groovy * file. Here is a sample invocations that work from another Groovy file: *
                  
                   *   println DocBookUtil.installStyleSheets(new File('/tmp/drivertst'), false)
                   * 
                  * Just change 'false' to 'true' to install the entire stylesheet collection. * Don't forget to set Java system property 'grape.config' if you want to * override Grape's default one. */ @Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='1.2.1') import groovy.util.slurpersupport.GPathResult import org.ccil.cowan.tagsoup.Parser /** * Unfortunately, Grape only supports Java system properties as properties * with the antsettings.xml file. * Therefore, if your antsettings.xml file has any ${references} which are * not system propertyes, you must add the properties to * System.getProperties() before calling this method. * * @return newly created directory name, relative to pDir. */ public static String installStyleSheets(File pDir, boolean allSheets) { String siteUrlString = 'http://sourceforge.net' String indexPathString = '/projects/docbook/files/docbook-xsl-ns' String latestVersionPath = null (siteUrlString + indexPathString).toURL().withReader('UTF-8') { GPathResult html = (new XmlSlurper(new Parser()).parse(it)) GPathResult gPathR = html.'**'.find { it.name() == 'table' && it.@id == 'files_list' } GPathResult anchorGPathR = gPathR.tbody.tr[0].th.a latestVersionPath = anchorGPathR.@href.text() } //println "($latestVersionPath)" java.util.regex.Matcher m = latestVersionPath =~ /.*\/([-\w.]+)\// assert m.matches() : "Failed to parse a version from path: $latestVersionPath" String latestVer = m.group(1) //println "($latestVer)" String zipFileName = 'docbook-xsl-ns-' + latestVer + '.zip' //println "($zipFileName)" String zipUrl = "http://sourceforge.net/projects/docbook/files/docbook-xsl-ns/$latestVer/$zipFileName/download" //println "($zipUrl)" File localZip = new File(System.properties['java.io.tmpdir'], zipFileName) BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(localZip)) localZip.deleteOnExit() zipUrl.toURL().withInputStream() { bos << it } bos.close() AntBuilder ant = new AntBuilder() if (allSheets) { File newDir = new File(pDir, "docbook-xsl-ns-$latestVer") assert !newDir.exists() : "New target directory already exists: $newDir.absolutePath" ant.unzip(src:localZip.absolutePath, dest:pDir.absolutePath, overwrite:'false') if (!new File(newDir, 'images').isDirectory()) throw new IOException( "Extraction into '$newDir.absolutePath' failed") return "docbook-xsl-ns-$latestVer" } File destDir = new File(pDir, "xsl-ns-images-$latestVer") assert !destDir.exists() : "New target directory already exists: $destDir.absolutePath" ant.unzip(src:localZip.absolutePath, dest:destDir.absolutePath, overwrite:'false') { patternset { include(name: "docbook-xsl-ns-$latestVer/images/**") } regexpmapper(from:'^[^/]+/images/(.+)$', to:/\1/) } if (!destDir.isDirectory()) throw new IOException("Extraction to '$destDir' failed") return "xsl-ns-images-$latestVer" } hsqldb2.2-2.2.9.orig/hsqldb/build/jdkcodeswitch.list0000644000175000017500000000226712007547330020734 0ustar renerene# Files listed here will be code-switched # This eliminates the need for CodeSwitcher to scan all source files. org/hsqldb/HsqlDateTime.java org/hsqldb/lib/tar/TarFileOutputStream.java org/hsqldb/lib/tar/TarGenerator.java org/hsqldb/lib/tar/TarReader.java org/hsqldb/jdbc/JDBCCallableStatement.java org/hsqldb/jdbc/JDBCCommonDataSource.java org/hsqldb/jdbc/JDBCConnection.java org/hsqldb/jdbc/JDBCDatabaseMetaData.java org/hsqldb/jdbc/JDBCDataSource.java org/hsqldb/jdbc/JDBCDriver.java org/hsqldb/jdbc/JDBCNClob.java org/hsqldb/jdbc/JDBCParameterMetaData.java org/hsqldb/jdbc/JDBCPreparedStatement.java org/hsqldb/jdbc/JDBCResultSet.java org/hsqldb/jdbc/JDBCResultSetMetaData.java org/hsqldb/jdbc/JDBCStatement.java org/hsqldb/jdbc/JDBCStatementBase.java org/hsqldb/jdbc/Util.java org/hsqldb/jdbc/pool/JDBCPooledDataSource.java org/hsqldb/jdbc/pool/JDBCPooledConnection.java org/hsqldb/jdbc/pool/JDBCXAConnectionWrapper.java org/hsqldb/jdbc/pool/JDBCXADataSource.java org/hsqldb/jdbc/Util.java org/hsqldb/lib/java/JavaSystem.java org/hsqldb/lib/SimpleLog.java org/hsqldb/lib/StringConverter.java org/hsqldb/server/PgType.java org/hsqldb/test/TestBug778213.java org/hsqldb/util/ConnectionDialogCommon.java hsqldb2.2-2.2.9.orig/hsqldb/build/build-dist.gradle0000644000175000017500000001052412007547330020425 0ustar renerene/** * $Id: build-dist.gradle 4918 2012-01-22 15:40:59Z unsaved $ * * Invoke this build file with Gradle's -b switch for zip and jar * distribution building. * * Unfortunately, it is impractical to encpsulate all of the needed processing * here, so there is some tight coupling between this file and "build.gradle". * (This file loads/applies "build.gradle"). * * "build-dist.gradle" and "build-dist.xml" are separate from the main * "build.*" files specifically because they are not intended for normal * end-user or developer usage. * They are only for generating full distributable packages of the app. * This build file is NOT necessary to build a distributable jar file: * that is the purpose of several tasks/targets in the main build files. * * PREP: Before building a public distribution, you must: * 1: Run task/targets 'javadoc' and 'javadocdev', watching for JavaDoc * authoring mistakes, and fix them. * 2: Update HyperSQL minor or version number if required in file * "../doc-src/guide/entities/versions.ent". * 3: Run "svn info ../src/org/hsqldb/cmdline/Sql????.java" to determine * the "Last Changed Rev"s of SqlTool.java and SqlFile.java. * Update the revision values in file * "../doc-src/util-guide/entities/versions.ent" accordingly. * 4: Update property 'hsqldb.version' in file 'build.xml'. * 5: Execute task/target 'refresh-verbatim' to update code in our docs. * 6: Execute task/target 'update-readme' to substitute updated variables * into some doc file(s). * 7: Double-check file "../readme.txt". * May or may not need to be updated manually. * 8: Commit all of the work above. * 9: Verify that docs build successfully. * 10. Make a release tag. * * USAGE: * 1: Set up your desired build environment (JAVA_HOME set, etc.). * 2: Do a Subversion export with the release tag to a NEW directory * 3: If you don't have a .properties file set up for this purpose * already, then make one outside of this work area with a distinctive * name (for auditing and so you can archive it and/or re-use it for * future distribution builds), then copy it to "build.properties" * in this directory. (If on a good operating system, just sym-link). * IMPORTANT QUIRK: This file may not use ${} properties in values, * since that feature is incompatible with the "-propertyfile" * switch that we will use below. * This file must set Ant properties "build.label", "build.vendor", * "dbimage.path". (See following section about optional properties). * 4: Run * gradlew -i -b build-dist.gradle # Gradle users * from the build directory. * * OPTIONAL ANT PROPERTIES * I suggest setting properties nsstylebase.url, dbxirng.url, * dbcentx.url in file "local-docbook.properties" or * "build.properties" in the external (or shared) build properties explained above), according to the * reasons documented at the top of "build-docbook.xml", and according * to the instructions there (except use the specified properties file). * Add settings for build.debug and build.optimize to change the default * compilation settings. * * You may add or edit some files without them being added to the * distribution that you build: build/build.properties, * build/local*.properties, tmp/*, classes/*, dist/*. * If you don't know if something will have an effect on the distribution * you are building, then *don't do it*. * If you were to add a "todo.txt" file to the main or build directory; * or run "gradle hsqldbtest", for example, artifacts would be added to * the distro. * * @author Blaine Simpson (blaine dot simpson at admc dot com) */ buildscript { dependencies { classpath fileTree(dir: '.', include: 'gradle-javaPropFile-plugin-*.jar') classpath fileTree(dir: '.', include: 'gradle-ivyxml-plugin-*.jar') } } import org.apache.tools.ant.types.Path addlAntBuildFiles = [file('build-dist.xml')] addlAntBuildClosures = [{ it.import.find{it.@file = 'build-gradled.xml'} it.@name = it.@name.text() + '_gradled' it.attributes().remove('basedir') } ] apply from: 'build.gradle' defaultTasks 'dist' hsqldb2.2-2.2.9.orig/hsqldb/build/cfdistro.bash0000755000175000017500000001173212007547330017666 0ustar renerene#!/bin/bash -p PROGNAME="${0##*/}" # Copyright (c) 2001-2009, The HSQL Development Group # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of the HSQL Development Group nor the names of its # contributors may be used to endorse or promote products derived from this # software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, # OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # This script generates a concise listing of differences between two # distributions. # This script obviously requires Bash. I don't know whether it works on Cygwin. # You run this script against two directory branches. # If you are starting with two zip distributions, you must extract them first. # If you are going to investigate differences, then set up the distribution # directories so that the highest directories of interest are peers, like # cd /tmp/me # mkdir cfdir # unzip -q /tmp/hsqldb-x1.zip # mv hsqldb-x1/hsqldb cfdir/x1 # unzip -q /tmp/hsqldb-x2.zip # mv hsqldb-x2/hsqldb cfdir/x2 # cd cfdir # /path/to/cfdistro.bash x1 x2 # It is then very easy to view differences between the distributions textually # or graphically. If your file difference report (".../files.diff") contains # < hsqldb/testrun/hsqldb/TestSelf.txt -rw-r--r-- 1 blaine blaine 52585 # > hsqldb/testrun/hsqldb/TestSelf.txt -rw-r--r-- 1 blaine blaine 52587 # then you use vim to check encodings and fileformat (EOLs), diff for # differences in text, or gvimdiff for diffrences graphically. # gvim */hsqldb/testrun/hsqldb/TestSelf.txt # Check encoding + fileformat # diff */hsqldb/testrun/hsqldb/TestSelf.txt # See differences in text # gvimdiff */hsqldb/testrun/hsqldb/TestSelf.txt # See differences graphically # This script can easily be enhanced to do the extraction and directory setup # steps. # We purposefully ignore directory and file modification timestamps. # Modify the perl regular expressions to include or exclude other items in # the "ls -l" listings. # The generation timestamps and version labels inside of generated JavaDoc # output will make these files differ. I usually manually compare an index # file and an actual class HTML file, then exclude the rest from the summary # file with a command like # perl -ni -we 'print unless m:^. doc/apidocs/:;' /tmp/cfdistro-13756/files.diff shopt -s xpg_echo set +u Failout() { echo "Aborting $PROGNAME: $*" 1>&2 exit 1 } [ -n "$TMPDIR" ] || TMPDIR=/tmp WORKDIR="$TMPDIR/${PROGNAME%.*}-$$" mkdir "$WORKDIR" || Failout "Failed to make work director '$WORKDIR'" type -t perl >&- || Failout "'$PROGNAME' requires 'perl' in your search path" [ $# -ne 2 ] && Failout "SYNTAX: $PROGNAME dir1/path dir2/path" BASE1="$1"; shift BASE2="$1"; shift STARTDIR="$PWD" cd "$BASE1" || Failout "Failed to cd to first base dir: $BASE1" find * -type d | xargs ls -ld | perl -nwe 'm/(.+?)200\d-\d\d-\d\d \d\d:\d\d\s+(.+)/; print "$2 $1\n";' | sort > $WORKDIR/dirs.1 find * -type f | xargs ls -ld | perl -nwe 'm/(.+?)200\d-\d\d-\d\d \d\d:\d\d\s+(.+)/; print "$2 $1\n";' | sort > $WORKDIR/files.1 cd "$STARTDIR" cd "$BASE2" || Failout "Failed to cd to first base dir: $BASE2" find * -type d | xargs ls -ld | perl -nwe 'm/(.+?)200\d-\d\d-\d\d \d\d:\d\d\s+(.+)/; print "$2 $1\n";' | sort > $WORKDIR/dirs.2 find * -type f | xargs ls -ld | perl -nwe 'm/(.+?)200\d-\d\d-\d\d \d\d:\d\d\s+(.+)/; print "$2 $1\n";' | sort > $WORKDIR/files.2 cd "$STARTDIR" cd "$WORKDIR" || Failout "Failed to cd to work dir: $WORKDIR" declare -i retval=0 cmp -s dirs.1 dirs.2 || { ((retval = retval + 1)) diff dirs.1 dirs.2 | egrep '^[<>]' > dirs.diff echo "See dir diffs at $WORKDIR/dirs.diff" } cmp -s files.1 files.2 || { ((retval = retval + 1)) diff files.1 files.2 | egrep '^[<>]' > files.diff echo "See dir diffs at $WORKDIR/files.diff" } exit $retval hsqldb2.2-2.2.9.orig/hsqldb/build/antivy-setup.xml0000644000175000017500000000102612007547330020374 0ustar renerene An Ant target that you have invoked, directly or indirectly, has been changed to reply upon Gradle. Please rerun your Ant command as a Gradle command, using 'gradlew' in place of 'ant'. hsqldb2.2-2.2.9.orig/hsqldb/build/gui-initial.setting0000644000175000017500000000062612007547330021021 0ustar renerene hsqldb2.2-2.2.9.orig/hsqldb/build/build.javadoc.cmd0000755000175000017500000000006212007547330020376 0ustar renerenecall setenv.cmd call ant clean javadoc pause hsqldb2.2-2.2.9.orig/hsqldb/data/0000755000175000017500000000000012007570424015015 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/bin/0000755000175000017500000000000012007570420014650 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/bin/runManager.bat0000755000175000017500000000015312007547420017445 0ustar renerenecd ..\data @java -classpath ..\lib\hsqldb.jar org.hsqldb.util.DatabaseManager %1 %2 %3 %4 %5 %6 %7 %8 %9 hsqldb2.2-2.2.9.orig/hsqldb/bin/memorydbmanager.html0000644000175000017500000000173412007547420020720 0ustar renereneHyperSQL Database applet

                  In-Memory Applet: Database Manager

                  Connect to the default memory database with the connection dialogue. Then use the menu and select Option -> Insert Test Data to populate the sample database. The menu item Recent has some SELECT statements to try. You can enter your own data and use your own queries.

                  The database is running as an applet inside the web browser and all data is kept in memory.
                  The data will be lost if the browser window is closed.

                  If the database window does not show, there may be a setup problem.

                  This demo requires Java 1.6 and has been tested with Mozilla Firefox.

                  hsqldb2.2-2.2.9.orig/hsqldb/bin/runUtil.bat0000755000175000017500000000013312007547420017006 0ustar renerenecd ..\data @java -classpath ..\lib\hsqldb.jar org.hsqldb.util.%1 %2 %3 %4 %5 %6 %7 %8 %9 hsqldb2.2-2.2.9.orig/hsqldb/bin/runManagerSwing.bat0000755000175000017500000000016012007547420020453 0ustar renerenecd ..\data @java -classpath ..\lib\hsqldb.jar org.hsqldb.util.DatabaseManagerSwing %1 %2 %3 %4 %5 %6 %7 %8 %9 hsqldb2.2-2.2.9.orig/hsqldb/bin/runServer.bat0000755000175000017500000000014412007547420017341 0ustar renerenecd ..\data @java -classpath ../lib/hsqldb.jar org.hsqldb.server.Server %1 %2 %3 %4 %5 %6 %7 %8 %9 hsqldb2.2-2.2.9.orig/hsqldb/bin/runWebServer.bat0000755000175000017500000000014712007547420020002 0ustar renerenecd ..\data @java -classpath ..\lib\hsqldb.jar org.hsqldb.server.WebServer %1 %2 %3 %4 %5 %6 %7 %8 %9 hsqldb2.2-2.2.9.orig/hsqldb/sample/0000755000175000017500000000000012007570422015363 5ustar renerenehsqldb2.2-2.2.9.orig/hsqldb/sample/hsqldb.cfg0000644000175000017500000002127612007547332017335 0ustar renerene# $Id: hsqldb.cfg 3583 2010-05-16 01:49:52Z unsaved $ # Sample configuration file for HyperSQL Server Listener. # See the "HyperSQL on UNIX" chapter of the HyperSQL User Guide. # N.b.!!!! You must place this in the right location for your type of UNIX. # See the init script "hsqldb" to see where this must be placed and # what it should be renamed to. # This file is "sourced" by a Bourne shell, so use Bourne shell syntax. # This file WILL NOT WORK until you set (at least) the non-commented # variables to the appropriate values for your system. # Life will be easier if you avoid all filepaths with spaces or any other # funny characters. Don't ask for support if you ignore this advice. # The URLIDS setting below is new and REQUIRED. This setting replaces the # server.urlid.X settings which used to be needed in your Server's # properties file. # -- Blaine (blaine dot simpson at admc dot com) JAVA_EXECUTABLE=/usr/bin/java # Unless you copied the jar files from another system, this typically # resides at $HSQLDB_HOME/lib/sqltool.jar, where $HSQLDB_HOME is your HSQLDB # software base directory. # The file name may actually have a version label in it, like # sqltool-1.2.3.jar (in which case, you must specify the full name here). # A 'hsqldb.jar' file (with or without version label) must reside in the same # directory as the specified sqltool.jar file. SQLTOOL_JAR_PATH=/opt/hsqldb-2.0.0/hsqldb/lib/sqltool.jar # For the sample value above, there must also exist a file # /opt/hsqldb-2.0.0/hsqldb/lib/hsqldb*.jar. # Where the file "server.properties" or "webserver.properties" resides. SERVER_HOME=/opt/hsqldb-2.0.0/hsqldb/data # What UNIX user the server will run as. # (The shutdown client is always run as root or the invoker of the init script). # Runs as root by default, but you should take the time to set database file # ownerships to another user and set that user name here. HSQLDB_OWNER=hsqldb # The HSQLDB jar file specified in HSQLDB_JAR_PATH above will automatically # be in the class path. This arg specifies additional classpath elements. # To embed your own application, add your jar file(s) or class base # directories here, and add your main class to the INVOC_ADDL_ARGS setting # below. Another common use-case for adding to your class path is to make # classes available to the DB engines for SQL/JRT functions and procedures. #SERVER_ADDL_CLASSPATH=/usr/local/dist/currencybank.jar # For startup or shutdown failures, you can save a lot of debugging time by # temporarily adjusting down MAX_START_SECS and MAX_TERMINATE_SECS to a # little over what it should take for successful startup and shutdown on # your system. # We require all Server/WebServer instances to be accessible within # $MAX_START_SECS from when the Server/WebServer is started. # Defaults to 60. # Raise this is you are running lots of DB instances or have a slow server. #MAX_START_SECS=200 # Max time to allow for JVM to die after all HSQLDB instances stopped. # Defaults to 60. Set high because the script will always continue as soon as # the process has stopped. The importance of this setting is, how long until # a non-stopping-JVM-problem will be detected. #MAX_TERMINATE_SECS=0 # NEW AND IMPORTANT!!! # As noted at the top of this file, this setting replaces the old property # settings server.urlid.X. # Simply list the URLIDs for all DB instances which your *Server starts. # Usually, these will exactly mirror the server.database.X settings in your # server.properties or webserver.properties file. # Each urlid listed here must be defined to a NETWORK url with Admin privileges # in the AUTH_FILE specified below. (Network type because we use this for # inter-process communication) # Separate multiple values with white space. NO OTHER SPECIAL CHARACTERS! # Make sure to quote the entire value if it contains white space separator(s). URLIDS='localhostdb1' # These are urlids # ** IN ADDITION TO URLIDS **, for instances which the init # script should stop but not start. # Most users will not need this setting. If you need it, you'll know it. # Defaults to none (i.e., only URLIDS will be stopped). #SHUTDOWN_URLIDS='ondemand' # SqlTool authentication file used only for shutdown. # The default value will be sqltool.rc in root's home directory, since it is # root who runs the init script. # (See the SqlTool chapter of the HyperSQL Utilities Guide if you don't # understand this). #AUTH_FILE=/home/blaine/sqltool.rc # Typical users will leave this unset and it will default to # org.hsqldb.server.Server. If you need to run the HSQLDB WebServer class # instead, due to a firewall or routing impediment, set this to # org.hsqldb.server.WebServer, see the docs about running WebServr, and # set up a "webserver.properties" file instead of a "server.properties". # The JVM that is started can invoke many classes (see the following item # about that), but this is the server that is used (1) to check status, # (2) to shut down the JVM. #TARGET_CLASS=org.hsqldb.server.WebServer # This is where you may specify both command-line parameters to TARGET_CLASS, # plus any number of additional progams to run (along with their command-line # parameters). The MainInvoker program is used to embed these multiple # static main invocations into a single JVM, so see the API spec for # org.hsqldb.util.MainInvoker if you want to learn more. # N.b. You should only use this setting to set HSQLDB Server or WebServer # parameters if you run multiple instances of this class, since you can use the # server/webserver.properties file for a single instance. # Every additional class (in addition to the TARGET_CLASS) # must be preceded with an empty string, so that MainInvoker will know # you are giving a class name. MainInvoker will invoke the normal # static main(String[]) method of each such class. # By default, MainInvoker will just run TARGET_CLASS with no args. # Example that runs just the TARGET_CLASS with the specified arguments: #INVOC_ADDL_ARGS='-silent false' #but use server.properties property instead! # Example that runs the TARGET_CLASS plus a WebServer: #INVOC_ADDL_ARGS='"" org.hsqldb.server.WebServer' # Note the empty string preceding the class name. # Example that starts TARGET_CLASS with an argument + a WebServer + # your own application with its args (i.e., the HSQLDB Servers are # "embedded" in your application). (Set SERVER_ADDL_CLASSPATH too).: #INVOC_ADDL_ARGS='-silent false "" org.hsqldb.server.WebServer "" com.acme.Stone --env prod localhost' # but use server.properties for -silent option instead! # Example to run a non-TLS server in same JVM with a TLS server. In this # case, TARGET_CLASS is Server which will run both in TLS mode by virtue of # setting the tls, keyStore, and keyStorePassword settings in # server*.properties, as described below; plus an "additional" Server with # overridden 'tls' and 'port' settings: #INVOC_ADDL_ARGS="'' org.hsqldb.server.Server --port 9002 --tls false" # This is an important use case. If you run more than one Server instance, # you can specify different parameters for each here, even though only one # server.properties file is supported. # Note that you use nested quotes to group arguments and to specify the # empty-string delimiter. # The TLS_* settings have been obsoleted. # To get your server running with TLS, set # system.javax.net.ssl.keyStore=/path/to/your/private.keystore # system.javax.net.ssl.keyStorePassword=secretPassword # server.ssl=true # IN server.properties or webserver.properties, and # MAKE THE FILE OWNER-READ-ONLY! # See the TLS Encryption section of the HyperSQL User Guide, paying attention # to the security warning(s). # If you are running with a private server cert, then you will also need to # set "truststore" in the your SqlTool config file (location is set by the # AUTH_FILE variable in this file, or it must be at the default location for # HSQLDB_OWNER). # Any JVM args for the invocation of the JDBC client used to verify DB # instances and to shut them down (SqlToolSprayer). # Server-side System Properties should normally be set with system.* # settings in the server/webserver.properties file. # This example specifies the location of a private trust store for TLS # encryption. # For multiple args, put quotes around entire value. # If you are starting just a TLS_encrypted Listener, you need to uncomment # this so the init scripts uses TLS to connect. # If using a private keystore, you also need to set "truststore" settings in # the sqltool.rc file. #CLIENT_JVMARGS=-Djavax.net.debug=ssl # This sample value displays useful debugging information about TLS/SSL. # Any JVM args for the server. # For multiple args, put quotes around entire value. #SERVER_JVMARGS=-Xmx512m # You can set the "javax.net.debug" property on the server side here, in the # same exact way as shown for the client side above. hsqldb2.2-2.2.9.orig/hsqldb/sample/j-sample.sql0000644000175000017500000000176512007547332017631 0ustar renerene/* $Id: j-sample.sql 3605 2010-06-01 02:21:36Z unsaved $ Exemplifies use of SqlTool's \j command to specify the JDBC connection parameters right in the SQL file. Invoke like this: java -jar .../sqltool.jar - .../j-sample.sql (give the file paths to wherever these two files reside). Or start up SqlTool like this: java -jar .../sqltool.jar and then execute this script like \i .../j-sample.sql */ -- Abort this script when errors occur. -- That's the default if the script is invoked from command-line, but not if -- invoked by \i. \c false -- Note the new feature in HyperSQL 2, whereby you can set an SA password -- by just specifying that as the password for the very first connection to -- that database \j SA fred jdbc:hsqldb:mem:fred -- FORMAT: \j \p You have conkected successfully \p CREATE TABLE t(i BIGINT, vc VARCHAR(20)); INSERT INTO t VALUES(1, 'one'); INSERT INTO t VALUES(2, 'two'); SELECT * FROM t; hsqldb2.2-2.2.9.orig/hsqldb/sample/ldap-exerciser.properties0000644000175000017500000000353312007547332022420 0ustar renerene# $Id: ldap-exerciser.properties 3872 2010-11-09 04:14:40Z unsaved $ # This is a sample properties file for the utility program # org.hsqldb.auth.LdapAuthBean. See the API Spec for # org.hsqldb.auth.LdapAuthBean for details about all of the settings you can use # here. # IMPORTANT: Use ISO-8859-1 encoding for any extended characters, as you always # should for a Java properties file. # The ${...} construct (for system properties) is not supported. # All of these examples use a roleSchemaValuePattern setting to work with the # LDAP memberOf feature. If you have a direct attribute for specifying roles # (and optional schema), then just skip that setting. # These settings are used for all sample setups # When startTls is true, ldapHost must match the CN in the server's cert. ldapHost=beyla.admc.com parentDn=ou=people,dc=admc,dc=com roleSchemaValuePattern=cn=([^,]+).* rolesSchemaAttribute=memberof accessAttribute=hyperSqlAccess # This block of settings works for an OpenLDAP server using the memberOf # feature for membership in roles, with DIGEST-MD5 SASL and StartTLS with a # private (non-commercial) SSL certificate. startTls=true trustStore=/home/blaine/ca/cacert.store securityMechanism=DIGEST-MD5 # To use an LDAP server that is totally unsecured, comment out the settings in # the previous block and enable the one setting here. # An unsecured server can be useful for educational purposes, but not for a # real application! #principalTemplate=uid=${username},ou=people,dc=admc,dc=com # PLAIN authentication, but StartTLS-encrypted. Disable the block above # starting with "startTls=true" and enable the settings in this block. #principalTemplate=uid=${username},ou=people,dc=admc,dc=com # SASL DIGEST-MD5 with no encryption. Disable the block above # starting with "startTls=true" and enable the settings in this block. #securityMechanism=DIGEST-MD5 hsqldb2.2-2.2.9.orig/hsqldb/sample/sample.dsv0000644000175000017500000000042712007547332017371 0ustar renerene# Comment lines like this are permitted by default, as are # blank lines. Header line follows: i|d|b # Two good rows: 1|2007-01-02|true 2|2007-01-03|false # This should cause a parse error: 3|not a date|true # This should cause a database error: 4||true 5|2007-01-04|false hsqldb2.2-2.2.9.orig/hsqldb/sample/dsv-sample.sql0000644000175000017500000000235312007547332020166 0ustar renerene/* * $Id: dsv-sample.sql 610 2008-12-22 15:54:18Z unsaved $ * * Imports delimiter-separated-values, and generates an output * reject .dsv file, and a reject report. * * To execute, set up a SqlTool database urlid (see User Guide if you don't * know how to do that); then (from this directory) execute this script like * * java ../lib/hsqldb.jar mem dsv-sample.sql * * (replace "mem" with your urlid). */ CREATE TABLE sampletable(i INT, d DATE NOT NULL, b BOOLEAN); /* If you dont' set *DSV_TARGET_TABLE, it defaults to the base name of the .dsv file. */ * *DSV_TARGET_TABLE = sampletable \p WARNING: Some records will be skipped, and some others will be rejected. \p This is on purpose, so you can work with a reject report. \p /* By default, no reject files are written, and the import will abort upon * the first error encountered. If you set either of these settings, the * import will continue to completion if at all possible. */ * *DSV_REJECT_FILE = ${java.io.tmpdir}/sample-reject.dsv * *DSV_REJECT_REPORT = ${java.io.tmpdir}/sample-reject.html \m sample.dsv /* Enable this line if you want to display all successfully imported data: SELECT * FROM sampletable; */ \p \p See import reject report at '*{*DSV_REJECT_REPORT}'. hsqldb2.2-2.2.9.orig/hsqldb/sample/pl.sql0000644000175000017500000000553512007547332016533 0ustar renerene/* $Id: pl.sql 4563 2011-10-19 02:24:41Z unsaved $ SQL File to illustrate the use of some basic SqlTool PL features. Invoke like java -jar .../sqltool.jar mem .../pl.sql -- blaine */ * if (! *MYTABLE) \p MYTABLE variable not set! /* You could use \q to Quit SqlTool, but it's often better to just break out of the current SQL file. If people invoke your script from SqlTool interactively (with \i yourscriptname.sql) any \q will kill their SqlTool session. */ \p Use argument "-pMYTABLE=mytablename" for SqlTool * break * end if -- Turning on Continue-upon-errors so that we can check for errors ourselves. \c true \p \p Loading up a table named '*{MYTABLE}'... CREATE TABLE *{MYTABLE} ( i int, s varchar(20) ); -- PL variable ? is always set to status or fetched value of last SQL -- statement. It will be null/unset if the last SQL statement failed. \p CREATE status is *{?} \p /* Validate our return status. In case of success of a CREATE TABLE, *? will be 0, and therefore a '* if (*?)' would be false. So we follow the general practice of testing *? for the error indicator value of null, using the reserved SqlTool system variable *NULL. */ * if (*? == *NULL) \p Our CREATE TABLE command failed. * break * end if -- Default Continue-on-error behavior is what you usually want \c false \p /* Insert data with a foreach loop. These values could be from a read of another table or from variables set on the command line like */ \p Inserting some data into our new table * foreach VALUE (12 22 24 15) * if (*VALUE > 23) \p Skipping *{VALUE} because it is greater than 23 * continue \p YOU WILL NEVER SEE THIS LINE, because we just 'continued'. * end if INSERT INTO *{MYTABLE} VALUES (*{VALUE}, 'String of *{VALUE}'); * end foreach \p /* This time instead of using the ? variable, we're assigning the SELECT value to a User variable, 'themax'. */ * themax ~ /* Can put Special Commands and comments between "* VARNAME ~" and the target SQL statement. */ \p We're saving the max value for later. You'll still see query output here: SELECT MAX(i) FROM *{MYTABLE}; /* No need to test for failure status (either ? or themax being unset/null), because we are in \c mode and would have aborted if the SELECT failed. */ * if (0 == *themax) \p Got 0 as the max value. * break \p YOU WILL NEVER SEE THIS LINE, because we just 'broke'. * end if \p \p ############################################################## \p The results of our work: SELECT * FROM *{MYTABLE}; \p MAX value is *{themax} \p \p Counting down to exit * ((i = 3)) * while (*i > 0) \p *{i}... * ((i -= 1)) -- i++ is supported but i-- is not, because -- marks comments * end while \p \p Everything worked. Signing off. hsqldb2.2-2.2.9.orig/hsqldb/sample/plsql.sql0000644000175000017500000000260512007547330017244 0ustar renerene/* * $Id: plsql.sql 610 2008-12-22 15:54:18Z unsaved $ * * This example is copied from the "Simple Programs in PL/SQL" * example by Yu-May Chang, Jeff Ullman, Prof. Jennifer Widom at * the Standord University Database Group's page * http://www-db.stanford.edu/~ullman/fcdb/oracle/or-plsql.html . * I have only removed some blank lines (in case somebody wants to * copy this code interactively-- because you can't use blank * lines inside of SQL commands in non-raw mode SqlTool when running * it interactively); and, at the bottom I have replaced the * client-specific, non-standard command "run;" with SqlTool's * corresponding command ".;" and added a plain SQL SELECT command * to show whether the PL/SQL code worked. - Blaine */ CREATE TABLE T1( e INTEGER, f INTEGER ); DELETE FROM T1; INSERT INTO T1 VALUES(1, 3); INSERT INTO T1 VALUES(2, 4); /* Above is plain SQL; below is the PL/SQL program. */ DECLARE a NUMBER; b NUMBER; BEGIN SELECT e,f INTO a,b FROM T1 WHERE e>1; INSERT INTO T1 VALUES(b,a); END; .; /** The statement on the previous line, ".;" is SqlTool specific. * This command says to save the input up to this point to the * edit buffer and send it to the database server for execution. * I added the SELECT statement below to give imm */ /* This should show 3 rows, one containing values 4 and 2 (in this order)...*/ SELECT * FROM t1; hsqldb2.2-2.2.9.orig/hsqldb/sample/jaas.cfg0000644000175000017500000000350312007547332016767 0ustar renerene/* Copyright (c) 2010, The HSQL Development Group. All rights reserved. Released under the HSQL license, available at http://hsqldb.org This is a working JAAS configuration file that sets up two "applications" for use with HyperSQL's extAuthWithSpring sample. Look under /integration/extAuthWithSpring in your HyperSQL distribution for details. */ demo { /* * A trivial module that allows access if user name and password start with * the specified values. * See source code for the module in for this class under the test-src * directory of your HyperSQL installation. */ org.hsqldb.auth.StartCharModule required //debug=true nameStart="s" pwdStart="p" ; }; sunLdap { /* * JAAS setup for com.sun.security.auth.module.LdapLoginModule. * This proprietary Sun Java 1.6 JSSE module doesn't support StartTLS, but * does support the deprecated LDAPS. It also supports only a single role or * initial schema. * Do a web search for LdapLoginModule for the API Spec which describes the * available settings and (incompletely) functionality. There is another * popular class on the Internet with the same name, so make sure you look at * the one with package of com.sun.security.auth.module. */ com.sun.security.auth.module.LdapLoginModule required // useSSL means LDAPS, not StartDLS (which is not supported). // It is true by default, so set to false unless you want LDAPS. useSSL=false // Enable following line for debugging // debug=true java.naming.security.authentication="DIGEST-MD5" // Your URL must include the parent DN for user records as shown. userProvider="ldap://beyla.admc.com/ou=people,dc=admc,dc=com" authIdentity="{USERNAME}" userFilter="uid={USERNAME}" authzIdentity="{memberof}" ; }; hsqldb2.2-2.2.9.orig/hsqldb/sample/html-report.sql0000644000175000017500000000306412007547332020370 0ustar renerene/* * $Id: html-report.sql 4512 2011-10-11 02:29:08Z unsaved $ * * Sample/Template for writing an HTML Report */ -- Populate sample data create table t (i integer, vc varchar(20)); insert into t values(1, 'one'); insert into t values(2, 'two'); insert into t values(3, 'three'); insert into t values(4, 'four'); insert into t values(5, 'five'); commit; -- IMPORTANT: \o will append by default. If you want to write a new file, -- it's your responsibility to check that a file of the same name does not -- already exist (or remove it). -- Follow the following examples to use your own HTML fragment files. -- * *TOP_HTMLFRAG_FILE = /tmp/top.html -- * *BOTTOM_HTMLFRAG_FILE = /tmp/bottom.html -- The default TOP_HTMLFRAG_FILE has a reference to this PL variable. * REPORT_TITLE = Blaine's Sample Report -- The default will also override its CSS style settings with your own if you -- put them in a file named "overrides.css" in same directory alongside your -- reports ("report.html" in this example). -- You can add references to ${system.properties} and *{PL_VARIABLES} in -- your own custom fragment files too. -- Turn on HTML output mode. -- Must enable HTML _before_ opening to write top frag. \h true \o report.html \p A message to appear in the Report SELECT * FROM t; -- Close off output just to show that you can go back and forth. -- A close with '\o' will not write the bottom boilerplate that closes the HTML. \o \h false \p Some non-HTML non-Report output: SELECT count(*) FROM t; \h true -- Re-open the report \o report.html \d t -- This time close it with \oc hsqldb2.2-2.2.9.orig/hsqldb/sample/nullempty.sql0000644000175000017500000000145612007547330020145 0ustar renerene/* * $Id: nullempty.sql 4709 2011-11-05 01:50:17Z unsaved $ * * This sample shows differences between null and empty strings, * and ? var vs. _/~ variables. */ \p At startup ? is equal to empty string. See between A and B: A*{?}B * if (A*{?}B == AB) \p ? is the empty string CREATE TABLE t(i INTEGER, vc VARCHAR(20)); INSERT INTO t VALUES(1, 'one'); INSERT INTO t VALUES(2, 'two'); * res ~ SELECT * FROM t; \p *{?} \p *{res} * listvalues ? res INSERT INTO t VALUES (3, null); *res ~ SELECT vc FROM t WHERE i = 3; \p *{?} * if (*res == **NULL) \p res really is null * listvalues ? res -- This will prevent SqlTool from aborting when we run a bad SQL statement: \c true *res ~ SELECT hocus FROM pocus; * if (*? == **NULL) \p ? really is null * if (*res == **NULL) \p res really is null * listvalues ? res hsqldb2.2-2.2.9.orig/hsqldb/sample/sample.c0000644000175000017500000003110112007547332017010 0ustar renerene/* * @(#)$Id: sample.c 3648 2010-06-08 22:44:25Z unsaved $ * * HyperSQL Database Engine * * Copyright (c) 2009-2010, The HSQL Development Group */ #include #ifdef _WINDOWS #include #endif #include // sqlext.h pulls in all other ODBC header files that we need #include #include extern int detectOdbcFailure(SQLRETURN rv, SQLHENV c, char* failMsg); extern int print_ret(char* msg, int retval); extern int print2_ret(char* msg, char* msg2, int retval); /** * This test HyperSQL client uses the ODBC DSN "tstdsn" to connect up to a * HyperSQL server. Just configure your own DSN to use the HyperSQL ODBC * driver, specifying the HyperSQL server host name, database name, user, * password, etc. * * Sample C program accessing HyperSQL. * * ODBC C API ref at * http://msdn.microsoft.com/en-us/library/ms714562(VS.85).aspx . * Summary of functions at * http://msdn.microsoft.com/en-us/library/ms712628(VS.85).aspx * * To build on UNIX with unixODBC:
                  
                   *     gcc -lodbc -o sample sample.c
                   * 
                  * * To build in Windows with MSVC++ (Express variant is free):
                  
                   *      cl /nologo /D _WINDOWS /D ODBCVER=0x0351 /c sample.c
                   *      link odbc32.lib /nologo /machine:x86 sample.obj /out:sample.exe
                   * 
                  * * @author Blaine Simpson (blaine dot simpson at admc dot com) */ int main(int argc, char** argv) { SQLRETURN odbcret; SQLHENV sqlhenv; SQLHENV conn; SQLHSTMT stmt; char *cp; long in_idval; const int cstrmax = 100; char *in_vcval = malloc(cstrmax); long out_idval; char *out_vcval = malloc(cstrmax); char *out_etimeval = malloc(cstrmax); SQLLEN ntsval = SQL_NTS; int detect; // I. CONNECT odbcret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlhenv); if (odbcret != SQL_SUCCESS && odbcret != SQL_SUCCESS_WITH_INFO) return print_ret("Failed to allocate an ODBC environment handle", 1); odbcret = SQLSetEnvAttr(sqlhenv, SQL_ATTR_ODBC_VERSION, (void*) SQL_OV_ODBC3, 0); if (odbcret != SQL_SUCCESS && odbcret != SQL_SUCCESS_WITH_INFO) return print_ret("Failed to set ODBC version 3.0", 2); odbcret = SQLAllocHandle(SQL_HANDLE_DBC, sqlhenv, &conn); if (odbcret != SQL_SUCCESS && odbcret != SQL_SUCCESS_WITH_INFO) return print_ret("Failed to allocate an ODBC connection handle", 3); odbcret = SQLSetConnectAttr( conn, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF, 0); if (odbcret != SQL_SUCCESS && odbcret != SQL_SUCCESS_WITH_INFO) return print_ret("Failed to allocate an ODBC connection handle", 3); // May also want to set timeout values in the same way // Can override the DSN-defined user name and/or password here: detect = detectOdbcFailure( SQLConnect(conn, (SQLCHAR*) "tstdsn", SQL_NTS, (SQLCHAR*) NULL, 0, (SQLCHAR*) NULL, 0), conn, "Connection failure"); if (detect) return detect; // II. PREPARE OBJECTS FOR USE detect = detectOdbcFailure( SQLAllocHandle(SQL_HANDLE_STMT, conn, &stmt), conn, "Failed to allocate an ODBC statement handle"); if (detect) return detect; // Just using this char pointer because some non-ANSI compilers won't let // us declare a char array/pointer here. cp = "DROP TABLE tsttbl IF EXISTS"; detect = detectOdbcFailure(SQLExecDirect(stmt, cp, SQL_NTS), conn, "DROP statement failed"); if (detect) return detect; // Some recent change to the HyperSQL server or to unixODBC // has made this commit necessary, at least on UNIX. Some other // transaction control command would probably be more // appropriate here. detect = detectOdbcFailure(SQLEndTran(SQL_HANDLE_DBC, conn, SQL_COMMIT), conn, "COMMIT failed"); if (detect) return detect; cp = "CREATE TABLE tsttbl(\n\ id BIGINT generated BY DEFAULT AS IDENTITY,\n\ vc VARCHAR(20),\n\ entrytime TIMESTAMP DEFAULT current_timestamp NOT NULL\n\ )"; detect = detectOdbcFailure(SQLExecDirect(stmt, cp, SQL_NTS), conn, "CREATE TABLE statement failed"); if (detect) return detect; detect = detectOdbcFailure(SQLCloseCursor(stmt), conn, "Failed to close Cursor for re-use"); if (detect) return detect; // III. INSERT DATA // Non-parameter INSERT cp = "INSERT INTO tsttbl (id, vc) values (1, 'one')"; detect = detectOdbcFailure(SQLExecDirect(stmt, cp, SQL_NTS), conn, "1st Insertion failed"); if (detect) return detect; #ifdef _WINDOWS // TODO: PROBLEM with Parameterized INPUT in Windows (works fine on UNIX). // For some reason, even if we are do a Prepare/Execute (and our // driver is set to always use server-side Preparation), the client side // is doing the substitution... and doing a bad Lob of it too. // Therefore, we do all INSERTs statically for Windows here: cp = "INSERT INTO tsttbl (id, vc) values (2, 'two')"; detect = detectOdbcFailure(SQLExecDirect(stmt, cp, SQL_NTS), conn, "2nd Insertion failed"); if (detect) return detect; cp = "INSERT INTO tsttbl (id, vc) values (3, 'three')"; detect = detectOdbcFailure(SQLExecDirect(stmt, cp, SQL_NTS), conn, "3rd Insertion failed"); if (detect) return detect; cp = "INSERT INTO tsttbl (id, vc) values (4, 'four')"; detect = detectOdbcFailure(SQLExecDirect(stmt, cp, SQL_NTS), conn, "4th Insertion failed"); if (detect) return detect; cp = "INSERT INTO tsttbl (id, vc) values (5, 'five')"; detect = detectOdbcFailure(SQLExecDirect(stmt, cp, SQL_NTS), conn, "5th Insertion failed"); if (detect) return detect; #else // Parameterized INSERT cp = "INSERT INTO tsttbl (id, vc) values (?, ?)"; detect = detectOdbcFailure(SQLPrepare(stmt, (SQLCHAR*) cp, SQL_NTS), conn, "Preparation of Insertion stmt failed"); if (detect) return detect; detect = detectOdbcFailure( SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_BIGINT, 0, 0, &in_idval, 0, NULL), conn, "Bind of 'id' input failed"); if (detect) return detect; detect = detectOdbcFailure( SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 20, 0, in_vcval, cstrmax, &ntsval), conn, "Bind of 'vc' input failed"); if (detect) return detect; in_idval = 2; strcpy(in_vcval, "two"); detect = detectOdbcFailure(SQLExecute(stmt), conn, "Insertion of 2nd row failed"); if (detect) return detect; in_idval = 3; strcpy(in_vcval, "three"); detect = detectOdbcFailure(SQLExecute(stmt), conn, "Insertion of 3rd row failed"); if (detect) return detect; in_idval = 4; strcpy(in_vcval, "four"); detect = detectOdbcFailure(SQLExecute(stmt), conn, "Insertion of 4th row failed"); if (detect) return detect; in_idval = 5; strcpy(in_vcval, "five"); detect = detectOdbcFailure(SQLExecute(stmt), conn, "Insertion of 5th row failed"); if (detect) return detect; #endif detect = detectOdbcFailure(SQLEndTran(SQL_HANDLE_DBC, conn, SQL_COMMIT), conn, "COMMIT failed"); if (detect) return detect; detect = detectOdbcFailure(SQLCloseCursor(stmt), conn, "Failed to close Cursor for re-use"); if (detect) return detect; // IV. QUERIES // Non-Parameter QUERY cp = "SELECT * FROM tsttbl WHERE id < 3"; detect = detectOdbcFailure(SQLExecDirect(stmt, cp, SQL_NTS), conn, "Non-parameter query failed"); // Would return SQL_NO_DATA if no rows inserted. // Don't need to bind until before fetches are performed. if (detect) return detect; detect = detectOdbcFailure( SQLBindCol(stmt, 1, SQL_C_SLONG, &out_idval, 0, NULL), conn, "Bind of 'id' output failed"); if (detect) return detect; detect = detectOdbcFailure( SQLBindCol(stmt, 2, SQL_C_CHAR, out_vcval, cstrmax, &ntsval), conn, "Bind of 'vc' output failed"); if (detect) return detect; detect = detectOdbcFailure( SQLBindCol(stmt, 3, SQL_C_CHAR, out_etimeval, cstrmax, &ntsval), conn, "Bind of 'entrytime' output failed"); if (detect) return detect; while ((odbcret = SQLFetch(stmt)) != SQL_NO_DATA) { if (detectOdbcFailure(odbcret, conn, "Fetch failed")) return detect; printf("%dl|%s|%s\n", out_idval, out_vcval, out_etimeval); } detect = detectOdbcFailure(SQLCloseCursor(stmt), conn, "Failed to close Cursor for re-use"); if (detect) return detect; #if _WINDOWS // Input parameters not working on Windows. See comment above. cp = "SELECT * FROM tsttbl WHERE id > 3"; detect = detectOdbcFailure(SQLExecDirect(stmt, cp, SQL_NTS), conn, "Non-parameter query failed"); // Would return SQL_NO_DATA if no rows inserted. // Don't need to bind until before fetches are performed. if (detect) return detect; detect = detectOdbcFailure( SQLBindCol(stmt, 1, SQL_C_SLONG, &out_idval, 0, NULL), conn, "Bind of 'id' output failed"); if (detect) return detect; detect = detectOdbcFailure( SQLBindCol(stmt, 2, SQL_C_CHAR, out_vcval, cstrmax, &ntsval), conn, "Bind of 'vc' output failed"); if (detect) return detect; detect = detectOdbcFailure( SQLBindCol(stmt, 3, SQL_C_CHAR, out_etimeval, cstrmax, &ntsval), conn, "Bind of 'entrytime' output failed"); if (detect) return detect; while ((odbcret = SQLFetch(stmt)) != SQL_NO_DATA) { if (detectOdbcFailure(odbcret, conn, "Fetch failed")) return detect; printf("%dl|%s|%s\n", out_idval, out_vcval, out_etimeval); } #else // Parameterized QUERY cp = "SELECT * FROM tsttbl WHERE id > ?"; detect = detectOdbcFailure(SQLPrepare(stmt, (SQLCHAR*) cp, SQL_NTS), conn, "Preparation of Query stmt failed"); if (detect) return detect; in_idval = 3; detect = detectOdbcFailure( SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_BIGINT, 0, 0, &in_idval, 0, NULL), conn, "Bind of 'id' input failed"); if (detect) return detect; detect = detectOdbcFailure(SQLExecute(stmt), conn, "Parameterized query failed"); // Would return SQL_NO_DATA if no rows selected // Don't need to bind until before fetches are performed. if (detect) return detect; detect = detectOdbcFailure( SQLBindCol(stmt, 1, SQL_C_SLONG, &out_idval, 0, NULL), conn, "Bind of 'id' output failed"); if (detect) return detect; detect = detectOdbcFailure( SQLBindCol(stmt, 2, SQL_C_CHAR, out_vcval, cstrmax, &ntsval), conn, "Bind of 'vc' output failed"); if (detect) return detect; detect = detectOdbcFailure( SQLBindCol(stmt, 3, SQL_C_CHAR, out_etimeval, cstrmax, &ntsval), conn, "Bind of 'entrytime' output failed"); if (detect) return detect; #endif while ((odbcret = SQLFetch(stmt)) != SQL_NO_DATA) { if (detectOdbcFailure(odbcret, conn, "Fetch failed")) return detect; printf("%dl|%s|%s\n", out_idval, out_vcval, out_etimeval); } detect = detectOdbcFailure(SQLCloseCursor(stmt), conn, "Failed to close Cursor"); if (detect) return detect; SQLDisconnect(conn); SQLFreeHandle(SQL_HANDLE_DBC, conn); SQLFreeHandle(SQL_HANDLE_ENV, sqlhenv); //return print_ret("Success", 0); return 0; } /** * Displays error message and prepare for program exit. */ int barf(SQLHENV c, char* failMsg) { char sqlhmsg[200], sqlhstat[10]; SQLSMALLINT junksmall; SQLINTEGER errint; SQLGetDiagRec(SQL_HANDLE_DBC, c, 1, sqlhstat, &errint, sqlhmsg, 100, &junksmall); return print2_ret(failMsg, sqlhmsg, 1); } /** * Displays error message and prepare for program exit if the given * rv indicates ODBC failure. */ int detectOdbcFailure(SQLRETURN rv, SQLHENV c, char* failMsg) { if (rv == SQL_SUCCESS || rv == SQL_SUCCESS_WITH_INFO) return 0; return barf(c, failMsg); } /** * 2-param wrapper for print2_ret() function. */ int print_ret(char* msg, int retval) { return print2_ret(msg, (char*) NULL, retval); } /** * Displays message to stderr and returns given value. * * Function name here is a hack, because I don't remember how to overload C * functions (in a portable way). */ int print2_ret(char* msg, char* msg2, int retval) { fputs(msg, stderr); fputc('\n', stderr); if (msg2 != NULL) { fputs(msg2, stderr); fputc('\n', stderr); } return retval; } hsqldb2.2-2.2.9.orig/hsqldb/sample/server.properties0000644000175000017500000000175412007547330021020 0ustar renerene# Hsqldb Server cfg file. # See the HyperSQL Network Listeners chapter of the HyperSQL User Guide. # Each server.database.X setting defines a database "catalog". # I.e., an independent set of data. # Each server.database.X setting corresponds exactly to the jdbc:hsqldb:* # JDBC URL you would use if you wanted to get a direct (In-Process) # Connection to the catalog instead of "serving" it. server.database.0=file:db0/db0 # I suggest that, for every file: catalog you define, you add the # connection property "ifexists=true" after the database instance # is created (which happens simply by starting the Server one time). # Just append ";ifexists=true" to the file: URL, like so: # server.database.0=file:db0/db0;ifexists=true # server.dbname.0 defaults to "" (i.e. server.dbname.n for n==0), but # the catalog definition n will be entirely ignored for n > 0 if you do not # set server.dbname.n. I.e. dbname setting is required for n > 0, though it # may be set to blank (e.g. "server.dbname.3=") hsqldb2.2-2.2.9.orig/hsqldb/sample/sample.php0000755000175000017500000000502512007547332017366 0ustar renerene#!/usr/bin/php5 hsqldb2.2-2.2.9.orig/hsqldb/sample/hsqldb.init0000755000175000017500000004461612007547330017545 0ustar renerene#!/bin/sh # For boot-up and system shutdown, most UNIXes explicitly run a shell # interpreter. In that case, the interpreter line above is ignored. # There are a few UNIXes (notably Darwin) that require the interpreter line. # Copyright (c) 2001-2008, The HSQL Development Group # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of the HSQL Development Group nor the names of its # contributors may be used to endorse or promote products derived from this # software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, # OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # $Id: hsqldb.init 4517 2011-10-11 04:20:11Z unsaved $ # UNIX init script for HSQLDB. # IMPORTANT! Users running multiple HSQLDB ***Server processes*** must use a # unique "SERVICE" name for each Server process. Most users will run just one # server instance, possibly serving lots of database instances. Multi-server # runners must change the value on the following line, and, if your system # uses chkconfig or insserv, you must change the value of "hsqldb" to the # same thing (as SERVICE) in the chkconfig and/or insserv blocks a few # lines down from here (incl. in the pidfile and config file paths). (Sorry # to say, but you need to repeat this procedure after every HSQLDB upgrade). SERVICE=hsqldb # This is the one setting which users will commonly change in this file. # It's impossible to determine this script name (in a portable way) at boot-up # time, since ${0} is entirely different for init scripts, depending on UNIX # version. # See the "HyperSQL on UNIX" chapter of the HyperSQL User Guide for how to # use this file. # This block only used by chkconfig systems (incl. SuSE Linux). # chkconfig: 345 87 13 # description: HyperSQL Database, A High Performance Java Database Server # pidfile: /var/run/hsqldb.pid # config: /etc/sysconfig/hsqldb # This block only used by insserv systems (incl. SuSE Linux). ### BEGIN INIT INFO # Provides: hsqldb # Required-Start: $syslog $remote_fs $network $named # Required-Stop: # Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Short-Description: HyperSQL Database Server # Description: HyperSQL Database, A High Performance Java Database Server ### END INIT INFO # UNIX System-V and Linux users should copy this script to the common # init script directory (/etc/init.d/ on most systems) with name "hsqldb", # or whatever you have SERVICE set to (no ".init" suffix!). # N.b. Being a system script, this script does not use inherited variables. # If you want to adjust a setting, edit the config file. # Strategy of this init script is to avoid shell-specific functionality, # and use only lowest-common-denominator Bourne capabilities. # We don't include OS-specific functions, and we don't use shell- # implementation-specific functionality like "echo ...\c" or "echo -n...". # Since some Bourne shells don't support shell functions at all, we don't # even define any local functions. # This script has been generalized to the point that it can now "start" # any combination of classes with the normal static main methods. # You can supply invocation arguments to the # TARGET_CLASS invocation, and can start as many other classes as you # wish by using the INVOC_ADDL_ARGS setting (this includes running # multiple HSQLDB Servers of various types). # Template config file can be obtained from the HyperSQL distribution. # On the day I write this, I have it located at "sample/hsqldb.cfg" in the # distro, but that could change. You need to copy then edit it before it # will work. # Recommended locations for runtime configuration file: # Darwin, SunOS, Solaris: /etc/hsqldb.conf # (However, Sunfreeware.com builds use /usr/local/etc). # Linux: /etc/sysconfig # FreeBSD: /usr/local/etc/hsqldb.cfg # (Replace the base name "hsqldb" with whatever you have SERVICE set to at # the top of this file). # You can put it at any of these locations and it will be used. For # your sanity, only put a file at one of these locations. # -- blaine.simpson@admc.com set +u # Following function is Copyright Apache 2.0 by Axis Data Management Corp. # and code is copied verbatim from # http://pub.admc.com/scripts/bin/minsleep-nov.fnc # Sleeps until process dies or file appears. # 2nd parameter is assumed to be a PID if it is an integer. minsleep() { [ $# -eq 2 ] || { echo 'SYNTAX: minsleep MAXSECS PID|PATH (for integers MAXSECS and PID)' 1>&2 return 2 } TARGET_PID= TARGET_PATH= MAXSECS=$1; shift case "$1" in *[!0-9]*) TARGET_PATH="$1";; *) TARGET_PID="$1";; esac; shift _secs=0 while [ $_secs -lt $MAXSECS ]; do _secs=`expr $_secs + 1` if [ -n "$TARGET_PID" ]; then kill -0 $TARGET_PID > /dev/null 2>&1 || return 0 # Target proc died elif [ -s "$TARGET_PATH" ]; then return 0 # Target process died fi sleep 1 done return 1 # Timed out } # This is only used for recursive invocations. # Will not necessarily be set correctly at system bootup invocations # (where it is sometimes invoked like "sh... /path/to/hsqldb start"), # but, in those cases there will be no recursion. INVOC_PATH=`dirname "$0"` || { echo "'dirname' failed" 1>&2 exit 2 } [ -n "$INVOC_PATH" ] && INVOC_PATH="${INVOC_PATH}/" SYNTAX_MSG="SYNTAX: ${INVOC_PATH}${SERVICE} start|stop|stopcompact|restart|restartcmpacted|status" # You can override any of these default values in your config file: # Max time for background su command to start up and echo pid. # (0 works for moderately fast servers). SU_ECHO_SECS=30 # File used as semaphore. If file is removed, a running pid checker # process will exit. PIDCHECKER_FLAGFILE=/tmp/pidchecker.run # The following settings get overridden by optional setting in the config file. # Max time for JVM to die after all HSQLDB instances stopped. MAX_TERMINATE_SECS=60 # We require all Server/WebServer instances to be accessible within # $MAX_START_SECS from when the Server/WebServer is started. MAX_START_SECS=60 # Class to start TARGET_CLASS=org.hsqldb.server.Server CLIENT_JVMARGS= SERVER_JVMARGS= CFGFILE= LOGFILE= PIDFILE= BASEDIR= AUTH_FILE= SHUTDOWN_OPTION= SERVER_ADDL_CLASSPATH= INVOC_ADDL_ARGS= case "`uname`" in Darwin) # I.e. Mac OS X. I don't know about older Mac OSes. LOGFILE=/var/log/${SERVICE}.log PIDFILE=/var/run/${SERVICE}.pid ;; Linux) LOGFILE=/var/log/${SERVICE}.log PIDFILE=/var/run/${SERVICE}.pid ;; FreeBSD) LOGFILE=/var/log/${SERVICE}.log PIDFILE=/var/run/${SERVICE}.pid ;; SunOS) LOGFILE=/var/log/${SERVICE}.log PIDFILE=/etc/${SERVICE}.pid ;; *) LOGFILE=/var/log/${SERVICE}.log PIDFILE=/etc/${SERVICE}.pid ;; esac for candidate in /etc/sysconfig/${SERVICE} /etc/${SERVICE}.conf \ /etc/${SERVICE}.cfg /Library/Hsqldb/conf/${SERVICE}.cfg \ /Library/Hsqldb/${SERVICE}.cfg /usr/local/etc/${SERVICE}.cfg; do [ -f $candidate ] && { CFGFILE=$candidate break } done [ -n "$CFGFILE" ] || { echo "No global config file found in any of allowed locations" 1>&2 exit 11 } # Sanity check [ -n "$LOGFILE" ] && [ -n "$PIDFILE" ] || { echo "Internal problem in init script" 1>&2 exit 11 } [ $# -eq 1 ] || { echo "$SYNTAX_MSG" 1>&2 exit 4 } # It would be nice to permit some uses, like "status" by non-root users, # but for now our goal is a superuser init script. [ -w / ] || { # Very portable, but perhaps not perfect, test for superuser. echo "Only 'root' may use this init script" 1>&2 exit 4 } # Use bsd-style enable/disable if it's in place. BSDCFG= [ -r /etc/rc.conf ] && [ -f /etc/rc.conf ] && { . /etc/rc.conf BSDCFG=1 } [ -r /etc/rc.conf.local ] && [ -f /etc/rc.conf.local ] && { . /etc/rc.conf.local BSDCFG=1 } [ -n "$BSDCFG" ] && { case "$hsqldb_enable" in [Yy][Ee][Ss]);; [Oo][Nn]);; [Tt][Rr][Uu][Ee]);; *) exit 0;; # Don't run if not enabled for BSD startup esac } COMMAND="$1"; shift [ -r "$CFGFILE" ] || { echo "Unable to read config file '$CFGFILE'" 1>&2 exit 2 } [ -f "$CFGFILE" ] || { echo "'$CFGFILE' is not a regular file" 1>&2 exit 2 } HSQLDB_OWNER= JAVA_EXECUTABLE= SQLTOOL_JAR_PATH= SERVER_HOME= SHUTDOWN_URLIDS= URLIDS= . "$CFGFILE" # Suffix delimiter to $SERVER_ADDL_CLASSPATH, if it is set. [ -n "$SERVER_ADDL_CLASSPATH" ] && SERVER_ADDL_CLASSPATH="${SERVER_ADDL_CLASSPATH}:" # Validate that config file sets all required variables. [ -n "$JAVA_EXECUTABLE" ] && [ -n "$SQLTOOL_JAR_PATH" ] && [ -n "$SERVER_HOME" ] && [ -n "$URLIDS" ] || { echo "Config file '$CFGFILE' does not set one or more of following variables JAVA_EXECUTABLE, SQLTOOL_JAR_PATH, SERVER_HOME, URLIDS" 1>&2 exit 2 } [ -d "$SERVER_HOME" ] || { echo "SERVER_HOME variable in '$CFGFILE' is set to a non-directory." 1>&2 exit 2 } [ -f "$JAVA_EXECUTABLE" ] && [ -f "$SQLTOOL_JAR_PATH" ] || { echo "JAVA_EXECUTABLE or SQLTOOL_JAR_PATH in '$CFGFILE' is set to a non-file." 1>&2 exit 2 } [ -r "$SQLTOOL_JAR_PATH" ] || { echo "'$SQLTOOL_JAR_PATH' isn't readable" 1>&2 exit 2 } [ -x "$JAVA_EXECUTABLE" ] || { echo "No Java executable found at '$JAVA_EXECUTABLE'" 1>&2 exit 2 } # "chown" lives here on some UNIXes. PATH="$PATH:/usr/sbin" # Make a good effort (but not bullet-proof) check on permissions of the # auth file. Unfortunately, if auth-file is not specified, this depends # upon both (a) $HOME being set; and (b) SqlToolSprayer and SqlTool defaults. # On the other hand, it works great if AUTH_FILE is set explicitly by user. if [ -z "$AUTH_FILE" ] && [ -z "$HOME" ]; then : # Lousy init environment didn't set $HOME, so can't find dflt cfg file. else _AUTH_TEST_PATH="$AUTH_FILE" [ -n "${_AUTH_TEST_PATH}" ] || _AUTH_TEST_PATH="$HOME/sqltool.rc" [ -f "$_AUTH_TEST_PATH" ] || { echo "No auth file found at '$_AUTH_TEST_PATH'" 1>&2 exit 2 } [ -r "$_AUTH_TEST_PATH" ] || { echo "Auth file '$_AUTH_TEST_PATH' not readable" 1>&2 exit 2 } ls -lLd "$_AUTH_TEST_PATH" | grep '^-..------' > /dev/null 2>&1 || { echo "Fix permissions on '$_AUTH_TEST_PATH' like 'chmod 600 $_AUTH_TEST_PATH'" 1>&2 exit 2 } fi # Set HSQLDB_PID according to pid file. HSQLDB_PID= [ -r "$PIDFILE" ] && { [ -f "$PIDFILE" ] || { echo "'$PIDFILE' is not a regular file" 1>&2 exit 6 } [ -w "$PIDFILE" ] || { echo "'$PIDFILE' is not writable" 1>&2 exit 6 } HSQLDB_PID="`cat $PIDFILE`" || { echo "Failed to read pid file '$PIDFILE'" 1>&2 exit 6 } case "$HSQLDB_PID" in *[a-zA-Z/!@#$%*+=_~]*) HSQLDB_PID=;; *'^'*) HSQLDB_PID=;; esac [ -n "$HSQLDB_PID" ] || { echo "Pid file '$PIDFILE' does not contain a valid process identifier" 1>&2 exit 6 } kill -0 "$HSQLDB_PID" > /dev/null 2>&1 || { echo 'Removing stale pid file' rm -f "$PIDFILE" || { echo "Failed to remove pid file '$PIDFILE'" 1>&2 exit 6 } HSQLDB_PID= } #echo "PID is ($HSQLDB_PID)" } case "$COMMAND" in status) [ -n "$HSQLDB_PID" ] || { echo "I don't know of any running ${SERVICE} server." exit 0 } echo "There is an ${SERVICE} server loaded from $SQLTOOL_JAR_PATH running with pid $HSQLDB_PID." # I would give a nice ps command here, were ps not so damned # OS-specific. AUTH_FILE_SWITCH= # N.b., there will be a problem if there are special characters or # spaces inside of $AUTH_FILE. [ -n "$AUTH_FILE" ] && AUTH_FILE_SWITCH="-Dsqltoolsprayer.rcfile=$AUTH_FILE" # Might as well set CLASSPATH for a cleaner command. CLASSPATH="$SQLTOOL_JAR_PATH" export CLASSPATH export PATH # Required only for some funny init environments. exec "$JAVA_EXECUTABLE" $AUTH_FILE_SWITCH $CLIENT_JVMARGS \ "-Dsqltoolsprayer.monfile=$PIDFILE" \ org.hsqldb.cmdline.SqlToolSprayer 'CALL true;' $URLIDS > /dev/null ;; start) [ -n "$TLS_KEYSTORE" ] || [ -n "$TLS_PASSWORD" ] && echo "WARNING: The TLS_* settings have been obsoleted. See the comments in the new sample 'hsqldb.cfg' file." 1>&2 [ -n "$HSQLDB_PID" ] && { echo "There is already a ${SERVICE} server running with pid $HSQLDB_PID." 1>&2 exit 1 } if [ -n "$HSQLDB_OWNER" ]; then touch "$PIDFILE" || { echo "Failed to create pid file" 1>&2 exit 1 } chown "$HSQLDB_OWNER" "$PIDFILE" || { echo "Failed to chown pid file to '$HSQLDB_OWNER'" 1>&2 exit 1 } # Some OSes choke if there are newlines in this string. # N.b.!!! The shell of the -c command is the target user's default # login shell, so keep this command shell-independent! nohup su "$HSQLDB_OWNER" -c "cd '$SERVER_HOME' && echo "'$$'" > '$PIDFILE' && exec '$JAVA_EXECUTABLE' $SERVER_JVMARGS -classpath '${SERVER_ADDL_CLASSPATH}${SQLTOOL_JAR_PATH}' org.hsqldb.util.MainInvoker $TARGET_CLASS $INVOC_ADDL_ARGS" >> "$LOGFILE" 2>&1 & else cd "$SERVER_HOME" || { echo "Failed to cd to '$SERVER_HOME'" 1>&2 exit 1 } export JAVA_EXECUTABLE export SQLTOOL_JAR_PATH export PIDFILE export SERVER_JVMARGS export TARGET_CLASS export INVOC_ADDL_ARGS export SERVER_ADDL_CLASSPATH nohup sh -c ' echo $$ > "$PIDFILE" || { echo "Failed to write pid to pid file" 1>&2 exit 1 } eval exec "$JAVA_EXECUTABLE" $SERVER_JVMARGS -classpath "${SERVER_ADDL_CLASSPATH}${SQLTOOL_JAR_PATH}" org.hsqldb.util.MainInvoker $TARGET_CLASS $INVOC_ADDL_ARGS ' >> "$LOGFILE" 2>&1 & fi minsleep $SU_ECHO_SECS "$PIDFILE" # Make sure bg commands have time to echo pid. AUTH_FILE_SWITCH= # N.b., there will be a problem if there are special characters or # spaces inside of $AUTH_FILE. [ -n "$AUTH_FILE" ] && AUTH_FILE_SWITCH="-Dsqltoolsprayer.rcfile=$AUTH_FILE" # Might as well set CLASSPATH for a cleaner command. CLASSPATH="$SQLTOOL_JAR_PATH" export CLASSPATH export PATH # Required only for some funny init environments. # There are many reasons why we could fail to read the pid file, # but regardless of why, the pid file does not contain a valid pid. touch "$PIDCHECKER_FLAGFILE" || { echo "Failed to touch file '$PIDCHECKER_FLAGFILE'" 1>&2 exit 1 } export PIDCHECKER_FLAGFILE export PIDFILE ( while true; do # Could possibly use minsleep to simplify this, but I don't # want to take the time to test the function export behavior. # -a and -e tests are not portable. [ -f "$PIDCHECKER_FLAGFILE" ] || exit 0 kill -0 "`cat $PIDFILE`" > /dev/null 2>&1 || { rm -f "$PIDFILE" "$PIDCHECKER_FLAGFILE" exit 1 } sleep 1 done ) & "$JAVA_EXECUTABLE" $AUTH_FILE_SWITCH $CLIENT_JVMARGS \ "-Dsqltoolsprayer.monfile=$PIDFILE" \ "-Dsqltoolsprayer.maxtime=${MAX_START_SECS}000" \ org.hsqldb.cmdline.SqlToolSprayer 'CALL true;' $URLIDS > /dev/null && { rm -f "$PIDCHECKER_FLAGFILE" echo "$TARGET_CLASS started with pid `cat $PIDFILE`" exit 0 } rm -f "$PIDCHECKER_FLAGFILE" echo "Failed to start $TARGET_CLASS. See log file '$LOGFILE'." 1>&2 exit 1 ;; stop|stopcompact) [ "$COMMAND" = stopcompact ] && SHUTDOWN_OPTION='compact' [ -n "$HSQLDB_PID" ] || { echo "I don't know of any running ${SERVICE} server." 1>&2 exit 1 } AUTH_FILE_SWITCH= # N.b., there will be a problem if there are special characters or # spaces inside of $AUTH_FILE. [ -n "$AUTH_FILE" ] && AUTH_FILE_SWITCH="-Dsqltoolsprayer.rcfile=$AUTH_FILE" # Might as well set CLASSPATH for a cleaner command. CLASSPATH="$SQLTOOL_JAR_PATH" export CLASSPATH export PATH # Required only for some funny init environments. "$JAVA_EXECUTABLE" $AUTH_FILE_SWITCH $CLIENT_JVMARGS \ org.hsqldb.cmdline.SqlToolSprayer "shutdown ${SHUTDOWN_OPTION};" \ $URLIDS $SHUTDOWN_URLIDS || exit 1 minsleep $MAX_TERMINATE_SECS $HSQLDB_PID || { echo "WARNING: ${SERVICE} is still running!" 1>&2 exit 1 } rm -f "$PIDFILE" || { echo "Failed to remove pid file '$PIDFILE'" 1>&2 exit 1 } echo "Successful shutdown ${SHUTDOWN_OPTION} (for the $TARGET_CLASS process)!" exit 0 ;; restart|restartcompacted) STOP_COMMAND=stop [ "$COMMAND" = restartcompacted ] && STOP_COMMAND=stopcompact "${INVOC_PATH}"${SERVICE} $STOP_COMMAND || exit $? exec "${INVOC_PATH}"/${SERVICE} start ;; *) echo "$SYNTAX_MSG" 1>&2 exit 5 ;; esac hsqldb2.2-2.2.9.orig/hsqldb/sample/load_binding_lu.sql0000644000175000017500000000114012007547332021215 0ustar renerene/* $Id: load_binding_lu.sql 610 2008-12-22 15:54:18Z unsaved $ Load BINDING Lookup Text Table */ \p Creating table BINDING_TMPTXT CREATE TEMP TEXT TABLE binding_tmptxt ( id integer, name varchar(12) ); \p Setting text file source SET TABLE binding_tmptxt SOURCE "binding_lu.ttbl;ignore_first=true;fs=|"; \p rows in binding_tmptxt: select count(*) from binding_tmptxt; \p PRE rows in binding_lu: select count(*) from binding_lu; INSERT INTO binding_lu ( id, name ) SELECT id, name FROM BINDING_TMPTXT; commit; \p POST rows in binding_lu: select count(*) from binding_lu; hsqldb2.2-2.2.9.orig/hsqldb/sample/sqltool.rc0000644000175000017500000001357612007547330017424 0ustar renerene# $Id: sqltool.rc 4312 2011-06-06 02:16:39Z unsaved $ # This is a sample RC configuration file used by SqlTool, DatabaseManager, # and any other program that uses the org.hsqldb.lib.RCData class. # See the documentation for SqlTool for various ways to use this file. # If you have the least concerns about security, then secure access to # your RC file. # You can run SqlTool right now by copying this file to your home directory # and running # java -jar /path/to/sqltool.jar mem # This will access the first urlid definition below in order to use a # personal Memory-Only database. # "url" values may, of course, contain JDBC connection properties, delimited # with semicolons. # As of revision 3347 of SqlFile, you can also connect to datasources defined # here from within an SqlTool session/file with the command "\j urlid". # You can use Java system property values in this file like this: ${user.home} # The only feature added recently is the optional "transiso" setting, # which may be set to an all-caps transaction isolation level as listed # in the Java API Spec for java.sql.Connection. # Windows users are advised to use forward slashes instead of reverse slashes, # and to avoid paths containing spaces or other funny characters. (This # recommendation applies to any Java app, not just SqlTool). # A personal Memory-Only (non-persistent) database. urlid mem url jdbc:hsqldb:mem:memdbid username SA password # A personal, local, persistent database. urlid personal url jdbc:hsqldb:file:${user.home}/db/personal;shutdown=true username SA password transiso TRANSACTION_READ_COMMITTED # When connecting directly to a file database like this, you should # use the shutdown connection property like this to shut down the DB # properly when you exit the JVM. # This is for a hsqldb Server running with default settings on your local # computer (and for which you have not changed the password for "SA"). urlid localhost-sa url jdbc:hsqldb:hsql://localhost username SA password # Template for a urlid for an Oracle database. # You will need to put the oracle.jdbc.OracleDriver class into your # classpath. # In the great majority of cases, you want to use the file classes12.zip # (which you can get from the directory $ORACLE_HOME/jdbc/lib of any # Oracle installation compatible with your server). # Since you need to add to the classpath, you can't invoke SqlTool with # the jar switch, like "java -jar .../sqltool.jar...". # Put both the SqlTool jar and classes12.zip in your classpath (and export!) # and run something like "java org.hsqldb.util.SqlTool...". #urlid cardiff2 #url jdbc:oracle:thin:@aegir.admc.com:1522:TRAFFIC_SID #username blaine #password secretpassword #driver oracle.jdbc.OracleDriver # Template for a TLS-encrypted HSQLDB Server. # Remember that the hostname in hsqls (and https) JDBC URLs must match the # CN of the server certificate (the port and instance alias that follows # are not part of the certificate at all). # You only need to set "truststore" if the server cert is not approved by # your system default truststore (which a commercial certificate probably # would be). #urlid tls #url jdbc:hsqldb:hsqls://db.admc.com:9001/lm2 #username BLAINE #password asecret #truststore ${user.home}/ca/db/db-trust.store # Template for a Postgresql database #urlid blainedb #url jdbc:postgresql://idun.africawork.org/blainedb #username blaine #password losung1 #driver org.postgresql.Driver # Template for a MySQL database. MySQL has poor JDBC support. #urlid mysql-testdb #url jdbc:mysql://hostname:3306/dbname #username root #password hiddenpwd #driver com.mysql.jdbc.Driver # Note that "databases" in SQL Server and Sybase are traditionally used for # the same purpose as "schemas" with more SQL-compliant databases. # Template for a Microsoft SQL Server database using Microsoft's Driver # (I find that the JTDS driver is much more responsive than Microsoft's). # OLDER JDBC Driver: #urlid msprojsvr #url jdbc:microsoft:sqlserver://hostname;DatabaseName=DbName;SelectMethod=Cursor # The SelectMethod setting is required to do more than one thing on a JDBC # session (I guess Microsoft thought nobody would really use Java for # anything other than a "hello world" program). # This is for Microsoft's SQL Server 2000 driver (requires mssqlserver.jar # and msutil.jar). #driver com.microsoft.jdbc.sqlserver.SQLServerDriver #username myuser #password hiddenpwd # Current 2011 JDBC Driver for Microsoft SQL Server: # Requires just the new sqljdbc4.jar. (Microsoft just loves back-slashes) #url jdbc:sqlserver://hostname\instanceName;DatabaseName=dbname #driver com.microsoft.jdbc.sqlserver.SQLServerDriver # Template for Microsoft SQL Server database using the JTDS Driver # http://jtds.sourceforge.net Jar file has name like "jtds-1.2.5.jar". #urlid nlyte #username myuser #password hiddenpwd #url jdbc:jtds:sqlserver://myhost/nlyte;instance=MSSQLSERVER #driver net.sourceforge.jtds.jdbc.Driver # Template for a Sybase database #urlid sybase #url jdbc:sybase:Tds:hostname:4100/dbname #username blaine #password hiddenpwd # This is for the jConnect driver (requires jconn3.jar). #driver com.sybase.jdbc3.jdbc.SybDriver # Template for Embedded Derby / Java DB. #urlid derby1 #url jdbc:derby:path/to/derby/directory;create=true #username ${user.name} #password any_noauthbydefault #driver org.apache.derby.jdbc.EmbeddedDriver # The embedded Derby driver requires derby.jar. # There'a also the org.apache.derby.jdbc.ClientDriver driver with URL # like jdbc:derby://[:]/databaseName, which requires # derbyclient.jar. # You can use \= to commit, since the Derby team decided (why???) # not to implement the SQL standard statement "commit"!! # Note that SqlTool can not shut down an embedded Derby database properly, # since that requires an additional SQL connection just for that purpose. # However, I've never lost data by not shutting it down properly. # Other than not supporting this quirk of Derby, SqlTool is miles ahead of ij. hsqldb2.2-2.2.9.orig/hsqldb/sample/StartupParameters.plist0000644000175000017500000000136312007547330022133 0ustar renerene/* $Id: StartupParameters.plist 59 2007-04-17 01:08:09Z unsaved $ Startup Item parameter file that works on at least one Mac OS X system. I don't know which of the "Uses" services are available on all Mac's. I just know that my system has them, and this list causes HSQLDB to start late enough without resorting to "Latest" (which could cause problems for people who also start up apps that use HSQLDB). */ { Description = "HSQLDB Database Server"; Provides = ("Hsqldb"); Requires = ("Resolver"); Uses = ("Disks", "Network", "Core Services", "TIM", "NetInfo", "Resolver"); Messages = { start = "Starting Hsqldb"; stop = "Stopping Hsqldb"; restart = "Restarting Hsqldb"; }; } hsqldb2.2-2.2.9.orig/hsqldb/sample/acl.txt0000644000175000017500000000225712007547332016675 0ustar renerene# $Id: acl.txt 536 2008-12-05 14:55:10Z unsaved $ # Sample HyperSQL Network Listener ACL file. # Specify "allow" and "deny" rules # For address specifications, individual addresses, host names, and # network addresses with /bit suffix are allowed, but read the caveat about # host names below, under the sample "localhost" rule. # Blank lines ignored. # Lines with # as the first non-whitespace character are ignored. allow 2001:db8::/32 # Allow this 32-bit ipv4 subnet allow localhost # You should use numerical addresses in ACL files, unless you are certain that # the name will always be known to your network address resolution system # (assume that you will lose Internet connectivity at some time). # With a default name resolution setup on UNIX, you are safe to use names # defined in your /etc/hosts file. deny 192.168.101.253 # Deny a single IP address. # In our example, 192.168.101.0/24 is our local, organizational network. # 192.168.101.253 is the IP address of our Intern's PC. # The Intern does not have permission to access our databases directly. allow 192.168.101.0/24 # Any ipv4 or ipv6 candidate address not matched above will be denied hsqldb2.2-2.2.9.orig/hsqldb/sample/csv-sample.sql0000644000175000017500000000352412007547332020166 0ustar renerene/* * $Id: csv-sample.sql 4810 2011-11-20 21:18:10Z unsaved $ * * Create a table, CVSV-export the data, import it back. */ * *DSV_COL_DELIM = , * *DSV_COL_SPLITTER = , -- Following causes a reject report to be written if there are any bad records -- during the import. To test it, enable the "FORCE AN ERROR" block below. * *DSV_REJECT_REPORT = import.html -- 1. SETTINGS -- For applications like MS Excel, which can't import or export nulls, we have -- to dummy down our database empty strings to export and import as if they -- were nulls. * *NULL_REP_TOKEN = -- Enable following line to quote every cell value -- * *ALL_QUOTED = true -- 2. SET UP TEST DATA CREATE TABLE t (i INT, v VARCHAR(25), d DATE); INSERT INTO t(i, v, d) VALUES (1, 'one two three', null); INSERT INTO t(i, v, d) VALUES (2, null, '2007-06-24'); INSERT INTO t(i, v, d) VALUES (3, 'one,two,,three', '2007-06-24'); INSERT INTO t(i, v, d) VALUES (4, '"one"two""three', '2007-06-24'); INSERT INTO t(i, v, d) VALUES (5, '"one,two"three,', '2007-06-24'); INSERT INTO t(i, v, d) VALUES (6, '', '2007-06-24'); commit; -- 3. CSV EXPORT /* Export */ \xq t /* FORCE AN ERROR. Enable the following 3 lines to force a bad CSV record. \o t.csv \p barf \o */ -- 4. BACK UP AND ZERO SOURCE TABLE CREATE TABLE orig AS (SELECT * FROM t) WITH DATA; DELETE FROM t; commit; -- 5. CSV IMPORT \mq t.csv commit; -- 6. MANUALLY EXAMINE DIFFERENCES BETWEEN SOURCE AND IMPORTED DATA. -- See /testrun/sqltool/csv-roundtrip.sql to see a way to make -- this same comparison programmatically. * - *NULL_REP_TOKEN \p \p ORIGINAL: SELECT * FROM orig; \p \p IMPORTED: SELECT * FROM t; \p \p The empty string in the source table will have been translated to null in \p the imported data. \p You can see that the generated CSV file represents both nulls and \p empty strings as nothing, hence the convergence. hsqldb2.2-2.2.9.orig/hsqldb/sample/sampledata.sql0000644000175000017500000010577412007547332020241 0ustar renerene/* * $Id: sampledata.sql 3348 2009-12-15 14:24:19Z unsaved $ * * Creates and populates database objects with sample data. * This file was created by grabbing the commands made by creating * sample data with the DatabaseManager utility. */ DROP TABLE Item IF EXISTS; DROP TABLE Invoice IF EXISTS; DROP TABLE Product IF EXISTS; DROP TABLE Customer IF EXISTS; CREATE TABLE Customer(ID INTEGER PRIMARY KEY,FirstName VARCHAR(20),LastName VARCHAR(30),Street VARCHAR(50),City VARCHAR(25)); CREATE TABLE Product(ID INTEGER PRIMARY KEY,Name VARCHAR(30),Price DECIMAL); CREATE TABLE Invoice(ID INTEGER PRIMARY KEY,CustomerID INTEGER,Total DECIMAL, FOREIGN KEY (CustomerId) REFERENCES Customer(ID) ON DELETE CASCADE); CREATE TABLE Item(InvoiceID INTEGER,Item INTEGER,ProductID INTEGER,Quantity INTEGER,Cost DECIMAL,PRIMARY KEY(InvoiceID,Item), FOREIGN KEY (InvoiceId) REFERENCES Invoice (ID) ON DELETE CASCADE, FOREIGN KEY (ProductId) REFERENCES Product(ID) ON DELETE CASCADE); INSERT INTO Customer VALUES(0,'Laura','Steel','429 Seventh Av.','Dallas'); INSERT INTO Product VALUES(0,'Iron Iron',54); INSERT INTO Customer VALUES(1,'Susanne','King','366 - 20th Ave.','Olten'); INSERT INTO Product VALUES(1,'Chair Shoe',248); INSERT INTO Customer VALUES(2,'Anne','Miller','20 Upland Pl.','Lyon'); INSERT INTO Product VALUES(2,'Telephone Clock',248); INSERT INTO Customer VALUES(3,'Michael','Clancy','542 Upland Pl.','San Francisco'); INSERT INTO Product VALUES(3,'Chair Chair',254); INSERT INTO Customer VALUES(4,'Sylvia','Ringer','365 College Av.','Dallas'); INSERT INTO Product VALUES(4,'Ice Tea Shoe',128); INSERT INTO Customer VALUES(5,'Laura','Miller','294 Seventh Av.','Paris'); INSERT INTO Product VALUES(5,'Clock Clock',236); INSERT INTO Customer VALUES(6,'Laura','White','506 Upland Pl.','Palo Alto'); INSERT INTO Product VALUES(6,'Ice Tea Chair',98); INSERT INTO Customer VALUES(7,'James','Peterson','231 Upland Pl.','San Francisco'); INSERT INTO Product VALUES(7,'Telephone Shoe',84); INSERT INTO Customer VALUES(8,'Andrew','Miller','288 - 20th Ave.','Seattle'); INSERT INTO Product VALUES(8,'Ice Tea Clock',226); INSERT INTO Customer VALUES(9,'James','Schneider','277 Seventh Av.','Berne'); INSERT INTO Product VALUES(9,'Clock Telephone',172); INSERT INTO Customer VALUES(10,'Anne','Fuller','135 Upland Pl.','Dallas'); INSERT INTO Product VALUES(10,'Telephone Ice Tea',204); INSERT INTO Customer VALUES(11,'Julia','White','412 Upland Pl.','Chicago'); INSERT INTO Product VALUES(11,'Telephone Iron',88); INSERT INTO Customer VALUES(12,'George','Ott','381 Upland Pl.','Palo Alto'); INSERT INTO Product VALUES(12,'Clock Ice Tea',168); INSERT INTO Customer VALUES(13,'Laura','Ringer','38 College Av.','New York'); INSERT INTO Product VALUES(13,'Telephone Clock',180); INSERT INTO Customer VALUES(14,'Bill','Karsen','53 College Av.','Oslo'); INSERT INTO Product VALUES(14,'Telephone Iron',124); INSERT INTO Customer VALUES(15,'Bill','Clancy','319 Upland Pl.','Seattle'); INSERT INTO Product VALUES(15,'Ice Tea Chair',94); INSERT INTO Customer VALUES(16,'John','Fuller','195 Seventh Av.','New York'); INSERT INTO Product VALUES(16,'Ice Tea Shoe',194); INSERT INTO Customer VALUES(17,'Laura','Ott','443 Seventh Av.','Lyon'); INSERT INTO Product VALUES(17,'Clock Ice Tea',220); INSERT INTO Customer VALUES(18,'Sylvia','Fuller','158 - 20th Ave.','Paris'); INSERT INTO Product VALUES(18,'Chair Clock',172); INSERT INTO Customer VALUES(19,'Susanne','Heiniger','86 - 20th Ave.','Dallas'); INSERT INTO Product VALUES(19,'Ice Tea Ice Tea',110); INSERT INTO Customer VALUES(20,'Janet','Schneider','309 - 20th Ave.','Oslo'); INSERT INTO Product VALUES(20,'Ice Tea Telephone',200); INSERT INTO Customer VALUES(21,'Julia','Clancy','18 Seventh Av.','Seattle'); INSERT INTO Product VALUES(21,'Chair Chair',114); INSERT INTO Customer VALUES(22,'Bill','Ott','250 - 20th Ave.','Berne'); INSERT INTO Product VALUES(22,'Iron Iron',66); INSERT INTO Customer VALUES(23,'Julia','Heiniger','358 College Av.','Boston'); INSERT INTO Product VALUES(23,'Shoe Chair',76); INSERT INTO Customer VALUES(24,'James','Sommer','333 Upland Pl.','Olten'); INSERT INTO Product VALUES(24,'Chair Shoe',72); INSERT INTO Customer VALUES(25,'Sylvia','Steel','269 College Av.','Paris'); INSERT INTO Product VALUES(25,'Shoe Shoe',162); INSERT INTO Customer VALUES(26,'James','Clancy','195 Upland Pl.','Oslo'); INSERT INTO Product VALUES(26,'Shoe Shoe',252); INSERT INTO Customer VALUES(27,'Bob','Sommer','509 College Av.','Seattle'); INSERT INTO Product VALUES(27,'Telephone Iron',230); INSERT INTO Customer VALUES(28,'Susanne','White','74 - 20th Ave.','Lyon'); INSERT INTO Product VALUES(28,'Clock Iron',30); INSERT INTO Customer VALUES(29,'Andrew','Smith','254 College Av.','New York'); INSERT INTO Product VALUES(29,'Chair Telephone',112); INSERT INTO Customer VALUES(30,'Bill','Sommer','362 - 20th Ave.','Olten'); INSERT INTO Product VALUES(30,'Shoe Iron',232); INSERT INTO Customer VALUES(31,'Bob','Ringer','371 College Av.','Olten'); INSERT INTO Product VALUES(31,'Ice Tea Telephone',48); INSERT INTO Customer VALUES(32,'Michael','Ott','339 College Av.','Boston'); INSERT INTO Product VALUES(32,'Clock Iron',190); INSERT INTO Customer VALUES(33,'Mary','King','491 College Av.','Oslo'); INSERT INTO Product VALUES(33,'Iron Chair',182); INSERT INTO Customer VALUES(34,'Julia','May','33 Upland Pl.','Seattle'); INSERT INTO Product VALUES(34,'Chair Iron',256); INSERT INTO Customer VALUES(35,'George','Karsen','412 College Av.','Chicago'); INSERT INTO Product VALUES(35,'Telephone Shoe',76); INSERT INTO Customer VALUES(36,'John','Steel','276 Upland Pl.','Dallas'); INSERT INTO Product VALUES(36,'Ice Tea Iron',32); INSERT INTO Customer VALUES(37,'Michael','Clancy','19 Seventh Av.','Dallas'); INSERT INTO Product VALUES(37,'Clock Shoe',94); INSERT INTO Customer VALUES(38,'Andrew','Heiniger','347 College Av.','Lyon'); INSERT INTO Product VALUES(38,'Clock Ice Tea',216); INSERT INTO Customer VALUES(39,'Mary','Karsen','202 College Av.','Chicago'); INSERT INTO Product VALUES(39,'Ice Tea Shoe',154); INSERT INTO Customer VALUES(40,'Susanne','Miller','440 - 20th Ave.','Dallas'); INSERT INTO Product VALUES(40,'Shoe Clock',28); INSERT INTO Customer VALUES(41,'Bill','King','546 College Av.','New York'); INSERT INTO Product VALUES(41,'Clock Ice Tea',206); INSERT INTO Customer VALUES(42,'Robert','Ott','503 Seventh Av.','Oslo'); INSERT INTO Product VALUES(42,'Iron Chair',198); INSERT INTO Customer VALUES(43,'Susanne','Smith','2 Upland Pl.','Dallas'); INSERT INTO Product VALUES(43,'Telephone Clock',94); INSERT INTO Customer VALUES(44,'Sylvia','Ott','361 College Av.','New York'); INSERT INTO Product VALUES(44,'Ice Tea Ice Tea',96); INSERT INTO Customer VALUES(45,'Janet','May','396 Seventh Av.','Oslo'); INSERT INTO Product VALUES(45,'Iron Ice Tea',180); INSERT INTO Customer VALUES(46,'Andrew','May','172 Seventh Av.','New York'); INSERT INTO Product VALUES(46,'Ice Tea Clock',62); INSERT INTO Customer VALUES(47,'Janet','Fuller','445 Upland Pl.','Dallas'); INSERT INTO Product VALUES(47,'Ice Tea Iron',178); INSERT INTO Customer VALUES(48,'Robert','White','549 Seventh Av.','San Francisco'); INSERT INTO Product VALUES(48,'Clock Clock',210); INSERT INTO Customer VALUES(49,'George','Fuller','534 - 20th Ave.','Olten'); INSERT INTO Product VALUES(49,'Iron Iron',22); INSERT INTO Invoice VALUES(0,0,0.0); INSERT INTO Invoice VALUES(1,33,0.0); INSERT INTO Invoice VALUES(2,23,0.0); INSERT INTO Invoice VALUES(3,21,0.0); INSERT INTO Invoice VALUES(4,30,0.0); INSERT INTO Invoice VALUES(5,34,0.0); INSERT INTO Invoice VALUES(6,19,0.0); INSERT INTO Invoice VALUES(7,26,0.0); INSERT INTO Invoice VALUES(8,29,0.0); INSERT INTO Invoice VALUES(9,38,0.0); INSERT INTO Invoice VALUES(10,24,0.0); INSERT INTO Invoice VALUES(11,24,0.0); INSERT INTO Invoice VALUES(12,23,0.0); INSERT INTO Invoice VALUES(13,39,0.0); INSERT INTO Invoice VALUES(14,35,0.0); INSERT INTO Invoice VALUES(15,39,0.0); INSERT INTO Invoice VALUES(16,45,0.0); INSERT INTO Invoice VALUES(17,46,0.0); INSERT INTO Invoice VALUES(18,4,0.0); INSERT INTO Invoice VALUES(19,9,0.0); INSERT INTO Invoice VALUES(20,19,0.0); INSERT INTO Invoice VALUES(21,8,0.0); INSERT INTO Invoice VALUES(22,40,0.0); INSERT INTO Invoice VALUES(23,36,0.0); INSERT INTO Invoice VALUES(24,15,0.0); INSERT INTO Invoice VALUES(25,31,0.0); INSERT INTO Invoice VALUES(26,27,0.0); INSERT INTO Invoice VALUES(27,24,0.0); INSERT INTO Invoice VALUES(28,35,0.0); INSERT INTO Invoice VALUES(29,46,0.0); INSERT INTO Invoice VALUES(30,13,0.0); INSERT INTO Invoice VALUES(31,22,0.0); INSERT INTO Invoice VALUES(32,20,0.0); INSERT INTO Invoice VALUES(33,40,0.0); INSERT INTO Invoice VALUES(34,33,0.0); INSERT INTO Invoice VALUES(35,4,0.0); INSERT INTO Invoice VALUES(36,42,0.0); INSERT INTO Invoice VALUES(37,39,0.0); INSERT INTO Invoice VALUES(38,46,0.0); INSERT INTO Invoice VALUES(39,5,0.0); INSERT INTO Invoice VALUES(40,4,0.0); INSERT INTO Invoice VALUES(41,19,0.0); INSERT INTO Invoice VALUES(42,38,0.0); INSERT INTO Invoice VALUES(43,13,0.0); INSERT INTO Invoice VALUES(44,32,0.0); INSERT INTO Invoice VALUES(45,42,0.0); INSERT INTO Invoice VALUES(46,24,0.0); INSERT INTO Invoice VALUES(47,45,0.0); INSERT INTO Invoice VALUES(48,22,0.0); INSERT INTO Invoice VALUES(49,32,0.0); INSERT INTO Item VALUES(0,12,1,11,1.5); INSERT INTO Item VALUES(0,11,12,4,1.5); INSERT INTO Item VALUES(0,10,4,8,1.5); INSERT INTO Item VALUES(0,9,35,4,1.5); INSERT INTO Item VALUES(0,8,0,23,1.5); INSERT INTO Item VALUES(0,7,7,10,1.5); INSERT INTO Item VALUES(0,6,16,9,1.5); INSERT INTO Item VALUES(0,5,12,15,1.5); INSERT INTO Item VALUES(0,4,47,1,1.5); INSERT INTO Item VALUES(0,3,1,9,1.5); INSERT INTO Item VALUES(0,2,47,3,1.5); INSERT INTO Item VALUES(0,1,14,19,1.5); INSERT INTO Item VALUES(0,0,7,12,1.5); INSERT INTO Item VALUES(1,6,25,19,1.5); INSERT INTO Item VALUES(1,5,25,9,1.5); INSERT INTO Item VALUES(1,4,16,16,1.5); INSERT INTO Item VALUES(1,3,38,8,1.5); INSERT INTO Item VALUES(1,2,19,6,1.5); INSERT INTO Item VALUES(1,1,0,9,1.5); INSERT INTO Item VALUES(1,0,40,8,1.5); INSERT INTO Item VALUES(2,16,36,24,1.5); INSERT INTO Item VALUES(2,15,0,18,1.5); INSERT INTO Item VALUES(2,14,48,19,1.5); INSERT INTO Item VALUES(2,13,12,1,1.5); INSERT INTO Item VALUES(2,12,21,15,1.5); INSERT INTO Item VALUES(2,11,42,21,1.5); INSERT INTO Item VALUES(2,10,49,11,1.5); INSERT INTO Item VALUES(2,9,18,7,1.5); INSERT INTO Item VALUES(2,8,39,2,1.5); INSERT INTO Item VALUES(2,7,30,5,1.5); INSERT INTO Item VALUES(2,6,43,8,1.5); INSERT INTO Item VALUES(2,5,30,4,1.5); INSERT INTO Item VALUES(2,4,38,18,1.5); INSERT INTO Item VALUES(2,3,19,13,1.5); INSERT INTO Item VALUES(2,2,11,9,1.5); INSERT INTO Item VALUES(2,1,25,3,1.5); INSERT INTO Item VALUES(2,0,4,18,1.5); INSERT INTO Item VALUES(3,17,30,17,1.5); INSERT INTO Item VALUES(3,16,19,11,1.5); INSERT INTO Item VALUES(3,15,23,18,1.5); INSERT INTO Item VALUES(3,14,17,22,1.5); INSERT INTO Item VALUES(3,13,41,2,1.5); INSERT INTO Item VALUES(3,12,41,22,1.5); INSERT INTO Item VALUES(3,11,7,11,1.5); INSERT INTO Item VALUES(3,10,10,17,1.5); INSERT INTO Item VALUES(3,9,29,17,1.5); INSERT INTO Item VALUES(3,8,49,9,1.5); INSERT INTO Item VALUES(3,7,26,4,1.5); INSERT INTO Item VALUES(3,6,13,18,1.5); INSERT INTO Item VALUES(3,5,30,10,1.5); INSERT INTO Item VALUES(3,4,20,12,1.5); INSERT INTO Item VALUES(3,3,0,22,1.5); INSERT INTO Item VALUES(3,2,49,3,1.5); INSERT INTO Item VALUES(3,1,1,20,1.5); INSERT INTO Item VALUES(3,0,11,21,1.5); INSERT INTO Item VALUES(4,5,37,24,1.5); INSERT INTO Item VALUES(4,4,9,18,1.5); INSERT INTO Item VALUES(4,3,23,20,1.5); INSERT INTO Item VALUES(4,2,41,23,1.5); INSERT INTO Item VALUES(4,1,35,15,1.5); INSERT INTO Item VALUES(4,0,28,9,1.5); INSERT INTO Item VALUES(5,13,18,17,1.5); INSERT INTO Item VALUES(5,12,8,15,1.5); INSERT INTO Item VALUES(5,11,38,23,1.5); INSERT INTO Item VALUES(5,10,28,18,1.5); INSERT INTO Item VALUES(5,9,37,9,1.5); INSERT INTO Item VALUES(5,8,20,3,1.5); INSERT INTO Item VALUES(5,7,2,4,1.5); INSERT INTO Item VALUES(5,6,7,9,1.5); INSERT INTO Item VALUES(5,5,46,15,1.5); INSERT INTO Item VALUES(5,4,32,14,1.5); INSERT INTO Item VALUES(5,3,24,12,1.5); INSERT INTO Item VALUES(5,2,20,18,1.5); INSERT INTO Item VALUES(5,1,9,23,1.5); INSERT INTO Item VALUES(5,0,9,5,1.5); INSERT INTO Item VALUES(6,11,44,1,1.5); INSERT INTO Item VALUES(6,10,16,13,1.5); INSERT INTO Item VALUES(6,9,19,2,1.5); INSERT INTO Item VALUES(6,8,41,19,1.5); INSERT INTO Item VALUES(6,7,26,10,1.5); INSERT INTO Item VALUES(6,6,37,22,1.5); INSERT INTO Item VALUES(6,5,14,20,1.5); INSERT INTO Item VALUES(6,4,31,20,1.5); INSERT INTO Item VALUES(6,3,30,2,1.5); INSERT INTO Item VALUES(6,2,23,8,1.5); INSERT INTO Item VALUES(6,1,38,21,1.5); INSERT INTO Item VALUES(6,0,15,20,1.5); INSERT INTO Item VALUES(7,18,23,5,1.5); INSERT INTO Item VALUES(7,17,40,1,1.5); INSERT INTO Item VALUES(7,16,7,12,1.5); INSERT INTO Item VALUES(7,15,24,17,1.5); INSERT INTO Item VALUES(7,14,47,14,1.5); INSERT INTO Item VALUES(7,13,32,23,1.5); INSERT INTO Item VALUES(7,12,40,16,1.5); INSERT INTO Item VALUES(7,11,19,13,1.5); INSERT INTO Item VALUES(7,10,7,1,1.5); INSERT INTO Item VALUES(7,9,9,21,1.5); INSERT INTO Item VALUES(7,8,42,19,1.5); INSERT INTO Item VALUES(7,7,2,22,1.5); INSERT INTO Item VALUES(7,6,14,4,1.5); INSERT INTO Item VALUES(7,5,24,10,1.5); INSERT INTO Item VALUES(7,4,2,13,1.5); INSERT INTO Item VALUES(7,3,30,2,1.5); INSERT INTO Item VALUES(7,2,27,17,1.5); INSERT INTO Item VALUES(7,1,23,12,1.5); INSERT INTO Item VALUES(7,0,43,16,1.5); INSERT INTO Item VALUES(8,9,21,23,1.5); INSERT INTO Item VALUES(8,8,38,7,1.5); INSERT INTO Item VALUES(8,7,6,5,1.5); INSERT INTO Item VALUES(8,6,15,19,1.5); INSERT INTO Item VALUES(8,5,24,18,1.5); INSERT INTO Item VALUES(8,4,15,8,1.5); INSERT INTO Item VALUES(8,3,41,16,1.5); INSERT INTO Item VALUES(8,2,11,8,1.5); INSERT INTO Item VALUES(8,1,44,16,1.5); INSERT INTO Item VALUES(8,0,34,15,1.5); INSERT INTO Item VALUES(9,19,48,23,1.5); INSERT INTO Item VALUES(9,18,3,12,1.5); INSERT INTO Item VALUES(9,17,13,17,1.5); INSERT INTO Item VALUES(9,16,24,10,1.5); INSERT INTO Item VALUES(9,15,48,23,1.5); INSERT INTO Item VALUES(9,14,15,8,1.5); INSERT INTO Item VALUES(9,13,42,13,1.5); INSERT INTO Item VALUES(9,12,25,23,1.5); INSERT INTO Item VALUES(9,11,12,16,1.5); INSERT INTO Item VALUES(9,10,38,11,1.5); INSERT INTO Item VALUES(9,9,13,6,1.5); INSERT INTO Item VALUES(9,8,24,11,1.5); INSERT INTO Item VALUES(9,7,2,22,1.5); INSERT INTO Item VALUES(9,6,18,10,1.5); INSERT INTO Item VALUES(9,5,6,2,1.5); INSERT INTO Item VALUES(9,4,36,16,1.5); INSERT INTO Item VALUES(9,3,4,14,1.5); INSERT INTO Item VALUES(9,2,29,12,1.5); INSERT INTO Item VALUES(9,1,18,21,1.5); INSERT INTO Item VALUES(9,0,45,8,1.5); INSERT INTO Item VALUES(10,9,5,10,1.5); INSERT INTO Item VALUES(10,8,22,11,1.5); INSERT INTO Item VALUES(10,7,4,13,1.5); INSERT INTO Item VALUES(10,6,18,14,1.5); INSERT INTO Item VALUES(10,5,5,24,1.5); INSERT INTO Item VALUES(10,4,10,24,1.5); INSERT INTO Item VALUES(10,3,46,1,1.5); INSERT INTO Item VALUES(10,2,7,9,1.5); INSERT INTO Item VALUES(10,1,33,17,1.5); INSERT INTO Item VALUES(10,0,20,1,1.5); INSERT INTO Item VALUES(11,8,20,1,1.5); INSERT INTO Item VALUES(11,7,48,22,1.5); INSERT INTO Item VALUES(11,6,0,12,1.5); INSERT INTO Item VALUES(11,5,19,2,1.5); INSERT INTO Item VALUES(11,4,47,16,1.5); INSERT INTO Item VALUES(11,3,32,21,1.5); INSERT INTO Item VALUES(11,2,0,3,1.5); INSERT INTO Item VALUES(11,1,21,21,1.5); INSERT INTO Item VALUES(11,0,45,10,1.5); INSERT INTO Item VALUES(12,18,9,4,1.5); INSERT INTO Item VALUES(12,17,31,15,1.5); INSERT INTO Item VALUES(12,16,0,9,1.5); INSERT INTO Item VALUES(12,15,22,16,1.5); INSERT INTO Item VALUES(12,14,25,11,1.5); INSERT INTO Item VALUES(12,13,36,21,1.5); INSERT INTO Item VALUES(12,12,13,12,1.5); INSERT INTO Item VALUES(12,11,28,16,1.5); INSERT INTO Item VALUES(12,10,46,19,1.5); INSERT INTO Item VALUES(12,9,25,22,1.5); INSERT INTO Item VALUES(12,8,48,2,1.5); INSERT INTO Item VALUES(12,7,48,7,1.5); INSERT INTO Item VALUES(12,6,31,15,1.5); INSERT INTO Item VALUES(12,5,37,17,1.5); INSERT INTO Item VALUES(12,4,20,11,1.5); INSERT INTO Item VALUES(12,3,0,18,1.5); INSERT INTO Item VALUES(12,2,6,5,1.5); INSERT INTO Item VALUES(12,1,41,19,1.5); INSERT INTO Item VALUES(12,0,1,24,1.5); INSERT INTO Item VALUES(13,21,40,1,1.5); INSERT INTO Item VALUES(13,20,5,19,1.5); INSERT INTO Item VALUES(13,19,42,18,1.5); INSERT INTO Item VALUES(13,18,0,16,1.5); INSERT INTO Item VALUES(13,17,32,18,1.5); INSERT INTO Item VALUES(13,16,22,23,1.5); INSERT INTO Item VALUES(13,15,0,20,1.5); INSERT INTO Item VALUES(13,14,1,12,1.5); INSERT INTO Item VALUES(13,13,10,20,1.5); INSERT INTO Item VALUES(13,12,17,3,1.5); INSERT INTO Item VALUES(13,11,14,3,1.5); INSERT INTO Item VALUES(13,10,45,24,1.5); INSERT INTO Item VALUES(13,9,24,10,1.5); INSERT INTO Item VALUES(13,8,48,11,1.5); INSERT INTO Item VALUES(13,7,29,24,1.5); INSERT INTO Item VALUES(13,6,19,8,1.5); INSERT INTO Item VALUES(13,5,22,19,1.5); INSERT INTO Item VALUES(13,4,26,21,1.5); INSERT INTO Item VALUES(13,3,32,2,1.5); INSERT INTO Item VALUES(13,2,13,20,1.5); INSERT INTO Item VALUES(13,1,1,1,1.5); INSERT INTO Item VALUES(13,0,16,10,1.5); INSERT INTO Item VALUES(14,13,11,23,1.5); INSERT INTO Item VALUES(14,12,4,20,1.5); INSERT INTO Item VALUES(14,11,25,15,1.5); INSERT INTO Item VALUES(14,10,44,16,1.5); INSERT INTO Item VALUES(14,9,13,16,1.5); INSERT INTO Item VALUES(14,8,23,7,1.5); INSERT INTO Item VALUES(14,7,43,4,1.5); INSERT INTO Item VALUES(14,6,26,18,1.5); INSERT INTO Item VALUES(14,5,11,8,1.5); INSERT INTO Item VALUES(14,4,41,17,1.5); INSERT INTO Item VALUES(14,3,34,11,1.5); INSERT INTO Item VALUES(14,2,15,18,1.5); INSERT INTO Item VALUES(14,1,9,22,1.5); INSERT INTO Item VALUES(14,0,42,18,1.5); INSERT INTO Item VALUES(15,2,24,6,1.5); INSERT INTO Item VALUES(15,1,13,21,1.5); INSERT INTO Item VALUES(15,0,17,12,1.5); INSERT INTO Item VALUES(16,15,12,3,1.5); INSERT INTO Item VALUES(16,14,0,19,1.5); INSERT INTO Item VALUES(16,13,20,1,1.5); INSERT INTO Item VALUES(16,12,18,2,1.5); INSERT INTO Item VALUES(16,11,24,7,1.5); INSERT INTO Item VALUES(16,10,43,8,1.5); INSERT INTO Item VALUES(16,9,11,10,1.5); INSERT INTO Item VALUES(16,8,13,17,1.5); INSERT INTO Item VALUES(16,7,8,17,1.5); INSERT INTO Item VALUES(16,6,44,7,1.5); INSERT INTO Item VALUES(16,5,11,15,1.5); INSERT INTO Item VALUES(16,4,10,24,1.5); INSERT INTO Item VALUES(16,3,0,3,1.5); INSERT INTO Item VALUES(16,2,20,15,1.5); INSERT INTO Item VALUES(16,1,36,20,1.5); INSERT INTO Item VALUES(16,0,18,15,1.5); INSERT INTO Item VALUES(17,19,46,12,1.5); INSERT INTO Item VALUES(17,18,5,9,1.5); INSERT INTO Item VALUES(17,17,7,5,1.5); INSERT INTO Item VALUES(17,16,8,16,1.5); INSERT INTO Item VALUES(17,15,35,10,1.5); INSERT INTO Item VALUES(17,14,18,2,1.5); INSERT INTO Item VALUES(17,13,41,5,1.5); INSERT INTO Item VALUES(17,12,22,16,1.5); INSERT INTO Item VALUES(17,11,45,10,1.5); INSERT INTO Item VALUES(17,10,10,12,1.5); INSERT INTO Item VALUES(17,9,8,15,1.5); INSERT INTO Item VALUES(17,8,49,8,1.5); INSERT INTO Item VALUES(17,7,6,15,1.5); INSERT INTO Item VALUES(17,6,43,6,1.5); INSERT INTO Item VALUES(17,5,44,1,1.5); INSERT INTO Item VALUES(17,4,23,2,1.5); INSERT INTO Item VALUES(17,3,24,4,1.5); INSERT INTO Item VALUES(17,2,44,11,1.5); INSERT INTO Item VALUES(17,1,19,19,1.5); INSERT INTO Item VALUES(17,0,16,8,1.5); INSERT INTO Item VALUES(18,18,10,1,1.5); INSERT INTO Item VALUES(18,17,8,1,1.5); INSERT INTO Item VALUES(18,16,31,12,1.5); INSERT INTO Item VALUES(18,15,44,20,1.5); INSERT INTO Item VALUES(18,14,28,20,1.5); INSERT INTO Item VALUES(18,13,14,12,1.5); INSERT INTO Item VALUES(18,12,37,12,1.5); INSERT INTO Item VALUES(18,11,30,8,1.5); INSERT INTO Item VALUES(18,10,34,18,1.5); INSERT INTO Item VALUES(18,9,2,2,1.5); INSERT INTO Item VALUES(18,8,1,24,1.5); INSERT INTO Item VALUES(18,7,15,14,1.5); INSERT INTO Item VALUES(18,6,29,4,1.5); INSERT INTO Item VALUES(18,5,15,6,1.5); INSERT INTO Item VALUES(18,4,28,6,1.5); INSERT INTO Item VALUES(18,3,19,8,1.5); INSERT INTO Item VALUES(18,2,40,12,1.5); INSERT INTO Item VALUES(18,1,33,12,1.5); INSERT INTO Item VALUES(18,0,32,1,1.5); INSERT INTO Item VALUES(19,4,36,24,1.5); INSERT INTO Item VALUES(19,3,49,23,1.5); INSERT INTO Item VALUES(19,2,4,22,1.5); INSERT INTO Item VALUES(19,1,31,2,1.5); INSERT INTO Item VALUES(19,0,12,7,1.5); INSERT INTO Item VALUES(20,11,15,8,1.5); INSERT INTO Item VALUES(20,10,25,11,1.5); INSERT INTO Item VALUES(20,9,12,8,1.5); INSERT INTO Item VALUES(20,8,44,18,1.5); INSERT INTO Item VALUES(20,7,9,9,1.5); INSERT INTO Item VALUES(20,6,20,2,1.5); INSERT INTO Item VALUES(20,5,8,14,1.5); INSERT INTO Item VALUES(20,4,30,13,1.5); INSERT INTO Item VALUES(20,3,25,14,1.5); INSERT INTO Item VALUES(20,2,24,22,1.5); INSERT INTO Item VALUES(20,1,29,6,1.5); INSERT INTO Item VALUES(20,0,47,15,1.5); INSERT INTO Item VALUES(21,11,20,11,1.5); INSERT INTO Item VALUES(21,10,19,14,1.5); INSERT INTO Item VALUES(21,9,35,17,1.5); INSERT INTO Item VALUES(21,8,44,19,1.5); INSERT INTO Item VALUES(21,7,8,9,1.5); INSERT INTO Item VALUES(21,6,26,7,1.5); INSERT INTO Item VALUES(21,5,27,18,1.5); INSERT INTO Item VALUES(21,4,49,22,1.5); INSERT INTO Item VALUES(21,3,30,13,1.5); INSERT INTO Item VALUES(21,2,31,17,1.5); INSERT INTO Item VALUES(21,1,38,19,1.5); INSERT INTO Item VALUES(21,0,9,10,1.5); INSERT INTO Item VALUES(22,9,23,1,1.5); INSERT INTO Item VALUES(22,8,3,2,1.5); INSERT INTO Item VALUES(22,7,21,6,1.5); INSERT INTO Item VALUES(22,6,4,11,1.5); INSERT INTO Item VALUES(22,5,24,5,1.5); INSERT INTO Item VALUES(22,4,5,21,1.5); INSERT INTO Item VALUES(22,3,22,5,1.5); INSERT INTO Item VALUES(22,2,12,20,1.5); INSERT INTO Item VALUES(22,1,30,11,1.5); INSERT INTO Item VALUES(22,0,9,6,1.5); INSERT INTO Item VALUES(23,16,8,11,1.5); INSERT INTO Item VALUES(23,15,13,17,1.5); INSERT INTO Item VALUES(23,14,44,2,1.5); INSERT INTO Item VALUES(23,13,14,17,1.5); INSERT INTO Item VALUES(23,12,4,17,1.5); INSERT INTO Item VALUES(23,11,41,8,1.5); INSERT INTO Item VALUES(23,10,4,18,1.5); INSERT INTO Item VALUES(23,9,20,18,1.5); INSERT INTO Item VALUES(23,8,6,17,1.5); INSERT INTO Item VALUES(23,7,39,3,1.5); INSERT INTO Item VALUES(23,6,16,1,1.5); INSERT INTO Item VALUES(23,5,32,14,1.5); INSERT INTO Item VALUES(23,4,23,19,1.5); INSERT INTO Item VALUES(23,3,40,19,1.5); INSERT INTO Item VALUES(23,2,33,18,1.5); INSERT INTO Item VALUES(23,1,26,8,1.5); INSERT INTO Item VALUES(23,0,48,22,1.5); INSERT INTO Item VALUES(24,15,39,17,1.5); INSERT INTO Item VALUES(24,14,1,13,1.5); INSERT INTO Item VALUES(24,13,15,21,1.5); INSERT INTO Item VALUES(24,12,0,8,1.5); INSERT INTO Item VALUES(24,11,1,4,1.5); INSERT INTO Item VALUES(24,10,27,4,1.5); INSERT INTO Item VALUES(24,9,21,8,1.5); INSERT INTO Item VALUES(24,8,5,18,1.5); INSERT INTO Item VALUES(24,7,7,13,1.5); INSERT INTO Item VALUES(24,6,40,3,1.5); INSERT INTO Item VALUES(24,5,35,16,1.5); INSERT INTO Item VALUES(24,4,15,17,1.5); INSERT INTO Item VALUES(24,3,17,23,1.5); INSERT INTO Item VALUES(24,2,38,10,1.5); INSERT INTO Item VALUES(24,1,46,18,1.5); INSERT INTO Item VALUES(24,0,43,14,1.5); INSERT INTO Item VALUES(25,8,38,3,1.5); INSERT INTO Item VALUES(25,7,16,8,1.5); INSERT INTO Item VALUES(25,6,21,18,1.5); INSERT INTO Item VALUES(25,5,10,5,1.5); INSERT INTO Item VALUES(25,4,47,10,1.5); INSERT INTO Item VALUES(25,3,19,4,1.5); INSERT INTO Item VALUES(25,2,13,8,1.5); INSERT INTO Item VALUES(25,1,43,13,1.5); INSERT INTO Item VALUES(25,0,5,15,1.5); INSERT INTO Item VALUES(26,16,30,4,1.5); INSERT INTO Item VALUES(26,15,8,6,1.5); INSERT INTO Item VALUES(26,14,26,6,1.5); INSERT INTO Item VALUES(26,13,13,10,1.5); INSERT INTO Item VALUES(26,12,27,20,1.5); INSERT INTO Item VALUES(26,11,18,3,1.5); INSERT INTO Item VALUES(26,10,34,16,1.5); INSERT INTO Item VALUES(26,9,1,23,1.5); INSERT INTO Item VALUES(26,8,40,13,1.5); INSERT INTO Item VALUES(26,7,4,16,1.5); INSERT INTO Item VALUES(26,6,7,23,1.5); INSERT INTO Item VALUES(26,5,38,4,1.5); INSERT INTO Item VALUES(26,4,46,7,1.5); INSERT INTO Item VALUES(26,3,16,3,1.5); INSERT INTO Item VALUES(26,2,33,7,1.5); INSERT INTO Item VALUES(26,1,43,21,1.5); INSERT INTO Item VALUES(26,0,42,16,1.5); INSERT INTO Item VALUES(27,2,19,1,1.5); INSERT INTO Item VALUES(27,1,45,15,1.5); INSERT INTO Item VALUES(27,0,24,15,1.5); INSERT INTO Item VALUES(28,8,28,6,1.5); INSERT INTO Item VALUES(28,7,28,8,1.5); INSERT INTO Item VALUES(28,6,33,16,1.5); INSERT INTO Item VALUES(28,5,49,4,1.5); INSERT INTO Item VALUES(28,4,45,17,1.5); INSERT INTO Item VALUES(28,3,6,3,1.5); INSERT INTO Item VALUES(28,2,44,22,1.5); INSERT INTO Item VALUES(28,1,15,13,1.5); INSERT INTO Item VALUES(28,0,35,13,1.5); INSERT INTO Item VALUES(29,8,35,6,1.5); INSERT INTO Item VALUES(29,7,5,1,1.5); INSERT INTO Item VALUES(29,6,4,16,1.5); INSERT INTO Item VALUES(29,5,31,13,1.5); INSERT INTO Item VALUES(29,4,4,7,1.5); INSERT INTO Item VALUES(29,3,7,21,1.5); INSERT INTO Item VALUES(29,2,17,23,1.5); INSERT INTO Item VALUES(29,1,38,12,1.5); INSERT INTO Item VALUES(29,0,33,17,1.5); INSERT INTO Item VALUES(30,6,14,23,1.5); INSERT INTO Item VALUES(30,5,43,23,1.5); INSERT INTO Item VALUES(30,4,34,2,1.5); INSERT INTO Item VALUES(30,3,33,2,1.5); INSERT INTO Item VALUES(30,2,10,18,1.5); INSERT INTO Item VALUES(30,1,16,19,1.5); INSERT INTO Item VALUES(30,0,14,7,1.5); INSERT INTO Item VALUES(31,10,0,3,1.5); INSERT INTO Item VALUES(31,9,14,15,1.5); INSERT INTO Item VALUES(31,8,7,5,1.5); INSERT INTO Item VALUES(31,7,38,3,1.5); INSERT INTO Item VALUES(31,6,26,16,1.5); INSERT INTO Item VALUES(31,5,1,4,1.5); INSERT INTO Item VALUES(31,4,8,14,1.5); INSERT INTO Item VALUES(31,3,12,10,1.5); INSERT INTO Item VALUES(31,2,4,3,1.5); INSERT INTO Item VALUES(31,1,4,23,1.5); INSERT INTO Item VALUES(31,0,33,10,1.5); INSERT INTO Item VALUES(32,2,1,14,1.5); INSERT INTO Item VALUES(32,1,30,13,1.5); INSERT INTO Item VALUES(32,0,35,11,1.5); INSERT INTO Item VALUES(33,15,38,7,1.5); INSERT INTO Item VALUES(33,14,44,13,1.5); INSERT INTO Item VALUES(33,13,25,16,1.5); INSERT INTO Item VALUES(33,12,16,23,1.5); INSERT INTO Item VALUES(33,11,5,7,1.5); INSERT INTO Item VALUES(33,10,24,9,1.5); INSERT INTO Item VALUES(33,9,29,5,1.5); INSERT INTO Item VALUES(33,8,3,15,1.5); INSERT INTO Item VALUES(33,7,43,10,1.5); INSERT INTO Item VALUES(33,6,17,16,1.5); INSERT INTO Item VALUES(33,5,8,11,1.5); INSERT INTO Item VALUES(33,4,24,1,1.5); INSERT INTO Item VALUES(33,3,48,1,1.5); INSERT INTO Item VALUES(33,2,36,16,1.5); INSERT INTO Item VALUES(33,1,10,21,1.5); INSERT INTO Item VALUES(33,0,36,5,1.5); INSERT INTO Item VALUES(34,14,46,7,1.5); INSERT INTO Item VALUES(34,13,30,14,1.5); INSERT INTO Item VALUES(34,12,43,21,1.5); INSERT INTO Item VALUES(34,11,4,17,1.5); INSERT INTO Item VALUES(34,10,41,16,1.5); INSERT INTO Item VALUES(34,9,8,17,1.5); INSERT INTO Item VALUES(34,8,3,1,1.5); INSERT INTO Item VALUES(34,7,21,22,1.5); INSERT INTO Item VALUES(34,6,32,7,1.5); INSERT INTO Item VALUES(34,5,45,13,1.5); INSERT INTO Item VALUES(34,4,27,1,1.5); INSERT INTO Item VALUES(34,3,44,15,1.5); INSERT INTO Item VALUES(34,2,28,22,1.5); INSERT INTO Item VALUES(34,1,4,3,1.5); INSERT INTO Item VALUES(34,0,10,22,1.5); INSERT INTO Item VALUES(35,13,19,17,1.5); INSERT INTO Item VALUES(35,12,7,23,1.5); INSERT INTO Item VALUES(35,11,44,9,1.5); INSERT INTO Item VALUES(35,10,17,11,1.5); INSERT INTO Item VALUES(35,9,19,1,1.5); INSERT INTO Item VALUES(35,8,0,1,1.5); INSERT INTO Item VALUES(35,7,22,15,1.5); INSERT INTO Item VALUES(35,6,5,4,1.5); INSERT INTO Item VALUES(35,5,33,5,1.5); INSERT INTO Item VALUES(35,4,14,17,1.5); INSERT INTO Item VALUES(35,3,27,10,1.5); INSERT INTO Item VALUES(35,2,14,4,1.5); INSERT INTO Item VALUES(35,1,3,9,1.5); INSERT INTO Item VALUES(35,0,20,17,1.5); INSERT INTO Item VALUES(36,11,44,9,1.5); INSERT INTO Item VALUES(36,10,47,11,1.5); INSERT INTO Item VALUES(36,9,31,18,1.5); INSERT INTO Item VALUES(36,8,4,21,1.5); INSERT INTO Item VALUES(36,7,39,19,1.5); INSERT INTO Item VALUES(36,6,39,20,1.5); INSERT INTO Item VALUES(36,5,25,8,1.5); INSERT INTO Item VALUES(36,4,40,5,1.5); INSERT INTO Item VALUES(36,3,10,8,1.5); INSERT INTO Item VALUES(36,2,1,6,1.5); INSERT INTO Item VALUES(36,1,15,23,1.5); INSERT INTO Item VALUES(36,0,18,13,1.5); INSERT INTO Item VALUES(37,21,6,9,1.5); INSERT INTO Item VALUES(37,20,14,1,1.5); INSERT INTO Item VALUES(37,19,19,20,1.5); INSERT INTO Item VALUES(37,18,26,22,1.5); INSERT INTO Item VALUES(37,17,38,18,1.5); INSERT INTO Item VALUES(37,16,27,8,1.5); INSERT INTO Item VALUES(37,15,32,12,1.5); INSERT INTO Item VALUES(37,14,12,3,1.5); INSERT INTO Item VALUES(37,13,32,3,1.5); INSERT INTO Item VALUES(37,12,24,23,1.5); INSERT INTO Item VALUES(37,11,30,5,1.5); INSERT INTO Item VALUES(37,10,1,18,1.5); INSERT INTO Item VALUES(37,9,47,16,1.5); INSERT INTO Item VALUES(37,8,46,9,1.5); INSERT INTO Item VALUES(37,7,24,19,1.5); INSERT INTO Item VALUES(37,6,34,12,1.5); INSERT INTO Item VALUES(37,5,1,14,1.5); INSERT INTO Item VALUES(37,4,13,20,1.5); INSERT INTO Item VALUES(37,3,26,7,1.5); INSERT INTO Item VALUES(37,2,36,8,1.5); INSERT INTO Item VALUES(37,1,15,20,1.5); INSERT INTO Item VALUES(37,0,41,24,1.5); INSERT INTO Item VALUES(38,19,4,7,1.5); INSERT INTO Item VALUES(38,18,28,20,1.5); INSERT INTO Item VALUES(38,17,32,4,1.5); INSERT INTO Item VALUES(38,16,40,18,1.5); INSERT INTO Item VALUES(38,15,47,10,1.5); INSERT INTO Item VALUES(38,14,20,7,1.5); INSERT INTO Item VALUES(38,13,8,7,1.5); INSERT INTO Item VALUES(38,12,1,18,1.5); INSERT INTO Item VALUES(38,11,19,18,1.5); INSERT INTO Item VALUES(38,10,4,18,1.5); INSERT INTO Item VALUES(38,9,27,20,1.5); INSERT INTO Item VALUES(38,8,40,10,1.5); INSERT INTO Item VALUES(38,7,15,1,1.5); INSERT INTO Item VALUES(38,6,5,19,1.5); INSERT INTO Item VALUES(38,5,48,17,1.5); INSERT INTO Item VALUES(38,4,45,14,1.5); INSERT INTO Item VALUES(38,3,27,19,1.5); INSERT INTO Item VALUES(38,2,4,8,1.5); INSERT INTO Item VALUES(38,1,45,13,1.5); INSERT INTO Item VALUES(38,0,48,14,1.5); INSERT INTO Item VALUES(39,3,20,17,1.5); INSERT INTO Item VALUES(39,2,39,16,1.5); INSERT INTO Item VALUES(39,1,24,6,1.5); INSERT INTO Item VALUES(39,0,10,12,1.5); INSERT INTO Item VALUES(40,20,4,16,1.5); INSERT INTO Item VALUES(40,19,7,23,1.5); INSERT INTO Item VALUES(40,18,33,11,1.5); INSERT INTO Item VALUES(40,17,4,20,1.5); INSERT INTO Item VALUES(40,16,27,16,1.5); INSERT INTO Item VALUES(40,15,22,12,1.5); INSERT INTO Item VALUES(40,14,4,24,1.5); INSERT INTO Item VALUES(40,13,6,8,1.5); INSERT INTO Item VALUES(40,12,35,13,1.5); INSERT INTO Item VALUES(40,11,27,2,1.5); INSERT INTO Item VALUES(40,10,6,11,1.5); INSERT INTO Item VALUES(40,9,40,17,1.5); INSERT INTO Item VALUES(40,8,11,4,1.5); INSERT INTO Item VALUES(40,7,31,1,1.5); INSERT INTO Item VALUES(40,6,28,12,1.5); INSERT INTO Item VALUES(40,5,32,18,1.5); INSERT INTO Item VALUES(40,4,18,13,1.5); INSERT INTO Item VALUES(40,3,26,10,1.5); INSERT INTO Item VALUES(40,2,4,5,1.5); INSERT INTO Item VALUES(40,1,45,24,1.5); INSERT INTO Item VALUES(40,0,46,24,1.5); INSERT INTO Item VALUES(41,11,48,15,1.5); INSERT INTO Item VALUES(41,10,24,20,1.5); INSERT INTO Item VALUES(41,9,26,21,1.5); INSERT INTO Item VALUES(41,8,9,22,1.5); INSERT INTO Item VALUES(41,7,22,18,1.5); INSERT INTO Item VALUES(41,6,17,11,1.5); INSERT INTO Item VALUES(41,5,9,21,1.5); INSERT INTO Item VALUES(41,4,16,22,1.5); INSERT INTO Item VALUES(41,3,29,20,1.5); INSERT INTO Item VALUES(41,2,36,2,1.5); INSERT INTO Item VALUES(41,1,47,19,1.5); INSERT INTO Item VALUES(41,0,5,24,1.5); INSERT INTO Item VALUES(42,4,48,15,1.5); INSERT INTO Item VALUES(42,3,40,14,1.5); INSERT INTO Item VALUES(42,2,40,19,1.5); INSERT INTO Item VALUES(42,1,18,21,1.5); INSERT INTO Item VALUES(42,0,48,9,1.5); INSERT INTO Item VALUES(43,16,38,12,1.5); INSERT INTO Item VALUES(43,15,48,7,1.5); INSERT INTO Item VALUES(43,14,3,18,1.5); INSERT INTO Item VALUES(43,13,44,22,1.5); INSERT INTO Item VALUES(43,12,40,24,1.5); INSERT INTO Item VALUES(43,11,49,23,1.5); INSERT INTO Item VALUES(43,10,35,1,1.5); INSERT INTO Item VALUES(43,9,7,23,1.5); INSERT INTO Item VALUES(43,8,44,8,1.5); INSERT INTO Item VALUES(43,7,11,15,1.5); INSERT INTO Item VALUES(43,6,24,1,1.5); INSERT INTO Item VALUES(43,5,33,6,1.5); INSERT INTO Item VALUES(43,4,32,22,1.5); INSERT INTO Item VALUES(43,3,6,18,1.5); INSERT INTO Item VALUES(43,2,2,15,1.5); INSERT INTO Item VALUES(43,1,18,19,1.5); INSERT INTO Item VALUES(43,0,15,22,1.5); INSERT INTO Item VALUES(44,8,28,23,1.5); INSERT INTO Item VALUES(44,7,49,17,1.5); INSERT INTO Item VALUES(44,6,14,15,1.5); INSERT INTO Item VALUES(44,5,41,22,1.5); INSERT INTO Item VALUES(44,4,12,3,1.5); INSERT INTO Item VALUES(44,3,3,14,1.5); INSERT INTO Item VALUES(44,2,17,14,1.5); INSERT INTO Item VALUES(44,1,34,17,1.5); INSERT INTO Item VALUES(44,0,33,20,1.5); INSERT INTO Item VALUES(45,14,3,16,1.5); INSERT INTO Item VALUES(45,13,47,8,1.5); INSERT INTO Item VALUES(45,12,32,13,1.5); INSERT INTO Item VALUES(45,11,31,22,1.5); INSERT INTO Item VALUES(45,10,41,24,1.5); INSERT INTO Item VALUES(45,9,26,18,1.5); INSERT INTO Item VALUES(45,8,9,2,1.5); INSERT INTO Item VALUES(45,7,6,24,1.5); INSERT INTO Item VALUES(45,6,39,5,1.5); INSERT INTO Item VALUES(45,5,45,17,1.5); INSERT INTO Item VALUES(45,4,3,14,1.5); INSERT INTO Item VALUES(45,3,14,11,1.5); INSERT INTO Item VALUES(45,2,46,8,1.5); INSERT INTO Item VALUES(45,1,11,6,1.5); INSERT INTO Item VALUES(45,0,44,6,1.5); INSERT INTO Item VALUES(46,17,12,23,1.5); INSERT INTO Item VALUES(46,16,46,21,1.5); INSERT INTO Item VALUES(46,15,40,11,1.5); INSERT INTO Item VALUES(46,14,24,10,1.5); INSERT INTO Item VALUES(46,13,36,20,1.5); INSERT INTO Item VALUES(46,12,21,24,1.5); INSERT INTO Item VALUES(46,11,1,4,1.5); INSERT INTO Item VALUES(46,10,11,24,1.5); INSERT INTO Item VALUES(46,9,7,4,1.5); INSERT INTO Item VALUES(46,8,8,22,1.5); INSERT INTO Item VALUES(46,7,49,9,1.5); INSERT INTO Item VALUES(46,6,41,18,1.5); INSERT INTO Item VALUES(46,5,25,9,1.5); INSERT INTO Item VALUES(46,4,17,5,1.5); INSERT INTO Item VALUES(46,3,21,19,1.5); INSERT INTO Item VALUES(46,2,30,14,1.5); INSERT INTO Item VALUES(46,1,12,24,1.5); INSERT INTO Item VALUES(46,0,5,21,1.5); INSERT INTO Item VALUES(47,13,33,8,1.5); INSERT INTO Item VALUES(47,12,12,20,1.5); INSERT INTO Item VALUES(47,11,35,10,1.5); INSERT INTO Item VALUES(47,10,45,2,1.5); INSERT INTO Item VALUES(47,9,32,9,1.5); INSERT INTO Item VALUES(47,8,16,2,1.5); INSERT INTO Item VALUES(47,7,28,14,1.5); INSERT INTO Item VALUES(47,6,8,10,1.5); INSERT INTO Item VALUES(47,5,40,8,1.5); INSERT INTO Item VALUES(47,4,15,1,1.5); INSERT INTO Item VALUES(47,3,1,4,1.5); INSERT INTO Item VALUES(47,2,17,6,1.5); INSERT INTO Item VALUES(47,1,23,13,1.5); INSERT INTO Item VALUES(47,0,23,15,1.5); INSERT INTO Item VALUES(48,10,41,10,1.5); INSERT INTO Item VALUES(48,9,35,17,1.5); INSERT INTO Item VALUES(48,8,5,12,1.5); INSERT INTO Item VALUES(48,7,30,19,1.5); INSERT INTO Item VALUES(48,6,11,17,1.5); INSERT INTO Item VALUES(48,5,24,16,1.5); INSERT INTO Item VALUES(48,4,48,4,1.5); INSERT INTO Item VALUES(48,3,10,2,1.5); INSERT INTO Item VALUES(48,2,23,10,1.5); INSERT INTO Item VALUES(48,1,26,23,1.5); INSERT INTO Item VALUES(48,0,6,23,1.5); INSERT INTO Item VALUES(49,16,24,18,1.5); INSERT INTO Item VALUES(49,15,19,24,1.5); INSERT INTO Item VALUES(49,14,23,5,1.5); INSERT INTO Item VALUES(49,13,6,22,1.5); INSERT INTO Item VALUES(49,12,21,17,1.5); INSERT INTO Item VALUES(49,11,40,15,1.5); INSERT INTO Item VALUES(49,10,30,16,1.5); INSERT INTO Item VALUES(49,9,7,24,1.5); INSERT INTO Item VALUES(49,8,48,24,1.5); INSERT INTO Item VALUES(49,7,6,21,1.5); INSERT INTO Item VALUES(49,6,29,15,1.5); INSERT INTO Item VALUES(49,5,16,1,1.5); INSERT INTO Item VALUES(49,4,47,14,1.5); INSERT INTO Item VALUES(49,3,17,19,1.5); INSERT INTO Item VALUES(49,2,29,6,1.5); INSERT INTO Item VALUES(49,1,22,16,1.5); INSERT INTO Item VALUES(49,0,18,6,1.5); UPDATE Product SET Price=ROUND(Price*.1,2); UPDATE Item SET Cost=Cost*(SELECT Price FROM Product prod WHERE ProductID=prod.ID); UPDATE Invoice SET Total=SELECT SUM(Cost*Quantity) FROM Item WHERE InvoiceID=Invoice.ID; COMMIT; hsqldb2.2-2.2.9.orig/hsqldb/sample/sample.sql0000644000175000017500000000224512007547330017372 0ustar renerene/* $Id: sample.sql 3605 2010-06-01 02:21:36Z unsaved $ Exemplifies use of SqlTool. PCTASK Table creation */ /* Ignore error for these two statements */ \c true DROP TABLE pctasklist; DROP TABLE pctask; \c false \p Creating table pctask CREATE TABLE pctask ( id integer identity, name varchar(40), description varchar(256), url varchar(80), UNIQUE (name) ); \p Creating table pctasklist CREATE TABLE pctasklist ( id integer identity, host varchar(20) not null, tasksequence int not null, pctask integer, assigndate timestamp default current_timestamp, completedate timestamp, show boolean default true, FOREIGN KEY (pctask) REFERENCES pctask, UNIQUE (host, tasksequence) ); \p Granting privileges GRANT select ON pctask TO public; GRANT all ON pctask TO tomcat; GRANT select ON pctasklist TO public; GRANT all ON pctasklist TO tomcat; \p Inserting test records INSERT INTO pctask (name, description, url) VALUES ( 'task one', 'Description for task 1', 'http://cnn.com'); INSERT INTO pctasklist (host, tasksequence, pctask) VALUES ( 'admc-masq', 101, (SELECT id FROM pctask WHERE name = 'task one')); commit; hsqldb2.2-2.2.9.orig/hsqldb/sample/sample.py0000755000175000017500000000712712007547332017234 0ustar renerene#!/usr/bin/python # $Id: sample.py 3633 2010-06-06 23:56:41Z unsaved $ # Sample Python script accessing HyperSQL through the Python pyodbc module. # This test HyperSQL client uses the ODBC DSN "tstdsn-a" to connect up to a # HyperSQL server. Just configure your own DSN to use the HyperSQL ODBC # driver, specifying the HyperSQL server host name, database name, user, # password, etc. # N.b. there is some dependency or bug which requires pyodbc to use the # ANSI variant of the HyperSQL ODBC Driver. Using the normal Unicode # variant will generate the following error message when you try to connect: # pyodbc.Error: ('0', '[0] [unixODBC]c (202) (SQLDriverConnectW)') # It is quite possible that this issue will be taken care of when we fix a # high-priority bug to do with switching between SQLDriverConnect and # SQLDriverConnectW on UNIX. # Author: Blaine Simpson (blaine dot simpson at admc dot com) import pyodbc # Get a connection handle. # In addition to the DSN name, you can override or supply additional DSN # settings, such as "Uid" and "Pwd"; or define the DSN from scratch, starting # with Driver. These settings are delimited with "; ". See pyodbc docs. conn = pyodbc.connect("DSN=tstdsn-a") try: conn.autocommit = 0 cursor = conn.cursor(); cursor.execute("DROP TABLE tsttbl IF EXISTS"); conn.commit(); # Some recent change to the HyperSQL server or to unixODBC # has made this necessary, at least on UNIX. Some other # transaction control command would probably be more # appropriate here. cursor.execute( "CREATE TABLE tsttbl(\n" + " id BIGINT generated BY DEFAULT AS IDENTITY,\n" + " vc VARCHAR(20),\n" + " entrytime TIMESTAMP DEFAULT current_timestamp NOT NULL\n" + ")"); # First a simple/non-parameterized Insertion retval = cursor.execute("INSERT INTO tsttbl (id, vc) values (1, 'one')"); if retval != 1: raise Exception(('1st insertion inserted ' + repr(retval) + ' rows instead of 1')) # Now parameterized. Unfortunately, the Python DB API and pyodbc API do # not allow re-use of a parsed statement. Cursor must be reparsed for # each usage. retval = cursor.execute("INSERT INTO tsttbl (id, vc) values (?, ?)", 2, 'two'); if retval != 1: raise Exception(('2nd insertion inserted ' + repr(retval) + ' rows instead of 2')) retval = cursor.execute("INSERT INTO tsttbl (id, vc) values (?, ?)", 3, 'three'); if retval != 1: raise Exception(('3rd insertion inserted ' + repr(retval) + ' rows instead of 3')) retval = cursor.execute("INSERT INTO tsttbl (id, vc) values (?, ?)", 4, 'four'); if retval != 1: raise Exception(('4th insertion inserted ' + repr(retval) + ' rows instead of 4')) retval = cursor.execute("INSERT INTO tsttbl (id, vc) values (?, ?)", 5, 'five'); if retval != 1: raise Exception(('5th insertion inserted ' + repr(retval) + ' rows instead of 5')) conn.commit(); # Non-parameterized query for row in cursor.execute( "SELECT * FROM tsttbl WHERE id < 3"): print row # Non-parameterized query. As noted above, can't re-use parsed cursor. for row in cursor.execute( "SELECT * FROM tsttbl WHERE id > ?", 3): # For variety, we format the files ourselves this time print repr(row.ID) + '|' + row.VC + '|' + repr(row.ENTRYTIME) except Exception as e: conn.rollback(); raise e finally: conn.close(); hsqldb2.2-2.2.9.orig/hsqldb/sample/sample.pl0000755000175000017500000000662112007547330017213 0ustar renerene#!/usr/bin/perl # $Id: sample.pl 3633 2010-06-06 23:56:41Z unsaved $ # Sample Perl script accessing HyperSQL through the Perl DBI and DBD/ODBC # modules. # This test HyperSQL client uses the ODBC DSN "tstdsn" to connect up to a # HyperSQL server. Just configure your own DSN to use the HyperSQL ODBC # driver, specifying the HyperSQL server host name, database name, user, # password, etc. # Author: Blaine Simpson (blaine dot simpson at admc dot com) use strict; use DBI; use vars qw:$dsn $dbh $sth $row $retval %conAttr:; $conAttr{AutoCommit} = 0; # In addition to the DSN name, you can override or supply additional DSN # settings, such as "Uid" and "Pwd"; or define the DSN from scratch, starting # with Driver. These settings are delimited with "; ". See pyodbc docs. $dsn = "dbi:ODBC:dsn=tstdsn"; #$dbh = DBI->connect($dsn, undef, undef) $dbh = DBI->connect($dsn, undef, undef, \%conAttr) or die("Failed to connect: ($DBI::err) $DBI::errstr\n"); $dbh->do("DROP TABLE tsttbl IF EXISTS"); $dbh->do( "CREATE TABLE tsttbl(\n" . " id BIGINT generated BY DEFAULT AS IDENTITY,\n" . " vc VARCHAR(20),\n" . " entrytime TIMESTAMP DEFAULT current_timestamp NOT NULL\n" . ")"); # First a simple/non-parameterized Insertion $retval = $dbh->do("INSERT INTO tsttbl (id, vc) values (1, 'one')"); die "First insertion inserted $retval rows instead of 1\n" unless $retval eq 1; # Now same thing with parameters $sth = $dbh->prepare("INSERT INTO tsttbl (id, vc) values (?, ?)") or die("Failed to prepare Insertion statement: ($DBI::err) $DBI::errstr\n"); $retval = $sth->execute(2, 'two') or die("2nd insertion failed: ($DBI::err) $DBI::errstr\n"); die "2nd insertion inserted $retval rows instead of 1\n" unless $retval eq 1; # The disabled testa re due to known bug with driver. # The misleading warnings withe "SQL-HY000" may be ignored. $retval = $sth->execute(3, 'three'); #or die("3rd insertion failed: ($DBI::err) $DBI::errstr\n"); #die "3rd insertion inserted $retval rows instead of 1\n" unless $retval eq 1; $retval = $sth->execute(4, 'four'); #or die("4th insertion failed: ($DBI::err) $DBI::errstr\n"); #die "4th insertion inserted $retval rows instead of 1\n" unless $retval eq 1; $retval = $sth->execute(5, 'five'); #or die("5th insertion failed: ($DBI::err) $DBI::errstr\n"); #die "5th insertion inserted $retval rows instead of 1\n" unless $retval eq 1; $dbh->commit; # Some recent change to the HyperSQL server or to unixODBC has made this # necessary, at least on UNIX. Some other transaction control command # would probably be more appropriate here. # Now a simple/non-parameterized Query $sth = $dbh->prepare("SELECT * FROM tsttbl WHERE id < 3") or die("Failed to prepare SELECT statement: ($DBI::err) $DBI::errstr\n"); $sth->execute() or die("Execution of non-param. query failed : ($DBI::err) $DBI::errstr\n"); while ($row = $sth->fetch()) { print(join '|', @$row); print("\n"); } $sth->finish(); $dbh->do('rollback'); # Now a parameterized Query $sth = $dbh->prepare("SELECT * FROM tsttbl WHERE id > ?") or die("Failed to prepare SELECT statement: ($DBI::err) $DBI::errstr\n"); # Use bind_param for variety $sth->bind_param(1, 3); $sth->execute() or die("Exec. of parameterized query failed : ($DBI::err) $DBI::errstr\n"); while ($row = $sth->fetch()) { print(join '|', @$row); print("\n"); } $sth->finish(); $dbh->disconnect(); exit(0);

* * The need is obvious for inter-process cases, but it is no less essential for * in-process Java clients whose classes have been loaded by isolated class * loaders. This is because static fields--the conventional * * means for supporting in-process global discovery--become * distinct and inaccessible across Java class loader context boundaries when * the contexts do not share a common parent class loader or do not implement * normal parent class loader delegation semantics.